ZGlmZiAtLWdpdCBhL0FuZHJvaWQubWsgYi9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZmNzQ2ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNTMgQEAKKyMgV2UgY2Fubm90IHVzZSBzdGxwb3J0IG9uIHRoZSBzaW11bGF0b3IgYmVjYXVzZSBpdCBjb25maWN0cyB3aXRoIHRoZSBob3N0IHN0bAorIyBsaWJyYXJ5LiBBbmRyb2lkJ3MgcG9ydCBhbHNvIHJlbGllcyBvbiBiaW9uaWMgd2hpY2ggaXMgbm90IGJ1aWx0IGZvciB0aGUKKyMgc2ltdWxhdG9yIGVpdGhlci4KK2lmbmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgKz0gXAorCXNyYy9kbGxfbWFpbi5jcHAgXAorCXNyYy9mc3RyZWFtLmNwcCBcCisJc3JjL3N0cnN0cmVhbS5jcHAgXAorCXNyYy9zc3RyZWFtLmNwcCBcCisJc3JjL2lvcy5jcHAgXAorCXNyYy9zdGRpb19zdHJlYW1idWYuY3BwIFwKKwlzcmMvaXN0cmVhbS5jcHAgXAorCXNyYy9vc3RyZWFtLmNwcCBcCisJc3JjL2lvc3RyZWFtLmNwcCBcCisJc3JjL2NvZGVjdnQuY3BwIFwKKwlzcmMvY29sbGF0ZS5jcHAgXAorCXNyYy9jdHlwZS5jcHAgXAorCXNyYy9tb25ldGFyeS5jcHAgXAorCXNyYy9udW1fZ2V0LmNwcCBcCisJc3JjL251bV9wdXQuY3BwIFwKKwlzcmMvbnVtX2dldF9mbG9hdC5jcHAgXAorCXNyYy9udW1fcHV0X2Zsb2F0LmNwcCBcCisJc3JjL251bXB1bmN0LmNwcCBcCisJc3JjL3RpbWVfZmFjZXRzLmNwcCBcCisJc3JjL21lc3NhZ2VzLmNwcCBcCisJc3JjL2xvY2FsZS5jcHAgXAorCXNyYy9sb2NhbGVfaW1wbC5jcHAgXAorCXNyYy9sb2NhbGVfY2F0YWxvZy5jcHAgXAorCXNyYy9mYWNldHNfYnluYW1lLmNwcCBcCisJc3JjL2NvbXBsZXguY3BwIFwKKwlzcmMvY29tcGxleF9pby5jcHAgXAorCXNyYy9jb21wbGV4X3RyaWcuY3BwIFwKKwlzcmMvc3RyaW5nLmNwcCBcCisJc3JjL2JpdHNldC5jcHAgXAorCXNyYy9hbGxvY2F0b3JzLmNwcCBcCisJc3JjL2NfbG9jYWxlLmMgXAorCXNyYy9jeGEuYyBcCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJzdGxwb3J0CisKK0xPQ0FMX1BSRUxJTktfTU9EVUxFIDo9IGZhbHNlCisKK0xPQ0FMX0NGTEFHUyA6PSAtRF9HTlVfU09VUkNFCitMT0NBTF9DUFBGTEFHUyA6PSAtZnVzZS1jeGEtYXRleGl0CisKK2luY2x1ZGUgJChMT0NBTF9QQVRIKS9saWJzdGxwb3J0Lm1rCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKK2VuZGlmCmRpZmYgLS1naXQgYS9JTlNUQUxMIGIvSU5TVEFMTApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjE3ZWY5Ci0tLSAvZGV2L251bGwKKysrIGIvSU5TVEFMTApAQCAtMCwwICsxLDE2NiBAQAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAJSU5TVEFMTCBmaWxlIGZvciBTVExwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK1NUTHBvcnQgaXMgYSBmdWxsIEFOU0kgQysrIFN0YW5kYXJkIGxpYnJhcnkuCisKK1RoaXMgZGlzdHJpYnV0aW9uIGNvbnRhaW5zIFNUTHBvcnQgc291cmNlcyBvbmx5LCBubyBiaW5hcmllcy4KK1RvIHVzZSBTVExwb3J0IGlvc3RyZWFtcywgbG9jYWxlIGFuZCBjb21wbGV4IG51bWJlcnMsIHlvdSBoYXZlIHRvIGJ1aWxkIFNUTHBvcnQKK2xpYnJhcnkgZnJvbSBzb3VyY2VzIGluICJidWlsZC9saWIiIGRpcmVjdG9yeSBhbmQgbGluayB5b3VyIHByb2dyYW1zIHdpdGggaXQuCisKK1N0YXJ0aW5nIHdpdGggNS4wIHRoZSAnd3JhcHBlcicgbW9kZSBpcyBub3Qgc3VwcG9ydGVkIGFueW1vcmUuIFlvdSBjYW5ub3QgdXNlIG5hdGl2ZQorY29tcGlsZXIgaW9zdHJlYW1zIGltcGxlbWVudGF0aW9uIHdpdGggU1RMcG9ydCBTVEwgKHNlZSBkb2MvRkFRIGZvciBleHBsYW5hdGlvbnMpLgorTm93IHlvdSBoYXZlIHRvIGNob29zZSBiZXR3ZWVuIFNUTHBvcnQgaW9zdHJlYW1zIG9yIG5vIGlvc3RyZWFtcy4KKworPT09PSBVbnBhY2tpbmcgYW5kIGluc3RhbGxpbmcgU1RMcG9ydCA9PT09PT09PT09CisKKzEpIFVucGFjayBTVExwb3J0IGFyY2hpdmUgdG8gYSBkaXJlY3RvcnkgYWNjZXNzaWJsZSBkdXJpbmcgY29tcGlsYXRpb24uCisgICBOT1RFOiBETyBOT1Qgb3ZlcndyaXRlIGhlYWRlciBmaWxlcyBjb21pbmcgd2l0aCB0aGUgY29tcGlsZXIsIGV2ZW4gaWYgeW91IG1hZGUKKyAgIGEgYmFja3VwIC0gdGhpcyB3b24ndCB3b3JrISBNb3N0IHByb2JhYmx5LCB5b3UndmUgYWxyZWFkeSB1bnBhY2tlZCB0aGUgYXJjaGl2ZSBiZWZvcmUKKyAgIHJlYWRpbmcgdGhpcyBmaWxlIHRob3VnaCA7KQorCisyKSBNYWtlIHN1cmUgInN0bHBvcnQiIGRpcmVjdG9yeSBvZiB0aGlzIGRpc3RyaWJ1dGlvbiBjb21lcyBiZWZvcmUgY29tcGlsZXIncyBvbmUgCisgICBpbiB5b3VyIGluY2x1ZGUgcGF0aHMgd2hlbiB5b3UgY29tcGlsZSB0aGUgcHJvamVjdC4KKworICAgTm90ZTogZm9yIFN1blBybyBDQyA1LjAgYW5kIGhpZ2hlciwgdGhlcmUgdXNlZCB0byBiZSBzcGVjaWFsIGRpcmVjdG9yeSAic3RscG9ydC9TQzUiCisJIHRoaXMgaXMgbm93IG9ic29sZXRlLCBwbGVhc2UgbWFrZSBzdXJlIHlvdSBkbyBub3QgdXNlIGl0IGFueW1vcmUuCisKKzMpIE1ha2Ugc3VyZSB5b3UgZG8gbm90IHJlbmFtZSB0aGlzICJzdGxwb3J0IiBzdWJkaXJlY3RvcnkgLQorICAgdGhhdCBtYXkgcmVzdWx0IGluIGNvbXBpbGF0aW9uIGVycm9ycy4KKworICAgTk9URTogIFlvdXIgY29tcGlsZXIgc2hvdWxkIGJlIHJlY29nbml6ZWQgYnkgU1RMcG9ydCBzb3VyY2UgY29kZSB3aXRoIG5vIGNvbmZpZ3VyaW5nLgorICAgICAgICAgIFBsZWFzZSBlZGl0IGFwcHJvcHJpYXRlIGNvbmZpZ3VyYXRpb24gaGVhZGVyIGZvciB5b3VyIGNvbXBpbGVyCisgICAgICAgICAgZGlyZWN0bHkgaWYgeW91IGhhdmUgdG8gbWFrZSBjb21waWxlci1zcGVjaWZpYyBjb25maWd1cmF0aW9uIGNoYW5nZXMKKyAgICAgICAgICAoc2VlIHN0bHBvcnQvc3RsL2NvbmZpZykuIAorCis0KSAgUnVuOgorCisgICAgY29uZmlndXJlIC0taGVscAorCisgICAgRGVwZW5kaW5nIG9uIHlvdXIgZW52aXJvbm1lbnQsIFdpbmRvd3MgY29tbWFuZCBzaGVsbCBvciBVbml4IGxpa2Ugc2hlbGwsCisgICAgY29uZmlndXJlLmJhdCBvciBjb25maWd1cmUgc2NyaXB0IHdpbGwgYmUgcnVuIHJlc3BlY3RpdmVseS4gRm9yIFdpbmRvd3MgdXNlcnMKKyAgICBydW5uaW5nIGNvbmZpZ3VyZSBzY3JpcHQgaXMgbWFuZGF0b3J5IGluIG9yZGVyIHRvIGRlY2xhcmUgdGhlIGNvbXBpbGVyIHlvdSBhcmUKKyAgICBnb2luZyB0byB1c2UuCisKKzUpICBHbyB0byAiYnVpbGQvbGliIiBzdWJkaXJlY3RvcnkuIEl0IGNvbnRhaW5zIHZhcmlvdXMgbWFrZWZpbGVzIGZvciBkaWZmZXJlbnQKKyAgICBjb21waWxlcnMgYW5kICdtYWtlJyB1dGlsaXRpZXMgKEdOVSBNYWtlIGFuZCBNaWNyb3NvZnQncyBubWFrZSBzdXBwb3J0ZWQpLgorCisgICAgVmVyaWZ5IHlvdSBjYW4gZG8gY29tbWFuZCBsaW5lIGNvbXBpbGVzLiBJREUgdXNlcnMgbWF5IGhhdmUgdG8gZG8gc29tZXRoaW5nIAorICAgIHNwZWNpYWwsIGxpa2UgYWRkIGVudmlyb25tZW50IHZhcmlhYmxlcyAoZm9yIE1pY3Jvc29mdCkgb3IgaW5zdGFsbCAKKyAgICBhZGRpdGlvbmFsIGNvbXBpbGVyIGNvbXBvbmVudHMgKGZvciBNZXRyb3dlcmtzKSwgYmVmb3JlIHRoZXkgY2FuIHVzZSB0aGVpciAKKyAgICBjb21tYW5kIGxpbmUgY29tcGlsZXJzIChzZWUgZG9jL1JFQURNRS54eHh4IGZvciBhZGRpdGlvbm5hbCBpbmZvcm1hdGlvbikuCisKKyAgICBjb25maWd1cmUgc2NyaXB0IHNob3VsZCBoYXZlIGFscmVhZHkgY3JlYXRlZCBhIE1ha2VmaWxlIGZpbGUgc28gdGhhdCB5b3Ugb25seQorICAgIGhhdmUgdG8gY2FsbCAnbWFrZScgb3IgJ25tYWtlJyAoZm9yIHNvbWUgcGxhdGZvcm1zIEdOVSBtYWtlIG1pZ2h0IGJlIGhpZGRlbgorICAgIGJlaGluZCAnZ21ha2UnKS4KKworICAgIElNUE9SVEFOVDoKKworICAgIElmIHlvdSBETyBOT1QgcGxhbiB0byB1c2UgU1RMcG9ydCBpb3N0cmVhbXMgYW5kL29yIGxvY2FsZSBpbXBsZW1lbnRhdGlvbiBidXQganVzdAorICAgIHRoZSBTVEwsIHlvdSBkbyBub3QgaGF2ZSB0byBidWlsZCB0aGUgbGlicmFyeS4KKyAKKyAgICBJZiB5b3UgaGF2ZSBkZWNpZGVkIHRvIGRpc2FibGUgU1RMcG9ydCBpb3N0cmVhbXMgYW5kIGxvY2FsZSB1c2luZyBfU1RMUF9OT19JT1NUUkVBTVMKKyAgICBjb25maWd1cmF0aW9uIG1hY3JvIGluIHN0bHBvcnQvc3RsL2NvbmZpZy91c2VyX2NvbmZpZy5oLCB5b3UgbWF5IHN0b3AgcmVhZGluZyBoZXJlLgorCisKKz09PT0gQnVpbGRpbmcgU1RMcG9ydCBpb3N0cmVhbXMgbGlicmFyeSA9PT09PT09PT09CisKK0JlbG93IGFyZSBzdGVwLWJ5LXN0ZXAgaW5zdHJ1Y3Rpb25zIHRvIGJ1aWxkIFNUTHBvcnQgc3RyZWFtcyBsaWJyYXJ5LiBUaGlzIGlzIGEgZ2VuZXJhbAorYnVpbGQgcHJvY2VzcyBkZXNjcmlwdGlvbiwgZm9yIGEgbW9yZSBkZXRhaWxlZCBvbmUgY2hlY2sgUkVBRE1FIGZpbGVzIGluIHRoZSBkb2MgZm9sZGVyOgorCis1KSAgVXNpbmcgYXBwcm9wcmlhdGUgbWFrZSBjb21tYW5kIChtYWtlIG9yIG5tYWtlKSwgZG8KKworICAgICAgbWFrZSBjbGVhbiBpbnN0YWxsCisKKyAgICB0byBidWlsZCB0aGUgU1RMcG9ydCBsaWJyYXJpZXMuIE1ha2UgZmlsZXMgYXJlIHNldCB1cCB0byBidWlsZCBzZXZlcmFsIGRpZmZlcmVudAorICAgIGZsYXZvcnMgLSBkZWJ1Zy9ub25kZWJ1Zywgc3RhdGljL2R5bmFtaWMgdmVyc2lvbnMuIEJ1dCBub3QgYWxsIGZsYXZvcnMgd2lsbCBiZSBidWlsZAorICAgIGJ5IGRlZmF1bHQuIFNlZSBidWlsZC9saWIvUkVBRE1FIGZvciBvdGhlciBtYWtlIHRhcmdldHMuCisKKyAgICBOb3RlOiAnaW5zdGFsbCcgdGFyZ2V0IHdvcmsgc2xpZ2h0bHkgZGlmZmVyZW50IHRoYW4gdXN1YWwgLSBpdCBpbnN0YWxscyBsaWJyYXJpZXMgaW50bworICAgIDxTVExwb3J0IHJvb3QgZGlyPi9saWIgYW5kIGJpbiBjYXRhbG9ncywgTk9UIElOIFNZU1RFTSBDQVRBTE9HLiBZb3UgY2FuIGRvIHRoZSBzeXN0ZW0KKyAgICBpbnN0YWxsIGJ5IGp1c3QgY29weWluZyBzdGxwb3J0IGFuZCBsaWIgZm9sZGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBvZiB5b3VyIGNob2lzZS4gRm9yCisgICAgZXhhbXBsZSBvbiBVTklYLWxpa2UgcGxhdGZvcm1zIHRoaXMgY2FuIGJlIGRvbmUgd2l0aCB0aGUgZm9sbG93aW5nIGNvbW1hbmRzOgorCisgICAgICBzdQorICAgICAgdGFyIGNmIC0gc3RscG9ydCB8IChjZCAvdXNyL2xvY2FsL2luY2x1ZGU7IHRhciB4ZiAtKQorICAgICAgY2htb2QgLVIgYStyIC91c3IvbG9jYWwvaW5jbHVkZS9zdGxwb3J0CisgICAgICBjaG93biAtUiByb290OnJvb3QgL3Vzci9sb2NhbC9pbmNsdWRlL3N0bHBvcnQKKyAgICAgIChjZCBsaWI7IHRhciBjZiAtIC0tZXhjbHVkZT1DVlMgLS1leGNsdWRlPS5jdnNpZ25vcmUgLikgfCAoY2QgL3Vzci9sb2NhbC9saWI7IHRhciB4ZiAtKQorICAgICAgY2hvd24gLVIgcm9vdDpyb290IC91c3IvbG9jYWwvbGliL2xpYnN0bHBvcnQqCisgICAgICBleGl0CisKKyAgICBOb3RlOiBTeXN0ZW0gaW5zdGFsbCBpcyBvcHRpb25hbCwgbW9zdCBvZiBjb21waWxlcnMvbGlua2VycyBzdXBwb3J0IHNlYXJjaGluZyBmb3IgaW5jbHVkZXMKKyAgICBhbmQgbGlicyB0aHJvdWdodCBvdXQgdGhlIHdob2xlIGZpbGVzeXN0ZW0sIGp1c3QgY2hlY2sgeW91ciBkb2N1bWVudGF0aW9uIG9uIGhvdyB0byBhY2hpZXZlCisgICAgdGhpcy4KKworICAgIElmIHlvdSB1c2UgY3Jvc3MtY29tcGlsZXIsIHlvdSBjYW4gZmluZCBsaWJyYXJpZXMgaW4gdGhlIDxTVExwb3J0IHJvb3QgZGlyPi9saWIvPHRhcmdldCBwbGF0Zm9ybT4KKyAgICBjYXRhbG9nLgorCis2KSAgSWYgYnVpbGQgZmFpbHMsIHlvdSBtYXkgY2hvb3NlIHRvIDoKKyAgICAgLSB0cnkgZml4aW5nIHRoZSBidWlsZCA7KQorICAgICAtIHdhaXQgdW50aWwgc29tZWJvZHkgZWxzZSB3aWxsIHN1Ym1pdCBjb3JyZXNwb25kaW5nIGNoYW5nZXMgdG8gYmUgaW5jb3Jwb3JhdGVkIGluIG5leHQgU1RMcG9ydCAKKyAgICAgICByZWxlYXNlL3NuYXBzaG90LgorCisgICAgSW4gY2FzZSB5b3UgZG8gcGF0Y2ggU1RMcG9ydCwgcGxlYXNlIHN1Ym1pdCB5b3VyIHBhdGNoZXMgdG8KKyAgICBodHRwczovL3NvdXJjZWZvcmdlLm5ldC90cmFja2VyLz9hdGlkPTc2NjI0NiZncm91cF9pZD0xNDY4MTQmZnVuYz1icm93c2UKKworPT09PSBMaW5raW5nIHlvdXIgYXBwbGljYXRpb24gd2l0aCBTVExwb3J0IGxpYnJhcnkgPT09PT09PT09PQorCis3KSBDaGVjayB0aGUgYnVpbGQ6CisKKyAgICBFeGFtcGxlOgorICAgIAorICAgIC0gdW5kZXIgTGludXggYW5kIG90aGVyIFVuaXhlczoKKworICAgIGNkIGJ1aWxkL3Rlc3QvdW5pdAorICAgIG1ha2UgaW5zdGFsbAorICAgIC4uLy4uLy4uL2Jpbi9zdGxfdW5pdF90ZXN0CisgICAgLi4vLi4vLi4vYmluLWcvc3RsX3VuaXRfdGVzdAorCisgICAgLSB1bmRlciBXaW5kb3dzOgorCisgICAgY2QgYnVpbGRcdGVzdFx1bml0CisgICAgbm1ha2UgaW5zdGFsbAorICAgIGNkIC4uXC4uXC4uXGJpbgorICAgIHN0bF91bml0X3Rlc3QKKyAgICBzdGxfdW5pdF90ZXN0ZAorICAgIHN0bF91bml0X3Rlc3RzdGxkCisKKzgpIFN1cHBseSB0aGUgImxpYiIgc3ViZGlyZWN0b3J5IHRvIHRoZSBsaWJyYXJ5IHNlYXJjaCBwYXRoIGFuZCBhZGQgZGVzaXJlZCAKKyAgIGxpYnJhcnkgdG8gdGhlIGxpc3Qgb2YgbGlicmFyaWVzIHRvIGxpbmsgd2l0aC4KKyAgIEV4YW1wbGVzIChpbWFnaW5lIHlvdSBoYXZlIG15dGVzdC5jcHAgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoaXMgZmlsZSBpcyk6CisJV2l0aCBHQ0MgICAgIDogZysrIC1wdGhyZWFkIC1JLi9zdGxwb3J0IG15dGVzdC5jcHAgLUwuL2xpYi8gLWxzdGxwb3J0CisJV2l0aCBERUMgQ0MgIDogY3h4IC1JLi9zdGxwb3J0IG15dGVzdC5jcHAgLUwuL2xpYi8gLWxzdGxwb3J0CisJV2l0aCBTVU4gQ0MgIDogQ0MgLW10IC1JLi9zdGxwb3J0IG15dGVzdC5jcHAgLUwuL2xpYi8gLWxzdGxwb3J0CisJLi4uLi4KKyAgIEZvciBzZXZlcmFsIGNvbXBpbGVycyBzdXBwb3J0aW5nIGF1dG8gbGlua2luZyBmZWF0dXJlIChWQysrLCBCb3JsYW5kLCBETUMpLAorICAgeW91IGRvIG5vdCBoYXZlIHRvIHNwZWNpZnkgInN0bHBvcnQuTS5tLmxpYiIgZXhwbGljaXRseSwgYXMgaXQgaXMgYmVpbmcgY2hvb3NlbgorICAgYW5kIGZvcmNlZCB0byBsaW5rIGF1dG9tYXRpY2FsbHkgYnkgIiNwcmFnbWEiJ3MgaW4gY29tcGlsZXIgY29uZmlnIGZpbGVzIAorICAgQXBwcm9wcmlhdGUgdmVyc2lvbiBpcyBiZWluZyBzZWxlY3RlZCBiYXNlZCBvbiBjb21waWxlciBvcHRpb25zIGFuZCBfU1RMUF9ERUJVRworICAgc2V0dGluZy4gQWxsIHlvdSBoYXZlIHRvIGRvIGlzIHRvIHNldCBsaWJyYXJ5IHNlYXJjaCBwYXRoIGZvciB0aGUgbGlua2VyLgorCisJRXhhbXBsZSA6CisgICAgICAgICAgIGNsLmV4ZSAvSS5cc3RscG9ydCBteXRlc3QuY3BwIC9saW5rIC9saWJwYXRoOi5cbGliIC9NRAorCis5KSBJZiB5b3UgbGlua2VkIHlvdXIgYXBwbGljYXRpb24gd2l0aCBzaGFyZWQgU1RMcG9ydCBsaWJyYXJ5ICguc28gb3IgLmRsbCksIHBsZWFzZSAKKyAgIG1ha2Ugc3V6ZSB0aGF0IHlvdXIgLnNvIG9yIC5kbGwgY2FuIGJlIGZvdW5kIGJ5IHRoZSBkeW5hbWljIGxpbmtlci4gCisgICBVbmRlciBXaW5kb3dzLCB0aGUgcGF0aHMgc2VhcmNoZWQgZGVwZW5kIG9uIHRoZSBwYXJ0aWN1bGFyIGZsYXZvciwgc2VlIHRoZSBNU0ROIAorICAgZG9jdW1lbnRhdGlvbiBmb3IgTG9hZExpYnJhcnkgYXQgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS4gVGhlIGVhc2llc3Qgd2F5cyBhcmUgdG8KKyAgIGVpdGhlciBtb2RpZnkgdGhlIFBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUgb3IgY29weSBhbGwgLmRsbCdzIG5leHQgdG8gdGhlIAorICAgZXhlY3V0YWJsZSBsaWtlIGl0IGlzIGRvbmUgcGVyIGRlZmF1bHQgd2hlbiB1bml0IHRlc3RzIGV4ZWN1dGFibGUgYXJlIHB1dCBuZXh0CisgICB0byBkbGxzLiAKKyAgIFVuZGVyIExpbnV4LCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgTERfTElCUkFSWV9QQVRIIGNhbiBiZSBhZGp1c3RlZCB0byBwb2ludAorICAgdG8gdGhlIGRpciBjb250YWluaW5nIC5zby4gU2VlIHRoZSBtYW5wYWdlIGZvciBsZC5zbyBmb3IgbW9yZSBpbmZvLgorCisxMCkgU1RMcG9ydCBidWlsZHMgb25seSBtdWx0aXRocmVhZGVkIGxpYnJhcmllcywgc28geW91ciBhcHBsaWNhdGlvbiBzaG91bGQgYmUgY29tcGlsZWQKKyAgIGFzIG11bHRpdGhyZWFkZWQsIHRvby4gVXNlIC1wdGhyZWFkIChvciAtcHRocmVhZHMgb24gU29sYXJpcykgb3B0aW9uIGZvciBHQ0MsIC1tdCBmb3IgU3VuUHJvLAorICAgL01UIGZvciBWQywgYW5kIHNvIG9uLiBTb21ldGltZXMgeW91IHNob3VsZCBkZWZpbmUgX1JFRU5UUkFOVCBvciBzb21ldGhpbmcgZWxzZSwgZGVwZW5kcworICAgdXBvbiBwbGF0Zm9ybS9jb21waWxlci4gU2VlIGNvbXBpbGVyJ3MgYW5kIGxpbmtlcidzIG9wdGlvbnMgb24gY29tbWFuZCBsaW5lIHdoZW4geW91IGJ1aWxkCisgICB1bml0IHRlc3RzIChidWlsZC90ZXN0L3VuaXQpIGZvciByZWZlcmVuY2UuIFRoZSBsYXN0IGlzIHVzZWZ1bCBmb3IgQU5ZIHBsYXRmb3JtLgorCisxMSkgRG9uJ3QgaGVzaXRhdGUgdG8gcmVhZCBSRUFETUVzIChkb2MvUkVBRE1FKiwgYnVpbGQvbGliL1JFQURNRSosIGJ1aWxkL3Rlc3QvdW5pdC9SRUFETUUqKQorICAgYW5kIGRvYy9GQVEuCisKKzEyKSBIYXZlIGZ1biEKKwpkaWZmIC0tZ2l0IGEvSU5TVEFMTC51bml4ZXMgYi9JTlNUQUxMLnVuaXhlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWIyZTIxCi0tLSAvZGV2L251bGwKKysrIGIvSU5TVEFMTC51bml4ZXMKQEAgLTAsMCArMSwxMjAgQEAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogCUlOU1RBTEwgZmlsZSBmb3IgU1RMcG9ydCA1LjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK1NUTHBvcnQgaXMgYSBmdWxsIEFOU0kgQysrIFN0YW5kYXJkIGxpYnJhcnkuCisKK1RoaXMgZGlzdHJpYnV0aW9uIGNvbnRhaW5zIFNUTHBvcnQgc291cmNlcyBvbmx5LCBubyBiaW5hcmllcy4KK1RvIHVzZSBTVExwb3J0IGlvc3RyZWFtcywgbG9jYWxlIGFuZCBjb21wbGV4IG51bWJlcnMsIHlvdSBoYXZlCit0byBidWlsZCBTVExwb3J0IGxpYnJhcnkgZnJvbSBzb3VyY2VzIGFuZCBsaW5rIHlvdXIgcHJvZ3JhbXMgd2l0aCBpdC4KKworU3RhcnRpbmcgd2l0aCA1LjAgdGhlICd3cmFwcGVyJyBtb2RlIGlzIG5vdCBzdXBwb3J0ZWQgYW55bW9yZS4KK1lvdSBjYW5ub3QgdXNlIG5hdGl2ZSBjb21waWxlciBpb3N0cmVhbXMgaW1wbGVtZW50YXRpb24gd2l0aCBTVExwb3J0IFNUTAorKHNlZSBkb2MvRkFRIGZvciBleHBsYW5hdGlvbnMpLgorCis9PT09IEluc3RhbGxpbmcgU1RMcG9ydCA9PT09PT09PT09CisKKzApIERPIE5PVCBvdmVyd3JpdGUvbW92ZS9yZW5hbWUgaGVhZGVyIGZpbGVzIGNvbWluZyB3aXRoIHRoZSBjb21waWxlciwKKyAgIGV2ZW4gaWYgeW91IG1hZGUgYSBiYWNrdXAtLS1TVExwb3J0IG5lZWQgdGhpcyBoZWFkZXJzIGFuZCBkb24ndAorICAgb3ZlcnJpZGUgb25lcy4KKworMSkgUnVuIAorCisgICAuL2NvbmZpZ3VyZSAtLWhlbHAKKworICAgcmVhZCBvcHRpb25zIGRlc2NyaXB0aW9uOyBpZiB5b3UgdXNlIGNvbXBpbGVyCisgICBkaWZmZXJlbnQgZnJvbSBnY2MsIHBheSBhdHRlbnRpb24gdG8gLS11c2UtY29tcGlsZXItZmFtaWx5PSBvcHRpb24uCisKKzIpIFJ1bgorCisgICAuL2NvbmZpZ3VyZSA8b3B0aW9uPgorCisgICBPcHRpb25zIGhlcmUgbW9yZS1vci1sZXNzIHRyYWRpdGlvbmFsLgorCisgICBOb3RlOiAuL2NvbmZpZ3VyZSBnaXZlIGhpbnRzIG9ubHkgZm9yIGxpYnJhcnkgYnVpbGQsIGl0IGRvc2VuJ3QKKyAgIGNyZWF0ZS9lZGl0IGFueSBoZWFkZXJzLCBjaGVjayB5b3Ugc3lzdGVtIGV0Yy4gVGhpcyBpcyBzaW1wbGUgd2F5CisgICB0byBzdG9yZSBjdXN0b20gb3B0aW9ucywgbm90IG1vcmUuIElmIHlvdSB3YW50IHRvIGNoYW5nZSBkZWZhdWx0CisgICBiZWhhdmlvdXIgb2YgU1RMcG9ydCwgc2VlIHN0bHBvcnQvc3RsL2NvbmZpZy91c2VyX2NvbmZpZy5oIGFuZAorICAgc3RscG9ydC9zdGwvY29uZmlnL2hvc3QuaDsgcmVhZCB0aGUgY29tbWVudHMgaW4gdGhpcyBmaWxlcyEKKyAgIE5vdCBhbGwgY29tYmluYXRpb25zIG9mIG9wdGlvbnMgaGVhbHRoeSwgeW91IHNob3VsZCB1bmRlcnN0YW5kCisgICB3aGF0IHlvdSBkby4gSWYgbm90LCBrZWVwIGFsbCB1bmNoYW5nZWQuCisKKyAgIE5vdGU6IHlvdSBjYW4gZmluZCBhbGwgcmVjb2duaXNlZCAnc2V0dGluZ3MnIGluIHRoZSBmaWxlCisgICBidWlsZC9NYWtlZmlsZXMvZ21ha2UvY29uZmlnLm1haworCisgICBUaGlzIGlzIGdlbmVyYXRlZCBmaWxlLCBidXQgb25seSAuL2NvbmZpZ3VyZSB3aWxsIHJld3JpdGUgb25lLgorCiszKSBSdW4KKworICAgbWFrZSAmJiBtYWtlIGNoZWNrCisKKyAgIE9ubHkgR05VIE1ha2Ugc3VwcG9ydGVkISBQcmVmZXJyZWQgdmVyaW9uIG9mIEdOVSBNYWtlID49IDMuODE7CisgICBuZXZlciB1c2UgR05VIE1ha2UgYmVmb3JlIDMuNzkgLS0tIGJ1aWxkIG5vdCB3b3JrIHByb3Blcmx5OworICAgR05VIG1ha2VzID49IDMuNzkgIGFuZCA8IDMuODEgbWF5IGZhaWwgdG8gYnVpbGQgbGlicmFyeS90ZXN0cworICAgcHJvcGVybHksIGR1ZSB0byBidWdzOyBidXQgdGhlIHJlYWwgcmVzdWx0cyBkZXBlbmRzIHVwb24KKyAgIHBsYXRmb3JtLgorCis0KSBJZiBidWlsZCBmaW5lLCBiZWNvbWUgc3VwZXJ1c2VyIGFuZCBydW4KKworICAgbWFrZSBpbnN0YWxsCisKKyAgIE5vdGU6IHlvdSBjYW4gdXNlIC0tcHJlZml4PSB0byBjaGFuZ2UgaW5zdGFsbGF0aW9uIHBhdGgKKyAgIChvciBtYWNybyBERVNURElSLCBhcyB1c3VhbCksIG9yIGV2ZW4gc2tpcCBpbnN0YWxsYXRpb24gYW5kIHVzZQorICAgU1RMcG9ydCBpbi1wbGFjZS4KKworPT09PSBVc2FnZSBTVExwb3J0ID09PT09PT09PT0KKworMSkgVGhlIGJlc3Qgd2F5IHRvIHVuZGVyc3RhbmQgaG93IHRvIHVzZSBpdCwgaXMgdG8gc2VlIG9uIGNvbXBpbGF0aW9uLAorICAgbGlua2luZywgcnVubmluZyB1bml0IHRlc3RzLCBpLmUuIHNlZSBvbiBvcHRpb25zIHdoZW4geW91IGRvCisKKyAgIChjZCBidWlsZC90ZXN0L3VuaXQ7IG1ha2UgY2hlY2spCisKKzIpIE1ha2Ugc3VyZSAic3RscG9ydCIgZGlyZWN0b3J5IG9mIHRoaXMgZGlzdHJpYnV0aW9uIGNvbWVzIGJlZm9yZQorICAgY29tcGlsZXIncyBvbmUgaW4geW91ciBpbmNsdWRlIHBhdGhzIChzb21ldGhpbmcgbGlrZQorICAgLUk8YmFzZSBpbnN0YWxsIHBhdGg+L3N0bHBvcnQpOyBuZXZlciByZW5hbWUgJ3N0bHBvcnQnIHBhcnQgb2YgcGF0aCEKKworICAgQ29tcGlsYXRpb246CisKKyAgIGMrKyAtcHRocmVhZCAtZmV4Y2VwdGlvbnMgLU8yIC1JL3Vzci9sb2NhbC9pbmNsdWRlL3N0bHBvcnQgLWMgLW8gdGVzdC5vIHRlc3QuY2MKKworICAgSW4gY2FzZSBvZiBnY2MsIGxpYnN0bHBvcnQgcmVwbGFjZSBsaWJzdGRjKysgKG5vdCBpbiBhbGwgY2FzZXMhKQorICAgCisgICBMaW5rLCB2YXJpYW50IDE6CisKKyAgIGMrKyAtcHRocmVhZCAtZmV4Y2VwdGlvbnMgLU8yIC1JL3Vzci9sb2NhbC9pbmNsdWRlL3N0bHBvcnQgLW5vc3RkbGliIC1vIG15dGVzdCBcCisgICAvdXNyL2xpYi9nY2MvaTY4Ni1wYy1saW51eC1nbnUvNC4yLjQvLi4vLi4vLi4vY3J0MS5vIFwKKyAgIC91c3IvbGliL2djYy9pNjg2LXBjLWxpbnV4LWdudS80LjIuNC8uLi8uLi8uLi9jcnRpLm8gXAorICAgL3Vzci9saWIvZ2NjL2k2ODYtcGMtbGludXgtZ251LzQuMi40L2NydGJlZ2luLm8gXAorICAgdGVzdC5vIFwKKyAgIC1sc3RscG9ydCBcCisgICAtbGdjY19zIC1scHRocmVhZCAtbGMgLWxtIFwKKyAgIC91c3IvbGliL2djYy9pNjg2LXBjLWxpbnV4LWdudS80LjIuNC9jcnRlbmQubyBcCisgICAvdXNyL2xpYi9nY2MvaTY4Ni1wYy1saW51eC1nbnUvNC4yLjQvLi4vLi4vLi4vY3J0bi5vCisKKyAgIE9mIGNhdXNlLCBuYW1lcyBvZiBzdGFydC9zdG9wIGZpbGVzIG5vdCBoYXJkY29kZWQsIHlvdSBjYW4gbG9jYXRlIGl0IHdpdGgKKworICAgYysrIC1wcmludC1maWxlLW5hbWU9Y3J0MS5vCisKKyAgIExpbmssIHZhcmlhbnQgMjoKKworICAgZ2NjIC1wdGhyZWFkIC1mZXhjZXB0aW9ucyAtTzIgLUkvdXNyL2xvY2FsL2luY2x1ZGUvc3RscG9ydCAtbyBteXRlc3QgXAorICAgdGVzdC5vIC1sc3RscG9ydAorCisgICBJZiB5b3UgdXNlIGdjYyBiZWZvcmUgMy4zLCB5b3UgbXVzdCBsaW5rIHdpdGggbGlic3RkYysrLCBiZWNhdXNlCisgICBsYW5ndWFnZS1zdXBwb3J0IGxpYnJhcnkgKGxpYnN1cGMrKy5hKSBkb24ndCBjb250YWluIG5lY2Vzc2FyeQorICAgZnVuY3Rpb25zLgorCiszKSBTVExwb3J0IGJ1aWxkcyBvbmx5IG11bHRpdGhyZWFkZWQgbGlicmFyaWVzIChieSBkZWZhdWx0KSwgc28geW91cgorICAgYXBwbGljYXRpb24gc2hvdWxkIGJlIGNvbXBpbGVkIGFzIG11bHRpdGhyZWFkZWQsIHRvby4gVXNlIC1wdGhyZWFkCisgICAob3IgLXB0aHJlYWRzIG9uIFNvbGFyaXMpIG9wdGlvbiBmb3IgR0NDLCAtbXQgZm9yIFN1blBybyBhbmQgc28gb24uCisgICBTb21ldGltZXMgeW91IHNob3VsZCBkZWZpbmUgX1JFRU5UUkFOVCBvciBzb21ldGhpbmcgZWxzZSwgZGVwZW5kcworICAgdXBvbiBwbGF0Zm9ybS9jb21waWxlci4gU2VlIGNvbXBpbGVyJ3MgYW5kIGxpbmtlcidzIG9wdGlvbnMKKyAgIG9uIGNvbW1hbmQgbGluZSB3aGVuIHlvdSBidWlsZCB1bml0IHRlc3RzIChidWlsZC90ZXN0L3VuaXQpCisgICBmb3IgcmVmZXJlbmNlLiBUaGUgbGFzdCBpcyB1c2VmdWwgZm9yIEFOWSBwbGF0Zm9ybSAoc3BlY2lhbAorICAgYXR0ZW50aW9uIGZvciBXaW5kb3dzIHVzZXJzKS4KKworNCkgRG9uJ3QgaGVzaXRhdGUgdG8gcmVhZCBSRUFETUVzIChkb2MvUkVBRE1FKiwgYnVpbGQvbGliL1JFQURNRSosCisgICBidWlsZC90ZXN0L3VuaXQvUkVBRE1FKikgYW5kIGRvYy9GQVEuCisKKzUpIEhhdmUgZnVuIQpkaWZmIC0tZ2l0IGEvTElDRU5TRSBiL0xJQ0VOU0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg0NjI3MAotLS0gL2Rldi9udWxsCisrKyBiL0xJQ0VOU0UKQEAgLTAsMCArMSwyNyBAQAorQm9yaXMgRm9taXRjaGV2IGdyYW50cyBMaWNlbnNlZSBhIG5vbi1leGNsdXNpdmUsIG5vbi10cmFuc2ZlcmFibGUsIHJveWFsdHktZnJlZSBsaWNlbnNlIHRvIHVzZSBTVExwb3J0IGFuZCBpdHMgZG9jdW1lbnRhdGlvbiB3aXRob3V0IGZlZS4KKworQnkgZG93bmxvYWRpbmcsIHVzaW5nLCBvciBjb3B5aW5nIFNUTHBvcnQgb3IgYW55IHBvcnRpb24gdGhlcmVvZiwgIExpY2Vuc2VlIGFncmVlcyB0byBhYmlkZSBieSB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3MgYW5kIGFsbCBvdGhlciBhcHBsaWNhYmxlIGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYSwgYW5kIHRvIGFsbCBvZiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQuCisKK0xpY2Vuc2VlIHNoYWxsIG1haW50YWluIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0IGFuZCBwZXJtaXNzaW9uICBub3RpY2VzIG9uIFNUTHBvcnQgc291cmNlcyBhbmQgaXRzIGRvY3VtZW50YXRpb24gdW5jaGFuZ2VkIDoKKworQ29weXJpZ2h0IDE5OTksMjAwMCBCb3JpcyBGb21pdGNoZXYKKworVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KK1Blcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCitUaGUgTGljZW5zZWUgbWF5IGRpc3RyaWJ1dGUgYmluYXJpZXMgY29tcGlsZWQgd2l0aCBTVExwb3J0ICh3aGV0aGVyIG9yaWdpbmFsIG9yIG1vZGlmaWVkKSB3aXRob3V0IGFueSByb3lhbHRpZXMgb3IgcmVzdHJpY3Rpb25zLgorCitUaGUgTGljZW5zZWUgbWF5IGRpc3RyaWJ1dGUgb3JpZ2luYWwgb3IgbW9kaWZpZWQgU1RMcG9ydCBzb3VyY2VzLCBwcm92aWRlZCB0aGF0OgorCitUaGUgY29uZGl0aW9ucyBpbmRpY2F0ZWQgaW4gdGhlIGFib3ZlIHBlcm1pc3Npb24gbm90aWNlIGFyZSBtZXQ7CitUaGUgZm9sbG93aW5nIGNvcHlyaWdodCBub3RpY2VzIGFyZSByZXRhaW5lZCB3aGVuIHByZXNlbnQsIGFuZCBjb25kaXRpb25zIHByb3ZpZGVkIGluIGFjY29tcGFueWluZyBwZXJtaXNzaW9uIG5vdGljZXMgYXJlIG1ldCA6CitDb3B5cmlnaHQgMTk5NCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorCitDb3B5cmlnaHQgMTk5Niw5NyBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKworQ29weXJpZ2h0IDE5OTcgTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neS4KKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkgbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5ICBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgpkaWZmIC0tZ2l0IGEvTU9EVUxFX0xJQ0VOU0VfQlNEX0xJS0UgYi9NT0RVTEVfTElDRU5TRV9CU0RfTElLRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvTU9EVUxFX0xJQ0VOU0VfQlNEX0xJS0UKZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFjZWZiNgotLS0gL2Rldi9udWxsCisrKyBiL01ha2VmaWxlCkBAIC0wLDAgKzEsMjYgQEAKKyMgVGltZS1zdGFtcDogPDA4LzA2LzEyIDE0OjI4OjQyIHB0cj4KKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA0LTIwMDgKKyMgUGV0ciBPdnRjaGVua292CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAzLjAKKyMKKworU1JDUk9PVCA6PSBidWlsZAorU1VCRElSUyA6PSBidWlsZC9saWIKKworaW5jbHVkZSAke1NSQ1JPT1R9L01ha2VmaWxlcy9nbWFrZS9zdWJkaXJzLm1haworCithbGwgaW5zdGFsbCBkZXBlbmQgY2xlYW4gY2xvYmJlciBkaXN0Y2xlYW4gY2hlY2s6OgorCSskKGNhbGwgZG9pbnN1YmRpcnMsJHtTVUJESVJTfSkKKworZGlzdGNsZWFuIGNsZWFuIGRlcGVuZCBjbG9iYmVyOjoKKwkrJChjYWxsIGRvaW5zdWJkaXJzLGJ1aWxkL3Rlc3QvdW5pdCkKKworcmVsZWFzZS1zaGFyZWQgaW5zdGFsbC1yZWxlYXNlLXNoYXJlZDoKKwkrJChjYWxsIGRvaW5zdWJkaXJzLCR7U1VCRElSU30pCisKK2luc3RhbGw6OgorCSR7TUFLRX0gLUMgYnVpbGQvbGliIGluc3RhbGwtaGVhZGVycworCisuUEhPTlk6IGFsbCBpbnN0YWxsIGRlcGVuZCBjbGVhbiBjbG9iYmVyIGRpc3RjbGVhbiBjaGVjayByZWxlYXNlLXNoYXJlZCBpbnN0YWxsLXJlbGVhc2Utc2hhcmVkCmRpZmYgLS1naXQgYS9SRUFETUUgYi9SRUFETUUKaW5kZXggMDE4MDUxYi4uYTc1OTQ5NSAxMDA2NDQKLS0tIGEvUkVBRE1FCisrKyBiL1JFQURNRQpAQCAtMSArMSw2NCBAQAotU1RMUG9ydCB3YXMgY29waWVkIHdpdGggbWlub3IgZWRpdHMgZnJvbSB0aGUgQW5kcm9pZCBwb3J0IG9mIGdlYXJzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAJUkVBRE1FIGZpbGUgZm9yIFNUTHBvcnQgNS4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitUaGlzIGRpcmVjdG9yeSBjb250YWlucyB0aGUgU1RMcG9ydC01LjAgcmVsZWFzZS4KKworV2hhdCdzIGluc2lkZSA6CisKK1JFQURNRSAgICAgICAgICAgLSB0aGlzIGZpbGUKK0lOU1RBTEwgICAgICAgICAgLSBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zCisKK2JpbiAgICAgICAgICAgICAgLSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IGZvciBTVExwb3J0IHVuaXQgdGVzdHM7CisgICAgICAgICAgICAgICAgICAgaXQgbWF5IGNvbnRhaW4gbW9yZSBzdWJkaXJzLCBpZiB5b3UgdXNlCisgICAgICAgICAgICAgICAgICAgY3Jvc3Njb21waWxhdGlvbgorYnVpbGQvbGliICAgICAgICAtIGJ1aWxkIGRpcmVjdG9yeSBmb3IgU1RMcG9ydCBsaWJyYXJ5IChpZiB5b3UgdXNlCisgICAgICAgICAgICAgICAgICAgU1RMcG9ydCBpb3N0cmVhbXMgYW5kL29yIGxvY2FsZSBvbmx5KQorYnVpbGQvdGVzdC91bml0ICAtIGJ1aWxkIGRpcmVjdG9yeSBmb3IgcmVncmVzc2lvbiAodW5pdCkgdGVzdHMKK2J1aWxkL3Rlc3QvZWggICAgLSBidWlsZCBkaXJlY3RvcnkgZm9yIGV4Y2VwdGlvbiBoYW5kbGluZyB0ZXN0cworc3RscG9ydCAgICAgICAgICAtIG1haW4gU1RMcG9ydCBpbmNsdWRlIGRpcmVjdG9yeQorc3JjICAgICAgICAgICAgICAtIHNvdXJjZSBmb3IgaW9zdHJlYW1zIGltcGxlbWVudGF0aW9uIGFuZCBvdGhlciBwYXJ0cworICAgICAgICAgICAgICAgICAgIHRoYXQgYXJlbid0IHB1cmUgdGVtcGxhdGUgY29kZQorbGliICAgICAgICAgICAgICAtIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgZm9yIFNUTHBvcnQgbGlicmFyeSAoaWYgeW91CisgICAgICAgICAgICAgICAgICAgdXNlIFNUTHBvcnQgaW9zdHJlYW1zIGFuZC9vciBsb2NhbGUgb25seSk7CisgICAgICAgICAgICAgICAgICAgaXQgbWF5IGNvbnRhaW4gbW9yZSBzdWJkaXJzLCBpZiB5b3UgdXNlCisgICAgICAgICAgICAgICAgICAgY3Jvc3Njb21waWxhdGlvbgordGVzdC91bml0ICAgICAgICAtIHVuaXQgKHJlZ3Jlc3Npb24pIHRlc3RzCit0ZXN0L2VoICAgICAgICAgIC0gZXhjZXB0aW9uIGhhbmRsaW5nIHRlc3QgdXNpbmcgU1RMcG9ydCBpb3N0cmVhbXMKK2V0YyAgICAgICAgICAgICAgLSBtaXNjZWxsYW5vdXMgZmlsZXMgKENoYW5nZUxvZywgVE9ETywgc2NyaXB0cywgZXRjLikgCisKK0dFVFRJTkcgU1RMUE9SVAorCitUbyBkb3dubG9hZCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgU1RMcG9ydCwgcGxlYXNlIGJlIHN1cmUgdG8gdmlzaXQKK2h0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3Qvc2hvd2ZpbGVzLnBocD9ncm91cF9pZD0xNDY4MTQKKworTEVHQUxFU0UKKworVGhpcyBzb2Z0d2FyZSBpcyBiZWluZyBkaXN0cmlidXRlZCB1bmRlciB0aGUgZm9sbG93aW5nIHRlcm1zOgorCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYtMTk5OQorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDMKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL1JFQURNRS5nb29nbGUgYi9SRUFETUUuZ29vZ2xlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNWM5NTUKLS0tIC9kZXYvbnVsbAorKysgYi9SRUFETUUuZ29vZ2xlCkBAIC0wLDAgKzEsOSBAQAorVmVyc2lvbjogNS4yLjEKKworQ2hhbmdlczoKKyAgICAqIEFkZGVkIF9hbmRyb2lkLmggaW5jbHVkZWQgYnkgX3N5c3RlbS5oCisgICAgKiBEbyBub3QgdXNlIGxpbnV4IGZsb2F0IGZ1bmN0aW9ucyBpbiBudW1fZ2V0X2Zsb2F0LmNwcCBhcyBBbmRyb2lkIGRvZXMgbm90CisgICAgICBoYXZlIHRoZW0uCisgICAgKiBfbWJzdGF0ZV90LmggY2Fubm90IGRlZmluZSBpdHMgb3duIG1ic3RhdGVfdCBhcyBiaW9uaWMgYWxyZWFkeSBkZWZpbmVzCisgICAgICBpdC4KKyAgICAqIF9wYWlyLmggbmVlZHMgdG8gZGVmaW5lIGJpb25pYydzIChzZ2kncykgaW50ZXJuYWwgcGFpciBoZWFkZXIgZ3VhcmQuCmRpZmYgLS1naXQgYS9hbGdvcml0aG0gYi9hbGdvcml0aG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2OTU3MzUuLjAwMDAwMDAKLS0tIGEvYWxnb3JpdGhtCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTQKLSAqIEhld2xldHQtUGFja2FyZCBDb21wYW55Ci0gKgotICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKLSAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NwotICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogQm9yaXMgRm9taXRjaGV2Ci0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICovCi0KLSNpZm5kZWYgX1NUTFBfQUxHT1JJVEhNCi0jZGVmaW5lIF9TVExQX0FMR09SSVRITQotCi0jaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKLSMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MQotIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KLSNlbmRpZgotCi0jaWZkZWYgX1NUTFBfUFJBR01BX09OQ0UKLSMgIHByYWdtYSBvbmNlCi0jZW5kaWYKLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DU1RESU8KLS8vIHJlbW92ZSgpIGNvbmZsaWN0cywgPGNzdGRpbz4gc2hvdWxkIGFsd2F5cyBnbyBmaXJzdAotIyAgaW5jbHVkZSA8c3RsL19jc3RkaW8uaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0FMR09fSAotIyAgaW5jbHVkZSA8c3RsL19hbGdvLmg+Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9TVExQX0lNUE9SVF9WRU5ET1JfU1REKQotIyAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfSEVBREVSKGFsZ29yaXRobSkKLSNlbmRpZiAvKiBfU1RMUF9JTVBPUlRfVkVORE9SX1NURCAqLwotCi0jaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgxICkKLSMgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+Ci0jICB1bmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECi0jZW5kaWYKLQotI2VuZGlmIC8qIF9TVExQX0FMR09SSVRITSAqLwotCi0vLyBMb2NhbCBWYXJpYWJsZXM6Ci0vLyBtb2RlOkMrKwotLy8gRW5kOgpkaWZmIC0tZ2l0IGEvYXNzZXJ0LmggYi9hc3NlcnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhkMDEwOS4uMDAwMDAwMAotLS0gYS9hc3NlcnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0jaWYgIWRlZmluZWQgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQpCi0jICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDIwMgotIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KLSNlbGlmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MjAyKSAmJiAhIGRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKLSMgIGRlZmluZSBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKLSNlbmRpZgotCi0vKiBldmMzIGRvZXNuJ3QgaGF2ZSBhc3NlcnQuaDsgbWFjcm8gYXNzZXJ0KCkgaXMgZGVmaW5lZCBpbiBzdGxfZXZjLmggKi8KLSNpZm5kZWYgX1NUTFBfV0NFX0VWQzMKLSMgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NfSEVBREVSKGFzc2VydC5oKQotI2VuZGlmCi0KLSNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDIwMikKLSMgIGlmICEgZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQotIyAgICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgotIyAgICB1bmRlZiAgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAotIyAgZW5kaWYKLSMgIHVuZGVmICBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKLSNlbmRpZgotCi0vKiBMb2NhbCBWYXJpYWJsZXM6Ci0gKiBtb2RlOkMrKwotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9iaXRzZXQgYi9iaXRzZXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NDY2ZTUuLjAwMDAwMDAKLS0tIGEvYml0c2V0CisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5OAotICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLQotI2lmbmRlZiBfU1RMUF9CSVRTRVQKLSNkZWZpbmUgX1NUTFBfQklUU0VUCi0KLS8vIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgYml0c2V0PD4gaGFzIGEgc2Vjb25kIHRlbXBsYXRlIHBhcmFtZXRlciwKLS8vIF9Xb3JkVCwgd2hpY2ggZGVmYXVsdHMgdG8gdW5zaWduZWQgbG9uZy4gICpZT1UgU0hPVUxEIE5PVCBVU0UKLS8vIFRISVMgRkVBVFVSRSouICBJdCBpcyBleHBlcmltZW50YWwsIGFuZCBpdCBtYXkgYmUgcmVtb3ZlZCBpbgotLy8gZnV0dXJlIHJlbGVhc2VzLgotCi0vLyBBIGJpdHNldCBvZiBzaXplIE4sIHVzaW5nIHdvcmRzIG9mIHR5cGUgX1dvcmRULCB3aWxsIGhhdmUKLS8vIE4gJSAoc2l6ZW9mKF9Xb3JkVCkgKiBDSEFSX0JJVCkgdW51c2VkIGJpdHMuICAoVGhleSBhcmUgdGhlIGhpZ2gtCi0vLyBvcmRlciBiaXRzIGluIHRoZSBoaWdoZXN0IHdvcmQuKSAgSXQgaXMgYSBjbGFzcyBpbnZhcmlhbnQKLS8vIG9mIGNsYXNzIGJpdHNldDw+IHRoYXQgdGhvc2UgdW51c2VkIGJpdHMgYXJlIGFsd2F5cyB6ZXJvLgotCi0vLyBNb3N0IG9mIHRoZSBhY3R1YWwgY29kZSBpc24ndCBjb250YWluZWQgaW4gYml0c2V0PD4gaXRzZWxmLCBidXQgaW4gdGhlCi0vLyBiYXNlIGNsYXNzIF9CYXNlX2JpdHNldC4gIFRoZSBiYXNlIGNsYXNzIHdvcmtzIHdpdGggd2hvbGUgd29yZHMsIG5vdCB3aXRoCi0vLyBpbmRpdmlkdWFsIGJpdHMuICBUaGlzIGFsbG93cyB1cyB0byBzcGVjaWFsaXplIF9CYXNlX2JpdHNldCBmb3IgdGhlCi0vLyBpbXBvcnRhbnQgc3BlY2lhbCBjYXNlIHdoZXJlIHRoZSBiaXRzZXQgaXMgb25seSBhIHNpbmdsZSB3b3JkLgotCi0vLyBUaGUgQysrIHN0YW5kYXJkIGRvZXMgbm90IGRlZmluZSB0aGUgcHJlY2lzZSBzZW1hbnRpY3Mgb2Ygb3BlcmF0b3JbXS4KLS8vIEluIHRoaXMgaW1wbGVtZW50YXRpb24gdGhlIGNvbnN0IHZlcnNpb24gb2Ygb3BlcmF0b3JbXSBpcyBlcXVpdmFsZW50Ci0vLyB0byB0ZXN0KCksIGV4Y2VwdCB0aGF0IGl0IGRvZXMgbm8gcmFuZ2UgY2hlY2tpbmcuICBUaGUgbm9uLWNvbnN0IHZlcnNpb24KLS8vIHJldHVybnMgYSByZWZlcmVuY2UgdG8gYSBiaXQsIGFnYWluIHdpdGhvdXQgZG9pbmcgYW55IHJhbmdlIGNoZWNraW5nLgotCi0jaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKLSMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MgotIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KLSNlbmRpZgotCi0jaWZkZWYgX1NUTFBfUFJBR01BX09OQ0UKLSMgIHByYWdtYSBvbmNlCi0jZW5kaWYKLQotI2luY2x1ZGUgPHN0bC9fYml0c2V0Lmg+Ci0KLSNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDIgKQotIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KLSMgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKLSNlbmRpZgotCi0jZW5kaWYgLyogX1NUTFBfQklUU0VUICovCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6Ci0KZGlmZiAtLWdpdCBhL2Nhc3NlcnQgYi9jYXNzZXJ0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTc1N2RlLi4wMDAwMDAwCi0tLSBhL2Nhc3NlcnQKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLQotI2lmbmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECi0jICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDEwMwotIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KLSNlbGlmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MTAzKSAmJiAhIGRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKLSMgICBkZWZpbmUgX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lECi0jZW5kaWYKLQotI2lmICFkZWZpbmVkIChfU1RMUF9XQ0VfRVZDMykKLSMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9ORVdfQ19IRUFERVJTKQotIyAgICBpbmNsdWRlIF9TVExQX05BVElWRV9DUFBfQ19IRUFERVIoY2Fzc2VydCkKLSMgIGVsc2UKLSMgICAgaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jICBlbmRpZgotI2VuZGlmCi0KLSNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDEwMyApCi0jICBpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQotIyAgICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgotIyAgICB1bmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECi0jICBlbHNlCi0jICAgIHVuZGVmIF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRAotIyAgZW5kaWYKLSNlbmRpZgotCi0vLyBMb2NhbCBWYXJpYWJsZXM6Ci0vLyBtb2RlOkMrKwotLy8gRW5kOgpkaWZmIC0tZ2l0IGEvY2N0eXBlIGIvY2N0eXBlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDZjNjg2Li4wMDAwMDAwCi0tLSBhL2NjdHlwZQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0jaWZuZGVmIF9TVExQX0NDVFlQRQotCi0jaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKLSMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MTA0Ci0jICBkZWZpbmUgX1NUTFBfQ0NUWVBFCi0jICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgotI2VuZGlmCi0KLSNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAhPSAweDEwNCApCi0jICBpbmNsdWRlIF9TVExQX05BVElWRV9DUFBfQ19IRUFERVIoY2N0eXBlKQotI2Vsc2UKLSMgIGlmbmRlZiBfU1RMUF9JTlRFUk5BTF9DQ1RZUEUKLSMgICAgaW5jbHVkZSA8c3RsL19jY3R5cGUuaD4KLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MTA0ICkKLSMgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+Ci0jICB1bmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECi0jZW5kaWYKLQotI2VuZGlmIC8qIF9TVExQX0NDVFlQRSAqLwotCi0vLyBMb2NhbCBWYXJpYWJsZXM6Ci0vLyBtb2RlOkMrKwotLy8gRW5kOgpkaWZmIC0tZ2l0IGEvY2Vycm5vIGIvY2Vycm5vCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2IzOTYwLi4wMDAwMDAwCi0tLSBhL2NlcnJubworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0jaWZuZGVmIF9TVExQX0NFUlJOTwotIyBkZWZpbmUgX1NUTFBfQ0VSUk5PCi0KLSMgaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKLSMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MTA1Ci0jICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgotIyBlbmRpZgotCi0jIGlmbmRlZiBfU1RMUF9XQ0UKLSMgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX05FV19DX0hFQURFUlMpCi0jICBpbmNsdWRlIF9TVExQX05BVElWRV9DUFBfQ19IRUFERVIoY2Vycm5vKQotIyBlbHNlCi0jICBpbmNsdWRlIDxlcnJuby5oPgotIyBlbmRpZgotIyBlbmRpZgotCi0jaWZuZGVmIGVycm5vCi0KLSMgaWYgZGVmaW5lZCAoX1NUTFBfSU1QT1JUX1ZFTkRPUl9DU1REKSAmJiBcCi0gICEgZGVmaW5lZCAoX19JQk1DUFBfXykgJiYgISBkZWZpbmVkKF9faHB1eCkgJiYgISBkZWZpbmVkKF9fTVdFUktTX18pICYmICFkZWZpbmVkKF9TVExQX1dDRSkKLV9TVExQX0JFR0lOX05BTUVTUEFDRQotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmVycm5vOwotX1NUTFBfRU5EX05BTUVTUEFDRQotIyBlbmRpZiAvKiBfU1RMUF9JTVBPUlRfVkVORE9SX0NTVEQgKi8KLQotI2VuZGlmCi0KLSMgaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgxMDUgKQotIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KLSMgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKLSMgZW5kaWYKLQotI2VuZGlmIC8qIF9TVExQX0NFUlJOTyAqLwotCi0vLyBMb2NhbCBWYXJpYWJsZXM6Ci0vLyBtb2RlOkMrKwotLy8gRW5kOgpkaWZmIC0tZ2l0IGEvY2Zsb2F0IGIvY2Zsb2F0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTc2YTEwLi4wMDAwMDAwCi0tLSBhL2NmbG9hdAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0jaWZuZGVmIF9TVExQX0NGTE9BVAotI2RlZmluZSBfU1RMUF9DRkxPQVQKLQotI2lmbmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECi0jICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDEwNgotIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KLSNlbmRpZgotCi0vLyBCb3JsYW5kIGRlZmluZXMgc29tZSBpbXBsZW1lbnRhdGlvbiBjb25zdGFudHMgaW4gc3RkOjogbmFtZXNwYWNlLAotLy8gd2UgZG8gbm90IHdhbnQgdG8gaW1wb3J0IHRoZW0uCi0jaWYgZGVmaW5lZCAgKF9TVExQX1VTRV9ORVdfQ19IRUFERVJTKSAmJiAhZGVmaW5lZCAoX19CT1JMQU5EQ19fKQotIyAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSEVBREVSKGNmbG9hdCkKLSNlbHNlCi0jICBpbmNsdWRlIDxmbG9hdC5oPgotI2VuZGlmCi0KLSNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDEwNiApCi0jICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgotIyAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAotI2VuZGlmCi0KLSNlbmRpZiAvKiBfU1RMUF9DRkxPQVQgKi8KLQotLy8gTG9jYWwgVmFyaWFibGVzOgotLy8gbW9kZTpDKysKLS8vIEVuZDoKZGlmZiAtLWdpdCBhL2Npc282NDYgYi9jaXNvNjQ2CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDFmMzZmLi4wMDAwMDAwCi0tLSBhL2Npc282NDYKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLQotI2lmbmRlZiBfU1RMUF9DSVNPNjQ2Ci0jZGVmaW5lIF9TVExQX0NJU082NDYKLQotI2lmbmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECi0jICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDEwNwotIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoX1NUTFBfV0NFX0VWQzMpICYmICFkZWZpbmVkIChOX1BMQVRfTkxNKSAmJiAhZGVmaW5lZCAoX19CT1JMQU5EQ19fKQotIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX05FV19DX0hFQURFUlMpCi0jICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUihjaXNvNjQ2KQotIyAgZWxzZQotIyAgICBpbmNsdWRlIDxpc282NDYuaD4KLSMgIGVuZGlmIC8qIF9TVExQX1VTRV9ORVdfQ19IRUFERVJTICovCi0jZW5kaWYKLQotI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MTA3ICkKLSMgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+Ci0jICB1bmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECi0jZW5kaWYKLQotI2VuZGlmIC8qIF9TVExQX0NJU082NDYgKi8KLQotLy8gTG9jYWwgVmFyaWFibGVzOgotLy8gbW9kZTpDKysKLS8vIEVuZDoKZGlmZiAtLWdpdCBhL2NsaW1pdHMgYi9jbGltaXRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGQ0YWI0Li4wMDAwMDAwCi0tLSBhL2NsaW1pdHMKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLQotI2lmbmRlZiBfU1RMUF9DTElNSVRTCi0jIGRlZmluZSBfU1RMUF9DTElNSVRTCi0KLSNpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAotIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHgxMDgKLSMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9fU1VOUFJPX0NDKSAmJiAoKF9fU1VOUFJPX0NDID09IDB4NTAwKSAmJiAoX19TVU5QUk9fQ0NfQ09NUEFUID4gNCkpCi0jICBpbmNsdWRlIDwvdXNyL2luY2x1ZGUvbGltaXRzLmg+Ci0jZWxpZiBkZWZpbmVkIChfU1RMUF9VU0VfTkVXX0NfSEVBREVSUykKLSMgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUihjbGltaXRzKQotI2Vsc2UKLSMgIGlmIGRlZmluZWQgKF9fQk9STEFORENfXykKLSMgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ19IRUFERVIobGltaXRzLmgpCi0jICBlbHNlCi0jICAgIGluY2x1ZGUgPGxpbWl0cy5oPgotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gIDB4MTA4ICkKLSMgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+Ci0jICB1bmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECi0jZW5kaWYKLQotI2VuZGlmIC8qIF9TVExQX0NMSU1JVFMgKi8KLQotLy8gTG9jYWwgVmFyaWFibGVzOgotLy8gbW9kZTpDKysKLS8vIEVuZDoKZGlmZiAtLWdpdCBhL2Nsb2NhbGUgYi9jbG9jYWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTlmZjdhLi4wMDAwMDAwCi0tLSBhL2Nsb2NhbGUKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLQotI2lmbmRlZiBfU1RMUF9DTE9DQUxFCi0jZGVmaW5lIF9TVExQX0NMT0NBTEUKLQotI2lmbmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECi0jICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAgMHgxMDkKLSMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+Ci0jZW5kaWYKLQotI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEICE9IDB4MTA5ICkKLSMgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUihjbG9jYWxlKQotI2Vsc2UKLSMgIGlmbmRlZiBfU1RMUF9JTlRFUk5BTF9DTE9DQUxFCi0jICAgIGluY2x1ZGUgPHN0bC9fY2xvY2FsZS5oPgotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgxMDkgKQotIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KLSMgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKLSNlbmRpZgotCi0jZW5kaWYgLyogX1NUTFBfQ0xPQ0FMRSAqLwotCi0vLyBMb2NhbCBWYXJpYWJsZXM6Ci0vLyBtb2RlOkMrKwotLy8gRW5kOgpkaWZmIC0tZ2l0IGEvY21hdGggYi9jbWF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMzMTliMC4uMDAwMDAwMAotLS0gYS9jbWF0aAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0jaWZuZGVmIF9TVExQX0NNQVRICi0KLSNpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAotIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgIDB4MTEwCi0jICBkZWZpbmUgX1NUTFBfQ01BVEgKLSMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+Ci0jZW5kaWYKLQotI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEICE9IDB4MTEwKQotIyAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSEVBREVSKGNtYXRoKQotI2Vsc2UKLSMgIGlmbmRlZiBfU1RMUF9JTlRFUk5BTF9DTUFUSAotIyAgICBpbmNsdWRlIDxzdGwvX2NtYXRoLmg+Ci0jICBlbmRpZgotI2VuZGlmCi0KLSNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAgMHgxMTAgKQotIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KLSMgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKLSNlbmRpZgotCi0jZW5kaWYgLyogX1NUTFBfQ01BVEggKi8KLQotLy8gTG9jYWwgVmFyaWFibGVzOgotLy8gbW9kZTpDKysKLS8vIEVuZDoKZGlmZiAtLWdpdCBhL2NvbXBsZXggYi9jb21wbGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzczODI0Li4wMDAwMDAwCi0tLSBhL2NvbXBsZXgKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0jaWZuZGVmIF9TVExQX0NPTVBMRVgKLSNkZWZpbmUgX1NUTFBfQ09NUExFWAotCi0jaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKLSMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEICAweDEwCi0jICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgotI2VuZGlmCi0KLS8vIFRoaXMgaGVhZGVyIGRlY2xhcmVzIHRoZSB0ZW1wbGF0ZSBjbGFzcyBjb21wbGV4LCBhcyBkZXNjcmliZWQgaW4KLS8vIGluIHRoZSBkcmFmdCBDKysgc3RhbmRhcmQuICBTaW5nbGUtcHJlY2lzaW9uIGNvbXBsZXggbnVtYmVycwotLy8gYXJlIGNvbXBsZXg8ZmxvYXQ+LCBkb3VibGUtcHJlY2lzaW9uIGFyZSBjb21wbGV4PGRvdWJsZT4sIGFuZAotLy8gcXVhZCBwcmVjaXNpb24gYXJlIGNvbXBsZXg8bG9uZyBkb3VibGU+LgotCi0vLyBOb3RlIHRoYXQgdGhlIHRlbXBsYXRlIGNsYXNzIGNvbXBsZXggaXMgZGVjbGFyZWQgd2l0aGluIG5hbWVzcGFjZQotLy8gc3RkLCBhcyBjYWxsZWQgZm9yIGJ5IHRoZSBkcmFmdCBDKysgc3RhbmRhcmQKLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DT01QTEVYCi0jICBpbmNsdWRlIDxzdGwvX2NvbXBsZXguaD4KLSNlbmRpZgotCi0jaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gIDB4MTAgKQotIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KLSMgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKLSNlbmRpZgotCi0jZW5kaWYgLyogX1NUTFBfQ09NUExFWCAqLwotCi0vLyBMb2NhbCBWYXJpYWJsZXM6Ci0vLyBtb2RlOkMrKwotLy8gRW5kOgpkaWZmIC0tZ2l0IGEvY29uZmlndXJlIGIvY29uZmlndXJlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJmNDg1MTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWd1cmUKQEAgLTAsMCArMSwzMzMgQEAKKyMhL2Jpbi9zaAorCisjIFRpbWUtc3RhbXA6IDwwOC8wNi8wNyAxNToyMjoxOSB5ZXRpPgorCitiYXNlPWBjZCBcYGRpcm5hbWUgJDBcYDsgZWNobyAkUFdEYAorCitjb25maWdtYWs9JGJhc2UvYnVpbGQvTWFrZWZpbGVzL2dtYWtlL2NvbmZpZy5tYWsKKword3JpdGVfb3B0aW9uKCkgeworICB0YXJnZXQ9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvXltePV0qPS8vJ2AKKyAgZWNobyAkMiA6PSAkMyR0YXJnZXQgPj4gJHtjb25maWdtYWt9Cit9CisKK3dyaXRlX292ZXJfb3B0aW9uKCkgeworICB0YXJnZXQ9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvXltePV0qPS8vJ2AKKyAgZWNobyAkMiA/PSAkdGFyZ2V0ID4+ICR7Y29uZmlnbWFrfQorfQorCitwcmludF9oZWxwKCkgeworICBjYXQgPDxFT0YKK0NvbmZpZ3VyYXRpb24gdXRpbGl0eS4KKworVXNhZ2U6CisKKyAgY29uZmlndXJlIFtvcHRpb25zXQorCitBdmFpbGFibGUgb3B0aW9uczoKKworICAtLXByZWZpeD08ZGlyPiAgICAgICAgYmFzZSBpbnN0YWxsIHBhdGggKC91c3IvbG9jYWwvKQorICAtLWJpbmRpcj08ZGlyPiAgICAgICAgaW5zdGFsbCBwYXRoIGZvciBleGVjdXRhYmxlcyAoUFJFRklYL2JpbikKKyAgLS1saWJkaXI9PGRpcj4gICAgICAgIGluc3RhbGwgcGF0aCBmb3IgbGlicmFyaWVzIChQUkVGSVgvbGliKQorICAtLWluY2x1ZGVkaXI9PGRpcj4gICAgaW5zdGFsbCBwYXRoIGZvciBoZWFkZXJzIChQUkVGSVgvaW5jbHVkZSkKKworICAtLXRhcmdldD08dGFyZ2V0PiAgICAgdGFyZ2V0IHBsYXRmb3JtIChjcm9zcy1jb21waWxpbmcpCisKKyAgLS1oZWxwICAgICAgICAgICAgICAgIHByaW50IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisKKyAgLS13aXRoLXN0bHBvcnQ9PGRpcj4gIHVzZSBTVExwb3J0IGluIGNhdGFsb2cgPGRpcj4KKyAgLS13aXRob3V0LXN0bHBvcnQgICAgIGNvbXBpbGUgd2l0aG91dCBTVExwb3J0CisgIC0td2l0aC1ib29zdD08ZGlyPiAgICB1c2UgYm9vc3QgaGVhZGVycyBpbiBjYXRhbG9nIDxkaXI+CisgIC0td2l0aC1zeXN0ZW0tYm9vc3QgICB1c2UgYm9vc3QgaW5zdGFsbGVkIG9uIHRoaXMgc3lzdGVtCisgIC0td2l0aC1tc3ZjPTxkaXI+ICAgICB1c2UgTVMgVkMgZnJvbSB0aGlzIGNhdGFsb2cKKyAgLS13aXRoLW1zc2RrPTxkaXI+ICAgIHVzZSBNUyBTREsgZnJvbSB0aGlzIGNhdGFsb2cKKyAgLS13aXRoLWV4dHJhLWN4eGZsYWdzPTxvcHRpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgcGFzcyBleHRyYSBvcHRpb25zIHRvIEMrKyBjb21waWxlcgorICAtLXdpdGgtZXh0cmEtY2ZsYWdzPTxvcHRpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgcGFzcyBleHRyYSBvcHRpb25zIHRvIEMgY29tcGlsZXIKKyAgLS13aXRoLWV4dHJhLWxkZmxhZ3M9PG9wdGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzIGV4dHJhIG9wdGlvbnMgdG8gbGlua2VyICh2aWEgQy9DKyspCisgIC0tdXNlLXN0YXRpYy1nY2MgICAgICB1c2Ugc3RhdGljIGdjYyBsaWJzIGluc3RlYWQgb2Ygc2hhcmVkIGxpYmdjY19zICh1c2VmdWwgZm9yIGdjYyBjb21waWxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgd2FzIGJ1aWxkZWQgd2l0aCAtLWVuYWJsZS1zaGFyZWQgW2RlZmF1bHRdOyBpZiBjb21waWxlciB3YXMgYnVpbGRlZAorICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCAtLWRpc2FibGUtc2hhcmVkLCBzdGF0aWMgbGlicmFyaWVzIHdpbGwgYmUgdXNlZCBpbiBhbnkgY2FzZSkKKyAgLS1jbGVhbiAgICAgICAgICAgICAgIHJlbW92ZSBjdXN0b20gc2V0dGluZ3MgKGZpbGUgJHtjb25maWdtYWt9KQorICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHVzZSBkZWZhdWx0IHZhbHVlcworICAtLXdpdGgtY3h4PTxuYW1lPiAgICAgdXNlIDxuYW1lPiBhcyBDKysgY29tcGlsZXIgKHVzZSAtLXRhcmdldD0gZm9yIGNyb3NzLWNvbXBpbGF0aW9uKQorICAtLXdpdGgtY2M9PG5hbWU+ICAgICAgdXNlIDxuYW1lPiBhcyBDIGNvbXBpbGVyICh1c2UgLS10YXJnZXQ9IGZvciBjcm9zcy1jb21waWxhdGlvbikKKyAgLS11c2UtY29tcGlsZXItZmFtaWx5PTxuYW1lPiB1c2UgY29tcGlsZXIgZmFtaWx5OyBvbmUgb2Y6CisgICAgICAgICAgICAgICAgICAgICAgICBnY2MgICAgICBHTlUgY29tcGlsZXJzIChkZWZhdWx0KQorICAgICAgICAgICAgICAgICAgICAgICAgaWNjICAgICAgSW50ZWwgY29tcGlsZXJzCisgICAgICAgICAgICAgICAgICAgICAgICBhQ0MgICAgICBIUCdzIGFDQyBjb21waWxlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgIENDICAgICAgIFN1blBybydzIENDIGNvbXBpbGVycworICAgICAgICAgICAgICAgICAgICAgICAgYmNjICAgICAgQm9ybGFuZCdzIGNvbXBpbGVycworICAtLXdpdGhvdXQtZGVidWcgICAgICAgZG9uJ3QgYnVpbGQgZGVidWcgdmFyaWFudAorICAtLXdpdGhvdXQtc3RsZGVidWcgICAgZG9uJ3QgYnVpbGQgU1RMcG9ydCdzIFNUTFBfREVCVUcgbW9kZQorICAtLWVuYWJsZS1zdGF0aWMgICAgICAgYnVpbGQgc3RhdGljCisgIC0tZGlzYWJsZS1zaGFyZWQgICAgICBkb24ndCBidWlsZCBzaGFyZWQgCisgIC0td2l0aC1saWItbW90aWY9PG1vdGlmPgorICAgICAgICAgICAgICAgICAgICAgICAgVXNlIHRoaXMgb3B0aW9uIHRvIGN1c3RvbWl6ZSB0aGUgZ2VuZXJhdGVkIGxpYnJhcnkgbmFtZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBtb3RpZiB3aWxsIGJlIHVzZWQgaW4gdGhlIGxhc3QgcGxhY2UgYmVmb3JlIHZlcnNpb24gaW5mb3JtYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBzZXBhcmF0ZWQgYnkgYW4gdW5kZXJzY29yZSwgZXg6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGxwb3J0ZF9NT1RJRi41LjAubGliCisgICAgICAgICAgICAgICAgICAgICAgICBzdGxwb3J0c3RsZF9zdGF0aWNfTU9USUYuNS4xLmxpYgorICAtLXdpdGhvdXQtdGhyZWFkICAgICAgUGVyIGRlZmF1bHQgU1RMcG9ydCBsaWJyYXJpZXMgYXJlIGJ1aWx0IGluIG9yZGVyIHRvIGJlIHVzYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgaW4gYSBtdWx0aXRocmVhZGVkIGNvbnRleHQuIElmIHlvdSBkb24ndCBuZWVkIHRoaXMgeW91IGNhbiBhc2sKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciBhIG5vdCB0aHJlYWQgc2FmZSB2ZXJzaW9uIHdpdGggdGhpcyBvcHRpb24uCisgIC0td2l0aG91dC1ydHRpICAgICAgICBEaXNhYmxlIFJUVEkgd2hlbiBidWlsZGluZyBsaWJyYXJpZXMuCisgIC0td2l0aC1zdGF0aWMtcnRsCisgIC0td2l0aC1keW5hbWljLXJ0bAorICAgICAgICAgICAgICAgICAgICAgICAgRW5hYmxlcyB1c2FnZSBvZiBzdGF0aWMgKGxpYmMubGliIGZhbWlseSkgb3IgZHluYW1pYyAobXN2Y3J0LmxpYiBmYW1pbHkpCisgICAgICAgICAgICAgICAgICAgICAgICBDL0MrKyBydW50aW1lIGxpYnJhcnkgd2hlbiBsaW5raW5nIHdpdGggU1RMcG9ydC4gSWYgeW91IHdhbnQgeW91ciBhcHBsaS9kbGwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvIGxpbmsgc3RhdGljYWxseSB3aXRoIFNUTHBvcnQgYnV0IHVzaW5nIHRoZSBkeW5hbWljIEMgcnVudGltZSB1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgIC0td2l0aC1keW5hbWljLXJ0bDsgaWYgeW91IHdhbnQgdG8gbGluayBkeW5hbWljYWx5IHdpdGggU1RMcG9ydCBidXQgdXNpbmcgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWMgQyBydW50aW1lIHVzZSAtLXdpdGgtc3RhdGljLXJ0bC4gU2VlIFJFQURNRS5vcHRpb25zIGZvciBkZXRhaWxzLgorICAgICAgICAgICAgICAgICAgICAgICAgRG9uJ3QgZm9yZ2V0IHRvIHNpZ25hbCB0aGUgbGluayBtZXRob2Qgd2hlbiBidWlsZGluZyB5b3VyIGFwcGxpIG9yIGRsbCwgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0bHBvcnQvc3RsL2NvbmZpZy9ob3N0Lmggc2V0IHRoZSBmb2xsb3dpbmcgbWFjcm8gZGVwZW5kaW5nIG9uIHRoZSBjb25maWd1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIC0td2l0aC1zdGF0aWMtcnRsICAtPiBfU1RMUF9VU0VfRFlOQU1JQ19MSUIiCisgICAgICAgICAgICAgICAgICAgICAgICAtLXdpdGgtZHluYW1pYy1ydGwgLT4gX1NUTFBfVVNFX1NUQVRJQ19MSUIiCisgIC0td2luZG93cy1wbGF0Zm9ybT08bmFtZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldHRlZCBPUyB3aGVuIGJ1aWxkaW5nIGZvciBXaW5kb3dzOyBvbmUgb2Y6CisgICAgICAgICAgICAgICAgICAgICAgICB3aW45NSAgIFdpbmRvd3MgOTUKKyAgICAgICAgICAgICAgICAgICAgICAgIHdpbjk4ICAgV2luZG93cyA5OAorICAgICAgICAgICAgICAgICAgICAgICAgd2lueHAgICBXaW5kb3dzIFhQIGFuZCBsYXRlciAoZGVmYXVsdCkKKworRW52aXJvbm1lbnQgdmFyaWFibGVzOgorCisgIFwkQ1hYICAgICAgICAgICAgICAgICBDKysgY29tcGlsZXIgbmFtZSAodXNlIC0tdGFyZ2V0PSBmb3IgY3Jvc3MtY29tcGlsYXRpb24pCisgIFwkQ0MgICAgICAgICAgICAgICAgICBDIGNvbXBpbGVyIG5hbWUgKHVzZSAtLXRhcmdldD0gZm9yIGNyb3NzLWNvbXBpbGF0aW9uKQorICBcJENYWEZMQUdTICAgICAgICAgICAgcGFzcyBleHRyYSBvcHRpb25zIHRvIEMrKyBjb21waWxlcgorICBcJENGTEFHUyAgICAgICAgICAgICAgcGFzcyBleHRyYSBvcHRpb25zIHRvIEMgY29tcGlsZXIKKyAgXCRMREZMQUdTICAgICAgICAgICAgIHBhc3MgZXh0cmEgb3B0aW9ucyB0byBsaW5rZXIgKHZpYSBDL0MrKykKKworICBPcHRpb25zIGhhcyBwcmVmZXJlbmNlIG92ZXIgZW52aXJvbm1lbnQgdmFyaWFibGVzLgorCitFT0YKK30KKworZGVmYXVsdF9zZXR0aW5ncyAoKSB7CisgICMgaWYgWyAiJGJvb3N0X3NldCIgPSAiIiBdOyB0aGVuCisgICMgICB3cml0ZV9vcHRpb24gIiR7UFdEfS9leHRlcm5hbC9ib29zdCIgQk9PU1RfRElSCisgICMgZmkKKworICAjIGlmIFsgLXogIiR7c3RscG9ydF9zZXR9IiBdOyB0aGVuCisgICMgICB3cml0ZV9vdmVyX29wdGlvbiAiJGJhc2UiIFNUTFBPUlRfRElSCisgICMgZmkKKworICAjIFNldCBpbiBNYWtlZmlsZXMvZ21ha2UvdG9wLm1haworICBpZiBbIC16ICIke2NvbXBpbGVyX2ZhbWlseV9zZXR9IiBdOyB0aGVuCisgICMgIHdyaXRlX29wdGlvbiBnY2MgQ09NUElMRVJfTkFNRQorICAgIGVjaG8gaW5jbHVkZSBnY2MubWFrID4gJHtiYXNlfS9idWlsZC9saWIvTWFrZWZpbGUKKyAgICBlY2hvIGluY2x1ZGUgZ2NjLm1hayA+ICR7YmFzZX0vYnVpbGQvdGVzdC91bml0L01ha2VmaWxlCisgICAgZWNobyBpbmNsdWRlIGdjYy5tYWsgPiAke2Jhc2V9L2J1aWxkL3Rlc3QvZWgvTWFrZWZpbGUKKyAgZmkKKworICAjIFNldCBpbiBNYWtlZmlsZXMvZ21ha2UvdGFyZ2V0ZGlycy5tYWsKKyAgIyBpZiBbIC16ICIke3ByZWZpeF9zZXR9IiBdOyB0aGVuCisgICMgICB3cml0ZV9vcHRpb24gIi91c3IvbG9jYWwiIEJBU0VfSU5TVEFMTF9ESVIgJyR7REVTVERJUn0nCisgICMgZmkKK30KKworWyAkIyAtZXEgMCBdICYmIHsgPiR7Y29uZmlnbWFrfTsgZGVmYXVsdF9zZXR0aW5nczsgZXhpdCAwOyB9CisKK2ZvciBhIGluICRAIDsgZG8KKyAgY2FzZSAkYSBpbgorICAgIC0taGVscCkKKyAgICAgIHByaW50X2hlbHAKKyAgICAgIGV4aXQgMAorICAgICAgOzsKKyAgICAtLWNsZWFuKQorICAgICAgcm0gLWYgJHtjb25maWdtYWt9CisgICAgICBleGl0IDAKKyAgICAgIDs7CisgIGVzYWMKK2RvbmUKKworPiR7Y29uZmlnbWFrfQorCit3aGlsZSA6CitkbworICBjYXNlICQjIGluCisgICAgMCkKKyAgICAgIGJyZWFrCisgICAgICA7OworICBlc2FjCisgIG9wdGlvbj0iJDEiCisgIHNoaWZ0CisgIGNhc2UgJG9wdGlvbiBpbgorICAgIC0tdGFyZ2V0PSopCisgICAgICB3cml0ZV9vcHRpb24gIiRvcHRpb24iIFRBUkdFVF9PUworICAgICAgdGFyZ2V0X3NldD15CisgICAgICA7OworICAgIC0td2l0aC1zdGxwb3J0PSopCisgICAgICB3cml0ZV9vcHRpb24gIiRvcHRpb24iIFNUTFBPUlRfRElSCisgICAgICBzdGxwb3J0X3NldD15CisgICAgICA7OworICAgIC0td2l0aG91dC1zdGxwb3J0KQorICAgICAgd3JpdGVfb3B0aW9uIDEgV0lUSE9VVF9TVExQT1JUCisgICAgICBzdGxwb3J0X3NldD15CisgICAgICA7OworICAgIC0td2l0aC1ib29zdD0qKQorICAgICAgd3JpdGVfb3B0aW9uICIkb3B0aW9uIiBCT09TVF9ESVIKKyAgICAgIDs7CisgICAgLS13aXRoLXN5c3RlbS1ib29zdCkKKyAgICAgIHdyaXRlX29wdGlvbiAxIFVTRV9TWVNURU1fQk9PU1QKKyAgICAgIDs7CisgICAgLS13aXRoLW1zdmM9KikKKyAgICAgIHdyaXRlX29wdGlvbiAiJG9wdGlvbiIgTVNWQ19ESVIKKyAgICAgIDs7CisgICAgLS13aXRoLW1zc2RrPSopCisgICAgICB3cml0ZV9vcHRpb24gIiRvcHRpb24iIE1TU0RLX0RJUgorICAgICAgOzsKKyAgICAtLXdpdGgtZXh0cmEtY3h4ZmxhZ3M9KikKKyAgICAgIHdyaXRlX29wdGlvbiAiJG9wdGlvbiIgRVhUUkFfQ1hYRkxBR1MKKyAgICAgIGN4eGZsYWdzX3NldD15CisgICAgICA7OworICAgIC0td2l0aC1leHRyYS1jZmxhZ3M9KikKKyAgICAgIHdyaXRlX29wdGlvbiAiJG9wdGlvbiIgRVhUUkFfQ0ZMQUdTCisgICAgICBjZmxhZ3Nfc2V0PXkKKyAgICAgIDs7CisgICAgLS13aXRoLWV4dHJhLWxkZmxhZ3M9KikKKyAgICAgIHdyaXRlX29wdGlvbiAiJG9wdGlvbiIgRVhUUkFfTERGTEFHUworICAgICAgbGRmbGFnc19zZXQ9eQorICAgICAgOzsKKyAgICAtLXdpdGgtbGliLW1vdGlmPSopCisgICAgICBlY2hvICJVc2luZyAkb3B0aW9uIGluIGdlbmVyYXRlZCBsaWJyYXJ5IG5hbWVzIgorICAgICAgd3JpdGVfb3B0aW9uICIkb3B0aW9uIiBMSUJfTU9USUYKKyAgICAgIDs7CisgICAgLS13aXRob3V0LXRocmVhZCkKKyAgICAgIHdyaXRlX29wdGlvbiAxIFdJVEhPVVRfVEhSRUFECisgICAgICA7OworICAgIC0td2l0aG91dC1ydHRpKQorICAgICAgd3JpdGVfb3B0aW9uIDEgV0lUSE9VVF9SVFRJCisgICAgICA7OworICAgIC0td2l0aC1keW5hbWljLXJ0bCkKKyAgICAgIHdyaXRlX29wdGlvbiAxIFdJVEhfRFlOQU1JQ19SVEwKKyAgICAgIDs7CisgICAgLS13aXRoLXN0YXRpYy1ydGwpCisgICAgICB3cml0ZV9vcHRpb24gMSBXSVRIX1NUQVRJQ19SVEwKKyAgICAgIDs7CisgICAgLS11c2Utc3RhdGljLWdjYykKKyAgICAgIHdyaXRlX29wdGlvbiAxIFVTRV9TVEFUSUNfTElCR0NDCisgICAgICA7OworICAgIC0td2l0aG91dC1kZWJ1ZykKKyAgICAgIHdyaXRlX29wdGlvbiAxIF9OT19EQkdfQlVJTEQKKyAgICAgIDs7CisgICAgLS13aXRob3V0LXN0bGRlYnVnKQorICAgICAgd3JpdGVfb3B0aW9uIDEgX05PX1NUTERCR19CVUlMRAorICAgICAgOzsKKyAgICAtLWVuYWJsZS1zdGF0aWMpCisgICAgICB3cml0ZV9vcHRpb24gMSBfU1RBVElDX0JVSUxECisgICAgICA7OworICAgIC0tZGlzYWJsZS1zaGFyZWQpCisgICAgICB3cml0ZV9vcHRpb24gMSBfTk9fU0hBUkVEX0JVSUxECisgICAgICA7OworICAgIC0td2l0aC1jeHg9KikKKyAgICAgIHdyaXRlX29wdGlvbiAiJG9wdGlvbiIgX0ZPUkNFX0NYWAorICAgICAgY3h4X3NldD15CisgICAgICA7OworICAgIC0td2l0aC1jYz0qKQorICAgICAgd3JpdGVfb3B0aW9uICIkb3B0aW9uIiBfRk9SQ0VfQ0MKKyAgICAgIGNjX3NldD15CisgICAgICA7OworICAgIC0tdXNlLWNvbXBpbGVyLWZhbWlseT0qKQorICAgICAgY2FzZSBgZWNobyAkb3B0aW9uIHwgc2VkIC1lICdzL15bXj1dKj0vLydgIGluCisgICAgICAgIGdjY3xpY2N8YUNDfENDfGJjY3xkbWMpCisgICAgICAgICAgdGFyZ2V0PWBlY2hvICRvcHRpb24gfCBzZWQgLWUgJ3MvXltePV0qPS8vJ2AKKyAgICAgICAgICBlY2hvIENPTVBJTEVSX05BTUUgOj0gJHRhcmdldCA+PiAke2NvbmZpZ21ha30KKyAgICAgICAgICBlY2hvIGluY2x1ZGUgJHRhcmdldC5tYWsgPiAke2Jhc2V9L2J1aWxkL2xpYi9NYWtlZmlsZQorICAgICAgICAgIGVjaG8gaW5jbHVkZSAkdGFyZ2V0Lm1hayA+ICR7YmFzZX0vYnVpbGQvdGVzdC91bml0L01ha2VmaWxlCisgICAgICAgICAgZWNobyBpbmNsdWRlICR0YXJnZXQubWFrID4gJHtiYXNlfS9idWlsZC90ZXN0L2VoL01ha2VmaWxlCisgICAgICAgICAgOzsKKyAgICAgICAgKikKKyAgICAgICAgICBlY2hvICJOb3Qgc3VwcG9ydGVkIGNvbXBpbGVycyBmYW1pbHkiCisgICAgICAgICAgZXhpdCAtMQorICAgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgICBjb21waWxlcl9mYW1pbHlfc2V0PXkKKyAgICAgIDs7CisgICAgLS1wcmVmaXg9KikKKyAgICAgIHdyaXRlX29wdGlvbiAiJG9wdGlvbiIgQkFTRV9JTlNUQUxMX0RJUiAnJHtERVNURElSfScKKyAgICAgIHByZWZpeF9zZXQ9eQorICAgICAgOzsKKyAgICAtLWJpbmRpcj0qKQorICAgICAgd3JpdGVfb3B0aW9uICIkb3B0aW9uIiBJTlNUQUxMX0JJTl9ESVIgJyR7REVTVERJUn0nCisgICAgICA7OworICAgIC0tbGliZGlyPSopCisgICAgICB3cml0ZV9vcHRpb24gIiRvcHRpb24iIElOU1RBTExfTElCX0RJUiAnJHtERVNURElSfScKKyAgICAgIDs7CisgICAgLS1pbmNsdWRlZGlyPSopCisgICAgICB3cml0ZV9vcHRpb24gIiRvcHRpb24iIElOU1RBTExfSERSX0RJUiAnJHtERVNURElSfScKKyAgICAgIDs7CisgICAgLS13aW5kb3dzLXBsYXRmb3JtPSopCisgICAgICBjYXNlIGBlY2hvICRvcHRpb24gfCBzZWQgLWUgJ3MvXltePV0qPS8vJ2AgaW4KKyAgICAgICAgd2luOTUpCisgICAgICAgICAgd3JpdGVfb3B0aW9uIDB4MDQwMCBXSU5WRVIKKyAgICAgICAgICA7OworICAgICAgICB3aW45OCkKKyAgICAgICAgICB3cml0ZV9vcHRpb24gMHgwNDEwIFdJTlZFUgorICAgICAgICAgIDs7CisgICAgICAgIHdpbnhwKQorICAgICAgICAgIHdyaXRlX29wdGlvbiAweDA1MDEgV0lOVkVSCisgICAgICAgICAgOzsKKyAgICAgICAgKikKKyAgICAgICAgICBlY2hvICJOb3Qgc3VwcG9ydGVkIHdpbmRvd3MgcGxhdGZvcm0iCisgICAgICAgICAgZXhpdCAtMQorICAgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgICA7OworICAgICopCisgICAgICBlY2hvICJVbmtub3duIGNvbmZpZ3VyYXRpb24gb3B0aW9uICckb3B0aW9uJyIKKyAgICAgIGV4aXQgLTEKKyAgICAgIDs7CisgIGVzYWMKK2RvbmUKKworaWYgWyAtbiAiJHtDWFh9IiBdOyB0aGVuCisgIGlmIFsgLW4gIiR7Y3h4X3NldH0iIF07IHRoZW4KKyAgICBlY2hvICJCb3RoIC0td2l0aC1jeHggYW5kIFwkQ1hYIHNldCwgdXNpbmcgdGhlIGZpcnN0IgorICBlbGlmIFsgLXogIiR7dGFyZ2V0X3NldH0iIF07IHRoZW4KKyAgICB3cml0ZV9vcHRpb24gIiR7Q1hYfSIgX0ZPUkNFX0NYWAorICBlbHNlCisgICAgZWNobyAiRm9yIGNyb3NzLWNvbXBpbGF0aW9uIHdpdGggZ2NjIHVzZSAtLXRhcmdldCBvcHRpb24gb25seSIKKyAgZmkKKyAgaWYgWyAteiAiJHtDQ30iIC1hIC16ICIke2NjX3NldH0iIF07IHRoZW4KKyAgICBlY2hvICJcJENYWCBzZXQsIGJ1dCBJIGRvbid0IHNlZSBcJENDISIKKyAgZmkKK2ZpCisKK2lmIFsgLW4gIiR7Q0N9IiBdOyB0aGVuCisgIGlmIFsgLW4gIiR7Y3h4X3NldH0iIF07IHRoZW4KKyAgICBlY2hvICJCb3RoIC0td2l0aC1jYyBhbmQgXCRDQyBzZXQsIHVzaW5nIHRoZSBmaXJzdCIKKyAgZWxzZQorICAgIHdyaXRlX29wdGlvbiAiJHtDQ30iIF9GT1JDRV9DQworICBmaQorZmkKKworaWYgWyAtbiAiJHtDWFhGTEFHU30iIF07IHRoZW4KKyAgaWYgWyAteiAiJHtjeHhmbGFnc19zZXR9IiBdOyB0aGVuCisgICAgd3JpdGVfb3B0aW9uICIke0NYWEZMQUdTfSIgRVhUUkFfQ1hYRkxBR1MKKyAgZWxzZQorICAgIGVjaG8gIkJvdGggLS13aXRoLWV4dHJhLWN4eGZsYWdzIGFuZCBcJENYWEZMQUdTIHNldCwgdXNpbmcgdGhlIGZpcnN0IgorICBmaQorZmkKKworaWYgWyAtbiAiJHtDRkxBR1N9IiBdOyB0aGVuCisgIGlmIFsgLXogIiR7Y2ZsYWdzX3NldH0iIF07IHRoZW4KKyAgICB3cml0ZV9vcHRpb24gIiR7Q0ZMQUdTfSIgRVhUUkFfQ0ZMQUdTCisgIGVsc2UKKyAgICBlY2hvICJCb3RoIC0td2l0aC1leHRyYS1jZmxhZ3MgYW5kIFwkQ0ZMQUdTIHNldCwgdXNpbmcgdGhlIGZpcnN0IgorICBmaQorZmkKKworaWYgWyAtbiAiJHtMREZMQUdTfSIgXTsgdGhlbgorICBpZiBbIC16ICIke2xkZmxhZ3Nfc2V0fSIgXTsgdGhlbgorICAgIHdyaXRlX29wdGlvbiAiJHtMREZMQUdTfSIgRVhUUkFfTERGTEFHUworICBlbHNlCisgICAgZWNobyAiQm90aCAtLXdpdGgtZXh0cmEtbGRmbGFncyBhbmQgXCRMREZMQUdTIHNldCwgdXNpbmcgdGhlIGZpcnN0IgorICBmaQorZmkKKworIyBkZWZhdWx0IHNldHRpbmdzCisKK2RlZmF1bHRfc2V0dGluZ3MKZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZS5iYXQgYi9jb25maWd1cmUuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMzNmM2QKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWd1cmUuYmF0CkBAIC0wLDAgKzEsNjMyIEBACitARUNITyBPRkYKK1JFTSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNICoKK1JFTSAqIGNvbmZpZ3VyZS5iYXQgZm9yIHNldHRpbmcgdXAgY29tcGlsaW5nIFNUTHBvcnQgdW5kZXIgV2luZG93cworUkVNICogdG8gc2VlIGF2YWlsYWJsZSBvcHRpb25zLCBjYWxsIHdpdGggb3B0aW9uIC0taGVscAorUkVNICoKK1JFTSAqIENvcHlyaWdodCAoQykgMjAwNCwyMDA1IE1pY2hhZWwgRmluaworUkVNICoKK1JFTSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitSRU0gQXR0ZW50aW9uISBCYXRjaCBmaWxlIGxhYmVscyBvbmx5IGhhdmUgOCBzaWduaWZpY2FudCBjaGFyYWN0ZXJzIQorCitlY2hvIFNUTHBvcnQgQ29uZmlndXJhdGlvbiBUb29sIGZvciBXaW5kb3dzCitlY2hvLgorCitSRU0gbm8gb3B0aW9ucyBhdCBhbGw/CitpZiBOT1QgIiUxeHl6MTIzIiA9PSAieHl6MTIzIiBnb3RvIGluaXQKKworZWNobyBQbGVhc2Ugc3BlY2lmeSBhdCBsZWFzdCB0aGUgY29tcGlsZXIgeW91IGFyZSBnb2luZyB0byB1c2UsCitlY2hvIHVzZSAiY29uZmlndXJlIC0taGVscCIgdG8gc2VlIHRoZSBhdmFpbGFibGUgb25lcy4KK2dvdG8gc2twX2NvbXAKKworOmluaXQKKworUkVNIGluaXRpYWxseSBjcmVhdGUvb3ZlcndyaXRlIGNvbmZpZy5tYWsKK2VjaG8gIyBTVExwb3J0IENvbmZpZ3VyYXRpb24gVG9vbCBmb3IgV2luZG93cyA+IGJ1aWxkXE1ha2VmaWxlc1xubWFrZVxjb25maWcubWFrCitlY2hvICMgPj4gYnVpbGRcTWFrZWZpbGVzXG5tYWtlXGNvbmZpZy5tYWsKK2VjaG8gIyBjb25maWcubWFrIGdlbmVyYXRlZCB3aXRoIGNvbW1hbmQgbGluZTogPj4gYnVpbGRcTWFrZWZpbGVzXG5tYWtlXGNvbmZpZy5tYWsKK2VjaG8gIyBjb25maWd1cmUgJTEgJTIgJTMgJTQgJTUgJTYgJTcgJTggJTkgPj4gYnVpbGRcTWFrZWZpbGVzXG5tYWtlXGNvbmZpZy5tYWsKK2VjaG8gIyA+PiBidWlsZFxNYWtlZmlsZXNcbm1ha2VcY29uZmlnLm1haworCitSRU0gRmlyc3QgcGFyYW1ldGVyIGNhbiBvbmx5IGJlIGhlbHAgb3IgY29tcGlsZXIKK1JFTSBoZWxwIG9wdGlvbgoraWYgIiUxIiA9PSAiLT8iIGdvdG8gb3B0X2hlbHAKK2lmICIlMSIgPT0gIi1oIiBnb3RvIG9wdF9oZWxwCitpZiAiJTEiID09ICIvPyIgZ290byBvcHRfaGVscAoraWYgIiUxIiA9PSAiL2giIGdvdG8gb3B0X2hlbHAKK2lmICIlMSIgPT0gIi0taGVscCIgZ290byBvcHRfaGVscAorCitSRU0gVGhpcyBpcyBuZWNlc3NhcmlseSBhIGNvbXBpbGVyCitnb3RvIG9wdF9jb21wCisKK1JFTQorUkVNIG9wdGlvbiBsb29wCitSRU0KKzpsb29wCisKK1JFTSBwbGF0Zm9ybSBvcHRpb24KK2lmICIlMSIgPT0gIi1wIiBnb3RvIG9wdF9wbGF0CitpZiAiJTEiID09ICIvcCIgZ290byBvcHRfcGxhdAoraWYgIiUxIiA9PSAiLS1wbGF0Zm9ybSIgZ290byBvcHRfcGxhdAorCitSRU0gY3Jvc3MgY29tcGlsaW5nCitpZiAiJTEiID09ICIteCIgZ290byBvcHRfeAoraWYgIiUxIiA9PSAiL3giIGdvdG8gb3B0X3gKK2lmICIlMSIgPT0gIi0tY3Jvc3MiIGdvdG8gb3B0X3gKKworUkVNIEMgcnVudGltZSBsaWJyYXJ5CitpZiAiJTEiID09ICItLXdpdGgtc3RhdGljLXJ0bCIgZ290byBvcHRfc3J0bAoraWYgIiUxIiA9PSAiLS13aXRoLWR5bmFtaWMtcnRsIiBnb3RvIG9wdF9kcnRsCitpZiAiJTEiID09ICItLXJ0bC1zdGF0aWMiIGdvdG8gb3B0X3NydGwKK2lmICIlMSIgPT0gIi0tcnRsLWR5bmFtaWMiIGdvdG8gb3B0X2RydGwKKworUkVNIGJvb3N0IHN1cHBvcnQKK2lmICIlMSIgPT0gIi0tdXNlLWJvb3N0IiBnb3RvIG9wdF9ic3QKKworUkVNIG11bHRpdGhyZWFkaW5nIHN1cHBvcnQKK2lmICIlMSIgPT0gIi0tbm90LXRocmVhZC1zYWZlIiBnb3RvIG9wdF9zdAoraWYgIiUxIiA9PSAiLS13aXRob3V0LXRocmVhZCIgZ290byBvcHRfc3QKKworUkVNIHJ0dGkgc3VwcG9ydAoraWYgIiUxIiA9PSAiLS1uby1ydHRpIiBnb3RvIG9wdF9ydHRpCitpZiAiJTEiID09ICItLXdpdGhvdXQtcnR0aSIgZ290byBvcHRfcnR0aQorCitSRU0gYWRkaXRpb25hbCBjb21waWxlciBvcHRpb25zCitpZiAiJTEiID09ICItLWV4dHJhLWN4eGZsYWciIGdvdG8gb3B0X3h0cmEKKworUkVNIGxpYnJhcnkgbmFtZSBjdXN0b21pemF0aW9uCitpZiAiJTEiID09ICItLWxpYi1tb3RpZiIgZ290byBvcHRfbW90ZgoraWYgIiUxIiA9PSAiLS13aXRoLWxpYi1tb3RpZiIgZ290byBvcHRfbW90ZgorCitSRU0gYnVpbGQgd2l0aG91dCBTVExwb3J0CitpZiAiJTEiID09ICItLXdpdGhvdXQtc3RscG9ydCIgZ290byBub19zcG9ydAorCitSRU0gY2xlYW4gcnVsZQoraWYgIiUxIiA9PSAiLS1jbGVhbiIgZ290byBvcHRfY2xuCisKK2VjaG8gVW5rbm93biBvcHRpb246ICUxCisKKzpjb250X2xwCitlY2hvLgorc2hpZnQKKworUkVNIG5vIG1vcmUgb3B0aW9ucz8KK2lmICIlMXh5ejEyMyIgPT0gInh5ejEyMyIgZ290byBlbmRfbG9vcAorCitnb3RvIGxvb3AKKworCitSRU0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTSAqCitSRU0gKiBIZWxwCitSRU0gKgorUkVNICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis6b3B0X2hlbHAKK2VjaG8gVGhlIGZpcnN0IHBhcmFtZXRlciBtdXN0IGJlIHRoZSBjb21waWxlciBuYW1lLCBoZXJlIGFyZSB0aGUgYXZhaWxhYmxlCitlY2hvIGtleXdvcmRzOgorZWNoby4KK2VjaG8gICAgbXN2YzYgICAgTWljcm9zb2Z0IFZpc3VhbCBDKysgNi4wCitlY2hvICAgIG1zdmM3ICAgIE1pY3Jvc29mdCBWaXN1YWwgQysrIC5ORVQgMjAwMgorZWNobyAgICBtc3ZjNzEgICBNaWNyb3NvZnQgVmlzdWFsIEMrKyAuTkVUIDIwMDMKK2VjaG8gICAgbXN2YzggICAgTWljcm9zb2Z0IFZpc3VhbCBDKysgMjAwNQorZWNobyAgICBtc3ZjOSAgICBNaWNyb3NvZnQgVmlzdWFsIEMrKyAyMDA4CitlY2hvICAgIGljbCAgICAgIEludGVsIEMrKyBDb21waWxlcgorZWNobyAgICBldmMzICAgICBNaWNyb3NvZnQgZU1iZWRkZWQgVmlzdWFsIEMrKyAzICgqKQorZWNobyAgICBldmM0ICAgICBNaWNyb3NvZnQgZU1iZWRkZWQgVmlzdWFsIEMrKyAuTkVUICgqKQorZWNobyAgICBldmM4ICAgICBNaWNyb3NvZnQgVmlzdWFsIEMrKyAyMDA1IGNvbXBpbGluZyBmb3IgQ0UKK2VjaG8gICAgZXZjOSAgICAgTWljcm9zb2Z0IFZpc3VhbCBDKysgMjAwOCBjb21waWxpbmcgZm9yIENFCitlY2hvLgorZWNobyAgKCopIEZvciB0aGVzZSBjb21waWxlcnMgdGhlIHRhcmdldCBwcm9jZXNzb3IgaXMgZGV0ZXJtaW5lZCBhdXRvbWF0aWNhbGx5LgorZWNobyAgICAgIFlvdSBtdXN0IHJ1biB0aGUgV0NFKi5CQVQgZmlsZSB5b3Ugd2lzaCB0byBidWlsZCBTVExwb3J0IGZvciBiZWZvcmUKK2VjaG8gICAgICBydW5uaW5nIGNvbmZpZ3VyZS4KK2VjaG8uCitlY2hvIFRoZW4gdGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBhdmFpbGFibGU6CitlY2hvLgorZWNobyAiLXAgPHBsYXRmb3JtPiIgb3IgIi0tcGxhdGZvcm0gPHBsYXRmb3JtPiIKK2VjaG8gICAgQnVpbGQgU1RMcG9ydCBmb3IgdGhlIHNwZWNpZmllZCBwbGF0Zm9ybS4gTm90IGFsbCBleGlzdGluZyBwbGF0Zm9ybXMgYXJlCitlY2hvICAgIGF2YWlsYWJsZSwgb25seSB0aGUgb25lcyB0aGF0IG1ha2UgYSBkaWZmZXJlbmNlIHdoZW4gYnVpbGRpbmcgU1RMcG9ydCBhcmUuCitlY2hvICAgIFRoZSBmb2xsb3dpbmcga2V5d29yZHMgYXJlIGF2YWlsYWJsZToKK2VjaG8gICAgd2luOTUgICAgV2luZG93cyA5NSBjb21wYXRpYmxlCitlY2hvICAgIHdpbjk4ICAgIFdpbmRvd3MgOTggYW5kIHVwIHRvIFdpbmRvd3MgWFAgZXhjbHVkZWQKK2VjaG8gICAgd2lueHAgICAgV2luZG93cyBYUCBvciBsYXRlciAoZGVmYXVsdCkKK2VjaG8uCitlY2hvICIteCIKK2VjaG8gICAgRW5hYmxlcyBjcm9zcy1jb21waWxpbmc7IHRoZSByZXN1bHQgaXMgdGhhdCBhbGwgYnVpbHQgZmlsZXMgdGhhdCBhcmUKK2VjaG8gICAgbm9ybWFsbHkgcHV0IHVuZGVyICJiaW4iIGFuZCAibGliIiBnZXQgZXh0cmEgc3ViZm9sZGVycyBkZXBlbmRpbmcgb24KK2VjaG8gICAgdGhlIGNvbXBpbGVyIG5hbWUuCitlY2hvLgorZWNobyAiLS13aXRoLXN0YXRpYy1ydGwiCitlY2hvICItLXdpdGgtZHluYW1pYy1ydGwiCitlY2hvICAgIEVuYWJsZXMgdXNhZ2Ugb2Ygc3RhdGljIChsaWJjLmxpYiBmYW1pbHkpIG9yIGR5bmFtaWMgKG1zdmNydC5saWIgZmFtaWx5KQorZWNobyAgICBDL0MrKyBydW50aW1lIGxpYnJhcnkgd2hlbiBsaW5raW5nIHdpdGggU1RMcG9ydC4gSWYgeW91IHdhbnQgeW91ciBhcHBsaS9kbGwKK2VjaG8gICAgdG8gbGluayBzdGF0aWNhbGx5IHdpdGggU1RMcG9ydCBidXQgdXNpbmcgdGhlIGR5bmFtaWMgQyBydW50aW1lIHVzZQorZWNobyAgICAtLXdpdGgtZHluYW1pYy1ydGw7IGlmIHlvdSB3YW50IHRvIGxpbmsgZHluYW1pY2FseSB3aXRoIFNUTHBvcnQgYnV0IHVzaW5nIHRoZQorZWNobyAgICBzdGF0aWMgQyBydW50aW1lIHVzZSAtLXdpdGgtc3RhdGljLXJ0bC4gU2VlIFJFQURNRS5vcHRpb25zIGZvciBkZXRhaWxzLgorZWNobyAgICBEb24ndCBmb3JnZXQgdG8gc2lnbmFsIHRoZSBsaW5rIG1ldGhvZCB3aGVuIGJ1aWxkaW5nIHlvdXIgYXBwbGkgb3IgZGxsLCBpbgorZWNobyAgICBzdGxwb3J0L3N0bC9jb25maWcvaG9zdC5oIHNldCB0aGUgZm9sbG93aW5nIG1hY3JvIGRlcGVuZGluZyBvbiB0aGUgY29uZmlndXJlCitlY2hvICAgIG9wdGlvbjoKK2VjaG8gICAgIi0td2l0aC1zdGF0aWMtcnRsICAtPiBfU1RMUF9VU0VfRFlOQU1JQ19MSUIiCitlY2hvICAgICItLXdpdGgtZHluYW1pYy1ydGwgLT4gX1NUTFBfVVNFX1NUQVRJQ19MSUIiCitlY2hvLgorZWNobyAiLS11c2UtYm9vc3QgPGJvb3N0IGluc3RhbGwgcGF0aD4iCitlY2hvICAgIFJlcXVlc3QgdXNlIG9mIGJvb3N0IHN1cHBvcnQgKHd3dy5ib29zdC5vcmcpLiBGb3IgdGhlIG1vbWVudCBvbmx5IHRoZSBib29zdAorZWNobyAgICB0eXBlX3RyYWl0cyBsaWJyYXJ5IGlzIHVzZWQgdG8gZ2V0IHR5cGUgaW5mb3JtYXRpb24gYW5kIHRvIGltcGxlbWVudCBzb21lCitlY2hvICAgIHNwZWNpZmljIHdvcmthcm91bmQgbm90IGRpcmVjdGx5IGltcGxlbWVudGVkIGJ5IFNUTHBvcnQuIFRvIHVzZSB0aGUgc2FtZQorZWNobyAgICBzdXBwb3J0IHdoZW4gdXNpbmcgU1RMcG9ydCBmb3IgeW91ciBhcHBsaWNhdGlvbiBkb24ndCBmb3JnZXQgdG8gZGVmaW5lCitlY2hvICAgIF9TVExQX1VTRV9CT09TVF9TVVBQT1JUIGluIHN0bHBvcnQvc3RsL2NvbmZpZy91c2VyX2NvbmZpZy5oIGZpbGUuCitlY2hvLgorZWNobyAiLS13aXRob3V0LXRocmVhZCIKK2VjaG8gICAgUGVyIGRlZmF1bHQgU1RMcG9ydCBsaWJyYXJpZXMgYXJlIGJ1aWx0IGluIG9yZGVyIHRvIGJlIHVzYWJsZSBpbiBhIG11bHRpdGhyZWFkZWQKK2VjaG8gICAgY29udGV4dC4gSWYgeW91IGRvbid0IG5lZWQgdGhpcyB5b3UgY2FuIGFzayBmb3IgYSBub3QgdGhyZWFkIHNhZmUgdmVyc2lvbiB3aXRoCitlY2hvICAgIHRoaXMgb3B0aW9uLgorZWNoby4KK2VjaG8gIi0td2l0aG91dC1ydHRpIgorZWNobyAgICBSZW1vdmUgcnR0aSAocnVuIHRpbWUgdHlwZSBpbmZvcm1hdGlvbikgc3VwcG9ydCBpZiBhdmFpbGFibGUuCitlY2hvLgorZWNobyAiLS1leHRyYS1jeHhmbGFnIDxhZGRpdGlvbmFsIGNvbXBpbGF0aW9uIG9wdGlvbnM+IgorZWNobyAgICBVc2UgdGhpcyBvcHRpb24gdG8gYWRkIGFueSBjb21waWxhdGlvbiBmbGFnIHRvIHRoZSBidWlsZCBzeXN0ZW0uIEZvciBpbnN0YW5jZQorZWNobyAgICBpdCBjYW4gYmUgdXNlZCB0byBhY3RpdmF0ZSBhIHNwZWNpZmljIHByb2Nlc3NvciBvcHRpbWl6YXRpb24gZGVwZW5kaW5nIG9uIHlvdXIKK2VjaG8gICAgcHJvY2Vzc29yLiBGb3IgVmlzdWFsIEMrKyAuTmV0IDIwMDMsIHRvIGFjdGl2YXRlIHBlbnRpdW0gMyBvcHRpbSB5b3Ugd2lsbCB1c2U6CitlY2hvICAgIC0tZXh0cmEtY3h4ZmxhZyAvRzcKK2VjaG8gICAgSWYgeW91IGhhdmUgc2V2ZXJhbCBvcHRpb25zIHVzZSBzZXZlcmFsIC0tZXh0cmEtY3h4ZmxhZyBvcHRpb25zLiBGb3IgaW5zdGFuY2UKK2VjaG8gICAgdG8gYWxzbyBmb3JjZSB1c2Ugb2Ygd2NoYXJfdCBhcyBhbiBpbnRyaW5zaWMgdHlwZToKK2VjaG8gICAgLS1leHRyYS1jeHhmbGFnIC9HNyAtLWV4dHJhLWN4eGZsYWcgL1pjOndjaGFyX3QKK2VjaG8uCitlY2hvICItLXdpdGgtbGliLW1vdGlmIDxtb3RpZj4iCitlY2hvICAgVXNlIHRoaXMgb3B0aW9uIHRvIGN1c3RvbWl6ZSB0aGUgZ2VuZXJhdGVkIGxpYnJhcnkgbmFtZS4gVGhlIG1vdGlmIHdpbGwgYmUgdXNlZAorZWNobyAgIGluIHRoZSBsYXN0IHBsYWNlIGJlZm9yZSB2ZXJzaW9uIGluZm9ybWF0aW9uLCBzZXBhcmF0ZWQgYnkgYW4gdW5kZXJzY29yZSwgZXg6CitlY2hvICAgc3RscG9ydGRfTU9USUYuNS4wLmxpYgorZWNobyAgIHN0bHBvcnRzdGxkX3N0YXRpY19NT1RJRi41LjEubGliCitlY2hvICAgRG8gbm90IGZvcmdldCB0byBkZWZpbmUgX1NUTFBfTElCX05BTUVfTU9USUYgbWFjcm8gaW4gU1RMcG9ydCBjb25maWd1cmF0aW9uIGZpbGUKK2VjaG8gICB0byB0aGUgc2FtZSB2YWx1ZSBpZiB5b3Ugd2FudCB0byBrZWVwIHRoZSBhdXRvIGxpbmsgZmVhdHVyZSBzdXBwb3J0ZWQgYnkgc29tZQorZWNobyAgIGNvbXBpbGVycy4KK2VjaG8uCitlY2hvICItLXdpdGhvdXQtc3RscG9ydCIKK2VjaG8gICBPcHRpb24gc3BlY2lhbGx5IHRhcmdldHRpbmcgYnVpbGQgb2YgdGhlIHVuaXQgdGVzdHMgcHJvamVjdCB3aXRob3V0IFNUTHBvcnQuIFRoaXMKK2VjaG8gICBpcyBhIGdvb2Qgd2F5IHRvIGNoYWxsZW5nZSB0aGUgQysrIFN0YW5kYXJkIGxpYnJhcnkgaW1wbGVtZW50YXRpb24gY29tbWluZyB3aXRoCitlY2hvICAgeW91ciBjb21waWxlciB3aXRoIFNUTHBvcnQuCitlY2hvLgorZWNobyAiLS1jbGVhbiIKK2VjaG8gICAgUmVtb3ZlcyB0aGUgYnVpbGQgY29uZmlndXJhdGlvbiBmaWxlLgorZ290byBza3BfY29tcAorCitSRU0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTSAqCitSRU0gKiBDb21waWxlciBjb25maWd1cmF0aW9uCitSRU0gKgorUkVNICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis6b3B0X2NvbXAKKworaWYgIiUxIiA9PSAibXN2YzYiIGdvdG8gb2NfbXN2YzYKK2lmICIlMSIgPT0gIm1zdmM3MSIgZ290byBvY19tc3Y3MQoraWYgIiUxIiA9PSAibXN2YzciIGdvdG8gb2NfbXN2YzcKK2lmICIlMSIgPT0gIm1zdmM4IiBnb3RvIG9jX21zdmM4CitpZiAiJTEiID09ICJtc3ZjOSIgZ290byBvY19tc3ZjOQoraWYgIiUxIiA9PSAiaWNsIiAgIGdvdG8gb2NfaWNsCisKK2lmICIlMSIgPT0gImV2YzMiIGdvdG8gb2NfZXZjMworaWYgIiUxIiA9PSAiZXZjNCIgZ290byBvY19ldmM0CitpZiAiJTEiID09ICJldmM4IiBnb3RvIG9jX2V2YzgKK2lmICIlMSIgPT0gImV2YzkiIGdvdG8gb2NfZXZjOQorCitpZiAiJTEiID09ICJ3YXRjb20iIGdvdG8gb2Nfd3RtCisKK2VjaG8gVW5rbm93biBjb21waWxlcjogJTEKK2dvdG8gb2NfZW5kCisKKzpvY19tc3ZjNgorOm9jX3d0bQorZWNobyBTZXR0aW5nIGNvbXBpbGVyOiBNaWNyb3NvZnQgVmlzdWFsIEMrKyA2LjAKK2VjaG8gQ09NUElMRVJfTkFNRT12YzYgPj4gYnVpbGRcTWFrZWZpbGVzXG5tYWtlXGNvbmZpZy5tYWsKK3NldCBTRUxFQ1RFRF9DT01QSUxFUl9WRVJTSU9OPTYwCitnb3RvIG9jX21zdmMKKworOm9jX21zdmM3CitlY2hvIFNldHRpbmcgY29tcGlsZXI6IE1pY3Jvc29mdCBWaXN1YWwgQysrIC5ORVQgMjAwMgorZWNobyBDT01QSUxFUl9OQU1FPXZjNzAgPj4gYnVpbGRcTWFrZWZpbGVzXG5tYWtlXGNvbmZpZy5tYWsKK3NldCBTRUxFQ1RFRF9DT01QSUxFUl9WRVJTSU9OPTcwCitnb3RvIG9jX21zdmMKKworOm9jX21zdjcxCitlY2hvIFNldHRpbmcgY29tcGlsZXI6IE1pY3Jvc29mdCBWaXN1YWwgQysrIC5ORVQgMjAwMworZWNobyBDT01QSUxFUl9OQU1FPXZjNzEgPj4gYnVpbGRcTWFrZWZpbGVzXG5tYWtlXGNvbmZpZy5tYWsKK3NldCBTRUxFQ1RFRF9DT01QSUxFUl9WRVJTSU9OPTcxCitnb3RvIG9jX21zdmMKKworOm9jX21zdmM4CitlY2hvIFNldHRpbmcgY29tcGlsZXI6IE1pY3Jvc29mdCBWaXN1YWwgQysrIDIwMDUKK2VjaG8gQ09NUElMRVJfTkFNRT12YzggPj4gYnVpbGRcTWFrZWZpbGVzXG5tYWtlXGNvbmZpZy5tYWsKK3NldCBTRUxFQ1RFRF9DT01QSUxFUl9WRVJTSU9OPTgwCitnb3RvIG9jX21zdmMKKworOm9jX21zdmM5CitlY2hvIFNldHRpbmcgY29tcGlsZXI6IE1pY3Jvc29mdCBWaXN1YWwgQysrIDIwMDgKK2VjaG8gQ09NUElMRVJfTkFNRT12YzkgPj4gYnVpbGRcTWFrZWZpbGVzXG5tYWtlXGNvbmZpZy5tYWsKK3NldCBTRUxFQ1RFRF9DT01QSUxFUl9WRVJTSU9OPTkwCitnb3RvIG9jX21zdmMKKworOm9jX21zdmMKK2VjaG8gVEFSR0VUX09TPXg4NiA+PiBidWlsZFxNYWtlZmlsZXNcbm1ha2VcY29uZmlnLm1haworc2V0IFNFTEVDVEVEX0NPTVBJTEVSPW1zdmMKK2VjaG8gIWluY2x1ZGUgbXN2Yy5tYWsgPiAuXGJ1aWxkXGxpYlxNYWtlZmlsZQorZWNobyAhaW5jbHVkZSBtc3ZjLm1hayA+IC5cYnVpbGRcdGVzdFx1bml0XE1ha2VmaWxlCitlY2hvICFpbmNsdWRlIG1zdmMubWFrID4gLlxidWlsZFx0ZXN0XGVoXE1ha2VmaWxlCitnb3RvIG9jX2VuZAorCis6b2NfaWNsCitlY2hvIFNldHRpbmcgY29tcGlsZXI6IEludGVsIEMrKyBDb21waWxlcgorZWNobyBDT01QSUxFUl9OQU1FPWljbCA+PiBidWlsZFxNYWtlZmlsZXNcbm1ha2VcY29uZmlnLm1haworZWNobyBUQVJHRVRfT1M9eDg2ID4+IGJ1aWxkXE1ha2VmaWxlc1xubWFrZVxjb25maWcubWFrCitzZXQgU0VMRUNURURfQ09NUElMRVI9aWNsCitlY2hvICFpbmNsdWRlIGljbC5tYWsgPiAuXGJ1aWxkXGxpYlxNYWtlZmlsZQorZWNobyAhaW5jbHVkZSBpY2wubWFrID4gLlxidWlsZFx0ZXN0XHVuaXRcTWFrZWZpbGUKK2VjaG8gIWluY2x1ZGUgaWNsLm1hayA+IC5cYnVpbGRcdGVzdFxlaFxNYWtlZmlsZQorZ290byBvY19lbmQKKworOm9jX2V2YzMKK2VjaG8gU2V0dGluZyBjb21waWxlcjogTWljcm9zb2Z0IGVNYmVkZGVkIFZpc3VhbCBDKysgMworZWNobyBDT01QSUxFUl9OQU1FPWV2YzMgPj4gYnVpbGRcTWFrZWZpbGVzXG5tYWtlXGNvbmZpZy5tYWsKK3JlbSBUT0RPOiBicmFuY2ggb24gT1NWRVJTSU9OIGxpa2UgYmVsb3c/CitlY2hvIENFVkVSU0lPTj0zMDAgPj4gYnVpbGRcTWFrZWZpbGVzXG5tYWtlXGNvbmZpZy5tYWsKK3NldCBTRUxFQ1RFRF9DT01QSUxFUl9WRVJTSU9OPTMKK2dvdG8gb2NfZXZjCisKKzpvY19ldmM0CitlY2hvIFNldHRpbmcgY29tcGlsZXI6IE1pY3Jvc29mdCBlTWJlZGRlZCBWaXN1YWwgQysrIC5ORVQKK2VjaG8gQ09NUElMRVJfTkFNRT1ldmM0ID4+IGJ1aWxkXE1ha2VmaWxlc1xubWFrZVxjb25maWcubWFrCitpZiAiJU9TVkVSU0lPTiUiPT0iIiAoCisgICAgZWNobyBPU1ZFUlNJT04gbm90IHNldCwgYXNzdW1pbmcgdGFyZ2V0IGlzIENFIDQuMgorICAgIGVjaG8gQ0VWRVJTSU9OPTQyMCA+PiBidWlsZFxNYWtlZmlsZXNcbm1ha2VcY29uZmlnLm1haworKSBlbHNlIGlmICIlT1NWRVJTSU9OJSI9PSJXQ0U0MDAiICgKKyAgICBlY2hvIENFVkVSU0lPTj00MDAgPj4gYnVpbGRcTWFrZWZpbGVzXG5tYWtlXGNvbmZpZy5tYWsKKykgZWxzZSBpZiAiJU9TVkVSU0lPTiUiPT0iV0NFNDIwIiAoCisgICAgZWNobyBDRVZFUlNJT049NDIwID4+IGJ1aWxkXE1ha2VmaWxlc1xubWFrZVxjb25maWcubWFrCispIGVsc2UgaWYgIiVPU1ZFUlNJT04lIj09IldDRTUwMCIgKAorICAgIGVjaG8gQ0VWRVJTSU9OPTUwMCA+PiBidWlsZFxNYWtlZmlsZXNcbm1ha2VcY29uZmlnLm1haworKSBlbHNlICgKKyAgICBlY2hvIFVua25vd24gdmFsdWUgZm9yIE9TVkVSU0lPTi4KKyAgICBleGl0IC9iIDEKKykKK3NldCBTRUxFQ1RFRF9DT01QSUxFUl9WRVJTSU9OPTQKK2dvdG8gb2NfZXZjCisKKzpvY19ldmM4CitlY2hvIFNldHRpbmcgY29tcGlsZXI6IE1pY3Jvc29mdCBWaXN1YWwgQysrIC5ORVQgMjAwNSBmb3IgV2luZG93cyBDRQorZWNobyBDT01QSUxFUl9OQU1FPWV2YzggPj4gYnVpbGRcTWFrZWZpbGVzXG5tYWtlXGNvbmZpZy5tYWsKK3NldCBTRUxFQ1RFRF9DT01QSUxFUl9WRVJTSU9OPTgwCitpZiAiJU9TVkVSU0lPTiUiPT0iIiAoCisgICAgZWNobyBPU1ZFUlNJT04gbm90IHNldCwgYXNzdW1pbmcgdGFyZ2V0IGlzIENFIDUuMAorICAgIGVjaG8gQ0VWRVJTSU9OPTUwMCA+PiBidWlsZFxNYWtlZmlsZXNcbm1ha2VcY29uZmlnLm1haworKSBlbHNlIGlmICIlT1NWRVJTSU9OJSI9PSJXQ0U0MDAiICgKKyAgICBlY2hvIENFVkVSU0lPTj00MDAgPj4gYnVpbGRcTWFrZWZpbGVzXG5tYWtlXGNvbmZpZy5tYWsKKykgZWxzZSBpZiAiJU9TVkVSU0lPTiUiPT0iV0NFNDIwIiAoCisgICAgZWNobyBDRVZFUlNJT049NDIwID4+IGJ1aWxkXE1ha2VmaWxlc1xubWFrZVxjb25maWcubWFrCispIGVsc2UgaWYgIiVPU1ZFUlNJT04lIj09IldDRTUwMCIgKAorICAgIGVjaG8gQ0VWRVJTSU9OPTUwMCA+PiBidWlsZFxNYWtlZmlsZXNcbm1ha2VcY29uZmlnLm1haworKSBlbHNlICgKKyAgICBlY2hvIFVua25vd24gdmFsdWUgZm9yIE9TVkVSU0lPTi4KKyAgICBleGl0IC9iIDEKKykKK3NldCBQTEFURk9STV9TUEVDSUZJRUQ9MQorc2V0IFNFTEVDVEVEX0NPTVBJTEVSPW1zdmMKK2VjaG8gIWluY2x1ZGUgZXZjLm1hayA+IC5cYnVpbGRcbGliXE1ha2VmaWxlCitlY2hvICFpbmNsdWRlIGV2Yy5tYWsgPiAuXGJ1aWxkXHRlc3RcdW5pdFxNYWtlZmlsZQorZWNobyAhaW5jbHVkZSBldmMubWFrID4gLlxidWlsZFx0ZXN0XGVoXE1ha2VmaWxlCitnb3RvIHByb2MKKworOm9jX2V2YzkKK2VjaG8gU2V0dGluZyBjb21waWxlcjogTWljcm9zb2Z0IFZpc3VhbCBDKysgLk5FVCAyMDA4IGZvciBXaW5kb3dzIENFCitlY2hvIENPTVBJTEVSX05BTUU9ZXZjOSA+PiBidWlsZFxNYWtlZmlsZXNcbm1ha2VcY29uZmlnLm1haworc2V0IFNFTEVDVEVEX0NPTVBJTEVSX1ZFUlNJT049OTAKK2lmICIlT1NWRVJTSU9OJSI9PSIiICgKKyAgICBlY2hvIE9TVkVSU0lPTiBub3Qgc2V0LCBhc3N1bWluZyB0YXJnZXQgaXMgQ0UgNS4wCisgICAgZWNobyBDRVZFUlNJT049NTAwID4+IGJ1aWxkXE1ha2VmaWxlc1xubWFrZVxjb25maWcubWFrCispIGVsc2UgaWYgIiVPU1ZFUlNJT04lIj09IldDRTQwMCIgKAorICAgIGVjaG8gQ0VWRVJTSU9OPTQwMCA+PiBidWlsZFxNYWtlZmlsZXNcbm1ha2VcY29uZmlnLm1haworKSBlbHNlIGlmICIlT1NWRVJTSU9OJSI9PSJXQ0U0MjAiICgKKyAgICBlY2hvIENFVkVSU0lPTj00MjAgPj4gYnVpbGRcTWFrZWZpbGVzXG5tYWtlXGNvbmZpZy5tYWsKKykgZWxzZSBpZiAiJU9TVkVSU0lPTiUiPT0iV0NFNTAwIiAoCisgICAgZWNobyBDRVZFUlNJT049NTAwID4+IGJ1aWxkXE1ha2VmaWxlc1xubWFrZVxjb25maWcubWFrCispIGVsc2UgKAorICAgIGVjaG8gVW5rbm93biB2YWx1ZSBmb3IgT1NWRVJTSU9OLgorICAgIGV4aXQgL2IgMQorKQorc2V0IFBMQVRGT1JNX1NQRUNJRklFRD0xCitzZXQgU0VMRUNURURfQ09NUElMRVI9bXN2YworZWNobyAhaW5jbHVkZSBldmMubWFrID4gLlxidWlsZFxsaWJcTWFrZWZpbGUKK2VjaG8gIWluY2x1ZGUgZXZjLm1hayA+IC5cYnVpbGRcdGVzdFx1bml0XE1ha2VmaWxlCitlY2hvICFpbmNsdWRlIGV2Yy5tYWsgPiAuXGJ1aWxkXHRlc3RcZWhcTWFrZWZpbGUKK2dvdG8gcHJvYworCis6b2NfZXZjCitzZXQgUExBVEZPUk1fU1BFQ0lGSUVEPTEKK3NldCBTRUxFQ1RFRF9DT01QSUxFUj1ldmMKK2VjaG8gIWluY2x1ZGUgZXZjLm1hayA+IC5cYnVpbGRcbGliXE1ha2VmaWxlCitlY2hvICFpbmNsdWRlIGV2Yy5tYWsgPiAuXGJ1aWxkXHRlc3RcdW5pdFxNYWtlZmlsZQorZWNobyAhaW5jbHVkZSBldmMubWFrID4gLlxidWlsZFx0ZXN0XGVoXE1ha2VmaWxlCitnb3RvIHByb2MKKworOm9jX2VuZAorZ290byBjb250X2xwCisKKworUkVNICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU0gKgorUkVNICogVGFyZ2V0IHByb2Nlc3NvciBjb25maWd1cmF0aW9uIChhdXRvbWF0aWMpCitSRU0gKgorUkVNICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis6cHJvYworCitpZiAiJVRBUkdFVENQVSUiID09ICJBUk0iIGdvdG8gcHJfYXJtCitpZiAiJVRBUkdFVENQVSUiID09ICJBUk1WNCIgZ290byBwcl9hcm0KK2lmICIlVEFSR0VUQ1BVJSIgPT0gIkFSTVY0SSIgZ290byBwcl9hcm0KK2lmICIlVEFSR0VUQ1BVJSIgPT0gIkFSTVY0VCIgZ290byBwcl9hcm0KKworaWYgIiVUQVJHRVRDUFUlIiA9PSAiWDg2IiBnb3RvIHByX3g4NgorUkVNIFR5cGUgZnJvbSBldmMzIGFuZC9vciBQb2NrZXRQQyAyMDAyIFNESyByZXBvcnRlZCBoZXJlCitSRU0gdG8gY29ycmVjdGx5IGNoZWNrIHRoZSBwbGF0Zm9ybToKK2lmICIlVEFSR0VUQ1BVJSIgPT0gIlg4NkVNbnNldCBDRkc9bm9uZSIgZ290byBwcl9lbXVsCitpZiAiJVRBUkdFVENQVSUiID09ICJ4ODYiIGdvdG8gcHJfeDg2CitpZiAiJVRBUkdFVENQVSUiID09ICJlbXVsYXRvciIgZ290byBwcl9lbXVsCisKK2lmICIlVEFSR0VUQ1BVJSIgPT0gIlI0MTAwIiBnb3RvIHByX21pcHMKK2lmICIlVEFSR0VUQ1BVJSIgPT0gIlI0MTExIiBnb3RvIHByX21pcHMKK2lmICIlVEFSR0VUQ1BVJSIgPT0gIlI0MzAwIiBnb3RvIHByX21pcHMKK2lmICIlVEFSR0VUQ1BVJSIgPT0gIk1JUFMxNiIgZ290byBwcl9taXBzCitpZiAiJVRBUkdFVENQVSUiID09ICJNSVBTSUkiIGdvdG8gcHJfbWlwcworaWYgIiVUQVJHRVRDUFUlIiA9PSAiTUlQU0lJX0ZQIiBnb3RvIHByX21pcHMKK2lmICIlVEFSR0VUQ1BVJSIgPT0gIk1JUFNJViIgZ290byBwcl9taXBzCitpZiAiJVRBUkdFVENQVSUiID09ICJNSVBTSVZfRlAiIGdvdG8gcHJfbWlwcworCitpZiAiJVRBUkdFVENQVSUiID09ICJTSDMiIGdvdG8gcHJfc2gzCitpZiAiJVRBUkdFVENQVSUiID09ICJTSDQiIGdvdG8gcHJfc2g0CisKKzpwcl9lcnIKK2VjaG8gVW5rbm93biB0YXJnZXQgQ1BVOiAlVEFSR0VUQ1BVJQorZ290byBwcl9lbmQKKworOnByX2FybQorZWNobyBUYXJnZXQgcHJvY2Vzc29yOiBBUk0KK2VjaG8gVEFSR0VUX1BST0M9YXJtID4+IGJ1aWxkXE1ha2VmaWxlc1xubWFrZVxjb25maWcubWFrCitlY2hvIFRBUkdFVF9QUk9DX1NVQlRZUEU9JVRBUkdFVENQVSUgPj4gYnVpbGRcTWFrZWZpbGVzXG5tYWtlXGNvbmZpZy5tYWsKK2dvdG8gcHJfZW5kCisKKzpwcl94ODYKK2VjaG8gVGFyZ2V0IHByb2Nlc3NvcjogeDg2CitlY2hvIFRBUkdFVF9QUk9DPXg4NiA+PiBidWlsZFxNYWtlZmlsZXNcbm1ha2VcY29uZmlnLm1haworZ290byBwcl9lbmQKKworOnByX2VtdWwKK2VjaG8gVGFyZ2V0IHByb2Nlc3NvcjogRW11bGF0b3IKK2VjaG8gVEFSR0VUX1BST0M9eDg2ID4+IGJ1aWxkXE1ha2VmaWxlc1xubWFrZVxjb25maWcubWFrCitlY2hvIFRBUkdFVF9QUk9DX1NVQlRZUEU9ZW11bGF0b3IgPj4gYnVpbGRcTWFrZWZpbGVzXG5tYWtlXGNvbmZpZy5tYWsKK2dvdG8gcHJfZW5kCisKKzpwcl9taXBzCitlY2hvIFRhcmdldCBwcm9jZXNzb3I6IE1JUFMKK2VjaG8gVEFSR0VUX1BST0M9bWlwcyA+PiBidWlsZFxNYWtlZmlsZXNcbm1ha2VcY29uZmlnLm1haworZWNobyBUQVJHRVRfUFJPQ19TVUJUWVBFPSVUQVJHRVRDUFUlID4+IGJ1aWxkXE1ha2VmaWxlc1xubWFrZVxjb25maWcubWFrCisKK2dvdG8gcHJfZW5kCisKKzpwcl9zaDMKK2VjaG8gVGFyZ2V0IHByb2Nlc3NvcjogJVRBUkdFVENQVSUKK2VjaG8gVEFSR0VUX1BST0M9c2gzID4+IGJ1aWxkXE1ha2VmaWxlc1xubWFrZVxjb25maWcubWFrCitnb3RvIHByX2VuZAorCis6cHJfc2g0CitlY2hvIFRhcmdldCBwcm9jZXNzb3I6ICVUQVJHRVRDUFUlCitlY2hvIFRBUkdFVF9QUk9DPXNoNCA+PiBidWlsZFxNYWtlZmlsZXNcbm1ha2VcY29uZmlnLm1haworZ290byBwcl9lbmQKKworOnByX2VuZAorZ290byBvY19lbmQKKworCitSRU0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTSAqCitSRU0gKiBQbGF0Zm9ybSBjb25maWd1cmF0aW9uCitSRU0gKgorUkVNICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis6b3B0X3BsYXQKKworaWYgIiUyIiA9PSAid2luOTUiIGdvdG8gb3Bfd2luOTUKK2lmICIlMiIgPT0gIndpbjk4IiBnb3RvIG9wX3dpbjk4CitpZiAiJTIiID09ICJ3aW54cCIgZ290byBvcF93aW54cAorCitlY2hvIFVua25vd24gcGxhdGZvcm06ICUyCitnb3RvIG9wX2VuZAorCis6b3Bfd2luOTUKK2VjaG8gU2V0dGluZyBwbGF0Zm9ybTogV2luZG93cyA5NQorZWNobyBXSU5WRVI9MHgwNDAwID4+IGJ1aWxkXE1ha2VmaWxlc1xubWFrZVxjb25maWcubWFrCitzZXQgUExBVEZPUk1fU1BFQ0lGSUVEPTEKK2dvdG8gb3BfZW5kCisKKzpvcF93aW45OAorZWNobyBTZXR0aW5nIHBsYXRmb3JtOiBXaW5kb3dzIDk4CitlY2hvIFdJTlZFUj0weDA0MTAgPj4gYnVpbGRcTWFrZWZpbGVzXG5tYWtlXGNvbmZpZy5tYWsKK3NldCBQTEFURk9STV9TUEVDSUZJRUQ9MQorZ290byBvcF9lbmQKKworOm9wX3dpbnhwCitlY2hvIFNldHRpbmcgcGxhdGZvcm06IFdpbmRvd3MgWFAKK2VjaG8gV0lOVkVSPTB4MDUwMSA+PiBidWlsZFxNYWtlZmlsZXNcbm1ha2VcY29uZmlnLm1haworc2V0IFBMQVRGT1JNX1NQRUNJRklFRD0xCitnb3RvIG9wX2VuZAorCis6b3BfZW5kCitzaGlmdAorCitnb3RvIGNvbnRfbHAKKworCitSRU0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTSAqCitSRU0gKiBDcm9zcyBDb21waWxpbmcgb3B0aW9uCitSRU0gKgorUkVNICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKzpvcHRfeAorZWNobyBTZXR0aW5nIHVwIGZvciBjcm9zcyBjb21waWxpbmcuCitlY2hvIENST1NTX0NPTVBJTElORz0xID4+IGJ1aWxkXE1ha2VmaWxlc1xubWFrZVxjb25maWcubWFrCitnb3RvIGNvbnRfbHAKKworCitSRU0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTSAqCitSRU0gKiBDIHJ1bnRpbWUgbGlicmFyeSBzZWxlY3Rpb24KK1JFTSAqCitSRU0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworOm9wdF9zcnRsCitpZiAiJVNFTEVDVEVEX0NPTVBJTEVSJSIgPT0gIm1zdmMiIGdvdG8gb3Jfc29rCitnb3RvIG9yX2VycgorCis6b3B0X2RydGwKK2lmICIlU0VMRUNURURfQ09NUElMRVIlIiA9PSAibXN2YyIgZ290byBvcl9kb2sKK2dvdG8gb3JfZXJyCisKKzpvcl9lcnIKK2VjaG8gRXJyb3I6IFNldHRpbmcgQyBydW50aW1lIGxpYnJhcnkgZm9yIGNvbXBpbGVyIG90aGVyIHRoYW4gbWljcm9zb2Z0IG9uZXMhCitnb3RvIG9yX2VuZAorCis6b3Jfc29rCitlY2hvIFNlbGVjdGluZyBzdGF0aWMgQyBydW50aW1lIGxpYnJhcnkgZm9yIFNUTHBvcnQKK2VjaG8gV0lUSF9TVEFUSUNfUlRMPTEgPj4gYnVpbGRcTWFrZWZpbGVzXG5tYWtlXGNvbmZpZy5tYWsKK2dvdG8gb3JfZW5kCisKKzpvcl9kb2sKK2VjaG8gU2VsZWN0aW5nIGR5bmFtaWMgQyBydW50aW1lIGxpYnJhcnkgZm9yIFNUTHBvcnQKK2VjaG8gV0lUSF9EWU5BTUlDX1JUTD0xID4+IGJ1aWxkXE1ha2VmaWxlc1xubWFrZVxjb25maWcubWFrCitnb3RvIG9yX2VuZAorCis6b3JfZW5kCitnb3RvIGNvbnRfbHAKKworUkVNICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU0gKgorUkVNICogYm9vc3Qgc3VwcG9ydAorUkVNICoKK1JFTSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOm9wdF9ic3QKK1JFTSBpZiAoRXhpc3RzKCIlMiIpKSBnb3RvIG9iX29rCitSRU0gaWYgISgiJTIiID09ICIiKSBnb3RvIG9iX29rCitnb3RvIG9iX29rCisKK2VjaG8gRXJyb3I6IEludmFsaWQgYm9vc3QgaW50YWxsYXRpb24gZm9sZGVyICgiJTIiKS4KK2dvdG8gb2JfZW5kCisKKzpvYl9vaworZWNobyBBY3RpdmF0aW5nIGJvb3N0IHN1cHBvcnQgdXNpbmcgIiUyIiBwYXRoCitlY2hvIFNUTFBfQlVJTERfQk9PU1RfUEFUSD0iJTIiID4+IGJ1aWxkXE1ha2VmaWxlc1xubWFrZVxjb25maWcubWFrCisKKzpvYl9lbmQKK3NoaWZ0CisKK2dvdG8gY29udF9scAorCitSRU0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTSAqCitSRU0gKiBNdWx0aXRocmVhZGluZyBzdXBwb3J0CitSRU0gKgorUkVNICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis6b3B0X3N0CitlY2hvIFJlbW92aW5nIHRocmVhZCBzYWZldHkgc3VwcG9ydAorZWNobyBXSVRIT1VUX1RIUkVBRD0xID4+IGJ1aWxkXE1ha2VmaWxlc1xubWFrZVxjb25maWcubWFrCitnb3RvIGNvbnRfbHAKKworUkVNICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU0gKgorUkVNICogcnR0aSBzdXBwb3J0CitSRU0gKgorUkVNICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis6b3B0X3J0dGkKK2VjaG8gUmVtb3ZpbmcgcnR0aSBzdXBwb3J0CitlY2hvIFdJVEhPVVRfUlRUST0xID4+IGJ1aWxkXE1ha2VmaWxlc1xubWFrZVxjb25maWcubWFrCitnb3RvIGNvbnRfbHAKKworUkVNICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU0gKgorUkVNICogRXh0cmEgY29tcGlsYXRpb24gZmxhZ3MKK1JFTSAqCitSRU0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzpvcHRfeHRyYQorZWNobyBBZGRpbmcgJyUyJyBjb21waWxhdGlvbiBvcHRpb24KK2lmICIlT05FX09QVElPTl9BRERFRCUiID09ICIxIiBnb3RvIG94X24KKworZWNobyBERUZTID0gJTIgPj4gYnVpbGRcTWFrZWZpbGVzXG5tYWtlXGNvbmZpZy5tYWsKK3NldCBPTkVfT1BUSU9OX0FEREVEPTEKK2dvdG8gb3hfZW5kCisKKzpveF9uCitlY2hvIERFRlMgPSAkKERFRlMpICUyID4+IGJ1aWxkXE1ha2VmaWxlc1xubWFrZVxjb25maWcubWFrCisKKzpveF9lbmQKK3NoaWZ0Citnb3RvIGNvbnRfbHAKKworUkVNICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU0gKgorUkVNICogTGlicmFyeSBuYW1lIGNvbmZpZ3VyYXRpb24KK1JFTSAqCitSRU0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzpvcHRfbW90ZgorZWNobyBVc2luZyAnJTInIGluIGdlbmVyYXRlZCBsaWJyYXJ5IG5hbWVzCisKK2VjaG8gTElCX01PVElGID0gJTIgPj4gYnVpbGRcTWFrZWZpbGVzXG5tYWtlXGNvbmZpZy5tYWsKKworc2hpZnQKK2dvdG8gY29udF9scAorCitSRU0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTSAqCitSRU0gKiBCdWlsZCB3aXRob3V0IFNUTHBvcnQKK1JFTSAqCitSRU0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzpub19zcG9ydAorZWNobyBDb25maWd1cmVkIHRvIGJ1aWxkIHdpdGhvdXQgU1RMcG9ydAorCitlY2hvIFdJVEhPVVRfU1RMUE9SVD0xID4+IGJ1aWxkXE1ha2VmaWxlc1xubWFrZVxjb25maWcubWFrCisKK3NoaWZ0Citnb3RvIGNvbnRfbHAKKworUkVNICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU0gKgorUkVNICogQ2xlYW4KK1JFTSAqCitSRU0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzpvcHRfY2xuCitkZWwgYnVpbGRcTWFrZWZpbGVzXG5tYWtlXGNvbmZpZy5tYWsKK2VjaG8gU1RMcG9ydCBjb25maWd1cmF0aW9uIGZpbGUgcmVtb3ZlZC4KK2dvdG8gc2twX2NvbXAKKworUkVNICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU0gKgorUkVNICogRW5kIGxvb3AKK1JFTSAqCitSRU0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworOmVuZF9sb29wCisKK2lmICIlUExBVEZPUk1fU1BFQ0lGSUVEJSIgPT0gIjEiIGdvdG8gY29tcAorZWNobyBTZXR0aW5nIHBsYXRmb3JtOiBXaW5kb3dzIFhQCitlY2hvLgorZWNobyBXSU5WRVI9MHgwNTAxID4+IGJ1aWxkXE1ha2VmaWxlc1xubWFrZVxjb25maWcubWFrCisKKzpjb21wCitlY2hvIERvbmUgY29uZmlndXJpbmcgU1RMcG9ydC4KK2VjaG8uCitlY2hvIEdvIHRvIGJ1aWxkL2xpYiBmb2xkZXIgYW5kIHR5cGUgIm5tYWtlIGNsZWFuIGluc3RhbGwiIHRvIGJ1aWxkICBhbmQKK2VjaG8gaW5zdGFsbCBTVExwb3J0IHRvIHRoZSAibGliIiBhbmQgImJpbiIgZm9sZGVycy4KK2VjaG8gR28gdG8gYnVpbGQvdGVzdC91bml0IGZvbGRlciBhbmQgdHlwZSBubWFrZSBjbGVhbiBpbnN0YWxsIHRvCitlY2hvIGJ1aWxkIHVuaXQgdGVzdHMgYW5kIGluc3RhbGwgdGhlbSBpbiBiaW4gZm9sZGVyLiAKK2VjaG8uCisKKzpza3BfY29tcAorc2V0IFNFTEVDVEVEX0NPTVBJTEVSPQorc2V0IFNFTEVDVEVEX0NPTVBJTEVSX1ZFUlNJT049CitzZXQgT05FX09QVElPTl9BRERFRD0KK3NldCBQTEFURk9STV9TUEVDSUZJRUQ9CmRpZmYgLS1naXQgYS9jc2V0am1wIGIvY3NldGptcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY4ZDBiMy4uMDAwMDAwMAotLS0gYS9jc2V0am1wCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogQm9yaXMgRm9taXRjaGV2Ci0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICovCi0KLSNpZm5kZWYgX1NUTFBfQ1NFVEpNUAotCi0jaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKLSMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MTExCi0jICBkZWZpbmUgX1NUTFBfQ1NFVEpNUAotIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KLSNlbmRpZgotCi0jaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgIT0gMHgxMTEpCi0jICBpbmNsdWRlIF9TVExQX05BVElWRV9DUFBfQ19IRUFERVIoY3NldGptcCkKLSNlbHNlCi0jICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1NFVEpNUAotIyAgICBpbmNsdWRlIDxzdGwvX2NzZXRqbXAuaD4KLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MTExICkKLSMgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+Ci0jICB1bmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECi0jZW5kaWYKLQotI2VuZGlmIC8qIF9TVExQX0NTRVRKTVAgKi8KLQotLy8gTG9jYWwgVmFyaWFibGVzOgotLy8gbW9kZTpDKysKLS8vIEVuZDoKZGlmZiAtLWdpdCBhL2NzaWduYWwgYi9jc2lnbmFsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTQyNjQ4Li4wMDAwMDAwCi0tLSBhL2NzaWduYWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLQotI2lmbmRlZiBfU1RMUF9DU0lHTkFMCi0KLSNpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAotIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHgxMTIKLSMgIGRlZmluZSBfU1RMUF9DU0lHTkFMCi0jICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgotI2VuZGlmCi0KLSNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAhPSAweDExMikKLSMgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUihjc2lnbmFsKQotI2Vsc2UKLSMgIGlmbmRlZiBfU1RMUF9JTlRFUk5BTF9DU0lHTkFMCi0jICAgIGluY2x1ZGUgPHN0bC9fY3NpZ25hbC5oPgotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgxMTIgKQotIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KLSMgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKLSNlbmRpZgotCi0jZW5kaWYgLyogX1NUTFBfQ1NJR05BTCAqLwotCi0vLyBMb2NhbCBWYXJpYWJsZXM6Ci0vLyBtb2RlOkMrKwotLy8gRW5kOgpkaWZmIC0tZ2l0IGEvY3N0ZGFyZyBiL2NzdGRhcmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMTQxZWMuLjAwMDAwMDAKLS0tIGEvY3N0ZGFyZworKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICovCi0KLSNpZm5kZWYgX1NUTFBfQ1NUREFSRwotCi0jaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKLSMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MTEzCi0jICBkZWZpbmUgX1NUTFBfQ1NUREFSRwotIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KLSNlbmRpZgotCi0jaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgIT0gMHgxMTMpCi0jICBpbmNsdWRlIF9TVExQX05BVElWRV9DUFBfQ19IRUFERVIoY3N0ZGFyZykKLSNlbHNlCi0jICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1NUREFSRwotIyAgICBpbmNsdWRlIDxzdGwvX2NzdGRhcmcuaD4KLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MTEzICkKLSMgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+Ci0jICB1bmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECi0jZW5kaWYKLQotI2VuZGlmIC8qIF9TVExQX0NTVERBUkcgKi8KLQotLy8gTG9jYWwgVmFyaWFibGVzOgotLy8gbW9kZTpDKysKLS8vIEVuZDoKZGlmZiAtLWdpdCBhL2NzdGRkZWYgYi9jc3RkZGVmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGQxNTI3Li4wMDAwMDAwCi0tLSBhL2NzdGRkZWYKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLQotI2lmbmRlZiBfU1RMUF9DU1REREVGCi0KLSNpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAotIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHgxMTQKLSMgIGRlZmluZSBfU1RMUF9DU1REREVGCi0jICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgotI2VuZGlmCi0KLSNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAhPSAweDExNCkKLSMgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUihjc3RkZGVmKQotI2Vsc2UKLSMgIGlmbmRlZiBfU1RMUF9JTlRFUk5BTF9DU1REREVGCi0jICAgIGluY2x1ZGUgPHN0bC9fY3N0ZGRlZi5oPgotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgxMTQgKQotIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KLSMgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKLSNlbmRpZgotCi0jZW5kaWYgLyogX1NUTFBfQ1NURERFRiAqLwotCi0vLyBMb2NhbCBWYXJpYWJsZXM6Ci0vLyBtb2RlOkMrKwotLy8gRW5kOgpkaWZmIC0tZ2l0IGEvY3N0ZGlvIGIvY3N0ZGlvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2VmZjg2Li4wMDAwMDAwCi0tLSBhL2NzdGRpbworKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0jaWZuZGVmIF9TVExQX0NTVERJTwotI2RlZmluZSBfU1RMUF9DU1RESU8KLQotI2lmbmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECi0jICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDE1Ci0jICBkZWZpbmUgX1NUTFBfQ1NURElPCi0jICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgotI2VuZGlmCi0KLSNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAhPSAweDE1KQotIyAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSEVBREVSKGNzdGRpbykKLSNlbHNlCi0jICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1NURElPCi0jICAgIGluY2x1ZGUgPHN0bC9fY3N0ZGlvLmg+Ci0jICBlbmRpZgotI2VuZGlmCi0KLSNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDE1KQotIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KLSMgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKLSNlbmRpZgotCi0jZW5kaWYKLQotLy8gTG9jYWwgVmFyaWFibGVzOgotLy8gbW9kZTpDKysKLS8vIEVuZDoKZGlmZiAtLWdpdCBhL2NzdGRsaWIgYi9jc3RkbGliCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzE4ZmJiLi4wMDAwMDAwCi0tLSBhL2NzdGRsaWIKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLQotI2lmbmRlZiBfU1RMUF9DU1RETElCCi0KLSNpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAotIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHgxMTYKLSMgIGRlZmluZSBfU1RMUF9DU1RETElCCi0jICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgotI2VuZGlmCi0KLSNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAhPSAweDExNikKLSMgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUihjc3RkbGliKQotI2Vsc2UKLSMgIGlmbmRlZiBfU1RMUF9JTlRFUk5BTF9DU1RETElCCi0jICAgIGluY2x1ZGUgPHN0bC9fY3N0ZGxpYi5oPgotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgxMTYpCi0jICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgotIyAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAotI2VuZGlmCi0KLSNlbmRpZiAvKiBfU1RMUF9DU1RETElCICovCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6CmRpZmYgLS1naXQgYS9jc3RyaW5nIGIvY3N0cmluZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRkM2JkYi4uMDAwMDAwMAotLS0gYS9jc3RyaW5nCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogQm9yaXMgRm9taXRjaGV2Ci0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICovCi0KLSNpZm5kZWYgX1NUTFBfQ1NUUklORwotCi0jaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKLSMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MTE3Ci0jICBkZWZpbmUgX1NUTFBfQ1NUUklORwotIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KLSNlbmRpZgotCi0jaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgIT0gMHgxMTcpCi0jICBpbmNsdWRlIF9TVExQX05BVElWRV9DUFBfQ19IRUFERVIoY3N0cmluZykKLSNlbHNlCi0jICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1NUUklORwotIyAgICBpbmNsdWRlIDxzdGwvX2NzdHJpbmcuaD4KLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MTE3KQotIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KLSMgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKLSNlbmRpZgotCi0jZW5kaWYgLyogX1NUTFBfQ1NUUklORyAqLwotCi0vLyBMb2NhbCBWYXJpYWJsZXM6Ci0vLyBtb2RlOkMrKwotLy8gRW5kOgpkaWZmIC0tZ2l0IGEvY3RpbWUgYi9jdGltZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY5YzM3Yi4uMDAwMDAwMAotLS0gYS9jdGltZQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICovCi0KLSNpZm5kZWYgX1NUTFBfQ1RJTUUKLQotI2lmbmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECi0jICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDExOAotIyAgZGVmaW5lIF9TVExQX0NUSU1FCi0jICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgotI2VuZGlmCi0KLSNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAhPSAweDExOCkKLSMgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUihjdGltZSkKLSNlbHNlCi0jICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1RJTUUKLSMgICAgaW5jbHVkZSA8c3RsL19jdGltZS5oPgotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgxMTgpCi0jICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgotIyAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAotI2VuZGlmCi0KLSNlbmRpZiAvKiBfU1RMUF9DVElNRSAqLwotCi0vLyBMb2NhbCBWYXJpYWJsZXM6Ci0vLyBtb2RlOkMrKwotLy8gRW5kOgpkaWZmIC0tZ2l0IGEvY3R5cGUuaCBiL2N0eXBlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzYTgwMzIuLjAwMDAwMDAKLS0tIGEvY3R5cGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLQotI2lmbmRlZiBfU1RMUF9DVFlQRV9ICi0KLS8qIFdvcmthcm91bmQgZm9yIGEgIm1pc2JlaGF2aW91ciIgd2hlbiBjb21waWxpbmcgcmVzb3VyY2Ugc2NyaXB0cyB1c2luZwotICogZU1iZWRkZWQgVmlzdWFsIEMrKy4gVGhlIHN0YW5kYXJkIC5yYyBmaWxlIGluY2x1ZGVzIHdpbmRvd3MgaGVhZGVyIGZpbGVzLAotICogd2hpY2ggaW4gdHVybiBpbmNsdWRlIGN0eXBlLmgsIHdoaWNoIHJlc3VsdHMgaW4gd2FybmluZ3MgYW5kIGVycm9ycwotICovCi0jaWYgIWRlZmluZWQoUkNfSU5WT0tFRCkKLQotIyAgaWYgIWRlZmluZWQgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQpCi0jICAgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MjE5Ci0jICAgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+Ci0jICBlbGlmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MjE5KQotIyAgICBkZWZpbmUgX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lECi0jICAgIGRlZmluZSBfU1RMUF9DVFlQRV9ICi0jICBlbmRpZgotCi0jICBpZiBkZWZpbmVkKF9TVExQX1dDRV9FVkMzKQotc3RydWN0IF9leGNlcHRpb247Ci0jICBlbmRpZgotCi0jICBpbmNsdWRlIF9TVExQX05BVElWRV9DX0hFQURFUihjdHlwZS5oKQotCi0vKiBvbiBldmM0IGluY2x1ZGluZyBjdHlwZS5oIGFsc28gZGVmaW5lcyBzZXRqbXAgbWFjcm8gKi8KLSMgIGlmIGRlZmluZWQgKF9TVExQX1dDRSkKLSMgICAgZGVmaW5lIF9TVExQX05BVElWRV9TRVRKTVBfSF9JTkNMVURFRAotIyAgZW5kaWYKLQotIyAgaWZuZGVmIF9TVExQX0NUWVBFX0hfU0VFTgotIyAgICBkZWZpbmUgX1NUTFBfQ1RZUEVfSF9TRUVOCi0KLS8qIFVuZGVmIGNvbnZlbmllbmNlIGludGVyZmFjZXMgKi8KLSMgICAgdW5kZWYgaXNzcGFjZQotIyAgICB1bmRlZiBpc3ByaW50Ci0jICAgIHVuZGVmIGlzY250cmwKLSMgICAgdW5kZWYgaXN1cHBlcgotIyAgICB1bmRlZiBpc2xvd2VyCi0jICAgIHVuZGVmIGlzYWxwaGEKLSMgICAgdW5kZWYgaXNkaWdpdAotIyAgICB1bmRlZiBpc3B1bmN0Ci0jICAgIHVuZGVmIGlzeGRpZ2l0Ci0jICAgIHVuZGVmIGlzYWxudW0KLSMgICAgdW5kZWYgaXNncmFwaAotIyAgICB1bmRlZiB0b3VwcGVyCi0jICAgIHVuZGVmIHRvbG93ZXIKLQotIyAgICBpZiBkZWZpbmVkIChVTkRFUl9DRSkKLQotIyAgICAgIGlmIChfV0lOMzJfV0NFIDwgMzAwKSAgICAgLyogT25seSB3aWRlIGNoYXJzIGZvciBvbGRlciB2ZXJzaW9ucyAqLwotIyAgICAgICAgZGVmaW5lIF9pc2N0eXBlIGlzd2N0eXBlCi0jICAgICAgZW5kaWYKLQotX19pbmxpbmUgaW50IChpc2FscGhhKShpbnQgYykgeyByZXR1cm4gX2lzY3R5cGUoYywgX0FMUEhBKTsgfQotX19pbmxpbmUgaW50IChpc3VwcGVyKShpbnQgYykgeyByZXR1cm4gX2lzY3R5cGUoYywgX1VQUEVSKTsgfQotX19pbmxpbmUgaW50IChpc2xvd2VyKShpbnQgYykgeyByZXR1cm4gX2lzY3R5cGUoYywgX0xPV0VSKTsgfQotX19pbmxpbmUgaW50IChpc2RpZ2l0KShpbnQgYykgeyByZXR1cm4gX2lzY3R5cGUoYywgX0RJR0lUKTsgfQotX19pbmxpbmUgaW50IChpc3hkaWdpdCkoaW50IGMpIHsgcmV0dXJuIF9pc2N0eXBlKGMsIF9IRVgpOyB9Ci1fX2lubGluZSBpbnQgKGlzc3BhY2UpKGludCBjKSB7IHJldHVybiBfaXNjdHlwZShjLCBfU1BBQ0UpOyB9Ci1fX2lubGluZSBpbnQgKGlzcHVuY3QpKGludCBjKSB7IHJldHVybiBfaXNjdHlwZShjLCBfUFVOQ1QpOyB9Ci1fX2lubGluZSBpbnQgKGlzYWxudW0pKGludCBjKSB7IHJldHVybiBfaXNjdHlwZShjLCBfQUxQSEF8X0RJR0lUKTsgfQotX19pbmxpbmUgaW50IChpc3ByaW50KShpbnQgYykgeyByZXR1cm4gX2lzY3R5cGUoYywgX0JMQU5LfF9QVU5DVHxfQUxQSEF8X0RJR0lUKTsgfQotX19pbmxpbmUgaW50IChpc2dyYXBoKShpbnQgYykgeyByZXR1cm4gX2lzY3R5cGUoYywgX1BVTkNUfF9BTFBIQXxfRElHSVQpOyB9Ci1fX2lubGluZSBpbnQgKGlzY250cmwpKGludCBjKSB7IHJldHVybiBfaXNjdHlwZShjLCBfQ09OVFJPTCk7IH0KLV9faW5saW5lIGludCAoaXNhc2NpaSkoaW50IGMpIHsgcmV0dXJuICgodW5zaWduZWQpKGMpIDwgMHg4MCk7IH0KLQotIyAgICAgIHVuZGVmIF9pc2N0eXBlCi0KLV9faW5saW5lIGludCAoaXN3YWxwaGEpKGludCBjKSB7IHJldHVybiBpc3djdHlwZShjLCBfQUxQSEEpOyB9Ci1fX2lubGluZSBpbnQgKGlzd3VwcGVyKShpbnQgYykgeyByZXR1cm4gaXN3Y3R5cGUoYywgX1VQUEVSKTsgfQotX19pbmxpbmUgaW50IChpc3dsb3dlcikoaW50IGMpIHsgcmV0dXJuIGlzd2N0eXBlKGMsIF9MT1dFUik7IH0KLV9faW5saW5lIGludCAoaXN3ZGlnaXQpKGludCBjKSB7IHJldHVybiBpc3djdHlwZShjLCBfRElHSVQpOyB9Ci1fX2lubGluZSBpbnQgKGlzd3hkaWdpdCkoaW50IGMpIHsgcmV0dXJuIGlzd2N0eXBlKGMsIF9IRVgpOyB9Ci1fX2lubGluZSBpbnQgKGlzd3NwYWNlKShpbnQgYykgeyByZXR1cm4gaXN3Y3R5cGUoYywgX1NQQUNFKTsgfQotX19pbmxpbmUgaW50IChpc3dwdW5jdCkoaW50IGMpIHsgcmV0dXJuIGlzd2N0eXBlKGMsIF9QVU5DVCk7IH0KLV9faW5saW5lIGludCAoaXN3YWxudW0pKGludCBjKSB7IHJldHVybiBpc3djdHlwZShjLCBfQUxQSEF8X0RJR0lUKTsgfQotX19pbmxpbmUgaW50IChpc3dwcmludCkoaW50IGMpIHsgcmV0dXJuIGlzd2N0eXBlKGMsIF9CTEFOS3xfUFVOQ1R8X0FMUEhBfF9ESUdJVCk7IH0KLV9faW5saW5lIGludCAoaXN3Z3JhcGgpKGludCBjKSB7IHJldHVybiBpc3djdHlwZShjLCBfUFVOQ1R8X0FMUEhBfF9ESUdJVCk7IH0KLV9faW5saW5lIGludCAoaXN3Y250cmwpKGludCBjKSB7IHJldHVybiBpc3djdHlwZShjLCBfQ09OVFJPTCk7IH0KLV9faW5saW5lIGludCAoaXN3YXNjaWkpKGludCBjKSB7IHJldHVybiAoKHVuc2lnbmVkKShjKSA8IDB4ODApOyB9Ci0KLSMgICAgZW5kaWYgLyogVU5ERVJfQ0UgKi8KLQotIyAgZW5kaWYgLyogX1NUTFBfQ1RZUEVfSF9TRUVOICovCi0KLSMgIGlmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MjE5KQotIyAgICBpZiAhIGRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKLSMgICAgICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgotIyAgICAgIHVuZGVmICBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECi0jICAgIGVsc2UKLSMgICAgICB1bmRlZiAgX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lECi0jICAgIGVuZGlmCi0jICBlbmRpZgotCi0jZW5kaWYgLyogUkNfSU5WT0tFRCAqLwotCi0jZW5kaWYgLyogX1NUTFBfQ1RZUEVfSCAqLwpkaWZmIC0tZ2l0IGEvY3djaGFyIGIvY3djaGFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWI5OWY4Li4wMDAwMDAwCi0tLSBhL2N3Y2hhcgorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0jaWZuZGVmIF9TVExQX0NXQ0hBUgotCi0jaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKLSMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MTIwCi0jICBkZWZpbmUgX1NUTFBfQ1dDSEFSCi0jICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgotI2VuZGlmCi0KLSNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAhPSAweDEyMCkKLSMgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUihjd2NoYXIpCi0jZWxzZQotIyAgaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NXQ0hBUgotIyAgICBpbmNsdWRlIDxzdGwvX2N3Y2hhci5oPgotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgxMjApCi0jICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgotIyAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAotI2VuZGlmCi0KLSNlbmRpZiAvKiBfU1RMUF9DV0NIQVIgKi8KLQotCi0vLyBMb2NhbCBWYXJpYWJsZXM6Ci0vLyBtb2RlOkMrKwotLy8gRW5kOgpkaWZmIC0tZ2l0IGEvY3djdHlwZSBiL2N3Y3R5cGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ZjA4NTkuLjAwMDAwMDAKLS0tIGEvY3djdHlwZQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0jaWZuZGVmIF9TVExQX0NXQ1RZUEUKLSNkZWZpbmUgX1NUTFBfQ1dDVFlQRQotCi0jaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKLSMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MTIxCi0jICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgotI2VuZGlmCi0KLSNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAhPSAweDEyMSkKLSMgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUihjd2N0eXBlKQotI2Vsc2UKLSMgIGlmbmRlZiBfU1RMUF9JTlRFUk5BTF9DV0NUWVBFCi0jICAgIGluY2x1ZGUgPHN0bC9fY3djdHlwZS5oPgotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgxMjEpCi0jICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgotIyAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAotI2VuZGlmCi0KLSNlbmRpZiAvKiBfU1RMUF9DV0NUWVBFICovCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6CmRpZmYgLS1naXQgYS9kZXF1ZSBiL2RlcXVlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmRmNTEzLi4wMDAwMDAwCi0tLSBhL2RlcXVlCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTQKLSAqIEhld2xldHQtUGFja2FyZCBDb21wYW55Ci0gKgotICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKLSAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NwotICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogQm9yaXMgRm9taXRjaGV2Ci0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICovCi0KLSNpZm5kZWYgX1NUTFBfREVRVUUKLSNkZWZpbmUgX1NUTFBfREVRVUUKLQotI2lmbmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECi0jICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDIyCi0jICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgotI2VuZGlmCi0KLSNpZmRlZiBfU1RMUF9QUkFHTUFfT05DRQotIyAgcHJhZ21hIG9uY2UKLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0RFUVVFX0gKLSMgIGluY2x1ZGUgPHN0bC9fZGVxdWUuaD4KLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX1NUTFBfSU1QT1JUX1ZFTkRPUl9TVEQpCi0jICBpbmNsdWRlIF9TVExQX05BVElWRV9IRUFERVIoZGVxdWUpCi0jZW5kaWYKLQotI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MjIpCi0jICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgotIyAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAotI2VuZGlmCi0KLSNlbmRpZiAvKiBfU1RMUF9ERVFVRSAqLwotCi0vLyBMb2NhbCBWYXJpYWJsZXM6Ci0vLyBtb2RlOkMrKwotLy8gRW5kOgpkaWZmIC0tZ2l0IGEvZG9jL0ZBUSBiL2RvYy9GQVEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRmZTA3MgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9GQVEKQEAgLTAsMCArMSw1NTQgQEAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQKKworUTEgQWJvdXQgU1RMcG9ydCBhbmQgYXZhaWxhYmlsaXR5CisKK1ExLjAgV2hhdCBpcyBTVExwb3J0PworUTEuMSBXaGF0IGFyZSB0aGUgYmVuZWZpdHMgZnJvbSB1c2luZyBTVExwb3J0PworUTEuMiBXaGF0IHZlcnNpb25zIG9mIFNUTHBvcnQgYXJlIGF2YWlsYWJsZT8KK1ExLjMgV2hlcmUgaXMgdGhlIGRvY3VtZW50YXRpb24gb3IgdXNlciBndWlkZT8KK1ExLjQgV2hhdCBpcyB0aGUgdmVyc2lvbiBwb2xpY3k/CisKK1EyIEdlbmVyYWwKKworUTIuMCBEbyBJIG5lZWQgYSBDKysgY29tcGlsZXI/CitRMi4xIERvIEkgbmVlZCBydW50aW1lIGxpYnJhcmllcyBmcm9tIEMrKyBjb21waWxlcj8KK1EyLjIgQ2FuIEkgdXNlIGNvbnRhaW5lcnMgYW5kIGFsZ29yaXRobXMgZnJvbSBTVExwb3J0IGFuZCBpb3N0cmVhbXMgZnJvbQorbGlicmFyeSB0aGF0IHNoaXAgd2l0aCBteSBjb21waWxlcj8KK1EyLjMgQ2FuIEkgbWl4IFNUTCBpbXBsZW1lbnRhdGlvbnMgaW4gbXkgcHJvamVjdD8KK1EyLjQgV2hlbiBJIHN3aXRjaCB0byBTVExwb3J0IGluIG15IGFwcGxpY2F0aW9uLCBJIGdldCBlcnJvcnMuIElzIFNUTHBvcnQKK3NvIGJhZD8KKworUTMgQnVpbGRpbmcKKworUTMuMCBPbiBteSBYWFhYIExpbnV4IG4ubiBnKysgaGVhZGVycyBhcmUgaW4gL3Vzci9pbmNsdWRlL2crKywgYnV0IHRoZXkKK2FyZSBsb29rZWQgZm9yIGluIC91c3IvaW5jbHVkZS8zLjMuMS4gSXMgaXQgYSBTVExwb3J0IGJ1Zz8KK1EzLjEgRG8gSSBuZWVkIHRvIGJ1aWxkIGxpYnJhcnkgdG8gdXNlIFNUTHBvcnQ/CitRMy4yIER1cmluZyBsaWJyYXJ5IGNvbXBpbGF0aW9uIHdpdGggTVMgVkMrKyA2LjAgSSBzZWUgZm9sbG93aW5nIGVycm9yIHJlcG9ydDouLi4KK1EzLjMgSGFzIGFueWJvZHkgc3VjY2VlZGVkIGJ1aWxkaW5nIFNUTHBvcnQgb24gT1MgWSB3aXRoIGNvbXBpbGVyIEsgbi5uPworUTMuNCBEb2VzIFNUTHBvcnQgc3VwcG9ydCBjcm9zcy1jb21waWxhdGlvbj8KKworUTQgSW5zdGFsbGF0aW9uCisKK1E0LjEgSSB0cmllZCAibWFrZSAtZiBnY2MubWFrIGluc3RhbGwiLCBidXQgaXQgaW5zdGFsbCBub3RoaW5nIGludG8KKy91c3IvbG9jYWwvLiBIb3cgSSBjYW4gaW5zdGFsbCBoZWFkZXJzIGludG8gL3Vzci9sb2NhbC9pbmNsdWRlIGFuZAorbGlicyBpbnRvIC91c3IvbG9jYWwvbGliPworCitRNSBCdWcgcmVwb3J0CisKK1E1LjAgSSBmb3VuZCBhIGJ1ZywgaG93IGNhbiBJIHJlcG9ydCBhYm91dCBpdD8KKworUTYgRGVzaWduCisKK1E2LjAgSW4gU1RMcG9ydCwgZmlsZXMgbGlrZSBsb2NhbGUuaCwgc2V0am1wLmgsIHN0ZGxpYi5oLCBldGMuLAorZG8gbm90aGluZyBleGNlcHQgaW5jbHVkZSBuYXRpdmUgaGVhZGVycy4gV2h5IGFyZSB0aGVzZSBmaWxlcyBwcmVzZW50IGluIFNUTHBvcnQ/CitRNi4xIElzIFNUTHBvcnQgYSByZXBsYWNlbWVudCBmb3IgaGVhZGVycyBhbmQgbGlicmFyaWVzIHRoYXQgc2hpcG91dAord2l0aCBjb21waWxlcj8KK1E2LjIgTXkgdG9vbCBkZXRlY3RzIG1lbW9yeSBsZWFrcyBpbiBhcHBsaWNhdGlvbnMgd2l0aCBTVExwb3J0LiBJcyB0aGlzIGxlYWsKK2Zyb20gU1RMcG9ydD8KK1E2LjMgV2hlbiBydW5uaW5nIHVuaXQgdGVzdHMsIEkgaGF2ZSBlcnJvcnMgaW4gTG9jYWxlVGVzdCB0ZXN0IGZpeHR1cmUsIGhvdyBiYWQKK2lzIGl0PworUTYuNCBzZXQgb3IgbXVsdGlzZXQgaXRlcmF0b3JzIGFyZSBpbW11dGFibGUgbGlrZSBjb25zdF9pdGVyYXRvcnMsIHdoeSA/CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuc3dlcnMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1ExLjAgV2hhdCBpcyBTVExwb3J0PworQTEuMCBTVExwb3J0IGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBDKysgU3RhbmRhcmQgTGlicmFyeSwgYXMgZGVzY3JpYmVkIAoraW4gdGhlIElOVEVSTkFUSU9OQUwgU1RBTkRBUkQgSVNPL0lFQyAxNDg4MjoxOTk4KEUpIGFuZCBsYXRlc3QKK0lTTy9JRUMgMTQ4ODI6MjAwMyhFKS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1ExLjEgV2hhdCBhcmUgdGhlIGJlbmVmaXRzIGZyb20gdXNpbmcgU1RMcG9ydD8KKworQTEuMQorICAtIEZvciBtdWx0aXBsYXRmb3JtL211bHRpY29tcGlsZXJzIHByb2plY3QgYSBjb2hlcmVudCBTdGFuZGFyZCBMaWJyYXJ5CitpbXBsZW1lbnRhdGlvbi4KKyAgLSBBbiBlYXN5IHRvIHVzZSBTVEwgc2FmZSBtb2RlIGRldGVjdGluZyBiYWQgdXNlIG9mIGNvbnRhaW5lcnMgYW5kCitpdGVyYXRvcnMuCisgIC0gU29tZSBvcmlnaW5hbCBvcHRpbWl6YXRpb25zOiB0ZW1wbGF0ZSBleHByZXNzaW9uIGZvciBzdHJpbmcKK2NvbmNhdGVuYXRpb24sIHNob3J0IHN0cmluZyBvcHRpbWl6YXRpb24sIG1vdmUgc2VtYW50aWMgZm9yIFNUTCBjb250YWluZXJzCitjb21iaW5hdGlvbiBsaWtlIHZlY3RvciBvZiB2ZWN0b3IsIGFuIGVmZmljaWVudCBzdGQ6OmFsbG9jYXRvci4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1ExLjIgV2hhdCB2ZXJzaW9ucyBvZiBTVExwb3J0IGFyZSBhdmFpbGFibGU/CisKK0ExLjIKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1ExLjMgV2hlcmUgaXMgdGhlIHVzZXIgZ3VpZGU/CisKK0ExLjMgVGhlcmUgaXMgbm8gcmVhbCB1c2VyIGd1aWRlIGZvciB0aGUgbW9tZW50LiBZb3UgY2FuIGZpbmQgc29tZSBpbmZvcm1hdGlvbgoraW4gUkVBRE1FIGZpbGVzIGluIGRvYyBmb2xkZXIuIEFzIFNUTHBvcnQgaXMgYSBDKysgU3RhbmRhcmQgbGlicmFyeQoraW1wbGVtZW50YXRpb24geW91IG1pZ2h0IGZpbmQgaW5mb3JtYXRpb24geW91IG5lZWQgYXQgdGhlIGZvbGxvd2luZworbG9jYXRpb25zOgorICAtIFRoZSBJU08vSUVDIDE0ODgyOjIwMDMgZG9jdW1lbnQgeW91IGNhbiBidXkgZm9yIGEgdmVyeSBjaGVhcCBwcmljZS4KKyAgLSBGb3IgU1RMIGNvbnRhaW5lcnMgeW91IGNhbiB1c2UgU0dJIGRvY3VtZW50YXRpb24gKGh0dHA6Ly93d3cuc2dpLmNvbS90ZWNoL3N0bC8pLgorICAgIEJld2FyZSBob3dldmVyLCBTVEwgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQgaXMgbm90IGlkZW50aWNhbCB0byB0aGUKKyAgICBTdGFuZGFyZGl6ZWQgdmVyc2lvbiBkZXNjcmliZWQgaW4gSVNPL0lFQy4gVGhpcyBkb2N1bWVudGF0aW9uIGNhbiBiZSB2ZXJ5CisgICAgdXNlZnVsIGZvciBTVExwb3J0IGV4dGVuc2lvbnMgbGlrZSBoYXNoIGNvbnRhaW5lcnMgKGhhc2hfbWFwLCBoYXNoX3NldC4uLikKKyAgLSBZb3UgY2FuIGFsc28gdXNlIHRoZSBkb2N1bWVudGF0aW9uIGNvbWluZyB3aXRoIHlvdXIgY29tcGlsZXIgYXMgbW9zdAorICAgIG9mIHRoZSBpbmZvcm1hdGlvbiB3aWxsIGFsc28gYXBwbHkgdG8gU1RMcG9ydC4gVGFrZSBjYXJlIHRvIGRlc2NyaXB0aW9uCisgICAgcmVwb3J0ZWQgYXMgJ2ltcGxlbWVudGF0aW9uIHNwZWNpZmljJy4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1ExLjQgV2hhdCBpcyB0aGUgdmVyc2lvbiBwb2xpY3k/CisKK0ExLjQgU1RMcG9ydCB2ZXJzaW9uIGluZm9ybWF0aW9uIGNvbnRhaW5zIHRocmVlIG51bWJlcnMgbGlrZSAnNS4xLjAnLiAnNScKK2lzIHRoZSBtYWpvciB2ZXJzaW9uIG51bWJlciwgJzEnIGlzIHRoZSBtaW5vciBhbmQgJzAnIGlzIHRoZSBwYXRjaCBsZXZlbC4KK1BvbGljeSBmb3IgdGhpcyBudW1iZXJzIGFyZToKKyAgLSBjaGFuZ2VzIGluIG1ham9yIHZlcnNpb24gbnVtYmVyOiByYWRpY2FsIG1vZGlmaWNhdGlvbiwgbmV3IGVyYS4KKyAgLSBjaGFuZ2VzIGluIG1pbm9yIHZlcnNpb24gbnVtYmVyOiBzaWduaWZpY2FudCBjaGFuZ2VzLCBuZXcgZmVhdHVyZXMsCisgICAgY2hhbmdlcyBpbiBpbnRlcmZhY2UgcGFydDsgc3dpdGNoaW5nIHRvIGFuIFNUTHBvcnQgbGlicmFyeSB3aXRoIGEgZGlmZmVyZW50CisgICAgbWlub3IgdmVyc2lvbiByZXF1aXJlIHJlY29tcGlsYXRpb24gb2YgYWxsIG1vZHVsZXMgZGVwZW5kaW5nIG9uIGl0LgorICAtIGNoYW5nZXMgaW4gcGF0Y2ggbGV2ZWw6IGJ1Z2ZpeGVzOyB3ZSBrZWVwIGluIG1pbmQgYmluYXJ5IGNvbXBhdGliaWxpdHksCisgICAgYnV0IHJlYWxseSBjYW4ndCBzdHJvbmdseSBndWFyYW50ZWUgaXQ7IHN3aXRjaGluZyB0byBhbiBTVExwb3J0IGxpYnJhcnkKKyAgICB3aXRoIGRpZmZlcmVudCBwYXRjaCBsZXZlbCBkbyBub3QgcmVxdWlyZSByZWJ1aWxkIG9mIG1vZHVsZXMtLS1yZWJ1aWxkaW5nIGFuZAorICAgIGluc3RhbGxpbmcgdGhlIFNUTHBvcnQgbGlicmFyaWVzIHNob3VsZCB3b3JrOyBob3dldmVyLCBhcyBTVExwb3J0IGNvbnRhaW5zCisgICAgYSBsb3Qgb2YgdGVtcGxhdGUgY29kZSwgeW91IHNob3VsZCBwYXkgYXR0ZW50aW9uIHRvIGZhY3QgdGhhdCBhbGwgeW91IG1vZHVsZXMKKyAgICB3YXMgYnVpbGQgd2l0aCBTQU1FIFNUTHBvcnQgaGVhZGVycy0tLW90aGVyd2lzZSBwcm9ibGVtcyBwb3NzaWJsZTsKKyAgICByZWNvbXBpbGF0aW9uIG9mIG9uZSBwYXJ0IHdpdGggb25seSByZWJ1aWxkaW5nIFNUTHBvcnQgbWlnaHQgbm90IGJlIGVub3VnaAorICAgIHRvIGdldCBhbGwgdGhlIGZpeGVzIGluIHlvdXIgYXBwbGljYXRpb24gc28gZXZlbiBpbiB0aGlzIGNhc2UgcmVidWlsZGluZworICAgIHlvdXIgbW9kdWxlcyBpcyBhZHZpc2VkLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCitRMi4wIERvIEkgbmVlZCBhIEMrKyBjb21waWxlcj8KKworQTIuMCBTVExwb3J0IGlzIGEgQysrIGxpYnJhcnkuIFNvIHRoZSBhbnN3ZXIgaXMgJ3llcywgeW91IGRvJy4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1EyLjEgRG8gSSBuZWVkIHJ1bnRpbWUgbGlicmFyaWVzIGZyb20gQysrIGNvbXBpbGVyPworCitBMi4xIEluIGFueSBjYXNlLCB0aGUgQysrIGxhbmd1YWdlIHN1cHBvcnQgZnJvbSBjb21waWxlciBpcyByZXF1aXJlZAorZm9yIFNUTHBvcnQgKG9wZXJhdG9ycyBuZXcsIGRlbGV0ZSwgUlRUSSwgZXhjZXB0aW9ucyBzdXBwb3J0KS4gVGhhdCdzIHdoeQoraW4gbW9zdCBjYXNlcyB5b3UgbmVlZCBzb21lIHJ1bnRpbWUgbGlicmFyaWVzIGZyb20gdGhlIEMrKyBjb21waWxlci4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1EyLjIgQ2FuIEkgdXNlIGNvbnRhaW5lcnMgYW5kIGFsZ29yaXRobXMgZnJvbSBTVExwb3J0IGFuZCBpb3N0cmVhbXMgZnJvbQordGhlIGxpYnJhcnkgdGhhdCBzaGlwcyB3aXRoIG15IGNvbXBpbGVyPworCitBMi4yIFRoZSBzaG9ydCBhbnN3ZXIgaXMgJ05vJy4KKworSW5kZWVkIGNvLWV4aXN0ZW5jZSBvZiB0d28gaW1wbGVtZW50YXRpb25zIHBvc3NpYmxlLCBidXQgdGhpcyByZXF1aXJlZAorYSBsb3Qgb2Yga25vd2xlZGdlIGFzIGFib3V0IGJvdGggaW1wbGVtZW50YXRpb25zLCBhcyBhYm91dCBjb21waWxlciBhbmQKK2xpbmthZ2UuIFRoaXMgaXNzdWVzIHNob3VsZCBiZSB0YWtlbiBpbnRvIGFjY291bnQgYm90aCB3aXRoaW4gU1RMIGxpYnJhcnkgYW5kCitkdXJpbmcgbGlicmFyeSB1c2FnZS4gSW4gY29tbW9uIHlvdSBjYW4ndCB1c2UgYm90aCBpbXBsZW1lbnRhdGlvbgoraW4gdGhlIHNhbWUgbmFtZXNwYWNlLiBTbyB5b3Ugc2hvdWxkIHNlcGFyYXRlIFNUTCBpbXBsZW1lbnRhdGlvbnMgaW50bworZGlmZmVyZW50IG5hbWVzcGFjZXMuIEJ1dCBkdWUgdG8gYWJzZW50IG9mIGNvbXBpbGVycyB0aGF0IGhhcyBmdWxsLWZlYXR1cmVkCitzdXBwb3J0IG9mIEFyZ3VtZW50IERlcGVuZGVudCBMb29rdXAgKEFETCkgKGFrYSBLb2VuaWcgTG9va3VwKSwgeW91IGhhdmUgbm8KK3Bvc3NpYmlsdHkgdG8gc2VsZWN0IG9uZSBvciBhbm90aGVyIGltcGxlbWVudGF0aW9uLgorCitBREwgcHJvYmxlbS4KKworSW4gd3JhcHBlciBtb2RlLCBhbGwgc3RkIHJlZmVyZW5jZXMgYXJlIHJlcGxhY2VkLCB0aGFua3MgYSBzaW1wbGUgbWFjcm8sCitieSB0aGUgc3RscF9zdGQgbmFtZXNwYWNlLiBFdmVyeXRoaW5nIGZyb20gdGhlIG5hdGl2ZSBjb21waWxlciBzdGQgbmFtZXNwYWNlCitpcyBpbmplY3RlZCB0byB0aGUgc3RscF9zdGQgbmFtZXNwYWNlIHdpdGggbWFueSB1c2luZyBzdGQ6OiogZGlyZWN0aXZlcy4KKworVGhlIHByb2JsZW0gYXJpc2Ugd2hlbiB5b3Ugc3BlY2lhbGl6ZWQgYSBzdGFuZGFyZCBjbGFzcyBmb3Igb25lIG9mIHlvdXIKK3VzZXIgdHlwZXMuIFlvdSBkbyBpdCB3aXRoaW4gdGhlIHN0ZCBuYW1lc3BhY2UgdGhhdCwgaW4gd3JhcHBlciBtb2RlCitiZWNvbWVzIHRoZSBzdGxwX3N0ZCBuYW1lc3BhY2UuIFRoZW4gdGhpcyBzcGVjaWFsaXphdGlvbiBpcyBqdXN0IGludmlzaWJsZQorZnJvbSB0aGUgbmF0aXZlIHN0ZCBuYW1lc3BhY2UgYW5kIHdvbid0IGJlIHVzZWQuCisKK1RoaW5ncyBhcmUgc29tZXdoYXQgd29yc2U6IHRoZSBwcm9ibGVtIGFyaXNlcyBldmVuIHdpdGhvdXQgYW55IGV4cGxpY2l0CitzcGVjaWFsaXphdGlvbnMuIEl0IGlzIG5vdCBhIGJ1ZywgYnV0IHRoZSBmYWN0IHRoYXQgb2xkIGNvbXBpbGVycyBqdXN0CitkaWQgbm90IHRyaWVkIHRvIGZpbmQgZnVuY3Rpb25zIGluIHRoZSBuYW1lc3BhY2VzIHdoZXJlIGFyZ3VtZW50cycgY2xhc3NlcworYXJlIGRlZmluZWQgKGluZGVlZCBubyBjb21waWxlcnMgd2l0aCBmdWxsLWZlYXR1cmVkIHN1cHBvcnQgb2YgQURMIHlldCkuCisKK01peCBpbXBsZW1lbnRhdGlvbiB2aWEgbGlicmFyeS4KKworTGV0J3MgcmVkdWNlIGFsbCB0aGUgY29tcGxleGl0eSBvZiBTVExwb3J0IHRvIHNvbWUgdmVyeSBzaW1wbGUgZXhhbXBsZToKKworbmFtZXNwYWNlIHN0ZCB7CisKK2NsYXNzIHN0cmluZworeworICBwdWJsaWM6CisgICAgY2xhc3MgaXRlcmF0b3IgeyB9OworCisgICAgaXRlcmF0b3IgYmVnaW4oKTsKKyAgICBpdGVyYXRvciBlbmQoKTsKK307CisKK3RlbXBsYXRlPGNsYXNzIEksIGNsYXNzIFQ+Cit2b2lkIGZpbmQoSSBiZWdpbiwgSSBlbmQsIFQgdmFsdWUpOworCit9IC8vIG5hbWVzcGFjZSBzdGQKKworCituYW1lc3BhY2Ugc3RscG9ydCB7CisKK3VzaW5nIHN0ZDo6c3RyaW5nOworCit0ZW1wbGF0ZTxjbGFzcyBJLCBjbGFzcyBUPgordm9pZCBmaW5kKEkgYmVnaW4sIEkgZW5kLCBUIHZhbHVlKTsKKwordm9pZCBnZWUoKQoreworICBzdHJpbmcgczsKKyAgZmluZChzLmJlZ2luKCksIHMuZW5kKCksIDEwKTsKK30KKworfSAvLyBuYW1lc3BhY2Ugc3RscG9ydAorCisKK1doZW4gYSBjb21waWxlciBzdXBwb3J0aW5nIEFETCBmaW5kcyB0aGUgY2FsbCB0byBgZmluZCcgd2l0aGluIGdlZSgpIGZ1bmN0aW9uCitpdCBzaG91bGQgZXhhbWluZSBib3RoIG5hbWVzcGFjZSBgc3RscG9ydCcgYW5kIG5hbWVzcGFjZSBgc3RkJyBmb3IKK3RoZSBwcmVzZW5jZSBvZiBgZmluZCcuIEl0IGlzIGNhdXNlZCBieSB0aGUgZmFjdCB0aGF0IHMuYmVnaW4oKSByZXR1cm5zCitvYmplY3Qgb2YgdHlwZSBgc3RkOjpzdHJpbmc6Oml0ZXJhdG9yJyB3aGljaCBvYnZpb3VzbHkgZGVmaW5lZCBpbiBuYW1lc3BhY2UKK2BzdGQnIGFuZCB0aGUgaGVhcnQgb2YgQURMIGlzIGZpbmRpbmcgZnVuY3Rpb25zIG5vdCBvbmx5IHdpdGhpbiBuYW1lc3BhY2VzCit3aGVyZSB0aGUgY2FsbCBpcyBiZWluZyBtYWRlIGJ1dCBhbHNvIGluIHRoZSBuYW1lc3BhY2VzIHdoZXJlIHRoZSBjbGFzc2VzCitvZiBhcmd1bWVudHMgYXJlIGRlZmluZWQuLi4KKworU28sIGluIG91ciBleGFtcGxlIGNvbXBpbGVyIGVuZHMgd2l0aCB0d28gdGVtcGxhdGVzIHNhdGlzZnlpbmcgdGhlIGNhbGwKK2BmaW5kKHMuYmVnaW4oKSwgcy5lbmQoKSwgMTApJzogYHN0ZDo6ZmluZCcgYW5kIGBzdGxwb3J0OjpmaW5kJy4KK1NpbmNlIGNvbXBpbGVyIGNhbiBub3QgY2hvb3NlIGFueSBvbmUgb2YgdGhlbSBpdCByZXBvcnRzIGFtYmlndWl0eS4KKworVGhlcmUgaXMgYW5vdGhlciBhc3BlY3Qgb2YgbWl4IGltcGxlbWVudGF0aW9ucy4KK0xldCdzIGNvbnNpZGVyIGZvbGxvd2luZyBjb2RlOgorCithLmg6CisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK2NsYXNzIEEgeworICBwdWJsaWM6CisgICAgQSgpIHt9CisKKyAgICB2b2lkIHB1c2goIGNvbnN0IHN0cmluZyBzICk7CisgICAgCisgICAgc3RyaW5nIF9zdHI7Cit9OworCithLmNwcDoKKworI2luY2x1ZGUgImEuaCIKKwordm9pZCBBOjpwdXNoKCBjb25zdCBzdHJpbmcgcyApCit7CisgIF9zdHIgPSBzOworfQorCisKK2IuY3BwOgorCisjaW5jbHVkZSAiYS5oIgorCitzdHJpbmcgczsKK0EgYTsKKwordm9pZCBnZWUoKQoreworICAgYS5wdXNoKCBzICk7Cit9CisKK05vdyBidWlsZCBsaWJyYXJ5IGZyb20gYS5jcHAgd2l0aCBzdHJpbmcgaW1wbGVtZW50YXRpb24gSW1wbDE7Cit0aGVuIGJ1aWxkIGFwcGxpY2F0aW9uIHdpdGggYi5jcHAgdGhhdCB1c2Ugc3RyaW5nIGltcGxlbWVudGF0aW9uIEltcGwyLAorYW5kIGxpbmsgd2l0aCBtZW50aW9uZWQgYWJvdmUgbGlicmFyeS4gQ29tcGlsZXIgd2lsbCBwYXNzLiBMaW5rZXIgbWF5IAorcGFzcyB0b28uIEJ1dCB5b3VyIGFwcGxpY2F0aW9uIHdpbGwgY3Jhc2ggKG9yIHJhbmRvbWx5IGNyYXNoKSBlaXRoZXIgb24KK2NhbGwgYS5wdXNoLCBvciBvbiBhc3NpZ25tZW50IF9zdHIgPSBzLiBUaGlzIGlzIGV2aWRlbnQgaGVyZSwgYnV0IG5vdAorZXZpZGVudCBpbiByZWFsIGFwcGxpY2F0aW9ucy4KKworVGhlIGNvbmNsdXNpb24gaXM6ICJVc2luZyBXcmFwcGVyIG1vZGUgaXMgdmVyeSBoYXJkIGFuZCB3ZSByZW1vdmVkIHN1cHBvcnQKK2ZvciBpdCIuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitRMi4zIENhbiBJIG1peCBTVEwgaW1wbGVtZW50YXRpb25zIGluIG15IHByb2plY3Q/CisKK0EyLjMgWWVzIHlvdSBjYW4gYnV0IGVhY2ggaW1wbGVtZW50YXRpb25zIHdpbGwgcmVseSBpbiBpdHMgb3duIG5hbWVzcGFjZQord2l0aCBubyBkaXJlY3QgaW50ZXJhY3Rpb24gYmV0d2VlbiB0aGVtLiBZb3Ugd2lsbCBmaXJzdCBuZWVkIHRvIGNvcnJlY3RseQorY29uZmlndXJlIFNUTHBvcnQgdGhhbmtzIHRvIDIgbWFjcm9zIGluIHVzZXJfY29uZmlnLmggZmlsZS4KKy0gX1NUTFBfRE9OVF9SRURFRklORV9TVEQgdGVsbHMgU1RMcG9ydCBub3QgdG8gZGVmaW5lIHRoZSBzdGQgbWFjcm8gdGhhdCBpcwordXNlZCB0byByZXBsYWNlIHN0ZCByZWZlcmVuY2UgaW4geW91ciBjb2RlIHdpdGggU1RMcG9ydCBuYW1lc3BhY2UuCistIF9TVExQX1dIT0xFX05BVElWRV9TVEQgdGVsbHMgU1RMcG9ydCB0byBhbHdheXMgaW5jbHVkZSBuYXRpdmUgaGVhZGVyIGVhY2gKK3RpbWUgYSBTdGFuZGFyZCBoZWFkZXIgaXMgaW5jbHVkZWQgaW4geW91ciBjb2RlLgorCitIZXJlIGlzIGEgc21hbGwgY29kZSBzYW1wbGUgdGhhdCBkbyBub3QgcmVxdWlyZSBhbnkgbW9kaWZpY2F0aW9uIGluIFNUTHBvcnQKK2luc3RhbGw6CisKKyNkZWZpbmUgX1NUTFBfRE9OVF9SRURFRklORV9TVEQKKyNkZWZpbmUgX1NUTFBfV0hPTEVfTkFUSVZFX1NURAorCisjaW5jbHVkZSA8c3RyaW5nPgorCit2b2lkIGZvbygpCit7CisgICBzdGQ6OnN0cmluZyBzdGRfc3RyKCJzdGQiKTsKKyAgIHN0bHBvcnQ6OnN0cmluZyBzdGxwb3J0X3N0cigic3RscG9ydCIpOworICAgc3RscG9ydF9zdHIuYXBwZW5kKHN0ZF9zdHIuYmVnaW4oKSwgc3RkX3N0ci5lbmQoKSk7CisgICAvLyBGb2xsb3dpbmcgaXMgd3JvbmcgYmVjYXVzZSB0aGVyZSBpcyBubyBhc3NpZ25tZW50CisgICAvLyBvcGVyYXRvciBmb3Igc3RscG9ydDo6c3RyaW5nIG9uIHN0ZDo6c3RyaW5nLgorICAgLy9zdGRfc3RyID0gc3RscG9ydF9zdHI7Cit9CisKK05vdGU6IFlvdSBjYW4gdXNlICdzdGQnIGl0ZXJhdG9ycyBmcm9tIG5hdGl2ZSBpbXBsZW1lbnRhdGlvbiBpbiBTVExwb3J0Cit0ZW1wbGF0ZSBtZXRob2RzIGxpa2UgaW4gdGhlICdzdGxwb3J0X3N0ci5hcHBlbmQnIG1ldGhvZCBjYWxsIGFib3ZlIGJlY2F1c2UKK1NUTHBvcnQgaXMgYWRkaW5nIHRoZSBuZWNlc3NhcnkgY29kZSB0byBpbnRlcnByZXQgbmF0aXZlIGl0ZXJhdG9ycyBsaWtlCitTVExwb3J0IGl0ZXJhdG9ycy4gWW91IHdvbid0IGJlIGFibGUgaG93ZXZlciB0byBkbyB0aGUgb3Bwb3NpdGUgYXMgbmF0aXZlCitpbXBsZW1lbnRhdGlvbiBkbyBub3Qga25vdyBhbnl0aGluZyBhYm91dCBTVExwb3J0IGl0ZXJhdG9ycy4KKworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUTIuNCBXaGVuIEkgc3dpdGNoIHRvIFNUTHBvcnQgaW4gbXkgYXBwbGljYXRpb24sIEkgZ2V0IGVycm9ycy4gSXMgU1RMcG9ydAorc28gYmFkPworCitBMi40IEJlZm9yZSB5b3UgcG9zdCBzdWNoIG1lc3NhZ2UsIHBsZWFzZSwgY2hlY2sgU1RMcG9ydCBXSElUSE9VVCBZT1VSIGNvZGU6CisgIC0gYnVpbGQgU1RMcG9ydCBsaWJyYXJ5CisgIC0gYnVpbGQgU1RMcG9ydCB1bml0IHRlc3RzCisgIC0gcnVuIFNUTHBvcnQgdW5pdCB0ZXN0cworSWYgYW55IG9mIGFib3ZlIHN0ZXBzIGZhaWwsIHBsZWFzZSwgbWFrZSBzdXJlIHRoYXQgeW91IGNhcmVmdWxseSBmb2xsb3dlZAorYnVpbGQgaW5zdHJ1Y3Rpb25zIChpbiBtb3N0IGNhc2VzIHlvdSBkZWZpbml0ZWx5IHNob3VsZCByZXJlYWQKK2luc3RydWN0aW9ucyBhbmQgY2hlY2sgdGhhdCB5b3UgY29ycmVjdGx5IHVucGFjayBhcmNoaXZlIGluIGNhc2UgeW91IHNlZQorJ2ZpbGUgbm90IGZvdW5kJyBtZXNzYWdlKS4gQnVpbGQgaW5zdHJ1Y3Rpb25zIHlvdSBjYW4gZm91bmQgaW4gZmlsZXMKK0lOU1RBTEwsIGRvYy9SRUFETUUuKiwgYnVpbGQvUkVBRE1FKiwgYnVpbGQvdGVzdC91bml0L1JFQURNRSouCitJZiB5b3UgYXJlIHN1cmUsIHN1Ym1pdCBidWcgcmVwb3J0IGhlcmU6CitodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9zdGxwb3J0CitEb24ndCBmb3JnZXQgdG8gZGVzY3JpYmUgeW91ciBvcGVyYXRpb25hbCBlbnZpcm9ubWVudCwgY29tcGlsZXIgdmVyc2lvbiBhbmQKK1NUTHBvcnQgdmVyc2lvbi4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1EzLjAgT24gbXkgWFhYWCBMaW51eCBuLm4gZysrIGhlYWRlcnMgYXJlIGluIC91c3IvaW5jbHVkZS9nKyssIGJ1dCB0aGV5CithcmUgbG9va2VkIGZvciBpbiAvdXNyL2luY2x1ZGUvMy4zLjEuIElzIGl0IGEgU1RMcG9ydCBidWc/CisKK0EzLjAgUGF0aCB0byBuYXRpdmUgY29tcGlsZXIgaGVhZGVycyBmb3IgR0NDIGNvcnJlc3BvbmQgdG8gZGVmYXVsdCBwYXRoCithZnRlciBidWlsZC9pbnN0YWxsIGNvbXBpbGVyIChpLmUuIHBhdGhzIGZyb20gY29tcGlsZXIgb3JpZ28pLgorUGFja2FnZSBtYWludGFpbmVycyBjYW4gdXNlIGFueSBwYXRoIGJ5IG93biB0YXN0ZS0tLXdlIGNhbid0IHNhdGlzZnkKK3ZhcmlldHkgb2YgZGlzdHJpYnV0aW9ucy9wYWNrYWdlcy4KKworU28geW91IGNhbjoKKyAtIGZpeCBwYXRoIGluIHN0bHBvcnQgYWRtaW5pc3RyYXRpb24gY29uZmlnIGZpbGUgc3RscG9ydC9zdGwvY29uZmlnL2hvc3QuaCwgCisgICBzZWUgX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSCBtYWNybyBhbmQgcmVsYXRlZC4KKyAtIGNyZWF0ZSBhIGxpbmsgdG8gdGhlIG5hdGl2ZSBjb21waWxlciBoZWFkZXJzIGxpa2UgZXhwZWN0ZWQgYnkgU1RMcG9ydAorIC0gbWFrZSByZXF1ZXN0IHRvIHBhY2thZ2UgbWFpbnRhaW5lcgorIC0gYnVpbGQgYW5kIGluc3RhbGwgY29tcGlsZXIKKworTm90ZTogU3RhcnRpbmcgd2l0aCB2ZXJzaW9uIDUuMiwgU1RMcG9ydCB1c2VzIHRoZSBpbmNsdWRlX25leHQgcHJlcHJvY2Vzc2luZworY29tbWFuZCB0byBhY2Nlc3MgbmF0aXZlIGhlYWRlcnMgc28geW91IHNob3VsZG4ndCBleHBlcmltZW50IHRoaXMgcHJvYmxlbQorYW55bW9yZSB3aGVuIHRoaXMgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgeW91ciBjb21waWxlciBwcmVwcm9jZXNzb3IuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitRMy4xIERvIEkgbmVlZCB0byBidWlsZCBhIGxpYnJhcnkgdG8gdXNlIFNUTHBvcnQ/CisKK0EzLjEgWW91IG1heSBvbWl0IHVzYWdlIChhbmQsIHRodXMgYnVpbGRpbmcpIFNUTHBvcnQgbGlicmFyeSwgYnV0IGluIHRoaXMKK2Nhc2UgeW91IGNhbid0IHVzZSBpb3N0cmVhbXMsIGxvY2FsZSwgY29tcGxleC4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1EzLjIgRHVyaW5nIGxpYnJhcnkgY29tcGlsYXRpb24gd2l0aCBNUyBWQysrIDYuMCBJIHNlZSBmb2xsb3dpbmcgZXJyb3IgcmVwb3J0OgorCitDOlxQcm9ncmFtIEZpbGVzXE1pY3Jvc29mdCBTREtcSW5jbHVkZVwuXHdpbmJhc2UuaCgxMTIzKSA6IGVycm9yIEMyNzMzOiBzZWNvbmQgQyBsaW5rYWdlIG9mIG92ZXJsb2FkZWQgZnVuY3Rpb24gJ0ludGVybG9ja2VkSW5jcmVtZW50JyBub3QgYWxsb3dlZAorICAgICAgICBDOlxQcm9ncmFtIEZpbGVzXE1pY3Jvc29mdCBTREtcSW5jbHVkZVwuXHdpbmJhc2UuaCgxMTIxKSA6IHNlZSBkZWNsYXJhdGlvbiBvZiAnSW50ZXJsb2NrZWRJbmNyZW1lbnQnCitDOlxQcm9ncmFtIEZpbGVzXE1pY3Jvc29mdCBTREtcSW5jbHVkZVwuXHdpbmJhc2UuaCgxMTMwKSA6IGVycm9yIEMyNzMzOiBzZWNvbmQgQyBsaW5rYWdlIG9mIG92ZXJsb2FkZWQgZnVuY3Rpb24gJ0ludGVybG9ja2VkRGVjcmVtZW50JyBub3QgYWxsb3dlZAorICAgICAgICBDOlxQcm9ncmFtIEZpbGVzXE1pY3Jvc29mdCBTREtcSW5jbHVkZVwuXHdpbmJhc2UuaCgxMTI4KSA6IHNlZSBkZWNsYXJhdGlvbiBvZiAnSW50ZXJsb2NrZWREZWNyZW1lbnQnCitDOlxQcm9ncmFtIEZpbGVzXE1pY3Jvc29mdCBTREtcSW5jbHVkZVwuXHdpbmJhc2UuaCgxMTM4KSA6IGVycm9yIEMyNzMzOiBzZWNvbmQgQyBsaW5rYWdlIG9mIG92ZXJsb2FkZWQgZnVuY3Rpb24gJ0ludGVybG9ja2VkRXhjaGFuZ2UnIG5vdCBhbGxvd2VkCisgICAgICAgIEM6XFByb2dyYW0gRmlsZXNcTWljcm9zb2Z0IFNES1xJbmNsdWRlXC5cd2luYmFzZS5oKDExMzUpIDogc2VlIGRlY2xhcmF0aW9uIG9mICdJbnRlcmxvY2tlZEV4Y2hhbmdlJworCitBMy4yIFlvdSBoYXZlIGEgUGxhdGZvcm0gU0RLIGluc3RhbGxlZC4gVW5jb21tZW50IGxpbmUKKyNkZWZpbmUgX1NUTFBfTkVXX1BMQVRGT1JNX1NESyAxCitpbiB0aGUgZmlsZSBzdGxwb3J0L3N0bC9jb25maWcvdXNlcl9jb25maWcuaC4gVGhlcmUgaXMgbm8gd2F5IHRvIGRldGVjdCBTREsKK3ByZXNlbmNlIGR1cmluZyBwcmVwcm9jZXNzb3Igc3RhZ2UsIHdoaWNoIGlzIHdoeSB5b3UgaGF2ZSB0byBtYWtlIHRoaXMKK2NoYW5nZSBtYW51YWxseS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1EzLjMgSGFzIGFueWJvZHkgc3VjY2VlZGVkIGJ1aWxkaW5nIFNUTHBvcnQgb24gT1MgUyB3aXRoIGNvbXBpbGVyIEsgbi5uPworCitBMy4zIFNlZSByZXBvcnQgYWJvdXQgcmVzdWx0cyBvZiByZWdyZXNzaW9uIHRlc3RzIGhlcmU6IGJ1aWxkL3Rlc3QvdW5pdC9TVEFUVVMuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitRMy40IERvZXMgU1RMcG9ydCBzdXBwb3J0IGNyb3NzLWNvbXBpbGF0aW9uPworCitBMy40IEluIGNhc2Ugb2YgR0NDLCB1c2Ugc29tZXRoaW5nIGxpa2UgZm9sbG93aW5nIHNlcXVlbmNlOgorCisgICguL2NvbmZpZ3VyZSAtLXRhcmdldD0ke0NST1NTVEFSR0VUfTsgY2QgYnVpbGQvbGliOyBcCisgICAgIGV4cG9ydCBQQVRIPSR7QkFTRUNST1NTfS9iaW46JHtQQVRIfTsgbWFrZSAtZiBnY2MubWFrIGluc3RhbGwtcmVsZWFzZS1zaGFyZWQpCisKK3doZXJlIENST1NTVEFSR0VUIGlzIEdDQydzIGNyb3NzIHByZWZpeCAoc29tZXRoaW5nIGxpa2UgJ2k1ODYtcGMtbGludXgtZ251JywKK2lmIEMrKyBjcm9zcyBjb21waWxlciBuYW1lZCBhcyAnaTU4Ni1wYy1saW51eC1nbnUtYysrJyksIEJBU0VDUk9TUyBpcyBiYXNlIG9mCitjcm9zcy1jb21waWxlcidzIGxvY2F0aW9uIChpLmUuICR7QkFTRUNST1NTfS9iaW4gaW4gY2FzZSBhYm92ZSBpcyBhIGxvY2F0aW9uCitvZiAnaTU4Ni1wYy1saW51eC1nbnUtYysrJykuCisKK0luIGNhc2Ugb2Ygbm9uLUdDQyBjcm9zc2Vjb21waWxlcnMsIHdlIG5lZWQgaGFuZHMtbWFkZSB0YXJnZXQgc3lzdGVtIGlkZW50aWZpY2F0aW9uLgorVGhlIHNhbXBsZSBvZiBzdWNoIGNvbXBpbGVyIChzdXBwb3J0ZWQgYnkgU1RMcG9ydCkgaXMgTWV0cm9XZXJrcyBDb2Rld2FycmlvcgorZm9yIE5vdmVsbCBOZXR3YXJlIChtd2NjbmxtKS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1E0LjEgSSB0cmllZCAibWFrZSAtZiBnY2MubWFrIGluc3RhbGwiLCBidXQgaXQgaW5zdGFsbHMgbm90aGluZyBpbnRvCisvdXNyL2xvY2FsLy4gSG93IEkgY2FuIGluc3RhbGwgaGVhZGVycyBpbnRvIC91c3IvbG9jYWwvaW5jbHVkZSBhbmQKK2xpYnMgaW50byAvdXNyL2xvY2FsL2xpYj8KKworQTQuMSBJbnN0YWxsYXRpb24gaW4gYW55IHN5c3RlbS13aWRlIHBsYWNlIGlzIGlzc3VlIG9mIGVpdGhlciAncGFja2FnZSBidWlsZGVyJworb3Igc3lzdGVtIGFkbWluaXN0cmF0b3IuIEhlL3NoZSBzaG91bGQgYmUgZmFtaWxpYXIgd2l0aCBidWlsZGluZyBwYWNrYWdlCitwcm9jZWR1cmUgYW5kL29yIHVuZGVyc3RhbmQgd2hlcmUgaGVhZGVycyBhbmQgbGlicmFyaWVzIHNob3VsZCBiZSBzaXR1YXRlZC4KK1RoZSBwbGFjZSBjaG9pY2Ugbm90IGlzc3VlIG9mIFNUTHBvcnQuCisKK1lvdSBjYW4ganVzdCB1c2UKKworKGNkICR7U1RMUE9SVF9TUkN9L2xpYjsgdGFyIGNmIC0gLiApIHwgKGNkICR7VEFSR0VUX0xJQl9ESVJ9OyB0YXIgeGYgLSApOyBcCisgKGNkICR7U1RMUE9SVF9TUkN9OyB0YXIgY2YgLSBzdGxwb3J0KSB8IChjZCAke1RBUkdFVF9JTkNMVURFX0RJUn07IHRhciB4ZiAtICkKKworU29tZXRpbWVzIHdlIHdpbGwgdGhpbmsgYWJvdXQgJ21ha2UgaW5zdGFsbCcsIGJ1dCBub3Qgbm93LgorCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitRNS4wIEkgZm91bmQgYSBidWcsIGhvdyBJIGNhbiByZXBvcnQgYWJvdXQgaXQ/CisKK0E1LjAgCisgIDAuIEVuc3VyZSB0aGF0IHRoaXMgaXMgcmVhbGx5IGEgYnVnIChzdGFuZGFyZCB2aW9sYXRpb24sIGluY29ycmVjdAorICAgICBiZWhhdmlvdXIgd2l0aCBjb3JyZWN0IHVzYWdlKS4KKyAgMS4gRW5zdXJlIHRoYXQgYnVnIGlzIGluIFNUTHBvcnQsIG5vdCBpbiB5b3VyIGNvZGUgKHlvdSBjYW4gdXNlIF9TVExQX0RFQlVHCisgICAgIGZvciB0aGF0LCBzZWUgc3RscG9ydC9zdGwvY29uZmlnL3VzZXJfY29uZmlnLmgpLgorICAyLiBFbnN1cmUgdGhhdCB5b3UgY29ycmVjdGx5IGJ1aWx0IFNUTHBvcnQtLS1idWlsZCBhbmQgcnVuIHVuaXQgdGVzdHMKKyAgICAgKGJ1aWxkL3Rlc3QvdW5pdCkgZmlyc3Qgd2l0aCBkZWZhdWx0IHNldHRpbmdzLCB0aGVuIHdpdGggeW91ciBzZXR0aW5ncworICAgICAoaWYgeW91IGNoYW5nZWQgYW55KS4KKyAgMy4gV3JpdGUgYSBzaG9ydCB0ZXN0IHRoYXQgZGVtb25zdHJhdGVzIHRoZSBidWcuCisgIDQuIE1ha2Ugc3VyZSB0aGF0IHRoaXMgdGVzdCBjYXNlIGlzIHJlYWxseSBuZXcsIGkuZS4gbm90IGNvdmVyZWQgYnkgdW5pdCAKKyAgICAgdGVzdHMgKHRlc3QvdW5pdC8qKS4KKyAgNS4gQ29tcGFyZSB5b3VyIHJlc3VsdHMgd2l0aCByZXBvcnRlZCBydW5zIG9mIHVuaXQgdGVzdHMgKGJ1aWxkL3Rlc3QvdW5pdC9TVEFUVVMpLgorICA2LiBXcml0ZSBidWcgZGVzY3JpcHRpb24gYW5kIHRlc3QgaGVyZQorICAgICAKKyAgICAgaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvc3RscG9ydAorCisgICAgIERPTidUIEZPUkdFVCBUTyBERVNDUklCRToKKworICAgICAgIC0gT1BFUkFUSU9OQUwgRU5WSVJPTk1FTlQKKyAgICAgICAtIENPTVBJTEVSIFZFUlNJT04KKyAgICAgICAtIFNUTFBPUlQgVkVSU0lPTgorICAgICAgIC0gUkVTVUxUIE9GIFVOSVQgVEVTVFMKKworICAgICBLZWVwIGluIG1pbmQsIHRoYXQgeW91ciBidWcgTVVTVCBiZSByZXByb2R1Y2VkIGJ5IG90aGVyIHBlb3BsZSwgc28gZ2l2ZQorICAgICBlbm91Z2ggaW5mb3JtYXRpb24gKGJ1dCBjb21wYWN0bHksIGdpdmUgb25seSBlc3NlbnRpYWwgaW5mb3JtYXRpb24pLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUTYuMCBJbiBTVExwb3J0IGZpbGVzIGxpa2UgbG9jYWxlLmgsIHNldGptcC5oLCBzdGRsaWIuaCwgZXRjLiwgZG8gCitub3RoaW5nIGV4Y2VwdCBpbmNsdWRlIG5hdGl2ZSBoZWFkZXJzLiBXaHkgYXJlIHRoZXNlIGZpbGVzIHByZXNlbnQgaW4gU1RMcG9ydD8KKworQTYuMCBTb21ldGltZXMgbmF0aXZlIEMgaGVhZGVycyBhcmUgdXNpbmcgQysrIG9uZXMgb3IgYXJlIHJlZmVyaW5nCit0byB0aGUgc3RkIG5hbWVzcGFjZS4gVGhhdCdzIHdoeSwgaWYgc3RkZGVmIHdhcyBhYnNlbnQgaW4gU1RMcG9ydCwgdGhlbgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCittYXkgY2F1c2UgcHJvYmxlbSBpbiBmb2xsb3dpbmcgY29kZSwgYmVjYXVzZSBzdGQgcmVkZWZpbmVkIGluIHRoZSBlbmQgb2YKKzxzdHJpbmc+IGhlYWRlciwgYW5kIHN0ZCBtYXkgYmUgdXNlZCBpbiBzdGRkZWYuaDoKKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisuLi4uCitfX0VORF9OQU1FU1BBQ0VfU1RECisKK3doZXJlIF9fQkVHSU5fTkFNRVNQQUNFX1NURCBpcyBkZWZpbmVkIGFzICduYW1lc3BhY2Ugc3RkIHsnLgorVG8gYXZvaWQgdGhpcywgU1RMcG9ydCBoYXMgc3RkZGVmLmggaGVhZGVyIGFuZCBwcm92aWRlIGNvcnJlY3QgbWFzcXVlcmFkZQorZm9yIHN0ZC4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1E2LjEgSXMgU1RMcG9ydCBhIHJlcGxhY2VtZW50IGZvciBoZWFkZXJzIGFuZCBsaWJyYXJpZXMgdGhhdCBzaGlwb3V0Cit3aXRoIGNvbXBpbGVyPworCitBNi4xIEluIGdlbmVyYWwgbm8uIEluIGFueSBjYXNlIEMrKyBsYW5ndWFnZSBzdXBwb3J0IGZyb20gY29tcGlsZXIgaXMgcmVxdWlyZWQKK2ZvciBTVExwb3J0IChvcGVyYXRvcnMgbmV3LCBkZWxldGUsIFJUVEksIGV4Y2VwdGlvbnMgc3VwcG9ydCkuIFNUTHBvcnQgYWxzbwordXNlcyAnbmF0aXZlJyBoZWFkZXJzIGFuZCBsaWJyYXJpZXMgdG8gdGFrZSBpbnRlcmZhY2UgdG8gc3lzdGVtIGZ1bmN0aW9ucyBhbmQKK3ZhcmlhYmxlcy4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1E2LjIgTXkgdG9vbCBkZXRlY3RzIG1lbW9yeSBsZWFrcyBpbiBhcHBsaWNhdGlvbiB3aXRoIFNUTHBvcnQuIElzIHRoaXMgbGVhaworZnJvbSBTVExwb3J0PworCitBNi4yIEluIG1vc3QgY2FzZXMgdGhlc2UgYXJlICdwc2V1ZG8gbWVtb3J5IGxlYWtzJyB0aGF0IHNvbWUgdG9vbHMgCit3cm9uZ2x5IGRldGVjdC4KKworSW4gdGhlIGRlZmF1bHQgY29tcGlsZSBvZiBTVExwb3J0LCB0aGUgbm9kZSBhbGxvY2F0b3IgaXMgdXNlZCB0byBhbGxvY2F0ZQoraW50ZXJuYWwgbWVtb3J5LiBUaGUgbm9kZSBhbGxvY2F0b3Igd29ya3MgYnkgcHJlLWFsbG9jYXRpbmcgYSBsYXJnZSBjaHVuayBvZgorbWVtb3J5IGFuZCBoYW5kaW5nIG91dCBzbWFsbCBtZW1vcnkgYmxvY2tzLiBUaGUgbWVtb3J5IGNodW5rIGlzIG5vdCBmcmVlZAorZHVyaW5nIHJ1bm5pbmcgYW4gYXBwbGljYXRpb24gdGhhdCB1c2VzIFNUTHBvcnQgKGkuZS4gaXQgaXMgbm90IHJldHVybmVkIHRvIAordGhlIHN5c3RlbSwgYnV0IHJldXNlZCBpbnNpZGUgYXBwbGljYXRpb24pLiAKK1NlZSBhbHNvIGh0dHA6Ly93d3cuc2dpLmNvbS90ZWNoL3N0bC9hbGxvYy5odG1sCisKK1RoZXJlIGFyZSB0b29scyBsaWtlIEJvdW5kc0NoZWNrZXIsIFB1cmlmeSBvciBWYWxncmluZCB0aGF0IGNoZWNrIGZvciBtZW1vcnkKK2xlYWtzLCBmb3IgbWVtb3J5IHRoYXQgaXNuJ3QgZnJlZWQgd2hlbiBubyBsb25nZXIgdXNlZC4gVGhlc2UgdG9vbHMgbWF5IHJlcG9ydAorZmFsc2UgbWVtb3J5IGxlYWtzIHdoZW4gb25lIHVzZXMgU1RMcG9ydCdzIG5vZGUgYWxsb2NhdG9yLiBUaGUgbWVtb3J5IGNodW5rIGlzCitub3JtYWxseSBmcmVlZCBhdCBhcHBsaWNhdGlvbiBlbmQsIGJ1dCB0aGUgbWVtb3J5IGNoZWNrZXJzIHVzdWFsbHkgcmVwb3J0IG1lbW9yeQorbGVha3MgYmVmb3JlIHRoYXQgcG9pbnQuIEFub3RoZXIgbWVtb3J5IHByb2JsZW0gbWlnaHQgYmUgcmVwb3J0ZWQgd2hlbiB5b3UgdXNlCitzaGFyZWQgbGlicmFyaWVzIChlLmcuIERMTCwgdGhpcyBwcm9ibGVtIHNwZWNpZmljIGZvciBXaW5kb3dzIERMTCBtb2RlbCkgdGhhdAordXNlcyBTVExwb3J0IGludGVybmFsbHkgYW5kIGFyZSBzdGF0aWNhbGx5IGxpbmsgdG8gaXQuIElmIG1lbW9yeSBpcyBhbGxvY2F0ZWQgaW4KK2EgZGxsIGFuZCByZWxlYXNlZCBpbiBhbiBvdGhlciB0aGVuIHRoZSBTVExwb3J0IG5vZGUgYWxsb2NhdG9yIHdpbGwga2VlcCB0aGUKK3JlbGVhc2VkIG1lbW9yeSBmb3IgYSBmdXR1cmUgdXNlLiBJZiB5b3UgZG8gbm90IHVzZSB0aGlzIG1lbW9yeSB0aGVuIHlvdXIKK2FwcGxpY2F0aW9uIGdsb2JhbCBtZW1vcnkgY29uc3VtcHRpb24gd2lsbCBncm93IHVudGlsIHRoZSBhcHAgY3Jhc2ggZXZlbiBpZiB0aGVyZQoraXMgbm8gcmVhbCBtZW1vcnkgbGVhay4gVGhpcyBpcyB3aHkgeW91IHNob3VsZCBhbHdheXMgdXNlIGEgY29oZXJlbnQgY29uZmlndXJhdGlvbgorZXZlcnl0aGluZyBpbiBkbGwgb3IgZXZlcnl0aGluZyBpbiBzdGF0aWMgbGliLgorCitUaGVyZSBhcmUgd2F5cyB0byByZW1vdmUgdGhlIHBzZXVkbyBtZW1vcnkgbGVha3MgKHNpbmNlIHRoZSBtZW1vcnkgaXMgcHJvcGVybHkKK2ZyZWVkIGF0IHRoZSBlbmQgb2YgdGhlIHByb2dyYW0sIHRoZSBsZWFrcyBhcmUganVzdCBwc2V1ZG8tb25lcykuIFlvdSBjb3VsZCB1c2UKK2Fub3RoZXIgYWxsb2NhdG9yIHRoYXQgaXMgdXNlZCBpbiBTVExwb3J0LiBPcGVuIHRoZSBmaWxlCisiLi9zdGxwb3J0L3N0bC9jb25maWcvaG9zdC5oIiBhbmQgdW5jb21tZW50IGVpdGhlciBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKworCisgICBfU1RMUF9VU0VfTkVXQUxMT0MgICBlbmFibGVzIGEgc2ltcGxlIGFsbG9jYXRvciB0aGF0IHVzZXMgIm5ldy9kZWxldGUiCisgICBfU1RMUF9VU0VfTUFMTE9DICAgICBlbmFibGVzIGEgc2ltcGxlIGFsbG9jYXRvciB0aGF0IHVzZXMgIm1hbGxvYy9mcmVlIgorCitUaGUgbmV3L2RlbGV0ZSBhbGxvY2F0b3IgaGFzIHRoZSBhZHZhbnRhZ2Ugb2YgZ2l2aW5nIGFuIGVudHJ5IHBvaW50IHRvIHRyYWNrCittZW1vcnkgc3RhcnZhdGlvbiwgc2VlIHNldF9uZXdfaGFuZGxlciBpbiB5b3VyIGNvbXBpbGVyIGRvYyBvciB0aGUgQysrIFN0YW5kYXJkCitmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworQWx0ZXJuYXRpdmVseSB5b3UgY2FuIGRlZmluZSB0aGUgZm9sbG93aW5nIHN5bWJvbCwganVzdCB1bmNvbW1lbnQgaXQgaW4KKyIuL3N0bHBvcnQvc3RsL2NvbmZpZy9ob3N0LmgiLgorCisgICBfU1RMUF9MRUFLU19QRURBTlRJQworCitUaGUgc3ltYm9sIGZvcmNlcyBmcmVlaW5nIGFsbCBtZW1vcnkgY2h1bmtzLiBBbHNvIHNlZSB0aGUgY29tbWVudHMgYXJvdW5kIHRoZQorc3ltYm9sIGluIHRoZSBjb25maWcgZmlsZS4KKworTm90ZSB0aGF0IHlvdSBoYXZlIHRvIHJlY29tcGlsZSBTVExwb3J0IEFORCB5b3VyIGFwcGxpY2F0aW9uIGFuZCBhbGwgb2YgeW91cgorZGVwZW5kZW50IGxpYnJhcmllcyBpZiB5b3UgbWFrZSBhbnkgY2hhbmdlIHRvIHRoZSBmaWxlIQorCitUaGVyZSBhcmUgYWxzbyBzb21lIGRlZmluZXMgdGhhdCBoZWxwIGluIGRlYnVnZ2luZyBtZW1vcnkgcHJvYmxlbXMgaW4gU1RMcG9ydC4KK0luIF9TVExQX0RFQlVHIG1vZGUsIGp1c3QgYWxzbyBkZWZpbmUgdGhlIGZvbGxvd2luZyBzeW1ib2xzLCBlaXRoZXIgaW4KKyIuL3N0bHBvcnQvc3RsL2NvbmZpZy91c2VyX2NvbmZpZy5oIiBvciBpbiB5b3VyIHByb2plY3Qgc2V0dGluZ3M6CisKKyAgIF9TVExQX0RFQlVHX0FMTE9DCisgICBfU1RMUF9ERUJVR19VTklOSVRJQUxJWkVECisKK1lvdSBkb24ndCBuZWVkIHRvIHJlYnVpbGQgU1RMcG9ydCBmb3IgdGhlc2Ugb3B0aW9ucywgYnV0IHlvdSBoYXZlIHRvIHJlYnVpbGQKK3lvdXIgYXBwbGljYXRpb24gYW5kIGFsbCBvZiB5b3VyIGRlcGVuZGVudCBsaWJyYXJpZXMgaWYgeW91IG1ha2UgYW55IGNoYW5nZSB0bwordGhlIGZpbGUuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitRNi4zIFdoZW4gcnVubmluZyB1bml0IHRlc3RzLCBJIGhhdmUgZXJyb3JzIGluIExvY2FsZVRlc3QgdGVzdCBmaXh0dXJlLCBob3cgYmFkCitpcyBpdD8KKworQTYuMyBGYWlsdXJlcyBpbiBMb2NhbGVUZXN0IHRlc3RzIGRvIG5vdCBtZWFuIHRoYXQgeW91ciBwbGF0Zm9ybS9jb21waWxlciBpcyBub3QKK2Z1bGx5IHN1cHBvcnRlZCBieSBTVExwb3J0LiBQbGF0Zm9ybSBpbmRlcGVuZGFudCBsb2NhbGl6YXRpb24gdGVzdHMgYXJlIHZlcnkgaGFyZAordG8gd3JpdGUgYXMgU3RhbmRhcmQgbG9jYWxpemF0aW9uIEFQSSBoYXMgbm90IGJlZW4gZGVzaWduIHRvIG1ha2UgdW5pdCB0ZXN0IGVhc3kuCitJbiBTVExwb3J0IHVuaXQgdGVzdHMgc3VpdGUgd2UgaGF2ZSBoYXJkIGNvZGVkIHNvbWUgZXhwZWN0ZWQgdmFsdWVzLiBUaG9zZSB2YWx1ZXMKK2RlcGVuZHMgb24geW91ciBPUyBjb25maWd1cmF0aW9uIGV4cGxhaW5pbmcgd2h5IHNvbWV0aW1lcyB0aGUgdGVzdHMgYXJlIGZhaWxpbmcuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitRNi40IHNldCBvciBtdWx0aXNldCBpdGVyYXRvcnMgYXJlIGltbXV0YWJsZSBsaWtlIGNvbnN0X2l0ZXJhdG9ycywgd2h5ID8KKworQTYuNCBXaXRoIHNldCBvciBtdWx0aXNldCBhc3NvY2lhdGl2ZSBjb250YWluZXJzIG9yIGV2ZW4gbmV3bHkgaW50cm9kdWNlZAordHIxOjp1bm9yZGVyZWRfc2V0IGFuZCB0cjE6OnVub3JkZXJlZF9tdWx0aXNldCBrZXkgaXMgY29uZnVzZSB3aXRoIGRhdGEuIEl0CittZWFucyB0aGF0IG1vZGlmeWluZyB0aGUgZGF0YSBpcyBhbHNvIG1vZGlmeWluZyB0aGUga2V5LiBNb2RpZnlpbmcgdGhlIGtleQorbWlnaHQgY29ycnVwdCB0aGUgY29udGFpbmVyIGludGVybmFsIGRhdGEgc3RydWN0dXJlIHNvIFNUTHBvcnQgcHJlZmVyIHRvCittYWtlIHRoaXMgcHJvYmxlbSBvYnZpb3VzIGFuZCBvbmx5IHJldHVybiBhIGNvbnN0IGFjY2VzcyB0byB0aGUga2V5IHdpdGgKK2ltbXV0YWJsZSBpdGVyYXRvcnMuIFlvdXIgc29sdXRpb25zIGFyZToKKy0gcHJlZmVyIG1hcC9tdWx0aW1hcCBhbmQgc3BsaXQgdGhlIGtleSBhbmQgdGhlIGRhdGEKKy0gdXNlIGNvbnN0X2Nhc3Qgd2hlbiB5b3Ugd2FudCB0byBjaGFuZ2UgYSBzZXQvbXVsdGlzZXQgZWxlbWVudC4KKwpkaWZmIC0tZ2l0IGEvZG9jL1JFQURNRS5ib3JsYW5kIGIvZG9jL1JFQURNRS5ib3JsYW5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZjE2ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvUkVBRE1FLmJvcmxhbmQKQEAgLTAsMCArMSwxNTQgQEAKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1NUTHBvcnQgUkVBRE1FIGZvciBCb3JsYW5kIEMrKyBjb21waWxlcnMuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitieTogRnJhbmNvaXMgRHVtb250LCBkdW1zQHN0bHBvcnQuY29tLCBsYXN0IGVkaXRlZCAyMCBNYXkgMjAwNgorCis9PT09PT09PT09PT0KK0ludHJvZHVjdGlvbgorPT09PT09PT09PT09CitUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyBob3cgU1RMcG9ydCBjYW4gYmUgY29tcGlsZWQgYW5kIHVzZWQgd2l0aAorQm9ybGFuZCBjb21waWxlcnMuCisKK0ZvciBhbnkgZnVydGhlciBjb21tZW50cyBvciBxdWVzdGlvbnMgdmlzaXQgU1RMcG9ydCBtYWlsaW5nIGxpc3RzCitodHRwOi8vc3RscG9ydC5zb3VyY2Vmb3JnZS5uZXQvTWFpbGxpc3RzLnNodG1sIG9yIGZvcnVtcworaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvZm9ydW0vP2dyb3VwX2lkPTE0NjgxNAorCis9PT09PT09PT09PT09CitQcmVyZXF1aXNpdGVzCis9PT09PT09PT09PT09CitUbyBidWlsZCBhbmQgdXNlIFNUTHBvcnQgeW91IHdpbGwgbmVlZCBmb2xsb3dpbmcgdG9vbHMgYW5kIGxpYnJhcmllczoKKyAtIEJvcmxhbmQgQysrIGNvbXBpbGVyIHBhY2thZ2UgNS41LjEgb3IgaGlnaGVyIHZlcnNpb24uCisKKyAgICBJbiBvcmRlciB0byBidWlsZCBTVExwb3J0IHRoZSBCb3JsYW5kIGNvbXBpbGVyIGFuZCBsaW5rZXIgaGF2ZSB0bworICBiZSBjb3JyZWN0bHkgY29uZmlndXJhdGVkIHRvby4gVGhhdCBpcyB0byBzYXk6CisKKyAgICAqIEZvciB0aGUgQm9ybGFuZCBjb21waWxlciBiY2MzMjoKKworICAgIEluIEJvcmxhbmQncyAnYmluJyBkaXJlY3RvcnkgKHNhbWUgZGlyZWN0b3J5IGFzIGJjYzMyLmV4ZSksIGNyZWF0ZSBhIAorICBiY2MzMi5jZmcgZmlsZSBjb250YWluaW5nIHRoZSBjb21waWxlciBvcHRpb24gZ2l2aW5nIGl0IHRoZSBwYXRoIHRvIAorICBuYXRpdmUgQm9ybGFuZCBoZWFkZXJzOgorCisJLUklQk9STEFORF9QQVRIJVxCQ0M1NVxpbmNsdWRlCisKKyAgICAqIEZvciB0aGUgcmVzb3VyY2UgY29tcGlsZXIgYnJjYzMyOgorCisgICAgQ3JlYXRlIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIElOQ0xVREUgY29udGFpbmluZyBwYXRoIHRvIG5hdGl2ZSBCb3JsYW5kCisgICAgaGVhZGVycyBhbmQgZXNwZWNpYWxseSB0aGUgd2luZG93cy5oIGZpbGUKKworCXNldCBJTkNMVURFPSVCT1JMQU5EX1BBVEglXEJDQzU1XGluY2x1ZGUKKworICAgICogRm9yIHRoZSBCb3JsYW5kIGxpbmtlciBpbGluazMyOgorCisgICAgWW91IG5lZWQgdG8gZ2l2ZSBwYXRoIHRvIGJvdGggdGhlIEJvcmxhbmQgbGlicyBhbmQgQm9ybGFuZCBQU0RLIGxpYnMuCisgICAgRm9yIHRoYXQgeW91IGhhdmUgdG8gY3JlYXRlLCBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgaWxpbmszMi5leGUsIGEgCisgICAgY29uZmlndXJhdGlvbiBmaWxlLCBpbGluazMyLmNmZywgdGhhdCBjb250YWluczoKKworCS1MJUJPUkxBTkRfUEFUSCVcQkNDNTVcbGliOyVCT1JMQU5EX1BBVEglXEJDQzU1XGxpYlxQU0RLCisKKyAtIEEgR05VIG1ha2UgdG9vbC4gWW91IGNhbiBnZXQgb25lIGZyb20gd3d3Lm1pbmd3Lm9yZyBvciB3d3cuY3lnd2luLmNvbS4KKyAgIFNlZSBSRUFETUUubWluZ3cgb3IgUkVBRE1FLmN5Z3dpbiBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbnMuCisKKz09PT09PT09PT09PT09PT09PT0KK0NvbmZpZ3VyaW5nIFNUTHBvcnQKKz09PT09PT09PT09PT09PT09PT0KKyAgVGhpcyBpcyBpbnRlbmRlZCB0byBiZSBhbiBvcHRpb25hbCBzdGVwLCBpZiB5b3Ugd2FudCB0byB1c2UgZGVmYXVsdAorY29uZmlndXJhdGlvbiBzaW1wbHkganVtcCB0byBuZXh0IGNoYXB0ZXIgJ0J1aWxkaW5nIFNUTHBvcnQnLiBPcGVuIGEgY29uc29sZQorYW5kIGdvIHRvIHRoZSBTVExwb3J0IGJ1aWxkL2xpYiBmb2xkZXIuIFJ1bgorCisJY29uZmlndXJlIC0taGVscAorCisgIFRoaXMgY29tbWFuZCB3aWxsIHByZXNlbnQgeW91IHRoZSBkaWZmZXJlbnQgYXZhaWxhYmxlIGJ1aWxkIG9wdGlvbnMuIEp1c3QgZm9sbG93Cit0aGUgaW5zdHJ1Y3Rpb25zIHRvIHNldCBTVExwb3J0IGNvbmZpZ3VyYXRpb24gYWNjb3JkaW5nIHlvdXIgbmVlZHMuIEZvciBleGFtcGxlLAordG8gc2V0IHRoZSB0eXBpY2FsIGNvbmZpZ3VyYXRpb24gZm9yIG1vc3QgQm9ybGFuZCBjb21waWxlcnMsIHJ1biAKKworICAgIGNvbmZpZ3VyZSAtYyBiY2MKKworPT09PT09PT09PT09PT09PQorQnVpbGRpbmcgU1RMcG9ydAorPT09PT09PT09PT09PT09PQorICBUaGlzIGlzIGEgc3RlcCBieSBzdGVwIGRlc2NyaXB0aW9uIG9mIHRoZSBhY3Rpb25zIHRvIHRha2UgaW4gb3JkZXIgdG8gYnVpbGQgCithbmQgaW5zdGFsbCB0aGUgU1RMcG9ydCBsaWJyYXJpZXM6CisKKzEuIE9wZW4gYSBjb25zb2xlLCB5b3UgY2FuIHVzZSBhIE1zeXMsIEN5Z3dpbiBvciBXaW5kb3dzIGNvbnNvbGUuCisKKzIuIEdvIHRvIHRoZSBTVExwb3J0IGJ1aWxkL2xpYiBmb2xkZXI6CisJY2QgQzpcU1RMcG9ydFxidWlsZFxsaWIKKworMy4gUnVuIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKKwltYWtlIC1mYmNjLm1hayBpbnN0YWxsCisKKwlXaGVyZSAnbWFrZScgaXMgdGhlIEdOVSBtYWtlIHV0aWxpdHkgeW91IGhhdmUgaW5zdGFsbGVkLiBUaGUgbmFtZSBvZgorR05VIG1ha2UgdXRpbGl0eSBtYXkgZGlmZmVyLCBzdWNoIGFzICdtaW5ndzMyLW1ha2UnLiAgLWYgaXMgYSBtYWtlIG9wdGlvbgordGVsbGluZyBpdCB3aGljaCBtYWtlZmlsZSB0byB1c2UuIFlvdSBoYXZlIG9mIGNvdXJzZSB0byBjaG9vc2UgdGhlIAorYXBwcm9wcmlhdGUgbWFrZWZpbGUgZm9yIHlvdXIgY29tcGlsZXIsICdiY2MubWFrJyBpbiBvdXIgY2FzZS4KKworCU9uY2UgdGhlIGNvbW1hbmQgcmV0dXJucyB5b3Ugd2lsbCBoYXZlIGFsbCB0aGUgbmVjZXNzYXJ5IGltcG9ydCBsaWJyYXJpZXMgCitpbiBTVExwb3J0J3MgJ2xpYicgZm9sZGVyIGFuZCBETExzIGluIFNUTHBvcnQncyAnYmluJyBmb2xkZXIuICBGb3IgYSAKK2Rlc2NyaXB0aW9uIG9mIHRoZSBnZW5lcmF0ZWQgbGlicmFyaWVzIGNoZWNrIHRoZSBGQVEgZmlsZSBpbiB0aGUgJ2RvYycgZm9sZGVyLiAgCitGb3IgYSBxdWljayBzdGFydCBndWlkZSB0byB0aGUgU1RMcG9ydCBtYWtlIHN5c3RlbSwgc2VlIHRoZSBSRUFETUUgZmlsZSBpbiB0aGUgCisnYnVpbGQvbGliJyBmb2xkZXIuCisKKz09PT09PT09PT09PT09PQorVGVzdGluZyBTVExwb3J0Cis9PT09PT09PT09PT09PT0KK1lvdSBjYW4gdXNlIHRoZSB1bml0IHRlc3RzIHRvIHZlcmlmeSBTVExwb3J0IGJlaGF2ZXMgY29ycmVjdGx5LiBDaGFuZ2UgaW50bworU1RMcG9ydCdzICdidWlsZC90ZXN0L3VuaXQnIGZvbGRlciBhbmQgdHlwZToKKworICBtYWtlIC1mYmNjLm1hayBpbnN0YWxsCisKK1RoaXMgd2lsbCBidWlsZCBhbmQgaW5zdGFsbCB0aGUgdW5pdCB0ZXN0cyB3aXRoIFNUTHBvcnQgZHluYW1pYyBsaWJyYXJpZXMuCitPbmNlIHRoZSB1bml0IHRlc3RzIGFyZSBidWlsdCB5b3UganVzdCBuZWVkIHRvIHJ1biB0aGVtLiAgVGhleSBjYW4gYmUgZm91bmQKK2luIFNUTHBvcnQncyBiaW4sIGJpbi1nIG9yIGJpbi1zdGxnIGZvbGRlcnMuICBUbyByZWJ1aWxkIHRoZSB1bml0IHRlc3RzIAord2l0aCBTVExwb3J0IHN0YXRpYyBsaWJyYXJpZXMsIHR5cGU6CisKKyAgbWFrZSAtZmJjYy5tYWsgY2xlYW4KKyAgbWFrZSAtZmJjYy5tYWsgaW5zdGFsbC1zdGF0aWMKKworPT09PT09PT09PT09PQorVXNpbmcgU1RMcG9ydAorPT09PT09PT09PT09PQorQWRqdXN0IHlvdXIgaW5jbHVkZSBhbmQgbGluayBwYXRocyBpbiBCb3JsYW5kIElERSBvciBpbiB0aGUgY29tbWFuZCBsaW5lIGNvbmZpZworZmlsZXMuIEluIHRoZSBpbmNsdWRlIGZpbGVzIGFkZCB0aGUgcGF0aCB0byBTVExwb3J0J3MgJ3N0bHBvcnQnIGZvbGRlci4gTWFrZSBzdXJlCitpdCBpcyB0aGUgZmlyc3QgZGlyZWN0b3J5IGxpc3RlZCB0aGVyZS4gQWRkIFNUTHBvcnQncyAnbGliJyBmb2xkZXIgZm9yIHRoZSBsaWJyYXJ5CitmaWxlcyAob3JkZXIgb2YgcGF0aHMgZG9lc24ndCBtYXR0ZXIgaGVyZSkuCisKK05vdyB5b3Ugc2hvdWxkIGJlIHJlYWR5IHRvIHVzZSBTVExwb3J0LgorCis9PT09PT09PT09PT0KK0tub3duIGxpbWl0YXRpb25zCis9PT09PT09PT09PT0KKworMS4gSWYgeW91IGV4dGVuZCBhIGxvY2FsZSBmYWNldCBiYXNlZCBvbiBhIFN0YW5kYXJkIGZhY2V0IGRlZmluaXRpb24geW91IHdpbGwKK2hhdmUgdG8gZ3JhbnQgeW91ciBvd24gZmFjZXQgaWQgZGVmaXRpb24uIEV4IGV4dHJhY3RlZCBmcm9tCit0ZXN0L3VuaXQvZnN0cmVhbV90ZXN0LmNwcDoKKworI2luY2x1ZGUgPGxvY2FsZT4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworc3RydWN0IG15X3N0YXRlIHsKKyAgY2hhciBkdW1teTsKK307CisKK3N0cnVjdCBteV90cmFpdHMgOiBwdWJsaWMgY2hhcl90cmFpdHM8Y2hhcj4geworICB0eXBlZGVmIG15X3N0YXRlIHN0YXRlX3R5cGU7CisgIHR5cGVkZWYgZnBvczxzdGF0ZV90eXBlPiBwb3NfdHlwZTsKK307CisKK2NsYXNzIG15X2NvZGVjdnQgOiBwdWJsaWMgY29kZWN2dDxjaGFyLCBjaGFyLCBteV9zdGF0ZT4KK3t9OworCisvLyBNYW5kYXRvcnkgbG9jYWxlIGZhY2V0IGlkIGRlZmluaXRpb246Cit0ZW1wbGF0ZSA8PgorbG9jYWxlOjppZCBjb2RlY3Z0PGNoYXIsIGNoYXIsIG15X3N0YXRlPjo6aWQ7CisKKzIuIElmIHlvdSBnZXQgYSBsaW5rZXIgbWVtb3J5IGVycm9yLCBlLmcuIExNRTM1MSwgaXQgcHJvYmFibHkgbWVhbnMgdGhhdCBmdWxsCitzb3VyY2UgZGVidWdnaW5nIGlzIGVuYWJsZWQgYW5kIEJvcmxhbmQncyAuVERTIGZpbGUgaGFzIGV4Y2VlZGVkIHRoZSBtZW1vcnkgCitjYXBhY2l0eSBvZiBCb3JsYW5kJ3MgbGlua2VyIChpbGluazMyLmV4ZSkuICBUbyByZXNvbHZlIHRoaXMgZXJyb3IsIGNoZWNrCitCb3JsYW5kJ3Mgd2Vic2l0ZSBmb3IgdGhlIGxhdGVzdCBwYXRjaCBmb3IgaWxpbmszMi5leGUuICBJbiB0aGUgYWx0ZXJuYXRpdmUsCitkaXNhYmxlIGZ1bGwgc291cmNlIGRlYnVnZ2luZyBpbiBidWlsZFxNYWtlZmlsZXNcZ21ha2VcYmNjLm1hayBieSBkZWxldGluZyAKK3RoZSAtdiBvcHRpb24gaW4gdGhlIE9QVCBzZXR0aW5ncy4KKworMy4gRm9yICIndW5hbWUnIGlzIG5vdCByZWNvZ25pemVkIC4gLiAuIiwgc2VlICJDb25maWd1cmluZyBTVExwb3J0IiBhYm92ZS4gCmRpZmYgLS1naXQgYS9kb2MvUkVBRE1FLmN5Z3dpbiBiL2RvYy9SRUFETUUuY3lnd2luCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0YWQ0NDkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvUkVBRE1FLmN5Z3dpbgpAQCAtMCwwICsxLDQzIEBACitUaGUgY3lnd2luIHBsYXRmb3JtIGlzIHVzZWQgdG8gYnVpbGQgU1RMcG9ydCB3aXRoIGRpZmZlcmVudCBjb21waWxlcnMuCisKKy0gZ2NjIChuYXRpdmUgY29tcGlsZXIpOgorCisgIE1ha2VmaWxlIDogZ2NjLm1haworCisgIE5vdGVzOgorCisgICAgMS4gU3RhdGljIGJ1aWxkcyAoYXJjaGl2ZSkKKworICAgIElmIHlvdSB1c2UgdGhlIHN0YXRpYyB2ZXJzaW9uIG9mIHRoZSBTVExwb3J0IGxpYnJhcmllcyB5b3UgaGF2ZQorICB0byBkZWZpbmUgdGhlIF9TVExQX1VTRV9TVEFUSUNfTElCIG1hY3JvIGluIG9yZGVyIHRvIGhhdmUgeW91cgorICBleGVjdXRhYmxlIGxpbmtlZCBjb3JyZWN0bHkuCisKKyAgICAyLiBMaW5rCisKKyAgICBVbmRlciB0aGlzIHBsYXRmb3JtIFNUTHBvcnQgaXMgY29tcGxldGUgcmVwbGFjZW1lbnQgZm9yIGxpYnN0ZGMrKy4KKyAgSXQgbWVhbnMgdGhhdCB3aGVuIHlvdSB3ZXJlIGxpbmtpbmcgd2l0aCBsaWJzdGRjKysgKC1sc3RkYysrKSB5b3Ugb25seQorICBoYXZlIHRvIHJlcGxhY2UgaXQgd2l0aCBTVExwb3J0ICgtbHN0bHBvcnQuNS4yIGZvciBpbnN0YW5jZSkuIEhvd2V2ZXIKKyAgZGVmYXVsdCBnY2MgYmVoYXZpb3IgaXMgdG8gYXV0b21hdGljYWxseSBsaW5rIGxpYnN0ZGMrKyBhbmQgYSBudW1iZXIgb2YKKyAgb3RoZXIgc3lzdGVtIGxpYnMuIFRvIGF2b2lkIHRoaXMgYmVoYXZpb3IgeW91IGhhdmUgdG8gdXNlIHRoZSAtbm9kZWZhdWx0bGlicworICBjb21waWxlciBvcHRpb24gYW5kIGV4cGxpY2l0ZWx5IGdpdmUgYWxsIGxpYnJhcmllcyBieSB5b3Vyc2VsZi4gU2VlIGJ1aWxkIG9mCisgIHVuaXQgdGVzdHMgdG8gc2VlIHdoYXQgbGlicmFyeSB5b3UgbWlnaHQgbmVlZCwgaGVyZSBpcyB0aGUgbGlzdCB3aGVuIHRoaXMKKyAgbm90ZSB3YXMgd3JpdHRlbjoKKworICB3aXRob3V0IC1tbm9jeWd3aW4gb3B0aW9uOgorCisgICAgLWxzdGxwb3J0Zy41LjIgLWxnY2MgLWxtIC1sYyAtbHB0aHJlYWQgLWxrZXJuZWwzMgorCisgIHdpdGggLW1uby1jeWd3aW4gb3B0aW9uOgorCisgICAgLWxzdGxwb3J0Zy41LjIgLWxnY2MgLWxtaW5ndzMyIC1sbWluZ3dleCAtbG1zdmNydCAtbG0gLWxtb2xkbmFtZQorICAgIC1sY29sZG5hbWUgLWxrZXJuZWwzMgorCisgICAgMy4gTm8gY3lnd2luCisKKyAgICBUbyBidWlsZCBTVExwb3J0IGxpYnJhcmllcyB0aGF0IGRvIG5vdCBkZXBlbmQgb24gY3lnd2luMS5kbGwKKyAgbWFraW5nIHRoZW0gZnJlZWx5IHJlZGlzdHJpYnV0YWJsZSBwYXNzIHRoZSBmb2xsb3dpbmcgb3B0aW9uIHRvCisgIHRoZSBjb25maWd1cmUgc2NyaXB0OgorCisgIC4vY29uZmlndXJlIC0td2l0aC1leHRyYS1jZmxhZ3M9LW1uby1jeWd3aW4gLS13aXRoLWV4dHJhLWN4eGZsYWdzPS1tbm8tY3lnd2luCisKKy0gQm9ybGFuZCBDKysgY29tcGlsZXIKZGlmZiAtLWdpdCBhL2RvYy9SRUFETUUuZG1jIGIvZG9jL1JFQURNRS5kbWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U2MDYyZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9SRUFETUUuZG1jCkBAIC0wLDAgKzEsODEgQEAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorU1RMcG9ydCBSRUFETUUgZm9yIERpZ2l0YWwgTWFycyBDKysgY29tcGlsZXJzLg0KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorDQorQnVpbGQgb2YgU1RMcG9ydCB3aXRoIERpZ2l0YWwgTWFycyBDKysgY29tcGlsZXIgaXMgdmVyeSBzaW1pbGFyDQordG8gdGhlIG9uZSBmb3IgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gY29tcGlsZXIgKHNlZSBSRUFETUUubXN2YykuDQorDQorQmVsb3cgYXJlIHNvbWUgYWRkaXRpb25hbCBoaW50cy4gW0RNQyB1c2VycyBhcmUgZW5jb3VyYWdlZCB0byANCitjb250cmlidXRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uXSANCisNCis9PT09PT09PT09PT09DQorUHJlcmVxdWlzaXRlcw0KKz09PT09PT09PT09PT0NCisNCisgLSBEaWdpdGFsIE1hcnMgQysrIDguNDkgb3IgYWJvdmUNCisNCisgLSBBIEdOVSBlbnZpcm9ubWVudCB3aXRoIG1ha2UgdG9vbC4gUHJlZmVyIE1pbkdXL01TeXMgdG8gQ3lnd2luIGJlY2F1c2UgdGhlDQorICAgbGF0dGVyIGNvbnRhaW5zIGEgbGluayBjb21tYW5kIHRoYXQgaXMgYWxzbyB0aGUgbmFtZSBvZiB0aGUgRGlnaXRhbCBNYXJzIGxpbmtlcg0KKyAgIGFuZCB5b3UgbWlnaHQgZXhwZXJpbWVudCBjb2xsaXNpb24gYmV0d2VlbiBib3RoIGNvbW1hbmRzLg0KKyAgIFNlZSBSRUFETUUubWluZ3cgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uDQorDQorPT09PT09PT09PT09PT09PT09PQ0KK0luc3RhbGxpbmcgU1RMcG9ydA0KKz09PT09PT09PT09PT09PT09PT0NCisNCisgLSBTVExwb3J0IGRpcmVjdG9yeSBjYW4gYmUgYWxtb3N0IGFueXdoZXJlIEVYQ0VQVCBuYXRpdmUgZG1caW5jbHVkZSBkaXJlY3RvcnkuDQorDQorPT09PT09PT09PT09PT09PT09PQ0KK0NvbmZpZ3VyaW5nIFNUTHBvcnQNCis9PT09PT09PT09PT09PT09PT09DQorDQorIC0gSW4gYSBjb25zb2xlIHdpbmRvdyBnbyB0byB0aGUgU1RMcG9ydCBidWlsZFxsaWIgZm9sZGVyLiBSdW4NCisNCisJICBjb25maWd1cmUgLWMgZG1jDQorDQorPT09PT09PT09PT09PT09PQ0KK0J1aWxkaW5nIFNUTHBvcnQNCis9PT09PT09PT09PT09PT09DQorDQorIC0gVG8gYnVpbGQgU1RMcG9ydCBsaWJyYXJpZXM6DQorDQorICAgIGNkIFtTVExwb3J0IGRpcl1cYnVpbGRcbGliDQorICAgIFttaW5ndzMyLW1ha2VdIC1mIGRtYy5tYWsgaW5zdGFsbA0KKw0KKyAtIFRvIGJ1aWxkIFNUTHBvcnQgKGR5bmFtaWMpIHVuaXQgdGVzdHM6DQorDQorICAgIGNkIFtTVExwb3J0IGRpcl1cYnVpbGRcdGVzdFx1bml0DQorICAgIFttaW5ndzMyLW1ha2VdIC1mIGRtYy5tYWsgaW5zdGFsbA0KKw0KKz09PT09PT09PT09PQ0KK0tub3duIGlzc3Vlcw0KKz09PT09PT09PT09PQ0KKw0KKzEuIHR5cGVpbmZvLmgNCisNCisgIERNQyBmb3JjZXMgaW5jbHVzaW9uIG9mIHR5cGVpbmZvLmggaGVhZGVyIGF0IHRoZSBiZWdpbmluZyBvZiBhbnkNCit0cmFuc2xhdGlvbiB1bml0LiBUaGlzIGJyZWFrcyB0aGUgU1RMcG9ydCBpbmNsdWRlIHNjaGVtYSwgZXNwZWNpYWxseQ0KK3doZW4gYnVpbGRpbmcgdGhlIGxpYnJhcnkuIEFzIGEgd29ya2Fyb3VuZCBTVExwb3J0IHR5cGVpbmZvLmggc2ltcGx5DQoraW5jbHVkZSBuYXRpdmUgRE1DIGhlYWRlciBub3QgcGVyZm9ybWluZyBhbnkgaW50ZXJuYWwgU1RMcG9ydCB3b3JrIGFzDQoraW1wb3J0aW5nIHRoaW5ncyB0byBTVExwb3J0IG5hbWVzcGFjZS4gQXMgYSByZXN1bHQgdHlwZWluZm8uaCBzaG91bGQNCituZXZlciBiZSByZWZlcmVuY2UgaW4gdXNlciBjb2RlLCBhcyBpdCBpcyBuZWl0aGVyIGEgQyBub3IgYSBDKysgaGVhZGVyDQordGhpcyBpcyBub3QgY29uc2lkZXJlZCBhcyBhIG1ham9yIGxpbWl0YXRpb24uIFRoZSBDKysgU3RhbmRhcmQgaGVhZGVyDQoraXMgdHlwZWluZm8uDQorDQorMi4gbGluay5leGUgYW5kIGxpYi5leGUNCisNCisgIFNUTHBvcnQgbWFrZWZpbGVzIGZvciBETUMgdXNlIGRtX2xpbmsgYW5kIGRtX2xpYiBpbnN0ZWFkIG9mIGxpbmsgYW5kIGxpYiB0bw0KK2F2b2lkIGNvbmZsaWN0cyB3aXRoIG90aGVyIHZlbmRvcnMnIGxpbmtlcnMgYW5kIGFyY2hpdmVycy4gIFRvIGJ1aWxkIFNUTHBvcnQgDQord2l0aCBETUMsIHBsZWFzZSBjb3B5IG9yIHJlbmFtZSB0aGUgZm9sbG93aW5nIGZpbGVzOg0KKyAgDQorICBjb3B5IGRtXGJpblxsaW5rLmV4ZSBkbVxiaW5cZG1fbGluay5leGUNCisgIGNvcHkgZG1cYmluXGxpYi5leGUgZG1cYmluXGRtX2xpYi5leGUNCisNCiszLiBGcmVlIG9ubGluZSB2ZXJzaW9uLiANCisNCisgIElmIERNQydzIGZyZWUgb25saW5lIHZlcnNpb24gcmVwb3J0cyBjb21waWxlciBvciBsaW5rZXIgZXJyb3JzLCB0aGUgDQorc29sdXRpb24gbWF5IGJlIGluIGEgZnJlZSBvbmxpbmUgQ0QgdXBkYXRlLiAgRG93bmxvYWQgYW5kIHVuemlwIGFsbCBmcmVlIA0KK0NEIHBhdGNoZXMgZm9yIHZlcnNpb25zIDguMzAgYW5kIGFib3ZlLCBpbiBjb25zZWN1dGl2ZSBvcmRlciwgb3ZlcndyaXRpbmcNCitwcmV2aW91cyBmaWxlcy4gVGhlbiBpbnN0YWxsIGZyZWUgb25saW5lIHZlcnNpb24gOC40OSBvciBhYm92ZSwgb3ZlcndyaXRpbmcgDQorcHJldmlvdXMgZmlsZXMuIA0KKw0KZGlmZiAtLWdpdCBhL2RvYy9SRUFETUUuZXZjMyBiL2RvYy9SRUFETUUuZXZjMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDJjZDJiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL1JFQURNRS5ldmMzCkBAIC0wLDAgKzEsMTU3IEBACisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1NUTHBvcnQgUkVBRE1FIGZvciBlTWJlZGRlZCBWaXN1YWwgQysrIDMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworYnk6IE1pY2hhZWwgRmluaywgdml2aWRvc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQsIGxhc3QgZWRpdGVkIDIwMDUtMTEtMTUKKworPT09PT09PT09PT09CitJbnRyb2R1Y3Rpb24KKz09PT09PT09PT09PQorVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgaG93IFNUTHBvcnQgY2FuIGJlIGNvbXBpbGVkIGFuZCB1c2VkIHdpdGggTWljcm9zb2Z0CitlTWJlZGRlZCBWaXN1YWwgQysrIDMuCisKK0ZvciBhbnkgZnVydGhlciBjb21tZW50cyBvciBxdWVzdHNpb24gdmlzaXQgU1RMcG9ydCBtYWlsaW5nIGxpc3RzCitodHRwOi8vc3RscG9ydC5zb3VyY2Vmb3JnZS5uZXQvTWFpbGxpc3RzLnNodG1sIG9yIGZvcnVtcworaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvZm9ydW0vP2dyb3VwX2lkPTE0NjgxNAorCisKKz09PT09PT09PT09PT0KK1ByZXJlcXVpc2l0ZXMKKz09PT09PT09PT09PT0KK1RvIGJ1aWxkIGFuZCB1c2UgU1RMcG9ydCB5b3Ugd2lsbCBuZWVkIGZvbGxvd2luZyB0b29scyBhbmQgbGlicmFyaWVzOgorIC0gZU1iZWRkZWQgVmlzdWFsIEMrKyAzLjAKKyAtIGxhdGVzdCBDVlMgdmVyc2lvbiBvZiBTVExwb3J0LCB1c2UgaW5mbyBmcm9tIHBhZ2UKKyAgICdodHRwOi8vc3RscG9ydC5zb3VyY2Vmb3JnZS5uZXQvQ1ZTLnNodG1sJyB0byBnZXQgaXQuCisgICBOb3RlIHRoYXQgeW91IG1heSBoYXZlIHRvIGdldCBhIGRpZmZlcmVudCBicmFuY2gsIHBsZWFzZSBjaGVjayBvdXQgdGhlCisgICBTVExwb3J0IGZvcnVtICJBbm5vdW5jZW1lbnRzIiB3aGljaCBzb3VyY2Vjb2RlIGlzIGJlaW5nIHdvcmtlZCBvbi4KKworPT09PT09PT09PT09PT09PQorQnVpbGRpbmcgU1RMcG9ydAorPT09PT09PT09PT09PT09PQorTm90ZTogaWYgeW91IGRvbid0IHBsYW4gdG8gdXNlIHRoZSBpb3N0cmVhbXMgcGFydCBvZiBTVExwb3J0ICh2aWEgdGhlIGRlZmluZQorX1NUTFBfTk9fSU9TVFJFQU1TKSwgeW91IGRvbid0IGhhdmUgdG8gYnVpbGQgdGhlIGxpYnJhcnkuIFlvdSBjYW4gc2tpcCBzdHJhaWdodAordG8gdGhlICJVc2luZyBTVExwb3J0IiBzZWN0aW9uLgorCitJZiB5b3Ugd2FudCB0byBjb21waWxlIGZvciB0aGUgUG9ja2V0IFBDIDIwMDIgU0RLICh3aGljaCBpbiBtb3N0IGNhc2VzIHlvdSB3YW50KQorYmUgc3VyZSB0byBzZXQgdGhlIFBMQVRGT1JNIGVudmlyb25tZW50IHZhcmlhYmxlIHRvICJQb2NrZXQgUEMgMjAwMiIsIGUuZy4gd2l0aAordGhpcyBjb21tYW5kOgorCisgIHNldCBQTEFURk9STT1Qb2NrZXQgUEMgMjAwMgorCitPcGVuIGEgY29tbWFuZCBsaW5lIHByb21wdCBhbmQgZXhlY3V0ZSB0aGUgYmF0Y2ggZmlsZSB0aGF0IHNldHMgdXAgY29tcGlsaW5nCitmb3IgQVJNIG9yIHg4NiBwcm9jZXNzb3JzLiBUaGVzZSBmaWxlcyB1c3VhbGx5IGFyZSBpbiBhIGZvbGRlciBsaWtlCisnQzpcUHJvZ3JhbSBGaWxlc1xXaW5kb3dzIENFIGVNYmVkZGVkIFRvb2xzXEVWQ1xXQ0UzMDBcQklOXCcgYW5kIGFyZSBjYWxsZWQKK1dDRUFSTS5iYXQgYW5kIFdDRXg4Ni5iYXQuIENoZWNrIGlmIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIHNldCB1cAorcHJvcGVybHkgYWZ0ZXIgdGhhdCBjYWxsLiBZb3UgY2FuIGFsc28gYWRqdXN0IHRoZSBiYXRjaCBmaWxlcyB0byBoYXZlIHRoZQorUExBVEZPUk0gdmFyaWFibGUgc2V0IGF1dG9tYXRpY2FsbHkuCisKK0dvIGludG8gU1RMcG9ydCdzICdidWlsZFxsaWInIGZvbGRlciBhbmQgdHlwZToKKworICBjb25maWd1cmUuYmF0IC1jIGV2YzMKKworVGhlIG1ha2VmaWxlcyBhcmUgY29uZmlndXJlZCB3aXRoIHRoZSBnaXZlbiBzZXR0aW5ncy4gQ2FsbCBjb25maWd1cmUuYmF0IHdpdGgKK3RoZSAtLWhlbHAgb3B0aW9uIHRvIHNlZSBhbGwgb3B0aW9ucy4gVGhlIHByb2dyYW0gYXV0b21hdGljYWxseSB0ZWxscyB5b3Ugd2hpY2gKK2NvbW1hbmQgbGluZSB0byB1c2UuIElmIHlvdSB3YW50IHRvIGluc3RhbGwgdGhlIGxpYnJhcmllcywgYWRkIHRoZSAiaW5zdGFsbCIKK3RhcmdldCBhcyBmb2xsb3dzOgorCisgIG5tYWtlIC9mbXN2Yy5tYWsgaW5zdGFsbAorCitBbGwgbGlicmFyaWVzIChkZWJ1Zywgc3RsZGVidWcsIHJlbGVhc2UpIGFyZSBub3cgYnVpbHQsIHN0YXRpYyBhbmQgc2hhcmVkCitvbmVzLiBJbXBvcnQgbGlicmFyaWVzICgubGliIGZpbGVzKSBhcmUgcHV0IGluIHRoZSAnbGliXGV2YzMtYXJtJyBmb2xkZXIsIERMTHMKK2FyZSBwdXQgaW4gdGhlICdiaW5cZXZjMy1hcm0nIGZvbGRlci4gSWYgeW91IHVzZSBhbm90aGVyIHRhcmdldCBwbGF0Zm9ybSwgdGhlCituYW1lIG9mIHRoZSBmb2xkZXIgaXMgY2hhbmdlZCBhY2NvcmRpbmdseSwgZS5nLiBldmMzLXg4NiBmb3IgZW11bGF0b3IgZmlsZXMuCisKK09uY2UgU1RMcG9ydCBpcyBidWlsdCB5b3UgY2FuIGRlY3JlYXNlIHRoZSBzaXplIG9mIHRoZSBTVExwb3J0IGZvbGRlciBieQorcmVtb3ZpbmcgaW50ZXJtZWRpYXRlIGJ1aWxkIGZpbGVzLiBUaGlzIGlzIGRvbmUgd2l0aCB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6CisKKyAgbm1ha2UgL2Ztc3ZjLm1hayBjbG9iYmVyCisKK05vdGU6IE1JUFMgcGxhdGZvcm0gaXMgYWxzbyBhdmFpbGFibGUgZm9yIGJ1aWxkLCBidXQgaXQgbWF5IG5vdCBjb21waWxlIG9yIHdvcmsKKyAgICAgIHByb3Blcmx5LiBVc2Ugd2l0aCBjYXV0aW9uIQorCis9PT09PT09PT09PT09PT0KK1Rlc3RpbmcgU1RMcG9ydAorPT09PT09PT09PT09PT09CitZb3UgY2FuIHVzZSB0aGUgdW5pdCB0ZXN0cyB0byB2ZXJpZnkgU1RMcG9ydCBiZWhhdmVzIGNvcnJlY3RseS4gQ2hhbmdlIGludG8KK1NUTHBvcnRzICdidWlsZFx0ZXN0XHVuaXQnIGZvbGRlciBhbmQgdHlwZToKKworICBubWFrZSAvZm1zdmMubWFrIGluc3RhbGwKKworSWYgeW91IHdhbnQgdG8gYnVpbGQgdGhlIHVuaXQgdGVzdHMgZm9yIHRoZSBlbXVsYXRvciwgeW91IGhhdmUgdG8gcmVjb25maWd1cmUKK1NUTHBvcnQgd2l0aCB0aGUgY29uZmlndXJlLmJhdCwgYXMgZGVzY3JpYmVkIGFib3ZlLgorCitPbmNlIHRoZSB1bml0IHRlc3RzIGFyZSBidWlsdCwgdXBsb2FkIHRoZSBiaW5hcnkgKGZvdW5kIGluIHRoZSAnYmluXGV2YzMtYXJtJworZm9sZGVyKSB0byB5b3VyIGRldmljZSBvciBlbXVsYXRvciBhbmQgc3RhcnQgaXQgKHRoZSB0ZXN0IHJ1bnMgZm9yIGFib3V0IDMwCitzZWNvbmRzLCBkZXBlbmRpbmcgb24gdGhlIHNwZWVkIG9mIHRoZSBkZXZpY2UpLiBUaGUgZmlsZSAnc3RscF90ZXN0LnR4dCcgaXMKK2NyZWF0ZWQgaW4gdGhlIHJvb3QgZm9sZGVyIG9mIHRoZSBkZXZpY2UsIHdoaWNoIGNvbnRhaW5zIHRoZSB1bml0IHRlc3QKK3Jlc3VsdHMuIEl0IHNob3VsZCByZXBvcnQgbm8gZXJyb3JzLgorCis9PT09PT09PT09PT09CitVc2luZyBTVExwb3J0Cis9PT09PT09PT09PT09CitBZGp1c3QgeW91ciBpbmNsdWRlIGFuZCBsaW5rIHBhdGhzIGluIGVWQzMgaW4gJ1Rvb2xzIC0+IE9wdGlvbnMgLT4gRGlyZWN0b3JpZXMnCithbmQgYWRkIHRoZSBwYXRocyBmb3IgYWxsIHBsYXRmb3JtcyBhbmQgQ1BVcyBvbiB3aGljaCB5b3Ugd2FudCB0byB1c2UgU1RMcG9ydC4KK0luIHRoZSBpbmNsdWRlIGZpbGVzIGFkZCB0aGUgcGF0aCB0byBTVExwb3J0J3MgJ3N0bHBvcnQnIGZvbGRlci4gTWFrZSBzdXJlIGl0CitpcyB0aGUgZmlyc3QgZGlyZWN0b3J5IGxpc3RlZCB0aGVyZS4gQWRkIFNUTHBvcnQncyAnbGliXGV2YzMtYXJtJyBvcgorJ2xpYlxldmMzLXg4NicgKGRlcGVuZGluZyBvbiB3aGF0IHRhcmdldCB5b3UgdXNlKSBmb2xkZXIgZm9yIHRoZSBsaWJyYXJ5IGZpbGVzCisob3JkZXIgb2YgcGF0aHMgZG9lc24ndCBtYXR0ZXIgaGVyZSkuCisKK1RoZXJlIGFyZSBzb21lIHByZXByb2Nlc3NvciBkZWZpbmVzIHRoYXQgY29udHJvbCB1c2FnZSBvZiB0aGUgU1RMcG9ydCBpbiBldmMzCitwcm9qZWN0czoKKworRGVmaW5lIHRoZSBzeW1ib2wgX1NUTFBfVVNFX1NUQVRJQ19MSUIgd2hlbiB5b3Ugd2FudCB0byBzdGF0aWNhbGx5IGxpbmsgYWdhaW5zdAorU1RMcG9ydC4gVGhlIGxpbmtlciB3aWxsIHJlbW92ZSB1bnVzZWQgY2xhc3NlcyBhbmQgbWV0aG9kcyB0aGVuLCBzYXZpbmcgc29tZQorc3BhY2UgaW4gdGhlIGV4ZWN1dGFibGUuCisKK0lmIHlvdSBkb24ndCB3YW50IHRvIHVzZSB0aGUgaW9zdHJlYW1zIHBhcnQgb2YgdGhlIGxpYnJhcnksIHlvdSBjYW4gc3BlY2lmeSB0aGUKK2RlZmluZSBfU1RMUF9OT19JT1NUUkVBTVMuIEluIHRoaXMgbW9kZSB0aGVyZSBpcyBubyBuZWVkIHRvIGxpbmsgYWdhaW5zdCB0aGUKK2xpYnJhcnkuCisKK1NUTHBvcnQgdXNlcyBhdXRvbWF0aWMgbGlua2luZyB0byBmaW5kIHRoZSBwcm9wZXIgLmxpYiBmaWxlLiBJZiB5b3Ugd2FudCB0byBzZWUKK3doYXQgaW1wb3J0IGxpYnJhcnkgU1RMcG9ydCBpcyBnb2luZyB0byB1c2UsIGRlZmluZSBfU1RMUF9WRVJCT1NFX0FVVE9fTElOSy4KK1doZW4gbm90IHVzaW5nIGF1dG9tYXRpYyBsaW5raW5nIChieSBzcGVjaWZ5aW5nIF9TVExQX0RPTlRfVVNFX0FVVE9fTElOSyksIHlvdQoraGF2ZSB0byBzcGVjaWZ5IHRoZSBwcm9wZXIgLmxpYiBmaWxlIGluIHRoZSBQcm9qZWN0IFNldHRpbmdzLCBvbiB0aGUgImxpbmsiIHRhYi4KK1RoZSAubGliIG5hbWVzIGhhdmUgdGhlIGZvbGxvd2luZyBzeW50YXg6CisKKyAgIHN0bHBvcnQoZHxzdGxkKVtfc3RhdGljXS48U1RMcG9ydC1WZXJzaW9uPi5saWIKKworRXhhbXBsZXM6CisKKyAgIHN0bHBvcnRfc3RhdGljLjUuMC5saWIgLSBzdGF0aWMgcmVsZWFzZSB2ZXJzaW9uLCBWZXJzaW9uIDUuMC4wCisgICBzdGxwb3J0ZF81MC5saWIgLSBkbGwgZGVidWcgdmVyc2lvbiwgVmVyc2lvbiA1LjAuMAorCitOb3RlIHRoYXQgdXNhZ2Ugb2YgdGhlIF9TVExQX0RFQlVHIG1vZGUgaXMgY3VycmVudGx5IG5vdCByZWNvbW1lbmRlZCBmb3IKK2VNYmVkZGVkIFZpc3VhbCBDKysgYnVpbGRzIHVzaW5nIHRoZSBBUk0gY29tcGlsZXIsIGR1ZSB0byBhIGNvbXBpbGVyIGJ1Zy4KKworV2hlbiB1c2luZyBTVExwb3J0IHRvZ2V0aGVyIHdpdGggTUZDLCBiZSBzdXJlIHRvIGluY2x1ZGUgdGhlIE1GQyBoZWFkZXJzIGZpcnN0LAordGhlbiBpbmNsdWRlIFNUTHBvcnQgaGVhZGVycywgZS5nLiBpbiB5b3VyIFN0ZGFmeC5oLiBUaGlzIHdheSBTVExwb3J0IGNvcnJlY3RseQorcmVjb2duaXplcyBNRkMgdXNhZ2UuIFlvdSBhbHNvIGNhbiBkZWZpbmUgdGhlIG1hY3JvIF9TVExQX1VTRV9NRkMsIGVpdGhlciBpbgoreW91ciBwcm9qZWN0IHNldHRpbmdzIG9yIGluIHN0bHBvcnQvc3RsL2NvbmZpZy91c2VyX2NvbmZpZy5oLgorCitOb3cgeW91IHNob3VsZCBiZSByZWFkeSB0byB1c2UgU1RMcG9ydC4KKworPT09PT09PT09PT09CitLbm93biBpc3N1ZXMKKz09PT09PT09PT09PQorIC0gVW5pdCBUZXN0cyBpbiBfU1RMUF9ERUJVRyBtb2RlICh0YXJnZXQgJ3N0bGRiZy1zaGFyZWQnKSBmYWlscyBpbgorICAgX19zdGxfZGVidWdfZW5naW5lOjpfTV9kZXRhY2goKSBmb3Igc2V2ZXJhbCB0ZXN0cyBkdWUgdG8gdW5rbm93biByZWFzb25zLgorICAgQSBjb21waWxlciBidWcgaW4gdGhlIEFSTSBjb21waWxlciBpcyBzdXNwZWN0ZWQuCisgICBUaGVyZSBpcyBjdXJyZW50bHkgbm8gd29ya2Fyb3VuZCBmb3IgdGhpcyBidWcuIEl0IGlzIHJlY29tbWVuZGVkIHRvIG5vdCB1c2UKKyAgIF9TVExQX0RFQlVHIG1vZGUuCisKKyAtIFJlc291cmNlIGNvbXBpbGVyIGlzc3VlOgorCisgICAgVGhlIHJlc291cmNlIGNvbXBpbGVyIGlzIG5vdCBhIEMrKyBjb21waWxlciwgaXQgaXMgYSBjb21waWxlciB0aGF0IHRyYW5zbGF0ZXMKKyAgcmVzb3VyY2UgZmlsZXMsIGkuZS4gZmlsZXMgdGhhdCBkZXNjcmliZSBkaWFsb2dzLCBzdHJpbmdzLCB2ZXJzaW9uIGluZm9ybWF0aW9uCisgIGFuZCBvdGhlciBwYXJ0cyBvZiB0aGUgR1VJIG9uIE1TIFdpbmRvd3Mgc3lzdGVtcy4KKworICAgIFRoZSBwcm9ibGVtIGlzIHRoYXQgaXQgaW5jbHVkZXMgZmlsZXMgZnJvbSB0aGUgQy9DKysgaW5jbHVkZSBwYXRoLCBhbmQKKyAgU1RMcG9ydCB1c2VzIG1lY2hhbmlzbXMgdGhlIHJlc291cmNlIGNvbXBpbGVyIGNhbid0IGhhbmRsZSwgZS5nLiB1c2luZyBtYWNybworICBuYW1lcyBsb25nZXIgdGhhbiAzMSBjaGFyYWN0ZXJzLgorCisgICAgVGhlIHdvcmthcm91bmQgaXMgdG8gZ3VhcmQgYWxsIGFmZmVjdGVkIGhlYWRlcnMgKHN0ZGlvLmgsIHN0cmluZy5oLCBzdGRhcmcuaCwKKyAgc3RkbGliLmgsIGN0eXBlLmgpIGFnYWluc3QgdGhpcy4gVGhlIHJlc291cmNlIGNvbXBpbGVyIGlzIGRldGVjdGVkIGJ5IHRoZQorICBtYWNybyBSQ19JTlZPS0VELgorCisgLSBTZWUgYWxzbyBSRUFETUUuZXZjNCBpc3N1ZXMuCmRpZmYgLS1naXQgYS9kb2MvUkVBRE1FLmV2YzQgYi9kb2MvUkVBRE1FLmV2YzQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIzZDI3ZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9SRUFETUUuZXZjNApAQCAtMCwwICsxLDEyNiBAQAorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitTVExwb3J0IFJFQURNRSBmb3IgZU1iZWRkZWQgVmlzdWFsIEMrKyA0Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2J5OiBaZGVuZWsgTmVtZWMsIHplcm9AbWFwZmFjdG9yLmNvbSwgbGFzdCBlZGl0ZWQgMjAwNS0xMC0xNworCis9PT09PT09PT09PT0KK0ludHJvZHVjdGlvbgorPT09PT09PT09PT09CitUaGlzIGRvY3VtZW50IHNob3VsZCBwcm92aWRlIHN0ZXAtYnktc3RlcCBndWlkYW5jZSBmb3IgaW5zdGFsbGluZywgdGVzdGluZyBhbmQgdXNpbmcgdGhlIFNUTHBvcnQgbGlicmFyeSB1bmRlciBXaW5kb3dzIENFIC5ORVQgNC54CisoYWthIFdpbmRvd3MgTW9iaWxlIDIwMDMgYWthIFBvY2tldCBQQyAyMDAzKS4KK0ZvciBhbnkgZnVydGhlciBjb21tZW50cyBvciBxdWVzdGlvbnMgdmlzaXQgdGhlIFNUTHBvcnQgbWFpbGluZyBsaXN0cworaHR0cDovL3N0bHBvcnQuc291cmNlZm9yZ2UubmV0L01haWxsaXN0cy5zaHRtbCBvciBmb3J1bXMKK2h0dHBzOi8vc291cmNlZm9yZ2UubmV0L2ZvcnVtLz9ncm91cF9pZD0xNDY4MTQKKworPT09PT09PT09PT09PQorUHJlcmVxdWlzaXRlcworPT09PT09PT09PT09PQorVG8gYnVpbGQgYW5kIHVzZSB0aGUgU1RMcG9ydCB5b3Ugd2lsbCBuZWVkIGZvbGxvd2luZyB0b29scyBhbmQgbGlicmFyaWVzOgorIC0gZU1iZWRkZWQgVmlzdWFsIEMrKyA0LjAgU1A0CisgLSBhbiBTREsgZm9yIHlvdXIgdGFyZ2V0IHBsYXRmb3JtIHdpdGggUlRUSSBzdXBwb3J0CisKKz09PT09PT09PT09PT09PT0KK0J1aWxkaW5nIFNUTHBvcnQKKz09PT09PT09PT09PT09PT0KK0ZpcnN0LCBtYWtlIHN1cmUgdGhhdCBSVFRJIGlzIGF2YWlsYWJsZS4gTm90IGFsbCBTREtzIHRoYXQgY29tZSB3aXRoIGVWQzQgYWxzbyBpbmNsdWRlCit0aGUgbmVjZXNzYXJ5IGxpYnMsIGJ1dCB0aGVyZSBpcyBhIHBhdGNoIGZvciB0aGUgUFBDMjAwMyBTREssIGF2YWlsYWJsZSBhdAoraHR0cDovL3N1cHBvcnQubWljcm9zb2Z0LmNvbS9kZWZhdWx0LmFzcHg/c2NpZD1rYjtbTE5dOzgzMDQ4Mi4gCisKK1NlY29uZCwgb3BlbiBjb21tYW5kIGxpbmUgYW5kIHNldCBwcm9wZXIgc3lzdGVtIHZhcmlhYmxlcy4KK1RoaXMgY2FuIGJlIGRvbmUgYnkgdXNpbmcgYmF0Y2ggZmlsZXMgdW5kZXIgeW91ciAnZU1iZWRkZWQgVmlzdWFsIEMrKycgZGlyZWN0b3J5KHVzZSBlaXRoZXIgV0NFZW11bGF0b3IuQkFUIGlmIHlvdSB3YW50IHRvIGJ1aWxkIFNUTHBvcnQgZm9yIHRoZSBlbXVsYXRvciBvciBXQ0VBUk1WNC5CQVQgaWYgeW91IGludGVuZCB0byBhaW0gYW4gQVJNIGRldmljZSkuCitOT1RFOiBJZiB5b3UgYXJlIHVzaW5nIE1pY3Jvc29mdCdzIGJhdGNoIGZpbGVzIHRvIHNldCBzeXN0ZW0gdmFyaWFibGVzIGNoZWNrIGlmIGJvdGggV0NFUk9PVCBhbmQgU0RLUk9PVCB2YXJzIGFyZSBzZXQgdG8gY29ycmVjdCBsb2NhdGlvbnMuIGV4YW1wbGU6CitXQ0VST09UPUM6XFByb2dyYW0gRmlsZXNcTWljcm9zb2Z0IGVNYmVkZGVkIEMrKyA0LjAKK1NES1JPT1Q9QzpcUHJvZ3JhbSBGaWxlc1xXaW5kb3dzIENFIFRvb2xzCisKK1RoaXJkLCB3aGVuIHlvdSBhcmUgMTAwcGVyY2VudCBzdXJlIHlvdSd2ZSBzZXQgY29ycmVjdGx5IHN5c3RlbXMgdmFyaWFibGVzIGdvIHRvIHRoZSBTVExwb3J0L2J1aWxkL2xpYiBkaXIgYW5kIHJ1biB0aGUgY29uZmlndXJlLmJhdCB3aXRoCitwcm9wZXIgLWMgb3B0aW9uIChpZS4gIi1jIGV2YzQiKSwKK3RoZW4gaW52b2tlIGZvbGxvd2luZyBjb21tYW5kOiAnbm1ha2UgL2Ztc3ZjLm1hayBpbnN0YWxsJyB0byBidWlsZCB0aGUgbGlicmFyeS4KKworSWYgYW55dGhpbmcgZ29lcyB3cm9uZyBjaGVjayBpZiB5b3UgbWV0IGFsbCBwcmVyZXF1aXNpdGllcyBhbmQgaWYgeW91IHNldCBzeXN0ZW0gdmFycyBhY2NvcmRpbmdseSB0byB0aGUgbWFrZmlsZSB5b3UgYXJlIHVzaW5nLgorQXQgdGhlIGVuZCBvZiBidWlsZCBwcm9jZXNzIHlvdSBzaG91bGQgaGF2ZSBzb21lIGxpYnMgaW5zdGFsbGVkIGluIFNUTHBvcnQvbGliL2V2YzQtYXJtIG9yIFNUTHBvcnQvbGliL2V2YzQteDg2IGFuZCBkeW5hbWljIGxpYnMgaW4gU1RMcG9ydC9iaW4gZGlyZWN0b3J5LgorCitZb3UgbWlnaHQgd2FudCB0byByZXBlYXQgYWxsIHRob3NlIHN0ZXBzIGlmIHlvdSB3b3VsZCBsaWtlIHRvIGhhdmUgCitlLmcuIGJvdGggQVJNIGFuZCB4ODYgZW11bGF0b3IgYmluYXJpZXMsIGp1c3QgZG9uJ3QgZm9yZ2V0IHRvIGRvIAorJ25tYWtlIC9mbXN2Yy5tYWsgY2xvYmJlcicgYmVmb3JlIG5ldyBidWlsZC4KKworTm90ZTogTUlQUyBwbGF0Zm9ybSBpcyBhbHNvIGF2YWlsYWJsZSBmb3IgYnVpbGQsIGJ1dCBpdCBtYXkgbm90IGNvbXBpbGUgb3Igd29yayBwcm9wZXJseS4gVXNlIHdpdGggY2F1dGlvbiEKKworPT09PT09PT09PT09PT09CitUZXN0aW5nIFNUTHBvcnQKKz09PT09PT09PT09PT09PQorV2hlbiB5b3Ugc3VjY2Vzc2Z1bHkgYnVpbGQgU1RMcG9ydCBsaWJzLCB5b3Ugc2hvdWxkIGdvIHRvIFNUTHBvcnQvdGVzdC91bml0IGRpcmVjdG9yeSBidWlsZCBhbmQgcnVuIHRoZSBTVExQIHRlc3Qgc3VpdGUuCitVc2UgJ25tYWtlIC9mbXN2Yy5tYWsnIGFuZCBrZWVwIGluIG1pbmQgdGhhdCB5b3Ugc3RpbGwgaGF2ZSB0byBoYXZlIHByb3BlciBzeXN0ZW0gdmFyaWFibGVzIHNldCEKK09uY2UgdGVzdCBidWlsZCBoYXMgZmluaXNoZWQgdXBsb2FkIGFuZCBydW4gc3RscF91bml0X3Rlc3QuZXhlIHRvIHlvdXIgZW11bGF0b3Igb3IgZGV2aWNlLgorV2FpdCBmb3IgYSB3aGlsZSAoYXByb3guIDJtaW5zKSB1bnRpbCBhbGwgdGVzdHMgYXJlIGRvbmUuCitZb3Ugc2hvdWxkIHNlZSB0d28gZmlsZXMgbmV4dCB0byB5b3VyIGJpbmFyeSBub3cuCitDaGVjayBzdGxwX3Rlc3QudHh0IGZvciBhbnkgZXJyb3JzLiBJZiBhbGwgdGVzdHMgcGFzc2VkIHlvdSBhcmUgcmVhZHkgdG8gZGVwbG95IFNUTHBvcnQuCitJZiBzb21lIHRlc3QgZmFpbHMgZG9uJ3Qgd29ycnkgYW5kIGNoZWNrIHRoZSBTVExwb3J0IGZvcnVtIGlmIGl0J3MgYWxyZWFkeSByZXBvcnRlZCBidWcgb3IgeW91IGhhdmUgZm91bmQgYSBuZXcgb25lLgorCis9PT09PT09PT09PT09CitVc2luZyBTVExwb3J0Cis9PT09PT09PT09PT09CitTZXR0aW5nIHVwIHRoZSBJREU6CitCZWZvcmUgeW91IHN0YXJ0IHVzaW5nIFNUTHBvcnQgeW91IGhhdmUgdG8gc2V0IHByb3BlciBpbmNsdWRlIGFuZCBsaWJyYXJpZXMgc2VhcmNoIHBhdGhzLgorR28gdG8gJ1Rvb2xzJz4nT3B0aW9ucycgbWVudSBpbiB5b3VyIGVWQyA0LjAgYW5kIHRoZW4gdG8gJ0RpcmVjdG9yaWVzJyB0YWIuCitGb3IgZXZlcnkgcGxhdGZvcm0geW91IHdhbnQgdG8gdXNlIFNUTHBvcnQgYWRkIFNUTHBvcnQvc3RscG9ydCBkaXJlY3RvcnkgdG8gdGhlIEZJUlNUIHBsYWNlIGluICdJbmNsdWRlIEZpbGVzJworYW5kIFNUTHBvcnQvbGliIGRpcmVjdG9yeSBpbiAnTGlicmFyeSBmaWxlcycgc2VjdGlvbi4KKworU2V0dGluZyB1cCBwcm9qZWN0czoKK1doZW4gdXNpbmcgU1RMcG9ydCB0b2dldGhlciB3aXRoIE1GQywgeW91IGhhdmUgdG8gZGVmaW5lIF9TVExQX1VTRV9NRkMgdG8gcHJvcGVybHkgaW5jbHVkZSBhbmQgdXNlIFNUTHBvcnQuCisKK0J5IGRlZmF1bHQsIGV4Y2VwdGlvbiBzdXBwb3J0IGlzIG5vdCBhY3RpdmF0ZWQuIFlvdSBjYW4gZGV0ZWN0IHRoaXMgdmlhIF9DUFBVTldJTkQgYW5kIGFjdGl2YXRlIHRoaXMgdmlhIC9HWC4KK1dpdGhvdXQgZXhjZXB0aW9uIHN1cHBvcnQsIGUuZy4gc3RkOjpiYWRfYWxsb2MgaXMgbm90IGF2YWlsYWJsZSwgY2F1c2luZyBjb21waWxlIGVycm9ycyBmb3Igc29tZSBjb2RlLgorCitBbHNvLCB0aGVyZSBpcyBvbmx5IG9uZSBydW50aW1lIGF2YWlsYWJsZSBidXQgdGhlIElERSBkb2Vzbid0IGFkZCB0aGUgY29ycmVzcG9uZGluZyBzd2l0Y2ggdG8gdGhlIGNvbW1hbmQgbGluZS4KK1RoZSByaWdodCBzd2l0Y2ggKHNlbGVjdGluZyBhIGR5bmFtaWNhbGx5IGxpbmtlZCBydW50aW1lKSBpcyBJTUhPIC9NRCBvciAvTURkLiBUaGlzIHRoZW4gYWxzbyBzd2l0Y2hlcyBTVExwb3J0IHRvIGR5bmFtaWMgbGlua2luZy4KK0FsdGVybmF0aXZlbHksIHlvdSBjYW4gI2RlZmluZSBfRExMIGZvciB5b3VyIHByb2plY3QsIHdoaWNoIGFjaGlldmVzIHRoZSBzYW1lIGJ1dCwgYWdhaW4gSU1ITywgaXMgYSBsZXNzIGNsZWFuIHNvbHV0aW9uLgorCis9PT09PT09PT09PT0KK0tub3duIGlzc3VlcworPT09PT09PT09PT09CistIFRoZSBjb21waWxlcnMgdGhhdCBjb21lIHdpdGggZVZDNCBhcmUgYWxtb3N0IGJ1Zy10by1idWcgY29tcGF0aWJsZSB3aXRoIAordGhlIG9uZSBmcm9tIFZDNiwgc28gbW9zdCB3b3JrYXJvdW5kcyBmb3IgdGhhdCBjb21waWxlciBhcHBseSBoZXJlLCB0b28uCisKKy0gVGhlcmUgaXMgYSBidWcgaW4gdGhlIE1JUFMgY29tcGlsZXIgdGhhdCBjb21lcyB3aXRoIGVWQzQgd2hpY2ggb25seSBzdXJmYWNlcwordW5kZXIgY2VydGFpbiBjb25kaXRpb25zOgorICogaW4gcmVsZWFzZSBtb2RlIHdpdGggZ2xvYmFsIG9wdGltaXphdGlvbnMgb24gKCNwcmFnbWEgb3B0aW1pemUoImciLCBvbikpCisgKiBhIGJhc2VjbGFzcyBoYXMgKGF0IGxlYXN0KSB0d28gcG9pbnRlciBtZW1iZXJzCisgKiBhIGRlcml2ZWQgY2xhc3MgYWRkcyBubyBkYXRhIG1lbWJlcnMgCisgKiB0aGUgZGVyaXZlZCBjbGFzcycgY2N0b3IgZGVmZXJzIHRvIHRoZSBiYXNjbGFzcycgY29tcGlsZXItZ2VuZXJhdGVkIGNjdG9yCisgKiBpdCBpcyBwYXNzZWQgYXMgdGVtcGxhdGUgcGFyYW1ldGVyIHRvIGEgZnVuY3Rpb24KK1RoZSBzbWFsbGVzdCB0ZXN0Y2FzZSBJIGNvdWxkIGNvbWUgdXAgd2l0aCBpcyB0aGlzOgorCXN0cnVjdCBiYXNlIHsKKwkJdm9pZCogcHRyMTsKKwkJdm9pZCogcHRyMjsKKwl9OworCXN0cnVjdCBkZXJpdmVkOiBwdWJsaWMgYmFzZSB7CisJCWRlcml2ZWQoKSB7fQorCQlkZXJpdmVkKGNvbnN0IGRlcml2ZWQmIF9feCk6IGJhc2UoX194KSB7fQorCX07CisKKwl0ZW1wbGF0ZTx0eXBlbmFtZSBTb21lVHlwZT4gdm9pZCBmdW5jdGlvbiggU29tZVR5cGUgc3QxLCBTb21lVHlwZSBzdDIpIHt9CisKKwlzdHJ1Y3QgdGVzdCB7CisJCWRlcml2ZWQgdG1wOworCQl+dGVzdCgpIHsgZnVuY3Rpb24odG1wLCB0bXApOyB9CisJfTsKKwl0ZXN0IHRlc3Q7CisuLndoaWNoIGNhdXNlcyBhbiBpbnRlcm5hbCBjb21waWxlciBlcnJvci4gUmVtb3ZpbmcgdGhlIGJhc2U6OnB0cjEsIGFkZGluZyBkYXRhIAordG8gZGVyaXZlZCwgbWFraW5nIGZ1bmN0aW9uKCkgYSBub3JtYWwgZnVuY3Rpb24sIG9yIHR1cm5pbmcgb2ZmIG9wdGltaXphdGlvbiAKKygjcHJhZ21hIG9wdGltaXplKCJnIiwgb2ZmKSkgYWxsIGNhdXNlcyB0aGUgY29kZSB0byBjb21waWxlLiBUaGlzIGJ1ZyBhZmZlY3RzCitpdGVyYXRvcnMgb2YgZGVxdWUgYW5kIHZlY3Rvcjxib29sPi4KKworLSBCZWNhdXNlIG9mIGludGVyZGVwZW5kYW5jeSBiZXR3ZWVuIFNUTHBvcnQgYW5kIG5hdGl2ZSBTdGFuZGFyZCBsaWJyYXJ5IGhlYWRlcnMKK1NUTHBvcnQgaGVhZGVycyBzaG91bGQgYWx3YXlzIGJlIGluY2x1ZGVkIGZpcnN0IGluIHlvdXIgdHJhbnNsYXRpb24gdW5pdCAoLmNwcAorZmlsZSkuIFRoYXQgaXMgdG8gc2F5IHRoYXQ6CisKKy8vV3JvbmcgaGVhZGVycyBvcmRlcjoKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKworLy8gQ29ycmVjdCBoZWFkZXJzIG9yZGVyCisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKZGlmZiAtLWdpdCBhL2RvYy9SRUFETUUuZXZjOCBiL2RvYy9SRUFETUUuZXZjOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmVmNGMwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL1JFQURNRS5ldmM4CkBAIC0wLDAgKzEsOTkgQEAKK3NldHVwIFZDOCBmb3IgQ0U6DQorLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorLSBWQzggZG9lc24ndCBoYXZlIGFueSBzZXR1cCBiYXRjaGZpbGVzIHRoYXQgcHJlcGFyZSB0aGUgZW52aXJvbm1lbnQgZm9yIGNvbXBpbGluZw0KK3dpdGggQ0UuIFlvdSBjYW4gdGFrZSB0aG9zZSBmcm9tIGVWQzQgYW5kIGFkYXB0IHRoZW0gb3Igd3JpdGUgeW91ciBvd24uIFRoaXMgc25pcHBldA0KK3Nob3VsZCBnZXQgeW91IGdvaW5nOg0KKw0KKyAgcmVtIHlvdSBuZWVkIHRvIGFkYXB0IGF0IGxlYXN0IHRoZXNlIHRocmVlDQorICBzZXQgT1NWRVJTSU9OPVdDRTUwMA0KKyAgc2V0IFBMQVRGT1JNPU1ZX09XTl9QTEFURk9STQ0KKyAgc2V0IFRBUkdFVENQVT1NSVBTSUkNCisNCisgIHJlbSB0aGUgY29tcGlsZXIgaXMgYWx3YXlzIGNsLmV4ZSwgZGlmZmVyZW50IGNvbXBpbGVycyBhcmUgaW4gZGlmZmVyZW50IHBhdGhzDQorICBzZXQgQ0M9Y2wuZXhlDQorICByZW0gb2J2aW91c2x5LCB0aGVzZSBuZWVkIHRvIGJlIGFkanVzdGVkIHRvIHdoZXJlIHlvdSBpbnN0YWxsZWQgVlMyMDA1IGFuZCB0aGUgU0RLcw0KKyAgc2V0IFZTSU5TVEFMTERJUj1DOlxQcm9ncmFtbWVcTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gOA0KKyAgc2V0IFNES1JPT1Q9QzpcUHJvZ3JhbW1lXFdpbmRvd3MgQ0UgVG9vbHMNCisNCisgIHNldCBQQVRIPSVWU0lOU1RBTExESVIlXFZDXGNlXGJpblx4ODZfbWlwczslVlNJTlNUQUxMRElSJVxWQ1xiaW47JVZTSU5TVEFMTERJUiVcQ29tbW9uN1xJREU7JVBBVEglDQorICBzZXQgUExBVEZPUk1ST09UPSVTREtST09UJVwlT1NWRVJTSU9OJVwlUExBVEZPUk0lDQorDQorICByZW0gYWRkIGxpYnMgYW5kIGluY2x1ZGVzIGZyb20gdGhlIFNESw0KKyAgc2V0IElOQ0xVREU9JVBMQVRGT1JNUk9PVCVcaW5jbHVkZVwlVEFSR0VUQ1BVJTslUExBVEZPUk1ST09UJVxNRkNcaW5jbHVkZTslUExBVEZPUk1ST09UJVxBVExcaW5jbHVkZQ0KKyAgc2V0IExJQj0lUExBVEZPUk1ST09UJVxsaWJcJVRBUkdFVENQVSU7JVBMQVRGT1JNUk9PVCVcTUZDXGxpYlwlVEFSR0VUQ1BVJTslUExBVEZPUk1ST09UJVxBVExcbGliXCVUQVJHRVRDUFUlDQorDQorICByZW0gYWRkIGxpYnMgdGhhdCBjYW1lIHdpdGggVkM4DQorICByZW0gTm90ZTogdGhlcmUgYXJlIG1vcmUgbGlicyBhbmQgaW5jbHVkZXMgdW5kZXIgY2VcYXRsbWZjLCBub3Qgc3VyZSBpZiB0aGVzZSBhcmUgbmVlZGVkLg0KKyAgc2V0IExJQj0lTElCJTslVlNJTlNUQUxMRElSJVxWQ1xjZVxsaWJcJVRBUkdFVENQVSUNCisgIA0KKyAgDQorLSBUaGUgc25pcHBldCBiZWxvdyBjYW4gYmUgdXNlZCB0byBidWlsZCBTVExwb3J0IGZvciBQb2NrZXQgUEMgMjAwMyAodXNpbmcgdGhlDQorICBQb2NrZXQgUEMgMjAwMyBTREsgc2hpcHBlZCB3aXRoIFZpc3VhbCBTdHVkaW8gMjAwNSwgdGhpcyBpcyB0aGUgU0RLIHVzZWQgd2hlbg0KKyAgY29tcGlsaW5nIHByb2dyYW1zIGZyb20gd2l0aGluIHRoZSBJREUpOg0KKw0KKyAgc2V0IE9TVkVSU0lPTj1XQ0U0MjANCisgIHNldCBQTEFURk9STT1QT0NLRVQgUEMgMjAwMw0KKyAgc2V0IFRBUkdFVENQVT1BUk1WNA0KKw0KKyAgcmVtIHRoZSBjb21waWxlciBpcyBhbHdheXMgY2wuZXhlLCBkaWZmZXJlbnQgY29tcGlsZXJzIGFyZSBpbiBkaWZmZXJlbnQgcGF0aHMNCisgIHNldCBDQz1jbC5leGUNCisNCisgIHJlbSBvYnZpb3VzbHksIHRoZXNlIG5lZWQgdG8gYmUgYWRqdXN0ZWQgdG8gd2hlcmUgeW91IGluc3RhbGxlZCBWUzIwMDUNCisgIHNldCBWU0lOU1RBTExESVI9QzpcUHJvZ3JhbSBGaWxlc1xNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyA4DQorICBzZXQgU0RLUk9PVD0lVlNJTlNUQUxMRElSJVxTbWFydERldmljZXNcU0RLDQorDQorICBzZXQgUEFUSD0lVlNJTlNUQUxMRElSJVxWQ1xjZVxiaW5ceDg2X2FybTslVlNJTlNUQUxMRElSJVxWQ1xiaW47JVZTSU5TVEFMTERJUiVcQ29tbW9uN1xJREU7JVBBVEglDQorICBzZXQgUExBVEZPUk1ST09UPSVTREtST09UJVxQb2NrZXRQQzIwMDMNCisNCisgIHJlbSBhZGQgbGlicyBhbmQgaW5jbHVkZXMgZnJvbSB0aGUgU0RLDQorICBzZXQgSU5DTFVERT0lUExBVEZPUk1ST09UJVxpbmNsdWRlDQorICBzZXQgTElCPSVQTEFURk9STVJPT1QlXGxpYlwlVEFSR0VUQ1BVJQ0KKw0KKyAgcmVtIGFkZCBsaWJzIHRoYXQgY2FtZSB3aXRoIFZDOA0KKyAgc2V0IElOQ0xVREU9JUlOQ0xVREUlOyVWU0lOU1RBTExESVIlXFZDXGNlXGF0bG1mY1xpbmNsdWRlDQorICBzZXQgTElCPSVMSUIlOyVWU0lOU1RBTExESVIlXFZDXGNlXGxpYlwlVEFSR0VUQ1BVJTslVlNJTlNUQUxMRElSJVxWQ1xjZVxhdGxtZmNcbGliXCVUQVJHRVRDUFUlDQorDQorDQorWW91IHNob3VsZCBub3cgYmUgYWJsZSB0byBydW4gY2wuZXhlIGZvciB0aGUgdGFyZ2V0IHlvdSBleHBlY3RlZC4NCisNCistIFRoZSBjcm9zcyBjb21waWxlcnMgb2YgVkM4IGFyZSB0aGUgc2FtZSB2ZXJzaW9uIGFzIGZvciB0aGUgbmF0aXZlIHRhcmdldCwgaS5lLiBNU0MxNC4NCisNCistIFRoZSBjcm9zcyBjb21waWxlciBmb3IgTUlQUyBoYXMgdGhlIHNhbWUgYnVnIGFzIG1lbnRpb25lZCBpbiBkb2MvUkVBRE1FLmV2YzQgYW5kDQordGhlIHNhbWUgd29ya2Fyb3VuZCBhcHBsaWVzLiBIb3dldmVyLCB1c2luZyAnd2hvbGUgcHJvZ3JhbSBvcHRpbWl6YXRpb24nLCBpdCByZXN1bHRzDQoraW4gYW4gZXJyb3IgaW4gdGhlIGxpbmsgcGhhc2UuDQorDQorLSBJbiBvcmRlciBmb3IgU1RMcG9ydCB0byByZWNvZ25pemUgd2hpY2ggdGFyZ2V0IHlvdSBhcmUgY29tcGlsaW5nIGZvciwgeW91IG5lZWQgdG8gaGF2ZQ0KK3NvbWUgbWFjcm9zIGRlZmluZWQsIGUuZy4gZm9yIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLiBUaGUgY29tcGlsZXJzIGRvIHRoYXQgcGFydGlhbGx5IG9uDQordGhlaXIgb3duLCBidXQgbm90IHN1ZmZpY2llbnRseS4gVGhlcmVmb3JlLCBTVExwb3J0IHJlcXVpcmVzIHRoZXNlIGRlZmluZXM6DQorDQorIC0tIFRoZXNlIGFyZSBnZW5lcmFsbHkgc2V0IGZvciBDRToNCisgIF9VTklDT0RFO1VOSUNPREU7X1dJTjMyO1dJTjMyO1VOREVSX0NFO1dJTkNFOw0KKyAtLSBUaGlzIG9uZSB1c2VzIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHNldCB0aGUgQ0UgdmVyc2lvbjoNCisgIF9XSU4zMl9XQ0U9JChDRVZFUik7DQorIC0tIFRoZXNlIGFyZSB1c2VkIHRvIGhlbHAgU1RMcG9ydCByZWNvZ25pc2UgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmU6DQorICAkKEFSQ0hGQU0pOyQoX0FSQ0hGQU1fKTskKElOU1RSVUNUSU9OU0VUKQ0KKyBOb3RlIHRoYXQgdGhlIGluc3RydWN0aW9uc2V0IGlzIG5vdCBzdHJpY3RseSBuZWVkZWQgZm9yIHg4NiBidXQgZGVmaW5pdGVseSBmb3IgQVJNLiBJdA0KKyBkb2Vzbid0IGh1cnQgZm9yIHg4NiB0aG91Z2gsIHNvIEknZCBhbHdheXMgc2V0IHRoZXNlIGluIGFueSBuZXcgcHJvamVjdC4NCisgLS0gRm9yIHJlbGVhc2UgYnVpbGRzOg0KKyAgTkRFQlVHOw0KKyAtLSBGb3IgZGVidWcgYnVpbGRzOg0KKyAgREVCVUc7X0RFQlVHOw0KKyAtLSBGb3IgZGVidWcgYnVpbGRzIHdpdGggYWRkaXRpb25hbCBTVExwb3J0IGRpYWdub3N0aWNzOg0KKyAgREVCVUc7X0RFQlVHO19TVExQX0RFQlVHOw0KKyAtLSBGb3IgTUZDIGFwcGxpY2F0aW9uczoNCisgIF9BRlhETEw7DQorDQorLSBGdXJ0aGVyIHNldHRpbmdzOg0KKyBDb2RlIGdlbmVyYXRpb246IE11bHRpdGhyZWFkZWQgW0RlYnVnXSBETEwNCisgTGFuZ3VhZ2U6IGVuYWJsZSBSVFRJDQorIE9wdGltaXphdGlvbjogbWF4aW1pc2Ugc3BlZWQgYW5kIGVuYWJsZSB3aG9sZSBwcm9ncmFtIG9wdGltaXphdGlvbiBmb3IgcmVsZWFzZSBidWlsZHMNCisNCistIExpbmtlciBzZXR0aW5nczoNCisgSWdub3JlIHNwZWNpZmljIGxpYnJhcmllczogbGliYy5saWI7bGliY2QubGliDQorIENvbW1hbmRsaW5lOiAvU1VCU1lTVEVNOldJTkRPV1NDRQ0KKyBPcHRpbWlzYXRpb246IC9MVENHIGZvciByZWxlYXNlIGJ1aWxkcw0KKw0KKy0gUmVzb3VyY2UgY29tcGlsZXI6DQorIERlZmluZTogVU5ERVJfQ0U7V0lOQ0U7X1dJTjMyX1dDRT0kKENFVkVSKQ0KKw0KZGlmZiAtLWdpdCBhL2RvYy9SRUFETUUuZXZjOSBiL2RvYy9SRUFETUUuZXZjOQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWFkOTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL1JFQURNRS5ldmM5CkBAIC0wLDAgKzEsOTUgQEAKK3NldHVwIFZDOSBmb3IgQ0U6CistLS0tLS0tLS0tLS0tLS0tLS0KKworLSBWQzkgZG9lc24ndCBoYXZlIGFueSBzZXR1cCBiYXRjaGZpbGVzIHRoYXQgcHJlcGFyZSB0aGUgZW52aXJvbm1lbnQgZm9yIGNvbXBpbGluZword2l0aCBDRS4gWW91IGNhbiB0YWtlIHRob3NlIGZyb20gZVZDNCBhbmQgYWRhcHQgdGhlbSBvciB3cml0ZSB5b3VyIG93bi4gVGhpcyBzbmlwcGV0CitzaG91bGQgZ2V0IHlvdSBnb2luZzoKKworICByZW0geW91IG5lZWQgdG8gYWRhcHQgYXQgbGVhc3QgdGhlc2UgdGhyZWUKKyAgc2V0IE9TVkVSU0lPTj1XQ0U1MDAKKyAgc2V0IFBMQVRGT1JNPU1ZX09XTl9QTEFURk9STQorICBzZXQgVEFSR0VUQ1BVPU1JUFNJSQorCisgIHJlbSB0aGUgY29tcGlsZXIgaXMgYWx3YXlzIGNsLmV4ZSwgZGlmZmVyZW50IGNvbXBpbGVycyBhcmUgaW4gZGlmZmVyZW50IHBhdGhzCisgIHNldCBDQz1jbC5leGUKKyAgcmVtIG9idmlvdXNseSwgdGhlc2UgbmVlZCB0byBiZSBhZGp1c3RlZCB0byB3aGVyZSB5b3UgaW5zdGFsbGVkIFZTMjAwOCBhbmQgdGhlIFNES3MKKyAgc2V0IFZTSU5TVEFMTERJUj1DOlxQcm9ncmFtbWVcTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gOS4wCisgIHNldCBTREtST09UPUM6XFByb2dyYW1tZVxXaW5kb3dzIENFIFRvb2xzCisKKyAgc2V0IFBBVEg9JVZTSU5TVEFMTERJUiVcVkNcY2VcYmluXHg4Nl9taXBzOyVWU0lOU1RBTExESVIlXFZDXGJpbjslVlNJTlNUQUxMRElSJVxDb21tb243XElERTslUEFUSCUKKyAgc2V0IFBMQVRGT1JNUk9PVD0lU0RLUk9PVCVcJU9TVkVSU0lPTiVcJVBMQVRGT1JNJQorCisgIHJlbSBhZGQgbGlicyBhbmQgaW5jbHVkZXMgZnJvbSB0aGUgU0RLCisgIHNldCBJTkNMVURFPSVQTEFURk9STVJPT1QlXGluY2x1ZGVcJVRBUkdFVENQVSU7JVBMQVRGT1JNUk9PVCVcTUZDXGluY2x1ZGU7JVBMQVRGT1JNUk9PVCVcQVRMXGluY2x1ZGUKKyAgc2V0IExJQj0lUExBVEZPUk1ST09UJVxsaWJcJVRBUkdFVENQVSU7JVBMQVRGT1JNUk9PVCVcTUZDXGxpYlwlVEFSR0VUQ1BVJTslUExBVEZPUk1ST09UJVxBVExcbGliXCVUQVJHRVRDUFUlCisKKyAgcmVtIGFkZCBsaWJzIHRoYXQgY2FtZSB3aXRoIFZDOQorICByZW0gTm90ZTogdGhlcmUgYXJlIG1vcmUgbGlicyBhbmQgaW5jbHVkZXMgdW5kZXIgY2VcYXRsbWZjLCB5b3UgbmVlZCB0byBhZGQgdGhlc2UKKyAgcmVtIGluc3RlYWQgb2YgdGhlIG9uZXMgaW4gdGhlIFNESyBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIG5ld2VyIHZlcnNpb24gb2YgQVRML01GQy4KKyAgc2V0IExJQj0lTElCJTslVlNJTlNUQUxMRElSJVxWQ1xjZVxsaWJcJVRBUkdFVENQVSUKKworCistIFRoZSBzbmlwcGV0IGJlbG93IGNhbiBiZSB1c2VkIHRvIGJ1aWxkIFNUTHBvcnQgZm9yIFBvY2tldCBQQyAyMDAzICh1c2luZyB0aGUKKyAgUG9ja2V0IFBDIDIwMDMgU0RLIHNoaXBwZWQgd2l0aCBWaXN1YWwgU3R1ZGlvIDIwMDgsIHRoaXMgaXMgdGhlIFNESyB1c2VkIHdoZW4KKyAgY29tcGlsaW5nIHByb2dyYW1zIGZyb20gd2l0aGluIHRoZSBJREUpOgorCisgIHNldCBPU1ZFUlNJT049V0NFNDIwCisgIHNldCBQTEFURk9STT1QT0NLRVQgUEMgMjAwMworICBzZXQgVEFSR0VUQ1BVPUFSTVY0CisKKyAgcmVtIHRoZSBjb21waWxlciBpcyBhbHdheXMgY2wuZXhlLCBkaWZmZXJlbnQgY29tcGlsZXJzIGFyZSBpbiBkaWZmZXJlbnQgcGF0aHMKKyAgc2V0IENDPWNsLmV4ZQorCisgIHJlbSBvYnZpb3VzbHksIHRoZXNlIG5lZWQgdG8gYmUgYWRqdXN0ZWQgdG8gd2hlcmUgeW91IGluc3RhbGxlZCBWUzIwMDgKKyAgc2V0IFZTSU5TVEFMTERJUj1DOlxQcm9ncmFtIEZpbGVzXE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIDkuMAorICBzZXQgU0RLUk9PVD0lVlNJTlNUQUxMRElSJVxTbWFydERldmljZXNcU0RLCisKKyAgc2V0IFBBVEg9JVZTSU5TVEFMTERJUiVcVkNcY2VcYmluXHg4Nl9hcm07JVZTSU5TVEFMTERJUiVcVkNcYmluOyVWU0lOU1RBTExESVIlXENvbW1vbjdcSURFOyVQQVRIJQorICBzZXQgUExBVEZPUk1ST09UPSVTREtST09UJVxQb2NrZXRQQzIwMDMKKworICByZW0gYWRkIGxpYnMgYW5kIGluY2x1ZGVzIGZyb20gdGhlIFNESworICBzZXQgSU5DTFVERT0lUExBVEZPUk1ST09UJVxpbmNsdWRlCisgIHNldCBMSUI9JVBMQVRGT1JNUk9PVCVcbGliXCVUQVJHRVRDUFUlCisKKyAgcmVtIGFkZCBsaWJzIHRoYXQgY2FtZSB3aXRoIFZDOQorICBzZXQgSU5DTFVERT0lSU5DTFVERSU7JVZTSU5TVEFMTERJUiVcVkNcY2VcYXRsbWZjXGluY2x1ZGUKKyAgc2V0IExJQj0lTElCJTslVlNJTlNUQUxMRElSJVxWQ1xjZVxsaWJcJVRBUkdFVENQVSU7JVZTSU5TVEFMTERJUiVcVkNcY2VcYXRsbWZjXGxpYlwlVEFSR0VUQ1BVJQorCisKK1lvdSBzaG91bGQgbm93IGJlIGFibGUgdG8gcnVuIGNsLmV4ZSBmb3IgdGhlIHRhcmdldCB5b3UgZXhwZWN0ZWQuCisKKy0gVGhlIGNyb3NzIGNvbXBpbGVycyBvZiBWQzkgYXJlIHRoZSBzYW1lIHZlcnNpb24gYXMgZm9yIHRoZSBuYXRpdmUgdGFyZ2V0LCBpLmUuIE1TQzE1LgorCistIEluIG9yZGVyIGZvciBTVExwb3J0IHRvIHJlY29nbml6ZSB3aGljaCB0YXJnZXQgeW91IGFyZSBjb21waWxpbmcgZm9yLCB5b3UgbmVlZCB0byBoYXZlCitzb21lIG1hY3JvcyBkZWZpbmVkLCBlLmcuIGZvciB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4gVGhlIGNvbXBpbGVycyBkbyB0aGF0IHBhcnRpYWxseSBvbgordGhlaXIgb3duLCBidXQgbm90IHN1ZmZpY2llbnRseS4gVGhlcmVmb3JlLCBTVExwb3J0IHJlcXVpcmVzIHRoZXNlIGRlZmluZXM6CisKKyAtLSBUaGVzZSBhcmUgZ2VuZXJhbGx5IHNldCBmb3IgQ0U6CisgIF9VTklDT0RFO1VOSUNPREU7X1dJTjMyO1dJTjMyO1VOREVSX0NFO1dJTkNFOworIC0tIFRoaXMgb25lIHVzZXMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gc2V0IHRoZSBDRSB2ZXJzaW9uOgorICBfV0lOMzJfV0NFPSQoQ0VWRVIpOworIC0tIFRoZXNlIGFyZSB1c2VkIHRvIGhlbHAgU1RMcG9ydCByZWNvZ25pc2UgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmU6CisgICQoQVJDSEZBTSk7JChfQVJDSEZBTV8pOyQoSU5TVFJVQ1RJT05TRVQpCisgTm90ZSB0aGF0IHRoZSBpbnN0cnVjdGlvbnNldCBpcyBub3Qgc3RyaWN0bHkgbmVlZGVkIGZvciB4ODYgYnV0IGRlZmluaXRlbHkgZm9yIEFSTS4gSXQKKyBkb2Vzbid0IGh1cnQgZm9yIHg4NiB0aG91Z2gsIHNvIEknZCBhbHdheXMgc2V0IHRoZXNlIGluIGFueSBuZXcgcHJvamVjdC4KKyAtLSBGb3IgcmVsZWFzZSBidWlsZHM6CisgIE5ERUJVRzsKKyAtLSBGb3IgZGVidWcgYnVpbGRzOgorICBERUJVRztfREVCVUc7CisgLS0gRm9yIGRlYnVnIGJ1aWxkcyB3aXRoIGFkZGl0aW9uYWwgU1RMcG9ydCBkaWFnbm9zdGljczoKKyAgREVCVUc7X0RFQlVHO19TVExQX0RFQlVHOworIC0tIEZvciBNRkMgYXBwbGljYXRpb25zOgorICBfQUZYRExMOworCistIEZ1cnRoZXIgc2V0dGluZ3M6CisgQ29kZSBnZW5lcmF0aW9uOiBNdWx0aXRocmVhZGVkIFtEZWJ1Z10gRExMCisgTGFuZ3VhZ2U6IGVuYWJsZSBSVFRJCisgT3B0aW1pemF0aW9uOiBtYXhpbWlzZSBzcGVlZCBhbmQgZW5hYmxlIHdob2xlIHByb2dyYW0gb3B0aW1pemF0aW9uIGZvciByZWxlYXNlIGJ1aWxkcworCistIExpbmtlciBzZXR0aW5nczoKKyBJZ25vcmUgc3BlY2lmaWMgbGlicmFyaWVzOiBsaWJjLmxpYjtsaWJjZC5saWIKKyBDb21tYW5kbGluZTogL1NVQlNZU1RFTTpXSU5ET1dTQ0UKKyBPcHRpbWlzYXRpb246IC9MVENHIGZvciByZWxlYXNlIGJ1aWxkcworCistIFJlc291cmNlIGNvbXBpbGVyOgorIERlZmluZTogVU5ERVJfQ0U7V0lOQ0U7X1dJTjMyX1dDRT0kKENFVkVSKQpkaWZmIC0tZ2l0IGEvZG9jL1JFQURNRS5pbnRlbCBiL2RvYy9SRUFETUUuaW50ZWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJjNjQ1MwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9SRUFETUUuaW50ZWwKQEAgLTAsMCArMSwxOSBAQAorQnVpbGQgb2YgU1RMcG9ydCB3aXRoIEludGVsIEMrKyBjb21waWxlciBmb3IgV2luZG93cyBpcyBpZGVudGljYWwKK3RvIHRoZSBvbmUgZm9yIE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIGNvbXBpbGVyIChzZWUgUkVBRE1FLm1zdmMpLgorCitLbm93biBpc3N1ZXM6CisKKzEuIElmIHlvdSBoYXZlIGJpbmQgeW91ciBJbnRlbCBDKysgY29tcGlsZXIgdG8gdGhlIFZpc3VhbCBTdHVkaW8gNgoraW5zdGFsbCBhbmQgYnVpbGQgeW91ciBhcHBsaWNhdGlvbiB3aXRob3V0IHRoZSAtUXZjNiBvcHRpb24geW91IG1pZ2h0CitleHBlcmllbWVudCBsaW5raW5nIGlzc3VlIGNvbmNlcm5pbmcgJ3N0ZDo6dW5leHBlY3RlZCcgbWlzc2luZyBzeW1ib2wuCitUaGUgcmVhc29uIG9mIHRoaXMgcHJvYmxlbSBpcyB0aGF0IHdpdGhvdXQgLVF2YzYsIElDTCBhZGRzIG5lY2Vzc2FyeQorY29kZSB0byBpbnZva2Ugc3RkOjp1bmV4cGVjdGVkIGZ1bmN0aW9uIHdoZW4gYSByYWlzZWQgZXhjZXB0aW9uIGlzCitkaWZmZXJlbnQgdG8gdGhlIG9uZSBzcGVjaWZpZWQgaW4gYSBmdW5jdGlvbiBwcm90b3R5cGUuIEFzIFZDNiBsaWJyYXJ5CitkbyBub3QgY29udGFpbiB0aGlzIHN5bWJvbCBJQ0wgY2Fubm90IGZpbmQgaXQgYW55d2hlcmUuCisKKyAgQXMgYSB3b3JrYXJvdW5kLCBTVExwb3J0IGhhcyBpdHMgb3duIHN0ZDo6dW5leHBlY3RlZCBpbXBsZW1lbnRhdGlvbgordGhhdCB5b3Ugd2lsbCBmaW5kIGluIHNyYy9kbGxfbWFpbi5jcHAuIElDTCBpcyBsb29raW5nIGZvciBhIHN0YXRpYworc3ltYm9sIHNvIGlmIHlvdSB1c2UgU1RMcG9ydCBzdGF0aWMgbGliIElDTCB3aWxsIHVzZSBpdHMgc3RkOjp1bmV4cGVjdGVkCitpbXBsZW1lbnRhdGlvbiBidXQgaWYgeW91IHVzZSBTVExwb3J0IGR5bmFtaWMgbGliIHRoZW4gSUNMIHdvbid0IGZpbmQKK2l0LiBZb3Ugb25seSBuZWVkIHRoZW4gdG8gY29weS9wYXN0ZSB0aGUgU1RMcG9ydCBpbXBsZW1lbnRhdGlvbiBzb21ld2hlcmUKK2luIHlvdXIgaW1wbGVtZW50YXRpb24gYW5kIElDTCB3aWxsIGJlIGhhcHB5LgpkaWZmIC0tZ2l0IGEvZG9jL1JFQURNRS5taW5ndyBiL2RvYy9SRUFETUUubWluZ3cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFmNDBjMgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9SRUFETUUubWluZ3cKQEAgLTAsMCArMSw1NSBAQAorICBUaGUgTWluR1cgR05VIG1ha2UgY29tbWFuZCBjYW4gYmUgdXNlZCB0byBidWlsZCBTVExwb3J0IHdpdGggZGlmZmVyZW50Citjb21waWxlcnMKKworLSBnY2MgKG5hdGl2ZSBjb21waWxlcik6CisKKyAgTWFrZWZpbGUgOiBnY2MubWFrCisKKyAgTm90ZXM6CisKKyAgICAxLiBTdGF0aWMgbGlicmFyeSAoYXJjaGl2ZSkKKworICAgIElmIHlvdSB1c2UgdGhlIHN0YXRpYyB2ZXJzaW9uIG9mIHRoZSBTVExwb3J0IGxpYnJhcmllcworICB5b3UgaGF2ZSB0byBkZWZpbmUgdGhlIF9TVExQX1VTRV9TVEFUSUNfTElCIG1hY3JvIGluIG9yZGVyCisgIHRvIGhhdmUgeW91ciBleGVjdXRhYmxlIGxpbmtlZCBjb3JyZWN0bHkuCisKKyAgICAyLiBTaGVsbAorCisgICAgWW91IHdpbGwgbmVlZCBNU3lzIGluIG9yZGVyIHRvIGJ1aWxkIFNUTHBvcnQuCisKKyAgICBCZSBjYXJlZnVsbCBhYm91dCB3aGF0IG1ha2UgY29tbWFuZCB5b3UgYXJlIHVzaW5nLiBTVExwb3J0IGNvbWVzIHdpdGggYQorICBHTlUgbWFrZSBidWlsZCBzeXN0ZW0gZGVzaWduIGZvciB1bml4IGxpa2UgcGxhdGZvcm1zLCBtYWtlIGZpbGVzIGhhdmUgbm90CisgIGJlZW4gYWRhcHRlZCBmb3IgdGhlIFdpbmRvd3MgcGxhdGZvcm0uIFNvIHlvdSBoYXZlIHRvIHVzZSB0aGUgbWFrZSBjb21tYW5kCisgIGNvbWluZyB3aXRoIHRoZSBNaW5HVyBwYWNrYWdlICdtaW5ndzMyLW1ha2UnIGFuZCBub3QgdGhlIG9uZSBjb21pbmcgd2l0aCBNU3lzCisgIHRoYXQgaXMgYSBwb3J0YWdlIG9mIHRoZSBHTlUgbWFrZSBmb3IgV2luZG93cy4KKworICAgIDMuIFRocmVhZGluZyBjb25maWd1cmF0aW9uCisKKyAgICBTVExwb3J0IGxpYnJhcmllcyBhcmUgYnVpbHQgcGVyIGRlZmF1bHQgaW4gb3JkZXIgdG8gYmUgdXNlZCBpbiBhCisgIG11bHRpdGhyZWFkZWQgZW52aXJvbm1lbnQuIFVuZGVyIE1pbkdXIGl0IG1lYW5zIHRoYXQgd2UgdXNlIHRoZSAnLW10aHJlYWQnCisgIGNvbXBpbGVyIG9wdGlvbi4gRG9uJ3QgZm9yZ2V0IHRvIGFkZCBpdCB0byB5b3VyIGNvbXBpbGVyIGNvbW1hbmQgbGluZSB0b28KKyAgaWYgeW91IHdhbnQgdG8gdXNlIFNUTHBvcnQgbGlicmFyaWVzLiBZb3UgY2FuIGFsc28gYXNrIGZvciBub3QgdGhyZWFkCisgIHNhZmUgbGlicmFyaWVzIHVzaW5nIHRoZSAtLW5vLXRocmVhZCBjb25maWd1cmUgc2NyaXB0IG9wdGlvbi4KKworICAgIDQuIExpbmtpbmcKKworICAgIEluIHRoaXMgZW52aXJvbm1lbnQgU1RMcG9ydCBpcyBhbG1vc3QgY29tcGxldGUgcmVwbGFjZW1lbnQgZm9yIGxpYnN0ZGMrKy4KKyAgSXQgbWVhbnMgdGhhdCB3aGVuIHlvdSB3ZXJlIGxpbmtpbmcgd2l0aCBsaWJzdGRjKysgKC1sc3RkYysrKSB5b3Ugb25seSBoYXZlCisgIHRvIHJlcGxhY2UgaXQgd2l0aCBTVExwb3J0ICgtbHN0bHBvcnQuNS4yIGZvciBpbnN0YW5jZSkgYW5kIHdpdGggbGlic3VwYysrCisgIGNvbnRhaW5pbmcgbGFuZ3VhZ2UgY29tcGlsZXIgc3VwcG9ydCAobHN1cGMrKykuIEhvd2V2ZXIgZGVmYXVsdCBnY2MKKyAgYmVoYXZpb3IgaXMgdG8gYXV0b21hdGljYWxseSBsaW5rIGxpYnN0ZGMrKyBhbmQgYSBudW1iZXIgb2Ygb3RoZXIgc3lzdGVtIGxpYnMuCisgIFRvIGF2b2lkIHRoaXMgYmVoYXZpb3IgeW91IGhhdmUgdG8gdXNlIHRoZSAtbm9kZWZhdWx0bGlicyBjb21waWxlciBvcHRpb24gYW5kCisgIGV4cGxpY2l0ZWx5IGdpdmUgYWxsIGxpYnJhcmllcyBieSB5b3Vyc2VsZi4gU2VlIGJ1aWxkIG9mIHVuaXQgdGVzdHMgdG8gc2VlIHdoYXQKKyAgbGlicmFyeSB5b3UgbWlnaHQgbmVlZCwgaGVyZSBpcyB0aGUgbGlzdCB3aGVuIHRoaXMgbm90ZSB3YXMgd3JpdHRlbjoKKworICAgIC1sc3RscG9ydGcuNS4yIC1sc3VwYysrIC1sZ2NjX3MgLWxtaW5ndzMyIC1sbWluZ3dleCAtbG1zdmNydCAtbG0gLWxtb2xkbmFtZQorICAgIC1sY29sZG5hbWUgLWxrZXJuZWwzMgorCistIEJvcmxhbmQgQysrIGNvbXBpbGVyOgorCisgIE1ha2VmaWxlIDogYmNjLm1haworCistIERpZ2l0YWwgTWFycyBDKysgY29tcGlsZXI6CisKKyAgTWFrZWZpbGUgOiBkbWMubWFrCisKZGlmZiAtLWdpdCBhL2RvYy9SRUFETUUubXN2YyBiL2RvYy9SRUFETUUubXN2YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDdhYmFjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL1JFQURNRS5tc3ZjCkBAIC0wLDAgKzEsMTg2IEBACisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitTVExwb3J0IFJFQURNRSBmb3IgTWljcm9zb2Z0IFZpc3VhbCBDKysgY29tcGlsZXJzLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworYnk6IEZyYW5jb2lzIER1bW9udCwgZHVtc0BzdGxwb3J0LmNvbSwgbGFzdCBlZGl0ZWQgMDgvMDIvMjAwNQorCis9PT09PT09PT09PT0KK0ludHJvZHVjdGlvbgorPT09PT09PT09PT09CitUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyBob3cgU1RMcG9ydCBjYW4gYmUgY29tcGlsZWQgYW5kIHVzZWQgd2l0aCBNaWNyb3NvZnQKK1Zpc3VhbCBDKysgNiBTUDUuIEl0IGNhbiBhbHNvIGJlIHVzZWQgZm9yIHRoZSBNU1ZDKysgZmFtaWx5LgorCitGb3IgYW55IGZ1cnRoZXIgY29tbWVudHMgb3IgcXVlc3RzaW9uIHZpc2l0IFNUTHBvcnQgbWFpbGluZyBsaXN0cworaHR0cDovL3N0bHBvcnQuc291cmNlZm9yZ2UubmV0L01haWxsaXN0cy5zaHRtbCBvciBmb3J1bXMKK2h0dHBzOi8vc291cmNlZm9yZ2UubmV0L2ZvcnVtLz9ncm91cF9pZD0xNDY4MTQKKworPT09PT09PT09PT09PQorUHJlcmVxdWlzaXRlcworPT09PT09PT09PT09PQorVG8gYnVpbGQgYW5kIHVzZSBTVExwb3J0IHlvdSB3aWxsIG5lZWQgZm9sbG93aW5nIHRvb2xzIGFuZCBsaWJyYXJpZXM6CisgLSBNaWNyb3NvZnQgVmlzdWFsIEMrKyA2LjAgd2l0aCBhdCBsZWFzdCBTZXJ2aWNlIFBhY2sgNSBvciBhbnkgaGlnaGVyCisgdmVyc2lvbi4KKworPT09PT09PT09PT09PT09PT09PQorQ29uZmlndXJpbmcgU1RMcG9ydAorPT09PT09PT09PT09PT09PT09PQorSW4gYSBjb25zb2xlIHdpbmRvdyBnbyB0byB0aGUgU1RMcG9ydCBidWlsZC9saWIgZm9sZGVyLiBSdW4KKworCWNvbmZpZ3VyZSAtLWhlbHAKKworVGhpcyBjb21tYW5kIHdpbGwgcHJlc2VudCB5b3UgdGhlIGRpZmZlcmVudCBhdmFpbGFibGUgYnVpbGQgb3B0aW9ucy4gSnVzdCBmb2xsb3cKK3RoZSBpbnN0cnVjdGlvbnMgdG8gc2V0IFNUTHBvcnQgY29uZmlndXJhdGlvbiBhY2NvcmRpbmcgeW91ciBuZWVkcy4gVGhlIG9ubHkKK21hbmRhdG9yeSBjb25maWd1cmF0aW9uIGlzIHRvIGRlY2xhcmUgd2hhdCBpcyB0aGUgY29tcGlsZXIgeW91IGFyZSBnb2luZyB0bwordXNlLCBmb3IgTVNWQyA2IGl0IGlzOgorCisJY29uZmlndXJlIC1jIG1zdmM2CisKKz09PT09PT09PT09PT09PT0KK0J1aWxkaW5nIFNUTHBvcnQKKz09PT09PT09PT09PT09PT0KK1RoaXMgaXMgYSBzdGVwIGJ5IHN0ZXAgZGVzY3JpcHRpb24gb2YgdGhlIGFjdGlvbnMgdG8gdGFrZSBpbiBvcmRlciB0byBoYXZlCit0aGUgU1RMcG9ydCBsaWJyYXJ5IGJ1aWx0OgorCisxLiBPcGVuIGEgY29uc29sZSB3aW5kb3cuIFlvdSBjYW4gZ2V0IGl0IGV4ZWN1dGluZyBjbWQgb3IgY29tbWFuZCBkZXBlbmRpbmcKK29uIHlvdXIgV2luZG93cyBPUy4KKworMi4gR28gdG8gTVNWQysrIEJpbiBkaXJlY3Rvcnkgd2l0aCBhIGRlZmF1bHQgTVNWQzYgaW5zdGFsbCBpdCBpcworCWNkICJDOlxQcm9ncmFtIEZpbGVzXE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvXFZDOThcQmluIgorCiszLiBSdW4gdGhlIHZjdmFyczMyLmJhdCBzY3JpcHQuIFRoaXMgc2V0cyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIHJlcXVpcmVkCit0byBoYXZlIHRoZSBNU1ZDKysgY29tcGlsZXIgcnVuIGR1cmluZyB0aGUgYnVpbGQgcHJvY2Vzcy4gVGhlIG1vc3QgaW1wb3J0YW50CitvbmUgaXMgdGhlIFBBVEggdmFyaWFibGUgc28gdGhhdCB5b3UgY2FuIGNhbGwgdGhlIGNsLmV4ZSBjb21tYW5kIHdoaWNoIGlzIHRoZQorTVNWQysrIGNvbW1hbmQgbGluZSBjb21waWxlci4gW1lvdSBtYXkgb21pdCB0aGlzIHN0ZXAsIGlmIHlvdSBjaG9zZSAnSW5zdGFsbCBwYXRocwordG8gYWNjZXNzIGNvbW1hbmQtbGluZSB0b29scycgZHVyaW5nIE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIGluc3RhbGxhdGlvbiBwcm9jZWR1cmUuXQorCis0LiBHbyB0byB0aGUgU1RMcG9ydCBidWlsZC9saWIgZm9sZGVyOgorCWNkIEM6XFNUTHBvcnRcYnVpbGRcbGliCisKKzUuIFJ1biB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6CisJbm1ha2UgL2Ztc3ZjLm1hayBpbnN0YWxsCisKKwlubWFrZSBpcyB0aGUgbWFrZSB1dGlsaXR5IGZyb20gTWljcm9zb2Z0LiAvZiBpcyBhbiBubWFrZSBvcHRpb24KK3RlbGxpbmcgaXQgd2hpY2ggbWFrZSBmaWxlIHNjcmlwdCB0byB1c2UuIFlvdSBoYXZlIG9mIGNvdXJzZSB0byBncmFudCB0aGUgCitjbG9zZXIgbWFrZSBmaWxlIHRvIHlvdXIgZWZmZWN0aXZlIGNvbXBpbGVyLCBtc3ZjLm1hayBpbiBvdXIgY2FzZS4KKworCU9uY2UgdGhlIGNvbW1hbmQgcmV0dXJucywgeW91IHdpbGwgaGF2ZSBhbGwgdGhlIG5lY2Vzc2FyeSBsaWJyYXJpZXMgd2l0aGluCit0aGUgU1RMcG9ydCBsaWIgZm9sZGVyLiBGb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgZ2VuZXJhdGVkIGxpYnJhcmllcyBjaGVjayB0aGUgUkVBRE1FCitmaWxlIHdpdGhpbiB0aGUgc3JjIGZvbGRlci4KKworPT09PT09PT09PT09PT09CitUZXN0aW5nIFNUTHBvcnQKKz09PT09PT09PT09PT09PQorWW91IGNhbiB1c2UgdGhlIHVuaXQgdGVzdHMgdG8gdmVyaWZ5IFNUTHBvcnQgYmVoYXZlcyBjb3JyZWN0bHkuIENoYW5nZSBpbnRvCitTVExwb3J0cyAnYnVpbGQvdGVzdC91bml0JyBmb2xkZXIgYW5kIHR5cGU6CisKKyAgbm1ha2UgL2Ztc3ZjLm1hayBpbnN0YWxsCisKK09uY2UgdGhlIHVuaXQgdGVzdCBpcyBidWlsdCB5b3UganVzdCBuZWVkIHRvIHJ1biBpdC4gVGhleSBjYW4gYmUgZm91bmQKK3dpdGhpbiB0aGUgU1RMcG9ydCBiaW4gZm9sZGVyLgorCis9PT09PT09PT09PT09CitVc2luZyBTVExwb3J0Cis9PT09PT09PT09PT09CitBZGp1c3QgeW91ciBpbmNsdWRlIGFuZCBsaW5rIHBhdGhzIGluIE1TVkMgSURFIChpbiAnVG9vbHMgLT4gT3B0aW9ucyAtPiBEaXJlY3RvcmllcycKK2ZvciBNU1ZDNiBJREUpLiBJbiB0aGUgaW5jbHVkZSBmaWxlcyBhZGQgdGhlIHBhdGggdG8gU1RMcG9ydCdzICdzdGxwb3J0JyBmb2xkZXIuIAorTWFrZSBzdXJlIGl0IGlzIHRoZSBmaXJzdCBkaXJlY3RvcnkgbGlzdGVkIHRoZXJlLiBBZGQgU1RMcG9ydCdzICdsaWInIGZvbGRlciBmb3IKK3RoZSBsaWJyYXJ5IGZpbGVzIChvcmRlciBvZiBwYXRocyBkb2Vzbid0IG1hdHRlciBoZXJlKS4KKworVGhlcmUgYXJlIHNvbWUgcHJlcHJvY2Vzc29yIGRlZmluZXMgdGhhdCBjb250cm9sIHVzYWdlIG9mIHRoZSBTVExwb3J0IGluIG1zdmMKK3Byb2plY3RzOgorCitJZiB5b3UgZG9uJ3Qgd2FudCB0byB1c2UgdGhlIGlvc3RyZWFtcyBwYXJ0IG9mIHRoZSBsaWJyYXJ5LCB5b3UgY2FuIHNwZWNpZnkgdGhlCitkZWZpbmUgX1NUTFBfTk9fSU9TVFJFQU1TLiBJbiB0aGlzIG1vZGUgdGhlcmUgaXMgbm8gbmVlZCB0byBsaW5rIGFnYWluc3QgdGhlCitsaWJyYXJ5LgorCitTVExwb3J0IHVzZXMgYXV0b21hdGljIGxpbmtpbmcgdG8gZmluZCB0aGUgcHJvcGVyIC5saWIgZmlsZS4gSWYgeW91IHdhbnQgdG8gc2VlCit3aGF0IGltcG9ydCBsaWJyYXJ5IFNUTHBvcnQgaXMgZ29pbmcgdG8gdXNlLCBkZWZpbmUgX1NUTFBfVkVSQk9TRV9BVVRPX0xJTksuCitXaGVuIG5vdCB1c2luZyBhdXRvbWF0aWMgbGlua2luZyAoYnkgc3BlY2lmeWluZyBfU1RMUF9ET05UX1VTRV9BVVRPX0xJTkspLCB5b3UKK2hhdmUgdG8gc3BlY2lmeSB0aGUgcHJvcGVyIC5saWIgZmlsZSBpbiB0aGUgUHJvamVjdCBTZXR0aW5ncywgb24gdGhlICJsaW5rIiB0YWIuCitUaGUgLmxpYiBuYW1lcyBoYXZlIHRoZSBmb2xsb3dpbmcgc3ludGF4OgorCisgICBzdGxwb3J0W2R8c3RsZF1bX3gsX3N0YXRpYyxfc3RhdGl4XS48U1RMcG9ydC1WZXJzaW9uPi5saWIKKworICAgZCA6IGRlYnVnIGJ1aWxkCisgICBzdGxkOiBkZWJ1ZyBidWlsZCB3aXRoIF9TVExQX0RFQlVHIChTVEwgc2FmZSkgbW9kZQorICAgX3g6IEJ1aWxkIG9mIFNUTHBvcnQgYXMgYSBkbGwgYnV0IHN0YXRpY2FsbHkgbGluayB0byB0aGUgbmF0aXZlIHJ1bnRpbWUuCisgICBfc3RhdGljIDogYnVpbGQgb2YgYSBzdGF0aWMgbGlicmFyeQorICAgX3N0YXRpeCA6IGJ1aWxkIG9mIGEgc3RhdGljIGxpYnJhcnkgbGluayBkeW5hbWljYWxseSB0byB0aGUgbmF0aXZlIHJ1bnRpbWUuCisgICAKK0V4YW1wbGVzOgorCisgICBzdGxwb3J0X3N0YXRpYy41LjAubGliIC0gc3RhdGljIHJlbGVhc2UgdmVyc2lvbiwgVmVyc2lvbiA1LjAuMAorICAgc3RscG9ydGQuNS4wLmxpYiAtIGRsbCBkZWJ1ZyB2ZXJzaW9uLCBWZXJzaW9uIDUuMC4wCisKK1doZW4gdXNpbmcgU1RMcG9ydCB0b2dldGhlciB3aXRoIE1GQywgYmUgc3VyZSB0byBpbmNsdWRlIHRoZSBNRkMgaGVhZGVycyBmaXJzdCwKK3RoZW4gaW5jbHVkZSBTVExwb3J0IGhlYWRlcnMsIGUuZy4gaW4geW91ciBTdGRhZnguaC4gVGhpcyB3YXkgU1RMcG9ydCBjb3JyZWN0bHkKK3JlY29nbml6ZXMgTUZDIHVzYWdlLiBZb3UgYWxzbyBjYW4gZGVmaW5lIHRoZSBtYWNybyBfU1RMUF9VU0VfTUZDLCBlaXRoZXIgaW4KK3lvdXIgcHJvamVjdCBzZXR0aW5ncyBvciBpbiBzdGxwb3J0L3N0bC9jb25maWcvdXNlcl9jb25maWcuaC4KKworSW4gb3JkZXIgdG8gZW5oYW5jZSBkZWJ1Z2dpbmcgd2l0aCBTVExwb3J0IHlvdSBjYW4gb3B0aW9uYWxseSBhZGQgdGhlIGNvbnRlbnQgb2YKK3RoZSBldGMvYXV0b2V4cC5kYXQgZmlsZSBpbiB0aGUgYXV0b2V4cC5kYXQgZmlsZSBjb21pbmcgd2l0aCB5b3VyIFZpc3VhbCBTdHVkaW8KK2luc3RhbGwuCisKK05vdyB5b3Ugc2hvdWxkIGJlIHJlYWR5IHRvIHVzZSBTVExwb3J0LgorCis9PT09PT09PT09PT0KK0tub3duIGlzc3VlcworPT09PT09PT09PT09CisKKzEuIEludGVybG9ja2VkSW5jcmVtZW50CisKKwlJZiB5b3UgZXhwZXJpbWVudCB0cm91YmxlIHdpdGggdGhlIEludGVybG9ja2VkSW5jcmVtZW50IFdpbjMyIEFQSSBmdW5jdGlvbgorbGlrZSB0aGUgZm9sbG93aW5nIG1lc3NhZ2U6CisKK0M6XFByb2dyYW0gRmlsZXNcTWljcm9zb2Z0IFNES1xJbmNsdWRlXC5cd2luYmFzZS5oKDEzOTIpIDogZXJyb3IgQzI3MzM6IHNlY29uZCBDCitsaW5rYWdlIG9mIG92ZXJsb2FkZWQgZnVuY3Rpb24gJ0ludGVybG9ja2VkSW5jcmVtZW50JyBub3QgYWxsb3dlZAorQzpcUHJvZ3JhbSBGaWxlc1xNaWNyb3NvZnQgU0RLXEluY2x1ZGVcLlx3aW5iYXNlLmgoMTM5MCkgOiBzZWUgZGVjbGFyYXRpb24gb2YKKydJbnRlcmxvY2tlZEluY3JlbWVudCcKKworCUl0IG1lYW5zIHRoYXQgeW91IGFyZSB1c2luZyB0aGUgbmV3IE1pY3Jvc29mdCBwbGF0Zm9ybSBTREsuIFRoZXJlIGlzIG5vCit3YXkgdG8ga25vd24gaXQgZnJvbSBTVExwb3J0IGNvZGUgc28geW91IGhhdmUgdG8gc2lnbmFsIGl0IGluIHRoZSAKK3N0bHBvcnQvc3RsL2NvbmZpZy91c2VyX2NvbmZpZy5oIGZpbGUgKHVuY29tbWVudCBfU1RMUF9ORVdfUExBVEZPUk1fU0RLIGluIHRoaXMgZmlsZSkuCisKKzIuIE5hdGl2ZSBDL0MrKyBsaWJyYXJ5IGhlYWRlcnMgbG9jYXRpb24KKworCUlmIHlvdSBleHBlcmltZW50IHRyb3VibGUgd2l0aCBsb2NhdGlvbiBvZiBjdGltZSBhbmQgb3RoZXIgU3RhbmRhcmQgaGVhZGVycword2hpbGUgYnVpbGRpbmcgb3IgdXNpbmcgU1RMcG9ydCB5b3UgbWlnaHQgYmUgdXNpbmcgdGhlIGNvbXBpbGVyIGNvbWluZyB3aXRoIGEKK3BsYXRmb3JtIFNESy4gSWYgc28gcGxlYXNlIHVuY29tbWVudCBfU1RMUF9VU0lOR19QTEFURk9STV9TREtfQ09NUElMRVIgaW4KK3N0bHBvcnQvc3RsL2NvbmZpZy91c2VyX2NvbmZpZy5oLiBJZiBpdCBzdGlsbCBkbyBub3QgZmluZCBuYXRpdmUgaGVhZGVycyB5b3Ugd2lsbAorcGVyaGFwcyBuZWVkIHRvIGNoYW5nZSBuYXRpdmUgaGVhZGVycyByZWxhdGl2ZSBwYXRoIHVzZWQgYnkgU1RMcG9ydC4gSW4gdGhpcyBjYXNlIHVzZQorX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSCBhbmQgYXNzb2NpYXRlZCBtYWNybyBpbiBzdGxwb3J0L3N0bC9jb25maWcvaG9zdC5oLgorCis0LiBDIHN5bWJvbHMgaW4gc3RkIG5hbWVzcGFjZQorCitUaGUgY29tcGlsZXIgb2YgTVNWQysrIDYgaGFzIGEgYnVnIHdoZW4gZGVhbGluZyB3aXRoIHN5bWJvbHMgZXhpc3RhbnQgaW4gYm90aAordGhlIGdsb2JhbCBuYW1lc3BhY2UgYW5kIHN5bWJvbHMgaW1wb3J0ZWQgYnkgYSB1c2luZy1kaXJlY3RpdmUgb3IgYSAKK3VzaW5nLWRlY2xhcmF0aW9uIC0gaXQgd2lsbCByZXBvcnQgYW4gYW1iaWd1b3VzIGNhbGwgdG8gYW4gb3ZlcmxvYWRlZAorZnVuY3Rpb24gKGVycm9yIEMyNjY4KS4gRXhhbXBsZToKKwordm9pZCBmdW5jdGlvbigpOworbmFtZXNwYWNlIG5zIHsKKyAgIHZvaWQgZnVuY3Rpb24oKTsKKyAgIC8vIG9yOgorICAgLy8gdXNpbmcgOjpmdW5jdGlvbjsKK30KKwordXNpbmcgbnM6OmZ1bmN0aW9uOworLy8gb3I6CisvLyB1c2luZyBuYW1lc3BhY2UgbnM7CisKK3ZvaWQgY2FsbCgpIHsKKyAgIGZ1bmN0aW9uKCk7Cit9CisKK1NpbmNlIHdlIGFudGljaXBhdGUgdGhhdCB1c2luZy1kZWNsYXJhdGlvbnMgb3IgZXZlbiB1c2luZy1kaXJlY3RpdmVzIGFyZSBjb21tb24KK3VzZSwgU1RMcG9ydCBieSBkZWZhdWx0IGRvZXNuJ3QgaW1wb3J0IG9yIHdyYXAgZnVuY3Rpb25zIHRoYXQgZXhpc3QgaW4gYm90aCB0aGUKK2dsb2JhbCBuYW1lc3BhY2UgYW5kIG5hbWVzcGFjZSBzdGQsIGluIHBhcnRpY3VsYXIgdGhvc2UgYXJlIGZ1bmN0aW9ucyB3aXRoIEMgCitvcmlnaW4gbGlrZSBmb3BlbigpIG9yIGFicygpLiBBbHNvLCBpdCBkZWZpbmVzIGFkZGl0aW9uYWwgb3ZlcmxvYWRzIGZvcgorZnVuY3Rpb25zIGxpa2UgYWJzKCkgKG92ZXJsb2FkZWQgZm9yIGludCwgbG9uZywgZmxvYXQsIGRvdWJsZSwgbG9uZyBkb3VibGUpIGluCit0aGUgZ2xvYmFsIG5hbWVzcGFjZS4KKworSW4gb3JkZXIgdG8gbWFrZSBTVExwb3J0IGluY2x1ZGUgdGhlbSBpbiB0aGUgc3RkIG5hbWVzcGFjZSwgeW91IGNhbiBkZWZpbmUgdGhlCitfU1RMUF9ET19JTVBPUlRfQ1NURF9GVU5DVElPTlMgbWFjcm8uIERvaW5nIHNvLCB5b3Ugd2lsbCBoYXZlIHRvIGV4cGxpY2l0ZWx5IAorc2NvcGUgYWxsIHlvdXIgZnVuY3Rpb25zIGNhbGxzIGxpa2Ugc3RkOjphYnMoKSB0aG91Z2ggLSBvdGhlcndpc2UgeW91IG9ubHkgZ2V0Cit0aGUgZ2xvYmFsIGFicyhpbnQpIGZyb20gdGhlIEMgbGlicmFyeS4KZGlmZiAtLWdpdCBhL2RvYy9SRUFETUUudXRmOCBiL2RvYy9SRUFETUUudXRmOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTQ3ZmU5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL1JFQURNRS51dGY4CkBAIC0wLDAgKzEsNTEgQEAKKyAgSGVyZSBpcyBhIGRlc2NyaXB0aW9uIG9mIGhvdyB5b3UgY2FuIHVzZSBTVExwb3J0IHRvIHJlYWQvd3JpdGUgdXRmOCBmaWxlcy4KK3V0ZjggaXMgYSB3YXkgb2YgZW5jb2Rpbmcgd2lkZSBjaGFyYWN0ZXJzLiBBcyBzbywgbWFuYWdlbWVudCBvZiBlbmNvZGluZyBpbgordGhlIEMrKyBTdGFuZGFyZCBsaWJyYXJ5IGlzIGhhbmRsZSBieSB0aGUgY29kZWN2dCBsb2NhbGUgZmFjZXQgd2hpY2ggaXMgcGFydAorb2YgdGhlIGN0eXBlIGNhdGVnb3J5LiBIb3dldmVyIHV0Zjggb25seSBkZXNjcmliZSBob3cgZW5jb2RpbmcgbXVzdCBiZQorcGVyZm9ybWVkLCBpdCBjYW5ub3QgYmUgdXNlZCB0byBjbGFzc2lmeSBjaGFyYWN0ZXJzIHNvIGl0IGlzIG5vdCBlbm91Z2ggaW5mbwordG8ga25vdyBob3cgdG8gZ2VuZXJhdGUgdGhlIHdob2xlIGN0eXBlIGNhdGVnb3J5IGZhY2V0cyBvZiBhIGxvY2FsZQoraW5zdGFuY2UuCisKK0luIEMrKyBpdCBtZWFucyB0aGF0IHRoZSBmb2xsb3dpbmcgY29kZSB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiB0bworc2lnbmFsIHRoYXQgY3JlYXRpb24gZmFpbGVkOgorCisjaW5jbHVkZSA8bG9jYWxlPgorLy8gV2lsbCB0aHJvdyBhIHN0ZDo6cnVudGltZV9lcnJvciBleGNlcHRpb24uCitzdGQ6OmxvY2FsZSBsb2MoIi51dGY4Iik7CisKK0ZvciB0aGUgc2FtZSByZWFzb24gYnVpbGRpbmcgYSBsb2NhbGUgd2l0aCB0aGUgY3R5cGUgZmFjZXRzIGJhc2VkIG9uCitVVEY4IGlzIGFsc28gd3Jvbmc6CisKKy8vIFdpbGwgdGhyb3cgYSBzdGQ6OnJ1bnRpbWVfZXJyb3IgZXhjZXB0aW9uOgorc3RkOjpsb2NhbGUgbG9jKGxvY2FsZTo6Y2xhc3NpYygpLCAiLnV0ZjgiLCBzdGQ6OmxvY2FsZTo6Y3R5cGUpOworCitUaGUgb25seSBzb2x1dGlvbiB0byBnZXQgYSBsb2NhbGUgaW5zdGFuY2UgdGhhdCB3aWxsIGhhbmRsZSB1dGY4IGVuY29kaW5nCitpcyB0byBzcGVjaWZpY2FsbHkgc2lnbmFsIHRoYXQgdGhlIGNvZGVjdnQgZmFjZXQgc2hvdWxkIGJlIGJhc2VkIG9uIHV0ZjgKK2VuY29kaW5nOgorCisvLyBXaWxsIHN1Y2NlZWQgaWYgdGhlcmUgaXMgbmVjZXNzYXJ5IHBsYXRmb3JtIHN1cHBvcnQuCitsb2NhbGUgbG9jKGxvY2FsZTo6Y2xhc3NpYygpLCBuZXcgY29kZWN2dF9ieW5hbWU8d2NoYXJfdCwgY2hhciwgbWJzdGF0ZV90PigiLnV0ZjgiKSk7CisKKyAgT25jZSB5b3UgaGF2ZSBvYnRhaW4gYSBsb2NhbGUgaW5zdGFuY2UgeW91IGNhbiBpbmplY3QgaXQgaW4gYSBmaWxlIHN0cmVhbSB0bworcmVhZC93cml0ZSB1dGY4IGZpbGVzOgorCitzdGQ6OmZzdHJlYW0gZnN0cigiZmlsZS51dGY4Iik7Citmc3RyLmltYnVlKGxvYyk7CisKK1lvdSBjYW4gYWxzbyBhY2Nlc3MgdGhlIGZhY2V0IGRpcmVjdGx5IHRvIHBlcmZvcm0gdXRmOCBlbmNvZGluZy9kZWNvZGluZyBvcGVyYXRpb25zOgorCit0eXBlZGVmIHN0ZDo6Y29kZWN2dDx3Y2hhcl90LCBjaGFyLCBtYnN0YXRlX3Q+IGNvZGVjdnRfdDsKK2NvbnN0IGNvZGVjdnRfdCYgZW5jb2RpbmcgPSB1c2VfZmFjZXQ8Y29kZWN2dF90Pihsb2MpOworCitOb3RlczoKKworMS4gVGhlIGRvdCAoJy4nKSBpcyBtYW5kYXRvcnkgaW4gZnJvbnQgb2YgdXRmOC4gVGhpcyBpcyBhIFBPU0lYIGNvbnZlbnRpb24sIGxvY2FsZQorbmFtZXMgaGF2ZSB0aGUgZm9sbG93aW5nIGZvcm1hdDoKK2xhbmd1YWdlW19jb3VudHJ5Wy5lbmNvZGluZ11dCisKK0V4OiAnZnJfRlInCisgICAgJ2ZyZW5jaCcKKyAgICAncnVfUlUua29pOHInCisKKzIuIHV0ZjggZW5jb2RpbmcgaXMgb25seSBzdXBwb3J0ZWQgZm9yIHRoZSBtb21lbnQgdW5kZXIgV2luZG93cy4gVGhlIGxlc3MgY29tbW9uCit1dGY3IGVuY29kaW5nIGlzIGFsc28gc3VwcG9ydGVkLgpkaWZmIC0tZ2l0IGEvZG9jL1JFQURNRS53aW5jZSBiL2RvYy9SRUFETUUud2luY2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZlYjVhOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9SRUFETUUud2luY2UKQEAgLTAsMCArMSw5NCBAQAorUHJvZ3JhbW1pbmcgdW5kZXIgTVMgV2luZG93cyBDRSB3aXRoIFNUTHBvcnQNCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisNCitUaGlzIGlzIHN1cHBvc2VkIHRvIGdpdmUgYW4gb3ZlcnZpZXcgZm9yIHByb2dyYW1taW5nIG9uIE1TIFdpbmRvd3MgQ0UsIHdpdGggYW5kDQorcGFydGlhbGx5IHdpdGhvdXQgU1RMcG9ydCwgd2hhdCB0b29scyBhcmUgYXZhaWxhYmxlIGFuZCB3aGF0IGNvbW1vbiBwaXRmYWxscw0KK2V4aXN0LiBOb3RlIHRoYXQgZm9yIGV2ZXJ5IHN1cHBvcnRlZCBjb21waWxlciB0aGVyZSBpcyBhbm90aGVyIHJlYWRtZSBmaWxlIHdoaWNoDQorZXhwbGFpbnMgdGhlIHNwZWNpZmljcyBvZiB0aGF0IGNvbXBpbGVyLg0KKw0KKw0KKw0KK0F2YWlsYWJsZSBjb21waWxlcnM6DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorLSBFbWJlZGRlZCBWaXN1YWwgQysrIDMgKGVWQzMpOiB0aGlzIElERS9jb21waWxlciBpcyBmb3IgdGhlIENFMyB0YXJnZXQgcGxhdGZvcm1zLg0KK1RoZSBpbmNsdWRlZCBjb21waWxlciBpcyBNU0MxMiwgdGhlIHNhbWUgYXMgZm9yIFZDNiwgc28gbWFueSB3b3JrYXJvdW5kcyBmb3IgaXRzDQorJ2ZlYXR1cmVzJyBhcHBseSBoZXJlLCB0b28uIFNUTHBvcnQgd29ya3Mgb3V0IG9mIHRoZSBib3ggd2l0aCB0aGlzLg0KKw0KKy0gRW1iZWRkZWQgVmlzdWFsIEMrKyA0IChlVkM0KTogYmFzaWNhbGx5IHRoZSBzYW1lIGFzIGVWQzMsIGJ1dCBpdCBjYW4gY29tcGlsZSBmb3INCitDRTQueCBhbmQgNS4gTm90ZSB0aGF0IGN1cnJlbnRseSAoMjAwNy0wMy0wNikgSSBoYXZlbid0IHRlc3RlZCB0aGlzIHdpdGggQ0U1LA0KK2JlY2F1c2UgeW91IGNhbiB1c2UgYSBiZXR0ZXIgY29tcGlsZXIgdXNpbmcgVkM4L1ZTMjAwNS4gVGhpcyBjb21waWxlciBjYW4gYmUNCitkb3dubG9hZGVkIGZvciBmcmVlIGZyb20gdGhlIE1TIHdlYnNpdGUsIGluY2x1ZGluZyBhIHByb2R1Y3QgYWN0aXZhdGlvbiBrZXkuDQorU1RMcG9ydCB3b3JrcyBvdXQgb2YgdGhlIGJveCB3aXRoIHRoaXMuDQorDQorLSBWaXN1YWwgQysrIDggKFZDOCkgYWthIFZpc3VhbCBTdHVkaW8gMjAwNSAoVlMyMDA1KTogd2l0aCB0aGlzIHZlcnNpb24gKGFuZA0KK3BhcnRpYWxseSBhbHJlYWR5IHZlcnNpb24gNykgdGhlIGVtYmVkZGVkIGFuZCBkZXNrdG9wIElERXMgaGF2ZSBiZWVuIG1lcmdlZCBhZ2FpbiwNCitzbyBpdCBzdXBwb3J0cyBjb21waWxpbmcgZm9yIE1TIFdpbmRvd3MgQ0UsIHZlcnNpb25zIDUgYW5kIGxhdGVyLiBOb3RlIHRoYXQgdGhlDQorZnJlZWx5IGRvd25sb2FkYWJsZSBleHByZXNzIGVkaXRpb24gZG9lcyBub3QoISkgYWxsb3cgY29tcGlsaW5nIGZvciBDRS4gVGhpcyBJREUNCit1c2VzIE1TQzE0IGFzIGNvbXBpbGVyLiBTVExwb3J0IHdvcmtzIG91dCBvZiB0aGUgYm94IHdpdGggQ0U1Lg0KKw0KKy0gUGxhdGZvcm0gQnVpbGRlcnMgKFBCKTogdGhpcyB0b29sIGlzIHVzZWQgdG8gY3JlYXRlIGEgQ0UgaW1hZ2UuIFlvdSBjYW4gc2VsZWN0IHRoZQ0KK21vZHVsZXMgKGUuZy4gRXhwbG9yZXIsIGJ1dCBhbHNvIEMrKyBSVFRJKSB5b3UgaW5jbHVkZSBpbiB0aGUgaW1hZ2UuIFRoZXNlIElERXMgdXNlDQorc2V2ZXJhbCBkaWZmZXJlbnQgY29tcGlsZXJzIChNU0MxMi0xNCkuIFNUTHBvcnQgaGFzbid0IGJlZW4gdGVzdGVkIHdpdGggdGhpcw0KK0lERSwgQUZBSUsuDQorDQorLSBUaGVyZSB1c2VkIHRvIGJlIGFuIGFkZG9uIGZvciBWQzYoPykgdGhhdCBhbGxvd2VkIGNvbXBpbGluZyBmb3IgQ0UuIFRoaXMgcGx1Z2luDQoraGFzIGJlZW4gc3VwZXJjZWVkZWQgYnkgZVZDMy80IGFuZCBzdXBwb3J0IGZvciBpdCBoYXMgYmVlbiByZW1vdmVkIGZyb20gU1RMcG9ydCBpbg0KK3ZlcnNpb24gNS4NCisNCistIE90aGVyczogc29tZSB2ZW5kb3JzIChlLmcuIEludGVsKSBwcm92aWRlIGNvbXBpbGVycyB0aGF0IGFyZSBhYmxlIHRvIGdlbmVyYXRlDQorQ0UgZXhlY3V0YWJsZXMuIEknbSBub3QgYXdhcmUgb2YgYW4gYXR0ZW1wdCB0byBjb21waWxlIFNUTHBvcnQgd2l0aCB0aGVtLg0KKw0KKw0KKw0KK0Vudmlyb25tZW50IHNwZWNpYWx0aWVzOg0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCistIEluIG9yZGVyIHRvIGRldmVsb3AgZm9yIGEgcGxhdGZvcm0sIHRoZSBmaXJzdCB0aGluZyB5b3UgbmVlZCBpcyBhIHNvLWNhbGxlZCBTREsuDQorVGhpcyBwYWNrYWdlIGluY2x1ZGVzIGhlYWRlcnMgYW5kIGxpYnJhcmllcyB0aGF0IChtb3JlIG9yIGxlc3MpIHJlc2VtYmxlIHRoZSBBUElzDQorYXZhaWxhYmxlIG9uIHRoZSBkZXZpY2UuIFRoZSBJREVzIGNvbWUgd2l0aCBhIGJhc2ljIHNlbGVjdGlvbiBvZiBTREtzLCBidXQgaW4NCitnZW5lcmFsIHlvdSBuZWVkIHRvIHJldHJpZXZlIGFuIGFjY29yZGluZyBTREsgZnJvbSB0aGUgdmVuZG9yLiBJZiB5b3UgYXJlIHRoZQ0KK3ZlbmRvciwgeW91IGNhbiBnZW5lcmF0ZSBhbiBTREsgZm9yIGEgcGxhdGZvcm0gd2l0aCBQbGF0Zm9ybSBCdWlsZGVyLg0KKw0KKy0gVGhlIHByb3ZpZGVkIEFQSSBpcyB0eXBpY2FsbHkgYSBzdWJzZXQgb2YgdGhlICdub3JtYWwnIHdpbjMyIEFQSS4gT2Z0ZW4sIHNvbWUNCitmZWF0dXJlcyBhcmUgc2ltcGx5IG5vdCBzdXBwb3J0ZWQsIGxpa2Ugc2VjdXJpdHkgZGVzY3JpcHRvcnMgd2hlbiBvcGVuaW5nIGZpbGVzLg0KK0Fsc28sIHRoZXNlIEFQSXMgYXJlIG9ubHkgc3VwcG9ydGVkIGZvciB3Y2hhcl90IHN0cmluZ3MsIGUuZy4gb25seSBDcmVhdGVGaWxlVygpDQorYW5kIG5vdCBDcmVhdGVGaWxlQSgpLg0KKw0KKy0gQ0UgZG9lc24ndCBoYXZlIGEgY3VycmVudCBkaXJlY3RvcnksIGhlbmNlIG5vIHJlbGF0aXZlIHBhdGhzIHRvIHRoYXQgZGlyLiBZb3UgY2FuIA0KK2hhdmUgcmVsYXRpdmUgcGFydHMgaW4gZ2xvYmFsIHBhdGhzIHRob3VnaC4NCisNCistIENFIGRvZXNuJ3QgaGF2ZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMsIHRodXMgU1RMcG9ydCBjYW4ndCBzdXBwb3J0IGUuZy4NCitzZXRlbnYvZ2V0ZW52LiBJdCBhbHNvIGRvZXNuJ3QgYXR0ZW1wdCB0byBwcm92aWRlIHdvcmthcm91bmRzLg0KKw0KKy0gU2luY2UgbWFueSBmZWF0dXJlcyBhcmUgb3B0aW9uYWwgKHNlZSB0aGUgZGVzY3JpcHRpb24gb2YgUGxhdGZvcm0gQnVpbGRlciksIGl0DQoraXMgcG9zc2libGUgdGhhdCB5b3UgZG9uJ3QgaGF2ZSBlLmcuIGEgY29uc29sZSB0aGF0IHN0ZDo6Y291dCBjb3VsZCB3cml0ZSB0by4gVGhlDQorc2FtZSBhcHBsaWVzIHRvIGV4Y2VwdGlvbnMgKHNlZSBlLmcuIHRoZSBhZGQtb24gbGliIGZvciBSVFRJIGZvciBlVkM0KS4gT3RoZXINCitmZWF0dXJlcyBtaWdodCBnbyBhbWlzcywgdG9vLiBUaGlzIG1ha2VzIGl0IGhhcmQgZm9yIFNUTHBvcnQgdG8gYWRhcHQgdG8sIGluDQorcGFydGljdWxhciBiZWNhdXNlIHRoaXMgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZSBvdXRzaWRlIFBCLCBhIGhlYWRlciBtaWdodA0KK2RlY2xhcmUgYSBmdW5jdGlvbiB0aGF0IGluIGZhY3QgaXMgbm90IHByZXNlbnQuIEtlZXAgdGhpcyBpbiBtaW5kIHdoZW4geW91IGdldA0KK2xpbmtlciBlcnJvcnMuDQorDQorLSBUaGUgc3VwcGxpZWQgQysrIHN0YW5kYXJkIGxpYnJhcnkgaXMgZXh0cmVtZWx5IGN1dCBkb3duLCBlLmcuIGlvc3RyZWFtcyBhbmQNCitsb2NhbGVzIGFyZSBtaXNzaW5nIGNvbXBsZXRlbHkuDQorDQorLSBUaGUgc3VwcGxpZWQgc3RhbmRhcmQgQyBBUEkgaXMgYXQgYmVzdCBydWRpbWVudGFyeS4gRnVuY3Rpb25zIGxpa2UgZS5nLiB0aW1lKCkgb3INCitjbG9jaygpIGFyZSBkZWNsYXJlZCBidXQgbm90IGRlZmluZWQuIFNUTHBvcnQgZG9lc24ndCBpbmNsdWRlIGFueSB3b3JrYXJvdW5kcyBmb3INCit0aGVzZSBtaXNzaW5nIGZ1bmN0aW9ucyBhdCBwcmVzZW50Lg0KKw0KKy0gQWxsIGNvbXBpbGVycyBhcmUgY3Jvc3MtY29tcGlsZXJzLCBpLmUuIHlvdSBydW4gdGhlbSBvbiBhIHdpbjMyIGhvc3QgYW5kIHRoZXkNCitwcm9kdWNlIGV4ZWN1dGFibGUgY29kZSBmb3IgdGhlIHRhcmdldCBwbGF0Zm9ybS4gVGhlIHNhbWUgYXBwbGllcyB0byB0aGUgZGVidWdnZXIsDQord2hpY2ggaXMgY29ubmVjdGVkIHZpYSBzZXJpYWwsIFVTQiBvciBldGhlcm5ldC4gQWx0ZXJuYXRpdmVseSwgdGhlcmUgYXJlIGVtdWxhdG9ycw0KK3RoYXQgcnVuIG9uIHRoZSBob3N0IG1hY2hpbmUgYW5kIHNpbXVsYXRlIHRoZSB0YXJnZXQgcGxhdGZvcm0uDQorDQorLSBUaGUgZW50cnlwb2ludCBmb3IgZXhlY3V0YWJsZXMgaXMgZ2VuZXJhbGx5IFdpbk1haW4uIE5vcm1hbGx5LCB5b3Ugd291bGQgaGF2ZQ0KK3N3aXRjaGVkIHRvIGEgbm9ybWFsIG1haW4oKSB1c2luZyAvU1VCU1lTVEVNOkNPTlNPTEUgb24gdGhlIGxpbmtlciBjb21tYW5kbGluZS4NCitUaGUgbGlua2VycyBmb3IgYXQgbGVhc3QgQ0U0IGFuZCA1IGRvbid0IHVuZGVyc3RhbmQgdGhpcyBzd2l0Y2gsIHRoZXkgY2xhaW0gaXQNCitjb25mbGljdHMgd2l0aCBDRSB0YXJnZXRzLiBJbnN0ZWFkLCBzZXQgdGhlIGVudHJ5cG9pbnQgZGlyZWN0bHkgdG8gDQorbWFpbkFDUlRTdGFydHVwLg0KKw0KKy0gVGhlIG5hbWUgb2YgYSBETEwgbG9hZGVkIHZpYSBhbiBpbXBvcnQgbGlicmFyeSBjYW4ndCBiZSBsb25nZXIgdGhhbiAzMiBjaGFycy4gSWYNCit0aGlzIGlzIG5vdCB0aGUgY2FzZSwgdGhlIGFwcGxpY2F0aW9uIHdpbGwgYmVoYXZlIGFzIGlmIHRoZSBETEwgd2FzIG5vdCBwcmVzZW50IG9yDQorY291bGRuJ3QgYmUgbG9hZGVkIGZvciB3aGF0ZXZlciBvdGhlciByZWFzb24uIFRoaXMgbGltaXRhdGlvbiBhcHBsaWVzIHRvIGF0IGxlYXN0DQorQ0UgNCBhbmQgNS4NCisNCmRpZmYgLS1naXQgYS9kb2MvUkVBRE1FLndpbmRvd3MgYi9kb2MvUkVBRE1FLndpbmRvd3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQyM2I2ZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9SRUFETUUud2luZG93cwpAQCAtMCwwICsxLDU1IEBACitOb3RlIGZvciBXaW5kb3dzIHVzZXJzOgorCisgIEl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0byBkZWNsYXJlIHRoZSBXaW5kb3dzIE9TIHZlcnNpb24geW91IGFyZQordGFyZ2V0dGluZyB3aGVuIGJ1aWxkaW5nIHRoZSBsaWJyYXJ5IGFzIHdlbGwgYXMgd2hlbiB1c2luZyBpdC4gWW91IGNhbiBkbyBzbwordGhhbmtzIHRvIHRoZSB3ZWxsIGtub3duIE1pY3Jvc29mdCBtYWNyb3MgV0lOVkVSLCBfV0lOMzJfV0lORE9XUyBvcgorX1dJTjMyX1dJTk5ULCBzZWUgeW91ciBwbGF0Zm9ybSBTREsgZG9jdW1lbnRhdGlvbiBmb3IgYSBkZXNjcmlwdGlvbgorb2YgdGhvc2UgbWFjcm9zIGFuZCBob3cgdG8gdXNlIHRoZW0uIFRvIGRlZmluZSBpdCB3aGVuIGJ1aWxkaW5nIHRoZQorbGlicmFyeSwgdXNlIHRoZSBjb25maWd1cmUgc2NyaXB0IC0tZXh0cmEtY3h4ZmxhZyBvcHRpb24uIEhlcmUgaXMgdGhlCitjb25maWd1cmF0aW9uIHRvIGJ1aWxkIFNUTHBvcnQgdXNpbmcgVmlzdWFsIFN0dWRpbyAyMDA1IGFuZCB0YXJnZXR0aW5nCitXaW5kb3dzIFhQOgorCitjb25maWd1cmUgLWMgbXN2YzggLS1leHRyYS1jeHhmbGFnICIvRF9XSU4zMl9XSU5OVD0weDA1MDEiCisKKyAgSWYgeW91IGRvIG5vdCBkZWNsYXJlIGl0IGF0IGJ1aWxkIHRpbWUgU1RMcG9ydCB3aWxsIGFkYXB0IHRvIHRoZSBQU0RLIGluCit1c2UsIHdpbmRvd3MuaCBnaXZlcyBhIGRlZmF1bHQgdmFsdWUgdG8gV0lOVkVSLiBIb3dldmVyLCB3aGVuIHVzaW5nIHRoZQorbGlicmFyeSwgd2luZG93cy5oIGlzIG5vdCBuZWNlc3NhcmlseSBpbmNsdWRlZCwgYXQgbGVhc3Qgbm90IGJ5IFNUTHBvcnQKK2ludGVybmFsbHksIHNvIG5vbmUgb2YgdGhlIG1hY3JvcyBhcmUgZGVmaW5lZCB3aGljaCB3aWxsIHJlc3VsdCBpbiBhbgoraW5jb25zaXN0ZW5jeSBpbiB0aGUgYnVpbGQgcHJvY2VzcyB3aGljaCBtb3N0IG9mIHRpbWUgd2lsbCBnZW5lcmF0ZSB1bmRlZmluZWQKK2JlaGF2aW9yIGF0IHJ1bnRpbWUuCisKKyAgSGVyZSBpcyB0aGUgbWFpbiByZWFzb24gZm9yIGZvbGxvd2luZyB0aGlzIGFkdmlzZSwgdGhlIFdpbmRvd3MgOTUKK2NvbXBhdGliaWxpdHkgaXNzdWU6CisKKyAgQmVjYXVzZSBvZiBhIG1vZGlmaWNhdGlvbiBpbiB0aGUgYmVoYXZpb3Igb2YgdGhlIFdpbjMyIEFQSSBmdW5jdGlvbnMKK0ludGVybG9ja2VkSW5jcmVtZW50IGFuZCBJbnRlcmxvY2tlZERlY3JlbWVudCBhZnRlciBXaW5kb3dzIDk1LCBTVExwb3J0CitsaWJyYXJpZXMgYnVpbHQgZm9yIFdpbmRvd3MgOTUgY2Fubm90IGJlIHVzZWQgdG8gZ2VuZXJhdGUgYW4gYXBwbGljYXRpb24KK2J1aWx0IGZvciBXaW5kb3dzIFhQIGZvciBpbnN0YW5jZS4gU28sIGlmIHlvdSBidWlsZCBTVExwb3J0IHdpdGggYSBXaW5kb3dzCis5NSBQU0RLLCBTVExwb3J0IHdpbGwgYmUgcmVhZHkgZm9yIFdpbmRvd3MgOTUuIElmIHlvdSB0aGVuIHVzZSBpdCB3aXRob3V0CitkZWZpbmluZyBfV0lOMzJfV0lORE9XUyB0byBzaWduYWwgV2luZG93cyA5NSBjb21wYXRpYmlsaXR5LCBTVExwb3J0IHdpbGwKK2NvbnNpZGVyIHRoYXQgaXQgY2FuIHVzZSBsYXRlc3QgV2luZG93cyBPUyBmZWF0dXJlcyBsaWtlIHRoZSBuZXcKK0ludGVybG9ja2VkSW5jcmVtZW50IGFuZCBJbnRlcmxvY2tlZERlY3JlbWVudCBmdW5jdGlvbnMgd2hpY2ggY2hhbmdlIHRoZQorbWVtb3J5IGZvb3RwcmludCBvZiBzb21lIGludGVybmFsIFNUTHBvcnQgb2JqZWN0cyBtYWtpbmcgaXQgaW5jb21wYXRpYmxlCit3aXRoIHRoZSBsaWJyYXJpZXMgYnVpbHQgZm9yIFdpbmRvd3MgOTUuCisKKyAgTm9ybWFsbHksIGRvaW5nIHNvIHdvdWxkbid0IGdlbmVyYXRlIGFueSBjb21waWxhdGlvbiBvciBsaW5rIGVycm9yLCB5b3UKK3dvdWxkIG9ubHkgZXhwZXJpbWVudCB1bmRlZmluZWQgYmVoYXZpb3IgYXQgcnVudGltZS4gSW4gb3JkZXIgdG8gbWFrZSB0aGlzCitwcm9ibGVtIG1vcmUgb2J2aW91cyBTVExwb3J0IGZvcmNlcyBhIGxpbmsgdGltZSBlcnJvciBpbiBkZWJ1ZyBtb2RlIChfREVCVUcKK21hY3JvIGRlZmluZWQpLgorCitVbnJlc29sdmVkIHN5bWJvbCB3aWxsIGJlOgorICAtICdidWlsZGluZ19mb3JfYXRfbGVhc3Rfd2luZG93czk4X2J1dF9saWJyYXJ5X2J1aWx0X2Zvcl93aW5kb3dzOTUnCisgIGlmIHlvdSBhcmUgdHJ5aW5nIHRvIHVzZSBTVExwb3J0IGxpYnJhcmllcyBidWlsdCBmb3IgV2luZG93cyA5OCBvciBsYXRlcgorICB0byBnZW5lcmF0ZSBhbiBhcHBsaWNhdGlvbiB0YXJnZXR0aW5nIHRoZSBXaW5kb3dzIDk1IHBsYXRmb3JtLgorICAtICdidWlsZGluZ19mb3Jfd2luZG93czk1X2J1dF9saWJyYXJ5X2J1aWx0X2Zvcl9hdF9sZWFzdF93aW5kb3dzOTgnCisgIGlmIHlvdSBhcmUgdHJ5aW5nIHRvIHVzZSBTVExwb3J0IGxpYnJhcmllcyBidWlsdCBmb3IgV2luZG93cyA5NSB0byBnZW5lcmF0ZQorICBhbiBhcHBsaWF0aW9uIHRhcmdldHRpbmcgdGhlCisgIAorICBXaW5kb3dzIFhQIHBsYXRmb3JtIGZvciBpbnN0YW5jZS4KKworICBPZiBjb3Vyc2UsIHRhcmdldHRpbmcgdGhlIGxhdGVzdCBXaW5kb3dzIE9TIHZlcnNpb25zIHdpbGwgZ2l2ZSB5b3UgdGhlIGJlc3QKK3BlcmZvcm1hbmNlIGZyb20gU1RMcG9ydC4gVGhpcyBpcyB3aHkgd2hlbiBub25lIG9mIHRoZSBwbGF0Zm9ybSBtYWNyb3MgYXJlCitkZWZpbmVkIFNUTHBvcnQgY29uc2lkZXIgdGhhdCB0aGVyZSBpcyBubyBtaW5pbXVtIE9TIHJlcXVpcmVtZW50IGFuZCB3aWxsCit1c2UgdGhlIGxhdGVzdCBBUEkgZnVuY3Rpb25zLiBUaGVyZSBpcyBvbmx5IG9uZSBleGNlcHRpb24gdG8gdGhpcyBiZWhhdmlvciwKK3RoZSBTd2l0Y2hUb1RocmVhZCBmdW5jdGlvbiB0aGF0IGlzIHVzZWQgb25seSBpZiB5b3UgZGVmaW5lIF9XSU4zMl9XSU5OVCB0byBhCit2YWx1ZSBoaWdoZXIgb3IgZXF1YWwgdG8gMFgwNDAwLgpkaWZmIC0tZ2l0IGEvZG9jL2J1aWxkX3N5c3RlbS50eHQgYi9kb2MvYnVpbGRfc3lzdGVtLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDM5YjBkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2J1aWxkX3N5c3RlbS50eHQKQEAgLTAsMCArMSw4MiBAQAorVGhlIFNUTHBvcnQgYnVpbGQgc3lzdGVtCis9PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhpcyBpcyBhIGJhc2ljIG92ZXJ2aWV3IG9mIHRoZSBTVExwb3J0IGJ1aWxkIHN5c3RlbS4gQXQgdGhlIG1vbWVudCwgSSdtIG9ubHkgZmFtaWxpYXIgCit3aXRoIHRoZSB3b3JraW5nIG9mIHRoZSBubWFrZSB2YXJpYW50LCBpLmUuIGZvciBNU1ZDLCBlVkMgYW5kIElDQy93aW4zMiwgb3RoZXIgdmFyaWFudHMKK21heSBkaWZmZXIuCisKK092ZXJ2aWV3OgorLS0tLS0tLS0tLQorCisKK1RoZXJlIGFyZSB0aHJlZSBiYXNpYyBjbGFzc2VzIHRvIGNvbnNpZGVyIHdoaWxlIGJ1aWxkaW5nOgorMS4gVGhlIHVzZWQgbWFrZSB0b29sIChjdXJyZW50bHkgdGhhdCBpcyBtYWtlIChHTlUgbWFrZSkgYW4gbm1ha2UgKE1pY3Jvc29mdCkpLgorMi4gVGhlIHVzZWQgY29tcGlsZXIKKzMuIFRoZSB0YXJnZXQgdHlwZSwgZWl0aGVyIGFwcGxpY2F0aW9uIG9yIGxpYnJhcnkKKworT3RoZXIgdGhhbiB0aGF0LCB0aGVyZSBhcmUgdGhyZWUgZGlmZmVyZW50IHNldHRpbmdzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHRocmVlIGRpZmZlcmVudCAKK1NUTHBvcnQgbW9kZXMsICdyZWxlYXNlJywgJ2RlYnVnJyBhbmQgJ1NUTGRlYnVnJyBhbmQgZWFjaCBvbmUgaGFzIHR3byBtb2RlcyBmb3IgZWl0aGVyCitzdGF0aWMgb3IgZHluYW1pYyBsaW5raW5nLgorCitUaGUgd2hvbGUgYnVpbGQgc3lzdGVtIGxpZXMgdW5kZXIgdGhlIGJ1aWxkLyBkaXIgb2YgdGhlIHNvdXJjZSB0cmVlLiBUaGVyZSwgaXQgZmlyc3QgCiticmFuY2hlcyB0byBNYWtlZmlsZXMvICh3aGljaCBjb250YWlucyB0aGUgYmFzZSBvZiB0aGUgYnVpbGQgc3lzdGVtKSBhbmQgdG8gbGliLyAod2hpY2ggCitjb250YWlucyBmaWxlcyB0byBidWlsZCB0aGUgU1RMcG9ydCBsaWJyYXJ5KSBhbmQgdGVzdC8gKHdoaWNoIGNvbnRhaW5zIGZpbGVzIHRvIGJ1aWxkCit0ZXN0cykgKFRPRE86IHdoYXQgaXMgdGhlIG1pc2MvIGZvbGRlciBmb3I/KS4KKworVW5kZXIgTWFrZWZpbGVzLywgeW91IHNlZSB0aGUgaW5pdGlhbGx5IG1lbnRpb25lZCBicmFuY2hpbmcgYWNjb3JkaW5nIHRvIHRoZSBidWlsZCB0b29sLgorSGVyZSBpcyBhbHNvIHdoZXJlIHRoZSBjb25maWd1cmUuYmF0IGZpbGUgcHV0cyB0aGUgZ2VuZXJhdGVkIGNvbmZpZy5tYWsgZmlsZS4gKFRPRE86Cit3aGF0IGFyZSB0aGUgb3RoZXIgZmlsZXMgaW4gdGhhdCBmb2xkZXI/KQorCitubWFrZToKKy0tLS0tLS0KKworVW5kZXIgbm1ha2UvLCB5b3UgdGhlbiBmaW5kIHRoZSBjb21tb24gc3VwcG9ydCBmaWxlcyBmb3IgdGhlIGRpZmZlcmVudCBjb21waWxlcnMgYW5kIAorZmlsZXMgdGhhdCBkZWZpbmUgZ2VuZXJpYyBydWxlcy4gSGVyZSwgaXQgdGhlbiBzcGxpdHMgaW50byBhcHAvIGFuZCBsaWIvLCB3aGljaCBhcmUgCitzdHJ1Y3R1cmVkIHNpbWlsYXIgdG8gZWFjaCBvdGhlciBhbmQgdG8gdGhlIGNvbW1vbiBubWFrZS8gZGlyLiBJbiBlYWNoIGRpciB5b3UgaGF2ZQorZmlsZXMgZm9yIHRoZSBkaWZmZXJlbnQgY29tcGlsZXJzIHRoYXQgYXJlIHVzZWQgdG8gbWFrZSBhcHBsaWNhdGlvbiBzcGVjaWZpYyBvciBsaWJyYXJ5CitzcGVjaWZpYyBzZXR0aW5ncy4KKworVGhlIGJyYW5jaGluZyBpbiB0aGUgdGhyZWUgU1RMcG9ydCBtb2RlcyBhbmQgdGhlIHN0YXRpYy9keW5hbWljIGxpbmtpbmcgaXMgbm90IHZpc2libGUKK2luIHRoZSBmaWxlIHN0cnVjdHVyZSBidXQgb25seSBpbiB0aGUgdXNlZCBubWFrZSB2YXJpYWJsZXMuCisKK0luIG9yZGVyIHRvIG1ha2UgY2xlYXIgd2hpY2ggZmlsZSBpbmNsdWRlcyB3aGljaCBvdGhlciBmaWxlLCBoZXJlIGFuIGV4YW1wbGUgd2hlbiAKK2NvbXBpbGluZyB0aGUgU1RMcG9ydCBsaWJyYXJ5IGZvciBlVkM0LiBUaGUgY2FsbCBpc3N1ZWQgaXMgJ25tYWtlIC9mIGV2YzQubWFrJyBpbiB0aGUKK2J1aWxkL2xpYiBmb2xkZXIuIEZyb20gdGhlcmUsIHRoZSBmb2xsb3dpbmcgaW5jbHVkZSB0cmVlIGlzIGNyZWF0ZWQ6CisKK2J1aWxkL2xpYi9ldmMubWFrCisgIGJ1aWxkL01ha2VmaWxlcy9jb25maWcubWFrIDsgZ2VuZXJhdGVkIGJ5IGNvbmZpZ3VyZS5iYXQKKyAgYnVpbGQvTWFrZWZpbGVzL25tYWtlL3RvcC5tYWsKKyAgICBidWlsZC9NYWtlZmlsZXMvY29uZmlnLm1haworICAgIGJ1aWxkL01ha2VmaWxlcy9ubWFrZS9zeXNpZC5tYWsKKyAgICBidWlsZC9NYWtlZmlsZXMvbm1ha2Uvc3lzLm1haworICAgICAgYnVpbGQvTWFrZWZpbGVzL25tYWtlL2V2YzQubWFrIDsgZXZjNCBmcm9tIGNvbmZpZworICAgICAgICBidWlsZC9NYWtlZmlsZXMvbm1ha2UvZXZjLWNvbW1vbi5tYWsKKyAgICBidWlsZC9NYWtlZmlsZXMvbm1ha2UvdGFyZ2V0ZGlycy5tYWsKKyAgICBidWlsZC9NYWtlZmlsZXMvbm1ha2UvZXh0ZXJuLm1haworICAgIGJ1aWxkL01ha2VmaWxlcy9ubWFrZS90YXJnZXRzLm1haworICAgICAgYnVpbGQvTWFrZWZpbGVzL25tYWtlL3J1bGVzLW8ubWFrCisgICAgYnVpbGQvTWFrZWZpbGVzL25tYWtlL2NsZWFuLm1haworICAgIGJ1aWxkL01ha2VmaWxlcy9ubWFrZS9saWIvdG9wLm1hayA7IHdvdWxkIGJlIGFwcC90b3AubWFrIHdoZW4gYnVpbGRpbmcgYW4gYXBwbGljYXRpb24KKyAgICAgIGJ1aWxkL01ha2VmaWxlcy9ubWFrZS9saWIvbWFjcm8ubWFrCisgICAgICBidWlsZC9NYWtlZmlsZXMvbm1ha2UvbGliL2V2YzQubWFrIDsgZXZjNCBmcm9tIGNvbmZpZworICAgICAgICBidWlsZC9NYWtlZmlsZXMvbm1ha2UvbGliL2V2Yy1jb21tb24ubWFrCisgICAgICBidWlsZC9NYWtlZmlsZXMvbm1ha2UvbGliL3J1bGVzLXNvLm1haworICAgICAgYnVpbGQvTWFrZWZpbGVzL25tYWtlL2xpYi9ydWxlcy1hLm1haworICAgICAgYnVpbGQvTWFrZWZpbGVzL25tYWtlL2xpYi9ydWxlcy1pbnN0YWxsLXNvLm1haworICAgICAgYnVpbGQvTWFrZWZpbGVzL25tYWtlL2xpYi9ydWxlcy1pbnN0YWxsLWEubWFrCisgICAgICBidWlsZC9NYWtlZmlsZXMvbm1ha2UvbGliL2NsZWFuLm1haworCitUT0RPOiBidWlsZC9NYWtlZmlsZXMvY29uZmlnLm1hayBpcyBpbmNsdWRlZCBib3RoIGJ5IGJ1aWxkL2xpYi9ldmMubWFrIGFuZCBieSAKK2J1aWxkL01ha2VmaWxlcy9ubWFrZS90b3AubWFrLgorCitLbm93biBpc3N1ZXM6CistLS0tLS0tLS0tLS0tLQorCistIG5tYWtlOiBNU0MgZG9lc24ndCBzdXBwb3J0IGdlbmVyYXRpbmcgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbiBmb3IgbWFrZWZpbGVzLiBTbywgdW5sZXNzCit5b3UgbW9kaWZ5IHRoZSBkaXJlY3Qgc291cmNlIGZpbGUgZm9yIGFuIG9iamVjdCBmaWxlLCBubyByZWNvbXBpbGF0aW9uIGlzIHRyaWdnZXJlZCEgWW91IAorbmVlZCB0byBlaXRoZXIgZGVsZXRlIGFsbCBvYmplY3QgZmlsZXMgdGhhdCBuZWVkIHRvIGJlIHJlY29tcGlsZWQgb3IgJ21ha2UgY2xlYW4nCisKKy0gVGhlcmUgYXJlIHRhcmdldHMgdG8gb25seSBpbnN0YWxsIGUuZy4gdGhlIHNoYXJlZCBTVExkZWJ1ZyB2ZXJzaW9uIGJ1dCB0aGVyZSBpcyBubyAKK3N1Y2ggdGhpbmcgZm9yIG1ha2luZyBjbGVhbi4gVGhpcyB3b3VsZCBiZSB1c2VmdWwgaW4gdGhlIGNvbnRleHQgb2YgYWJvdmUgaXNzdWUgZm9yIAorbWFraW5nIGEgc2VsZWN0aXZlIGNsZWFuIG9ubHkuCisKZGlmZiAtLWdpdCBhL2RvYy9wb2ludGVyX3NwZWNpYWxpemF0aW9uLnR4dCBiL2RvYy9wb2ludGVyX3NwZWNpYWxpemF0aW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzBjNTA2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3BvaW50ZXJfc3BlY2lhbGl6YXRpb24udHh0CkBAIC0wLDAgKzEsOTAgQEAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgICAgIFRoaXMgZG9jdW1lbnQgZGVzY3JpYmUgdGhlIFNUTHBvcnQgY29udGFpbmVyIHBvaW50ZXIgICAgICAgKgorKiAgICAgICAgICAgICAgICAgIHNwZWNpYWxpemF0aW9uIGZlYXR1cmUuICAgICAgICAgICAgICAgICAgICAgICAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgV2hhdCBpcyBpdCBmb3I6CisKKyAgICBUaGUgbWFqb3IgcHJvYmxlbSBvZiB0ZW1wbGF0ZSBjb2RlIGlzIHRoZSBwb3RlbnRpYWx5IGh1Z2UgYmluYXJ5CisgIHNpemUgdGhhdCBjYW4gcmVzdWx0IGZyb20gdGhlIGNvbXBpbGF0aW9uLiBFYWNoIHRlbXBsYXRlIHR5cGUgCisgIGluc3RhbmNpYXRpb24gaXMgYSBuZXcgdHlwZSBmcm9tIHRoZSBjb21waWxlciBwb2ludCBvZiB2aWV3IGV2ZW4gaWYKKyAgdGhlIGdlbmVyYXRlZCBiaW5hcmllcyBhcmUgaWRlbnRpY2Fscy4gVG8gYXZvaWQgdGhpcyBiaW5hcnkgZHVwbGljYXRpb24KKyAgU1RMcG9ydCBncmFudCB0aGUgcGFydGlhbCBwb2ludGVyIHNwZWNpYWxpemF0aW9uIGZvciA0IGNvbnRhaW5lcnM6CisgICAgLSB2ZWN0b3IKKyAgICAtIGRlcXVlCisgICAgLSBsaXN0CisgICAgLSBzbGlzdAorCisgIEhvdyBkb2VzIGl0IHdvcms6CisKKyAgICBUaGUgcG9pbnRlciBzcGVjaWFsaXphdGlvbiBjb25zaXN0cyBpbiB1c2luZyBhIHZvaWQqIGNvbnRhaW5lcgorICBpbnN0YW5jaWF0aW9uIGZvciBhbnkgY29udGFpbmVyIG9mIHBvaW50ZXJzLCBpbmNsdWRpbmcgcG9pbnRlcnMKKyAgdG8gY3YgcXVhbGlmaWVkIHR5cGVzLiBTbyB0aGUgY29udGFpbmVyIHBvaW50ZXIgc3BlY2lhbGl6YXRpb25zCisgIGFyZSBvbmx5IGJyaWRnZXMgdGhhdCBmb3J3YXJkIGFsbCB0aGUgbWV0aG9kIGNhbGxzIHRvIHRoZQorICB1bmRlcmx5aW5nIHZvaWQqIGNvbnRhaW5lciBpbnN0YW5jaWF0aW9uLiBUaGUgYnJpZGdlIGpvYiBpcyB0bworICBjYXN0IHRoZSBwb2ludGVyIHR5cGUgdG8gYW5kIGZyb20gdGhlIHZvaWQqIHR5cGUuCisgIAorICBXaHkgb25seSB0aG9zZSA0IGNvbnRhaW5lcnM6CisKKyAgICBTb21lIG9mIHlvdSBtaWdodCB3b25kZXIgd2h5IG5vbmUgb2YgdGhlIGFzc29jaWF0aXZlIGNvbnRhaW5lcnMKKyAgb3IgaGFzaCBjb250YWluZXJzIGhhcyBiZWVuIHNwZWNpYWxpemVkLiBMZXRzIHRha2UgdGhlIHNldCBjb250YWluZXIKKyAgYXMgYW4gZXhhbXBsZS4gSXRzIGRlY2xhcmF0aW9uIGlzCisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCAKKyAgICAgICAgICAgICAgY2xhc3MgX0NvbXBhcmUgPSBsZXNzPF9UcD4sCisgICAgICAgICAgICAgIGNsYXNzIF9BbGxvYyA9IGFsbG9jYXRvcjxfVHA+ID4KKyAgICBjbGFzcyBzZXQ7CisKKyAgICBJbiBhIGZpcnN0IHRob3VnaHQgeW91IGNhbiBpbWFnaW5lIGEgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBsaWtlCisgIHRoZSBmb2xsb3dpbmc6CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX0FsbG9jPgorICAgIGNsYXNzIHNldDxfVHAqLCBfQ29tcGFyZSwgX0FsbG9jPgorCisgICAgV2hhdCB3b3VsZCBiZSB0aGUgdW5kZXJseWluZyBjb250YWluZXIgZm9yIHN1Y2ggYSBwYXJ0aWFsIAorICBzcGVjaWFsaXphdGlvbj8gVGhlIF9BbGxvYyB0eXBlIGlzIHN1cHBvc2VkIHRvIGhhdmUgYSByZWJpbmQgbWVtYmVyCisgIG1ldGhvZCBzbyB5b3UgY2FuIGVhc2lseSBmaW5kIHRoZSBfVm9pZEFsbG9jIHR5cGUuIFRoZSBfQ29tcGFyZSB0eXBlLAorICBvbiB0aGUgb3RoZXIgaGFuZCwgZG8gbm90IGhhdmUgdGhpcyBraW5kIG9mIFN0YW5kYXJkIHJlcXVpcmVtZW50cy4KKyAgU28geW91IG5lZWQgdG8gd3JhcCB0aGUgX0NvbXBhcmUgdHlwZSB3aXRoaW4gYSBfV3JhcENvbXBhcmUgdHlwZQorICB0aGF0IHdpbGwgdGFrZSBjYXJlIG9mIGFsbCB0aGUgY2FzdCB3b3JrLiBUaGUgdW5kZXJseWluZyBjb250YWluZXIKKyAgdHlwZSB3aWxsIGJlOgorICAKKyAgICBzZXQ8dm9pZCosIF9XcmFwQ29tcGFyZTxfVHAsIF9Db21wYXJlPiwgX1ZvaWRBbGxvYz4KKworICAgIFRoZSBwcm9ibGVtIG9mIHN1Y2ggYSB0eXBlIGlzIHRoYXQgaXQgaXMgc3RpbGwgZGVwZW5kZW50IG9uIHRoZSAKKyAgb3JpZ2luYWwgX1RwIHR5cGUgZm9yIHRoZSBfV3JhcENvbXBhcmUgaW5zdGFuY2lhdGlvbi4gU28gZWFjaCBzZXQKKyAgaW5zdGFuY2lhdGlvbiB3aWxsIGhhdmUgYSBkaXN0aW5jdCB1bmRlcmx5aW5nIHZvaWQqIGNvbnRhaW5lciBhbmQKKyAgd2UgZmFsbCBiYWNrIG9uIGEgYmluYXJ5IGR1cGxpY2F0aW9uIHRyb3VibGUuCisKKyAgICBPbiBhIHNlY29uZCB0aG91Z2h0IGEgcG9zc2libGUgc29sdXRpb24gaXMgdG8gbGltaXQgdGhlIHBhcnRpYWwKKyAgc3BlY2lhbGl6YXRpb24gbGlrZSB0aGF0OgorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgorICAgIGNsYXNzIHNldDxfVHAqLCBsZXNzPF9UcCo+LCBfQWxsb2M+CisKKyAgICBXZSBvbmx5IHNwZWNpYWxpemVkIHRoZSBzZXQgY29udGFpbmVyIGlmIHRoZSBjb21wYXJpc29uIGZ1bmN0b3IKKyAgaXMgdGhlIFN0YW5kYXJkIGxlc3Mgc3RydWN0LiBUaGUgdW5kZXJseWluZyBjb250YWluZXIgd291bGQgYmU6CisKKyAgICBzZXQ8dm9pZCosIGxlc3M8dm9pZCo+LCBfVm9pZEFsbG9jPgorCisgICAgSXQgbG9va3MgZmluZSBidXQgaXQgaXMgd3JvbmcuIEFjdHVhbGx5IGEgU1RMIHVzZXIgaXMgZnJlZSB0bworICBzcGVjaWFsaXplZCB0aGUgbGVzcyBzdHJ1Y3QgZm9yIGFueSBwb2ludGVyIHR5cGUgZXZlbiB0aGUgYmFzaWMgb25lLgorICBJbiBzdWNoIGEgc2l0dWF0aW9uIHRoZSBjbGllbnQgd291bGQgdGhpbmsgdGhhdCB0aGUgc2V0IGlzIG9yZGVyZWQKKyAgYWNjb3JkaW5nIGl0cyBvd24gZnVuY3RvciBidXQgd2lsbCBmaW5hbGx5IGhhdmUgYSBzZXQgb3JkZXJlZCBhY2NvcmRpbmcKKyAgdGhlIGxlc3M8dm9pZCo+IGZ1bmN0b3IuIFRoZSBsZXNzIHNwZWNpYWxpemF0aW9uIGlzc3VlIGFsc28gc2hvdyB0aGF0CisgIHRoZSB1bmRlcmx5aW5nIGNhbm5vdCBiZSBhCisKKyAgICBzZXQ8dm9pZCosIGxlc3M8dm9pZCo+LCBfVm9pZEFsbG9jPgorCisgIGJ1dCB3aWxsIGhhdmUgdG8gYmUgYQorCisgICAgc2V0PHZvaWQqLCBfX2xlc3M8dm9pZCo+LCBfVm9pZEFsbG9jPgorCisgIHdoZXJlIF9fbGVzcyB3b3VsZCBiZSBlcXVpdmFsZW50IHRvIHRoZSBzdGFuZGFyZCBsZXNzIGZ1bmN0b3IgYnV0IAorICB3b3VsZCBub3QgYmUgc3BlY2lhbGl6YWJsZSBiZWNhdXNlIHVucmVhY2hhYmxlIGZyb20gdGhlIGNsaWVudCBjb2RlLgorCisgICAgVGhlcmUgaXMgb2YgY291cnNlIGEgc29sdXRpb24gZm9yIHRoaXMgc3BlY2lhbGl6YXRpb24gaXNzdWUuIFdlIAorICBuZWVkIHRvIGJlIGFibGUgdG8gZGV0ZWN0IHRoZSBsZXNzIHNwZWNpYWxpemF0aW9uLiBUaGUgcGFydGlhbCBzZXQKKyAgc3BlY2lhbGl6YXRpb24gd291bGQgaGF2ZSB0byBiZSB1c2VkIG9ubHkgaWYgdGhlIGxlc3MgZnVuY3RvciBpcyAKKyAgdGhlIGRlZmF1bHQgU1RMcG9ydCBpbXBsZW1lbnRhdGlvbiBiYXNlZCBvbiB0aGUgc3RyaWN0IG9yZGVyaW5nIG9wZXJhdG9yLgorICBObyBkb3VidCB0aGF0IGEgc29sdXRpb24gdG8gdGhpcyBwcm9ibGVtIHdpbGwgYmUgc29vbiBmb3VuZC4KZGlmZiAtLWdpdCBhL2RvYy9zdGxwb3J0X25hbWVzcGFjZXMudHh0IGIvZG9jL3N0bHBvcnRfbmFtZXNwYWNlcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI0M2IwMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zdGxwb3J0X25hbWVzcGFjZXMudHh0CkBAIC0wLDAgKzEsMTMzIEBACitUaGlzIGRvY3VtZW50IHByZXNlbnQgdGhlIFNUTHBvcnQgbmFtZXNwYWNlIHNjaGVtYSBhbmQgZ2l2ZSBhZGRpdGlvbm5hbAoraW5mb3JtYXRpb24gYWJvdXQgaG93IFNUTHBvcnQgcmVwbGFjZSB0aGUgbmF0aXZlIEMrKyBTdGFuZGFyZCBsaWJyYXJ5Citjb21pbmcgd2l0aCB5b3VyIGNvbXBpbGVyLgorCisxLiBXaGF0IGlzIHRoZSBTVExwb3J0IG5hbWVzcGFjZSA/CisKKyAgQXMgU1RMcG9ydCBpcyBhIEMrKyBTdGFuZGFyZCBsaWJyYXJ5IGltcGxlbWVudGF0aW9uIHRoZSBTVExwb3J0IG5hbWVzcGFjZQoraXMgJ3N0ZCcuIEluIG5vcm1hbCB1c2UgdGhpcyBpcyBhbGwgeW91IG5lZWQgdG8ga25vdyBhbmQgeW91IGNhbiBzdG9wIHJlYWRpbmcKK2hlcmUuCisKKzIuIEhvdyBkb2VzIFNUTHBvcnQgcmVwbGFjZSBuYXRpdmUgQysrIFN0YW5kYXJkIGxpYnJhcnkgPworCisgIFNUTHBvcnQgZGVmaW5lcyBhIG1hY3JvICdzdGQnIHRoYXQgcmVwbGFjZXMgYWxsIHJlZmVyZW5jZXMgb2Ygc3RkIGluIHRoZQordXNlciBjb2RlIGJ5IGEgZGlmZmVyZW50IG5hbWUuIFRoaXMgdGVjaG5pcXVlIGhhcyBoYXMgc29tZSBkcmF3YmFjayBidXQgYWxzbworYWR2YW50YWdlcy4gVGhlIGRyYXdiYWNrIGlzIHRoYXQgeW91IGNhbm5vdCBkZWNsYXJlZCBTdGFuZGFyZCBjb21wb25lbnQgbGlrZQordGhhdDoKKworCisvL2Zvby5oCituYW1lc3BhY2Ugc3RkCit7CisgIHRlbXBsYXRlIDxjbGFzcyBfVHA+CisgIGNsYXNzIGFsbG9jYXRvcjsKK30KKwordm9pZCBmMShjb25zdCBzdGQ6OmFsbG9jYXRvcjxpbnQ+Jik7CisKKworLy9mb28uY3BwCisjaW5jbHVkZSAiZm9vLmgiCisjaW5jbHVkZSA8bWVtb3J5PgorCit2b2lkIGYxKGNvbnN0IHN0ZDo6YWxsb2NhdG9yPGludD4mIGFsbG9jKQoreworICAvL2ltcGxlbWVudGF0aW9uCit9CisKKy8vYmFyLmNwcAorI2luY2x1ZGUgImZvby5oIgorI2luY2x1ZGUgPG1lbW9yeT4KKworaW50IG1haW4oaW50LCBjaGFyKiopCit7CisgIHN0ZDo6YWxsb2NhdG9yPGludD4gYWxsb2M7CisgIGYxKGFsbG9jKTsKK30KKworICBJZiB5b3UgYnVpbGQgdGhpcyBjb2RlIHlvdSB3aWxsIHN1cmVseSBoYXZlIGEgY29tcGlsYXRpb24gZXJyb3IgYXMgZjEgaXMgZGVjbGFyZWQKK2FzIHRha2luZyBhIHN0ZDo6YWxsb2NhdG9yIHBhcmFtZXRlciBidXQgeW91IGFyZSBjYWxsaW5nIGl0IHVzaW5nIGFuIFNUTHBvcnQgYWxsb2NhdG9yCitpbnN0YW5jZSB0aGF0IGlzIG5vdCBpbiB0aGUgc3RkIG5hbWVzcGFjZS4gVGhlIGdvb2QgbmV3cyBpcyB0aGF0IHRoaXMgZHJhd2JhY2sgaXMgZWFzeQordG8gZGV0ZWN0IGFzIGl0IHdpbGwgZ2VuZXJhdGUgY29tcGlsYXRpb24gZXJyb3Igb3IgYXQgbGVhc3QgbGluayB0aW1lIGVycm9yLiBUaGUgb25seQord29ya2Fyb3VuZCBpcyB0byBpbmNsdWRlIGFuIGFyYml0cmFyeSBTdGFuZGFyZCBoZWFkZXIgYmVmb3JlIHRoZSBhbGxvY2F0b3IgZGVjbGFyYXRpb24uCitHb29kIGNhbmRpZGF0ZXMgZm9yIHRoYXQgYXJlIDx1dGlsaXR5PiBvciA8Y2Vycm5vPiBhcyB0aGV5IGFyZSBzbWFsbCBoZWFkZXJzLiBJbmNsdWRpbmcKK3Rob3NlIGhlYWRlcnMgd2lsbCByZXBsYWNlIHN0ZCB3aXRoIHRoZSBTVExwb3J0IG5hbWVzcGFjZS4KKworICBUaGUgYWR2YW50YWdlIG9mIHRoaXMgbWFjcm8gcmVwbGFjZW1lbnQgaXMgdGhhdCB3ZSBjYW4gY3VzdG9taXplIHRoZSBTVExwb3J0IG5hbWVzcGFjZQorZGVwZW5kaW5nIG9uIHRoZSBjb21waWxhdGlvbiBvcHRpb25zLiBGb3IgaW5zdGFuY2UgdGhlIFNUTHBvcnQgc2FmZSBtb2RlIHlvdSBjYW4gdXNlIGJ5CitkZWZpbmluZyBfU1RMUF9ERUJVRyBpcyBub3QgYmluYXJ5IGNvbXBhdGlibGUgd2l0aCBhIG5vcm1hbCBkZWJ1ZyBidWlsZC4gVG8gZW5zdXJlIHRoYXQKK25vIG9uZSB3aWxsIGV2ZXIgYnVpbGQgY29kZSB3aXRob3V0IF9TVExQX0RFQlVHIGFuZCBsaW5rIHdpdGggU1RMcG9ydCBsaWJyYXJ5IGJ1aWx0IHdpdGgKK3RoaXMgb3B0aW9uIHRoZSBuYW1lc3BhY2UgaXMgZGlmZmVyZW50IHNvIHRoYXQgaXQgd2lsbCBnZW5lcmF0ZSBsaW5rIHRpbWUgZXJyb3IgcmF0aGVyCit0aGFuIHJhbmRvbSBjcmFzaGVzIGR1cmluZyBhcHBsaWNhdGlvbiBleGVjdXRpb24uCisKKzMuIFdoeSBub3QgaGF2aW5nIHVzZSBuYW1lc3BhY2UgaW5qZWN0aW9uID8KKworICBBbiBvdGhlciB3YXkgdG8gcmVwbGFjZSBuYXRpdmUgU3RhbmRhcmQgQysrIGxpYnJhcnkgaW1wbGVtZW50YXRpb24gd291bGQgaGF2ZSBiZWVuIHRvCit1c2UgbmFtZXNwYWNlIGluamVjdGlvbjoKKworbmFtZXNwYWNlIHN0ZAoreworICB1c2luZyBuYW1lc3BhY2Ugc3RscG9ydDsKK30KKworICBUaGlzIHNvbHV0aW9uIGhhcyBhIGZpcnN0IG1ham9yIGRyYXdiYWNrIHdoaWNoIGlzIHRoYXQgU1RMcG9ydCB3b3VsZCBiZSBtdWNoIG1vcmUgc2Vuc2libGUKK3RvIG5hdGl2ZSBoZWFkZXJzLiBJZiB5b3UgaW5jbHVkZSBhIEMrKyBuYXRpdmUgaGVhZGVycyB0aGF0IGluZGlyZWN0bHkgZGVmaW5lIGZvciBpbnN0YW5jZQordGhlIHZlY3RvciBjbGFzcyBpdCBpcyBnb2luZyB0byBjb25mbGljdCB3aXRoIHRoZSBTVExwb3J0IHZlY3RvciBkZWZpbml0aW9uLgorCisgIE1vcmVvdmVyIHRoaXMgc29sdXRpb24ganVzdCBkb2VzIG5vdCB3b3JrIGZvciBhIHZlcnkgc2ltcGxlIHJlYXNvbi4gVGhlIEMrKyBTdGFuZGFyZCAKK2FsbG93cyB1c2VycyB0byBzcGVjaWFsaXplZCBzb21lIG9mIHRoZSBTdGFuZGFyZCBhbGdvcml0aG1zLiBUaGlzIHNwZWNpYWxpemF0aW9uIGhhcyB0byAKK2JlIGRvbmUgaW4gdGhlIHNhbWUgbmFtZXNwYWNlIGFzIHRoZSBtYWluIHRlbXBsYXRlIGRlY2xhcmF0aW9uOgorCisvL0luIGFuIFNUTHBvcnQgaGVhZGVyOgorbmFtZXNwYWNlIHN0bHBvcnQKK3sKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgc3RydWN0IGxlc3MKKyAgeworICAgIGJvb2wgb3BlcmF0b3IgKCkgKGNvbnN0IF9UcCYgeCwgY29uc3QgX1RwJiB5KSBjb25zdDsKKyAgfTsKK30KKworLy9Vc2VyIGNvZGU6CisKK3N0cnVjdCBNeVN0cnVjdDsKKworbmFtZXNwYWNlIHN0ZAoreworICB0ZW1wbGF0ZSA8PgorICBzdHJ1Y3QgbGVzczxNeVN0cnVjdD4KKyAgeworICB9OworfQorCitBcyB5b3UgY2FuIHNlZSB0aGUgc3BlY2lhbGl6YXRpb24gaXMgbm90IGluIHRoZSBTVExwb3J0IGxlc3MgbmFtZXNwYWNlIGFuZCBpdAord29uJ3QgYmUgdXNlZCBpbiBhc3NvY2lhdGl2ZSBjb250YWluZXJzIGZvciBpbnN0YW5jZS4KKworNC4gV2hhdCBpcyB0aGUgU1RMcG9ydCBzcGVjaWZpYyBuYW1lc3BhY2UgPworCisgIFRoZSBvZmZpY2lhbCBTVExwb3J0IG5hbWVzcGFjZSBpczogc3RscG9ydC4gT25jZSBhZ2FpbiB0aGlzIGlzIG5vdCB0aGUgcmVhbCBuYW1lc3BhY2UKK3doZXJlIGFsbCB0aGUgU3RhbmRhcmQgc3R1ZmYgYXJlLiBBcyB0aGUgcmVhbCBTVExwb3J0IG5hbWVzcGFjZSBjaGFuZ2UgZGVwZW5kaW5nIG9uIGNvbXBpbGF0aW9uCitvcHRpb25zIHlvdSBjYW5ub3QgdXNlIGl0IGRpcmVjdGx5LiBTbyBzdGxwb3J0IGlzIGFuIGFsaWFzIG9mIHRoZSByZWFsIFNUTHBvcnQgbmFtZXNwYWNlLgorCis1LiBXaGF0IGFyZSB0aGUgb3RoZXIgU1RMcG9ydCBuYW1lc3BhY2VzID8KKworICBUaG9zZSBuYW1lcyBhcmUgZ2l2ZW4gZm9yIGluZm9ybWF0aW9uIHB1cnBvc2UgYW5kIHNob3VsZCBuZXZlciBiZSB1c2VkIGluIGFueSB1c2VyIGNvZGUuIFRoZQorZGVmYXVsdCBTVExwb3J0IG5hbWVzcGFjZSBpczogc3RscF9zdGQuIEhlcmUgaXMgdGhlIGxpc3Qgb2YgdGhlIGN1c3RvbWl6ZWQgbmFtZXNwYWNlczoKKworICAtIHN0bHBkX3N0ZCA6IHdoZW4gX1NUTFBfREVCVUcgaXMgZGVmaW5lZAorICAtIHN0bHB4X3N0ZCA6IHdoZW4geW91IHVzZSBTVExwb3J0IGFzIGEgc2hhcmVkIGxpYnJhcnkgbGlua2VkIHRvIHRoZSBzdGF0aWMgdmVyc2lvbiBvZiB0aGUgbmF0aXZlCisgICAgcnVudGltZSBvciB3aGVuIHlvdSBidWlsZCB0aGUgc3RhdGljIFNUTHBvcnQgbGlicmFyeSBsaW5rZWQgd2l0aCB0aGUgZHluYW1pYyB2ZXJzaW9uLiBUaGlzIG9wdGlvbgorICAgIGlzIG9ubHkgc3VwcG9ydGVkIGJ5IGEgbGltaXRlZCBudW1iZXIgb2YgY29tcGlsZXJzLgorICAtIHN0bHBtdHhfc3RkIDogd2hlbiBidWlsZGluZyBTVExwb3J0IGFzIG5vdCB0aHJlYWQgc2FmZS4KKworICBZb3UgY2FuIGFsc28gaGF2ZSBjb21iaW5hdGlvbiBvZiB0aG9zZSBleHRlbnNpb24gbGlrZSBzdGxwZHhtdHhfc3RkIG9yIHN0bHBkbXR4X3N0ZC4uLgorCisgIFRoZXJlIGlzIGFsc28gYW4gb3RoZXIgU1RMcG9ydCBuYW1lc3BhY2UgZm9yIFNUTHBvcnQgaW50ZXJuYWwgZnVuY3Rpb25zIG9yIHN0cnVjdC9jbGFzczogcHJpdi4KKworbmFtZXNwYWNlIHN0bHBvcnQKK3sKKyAgbmFtZXNwYWNlIHByaXYKKyAgeworICB9Cit9CisgCmRpZmYgLS1naXQgYS9lcnJuby5oIGIvZXJybm8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjcwMzdlYS4uMDAwMDAwMAotLS0gYS9lcnJuby5oCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogQm9yaXMgRm9taXRjaGV2Ci0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICovCi0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCkKLSMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MjA1Ci0jICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgotI2VsaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgyMDUpICYmICFkZWZpbmVkIChfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQpCi0jICBkZWZpbmUgX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lECi0jZW5kaWYKLQotI2lmZGVmIF9TVExQX1dDRQotLy8gb25seSBzaG93IG1lc3NhZ2Ugd2hlbiBkaXJlY3RseSBpbmNsdWRpbmcgdGhpcyBmaWxlIGluIGEgbm9uLWxpYnJhcnkgYnVpbGQKLSMgIGlmICFkZWZpbmVkKF9fQlVJTERJTkdfU1RMUE9SVCkgJiYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgyMDUpCi0jICAgIHByYWdtYSBtZXNzYWdlKCJlTWJlZGRlZCBWaXN1YWwgQysrIDMgYW5kIC5ORVQgZG9uJ3QgaGF2ZSBhIGVycm5vLmggaGVhZGVyOyBTVExwb3J0IHdvbid0IGluY2x1ZGUgbmF0aXZlIGVycm5vLmggaGVyZSIpCi0jICBlbmRpZgotI2Vsc2UKLSMgIGlmbmRlZiBlcnJubwotLyogV2UgZGVmaW5lIHRoZSBmb2xsb3dpbmcgbWFjcm8gZmlyc3QgdG8gZ3VhcmFudHkgdGhlIGhlYWRlciByZWVudHJhbmN5OiAqLwotIyAgICBkZWZpbmUgX1NUTFBfTkFUSVZFX0VSUk5PX0hfSU5DTFVERUQKLSMgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ19IRUFERVIoZXJybm8uaCkKLSMgIGVuZGlmIC8qIGVycm5vICovCi0KLSMgIGlmICFkZWZpbmVkIChfU1RMUF9OQVRJVkVfRVJSTk9fSF9JTkNMVURFRCkKLS8qIElmIGVycm5vIGhhcyBiZWVuIGRlZmluZWQgYmVmb3JlIGluY2x1c2lvbiBvZiBuYXRpdmUgZXJybm8uaCBpbmNsdWRpbmcgaXQgZnJvbSBTVExwb3J0IGVycm5vLmgKLSAqIGJlY29tZXMgaW1wb3NzaWJsZSBiZWNhdXNlIGlmOgotICogI2RlZmluZSBlcnJubyBmb28KLSAqIHRoZW4KLSAqICNpbmNsdWRlIF9TVExQX05BVElWRV9DX0hFQURFUihlcnJuby5oKQotICogYmVjb21lczoKLSAqICNpbmNsdWRlIF9TVExQX05BVElWRV9DX0hFQURFUihmb28uaCkKLSAqCi0gKiBUbyBmaXggdGhpcyBwcm9ibGVtIHlvdSBoYXZlIHRvIGZpbmQgd2hlcmUgdGhpcyBkZWZpbml0aW9uIGNvbWVzIGZyb20gYW5kIGluY2x1ZGUgZXJybm8uaCBiZWZvcmUgaXQuCi0gKi8KLSMgICAgZXJyb3IgZXJybm8gaGFzIGJlZW4gZGVmaW5lZCBiZWZvcmUgaW5jbHVzaW9uIG9mIGVycm5vLmggaGVhZGVyLgotIyAgZW5kaWYKLQotIyAgaWZkZWYgX19jcGx1c3BsdXMKLSMgICAgaWZuZGVmIGVycm5vIC8qIGVycm5vIHN0aWxsIG5vdCBkZWZpbmVkICovCi1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLSMgICAgICBpZiAhZGVmaW5lZCAoX19CT1JMQU5EQ19fKQotdXNpbmcgOjplcnJubzsKLSMgICAgICBlbHNlCi11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6ZXJybm87Ci0jICAgICAgZW5kaWYKLV9TVExQX0VORF9OQU1FU1BBQ0UKLSMgICBlbmRpZiAvKiBlcnJubyAqLwotIyAgZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmCi0KLSNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDIwNSkKLSMgIGlmICEgZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQotIyAgICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgotIyAgICB1bmRlZiAgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAotIyAgZW5kaWYKLSMgIHVuZGVmICBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKLSNlbmRpZgotCi0vKiBMb2NhbCBWYXJpYWJsZXM6Ci0gKiBtb2RlOkMrKwotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9ldGMvQ2hhbmdlTG9nIGIvZXRjL0NoYW5nZUxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGE3ZWE0Ci0tLSAvZGV2L251bGwKKysrIGIvZXRjL0NoYW5nZUxvZwpAQCAtMCwwICsxLDMwODggQEAKKzIwMDgtMTItMTAgIFBldHIgT3Z0Y2hlbmtvdiAgPGNvbXBsZW1lbnRAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBSZXBvc2l0b3J5OiBTVExwb3J0IHJlbGVhc2UgNS4yLjEKKworMjAwOC0xMi0wMyAgUGV0ciBPdnRjaGVua292ICA8Y29tcGxlbWVudEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGJ1aWxkOiBIUC1VWC9pYTY0IHdpdGggYUMrKyBjb21waWxlcjsgdmVyaWZpZWQgb24gSFAtVVggMTEuMjMKKwlhbmQgMTEuMzEgd2l0aCBhQysrIEEuMDYuMTc7IFs0IG9mIDQzNiB0ZXN0cywgNCBpZ25vcmVkICgyIGV4cGxpY2l0KSwKKwlhbmQgNCBvZiAzNjAgdGVzdHMsIDIgaWdub3JlZF07IHN1Ym1pdHRlZCBieSBCb3JpcyBHdWJlbmtvLgorCisyMDA4LTExLTI3ICBQZXRyIE92dGNoZW5rb3YgIDxjb21wbGVtZW50QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogYnVpbGQ6IEVWQzkgKFZpc3VhbCBTdHVkaW8gMjAwOCkgYnkgSm9oYW4gQW5kZXJzc29uLgorCisyMDA4LTExLTE5ICBQZXRyIE92dGNoZW5rb3YgIDxjb21wbGVtZW50QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogUmVwb3NpdG9yeTogU1RMcG9ydCByZWxlYXNlIDUuMi4wCisKKzIwMDgtMDgtMjYgIFBldHIgT3Z0Y2hlbmtvdiAgPGNvbXBsZW1lbnRAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBSZXBvc2l0b3J5OiBicmFuY2ggZm9yIFNUTHBvcnQgNS4yLCByMzYxOAorCisyMDA4LTA3LTIxICBQZXRyIE92dGNoZW5rb3YgIDxjb21wbGVtZW50QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3RscG9ydC90eXBlX3RyYWl0czogIGRlY2F5LCBjb25kaXRpb25hbCwgZWJhYmxlX2lmIGFkZGVkLgorCisyMDA4LTA3LTE4ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogY29uZmlndXJlLmJhdDogU3BlY2lmeWluZyB0aGUgY29tcGlsZXIgaXMgbm93IG1hbmRhdG9yeSBhbmQKKwltdXN0IGJlIGZpcnN0LgorCisyMDA4LTA3LTE3ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3RscG9ydC9zdGRsaWIuaCwgY3N0ZGxpYjogRml4IGVycm5vIHdvcmthcm91bmQgZm9yIGdjYyBNaW5HVy4KKwlMYXRlc3QgZ2NjIHZlcnNpb24gKDQuMy4wKSBpbmNsdWRlcyBzdGRsaWIuaCBpbiBjc3RkbGliIHVzaW5nCisJaW5jbHVkZV9uZXh0IHNvIHNraXBwaW5nIHdvcmthcm91bmQgaW4gU1RMcG9ydCBzdGRsaWIuaC4gU28gZXJybm8uaAorCW11c3QgYWxzbyBiZSBpbmNsdWRlZCBmcm9tIGNzdGRsaWIuCisKKzIwMDgtMDctMTcgIFBldHIgT3Z0Y2hlbmtvdiAgPGNvbXBsZW1lbnRAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJc3JjL2RldGFpbHMvZnN0cmVhbV91bmlzdGQuY3BwOiBmaXggYnVnICMyMDAxMjIyLCBvcGVuaW5nIHdpdGgKKwlpb3NfYmFzZTo6YXBwIHNob3VsZCByZXdpbmQgd3JpdGUgcG9pbnRlciB0byB0aGUgZW5kIG9mIHRoZSBmaWxlOworCWZpeCB0cmVhdG1lbnQgb2YgaW9zX2Jhc2U6OmF0ZSAoaXQgc2hvdWxkIHJld2luZCBwb2ludGVyCisJdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBvbmNlKSBhbmQgaW9zX2Jhc2U6OmFwcCAob2Zmc2V0IHdpbGwgYmUgc2V0CisJdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBwcmlvciB0byBlYWNoIHdyaXRlKTsgcmVmZXJlbmNlcyAtLS0KKwlodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9KdGMxL3NjMjIvd2cyMS9kb2NzL3BhcGVycy8yMDA4L24yNjkxLnBkZgorCTI3LjguMS40OyBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy83OTkwOTg5Nzc1L3hzaC9mb3Blbi5odG1sOworCWh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzc5OTA5ODk3NzUveHNoL29wZW4uaHRtbAorCisJdGVzdC91bml0L2ZzdHJlYW1fdGVzdC5jcHA6IGFkZCBzYW1wbGUgd2l0aCBmb3BlbiBhcyByZWZlcmVuY2UgcG9pbnQuCisKKzIwMDgtMDctMTQgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2U6IEJ1aWxkIHN5c3RlbSB1cGRhdGVkIGZvciBnY2MgdW5kZXIgQ3lnd2luLAorCU1pbkdXLiBVbmRlciBDeWd3aW4sIHdpdGggb3Igd2l0aG91dCAtbW5vLWN5Z3dpbiBvcHRpb24sIFNUTHBvcnQKKwlpcyBub3cgYSBmdWxsIHJlcGxhY2VtZW50IGZvciBsaWJzdGRjKyssIGJ1aWxkaW5nIGFuIGFwcGxpY2F0aW9uCisJd2l0aCBpdCBkbyBub3QgcmVxdWlyZSAtbHN1cGMrKyBhbnltb3JlIGFzIGl0IGlzIGNvbXBsZXRlbHkKKwlpbnRlZ3JhdGVkIGluIFNUTHBvcnQuIFVuZGVyIE1pbkdXIGl0IGRpZG4ndCB3b3JrIHJlc3VsdGluZyBpbiBhCisJY3Jhc2ggd2hlbiBzdGFydGluZyBhbiBhcHBsaWNhdGlvbiB1c2luZyBTVExwb3J0IHNvIC1sc3VwYysrIGlzCisJbmVjZXNzYXJ5IGJvdGggd2hlbiBsaW5raW5nIFNUTHBvcnQgX2FuZF8gd2hlbiBsaW5raW5nIHRoZQorCWFwcGxpY2F0aW9uIHVzaW5nIGl0LgorCisyMDA4LTA3LTEwICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3JjL251bV9wdXRfZmxvYXQuY3BwOiBVc2UgYW4gdW5pb24gYmFzZWQgdGVjaG5pcXVlIHRvIGZpbmQgb3V0CisJdGhlIHNpZ24gb2YgZmxvYXRpbmcgcG9pbnQgdmFsdWVzLiBJdCB3aWxsIG1heWJlIHJlcGxhY2UgdXNlIG9mCisJcGxhdGZvcm0gc3BlY2lmaWMgZnVuY3Rpb25zIGluIGEgZnV0dXJlIHZlcnNpb24uCisKKwkqIHNyYy9zdGRpb19zdHJlYW1idWYuY3BwLCB0ZXN0L3VuaXQvaW9zdHJlYW1fdGVzdC5jcHA6IENoYW5nZQorCWJlaGF2aW9yIG9mIHN0ZGlvX2lzdHJlYW1idWYgaW1wbGVtZW50YXRpb24gdGhhdCBub3cgYWx3YXlzIHJldHVybiAwIG9uCisJc2hvd21hbnljIGNhbGwuIFJldHVybmluZyAtMSBtZWFucyB0aGF0IHJlYWRpbmcgYXR0ZW1wdCB3aWxsCisJbmVjZXNzYXJpbHkgZmFpbCB3aGljaCBpcyBub3QgdGhlIGNhc2UsIDAgaXMgcHJlZmVyZWQgYXMgaXQgbWVhbnMgdGhhdAorCXdlIGRvbid0IGtub3cuIEl0IGlzIGFsc28gc2ltaWxhciB0byBvdGhlciBzdGQgaW1wbGVtZW50YXRpb25zIGxpa2UKKwlsaWJzdGRjKysuCisKKzIwMDgtMDctMDIgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBjb25maWd1cmUuYmF0OiBBZnRlciBhIHZlcnkgaW50ZXJlc3RpbmcgZGViYXRlIHRoZSBjb25zZXN1cworCWlzIHRvIHB1dCBjb25maWd1cmUgc2NyaXB0cyBpbiByb290IGZvbGRlci4KKworCSogc3RscG9ydC9zdGwvX3N0cmluZ19zdW1fbWV0aG9kcy5oOiBCdWcgcmVwb3J0ICMyMDAzMzA4LAorCWNvbXBpbGF0aW9uIGVycm9yIHdpdGggX1NUTFBfVVNFX1RFTVBMQVRFX0VYUFJFU1NJT04uCisJUmVncmVzc2lvbiBkdWUgdG8gcmVtb3ZlIG9mIFBPRCB0eXBlIHN1cHBvcnQgaW4gYmFzaWNfc3RyaW5nCisJaW1wbGVtZW50YXRpb24uCisKKzIwMDgtMDYtMjYgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzdGxwb3J0L3N0bC9fZnN0cmVhbS5jOiBDb25zaWRlciByZWFkIGZpbGUgZmFpbHVyZSBpbgorCV9NX3VuZGVyZmxvd19hdXggbWV0aG9kIHRvIGF2b2lkIGluZmluaXRlIGxvb3Bpbmcgb24gc29tZQorCXBsYXRmb3Jtcy4gVGhhbmtzIFBhd2VsIFNpa29yYS4KKwkKKzIwMDgtMDYtMjYgIFBldHIgT3Z0Y2hlbmtvdiAgPGNvbXBsZW1lbnRAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2UvdW5peC9ydWxlcy1pbnN0YWxsLXNvLm1hazogZG8KKwlpbnN0YWxsLWhlYWRlcnMgdGFncyB3aGVuIG1ha2UgaW5zdGFsbCBvciBpbnN0YWxsLXJlbGVhc2Utc2hhcmVkLgorCisyMDA4LTA2LTI0ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogYnVpbGQvTWFrZWZpbGVzL2dtYWtlOiBDeWd3aW4vTWluR1cgdXBncmFkZSwgbm93IGJ1aWxkCisJd2l0aG91dCByZWZlcmVuY2luZyBsaWJzdGRjKysuCisKKwkqIHN0bHBvcnQvc3RsL190aHJlYWRzLmg6IE1vdmUgZGVmaW5pdGlvbiBvZiBfX3N0bF9hdG9taWNfdCBuZXh0CisJdG8gZGVmaW5pdGlvbiBvZiBhdG9taWMgb3BlcmF0aW9ucyB0byBndWFyYW50eSBjb2hlcmVuY3kuCisKKzIwMDgtMDYtMTggIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBidWlsZDogY29uZmlndXJlLmJhdCBtb3ZlZCB0byBidWlsZCBmb2xkZXIuIGxpYi9NYWtlZmlsZSwKKwl0ZXN0L3VuaXQvTWFrZWZpbGUgcmVtb3ZlZCBmcm9tIFNWTiwgbm93IGdlbmVyYXRlZCBieSBjb25maWd1cmUKKwlzY3JpcHRzLiBVbmRlciBHTlUgbWFrZSB1c2UgaW5jbHVkZSByYXRoZXIgdGhhbiBsaW5rIHRvCisJcmVmZXJlbmNlIHRoZSByaWdodCBtYWtlIGZpbGUsIGxpbmsgc2VlbXMgbm90IHN1cHBvcnRlZCBieQorCUN5Z3dpbi9NaW5HVyBtYWtlLiBSZW1vdmUgZGVmYXVsdCB2YWx1ZSBvZiBTVExQT1JUX0RJUiwKKwlhbHJlYWR5IHNldCBpbiBpbnRlcm5hbCBtYWtlIGZpbGVzIGFuZCBtb3Jlb3ZlciB0aGUgYWJzb2x1dGUKKwlwYXRoIGdlbmVyYXRlZCBpbiB0aGUgc2NyaXB0IGxlYWRzIHRvIHRyb3VibGUgdW5kZXIgQ3lnd2luL01pbkdXLgorCisJKiBzcmMvbnVtX2dldF9mbG9hdC5jcHA6IFVzZSBhbiB1bmlvbiB0byBnZW5lcmF0ZSBkb3VibGUgdmFsdWUKKwlmcm9tIDY0IGJpdHMgaW50IHRvIGF2b2lkIGdjYyB0eXBlLXB1bm5lZCBwb2ludGVyIHdhcm5pbmcuCisKKzIwMDgtMDYtMTYgIFBldHIgT3Z0Y2hlbmtvdiAgPGNvbXBsZW1lbnRAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBidWlsZC90ZXN0L3VuaXQvZ2NjLm1hazogcGFzcyBydW50aW1lIHBhdGhlcyBhcyBhYnNvbHV0ZTsKKwlyZW1vdmVkIExEU0VBUkNIIG1hY3JvLCB1c2UgTERGTEFHUyBpbnN0ZWFkOworCisJKiBNYWtlZmlsZTogY2xlYW4gaW4gdGVzdC91bml0IHRvby4KKworMjAwOC0wNi0xMyAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHN0bHBvcnQvc3RsL19pdGVyYXRvcl9iYXNlLmg6IEFkZCBhIGZ1bm55IGZlYXR1cmUsIHdoZW4KKwl1c2luZyBib3RoIFNUTHBvcnQgYW5kIG5hdGl2ZSBTVExzIGl0IHdhcyBub3QgcG9zc2libGUKKwl0byB1c2Ugc3RkIGl0ZXJhdG9ycyBpbiBTVExwb3J0IGNvbnRhaW5lcnMgYmVjYXVzZSBvZiB0aGUKKwltaXNzaW5nIGl0ZXJhdG9yIGNhdGVnb3J5IHRoYXQgaXMgZGVmaW5lZCBpbiBzdGQ6OiBhbmQKKwlub3QgaW4gc3RscG9ydDo6LiBTbyBub3cgU1RMcG9ydCBtYXAgc3RkIGl0ZXJhdG9yIGNhdGVnb3JpZXMKKwlpbiBzdGxwb3J0IG9uZXMuIE5vdyBpdCBpcyBwb3NzaWJsZSB0byB3cml0ZSBzb21ldGhpbmcgbGlrZQorCXRoYXQ6CisJc3RkOjpzdHJpbmcgc3Rkc3RyKCJzdGQiKTsKKwlzdGxwb3J0OjpzdHJpbmcgc3RscG9ydHN0cigic3RscG9ydCBhbmQgIik7CisJc3RscG9ydHN0ci5hcHBlbmQoc3Rkc3RyLmJlZ2luKCksIHN0ZHN0ci5lbmQoKSk7CisJSG93ZXZlciB0aGUgb3RoZXIgc2lkZSBpcyBub3Qgc3VwcG9ydGVkIGV4Y2VwdCB3aGVuIFNUTHBvcnQKKwlpdGVyYXRvcnMgYXJlIHNpbXBseSBwb2ludGVycy4KKworMjAwOC0wNi0wNSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHNyYy9udW1fZ2V0X2Zsb2F0LmNwcDogUmVtb3ZlIHVzZWxlc3Mgc2tpcCBvZiB3aGl0ZQorCXNwYWNlIGF0IGJlZ2luaW5nIG9mIGJ1ZmZlciBpbiBfU3RsX3N0cmluZ190b19kb3VibGUgZnVuY3Rpb24uCisJX19yZWFkX2Zsb2F0LCB0aGUgZnVuY3Rpb24gdGhhdCBnZW5lcmF0ZSB0aGF0IGJ1ZmZlciBkbyBub3QKKwlwdXQgd2hpdGUgc3BhY2UgYXQgdGhlIGZpcnN0IHBsYWNlLgorCisJKiBzdGxwb3J0L3N0bC9fbmV3LmgsIF9yYW5nZV9lcnJvcnMuYzogUmVtb3ZlIHVudXNlZAorCV9TVExQX1JUVElfQlVHIG1hY3JvLiBNb3Jlb3ZlciBfX3N0bF9uZXcgd2FzIG5vdCBjb3JyZWN0bHkKKwlpbXBsZW1lbnRlZCB3aXRoIHRoaXMgbWFjcm8sIHRoZXJlIHdhcyBubyBjaGVjayBmb3IgZmFpbGVkCisJYWxsb2NhdGlvbi4KKwkKKwkqIHRlc3QvdW5pdC9saW1pdHNfdGVzdC5jcHA6IFJlbW92ZSBjb2RlIHN1cHBvc2VkIHRvIGhpZGUKKwludW1lcmljX2xpbWl0czo6bWF4IHZhbHVlIHRvIE1TVkMgOCBjb21waWxlciwgdGhpcyBjb2RlIHdhcworCWludHJvZHVjaW5nIGEgdGVzdCByZWdyZXNzaW9uLiBJZiBpdCBpcyBwcm9kdWNpbmcgYSB3YXJuaW5nCisJYSAjcHJhZ21hIHdhcm5pbmcgc2hvdWxkIGJlIHVzZSB0byBoaWRlIGl0LgorCisJKiB0ZXN0L3VuaXQvbnVtX3B1dF9nZXRfdGVzdC5jcHA6IEFkZCB0ZXN0IHNob3dpbmcgcHJvYmxlbQorCXdpdGggY29kZSB0aGF0IHVzZWQgdG8gYmUgaW4gbGltaXRzIHRlc3QuIFRob3NlIHRlc3RzIHdpbGwgYmUKKwlhY3RpdmF0ZWQgZm9yIDUuMyB0byBjaGVjayB0aGF0IHRoZXJlIGlzIHJlYWxseSBub3RoaW5nIHdyb25nCisJd2l0aCBpdC4KKworMjAwOC0wNi0wNyAgUGV0ciBPdnRjaGVua292ICA8Y29tcGxlbWVudEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGNvbmZpZ3VyZTogZG9uJ3QgZHVwbGljYXRlIG9wdGlvbnMgaW4gY29uZmlnLm1haywgdGhhdAorCWhhcyBkZWZhdWx0IHZhbHVlcyBpbiBtYWtlZmlsZXMuCisKKzIwMDgtMDYtMDYgIFBldHIgT3Z0Y2hlbmtvdiAgPGNvbXBsZW1lbnRAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBjb25maWd1cmU6IHB1dCBpdCBvbiBjb21tb24gcGxhY2UgZm9yIC4vY29uZmlndXJlOworCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2UvdGFyZ2V0ZGlycy5tYWs6IHVzZSAkKERFU1RESVIpCisJYXMgaW4gY29tbW9uIHByYWN0aWNlIChjaGFuZ2Ugcm9vdCBvZiBpbnN0YWxsYXRpb24sIGJ1dAorCWRvbid0IGNoYW5nZSBydW4gcGF0aHMpOworCisJKiBidWlsZDogYnkgZGVmYXVsdCB1c2UgbWFrZSBmb3IgZ2NjOworCisJKiBNYWtlZmlsZTogdG9wIG1ha2VmaWxlIGZvciBjb21tb24gcHJvamVjdCB0YXNrOworCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2UvZGVwZW5kLm1hazogZml4IG9wdGlvbnMgZm9yIGN0YWdzCisJYW5kIGV0YWdzOworCisJKiBjb25maWd1cmUsIGJ1aWxkL01ha2VmaWxlcy9nbWFrZS90b3AubWFrOiB0YWtlIGludG8gYWNjb3VudAorCWV4dHJhIGZsYWdzIGZvciBsaW5rZXIuCisKKzIwMDgtMDYtMDUgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzdGxwb3J0L3N0bC9fZnVuY3Rpb25fYWRhcHRvcnMuaDogRml4IGluc3RhbnRpYXRpb24gb2YKKwl1bmFyeV9mdW5jdGlvbiBhbmQgYmluYXJ5X2Z1bmN0aW9uIGFzIGJhc2UgdHlwZSBvZiBfTWVtX2Z1bjBfcmVmLAorCV9NZW1fZnVuMV9yZWYsIF9Db25zdF9tZW1fZnVuMF9yZWYsIF9Db25zdF9tZW1fZnVuMV9yZWYsCisJX1ZvaWRfbWVtX2Z1bjBfcmVmLCBfVm9pZF9tZW1fZnVuMV9yZWYsIF9Wb2lkX2NvbnN0X21lbV9mdW4wX3JlZiwKKwlfVm9pZF9jb25zdF9tZW1fZnVuMV9yZWYuIFRob3NlIGNsYXNzZXMgYXJlIHVzZSBhcyBhIHdvcmthcm91bmQgZm9yCisJY29tcGlsZXIgbWlzc2luZyBjbGFzcyBwYXJ0aWFsIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIG9yIHRoYXQgZG9uJ3QKKwlzdXBwb3J0IHJldHVybiBvZiB2b2lkLiBJbnN0YW50aWF0aW9uIGlzIG5vdyBkb25lIHdpdGhvdXQgcmVmZXJlbmNlCisJcXVhbGlmaWVyIGFzIHNwZWNpZmllZCBieSB0aGUgU3RhbmRhcmQgYW5kIGFzIGRvbmUgaW4gdGhlCisJaW1wbGVtZW50YXRpb24gdXNlZCB3aGVuIHdvcmthcm91bmQgaXMgbm90IG5lY2Vzc2FyeS4KKworMjAwOC0wNi0wMyAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHNyYy9pb3MuY3BwLCBzdGxwb3J0L3N0bC9fY29tcGxleC5jLCBfaW9zLmMsIF9pb3MuaCwgX2lvc19iYXNlLmgsCisJX2lzdHJlYW0uYywgX251bV9nZXQuYywgX251bV9wdXQuYzogUmVtb3ZlIGludmFsaWQgY2FjaGVkIGZhY2V0CisJcG9pbnRlcnMgaW4gaW9zX2Jhc2UgY2xhc3MuIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgaW4gYSBjaGFyIG9yCisJd2NoYXJfdCBpbnN0YW50aWF0aW9uIGNvbnRleHQgbWFraW5nIGNhc3QgdG8gY3R5cGU8Y2hhcj4gb3IKKwljdHlwZTx3Y2hhcl90PiBpbnZhbGlkIHJlc3VsdGluZyBpbiBhbiBhcHBsaWNhdGlvbiBjcmFzaGVkLiBUaGUKKwlvbmx5IHNhZmUgYWNjZXNzIHRvIGZhY2V0IGluc3RhbmNlcyBmcm9tIGEgaW9zX2Jhc2UgaW5zdGFuY2UgaXMgdGhyb3VnaAorCXRoZSB1c2VfZmFjZXQ8RmFjZXQ+KGdldGxvYygpKSBmdW5jdGlvbi4gT25seSBfTV9jYWNoZWRfY3R5cGUgaGFzIGJlZW4KKwlrZXB0IGluIGJhc2ljX2lvcyBjbGFzcyBldmVuIGlmIHNtYWxsIGJlbmNoIGhhc24ndCBzaG93IHJlYWwKKwllbmhhbmNlbWVudCBjb21wYXJlZCB0byB1c2luZyB1c2VfZmFjZXQuIAorCisJKiBzdGxwb3J0L3N0bC9fdGltZV9mYWNldHMuYzogSW4gYWRkaXRpb24gdG8gYWJvdmUgbW9kaWZpY2F0aW9ucworCXRpbWVfZ2V0IGltcGxlbWVudGF0aW9uIGhhcyBiZWVuIHNpbXBsaWZpZWQgYXMgbG9jYWxpemVkIGluZm8gYXJlCisJbm93IHN0b3JlZCBhcyB3Y2hhcl90IGZvciB3aWRlIGNoYXIgaW5zdGFudGlhdGlvbi4gV2UgZG8gbm90IG5lZWQKKwl0byB1c2UgY3R5cGUud2lkZW4gbWV0aG9kIGFueW1vcmUuCisKKwkqIHRlc3QvdW5pdC90aW1lX2ZhY2V0c190ZXN0LmNwcDogQWRkIHRlc3QgZm9yIHRpbWVfZ2V0IHdjaGFyX3QKKwlpbnN0YW50aWF0aW9uLgorCisJKiB0ZXN0L3VuaXQvY3BwdW5pdC9jcHB1bml0X21pbmkuaDogRml4IHJlcG9ydCBvZiBpZ25vcmVkL2V4cGxpY2l0CisJdGVzdHMuCisKKzIwMDgtMDUtMjcgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzdGxwb3J0L3N0bC9fYWxsb2MuaDogQ29kZSBzaW1wbGlmaWNhdGlvbiwgY2xlYW4gdXAgbnVsbAorCXBvaW50ZXIgY2hlY2tzIGFzIGFsbG9jYXRvcnMgc2hvdWxkIG5ldmVyIHJldHVybiBpdCBidXQgcmF0aGVyCisJdGhyb3cgYSBiYWRfYWxsb2MgZXhjZXB0aW9uLgorCisyMDA4LTA1LTI3ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogdGVzdC91bml0L2NwcHVuaXQvY3BwdW5pdF9taW5pLmgsIGZpbGVfcmVwb3J0ZXIuaDogRml4CisJY291bnRpbmcgb2YgZmFpbGVkIHRlc3QsIHdvbid0IHJlcG9ydCBtb3JlIGZhaWx1cmVzIHRoYW4gdGVzdHMKKwlhbnltb3JlLiBOb3cgYWxzbyByZXBvcnQgZXhwbGljaXQgdGVzdHMuCisKKzIwMDgtMDUtMTUgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzcmMvYWxsb2NhdG9ycy5jcHAsIGxvY2FsZV9jYXRhbG9nLmNwcCwgbnVtX3B1dF9mbG9hdC5jcHA6CisJVXNlIHN0YXRpYyBtZXRob2QgcmV0dXJuaW5nIHN0YXRpYyBpbnN0YW5jZSB0byBtdXRleCByYXRoZXIgdGhhbgorCWRpcmVjdCBhY2Nlc3MgdG8gYSBzdGF0aWMgbXV0ZXggaW5zdGFuY2UgdG8gY29udHJvbCBpbml0aWFsaXphdGlvbgorCW9yZGVyIG9mIHN0YXRpYyB2YXJpYWJsZXMgdGhhbmtzIFBldGVyIEhyZW5rYSByZXBvcnQuCisKKzIwMDgtMDQtMjYgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzdGxwb3J0L3N0bC9fZnVuY3Rpb24uaCwgdHlwZV90cmFpdHMuaDogQWRvcHRpb24gb2YgRGVmZWN0IFJlcG9ydCAxMDkKKwlNaXNzaW5nIGJpbmRlcnMgZm9yIG5vbi1jb25zdCBzZXF1ZW5jZSBlbGVtZW50cy4KKworCSogdGVzdC91bml0L2JpbmRfdGVzdC5jcHA6IFRlc3QgZm9yIERSIGFib3ZlLgorCisyMDA4LTA1LTExICBQZXRyIE92dGNoZW5rb3YgIDxjb21wbGVtZW50QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3RscG9ydC9zdGwvX3N0cmluZy5jOiBmcm9tIGZvcm1hbCAoSVNPL0lFQyAxNDg4MjoyMDAzKSBwb2ludCBvZiB2aWV3IAorCXN0cmluZyBzOyBzdHJpbmc6OnNpemVfdHlwZSBwID0gcy5maW5kKCAiIiwgMCwgMCApOyBzaG91bGQgcmV0dXJuIDAgaW4gcCwKKwlpLmUuIHBvc2l0aW9uIG91dC1vZi1ib3VuZCBvZiBzdHJpbmc7IHBlb3BsZSBuZWFyIFN0YW5kYXJkIGNvbW1ldGUgaGFzCisJb3BpbmlvbiB0aGF0IFN0YW5kYXJkIGNvcnJlY3QgaW4gdGhpcyBwb2ludCBhbmQgbm90IHJlcXVpcmUgY2xhcmlmaWNhdGlvbgorCShvcHBvc2l0ZSB0byBteSBvcGluaW9uKTsgZXZlbiBpZiBpdCBsb29rcyBsaWtlIGJvZ3VzIGJlaGF2aW9yIGZvciBtZSwKKwlpdCBmaXhlZCB0byBjb25mb3JtIHN0YW5kYXJkOyBzZWUgYnVncmVwb3J0ICMxODcyNjU2OworCisJKiB0ZXN0L3VuaXQvc3RyaW5nX3Rlc3QuY3BwOiB0ZXN0IGZvciBpc3N1ZSBhYm92ZS4KKworMjAwOC0wNS0xMCAgUGV0ciBPdnRjaGVua292ICA8Y29tcGxlbWVudEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHN0bHBvcnQvc3RsL19pc3RyZWFtLmMsIHN0bHBvcnQvc3RsL19vc3RyZWFtLmg6IElTTy9JRUMgMTQ4ODI6MjAwMworCShhbmQgMTk5OCB0b28pIGFzc3VtZSBjaGFuZ2UgYXMgZ2V0IGFzIHB1dCBwb3NpdGlvbnMgd2l0aAorCXNlZWtnIGFuZCBzZWVrcCAoMjcuNi4xLjMsIHBhciAzODsgMjcuNi4yLjQgcGFyIDIpLCBidXQgdGhpcworCWNvbnRyYWRpY3QgdG8gY29tbW9uIHByYWN0aWNlIGFuZCBwcm9wb3NlZCBkcmFmdCBOMjU4OAorCSgyNy42LjEuMywgcGFyIDQxOyAyNy42LjIuNSwgcGFyIDQpOyBub3cgU1RMcG9ydCBpbXBsZW1lbnQKKwkoaS5lLiBjaGFuZ2UgcHJlc2VudCBiZWhhdmlvcikgdGhlIGRyYWZ0J3MgcG9pbnQgb2YgdmlldzsKKwl0aGlzIHJlZmxlY3QgcGF0Y2ggIzE2NTA2NTcgYnkgSmFuIEVjaHRlcm5hY2g7CisJCisJKiB0ZXN0L3VuaXQvc3N0cmVhbV90ZXN0LmNwcDogdGVzdCBmb3IgaXNzdWUgYWJvdmUuCisKKzIwMDgtMDQtMjYgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBQYXRjaGVzICMxOTQwMTI2LCAjMTk0MTI2NywgIzE5NDE4MTQgZnJvbSBKb2hhbiBBbmRlcnNzb24gZm9yIGV2YzgKKwlQb2NrZXQgUEMgc3VwcG9ydCBhbmQgYnVpbGQgb2YgdGVzdHMgd2l0aG91dCB3YXJuaW5ncy4KKworMjAwOC0wNC0yNCAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIFBhdGNoIDE5Mzc4MjMgZnJvbSBKb2hhbiBBbmRlcnNzb24gdG8gYWRkIE1pY3Jvc29mdCBWaXN1YWwKKwlTdHVkaW8gMjAwOCBzdXBwb3J0LgorCisJKiBzdGxwb3J0L3N0bC9fYWxnb2Jhc2UuaDogUGF0Y2ggMTkzNTQ5NyBmcm9tIEFuZHJleSBTZW1hc2hldiB0bworCWFwcGx5IGEgY29tbW9uIG9wdGltaXphdGlvbiBpbiBTVExwb3J0IGFsZ29zIGZvciByYW5kb20gYWNjZXNzCisJaXRlcmF0b3JzIHRvIGZpbGwgYW5kIGZpbGxfbiBhbGdvcy4KKworMjAwOC0wNC0yMyAgUGV0ciBPdnRjaGVua292ICA8Y29tcGxlbWVudEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHNyYy9udW1fcHV0LmNwcDogcmVtb3ZlIGFtYmlndWl0eSBvZiBjaGFyIHRvIGludCBjb252ZXJzaW9uCisJKGNvbXBhcmlzb24gd2l0aCBpbnRlZ2VycywgY2hlY2sgZm9yIG5lZ2F0aXZlIHZhbHVlKTsgcmVtb3ZlCisJYW1iaWd1aXR5IHdpdGggcG9zdGZpeCBpbmNyZW1lbnQgaW4gaW5kZXggaW4gY29uZGl0aW9uYWwKKwlleHByZXNzaW9uLgorCisyMDA4LTA0LTIyICBQZXRyIE92dGNoZW5rb3YgIDxjb21wbGVtZW50QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogYnVpbGQvTWFrZWZpbGVzL2dtYWtlL2djYy5tYWssIGJ1aWxkL2xpYi9jb25maWd1cmU6IHRha2UKKwlpbnRvIGFjY291bnQgQ0ZMQUdTLCBFWFRSQV9DRkxBR1MsIGJlY2F1c2Ugb2YgQyBjb21waWxlciBpbiB1c2UgdG9vLgorCisyMDA4LTA0LTE3ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3RscG9ydC9zdGwvX3N0cmluZy5oOiBSZW1vdmUgc3VwcG9ydCBmb3Igbm9uIFBPRCB0eXBlIGluIGJhc2ljX3N0cmluZworCWltcGxlbWVudGF0aW9uLgorCisyMDA4LTA0LTA4ICBQZXRyIE92dGNoZW5rb3YgIDxjb21wbGVtZW50QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogYnVpbGQvTWFrZWZpbGVzL2dtYWtlL2xpYi9nY2MubWFrOiB0cnkgdG8gY3JlYXRlICQoUFJFX09VVFBVVF9ESVIpIGJlZm9yZQorCXJ1biBsaXBvOyBpbXBhY3Qgb25seSBNYWNPUzsKKworCSogYnVpbGQvTWFrZWZpbGVzL2dtYWtlL3N5c2lkLm1hazogdW5hbWUgLW0gb24gTWFjT1MgcmV0dXJuCisJcG93ZXItbWFjaW50b3NoLCBidXQgaWRlbnRpZnkgYXJjaGl0ZWNodHVyZSBhcyBwcGMuCisKKzIwMDgtMDMtMjggIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzdGxwb3J0L2Fzc2VydC5oOiBCdWcgIzE4OTQ4ODI6IEFwcGx5IGEgdGVjaG5pcXVlIHNpbWlsYXIgdG8gdGhlCisJb25lIHVzZWQgaW4gZXJybm8uaCB0byBkZXRlY3Qgd2hlbiBhc3NlcnQgaGFzIGJlZW4gZGVmaW5lZCBiZWZvcmUKKwlpbmNsdWRpbmcgYXNzZXJ0LmguCisKKzIwMDgtMDMtMjEgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBQYXRjaCAxODc2NTI5IGZyb20gSm9oYW4gQW5kZXJzc29uIHRvIGFkZCBzdXBwb3J0IGZvciBWUyAyMDA1CisJYnVuZGxlZCBQb2NrZXQgUEMgMjAwMyBTREsuCisKKzIwMDgtMDMtMTggIFBldHIgT3Z0Y2hlbmtvdiAgPGNvbXBsZW1lbnRAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzdGxwb3J0L3N0bC9fc3RyaW5nLmM6IGRlcml2ZWQgZnJvbSBwYXRjaCAjMTkxNDQ3NSwgd3JvbmcKKwlyZXBsYWNlIGZvciBzZWxmcmVmZXJlbmNpbmcgc3RyaW5nOyB0aGFua3MgRmFyaWQgWmFyaXBvdjsKKworCSogdGVzdC91bml0L3N0cmluZ190ZXN0LmNwcDogdGVzdCBmb3IgcHJvYmxlbSBhYm92ZS4KKworMjAwOC0wMy0xNyAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHN0bHBvcnQvc3RsL19zdGRleGNlcHRfYmFzZS5oLCBfc3RkZXhjZXB0X2Jhc2UuYywKKwl0eXBlX21hbmlwcy5oLCBzcmMvbnVtX3B1dF9mbG9hdC5jcHAsCisJdGVzdC91bml0L251bV9wdXRfZ2V0X3Rlc3QuY3BwOiBCb3JsYW5kIHBhdGNoIGZyb20gRXJpYyBTYW5mb3JkLgorCU5vIG5lZWQgZm9yIGEgX19OYW1lZF9leGNlcHRpb24gd29ya2Fyb3VuZCBhbnltb3JlLiBGb3JjZQorCWZsb2F0aW5nIHBvaW50IGNvbnRyb2wgd29yZCB3aGVuIHRlc3Rpbmcgc3BlY2lhbCBmbG9hdGluZyBwb2ludAorCW9wZXJhdGlvbnMuIENoYW5nZSBpbXBsZW1lbnRhdGlvbiBfQ29weWFibGUgYW5kIGFkZCBhIHdvcmthcm91bmQKKwl0byBjb3JyZWN0bHkgcmVuZGVyIGxvbmcgZG91YmxlIG1heCB2YWx1ZSB0aGF0IGlzIGNvbnNpZGVyIGFzCisJZXF1YWwgdG8gZG91YmxlIG1heCB2YWx1ZS4KKworMjAwOC0wMy0xMCAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGJ1aWxkL01ha2VmaWxlczogTm9ybWFsaXphdGlvbiBvZiAtLXdpdGgtc3RhdGljLXJ0bCBhbmQKKwktLXdpdGgtZHluYW1pYy1ydGwgZXh0ZW5kZWQgdG8gY29uZmlndXJlIHNjcmlwdCBmb3IgQm9ybGFuZAorCWFuZCBETUMgY29tcGlsZXJzLgorCisyMDA4LTAzLTA4ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogdGVzdC91bml0L2NwcHVuaXQvY3BwdW5pdF9taW5pLmg6IE5ldyBtaW5pIGNwcHVuaXQgZnJhbWV3b3JrCisJZmVhdHVyZSwgdGhlIGV4cGxpY2l0IHRlc3RzIHRoYXQgaGF2ZSB0byBiZSBleHBsaWNpdGx5IHRlc3RlZAorCXRoYW5rcyB0byB0aGUgLXQgb3B0aW9uIHRvIHJ1bi4KKworCSogdGVzdC91bml0L3Vub3JkZXJlZF90ZXN0LmNwcDogYmVuY2htYXJrMSBhbmQgYmVuY2htYXJrMiB0ZXN0cworCWFyZSBub3cgZXhwbGljaXQuCisKKwkqIHN0bHBvcnQvc3RsL19zdGRleGNlcHRfYmFzZS5oLCBfc3RkZXhjZXB0X2Jhc2UuYzoKKwlfX05hbWVkX2V4Y2VwdGlvbiB0aGF0IGNvbnRhaW5zIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBtZW1vcnkKKwlyZXF1aXJlIGEgY29weSBjb25zdHJ1Y3RvciBhbmQgYXNzaWdubWVudCBvcGVyYXRvci4gVGhhbmtzIGJ1ZworCXJlcG9ydCAjMTkwODYyNiBmcm9tIElseWEgRG9nYWRhZXYuCisKKwkqIGJ1aWxkL01ha2VmaWxlczogTm9ybWFsaXplZCBzb21lIGNvbmZpZ3VyZSBvcHRpb25zOgorCS0td2l0aG91dC10aHJlYWQsIC0td2l0aG91dC1ydHRpLCAtLXdpdGgtbGliLW1vdGlmLiAKKworMjAwOC0wMy0wNiAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIEZpeCBydHRpIG1hbmFnZW1lbnQ6CisJIC0gbm8gcnR0aSBzdXBwb3J0IGRvIG5vdCBpbXBseSBubyB0eXBlX2luZm8gc3RydWN0IGRlZmluaXRpb24uCisJIC0gI2Vycm9yIG1lc3NhZ2UgaW4gdHlwZWluZm8gdG8gc2lnbmFsIG1pc3NpbmcgcnR0aSBzdXBwb3J0CisJaGFzIGJlZW4gcmVtb3ZlZC4KKwkgLSBsb2NhbGUgaW1wbGVtZW50YXRpb24gZG8gbm90IHVzZSB0eXBlaWQgYW55bW9yZSB0byBlbmhhbmNlCisJcnVudGltZV9lcnJvciBtZXNzYWdlIHRocm93biBieSBjb21iaW5lIG1lc3NhZ2Ugd2hlbiB3ZSBjYW5ub3QKKwlmaW5kIHRoZSBjb21iaW5lZCBmYWNldC4gSXQgd2FzIGludHJvZHVjaW5nIGFuIGFubm95aW5nIGRlcGVuZGVuY3kKKwltYWtpbmcgdXNlIG9mIHRoZSBsaWIgd2l0aG91dCBydHRpIHN1cHBvcnQgaW1wb3NzaWJsZS4KKworMjAwOC0wMy0wNSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHN0bHBvcnQvc3RsL19yYW5nZV9lcnJvcnMuaDogU2lnbmFsIGZ1bmN0aW9uIHJlc3BvbnNpYmxlCisJZm9yIHRocm93aW5nIGV4Y2VwaW9ucyBhcyBub3QgcmV0dXJuaW5nIHRvIHRoZSBETUMgY29tcGlsZXIuCisKKzIwMDgtMDMtMDMgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2U6IEVyaWMgU2FuZm9yZCBwYXRjaCB0byBtYWtlIGdlbmVyYXRpb24KKwlvZiBkZWJ1ZyBzeW1ib2xzIG9wdGlvbmFsIHdoZW4gdXNpbmcgQm9ybGFuZCBjb21waWxlciB0byBidWlsZAorCXVuaXQgdGVzdHMuCisKKwkqIHN0bHBvcnQvc3RsL2NvbmZpZzogTm9ybWFsaXphdGlvbiBvZiB2ZXJib3NlIG1vZGUgdXNlZCB0byBnZXQKKwlmZWVkYmFjayBhYm91dCBidWlsZCBjb250ZXh0IHdoZW4gdXNpbmcgU1RMcG9ydC4KKwlfU1RMUF9WRVJCT1NFX0FVVE9fTElOSyBoYXMgYmVlbiByZW5hbWVkIGluIF9TVExQX1ZFUkJPU0UgYW5kCisJcmVwb3J0IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gbGlrZSBydHRpLCBleGNlcHRpb24gc3VwcG9ydCwKKwltb25vL211bHRpIHRocmVhZGVkLCBzdGF0aWMvZHluYW1pYyBsaWJyYXJ5LgorCisJKiBzdGxwb3J0L3N0bC9fY2hlY2tfY29uZmlnLmg6IFVudXNlZCwgcmVtb3ZlZC4KKworCSogc3RscG9ydC90eXBlaW5mbzogUmVwb3J0IHVzZSBvZiB0aGlzIGhlYWRlciB3aGVuIHRoZXJlIGlzIG5vCisJUlRUSSBzdXBwb3J0LCBvbmx5IHdoZW4gd2UgY2FuIGRldGVjdCBpdCBvZiBjb3Vyc2UuCisKKzIwMDgtMDItMjkgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2U6IFNldmVyYWwgbW9kaWYgZm9yIERpZ2l0YWwgTWFycyBzdXBwb3J0LgorCisJKiBzdGxwb3J0L3N0bC9fZnVuY3Rpb25fYmFzZS5oOiBIaWRlIHByb3RlY3RlZCBjb25zdHJ1Y3RvciBub3QKKwlzdXBwb3J0ZWQgYnkgQm9ybGFuZCBjb21waWxlci4KKworCSogc3RscG9ydC9zdGwvY29uZmlnL19iYy5oOiBOb3cgZGV0ZWN0IFJ0dGkgc3VwcG9ydC4KKworMjAwOC0wMi0yOCAgUGV0ciBPdnRjaGVua292ICA8Y29tcGxlbWVudEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGJ1aWxkL01ha2VmaWxlcy9nbWFrZS9nY2MubWFrOiB1c2UgbW9yZSBjb252ZW5pZW50IG9wdGlvbgorCS1kdW1wdmVyc2lvbiB0byBkZXRlY3QgY29tcGlsZXIncyByZXZpc2lvbjsgY2hlY2sgdGhhdAorCS1mdXNlLWN4YS1hdGV4aXQgcmVhbGx5IHJlcXVpcmVkOyByZW1vdmUgLWZpZGVudCBvcHRpb247CisKKwkqIGJ1aWxkL01ha2VmaWxlcy9nbWFrZS90YXJnZXRkaXJzLm1hazogdGFrZSBpbnRvIGFjY291bnQgREVTVERJUjsKKworCSogYnVpbGQvbGliL2NvbmZpZ3VyZTogd3JpdGUgREVTVERJUiBhcyBwcmVmaXggZm9yIGluc3RhbGxhdGlvbiBwYXRoZXM7CisKKwkqIHN0bHBvcnQvdHlwZV90cmFpdHM6ICB0eXBlIHRyYWl0cywgY2xvc2UgdG8gSlRDMS9TQzIyL1dHMjEKKwlDKysgMHggd29ya2luZyBkcmFmdAorCVtodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9KdGMxL3NjMjIvd2cyMS9kb2NzL3BhcGVycy8yMDA4L24yNTIxLnBkZl0KKworMjAwOC0wMi0yNiAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIFJhdGlvbmFsaXphdGlvbiBpbiBkZXRlY3Rpb24gb2YgcmVhbCBsb2NhbGl6YXRpb24gaW1wbGVtZW50YXRpb24uCisJX1NUTFBfUkVBTF9MT0NBTEVfSU1QTEVNRU5URUQgcmVtb3ZlZCwgdGhlIHdob2xlIGRldGVjdGlvbiBtZWNhbmlzbQorCWlzIG5vdyBpbiBjX2xvY2FsZS5oL2NfbG9jYWxlLmMgYW5kIGlzIGJhc2VkIG9uIEFQSSBzcGVjaWZpYyBtYWNyb3MuCisJRm9yIHRoZSBtb21lbnQgcmVhbCBsb2NhbGl6YXRpb24gaXMgdXNlZCBmb3Igd2luZG93cyBwbGF0Zm9ybXMKKwkoX1NUTFBfV0lOMzIgZXhjZXB0IFdpbmRvd3MgQ0UpIGFuZCB3aGVuIEdsaWJjIDIuMiBvciBuZXdlciB3aXRoCisJR05VIGV4dGVuc2lvbnMgKF9HTlVfU09VUkNFKSBpcyBkZXRlY3RlZC4KKworMjAwOC0wMi0yNSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHN0bHBvcnQvc3RsL3R5cGVfdHJhaXRzLmg6IEdlbmVyYWxpemUgdGVjaG5pcXVlIHVzZWQgYnkgQm9ybGFuZAorCWNvbXBpbGVyIHRvIGRldGVjdCBwb2ludGVyIHR5cGVzIGNvbnN0IG9yIHZvbGF0aWxlIHF1YWxpZmllZCBhbmQKKwlhdm9pZCB0cml2aWFsIGNvcHkgaW4gdGhpcyBjYXNlLgorCisJKiBFcmljIFNhbmZvcmQgcGF0Y2ggZm9yIEJvcmxhbmQgY29tcGlsZXIgZm9yIExpbnV4LgorCisyMDA4LTAyLTIyICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3RscG9ydC9zdGwvY19sb2NhbGUuaCwgc3JjL2NfbG9jYWxlLmgsCisJY19sb2NhbGVfd2luMzIvY19sb2NhbGVfd2luMzIuYywgY193bG9jYWxlX3dpbjMyLmM6IE1ham9yIGNvZGUKKwlzaW1wbGlmaWNhdGlvbi4gRGVmaW5pdGlvbiBvZiBfTG9jYWxlX1VQUEVSLCBfTG9jYWxlX0xPV0VSLCBldGMuLi4KKwl1c2VkIHRvIGJlIHBsYXRmb3JtIGRlcGVuZGFudCByZXF1aXJpbmcgYSBsb3Qgb2YgbWFjcm8gY2hlY2tzIGFuZAorCWFkZGl0aW9ubmFseSBleHBvc2luZyBTVExwb3J0IHRvIHdyb25nIGRlZmluaXRpb25zLiBXaGVuIGZvcgorCWluc3RhbmNlIF9Mb2NhbGVfUFJJTlQgd2FzIGRlZmluZWQgYXMKKwlfTG9jYWxlX1VQUEVSfF9Mb2NhbGVfTE9XRVJ8Li4uLCBtYXJraW5nIGEgY2hhcmFjdGVyIGFzIHByaW50YWJsZQorCXdhcyBhbHNvIG1ha2luZyBpdCBhIHVwcGVyIGFuZCBsb3dlciBjaGFyYWN0ZXIhCisJSW4gZmFjdCB0aG9zZSBtYXNrcyBoYXZlIHRvIGJlIHBsYXRmb3JtIHNwZWNpZmljIG9ubHkgd2hlbgorCVNUTHBvcnQgZGlyZWN0bHkgZXhwb3NlIHBsYXRmb3JtIG1hc2tzIHdoaWNoIGlzIG9ubHkgdGhlIGNhc2Ugd2hlbgorCXVzaW5nIEdsaWJDLiBTbyBub3cgdGhvc2UgbWFzayBhcmUgaGFyZCBjb2RlZCBpbiBTVExwb3J0IHVzaW5nCisJdmFsdWVzIGRlZmluZWQgaW4gdGhlIEMrKyBTdGFuZGFyZCAyMi4yLjEuIFVuZGVyIFdpbmRvd3MgdGhlCisJbG9jYWxpc2F0aW9uIGltcGxlbWVudGF0aW9uIGhhcyBiZWVuIGFkYXB0ZWQgdG8gbWFwIFdpbjMyIG1hc2sgdmFsdWVzCisJdG8gdGhlIFNUTHBvcnQgb25lcy4gQSBudW1iZXIgb2Ygbm93IHVzZWxlc3Mgd29ya2Fyb3VuZCBoYXMgYmVlbgorCXJlbW92ZWQuCisKKwkqIHNyYy9jX2xvY2FsZV9kdW1teS9jX2xvY2FsZV9kdW1teS5jLCBjdHlwZS5jcHAsCisJdGVzdC91bml0L2N0eXBlX2ZhY2V0c190ZXN0LmNwcDogUmVtb3ZlZCB0aGUgaGFyZCBjb2RlZCB0YWJsZSBvZgorCWNoYXJhY3RlciB0eXBlcyB0aGF0IHdhcyBkdXBsaWNhdGluZyB0aGUgb25lIGluIHNyYy9jdHlwZS5jcHAuIE5vdworCWEgdGFibGUgaXMgYnVpbGQgZHVyaW5nIGxpYnJhcnkgaW5pdGlhbGlzYXRpb24gdXNpbmcgQyBmdW5jdGlvbnMKKwlpc3NwYWNlLCBpc2FscGhhLi4uIERvaW5nIHNvIGFuZCBhZGRpbmcgYSB0ZXN0IGluCisJTG9jYWxlVGVzdDo6Y3R5cGVfYnlfbmFtZSB3aWxsIHNob3cgaWYgU1RMcG9ydCBhbmQgdGhlIEMgcnVudGltZQorCWFncmVlIG9uIGNoYXJhY3RlciBjbGFzc2lmaWNhdGlvbi4KKworMjAwOC0wMi0yMCAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHNyYy9hbGxvY2F0b3JzLmNwcDogQ2hhbmdlIG1hbmFnZW1lbnQgb2YgX1NfaGVhcF9zaXplLCBub3cgYml0CisJdHJhbnNsYXRpb24gaXMgZG9uZSBvbiB0aGUgdmFsdWUgdXNlZCB0byBpbmNyZW1lbnQgaXQgcmF0aGVyIHRoYW4KKwl3aGVuIHVzaW5nIF9TX2hlYXBfc2l6ZS4gVGhhbmtzIHRvIHRoaXMgbW9kaWYsIHdoZW4gX1NfaGVhcF9zaXplIGlzIG9ubHkgYSAzMgorCWJpdHMgdmFsdWUgaXQgd29uJ3Qgcm9sbCBiZWZvcmUgMTZHbyBoYXMgYmVlbiBhbGxvY2F0ZWQuIFRoYW5rcyB0bworCWFuIGFkZGl0aW9uYWwgdW5zaWduZWQgY2FzdCB0aGUgZWZmZWN0IHdvbid0IGJlIG5vdGljZSBiZWZvcmUgMzIgR28KKwlhcmUgYWxsb2NhdGVkLgorCisyMDA4LTAyLTE5ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3JjL2NfbG9jYWxlX2R1bW15L2NfbG9jYWxlX2R1bW15LmM6IEZpeCBpbXBsZW1lbnRhdGlvbiBvZgorCV9XTG9jYWxlX3RvdXBwZXIvX1dMb2NhbGVfdG9sb3dlciwgY2FsbCB0byByZXNwZWN0aXZlbHkKKwl0b3d1cHBlci90b3dsb3dlciB3YXMgaW52ZXJ0ZWQuCisKKwkqIHNyYy9hbGxvY2F0b3JzLmNwcDogX19zdGxwX2NodW5rX21hbGxvYy9fX3N0bHBfY2h1bmNrX2ZyZWUKKwlyZW5hbWVkIHJlc3BlY3RpdmVseSBpbiBfX3N0bHBfbmV3X2NodW5rL19fc3RscF9kZWxldGVfY2h1bmNrIGFzCisJdGhvc2UgZnVuY3Rpb25zIGJlaGF2aW9yIGFyZSBjbG9zZXIgdG8gdGhlIG5ldyBvcGVyYXRvciBiZWhhdmlvcgorCXJhdGhlciB0aGFuIHRvIG1hbGxvYy4gX19zdGxwX25ld19jaHVuayBpbXBsZW1lbnRhdGlvbiBmaXhlZCwgaXQKKwl3YXMgdXNpbmcgX1NUTFBfQ0hFQ0tfTlVMTF9BTExPQyByZXNlcnZlZCB0byBjaGVjayBhbGxvY2F0aW9ucworCXBlcmZvcm1lZCB0aHJvdWdoIG5ldyBvcGVyYXRvci4gRml4IGNvZGUgdG8gY29ycmVjdGx5IHRha2UgaW50byBhY2NvdW50CisJYmFkX2FsbG9jIGV4Y2VwdGlvbnMuCisKKzIwMDgtMDItMTggIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzdGxwb3J0L3N0bC9fYWxnb2Jhc2UuaDogUmVtb3ZlZCBuYW1lc3BhY2Ugc3BlY2lmaWNhdGlvbiBvbgorCXN3YXAgaW52b2NhdGlvbiBpbiBpdGVyX3N3YXAgaW1wbGVtZW5hdGlvbiBiZWNhdXNlIGl0IHdhcyBicmVha2luZworCXRlbXBsYXRlIGZ1bmN0aW9uIHJlc29sdXRpb24gZm9yIGdjYy4gV2hldGhlciB0aGlzIGlzIGEgZ2NjIGJ1ZworCW9yIHNpbXBseSBjb3JyZWN0IFN0YW5kYXJkIEMrKyBpcyBub3QgY2xlYXIgeWV0IHNvIG5hbWVzcGFjZSBoYXMKKwliZWVuIHJlbW92ZWQgaW5kZXBlbmRhbnQgb2YgY29tcGlsZXIgaW4gdXNlLgorCisJKiBzdGxwb3J0L3N0bC9fYWxsb2MuaCwgX25ldy5oLCBzcmMvbG9jYWxlLmNwcCwgbG9jYWxlX2ltcGwuY3A6CisJR2VuZXJhbGl6ZSB1c2Ugb2YgX1NUTFBfVEhST1dfQkFEX0FMTE9DIG1hY3JvIHRvIHRocm93IHRoZQorCWJhZF9hbGxvYyBleGNlcHRpb24uIERlZmluaXRpb24gb2YgdGhpcyBtYWNybyBpcyBub3cgaW4gX25ldy5oCisJaGVhZGVyLgorCisJKiBzdGxwb3J0L3N0bC9fdmFsYXJyYXkuaDogVXNlIF9fc3RsX25ldyByYXRoZXIgdGhhbiBtYWxsb2MgdG8gZ2V0CisJZXhjZXB0aW9uIG1hbmFnZW1lbnQgd2l0aG91dCBhZGRpdGlvbmFsIGNvZGUuIEl0IGFsc28gZ2l2ZXMgdXNlcnMKKwlhIFN0YW5kYXJkIHdheSB0byBkZXRlY3QgbWVtb3J5IHN0YXJ2YXRpb24gdGhyb3VnaCB0aGUgbmV3IGhhbmRsZXIuCisKKzIwMDgtMDItMTYgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBSZW1vdmVkIGFuYWNocm9ub3VzIGFuZCB1bm1haW50YWluZWQgcmF3IFNHSSBhbGxvY2F0b3IgbW9kZS4KKworMjAwOC0wMi0xNSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHNyYy9kZXRhaWxzL2ZzdHJlYW1fd2luMzJpby5jcHA6IEZpeCB3cm9uZyB1c2Ugb2YgV2luMzIgQVBJLgorCVNldEZpbGVQb2ludGVyIGRvIG5vdCB0YWtlIFNFRUtfQ1VSIG1hY3JvIGJ1dCBGSUxFX0NVUlJFTlQuCisKKwkqIHNyYy9hbGxvY2F0b3JzLmNwcCwgc3RscG9ydC9zdGwvX2FsbG9jLmgsIF9hbGxvY19vbGQuaCwKKwlfY29uc3RydWN0LmgsIF9uZXcuaCwgX3B0aHJlYWRfYWxsb2MuaCwgX3JvcGUuaCwgY29uZmlnL19ldmMuaCwKKwlmZWF0dXJlcy5oOiBDb2RlIGNsZWFudXA7IF9fVEhST1dfQkFEX0FMTE9DIG5vcm1hbGl6ZWQgaW4KKwlfU1RMUF9USFJPV19CQURfQUxMT0M7IF9TVExQX05FVywgX1NUTFBfUExBQ0VNRU5UX05FVyBhbmQKKwlfU1RMUF9CUk9LRU5fQkFEX0FMTE9DX0NMQVNTIG1hY3JvcyByZW1vdmVkLgorCisyMDA4LTAyLTE0ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3JjL2NfbG9jYWxlX2dsaWJjL2NfbG9jYWxlX2dsaWJjMi5jOiBNYW51YWx5IGhhbmRsZSB0aGUgIkMiIGxvY2FsZQorCXRvIGd1YXJhbnR5IGNvbnNpc3RlbmN5IHdpdGggdGhlIGRlZmF1bHQgIkMiIGZhY2V0IGltcGxlbWVudGF0aW9ucyBpbgorCXRoZSBsaWIuCisKKwkqICogdGVzdC91bml0L3RpbWVfZmFjZXRzX3Rlc3QuY3BwLCBudW1fZmFjZXRzX3Rlc3QuY3BwLAorCW1vbmV0YXJ5X2ZhY2V0c190ZXN0LmNwcCwgY3R5cGVfZmFjZXRzX3Rlc3QuY3BwOiBFbmhhbmNlIHRlc3RzIGJ5IHVzaW5nCisJYSB0aGlyZCB3YXkgb2YgZ2VuZXJhdGluZyBsb2NhbGUgaW5zdGFuY2UgZnJvbSBuYW1lcy4KKworMjAwOC0wMi0xMyAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHNyYy9mc3RyZWFtX2ltcGwuaCwgZGV0YWlscy9mc3RyZWFtX3dpbjMyaW8uY3BwLAorCWZzdHJlYW1fdW5pdHN0ZC5jcHAsIGZzdHJlYW1fc3RkaW8uY3BwLCBzdGRpb19zdHJlYW1idWYuY3BwOiBfX3N0ZGluX3NpemUKKwlmdW5jdGlvbiByZXZvbWVkIG1ha2luZyBmc3RyZWFtX2ltcGwuaCB1c2VsZXNzLgorCisyMDA4LTAyLTEyICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3RscG9ydC9zdGwvdHlwZV9tYW5pcHMuaCwgdHlwZV90cmFpdHMuaDogQm9ybGFuZCBwYXRjaCBmcm9tIEVyaWMKKwlTYW5mb3JkIHRvIGZpeCByZWdyZXNzaW9ucyBpbnRyb2R1Y2VkIHdpdGggcmVjZW50IG1vZGlmaWNhdGlvbnMgb2YKKwlzb21lIGhlbHBlciBzdHJ1Y3QgdXNlZCB0byBkZXRlY3QgcG90ZW50aWFsIG9wdGltaXphdGlvbnMuCisKKwkqIGNvbmZpZy9fYmMuaCwgZmVhdHVyZXMuaDogTmV3IGNvbmZpZ3VyYXRpb24sIEJvcmxhbmQgZG8gbm90IHN1cHBvcnQKKwlmb2xsb3dpbmcgc3ludGF4OiAKKwl0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czw+Ojp2YWx1ZV90eXBlLiBJdCBicmVha3Mgb24gYXNzb2NpYXRpb24KKwlvZiB0eXBlbmFtZSBrZXl3b3JkIHdpdGggbmFtZXNwYWNlIHNwZWNpZmljYXRpb24uIEFzIEJvcmxhbmQgZG8gbm90CisJcmVxdWlyZSB0eXBlbmFtZSBrZXl3b3JkIGluIHRoaXMgY2FzZSBpdCBpcyBub3cgcG9zc2libGUgYXZvaWQgaXQKKwl0aGFua3MgdG8gdGhlIF9TVExQX05PX1RZUEVOQU1FX0JFRk9SRV9OQU1FU1BBQ0UgbWFjcm8uCisKKwkqIHN0bHBvcnQvc3RsL19saW1pdHMuYzogQm9ybGFuZCwgbGlrZSBnY2MgNCwgcHJlZmVyIGFkZGl0aW9uYWwgYnJhY2tldHMKKwlpbiBpbml0aWFsaXphdGlvbiBvZiBzdHJ1Y3QgYXNzb2NpYXRlZCB0byBjb21wdXRhdGlvbiBvZiBudW1lcmljIGxpbWl0cworCXZhbHVlcy4KKworMjAwOC0wMi0wMSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIEdlbmVyYWwgY29kZSByZXZpZXcgdG8gbG9vayBmb3IgU3RhbmRhcmQgb3IgaW50ZXJuYWwgZnVuY3Rpb25zCisJY2FsbGVkIHdpdGggbmFtZXNwYWNlIHNjb3BlIGluIG9yZGVyIHRvIGF2b2lkIGFtYmlndW91cyBjYWxscworCXdoZW4gY29tcGlsZXIgaW1wbGVtZW50IEFyZ3VtZW50IERlcGVuZGFudCBMb29rdXAuIFNlZSBMaXN0VGVzdDo6YWRsCisJdGVzdCBjYXNlIHRvIHNlZSB3aGF0IGl0IG1lYW5zLgorCisJKiBzdGxwb3J0L3N0bC9jb25maWcvZmVhdHVyZXMuaDogX1NUTFBfUFJJViBub3cgY29udGFpbnMgZnVsbAorCW5hbWVzcGFjZSBwYXRoIHN0YXJ0aW5nIGF0IGdsb2JhbCBuYW1lc3BhY2UgdGhhdCBpcyB0byBzYXkKKwk6OnN0bHBvcnQ6OnByaXY6OiB3aGVuIHByaXZhdGUgbmFtZXNwYWNlIGlzIGluIHVzZSBhbmQgOjpzdGxwb3J0OjoKKwl3aGVuIGl0IGlzIG5vdC4gSWRlbSBmb3IgX1NUTFBfVFIxIHRoYXQgbm93IGNvbnRhaW5zIDo6c3RscG9ydDo6dHIxOjouCisKKwkqIHN0bHBvcnQvc3RsL2RlYnVnL19zdHJpbmcuaDogQ2FsbCB0byBzdGQ6OmRpc3RhbmNlIHJlbW92ZWQgdG8gYXZvaWQKKwlyZWFkaW5nIGlucHV0IGl0ZXJhdG9ycyBiZWZvcmUgcmVhZGluZyB0aGVpciBjb250ZW50cy4gTm93IGFsbAorCWJhc2ljX3N0cmluZzo6YXNzaWduIG1ldGhvZHMgaW52YWxpZGF0ZSBhbGwgaXRlcmF0b3JzIGxpa2Ugb3RoZXIKKwljb250YWluZXJzLgorCisJKiBzdGxwb3J0L3N0bC9faXRlcmF0b3JfYmFzZS5oOiBSZW1vdmUgaW1wbGVtZW50YXRpb24gb2YgX192YWx1ZV90eXBlCisJX19kaXN0YW5jZV90eXBlIGFuZCBfX2l0ZXJhdG9yX2NhdGVnb3J5IHdoZW4gY29tcGlsZXIgc3VwcG9ydCBwYXJ0aWFsCisJdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24uIEluIHRoaXMgY2FzZSB3ZSBkaXJlY3RseSB1c2UgaXRlcmF0b3JfdHJhaXRzLAorCXdlIGRvIG5vdCBuZWVkIHRob3NlIGZ1bmN0aW9ucy4gUmVtb3ZlZCBzcGVjaWFsIF9fZGlzdGFuY2UgaW1wbGVtZW50YXRpb25zCisJdXNlIGluIGFuIGFuYWNocm9ub3VzIGltcGxlbWVudGF0aW9uIG9mIGRpc3RhbmNlIHRha2luZyBhbiBpbml0aWFsIHZhbHVlCisJdG8gc3RhcnQgY291bnRpbmcuIE5vdyB0aGlzIGZ1bmN0aW9uIHVzZSBfX2Rpc3RhbmNlIGZ1bmN0aW9ucyBhbHJlYWR5CisJdXNlZCBieSB0aGUgc3RkOjpkaXN0YW5jZSBmdW5jdGlvbi4gVGhlIE1TVkMgX0Rpc3RhbmNlIGZ1bmN0aW9uIGlzIGFsc28KKwljb25zaWRlcmVkIGFzIGFuYWNocm9ub3VzLgorCisyMDA4LTAxLTMxICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3RscG9ydC9zdGwvX3N0cmluZy5oLCB0ZXN0L3VuaXQvc3RyaW5nX3Rlc3QuY3BwOiBBZGQgc3dhcAorCWltcGxlbWVudGF0aW9uIHdoZW4gdGhlcmUgaXMgbm8gc3VwcG9ydCBmb3IgdGVtcGxhdGUgZnVuY3Rpb24KKwlwYXJ0aWFsIG9yZGVyaW5nLgorCisyMDA4LTAxLTMwICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3JjL2ZzdHJlYW1faW1wbC5oLCBkZXRhaWxzL2ZzdHJlYW1fc3RkaW8uY3BwLCBmc3RyZWFtX3VuaXN0ZC5jcHAsCisJZnN0cmVhbV93aW4zMmlvLmNwcCwgc3RkaW9fc3RyZWFtYnVmLmgsIHN0ZGlvX3N0cmVhbWJ1Zi5jcHA6IEhpZGUKKwlfX2lzX3JlZ3VsYXJfZmlsZSBvbmx5IHVzZWQgaW4gZnN0ZWFtIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGZpbGVzLgorCVJlbmFtZSBfX2ZpbGVfc2l6ZSBpbiBfX3N0ZGluX3NpemUgYXMgdGhpcyBmdW5jdGlvbiBpcyBvbmx5IHVzZWQKKwl0byBnZXQgc3RkaW4gRklMRSogc2l6ZS4gVW5kZXIgV2luMzIgdGhpcyBmdW5jdGlvbiBub3cgYWx3YXlzIHJldHVybnMKKwkwIGFzIGl0IGxvb2tzIGxpa2UgV2luZG93cyBkbyBub3QgY29uc2lkZXIgRklMRSogYXMgYWxsb3dpbmcKKwlwb3NpdGlvbiBvcGVyYXRpb25zLiBNb3ZlIHBsYXRmb3JtIHNwZWNpZmljIGNvZGUgZnJvbSBzdGRpb19zdHJlYW1idWYKKwlpbXBsZW1lbnRhdGlvbiB0byBhc3NvY2lhdGVkIGZzdHJlYW1fKi5jcHAgZmlsZS4KKworMjAwOC0wMS0yOSAgUGV0ciBPdnRjaGVua292ICA8Y29tcGxlbWVudEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGJ1aWxkL3Rlc3QvdW5pdC9nY2MubWFrOiBvcHRpb24gZm9yIHJ1bi10aW1lIHBhdGggdG8gbGlic3RscG9ydAorCW9uIEhQLVVYOworCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2UvaHAtdXgvdGFyZ2V0c3lzLm1hazogSFAtVVggSUE2NCB1c2Ugc28KKwlhcyBzaGFyZWQgb2JqZWN0IGV4dGVudGlvbiwgd2hpbGUgUEEtUklTQyB1c2Ugc2w7CisKKwkqIGJ1aWxkL01ha2VmaWxlcy9nbWFrZS9nY2MubWFrOiB1c2UgLWZuby1yZW9yZGVyLWJsb2NrcyBmb3IgUEEtUklTQzsKKworCSogc3JjL2N4YS5jOiB1c2UgY3hhX2F0ZXhpdCBmaXggc2ltaWxhciB0byB0cmljayBvbiBTb2xhcmlzIGFuZCBGcmVlQlNEOworCisJKiBzcmMvbnVtX2dldF9mbG9hdC5jcHA6IHN0ZGludC5oIG9uIEhQLVVYOworCisJKiBzdGxwb3J0L3djdHlwZS5oLCBzdGxwb3J0L3N0bC9fY3djdHlwZS5oOiBIUC1VWCBoYXMgcHJvYmxlbXMgd2l0aAorCXdjaGFyczsgY2hhbmdlcyBzdWdnZXN0ZWQgYnkgS0JhYy4KKworMjAwOC0wMS0yOCAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHN0bHBvcnQvc3RsL2NvbmZpZy9fY3lnd2luLmg6IEN5Z3dpbiBkbyBub3QgZGVmaW5lIF9TVExQX1VTRV9HTElCQworCWFueW1vcmUsIHBsYXRmb3JtIEFQSSBpcyBjbG9zZXIgdG8gYSBTdGFuZGFyZCBDIGxpYiB0aGFuIHRvIHRoZSBHbnUKKwlsaWIgQy4KKworMjAwOC0wMS0yNiAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHNyYy9mc3RyZWFtX3N0ZGlvLmNwcCwgZnN0cmVhbV93aW4zMmlvLmNwcCwgZnN0cmVhbV91bmlzdGQuY3BwOgorCVJlbW92ZWQgdW51c2VkIHVpbnQ2NC5oIGluY2x1ZGUgYW5kIGRlZmluaXRpb24gb2YgVUxMIG1hY3JvLgorCisJKiBzcmMvdWluNjQuaDogUmVtb3ZlZCwgX2NvbXBvdW5kX2ludCBjbGFzcyBkZWZpbmVkIGluIGl0IGlzIHNpbXBseQorCW5vdCB1c2VkIGFueW1vcmUuCisKKwkqIHNyYy9fc3RkaW9fZmlsZS5oOiBNYWpvciBjbGVhbnVwLCBvbmx5IF9GSUxFX2ZkIGlzIHN0aWxsIGluIHVzZS4KKworCSogc3JjL2xvY2FsZS5jcHAsIGxvY2FsZV9pbXBsLmNwcCwgYnVpbGQvbGliL01ha2VmaWxlLmluYzogUmVzdG9yZQorCWluZGVwZW5kZW5jeSBiZXR3ZWVuIHRob3NlIDIgdHJhbnNsYXRpb24gdW5pdHMsIGNvZGUgZHVwbGljYXRpb24gaXMKKwl2ZXJ5IGxpbWl0ZWQuIFRoaXMgaXMgYSAxc3Qgc3RlcCB0byBtYWtlIGJ1aWxkIG9mIFNUTHBvcnQgZWFzaWVyIGJ5CisJaGF2aW5nIGFsbCBzb3VyY2VzIGluIHNyYyBmb2xkZXIgYnVpbGRhYmxlLgorCisJKiBzcmMvbG9jYWxlX2ltcGwuaCwgbG9jYWxlX2ltcGwuY3BwOiBfY29weV9Mb2NhbGVfaW1wbCByZW1vdmVkLAorCW9ubHkgdXNlIHRvIGNyZWF0ZSBpbml0aWFsIGdsb2JhbCBsb2NhbGUgdGhhdCBjYW4gc2ltcGx5IHJlZmVyZW5jZQorCWNsYXNzaWMgbG9jYWxlIGluY3JlbWVudGluZyBpdHMgcmVmZXJlbmNlIGNvdW50ZXIgYnkgb25lLgorCisJKiBzdGxwb3J0L3N0bC9fbG9jYWxlLmg6IEZpeCBsb2NhbGUgaW1wbGVtZW50YXRpb24gd2hlbiBNU1ZDNiB3b3JrYXJvdW5kCisJaXMgdXNlZC4gVGhlIGJhc2UgY2xhc3MgX05vTWVtX2xvYyBkbyBub3QgaGF2ZSB0byBoYXZlIGEgdmlydHVhbAorCWRlc3RydWN0b3IsIGl0IG9ubHkgbmVlZCBhIHByb3RlY3RlZCBvbmUuIE1vcmVvdmVyIGZpeCBjb25zdHJ1Y3RvcgorCXRha2luZyBhbiBvdGhlciBsb2NhbGUgaW5zdGFuY2UgYW5kIGEgZmFjZXQgaW5zdGFuY2UsIF9NX2ltcGwgd2FzCisJbm90IHJlbGVhc2VkIGJlZm9yZSBiZWluZyBhc3NpZ25lZCByZXN1bHRpbmcgaW4gYSBtZW1vcnkgbGVhay4KKwkKKwkqIHNyYy9mc3RyZWFtX3N0ZGlvLmNwcCwgZnN0cmVhbV91bmlzdGQuY3BwLCBmc3RyZWFtX3dpbjMyaW8uY3BwOgorCU1vdmVkIHRvIGRldGFpbHMgc3ViLWZvbGRlci4gTm93IGJ1aWxkaW5nIFNUTHBvcnQgbWVhbnMgYnVpbGQgYWxsCisJLmNwcCwgLmMgYW5kIG9wdGlvbm5hbHkgLnJjIGZpbGVzIGZyb20gc3JjIGZvbGRlci4KKworMjAwOC0wMS0yMiAgUGV0ciBPdnRjaGVua292ICA8Y29tcGxlbWVudEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGJ1aWxkL3Rlc3QvdW5pdC9nY2MubWFrOiBjaGVjayBjb25mZ3VyYXRpb24gYW5kIHNldAorCUFMTF9UQUdTIGJlZm9yZSBpbmNsdXNpb24gdG9wLm1haywgdG8gY29ycmVjdGx5IHNldAorCXRhcmdldHMgZm9yICdhbGwnLgorCisyMDA4LTAxLTIxICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogYnVpbGQvdGVzdC91bml0L2ljbC5tYWs6IEFkZCAvZnA6c3RyaWN0IG9wdGlvbiB0byBidWlsZCB1bml0IHRlc3RzCisJYXMgd2UgbmVlZCBzdHJpY3QgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIG9wZXJhdGlvbnMgcmVzcGVjdCB0byBoYXZlCisJbnVtZXJpYyBsaW1pdHMgdG8gd29yayBjb3JyZWN0bHkuCisKKwkqIHN0bHBvcnQvc3RsL2NvbmZpZy9faW50ZWwuaDogTG9va3MgbGlrZSBJQ0wgc2luY2UgdmVyc2lvbiA5IHN1cHBvcnQKKwlzdGF0aWMgY29uc3RhbnQgY29ycmVjdGx5LgorCisJKiBzdGxwb3J0L3N0bC9jb25maWcvZmVhdHVyZXMuaCwgc3JjL2NfbG9jYWxlX3dpbjMyL2NfbG9jYWxlX3dpbjMyLmM6CisJTmV3IG1hY3JvIF9TVExQX01BUktfUEFSQU1FVEVSX0FTX1VOVVNFRCB0byBvZmZlciBhIGNvbXBpbGVyIHNwZWNpZmljCisJd2F5IG9mIG1hcmtpbmcgcGFyYW1ldGVycyBhcyB1bnVzZWQuIERlZmF1bHQgYmVoYXZpb3IgaXMgdG8gY2FzdCB0aGUKKwlwYXJhbWV0ZXIgdG8gdm9pZCouCisKKwkqIHNyYy9jX2xvY2FsZV93aW4zMi9jX3dsb2NhbGVfd2luMzIuYzogRml4IF9XTG9jYWxlX3N0cnhmcm0gZnVuY3Rpb24KKwlpbXBsZW1lbnRhdGlvbiB0aGFua3MgS2FpIEtoY3l0LiBEZXNwaXRlIHRha2luZyBhIHBvaW50ZXIgdG8gd2NoYXJfdCoKKwlMQ01hcFN0cmluZ1cgd3JpdGVzIGJ5dGVzIHRvIGl0LgorCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2UvYmNjLm1haywgbGliL2JjYy5tYWssIGFwcC9iY2MubWFrLCBzdGxwb3J0L2NlcnJubywKKwllcnJuby5oLCBzdGwvdHlwZV9tYW5pcHMuaCwgdHlwZV90cmFpdHMuaDogQm9ybGFuZCBwYXRjaCBmcm9tIEVyaWMKKwlTYW5mb3JkIHRvIGJ1aWxkIEJvcmxhbmQgbGlicyB3aXRoIEdOVSBtYWtlIGJ1aWxkIHN5c3RlbS4KKworMjAwOC0wMS0xOCAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHRlc3QvdW5pdC9sb2NhbGVfdGVzdC5jcHAsIGN0eXBlX2ZhY2V0c190ZXN0LmNwcCwKKwltb25leV9mYWNldHNfdGVzdC5jcHAsIG51bV9mYWNldHNfdGVzdC5jcHAsIHRpbWVfZmFjZXRzX3Rlc3QuY3BwOgorCXRlc3Rfc3VwcG9ydGVkX2xvY2FsZSBmdW5jdGlvbiBkbyBub3QgaGF2ZSB0byBiZSB0ZW1wbGF0ZSwgbWlnaHQKKwlhdm9pZCBJQ0wgd3JpbmcgY29kZSBnZW5lcmF0aW9uLgorCisJKiBzdGxwb3J0L3N0bC9fZnVuY3Rpb25fYmFzZS5oOiBCYXNlZCBvbiBhbiBpZGVhIGZyb20gSGVyYiBTdXR0ZXIgaW4KKwloaXMgZXhjZWxsZW50IGJvb2sgIkV4Y2VwdGlvbmFsIEMrKyBTdHlsZSIsIGRlcml2ZWQgY2xhc3MgZGVzdHJ1Y3RvcgorCXNob3VsZCBiZSBwcm90ZWN0ZWQgbm9uIHZpcnR1YWwgb3IgcHVibGljIHZpcnR1YWwuIHVuYXJ5X2Z1bmN0aW9uCisJYW5kIGJpbmFyeV9mdW5jdGlvbiBzdHJ1Y3QgYXJlIGludGVuZGVkIHRvIGJlIGRlcml2ZWQgYnV0IHRoZXkKKwlhcmUgbm90IHBvbHltb3JwaGljIHNvIGRlc3RydWN0b3Igc2hvdWxkIGJlIHByb3RlY3RlZCBub24gdmlydHVhbC4KKwlBY2NvcmRpbmcgdGhlIGJvb2sgaXQgaXMgZXZlbiBub3QgYnJlYWtpbmcgbGlicmFyeSBTdGFuZGFyZCBjb25mb3JtaXR5CisJaW4gZG9pbmcgc28uIFdoYXQgaXMgc3VyZSBpcyB0aGF0IGl0IHdpbGwgaGVscCB1c2VycyBkZXRlY3QgYmFkCisJY29kZS4KKworMjAwOC0wMS0xNyAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHN0bHBvcnQvc3RsL2RlYnVnL19saXN0Lmg6IFJlbW92ZSB1c2Ugb2Ygc3RkOjpkaXN0YW5jZSBpbiBTVEwKKwlzYWZlIG1vZGUsIGl0IGlzIGludmFsaWQgZm9yIHB1cmUgaW5wdXQgaXRlcmF0b3JzLiBOb3cgYXNzaWduCisJaW52YWxpZGF0ZSBhbGwgaXRlcmF0b3JzIHdoaWNoIG1ha2UgdGhlIGNvZGUgc2ltcGxlci4KKworCSogUmVtb3ZlIHRoZSBkaWZmaWN1bHQgdG8gaW1wbGVtZW50IGFuZCBtYWludGFpbiBfQXJlU2FtZVVuQ1ZUeXBlcywKKwlkb2luZyBzbyBoYXMgYSBudW1iZXIgb2YgaW1wYWN0IG9uIHRoZSBsaWI6CisJLSBSZW1vdmUgdXNhZ2Ugb2YgaXQgaW4gZGVidWcvX3N0cmluZy5oIGFuZCBkZWJ1Zy9fZGVxdWUuaCwgd2UKKwlyYXRoZXIgdXNlIGZ1bmN0aW9uIHNwZWNpYWxpemF0aW9uIHRvIGRldGVjdCBzZWxmIHJlZmVyZW5jZS4gSW4gc3RyaW5nCisJaW1wbGVtZW50YXRpb24gaXQgaXMgYWxtb3N0IGltcG9zc2libGUgdG8gZGV0ZWN0IHNlbGYgcmVmZXJlbmNpbmcgaW4KKwlpbnNlcnQgYW5kIGFzc2lnbiBtZXRob2QgZXZlbiB3aXRoIHVzZSBvZiBfQXJlU2FtZVVuQ1ZUeXBlcywgc28KKwl3ZSBzeXN0ZW1hdGljYWxseSBjcmVhdGlvbiBhbiBpbnRlcm1lZGlhdGUgc3RyaW5nIGluc3RhbmNlLgorCS0gQ3JlYXRpb24gb2YgX0FyZUNvcHlhYmxlIGhlbHBlciBjbGFzcyB0byBkZXRlY3Qgd2hlbiBpdCBpcyBzYWZlCisJdG8gZG8gYSBtZW1jcHkgb3IgbWVtbW92ZSBiZXR3ZWVuIDIgdHlwZXMuIFRoaXMgY2xhc3MgcmV0dXJucyBmYWxzZQorCXdoZW4gYW55IHR5cGUgaXMgdm9sYXRpbGUgcXVhbGlmaWVkIG9yIHdoZW4gdHJ5aW5nIHRvIGNvcHkgdG8gYSBjb25zdAorCXF1YWxpZmllZCB0eXBlLgorCS0gQ3JlYXRpb24gb2YgX0FyZVNhbWVUeXBlcyBvbmx5IHJlYWxseSBpbXBsZW1lbnRlZCB0aGFua3MgdG8gcGFydGlhbAorCXRlbXBsYXRlIHNwZWNpYWxpemF0aW9uLCBvbmx5IHVzZWQgaW4gX0lzT2tUb1N3YXAgc3RydWN0LgorCisJKiB0ZXN0L3VuaXQvY29weV90ZXN0LmNwcDogQWRkIHRlc3Qgc2hvd2luZyBidWcgMTgwNjU1OC4KKwkKKzIwMDgtMDEtMTcgIFBldHIgT3Z0Y2hlbmtvdiAgPGNvbXBsZW1lbnRAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBidWlsZC9saWIvY29uZmlndXJlOiBEb24ndCBvdmVycmlkZSBDT01QSUxFUl9OQU1FLCBpZiBhbHJlYWR5CisJZGVmaW5lZDsKKworCSogc3RscG9ydC9zdGwvY29uZmlnL19wcm9sb2cuaDogcmVtb3ZlIHN1c3BpY2lvdXMgY29tbWVudHMuCisKKzIwMDgtMDEtMTUgIFBldHIgT3Z0Y2hlbmtvdiAgPGNvbXBsZW1lbnRAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzdGxwb3J0L3N0bC9jb25maWcvX2hwdXguaDogZGVmaW5lIF9QT1NJWF9DX1NPVVJDRSAxOTk1MDY7CisJc3VnZ2VzdGVkIGJ5IEtCYWMsIHBhdGNoICMxODY5MjI5LgorCisyMDA4LTAxLTE0ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3RscG9ydC9zdGwvX3N0cmluZy5oLCBfc3RyaW5nLmM6IFJlc3RvcmUgY29kZSB0byBzdXBwb3J0IG5vbi1QT0QKKwl0eXBlcyBpbiBiYXNpY19zdHJpbmcgaW1wbGVtZW50YXRpb24gYXMgc3BlY2lmaWVkIGluIGJhc2ljX3N0cmluZworCWNvbW1lbnRzLgorCisJKiBzdGxwb3J0L3N0bC9fbGltaXRzLmM6IFVzZSBkb3VibGUgbnVtZXJpYyBsaW1pdHMgZm9yIGxvbmcgZG91YmxlCisJd2hlbiBzaXplb2YoZG91YmxlKSA9PSBzaXplb2YobG9uZyBkb3VibGUpLgorCisJKiBzdGxwb3J0L3N0bC9kZWJ1Zy9fZGVidWcuaCwgX2RlcXVlLmgsIF9saXN0LmgsIF92ZWN0b3IuaDogUHJlZmVyIHRvCisJdXNlIG92ZXJsb2FkaW5nIG9mIG1lbWJlciBtZXRob2QgdG8gYWN0aXZhdGUgYWRkaXRpb25hbCBjaGVjayBvZgorCTIzLjEuMSB0YWJsZSA2NyBTdGFuZGFyZCBjb25mb3JtaXR5IHJhdGhlciB0aGFuIHVzaW5nIG1ldGFwcm9ncmFtbW5nCisJdGVjaG5pcXVlLgorCisyMDA4LTAxLTEyICBQZXRyIE92dGNoZW5rb3YgIDxjb21wbGVtZW50QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogYnVpbGQvTWFrZWZpbGVzL2dtYWtlL2xpYi9nY2MubWFrOiBnY2MgMy4zIGhhcyB1c2VmdWwKKwlsaWJzdXBjKyssIGJ1dCBzb21lIGJ1aWxkcyBub3Q7IHByZWZlciBub3JtYWwgc2l0dWF0aW9uLAorCW5vdCBtYXJnaW5hbDsgc2VlIHJlY29yZCAyMDA3LTEwLTEwOworCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2UvZ2NjLm1hazogZml4IHJlZmVyZW5jZSB0byBfRk9SQ0VfQ1hYIG1hY3JvOworCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2UvQ0MubWFrOiBkaXR0bzsKKworCSogYnVpbGQvTWFrZWZpbGVzL2dtYWtlL2FDQy5tYWs6IGRpdHRvOworCisJKiBidWlsZC9saWIvY29uZmlndXJlOiBrZWVwIGNvbXBpbGVyIGFuZCBkZWZhdWx0IGNvbXBpbGVyIC0tLSBnY2MKKwlpcyBtb3N0IGNvbW1vbiBkZWZ1YWx0IGFuZCBwbGFucyB0byBzd2l0Y2ggdG8gZGVmYXVsdCBtYWtlZmlsZS4KKworMjAwOC0wMS0xMSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHN0bHBvcnQvc3RsL19saW1pdHMuYzogQWRhcHQgbG9uZyBkb3VibGUgbnVtZXJpYyBsaW1pdHMgZm9yCisJSW50ZWwgQysrIGNvbXBpbGVyIDkgZm9yIFdpbmRvd3MuCisKKwkqIHRlc3QvdW5pdC9jcHB1bml0L3Rlc3RfbWFpbi5jcHA6IEFkZCBjb21tYW5kIHVzYWdlIG91dHB1dCB3aGVuCisJb3B0aW9uIGlzIG5vdCByZWNvZ25pc2UuCisKKwkqIGJ1aWxkL2xpYi9jb25maWd1cmU6IFJlbW92ZSBzcGVjaWZpY2F0aW9uIG9mIENPTVBJTEVSX05BTUUgZGVmYXVsdAorCXZhbHVlIGdjYy4gQ09NUElMRVJfTkFNRSBpcyBhbHJlYWR5IHNldCBpbiBhbGwgcm9vdCBtYWtlIHNjcmlwdHMgbGlrZQorCWdjYy5tYWssIGFDQy5tYWssIGRtYy5tYWsgLi4uIERvaW5nIHNvIGZvcmNlcyB1c2VycyB0byBzcGVjaWZ5IHRoZWlyCisJY29tcGlsZXIgZmFtaWx5IHVzaW5nIGNvbmZpZ3VyZSBzY3JpcHQgd2hpY2ggaXMgcmVkdW5kYW50LgorCisyMDA4LTAxLTEwICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3RscG9ydC9zdGwvX3Byb2xvZy5oOiBSZW1vdmUgY29kZSBkdXBsaWNhdGlvbiBieSBpbmNsdWRpbmcKKwlfY3Byb2xvZy5oLgorCisJKiBzdGxwb3J0L2Vycm5vLmgsIGNlcnJubzogTW92ZSBpbXBvcnQgb2YgZXJybm8gZnJvbSBlcnJuby5oIHRvCisJY2Vycm5vLgorCisJKiBzcmMvY3R5cGUuY3BwLCBmYWNldHNfYnluYW1lLmNwcCwgdGltZV9mYWNldHMuY3BwLAorCXRlc3QvdW5pdC9jb2RlY3Z0X3Rlc3QuY3BwOiBTZXZlcmFsIHNtYWxsIG1vZGlmaWNhdGlvbnMgdG8gbWFrZQorCUludGVsIEMrKyBjb21waWxlciBoYXBwaWVyLiBNb3N0bHkgYXZvaWQgd2FybmluZ3MgYW5kIHVzZQorCXVuYXJ5X2Z1bmN0aW9uIHRvIGF2b2lkIHNvbWUgdHlwZWRlZi4KKworMjAwOC0wMS0wOSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHN0bHBvcnQvc3RsL191bmluaXRpYWxpemVkLmg6IEZpeCBpbXBsZW1lbnRhdGlvbiBvZgorCV9fdW5pbml0aWFsaXplZF9jb3B5X2NvcHkgaW4gb3JkZXIgdG8gbWFrZSB0aGUgZnVuY3Rpb24gZXhjZXB0aW9uCisJc2FmZS4gRGV0ZWN0ZWQgdGhhbmtzIHRvIHRoZSBFSCB0ZXN0IHN1aXRlLgorCisyMDA4LTAxLTA4ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3RscG9ydC9zdGwvX2lvc19iYXNlLmg6IF9TX3dhc19zeW5jZWQgcmVuYW1lZCBpbiBfU19pc19zeW5jZWQKKwliZWNhdXNlIGl0IHJlZmxlY3RzIHdoYXQgdGhlIHN5bmMgc3RhdGUgaXMgYW5kIG5vdCB3aGF0IGl0IHdhcy4KKworCSogc3JjL2lvc3RyZWFtLmNwcDogVXNlIGF1dG9fcHRyIHRvIGF2b2lkIHVzZSBvZiB0aGUgY2F0Y2goLi4uKQorCWJsb2Nrcy4gQ2hhbmdlZCBtYW5hZ2VtZW50IG9mIHRoZSBfU1RMUF9SRURJUkVDVF9TVERTVFJFQU1TIG1hY3JvLgorCWNvdXQsIGNlcnIgYW5kIGNsb2cgc3RyZWFtcyBhcmUgbm90IG9mc3RyZWFtIGFueW1vcmUgYnV0IGNsYXNzaWMKKwlvc3RyZWFtIGluc3RhbmNlcywgb25seSBzdHJlYW1idWYgaXMgYSBmaWxlYnVmIHdoZW4gdGhlIG1hY3JvIGlzCisJZGVmaW5lZC4gSW1wcm92ZSBfU19pbml0aWFsaXplIHJvYnVzdG5lc3MgdG8gZXhjZXB0aW9ucywgbm93CisJZXhjZXB0aW9ucyBsaWtlIGJhZF9hbGxvYyBhcmUgbm90IHNpbGVudGx5IGVhdGVuLiBfU19pbml0aWFsaXplCisJZ3VhcmFudHkgdGhhdCBvbiBleGNlcHRpb24sIFN0YW5kYXJkIHN0cmVhbXMgd2lsbCBiZSB2YWxpZCwgaXQgZG8KKwlub3Qgb2ZmZXIgaG93ZXZlciBzdHJvbmcgZ3VhcmFudHksIGdsb2JhbCBzdGF0ZSBtaWdodCBzdGlsbCBoYXZlCisJYmVlbiBtb2RpZmllZC4gSWRlbSBmb3Igc3luY193aXRoX3N0ZGlvLiBNb3Jlb3ZlciB0aGlzIG1ldGhvZCBpcworCW5vdyBTdGFuZGFyZCBjb21wbGlhbnQsIGl0IHJldHVybnMgdGhlIG5ldyBzeW5jIHN0YXRlIGFuZCBub3QgdGhlCisJb2xkIG9uZS4KKworMjAwOC0wMS0wNyAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHNyYy9jX2xvY2FsZV9kdW1teS9jX2xvY2FsZV9kdW1teS5jOiBVcGdyYWRlIHRvIHRha2UgaW50byBhY2NvdW50CisJcmVjZW50IGxvY2FsaXphdGlvbiBBcGkgbW9kaWZpY2F0aW9ucy4KKworMjAwOC0wMS0wNCAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHNyYy9mc3RyZWFtX3dpbjMyLmNwcDogQ2hhbmdlIGRldGVjdGlvbiBvZiByZWd1bGFyIGZpbGUsIG9ubHkgcmVqZWN0CisJaGFuZGxlcnMgaWRlbnRpZmllZCBhcyBmb2xkZXJzLgorCisJKiBzdGxwb3J0L3N0bC9fY29kZWN2dC5oOiBBZGQgYXNzZXJ0aW9uIHRvIGNoZWNrIGJ1ZmZlciByYW5nZXMgcGFzcyB0bworCXRoZSBjb2RlY3Z0IGZhY2V0LgorCisJKiBzcmMvZnN0cmVhbS5jcHAsIHN0bHBvcnQvc3RsL19mc3RyZWFtLmM6IENvbXBsZXRlIGJ1ZyAjMTg1NDM0NSBmaXgsCisJZ2V0IGJ1ZmZlciB3YXMgbm90IHJlc2V0IGF0IHRoZSByaWdodCBwbGFjZS4KKworCSogc3RscG9ydC9zdGwvX2ZzdHJlYW0uaCwgX2ZzdHJlYW0uYzogU2V2ZXJhbCBtb2RpZmljYXRpb25zIGluIHRoZQorCXNlZWtvZmYgbWV0aG9kOgorCS0gUmVtb3ZlIGxpbWl0YXRpb24gb2YgcG9zaXRpb25pbmcgdG8gYmluYXJ5IGZpbGUgc3RyZWFtLCBzZXR0aW5nCisJcG9zaXRpb24gaW4gYSB0ZXh0IGZpbGUgc3RyZWFtIGlzIG5vdCBhIHByb2JsZW0uCisJLSBGaXggbWJzdGF0ZV90IGluc3RhbmNlIHJldHVybmVkIGluIHRoZSBmaWxlX3BvcyBpbnN0YW5jZSB3aGVuCisJZ2V0dGluZyBwb3NpdGlvbiBpbiBhIGZpbGUgc3RyZWFtIHdpdGggdmFyaWFibGUgZW5jb2RpbmcuCisJLSBNb3ZlIGFsbCB0aGUgc2FuaXR5IGNoZWNrIGNvZGUgdG8gdGhlIGRlYnVnIG1vZGUuCisKKzIwMDgtMDEtMDIgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiB0ZXN0L3VuaXQvZnN0cmVhbV90ZXN0LmNwcDogQ2hhbmdlIEZzdHJlYW1UZXN0OjpzZWVrIHRlc3QgdG8gcmV2ZWFsCisJYnVnICMxODU0MzQ1LgorCisJKiBzcmMvZnN0cmVhbS5jcHA6ICMxODU0MzQ1IGJ1ZyBmaXhlZC4KKworMjAwOC0wMS0wMSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHN0bHBvcnQvc3RsL190aW1lX2ZhY2V0cy5oLCBfdGltZV9mYWNldHMuYywgc3JjL3RpbWVfZmFjZXQuY3BwLAorCWNfbG9jYWxlX2dsaWJjL2NfbG9jYWxlX2dsaWJjMi5jOiBSZXN0b3JlIEdsaWJDKysgc3VwcG9ydCBhZnRlcgorCTIwMDctMTItMjcgbW9kaWZpY2F0aW9ucy4KKworMjAwNy0xMi0yOSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIEJvcmxhbmQgcGF0Y2ggZnJvbSBFcmljIFNhbmZvcmQgbWFpbmx5IHRvIGVuYWJsZSBtb3ZlIGNvbnN0cnVjdG9yLgorCisJKiBzdGxwb3J0L3N0bC9fc3RyaW5nX2Jhc2UuaCwgX3N0cmluZy5oLCBfc3RyaW5nLmMsCisJX3N0cmluZ19zdW1fbWV0aG9kcy5oOiBBdHRlbXB0IHRvIG1ha2Ugc3RyaW5nIGltcGxlbWVudGF0aW9uIG1vcmUKKwljbGVhcjogX01fYWxsb2NhdGVkIHJlbmFtZWQgaW4gX01fc3RhcnRfb2Zfc3RvcmFnZSwKKwlfTV9CdWZmZXJzLl9NX2R5bmFtaWNfYnVmZmVyIHJlbmFtZWQgaW4gX01fQnVmZmVycy5fTV9lbmRfb2Zfc3RvcmFnZSwKKwlfTV9lbmRfYmxvY2sgcmVuYW1lZCBpbiBfTV9lbmRfb2Zfc3RvcmFnZSB0b28uIFRvIHJlc3BlY3QgY3VycmVudAorCW5hbWluZyBjb252ZW50aW9uIF9jYXBhY2l0eSBoYXMgYmVlbiByZW5hbWVkIGluIF9NX2NhcGFjaXR5IGFuZAorCV9yZXN0IGluIF9NX3Jlc3QuCisKKwkqIHN0bHBvcnQvc3RsL19zdHJpbmdfd29ya2Fyb3VuZC5oOiBVcGRhdGVkIHRvIHRha2UgaW50byBhY2NvdW50IHJlY2VudAorCW1vZGlmaWNhdGlvbiBpbiBzdHJpbmcgZGF0YSBtb2RlbC4KKwkKKwkqIGV0Yy9hdXRvZXhwLmRhdDogVXBkYXRlZCB0byB0YWtlIGludG8gYWNjb3VudCBzdHJpbmcgZGF0YSBtb2RlbAorCW1vZGlmaWNhdGlvbnMsIG5ldyBtb2RlbCBpcyByZWFsbHkgc2ltcGxlciB0byBtYXAgdG8uCisKKzIwMDctMTItMjcgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzcmMvY19sb2NhbGUuaCwgY19sb2NhbGVfZHVtbXkvY19sb2NhbGVfZHVtbXkuYywKKwljX2xvY2FsZV9nbGliYy9jX2xvY2FsZV9nbGliYy5jLCBjX2xvY2FsZV9nbGliYzIuYywKKwljX2xvY2FsZV93aW4zMi9jX2xvY2FsZV93aW4zMi5jLCBmYWNldHNfYnluYW1lLmNwcCwgdGltZV9mYWNldHMuY3BwLAorCXN0bHBvcnQvc3RsL19jb2RlY3Z0LmgsIF9jdHlwZS5oLCBfbnVtcHVuY3QuaCwgX3RpbWVfZmFjZXRzLmMsCisJX3RpbWVfZmFjZXRzLmg6IE1ham9yIGludGVybmFsIGxvY2FsaXphdGlvbiBBUEkgbW9kaWZpY2F0aW9uLiBBZGQKKwlzZXZlcmFsIF9XTG9jYWxlXyogZnVuY3Rpb25zIHRvIGFsbG93IG5hdGl2ZSBzdXBwb3J0IG9mIGFjY2VzcyB0bworCXdpZGUgY2hhciByZXByZXNlbnRhdGlvbiBvZiBsb2NhbGl6YXRpb24gaW5mb3JtYXRpb24uIFRoZSB0aW1lIGZhY2V0CisJc3VwcG9ydCBoYXMgYmVlbiB0aGUgbW9zdCBpbXBhY3RlZC4gR2xpYkMgYmFzZWQgaW1wbGVtZW50YXRpb24KKwlzdGlsbCBoYXZlIHRvIGJlIHVwZGF0ZWQuCisKKzIwMDctMTItMjMgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBidWlsZC9NYWtlZmlsZXMvbm1ha2UvZXZjOC5tYWssIHRhcmdldHMubWFrLCBzcmMvX3N0ZGlvX2ZpbGUuaCwKKwlmc3RyZWFtX3dpbjMyaW8uY3BwLCBpb3N0cmVhbS5jcHAsIGxvY2FsZV9jYXRhbG9nLmNwcDogUGF0Y2ggZnJvbQorCUpvaGFuIEFuZGVyc29uIGZvciBFdmMgMy80LzggdG86CisJLSBmaXggdGhlIG9wZW5pbmcgY29uc29sZSBpc3N1ZSBvbiB0aGlzIHBsYXRmb3JtLgorCS0gYWRkIEVWQzggU0g0IHN1cHBvcnQuCisKKwkqIHRlc3QvdW5pdDogQWRkIENQUFVOSVRfRkFJTCBtYWNybyB0byBmb3JjZSBmYWlsdXJlIHdpdGhvdXQKKwl1c2luZyBhIGNvbnN0YW50IGNvbmRpdGlvbmFsIGV4cHJlc3Npb24uIE1hbnkgdGVzdHMgdXBkYXRlZCB0bworCXVzZSB0aGlzIG5ldyBtYWNyby4KKworCSogc3RscG9ydC9zdGwvY29uZmlnL19ldmMuaCwgZGVidWcvX2RlYnVnLmgsIF9kZWJ1Zy5jOiBQYXRjaAorCWZyb20gTWljaGFlbCBGaW5rIHRvIGFsbG93IF9TVExQX0RFQlVHIG1vZGUgd2hlbiB1c2luZyBXQ0UgQVJNCisJcGxhdGZvcm0uCisKKzIwMDctMTItMjAgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzdGxwb3J0L3N0bC9fbW9uZXRhcnkuYzogUmVtb3ZlIHRlc3Qgb2YgZXhpc3Rpbmcgc3BhY2UgYXQgZW5kIG9mCisJc3RyZWFtIHdoZW4gbGFzdCBwYXR0ZXJuIGZpZWxkIGlzIG5vbmUgYmVjYXVzZSBvbiBvdXB1dCBzdHJlYW0KKwlzcGFjZSBhcmUgb25seSBhZGRlZCBvcHRpb25hbHkuIFNtYWxsIGNvZGUgZHVwbGljYXRpb24gcmVtb3ZlZC4KKworCSogYnVpbGQvbGliL2NvbmZpZ3VyZS5iYXQsIGV2Yy5tYWssIG1zdmMubWFrLCB0ZXN0L3VuaXQvZXZjLm1haywKKwltc3ZjLm1hazogQ29uZmlnIGZpbGUgbW92ZWQgdG8gTWFrZWZpbGVzL25tYWtlIGZvbGRlci4gQWRkCisJLS13aXRob3V0LXN0bHBvcnQgb3B0aW9uIHRvIGJ1aWxkIHVuaXQgdGVzdHMgd2l0aG91dCBTVExwb3J0LgorCisJKiB0ZXN0L3VuaXQvbW9uZXlfZmFjZXRzX3Rlc3QuY3BwOiBBZGQgdmFsaWRhdGlvbiB0aGF0IG1vbmV5cHVuY3QKKwkiQyIgZmFjZXQgaXMgaWRlbnRpY2FsIHRvIHRoZSBvbmUgY29udGFpbmVkIGluIGxvY2FsZTo6Y2xhc3NpYygpLgorCisJKiBzcmMvY19sb2NhbGVfZHVtbXkvY19sb2NhbGVfZHVtbXkuYywKKwljX2xvY2FsZV93aW4zMi9jX2xvY2FsZV93aW4zMi5jLCBmYWNldHNfYnluYW1lLmNwcDogRml4IHRvIGhhdmUKKwltb25leXB1bmN0IGJ5IG5hbWUgZmFjZXQgYnVpbGQgZnJvbSAiQyIgc2ltaWxhciB0byBsb2NhbGU6OmNsYXNzaWMoKQorCW9uZS4gTm93IGRlZmF1bHQgZm9ybWF0IGluIF9Jbml0X21vbmV0YXJ5X2Zvcm1hdHMgaXMgdGhlIEMrKyBkZWZhdWx0CisJb25lLgorCisyMDA3LTEyLTIwICBQZXRyIE92dGNoZW5rb3YgIDxjb21wbGVtZW50QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogdGVzdC91bml0L2ZzdHJlYW1fdGVzdC5jcHA6IHRlc3QgZm9yIHNlZWssIGluc3BpcmVkIGJ5IFNvcmVuCisJKHN0c29lLCAjMTg1NDM0NSk7IHJlcG9ydCBub3QgY29uZmlybWVkLgorCisyMDA3LTEyLTE3ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3RscG9ydC9zdGwvX2xpbWl0cy5jOiBBZGQgYnJhY2tldHMgb24gdW5pb24gaW5pdGlhbGl6YXRpb24gZm9yIGdjYworCXN0YXJ0aW5nIHdpdGggdmVyc2lvbiA0LgorCisyMDA3LTEyLTE3ICBQZXRyIE92dGNoZW5rb3YgIDxjb21wbGVtZW50QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3RscG9ydC9zdGwvY29uZmlnL19saW51eC5oOiBpZiBub3QgZXhwbGljaXRseSBzcGVjaWZpZWQgYW5vdGhlciwKKwl1c2UgdGhyZWFkcy4KKworMjAwNy0xMi0xNCAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHNyYy9jX2xvY2FsZV93aW4zMi9jX2xvY2FsZV93aW4zMi5jOiBGaXggaW1wbGVtZW50YXRpb24gb2YKKwlfTG9jYWxlX21idG93YyBhbmQgX0xvY2FsZV93Y3RvbWIgZnVuY3Rpb25zLiBSZXZlYWwgbGltaXRhdGlvbiBvZgorCXRoZSBNdWx0aUJ5dGVUb1dpZGVDaGFyIGZ1bmN0aW9uIHRoYXQgY2Fubm90IGJlIHVzZWQgdG8gaW1wbGVtZW50CisJbW9yZSBjb21wbGljYXRlZCBlbmNvZGluZ3MgdGhhdCBoYXZlIGEgcmVhbCBzaGlmdCBzdGF0ZSBsaWtlIHRoZQorCUpJUyBvbmUuIEFkZCBzdXBwb3J0IGZvciBVVEY3IGFuZCBVVEY4IGVuY29kaW5ncy4KKworCSogdGVzdC91bml0L2NvZGVjdnRfdGVzdC5jcHA6IE5ldyB0ZXN0IGNhc2UgdG8gY2hlY2sgc3VwcG9ydCBmb3IKKwkyIGVuY29kaW5ncywgdGhlIFdpbmRvd3Mgc3BlY2lmaWMgY29kZSBwYWdlIDkzNiBhbmQgdGhlIFVURjggb25lLgorCVRob3NlIHRlc3RzIGFyZSBjb21pbmcgZnJvbSBjaGluZXNlIHRlc3Qgc2FtcGxlcyBwcm9wb3NlZCBieSBWaWN0b3IKKwlYaWUuCisKKzIwMDctMTItMTQgIFBldHIgT3Z0Y2hlbmtvdiAgPGNvbXBsZW1lbnRAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzdGxwb3J0L3N0bC9fc3RyaW5nX2Jhc2UuaCwgc3RscG9ydC9zdGwvX3N0cmluZy5oLCBzdGxwb3J0L3N0bC9fc3RyaW5nLmM6CisJZXhwZXJpbWVudGFsIHN0cmluZyBidWZmZXItLS1zdGFydCBvZiBidWZmZXIgaW4gX01fYWxsb2NhdGVkLl9NX2RhdGEgbm93LAorCWVuZCBvZiBidWZmZXIgZWl0aGVyIGVuZCBvZiBsb2NhbCBzaG9ydCBidWZmZXIsIG9yIHN0b3JlZCBpbiBwb2ludGVyCisJd2l0aGluIGxvY2FsIHNob3J0IGJ1ZmZlcjsgdGhpcyBwb3RlbnRpYWxseSByZWR1Y2UgYW1vdW50IG9mIHBvaW50ZXIKKwlhcml0aG1ldGljOyBwcmVmZXIgVHJhaXRzOjphc3NpZ24gdG8gdW5pbml0aWFsaXplZCBmaWxsLCBpdCBtb3JlCisJb3B0aW1pemVkIGZvciBQT0QgdHlwZXMsIHN1Y2ggYXMgY2hhcnMgW2V4cGVyaW1lbnRhbCB0b29dLgorCisyMDA3LTEyLTEzICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3JjL2NfbG9jYWxlLmgsIGNfbG9jYWxlX2R1bW15L2NfbG9jYWxlX2R1bW15LmMsCisJY19sb2NhbGVfZ2xpYmMvY19sb2NhbGVfZ2xpYmMuYywgY19sb2NhbGVfZ2xpYmMyLmMsCisJY19sb2NhbGVfd2luMzIvY19sb2NhbGVfd2luMzIuYzogUmVtb3ZlIHVudXNlZCBfTG9jYWxlX3djdG9iIGFuZAorCV9Mb2NhbGVfYnRvd2MgbG9jYWxpemF0aW9uIEFQSSBmdW5jdGlvbnMuCisKKzIwMDctMTItMTMgIFBldHIgT3Z0Y2hlbmtvdiAgPGNvbXBsZW1lbnRAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBidWlsZC90ZXN0L3VuaXQvZ2NjLm1haywgdGVzdC91bml0Ly4uLjogYWxsb3cgYnVpbGQgdW5pdCB0ZXN0cworCXdpdGggbGlic3RkYysrLCB3aXRob3V0IFNUTHBvcnQ7IHVzZWZ1bCBmb3IgcmVmZXJlbmNlIGFuZCBjb21wYXJpc29uLgorCisyMDA3LTEyLTEyICBQZXRyIE92dGNoZW5rb3YgIDxjb21wbGVtZW50QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogYnVpbGQvTWFrZWZpbGVzL2dtYWtlL3VuaXgvcnVsZXMtaW5zdGFsbC1zby5tYWssIGJ1aWxkL2xpYi9nY2MubWFrOgorCWluc3RhbGwtaGVhZGVycyB1c2FibGU7IGl0IHVzZSB1c2VyLWRlZmluZWQgbWFjcm8gSEVBREVSU19CQVNFCisJW2NhdGFsb2cgYW5kIGFsbCBmaWxlcywga2VlcGluZwlkaXJlY3Rvcnkgc3RydWN0dXJlXSBhbmQgSEVBREVSUworCVtmb3Igc2luZ2xlIGZpbGVzXTsgdGFyZ2V0IGNhdGFsb2cgaXMgSU5TVEFMTF9IRFJfRElSLCBieSBkZWZhdWx0CisJaXQgaXMgJHtCQVNFX0lOU1RBTExfRElSfS9pbmNsdWRlLgorCisyMDA3LTEyLTA3ICBQZXRyIE92dGNoZW5rb3YgIDxjb21wbGVtZW50QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3RscG9ydC9zdGwvX3VuaW5pdGlhbGl6ZWQuaDogY29tbWVudCB1bnVzZWQgcGFyYW1ldGVyOworCisJKiBzdGxwb3J0L3N0bC9fbGltaXRzLmM6IDY0LWJpdHMgc3lzdGVtcyBtYXkgaGFzIFthbmQgcmVhbGx5IGhhc10KKwlzaXplIG9mIGxvbmcgZG91YmxlIDE2LCBub3QgMTI7IGJ1dCBJRUVFIDg1NCBzdGlsbCBpbiBmb3JjZSwgYW5kCisJb25seSAxMCBieXRlcyBvZiBsb25nIGRvdWJsZSB0YWtlbiBpbnRvIGFjY291bnQuIFRoaXMgc2hvdWxkIGZpeAorCWxpbWl0czxsb25nIGRvdWJsZT4gb24gNjQtYml0cyBzeXN0ZW1zLiBUaGFua3Mgam9lYmlzaG9wCisJW2FrYSBEZW5pcyBDaGVyZW1pc292XSBmb3IgZ3JhbnRlZCBhY2Nlc3MgdG8gNjQtYml0IGxpbnV4LgorCisyMDA3LTEyLTA1ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3JjL2NfbG9jYWxlX2dsaWJjL2NfbG9jYWxlX2dsaWJjMi5jOiBGaXggYSBvbmUgYnl0ZSBtZW1vcnkgb3ZlcnJ1bgorCXdoZW4gcGFzc2luZyBhIHZlcnkgbG9jYWxlIG5hbWUuCisKKwkqIHNyYy9jX2xvY2FsZV93aW4zMi9jX2xvY2FsZV93aW4zMi5jOiBTaW1wbGlmaWVkIFdpbjMyIGxvY2FsaXphdGlvbgorCWNvZGUuIFJlbW92ZSB1c2VsZXNzIGNhbGxzIHRvIHN0cmNweS4gUmVtb3ZlIHVzZWxlc3MgY2FsbCB0byB0aGUKKwlfX0V4dHJhY3RfbG9jYWxlX25hbWUgb25jZSBpbiB0aGUgX0xvY2FsZV8qX2NyZWF0ZSBmdW5jdGlvbnMgYXMKKwluYW1lIGhhcyBhbHJlYWR5IGJlZW4gZXh0cmFjdGVkIGF0IHRoaXMgbW9tZW50LgorCisyMDA3LTEyLTA1ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3JjL2NfbG9jYWxlX2dsaWJjL2NfbG9jYWxlX2dsaWJjMi5jOiBSZW1vdmVkIG1hbnkgY2hlY2tzIHVzZWxlc3MKKwlhcyB0aGUgQyBmdW5jdGlvbnMgYXJlIGNhbGxlZCBpbiBhIHdlbGwgZGVmaW5lZCBhbmQgc2FmZSBjb250ZXh0LiBBbHNvCisJcmVtb3ZlIHVzZWxlc3Mgc3RyY3B5IGNhbGxzIHdoZW4gaXQgaXMgc2FmZSB0byByZXR1cm4gdGhlIGludGVybmFsCisJc3RyaW5nLgorCisyMDA3LTEyLTA0ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogQWRkIHRoZSBfTG9jYWxlX2NvZGVjdnQgbG9jYWxpemF0aW9uIGRhdGEgc3RydWN0dXJlIGZvciAyIHB1cnBvc2VzOgorCS0gaW4gdGhlIHdpbjMyIGltcGxlbWVudGF0aW9uIGl0IHNpbXBsaWZ5IF9Mb2NhbGVfY3R5cGUgZGF0YSBzdHJ1Y3R1cmUuCisJLSBpbiB0aGUgZ2xpYmMgaW1wbGVtZW50YXRpb24gaXQgaGVscHMgbWFraW5nIGNsZWFyIHRoYXQgdGhpcworCWltcGxlbWVudGF0aW9uIGRvIG5vdCBzdXBwb3J0IHRoZSBjb2RlY3Z0IGZhY2V0IGZvciB0aGUgbW9tZW50LgorCisyMDA3LTEyLTAzICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3JjL2ZzdHJlYW1fd2luMzJpby5jcHA6IEZpeCBtYW5hZ2VtZW50IG9mIEN0cmwtWiB3aGVuIHJlYWRpbmcKKwl0ZXh0IGZpbGUgc3RyZWFtIHRoYW5rcyBIZWN0b3IgQ2h1IHBhdGNoLgorCisyMDA3LTExLTMwICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3JjL2FjcXVpcmVfcmVsZWFzZS5oLCBmYWNldHNfYnluYW1lLmNwcCwgbG9jYWxlLmNwcCwKKwlsb2NhbGVfaW1wbC5jcHAsIGxvY2FsZV9pbXBsLmgsIG1lc3NhZ2VzLmNwcCwgdGltZV9mYWNldHMuY3BwOgorCUxvY2FsaXphdGlvbiBjb2RlIG1vZGlmaWNhdGlvbiwgbm93IGxvY2FsZSBpbnN0YW5jZXMgd2lsbCBhZG9wdAorCWEgbm9ybWFsaXplZCBuYW1lIHJhdGhlciB0aGFuIHRoZSBuYW1lIHVzZWQgdG8gY3JlYXRlIHRoZW0uIFRoaXMKKwl3YXkgaWRlbnRpY2FsIGxvY2FsZSBpbnN0YW5jZXMgd2lsbCBjb21wYXJlIGVxdWFscyBldmVuIGlmIGNyZWF0ZWQKKwlmcm9tIG5hbWUgYWxpYXNlcyBsaWtlICdmcmVuY2gnIGFuZCAnZnJfRlInLiBNb3Jlb3ZlciBkZWZhdWx0CisJbG9jYWxlIGJ1aWx0IGZyb20gYW4gZW1wdHkgc3RyaW5nIHdvbid0IGhhdmUgYW4gZW1wdHkgbmFtZS4KKworCSogdGVzdC91bml0L2xvY2FsZV90ZXN0LmNwcCwgY3R5cGVfZmFjZXRzX3Rlc3QuY3BwLAorCW1vbmV5X2ZhY2V0c190ZXN0LmNwcCwgbnVtX2ZhY2V0c190ZXN0LmNwcCwgdGltZV9mYWNldHNfdGVzdC5jcHA6CisJRW5oYW5jZSBsb2NhbGl6YXRpb24gdGVzdHMsIGFkZCB0ZXN0IG9mIGRlZmF1bHQgbG9jYWxlIHdoZW4gcG9zc2libGUuCisJQWRkIHRlc3QgZm9yIHRoZSBsb2NhbGUgaW5zdGFuY2VzIGJ1aWx0IGZyb20gYSBtaXggb2YgdGhlCisJbG9jYWxlOjpjbGFzc2ljIGluc3RhbmNlIGFuZCBhIG5hbWVkIGNhdGVnb3J5LgorCQorMjAwNy0xMS0yNyAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHN0bHBvcnQvc3RsL19pb3NfYmFzZS5oLCBfaW9zLmM6IEFkZCBxdWFsaWZpY2F0aW9uIG9uIHRoZSBjYWNoZWQKKwljdHlwZSBhbmQgbnVtcHVuY3QgZmFjZXRzLCB3ZSBjYW4ga2VlcCB0aGVtIGFzIGNvbnN0IHBvaW50ZXJzLgorCU1vcmVvdmVyLCBwcmVmZXIgdG8gdXNlIHRoZSB1c2VfZmFjZXQgZnVuY3Rpb24gcmF0aGVyIHRoYW4gX01fZ2V0X2ZhY2V0CisJdG8gYWNjZXNzIHRob3NlIGluc3RhbmNlcyB0byBhdm9pZCBkaXJlY3QgcmVmZXJlbmNlIHRvIHRoZSBmYWNldDo6aWQKKwlzdGF0aWMgaW5zdGFuY2UuCisKKwkqIFNvbWUgZXZvbHV0aW9uIGluIHRoZSBsb2NhbGl6YXRpb24gY29kZToKKwktIEhpZGUgX0xvY2FsZV9uYW1lX2hpbnQgaW4gaW50ZXJuYWwgaW1wbGVtZW50YXRpb24sIGZhY2V0cyAqX2J5bmFtZQorCWNvbnN0cnVjdG9yIGFyZSBub3cgcmVzcGVjdGluZyB0aGUgQysrIFN0YW5kYXJkIHNpZ25hdHVyZS4KKwktIG51bXB1bmN0IGZhY2V0OiBSZW1vdmUgdW51c2VkIF9NX2dyb3VwaW5nIGZpZWxkLCBtb3ZlIGhhcmQgY29kZWQKKwl2YWx1ZXMgb2YgdGhlICJDIiBmYWNldCBpbiB0aGUgc291cmNlcy4gT25seSB0aGUgbnVtcHVuY3RfYnluYW1lPHdjaGFyX3Q+CisJa2VlcHMgaW50ZXJuYWwgd3N0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0cnVlIGFuZCBmYWxzZSBuYW1lcy4KKwktIHRpbWUgZmFjZXRzOiBVc2UgdGhlIG5vbiB0ZW1wbGF0ZSB0aW1lX2Jhc2UgY2xhc3MgZm9yIGluaXRpYWxpemF0aW9uCisJb2YgdGhlIF9UaW1lX0luZm8gaW5zdGFuY2UsIGl0IGlzIG1vcmUgY29oZXJlbnQgd2l0aCBvdGhlciBmYWNldHMKKwlpbXBsZW1lbnRhdGlvbnMuIE1hbnkgZnVuY3Rpb25zIGxpa2UgX19hY3F1aXJlX3RpbWUgYW5kIF9fcmVsZWFzZV90aW1lCisJYXJlIG5vdyBoaWRkZW4gaW4gdGhlIGxpYnJhcnkuCisKKzIwMDctMTEtMjYgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzdGxwb3J0L3N0bC9jaGFyX3RyYWl0cy5oLCBfc3RkZXhjZXB0X2Jhc2UuYzogQm9ybGFuZCBwYXRjaAorCWZyb20gRXJpYyBTYW5mb3JkLCBhZGQgYSBtaXNzaW5nIGhlYWRlciBhbmQgY2hhbmdlCisJX19OYW1lZF9leGNlcHRpb24gaW1wbGVtZW50YXRpb24gYmVjYXVzZSBvZiBhIEJvcmxhbmQgY29tcGlsZXIKKwlidWcuCisKKwkqIHNyYy9jX2xvY2FsZV93aW4zMi9jX2xvY2FsZV93aW4zMi5jOiBBZGQgTEFOR19JTlZBUklBTlQKKwlkZWZpbml0aW9uIHdoZW4gU0RLIGFyZSBtaXNzaW5nIGl0LgorCisyMDA3LTExLTI0ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3RscG9ydC9zdGwvX21vbmV0YXJ5Lmg6IEFkZCBtaXNzaW5nIGV4cGxpY2l0IGtleXdvcmQgb24KKwltb25leV9nZXQgYW5kIG1vbmV5X3B1dCBjb25zdHJ1Y3RvcnMuCisKKwkqIHN0bHBvcnQvc3RsL19udW1wdW5jdC5oOiBSZW1vdmVkIGZyaWVuZCByZWxhdGlvbiBiZXR3ZWVuCisJbnVtcHVuY3QgYW5kIG51bV9nZXQsIGxvb2tzIGxpa2UgaXQgaXMgdXNlbGVzcyB3aXRoIGN1cnJlbnQKKwlpbXBsZW1lbnRhdGlvbi4KKworCSogc3RscG9ydC9zdGwvY29uZmlnL3N0bF9teWNvbXAuaCwgZmVhdHVyZXMuaCwgX3dhdGNvbS5oLCBfc3VucHJvY2MuaCwKKwlfbXdlcmtzLmgsIF9tc3ZjLmgsIF9pYm0uaCwgX2RlY192bXMuaCwgX2RlYy5oLCBfYXM0MDAuaDogUmVtb3ZlZAorCV9TVExQX05PX0ZSSUVORF9URU1QTEFURVMsIF9TVExQX0ZSSUVORF9URU1QTEFURVMgbWFjcm9zIHVudXNlZAorCXNpbmNlIGZpeCBhYm92ZSByZWdhcmRpbmcgbnVtcHVuY3QvbnVtX2dldCBmcmllbmQgcmVsYXRpb24uCisKKwkqIHRlc3QvdW5pdC9jb2xsYXRlX2ZhY2V0c190ZXN0LmNwcDogRml4ICJDIiBmYWNldCBieSBuYW1lIHRlc3QsCisJU3RhbmRhcmQgZG8gbm90IGRlZmluZSBhbnkgc3BlY2lhbCBiZWhhdmlvciBmb3IgdGhlICJDIiB0cmFuc2Zvcm0KKwltZXRob2Qgc28gdHJhbnNmb3JtZWQgcmVzdWx0IHNob3VsZCBzaW1wbHkgZm9sbG93IHRoZSBub3JtYWwgdHJhbnNmb3JtCisJYmVoYXZpb3IuCisKKwkqIHNyYy9sb2NhbGVfaW1wbC5jcHA6IFJlbW92ZWQgdXNlbGVzcyBob2xlcyBpbiBsb2NhbGUgZmFjZXRzIHRhYmxlLgorCU5vdyB0aGUgdGFibGUgY29udGFpbnMgMjYgbm9uIG51bGwgZW50cmllcyByYXRoZXIgdGhhbiAzOCBlbnRyaWVzIHdpdGgKKwlzb21lIGJlZ2luIG51bGwuCisKKzIwMDctMTEtMjMgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzcmMvbG9jYWxlLmNwcCwgbG9jYWxlX2ltcGwuaCwgbG9jYWxlX2ltcGwuY3BwOiBTb21lIHNtYWxsCisJbW9kaWZpY2F0aW9ucyB0byBsaW1pdCBuZWNlc3NhcnkgZnJpZW5kIGNsYXNzIF9Mb2NhbGVfaW1wbAorCWRlY2xhcmF0aW9uIGluIHNldmVyYWwgZmFjZXQgY2xhc3Nlcy4gIE1vcmVvdmVyLCBudW1fZ2V0LCBudW1fcHV0LAorCW1vbmV5X2dldCwgbW9uZXlfcHV0IGZhY2V0cyB0aGF0IGRvIG5vdCBkZXBlbmQgb24gYW55IG5hbWUgYXJlCisJbm90IGFsbG9jYXRlZCBhbnltb3JlIGluIHRoZSBmdW5jdGlvbnMgcmVzcG9uc2libGUgZm9yIGdlbmVyYXRpbmcKKwlmYWNldHMgZm9yIGEgZ2l2ZW4gY2F0ZWdvcnkuCisKKwkqIHN0bHBvcnQvc3RsL19jb2RlY3Z0LmgsIF9jb2xsYXRlLmgsIF9jdHlwZS5oLCBfbWVzc2FnZXNfZmFjZXRzLmgsCisJX21vbmV0YXJ5LmgsIF9udW1fZ2V0LmgsIF9udW1fcHV0LmgsIF9udW1wdW5jdC5oLCBfdGltZV9mYWNldHMuaDoKKwlSZW1vdmVkIG1hbnkgdXNlbGVzcyBmcmllbmQgY2xhc3MgX0xvY2FsZV9pbXBsIGRlY2xhcmF0aW9ucy4KKworMjAwNy0xMS0yMyAgUGV0ciBPdnRjaGVua292ICA8Y29tcGxlbWVudEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGJ1aWxkL2xpYi9jb25maWd1cmU6IG1ha2UgY29uZmlndXJhdGlvbiBzdWl0YWJsZSBmb3IgaW5zdGFsbGF0aW9uCisJcHJvY2VkdXJlIGFuZCBwYWNrYWdlIGJ1aWxkaW5nLgorCisyMDA3LTExLTIyICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3JjL2NfbG9jYWxlX2R1bW15L2NfbG9jYWxlX2R1bW15LmM6IE5vdyBpbXBsZW1lbnRzIHRoZSAiQyIgbG9jYWxlCisJdG8gcmVzcGVjdCB0aGUgQysrIFN0YW5kYXJkLgorCisJKiB0ZXN0L3VuaXQvY29sbGF0ZV9mYWNldHNfdGVzdC5jcHA6IEZpeCB0ZXN0IGNoZWNraW5nIHRoYXQgY29sbGF0ZQorCWZhY2V0IGJ1aWxkIGZyb20gdGhlICJDIiBuYW1lIGJlaGF2ZSBsaWtlIHRoZSBvbmUgY29taW5nIGZyb20gdGhlCisJbG9jYWxlOjpjbGFzc2ljKCkgbG9jYWxlLgorCisJKiBzcmMvY19sb2NhbGUuaCwgbG9jYWxlLmNwcCwgY19sb2NhbGVfZ2xpYmMvY19sb2NhbGVfZ2xpYmMuYywKKwljX2xvY2FsZV9nbGljMi5jLCBjX2xvY2FsZV93aW4zMi9jX2xvY2FsZV93aW4zMi5jLCBsb2NhbGUuY3BwOiBSZW1vdmVkCisJX0xvY2FsZV9jb21wb3NlX25hbWUgZnJvbSB0aGUgU1RMcG9ydCBpbnRlcm5hbCBsb2NhbGl6YXRpb24gQVBJLgorCUNvbXBvc2l0aW9uIG9mIGxvY2FsZSBuYW1lcyB3aWxsIG5vdyBiZSB0aGUgcmVzcG9uc2liaWxpdHkgb2YgU1RMcG9ydAorCWl0c2VsZiBhbmQgbm90IG9mIHRoZSBwbGF0Zm9ybSBsb2NhbGl6YXRpb24gaW1wbGVtZW50YXRpb25zIG9uZS4KKworMjAwNy0xMS0yMCAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHN0bHBvcnQvc3RsL19pdGVyYXRvcl9iYXNlLmgsIF9wdHJzX3NwZWNpYWxpemUuaDogQXZvaWQgaW5jbHVzaW9uCisJb2YgX3B0cnNfc3BlY2lhbGl6ZS5oIHdoaWxlIHN0aWxsIGluIHN0bHBvcnQgbmFtZXNwYWNlIHNjb3BlIHRoYW5rcworCUNocmlzdG9mIE1lZXJ3YWxkIHJlcG9ydC4KKworMjAwNy0xMS0xNyAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIF9TVExQX1NUQVRJQ19NRU1CRVJfREVDTFNQRUMgd29ya2Fyb3VuZCByZW1vdmVkLiBUaGFua3MgdG8KKwlfR2V0RmFjZXRJZCBvdGhlciB3b3JrYXJvdW5kIGl0IHNob3VsZCBub3cgYmUgdXNlbGVzcy4gVGhlcmUKKwlhcmUgc3RpbGwgc29tZSB0ZXN0cyB0byBjb25maXJtIGVzcGVjaWFsbHkgdGVzdGluZyB0aGUKKwlnY2MgdmlzaWJpbGl0eSBmZWF0dXJlLgorCisyMDA3LTExLTE2ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3RscG9ydC9zdGwvX2ZzdHJlYW0uYzogRml4IGltcGxlbWVudGF0aW9uIG9mCisJYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjpfTV91bmRlcmZsb3dfYXV4KCkgdG8gdGFrZQorCWludG8gY29uc2lkZXJhdGlvbiBhbHJlYWR5IHJlYWQgZXh0ZXJuYWwgYnVmZmVyIGV2ZW4gaWYKKwlyZWFkaW5nIGZyb20gZmlsZSBmYWlsZWQuIFRoYW5rcyBIZWN0b3IgQ2h1IHJlcG9ydCBhbmQgcGF0Y2guCisKKwkqIHRlc3QvdW5pdC9jb2RlY3Z0X3Rlc3QuY3BwOiBOZXcgdGVzdCBmb3IgcHJvYmxlbSBhYm92ZSwKKwlDb2RlY3Z0VGVzdDo6aW1idWVfd2hpbGVfcmVhZGluZyB0aGFua3MgSGVjdG9yIENodS4KKworCSogdGVzdC91bml0L2ZzdHJlYW1fdGVzdC5jcHA6IFJlbW92ZSB1c2VsZXNzCisJRnN0cmVhbVRlc3Q6OnNwZWNpYWxfZW5jb2RpbmcgdGVzdCByZXBsYWNlZCBieSBuZXcgdGVzdCBpbgorCUNvZGVjdnRUZXN0LiBGaXggRnN0cmVhbVRlc3Q6OmN1c3RvbV9mYWNldCB0ZXN0IHRoYXQgaXMgbm93IHVzaW5nCisJYSBzcGVjaWFsaXphdGlvbiBvZiBjb2RlY3Z0IHJhdGhlciB0aGFuIGEgY2xhc3MgaW5oZXJpdGluZyBmcm9tCisJY29kZWN2dC4KKworMjAwNy0xMS0xNCAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHNyYy9jX2xvY2FsZV93aW4zMi9jX2xvY2FsZV93aW4zMi5jOiBGaXggdG8gc3VwcG9ydCBjcmVhdGlvbgorCW9mIGxvY2FsZSBmYWNldCBmcm9tIHRoZSAnQycgbmFtZS4KKworCSogdGVzdC91bml0L2NvbGxhdGVfZmFjZXRzX3Rlc3QuY3BwLCBsb2NhbGVfdGVzdC5jcHAsCisJbW9uZXlfZmFjZXRzX3Rlc3QuY3BwLCBudW1fZmFjZXRzX3Rlc3QuY3BwLCB0aW1lX2ZhY2V0c190ZXN0LmNwcDoKKwlBZGQgdGVzdCB0byBjaGVjayBidWlsZCBmcm9tIG5hbWVzICIiIG9yICJDIiwgb24gcGxhdGZvcm0gd2l0aG91dAorCXJlYWwgbG9jYWxpemF0aW9uIHN1cHBvcnQsICIiIHNob3VsZCByZXN1bHQgaW4gIkMiLiBBbHNvIGNoZWNrCisJZm9yIHNvbWUgZmFjZXRzIHRoYXQgdGhlIG9uZSBidWlsZCBmcm9tICJDIiBuYW1lIGlzIHNpbWlsYXIgdG8KKwl0aGUgb25lIHRha2VuIGZyb20gbG9jYWxlOjpjbGFzc2ljKCkgbG9jYWxlLgorCisyMDA3LTExLTEyICBQZXRyIE92dGNoZW5rb3YgIDxjb21wbGVtZW50QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogdGVzdC91bml0L2ZzdHJlYW1fdGVzdC5jcHA6IHRlc3RjYXNlIGZvciBidWcgIzE4MzA1MTM7CisJX19yZWFkX3VuYnVmZmVyZWQgd3JvbmdseSBwcm9jZXNzIHZhbGlkIHN0cmVhbXNpemUgMDsKKwlbd2FzIGRlcml2ZWQgZnJvbSBvcmlnaW5hbCByZXBvcnQgb2YgQW50b24gU2Ftb2todmFsb3YgYW5kIE9sZWcgT2JvbGVuc2tpeV0KKworCSogc3RscG9ydC9zdGwvX2lzdHJlYW0uYzogZml4IGZvciBidWcgIzE4MzA1MTMgYWJvdmU7CisJY2hlY2sgYm91bmRhcnkgY29uZGl0aW9uIGluIHRoZSBiZWdpbm5pbmcgb2YgbG9vcC4KKworMjAwNy0xMS0wOSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGJ1aWxkL01ha2VmaWxlcy9nbWFrZTogQWRkIG1pc3NpbmcgY3lnbWluZyBmb2xkZXIgY29tbWluZworCWZyb20gdGFzayBicmFuY2gsIHJlcXVpcmVkIGZvciBDeWd3aW4vTWluR1cgYnVpbGRzLgorCisJKiBzdGxwb3J0L3N0bC9fYnZlY3Rvci5oLCBfZGVxdWUuaCwgX2hhc2h0YWJsZS5oLCBfbGlzdC5oLAorCV9yb3BlLmgsIF9zbGlzdC5oLCBfc3RyaW5nX2Jhc2UuaCwgX3RyZWUuaCwgX3ZlY3Rvci5oOiBSZW1vdmVkCisJdXNlbGVzcyBpbnN0YW50aWF0aW9uIG9mIF9BbGxvY190cmFpdHMgdG8gZGVmaW5lIG5lc3RlZAorCWFsbG9jYXRvcl90eXBlIGluIHNldmVyYWwgY29udGFpbmVycy4gU1RMcG9ydCB1c2VycyB3aWxsIHNpbXBseQorCWhhdmUgdG8gY29ycmVjdGx5IGluc3RhbnRpYXRlIGNvbnRhaW5lcnMgd2hlbiB0aGV5IHNwZWNpZnkKKwl0aGUgYWxsb2NhdG9yIHRvIHVzZS4KKworMjAwNy0xMC0zMCAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGV0Yy9hdXRvZXhwLmRhdDogTmV3IGZpbGUgY29udGFpbmluZyBkZXNjcmlwdGlvbiBvZiBTVExwb3J0CisJZGF0YSBzdHJ1Y3R1cmVzIGluIHRoZSBWaXN1YWwgU3R1ZGlvIEMrKyBkZWJ1Z2dlciBsYW5ndWFnZS4KKworMjAwNy0xMC0yMSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIE1lcmdlZCB3aXRoIFNUTFBPUlRfNV8xIHVwIHRvIHJldmlzaW9uIDMyMjkuCisKKzIwMDctMTAtMjAgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBfU1RMUF9OT19NQlNUQVRFX1QgcmVtb3ZlZCwgU1RMcG9ydCBjYW5ub3QgcmVhbGx5IGxpdmUgd2l0aG91dAorCWFueSBtYnN0YXRlX3QgZGVmaW5pdGlvbi4gTW9yZW92ZXIgd2Ugd2VyZSBhbHJlYWR5IGRlZmluaW5nIG91ciBvd24KKwlkZWZpbml0aW9uIHdoZW4gX1NUTFBfTk9fTUJTVEFURV9UIGlzIGRlZmluZWQsIHdlIG5vdyBzaW1wbHkgZ2VuZXJhbGl6ZQorCXRoaXMgYmVoYXZpb3IuIFNvIGRlZmluaXRpb24gb2YgX1NUTFBfTk9fTUJTVEFURV9UIGhhcyBiZWVuIHJlcGxhY2VkCisJd2l0aCBfU1RMUF9OT19OQVRJVkVfTUJTVEFURV9ULgorCisyMDA3LTEwLTE0ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3JjL2JpdHNldC5jcHA6IEFkZCBjb25zdCBxdWFsaWZpZXIgb24gc3RhdGljIGFycmF5cyB1c2VkIGluCisJYml0c2V0IGltcGxlbWVudGF0aW9uLiBUaGFua3MgYSBBbmRyZXkgU2VtYWNoZXYgcmVtYXJrLgorCisyMDA3LTEwLTEyICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3RscG9ydC9zdGwvX2hhc2hfbWFwLmgsIF9oYXNoX3NldC5oLCBfdW5vcmRlcmVkX3NldC5oLAorCV91bm9yZGVyZWRfbWFwLmg6IEJlY2F1c2Ugb2YgdGhlIGhhc2h0YWJsZSBkYXRhIG1vZGVsLCBudW1iZXIKKwlvZiBidWNrZXQgc2hvdWxkIG5vdCBiZSB0byBoaWdoIGNvbXBhcmUgdG8gdGhlIG51bWJlciBvZgorCWVsZW1lbnRzLiBGb3IgdGhpcyByZWFzb24sIGRlZmF1bHQgY29uc3RydWN0b3Igb2YgYWxsIGhhc2gKKwljb250YWluZXJzIGlzIG5vdyBwYXNzaW5nIDAgYXMgdGhlIGluaXRpYWwgc2l6ZSByYXRoZXIgdGhhbiAxMDAuCisKKwkqIHN0bHBvcnQvc3RsL19oYXNodGFibGUuaCwgX2hhc2h0YWJsZS5jOiBGb3IgdGhlIHNhbWUgcmVhc29uIGV4cG9zZWQKKwlhYm92ZSwgdGhlIGhhc2h0YWJsZSBudW1iZXIgb2YgYnVja2V0cyBpcyBkZWNyZWFzZSB3aGVuIHJlbW92aW5nCisJZWxlbWVudHMgZnJvbSB0aGUgY29udGFpbmVyLiBBbGwgaXMgZG9uZSBpbiB0aGUgbmV3bHkgaW50cm9kdWNlCisJX01fcmVkdWNlIG1ldGhvZCB0aGF0IHNob3VsZCBiZSBjYWxsZWQgZWFjaCB0aW1lIGVsZW1lbnRzIGFyZQorCXJlbW92ZWQuCisKKwkqIHRlc3QvdW5pdC91bm9yZGVyZWRfdGVzdC5jcHA6IFR3byBuZXcgdGVzdCBpbiBVbm9yZGVyZWRUZXN0IHRlc3QKKwlmaXh0dXJlLCBiZW5jaG1hcmsxIGFuZCBiZW5jaG1hcmsyLiBUaG9zZSB0ZXN0cyBhcmUgcmF0aGVyLCBhcyBpbmRpY2F0ZWQKKwlieSB0aGVpciBuYW1lLCBiZW5jaCB0byBjb21wYXJlIHBlcmZvcm1hbmNlIG9mIGhhc2hlZCBjb250YWluZXJzLgorCUl0IGNhbiBiZSB1c2VkIHdpdGggdGhlIC1tIHVuaXQgdGVzdCBjb25zb2xlIG9wdGlvbiB0aGF0IGRpc3BsYXkKKwl0aW1pbmcgb2YgdGVzdHMuIEZvciBpbnN0YW5jZSwgdGhhbmtzIHRvIHRoZSByZWR1Y3Rpb24gcG9saWN5IGV4cG9zZWQKKwlhYm92ZSwgYmVuY2htYXJrMSBpcyBydW5uaW5nIDIwIHRpbWVzIGZhc3RlciB3aGlsZSBiZW5jaG1hcmsyIGlzCisJYWxtb3N0IGlkZW50aWNhbC4KKworCSogc3RscG9ydC9zdGwvX2hhc2h0YWJsZS5oOiBDb250YWluZXIgbWlnaHQgbm93IGJlIHJlaGFzaCB3aGVuIHVzZXIKKwltb2RpZmllZCBtYXggbG9hZCBmYWN0b3IgaW4gb3JkZXIgdG8gcmVzcGVjdAorCWxvYWRfZmFjdG9yKCkgPD0gbWF4X2xvYWRfZmFjdG9yKCkgcnVsZS4gaGFzaHRhYmxlOjpyZXNpemUgZml4ZWQsCisJYWNjb3JkaW5nIFNHSSBkb2MgaXQgc2hvdWxkIGJlaGF2ZSBhcyBTdGFuZGFyZCB1bm9yZGVyZWRfKjo6cmVoYXNoIHRoYXQKKwlpcyB0byBzYXkgaXQgZ2l2ZXMgbnVtYmVyIG9mIGJ1Y2tldHMgYW5kIG5vdCBudW1iZXIgb2YgZWxlbWVudHMuCisKKwkqIHN0bHBvcnQvc3RsL19oYXNodGFibGUuYzogRml4IENvZGUgd2FycmlvciB3b3JrYXJvdW5kIHRoYXQgd2FzIG9ubHkKKwlzaG93aW5nIGEgbGltaXRlZCBudW1iZXIgb2YgcHJpbWUgbnVtYmVycy4KKworMjAwNy0xMC0xMCAgUGV0ciBPdnRjaGVua292ICA8Y29tcGxlbWVudEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGJ1aWxkL01ha2VmaWxlczogbWVyZ2UgcjI4ODM6MzIyMyBmcm9tIHRhc2tzL1NUTHBvcnQtTWFrZWZpbGVzOworCXJldmlzaW9uIG9mIGJ1aWxkIHN5c3RlbSwgZnJvbSAnY29tcGxlbWVudCcgcHJvamVjdCwgYWRvcHRlZCBmb3IKKwlTVExwb3J0IHJlcXVpcmVtZW50czsgc3VwcG9ydCBidWlsZCBvZiBzdGF0aWMgbGliIGFuZCBidWlsZCB1bml0CisJdGVzdHMgd2l0aCB0aGlzIGxpYjsgZ21ha2Utc3BlY2lmaWMgZmlsZXMgbW92ZWQgaW50byBnbWFrZSBjYXRhbG9nOworCXRvcC5tYWsgKGdtYWtlLXNwZWNpZmljKSBtb3ZlZCBpbnRvIGdtYWtlIGNhdGFsb2c7IGFkZCBpbmNsdWRlCisJb3B0aW9uIGZvciBib29zdCdzIGhlYWRlcnMsIGlmIFNUTFBfQlVJTERfQk9PU1RfUEFUSCBkZWZpbmVkOworCWNvbmZpZy5tYWsgaGFzIG1ha2UtZGVwZW5kZW50IGZlYXR1cmVzLCBzbyBpdCBtb3ZlZCB0byBnbWFrZSBvcgorCW5tYWtlIGNhdGFsb2c7IHNldHRpbmdzIGZyb20gZ21ha2Uvd2luZG93cy9zeXNpZC5tYWsgc2hvdWxkCisJYmUgcHJlc2VudCBpbiBjb21tb24gZ21ha2Uvc3lzaWQubWFrIGZpbGU7IGdjYyAzLjMgaGFzIGJhZCBvcgorCWFic2VudCBsaWJzdXBjKyssIGF0IGxlYXN0IGluIGRlYmlhbjsgZG9uJ3QgdXNlIC1sc3RscG9ydCwgd2hlbgorCWJ1aWxkIGl0OyByZW1vdmVkIHdpbmRvd3MgcGxhdGZvcm0gc3VwcG9ydCB0aGF0IHVzZWQgdG8gcmVwcmVzZW50CisJdGhlIGVudmlyb25tZW50IGdpdmVuIGJ5IHRoZSBjbWQgc2hlbGwgd2l0aCBNaW5HVyBhZGRpdGlvbmFsIGNvbW1hbmRzCisJaS5lLiBNaW5HVyByZXF1aXJlIG5vdCBvbmx5IGdtYWtlLCBidXQgb3RoZXIgUE9TSVggZmlsZSB1dGlscyB0b287CisJaW5zdGFsbCB0YXJnZXQgYnkgZGVmYXVsdCBpbnN0YWxsIHRvIC91c3IvbG9jYWwvbGliIG9uIFBPU0lYLWxpa2UKKwlwbGF0Zm9ybXM7IGFkZGVkIGRpc3RjbGVhbiB0YXJnZXQ7IGFkZGVkIGluc3RhbGwtaGVhZGVycyB0YXJnZXQ7CisKKwkqIGJ1aWxkL3Rlc3QvdW5pdDogdG9wLm1hayAoZ21ha2Utc3BlY2lmaWMpIG1vdmVkIGludG8gZ21ha2UgY2F0YWxvZzsKKworCSogYnVpbGQvdGVzdC91bml0L2djYy5tYWs6IHNlZSBqdXN0IGJ1aWxkIHN0bHBvcnQgbGlicywgbm90CisJaW5zdGFsbGF0aW9uIHBhdGggW2RlZmF1bHQgaW5zdGFsbCBwYXRoIGlzIC91c3IvbG9jYWwvbGliIG9uIFBPU0lYLWxpa2UKKwlwbGF0Zm9ybXNdLgorCisyMDA3LTEwLTA3ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogNS4xLjQgcmVsZWFzZWQsIHRydW5rIG1lcmdlZCB3aXRoIFNUTFBPUlRfNV8xIGJyYW5jaCB1cCB0bworCXJldmlzaW9uIDMyMjEuCisKKzIwMDctMTAtMDQgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzdGxwb3J0L3N0bC9fY29kZWN2dC5oLCBfZnN0cmVhbS5jLCBzcmMvY29kZWN2dC5jcHA6IEZpeCBub24KKwlTdGFuZGFyZCBjb25mb3JtaXR5IGluIGNvZGVjdnQ6Omxlbmd0aCBhbmQgYXNzb2NpYXRlZAorCWNvZGVjdnQ6OmRvX2xlbmd0aCBtZXRob2RzLiBUaG9zZSBtZXRob2RzIHdhcyB0YWtpbmcgY29uc3QgcmVmZXJlbmNlCisJdG8gbWJzdGF0ZV90IGJ1dCB0aGUgU3RhbmRhcmQgc3BlY2lmeSB0aGF0IGl0IG11c3QgYmUgYSBzaW1wbGUKKwlyZWZlcmVuY2UuCisKKwkqIHNyYy9mYWNldHNfYnluYW1lLmNwcDogQWRkIGEgcmVhbCBpbXBsZW1lbnRhdGlvbiBvZgorCWNvZGVjdnQ8d2NoYXJfdCwgY2hhciwgbWJzdGF0ZV90Pjo6ZG9fbGVuZ3RoIGJhc2VkIG9uIHRoZQorCV9Mb2NhbGVfbWJ0b3djIGxvY2FsZSBBUEkgZnVuY3Rpb24uCisKKwkqIHRlc3QvdW5pdC9jb2RlY3Z0X3Rlc3QuY3BwOiBBZGQgYSB0ZXN0IGZvciBjb2RlY3Z0OjpsZW5ndGguCisKKwkqIHRlc3QvdW5pdC9mc3RyZWFtX3Rlc3QuY3BwOiBBZGQgYSB0ZXN0IHRoYXQgaW5kaXJlY3RseSB0ZXN0CisJY29kZWN2dCBmYWNldCBhbmQgaW50ZWdyYXRpb24gb2YgaXQgaW4gdGhlIGJhc2ljX2ZpbGVidWYKKwlpbXBsZW1lbnRhdGlvbi4KKwkKKzIwMDctMTAtMDIgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiB0ZXN0L3VuaXQvZGVxdWVfdGVzdC5jcHAsIGhhc2hfdGVzdC5jcHAsIGxpc3RfdGVzdC5jcHAsIG1hcF90ZXN0LmNwcCwKKwlzZXRfdGVzdC5jcHAsIHNsaXN0X3Rlc3QuY3BwLCB1bm9yZGVyZWRfdGVzdC5jcHAsIHZlY3Rvcl90ZXN0LmNwcDoKKwlBbGxvdyB0ZXN0IG9uIGluY29tcGxldGUgdHlwZXMgZXZlbiB3aGVuIHBvaW50ZXIgc3BlY2lhbGl6YXRpb24gaXMKKwlhY3RpdmF0ZWQgYXMgbG9uZyBhcyBwYXJ0aWFsIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGlzIHN1cHBvcnRlZC4KKworCSogc3RscG9ydC9zdGwvX2ZzdHJlYW0uYywgc3JjL2ZhY2V0c19ieW5hbWUuY3BwLAorCXRlc3QvdW5pdC9jb2RlY3Z0X3Rlc3QuY3BwOgorCUZpeGVkIGNvZGVjdnRfYnluYW1lPHdjaGFyX3QsIGNoYXIsIG1ic3RhdGVfdD46OmRvX2luIGFuZCBkb19vdXQKKwltZXRob2RzLiBUaGV5IG5vdyBib3RoIGNvcnJlY3RseSB0YWtlIGludG8gYWNjb3VudCB0b19lbmQgcG9pbnRlci4KKwlUaGFua3MgVmlzdG9yIChmaW5hbHZpc3RvcnkpIHJlcG9ydCBvbiBzb3VyY2Vmb3JnZSBEZXZlbG9wZXIgZm9ydW0uCisKKzIwMDctMDktMjggIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzcmMvbnVtX3B1dF9mbG9hdC5jcHA6IE1vZGlmaWNhdGlvbiBpbiBfU3RsX2VjdnRSIGFuZCBfU3RsX2ZjdnRSCisJbG9uZyBkb3VibGUgb3ZlcmxvYWRzLCBpZiB2YWx1ZSBjYW4gYmUgY29udmVydGVkIHRvIGRvdWJsZSB3aXRob3V0CisJcHJlY2lzaW9uIGxvc3Mgd2UgY2FuIHJlbHkgb24gdGhlIGRvdWJsZSBvdmVybG9hZC4gTW9yZW92ZXIgX1N0bF9mY3Z0UgorCWhhcyBiZWVuIGZpeGVkLgorCisJKiBzdGxwb3J0L3N0bC9wb2ludGVyL190b29scy5oOiBVc2UgY2xhc3MgcGFydGlhbCBzcGVjaWFsaXphdGlvbiB0bworCWVuaGFuY2UgdXNhYmlsaXR5IG9mIHRoZSBjb250YWluZXIgcG9pbnRlciBzcGVjaWFsaXphdGlvbiBmZWF0dXJlLgorCVRoYW5rcyB0byBpdCwgY29udGFpbmVyIGNhbiBiZSBpbnN0YW5jaWF0ZWQgd2l0aCBpbmNvbXBsZXRlIHR5cGVzLgorCU1vZGlmaWNhdGlvbiBiYXNlZCBvbiBidWcgcmVwb3J0IDE3OTkwNDggZnJvbSBBbmRyZXkgU2VtYXNoZXYuCisKKwkqIHRydW5rIG1lcmdlZCB3aXRoIFNUTFBPUlRfNV8xIHVwIHRvIHJldmlzaW9uIDMyMTEuCisKKzIwMDctMDktMjcgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzcmM6IE1vZGlmaWNhdGlvbiBpbiB0aGUgaW50ZXJuYWwgbG9jYWxpemF0aW9uIEFQSS4KKwlfTG9jYWxlX2Vycm5vIHJlbW92ZWQsIG5vdyBhbiBpbnQgcG9pbnRlciBpcyBwYXNzZWQgdG8gYWxsCisJX0xvY2FsZV8qX2NyZWF0ZSBhbmQgYWxsIF9Mb2NhbGVfZXh0cmFjdF8qX25hbWUgZnVuY3Rpb25zIHNvCisJdGhhdCB0aGV5IGNhbiByZXR1cm4gYW4gZXJyb3IgY29kZS4gVGhpcyBtZXRob2QgYXZvaWQgbXVsdGl0aHJlYWRlZAorCWlzc3Vlcy4KKworCSogc3JjL2xvY2FsZV9jYXRhbG9nLmNwcDogTW9kaWZpY2F0aW9uIGluIF9fYWNxdWlyZV9jYXRlZ29yeQorCWZ1bmN0aW9uLiBJZiBjcmVhdGVfb2JqIHJldHVybiBudWxsLCB0aGUgbnVsbCBwb2ludGVyIGlzIG5vdAorCXN0b3JlZCBhbnltb3JlIGluIGNhY2hlZCBhcyBjcmVhdGlvbiBmYWlsdXJlIHJlYXNvbiBtaWdodCBiZQorCXRlbXBvcmFyeSBsaWtlIGluIGNhc2Ugb2YgbWVtb3J5IHN0YXJ2YXRpb24uCisKKwkqIHN0bHBvcnQvc3RsL19sb2NhbGUuaDogRXJyb3IgcmVwb3J0aW5nIGVuaGFuY2VtZW50LiBJbiBjb21iaW5lCisJbWV0aG9kIHdlIHVzZSBhIHR5cGVpZCBjYWxsIHRvIHJlcG9ydCB0aGUgdW5rbm93biBmYWNldCB0eXBlLiBJbiBvdGhlcgorCXNpdHVhdGlvbiB3ZSByZXBvcnQgYm90aCB0aGUgZmFjZXQgY2F0ZWdvcnkgYmVpbmcgYnVpbHQgYW5kIHRoZSBuYW1lCisJdXNlZCB0byBidWlsZCBpdC4KKworCSogdGVzdC91bml0L2xvY2FsZV90ZXN0LmNwcCwgY29sbGF0ZV9mYWNldHNfdGVzdC5jcHAsCisJbWVzc2FnZXNfZmFjZXRfdGVzdC5jcHAsIG1vbmV5X2ZhY2V0c190ZXN0LmNwcCwgbnVtX2ZhY2V0c190ZXN0LmNwcCwKKwl0aW1lX2ZhY2V0c190ZXN0LmNwcDogQWRkIGNoZWNrcyBmb3IgY29uc3RydWN0aW9uIG9mIGZhY2V0cyBmcm9tCisJdmVyeSBsb25nIGZhY2V0IG5hbWUuCisKKzIwMDctMDktMjcgIFBldHIgT3Z0Y2hlbmtvdiAgPGNvbXBsZW1lbnRAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiB0ZXN0L3VuaXQvZmluZF90ZXN0LmNwcDogYXJyYXkgaW5pdGlhbGl6YXRpb24gbWlzc2VkLgorCisyMDA3LTA5LTE5ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogdHJ1bmsgbWVyZ2VkIHdpdGggU1RMUE9SVF81XzEgdXAgdG8gcmV2aXNpb24gMzE5My4KKworMjAwNy0wOS0xMSAgUGV0ciBPdnRjaGVua292ICA8Y29tcGxlbWVudEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHN0bHBvcnQvc3RsL19hbGdvYmFzZS5jOiBrZWVwIGNoZWNrIGZvciBzeW1tZXRyeSBpbgorCWxleGljb2dyYXBoaWNhbCBjb21wYXJlLS0tYWxnb3JpdGhtIGFzc3VtZSBzeW1tZXRyeSBjb21wYXJhdG9yOworCXJlbW92ZSBjaGVjayBmb3Igc3ltbWV0cmljYWwgY29tcGFyYXRvciBpbiBzZWFyY2ggYW5kIGZpbmQsCisJZHVlIHRvIGRvdWJsZSBjaGVja3Mgbm90IGJldHRlciB0aGVuIHNpbmdsZSAodGhlIHNhbWUgY2hlY2sKKwlkb25lIGluIGFsZ29yaXRobSwgYW5kIGFsZ29yaXRobSBub3QgcmVxdWlyZSBzeW1tZXRyaWNhbAorCWNvbXBhcmF0b3IpOworCisJKiBzdGxwb3J0L3N0bC9kZWJ1Zy9faGFzaHRhYmxlLmg6IGlkZW07CisKKwkqIHN0bHBvcnQvc3RsL2RlYnVnL190cmVlLmg6IGlkZW07CisKKwkqIHN0bHBvcnQvc3RsL2RlYnVnL19kZWJ1Zy5oOiBfX3N5bWV0cmljYWxfc3RyaWN0X3dlYWtfY2FsbAorCWFuZCBfX3N5bWV0cmljYWxfZXF1YWxfY2FsbCBub3QgdXNlZCBhbnl3YXJlLgorCisyMDA3LTA5LTEwICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3RscG9ydC9zdGwvX2FsZ28uYzogQWRkIGNoZWNrIGZvciBzeW1ldHJpY2FsIGZ1bmN0b3IKKwlpbiBtYXhfZWxlbWVudCBhbmQgbWluX2VsZW1lbnQgYWxnby4KKworCSogc3RscG9ydC9zdGwvX2FsZ29iYXNlLmM6IFJlc3RvcmUgc3ltZXRyaWNhbCBmdW5jdG9yIGNoZWNrcy4KKwlTb21ldGltZXMgc2ltcGx5IGJlY2F1c2UgdGhlIGFsZ28gd2FzIGFscmVhZHkgY29uc2lkZXJpbmcgdGhlCisJZnVuY3RvciBhcyBzeW1ldHJpY2FsIGFzIGluIGxleGljb2dyYXBoaWNhbF9jb21wYXJlLiBTb21ldGltZXMKKwl1c2luZyBzcGVjaWZpYyBoZWxwZXJzIGZ1bmN0aW9ucyAoc2VlIGJlbG93KS4KKworCSogc3RscG9ydC9zdGwvZGVidWcvX2RlYnVnLmg6IEFkZCBfX3N5bWV0cmljYWxfc3RyaWN0X3dlYWtfY2FsbAorCWFuZCBfX3N5bWV0cmljYWxfZXF1YWxfY2FsbCBoZWxwZXIgZnVuY3Rpb25zIHRvIGNoZWNrIGZvcgorCXN5bWV0cmljIGZ1bmN0b3JzIG9ubHkgd2hlbiBpbnZvY2F0aW5nIHRoZSBzeW1ldHJpY2FsIGZ1bmN0b3IKKwlpcyB2YWxpZCB0aGF0IGlzIHRvIHNheSB3aGVuIGJvdGggcGFyYW1ldGVycyBhcmUgb2YgdGhlIHNhbWUKKwl0eXBlLgorCisJKiBzdGxwb3J0L3N0bC9kZWJ1Zy9faGFzaHRhYmxlLmg6IE1ha2UgdXNlIG9mIAorCV9fc3ltZXRyaWNhbF9lcXVhbF9jYWxsIHRvIGNoZWNrIHRoYXQgZXF1aXZhbGVuY2UgZnVuY3RvciB1c2VkCisJaW4gaGFzaHRhYmxlIGluc3RhbmNpYXRpb24gaXMgY29ycmVjdGx5IGltcGxlbWVudGVkLgorCisJKiBzdGxwb3J0L3N0bC9kZWJ1Zy9fdHJlZS5oOiBNYWtlIHVzZSBvZgorCV9fc3ltZXRyaWNhbF9zdHJpY3Rfd2Vha19jYWxsIHRvIGNoZWNrIHRoYXQgZnVuY3RvciBwcmVkaWNhdGUKKwl1c2UgaW4gdHJlZSBpbnN0YW5jaWF0aW9uIGlzIGNvcnJlY3RseSBpbXBsZW1lbnRlZC4KKworMjAwNy0wOS0xMCAgUGV0ciBPdnRjaGVua292ICA8Y29tcGxlbWVudEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHN0bHBvcnQvc3RsL19zdHJpbmcuYzogZml4IGJ1Z3MgaW4gc3RyaW5nIHJmaW5kLCBmaW5kX2xhc3Rfb2YsCisJZmluZF9sYXN0X25vdF9vZiBbYnVnICMxNzg4NzAwLCBwb3NpdGlvbiAwIHdhcyB3cm9uZ2x5IGV4Y2x1ZGVkXTsKKworCSogdGVzdC91bml0L3N0cmluZ190ZXN0LmNwcDogdGVzdCBmb3IgcHJvYmxlbXMgYWJvdmUuIFRoYW5rcworCXRvIEJyZWQgQm9yZWQgZm9yIGJ1ZyByZXBvcnQgYW5kIGluaXRpYWwgdGVzdC4KKworMjAwNy0wOS0wOSAgUGV0ciBPdnRjaGVua292ICA8Y29tcGxlbWVudEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHRlc3QvdW5pdC9yb3BlX3Rlc3QuY3BwLCBzdGxwb3J0L3N0bC9fcm9wZS5oOiB0ZXN0IGZvcgorCWJ1ZyAjMTc4ODYxNSBbYnVnIGR1cmluZyBjb3B5IG9mIHJvcGUncyBpdGVyYXRvcl0gYW5kIGZpeDsKKwlzdWdnZXN0ZWQgYnkgSm9obiBNYWRkb2NrLgorCisyMDA3LTA5LTA3ICBQZXRyIE92dGNoZW5rb3YgIDxjb21wbGVtZW50QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogdGVzdC91bml0L2FsZ190ZXN0LmNwcDogYWRkICNpbmNsdWRlIDxzdHJpbmc+LCByZXF1aXJlZCBmb3IKKwljb21wYXJhdG9yIHN5bW1ldHJ5IHRlc3Q7CisKKwkqIHRlc3QvdW5pdC9zdHJpbmdfdGVzdC5jcHA6IHRlc3QgZm9yIGJ1ZyBpbiBmaW5kX2xhc3Rfb2YsCisJYnVnICMxNzg4NzAwLCBzdWJtaXR0ZWQgYnkgQnJlZCBCb3JlZC4KKworMjAwNy0wOS0wNSAgUGV0ciBPdnRjaGVua292ICA8Y29tcGxlbWVudEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHN0bHBvcnQvc3RsL19hbGdvYmFzZS5jOiBzeW1tZXRyeSBub3QgcmVxdWlyZWQgZm9yCisJY29tcGFyYXRvciBpbiBjYXNlIG9mIHR3byBkaWZmZXJlbnQgc2VxdWVuY2VzIGNvbXBhcmlzb24gb3IKKwlzZWFyY2hpbmc7IHN5bW1ldHJpY2FsIGNvbXBhcmF0b3IganVzdCBtYXkgbm90IGV4aXN0OworCisJKiBzdGxwb3J0L3N0bC9kZWJ1Zy9faGFzaHRhYmxlLmg6IHN5bW1ldHJ5IG5vdCByZXF1aXJlZCBmb3IKKwljb21wYXJhdG9yIGluIGhhc2h0YWJsZSBpbiBjYXNlIG9mIGNvbnRhaW5lcnMgZXh0ZW50aW9uOworCXN5bW1ldHJpY2FsIGNvbXBhcmF0b3IganVzdCBtYXkgbm90IGV4aXN0OworCisJKiB0ZXN0L3VuaXQvYWxnX3Rlc3QuY3BwOiB0ZXN0IGZvciBwcm9ibGVtIGFib3ZlLCB0aGFua3MKKwlPbGVnIE9ib2xlbnNraXkuCisKKzIwMDctMDktMDMgIFBldHIgT3Z0Y2hlbmtvdiAgPGNvbXBsZW1lbnRAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzcmMvZGxsX21haW4uY3BwLCBzdGxwb3J0L3N0bC9kZWJ1Zy9fZGVidWcuYzogcmVtb3ZlZAorCW1hY3JvIF9TVExQX1NUQVRJQ19URU1QTEFURV9EQVRBLCBfX1BVVF9TVEFUSUNfREFUQV9NRU1CRVJTX0hFUkUsCisJX1NUTFBfTk9fU1RBVElDX1RFTVBMQVRFX0RBVEE7IG9ubHkgZmV3IG9sZCBjb21waWxlcnMKKwlyZXF1aXJlIHRoaXMgYW5kIGFyZSBnb29kIGVub3VnaCB0byB3b3JrIHdpdGggU1RMOworCisJKiB0ZXN0L2VoL3Rlc3Rfcm9wZS5jcHAsIHN0bHBvcnQvc3RsL19udW1fZ2V0LmM6IGlkZW07CisKKwkqIHN0bHBvcnQvc3RsL190aW1lX2ZhY2V0cy5jLCBzdGxwb3J0L3N0bC9fY29kZWN2dC5oOiBpZGVtOworCisJKiBzdGxwb3J0L3N0bC9fbW9uZXRhcnkuYywgc3RscG9ydC9zdGwvX251bV9wdXQuYzogaWRlbTsKKworCSogc3RscG9ydC9zdGwvX3JvcGUuYywgc3RscG9ydC9zdGwvX3JvcGUuaDogaWRlbTsKKworCSogc3RscG9ydC9zdGwvY29uZmlnL3VzZXJfY29uZmlnLmg6IGlkZW07CisKKwkqIHN0bHBvcnQvc3RsL2NvbmZpZy9zdGxfbXljb21wLmg6IGlkZW07CisKKwkqIHN0bHBvcnQvc3RsL2NvbmZpZy9fZ2NjLmg6IGlkZW07CisKKwkqIHN0bHBvcnQvc3RsL190aHJlYWRzLmM6IGlkZW0uCisKKzIwMDctMDktMDIgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzdGxwb3J0L3N0bC9fYWxnb2Jhc2UuYzogU21hbGwgb3B0aW1pemF0aW9uLCBhZGQgYW4KKwlpbnRlcm1lZGlhdGUgX19lcSBmdW5jdGlvbiB0byBkZXRlY3Qgd2hlbiBib3RoIGl0ZXJhdG9yIHR5cGVzCisJYXJlIGlkZW50aWNhbHMuIFRoYW5rcyBKaW0gWG9jaGVsbGlzIGlkZWFyLgorCisJKiBzdGxwb3J0L3N0bC9fdGhyZWFkcy5oLCBfdGhyZWFkcy5jOiBGdWxseSBhcHBseSBtb2RpZmljYXRpb24KKwlvZiBfU19uc2VjX3NsZWVwIGltcGxlbWVudGF0aW9uIGZvciBXaW4zMiBwbGF0Zm9ybXMgY29udGFpbmVkCisJaW4gYnVnIHJlcG9ydCAxNzIwNjM1IGZyb20gVGFyYXMgT3ZlcmNodWNrLiBJdCBpcyBhbiBvcHRpbWl6YXRpb24KKwlvZiB0aGUgc3BpbiBsb2NrIG11dGV4IHNwZWNpZmljYWxseSB0YXJnZXR0aW5nIHRoZSBtdWx0aXByb2Nlc3NvcgorCXBsYXRmb3Jtcy4KKworMjAwNy0wOC0yOSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHN0bHBvcnQvc3RsL19hbGdvYmFzZS5jLCBfc3RyaW5nLmM6IFNvbWUgbW9kaWZpY2F0aW9uIGluCisJX19maW5kX2ZpcnN0X29mX2F1eDIgaW1wbGVtZW50YXRpb24gdG8gcmVkdWNlIG51bWJlciBvZiBpdGVyYXRvcgorCWRlcmVmZXJlbmNlbWVudHMuCisKKzIwMDctMDgtMjYgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzdGxwb3J0L3N0bC9jb25maWcvdXNlcl9jb25maWcuaCwgaG9zdC5oOiBNb3ZlZCBhZG1pbmlzdHJhdGl2ZQorCV9TVExQX1VTRV9VTklYX0lPLCBfU1RMUF9VU0VfU1RESU9fSU8sIF9TVExQX1VTRV9XSU4zMl9JTworCW1hY3JvcyB0byBob3N0LmguCisKKwkqIE1lcmdlZCB3aXRoIFNUTFBPUlRfNV8xIGJyYW5jaCB1cCB0byByZXZpc2lvbiAzMTUxLgorCisyMDA3LTA4LTIzICBQZXRyIE92dGNoZW5rb3YgIDxjb21wbGVtZW50QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3RscG9ydC9zdGwvZGVidWcvX3ZlY3Rvci5oOiBvbmx5IHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3JzCisJYWxsb3cgb3BlcmF0aW9ucyAnbGVzcy10aGVuJyBhbmQgZGlzdGFuY2U7IGZvciBiaWRpcmVjdGlvbmFsCisJaXRlcmF0b3JzIHJlbW92ZWQgdXNhZ2Ugb2YgJ2xlc3MtdGhlbicsIGFuZCBmb3Igb3RoZXJzCisJW2xpa2UgZm9yd2FyZCBhbmQgaW5wdXQgaXRlcmF0b3JzXSByZW1vdmVkIGFzIHVzYWdlIG9mICdsZXNzLXRoZW4nCisJYXMgZGlzdGFuY2U7IHRoYW5rcyBPbGVnIE9ib2xlbnNraXkgZm9yIGJ1ZyByZXBvcnQ7CisKKwkqIHRlc3QvdW5pdC9pb2l0ZXJfdGVzdC5jcHA6IHRlc3QgZm9yIHByb2JsZW0gYWJvdmUuCisKKzIwMDctMDgtMTggIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzdGxwb3J0L3N0bC9jb25maWcvaG9zdC5oOiBSZW1vdmVkIF9TVExQX05PX0NZR1dJTiBtYWNybworCXVudXNlZCBzaW5jZSB3ZSBhcmUgdXNpbmcgaW5jbHVkZV9uZXh0LgorCisyMDA3LTA4LTE2ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3RscG9ydC9zdGwvY29uZmlnL19nY2MuaDogQXZvaWQgY29uZmxpY3QgaW4gbGluayBtb2RlbCwgZ2NjCisJdmlzaWJpbGl0eSBmb3IgbWFueSBwbGF0Zm9ybXMgb3IgZGxsaW1wb3J0L2RsbGV4cG9ydCBmb3IKKwlDeWd3aW4vTWluR1cuCisKKwkqIGJ1aWxkL01ha2VmaWxlcy9nbWFrZS9nY2MubWFrOiBMb29rcyBsaWtlIEN5Z3dpbi9NaW5HVyB3b24ndAorCXN1cHBvcnQgdmlzaWJpbGl0eSBmb3IgdGhlIG1vbWVudC4KKworMjAwNy0wOC0xNSAgUGV0ciBPdnRjaGVua292ICA8Y29tcGxlbWVudEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHN0bHBvcnQvc3RsL2NoYXJfdHJhaXRzLmgsIHNyYy9mc3RyZWFtX3VuaXN0ZC5jcHA6IHVzZSA2NC1iaXRzCisJZmlsZSBvcGVyYXRpb25zIGNhbGxzLCBpZiBhdmFpbGFibGUgb24gc3lzdGVtOyBzdHJlYW1vZmYgaXMKKwlhbHdheXMgb2ZmNjRfdCwgaWYgX0xBUkdFRklMRV9TT1VSQ0Ugb3IgX0xBUkdFRklMRTY0X1NPVVJDRQorCWRlZmluZWQsIGkuZS4gaWYgNjQtYml0cyBmaWxlIG9wZXJhdGlvbnMgcHJlc2VudDsKKworCSogc3JjL2ZzdHJlYW1fc3RkaW8uY3BwLCBzcmMvc3RkaW9fc3RyZWFtYnVmLmNwcDogZGl0dG87CisKKwkqIHN0bHBvcnQvc3RsL2NvbmZpZy91c2VyX2NvbmZpZy5oOiBhZGQgX1NUTFBfVVNFX0RFRkFVTFRfRklMRV9PRkZTRVQsCisJZm9yY2UgdXNlIG9mZl90IGZvciBzdHJlYW1vZmYgYW5kIGFwcHJvcHJpYXRlIGZpbGUgb3BlcmF0aW9ucyBjYWxsczsKKwlub3RlLCB0aGF0IHRoaXMgbWF5IGxlYWQgdG8gcHJvYmxlbXMsIGZvciBleGFtcGxlIGlmIF9GSUxFX09GRlNFVF9CSVRTCisJZGVmaW5lZCBhcyA2NCBzb21ld2hlcmUgaW4gdXNlcidzIGNvZGU7CisKKwkqIHRlc3QvdW5pdC9mc3RyZWFtX3Rlc3QuY3BwOiB0ZXN0IDY0IGJpdHMgdHlwZSBmb3IgZmlsZXNpemUgYW5kCisJZmlsZSBvZmZzZXQuCisKKzIwMDctMDgtMTMgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiB0ZXN0L3VuaXQvbWVtb3J5X3Rlc3QuY3BwOiBNU1ZDNiBkbyBub3Qgc3VwcG9ydCB0aGlzIHRlc3QsCisJaWdub3JlZC4KKworCSogc3RscG9ydC9zdGwvX3N0cmluZy5oOiBJbnRlcm5hbCBfU3RyaW5nX3Jlc2VydmVfdCBtb3ZlZCB0bworCXByaXZhdGUgbmFtZXNwYWNlLgorCisJKiBzdGxwb3J0L3N0bC9fYWxnb2Jhc2UuYywgX3N0cmluZy5jLCBjaGFyX3RyYWl0cy5oOiBBZG9wdGlvbiBvZgorCXRoZSBmaW5kX2ZpcnN0X29mIHRyaWNrIGJlbG93IGluIHN0cmluZzo6ZmluZF9maXJzdF9vZiwgZmluZF9sYXN0X29mLAorCWZpbmRfZmlyc3Rfbm90X29mIGFuZCBmaW5kX2xhc3Rfbm90X29mLgorCisyMDA3LTA4LTEyICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3RscG9ydC9zdGwvX2FsZ28uaCwgX2FsZ29iYXNlLmgsIF9hbGdvYmFzZS5jOiBmaW5kX2ZpcnN0X29mCisJYWxnb3JpdGhtIGVuaGFuY2VtZW50IGJhc2VkIG9uIHRoZSBKaW0gWG9jaGVsbGlzIGFuYWx5c2lzIHRoYXQgeW91CisJY2FuIGZpbmQgaGVyZToKKwlodHRwOi8vd3d3LmNvZGVwcm9qZWN0LmNvbS92Y3BwL3N0bC9maW5kX2ZpcnN0X29mLmFzcC4KKworCSogdGVzdC91bml0L2FsZ190ZXN0LmNwcDogQWRkIHNldmVyYWwgdGVzdHMgdG8gY2hhbGxlbmdlIHRoZSBhYm92ZQorCWVuaGFuY2VtZW50LgorCisyMDA3LTA4LTA4ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3RscG9ydC9zdGwvY29uZmlnL2ZlYXR1cmUuaDogUmVtb3ZlZCB1c2VsZXNzIHdvcmthcm91bmQsIHRoZXJlCisJaXMgbm8gbW9yZSBwbGF0Zm9ybSB1c2luZyBXaW4zMiB0aHJlYWRpbmcgQVBJIGFuZCBtaXNzaW5nIGJvb2wKKwl0eXBlLgorCisJKiBzcmMvbnVtX3B1dF9mbG9hdC5jcHAsIG51bV9nZXRfZmxvYXQuY3BwOiBGaXhlcyBmb3IgRE1DLCBETUMgaGFzCisJcmVhbCBsb25nIGRvdWJsZSBzbyBpdCBub3cgdXNlcyBpZWVlODU0X2xvbmdfZG91YmxlIEdsaWJjIHR5cGUuIERNQworCWRvIG5vdCB1c2UgYW55bW9yZSB0aGUgc3ByaW50ZiB3b3JrYXJvdW5kIHRvIHdyaXRlIGZsb2F0aW5nIHBvaW50CisJbnVtYmVycy4KKworCSogc3RscG9ydC9zdGwvX2F1dG9fcHRyLmgsIHRlc3QvdW5pdC9tZW1vcnlfdGVzdC5jcHA6IEZpeCBhdXRvX3B0cgorCWltcGxlbWVudGF0aW9uLCByZW1vdmVkIGEgdXNlbGVzcyBjb25zdF9jYXN0IGFuZCBjaGFuZ2UgYSByZWludGVycHJldF9jYXN0CisJaW4gc3RhdGljX2Nhc3QuIEFkZCBzdXBwb3J0IGZvciBpbnN0YW5jaWF0aW9uIHdpdGggdGhlIHZvbGF0aWxlIHF1YWxpZmllci4KKwlUaGFua3MgVWxyaWNoIEVja2hhcmR0IHJlcG9ydC4KKworMjAwNy0wOC0wMyAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHNyYy9jX2xvY2FsZV93aW4zMi9jX2xvY2FsZV93aW4zMi5jOiBGaXggc29tZSBzdGF0aWMgYnVmZmVyIHNpemUKKwl0byBhbHdheXMgaGF2ZSBhIGZyZWUgcGxhY2UgZm9yIHRoZSB0cmFpbGluZyB6ZXJvLgorCisJKiB0ZXN0L3VuaXQvbG9jYWxlX3Rlc3QuY3BwOiBBZGQgYSB0ZXN0IHdoZW4gcGFzc2luZyBhIHZlcnkgbG9uZyBuYW1lCisJYXMgdGhlIExDX0NUWVBFIGZhY2V0IG5hbWUgdG8gdGhlIGxvY2FsZSBjb25zdHJ1Y3Rvci4KKworCSogc3JjL3N5c3RlbV9hcGkuaCwgc3lzdGVtX2FwaS5jLCBidWlsZC9saWIvTWFrZWZpbGUuaW5jLAorCXNyYy9udW1fcHV0X2Zsb2F0LmNwcDogUmVtb3ZlZCBzeXN0ZW1fYXBpIHdvcmthcm91bmQgdG8gYWNjZXNzCisJaXNpbmZpbml0ZSwgaXNuYW4sIGlzaW5mIEMgZnVuY3Rpb25zIHVzZWQgd2l0aCBnY2MgdW5kZXIgSHAgdW5peC4KKwlOb3cgX19mb3JtYXRfbmFuX29yX2luZiBoYXMgYW4gaW1wbGVtZW50YXRpb24gZW50aXJlbHkgYmFzZWQgb24KKwludW1lcmljX2xpbWl0cyB2YWx1ZXMgdGhhdCBhdm9pZHMgYWNjZXNzIHRvIHBsYXRmb3JtIGZ1bmN0aW9ucy4KKworMjAwNy0wNy0zMCAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHN0bHBvcnQvc3RsL19mYWNldHNfZndkLmgsIF9udW1fcHV0LmgsIF9udW1fZ2V0LmgsIF9tb25ldGFyeS5oLAorCV90aW1lX2ZhY2V0cy5oLCBfbG9jYWxlLmg6IEZpeCBfR2V0RmFjZXRJZCB3b3JrYXJvdW5kIGZvciBjb21waWxlcnMKKwlsaWtlIGdjYyBzaW5jZSAzLjQgdGhhdCBjb25zaWRlciBvbmx5IHRoZSBjb250ZXh0IGF0IHBvaW50IG9uIHRlbXBsYXRlCisJZGVmaW5pdGlvbiBhbmQgbm90IGF0IHRoZSBwb2ludCBvZiBpbnN0YW50aWF0aW9uIHdoZW4gcmVzb2x2aW5nCisJX0dldEZhY2V0SWQgY2FsbHMgaW4gaGFzX2ZhY2V0IG9yIHVzZV9mYWNldHMgdGVtcGxhdGUgZnVuY3Rpb25zLgorCisyMDA3LTA3LTIwICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3RscG9ydC9zdGwvX21ic3RhdGVfdC5oOiBXZSBoYXZlIHRvIGRlZmluZSBtYnN0YXRlX3Qgb3Vyc2VsZgorCW9uIHBsYXRmb3JtcyBoYXZpbmcgbWJzdGF0ZV90IGluIGN3Y2hhciB3aGVuIHdlIHdhbnQgdG8gb25seSB1c2UKKwlDIGhlYWRlcnMuCisKKzIwMDctMDctMjIgIFBldHIgT3Z0Y2hlbmtvdiAgPGNvbXBsZW1lbnRAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzcmMvZnN0cmVhbV91bmlzdGQuY3BwOiBmb3JjZSB1c2UgbHNlZWs2NC9tbWFwNjQgZm9yIEhQLVVYLAorCWlmIF9MQVJHRUZJTEU2NF9TT1VSQ0UgZGVmaW5lZDsgdGhhbmtzIGZvciBNaWNoYWVsIEtsZWluLgorCisyMDA3LTA3LTIwICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3RscG9ydC9zdGwvY29uZmlnL19nY2MuaCwgc3RsX215Y29tcC5oOiBSZW1vdmVkIHVudXNlZAorCV9TVExQX1dFQUtfQVRUUklCVVRFIG1hY3JvLgorCisJKiBzdGxwb3J0L3N0bC9jb25maWcvX21zdmMuaCwgX2ludGVsLmgsIF9nY2MuaCwgZmVhdHVyZXMuaDogU29tZQorCWNsZWFudXAgY29uY2VybmluZyBfU1RMUF9TVEFUSUNfVEVNUExBVEVfREFUQSBtYWNyby4KKworMjAwNy0wNy0xOCAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHN0bHBvcnQvc3RsL19udW1fcHV0Lmg6IFJlbW92ZWQgX19zdHJpbmdfdG9fZmxvYXQgZGVjbGFyYXRpb25zIG9ubHkKKwl1c2VkIGluIGEgbnVtX2dldCBjb250ZXh0LgorCisJKiBzcmMvbnVtX2dldF9mbG9hdC5jcHA6CisJLSBJbXBvcnQgR2xpYmMgaWVlZTg1NF9sb25nX2RvdWJsZSB1bmlvbiBmb3IgY29tcGlsZXJzIGhhdmluZyBhIHJlYWwKKwlsb25nIGRvdWJsZSB0eXBlIGJ1dCBubyBydW50aW1lIHN1cHBvcnQgdG8gY29ycmVjdGx5IGdlbmVyYXRlIGl0LiBUaGlzCisJdW5pb24gaXMgdXNlZCBieSBnY2MgdW5kZXIgQ3lnd2luIGFuZCBNaW5HVyBhbmQgYnkgQm9ybGFuZCBjb21waWxlci4KKwktIF9TdGxfc3RyaW5nX3RvX2xvbmdfZG91YmxlIHJlbW92ZWQsIGl0IHdhcyBzbyBzaW1pbGFyIHRvCisJX1N0bF9zdHJpbmdfdG9fZG91YmxlIHRoYXQgZXZlcnl0aGluZyBpcyBkb25lIHdpdGggdGhpcyBmdW5jdGlvbiBub3cuCisJLSBSZW1vdmVkIGNoZWNrIG9uIGV4cG9uZW50IHZhbHVlIHdoaWxlIHBhcnNpbmcgaXQgZnJvbSBidWZmZXIsIGNoZWNrIGlzCisJb25seSBkb25lIHdoZW4gY29tYmluaW5nIHRoaXMgdmFsdWUgd2l0aCB0aGUgZGlnaXRzIHJlYWQuCisKKwkqIHNyYy9udW1fZ2V0X2Zsb2F0LmNwcDoKKwktIEdlbmVyYWxpemUgc3luY2hyb25pemF0aW9uIGNvZGUgYXJyb3VuZCB0aGUgZWN2dC9mY3Z0IGZ1bmN0aW9ucyB3aGVuCisJdGhlIHBsYXRmb3JtIGRvIG5vdCBncmFudCByZWVudHJhbnQgZnVuY3Rpb25zLgorCS0gSW4gX19mb3JtYXRfZmxvYXRfc2NpZW50aWZpYywgcmVtb3ZlZCB1c2VsZXNzIHJ6IHRlbXBvcmFyeSB2YXJpYWJsZSwgcmVtb3ZlZAorCWxpbWl0YXRpb24gaW4gdGhlIG51bWJlciBvZiBhcHBlbmRlZCB0cmFpbGluZyB6ZXJvcy4KKwktIEluIF9fZm9ybWF0X2Zsb2F0X2ZpeGVkLCByZW1vdmVkIGxpbWl0YXRpb24gb2YgbnVtYmVyIG9mIHRyYWlsaW5nIHplcm9zCisJYWRkZWQgYWZ0ZXIgZGVjaW1hbCBwb2ludCwgaXQgaXMgb25seSBsaW1pdGVkIGJ5IHByZWNpc2lvbi4KKwktIF9fZm9ybWF0X2Zsb2F0OiBDb2RlIHRvIGRldGVjdCBpbmZpbml0eSBvciBOYU4gaGFzIGJlZW4gbW92ZWQgYmVmb3JlIGNhbGwKKwl0byBwbGF0Zm9ybSBzcGVjaWZpYyBlY3Z0L2ZjdnQgZnVuY3Rpb25zLiBUaGFua3MgdG8gdGhpcyBtb2RpZmljYXRpb24sIHRoaXMKKwlmdW5jdGlvbiBpcyBub3QgdGVtcGxhdGUgYW55bW9yZS4KKwktIEFkZCBfU3RsX2VjdnQvX1N0bF9mY3Z0IGVtdWxhdGlvbiBmdW5jdGlvbnMgd2hlbiBwbGF0Zm9ybSBkbyBub3QgZ3JhbnQKKwl0aGUgbmVjZXNzYXJ5IGVjdnQvZmN2dCBmdW5jdGlvbnMgZm9yIGxvbmcgZG91YmxlLiBFbXVsYXRpb24gaXMgYmFzZWQgb24KKwlzcHJpbnRmIGZ1bmN0aW9uIHVzaW5nICdMJyBtb2RpZmllci4KKwktIEluIF9fd3JpdGVfZmxvYXRUIGZ1bmN0aW9uLCBmaXggc2l6ZSBvZiBzdGF0aWMgYnVmZmVyIHVzZWQgYnkgX1N0bF9lY3Z0L2ZjdnQKKwlmdW5jdGlvbnMuIEZpeCBudW1iZXIgb2YgZGlnaXRzIGluIGNhbGxzIHRvIF9TdGxfZmN2dC9lY3Z0IGluIGJvdGggbW9kZXMsCisJZml4ZWQgb3Igc2NpZW50aWZpYy4KKworCSogdGVzdC91bml0L251bV9wdXRfZ2V0X3Rlc3QuY3BwOiBBZGQgc29tZSB0ZXN0cywgc29tZXMgd2l0aCBhIHJlYWxseSBoaWdoCisJcHJlY2lzaW9uIHRoYXQgc2hvdyBwcm9ibGVtIHdpdGggc3RhdGljIGJ1ZmZlciBzaXplLgorCisyMDA3LTA3LTE3ICBQZXRyIE92dGNoZW5rb3YgIDxjb21wbGVtZW50QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3RscG9ydC9zdGwvX2FsZ28uYywgc3RscG9ydC9zdGwvX2FsZ29iYXNlLmM6IHNlYXJjaCwgdGhlIF9fdG1wIGFuZAorCV9fcDEgaXRlcmF0b3JzIGFsd2F5cyBwb2ludCBhdCB0aGUgc2FtZSBwb3NpdGlvbiwgaGVuY2Ugb25lIG9mIHRoZW0KKwlpcyByZWR1bmRhbnQ7CisKKwkqIHN0bHBvcnQvc3RsL19hbGdvYmFzZS5jOiBpbiB0aGUgbWFpbi1sb29wIG9mIHNlYXJjaCB0aGVyZSBhcmUgdHdvCisJc3VjY2Vzc2l2ZSB3aGlsZS1sb29wcyBkb2luZyBleGFjdGx5IHRoZSBzYW1lIHRoaW5nOyBvbmUgb2YgdGhlbSBpcworCXJlZHVuZGFudCBhbmQsIHNpbmNlIGl0IGlzIGluc2lkZSB0aGUgbWFpbi1sb29wLCBpdCBzbG93cyBkb3duCisJdGhlIGFsZ29yaXRobSBzaWduaWZpY2FudGx5OworCisJKiBzdGxwb3J0L3N0bC9fYWxnby5jLCBzdGxwb3J0L3N0bC9fYWxnb2Jhc2UuYzogaW4gdGhlIHNlYXJjaCB0aGUgbWFpbi1sb29wIAorCWNvbmRpdGlvbiAid2hpbGUgKF9fZmlyc3QxICE9IF9fbGFzdDEpIiBpcyBhbHdheXMgdHJ1ZSBhbmQgY29uc2VxdWVudGx5CisJcmVkdW5kYW50OyB0aGlzIGlzIGJlY2F1c2UgdGhlIGluaXRpYWwgYWRuIGluLWxvb3AgY29uZGl0aW9ucyB2aXJ0dWFsbHkKKwlhY3QgYXMgZ3VhcmRzIGFuZCB3aWxsIG5ldmVyIGxldCB0aGUgbWFpbi1sb29wIGNvbmRpdGlvbiB0byBmYWlsOyBzaW5jZQorCXRoaXMgY29uZGl0aW9uIGlzIGV2YWx1YXRlZCBpbiBldmVyeSBtYWluLWxvb3AgaXRlcmF0aW9uLCBpdHMgcmVtb3ZhbAorCXdpbGwgYWxzbyBpbXByb3ZlIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgYWxnb3JpdGhtOyB0aGFua3MgZm9yCisJSmltIFhvY2hlbGxpcyBmb3IgdGhpcyBzdWdnZXN0aW9ucy4KKworMjAwNy0wNy0xNSAgUGV0ciBPdnRjaGVua292ICA8Y29tcGxlbWVudEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHNyYy9zdHJzdHJlYW0uY3BwOiAiZ2V0IGVuZCIgcG9pbnRlciBzaG91bGQgYmUgaW5pdGlhbGl6ZWQKKwl0byB0aGUgImJlZ2luIG9mIGdldCArIE4iIGluIG9ic29sZXRlIHN0cnN0cmVhbTsgYnVnICMxNTM2NTAzLAorCXRoYW5rcyBmb3IgSmVhbi1FcmljIEN1ZW5kZXQ7CisKKwkqIHRlc3QvdW5pdC9zdHJzdHJlYW1fYnVmZmVyX3JlYWRfdGVzdC5jcHAsIGJ1aWxkL3Rlc3QvdW5pdC9NYWtlZmlsZS5pbmM6CisJdGVzdCBmb3IgYnVnIGFib3ZlOyBbc3VibWl0dGVkIGJ5IEplYW4tRXJpYyBDdWVuZGV0XS4KKworMjAwNy0wNy0wNSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGJ1aWxkL01ha2VmaWxlcy9ubWFrZS92YzgubWFrOiBSZW1vdmVkIF9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURQorCXdoZW4gYnVpbGRpbmcgU1RMcG9ydC4gTm90IHNlY3VyZWQgdmVyc2lvbiBvZiBmdW5jdGlvbnMgX2VjdnQgYW5kCisJX2ZjdnQgZnVuY3Rpb25zIHVzZWQgZm9yIGZsb2F0aW5nIHBvaW50IG51bWJlcnMgb3V0cHV0IGFyZSBub3QKKwlyZWVudHJhbnQuCisKKzIwMDctMDctMDQgIFBldHIgT3Z0Y2hlbmtvdiAgPGNvbXBsZW1lbnRAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzcmMvbnVtX2dldF9mbG9hdC5jcHA6IHJlb3JkZXIgY29kZSwgb25lIGNvbmRpdGlvbiBnbyBhd2F5LgorCisyMDA3LTA3LTAzICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3JjL251bV9wdXRfZmxvYXQuY3BwOiBfU3RsX2VjdnRSLCBfU3RsX2ZjdnRSLCBfU3RsX3FlY3Z0UiwKKwlfU3RsX3FmY3Z0UiBmdW5jdGlvbnMsIHBhc3MgYnVmZmVyIHNpemUgYXMgYSBwYXJhbWV0ZXIgd2hlbiB0aGUKKwlwbGF0Zm9ybSBmdW5jdGlvbnMgbmVlZCBpdCByYXRoZXIgdGhhbiBkdXBsaWNhdGluZyB0aGUgc2l6ZQorCWRlZmluaXRpb24uIFRoaXMgbW9kaWZpY2F0aW9uIGhhcyBiZWVuIGFwcGxpZWQgdG8gdGhlIERFQ0MgcGxhdGZvcm1zCisJYW5kIHdoZW4gdGhlIEdMaWJDIGlzIGluIHVzZS4KKwlSZW1vdmVkIHVzZWxlc3MgaXNsb25nIF9fZm9ybWF0X2Zsb2F0X3NjaWVudGlmaWMgcGFyYW1ldGVyLiBSZW1vdmVkCisJdXNlbGVzcyB4IF9fZm9ybWF0X2Zsb2F0X2ZpeGVkIHBhcmFtZXRlciwgaXNsb25nIHBhcmFtZXRlcgorCXJlcGxhY2VkIHdpdGggZGlyZWN0IHNwZWNpZmljYXRpb24gb2YgdGhlIG1heGZzaWcgdmFsdWUuCisJSW4gX19mb3JtYXRfZmxvYXQgZnVuY3Rpb24sIGZpcnN0IGF0dGVtcHQgaW4gZGV0ZWN0aW9uIG9mIE5hTiBvcgorCWluZmluaXR5IGlzIGRvbmUgdGhhbmtzIHRvIHRoZSBzdGQ6Om51bWVyaWNfbGltaXRzIGFuZCBjb21waWxlcgorCXN1cHBvcnQsIF9TdGxfaXNfbmFuX29yX2luZiBkbyBub3QgY29ycmVjdGx5IGhhbmRsZWQgbG9uZyBkb3VibGUKKwl2YWx1ZXMuIGxvbmcgZG91YmxlIHZhbHVlcyBsYXJnZXIgdGhhbiBtYXggZG91YmxlIHZhbHVlcyB3ZXJlIGFsd2F5cworCWRpc3BsYXllZCBhcyBJbmYuCisKKwkqIHNyYy9udW1fZ2V0X2Zsb2F0LmNwcDogUmVtb3ZlZCB1c2VsZXNzIG51bGwgYnVmZmVyIGNoZWNrcyBpbgorCV9TdGxfYXRvZCBmdW5jdGlvbnMsIHdlIGtub3cgaG93IHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLiBSZXBsYWNlZAorCXNvbWUgaGFyZCBjb2RlZCBjb25zdGFudCB3aXRoIG51bWVyaWNfbGltaXRzIHZhbHVlcy4gQWRkIGNoZWNrIHRoYXQKKwl0aGVyZSBpcyBsZXNzIHRoYW4gNjQgZGlnaXRzIGJlZm9yZSBoaWRpbmcgaGlkZGVuIGJpdHMgaW4gdnYuaTY0LCBmb3IKKwlsb25nIGRvdWJsZSBpdCB3YXMgZ2VuZXJhdGluZyB3cm9uZyBsb25nIGRvdWJsZSB2YWx1ZS4KKworCSogdGVzdC91bml0L251bV9wdXRfZ2V0X3Rlc3QuY3BwOiBBZGQgbnVtZXJvdXMgdGVzdHMgdG8gY2hlY2sgYm90aAorCWxvbmcgZG91YmxlIGlucHV0IGFuZCBvdXRwdXQuCisKKzIwMDctMDYtMjkgIFBldHIgT3Z0Y2hlbmtvdiAgPGNvbXBsZW1lbnRAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzdGxwb3J0L21lbW9yeTogbW9yZSBmb3J3YXJkIGRlY2xhcmF0aW9uczsgZml4IHR5cG87CisKKwkqIHN0bHBvcnQvZnVuY3Rpb25hbDogbW9yZSB0cmlja3MgdG8gY29tcGlsZSB3aXRoIGJvb3N0CisJYW5kIHRyMTsKKworCSogdGVzdC91bml0L2Jvb3N0X2NoZWNrLmNwcDogcHJvYmxlbXMgdHJhY2U7IHNldCAxIGluCisJYXBwcm9wcmlhdGUgcGxhY2VzIHRvIGNoZWNrIHByZXNlbmNlIG9mIHByb2JsZW0sIGJ1dCBvbmx5CisJdXNlIG9uZSBjYXNlIGF0IGEgdGltZS4KKworMjAwNy0wNi0yOCAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHNyYy9sb2NhbGUuY3BwLCBsb2NhbGVfaW1wbC5oLCBzdGxwb3J0L3N0bC9fbG9jYWxlLmgsCisJY29uZmlnL2ZlYXR1cmVzLmg6IFJ1bnRpbWUgY2hlY2sgc3lzdGVtIGRvIG5vdCBmdWxseSB1c2UgdGhlCisJTVNWQzYgd29ya2Fyb3VuZCBhbnltb3JlLCBpdCBvbmx5IHVzZSB0aGUgbG9jYWxlIHdvcmthcm91bmQsCisJbm90IHRoZSBiYXNpY19zdHJpbmcgb25lLgorCisJKiBzcmMvc3RyaW5nLmNwcDogRml4IHdyb25nIGV4cGxpY2l0IGluc3RhbmNpYXRpb24uCisKKwkqIHRlc3QvdW5pdC9jcHB1bml0L2NwcHVuaXRfbWluaS5oLCBmaWxlX3JlcG9ydGVyLmg6IEZpeCAKKwljb21wdXRhdGlvbiBvZiB0ZXN0IGZhaWx1cmUgd2hlbiBib3RoIENQUFVOSVRfQ0hFQ0sgYW5kCisJQ1BQVU5JVF9BU1NFUlQgYXJlIHVzZWQuCisKKzIwMDctMDYtMjggIFBldHIgT3Z0Y2hlbmtvdiAgPGNvbXBsZW1lbnRAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzdGxwb3J0L3N0bC9ib29zdF90eXBlX3RyYWl0cy5oOiByZXJlYWQgYm9vc3QvY29uZmlnLmgKKwl0byBmb3JjZSB1c2FnZSBvZiBzdGxwb3J0IGluIGJvb3N0IGFuZCBmb3JjZSByZWFkIGVzc2VudGlhbAorCW1hY3JvcyBmcm9tIGJvb3N0L2NvbmZpZy9zdWZmaXguaHBwOyB0aGlzIGlzIGJlY2F1c2UgYm9vc3QKKwlpbmNsdWRlZCB3aXRoaW4gc3RscG9ydCBmcm9tIG9uZSBzaWRlLCBhbmQgc3RscG9ydCBpbmNsdWRlZAorCXdpdGhpbiBib29zdCBmcm9tIGFub3RoZXIgc2lkZTsgdGhpcyBtYWtlIHNlbnNlIHdpdGgKKwlfU1RMUF9VU0VfQk9PU1RfU1VQUE9SVCBkZWZpbmVkIGluIHVzZXJfY29uZmlnLmg7CisJY2hlY2tlZCBmb3IgYm9vc3QgMS4zNDsKKworCSogdGVzdC91bml0L2Jvb3N0X2NoZWNrLmNwcCwgYnVpbGQvdGVzdC91bml0L01ha2VmaWxlLmluYzoKKwl0ZXN0IGZvciBwcm9ibGVtIGFib3ZlOyB0aGlzIHNpbXVsYXRlIHByb2JsZW0gd2hlbiBib29zdCdzCisJaGVhZGVyIHdhcyBpbmNsdWRlZCBiZWZvcmUgYW55IHN0bHBvcnQncyBvbmU7CisKKwkqIHN0bHBvcnQvc3RsL2NvbmZpZy9mZWF0dXJlcy5oOiByZW1vdmUgZGVmaW5pdGlvbiBvZgorCUJPT1NUX1NURExJQl9DT05GSUcsIGR1ZSB0byBpdCB1bmNvbmRpdGlvbmFsbHkgZGVmaW5lZAorCWluIGJvb3N0LgorCisJKiBzdGxwb3J0L21lbW9yeTogZm9yd2FyZCBkZWNsYXJhdGlvbnMgZm9yIGJvb3N0IHJlcXVpcmVkLAorCWJ5IHRoZSBzYW1lIHJlYXNvbnMgYXMgZGVzY3JpYmVkIGFib3ZlLgorCisyMDA3LTA2LTI0ICBQZXRyIE92dGNoZW5rb3YgIDxjb21wbGVtZW50QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3RscG9ydC9zdGwvX2Z1bmN0aW9uLmgsIHN0bHBvcnQvZnVuY3Rpb25hbDogZml4IGltcG9ydAorCW9mIGJvb3N0OjpzaGFyZWRfcHRyLS0tbW92ZWQgZnJvbSBfZnVuY3Rpb24uaCB0byBmdW5jdGlvbmFsOworCWltcG9ydCBtZW1fZm4sIGJpbmQsIGJhZF9mdW5jdGlvbl9jYWxsLCBmdW5jdGlvbiwgc3dhcCBmcm9tCisJYm9vc3QgdG8gc3RkOjp0cjEuCisKKzIwMDctMDYtMjMgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzdGxwb3J0L3N0bC9fc3RyaW5nLmgsIF9zdHJpbmdfd29ya2Fyb3VuZC5oOiBTb21lIGZpeCBmb3IgZ2NjCisJdGhhdCBpcyBub3cgZXhwb3NlIHRvIHRoZSBWQzYgd29ya2Fyb3VuZCBiZWNhdXNlIG9mIHRoZSBydW50aW1lCisJY2hlY2sgbWVjaGFuaXNtIHVuZGVyIE1pbkdXLgorCisyMDA3LTA2LTIxICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogdGVzdC91bml0L2NzdHJpbmdfdGVzdC5jcHAsIGxpbWl0c190ZXN0LmNwcDogU21hbGwgbW9kaWYgdG8gYXZvaWQKKwlNU1ZDIGNvbXBpbGVyIHdhcm5pbmcgaW4gcmVsZWFzZSBidWlsZC4KKworCSogc3RscG9ydC9zdGwvX2N3Y2hhci5oOiBSZXBsYWNlIGEgX1NUTFBfTVNWQyBjaGVjayB3aXRoIGEgX1NUTFBfTVNWQ19MSUIKKwljaGVjayBhcyBXQ0hBUl9NSU4gYW5kIFdDSEFSX01BWCBtYWNyb3MgZGVmaW5pdGlvbiBkZXBlbmRzIG9uIGxpYnJhcnkKKwlhbmQgbm90IG9uIGNvbXBpbGVyLgorCisyMDA3LTA2LTIwICBQZXRyIE92dGNoZW5rb3YgIDxjb21wbGVtZW50QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3RscG9ydC9tZW1vcnk6IGltcG9ydCBzaGFyZWRfcHRyIGZyb20gYm9vc3QgdG8gc3RkOjp0cjEgbmFtZXNwYWNlLAorCWlmIG5vIF9TVExQX05PX0VYVEVOU0lPTlMgYW5kIHByZXNlbnQgX1NUTFBfVVNFX0JPT1NUX1NVUFBPUlQ7CisJc2VlIElTTy9JRUMgRFRSIDE5NzY4LAorCWh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvcGFwZXJzLzIwMDUvbjE4MzYucGRmCisKKwkqIHRlc3QvdW5pdC9zaGFyZWRfcHRyX3Rlc3QuY3BwOiB0ZXN0IGZvciBzaGFyZWRfcHRyLgorCisyMDA3LTA2LTE5ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3RscG9ydC9zdGwvZGVidWcvX2RlYnVnLmgsIF9kZWJ1Zy5jOiBSZXBsYWNlIF9faW5fcmFuZ2Ugd2l0aAorCXN0bHBfaW5fcmFuZ2UsIF9faW5fcmFuZ2UgaXMgYSBtYWNybyBpbiB0aGUgV2luZG93cyBWaXN0YSBQU0RLLgorCisJKiBzcmMvbG9jYWxlLmNwcCwgc3RscG9ydF9wcmVmaXguaCwgd2FybmluZ19kaXNhYmxlLmgsCisJc3RscG9ydC9zdGwvX2xvY2FsZS5oLCBfc3RyaW5nLmgsIGNvbmZpZy9mZWF0dXJlcy5oOiBGaXggc29tZQorCXJlZ3Jlc3Npb24gaW50cm9kdWNlIHdpdGggdGhlIGltcHJvdm1lbnQgb2YgdGhlIHJ1bnRpbWUgY29tcGF0aWJpbGl0eQorCWNoZWNrIG1lY2FuaXNtLgorCisJKiBzcmMvY19sb2NhbGVfZ2xpYmMvY19sb2NhbGVfZ2xpYmMyLmM6IEZpeCBpbXBsZW1lbnRhdGlvbiBvZgorCV9Mb2NhbGVfc3RyY21wIGFuZCBfTG9jYWxlX3N0cndjbXAgZnVuY3Rpb25zLgorCisJKiBzdGxwb3J0L3N0bC9fbGltaXRzLmM6IENoYW5nZSB0ZWNobmlxdWUgdXNlZCB0byBnZW5lcmF0ZSBOYU4gb3IKKwlpbmZpbml0eSBmbG9hdGluZyBwb2ludCBudW1iZXJzLiBObyBtb3JlIHJlaW50ZXJwcmV0X2Nhc3Qgb2YgYSBidWZmZXIsCisJd2Ugbm93IHVzZSBhbiB1bmlvbiBiYXNlZCB0ZWNobmlxdWUuIGdjYyBwcmVmZXIgdGhpcyBjbGVhbmVyIG1ldGhvZAorCWVzcGVjaWFsbHkgaW4gcmVsZWFzZSBtb2RlLgorCisJKiB0ZXN0L3VuaXQvbGltaXRzX3Rlc3QuY3BwOiBTbWFsbCB0ZXN0IG1vZGlmaWNhdGlvbiBhcyBnY2Mgd2FzIHN0aWxsCisJcGVyZm9ybWluZyBzb21lIHdlaXJkIG9wdGltaXphdGlvbiBpbiByZWxlYXNlIG1vZGUgcmVzdWx0aW5nIGluCisJdW5leHBlY3RlZCBiZWhhdmlvci4KKworMjAwNy0wNi0xOSAgUGV0ciBPdnRjaGVua292ICA8Y29tcGxlbWVudEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHN0bHBvcnQvc3RsL19mdW5jdGlvbi5oOiBpbXBvcnQgcmVmZXJlbmNlX3dyYXBwZXIgZnJvbSBib29zdCB0bworCXN0ZDo6dHIxIG5hbWVzcGFjZSwgaWYgbm8gX1NUTFBfTk9fRVhURU5TSU9OUyBhbmQgcHJlc2VudAorCV9TVExQX1VTRV9CT09TVF9TVVBQT1JUOyBzZWUgSVNPL0lFQyBEVFIgMTk3NjgsCisJaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9wYXBlcnMvMjAwNS9uMTgzNi5wZGYKKworCSogdGVzdC91bml0L3JlZmVyZW5jZV93cmFwcGVyX3Rlc3QuY3BwOiB0ZXN0IGZvciByZWZlcmVuY2Vfd3JhcHBlci4KKworMjAwNy0wNi0xNSAgUGV0ciBPdnRjaGVua292ICA8Y29tcGxlbWVudEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGJ1aWxkL3Rlc3QvdW5pdC9NYWtlZmlsZS5pbmM6IG1hY3JvX2NoZWNrcy5jcHAgaW5zdGVhZCBvZiBjd2NoYXIuY3BwLgorCisyMDA3LTA2LTE0ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3JjL2RsbF9tYWluLmNwcCwgbG9jYWxlLmNwcCwgbG9jYWxlX2ltcGwuaCwgbG9jYWxlX2ltcGwuY3BwLAorCXN0bHBvcnQvc3RsL19sb2NhbGUuaCwgX3JvcGUuaCwgY29uZmlnL193aW5kb3dzLmgsIGZlYXR1cmVzLmg6CisJRW5oYW5jZSB0aGUgcnVudGltZSBjb21wYXRpYmlsaXR5IG1lY2FuaXNtIHVzZWQgdG8gZGV0ZWN0IGJ1aWxkCisJaW5jb25zaXN0ZW5jeSB1bmRlciBXaW5kb3dzLiBXZSBub3cgdXNlIHRoZSBsb2NhbGUgY2xhc3Mgd2l0aCB0aGUKKwlWQzYgd29ya2Fyb3VuZCBjb21pbmcgd2l0aCBpdCB0byBmb3JjZSBhIGNhbGwgdG8gdGhlIGNvbXBhdGliaWxpdHkKKwljaGVjayBmdW5jdGlvbi4gSW5jb25zaXN0ZW5jeSBkZXRlY3Rpb24gaXMgYWN0aXZhdGVkIGlmIF9ERUJVRworCW9yIF9TVExQX0RFQlVHIGlzIGRlZmluZWQuIElmIGFuIGluY29uc2lzdGVuY3kgaXMgZGV0ZWN0ZWQgaXQgaXMKKwlyZXBvcnRlZCBieSB0aGUgbGlua2VyIHRoYW5rcyB0byBhbiB1bnJlc29sdmVkIHN5bWJvbAorCWJ1aWxkaW5nX2Zvcl91cF90b193aW5kb3dzOTVfYnV0X2xpYnJhcnlfYnVpbHRfZm9yX2F0X2xlYXN0X3dpbmRvd3M5OAorCW9yCisJYnVpbGRpbmdfZm9yX2F0X2xlYXN0X3dpbmRvd3M5OF9idXRfbGlicmFyeV9idWlsdF9mb3JfdXBfdG9fd2luZG93czk1CisJdGhhdCBhcmUgc2VsZiBkZXNjcmliaW5nLgorCisJKiB0ZXN0L3VuaXQvY3djaGFyLmNwcDogUmVuYW1lZCBpbiBtYWNyb19jaGVja3MuY3BwLCBhZGQgbWFueSB0ZXN0cyBmb3IKKwlhbGwgQyBTdGFuZGFyZCBtYWNyb3MgbGlrZSBDSEFSX01JTiwgQ0hBUl9NQVgsIElOVF9NSU4sIElOVF9NQVguLi4KKworCSogc3RscG9ydC9zdGwvX2N3Y2hhci5oOiBBZGQgTVNWQyBjb21waWxlcnMgYmVmb3JlIFZpc3VhbCBTdHVkaW8gMjAwNQorCWFzIG5vdCBkZWZpbmluZyBXQ0hBUl9NQVggY29ycmVjdGx5LgorCisyMDA3LTA2LTExICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3JjL2xvY2tfZnJlZV9saXN0Lmg6IEZpeCBjaGVjayBvZiBfV0lOMzJfV0lOTlQgcmF0aGVyIHRoYW4gX1dJTjMyX1dJTkRPV1MuCisKKwkqIHN0bHBvcnQvc3RsL190aHJlYWRzLmM6IEluIHRoZSBXaW4zMiBpbXBsZW1lbnRhdGlvbiwgYWRkIGEgY2FsbCB0bworCXRoZSBTd2l0Y2hUb1RocmVhZCBmdW5jdGlvbiB0byBwb3RlbnRpYWxseSBhdm9pZCBhIGNvc3RseSBjYWxsIHRvCisJU2xlZXAoMSkgdGhhdCBjYW4gdGFrZSBtb3JlIHRpbWUgdGhhbiBleHBlY3RlZC4gSWYgU3dpdGNoVG9UaHJlYWQgZmFpbAorCXdlIGNhbGwgU2xlZXAoMSkgYWdhaW4uIEJhc2VkIG9uIFRhcmFzIE92ZXJjaHVrIGJ1ZyByZXBvcnQgMTcyMDYzNS4KKworMjAwNy0wNi0xMSAgUGV0ciBPdnRjaGVua292ICA8Y29tcGxlbWVudEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHNyYy9mc3RyZWFtLmNwcDogaW50ZWdyYXRpb24gZmlsZTsgY29kZSBjbGVhbiwgdGhyZWUgaW1wbGVtZW50YXRpb25zCisJc3VibGltYXRlZCwgdW5peC1lbXVsYXRpb24gYXBwcm9hY2ggcmVtb3ZlZDsgdGhpcyBpcyByZW9yZ2FuaXphdGlvbgorCWNoYW5nZXNldCwgZnVuY3Rpb25hbGl0eSB3YXMgbm90IGNoYW5nZWQ7CisJCisJKiBzcmMvZnN0cmVhbV93aW4zMmlvLmNwcDogd2luMzJpby1iYXNlZCBpbXBsZW1lbnRhdGlvbiBvZiBfRmlsZWJ1Zl9iYXNlLAorCWkuZS4gYmFzZWQgb24gV2luZG93cyBjYWxscyBDcmVhdGVGaWxlL0Nsb3NlSGFuZGxlL1JlYWRGaWxlL1dyaXRlRmlsZSArCisJQ3JlYXRlRmlsZU1hcHBpbmcsIE1hcFZpZXdPZkZpbGU7CisKKwkqIHNyYy9mc3RyZWFtX3VuaXN0ZC5jcHA6IHVuaXN0ZGlvLWJhc2VkIGltcGxlbWVudGF0aW9uIG9mIF9GaWxlYnVmX2Jhc2UsCisJYmFzZWQgb24gdW5pc3RkIG9wZW4vY2xvc2UvcmVhZC93cml0ZSArIG1tYXA7CisKKwkqIHNyYy9mc3RyZWFtX3N0ZGlvLmNwcDogc3RkaW8tYmFzZWQgaW1wbGVtZW50YXRpb24gb2YgX0ZpbGVidWZfYmFzZSwKKwliYXNlZCBvbiBzdGRpbyBmb3Blbi9mbG9zZS9mcmVhZC9md3JpdGU7CisKKwkqIHN0bHBvcnQvc3RsL19mc3RyZWFtLmg6IGRldGVjdCBvZiBfRmlsZWJ1Zl9iYXNlIGltcGxlbWVudGF0aW9uIG1vdmVkCisJaW50byBzdGxwb3J0L3N0bC9jb25maWcgZmlsZXM7CisKKwkqIHN0bHBvcnQvc3RsL2NvbmZpZy8qLmg6IGlvc3RyZWFtcyB1bmRlcmxpbmUgdGVjaG5pcXVlIGRlcGVuZHMgdXBvbgorCU9FIG9yIHVzZXIncyBwcmVmZXJlbmNlczsKKworCSogc3RscG9ydC9zdGwvY29uZmlnL2ZlYXR1cmVzLmg6IHNvbWUgc3lzdGVtLXNwZWNpZmljIG1hY3JvIG1vdmVkIHRvCisJc3lzdGVtLSBvciBjb21waWxlci1zcGVjaWZpYyBmaWxlczsKKworCSogc3RscG9ydC9zdGwvX3JvcGUuaDogcmV3cml0dGVuIHN1c3BpY2lvbiBjb2RlLCBmdW5jdGlvbmFsaXR5IG5vdCBjaGFuZ2VkLgorCisyMDA3LTA2LTA4ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3RscG9ydC9zdGwvX2NvbXBsZXguaDogQ2xlYW4gdW51c2VkIF9TVExQX05PX0NPTVBMRVhfU1BFQ0lBTElaQVRJT05TCisJbWFjcm8gYW5kIGNvZGUgY29taW5nIHdpdGggaXQuCisKKwkqIGJ1aWxkL2xpYi9jb25maWd1cmUsIGNvbmZpZ3VyZS5iYXQ6IFJlbW92ZWQgLS13aW5kb3dzOTUgb3B0aW9uLCBpdCBpcworCXVzZWxlc3Mgbm93IHRoYXQgU1RMcG9ydCBpbmNsdWRlcyB3aW5kb3dzLmggd2hlbiBidWlsZGluZyB0aGUgbGlicmFyaWVzLgorCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2UvYmNjLm1haywgZG1jLm1haywgZ2NjLm1haywgbm1ha2UvdmMtY29tbW9uLm1hazoKKwlSZW1vdmVkIHJlZmVyZW5jZXMgdG8gV2luZG93cyA5NSBidWlsZCwgaWYgU1RMcG9ydCB1c2VycyB3YW50IHRvIHRhcmdldAorCWEgc3BlY2lmaWMgV2luZG93cyBPUyB0aGV5IHdpbGwgb25seSBoYXZlIHRvIHVzZSAtLWV4dHJhLWN4eGZsYWdzIHRvCisJZ2l2ZSBXSU5WRVIsIF9XSU4zMl9XSU5ET1dTIG9yIF9XSU4zMl9XSU5OVCB2YWx1ZXMuCisKKzIwMDctMDYtMDUgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzdGxwb3J0L3N0bC9jb25maWcvZmVhdHVyZXMuaDogUmVtb3ZlZCB1bnVzZWQgX1NUTFBfTERPVUJMRV8qIG1hY3JvcyBnaXZpbmcKKwlyZWFsIGxvbmcgZG91YmxlIHNpemUuCisKKwkqIHN0bHBvcnQvc3RsL19saW1pdHMuaCwgX2xpbWl0cy5jOiBNYWpvciBjb2RlIHVwZ3JhZGUsIG5vdyBjb21wdXRhdGlvbgorCW9mIGluZmluaXR5IGFuZCBOYU4gaXMgZG9uZSB0aGFua3MgdG8gc29tZSBjb2RlIGV4dHJhY3RlZCBmcm9tIHRoZSBib29zdAorCWxpYnJhcnkgKHd3dy5ib29zdC5vcmcpLiBUaGlzIGNvZGUgaXMgbW9yZSBwb3J0YWJsZSBhcyBpdCBhZGFwdHMgdG8gY29tcGlsZXIKKwlyZXByZXNlbnRhdGlvbiBvZiBmbG9hdCwgZG91YmxlIGFuZCBsb25nIGRvdWJsZSBhbmQgZG8gbm90IHJlcXVpcmUgbWFueQorCWNvbXBpbGVyIG1hY3JvIGNoZWNrcy4gQWRkaXRpb25hbHkgU1RMcG9ydCBudW1lcmljX2xpbWl0cyBub3cgaGFuZGxlIHJlYWwKKwlkZW5vcm1fbWluIHZhbHVlcy4KKworCSogdGVzdC91bml0L2xpbWl0X3Rlc3QuY3BwOiBBZGQgbWFueSB0ZXN0IG9uIGRlcm5vbWFsaXplZCBmbG9hdCBhbmQKKwlzb21lIG90aGVyIHZhbHVlcyBvZiBudW1lcmljX2xpbWl0cy4KKworCSogc3RscG9ydC9zdGwvY29uZmlnL19jcmF5LmgsIF9nY2MuaCwgX21zdmMuaCwgc3RsX215Y29tcC5oOiBSZW1vdmVkCisJX1NUTFBfTk9fSUVDNTU5X1NVUFBPUlQgbWFjcm8sIG1lYW5pbmcgd2FzIG5vdCBjbGVhciBhbmQgaW1wYWN0IHdhcworCWxvY2FsaXplZCB0byB0aGUgX2xpbWl0cy5oIGZpbGUgc28gdXNlIG9mIGEgZ2xvYmFsIG1hY3JvIHdhcyByYXRoZXIKKwl1c2VsZXNzLgorCisyMDA3LTA1LTI5ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3RscG9ydC9zdGwvX251bV9nZXRfLmM6IFNtYWxsIHJlZmFjdG9yaW5nLCBhbGwgbnVtX2dldDo6ZG9fZ2V0IGZvcgorCWZsb2F0LCBkb3VibGUgYW5kIGxvbmcgZG91YmxlIGFyZSBub3cgY2FsbGluZyB0aGUgc2FtZSBfX2RvX2dldF9mbG9hdAorCWZ1bmN0aW9uLiBNb3Jlb3Zlciwgd2hlbiBfX3JlYWRfZmxvYXQgZmFpbGVkLCBfX3NyaW5nX3RvX2Zsb2F0IGlzIG5vdAorCWNhbGxlZCBhbnltb3JlLgorCisyMDA3LTA1LTI4ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogdGVzdC91bml0L2xpbWl0c190ZXN0LmNwcDogQWRkIHRlc3QgY2hlY2tpbmcgdGhhdCBudW1lcmljX2xpbWl0cworCW1pbiBpcyByZWFsbHkgbWluIGFuZCBtYXggcmVhbGx5IG1heC4KKworCSogc3JjL2FsbG9jYXRvcnMuY3BwLCBsb2NhbGVzLmNwcCwgc3RscG9ydC9zdGwvX3RocmVhZHMuaCwKKwljb25maWcvX3dpbmRvd3MuaDogRml4IGRldGVjdGlvbiBvZiBXaW5kb3dzIE9TIGhhdmluZyBsaW1pdGVkCisJaW1wbGVtZW50YXRpb24gb2YgSW50ZXJsb2NrZWRbSW5jcmVtZW50LERlY3JlbWVudF0gV2luMzIgQVBJCisJZnVuY3Rpb25zLiBfU1RMUF9XSU45NSBtYWNybyBoYXMgYmVlbiByZW5hbWUgX1NUTFBfV0lOOTVfTElLRQorCWFzIGl0IGRvIG5vdCBvbmx5IHNpZ25hbCBXaW5kb3dzIDk1IGJ1aWxkIGNvbnRleHQgYnV0IGFsc28gZm9ybWVyCisJT1MgdmVyc2lvbnMuCisKKzIwMDctMDUtMjIgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzcmMvY19sb2NhbGVfd2luMzIvY19sb2NhbGVfd2luMzIuYzogZ2NjIE1pbkdXIGhhcyBubyB0aHJlYWQKKwlsb2NhbGUgc3RvcmFnZSBpbnRyaXNpbmMgc3VwcG9ydCBzbyBmb3IgdGhpcyBjb21waWxlciwgbG9jYWxlCisJY3JlYXRpb24gZmFpbHVyZSB3aWxsIGFsd2F5cyBiZSByZXBvcnRlZCB3aXRoIHJ1bnRpbWVfZXJyb3IKKwlleGNlcHRpb24uCisKKwkqIHN0bHBvcnQvc3RsL2NvbmZpZy9fbXN2Yy5oOiBDb25maWd1cmF0aW9uIGZpeCwgY2hlY2sgdGhhdCBfU1RMUF9NU1ZDCisJaXMgZGVmaW5lZCBiZWZvcmUgYWN0aXZhdGluZyBNU1ZDNiB3b3JrYXJvdW5kCisJKF9TVExQX1VTRV9NU1ZDNl9NRU1fVF9CVUdfV09SS0FST1VORCBtYWNybykuCisKKzIwMDctMDUtMjEgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzcmMvY19sb2NhbGUuaCwgbG9jYWxlLmNwcCwgbG9jYWxlX2ltcGwuY3BwLAorCWNfbG9jYWxlX2R1bW15L2NfbG9jYWxlX2R1bW15LmMsIGNfbG9jYWxlX3dpbjMyL2NfbG9jYWxlX3dpbjMyLmMsCisJY19sb2NhbGVfZ2xpYy9jX2xvY2FsZV9nbGliYy5jLCBjX2xvY2FsZV9nbGliYzIuYzogQWRkIGEgX0xvY2FsZV9lcnJubworCWZ1bmN0aW9uIHRvIHRoZSBzbWFsbCBsb2NhbGl6YXRpb24gZnJhbWV3b3JrIGluIG9yZGVyIHRvIHJlcG9ydCBtb3JlCisJYWNjdXJhdGUgbG9jYWxlIGNyZWF0aW9uIGZhaWx1cmUuIEZvciB0aGUgbW9tZW50IHRoZXJlIGFyZSAzIHBvc3NpYmxlCisJZmFpbHVyZSByZWFzb25zLCBubyBtb3JlIG1lbW9yeSwgdW5zdXBwb3J0ZWQgbG9jYWxlLCBubyBwbGF0Zm9ybSBzdXBwb3J0LgorCUluIGNhc2Ugb2YgbWVtb3J5IHN0YXJ2YXRpb24sIHdlIHRocm93IGEgYmFkX2FsbG9jIGV4Y2VwdGlvbi4KKworMjAwNy0wNS0xOSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHN0bHBvcnQvc3RsL192YWxhcnJheS5oLCBfdmFsYXJyYXkuYzogQWRkIG1hbnkgYXNzZXJ0aW9uIGNoZWNrcyB0bworCXRyYWNrIHBvdGVudGlhbCB1bmRlZmluZWQgYmVoYXZpb3JzIG1vc3RseSByZWdhcmRpbmcgaW52YWxpZCBhcmd1bWVudAorCXNpemUuCisKKzIwMDctMDUtMTcgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzdGxwb3J0L3N0bC9fcHJvbG9nLmg6IEhpZGUgX2RlYnVnLmggd2hlbiBpbmNsdWRpbmcgQyBzdGFuZGFyZAorCWhlYWRlcnMuIFNvbWUgcGxhdGZvcm1zIChXaW4zMikgaW5jbHVkZSBDIGhlYWRlcnMgaW4gYW4gJ2V4dGVybiAiQyInCisJc2NvcGUgdGhhdCBkbyBub3QgYWNjZXB0IHRlbXBsYXRlcyBleHBvc2VkIGluIF9kZWJ1Zy5oLgorCisyMDA3LTA1LTE2ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3RscG9ydC9zdGwvY29uZmlnL19hdXRvX2xpbmsuaCwgYnVpbGQvTWFrZWZpbGVzL2dtYWtlL2N5Z21pbmcvbGliLm1haywKKwlidWlsZC9NYWtlZmlsZXMvbm1ha2UvbGliL21hY3JvLm1hazogUmVtb3ZlZCB2ZXJzaW9uIGluZm9ybWF0aW9uCisJZnJvbSBzdGF0aWMgbGlicyBuYW1lIGZvciBjb25zaXN0ZW5jeSBhbW9uZyBhbGwgc3VwcG9ydGVkIGNvbXBpbGVycy8KKwlwbGF0Zm9ybS4KKworMjAwNy0wNS0xNSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHN0bHBvcnQvc3RsL19yYW5nZV9lcnJvcnMuYywgX3N0ZGV4Y2VwdF9iYXNlLmM6IE5ldyBmaWxlcworCWNvbnRhaW5pbmcgY29kZXMgdGhhdCB1c2VkIHRvIGJlIGR1cGxpY2F0ZWQgaW4gZGxsX21haW4uY3BwLgorCisJKiBzcmMvZGxsX21haW4uY3BwOiBJbmNsdWRlIF9yYW5nZV9lcnJvcnMuYyBhbmQgX3N0ZGV4Y2VwdF9iYXNlLmMKKwl3aGVuIG5lY2Vzc2FyeS4KKworCSogc3RscG9ydC9zdGwvX3N0ZGV4Y2VwdF9iYXNlLmgsIF9zdGRleGNlcHRfYmFzZS5jOiBfX05hbWVzX2V4Y2VwdGlvbgorCWRvIG5vdCB0cnVuY2F0ZSBhbnltb3JlIGV4Y2VwdGlvbiBtZXNzYWdlIHdoZW4gbG9uZ2VyIHRoYW4gaW50ZXJuYWwKKwlzdGF0aWMgYnVmZmVyLCBhIGR5bmFtaWMgYnVmZmVyIGlzIGFsbG9jYXRlZCB0aHJvdWdoIG1hbGxvYyBpbiB0aGlzCisJY2FzZS4gSSBoYXZlbid0IHVzZSBfX2lvc3RyaW5nIGNsYXNzIGluIHRoaXMgY2FzZSBhcyBpdCB3b3VsZAorCWhhdmUgaW50cm9kdWNlIGEgY3ljbGljIGRlcGVuZGVuY3kgYmV0d2VlbiBjbGFzc2VzLgorCisyMDA3LTA1LTExICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3JjL2NfbG9jYWxlLmgsIGNfbG9jYWxlX2dsaWJjL2NfbG9jYWxlX2dsaWJjMi5jOiBTb21lIGZpeGVzIHRvCisJYXZvaWQgZ2NjIHdhcm5pbmdzIHdoZW4gY29tcGlsZWQgd2l0aCAtV2FsbCAtV21pc3NpbmdfcHJvdG90eXBlcy4KKworCSogc3RscG9ydC9zdGwvX251bV9wdXQuYzogRml4IGEgY2FzdCB0byBhdm9pZCBhIHNpZ25lZC91bnNpZ25lZAorCWNvbXBhcmlzb24gd2FybmluZy4KKworCSogY19sb2NhbGVfZ2xpYmMvY19sb2NhbGVfZ2xpYmMyLmM6IFVzZSBfX2xvY2FsZV90IF9fbmFtZXMgZmllbGQKKwlyYXRoZXIgdGhhbiBfX2xvY2FsZXMgdG8gYWNjZXNzIHRvIGNhdGVnb3J5IG5hbWVzLiBUaGFua3MgdG8gdGhpcworCW1vZGlmaWNhdGlvbiB3ZSBkbyBub3QgbmVlZCB0aGUgR2xpYiBpbnRlcm5hbCBsb2NhbGVfZGF0YSBzdHJ1Y3QKKwlkZWZpbml0aW9uIGFueW1vcmUuCisKKwkqIHRlc3QvdW5pdC9mc3RyZWFtX3Rlc3QuY3BwOiBQb3J0IHRoZSBGc3RyZWFtVGVzdDo6bnVsbF9zdHJlYW0gZm9yCisJdW5peGVzIHBsYXRmb3JtcyB0aGF0IHVzZSAvZGV2L251bGwsIHRoZSB0ZXN0IGlzIG5vdCBpZ25vcmVkIGFueW1vcmUuCisKKwkqIHNyYy9mc3RyZWFtLmNwcDogVW5kZXIgV2luZG93cywgY2hlY2sgdGhhdCB0aGUgZmlsZSB3ZSBhcmUKKwlvcGVuaW5nIGlzIGEgcmVhbCBmaWxlIGJlZm9yZSB0cnlpbmcgdG8gdHJ1bmNhdGUgaXQgb3IgbW92ZSB0bworCXRoZSBlbmQuIEFsbG93IHVzZSBvZiBzcGVjaWFsIGZpbGUgbGlrZSAiTlVMIiB3aXRoIEMrKyBmc3RyZWFtLgorCisyMDA3LTA1LTEwICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3JjL3N0ZGlvX3N0cmVhbWJ1Zi5jcHA6IEFkZCBjaGVja3Mgb2YgZXJyb3IgY29kZXMgcmV0dXJuZWQKKwlieSBmdGVsbCBhbmQgZnNlZWsgZnVuY3Rpb25zIGluIHN0ZGlvX2lzdHJlYW1idWY6OnNob3dtYW55YworCVdpbmRvd3MgQ0Ugc3BlY2lhbCBpbXBsZW1lbnRhdGlvbi4KKworCSogdGVzdC91bml0L2ZzdHJlYW1fdGVzdC5jcHA6IEFkZCBuZXcgdGVzdCBjYXNlIHRvIGNoZWNrIGZpbGUgc3RyZWFtcworCWJ1aWx0IGZyb20gcGxhdGZvcm0gZGVwZW5kZW50IG51bGwgcGlwZSAoTlVMIHVuZGVyIFdpbmRvd3MsIC9kZXYvbnVsbAorCXVuZGVyIHVuaXhlcykuIElnbm9yZWQgZm9yIHRoZSBtb21lbnQuCisKKzIwMDctMDUtMDQgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzcmMvbG9jYWxlLmNwcCwgYWxsb2NhdG9ycy5jcHAsIHN0bHBvcnQvc3RsL190aHJlYWRzLmgsCisJY29uZmlnL193aW5kb3dzLmg6IENoYW5nZSBtYWNybyBjaGVja3MgdG8gZGV0ZWN0IFdpbmRvd3MgOTUgcGxhdGZvcm0uCisJV2luZG93cyA5NSBhbmQgTlQ0IGhhcyBib3RoIFdJTlZFUiA9PSAweDA0MDAgYnV0IG9ubHkgV2luZG93cyA5NSBoYXMKKwlsaW1pdGF0aW9uIGltcGFjdGluZyBTVExwb3J0IGNvZGUuIERpc3RpbmN0aW9uIGJldHdlZW4gYm90aCBwbGF0Zm9ybXMKKwlpcyBkb25lIHRoYW5rcyB0byB0aGUgX1dJTjMyX1dJTk5UIG1hY3JvIG9ubHkgZGVmaW5lZCBmb3IgTlQ0LiBOZXcKKwlfU1RMUF9XSU45NSBtYWNybyBzaWduYWxzIFdpbmRvd3MgOTUgcGxhdGZvcm0sIGl0IHJlcGxhY2VzCisJX1NUTFBfV0lOMzJfVkVSU0lPTi4gVGhhbmtzIEphbiBFY2h0ZXJuYWNoIHBhdGNoIDE3MDc5NjMuCisKKwkqIHNyYy9jX2xvY2FsZV93aW4zMi9jX2xvY2FsZV93aW4zMi5jOiBSZW1vdmUgYWxsIGNvZGUgY29uY2VybmluZyB0aGUKKwltZXNzYWdlcyBmYWNldCwgV2luZG93cyBwbGF0Zm9ybSBkbyBub3Qgc3VwcG9ydCBpdC4KKworCSogc3JjL2ZzdHJlYW0uY3BwOiBGaXggdXNlIG9mIGZzZWVrIGluIF9GaWxlYnVmX2Jhc2U6Ol9NX3NlZWsgaW4KKwlfU1RMUF9VU0VfU1RESU9fSU8gbW9kZS4gZnNlZWsgZG8gbm90IHJldHVybiB0aGUgcG9zaXRpb24gaW4gZmlsZQorCWJ1dCBhIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyBpZiBjYWxsIGhhcyBzdWNjZWVkZWQgb3Igbm90LCBhbmQKKwljYWxsIHRvIGZ0ZWxsIHRvIGdldCBmaWxlIHBvc2l0aW9uLiBUaGFua3MgTWFyY28gSmV6IGJ1ZyByZXBvcnQKKwkxNzA0ODQzLiBJIGhhdmUgYWxzbyBpbnRlZ3JhdGVkIGEgbnVtYmVyIG9mIHNtYWxsIGZpeGVzIHRvIHVzZQorCV9TVExQX1VTRV9TVERJT19JTyBtb2RlIHVuZGVyIE1TVkMgb3IgR0NDIE1pbkdXLCBpdCBzaG91bGRuJ3QgYmUKKwlyZWFsbHkgbmVjZWNhcnJ5IGJ1dCBpdCBjb3N0cyBub3RoaW5nIGFuZCBoZWxwIHRlc3RpbmcgdGhpcyBtb2RlLgorCisyMDA3LTA1LTAzICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3RscG9ydC9zdGwvX251bXB1bmN0LmgsIF90aW1lX2ZhY2V0cy5oLCBfY3R5cGUuaCwgX21vbmV0YXJ5LmgsCisJX21lc3NhZ2VzX2ZhY2V0cy5oOiBSZW1vdmUgZnJpZW5kIF9Mb2NhbGVfZXh0cmFjdF9oaW50IGZ1bmN0aW9uCisJZGVjbGFyYXRpb24gcmVwbGFjZSBieSB0aGUgbW9yZSBzaW1wbGUgZnJpZW5kIGNsYXNzCisJX0xvY2FsZV9pbXBsIGV4cHJlc3Npb24uCisKKwkqIHNyYy9sb2NhbGVfaW1wbC5jcHA6IENoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZgorCV9Mb2NhbGVfaW1wbDo6aW5zZXJ0XypfZmFjZXRzIG1ldGhvZHMuIE5vdyBvbmx5IGZhY2V0cyB1c2VkIGludGVybmFsbHkKKwlmb3IgaW9zdHJlYW1zIGltcGxlbWVudGF0aW9uIGFyZSBjb25zaWRlcmVkIGFzIG1hbmRhdG9yeSB3aGVuCisJaW5zdGFuY2lhdGluZyBhIGxvY2FsZSBmcm9tIGEgbmFtZS4gT3RoZXIgZmFjZXRzIGxpa2UgY29sbGF0ZSBvcgorCW1lc3NhZ2VzIHdvbid0IGdlbmVyYXRlIGEgcnVudGltZV9lcnJvciBleGNlcHRpb24gaWYgdGhlIHBsYXRmb3JtIGlzCisJbm90IGFibGUgdG8gZ3JhbnQgYW4gaW1wbGVtZW50YXRpb24uIFRoaXMgd2lsbCBtYWtlIFNUTHBvcnQgbW9yZQorCWZsZXhpYmxlIGluIHJlZ2FyZHMgb2YgcGxhdGZvcm0gcG9zc2liaWxpdGllcy4KKworCSogc3RscG9ydC9zdGwvX21lc3NhZ2VzX2ZhY2V0cy5oLCBzcmMvZmFjZXRzX2J5bmFtZS5jcHAsIG1lc3NhZ2VzLmNwcDoKKwlTaW1wbGlmaWNhdGlvbiBvZiB0aGUgbWVzc2FnZXMgZmFjZXQgaW1wbGVtZW50YXRpb24uIF9NZXNzYWdlcyBjbGFzcworCWhhcyBubyB2aXJ0dWFsIG1ldGhvZCBhbnltb3JlLCBfTWVzc2FnZXNfSW1wbCBoYXMgYmVlbiByZW1vdmVkLiBOb3cKKwltZXNzYWdlcyBjbGFzcyBpbXBsZW1lbnRhdGlvbiBpcyBhIGR1bW15IGltcGxlbWVudGF0aW9uIHRoYXQgZG8gbm90CisJYWxsb3cgYWNjZXNzIHRvIHBsYXRmb3JtIG1lc3NhZ2VzLCByZWFsIG1lc3NhZ2VzIGltcGxlbWVudGF0aW9uIGlzCisJYXZhaWxhYmxlIHRoYW5rcyB0byB0aGUgbWVzc2FnZXNfYnluYW1lIGNsYXNzLgorCisJKiBzdGxwb3J0L3N0bC9fdGltZV9mYWNldHMuaDogX0xvY2FsZV90aW1lIGluc3RhbmNlIGlzIG5vdCBrZXB0CisJYW55bW9yZSBpbiB0aGUgZmFjZXQgaW1wbGVtZW50YXRpb24sIGl0IGlzIG9ubHkgdXNlZCBvbiBjb25zdHJ1Y3Rpb24KKwl0byBpbml0aWxpYXplIF9UaW1lX0luZm8gc3RydWN0IGluc3RhbmNlLgorCisyMDA3LTA1LTAyICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogdGVzdC91bml0L2NvZGVjdnRfdGVzdC5jcHA6IEZpeGVkIGNvbXBhcmlzb24gd2l0aCBjaGFyX3RyYWl0czo6ZW9mCisJdG8gdXNlIGVxX2ludF90eXBlIGluIG9yZGVyIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBwbGF0Zm9ybSBoYXZpbmcKKwlhIGRlZmF1bHQgdW5zaWduZWQgY2hhciBidWlsdC1pbiB0eXBlLiBUaGFua3MgTWFyY28gSmV6IHJlcG9ydC4KKworMjAwNy0wNC0xOSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHN0bHBvcnQvc3RsL192YWxhcnJheS5oOiBJbnRlZ3JhdGUgQysrIFN0YW5kYXJkIGRlZmVjdCAyNTMKKwlzaWduYWxpbmcgdGhhdCBzbGljZV9hcnJheSwgZ3NsaWNlX2FycmF5LCBtYXNrX2FycmF5IGFuZAorCWluZGlyZWN0X2FycmF5IGNvcHkgY29uc3RydWN0b3IgY2Fubm90IGJlIHByaXZhdGUuCisKKwkqIHRlc3QvdW5pdC92YWxhcnJheV90ZXN0LmNwcDogQWRkIGNvbXBpbGF0aW9uIHRlc3QgdG8gY2hlY2sgdGhhdAorCXZhbGFycmF5IG9wZXJhdG9yW10gdGFraW5nIGEgc2xpY2UsIGdzbGljZSwgdmFsYXJyYXk8Ym9vbD4gYW5kCisJdmFsYXJyYXk8c2l6ZV90PiBjYW4gYmUgY2FsbGVkLgorCisyMDA3LTA0LTE2ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3JjL2xvY2FsZS5jcHA6IFNpbXBsaWZpZWQgbG9jYWxlOjpfTV90aHJvd19ydW50aW1lX2Vycm9yCisJaW1wbGVtZW50YXRpb24gdXNpbmcgc3RkOjpzdHJpbmcgcmF0aGVyIHRoYW4gQyBzdHJpbmcgZnVuY3Rpb25zLgorCUFsc28gY2hhbmdlIGV4Y2VwdGlvbiBtZXNzYWdlIGdlbmVyYXRpb24gdG8gbWFrZSBmYWlsdXJlIHJlYXNvbgorCW1vcmUgb2J2aW91cy4KKworCSogc3JjL2ZhY2V0c19ieW5hbWUuY3BwOiBBcywgYWNjb3JkaW5nIFN0YW5kYXJkLCAqX2J5bmFtZSBmYWNldAorCWNvbnN0cnVjdG9yIHNob3VsZCBiZWhhdmUgYXMgbG9jYWxlIGNvbnN0cnVjdG9yIHRha2luZyBhIG5hbWUKKwlTVExwb3J0IG5vdyB0aHJvd3MgYSBydW50aW1lX2Vycm9yIGluc3RhbmNlIHdoZW4gYnVpbGRpbmcKKwlhIGZhY2V0IGZyb20gYSBudWxsIG5hbWUuCisKKwkqIHNyYy9tZXNzYWdlcy5jcHA6IE5vdyBjb250YWlucyBhbGwgY2xhc3NlcyBpbXBsZW1lbnRhdGlvbiBpbnZvbHZlZAorCWluIG1lc3NhZ2VzIGZhY2V0IHN1cHBvcnQuCisKKwkqIHN0bHBvcnQvc3RsL19tZXNzYWdlc19mYWNldHMuaCwgc3JjL21lc3NhZ2VzX2ZhY2V0cy5oLCBtZXNzYWdlcy5jcHA6CisJU2ltcGxpZmljYXRpb24gb2YgdGhlIG1lc3NhZ2VzIGZhY2V0IGltcGxlbWVudGF0aW9uLiBNYWpvciBtb2RpZmljYXRpb24KKwlpcyB0aGF0IHRoZSBDIG1lc3NhZ2VzIGZhY2V0IGhhcyBub3cgb25seSBvbmUgcmVwcmVzZW50YXRpb24gd2hpY2ggaXMKKwl0aGUgb25lIGdpdmVuIGJ5IHRoZSBfTWVzc2FnZSBjbGFzcy4gVGhlcmUgdXNlZCB0byBiZSBhbiBvdGhlciBvbmUKKwliYXNlZCBvbiBfTWVzc2FnZXNfaW1wbCBjbGFzcyB1c2luZyBfX2FjcXVpcmVfbWVzc2FnZXMoIkMiKS4KKworCSogc3JjL21lc3NhZ2VzX2ZhY2V0cy5oOiBJbnRlcm5hbCBjbGFzc2VzIF9NZXNzYWdlcyBhbmQgX01lc3NhZ2VzX2ltcGwKKwlhcmUgbm90IGV4cG9ydGVkIGFueW1vcmUuCisKKwkqIHRlc3QvdW5pdC9sb2NhbGVfdGVzdC5jcHA6IEZhY2V0IHRlc3RzIGhhcyBiZWVuIG1vdmVkIHRvIGZhY2V0CisJY2F0ZWdvcnkgdGVzdCBmaWxlcy4KKworCSogdGVzdC91bml0L2NvbGxhdGVfZmFjZXRzX3Rlc3QuY3BwLCBjdHlwZV9mYWNldHNfdGVzdC5jcHAsCisJbWVzc2FnZXNfZmFjZXRzX3Rlc3QuY3BwLCBtb25leV9mYWNldHNfdGVzdC5jcHAsIG51bV9mYWNldHNfdGVzdC5jcHAsCisJdGltZV9mYWNldHNfdGVzdC5jcHAsIGJ1aWxkL3Rlc3QvdW5pdC9NYWtlZmlsZS5pbmM6IE5ldyB0ZXN0IGNhc2VzIGZvcgorCWVhY2ggZmFjZXQgY2F0ZWdvcnkuCisKKwkqIHN0bHBvcnQvc3RsL2NvbmZpZy9mZWF0dXJlcy5oOiBEZWZpbmUgX1NUTFBfTk9fVFlQRUlORk8gd2hlbiBfU1RMUF9OT19SVFRJCisJaXMgZGVmaW5lZC4KKworMjAwNy0wNC0xNSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHNyYy9kbGxfbWFpbi5jcHA6IFJlbW92ZWQgdXNlbGVzcyBfQXRvbWljX3N3YXBfc3RydWN0IGV4cG9ydAorCXRoYXQgaGFzIGFscmVhZHkgYmVlbiByZW1vdmVkIGZyb20gX3RocmVhZHMuaCBhbmQgdGhhdCB3YXMgZ2VuZXJhdGluZworCWNvbXBpbGF0aW9uIGVycm9yIHdpdGggTVNWQyAyMDA1LgorCisyMDA3LTA0LTEwICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3RscG9ydC9zdGwvcG9pbnRlcnMvX2RlcXVlLmgsIF9saXN0LmgsIF9zZXQuaCwgX3NsaXN0Lmg6CisJRXJpYyBTYW5mb3JkIERNQyBwYXRjaCB0byBhbGxvdyBwb2ludGVyIHNwZWNpYWxpemF0aW9uIGZlYXR1cmUuCisKKwkqIHRlc3QvdW5pdC9tYXBfdGVzdC5jcHAsIHNldF90ZXN0LmNwcCwgc2xpc3RfdGVzdC5jcHAsCisJdW5vcmRlcmVkX3Rlc3QuY3BwOiBSZW1vdmUgRE1DIGNoZWNrIGhpZGluZyBwb2ludGVyIHNwZWNpYWxpemF0aW9uCisJdGVzdHMuCisKKwkqIGJ1aWxkL01ha2VmaWxlcy9nbWFrZS9kbWMubWFrLCBhcHAvZG1jLm1hazogQWRkaXRpb25hbCBmaXhlcyBmcm9tCisJRXJpYyBTYW5mb3JkLgorCisyMDA3LTA0LTA5ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3RscG9ydC9zdGwvX3BhaXIuaCwgX3ZlY3Rvci5oLCBjb25maWcvX2JjLmg6IEJvcmxhbmQgcGF0Y2gKKwlmcm9tIEVyaWMgU2FuZm9yZCwgcmVtb3ZlIG1vdmUgc2VtYW50aWMgZm9yIGZyZWUgY29tcGlsZXIuCisKKwkqIHRlc3QvdW5pdC9tdmN0b3JfdGVzdC5oOiBFcmljIFNhbmZvcmQgcGF0Y2ggdG8gcmVzdG9yZSAyIHRlc3RzCisJdGhhdCBoYXMgYmVlbiBsb3N0IGluIGEgcHJldmlvdXMgdGVzdCBtb2RpZmljYXRpb24sCisJbW92YWJsZV9kZWNsYXJhdGlvbl9hc3NvYyBhbmQgbW92YWJsZV9kZWNsYXJhdGlvbl9oYXNoLgorCisJKiB0ZXN0L3VuaXQvbXZjdG9yX3RyYWl0c190ZXN0LmNwcDogQWRkIHNvbWUgX1NUTFBfTk9fTU9WRV9TRU1BTlRJQworCWNoZWNrcyB3aGVuIHVzaW5nIF9fbW92ZV90cmFpdHMuCisKKzIwMDctMDQtMDUgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzdGxwb3J0L3N0bC9jb25maWcvX2djYy5oOiBSZW1vdmVkIHVuZGVmIG9mIF9TVExQX05FV19QTEFURk9STV9TREssCisJdW5kZXIgTWluR1csIE1pbkdXIGNhbiB1c2UgYSBuZXcgU0RLIGFuZCBub3QgdGhlIG9uZSBjb21pbmcgd2l0aAorCU1pbkdXLgorCisJKiBNZXJnZWQgd2l0aCBTVExQT1JUXzVfMSBicmFuY2ggdXAgdG8gcmV2aXNpb24gMjk5NC4KKworMjAwNy0wNC0wNSAgUGV0ciBPdnRjaGVua292ICA8Y29tcGxlbWVudEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHNyYy9jdHlwZS5jcHA6IG1vdmUgZGVjbGFyYXRpb24gZnJvbSBsb29wOworCisJKiBzdGxwb3J0L3N0bC9kZWJ1Zy9fZGVidWcuYzogc3RsL19jc3RkbGliLmggYWxyZWFkeSBpbmNsdWRlZDsKKworCSogc3RscG9ydC9zdGwvX2Nwcm9sb2cuaDogcHJvbG9nIGZvciBDIGhlYWRlcnMgY2FuJ3QgaW5jbHVkZQorCWZpbGVzIHdpdGggQysrIGNvbnN0cnVjdGlvbnM7CisKKwkqIHN0bHBvcnQvKi5oOiBDIGhlYWRlcnMgdXNlIHByb2xvZyB0aGF0IGRvbid0IGluY2x1ZGUgQysrCisJY29uc3RydWN0aW9uczsKKworCSogdGVzdC91bml0L3N0bGRiZ19pbmNsdWRlLmNwcCwgYnVpbGQvdGVzdC91bml0L01ha2VmaWxlLmluYzoKKwl0ZXN0IGZvciBwcm9ibGVtIHdpdGggaW5jbHVzaW9uIEMrKyBjb25zdHJ1Y3Rpb25zIGZyb20KKwlDIGhlYWRlci4KKworMjAwNy0wNC0wNCAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGJ1aWxkL2xpYi9jb25maWd1cmUuYmF0OiBDaGFuZ2UgYWR2aXNlIGNvbW1hbmQgdG8gYnVpbGQKKwlTVExwb3J0IGFmdGVyIGNvbmZpZ3VyYXRpb24sIGl0IGlzIG5vdyAnY2xlYW4gYWxsJyByYXRoZXIKKwl0aGFuIGRlZmF1bHQgYnVpbGQgY29tbWFuZC4KKworMjAwNy0wMy0yMiAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHNyYy9jX2xvY2FsZV9kdW1teS9jX2xvY2FsZV9kdW1teS5jOiBGaXhlZCBkdW1teSBkZWZpbml0aW9uCisJZm9yIGEgbnVtYmVyIG9mIGxvY2FsaXphdGlvbiBmdW5jdGlvbnMgdGhhdCBhcmUgbm93IHR5cGUgc2FmZS4KKworMjAwNy0wMy0yMCAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHN0bHBvcnQvc3RsL19wcm9sb2cuaCwgY29uZmlnL2ZlYXR1cmVzLmgsIGRlYnVnL19kZWJ1Zy5oOgorCU5vcm1hbGl6ZSB0aGUgd2F5IFNUTHBvcnQgZGVidWcgbW9kZSBtYWNyb3MgYXJlIGRlZmluZWQuIEFsbAorCWRlYnVnIG1hY3JvIGRlZmluaXRpb24gYXJlIG5vdyBjb21pbmcgZnJvbSBfZGVidWcuaCBhbmQgbm90CisJYW55bW9yZSBwYXJ0aWFsbHkgZnJvbSBmZWF0dXJlcy5oLiBfZGVidWcuaCBpcyBub3cgaW5jbHVkZWQgZnJvbQorCV9wcm9sb2cuaCBhZnRlciBhbGwgY29uZmlndXJhdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQuCisKKwkqIHN0bHBvcnQvc3RsL19hbGxvYy5oLCBfaXRlcmF0b3JfYmFzZS5oLCBfdmFsYXJyYXkuaDogUmVtb3ZlZAorCV9kZWJ1Zy5oIHJlZmVyZW5jZXMgbm93IGZ1bGx5IGludGVncmF0ZWQgaW4gU1RMcG9ydCBjb25maWd1cmF0aW9uCisJcGhhc2UuCisKKwkqIHN0bHBvcnQvc3RsL2NvbmZpZy9fd2luZG93cy5oOiBBZGQgc29tZSBXaW5kb3dzIG1hY3JvIGJlZm9yZQorCWluY2x1c2lvbiBvZiB3aW5kb3dzLmggd2hlbiBidWlsZGluZyBsaWJyYXJ5IHRvIGxpbWl0IFdpbmRvd3MKKwlwb2xsdXRpb24gKE5PTUlOTUFYLCBTVFJJQ1QpLiBNb3Jlb3ZlciBhZGQgZGVmaW5pdGlvbiBvZgorCV9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgbWFjcm8gYmVmb3JlIHdpbmRvd3MuaCBpbmNsdXNpb24gdG8KKwlhdm9pZCBpbmRpcmVjdCBpbmNsdWRlIG9mIFNUTHBvcnQgc3R1ZmYgdGhyb3VnaHQgQyBTdGFuZGFyZCBoZWFkZXJzCisJaW5jbHVkZWQgaW4gd2luZG93cy5oIGFzIGF0IHRoaXMgbW9tZW50IFNUTHBvcnQgaXMgbm90IHlldCBjb21wbGV0ZWx5CisJY29uZmlndXJlZC4KKworCSogc3RscG9ydC9zdGwvY29uZmlnL19ldmMuaDogUmVtb3ZlZCB1bmp1c3RpZmllZCBtYWNybyBkZWZpbml0aW9uIHRvCisJbGltaXQgaW5jbHVzaW9uIGZyb20gd2luZG93cy5oLCBpdCBpcyBhIHVzZXIgZGVjaXNpb24gbm90IGFuIFNUTHBvcnQgb25lLgorCisJKiBidWlsZC9NYWtlZmlsZXMvbm1ha2UvdmM4Lm1hazogRml4IGRlZmluaXRpb24gb2YgREVGUyBpbiB0aGlzIGZpbGUKKwl0byBrZWVwIGN1cnJlbnQgREVGUyB2YWx1ZSB0aGF0IG1pZ2h0IGV4aXN0IGlmIGNvbmZpZ3VyZSAtLWV4dHJhLWN4eGZsYWcKKwlvcHRpb24gaGFzIGJlZW4gdXNlZC4KKworCSogc3JjL2FsbG9jYXRvcnMuY3BwOiBBZGQgX1NUTFBfTkVXX1BMQVRGT1JNX1NESyBtYWNybyBjaGVjayB0bworCXBlcmZvcm0gbmVjZXNzYXJ5IGNvbnN0X2Nhc3QgaW4gX1NUTFBfQVRPTUlDX0FERCBtYWNybyBkZWZpbml0aW9uLgorCisyMDA3LTAzLTE3ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogYnVpbGQvTWFrZWZpbGVzL2dtYWtlL2JjYy5tYWssIGRtYy5tYWssIGdjYy5tYWssIG5tYWtlL3ZjLWNvbW1vbi5tYWs6CisJQWRkIFdJTlZFUiBkZWZpbml0aW9uIHdoZW4gYnVpbGRpbmcgbGlicmFyaWVzIHRvIHNpZ25hbCByZXF1aXJlZCBPUworCWNvbXBhdGliaWxpdHksIHBlciBkZWZhdWx0IGl0IGlzIFdpbmRvd3MgOTggYW5kIGxhdGVyIG9uZXMuCisKKwkqIGJ1aWxkL2xpYi9jb25maWd1cmUsIGNvbmZpZ3VyZS5iYXQ6IEFkZCBuZXcgY29uZmlndXJhdGlvbiBvcHRpb24KKwktLXdpbmRvd3M5NSB0byBzaWduYWwgdGhhdCB3ZSB3YW50IFdpbmRvd3MgOTUgY29tcGF0aWJpbGl0eS4KKworCSogc3RscG9ydC9zdGwvX3RocmVhZHMuaCwgY29uZmlnL193aW5kb3dzLmgsIHNyYy9hbGxvY2F0b3JzLmNwcDoKKwlNb3ZlIF9TVExQX0FUT01JQ19BREQgbWFjcm8gZGVmaW5pdGlvbiBpbiBzb3VyY2UgZmlsZXMgd2hlcmUgaXQgaXMKKwl1c2VkLgorCisJKiBzdGxwb3J0L3N0bC9jb25maWcvX3dpbmRvd3MuaDoKKwkgIC0gV2hlbiBidWlsZGluZyB0aGUgbGlicmFyaWVzIHdlIGFsd2F5cyBpbmNsdWRlIHdpbmRvd3MuaCwgd2hlbiB1c2luZworCXRoZSBsaWJyYXJ5IHdlIGFsd2F5cyB1c2Ugb3duIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIHRvIGF2b2lkIHdpbmRvd3MuaAorCWluY2x1c2lvbi4KKwkgIC0gSW50ZXJsb2NrZWRFeGNoYW5nZUFkZCBpcyBub3QgZGVjbGFyZWQgYW55bW9yZS4KKwkgIC0gSW50ZXJsb2NrZWRFeGNoYW5nZVBvaW50ZXIgaXMgb25seSB1c2VkIHdoZW4gZGV0ZWN0aW5nIDY0IGJpdHMKKwkgICAgcGxhdGZvcm0gdGhhbmtzIHRvIHRoZSBfV0lONjQgbWFjcm8sIG90aGVyd2lzZSBJbnRlcmxvY2tlZEV4Y2hhbmdlCisJICAgIGlzIHVzZWQuCisKKzIwMDctMDMtMTUgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBidWlsZC9NYWtlZmlsZXMvbm1ha2UvdmM4Lm1hazogRGVmYXVsdCBNU1ZDIDIwMDUgYnVpbGQgaXMgbm93IGRvbmUKKwl3aXRob3V0IHNhZmUgc3RyaW5nIGZ1bmN0aW9ucyBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4KKworCSogc3RscG9ydC9zdGwvX2xvY2FsZS5oLCBfYWxsb2MuaCwgX3JvcGUuaDogTW92ZWQKKwlfU1RMUF9DSEVDS19SVU5USU1FX0NPTVBBVElCSUxJVFlfQVRfTElOS19USU1FIGludm9jYXRpb24gd2hlcmUgcHJvYmxlbQorCW1pZ2h0IGhhcHBlbiB3aGljaCBpcyBpbiB0aGUgcm9wZSBpbXBsZW1lbnRhdGlvbiBmb3IgY3VycmVudCB1c2UuIEEgZnV0dXJlCisJdXNlIHdpbGwgbmVlZCB0byBndWVzcyB3aGVyZSB0aGlzIGZ1bmN0aW9uIGhhcyB0byBiZSBpbnZva2VkLgorCisJKiBzdGxwb3J0L3N0bC9jb25maWcvZmVhdHVyZS5oOiBGaXhlZCBfU1RMUF9VU0VfTk9fSU9TVFJFQU1TIGNoZWNrIHRvIHVuZGVmCisJX1NUTFBfQ0hFQ0tfUlVOVElNRV9DT01QQVRJQklMSVRZX0FUX0xJTktfVElNRSBtYWNyby4KKworCSogc3RscG9ydC9zdGwvY29uZmlnL193aW5kb3dzLmg6IEZvciBwZXJmb3JtYW5jZSByZWFzb24KKwlfU1RMUF9DSEVDS19SVU5USU1FX0NPTVBBVElCSUxJVFlfQVRfTElOS19USU1FIHN5c3RlbSBpcyBvbmx5IHVzZWQgaW4gZGVidWcKKwltb2RlIChkZXRlY3RlZCB0aGFua3MgdG8gX0RFQlVHIG1hY3JvKS4KKworMjAwNy0wMy0xMyAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIE1lcmdlZCB3aXRoIFNUTFBPUlRfNV8xIGJyYW5jaCByZXZpc2lvbiAyOTYzLgorCisJKiBzcmMvbG9jYWxlX2NhdGFsb2cuY3BwOiBVc2UgQyBjYXN0IGZvciBDIHN0cnVjdCBsaWtlIF9Mb2NhbGVfY3R5cGUsCisJaXQgbWFrZXMgQm9ybGFuZCBjb21waWxlciBoYXBwaWVyLgorCisJKiBzdGxwb3J0L3N0bC9fc3RyaW5nLmg6IE1hZGUgaW5oZXJpdGFuY2UgcmVsYXRpb24gYmV0d2VlbiBiYXNpY19zdHJpbmcKKwlhbmQgX1N0cmluZ19iYXNlIGNsYXNzIHB1YmxpYyBmb3IgRE1DLgorCisJKiBzcmMvZGxsX21haW4uY3BwLCBzdGxwb3J0L3N0bC9jb25maWcvZmVhdHVyZXMuaCwKKwlzdGxwb3J0L3N0bC9fbG9jYWxlLmgsIF9hbGxvYy5oOiBBZGQgYSBuZXcgbWVjYW5pc20gdG8gZGV0ZWN0IGxpYnJhcnkKKwlidWlsZC91c2UgaW5jb25zaXN0ZW55IGF0IGxpbmsgdGltZS4KKwlfU1RMUF9DSEVDS19SVU5USU1FX0NPTVBBVElCSUxJVFlfQVRfTElOS19USU1FIG1hY3JvIGNvbnRhaW5zIGEKKwlmdW5jdGlvbiBuYW1lIGRlY2xhcmVkIGluIGZlYXR1cmVzLmggYW5kIGRlZmluZWQgaW4gZGxsX21haW4uY3BwLgorCVRoaXMgZnVuY3Rpb24gbmFtZSBkZXBlbmRzIG9uIHRoZSBidWlsZCBjb250ZXh0LiBJZiwgd2hlbiB1c2luZyB0aGUKKwlsaWJyYXJ5LCB0aGlzIG1hY3JvIGNvbnRhaW5zIGFuIG90aGVyIGZ1bmN0aW9uIG5hbWUgYmVjYXVzZSBvZiBhCisJZGlmZmVyZW50IGNvbmZpZ3VyYXRpb24gY29udGV4dCBhbiB1bnJlc29sdmVkIHN5bWJvbCB3aWxsIGFwcGVhciBhdAorCWxpbmsgdGltZSBzaG93aW5nIHRoZSBtaXNzaW5nIGZ1bmN0aW9uIHN5bWJvbC4gRnVuY3Rpb24gbmFtZSBzaG91bGQKKwliZSBjaG9zZW4gY2FyZWZ1bGx5IHRvIG1ha2UgcHJvYmxlbSBhcyBleHBsaWNpdCBhcyBwb3NzaWJsZS4gRm9yIHRoZQorCW1vbWVudCBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gYXJiaXRyYXJ5IHBsYWNlcywgaW4gc3RkOjp1c2VfZmFjZXQKKwlmdW5jdGlvbiBhbmQgc3RkOjphbGxvY2F0b3IgY29uc3RydWN0b3IuIAorCisJKiBzdGxwb3J0L3N0bC9jb25maWcvX3dpbmRvd3MuaDogVXNlCisJX1NUTFBfQ0hFQ0tfUlVOVElNRV9DT01QQVRJQklMSVRZX0FUX0xJTktfVElNRSBtYWNybyB0byBkZXRlY3QKKwlpbmNvbnNpc3RlbmN5IHdoZW4gYnVpbGRpbmcgU1RMcG9ydCBmb3IgV2luZG93cyA5NSBhbmQgdXNpbmcgaXQKKwlpbiBXaW5kb3dzIFhQIG9yIG9wcG9zaXRlLiBEZXBlbmRpbmcgb24gdGFyZ2V0dGVkIHBsYXRmb3JtLAorCV9SZWZjb3VudF9CYXNlIGhhcyBhIGRpZmZlcmVudCBzaXplb2Ygd2hpY2ggbGVhZCB0byB1bmRlZmluZWQKKwliZWhhdmlvciBhdCBydW50aW1lIGlmIHdlIGRvIG5vdCB1c2UgdGhpcyB0cmljay4KKworMjAwNy0wMy0xMyAgUGV0ciBPdnRjaGVua292ICA8Y29tcGxlbWVudEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHRlc3QvdW5pdC9zdHJpbmdfdGVzdC5jcHA6IGFkZCB0ZXN0IGZvciB0cml2aWFsIGNvbXBhcmUgd2l0aCBwbGFpbgorCWNoYXIgYXJyYXk7CisKKwkqIHRlc3QvdW5pdC9leGNlcHRpb25fdGVzdC5jcHA6IGFkZCB0ZXN0IGZvciB3aGF0KCkuCisKKzIwMDctMDMtMTAgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzdGxwb3J0L3N0bC9jb25maWcvX3dpbmRvd3MuaDogTWFqb3IgbW9kaWZpY2F0aW9uLCB3aGVuIGJ1aWxkaW5nCisJU1RMcG9ydCBsaWJzIHdpbmRvd3MuaCBvciBhZnguaCwgd2hlbiBfU1RMUF9VU0VfTUZDIGlzIGRlZmluZWQsIGlzCisJc3lzdGVtYXRpY2FsbHkgaW5jbHVkZWQgaW4gb3JkZXIgdG8gZGV0ZWN0IHRoZSBTREsgdmVyc2lvbiB1c2VkIHRvCisJdGhlIGxpYnJhcmllcy4gX3dpbmRvd3MuaCBpcyBub3cgdGhlIG9ubHkgcGxhY2UgaXMgdGhlIGxpYnJhcnkgd2hlcmUKKwl3aW5kb3dzLmggaXMgaW5jbHVkZWQuCisKKwkqIHNyYy9kbGxfbWFpbi5jcHAsIGZzdHJlYW0uY3BwLCBsb2NrX2ZyZWVfc2xpc3QuaCwKKwljX2xvY2FsZV93aW4zMi9jX2xvY2FsZV93aW4zMi5jOiBSZW1vdmVkIHJlZmVyZW5jZXMgdG8gd2luZG93cy5oIG5vdworCWluY2x1ZGVkIGZyb20gX3dpbmRvd3MuaC4KKworCSogc3RscG9ydC9zdGwvX2lzdHJlYW0uYzogQWRkIHBhcmVudGhlc2lzIG9uIGEgdXNlX2ZhY2V0IGNhbGwgdG8gbWFrZQorCVZDNiBoYXBweSB3aGVuIGJ1aWxkaW5nIHRoZSBsaWJyYXJ5LgorCisJKiB0ZXN0L3VuaXQ6IERpc2FibGUgdGVzdHMgY2hlY2tpbmcgaW5zdGFuY2lhdGlvbiBhbmQgdXNlIG9mCisJY29udGFpbmVycyB3aXRoIGFuIGluY29tcGxldGUgdHlwZSB3aGVuIHBvaW50ZXIgc3BlY2lhbGl6YXRpb24gaXMKKwllbmFibGUuCisKKwkqIHN0bHBvcnQvc3RsL2NvbmZpZy91c2VyX2NvbmZpZy5oOiBBZGQgY29tbWVudCBhYm91dCBsaW1pdGF0aW9uCisJb2YgcG9pbnRlciBzcGVjaWFsaXphdGlvbi4KKworCSogc3RscG9ydC9zdGwvX3N0cmluZy5oLCBfc3RyaW5nX3dvcmthcm91bmQuaDogTm93IHRoYXQgX1NUTFBfREVCVUcKKwltb2RlIGRvIG5vdCB1c2UgaW5oZXJpdGFuY2UgYW55bW9yZSwgdXNlIHByaXZhdGUgcmF0aGVyIHRoYW4KKwlwcm90ZWN0ZWQgbWVtYmVycyBpbiBiYXNpY19zdHJpbmcgaW1wbGVtZW50YXRpb24uIE9ubHkgZXhjZXB0aW9uCisJaXMgd2hlbiB1c2luZyBWQzYgd29ya2Fyb3VuZCwgdGhpcyBpcyB3aGF0IF9TVExQX1BSSVZBVEUgbWFjcm8gaXMKKwlmb3IuCisKKwkqIHNyYy9hbGxvY2F0b3JzLmNwcCwgc3RscG9ydC9zdGwvY29uZmlnL2ZlYXR1cmVzLmg6IFJlbW92ZWQKKwl1bmp1c3RpZmllZCBfU1RMUF9QUklWQVRFIG1hY3JvLgorCisyMDA3LTAzLTA5ICBQZXRyIE92dGNoZW5rb3YgIDxjb21wbGVtZW50QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3RscG9ydC9zdGwvY29uZmlnL19tc3ZjLmg6IHVzZSBNUydzIHNhZmUgc3RyaW5nIGZ1bmN0aW9ucyBvbmx5CisJaWYgX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIG5vdCBkZWZpbmVkIChzZWUgYnVnICMxNjc0OTc0KS4KKwlUaGFua3MgQnJvbmVrIEtvemlja2kuCisKKzIwMDctMDMtMDggIFBldHIgT3Z0Y2hlbmtvdiAgPGNvbXBsZW1lbnRAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzcmMvbnVtX2dldF9mbG9hdC5jcHA6IGV4cGVyaW1lbnRhbCBzdXBwb3J0IG9mIGNvcnJlY3QgaW5wdXQKKwlvZiBsb25nIGRvdWJsZXMgb24gTGludXhlcy4KKworCSogdGVzdC91bml0L251bV9wdXRfZ2V0X3Rlc3QuY3BwOiB0ZXN0IGZvciBjb3JyZWN0IGlucHV0IG9mIGZsb2F0LAorCWRvdWJsZSBhbmQgbG9uZyBkb3VibGUsIGluY2x1ZGluZyB2YWx1ZXMgb3V0IG9mIHR5cGUgcmFuZ2UuCisKKwkqIHN0bHBvcnQvc3RsL2NvbmZpZy9fbGludXguaDogbWFyayB0aGF0IEFscGhhLCBQb3dlclBDLAorCTMyLWJpdCBTUEFSQywgMzItYml0IE1JUFMsIEFSTSwgU0g0IGhhcyBubyBsb25nIGRvdWJsZS4KKworMjAwNy0wMy0wNSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIFN5bmNocm9uaXphdGlvbiB3aXRoIFNUTFBPUlRfNV8xIGJyYW5jaCByZXZpc2lvbiAyOTQ1LgorCisyMDA3LTAyLTE5ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3RscG9ydC9zdGw6IHN3YXAgd29ya2Fyb3VuZCByZXZpZXcsIG5vdyB3aGVuIHN3YXAgaW1wbGVtZW50YXRpb24KKwlkZXRlY3QgdGhhdCBhIFNUTHBvcnQgY2xhc3MgaXMgYmVpbmcgc3dhcHBlZCBpdCBjYWxscyB0aGUKKwlfTV9zd2FwX3dvcmthcm91bmQgbWVtYmVyIG1ldGhvZC4gV2UgZG8gbm90IHVzZSB0aGUgc3dhcCBtZXRob2QKKwlhbnltb3JlIGJlY2F1c2UgdGhlIHdheSB0aGUgd29ya2Fyb3VuZCBpcyBpbXBsZW1lbnRlZCB3b3VsZCBoYXZlCisJZm9yY2VzIHVzIHRvIGFkZCBhIHN3YXAgbWV0aG9kIHRvIHF1ZXVlLCBwcmlvcml0eV9xdWV1ZSBhbmQgc3RhY2sKKwljb250YWluZXJzIHRoYXQgZG8gbm90IGhhdmUgYSBzd2FwIG1ldGhvZCBhY2NvcmRpbmcgdGhlIEMrKyBTdGFuZGFyZC4KKworMjAwNy0wMi0xNSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIFN5bmNocm9uaXphdGlvbiB3aXRoIFNUTFBPUlRfNV8xIGJyYW5jaCB1cCB0byByZXZpc2lvbiAyOTE4LgorCisyMDA3LTAyLTEzICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3RscG9ydC9zdGwvY29uZmlnL2ZlYXR1cmVzLmgsIF9tc3ZjLmgsIHN0bF9teWNvbXAuaDogUmVtb3ZlZAorCV9TVExQX1VTSU5HX05BTUVTUEFDRV9CVUcgbWFjcm8gY29uZmlnLiBTVExwb3J0IHByaXZhdGUgbmFtZXNwYWNlCisJaXMgbm93IGFsd2F5cyBuZXN0ZWQgaW4gc3RscG9ydCBvbmUuIE1ha2VzIG5hbWVzcGFjZSBtYW5hZ2VtZW50CisJZWFzaWVyLgorCisJKiBzdGxwb3J0L3N0bC9fYWxnb2Jhc2UuaDogUmVzdG9yZSB3b3JrYXJvdW5kIGZvciBjb21waWxlcnMKKwlub3Qgc3VwcG9ydGluZyB0ZW1wbGF0ZSBmdW5jdGlvbiBwYXJ0aWFsIG9yZGVyaW5nIGZlYXR1cmUsIHdhcworCXJlc3VsdGluZyBpbiByZWdyZXNzaW9uIGZvciBhIG51bWJlciBvZiBjb21waWxlcnMsIFZDNiwgQm9ybGFuZHMuCisJQSB0ZW1wbGF0ZSBjbGFzcyBsaWtlIF9Td2FwSW1wbGVtZW50ZWQgZG8gbm90IGhhdmUgdG8gYmUgc3BlY2lhbGl6ZWQKKwl0byBiZSB1c2VmdWwsIHRoaXMgY2xhc3MgaXMgdXNlZCB0byBkZXRlY3QgdHlwZXMgaGF2aW5nIGEgc3dhcAorCW1ldGhvZC4gRGV0ZWN0aW9uIGlzIGJhc2VkIG9uIHRoZSBjbGFzcyBiZWluZyBmbGFnZ2VkIGFzIFNUTHBvcnQKKwljbGFzcyB0aGFua3MgdG8gdGhlIF9fc3RscG9ydF9jbGFzcyBpbmhlcml0YW5jZS4KKworCSogdGVzdC91bml0L3N3YXBfdGVzdC5jcHA6IEFkZCBtYWNybyBjaGVja3MgdG8gaWdub3JlIHRlc3QgZm9yCisJY29tcGlsZXJzIHdlIGtub3cgbm90IGJlaW5nIGFibGUgdG8gc3VwcG9ydCBpdC4KKworMjAwNy0wMi0xMiAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHN0bHBvcnQvc3RsL2NvbmZpZy9mZWF0dXJlcy5oOiBBZGQgbmVjZXNzYXJ5IG1hY3JvIHRvIHdvcmsKKwl3aXRoIHRyMSBuYW1lc3BhY2Ugb2YgdGhlIEMrKyB0ZWNobmljYWwgcmVwb3J0LgorCisJKiBzdGxwb3J0L3N0bC9fdW5vcmRlcmVkX3NldC5oLCBfdW5vcmRlcmVkX21hcC5oOiBQdXQgdW5vcmRlcmVkCisJY29udGFpbmVycyBpbiB0cjEgbmFtZXNwYWNlLgorCisJKiB0ZXN0L3VuaXQvdW5vcmRlcmVkX3Rlc3QuY3BwLCBtdmN0b3JfdGVzdC5jcHAsCisJbXZjdG9yX2RlY2xhcmF0aW9uX3Rlc3QuY3BwOiBBZGQgbmVjZXNzYXJ5IHVzaW5nIGRpcmVjdGl2ZQorCXRvIGFjY2VzcyB0cjEgbmFtZXNwYWNlLgorCisyMDA3LTAyLTEyICBQZXRyIE92dGNoZW5rb3YgIDxjb21wbGVtZW50QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogUmVwb3NpdG9yeTogcmV2ZXJ0IGJhY2sgcjI5MDg7CisKKwkqIHRlc3QvdW5pdC9zd2FwX3Rlc3QuY3BwOiB0ZXN0IHRoYXQgc3dhcCggYSwgYiApIGhhcyBzcGVjaWFsaXphdGlvbgorCWEuc3dhcCggYiApLCB3aGVuIHJlcXVpcmVkOworCisJKiBzdGxwb3J0L3N0bC9fYWxnb2Jhc2UuaDogX1N3YXBJbXBsZW1lbnRlZCB1c2VsZXNzLCBiZWNhdXNlIGl0IG5ldmVyCisJc3BlY2lhbGl6ZWQgZWxzZXdoZXJlLS0tcmVtb3ZlIHN3YXAgc3BlY2lhbGl6YXRpb24gaGVyZSwgdXNlIGluc3RlYWQKKwlzd2FwIHNwZWNpYWxpemF0aW9uIGZyb20gX3JlbG9wc19jb250LmgsIHdoZW4gcmVxdWlyZWQuCisKKzIwMDctMDItMDcgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBsb2NhbGVfaW1wbC5jcHAsIG1vbmV0YXJ5LmNwcCwgbnVtX2dldC5jcHAsIG51bV9wdXQuY3BwLAorCXRpbWVfZmFjZXRzLmNwcDogTW92ZWQgYWxsIF9HZXRGYWNldElkIGltcGxlbWVudGF0aW9ucyBpbgorCXRoZSBzYW1lIHRyYW5zbGF0aW9uIHVuaXQgYXMgdGhlIG9uZSB3aGVyZSBpZCBhcmUgaW5pdGlhbGl6ZWQuCisKKzIwMDctMDItMDUgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzdGxwb3J0L3N0bC9fYWxsb2MuaCwgYWxsb2NhdG9ycy5jcHA6IE1vdmVkIF9BTElHTiBhbmQKKwlfQUxJR05fU0hJRlQgY29uc3RhbnQgZGVmaW5pdGlvbiBpbiBzb3VyY2UgZmlsZSB3aGVyZSBpdCBpcyB1c2VkCisJX01BWF9CWVRFUyBpcyB1c2VkIGluIGRlcXVlIGltcGxlbWVudGF0aW9uLiBNb3Jlb3ZlciB0aG9zZQorCWNvbnN0YW50IHZhbHVlIG5vdyBkZXBlbmRzIG9uIHNpemVvZih2b2lkKikgdG8gYXZvaWQgcHJlcHJvY2Vzc29yCisJY2hlY2sgbGlrZSBfV0lONjQuCisKKwkqIHN0bHBvcnQvc3RsL192ZWN0b3IuaCwgX3ZlY3Rvci5jOiBNb3ZlZCBfX3R5cGVfdHJhaXRzCisJaW5zdGFuY2lhdGlvbnMgaW4gbWV0aG9kcyB0aGF0IG5lZWQgaXQgaW4gb3JkZXIgdG8gYmUgYWJsZSB0bworCWFjY2VzcyBuZXN0ZWQgdHlwZXMgbGlrZSBpdGVyYXRvciBldmVuIGlmIHR5cGUgdXNlZCB0byBpbnN0YW5jaWF0ZQorCXRoZSB2ZWN0b3IgaXMgbm90IHlldCBjb21wbGV0ZWx5IGRlZmluZWQuCisKKwkqIHN0bHBvcnQvc3RsL19kZXF1ZS5oLCBfZGVxdWUuYzogUmVtb3ZlZCB1c2VsZXNzIF9fdHlwZV90cmFpdHMKKwlpbnN0YW5jaWF0aW9ucy4gRm9yIHRoZSBzYW1lIHJlYXNvbiB0aGFuIGFib3ZlLCBfX2J1ZmZlcl9zaXplCisJY29uc3RhbnQgaGFzIGJlZW4gcmVwbGFjZWQgYnkgYSBmdW5jdGlvbiBjb21wdXRpbmcgZGVxdWUgYnVmZmVyCisJc2l6ZSBhdCBydW50aW1lLgorCisJKiBzdGxwb3J0L3N0bC9faGFzaHRhYmxlLmgsIF9oYXNodGFibGUuYzogRm9yIHRoZSBzYW1lIHJlYXNvbiB0aGFuCisJYWJvdmUsIGhhc2h0YWJsZSBkbyBub3QgY29udGFpbnMgYW55bW9yZSBhbiBpbnN0YW5jZSBvZiB0aGUgX0V4SyB0eXBlCisJd2hpY2ggaXMgdXNlZCB0byBleHRyYWN0IHRoZSBrZXkgcGFydCBmcm9tIGEgdmFsdWUgaW5zdGFuY2UuIFRoaXMKKwlpbnN0YW5jZSB3YXMgbm90IHJldHVybmVkIGluIGFueSBtZXRob2Qgb2YgdGhlIGhhc2h0YWJsZSB0eXBlLiBBbgorCXVudXNlZCBjb25zdHJ1Y3RvciB0YWtpbmcgYW4gaW5zdGFuY2Ugb2YgdGhpcyB0eXBlIGhhcyBiZWVuIHJlbW92ZWQuCisKKwkqIHRlc3QvdW5pdC92ZWN0b3JfdGVzdC5jcHAsIGRlcXVlX3Rlc3QuY3BwLCBsaXN0X3Rlc3QuY3BwLAorCXNsaXN0X3Rlc3QuY3BwLCBtYXBfdGVzdC5jcHAsIHNldF90ZXN0LmNwcCwgaGFzaF90ZXN0LmNwcCwKKwl1bm9yZGVyZWRfdGVzdC5jcHA6IEFkZCBjb21waWxhdGlvbiB0ZXN0cyB0byBjaGVjayB0aGF0IHRoZSBjb250YWluZXIKKwlpdGVyYXRvciBuZXN0ZWQgdHlwZSBpcyBhY2Nlc3NpYmxlICBldmVuIGlmIHR5cGUgdXNlZCB0byBpbnN0YW5jaWF0ZQorCXRoZSBjb250YWluZXIgaXMgbm90IHlldCBjb21wbGV0ZWx5IGRlZmluZWQuCisKKzIwMDctMDItMDIgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzcmMvY19sb2NhbGUuaDogQWRkIHR5cGUgaW5mb3JtYXRpb24gZm9yIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zCisJb2YgdGhlIGxvY2FsaXphdGlvbiBzdXBwb3J0IEFQSToKKwkgIC0gX0xvY2FsZV8qX2NyZWF0ZQorCSAgLSBfTG9jYWxlXypfZGVzdHJveQorCSAgLSBfTG9jYWxlXypfbmFtZQorCUFsc28gYWRkIHNvbWUgdmFyaWFibGUgbmFtZSB0byBtYWtlIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBtb3JlCisJZXhwbGljaXQuCisKKwkqIHNyYy9jX2xvY2FsZV93aW4zMi9jX2xvY2FsZV93aW4zMi5jLAorCXNyYy9jX2xvY2FsZV9nbGliYy9jX2xvY2FsZV9nbGliYy5jLCBjX2xvY2FsZV9nbGliYzIuYzogQWRhcHRlZCB0bworCWNvbmZvcm0gdG8gbmV3IGxvY2FsaXphdGlvbiBBUEkgZnVuY3Rpb25zIHByb3RvdHlwZXMuIEFkYXB0YXRpb24KKwlpbiBnbGliYyBiZWZvcmUgMi4yIGhhcyBiZWVuIHVwZGF0ZWQgYnV0IGNvbXBpbGF0aW9uIGhhc24ndCBiZWVuCisJY29tcGxldGVkIGJlY2F1c2Ugb2YgdGhlIGxhY2sgb2YgdGhlIGdsaWJjIHJlcXVpcmVkIHZlcnNpb24uCisKKwkqIHNyYy9sb2NhbGVfY2F0YWxvZy5jcHA6IE5vdyB3cmFwcGVyIGZ1bmN0aW9ucyBhcmUgdXNlZCB0bworCW9mZmVyIGEgaG9tb2dlbmVvdXMgcHJvdG90eXBlIHRvIHR5cGUgc2FmZSBsb2NhbGl6YXRpb24gQVBJCisJZnVuY3Rpb25zLgorCisyMDA3LTAyLTAyICBQZXRyIE92dGNoZW5rb3YgIDxjb21wbGVtZW50QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogdGVzdC91bml0L2hhc2hfdGVzdC5jcHA6IGFkZCB0ZXN0IGZvciBoYXNoX211bHRpbWFwLCBlcXVpdmFsZW50CisJa2V5cyBwcm9ibGVtIG9uIHNvbWUgZGF0YSBzZXRzIFt0aGlzIGlzIHJlZ3Jlc3Npb24gdGVzdCwgc3VnZ2VzdGVkCisJYnkgdGVmIGZvciA1LjAuMiwgYnVnIHJlcG9ydCAjMTYwNjMwOF0uCisKKzIwMDctMDEtMjkgIFBldHIgT3Z0Y2hlbmtvdiAgPGNvbXBsZW1lbnRAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzdGxwb3J0L3N0bC9kZWJ1Zy9fZGVxdWUuaDogdHlwZW5hbWUgcmVxdWlyZWQuCisKKwkqIHRlc3QvdW5pdC9zc3RyZWFtX3Rlc3QuY3BwOiB0ZXN0IGZvciBzZWVrcCBhZGRlZC4KKworMjAwNy0wMS0yOCAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGJ1aWxkL01ha2VmaWxlcy9nbWFrZTogQm9ybGFuZCBwYXRjaCBmcm9tIEVyaWMgU2FuZm9yZCB0byBpbnN0YWxsCisJLnRkcyBmaWxlIGZvciBCb3JsYW5kIGRlYnVnZ2VyLgorCisJKiB0cnVuayBzeW5jaHJvbml6ZWQgd2l0aCBTVExQT1JUXzVfMSBicmFuY2ggdXAgdG8gcmV2aXNpb24gMjg5NS4KKworCSogc3RscG9ydC9zdGwvX3RocmVhZHMuaDogQ2hhbmdlZCB3YXkgb2YgaW5jbHVkaW5nIGhlYWRlcnMgZm9yCisJX1NUTFBfVUlUSFJFQURTIHBsYXRmb3JtLiBXZSBub3cgaW5jbHVkZSBpbnRlcm5hbCBTVExwb3J0IGhlYWRlcnMKKwlyYXRoZXIgdGhhbiBTdGFuZGFyZCBvbmVzLiBJdCB3YXMgZXNwZWNpYWxseSBpbXBvcnRhbnQgZm9yIFN1bgorCVN0dWRpbyBjb21waWxlciB0aGF0IG5hdGl2ZWx5IGluY2x1ZGUgU3RhbmRhcmQgaGVhZGVycyBvbmx5IG9uY2UuCisKKzIwMDctMDEtMjUgIFBldHIgT3Z0Y2hlbmtvdiAgPGNvbXBsZW1lbnRAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzcmMvZmFjZXRzX2J5bmFtZS5jcHA6IHdlIHNlYXJjaCB3aXRoaW4gc2NvcGUsIHNwZWNpZmllZCBieSBtYXNrLAorCXNvIF9Mb2NhbGVfd2NoYXJfY3R5cGUgcmV0dXJuIGNhbid0IGJlIGJleW9uZCBvZiB0aGlzIG1hc2suCisKKwkqIHNyYy9jX2xvY2FsZV9nbGliYy9jX2xvY2FsZV9nbGliYzIuYzogX0xvY2FsZV93Y2hhcl9jdHlwZQorCWltcGxlbWVudGVkLgorCisJKiB0ZXN0L3VuaXQvbG9jYWxlX3Rlc3QuY3BwOiB0ZXN0IGZvciBjdHlwZSBmYWNldCBmb3Igd2NoYXJfdCBhZGRlZC4KKworMjAwNy0wMS0yMyAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHN0bHBvcnQvc3RsL19sb2NhbGUuaDogSW50cm9kdWN0aW9uIG9mIHRoZSBfR2V0RmFjZXRJZCBmdW5jdGlvbgorCXRvIGlzb2xhdGUgYWNjZXNzIHRvIGZhY2V0IGlkIGluc3RhbmNlIGluIG9uZSBwbGFjZS4gSXQgZ3VhcmFudHkgdGhhdAorCXRoZSBmYWNldCBpZCBpbnN0YW5jZXMgaW5pdGlhbGl6ZWQgaW4gX1N0bF9sb2NfYXNzaWduX2lkcyBmdW5jdGlvbgorCWFyZSB0aGUgc2FtZSBhcyB0aGUgb25lcyB1c2VkIGJ5IHN0cmVhbXMgdG8gZm9ybWF0IG91dHB1dC4gTWFueSBjb21waWxlcnMKKwloYXZlIHByb2JsZW0gd2l0aCB0ZW1wbGF0ZSBjbGFzcyBzdGF0aWMgdmFyaWFibGUgYW5kIGR1cGxpY2F0ZSB0aGVtCisJYXJyb3VuZCB0aGUgZGlmZmVyZW50IHNoYXJlZCBsaWJyYXJ5IGRlcGVuZGluZyBvbiBTVExwb3J0LgorCisJKiBzdGxwb3J0L3N0bC9fbW9uZXRhcnkuaCwgX251bV9nZXQuaCwgX251bV9wdXQuaCwgX3RpbWVfZmFjZXRzLmg6CisJQWRkIF9HZXRGYWNldElkIG92ZXJsb2FkcyBmb3IgbW9uZXlfZ2V0LCBtb25leV9wdXQsIG51bV9nZXQsIG51bV9wdXQsCisJdGltZV9nZXQsIHRpbWVfcHV0IGZhY2V0cyB0aGF0IGFyZSBleHBvc2VkIGFzIHRlbXBsYXRlIGZhY2V0cy4gT3RoZXIKKwlmYWNldHMgYXJlIGZ1bGx5IHNwZWNpYWxpemVkIHRlbXBsYXRlIGNsYXNzZXMgd2hvc2UgaWQgc2hvdWxkIGJlCisJY29ycmVjdGx5IGhhbmRsZSBieSBjb21waWxlcnMgbGlrZSBmb3IgYW55IHN0YXRpYyB2YXJpYWJsZSBpbiBhIG5vbgorCXRlbXBsYXRlIGNsYXNzLgorCisJKiBzcmMvbW9uZXRhcnkuY3BwLCBudW1fZ2V0LmNwcCwgbnVtX3B1dC5jcHAsIHRpbWVfZmFjZXRzLmNwcDogQWRkCisJX0dldEZhY2V0SWQgaW1wbGVtZW50YXRpb24uCisKKwkqIHN0bHBvcnQvc3RsL19jb2xsYXRlLmg6IFVzZSBfR2V0RmFjZXRJZCBpbiBfX2xvY2FsZV9kb19vcGVyYXRvcl9jYWxsCisJaW1wbGVtZW50YXRpb24sIG5vdCByZXF1aXJlZCBidXQgbW9yZSBjb25zaXN0ZW50LgorCisJKiBzdGxwb3J0L3N0bC9fbW9uZXRhcnkuYywgX251bV9wdXQuYywgX251bV9nZXQuYywgX3RpbWVfZmFjZXRzLmMsCisJc3JjL2xvY2FsZV9pbXBsLmNwcDogUmVtb3ZlZCBub3cgdXNlbGVzcyBnY2MgQ3lnd2luIG9yIE1pbkdXIGFuZAorCUJvcmxhbmQgd29ya2Fyb3VuZHMuCisKKwkqIHRlc3QvdW5pdC9sb2NhbGVfdGVzdC5jcHA6IFJlbW92ZWQgZmFjZXRfaWQgdGVzdCBjYXNlLCBmYWNldCBpZAorCWluZGV4ZXMgYXJlIFNUTHBvcnQgaW50ZXJuYWwgc3R1ZmYgdGhhdCBzaG91bGRuJ3QgYmUgcGFydCBvZiBhIHVuaXQKKwl0ZXN0LiBXcm9uZyBmYWNldCBpZCBtYW5hZ2VtZW50IHdpbGwgYmUgc2hvd24gYnkgb3RoZXIgdGVzdHMuIE1vcmVvdmVyCisJdGhpcyB0ZXN0IHdhcyBmYWlsaW5nIGZvciBjb21waWxlcnMgZHVwbGljYXRpbmcgdGVtcGxhdGUgY2xhc3MKKwlzdGF0aWMgaW5zdGFuY2VzLgorCisyMDA3LTAxLTIwICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3RscG9ydC9zdGwvX2NtYXRoLmgsIF9jc3RkbGliLmgsIGNvbmZpZy9fd2F0Y29tLmg6IFNtYWxsCisJZXZvbHV0aW9uIGZvciBPcGVuIFdhdGNvbSBzdXBwb3J0LgorCisJKiBTeW5jaHJvbml6YXRpb24gb2YgdHJ1bmsgZnJvbSBTVExQT1JUXzVfMSBicmFuY2ggZnJvbSByZXZpc2lvbgorCTI3NTAgdG8gcmV2aXNpb24gMjg3MS4KKworCSogc3RscG9ydC9zdGwvY29uZmlnL2ZlYXR1cmVzLmgsIF9nY2MuaCwgX2ludGVsLmgsIF9tc3ZjLmgsIF9zZ2kuaDoKKwlNYWpvciBleGNlcHRpb24gcG9saWN5IG1vZGlmaWNhdGlvbiwgX1NUTFBfTk9USFJPVyBkZWZhdWx0IHZhbHVlCisJaXMgbm93IHRocm93KCkgd2hlbiBleGNlcHRpb24gc3VwcG9ydCBpcyBhY3RpdmF0ZWQuIENvbXBpbGVycyBub3QKKwlzdXBwb3J0aW5nIGlzIHNob3VsZCBkZWZpbmUgdGhpcyBtYWNybyBhcyBlbXB0eS4gQ29uZmlndXJhdGlvbiBmaWxlcworCW9mIGNvbXBpbGVycyBhbHJlYWR5IG1hbmFnaW5nIHRoaXMgZmVhdHVyZSBoYXZlIGJlZW4gdXBkYXRlZC4KKworMjAwNy0wMS0xOSAgUGV0ciBPdnRjaGVua292ICA8Y29tcGxlbWVudEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHN0bHBvcnQvc3RsL2NvbmZpZy9ob3N0Lmg6IGRlZmluZSBvbmUgb2YgX19TdW5PU181X3ggbWFjcm8KKwlmb3IgZ2NjIChkdXJpbmcgaW5zdGFsbGF0aW9uPykgb24gU29sYXJpczsgbm90ZSwgdGhhdCBTb2xhcmlzCisJc3lzdGVtIG1heSBoYXMgcGF0Y2ggd2l0aCBNQVRIX0YgYW5kIE1BVEhfTCBmdW5jdGlvbnMuCisKKwkqIHN0bHBvcnQvc3RsL2NvbmZpZy9fc29sYXJpcy5oOiByZW1pbmRlciBmb3IgX19TdW5PU181X3gKKwltYWNybyBkZWZpbml0aW9uIGZvciBnY2M7IHR1cm4gb24vb2ZmIE1BVEhfRi9NQVRIX0wgZnVuY3Rpb25zCisJcHJlc2VudDogc2VlIGJlYWNvbiB0aGF0IGRlcGVuZHMgdXBvbiBTb2xhcmlzIHZlcnNpb24gYW5kIHBhdGNoIHByZXNlbnQsCisJYXMgZGVmaW5lZCBieSBTdW5Qcm8gY29tcGlsZXJzIG9yIGluIGhvc3QuaC4gVGhhbmtzIHRvIEdyYWhhbSBSZWVkLgorCisJKiBzdGxwb3J0L3N0bC9jb25maWcvX3N1bnByb2NjLmg6IGlmIHVzZSBuZXctYy1oZWFkZXJzLCBTdW5Qcm8KKwlpbmNsdWRlIGlzby9zdGRsaWJfaXNvLmggaW5zdGVhZCBvZiBzdGRsaWIuaDsgbm90ZSwgdGhhdCB0aGlzIGV4Y2x1ZGUKKwl1c2FnZSBvZiBsb25nIGRvdWJsZSwgbG9uZyBsb25nLCBldGMuIGZ1bmN0aW9ucywgZXZlbiB3aGVuIG9uZXMgcHJlc2VudAorCWluIE9TLiBUaGFua3MgdG8gR3JhaGFtIFJlZWQuIEJ1Z3JlcG9ydCAxNjMwOTQzLgorCisyMDA3LTAxLTE4ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3RscG9ydC9zdGwvX251bV9wdXQuYzogQWRkIGNhc3QgdG8gYXZvaWQgZ2NjIHdhcm5pbmcuCisKKwkqIHN0bHBvcnQvc3RsL19wYWlyLmgsIF9jb25zdHJ1Y3QuaDogQWRkIF9TVExQX05PX01PVkVfU0VNQU5USUMKKwliZWZvcmUgaW5jbHVzaW9uIG9mIF9tb3ZlX2NvbnN0cnVjdF9md2suaC4KKworCSogc3RscG9ydC9zdGwvX2lzdHJlYW0uYzogUmVtb3ZlZCB1c2VsZXNzIGNhc3QgdG8gbnVtX2dldCBmYWNldC4KKworCSogc3JjL3N5c3RlbV9hcGkuYzogTW92ZSBtYWNybyBjaGVjayB0byBhdCBsZWFzdCBpbmNsdWRlIG1hdGguaAorCWluIG9yZGVyIHRvIGF2b2lkIGFuIGVtcHR5IHRyYW5zbGF0aW9uIHVuaXQgd2hpY2ggY2FuIGdlbmVyYXRlCisJY29tcGlsYXRpb24gd2FybmluZy4KKworMjAwNy0wMS0xNyAgUGV0ciBPdnRjaGVua292ICA8Y29tcGxlbWVudEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHN0bHBvcnQvc3RsL19jbWF0aC5oOiBtb3ZlIGh5cG90IGluIGdsb2JhbCBuYW1lc3BhY2UgZm9yIFN1blNvZnQ7CisJc3VnZ2VzdGVkIGJ5IEdyYWhhbSBSZWVkLgorCisyMDA3LTAxLTE1ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogdGVzdC91bml0L2xvY2FsZV90ZXN0LmNwcDogVXBncmFkZSBSdXNzaWFuIGN1cnJlbmN5IGFiYnJldmlhdGlvbgorCSdSVVInIHRvICdSVUInLiBUaGFua3MgVGl6aWFubyBNdWxsZXIsIGJ1ZyByZXBvcnQgMTYzNDg4Ni4KKworCSogdGVzdC91bml0L2NzdHJpbmdfdGVzdC5jcHA6IEZpeCB0ZXN0IHRvIGF2b2lkIHNvbWUgZ2NjIHdhcm5pbmdzLgorCisJKiBzdGxwb3J0L3N0bC9jb25maWcvX2djYy5oOiBBZGQgX1NUTFBfTk9USFJPVyBkZWZpbml0aW9uIGZvcgorCXRoaXMgY29tcGlsZXIgZm9yIEMrKyBTdGFuZGFyZCBjb21wbGlhbmN5LiBJdCBtaWdodCBhbHNvIGhlbHAgdGhlCisJY29tcGlsZXIgbm90IHRvIGVtaXQgZmFsc2Ugd2FybmluZyBhYm91dCBwb3RlbnRpYWwgdXNlIG9mCisJdW5pbml0aWFsaXplZCB2YXJpYWJsZSAoLVdhbGwgbW9kZSkuCisKKwkqIGJ1aWxkL2xpYi9NYWtlZmlsZS5pbmMsIHNyYy9zeXN0ZW1fYXBpLmgsIHN5c3RlbV9hcGkuYzogTmV3IHNvdXJjZQorCWZpbGUgdXNlZCBmb3IgcGxhdGZvcm0gZXhwb3Npbmcgc29tZSBmZWF0dXJlcyBvbmx5IHRvIEMgY29tcGlsZXIuIGZvcgorCXRoZSBtb21lbnQgdXNlZCB1bmRlciBIcCBVbml4IGZvciBHTlUgY29tcGlsZXIgYWNjZXNzIHRvIHBsYXRmb3JtCisJaXNmaW5pdGUsIGlzbmFuIGFuZCBpc2luZiBmdW5jdGlvbnMuCisKKwkqIHNyYy9udW1fcHV0X2Zsb2F0LmNwcDogUmVwbGFjZSBhIGxvdCBvZiB1bm9mZmljaWFsIEhwIFVuaXggc3BlY2lmaWMKKwljb2RlIHRvIGFjY2VzcyBmdW5jdGlvbnMgaXNmaW5pdGUsIGlzaW5mIG9yIGlzbmFuLiBSZXBsYWNlZCBieQorCXN5c3RlbV9hcGkuaC4KKworCSogYnVpbGQvTWFrZWZpbGVzL2dtYWtlL2hwLXV4L3N5cy5tYWs6IExvb2tzIGxpa2UgaW5zdGFsbCBjb21tYW5kCisJb24gdGhpcyBwbGF0Zm9ybSBpcyByYXRoZXIgZXhvdGljLCB1c2UgY3AgaW5zdGVhZC4KKworMjAwNy0wMS0xNCAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHN0bHBvcnQvc3RsL2NvbmZpZy9fc3lzdGVtLmg6IEFkZCBfX1NVTlBST19DIG1hY3JvIGNoZWNrIHRvCisJZGV0ZWN0IFN1biBQcm8gQyBjb21waWxlci4gVGhhbmtzIEdyYWhhbSBSZWVkIGJ1ZyByZXBvcnQgMTYzMDkxNi4KKworCSogc3RscG9ydC9zdGwvX2NzdGRsaWIuaDogQWRkIF9fU1VOUFJPX0NDIG1hY3JvIGNoZWNrIGJlZm9yZQorCWRlZmluaW5nIGFicyhsb25nKSBhbmQgZGl2KGxvbmcsIGxvbmcpIGFzIFN1biBwcm8gYWxyZWFkeQorCWRlZmluZWQgdGhlbS4gVGhhbmtzIEdyYWhhbSBSZWVkIGJ1ZyByZXBvcnQgMTYzMDk3Mi4KKworMjAwNy0wMS0wNyAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHN0bHBvcnQvc3RsOiBBZGQgX1NUTFBfTk9fTU9WRV9TRU1BTlRJQyBtYWNybyBjaGVja3MgdG8KKwljb21wbGV0ZWx5IGhpZGUgbW92ZSBzZW1hbnRpYyBmcmFtZXdvcmsgd2hlbiBub3QgbmVjZXNzYXJ5LgorCisyMDA3LTAxLTA1ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogdGVzdC91bml0L2JpdHNldF90ZXN0LmNwcDogQ2hlY2sgX1NUTFBfTk9OX1RZUEVfVE1QTF9QQVJBTV9CVUcKKwltYWNybyBiZWZvcmUgZG9pbmcgdGVzdHMgdGhhdCBkZXBlbmRzIG9uIGl0LgorCisJKiBzdGxwb3J0L3N0bC9fbGlzdC5oOiBBZGQgYXNzZXJ0aW9uIHRvIHNpZ25hbCBwb3RlbnRpYWwgc3RhY2sKKwlvdmVyZmxvdyBpbiByZWN1cnNzaXZlIGNhbGxzIHRvIGxpc3Q6Omluc2VydCBhbmQgbGlzdDo6c3BsaWNlIHRoYW5rcworCUFsZWtzZXkgU2FuaW4gaWRlYXIuCisKKwkqIGJ1aWxkL01ha2VmaWxlcy9nbWFrZS9saWIvZ2NjLm1hazogUmVtb3ZlZCBvYnNvbGV0ZSAtQyBsZCBvcHRpb24KKwlvbiBIcCBVbml4IHBsYXRmb3JtLgorCisJKiBzdGxwb3J0L3N0bC9fbWJzdGF0ZV90Lmg6IEF0dGVtcHQgdG8gZml4IFNUTHBvcnQgY29uZmlnIGZvciBjb21waWxlcnMKKwljb21pbmcgd2l0aCBhIG5hdGl2ZSBsaWIgZGVmaW5pbmcgbWJzdGF0ZV90IG9ubHkgZm9yIEMrKyBjb21waWxlcnMuCisJRm9yIHRob3NlIGNvbXBpbGVycyBuYXRpdmUgbWJzdGF0ZV90IGRlZmluaXRpb24gd29uJ3QgYmUgdXNlZCBmb3IKKwl0aGUgbW9tZW50LCBTVExwb3J0IHNpbXBseSBncmFudCBhIGR1bW15IGRlZmluaXRpb24gaW4gQy4gVGVzdAorCXVuZGVyIEhwIFVuaXggaGFzIHNob3duIHRoYXQgaXQgd29ya3MuCisKKzIwMDYtMTItMjkgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzcmMvaW9zdHJlYW0uY3BwLCBzdGxwb3J0L3N0ZGlvLmgsIHN0bC9fY3N0ZGlvLmg6IEVyaWMgU2FuZm9yZAorCXBhdGNoIHRvIG1vdmUgYSBCb3JsYW5kIHdvcmthcm91bmQgZnJvbSBjc3RkaW8gdG8gc3RkaW8uaC4KKworCSogc3RscG9ydC9zdGwvZGVidWc6IEdlbmVyYWxpemUgX1NUTFBfTk9fTU9WRV9TRU1BTlRJQyBjaGVjaworCXRvIGhpZGUgbW92ZSBjb25zdHJ1Y3RvcnMgbGlrZSBhbHJlYWR5IGRvbmUgaW4gbm9uIGRlYnVnCisJaW1wbGVtZW50YXRpb24uCisKKwkqIHN0bHBvcnQvc3RsL2NvbmZpZy9fbXN2Yy5oOiBSZXN0b3JlIG1vdmUgc2VtYW50aWMgZm9yIE1TVkM2LiBBRkFJUgorCW9ubHkgTVNWQyAuTmV0IDIwMDIgaGFkIHByb2JsZW0gd2l0aCBpdC4KKworCSogdGVzdC91bml0L3N0cnN0cmVhbV90ZXN0LmNwcDogTWFkZSB0aGUgdGVzdHMgZm9yIF9TVExQX0xPTkdfTE9ORworCWEgbGl0dGxlIGJpdCBtb3JlIHBvcnRhYmxlLgorCisyMDA2LTEyLTIwICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogdGVzdC91bml0L3N0cnN0cmVhbV90ZXN0LmNwcDogTmV3IHRlc3QgY2FzZSBmb3Igc291cmNlZm9yZ2UKKwlidWcgcmVwb3J0IDE2MTU1NTQuIE5vdCBjb25maXJtIGZvciB0aGUgbW9tZW50LgorCisJKiB0ZXN0L3VuaXQvbWF0aF9hdXguaCwgbXZjdG9yX3Rlc3QuaCwgc3RyaW5nX3Rlc3QuY3BwOiBGaXhlcworCXRvIGNvcnJlY3RseSB0YWtlIGludG8gYWNjb3VudCBfU1RMUF9VU0VfTkFNRVNQQUNFUy4KKworMjAwNi0xMi0xOSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHRlc3QvdW5pdC9idmVjdG9yX3Rlc3QuY3BwOiBGaXggbWFjcm8gY2hlY2sgZm9yIG5hbWVzcGFjZQorCXN1cHBvcnQuCisKKwkqIHRlc3QvdW5pdC9udW1fcHV0X2dldF90ZXN0LmNwcDogZGlzYWJsZSB3YXJuaW5nIGFib3V0IGZsb2F0CisJb3ZlcmZsb3cgZm9yIE1TVkMuCisKKzIwMDYtMTItMTcgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiB0ZXN0L3VuaXQ6IE9uZSBtb3JlIGNsZWFudXAgZm9yIGNvbXBpbGVycyBub3Qgc3VwcG9ydGluZyB0aGUKKwluYW1lc3BhY2UgZmVhdHVyZS4gVGhpcyB0aW1lIHdlIGF2b2lkIG5hbWVzcGFjZSBzcGVjaWZpY2F0aW9uIHdoZW4KKwlkb2luZyB0ZW1wbGF0ZSBzcGVjaWFsaXNhdGlvbiBvZiBTdGFuZGFyZCBmdW5jdG9yIGxpa2UgbGVzcyBvcgorCWFsbG9jYXRvci4KKworMjAwNi0xMi0xNSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHN0bHBvcnQvc3RsL2NvbmZpZy9fZG0uaCwgdGVzdC91bml0L21hcF90ZXN0LmNwcDogRXJpYyBTYW5mb3JkCisJcGF0Y2ggZm9yIERNQy4KKworMjAwNi0xMi0xMyAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHRlc3QvdW5pdC90ZXN0X21haW4uY3BwOiBDbGVhbiB1cCB1c2Ugb2YgbmFtZXNwYWNlIGZlYXR1cmUuCisKKwkqIHRlc3QvdW5pdDogQ2xlYW4gdXAgdXNlIG9mIHN0ZCBuYW1lc3BhY2Ugb3IgaWdub3JlIHRlc3RzIGlmCisJbmVjZXNzYXJ5LgorCisyMDA2LTEyLTEzICBQZXRyIE92dGNoZW5rb3YgIDxjb21wbGVtZW50QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3RscG9ydCwgc3JjOiBPcnBoYW4gY29kZSByZW1vdmVkIFtTeW1hbnRlYyB3aXRob3V0IG1haW50YWluYW5jZSBhIGxvbmcgdGltZTsKKwlnY2MgcHJpb3IgMi45NSBhbmQgMi45NiBjYW4ndCB3b3JrIHdpdGggY3VycmVudCBjb2RlIGluIGFueSBjYXNlOworCU5ldFdhcmUgdW5zdXBwb3J0ZWQgdG9vXQorCisyMDA2LTEyLTEzICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3RscG9ydC9zdGwvY29uZmlnL2ZlYXR1cmUuaDogRml4IGFuZCBnZW5lcmFsaXplIHRoZSBtdXRhYmxlCisJd29ya2Fyb3VuZCBmb3IgY29tcGlsZXJzIG1pc3NpbmcgdGhpcyBmZWF0dXJlLiBSZXBsYWNlCisJX1NUTFBfQVNTSUdOX01VVEFCTEUgd2l0aCBfU1RMUF9NVVRBQkxFIG1hY3JvIHRoYXQgaXMgbW9yZSBmbGV4aWJsZQorCWFzIG5vdCBsaW1pdGVkIHRvIGFzc2lnbm1lbnQuCisKKwkqIHN0bHBvcnQvc3RsL19pc3RyZWFtYnVmX2l0ZXJhdG9yLmgsIF9zdHJlYW1faXRlcmF0b3IuaCwgX3N0cmluZ19zdW0uaDoKKwlVc2UgX1NUTFBfTVVUQUJMRSByYXRoZXIgdGhhbiBtYW51YWxseSBoYW5kbGUgX1NUTFBfTkVFRF9NVVRBQkxFIG1hY3JvLgorCisJKiBzdGxwb3J0L3N0bC9fc3N0cmVhbS5oOiBSZW1vdmVkIHVzZWxlc3MgbXV0YWJsZSBxdWFsaWZpZXIgZm9yCisJYmFzaWNfc3RyaW5nYnVmIF9NX3N0ciBtZW1iZXIuCisKKwkqIHRlc3QvdW5pdC9iaW5kX3Rlc3QuY3BwOiBVc2UgU1RMcG9ydCBtdXRhYmxlIHdvcmthcm91bmQuCisKKwkqIHNyYy9tZXNzYWdlX2ZhY2V0cy5oLCBmYWNldHNfYnluYW1lLmNwcDogTGltaXQgdXNlIG9mIHRoZSBtdXRhYmxlCisJcXVhbGlmaWVkIHRvIG9uZSBtZW1iZXIgaW4gX01lc3NhZ2VfSW1wbCBjbGFzcyBhbmQgdXNlIF9TVExQX01VVEFCTEUKKwlpbiBjbGFzcyBpbXBsZW1lbnRhdGlvbi4KKworMjAwNi0xMi0xMSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHRlc3QvdW5pdC9tdmN0b3JfdGVzdC5jcHA6IFNwbGl0IGluIDIgb3RoZXIgdHJhbnNsYXRpb24gdW5pdAorCW12Y3Rvcl9kZWNsYXJhdGlvbl90ZXN0LmNwcCBhbmQgbXZjdG9yX3RyYWl0c190ZXN0LmNwcCB3aXRob3V0CisJaW1wYWN0aW5nIG51bWJlciBvZiB0ZXN0IGNhc2UuIEl0IGhlbHBzIERNQyB0byBwZXJmb3JtIGEgY29ycmVjdAorCWxpbmsuCisKKwkqIHN0bHBvcnQvc3RsL3R5cGVfbWFuaXBzLmg6IENoZWNrIF9TVExQX0RPTlRfVVNFX1BSSVZfTkFNRVNQQUNFIGJlZm9yZQorCWltcG9ydGluZyBfX3RydWVfdHlwZSBhbmQgX19mYWxzZV90eXBlIGluIHByaXZhdGUgbmFtZXNwYWNlLgorCisJKiBzdGxwb3J0L3N0bC9jb25maWcvX2RlYy5oLCBfYXBjYy5oOiBSZW1vdmVkIHJlZmVyZW5jZXMgdG8gdW51c2VkCisJX1NUTFBfSEFTX05PX05FV19JT1NUUkVBTVMgbWFjcm8uCisKKzIwMDYtMTItMTEgIFBldHIgT3Z0Y2hlbmtvdiAgPGNvbXBsZW1lbnRAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzcmMvZnN0cmVhbS5jcHAsIHN0bHBvcnQvc3RsL19mc3RyZWFtLmg6IG5vbi10ZW1wbGF0ZSBmcmllbmQgZnVuY3Rpb24KKwlvZiB0ZW1wbGF0ZSBjbGFzcyBpc24ndCBnb29kIGlkZWEuIEZpeGVkLgorCisyMDA2LTEyLTA5ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3RscG9ydC9zdGwvX3JhbmdlX2Vycm9ycy5oOiBUbyBjb21wbGV0ZSAyMDA2LTEyLTA0IG1vZGlmaWNhdGlvbgorCWZpeCBpbmNsdXNpb24gdG8gYWNjZXNzIHRvIHN0cmluZyBkZWZpbml0aW9uLiBJbiBub3JtYWwgbW9kZSB3ZSBpbmNsdWRlCisJc3RscG9ydC9zdGwvX3N0cmluZy5oIHJhdGhlciB0aGFuIHN0cmluZyBoZWFkZXIuIFRoZXJlIGlzIGEgc3BlY2lhbCBjYXNlCisJaG93ZXZlciBpZiBjdW11bGF0aW5nIF9TVExQX05PX0lPU1RSRUFNUywgX1NUTFBfRE9OVF9SRURFRklORV9TVEQgYW5kCisJX1NUTFBfV0hPTEVfTkFUSVZFX1NURCB0aGVuIGZ1bmN0aW9ucyBkZWZpbmVkIGluIF9yYW5nZV9lcnJvcnMuaCB3aWxsCisJdGhyb3cgZXhjZXB0aW9uIGZyb20gc3RkIG5hbWVzcGFjZSByYXRoZXIgdGhhbiBmcm9tIHN0bHBvcnQuCisKKwkqIHN0bHBvcnQvc3RsL2NvbmZpZy91c2VyX2NvbmZpZy5oOiBEb2N1bWVudGVkIGFib3ZlIG1vZGlmaWNhdGlvbi4KKworCSogc3RscG9ydC9zdGwvY29uZmlnL2ZlYXR1cmVzLmg6IE1vZGlmeSBfU1RMUF9WRU5ET1JfU1REIGRlZmluaXRpb24uIFRoaXMKKwlpbnRlcm5hbCBtYWNybyBkbyBub3QgaGF2ZSB0byB1c2UgX19zdGRfYWxpYXMsIHdpdGhpbiBTVExwb3J0IGNvZGUgc3RkIGlzCisJbm90IGEgbWFjcm8gYW5kIGNhbiBiZSB1c2VkIGFzIHRoZSB2ZW5kb3IgbmFtZXNwYWNlLgorCisyMDA2LTEyLTA3ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3RscG9ydC9zdGwvX2FsZ29iYXNlLmMsIGNvbmZpZy9mZWF0dXJlcy5oOiBSZW1vdmVkIHVudXNlZAorCV9TVExQX01QV19FWFRSQV9DT05TVCBtYWNyby4KKworCSogc3RscG9ydC9zdGwvY29uZmlnL193YXRjb20uaCwgX2RtLmgsIGZlYXR1cmUuaDogQWRkIG5ldyAKKwlfU1RMUF9OT19DT05TVF9JTl9QQUlSIG1hY3JvIGNvbmZpZyB0byBhdm9pZCBpbnN0YW5jaWF0aW9uIG9mCisJcGFpciB3aXRoIGEgY29uc3QgcXVhbGlmaWVkIHR5cGUuIF9TVExQX0NPTlNUIGlzIGRlZmluZWQgYmFzZWQKKwlvbiBfU1RMUF9OT19DT05TVF9JTl9QQUlSLgorCisJKiBzdGxwb3J0L3N0bC9fbWFwLmgsIF9oYXNoX21hcC5oLCBfdW5vcmRlcmVkX21hcC5oOiBBZGQgdXNlIG9mCisJX1NUTFBfQ09OU1QuCisKKwkqIHN0bHBvcnQvc3RsL19udW1fcHV0LmM6IEludHJvZHVjZSBfX2RvX3B1dF9ib29sIGZ1bmN0aW9uIGNvbnRhaW5pbmcKKwlhbGwgY29kZXMgdG8gcmVuZGVyIGJvb2wgdmFsdWVzLiBXZSBkbyBub3QgdXNlIGFueW1vcmUKKwlfX2NvcHlfaW50ZWdlcl9hbmRfZmlsbCBmdW5jdGlvbiB0aGF0IHdhcyBkaWZmaWN1bHQgdG8gaW5zdGFuY2lhdGUgZm9yCisJT3BlbiBXYXRjb20gY29tcGlsZXIuIE1vcmVvdmVyIHRoaXMgZnVuY3Rpb24gd2FzIG5vdCByZWFsbHkgYWRhcHRlZCBmb3IKKwliZWluZyB1c2UgaW4gdGhpcyBjb250ZXh0LCBjb2RlIGR1cGxpY2F0aW9uIGlzIHZlcnkgbGltaXRhdGVkIGFuZAorCWFic29sdXRlIG51bWJlciBvZiBsaW5lcyBvZiBjb2RlIGhhc24ndCBiZWVuIG1vZGlmaWVkLgorCisJKiBzdGxwb3J0L3N0bC9fZnN0cmVhbS5oLCBzcmMvZnN0cmVhbS5jcHA6IFJlbW92ZWQgdXNlbGVzcyBkZWNsYXJhdGlvbgorCW9mIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGZvciBfTm9jb252X2lucHV0IF9Ob2NvbnZfb3V0cHV0IGFuZCBfVW5kZXJmbG93LgorCV9VbmRlcmZsb3cgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gbm93IHVzZSBhIGZ1bmN0aW9uIF9fVW5kZXJmbG93X2RvaXQKKwl0byBhdm9pZCB0aGUgY29tcGxleCBzeW50YXggb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIGEgbWVtYmVyIG1ldGhvZCBvZgorCWEgdGVtcGxhdGUgY2xhc3Mgc3BlY2lhbGl6YXRpb24gaW4gZnN0cmVhbS5jcHAuCisKKwkqIHNyYy9tZXNzYWdlX2ZhY2V0cy5oOiBBZGQgbWlzc2luZyBhbGxvY2F0b3IgcGFyYW1ldGVyIGluIGhhc2hfbWFwCisJaW5zdGFuY2lhdGlvbiwgcmVxdWlyZWQgZm9yIGNvbXBpbGVyIGxhY2tpbmcgZGVmYXVsdCB0ZW1wbGF0ZSBwYXJhbWV0ZXJzCisJc3VwcG9ydC4KKworCSogc3JjL251bV9nZXRfZmxvYXQuY3BwOiBBZGQgdW5zaWduZWQgNjQgYml0cyBzdXBwb3J0IGZvciBPcGVuIFdhdGNvbS4KKworCSogc3RscG9ydC9zdGwvX2NtYXRoLmgsIF9jc3RkbGliLmg6IFNpZ25hbCB0aGF0IE9wZW4gV2F0Y29tIGhhcyBhbHJlYWR5CisJYWxsIG1hdGggZnVuY3Rpb25zIEMrKyBvdmVybG9hZHMgaW4gZ2xvYmFsIG5hbWVzcGFjZS4KKwkKKwkqIENsZWFudXAgb2YgYWxsIHdvcmthcm91bmRzIGZvciBNU1ZDIGJlZm9yZSB2ZXJzaW9uIDYuCisKKwkqIGJ1aWxkL01ha2VmaWxlcy9nbWFrZS9nY2MubWFrOiBIaWRlIC1mdmlzaWJpbGl0eSBvcHRpb24gZm9yIHdpbmRvd3MgYXMKKwlpbiB0aGlzIGNvbnRleHQgd2UgYXJlIG5vdCBhYmxlIHRvIGNvcnJlY3RseSBkZXRlY3QgZ2NjIHZlcnNpb24gaW4gdXNlLiAKKworCSogc3RscG9ydC9zdGwvX2ZzdHJlYW0uaDogUmVvcmRlciBtZW1iZXIgdmFyaWFibGVzIGluIF9GaWxlYnVmX2Jhc2UKKwl0byBhdm9pZCBnY2Mgd2FybmluZy4KKworMjAwNi0xMi0wNiAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIFNUTHBvcnQgNS4xLjAgcmVsZWFzZWQgYmFzZWQgb24gU1RMUE9SVF81XzEgYnJhbmNoIHJldmlzaW9uIDI3NTAuCisKKwkqIE1lcmdlIFNUTFBPUlRfNV8xIGJyYW5jaCBmcm9tIHJldmlzaW9uIDI3MTEgdG8gMjc0OS4KKworCSogc3RscG9ydC9zdGwvY29uZmlnL19ocHV4Lmg6IFNwZWNpZnkgdGhhdCBIcCBVbml4IGlzIGEgdW5peCBwbGF0Zm9ybQorCV9TVExQX1VOSVguIFRoaXMgcGxhdGZvcm0gd2FzIGFscmVhZHkgcmVjb2duaXNlIGFzIGEgdW5peCBwbGF0Zm9ybQorCWJ1dCBpdCBpcyBtb3JlIGNsZWFyIHRvIHB1dCBpdCBpbiBIcCBVbml4IGNvbmZpZ3VyYXRpb24gZmlsZS4KKworCSogc3JjL251bV9wdXRfZmxvYXQuY3BwOiBMaW1pdCBIcCBVbml4IHdvcmthcm91bmQgdG8gYWNjZXNzIGlzZmluaXRlCisJaXNuYW4gYW5kIHNvbWUgb3RoZXIgc3lzdGVtIGZ1bmN0aW9ucyB0byB0aGUgZ2NjIGNvbXBpbGVyLCBhQ0MgaGFzCisJbmF0aXZlbHkgYWNjZXNzIHRvIGl0LiBUZXN0cyBkb25lIGJ5IEJvcmlzIEd1YmVua28uCisKKzIwMDYtMTItMDQgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzdGxwb3J0L2ZzdHJlYW0sIGlvbWFuaXAsIGlvcywgaW9zZndkLCBpb3N0cmVhbSwgaXN0cmVhbSwgbG9jYWxlLAorCW9zdHJlYW0sIHNzdHJlYW0sIHN0cmVhbWJ1Ziwgc3Ryc3RyZWFtOiBBbGxvdyB1c2Ugb2YgaW9zdHJlYW0gaGVhZGVycworCWV2ZW4gd2hlbiBfU1RMUF9OT19JT1NUUkVBTVMgaXMgZGVmaW5lZCBpZiB1c2luZyBfU1RMUF9XSE9MRV9OQVRJVkVfU1RELgorCisyMDA2LTEyLTAyICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3RscG9ydC9zdGwvX3N0cmluZy5jOiBVc2UgZmluZF9lbmQgYWxnbyByYXRoZXIgdGhhbiBpbnRlcm5hbAorCV9fZmluZF9lbmQgZnVuY3Rpb24sIGZpbmRfZW5kIGNvbnRhaW5zIHdvcmthcm91bmQgZm9yIGxpbWl0ZWQKKwljb21waWxlcnMuCisKKwkqIHN0bHBvcnQvc3RsL19hbGdvLmM6IEF2b2lkIGEgdXNlbGVzcyBkZWZhdWx0IHZhbHVlIGZvciBsYXN0CisJcGFyYW1ldGVyIG9mIF9fc3RhYmxlX3BhcnRpdGlvbl9hdXhfYXV4IGZ1bmN0aW9uLgorCisJKiBzcmMvbnVtX3B1dC5jcHA6IEluIF9faW5zZXJ0X2dyb3VwaW5nX2F1eCwgdXNlIHRlbXBsYXRlIHBhcmFtZXRlcgorCVN0ciB0byBnZXQgaXRlcmF0b3IgZGVmaW5pdGlvbiByYXRoZXIgdGhhbiBnZXR0aW5nIGRlZmluaXRpb24gZnJvbQorCWJhc2ljX3N0cmluZy4KKworCSogc3RscG9ydC9zdGwvX251bV9nZXQuYywgX251bV9wdXQuYzogQ29tcGxldGUgYmFzaWNfc3RyaW5nCisJZGVmaW5pdGlvbiBmb3IgY29tcGlsZXIgbm90IHN1cHBvcnRpbmcgZGVmYXVsdCB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLgorCisJKiBzdGxwb3J0L2NtYXRoLCBjc3RkaW8sIHR5cGVpbmZvOiBNb2RpZmllZCB0byBiZSByZWVudHJhbnQgb25jZS4KKworCSogc3RscG9ydC9zdGwvX2FsbG9jLmgsIF9idmVjdG9yLmgsIF9jb25zdHJ1Y3QuaCwgX2RlcXVlLmgsCisJX2hhc2hfbWFwLmgsIF9oYXNoX3NldC5oLCBfaGFzaHRhYmxlLmgsIF9saXN0LmgsIF9tYXAuaCwgX3BhaXIuaCwKKwlfcXVldWUuaCwgX3JvcGUuaCwgX3NldC5oLCBfc2xpc3QuaCwgX3N0YWNrLmgsIF9zdHJpbmcuaCwKKwlfc3RyaW5nX2Jhc2UuaCwgX3N0cmluZ193b3JrYXJvdW5kLmgsIF90cmVlLmgsIF91bm9yZGVyZWRfbWFwLmgsCisJX3Vub3JkZXJlZF9zZXQuaCwgX3ZlY3Rvci5oOiBOb3cgX1NUTFBfTk9fTU9WRV9TRU1BTlRJQyBoaWRlIGFsbAorCWNhbGxzIHRvIF9Bc01vdmVTb3VyY2UgZnVuY3Rpb24uIAorCisyMDA2LTExLTMwICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogdGVzdC91bml0L3N0YWNrX2FsbG9jYXRvci5oOiBGaXhlZCBTdGFja0FsbG9jYXRvciBpbXBsZW1lbnRhdGlvbgorCWZvciBCb3JsYW5kIGFuZCBETUMgdGhhdCByZXF1aXJlZCBhIHdvcmthcm91bmQuCisKKwkqIHN0bHBvcnQvc3RsL2NvbmZpZy9fZ2NjLmg6IFN0YXJ0aW5nIHdpdGggZ2NjIDQsIHVzZSB2aXNpYmlsaXR5CisJZmVhdHVyZS4KKworCSogYnVpbGQvTWFrZWZpbGVzL2dtYWtlL2djYy5tYWs6IFN0YXJ0aW5nIHdpdGggZ2NjIDQsIGFkZAorCS1mdmlzaWJpbGl0eT1oaWRkZW4gY29tcGlsYXRpb24gb3B0aW9uLgorCisyMDA2LTExLTI4ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3RscG9ydC9zdGwvX2FsbG9jLmg6IEF2b2lkIGV4cGxpY2l0IGluc3RhbmNpYXRpb24gb2YgdGVtcGxhdGUKKwlmdW5jdGlvbiBfQXNNb3ZlU291cmNlLiBSZXBsYWNlIGludGVybmFsIGFsbG9jYXRvcjo6YWxsb2NhdGUgZnVuY3Rpb24KKwl3aXRoIF9NX2FsbG9jYXRlIHRvIGF2b2lkIHVzZSBvZiBvdmVybG9hZGluZy4KKworCSogc3RscG9ydC91dGlsaXR5OiBGaXggaGVhZGVyIHJlZW50cmFuY3kuCisKKwkqIHN0bHBvcnQvc3RsL19wdHJzX3NwZWNpYWxpemUuaDogRml4ZWQgaW5zdGFuY2lhdGlvbiBvZgorCV9fdHlwZV90cmFpdHNfYXV4LgorCisyMDA2LTExLTI1ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3RscG9ydC9jbGltaXRzLCBpb3Nmd2QsIG1lbS5oLCBzdHJpbmcuaCwgdHlwZWluZm8uaCwgd2NoYXIuaCwKKwlzdGwvY2hhcl90cmFpdHM6CisJRXJpYyBTYW5mb3JkIHBhdGNoIHRvIGNvbXBsZXRlIHVzZSBvZiBpbmNsdWRlX25leHQgd2l0aCBCb3JsYW5kCisJY29tcGlsZXJzLgorCisJKiBzdGxwb3J0L3VzaW5nL2NzdHJpbmc6IEZpeCBtYWNybyBjaGVjayBmb3IgQm9ybGFuZCBjb21waWxlci4KKworCSogdGVzdC91bml0L2xvY2FsZV90ZXN0LmNwcDogQWRkIHRlc3QgZm9yIEJvcmxhbmQgX2ZwY2xhc3MuCisKKwkqIHNyYy9udW1fcHV0X2Zsb2F0LmNwcDogRml4IHBvdGVudGlhbCBlcnJvciBpbiBfU3RsX2lzX25lZ19uYW4KKwlmb3IgQm9ybGFuZCBjb21waWxlciBhZnRlciAweDU4MS4KKworMjAwNi0xMS0yNCAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIEVyaWMgU2FuZm9yZCBwYXRjaCBmb3IgRE1DIGNvbXBpbGVyLCBhbGxvdyBhY2Nlc3MgdG8gYXNzb2NpYXRpdmUKKwljb250YWluZXJzIGV4dGVuc2lvbi4KKworCSogc3RscG9ydC90eXBlaW5mby5oLCBleGNlcHRpb246IFdvcmthcm91bmQgZm9yIERNQyB0aGF0IGZvcmNlCisJaW5jbHVzaW9uIG9mIHR5cGVpbmZvLmggYXQgdGhlIGJlZ2luaW5nIG9mIGFsbCB0cmFuc2xhdGlvbiB1bml0cy4KKworMjAwNi0xMS0yMyAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHRlc3QvdW5pdC9jc3RyaW5nX3Rlc3QuY3BwOiBOZXcgdGVzdCBjYXNlIHRvIGNoZWNrIGltcG9ydCBvZiBhbGwKKwlDIGZ1bmN0aW9ucyBmcm9tIHN0cmluZy5oIGluIFNUTHBvcnQgbmFtZXNwYWNlLgorCisJKiBzdGxwb3J0L3VzaW5nL2NzdHJpbmc6IEZpeCBpbXBvcnQgb2Ygc3RyY21wIGFuZCBzdHJjcHkgZm9yIEJvcmxhbmQuCisKKzIwMDYtMTEtMjAgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzdGxwb3J0L2lvc2Z3ZCwgc3RsL3R5cGVfbWFuaXBzLmgsIGNvbmZpZy9fYmMuaCwgcG9pbnRlcnMvX3Rvb2xzLmg6CisJUGF0Y2ggZnJvbSBFcmljIFNhbmZvcmQgdG8gcmVtb3ZlIHVzZWxlc3MgQm9ybGFuZCB3b3JrYXJvdW5kIGZvcgorCXBvaW50ZXIgc3BlY2lhbGlzYXRpb24gYW5kIHVzZSBpbmNsdWRlX25leHQgZmVhdHVyZSBmb3IgdmVyc2lvbnMgYWZ0ZXIKKwkweDU4MC4KKworMjAwNi0xMS0yMCAgUGV0ciBPdnRjaGVua292ICA8Y29tcGxlbWVudEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHNyYy9tb25ldGFyeS5jcHA6IHRlbXBsYXRlIGhlYWRlciBub3QgYWxsb3dlZCBpbiBtZW1iZXIgZGVmaW5pdGlvbgorCW9mIGV4cGxpY2l0bHkgc3BlY2lhbGl6ZWQgY2xhc3MKKworMjAwNi0xMS0xOSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHN0bHBvcnQvc3RsL19pb3NfYmFzZS5oOiBSZXBsYWNlIHdyb25nIGV4dGVybmFsIHV0aWxpdHkgaW5jbHVzaW9uCisJd2l0aCBpbnRlcm5hbCBfcGFpci5oIGhlYWRlci4KKworMjAwNi0xMS0xNyAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHN0bHBvcnQvc3RsL2NvbmZpZy9mZWF0dXJlcy5oOiBNb2RpZmljYXRpb24gb2YgdGhlIHN0YXRpYyBjb25zdGFudAorCXdvcmthcm91bmQgaW1wbGVtZW50YXRpb24gdG8gdXNlIHNvbWV0aGluZyBzaW1pbGFyIHRvIHRoZSBib29zdAorCXdvcmthcm91bmQuIF9TVExQX1NUQVRJQ19DT05TVF9JTklUX0JVRyBtYWNybyBjaGFuZ2UgZGVmaW5pdGlvbiBvZgorCW5ld2x5IGludHJvZHVjZSBfU1RMUF9TVEFUSUNfQ09OU1RBTlQgbWFjcm8gd2hpY2ggdXNlIGFuIGVudW0gb3IgYQorCXJlYWwgc3RhdGljIGNvbnN0IHZhcmlhYmxlLiBNb3Jlb3ZlciB0aGUgbmV3CisJX1NUTFBfTk9fU1RBVElDX0NPTlNUX0RFRklOSVRJT04gd2lsbCBoaWRlIHN0YXRpYyBjb25zdGFudCBkZWZpbml0aW9uCisJd2hlbiBkZWZpbmVkLgorCisJKiBzcmMvY3R5cGUuY3BwLCBpb3MuY3BwLCBsb2NhbGUuY3BwOiBBZGQgY2hlY2sgZm9yCisJX1NUTFBfTk9fU1RBVElDX0NPTlNUX0RFRklUSU9OLgorCisJKiBzcmMvbW9uZXRhcnkuY3BwOiBBZGQgaW50bCBzdGF0aWMgY29uc3RhbnQgZGVmaW5pdGlvbnMuCisKKwkqIHN0bHBvcnQvc3RsL19jdHlwZS5oLCBfaW9zX2Jhc2UuaCwgX2xpbWl0cy5oLCBfbW9uZXRhcnkuaDogVXNlCisJX1NUTFBfU1RBVElDX0NPTlNUQU5ULgorCisJKiBzdGxwb3J0L3N0bC9fbGltaXRzLmg6IExpbWl0cyBhIHdvcmthcm91bmQgZm9yIGxvbmcgbG9uZyBhbmQgdW5zaWduZWQKKwlsb25nIGxvbmcgdHlwZXMgdGhhdCB1c2VkIHRvIGJlIGFwcGxpZWQgZm9yIGdjYyBhZnRlciAyLjk2IHVwIHRvIHZlcnNpb24KKwkzLjAuCisKKwkqIHN0bHBvcnQvc3RsL19saW1pdHMuYzogQ2xlYW4gYWxsIHN0YXRpYyBjb25zdGFudCB2YWx1ZXMgZHVwbGljYXRlZCBmcm9tCisJX2xpbWl0cy5oIHRoYXQgd2FzIG5vdCB1c2VkIGluIHRoaXMgZmlsZS4gQWRkIHN0YXRpYyBjb25zdGFudCBkZWZpbml0aW9uCisJbmVjZXNzYXJ5IGZvciBsb25nIGxvbmcgYW5kIHVuc2lnbmVkIGxvbmcgbG9uZyB0eXBlcyBmb3IgZ2NjIGJldHdlZW4gMi45NgorCWFuZCAzLjAgKHNlZSBhYm92ZSkuCisKKwkqIHN0bHBvcnQvc3RsL2RlYnVnL19zdHJpbmcuaDogUmVtb3ZlZCBucG9zIHN0YXRpYyBjb25zdGFudCBkZWZpbml0aW9uCisJdGhhdCBpcyBvbmx5IG5lY2Vzc2FyeSBpbiBzdGxwb3J0L3N0bC9fc3RyaW5nLmMuCisKKwkqIHN0bHBvcnQvc3RsL2NvbmZpZy9fbXN2Yy5oOiBVc2UgcmVhbCBzdGF0aWMgY29uc3RhbnQgc3RhcnRpbmcgd2l0aAorCVZTIC5OZXQgMjAwMyAoX01TQ19WRVIgPj0gMTMxMCkuCisKKwkqIHRlc3QvdW5pdC9saW1pdHNfdGVzdC5jcHA6IE1vZGlmaWVkIHRlc3QgdG8gcmV2ZWFsIHBvdGVudGlhbGx5IG1pc3NpbmcKKwlzdGF0aWMgY29uc3RhbnQgZGVmaW5pdGlvbnMuCisKKzIwMDYtMTEtMTMgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzdGxwb3J0L3N0bC9jb25maWcvc3RsX2NvbmZpeC5oOiBBZGQgc29tZSBTVExwb3J0IGNvbmZpZyBvcHRpb25zIGJhc2VkCisJb24gRURHIHZlcnNpb24gaW5mb3JtYXRpb24gdXNpbmcgYm9vc3QgY29tbW9uX2VkZy5ocHAgY29udGVudC4KKworCSogc3RscG9ydC9zdGwvOiBQYXRjaCBmcm9tIEVyaWMgU2FuZm9yZCBmb3IgQm9ybGFuZCBjb21waWxlci4gQWxsb3cKKwlhc3NvY2lhdGl2ZSBjb250YWluZXIgZXh0ZW5zaW9uIChtZW1iZXIgbWV0aG9kcykgYW5kIHVzZSBvZiBwb2ludGVyCisJc3BlY2lhbGl6YXRpb24uCisKKzIwMDYtMTEtMDcgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzdGxwb3J0L3N0bC9jb25maWcvX2hwYWNjLmgsIHN0bF9jb25maXguaDogVGhhbmtzIHRvIGFkZGl0aW9uYWwgaW5mbworCWZyb20gQm9yaXMgR3ViZW5rbyBTVExwb3J0IG5vdyBjaGVjayBfX0VER19WRVJTSU9OX18gdG8gZGV0ZWN0IEVERyBiYXNlZAorCWNvbXBpbGVycy4gSXQgdXNlIHRoaXMgbWFjcm8gdG8gYWN0aXZhdGUgaW5jbHVkZV9uZXh0IGZlYXR1cmUuIE1vcmVvdmVyCisJYSB3b3JrYXJvdW5kIGhhcyBiZWVuIGFkZGVkIGZvciBhQ0M2IHRoYXQgd2FzIG5vdCBkZWZpbmluZyBfX0VER19WRVJTSU9OX18KKwlhcyBleHBlY3RlZC4gX2hwYWNjLmggaGFzIGFsc28gYmVlbiBjbGVhbmVkIG9mIG9ic29sZXRlIGNvbmZpZy4KKworMjAwNi0xMS0wNyAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHN0bHBvcnQ6IEFsbCBDKysgU3RhbmRhcmQgaGVhZGVycyBhcmUgbm93IHVzaW5nIHRoZSBzYW1lIHNjaGVtYS4gSWYKKwlpbmNsdWRlZCBmcm9tIG91dHNpZGUgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgbm90IGRlZmluZWQpIGl0IGZpcnN0CisJaW5jbHVkZWQgaW50ZXJuYWwgaGVhZGVyIChpbiBzdGwgZm9sZGVyKSBhbmQgdGhlbiwgaWYgX1NUTFBfV0hPTEVfTkFUSVZFCisJaXMgZGVmaW5lZCwgaW5jbHVkZSB0aGUgZXF1aXZhbGVudCBuYXRpdmUgU3RhbmRhcmQgaGVhZGVyLiBJZiBpbmNsdWRlZAorCWZyb20gaW5zaWRlLCBzaW1wbHkgZm9yd2FyZCB0byBuYXRpdmUgaGVhZGVyIGluY2x1ZGUuIFRoaXMgc2NoZW1hIGhhcworCXNldmVyYWwgYWR2YW50YWdlczoKKwktIExlc3MgZGVwZW5kYW5jeSBvbiBuYXRpdmUgbGlicmFyeSBoZWFkZXJzIGludGVyZGVwZW5kYW5jeS4KKwktIExlc3MgY29kZSBpbmNsdWRlZCBhcyBTVExwb3J0IGNvZGUgaXMgb25seSBleHBvc2VkIGlmIGhlYWRlcnMgYXJlCisJaW5jbHVkZWQgZnJvbSB0aGUgb3V0c2lkZS4KKwktIFJlc3RvcmUgX1NUTFBfV0hPTEVfTkFUSVZFX1NURCBjb25maWd1cmF0aW9uICh0ZXN0ZWQgd2l0aCBnY2MsIG1zdmMsIGJjYykKKwlUaGUgY29uZGl0aW9uIGZvciB0aGlzIHNjaGVtYSB0byB3b3JrIGlzIHRoYXQgU1RMcG9ydCBuZXZlciBpbmNsdWRlIFN0YW5kYXJkCisJaGVhZGVycyBpbnRlcm5hbHkgd2hlbiBpdCB3YW50cyB0byBhY2Nlc3Mgc29tZSBTVExwb3J0IGNvZGUuCisKKwkqIHN0bHBvcnQvc3RsL19pb21hbmlwLmg6IE5ldyBmaWxlIGNvbnRhaW5pbmcgYWxsIFNUTHBvcnQgY29kZSB0aGF0IHVzZWQKKwl0byBiZSBpbiBzdGxwb3J0L2lvbWFuaXAuCisKKwkqIHN0bHBvcnQvc3RsL19jb21wbGV4LmgsIF9yb3BlLmgsIF9zdHJlYW1faXRlcmF0b3IuaCwgX3N0cmluZ19md2QuaDogVXNlCisJc3RsL19pb21hbmlwLmggcmF0aGVyIHRoYW4gaW9tYW5pcC4KKworCSogc3RscG9ydC9zdGwvX3JvcGUuYzogVXNlIHN0bC9fb3N0cmVhbS5oIGFuZCBzdGwvX2lzdHJlYW0uaCByYXRoZXIgdGhhbgorCWlvc3RyZWFtLgorCisJKiBzdGxwb3J0L3N0bC9jb25maWcvX2thaS5oLCBfbXN2Yy5oLCBmZWF0dXJlLmg6IF9TVExQX01JTklNVU1fSU1QT1JUX1NURAorCW1hY3JvIHJlbW92ZWQsIGl0IHdhcyBvbmx5IHVzZWQgaW4gdmVjdG9yIGhlYWRlciB0byBhdm9pZCBpbmNsdWRlIG9mCisJbmF0aXZlIHZlY3RvciBoZWFkZXIgZXZlbiB3aGVuIF9TVExQX0lNUE9SVF9WRU5ET1JfU1REIHdhcyBkZWZpbmVkLiBNU1ZDNgorCXVzZWQgdG8gZGVmaW5lIGl0IGJ1dCByZW1vdmluZyBpdCBoYXNuJ3QgbWFrZSBjb21waWxhdGlvbiBmYWlsZWQgd2hlbgorCWltcG9ydGluZyBhbGwgbmF0aXZlIHN0ZCBzdHVmZi4gTG9va3MgbGlrZSBpdCB3YXMgYSB3b3JrYXJvdW5kIG5lY2Vzc2FyeQorCXdoZW4gU1RMcG9ydCB3YXMgbm90IGFzIGNsZWFuIGFzIGl0IGlzIG5vdyBvciBmb3IgdGhlIGZvcm1lciB3cmFwcGVyIG1vZGUKKwl0aGF0IGhhcyBiZWVuIHJlbW92ZWQuCisKKwkqIHN0bHBvcnQvc3RsL2NvbmZpZy9mZWF0dXJlcy5oOiBBZGQgYSAjZXJyb3IgdG8gc2lnbmFsIHRoYXQKKwlfU1RMUF9XSE9MRV9OQVRJVkVfU1REIGFuZCBfU1RMUF9OT19PV05fTkFNRVNQQUNFIGFyZSBpbmNvbXBhdGlibGUKKwlvcHRpb25zLgorCisJKiBzdGxwb3J0L3N0bC9jb25maWcvc3RsX2NvbmZpeC5oCisKKzIwMDYtMTEtMDUgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzdGxwb3J0L3N0bC9fc3N0cmVhbS5oLCBfc3N0cmVhbS5jOiBBZGQgMiBoZWxwZXIgZnVuY3Rpb25zIF9TX3N0YXJ0IGFuZAorCV9TX2ZpbmlzaCB0byBoaWRlIGNvbXBsZXhpdHkgb2YgY29kZSByZXF1aXJlZCB0byBoYXZlIHJlYWQgYWNjZXNzIHRvIHRoZQorCWFnZ3JlZ2F0ZWQgc3RyaW5nIGluc3RhbmNlIGludGVybmFsIGJ1ZmZlci4gVGhvc2UgMiBmdW5jdGlvbnMgaGVscCBrZWVwaW5nCisJYmFzaWNfc3RyaW5nYnVmIGltcGxlbWVudGF0aW9uIHNpbXBsZSB3aXRob3V0IHJlcXVpcmluZyBhIGZyaWVuZAorCWRlY2xhcmF0aW9uIGluIGJhc2ljX3N0cmluZyBjbGFzcyBhbmQgdXNlIG9mIGluaGVyaXRhbmNlIGluIF9TVExQX0RFQlVHCisJbW9kZSBiZXR3ZWVuIHRoZSBkZWJ1ZyBzdHJpbmcgYW5kIHRoZSBub24gZGVidWcgb25lLgorCisJKiBzdGxwb3J0L3N0bC9fc3RyaW5nLmgsIGRlYnVnL19zdHJpbmcuaCwgX3N0cmluZ19zdW1fbWV0aG9kcy5oOiBSZW1vdmVkCisJZnJpZW5kIGRlY2xhcmF0aW9uIGFuZCBpbmhlcml0YW5jZSAoc2VlIGFib3ZlKS4gVGhpcyBhbHNvIGF2b2lkcyB0byByZXN0b3JlCisJc29tZSB3b3JrYXJvdW5kcyB0aGF0IHVzZWQgdG8gYmUgbmVjZXNzYXJ5IHdoZW4gX1NUTFBfREVCVUcgbW9kZSB3YXMgdXNpbmcKKwlpbmhlcml0YW5jZSBpbiBhbGwgdGhlIGRlYnVnIGNvbnRhaW5lcnMuCisKKzIwMDYtMTEtMDQgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzcmMvbnVtX3B1dF9mbG9hdC5jcHA6IEFjY29yZGluZyBDIFN0YW5kYXJkIG51bWJlciBvZiBkaWdpdHMgaW4gdGhlCisJZXhwb25lbnQgcGFydCBvZiBzY2llbnRpZmljIG91dHB1dCBzaG91bGQgYmUgYXQgbGVhc3QgMiwgQzk5IGV2ZW4gc2F5cworCXRoYXQgd2Ugc2hvdWxkbid0IGFkZCB6ZXJvcyBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIDMgc2lnbmlmaWNhbnQgZGlnaXRzLgorCisJKiB0ZXN0L3VuaXQvY29tcGxldGVfZGlnaXRzLmg6IE1vZGlmaWVkIGFjY29yZGluZyB0byBhYm92ZSBydWxlcy4KKworMjAwNi0xMS0wMiAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIFJlcG9zaXRvcnk6IE1lcmdlZCBTVExQT1JUXzVfMV9SQzMgdGFnIGNoYW5nZXMgdXAgdG8gcjI3NzEgaW50byB0aGUgdHJ1bmsuCisJTm93IHRydW5rIGlzIHJlYWxseSBpbiBzeW5jIHdpdGggU1RMUE9SVF81XzEgYnJhbmNoLgorCisJKiBldGMvQ2hhbmdlTG9nOiBOb3cgY29udGFpbnMgb25seSB0cnVuayBtb2RpZiwgNS4xIGNoYW5nZXMgYXJlIGluCisJQ2hhbmdlTG9nLTUuMS4KKworMjAwNi0xMS0wMiAgUGV0ciBPdnRjaGVua292ICA8Y29tcGxlbWVudEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIFJlcG9zaXRvcnk6IG1lcmdlZCBmcm9tIDUuMSBicmFuY2guCisKKzIwMDYtMTEtMDEgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzdGxwb3J0L3N0bC9fc3RkZXhjZXB0X2Jhc2UuaDogUGF0Y2ggZnJvbSBVbGkgdG8gc2ltcGxpZnkKKwlfX05hbWVkX0V4Y2VwdGlvbiBpbXBsZW1lbnRhdGlvbi4KKworMjAwNi0xMC0zMSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGJ1aWxkL3Rlc3QvdW5pdC9NYWtlZmlsZS5pbmM6IFJlc3RvcmUgU1RMcG9ydCB2ZXJzaW9uIGluZm9ybWF0aW9uIHRoYXQKKwloYWQgbXlzdGVyaW91c2x5IGRpc2FwcGVhcmVkIGluIGEgcHJldmlvdXMgbW9kaWZpY2F0aW9uLgorCisJKiBzdGxwb3J0L3N0bC9fbnVtX3B1dC5jOiBEaXNhYmxlIHdhcm5pbmcgZm9yIE1TVkMgdGhhdCBzaWduYWwgcHJvYmxlbSBpbgorCWNhc3QgZnJvbSBwb2ludGVyIHRvIHVuc2lnbmVkIGxvbmcuCisKKwkqIHNyYy9udW1fcHV0X2Zsb2F0LmNwcDogRml4IGJ1ZmZlciBvdmVyZmxvdyBpbnRyb2R1Y2UgYnkgYSBwcmV2aW91cworCW1vZGlmaWNhdGlvbi4gTm93IFNUTHBvcnQgYXBwZW5kcyAnMCcgc28gdGhhdCBmbG9hdGluZyBwb2ludCBzY2llbnRpZmljCisJb3V0cHV0IGhhcyBhIGNvbnN0YW50IHNpemUuIE1BWEVTSVogcmVuYW1lZCBpbiBNQVhFRElHSVRTIHRvIG1ha2UgbWFjcm8KKwlzaWduaWZpY2F0aW9uIG1vcmUgb2J2aW91cy4KKworCSogdGVzdC91bml0L2NvbXBsZXRlX2RpZ2l0cy5oOiBOZXcgZmlsZSBjb250YWluaW5nIHRoZSBmdW5jdGlvbiBnaXZpbmcKKwlwbGF0Zm9ybSBkZXBlbmRhbnQgbnVtYmVyIG9mIGRpZ2l0cyBpbiBTVExwb3J0IHNjaWVudGlmaWMgb3V0cHV0IG9mCisJZmxvYXRpbmcgcG9pbnQgdHlwZXMuCisKKwkqIHRlc3QvdW5pdC9udW1fcHV0X2dldF90ZXN0LmNwcCwgbG9jYWxlX3Rlc3QuY3BwOiBBZGFwdCB0ZXN0cyB0byBsYXRlc3QKKwlTVExwb3J0IG1vZGlmaWNhdGlvbnMuCisKKzIwMDYtMTAtMzAgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzdGxwb3J0L3N0bC9fc3RscG9ydF92ZXJzaW9uLmg6IFVwZ3JhZGUgU1RMcG9ydCB2ZXJzaW9uIGluZm9ybWF0aW9uCisJdG8gcmVmbGVjdCBidWlsdCBsaWJyYXJpZXMuCisKKzIwMDYtMTAtMjQgIFBldHIgT3Z0Y2hlbmtvdiAgPGNvbXBsZW1lbnRAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzdGxwb3J0L3N0bC9jb25maWcvaG9zdC5oLCBfbGludXguaDogZm9yY2UgdXNhZ2UgbWFsbG9jX2FsbG9jIGFzIGRlZmF1bHQKKwlhbGxvY2F0b3Igb24gc3lzdGVtcyB3aXRoIGdsaWJjIDIuMy54IGFuZCBsYXRlcglkdWUgdG8gYmV0dGVyIHBlcmZvcm1hbmNlLgorCisJKiBzdGxwb3J0L3N0bC9fYWxsb2MuaDogcmVtb3ZlIF9TVExQX01BTExPQ19VU0FCTEVfU0laRSBkZXBlbmRhbnQKKwljb2RlLS0tbm90IHJlYWxseSB1c2VkLgorCQorCSogc3RscG9ydC9zdGwvX2FsbG9jLmM6IHJlbW92ZSByZWNhbGN1bGF0aW9uIG9mIF9fbiBbRnJhbmNvaXMgd2FzIHJpZ2h0XTsKKwlyZW1vdmUgX1NUTFBfTUFMTE9DX1VTQUJMRV9TSVpFIGRlcGVuZGFudCBjb2RlLS0tbm90IHJlYWxseSB1c2VkLgorCisJKiBzcmMvYWxsb2NhdG9ycy5jcHA6IHJlbW92ZSBhZGRpdGlvbmFsIF9fbWFsbG9jX2FsbG9jX2ltcGwgY2xhc3MtLS1ub3QKKwlyZXF1aXJlZDsgYWRkIG11dGV4IGxvY2sgZm9yIGN1c3RvbSBfX21hbGxvY19hbGxvYyBvb20gaGFuZGxlciBjaGFuZ2UvdXNlCisJW2luIG11bHRpLXRocmVhZGVkIGVudmlyb25tZW50XS4KKworMjAwNi0xMC0xNiAgUGV0ciBPdnRjaGVua292ICA8Y29tcGxlbWVudEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHN0bHBvcnQvc3RsL2NfbG9jYWxlLmgsIF9tYnN0YXRlX3QuaCwgc3JjL2NfbG9jYWxlLmgsIGNfbG9jYWxlLmM6CisJbWVyZ2UgY2hhbmdlcyBmcm9tIFNUTFBPUlRfNV8xIGJyYW5jaCwgc2VlIDIwMDYtMTAtMTIgW0ZyYW5jb2lzIER1bW9udF07CisJbWF5IGJlIHByb2JsZW1zIG9uIFNvbGFyaXMsIGFuZCBGcmVlQlNELS0tbW9yZSBjaGVjayByZXF1aXJlZC4KKworMjAwNi0xMC0xMyAgUGV0ciBPdnRjaGVua292ICA8Y29tcGxlbWVudEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIFJlcG9zaXRvcnk6IG1lcmdlIGNoYW5nZXMgW25vdCBhbGxdIDIwMDYtMTAtMTIgZnJvbSBTVExQT1JUXzVfMSBicmFuY2gKKworMjAwNi0xMC0xMiAgUGV0ciBPdnRjaGVua292ICA8Y29tcGxlbWVudEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIFJlcG9zaXRvcnk6IG1lcmdlIGNoYW5nZXMgZnJvbSBTVExQT1JUXzVfMSBicmFuY2ggKHJlY29yZHMKKwlmcm9tIDIwMDYtMTAtMDYgdG8gMjAwNi0xMC0wNCkuCisKKwkqIHN0bHBvcnQvc3RsL19hbGxvYy5jOiBIbW0sIGxvb2tzIGxpa2UgZGVhbGxvY2F0aW9uIHNpemUgaW4KKwkyMDA2LTEwLTA2IGlzIHdyb25nLgorCisJKiBzdGxwb3J0L3N0bC9fbnVtX3B1dC5jOiBwcmludCBwb2ludGVyIGFzIGluIGZpeCB3aWR0aCBmb3JtLCBhbmQKKwl3aXRoIGJhc2UgMHgsIGluZGVwZW5kZW50LCB6ZXJvIHBvaW50ZXIgb3Igbm90LgorCisJKiB0ZXN0L3VuaXQvbnVtX3B1dF9nZXRfdGVzdC5jcHA6IHRlc3QgZm9yIGlzc3VlIGFib3ZlLgorCisJKiB0ZXN0L3VuaXQvc3RyaW5nX3Rlc3QuY3BwOiB0ZXN0IGZvciBvdmVybG9hZGVkIG9wZXJhdG9ycworCWFuZCB0ZW1wb3Jhcnkgc3RyaW5nOyBpbnNwaXJlZCBieSBwcm9ibGVtcyB3aXRoIHNvbWUgY29tcGlsZXJzLgorCisJKiBzdGxwb3J0L3N0bC9fbWJzdGF0ZV90Lmg6IHJldmVydCBiYWNrIGNoYW5nZXMgZnJvbSBTVExQT1JUXzVfMSBicmFuY2g7CisJbWJzdGF0ZV90IGNvdXBsZSB3aXRoIHdjaGFyIGNsb3NlbHksIGFuZCBzb21ldGltZXMgaGFzIGNvbXBleCBhbmQgaW1wbGljaXQKKwlkZXBlbmRhbmNlOyBpbmNsdWRlIHdjaGFyLmggZmlyc3QgcmVxdWlyZWQhIAorCisyMDA2LTA5LTEyICBQZXRyIE92dGNoZW5rb3YgIDxjb21wbGVtZW50QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogdGVzdC91bml0L3N0cmluZ190ZXN0LmNwcDogYWRkIHRlc3QgZm9yIGJ1ZyByZXBvcnQgIzE1NDE0OTksCisJcHJvYmxlbSBub3QgZGV0ZWN0ZWQ7IGxvb2tzIGxpa2UgZ2NjIDQuMS4xIGNhbiBjb21waWxlIHRlX3RtcCB0ZXN0CisJY29ycmVjdGx5IFtzdW0gb3BlcmF0aW9ucyB1bmRlciBjbGFzcyBkZXJpdmVkIGZyb20gc3RyaW5nLCB3aXRoCisJX1NUTFBfVVNFX1RFTVBMQVRFX0VYUFJFU1NJT05dLgorCisyMDA2LTA5LTA4ICBQZXRyIE92dGNoZW5rb3YgIDxjb21wbGVtZW50QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3RscG9ydC9zdGwvX3NzdHJlYW0uaCwgX3NzdHJlYW0uYzogcmVtb3ZlIGRvdWJsZSBidWZmZXJpbmcKKwlvbiB3cml0ZSBvbmx5IHVuZGVybHlpbmcgc3RyaW5nIGFzIGJ1ZmZlci4gVXNlIGtub3dsZWdlIGFib3V0CisJc3RyaW5nIGltcGxlbWVudGF0aW9uLCB0aGlzIHNob3VsZCBpbXByb3ZlIHBlcmZvcm1hbmNlLCBhbmQsCisJYXQgbGVhc3Qgc2ltcGxpZnkgY29kZSBhbmQgYXZvaWQgbG9naWMgdGhhdCBhbHJlYWR5IHByZXNlbnQgaW4KKwlzdHJpbmcgaW1wbGVtZW50YXRpb24uCisKKwkqIHN0bHBvcnQvc3RsL19zdHJpbmdfYmFzZS5oOiBiYXNpY19zdHJlYW1idWYgaXMgZnJpZW5kLCB0byBhY2Nlc3MKKwl0byBpbnRlcm5hbCBmdW5jdGlvbiAoYWNjZXNzIHRvIHN0b3JhZ2UgcG9pbnRlcnMpLgorCisJKiBzdGxwb3J0L3N0bC9kZWJ1Zy9fc3RyaW5nLmgsIF9zdHJpbmdfc3VtX21ldGhvZHMuaDogY2hhbmdlIHVzYWdlCisJb2YgJ25vbi1kZWJ1ZyBzdHJpbmcnLCBmcm9tICd1c2Ugb2YnIHJlbGF0aW9uIHRvICdpbmhlcml0JyByZWxlYXRpb24uCisJVXNlZnVsIGZvciBhY2Nlc3MgYmFzaWNfc3RyZWFtYnVmIHRvIHN0cmluZyBzdG9yYWdlIGluIF9TVExQX0RFQlVHCisJbW9kZSB0b28uCisJCQorCSogdGVzdC91bml0L3NzdHJlYW1fdGVzdC5jcHA6IHRlc3QgZm9yIHRlbGxwIGNhbGw7IGNoYW5nZSB0ZXN0CisJd2l0aCBpbml0ZWQgb3N0cmluZ3N0cmVhbSBpbiBhY2NvcmRhbmNlIHdpdGggYW5vdGhlciBTdGFuZGFyZAorCXRyZWF0bWVudC4KKwkKKwkqIHN0bHBvcnQvc3RsL19zdHJlYW1idWYuaDogcmVtb3ZlIGFuY2llbnQgY29kZSwgdGhhdCBjYW4ndAorCXdvcmsgd2l0aCBwcmVzZW50IGNvZGUgaW4gYW55IGNhc2UuCisKKwkqIHNyYy9jX2xvY2FsZS5jOiBkaXR0bworCisJKiBidWlsZC9saWIvTWFrZWZpbGUuaW5jOiBidW1wIG1pbm9yIHZlcnNpb24gKDUuMi4wKQorCisyMDA2LTA3LTI3ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3RscG9ydDogQWRvcHQgaW5jbHVkZV9uZXh0IEdOVSBleHRlbnNpb24gZm9yIHRoZSBmb2xsb3dpbmcgcmVhc29uczoKKwktIFN0YW5kYXJkIGhlYWRlcnMgZG8gbm90IGhhdmUgdG8gYmUgY2F0ZWdvcmlzZWQgYW55bW9yZSB0byBiZQorCWluY2x1ZGVkLCB3ZSBjb3VsZCBoYXZlIGEgd3JvbmcgaW5jbHVkZSBvcmRlciBpZiBoZWFkZXJzIGFyZSBub3QKKwljb3JyZWN0bHkgY2F0ZWdvcml6ZWQuCisJLSBQYWNrYWdlIGJ1aWxkZXIgY2FuIHVzZSBhbnkgZm9sZGVyIHN0cnVjdHVyZSB0aGV5IHdhbnQgZm9yIGdjYywKKwlTVExwb3J0IHdvbid0IGhhdmUgdG8gYmUgY3VzdG9taXplZCBhbnltb3JlLgorCS0gTWFrZSBTVExwb3J0IHVzYWJsZSB3aXRoIG90aGVyIGxpYnJhcnkgdGhhdCBhbHNvIHVzZSB0aGUgc2hhZG93CisJaGVhZGVyIHRyaWNrIHRvIG1vZGlmeSBuYXRpdmUgaGVhZGVycyBjb250ZW50LgorCisJKiBzdGxwb3J0L3N0bC9jb25maWcvX2djYy5oOiBBZGQgZGVmaW5pdGlvbiBvZiBfU1RMUF9IQVNfSU5DTFVERV9ORVhUCisJbWFjcm8gdG8gc2lnbmFsIHRoYXQgdGhpcyBjb21waWxlciBwcmVwcm9jZXNzb3Igc3VwcG9ydCBpbmNsdWRlX25leHQuCisJUmVtb3ZlZCBhbGwgZGVmaW5pdGlvbiBvZiBuYXRpdmUgaGVhZGVycyBwYXRoIHRoYXQgYXJlIG5vdyB1c2VsZXNzLgorCisyMDA2LTAzLTI3ICBQZXRyIE92dGNoZW5rb3YgIDxjb21wbGVtZW50QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3JjL251bV9wdXRfZmxvYXQuY3BwOiB1c2UgYnVmZmVycyB0aGF0IGF0IGxlYXN0IGxvbmdlcgorCXRoYW4gbWF4aW1hbCBkb3VibGUgW29yIGxvbmcgZG91YmxlXSBleHBvbmVudCwgc28gYXZvaWQKKwlwb3RlbnRpYWwgdnVsbmVyYWJpbGl0aWVzOyB0aGlzIGFsbG93IHRvIHJlYWQgcmVhbGx5IGxvbmcKKwlmaXgtZmxvYXQgbnVtYmVycyBbd2l0aCBsb3N0IG9mIHNpZ25pZmljYW50IGRpZ2l0cywgb2YgY291cnNlXS4KKworCSogdGVzdC91bml0L2Zsb2F0aW9fdGVzdC5jcHA6IGFkZCB0ZXN0IGZvciBpc3N1ZSBhYm92ZQorCisyMDA2LTAzLTIzICBQZXRyIE92dGNoZW5rb3YgIDxjb21wbGVtZW50QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3JjL2N4YS5jOiByZW1vdmUgd3JvbmcgZXhjbHVzaW9uIG9mIGxvY2sgZm9yIFNvbGFyaXMuCmRpZmYgLS1naXQgYS9ldGMvQ2hhbmdlTG9nLTQuMCBiL2V0Yy9DaGFuZ2VMb2ctNC4wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMTYxY2QKLS0tIC9kZXYvbnVsbAorKysgYi9ldGMvQ2hhbmdlTG9nLTQuMApAQCAtMCwwICsxLDY2OCBAQAorVGhlIGZvbGxvd2luZyBmaXggd2FzIG1hZGUgaW4gNC4wIHNpbmNlIDQuMCBSZWxlYXNlIENhbmRpZGF0ZSA6CisKKwkqIF90aHJlYWRzLmgvX2NvbmZpZy5oIDogZm9yIGFsbCBwbGF0Zm9ybXMsIHN0YXRpYyBtdXRleGVzIG1hZGUgbm9uLWluZGlyZWN0CisKKwkqIF9pdGVyYXRvcl9iYXNlLmggOiBtYWRlIHBvc3NpYmxlIHRvIGNob29zZSBiZXR3ZWVuIGl0ZXJhdG9yX3RyYWl0cyBhcHByb2FjaAorCSAgYW5kIG9sZC1zdHlsZSBpdGVyYXRvciBxdWVyaWVzIGxpa2UgaXRlcmF0b3JfY2F0ZWdvcnkoKSwgdmFsdWVfdHlwZSgpLCBldGMuIAorCSAgKFRoYW5rcyB0byBKb2huIFIuIEJhbmRlbGEgZm9yIHBvaW50aW5nIHRoaXMgb3V0KQorCSogX2NvbmZpZy5oLCBzdGxfdXNlcl9jb25maWcuaCA6IGludHJvZHVjZWQgX19TVExfT0xEX0hQX0lURVJBVE9SX1FVRVJJRVMgc3dpdGNoIHRvCisJICBhbGxvdyBvbGQtc3R5bGUgYW5kIG5ldy1zdHlsZSBpdGVyYXRvciBxdWVyaWVzIChmb3IgYWxsIGNvbXBpbGVycykuIAorCSAgaXRlcmF0b3JfdHJhaXRzPD4gbWFkZSBhbHdheXMgZGVmaW5lZC4gCisKKwkqIF9wdHJfc3BlY2lhbGl6ZS5oIC0gc3BlY2lhbGl6YXRpb25zIG9mIHR5cGVfdHJhaXRzPD4gZm9yIGNvbXBpbGVycyB3L28gcGFydGlhbCBzcGVjCisJICBtb3ZlZCBpbnRvIHNlcGFyYXRlIGZpbGUuIEFkZGVkIGl0ZXJhdG9yX3RyYWl0czw+IHNwZWNpYWxpemF0aW9ucyBmb3IgcG9pbnRlciB0eXBlcworCSAgZm9yIF9fU1RMX05PX09MRF9IUF9JVEVSQVRPUl9RVUVSSUVTIGNhc2UuIE1hY3JvIF9fU1RMX1BPSU5URVJTX1NQRUNJQUxJWkUgaXMgbm93IGF2YWlsYWJsZQorCSAgdG8gc3BlY2lhbGl6ZSBib3RoIHR5cGVfdHJhaXRzIGFuZCBpdGVyYXRvcl90cmFpdHMgZm9yIGEgcG9pbnRlciB0byB1c2VyLWRlZmluZWQgCisJICB0eXBlIChsYXR0ZXIgZm9yIHN0YW5kYXJkLXN0eWxlIGl0ZXJhdG9yIHF1ZXJpZXMgbW9kZSBvbmx5KQorCisJKiB2YzUubWFrIDogX19TVExfTk9fRk9SQ0VfSU5TVEFOVElBVEUgZmxhZyByZXN0b3JlZAorCisJKiBfc2l0ZV9jb25maWcuaCA6IGlmIF9fU1RMX05PX05FV19JT1NUUkVBTVMgb3IgX19TVExfTk9fSU9TVFJFQU1TIHNwZWNpZmllZCwgCisJIFNHSSBpb3N0cmVhbXMgYXJlIGJlaW5nIHR1cm5lZCBvZmYuIF9fU1RMX05PX1NHSV9JT1NUUkVBTVMgbW92ZWQgaW50byBzdGxfdXNlcl9jb25maWcuaAorCShUaGFua3MgdG8gU2F0aGlzaCBUIEMgZm9yIHRoZSByZXBvcnQpCisKKwkqIHN0bF93YXRjb20uaCA6IF9SRUVOVFJBTlQgaXMgYmVpbmcgc2V0IGlmIF9NVCBpcyBzZXQgKHRoYW5rcyB0byBSaWNhcmRvIEUuIEdheW9zbyBmb3IgdGhlIGlucHV0KQorCQorVGhlIGZvbGxvd2luZyBmaXggd2FzIG1hZGUgaW4gNC4wIFJlbGVhc2UgQ2FuZGlkYXRlIDoKKwkqIF90aHJlYWRzLmgsIF9hbGxvYy5jIDogZml4ZWQgdXNlIG9mIF9TVExfbXV0ZXhfYmFzZSBpbnN0ZWFkIG9mIF9TVExfU1RBVElDX01VVEVYIG1hY3JvIAorCitUaGUgZm9sbG93aW5nIGNoYW5nZXMgd2VyZSBtYWRlIGluIDQuMCBSZWxlYXNlIENhbmRpZGF0ZSBzaW5jZSA0LjAgYmV0YSA4OgorCisJKiBmc3RyZWFtLmNwcCA6IFdJTjMyIGZzdHJlYW1idWY6Om9wZW4gZmxhZyBtYXBwaW5nIGZpeGVkCisJICAodGhhbmtzIHRvIEFsYmVydG8gQmFyYmF0aSBmb3IgdGhlIHJlcG9ydHMpCisKKwkqIGN0eXBlLmNwcCA6IGZpeGVkIGNsYXNzaWMgdGFibGUgcmVnYXJkaW5nIGlvc19iYXNlOjpwcmludC9pb3NfYmFzZTo6c3BhY2UKKwkgIGNvbmZsaWN0ICh0aGFua3MgdG8gQWxiZXJ0byBCYXJiYXRpIGZvciB0aGUgcmVwb3J0KQorCisJKiBjbWF0aCA6IGFkZGVkIHNhbWUgd29ya2Fyb3VuZCBmb3IgU1VOJ3MgbWF0aCBleGNlcHRpb24vc3RkOjpleGNlcHRpb24gbmFtZSBjbGFzaAorCSAgYXMgd2FzIHRoZXJlIGluIG1hdGguaCBiZWZvcmUKKwkKKwkqIF9zdHJlYW1idWYuYyA6IGFkZGVkICJ0eXBlbmFtZSIgdG8gb3V0LW9mLWxpbmUgZnVuY3Rpb25zICh0aGFua3MgdG8gTWljaGFlbCBUc2lya2luIGZvciB0aGUgcmVwb3J0KQorCisJKiBSRUFETUUgZml4ZWQgdG8gYmUgY29uc2lzdGVudCBhYm91dCBTR0kgaW9zdHJlYW1zIHNldHRpbmcgKHRoYW5rcyB0byBFZCBCcmV5IGZvciB0aGUgcmVwb3J0KQorCisJKiBfYml0c2V0LmggOiBmaXhlZCBTVU4gQ0MgNC4yIGNyYXNoIHdpdGggLWcgb3B0aW9uICh0aGFua3MgdG8gQWxleCBWYW5pYyBmb3IgdGhlIHJlcG9ydCksCisJICBmaXhlZCBidWcgaW4gYml0c2V0PD46OnJlZmVyZW5jZSBiYXNlIGJpdHNldCB0eXBlZGVmCisKKwkqIF90aHJlYWRzLmgvLmMgIC0gZml4ZWQgaXNzdWUgd2l0aCBpbmNvbnNpc3RlbnQgc3lzdGVtJ3MgbWFjcm8gZm9yIGluaXRpYWxpemF0aW9uCisJICBhbmQgd2FybmluZyBhYm91dCBwYXJ0aWFsbHkgYnJhY2tldGVkIGluaXRpYWxpemVyCisKKwkqIGRlYnVnL192ZWN0b3IuaCA6IGZpeGVkIF9WZWN0b3Jfbm9uY29uc3RfdHJhaXRzIHNwZWNpYWxpemF0aW9uIGZvciBiaXRfdmVjdG9yCisJICAodGhhbmtzIGZvciBEYXZlIEFicmFoYW1zIGZvciB0aGUgZml4ICYgcmVtaW5kZXIpCisKKwkqIGNvbmZpZy9tc3ZjLmggLSBhZGRpZGlvbmFsIGxldmVsIDQgd2FybmluZ3Mgc3VwcHJlc3NlZCAodGhhbmtzIHRvIEVkIEJyZXkgZm9yIHRoZSByZXBvcnQpIAorCSogX2lvcy5oIDogZml4ZWQgRExMIGV4cG9ydCBkZWNsIGZvciBNU1ZDICh0aGFua3MgdG8gQWxiZXJ0byBCYXJiYXRpIGZvciB0aGUgcmVwb3J0KQorCisJKiBzdGRpb19zdHJlYW1idWYuY3BwIDogY29tcGF0aWJpbGl0eSBmaXggZm9yIGdsaWJjIDIuMiAodGhhbmtzIHRvIEJpbGwgU2hhbmFoYW4gZm9yIHRoZSBwYXRjaCkKKwkqIF9pdGVyYXRvcl9iYXNlLmggOiBhZGRlZCBpdGVyYXRvcjxvdXRwdXRfaXRlcmF0b3JfdGFnLCB2b2lkLC4uPiBzcGVjaWFsaXphdGlvbjsKKwkgIF9zdHJlYW1faXRlcmF0b3IuaCA6IG9zdHJlYW1faXRlcmF0b3IgY2hhbmdlZCB0byBpbmhlcml0IGZyb20gaXRlcmF0b3I8PgorCSAodGhhbmtzIHRvIFJhcGhhZWwgQm9zc2VrIGZvciB0aGUgcmVwb3J0KQorCisJKiBJTlNUQUxMIDogYWRkZWQgc29tZSBleGFwbGVzIGFuZCBmaXhlZCB0eXBvcyAodGhhbmtzIHRvIEJlbWFuIERhd2VzIGZvciB0aGUgcmVwb3J0KQorCisJKiBfc2l0ZV9jb25maWcuaCA6IG1vcmUgY29uc2lzdGVuY3kgY2hlY2tzIGZvciBNVCAodGhhbmtzIHRvIEpvaG4gTWFkZG9jayBmb3IgdGhlIGlucHV0KQorCisJKiBfbWVzc2FnZXNfZmFjZXRzLmggOiBhZGRlZCBETEwgZXhwb3J0IGRlY2xzICh0aGFua3MgdG8gSm9obiBNYWRkb2NrIGZvciB0aGUgcmVwb3J0KQorCisJKiBjb21wbGV4X2lvX3cuY3BwIDogZml4ZWQgc3BlY2lhbGl6YXRpb24gc3ludGF4IGZvciBhQ0MgKHRoYW5rcyB0byBQYXVsIEUuIEJsYW5jaGFyZCBmb3IgdGhlIHJlcG9ydCkKKworCSogY29tcGxleF9leHAuY3BwIDogZml4ZWQgcG93KCkgYnVnIGZvciBuZWdhdGl2ZSBhcmd1bWVudHMgKHRoYW5rcyB0byBBbnRvbiBTZXJnZWV2IGZvciB0aGUgcmVwb3J0KQorCSogX2ZzdHJlYW0uaC9fc3RyZWFtYnVmLmggOiBNUkMvTVBXIHdvcmthcm91bmRzICh0aGFua3MgZm9yIFRzdXRvbXUgWW9zaGlkYSBmb3IgdGhlIHJlcG9ydCkKKworCSogdXNpbmcvZnN0cmVhbS5oIDogYWRkZWQgbWlzc2luZyBlbmQtb2YtbGluZSAodGhhbmtzIHRvIEplYW4tRnJhbmNvaXMgUGFuaXNzZXQgZm9yIHRoZSByZXBvcnQpCisKKwkqIDx0eXBlaW5mbz4gOiB3b3JrYXJvdW5kIGZvciBWQysrIDYuMCBkZWZpbmluZyB0eXBlX2luZm8gaW4gZ29iYWwgbmFtZXNwYWNlICh0aGFua3MgdG8gQm9za28gSXZhbmlzZXZpYyBmb3IgcG9pbnRpbmcgdGhhdCBvdXQpCisKKwkqIF90aHJlYWRzLmgvX3RocmVhZHMuYy9wdGhyZWFkX2FsbG9jIDogaW1wcm92ZWQgcHRocmVhZHMgcG9ydGFiaWxpdHkgKHRoYXRua3MgdG8gTWljaGFlbCBUc2lya2luIGZvciB0aGUgcGF0Y2gpIAorCisJKiBfZGVidWcuaC9fZGVidWcuYyA6IF9fU1RMX0FTU0VSVC9fX1NUTF9WRVJCT1NFX0FTU0VSVC9fX1NUTF9WRVJCT1NFX1JFVFVOIG1hY3JvcyBndWFyZGVkIHRvIGJlIG92ZXJyaWRhYmxlIGJ5IHVzZXIgKHRoYW5rcyB0byBUb255IEdvdWxkIGZvciB0aGUgaW5wdXQpCisKKwkqIF92YWxhcnJheS5oIDogYWRkZWQgYXNzZXJ0IHRvIG9wZXJhdG9yPSAKKworCSogY29uZmlnL3ZjX3NlbGVjdF9saWIuaCA6IGFkZGVkIF9BRlhETEwgcmVjb2duaXRpb24gKHRoYW5rcyB0byBBbmRyZXcgUGhpcHBzIGZvciBpbnB1dCkKKworCSogX3JvcGUuaCA6IGFkZGVkIGRlZmF1bHQgY29uc3RydWN0b3JzIHRvIHBsZWFzZSBnY2MtMi43LjIKKworCSogX3NldC5oL19oYXNoX3NldC5oIDogcG9pbnRlciBhbmQgcmVmZXJlbmNlIHR5cGVkZWZzIGZpeGVkICh0aGFua3MgdG8gQW50b24gU2VyZ2VldiBmb3IgdGhlIHJlcG9ydCkKKworCSogc3RsL19jb25maWcuaCA6IHN0bF91c2VyIGNvbmZpZy5oIGluY2x1ZGVkIHByaW9yIHRvIG90aGVyIHBhcnRzIG9mIGNvbmZpZ3VyYXRpb24KKwkodGhhbmtzIHRvIEZyYW5rIFNhbXVlbCBmb3IgdGhlIHJlcG9ydCkKKwkKK1RoZSBmb2xsb3dpbmcgY2hhbmdlcyB3ZXJlIG1hZGUgaW4gNC4wIGJldGEgOCBzaW5jZSA0LjAgYmV0YSA3OgorCisJKiBNZXJnZWQgY2hhbmdlcyBmb3IgMDYvMDggU0dJIGxpYnJhcnkgc25hcHNob3Q7IG1vc3RseSBpbiBsb2NhbGUKKwkKKwkqIE1lcmdlZCBzZXJpZXMgb2YgZml4ZXMvd29ya2Fyb3VuZHMgYnkgVHN1dG9tdSBZb3NoaWRhICh0aGFua3MhKToKKwkqICAgX3JvcGUuYyAtIGZpeGVkIG1lbW9yeSBsZWFrIGJ1ZzsJCisJKiAgIF9kZWJ1Zy5jL19kZWJ1Zy5oIC0gYWRkZWQgZXh0cmEgemVyby1pbml0aWFsaXphdGlvbiBmb3IgbW9yZSByb2J1c3RuZXNzOworCSogICBfbGlzdC5oIC0gTVBXIC0gc3BlY2lmaWMgZml4ZXM7CisJKiAgIF9oYXNodGFibGUuaCAtIGZpeGVkIGRlYnVnIHJlbmFtaW5nIGNsYXNoIGZvciBfX1NUTF9VU0VfQUJCUkVWUyAKKwkqICAgRUggd29ya2Fyb3VuZHMgdG8gbWFrZSBBcHBsZSBjb21waWxlcnMgYmVoYXZlCisKKwkqIF9mc3RyZWFtLmMgOiBmaXhlZCB0ZWxsZygpIGJ1ZyBpbiB0ZXh0IG1vZGUKKworCSogPGNzaWduYWw+IDogYWRkZWQgc2lnX2F0b21pY190IGltcG9ydAorCisJKiBzZXJpZXMgb2YgZml4ZXMgZm9yIEhQIGFDQyAxLjIzICggdGhhbmtzIHRvIE1pY2hhZWwgVHNpcmtpbiBmb3IgdGhlIHBhdGNoICk6CisJICBfYnZlY3Rvci5oIDogYWxsIHJlbG9wcyBhcmUgc3BlY2lhbGl6ZWQ7CisJICBzdGxfaHBhY2MuaCAtIGZpeGVkIGNvbmZpZzsKKwkgIGhwYWNjLm1hayA6IGFkZGVkIG1ha2VmaWxlcyBmb3IgSFAgYUNDIGluIHNyYyBhbmQgdGVzdAorCSAgZGVidWcvX2l0ZXJhdG9yLmgsIGRlYnVnL192ZWN0b3IuaCAtIHJlbW92ZWQgZnV0dXJlIGVycm9ycyBkdWUgdG8gYmFzZWNsYXNzIG1lbWJlciB1c2UgCisJCisJKiA8Y3N0ZGxpYj4gOiBhZGRlZCBpbXBvcnQgb2Ygc3lzdGVtKCkgY2FsbCAodGhhbmtzIHRvIFBldHIgT3ZjaGVua292IGZvciB0aGUgcmVwb3J0KSAKKworCSogX1JFRU5UUkFOVCBpcyBub3cgc2V0IGJ5IGRlZmF1bHQgdG8gYmUgb24gZm9yIGFsbCBTR0kgaW9zdHJlYW1zIGNvbXBpbGF0aW9ucy4KKwkgIFNhbWUgaXMgYmVpbmcgZW5mb3JjZWQgaWYgU0dJIGlvc3RyZWFtcyBhcmUgdXNlZC4KKwkKKwkqIF9wYWlyLmggOiBhZGRlZCB3b3JrYXJvdW5kIGZvciBtYWtlX3BhaXIgaW4gY2FzZSBvZiBjaGFyIGxpdGVyYWxzIAorCSAgKGV4dGVuc2lvbiwgb25seSB3b3JrcyB3aXRoIHBhcnRpYWwgZnVuY3Rpb24gb3JkZXIpCisKKwkqIGNvbmZpZy9zdGxfZ2NjLmggLSBmaXhlZCBjb25maWd1cmF0aW9uIHByb2JsZW0gZm9yICJnKystMyIgZGlyZWN0b3J5IHVzZWQgaW4gQ3lnbnVzIGFuZCBNaW5ndyAKKwkgIGRpc3RyaWJ1dGlvbnMgZm9yIGdjYy0yLjk1LjIsIHdoaWxlIGFsbCBvdGhlciBwbGF0Zm9ybXMgdXNlICJnKysiLiBBZGRlZCByZWNvZ25pdGlvbiBzZWN0aW9uLgorCSAgVGhhbmtzIHRvIERhdmUgQWJyYWhhbXMgZm9yIHRoZSByZXBvcnQuCisKKwkqIGNvbmZpZy9zdGxfbWxjLmggOiBhZGRlZCBzdXBwb3J0IGZvciBNTEMgY29tcGlsZXIgKHRoYW5rcyB0byBBbnRvbiBTZXJnZWV2IGZvciB0aGUgcGF0Y2gpCisKKwkqIDxtZW1vcnk+IDogYXV0b19wdHIgc2ltcGxpZmllZCAodGhhbmtzIHRvIEtvbiBUYW50b3MgZm9yIHByb2JsZW0gcmVwb3J0KQorCQorCSogbnVtX2dldC5jcHAgOiBpbmNsdWRlZCA8b3N0cmVhbT4gdG8gZ2V0IGV4dGVybmFsIHN5bWJvbHMgcmlnaHQuIAorCisJKiBzdGxfaWJtLmggOiBfX1NUTF9OT19UWVBFSU5GTyBhZGRlZCBmb3IgT1MvMiAodGhhbmtzIHRvIFdpbGxpZSBBcmJ1Y2tsZSBmb3IgdGhlIHJlcG9ydCkKKworCSogc3RsX2JjLmggIDogZml4ZWQgZW5mb3JjZW1lbnQgb2Ygc3RhdGljIGxpYnJhcnkgdW50aWwgZHluYW1pYyBtYWRlIHRvIHdvcmsgKHRoYW5rcyB0byBKLiBMYW1iZXJ0IGZvciB0aGUgcmVwb3J0KSAKKwkqIHNyYy9zdGxwb3J0LnJjIDogaW1wcm92ZWQgdmVyc2lvbiBkZWZpbml0aW9uIHRvIHdvcmsgd2l0aCBtaW5ndzMyLCA8d2lucmVzLmg+IGNoYW5nZWQgdG8gPHdpbmRvd3MuaD4KKwkKKwkqIHNyYy9taW5ndzMyLm1hayA6IE1hZGUgdXNlIG9mIHN0bHBvcnQucmMgZm9yIERMTCBidWlsZCAodGhhbmtzIHRvIERhbm55IFNtaXRoIGZvciB0aGUgc3VnZ2VzdGlvbikKKwkqIGRlYnVnL192ZWN0b3IuaCA6IG5hbWUgY2xhc2ggcmVtb3ZlZCBmb3IgX0Jhc2UgKHRoYW5rcyB0byBXaWxsIEZpa2UgZm9yIHRoZSByZXBvcnQpCisKKwkqIF9tb25ldGFyeS5oIC0gYWRkZWQgInN0YXRpYyBjb25zdCBib29sIGludGwiIG1lbWJlciB0byBtZW5leXB1bmN0PD4gdGVtcGxhdGVzIAorCSAgKHRoYW5rcyB0byBBbnRvbiBTZXJnZWV2IGZvciB0aGUgcmVwb3J0KQorCisJKiBfYml0c2V0LmggOiBhZGRlZCBmb3J3YXJkIGZyaWVuZCBkZWNyYXJhdGlvbiBmb3IgcmVmZXJlbmNlICh0aGFua3MgdG8gQW50b24gU2VyZ2VldiBmb3IgdGhlIHJlcG9ydCkKKworCSogX3RyZWUuaCA6IG1hZGUgX1JiX3RyZWVfYmFzZV9pdGVyYXRvcjo6X01fbm9kZSBpbml0aWFsaXplZCBpbiBkZWZhdWx0IGNvbnN0cnVjdG9yICh0aGFua3MgdG8gRGVhbiBTdHVydGV2YW50IGZvciB0aGUgcmVwb3J0KQorCisJKiBfc2V0LmggOiByZWludGVycHJldF9jYXN0PD4gY2hhbmdlZCB0byBDLXN0eWxlIGNhc3QgKHRoYW5rcyB0byBEYXZlIEFicmFoYW1zIGZvciB0aGUgc3VnZ2VzdGlvbikKKworCSogVXNlIG9mIHJhdyBTR0kgYWxsb2NhdG9ycyAobGlrZSBfX25vZGVfYWxsb2MpIGFzIGFuIGFsbG9jYXRvciBwYXJhbWV0ZXIgZGVwcmVjYXRlZCwgCisJICBhdmFpbGFibGUgb25seSB3aXRoIF9fU1RMX1VTRV9SQVdfU0dJX0FMTE9DQVRPUlMgbWFjcm8uIE1heSBiZSByZW1vdmVkIGxhdGVyLgorCSAgX19hbGxvY2F0b3I8VD4gc3RpbGwgYXZhaWxhYmxlIHVubGVzcyBfX1NUTF9OT19FWFRFTlNJT05TIGlzIHNwZWNpZmllZAorCisJKiBfbGltaXRzLmgvX2xpbWl0cy5jIC0gYWxpZ25tZW50IGZpeCBmb3IgU29sYXJpczsKKwkqIE1vZGlmaWVkIF9fZm9ybWF0X2Zsb2F0KiByb3V0aW5lcyB0byB0YWtlIGxvbmcgZG91YmxlIGFzIHBhcmFtZXRlcjsKKyAgICAgICAgICAodGhhdG5rcyB0byBBbnRob255IFdpbGxpYW1zIGZvciB0aGUgcGF0Y2gpCisKKwkqIGRlYnVnL19pdGVyYXRvci5oIC0gd3JhcHBlcnMgZm9yIG5vbmNvbXBsaWFudCBjb21waWxlcnMgbW92ZWQgdW5kZXIgCisJICAjaWZkZWYgX19TR0lfU1RMX05PX0FSUk9XX09QRVJBVE9SICAodGhhbmtzIHRvIERhdmUgQWJyYWhhbXMgZm9yIHRoZSBpbnB1dCkKKworCSogX251bWVyaWNfZmFjZXRzLmggLSBudW1fcHV0PD4gLCBudW1fZ2V0PD4gdmlydHVhbCBtZW1iZXJzIG1hZGUgb3V0bGluZSB0byB3b3JrCisJICBhcm91bmcgZ2NjLTIuOTUgYnVnLgorCQorCSogPGNzdGRpbz4gOiB1bmRlZmluZWQgb2Jzb2xldGUgQyBtYWNyb3MgOiBnZXRjaGFyL3B1dGNoYXIgJiB0aGUgbGlrZS4KKworCSogY3R5cGUuY3BwIDogZml4ZWQgYnVnIHdpdGggY3R5cGU8Y2hhcj46OmlzIChjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIG1hc2spCisJCisJKiBjdHlwZS5jcHAgOiBmaXhlZCBpcyhwcmludCkgZm9yIGNlcnRhaW4gcGxhdGZvcm1zIHdoZXJlIHByaW50IGlzIGEgc2VwYXJhdGUgZmxhZworCisJKiBmdHN0cmVhbS5jcHAgOiBmaXhlZCBjb3JuZXIgY2FzZSBidWcgZm9yIFdpbjMyIHRleHQgb3V0cHV0ICh0aGFua3MgZm9yIERpcmsgU2NocmVpYiBmb3IgdGhlIHJlcG9ydCkgCisKKwkqIF9zdHJlYW1idWYuaCwgX2ZzdHJlYW0uaCwgc3RkaW9fc3RyZW1idWYuaCA6IGZpeGVkIG92ZXJmbG93L3BiYWNrZmFpbCgpIHZpcnR1YWxzIGRlZmluaXRpb247CisJKiBfYml0c2V0LmggOiBfTV9jb3B5X2Zyb21fc3RyaW5nIGZpeGVkIGZvciBub24tbWVtYmVyLXRlbXBsYXRlIGNhc2UgKHRoYW5rcyB0byBBbGV4IFZhbmljIGZvciB0aGUgcmVwb3J0KQorCisJKiBnY2MtZ2xpYmMubWFrLCBjb21tb25fbWFjcm9zLm1hayA6IEdMSUJDIGNvbXBpbGF0aW9uIGZpeGVzICh0aGFua3MgdG8gVGhvbWFzIFdpdHQgZm9yIHRoZSByZXBvcnQpCisJKiBXQ0hBUl9NSU4sIFdDSEFSX01BWCBkZWZpbml0aW9ucyBtb3ZlZCBmcm9tIDxsaW1pdHM+IHRvIDxjd2NoYXI+CisKKwkqIGNoYXJfdHJhaXRzPGNoYXI+Ojp0b19jaGFyX3R5cGUgOiBwYXJhbWV0ZXIgY2hhbmdlZCB0byBpbnQKKworCSogPGNzdGRkZWY+IGluY2x1ZGVkIGluIDxuZXc+IChmb3Igc2l6ZV90KQorCisJKiBfY29kZWN2dDw+Ojpkb19sZW5ndGg6IGZpeGVkIGZpcnN0IHBhcmFtZXRlciB0byBiZSBjb25zdCBtYnN0YXRlX3QgJjsKKwkgIHZpcnR1YWwgZm5zIG1vdmVkIGludG8gLmNwcCwgdG8gd29yayBhcm91bmcgZ2NjIGJ1Z3MKKworCSogX2NvbXBsZXguaCA6IGZpeGVkIGNvbXBsZXg8Pjo6b3BlcmF0b3I9IGFuZCBjb25zdHJ1Y3RvcnMgc2lnbmF0dXJlIHRvIHRha2UgY29uc3QgVCYgCisKKwkqIF9pc3RyZWFtLmMgOiBmaXhlZCBmb3JtYXR0ZWQgaW5wdXQgaW52b2x2aW5nIGJpbmFyeSAnMCcKKworCSogbG9jYWxlX2ltcGwuY3BwIDogaW5zZXJ0aW9uIG9mIHRpbWVfcHV0PHdjaGFyX3Q+IGZpeGVkCisJCitUaGUgZm9sbG93aW5nIGNoYW5nZXMgd2VyZSBtYWRlIGluIDQuMCBiZXRhIDcgc2luY2UgNC4wIGJldGEgNjoKKworICAgICAgIAkqIE1lcmdlZCBzZXJpZXMgb2YgZml4ZXMvd29ya2Fyb3VuZHMgYnkgVHN1dG9tdSBZb3NoaWRhICh0aGFua3MhKToJCisgICAgICAgCSogY21hdGgsICBfY29tcGxleC5oLCBzdGxfYXBwbGUuaCwgX2RlcXVlLmggLSBNUFcvTVJDIHNwZWNpZmljIHdvcmthcm91bmRzCisgICAgICAgCSogX2JpdHNldC5oIC0gcmVtb3ZlZCB0aGUgb2Jzb2xldGUgX1dvcmRUIHRlbXBsYXRlIHBhcmFtZXRlcnMuCisgICAgICAgCSogX2N0eXBlLmgsIF9jb2RlY3Z0LmgsIF9jb2xsYXRlLmgsIF9pc3RyZWFtLmgsICAgICBfbWVzc2FnZXNfZmFjZXRzLmgsIF9tb25ldGFyeS5jCisgICAgICAgCSAgX21vbmV0YXJ5LmgsIF9udW1lcmljX2ZhY2V0cy5oLCAgX3RpbWVfZmFjZXRzLmggLSBhZGRlZCB3b3JrYXJvdW5kIGZvciBsb2NhbGUncyBuZXN0ZWQgY2xhc3MuCisgICAgICAgCSogX29zdHJlYW0uY19vc3RyZWFtLmggLSBhZGRlZCBwcm9wb3NlZCBtb2RpZmljYXRpb24gYWdhaW5zdCB0aGUgPG9zdHJlYW0+IGNpcmN1bGFyIGluY2x1c2lvbiBwcm9ibGVtLgorICAgICAgIAkqIHRlc3QvZWgvdGVzdF9kZXF1ZS5jcHAgLSByZW1vdmVkIHRoZSBvYnNvbGV0ZSB0ZW1wbGF0ZSBhcmd1bWVudAorCisJKiBfYml0c2V0LmggLSByZW1vdmVkIG9ic29sZXRlIGFkYXB0b3IgKHRoYW5rcyB0byBBbGV4IFZhbmljIGZvciB0aGUgcmVwb3J0KQorCisJKiBfW2lvXXN0cmVhbS5oIC0gcmVtb3ZlZCBleHRyYSBETEwgc3BlY3MgKHRoYW5rcyB0byBEYW5ueSBTbWl0aCBmb3IgdGhlIHJlcG9ydCkKKworCSogc3RsX21zdmMuaCAtIGZpeGVkIGJ1ZyBjYXVzZWQgc3RhdGljIGxpYiB0byBhbHdheXMgYmUgc2VsZWN0ZWQKKwkKKwkqIGdjYy5tYWsgLSBmaXhlZCBBUiBkZWZpbml0aW9uIGZvciBzdGF0aWMgbGluayAKKworCSogQWRkZWQgd29ya2Fyb3VuZCBmb3Igc3RhdGljIGxvY2FsZTo6aWQgbWVtYmVyIGluIERMTCBmb3IgbWluZ3czMiAodGhhbmtzIGZvciBEYW5ueSBTbWl0aCBmb3IgdGhlIHJlcG9ydCkKKwkKKwkqIF9zdHJpbmdfaW8uaCA6IGFkZGVkIF93aWRlbigpIHRvIGdldCBnZXRsaW5lKCkgY29tcGlsZSB3aXRoIHdjaGFyIChzb21ld2hhdCBtaXNzaW5nIGluIGI2ICwgdGhhbmtzIHRvIE1pa2hhaWwgTGVvbm92IGZvciByZW1pbmRlcikKKwkKKwkqIHRocmVhZHMuaCAtIGZpeGVkIGd1YXJkcyBmb3IgRHJlYW1TZWdhIFdpbkNFICh0aGFua3MgdG8gQmVuIE5hc29uIGZvciB0aGUgcmVwb3J0KQorCisJKiBmc3RyZWFtLmNwcCA6IGZpeGVkIHRydW5jYXRpb24gZm9yIFdJTjMyICh0aGFua3MgdG8gQnJ1Y2UgQWxkZXJzb24gZm9yIHRoZSByZXBvcnQpCisKKwkqIF9pc3RyZWFtLmMvX01faWdub3JlX3VuYnVmZmVyZWQoKSAtIGZpeGVkIGNvdW50IGJ1ZyAKKworCSogX2lzdHJlYW0uYy8gcmVhZHNvbWUoKSA6IGZpeGVkIGV4dHJhIGZhaWxiaXQgc2V0dGluZyBvbiBlb2YKKworCSogX19nZXRfaW50ZWdlciAtIGVuaGFuY2VkIHVzaW5nIGEgdGFibGU7IGlucHV0IHZhbHVlIG1hZGUgdW5jaGFuZ2VkIGluIGNhc2Ugb2YgZXJyb3IuCisKKwkqIF9fZ2V0X2Jhc2Vfb3JfemVybyAtIG1vcmUgY29kZSBmYWN0b3JlZCBvdXQKKworCSogc3RsX3dpbmNlLmggOiBmaXhlZCBhc3NlcnQoKSBkZWZpbml0aW9uIGZvciBXaW4gQ0UgKHRoYW5rcyB0byBBbmRyZXcgV2F0ZXJzIGZvciB0aGUgcmVwb3J0KQorCisJKiB2Y19zZWxlY3RfbGliLmggIiBmaXhlZCBfX2RlY2xzcGVjIHNlbGVjdGlvbiBmb3IgV2luIENFICh0aGFua3MgdG8gQW5kcmV3IFdhdGVycyBmb3IgdGhlIHJlcG9ydCkKKworCSogX3JvcGUuYyAtIGZpeGVkIGJ1ZyBpbiBfU19kZXN0cl9jb25jYXRfY2hhcl9pdGVyICh0aGFua3MgdG8gRS5NdXNzZXIgZm9yIHRoZSBmaXgpCisKKwkqIGRlYnVnL192ZWN0b3IuaCAtIGZpeGVkIERMTCBleHBvcnQgZm9yIHZlY3Rvcjx2b2lkKj4KKworCSogX3ZlY3Rvci5oLCBfZGVxdWUuaCwgX2J2ZWN0b3IuaCAtIG9ic29sZXRlIGd1YXJkcyBhcm91bmQgYXQoKSBtZXRob2RzIHJlbW92ZWQgOworCSogdHlwZV90cmFpdHMuaCAtIFdpbkNFIGNvbXBhdGliaWxpdHkgZml4ZXMgZm9yIC0+IG9wZXJhdG9yIGRlZmluaXRpb24gOworCSogX3ZlY3Rvci5oLCBfZGVxdWUsaCAtIHJlbW92ZWQgZXh0cmEgY2FzdHMgKHRoYW5rcyB0byBBbmRyZXcgV2F0ZXJzIGZvciB0aGUgcmVwb3J0KQorCisJKiBfYWxnb2Jhc2UuaCAtIG9wdGltaXplZCBsZXhpY29ncmFmaWNhbF9jb21wYXJlKCkgb3ZlcmxvYWQgZm9yIGNoYXIqCisJCitUaGUgZm9sbG93aW5nIGNoYW5nZXMgd2VyZSBtYWRlIGluIDQuMCBiZXRhIDYgc2luY2UgNC4wIGJldGEgNToKKworCSogTWVyZ2VkIGNoYW5nZXMgZnJvbSBTR0kgU1RMIHNuYXBzaG90cyAwNC8wMywgMDQvMTQsIDA0LzE4LgorCisJKiBJb3N0cmVhbXMgcG9ydGVkIHRvIEFwcGxlIE1QVy9NUkMgKHRoYW5rcyB0byBUc3V0b211IFlvc2hpZGEgZm9yIHRoZSBjb250cmlidXRpb24pCisKKwkqIElvc3RyZWFtcyBwb3J0ZWQgdG8gT1NGMS9UcnU2NCAodGhhbmtzIHRvIE1hcmMgVy4gTWVuZ2VsIGZvciB0aGUgY29udHJpYnV0aW9uKQorCisJKiBJb3N0cmVhbXMgcG9ydGVkIHRvIEZyZWVCU0QgKCBUaGFua3MgdG8gU21zIGZvciB0aGUgY29udHJpYnV0aW9uKQorCQorCSogPGRlcXVlPiA6IGV4dHJhIHRlbXBsYXRlIHBhcmFtZXRlciByZW1vdmVkCisJCisJKiBsb2NhbGU6OmlkLCBsb2NhbGU6OmZhY2V0IDogcmV2ZXJ0ZWQgdG8gbmVzdGVkIGNsYXNzZXMgYXMgc3RhbmRhcmQgcHJlc2NyaWJlcworCQorCSogX3N0cmluZ19pby5oIDogYWRkZWQgX3dpZGVuKCkgdG8gZ2V0IGdldGxpbmUoKSBjb21waWxlIHdpdGggd2NoYXIgKHRoYW5rcyB0byBNaWtoYWlsIExlb25vdiBmb3IgdGhlIHBhdGNoKQorCisJKiBjb2xsYXRlX2J5bmFtZVtfd10uY3BwIDogZml4ZXMgZm9yIFZDKysgNS4wIGJ1aWxkIHcvX19TVExfREVCVUcgKHRoYW5rcyB0byBQZXRyIE92Y2hlbmtvdiBmb3IgdGhlIHBhdGNoKQorCisJKiA8Y29tcGxleD4gOiBfX1NUTF9DT01QTEVYX05BTUVTUEFDRSBkZWZpbmVkIGJlZm9yZSBpbmNsdXNpb24gb2YgaW1wbC4gaGVhZGVyIAorCSAgICAgICAgICAgICAgKHRoYW5rcyB0byBNYXR0aGV3IEtlbGx5IGZvciB0aGUgcGF0Y2gpCisKKwkqIG1ha2VmaWxlcyBpbiAic3JjIiA6IGltcHJvdmVkIHRvIGdldCBlYWNoIGNvbXBpbGVyIHRvIHB1dCBvYmplY3QgZmlsZXMgaW4gc2VwYXJhdGUgZGlyZWN0b3J5IDoKKwkgIC4vb2JqLyQoQ09NUCkvRGVidWcsIGV0Yy4gQ09NUCBpcyBnaXZlbiBzb21lIGRlZmF1bHQgdmFsdWUgZm9yIGVhY2ggY29tcGlsZXIsIGJ1dCBtYXkgYmUgYWxzbyBvdmVycmlkZGVuLgorCisJKiAic3JjIiBzdWJkaXJlY3RvcnkgOiBhZGRlZCBzdGxwb3J0X3ByZWZpeC5oIGZpbGUgZm9yIHByZWNvbXBpbGVkIGhlYWRlciBzdXBwb3J0OyAKKwkgICBWQysrIG1ha2VmaWxlcyBtYWtlIHVzZSBvZiB0aGVtICAKKwkKKwkqIHN0bC9faXRlcmF0b3JfYmFzZS5oIDogcHJvdmlkZWQgX19TVExfTk9OVEVNUExfQkFTRV9NQVRDSF9CVUcgCisJICB3b3JrYXJvdW5kIGZvciBuZXcgZm9ybSBvZiBkaXN0YW5jZSgpLgorCisJKiA8bGltaXRzPiA6IGFkZGVkIGNhc3QgdG8gV0NIQVJfTUFYIGRlZmluaXRpb24gKHRoYW5rcyBmb3IgRGF2ZSBBYnJhaGFtcyBmb3IgdGhlIHJlcG9ydCkuICAKKworCSogc3RsX3VzZXJfY29uZmlnLmgsIHN0bC9fY29uZmlnLmggLSBzZXR0aW5nIHNwbGl0dGVkIGFuZCBvcmdhbml6ZWQgbW9yZSBwcm9wZXJseS4gCisKKwkqIHRpbWVfZmFjZXRzLmNwcCAtIGV4dHJhIGluc3RhbnRpYXRpb25zIHJlbW92ZWQgKHRoYW5rcyB0byBNYXR0aSBSaW50YWxhIGZvciB0aGUgcmVwb3J0KS4KKworCSogc3RkaW9fc3RyZWFtYnVmLmggOiBhZGRlZCBleHBsaWNpdCBxdWFsaWZpY2F0aW9ucyBvZiBDIGxpYiBmdW5jdGlvbnMgZm9yIGdjYy0yLjkxCisKKwkqIFNHSSBjb2RlIHVzZWQgZm9yIGNvbXBhdGliaWxpdHkgdy9vbGRlciB2ZXJzaW9ucyBhcmUgZ3VhcmRlZCB3aXRoICNpZm5kZWYgX19TVExfTk9fQU5BQ0hST05JU01TCisKKwkqIFNHSSBleHRlbnNpb25zIGFyZSBndWFyZGVkIHdpdGggI2lmbmRlZiBfX1NUTF9OT19FWFRFTlNJT05TCisKKwkqIFNHSS9IUCBhbmFjaHJvbmlzbXMgYXJlIGd1YXJkZWQgd2l0aCAjaWZuZGVmIF9fU1RMX05PX0FOQUNIUk9OSVNNUworCisJKiA8dHlwZWluZm8+IDogLmggZmlsZSBpbmNsdWRlZCBpZiBfX1NUTF9OT19ORVdfTkVXIGhlYWRlciBpcyBzZXQgCisJICh0aGFua3MgdG8gV2lsbGllIEFyYnVja2xlIGZvciB0aGUgcmVwb3J0KQorCisJKiBTdXBwcmVzZWQgc3B1cmlvdXMgQkM1NSB3YXJuaW5ncyBhYm91dCBpdGVyYXRvcnMKKworCSogY29tcGxleF9pby5oIC0gZml4ZWQgb3BlcmF0b3JzIGRlY2xhcmF0aW9ucyBmb3IgTWV0cm9XZXJrcyAJCisKKwkqIGRlYnVnL19zbGlzdC5oIC0gY2xlYW5lZCB1cCB1c2Ugb2Ygc3RsX2RlYnVnX2RvIG9ic29sZXRlIG1hY3JvICh0aGFua3MgdG8gTWF0dGkgUmludGFsYSkKKworCSogZGVidWcvX2l0ZXJhdG9yLmgsIGRlYnVnL192ZWN0b3IuaCAtIGZpeGVkIHJlbGF4ZWQgaXRlcmF0b3IgY29uc3RydWN0b3JzICh0aGFua3MgdG8gRGF2ZSBBYnJhaGFtcyBmb3IgdGhlIHBhdGNoKSAKKworCSogc3RsL19jb21wbGV4LmggLSBmaXhlcyBmb3IgZ2NjLTIuOTUgb24gSVJJWCAodGhhbmtzIHRvIE1hcmMgVy4gTWVuZ2VsKSAKKwkKKyAgICAgICAgKiBkZWJ1Zy9faXRlcmF0b3IuaCA6IGZpeGVkIHJlbGF4ZWQgY29uc3Qvbm9uLWNvbnN0IGl0ZXJhdG9yIGNvbnN0cnVjdGlvbiBmb3IgZGVidWcgbW9kZQorCSAgKHRoYW5rcyB0byBEYXZlIEFicmFoYW1zIGZvciB0aGUgcGF0Y2gpCisJCisJKiBjb2xsYXRlIDogYWRkZWQgd29ya2Fyb3VuZCBmb3IgU1VOcHJvIGxpbmtlciAodGhhbmtzIHRvIFBldHIgT3ZjaGVua292IGZvciB0aGUgZml4KQorCisJKiBfaW9zLmgsIF9zdHJlYW1idWYuaCAtIGFkZGVkIG9ic29sZXRlIHN0dWZmIHJlcXVpcmVkIGJ5IHRoZSBzdGFuZGFyZAorCisJKiBfY29uZmlnLmgvc3RkZXhjZXB0IC0gaW50cm9kdWNlZCBfX1NUTF9OT1RIUk9XX0lOSEVSSVRFRCB0byBiZSB1c2VkIHdoZW4gd2UgYWN0dWFsbHkgbmVlZAorCSAgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24gZHVlIHRvIGluaGVyaXRhbmNlICh0aGFua3MgdG8gSm9lIGZvciB0aGUgcmVwb3J0KQorCisJKiBfbG9jYWxlLmg6MTA0IDogZml4ZWQgdW1tYW5lZCBwYXJhbWV0ZXJzCisKKwkqIF90ZW1wYnVmLmggLSBmaXhlZCBhYnNlbnQgaW5jbHVzaW9uIG9mIF90ZW1wYnVmLmMKKworCSogPGV4Y2VwdGlvbj4gOiByZWxheGVkIHJ1bGVzIGZvciBpbXBvcnRpbmcgdmVuZG9yIHN5bWJvbHMKKworCSogX2RlcXVlLmggLSBhZGRlZCAhPSBvcGVyYXRvcgorCisJKiBfc3RyZWFtYnVmLmggLSBmaXhlZCBzbmV4dGMoKSBidWcgZm9yIHdjaGFyX3QKKworCSogPG9zdHJlYW0+LCBfbnVtZXJpY19mYWNldHMuaCAtIGNpcmN1bGFyIGRlcGVuZGVuY3kgcmVzb2x2ZWQKKworCSogc3RsL19pb3Nmd2QuaCAtIGFkZGVkIGluY2x1ZGUgZ3VhcmQKKworCSogYmFzaWNfW2lvXXN0cmVhbTo6c2VudHJ5IG1hZGUgaW5uZXIgY2xhc3MgYWdhaW4gKGFzIHBlciBzdGFuZGFyZCkgCisJICBmb3Igbm9uLURMTCBjb21waWxhdGlvbnMuCisKKwkqIHZlY3Rvcjx2b2lkKj4gaXMgdXNlZCBpbiBsb2NhbGUgaW1wbGVtZW50YXRpb24gdG8gcmVkdWNlIGNvZGUgYmxvYXQsCisJICB2ZWN0b3I8dm9pZCo+IGV4cG9ydGVkIGZyb20gRExMCisKKwkqIDxzdGRleGNlcHQ+IDogZXhwb3J0ZWQgbW9yZSBzdHVmZgorCisJKiBzdGxfaW50ZWwuaCA6IElDTCBjb25maWcgbWVyZ2VkIGludG8gc3RsX21zdmMuaAorCisJKiBnY2MubWFrIC0gZml4ZWQgZm9yIHNoYXJlZCB0YXJnZXQKKwkKK1RoZSBmb2xsb3dpbmcgY2hhbmdlcyB3ZXJlIG1hZGUgaW4gNC4wIGJldGEgNSBzaW5jZSA0LjAgYmV0YSA0OgorCisJKiBfaGFzdGFibGUuYzoyNjMgOiByZW1vdmVkIGlubmVlZGVkIGNhc3QgKHRoYW5rcyB0byBXaWxsIEZpa2UgZm9yIHRoZSByZXBvcnQpCisKKwkqIGRlYnVnL19zdHJpbmcuaCA6ICBhZGRlZCBjb252ZXJzaW9uIHRvIG5vbi1TR0kgc3RyaW5nICh0aGFua3MgdG8gVG9kZCBSaWNobW9uZCBmb3IgdGhlIHJlcG9ydCkKKworCSogX2NvbXBsZXguaCA6IGZpeGVkIERMTCBkZWNsYXJhdGlvbnMgZm9yIGkvbyBvcGVyYXRvcnMKKworCSogX29zdHJlYW0uaCA6IGZpeGVkIHNlbnRyeSBiZWhhdm9pdXIgYW5kIERMTCBzcGVjcy4KKworCSogX2lzdHJlYW0uaCA6IGZpeGVkIERMTCBzcGVjcywgb3B0aW1pemVkIHNvbWUgdHJ5L2NhdGNoIGJsb2NrcworCisJKiBfdmVjdG9yLmggOiBmaXhlZCB2ZWN0b3I6Omluc2VydCBib2R5IGRlZmluaXRpb24gZm9yIF9fU1RMX0lOTElORV9NRU1CRVJfVEVNUExBVEVTCisKKwkqIDxleGNlcHRpb24+IDogbW9yZSBjb21waWxlcnMgbGlzdGVkIGFzIGhhdmluZyBmdWxsIGV4Y2VwdGlvbiBoZWFkZXIKKworCSogZGVidWcvX2RlYnVnLmggOiBhZGRlZCBuYW1lc3BhY2UgdG8gX19TVExfQVNTRVJUIGZvciBFSCB0ZXN0IHdoaWNoIHVzZXMgdGhpcyBpbnRlcm5hbCBtYWNyby4KKworCSogcmVzb3VyY2UgaW5mbyBmaXhlZCAodGhhbmtzIHRvIE1pY2hhZWwgRW50aW4gZm9yIHRoZSByZXBvcnQpCisKKwkqIGRlYnVnL19zdHJpbmcuaCA6IGZpeGVkIF9NX3N0YXJ0IHJlc29sdXRpb24gYnVnICh0aGFua3MgdG8gUm9iIGZvciB0aGUgcmVwb3J0ICkKKworCSogPG5ldz4gOiBhZGRlZCBpbXBvcnQgb2YgbmV3X2hhbmRsZXIgc3R1ZmYgZnJvbSB2ZW5kb3IgbmFtZXNwYWNlICh0aGFua3MgdG8gTmlyYW4gQmFsYSBmb3IgdGhlIHJlcG9ydCkuCisKKwkqIHNyYy9jX2xvY2FsZV9nbGliYyAtIG1pc3NlZCBkaXJlY3RvcnkgY29udGVudHMgcmVzdG9yZWQgKHRoYW5rcyB0byBUb2RkIFJpZGVyIGZvciB0aGUgcmVwb3J0KQorCisJKiBtd2Vya3NfcHJqIC0gcHJvamVjdCB1cGRhdGVkIGZvciBuZXcgZmlsZSBzZXQsIHRhcmdldCBuYW1lcyBmb3IgeDg2IGNoYW5nZWQgdG8gY29uZm9ybSB0byBjb21tb24gc2NoZW1hCisKKwkqIF9vc3RyZWFtLmMvX2lzdHJlYW0uYyA6IGZpeGVkIGxvb2t1cCBmb3IgX1NfZW9mIHN5bWJvbCAodGhhbmtzIHRvIEFudG9uIFNlcmdlZXYgZm9yIHRoZSByZXBvcnQpCisKKwkqIF9pb3MuaCAtIGZpeGVkIFZDKysgRExMIHdhcm5pbmcgZm9yIHNwZWNpYWxpemF0aW9ucworCisJKiBzdGxfaWJtLmggLSBkaXNhYmxlZCAibG9uZyBsb25nIiBkdWUgdG8gaW5jb21wbGV0ZSBzdXBwb3J0IG9uIE1WUyBieSByZXF1ZXN0ICh0aGFua3MgdG8gVGlubnkgTmcpCisJCisJKiBjaGFyX3RyYWl0cy5oIC0gd29ya2VkIGFyb3VuZCB3ZWlyZCBnY2MgaW50ZXJuYWwgYnVnIChfX3N6IGlkZW50aWZpZXIgY2hhbmdlZCB0byBfU3opCisJCitUaGUgZm9sbG93aW5nIGNoYW5nZXMgd2VyZSBtYWRlIGluIDQuMCBiZXRhIDQgc2luY2UgNC4wIGJldGEgMzoKKworCSogInNyYyIgZGlyZWN0b3J5IDogc291cmNlIGRpdmlkZWQgaW50byBzbWFsbGVyIHBhcnRzIHRvIGJlIG1vcmUgbWFuYWdlYWJsZSBhbmQgdG8KKwkgIGdldCBtb3JlIGNhY2hlIGxvY2FsaXR5CisKKwkqIHRocm93IHNwZWNpZmljYXRpb25zIHJlbW92ZWQgKG1hY3JvcyBtYWRlIHZvaWQpIC0gdGhhbmtzIHRvIERhdmUgQWJyYWhhbXMgZm9yIHRoZSBzdWdnZXN0aW9uCisJCisJKiBzdGwvX2xpc3QuYyAtIGZpeGVkIHJldmVyc2UoKSAiaW5saW5lIiwgCisJICBfZGVxdWUuaCAtIGZpeGVkIGNhc3QgYnVnIGZvciB4bEMgKHRoYW5rcyB0byBBbGV4IFZhbmljIGZvciB0aGUgcmVwb3J0cykKKwkJCisJKiBzdGwvX3N0cnN0cmVhbS5oIC0gZml4ZWQgRExMIHNwZWNzICh0aGFua3MgdG8gUGFyY2l2YWwgV2lsbGVtcyBmb3IgdGhlIHJlcG9ydCkKKworCSogc3RsL19zdHJpbmcuaCwgZGVidWcvX3N0cmluZy5oIC0gZml4ZWQgY29udmVyc2lvbiBmcm9tIG5hdGl2ZSBzdHJpbmcgd2l0aCBfX1NUTF9ERUJVRworCSAgKHRoYW5rcyB0byBUb2RkIFJpY2htb25kIGZvciB0aGUgcmVwb3J0KS4KKworCSogc3RsL19pc3RyZWFtLmggLSBmaXhlZCBjbGFzaCBvZiAiX19OIiBzeW1ib2wgd2l0aCBjdHlwZS5oIG1hY3JvIGZvciBzb21lIGNvbXBpbGVycworCSAgKHRoYW5rcyB0byBLZWVzIGRlIEJydWluIGZvciB0aGUgcmVwb3J0KQorCisJKiBDb25maWd1cmF0aW9uIGZpeGVkIGZvciBCb3JsYW5kIEMrKyA1LjAyIGNvbXBpbGVyIFsgZGVxdWUgc3RpbGwgZG9lcyBub3Qgd29yayB3aXRoIGl0IF0KKworCSogZ2NjLTIuNy4yIGNvbmZpZ3VyYXRpb24gZml4ZWQJCisKKwkqIFNHSSBpb3N0cmVhbXMgbm93IHdvcmsgZm9yIEJvcmxhbmQgNS41IHdpdGggc3RhdGljIGxpYiAsIHNvbWUgcHJvYmxlbXMgd2l0aAorCSAgbG9jYWxlIGluaXRpYWxpemF0aW9uIHdoZW4gRExMIGlzIHVzZWQuCisJCisJKiBfX2dldF9jX3N0cmluZyBleHBvcnRlZCBpbiBETEwgKHRoYW5rcyB0byBFZCBCYWxsIGZvciB0aGUgcmVwb3J0KS4KKworCSogRU5ESUFOIGZpeGVzIGZvciBDb2RlV2Fycmlvci9ERUMgKHRoYW5rcyB0byBLZXZpbiBXb290ZW4gZm9yIGJyaW5naW5nIHRoaXMgdXApCisKKwkqIHdyYXBfc3RkL2gvc3Ryc3RyZWFtLmggLSBhZGRlZCBtaXNzaW5nIHdyYXBwZXIgKFRoYW5rcyB0byBMYXVyZW50IGZvciB0aGUgcmVwb3J0KQorCisJKiBzdGxfaHBhY2MuaCAtIGZpeGVkICNlbmRpZiBidWcsIAorCSAgX2xpbWl0cy5oLy5jIC0gZml4ZWQgYXJyYXkgaW5pdGlhbGl6YXRpb24sIAorCSAgX3N0cmluZ19pby5oLCBfbG9jYWxlLmggLSBmaXhlZCBjaXJjdWxhciBkZXBlbmRhbmN5LAorCSAgX3NldC5baGNdLCBfaGFzaHRhYmxlLmMsIF9zZXQuaCAtIGFkZGVkIF9fUkVJTlRFUlBSRVRfQ0FTVCBuZWVkIGJ5IHNvbWUgY29tcGlsZXJzOworCSAgX2lbb11zdHJlYW0uYywgX3JvcGUuW2hjXSAtIGxvb2t1cCBmaXhlZCBmb3IgZGVwZW5kYW50IHN5bWJvbHMgCisJICAodGhhbmtzIHRvIEFsYWluIE1pbml1c3NpIGZvciB0aGUgcmVwb3J0cykKKwkKK0FmdGVyLXJlbGVhc2UgbWlub3IgYnVnZml4ZXMgZm9yIGJldGEzOgorCQorCSogc3RsL19saXN0LmMgLSBmaXhlZCByZXZlcnNlKCkgWyBuZXcgU0dJIGNvZGUsIG1lcmdlZCB1bnBvcnRlZCBmaXJzdCBdCisJICBUaGFua3MgZm9yIGV2ZXJ5Ym9keSB3aG8gcmVwb3J0ZWQgaXQuCisJCisJKiBzdGwvX2J2ZWN0b3IuaCA6IGZpeGVkIGFtYmlndWl0eSBwcm9ibGVtIHdpdGggcmVsYXRpb25hbCBpdGVyYXRvcnMKKwkgIGZvciBfX1NUTF9OT19CT09MIGNhc2UgKHRoYW5rcyB0byBBbGV4IFZhbmljIGZvciB0aGUgcmVwb3J0KS4KKworCSogc3RsL19hbGxvYy5jLCBzdGwvX3RocmVhZHMuYyAtIGZpeGVkIHN0YXRpYyBtZW1iZXIgZGVmaW5pdGlvbnMgZm9yIGNvbXBpbGVycworCSAgdGhhdCBsYWNrIGF1dG9tYXRpYyBzdGF0aWMgZGF0YSBtZW1iZXJzIChnY2MtMi43KS4gVGhhbmtzIHRvIEh1YW5nLU1pbmcgSHVhbmcgCisJICBmb3IgdGhlIHJlcG9ydC4gCisKKwkqIHN0YW5kYXJkIHdpZGUgc3RyZWFtcyBpbml0aWFsaXphdGlvbiBidWcgb24gV2luMzIgZml4ZWQgKHRoYW5rcyB0byBIYXJvbGQgUHV0bWFuIGZvciB0aGUKKwkgIHJlcG9ydCkKKwkKK1RoZSBmb2xsb3dpbmcgY2hhbmdlcyB3ZXJlIG1hZGUgaW4gNC4wIGJldGEgMyBzaW5jZSA0LjAgYmV0YSAyOgorCisJKiBNZXJnZWQgU0dJIGNoYW5nZXMgZnJvbSAwMi8xOCBzbmFwc2hvdC4KKwkKKyAgICAgICAgKiBNaW5nMzJXIChnY2MgV2luMzIgcG9ydCB1c2luZyBNUyBydW50aW1lIGxpYikgaXMgbm93IGZ1bGx5IHN1cHBvcnRlZC4gCisKKwkqIC5kbGwgYnVpbGQgc2NoZW1hIGltcHJvdmVkLCBub3cgYnVpbGRzIHdpdGggbWluZ3czMiBhbmQgQm9ybGFuZCBDKysKKwkgIChCb3JsYW5kIGhhcyBzb21lIHByb2JsZW0gd2l0aCBudW1lcmljIGkvbykKKwkKKwkqIFZDKysgdmVyc2lvbiBidWdmaXhlcyBpbiA8eHN0cmluZz4vPHh1dGlsaXR5Pi88eHN0cmluZz4gCisJICAodGhhbmtzIHRvIFRvZGQgUmljaG1vbmQgZm9yIHRoZSByZXBvcnQpCisKKwkqIF9idmVjdG9yLmggLSByZWxhdGlvbmFsIG9wZXJhdG9ycyBkZWZpbmVkIG9ubHkgZm9yICJiaXRfdmVjdG9yIiwgCisJICAgbm90IGZvciAidmVjdG9yIiBzcGVjaWFsaXphdGlvbnMgKHRoYW5rcyB0byBFZHdhcmQgQmFsbCBmb3IgdGhlIHJlcG9ydCkKKworCSogc3JjL2xvY2FsZV9pbXBsLmggLSBmaXhlZCBtdWx0aXBsZSBkZWZpbmVkIHN5bWJvbCBwcm9ibGVtIHdpdGggZ2NjCisJICAoVGhhbmtzIHRvIE1hdHRpIFJpbnRhbGEgZm9yIHRoZSByZXBvcnQpCisKKwkqIGNvbmZpZy9zdGxfaWJtLmggLSBfX1NUTF9OT19UWVBFSU5GTyBhZGRlZCAodGhhbmtzIGZvciBUaW5ueSBOZykuCisJCisJKiA8c3RyaW5nPiA6IF9zdGxfc3RyaW5nX2lvLmgvYyBpbnRyb2R1Y2VkIHRvIGZpZ2h0IGludGVyLWRlcGVuZGVuY2llcworCisJKiBfYnZlY3Rvci5oIC0gYWRkZWQgZml4IGZvciAtdGVtcGluYyBjb21waWxhdGlvbiBvbiBBSVggKHRoYW5rcyB0byBBbGV4IFZhbmljIGZvciB0aGUgcGF0Y2gpCisKKwkqIGZzdHJlYW0uY3BwIC0gX01fd3JpdGUgYnVnIGZvciBXaW4zMiB0ZXh0IG1vZGUgZml4ZWQgKHRoYW5rcyB0byBNaWtlIFB5bGUpCisKKwkqIF9zdHJpbmcuaCA6IGRlYnVnIHZlcnNpb24gaW5jbHVkZWQgcHJpb3IgdG8gX3N0cmluZy5jOworCisJKiBkZWJ1Zy9fZGVidWcuaC8uYywgZGVidWcvX2RlcXVlLmgsIGRlYnVnL19zdHJpbmcuaCAtIGZpeGVkIGRlYnVnIG1vZGUgYnVnczsKKwkgIEFwcGxlIGNvbXBpbGVycyBjb25maWcgZml4ZXMgLyBpb3N0cmVhbSB3cmFwcGluZyBmaXhlcyAvIEVIIHRlc3QgZml4ZXMsCisJICAodGhhbmtzIHRvIFRzdXRvbXUgWW91c2hpZGEgZm9yIHRoZSBwYXRjaCkKKworCSogY3NldGptcC9zZXRqbXAuaCAtIGd1YXJkcyBhZGRlZCBhZ2FpbnN0IFZDKysgI2RlZmluZXMgKHRoYW5rcyB0byBHYXZpbiBXb29kKQorCisJKiBzdGwvX2lvc2Z3ZC5oIDogX19TVExfREVGQVVMVF9DT05TVFJVQ1RFRCB1c2VkIGluc3RlYWQgb2YgX19TVExfTlVMTF9DSEFSX0lOSVQKKwkodGhhbmtzIHRvIEFsZXggVmFuaWMgZm9yIHRoZSByZXBvcnQpCisKKwkqIF9fc3RsX2dldF9jX3N0cmluZygpIC0gbWFkZSBleHRlcm4gbm9uLXRlbXBsYXRlIGZvciBTR0kgaW9zdHJlYW1zIG1vZGUuCisKKwkqIF9fY2RlY2wgY2FsbGluZyBjb252ZW50aW9uIGZpeGVzIC0gbm93IHdvcmtzIGZvciBkZWJ1ZyAmIG5vbi1kZWJ1ZyBjb2RlLgorCisJKiBfbGltaXRzLmgvLmMgOiBzdGF0aWMgZGF0YSBtb3ZlZCBmcm9tIGlubGluZSBmdW5jdGlvbnMgaW50byBhIGNsYXNzLgorCisJKiBzdGxwb3J0X21zdmMucmMgcmVzb3VyY2UgZmlsZSBhZGRlZCBmb3IgRExMJ3MgKHRoYW5rcyB0byBNaWNoYWVsIEVudGluKQorCisJKiBzdGxwb3J0L2NvbmZpZy9zdGxfd2luY2UuaCA6IGFkZGVkIGFib3J0KCkvYXNzZXJ0KCkgZGVmaW5pdGlvbnMKKwkgICh0aGFua3MgdG8gR2F2aW4gV29vZCBmb3IgdGhlIHJlcG9ydCkKKworCSogSW5pdGlhbCBpb3N0cmVhbXMgcG9ydCBmb3IgeGxDICh0aGFua3MgdG8gQWxleGFuZGVyIFZhbmljIGZvciB0aGUgcGF0Y2gpLgorCisJKiBjb25maWcgZmlsZXMgLSBtYWRlIHNhZmUgZm9yIEMgY29tcGlsZXJzCisKKwkqIHNyYy9jX2xvY2FsZV9zdHViLmMgLSBtYWRlIHN0cnVjdHVyZSBmb3IgZnVsbCBwbGF0Zm9ybS1kZXBlbmRlbnQgCisJICBsb2NhbGVzIG90aGVyIHRoYW4gIkMiLiBHbGliYyBpbXBsZW1lbnRhdGlvbiBtZXJnZWQuCisJCitUaGUgZm9sbG93aW5nIGNoYW5nZXMgd2VyZSBtYWRlIGluIDQuMCByZWxlYXNlIGNhbmRpZGF0ZSAyIHNpbmNlIDQuMCByZWxlYXNlIGNhbmRpZGF0ZSAxOgorCisJKiBTb2xpZCBhcHByb2FjaCB0byBfX1NUTF9ERUZBVUxUX0NPTlNUUlVDVE9SX0JVRyBwcm9ibGVtIGltcGxlbWVudGVkLAorCSAgcm9wZS5oIHR5cG8gZml4ZWQgKHRoYW5rcyB0byBBbGV4IFZhbmljIGZvciB0aGUgcmVwb3J0KSAKKworCSogZ2V0bGluZSBhbmQgc3RyZWFtIG9wZXJhdG9ycyBtb3ZlZCBmcm9tIF9pc3RyZWFtLmMgdG8gX3N0cmluZy5jIAorCSAgd2hlcmUgdGhleSBiZWxvbmcgKHRoYW5rcyBmb3IgUGV0ciBPdmNoZW5rb3YpCisKKwkqIDxuZXc+IGZpeGVkIHRvIGltcG9ydCBub3Rocm93IGFuZCBub3Rocm93X3QKKworCSogQm9ybGFuZCBDKysgNS41IChmcmVlIGNvbXBpbGVyKSBzdXBwb3J0ZWQgKGlvc3RyZWFtcyB3b24ndCBjb21waWxlIHlldCkuCisJCisJKiBTVU4gQ0MgNi4wIEVBIC0gbmV3IGZlYXR1cmVzIHVuYWJsZWQgKG1vc3QgYW5ub3VuY2VkIGZlYXR1cmVzIHN0aWxsIGRvbid0IHdvcmsgdGhvdWdoKQorCQorCSogSFAgQUNDIGNvbmZpZ3VyYXRpb24gdXBkYXRlZCwgc29tZSBmaXhlcyBmb3IgbmV3IGFDQyBiZXRhKHRoYW5rcyB0byBBbGFpbiBNaW5pdXNzaSkuCisKKwkqIFdpbmRvd3MgQ0UgY29tcGF0aWJpbGl0eSBmaXhlZCAodGhhbmtzIHRvIEdhdmluIFdvb2QgZm9yIHRoZSByZXBvcnQpCisJCisJKiA8c3N0cmVhbT4gZml4ZWQgZm9yIG5vbi1TR0kgY2FzZSwgaW9zLmNwcCBidWcgaW4gX19TVExfTk9fRVhDRVBUSU9OUyAKKwkgIG1vZGUgZml4ZWQsIGRlYnVnIGl0ZXJhdG9ycyBmaXggKHRoYW5rcyB0byBUb2RkIFJpY2htb25kKS4KKwkKKwkqIFZDKysgNS4wIGFuZCA0LjIgY29tcGF0aWJpbGl0eSBmaXhlZCAodGhhbmtzIHRvIElseWEgZm9yIHRoZSByZXBvcnQpCisKKwkqIF9fY2RlY2wgY2FsbGluZyBjb252ZW50aW9uIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGZvciBWQysrICYgc3RhdGljL2dsb2JhbCBmdW5jdGlvbnMuCisKKwkqIHZjX2NvbW1vbi5tayA6IGRlYnVnIHR5cGUgY2hhbmdlZCB0byBDViAodGhhbmtzIHRvIE1pa2UgUHlsZSBmb3IgdGhlIHNvbHV0aW9uKQorCQorCSogZnN0cmVhbS5jcHAgOiBXaW4zMiB0ZXh0IG1vZGUgOiBidWdzIGZpeGVkLCBTR0kgY29kZSB1c2VkLgorCSAgZml4ZWQgX01fb3BlbigpIGNyZWF0aW9uIGZsYWdzIGZvciBXaW4zMiAodGhhbmtzIHRvIE1pa2UgUHlsZSBmb3IgdGhlIHJlcG9ydCkKKworICAgICAgICAqICJpbnN0YWxsIiB0YXJnZXQgYWRkZWQgZm9yIFZDKysgdG8gaW5zdGFsbCAuZGxsJ3MgaW50byBXaW4gc3lzdGVtIGRpcmVjdG9yeS4KKworCSogX19TVExfVVNFX1NUQVRJQ19MSUIgc3dpdGNoIGFkZGVkIHRvIGFkZCBmbGV4aWJpbGl0eSB0byBWQysrIGxpbmtpbmcuCisJCisJKiBfX3N0bF9kZWJ1Z19tZXNzYWdlIGZvciBXSU4zMi9Vbmljb2RlL01GQyBpbXByb3ZlZCAKKwkgICh0aGFua3MgdG8gRWR3YXJkIEJhbGwsIENodmV0c292IGZvciB0aGUgcmVwb3J0cykKKworCSogTVZTIGZpeCBmb3IgYXV0b19wdHI8PiAodGhhbmtzIHRvIFRpbm55IE5nKQorCisJKiBkZWJ1Zy9fdHJlZS5oLCBkZWJ1Zy9fdmVjdG9yLmggInR5cGVuYW1lIiBmaXhlcywgdGhhbmtzIHRvIE1hdHRpIFJpbnRhbGEuCisKKwkqIGNfbG9jYWxlLmggOiBmaXggZm9yIFNvbGFyaXMgMi41LnggKHRoYW5rcyB0byBCLiBLLiBPeGxleSkKKworCSogX2J2ZWN0b3IuaCA6IFdhdGNvbSBjb21wYXRpYmlsaXR5IGZpeGVkICh0aGFua3MgdG8gUmljYXJkbyBFLiBHYXlvc28gZm9yIHRoZSByZXBvcnQpCisKKwkqIF9fU1RMX0RPTlRfUkVERUZJTkVfU1REIGZsYWcgYmVoYXZpb3VyIGZpeGVkCisJCitUaGUgZm9sbG93aW5nIGNoYW5nZXMgd2VyZSBtYWRlIGluIDQuMCByZWxlYXNlIGNhbmRpZGF0ZSAxIHNpbmNlIDMuMi4yIEJldGEgNCA6CisJCisJKiBNZXJnZWQgY2hhbmdlcyBtYWRlIHRvIFNHSSBzdGFuZGFyZCBsaWJyYXJ5IHNuYXBzaG90IG9uIDAxLzI4LgorCisJKiBGaXhlZCBidWcgd2l0aCBpc3RyZWFtIHJlYWRpbmcgbnVtYmVycyBpbiBoZXggbW9kZSAodGhhbmtzIHRvIERhdmUgQWJyYWhhbXMKKwkgIGZvciB0aGUgcGF0Y2gpLgorCisJKiBEZWJ1ZyBtb2RlIHJlZGVzaWduZWQgKGFnYWluKSAtIG5vIGV4dHJhIG5hbWVzcGFjZXMgaXMgYmVpbmcgdXNlZAorCSAgRmluYWxseSwgaXQgd29ya3MgZm9yIE1TVkMgYW5kIGFsbCBvdGhlciBwbGF0Zm9ybXMuCisKKwkqIF9fU0dJX1NUTF9PV05fSU9TVFJFQU1TIG1hZGUgdG8gYmUgdGhlIGRlZmF1bHQgbW9kZSBleGNlcHQgZmV3IHBsYXRmb3JtcworCSAgbm90IHByb3ZpZGVkIHdpdGggbWFrZWZpbGVzIHRvIGJ1aWxkIFNUTHBvcnQgeWV0LgorCQorCSogQ2hhbmdlZCBzdHJhdGVneSBvbiByZWRlZmluaWcgc3RkOjogbmFtZXNwYWNlLiAKKwkgIHByb2xvZy9lcGlsb2cgdGVjaG5vbG9neSB1c2VkIHRvIGdldCBjbGVhbiBuYW1lc3BhY2Ugd3JhcHBpbmcuCisJICBJdCBhbHNvIGFsbG93cyBmb3IgbWFuYWdpbmcgc3RhY2sgb2YgcHJhZ21hcyAKKwkgIChzZWUgc3RscG9ydC9zdGwvY29uZmlnL19wcm9sb2cuaCxfZXBpbG9nLmgpIHRvIGdldCByaWQgb2Ygd2FybmluZ3MuCisJICBOb3RlIDogZGVmYXVsdCBuYW1lc3BhY2UgY2hhbmdlZCB0byBfU1RMOjogdG8gc2F0aXNmeSBpbXBsZW1lbnRhdGlvbgorCSAgY29uc3RyYWludHMgYW5kIHRvIGFsbG93IGZvciBtb3JlIGNvbXBhY3Qgc3ltYm9scy4gCisJICAic3RscG9ydDo6IiBuYW1lc3BhY2UgaXMgc3RpbGwgZGVmaW5lZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisKKwkqIGlvc3RyZWFtcyBsaWJyYXJ5IG5vdyBjb21waWxlcyBvbiBIUCB3aXRoIGFDQyAodGhhbmtzIHRvIFN0ZXZlbiBTZXJvY2tpIGZvciB0aGUgcGF0Y2gpLgorCisJKiBDb25maWd1cmF0aW9uIGZvciBTVU4gV29ya3Nob3AgNi4wIEVBIHByb3ZpZGVkLgorCQorCSogRm9yIFZDKyssIGNvcnJlc3BvbmRpbmcgW3NlbGVjdGVkIGJ5IC9NVChkKSBvciAvTUQoZCkgc3dpdGNoXQorCSAgU1RMcG9ydCBpb3N0cmVhbXMgbGlicmFyeSBpcyBiZWluZyBsaW5rZWQgYXV0b21hdGljYWxseSAtIGFsbCB5b3UKKwkgIG5lZWQgaXMgdG8gcHV0IGxpYnJhcnkgaW4gbGliIHNlYXJjaCBwYXRoIG9yIHNwZWNpZnkgYWRkaXRpb25hbCBsaWJyYXJ5IHBhdGguCisKKwkqIEFiaWxpdHkgdG8gdHVybiBvbiBhbGwgd2FybmluZ3MgaW4geW91ciBvd24gY29kZSBpZiB5b3UncmUgdXNpbmcgCisJICBhIGNvbXBpbGVyIHdpdGggYXBwcm9wcmlhdGUgc3VwcG9ydCAoZS5nLiBNU1ZDNikuCisJICAKKwkqIFNtYWxsIGZpeGVzIHBvc3RlZCB0byB0aGUgZm9ydW0gaW50ZWdyYXRlZDoKKwkKKwkgKiBjb25maWcvc3RsX3dpbmNlLmggOiBhZGRlZCBfX1NUTF9IQVNfTk9fTkVXX0NfSEVBREVSUyBzd2l0Y2gKKwkgKiB3cmFwX3N0ZC9zdHJzcmVhbSAgOiBmaXhlZCBwcmVwcm9jZXNzb3IgYnVnLCBzdHJzdHJlYW0uaCBpbmNsdWRlZAorCSAgd2hlbiBub3QgdXNpbmcgbmV3LXN0eWxlIGhlYWRlcnMKKwkgKiBvdGhlciBmaXhlcworCQorVGhlIGZvbGxvd2luZyBjaGFuZ2VzIHdlcmUgbWFkZSBpbiAzLjIuMiBiZXRhIDQgc2luY2UgMy4yLjIgQmV0YSAzOgorCisJKiBNZXJnZWQgY2hhbmdlcyBtYWRlIHRvIFNHSSBzdGFuZGFyZCBsaWJyYXJ5IHNuYXBzaG90IG9uIDAxLzEwLgorCisJKiBNYWpvciByZXN0cnVjdHVyaW5nIG9mIGhlYWRlciBmaWxlcyAtIGZvciBtYWludGFpbmFiaWxpdHkgYW5kCisJICA4LjMgZmlsZXN5c3RlbXMgYmVuZWZpdC4KKworCSogTWFqb3IgZGVidWcgbW9kZSBpbXByb3ZlbWVudHMgLSBuZXcgZGVidWcgbW9kZSBub3cgd29ya3Mgd2l0aAorCSBWQysrLCBnY2MsIGludGVsLCBTVU5wcm8sIE1ldHJvV2Vya3MuCisKKwkqIFJlZ3Jlc3Npb24gdGVzdCBzdWl0ZSBjaGFuZ2VkIHRvIG5ldy1zdHlsZSBoZWFkZXJzIC0gdGhhbmtzIHRvCisJICBEaW1hIFBhc2VjaG5payBmb3IgdGhlIGluaXRpYWwgcG9ydC4KKwkKKwkqIDxyb3BlPiBmaXhlcyBmb3IgV2F0Y29tCisKKwkqIG1hbnkgbWlzY2VsbGFub3VzIGZpeGVzLgorCQorVGhlIGZvbGxvd2luZyBjaGFuZ2VzIHdlcmUgbWFkZSBpbiAzLjIuMiBiZXRhIDMgc2luY2UgMy4yLjIgQmV0YSAyOgorCisJKiBNZXJnZWQgY2hhbmdlcyBtYWRlIHRvIFNHSSBzdGFuZGFyZCBsaWJyYXJ5IHNuYXBzaG90IGluIERlY2VtYmVyLgorCQorCSogc3RkOjogaXMgbm90IHVzZWQgZm9yIFNUTHBvcnQgbmFtZXNwYWNlIGV2ZW4gd2l0aCBTR0kgaW9zdHJlYW1zLAorCSAgdG8gYXZvaWQgcG9zc2libGUgY2xhc2hlcyBhbmQgZmFjaWxpdGF0ZSAzcmQtcGFydHkgbGlicmFyeSB1c2UuCisgICAgICAgICAgU2FtZSBtYWNybyByZWRlZmluaXRpb24gdGVjaG5pcXVlIGZvciBzdGxwb3J0OjogdXNlZCB0byBrZWVwIGNsaWVudHMKKwkgIGNvZGUgd2l0aCBsaXRlcmFsIHN0ZDo6IGhhcHB5IGFzIGluIG5hdGl2ZSBpb3N0cmVhbXMgbW9kZS4KKwkKKwkqIEMgbGlicmFyeSBoZWFkZXJzIHdyYXBwaW5nIGNoYW5nZWQgdG8gYWxsb3cgbXVsdGlwbGUgaW5jbHVzaW9uIHRyaWNrcworCSAgKG5lZWRlZCBieSBnY2MtMi45NSBtb3N0bHkpCisJCisJKiBnY2MtMi45NSBhbmQgQ29kZVdhcnJpb3IgY29uZmlndXJhdGlvbnMgdXBkYXRlZC4KKworCSogSFAgYUNDIGZpeGVzIGFwcGxpZWQuCisKKwkqIFZpc3VhbCBDKysgLSBhZGRlZCBzdGF0aWMgbGlicmFyeSB0YXJnZXRzLCBidWlsZCByZWZpbmVkLgorCSAgRml4ZWQgbWVtb3J5LW1hcHBpbmcgYnVncy4KKwkKKwkqIGF1dG9fcHRyIHVwZGF0ZWQsIG5vdyBpdCBwYXNzZXMgcG9seW1vcnBoaWMgdGVzdHMgd2l0aCBWQysrLgorCisJKiBNYW55IHNtYWxsIGJ1Z2ZpeGVzLgorCQorVGhlIGZvbGxvd2luZyBjaGFuZ2VzIHdlcmUgbWFkZSBpbiAzLjIuMiBiZXRhIDIgc2luY2UgMy4yLjIgQmV0YSAxOgorCisJKiBGaXhlZCBTVU4gQ0MgZGVxdWU8PiBwcm9ibGVtIHdpdGggLWcKKwkKKwkqIEFkZGVkIGNvbmZpZ3VyYXRpb24gYW5kIG1ha2VmaWxlcyBmb3IgREVDIFZNUywgQm9ybGFuZCBhbmQgV2luMzIgZ2NjLgorCisJKiBNZXJnZWQgY2hhbmdlcyBtYWRlIHRvIE5vdmVtYmVyIFNHSSBzdGFuZGFyZCBsaWJyYXJ5IHNuYXBzaG90LgorCisJKiBjb25maWcgY2hhbmdlcyAtICJjb25maWd1cmUiIG1hZGUgb2Jzb2xldGUgYW5kIG1vdmVkIGludG8gInN0bHBvcnQvY29uZmlnL25ld19jb21waWxlciIuCisKKwkqIF9fU1RMX1RZUEVOQU1FX09OX1JFVFVSTl9UWVBFIGhhbmRsaW5nIGNoYW5nZWQuCisJCisJKiBNaXNjZWxsYW5vdXMgZml4ZXMuCisKK1RoZSBmb2xsb3dpbmcgY2hhbmdlcyB3ZXJlIG1hZGUgaW4gMy4yLjIgQmV0YSAxIHNpbmNlIDMuMi4xIHJlbGVhc2U6CisKKwkqIFNHSSBpb3N0cmVhbXMgYWRvcHRlZC4gVG8gdXNlIFNHSSBpb3N0cmVhbXMsIHVzZXIgaGF2ZSB0byBzZXQKKwkgIF9fU0dJX1NUTF9PV05fSU9TVFJFQU1TIGZsYWcgYW5kIHRvIGJ1aWxkIHRoZSBsaWJyYXJ5IGluICJzcmMiCisJICBkaXJlY3RvcnkgdG8gbGluayB3aXRoLiBQbGVhc2UgcmVhZCBJTlNUQUxMIGZpbGUgZm9yIGRldGFpbGVkCisJICBpbnN0cnVjdGlvbnMuCisJICBEZWZhdWx0IHNldHRpbmcgaXMgTk9UIHRvIHVzZSBTR0kgaW9zdHJlYW1zICh3cmFwcGVycyB1c2VkIGFzIGJlZm9yZSkuCisKKwkqIERlYnVnIG1vZGUgY29tcGxldGVseSByZWRlc2lnbmVkIC0gZGVidWcgbW9kZSBjb250YWluZXJzIGFyZSAKKwkgIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIHdyYXBwZXJzIGFyb3VuZCBub24tZGVidWcgb25lcy4KKwkgIFRoYXQgcHJvdmlkZXMgZm9yIG1vcmUgY2xlYW4gYW5kIGVmZmljaWVudCBpbXBsZW1lbnRhdGlvbiBhbmQKKwkgIGJpbmFyeSBjb21wYXRpYmlsaXR5IGJldHdlZW4gZGVidWcgYW5kIG5vbi1kZWJ1ZyB2ZXJzaW9ucy4KKworCSogQWRkaXRpb25hbCBjb25maWd1cmF0aW9ucyBhZGRlZCBmb3IgcGxhdGZvcm1zIDoKKwkgICAgIC0gZ2NjLTIuOTUKKwkgICAgIC0gU1VOcHJvIENDIDUuMCBpbiAiY29tcGF0aWJpbGl0eSIgbW9kZQorCSAgImNvbmZpZ3VyZSIgbWFkZSBvYnNvbGV0ZS4KKwkKKwkqIEJ1Z2ZpeGVzIHJlcG9ydGVkIGJ5IHVzZXJzIHNpbmNlIDMuMi4xIHJlbGVhc2UgbWVyZ2VkIAorCitUaGUgZm9sbG93aW5nIGNoYW5nZXMgd2VyZSBtYWRlIGluIDMuMi4xIHNpbmNlIDMuMiByZWxlYXNlOgorCisJKiBOb3csIGJ5IGRlZmF1bHQsIFNUTFBvcnQgcmVuYW1lcyBzdGQ6OiBuYW1lc3BhY2UgZm9yIHVzZXIKKwkgIGlmIF9fU1RMX1VTRV9PV05fTkFNRVNQQUNFIGlzIHVzZWQuIFRvIG1ha2UgaXQgcG9zc2libGUsIG1hbnkgbmV3CisJICB3cmFwcGVyIGhlYWRlcnMgaW50cm9kdWNlZC4gSW50ZXJuYWxseSwgU1RMcG9ydCB1c2VzIHN0bHBvcnQ6OiBuYW1lc3BhY2UsCisJICBzbyBubyBsaW5rLSBvciBydW4tIHRpbWUgY2xhc2hlcyBhcmUgcG9zc2libGUsIGFuZCB5b3UgZG9uJ3QgaGF2ZSB0byByZWJ1aWxkCisJICB0aGUgcnVudGltZSBsaWIgKHdoaWNoIHlvdSBkb24ndCB3YW50IHRvKS4KKwkgIFRoaXMgZmVhdHVyZSBtYWtlcyBTVExwb3J0IHVzYWJsZSBvdXQtb2YtdGhlIGJveCwgd2l0aG91dCBhbnkgbW9kaWZpY2F0aW9ucworCSAgZm9yIGNsaWVudCBjb2RlLCB3aXRoIGFueSBjb21waWxlci4KKworCSogQ29kZSBibG9hdCByZWR1Y3Rpb24gOiBoYXNodGFibGU8VD4gdXNlcyB2ZWN0b3I8dm9pZCo+IGludGVybmFsbHkuCisKKwkqIFZlY3RvciA6IGVmZmljaWVuY3kvY29kZSBibG9hdCByZWR1Y3Rpb24gZml4ZXMuCisKKwkqIFZpc3VhbCBDKysgOiBETEwgZXhwb3J0IGlzIHN1cHBvcnRlZCBmb3IgYWxsb2NhdG9ycyBhbmQgc3RyaW5ncy4gVG8gdXNlIGl0LCAKKwkgIHBsZWFzZSBkZWZpbmUgX19TVExfVVNFX0RFQ0xTUEVDIGluIGFsbCBtb2R1bGVzIGFuZCBfX1NUTF9ERVNJR05BVEVEX0RMTAorCSAgZm9yIHRoZSBETEwgd2hpY2ggaXMgc3VwcG9zZWQgdG8gaW5zdGFudGlhdGUgU1RMcG9ydCBleHBvcnRzIChhdCBsZWFzdCBvbmUKKwkgIHNvdXJjZSBvZiB0aGlzIERMTCBtdXN0IGluY2x1ZGUgPHN0cmluZz4uCisKKyAgICAgICAgKiBWaXN1YWwgQysrIDogZm9yIE1UIHN5bmNocm9uaXphdGlvbiwgPHdpbmRvd3MuaD4gaXMgbm90IGluY2x1ZGVkIGFueW1vcmUuCisJCisJKiBGb3IgU3VucHJvIEMrKyA1LjAgOiBhbGwgaGVhZGVycyBhcmUgbGlua2VkIGludG8gc3RscG9ydC9TQzUsIHNvIG9ubHkKKwkgIG9uZSBpbmNsdWRlIHBhdGggaXMgbmVlZGVkLiBOb3RlIHRoYXQgU0M1LjAgaGFzIHByb2JsZW1zIHdpdGggcmVsYXRpdmUgCisJICBzZWFyY2ggcGF0aC4gSXQgaXMgZWFzeSB0byB3b3JrIGFyb3VuZCA6IGluIHlvdXIgbWFrZWZpbGVzLCBpbnN0ZWFkIG9mCisJICAiU1RMX0lOQ0w9Li4vLi4iICwgd3JpdGUgIlNUTF9JTkNMPSR7UFdEfS8uLi8uLiIuCisKKwkqIENvbmZpZ3VyYXRpb24gZmlsZXMgcHJvdmlkZWQgZm9yIGNvbXBpbGVycyA6IAorCSAgIEtBSSBDKysKKwkgICBERUMgQysrICg2LngsIDUueCkKKwkgICBCb3JsYW5kIDUuMDIgaXMgYmFjayBvbiB0aGUgcm9hZCAoZmluYWxseSAhKQorCSAgCisJKiBXaW5kb3dzIENFIGNvbmZpZyBwcm92aWRlZCBmb3IgVmlzdWFsIEMrKy4KKworCSogX19TVExfTk9fSU9TVFJFQU1TIHN3aXRjaCBpbnRyb2R1Y2VkIGZvciBlbWJlZGRlZCBwbGF0Zm9ybXMuCisJCisJKiBMb3RzIG9mIG1pbm9yIGNvbmZpZyBmaXhlcyBhbmQgaW1wcm92ZW1lbnRzIGZvciB2YXJpb3VzIHBsYXRmb3Jtcy4KZGlmZiAtLWdpdCBhL2V0Yy9DaGFuZ2VMb2ctNS4xIGIvZXRjL0NoYW5nZUxvZy01LjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM1NjUwZQotLS0gL2Rldi9udWxsCisrKyBiL2V0Yy9DaGFuZ2VMb2ctNS4xCkBAIC0wLDAgKzEsODM1MCBAQAorMjAwNy0xMC0yMSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHNyYy9hbGxvY2F0b3JzLmNwcDogQWRkIG1pc3NpbmcgY29uc3RfY2FzdCBpbiBsb2NrIGZyZWUKKwlhbGxvY2F0b3IgaW1wbGVtZW50YXRpb24gd2hlbiBfU1RMUF9MRUFLU19QRURBTlRJQyBpcyBkZWZpbmVkLgorCVRoYW5rcyB0cnVuZ2FudHJhbiBvbiBmb3J1bS4KKworMjAwNy0xMC0wNyAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIFNUTHBvcnQgNS4xLjQgcmVsZWFzZWQgYmFzZWQgb24gcmV2aXNpb24gMzIxOS4gU1RMcG9ydC01LjEuNAorCXRhZyBjcmVhdGVkLgorCisJKiBzdGxwb3J0L3N0bC9fc3RscG9ydF92ZXJzaW9uLmgsIGJ1aWxkL2xpYi9NYWtlZmlsZS5pbmM6IFBhdGNoCisJdmVyc2lvbiBidW1wIHRvIDUgdG8gcHJlcGFyZSBuZXh0IHBvdGVudGlhbCBwYXRjaCByZWxlYXNlLgorCisyMDA3LTEwLTA1ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3RscG9ydC9zdGwvZGVidWcvX2l0ZXJhdG9yLmgsIF9zdHJpbmcuaCwgc3JjL3N0cmluZy5jcHA6CisJUmVtb3ZlZCB1c2VsZXNzIGFuZCBldmVuIGludmFsaWQgd29ya2Fyb3VuZCB1c2VkIHdoZW4KKwlfU1RMUF9VU0VfTVNWQzZfTUVNX1RfQlVHX1dPUktBUk9VTkQgaXMgZGVmaW5lZC4gVGhlcmUgaXMgbm93CisJb25seSBvbmUgY29uc3RydWN0IGNoZWNrIGNsYXNzIF9fY29uc3RydWN0X2NoZWNrZXIsCisJX19tc3ZjNl9jb25zdHJ1Y3RfY2hlY2tlciBoYXMgYmVlbiByZW1vdmVkLgorCisyMDA3LTA5LTI4ICBQZXRyIE92dGNoZW5rb3YgIDxjb21wbGVtZW50QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogUGxhdGZvcm0gdGVzdGVkOiBnY2MgNC4xLjIgMjAwNjA5MjggKHByZXJlbGVhc2UpCisJKFVidW50dSA0LjEuMS0xM3VidW50dTUpLCBpNjg2IEdOVS9MaW51eCwgZ2xpYmMgMi40OyAKKwkKKwkqIHJlbGVhc2Utc2hhcmVkOiBmYWlsIG9uIGxpc3RfdGVzdC5jcHA6MzkyCisJW0NQUFVOSVRfQVNTRVJUKGxpbnQxLnNpemUoKSA9PSAyMCldLCBzdXNwZWN0ZWQgY29tcGlsZXIncyBidWc7CisJMSBmYWlsIGZyb20gMzk1IHRlc3RzOworCisJKiBzdGxkYmctc2hhcmVkOiBwYXNzZWQgMzk1IHRlc3RzOworCisJKiBQbGF0Zm9ybSB0ZXN0ZWQ6IGdjYyA0LjEuMiwgaTY4NiBHTlUvTGludXgsIGdsaWJjIDIuNDsKKworCSogcmVsZWFzZS1zaGFyZWQ6IGZhaWwgb24gbGlzdF90ZXN0LmNwcDozOTIKKwlbQ1BQVU5JVF9BU1NFUlQobGludDEuc2l6ZSgpID09IDIwKV0sIHN1c3BlY3RlZCBjb21waWxlcidzIGJ1ZzsKKwkxIGZhaWwgZnJvbSAzOTUgdGVzdHM7CisKKwkqIHN0bGRiZy1zaGFyZWQ6IHBhc3NlZCAzOTUgdGVzdHM7CisKKwkqIFBsYXRmb3JtIHRlc3RlZDogZ2NjIDQuMi4xLCBpNjg2IEdOVS9MaW51eCwgZ2xpYmMgMi40OworCisJKiByZWxlYXNlLXNoYXJlZDogcGFzc2VkIDM5NSB0ZXN0czsKKworCSogc3RsZGJnLXNoYXJlZDogcGFzc2VkIDM5NSB0ZXN0czsKKworCSogUGxhdGZvcm0gdGVzdGVkOiBnY2MgNC4xLjEsIGk2ODYgYXRobG9uLTQgaTM4NiBHTlUvTGludXgsCisJZ2xpYmMgMi4zLjY7CisKKwkqIHJlbGVhc2Utc2hhcmVkOiBwYXNzZWQgMzk1IHRlc3RzOworCisJKiBzdGxkYmctc2hhcmVkOiBwYXNzZWQgMzk1IHRlc3RzOworCisJKiBzcmMvY19sb2NhbGVfZ2xpYmMvY19sb2NhbGVfZ2xpYmMyLmM6IHRoaXMgaXMgYSBDLCBzbworCWRlY2wgYWxsb3dkIG9ubHkgb24gdG9wIG9mIGJsb2NrOworCisJKiBQbGF0Zm9ybSB0ZXN0ZWQ6IGdjYyAyLjk1LjQgKGRlYmlhbiksIGk2ODYgR05VL0xpbnV4LAorCWdsaWJjIDIuMy4yOworCisJKiByZWxlYXNlLXNoYXJlZDogYnVpbGQgc3VjY2VzcywgYXMgbGlicmFyeSBhcyB1bml0IHRlc3RzLAorCWJ1dCBydW4gdW5pdCB0ZXN0cyBmYWlsLS0tc3RhbGxpbmcgb24gc3BpbmxvY2sgZHVyaW5nIGxpYnJhcnkKKwlsb2FkOyBsb29rcyBsaWtlIHByb2JsZW0gd2l0aCBjb3JyZWN0IGluaXRpYWxpemF0aW9uIG9mCisJc3RhdGljczsKKworCSogc3RsZGJnLXNoYXJlZDogZmFpbCBidWlsZCBsaWJyYXJ5LCBzdGxwb3J0L3N0bC9kZWJ1Zy9faGFzaHRhYmxlLmg6NDk6CisJZGVjbGFyYXRpb24gb2YgYG9wZXJhdG9yID09JyBhcyBub24tZnVuY3Rpb24gCisKKzIwMDctMDktMjcgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzcmMvZmFjZXRzX2J5bmFtZS5jcHA6IEluIGNvbGxhdGU6OmRvX3RyYW5zZm9ybSwgY29uc2lkZXIKKwlsb3cgPT0gaGlnaCBhcyBhIHNwZWNpYWwgY2FzZSwgcmV0dXJucyBlbXB0eSBzdHJpbmcgaW4gdGhpcworCWNhc2UuCisKKzIwMDctMDktMjcgIFBldHIgT3Z0Y2hlbmtvdiAgPGNvbXBsZW1lbnRAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiB0ZXN0L3VuaXQvZmluZF90ZXN0LmNwcDogYXJyYXkgaW5pdGlhbGl6YXRpb24gbWlzc2VkLgorCisyMDA3LTA5LTE3ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3RscG9ydC9zdGwvX251bV9nZXQuaDogQWRkIF9TVExQX0RFQ0xTUEVDIHNwZWNpZmljYXRpb24gdG8KKwlzZXZlcmFsIGZ1bmN0aW9ucyB0aGF0IG1pZ2h0IGJlIGFjY2VzcyBieSBleHRlcm5hbCBjb2RlIHdoZW4KKwludW1fZ2V0IGZhY2V0IGlzIGluc3RhbnRpYXRlZCB3aXRoIHNvbWV0aGluZyBlbHNlIHRoYW4gdGhlCisJU3RhbmRhcmQgcmVxdWlyZWQgaW5zdGFudGlhdGlvbi4KKworMjAwNy0wOS0xMSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHNyYy9jX2xvY2FsZV9nbGliYy9jX2xvY2FsZV9nbGliYy5jLCBjX2xvY2FsZV9nbGliYzIuYzogRml4CisJX0xvY2FsZV9zdHJ4ZnJtIGFuZCBfTG9jYWxlX3djeGZybSBpbXBsZW1lbnRhdGlvbiB0byB0YWtlCisJaW50byBhY2NvdW50IHN0cmluZ3MgdGhhdCBhcmUgbm90IHplcm8gdGVybWluYXRlZC4KKworCSogdGVzdC91bml0L2xvY2FsZV90ZXN0LmNwcDogQWRkIGNoZWNrIHRoYXQgY29sbGF0ZS50cmFuZm9ybQorCW1ldGhvZCBidWlsZCBhIGtleSBvbmx5IGZvciBjaGFycyBpbiB0aGUgcmFuZ2UgcGFzcyB0byBtZXRob2QuCisKKzIwMDctMDktMTAgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzcmMvZmFjZXRzX2J5bmFtZS5jcHA6IEpvaG4gTWFkZG9jayBidWcgcmVwb3J0IDE3ODg2MTggZml4LgorCU1vcmVvdmVyIHJlbW92ZSB1c2Ugb2YgYW4gaW50ZXJtZWRpYXRlIGJ1ZmZlciB0byBnZXQgcmVzdWx0CisJb2YgX0xvY2FsZV9zdHJ4ZnJtLgorCisJKiB0ZXN0L3VuaXQvbG9jYWxlX3Rlc3QuY3BwOiBBZGQgdGVzdHMgZm9yIGNvbGxhdGU6OnRyYW5zZm9ybQorCWZhY2V0IG1ldGhvZC4KKworCSogc3JjL2NfbG9jYWxlX3dpbjMyL2NfbG9jYWxlX3dpbjMyLmM6IFNtYWxsIG1vZGlmaWNhdGlvbiwKKwlfTG9jYWxlX3N0cnhmcm0gaXMgc3VwcG9zZWQgdG8gcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcnMKKwlyZXF1aXJlZCB0byBzdG9yZSB0aGUgZ2VuZXJhdGVkIHNvcnRlZCBrZXkgd2l0aG91dCB0aGUgdHJhaWxpbmcKKwl6ZXJvLgorCisJKiBzcmMvY19sb2NhbGVfZ2xpYmMvY19sb2NhbGVfZ2xpYmMuYywgY19sb2NhbGVfZ2xpYmMyLmM6IEZpeAorCWltcGxlbWVudGF0aW9uIG9mIF9Mb2NhbGVfc3RyeGZybSwgaXQgc2hvdWxkIG5ldmVyIHJldHVybiAtMS4KKworMjAwNy0wOS0xMCAgUGV0ciBPdnRjaGVua292ICA8Y29tcGxlbWVudEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHN0bHBvcnQvc3RsL19zdHJpbmcuYzogZml4IGJ1Z3MgaW4gc3RyaW5nIHJmaW5kLCBmaW5kX2xhc3Rfb2YsCisJZmluZF9sYXN0X25vdF9vZiBbYnVnICMxNzg4NzAwLCBwb3NpdGlvbiAwIHdhcyB3cm9uZ2x5IGV4Y2x1ZGVkXTsKKworCSogdGVzdC91bml0L3N0cmluZ190ZXN0LmNwcDogdGVzdCBmb3IgcHJvYmxlbXMgYWJvdmUuIFRoYW5rcworCXRvIEJyZWQgQm9yZWQgZm9yIGJ1ZyByZXBvcnQgYW5kIGluaXRpYWwgdGVzdC4KKworCSogdW5pdCB0ZXN0czogTGludXggMi42LjE2LjI2IChhdGhsb24tNCksIGdjYyA0LjEuMSwgZ2xpYmMgMi4zLjYKKwkiT0sgMzk1IHRlc3RzIiBmb3IgcmVsZWFzZS1zaGFyZWQgYW5kIHN0bGRiZy1zaGFyZWQgdGFyZ2V0cy4KKworMjAwNy0wOS0wOSAgUGV0ciBPdnRjaGVua292ICA8Y29tcGxlbWVudEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHRlc3QvdW5pdC9yb3BlX3Rlc3QuY3BwLCBzdGxwb3J0L3N0bC9fcm9wZS5oOiB0ZXN0IGZvcgorCWJ1ZyAjMTc4ODYxNSBbYnVnIGR1cmluZyBjb3B5IG9mIHJvcGUncyBpdGVyYXRvcl0gYW5kIGZpeDsKKwlzdWdnZXN0ZWQgYnkgSm9obiBNYWRkb2NrLgorCisJKiBzdGxwb3J0L3N0bC9fYWxnb2Jhc2UuYzogc3ltbWV0cnkgbm90IHJlcXVpcmVkIGZvcgorCWNvbXBhcmF0b3IgaW4gY2FzZSBvZiB0d28gZGlmZmVyZW50IHNlcXVlbmNlcyBjb21wYXJpc29uIG9yCisJc2VhcmNoaW5nOyBzeW1tZXRyaWNhbCBjb21wYXJhdG9yIGp1c3QgbWF5IG5vdCBleGlzdDsKKworCSogc3RscG9ydC9zdGwvZGVidWcvX2hhc2h0YWJsZS5oOiBzeW1tZXRyeSBub3QgcmVxdWlyZWQgZm9yCisJY29tcGFyYXRvciBpbiBoYXNodGFibGUgaW4gY2FzZSBvZiBjb250YWluZXJzIGV4dGVudGlvbjsKKwlzeW1tZXRyaWNhbCBjb21wYXJhdG9yIGp1c3QgbWF5IG5vdCBleGlzdDsKKworCSogdGVzdC91bml0L2FsZ190ZXN0LmNwcDogdGVzdCBmb3IgcHJvYmxlbSBhYm92ZSwgdGhhbmtzCisJT2xlZyBPYm9sZW5za2l5LgorCisyMDA3LTA5LTA2ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogdGVzdC91bml0L3N0cnN0cmVhbV9idWZmZXJfcmVhZF90ZXN0LmNwcDogUmVtb3ZlIHVzZWxlc3MKKwlzdHJkdXAgY2FsbCB0aGF0IHdhcyBtb3Jlb3ZlciBpbnRyb2R1Y2luZyBhIG1lbW9yeSBsZWFrLgorCisyMDA3LTA5LTA0ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3JjL2FsbG9jYXRvcnMuY3BwOiBGaXggaW1wbGVtZW50YXRpb24gb2YgX1NfY2h1bmtfZGVhbGxvYyB3aGVuCisJbG9jayBmcmVlIGltcGxlbWVudGF0aW9uIGlzIG5vdCBpbiB1c2UuIFRoYW5rcyBidWcgcmVwb3J0IDE3ODc2MzYKKwlmcm9tIFNlcmdlaiBaYWd1cnNreS4KKworMjAwNy0wOC0zMSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHN0bHBvcnQvc3RsL19jc3RkaW8uaCwgX2N0aW1lLmg6IEFkZCBtaXNzaW5nIG1hY3JvIGRlZmluaXRpb24KKwl0ZXN0IGJlZm9yZSB1c2luZyBfV0lOMzJfV0NFIHRoYW5rcyBidWcgcmVwb3J0IDE3ODQxNzQuCisKKwkqIHN0bHBvcnQvc3RsL19iaXRzZXQuaDogQ2hhbmdlIG1hY3JvIHRlc3RzIGluIG9yZGVyIHRvIGNoZWNrCisJbWFjcm8gZGVmaW5pdGlvbiBiZWZvcmUgdXNpbmcgaXQgdGhhbmtzIGJ1ZyByZXBvcnQgMTc4NTY3OS4KKworCSogdGVzdC91bml0L2JpdHNldF90ZXN0LmNwcDogQml0c2V0Ojppb3N0cmVhbSBuZXcgdGVzdCB0byBjaGVjaworCWNvcnJlY3QgaW5wdXQvb3V0cHV0IG9mIGJpdHNldCBjbGFzcy4KKworCSogYnVpbGQvTWFrZWZpbGVzL2dtYWtlL2djYy5tYWs6IEFkZCAtV3VuZGVmIGdjYyBvcHRpb24gd2hlbiBidWlsZGluZworCXdpdGggZ2NjIHVuZGVyIEN5Z3dpbiBNaW5HVywgaXQgaXMgYW4gaW50ZXJlc3Rpbmcgb3B0aW9uIHRvIGRldGVjdAorCW1hY3JvIGNoZWNrIGVycm9ycy4KKworMjAwNy0wOC0yNiAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHN0bHBvcnQvc3RsL2NvbmZpZy91c2VyX2NvbmZpZy5oLCBob3N0Lmg6IE1vdmVkIHRoZSBhZG1pbmlzdHJhdGl2ZQorCV9TVExQX1VTRV9ERUZBVUxUX0ZJTEVfT0ZGU0VUIG1hY3JvIGZyb20gdXNlcl9jb25maWcuaCB0byBob3N0LmguCisKKwkqIHN0bHBvcnQvc3RsL2NvbmZpZy9fZ2NjLmg6IFVuZGVyIE1pbkdXIHdlIG5vdyB1c2UgQyBzeW1ib2xzIGluCisJZ2xvYmFsIG5hbWVzcGFjZS4gVGVzdHMgd2l0aCA0LjIuMSBnY2MgdmVyc2lvbiBzaG93cyB0aGF0IEMgc3ltYm9scworCWFyZSBub3QgbmVjZXNzYXJpbHkgcHV0IGluIHN0ZCBuYW1lc3BhY2UuCisKKzIwMDctMDgtMjMgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzdGxwb3J0L3N0bC9fY29tcGxleC5oOiBBcyBpbiBfaW9zZndkLmgsIHJlbW92ZWQgdXNlbGVzcworCV9TVExQX0NMQVNTX0RFQ0xTUEVDIGF0dHJpYnV0ZSBvbiBjb21wbGV4IGNsYXNzIGRlY2xhcmF0aW9uLgorCisyMDA3LTA4LTIzICBQZXRyIE92dGNoZW5rb3YgIDxjb21wbGVtZW50QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3RscG9ydC9zdGwvZGVidWcvX3ZlY3Rvci5oOiBvbmx5IHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3JzCisJYWxsb3cgb3BlcmF0aW9ucyAnbGVzcy10aGFuJyBhbmQgZGlzdGFuY2U7IGZvciBiaWRpcmVjdGlvbmFsCisJaXRlcmF0b3JzIHJlbW92ZWQgdXNhZ2Ugb2YgJ2xlc3MtdGhhbicsIGFuZCBmb3Igb3RoZXJzCisJW2xpa2UgZm9yd2FyZCBhbmQgaW5wdXQgaXRlcmF0b3JzXSByZW1vdmVkIGFzIHVzYWdlIG9mICdsZXNzLXRoYW4nCisJYXMgZGlzdGFuY2U7IHRoYW5rcyBPbGVnIE9ib2xlbnNraXkgZm9yIGJ1ZyByZXBvcnQ7CisKKwkqIHRlc3QvdW5pdC9pb2l0ZXJfdGVzdC5jcHA6IHRlc3QgZm9yIHByb2JsZW0gYWJvdmUuCisKKzIwMDctMDgtMTggIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzdGxwb3J0L3N0bC9faW9zZndkLmg6IFJlbW92ZWQgdXNlbGVzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBhdHRyaWJ1dGUKKwlvbiBjbGFzcyBkZWNsYXJhdGlvbi4gTGF0ZXN0IGdjYyB2ZXJzaW9ucyBhcmUgcmVwb3J0aW5nIGEgd2FybmluZyBhYm91dAorCWl0LgorCisyMDA3LTA4LTE2ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3JjL2RsbF9tYWluLmNwcDogUmVtb3ZlZCB1c2VsZXNzIF9BdG9taWNfc3dhcF9zdHJ1Y3QgZXhwbGljaXQKKwlpbnN0YW50aWF0aW9uLCBtb3Jlb3ZlciwgTVNWQyAyMDA1IGRvIG5vdCBzdXBwb3J0IGl0LgorCisyMDA3LTA4LTE1ICBQZXRyIE92dGNoZW5rb3YgIDxjb21wbGVtZW50QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogUmVwb3NpdG9yeTogYnVtcCBsaWIgdmVyc2lvbiB0byA1LjEuNDsKKworCSogc3RscG9ydC9zdGwvY2hhcl90cmFpdHMuaCwgc3JjL2ZzdHJlYW0uY3BwOiB1c2UgNjQtYml0cworCWZpbGUgb3BlcmF0aW9ucyBjYWxscywgaWYgYXZhaWxhYmxlIG9uIHN5c3RlbTsgc3RyZWFtb2ZmIGlzCisJYWx3YXlzIG9mZjY0X3QsIGlmIF9MQVJHRUZJTEVfU09VUkNFIG9yIF9MQVJHRUZJTEU2NF9TT1VSQ0UKKwlkZWZpbmVkLCBpLmUuIGlmIDY0LWJpdHMgZmlsZSBvcGVyYXRpb25zIHByZXNlbnQ7CisKKwkqIHN0bHBvcnQvc3RsL2NvbmZpZy91c2VyX2NvbmZpZy5oOiBhZGQgX1NUTFBfVVNFX0RFRkFVTFRfRklMRV9PRkZTRVQsCisJZm9yY2UgdXNlIG9mZl90IGZvciBzdHJlYW1vZmYgYW5kIGFwcHJvcHJpYXRlIGZpbGUgb3BlcmF0aW9ucyBjYWxsczsKKwlub3RlLCB0aGF0IHRoaXMgbWF5IGxlYWQgdG8gcHJvYmxlbXMsIGZvciBleGFtcGxlIGlmIF9GSUxFX09GRlNFVF9CSVRTCisJZGVmaW5lZCBhcyA2NCBzb21ld2hlcmUgaW4gdXNlcidzIGNvZGU7CisKKwkqIHRlc3QvdW5pdC9mc3RyZWFtX3Rlc3QuY3BwOiB0ZXN0IDY0IGJpdHMgdHlwZSBmb3IgZmlsZXNpemUgYW5kCisJZmlsZSBvZmZzZXQuCisKKzIwMDctMDctMjIgIFBldHIgT3Z0Y2hlbmtvdiAgPGNvbXBsZW1lbnRAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzcmMvZnN0cmVhbS5jcHA6IGZvcmNlIHVzZSBsc2VlazY0L21tYXA2NCBmb3IgSFAtVVgsIGlmIF9MQVJHRUZJTEU2NF9TT1VSQ0UKKwlkZWZpbmVkOyB0aGFua3MgZm9yIE1pY2hhZWwgS2xlaW4uCisKKzIwMDctMDctMTcgIFBldHIgT3Z0Y2hlbmtvdiAgPGNvbXBsZW1lbnRAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzdGxwb3J0L3N0bC9fYWxnby5jLCBzdGxwb3J0L3N0bC9fYWxnb2Jhc2UuYzogc2VhcmNoLCB0aGUgX190bXAgYW5kCisJX19wMSBpdGVyYXRvcnMgYWx3YXlzIHBvaW50IGF0IHRoZSBzYW1lIHBvc2l0aW9uLCBoZW5jZSBvbmUgb2YgdGhlbQorCWlzIHJlZHVuZGFudDsKKworCSogc3RscG9ydC9zdGwvX2FsZ29iYXNlLmM6IGluIHRoZSBtYWluLWxvb3Agb2Ygc2VhcmNoIHRoZXJlIGFyZSB0d28KKwlzdWNjZXNzaXZlIHdoaWxlLWxvb3BzIGRvaW5nIGV4YWN0bHkgdGhlIHNhbWUgdGhpbmc7IG9uZSBvZiB0aGVtIGlzCisJcmVkdW5kYW50IGFuZCwgc2luY2UgaXQgaXMgaW5zaWRlIHRoZSBtYWluLWxvb3AsIGl0IHNsb3dzIGRvd24KKwl0aGUgYWxnb3JpdGhtIHNpZ25pZmljYW50bHk7CisKKwkqIHN0bHBvcnQvc3RsL19hbGdvLmMsIHN0bHBvcnQvc3RsL19hbGdvYmFzZS5jOiBpbiB0aGUgc2VhcmNoIHRoZSBtYWluLWxvb3AgCisJY29uZGl0aW9uICJ3aGlsZSAoX19maXJzdDEgIT0gX19sYXN0MSkiIGlzIGFsd2F5cyB0cnVlIGFuZCBjb25zZXF1ZW50bHkKKwlyZWR1bmRhbnQ7IHRoaXMgaXMgYmVjYXVzZSB0aGUgaW5pdGlhbCBhZG4gaW4tbG9vcCBjb25kaXRpb25zIHZpcnR1YWxseQorCWFjdCBhcyBndWFyZHMgYW5kIHdpbGwgbmV2ZXIgbGV0IHRoZSBtYWluLWxvb3AgY29uZGl0aW9uIHRvIGZhaWw7IHNpbmNlCisJdGhpcyBjb25kaXRpb24gaXMgZXZhbHVhdGVkIGluIGV2ZXJ5IG1haW4tbG9vcCBpdGVyYXRpb24sIGl0cyByZW1vdmFsCisJd2lsbCBhbHNvIGltcHJvdmUgdGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBhbGdvcml0aG07IHRoYW5rcyBmb3IKKwlKaW0gWG9jaGVsbGlzIGZvciB0aGlzIHN1Z2dlc3Rpb25zLgorCisyMDA3LTA3LTE1ICBQZXRyIE92dGNoZW5rb3YgIDxjb21wbGVtZW50QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3JjL3N0cnN0cmVhbS5jcHA6ICJnZXQgZW5kIiBwb2ludGVyIHNob3VsZCBiZSBpbml0aWFsaXplZAorCXRvIHRoZSAiYmVnaW4gb2YgZ2V0ICsgTiIgaW4gb2Jzb2xldGUgc3Ryc3RyZWFtOyBidWcgIzE1MzY1MDMsCisJdGhhbmtzIGZvciBKZWFuLUVyaWMgQ3VlbmRldDsKKworCSogdGVzdC91bml0L3N0cnN0cmVhbV9idWZmZXJfcmVhZF90ZXN0LmNwcCwgYnVpbGQvdGVzdC91bml0L01ha2VmaWxlLmluYzoKKwl0ZXN0IGZvciBidWcgYWJvdmU7IFtzdWJtaXR0ZWQgYnkgSmVhbi1FcmljIEN1ZW5kZXRdLgorCisyMDA3LTA0LTAyICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIDUuMS4zIHJlbGVhc2VkIGJhc2VkIG9uIHJldmlzaW9uIDI5ODMuIFNUTHBvcnQtNS4xLjMgdGFnIGNyZWF0ZWQuCisKKzIwMDctMDMtMzAgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogYnVpbGQvbGliL2NvbmZpZ3VyZS5iYXQ6IFJlc3RvcmUgVEFSR0VUX1BST0NfU1VCVFlQRSBkZWZpbml0aW9uCisJdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBBUk0gYXJjaGl0ZWN0dXJlcy4KKworMjAwNy0wMy0yMiAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bC9jb25maWcvX21zdmMuaCwgX2RlcXVlLmgsIF9idmVjdG9yLmg6IFBvcnRhZ2UgZnJvbQorCVVscmljaCBFY2hrYXJkdCB0byBFVkMgOC4KKworCSogZG9jL1JFQURNRS5ldmM4LCBSRUFETUUud2luY2U6IE5ldyBkb2N1bWVudGF0aW9ucyBhYm91dCBXaW5kb3dzCisJQ0UgYW5kIEVWQyA4IGZyb20gVWxyaWNoIEVjaGthcmR0LgorCisJKiBkb2MvZXZjX3dvcmthcm91bmQudHh0LCBkb2MvUkVBRE1FLmV2YzMsIEZpcnN0IGZpbGUgbWVyZ2VkIHRvIHRoZQorCXNlY29uZCBvbmUuCisKKwkqIHN0bHBvcnQvc3RsL19zdGxwb3J0X3ZlcnNpb24uaDogQnVtcCBwYXRjaCBsZXZlbCB0byAzLgorCisyMDA3LTAzLTA3ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHNyYy9kbGxfbWFpbi5jcHAsIHN0bHBvcnQvc3RsL19zdGRleGNlcHRfYmFzZS5oOiBDaGFuZ2Ugc3RybmNweV9zCisJaW52b2NhdGlvbiB0byBwYXNzIF9UUlVOQ0FURSBwYXJhbWV0ZXIgcmF0aGVyIHRoYW4gbnVtYmVyIG9mIGNoYXJzCisJdG8gcHV0IGluIGRlc3RpbmF0aW9uIHN0cmluZy4gRGVmYXVsdCBzdHJuY3B5X3MgYmVoYXZpb3IgaXMgbm90IHRvCisJdHJ1bmNhdGUgc3RyaW5nIGlmIG5lY2Vzc2FyeSBidXQgdG8gcmVwb3J0IHRoZSBpc3N1ZSB0aHJvdWdodCBhIGhhbmRsZXIKKwl3aGljaCBsZWFkIHRvIGFuIGFwcGxpY2F0aW9uIGNyYXNoIGlmIG5vIGhhbmRsZXIgaGFzIGJlZW4gc2V0LiBUaGFua3MKKwlCcm9uZWsgS296aWNraSBidWcgcmVwb3J0IDE2NzQ5NzQuCisKKwkqIHN0bHBvcnQvc3RsL3R5cGVfdHJhaXRzLmg6IEFkZCBhIGRlZmF1bHQgY29uc3RydWN0b3IgZGVjbGFyYXRpb24KKwlpbiBfVHBXaXRoU3RhdGUgY2xhc3MgdG8gbWFrZSBnY2MgaGFwcHkgd2hlbiBjbGFzcyBpcyBpbnN0YW5jaWF0ZWQKKwl3aXRoIGEgY2xhc3Mgd2l0aCBubyBkZWZhdWx0IGNvbnN0cnVjdG9yLgorCisJKiBzdGxwb3J0L3N0bC9jb25maWcvX3dpbmRvd3MuaDogQ2hhbmdlIGRlZmluaXRpb24gb2YKKwlfU1RMUF9XSU4zMl9WRVJTSU9OIG1hY3JvLiBXZSBkbyBub3QgcmVwb3J0IGRlZmluaXRpb24gaW5jb25zaXN0ZW5jeQorCWJldHdlZW4gV0lOVkVSIGFuZCBfV0lOMzJfVkVSU0lPTiBhbnltb3JlLCBXSU5WRVIgaXMgcHJlZmVyZWQuCisKKzIwMDctMDMtMDEgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogdGVzdC91bml0L2JpdHNldF90ZXN0LmNwcDogQWRkIHRlc3QgZm9yIHRoZSB0b19zdHJpbmcgbWVtYmVyCisJbWV0aG9kLgorCisJKiBzdGxwb3J0L3N0bC9jb25maWcvX21zdmMuaCwgdGVzdC91bml0L2xvY2FsZV90ZXN0LmNwcDogQ2hhbmdlCisJTVNWQzYgY29uZmlndXJhdGlvbiB0aGF0IG5vdyBkZWZpbmVzIF9TVExQX05PX0VYUExJQ0lUX0ZVTkNUSU9OX1RNUExfQVJHUy4KKwlFdmVuIGlmIE1TVkM2IHN1cHBvcnRzIGV4cGxpY2l0IHNwZWNpZmljYXRpb24gb2YgZnVuY3Rpb24gdGVtcGxhdGUKKwlwYXJhbWV0ZXJzIGl0IGRvIG5vdCBzdXBwb3J0IHRoZSBleHBsaWNpdCBzcGVjaWZpY2F0aW9uIGZvcgorCXRlbXBsYXRlIG1ldGhvZHMsIHVuaXQgdGVzdHMgYXJlIHNob3dpbmcgdGhpcyBwcm9ibGVtLgorCisJKiBzdGxwb3J0L3N0bC90eXBlX3RyYWl0cy5oLCBfYWxsb2MuaDogU21hbGwgY2hhbmdlIGluIHN0YXRlbGVzcworCWNsYXNzIGRldGVjdGlvbiBmZWF0dXJlLiBJbnRyb2R1Y2UgX0lzU3RhdGVsZXNzIGhlbHBlciBzdHJ1Y3QgZm9yCisJdGhpcyBwdXJwb3NlIGV2ZW4gaWYgaXQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIHB1cmUgY2xhc3MgdHlwZSBhbmQKKwlub3Qgd2l0aCBidWlsZC1pbiB0eXBlcyBvciBlbnVtIG9yIHVuaW9uLiBJdCBhdm9pZHMgTVNWQzggd2FybmluZ3MuCisJCisyMDA3LTAyLTI1ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIDUuMS4yIHJlbGVhc2VkIGJhc2VkIG9uIHJldmlzaW9uIDI5MzcsIHRhZyBTVExwb3J0LTUuMS4yIGNyZWF0ZWQuCisKKwkqIHN0bHBvcnQvc3RsL2NvbmZpZy9fcHJvbG9nLmgsIGJ1aWxkL01ha2VmaWxlcy9nbWFrZS9iY2MubWFrLAorCVBhdGNoIGZyb20gRXJpYyBTYW5mb3JkIHRvIHJlbW92ZSBlbXB0eSBiYXNlIGNsYXNzIG9wdGltaXphdGlvbgorCWZvciBCb3JsYW5kIGNvbXBpbGVycy4KKworCSogdGVzdC91bml0L3ZlY3Rvcl90ZXN0LmNwcDogRW5hYmxlIFZlY3RvclRlc3Q6OmVibyB0ZXN0IGZvciBCb3JsYW5kCisJY29tcGlsZXJzLgorCisyMDA3LTAyLTIyICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL19hbGxvYy5oOiBBZGQgYSB3b3JrYXJvdW5kIGZvciBjb21waWxlcnMgd2l0aCBidWdneQorCWVtcHR5IGJhc2UgY2xhc3Mgb3B0aW1pemF0aW9uIHdoaWNoIGlzIHVzZWQgaW4gX1NUTFBfYWxsb2NfcHJveHkKKwljbGFzcy4KKworCSogdGVzdC91bml0L3ZlY3Rvcl90ZXN0LmNwcDogTmV3IHRlc3QgY2FzZSBWZWN0b3JUZXN0OjplYm8gdG8gc2hvdworCXByb2JsZW0gYWJvdmUuCisKKzIwMDctMDItMjEgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3JjL2NfbG9jYWxlX3dpbjMyL2NfbG9jYWxlX3dpbjMyLmM6IEZpeGVkIF9fQ29udmVydERhdGUgYW5kCisJX19Db252ZXJ0VGltZSB0byBhdm9pZCBwb3RlbnRpYWwgaW5maW5pdGUgbG9vcCAoYnVnIHJlcG9ydAorCTE2NjM2MDQpCisKKzIwMDctMDItMTYgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogU1RMcG9ydCA1LjEuMSByZWxlYXNlZCBiYXNlZCBvbiByZXZpc2lvbiAyOTE5LiBTVExwb3J0LTUuMS4xCisJdGFnIGNyZWF0ZWQuCisKKzIwMDctMDItMTQgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3RscG9ydC9zdGwvY29uZmlnL19pbnRlbC5oOiBDb25maWd1cmF0aW9uIGZpeCwgSW50ZWwgY29tcGlsZXIKKwliZWZvcmUgOC4xIGhhdmUgcHJvYmxlbSB3aXRoIHRlbXBsYXRlIG1ldGhvZCBzcGVjaWFsaXphdGlvbi4gVGhhbmtzCisJRHJhZ2FuIFR1YmljLgorCisyMDA3LTAyLTA5ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHRlc3QvdW5pdC9sb2NhbGVfdGVzdC5jcHA6IEVuaGFuY2UgTG9jYWxlVGVzdDo6Y29sbGF0ZV9mYWNldAorCXRlc3QgY2FzZSB0byByZXZlYWwgYSBidWcgaW4gZ2xpYmMgbG9jYWxpemF0aW9uIHBvcnRhZ2UuCisKKwkqIHNyYy9jX2xvY2FsZV9nbGliYy9jX2xvY2FsZV9nbGliYzIuYzogRml4ZWQgX0xvY2FsZV9zdHJjbXAKKwlhbmQgX0xvY2FsZV9zdHJjbXAgYW5kIF9Mb2NhbGVfc3Ryd2NtcCBpbXBsZW1lbnRhdGlvbiB0byB0YWtlCisJaW50byBhY2NvdW50IGJ1ZmZlciBzaXplLCBjb21wYXJpc29uIHVzZWQgdG8gYWx3YXlzIGJlZW4gZG9uZSBvbiB0aGUKKwl3aG9sZSBpbnB1dCBzdHJpbmdzIHVwIHRvIHRoZSB0ZXJtaW5hdGlvbiBjaGFyYWN0ZXIuCisKKwkqIHN0bHBvcnQvc3RsL3R5cGVfbWFuaXBzLmgsIHRlc3QvdW5pdC9tdmN0b3JfdGVzdC5jcHAsCisJdHlwZV90cmFpdHNfdGVzdC5jcHA6IFJlbW92ZSByZWxhdGlvbiBiZXR3ZWVuIFNUTHBvcnQgX190cnVlX3R5cGUgYW5kCisJX19mYWxzZV90eXBlIGFuZCBob21vbnltcyBvbmVzIGluIGxpYnN0ZCsrLiBBZGQgd29ya2Fyb3VuZCBpbiB0aGUgMgorCXRlc3Qgc3VpdGUgcmVxdWlyaW5nIHVzZSBvZiB0aG9zZSB0eXBlcy4KKworMjAwNy0wMi0wOCAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bC9fdGhyZWFkcy5oLCBzcmMvbG9jYWxlLmNwcDogQWRkIG1pc3NpbmcgcGFyZW50aGVzaXMKKwlpbiBzb21lIG1hY3JvIGNoZWNrcyB0aGFua3MgSmFuIEVjaHRlcm5hc2ggYnVnIHJlcG9ydCAxNjUzOTY2LgorCisJKiB0ZXN0L3VuaXQvbG9jYWxlX3Rlc3QuY3BwOiBNYWRlIExvY2FsZVRlc3Q6OmNvbGxhdGVfZmFjZXQgdGVzdAorCXJlYWxseSBtZWFuaW5nZnVsIGV2ZW4gaWYgaXQgcmVxdWlyZXMgZnJlbmNoIGxvY2FsZSBzdXBwb3J0IGZvcgorCXBhcnQgb2YgaXQuCisKKzIwMDctMDItMDEgIFBldHIgT3Z0Y2hlbmtvdiAgPGNvbXBsZW1lbnRAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzdGxwb3J0L3N0bC9jb25maWcvX3NvbGFyaXMuaDogX19MT05HX01BWF9fIGRlZmluZWQgb24KKwk2NC1iaXRzIFNQQVJDcy4gVGhhbmtzIEFsZWtzZXkgU2FuaW4uCisKKwkqIHN0bHBvcnQvc3RsL19zcGFyY19hdG9taWMuaCwgc3RscG9ydC9zdGwvX3RocmVhZHMuaDoKKwlmaXhlcyBmb3IgbW9kZXJuIFNQQVJDcy4gVGhhbmtzIEFsZWtzZXkgU2FuaW4uCisKKzIwMDctMDEtMjggIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3RscG9ydC9zdGwvZGVidWcvX2RlcXVlLmg6IEZpeCBpdGVyYXRvciBpbnZhbGlkYXRpb24gaW4gZXJhc2UKKwlvZiBhbiBpdGVyYXRvciByYW5nZSB0aGFua3MgdG8gU3RldmUgTG9iYXNzbyBpbmRpcmVjdCByZXBvcnQgKGJ1ZworCTE2NDU2NTcpLgorCisJKiB0ZXN0L3VuaXQvZGVxdWVfdGVzdC5jcHA6IE5ldyB0ZXN0IGNhc2UgZm9yIGRlcXVlIGVyYXNlIG1ldGhvZHMuCisKKzIwMDctMDEtMTkgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3RscG9ydC9zdGwvX2xvY2FsZS5oLCBzcmMvbG9jYWxlLmNwcDogQWRkIHRocm93KCkgc3BlY2lmaWNhdGlvbgorCW9uIGxvY2FsZSBkZWZhdWx0IGNvbnN0cnVjdG9yLiBBZGQgY29uc3QgcXVhbGlmaWVyIG9uIGxvY2FsZTo6Y29tYmluZQorCW1ldGhvZC4gRml4ZWQgY29tYmluZSBpbXBsZW1lbnRhdGlvbiB0byBjb3JyZWN0bHkgY29tYmluZQorCSp0aGlzIHdpdGggb3RoZXIgbG9jYWxlIGluc3RhbmNlLgorCisJKiBzcmMvbG9jYWxlX2ltcGwuaDogUmVtb3ZlZCBfZ2V0X0xvY2FsZV9pbXBsIGFuZAorCV9jb3B5X05hbWVsZXNzX0xvY2FsZV9pbXBsIGFscmVhZHkgZGVmaW5lZCBpbiBzdGxwb3J0L3N0bC9fbG9jYWxlLmguCisKKwkqIHNyYy9sb2NhbGVfaW1wbC5jcHA6IEluIF9Mb2NhbGVfaW1wbDo6aW5zZXJ0IGFkZCBjaGVjayB0aGF0IHdlCisJYXJlIHdvcmtpbmcgb24gMiBkaWZmZXJlbnQgZmFjZXQgaW5zdGFuY2VzIGJlZm9yZSBzdWJzdGl0dXRpb24uCisKKwkqIHRlc3QvdW5pdC9sb2NhbGVfdGVzdC5jcHA6IEFkZCB0ZXN0IGNhc2UgZm9yIGxvY2FsZTo6Y29tYmluZQorCW1ldGhvZC4KKworMjAwNy0wMS0xMiAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBjX2xvY2FsZS5oLCBjX2xvY2FsZV9kdW1teS5jLCBjX2xvY2FsZV9nbGliYy5jLCBjX2xvY2FsZV9nbGliYzIuYywKKwljX2xvY2FsZV93aW4zMi5jOiBDcmVhdGlvbiBvZiAyIG5ldyBmdW5jdGlvbnMgaW4gdGhlIGxvY2FsaXphdGlvbgorCWZyYW1ld29yayBfTG9jYWxlX2luaXQgYW5kIF9Mb2NhbGVfZmluYWwgdG8gYWxsb3cgbG9jYWxpemF0aW9uCisJaW1wbGVtZW50YXRpb25zIHRvIGluaXRpYWxpemUgYW5kIHJlbGVhc2UgYW55IG5lY2Vzc2FyeSByZXNvdXJjZXMuCisKKwkqIHNyYy9pb3N0cmVhbS5jcHA6IENhbGwgX0xvY2FsZV9pbml0IGR1cmluZyBpbyBzdHJlYW1zIGluaXRpYWxpemF0aW9uCisJYW5kIF9Mb2NhbGVfZmluYWwgYXQgZW5kLgorCisJKiBjX2xvY2FsZV93aW4zMi9jX2xvY2FsZV93aW4zMi5jOiBBZGQgc3luY2hyb25pemF0aW9uIGZvciBsb2NhbGUKKwlsY2lkIGxvb2sgdXAgZnJvbSBuYW1lIHJlcXVpcmVkIGluIG11bHRpdGhyZWFkZWQgZW52aXJvbm1lbnQuIFR3bworCXRocmVhZHMgaW5zdGFuY2lhdGluZyB0d28gZmFjZXQgaW5zdGFuY2VzIGZyb20gYSBnaXZlbiBuYW1lIG1pZ2h0CisJaGF2ZSBjb2xsaWRlIHJlc3VsdGluZyBpbiBhbiB1bmRlZmluZWQgYmVoYXZpb3IuIENyaXRpY2FsIHNlY3Rpb24KKwl1c2VkIGZvciBzeW5jaHJvbml6YXRpb24gaXMgaW5pdGlhbGl6ZWQgaW4gX0xvY2FsZV9pbml0IGFuZCBmcmVlZAorCWluIF9Mb2NhbGVfZmluYWwuCisKKwkqIGNfbG9jYWxlX3dpbjMyL2NfbG9jYWxlX3dpbjMyLmM6IEFkZCBzZXZlcmFsIGZpZWxkcyBpbgorCV9Mb2NhbGVfdGltZSBzdHJ1Y3QgdG8gYXZvaWQgdXNlIG9mIHN0YXRpYyBidWZmZXJzIGluIHNvbWUgbG9jYWxlCisJc3VwcG9ydCBmdW5jdGlvbnMgbGlrZSBfTG9jYWxlX2RfdF9mbXQgX0xvY2FsZV9sb25nX2RfdF9mbXQuLi4KKwlNb3Jlb3ZlciB0aW1lIGZvcm1hdCBjYW5ub3QgYmUgdHJ1bmNhdGVkIGFueW1vcmUuCisKKzIwMDctMDEtMDggIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3RscG9ydC9zdGwvX2RlcXVlLmM6IFBhdGNoIGZyb20gS2V2aW4gTGluIHRvIGZpeCBpdGVyYXRvcgorCXJldHVybmVkIGJ5IGluc2VydCBhdCBwb3NpdGlvbiBtZXRob2QuCisKKwkqIHRlc3QvdW5pdC9kZXF1ZV90ZXN0LmNwcDogQWRkIHRlc3QgY2FzZSBmb3IgdGhlIGRlcXVlOjppbnNlcnQKKwltZXRob2RzLgorCisyMDA2LTEyLTA2ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIFNUTHBvcnQgNS4xLjAgcmVsZWFzZWQgYmFzZWQgb24gU1RMUE9SVF81XzEgYnJhbmNoIHJldmlzaW9uIDI3NTAuCisKKzIwMDYtMTEtMjcgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3RscG9ydC9zdGwvY29uZmlnL193aW5kb3dzLmg6IFBhdGNoIGZyb20gTWljaGFlbCBGaW5rIHRvIGNoZWNrCisJaW5jbHVzaW9uIG9mIHdpbmJhc2UuaCBhbmQgd2luZG93cy5oLgorCisyMDA2LTExLTI0ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL19mc3RyZWFtLmgsIHNyYy9mc3RyZWFtLmNwcCwgaW9zdHJlYW0uY3BwOiBSZXN0b3JlCisJY29tcHV0YXRpb24gb2YgdGhlIHN5c3RlbSBkZXBlbmRhbnQgcGFnZSBzaXplIHRoYXQgd2FzIGhhcmRjb2RlZAorCXRvIDQwOTYuIEluaXRpYWxpc2F0aW9uIGNvZGUgaGFzIGJlZW4gbW92ZWQgdG8gYSBzdGF0aWMgbWV0aG9kCisJY2FsbGVkIGp1c3QgYWZ0ZXIgU3RhbmRhcmQgaW9zdHJlYW0gaW5pdGlhbGlzYXRpb24uIFRoaXMgY29kZSB1c2VkCisJdG8gYmUgaW4gdGhlIF9GaWxlYnVmX2Jhc2UgY29uc3RydWN0b3IgdGhhdCBtaWdodCBoYXZlIGJlZW4gY2FsbGVkCisJc2ltdWx0YW5lb3VzbHkgYnkgc2V2ZXJhbCB0aHJlYWRzLgorCisyMDA2LTExLTE3ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL2NvbmZpZy9fbWFjb3N4Lmg6IEFkZCBlbmRpYW5lc3MgY29uZmlndXJhdGlvbi4KKworMjAwNi0xMS0xNiAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiB0ZXN0L3VuaXQvcmVzb2x2ZV9uYW1lLmNwcDogQ2xlYW4gbW9zdCBvZiBNU1ZDNiB3b3JrYXJvdW5kLCBvbmx5CisJb25lIGhhcyBiZWVuIGtlcHQgdG8gaGF2ZSB0aGUgdGVzdCBwYXNzLgorCisyMDA2LTExLTEzICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL19jd2NoYXIuaDogUGF0Y2ggZnJvbSBNaWNoYWVsIEZpbmsgdG8gZml4IEVWQzMKKwltaXNzaW5nIG1ic3RhdGVfdCBkZWZpbml0aW9uLgorCisyMDA2LTExLTA3ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL190aHJlYWRzLmg6IFJlbW92ZWQgX0F0b21pY19zd2FwX3N0cnVjdCBleHBvcnQKKwl0aGF0IHNob3VsZCBiZSB1c2VsZXNzIGFzIGNvbXBsZXRlbHkgaW5saW5lZC4gTW9yZW92ZXIgaXQgd2FzCisJZ2VuZXJhdGluZyBhIGNvbXBpbGF0aW9uIGVycm9yIHVzaW5nIE1TVkMgMjAwNSB1bmRlciBXaW5kb3dzCisJNjQgYml0cy4KKworMjAwNi0xMC0yNiAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiB0ZXN0L3VuaXQvY29kZWN2dF90ZXN0LmNwcDogUmVtb3ZlZCB0cnkvY2F0Y2ggYmxvY2tzIG5vdAorCXN1cHBvcnRlZCBieSBwbGF0Zm9ybSBtaXNzaW5nIGV4Y2VwdGlvbiBzdXBwb3J0IGFuZCBtb3Jlb3ZlcgorCXVzZWxlc3MgYXMgd2Uga25vdyB0aGUgY29kZSBjYWxsZWQgaW4gdGhlIHRyeSBhbmQgdGhpcyBjb2RlCisJZG8gbm90IHRocm93ICh0aGFua3MgTWljaGFlbCBGaW5rIHJlcG9ydCkuCisKKwkqIGJ1aWxkL01ha2VmaWxlcy9ubWFrZS90YXJnZXRkaXJzLm1haywgbGliL2NsZWFuLm1haywgYXBwL2NsZWFuLm1hazoKKwlDb21wbGV0ZSBjbG9iYmVyIGFuZCBkaXN0Y2xlYW4gcnVsZXMgdG8gcmVhbGx5IGNsZWFuIGFsbCBnZW5lcmF0ZWQKKwlzdHVmZnMuCisKKwkqIGJ1aWxkL01ha2VmaWxlcy9ubWFrZS90b3AubWFrOiBQYXRjaCBmcm9tIEdhcnkgQmFydGxldHQgdG8gbWFrZSBubWFrZQorCSdhbGwnIHJ1bGUgdGhlIGRlZmF1bHQgcnVsZS4KKworMjAwNi0xMC0yNSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzcmMvZGxsX21haW4uY3BwOiBGaXggc3ludGF4IGVycm9yICc+PicgcmF0aGVyIHRoYW4gJz4gPicgaW4KKwlhIF9TVExQX2FsbG9jX3Byb3h5IGV4cGxpY2l0IGluc3RhbmNpYXRpb24uCisKKwkqIHN0bHBvcnQvc3RsL191bm9yZGVyZWRfc2V0Lmg6IEZpeCB0ZW1wbGF0ZSBtZXRob2QgZm9yIHRoZQorCWFzc29jaWF0aXZlIGNvbnRhaW5lciBleHRlbnNpb24sIHVzZSBfS1QgdHlwZSByYXRoZXIgdGhhbiBrZXlfdHlwZS4KKworMjAwNi0xMC0yMCAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bC9jb25maWc6IFJlbW92ZWQgc29tZSB1c2VkIG1hY3JvcworCSAgX1NUTFBfQVVUT01BVElDX1RZUEVfVFJBSVRTCisJICBfU1RMUF9VTklOSVRJQUxJWkFCTEVfUFJJVkFURQorCSAgX1NUTFBfU1RBVElDX0FSUkFZX0JVRworCSAgX1NUTFBfRlVMTF9BRExfSU1QTEVNRU5URUQKKworCSogdGVzdC91bml0L2NvZGVjdnRfdGVzdC5jcHA6IElnbm9yZSB0ZXN0IHdoZW4KKwlfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVTIGRlZmluZWQuCisKKzIwMDYtMTAtMjAgIFBldHIgT3Z0Y2hlbmtvdiAgPGNvbXBsZW1lbnRAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzdGxwb3J0L3N0bC9fY3djaGFyLmg6IGZpeCBIUC1VWCBwcm9ibGVtIHdpdGggV0NIQVJfTUlOLCBXQ0hBUl9NQVgKKwlbQm9yaXMgR3ViZW5rb10uCisKKzIwMDYtMTAtMTkgIFBldHIgT3Z0Y2hlbmtvdiAgPGNvbXBsZW1lbnRAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiB0ZXN0L3VuaXQvc3N0cmVhbV90ZXN0LmNwcDogY2hlY2sgYnVncmVwb3J0ICMxNTgwMDIwLCBub3QgY29uZmlybWVkOworCVtidWcgaW4gZ2NjIDQuMS4yLXN2biwgY29tcGlsZXIgdW5kZXIgZGV2ZWxvcG1lbnRdLgorCisyMDA2LTEwLTE3ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL19jd2NoYXIuaDogUmVzdG9yZSBjb2RlIHRvIGRlZmluZSBwb3RlbnRpYWxseSBtaXNzaW5nCisJV0NIQVJfTUlOLCBXQ0hBUl9NQVggbWFjcm9zLiBJdCB1c2VkIHRvIGJlIGluIF9tYnN0YXRlX3QuaCBidXQgd2FzCisJbWlzc2luZyBzb21lIG5hdGl2ZSBpbmNsdWRlcyB0byB3b3JrLCBpbiBfY3djaGFyLmggZXZlcnl0aGluZyBzaG91bGQKKwliZSBmaW5lLgorCisJKiB0ZXN0L3VuaXQvY29kZWN2dF90ZXN0LmNwcDogRml4IEMgY2FzdCB0aGF0IHdhcyBsb3NpbmcgY29uc3QKKwlxdWFsaWZpZXIuCisKKwkqIHN0bHBvcnQvc3RsL19tYnN0YXRlX3QuaDogQXZvaWQgZGVmaW5pdGlvbiBvZiBfU1RMUF9OT19NQlNUQVRFX1Qgd2hlbgorCXVzaW5nIG93biBtYnN0YXRlX3QgZGVmaW5pdGlvbiBpbiBfU1RMUF9VU0VfTk9fSU9TVFJFQU1TIG1vZGUuIFRoaXMgbWFjcm8KKwlpcyBub3Qgc3VwcG9ydGVkIGFueW1vcmUgYW5kIHNob3VsZCBiZSBmaXhlZCBvciByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9uLgorCU93biBtYnN0YXRlX3Qgd2lsbCBiZSBkZWZpbmVkIGV2ZW4gaW4gbm8gaW9zdHJlYW1zIG1vZGUuCisKKwkqIHN0bHBvcnQvc3RsL2NvbmZpZy9fZXZjLmg6IE5vdyB0aGF0IG1ic3RhdGVfdCBzaXR1YXRpb24gaXMgY2xlYXIgRVZDMworCWRlZmluZXMgX1NUTFBfTk9fTkFUSVZFX01CU1RBVEVfVCByYXRoZXIgdGhhbiBkaXJlY3RseSBkZWZpbmluZyBpdCBpbgorCXRoZSBjb25maWcgZmlsZS4gCisKKwkqIHRlc3QvdW5pdDogU2V2ZXJhbCBmaXhlcyB0byBidWlsZCB3aXRoIF9TVExQX05PX0VYVEVOU0lPTlMgYW5kCisJX1NUTFBfTk9fQU5BQ0hST05JU01TLgorCisyMDA2LTEwLTE2ICBQZXRyIE92dGNoZW5rb3YgIDxjb21wbGVtZW50QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3RscG9ydC9zdGwvX21ic3RhdGVfdC5oOiB0aGlzIGhlYWRlciBtYXkgYmUgaW5jbHVkZWQgZnJvbSBzeXN0ZW0KKwlzdGRkZWYuaCwgd2l0aG91dCB3Y2hhci5oLS0tZGVmaW5lcyBvZiB3Y2hhciBsaW1pdHMgaXNuJ3QgZ29vZCBwbGFjZQorCWhlcmUgW1dDSEFSX01BWCwgZXRjLl0uCisKKwkqIHRlc3QvdW5pdC9jd2NoYXIuY3BwOiBjb3JyZWN0IHRlc3QgdG8gaGlsaWdodCBwcm9ibGVtIGFib3ZlLgorCisyMDA2LTEwLTE0ICBQZXRyIE92dGNoZW5rb3YgIDxjb21wbGVtZW50QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogdGVzdC91bml0L2N3Y2hhci5jcHAsIGJ1aWxkL3Rlc3QvdW5pdC9NYWtlZmlsZS5pbmM6IHRlc3QgYSBmZXcgbWFjcm9zCisJcmVsYXRlZCB0byB3Y2hhci4gSW5zcGlyZWQgYnkgcHJvYmxlbXMgaW4gU1RMUE9SVF81XzEgYW5kIGJvb3N0OjpyZWdleC4KKworMjAwNi0xMC0xMiAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bC9fbnVtcHVuY3QuaCwgc3JjL251bXB1bmN0LmNwcDogbnVtcHVuY3QgZmFjZXQgX01fdHJ1ZW5hbWUKKwlfTV9mYWxzZW5hbWUgYW5kIF9NX2dyb3VwaW5nIGFyZSBub3Qgc3RhdGljIGFueW1vcmUuIFRoaXMgc2VlbXMgdXNlbGVzcworCWFuZCBtb3Jlb3ZlciB3YXMgaW50cm9kdWNpbmcgc3RhdGljIGluaXRpYWxpc2F0aW9uIG9yZGVyIGFuZCB0aHJlYWRpbmcKKwlpc3N1ZXMuCisKKwkqIHN0bHBvcnQvc3RsL2NfbG9jYWxlLmgsIF9tYnN0YXRlX3QuaCwgc3JjL2NfbG9jYWxlLmgsIGNfbG9jYWxlLmM6CisJTmV3IG1ic3RhdGVfdCBwb2xpY3kuIFdoZW4gbm8gbWJzdGF0ZV90IGluIG5hdGl2ZSBsaWJyYXJ5IFNUTHBvcnQgZGVmaW5lcworCW9uZSBmb3IgaXRzIG93biBuZWVkIGluIGxvY2FsaXNhdGlvbiBzdXBwb3J0LiBUaGlzIG1ic3RhdGVfdCBpcyBzaW1wbHkKKwlhbiBpbnQgZGVmaW5lZCBpbiBnbG9iYWwgbmFtZXNwYWNlIGFuZCBpbXBvcnRlZCB0byBTVExwb3J0IG5hbWVzcGFjZS4KKwlJbnRlcm5hbCBsb2NhbGlzYXRpb24gZnJhbWV3b3JrIGlzIG50IGFueW1vcmUgaW4gU1RMcG9ydCBuYW1lc3BhY2UgYnV0CisJaW4gdGhlIGdsb2JhbCBvbmUgYXMgaXQgaXMgbm9ybWFseSBhIEMgZnJhbWV3b3JrLgorCisJKiBzdGxwb3J0L3N0bC9jb25maWcvX2JjLmg6IERlZmluZXMgX1NUTFBfTk9fTkFUSVZFX01CU1RBVEVfVCByYXRoZXIKKwl0aGFuIGludGVybmFsIF9TVExQX1VTRV9PV05fTUJTVEFURV9UIG1hY3JvLgorCisJKiBzdGxwb3J0L3N0bC9jb25maWcvX2V2Yy5oOiBBZGQgY29tbWVudCBmb3IgRVZDMyB1c2VycywgdGhpcyBwbGF0Zm9ybQorCXNob3VsZCBkZWZpbmUgX1NUTFBfTk9fTkFUSVZFX01CU1RBVEVfVCwgYnV0IEkgaGF2ZSBub3QgdGhlIHBsYXRmb3JtCisJdG8gY2hlY2suLi4KKworCSogYnVpbGQvTWFrZWZpbGVzL2dtYWtlL2JjYy5tYWs6IERvIG5vdCBmb3JjZSBhbnltb3JlIGJ1aWx0IG9mIEMgc291cmNlcworCWFzIEMrKy4KKworCSogdGVzdC91bml0L3N0cmluZ190ZXN0LmNwcCwgaXN0bWl0X3Rlc3QuY3BwOiBGaXhlZCBtYWNybyBjaGVja3MgdG8gbWFrZQorCXRlc3RzIGJ1aWxkYWJsZSBldmVuIHdoZW4gX1NUTFBfTk9fSU9TVFJFQU1TIGlzIGRlZmluZWQuCisKKzIwMDYtMTAtMDkgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogdGVzdC91bml0L2NvZGVjdnRfdGVzdC5jcHA6IEZpeCB1c2Ugb2YgbWJzdGF0ZV90IHRvIG1ha2UgaXQgbW9yZQorCXBvcnRhYmxlLgorCisyMDA2LTEwLTA2ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL19hbGxvYy5oLCBfYWxsb2MuYzogRml4ZWQgX19kZWJ1Z19hbGxvYyBpbXBsZW1lbnRhdGlvbgorCXRvIGF2b2lkIHVuanVzdGlmaWVkIGFzc2VydGlvbiBhYm91dCB3cm9uZyBzaXplIG9mIGJ1ZmZlciB0bworCWRlYWxsb2NhdGUsIHRoYW5rcyBEYXZpZCBEZWFraW5zIGFuZCB2ZXJudHggb24gc291cmNlZm9yZ2UuCisKKwkqIHRlc3QvdW5pdC92ZWN0b3JfdGVzdC5jcHA6IEFkZCB0ZXN0IGZvciBidWcgYWJvdmUuCisKKwkqIHN0bHBvcnQvd2NoYXIuaCwgc3RsL19jd2NoYXIuaCwgX2lzdHJlYW0uaCwgX2xpbWl0cy5oLCBfbG9jYWxlLmgsCisJX3RocmVhZHMuaCwgY2hhcl90cmFpdHMuaCwgdHlwZV90cmFpdHMuaCwgX21ic3RhdGVfdC5oOiBGaXggcmVncmVzc2lvbgorCWludHJvZHVjZSBieSBpbmNsdXNpb24gb2YgbWJzdGF0ZV90LmggaW4gd2NoYXIuaC4gTm93IF9tYnN0YXRlX3QuaCBpcworCW9ubHkgaW5jbHVkZWQgYXQgZW5kIG9mIHdjaGFyLmggYW5kIF9jd2NoYXIuaC4gQWxsIHBsYWNlcyB3aGVyZSBfbWJzdGF0ZV90LmgKKwl3YXMgdXNlZCBhcmUgbm93IGluY2x1ZGluZyBfY3djaGFyLmguCisKKzIwMDYtMTAtMDUgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogYnVpbGQvTWFrZWZpbGVzL2dtYWtlL2JjYy5tYWs6IFVzZSAtUCBjb21waWxlciB0byBmb3JjZSBidWlsZCBvZiBDCisJdHJhbnNsYXRpb24gYXMgQysrIGJlY2F1c2Ugb2YgdGhlIG1ic3RhdGVfdCBwcm9ibGVtLgorCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2UvbGliL2JjYy5tYWssIHJ1bGVzLWEubWFrOiBGaXggQm9ybGFuZCB0bGliIGNhbGwKKwlzeW50YXggdGhhbmtzIG1ia2VubnkuCisKKwkqIHN0bHBvcnQvc3RsL3djaGFyLmg6IEFkZCBpbmNsdWRlIG9mIGludGVybmFsIF9tYnN0YXRlX3QuaCBmaWxlIHRvCisJa25vdyBTVExwb3J0IHN0YXR1cyByZWdhcmRpbmcgbWJzdGF0ZV90IGNvbmZpZ3VyYXRpb24uCisKKwkqIHN0bHBvcnQvc3RsL2NfbG9jYWxlLmg6IFdoZW4gYnVpbGRpbmcgcGxhdGZvcm0gbG9jYWxpc2F0aW9uIHN1cHBvcnQKKwlhcyBDKysgc3RydWN0IGRlY2xhcmF0aW9uIGFyZSBkb25lIGluIFNUTHBvcnQgbmFtZXNwYWNlLgorCisJKiBzcmMvY19sb2NhbGUuaDogUmVtb3ZlZCBfbWJzdGF0ZV90LmggaW5jbHVkZSB0aGF0IGlzIG5vdyBpbmNsdWRlZAorCWZyb20gd2NoYXIuaCBvciBfY3djaGFyLmggZGVwZW5kaW5nIG9uIEMgb3IgQysrIGJ1aWxkLiBSZW1vdmVkICNlcnJvcgorCWRvbmUgdG9vIGVhcmx5IChzZWUgbmV4dCBjb21tZW50KS4KKworCSogc3JjL2NfbG9jYWxlLmM6IEFkZCAjZXJyb3Igc3RhdGVtZW50IHdoZW4gYnVpbGRpbmcgU1RMcG9ydCBvbiBhIHBsYXRmb3JtCisJaGF2aW5nIHJlYWwgbG9jYWxpc2F0aW9uIHN1cHBvcnQgYnV0IG5vIG5hdGl2ZSBtYnN0YXRlX3QgZGVmaW5pdGlvbi4gSW4gdGhpcworCWNhc2UgY19sb2NhbGUuYyBtdXN0IGJlIGJ1aWx0IGFzIGEgQysrIHRyYW5zbGF0aW9uIHVuaXQuCisKKwkqIHNyYy9jX2xvY2FsZV93aW4zMi9jX2xvY2FsZV93aW4zMi5jOiBBZGQgQm9ybGFuZCB3b3JrYXJvdW5kIHRvIGF2b2lkCisJY29tcGlsYXRpb24gZXJyb3Igbm93IHRoYXQgaXQgaXMgYnVpbGQgYXMgYSBDKysgdHJhbnNsYXRpb24gdW5pdC4KKworCSogc3RscG9ydC9zdGwvX21ic3RhdGVfdC5oOiBOb3cgdGhhdCB0aGlzIGZpbGUgaXMgbm90IGluY2x1ZGVkIGZyb20gb3V0c2lkZQorCXdvcmxkIHdlIGNhbiBpbmNsdWRlIGludGVybmFsIF9jd2NoYXIuaCByYXRoZXIgdGhhbiBjd2NoYXIuIFJlbW92ZWQKKwlhIHdpbnRfdCB3b3JrYXJvdW5kIGFscmVhZHkgZXhpc3RpbmcgaW4gX2N3Y2hhci5oLiBSZW1vdmVkIEJvcmxhbmQgd29ya2Fyb3VuZAorCXRoYXQgd2FzIGRlZmluaW5nIG1ic3RhdGVfdCB3aGVuIHVzaW5nIHRoaXMgZmlsZSBpbiBhIEMgY29udGV4dCwgaXQgd2FzCisJbW9yZW92ZXIgZGlmZmVyZW50IHRoYW4gdGhlIGRlZmluaXRpb24gaW4gQysrICEgQWRkIGEgcHVyZSBDIGRlY2xhcmF0aW9uIG9mCisJbWJzdGF0ZV90IHdoZW4gaW4gQy4KKworMjAwNi0xMC0wNCAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzcmMvY19sb2NhbGUuaDogQWRkICNlcnJvciB0byBzaWduYWwgaXNzdWUgd2hlbiBidWlsZGluZyBjX2xvY2FsZS5jCisJYXMgYSBDIHNvdXJjZSB3aGVuIFNUTHBvcnQgdXNlcyBpdHMgb3duIG1ic3RhdGVfdCBkZWZpbml0aW9uLgorCisJKiBzcmMvbnVtX3B1dF9mbG9hdC5jcHA6IE1vZGlmaWNhdGlvbiBpbiBDeWd3aW4gbmF0aXZlIGxpYiBoZWFkZXJzCisJcmV2ZWFsZWQgdGhhdCB3ZSB3ZXJlIG1pc3NpbmcgaWVlZWZwLmggaW5jbHVkZS4KKworCSogc3JjL2RsbF9tYWluLmNwcCwgc3RscG9ydC9zdGwvX3RocmVhZHMuaDogRml4IGV4cG9ydCBvZgorCV9BdG9taWNfc3dhcF9zdHJ1Y3QgZm9yIGNvbXBpbGVycyBzdXBwb3J0aW5nIGV4cG9ydCBvZiB0ZW1wbGF0ZXMuCisKKwkqIHN0bHBvcnQvc3RsL2NvbmZpZy9faHBhY2MuaDogU29tZSBjbGVhbnVwICh1bmtub3duIF9TVExQX05PX0tPRU5JR19MT09LVVAKKwltYWNybykgYW5kIGZvcm1hdGluZyBmaXhlcy4KKworCSogc3RscG9ydC9zdGwvX2J2ZWN0b3IuaDogVXNlIF9TVExQX0RFQ0xBUkVfUkFORE9NX0FDQ0VTU19SRVZFUlNFX0lURVJBVE9SUworCXJhdGhlciB0aGFuIHJlcHJvZHVjaW5nIHRoZSB3b3JrYXJvdW5kIGhpZGRlbiBieSB0aGlzIG1hY3JvLgorCisJKiB0ZXN0L3VuaXQvdmVjdG9yX3Rlc3QuY3BwOiBBZGQgdGVzdCBjYXNlIHRvIGNoZWNrIGl0ZXJhdG9ycyBjb21wYXJpc29ucy4KKworMjAwNi0wOS0yNiAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzcmMvYWxsb2NhdG9ycy5jcHA6IFJlb3JkZXIgY29kZSBibG9ja3MgdG8gZml4IGJ1aWxkIHdoZW4gdXNpbmcKKwlfU1RMUF9MRUFLU19QRURBTlRJQy4KKworCSogc3RscG9ydC9zdGwvX251bV9wdXQuYzogUmVzdG9yZSBfX2xlbiA+PSAyIGNoZWNrIGluCisJX19jb3B5X2ludGVnZXJfYW5kX2ZpbGwgZnVuY3Rpb24uIEl0IGhhcyBiZWVuIHJlbW92ZWQgb24gdGhlCisJMjAwNi0wNy0xMSwgYXQgdGhpcyB0aW1lIFNUTHBvcnQgYWx3YXlzIGFkZCB0aGUgYmFzZSBpbmZvcm1hdGlvbgorCWV2ZW4gZm9yIDAgdmFsdWUuIFRoaXMgbW9kaWZpY2F0aW9uIGhhcyBiZWVuIHJvbGxiYWNrIGJ1dCBub3QgdGhpcworCWNoZWNrLgorCisJKiB0ZXN0L3VuaXQvbnVtX3B1dF9nZXRfdGVzdC5jcHA6IEFkZCBjaGVjayBmb3IgYWJvdmUgZml4LgorCisyMDA2LTA5LTI2ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHNyYy9jX2xvY2FsZV93aW4zMi9jX2xvY2FsZV93aW4zMi5jOiBBZGQgY2hlY2sgb2YgY29kZSBwYWdlIHdoZW4KKwlzcGVjaWZpZWQgaW4gbG9jYWxlIG5hbWUuCisKKwkqIHNyYy9jX2xvY2FsZV93aW4zMi9jX2xvY2FsZV93aW4zMi5jOiBBZGQgY2hlY2tzIGluIF9fQ29udmVydERhdGUKKwlhbmQgX0xvY2FsZV90X2ZtdCB0byBhdm9pZCBwb3RlbnRpYWwgYnVmZmVyIG92ZXJmbG93LgorCisJKiBzcmMvY19sb2NhbGVfd2luMzIvY19sb2NhbGVfd2luMzIuYzogQ3JlYXRlIF9fR2V0TG9jYWxlSW5mb1VzaW5nQUNQCisJZnVuY3Rpb24gdGhhdCBtZXJnZSBhIGNhbGwgdG8gR2V0TG9jYWxlSW5mb0EgYW5kIGEgY2FsbCB0bworCV9fQ29udmVydEZyb21BQ1AgaW4gb25lIGNhbGwsIHRoZSBsYXR0ZXIgZnVuY3Rpb24gaGFzIGJlZW4gcmVtb3ZlZC4KKworCSogc3JjL2NfbG9jYWxlLmg6IFJlc3RvcmUgX1NUTFBfQkVHSU5fTkFNRVNQQUNFIHdoZW4gU1RMcG9ydCB1c2UKKwlpdHMgb3duIG1ic3RhdGVfdCBkZWZpbml0aW9uIHdoaWNoIGlzIG9ubHkgYXZhaWxhYmxlIGluIFNUTHBvcnQKKwluYW1lc3BhY2UuIEZpeCBCb3JsYW5kIHJlZ3Jlc3Npb24uCisKKwkqIHN0bHBvcnQvc3RsL19tYnN0YXRlX3QuaDogUmVwbGFjZSBzdGwvX2N3Y2hhci5oIGluY2x1ZGUgd2l0aAorCWEgY3djaGFyIG9uZSBhcyB0aGlzIGZpbGUgaXMgaW5jbHVkZWQgZnJvbSB0aGUgb3V0c2lkZSB3b3JsZCB3aGVuCisJYnVpbGRpbmcgU1RMcG9ydCBsaWIuCisKKzIwMDYtMDktMjUgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogdGVzdC91bml0L2NvZGVjdnRfdGVzdC5jcHA6IE5ldyB0ZXN0IGNhc2UgZm9yIHRoZSBjb2RlY3Z0CisJZmFjZXQuCisKKwkqIHRlc3QvdW5pdC91bm9yZGVyZWRfdGVzdC5jcHA6IHNpemVfdCByZXBsYWNlIGJ5IGludCB0byBhdm9pZAorCTY0Yml0cyBpc3N1ZSB3YXJuaW5nLgorCisyMDA2LTA5LTIxICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL2NfbG9jYWxlLmg6IFBhdGNoIGZyb20gQm9yaXMgR3ViZW5rbyB0byBhdm9pZAorCWRpcmVjdCBpbmNsdXNpb24gb2YgaW50ZXJuYWwgaGVhZGVyIGZyb20gdGhpcyBoZWFkZXIgdGhhdCBpcworCWFjY2VzcyBmcm9tIHRoZSBvdXRzaWRlIHdvcmxkIHdoZW4gYnVpbGRpbmcgU1RMcG9ydCBsaWIuCisKKzIwMDYtMDktMjAgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogdGVzdC91bml0L2FsbG9jYXRvcl90ZXN0LmNwcDogQWRkIG5ldyB0ZXN0IGNhc2UgZm9yIGFsbG9jYXRpb24gb2YKKwllbXB0eSBidWZmZXIuCisKKwkqIHRlc3QvdW5pdC9mc3RyZWFtX3Rlc3QuY3BwOiBVc2UgYSB2YXJpYWJsZSB0byBhbHdheXMgcG9pbnQgdG8gdGhlIHNhbWUKKwl0ZXN0IGZpbGUgYW5kIGFkb3B0IGEgJ1N0YW5kYXJkJyBmaWxlIG5hbWUgJ3Rlc3RfZmlsZS50eHQnLgorCisJKiBzdGxwb3J0L3N0bC9faGFzaF9mdW4uaDogUm9sbGJhY2sgMjAwNi0wOC0yNiBQZXRyIG1vZGlmaWNhdGlvbiB0aGF0CisJd2FzIGludHJvZHVjaW5nIGEgcmVncmVzc2lvbiB3aXRoIE1TVkMgY29tcGlsZXJzLgorCisJKiBzdGxwb3J0L3N0bC9fZnN0cmVhbS5jOiBGaXJzdCBhdHRlbXB0IHRvIGZpeCBzZWVrb2ZmIGJhc2ljX2ZpbGVidWYKKwlpbXBsZW1lbnRhdGlvbiB3aGVuIGRlYWxpbmcgd2l0aCBhIGNvZGVjdnQgZmFjZXQgaGF2aW5nIHZhcmlhYmxlCisJZW5jb2RpbmcuIFRoaXMgZml4IGlzIHN1cmVseSBub3QgY29tcGxldGUsIGRpc2N1c3Npb24gd2l0aCBVbGkgaXMgbm90CisJb3Zlci4KKworMjAwNi0wOS0xMyAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bC9fZXhjZXB0aW9uLmg6IE1hZGUgYSBwcmV2aW91c2x5IGdlbmVyYWwgV2luZG93cyA2NCBiaXRzCisJd29ya2Fyb3VuZCBzcGVjaWZpYyB0byB0aGUgY3Jvc3MgY29tcGlsZXIgY29taW5nIHdpdGggUFNESy4gVGhhbmtzCisJSWdvciBQYXZsb3YuCisKKzIwMDYtMDktMTEgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3RscG9ydC9zdGwvX251bV9wdXQuYzogTW9kaWZpY2F0aW9uIGluIF9fZG9fcHV0X2ludGVnZXIgdG8gYXZvaWQKKwlhIEhwIGFDQyB3b3JrYXJvdW5kLgorCisyMDA2LTA5LTExICBQZXRyIE92dGNoZW5rb3YgIDxjb21wbGVtZW50QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3RscG9ydC9zdGwvX2FsZ28uYzogc2VhcmNoX24gd2l0aCBwcmVkaWNhdGUgZmFpbCBpbiBjYXNlCisJd2hlbiBzdWJzZXF1ZW5jZSBzaXplIGlzIDE7IHRoYW5rcyBUaW1taWUgU21pdGguCisJCisJKiB0ZXN0L3VuaXQvYWxnX3Rlc3QuY3BwOiB0ZXN0IGZvciBwcm9ibGVtLgorCisyMDA2LTA5LTA4ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHNyYy9jX2xvY2FsZV93aW4zMi9jX2xvY2FsZV93aW4zMi5jOiBNb2RpZmljYXRpb24gaW4gX19HZXRMQ0lERnJvbU5hbWUKKwl0byBzdXBwb3J0IHRoZSBDaGluZXNlX1RhaXdhbiBsb2NhbGUuIEFkZCBvZiBhIF9fR2V0TENJRCBjYWxsIHdoZW4gZmlyc3QKKwljYWxsIHRvIGl0IHVzaW5nIG5vbiBOTFMgbWFwcGluZyBmYWlscy4KKworCSogc3JjL2NfbG9jYWxlX3dpbjMyL2NfbG9jYWxlX3dpbjMyLmM6IENoYW5nZSBfX1BhcnNlTG9jYWxlU3RyaW5nCisJaW1wbGVtZW50YXRpb24gdG8gY29ycmVjdGx5IGhhbmRsZSBsb2NhbGUgd2l0aCBhIG5hbWUgaGF2aW5nICcuJyBpbgorCXRoZSBsYW5ndWFnZSBvciBjb3VudHJ5IHBhcnQgbGlrZSBpbiAnQ2hpbmVzZV9Ib25nIEtvbmcgUy5BLlIuLjk1MCcuCisKKzIwMDYtMDktMDUgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogYnVpbGQvbGliL2NvbmZpZ3VyZS5iYXQ6IEZpeGVkIGNvbW1lbnQgZm9yIC0tcnRsLWR5bmFtaWMgYW5kCisJLS1ydGwtc3RhdGljIG9wdGlvbnMsIGltcGFjdCBvbiBtYWNyb3MgdG8gdW5jb21tZW50IGluIGhvc3RzLmgKKwljb25maWcgZmlsZSB3YXMgaW52ZXJzZWQuIFRoYW5rcyBJZ29yIFBhdmxvdi4KKworCSogYnVpbGQvbGliL2NvbmZpZ3VyZS5iYXQsIGRvYy9GQVEsIGRvYy9SRUFETUUubXN2YywKKwlzdGxwb3J0L3N0bC9jb25maWcvdXNlcl9jb25maWcuaCwgX2hwYWNjLmg6IFJlcGxhY2VkIHJlZmVyZW5jZXMgdG8KKwlfc2l0ZV9jb25maWcuaCBieSBob3N0cy5oLiBUaGFua3MgSWdvciBQYXZsb3YuCisKKzIwMDYtMDgtMzAgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3RscG9ydC9zdGwvX2NtYXRoLmgsIF9jc3RkbGliLmg6IFBhdGNoIGZyb20gQm9yaXMgR3ViZW5rbywgSHAgYUNDCisJbmF0aXZlIFN0YW5kYXJkCWxpYiBhbHJlYWR5IGRlZmluZSBtYXRoIGZ1bmN0aW9ucyBpbiBnbG9iYWwgbmFtZXNwYWNlLgorCQorCSogc3RscG9ydC9zdGwvX251bV9wdXQuYzogUGF0Y2ggZnJvbSBCb3JpcyBHdWJlbmtvLCBIcCBhQ0MgYmVmb3JlIHZlcnNpb24KKwk2MDAwMCBkbyBub3QgY29uc2lkZXIgJ2NvbnN0IHB0cmRpZmZfdCcgYXMgY29uc3QgZW5vdWdoIHRvIGJlIHVzZWQgaW4gYQorCXN0YXRpYyBidWZmZXIgZGVjbGFyYXRpb24uCisKKzIwMDYtMDgtMjYgIFBldHIgT3Z0Y2hlbmtvdiAgPGNvbXBsZW1lbnRAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzdGxwb3J0L3N0bC9faGFzaHRhYmxlLmM6IGFsbG93IHNtYWxsZXIgYnVja2V0IGNvdW50cyBmb3IKKwloYXNodGFibGUuIFRoYW5rcyBIZXJiZXJ0IER1ZXJyLgorCisJKiBzdGxwb3J0L3N0bC9faGFzaF9mdW4uaDogdXNlIHByaW1hcnkgdHlwZXMgZm9yIGhhc2hlciwgbm90CisJdHlwZWRlZnMuCisKKwkqIHN0bHBvcnQvc3RsL3R5cGVfbWFuaXBzLmg6IHdvcmthcm91bmQgZm9yIF9fdHJ1ZV90eXBlL19fZmFsc2VfdHlwZQorCWZvciB2YXJpb3VzIHZlcnNpb25zIGdjYyAob2gsIHllcywgZ2NjLCBpdCdzIHJlYWwgcGFpbiB0byBkZXRlY3QKKwlyZWFsIHZlcnNpb24gb2YgbGlic3RkYysrKQorCQorMjAwNi0wOC0xMCAgUGV0ciBPdnRjaGVua292ICA8Y29tcGxlbWVudEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHN0bHBvcnQvc3RkbGliLmg6IGluY2x1ZGUgZXJybm8uaCBmb3IgYUNDLCBpbiBjYXNlIG9mIC1tdCBvcHRpb24gaW4gZm9yY2UuCisJVGhpcyBzb2x2ZSBlcnJubyBwcm9ibGVtIG9uIEhQLVVYLiBUaGFua3MgQm9yaXMgR3ViZW5rby4KKworMjAwNi0wOC0wOSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bC9jb25maWcvX21zdmMuaDogQWRkIF9TVExQX05PUkVUVVJOX0ZVTkNUSU9OIGZvciBNU1ZDCisJY29tcGlsZXJzLgorCisJKiBzdGxwb3J0OiBNb3ZlIHBsYWNlIG9mIF9TVExQX0ZVTkNUSU9OX1RIUk9XUyBpbiBmdW5jdGlvbiBkZWNsYXJhdGlvbiB0bworCW1ha2UgbXN2YyBjb21waWxlciBoYXBwaWVyLCBnY2MgZG8gbm90IGNhcmUgYWJvdXQgcG9zaXRpb24gb2YgdGhpcworCWF0dHJpYnV0ZS4KKworCSogc3RscG9ydC9zdGwvX2lvc2Vyci5oOiBGaXhlZCBzcGVjaWZpY2F0aW9uIG9mIFNUTHBvcnQgY29uZmlndXJhdGlvbiBmaWxlCisJaW4gI2Vycm9yIHN0YXRlbWVudC4KKworMjAwNi0wOC0wNCAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0OiBDcmVhdGUgX1NUTFBfRlVOQ1RJT05fVEhST1dTIGRlcGVuZGluZyBvbiBfU1RMUF9OT1JFVFVSTl9GVU5DVElPTgorCWFuZCBhbHNvIHRha2luZyBpbnRvIGFjY291bnQgZXhjZXB0aW9uIGhhbmRsaW5nIGNvbmZpZ3VyYXRpb24uCisKKwkqIHRlc3QvdW5pdC9hbGdfdGVzdC5jcHAsIGlzdG1pdF90ZXN0LmNwcDogRml4ZXMgdG8gbWFrZSB0ZXN0IGJ1aWxkYWJsZSB3aXRoCisJbmF0aXZlIGNvbXBpbGVyIFN0YW5kYXJkIGxpYnJhcnkuCisKKzIwMDYtMDgtMDMgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogYnVpbGQvTWFrZWZpbGVzL25tYWtlL2V2YzgubWFrOiBQYXRjaCBmcm9tIFVscmljaCBFY2hrYXJkdCB0byBhY3RpdmF0ZQorCXdob2xlIHByb2dyYW0gb3B0aW1pemF0aW9uLgorCisyMDA2LTA3LTMxICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIFBhdGNoIGZyb20gTWljaGFlbCBGaW5rIHRvIGZpeCBFVkMgZW11bGF0b3IgYnVpbGQuCisKKzIwMDYtMDctMjYgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3JjL2ZzdHJlYW0uY3BwOiBGaXhlZCBNTUFQX0NIVU5LIGRlZmluaXRpb24sIGFuIG9mZnNldCB0eXBlIGlzIHNpZ25lZC4KKworCSogQ3JlYXRpb24gb2YgdGhlIDUuMS4wIFJDMiBwYWNrYWdlLgorCisJKiBDcmVhdGlvbiBvZiBTVExQT1JUXzVfMV9SQzIgdGFnCisKKzIwMDYtMDctMjUgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3RscG9ydC9zdGwvY29uZmlnL19zeXN0ZW0uaCwgX3dpbmRvd3MuaDogRml4ZWQgTWluR1cgY29uZmlnIHRoYXQgYWxzbworCW5lZWQgX3dpbmRvd3MuaC4KKworCSogc3RscG9ydC9zdGwvY29uZmlnL19taW5ndy5oOiBSZW1vdmVkLCBjb25mbGljdCB3aXRoIHBsYXRmb3JtIHN5c3RlbQorCWhlYWRlci4KKworMjAwNi0wNy0yMiAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bC9jb25maWc6IEFkZCBfU1RMUF9QTEFURk9STSBhbmQgX1NUTFBfQ09NUElMRVIgcmVwZWN0aXZlbHkKKwljb250YWluaW5nIFNUTHBvcnQgZGV0ZWN0ZWQgcGxhdGZvcm0gYW5kIGNvbXBpbGVyIG5hbWVzLiBTb21lIG5hbWVzCisJYXJlIHN1cmVseSBub3QgYWNjdXJhdGUgYW5kIHdpbGwgYmUgZml4ZWQgYnV0IGludHJvZHVjaW5nIHRob3NlIG1hY3JvcywKKwllc3BlY2lhbGx5IF9TVExQX0NPTVBJTEVSLCBoZWxwIHRvIHJlcG9ydCBkZXRlY3Rpb24gaXNzdWUuCisKKwkqIHN0bHBvcnQvc3RsL2NvbmZpZy9fc3lzdGVtLmg6IENoYW5nZSBtYWNybyBjaGVja3MgaW4gb3JkZXIgdG8gZ3VhcmFudHkKKwl0aGF0IG9ubHkgb25lIHBsYXRmb3JtIGFuZCBvbmx5IG9uZSBjb21waWxlciBjb25maWd1cmF0aW9uIGZpbGUgd2lsbCBiZQorCWluY2x1ZGVkLgorCisJKiBzdGxwb3J0L3N0bC9jb25maWcvX2N5Z3dpbi5oLCBfbWluZ3cuaDogQWRkZWQKKworCSogc3RscG9ydC9zdGwvY29uZmlnL2ZlYXR1cmVzLmg6IFJlbW92ZWQgX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFX0NMQVNTRVMKKwljaGVjayB3aGVuIF9TVExQX1VTRV9URU1QTEFURV9FWFBSRVNTSU9OIGlzIGFjdGl2YXRlZC4KKworCSogc3RscG9ydC9zdGwvY29uZmlnL19nY2MuaCwgZmVhdHVyZXMuaDogQWRkIF9TVExQX05PUkVUVVJOX0ZVTkNUSU9OCisJdG8gc2lnbmFsIGZ1bmN0aW9uIG5vdCByZXR1cm5pbmcsIHVuZGVyIGdjYyB3ZSB1c2UgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKS4gCisKKwkqIHNyYy9sb2NhbGVfaW1wbC5oLCBzdGxwb3J0L3N0bC9faW9zX2Jhc2UuaCwgX2xvY2FsZS5oLCBfcmFuZ2VfZXJyb3JzLmgsCisJX3JvcGUuaCwgX3N0cmluZ19iYXNlLmgsIF92ZWN0b3IuaCwgZGVidWcvX2RlYnVnLmg6IEFkZAorCV9TVExQX05PUkVUVVJOX0ZVTkNUSU9OIHRvIGZ1bmN0aW9uIHRoYXQgZW5jYXBzdWxhdGUgcmFpc2luZyBvZiBleGNlcHRpb25zLgorCVRoaXMgaGVscCB0byBsaW1pdCB3YXJuaW5ncyBhYm91dCB1bmluaXRpYWxpemVkIHZhcmlhYmxlIGJlZm9yZSB1c2UgdW5kZXIKKwlnY2MuCisKKzIwMDYtMDctMTggIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogdGVzdC91bml0L3Vub3JkZXJlZF90ZXN0LmNwcDogQ2hhbmdlIEtleSBkYXRhIHR5cGUgZnJvbSBzaXplX3QKKwl0byB0aGUgbW9yZSBwb3J0YWJsZSBpbnQuIEZpeCB3aGF0IHNlZW1zIHRvIGJlIGEgYmFkIGNvZGUgZ2VuZXJhdGlvbgorCW9mIGdjYyB1bmRlciBMaW51eCA2NCBiaXRzIHJlc3VsdGluZyBpbiBhIHRlc3QgZmFpbHVyZS4KKworMjAwNi0wNy0xNyAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiB0ZXN0L3VuaXQvYWxnX3Rlc3QuY3BwOiBOZXcgdGVzdCBmb3IgZmluZF9maXJzdF9vZiBhbGdvLgorCisJKiBzdGxwb3J0L3N0bC9jb25maWcvdXNlcl9jb25maWcuaCwgZmVhdHVyZXMuaDogc3RyaW5nIHRlbXBsYXRlCisJZXhwcmVzc2lvbnMgaXMgbm90IGEgdHJhbnNwYXJlbnQgZmVhdHVyZSwgc29tZSBjb21waWxlcnMgKFZDNikKKwlhcmUgZXhwZXJpbWVudGluZyBJQ0Ugd2l0aCBpdCBvciBzb21lIG90aGVyIChnY2MpIGRvIG5vdCBhY2NlcHQKKwlpdCB3aGVuIGV4dGVuZGluZyBzdHJpbmcgY2xhc3MgKHNlZSBteXN0cmluZyBpbgorCXRlc3QvdW5pdC9zdHJpbmdfdGVzdC5jcHApLiBTbyBkZWZhdWx0IFNUTHBvcnQgY29uZmlndXJhdGlvbiB3aWxsCisJYmUgd2l0aG91dCBzdHJpbmcgdGVtcGxhdGUgZXhwcmVzc2lvbiwgX1NUTFBfRE9OVF9VU0VfVEVNUExBVEVfRVhQUkVTU0lPTgorCWhhcyBiZWVuIHJlcGxhY2VkIGJ5IF9TVExQX1VTRV9URU1QTEFURV9FWFBSRVNTSU9OLgorCisyMDA2LTA3LTE2ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHRlc3QvdW5pdC9tdmN0b3JfdGVzdC5jcHA6IFBhdGNoIGZyb20gTWljaGFlbCBGaW5rIHRvIGF2b2lkIGEgRVZDCisJQVJNIGNyYXNoLgorCisyMDA2LTA3LTEzICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL19udW1fcHV0LmM6IFJvbGxiYWNrIG1vZGlmIGFib3ZlLCBhY2NvcmRpbmcgQyBwcmludGYgZG9jCisJMCB2YWx1ZSBzaG91bGRuJ3Qgc2hvdyB0aGVpciBiYXNlLgorCisJKiBzdGxwb3J0L3N0bC90eXBlX3RyYWl0cy5oOiBBdm9pZCBpbnN0YW5jaWF0aW9uIG9mIF9Jc0NWQ29udmVydGlibGUgaWYKKwlub3QgZGVhbGluZyB3aXRoIHBvaW50ZXJzLiBTeXN0ZW1hdGljYWwgaW5zdGFuY2lhdGlvbiB3YXMgZ2l2aW5nCisJY29tcGlsYXRpb24gZXJyb3IgYXMgc29vbiBhcyB0eXBlIGhhZCBhIHNwZWNpYWwgbWVtb3J5IGFsaWdubWVudCwgc3VjaAorCXR5cGVzIGNhbm5vdCBiZSBwYXNzIGJ5IHZhbHVlIGluIGZ1bmN0aW9uIGNhbGxzLiBUaGFua3MgYW5keTIyMjIgZnJvbQorCXNvdXJjZWZvcmdlLgorCisJKiBidWlsZC9NYWtlZmlsZXMvbm1ha2UvZXZjMy5tYWssIGV2YzQubWFrLCBldmM4Lm1hazogUGF0Y2ggZnJvbSBVbHJpY2gKKwlFY2toYXJkdCB0byByZW1vdmUgY29tbWN0cmwubGliIGRlcGVuZGVuY3ksIGZvciB0aGUgbW9tZW50IGV2YzMgYW5kIGV2YzQKKwlvbmx5IGNvbnRhaW5zIGEgbm90ZSBhYm91dCB0aGlzIHBvdGVudGlhbGx5IHVzZWxlc3MgZGVwZW5kZW5jeS4KKworCSogc3RscG9ydC9zdGwvZGVidWcvX3N0cmluZy5oOiBBZGQgbWlzc2luZyBjb3B5IG1ldGhvZHMgaW4gdGhlIGRlYnVnCisJc3RyaW5nIGltcGxlbWVudGF0aW9uIHRoYW5rcyBQYXRyaWNrIEJlbm5ldHQgcmVwb3J0LgorCisJKiB0ZXN0L3VuaXQvc3RyaW5nX3Rlc3QuY3BwOiBOZXcgY29weSB0ZXN0IGNhc2UgZm9yIHN0cmluZzo6Y29weS4KKworCSogc3RscG9ydC9zdGwvX2FsZ28uaDogQWRkIG1pc3NpbmcgX1NUTFBfUFJJViBuYW1lc3BhY2Ugc2NvcGUgaW4gY2FsbHMKKwl0byBfX2ZpbmRfZmlyc3Rfb2YgdGhhbmtzIFBhdHJpY2sgQmVubmV0dCByZXBvcnQuCisKKzIwMDYtMDctMTEgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3RscG9ydC9zdGwvZGVidWcvX2RlcXVlLmgsIF9saXN0LmgsIF9zbGlzdC5oLCBfc3RyaW5nLmgsIF92ZWN0b3IuaDoKKwlFeHRlbmQgdXNlIG9mIF9Ob25fRGJnX2l0ZXIgZnVuY3Rpb24gaW4gYWxsIHRlbXBsYXRlIG1ldGhvZHMgZGVhbGluZworCXdpdGggaXRlcmF0b3IgcmFuZ2UuCisKKwkqIF9udW1fcHV0LmM6IEZpeCB0byBzaG93IGJhc2UgaW4gb2N0YWwgb3IgaGV4YWRlY2ltYWwgbW9kZSBldmVuIGZvcgorCTAgdmFsdWUuCisKKwkqIHN0bHBvcnQvc3RsL19pc3RyZWFtLmM6IEF2b2lkIG1vZGlmaWNhdGlvbiBvZiB2YWx1ZSB0byBleHRyYWN0IGluCisJZm9ybWF0dGVkIGlucHV0IG9mIHNob3J0IGFuZCBpbnQgd2hlbiB2YWx1ZSB3b3VsZCBvdmVyZmxvdy4KKworCSogdGVzdC91bml0L251bV9wdXRfZ2V0X3Rlc3QuY3BwOiBBZGQgc29tZSB0ZXN0cyBmb3IgYWJvdmUgZml4ZXMuCisKKwkqIHRlc3QvdW5pdC9pb3N0cmVhbV90ZXN0LmNwcDogTmV3IHRlc3RzIGZvciBnZW5lcmFsIHN0cmVhbQorCW1hbmlwdWxhdGlvbnMuCisKKwkqIHN0bHBvcnQvc3RsL19pc3RyZWFtLmg6IEZpeCB3cyBpb3N0cmVhbSBmdW5jdGlvbiwgaXQgZG8gbm90IHNldCBmYWlsYml0CisJYW55bW9yZSB3aGVuIHN0cmVhbSBpcyBpbiBlb2Ygc3RhdGUuCisKKwkqIGJ1aWxkL2xpYi9tc3ZjLm1hazogR2VuZXJhdGlvbiBvZiBjb25maWcubWFrIGlzIG5vdCBtYW5kYXRvcnkgYW55bW9yZQorCWFzIEludGVsIGNvbXBpbGVyIGRvIG5vdCBuZWVkIGl0IGZvciB0aGUgbW9tZW50LiBPbmx5IGEgQ09NUElMRVJfTkFNRQorCWlzIG1hbmRhdG9yeSB3aGljaCBpcyBnaXZlbiBieSBpY2wubWFrIGZvciBJbnRlbCBjb21waWxlcnMgYW5kIGJ5CisJY29uZmlnLm1hayBmb3IgTWljcm9zb2Z0IG9uZXMuCisJCisyMDA2LTA3LTEwICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL2RlYnVnL19pdGVyYXRvci5oOiBDcmVhdGlvbiBvZiBfTm9uX0RiZ19pdGVyIGZ1bmN0aW9uCisJcmV0dXJuaW5nIG5hdGl2ZSBpdGVyYXRvciBvZiBzcGVjaWFsIGRlYnVnIGl0ZXJhdG9yIHdpdGgKKwljb21waWxlcnMgc3VwcG9ydGluZyBwYXJ0aWFsIHRlbXBsYXRlIGZ1bmN0aW9uIG9yZGVyaW5nLiBGaXgKKwlhIE1TVkMgLk5ldCAyMDAzIGlzc3VlIHRoYXQgc2VlbXMgdG8gYmUgcmVsYXRlZCB0byBhIHRvbyBpbXBvcnRhbnQKKwl0ZW1wbGF0ZSBkZXB0aC4KKworCSogc3RscG9ydC9zdGwvZGVidWcvX2RlcXVlLmgsIF9saXN0LmgsIF9zbGlzdC5oLCBfc3RyaW5nLmgsIF92ZWN0b3IuaDoKKwlVc2UgbmV3IF9Ob25fRGJnX2l0ZXIgZnVuY3Rpb24gaW4gY29uc3RydWN0b3JzIGZyb20gaXRlcmF0b3IKKwlyYW5nZS4KKworMjAwNi0wNy0wNyAgUGV0ciBPdnRjaGVua292ICA8Y29tcGxlbWVudEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGJ1aWxkL2xpYi9jb25maWd1cmU6IHJvbGxiYWNrIGNoYW5nZXMgNCBKdWwgMjAwNiAxOTo0Mjo1NSwKKwlpdCdzIGRlZmluaXRlbHkgd3JvbmcgKHBocmFzZSB3aXRoIHF1b3RlcyBbJ10gcmVxdWlyZXMgZG91YmxlCisJcXVvdGVzIFsiXSkuCisKKzIwMDYtMDctMDYgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3RscG9ydC9zdGwvX251bV9wdXQuYzogU21hbGwgcmVmYWN0b3Jpbmcgd2l0aCBpbnRyb2R1Y3Rpb24KKwlvZiB0aGUgX19kb19wdXRfaW50ZWdlciBmdW5jdGlvbiBmb3IgaW50ZWdlciB0eXBlcyBvdXRwdXQuIE1vcmVvdmVyCisJc3RhdGljIGJ1ZmZlciBzaXplIHVzZWQgZm9yIGZvcm1hdGluZyBpcyBub3cgYmFzZWQgb24gb3V0cHV0CisJdHlwZSBzaXplb2YuCisKKwkqIHN0bHBvcnQvc3RsL19vc3RyZWFtLmM6IEFkZCBzb21lIGFzc2VydGlvbiBiZWZvcmUgY2FzdCB0byBjaGVjayB0aGF0CisJbm8gc2lnbmlmaWNhbnQgZGlnaXQgaXMgbG9zdC4gQWRkIGNhc3QgdG8gbG9uZyBpbiBpbnQgYW5kIHNob3J0IG91dHB1dAorCWluIG9yZGVyIHRvIG1ha2UgdHlwZSBvZiBleHByZXNzaW9uIG1vcmUgZXhwbGljaXQgYW5kIGNvcnJlY3QuIFRoaXMKKwlmaXggdGhlIGJ1ZyByZXBvcnQgZnJvbSBHZW9mZnJleSBCYWNoZSBvbiBzb3VyY2Vmb3JnZSBhYm91dCBvdXRwdXQgb2YKKwktMSBvbnQgdmFsdWUgb24gNjRiaXRzIGxpbnV4LgorCisJKiB0ZXN0L3VuaXQvZmxvYXRpb190ZXN0LmNwcDogUmVtb3ZlZCwgYWxsIGNvZGUgbW92ZWQgdG8gTnVtUHV0R2V0VGVzdAorCXRlc3QgZml4dHVyZS4KKworCSogdGVzdC91bml0L251bV9wdXRfZ2V0X3Rlc3QuY3BwOiBOZXcsIGNvbnRhaW5zIGFsbCB0ZXN0cyByZWdhcmRpbmcKKwlpbnB1dC9vdXRwdXQgb2YgbnVtZXJpYyB2YWx1ZXMgKGxvY2FsZSBpbmRlcGVuZGFudCkuCisKKwkqIHRlc3QvdW5pdC9sb2NhbGVfdGVzdC5jcHA6IGxvY2FsZSBpbmRlcGVuZGFudCB0ZXN0cyBvZiBudW1lcmljIGlucHV0LworCW91dHB1dCBtb3ZlZCB0byBOdW1QdXRHZXRUZXN0IHRlc3QgZml4dHVyZS4KKworMjAwNi0wNy0wNCAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bC9fcm9wZS5oLCBfcm9wZS5jOiBQYXRjaCBmcm9tIFBldGVyIEhlcmNlayB0byBmaXggYQorCW1pc3NpbmcgbnVsbCB0ZXJtaW5hdGlvbiBpbiByb3BlIGNvbnN0cnVjdG9yIGZyb20gYSBjaGFyYWN0ZXIgCisJYW5kIGEgYnVmZmVyIG92ZXJydW4uCisKKwkqIHN0bHBvcnQvc3RsL19yb3BlLmg6IFJlbW92ZWQgc3BlY2lhbCBfU19yb3VuZGVkX3VwIGltcGxlbWVudGF0aW9uCisJZm9yIG90aGVyIHR5cGVzIHRoYW4gY2hhciBhbmQgd2NoYXJfdC4gcm9wZSBpbXBsZW1lbnRhdGlvbiBpcworCWV4cGVjdGluZyB0aGlzIG1ldGhvZCB0byBhbHdheXMgcmV0dXJuIGEgc2l6ZSA+IHRvIHRoZSBnaXZlbiBzaXplIGluCisJb3JkZXIgdG8gc3RvcmUgdGhlIHRlcm1pbmF0aW5nIG51bGwgY2hhcmFjdGVyLgorCisJKiBzdGxwb3J0L3N0bC9fcm9wZS5jOiBGaXggcmVmZXJlbmNlIGNvdW50ZXIgbWFuYWdlbWVudCB0byBhdm9pZCBtZW1vcnkKKwlsZWFrIGluIF9TX2Rlc3RyX2NvbmNhdF9jaGFyX2l0ZXIuCisKKzIwMDYtMDYtMzAgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3JjL251bV9wdXQuY3BwLCBudW1fcHV0X2Zsb2F0LmNwcDogUGF0Y2ggZnJvbSBHbGVuIFN1bW1lcnMKKwl0byBmaXggZmxvYXQgb3V0cHV0IHVzaW5nIGxvY2FsZSB3aXRoIGdyb3VwaW5nIGFuZCBmbG9hdCB2YWx1ZQorCWhhcyBubyBkZWNpbWFsLgorCisJKiB0ZXN0L3VuaXQvbG9jYWxlX3Rlc3QuY3BwOiBBZGQgc29tZSB0ZXN0cyBzaG93aW5nIGFib3ZlIGJ1Zy4KKworMjAwNi0wNi0yOSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bC9fYWxnby5oLCBfYWxnby5jLCBfYWxnb2Jhc2UuaCwgX2FsZ29iYXNlLmMsCisJX2hhc2h0YWJsZS5jOiBQYXRjaCBmcm9tIEFuZHJpeSBTeXJvdmVua28gdG8gZml4IGltcGxlbWVudGF0aW9uCisJb2YgX19lcXVhbF9yYW5nZSwgX19sb3dlcl9ib3VuZCwgX191cHBlcl9ib3VuZCB3aGVuIGRlYWxpbmcgd2l0aAorCWEga2V5IHdob20gdHlwZSBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgdmFsdWVfdHlwZSBvZiB0aGUgaXRlcmF0b3IuCisKKwkqIHRlc3QvdW5pdC9lcXVhbF90ZXN0LmNwcDogQWRkIHNvbWUgdGVzdHMgdG8gc2hvdyBhYm92ZSBidWcuCisKKzIwMDYtMDYtMjggIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3RscG9ydC9zdGwvX3N0cmluZ19zdW1fbWV0aG9kcy5oLCBkZWJ1Zy9fc3RyaW5nX3N1bV9tZXRob2RzLmg6CisJU21hbGwgcmVmYWN0b3JpbmcgYW5kIHNpbXBsaWZpY2F0aW9uIG9mIGNvZGUgdG8gYXZvaWQgYSBwYXJhbWV0ZXIKKwl3aXRoIGRlZmF1bHQgdmFsdWUuIFRoaXMgZml4aW5nIGFuIElDRSB1c2luZyBNU1ZDNi4KKworCSogdGVzdC91bml0L3N0cmluZ190ZXN0LmNwcDogSWdub3JlIHRoZSBuZXdseSBpbnRyb2R1Y2UgdGVfdG1wCisJdGVzdCB1c2luZyBNU1ZDNi4KKworMjAwNi0wNi0yNyAgUGV0ciBPdnRjaGVua292ICA8Y29tcGxlbWVudEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHN0bHBvcnQvc3RsL19saXN0Lmg6IGZpeCBidWcgaW4gbGlzdC5zd2FwLCB0aGFua3MgVmlrdG9yIEdvdmFrby4KKworCSogdGVzdC91bml0L2xpc3RfdGVzdC5jcHA6IHRlc3QgZm9yIGJ1ZyBhYm92ZS4KKworMjAwNi0wNi0yNyAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBidWlsZC9saWIvY29uZmlndXJlOiBBZGQgLS13aXRoLWxpYl9tb3RpZiBvcHRpb24gdG8gZ3JhbnQgU1RMcG9ydAorCXVzZXJzIHRoZSBwb3NzaWJpbGl0eSBvZiB0d2Vha2luZyB0aGUgZ2VuZXJhdGVkIGxpYnJhcmllcyBuYW1lLgorCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2UvdW5peC9saWIubWFrOiBBZGQgY29kZSB0byB0YWtlIGludG8gYWNjb3VudAorCWNvbmZpZ3VyZWQgbGliIG1vdGlmIGluIGdlbmVyYXRlZCBsaWJyYXJ5IG5hbWUuCisKKwkqIGJ1aWxkL01ha2VmaWxlcy9nbWFrZS9uZXR3YXJlL2xpYi5tYWs6IExvb2tzIGxpa2UgaXQgbmVlZHMgc2FtZQorCWRlZmluZXMgYXMgdGhlIG9uZXMgaW4gY3lnbWluZy9saWIubWFrIHNvIHdlIHNpbXBseSBpbmNsdWRlIHRoaXMKKwlmaWxlLgorCisJKiBzdGxwb3J0L3N0bC9jb25maWcvX2V2Yy5oOiBQYXRjaCBmcm9tIE1pY2hhZWwgRmluayB0byBmaXggYQorCWNvbXBpbGF0aW9uIGVycm9yLgorCisJKiB0ZXN0L3VuaXQvY3BwdW5pdC9jcHB1bml0X21pbmkuaDogUGF0Y2ggZnJvbSBNaWNoYWVsIEZpbmsgdG8KKwlhdm9pZCB1bnVzZWQgcGFyYW1ldGVyIHdhcm5pbmcuCisKKzIwMDYtMDYtMjMgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3RscG9ydC9zdGwvX3BhaXIuaCwgX2J2ZWN0b3IuaCwgY29uZmlnL19ldmMuaDogUGF0Y2ggZnJvbQorCVVscmljaCBFY2toYXJkdCB0byBleHRlbmQgYW4gZXZjNCBNSVBTIHdvcmthcm91bmQgZm9yIGVWQzgKKwlhbmQgdG8gZ2VuZXJhbGl6ZSBsaXR0bGUgZW5kaWFuIGNvbmZpZ3VyYXRpb24uCisKKwkqIERNQyBwYXRjaCBmcm9tIEVyaWMgU2FuZm9yZC4gRGVmaW5lIF9TVExQX05PX0ZVTlRJT05fVE1QTF9QQVJUSUFMX09SREVSCisJc28gdGhhdCBtYW55IGlnbm9yZWQgdW5pdCB0ZXN0IGNvdWxkIGJlIG5vdyBwYXNzZWQuIEFsc28gc3BlY2lmeQorCUludGVsIDM4NiBpbnN0cnVjdGlvbiBzZXQgZHVyaW5nIGNvbXBpbGF0aW9uIHRvIGxpbWl0IGxpbmsgZXJyb3JzLgorCisyMDA2LTA2LTIyICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL19hbGdvYmFzZS5jOiBSZW1vdmVkIGNoZWNrIG9mIGVxdWl2YWxlbnQgcHJlZGljYXRlCisJY29tbXV0YXRpdml0eSBpbiBmaW5kIGFsZ29yaXRobS4gSW4gdGhpcyBjYXNlLCBlcXVpdmFsZW5jZSByZWxhdGlvbgorCW1pZ2h0IGhhdmUgYmVlbiBpbXBsZW1lbnRlZCB1c2luZyBhIG1lbWJlciBvcGVyYXRvciA9PSB3aGljaCBpcworCW5vdCBjb21tdXRhdGl2ZSB0aGFua3MgR3Jpc2hhIFNwaXZhayByZXBvcnQuIE90aGVyIGNoZWNrcyB0aGF0IGFyZQorCXVzaW5nIGFuIGV4cGxpY2l0IHByZWRpY2F0ZSBwYXJhbWV0ZXIgaGFzIGJlZW4ga2VwdCBldmVuIGlmIGl0IGZvcmNlcworCVNUTHBvcnQgdXNlcnMgdG8gaW1wbGVtZW50IGNvbW11dGF0aXZlIGZ1bmN0b3IuCisKKwkqIHRlc3QvdW5pdC9maW5kX3Rlc3QuY3BwOiBBZGQgdGVzdCB0byBzaG93IGFib3ZlIGlzc3VlLgorCisJKiBzdGxwb3J0L3N0bC9faGFzaHRhYmxlLmM6IFJlbW92ZWQgZXF1aXZhbGVudCBwcmVkaWNhdGUgY2hlY2tzCisJdGhhdCBhcmUgdXNlbGVzcyBhcyBpbiBfU1RMUF9ERUJVRyBtb2RlIHRoZSBkZWJ1ZyB3cmFwcGluZyBhZGQgdGhpcworCWNoZWNrIGluIHRoZSBmdW5jdG9yIHVzZWQgdG8gaW5zdGFuY2lhdGUgdGhlIG5vbiBkZWJ1ZyBoYXNodGFibGUKKwlpbXBsZW1lbnRhdGlvbi4KKworMjAwNi0wNi0xOSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBTVExwb3J0IDUuMS4wIGNhbmRpZGF0ZSByZWxlYXNlZC4gU1RMUE9SVF81XzEgYnJhbmNoIGNyZWF0ZWQgaW4KKwlDVlMuIFZlcnNpb24gdGFnZ2VkIFNUTFBPUlRfNV8xX1JDMS4KKworMjAwNi0wNi0xNyAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiB0ZXN0L3VuaXQvdHlwZV90cmFpdHNfdGVzdC5jcHAsIHVuaW5pdGlhbGl6ZWRfdGVzdC5jcHA6IEFkZAorCWV4cGxpY2l0IHB1YmxpYyBpbmhlcml0YW5jZSByZWxhdGlvbiB0byBhdm9pZCBhbiBJQ0wgd2FybmluZy4KKworCSogc3RscG9ydC9zdGwvY29uZmlnL2ZlYXR1cmVzLmg6IEFkZCBkZWZpbml0aW9uIG9mCisJX1NUTFBfREVCVUdfTEVWRUwgdG8gX1NUTFBfU1RMUE9SVF9EQkdfTEVWRUwgd2hlbiBfU1RMUF9ERUJVRworCWlzIGRlZmluZWQgYnV0IF9TVExQX0RFQlVHX0xFVkVMIGhhc24ndCBiZWVuIHNldC4KKwkodGhhbmtzIGFuIElDTCB3YXJuaW5nIHJlcG9ydCkKKworCSogc3RscG9ydC9zdGwvY29uZmlnL19pbnRlbC5oOiBSZW1vdmUgdW5kZWYgb2YKKwlfU1RMUF9OT19VTkVYUEVDVEVEX0VYQ0VQVF9TVVBQT1JULCBldmVuIGlmIHRoZSBsaW5rZXIgY29tcGxhaW5zCisJYWJvdXQgbm90IGZpbmRpbmcgdW5leHBlY3RlZF9leGNlcHRpb24gaXQgbG9va3MgbGlrZSBpdCBmaW5hbGx5IGRvCisJbm90IHVzZSBpdC4KKworCSogdGVzdC91bml0L2NwcHVuaXQvdGVzdF9tYWluLmNwcDogRmlsdGVyIGRlZmluaXRpb24gb2YKKwl1bmV4cGVjdGVkX2V4Y2VwdGlvbiB3aGVuIGJ1aWxkaW5nIHVuaXQgdGVzdCB3aXRoIHN0YXRpYyBTVExwb3J0CisJbGliLgorCisyMDA2LTA2LTE1ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL2NvbmZpZy9mZWF0dXJlcy5oOiBTZXZlcmFsIG1hY3JvIHJlbmFtZWQ6CisJICAtIF9TVExQX0xPTkdfRE9VQkxFICAtPiBfU1RMUF9MT05HRVNUX0ZMT0FUX1RZUEUKKwkgIC0gX19ERkxfVE1QTF9QQVJBTSAtPiBfU1RMUF9ERkxfVE1QTF9QQVJBTQorCSAgLSBfX0RGTF9UWVBFX1BBUkFNIC0+IF9TVExQX0RGTF9UWVBFX1BBUkFNCisJICAtIF9fREZMX05PTl9UWVBFX1BBUkFNIC0+IF9TVExQX0RGTF9OT05fVFlQRV9QQVJBTQorCSAgX19ERkxfVFlQRV9BUkcgcmVtb3ZlZC4KKwkKKwkqIHN0bHBvcnQvc3RsOiBBZGQgY2hhcl90cmFpdHMgdGVtcGxhdGUgcGFyYW1ldGVyIGluIGFsbAorCWlzdHJlYW1idWZfaXRlcmF0b3IgYW5kIG9zdHJlYW1idWZfaXRlcmF0b3IgaW5zdGFuY2lhdGlvbiB3aGVyZSBpdAorCXdhcyBtaXNzaW5nIGFzIHNvbWUgY29tcGlsZXIgbWlnaHQgbm90IGhhdmUgc3VwcG9ydGVkIGl0LgorCisJKiBzdGxwb3J0L3N0bC9fdGltZV9mYWNldHMuaCwgc3JjL2xvY2FsZV9pbXBsLmNwcDogRmluYWx5IGFkb3B0IGEKKwlzcGVjaWZpYyBnY2Mgd29ya2Fyb3VuZCBmb3IgZGVmaW5pdGlvbiBvZiBfTG9jYWxlX3RpbWVfZXh0cmFjdF9oaW50CisJYXMgZnJpZW5kIG9mIHRpbWVfZ2V0X2J5bmFtZSBmYWNldC4gR2NjIDIuOTUgcHJlZmVycyB0byBzZWUgYSB0ZW1wbGF0ZQorCW1ldGhvZCBvdGhlcndpc2UgaXQgZW1pdHMgYSB3YXJuaW5nLCB3ZSB3YW50IHRvIGF2b2lkIFNUTHBvcnQgdXNlcnMKKwl0byBoYXZlIHRvIGRpc2FibGUgdGhpcyB3YXJuaW5nLiBPdGhlciBjb21waWxlcnMgd2lsbCB1c2UgYSBzaW1wbGUKKwlmdW5jdGlvbiB3aGljaCBzZWVtcyB0byBiZSBtb3JlIHBvcnRhYmxlLgorCisJKiBzdGxwb3J0L3N0bC9fdmVjdG9yLmgsIF9wYWlyLmg6IFBhdGNoIGZyb20gRXJpYyBTYW5mb3JkIGZvciBhCisJcmVhbGx5IHdlaXJkIEJvcmxhbmQgY29tcGlsZXIgd29ya2Fyb3VuZCB0aGF0IGNvbnNpc3RzIGluIGFkZGluZworCWEgX1JldCB0eXBlZGVmIGluIF9fbW92ZV90cmFpdHMgb3IgX190eXBlX3RyYWl0cyB0cmFpdHMgc3RydWN0CisJdGhhdCBkbyBub3Qgbm9ybWFsbHkgY29udGFpbiBpdC4KKworCSogc3RscG9ydC9zdGwvY29uZmlnL19iYy5oOiBCb3JsYW5kIGZyZWUgY29tcGlsZXIgZG8gbm90IHN1cHBvcnQKKwlTVExwb3J0IGNvbnRhaW5lciBleHRlbnNpb24gb2YgdGVtcGxhdGUgbWV0aG9kcy4KKworMjAwNi0wNi0xNCAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiB0ZXN0L3VuaXQ6IFBhdGNoIGZyb20gVWxyaWNoIEVja2hhcmR0IHRvIGZpeCBzdG9yYWdlIG9mIHN0cmluZworCWxpdGVyYWxzIHRvIGNvbnN0IGNoYXIqIHJhdGhlciB0aGFuIHNpbXBsZSBjaGFyKi4KKworCSogYnVpbGQvTWFrZWZpbGVzL25tYWtlOiBVbHJpY2ggRWNraGFyZHQgcGF0Y2g6CisJICAtIC9NQUNISU5FOklYODYgaXMgb2Jzb2xldGUgYW5kIG9ubHkgc3VwcG9ydGVkIGZvciBiYWNrd2FyZAorCSAgICBjb21wYXRpYmlsaXR5IGFzIGFsaWFzIGZvciBYODYuIFJlcGxhY2VkIGFsbCBjYXNlcyBvZiBJWDg2CisJICAgIHdpdGggWDg2LgorCSAgLSAvTk9ERUZBVUxUTElCOk9MRE5BTUVTLmxpYiBzZWVtcyB0byBhbHNvIGJlIHVuaXZlcnNhbCBzbyBJCisJICAgIG1vdmVkIGl0IHRvIHRoZSBiYXNlLCB0b28uCisJICAtIEluIG9yZGVyIHRvIHVzZSBtYWluKCkgYXMgZW50cnkgcG9pbnQgdW5kZXIgQ0UsIHVzZSBsaW5rZXIgCisJICAgIG9wdGlvbiAvRU5UUlk6bWFpbkFDUlRTdGFydHVwLiBUaGlzIHdhcyBhbHJlYWR5IGRvbmUgZm9yCisJICAgIGV2YzMsNCw4IGJ1dCBJIG1vdmVkIGl0IHRvIGFwcC9ldmMtY29tbW9uLm1hayBhbmQgZG9jdW1lbnRlZAorCSAgICBpdC4KKworCSogc3RscG9ydC9zdGwvX2NtYXRoLmgsIGNvbmZpZy9fZXZjLmg6IFVsaSBwYXRjaCB0byBhY3RpdmF0ZSBsb25nCisJZG91YmxlIHN1cHBvcnQgZm9yIEVWQyBhbmQgdXNlIF9oeXBvdCB0byBpbXBsZW1lbnQgU1RMcG9ydAorCW92ZXJsb2FkLgorCisJKiBzcmMvY29tcGxleC5jcHA6IFJlbW92ZSBpbnRlcm5hbCBfX3N0bHBfaHlwb3QgdGhhdCBpcyBub3QgbmVjZXNzYXJ5CisJYW55bW9yZSBub3cgdGhhdCBTVExwb3J0IGFsd2F5cyBkZWZpbmUgYSBoeXBvdCBmdW5jdGlvbiAodGhhbmtzIFVsaQorCXJlbWFyaykuCisKKwkqIHN0bHBvcnQvc3RsL2NvbmZpZzogVWxyaWNoIEVja2hhcmR0IFZDOC9DRSBwYXRjaDoKKwkgIC0gQWRhcHQgdGhlIGNvZGUgdG8gY29uc3RydWN0IHRoZSBwYXRocyB0byB0aGUgbmF0aXZlIGluY2x1ZGVzCisJICAgIHNvIHRoYXQgaXQgbWF0Y2hlcyB0aGUgY2hhbmdlZCBzdHJ1Y3R1cmUuIFRoaXMgaXMgY3VycmVudGx5CisJICAgIG9ubHkgZm9yIEFSTSBhbmQgbWlnaHQgbmVlZCBtb3JlIHdvcmsgZm9yIG90aGVyIHRhcmdldHMgKHg4NgorCSAgICB3b3JrcyB0aG91Z2gpLgorCSAgLSBNYWtlIGEgZGlzdGluY3Rpb24gYmV0d2VlbiB0aGUgZGVza3RvcCBhbmQgQ0UgdmFyaWFudHMgY29uY2VybmluZworCSAgICB0aGUgZXhjZXB0aW9uIHN1cHBvcnQgZnVuY3Rpb25zLiBUaGVzZSBub3cgdXNlIHRoZSBzYW1lIGNvbXBpbGVyCisJICAgIHZlcnNpb25zIHNvIHRoYXQgY2FuJ3QgYmUgdXNlZCBhbnltb3JlLgorCSAgLSBNUycgc2FmZSBzdHJpbmcgZnVuY3Rpb25zIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIENFIC0gSSB0aGluaywKKwkgICAgbmVlZCB0byB0YWtlIGEgY2xvc2VyIGxvb2sgYXQgUGxhdGZvcm0gQnVpbGRlci4KKworCSogc3RscG9ydC9zdGw6IFVscmljaCBFY2toYXJkdCB0byBhZGFwdCBTVExwb3J0IHRvIFZDOC9DRSBsaW1pdGVkCisJbmF0aXZlIEMgbGlicmFyeS4KKworMjAwNi0wNi0xMyAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bC9wb2ludGVycy9fdG9vbHMuaDogQWRkIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gZm9yCisJX0l0ZVdyYXBwZXIgaGVscGVyIHN0cnVjdCBzbyB0aGF0IHdoZW4gdHlwZSB0byBzdG9yZSBhbmQgc3RvcmVkCisJdHlwZSBhcmUgaWRlbnRpY2FsIGlucHV0IGl0ZXJhdG9ycyBhcmUgbm90IHdyYXBwZWQuIE90aGVyd2lzZSBpbnB1dAorCWl0ZXJhdG9ycyBhcmUgd3JhcHBlZCB0byBwZXJmb3JtIG5lY2Vzc2FyeSBjYXN0cyBiZXR3ZWVuIHBvaW50ZXIgdHlwZQorCWFuZCB2b2lkKi4KKworCSogc3RscG9ydC9zdGwvX2NtYXRoLmg6IEZpeGVkIG1hY3JvcyBkZWZpbml0aW9uIHVzZWQgdG8gZGVmaW5lIGFsbAorCW1hdGggZnVuY3Rpb25zIGZvciBjb21waWxlcnMgc3VwcG9ydGluZyBsb25nIGRvdWJsZSBidXQgbm90IGhhdmluZworCWZsb2F0IG5vciBsb25nIGRvdWJsZSBDIG1hdGggZnVuY3Rpb25zLiBUaGFua3MgVWxyaWNoIEVja2hhcmR0IHJlcG9ydC4KKwkKKzIwMDYtMDYtMTIgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogdGVzdC91bml0L3NldF90ZXN0LmNwcCwgbWFwX3Rlc3QuY3BwOiBSZXBsYWNlIHNpemVfdCB3aXRoIHRoZQorCW1vcmUgcG9ydGFibGUgaW50IHR5cGUgd2hlbiBwb3NzaWJsZS4KKworCSogc3RscG9ydC9zdGwvcG9pbnRlcnMvX3Rvb2xzLmg6IENoZWNrIHRoYXQgdHlwZSB0byBzdG9yZSBpcyBhCisJcG9pbnRlciB0eXBlIGJlZm9yZSBtb2RpZnlpbmcgcHJlZGljYXRlIHR5cGUgZm9yIHNldCBjb250YWluZXIuCisJV3JhcHBpbmcgbGVzcyBmdW5jdG9yIGluIGFsbCBjYXNlcyB3YXMgbWFraW5nIG1vdmUgc2VtYW50aWMgdGVzdHMKKwl0byBmYWlsIGFzIHByZWRpY2F0ZSBpcyBub3QgdGhlbiBkZXRlY3RlZCBhcyBiZWluZyB0aGUgU1RMcG9ydAorCWxlc3MgcHJlZGljYXRlLgorCisJKiBzdGxwb3J0L3N0bDogRE1DIHBhdGNoIGZyb20gRXJpYyBTYW5mb3JkLiBETUMgZG8gbm90IGxpa2UgX19zcworCXZhcmlhYmxlIHRoYXQgaXMgYSByZXNlcnZlZCBrZXl3b3JkLgorCisyMDA2LTA2LTExICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIGJ1aWxkL01ha2VmaWxlcy9ubWFrZTogUGF0Y2ggZnJvbSBVbHJpY2ggRWNraGFyZHQgdG8gdXNlCisJbWFpbiByYXRoZXIgdGhhbiBXaW5NYWluIGZvciBFVkMgcGxhdGZvcm0uCisKKwkqIGJ1aWxkL3Rlc3QvdW5pdC9nY2MubWFrOiBSZW1vdmVkIHJlZG9uZGFudCBtYWNybyBkZWZpbml0aW9uCisJX1NUTFBfVVNFX1NUQVRJQ19MSUIgdW5kZXIgY3lnd2luL21pbmd3IGFzIHRob3NlIGRlZmluaXRpb24KKwlhcmUgcGFydCBvZiBiYXNlIG1ha2UgZmlsZXMuCisKKwkqIHN0bHBvcnQvc3RsL3R5cGVfbWFuaXBzLmgsIF9oYXNodGFibGUuaDogRXJpYyBTYW5mb3JkIHdvcmthcm91bmQKKwlmb3IgQm9ybGFuZC4KKworMjAwNi0wNi0wOSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiB0ZXN0L3VuaXQvY3BwdW5pdDogUGF0Y2ggZnJvbSBVbHJpY2ggRWNraGFyZHQgdG8KKwkgIC0gUmVtb3ZlZCBhIGZldyBzdXBlcmZsdW91cyBzZW1pY29sb25zLgorCSAgLSBNYWRlIHNvbWUgY29uc3RydWN0b3JzIGV4cGxpY2l0LgorCSAgLSBEb2N1bWVudGVkIHRoZSBtZWFuaW5nIG9mIEZpbGVSZXBvcnRlcjo6X215U3RyZWFtLgorCSAgLSBSZWZvcm1hdHRlZCBzb21lIHRoaW5ncyB0byBub3QgZXhjZWVkIDEwMCBjaGFycyBwZXIKKwkgICAgbGluZSBvciB1c2Ugc2V2ZXJhbCBleHByZXNzaW9ucy9zdGF0ZW1lbnRzIGluIG9uZSBsaW5lLgorCisJKiBidWlsZC9NYWtlZmlsZXMvbm1ha2U6IFBhdGNoIGZyb20gVWxyaWNoIEVja2hhcmR0IHRvCisJICAtIGFkZHMgc3VwcG9ydCBmb3IgeDg2IChydW5uaW5nIG9uIGUuZy4gYSBQQywgc28tY2FsbGVkIENFUEMpLgorCSAgLSBhZGRzIHN1cHBvcnQgZm9yIE1JUFMgb3IgbW9yZSBzcGVjaWZpY2FsbHkgTUlQU0lJLCBvdGhlciBNSVBTCisJICAgIHN1YnR5cGVzIGNhbiBlYXNpbHkgYmUgYWRkZWQuCisJICAtIHJlbW92ZXMgYSBsaW5lICJERUZTX0NPTU1PTiA9IC9EJVRBUkdFVENQVSUiIGZyb20gdGhlIGNvbmZpZy5tYWsKKwkgICAgZmlsZSBnZW5lcmF0ZWQgZm9yIE1JUFMsIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgd2FzIG1vdmVkIHRvIHRoZQorCSAgICBDUFUtc3BlY2lmaWMgc2V0dXBzIHdoZXJlIGl0IGlzIGRvbmUgZm9yIG90aGVyIENQVXMuCisJICAtIGFkZHMgYW4gYWRkaXRpb25hbCBjb21waWxlciBmbGFnIHNvIHRoYXQgZGlhZ25vc3RpY3MgYmV0dGVyCisJICAgIG1hdGNoIHdoYXQgdGhlIFZDOCBJREUgZXhwZWN0cy4KKworCSogc3RscG9ydC9zdGw6IFBhdGNoIGZyb20gVWxyaWNoIEVja2hhcmR0IHRvCisJICAtIHJlbW92ZXMgc2V2ZXJhbCB1bm5lY2Vzc2FyeSBzZW1pY29sb25zICh0eXBpY2FsbHksIHdoZW4KKwkgICAgaW5saW5pbmcgZnVuY3Rpb25zIGxpa2UgInZvaWQgZm9vKCkge307IiB3aGVyZSBpdCBpbiBmYWN0IGRvZXNuJ3QKKwkgICAgaHVydCAoZHVlIHRvIHNvbWV0aGluZyBJIGNvbnNpZGVyIGFuIG92ZXJzaWdodCBpbiB0aGUgc3RhbmRhcmQpCisJICAgIGJ1dCBhbHNvIGRvZXNuJ3QgbWFrZSBzZW5zZS4KKwkgIC0gZml4ZXMgaW5jb25zaXN0ZW50IGluZGVudGF0aW9uIGluIHRocmVlIGNhc2VzLCBvbmUgd2l0aCB0aGUKKwkgICAgcHJlcHJvY2Vzc29yIGFuZCB0d28gd2l0aCBtZW1iZXJmdW5jdGlvbiBib2RpZXMuCisKKwkqIHN0bHBvcnQvc3RsL3BvaW50ZXJzL190b29scy5oOiBBZGQgbWlzc2luZyB0ZW1wbGF0ZSBtZXRob2QKKwlpbiBfQ2FzdFRyYWl0cyBoZWxwZXIgc3RydWN0IHVzZWQgb24gY29tcGlsZXIgd2l0aCBubyBwYXJ0aWFsCisJdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gc3VwcG9ydC4KKworMjAwNi0wNi0wOCAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bC9wb2ludGVycy9fdG9vbHMuaCwgX3NldC5oOiBGaXggcHJvYmxlbXMgcmVwb3J0ZWQgYnkKKwlnY2MgdGhhdCBzZWVtcyB0byBkbyBtb3JlIGNoZWNrIHRoYXQgTVNWQyBvbiBleHBsaWNpdAorCWluc3RhbmNpYXRpb24gb2YgdGVtcGxhdGVzLiBFc3BlY2lhbGx5IGZpeGVkIHByb2JsZW0gaW50cm9kdWNlCisJYnkgU1RMcG9ydCBleHRlbnNpb24gb2Ygc2V0IHRlbXBsYXRlIG1ldGhvZHMuCisKKwkqIGJ1aWxkL01ha2VmaWxlcy9nbWFrZS9hQ0MubWFrLCBsaWIvYUNDLm1hazogUGF0Y2ggZnJvbSBCb3JpcworCUd1YmVua28gZm9yIEhwIGFDQyBidWlsZC4KKworMjAwNi0wNi0wNyAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bC9wb2ludGVyczogUmVzdG9yZSBwb2ludGVyIHNwZWNpYWxpemF0aW9uIGZlYXR1cmUuCisJTWFqb3IgbW9kaWZpY2F0aW9ucyBhcmU6CisKKwktIHZlY3RvciBzcGVjaWFsaXphdGlvbiBpcyBkb25lIHVzaW5nIGEgcXVhbGlmaWVkIHZvaWQgcG9pbnRlcgorCWluIG9yZGVyIHRvIGtlZXAgb3B0aW1pemF0aW9uIG9wb3J0dW5pdGllcyB3aGVuIHdvcmtpbmcgb24KKwlwb2ludGVycy4gVXNpbmcgYSBzdHJpY3Qgdm9pZCogd2FzIGZvcmNpbmcgd3JhcHBpbmcgb2YgaXRlcmF0b3JzCisJaW4gdGVtcGxhdGUgbWV0aG9kIG1ha2luZyBfQm90aFB0clR5cGVzIHN0cnVjdCBoZWxwZXIgZmFpbGluZyB0bworCWRldGVjdCBib3RoIHBvaW50ZXIgdHlwZXMuCisKKwktIEZpeGVkIHNldCBzcGVjaWFsaXphdGlvbiB0aGFua3MgdG8gZXhwbGljaXQgaW5zdGFuY2lhdGlvbiBhZGRlZAorCWluIHB0cnNwZWNfdGVzdC5jcHAuCisKKwktIFJlZmFjdG9yaW5nIG9mIGFsZ29yaXRobSB0byBmaW5kIHN0b3JhZ2UgdHlwZSBmcm9tIHZhbHVlIHR5cGUuCisKKzIwMDYtMDYtMDIgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogYnVpbGQvTWFrZWZpbGVzL25tYWtlOiBQYXRjaCBmcm9tIFVscmljaCBFY2toYXJkdCBmb3IKKwljbGVhbnVwLiBTb21lIHNjcmlwdCByZWZhY3RvcmluZywgd3JvbmcgT1BUX1NUTERCR19TVEFUSUMgcmVmZXJlbmNlcworCXJlcGxhY2VkIGJ5IE9QVF9TVEFUSUNfU1RMREJHLgorCisJKiBzcmM6IFBhdGNoIGZyb20gVWxyaWNoIEVja2hhcmR0IHRvIGNsZWFudXAgbG9jYWxlIGltcGxlbWVudGF0aW9uCisJYW5kIGZpeCB0aW1lIGZhY2V0IGNyZWF0aW9uIHdoZW4gdXNpbmcgZHVtbXkgbG9jYWxlIGltcGxlbWVudGF0aW9uLgorCisJKiBzdGxwb3J0L3N0bC9jb25maWcvX2V2Yy5oOiBQYXRjaCBmcm9tIFVscmljaCBFY2toYXJkdCB0byBmaXgKKwllbmRpYW5lc3MgZGVmaW5pdGlvbi4KKworCSogc3RscG9ydC9zdGwvZGVidWcvX2hhc2h0YWJsZS5oOiBDcmVhdGUgYSBfRGJnRXF1YWwgZnVuY3RvciB0bworCWNoZWNrIGNvcnJlY3QgZXF1aXZhbGVudCBwcmVkaWNhdGUgaW1wbGVtZW50YXRpb24uIEFkZCBhbHNvCisJbWlzc2luZyBoYXNoX2Z1bmMgYW5kIGtleV9lcSBtZXRob2RzIGluIHRoaXMgbW9kZS4KKworCSogc3RscG9ydC9zdGwvZGVidWcvX3RyZWUuaDogU21hbGwgcmVmYWN0b3JpbmcgaW4gX0RiZ0NvbXBhcmUKKwlmdW5jdG9yLgorCisJKiBzdGxwb3J0L3N0bC90eXBlX3RyYWl0cy5oLCBib29zdF90eXBlX3RyYWl0cy5oOiBSZXN0b3JlIGJvb3N0CisJc3VwcG9ydC4KKworMjAwNi0wNi0wMSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bC9fdHJlZS5oLCBfc2V0LmgsIF9tYXAuaCwgZGVidWcvX3RyZWUuaDogUmVtb3ZlZAorCWVyYXNlIHRlbXBsYXRlIG1ldGhvZCBleHRlbnNpb24sIG1pZ2h0IGNvbmZsaWN0IHdpdGggZXJhc2UKKwlvdmVybG9hZCB0YWtpbmcgYW4gaXRlcmF0b3IuIFVzZXIgd29ya2Fyb3VuZCB3aWxsIGJlIHRvIHVzZQorCWVyYXNlKGZpbmQoa2V5KSkuCisKKwkqIHN0bHBvcnQvc3RsL19oYXNodGFibGUuaCwgX21hcC5oLCBfc2V0LmgsIF91bm9yZGVyZWRfc2V0LmgsCisJX3Vub3JkZXJlZF9tYXAuaCwgZGVidWcvX2hhc3RhYmxlLmg6IEFkZCB0ZW1wbGF0ZSBtZXRob2RzIGV4dGVuc2lvbi4KKworCSogc3RscG9ydC9zdGwvY29uZmlnL2ZlYXR1cmVzLmg6IEFkZCBtYW5hZ2VtZW50IG9mIGNvbnRhaW5lcnMgdGVtcGxhdGUKKwltZXRob2QgZXh0ZW5zaW9uLgorCisJKiBzdGxwb3J0L3N0bC9jb25maWcvX2FwcGxlLmgsIF9zeW1hbnRlYy5oOiBDb25maWcgdXBkYXRlIGJhc2VkIG9uCisJY29uZmlnIHRoYXQgdXNlZCB0byBiZSBpbiBfdHJlZS5oIGFuZCBfaGFzaHRhYmxlLmggdG8gcmVtb3ZlCisJY29udGFpbmVyIHRlbXBsYXRlIG1ldGhvZHMgZXh0ZW5zaW9ucy4KKworMjAwNi0wNS0zMSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bC9jb25maWcvX2V2Yy5oOiBQYXRjaCBmcm9tIE1pY2hhZWwgRmluayB0byBhZGQgcHRyZGlmZl90CisJZGVmaW5pdGlvbiBhbmQgZm9yYmlkIHVzZSBvZiBfU1RMUF9ERUJVRyBtb2RlIGZvciBldmMgMy80IG9uIEFSTS4KKworCSogYnVpbGQ6IFVscmljaCBFY2toYXJkdCBwYXRjaCBmb3IgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gMjAwNSBmb3IKKwlFbWJlZGRlZCBDKysgcG9ydGFnZS4KKworMjAwNi0wNS0zMCAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bC90eXBlX3RyYWl0cy5oOiBSZW5hbWUgX0lzX0ludGVnZXI8X1RwPjo6X0ludGVncmFsIGFuZAorCV9Jc19SYXRpb25hbDxfVHA+OjpfUmF0aW9uYWwgaW4gcmVzcGVjdGl2ZWx5IF9Jc0ludGVncmFsPF9UcD46Ol9SZXQKKwlhbmQgX0lzUmF0aW9uYWw8X1RwPjo6X1JldCBmb3IgbmFtaW5nIGNvbnZlbnRpb24gY29oZXJlbmN5LgorCisJKiBzdGxwb3J0L3N0bC90eXBlX3RyYWl0cy5oOiBBZGQgX1RyaXZpYWxOYXRpdmVUeXBlQ29weSBoZWxwZXIgdG8KKwloYW5kbGUgYSBudW1iZXIgb2Ygb3BvcnR1bml0aWVzIHRvIHVzZSBtZW1jcHkvbWVtbW92ZSBpbgorCXVuaW5pdGlhbGl6ZWRfKiBvciBjb3B5IGFsZ29yaXRobXMgdGhhdCB3YXMgbm90IGNvdmVyIGJ5IHNpbXBseQorCWNoZWNraW5nIHR5cGVfdHJhaXRzIGhhc190cml2aWFsKiBmZWF0dXJlcy4KKworCSogc3RscG9ydC9zdGwvdHlwZV90cmFpdHMuaCwgYm9vc3RfdHlwZV90cmFpdHMuaDogUmVmYWN0b3IgX0JvdGhQdHJUeXBlCisJaW1wbGVtZW50YXRpb24sIG9ubHkgb25lIHZlcnNpb24gaXMgbmVjZXNzYXJ5IGFzIGl0IHVzZXMgX0lzUHRyIHRoYXQKKwloYXMgYSB2YXJpYWJsZSBpbXBsZW1lbnRhdGlvbiBkZXBlbmRpbmcgb24gY29uZmlnLgorCisJKiBzdGxwb3J0L3N0bC9fdmVjdG9yLmg6IEFkZCBfRGVmYXVsdFplcm9WYWx1ZSBzcGVjaWFsaXphdGlvbiBmb3IKKwl2ZWN0b3IgY29udGFpbmVyIHNvIHRoYXQgYSB2ZWN0b3Igb2YgdmVjdG9yIGlzIHNpbXBseSBpbml0aWFsaXplZAorCXVzaW5nIGEgbWVtc2V0IHRvIHNldCBldmVyeXRoaW5nIHRvIDAuCisKKwkqIHRlc3QvdW5pdC92ZWN0b3JfdGVzdC5jcHA6IEFkZCBjaGVjayB0aGF0IHByZXZpb3VzIG9wdGltaXphdGlvbgorCXdvcmtzIGFzIGV4cGVjdGVkLgorCisJKiBzdGxwb3J0L3R5cGVpbmZvLmg6IEJvcmxhbmQgcGF0Y2ggZnJvbSBFcmljIFNhbmZvcmQuCisKKwkqIERNQyBwYXRjaCBmcm9tIEVyaWMgU2FuZm9yZAorCisJKiBzdGxwb3J0L3N0bC9kZWJ1Zy9fdHJlZS5oOiBQYXRjaCBmcm9tIFVscmljaCBFY2toYXJkdCB0byBhZGQgbWlzc2luZworCWNvdW50IHRlbXBsYXRlIG1ldGhvZC4KKworCSogc3JjL2RsbF9tYWluLmNwcDogUGF0Y2ggZnJvbSBVbHJpY2ggRWNraGFyZHQgdG8gZml4IHN0cm5jcHkKKwl1c2FnZS4KKworMjAwNi0wNS0yMyAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bC9fZGVxdWUuaCwgX2RlcXVlLmM6IENoYW5nZSBpbXBsZW1lbnRhdGlvbiB0byB1c2UKKwlfVHJpdmlhbEluaXQgbmV3IGZlYXR1cmUuCisKKwkqIHN0bHBvcnQvc3RsL2Jvb3N0X3R5cGVfdHJhaXRzLmg6IEFkZCBfVHJpdmlhbEluaXQgaW1wbGVtZW50YXRpb24KKwl1c2luZyBib29zdCB0eXBlIHRyYWl0cy4KKworMjAwNi0wNS0yMiAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bC90eXBlX3RyYWl0cy5oOiBBZGQgX1RyaXZpYWxJbml0IGhlbHBlciBzdHJ1Y3QgdG8KKwlyZXBvcnQgaWYgYSB0eXBlIGlzIHRyaXZpYWwgdG8gaW5pdGlhbGl6ZSBvciBub3QgdGhhdCBpcyB0byBzYXkKKwlpZiB0aGUgdHlwZSBoYXMgYSB0cml2aWFsIGRlZmF1bHQgY29uc3RydWN0b3IuIEhhbmRsZSBuYXRpdmUgdHlwZXMKKwlleGNlcHRpb24gdGhhdCBhcmUgY29uc2lkZXIgYXMgaGF2aW5nIGEgdHJpdmlhbCBkZWZhdWx0IGNvbnN0cnVjdG9yCisJYnV0IHRoYXQgcmVxdWlyZWQgYSAwIGluaXRpYWxpemF0aW9uIG9uIGV4cGxpY2l0IGNvbnN0cnVjdG9yCisJY2FsbC4KKworCSogc3RscG9ydC9zdGwvX3VuaW5pdGlhbGl6ZS5oOiBBZGQgYSBoZWxwZXIgZnVuY3Rpb24KKwlfX3VuaW5pdGlhbGl6ZV9pbml0IHRoYXQgcmVzdWx0IGluIGEgbm8tb3AgaWYgX1RyaXZpYWxJbml0IHJldHVybnMKKwlfX3RydWVfdHlwZS4KKworCSogc3RscG9ydC9zdGwvX3ZlY3Rvci5oOiBNb2RpZmljYXRpb24gb2YgdmVjdG9yIGNvbnN0cnVjdG9yIHRvCisJZGVzdGVjdCB3aGVuIGl0IGlzIGNhbGxlZCB3aXRob3V0IGFuIGV4cGxpY2l0IGRlZmF1bHQgdmFsdWUgc28KKwl0aGF0IHdlIGNhbiBjYWxsIF9fdW5pbml0aWFsaXplZF9pbml0LgorCisJKiB0ZXN0L3VuaXQvdW5pbml0aWFsaXplZF90ZXN0LmNwcDogQWRkIHRlc3QgdG8gY2hlY2sgY29ycmVjdAorCWRldGVjdGlvbiBvZiB1c2VsZXNzIGluaXRpYWxpemF0aW9uLgorCisyMDA2LTA1LTE5ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHRlc3QvdW5pdC91bmluaXRpYWxpemVkX3Rlc3QuY3BwOiBQYXRjaCBmcm9tIFVscmljaCBFY2toYXJkdAorCXRvIHJlcGxhY2UgdmVjdG9yIGluc3RhbmNlIGluIHVuaW5pdGlhbGl6ZWRfY29weV90ZXN0IGJ5IHN0YXRpYworCWFycmF5IHNvIHRoYXQgd2UgYXJlIGFsd2F5cyB3b3JraW5nIG9uIHBvaW50ZXJzIGl0ZXJhdG9yLgorCisJKiBzdGxwb3J0L3N0bC9fc3RyaW5nX29wZXJhdG9ycy5oOiBQYXRjaCBmcm9tIFVscmljaCBFY2toYXJkdCB0bworCWFkZCBtaXNzaW5nICE9IG9wZXJhdG9ycyB3aGVuIHVzaW5nIHN0cmluZyB0ZW1wbGF0ZSBleHByZXNzaW9uLgorCisJKiBzdGxwb3J0L3N0bC9jdHlwZS5oLCBjb25maWcvX2V2Yy5oLCBfbXN2Yy5oLCBfd2luZG93cy5oLAorCWZlYXR1cmVzLmg6IFBhdGNoIGZyb20gTWljaGFlbCBGaW5rIGZvciBldmMzLzQgcGxhdGZvcm0uCisKKwkqIHRlc3QvdW5pdC9tdmN0b3JfdGVzdC5jcHA6IEFkZCBvZiBhIHNwZWNpZmljIEJvcmxhbmQgdGVzdCBjYXNlCisJdG8gcmVwb3J0IHdoYXQgc2VlbXMgdG8gYmUgYSBjb21waWxlciBidWcgYnV0IHRoYXQgaXMgb25seQorCXJldmVhbGVkIHdoZW4gdXNpbmcgU1RMcG9ydC4KKworCSogc3RscG9ydC9zdGwvX3RyZWUuaCwgX3NldC5oLCBfbWFwLmgsIGRlYnVnL190cmVlLmgsCisJcG9pbnRlci9fc2V0Lmg6IEdlbmVyYWxpemVkIGFscmVhZHkgZXhpc3RpbmcgZXh0ZW5zaW9uIG9mIHRlbXBsYXRlCisJZmluZCBtZXRob2Qgb24gYXNzb2NpYXRpdmUgY29udGFpbmVycyB0byBhbGwgbG9vayB1cCBtZXRob2RzOgorCWNvdW50LCBlcmFzZSwgbG93ZXJfYm91bmQsIHVwcGVyX2JvdW5kLCBlcXVhbF9yYW5nZS4KKworCSogdGVzdC91bml0L3NldF90ZXN0LmNwcDogQWRkIHRlc3QgY2FzZSBmb3Igc2V0IHRlbXBsYXRlIG1ldGhvZHMKKwlleHRlbnNpb24uCisKKwkqIHN0bHBvcnQvc3RsL190cmVlLmMsIGRlYnVnL190cmVlLmg6IFJlbW92ZWQgZGVidWcgY2hlY2sgZnJvbQorCW5vbiBkZWJ1ZyBpbXBsZW1lbnRhdGlvbiwgbm93IGRlYnVnIGNoZWNrIGlzIGluamVjdGVkIGluIHRyZWUKKwlpbXBsZW1lbnRhdGlvbiBmcm9tIHRoZSB0cmVlIGRlYnVnIGltcGxlbWVudGF0aW9uIHRoYW5rcyB0bworCWEgd3JhcHBpbmcgb2YgdGhlIHByZWRpY2F0ZS4KKworMjAwNi0wNS0xOCAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bC9jX2xvY2FsZS5oOiBGaXggZGVjbGFyYXRpb24gb2YgX0xvY2FsZV9uYW1lX2hpbnQKKwlzdHJ1Y3Qgc28gdGhhdCBjb21waWxlcnMgZG8gbm90IHRoaW5rIHRoYXQgdGhpcyBzdHJ1Y3QgaXMgaW4KKwl0aGUgU1RMcG9ydCBuYW1lc3BhY2UgYmVjYXVzZSBvZiBmcmllbmQgZGVjbGFyYXRpb24uCisKKzIwMDYtMDUtMTcgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3RscG9ydC9zdGwvX2FiYnJldnMuaDogVXBkYXRlIGxpc3Qgb2YgYWJicmV2aWF0aW9ucy4KKworCSogc3RscG9ydC9zdGwvX2hhc2h0YWJsZS5jOiBSZW1vdmVkIF9Ob2RlIG1hY3JvIGFuZCBmaXhlZAorCW1hY3JvcyBkZWZpbmVkIHdoZW4gX1NUTFBfTkVTVEVEX1RZUEVfUEFSQU1fQlVHIGlzIGRlZmluZWQuCisKKzIwMDYtMDUtMTYgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogdGVzdC91bml0L3R5cGVfdHJhaXRzX3Rlc3QuY3BwOiBBZGQgdGVzdCBjYXNlIHRvIGNoZWNrCisJX1RyaXZpYWxVQ29weSBoZWxwZXIgbWV0YXByb2dyYW1taW5nIGNsYXNzIGJlaGF2aW9yLgorCisJKiBzdGxwb3J0L3N0bC9fdmVjdG9yLmgsIF92ZWN0b3IuYzogUmVwbGFjZWQgX1RyaXZpYWxBc3MgYnkKKwlfVHJpdmlhbENvcHkgYW5kIF9Ucml2aWFsVUNweSBieSBfVHJpdmlhbFVDb3B5IGZvciBjb2hlcmVuY3kKKwl3aXRoIHR5cGVfdHJhaXRzLmggbmFtZXMuCisKKwkqIHRlc3QvdW5pdC90eXBlX3RyYWl0c190ZXN0LmNwcDogQWRkIHNtYWxsIHRlc3QgZm9yIGNvcnJlY3QKKwlpbXBhY3Qgb2YgdHJpdmlhbF9kZXN0cnVjdG9yIG1ldGEgaW5mbyBpbiB2ZWN0b3IgaW1wbGVtZW50YXRpb24uCisKKwkqIGJ1aWxkL2xpYi9jb25maWd1cmUuYmF0OiBBZGQgY29tbWVudCB0byBleHBsYWluIHdlaXJkIFRBUkdFVENQVQorCWNoZWNrLgorCisyMDA2LTA1LTE1ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL19oYXNodGFibGUuaCwgX2xpc3QuaCwgX2RlcXVlLmgsIF9zbGlzdC5oLAorCV9zdHJpbmcuaCwgX3ZlY3Rvci5oLCBfbW92ZV9jb25zdHJ1Y3RfZndrLmgsIF9yb3BlLmg6CisJRml4IGltcGFjdCBvZiBfU1RMUF9OT19NT1ZFX1NFTUFOVElDIG1hY3JvIG9uIGxpYnJhcnkuIE5vdywKKwlpZiBkZWZpbmVkLCBubyBtb3ZlIHdpbGwgZXZlciBoYXBwZW4uCisKKwkqIHN0bHBvcnQvc3RsL191bmluaXRpYWxpemVkLmg6IFNpbXBsaWZpZWQgX191bmluaXRpYWxpemVkX2NvcHlfZmlsbAorCXByb3RvdHlwZSwgb25seSBvbmUgdHlwZSBvZiBpdGVyYXRvciBpcyBhbGxvd2VkLiBJdCBhbHNvIGZpeAorCWltcGxlbWVudGF0aW9uIGFzIHRoaXMgb25lIHdhcyBub3QgdGFraW5nIGludG8gYWNjb3VudCBib3RoCisJaXRlcmF0b3IgdmFsdWVfdHlwZSB0byBjb25zaWRlciBpZiB0aGUgb3BlcmF0aW9uIHdhcyB0cml2aWFsCisJb3Igbm90LgorCisJKiBzdGxwb3J0L3N0bC9fdW5pbml0aWFsaXplZC5oOiBNYWpvciBjb2RlIHJldmlldy4gUmVtb3ZlIHVzZSBvZgorCV9PS1RvTWVtY3B5LCByZW1vdmUgZGVwZW5kZW5jeSBvbiBzdGQ6OmNvcHkgb2Ygc3RkOjpmaWxsLCBhbGwKKwlpbXBsZW1lbnRhdGlvbiBpcyBub3cgc2ltaWxhciB0byB0aGUgb25lIG9mIHN0ZDo6Y29weSBhbGdvcml0aG1zCisJZXhjZXB0IHRoYXQgdW5pbml0aWFsaXplZCBhbGdvIGFyZSB1c2luZworCV9fdHlwZV90cmFpdHM6Omhhc190cml2aWFsX2NvcHlfY29uc3RydWN0b3IgbWV0YSBpbmZvcm1hdGlvbiBhbmQKKwljb3B5IF9fdHlwZV90cmFpdHM6Omhhc190cml2aWFsX2Fzc2lnbl9vcGVyYXRvci4KKworCSogdGVzdC91bml0L2RlcXVlX3Rlc3QuY3BwLCB2ZWN0b3JfdGVzdC5jcHA6IE5ldyB0ZXN0IGNhc2UgZm9yCisJb3ZlciBvcHRpbWl6YXRpb24gcHJvYmxlbS4KKworCSogdGVzdC91bml0L21hcF90ZXN0LmNwcCwgbG9jYWxlX3Rlc3QuY3BwLCBsaXN0X3Rlc3QuY3BwLCBzbGlzdF90ZXN0LmNwcCwKKwl1bm9yZGVyZWRfdGVzdC5jcHAsIGZzdHJlYW1fdGVzdC5jcHAsIHN0YWNrX2FsbG9jYXRvci5oOiBGaXhlZAorCWltcGxlbWVudGF0aW9uIHRvIGJ1aWxkIHdpdGggX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFUy4KKworCSogc3RscG9ydC9zdGwvZGVidWcvX3ZlY3Rvci5oLCBfbGlzdC5oOiBBZGQgbm9uIHRlbXBsYXRlIGFzc2lnbgorCW1ldGhvZHMgdXNlZCB3aGVuIF9TVExQX05PX01FTUJFUl9URU1QTEFURVMgaXMgZGVmaW5lZC4KKworCSogc3RscG9ydC9zdGwvX3NsaXN0LmM6IEZpeGVkIHNvcnQgX1NsaXN0X3NvcnQgaW1wbGVtZW50YXRpb24sIG5vdworCWNhbGwgX1NsaXN0X21lcmdlIHRlbXBsYXRlIGZ1bmN0aW9uIHJhdGhlciB0aGFuIHNsaXN0OjptZXJnZSBtZXRob2QKKwlhcyB0aGlzIG1ldGhvZCBkbyBub3QgdGFrZSBhbnkgcHJlZGljYXRlIHdoZW4gX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFUworCWlzIGRlZmluZWQuCisKKwkqIGJ1aWxkL3Rlc3QvdW5pdC9NYWtlZmlsZS5pbmMsIHRlc3QvdW5pdC91bmluaXRpYWxpemVkX3Rlc3QuY3BwOgorCU5ldyB0ZXN0IGZvciB1bmluaXRpYWxpemVkX2NvcHkgYWxnby4KKworCSogc3RscG9ydC9zdGwvdHlwZV90cmFpdHMuaDogT0tUb01lbUNweSByZW5hbWUgaW4gX1RyaXZpYWxDb3B5IGZvcgorCWNvaGVyZW5jeSB3aXRoIF9Ucml2aWFsVUNvcHkuIE1vcmVvdmVyLCB0aGFua3MgdG8gcmVmYWN0b3JpbmcgaW4KKwl1bmluaXRpYWxpemVkXyogYWxnb3JpdGhtcywgX1RyaXZpYWxVQ29weSBub3cgb25seSB0YWtlcyBpbnRvIGFjY291bnQKKwlfX3R5cGVfdHJhaXRzOjpoYXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yIG1ldGEgaW5mb3JtYXRpb24gYW5kCisJbm90IGhhc190cml2aWFsX2Fzc2lnbl9vcGVyYXRvci4KKworCSogc3RscG9ydC9zdGwvYm9vc3RfdHlwZV90cmFpdHMuaDogRml4ZWQgdG8gcmVmbGVjdCBTVExwb3J0CisJX190eXBlX3RyYWl0cyBtb2RpZmljYXRpb25zLgorCisJKiBzdGxwb3J0L3N0bC9fdW5pbml0aWFsaXplZC5oOiBNYWpvciBjb2RlIHJldmlldyBwcm9wb3NlZCBieQorCVVscmljaCBFY2toYXJkdAorCisJKiBzdGxwb3J0L3N0bC9fYWxnb2Jhc2UuaCwgX2RlcXVlLmgsIF9kZXF1ZS5jLCBfdmVjdG9yLmgsIF92ZWN0b3IuYywKKwlfcm9wZS5oLCBfcm9wZS5jLCBfc3RyaW5nLmgsIF9zdHJpbmcuYzogSW1wYWN0IG9mIHByZXZpb3VzIHBvaW50LgorCisyMDA2LTA1LTA1ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHRlc3QvdW5pdC9pdGVyX3Rlc3QuY3BwOiBSZW1vdmVkIHVucmVhY2hhYmxlIGNvZGUuCisKKwkqIEludHJvZHVjdGlvbiBvZiBhIG5ldyBjb25maWd1cmF0aW9uIG1hY3JvIF9TVExQX01TVkNfTElCCisKKwlUaGlzIG1hY3JvIGlzIHNldCB0byBfTVNDX1ZFUiB2YWx1ZSBidXQgY2FuIGJlIG92ZXJsb2FkZWQgdG8KKwlhbiBvdGhlciB2YWx1ZS4gRmlyc3QgaW50ZW5zaW9uIHdhcyB0byBtYWtlIFNUTHBvcnQgbW9yZSBmbGV4aWJsZQorCWZvciBJbnRlbCBDKysgY29tcGlsZXIuIFRoaXMgY29tcGlsZXIgY29tZXMgd2l0aG91dCBhbnkgbmF0aXZlCisJbGliIGFuZCB5b3UgaGF2ZSB0byBiaW5kIGl0IHRvIGEgTVNWQyBpbnN0YWxsLCBJbnRlbCBjb21waWxlcgorCWdlbmVyYXRlIE1TVkMgY29tcGF0aWJsZSBjb2RlIHNvIHRoYXQgTVNWQyBsaW5rZXIgY2FuIGNvcnJlY3RseQorCWdlbmVyYXRlIGZpbmFsIGV4ZSBvciBkbGwuIFRvIG1pbWljIE1TVkMgY29tcGlsZXIgSUNMIGFsc28gZGVmaW5lcworCV9NU0NfVkVSLiBUaGUgcHJvYmxlbSBpcyB0aGF0IGRlZmluaXRpb24gb2YgdGhpcyBtYWNybyBpcyBiYXNlZAorCW9uIGEgY29tcGlsZXIgb3B0aW9uIGFuZCBkbyBub3QgbmVjZXNzYXJpbHkgcmVmbGVjdCB0aGUgTVNWQyBsaWIKKwl2ZXJzaW9uIElDTCBpcyBiaW5kZWQgdG8uIEZvcnR1bmF0ZWx5IHRoZSBjb21waWxlciBvcHRpb25zCisJcmVzcG9uc2libGUgb2YgX01TQ19WRVIgZGVmaW5pdGlvbiAoL1F2YzYsIC9RdmM3Li4uKSBpcyBhbHNvCisJcmVzcG9uc2libGUgb2YgbmFtZSBtYW5nbGluZyBzbyBhc2tpbmcgZm9yIGEgTVNWQyBjb21waWxlcgorCWNvbXBhdGliaWxpdHkgZGlmZmVyZW50IHRoYW4gdGhlIGxpYnJhcnkgSUNMIGlzIGJpbmRlZCB0byBpcworCW5vdCBlYXN5LiBCdXQgX1NUTFBfTVNWQ19MSUIgaGFzIGJlZW4ga2VwdCBhcyBpdCBtYWtlcyBTVExwb3J0CisJY29uZmlndXJhdGlvbiBtb3JlIGNsZWFuLiBOb3cgTVNWQyBjb21waWxlciB2ZXJzaW9uIGlzIGdpdmVuCisJYnkgX1NUTFBfTVNWQyBtYWNybyBhbmQgbGlicmFyeSB2ZXJzaW9uIGJ5IF9TVExQX01TVkNfTElCLgorCUFsbCBvY2N1cmVuY2VzIG9mIF9NU0NfVkVSIGluIFNUTHBvcnQgY29kZSBoYXMgYmVlbiByZXBsYWNlZAorCWJ5IHRob3NlIG1hY3Jvcy4KKworCSogX1NUTFBfVVNFX1NFQ1VSSVpFRF9CVUZfRlVOQ1RJT05TIHJlcGxhY2VkIGJ5IHRoZSBtb3JlCisJaW50dWl0aXZlIF9TVExQX1VTRV9TQUZFX1NUUklOR19GVU5DVElPTlMuCisKKwkqIHN0bHBvcnQvc3RsL2NvbmZpZy9fbXN2Yy5oOiBNYWpvciByZWZhY3RvcmluZyB0byBpc29sYXRlCisJTVNWQyBjb21waWxlciBjb25maWcgYW5kIE1TVkMgbmF0aXZlIGxpYnJhcnkgY29uZmlnLgorCQorMjAwNi0wNS0wNCAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBidWlsZC9saWIvY29uZmlndXJlLmJhdDogQW5kIGluZm9ybWF0aW9uIHRvIHRoZSAtLWxpYi1tb3RpZgorCW9wdGlvbiBhcyBhZHZpc2VkIGJ5IFVscmljaCBFY2toYXJkdC4gQWRkIG9wdGlvbiBwYXJhbWV0ZXIgYW5kCisJcmVsYXRpb24gd2l0aCBfU1RMUF9MSUJfTkFNRV9NT1RJRi4KKworCSogc3JjL21lc3NzYWdlX2ZhY2V0cy5oOiBSZW1vdmVkIGltcGxlbWVudGF0aW9uIG9mIHByaXZhdGUgY29weQorCWNvbnN0cnVjdG9yIGFuZCBhc3NpZ25tZW50IG9wZXJhdG9yLgorCisJKiBzcmMvY19sb2NhbGVfd2luMzIvY19sb2NhbGVfd2luMzIuYzogTWFkZQorCV9Mb2NhbGVfZXh0cmFjdF9jYXRlZ29yeV9uYW1lIGxvY2FsZSBmdW5jdGlvbiBzdGF0aWMuCisKKwkqIHNyYy92Y193YXJuaW5nX2Rpc2FibGUuaCByZW5hbWVkIGluIHdhcm5pbmdfZGlzYWJsZS5oIGFzIGl0IGlzCisJdXNlZCBieSBvdGhlciBjb21waWxlcnMgdG9vIChJQ0wpCisKKwkqIGJ1aWxkL2xpYi9tc3ZjLm1haywgZXZjLm1hazogUmVtb3ZlZCBmb3JjZWQgaW5jbHVzaW9uIG9mCisJdmNfd2FybmluZ19kaXNhYmxlLmggZmlsZS4gTm93IHRoaXMgZmlsZSBpcyBpbmNsdWRlZCBmcm9tCisJc3RscG9ydF9wcmVmaXguaC4KKworCSogYnVpbGQvdGVzdC91bml0L21zdmMubWFrLCBldmMubWFrOiBSZXBsYWNlIHZjX3dhcm5pbmdfZGlzYWJsZS5oCisJcmVmZXJlbmNlIGJ5IHdhcm5pbmdfZGlzYWJsZS5oLgorCisJKiBzcmMvc3RscG9ydF9wcmVmaXguaDogQWRkIGluY2x1c2lvbiBvZiB3YXJuaW5nX2Rpc2FibGUuaC4KKworMjAwNi0wNS0wMSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiB0ZXN0L3VuaXQvdmVjdG9yX3Rlc3QuY3BwLCBkZXF1ZV90ZXN0LmNwcCwgc3RyaW5nX3Rlc3QuY3BwOgorCVJlbW92ZWQgdW5yZWFjaGFibGUgY29kZSwgcmVwb3J0ZWQgYnkgSUNMIDkuMC4KKworCSogdGVzdC91bml0L212Y3Rvcl90ZXN0LmNwcDogUmVtb3ZlZCB2YXJpYWJsZSBkZWNsYXJhdGlvbiBoaWRpbmcKKwlwcmV2aW91cyBvbmUgKyBtYWRlIGxvY2FsIGZ1bmN0aW9ucyBzdGF0aWMuCisKKwkqIHN0bHBvcnQvc3RsL2NvbmZpZy9fbXN2Yy5oOiBPbmx5IHVzZSBhYmJyZXZpYXRlIHN5bWJvbHMgZm9yCisJTVNWQyBjb21waWxlciBhbmQgbm90IGZvciBhbGwgY29tcGlsZXJzIGRlZmluaW5nIF9NU0NfVkVSLiBBbHNvCisJcmVtb3ZlZCBzb21lIElDTCBzcGVjaWZpYyBjb25maWd1cmF0aW9uLgorCisJKiBzcmMvbG9ja19mcmVlX3NsaXN0Lmg6IFJlbW92ZWQgJ25vIHJldHVybiBzdGF0ZW1lbnQnIHdhcm5pbmcKKwlmb3IgSUNMIHRvby4KKworCSogc3JjL21lc3NhZ2VfZmFjZXRzLmg6IE1hZGUgX01lc3NhZ2VfaW1wbCBjb3B5IGNvbnN0cnVjdG9yIGFuZAorCWFzc2lnbm1lbnQgb3BlcmF0b3IgcHJpdmF0ZSB0byBhdm9pZCB3YXJuaW5nIGFzIF9NX2NhdCBtZW1iZXIKKwlkYXRhIGhhcyBwcml2YXRlIGNvcHkgY29uc3RydWN0b3IgYW5kIGFzc2lnbm1lbnQgb3BlcmF0b3IgdG9vLgorCisJKiBzdGxwb3J0L3N0bC9fY3N0ZGxpYi5oOiBNYWRlIGFkZGl0aW9uYWwgZGVmaW5pdGlvbiBvZgorCWRpdihsb25nLCBsb25nKSBiYXNlZCBvbiBuYXRpdmUgbGlicmFyeSAoX01TQ19WRVIpIHJhdGhlciB0aGFuIG9uCisJY29tcGlsZXIgdXNlZCAoX1NUTFBfTVNWQykuCisKKwkqIHN0bHBvcnQvc3RsL2NvbmZpZy9faW50ZWwuaDogRml4IEludGVsIEMrKyA5LjAgY29tcGlsZXIKKwljb25maWd1cmF0aW9uIHdpdGggYW5kIHdpdGhvdXQgL1F2YzYgb3B0aW9uLgorCisJKiBzcmMvZGxsX21haW4uY3BwOiBBZGQgc3RkOjp1bmV4cGVjdGVkIGltcGxlbWVudGF0aW9uIHRoYXQgSUNMCisJbmVlZCBidXQgdGhhdCBpcyBub3QgcGFydCBvZiBNU1ZDNiBuYXRpdmUgbGliIGxpYnJhcnkuCisKKwkqIHRlc3QvdW5pdC90ZXN0X21haW4uY3BwOiBBZGQgc3RkOjp1bmV4cGVjdGVkIGltcGxlbWVudGF0aW9uIHRoYXQKKwlJQ0wgbmVlZCBidXQgdGhhdCBpcyBub3QgcGFydCBvZiBNU1ZDNiBuYXRpdmUgbGliIGxpYnJhcnkuCisKKzIwMDYtMDQtMzAgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3RscG9ydC9zdGwvX2FsbG9jLmg6IE1vdmVkIF9fdHlwZV90cmFpdHMgc3BlY2lhbGl6YXRpb24gZm9yCisJc3RkOjphbGxvY2F0b3IgY2xhc3MgYmVmb3JlIHVzZSBpbiBfU1RMUF9hbGxvY19wcm94eQorCWluc3RhbmNpYXRpb24uCisKKwkqIHRlc3QvdW5pdC9pc3RtaXRfdGVzdC5jcHA6IEZpeGVkIG1hY3JvIGNoZWNrcyB0byBjb3JyZWN0bHkKKwlyZXBvcnQgaWdub3JlZCB0ZXN0LgorCisyMDA2LTA0LTI3ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHRlc3QvdW5pdC9mdWxsX3N0cmVhbWJ1Zi5oLCBkZXF1ZV90ZXN0LmNwcCwgdmVjdG9yX3Rlc3QuY3BwOgorCUFkZCBTVExQT1JUIG1hY3JvIGNoZWNrIHdoZW4gY2hlY2tpbmcgX1NUTFBfVVNFX0VYQ0VQVElPTiBtYWNyby4KKworCSogdGVzdC91bml0L3N0cmluZ190ZXN0LmNwcDogRml4IHNvbWUgbWFjcm8gY2hlY2tzIHRvIGNvcnJlY3RseQorCXJlcG9ydCBpZ25vcmVkIHRlc3RzLgorCisJKiB0ZXN0L3VuaXQvbXZjdG9yX3Rlc3QuY3BwOiBGaXggdGVzdHMgdG8gYnVpbGQgaXQgd2l0aCBuYXRpdmUKKwlNU1ZDIDIwMDUgU3RhbmRhcmQgbGlicmFyeS4gTG9va3MgbGlrZSB0aGlzIGltcGxlbWVudGF0aW9uIGRvCisJbm90IGZvbGxvdyBhdG1vcnRpemVkIGNvbnN0YW50IHRpbWUgdmVjdG9yOjpwdXNoX2JhY2sgY29tcGxleGl0eS4KKworCSogc3RscG9ydC9zdGwvY29uZmlnL19tc3ZjLmg6IENsZWFybHkgcmVwb3J0IHN0YXR1cyByZWdhcmRpbmcgYnVpbGQKKwlvZiBTVExwb3J0IHVzaW5nIHRoZSBNU1ZDIC9jbHIgb3B0aW9uLgorCisJKiBzdGxwb3J0L3N0bC9fdGhyZWFkcy5oOiBSZW1vdmUgTVNWQyAuTmV0IDIwMDIgYW5ub3lpbmcgd2FybmluZy4KKworMjAwNi0wNC0yNiAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzcmMvY3R5cGUuY3BwOiBGaXggY3R5cGU6OnNjYW5faXMgYW5kIHNjYW5fbm90IG1ldGhvZCBiZWhhdmlvciBhcworCXJlcXVpcmVkIGJ5IEMrKyBTdGFuZGFyZCAyMi4yLjEuMS4yLgorCisJKiB0ZXN0L3VuaXQvbG9jYWxlX3Rlc3QuY3BwOiBGaXggY3R5cGUgZmFjZXQgdGVzdCBhY2NvcmRpbmcKKwltb2RpZmljYXRpb25zIGFib3ZlLgorCisyMDA2LTA0LTI1ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL19pc3RyZWFtLmM6IFNtYWxsIHJlZmFjdG9yaW5nIHRvIGF2b2lkIGEgdW5pbml0aWFsaXplZAorCXdhcm5pbmcgZm9yIF9fZG9faGFuZGxlX2V4Y2VwdGlvbnMgbG9jYWwgdmFyaWFibGUuCisKKwkqIHN0bHBvcnQvc3RsL19kZXF1ZS5oOiBEaXR0byB3aXRoIF9fY3VyX25vZGUgdmFyaWFibGUgaW4KKwlfTV9yYW5nZV9pbml0aWFsaXplIG1ldGhvZC4KKworCSogc3RscG9ydC9zdGwvX2RlcXVlLmM6IERpdHRvIHdpdGggX19jdXIgaW4gX01fZmlsbF9pbml0aWFsaXplLgorCisJKiBzdGxwb3J0L3N0bC9jb25maWcvX2F1dG9fbGluay5oOiBSZW1vdmVkIGF1dG8gbGluayBmZWF0dXJlIHdoZW4KKwlidWlsZGluZyBhIEMgdHJhbnNsYXRpb24gdW5pdCB0aGFua3MgTWljaGFlbCBGaW5rLgorCisJKiBzcmMvdGltZV9mYWNldHMuY3BwOiBBZGQgbWlzc2luZyBjYWxsaW5nIGNvbnZlbnRpb24gb24KKwlfX3dyaXRlX2Zvcm1hdHRlZF90aW1lIGludGVybmFsIGZ1bmN0aW9uLgorCisyMDA2LTA0LTI0ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHRlc3QvdW5pdC9jcHB1bml0L2NwcHVuaXRfbWluaS5oOiBMaW1pdCBzY29wZSBvZiB0cnkvY2F0Y2ggYmxvY2sgdG8KKwl0aGUgdGVzdCBjYXNlIGNhbGwgc28gdGhhdCBDcHBVbml0IGZ1bmN0aW9uIG1ldGhvZHMgYXJlIGNvcnJlY3RseQorCWNhbGxlZC4KKworCSogdGVzdC91bml0L3R5cGVfdHJhaXRzX3Rlc3QuY3BwOiBGaXggdXNlIG9mCisJQ1BQVU5JVF9JR05PUkUvQ1BQVU5JVF9TVE9QX0lHTk9SRSBtYWNyb3Mgc28gdGhhdCBpZ25vcmVkIHRlc3RzIGFyZQorCWNvcnJlY3RseSByZXBvcnRlZCBhcyBpZ25vcmVkLgorCisyMDA2LTA0LTIwICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL2NvbmZpZy9fc29sYXJpcy5oOiBSZXBsYWNlIEMrKyBzdHlsZSBjb21tZW50CisJaW4gQyBzdHlsZS4KKworCSogc3RscG9ydC9zdGwvX2NtYXRoLmg6IEFkZCBtYWNybyBkZWZpbml0aW9uIGZvciBlbnZpcm9ubWVudAorCWhhdmluZyBsb25nIGRvdWJsZSBidXQgbm8gZmxvYXQgbmVpdGhlciBsb25nIGRvdWJsZSBtYXRoIGZ1bmN0aW9ucworCVRoaXMgaXMgYSBTb2xhcmlzIGNvbmZpZ3VyYXRpb24uCisKKwkqIHNyYy9hY3F1aXJlX3JlbGVhc2UuaCwgY19sb2NhbGUuaCwgbG9jYWxlLmNwcCwKKwlsb2NhbGVfY2F0YWxvZy5jcHAsIGxvY2FsZV9pbXBsLmNwcCwgbG9jYWxlX2ltcGwuaCwKKwltZXNzYWdlX2ZhY2V0cy5oLCBmYWNldHNfYnluYW1lLmNwcDogQWRkIGEgbG9jYWxlIGhpbnQgZmVhdHVyZQorCXRvIGltcHJvdmUgbG9jYWxlIGNvbnN0cnVjdGlvbiBmcm9tIG5hbWUuIFRoaXMgaXMgdXNlZCBieQorCVdpbjMyIGxvY2FsZSBpbXBsZW1lbnRhdGlvbiB0aGF0IGJyb2FkY2FzdCB0aGUgbG9jYWxlIGxjaWQKKwl0aGFua3MgdG8gdGhpcyBoaW50LiBXaXRoIHRoaXMgbW9kaWZpY2F0aW9uLCBMb2NhbGVUZXN0IGZpeHR1cmUKKwlydW5zIDUgdGltZXMgZmFzdGVyLgorCisJKiBzdGxwb3J0L3N0bC9fY29sbGF0ZS5oLCBfY3R5cGUuaCwgX21vbmV0YXJ5LmgsIF9udW1wdW5jdC5oLAorCV90aW1lX2ZhY2V0cy5oOiBBZGQgX0xvY2FsZV9leHRyYWN0X2hpbnQgZnVuY3Rpb24gYXMgZnJpZW5kCisJdG8gc29tZSBsb2NhbGUgZmFjZXQgaW4gb3JkZXIgdG8gYWNjZXNzIGxvY2FsZSBpbXBsZW1lbnRhdGlvbgorCXNwZWNpZmljIHN0cnVjdHVyZSBhbmQgcG90ZW50aWFsbHkgZXh0cmFjdCB0aGUgaGludC4KKworCSogc3RscG9ydC9zdGwvX2NvZGVjdnQuaCwgX2NvbGxhdGUuaCwgX2N0eXBlLmgsIF9tZXNzYWdlc19mYWNldHMuaCwKKwlfbW9uZXRhcnkuaCwgX251bXB1bmN0LmgsIF90aW1lX2ZhY2V0cy5oOiBBZGQgX0xvY2FsZV9uYW1lX2hpbnQgcG9pbnRlcgorCXBhcmFtZXRlciB0byBmYWNldCBieSBuYW1lIGNvbnN0cnVjdG9yLgorCisJKiBidWlsZC9NYWtlZmlsZXMvbm1ha2UvbGliL2NsZWFuLm1haywgcnVsZXMtc28ubWFrLCBydWxlcy1pbnN0YWxsLXNvLm1hazoKKwlCYXNlZCBvbiBEciBEb2JiJ3MgUmljaGFyZCBHcmltZXMgYXJ0aWNsZSwgY2hhbmdlIG1hbmFnZW1lbnQgb2YKKwltYW5pZmVzdCBmaWxlIGZvciBTVExwb3J0IHNoYXJlZCBsaWJyYXJ5LiBBY2NvcmRpbmcgdGhpcyBhcnRpY2xlCisJLm1hbmlmZXN0IGZpbGUgaXMgbm90IHRha2VuIGludG8gYWNjb3VudCBmb3IgYSBsaWJyYXJ5LCBvbmx5IC5leGUgb25lIGlzLgorCVNvbHV0aW9uIGlzIHRvIGludGVncmF0ZSAubWFuaWZlc3QgZmlsZSBpbnRvIHRoZSAuZGxsIGFzIGFuIHVubWFuYWdlZAorCXJlc3NvdXJjZSB3aXRoIGlkIDIuIFdlIG5vdyBkbyBzbyB0aGFua3MgdG8gdGhlIG10IG1hbmlmZXN0IHRvb2wuCisKKwkqIHN0bHBvcnQvc3RsL19wYWlyLmg6IFJlbW92ZSBfX21vdmVfdHJhaXRzIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gZm9yCisJQm9ybGFuZCBmcmVlIGNvbXBpbGVyLCBpdCB3YXMgaW50cm9kdWNpbmcgd2VpcmQgY29tcGlsYXRpb24gZXJyb3IuCisKKwkqIHN0bHBvcnQvc3RsL19tb3ZlX2NvbnN0cnVjdF9md2suaDogQWRkIGEgaGVscGVyIHN0cnVjdCBmb3IgX19tb3ZlX3RyYWl0cworCWZlYXR1cmUuCisKKwkqIGJ1aWxkL3Rlc3QvdW5pdC9tc3ZjLm1hazogUHJlcGFyZSBtYWtlZmlsZSB0byBlYXNpbHkgYnVpbGQgdW5pdCB0ZXN0cworCXdpdGhvdXQgU1RMcG9ydC4KKworMjAwNi0wNC0xNSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bC9jb25maWcvaG9zdC5oLCBjb21wYXQuaCwgZGVidWcvX2RlYnVnLmM6IFJlbW92ZWQKKwlfU1RMUF9OT19ERUJVR19FWENFUFRJT05TIGNvbmZpZ3VyYXRpb24gbWFjcm8gdGhhdCBpcyBzaW1pbGFyCisJdG8gdGhlIG5ldyBfU1RMUF9ERUJVR19NT0RFX1RIUk9XUyBleGNlcHQgdGhhdCBuZXcgdGhyb3duIG1hY3JvCisJaXMgY2F0Y2hhYmxlIChzdGQ6OnJ1bnRpbWVfZXJyb3IgZXhjZXB0aW9uKSBhbmQgY29udGFpbmVkIG1lc3NhZ2UKKwlpcyBtb3JlIGV4cGxpY2l0LgorCisJKiBzdGxwb3J0L3N0bC9kZWJ1Zy9fdHJlZS5oOiBBZGQgZmluZCB0ZW1wbGF0ZSBtZXRob2QgU1RMcG9ydAorCWV4dGVuc2lvbiB0byB0aGUgZGVidWcgdmVyc2lvbiBvZiBiaW5hcnkgdHJlZSB0aGFua3MgTWlrZSBGbGFtbWluZy4KKworMjAwNi0wNC0xMSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzcmMvY29tcGxleF9pb193LmNwcDogUmVtb3ZlZCwgY29udGVudCBtb3ZlZCB0byBzcmMvY29tcGxleF9pby5jcHAKKwl0byBhdm9pZCBidWlsZCBvZiBhbiBlbXB0eSB0cmFuc2xhdGlvbiB1bml0IHRoYXQgY2FuIGdlbmVyYXRlIGxpbmtlcgorCXdhcm5pbmcgKG5vdGljZWQgd2l0aCBNU1ZDIDIwMDUgZXhwcmVzcykKKworCSogYnVpbGQvbGliL01ha2VmaWxlLmluYzogVXBkYXRlZCBiZWZvcmUgb2YgYWJvdmUgbW9kaWZpY2F0aW9uLgorCisJKiB0ZXN0L3VuaXQ6IElnbm9yZSBtYW55IHRlc3RzIHJhdGhlciB0aGFuIGhpZGUgaXQgZGVwZW5kaW5nIG9uCisJYnVpbGQgY29uZmlndXJhdGlvbi4KKworCSogdGVzdC91bml0L2NwcHVuaXQvZmlsZV9yZXBvcnRlci5oOiBSZXN0b3JlZCBvdXRwdXQgZXhpc3RpbmcgYmVmb3JlCisJaW50cm9kdWN0aW9uIG9mIG1vbml0b3JpbmcgZmVhdHVyZS4KKworMjAwNi0wNC0xMCAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiB0ZXN0L3VuaXQvY3BwdW5pdC9jcHB1bml0X3RpbWVyLmgsIHRlc3RfbWFpbi5jcHAsIGZpbGVfcmVwb3J0ZXIuaDoKKwlBZGQgLW0gb3B0aW9uIHRvIGFjdGl2YXRlIG1vbml0b3Jpbmcgb2YgdW5pdCB0ZXN0cy4gVGhpcyBvcHRpb24gYWRkCisJdGltaW5nIGZvciBlYWNoIHRlc3QgYW5kIGEgZ2xvYmFsIHRpbWluZyBpbmZvcm1hdGlvbi4gVGltZXIgY2xhc3MgaGFzCisJYmVlbiBjcmVhdGVkIGZvciBXaW4zMiBBUEkuCisKKwkqIHN0bHBvcnQvc3RsL19iaXRzZXQuaDogSGlkZSBTVExwb3J0IGJpdHNldCBleHRlbnNpb25zIF9GaW5kX2ZpcnN0CisJYW5kIF9GaW5kX25leHQuCisKKwkqIHRlc3QvdW5pdC9iaXRzZXRfdGVzdC5jcHA6IEFkYXB0IHRlc3RzIHRvIHByZXZpb3VzIG1vZGlmaWNhdGlvbi4KKworCSogc3RscG9ydC9zdGwvX3N0cmluZy5oOiBSZXBsYWNlIG1lbW9yeSBpbmNsdWRlIHdpdGggc3RsL19hbGxvYy5oCisJdG8gbGltaXQgaGVhZGVyIGRlcGVuZGVuY2llcy4gQWxzbyBhZGQgaW5jbHVkZSBvZiBzdGwvX3VuaW5pdGlhbGl6ZWQuaC4KKworCSogdGVzdC91bml0L2ZzdHJlYW1fdGVzdC5jcHA6IEFkZCBtaXNzaW5nIG1lbW9yeSBpbmNsdWRlLgorCisJKiB0ZXN0L3VuaXQvbG9jYWxlX3Rlc3QuY3BwOiBEaXR0by4KKworCSogc3RscG9ydC9zdGwvX3F1ZXVlLmgsIF9zdHJpbmcuaCwgX3JvcGUuaCwgZGVidWcvX3RyZWUuaDogUmVwbGFjZQorCXN0bC9fZnVuY3Rpb24uaCBpbmNsdWRlIHdpdGggdGhlIHNtYWxsZXIgX2Z1bmN0aW9uX2Jhc2UuaCBpbmNsdWRlLgorCQorMjAwNi0wNC0wNyAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bC9fbmV3Lmg6IEZpeGVkIG1hbmFnZW1lbnQgb2YgX1NUTFBfTk9fQkFEX0FMTE9DCisJYW5kIF9TVExQX05FV19ET05UX1RIUk9XX0JBRF9BTExPQyBtYWNyb3MuCisKKwkqIHN0bHBvcnQvc3RsL2NvbmZpZy9fZG0uaDogQ2hhbmdlIERNQyBjb25maWd1cmF0aW9uLCB1c2UgU1RMcG9ydAorCW93biBuYW1lc3BhY2UgcmF0aGVyIHRoYW4gc3RkIHNvIHRoYXQgU1RMcG9ydCBjYW4gY2hlY2sgY29uZmlnLgorCisJKiBzdGxwb3J0L3R5cGVpbmZvLmg6IEZpeCBETUMgY29uZmlndXJhdGlvbiBub3cgdGhhdCBpdCB1c2VzIG93bgorCVNUTHBvcnQgbmFtZXNwYWNlLgorCisyMDA2LTA0LTA1ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL190cmVlLmgsIF9saXN0Lmg6IEZpeGVkIHN3YXAgaW1wbGVtZW50YXRpb24gdG8KKwljb3JyZWN0bHkgc3dhcCBhbGxvY2F0b3JzIGluc3RhbmNlLiBNb3Jlb3ZlciBsaXN0IHN3YXAgaW1wbGVtZW50YXRpb24KKwl3YXMgd3Jvbmcgc2luY2UgbGlzdCBzcGxpY2UgaGFzIGJlZW4gbW9kaWZpZWQgdG8gY29ycmVjdGx5IGhhbmRsZWQKKwlhbGxvY2F0b3JzIHdpdGggc3RhdGUuCisKKwkqIHRlc3QvdW5pdC9zbGlzdF90ZXN0LmNwcCwgbGlzdF90ZXN0LmNwcCwgc2V0X3Rlc3QuY3BwOiBBZGQgdGVzdHMgZm9yCisJYWJvdmUgZml4LgorCisJKiBzdGxwb3J0L3N0bC9fZGVxdWUuaDogRml4IHN3YXAgbWV0aG9kIGFzIGRlcXVlIGhhcyAyIGFsbG9jYXRvcgorCWluc3RhbmNlcywgdGhpcyBzaG91bGQgcGVyaGFwcyBiZSBtb2RpZmllZCBvbmUgZGF5IHRvIG9ubHkga2VlcCAxLi4uCisKKwkqIHN0bHBvcnQvc3RsL19yb3BlLmg6IEZpeCBzd2FwIG1ldGhvZCBhbmQgcmVtb3ZlZCBhc3NlcnRpb24gZm9yCisJZXF1aXZhbGVudCBhbGxvY2F0b3IgaW5zdGFuY2VzIGV2ZW4gaWYgdGhlcmUgYXJlIHN0aWxsIG90aGVyIGFzc2VydGlvbnMKKwlpbiB0aGUgaW1wbGVtZW50YXRpb24uCisKKwkqIHN0bHBvcnQvc3RsL19mdW5jdGlvbl9iYXNlLmg6IEFkZCBzd2FwIG1ldGhvZCBmb3IgbGVzcyBmdW5jdG9yIGlmCisJcGFydGlhbCB0ZW1wbGF0ZSB3b3JrYXJvdW5kIGlzIGFjdGl2YXRlZC4gVGhpcyBpcyBmb3Igc3VycHJpc2luZworCWNvbXBpbGVycyBzdXBwb3J0aW5nIHBhcnRpYWwgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gYnV0IG5vIHRlbXBsYXRlCisJZnVuY3Rpb24gcGFydGlhbCBvcmRlcmluZy4KKworCSogc3RscG9ydC9zdGwvX2FsZ29iYXNlLmg6IEFkZCBCb3JsYW5kIHdvcmthcm91bmQgZm9yIHN3YXAgZnVuY3Rpb24KKwl0aGFua3MgRXJpYyBTYW5mb3JkLgorCisJKiB0ZXN0L3VuaXQvdHlwZV90cmFpdHNfdGVzdC5jcHA6IEJvcmxhbmQgd29ya2Fyb3VuZCBmb3IgaXNfY29udmVydGlibGUKKwlmdW5jdGlvbiB0aGFua3MgRXJpYyBTYW5mb3JkLgorCisJKiBzdGxwb3J0L3N0bC9jb25maWcvX2JjLmg6IEJvcmxhbmQgY29tcGlsZXJzIGRvIG5vdCBzdXBwb3J0IHRlbXBsYXRlCisJZnVuY3Rpb24gcGFydGlhbCBvcmRlcmluZyB0aGFua3MgRXJpYyBTYW5mb3JkLgorCisJKiB0ZXN0L3VuaXQvc3RhY2tfYWxsb2NhdG9yLmg6IEFkZCBCb3JsYW5kIHdvcmthcm91bmQgdG8gY29ycmVjdGx5CisJY2FsbCBTdGFja0FsbG9jYXRvcjo6c3dhcCBtZXRob2Qgd2hlbiBzd2FwaW5nIFNUTCBjb250YWluZXJzIGluCisJYWxsb2NhdG9yX3dpdGhfc3RhdGUgdGVzdHMuCisKKwkqIHRlc3QvdW5pdC9jb25maWdfdGVzdC5jcHA6IE5ldyB0ZXN0CisJQ29uZmlnVGVzdDo6dGVtcGxhdGVfZnVuY3Rpb25fcGFydGlhbF9vcmRlcmluZy4KKworCSogdGVzdC91bml0L3NsaXN0X3Rlc3QuY3BwLCBsaXN0X3Rlc3QuY3BwLCBzZXRfdGVzdC5jcHA6IEFkZCBzd2FwIHRlc3RzCisJd2l0aCBlbXB0eSBjb250YWluZXJzLgorCisJKiBzcmMvdmNfd2FybmluZ19kaXNhYmxlLmg6IFJlbW92ZSBkZXByZWNhdGVkIGNvbW1lbnRzLgorCisJKiBzdGxwb3J0L3N0bC9fcGFpci5oOiBSZW1vdmVkIEJvcmxhbmQgY2hlY2tzIHRoYW5rcyBFcmljIFNhbmZvcmQuCisKKwkqIFBhdGNoIGZyb20gTWljaGFlbCBGaW5rIHRvIHJlbW92ZSBXaW5kb3dzIENFIHN1cHBvcnQgdGhhdCBpcworCW5vIG1vcmUgc3VwcG9ydGVkIGJ5IE1pY3Jvc29mdC4KKworCSogc3RscG9ydC9zdGwvY29uZmlnL19uYXRpdmVfaGVhZGVycy5oOiBOZXcsIGNvbnRhaW5zIGFsbCBtYWNyb3MKKwlyZWxhdGl2ZSB0byBuYXRpdmUgaGVhZGVycyBhY2Nlc3MgdGhhdCB1c2VkIHRvIGJlIGluIGZlYXR1cmVzLmguCisKKwkqIHN0bHBvcnQvc3RsL2NvbmZpZy9fZXZjLmgsIF9jb21vLmg6IEFkZCBpbmNsdWRlIG9mIF9uYXRpdmVfaGVhZGVycy5oCisJYXMgdGhvc2UgY29tcGlsZXJzIG5lZWQgdG8gaW5jbHVkZSBuYXRpdmUgaGVhZGVycyBmb3IgY29ycmVjdAorCWNvbmZpZ3VyYXRpb24uCisKKwkqIHN0bHBvcnQvc3RsL2NvbmZpZy9mZWF0dXJlcy5oOiBVc2UgX25hdGl2ZV9oZWFkZXJzLmguCisKKwkqIHRlc3QvdW5pdC9sb2NhbGVfdGVzdC5jcHA6IE1hZGUgTG9jYWxlVGVzdDo6ZmFjZXRfaWQgdGVzdCBTVExwb3J0CisJc3BlY2lmaWMgcmF0aGVyIHRoYW4gQm9ybGFuZCBzcGVjaWZpYy4gTW9yZW92ZXIsIHdpdGhvdXQgU1RMcG9ydCwgdGVzdAorCWlzIGlnbm9yZWQgcmF0aGVyIHRoYW4gaGlkZGVuLgorCisJKiBzdGxwb3J0L3N0bC9fbnVtX3B1dC5oLCBfbnVtX3B1dC5jOiBSZW1vdmVkIHVzZWxlc3MgZXhwb3J0IG9mCisJbnVtX3B1dDxjaGFyLCBjaGFyKj4sIG51bV9wdXQ8d2NoYXJfdCwgd2NoYXJfdCo+IG5vdCByZXF1aXJlZCBieQorCXRoZSBTdGFuZGFyZC4KKworCSogc3RscG9ydC9zdGwvX251bV9nZXQuaCwgX251bV9nZXQuYzogRGl0dG8gZm9yCisJbnVtX2dldDxjaGFyLCBjb25zdCBjaGFyKj4sIG51bV9nZXQ8d2NoYXJfdCwgY29uc3Qgd2NoYXJfdCo+CisKKwkqIHN0bHBvcnQvc3RsL19tb25leXRhcnkuaCwgX21vbmV5dGFyeS5jOiBEaXR0byBmb3IKKwltb25leV9nZXQ8Y2hhciwgY29uc3QgY2hhcio+LCBtb25leV9nZXQ8d2NoYXJfdCwgY29uc3Qgd2NoYXJfdCo+LAorCW1vbmV5X3B1dDxjaGFyLCBjaGFyKj4sIG1vbmV5X3B1dDx3Y2hhcl90LCB3Y2hhcl90Kj4KKworCSogc3RscG9ydC9zdGwvX3RpbWVfZmFjZXRzLmgsIF90aW1lX2ZhY2V0cy5jOiBEaXR0byBmb3IKKwl0aW1lX2dldDxjaGFyLCBjb25zdCBjaGFyKj4sIHRpbWVfZ2V0PHdjaGFyX3QsIGNvbnN0IHdjaGFyX3QqPiwKKwl0aW1lX3B1dDxjaGFyLCBjaGFyKj4sIHRpbWVfcHV0PHdjaGFyX3QsIHdjaGFyX3QqPgorCisJKiBzcmMvbG9jYWxlX2ltcGwuY3BwOiBSZW1vdmVkIGlkIGluaXRpYWxpemF0aW9uIG9mIHVzZWxlc3MgZmFjZXRzCisJbm8gbW9yZSBleHBvcnRlZC4KKworCSogc3RscG9ydC9uZXcsIHN0bC9fbmV3Lmg6IE1vdmVkIGFsbCBTVExwb3J0IGNvZGUgaW4gX25ldy5oIGFuZAorCW1vZGlmaWVkIG5ldyBoZWFkZXIgc28gdGhhdCBpdCBmb3J3YXJkcyBpbmNsdWRlIHRvIG5hdGl2ZSBuZXcKKwl3aGVuIGluY2x1ZGUgY29tZXMgZnJvbSBpbnNpZGUgU1RMcG9ydC4KKworCSogY3BwdW5pdC9maWxlX3JlcG9ydGVyLmgsIGNwcHVuaXRfbWluaS5oOiBDaGFuZ2Ugc3VwcG9ydCBvZgorCUNQUFVOSVRfQ0hFQ0sgbWFjcm8sIG9ubHkgcmVwb3J0IGVycm9yIG9uY2UgZm9yIGFsbCBmYWlsdXJlcworCWluIGEgc2luZ2xlIHRlc3QgY2FzZS4KKworMjAwNi0wMy0yOCAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bC9fcHJvbG9nLmg6IEZpeCBtYWNybyBjaGVjayBiZWZvcmUgaW5jbHVzaW9uIG9mCisJZmVhdHVyZXMuaC4KKworCSogc3RscG9ydC9zdGwvY2hhcl90cmFpdHMuaDogRml4ZWQgaW5jbHVkZSBvZiBjc3RkZGVmLCBpbiBTVExwb3J0CisJY29kZSwgU3RhbmRhcmQgaGVhZGVycyBzaG91bGQgbmV2ZXIgYmUgaW5jbHVkZWQgZGlyZWN0bHksIHRoZWlyCisJc3RscG9ydC9zdGwvX3h4eC5oIGNvdW50ZXJwYXJ0IHNob3VsZCBiZSB1c2VkLgorCisJKiBzdGxwb3J0L3N0bC90eXBlX3RyYWl0cy5oLCB0eXBlX21hbmlwLmg6IFBhdGNoIGZyb20gRXJpYyBTYW5mb3JkCisJZm9yIEJvcmxhbmQgY29tcGlsZXIgdG8gZml4IF9PS1RvTWVtQ3B5IGZlYXR1cmUuCisKKwkqIHN0bHBvcnQvc3RsL19hbGxvYy5oOiBSZXBsYWNlIHN3YXAgZnVuY3Rpb24gZm9yIF9TVExQX2FsbG9jX3Byb3h5CisJYnkgYSBtZW1iZXIgbWV0aG9kLCBpdCBpcyBtb3JlIHBvcnRhYmxlLgorCisJKiBzdGxwb3J0L3N0bC9fYnZlY3Rvci5oLCBfZGVxdWUuaCwgX2xpc3QuaCwgX3NsaXN0LmgsIF9zdHJpbmdfYmFzZS5oCisJX3RyZWUuaDogUmVwbGFjZWQgY2FsbGVkIHRvIHN0ZDo6c3dhcCBmb3IgX1NUTFBfYWxsb2NfcHJveHkgaW5zdGFuY2VzCisJYnkgY2FsbHMgdG8gbWVtYmVyIHN3YXAgbWV0aG9kLgorCisJKiB0ZXN0L3VuaXQvaGFzaF90ZXN0LmNwcDogSWdub3JlIHRlc3QgcmF0aGVyIHRoYW4gaGlkZSBpdC4KKworCSogdGVzdC91bml0L21hcF90ZXN0LmNwcDogRml4ZWQgU3RhY2tBbGxvY2F0b3IgaW5zdGFuY2lhdGlvbi4KKworCSogdGVzdC91bml0L3N0YWNrX2FsbG9jYXRvci5oOiBBZGQgc3RkOjpzd2FwIG92ZXJsb2FkIGZvcgorCVN0YWNrQWxsb2NhdG9yPHBhaXI8Y29uc3QgaW50LCBpbnQ+Pi4KKworCSogdGVzdC91bml0L3N0cmluZ190ZXN0LmNwcDogSWdub3JlIHRlc3RzIHJhdGhlciB0aGFuIGhpZGUgaXQuCisKKwkqIHRlc3QvdW5pdC91bm9yZGVyZWRfdGVzdC5jcHA6IERpdHRvLgorCisyMDA2LTAzLTI3ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL19zdGRleGNlcHRfYmFzZS5oOiBOZXcgaW50ZXJuYWwgaGVhZGVyIHdpdGgKKwlfX05hbWVkX2V4Y2VwdGlvbiBpbXBsZW1lbnRhdGlvbiwgaW1wcm92ZSBzZWdyZWdhdGlvbiBiZXR3ZWVuCisJPGxvY2FsZT4gYW5kIDxzdGRleGNlcHQ+IFN0YW5kYXJkIGhlYWRlcnMuCisKKwkqIHRlc3QvdW5pdC9sb2NhbGVfdGVzdC5jcHA6IEFkZCBtaXNzaW5nIDxzdGRleGNlcHQ+IGhlYWRlciBpbmNsdWRlLgorCisJKiBzdGxwb3J0L3N0bC9fZnVuY3Rpb25fYmFzZS5oLCBfZnVuY3Rpb24uaDogTW92ZSBhcyBtYW55IGZ1bmN0b3IgYXMKKwlwb3NzaWJsZSBmcm9tIF9mdW5jdGlvbl9iYXNlLmggdG8gX2Z1bmN0aW9uLmggdG8gaW1wcm92ZQorCXNlZ3JlZ2F0aW9uIGJldHdlZW4gPGZ1bmN0aW9uYWw+IGFuZCA8YWxnb3JpdGhtPiBTdGFuZGFyZCBoZWFkZXJzLgorCisJKiB0ZXN0L3VuaXQ6IEFkZCBtYW55IG1pc3NpbmcgcmVmZXJlbmNlcyB0byA8ZnVuY3Rpb25hbD4gaGVhZGVyLgorCisJKiB0ZXN0L3VuaXQ6IE1hZGUgdW5pdCB0ZXN0cyBhdmFpbGFibGUgZm9yIGJ1aWxkIHdpdGhvdXQgU1RMcG9ydCwgdGhpcworCXdpbGwgYmUgYSBnb29kIHdheSB0byBjb21wYXJlIFN0YW5kYXJkIGxpYnJhcnkgaW1wbGVtZW50YXRpb25zLgorCisJKiBzdGxwb3J0L3N0bC9fc3RyaW5nX2Jhc2UuaDogUmVtb3ZlIGFkZGl0aW9uYWwgc3BhY2UgZm9yIHRlcm1pbmF0aW5nCisJbnVsbCBjaGFyYWN0ZXIsIGl0IHdhcyBhY3R1YWxseSBhbHJlYWR5IHJlc2VydmVkIGluIHRoZSByZXR1cm4KKwlleHByZXNzaW9uLgorCisJKiBzdGxwb3J0L3N0bC9fc3RyaW5nLmg6IFJlc3RvcmVkIGJhc2ljX3N0cmluZyBjYXBhY2l0eSBpbXBsZW1lbnRhdGlvbgorCXRoYXQgZG8gbm90IGRlcGVuZCBvbiB1c2Ugb2YgdGhlIHNob3J0IHN0cmluZyBvcHRpbWl6YXRpb24gb3Igbm90LiBJdAorCW1pZ2h0IGJlIGhpZGluZyBhIHJlYWwgaXNzdWUgc29tZXdoZXJlIGVsc2UgaW4gY29kZSBldmVuIGlmIHVuaXQgdGVzdHMKKwlhcmUgbm90IHNob3dpbmcgYW55IHByb2JsZW0uCisKKwkqIHN0bHBvcnQvc3RsL19hbGxvYy5oOiBBZGQgc3dhcCBvdmVybG9hZCBmb3IgX1NUTFBfYWxsb2NfcHJveHkgY2xhc3MKKwlpbiBvcmRlciB0byBjb3JyZWN0bHkgY2FsbCBzd2FwIG9uIHRoZSBtYXliZSByZWJvdW5kIGFsbG9jYXRvciBhcyB1c2VyCisJdGhhdCBpbXBsZW1lbnQgYW4gYWxsb2NhdG9yIHdpdGggYSBzdGF0ZSBtaWdodCBoYXZlIGltcGxlbWVudCBhCisJc3BlY2lhbCBzd2FwIGZ1bmN0aW9uIGZvciBpdCB0byBjb3JyZWN0bHkgaGFuZGxlIFNUTCBjb250YWluZXJzIHN3YXAKKwlvcGVyYXRpb24uCisKKzIwMDYtMDMtMjQgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogYnVpbGQvbGliL2NvbmZpZ3VyZS5iYXQ6IFJlbW92ZWQgc2NyaXB0IGZvciBkZWZpbmluZyBJTkNMVURFCisJZW52aXJvbm1lbnQgdmFyaWFibGUgZm9yIEJvcmxhbmQgcmVzc291cmNlIGNvbXBpbGVyIGFzIGl0IGRlcGVuZHMKKwlvbiB3aGVyZSBTVExwb3J0IGlzIGluc3RhbGwuCisKKwkqIGJ1aWxkL2xpYi9iY2MubWFrOiBBZGQgY2hlY2sgZm9yIElOQ0xVREUgZW52aXJvbm1lbnQgdmFyaWFibGUKKwlkZWZpbml0aW9uLgorCisJKiB0ZXN0L3VuaXQvc3RyaW5nX3Rlc3QuY3BwOiBDaGFuZ2UgYmFzaWNfc3RyaW5nOjpyZXNlcnZlIHRlc3QgdG8KKwljaGVjayBsZW5ndGhfZXJyb3IgZXhjZXB0aW9uIHJhdGhlciB0aGFuIGJhZF9hbGxvYy4KKworMjAwNi0wMy0yMiAgUGV0ciBPdnRjaGVua292ICA8Y29tcGxlbWVudEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHN0bHBvcnQvc3RsL19zdHJpbmcuYzogYSBiaXQgY29kZSBjbGVhbgorCisJKiBzdGxwb3J0L3N0bC9fc3RyaW5nX2Jhc2UuaDogbWF4X3NpemUgc2hvdWxkIGtlZXAgc3BhY2UgZm9yCisJYWxsb2NhdGlvbiBvZiB0ZXJtaW5hdGluZyBudWxsLgorCisyMDA2LTAzLTE5ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL19hbGxvYy5oLCBfZnVuY3Rpb25fYmFzZS5oLCB0eXBlX21hbmlwcy5oLAorCXR5cGVfdHJhaXRzLmgsIHRlc3QvdW5pdC90eXBlX3RyYWl0c190ZXN0LmNwcDogUGF0Y2ggZm9yCisJRXJpYyBTYW5mb3JkIGZvciBfX2Jvb2wydHlwZSBCb3JsYW5kIHVzZS4KKworCSogYnVpbGQvTWFrZWZpbGVzL2dtYWtlL2xpYi9jbGVhbi5tYWs6IFBhdGNoIGZyb20gRXJpYyBTYW5mb3JkCisJdG8gZml4IGZpbGVzIGdlbmVyYXRlZCBieSBkYmctc2hhcmVkIGFuZCBzdGxkYmctc2hhcmVkIHJ1bGVzLgorCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2UvbGliL2JjYy5tYWs6IFBhdGNoIGZyb20gRXJpYyBTYW5mb3JkIHRvCisJaW5jcmVhc2UgQm9ybGFuZCBwYWdlIHNpemUgdG8gNjQuCisKKzIwMDYtMDMtMTYgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3RscG9ydC9zdGwvY29uZmlnL19ldmMuaCwgX21zdmMuaDogQWRkIHNvbWUgY29uZGl0aW9uIGZvcgorCWRlZmluaXRpb24gb2YgX1NUTFBfTVNWQyBtYWNybyB3aGljaCBzaG91bGQgb25seSBiZSBkZWZpbmVkIGZvcgorCXJlYWwgTWljcm9zb2Z0IGNvbXBpbGVycyBhbmQgbm90IGZvciBjb21waWxlciBlbXVsYXRpbmcgaXQuCisKKwkqIHNyYy9hbGxvY2F0b3JzLmNwcDogVXNlIF9TVExQX1NUQVRJQ19NVVRFWCBtYWNybyBpbiBwbGFjZQorCW9mIF9TVExQX211dGV4X2Jhc2UgZm9yIG11dGV4IGRlZmluaXRpb24gaW4gcGVyX3RocmVhZF9hbGxvY2F0b3IKKwlpbXBsZW1lbnRhdGlvbi4KKworCSogc3RscG9ydC9zdGwvX3B0aHJlYWRfYWxsb2MuaDogTW9kaWZpZWQgZGVhbGxvY2F0ZSBtZXRob2RzIG9mCisJcHRocmVhZF9hbGxvY2F0b3IgYW5kIHBlcl90aHJlYWRfYWxsb2NhdG9yIGltcGxlbWVudGF0aW9uIHRvIGFjY2VwdAorCW51bGwgcG9pbnRlcnMuCisKKzIwMDYtMDMtMTUgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3RscG9ydC9zdGwvX3N0cmluZ19iYXNlLmgsIF9zdHJpbmcuYzogRm9yY2UgY2FsbCB0bworCV9NX2FsbG9jYXRlX2Jsb2NrIGV2ZW4gaW4gc2hvcnQgc3RyaW5nIG9wdGltIG1vZGUgaW4gb3JkZXIKKwl0byBkZXRlY3QgbGVuZ2h0IGVycm9yLiBCYXNlZCBiYXNpY19zdHJpbmcgbWF4IHNpemUgaW1wbGVtZW50YXRpb24KKwlvbiBhbGxvY2F0b3IgbWF4X3NpemUuCisKKzIwMDYtMDMtMTUgIFBldHIgT3Z0Y2hlbmtvdiAgPGNvbXBsZW1lbnRAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzdGxwb3J0L3N0bC9jb25maWcvX3N5c3RlbS5oLCBfbXN2Yy5oLCBfZXZjLmg6IG1vdmUgX1NUTFBfTVNWQworCWRlZmluaXRpb24gaW4gcHJvcGVyIHBsYWNlLgorCQorMjAwNi0wMy0xNCAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzcmMvYWxsb2NhdG9ycy5jcHA6IEZpeGVkIHRocmVhZCBzYWZldHkgaXNzdWUgaW4KKwlwZXJfdGhyZWFkX2FsbG9jYXRvciBpbXBsZW1lbnRhdGlvbiB0aGFua3MgYSB2ZXJ5IG9sZCBXaWxsaWFtCisJUG93ZXIgcmVwb3J0LgorCisJKiB0ZXN0L3VuaXQvYWxsb2NhdG9yX3Rlc3QuY3BwOiBBdHRlbXB0IHRvIHdyaXRlIGEgdGVzdCBjYXNlIGZvcgorCXByZXZpb3VzIGJ1ZyBidXQgbm90IHlldCBjb21wbGV0ZSBhcyBJIG5lZWQgYSBiZXR0ZXIgZGVidWdnaW5nCisJZW52aXJvbm1lbnQgdGhhbiBnZGIgdW5kZXIgY3lnd2luLi4uCisKKwkqIHN0bHBvcnQvc3RsL2NvbmZpZy9fc3lzdGVtLmg6IFBhdGNoIGZyb20gTWljaGFlbCBGaW5rIHRvIGFkZAorCW1pc3NpbmcgX1NUTFBfTVNWQyBkZWZpbmUgZm9yIGV2YysrIGNvbXBpbGVycy4KKworMjAwNi0wMy0xMyAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bC9fYWxsb2MuaCwgc3JjL2FsbG9jYXRvcnMuY3BwOiBIaWRlIGRlY2xhcmF0aW9uIG9mCisJbWFsbG9jIGJhc2VkIGFsbG9jYXRvciBoYW5kbGVyIGluIGxpYnJhcnkuIEFsc28gbGltaXQgc2NvcGUgb2YKKwlkZWNsc3BlYyB0byBleHBvc2Ugc3RhdGljIG1lbWJlcnMgcmF0aGVyIHRoYW4gdGhlIHdob2xlIGNsYXNzLgorCisJKiBzdGxwb3J0L3N0bC9fY3N0ZGxpYi5oOiBGb3IgQm9ybGFuZCBjb21waWxlciBhZGQgaW5jbHVkZSBvZgorCW5hdGl2ZSBwcm9jZXNzLmggaGVhZGVyLCBmb3IgcmVhc29uIHNlZSBjb21tZW50IG5leHQgdG8gaW5jbHVkZQorCWluIGZpbGUuCisKKwkqIHN0bHBvcnQvc3RsL19hbGxvYy5oOiBBZGQgYSBuZXcgU1RMcG9ydCBleHRlbnNpb24gdG8gdGhlCisJc3RkOjphbGxvY2F0b3IgY2xhc3M6IGFsbG9jYXRlKHNpemVfdHlwZSwgc2l6ZV90eXBlJikuIFRoaXMgbmV3CisJb3ZlcmxvYWQgb2YgYWxsb2NhdGUgcmV0dXJucyBpbiBhbiBvdXRwdXQgcGFyYW1ldGVyLCB0aGUgcmVhbAorCXNpemUgb2YgdGhlIGFsbG9jYXRlZCBidWZmZXIgdGhhdCBjYW4gYmUgbGFyZ2VyIHRoYW4gdGhlIHJlcXVlc3RlZAorCW9uZS4gX1NUTFBfYWxsb2NfcHJveHkgZXhwb3NlIHRoaXMgbmV3IG92ZXJsb2FkIG9ubHkgZm9yIHRoZQorCVNUTHBvcnQgYWxsb2NhdG9yIGFuZCBub3QgZm9yIHVzZXIgZGVmaW5lZCBhbGxvY2F0b3JzLgorCisJKiBzdGxwb3J0L3N0bC9fdmVjdG9yLmgsIF92ZWN0b3IuYywgX3N0cmluZy5oLCBfc3RyaW5nLmM6IFVzZSBvZiB0aGUKKwlhbGxvY2F0ZSBvdmVybG9hZCBleHRlbnNpb24gbWV0aG9kIHRvIHNldCBlbmQgb2Ygc3RvcmFnZSByZWZlcmVuY2UKKwl0byB0aGUgcmVhbCBtZW1vcnkgYmxvY2sgZW5kIHJhdGhlciB0aGFuIHRvIHRoZSByZXF1ZXN0ZWQgb25lLgorCisJKiBzdGxwb3J0L3N0bC9fYWxsb2MuYzogQWRhcHQgX19kZWJ1Z19hbGxvYzo6YWxsb2NhdGUgbWV0aG9kIGluIG9yZGVyCisJdG8gcmV0dXJuIHRoZSByZWFsIGFsbG9jYXRlZCBtZW1vcnkgYmxvY2suIEFsc28gYWRkIGNoZWNrIG9uIGNvbXB1dGVkCisJX19yZWFsX24gdG8gYWxsb2NhdGUgYXMgaXQgbWlnaHQgcm9sbCBvbiBzaXplX3QgYW5kIGhpZGUgYSBjYXNlIHRoYXQKKwlzaG91bGQgcmVzdWx0IGluIGEgYmFkX2FsbG9jIGV4Y2VwdGlvbi4KKworCSogc3RscG9ydC9zdGwvX3RocmVhZHMuaCwgc3JjL2FsbG9jYXRvcnMuY3BwOiBBZGQgV0lOVkVSIG1hY3JvCisJY2hlY2sgaW4gYWRkaXRpb24gdG8gX1dJTjMyX1ZFUlNJT04sIGFjY29yZGluZyBQU0RLIGRvY3VtZW50YXRpb24KKwlXSU5WRVIgaXMgbW9yZSBnZW5lcmFseSB1c2VkIGFjY3Jvc3MgZGlmZmVyZW50IFdpbmRvd3MgcGxhdGZvcm1zLgorCisJKiB0ZXN0L3VuaXQvc3RyaW5nX3Rlc3QuY3BwOiBBZGQgY29uc3RydWN0b3IgdGVzdCBjYXNlIHRvIGNvcnJlY3RseQorCWhhbmRsZSBidWlsZCBvZiBhIHN0cmluZyB3aXRoIHN0cmluZzo6bWF4X3NpemUgZWxlbWVudHMgd2hpY2ggc2hvdWxkCisJcmVzdWx0IGluIGEgYmFkX2FsbG9jIGV4Y2VwdGlvbi4gSWRlbSBmb3IgcmVzZXJ2ZSBtZXRob2QuCisKKwkqIHN0bHBvcnQvc3RsL19hbGxvYy5oLCBzcmMvYWxsb2NhdG9ycy5jcHA6IEFkZCBjaGVjayBvZiBtYWxsb2MKKwlyZXN1bHQgaW4gX19tYWxsb2NfYWxsb2MgaW1wbGVtZW50YXRpb24gdG8gdGhyb3cgYW4gZXhjZXB0aW9uIHdoZW4KKwlyZXN1bHQgaXMgTlVMTC4KKworCSogc3JjL2xvY2FsZV9pbXBsLmNwcDogUGF0Y2ggZnJvbSBFcmljIFNhbmZvcmQgZm9yIEJvcmxhbmQgQkRTIDIwMDYKKwlzdXBwb3J0LiBNb3N0bHkgZml4IGxvY2FsZSBmYWNldCBpbmRleCBpc3N1ZXMuCisKKzIwMDYtMDItMjggIFBldHIgT3Z0Y2hlbmtvdiAgPGNvbXBsZW1lbnRAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzdGxwb3J0L3N0bC9fc3RyaW5nLmg6IGNhcGFjaXR5IG1heSByZXR1cm4gd3JvbmcgdmFsdWUgaW4gY2FzZQorCW9mIG5vIF9TVExQX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0gaW4gdXNlOyB0aGFua3MgUnVzdHkgS29vbmNlCisJZm9yIHJlcG9ydC4KKworCSogdGVzdC91bml0L3N0cmluZ190ZXN0LmNwcDogdGVzdCBmb3IgY2FwYWNpdHkgaXNzdWUuCisKKwkqIHNyYy9jeGEuYzogZG9uJ3QgdXNlIGN4YSB3b3JrYXJvdW5kIGZvciBGcmVlQlNEIDYuMC0tLWl0IGZpbmU7CisJdGhpcyBpcyByb2xsYmFjayBvZiBjaGFuZ2VzIDIwMDYtMDEtMjQgW2JhZCBjb21waWxlciB3YXMgaW4gdXNlXS4KKworMjAwNi0wMi0xNSAgUGV0ciBPdnRjaGVua292ICA8Y29tcGxlbWVudEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHN0bHBvcnQvc3RsL19zdHJpbmcuaDogX1NUTFBfRk9SQ0VfU1RSSU5HX1RFUk1JTkFUSU9OIG1vZGUgYmVjb21lCisJZGVmYXVsdCBhbmQgb25seSBtb2RlIGR1ZSB0byBwZXJmb3JtYW5jZSBpc3N1ZS4KKworCSogc3RscG9ydC9zdGwvY29uZmlnL3VzZXJfY29uZmlnLmg6IGRpdHRvLgorCisJKiBzdGxwb3J0L3N0bC9jb25maWcvZmVhdHVyZXMuaDogZGl0dG8uCisKKzIwMDYtMDItMTQgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3RscG9ydC9zdGwvX2hhc2h0YWJsZS5oLCBfaGFzaHRhYmxlLmM6IEFkZCBjaGVjayBpbiBfU1RMUF9ERUJVRworCXRoYXQgZXF1aXZhbGVudCBrZXkgaGF2ZSBzYW1lIGhhc2ggY29kZS4gRml4IF9NX3JlaGFzaCBtZXRob2QKKwlpbXBsZW1lbnRhdGlvbiB0aGF0IHVzZWQgdG8gY2hhbmdlIGVsZW1lbnRzIG9yZGVyIHRoYW5rcyBCaWcgTXVzY2xlCisJZWZmb3J0IHRvIHJlcG9ydCB0aGlzIGlzc3VlLgorCisJKiBidWlsZC9saWIvY29uZmlndXJlOiBGaXggcmVmZXJlbmNlIHRvIFNUTHBvcnQgY29uZmlndXJhdGlvbiBmaWxlCisJaW4gLS1uby1jeWd3aW4gb3B0aW9uIGRlc2NyaXB0aW9uLgorCisyMDA2LTAyLTEzICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQ6IFBhdGNoIGZyb20gRXJpYyBTYW5mb3JkIHRvIHJlbW92ZSBtYW55IG5vdyB1c2VsZXNzCisJQm9ybGFuZCB3b3JrYXJvdW5kLgorCisJKiBzcmMvZnN0cmVhbS5jcHA6IGRpdHRvCisKKwkqIHN0bHBvcnQvc3RsL19tb25ldGFyeS5oLCBfY3djaGFyLmgsIF9hbGdvYmFzZS5oOiBkaXR0bworCisyMDA2LTAyLTEwICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL19pb3Nmd2QuaCwgX2xvY2FsZS5oOiBSZW1vdmVkIHR5cGUgYXR0cmlidXRlcyBvbiB0eXBlCisJZGVjbGFyYXRpb24sIG9ubHkgdXNlZnVsIG9uIHR5cGUgZGVmaW5pdGlvbi4KKworCSogc3JjL21lc3NhZ2VfZmFjZXRzLmg6IFJlbW92ZWQgdW51c2VkIHBhcmFtZXRlciBpbiBfQ2F0YWxvZ19ubF9jYXRkX21hcAorCWVyYXNlIG1ldGhvZCB0byBhdm9pZCB3YXJuaW5nLgorCisJKiBzcmMvbnVtX3B1dF9mbG9hdC5jcHA6IFVzZSBtb3JlIG1hY3JvIHRlY2huaXF1ZSB0byBhdm9pZCB1bnVzZWQgcGFyYW1ldGVycworCWluICpfY3Z0IGZ1bmN0aW9ucy4KKworCSogdGVzdC91bml0L2NwcHVuaXQvY3BwdW5pdF9taW5pLmg6IENvbW1lbnQgdW51c2VkIHBhcmFtZXRlci4KKworCSogdGVzdC91bml0L2NwcHVuaXQvZmlsZV9yZXBvcnRlci5oOiBBZGQgYmFzZSBjbGFzcyBpbml0aWFsaXphdGlvbgorCWluIEZpbGVSZXBvcnRlciBjb3B5IGNvbnN0cnVjdG9yIGRlZmluaXRpb24uCisKKzIwMDYtMDItMTAgIFBldHIgT3Z0Y2hlbmtvdiAgPGNvbXBsZW1lbnRAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzcmMvbnVtX3B1dF9mbG9hdC5jcHA6IHJlbW92ZSB1c2FnZSBvZiBzdGF0aWMgYnVmZmVycworCVtwb3RlbnRpYWwgdnVsbmVyYWJpbGl0aWVzXTsgZGlyZWN0bHkgdXNlIF9faW9zdHJpbmcgaW5zdGVhZC4KKworCSogdGVzdC91bml0L2Zsb2F0aW9fdGVzdC5jcHA6IHRlc3QgZm9yIGZpeGVkIGZsb2F0IG91dHB1dDsKKwljYXNlcyB3aGVuIGZpeGVkIGZsb2F0IGZhaWwgb24gTGludXggYW5kIFNvbGFyaXMsIHJlbGF0ZWQKKwl3aXRoIGZjdnRfciBhbmQgZmNvbnZlcnQgY2FsbHMgcmVzcGVjdGl2bHkgY29tbWVudGVkLgorCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2UvZ2NjLm1hazogd29ya2Fyb3VuZCBmb3IgYnVnIGluIG1ha2UgMy43OS4xCisJb24gU29sYXJpcyBbbm90IHBhc3MgLURfU1RMUF9ERUJVRyB0byBDUFBGTEFHU10uCisKKwkqIHN0bHBvcnQvc3RsL19zdHJpbmcuaDogcm9sbGJhY2sgMjAwNi0wMS0yNS4KKworMjAwNi0wMi0wOCAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBidWlsZC9NYWtlZmlsZXM6IFJlbW92ZWQgYWxsIHJlZmVyZW5jZXMgdG8gQlVJTEQ9ciBpbiBwYXJhbWV0ZXJzCisJdG8gcmVzc291cmNlIGNvbXBpbGVyIGluIHJlbGVhc2UgYXMgdGhlcmUgaXMgbm8gbW9yZSAncicgYXBwZW5kZWQKKwl0byB0aGUgbGlicmFyeSBuYW1lIGluIHRoaXMgbW9kZS4KKworCSogc3JjL3N0bHBvcnQucmM6IEZpeCBzdXBwb3J0IGZvciBCb3JsYW5kIGFuZCBhZGQgY2hlY2sgZm9yIEJVSUxECisJZGVmaW5pdGlvbiBiZWZvcmUgaW5qZWN0aW5nIGl0IGluIG9yaWdpbmFsIGxpYnJhcnkgZmlsZSBuYW1lLgorCisJKiBkb2MvUkVBRE1FLmJvcmxhbmQ6IFVwZGF0ZSBkb2MgdG8gc2lnbmFsIG5ldyBwcmVyZXF1aXNpdGUgZm9yCisJQm9ybGFuZCByZXNzb3VyY2UgY29tcGlsZXIuCisKKwkqIHRlc3QvdW5pdC91bm9yZGVyZWRfdGVzdC5jcHA6IEFkZCB0ZXN0IGZvciB1bm9yZGVyZWRfbXVsdGlzZXQKKwllcXVhbF9yYW5nZSBtZXRob2QuCisKKwkqIHRlc3QvdW5pdC9wYXJ0aWFsX3Rlc3QuY3BwOiBBZGQgdGVzdCBmb3Igc3RyaWN0IHdlYWsgb3JkZXJpbmcKKwlwcmVkaWNhdGUgZ29vZCBiZWhhdmlvciBjaGVjay4KKworMjAwNi0wMi0wNyAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzcmMvYWxsb2NhdG9ycy5jcHA6IE5ldyBzaW1wbGlmaWNhdGlvbiBmb3IgX05vZGVfQWxsb2NfTG9jaywKKwlpdCBkbyBub3QgaGF2ZSB0byBiZSBhIHRlbXBsYXRlIGNsYXNzIGFueW1vcmUuCisKKwkqIHN0bHBvcnQvc3RsL2RlYnVnL19kZWJ1Zy5jOiBJbXBsZW1lbnQKKwlfX3N0bF9kZWJ1Z19lbmdpbmU8X0R1bW15Pjo6X01lc3NhZ2UgZXZlbiB3aGVuIHNwZWNpZnlpbmcKKwlfU1RMUF9ERUJVR19NRVNTQUdFIGluIG9yZGVyIHRvIGhhdmUgZXhwbGljaXQgaW5zdGFuY2lhdGlvbiBjb3JyZWN0bHkKKwlnZW5lcmF0ZWQuCisKKwkqIHN0bHBvcnQvc3RsL19oZWFwLmMsIF90cmVlLmMsIF9saXN0LmMsIF9zbGlzdC5jOiBBZGQgc3RyaWN0CisJd2VhayBvcmRlcmluZyBjaGVja3MuCisKKwkqIHN0bHBvcnQvc3RsL19kZWJ1Zy5oLCBfZGVidWcuYzogQWRkIG5ldyBlcnJvciB0eXBlOiBiYWQgZXF1aXZhbGVudAorCWZ1bmN0b3IgdGhhdCBoYXMgdG8gYmUgdXNlZCBpbiBoYXNoIGNvbnRhaW5lciBpbXBsZW1lbnRhdGlvbiBvciBpbgorCWFsZ29yaXRobSBsaWtlIGZpbmQuIENoZWNrIGZvciB0aGlzIGZ1bmN0b3IgaXM6CisJaWYgKHByZWQoYSwgYikpIGFzc2VydChwcmVkKGIsIGEpCisKKwkqIHN0bHBvcnQvc3RsL19oYXNodGFibGUuYzogQWRkIGVxdWl2YWxlbnQgZnVuY3RvciBjaGVja3MuCisKKwkqIHN0bHBvcnQvc3RsL19kZWJ1Zy5oLCBfZGVidWcuYzogQ2hlY2sgX1NUTFBfREVCVUdfTU9ERV9USFJPVyBpbgorCV9fZGVidWdfZW5naW5lOjpfTWVzc2FnZSBtZXRob2QuIE5vdyB0aHJvd24gZXhjZXB0aW9uIHdpbGwgY29udGFpbgorCWRlc2NyaXB0aW9uIG9mIHRoZSBhc3NlcnRpb24gcmF0aGVyIHRoYW4gYSBnZW5lcmljIG1lc3NhZ2UuCisKKwkqIGJ1aWxkL01ha2VmaWxlcy9nbWFrZS9iY2MubWFrOiBGaXggQm9ybGFuZCByZXNzb3VyY2UgY29tcGlsZXIgbmFtZSwKKwlicmNjMzIgbm90IGJyYzMyLgorCisJKiBzdGxwb3J0L3N0bC9fcmFuZ2VfZXJyb3JzLmgsIHNyYy9kbGxfbWFpbi5jcHA6IEFkZAorCV9fc3RsX3Rocm93X3J1bnRpbWVfZXJyb3IgZnVuY3Rpb24gdXNlZCB0byB0aHJvdyBleGNlcHRpb24gaW4KKwlfU1RMUF9ERUJVR19NT0RFX1RIUk9XLgorCisyMDA2LTAyLTA2ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIGJ1aWxkL01ha2VmaWxlcy9ubWFrZTogRml4ZWQgcmVncmVzc2lvbiBnZW5lcmF0ZWQgYnkgYSBzaWRlCisJZWZmZWN0IG9mIFVsaSBwYXRjaCBiZWxvdy4KKworMjAwNi0wMi0wMiAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L2NvbmZpZy9fc3RsX2V2Yy5oLCBzdGwvX2NvbmZpZy5oOiBQYXRjaCBmcm9tIFVscmljaAorCUVja2hhcmR0IHRvIHNpZ25hbCBlbmRpYW5lc3MgZGV0ZWN0aW9uIHByb2JsZW0gYW5kIHNldCBFVkMKKwllbmRpYW5lc3MgZm9yIE1JUFMgU0RLLgorCisJKiBzcmMvYWxsb2NhdG9ycy5jcHA6IENsZWFuIHVwIF9Ob2RlX0FsbG9jX0xvY2sgZGVmaW5pdGlvbiwgb25seQorCXNwZWNpYWxpemF0aW9uIGFyZSBub3cgYXZhaWxhYmxlIGZvciB0aHJlYWQgc2FmZSBhbmQgbm90IHRocmVhZAorCXNhZmUgYnVpbGRzLiBNYWtlIGVhc2llciBkZWZpbml0aW9uIG9mIGludGVybmFsIHN0YXRpYyBtdXRleC4KKworCSogc3RscG9ydC9mbG9hdC5oOiBQYXRjaCBmcm9tIEVyaWMgU2FuZm9yZCBmb3IgQm9ybGFuZCBOYU4gbWFuYWdlbWVudAorCisJKiBzdGxwb3J0L2NmbG9hdDogSW5jbHVkZSBTVExwb3J0IGZsb2F0LmggcmF0aGVyIHRoYW4gbmF0aXZlIG9uZSBpbgorCW9yZGVyIHRvIHVzZSBwb3RlbnRpYWwgaW50ZXJuYWwgd29ya2Fyb3VuZC4KKworCSogc3RscG9ydC9zdGwvY29uZmlnL19pYm0uaDogUmVwbGFjZSBhbGwgQysrIGNvbW1lbnQgYnkgQyBjb21tZW50cy4KKworCSogc3RscG9ydC9lcnJuby5oOiBGb3IgQm9ybGFuZCwgd2hlbiBidWlsZGluZyBmb3IgYSBzaW5nbGUgdGhyZWFkZWQKKwljb250ZXgsIGVycm5vIGlzIG5vdCBhIG1hY3JvIGFuZCBpcyBkZWZpbmVkIGluIHN0ZCBuYW1lc3BhY2Ugc28gdXNpbmcKKwloYXZlIHRvIGdldCB0aGUgc3ltYm9sIGluIHRoaXMgbmFtZXNwYWNlLgorCisyMDA2LTAxLTMxICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHNyYy9hbGxvY2F0b3JzLmNwcDogUmVpbmZvcmNlIG1vdmUgb2YgYWxsb2NhdG9ycyBpbXBsZW1lbnRhdGlvbgorCisJKiBzdGxwb3J0L3N0bC9fYWxsb2MuaDogUmVtb3ZlZCBpbmNsdWRlIG9mIGludGVybmFsIF90aHJlYWQuaCBubworCW1vcmUgbmVjZXNzYXJ5IG5vdyB0aGF0IGFsbG9jYXRvciBpbXBsZW1lbnRhdGlvbiBpcyBpbiBhbGxvY2F0b3JzLmNwcC4KKworCSogc3RscG9ydC9zdGwvX3B0aHJlYWRfYWxsb2MuaDogUmVtb3ZlZCBwdGhyZWFkLmggaW5jbHVkZS4KKworCSogc3RscG9ydC9zdGwvX3JvcGUuaDogQWRvcHQgY2xhc3NpYyBtYWNybyBjaGVjayBiZWZvcmUgaW5jbHVzaW9uCisJb2YgX3RocmVhZHMuaC4KKworCSogYnVpbGQvTWFrZWZpbGVzL2dtYWtlL2djYy5tYWs6IEFkZCAtZm5vLWlubGluZSBvcHRpb24gZm9yIGRlYnVnCisJYnVpbGRzLgorCisJKiBzdGxwb3J0L3N0bC9fdGhyZWFkcy5oOiBSZW1vdmUgbG9jayBmcmVlIHNpbmdseSBsaW5rZWQgbGlzdCwgYXZvaWQKKwlpbmNsdWRlIG9mIHdpbmRvd3MuaCB3aGVuIHVzaW5nIFdpbjMyIEFQSSBsb2NrIGZyZWUgc2xpc3QKKwlpbXBsZW1lbnRhdGlvbi4KKworCSogc3JjL2xvY2tfZnJlZV9zbGlzdC5oOiBOZXcgcGxhY2UgZm9yIHRoZSBsb2NrIGZyZWUgc2luZ2x5IGxpbmtlZAorCWxpc3QgaW1wbGVtZW50YXRpb24uCisKKwkqIHRlc3QvdW5pdC9tdmN0b3JfdGVzdC5jcHAsIHR5cGVfdHJhaXRzX3Rlc3QuY3BwOiBTbWFsbCB3b3JrYXJvdW5kCisJZm9yIGdjYyA0LjAuMSBidWlsZCwgbG9va3MgbGlrZSB0aGVyZSBpcyBhIGNvbmZsaWN0IGJldHdlZW4gZ2xpYmMrKworCV9fdHJ1ZV90eXBlIGFuZCBTVExwb3J0IG9uZS4KKworMjAwNi0wMS0zMCAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBQYXRjaCBmcm9tIFVscmljaCBFY2toYXJkdCBmb3IgRVZDNCBJQ0UgKyBzb21lIGRvY3VtZW50YXRpb24KKwl1cGRhdGVzIGFuZCBmaXhlcy4KKworMjAwNi0wMS0yOSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bC9faGFzaHRhYmxlLmgsIF9saW1pdHMuaDogQWRkIG1pc3NpbmcgY2FsbGluZworCWNvbnZlbnRpb24gdG8gc3RhdGljIG1ldGhvZHMgdGhhbmtzIFBldHIgU3VwaW5hCisKKzIwMDYtMDEtMjggIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3RscG9ydC9zdGwvZGVidWcvX2l0ZXJhdG9yLmg6IEZpeCBIcCBBY2MgY29uZmlndXJhdGlvbiB0aGFua3MKKwlCb3JpcyBHdWJlbmtvLgorCisyMDA2LTAxLTI3ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL19hbGxvYy5oLCBfb2xkX2FsbG9jLmgsIF9wdGhyZWFkX2FsbG9jLmgsCisJdGVzdC91bml0L3JvcGVfdGVzdC5jcHA6IEZpeGVkIHJlZmVyZW5jZSB0byBfU1RMUF9OT19JT1NUUkVBTVMsCisJcmVwbGFjZWQgYnkgX1NUTFBfVVNFX05PX0lPU1RSRUFNUy4KKworCSogc3RscG9ydC9zdGwvX2FsbG9jLmg6IE1vdmUgX01BWF9CWVRFUyBkZWZpbml0aW9uIG91dCBvZgorCV9TVExQX1VTRV9OT19JT1NUUkVBTVMgY2hlY2sgc2NvcGUgYXMgaXQgaXMgYWxzbyB1c2VkIGluIGRlcXVlCisJaW1wbGVtZW50YXRpb24uCisKKwkqIHN0bHBvcnQvc3RsL19hbGdvLmMsIGRlYnVnL19kZWJ1Zy5oLCBfZGVidWcuYzogQWRkIGNoZWNrIGZvcgorCWJhZCBwcmVkaWNhdGUgaW4gc2FmZSBTVEwgbW9kZSAoX1NUTFBfREVCVUcpLgorCisJKiB0ZXN0L3VuaXQvc29ydF90ZXN0LmNwcDogQWRkIHRlc3QgZm9yIGNvcnJlY3QgaW52YWxpZCBzdHJpY3Qgd2VhaworCW9yZGVyaW5nIHByZWRpY2F0ZSBkZXRlY3Rpb24uIEFjdGl2ZSBvbmx5IHdoZW4gU1RMIHNhZmUgbW9kZSB0aHJvd3MKKwlleGNlcHRpb24gcmF0aGVyIHRoYW4gdGVybWluYXRpbmcgYXBwbGljYXRpb24uCisKKwkqIHRlc3QvdW5pdC9zb3J0X3Rlc3QuY3BwOiBBZGQgYSBjaGVjayB0aGF0IHN0YWJsZV9zb3J0IGlzIHJlYWxseQorCXN0YWJsZS4KKworMjAwNi0wMS0yNiAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bC9fYWxsb2MuaCwgX2FsbG9jLmMsIF9wdGhyZWFkX2FsbG9jLmg6IE1hbnkgY29kZSBtb3ZlZAorCXRvIGFsbG9jYXRvcnMuY3BwLgorCisJKiBzdGxwb3J0L3N0bC9fcHRocmVhZF9hbGxvYy5jOiBSZW1vdmVkLCBjb250ZW50IG1vdmVkIHRvCisJYWxsb2NhdG9ycy5jcHAuCisKKwkqIHNyYy9hbGxvY2F0b3JzLmNwcDogTmV3LCBjb250YWlucyBTVExwb3J0IG5vZGUgYW5kIHBlciB0aHJlYWQKKwlhbGxvY2F0b3IgaW1wbGVtZW50YXRpb24uCisKKwkqIHNyYy9kbGxfbWFpbi5jcHA6IFJlbW92ZSByZWZlcmVuY2VzIHRvIGZvcm1lciBfX25vZGVfYWxsb2MKKwljbGFzcy4KKworCSogYnVpbGQvbGliL01ha2VmaWxlLmluYzogQWRkIGFsbG9jYXRvcnMuY3BwIHRyYW5zbGF0aW9uIHVuaXQuCisKKwkqIHN0bHBvcnQvc3RsL19hbGxvY19vbGQuaDogTW9kaWZpZWQgYmFzZWQgb24gYWxsb2NhdG9yIGNsYXNzZXMgbmV3CisJaW50ZXJmYWNlLgorCisJKiBzdGxwb3J0L3N0bC9jb25maWcvZmVhdHVyZS5oOiBEZWZhdWx0IGFsbG9jYXRvciBpbiBfU1RMUF9OT19JT1NUUkVBTVMKKwltb2RlIGlzIG5vdyB0aGUgbmV3L2RlbGV0ZSBhbGxvY2F0b3IsIHVzZXIgY2FuIHN0aWxsIHVzZSBtYWxsb2MvZnJlZQorCW9uZSB1c2luZyBjb25maWcgc3d0aWNoIGluIGhvc3QuaC4KKworCSogc3RscG9ydC9zdGwvY29uZmlnL19nY2MuaDogQ3lnd2luL01pbkdXIGNhbiBub3cgdXNlIGRlZmF1bHQgbm9kZQorCWFsbG9jYXRvciBpbXBsZW1lbnRhdGlvbiB3aXRob3V0IG1lbW9yeSBsZWFrLgorCisyMDA2LTAxLTI1ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHRlc3QvdW5pdC9zdHJlYW1fdGVzdC5jcHA6IEFkZCBjaGVjayBmb3IgcHRyZGlmZl90IG91dHB1dAorCWluIHN0cmVhbXMgb3BlcmF0b3Igd2hlbiA2NCBiaXRzIHBvcnRhYmlsaXR5IGlzc3VlIGRldGVjdGlvbgorCWZlYXR1cmUgaXMgYWN0aXZhdGVkIHdpdGggTVNWQyBjb21waWxlcnMuCisKKzIwMDYtMDEtMjUgIEVyaWMgU2FuZm9yZCAgPC4uLkBjb21wLi4uPgorCisJKiBzdGxwb3J0L3N0bC9fZXhjZXB0aW9uLmg6IERlbGV0ZSBvYnNvbGV0ZSB3b3JrYXJvdW5kIGZvcgorCWxlZ2FjeSBCb3JsYW5kIGNvbXBpbGVycy4KKworCSogc3RscG9ydC9zdGwvX3N0cmluZy5oOiBVc2UgYW4gb3RoZXIgaW1wbGVtZW50YXRpb24gZm9yIHRoZQorCWNvbnN0X3JlZmVyZW5jZSBvcGVyYXRvcltdKHNpemVfdHlwZSBfbikgY29uc3QKKworCSogc3RscG9ydC9zdGwvY29uZmlnL19iYy5oOiBSZXN0b3JlIHVuZXhwZWN0ZWQgZXhjZXB0aW9uIGhhbmRsZXIKKwkoc3RhdGljIGFuZCBkeW5hbWljKSBhbmQgdW5jYXVnaHRfZXhjZXB0aW9uIGhhbmRsZXIgKHN0YXRpYyBvbmx5KQorCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2UvbGliL2JjYy5tYWs6IFR5cG8gZml4IGluIGxpbmtlciBmbGFncy4KKworMjAwNi0wMS0yNCAgUGV0ciBPdnRjaGVua292ICA8Y29tcGxlbWVudEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHRlc3QvdW5pdC9iaW5kX3Rlc3QuY3BwOiBhZGQgdGVzdCBmb3IgbWVtYmVyIGZ1bmN0aW9uCisJYmluZGluZyB0aGF0IHNob3cgd29ya2Fyb3VuZCBmb3IgY29uc3QgZnVuY3Rpb24gY2FsbC4KKworCSogc3JjL2N4YS5jOiBfX2N4YV9maW5hbGl6ZSBhbmQgX19jeGFfYXRleGl0IHByZXNlbnQgaW4gbGliYworCWluIEZyZWVCU0QgNS4zLCBidXQgYWdhaW4gYWJzZW50IGluIDYuMAorCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2UvYXBwL2djYy5tYWssCisJYnVpbGQvTWFrZWZpbGVzL2dtYWtlL2xpYi9nY2MubWFrOiBkZXRlY3Qgd2hldGhlciBnY2MKKwl3YXMgYnVpbGRlZCB3aXRoIC0tZGlzYWJsZS1zaGFyZWQgYW5kIHVzZSBjb3JyZWN0IGxpYmdjYy4KKworCSogYnVpbGQvbGliL2NvbmZpZ3VyZTogYWRkIC0tdXNlLXN0YXRpYy1nY2Mgb3B0aW9uIHRvIHNob3cKKwl0aGF0IFNUTHBvcnQgc2hvdWxkIHVzZSBzdGF0aWMgbGFuZ3VhZ2Ugc3VwcG9ydCBsaWJyYXJpZXMgZnJvbQorCWdjYyBpZiBpdCB3YXMgYnVpbGQgd2l0aCAtLWVuYWJsZS1zaGFyZWQuCisKKzIwMDYtMDEtMjMgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogYnVpbGQvTWFrZWZpbGVzL2dtYWtlL2FwcC9jbGVhbi5tYWs6IEZpeCBkaXN0Y2xlYW4gcnVsZSBmb3IKKwl3aW5kb3dzIHRoYW5rcyBFcmljIFNhbmZvcmQuCisKKwkqIHN0bHBvcnQvc3RsL19jc3RkZGVmLmgsIF9jc3RkbGliLmg6IFdoZW4gbm8gbmV3IGhlYWRlciBzdXBwb3J0LAorCWluY2x1ZGUgU1RMcG9ydCBDIGhlYWRlciByYXRoZXIgdGhhbiBuYXRpdmUgb25lIHRvIHVzZSBlcnJubworCXdvcmthcm91bmQuCisKKwkqIHN0bHBvcnQvc3RkZGVmLmg6IERNQyBhbHNvIGRlZmluZSBlcnJubyBpbiBuYXRpdmUgc3RkZGVmLmggZmlsZS4KKworMjAwNi0wMS0yMiAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzcmMvbG9jYWxlX2ltcGwuY3BwLCBzdGxwb3J0L3N0bC9fY29kZWN2dC5oLCBfbW9uZXRhcnkuYywKKwlfbnVtX2dldC5jLCBfbnVtX3B1dC5jLCBfdGltZV9mYWNldHMuYzogQm9ybGFuZCB3b3JrYXJvdW5kIGZvcgorCWxvY2FsZSBmYWNldCBpZCBpbnN0YW5jaWF0aW9uIHRoYXQgd2VyZSBkdXBsaWNhdGVkLiBOb3cgc3RhdGljCisJaW5zdGFuY2VzIGFyZSBubyBtb3JlIGRlZmluZWQgZnJvbSAuYyBmaWxlcyBidXQgb25seSBmcm9tIHRoZQorCS5jcHAgYW5kIG9ubHkgZm9yIGZhY2V0cyB0aGF0IGFyZSBpbXBsZW1lbnRlZCBieSBTVExwb3J0LiBVc2VycworCWltcGxlbWVudGluZyBmYWNldCBpbmhlcml0aW5nIGZyb20gdGhlIFNUTHBvcnQgb25lIHdpbGwgaGF2ZSB0bworCWRlZmluZWQgdGhlIHN0YXRpYyBpbnN0YW5jZSB0aGVtc2VsZiBpbiB0aGVpciB0cmFuc2xhdGlvbiB1bml0cy4KKwkKKwkqIHN0bHBvcnQvc3RsL3R5cGVfbWFuaXBzLmg6IEZpeGVkIF9VbkNWVHlwZSB3cm9uZyBpbXBsZW1lbnRhdGlvbgorCXJlcG9ydGVkIGJ5IERpZ2l0YWwgTWFycyBjb21waWxlci4KKworCSogc3RscG9ydC9zdGwvYm9vc3RfdHlwZV90cmFpdHMuaDogRml4ZWQgX09LTWVtQ3B5IGltcGxlbWVudGF0aW9uCisJcmVtb3ZlX3BvaW50ZXIgY2FsbCB3YXMgd3JvbmcuCisKKwkqIHNyYy9kbGxfbWFpbi5jcHA6IEhpZGUgZm9yY2VfbGluayBkZWZpbml0aW9uIHRvIE1TVkMgY29tcGlsZXJzLAorCXdhcyB1c2VsZXNzIGFuZCBwcm9kdWNpbmcgYSB3YXJuaW5nLgorCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2UvY3lnbWluZy9ydWxlcy1zby5tYWs6IFdvcmthcm91bmQgZm9yIERNQworCWxpbmtlciB3ZWlyZCBiZWhhdmlvci4gTGlua2VyIGNyZWF0ZSB0aGUgZGxsIGZpbGUgZXZlbiBpZiBsaW5rCisJZmFpbCB3aGljaCBjb25mdXNlIG1ha2UgZGVwZW5kZW5jeSBmZWF0dXJlLiBBcyBsaWIgZmlsZSBpcyBub3QKKwlnZW5lcmF0ZWQsIGRsbCBub3cgZGVwZW5kcyBvbiBsaWIgdGhhdCBkZXBlbmRzIG9uIGJ1aWxkIGZpbGVzLgorCisJKiBzdGxwb3J0L3N0bC9jb25maWcvX3dhcm5pbmdfb2ZmLmg6IERpc2FibGVkIHRoaXMgdXNlZCBpbiBpbml0aWFsaXphdGlvbgorCWxpc3Qgd2FybmluZywgdXNlZCBpbiByb3BlIGltcGxlbWVudGF0aW9uLgorCisJKiBidWlsZC9saWIvY29uZmlndXJlOiBGaXggLS13aXRoLWJvb3N0IGludGVycHJldGF0aW9uLgorCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2UvZG1jLm1hazogVXNlIGRtX2xpbmsgY29tbWFuZCBmb3IgbGlua2VyIHJhdGhlcgorCXRoYW4gbGluayB0aGF0IGlzIHJhdGhlciB0aGUgTVNWQyBsaWtlIHdyYXBwZXIuCisKKwkqIGJ1aWxkL01ha2VmaWxlcy9nbWFrZS9jeWdtaW5nL3RhcmdldHN5cy5tYWs6IERpdHRvIGZvciBkbV9saWIgcmF0aGVyCisJdGhhbiBsaWIgY29tbWFuZC4KKworCSogYnVpbGQvTWFrZWZpbGVzL2dtYWtlL2FwcC9ydWxlcy5tYWs6IFVzZSBzYW1lIGxpbmtlciBjb21tYW5kIGludm9jYXRpb24KKwlmb3IgRE1DIGFuZCBCb3JsYW5kLgorCisJKiBkb2MvUkVBRE1FLmJvcmxhbmQ6IERvY3VtZW50YXRpb24gdXBkYXRlIGFib3V0IGxpbWl0YXRpb24gb24gbG9jYWxlCisJZmFjZXRzIGlkIGluc3RhbmNpYXRpb24uCisKKwkqIHN0bHBvcnQvc3RkbGliLmg6IERNQywgbGlrZSBCb3JsYW5kIGFuZCBFVkMsIGRlZmluZXMgZXJybm8gbWFjcm8KKwlpbiBzdGRsaWIuaAorCisJKiBzdGxwb3J0L3N0bC9jb25maWcvdXNlcl9jb25maWcuaCwgZmVhdHVyZXMuaDogSW52ZXJzZQorCV9TVExQX0ZPUkNFX1NUUklOR19URVJNSU5BVElPTiBtYWNybyBzd2l0Y2ggaW4KKwlfU1RMUF9ET05UX0ZPUkNFX1NUUklOR19URVJNSU5BVElPTi4gVGhpcyBpcyBsZXNzIGRhbmdlcm91cyBmb3IKKwlleGlzdGluZyBjb2RlLgorCisJKiBzdGxwb3J0L3N0bC9fc3RyaW5nLmg6IFdoZW4gX1NUTFBfRk9SQ0VfU1RSSU5HX1RFUk1JTkFUSU9OCisJaXMgZGVmaW5lZCBvcGVyYXRvcltdIGltcGxlbWVudGF0aW9uIGlzIHNpbXBsZXIuCisKKwkqIHN0bHBvcnQvc3RsL2RlYnVnL19zdHJpbmcuaDogQmFzZWQgaW1wbGVtZW50YXRpb24gb2YgW10KKwlvcGVyYXRvciBvbiB0aGUgbm9uIFNUTCBzYWZlIGludGVybmFsIGluc3RhbmNlLCBhdm9pZCBkdXBsaWNhdGlvbgorCW9mIGNoZWNrIGZvciBhY2Nlc3MgdG8gdGhlIGVsZW1lbnQgb2YgaW5kZXggc2l6ZSgpLgorCisJKiB0ZXN0L3VuaXQvZnN0cmVhbV90ZXN0LmNwcDogQWRkIGN1c3RvbSBmYWNldCBpZCBkZWZpbml0aW9uIGZvcgorCUJvcmxhbmQuCisKKwkqIHRlc3QvdW5pdC9oYXNoX3Rlc3QuY3BwOiBOb3cgQm9ybGFuZCBzdXBwb3J0IGNvcnJlY3RseSBoYXNoIGNvbnRhaW5lcgorCWltcGxlbWVudGF0aW9uLgorCisJKiB0ZXN0L3VuaXQvcm9wZV90ZXN0LmNwcDogRml4ZWQgdGVzdCBpbXBsZW1lbnRhdGlvbiB0byBidWlsZCBpbgorCV9TVExQX05PX0lPU1RSRUFNUyBtb2RlLgorCisyMDA2LTAxLTE4ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL19vc3RyZWFtLmgsIF9vc3RyZWFtLmM6IFVzZSBzaXplX3QgcmF0aGVyIHRoYW4KKwl1bnNpZ25lZCBpbnQgZm9yIE1TVkMgY29tcGlsZXJzIGFmdGVyIFZDNiBpbiBJTyBvdXRwdXQgb3BlcmF0b3IKKwl0byBhdm9pZCA2NCBiaXRzIHdhcm5pbmcgd2hlbiB0cnlpbmcgdG8gZGlzcGxheSBhIHNpemVfdCB0eXBlLgorCisJKiB0ZXN0L3VuaXQvc3N0cmVhbV90ZXN0LmNwcDogQWRkIHRlc3QgdGhhdCByZXZlYWwgdGhlIDY0IGJpdHMKKwl3YXJuaW5nLgorCisJKiB0ZXN0L3VuaXQvc3RyaW5nX3Rlc3QuY3BwOiBGaXhlZCB1bnVzZWQgdmFyaWFibGUgd2FybmluZy4KKworMjAwNi0wMS0xNyAgUGV0ciBPdnRjaGVua292ICA8Y29tcGxlbWVudEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHNyYy9jX2xvY2FsZV9nbGliYy9jX2xvY2FsZV9nbGliYzIuYzogcmVhbGx5IGltcGxlbWVudGVkCisJZ2V0dGluZyBkZWZhdWx0IGxvY2FsZSBjYXRlZ29yaWVzIGZyb20gZW52aXJvbm1lbnQ7IHJlcGxhY2UKKwlhIGZldyBzdHJjcHkgYnkgc3RybmNweSB0byBwcm90ZWN0IGZyb20gcG9zc2libGUgYnVmZmVyIG92ZXJmbG93CisJYXR0YWNrLgorCQorCSogc3RscG9ydC9uZXcuaCwgc3RscG9ydC9zdGwvX3R5cGVpbmZvLmg6IGZldyB3b3JrYXJvdW5kcyBmb3IgSUNDIDkKKwlbc3VnZ2VzdGVkIGJ5IExpbSBId2FuIENoZW9sXS4KKworMjAwNi0wMS0xNCAgRXJpYyBTYW5mb3JkICA8Li4uQGNvbXAuLi4+CisKKwkqIGJ1aWxkL3Rlc3QvZWgvYmNjLm1hazogQ29waWVkIGZyb20gYnVpbGQvdGVzdC91bml0L2JjYy5tYWsuCisKKwkqIHN0bHBvcnQvc3RsL19yb3BlLmM6IFJlc3RvcmUgQm9ybGFuZCBzdXBwb3J0IGZvciBfUm9wZV9yb3RhdGUuCisKKwkqIHN0bHBvcnQvc3RsL19yb3BlLmg6IEZpeCBCb3JsYW5kIDUuNS4xIGludGVybmFsIGNvbXBpbGVyIGVycm9ycworCWluIF9NX3BhdGhfZW5kIGFuZCBfTV90bXBfYnVmIHN0cnVjdHMuIFJlc3RvcmUgQm9ybGFuZCBzdXBwb3J0IGZvcgorCV9Sb3BlX3JvdGF0ZS4KKworCSogdGVzdC9laC90ZXN0X3JvcGUuY3BwOiBSZXN0b3JlIEJvcmxhbmQgZXhjZXB0aW9uIHRlc3QgZm9yIHJvcGUuCisKKwkqIHRlc3QvdW5pdC9yb3BlX3Rlc3QuY3BwOiBSZXN0b3JlIEJvcmxhbmQgdW5pdCB0ZXN0IGZvciByb3BlLgorCisyMDA2LTAxLTEzICBQZXRyIE92dGNoZW5rb3YgIDxjb21wbGVtZW50QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3RscG9ydC9zdGwvX3N0cmluZy5oLCBzdGxwb3J0L3N0bC9kZWJ1Zy9fc3RyaW5nLmg6CisJY29uc3Qgb3BlcmF0b3IgW25dIHNob3VsZCByZXR1cm4gQ2hhclQoKSBpbiBjYXNlIG9mCisJbiA9PSBzaXplKCksIElTTy9JRUMgMTQ4ODI6MjAwMyhFKSwgMjEuMy40OyB0aGFua3MgUnVzcyBNaWxsZXIuCisKKwkqIHRlc3QvdW5pdC9zdHJpbmdfdGVzdC5jcHA6IHRlc3QgZm9yIGZpeGVkIGJ1ZyBhYm92ZS4KKworCSogYnVpbGQvbGliL2NvbmZpZ3VyZTogY2hhbmdlIC0tdXNlLWJvb3N0PSBvbnRvIC0td2l0aC1ib29zdD0KKworMjAwNi0wMS0xMyAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiB0ZXN0L3VuaXQvdHlwZV90cmFpdHNfdGVzdC5jcHA6IEFkZCBib29zdCBzcGVjaWFsaXphdGlvbiBmb3IKKwlhbnlfcG9kX3R5cGUgaW4gb3JkZXIgdG8gcmVwcm9kdWNlIFNUTHBvcnQgYmVoYXZpb3Igd2hlbiB1c2luZworCWJvb3N0IHR5cGUgdHJhaXRzLgorCisJKiBzcmMvZGxsX21haW4uY3BwOiBSZW1vdmUgbm93IGludmFsaWQgdGVtcGxhdGUgZXhwbGljaXQKKwlpbnN0YW5jaWF0aW9uIG9mIF9Cc19HIHRoYXQgaXMgbm8gbW9yZSBhIHRlbXBsYXRlLgorCisJKiBzdGxwb3J0L3N0bC9jb25maWcvX2RldGVjdF9kbGxfb3JfbGliLmg6IFdoZW4gbm8gaW9zdHJlYW1zIG1vZGUsCisJY29uc2lkZXIgdGhhdCB3ZSBhcmUgaW4gYSBzdGF0aWMgbGliIG1vZGUuCisKKwkqIHN0bHBvcnQvc3RsL19saW1pdHMuYywgX2hhc2h0YWJsZS5jOiBBZGQgX1NUTFBfQ0FMTCBzcGVjaWZpY2F0aW9uCisJdG8gX0xpbUcgYW5kIF9TdGxfcHJpbWUgbWV0aG9kcyBpbXBsZW1lbnRhdGlvbi4KKworCSogc3RscG9ydC9zdGwvX2xpbWl0cy5jOiBQdXQgX1N0bF9wcmltZSBtZXRob2RzIGltcGxlbWVudGF0aW9uIGluCisJYSBfU1RMUF9FWFBPU0VfR0xPQkFMU19JTVBMRU1FTlRBVElPTiBtYWNybyBjaGVjayBibG9jay4gVGhvc2UKKwltZXRob2RzIGFyZSBzdXBwb3NlZCB0byBjb21lIGZyb20gbGlicyB3aGVuIHVzaW5nIGlvc3RyZWFtcy4KKworCSogc3RscG9ydC9zdGwvX251bV9wdXQuaCwgX251bV9nZXQuaCwgX3RpbWVfZmFjZXRzLmgsIF9pb3MuaCwKKwlfaW9zX2Jhc2UuaDogQ2xlYW51cCBCb3JsYW5kIHdvcmthcm91bmQgbm93IHVzZWxlc3MuCisKKwkqIHN0bHBvcnQvc3RsL2Jvb3N0X3R5cGVfdHJhaXRzLmg6IEZpeGVkIF9PS1RvTWVtQ3B5IGltcGxlbWVudGF0aW9uCisJdXNpbmcgYm9vc3QgdHlwZSB0cmFpdHMgdG8gYmUgY2xvc2VyIHRvIHRoZSBTVExwb3J0IGJlaGF2aW9yLgorCisJKiBidWlsZC9saWIvY29uZmlndXJlLmJhdDogRml4ZWQgcmVmZXJlbmNlIHRvIFNUTHBvcnQgdXNlcgorCWNvbmZpZ3VyYXRpb24gZmlsZS4KKworCSogYnVpbGQvbGliL2NvbmZpZ3VyZTogQWRkIC0tdXNlLWJvb3N0IG9wdGlvbiB0byBpbmplY3QgYm9vc3QKKwlwYXRoIGR1cmluZyBidWlsZCBwcm9jZXNzLgorCisyMDA2LTAxLTEyICBQZXRyIE92dGNoZW5rb3YgIDxjb21wbGVtZW50QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3RscG9ydC9zdGwvX3JvcGUuaCwgc3RscG9ydC9zdGwvX3JvcGUuYzogcGFzcyBDaGFyQ29uc3VtZXIKKwl2aWEgcmVmZXJlbmNlLCB0byB0YWtlIGludG8gYWNjb3VudCBDaGFyQ29uc3VtZXIgbW9kaWZpY2F0aW9ucy4KKwlUaGlzIGhhcyByZWxhdGlvbiB0byBmaW5kKGNoYXIpIGluIHJvcGUuIFRoYW5rcyBDcmlzdGlhbiBWbGFzY2VhbnUuCisKKwkqIHRlc3QvdW5pdC9yb3BlX3Rlc3QuY3BwOiB0ZXN0IGZvciBmaXhlZCBidWcgYWJvdmUuCisKKzIwMDYtMDEtMTEgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3JjL2JpdHNldC5jcHA6IEFkZCBzdGxwb3J0X3ByZWZpeC5oIGluY2x1ZGUuCisKKwkqIHN0bHBvcnQvc3RsL19iaXRzZXQuaDogQWRkIGFuIGlubGluZSBpbXBsZW1lbnRhdGlvbiBmb3IgX1NfY291bnQKKwlhbmQgX1NfZmlyc3Rfb25lIHN0YXRpYyBtZXRob2RzIGZvciBfU1RMUF9OT19JT1NUUkVBTVMgbW9kZS4gU2hvdWxkCisJYmUgc2xvd2VyIHRoYW4gdmVyc2lvbiBjb21pbmcgd2l0aCBsaWJyYXJ5IGJ1dCBhdm9pZCBsaW5rIHRyb3VibGUuCisKKzIwMDYtMDEtMTEgIFBldHIgT3Z0Y2hlbmtvdiAgPGNvbXBsZW1lbnRAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzdGxwb3J0L3N0bC9fYml0c2V0LmgsIHN0bHBvcnQvc3RsL19iaXRzZXQuYywgc3JjL2JpdHNldC5jcHA6CisJbWFrZSBoZWxwZXIgc3RydWN0dXJlIF9Cc19HIG5vbi10ZW1wbGF0ZSBbaXQgdXNlZCBvbmx5IGFzIGluc3RhbmNlCisJd2l0aCB1bnVzZWQgYm9vbCBhcmd1bWVudCBvbmx5XSwgYW5kIHB1dCBzdGF0aWMgdGFibGVzIGludG8gbGlicmFyeQorCXRvIGF2b2lkIHBvc3NpYmxlIHN0YXRpYyBpbnN0YW5jZXMgZHVwbGljYXRpb24uCisKKwkqIGJ1aWxkL2xpYi9NYWtlZmlsZS5pbmM6IGlkZW0uCisKKzIwMDYtMDEtMTAgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3RscG9ydC9zdGwvdHlwZV90cmFpdHMuaCwgY29uZmlnL19tc3ZjLmgsIF9td2Vya3MuaDogSW50ZWdyYXRlCisJaW50cmluc2ljIHR5cGUgdHJhaXRzIHN1cHBvcnQgZm9yIFZpc3VhbCAyMDA1IGFuZCBNZXRyb3dlcmsuIENvZGUKKwliYXNlZCBvbiBib29zdCBsaWJyYXJ5IGluZm9ybWF0aW9uIGFuZCBub3QgdGVzdGVkIGZvciBNZXRyb3dlcmsuCisKKwkqIHRlc3QvdW5pdC9iaW5kX3Rlc3QuY3BwOiBGaXggQmluZFRlc3Q6OmJpbmQybmQzIHRlc3QgY2FzZSwgaGFkCisJbmV2ZXIgYmVlbiB1c2VkLgorCisJKiBzdGxwb3J0L3N0bC9ib29zdF90eXBlX3RyYWl0cy5oOiBDaGFuZ2UgYm9vc3QgdHlwZSB0cmFpdHMgd3JhcHBpbmcKKwlpbXBsZW1lbnRhdGlvbiB0byB1c2UgbWV0YSBwcm9ncmFtbWluZyBvcGVyYXRpb24gb24gdHlwZXMgcmF0aGVyCisJdGhhbiBvbiBudW1lcmljYWwgY29uc3RhbnQsIE1TVkM2IHByZWZlciBpdC4KKworCSogYnVpbGQvdGVzdC91bml0L21zdmMubWFrOiBTeXN0ZW1hdGljYWxseSBhZGQgL1ptODAwIGZvciBNU1ZDCisJY29tcGlsZXJzLCB1c2VmdWwgaW4gYSBudW1iZXIgb2YgY2FzZSBhbmQgdHJhbnNwYXJlbnQgaW4gb3RoZXJzLgorCisJKiB0ZXN0L3VuaXQvdHlwZV90cmFpdHNfdGVzdC5jcHA6IEFkZCBpc19QT0QgdGVzdCBjYXNlLiBBZGQgZHVtbXkKKwljb25zdHJ1Y3RvcnMsIGFzc2lnbm1lbnQgb3BlcmF0b3IgYW5kIGRlc3RydWN0b3IgdG8gYW55X3R5cGUgc3RydWN0CisJdG8gbWFrZSB0aGUgdGVzdHMgcGFzcyBldmVuIHdpdGggY29tcGlsZXJzIGhhdmluZyBpbnRyaW5zaWMgdHlwZQorCXRyYWl0cyBzdXBwb3J0LgorIAorMjAwNi0wMS0wOSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bC9kZWJ1ZzogRml4IG1vdmUgY29uc3RydWN0b3IgdG8ga2VlcCB0aGUgY29udGFpbmVyCisJbW92ZSBjb25zdHJ1Y3RvciBjb21wbGV0ZS4gV2hlbiBTVExwb3J0IHVzZXIgZG8gbm8gcmVxdWlyZSBubworCWV4dGVuc2lvbiBvciBTdGFuZGFyZCBkZWJ1ZyBzYWZlIG1vZGUsIGl0ZXJhdG9ycyBhcmUgYWxzbyBtb3ZlCisJd2l0aCB0aGUgY29udGFpbmVyIGNvbnRlbnRzLgorCisJKiBzdGxwb3J0L3N0bC9fbGlzdC5oLCBfc2xpc3QuaCwgX3RyZWUuaDogTWFkZSBpdGVyYXRvciBzdHJ1Y3QKKwljb25zdHJ1Y3RvciBmcm9tIGJhc2UgY2xhc3MgcG9pbnRlciBleHBsaWNpdCB0byBmb3JiaWQgZXhwcmVzc2lvbgorCWxpa2U6IGxpc3QuYmVnaW4oKSA9PSAwLgorCisJKiBzdGxwb3J0L3N0bC9wb2ludGVycy9fc2xpc3QuaCwgX2xpc3QuaCwgX3NldC5oOiBGaXggaW1wbGVtZW50YXRpb24KKwl0aGF0IHdhcyB1c2luZyBmb3JtZXIgaW1wbGljaXQgY29udHJ1Y3RvciBmcm9tIHBvaW50ZXIgdG8gYmFzZSBjbGFzcy4KKworCSogc3JjL2NfbG9jYWxlX3dpbjMyL2NfbG9jYWxlX3dpbjMyLmM6IEZpeCBpbXBsZW1lbnRhdGlvbiBmb3IKKwljb21waWxlcnMgY29taW5nIHdpdGggYSBuYXRpdmUgbGliIGltcGxlbWVudGluZyBzZWN1cmUgQyBmdW5jdGlvbnMKKwlsaWtlIHN0cm5jcHlfcy4KKworCSogc3JjL2lvc3RyZWFtLmNwcDogSGlkZSBJL08gc3RyZWFtcyBkZWNsYXJhdGlvbiB3aGVuIGRlZmluaW5nCisJdGhlbSB3aGVuIGNvbXBpbGVyIGhhcyBubyBzdXBwb3J0IGZvciByZW1vdmluZyBJL08gc3RyZWFtcworCWZyb20gc3RhdGljIGdsb2JhbCB2YXJpYWJsZSBpbml0aWFsaXphdGlvbiBzZWdtZW50LiBBdm9pZCB0aGUKKwlzdGRpb19pc3RyZWFtYnVmIHVzaW5nIGRpcmVjdGl2ZSB3aGVuIHdlIGRvIG5vdCB1c2UgU1RMcG9ydAorCXByaXZhdGUgbmFtZXNwYWNlLgorCisJKiBzdGxwb3J0L3N0bC9fcm9wZS5oLCBfcm9wZS5jOiBVc2UgaW50ZXJuYWwsIG5vdCBfU1RMUF9OT19FWFRFTlNJT05TCisJZGVwZW5kYW50IGZ1bmN0aW9ucyBmb3IgaW1wbGVtZW50YXRpb24uCisKKwkqIHN0bHBvcnQvcm9wZSwgaGFzaF9tYXAsIGhhc2hfc2V0OiBBZGQgX1NUTFBfTk9fRVhURU5TSU9OUyBjaGVjaworCXRoYXQgZ2VuZXJhdGUgYSAjZXJyb3IgaWYgZGVmaW5lZCBhcyB0aG9zZSBoZWFkZXJzIGFyZSBTVExwb3J0CisJZXh0ZW5zaW9ucy4KKworCSogc3RscG9ydC9fdW5pbml0aWFsaXplZC5oOiBBZGQgX191bmluaXRpYWxpemVkX2NvcHlfbiBubyBkZXBlbmRhbnQKKwlhZ2FpbnN0IF9TVExQX05PX0VYVEVOU0lPTlMgZm9yIHJvcGUgaW1wbGVtZW50YXRpb24uCisKKwkqIHRlc3QvdW5pdDogTWFkZSB0ZXN0cyBvayB0byBidWlsZCBldmVuIHdoZW4gX1NUTFBfTk9fRVhURU5TSU9OUyBvcgorCV9TVExQX05PX0FOQUNIT05JU00gb3IgX1NUTFBfTk9fQ1VTVE9NX0lPIGlzIGRlZmluZWQuCisKKwkqIHN0bHBvcnQvc3RsL19udW1fcHV0LmgsIF9udW1fZ2V0Lmg6IEZpeCBkZWZpbml0aW9uIHNjb3BlIG9mCisJX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFIHRoYXQgd2FzIHdyb25nIHdoZW4gX1NUTFBfTk9fQ1VTVE9NX0lPCisJaXMgZGVmaW5lZC4KKworCSogc3RscG9ydC9zdGwvYm9vc3RfdHlwZV90cmFpdHMuaDogRml4ZWQgX0lzUmVmIGltcGxlbWVudGF0aW9uIGJhc2VkCisJb24gYm9vc3QgdHlwZSB0cmFpdHMgZmVhdHVyZS4KKworCSogYnVpbGQvbm1ha2UvZXh0ZXJuLm1haywgbGliL21zdmMubWFrLCB0ZXN0L3VuaXQvbXN2Yy5tYWssCisJdGVzdC9laC9tc3ZjLm1hazogTW92ZWQgaW5qZWN0aW9uIG9mIGJvb3N0IGluY2x1ZGUgcGF0aCBmb3IgYWxsIHRhcmdldHMKKwlpbiBleHRlcm4ubWFrLiBBbHNvIHJlbW92ZWQgYSB1c2VsZXNzIGRvdWJsZSBxdW90ZSBhcyBtYWtlIHZhcmlhYmxlIGFscmVhZHkKKwljb250YWlucyBpdC4KKworCSogc3RscG9ydC9zdGwvY29uZmlnL19iYy5oLCB0ZXN0L3VuaXQvZmxvYXRpb190ZXN0LmNwcCwgY21hdGhfdGVzdC5jcHAsCisJbGltaXRfdGVzdC5jcHA6IEJvcmxhbmQgcGF0Y2ggZnJvbSBFcmljIFNhbmZvcmQuCisKKwkqIHRlc3QvdW5pdC9zdHJpbmdfdGVzdC5jcHA6IEFkZCB0ZW1wbGF0ZV93ZXhwcmVzc2lvbiB0ZXN0IHRvIGNoZWNrCisJd3N0cmluZyB0ZW1wbGF0ZSBleHByZXNzaW9uLgorCisyMDA2LTAxLTA1ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL19zdGRleGNlcHQuaDogRml4IF9fTmFtZWRfZXhjZXB0aW9uIGRlc3RydWN0b3IKKwlpbXBsZW1lbnRhdGlvbiB3aGVuIF9TVExQX05PX0lPU1RSRUFNUyBpcyBkZWZpbmVkIG9yIHdoZW4KKwlzZWN1cml6ZWQgQyBmdW5jdGlvbiBzdHJjcHlfcyBleGlzdHMuCisKKwkqIHN0bHBvcnQvc3RsL3BvaW50ZXJzL19zZXQuaDogRml4ZWQgaW1wbGVtZW50YXRpb24gYXMgX0lkZW50aXR5CisJaXMgbm93IGluIHByaXZhdGUgbmFtZXNwYWNlIGFuZCBjb25zdF9yZXZlcnNlXyogZnVuY3Rpb25zIG11c3QKKwlyZXR1cm4gY29uc3RfcmV2ZXJzZV8qIGl0ZXJhdG9ycyBhbmQgbm90IHNpbXBseSByZXZlcnNlXyouCisKKwkqIHRlc3QvdW5pdC9iY29tcG9zX3Rlc3QuY3BwLCBiaW5kX3Rlc3QuY3BwOiBNYWRlIHRoZSB0ZXN0cyB1c2FibGUKKwl3aGVuIF9TVExQX05PX0VYVEVOU0lPTlMgaXMgZGVmaW5lZC4KKworCSogYnVpbGQvbGliL2NvbmZpZ3VyZS5iYXQ6IEZpeCBuYW1lIG9mIG1zdmM4IGNvbXBpbGVyLgorCisJKiB0ZXN0L3VuaXQvbWZ1bnB0cl90ZXN0LmNwcDogSWdub3JlIGZpbmQgdGVzdCB3aGVuIG5vIGNsYXNzCisJcGFydGlhbCB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiByYXRoZXIgdGhhbiBjb21tZW50aW5nIGl0LgorCisJKiB0ZXN0L3VuaXQvdHlwZV90cmFpdHNfdGVzdC5jcHA6IERpdHRvIGZvciByZWZlcmVuY2VfdHlwZSB0ZXN0LgorCisJKiBidWlsZC9NYWtlZmlsZXMvbm1ha2UvdG9wLm1hazogRml4ZWQgaW5zdGFsbC1zaGFyZWQgZGVmaW5pdGlvbi4KKworCSogYnVpbGQvTWFrZWZpbGVzL2dtYWtlL2djYy5tYWs6IEFkZCBfU1RMUF9VU0VfU1RBVElDX0xJQiB3aGVuCisJYnVpbGRpbmcgYW5kIHVzaW5nIFNUTHBvcnQgc3RhdGljIGxpYiB1bmRlciBNaW5HVy9DeWd3aW4uCisKKzIwMDYtMDEtMDQgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3JjL2FjcXVpcmVfcmVsZWFzZS5oOiBOZXcgZmlsZSwgZXhwb3NlIF9fYWNxdWlyZV8qCisJZnVuY3Rpb25zIHVzZWQgaW4gZGlmZmVyZW50IHRyYW5zbGF0aW9uIHVuaXQuCisKKwkqIHNyYy9udW1fcHV0Lmg6IFJlbW92ZWQsIGNvbnRlbnQgbW92ZWQgdG8gbnVtX3B1dC5jcHAgdGhhdAorCXdhcyB0aGUgb25seSB0cmFuc2xhdGlvbiB1bml0IHVzaW5nIGV4cG9zZWQgZnVuY3Rpb25zLgorCisJKiBzcmMvKjogQnVpbGQgd2l0aCBJbnRlbCBDKysgOSBjb21waWxlciByZXZlYWwgdGhhdCBtYW55CisJc3RhdGljIHNwZWNpZmljYXRpb24gd2FzIG1pc3NpbmcuCisKKwkqIHNyYy9jdHlwZS5jcHA6IEZpbHRlciBvdXQgX1dDaGFySW5kZXhUIHNwZWNpYWxpemF0aW9uIGZvcgorCUludGVsIGNvbXBpbGVyIHRoYXQgY29uc2lkZXIgd2NoYXJfdCBhcyB1bnNpZ25lZCwgZml4ZWQgYQorCXdhcm5pbmcuCisKKwkqIF9TVExQX1NUQVRJQ19BU1NFUlQgaXMgbm93IGNhbGxlZCB3aXRob3V0IHRyYWlsaW5nICc7JyB0aGF0CisJaXMgYWxyZWFkeSBpbiB0aGUgbWFjcm8gZGVmaW5pdGlvbi4KKworCSogc3JjLyo6IFJlbW92ZWQgcmVmZXJlbmNlIHRvIF9TZ0kgbmFtZXNwYWNlIHJlcGxhY2VkIGJ5IHRoZQorCVNUTHBvcnQgcHJpdmF0ZSBuYW1lc3BhY2UuCisKKwkqIHNyYy9pb3N0cmVhbS5jcHA6IEFkZCBpb3N0cmVhbSBpbmNsdWRlIHRvIGV4cG9zZSBjb3V0LCBjaW4sIGNlcnIKKwlkZWZpbml0aW9uIHRvIGRlY2xhcmF0aW9uLgorCisyMDA2LTAxLTAzICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL2NvbmZpZy9fZ2NjLmg6IEZvcmNlIHVzZSBvZiBuZXcvZGVsZXRlIGJhc2VkCisJYWxsb2NhdG9yIHVuZGVyIEN5Z3dpbi9NaW5HVywgZGVmYXVsdCBub2RlIGFsbG9jYXRvciBoYXMKKwlwcm9ibGVtIGJlY2F1c2UgX19ub2RlX2FsbG9jYXRvciBzdGF0aWMgZGF0YXMgYXJlIHNvbWV0aW1lcworCWR1cGxpY2F0ZWQgaW4gYSBkbGwgY29udGV4dC4KKworMjAwNi0wMS0wMSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2UvbGliL2djYy5tYWssIHN0bHBvcnQvc3RsL2NvbmZpZy9fZ2NjLmg6CisJQ2hhbmdlIHdheSBvZiBidWlsZGluZyBkbGwgd2l0aCBDeWd3aW4vTWluR1cuIE5vIG1vcmUgZXhwb3J0IG9mCisJYWxsIHN5bWJvbHMsIHdlIHVzZSBkbGxleHBvcnQgc3BlY2lmaWNhdGlvbiwgbWFrZXMgaW1wb3J0IGxpYgorCXJlYWxseSBzaG9ydGVyIGFuZCBkbGwgdG9vLiBNb3Jlb3ZlciB1c2Ugb2YgdGhlCisJZW5hYmxlLWF1dG8taW1hZ2UtYmFzZSBsaW5rZXIgb3B0aW9uIHRvIG1ha2UgbG9hZCBvZiBkbGwgZmFzdGVyLgorCisJKiBzdGxwb3J0L3N0bC9fdGltZV9mYWNldHMuYywgX251bV9wdXQuYywgX251bV9nZXQuYywgX21vbmV0YXJ5LmMsCisJZGVidWcvX2RlYnVnLmM6IEFkYXB0IGV4aXN0aW5nIEN5Z3dpbi9NaW5HVyB3b3JrYXJvdW5kIGZvciBuZXcKKwl3YXkgb2YgZ2VuZXJhdGluZyBkbGxzLgorCisyMDA1LTEyLTMxICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIGRvYzogQWRkIEJvcmxhbmQgZG9jIGFuZCB1cGRhdGUgY3lnd2luLCBtaW5ndyBhbmQgbXN2Yy4KKworCSogYnVpbGQvbGliL1JFQURNRS5vcHRpb25zOiBSZW1vdmVkLCByZXBsYWNlZCBieSBjb25maWdydXJlCisJc2NyaXB0LgorCisJKiBidWlsZC90ZXN0L2VoL2JjYy5tYWs6IEFkZGVkIHRvIGJ1aWxkIEVIIHRlc3RzIGZvciBCb3JsYW5kLgorCisyMDA1LTEyLTI5ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHNyYy9jX2xvY2FsZV93aW4zMi9jX2xvY2FsZV93aW4zMi5jOiBIaWRlIF9Mb2NhbGVfbWJ0b3djIGFuZAorCV9Mb2NhbGVfd2N0b21iIHdoZW4gbm8gd2NoYXJfdCBzdXBwb3J0IGlzIGRldGVjdGVkIHRoYW5rcyBFcmljCisJU2FuZm9yZC4KKworCSogc3JjL2NfbG9jYWxlX3dpbjMyL2NfbG9jYWxlX3dpbjMyLmM6IEFkZCBtYXBwaW5nIGZyb20gQm9ybGFuZAorCWZhY2V0IG1hY3JvcyB0byBTVExwb3J0IGFzc29jaWF0ZWQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGFycmF5IGluZGV4CisJdGhhbmtzIEVyaWMgU2FuZm9yZC4gCisKKwkqIHN0bHBvcnQvc3RsL2NvbmZpZy9fZXZjLmg6IFBhdGNoIGZyb20gTWljaGFlbCBGaW5rIHRvIGdlbmVyYWxpemVkCisJdXNlIG9mIE91dHB1dERlYnVnU3RyaW5nIGZvciBXaW5kb3dzIENFIHdoZW4gd2UgbmVlZCB0byB0cmFjZQorCWluZm9ybWF0aW9uLgorCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2UvYmNjLm1haywgbGliL2JjYy5tYWssIGFwcC9iY2MubWFrOiBGaXgKKwlkZWZpbml0aW9uIG9mIFNUQVJUX09CSiB0aGFua3MgYXJtcGl0MzMKKworCSogYnVpbGQvTWFrZWZpbGVzLyo6IEdlbmVyYWxpemUgdXNlIG9mIGluc3RhbGwtc2hhcmVkIHJhdGhlciB0aGFuCisJbGlzdCBvZiBhbGwgc2hhcmVkIHJ1bGVzLCBpZGVtIGZvciBpbnN0YWxsLXN0YXRpYy4KKworMjAwNS0xMi0yNyAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bC9fc3RyaW5nX2lvLmM6IEdlbmVyYWxpemVkIHVzZSBvZiBfU1RMUF9TVEFUSUNfQVNTRVJUCisJbWFjcm8gcmF0aGVyIHRoYXQgaGFuZCB3cml0ZW4gc3RhdGljIGFzc2VydGlvbi4KKworCSogc3RscG9ydC9zdGwvX2ZzdHJlYW0uYywgX2lzdHJlYW0uYywgc3JjL2ZzdHJlYW0uY3BwLCBzdHJzdHJlYW0uY3BwOgorCUFkZCBzb21lIGNhc3QgdG8gYXZvaWQgQm9ybGFuZCBzdXNwaWNpb3VzIHBvaW50ZXIgYXJpdGhtZXRpYyB3YXJuaW5ncworCXRoYW5rcyBFcmljIFNhbmZvcmQuCisKKwkqIHN0bHBvcnQvc3RsL19saW1pdHMuYzogRml4IEJvcmxhbmQgZGVmaW5pdGlvbiBvZiBOYU5zIGFuZCBpbmZpbml0eQorCWZvciBsb25nIGRvdWJsZSB0aGFua3MgRXJpYyBTYW5mb3JkLgorCisJKiBzdGxwb3J0L3N0bC9jb25maWcvX3N5c3RlbS5oLCBfZ2NjLmg6IEZpeCBjb25maWcgZm9yIFdpbmRvd3MsIE1pbkdXCisJYW5kIEN5Z3dpbiBwbGF0Zm9ybXMuCisKKwkqIHN0bHBvcnQvc3RsL2NvbmZpZy9fd2luZG93cy5oOiBDYW4gbm93IGJlIGluY2x1ZGVkIGJ5IGEgcHVyZSBDCisJY29tcGlsZXIuCisKKwkqIHN0bHBvcnQvc3RsL2NvbmZpZy9fd2FybmluZ19vZmYuaDogUmVtb3ZlZCBzdXNwaWNpb3VzIHBvaW50ZXIKKwlhcml0aG1ldGljIHdhcm5pbmcgZm9yIEJvcmxhbmQgdGhhbmtzIEVyaWMgU2FuZm9yZC4KKworCSogc3RscG9ydC9zdGwvX2NvbnN0cnVjdC5oOiBSZW1vdmVkIG5vdyB1c2VsZXNzIEJvcmxhbmQgd29ya2Fyb3VuZC4KKworCSogc3JjL3N0ZGlvX3N0cmVhbWJ1Zi5jcHA6IERpdHRvLgorCisJKiBzdGxwb3J0L3N0bC9fYWxsb2MuaDogTm93IGFsbG9jYXRvciBpcyB0YWdnZWQgYXMgYW4gU1RMcG9ydCBjbGFzcworCWV2ZW4gd2l0aG91dCBwYXJ0aWFsIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIHN1cHBvcnQuIFRoaXMgaXMKKwluZWNlc3NhcnkgYmVjYXVzZSB0eXBlX3RyYWl0cyBpcyBzcGVjaWFsaXplZCBmb3IgYWxsb2NhdG9yPGNoYXI+LAorCWFsbG9jYXRvcjx3Y2hhcl90PiBhbmQgYWxsb2NhdG9yPHZvaWQqPiB3aGVuIHBhcnRpYWwgdGVtcGxhdGUKKwlzcGVjaWFsaXphdGlvbiBpcyBub3QgYXZhaWxhYmxlLgorCisJKiB0ZXN0L3VuaXQvYml0c2V0X3Rlc3QuY3BwOiBBZGQgdGVzdHMgZm9yIHRoZSBTVExwb3J0CisJYml0c2V0OjpfRmluZF9maXJzdCBleHRlbnNpb24uCisKKzIwMDUtMTItMjcgIFBldHIgT3Z0Y2hlbmtvdiAgPGNvbXBsZW1lbnRAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzcmMvaW5pdGlhbF9tYWs6IG9ic29sZXRlIG1ha2VzIHJlbW92ZWQgKHN5bmMgd2l0aCBTVExQT1JUXzVfMAorCWJyYW5jaCkuCisKKzIwMDUtMTItMjQgIFBldHIgT3Z0Y2hlbmtvdiAgPGNvbXBsZW1lbnRAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzdGxwb3J0L3N0bC9jb25maWcvX2djYy5oOiBnY2MsIGJ1aWxkZWQgYnkgQXBwbGUgaXMgZGlmZmVyCisJaW4gYmVoYXZpb3IgZnJvbSBvcmlnaW5hbDsgaW4gcGFydGljdWxhciwgaW4gcGF0aCB0byBpbmNsdWRlczsKKworCSogYnVpbGQvTWFrZWZpbGVzL2dtYWtlL2FwcC9nY2MubWFrOiBmaXggZ2NjIG9wdGlvbnMgb24gTWFjT1MgWDsKKwlTVExwb3J0IGlzIGZyZWUgZnJvbSBsaWJzdGRjKysgb24gTWFjT1Mgbm93OworCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2UvZ2NjLm1hazogZml4IGdjYyBvcHRpb25zIG9uIE1hY09TIFg7IGdjYywKKwlidWlsZGVkIGJ5IEFwcGxlIGlzIGRpZmZlciBpbiBiZWhhdmlvciBmcm9tIG9yaWdpbmFsOworCWRldGVjdCB0aGlzOworCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2UvbGliL2djYy5tYWs6IGZpeCBnY2Mgb24gTWFjT1MgWDsKKwlkaWZmZXJlbnRpYXRlIGdjYyBmcm9tIEFwcGxlIGFuZCBvcmlnaW5hbDsKKwlTVExwb3J0IGlzIGZyZWUgZnJvbSBsaWJzdGRjKysgb24gTWFjT1MgWCBub3c7CisKKwkqIGJ1aWxkL01ha2VmaWxlcy9nbWFrZS9kYXJ3aW4vcnVsZXMtc28ubWFrOiB1c2UgCisJZ2NjIGluc3RlYWQgb2YgYysrIGZvciBsaW5rYWdlLCBpZiBvbmx5IEMgc291cmNlcyBwcmVzZW50LgorCisJKiBidWlsZC9saWIvZ2NjLm1haywgYnVpbGQvdGVzdC91bml0L2djYy5tYWs6IHJlbW92ZSBkdXBsaWNhdGlvbgorCW9mIHN0bHBvcnQgaW5jbHVkZXMuCisKKzIwMDUtMTItMjIgIFBldHIgT3Z0Y2hlbmtvdiAgPGNvbXBsZW1lbnRAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzdGxwb3J0L3N0bC9jb25maWcvX3dpbmRvd3MuaDogYWxsIHN5c3RlbSBzcGVjaWZpYyBjb25maWd1cmF0aW9uCisJaW4gb25lIHBsYWNlIFttb3ZlZCBmcm9tIHN0bHBvcnQvc3RsL193aW5kb3dzLmhdCisKKwkqIHN0bHBvcnQvc3RsL193aW5kb3dzLmg6IGRlbGV0ZWQ7IGFsbCBzeXN0ZW0gc3BlY2lmaWMgY29uZmlndXJhdGlvbgorCWluIG9uZSBwbGFjZSBbbW92ZWQgdG8gc3RscG9ydC9zdGwvY29uZmlnL193aW5kb3dzLmhdCisJCisJKiBzdGxwb3J0L3N0bC9kZWJ1Zy9fZGVidWcuYywgc3RscG9ydC9zdGwvX3RocmVhZHMuaDoKKwlfd2luZG93cy5oIGluY2x1ZGVkIHZpYSBfcHJvbG9nLmggW2kuZS4gdmlhIHN0bC9jb25maWcvX3N5c3RlbS5oXSwKKwlzZWUgY2hhbmdlcyBhYm92ZS4KKworCSogc3RscG9ydC9zdGwvY29uZmlnL19zdW5wcm9jYy5oOiByZW1vdmUgaW5jbHVkZSBvZiBfc29sYXJpcy5oLS0taXQKKwlhbHJlYWR5IGluY2x1ZGVkIGZyb20gX3N5c3RlbS5oCisKKwkqIHN0bHBvcnQvc3RsL2NvbmZpZy9fa2FpLmg6IHJlbW92ZSBpbmNsdWRlIG9mIG9zIGNvbmZpZ3VyYXRpb24gZmlsZXMsCisJaXQgc2hvdWxkIGJlIGluY2x1ZGVkIGZyb20gX3N5c3RlbS5oCisKKwkqIHN0bHBvcnQvc3RsL2NvbmZpZy9faW50ZWwuaDogZml4IHBhdGggYWZ0ZXIgY29uZmlnIGhlYWRlcnMKKwlyZW9yZ2FuaXphdGlvbi4KKworCSogc3RscG9ydC9zdGwvY29uZmlnL19ldmMuaDogaWRlbQorCisJKiBzdGxwb3J0L3N0bC9fZXhjZXB0aW9uLmg6IGlkZW0KKworCSogc3RscG9ydC9zdGwvY29uZmlnL19wcm9sb2cuaDogaWRlbQorCisJKiB0ZXN0L3VuaXQvZnN0cmVhbV9oZWFkZXJfdGVzdC5jcHA6IGlkZW0KKworCSogdGVzdC91bml0L2lvbWFuaXBfaGVhZGVyX3Rlc3QuY3BwOiBpZGVtCisKKwkqIHRlc3QvdW5pdC9pb3NfaGVhZGVyX3Rlc3QuY3BwOiBpZGVtCisKKwkqIHRlc3QvdW5pdC9pb3N0cmVhbV9oZWFkZXJfdGVzdC5jcHA6IGlkZW0KKworCSogdGVzdC91bml0L2lzdHJlYW1faGVhZGVyX3Rlc3QuY3BwOiBkaXR0bworCisJKiB0ZXN0L3VuaXQvbG9jYWxlX2hlYWRlcl90ZXN0LmNwcDogaWRlbQorCisJKiB0ZXN0L3VuaXQvb3N0cmVhbV9oZWFkZXJfdGVzdC5jcHA6IGlkZW0KKworCSogdGVzdC91bml0L3NzdHJlYW1faGVhZGVyX3Rlc3QuY3BwOiBpZGVtCisKKwkqIHRlc3QvdW5pdC9zdHJzdHJlYW1faGVhZGVyX3Rlc3QuY3BwOiBpZGVtCisKKzIwMDUtMTItMjEgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3RscG9ydC9zdGwvZGVidWcvX2RlYnVnLmgsIF9kZWJ1Zy5jLCBfc3RyaW5nX3N1bV9tZXRob2RzLmg6CisJUmVtb3ZlZCBzb21lIHVudXNlZCBwYXJhbWV0ZXJzIHJlcG9ydGVkIGJ5IEJvcmxhbmQgY29tcGlsZXIuCisKKwkqIHN0bHBvcnQvc3RsL2NvbmZpZy9fd2FybmluZ3Nfb2ZmLmg6IERpc2FibGUgdW51c2VkIHBhcmFtZXRlcnMKKwl3YXJuaW5nIGZvciBCb3JsYW5kIGNvbXBpbGVyLgorCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2UvdGFyZ2V0ZGlycy5tYWs6IENoYW5nZSBjb25maWcgaW4gb3JkZXIgdG8KKwloYXZlIGVhY2ggZ2VuZXJhdGVkIGFwcGxpY2F0aW9uIGluIGEgZGlmZmVyZW50IGJpbiBmb2xkZXIuCisKKwkqIHN0bHBvcnQvc3RsL190aHJlYWRzLmg6IFVzZWQgX1NUTFBfU1RBVElDX0FTU0VSVCBtYWNybyBmb3IgYQorCXN0YXRpYyBhc3NlcnRpb24uCisKKzIwMDUtMTItMTkgIFBldHIgT3Z0Y2hlbmtvdiAgPGNvbXBsZW1lbnRAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2UvbGliL2djYy5tYWs6IG1vdmUgTERTRUFSQ0ggZmxhZ3MgYWZ0ZXIKKwlwb3NzaWJsZSAtbm9zdGRsaWIKKworCSogYnVpbGQvbGliL2djYy5tYWs6IGRvbid0IGFkZCBpbmNsdWRlIHBhdGgsIGl0IGFscmVhZHkgaW5jbHVkZWQuCisKKwkqIHNyYy9jX2xvY2FsZS5oOiBpbmNsdWRlIHN0bHBvcnRfcHJlZml4LmggdG8gYWRkIFNUTHBvcnQncworCWRlZmluaXRpb25zIHRoYXQgdXNlZCBiZWxvdy4KKworCSogc3RscG9ydC9zdGxfdXNlcl9jb25maWcuaCwgc3RscG9ydC9zdGwvX2NvbmZpZy5oOiBtb3ZlZCAKKwl0byBzdGxwb3J0L3N0bC9jb25maWcgY2F0YWxvZyBhbmQgcmVuYW1lZC4KKworCSogc3RscG9ydC9zdGwvX2NvbmZpZ19jb21wYXQuaCwgc3RscG9ydC9zdGwvX3NpdGVfY29uZmlnLmg6IGRpdHRvLgorCisJKiBzdGxwb3J0L2NvbmZpZzogaGVhZGVycyBtb3ZlZCB0byBzdGxwb3J0L3N0bC9jb25maWcgY2F0YWxvZywKKwlyZW5hbWVkIGFuZCByZW9yZ2FuaXplZC4KKworCSogc3RscG9ydC9zdGwvX3Byb2xvZy5oLCBzdGxwb3J0L3N0bC9fZXBpbG9nLmgsIHNyYy9zdGxwb3J0X3ByZWZpeC5oOgorCXJlZmxlY3QgY2hhbmdlcyBpbiBjb25maWd1cmF0aW9uIGZpbGVzLgorCisyMDA1LTEyLTE3ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL19jb25maWcuaDogUmVtb3ZlZCAnOycgaW4gX1NUTFBfU1RBVElDX0FTU0VSVAorCWRlZmluaXRpb24uCisKKwkqIHN0bHBvcnQvc3RsL19jd2N0eXBlLmg6IEZpeCBuYXRpdmUgbmFtZXNwYWNlIG9mIHdpZGUgY2hhciBmdW5jdGlvbnMKKwlmb3IgTWluR1cgcnVudGltZSA8PSAzLjAuIEFsc28gZml4IGEgdHlwbyBmb3IgRnJlZUJEUy4KKworCSogc3JjL3N0ZGlvX3N0cmVhbWJ1Zi5jcHA6IEFkZCBtaXNzaW5nICdkZWZpbmVkJyB3aGVuIGNoZWNraW5nCisJX19PUzQwMF9fIG1hY3JvIGV4aXN0YW5jZS4KKworCSogdGVzdC91bml0L3Jlc29sdmVfbmFtZS5jcHAsIHNldF90ZXN0LmNwcDogUmVtb3ZlZCB1c2VsZXNzICc7JworCXJlcG9ydGVkIGJ5IHJlbWFya3MgZnJvbSBJbnRlbCBDKysgY29tcGlsZXIuCisKKzIwMDUtMTItMTYgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3RscG9ydC9zdGwvX3JvcGUuaDogTW92ZWQgb3ZlcmxvYWQgb2YgX19pZGVudGl0eV9lbGVtZW50IGZvcgorCV9Sb3BlX0NvbmNhdF9mbiBpbiBTVExwb3J0IHByaXZhdGUgbmFtZXNwYWNlIHdoZXJlIG9yZ2luYWwgZnVuY3Rpb24KKwlkZWNsYXJhdGlvbiBpcy4gQWxzbyBtb3ZlZCBfUm9wZV9Db25jYXRfZm4gYXQgdGhlIHNhbWUgdGltZSwgbXVjaCBtb3JlCisJbWFueSBlbGVtZW50cyBvZiBfcm9wZS5oIHNob3VsZCBiZSBtb3ZlZCB0byB0aGlzIG5hbWVzcGFjZS4uLgorCisJKiBzdGxwb3J0L3N0bC9fbW9uZXRhcnkuYzogQ2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIF9fbW9uZXlfZG9fcHV0IGZvcgorCUJvcmxhbmQgY29tcGlsZXIsIGxvb2tzIGxpa2UgdGhpcyBjb21waWxlciBkbyBub3QgbGlrZSB0ZXJuYXJ5IG9wZXJhdG9yLgorCisJKiBzcmMvY19sb2NhbGVfd2luMzIvY19sb2NhbGVfd2luMzIuYzogUmVwbGFjZSBjaGVjayBvZiBjYXRlZ29yeSBpbgorCV9fRXh0cmFjdF9sb2NhbGVfbmFtZSBmcm9tID4gTENfQUxMIGJ5ICE9IExDX0FMTCwgdGhlcmUgaXMgbm8gcmVhc29uCisJZm9yIExDX0FMTCB0byBiZSB1cHBlciBvciBsb3dlciB0byBhbGwgb3RoZXIgY2F0ZWdvcmllcy4KKworCSogYnVpbGQvTWFrZWZpbGVzL2dtYWtlL2N5Z21pbmcvcnVsZXMtc28ubWFrOiBTZWdyZWdhdGUgZGlmZmVyZW50CisJY29tcGlsZXJzIGxpbmtlciBjYWxscyBhbmQgYWRkIHJlZmVyZW5jZSB0byBTVEFSVF9PQkogaW4gQm9ybGFuZAorCWxpbmtlciBpbnZvY2F0aW9uLgorCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2UvbGliL3J1bGVzLWEubWFrLCBjeWdtaW5nL3RhcmdldHN5cy5tYWs6IEJvcmxhbmQKKwlhcmNoaXZlciBhZGQgb3B0aW9uIGlzIG5vdyAnKycsIGJlZm9yZSBiZWluZyBpbnZvY2F0ZWQgYXJjaGl2ZSBpcyBhbHdheXMKKwlkZWxldGVkIHRvIGF2b2lkIHdhcm5pbmdzIGJlY2F1c2UgdGhlIEJvcmxhbmQgYXJjaGl2ZXIgZG8gbm90IGhhdmUgYQorCXJlYWwgYWRkIG9yIHJlcGxhY2UgbW9kdWxlIG9wdGlvbi4KKworCSogc3RscG9ydC9zdGwvdHlwZV90cmFpdHMuaDogRml4IGZvciBjb21waWxlciBzaW11bGF0aW5nIHBhcnRpYWwKKwl0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiAoVkM2KQorCisJKiB0ZXN0L2VoL3Rlc3Rfcm9wZS5jcHA6IFJlbW92ZWQgcm9wZSB0ZXN0IGZvciBCb3JsYW5kLgorCisJKiB0ZXN0L3VuaXQvZXhjZXB0aW9uX3Rlc3QuY3BwOiBDb21tZW50ZWQgdGVzdHMgYXJlIG5vdyBpZ25vcmVkLgorCisJKiB0ZXN0L3VuaXQvbG9jYWxlX3Rlc3QuY3BwLCBzdHJpbmdfdGVzdC5jcHA6IE5vIG1vcmUgaWdub3JlZCB0ZXN0CisJZm9yIEJvcmxhbmQuCisKKzIwMDUtMTItMTQgIFBldHIgT3Z0Y2hlbmtvdiAgPGNvbXBsZW1lbnRAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2Uvc3lzaWQubWFrOiBwYXJzZSB0d28tdG9rZW4gdGFyZ2V0CisJc3lzdGVtIGlkZW50aWZpY2F0aW9uIHN0cmluZyBhbG9uZyB3aXRoIHRocmVlLXRva2VuIG9uZQorCVt1c2VmdWwgd2hlbiB2ZW5kb3IgaXMgb21pdHRlZF07IHRoYW5rcyBKb25hdGhhbiBTcHJpbmtsZS4KKworCSogc3RscG9ydC9jd2N0eXBlLCBzdGxwb3J0L3N0bC9fY3djdHlwZS5oOiB3Y3R5cGVfdCBhbmQKKwlvdGhlcnMgYXJlIGluIGdsb2JhbCBuYW1lc3BhY2Ugb24gRnJlZUJTRC4KKworCSogYnVpbGQvTWFrZWZpbGVzL2dtYWtlL2FwcC9nY2MubWFrLCBsaWIvZ2NjLm1hazogdXNlIGJ1aWxkCisJd2l0aCAtbm9zdGRsaWIgb24gU29sYXJpcy4KKworCSogc3JjL2N4YS5jOiBmaXggZm9yIFNvbGFyaXMKKworCSogc3RscG9ydC9jb25maWcvc3RsX3NvbGFyaXMuaCwgc3RscG9ydC9zdGwvX2NtYXRoLmg6CisJaG1tLCBzdHJhbmdlLi4uIHNvbWV0aW1lcyBNQVRIX0wgYW5kIE1BVEhfRiBwcmVzZW50IG9uIFNvbGFyaXMsCisJc29tZXRpbWVzIG5vdC4uLgorCisyMDA1LTEyLTE0ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHRlc3QvdW5pdC9jcHB1bml0L2NwcHVuaXRfbWluaS5oLCBmaWxlX3JlcG9ydGVyLmg6IEFkZCBpZ25vcmUKKwl0ZXN0IGZlYXR1cmUsIG5vdyB0ZXN0cyBzaG91bGQgYmUgaWdub3JlZCByYXRoZXIgdGhhbiBjb21tZW50ZWQuCisJMiBuZXcgbWFjcm9zIGZvciB0aGF0IENQUFVOSVRfSUdOT1JFIHRvIGFkZCBpbiB0ZXN0cyBkZWNsYXJhdGlvbiwKKwlhbGwgdGVzdCBmb2xsb3dpbmcgdGhpcyBtYWNybyB3b24ndCBiZSBydW47IENQUFVOSVRfU1RPUF9JR05PUkUKKwlvcHRpb25hbCBtYWNybyB0byBzdG9wIGlnbm9yaW5nIHRlc3RzLgorCisJKiB0ZXN0L3VuaXQvZnN0cmVhbV90ZXN0LmNwcDogSWdub3JlIGN1c3RvbV9mYWNldCB0ZXN0IHdoZW4gbm90CisJc3VwcG9ydGVkIHJhdGhlciB0aGFuIGNvbW1lbnQgaXQuCisKKwkqIHRlc3QvdW5pdC9oYXNoX3Rlc3QuY3BwOiBJZ25vcmUgaG1hcDEgdGVzdCBmb3IgQm9ybGFuZCBhbmQgRGlnaXRhbAorCU1hcnMgY29tcGlsZXJzLCBsb29rcyBsaWtlIHJvcGUgY2xhc3MgaXMgdG9vIGNvbXBsaWNhdGVkIGZvciB0aG9zZQorCWNvbXBpbGVycy4KKworCSogdGVzdC91bml0L2xvY2FsZV90ZXN0LmNwcDogSWdub3JlIGxvY2FsZV9ieV9uYW1lIHRlc3QgZm9yIGNvbXBpbGVyCisJd2l0aG91dCBleGNlcHRpb25zIHN1cHBvcnQuIElnbm9yZSBtb25leSBmYWNldCB0ZXN0cyBmb3IgQm9ybGFuZC4KKworCSogdGVzdC91bml0L212Y3Rvcl90ZXN0LmNwcCwgcm9wZV90ZXN0LmNwcDogU29tZSB0ZXN0cyBpZ25vcmVkCisJZGVwZW5kaW5nIG9uIHZhcmlvdXMgY29uZmlndXJhdGlvbiBzZXR0aW5ncy4KKworCSogdGVzdC91bml0L3R5cGVfdHJhaXRzLmNwcDogQWRkIHRlc3QgZm9yIF9Jc1NUTHBvcnRDbGFzcyBtZXRhcHJvZ3JhbW1pbmcKKwl0b29sLiBJZ25vcmVkIGZvciBCb3JsYW5kLgorCisJKiB0ZXN0L3VuaXQvdW5vcmRlcmVkX3Rlc3QuY3BwOiBGaXggdGVzdCBmb3IgRGlnaXRhbCBNYXJzLCB1bm9yZGVyZWQKKwljb250YWluZXJzIHZhbHVlX3R5cGUgYXJlIG5vdCBuZWNlc3NhcmlseSB3aXRoIGFuIGltbXV0YWJsZSBrZXksIGl0IGlzCisJbW9yZSBwb3J0YWJsZSB0byB1c2UgdmFsdWUgdHlwZSByYXRoZXIgdGhhbiByZWRlZmluaW5nIGl0IGluIHRoZSB0ZXN0LgorCisJKiB0ZXN0L3VuaXQvc3RyaW5nX3Rlc3QuY3BwOiBSZW1vdmVkIFdpbmRvd3MgQ0UgbWFjcm8gY2hlY2sgcmVwbGFjZWQKKwlieSBXYWl0Rm9yTXVsdGlwbGVPYmplY3RzIHJldHVybmVkIGNvZGUgY2hlY2ssIG1vcmUgcG9ydGFibGUgYW5kCisJbWFpbnRlbmFibGUuIElnbm9yZSBhIHRlc3QgZm9yIERpZ2l0YWwgTWFycyBjb21waWxlci4KKworCSogc3RscG9ydC9zdGwvdHlwZV9tYW5pcHMuaCwgdHlwZV90cmFpdHMuaDogU2ltcGxpZmllZCBtZXRhcHJvZ3JhbWluZworCXRvb2xzIGltcGxlbWVudGF0aW9uOyBub3cgYXZvaWQgY29tcGlsYXRpb24gY29uc3RhbnQgcmVwbGFjZWQgYnkKKwl0eXBlLCBCb3JsYW5kIGNvbXBpbGVyIGhhcyBwcm9ibGVtIHdpdGggY29uc3RhbnRzLgorCisJKiBzdGxwb3J0L2NvbmZpZy9zdGxfYmMuaDogTWFkZSBzdXBwb3J0ZWQgY29tcGlsZXIgY2hlY2sgbW9yZSBhY2N1cmF0ZQorCWZyZWUgY29tcGlsZXIgaXMgNS41LjEgc28gaXQgaXMgdGhlIG9sZGVzdCBzdXBwb3J0ZWQgdmVyc2lvbi4gQm9ybGFuZAorCWNvbXBpbGVyIGRvIG5vdCBzdXBwb3J0IElFQzU1OSBzcGVjaWZpY2F0aW9ucy4KKworCSogYnVpbGQvTWFrZWZpbGVzL2dtYWtlL2JjYy5tYWs6IFB1dCBzdGFydHVwIC5vYmogdG8gbGluayB3aXRoIGluCisJU1RBUlRfT0JKIHJhdGhlciB0aGFuIExETElCUywgdGhhbmtzIEVyaWMgU2FuZm9yZC4KKworCSogc3JjL2NfbG9jYWxlX3dpbjMyL2NfbG9jYWxlX3dpbjMyLmM6IFRlbXBvcmFyaWx5IHJlbW92ZWQgY2F0ZWdvcnkKKwljaGVjayBpbiBfX0V4dHJhY3RfbG9jYWxlX25hbWUgZnVuY3Rpb24gZm9yIEJvcmxhbmQsIGxvb2tzIGxpa2UgTENfQUxMCisJb3IgTENfTUFYIGhhcyBub3QgdGhlIHJpZ2h0IHZhbHVlLgorCisyMDA1LTEyLTEzICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHNyYy9jeGEuYzogQWRkIGluY2x1ZGUgb2Ygc3RscG9ydF9wcmVmaXguaCBmaXJzdCwgdGhpcyBmaWxlCisJc2hvdWxkIGJlIGFsd2F5cyBpbmNsdWRlZCBmaXJzdCBpbiBTVExwb3J0IHRyYW5zbGF0aW9uIHVuaXRzLAorCWl0IHByZXBhcmVzIHNvbWUgY29tcGlsZXJzIGNvbmZpZyBhbmQgZGVmaW5lIGltcG9ydGFudCBmb3IgV2lucworCV9fQlVJTERJTkdfU1RMUE9SVCBtYWNyby4KKworMjAwNS0xMi0xMyAgUGV0ciBPdnRjaGVua292ICA8Y29tcGxlbWVudEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGJ1aWxkL01ha2VmaWxlcy9nbWFrZS90YXJnZXRkaXJzLm1hazogYnVpbHQtaW4KKwl0ZXN0IGluIC9iaW4vc2ggb24gU29sYXJpcyBoYXMgbm8gLWUsIHVzZSBleHRlcm5hbCBpbnN0ZWFkLgorCisyMDA1LTEyLTExICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIGJ1aWxkL01ha2VmaWxlcy9nbWFrZS9iY2MubWFrIDogQWRkIC13LWVmZiB0byBkaXNhYmxlICd1c2VsZXNzJworCWNvZGUgd2FybmluZywgd2UgaGFkIHRvIGNob3NlIGJldHdlZW4gdGhpcyB3YXJuaW5nIGFuZCB0aGUgJ3VzZWQKKwlwYXJhbWV0ZXInIG9uZS4KKworCSogYnVpbGQvTWFrZWZpbGVzL2dtYWtlL3RhcmdldGRpcnMubWFrOiBSZW1vdmVkIGNvbW1lbnQgYWJvdXQgZm9sZGVyCisJY3JlYXRpb24gYWN0aW9uIHVuZGVyIHdpbmRvd3MgcGxhdGZvcm0uIFRoZSBhY3Rpb24gaXMgaWRlbnRpY2FsIHRvCisJdGhlIG9uZSB1c2VkIGluIHRoZSBubWFrZSBidWlsZCBzeXN0ZW0gYW5kIG5vIG9uZSBjb21wbGFpbnMgYWJvdXQgaXQKKwlzbyBjdXJyZW50IHNpdHVhdGlvbiBpcyBub3Qgc28gYmFkLiBPbmx5IHVzZXJzIG9mIFdpbmRvd3MgYmVmb3JlIFdpbmRvd3MKKwk5OCBzaG91bGQgZXBlcmltZW50IHRyb3VibGVzLCB0aGlzIGlzIGEga25vd24gbGltaXRhdGlvbi4KKworCSogYnVpbGQvTWFrZWZpbGVzL2dtYWtlL2RtYy5tYWssIGN5Z21pbmcvcnVsZXMtc28ubWFrOiBDaGFuZ2UgY29uZmlnLAorCW5vdyB3ZSBkaXJlY3RseSBpbnZva2UgdGhlIGxpbmtlciwgd2UgZG8gbm90IHVzZSBhIGNvbXBpbGVyIGNhbGwgZm9yIGl0LgorCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2UvYXBwL2JjYy5tYWs6IEZpeCBsaW5rZXIgb3B0aW9uIGluIG9yZGVyIHRvIGdlbmVyYXRlCisJYSB3aW5kb3dzIGV4ZWN1dGFibGUgYW5kIG5vdCBhIGRsbCwgdGhhbmtzIEVyaWMgU2FuZm9yZC4KKworCSogYnVpbGQvTWFrZWZpbGVzL2dtYWtlL2FwcC9ydWxlcy1pbnN0YWxsLm1hazogQWRkIGluc3RhbGwgZGlyIGRlcGVuZGVuY3kKKwlyYXRoZXIgdGhhbiBkb2luZyBhIGZvbGRlciBleGlzdGVuY2UgY2hlY2sgaW4gcnVsZXMgYWN0aW9ucy4KKworCSogYnVpbGQvTWFrZWZpbGVzL2dtYWtlL2FwcC9ydWxlcy5tYWs6IFJlc3RvcmUgc2xhc2ggcm90YXRpb24gZm9yIEJvcmxhbmQKKwlsaW5rZXIgaW52b2NhdGlvbiBhbmQgZml4IHN0YXRpYyBydWxlcyBkZXBlbmRlbmNpZXMgdG8gZ3VhcmFudHkgZm9sZGVyCisJY3JlYXRpb25zLgorCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2UvbGliL2JjYy5tYWs6IEFkZCBtaXNzaW5nIGFyY2hpdmVyIHBhZ2Ugc2l6ZSBwYXJhbWV0ZXJzLgorCisJKiBidWlsZC90ZXN0L3VuaXQvYmNjLm1hazogQWRkIF9TVExQX0RFQlVHX1VOSU5JVElBTElaRUQgZm9yIHN0YXRpYworCWRlYnVnIHJ1bGVzLgorCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2UvbGliL3J1bGVzLWEubWFrOiBTZWdyZWdhdGUgZWFjaCBhcmNoaXZlciBpbnZvY2F0aW9uLgorCisyMDA1LTEyLTA5ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIGJ1aWxkL2xpYi9jb25maWd1cmUuYmF0OiBBZGQgQm9ybGFuZCBjb21waWxlciB0byBjb21waWxlcnMKKwlhYmxlIHRvIG1peCBhIGRsbCBidWlsZCB3aXRoIGEgc3RhdGljIG5hdGl2ZSBydW50aW1lLgorCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2UvYmNjLm1haywgZG1jLm1hazogQ29tcGxldGUgbGlicyB0byBsaW5rCisJZGVwZW5kaW5nIG9uIFNUTHBvcnQgY29uZmlndXJhdGlvbi4KKworCSogYnVpbGQvTWFrZWZpbGVzL2dtYWtlL3RhcmdldGRpcnMubWFrOiByb2xsIGJhY2sgbW9kaWYgZnJvbSBQZXRyCisJMjAwNS0xMi0wOAorCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2UvdGFyZ2V0cy5tYWs6IGRpdHRvCisKKwkqIGJ1aWxkL01ha2VmaWxlcy9nbWFrZS9jeWdtaW5nL2xpYi5tYWs6IEZpeCBmb3Igc3RhdGljIGxpYnMgYnVpbGQKKwl3aXRoIGNvbXBpbGVyIGRpZmZlcmVudCB0aGFuIGdjYy4KKworCSogYnVpbGQvTWFrZWZpbGVzL2dtYWtlL2N5Z21pbmcvdGFyZ2V0c3lzLm1hazogQWRkIG1pc3NpbmcgaW5mbyBmb3IKKwlzdGF0aWMgbGlicyBidWlsZCB3aXRoIEJvcmxhbmQgYW5kIERpZ2l0YWwgTWFycyBjb21waWxlcnMuCisKKwkqIGJ1aWxkL01ha2VmaWxlcy9nbWFrZS9saWIvcnVsZXMtYS5tYWs6IEZpeCBzdGF0aWMgYnVpbGRzIGNvbW1hbmRzCisJdG8gdXNlIGluZm8gb2YgYWJvdmUgcG9pbnQuCisKKwkqIGJ1aWxkL01ha2VmaWxlcy9nbWFrZS9saWIvcnVsZXMtaW5zdGFsbC1hLm1hazogQWRkIGluc3RhbGwgcnVsZQorCWZvciB3aW5kb3dzIGFuZCBtaXNzaW5nIGNhdGFsb2cgaW4gZGVwZW5kZW5jeSB0cmVlLgorCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2Uvd2luZG93cy9ydWxlcy1pbnN0YWxsLXNvLm1hazogQWRkIG1pc3NpbmcKKwljYXRhbG9nIGRlcGVuZGVuY3kuCisKKzIwMDUtMTItMDkgIFBldHIgT3Z0Y2hlbmtvdiAgPGNvbXBsZW1lbnRAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBidWlsZC9saWIvTWFrZWZpbGUuaW5jOiBhZGQgY3hhLmMgaW50byBjb21waWxhdGlvbjsgdGhpcworCWlzIHVzZWZ1bCBmb3IgRnJlZUJTRCA0LjExIEMrKyBBQkkgd29ya2Fyb3VuZC4KKworCSogc3JjL2N4YS5jOiB1c2UgX2N4YV9hdGV4aXQgYW5kIHJlbGF0ZWQgZnVuY3Rpb25zIG9uCisJRnJlZUJTRCA0LjExIFt3b3JrYXJvdW5kIGZvciBtaXNzZWQgQysrIEFCSSBmdW5jdGlvbnNdLgorCisyMDA1LTEyLTA4ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL19hdXRvX3B0ci5oOiBBZGQgbWlzc2luZyBTdGFuZGFyZCB0aHJvdygpIHNwZWNpZmljYXRpb24KKwlvbiBhbGwgYXV0b19wdHIgbWVtYmVycy4KKworCSogc3RscG9ydC9jb25maWcvc3RsX215Y29tcC5oOiBSZW1vdmVkIHJlY2VudGx5IGludHJvZHVjZSBtYWNybworCV9TVExQX0RGTFRfUEFSQU1fSU5TVEFOQ0lBVElPTl9CVUcsIGFscmVhZHkgZXhpc3RpbmcgX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTQorCWlzIGVub3VnaCBmb3IgdGhlIG1vbWVudC4KKworCSogc3RscG9ydC9zdGwvX3N0cmVhbV9pdGVyYXRvci5oOiBTbWFsbCBpbXBsZW1lbnRhdGlvbiBjaGFuZ2UgdG8gbWFrZQorCURpZ2l0YWwgTWFycyBjb21waWxlciBoYXBweS4KKworCSogc3RscG9ydC9zdGwvX3Vub3JkZXJlZF9tYXAuaDogRGlnaXRhbCBNYXJzIGNvbXBpbGVyIGRvIG5vdCBsaWtlCisJaW1tdXRhYmxlIGtleXMgaW4gYXNzb2NpYXRpdmUgY29udGFpbmVycy4KKworMjAwNS0xMi0wOCAgUGV0ciBPdnRjaGVua292ICA8Y29tcGxlbWVudEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHN0bHBvcnQvY3R5cGUuaDogZm9yd2FyZC1kZWNsYXJhdGlvbiBmb3IgX2V4Y2VwdGlvbiBzdHJ1Y3QKKwlmb3IgV2luQ0UvZVZDMzsgcHJldmVudHMgd2FybmluZyBtZXNzYWdlCisJLi4vaW5jbHVkZS9zdGRsaWIuaCg4MTcpIDogd2FybmluZyBDNDExNToKKwknX2V4Y2VwdGlvbicgOiBuYW1lZCB0eXBlIGRlZmluaXRpb24gaW4gcGFyZW50aGVzZXMKKwlbTWljaGFlbCBGaW5rJ3Mgc3VnZ2VzdGlvbl0KKworCSogc3RscG9ydC9mbG9hdC5oLCBzdGxwb3J0L2xpbWl0cy5oLCBzdGxwb3J0L3NldGptcC5oOiBpZGVtLgorCisJKiBzdGxwb3J0L3N0ZGFyZy5oLCBzdGxwb3J0L3N0cmluZy5oLCBzdGxwb3J0L3N0ZGlvLmg6IGlkZW0uCisKKwkqIGJ1aWxkL01ha2VmaWxlcy9nbWFrZS9nY2MubWFrOiBjaGVjayBjb25maWd1cmF0aW9uIG1hY3JvCisJV0lUSE9VVF9TVExQT1JUIFt1c2VmdWwgZm9yIHRlc3RzXTsgZm9yY2UgdXNhZ2Ugb2Ygc3RscG9ydAorCWhlYWRlcnMgZmlyc3Qgb3RoZXJ3aXNlLgorCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2UvdGFyZ2V0ZGlycy5tYWs6IGZpeCBjYXRhbG9ncyBjcmVhdGlvbgorCXByb2NlZHVyZSBbbG9vcCB0aHJvdWdoIGNhdGFsb2dzIHJlcXVpcmVkXTsgY29tbWVudCBwcm9ibGVtYXRpYworCWNvZGUgd2hlbiB3ZSBoYXZlIG5vIGdvb2QgdG9vbHMuCisKKwkqIGJ1aWxkL01ha2VmaWxlcy9nbWFrZS9saWIvZ2NjLm1hazogZml4IHR5cG8gW0ZyZWVCU0RdOyBmaXgKKwlzZXQgb2YgbGlicmFyaWVzIHdoZW4gbGluayBmb3IgRnJlZUJTRDsgZml4IHR5cG8gaW4gbWFjcm8gbmFtZQorCVtGcmVlQlNEIGFnYWluXS4KKworCSogYnVpbGQvTWFrZWZpbGVzL2dtYWtlL2FwcC9nY2MubWFrOiBmaXggc2V0IG9mIGxpYnJhcmllcyB3aGVuCisJbGluayBmb3IgRnJlZUJTRDsgaW5zZXJ0IHN0bHBvcnQgbGliIGluIFNURExJQiBzZXQgW3doZW4gU1RMUE9SVAorCWluIGZvcmNlXSwgdG8gYXZvaWQgc2V0IG9uZSBpbiBhcHBsaWNhdGlvbidzIG1ha2VmaWxlLgorCisJKiBidWlsZC90ZXN0L3VuaXQvZ2NjLm1hazogZXhwbGljaXQgcmVmcmVuY2UgdG8gbGlic3RscG9ydCBpbgorCXRoaXMgbWFrZWZpbGUgbm90IHJlcXVpcmVkIG1vcmUgW3NlZSBtZXNzYWdlIGFib3ZlXS4KKworCSogYnVpbGQvTWFrZWZpbGVzL2dtYWtlL2xpYi9nY2MubWFrOiByZW1vdmUgbmFtZXMgaW5oZXJpdGVkIGZyb20KKwlDb21wbGVtZW50IHByb2plY3QuCisKKwkqIGJ1aWxkL01ha2VmaWxlcy9nbWFrZS8qL3J1bGVzLWluc3RhbGwtc28ubWFrOiBpbnN0YWxsYXRpb24KKwljYXRhbG9nIHdhcyBtaXNzZWQgaW4gZGVwZW5kZW5jeSB0cmVlOyBpZGVudCBzdHJpbmcgcmVtb3ZlZAorCXRvIHNpbXBsaWZ5IG1lcmdlL2RpZmYKKworCSogQnVpbGQ6IGJ1aWxkaW5nIGxpYnJhcnkgYW5kIHVuaXQgdGVzdHMgd2l0aCBjcm9zcyBbZ2NjIDMuNC41XQorCW9uIExpbnV4IGZvciBGcmVlQlNEIDUuMyAoZXhjZXB0IGN3Y3R5cGVfdGVzdCkuCisKKwkqIGJ1aWxkL01ha2VmaWxlcy9nbWFrZS90YXJnZXRzLm1hazogcm90YXRlIHNsYXNoZXMgZm9yIEJDQy4KKworCSogYnVpbGQvTWFrZWZpbGVzL2dtYWtlL2FwcC9tYWNyby5tYWs6IHJlbW92ZSBuYW1lIGNvbnRydWN0aW9uCisJZm9yIHByb2dyYW07IHJvdGF0ZSBzbGFzaGVzIGZvciB3aW5zLgorCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2UvYXBwL3J1bGVzLWluc3RhbGwubWFrOiByZW1vdmUgbmFtZQorCWNvbnRydWN0aW9uIGZvciBwcm9ncmFtLgorCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2UvYXBwL3J1bGVzLm1hazogcmVtb3ZlIG5hbWUgY29udHJ1Y3Rpb24KKwlmb3IgcHJvZ3JhbTsgb2JqZWN0cyBmb3Igc3RhdGljIGFuZCBmb3IgZHluYW1pYyBhcmUgdGhlIHNhbWUuIAorCQorMjAwNS0xMi0wNCAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzcmMvbnVtX3B1dF9mbG9hdC5jcHA6IEZpbHRlciBpbmNsdXNpb24gb2Ygc3RkaW50LmgsIHJlcXVpcmVkIGZvcgorCURpZ2l0YWwgTWFycyBjb21waWxlciwgZm9yYmlkZGVuIGZvciBTdW4gcGxhdGZvcm0uCisKKwkqIHN0bHBvcnQvc3RsL19jd2N0eXBlLmg6IHdpZGUgdHlwZXMgYW5kIGZ1bmN0aW9uIGFyZSBpbiBnbG9iYWwKKwluYW1lc3BhY2UuCisKKwkqIGJ1aWxkL3Rlc3QvdW5pdC9nY2MubWFrOiBNb2RpZnkgY3lnd2luL21pbmd3IGNvbmZpZyBub3cgdGhhdAorCWRlZmF1bHQgc2V0dGluZ3MgZm9yIHRob3NlIHBsYXRmb3JtIGlzIHNoYXJlZCBsaWJyYXJ5LgorCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2U6IEFkZCBzdXBwb3J0IG9mIHN0YXRpYyB0YXJnZXRzLCB1c2VkCisJZXNwZWNpYWxseSBmb3IgQm9ybGFuZCBDKysgQ29tcGlsZXIgYW5kIERpZ2l0YWwgTWFycyBDb21waWxlci4KKworCSogYnVpbGQvTWFrZWZpbGVzL2dtYWtlL2FwcC9nY2MubWFrOiBGaXggdHlwbyBpbiBGcmVlQlNECisJY29uZmlndXJhdGlvbi4KKworMjAwNS0xMi0wMiAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L2NvbmZpZy9zdGxfbXN2Yy5oOiBGaXhlZCBjb25maWd1cmF0aW9uIGRldGVjdGlvbiB3aGVuIGJ1aWxkaW5nCisJU1RMcG9ydCBkbGwgYmFzZWQgb24gYSBzdGF0aWMgbmF0aXZlIHJ1bnRpbWUuCisKKwkqIHN0bHBvcnQvc3RsL19sb2NhbGUuaDogRml4IHdhcm5pbmcgY29udmVydGlvbiBmcm9tIHNpemVfdCB0bworCV9fc3RsX2F0b21pY190IHRoYXQgY2FuIGJlIG9mIGxvd2VyIHNpemUuCisKKwkqIHN0bHBvcnQvY29uZmlnL3N0bF9nY2MuaCwgZG9jL1JFQURNRS5taW5ndywgUkVBRE1FLmN5Z3dpbjogTWFkZSBkbGwKKwlkZWZhdWx0IHNldHRpbmdzIHVuZGVyIGN5Z3dpbi9taW5ndy4KKwkKKzIwMDUtMTItMDEgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3RscG9ydC9zdGwvX21ic3RhdGVfdC5oOiBBZGQgd29ya2Fyb3VuZCBmb3IgYWxwaGEgYmFkIFdDSEFSX01JTiBhbmQKKwlXQ0hBUl9NQVggZGVmaW5pdGlvbi4KKworCSogc3RscG9ydC9jb25maWcvc3RsX2djYy5oOiBDb25maWd1cmUgU1RMcG9ydCBmb3IgYWxwaGEgcGxhdGZvcm0gYXMgbm90CisJc3VwcG9ydGluZyBpZWM1NTkgc3BlY2lmaWNhdGlvbiBhcyBxdWlldCBuYW4gaXMgbm90IGNvcnJlY3QuIElmIHNvbWVvbmUKKwlmaW5kIHRoZSByaWdodCB2YWx1ZSB0aGVuIHRoaXMgY29uZmlnIHdpbGwgaGF2ZSB0byBiZSByb2xsYmFja2VkLgorCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2UvZ2NjLm1hazogUmVzdG9yZWQgU3VuIE9TIHN1cHBvcnQgdGhhdCB1c2UgdGhlCisJLXB0aHJlYWRzIG9wdGlvbiBhbmQgbm90IC1wdGhyZWFkCisKKwkqIGJ1aWxkL01ha2VmaWxlcy9ubWFrZS9saWIvbWFjcm8ubWFrOiBGaXhlZCBsaWJyYXJ5IG5hbWUgZ2VuZXJhdGlvbgorCXdoZW4gdXNpbmcgY3Jvc3MgcnVudGltZSB2ZXJzaW9uIHRoYW5rcyBBbGV4ZXkgSXZhbm92IHJlcG9ydC4KKworMjAwNS0xMS0yOSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bF91c2VyX2NvbmZpZy5oOiBBZGQgX1NUTFBfTElCX05BTUVfTU9USUYgbWFjcm8gdG8gZ2l2ZQorCXVzZXJzIGEgcG9pbnQgb2YgY3VzdG9taXphdGlvbiBvZiB0aGUgYXV0b21hdGljIGxpbmtpbmcgZmVhdHVyZS4KKworCSogYnVpbGQvTWFrZWZpbGVzL25tYWtlL2xpYi9tYWNyby5tYWssIGdtYWtlL2N5Z21pbmcvbGliLm1hazogVXNlCisJU1RMUF9CVUlMRF9MSUJfTU9USUYgaW4gbGlicmFyeSBuYW1lIGdlbmVyYXRpb24gYWxnb3JpdGhtLiBBbHNvIHRha2UKKwlpbnRvIGFjY291bnQgY3Jvc3MgYnVpbGRzIGluIGxpYnJhcnkgbmFtZSBnZW5lcmF0aW9uLgorCisJKiBidWlsZC9saWIvY29uZmlndXJlLmJhdDogQWRkIC0tbGliLW1vdGlmIG9wdGlvbiB0byBnaXZlIHVzZXJzIGEKKwl3YXkgdG8gY3VzdG9taXplIHRoZSBnZW5lcmF0ZWQgbGlicmFyeSBuYW1lcy4KKworCSogdGVzdC9laDogR2VuZXJhbGl6ZWQgdXNlIG9mIG1zdmMubWFrIHJhdGhlciB0aGFuIGFsbCB0aGUgbm1ha2UtdmM/Py5tYWsKKwlmaWxlcy4gSWRlbSBmb3IgZXZjLm1hayBpbnN0ZWFkIG9mIG5tYWtlLWV2Yz8ubWFrIGFuZCBpY2wubWFrIGluc3RlYWQgb2YKKwlubWFrZS1pY2wubWFrLgorCisJKiBzdGxwb3J0L3N0bC9fZXhjZXB0aW9uLmg6IENoYW5nZSBfbXN2Y193YXJuaW5nc19vZmYuaCBpbmNsdWRlIGluCisJX3dhcm5pbmdzX29mZi5oIGFzIHRoaXMgZmlsZSBub3cgYWxzbyB0dXJuIG9mZiBCb3JsYW5kIHdhcm5pbmdzLgorCisJKiBzdGxwb3J0L2NvbmZpZy9fZGV0ZWN0X2RsbF9vcl9saWIuaDogTXV0dWFsaXphdGlvbiBvZiBjb2RlIHVzZWQgdG8KKwlkZXRlY3QgY3VycmVudCBTVExwb3J0IHR5cGUgb2YgYnVpbGQgb3IgdXNhZ2UgKGRsbCBvciBzdGF0aWMgbGliKS4KKworCSogc3RscG9ydC9jb25maWcvc3RsX21zdmMuaCwgc3RsX2JjLmgsIHN0bF9kbWMuaDogSW50ZWdyYXRpb24gb2YKKwlfZGV0ZWN0X2RsbF9vcl9saWIuaAorCisJKiBzdGxwb3J0L2NvbmZpZy9fYXV0b19saW5rLmg6IENoYW5nZSBhdXRvIGxpbmsgYWxnbyB3aGVuIHdlIGRldGVjdAorCWNyb3NzIFNUTHBvcnQgdXNhZ2UgdGhhdCBpcyB0byBzYXkgdXNlIG9mIFNUTHBvcnQgYXMgYSBkbGwgbGluayB3aXRoCisJc3RhdGljIG5hdGl2ZSBydW50aW1lIG9yIG9wcG9zaXRlLgorCisyMDA1LTExLTI5ICBQZXRyIE92dGNoZW5rb3YgIDxjb21wbGVtZW50QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3JjL2N4YS5jOiBtdXRleCBzaG91bGQgYmUgcmVjdXJzaXZlLXNhZmUsIGR1ZSB0byBfX2N4YV9maW5hbGl6ZQorCW1heSBiZSBjYWxsZWQgcmVjdXJzaXZlLgorCisyMDA1LTExLTI4ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL190aHJlYWRzLmg6IFNpbXBsaWZpZWQgZXhwcmVzc2lvbiB1c2VkIHRvIGluc3RhbmNpYXRlCisJX0F0b21pY19zd2FwX3N0cnVjdCwgZ2NjIDIuOTUgaGFkIHRyb3VibGUgd2l0aCB0aGUgb25lIGxpbmUgZXhwcmVzc2lvbi4KKworCSogc3JjL2RsbF9tYWluLmNwcDogRml4IGluc3RhbmNpYXRpb24gb2YgX1N3YXBfbG9ja19zdHJ1Y3QgdGhhdCBoYXMgYmVlbgorCWNoYW5nZWQgYW5kIHJlbmFtZWQgaW4gX0F0b21pY19zd2FwX3N0cnVjdC4KKworCSogdGVzdC91bml0L21hcF90ZXN0LmNwcCwgc2V0X3Rlc3QuY3BwOiBTaW1wbGlmaWVkIGNhbGwgdG8gbWFwIGNvbnN0cnVjdG9yCisJdGFraW5nIGEgZnVuY3RvciBhbmQgYWxsb2NhdG9yIGluc3RhbmNlLCBzcGxpdCBpdCBpbiBhIGNyZWF0aW9uIG9mIGEgbGVzPGludD4KKwlpbnN0YW5jZSB0aGVuIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3I7IGdjYyAyLjk1IGhhZCB0cm91YmxlIHdpdGggcHJldmlvdXMKKwl2ZXJzaW9uLgorCisJKiBzdGxwb3J0L3N0bC9fY21hdGguaCwgX2NzdGRsaWIuaDogTm93IHRob3NlIGZpbGVzIGluY2x1ZGVzIGVhY2ggb3RoZXIgdG8KKwltYWtlIHN1cmUgdGhhdCBhbGwgYWJzIG92ZXJsb2FkcyBhcmUgZGVmaW5lZCB3aGVuIGl0IGlzIGltcG9ydGVkIGluIFNUTHBvcnQKKwluYW1lc3BhY2UuIGdjYyAyLjk1IGlzIHZlcnkgc3RyaWN0IG9uIHRoaXMgcG9pbnQgYW5kIG9ubHkgY29uc2lkZXIgdGhlIGFicworCW92ZXJsb2FkcyBleGlzdGluZyBhdCB0aGUgZmlyc3QgaW1wb3J0IGNhbGxzLCBhbGwgb3ZlcmxvYWRzIGFkZGVkIGFmdGVyIHRoYXQKKwlhcmUgZGlzY2FyZGVkIHNpbGVudGx5LgorCisJKiBzdGxwb3J0L3N0bC9fY21hdGguaDogUmVtb3ZlZCB1bmp1c3RpZmllZCBhYnMgZnVuY3Rpb24gb3ZlcmxvYWRzIGRvbmUKKwlkaXJlY3RseSBpbiBTVExwb3J0IG5hbWVzcGFjZSBmb3IgZ2NjIDIuOTUgYW5kIGJlZm9yZS4gVGhvc2Ugb3ZlcmxvYWRzCisJY2xhc2hlZCBvbiBhIExpbnV4IHdpdGggZ2NjIDIuOTUgZnJvbSB0aGUgc291cmNlZm9yZ2UgY29tcGlsZXIgZmFybS4gCisKKwkqIGJ1aWxkL01ha2VmaWxlcy9nbWFrZS9nY2MubWFrOiBHZW5lcmFsaXplZCBkZWZpbml0aW9uIG9mIF9SRUVOVFJBTlQgdW5kZXIKKwlMaW51eCB0byBtYWtlIGRldGVjdGlvbiBvZiBhIG11bHRpdGhyZWFkZWQgYnVpbGQgZnJvbSBTVExwb3J0IGNvZGUgZWFzaWVyLgorCVByb2JsZW0gbWVldCBvbiBhbiBhbHBoYSBsaW51eCBwbGF0Zm9ybSBmcm9tIHRoZSBzb3VyY2Vmb3JnZSBjb21waWxlciBmYXJtLgorCisJKiBzdGxwb3J0L3N0bC9fbG9jYWxlLmg6IFJlbW92ZWQgX01fZGVsZXRlIGxvY2FsZTo6ZmFjZXQgbWVtYmVyIHZhcmlhYmxlLAorCXVzZWxlc3MgaWYgZmFjZXQgaW5zdGFuY2UgcmVmZXJlbmNlIGNvdW50ZXIgaXMgcmlnaHQuCisKKwkqIHNyYy9sb2NhbGVfaW1wbC5jcHAsIG1lc3NhZ2UuY3BwOiBDaGFuZ2UgY2xhc3NpYyBmYWNldHMgaW5pdGlhbGl6YXRpb24gY29kZQorCXRvIHNpbXBseSBzZXQgaW5pdGlhbCBjb3VudGVyIHRvIDEgcmF0aGVyIHRoYW4gaW5jcmVtZW50aW5nIGl0IGFmdGVyIGNvbnN0cnVjdGlvbi4KKworCSogdGVzdC91bml0L2V2Yy5tYWsgZml4IHBhdGggdG8gY29uZmlnIGZpbGUgaW4gZXhpc3RhbmNlIGNoZWNrLgorCisJKiBzdGxwb3J0L3N0bC9fbW92ZV9jb25zdHJ1Y3RfZndrLmgsIHR5cGVfbWFuaXBzLmg6IEFkZCB3b3JrYXJvdW5kIHRvIHVzZQorCW1vdmUgY29uc3RydWN0b3Igd2l0aCBCb3JsYW5kIGNvbXBpbGVyLgorCisyMDA1LTExLTI4ICBQZXRyIE92dGNoZW5rb3YgIDxjb21wbGVtZW50QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogYnVpbGQvTWFrZWZpbGVzL2dtYWtlL3RhcmdldGRpcnMubWFrOiBjaGFuZ2UgbmFtZXMgb2YgLm8gb3V0cHV0IGRpcnMKKwl0byBtYWtlIGJjYyBoYXBweSAoYnVnIHdpdGggcGFzc2luZyBuYW1lIHRoYXQgY29udGFpbiAnLScgZnJvbQorCWNvbXBpbGVyIHRvIGxpbmtlcikuIFJlcGxhY2VtZW50OiAnc2hhcmVkJyAtPiAnc28nLCAnc3RhdGljJyAtPiAnYXInLAorCSctJyAtPiAnXycgKGkuZS4gb2JqL2djYy9zaGFyZWQtc3RsZyAtPiBvYmovZ2NjL3NvX3N0bGcsIGEgYml0IHNob3J0ZXIpCisJW1N1Z2dlc3RlZCBieSBGcmFuY29pcyBEdW1vbnRdLgorCisyMDA1LTExLTI3ICBQZXRyIE92dGNoZW5rb3YgIDxjb21wbGVtZW50QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogYnVpbGQvTWFrZWZpbGVzL2dtYWtlL3RhcmdldHMubWFrLCBhcHAvcnVsZXMubWFrLCBsaW51eC9ydWxlcy1zby5tYWs6CisJdXNlIGdjYyBpbnN0ZWFkIG9mIGMrKyBhcyBsaW5rZXIgaWYgdGhlcmUgYXJlIG5vIEMrKyBvYmplY3RzLgorCisJKiBzcmMvY3hhLmMsIGJ1aWxkL21pc2MvY3hhX2F0ZXhpdC9NYWtlZmlsZS5pbmMsIGJ1aWxkL21pc2MvY3hhX2F0ZXhpdC9nY2MubWFrOgorCXdvcmthcm91bmQgZm9yIGJ1Z2dlZCBfX2N4YV9maW5hbGl6ZTsgdXNlIGJ1aWxkZWQgbGliY3hhLnNvIGluIExEX1BSRUxPQUQgb3IKKwkvZXRjL2xkLnNvLnByZWxvYWQgaW4gTGludXggc3lzdGVtIHdpdGggYnVnZ2VkIGdsaWJjLiBTZWUgYWxzbworCWh0dHA6Ly9nY2MuZ251Lm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MjQxODkKKworMjAwNS0xMS0yNyAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bC90eXBlX21hbmlwcy5oOiBBZGQgaW1wb3J0IG9mIF9fdHJ1ZV90eXBlIGFuZAorCV9fZmFsc2VfdHlwZSBpbiBTVExwb3J0IHByaXZhdGUgbmFtZXNwYWNlIGFzIHRoZSB1c2luZyBuYW1lc3BhY2UKKwlkaXJlY3RpdmUgZG8gbm90IHNlZW1zIHRvIGJlIGVub3VnaCBmb3IgbGF0ZXN0IGdjYyB2ZXJzaW9uLgorCisJKiBzcmMvdGltZV9mYWNldHMuY3BwOiBGaXggYnVmZmVyIHNpemUgZGVjcmVtZW50YXRpb24gaW4gX193cml0ZV9mb3JtYXR0ZWRfdGltZQorCWZ1bmN0aW9uIHRoYW5rcyBQZXRyIE92dGNoZW5rb3YKKworMjAwNS0xMS0yNiAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bC9fY29tcGxleC5oOiBNb3ZlIGltcGxlbWVudGF0aW9uIG9mIGdlbmVyaWMgYWJzLCBhcmcgYW5kIHBvbGFyCisJYWZ0ZXIgZGVmaW5pdGlvbiBvZiBkb3VibGUgb3ZlcmxvYWQgdXNlZCBpbiBpbXBsZW1lbnRhdGlvbi4gVGhhbmtzIEtlZXMgZGUKKwlCcnVpbgorCisJKiBzdGxwb3J0L3N0bC9fdGhyZWFkcy5oLCBfYWxsb2MuaCwgX2FsbG9jLmM6IEZpeCBsb2NrIGZyZWUgbm9kZSBhbGxvY2F0b3IKKwlpbXBsZW1lbnRhdGlvbiB0aGFua3MgV2Vpcy4KKworCSogc3RscG9ydC9zdGwvd3JhcHBlcnM6IFJlbW92ZWQsIG5vIG1vcmUgbWFpbnRhaW5lZCBhbmQgY29tcGxpY2F0ZWQgdG8gZml4CisJd2l0aCB0aGUgZGVidWcgYW5kIHBvaW50ZXIgc3BlY2lhbGl6YXRpb24gaW1wbGVtZW50YXRpb25zLgorCisJKiB0ZXN0L3VuaXQvc3RhY2tfYWxsb2NhdG9yLmg6IENyZWF0aW9uIG9mIGFuIGFsbG9jYXRvciB1c2luZyBhIHN0YWNrIGJ1ZmZlci4KKwlUaGlzIGFsbG9jYXRvciBzcGVjaWZpY2l0eSBpcyB0byBub3QgYmUgc3RhdGVsZXNzIGFuZCBub3QgZGVmYXVsdCBjb25zdHJ1Y3RpYmxlLgorCisJKiB0ZXN0L3VuaXQvbGlzdF90ZXN0LmNwcCwgc3RscG9ydC9zdGwvX2xpc3QuaCwgX2xpc3QuYzogQWRkIG9mIGEgdGVzdCB3aXRoIHRoZQorCVN0YWNrQWxsb2NhdG9yLiBGaXggbGlzdCBpbXBsZW1lbnRhdGlvbiB0byBjb3JyZWN0bHkgaGFuZGxlIGFsbG9jYXRvciBzdGF0ZQorCWluIHRoZSBtZXRob2RzIG1vdmluZyBlbGVtZW50cyBmcm9tIGEgbGlzdCBpbnN0YW5jZSB0byBhbiBvdGhlci4KKworCSogc3RscG9ydC9zdGwvX2NhcnJheS5oOiBDcmVhdGlvbiBvZiBhIG5ldyBpbnRlcm5hbCBzdHJ1Y3QgX0NBcnJheSB0aGF0IG1pbWljIGEgQworCWFycmF5IHdpdGggdGhlIGFkZGl0aW9ubmFsIGZlYXR1cmUgb2YgYmVpbmcgYWJsZSB0byBiZSBpbnN0YW5jaWF0ZWQgd2l0aCBhIHR5cGUKKwl3aXRob3V0IGRlZmF1bHQgY29uc3RydWN0b3IuCisKKwkqIHN0bHBvcnQvc3RsL2RlYnVnL19saXN0Lmg6IEFkYXB0IGl0ZXJhdG9yIGludmFsaWRhdGlvbiBhY2NvcmRpbmcgYWxsb2NhdG9ycworCWNvbXBhcmUgcmVzdWx0LgorCisJKiB0ZXN0L3VuaXQvc2xpc3RfdGVzdC5jcHAsIHN0bHBvcnQvc3RsL19zbGlzdC5oLCBfc2xpc3QuYzogaWRlbSBsaXN0LgorCisJKiBzdGxwb3J0L3N0bC9fc2xpc3QuaDogTW9kaWZpY2F0aW9uIG9mIHRoZSBzcGxpY2VfYWZ0ZXIgbWV0aG9kcyBzaWduYXR1cmUuIFVzZXJzCisJbm93IGhhdmUgdG8gcGFzcyB0aGUgc291cmNlIHNsaXN0IGluc3RhbmNlLCB0aGlzIGlzIG1hbmRhdG9yeSBpbiBvcmRlciB0byBjb21wYXJlCisJdGhlIDIgc2xpc3RzIGFsbG9jYXRvciBpbnN0YW5jZSBiZWZvcmUgbW92aW5nIGFuIGVsZW1lbnQgZnJvbSBhIHNsaXN0IGluc3RhbmNlIHRvCisJYW4gb3RoZXIuCisKKwkqIHN0bHBvcnQvc3RsL19zdHJpbmdfYmFzZS5oOiBGaXggX01fc3dhcCBpbXBsZW1lbnRhdGlvbiBmb3IgYmFzaWNfc3RyaW5nIGluc3RhbmNpYXRpb24KKwl3aXRoIGFsbG9jYXRvciBoYXZpbmcgYSBzdGF0ZS4KKworCSogc3RscG9ydC9zdGwvX2xpc3QuYywgX3NsaXN0LmM6IHNvcnQgbWV0aG9kcyBub3cgdGhyb3cgYW4gb3ZlcmZsb3cgZXhjZXB0aW9uIHdoZW4gbGlzdHMKKwlhcmUgdG9vIGxvbmcgdG8gYmUgc29ydGVkIHdpdGggdGhlIGN1cnJlbnQgYWxnb3JpdGhtLiBUaGlzIGlzIHByZWZlcmFibGUgdG8gYSBidWZmZXIKKwlvdmVycnVuLgorCisJKiBzdGxwb3J0L3N0bC9fYWxvZ29iYXNlLmM6IFNtYWxsIGVxdWFsX3JhbmdlIG9wdGltaXphdGlvbiwgdXBwZXJfYm91bmQgaXMgbm90IGNhbGxlZAorCWFueW1vcmUgd2hlbiBsb3dlcl9ib3VuZCByZXR1cm5lZCB2YWx1ZSBpcyBhbHJlYWR5IG5vdCBlcXVpdmFsZW50IHRvIHRoZSBzZWFyY2ggdmFsdWUuCisKKwkqIGJ1aWxkL01ha2VmaWxlcy9nbWFrZTogQWRkIGJ1aWxkIHN5c3RlbSBmb3IgRGlnaXRhbCBNYXJzIGFuZCBCb3JsYW5kIEMrKyBjb21waWxlcnMKKworCSogYnVpbGQvbGliL2NvbmZpZ3VyZS5iYXQ6IEFkZCBmb2xsb3dpbmcgb3B0aW9ucworCSAgLS11c2UtYm9vc3QKKwkgIC0tbm90LXRocmVhZC1zYWZlCisJICAtLW5vLXJ0dGkKKwlzZWUgc2NyaXB0IGZvciBleHBsYW5hdGlvbi4gLS1taW5ndyByZW1vdmVkLCBkZXRlY3RlZCB3aXRoIC0tY29tcGlsZXIgb3B0aW9uLCBpZgorCWdjYywgZG1jIG9yIGJjYyB0aGVuIHdlIGFyZSB1c2luZyBNaW5HVyB0b29scy4KKworCSogYnVpbGQvbGliL2NvbmZpZ3VyZTogQWRkIC0tbm90LXRocmVhZC1zYWZlIG9wdGlvbgorCisJKiBidWlsZC9NYWtlZmlsZXM6IEFkZCBidWlsZCBvcHRpb25zIHRvIGdlbmVyYXRlIG5vdCB0aHJlYWQgc2FmZSBsaWJzIGFuZCBubyBydHRpIGxpYnMsCisJYWxsIGNvbXBpbGVycyBvcHRpb24gaGFzIG5vdCBiZWVuIHVwZGF0ZWQuCisKKwkqIHN0bHBvcnQvYyo6IE1vZGlmaWNhdGlvbiBvZiBDKysgaGVhZGVycyB3cmFwcGluZyBDIG9uZXMuIEFsbCBjb2RlIG1vdmVkIHRvIGludGVybmFsCisJaGVhZGVycyBpbiBzdGxwb3J0L3N0bCBmb2xkZXIuIEludGVybmFsIGhlYWRlcnMgYXJlIG9ubHkgaW5jbHVkZWQgaWYgaW5jbHVkZSBjb21lcyBmcm9tCisJdXNlciBjb2RlIG90aGVyd2lzZSBvbmx5IG5hdGl2ZSBoZWFkZXIgaXMgaW5jbHVkZWQuIExpbWl0IGRlcGVuZGVuY3kgYmV0d2VlbiBTVExwb3J0CisJaGVhZGVycyByZWxhdGlvbnMgYW5kIG5hdGl2ZSBsaWJyYXJ5IG9uY2UuIFJlcG9ydGVkIGJ5IHByb2JsZW0gYnVpbGRpbmcgd2l0aCBCb3JsYW5kCisJY29tcGlsZXIuCisKKwkqIHRlc3QvdW5pdC9jcHB1bml0L2NwcHVuaXRfbWluaS5oOiBSZXBsYWNlIGNzdHJpbmcgaW5jbHVkZSB3aXRoIHN0cmluZy5oIHRvIGF2b2lkCisJcmVmZXJlbmNlcyB0byBzdGQgbmFtZXNwYWNlIGluIGhlYWRlcnMsIHNob3VsZCBiZSBtb3JlIHBvcnRhYmxlLiBBZGQgdHlwZWRlZiBCYXNlCisJZGVmaW5pdGlvbiBpbiBDUFBVTklUX1RFU1RfU1VJVEUgbWFjcm8sIHVzZWQgaW4gY2FsbHMgdG8gYmFzZSBjbGFzcyBtZXRob2RzLCBoZWxwCisJQm9ybGFuZC4KKworCSogR2VuZXJhbGl6ZSB1c2Ugb2Ygc2VjdXJlIHN0cmluZyBmdW5jdGlvbnMgKHN0cmNweV9zIGZvciBpbnN0YW5jZSkgZm9yIE1TVkMgY29tcGlsZXJzCisJc3VwcG9ydGluZyBpdCBhbmQgdGFnZ2luZyBmb3JtZXIgdmVyc2lvbnMgbGlrZSBkZXByZWNhdGVkLiBUaGUgcHJhZ21hIHdhcm5pbmcgdGhhdCB1c2VkCisJdG8gZGlzYWJsZSB0aGlzIHdhcm5pbmcgaGFzIGJlZW4gcmVtb3ZlZC4KKworCSogc3RscG9ydC9CQzUwOiBSZW1vdmVkLCBubyBuZWNhc3NyeSBhbnltb3JlIGZvciBzdXBwb3J0ZWQgQm9ybGFuZCBjb21waWxlciB2ZXJzaW9ucy4KKworCSogc3RscG9ydC9zdGwvZGVidWc6IEltcGxlbWVudGF0aW9uIG1vZGlmaWNhdGlvbiwgbm93IGRlYnVnIHdyYXBwZXIgYWdyZWdhdGUgYSBub24gZGVidWcKKwlpbnN0YW5jZSByYXRoZXIgdGhhbiBpbmhlcml0aW5nIGZyb20gaXQuIE1ha2VzIGRlYnVnIGltcGxlbWVudGF0aW9uIGNsZWFyZXIgYXMgd2UgYXJlIG5vdyAKKwlmb3JjZWQgdG8gaW1wbGVtZW50IHRoZSBjb21wbGV0ZSBjb250YWluZXJzIGludGVyZmFjZXMuCisKKwkqIHN0bHBvcnQvc3RsL3BvaW50ZXJzOiBGaXggaW1wbGVtZW50YXRpb24gaW4gb3JkZXIgdG8gc3VwcG9ydCBTdGFuZGFyZCBjb21waWxlcnMKKwlub3QgYWNjZXB0aW5nIGNhc3QgZnJvbSBmdW5jdGlvbiBwb2ludGVyIHRvIHZvaWQqLgorCisJKiAqOiBSZWluZm9yY2UgdXNlIG9mIFNUTHBvcnQgcHJpdmF0ZSBuYW1lc3BhY2UgKHN0bHBfcHJpdiBvciBzdGxwb3J0Ojpwcml2KSBmb3IgYWxsCisJaW50ZXJuYWxzIGFsZ29yaXRobXMuCisKKzIwMDUtMTEtMjEgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogRml4IGNsYXNzaWMgbG9jYWxlIGZhY2V0IGluaXRpYWwgcmVmZXJlbmNlIGNvdW50ZXIgdGhhbmtzCisJQ2FiYWwKKworMjAwNS0xMS0yMCAgUGV0ciBPdnRjaGVua292ICA8Y29tcGxlbWVudEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHNyYy9udW1fcHV0Lmg6IGNoZWNrIHRoYXQgaW5jb21pbmcgc3RyaW5nIGhhcyBlbm91Z2gKKwlkaWdpdHMgZm9yIGZyYWN0aW9uYWwgcGFydCBwcm9jZXNzaW5nLiBUaGlzIGNoZWNrIGluY2x1ZGVzCisJY2hlY2sgZm9yIGVtcHR5IGluY29taW5nIHN0cmluZy4gKFRoYW5rcyBMZW9uYXJkbyBbbGVvYXBzaWx2YV0KKwlmb3IgdGhlIGJ1ZyByZXBvcnQpLgorCisJKiBzdGxwb3J0L3N0bC9fbW9uZXRhcnkuYzogZml4IHByb2Nlc3NpbmcgdGhlIGNhc2Ugd2hlbgorCW51bWJlciBvZiBkaWdpdHMgaW4gdmFsdWUgbGVzcyB0aGVuIG51bWJlciBvZiBkaWdpdHMgaW4gZnJhY3Rpb24uCisKKwkqIHNyYy9mYWNldHNfYnluYW1lLmNwcDogaW50ZXJuYXRpb25hbCBjdXJyZW5jeSBzeW1ib2wgc2hvdWxkCisJYmUgdGhlIGZpcnN0IChub3QgZGVwZW5kcyB1cG9uIHdoZXJlIGN1cnJlbmN5IHN5bWJvbCBzaXR1YXRlZCBpbgorCXRoZSBuYXRpb25hbCBmb3JtYXQpLgorCisJKiB0ZXN0L3VuaXQvbG9jYWxlX3Rlc3QuY3BwOiB0ZXN0cyBmb3IgcmVwcm9kdWNpbmcgdGhpcyBwcm9ibGVtcy4KKworMjAwNS0xMS0yMCAgR2FpbCBCYWtlciAgPGJha2VyODhAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2UvQ0MubWFrOiBVcGRhdGVkIGNvbXBpbGVyIG9wdGlvbgorCXRvIGNvbXBpbGUgbGFyZ2VyIGlubGluZSBmdW5jdGlvbnMgaW5saW5lLgorCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2UvbGliL0NDLm1hazogQ2hhbmdlZCBob3cgdGhlIGhlYWRlcgorCWZpbGUgbGlua2luZyBpcyBkb25lIHRvIG9ubHkgZG8gaXQgb25jZSBpbnN0ZWFkIG9mIHdpdGgKKwlldmVyeSBjb21waWxlLgorCisJKiBidWlsZC9saWIvUkVBRE1FOiBpbmNsdWRlIGluc3RydWN0aW9ucyBmb3IgU3VuUHJvIGNvbXBpbGVyLgorIAorCSogYnVpbGQvdGVzdC91bml0L0NDLm1hazogYWxsb3cgdGhlIFNUTFBfREVCVUcgdmVyc2lvbiB0byBjb21waWxlLgorCisyMDA1LTExLTE5ICBQZXRyIE92dGNoZW5rb3YgIDxjb21wbGVtZW50QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3RscG9ydC9zdGRsaWIuaDogcmVwbGFjZSBDKysgY29tbWVudHMgYnkgQywgdG8gc2F0aXNmeSAtYW5zaQorCW9wdGlvbiBvZiBjb21waWxlci4KKworMjAwNS0xMS0xOCAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBidWlsZC9NYWtlZmlsZXMvbm1ha2UvbGliL3J1bGVzLWluc3RhbGwtc28ubWFrLCAKKwlhcHAvcnVsZXMtaW5zdGFsbC1zby5tYWs6IEFkZCBjb3B5IG9mIG1hbmlmZXN0IGZpbGUgd2hlbiBleGlzdAorCXJhdGhlciB0aGFuIHdoZW4gY29tcGlsZXIgaXMgVmlzdWFsIFN0dWRpbyAyMDA1LgorCisJKiBzcmMvc3RkaW9fc3RyZWFtYnVmLmNwcDogUmVtb3ZlZCB3YXJuaW5nIGZvciBFVkMgMyBhbmQgNCB0aGFua3MKKwlNaWNoYWVsIEZpbmsgcGF0Y2guCisKKwkqIHN0bHBvcnQvc3RsL21hdGguaCwgc3RkbGliLmg6IEZpeCBFVkMzIHdhcm5pbmcgdGhhbmtzIE1pY2hhZWwgRmluaworCXBhdGNoLgorCisJKiBkb2MvUkVBRE1FLmV2YzM6IGRvYyB1cGRhdGUgZnJvbSBNaWNoYWVsIEZpbmsuCisKKwkqIHN0bHBvcnQvKiwgc3RscG9ydC8qLCB0ZXN0cy8qOiBDbGVhbiB1cCBvZiB0cmFpbGluZyBibGFuayBjaGFyYXRlcnMKKwlpbiBhbGwgc291cmNlIGZpbGVzLgorCisyMDA1LTExLTE3ICBHYWlsIEJha2VyICA8YmFrZXI4OEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGJ1aWxkL01ha2VmaWxlcy9nbWFrZS9DQy5tYWssIGRlcGVuZC5tYWssIGFwcC9DQy5tYWssIGxpYi9DQy5tYWs6CisJc3VwcG9ydCBvZiBTdW5Qcm8gNS43IGNvbXBpbGVyLgorCisJKiBidWlsZC9saWIvQ0MubWFrOiBkaXR0bworCisJKiBzdGxwb3J0L3N0bC9fcm9wZS5jOiBSZW1vdmVkIGV4dHJhIHNlbWktY29sb25zLgorCQorCSogc3RscG9ydC9zdGwvX3JvcGUuaDogU3VucHJvIGNvbXBpbGVyIGhhZCBhIHByb2JsZW0gd2l0aAorCXRoZSBfX1JPUEVfREVQVEhfU0laRSBtYWNybyBkb2luZyBhbiBhZGRpdGlvbi4gQ2hhbmdlZCB0bworCWEgZml4ZWQgdmFsdWUgaW5zdGVhZC4KKworCSogc3RscG9ydC9jc3RkbGliOiBVcGRhdGVkIHRvIGFsbG93IHRoZSBjb21waWxlciB0byBmaW5kIGFicyBhbmQgZGl2CisKKwkqIHN0bHBvcnQvY29uZmlnL3N0bF9zdW5wcm8uaDogRGlzYWJsZWQgX1NUTFBfTElOS19USU1FX0lOU1RBTlRJQVRJT04KKwlzaW5jZSB0aGlzIG5vbG9uZ2VyIHdvcmtzIHdpdGggY3VycmVudCBmaWxlcy4gVGhlIGlzc3VlIGhlcmUgaXMgdGhhdAorCWEgbnVtYmVyIG9mIGRlZmluZXMgdGhhdCBhcmUgcmVxdWlyZWQgaW4gdGhlIEMgdmVyc2lvbnMgb2YgdGhlIGZpbGVzCisJdXNlIGRlZmluZXMgdGhhdCBhcmUgdW5kZWZlZCBhdCB0aGUgZW5kIG9mIHRoZSBpbmNsdWRlLiBTbywgd2hlbgorCXRoZSBjb21waWxlciBmaW5hbGx5IGNvbXBpbGVzIHRoZSBDIHZlcnNpb24gYXQgbGluayB0aW1lIHRoZSBkZWZpbmVzCisJYXJlIGxvc3QgYW5kIHRoZSBmaWxlcyBkb24ndCBjb21waWxlLiBBbHNvIGFkZGVkIGEgbWlub3IgY2hhbmdlCisJdG8gYWxsb3cgZmlsZXMgdGhhdCBhcmUgY29tcGlsZWQgd2l0aCBjYyB0byBpbmNsdWRlIHN0bF9zdW5wcm8uaAorCXdpdGhvdXQgYmFpbGluZyBvdXQuCisKKwkqIHN0bHBvcnQvc3RsL19idmVjdG9yLmg6IEFkZGVkIHN0bC9fcmFuZ2VfZXJyb3JzLmggcmVxdWlyZWQgYnkKKwlhbiBleGNlcHRpb24gdGhhdCBjYW4gYmUgY2FsbGVkLgorCisJKiBzdGxwb3J0L3N0bC9fY21hdGguaDogQ2hhbmdlZCB0byBwdWxsIGFsbCBtYXRoIGZ1bmN0aW9ucyBmcm9tIHN0ZAorCW5hbWVzcGFjZSBmb3IgU3VuUHJvIGNvbXBpbGVzIG9ubHkuCisKKwkqIHRlc3QvdW5pdC9mc3RyZWFtX3Rlc3QuY3BwOiBBZGRlZCBTdW5Qcm8gY29tcGlsZSB0byB0aGUgbGlzdAorCW9mIGNvbXBpbGVycyB0aGF0IGRvbid0IHVzZSB0aGUgRE9fQ1VTVE9NX0ZBQ0VUX1RFU1QuCisKKwkqIHRlc3QvdW5pdC9zdHJpbmdfdGVzdC5jcHA6IEFkZGVkIFN1biBVSSBUaHJlYWRzIHRvIHRoZSBsaXN0CisJb2Ygc3VwcG9ydGVkIHRocmVhZCB0eXBlcyBpbiB0aGUgdGVzdC4KKworCSogdGVzdC91bml0L3ZhbGFycmF5X3Rlc3QuY3BwOiBUaGUgY29tcGlsZXIgd2FzIGhhdmluZyB0cm91YmxlCisJZmluZGluZyBhYnMoKS4gQWRkZWQgYSAidXNpbmcgc3RkOjphYnMiIGZvciB0aGUgU3VuUHJvIGNvbXBpbGVyCisJd2hpY2ggc29sdmVkIHRoZSBwcm9ibGVtLgorCisJKiB0ZXN0L3VuaXQvY3BwdW5pdC9jcHB1bml0X21pbmkuaDogQWRkZWQgYWRkaXRpb25hbCB1c2luZyBzdGF0ZW1lbnRzCisJZm9yIHRoZSBzdHIqIGNvbW1hbmRzLgorCisJKiB0ZXN0L3VuaXQvY3BwdW5pdC90ZXN0X21haW4uY3BwOiBBZGRlZCAidXNpbmcgbmFtZXNwYWNlIHN0ZDsiCisJZm9yIHRoZSBTdW5Qcm8gY29tcGlsZXIuCisKKwkqIGJ1aWxkL3Rlc3QvdW5pdC9DQy5tYWs6IHN1cHBvcnQgb2YgU3VuUHJvIDUuNyBjb21waWxlcgorCisyMDA1LTExLTE3ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL19tZXNzYWdlc19mYWNldHMuaCwgc3JjL21lc3NhZ2VzLmNwcDogTW92ZSBtZXNzYWdlIGZhY2V0CisJY29uc3RydWN0b3IgcHJpdmF0ZSB0byBndWFyYW50eSB0aGF0IGl0IGlzIG9ubHkgY2FsbGVkIGZyb20gdGhlIF9Mb2NhbGVfaW1wbAorCWNsYXNzIGZvciBjbGFzc2ljIGxvY2FsZSBmYWNldHMgY3JlYXRpb24uIENoYW5nZSBjb25zdHJ1Y3RvciBpbXBsZW1lbnRhdGlvbgorCWFzIG5vdyBwYXNzZWQgX01lc3NhZ2UgaW5zdGFuY2UgaXMgZHluYW1pY2FsbHkgaW5zdGFuY2lhdGVkIHNvIG5lZWRzIHRvIGJlCisJZGVzdHJveSBvbiBmYWNldCBkZXN0cnVjdGlvbjsgbW9yZW92ZXIgdGhlIGZhY2V0IGlzIGFsc28gZHluYW1pY2FsbHkgYWxsb2NhdGVkCisJYW5kIGhhcyB0byBiZSBkZXN0cm95ZWQgd2hlbiByZWZlcmVuY2UgY291bnRlciByZWFjaCAwLgorCisJKiBzcmMvbG9jYWxlX2ltcGwuY3BwOiBSZW1vdmVkIGNhbGwgdG8gbm93IHVzZWxlc3MgZnJlZV9jbGFzc2ljX2xvY2FsZSBmdW5jdGlvbi4KKwlDaGFuZ2UgbWFrZV9jbGFzc2ljX2xvY2FsZSBpbXBsZW1lbnRhdGlvbiwgbm93IGNsYXNzaWMgbG9jYWxlIGZhY2V0cyBhcmUKKwlhbGxvY2F0ZWQgb24gdGhlIGhlYXAgYW5kIGhhdmUgdG8gYmUgZGVzdHJveWVkIGxpa2UgYW55IG9yZGluYXJ5IGZhY2V0cworCXdoZW4gcmVmZXJlbmNlIGNvdW50ZXIgcmVhY2ggMC4KKworMjAwNS0xMS0xNSAgUGV0ciBPdnRjaGVua292ICA8Y29tcGxlbWVudEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHN0bHBvcnQvc3RsL190cmVlLmg6IGNoZWNrIGl0ZXJhdG9yIHJldHVybmVkIGZyb20gbG93ZXJfYm91bmQKKwlpbiBlcXVhbF9yYW5nZV91bmlxdWUgZm9yIGVuZCwgdG8gYXZvaWQgaW5jcmVtZW50IFt1c2VmdWwgd2hlbgorCWtleSBub3QgYXZhaWxhYmxlXS4KKworCSogdGVzdC91bml0L21hcF90ZXN0LmNwcDogdGVzdCBmb3IgcHJvYmxlbSBhYm92ZS4KKworMjAwNS0xMS0wOSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBidWlsZC90ZXN0L2VoL2djYy5tYWs6IEZpeCBidWlsZCBzeXN0ZW0gZm9yIEN5Z3dpbi9NaW5HVyBzeXN0ZW1zIHRoYXQKKwl3YXMgYnJva2VuIHNpbmNlIGxpYnJhcnkgbmFtaW5nIGNvbnZlbnRpb24gbW9kaWZpY2F0aW9uLgorCisyMDA1LTExLTA3ICBNaWNoYWVsIEZpbmsgIDx2aXZpZG9zQHVzZXJzLnNvdXJjZWZvcmdlLi4uPgorCisJKiBidWlsZC9saWIvY29uZmlndXJlLmJhdDogRml4ZWQgY29uZmlndXJpbmcgZm9yIFZpc3VhbCBTdHVkaW8gLk5FVCAyMDAzLgorCUZpeGVkIGp1bXAgdGFyZ2V0IG5hbWVzIGZvciBXaW45eCBPU2VzOiB0aGV5IG11c3QgYmUgOCBjaGFyYWN0ZXJzIG9yCisJc2hvcnRlci4KKworMjAwNS0xMS0wNyAgTWljaGFlbCBGaW5rICA8dml2aWRvc0B1c2Vycy5zb3VyY2Vmb3JnZS4uLj4KKworCSogYnVpbGQvTWFrZWZpbGVzL25tYWtlL2V2YzMubWFrLCBidWlsZC9NYWtlZmlsZXMvbm1ha2UvZXZjNC5tYWssCisJYnVpbGQvbGliL2NvbmZpZ3VyZS5iYXQsIHN0bHBvcnQvY29uZmlnL3N0bF9ldmMuaDogQWRkZWQgY2hlY2sgaWYKKwl1c2luZyB4ODYgZW11bGF0b3IgY29uZmlndXJhdGlvbjsgdXNpbmcgb2YgcHJvcGVyIGluY2x1ZGUgcGF0aHMgaW4KKwljYXNlLgorCisJKiBkb2MvUkVBRE1FLmV2YzQ6IERvY3VtZW50YXRpb24gdXBkYXRlCisKKzIwMDUtMTEtMDEgIFBldHIgT3Z0Y2hlbmtvdiAgPGNvbXBsZW1lbnRAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBSZXBvc2l0b3J5OiBTVExwb3J0IDUuMCwgdGFnIFNUTFBPUlRfNV8wX1JFTEVBU0UKKworCSogUmVwb3NpdG9yeTogbWVyZ2UgSEVBRCBhbmQgU1RMUE9SVF81XzAgYnJhbmNoLgorCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2UvYXBwL3J1bGVzLWluc3RhbGwubWFrOiBpbnN0YWxsLXNoYXJlZCBydWxlCisJYWRkZWQgKHBhdGNoIGJ5IE1pY2hhZWwgRmluaykuCisKKwkqIGJ1aWxkL01ha2VmaWxlcy9nbWFrZS9saWIvcnVsZXMtaW5zdGFsbC1hLm1hazogaW5zdGFsbC1zdGF0aWMgcnVsZQorCWFkZGVkIChwYXRjaCBieSBNaWNoYWVsIEZpbmspLgorCisyMDA1LTEwLTEyICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL190aHJlYWRzLmgsIF90aHJlYWRzLmM6IEZpeCByZWdyZXNzaW9uIGZvciBzb21lIHBsYXRmb3JtcworCWludHJvZHVjZSBieSBtb2RpZmljYXRpb24gb2YgX0F0b21pY19zd2FwX3B0ciBpbXBsZW1lbnRhdGlvbiB0aGFua3MKKwlBbGJyZWNodCBGcml0emNoZS4KKworMjAwNS0xMC0wOSAgUGV0ciBPdnRjaGVua292ICA8Y29tcGxlbWVudEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHJlcG9zaXRvcnk6IFJDNiwgdGFnIFNUTFBPUlRfNV8wX1JDNgorCisyMDA1LTEwLTA5ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvY29uZmlnL3N0bF9nY2MuaDogREVDIGFscGhhIGhhcyBub3QgKmwgbWF0aCBmdW5jdGlvbnMKKworMjAwNS0xMC0wOCAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bC9fY29uZmlnLmg6IEFkZCBlbmRpYW5lc3Mgc3BlY2lmaWNhdGlvbiBmb3IgREVDIGFscGhhIHRoYW5rcworCXNvdXJjZWZvcmdlIGNvbXBpbGVyIGZhcm0uCisKKwkqIHN0bHBvcnQvY29uZmlnL3N0bF9pbnRlbC5oOiBSZW1vdmUgcmVmZXJlbmNlIHRvIF9TVExQX0dMT0JBTF9ORVdfSEFORExFUgorCWluIHRoaXMgZmlsZSBhcyB0aGlzIG1hY3JvIGRlcGVuZHMgb24gbmF0aXZlIFN0YW5kYXJkIGxpYnJhcnkgd2hpY2ggaXMKKwl0aGUgYmFjayBlbmQgTVNWQyBjb21waWxlciBvbmUgc28gbWFjcm8gc2V0IGluIHN0bF9tc3ZjLmguCisKKzIwMDUtMTAtMDcgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogYnVpbGQvTWFrZWZpbGVzL2dtYWtlL2Rhcndpbi9zeXMubWFrLCBmcmVlYnNkL3N5cy5tYWs6IEZpeCBFWFRfVEVTVAorCWRlZmluaXRpb24gdG8gdGVzdCByYXRoZXIgdGhhbiAvdXNyL2Jpbi90ZXN0IHRoYW5rcyBzb3VyY2Vmb3JnZQorCWNvbXBpbGVyIGZhcm0uCisKKzIwMDUtMTAtMDUgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogYnVpbGQvTWFrZWZpbGVzL25tYWtlL3ZjLWNvbW1vbi5tYWs6IFJlbW92ZSAvRmQgb3B0aW9uIGZvciB0aGUgaWNsCisJY29tcGlsZXIgdGhhdCBkbyBub3Qga25vdyBpdC4KKworMjAwNS0xMC0wNCAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bC9kZWJ1Zy9fbGlzdC5oOiBGaXggcmVzaXplIG1ldGhvZCBpbXBsZW1lbnRhdGlvbiBpbiBzYWZlCisJU1RMIG1vZGUgdGhhbmtzIEV0aGFuIEZlbm4gcmVwb3J0LgorCisJKiB0ZXN0L3VuaXQvbGlzdF90ZXN0LmNwcDogQWRkIHRlc3QgY2FzZSBmb3IgbGlzdDo6cmVzaXplIG1ldGhvZC4KKworCSogYnVpbGQvTWFrZWZpbGVzL25tYWtlL2xpYi9ydWxlcy1pbnN0YWxsLWEubWFrLCBhcHAvcnVsZXMtaW5zdGFsbC1hLm1hazoKKwlJbnN0YWxsIC5wZGIgZmlsZXMgb25seSBpZiBleGlzdCwgSW50ZWwgQysrIGNvbXBpbGVyIGRvIG5vdCBnZW5lcmF0ZSB0aGVtCisJd2hlbiBidWlsZGluZyBzdGF0aWMgbGlicmFyaWVzLiBUaGFua3MgQWxicmVjaHQgRnJpdHpzY2hlCisKKwkqIHN0bHBvcnQvc3RsL19vc3RyZWFtLmgsIF9vc3RyZWFtLmM6IE1vdmUgX01faW5pdCBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbgorCWZyb20gLmMgdG8gLmggYXMgLmMgaXMgbm90IGluY2x1ZGVkIHdoZW4gX1NUTFBfTk9fQ1VTVE9NX0lPIGlzIGRlZmluZWQKKwlidXQgX01faW5pdCBtaWdodCBub3QgYmUgZXhwb3J0ZWQgaWYgY29tcGlsZXIgZnVsbHkgaW5saW5lIGl0LgorCisyMDA1LTEwLTAzICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL190cmVlLmg6IEZpeCBfU192YWx1ZSBtZXRob2QgZGVmaW5pdGlvbiB0aGF0IHJldHVybnMKKwlhIHZhbHVlX3R5cGUmIHJhdGhlciB0aGFuIHRoZSByZWZlcmVuY2UgdHlwZWRlZiBhcyByZWZlcmVuY2UgbWlnaHQgYmUsCisJZGVwZW5kaW5nIG9uIHRoZSB0cmFpdHMgdXNlZCB0byBpbnN0YW5jaWF0ZSBfUmJfdHJlZSwgZXF1aXZhbGVudCB0bworCWEgY29uc3RfcmVmZXJlbmNlLgorCisyMDA1LTA5LTMwICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIElOU1RBTEwsIFJFQURNRSwgZG9jL0ZBUSwgZG9jL1JFQURNRS5tc3ZjOiBEb2N1bWVudGF0aW9uIHVwZGF0ZXMuCisKKwkqIGRvYy9zdGxwb3J0X25hbWVzcGFjZXMudHh0OiBTbWFsbCBkb2MgYWJvdXQgU1RMcG9ydCBuYW1lc3BhY2VzIGFuZCBob3cKKwlTVExwb3J0IHJlcGxhY2UgbmF0aXZlIFN0YW5kYXJkIGxpYnJhcnkuCisKKzIwMDUtMDktMjYgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogYnVpbGQvKjogRmluaXNoZWQgX1NUTFBfTEVBS1NfUEVEQU5USUMgY2xlYW4gdXAgZnJvbSBhbGwgbWFrZSBmaWxlcy4KKworMjAwNS0wOS0yNSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBidWlsZC90ZXN0L3VuaXQvZ2NjLm1hazogUmVtb3ZlIF9TVExQX0xFQUtTX1BFREFOVElDIG9wdGlvbiB3aGVuIGJ1aWxkaW5nCisJdW5pdCB0ZXN0cyBhcyB0aGlzIG9wdGlvbiBpcyBub3QgZGVmaW5lZCB3aGVuIGJ1aWxkaW5nIHRoZSBsaWJzLgorCisyMDA1LTA5LTIyICBQZXRyIE92dGNoZW5rb3YgIDxjb21wbGVtZW50QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogYnVpbGQvTWFrZWZpbGVzL2dtYWtlL3N5c2lkLm1hazogYWRkIHVuZGVyc2NvcmUgaW4gYXJjaGl0ZWN0dXJlIHJlY29nbml0aW9uLAorCXRvIHBhcnNlIHRhcmdldHMgbGlrZSB4ODZfNjQtdW5rbm93bi1saW51eC1nbnUuCisKKzIwMDUtMDktMjEgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3JjL2xvY2FsZS5jcHAsIGZhY2V0c19ieW5hbWUuY3BwOiBVc2Ugb2YgX1NUTFBfQVRPTUlDX0lOQ1JFTUVOVCByYXRoZXIgdGhhbgorCWEgbG9jayBvbiBhIG11dGV4IHdoZW4gdGhlIG1hY3JvIGlzIGF2YWlsYWJsZS4KKworMjAwNS0wOS0yMSAgUGV0ciBPdnRjaGVua292ICA8Y29tcGxlbWVudEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHNyYy9sb2NhbGVfaW1wbC5jcHA6IHNvbWUgaW50ZXJuYWwgZnVuY3Rpb25zIHVzZWQgYmVmb3JlIGRlY2xhcmVkLgorCVRoYW5rcyBUaG9tYXMgS2hvIGZvciByZXBvcnQuCisKKzIwMDUtMDktMjAgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3RscG9ydC9zdGwvX3N0cmluZy5oLCBfc3RyaW5nX3dvcmthcm91bmQuaDogY29kZSByZWZhY3RvcmluZywgc3Vic3RyIG1ldGhvZAorCW5vdyB1c2Ugc3RyaW5nIGNvbnN0cnVjdG9yIHRha2luZyBzYW1lIHBhcmFtZXRlcnMgcmF0aGVyIHRoYW4gdGhlIHJhbmdlCisJY29uc3RydWN0b3IsIHRoYW5rcyBGZWxpeCBXeXNzIHJlcG9ydC4gQWxzbyBhZGQgbWlzc2luZyBhbGxvY2F0b3IgcGFyYW1ldGVyCisJZm9yIG5vbiBzdGF0ZWxlc3MgYWxsb2NhdG9ycy4KKworCSogYnVpbGQvTWFrZWZpbGVzL2dtYWtlOiBSZXN0b3JlIHJlc291cmNlIGJ1aWxkIGZvciBDeWd3aW4gYW5kIE1pbkdXLCBhZGQKKwlpdCBmb3IgV2luZG93cy4KKworCSogYnVpbGQvbGliL2NvbmZpZ3VyZS5iYXQ6IEFkZCAtLWV4dHJhLWN4eGZsYWcgdG8gaW5qZWN0IGFkZGl0aW9uYWwgY29tcGlsYXRpb24KKwlvcHRpb24gaW4gdGhlIG5tYWtlIGJ1aWxkIHN5c3RlbS4KKworMjAwNS0wOS0yMCAgUGV0ciBPdnRjaGVua292ICA8Y29tcGxlbWVudEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHRlc3QvdW5pdC9wdHJzcGVjX3Rlc3QuY3BwOiBnY2MgMi45NSBmYWlsIHRvIHJvbGwgb3V0IHRlbXBsYXRlIGluc3RhbnRpYXRpb24KKwlmb3IgcG9pbnRlcnMgdG8gbWVtYmVyIGZ1bmN0aW9uLCBza2lwIHRoaXMgdGVzdCBmb3IgZ2NjIDIuOTUuCisKKwkqIGJ1aWxkL01ha2VmaWxlcy9nbWFrZS9nY2MubWFrOiBnY2MgMi45NSBoYXMgbm8gLWZ1c2UtY3hhLWF0ZXhpdCBvcHRpb24uCisKKwkqIGJ1aWxkL2xpYi9nY2MubWFrOiBkb24ndCB1c2UgTEVBS19QRURBTlRJQyB3aXRoIGdjYyAyLjk1IFtidXQgdGhpcyBub3QgaGVscCwKKwlzZWdmYXVsdCBhdCBwcm9ncmFtIHRlcm1pbmF0aW9uIHN0aWxsIGhhcHBlbnNdLgorCisJKiBzdGxwb3J0L2NvbmZpZy9zdGxfZ2NjLmg6IGdjYyAyLjk1IGhhcyBwcm9ibGVtIHdpdGggbGxhYnMsIHNvIGZvcmNlIHRvIHVzZQorCV9TVExQX05PX1ZFTkRPUl9TVERMSUJfTDsgMi45NSBmYWlscyB0byBpbml0aWFsaXplIGJ1aWx0aW4gdHlwZXMuCisKKwkqIHN0bHBvcnQvc3RsL19jbWF0aC5oOiB3b3JrYXJvdW5kIGZvciBnY2MgMi45NS0tLWl0IGhhcyBwcm9ibGVtIHdpdGggJ3VzaW5nJworCWRpcmVjdGl2ZSBbcHJvYmxlbSB3aXRoICdhYnMnIHdpdGggZmxvYXQgdHlwZXMgYXMgYXJndW1lbnRdLgorCisJKiBzdGxwb3J0L3N0bC90eXBlX3RyYWl0cy5oOiB3b3JrYXJvdW5kIGZvciBnY2MgMi45NSBbcGFyZW50aGVzZXMgYXJvdW5kCisJdGVtcGxhdGUgYXJndW1lbnRdLiBUaGFua3MgVGhvbWFzIEtoby4KKworCSogdGVzdC91bml0L2ZzdHJlYW1fdGVzdC5jcHA6IGN1c3RvbSBmYWNldCB0ZXN0IGNvbXBpbGF0aW9uIGZhaWwgZm9yIGdjYyAyLjk1CisKKwkqIGJ1aWxkL01ha2VmaWxlcy9nbWFrZS9pY2MubWFrLCBidWlsZC90ZXN0L3VuaXQvaWNjLm1hazogc3VwcG9ydCBpY2MgOS4wLAorCXRoYW5rcyBKb2huIEZpc2hlci1PZ2RlbiBhbmQgVGhvbWFzIEtoby4KKworCSogc3JjL2NfbG9jYWxlX2dsaWJjL2NfbG9jYWxlX2dsaWJjMi5jOiB1c2UgbmV3bG9jYWxlL2ZyZWVsb2NhbGUgZm9yCisJZ2xpYmMgMi4zLngsIGFuZCBfX25ld2xvY2FsZS9fX2ZyZWVsb2NhbGUgZm9yIGdsaWJjIDIuMi54LiBUaGFua3MgR2FpbCBCYWtlci4KKworMjAwNS0wOS0xOSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBidWlsZC9NYWtlZmlsZXMvbm1ha2UvY2xlYW4ubWFrLCBsaWIvY2xlYW4ubWFrLCBhcHAvY2xlYW4ubWFrOiBBZGQgY2hlY2sKKwlmb3IgZmlsZSBvciBmb2xkZXIgZXhpc3RhbmNlIGJlZm9yZSBjYWxsaW5nIGRlbCBvciByZCB0byBhdm9pZCBlcnJvcgorCW1lc3NhZ2VzIHRoYXQgZ2l2ZSBhIGJhZCBmZWVkIGJhY2sgdG8gU1RMcG9ydCB1c2Vycy4KKworCSogYnVpbGQvTWFrZWZpbGVzL2dtYWtlOiBBZGQgc3VwcG9ydCB0byB1c2UgdGhlIEdOVSBtYWtlIHRvb2wgaW4gYSBXaW5kb3dzCisJY21kIGNvbnNvbGUuIEZvciB0aGUgbW9tZW50IGl0IGlzIHVzZWQgdG8gYnVpbGQgU1RMcG9ydCB1c2luZyBhIHNpbXBsZQorCU1pbkdXIGRpc3RyaWIuCisKKwkqIHN0bHBvcnQvc3RsL3R5cGVfdHJhaXRzLmg6IFNpbXBsaWZpZWQgY29kZSByZW1vdmluZyB0aGUgX0lzQ29udmVydGlibGVJZk5vdAorCXRoYXQgaGFzIG5ldmVyIHByb3ZlZCBvZiBiZWluZyB1c2VmdWwsIGl0IG9ubHkgaW50cm9kdWNlcyBwcm9ibGVtIHdpdGggc29tZQorCWxpbWl0ZWQgY29tcGlsZXJzLgorCisJKiBzdGxwb3J0L3N0bC9fc3RyaW5nX3dvcmthcm91bmQuaCwgX3N0cmluZy5oLCBkZWJ1Zy9fc3RyaW5nLmg6IEZpeCBzdHJpbmcKKwlyYW5nZSBjb25zdHJ1Y3RvciBidWcgaW4gdGhlIFZDNiBzcGVjaWZpYyB3b3JrYXJvdW5kIGltcGxlbWVudGF0aW9uIHRoYXQgd2FzCisJcmVzdWx0aW5nIGluIGEgbWVtb3J5IGxlYWsuIFRoYW5rcyBGZWxpeCBXeXNzIHJlcG9ydC4KKworMjAwNS0wOS0xOCAgUGV0ciBPdnRjaGVua292ICA8Y29tcGxlbWVudEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHN0bHBvcnQvc3RsL19oYXNoX2Z1bi5oOiBhZGQgaGFzaCBmdW5jdGlvbiBmb3Igdm9pZCAqLgorCisJKiBzcmMvZmFjZXRzX2J5bmFtZS5jcHAsIHNyYy9tZXNzYWdlX2ZhY2V0cy5oOiBpbnRyb2R1Y2UgbWFwIGJldHdlZW4KKwlubF9jYXRkIHR5cGUgW3RoYXQgaXMgdm9pZCAqIG9uIExpbnV4XSBhbmQgbWVzc2FnZXNfYmFzZTo6Y2F0YWxvZworCVt0aGF0IGlzIGludCBieSBTdGFuZGFyZF07IHRoaXMgc2hvdWxkIHJlbW92ZSBwcm9ibGVtcyBvbiBwbGF0Zm9ybXMKKwl3aGVyZSBzaXplb2YoaW50KSA8IHNpemVvZih2b2lkICopLgorCisyMDA1LTA5LTE2ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvY3djaGFyOiBBZGQgTWluR1cgMy44IHJ1bnRpbWUgd2lkZS1jaGFyIHRvIG11bHRpLWJ5dGUgZnVuY3Rpb25zCisJaW1wb3J0IHdpdGhpbiBTVExwb3J0IG5hbWVzcGFjZSB0aGFua3MgUmVuZSBSaXZpZXJhLgorCisyMDA1LTA5LTE0ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvY29uZmlnL3N0bF9nY2MuaDogTWluZ3cgc3VwcG9ydCBzdHJpbmcgd2lkZSBmdW5jdGlvbnMgdGhhbmtzCisJUmVuZSBSaXZpZXJhIHJlcG9ydC4KKworMjAwNS0wOS0xMyAgUGV0ciBPdnRjaGVua292ICA8Y29tcGxlbWVudEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHN0bHBvcnQvc3RsL190aHJlYWQuaDogZml4IHJldHVybiB0eXBlIHNwZWNpZmljYXRpb24KKwlbdm9sYXRpbGUgdm9pZCAqIC0+IHZvaWQgKl0uCisKKzIwMDUtMDktMTIgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3RscG9ydC9zdGwvX3RocmVhZC5oOiBGaXggX0F0b21pY19zd2FwX3B0ciBpbXBsZW1lbnRhdGlvbiBpbiBzaW5nbGUKKwl0aHJlYWRlZCBtb2RlIGFuZCB3aGVuIHRoZXJlIGlzIG5vIHBvaW50ZXIgYXRvbWljIHN3YXAgb3BlcmF0aW9uLgorCisJKiBzdGxwb3J0L3N0bC9fc2l0ZV9jb25maWcuaDogQWRkIF9TVExQX05PX0NZR1dJTiBtYWNybyB0byBzaWduYWwgdXNlCisJb2YgdGhlIC1tbm8tY3lnd2luIGN5Z3dpbiBvcHRpb24uCisKKwkqIGJ1aWxkL2xpYi9jb25maWd1cmU6IFJlbW92ZSBhdXRvbWF0aWMgZ2VuZXJhdGlvbiBvZiBzdGxwb3J0L3NjcmlwdF9jb25maWcuaC4KKworMjAwNS0wOS0xMSAgUGV0ciBPdnRjaGVua292ICA8Y29tcGxlbWVudEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGJ1aWxkL01ha2VmaWxlcy9nbWFrZS9zeXNpZC5tYWs6IHByb3ZpZGUgaWRlbnRpZmljYXRpb24gaG9zdGVkIHBsYXRmb3JtLgorCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2UvdGFyZ2V0ZGlycy5tYWs6IEN5Z1dpbi9NaW5HVyBoYXMgbm8gL3Vzci9iaW4vdGVzdCwKKwlidXQgYnVpbHQtaW4gdGVzdCBzdXBwb3J0IC1lOyBzZWUgcmVjb3JkIDIwMDUtMDktMDQuCisKKwkqIGJ1aWxkL01ha2VmaWxlcy90b3AubWFrOiBzZXBhcmF0ZSBob3N0ZWQgcGxhdGZvcm0gYW5kIHRhcmdldCBwbGF0Zm9ybQorCWZpbGUgZXh0ZW50aW9ucywgdG9vbHMsIHV0aWxpdGVzLgorCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2UvPy9zeXMubWFrLCBidWlsZC9NYWtlZmlsZXMvZ21ha2UvPy90YXJnZXRzeXMubWFrOgorCWRpdHRvLgorCisyMDA1LTA5LTA5ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHNyYy9jX2xvY2FsZV93aW4zMi5jOiBGaXggX0xvY2FsZV93Y2hhcl9bdG9sb3dlcix0b3VwcGVyXSBpbXBsZW1lbnRhdGlvbgorCXdoaWNoIHdhcyB3cm9uZyB3aGVuIHdpbnRfdCB3YXMgbm90IHRoZSBzYW1lIHR5cGVkZWYgYXMgd2NoYXJfdC4KKworCSogYnVpbGQvbGliL2NvbmZpZ3VyZTogUmVtb3ZlZCBvYnNvbGV0ZSBjb25maWd1cmUgb3B0aW9ucyAtLXdpdGgtbXN2YyBhbmQKKwktLXdpdGgtbXNzZGsuIEFuZCAtLW5vLWN5Z3dpbiBvcHRpb24gdG8gbWFrZSBidWlsZCBvZiBTVExwb3J0IHVzaW5nIC1tbm8tY3lnd2luCisJb3B0aW9uIGVhc2llci4KKworCSogc3RscG9ydC9zY3JpcHRfY29uZmlnLmg6IE5ldyBoZWFkZXIgdXNlZCB0byBwdXQgYWRkaXRpb25uYWwgbWFjcm9zIGRlZmluZWQKKwlieSB0aGUgY29uZmlndXJlIHNjcmlwdC4KKworCSogc3RscG9ydC9zdGwvX2NvbmZpZy5oOiBBZGQgc2NyaXB0X2NvbmZpZy5oIGluY2x1ZGUuCisKKwkqIHN0bHBvcnQvY29uZmlnL3N0bF9nY2MuaDogVXNlIG9mIHRoZSBuZXcgX1NUTFBfTk9fQ1lHV0lOIG1hY3JvIHRvIHNldAorCXRoZSByaWdodCBfU1RMUF9OQVRJVkVfSU5DTFVERV9QQVRIIG1hY3JvIHZhbHVlLgorCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2UvZ2NjLm1hazogQ2hhbmdlIENDIGFuZCBDWFggYXNzaWdubWVudCBmcm9tIDo9IHRvCisJPz0gdG8gdGFrZSBpbnRvIGFjY291bnQgYW4gYWxyZWFkeSBleGlzdGluZyBkZWZpbml0aW9uLgorCisyMDA1LTA5LTA3ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIGJ1aWxkL01ha2VmaWxlcy9nbWFrZTogQWRvcHQgYSBtb3JlIHRyYWRpdGlvbm5hbCB1bml4ZXMgbmFtaW5nCisJY29udmVudGlvbiBmb3IgY3lnd2luIGFuZCBtaW5ndy4KKworCSogYnVpbGQvTWFrZWZpbGVzL25tYWtlOiBBdHRlbXB0IHRvIG1ha2UgU1RMcG9ydCBsaWJyYXJ5IG5hbWVzIG1vcmUKKwljb2hlcmVudCBiZXR3ZWVuIHVuaXhlcyBhbmQgd2luZG93cyBzeXN0ZW1zLiBOb3cgd2luZG93cyB1c2UgdGhlIDUuMAorCWV4dGVuc2lvbiBsaWtlIHVuZGVyIHVuaXhlcyBldmVuIGlmIHVuZGVyIHVuaXhlcyB0aGUgZmlsZSBleHRlbnNpb24KKwlpcyBiZWZvcmUgdGhlIDUuMCBhbmQgdW5kZXIgd2luZG93cyBpdCB3aWxsIGJlIGFmdGVyLiBUaGUgb3RoZXIKKwlkaWZmZXJlbmNlIGlzIHRoYXQgdGhlIGRlYnVnIHN1ZmZpeCBpcyAnZycgd2hlbiB1c2luZyBnY2MgYW5kICdkJyBmb3IKKwl0aGUgb3RoZXIgY29tcGlsZXJzLiBUaGlzIG1vZGlmaWNhdGlvbiBjb21lcyBmcm9tIGEgd29yayB0byBpbXByb3ZlCisJU1RMcG9ydCBpbnRlZ3JhdGlvbiB3aXRoaW4gYm9vc3QgYnVpbGQgc3lzdGVtLCBiamFtLgorCisJKiBzdGxwb3J0L2NvbmZpZy9zdGxfbXN2Yy5oOiBNb2RpZnkgTVNWQyBhdXRvIGxpbmsgZmVhdHVyZSB0byByZWZsZWN0CisJYWJvdmUgbW9kaWZpY2F0aW9ucy4KKworMjAwNS0wOS0wNiAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L2NvbmZpZy9zdGxfZ2NjLmg6IEZpeCBjeWd3aW4gY29uZmlnIHRoYXQgZG8gaGF2ZSBuYXRpdmUKKwltYnN0YXRlX3QgZGVmaW5pdGlvbi4KKworMjAwNS0wOS0wNSAgUGV0ciBPdnRjaGVua292ICA8Y29tcGxlbWVudEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHJlcG9zaXRvcnk6IFJDNSwgdGFnIFNUTFBPUlRfNV8wX1JDNQorCisyMDA1LTA5LTA0ICBQZXRyIE92dGNoZW5rb3YgIDxjb21wbGVtZW50QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogYnVpbGQvTWFrZWZpbGVzL2dtYWtlL3RhcmdldGRpcnMubWFrOiBpbiBzaCdzIGJ1aWx0LWluICd0ZXN0JyBubyAtZQorCW9wdGlvbiBvbiBTb2xhcmlzLCB1c2UgZXh0ZXJuYWwgJ3Rlc3QnIGluc3RlYWQuCisKKwkqIGJ1aWxkL3Rlc3QvdW5pdC9nY2MubWFrOiBGaXggTERTRUFSQ0ggcmVjdXJzaXZlIHByb2JsZW07IGZpeAorCW9wdGlvbnMgZm9yIGxkIHNlYXJjaCBwYXRoIGZvciBzb21lIHBsYXRmb3Jtcy4KKworCSogc3RscG9ydC9jc3RkbGliLCBzdGxwb3J0L3N0bC9fY21hdGguaDogZml4IHVzYWdlIG9mIG5hdGl2ZQorCT9mIGFuZCA/bCBtYXRoIGZ1bmN0aW9ucyBvbiBTb2xhcmlzOyBoeXBvdCBmb3IgbG9uZyBkb3VibGUgc2hvdWxkJ3QKKwlsb29zZSBwcmVjaXNpb24sIGlmIG5vIG5hdGl2ZSBDIGZ1bmN0aW9uIHByZXNlbnQuCisKKzIwMDUtMDktMDIgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3RscG9ydC9jb25maWcvc3RsX21zdmMuaCwgc3RsL19tb3ZlX2NvbnN0cnVjdF9md2suaDogQWRkIHRoZSAKKwlfU1RMUF9OT19NT1ZFX1NFTUFOVElDIGNvbmZpZ3VyYXRpb24gbWFjcm8gdG8gcmVtb3ZlIG1vdmUgc2VtYW50aWMKKwlzdXBwb3J0IGZvciBNU1ZDIC5OZXQgMjAwMiB0aGF0IHNlZW1zIHRvIGJlIHVuYWJsZSB0byBzdXBwb3J0IGl0LgorCU1heWJlIHdlIHNob3VsZCByYXRoZXIgcmVtb3ZlIHRoaXMgY29tcGlsZXIgdmVyc2lvbiBzdXBwb3J0Li4uCisKKwkqIHRlc3QvdW5pdC9tdmN0b3JfdGVzdC5jcHA6IEFkZCBfU1RMUF9OT19NT1ZFX1NFTUFOVElDIGNoZWNrLgorCisyMDA1LTA4LTMxICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIGJ1aWxkL01ha2VmaWxlcy9ubWFrZTogRW5oYW5jZSBubWFrZSBidWlsZCBzeXN0ZW0gdG8gY29ycmVjdGx5IHRha2UKKwlpbnRvIGFjY291bnQgdGhlIC5tYW5pZmVzdCBmaWxlcyBnZW5lcmF0ZWQgYnkgVlMgMjAwNSBCZXRhLgorCisyMDA1LTA4LTI5ICBQZXRyIE92dGNoZW5rb3YgIDxjb21wbGVtZW50QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogQ1ZTIHJlcG9zaXRvcnk6IENWUyByZXBvc2l0b3J5IG1hc3RlciBjb3BpZWQgZnJvbSBjdnMuc3RscG9ydC5jb20gdG8gU291cmNlRm9yZ2UuCisJQWxsIGhpc3RvcnkgcHJlc2VydmVkIQorCisyMDA1LTA4LTI3ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL19oYXNodGFibGUuaDogRml4IG1vdmUgZmVhdHVyZSBpbnRlZ3JhdGlvbiBmb3IgdGhlIGhhc2hfbXVsdGltYXAKKwljb250YWluZXIuCisKKwkqIHN0bHBvcnQvc3RsL19kZXF1ZS5oOiBGaXggX0RlcXVlX2Jhc2UgbW92ZSBjb25zdHJ1Y3RvciBpbXBsZW1lbnRhdGlvbi4KKworCSogdGVzdC91bml0L212Y3Rvcl90ZXN0LmNwcDogQ2hhbmdlIG1vdmUgY29uc3RydWN0b3IgdGVzdHMgdG8gdXNlIGR5bmFtaWNhbGx5CisJYWxsb2NhdGVkIHN0cmluZyByYXRoZXIgdGhhbiBzdGF0aWMgb25lcy4KKworCSogYnVpbGQvdGVzdC91bml0L25tYWtlLXZjNi5tYWs6IEluY3JlYXNlIGNvbXBpbGVyIG1heGltdW0gaGVhcCBzaXplIHRvIGFsbG93CisJY29tcGlsYXRpb24gd2l0aCBzdGxkYmcgcnVsZXMuCisKKwkqIGJ1aWxkL3Rlc3QvdW5pdC9ubWFrZS1ldmM0Lm1hazogRml4IG1hY3JvIHR5cG8gT1BUX1NUTERCR19TVEFUSUMgLT4gCisJT1BUX1NUQVRJQ19TVExEQkcKKworCSogYnVpbGQvTWFrZWZpbGVzL2dtYWtlL2djYy5tYWs6IEZpbHRlciBvdXQgdGhlIG5ld2x5IGFkZGVkIC1mdXNlLWN4YS1hdGV4aXQKKwljb21waWxhdGlvbiBvcHRpb24gZm9yIEN5Z3dpbiBhbmQgTWluZ3csIHRoZSBncmFudGVkIGxpYmMgaXMgbm90IGNvbXBhdGlibGUKKwl3aXRoIGl0LgorCisyMDA1LTA4LTI2ICBQZXRyIE92dGNoZW5rb3YgIDxwdHJAaXNsYW5kLi4uPgorCisJKiBzdGxwb3J0L2NvbmZpZy9zdGxfc29sYXJpcy5oOiBDKysgY29tbWVudHMgcmVwbGFjZWQgYnkgQyBvbmVzLAorCXRoaXMgZmlsZSBtYXkgYmUgaW5jbHVkZWQgYnkgQyBzb3VyY2VzLiBUaGFua3MgTWF0dGkgUmludGFsYS4KKworMjAwNS0wOC0yNSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bC9fY29uZmlnLmgsIF9lcGlsb2cuaDogTW92ZSBvZiBzdGxwb3J0IG5hbWVzcGFjZSBhbGlhcworCWRlZmluaXRpb24gZnJvbSBfZXBpbG9nLmggdG8gX2NvbmZpZy5oIHRvIGF2b2lkIHJlZGVmaW5pdGlvbiBhcyBfZXBpbG9nLmgKKwlpcyByZWVudHJhbnQuIFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciBhIEhQVVggYUNDIGNvbXBpbGVyIGJ1ZyByZXBvcnRlZAorCWJ5IEJha2VyLgorCisyMDA1LTA4LTI1ICBQZXRyIE92dGNoZW5rb3YgIDxwdHJAaXNsYW5kLi4uPgorCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2UvZ2NjLm1hazogdXNhZ2Ugb2YgLWZ1c2UtY3hhLWF0ZXhpdCBzdHJvbmdseQorCXJlcXVpcmVkIGZvciBjb3JyZWN0IG9yZGVyIG9mIHN0YXRpYyBvYmplY3RzIGR0b3JzIGNhbGxzLiBUaGlzIGlzCisJdXNlZCBpbiBkZWluaXRpYWxpemF0aW9uIG9mIGxvY2FsZS1yZWxhdGVkIG9iamVjdHMuIFRoYW5rcyBNYXR0aSBSaW50YWxhLgorCisJKiBzdGxwb3J0L3N0bC9fY29uZmlnLmg6IHVzZSBkaWZmZXJlbnQgbmFtZXNwYWNlcyBmb3IgbXVsaXRocmVhZGVkCisJYW5kIG5vbi1tdWx0aXRocmVhZGVkIGJ1aWxkcyB0byBhdm9pZCB1c2FnZSBvZiBub24tbXVsdGl0aHJlYWRlZAorCWFwcGxpY2F0aW9uIHdpdGggbXVsdGl0aHJlYWRlZCBsaWJzdGxwb3J0IGFuZCB2aWNlIHZlcnNhOworCVtjb21iaW5hdGlvbiBub24tbXQgJiBtdCBsZWFkIHRvIGNyYXNoIGR1ZSB0byBkaWZmZXJlbnQgaW5zdGFuY2VzCisJYW5kIHNpemVzIG9mIGFsbG9jYXRvcnMgZm9yIG5vbi1tdCBhbmQgbXQgY2FzZXNdLgorCisyMDA1LTA4LTIzICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL19jb25maWdfY29tcGF0Lmg6IEFkZCBjaGVjayBvZiBfU1RMUF9OT19PV05fSU9TVFJFQU1TCisJbWFjcm8gdG8gbWFrZSByZW1vdmUgb2YgaXRzIHN1cHBvcnQgbW9yZSBleHBsaWNpdCB0aGFua3MgdG8gYSAjZXJyb3IKKwlkaXJlY3RpdmUuCisKKwkqIHN0bHBvcnQvc3RsL190cmVlLmgsIF9oYXNodGFibGUuaDogTm93IHJlZmVyZW5jZSBhbmQgcG9pbnRlciB0eXBlcworCWFyZSB0YWtlbiBmcm9tIHRoZSBfVHJhaXRzIHRlbXBsYXRlIHBhcmFtZXRlciB1c2VkIHRvIGluc3RhbmNpYXRlCisJdGhlIGNsYXNzLiBEb2luZyBzbyBub3cgc2V0OjpyZWZlcmVuY2UgYW5kIGhhc2hfc2V0OjpyZWZlcmVuY2UgYXJlCisJY29uc3RfcmVmZXJlbmNlIHdoaWNoIGlzIGNvaGVyZW50IHdpdGggcmVzcGVjdGl2ZSBpdGVyYXRvcnMgdGhhdCBhcmUKKwlpbW11dGFibGUuIE1vcmVvdmVyIGl0IGZpeGVzIGEgVkM2IGJ1ZyBpbiByZXZlcnNlX2l0ZXJhdG9yIGltcGxlbWVudGF0aW9uCisJdGhhdCB3YXMgdHJ5aW5nIHRvIHRyYW5zZm9ybSBhIGNvbnN0IHJlZmVyZW5jZSB0byBhIHNpbXBsZSByZWZlcmVuY2UKKwl0aGFua3MgUnVzc2VsbCBNaWxsZXIgcmVwb3J0LgorCisJKiB0ZXN0L3VuaXQvc2V0X3Rlc3QuY3BwOiBOZXcgdGVzdCBjYXNlIGZvciBzZXQgcmV2ZXJzZV9pdGVyYXRvci4KKworMjAwNS0wOC0yMyAgUGV0ciBPdnRjaGVua292ICA8cHRyQGlzbGFuZC4uLj4KKworCSogc3RscG9ydC9jb25maWcvc3RsX2djYy5oOiBzZWVtcyBIUC1VWCBoYXMgbm8gKmYgdmFyaWFudHMgb2YgbWF0aAorCWZ1bmN0aW9ucyBbY2VpbGYsIGZhYnNmLCBldGMuXQorCisyMDA1LTA4LTIxICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL19zdHJpbmcuaCwgX3JvcGUuaDogUmVtb3ZlZCBfX21vdmVfdHJhaXRzIHNwZWNpYWxpemF0aW9uCisJZm9yIHN0cmluZyB3c3RyaW5nIGNyb3BlIGFuZCB3cm9wZS4gVGhlcmUgaXMgbm8gcmVhc29uIHRvIGJlbGlldmUgdGhhdAorCWl0cyBtb3ZlIGNvbnN0cnV0b3Igd2lsbCBiZSBjb21wbGV0ZSBhcyBhbiBTVExwb3J0IHVzZXIgaGFzIHRoZSByaWdodAorCXRvIHNwZWNpYWxpemVkIHRoZSBzdGQ6OmFsbG9jYXRvcjw+IHdpdGggY2hhciBvciB3Y2hhcl90LgorCisJKiBzdGxwb3J0L3N0bC9fZnVuY3Rpb25fYmFzZS5oLCBfYWxsb2MuaDogR2VuZXJhbGl6ZWQgdXNlIG9mIHRoZQorCV9fc3RscG9ydF9jbGFzcyBzdHJ1Y3QgcmF0aGVyIHRoYW4gaW50cm9kdWNpbmcgYSBuZXcgaGVscGVyIHR5cGUKKwkoX19zdGxwb3J0X2xlc3Mgb3IgX19zdGxwb3J0X2FsbG9jKSB3aGVuIHdlIG5lZWQgdG8gcmVjb2duaXplIFNUTHBvcnQKKwlpbXBsZW1lbnRhdGlvbiBmcm9tIGEgdXNlciBvbmUuCisKKzIwMDUtMDgtMjAgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3RscG9ydC9zdGwvX2xpc3QuaCwgX3NsaXN0Lmg6IEZpeCBtb3ZlIGNvbnN0cnVjdG9yIGltcGxlbWVudGF0aW9uCisJdGhhbmtzIEhlbnJpayBHb2xkbWFuICh3d3cueC1mb3JtYXRpb24uY29tKSByZXBvcnQuCisKKwkqIHN0bHBvcnQvc3RsL19hbGxvYy5oOiBGaXggdHlwZV90cmFpdHMgc3BlY2lhbGl6YXRpb24gZm9yIGFsbG9jYXRvcgorCXR5cGUuIE5vdyBzcGVjaWFsaXphdGlvbiBpcyBvbmx5IGFwcGx5IGZvciB0aGUgZGVmYXVsdCBTVExwb3J0IGFsbG9jYXRvcgorCWltcGxlbWVudGF0aW9uIGFuZCBub3QgZm9yIHBvdGVudGlhbCB1c2VyIHNwZWNpYWxpemF0aW9uLgorCisJKiBzdGxwb3J0L3N0bC9fZGVxdWUuaCwgX2hhc2h0YWJsZS5oLCBfc3RyaW5nLmgsIF90cmVlLmgsIF92ZWN0b3IuaDoKKwlTaW1wbGlmaWNhdGlvbiBvZiB0aGUgbW92ZSBmcmFtZXdvcmsgYXBwbGljYXRpb24gZXNwZWNpYWxseSBpbiB0aGUKKwlkZWZpbml0aW9uIG9mIHRoZSBjb250YWluZXJzIF9fbW92ZV90cmFpdHMgc3BlY2lhbGl6YXRpb24uIE1hbnkKKwlfQXNNb3ZlU291cmNlIGNhbGwgcmVwbGFjZWQgYnkgZXhwbGljaXQgY2FsbCB0byB0aGUgbW92ZSBjb25zdHJ1Y3RvcgorCXdoZW4gd2UgYXJlIHN1cmUgdGhhdCB0aGVyZSBpcyBvbmUuCisKKwkqIHRlc3QvdW5pdC9tdmN0b3JfdGVzdC5jcHA6IEFkZCBtYW55IHRlc3RzIHRvIGNoZWNrIG1vdmUgY29udHJ1Y3RvcgorCWltcGxlbWVudGF0aW9ucy4KKworCSogc3RscG9ydC9zdGwvX2Z1bmN0aW9uX2Jhc2UuaDogQWRkIHR5cGVfdHJhaXRzIHNwZWNpYWxpemF0aW9uIGZvciB0aGUKKwlsZXNzIGZ1bmN0b3IgdG8gaGVscCB0aGUgbW92ZSBmcmFtZXdvcmsgd2hlbiBkZWFsaW5nIHdpdGggYXNzb2NpYXRpdmUKKwljb250YWluZXJzLgorCisJKiB0ZXN0L3VuaXQvbXZjdG9yX3Rlc3QuY3BwOiBBZGQgYSBuZXcgdGVzdCBjYXNlIGNoZWNraW5nIGNvcnJlY3QgbW92ZQorCXNlbWFudGljIHN1cHBvcnQgZm9yIGFsbCBTVEwgY29udGFpbmVycy4KKworCSogc3RscG9ydC9zdGwvX3JvcGUuaDogQWRkIG1vdmUgc2VtYW50aWMgc3VwcG9ydCB0byB0aGUgcm9wZSBjbGFzcy4KKworMjAwNS0wOC0xOSAgUGV0ciBPdnRjaGVua292ICA8cHRyQGlzbGFuZC4uLj4KKworCSogYnVpbGQvTWFrZWZpbGVzL2dtYWtlL2djYy5tYWs6IGZpeCBleHRyYWN0aW9uIG9mIGdjYyB2ZXJzaW9uLgorCVRoYW5rcyBUaG9tYXMgS2hvLgorCisyMDA1LTA4LTE4ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL19kZXF1ZS5jOiBGaXggX01fZXJhc2UgcmFuZ2UgZm9yIG1vdmFibGUgdHlwZXMgbWV0aG9kCisJaW1wbGVtZW50YXRpb24sIHNhbWUgYnVnIGFzIGJlbG93IGluIHZlY3Rvci4KKworCSogdGVzdC91bml0L212Y3Rvci5jcHA6IEltcHJvdmUgdGVzdCBjYXNlIG9uIHZlY3RvciB0byByZXZlYWwgYnVnCisJYmVsb3cgYW5kIGFkZCBzYW1lIHRlc3RzIGZvciBkZXF1ZSB3aGljaCBpcyB0aGUgb3RoZXIgY29udGFpbmVyIHRoYXQKKwl1c2UgdGhlIG1vdmUgY29udHJ1Y3RvciBmZWF0dXJlLgorCisyMDA1LTA4LTE4ICBQZXRyIE92dGNoZW5rb3YgIDxwdHJAaXNsYW5kLi4uPgorCisJKiBJTlNUQUxMOiBhZGQgc29tZSB3b3JkcyBhYm91dCBtdWx0aXRocmVhZCBvcHRpb25zIGFuZCBsaWJyYXJpZXMuCisKKwkqIHN0bHBvcnQvc3RsL19mc3RyZWFtLmM6IHNvbWUgY29kZSBjbGVhbiB0byByZWR1Y2UgYm9ndXMgY29tcGlsZXIKKwl3YXJuaW5ncyB3aXRoIC1XYWxsLgorCisJKiBzdGxwb3J0L2NvbmZpZy9zdGxfZ2NjLmg6IHNlZW1zIEhQLVVYIGhhcyBubyBsbGFicyBhbmQgbGxkaXYuCisKKzIwMDUtMDgtMTcgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3RscG9ydC9zdGwvX3ZlY3Rvci5oOiBGaXggX01fZXJhc2UgcmFuZ2UgZm9yIG1vdmFibGUgdHlwZXMKKwlpbXBsZW1lbnRhdGlvbiB0aGFua3MgU2VyZ2VqIFphZ3Vyc2t5LgorCisJKiBidWlsZC9NYWtlZmlsZXMvbm1ha2UvdmM4Lm1hazogcmVtb3ZlZCAvUlRDMSBjb21waWxlciBvcHRpb24sIHRoZSBwbGF0Zm9ybQorCVNESyBjb21waWxlciBkbyBub3Qgc3VwcG9ydCBpdC4gU1RMcG9ydCB1c2VycyB3aWxsIGp1c3QgaGF2ZSB0byBhY3RpdmF0ZSBpdAorCWJ5IHRoZW1zZWxmIGlmIHRoZXkgd2FudCB0by4KKworCSogc3RscG9ydC9zdGwvX2NvbXBsZXguaDogRml4IHNvbWUgZmxvYXRpbmcgcG9pbnQgbGl0ZXJhbHMgdGhhbmtzCisJIFVscmljaCBFY2toYXJkdCByZXBvcnQuCisKKwkqIHN0bHBvcnQvc3RsL190aW1lX2ZhY2V0cy5jOiBDb21wbGV0ZSBpbnRlZ3JhdGlvbiBvZiB0aGUgJyMnIE1TIGV4dGVuc2lvbgorCWluIHRoZSBkYXRlL3RpbWUgZm9ybWF0IHN0cmluZywgcmVwb3J0ZWQgdGhhbmtzIHRvIHRoZSByZWNlbnQgbG9jYWxlIHRpbWVfZ2V0CisJbmV3IHRlc3QgY2FzZS4KKworMjAwNS0wOC0xNCAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L2NvbmZpZy9zdGxfbXN2Yy5oOiBGaXggcGxhdGZvcm0gU0RLIGNvbXBpbGVyIGNvbmZpZywgZXZlbiBsYXRlc3QKKwl2ZXJzaW9uIHRoYXQgYW5ub3VuY2UgdG8gYmUgc2ltaWxhciB0byAuTmV0IDIwMDUgYmV0YSBkbyBub3QgdGhyb3cgYmFkX2FsbG9jCisJZnJvbSB0aGUgbmV3IG9wZXJhdG9yLgorCisJKiBzdGxwb3J0L2NzdGRpbywgY3N0ZGxpYjogUmVwbGFjZWQgc29tZSBfV0lONjQgY2hlY2tzIGJ5IGEKKwlfU1RMUF9VU0lOR19QTEFURk9STV9TREtfQ09NUElMRVIgY2hlY2suCisKKwkqIHRlc3QvdW5pdC9jbWF0aF90ZXN0LmNwcDogQ29tcGxldGUgdGVzdCBmaWx0ZXJpbmcgZm9yIE1pY3Jvc29mdCBwbGF0Zm9ybSBTREsKKwljb21waWxlci4KKworMjAwNS0wOC0xNCAgUGV0ciBPdnRjaGVua292ICA8cHRyQGlzbGFuZC4uLj4KKworCSogdGVzdC91bml0L2xvY2FsZV90ZXN0LmNwcDogdGVzdHMgZm9yIHRpbWVfZ2V0IGZhY2V0LgorCisJKiBzdGxwb3J0L3N0bC9fdGltZV9mYWNldHMuYzogZml4IHByb2Nlc3Npbmcgb2YgJXAgZm9ybWF0CisJWzEyOjAwIFBNIH4gMTI6MDAsIDEyOjAwIEFNIH4gMDA6MDBdLgorCisJKiBzcmMvdGltZV9mYWNldHMuY3BwOiBzdWJzdGl0dXRlIGV4cGFuZGVkIGVxdWl2YWxlbnQgZm9ybWF0IHN0cmluZ3MKKwlpbnN0ZWFkIG9mICVULCAlUiwgJXIuCisKKwkqIHN0bHBvcnQvcHRocmVhZC5oOiBGaXggQysrIGNvbW1lbnQgaW4gYSBwb3RlbnRpYWxseSBDIGhlYWRlci4gVGhhbmtzIEFsaQorCisyMDA1LTA4LTExICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsX3VzZXJfY29uZmlnLmg6IEFkZCBfU1RMUF9VU0lOR19QTEFURk9STV9TREtfQ09NUElMRVIgc28gdGhhdAorCVNUTHBvcnQgdXNlciBjYW4gc2lnbmFsIHRoZXkgYXJlIHVzaW5nIHBsYXRmb3JtIFNESyBjb21waWxlci4KKworCSogc3RscG9ydC9jb25maWcvc3RsX21zdmMuaDogQWRkIHVzZSBvZiBfU1RMUF9VU0lOR19QTEFURk9STV9TREtfQ09NUElMRVIuCisKKwkqIHRlc3QvdW5pdC9jbWF0aF90ZXN0LmNwcCwgdmFsYXJyYXlfdGVzdC5jcHA6IFJlbW92ZWQgdGFuaCBjYWxscyB3aGVuIHVzaW5nCisJQU1EIDY0IHBsYXRmb3JtIFNESyBjb21waWxlciwgbG9va3MgbGlrZSB0aGV5IG1pc3Mgc29tZXRoaW5nLi4uCisKKzIwMDUtMDgtMDkgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3JjL2ZzdHJlYW0uY3BwOiBGaW5hbCBmaXggb2YgYmFzaWNfZmlsZWJ1Zjo6b3BlbiBtZXRob2QuIE5vdyB3aGVuIG9wZW4KKwlmcm9tIGEgV2luMzIgaGFuZGxlIHRoZSBmaWxlIHdpbGwgYmUgY29uc2lkZXJlZCBhcyBpbiBiaW5hcnkgYWNjZXNzIHdpdGggbm8KKwlhcHBlbmQgYWN0aW9uLgorCisyMDA1LTA4LTA4ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHNyYy9mc3RyZWFtLmNwcDogRml4IGFubm95aW5nIDY0IHdhcm5pbmcgYW5kIGJhc2ljX2ZpbGVidWY6Om9wZW4gbWV0aG9kCisJZnJvbSBhIGxvdyBsZXZlbCBmaWxlIGRlc2NyaXB0b3Igb3IgZnJvbSBhbiBIQU5ETEUgKG5vdCB5ZXQgY29tcGxldGUpLgorCVRoYW5rcyBZdmVzIE1hbGlldCByZXBvcnQuCisKKzIwMDUtMDgtMDcgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogdGVzdC91bml0L2lubmVyX3Byb2R1Y3QuY3BwOiBGaXggNjQgYml0cyBwb3J0YWJpbGl0eSB3YXJuaW5nLgorCisJKiB0ZXN0L3VuaXQvY21hdGhfdGVzdC5jcHA6IFJlbW92ZWQgbW9kZiB0ZXN0cyBmb3IgV2luZG93cyA2NCBwbGF0Zm9ybQorCWFzIHRoZSBTREsgaXMgbWlzc2luZyB0aGUgdW5kZXJseWluZyBtb2RmZiBpbXBsZW1lbnRhdGlvbi4KKworCSogc3RscG9ydC9jc3RkbGliOiBBZGQgYSBkaXYgZnVuY3Rpb24gZGVmaW5pdGlvbiB3aGljaCBpcyBtaXNzaW5nIGluIHRoZQorCVdpbmRvd3MgNjQgU0RLLgorCisJKiBzdGxwb3J0L2NzdGRpbzogQWRkIHZzbnByaW50ZiBkZWZpbml0aW9uIHdoaWNoIGlzIG1pc3NpbmcgaW4gV2luZG93cworCTY0IFNESy4KKworCSogc3RscG9ydC9leGNlcHRpb246IEFkZCBmbGV4aWJpbGl0eSBmb3IgZGVmaW5pdGlvbiBvZiB2ZW5kb3IgdGVybWluYXRlCisJYW5kIHVuY2F1Z2h0X2V4Y2VwdGlvbiBmdW5jdGlvbiBuYW1lc3BhY2UuIENhbiBub3cgYmUgZGVmaW5lZCBpbmRlcGVuZGFudGx5CisJb2YgdGhlIHVuZXhwZWN0ZWRfZXhjZXB0aW9uIG5hbWVzcGFjZS4KKworCSogc3JjL2RsbF9tYWluLmNwcDogUmVtb3ZlZCBleHBsaWNpdCB0dXJuIG9mZiBvZiBvcHRpbWl6YXRpb24gZm9yIE1pY3Jvc29mdAorCWNvbXBpbGVycyBhZnRlciAuTmV0IDIwMDMuIFRoZXJlIHdlcmUgbm8gY29tbWVudCB0byBleHBsYWluIHdoeSBvcHRpbWl6YXRpb25zCisJd2VyZSB0dXJuZWQgb2ZmIHNvIEkgZ3Vlc3MgaXQgd2FzIGEgY29tcGlsZXIgYnVnLiAuTmV0IDIwMDMgYmVpbmcgYSBtYWpvcgorCW5ldyB2ZXJzaW9uIEkgaG9wZSB0aGlzIGJ1ZyBoYXMgdmFuaXNoIHdpdGggdGhpcyB2ZXJzaW9uLgorCisJKiBzcmMvZnN0cmVhbS5jcHA6IFJlbW92ZWQgc3RhdGljIGFzc2VydGlvbiBmb3Igd2luZG93cyBmaWxlIGhhbmRsZSB0byBiZSAzMgorCWJpdHMuIFVuZGVyIFdpbmRvd3MgNjQsIGV2ZW4gaWYgdGhlIEFQSSBpcyBzdGlsbCAzMiBiaXRzIGhhbmRsZXMgYXJlIHN0aWxsCisJZGVmaW5lZCBhcyB2b2lkKi4gV2Ugd2lsbCBzZWUgd2hlbiBjb2RlIHdpbGwgcnVuIHVuZGVyIGEgcmVhbCBXaW5kb3dzIDY0IHBsYXRmb3JtCisJaWYgaXQgaXMgYSBwcm9ibGVtLgorCisJKiBzdGxwb3J0L2NvbmZpZy9zdGxfbXN2Yy5oOiBBZGQgY29uZmlndXJhdGlvbiBmb3IgV2luZG93cyA2NCBQbGF0Zm9ybSBTREsuCisJRXhwZWNpYWxseSBhZGQgYXV0b21hdGljIGxpbmsgdG8gYnVmZmVyb3ZlcmZsb3dVLmxpYiB0byBhdm9pZCBtb2RpZmljYXRpb24KKwlvZiBTVExwb3J0IGJ1aWxkIHN5c3RlbSBhbmQgU1RMcG9ydCB1c2VycyBwcm9qZWN0cy4KKworMjAwNS0wOC0wNiAgUGV0ciBPdnRjaGVua292ICA8cHRyQGlzbGFuZC4uLj4KKworCSogc3JjL2NfbG9jYWxlX2dsaWJjL2NfbG9jYWxlX2dsaWJjMi5jOiBhZGQgZXhwbGljaXQgdHlwZSBjb252ZXJzaW9uCisJdG8gYXZvaWQgd2FybmluZ3Mgb24gNjQtYml0cyBwbGF0Zm9ybXM7IHRoYW5rcyBUaG9tYXMgS2hvIGFuZAorCUthcm9sIFN6a3VkbGFyZWsgZm9yIHJlcG9ydC4KKworMjAwNS0wOC0wNSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bC9fdmFsYXJyYXkuaDogQWRkIG1pc3NpbmcgX2RlYnVnLmggaGVhZGVyIGluY2x1c2lvbiBmb3IKKwlfU1RMUF9BU1NFUlQgbWFjcm8gZGVmaW5pdGlvbi4KKworCSogc3RscG9ydC9zdGwvZGVidWcvX2hhc2h0YWJsZS5oOiBGaXggdHlwbyBpbiBoYXNodGFibGUgbW92ZSBjb25zdHJ1Y3Rvci4KKwlUaGFua3MgYXJhYmVzYyByZXBvcnQuCisKKzIwMDUtMDgtMDUgIFBldHIgT3Z0Y2hlbmtvdiAgPHB0ckBpc2xhbmQuLi4+CisKKwkqIGRvYy9GQVE6IHNvbWUgd29yZHMgYWJvdXQgY3Jvc3MtY29tcGlsYXRpb24uCisKKzIwMDUtMDgtMDQgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3RscG9ydC9zdGwvX2hhc2h0YWJsZS5jOiBGaXggZXJhc2UocmFuZ2UpIGltcGxlbWVudGF0aW9uIHRoYW5rcworCWFyYWJlc2MuCisKKwkqIHRlc3QvdW5pdC9oYXNoX3Rlc3QuY3BwOiBBZGQgbmV3IHRlc3QgZm9yIHByZXZpb3VzIGZpeC4KKworMjAwNS0wOC0wNCAgUGV0ciBPdnRjaGVua292ICA8cHRyQGlzbGFuZC4uLj4KKworCSogc3RscG9ydC9jc2V0am1wOiBzb21ldGltZXMsIGlmIG5hdGl2ZSBzZXRqbXAuaCB3YXMgaW5jbHVkZWQgZmlyc3QsCisJdGhlIHNldGptcCBmdW5jdGlvbnMgc2l0dWF0ZWQgaW4gZ2xvYmFsIG5hbWVzcGFjZSwgbm90IGluIHZlbmRvcidzCisJc3RkLiBUaGlzIG1heSBjb25mdXNlIGZvbGxvd2luZyBjc2V0am1wLgorCisJKiB0ZXN0L3VuaXQvc2V0am1wX2hlYWRlcl90ZXN0Mi5jcHA6IHRlc3QgZm9yIHRoaXMuCisKKwkqIGJ1aWxkL3Rlc3QvdW5pdC9NYWtlZmlsZS5pbmM6IGRpdHRvLgorCisyMDA1LTA4LTAzICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIElOU1RBTEwgZG9jdW1lbnQgdXBkYXRlZCB0byBzaWduYWwgbm8gbG9uZ2VyIHN1cHBvcnQgb2YgdGhlCisJJ3dyYXBwZXInIG1vZGUuCisKKzIwMDUtMDgtMDIgIFBldHIgT3Z0Y2hlbmtvdiAgPHB0ckBpc2xhbmQuLi4+CisKKwkqIHN0bHBvcnQvc3RsX3VzZXJfY29uZmlnLmgsIHN0bHBvcnQvc3RsL19zaXRlX2NvbmZpZy5oOgorCWZpeCBzb21lIG9ic29sZXRlIGNvbW1lbnRzLgorCisyMDA1LTA3LTMxICBQZXRyIE92dGNoZW5rb3YgIDxwdHJAaXNsYW5kLi4uPgorCisJKiB0ZXN0L3VuaXQvbWF0aF9hdXguaCwgY21hdGhfdGVzdC5jcHA6IGFyZV9lcXVhbHMgbW92ZWQgaW50bworCW1hdGhfYXV4LmggdG8gcmV1c2UgaW4gb3RoZXIgdGVzdHMuCisKKwkqIHRlc3QvdW5pdC9zc3RyZWFtX3Rlc3QuY3BwOiBjaGVjayBpbnB1dCB0byBmbG9hdCwgaW5zcGlyZWQgYnkKKwlKZWZmIFdpbGxpYW1zLgorCisyMDA1LTA3LTI3ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvaW9tYW5pcCwgc3RsL19hbGdvLmg6IFJlbW92ZWQgc29tZSBwZXJzaXN0ZW50IG9jY3VyZW5jZXMKKwlvZiBfX2luIGFuZCBfX291dCBrZXl3b3JkcyByZXNlcnZlZCBieSBNaWNyb3NvZnQuCisKKwkqIHN0bHBvcnQvc3RsL19wdGhyZWFkX2FsbG9jLmM6IEZpeCBhbm5veWluZyB3YXJuaW5nIHJlcG9ydGVkIGJ5IGdjYy4KKworCSogc3RscG9ydC9jb25maWcvc3RsX21zdmMuaDogRml4IF9TVExQX1ZFTkRPUl9VTkVYUEVDVEVEX1NURCBtYWNybworCWRlZmluaXRpb24gdG8gZW1wdHkgcmF0aGVyIHRoYW4gJzEnLiBDb3VsZCBoYXZlIHByb2R1Y2UgYSBjb21waWxhdGlvbgorCWVycm9yIHdpdGggY29tcGlsZXJzIGxpa2UgSW50ZWwgQysrIHVzZWQgd2l0aCB0aGUgVkM2IG5hdGl2ZSBTdGFuZGFyZAorCWxpYnJhcnkuCisKKwkqIHN0bHBvcnQvcXVldWUsIHN0bC9fY3RyYWl0c19mbnMuaCwgX2hhc2h0YWJsZS5oLCBfbnVtZXJpYy5oLCBfc3RyaW5nLmgKKwlfdHJlZS5oOiBGaXggbWFjcm8gZ3VhcmRzIHVzZWQgdG8gYXZvaWQgaW5jbHVzaW9uIG9mIF9mdW5jdGlvbi5oIG9yCisJX2Z1bmN0aW9uX2Jhc2UuaCBvciBmdW5jdGlvbmFsIHRoYW5rcyBEaW5lc2ggTW9uZ2EgcmVwb3J0LgorCisyMDA1LTA3LTI2ICBQZXRyIE92dGNoZW5rb3YgIDxwdHJAaXNsYW5kLi4uPgorCisJKiBkb2MvRkFROiBkZXNjcmlwdGlvbiBvZiBwc2V1ZG8tbGVha3MsIHRoYW5rcyBNaWNoYWVsIEZpbmsuCisKKwkqIFNUTHBvcnQgKHJlcG9zaXRvcnkpOiBTVExwb3J0IDUuMCBSQzQKKworMjAwNS0wNy0yNSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L2NvbmZpZy9zdGxfZXZjLmg6IE1vdmUgX0RFQlVHIGRlZmluaXRpb24gZml4IHVwIGJlZm9yZQorCXN0bF9tc3ZjLmggaW5jbHVzaW9uIHRvIGhhdmUgY29ycmVjdCBsaWJyYXJ5IGxpbmsgYXV0b21hdGljYWxseS4KKwlUaGFua3MgTWljaGFlbCBGaW5rLgorCisyMDA1LTA3LTI0ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL19zdHJpbmcuYywgX3JvcGUuYzogQWRkIGluc3RhbmNpYXRpb24gb2YgbnBvcyBmb3IgYWxsCisJY29tcGlsZXJzIHRoYW5rcyBTaW1vbi4KKworCSogdGVzdC91bml0L3N0cmluZ190ZXN0LmNwcDogQWRkIGNyZWF0aW9uIG9mIGEgcmVmZXJlbmNlIHRvIHN0cmluZzo6bnBvcworCXRvIGZvcmNlIGNvbXBpbGVyIHRvIGdlbmVyYXRlIG1lbW9yeSBmb3IgaXQuIFVzZWQgdG8gcmV2ZWFsIGEgbGluayBlcnJvci4KKworCSogdGVzdC91bml0L2NwcHVuaXQvY3BwdW5pdF9taW5pLmg6IFJlbW92ZWQgcmVkb25kYW50IHNlbWkgY29sdW1uIGluIAorCUNQUFVOSVRfVEVTVF9TVUlURV9SRUdJU1RSQVRJT04gbWFjcm8gZGVmaW5pdGlvbi4KKworCSogc3RscG9ydC9jb25maWcvc3RsX21zdmMuaCwgc3RsX2ludGVsLmg6IENvbmNpZGVyaW5nIHRoYXQgY29tcGlsZXJzCisJZW11bGF0aW5nIE1TVkMgY29tcGlsZXJzIHVzZSB0aGUgc2FtZSBuYXRpdmUgU3RhbmRhcmQgTGlicmFyeSBoZWFkZXJzCisJbWFjcm9zIF9TVExQX05FV19QTEFURk9STV9TREsgYW5kIF9TVExQX05PX1ZFTkRPUl9TVERMSUJfTCBoYXMgYmVlbiBtb3ZlZAorCW91dHNpZGUgdGhlIF9TVExQX01TVkMgc2NvcGUuIF9TVExQX0dMT0JBTF9ORVdfSEFORExFUiBpcyBub3cgZGVmaW5lZAorCW9ubHkgZm9yIEludGVsIGNvbXBpbGVyIHZlcnNpb25zIGJlZm9yZSA5LjAuCisKKwkqIHN0bHBvcnQvY3N0ZGxpYiwgc3RsL19jbWF0aC5oOiBCZWNhdXNlIG9mIHRoZSBwcmV2aW91cyByZW1hcmsgYWJvdXQKKwllbXVsYXRvcnMgb2YgTVNWQyB1c2luZyBNU1ZDIGhlYWRlcnMsIG1hY3JvIGNoZWNrcyBmb3IgZ2xvYmFsIGRlZmluaXRpb24KKwlvZiBDIG1hdGggZnVuY3Rpb25zIGhhcyBiZWVuIGNoYW5nZWQgZnJvbSBfU1RMUF9NU1ZDIHRvIF9NU0NfVkVSLiAKKworMjAwNS0wNy0yMyAgTWljaGFlbCBGaW5rICA8dml2aWRvc0B1c2Vycy5zb3VyY2Vmb3JnZS4uLj4KKworCSogdGVzdC91bml0L2xvY2FsZV90ZXN0LmNwcDogQWRkZWQgY3JlYXRpbmcgbG9jYWxlIHBvaW50ZXIgaW4KKwl0ZXN0X3N1cHBvcnRlZF9sb2NhbGUoKSB3aGVuIG5vIGV4Y2VwdGlvbiBoYW5kbGluZyBpcyBhdmFpbGFibGUuCisKKwkqIHNyYy9zdGxwb3J0LnJjOiBBZGRlZCB2ZXJzaW9uIGluZm8gZGVmaW5lcyB3aGVuIG5vdCBhdmFpbGFibGUgdGhyb3VnaAorCXdpbmRvd3MuaC4gSGFwcGVucyBvbiBldmMzIE1JUFMgYW5kIGV2YzMgU0gzLgorCisyMDA1LTA3LTIzICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL19zdHJpbmdfc3VtLmg6IEZpeCBtaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gYSBjb21wYXJlCisJbWV0aG9kLgorCisyMDA1LTA3LTIyICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL19hbGdvLmM6IEZpeCBzZWFyY2hfbiBpbXBsZW1lbnRhdGlvbiBmb3IgcmFuZG9tIGFjY2VzcworCWl0ZXJhdG9yIHRoYW5rcyBKaW0gWG9jaGVsbGlzCisKKwkqIHRlc3QvdW5pdC9hbGdvX3Rlc3QuY3BwOiBBZGQgdGVzdCBjYXNlIGZvciB0aGUgcHJldmlvdXMgYnVnIHRoYW5rcworCU1pY2hhZWwgRmluay4KKworCSogc3JjL251bV9nZXRfZmxvYXQuY3BwOiBGaXggZ2NjIE1pbmd3aW4gYW5kIEN5Z3dpbiBzcGVjaWFsIHZlcnNpb24gd2l0aAorCWJ1aWxkaW5nIHdpdGggLU8yIG9wdGlvbi4KKworCSogYnVpbGQvTWFrZWZpbGVzL2dtYWtlL2djYy5tYWs6IEFkZCAtRF9SRUVOVFJBTlQgZGVmaW5pdGlvbiBmb3IgY3lnd2luIGFuZAorCS1tdGhyZWFkcyBmb3IgbWluZ3dpbiBwbGF0Zm9ybSB0byBtYWtlIFNUTHBvcnQgdGhyZWFkIHNhZmUgbGlrZSB1bmRlciB0aGUKKwlvdGhlciBzdXBwb3J0ZWQgcGxhdGZvcm1zLgorCisyMDA1LTA2LTMwICBQZXRyIE92dGNoZW5rb3YgIDxwdHJAaXNsYW5kLi4uPgorCisJKiBzdGxwb3J0L3djaGFyLmgsIHNyYy9jX2xvY2FsZS5jLCBzdGxwb3J0L3N0bC9fdGhyZWFkcy5oOiBmaXggTmV0d2FyZQorCXdjcy4uLiBmdW5jdGlvbnMuCisKKzIwMDUtMDYtMzAgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3RscG9ydC9zdGwvX3JvcGUuaCwgX3JvcGUuYzogRHVwbGljYXRlIGJhc2ljX3N0cmluZzo6bnBvcyBkZWZpbml0aW9uIGNvZGUKKwlpbiByb3BlIGltcGxlbWVudGF0aW9uIHRvIHVzZSBhICJTdGFuZGFyZCIgc3RhdGljIGNvbnN0IG5wb3MgZGVmaW5pdGlvbiB3aGVuCisJcG9zc2libGUgZGVwZW5kaW5nIG9uIHRoZSBjb21waWxlciBmZWF0dXJlcy4gVGhhbmtzIGNhbGR3ZWQgcmVwb3J0LgorCisyMDA1LTA2LTMwICBNaWNoYWVsIEZpbmsgIDx2aXZpZG9zQHVzZXJzLnNvdXJjZWZvcmdlLi4uPgorCisJKiBzdGxwb3J0L2NzdGRsaWIsIHN0ZGxpYi5oOiBGaXhlZCBpc3N1ZSB3aXRoIGluY2x1ZGluZyBzdGRsaWIuaCBhZnRlcgorCXNldGptcC5oOyBmaXggZnJvbSAyMDA1LTA2LTIzIHdhc24ndCBzb2x2aW5nIHRoZSBwcm9ibGVtLgorCisyMDA1LTA2LTI4ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL19oYXNoX2Z1bmMuaDogRm9yIE1TVkMgLk5ldCBjb21waWxlciB3ZSBncmFudCB0aGUgaGFzaDxzaXplX3Q+CisJc3BlY2lhbGl6YXRpb24gcmF0aGVyIHRoYW4gdGhlIGhhc2g8dW5zaWduZWQgaW50PiBvbmUgdG8gYXZvaWQgNjQgYml0cworCXdhcm5pbmdzIHdoZW4gaW5zdGFuY2lhdGluZyBhIGhhc2hlZCBjb250YWluZXIgd2l0aCB0aGUgc2l6ZV90IGtleS4KKworCSogc3RscG9ydC9zdGwvX2lzdHJlYW1faXRlcmF0b3IuaDogTW9kaWZ5IGlzdHJlYW1faXRlcmF0b3IgaW1wbGVtZW50YXRpb24KKwl0byBhdm9pZCB0aGUgZGVmYXVsdCByZWFkIGZyb20gdGhlIGlzdHJlYW0gZXZlbiBpZiB0aGUgaXN0cmVhbV9pdGVyYXRvcgorCWluc3RhbmNlIGlzIG5vdCB1c2VkLgorCisJKiB0ZXN0L3VuaXQvaXN0bWl0X3Rlc3QuY3BwOiBBZGQgbWFueSB0ZXN0cyBmb3IgdGhlIGNvcHlfbi9pc3RyZWFtX2l0ZXJhdG9yCisJY29tYmluYXRpb24uIFRob3NlIHRlc3RzIGFyZSBubyBhY3RpdmUgZm9yIHRoZSBtb21lbnQgYXMgdGhleSBhcmUgZmFpbGluZywKKwl3aWxsIGJlIGZpeGVkIGFmdGVyIDUuMCByZWxlYXNlLgorCisJKiBidWlsZC90ZXN0L3VuaXQvbm1ha2UtdmMtY29tbW9uLm1hazogVGVzdHMgYXJlIG5vIG1vcmUgYnVpbHQgd2l0aCB0aGUKKwlfU1RMUF9OT19DVVNUT01fSU8gb3B0aW9uLCBzZWUgcmVhc29uIGJlbG93LgorCisJKiB0ZXN0L3VuaXQvZnN0cmVhbV90ZXN0LmNwcDogQWRkIGN1c3RvbV9mYWNldCB0ZXN0IHRvIGNoZWNrIHRoYXQgU1RMcG9ydAorCXN1cHBvcnQgaW5zdGFuY2lhdGlvbiBvZiBiYXNpY19mc3RyZWFtIHdpdGggc29tZXRoaW5nIGVsc2UgdGhhdCB0aGUgc3RkOjpjaGFyX3RyYWl0cworCUZvciB0aGUgbW9tZW50IHRoZSB0ZXN0IGZhaWwgd2hlbiB3ZSB0cnkgdG8gdXNlIHRoZSBzdHJlYW0gZm9yIEkvTyBvcGVyYXRpb25zCisJc2hvdWxkIGJlIGZpeGVkIGFmdGVyIDUuMCByZWxlYXNlLgorCisyMDA1LTA2LTI3ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHNyYy9sb2NhbGVfaW1wbC5jcHA6IEZpeCBsb2NhbGUgaW1wbGVtZW50YXRpb24gdG8gYXZvaWQgdG8gY2FsbCBmYWNldAorCWRlc3RydWN0b3Igd2hlbiB1c2VyIGV4cGxpY2l0ZWx5IHJlcXVpcmVkIG5vdCB0byBkbyBzby4KKworCSogc3RscG9ydC9zdGwvX2ZzdHJlYW0uYzogRml4IF9NX3NldHVwX2NvZGVjdnQgbWV0aG9kIGltcGxlbWVudGF0aW9uIHRvIGF2b2lkCisJYSBiYWRfY2FzdCBleGNlcHRpb24gb24gYmFzaWNfZmlsZWJ1ZiBjb25zdHJ1Y3Rpb24uIEF0IHRoaXMgcG9pbnQgdGhlIGxvY2FsZQorCXVzZWQgdG8gaW5zdGFuY2lhdGUgaXQgaXMgdGhlIGNsYXNzaWMgbG9jYWxlIHRoYXQgbWlnaHQgbm90IGhhdmUgdGhlIG5lY2Vzc2FyeQorCWNvZGVjdnQgZmFjZXQuIFRoZSB1c2VyIGlzIHRoZW4gZm9yY2UgdG8gY2FsbCBpbWJ1ZSBhZnRlciBiYXNpY19maWxlYnVmCisJY29uc3RydWN0aW9uIG90aGVyd2lzZSBJL08gb3BlcmF0aW9ucyB3aWxsIGZhaWwuIFdoZW4gaW1idWUgaXMgaW52b2tlZCwgaWYKKwl0aGUgbG9jYWxlIHN0aWxsIGRvIG5vdCBoYXZlIHRoZSBuZWNlc2FyeSBmYWNldCwgdGhlIHN0cmVhbSBpcyBwdXQgaW4gdGhlIGZhaWwKKwlzdGF0ZS4gVGhhbmtzIEFsZXhhbmRlciBQb3RvdHNraXkKKworMjAwNS0wNi0yNiAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bC9fY29uZmlnX2NvbXBhdC5oOiBBZGQgX1NUTFBfT1dOX0lPU1RSRUFNUyBtYWNybyBmb3IgYmFja3dhcmQKKwljb21wYXRpYmlsaXR5IHdpdGggbGlicmFyeSBjaGVja2luZyBpdC4KKworMjAwNS0wNi0yMyAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzcmMvY29tcGxleC5jcHAsIGNvbXBsZXhfdHJpZy5jcHAsIGNvbXBsZXhfZXhwLmNwcDogUmVtb3ZlZCBjb2RlCisJZHVwbGljYXRpb24gYmV0d2VlbiBmbG9hdCwgZG91YmxlIGFuZCBsb25nIGRvdWJsZSB2ZXJzaW9uIHRoYW5rcyB0bworCXNvbWUgdGVtcGxhdGUgZnVuY3Rpb25zLiBUaGFua3MgYW4gVWxyaWNoIEVja2hhcmR0IGlkZWFyLgorCisJKiBzdGxwb3J0L2NzdGRsaWIsIHN0bC9zdGRsaWIuaDogTWljaGFlbCBGaW5rIHBhdGNoIHRvIGF2b2lkIHNldGptcC5oCisJaW5jbHVzaW9uIHByb2JsZW0gYXMgc3RkbGliLmggY29udGFpbnMgYSBzZXRqbXAgbWFjcm8gZGVmaW5pdGlvbi4KKworCSogdGVzdC9laC9tYWluLmNwcDogUmVkaXJlY3Rpb24gb2Ygc3RkOjpjb3V0IGFuZCBzdGQ6OmNlcnIgZm9yIFdpbkNFCisJdGhhbmtzIE1pY2hhZWwgRmluaworCisJKiBzdGxwb3J0L2NvbmZpZy9zdGxfZXZjLmg6IFJlc3RvcmUgbG9uZyBkb3VibGUgc3VwcG9ydCBmb3IgV2luQ0UsIHRoZXJlCisJaXMganVzdCBubyAqbCBtYXRoIGZ1bmN0aW9ucy4gT25seSBkZWZpbmUgX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSAorCWlmIG5vdCBhbHJlYWR5IGRlZmluZWQsIGdpdmluZyB0aGUgdXNlciBhIGNoYW5jZSB0byBvdmVycmlkZSB0aGUgZGVmYXVsdHMKKwlmb3IgeWV0IHVua25vd24gU0RLcy4gVGhhbmtzIE1pY2hhZWwgRmluayBhbmQgVWxyaWNoIEVja2hhcmR0LgorCisJKiBidWlsZC9NYWtlZmlsZXMvbm1ha2UvZXZjMy5tYWssIGV2YzQubWFrOiByZW1vdmVkIHVubmVlZGVkIHNldCBvZiBDQworCWZvciBTSHg7IGFscmVhZHkgZG9uZSBieSBzZXR1cCBiYXRjaC4gVGhhbmtzIE1pY2hhZWwgRmluay4gCisKKzIwMDUtMDYtMjEgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3RscG9ydC9zdGwvX2lvcy5oLCBfaW9zX2Jhc2UuaCwgX251bV9nZXQuYywgX251bV9wdXQuYywgX2NvbXBsZXguYywKKwlfaXN0cmVhbS5jLCBfdGltZV9mYWNldHMuYzogRml4IGNhc3QgZXhwcmVzc2lvbiBmb3IgdGhlIGNhY2hlZCBmYWNldHMsCisJQyBjYXN0cyByZXBsYWNlZCBieSBzdGF0aWNfY2FzdCBhbmQgY29uc3QgYWRkZWQgd2hlbiBtaXNzaW5nLgorCVRoYW5rcyBPbGl2ZXIgU3RvZW5lYmVyZyByZXBvcnQuCisKKwkqIHRlc3QvdW5pdC91bmFyeS5oOiBSZXBsYWNlZCBvbGQgU1RMcG9ydCB3aXRoIG5ldyBzdHlsZSBvbmVzLiBHZXQgc3FydAorCWZ1bmN0aW9uIGluIGdsb2JhbCBuYW1lc3BhY2UgcmF0aGVyIHRoYW4gZm9yY2luZyB1c2Ugb2YgdGhlIG9uZSBpbiBzdGQKKwluYW1lc3BhY2UsIGF2b2lkcyBhbWJpZ3VpdHkgd2l0aCBWQzYuCisKKwkqIHRlc3QvdW5pdC9yZXNvbHZlX25hbWUuY3BwOiBBZGQgX1NUTFBfRE9fSU1QT1JUX0NTVERfRlVOQ1RJT05TIGRlZmluaXRpb24KKwlhdCB0aGUgdG9wIG9mIGl0IHRvIGZvcmNlIGltcG9ydCBvZiBDIHN5bWJvbHMgaW4gc3RkIGV2ZW4gZm9yIGxpbWl0ZWQKKwljb21waWxlcnMgbGlrZSBWQzYuCisKKwkqIHN0bHBvcnQvc3RsL192YWxhcnJheS5oOiBBZGQgZ2xvYmFsIG5hbWVzcGFjZSBzY29wZSB0byBDIGZ1bmN0aW9uIGNhbGxzCisJdG8gYXZvaWQgVkM2IGFtYmlndWl0eSBwcm9ibGVtLgorCisyMDA1LTA2LTIwICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvY29uZmlnL3N0bF9nY2MuaDogRml4IGdjYyAzLjQuNCBkZXRlY3Rpb24gdW5kZXIgY3lnd2luIHRoYW5rcworCVVscmljaCBFY2toYXJkdCByZXBvcnQuCisKKwkqIHN0bHBvcnQvc3RsL2NfbG9jYWxlLmg6IEZpeCBfTG9jYWxlX21hc2tfdCBkZWZpbml0aW9uIGZvciBNaW5nd2luLgorCisJKiBzcmMvY19sb2NhbGVfd2luMzIvY19sb2NhbGVfd2luMzIuYzogQWRkIHN0YXRpYyBhc3NlcnRpb24gdG8gY2hlY2sKKwlfTG9jYWxlX21hc2tfdCBzaXplLgorCisJKiBzcmMvY29tcGxleF9leHAuY3BwOiBSZXBsYWNlZCBjb21wbGV4IGxvZzEwIGZ1bmN0aW9uIHN0YXRpYyB2YXJpYWJsZXMKKwl3aXRoIGdsb2JhbCBjb25zdGFudCwgYXZvaWQgbXVsdGl0aHJlYWRlZCBpbml0IHByb2JsZW0uIFRoYW5rcyBVbHJpY2gKKwlFY2toYXJkdCByZXBvcnQuCisKKzIwMDUtMDYtMTcgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3RscG9ydC9zdGwvX2FsbG9jLmg6IEFkZCBpbml0aWFsaXphdGlvbiBvZiB0aGUgbWVtb3J5IGJ1ZmZlciBpbgorCWFsbG9jYXRvcjo6YWxsb2NhdGUgZnVuY3Rpb24gYW5kIHJlc2V0IGluIGFsbG9jYXRvcjo6ZGVhbGxvY2F0ZSB0bworCXRoZSBfU1RMUF9TSFJFRF9CWVRFIG1vdGlmIHdoZW4gX1NUTFBfREVCVUdfVU5JTklUSUFMSVpFRCBpcyBkZWZpbmVkCisJdG8gaGVscCB0cmFjayBtaXNzaW5nIGluaXRpYWxpemF0aW9uIGlzc3VlLgorCisJKiBzcmMvZGxsX21haW4uY3BwOiBSZW1vdmVkIG5vdyB1c2VsZXNzIF9Ob2RlX2FsbG9jX2hlbHBlciBjbGFzcy4KKworCSogc3RscG9ydC9zdGwvX2FsbG9jLmM6IEFkZCBjb21wbGV0ZSBjbGVhbnVwIG9mIHRoZSBfX25vZGVfYWxsb2Mgc3RhdGljCisJZGF0YXMgaW4gdGhlIF9TX2NodW5rX2RlYWxsb2MgbWV0aG9kLCB0aGlzIGlzIGltcG9ydGFudCBpZiB0aGUgY2xlYW4gdXAKKwlvY2N1ciBiZWZvcmUgU1RMcG9ydCBzaGFyZWQgbGliIGlzIHVubG9hZGVkLgorCisJKiBzdGxwb3J0L3N0bC9fYWxsb2MuYzogQWRkIGEgc3RhdGljIGluc3RhbmNlIG9mIF9fbm9kZV9hbGxvY19jbGVhbmVyIGluIHRoZQorCV9TX2FsbG9jX2NhbGwgbWV0aG9kIGFuZCBjaGFuZ2UgaW5pdCBudW1iZXIgb2YgYWxsb2NhdGlvbiB0byAxIHRvIGZvcmNlCisJcmVsZWFzZSBvZiBtZW1vcnkgcG9vbCBvbmx5IG9uIHNoYXJlZCBsaWJyYXJ5IHVubG9hZC4KKworMjAwNS0wNi0xMSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L2NzdGRsaWIsIHN0bC9fY21hdGguaDogQWRkIF9TVExQX05PX0NTVERfRlVOQ1RJT05fSU1QT1JUUyBtYWNybworCWNoZWNrIGJlZm9yZSBpbXBvcnQgb2YgZ2xvYmFsIEMgZnVuY3Rpb25zIGluIFNUTHBvcnQgbmFtZXNwYWNlLiBSZXF1aXJlZAorCWZvciBWQzYgY29tcGlsZXIgdG8gYXZvaWQgYW1iaWd1aXR5IGlzc3VlLgorCisJKiBzcmMvY29tcGxleC5jcHAsIGNvbXBsZXhfZXB4LmNwcCwgY29tcGxleF90cmlnLmNwcDogU2NvcGUgbWF0aCBmdW5jdGlvbgorCWNhbGwgd2l0aCB0aGUgZ2xvYmFsIG5hbWVzcGFjZSB0byBhdm9pZCBWQzYgYW1iaWd1aXR5IGlzc3VlLiBJdCBpcyBzYWZlCisJZm9yIHRoZSBvdGhlciBjb21waWxlcnMgYXMgU1RMcG9ydCBkbyBkZWZpbmUgdGhvc2UgZnVuY3Rpb24gaW4gZ2xvYmFsCisJbmFtZXNwYWNlLgorCisyMDA1LTA2LTEwICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL2NfbG9jYWxlLmg6IEZpeCBDeWd3aW4gY29uZmlndXJhdGlvbiwgc2VwYXJhdGUgYWxwaGEgbWFzaworCWZyb20gbG93ZXIgYW5kIHVwcGVyIG9uZSB0byBhdm9pZCBhbGwgbG93ZXIgY2hhcmFjdGVyIHRvIGFsc28gYmUgdXBwZXIKKwlhbmQgb3Bwb3NpdGUuCisKKwkqIHNyYy9jdHlwZS5jcHA6IEFkZCBzdGF0aWMgYXNzZXJ0aW9uIHRvIGRldGVjdCBwbGF0Zm9ybSB3aGVyZQorCWFscGhhID0gbG93ZXIgfCB1cHBlciB3aGljaCBpcyB3cm9uZyBmb3IgU1RMcG9ydCB1c2UuCisKKzIwMDUtMDYtMTAgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3RscG9ydC9zdGwvX2hhc2h0YWJsZS5jOiBGaXggbWF4X2xvYWRfZmFjdG9yIG1hbmFnZW1lbnQsIFN0YW5kYXJkIHNheXMKKwl0aGF0IGxvYWRfZmFjdG9yIDw9IG1heF9sb2FkX2ZhY3RvciBhbmQgbm90IDw7IHRoZSBmdW5jdGlvbiBkZXRlY3RpbmcgbmVlZAorCWZvciByZWhhc2ggdXNlZCB0byBsYXVuY2ggb25lIGV2ZW4gaWYgdGhlIG51bWJlciBvZiBidWNrZXQgZG8gbm90IGNoYW5nZSB3aGljaAorCXdhcyBjb3VudGVyIHBlcmZvcm1hbnQuIEZpeCB0aGUgX01faW5zZXJ0X25vcmVzaXplIG1ldGhvZCB0aGF0IHdhcyBicmVha2luZworCWVsZW1lbnQgb3JkZXIgaW5zZXJ0aW5nIGVsZW1lbnRzIGluIHRoZSBtaWRkbGUgb2YgMiBlcXVhbCBlbGVtZW50cy4KKwlUaGFua3MgRGlldGVyIEZyZWlzbXV0aCByZXBvcnQuCisKKwkqIHN0bHBvcnQvY29uZmlnL3N0bF9nY2MuaDogRml4IHJlbGF0aXZlIGluY2x1ZGUgcGF0aCBmb3IgbGF0ZXN0IGdjYyBjeWd3aW4KKwlwYWNrYWdlLgorCisyMDA1LTA2LTEwICBQZXRyIE92dGNoZW5rb3YgIDxwdHJAaXNsYW5kLi4uPgorCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2UvbXdjY25sbS5tYWs6IGZpeCBjb21waWxlciB2ZXJzaW9uIGNvbGxlY3Rpb24uCisKKwkqIGJ1aWxkL01ha2VmaWxlcy9nbWFrZS9uZXR3YXJlL2V4dGVybi5tYWs6IGZpeCB1c2VmdWwgcGF0aHMuCisKKwkqIHNyYy9jX2xvY2FsZS5jOiBwdXQgaGVyZSB3cmFwcGVycyBmb3Igc29tZSB3ZnVuY3MsIGR1ZSB0byBib2d1cworCXN5c3RlbSBsaWJzIGluIE5ldHdhcmUuCisKKwkqIHN0bHBvcnQvY3djaGFyOiB1c2UgU1RMcG9ydCdzIHdjaGFyLmggdG8gdGFrZSB3Y2hhcl90L3dpbnRfdCBmb3IKKwlOZXR3YXJlLgorCisJKiBzdGxwb3J0L3djaGFyLmg6IHVzZSBjb3JyZWN0IEMgZGVjbGFyYXRpb24gb2Ygc29tZSB3ZnVuY3MsIHRoYW5rcworCWFnYWluIHRvIHVnbHkgTmV0d2FyZSBsaWJzLgorCisJKiBzdGxwb3J0L2Npc282NDYsIHN0bHBvcnQvaXNvNjQ2LmgsIHN0bHBvcnQvd2N0eXBlLmg6IGhlYWRlcnMgYWJzZW50CisJZm9yIE5vdmVsbCBOZXR3YXJlLgorCisJKiBzdGxwb3J0L2N3Y3R5cGU6IE1ldHJvd2Vya3MgZGVmaW5lIF9fTVNMX18sIGJ1dCB3ZSBkb24ndCB1c2UgTVNMIGxpYnMKKwlpZiB3ZSBoYXZlIFNUTHBvcnQgZm9yIE5ldHdhcmUuCisKKwkqIHN0bHBvcnQvY3N0ZGxpYjogZGl2IGZ1bmN0aW9uIGZyb20gTm92ZWxsIE5ldHdhcmUgY2xpYiBhbmQgbGliYyBsZWFkIHRvCisJc3lzdGVtIGNyYXNoLgorCisyMDA1LTA2LTA4ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIGJ1aWxkL3Rlc3QvdW5pdDogUmVtb3ZlZCByZWZlcmVuY2VzIHRvIHRoZSBub3cgdXNlbGVzcyBDUFBVTklUX01JTkkKKwltYWNyby4KKworCSogdGVzdC91bml0L3R5cGVfdHJhaXRzX3Rlc3QuY3BwOiBBZGQgbmV3IHRlc3QgY2FzZSBmb3IgdHJpdmlhbCBkZXN0cnVjdG9yCisJZGV0ZWN0aW9uLgorCisJKiBzdGxwb3J0L3N0bC9fZnN0cmVhbS5oOiBBZGQgbWlzc2luZyBiYXNpY19mc3RyZWFtIGNvbnN0cnVjdGlvbiBmcm9tIGEKKwlXaW4zMiBmaWxlIGhhbmRsZSwgd2FzIGFscmVhZHkgZG9uZSBmb3IgYmFzaWNfaWZzdHJlYW0gYW5kIGJhc2ljX29mc3RyZWFtLAorCXRoYW5rcyBBbGV4IENvc2VhbGluIHJlcG9ydC4KKworMjAwNS0wNi0wNyAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBidWlsZC90ZXN0L3VuaXQvTWFrZWZpbGUuaW5jOiBGaXggc3ludGF4IGVycm9yIGF0IGxhc3QgbGluZS4KKworMjAwNS0wNi0wNiAgUGV0ciBPdnRjaGVua292ICA8cHRyQGlzbGFuZC4uLj4KKworCSogYnVpbGQvbGliL2NvbmZpZ3VyZTogYWRkIGNvbmZpZyBvcHRpb25zIGZvciBNZXRyb3dlcmtzIGNvbXBpbGVyIGZvcgorCU5vdmVsbCBOZXRXYXJlIHBsYXRmb3JtIFtyZWZlcmVuY2VzIHRvIHJvb3Qgb2YgTVcgaGVhZGVycy9saWJzIGFuZCB0byBOb3ZlbGwncworCVNESyBoZWFkZXJzL2xpYnNdLgorCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2UvbXdjY25sbS5tYWs6IGZpeGVzIGZvciBNZXRyb3dlcmsvTmV0V2FyZS4KKworCSogYnVpbGQvTWFrZWZpbGVzL2dtYWtlL2FwcC9td2NjbmxtLm1hazogaWRlbS4KKworCSogYnVpbGQvTWFrZWZpbGVzL2dtYWtlL25ldHdhcmUvZXh0ZXJuLm1hazogaWRlbS4KKworCSogYnVpbGQvbGliL213Y2NubG0ubWFrOiBpZGVtLgorCisJKiBidWlsZC90ZXN0L3VuaXQvbXdjY25sbS5tYWs6IGlkZW0uCisKKzIwMDUtMDYtMDMgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogdGVzdC91bml0L2xvY2FsZV90ZXN0LmNwcDogUmVtb3ZlIHRoZSB2ZXJ5IHBsYXRmb3JtIGRlcGVuZGVudCBMQ29sbAorCWNsYXNzIHRoYXQgd2FzIGxpc3Rpbmcgc3VwcG9ydGVkIGxvY2FsZXMuIFNUTHBvcnQgYWxyZWFkeSBkbyBzbyBhbmQKKwlyZXBvcnQgaXQgdXNpbmcgYSBydW50aW1lX2Vycm9yIGV4Y2VwdGlvbiB3aGVuIG5vdCBzdXBwb3J0ZWQuIFdoZW4KKwljb21waWxlciBkbyBub3Qgc3VwcG9ydCBleGNlcHRpb24gb25seSB0aGUgQyBsb2NhbGUgaXMgY2hlY2tlZC4KKworCSogYnVpbGQvTWFrZWZpbGVzL25tYWtlOiBQYXRjaGVzIGZyb20gTWljaGFlbCBGaW5rIHRvCisJICAtIGNoZWNrIHBsYXRmb3JtIGJlZm9yZSBsaW5raW5nIHRvIGNydHJ0dGkubGliCisJICAtIGNoZWNrIHJpZ2h0IGNvbmZpZ3VyYXRpb24gd2hlbiB1c2luZyBhIG5tYWtlLWV2Yz8ubWFrIGZpbGUKKwkgIC0gdXBkYXRlIFNUQVRVUyBmaWxlLgorCisyMDA1LTA2LTAyICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHNyYy9jX2xvY2FsZV93aW4zMi9jX2xvY2FsZV93aW4zMi5jOiBBZGQgd29ya2Fyb3VuZCBmb3IgYSBXaW5kb3dzIFBTREsgYnVnCisJY29uY2VybmluZyBjdXJyZW5jeSBpbnRlcm5hdGlvbmFsIHN5bWJvbCwgdGhlIHNlcGFyYXRpb24gY2hhcmFjdGVyIGlzIG1pc3NpbmcuCisKKwkqIHNyYy9sb2NhbGVfaW1wbC5oLCBsb2NhbGVfaW1wbC5jcHA6IEZpeCBpbXBsZW1lbnRhdGlvbiB0byBtYWtlIGNsYXNzaWMgbG9jYWxlCisJaW1wbGVtZW50YXRpb24gYSBub3JtYWwgaW5zdGFuY2UgdGhhdCBpcyByZWxlYXNlZCB3aGVuIHRoZSBjb3VudGVyIHJlYWNoIDAsIHRoZQorCW9ubHkgZGlmZmVyZW5jZSBpcyB0aGF0IG5vIGRlbGV0ZSBpcyBwZXJmb3JtZWQgb24gdGhpcyBpbnN0YW5jZS4gSWRlbSBmb3IgY2xhc3NpYworCWxvY2FsZSBpbXBsZW1lbnRhdGlvbiBmYWNldHMuCisKKwkqIHN0bHBvcnQvY3djdHlwZTogQW5kIF9HTElCQ1BQX1VTRV9XQ0hBUl9UIGNoZWNrIHdoZW4gdXNpbmcgR0xpYkMgYXMgaW4gdGhpcworCWNhc2Ugd2lkZSBjaGFyIGZ1bmN0aW9ucyBhcmUgbm90IGltcG9ydGVkIGluIHN0ZCBhbmQgbXVzdCBiZSBpbXBvcnRlZCBmcm9tIHRoZQorCWdsb2JhbCBuYW1lc3BhY2UuCisKKzIwMDUtMDYtMDEgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3JjL2xvY2FsZV9pbXBsLmgsIGxvY2FsZV9pbXBsLmNwcDogQ2hhbmdlIGNsYXNzaWMgbG9jYWxlIGluaXRpYWxpemF0aW9uCisJaW1wbGVtZW50YXRpb24gZm9yIGxpbWl0ZWQgY29tcGlsZXIgbGlrZSBNU1ZDNi4KKworMjAwNS0wNi0wMSAgUGV0ciBPdnRjaGVua292ICA8cHRyQGlzbGFuZC4uLj4KKworCSogc3RscG9ydC9zdGwvY19sb2NhbGUuaDogY2hlY2sgZ2NjIG9uIE1hY09TIFguIFBhdGNoIGJ5IFpkZW5layBOZW1lYworCisJKiBidWlsZC9NYWtlZmlsZXMvbm1ha2UvZXZjMy5tYWssIGV2YzQubWFrLCB0YXJnZXRzLm1hazoKKwlzdXBwb3J0IFNIMy9TSDQgcGxhdGZvcm0uIFBhdGNoIGJ5IE1pY2hhZWwgRmluay4KKworCSogYnVpbGQvTWFrZWZpbGVzL25tYWtlL2FwcC9ldmMzLm1haywgZXZjNC5tYWs6IGRpdHRvLgorCisJKiBidWlsZC9NYWtlZmlsZXMvbm1ha2UvbGliL2V2YzMubWFrLCBldmM0Lm1hazogZGl0dG8uCisKKwkqIGJ1aWxkL2xpYi9jb25maWd1cmUuYmF0LCBzcmMvc3RscG9ydC5yYzogZGl0dG8uCisKKzIwMDUtMDUtMzAgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3JjL2xvY2FsZV9pbXBsLmgsIGxvY2FsZV9pbXBsLmNwcCwgc3RscG9ydC9zdGwvX2xvY2FsZS5oOiBBbiBvdGhlciBwYXNzCisJdGhyb3VnaHQgdGhlIGNsYXNzaWMgbG9jYWxlIGluaXRpYWxpemF0aW9uLiBOb3cgYWxsIG5lZWRlZCBzdGF0aWMgdmFyaWFibGVzCisJYXJlIGluIF9Mb2NhbGVfaW1wbDo6bWFrZV9jbGFzc2ljX2xvY2FsZSBtZXRob2QuIFJlbW92ZWQgdXNlbGVzcyBfU3RsX2FsaWduZWRfYnVmZmVyCisJdW5pb24gdXNlIGluIHRoaXMgbG9jYWxlIGluaXRpYWxpemF0aW9uLiBSZW1vdmVkIG5vdyB1c2VsZXNzIF9Mb2NhbGVfaW1wbDo6ZnJlZV9jbGFzc2ljX2xvY2FsZQorCW1ldGhvZC4KKworMjAwNS0wNS0zMCAgUGV0ciBPdnRjaGVua292ICA8cHRyQGlzbGFuZC4uLj4KKworCSogc3RscG9ydC9zdGwvX3dpbmRvd3MuaDogd29ycnkgYWJvdXQgV2luZG93cyBDRSB3aGVuIGNoZWNrIEludGVybG9ja2VkCisJQVBJIGZvciBNSVBTLiBQYXRjaCBieSBNaWNoYWVsIEZpbmsuCisKKwkqIGJ1aWxkL2xpYi9jb25maWd1cmUuYmF0OiByZW1vdmUgdGhlIC1wIG9wdGlvbiBieSBhdXRvZGV0ZWN0aW5nIHBsYXRmb3JtLgorCVBhdGNoIGJ5IE1pY2hhZWwgRmluay4KKworCSogYnVpbGQvTWFrZWZpbGVzL25tYWtlL2V2YzMubWFrLCBldmM0Lm1hazogY29ycmVjdHMgdGhlIGV2YzQgbWFrZWZpbGVzCisJdG8gYWx3YXlzIHVzZSB0aGUgL0dGIHN3aXRjaCBbc3RyaW5nIHBvb2xpbmddLiBQYXRjaCBieSBNaWNoYWVsIEZpbmsuCisKKwkqIGRvYy9SRUFETUUuZXZjMywgZG9jL1JFQURNRS5ldmM0OiByZWZsZWN0IGNoYW5nZXMgYWJvdmUuCisJUGF0Y2ggYnkgTWljaGFlbCBGaW5rLgorCisJKiBzdGxwb3J0L2Vycm5vLmgsIHN0bHBvcnQvdGltZS5oOiB3aGVuIGJ1aWxkaW5nIGZvciBldmMsIGluY2x1ZGluZworCWVycm5vLmggYW5kIHRpbWUuaCBvZnRlbiBvdXRwdXRzIHRoZSBtZXNzYWdlIGluIHRoZSAjcHJhZ21hIHN0YXRlbWVudAorCXRoYXQgaW5jbHVkaW5nIHRoaXMgZmlsZSB3b24ndCBpbmNsdWRlIHRoZSBuYXRpdmUgb25lLCBzaW5jZSB0aGVyZSBpcyBubworCW5hdGl2ZSBpbmNsdWRlIGZpbGUuIE5vdyB0aGUgdGV4dCBpcyBvbmx5IG91dHB1dCB3aGVuIG5vdCBidWlsZGluZyB0aGUgbGlicmFyeQorCWFuZCB3aGVuIHRoZSBmaWxlIGlzIGluY2x1ZGVkIGRpcmVjdGx5LCBub3QgdmlhIGFub3RoZXIgU1RMcG9ydCBoZWFkZXIgZmlsZS4KKwlbUGF0Y2ggYnkgTWljaGFlbCBGaW5rLl0KKworMjAwNS0wNS0yOSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiB0ZXN0L3VuaXQvbG9jYWxlX3Rlc3QuY3BwOiBBZGQgb3BlbmRpciByZXR1cm5lZCB2YWx1ZSB3aGVuIGxpc3RpbmcKKwlpbnN0YWxsZWQgbG9jYWxlIHVuZGVyIGxpbnV4LgorCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2U6IFBhdGNoIGZyb20gWmRlbmVrIE5lbWVjIGZvciBNYWMgT1MgWCBzdXBwb3J0LgorCisyMDA1LTA1LTI3ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHNyYy9sb2NhbGVfaW1wbC5jcHA6IEFkZCBhbiBpbml0aWFsaXphdGlvbiBzZWdtZW50IHNwZWNpZmljYXRpb24gdG8gbWFrZQorCWdsb2JhbCBzdGF0aWMgdmFyaWFibGUgaW9zX2Jhc2U6OkluaXQgaW5zdGFuY2UgaW5pdGlhbGl6YXRpb24gcHJpb3JpdGl6ZWQKKwljb21wYXJlIHRvIFNUTHBvcnQgc3RhdGljIGdsb2JhbCB2YXJpYWJsZS4gaW9zdHJlYW1zIGxpa2UgY291dCBjYW4gYmUgdXNlZAorCWluIGdsb2JhbCBzdGF0aWMgdmFyaWFibGUgaW5pdGlhbGl6YXRpb24uCisKKzIwMDUtMDUtMjYgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogYnVpbGQvTWFrZWZpbGVzL25tYWtlL2V2YzQubWFrOiBQYXRjaCBmcm9tIFVscmljaCBFY2toYXJkdCB0byB1c2UgQ0MKKwllbnZpcm9ubWVudCB2YXJpYWJsZSBkZWZpbmVkIGJ5IFdDRSouYmF0IHNjcmlwdCByYXRoZXIgdGhhbiByZWRlZmluaW5nCisJaXQuCisKKwkqIHNyYy9sb2NhbGUuY3BwLCBsb2NhbGVfaW1wbC5jcHAsIGxvY2FsZV9jYXRhbG9nLmNwcDogTmV3IHBhc3MgdG8gbW92ZQorCXN0YXRpYyBnbG9iYWwgdmFyaWFibGUgaW4gZnVuY3Rpb24gdG8gbWFrZSBpbml0aWFsaXphdGlvbiBvcmRlciBjbGVhci4KKworMjAwNS0wNS0yNSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L2Npc282NDY6IENyZWF0aW9uIG9mIHRoaXMgbWlzc2luZyBDKysgc3RhbmRhcmQgaGVhZGVyIFNUTHBvcnQKKwl3cmFwcGVyLgorCisJKiBzdGxwb3J0L3N0bC9faXN0cmVhbS5oLCBfbnVtX2dldC5jLCBfYWxnby5jLCBfbW9uZXRhcnkuYywgX3RpbWVfZmFjZXRzLmgsCisJX3RpbWVfZmFjZXRzLmM6IFJlcGxhY2VkIG9jY3VyZW5jZXMgb2YgX19pbiBhbmQgX19vdXQgcmVzZXJ2ZWQgYnkgTWljcm9zb2Z0LgorCisyMDA1LTA1LTI0ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvaGVhZGVyczogUGF0Y2ggZnJvbSBNaWNoYWVsIEZpbmsgdG8gYXZvaWQgaW5jbHVzaW9uIG9mIGhlYWRlcnMKKwlub3QgYXZhaWxhYmxlIHVuZGVyIGV2YzMuCisKKwkqIHRlc3QvdW5pdC8qX2hlYWRlcl90ZXN0LmNwcDogRml4IHRlc3RzIGZvciBubyBpb3N0cmVhbXMgbW9kZS4KKworCSogc3JjL2xvY2FsZV9pbXBsLmNwcCwgbG9jYWxlX2ltcGwuY3BwOiBNb2RpZnkgaW1wbGVtZW50YXRpb24gdG8gZm9yY2UgCisJY29ycmVjdCBpbml0aWFsaXphdGlvbiBvcmRlciBvZiBzdGF0aWMgaW5zdGFuY2VzLgorCisJKiBzdGxwb3J0L3N0cnN0cmVhbTogQWRkIF9pb3NlcnIuaCBmaWxlIHRvIGF2b2lkIGluY2x1c2lvbiBpbiBubyBpb3N0cmVhbXMKKwltb2RlLgorCisyMDA1LTA1LTIzICBQZXRyIE92dGNoZW5rb3YgIDxwdHJAaXNsYW5kLi4uPgorCisJKiBzdGxwb3J0L3N0bC9fY29uZmlnLmg6IGRldGVjdCBlbmRpYW5uZXNzIGZvciBJbnRlbCdzIDY0Yml0IFBlbnRpdW0gYW5kCisJSXRhbml1bSBwcm9jZXNzb3JzLiBUaGFua3MgQWxicmVjaHQgRnJpdHpzY2hlIGZvciBjb250cmlidXRpb24uCisKKzIwMDUtMDUtMjAgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogYnVpbGQvdGVzdC9laDogUGF0Y2ggZnJvbSBNaWNoYWVsIEZpbmsgdG8gYWRkIEVWQzQgc3VwcG9ydCBmb3IgdGhpcyB0ZXN0CisJc3VpdGUuCisKKwkqIHNyYy9mc3RyZWFtLmNwcDogVXNlIG9mIFdsb2RlayBTemFmcmFuIGltcGxlbWVudGF0aW9uIGZvciB0aGUgX0ZpbGVidWZfYmFzZTo6X01fcmVhZAorCW1ldGhvZCB3aGljaCBpcyBtb3JlIHBlcmZvcm1hbnQgdGhhbiB0aGUgcHJldmlvdXMgb25lLgorCisJKiB0ZXN0L3VuaXQvZnN0cmVhbV90ZXN0LmNwcDogQWRkIG9mIGEgdGVzdCBmb3IgdGhlIHNwZWNpYWwgV2luMzIgZmlsZSBmb3JtYXQuCisKKwkqIHRlc3QvdW5pdDogQWRkIG9mIG1hbnkgdGVzdCB0byBjaGVjayBTdGFuZGFyZCBDL0MrKyBoZWFkZXJzIGluZGVwZW5kYW5jeQorCWFuZCBjb3JyZWN0IEMgaGVhZGVyIGltcGxlbWVudGF0aW9uLgorCisyMDA1LTA1LTE4ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHNyYy9mc3RyZWFtLmNwcDogRml4IGJ1ZmZlciBvdmVyZmxvdyBpbiBfRmlsZWJ1Zl9iYXNlOjpfTV9yZWFkIG1ldGhvZAorCWZvciB0aGUgV2luMzIgcGxhdGZvcm0gaW1wbGVtZW50YXRpb24gdGhhbmtzIFdsb2RlayBTemFmcmFuIHJlcG9ydC4KKworCSogc3JjL2NfbG9jYWxlX2R1bW15L2NfbG9jYWxlX2R1bW15LmM6IFBhdGNoIGZyb20gTWljaGFlbCBGaW5rIGZvciB3cm9uZyBDCisJcHJvdG90eXBlLgorCisyMDA1LTA1LTE3ICBQZXRyIE92dGNoZW5rb3YgIDxwdHJAaXNsYW5kLi4uPgorCisJKiB0ZXN0L3VuaXQvbG9jYWxlX3Rlc3QuY3BwOiBzb21lIGZpeGVzIGluIG1vbmV5cHVuY3QgdGVzdCwgcmVsYXRlZAorCXRvIGludGVybmF0aW9uYWwgY3VycmVuY3kgZm9ybWF0OyBzb21lIHByb2JsZW1zIHN0aWxsIHJlbWFpbnMsIGR1ZSB0bworCXVuY2xlYXIgc3BlY2lmaWNhdGlvbnMtLS1pZiBpbnRlcm5hdGlvbmFsIGN1cnJlbmN5IDMtY2hhcnMgYWJicmV2aWF0aW9uCisJdXNlZCBpbiBzdWZmaXggZm9ybSwgYWRkaXRpb25hbCBzcGFjZSB3aWxsIGJlIGFwcGVuZGVkCisJWycxIDIzNC41NiBSVVIgJ10uIFRoaXMgaXMgZHVlIHRvIGludGxfZm1wLmN1cnJfc3ltYm9sKCkgPT0gIlJVUiAiLAorCWFuZCB0aGUgbGFzdCBpcyBjb25mb3JtIHRvIE9wZW5Hcm91cCBzcGVjLgorCisyMDA1LTA1LTE2ICBQZXRyIE92dGNoZW5rb3YgIDxwdHJAaXNsYW5kLi4uPgorCisJKiBzcmMvY19sb2NhbGVfc3R1Yi5jcHA6ICJzdHViIiBpbXBsZW1udGF0aW9uIG1vdmVkIGludG8KKwljX2xvY2FsZV9kdW1teS9jX2xvY2FsZV9kdW1teS5jLCB0aGlzIGZpbGUgcmVtb3ZlZAorCisJKiBzcmMvY19sb2NhbGUuYzogaW5jbHVkZSBjX2xvY2FsZV9kdW1teS9jX2xvY2FsZV9kdW1teS5jLCBpbiBjYXNlIG9mCisJbm8gcmVhbCBsb2NhbGUgaW1wbGVtZW50YXRpb24uCisKKwkqIHNyYy9jX2xvY2FsZV9kdW1teS9jX2xvY2FsZV9kdW1teS5jOiBUaGlzIGlzIGEgInN0dWIiIGltcGxlbWVudGF0aW9uCisJb2YgdGhlICJjX2xvY2FsZS5oIiBpbnRlcmZhY2UsIGludGVuZGVkIGZvciBvcGVyYXRpbmcgc3lzdGVtcyB3aGVyZQorCXdlIGhhdmUgbm90IHlldCB3cml0dGVuIGEgcmVhbCBpbXBsZW1lbnRhdGlvbi4gQSBDKysgbGlicmFyeSB1c2luZworCXRoaXMgc3R1YiBpbXBsZW1lbnRhdGlvbiBpcyBzdGlsbCBzdGFuZGFyZC1jb25mb3JtaW5nLCBzaW5jZQorCXRoZSBDKysgc3RhbmRhcmQgZG9lcyBub3QgcmVxdWlyZSB0aGF0IGFueSBsb2NhbGVzIG90aGVyCisJdGhhbiAiQyIgYmUgc3VwcG9ydGVkLgorCisJKiBidWlsZC9saWIvTWFrZWZpbGUuaW5jOiBzcmMvY19sb2NhbGVfc3R1Yi5jcHAgcmVtb3ZlZC4KKworCSogc3JjL2ZhY2V0c19ieV9uYW1lLmNwcDogYWRkIGNvbW1lbnRzIGluIHRoZSBfSW5pdF9tb25ldGFyeV9mb3JtYXRzLgorCisJKiBzcmMvY19sb2NhbGVfZ2xpYmMvY19sb2NhbGVfZ2xpYmMyLmM6IGFubm90YXRlIHNvbWUgbW9uZXRhcnktcmVsYXRlZAorCWZ1bmN0aW9ucy4KKworMjAwNS0wNS0xNCAgUGV0ciBPdnRjaGVua292ICA8cHRyQGlzbGFuZC4uLj4KKworCSogYnVpbGQvTWFrZWZpbGVzL2dtYWtlL2FDQy5tYWs6IEhQJ3MgYUNDIGNvbXBpbGVyIGFuZCBIUC1VWCBvcyBzdXBwb3J0LgorCVRoaXMgaXNuJ3QgcmVhbGx5IGNoZWNrZWQgYW5kIHNob3VsZCBiZSBmaXhlZCBvbiByZWFsIHN5c3RlbS4KKworCSogYnVpbGQvTWFrZWZpbGVzL2dtYWtlL2FwcC9hQ0MubWFrLCBnbWFrZS9saWIvYUNDLm1hazogZGl0dG8uCisKKwkqIGJ1aWxkL01ha2VmaWxlcy9nbWFrZS9ocC11eC9leHRlcm4ubWFrLCBsaWIubWFrOiBkaXR0by4KKworCSogYnVpbGQvTWFrZWZpbGVzL2dtYWtlL2hwLXV4L3J1bGVzLWluc3RhbGwtc28ubWFrLCBydWxlcy1zby5tYWs6IGRpdHRvLgorCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2UvaHAtdXgvZ21ha2UvaHAtdXgvc3lzLm1hazogZGl0dG8uCisKKwkqIGJ1aWxkL2xpYi9hQ0MubWFrOiBkaXR0by4KKworCSogYnVpbGQvdGVzdC91bml0L2FDQy5tYWs6IGRpdHRvLgorCisJKiBidWlsZC90ZXN0L3VuaXQvZ2NjLm1hazogcmVtb3ZlIGRiZy1zaGFyZWQgdGFnIGZyb20gZGVmYXVsdCBidWlsZDsKKwlpZiB5b3UgbmVlZCB1bml0IHRlc3RzIHdpdGggZGVidWcgaW5mbyBhbmQgd2l0aG91dCBfU1RMUF9ERUJVRywgbWFrZSB0aGlzCisJdGFnIGV4cGxpY2l0bHkuCisKKzIwMDUtMDUtMTQgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3RscG9ydC9zdGwvX2NvbmZpZy5oLCBfY29uZmlnX2NvbXBhdF9wb3N0LmgsIF9jd2NoYXIuaCwgX2VwaWxvZy5oOgorCVBhdGNoIGZyb20gQWxicmVjaHQgRnJpdHpzY2hlIHRvIHJlbW92ZSBDKysgY29tbWVudCBmcm9tIGZpbGVzIGFjY2Vzc2libGUKKwlieSBhIHB1cmUgQyBjb21waWxlci4KKworCSogc3RscG9ydC9zdGwvY19sb2NhbGUuaDogaWRlbS4KKworCSogc3JjL2NfbG9jYWxlLmgsIGNfbG9jYWxlX2dsaWJjL2NfbG9jYWxlX2dsaWJjMi5oOiBpZGVtLgorCisJKiBzcmMvZ2NjX2xvY2FsZWluZm8uaCwgY19sb2NhbGVfd2luMzIvY19sb2NhbGVfd2luMzIuYzogaWRlbS4KKworCSogYnVpbGQvTWFrZWZpbGVzL2dtYWtlL2djYy5tYWs6IEFkZCB0aGUgLWFuc2kgb3B0aW9uIHRvIHRoZSBDIGNvbXBpbGVyCisJY29tbWFuZCB0byBrbm93IGlmIGFueSByZWdyZXNzaW9uIG9jY3VyIGNvbmNlcm5pbmcgdXNlIG9mIEMrKyBjb21tZW50CisJaW4gQyBmaWxlcy4KKworMjAwNS0wNS0xMyAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzcmMvY19sb2NhbGVfd2luMzIvY19sb2NhbGVfd2luMzIuYzogSW1wcm92ZSB0aGUgbG9jYWxlIG5hbWUgcmVjb2duaXRpb24KKwlzeXN0ZW0gdG8gYmUgbW9yZSB1bml4IGNvbXBsaWFudC4gTm93IHlvdSBjYW4gcGFzcyBsb2NhbGUgbmFtZSBsaWtlCisJbGFuZ19jb3VudHJ5Wy5jb2RlcGFnZV0gd2l0aCBsYW5nIGJlaW5nIG9uZSBvZiB0aGUgSVNPIDYzOSB2YWx1ZXMgYW5kCisJY291bnRyeSBvbmUgb2YgdGhlIElTTyAzMTY2IG9uZXMuCisKKwkqIHRlc3QvdW5pdC9sb2NhbGVfdGVzdC5jcHA6IEFkZCBhIHRlc3QgY2FzZSBmb3IgdGhlIGN0eXBlIGZhY2V0LgorCisJKiB0ZXN0L3VuaXQvbG9jYWxlX3Rlc3QuY3BwOiBOb3cgbGlzdCBhbGwgdGhlIGluc3RhbGxlZCBsb2NhbGVzIHVuZGVyCisJV2luMzIgdG8gdGVzdCBtb3JlIGxvY2FsZSB0aGFuIHRoZSBzaW1wbGUgZnJlbmNoIG9uZS4KKworCSogc3RscG9ydC9jb25maWcvc3RsX21zdmMuaDogUmVtb3ZlZCBfV0lORExMIG1hY3JvIGNoZWNrIHdoZW4gdHJ5aW5nCisJdG8gZ3Vlc3Mgd2hhdCB0eXBlIG9mIGxpYnJhcnkgKGR5bmFtaWMvc3RhdGljKSB0aGUgU1RMcG9ydCB1c2VyIHdhbnQKKwl0byBsaW5rIHdpdGguIF9XSU5ETEwgaXMgZGVmaW5lZCB3aGVuIGdlbmVyYXRpbmcgYSBkbGwgYnV0IGl0IGRvIG5vdAorCWltcGx5IGFueXRoaW5nIG9uIHRoZSB1c2VyIHdpc2guCisKKwkqIHNyYy9jdHlwZS5jcHA6IEltcHJvdmUgdGhlIGN0eXBlOjpzY2FuX2lzIG1ldGhvZCwgeW91IGNhbiBub3cgc2NhbgorCWZvciBhIGNoYXJhY3RlciBjb25mb3JtaW5nIHRvIHNldmVyYWwgY3R5cGVfYmFzZTo6bWFzayBhbmQgbm90IG9ubHkgdG8gb25lLgorCisJKiBzcmMvY3R5cGUuY3BwOiBJZGVtIHByZXZpb3VzIGZvciBjdHlwZTo6c2Nhbl9ub3Qgd2hpY2ggcmV0dXJucyB0aGUgZmlyc3QKKwljaGFyYWN0ZXIgdGhhdCBkbyBub3QgY29uZm9ybSB0byBhbnkgb2YgdGhlIHBhc3NlZCBtYXNrLgorCisJKiB0ZXN0L2VoOiBSZXN0b3JlIGV4Y2VwdGlvbiBoYW5kbGluZyB0ZXN0IHN1aXRlLiBSZW1vdmVkIHNvbWUgZXF1YWxpdHkKKwl0ZXN0cyB0aGF0IGlzIG5vIG1vcmUgdmFsaWQgZm9yIGhhc2ggY29udGFpbmVycywgdGhpcyBraW5kIG9mIHRlc3QKKwlpcyBiZXR0ZXIgaW4gdGhlIHVuaXQgdGVzdHMuIEFkZCBtYWtlZmlsZXMgZm9yIE1TVkMgY29tcGlsZXJzLgorCisJKiBzdGxwb3J0L3N0bC9fdHJlZS5jOiBGaXggX01faW5zZXJ0IG1ldGhvZCB0aGF0IHdhcyBsZWFraW5nIGluIGNhc2Ugb2YKKwlleGNlcHRpb24gdGhyb3duIGJ5IHRoZSBjb21wYXJpc29uIG9wZXJhdG9yLCByZXBvcnRlZCBieSBlaCB0ZXN0cy4KKworMjAwNS0wNS0wOSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bC9fY3R5cGUuaCwgc3JjL2N0eXBlLmNwcDogUmVlbmZvcmNlIGRhdGEgZW5jYXBzdWxhdGlvbiBvZiB0aGUKKwljdHlwZTxjaGFyPiB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBjbGFzcy4gY2xhc3Mgc3RhdGljIGFycmF5cworCV9TX3VwcGVyLCBfU19sb3dlciwgX1NfY2xhc3NpY190YWJsZSByZW1vdmVkIGZyb20gdGhlIGRlZmluaXRpb24gYW5kIGhpZGVuCisJaW4gdGhlIC5jcHAgZmlsZS4KKworCSogc3JjL2RsbF9tYWluLmNwcDogQ2hhbmdlIF9TVExQX1VOSVggbWFjcm8gY2hlY2sgaW4gX1NUTFBfUFRIUkVBRFMgY2hlY2sKKwlhcyBwZXIgdGhyZWFkIGFsbG9jYXRvciBpcyBvbmx5IHN1cHBvcnRlZCBpZiB0aGUgUG9zaXggcHRocmVhZCBBUEkgaXMgdXNlZCwKKwl0aGFua3MgYSBBbGJyZWNodCBGcml0enNjaGUgcmVtYXJrZWQuCisKKzIwMDUtMDUtMDcgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3RscG9ydC9jb25maWcvc3RsX2djYy5oOiBQYXRjaCBmcm9tIEpvaG4gU21pdGggZm9yIE1hYyBPUyBYIHN1cHBvcnQuCisKKwkqIHRlc3QvdW5pdC9sb2NhbGVfdGVzdC5jcHA6IElkZW0gcHJldmlvdXMuCisKKwkqIGJ1aWxkL01ha2VmaWxlcy9nbWFrZS9jeWdtaW5nL2xpYi5tYWssIHN5cy5tYWs6IEltcG9ydCBsaWIgZXh0ZW5zaW9uCisJY2hhbmdlIGZyb20gLmxpYiB0byAuZGxsLmEgZm9yIE1pbmd3IGxpa2UgdW5kZXIgQ3lnd2luLiBsZCBsaW5rZXIKKwlsb29rcyBmb3IgLmRsbC5hIGJlZm9yZSAubGliLCBhdm9pZCBjb25mbGljdCB3aXRoIEN5Z3dpbiBsaWIuCisKKzIwMDUtMDUtMDcgIFBldHIgT3Z0Y2hlbmtvdiAgPHB0ckBpc2xhbmQuLi4+CisKKwkqIHN0bHBvcnQvZXJybm8uaDogdXNlIEMrKyAndXNpbmcnIGNvbnN0cnVjdGlvbiBvbmx5IGZvciBDKysuIFRoYW5rcyBHYXJ5LgorCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2UvbGliL2djYy5tYWs6IG9wdGlvbiBmb3IgbGlibmFtZSBmb3IgRGFyd2luLgorCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2UvYXBwL213Y2NubG0ubWFrOiBidWlsZCBmb3IgTm92ZWxsIE5ldFdhcmUgNQorCXdpdGggTWV0cm9XZXJrcyA3IGFuZCA4IGNvbXBpbGVycy4KKworCSogYnVpbGQvTWFrZWZpbGVzL2dtYWtlL2xpYi9td2NjbmxtLm1hazogZGl0dG8KKworCSogYnVpbGQvbGliL213Y2NubG0ubWFrOiBkaXR0bworCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2UvbXdjY25sbS5tYWs6IGRpdHRvCisKKwkqIGJ1aWxkL01ha2VmaWxlcy9nbWFrZS9uZXR3YXJlL2V4dGVybi5tYWs6IGRpdHRvCisKKwkqIGJ1aWxkL01ha2VmaWxlcy9nbWFrZS9uZXR3YXJlL2xpYi5tYWssIHN5cy5tYWs6IGRpdHRvCisKKwkqIHNyYy9fc3RkaW9fZmlsZS5oLCBudW1fZ2V0X2Zsb2F0LmNwcCwgbnVtX3B1dF9mbG9hdC5jcHA6IGRpdHRvCisKKwkqIHN0bHBvcnQvY3N0ZGlvLCBjd2NoYXIsIGN3Y3R5cGUsIHN0ZGlvLmgsIHdjaGFyLmg6IGRpdHRvCisKKwkqIHN0bHBvcnQvY29uZmlnL3N0bF9td2Vya3MuaDogZGl0dG8KKworCSogc3RscG9ydC9zdGwvX2NvbmZpZy5oLCBfZnN0cmVhbS5oLCBfaGFzaHRhYmxlLmMsIF9zc3RyZWFtLmM6IGRpdHRvCisKKwkqIHN0bHBvcnQvc3RsL190aHJlYWRzLmgsIGNfbG9jYWxlLmgsIGNoYXJfdHJhaXRzLmg6IGRpdHRvCisKKwkqIGJ1aWxkL01ha2VmaWxlcy9nbWFrZS9zeXNpZC5tYWs6IHRyZWF0IG13Y2NubG0gYXMgY3Jvc3MtY29tcGlsZXIsCisJc2V0IGNvcnJlY3QgVEFSR0VUX09TIGFuZCBPUy1yZWxhdGVkIG1hY3Jvcy4KKworCSogc3RscG9ydC9zdGwvX3ZhbGFycmF5Lmg6IHJlbW92ZSBleGhhdXN0aXZlIHRoaXMtPi4KKworMjAwNS0wNS0wNCAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L2NvbmZpZy9zdGxfbXN2Yy5oOiBDaGFuZ2UgY29uZmlndXJhdGlvbiBmb3IgTVNWQyAuTmV0IDIwMDMgYW5kCisJMjAwNSB0aGF0IHNlZW1zIHRvIGhhdmUgYSBidWcgaW4gdGhlIG5hbWVzcGFjZSBtYW5hZ2VtZW50LgorCisJKiBzdGxwb3J0L3N0ZGxpYi5oOiBBZGQgZXJybm8uaCBpbmNsdXNpb24gZnJvbSB0aGlzIGZpbGUgZm9yIGdjYyBtaW5ndworCWFzIHRoaXMJY29tcGlsZXIgdmVyc2lvbiBkbyBkZWZpbmUgZXJybm8gbWFjcm8gaW4gc3RkbGliLmggYXMgTVNWQyBkby4KKworMjAwNS0wNS0wMyAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bF91c2VyX2NvbmZpZy5oLCBzdGwvX3NpdGVfY29uZmlnLmgsIGNvbmZpZy9zdGxfZ2NjLmgsIF9wcm9sb2cuaCwKKwlfZXBpbG9nLmg6IFVzZSBzdHJpY3QgQW5zaSBDIGNvbW1lbnRzICgvKiovKSBmb3IgaGVhZGVycyBhY2Nlc3NpYmxlIHRob3VnaHQgCisJdGhlIFNUTHBvcnQgQyBoZWFkZXJzLgorCisJKiBzdGxwb3J0L0MgaGVhZGVyczogQ2xlYW5lZCBmcm9tIEMrKyBzdHlsZSBjb21tZW50cy4KKworMjAwNS0wNS0wMiAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBidWlsZC9NYWtlZmlsZXMvbm1ha2UvdmMtY29tbW9uLm1hazogUmVzdG9yZSBvZiBMREZMQUdTX0FfUkVMIGludHJvZHVjZQorCXRoZSAyMDA0LTEwLTMwIGFuZCBsb3N0IHRoZSAyMDA1LTA0LTE2LCBpdCBhdm9pZHMgd2FybmluZyBkdWUgdG8gdXNlCisJb2YgdGhlIHdob2xlIHByb2dyYW0gb3B0aW1pemF0aW9uIHdpdGggVkMuTmV0IDIwMDMgYW5kIDIwMDUuCisKKwkqIHN0bHBvcnQvc3RsL19zdHJpbmdfaW8uYzogTW9kaWZpY2F0aW9uIG9mIHRoZSBiYXNpY19zdHJpbmcgaS9vIG9wZXJhdG9ycworCWluIHRoZSB3YXkgaXQgZGVhbHMgd2l0aCB0aGUgc2l6ZV90eXBlIGFuZCBzdHJlYW1zaXplIGRpZmZlcmVuY2U7IGl0IGlzCisJZXF1aXZhbGVudCB3aXRoIHRoZSBmb3JtZXIgb25lIGJ1dCBkbyBub3QgZ2VuZXJhdGUgd2FybmluZyB3aXRoIGdjYworCShtaW5nd2luKS4KKworCSogc3RscG9ydC9zdGRkZWYuaCwgc3RkbGliLmgsIGVycm5vLmg6IEZpeCBpc3N1ZSB1bmRlciBNU1ZDIGNvbXBpbGVycyB3aGVyZQorCW5hdGl2ZSBzdGRsaWIuaCBhbmQgc3RkZGVmLmggYXJlIGRlZmluaW5nIGVycm5vIG1hY3JvIHdpdGhvdXQgaW5jbHVkaW5nCisJZXJybm8uaCBmb3JiaWRpbmcgU1RMcG9ydCB0byBkbyBzby4gTm93IGVycm5vLmggd2lsbCByZXBvcnQgdGhpcyBwcm9ibGVtIHdpdGgKKwlhbiBleHBsaWNpdCAjZXJyb3IuCisKKwkqIHRlc3QvdW5pdC90ZXN0X2Vycm5vLmNwcDogSW1wcm92ZW1lbnQgb2YgdGhlIHRlc3QgdG8gcmV2ZWFsIHRoZSBwcmV2aW91cworCWlzc3VlLgorCisyMDA1LTA1LTAyICBQZXRyIE92dGNoZW5rb3YgIDxwdHJAaXNsYW5kLi4uPgorCisJKiBtYWtlc3lzdGVtIChyZXBvc2l0b3J5KTogcmVzdG9yZSBleHBlcmltZW50YWwgc3VwcG9ydCBvZiBNZXRyb1dlcmtzCisJY29tcGlsZXIgZm9yIE5ldFdhcmUsIHdpdGggaGVscCBvZiBHTlUgbWFrZSBhbmQgQ3lnd2luIGVudmlyb25tZW50LgorCisyMDA1LTA0LTI5ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL190aW1lX2ZhY2V0cy5jOiBnY2Mgd2FybmluZ3MgcmV2ZWFsIHRoYXQgd2Ugd2VyZSBtaXNzaW5nIHNvbWUKKwljdHlwZTo6d2lkZW4gbWV0aG9kIGNhbGwgdG8gY29tcGFyZSB0aGluZ3MgbGlrZSBtb250aCBvciBkYXkgbmFtZXMuCisJQWxzbyBzaW1wbGlmaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoZSBfX21hdGNoIGFuZCBfX2dldF9mb3JtYXR0ZWRfdGltZSB0aGF0CisJZG8gbm90IHJlYWxseSBuZWVkIGFsbCB0aGUgdGVtcGxhdGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gaXQuCisKKwkqIHN0bHBvcnQvc3RsL19udW1fcHV0LmM6IEFkZCBhIGNhc3QgdG8gbWFrZSBjYWxsIHRvIHRoZSBmdW5jdGlvbiBtaW4gbW9yZQorCWNsZWFyLCBpdCB3aWxsIHBlcmhhcHMgaGVscCBFVkMrKyBidWlsZHMgY29ycmVjdGx5LgorCisJKiBzcmMvc3Ryc3RyZWFtLmNwcCwgc3RscG9ydC9zdGwvX3NzdHJlYW0uYzogUmVtb3ZlZCBzdGF0aWMgYXNzZXJ0aW9uCisJcmVwbGFjZWQgYnkgbW9kaWZpZWQgaW1wbGVtZW50YXRpb24gdGhhdCB0YWtlcyBpbnRvIGFjY291bnQgdGhlIGRpZmZlcmVuY2UKKwliZXR3ZWVuIHNpemVfdCBhbmQgc3RyZWFtc2l6ZS4KKworMjAwNS0wNC0yOCAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiB0ZXN0L3VuaXQvbGltaXRzX3Rlc3QuY3BwOiBJbXByb3ZlIGludGVncmFsIHR5cGVzIGxpbWl0IHRlc3QgZm9yIHR5cGUKKwlvZiB1bmtub3duIHNpZ24uIEluIHRoaXMgY2FzZSB3ZSBjaGVjayB0aGUgbWluIHZhbHVlIG9mIHRoaXMgaW50ZWdyYWwgdHlwZSwKKwlpZiAwIHRoZSB0eXBlIGlzIHVuc2lnbmVkLiBNb3Jlb3ZlciB3ZSBjaGVjaywgZXhjZXB0IGZvciB0aGUgYm9vbCB0eXBlLAorCXRoZSBzaWduIG9mIC0xIGNhc3QgdG8gdGhlIGludGVncmFsIHR5cGUsIGJvb2wgaXMgYSBzcGVjaWFsIHR5cGUgdGhhdAorCWdlbmVyYXRlIHdhcm5pbmcgd2hlbiBidWlsdCBmcm9tIC0xIChNU1ZDKS4KKworCSogc3JjL2N0eXBlLmNwcDogQ3JlYXRpb24gb2YgYSBzbWFsbCBoZWxwZXIgc3RydWN0dXJlIHRvIGNoZWNrIHRoZSB2YWxpZGl0eQorCW9mIGEgd2NoYXJfdCB2YWx1ZSB1c2VkIGFzIGFuIGluZGV4LiBUaGlzIGhlbHBlciBzdHJ1Y3QgdGFrZXMgaW50byBhY2NvdW50CisJdGhlIGNvbXBpbGVyIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB3Y2hhcl90IHR5cGUsIGlzIGl0IGEgc2lnbiB0eXBlIG9yIG5vdC4KKwlUaGlzIGhlbHBlciBhdm9pZHMgd2FybmluZyB3aGVuIHdjaGFyX3QgaXMgdW5zaWduZWQuCisKKwkqIHNyYy9udW1fZ2V0LmNwcDogUmVtb3ZlZCB1bnVzZWQgX0luaXRpYWxpemVfZ2V0X2RpZ2l0IGZ1bmN0aW9uIGFuZAorCWFzc29jaWF0ZWQgbmFycm93X2RpZ2l0cyBhbmQgbmFycm93X3hkaWdpdHMgYXJyYXlzLgorCisyMDA1LTA0LTI4ICBQZXRyIE92dGNoZW5rb3YgIDxwdHJAaXNsYW5kLi4uPgorCisJKiBzdGxwb3J0L3N0bC9fc3N0cmVhbS5oLCBfbnVtX3B1dC5jOiBfX2luIHJlcGxhY2VkIGJ5IF9faW1vZGUsIF9fb3V0CisJYnkgX19vbW9kZSBvciBfX29pIGR1ZSB0byBNUyBwcml2YXRpemUgX19pbiBhbmQgX19vdXQuIFRoYW5rcyBNaWNoYWVsIEZpbmsuCisKKzIwMDUtMDQtMjcgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3JjL2ZzdHJlYW0uY3BwOiBGaXggV2luMzItNjQgZmlsZSBzdHJlYW0gaW1wbGVtZW50YXRpb24uIF9NX3JlYWQgYW5kCisJX01fd3JpdGUgY2FuIG5vdyBjb3JyZWN0bHkgaGFuZGxlIHJlc3BlY3RpdmVseSByZWFkIGFuZCB3cml0ZSBvZiByZWFsbHkKKwliaWcgYnVmZmVycyAoID4gMkdvKQorCisJKiB1c2luZy9pb3Nmd2QuaCwgc3RscG9ydC9zdHJzdHJlYW0uaCwgc3RsL19yb3BlLmgsIF9yb3BlLmMsIF9jb21wbGV4Lmg6IFJlbW92ZWQgCisJcmVmZXJlbmNlcyB0byB0aGUgX1NUTFBfVVNFX05FV19JT1NUUkVBTVMgbWFjcm8sIFNUTHBvcnQgb25seSBzdXBwb3J0ICJuZXciCisJaW9zdHJlYW1zLgorCisJKiB0ZXN0L3VuaXQvbWF4X3Rlc3QuY3BwLCBtaW5fdGVzdC5jcHA6IEFkZCB0ZXN0cyB0byBjaGVjayB0aGF0IG1pbiBhbmQKKwltYXggYXJlIG5vdCBkZWZpbmVkIGFzIG1hY3Jvcy4KKworCSogdGVzdC9mc3RyZWFtX3Rlc3QuY3BwOiBBZGQgY2hlY2sgaW4gY3JlYXRpb24gb2YgdGVzdF9maWxlLnR4dAorCWFzIGZvbGxvd2luZyB0ZXN0cyBkZXBlbmRzIG9uIGl0cyBjb250ZW50LgorCisJKiBzcmMvc3Ryc3RyZWFtLmNwcCwgc3RkaW9fc3RyZWFtYnVmLmNwcDogRml4IHBvdGVudGlhbCBpc3N1ZSBiZWNhdXNlIG9mCisJdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBzdHJlYW1zaXplIGFuZCBzaXplX3Qgb2YgcHRyZGlmZl90LgorCUFkZCBzdGF0aWMgYXNzZXJ0aW9uIHRvIGNsZWFybHkgc3BlY2lmeSBob3cgc3RyZWFtc2l6ZSBtdXN0IGJlIHRvIGhhdmUKKwlhIGNvcnJlY3QgYmVoYXZpb3IuCisKKwkqIHN0bHBvcnQvc3RsL19udW1fcHV0LmMsIF9udW1fZ2V0LmMsIF9mc3RyZWFtLmMsIF9tb25lcmF0eS5jOiBkaXR0by4KKworCSogc3JjL2N0eXBlLmNwcDogUmVzdG9yZSBjaGVjayBvbiB3Y2hhcl90IHBvc2l0aXZpdHkgYXMgYWNjb3JkaW5nCisJMjAwNS0wMi0yMiBQZXRyIE92dGNoZW5rb3YgcmVwb3J0cyB3Y2hhcl90IGNhbiBiZSBzaWduZWQuCisKKzIwMDUtMDQtMjYgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3JjL251bV9nZXRfZmxvYXQuY3BwOiBGaXggbWluZ3dpbiBzdXBwb3J0IGZvciA2NGJpdHMgaW50ZWdlciB0eXBlIAorCXRoYW5rcyBXbG9kZWsgU3phZnJhbgorCisyMDA1LTA0LTI1ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL190aW1lX2ZhY2V0cy5jOiBGaXggX19wb3MgdHlwZSBpbiBfX21hdGNoIGZ1bmN0aW9uIGFuZCByZW1vdmVkCisJdW51c2VkIF9fbWF4X3BvcyBkZWZpbml0aW9uIGFuZCBpbml0aWFsaXNhdGlvbi4KKworCSogc3JjL2NfbG9jYWxlX3dpbjMyL2NfbG9jYWxlX3dpbjMyLmM6IEFkZCBzb21lIGNhc3QgdG8gcmVtb3ZlIHdhcm5pbmdzLgorCisJKiBzdGxwb3J0L3N0bC9fbW9uZXJhdHkuYzogRml4IF9fd2l0ZGggZGVmaW5pdGlvbiB0byB1c2Ugc3RyZWFtc2l6ZSByYXRoZXIKKwl0aGFuIHNpemVfdCB0byBhdm9pZCB3YXJuaW5ncy4KKworMjAwNS0wNC0yNSAgUGV0ciBPdnRjaGVua292ICA8cHRyQGlzbGFuZC4uLj4KKworCSogYnVpbGQvdGVzdC9nY2MubWFrOiB3b3JrYXJvdW5kIGZvciBbYnVnP10gZ21ha2UsIHRoYXQgc29tZXRpbWVzIGxvc2UKKwlpbmNyZW1lbnQgb2YgdGFyZ2V0LXNwZWNpZmljIG1hY3JvIGFuZCwgbWF5IGJlLCB1bmRlciBjb25kaXRpb24uCisJVGhhbmtzIEplZmYgV2lsbGlhbXMuCisKKwkqIGJ1aWxkL01ha2VmaWxlcy9nbWFrZS9pY2MubWFrOiBhZGQgaWNjIDguMSBjb21waWxlci1zcGVjaWZpYyBsaWJzCisKKwkqIGJ1aWxkL01ha2VmaWxlcy9nbWFrZS9pY2MubWFrOiBkZXRlY3QgaWNjIHZlcnNpb247IGFkZCBpbmNsdWRlcworCWZyb20gY29tcGlsZXIgdG8gaW5jbHVkZSBwYXRoCisKKwkqIHRlc3QvdW5pdC9jcHB1bml0L3Rlc3RfbWFpbi5jcHAsIGNwcHVuaXRfbWluaS5oOiBhZGQgb3B0aW9uIC14LCBydW4gYWxsCisJZXhjZXB0IHNwZWNpZmllZCBDTEFTUzo6VEVTVC4KKworMjAwNS0wNC0yMyAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bC9faW9lcnIuaDogI2Vycm9yIG1lc3NhZ2UgbW9kaWZpY2F0aW9uIHRoYW5rcyBNaWNoYWVsIEZpbmsuCisKKzIwMDUtMDQtMjIgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3RscG9ydC9zdGwvX2lzdHJlYW0uYzogRml4IF9NX3JlYWRfYnVmZmVyZWQgZnVuY3Rpb24gaW1wbGVtZW50YXRpb24sCisJdGhlcmUgdXNlZCB0byBiZSBhIHdyb25nIGltcGxpY2l0IGNvbnZlcnNpb24gZnJvbSBzdHJlYW1zaXplIHRvIHB0cmRpZmZfdCwKKwl3aGljaCBmYWlsIHdoZW4gc2l6ZW9mKHN0cmVhbXNpemUpID4gc2l6ZW9mKHB0cmRpZmZfdCkuCisJU2VlIDIwMDUtMDQtMjEgUGV0ciByZXBvcnQuCisKKwkqIHRlc3QvdW5pdC86IFJlcGxhY2VkIGFsbCBfU1RMUF9OT19JT1NUUkVBTVMgb2NjdXJlbmNlcyB3aXRoIHRoZSBTVExwb3J0CisJaW50ZXJuYWwgZXF1aXZhbGVudCBfU1RMUF9VU0VfTk9fSU9TVFJFQU1TLiBUaGUgZmlyc3Qgb25lIGlzIGRlZmluZWQKKwlieSB0aGUgY2xpZW50IHdoaWxlIHRoZSBzZWNvbmQgZGVwZW5kcyBvbiB0aGUgZmlyc3QgYW5kIG9uIHRoZSBjb21waWxlcgorCWFiaWxpdGllcywgbWFrZXMgdGhlIHVuaXQgdGVzdHMgbW9yZSBwb3J0YWJsZS4KKworCSogc3RscG9ydC9zdGwvX2NtYXRoLmg6IEZpeCBmb3IgSW50ZWwgQysrIGNvbXBpbGVyIHRoYXQgYWxzbyBoYXZlIGFsbAorCUMgbWF0aCBmdW5jdGlvbnMgaW4gZ2xvYmFsIG5hbWVzcGFjZS4KKworMjAwNS0wNC0yMSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bC9faGFzaHRhYmxlLmg6IEV4dGVuZCB0aGUgaGFzaHRhYmxlIHRlbXBsYXRlIG1ldGhvZHMgZXh0ZW5zaW9uCisJdG8gdGhlIG1ldGhvZCBjb21wdXRpbmcgdGhlIGJ1Y2tldCBmcm9tIHRoZSBrZXkgdGhhbmtzIERvbWluaWsgU2lhdGtvd3NraS4KKworCSogc3RscG9ydC9zdGwvX3RocmVhZHMuaDogRGlzYWJsZSA2NCBiaXRzIHBvcnRhYmlsaXR5IHdhcm5pbmcgZm9yCisJTVNWQyBjb21waWxlcnMuIE1TVkMgZG8gbm90IHNlZSB0aGF0IHRoZSBjYWxsZWQgZnVuY3Rpb24gY29tZXMgZnJvbQorCWEgbWFjcm8gdGhhdCBpcyBkaWZmZXJlbnQgdW5kZXIgV2luMzIgYW5kIFdpbjY0LgorCisyMDA1LTA0LTIxICBQZXRyIE92dGNoZW5rb3YgIDxwdHJAaXNsYW5kLi4uPgorCisJKiB0ZXN0L3VuaXQvc3N0cmVhbV90ZXN0LmNwcCwgZnN0cmVhbV90ZXN0LmNwcDogaW50ZWdyYWwgdHlwZSBmb3IKKwlwdHJkaWZmX3Qgc2hvcnRlciB0aGFuIGZvciBzdHJlYW1zaXplOyB0aGlzIGNhdXNlIHByb2JsZW0gb24KKwlXaW4zMiBwbGF0Zm9ybSwgdGhhdCBzdXBwb3J0IGZpbGVzIGxhcmdlciB0aGFuIDRHQi4KKwlUaGFua3MgVGltb3RoeSBUZW5lYmVrb3YgZm9yIHJlcG9ydC4KKworMjAwNS0wNC0yMCAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bC9kZWJ1Zy9fZGVidWcuYzogU21hbGwgQm9ybGFuZCBjb21waWxlciBmaXggdG8gYXZvaWQgY2FsbCB0bworCXZzbnByaW50ZiBiZWZvcmUgdmVyc2lvbiAweDU1MCB0aGFua3MgZXNhbmZvLgorCisJKiBzcmMvZGxsX21haW4uY3BwOiBGaXggYnVnIHJlcG9ydGVkIGJ5IEludGVsIEMrKyAoaWNsKSBjb21waWxlci4KKworMjAwNS0wNC0yMCAgUGV0ciBPdnRjaGVua292ICA8cHRyQGlzbGFuZC4uLj4KKworCSogc3JjL251bV9nZXRfZmxvYXQuYzogdXNlIHVpbnQ2NF90IGZvciA2NC1iaXQsIGJ1dCB1bnNpZ25lZCBsb25nIGxvbmcKKwlmb3IgY29uc3RhbnRzLiBUaGlzIGZpeCBwcm9ibGVtIG9uIGxpbnV4IHg4Nl82NCBbYW1kNjRdLgorCisyMDA1LTA0LTE2ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHRlc3QvdW5pdC9jcHB1bml0L3Rlc3RfbWFpbi5jcHA6IFBhdGNoIGZyb20gTWljaGFlbCBGaW5rIHRvIGltcHJvdmUKKwl0aGUgbWFjcm8gZmlsdGVyIGZvciBpbmNsdWRpbmcgd2luZG93cy5oIChVTkRFUl9DRSByYXRoZXIgdGhhbiBXSU4zMikuCisKKwkqIGJ1aWxkL3Rlc3QvdW5pdC9TVEFUVVM6IFVwZGF0ZSBmcm9tIE1pY2hhZWwgRmluayBhbmQgbXlzZWxmLgorCisJKiBidWlsZC9NYWtlZmlsZXMvbm1ha2U6IEFwcGx5IE1pY2hhZWwgRmluayBwYXRjaCB0byBnZW5lcmF0ZSAucGRiIGZpbGUKKwlldmVuIGluIHJlbGVhc2UgbW9kZSBhbmQgdG8gaW5zdGFsbCB0aGVtIGluIGJpbiBhbmQgbGliIGZvbGRlcnMgbmV4dCB0bworCXRoZSAuZGxsIGFuZCAubGliIGZpbGVzLgorCisJKiBzdGxwb3J0L3N0bC9fYWxnb2Jhc2UuYzogQWRkIG1pc3NpbmcgY29uc3QgaW4gcmV0dXJuIHR5cGUgb2YgdGhlIGNvbnN0CisJdmVyc2lvbiBvZiBmaW5kIHNwZWNpYWxpemVkIGZvciBjb25zdCBjaGFyKi4KKworMjAwNS0wNC0xNiAgUGV0ciBPdnRjaGVua292ICA8cHRyQGlzbGFuZC4uLj4KKworCSogc3RscG9ydC9zdGwvX2FsZ29iYXNlLmM6IG1lbWNociByZXR1cm4gTlVMTCBpZiB2YWx1ZSBub3QgZm91bmQsCisJd2hpbGUgZmluZCgpIFtzcGVjaWFsaXphdGlvbiBmb3IgY2hhciAqXSBzaG91bGQgcmV0dXJuIGxhc3QKKwlbc2VlIHJlY29yZCAyMDA1LTAyLTI3IGJlbG93XS4gVGhhbmtzIEpvc2h1YSBCZXJuZSBmb3IgcmVwb3J0LgorCisJKiB0ZXN0L3VuaXQvZmluZF90ZXN0LmNwcDogaWYgY2hhciBub3QgZm91bmQsIGNoYXIgc3BlY2lhbGl6YXRpb24gb2YKKwlmaW5kKCkgc2hvdWxkIHJldHVybiBsYXN0LCBub3QgTlVMTC4KKworMjAwNS0wNC0xNCAgUGV0ciBPdnRjaGVua292ICA8cHRyQGlzbGFuZC4uLj4KKworCSogc3RscG9ydC9zdGwvX2xpc3QuaCwgX3NsaXN0Lmg6IGFkZCB0aGlzLT4gcmVzb2x1dGlvbiB0byBnZXRfYWxsb2NhdG9yCisJW3JlcXVpcmVkIGluIHRoZSBtZW1iZXIgdGVtcGxhdGVzIHRvIHJlc29sdmUgcG9zc2libGUgYW1iaWd1aXR5XQorCisyMDA1LTA0LTEzICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL19saXN0LmgsIF9zbGlzdC5oOiBBZGQgbWlzc2luZyBnZXRfYWxsb2NhdG9yKCkgY2FsbCB3aGVuCisJYnVpbGRpbmcgdGVtcG9yYXJ5IGxpc3Qgb3Igc2xpc3QgaW5zdGFuY2VzIGluIGluc2VydCBtZXRob2RzLgorCisyMDA1LTA0LTEyICBQZXRyIE92dGNoZW5rb3YgIDxwdHJAaXNsYW5kLi4uPgorCisJKiBzdGxwb3J0L2Vycm5vLmg6IHNvbHV0aW9uIDIwMDUtMDQtMTIgbm90IHVzZWZ1bC4gU2ltcGxpZmllZCBzY2hlbWEsCisJc2VtYW50aWNhbGx5IGVxdWl2YWxlbnQgdG8gRnJhbmNvaXMnLCBidXQgd2l0aG91dCBleHRyYSBmdW5jdGlvbiBkZWZpbml0aW9uCisJW3NlZSByZWNvcmRzIDIwMDUtMDMtMzEgYW5kIDIwMDUtMDQtMDFdCisKKzIwMDUtMDQtMTIgIFBldHIgT3Z0Y2hlbmtvdiAgPHB0ckBpc2xhbmQuLi4+CisKKwkqIHN0bHBvcnQvZXJybm8uaDogY2hlY2sgaWYgd2UgdW5kZWZpbmUgcHJldmlvdXNseSBkZWZpbmVkIGVycm5vCisKKzIwMDUtMDQtMTEgIFBldHIgT3Z0Y2hlbmtvdiAgPHB0ckBpc2xhbmQuLi4+CisKKwkqIHN0bHBvcnQvZXJybm8uaDogc2F2ZSBvcmlnaW5hbCBlcnJubyBkZWZpbml0aW9uCisKKzIwMDUtMDQtMTAgIFBldHIgT3Z0Y2hlbmtvdiAgPHB0ckBpc2xhbmQuLi4+CisKKwkqIFNUTHBvcnQgKHJlcG9zaXRvcnkpOiBTVExwb3J0IDUuMCBSQzMKKworMjAwNS0wNC0wOCAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiB0ZXN0L3VuaXQvbG9jYWxlX3Rlc3QuY3BwOiBBZGQgX19GcmVlQlNEX18gbWFjcm8gY2hlY2sgZm9yIHRoZSB3b3JrYXJvdW5kCisJYW5ub3VuY2VkIGFzIEZyZWUgQlNEIHNwZWNpZmljIGJ5IHRoZSBjb21tZW50IG5leHQgdG8gaXQuCisKKwkqIHN0bHBvcnQvc3RsL19jb25maWcuaDogQWRkIHVuZGVmIG9mIF9TVExQX1VTRV9EWU5BTUlDX0xJQiB3aGVuIGluCisJTk9fSU9TVFJFQU1TIG1vZGUsIHRoaXMgbWFjcm8gd2FzIGdlbmVyYXRpbmcgYnVnZ3kgY29kZSBpbiB0aGlzIGNhc2UKKwlmb3Igc29tZSBjb21tcGlsZXJzIChnY2MgbWluZ3dpbikuCisKKzIwMDUtMDQtMDcgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogYnVpbGQvbGliL25tYWtlLXZjLWNvbW1vbi5tYWs6IFJlbW92ZWQgdXNlbGVzcyBhZGQgb2YgU1RMcG9ydC9saWIgdG8gCisJbGlicmFyeSBwYXRocyB3aGVuIGJ1aWxkaW5nIFNUTHBvcnQgbGliLgorCisJKiBidWlsZC9NYWtlZmlsZXMvbm1ha2UvKjogUmVtb3ZlZCB1c2VsZXNzIHNwZWNpZmljYXRpb24gb2YgdGhlIE1TVkMgZGVmYXVsdAorCWluc3RhbGwJZGlyZWN0b3J5LCBhbGwgdGhlIGpvYiBpcyBkb25lIGJ5IHRoZSB2Y3ZjYXJzMzIuYmF0IHNjcmlwdCB0aGF0IHNldHMKKwl0aGUgTElCIGVudiB2YXJpYWJsZSB0byB0aGUgcmVhbCBNU1ZDIGluc3RhbGwgZGlyZWN0b3J5LgorCisJKiB0ZXN0L3VuaXQvdW5vcmRlcmVkX3Rlc3QuY3BwLCBsb2NhbGVfdGVzdC5jcHA6IFJlbW92ZWQgZ2NjIG1pbmd3IHdhcm5pbmdzLgorCisJKiBidWlsZC9NYWtlZmlsZXMvbm1ha2UvaWNsLm1haywgYXBwL2ljbC5tYWssIGxpYi9pY2wubWFrOiBSZW1vdmVkIHRoZQorCXdob2xlIHByb2dyYW0gb3B0aW1pemF0aW9uIG9wdGlvbiwgbG9va3MgbGlrZSBpdCBpcyBjb25mdXNpbmcgaWNsLgorCisJKiBzdGxwb3J0L3N0bC9kZWJ1Zy8qLmg6IFJlbW92ZWQgdXNlbGVzcyBfR2V0X2Jhc2Ugbm9uLWNvbnN0IG92ZXJsb2FkLiAKKwlJbiBhZGRpdGlvbiB0byBiZWluZyB1c2VsZXNzIEludGVsIGNvbXBpbGVyIGVtaXQgY29tcGlsYXRpb24gZXJyb3IgYWJvdXQgaXQuCisKKzIwMDUtMDQtMDYgIFBldHIgT3Z0Y2hlbmtvdiAgPHB0ckBpc2xhbmQuLi4+CisKKwkqIHRlc3QvdW5pdC9jcHB1bml0L3Rlc3RfbWFpbi5jcHA6IHdpbmRvd3MuaCByZXF1aXJlZCBoZXJlCisJW3NlZSAyMDA1LTA0LTA0OyBwYXRjaCBieSBNaWNoYWVsIEZpbmtdLgorCisJKiBzdGxwb3J0L3N0bC9faXN0cmVhbS5oOiBfX2lzIHJlcGxhY2VkIGJ5IF9faXN0ciwgZHVlCisJdG8gTVMgcHJpdmF0aXplIF9faXMuCisKKwkqIHN0bHBvcnQvc3RsL19udW1fZ2V0Lmg6IF9faW4gcmVwbGFjZWQgYnkgX19paSwgZHVlIHRvIE1TCisJcHJpdmF0aXplIF9faW4gdG9vLgorCisJKiBzdGxwb3J0L3N0bC9fY29uZmlnLmg6IFZpc3VhbCBDKysgOCB1c2VzIF9NX0FNRDY0IHRvIGlkZW50aWZ5CisJRU02NFQgYW5kIEFNRDY0IHBsYXRmb3JtcyBbdGhhbmtzIE1pa2UgUm9iZXJ0c10uCisKKzIwMDUtMDQtMDUgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3RscG9ydC9jb25maWcvc3RsX2V2Yy5oOiBhcHBseSBwYXRjaCBmcm9tIE1pY2hhZWwgRmluayB0byBhZGQgc3VwcG9ydCBmb3IKKwl2YXJpb3VzIEVWQyBTREsuCisKKwkqIHN0bHBvcnQvc3RsL19jbWF0aC5oOiBBbiBvdGhlciBhZGFwdGF0aW9uIHRvIHRoZSBJbnRlbCBDKysgY29tcGlsZXIuCisKKwkqIGJ1aWxkL2xpYi9ubWFrZS12Yy1jb21tb24ubWFrLCB0ZXN0L3VuaXQvbm1ha2UtdmMtY29tbW9uLm1hazogUmVtb3ZlZCBjaGVjaworCW9mIFNUTFBfQlVJTERfRk9SQ0VfW1NUQVRJQyxEWU5BTUlDXV9SVU5USU1FIGVudmlyb25tZW50IHZhcmlhYmxlcywKKwltb3ZlZCBpbiBhIGNvbW1vbiBidWlsZCBzeXN0ZW0gZmlsZS4KKworCSogYnVpbGQvTWFrZWZpbGVzL25tYWtlL3ZjLWNvbW1vbi5tYWs6IEFkZCBjaGVja3Mgb2YgCisJU1RMUF9CVUlMRF9GT1JDRV9bU1RBVElDLERZTkFNSUNdX1JVTlRJTUUgdmFyaWFibGVzLgorCisJKiBidWlsZC9saWIvY29uZmlndXJlLmJhdDogQWRkIGEgY2xlYW4gb3B0aW9uIHRvIHJlbW92ZSB0aGUgaGlkZGVuIAorCU1ha2VmaWxlcy9jb25maWcubWFrIGZpbGUuCisKKwkqIHN0bHBvcnQvc3RkZXhjZXB0OiBEaXNhYmxlICdub24gZGxsLWludGVyZmFjZSBjbGFzcyB1c2VkIGFzIGJhc2UnIHdhcm5pbmcKKwl3aGVuIGJ1aWxkaW5nIFNUTHBvcnQgZGxsIGxpbmtlZCB3aXRoIHRoZSBzdGF0aWMgcnVudGltZS4KKworMjAwNS0wNC0wNCAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiB0ZXN0L3VuaXQvbWZ1bnB0cl90ZXN0LmNwcDogQWRkIG5lY2Vzc2FyeSBtYWNybyBjaGVja3MgZm9yIGEgdGVzdAorCXRoYXQgcmVxdWlyZSBwYXJ0aWFsIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGNvbXBpbGVyIHN1cHBvcnQuCisKKzIwMDUtMDQtMDQgIFBldHIgT3Z0Y2hlbmtvdiAgPHB0ckBpc2xhbmQuLi4+CisKKwkqIGVycm5vLmgsIHRpbWUuaCwgdGVzdF9lcnJuby5jcHA6IGV2YzMgYW5kIGV2YzQgaGFzIG5vIGVycm5vLmgKKwlhbmQgdGltZS5oIGhlYWRlcnMgW3BhdGNoIGJ5IE1pY2hhZWwgRmlua10uCisKKwkqIHN0bF9ldmMuaCwgX3dpbmRvd3MuaCwgdGVzdF9tYWluLmNwcDogd29ya2Fyb3VuZCB0byBub3QgaW5jbHVkZQorCTx3aW5kb3dzLmg+IGluIFNUTHBvcnQgaGVhZGVycyAoaXQgaXMgc3RpbGwgbmVlZGVkIGZvciBidWlsZGluZworCXRoZSBsaWIgYW5kIHRoZSB1bml0IHRlc3RzLCBidXQgdGhhdCBzaG91bGQgYmUgbm8gcHJvYmxlbSkuCisJT2NjdXJlbmNlcyBvZiBHZXRDdXJyZW50UHJvY2VzcygpIHVzZWQgaW4gX1NUTFBfQUJPUlQgd2VyZSByZXBsYWNlZAorCXdpdGggdGhlIHJlc3VsdCBvZiB0aGUgaW5saW5lIGZ1bmN0aW9uLCB3aGljaCByZXR1cm5zIGEgcHNldWRvLQorCUhBTkRMRSB2YWx1ZS4gW3BhdGNoIGJ5IE1pY2hhZWwgRmlua10KKworCSogY3djaGFyLCB3Y2hhci5oLCBzdGwvX2N3Y2hhci5oOiBmaXggYWNjZXNzIHRvIG1ic3RhdGUgYW5kIHdpbnRfdAorCWZvciBGcmVlQlNELgorCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2Uvc3lzaWQubWFrLCBhcHAvZ2NjLm1haywgbGliL2djYy5tYWs6CisJRnJlZUJTRCBiZWZvcmUgNS4zIHJlcXVpcmUgbGlua2FnZSB3aXRoIGxpYmNfciwgd2hpbGUgNS4zIGFuZAorCWxhdGVyIHVzZSBsaWJwdGhyZWFkLgorCisJKiB0ZXN0L3VuaXQvbG9jYWxlX3Rlc3QuY3BwOiBhZGQgc3RkOjogbmFtZXNwYWNlIHF1YWxpZmllciBmb3IKKwlnY2MgMy4zLjIgYW5kL29yIEZyZWVCU0QuCisKKwkqIGxpYnN0bHBvcnQsIHRlc3QvdW5pdDogbGlicmFyeSBidWlsZCBhbmQgbW9zdCB0ZXN0cyBwYXNzIGZvcgorCUZyZWVCU0QgNS4zIGFuZCBGcmVlQlNEIDQuMTAuCisKKzIwMDUtMDQtMDIgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3RscG9ydC9jc3RkbGliOiBGaXggbWlzc2luZyBkaXYgdGFraW5nIGxvbmcgZGVmaW5pdGlvbiBmb3IgVkM3MS4KKworMjAwNS0wNC0wMSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L2Vycm5vLmg6IEFkZCBjb21tZW50cyB0byBleHBsYWluIHRoZSBmaWxlIGNvZGUuCisKKwkqIHN0bHBvcnQvc3RsL19zdHJpbmdfaW8uaDogWWV0IGFuIG90aGVyIGZpeCB0byB0aGUgaS9vIGJhc2ljX3N0cmluZworCW9wZXJhdG9ycyB0aGF0IHdhcyBub3QgcmlnaHQgdW5kZXIgY3lnd2luL21pbmd3aW4uCisKKwkqIGJ1aWxkL01ha2VmaWxlcy9nbWFrZS9nY2MubWFrOiBNZXJnZSB0aGUgMiBkaXN0aW5jdCBjeWdtaW4gYmxvY2tzCisJaW4gb25lIGFuZCBhZGQgLVdhbGwgYW5kIC1Xc2lnbi1wcm9tbyB3YXJuaW5ncy4KKworMjAwNS0wNC0wMSAgUGV0ciBPdnRjaGVua292ICA8cHRyQGlzbGFuZC4uLj4KKworCSogdGVzdC91bml0L3Rlc3RfZXJybm8uY3BwOiBmaXggdGVzdCwgZXJybm8gbWF5IGJlIG5vbi16ZXJvIHdpdGhvdXQKKwlhbnkgZXJyb3IsIGJ1dCBpdCByZWZsZWN0IGVycm9yIGNvZGUgYWZ0ZXIgc29tZSBmdW5jdGlvbiBmYWlsLgorCVRoaXMgbm90IHRoZSBzYW1lLgorCisJKiB0ZXN0L3VuaXQvbWZ1bnB0cl90ZXN0LmNwcDogYWRkIHN0ZXAtYnktc3RlcCB0ZXN0IGhvdyBjb21waWxlcgorCXJlY29nbml6ZSBiaW5kIG9mIG1lbWJlciBmdW5jdGlvbiBmb3IgZmluZF9pZi4gTm90IGFsbCBjb21waWxlcnMgbWF5CisJdW5kZXJzdGFuZCB0aGlzLiBUaGFua3MgTWFya3VzIGZvciB0ZXN0IGlkZWEuCisKKzIwMDUtMDMtMzEgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3RscG9ydC9lcnJuby5oOiBGaXhlZCBmb3IgTVNWQyBjb21waWxlcnMsIHNob3VsZCBzdGlsbCBiZSBmaW5lIGZvcgorCW90aGVycy4KKworCSogdGVzdC91bml0L3Rlc3RfZXJybm8uY3BwOiBNb2RpZmllZCB0byBiZSBhIHJlYWwgdW5pdCB0ZXN0LiBBbHNvIHRlc3QKKwllcnJubyBhc3NpZ25tZW50LgorCisyMDA1LTAzLTMwICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL19mc3RyZWFtLmM6IFRyeSB0byBmaXggYW1iaWd1b3VzIHR5cGUgZGVkdWN0aW9uIGluIGEgbWF4CisJY2FsbCB1bmRlciBXaW5DRS4KKworCSogc3RscG9ydC9zdGwvX2NtYXRoLmg6IEZpeCBtaXNzaW5nIG5vbiBTdGFuZGFyZCBoeXBvdCBmdW5jdGlvbiB1bmRlcgorCVdpbkNFIHRoYW5rcyBNaWNoYWVsIEZpbmsuCisKKwkqIHN0bHBvcnQvc3RsL19jbWF0aC5oOiBBdHRlbXB0IHRvIGZpeCB0aGUgV2luQ0UgbWF0aCBmdW5jdGlvbiBzdXBwb3J0CisJd2hlcmUgbmVpdGhlciAqZiBub3IgKmwgZnVuY3Rpb25zIGFyZSBwcmVzZW50IGV2ZW4gaWYgdGhlIGNvbXBpbGVyCisJc3VwcG9ydCB0aGUgbG9uZyBkb3VibGUgdHlwZS4KKworMjAwNS0wMy0zMCAgUGV0ciBPdnRjaGVua292ICA8cHRyQGlzbGFuZC4uLj4KKworCSogc3RscG9ydC9hc3NlcnQuaCwgZmxvYXQuaCwgaXNvNjQ2LmgsIGxpbWl0cy5oLCBlcnJuby5oOgorCWFkZGVkIGluIGFjY29yZGFuY2Ugd2l0aCBTdGFuZGFyZCBELjUgW2NvbXBhdGliaWxpdHkgd2l0aCBzdGFuZGFyZAorCUMgbGlicmFyeV0gdG8gcHJldmVudCB3cm9uZyBzdGQgaW50ZXJwcmV0YXRpb24gaW4gaWxsLWZvcm1lZCBuYXRpdmUKKwloZWFkZXJzIFtkZWZpbml0aW9uIG9mIG5hbWVzcGFjZSBzdGQgaW4gQyBoZWFkZXJzXS4KKworCSogdGVzdC91bml0L3Rlc3RfZXJybm8uY3BwOiBjaGVjayBjb3JyZWN0IHByb2Nlc3Npbmcgb2YgZXJybm8uaAorCWhlYWRlci4KKworCSogYnVpbGQvdGVzdC9laDogYnVpbGQgZWggdGVzdHMgYWdhaW4uCisKKwkqIHRlc3QvZWgvTGVha0NoZWNrLmgsIFRlc3RDbGFzcy5jcHAsIFRlc3RDbGFzcy5oOiBmaXggYW5kIGNsZWFyLgorCisJKiB0ZXN0L2VoL3Rlc3RfaGFzaF9tYXAuY3BwLCB0ZXN0X2hhc2hfc2V0LmNwcDogaGFzaF9zZXQvaGFzaF9tYXAKKwloYXMgbm8gPT0gb3BlcmF0b3IgW25vIGNvbnRhaW5lciBlcXVhbGl0eV07IHRoaXMgZml4IGlzIHF1aWNrLWFuZC1kaXJ0eQorCisyMDA1LTAzLTI5ICBQZXRyIE92dGNoZW5rb3YgIDxwdHJAaXNsYW5kLi4uPgorCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2UvYXBwL3J1bGVzLm1haywgZnJlZWJzZC9ydWxlcy1zby5tYWssCisJbGludXgvcnVsZXMtc28ubWFrLCBvcGVuYnNkL3J1bGVzLXNvLm1haywgc3Vub3MvcnVsZXMtc28ubWFrOgorCWZpeCBsaW5rIHNlcXVlbmNlLS0tdGhlIGVuZCBvYmplY3RzIHNob3VsZCBiZSByZWFsbHkgbGFzdCwgaS5lLiBhZnRlciBsaWJzLgorCVRoaXMgYWZmZWN0ZWQgYnkgbGlua2FnZSB3aXRob3V0IGxpYnN0ZGMrKy4KKworCSogc3RscG9ydC9zdGwvX2N3Y2hhci5oLCBzdGxwb3J0L3djaGFyLmg6IHdvcmthcm91bmRzIGZvciBGcmVlQlNELgorCisJKiBkdWUgdG8gY2hhbmdlIGluIGxpbmsgc2VxdWVuY2UgbW9zdCB0ZXN0cyBbaW5jbHVkaW5nIGV4Y2VwdGlvbnNdIHBhc3MKKwlmb3IgdUNsaWJjLgorCisJKiBzdGxwb3J0L21tZW1vcnkuaDogZ2FyYmFnZSwgcmVtb3ZlZC4KKworCSogc3RscG9ydC9leHBvcnQ6IGRpdHRvLgorCisyMDA1LTAzLTI4ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL19pc3RyZWFtLmgsIF9vc3RyZWFtLmg6IEZpeCBhc3NpZ25tZW50IG9wZXJhdG9ycyBwcm90b3R5cGVzCisJZm9yIHRoZSBzZW50cnkgc3RydWN0LiBUaGFua3MgLVdlZmZjKysgZmVhdHVyZSBvZiBnY2MuCisKKwkqIGJ1aWxkL01ha2VmaWxlcy9nbWFrZS9jeWdtaW4vcnVsZXMtaW5zdGFsbC1zby5tYWs6IEFkZCBtaXNzaW5nIGZvbGRlcgorCWNyZWF0aW9uIGluIHRoZSBpbnN0YWxsIHByb2Nlc3MgdGhhbmtzIENoYXJsZW1hZ25lIHJlcG9ydC4KKworCSogYnVpbGQvTWFrZWZpbGVzL25tYWtlL2ljbC5tYWs6IEZpeCBJbnRlbCBjb21waWxlciBidWlsZCBzeXN0ZW0gdW5kZXIKKwlXaW5kb3dzLgorCisyMDA1LTAzLTI4ICBQZXRyIE92dGNoZW5rb3YgIDxwdHJAaXNsYW5kLi4uPgorCisJKiBzcmMvbnVtX3B1dF9mbG9hdC5jcHA6IGluIEZyZWVCU0Qgbm8gKmN2dCogZnVuY3Rpb25zIG5vdywgdXNlIHNwcmludGY7CisKKwkqIHN0bHBvcnQvY29uZmlnL3N0bF9nY2MuaDogaW4gRnJlZUJTRCBubyBtYXRoICpsIGZ1bmN0aW9ucyBhbmQgbGxhYnMuCisKKwkqIHRlc3QvdW5pdC9zdHJpbmdfdGVzdC5jcHA6IG1vcmUgdGVzdCB3aXRoIGFzc2lnbm1lbnQuCisKKzIwMDUtMDMtMjUgIFBldHIgT3Z0Y2hlbmtvdiAgPHB0ckBpc2xhbmQuLi4+CisKKwkqIHN0bHBvcnQvc3RkZGVmLmg6IGZpeCB0eXBvIGluIGhlYWRlciBpZC0tLXRoaXMgbWlzdGFrZSBwcmV2ZW50CisJaW5jbHVzaW9uIF9lcGlsb2cuaC4KKworCSogdGVzdC91bml0L2VwaWxvZ190ZXN0LmNwcDogcmVncmVzc2lvbiB0ZXN0IGZvciBidWcgYWJvdmUuCisKKwkqIHN0bHBvcnQvY3N0ZGlvOiBmaXggaGVhZGVyIGlkIHRvIGF2b2lkIHBvc3NpYmxlIGVycm9ycy4KKworMjAwNS0wMy0yNCAgUGV0ciBPdnRjaGVua292ICA8cHRyQGlzbGFuZC4uLj4KKworCSogYnVpbGQvTWFrZWZpbGVzL2dtYWtlL2xpYi9nY2MubWFrLCBidWlsZC9NYWtlZmlsZXMvZ21ha2UvYXBwL2djYy5tYWs6CisJY29kZSByZW9yZ2FuaXphdGlvbiB0byBzaW1wbGlmeSBwbGF0Zm9ybSBjb25maWd1cmF0aW9uIHdpdGggb3Igd2l0aG91dAorCS1ub3N0ZGxpYiBbYXZvaWQgbGluayB3aXRoIGxpYnN0ZGMrKyBvciBsaWJlc3RkYysrXTsgbm93IGxpbmsgd2l0aG91dAorCWxpYnN0ZGMrKy9saWJlc3RkYysrIHN1cHBvcnRlZCBvbiBMaW51eCBhbmQgT3BlbkJTRC4KKworCSogYnVpbGQvTWFrZWZpbGVzL2dtYWtlL29wZW5ic2QvcnVsZXMtc28ubWFrOiBpZGVtLgorCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2UvZnJlZWJzZC9ydWxlcy1zby5tYWs6IGlkZW0uCisKKwkqIHNyYy9udW1fcHV0X2Zsb2F0LmNwcDogY2xlYW4gZmxvYXQgY29udmVydGlvbnMgZm9yIE9wZW5CU0QgYW5kIEZyZWVCU0Q7CisJT3BlbkJTRCBhbmQgRnJlZUJTRCB1c2UgU1RMcG9ydCBjb2RlIGluc3RlYWQgb2Ygc3ByaW50ZiBub3cuCisKKwkqIHN0bHBvcnQvc3RsL19jd2NoYXIuaDogYWxsb3cgbWFzcXVhcmFkZSB0byB1c2UgbWJzdGF0ZV90IGZyb20gbmF0aXZlCisJY3djaGFyIGhlYWRlciBvbiBPcGVuQlNELgorCisJKiBzdGxwb3J0L2NvbmZpZy9zbHRfZ2NjLmg6IGxsYWJzIGFuZCAqbCBtYXRoIGZ1bmN0aW9ucyBhYnNlbnQgaW4gT3BlbkJTRDsKKwlkZWZpbmUgX191bml4LCB0aGF0IG1pc3NlZCBpbiBPcGVuQlNELgorCisyMDA1LTAzLTIzICBQZXRyIE92dGNoZW5rb3YgIDxwdHJAaXNsYW5kLi4uPgorCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2UvYXBwL2djYy5tYWssIGJ1aWxkL01ha2VmaWxlcy9nbWFrZS9saWIvZ2NjLm1hazoKKwlpbmNvcnBvcmF0ZSBnY2MgbGFuZ3VhZ2Ugc3VwcG9ydCBsaWJyYXJ5IGludG8gbGlic3RscG9ydC5zbworCVthZGQgfjEwMGsgdG8gbGlicmFyeV0sCWJ1dCBsaWJzdXBjKysgZG9uJ3QgcmVxdWlyZWQgbW9yZSBpbiBsaW5rIHN0YWdlCisJZm9yIGFwcGxpY2F0aW9ucyBhbmQgbGlicmFyaWVzIHRoYXQgdXNlIHN0bHBvcnQsIGFzIGluIGNhc2Ugd2l0aAorCWxpYnN0ZGMrKy4KKworMjAwNS0wMy0yMiAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bC9fc3RyaW5nX2lvLmM6IEZpeCBiYXNpY19zdHJpbmcgc3RyZWFtIG91dHB1dCBvcGVyYXRvciAKKwlpbXBsZW1lbnRhdGlvbiBmb3IgY3lnd2luLgorCisJKiBzdGxwb3J0L3N0bC9fY21hdGguaDogQWRkIGZpeGVzIGZvciBjeWd3aW4gc3VwcG9ydCB0aGF0IGhhbmRsZSBsb25nIGRvdWJsZQorCWJ1dCBkbyBub3QgaGF2ZSAqbCBtYXRocyBmdW5jdGlvbiBwZXIgZGVmYXVsdC4KKworCSogc3JjL2NvbXBsZXhfZXhwLmNwcDogRml4IGNhbGwgdG8gbG9nbCwgcmVwbGFjZWQgYnkgY2FsbCB0byBsb2cuCisKKwkqIHNyYy9jb21wbGV4X3RyaWcuY3BwOiBGaXggbWluZ3cgc3VwcG9ydCBieSBjaGVja2luZyBNX0xOMmwgZXhpc3RlbmNlCisJYmVmb3JlIHVzaW5nIGl0LgorCisJKiB0ZXN0L3VuaXQvY29weV90ZXN0LmNwcDogQ2hhbmdlIHRlc3QgY2FzZXMgdG8gYXZvaWQgdXNlIG9mIGlvc3RyZWFtcy4KKworCSogdGVzdC91bml0L3N0cmluZ190ZXN0LmNwcDogQWRkIGEgc21hbGwgY2hlY2sgdG8gdGVzdCB1c2Ugb2YgaXN0cmVhbSB3aWR0aAorCWluIHRoZSBpbnB1dCBvcGVyYXRvci4KKworCSogc3RscG9ydC9jc3RkbGliLCBzdGxwb3J0L2NvbmZpZy9zdGxfbXN2Yy5oLCBzdGxfZ2NjLmg6IENyZWF0aW9uIG9mIHRoZQorCV9TVExQX05PX1ZFTkRPUl9TVERMSUJfTCBtYWNybyB0byByZXBvcnQgc3VwcG9ydCBvZiB0aGUgbGxhYnMgYW5kIGxsZGl2CisJZnVuY3Rpb24uCisKKzIwMDUtMDMtMjEgIFBldHIgT3Z0Y2hlbmtvdiAgPHB0ckBpc2xhbmQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL19jbWF0aC5oOiByZW1vdmVkIGxvZ2YsIGV4cGYsIHNpbmYsIGNvc2Y7IG9wdGlvbgorCS1mbm8tYnVpbHRpbiBwYXNzZWQgdG8gZ2NjIGNvbXBpbGVyIHNvbHZlIHRoZSBwcm9ibGVtIHdpdGggdUNsaWJjOworCXRoaXMgaW1wbHkgc2FtZSBvcHRpb24gaW4gYnVpbGRpbmcgdUNsaWJjLCBhcyBpdCBpcyBpbiBub3JtYWwgdUNsaWJjIGJ1aWxkLgorCVRoaXMgaXMgcGFydGlhbAlyb2xsYmFjayBvZiBjaGFuZ2VzIDIwMDUtMDMtMTYuCisKKwkqIGJ1aWxkL2xpYi9jb25maWd1cmUsIGJ1aWxkL01ha2VmaWxlcy9nbWFrZS9nY2MubWFrOiBhZGQgYWJpbGl0eSB0byBwYXNzCisJZXh0cmEgZmxhZ3MgdG8gQysrIGNvbXBpbGVyCisKKzIwMDUtMDMtMTggIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogdGVzdC91bml0OiBNb2RpZmllZCBzb21lIHRlc3QgaW4gb3JkZXIgdG8gY2hlY2sgdGhlIF9TVExQX05PX0lPU1RSRUFNUworCW1vZGUuIFRoaXMgbmV3IG1vZGUgb2YgdGVzdHMgcmV2ZWFscyB0aGUgZm9sbG93aW5nIGJ1Z3M6CisKKwkqIHN0bHBvcnQvc3RsL19yb3BlLmM6IEFkZCBjaGVjayBvZiBfU1RMUF9VU0VfTk9fSU9TVFJFQU1TIG1hY3JvIGJlZm9yZQorCWluY2x1ZGUgb2YgaW9zdHJlYW0gaGVhZGVyLgorCisJKiBzcmMvZGxsX21haW4uY3BwLCBzdGxwb3J0L3N0bC9fc3RyaW5nX2Z3ZC5oOiBSZW1vdmVkIGltcGxlbWVudGF0aW9uIAorCW9mIF9fZ2V0X2Nfc3RyaW5nLCBtb3ZlZCB0byBfc3RyaW5nLmggaGVhZGVyLCBvbmNlIHN0cmluZyBoYXMgYmVlbiBkZWZpbmVkLAorCWFzIGFuIGlubGluZSBmdW5jdGlvbi4KKworMjAwNS0wMy0xOCAgUGV0ciBPdnRjaGVua292ICA8cHRyQGlzbGFuZC4uLj4KKworCSogc3JjL2NvbXBsZXhfdHJpZy5jcHA6IGF2b2lkIGNhbGwgbG9nIGZ1bmN0aW9ucyBkdXJpbmcgc3RhdGljCisJaW5pdGlhbGl6YXRpb24sIGlmIHBvc3NpYmxlLgorCisyMDA1LTAzLTE3ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL19zdHJpbmdfaW8uaDogRml4IGltcGxlbWVudGF0aW9uIHRoYXQgdXNlZCB0byB0aGluayB0aGF0CisJc2l6ZV90IGFuZCBzdHJlYW1zaXplIHdhcyBzaW1wbHkgYWxpYXNlcy4gVGhhbmtzIEpheSBBbWluIHJlcG9ydC4KKworCSogc3RscG9ydC9jb25maWcvX3Byb2xvZy5oOiBBZGQgY29tbWVudCBhYm91dCB0aGUgcmVhc29uIG9mIGFsaWdubWVudAorCXNwZWNpZmljYXRpb24gd2hlbiB1c2luZyBNU1ZDIGNvbXBpbGVycy4gRml4IGFsaWdubWVudCBmb3IgV2luNjQgcGxhdGZvcm0uCisKKwkqIHN0bHBvcnQvc3RsL19hbGxvYy5oOiBGaXggX0FMSUdOIGVudW0gZGVmaW5pdGlvbiBmb3IgX1dpbjY0IHBsYXRmb3JtLgorCisJKiBzcmMvc3RyaW5nX3cuY3BwOiBGaXggd3JvbmcgY2xhc3MgZXhwb3J0IHVuZGVyIGRlYnVnIG1vZGUgdGhhbmtzCisJQ2hhcmxlbWFnbmUgcmVwb3J0LgorCisJKiBidWlsZC9NYWtlZmlsZXMvbm1ha2U6IFByZXBhcmF0aW9uIG9mIHRoZSBidWlsZCBzeXN0ZW0gZm9yIGljbCAoSW50ZWwgY2wKKwljb21waWxlciAobWltaWMgY2wgY29tcGlsZXIgZnJvbSBNaWNyb3NvZnQpLgorCisyMDA1LTAzLTE2ICBQZXRyIE92dGNoZW5rb3YgIDxwdHJAaXNsYW5kLi4uPgorCisJKiBzdGxwb3J0L3N0bC9fY21hdGguaDogYWRkZWQgbG9nZiwgZXhwZiwgc2luZiwgY29zZi0tLXRoaXMgZml4CisJdUNsaWJjIDAuOS4yNy9nY2MgcHJvYmxlbS4gRml4IG9uZSBtYWNybyBmb3IgZGVjbGFyYXRpb24gbWF0aAorCWZ1bmN0aW9ucyBpbiBjYXNlIG9mIGFic2VudCAqZiBmdW5jdGlvbnMuCisKKzIwMDUtMDMtMTYgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3RscG9ydC9jb25maWcvKjogQ2xlYW4gbmF0aXZlIGhlYWRlciBpbmNsdWRlIHBhdGggbWFjcm8gZGVmaW5pdGlvbi4gCisJUmVtb3ZlZCBtYW55IHVzZWxlc3MgZGVmaW5pdGlvbiBzaW1wbHkgcmVjcmVhdGluZyB0aGUgZGVmYXVsdCBiZWhhdmlvci4gCisJUmVtb3ZlZCB0aGUgdW5yZWZlcmVuY2VkIF9TVExQX05BVElWRV9PTERfU1RSRUFNU19JTkNMVURFX1BBVEggbWFjcm8uCisKKwkqIHN0bHBvcnQvc3RsL19zaXRlX2NvbmZpZy5oOiBVcGRhdGUgcmVsYXRpdmUgcGF0aCBoZWFkZXJzIG1hY3JvcyAKKwlkb2N1bWVudGF0aW9uIHRvIHJlZmxlY3QgbW9yZSBhY2N1cmF0ZWx5IGRlZmF1bHQgYmVoYXZpb3IgYW5kIGFkZCAKKwl0aGUgdW5yZWZlcmVuY2UJX1NUTFBfTkFUSVZFX0NQUF9SVU5USU1FX0lOQ0xVREVfUEFUSCBtYWNyby4KKworMjAwNS0wMy0xNSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bC9fZnN0cmVhbS5oOiBGaXggX05vY29udl9pbnB1dCBoZWxwZXIgY2xhc3MgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbi4KKwlSZXR1cm5zIHRyYWl0czo6ZW9mKCkgcmF0aGVyIHRoYW4gMC4KKworMjAwNS0wMy0xNSAgUGV0ciBPdnRjaGVua292ICA8cHRyQGlzbGFuZC4uLj4KKworCSogc3JjL2NvbXBsZXguY3BwLCBjb21wbGV4X2V4cC5jcHAsIGNvbXBsZXhfaW8uY3BwLCBjb21wbGV4X3RyaWcuY3BwOgorCXVzZSBhY2hpZXZlbWVudHMgaW4gX2NtYXRoLmgtLS11c2Ugb3ZlcmxvYWRlZCBmdW5jczsgbWFzY2FyYWRlIGZyb20KKwljb21wbGV4X2ltcGwuaCBub3QgcmVxdWlyZWQgbW9yZS4KKworCSogc3JjL2NvbXBsZXhfaW1wbC5oOiBkZWxldGVkLgorCisJKiB0ZXN0L3VuaXQvY21hdGhfdGVzdC5jcHA6IGNoZWNrIG5lc3RlZCBzcXJ0KHNxcnQpLS0tcG9zc2libGUgcHJvYmxlbSB3aXRoIG1hY3JvCisKKzIwMDUtMDMtMTQgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3RscG9ydC9jb25maWcvc3RsX21zdmMuaDogX1NUTFBfU0FNRV9GVU5DVElPTl9OQU1FX1JFU09MVVRJT05fQlVHIG5vdGlvbgorCXJlbW92ZWQsIGltcG9zc2libGUgdG8gcmVwcm9kdWNlLCBtYXliZSBmaXhlZCBieSB0aGUgI3ByYWdtYSBpbnRyaW5zaWMvZnVuY3Rpb24KKwlkaXJlY3RpdmVzLgorCisJKiBzdGxwb3J0L3N0bC9fY21hdGguaCwgY3N0ZGxpYjogRml4IC5OZXQgMjAwMyBhbmQgLk5ldCAyMDA1IGJldGEgc3VwcG9ydC4KKworCSogc3RscG9ydC9zdGwvX2NtYXRoLmg6IFJlbW92ZWQgX1NUTFBfU0FNRV9GVU5DVElPTl9OQU1FX1JFU09MVVRJT05fQlVHIG5vdGlvbiwKKwlubyBtb3JlIF9TVExQX0RPXyogbWFjcm9zLgorCisJKiB0ZXN0L3VuaXQvdmFsYXJyYXlfdGVzdC5jcHA6IE5ldyB0ZXN0cyB0byBjaGVjayByaWdodCBjb21waWxhdGlvbiBvZiAKKwl0cmFuc2NlbmRlbnRhbHMgdmFsYXJyYXkgZnVuY3Rpb25zLgorCisJKiBzdGxwb3J0L3N0bC9fdmFsYXJyYXkuaDogUmVwbGFjZWQgYWxsIHRoZSBfU1RMUF9ET18qIG1hY3JvcyBieSByZWFsIAorCWZ1bmN0aW9uIGNhbGxzLgorCisJKiBzcmMvZnN0cmVhbS5jcHA6IEFkZCBJTlZBTElEX1NFVF9GSUxFX1BPSU5URVIgZGVmaW5pdGlvbiB3aGVuIG1pc3NpbmcgZm9yCisJV2luMzIgSU8gaW1wbGVtZW50YXRpb24gdGhhbmtzIE1pY2hhZWwgRmluayByZXBvcnQuIEFkZCBjb21waWxhdGlvbiBjaGVjayAKKwlvZiByaWdodCBTVExwb3J0IGZpbGUgZGVzY3JpcHRvciBkZWZpbml0aW9uLgorCisyMDA1LTAzLTEyICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL190cmVlLmg6IEZpeCBlcXVhbF9yYW5nZV91bmlxdWUgYnVnIHRoYW5rcyBHdW50ZXIuCisKKwkqIHRlc3QvdW5pdC9tYXBfdGVzdC5jcHA6IEFkZCBvZiB0aGUgdGVzdCB0byByZXByb2R1Y2UgdGhlIGJ1ZworCWFib3ZlLgorCisyMDA1LTAzLTExICBQZXRyIE92dGNoZW5rb3YgIDxwdHJAaXNsYW5kLi4uPgorCisJKiBidWlsZC90ZXN0L3VuaXQvZ2NjLm1hazogZG9uJ3Qgd3JpdGUgcnVudGltZSBwYXRoIHRvIGxpYnN0bHBvcnQKKwlpbiBjYXNlIG9mIGNyb3NzY29tcGlsYXRpb24uCisKKwkqIHN0bHBvcnQvc3RsL19jbWF0aC5oOiBleGNsdWRlICpmIGFuZCAqbCB2YXJpYW50cyBvZiBtYXRoIGZ1bmN0aW9ucworCWlmIG9uZXMgYWJzZW50IGluIHN5c3RlbTsgYWRkIG1pc3NlZCBoeXBvdCBmdW5jdGlvbjsgZmV3IHdvcmthcm91bmRzCisJZm9yIHVDbGliYyBhbmQgZm9yIFZDLgorCisJKiBzcmMvY29tcGxleC5jcHAsIGNvbXBsZXhfZXhwLmNwcCwgY29tcGxleF90cmlnLmNwcDogd29ya2Fyb3VuZAorCWZvciBzeXN0ZW1zIHdpdGhvdXQgKmYgYW5kICpsIHZhcmlhbnRzIG9mIG1hdGggZnVuY3Rpb25zLgorCisJKiB0ZXN0L3VuaXQvcmVzb2x2ZV9uYW1lLmNwcDogZXhjbHVkZSB0ZXN0IGxpbmUgdGhhdCBjb25mdXNlIFZDLgorCisJKiBzdGxwb3J0L2NzdGRsaWI6IGRpdiBpc24ndCBpbnRyaW5zaWMgZm9yIFZDLgorCisJKiBzdGxwb3J0L2NvbmZpZy9zdGxfZ2NjLmg6IGRvbid0IHVzZSAqZiBhbmQgKmwgbWF0aCBmdW5jdGlvbnMgaW4KKwljYXNlIG9mIHVDbGliYy4KKworMjAwNS0wMy0wOSAgUGV0ciBPdnRjaGVua292ICA8cHRyQGlzbGFuZC4uLj4KKworCSogZG9jL0ZBUTogRkFRIHdhcyBlc3RhYmxpc2hlZC4KKworMjAwNS0wMy0wNyAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bC9fYml0c2V0LmgsIF9iaXRzZXQuYzogQXZvaWQgaW5jbHVkZSBvZiBpc3RyZWFtIHdoZW4KKwlOT19JT1NUUkVBTVMgbW9kZSB0aGFua3MgQnJ1bm8gcmVwb3J0LgorCisJKiBzdGxwb3J0L3N0bC9jaGFyX3RyYWl0cy5oOiBNb2RpZmljYXRpb24gb2YgdGhlIHN0cmVhbW9mZiBhbmQgc3RyZWFtc2l6ZQorCWRlZmluaXRpb24gdG8gdGFrZSBpbnRvIGFjY291bnQgdGhlIDY0IGJpdHMgZmlsZSBhY2Nlc3Mgc3VwcG9ydC4KKworCSogdGVzdC91bml0L2ZzdHJlYW0uY3BwOiBOZXcgdGVzdCBmb3IgYmlnIGZpbGVzICggPiAyR28pIHVuYWN0aXZhdGVkIGJ5CisJZGVmYXVsdC4KKworMjAwNS0wMy0wNiAgUGV0ciBPdnRjaGVua292ICA8cHRyQGlzbGFuZC4uLj4KKworCSogc3RscG9ydC9jc3RkbGliLCBzdGxwb3J0L2NtYXRoLCBzdGxwb3J0L3N0bC9fY21hdGguaDogZGVmaW5lCisJb3ZlcmxvYWRlZCBmdW5jdGlvbnMgaW4gdGhlIHNjb3BlIG9mIGdsb2JhbCBuYW1lc3BhY2UgYW5kIHRoZW4gaW1wb3J0CisJYWxsIGluIHN0bHBfc3RkIHdpdGggJ3VzaW5nJyBkaXJlY3RpdmUuIFRoaXMgaXMgYmV0dGVyIHRoYW4KKwlzb2x1dGlvbiBmcm9tIDIwMDUtMDMtMDQgYmVsb3cuCisKKwkqIHN0bHBvcnQvY21hdGg6IGluY2x1ZGUgY3N0ZGxpYiwgZHVlIHRvIGRlY2xhcmF0aW9ucyBvZiBhYnMKKwl3aXRoIGludGVnZXIgdHlwZXMgcmVxdWlyZWQgaW4gb3ZlcmxvYWQgYW5kIHdoZW4gJ3VzaW5nJy4KKworCSogc3JjL2NvbXBsZXguY3BwLCBzcmMvY29tcGxleF9leHAuY3BwLCBzcmMvY29tcGxleF90cmlnLmNwcDogcmVwbGFjZQorCW1hY3JvcyB0aGF0IHBvc3NpYmx5IHdpbGwgYmUgcmVtb3ZlZC4KKworMjAwNS0wMy0wNSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bC9fY29uc3RydWN0Lmg6IFNpbXBsaWZpY2F0aW9uIG9mIHRoZSBfQ29weV9Db25zdHJ1Y3QKKwlmdW5jdGlvbiwgbm93IG9ubHkgdGFrZXMgYSBzaW5nbGUgdGVtcGxhdGUgcGFyYW1ldGVyIGFuZCBvbmx5IGNhbGwKKwl0aGUgc3RyaWN0IGNvcHkgY29uc3RydWN0b3IuIENyZWF0aW9uIG9mIHRoZSBfUGFyYW1fQ29uc3RydWN0IGZ1bmN0aW9uCisJdGhhdCByZXBsYWNlIHRoZSBmb3JtZXIgX0NvcHlfQ29uc3RydWN0IGltcGxlbWVudGF0aW9uLgorCisJKiBjc3RkbGliOiBGaXggYWJzIGRlZmluaXRpb24gZm9yIE1TVkMgY29tcGlsZXJzLgorCisJKiB0ZXN0L3VuaXQ6IEZpeGluZyA2NCBiaXRzIHdhcm5pbmdzIGluIG1hbnkgdGVzdHMuCisKKwkqIHNyYy9jX2xvY2FsZV93aW4zMi9jX2xvY2FsZV93aW4zMi5jOiBGaXhpbmcgNjQgYml0cyB3YXJuaW5ncy4KKwkKKwkqIHNyYy9mc3RyZWFtLmNwcDogQ3JlYXRpb24gb2YgdGhlIElOVkFMSURfU1RMUF9GRCBjb25zdGFudCB0byByZXByZXNlbnQKKwlhIHBvcnRhYmxlIGludmFsaWQgZmlsZSBkZXNjcmlwdG9yLgorCisJKiBzdGxwb3J0L3N0bC9fc3RyZWFtYnVmLmM6IEV4cGxpY2l0IGluc3RhbmNpYXRpb24gb2YgYmFzaWNfc3RyZWFtYnVmCisJZm9yIHdjaGFyX3QgcmVtb3ZlZCwgYWxyZWFkeSBleGlzdHMgaW4gX3N0cmVhbWJ1Zi5oIHRoYW5rcworCUNoYXJsZW1hZ25lIHJlcG9ydC4KKworCSogc3RscG9ydC9zdGwvY2hhcl90cmFpdHMuaDogU2V0dXAgbW9kaWZpY2F0aW9uLCBXaW5kb3dzIHBsYXRmb3JtIG5vdworCXVzZSBwdHJkaWZmX3QgdG8gZGVmaW5lIHN0cmVhbW9mZiwgbWFrZSB0aGUgY29kZSBtb3JlIHBvcnRhYmxlLgorCisyMDA1LTAzLTA0ICBQZXRyIE92dGNoZW5rb3YgIDxwdHJAaXNsYW5kLi4uPgorCisJKiBzdGxwb3J0L3N0bC9fY21hdGguaDogcmVtb3ZlZCByZWN1cnNpdmUgaW5jbHVkZSBvZiBjbWF0aCBoZWFkZXIKKwkKKwkqIHNyYy9jb21wbGV4X2ltcGwuaDogaW5jbHVkZSBjbWF0aCBpbnN0ZWFkIG9mIHN0bC9fY21hdGguaAorCisJKiBzdGxwb3J0L3N0bC9fY29tcGxleC5oOiBpZGVtLgorCisJKiBzdGxwb3J0L3N0bC9fdmFsYXJyYXkuaDogaWRlbS4KKworCSogdGVzdC91bml0L3VuYXJ5Lmg6IHdvcmthcm91bmQgZm9yIG5hbWVzcGFjZSByZXNvbHV0aW9uLgorCisJKiB0ZXN0L3VuaXQvcmVzb2x2ZV9uYW1lLmNwcDogdGVzdCB0byBzaG93IHByb2JsZW0gd2l0aCBuYW1lc3BhY2UgcmVzb2x1dGlvbi4KKworCSogc3RscG9ydC9jbWF0aCwgc3RscG9ydC9zdGwvX2NtYXRoLmg6IHN0YW5kYXJkIHJlcXVpcmUgb3ZlcmxvYWRlZCBtYXRoCisJZnVuY3Rpb25zIGZvciBkb3VibGUgYW5kIGZsb2F0IGFyZ3VtZW50cy4gSW1wb3J0IHdpdGggJ3VzaW5nJyBkaXJlY3RpdmUKKwljYW4ndCBwcm92aWRlIHN1Y2ggb3ZlcmxvYWQuIFJlbW92ZWQgaW1wb3J0IHdpdGggJ3VzaW5nJywgdXNlZCBkaXJlY3QKKwlpbmxpbmUgd3JhcHBlcnMgaW4gbmFtZXNwYWNlIHN0bHBfc3RkIGluc3RlYWQuIENsZWFuaW5nIGNvZGUuCisKKwkqIHN0bHBvcnQvY3N0ZGxpYjogY29tcGxlbWVudCB0byBjbWF0aC0tLXRoZSBzYW1lIGFzIGFib3ZlIGZvciBhYnMuCisKKwkqIHN0bHBvcnQvc3RsL19jb25maWcuaDogdUNsaWJjIGRlY2xhcmUgcHRocmVhZF9zcGluLi4uIGJ1dCBvbmVzIGFic2VudAorCWluIHRoZSBsaWJyYXJ5IGluZGVlZC4KKworMjAwNS0wMy0wMiAgUGV0ciBPdnRjaGVua292ICA8cHRyQGlzbGFuZC4uLj4KKworCSogYnVpbGQvTWFrZWZpbGVzL3RvcC5tYWs6IG1vdmUgLlBIT05ZIHRhcmdldCB0byB0aGUgYm90dG9tLCBpdCB3b3JrIGhlcmUKKwlhcyBleHBlY3RlZAorCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2UvZGVwZW5kLm1haywgdGFyZ2V0ZGlycy5tYWs6IHJlZHVjZSBhbW91bnQgb2YgZHVtbXkKKwl0YXJnZXRzOyBmaXggY3JlYXRpb24gb2YgZGlyZWN0b3JpZXMgZm9yIGluc3RhbGwuCisKKwkqIGJ1aWxkL01ha2VmaWxlcy9nbWFrZS9saW51eC9ydWxlcy1pbnN0YWxsLXNvLm1hazogZGl0dG8uCisKKwkqIHN0bHBvcnQvc3RsL19jb25maWcuaCwgc3RscG9ydC9jb25maWcvc3RsX2djYy5oOiBzdXBwb3J0IG9mIGdjYy9saW51eC91Q2xpYmMKKworCSogc3JjL19zdGRpb19maWxlLmgsIG51bV9wdXRfZmxvYXQuY3BwLCBzdGRpb19zdHJlYW1idWYuY3BwOiB1Q2xpYmMgc3VwcG9ydAorCisJKiBzdGxwb3J0L2N3Y2hhcjogZGl0dG8uCisKKzIwMDUtMDMtMDEgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3RscG9ydC9zdGwvX3RocmVhZHMuaCwgX3dpbmRvd3MuaCwgX3JvcGUuYzogRml4IG9mIGEgNjQgYml0cyBwb3J0YWdlIGlzc3VlCisJaW4gdGhlIHJvcGUgaW1wbGVtZW50YXRpb24gdW5kZXIgV2luNjQgdGhhbmtzIFBhdHJpY2sgQmVyZ2Vyb24gcmVwb3J0LgorCisyMDA1LTAyLTI4ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL19oYXNodGFibGUuYzogaGFzaHRhYmxlOjplcmFzZSBmaXggdGhhbmtzIFBhdHJpY2sgQmVyZ2Vyb24uCisKKzIwMDUtMDItMjcgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3RscG9ydC9zdGwvX2FsZ29iYXNlLmgsIF9hbGdvYmFzZS5jOiBGaXggZmluZCBhbGdvIG92ZXJsb2FkIGZvcgorCWNoYXIqIGFuZCBjb25zdCBjaGFyKi4gTm93IHRoZSBvdmVybG9hZCBpcyBvbiB0aGUgX19maW5kIHVuZGVybHlpbmcKKwlmdW5jdGlvbi4KKworCSogdGVzdC91bml0L2FsZ190ZXN0LmNwcDogQWRkIGEgdGVzdCBjYXNlIGZvciB0aGUgc2VhcmNoX24gYWxnby4KKworCSogc3RscG9ydC9zdGwvX2FsZ28uYzogSW50ZWdyYXRpb24gb2YgdGhlIHNlYXJjaF9uIGFsZ28gaW1wbGVtZW50YXRpb24KKwlmb3IgdGhlIHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3IgZnJvbSBKaW0gWG9jaGVsbGlzLgorCisyMDA1LTAyLTI1ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL19zbGlzdC5oOiBGaXggX01fc3BsaWNlX2FmdGVyIG1ldGhvZC4KKworCSogc3RscG9ydC9zdGwvZGVidWcvX3NsaXN0Lmg6IEFkZCBvZiBtYW55IG1pc3NpbmcgY2hlY2tzIGZvciB0aGUgc3BlY2lhbAorCXNsaXN0IGJlZm9yZV9iZWdpbiBpdGVyYXRvciB3aGljaCByZXR1cm5zIHRydWUgdG8gdGhlIF9EZXJlZmVyZW5jZWFibGUKKwlmdW5jdGlvbiBjYWxsIGJ1dCBpcyBub3QgZGVyZWZlcmVuY2VhYmxlIGluIHJlYWxpdHkuIFBhc3NpbmcgdGhpcworCWl0ZXJhdG9yIHRvIG1ldGhvZCBsaWtlIGVyYXNlIG9yIGluc2VydCB3YXMgaW52YWxpZCBidXQgd2FzIG5vdCBkZXRlY3RlZAorCWJ5IHRoZSBfRGVyZWZlcmVuY2VhYmxlIGZ1bmN0aW9uLgorCisJKiB0ZXN0L3VuaXQvc2xpc3RfdGVzdC5jcHA6IEFkZCBjaGVja3MgZm9yIGluc2VydCwgaW5zZXJ0X2FmdGVyLCBzcGxpY2UKKwlzcGxpY2VfYWZ0ZXIgbWV0aG9kcy4KKworCSogUGF0Y2ggZnJvbSBVbHJpY2ggRWNraGFyZHQ6CisJLSBGaXggbWFjcm8gX01TQ19WRVIgbWFjcm8gY2hlY2tzLCBWQzYgc2hvdWxkIGJlIGZvdW5kIHVzaW5nIF9NU0NfVkVSIDwgMTMwMAorCWNoZWNrIHJhdGhlciB0aGFuIF9NU0NfVkVSID09IDEyMDAgdG8gdGFrZSBpbnRvIGFjY291bnQgY29tcGlsZXJzIGxpa2UgCisJRVZDNCB0aGF0IGlzIGEgVkM2IGJhc2VkIGNvbXBpbGVyIHdpdGggX01TQ19WRVIgPT0gMTIwMi4KKworMjAwNS0wMi0yNSAgUGV0ciBPdnRjaGVua292ICA8cHRyQGlzbGFuZC4uLj4KKworCSogc3RscG9ydC9zdGwvX2FsZ29iYXNlLmg6IHdyb25nIHBhcmFtZXRlcnMgb3JkZXIgaW4gY2FsbCB0byBtZW1jaHIsCisJdGhhbmtzIFBhdHJpY2sgQmVyZ2Vyb24uCisKKzIwMDUtMDItMjQgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3RscG9ydC9zdGwvY2hhcl90cmFpdHMuaDogUGF0Y2ggZnJvbSBVbHJpY2ggRWNraGFyZHQgZml4aW5nIGEgd3JvbmcKKwlfU1RMUF9DQUxMIHNwZWNpZmljYXRpb24gb24gbWVtYmVyIG9wZXJhdG9ycyBhbmQgc29tZSBjb3NtZXRpYyBjaGFuZ2VzLgorCisyMDA1LTAyLTIyICBQZXRyIE92dGNoZW5rb3YgIDxwdHJAaXNsYW5kLi4uPgorCisJKiB0ZXN0L3VuaXQvbGltaXRzX3Rlc3QuY3BwOiB3Y2hhcl90IGlzIHRyZWF0ZWQgYXMgc2lnbmVkLCBleGNlcHQgd2hlbiBpdAorCWVxdWl2IHRvIHVuc2lnbmVkIHNob3J0IG9uIFdpbnMgc3lzdGVtcy4KKworCSogUmVwb3NpdG9yeTogU1RMcG9ydCA1LjAgUkMyCisKKzIwMDUtMDItMjAgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogQWRkIG1hbnkgcHJpdmF0ZSBkZWZpbml0aW9uIG9mIGNvcHkgY29uc3RydWN0b3IgYW5kIGFzc2lnbm1lbnQgb3BlcmF0b3JzCisJdG8gYXZvaWQgdmVyeSBhbm95aW5nIHdhcm5pbmdzIHVuZGVyIHNvbWUgY29tcGlsZXJzIChNU1ZDIDcuMCA3LjEpLgorCisJKiBidWlsZC9NYWtlZmlsZXMvZ21ha2UvY3lnbWluL3N5cy5tYWssIHRlc3QvdW5pdC9zdHJpbmdfdGVzdC5jcHA6CisJTWluZ3cgZml4ZXMgdGhhbmtzIFNodXJhIFphbS4KKworMjAwNS0wMi0xOSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0ZGV4Y2VwdDogUmVtb3ZhbCBvZiBhIE1TVkMgNy4wIGFuZCA3LjEgd29ya2Fyb3VuZC4gVGhvc2UgY29tcGlsZXJzCisJaGF2ZSBhIGJ1ZyByZXN1bHRpbmcgaW4gdGhlIGdlbmVyYXRpb24gb2YgdmVyeSBsb25nIGNvbXBpbGVyIG1lc3NhZ2UgYXMKKwlzb29uIGFzIGEgc2ltcGxlIGNvbXBpbGVyIHdhcm5pbmcgb3IgZXJyb3Igb2NjdXIuIFRob3NlIG1lc3NhZ2VzIGFyZQorCXRlbXBsYXRlIGluc3RhbmNpYXRpb24gY29udGV4dCBvZiBwcmV2aW91cyBkaXNhYmxlZCB3YXJuaW5nLiBXYXJuaW5nIG1lc3NhZ2UKKwlhcmUgY29ycmVjdGx5IGRpc2FibGUgYnV0IHRlbXBsYXRlIGluc3RhbmNpYXRpb24gY29udGV4dCBpcyBrZXB0IHVudGlsCisJYW4gZW5hYmxlIHdhcm5pbmcgb3IgYW4gZXJyb3IgaGFwcGVuLiBUaGVyZSBpcyBub3RoaW5nIHRvIGRvIGFnYWluc3QgdGhhdAorCWF0IFNUTHBvcnQgbGV2ZWwgZXhjZXB0IGZpeGluZyBvciBkaXNhYmxpbmcgd2FybmluZ3MgZm9yIHVuaXQgdGVzdHMgYnVpbGQuCisKKwkqIGJ1aWxkL01ha2VmaWxlcy9ubWFrZS92YzcwLm1hazogQWRkIG1pc3NpbmcgZmlsZS4KKworMjAwNS0wMi0xOCAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bC9faGFzaHRhYmxlLmgsIF91bm9yZGVyZWRfc2V0LmgsIF91bm9yZGVyZWRfbWFwLmg6IENvZGUgcmV2aWV3CisJYmFzZWQgb24gdGhlIDEyIEFwcmlsIDIwMDQgVGVjaG5pY2FsIFJlcG9ydCBkb2N1bWVudC4gQWRkIG1pc3NpbmcgaGFzaCBwb2xpY3kKKwlhbmQgYnVja2V0X3NpemUgbWV0aG9kcy4gRml4IG9mIHRoZSByZWhhc2ggbWV0aG9kIGJlaGF2aW9yLiBlcmFzZSBtZXRob2QKKwlidWcgZml4LgorCisyMDA1LTAyLTE0ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RyaW5nLCAvc3RsL19zdHJpbmcuaDogTW9kaWZpY2F0aW9uIG9mIHRoZSBpbmNsdWRlIHNjaGVtYS4KKwlfc3RyaW5nX2lvLmggbm8gbW9yZSBpbmNsdWRlZCBmcm9tIF9zdHJpbmcuaCB0byBhdm9pZCBjaXJjdWxhciBoZWFkZXJzCisJZGVwZW5kZW5jaWVzIGFzIGJhc2ljX3N0cmluZyBjbGFzcyBpcyB1c2VkIGluIGlvc3RyZWFtIGltcGxlbWVudGF0aW9uLgorCVRoaXMgaGVhZGVycyBpcyBub3cgaW5jbHVkZWQgZnJvbSB0aGUgU3RhbmRhcmQgc3RyaW5nIGhlYWRlci4gVXNlbGVzcyAKKwljY3R5cGUgaW5jbHVkZSByZW1vdmVkIGZyb20gX3N0cmluZy5oLiBfc3RyaW5nX2hhc2guaCBhbHNvIG1vdmVkIGZyb20KKwlfc3RyaW5nLmggdG8gc3RyaW5nIGZvciBjb25zaXN0ZW5jeS4KKworCSogc3RscG9ydC9zdGwvX2NvbXBsZXguYzogQWRkIG9mIHRoZSBfc3RyaW5nX2lvLmggaGVhZGVyIGluY2x1ZGUgdGhhdAorCXdhcyBtaXNzaW5nIGFmdGVyIHN0cmluZyBpbmNsdWRlIHNjaGVtYSBtb2RpZmljYXRpb24uCisKKwkqIHN0bHBvcnQvc3RsL19zdHJpbmdfYmFzZS5oLCBfc3RyaW5nLmg6IGJhc2ljX3N0cmluZyBtb3ZlIHRyYWl0cyBTVExwb3J0CisJc3RydWN0IGRlZmluaXRpb24gZG8gbm90IGRlcGVuZHMgYW55bW9yZSBvbiB0aGUgX1N0cmluZ19iYXNlIHN0cnVjdCB0bworCW1ha2UgZGVmaW5pdGlvbiBtb3JlIGNsZWFyLgorCisyMDA1LTAyLTA4ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL19jb25maWcuaDogRml4IGVuZGlhbm5lc3MgZm9yIEFNRCA2NCB0aGFua3MgS2Fyb2wKKwlTemt1ZGxhcmVrLgorCisyMDA1LTAyLTA3ICBCb3JpcyBGb21pdGNoZXYgIDxib3Jpc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bC9fY29uZmlnX2NvbXBhdF9wb3N0LmgsIHN0bHBvcnQvc3RsL19yZWxvcHNfaGFzaF9jb250LmggCisJc3RscG9ydC9zdGwvX2xpc3QuaCwgc3RscG9ydC9zdGwvX3NsaXN0LmgsIHN0bHBvcnQvc3RsL19tYXAuaCwgCisJc3RscG9ydC9zdGwvX3NldC5oOiA0LjYgY29tcGF0aWJpbGl0eSBmaXgKKworMjAwNS0wMi0wNCAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bC9fYWxsb2MuYzogRml4IG9mIHRoZSBfU19yZWZpbGwgbWV0aG9kIGluIHRoZSBsb2NrIGZyZWUgCisJaW1wbGVtZW50YXRpb24gdGhhbmtzIEZlbGl4IFd5c3MuCisKKwkqIHN0bHBvcnQvc3RsL19oYXNodGFibGUuaDogX01fZ2V0X2VsZW1faXRlIHNldCBhcyBzdGF0aWMgd2hlbiBwb3NzaWJsZQorCXRvIGZpeCBhIE1TVkM2IHByb2JsZW0gdGhhbmtzIE1pY2hhZWwgRmluayByZXBvcnQuCisKKwkqIHN0bHBvcnQvbmV3LCBjb25maWcvc3RsX2V2Yy5oOiBFVkMgcGF0Y2ggZm9yIE1GQyBzdXBwb3J0IGZyb20gTWljaGFlbCBGaW5rLgorCisJKiBidWlsZC9NYWtlZmlsZXMvbm1ha2UvZXZjMy5tYWssIGV2YzQubWFrOiBXYXJuaW5nIGxldmVsIHJhaXNlZCB0byA0CisJYnkgTWljaGFlbCBGaW5rLgorCisJKiBkb2MvUkVBRE1FLmV2YzMsIFJFQURNRS5ldmM0IGRvYyB1cGRhdGUgZnJvbSBNaWNoYWVsIEZpbmsuCisKKwkqIHNyYy92Y193YXJuaW5nX2Rpc2FibGUuaDogQWRkIHdhcm5pbmcgNDIwMSBhbmQgNDIxNCBkaXNhYmxpbmcgZm9yIEVWQy4KKworMjAwNS0wMS0zMSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBNYWMgT1MgWCBwb3J0YWdlIHRoYW5rcyBaZGVuZWsgTmVtZWMuCisKKwkqIHN0bHBvcnQvc3RsL19oYXNodGFibGUuYzogRml4IG9mIHRoZSBfTV9jb3B5X2Zyb20gbWV0aG9kIHRoYW5rcyBKYXkuCisKKwkqIHN0bHBvcnQvc3RsL192ZWN0b3IuYzogRml4IG9mIHRoZSBfTV9pbnNlcnRfZmlsbF9hdXggbWV0aG9kIHRoYW5rcworCU1pa2UgUm9iZXJ0cyByZXBvcnQuCisKKwkqIHRlc3QvdW5pdC91bm9yZGVyZWRfdGVzdC5jcHA6IEFkZCBvZiBhIHRlc3QgZm9yIHRoZSBoYXNodGFibGUgZml4IGFib3ZlLgorCisJKiBzcmMvdmNfd2FybmluZ19kaXNhYmxlLmg6IEFkZCBvZiB0aGUgbWlzc2luZyA0NTAzIHdhcm5pbmcgZGlzYWJsZSBmb3IgTVNWQzYuCisKKwkqIHRlc3QvdW5pdC9ubWFrZS12Yy1jb21tb24ubWFrOiBBZGQgb2YgdGhlIF9TVExQX0RFQlVHX1VOSU5JVElBTElaRUQgbWFjcm8KKwlkZWZpbml0aW9uIGZvciB0aGUgZGVidWcgYW5kIHN0bGRlYnVnIHJ1bGVzLgorCisyMDA1LTAxLTI4ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIEFwcGxpY2F0aW9uIG9mIGEgcGF0Y2ggZnJvbSBNaWNoYWVsIEZpbmsgZm9yIEVWQyBNSVBTLgorCisyMDA1LTAxLTI3ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvZGVxdWUsIGxpc3QsIG1hcCwgc2V0LCBzbGlzdCwgc3RhY2ssIHZhbGFycmF5OiBfU1RMUF9XSE9MRV9WRU5ET1JfU1RECisJcmVwbGFjZWQgYnkgdGhlIG9mZmljaWFsIF9TVExQX0lNUE9SVF9WRU5ET1JfU1REIG1hY3JvLgorCisJKiBzdGxwb3J0L3N0bC9fYWxnb2Jhc2UuaDogQWRkIGZpbmQgYWxnbyBvdmVybG9hZCBmb3IgY2hhciogYW5kIGNvbnN0IGNoYXIqIAorCWZvcndhcmRpbmcgdGhlIGNhbGwgdG8gdGhlIG1lbWNociBDIGZ1bmN0aW9uIHRoYW5rcyBKaW0gWG9jaGVsbGlzIHJlcG9ydC4KKworCSogdGVzdC91bml0L2ZpbmRfdGVzdC5jcHA6IEFkZCBjaGVjayBmb3IgdGhlIG5ldyBmaW5kIG92ZXJsb2FkLgorCisJKiB0ZXN0L3VuaXQvY21hdGhfdGVzdC5jcHA6IEZpeCBvZiB0aGUgYXRhbiBhbmQgYXRhbjIgdGVzdHMgdG8gYXZvaWQgcHJlY2lzaW9uCisJcHJvYmxlbXMuCisKKwkqIHRlc3QvdW5pdC9wdHJzcGVjX3Rlc3QuY3BwOiBBZGQgY2hlY2sgZm9yIGNvbnRhaW5lcnMgb2YgZnVuY3Rpb24gcG9pbnRlcnMgYW5kCisJbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXJzLgorCisJKiB0ZXN0L3VuaXQvc2V0X3Rlc3QuY3BwOiBBZGQgY2hlY2sgZm9yIGVxdWFsX3JhbmdlIG1ldGhvZCB3aGVuIHRoZSBzZWFyY2ggdmFsdWUKKwlpcyBub3QgaW4gdGhlIHNldC4KKworCSogc3RscG9ydC9zdGwvX3RyZWUuaDogRml4IGVxdWFsX3JhbmdlIGltcGxlbWVudGF0aW9uIHRoYW5rcyBHcmlzaGEgU3BpdmFrIHJlcG9ydC4KKworCSogc3RscG9ydC9zdGwvX3ZlY3Rvci5oLCBfdmVjdG9yLmM6IEZpeCBvZiB0aGUgbW92YWJsZSB0eXBlcyBpbXBsZW1lbnRhdGlvbiB0aGFua3MKKwlNaWtlIFJvYmVydHMgcmVwb3J0LgorCisJKiB0ZXN0L3VuaXQvbXZjdG9yX3Rlc3QuY3BwOiBBZGQgb2YgYSB0ZXN0IGNhc2UgZm9yIHZlY3RvciBjbGFzcy4KKworMjAwNS0wMS0yNSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bF91c2VyX2NvbmZpZy5oOiBQb2ludGVyIHNwZWNpYWxpemF0aW9uIGZlYXR1cmUgaXMgbm93IG9mZiAKKwlieSBkZWZhdWx0IGFzIGl0IGRvIG5vdCBoYW5kbGUgcG9pbnRlciB0byBmdW5jdGlvbiBhbmQgcG9pbnRlciB0byBtZW1iZXIKKwltZXRob2RzIGNvcnJlY3RseSB5ZXQuIEZlYXR1cmUgZG9jdW1lbnRhdGlvbiBoYXMgYmVlbiB1cGRhdGVkIHRvIHJlcG9ydAorCXRoaXMgbGltaXRhdGlvbi4KKworCSogc3JjL2N0eXBlLmg6IHJlbW92YWwgb2YgdGhlICc+PSAwJyBjaGVjayBmb3Igd2NoYXJfdCB2YXJpYWJsZXMgcmVwb3J0ZWQgCisJYXMgYSBhbHdheXMgdHJ1ZSBjb25kaXRpb24gYnkgZ2NjLgorCisJKiBzdGxwb3J0L3N0bC9faGFzaHRhYmxlLmM6IFJlbW92YWwgb2YgYW4gdW51c2VkIHZhcmlhYmxlIGluIGhhc2h0YWJsZTo6cmVzaXplCisJbWV0aG9kIHRoYW5rcyBKZWZmIEdyaWxscyByZXBvcnQuCisKKwkqIHN0bHBvcnQvc3RsL19hbGdvLmM6IEZpeCBvZiB0aGUgc2VhcmNoX24gYWxnbyB0aGFua3MgSmltIFhvY2hlbGxpcyByZXBvcnQuCisKKzIwMDUtMDEtMjQgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogU29tZSBtb3JlIHdhcm5pbmcgZml4ZXMuIE1vc3RseSBhZGQgb2YgbWlzc2luZyBjaGFyX3RyYWl0czo6dG9fY2hhcl90eXBlIGNhbGxzLgorCisyMDA1LTAxLTIyICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL19zdHJpbmdfd29ya2Fyb3VuZC5oLCBkZWJ1Zy9fc3RyaW5nX3dvcmthcm91bmQuaDogRml4IG9mIHRoZQorCWNhbGwgYnJvYWRjYXN0IHRvIHRoZSBiYXNlIGNsYXNzLiBOb24gZGVidWcgd29ya2Fyb3VuZCBhbHdheXMgY2FsbCBub24gZGVidWcKKwliYXNlIGNsYXNzIG1ldGhvZHMsIGRlYnVnIHdvcmthcm91bmQgYWx3YXlzIGNhbGxzIGRlYnVnIGJhc2UgY2xhc3MgbWV0aG9kcy4KKworCSogTWFueSBmaXhlcyB0byBhdm9pZCB3YXJuaW5ncyB1c2luZyBNU1ZDIGluIGxldmVsIDQgd2FybmluZ3M6CisJCS0gd2hpbGUgKHRydWUpIHJlcGxhY2VkIGJ5IGZvcig7Oykgd2hpY2ggZG8gbm90IHByb2R1Y2UgdGhlIGNvbmRpdGlvbmFsCisJCWV4cHJlc3Npb24gaXMgY29uc3RhbnQgd2FybmluZworCQktIHJlbW92YWwgb2YgdW51c2VkIHBhcmFtZXRlcnMKKwkJLSBtb2RpZmljYXRpb24gb2Ygc29tZSB0ZW1wbGF0ZSBmdW5jdGlvbiBzaWduYXR1cmUgdG8ga2VlcCB0aGUgY2hhcmFjdGVyIHR5cGUKKwkJaW5mb3JtYXRpb24gYW5kIGF2b2lkIHRoZSB3Y2hhcl90IHRvIGNoYXIgdHlwZSB3YXJuaW5nIHdoaWNoIHdhcyBzdXJlbHkgYW4KKwkJaW1wb3J0YW50IHdhcm5pbmcgZm9yIHRoZSB3aWRlIHN0cmVhbXMgc3VwcG9ydC4KKworCSogc3RscG9ydC9zdGwvX21vbmV0YXJ5LmM6IHJlbW92YWwgb2YgdGhlIGNhbGwgdG8gdGhlIGN0eXBlOjp3aWRlbiBtZXRob2QgCisJb24gdGhlIHJlc3VsdCBvZiB0aGUgbW9uZXlwdW5jdDxfQ2hhclQsIGZhbHNlPjo6ZGVjaW1hbF9wb2ludCBjYWxsIGFzIHRoaXMKKwltZXRob2QgaXMgYWxyZWFkeSBzdXBwb3NlZCB0byByZXR1cm4gYSB3aWRlIGNoYXJhY3Rlci4gCisKKzIwMDUtMDEtMTkgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3JjL21zdmNfd2FybmluZ19kaXNhYmxlcnMuaDogdW51c2VkIGZpbGUsIHJlbW92ZWQuCisKKwkqIHRlc3QvdW5pdC9sb2dpY190ZXN0LmNwcDogRml4IG9mIHRoZSB0ZXN0cyB0byBhdm9pZCB3YXJuaW5nIHJlZ2FyZGluZyBpbnQKKwl0byBib29sIGNhc3QuCisKKwkqIHN0bHBvcnQvc3RsL3BvaW50ZXJzL19kZXF1ZS5oLCBfbGlzdC5oOiBGaXggb2YgdGhlIGV4cG9ydGVkIGNsYXNzIHVuZGVyIE1TVkMKKwljb21waWxlciB0aGFua3MgVGltb3RoeSBUZW5lYmVrb3YgcmVwb3J0LgorCisJKiBidWlsZC90ZXN0L3VuaXQvbm1ha2UtdmMtY29tbW9uLm1haywgbm1ha2UtdmM2Lm1haywgbm1ha2UtdmM3MC5tYWs6IE1vZGlmaWNhdGlvbgorCW9mIHRoZSBtYWtlIGZpbGVzIHRvIGF2b2lkIHVzZWxlc3MgaW5jbHVzaW9uIG9mIHZjX3dhcm5pbmdfZGlzYWJsZS5oIGZpbGUgZm9yCisJTVNWQy5OZXQgMjAwMyBhbmQgTVNWQyA4IGNvbXBpbGVycy4KKworCSogc3JjL2xvY2FsZV9pbXBsLmg6IEV4cG9ydCBvZiB0aGUgbG9jYWxlIGZhY2V0cyBjb250YWluZXIgZm9yIE1TVkMgY29tcGlsZXJzLgorCisJKiBzcmMvdmNfd2FybmluZ19kaXNhYmxlLmg6IE1vZGlmaWNhdGlvbiB0byBsaW1pdCB0aGUgbnVtYmVyIG9mIGRpc2FibGVzIGRlcGVuZGluZworCW9uIHRoZSBjb21waWxlci4KKworMjAwNS0wMS0xOCAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bC9fYWxnby5jOiBNb2RpZmljYXRpb24gb2YgdGhlIHN0YWJsZV9wYXJ0aXRpb24gaW1wbGVtZW50YXRpb24KKwl0byBsaW1pdCB0aGUgc2l6ZSBvZiB0aGUgYWxsb2NhdGVkIHRlbXBvcmFyeSBidWZmZXIgb2YgdGhlIGJlZ2luIGFuZCBlbmQKKwlvZiB0aGUgcmFuZ2UgYXJlIGFscmVhZHkgYXQgdGhlIHJpZ2h0IHBsYWNlIHRoYW5rcyBhIFN0ZXBoZW4gSG93ZSBpZGVhci4KKworCSogYnVpbGQvdGVzdC91bml0L25tYWtlLXZjLWNvbW1vbi5tYWssIG5tYWtlLWV2Yy1jb21tb24ubWFrOiBSZW1vdmFsIG9mIHRoZSAKKwlfU1RMUF9VU0VfQVVUT19MSU5LIG1hY3JvIHdoaWNoIGlzIG5vdyB0aGUgZGVmYXVsdC4KKworMjAwNS0wMS0xNCAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bC9fd2luZG93cy5oLCBjaGFyX3RyYWl0cy5oLCBzcmMvY19sb2NhbGVfd2luMzIvY19sb2NhbGVfd2luMzIuYzoKKwlQYXRjaCBmcm9tIFBhdHJpY2sgQmVyZ2Vyb24gdG8gc3VwcG9ydCA2NCBiaXRzIGNvbXBpbGF0aW9uIHVuZGVyIFdpbmRvd3MgdXNpbmcKKwlWQzguCisKKwkqIHN0bHBvcnQvc3RsL2Jvb3N0X3R5cGVfdHJhaXRzLmg6IGJvb3N0IHN1cHBvcnQgY2hlY2sgYW5kIGZpeGluZy4KKworMjAwNS0wMS0xMyAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bC9fYWxnb2Jhc2UuaDogSW1wcm92bWVudCBvZiB0aGUgaXRlcl9zd2FwIGFsZ28gdG8gdXNlIHRoZSBzd2FwCisJbWV0aG9kIHdoZW4gcG9zc2libGUgdGhhbmtzIERhdmlkIEFicmFoYW1zIGFuZCBBbGVrc2V5IEd1cnRvdm95IGdyZWF0IGJvb2sKKwlpbnRyb2R1Y3Rpb24uCisKKwkqIHN0bHBvcnQvc3RsL19hbGxvYy5oOiBEZWFjdGl2YXRpb24gb2YgdGhlIGxvY2sgZnJlZSBhbGxvY2F0b3IgaW1wbGVtZW50YXRpb24KKwlub3QgbWF0dXJlIGVub3VnaCB0byBiZSByZWxlYXNlIHlldC4KKworCSogc3RscG9ydC9zdGwvX3VuaW5pdGlhbGl6ZWQuaDogRml4IG9mIG5vbiBTdGFuZGFyZCBhbGdvIHNpZ25hdHVyZToKKwkJCS0gdW5pbml0aWFsaXplZF9maWxsX24KKworCSogc3RscG9ydC9zdGwvX2l0ZXJhdG9yX2Jhc2UuaDogRml4IG9mIG5vbiBTdGFuZGFyZCBhbGdvIHNpZ25hdHVyZToKKwkJCS0gZGlzdGFuY2UKKworCSogc3RscG9ydC9zdGwvX2FsZ29iYXNlLmg6IEZpeCBvZiBub24gU3RhbmRhcmQgYWxnbyBzaWduYXR1cmU6CisJCQktIGZpbGxfbgorCisJKiBzdGxwb3J0L3N0bC9fYWxnby5oOiBGaXggb2Ygbm9uIFN0YW5kYXJkIGFsZ28gc2lnbmF0dXJlOgorCQkJLSByb3RhdGUKKwkJCS0gZ2VuZXJhdGVfbgorCisJKiBzdGxwb3J0L3N0bC9fc3RyaW5nLmgsIGRlYnVnL19zdHJpbmcuaDogRml4IG9mIHRoZSBub24gU3RhbmRhcmQgYmFzaWNfc3RyaW5nCisJZGVmYXVsdCBjb25zdHJ1Y3Rvci4KKworCSogc3RscG9ydC9zdGwvX2FsZ29iYXNlLmgsIF9mdW5jdGlvbi5oLCBfaXRlcmF0b3JfYmFzZS5oLCBfbW92ZV9jb25zdHJ1Y3RfZndrLmgsCisJX3B0cl9zcGVjaWFsaXplLmgsIGNoYXJfdHJhaXRzLmgsIGRlYnVnL19kZWJ1Zy5oOiBGaXggb2YgdGhlIG1hY3JvIG5hbWUgY2hlY2sKKwliZWZvcmUgaW5jbHVkaW5nIHR5cGVfdHJhaXRzLmguCisKKzIwMDUtMDEtMDggIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3RscG9ydC9zdGwvX2NvZGVjdnQuaDogQWRkIG9mIGEgbWlzc2luZyBleHBvcnQgZGVjbGFyYXRpb24gZm9yIHRoZSB3Y2hhcl90CisJc3BlY2lhbGl6YXRpb24gb2YgdGhlIGNvZGVjdnRfYnluYW1lIGNsYXNzLgorCisJKiBzcmMvc3RscG9ydC5yYzogaW1wcm92ZW1lbnQgb2YgdGhlIGluZm9ybWF0aW9uIGluY2x1ZGVkIGluIHRoZSByZXNzb3VyY2UgZmlsZS4KKwlFc3BlY2lhbGx5IGFkZCBvZiB0aGUgY29tcGlsZXIgb3B0aW9ucy4KKworCSogc3RscG9ydC9zdGwvX3N0bHBvcnRfdmVyc2lvbi5oOiBDcmVhdGlvbiBvZiBhIHNwZWNpYWwgZmlsZSBjb250YWluaW5nIGFsbCB0aGUKKwl2ZXJzaW9uIGluZm9ybWF0aW9uczsgdmVyeSB1c2VmdWwgdG8gYXZvaWQgcHJvYmxlbSB3aXRoIHRoZSByZXNzb3VyY2UgY29tcGlsZXIuCisKKwkqIHN0bHBvcnQvc3RsL19jb25maWcuaDogUmVtb3ZhbCBvZiB0aGUgdW51c2VkIF9TVExQX1VTSU5HX1ZFTkRPUl9TVEQgbWFjcm8uCisJSW5jbHVzaW9uIG9mIHRoZSBfc3RscG9ydF92ZXJzaW9uLmggZmlsZS4gVXBkYXRlIG9mIHRoZSBjb21tZW50IGV4cGxhaW5pbmcgd2h5CisJX1NUTFBfVVNFX0RFQ0xTUEVDIGlzIHVuZGVmaW5lZCB3aGVuIHVzZXIgZG8gbm90IHVzZSBpb3N0cmVhbXMuCisKKwkqIGJ1aWxkL01ha2VmaWxlcy9ubWFrZS92Yy1jb21tb24ubWFrLCBldmMtY29tbW9uLm1haywgZ21ha2UvZ2NjLm1hazogSW1wcm92ZW1lbnQKKwlvZiB0aGUgcmVzc291cmNlIGNvbXBpbGVyIG9wdGlvbnMuCisKKzIwMDUtMDEtMDYgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3RscG9ydC9jb25maWcvc3RsX21zdmMuaDogTW92ZSB0aGUgX1NUTFBfRE9OVF9SRVRVUk5fVk9JRCBjb25maWd1cmF0aW9uCisJbWFjcm8gdG8gdGhlIHNwZWNpZmljIE1TVkM2IGNvbXBpbGVyIGFzIGl0IGlzIHRoZSBvbmx5IG9uZSB0aGF0IGhhcyBldmVyCisJcmV2ZWFsIHRoaXMgYnVnLgorCisyMDA1LTAxLTA1ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL19zdHJpbmdfc3VtX21ldGhvZHMuaDogRml4ZXMgcmVwb3J0ZWQgYnkgZ2NjLgorCisyMDA1LTAxLTA0ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIGRvYy9SRUFETUUuZXZjMzogcGF0Y2hlZCBieSBNaWNoYWVsIEZpbmsKKworCSogYnVpbGQvbGliL2NvbmZpZ3VyZS5iYXQ6IHdhcm5pbmcgZml4IHRoYW5rcyBNaWNoYWVsIEZpbmsuCisKKwkqIGJ1aWxkL3Rlc3QvdW5pdC9ubWFrZS1zcmMtcHJlZml4Lm1hazogZml4ZWQgdGhhbmtzIE1pY2hhZWwgRmluay4KKworMjAwNS0wMS0wMiAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bC9fc3RyaW5nX3N1bS5oLCBfc3RyaW5nX29wZXJhdG9ycy5oOiBGaXggb2YgYW4gYXNzaWdubWVudCBidWcKKwlpbiB0aGUgYXBwZW5kIG1ldGhvZCB0YWtpbmcgYSBDIHN0cmluZyB3cmFwcGVyLiBNb2RpZmljYXRpb24gb2YgdGhlIF9fYnN0cl9zdW0KKwlnZXRfYWxsb2NhdG9yIG1ldGhvZCB0byBhdm9pZCBhIHVzZWxlc3MgYWxsb2NhdGlvbi4KKworCSogYnVpbGQvbGliL25tYWtlLXNyYy1wcmVmaXgubWFrOiBBZGQgb2YgbWlzc2luZyBydWxlcyBmb3IgLmMgYW5kIC5yYyBmaWxlIHR5cGUuCisKKzIwMDQtMTItMjkgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3RscG9ydC9zdGwvX2hhc2h0YWJsZS5jOiBGaXggbWlzc2luZyBhbGxvY2F0b3IgYXJndW1lbnQgaW4gbmV3IHNsaXN0CisJY29uc3RydWN0aW9uIGFuZCBiYWQgbnVtYmVyIG9mIGJ1Y2tldHMgdGhhbmtzIFNlZSBXb25nIHJlcG9ydC4KKworCSogdGVzdC91bml0L3Vub3JkZXJlZF90ZXN0LmNwcDogQWRkIG9mIGEgdGVzdCB0byByZXBvcnQgdGhlIHByZXZpb3VzCisJcHJvYmxlbS4KKworCSogYnVpbGQvTWFrZWZpbGVzL25tYWtlL3ZjLWNvbW1vbi5tYWssIGV2Yy1jb21tb24ubWFrOiBHZW5lcmFsaXphdGlvbiBvZiB0aGUgCisJL0RNQUNSTyBjb21waWxlciBjb21tYW5kIHJhdGhlciB0aGFuIC9EICJNQUNSTyIuCisKKwkqIHRlc3QvdW5pdC9zdHJpbmdfdGVzdC5jcHA6IENyZWF0aW9uIG9mIGEgbmV3IHRlc3QgY2FzZSBmb3Igc3RyaW5nIHRlbXBsYXRlCisJZXhwcmVzc2lvbi4KKworCSogc3RscG9ydC9zdGwvX3N0cmluZ19zdW0uaCwgX3N0cmluZ19zdW1fbWV0aG9kcy5oOiBGaXhpbmcgb2YgbWFueSBidWdzIGluIHRoZQorCXN0cmluZyB0ZW1wbGF0ZSBleHByZXNzaW9ucyBpbXBsZW1lbnRhdGlvbi4KKworCSogc3RscG9ydC9zdGwvX3RyZWUuYzogQWRkIG9mIGEgY29tbWVudCBpbiB0aGUgX01faW5jcmVtZW50IG1ldGhvZCBleHBsYWluaW5nCisJYSBzdXJwcmlzaW5nIGNoZWNrcyB0aGFua3MgVWxyaWNoIEVja2hhcmR0LgorCisyMDA0LTEyLTI0ICBQZXRyIE92dGNoZW5rb3YgIDxwdHJAaXNsYW5kLi4uPgorCisJKiBidWlsZC9NYWtlZmlsZXM6IG1ha2VzeXN0ZW0gbW92ZWQgaGVyZSBmcm9tIHNyYy9NYWtlZmlsZXMKKworCSogYnVpbGQvbGliOiBtYWtlZmlsZXMgbW92ZWQgaGVyZSBmcm9tIHNyYyBjYXRhbG9nLgorCisJKiBidWlsZC90ZXN0L3VuaXQ6IG1ha2VmaWxlcyBtb3ZlZCBoZXJlIGZyb20gdGVzdC91bml0IGNhdGFsb2cuCisKKwkqIElOU1RBTEw6IHVwZGF0ZWQuCisKKwkqIFJFQURNRTogdXBkYXRlZC4KKworMjAwNC0xMi0yMyAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bC9fdmVjdG9yLmgsIF92ZWN0b3IuYzogRml4IG9mIHRoZSBjb2RlIGZvciBtb3ZhYmxlIHR5cGVzCisJaW4gY2FsbCB0byBwdXNoX2JhY2sgb3IgaW5zZXJ0IG9mIGEgdmFsdWUgaW4gY2FzZSBvZiBhdXRvIHJlZmVyZW5jaW5nCisJdGhhbmtzIEJlbmphbWluIFJlZGVsaW5ncy4KKworCSogc3RscG9ydC9zdGwvX2hhc2h0YWJsZS5jOiBGaXggb2YgdGhlIF9NX2NvcHkgbWV0aG9kIHRoYW5rcyBUaW1vdGh5CisJVGVuZWJla292LgorCisyMDA0LTEyLTIyICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL2RlYnVnL19zdHJpbmcuaDogRml4IG9mIG1pc3Npbmcgc2NvcGVzIHRoYW5rcyBhcmFiZXNjIGFuZAorCUJlbmphbWluIFJlZGVsaW5ncworCisJKnN0bHBvcnQvY29uZmlnL3N0bF9nY2MuaDogaW5jbHVkZSBzY2hlbWEgZml4IGZvciBnY2MgPj0gNC4wLjAgdGhhbmtzIAorCU9saXZlciBTdG9lbmViZXJnCisKKzIwMDQtMTItMjEgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3RscG9ydC9zdGwvX2hhc2h0YWJsZS5jOiBGaXggY29weSBtZXRob2QgdGhhbmtzIEtMIHJlcG9ydC4KKworCSogc3RscG9ydC9zdGwvX3ZlY3Rvci5oLCBfZGVxdWUuaDogRml4IGltcGxlbWVudGF0aW9uIGZvciB2ZWN0b3Igb2YgCisJbW92YWJsZSBvYmplY3RzIHdoZW4gY2FsbGluZyBlcmFzZSBvZiBhIG51bGwgcmFuZ2UgdGhhbmtzIHRvIGFyYWJlc2MgcmVwb3J0LgorCisJKiBzdGxwb3J0L3N0bC9fc3RyaW5nLmgsIF9zdHJpbmdfd29ya2Fyb3VuZC5oLCBkZWJ1Zy9fc3RyaW5nLmgsIAorCWRlYnVnL19zdHJpbmdfd29ya2Fyb3VuZC5oOiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgTVNWQzYgdGVtcGxhdGUgbWV0aG9kIGJ1ZworCXdvcmthcm91bmQgZXhjbHVzaXZlbHkgZm9yIE1TVkM2IGFuZCBub3QgYW55bW9yZSBmb3IgYWxsIGNvbXBpbGVycy4KKworMjAwNC0xMi0yMSAgUGV0ciBPdnRjaGVua292ICA8cHRyQGlzbGFuZC4uLj4KKworCSogc3JjOiB1bnRlc3RlZCAobG9zdCBzdXBwb3J0KSAubWFrIGFuZCBpbnN0YWxsYXRpb24gZmlsZXMgbW92ZWQgaW50bworCWluaXRpYWxfbWFrIGNhdGFsb2cuCisKKwkqIGV4cGxvcmUsIHNyYzogZXhwbG9yZSBjYXRhbG9nIG1vdmVkIGludG8gc3JjIGNhdGFsb2cuIE1ha2VmaWxlcyBmcm9tCisJZXhwbG9yZSBjYXRhbG9nIGJlY29tZSBtYWluIG1ha2VzeXN0ZW0gb2YgU1RMcG9ydC4KKworMjAwNC0xMi0yMCAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bC9faGFzaHRhYmxlLmg6IEZpeCBvZiB0aGUgY29uc3QgYmVnaW4gYW5kIGVuZCBtZXRob2RzIG9mIHRoZQorCW5ldyBpbXBsZW1lbnRhdGlvbiB0aGFua3MgVGltb3RoeSBUZW5lYmVrb3YgcmVwb3J0LgorCisyMDA0LTEyLTE3ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvY21hdGgsIGNzdGRsaWIsIHN0bC9fY21hdGguaCwgY29uZmlnL3N0bF9tc3ZjLmg6IENvbmZpZ3VyYXRpb24KKwlmaXhlcyBmb3IgLk5ldCAyMDAyLgorCisyMDA0LTEyLTE3ICBCb3JpcyBGb21pdGNoZXYgIDxib3Jpc0BzdGxwb3J0Li4uPgorCisJKiBjaGFyX3RyYWl0cy5oOiBmaXhlZCBfU1RMUF9OT19XQ0hBUl9UIGNhc2UKKworCSogc3JjL2NvbW1vbl9tYWNyb3MubWFrOiBkZWxldGVkIGxvY2FsZS5jcHAKKworMjAwNC0xMi0xNyAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzcmMvZXhwbG9yZS9NYWtlZmlsZXMvbm1ha2UvYXBwL3J1bGVzLWluc3RhbGwtYS5tYWssIHJ1bGVzLWluc3RhbGwtc28ubWFrCisJbGliL3J1bGVzLWluc3RhbGwtc28ubWFrOiBDcmVhdGlvbiBvZiB0aGUgaW5zdGFsbC1zaGFyZWQgYW5kIGluc3RhbGwtc3RhdGljCisJZnJvbSBNaWNoYWVsIEZpbmsuCisKKzIwMDQtMTItMTYgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3RscG9ydC9zdGwvZGVidWcvX2RlYnVnLmgsIF9kZWJ1Zy5jOiBDcmVhdGlvbiBvZiBmdW5jdGlvbnMgdG8gY2hhbmdlIGl0ZXJhdG9ycworCWxpc3Qgb3duZXIuCisKKwkqIHN0bHBvcnQvc3RsL2RlYnVnL19saXN0LmgsIF9zbGlzdC5oOiBNb2RpZmljYXRpb24gb2YgdGhlIGl0ZXJhdG9yIG93bmVycyBpbiB0aGUKKwlzcGxpY2UsIHNwbGljZV9hZnRlciBhbmQgbWVyZ2UgbWV0aG9kIHdoaWNoIGRvIG5vdCBpbnZhbGlkYXRlIGl0ZXJhdG9ycyBidXQgb25seQorCW1vdmUgdGhlbSBmcm9tIGEgW3NdbGlzdCB0byBhbiBvdGhlci4KKworCSogc3RscG9ydC9zdGwvX3JlbG9wc19oYXNoX2NvbnQuaDogcmVtb3ZhbCBvZiB0aGUgPT0gb3BlcmF0b3Igb24gaGFzaGVkIGNvbnRhaW5lcnMKKwlUaGlzIG9wZXJhdG9yIGlzIGp1c3QgaW1wb3NzaWJsZSwgb3IgYXQgbGVhc3QgdmVyeSBjb21wbGljYXRlZCwgdG8gaW1wbGVtZW50IAorCWZvciB0aGlzIGNvbnRhaW5lciB3aGljaCBkbyBub3QgcmVxdWlyZSBhbnkgb3JkZXJpbmcgb3BlcmF0aW9uIG9uIHRoZSB0eXBlIHVzZWQKKwl0byBpbnN0YW5jaWF0ZSB0aGUgY29udGFpbmVyLgorCisJKiB0ZXN0L3VuaXQvaGFzaF90ZXN0LmNwcDogQWRkaXRpb24gb2YgYSBjb21tZW50ZWQgdGVzdCBzaG93aW5nIHdoeSB0aGUgPT0gb3BlcmF0b3IKKwlpcyBpbnZhbGlkIG9uIGhhc2hlZCBjb25zdGFpbmVycy4KKworCSogc3RscG9ydC9zdGwvX2hhc2h0YWJsZS5oOiBNb2RpZmljYXRpb24gb2YgdGhlIGhhc2h0YWJsZSBpbXBsZW1lbnRhdGlvbiBiYXNlZAorCW9uIGEgc2xpc3QgYW5kIGEgdmVjdG9yLiBDb21wYXJlZCB0byB0aGUgcHJldmlvdXMgb25lIHRoZSBhZHZhbnRhZ2VzIGFyZToKKwkJLSBsaWdodGVyIGhhc2h0YWJsZTo6aXRlcmF0b3IKKwkJLSBpdGVyYXRvciBpbmNyZW1lbnQgb3BlcmF0aW9uIGRvIG5vIHJlcXVpcmUgY2FsbCB0byB0aGUgaGFzaCBmdW5jdGlvbi4KKwkJLSBubyBtb3JlIHNwZWNpYWwgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBkZWJ1ZyBtb2RlLCBvbmNlIHZhbGlkYXRlZCBkZWJ1Zy9faGFzaHRhYmxlLmgKKwkgICAgICAgIHdpbGwgYmUgcmVtb3ZlZC4KKwlUaGUgZHJhd2JhY2sgaXMgYSBzbWFsbCBvdmVyaGVhZCBvbiB0aGUgaW5zZXJ0L2VyYXNlIG1ldGhvZHMuCisKKwkqIHN0bHBvcnQvdW5vcmRlcmVkX3NldCwgdW5vcmRlcmVkX21hcDogSW50cm9kdWN0aW9uIG9mIHRoZSBhbG1vc3QgU3RhbmRhcmQgaGFzaCBjb250YWluZXJzLgorCVRoZSBtYWpvciBkaWZmZXJlbmNlIHdpdGggaGFzaF9zZXQgb3IgaGFzaF9tYXAgY29udGFpbmVycyBmcm9tIFNHSSBpcyB0aGUgbG9hZCBmYWN0b3IKKwl0aGF0IGdpdmVzIHRoZSB1c2VyIHRoZSBhYmlsaXR5IHRvIGNoYW5nZSB0aGUgY29udGFpbmVyIHJhdGlvIG9mIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgcGVyCisJYnVja2V0LgorCisyMDA0LTEyLTEzICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RkaW8uaDogcGF0Y2ggZnJvbSBNaWNoYWVsIEZpbmsgdG8gYXZvaWQgd2FybmluZyBvbiB0aGUgRVZDIHBsYXRmb3JtLgorCisJKiBkb2MvZXZjX3dvcmthcm91bmQudHh0OiBEb2N1bWVudGF0aW9uIGZpbGUgZnJvbSBVbHJpY2ggRWNraGFyZHQgYWJvdXQgdGhlIEVWQyAKKwl3b3JrYXJvdW5kIHRvIGF2b2lkIGFubm95aW5nIHdhcm5pbmdzLgorCisJKiBzdGxwb3J0L3R5cGVpbmZvOiBQYXRjaCBmcm9tIFVscmljaCBFY2toYXJkdCB0byBmaXggbWlzc2luZyB0eXBlX2luZm8gc3RydWN0CisJdW5kZXIgTVNWQzYgYW5kIEVWQyBhbmQgYWxzbyBpZGVudGF0aW9uLgorCisyMDA0LTEyLTEwICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL19jb2xsYXRlLmgsIF9sb2NhbGUuaDogZml4IG9mIHRoZSBfX2xvY2FsZV9kb19vcGVyYXRvcl9jYWxsIGludGVybmFsCisJZnVuY3Rpb24gdG8gbWFrZSB0cmFpdHMgYW5kIGFsbG9jYXRvciBhbHNvIHRlbXBsYXRlIHBhcmFtZXRlcnMuCisKKwkqIHN0bHBvcnQvc3RsL19sb2NhbGUuaCwgX2NvbGxhdGUuaCwgc3RscG9ydC9jb25maWcvc3RsX21zdmMuaCwgc3JjL2xvY2FsZS5jcHAsIAorCXNyYy9sb2NhbGVfaW1wbC5oOiByZXN0b3JhdGlvbiBvZiB0aGUgTVNWQzYgd29ya2Fyb3VuZCBmb3IgdGhlIGxvY2FsZSBjbGFzcyB0byAKKwljb3JyZWN0bHkgaGFuZGxlIHRoZSBtZW1iZXIgdGVtcGxhdGUgbWV0aG9kcy4KKworMjAwNC0xMi0wOSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bC9fbWVzc2FnZXNfZmFjZXRzLmg6IGZpeGVkIG1lc3NhZ2VzX2Jhc2U6OmNhdGFsb2cgZnJvbSBsb25nIHR5cGVkZWYKKwl0byBpbnQgdGhhbmtzIFVscmljaCBFY2toYXJkdCByZXBvcnQuCisKKwkqIHN0bHBvcnQvc3RsX3VzZXJfY29uZmlnLmgsIGNvbmZpZy9zdGxfbXN2Yy5oOiBhZGRpdGlvbiBvZiB0aGUgX1NUTFBfVkVSQk9TRV9BVVRPX0xJTksgCisJY29uZmlnIG1hY3JvIHRvIG1ha2UgdGhlIGF1dG9tYXRpYyBsaW5raW5nIGZlYXR1cmUgbW9yZSB2ZXJib3NlIHRoYW5rcyBVbHJpY2ggRWNraGFyZHQKKwlwYXRjaC4KKworCSogc3RscG9ydC9leGNlcHRpb246IEFkZCBjaGVjayBvZiB0aGUgX1NUTFBfSEFTX1NQRUNJRklDX1BST0xPR19FUElMT0cgbWFjcm8gYmVmb3JlCisJaW5jbHVkaW5nIF9tc3ZjX3dhcm5pbmdfb2ZmLmggdG8gYXZvaWQgYmFkIHJlc3VsdGluZyB3YXJuaW5nIHN0YXR1cyB3aGVuIHRoZSBfZXBpbG9nLmgKKwloZWFkZXIgaXMgbm90IGluY2x1ZGVkIHRoYW5rcyBHYWlsIChiYWtlcjg4KSByZXBvcnQuCisKKwkqIHN0bHBvcnQvY2Fzc2VydCwgY2Vycm5vLCBjc2lnbmFsLCBjdHlwZS5oLCBjd2N0eXBlLCBzdGRhcmcuaCwgc3RkbGliLmgsIHN0cmluZy5oLAorCWNvbmZpZy9zdGxfZXZjLmg6IFBhdGNoIGZyb20gTWljaGFlbCBGaW5rIHRvIGZpeCBjb21waWxhdGlvbiBwcm9ibGVtIHVzaW5nIHJlc3NvdXJjZQorCWNvbXBpbGVyIGZvciBldmMzIGFuZCBldmM0IGFuZCBwcm9ibGVtcyB3aXRoIGNlcnJubyBhbmQgY2Fzc2VydCBpbmNsdXNpb25zIHJlcG9ydGVkCisJYnkgVWxyaWNoIEVja2hhcmR0LgorCisyMDA0LTEyLTAxICBQZXRyIE92dGNoZW5rb3YgIDxwdHJAaXNsYW5kLi4uPgorCisJKiBzdGxwb3J0L3N0ZGV4Y2VwdDogcmVtb3ZlcyBzb21lIHdhcm5pbmdzIHJlZ2FyZGluZyB0aGUgZXhjZXB0aW9uIGNsYXNzIGJlaW5nIGRlcml2ZWQKKwlmcm9tIGEgbm9uLWRsbCBpbnRlcmZhY2UgY2xhc3Mgb24gZXZjNC4gTWljaGFlbCBGaW5rIGNvbnRyaWJ1dGlvbi4KKworCSogc3RscG9ydC9zdGwvX2NtYXRoLmg6IHB1c2gvcG9wIHdhcm5pbmcgbGV2ZWwgZm9yIFZDcy4gTWljaGFlbCBGaW5rIGNvbnRyaWJ1dGlvbi4KKworCSogc3JjL19zdGRpb19maWxlLmg6IEV2YzQgdXNlcyBhbiB1Z2x5IGhhY2sgdG8gaW1wbGVtZW50IGZpbGUgSU8gdXNpbmcgYSBGSUxFQ0Ugc3RydWN0dXJlCisJcmVwcmVzZW50aW5nIHRoZSBpbnRlcm5hbCBGSUxFIHN0cnVjdHVyZS4gRm9yIGV2YzMgTWljaGFlbCBGaW5rIGltcGxlbWVudGVkIGEgbXVjaCBzaW1wbGVyCisJd2F5IHRoYXQgYWxzbyB3b3JrcyBmb3IgZXZjNC4KKworCSogc3RscG9ydC9jb25maWcvc3RsX2V2Yy5oLCBzdGxfbXN2Yy5oLCBzdGxjb21wLmg6IHNlcGFyYXRlIGNvbmZpZyBzdHVmZiBmb3Igc3RsX2V2Yy5oCisJYW5kIHN0bF9tc3ZjLmguIE5vdyBhbGwgV2luZG93cyBDRSBzcGVjaWZpYyBkZWZpbmVzIGFyZSBpbiBzdGxfZXZjLmggb25seS4KKwlNaWNoYWVsIEZpbmsgY29udHJpYnV0aW9uLgorCisJKiBzdGxwb3J0L3N0bC9fY29kZWN2dC5oLCBfY3R5cGUuaCwgX21lc3NhZ2VzX2ZhY2V0cy5oLCBfbW9uZXRhcnkuaDogYWRkIGZyaWVuZCBjbGFzcworCV9Mb2NhbGVfaW1wbC4KKworCSogc3RscG9ydC9zdGwvX251bV9nZXQuaCwgX251bV9wdXQuaCwgX251bXB1bmN0LmgsIF90aW1lX2ZhY2V0cy5oOiBkaXR0by4KKworMjAwNC0xMS0zMCAgUGV0ciBPdnRjaGVua292ICA8cHRyQGlzbGFuZC4uLj4KKworCSogc3JjL2V4cGxvcmUvY29uZmlndXJlLmJhdDogYWRkZWQgcXVvdGVzLiBUaGFua3MgVWxyaWNoIEVja2hhcmR0IGFuZCBNaWNoYWVsIEZpbmsuCisKKwkqIHN0bHBvcnQvc3RsL19sb2NhbGUuaCwgc3JjL2xvY2FsZV9pbXBsLmgsIHNyYy9sb2NhbGVfaW1wbC5jcHA6IGFkZGVkIF9TVExQX0RFQ0xTUEVDCisJYW5kIF9TVExQX0NBTEwgZm9yIHNvbWUgZnVuY3Rpb25zLiBUaGFua3MgVWxyaWNoIEVja2hhcmR0LgorCisJKiBzdGxwb3J0L3N0bC9fY29sbGF0ZS5oLCBfbnVtcHVuY3QuaCwgX21vbmV0YXJ5LmgsIF9jb2RlY3Z0LmgsIF90aW1lX2ZhY2V0cy5oOgorCV9Mb2NhbGVfaW1wIG1hZGUgZnJpZW5kIHdpdGhvdXQgcmVsYXRpb24gdG8gX1NUTFBfTEVBS1NfUEVEQU5USUMuIFRoYW5rcyBVbHJpY2ggRWNraGFyZHQuCisKKwkqIHN0bHBvcnQvc3RsL19sb2NhbGUuaDogcmVtb3ZlIGJvZHkgb2YgcHJvdGVjdGVkIGNvbnN0cnVjdG9yIHRvIGF2b2lkIHdhcm5pbmdzLgorCVRoYW5rcyBLaWRtYW4gYW5kIFVscmljaCBFY2toYXJkdC4KKworCSogc3JjL2xvY2FsZV9pbXBsLmNwcDogdXNlIHNpbXBsZSByZXNpemUgb2YgZmFjZXRzX3ZlYzsgcmVzZXJ2ZSBzcGFjZSBmb3IgZmFjZXRzX3ZlYyB0byBiZQorCXN1cmUgdGhhdCBhbGxvY2F0aW9uIGRvbid0IHRocm93IGV4Y2VwdGlvbiBkdXJpbmcgdmVjdG9yIHJlc2l6ZSBpbiBpbnNlcnRfKl9mYWNldHMgZnVuY3Rpb25zLgorCVRoYW5rcyBVbHJpY2ggRWNraGFyZHQuCisKKzIwMDQtMTEtMjkgIFBldHIgT3Z0Y2hlbmtvdiAgPHB0ckBpc2xhbmQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL19jbWF0aC5oOiBwYXRjaCBmcm9tIE1pY2hhZWwgRmluayBhcHBsaWVkLgorCisJKiBzdGxwb3J0L3N0bC9fbG9jYWxlLmg6IHJlbW92ZSBlbmNsb3NlIGNsYXNzIHNwZWMgdG8gYXZvaWQgVkMgY29uZnVzZS4KKwlUaGFua3MgVWxyaWNoIEVja2hhcmR0LgorCisJKiBzcmMvbG9jYWxlX2ltcGwuY3BwLCBzcmMvbG9jYWxlX2ltcGwuaDogcmVtb3ZlIGJvZ3VzIF9TVExQX0NBTEwgZGVjbHMuCisJVGhhbmtzIFVscmljaCBFY2toYXJkdC4KKworMjAwNC0xMS0yNyAgUGV0ciBPdnRjaGVua292ICA8cHRyQGlzbGFuZC4uLj4KKworCSogc3RscG9ydC9zdGwvX3RocmVhZHMuaDogZGlyZWN0IGFjY2VzcyB0byBfTV9yZWZfY291bnQgaXNuJ3QgTVQtc2FmZTsKKwljb3VudGVyIHZhbHVlIHJldHVybmVkIGJ5IF9NX2luY3IgYW5kIF9NX2RlY3IgbWV0aG9kcyBvbmx5LgorCisJKiBzdGxwb3J0L3N0bC9fcm9wZS5oLCBzdGxwb3J0L3N0bC9fcm9wZS5jOiBhZGFwdGF0aW9uIHRvIGNoYW5nZXMgYWJvdmU7CisJcmVtb3ZlZCBfX0dDIG1hY3JvIGRlcGVuZGVudCBjb2RlLCB0aGF0IHdhcyBuZXZlciBkZWZpbmVkIGluIHByZXNlbnQKKwlzb3VyY2VzLgorCisJKiBzcmMvbG9jYWxlLmNwcCwgbG9jYWxlX2ltcGwuY3BwLCBsb2NhbGVfaW1wbC5oOiBnZW5lcmFsIHJldmlzaW9uIG9mIGxvY2FsZQorCWltcGxlbWVudGF0aW9uOyBjb2RlIGNsZWFuLCBjb3JyZWN0ZWQsIGNvbmNlcHRzIGZpeGVkLCBlcnJvcnMgZml4ZWQsCisJbmV3IGJ1Z3MgYWRkZWQuCisKKwkqIHNyYy9jdHlwZS5jcHAsIGZhY2V0c19ieW5hbWUuY3BwLCBsb2NhbGVfY2F0YWxvZy5jcHAsIG1lc3NhZ2VzLmNwcCwgbW9uZXRhcnkuY3BwOgorCWRpdHRvLgorCisJKiBzdGxwb3J0L3N0bC9fY29kZWN2dC5oLCBfY29sbGF0ZS5oLCBfY3R5cGUuaCwgX2xvY2FsZS5oLCBfbWVzc2FnZXNfZmFjZXRzLmg6CisJZGl0dG8uCisKKwkqIF9tb25ldGFyeS5oLCBfbnVtX2dldC5oLCBfbnVtX3B1dC5oLCBfbnVtcHVuY3QuaCwgX3RpbWVfZmFjZXRzLmg6IGRpdHRvLgorCisJKiBzcmMvbG9jYWxlX25vbmNsYXNzaWMuaDogcmVtb3ZlZCBkdWUgdG8gY29kZSByZXZpc2lvbi4KKworCSogc3JjL2V4cGxvcmUvTWFrZWZpbGUuaW5jOiBsb2NhbGUuY3BwIGlzIGRpcmVjdGx5IGluY2x1ZGVkIGludG8gbG9jYWxlX2ltcGwuY3BwLgorCisJKiBzcmMvZXhwbG9yZS9nY2MubWFrLCB0ZXN0L3VuaXQvZ2NjLm1hazogdXNlIF9TVExQX0xFQUtTX1BFREFOVElDIGJlZm9yZSByZWxlYXNlCisJYnkgZGVmYXVsdC4KKworMjAwNC0xMS0yNCAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bC9fY21hdGguaDogRml4IG9mIHRoZSBhYnMgZGVmaW5pdGlvbiBmb3IgdGhlIEVWQyBwbGF0Zm9ybQorCXRoYW5rcyBNaWNoYWVsIEZpbmsuCisKKwkqIHN0bHBvcnQvc3RsL19jbWF0aC5oOiBGaXggb2YgdGhlIEludGVybmFsIENvbXBpbGVyIEVycm9yIGZyb20gTVNWQzYKKwl3aGVuIGRlZmluaW5nIG1hdGggZnVuY3Rpb25zIGluIHRoZSBTVExwb3J0IG5hbWVzcGFjZSB0aGFua3MgVWxyaWNoCisJRWNraGFyZHQgYW5kIEkuCisKKwkqIHN0bHBvcnQvc3RsL2RlYnVnOiBDcmVhdGlvbiBvZiBhIGRlYnVnIGl0ZXJhdG9yIHRyYWl0cyB1c2VkIHRvIG1ha2UKKwlhbiBhZGRpdGlvbmFsIHRlc3Qgd2hlbiBjaGVja2luZyBpdGVyYXRvciBkZWZlcmVuY2luZyBzdGF0dXMsIG9uIHNsaXN0CisJYmVmb3JlX2JlZ2luIGl0ZXJhdG9ycyBhcmUgbm90IGRlcmVmZXJlbmNlYWJsZSBidXQgd2VyZSBub3QgZGV0ZWN0ZWQKKwlhcyBzby4KKworCSogc3RscG9ydC9tYXRoLmgsIHN0ZGV4Y2VwdDogcGF0Y2hlcyBmcm9tIE1pY2hhZWwgRmluayB0byBhdm9pZCB3YXJuaW5nIAorCW9uIHRoZSBFVkMgcGxhdGZvcm0uCisKKzIwMDQtMTEtMjIgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3JjL2V4cGxvcmUvTWFrZWZpbGVzL25tYWtlL2V2YzMubWFrLCBldmM0Lm1hazogcmVtb3ZhbCBvZiB0aGUgdXNlbGVzcyAKKwkvRFBMQVRGT1JNIG1hY3JvIGRlZmluaXRpb24gdGhhbmtzIFVscmljaCBFY2toYXJkdCByZXBvcnQgYW5kIE1pY2hhZWwgRmluaworCXBhdGNoLgorCisJKiBzdGxwb3J0L2NzdGRsaWI6IGV4dGVuc2lvbiBvZiB0aGUgZGl2IG92ZXJsb2FkIGZvciBsb25nIGlucHV0IHVwIHRvIE1TVkM3LjEKKwl0aGFua3MgTWljaGFlbCBGaW5rIHJlcG9ydC4KKworCSogdGVzdC91bml0L3N0cmluZ190ZXN0LmNwcDogcGF0Y2ggZnJvbSBNaWNoYWVsIEZpbmsgZm9yIEVWQyB3aGljaCBoYXMgbGltaXRlZAorCXN1cHBvcnQgb2YgdGhlIFdhaXRGb3JNdWx0aXBsZU9iamVjdHMgQVBJIGZ1bmN0aW9uLgorCisJKiBzdGxwb3J0L2NzdGRsaWIsIGN3Y2hhciwgdXNpbmcvY3N0cmluZzogcGF0Y2ggZnJvbSBNaWNoYWVsIEZpbmsgdG8gcmVtb3ZlCisJaW1wb3J0cyBvZiBtaXNzaW5nIG5hdGl2ZSBDIGZ1bmN0aW9ucy4KKworMjAwNC0xMS0xNiAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzcmMvZXhwbG9yZS9jb25maWd1cmUuYmF0OiBBZGQgb2YgdGhlIC0tcnRsLXN0YXRpYyBhbmQgLS1ydGwtZHluYW1pYworCWNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byBmb3JjZSB1c2Ugb2Ygc3RhdGljIG9yIGR5bmFtaWMgQyBydW50aW1lIHRoYW5rcworCU1pY2hhZWwgRmluay4KKworCSogc3RscG9ydC9jb25maWcvc3RsX21zdmMuaDogdW5kZWYgb2YgdGhlIF9TVExQX1VTSU5HX0NST1NTX05BVElWRV9SVU5USU1FX0xJQgorCWZvciB0aGUgZXZjIHBsYXRmb3JtIHRoYXQgb25seSBoYXZlIHRoZSBzdGF0aWMgQyBydW50aW1lIHZlcnNpb24gdGhhbmtzCisJTWljaGFlbCBGaW5rLgorCisJKiBzdGxwb3J0L2NvbmZpZy9zdGxfYmMuaCwgc3RsX2RtYy5oLCBzdGxfc29sYXJpcy5oOiBSZW1vdmFsIG9mIGFsbCByZWZlcmVuY2VzCisJdG8gdGhlIGRlcHJlY2F0ZWQgX1NUTFBfTk9fT1dOX0lPU1RSRUFNUyBhbmQgX1NUTFBfTk9fTkVXX0lPU1RSRUFNUyBtYWNyb3MuCisKKwkqIHN0bHBvcnQvY21hdGgsIHN0bC9fY21hdGguaDogTW9kaWZpY2F0aW9uIG9mIHRoZSBpbXBvcnQgb2YgdGhlIHBvdyBmdW5jdGlvbgorCWZvciBNU1ZDNiB0aGF0IGhhcyBhIGJ1Z2dlZCBvdmVybG9hZCB0aGFua3MgTWljaGFlbCBGaW5rIHJlcG9ydC4KKworMjAwNC0xMS0wOSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiB0ZXN0L3VuaXQvY29uZmlnX3Rlc3QuY3BwOiBDcmVhdGlvbiBvZiBhIHRlc3QgY2FzZSB0byBjaGVjayBjb3JyZWN0CisJcGxhdGZvcm0vY29tcGlsZXIgY29uZmlndXJhdGlvbi4KKworCSogc3RscG9ydC9jb25maWcvc3RsX21zdmMuaDogRGVmaW5pdGlvbiBvZiB0aGUgX1NUTFBfSEFTX05BVElWRV9GTE9BVF9BQlMKKwlub3cgc3RhcnQgd2l0aCBNU1ZDNi4KKworCSogc3RscG9ydC9jc3RkbGliLCBzdGwvX2NtYXRoLmg6IEFkZGl0aW9uIG9mIHNvbWUgbWlzc2luZyBtYXRoIGZ1bmN0aW9uCisJIG92ZXJsb2FkcyBmb3IgTVNWQzYuCisKKzIwMDQtMTEtMDUgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3RscG9ydC9jb25maWcvc3RsX21zdmMuaDogRGVmaW5pdGlvbiBvZiB0aGUgX1NUTFBfSEFTX05BVElWRV9GTE9BVF9BQlMKKwlzdGFydGluZyB3aXRoIE1TVkMgLk5ldCAyMDAyIHRoYW5rcyBLZXZpbiBCbHVjayByZXBvcnQuCisKKwkqIHRlc3QvdW5pdC9jbWF0aF90ZXN0LmNwcDogQ3JlYXRpb24gb2YgYSB0ZXN0IGNhc2UgdG8gY2hlY2sgY29ycmVjdCBpbXBvcnQKKwlhbmQgZXh0ZW5zaW9ucyBvZiBDIGZ1bmN0aW9ucy4KKworMjAwNC0xMS0wNCAgUGV0ciBPdnRjaGVua292ICA8cHRyQGlzbGFuZC4uLj4KKworCSogc3JjL2V4cGxvcmUvTWFrZWZpbGVzOiBhZGRlZCB0ZW1wbGF0ZXMgQ0MubWFrIGZvciBTdW5Qcm8ncyBDQyBjb21waWxlcnM7CisJb25lcyBzaG91bGQgYmUgY2hlY2tlZCBhbmQgZml4ZWQgd2l0aCByZWFsIGNvbXBpbGVyLgorCisyMDA0LTExLTA0ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL19mdW5jdGlvbi5oLCBfcXVldWUuaCwgX3N0YWNrLmgsIF9tYXAuaCwgX2l0ZXJhdG9yLmg6IAorCXJlc3RvcmF0aW9uIG9mIHRoZSBTdGFuZGFyZCBuYW1lcyBvZiB0aGUgcHJvdGVjdGVkIGRhdGFzLgorCisJKiBzdGxwb3J0L3N0bC9fYWxsb2MuaCwgX2FsbG9jLmM6IGltcGxlbWVudGF0aW9uIG9mIGEgbG9jayBmcmVlIHZlcnNpb24KKwlvZiB0aGUgZGVmYXVsdCBTVExwb3J0IG5vZGVfYWxsb2NhdG9yLiBTdXBwb3J0ZWQgYnkgdGhlIFdpbjMyIHBsYXRmb3JtCisJZm9yIHRoZSBtb21lbnQuCisKKwkqIHNyYy9pb3MuY3BwLCBsb2NhbGUuY3BwLCBsb2NhbGVfaW1wbC5jcHA6IHVzZSBvZiBhdG9taWMgb3BlcmF0aW9ucworCXVuZGVyIFdpbjMyIHBsYXRmb3JtIHJhdGhlciB0aGFuIHVzaW5nIHN5bmNocm9uaXNhdGlvbiBwcmltaXRpdmVzLgorCisJKiBzdGxwb3J0L3N0bC9fdHJlZS5oLCBfbWFwLmgsIF9zZXQuaDogY3JlYXRpb24gb2YgdGhlIGVyYXNlX3VuaXF1ZSBhbmQKKwllcXVhbF9yYW5nZV91bmlxdWUgbWV0aG9kcyB0byB1c2UgdGhlIHVuaWNpdHkgaW5mb3JtYXRpb24gb2YgdGhlIG1hcCBhbmQKKwlzZXQgY29udGFpbmVycyBpbiBiaW5hcnkgdHJlZSBzZWFyY2hlcy4KKworCSogc3RscG9ydC9zdGwvX3N0cmluZy5oOiBBZGQgX1NUTFBfVVNFX05PX0lPU1RSRUFNUyBjaGVjayBiZWZvcmluZyBkZWNpZGluZworCW5vdCB0byBpbmNsdWRlIF9zdHJpbmcuYyB0aGFua3MgS0wKKworMjAwNC0xMS0wMiAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bC9wb2ludGVycy9fZGVxdWUuaDogRml4IGZvciB0aGUgcHJvYmxlbSBvZiB0aGUgZGVxdWU8dm9pZCo+CisJaW5zdGFuY2lhdGlvbiB0aGFua3MgQWxleCBDb3NlYWxpbiByZXBvcnQKKworCSogdGVzdC91bml0L3B0cnNwZWNfdGVzdC5jcHA6IEFkZCBvZiBhIHRlc3QgZm9yIHRoZSBwcmV2aW91cyBwcm9ibGVtLgorCisyMDA0LTEwLTMxICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL19yb3BlLmg6IEZpeCBvZiB0aGUgYXBwbHlfdG9fcGllY2VzIHF1YWxpZmljYXRpb24gdGhhbmtzIExlZXlhLgorCisJKiB0ZXN0L3VuaXQvcm9wZV90ZXN0LmNwcDogTmV3IHRlc3QgY2FzZSBmb3IgdGhlIHByZXZpb3VzIGZpeC4KKworMjAwNC0xMC0zMCAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzcmMvZXhwbG9yZS9NYWtlZmlsZXMvbm1ha2UvdmMtY29tbW9uLm1hazogaW50cm9kdWN0aW9ucyBvZiB0aGUgTERGTEFHU19BX1JFTAorCW1hY3JvIHRvIGZpeCBjb25maWcgcHJvYmxlbSB1bmRlciBWQzcxIGFuZCBWQzggYmV0YS4KKworMjAwNC0xMC0yOSAgUGV0ciBPdnRjaGVua292ICA8cHRyQGlzbGFuZC4uLj4KKworCSogc3JjL2V4cGxvcmUvTWFrZWZpbGVzL2dtYWtlL2FwcC9nY2MubWFrOiB1c2UgLWZQSUMgZm9yIGdjYyAyLjk1Lnggd2hlbiBidWlsZAorCWFwcGxpY2F0aW9uLS0tdGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIGJ1ZyB3aXRoIHJ1bm5pbmcgY29kZSBpbiBzdGF0aWMgY29uc3RydWN0b3JzLgorCisJKiBzdGxwb3J0L2NvbmZpZy9zdGxfZ2NjLmgsIHN0bHBvcnQvc3RsL19jb25maWcuaDogZm9yY2UgdXNhZ2Ugb2YgbXV0ZXggaW5zdGVhZAorCW9mIHNwaW5sb2NrIGZvciBnY2MgMi45NS54LCBkdWUgdG8gcHJvYmxlbXMgd2l0aCBpbml0aWFsaXphdGlvbiBvZiBzdGF0aWNzLgorCUluaXRpYWxpemF0aW9uIG9mIG11dGV4IGhhcyB2YXJpYW50IHdpdGggc3RydWN0dXJlIGZpbGxpbmcsIHdoaWxlIGZvciBzcGlubG9jaworCWluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIGNhbGwgcmVxdWlyZWQuCisKKwkqIHRlc3QvdW5pdC9sb2NhbGVfdGVzdC5jcHA6IGF2b2lkIHN0YXRpYyBvYmplY3QgZm9yIGdjYyAyLjk1LngsIGR1ZSB0byBwcm9ibGVtcworCXdpdGggaW5pdGlhbGl6YXRpb24gb2Ygc3RhdGljcy4KKworMjAwNC0xMC0yNyAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bC9fY29uZmlnLmgsIF9mc3RyZWFtLmgsIF9pb3MuaCwgX2lzdHJlYW0uaCwgX21vbmV0YXJ5LmgsIF9udW1fZ2V0LmgsCisJX251bV9wdXQuaCwgX29zdHJlYW0uaCwgX3NzdHJlYW0uaCwgX3N0cmVhbWJ1Zi5oLCBfc3RyaW5nLmgsIF90aW1lX2ZhY2V0cy5oOgorCVJlc3RvcmF0aW9uIG9mIHRoZSBfU1RMUF9OT19DVVNUT01fSU8gZmVhdHVyZSByZW1vdmVkIGFmdGVyIGNsZWFudXAgcmVwb3J0ZWQKKwlpbiAyMDA0LTA5LTI4IHBvc3QgZnJvbSBQZXRyLgorCisJKiBzdGxwb3J0L3N0bC9zdGxfdXNlcl9jb25maWcuaCwgX2NvbmZpZy5oLCBzdGxfbXN2Yy5oOiByZWFjdGl2YXRpb24gb2YgdGhlIAorCWF1dG8gbGluayBmZWF0dXJlIGZvciBNU1ZDIGJ1dCBvbmx5IGlmIGFjdGl2YXRlZCBieSB0aGUgY2xpZW50LiBNb3Jlb3ZlciB0aGUKKwluZXcgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBmZWF0dXJlIGlzIG1vcmUgbWFpbnRlbmFibGUsIHN0bF9tc3ZjLmggd29uJ3QgaGF2ZQorCXRvIGJlIGVkaXRlZCBhdCBlYWNoIFNUTHBvcnQgcmVsZWFzZS4KKworCSogdGVzdC91bml0L25tYWtlLXZjLWNvbW1vbi5tYWssIG5tYWtlLWV2Yy1jb21tb24ubWFrOiBBZG9wdGlvbiBvZiB0aGUgYXV0byBsaW5rCisJcHJvY2Vzcy4KKworMjAwNC0xMC0yNSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bC9fY29uZmlnLmg6IEludHJvZHVjdGlvbiBvZiB0aGUgX1NUTFBfRE9OVF9VU0VfRVhDRVBUSU9OUyB3aGljaCAKKwltZWFucyB0aGF0IHRoZSBjbGllbnQgZG8gbm90IHdhbnQgdG8gdXNlIHRoZSBDKysgZXhjZXB0aW9uIGZlYXR1cmUuIEl0IGlzCisJZGlmZmVyZW50IGZyb20gdGhlIF9TVExQX05PX0VYQ0VQVElPTlMgd2hpY2ggbWVhbnMgdGhhdCB0aGUgY29tcGlsZXIgZG8gbm90CisJc3VwcG9ydCBleGNlcHRpb25zIGF0IGFsbC4gVGhlIGRpc3RpbmN0aW9uIGlzIGltcG9ydGFudCBmb3Igc29tZSBtYWNyb3MgZGVmaW5pdGlvbi4KKworCSogdGVzdC91bml0OiBNb2RpZmljYXRpb24gb2YgdGhlIF9TVExQX05PX0VYQ0VQVElPTlMgdGVzdCB0byB0aGUgbW9yZSBnZW5lcmFsCisJX1NUTFBfVVNFX0VYQ0VQVElPTiBtYWNyby4KKworCSogc3RscG9ydC9zdGwvX2lvc19iYXNlLmgsIHNyYy9pb3MuY3BwOiByb2xsYmFjayBvZiB0aGUgbW9kaWZpY2F0aW9ucyBvZiB0aGUKKwkyMDA0LTEwLTI0LgorCisJKiBzdGxwb3J0L2NvbmZpZy9zdGxfbXN2Yy5oLCBzdGxfZ2NjLmg6IFRob3NlIDIgY29tcGlsZXJzIGhhdmUgYSBleGNlcHRpb24gCisJc3VwcG9ydCBzd2l0Y2gsIHdoZW4gZXhjZXB0aW9ucyBhcmUgdW5hY3RpdmF0ZWQgdGhleSBub3cgZGVmaW5lCisJX1NUTFBfRE9OVF9VU0VfRVhDRVBUSU9OUyByYXRoZXIgdGhhbiBfU1RMUF9OT19FWENFUFRJT05TLgorCisyMDA0LTEwLTI1ICBQZXRyIE92dGNoZW5rb3YgIDxwdHJAaXNsYW5kLi4uPgorCisJKiBzdGxwb3J0L3N0bC9fc3N0cmVhbS5jOiBjdXIgZGlyZWN0aW9uIG1pc3NlZCBpbiBzZWVrb2ZmLiBUaGFua3MgRGF2aWQgT2Jlcm1hbm4uCisKKwkqIHNzdHJlYW1fdGVzdC5jcHA6IHRlc3QgZm9yIHByb2JsZW0gYWJvdmUuCisKKzIwMDQtMTAtMjQgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3RscG9ydC9zdGwvX2lvc19iYXNlLmgsIHNyYy9pb3MuY3BwOiBkZWZpbml0aW9uIG9mIHRoZSBpb3NfYmFzZTo6ZmFpbHVyZQorCW5lc3RlZCBjbGFzcyBvbmx5IHdoZW4gZXhjZXB0aW9uIHN1cHBvcnQgaXMgYWN0aXZhdGVkLgorCisJKiBzdGxwb3J0L3N0bC9fZGVxdWUuaCwgX2RlcXVlLmM6IE1vZGlmaWNhdGlvbiBvZiB0aGUgZGVxdWUgaW1wbGVtZW50YXRpb24KKwl0byB1c2UgdGhlIGludGVybmFsIG1vdmUgZnJhbWV3b3JrLgorCisJKiB0ZXN0L3VuaXQvbXZjdG9yX3Rlc3QuY3BwOiBOZXcgdGVzdCBjYXNlIGZvciB0aGUgdXNlIG9mIHRoZSBtb3ZlCisJZnJhbWV3b3JrIHdpdGhpbiB0aGUgZGVxdWUgY29udGFpbmVyLgorCisyMDA0LTEwLTIxICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL19pb3N0cmluZ19zdHJlYW0uaDogU2ltcGxpZmljYXRpb24gb2YgdGhlIF9fc3RsX2FsbG9jX3JlYmluZAorCSBvdmVybG9hZCB0byBtYWtlIGl0IGxlc3MgYW1iaWd1b3VzIGZvciB0aGUgY29tcGlsZXJzIHVzaW5nIGl0LgorCisyMDA0LTEwLTE4ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL192ZWN0b3IuaCwgX3ZlY3Rvci5jOiBBZGQgb2YgY2hlY2tzIHRvIGtub3cgaWYgYSByZWZlcmVuY2UKKwlpcyBpbiAqdGhpcyBiZWZvcmUgbWFraW5nIGEgc3lzdGVtYXRpY2FsIGNvcHkgb2YgaXQuCisKKzIwMDQtMTAtMTggIFBldHIgT3Z0Y2hlbmtvdiAgPHB0ckBpc2xhbmQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL3R5cGVfbWFuaXBzLmg6IHJlcGxhY2UgdGVtcGxhdGUgPD4gYnkgbWFjcm8uCisKKwkqIHN0bHBvcnQvc3RsL2RlYnVnL19kZWJ1Zy5oLCBfZGVidWcuYzogX19jaGVja19pZl9ub3Rfb3duZXIgc2hvdWxkIHJldHVybiB0cnVlCisJaW4gY2FzZSBvZiBpbmNvbXBhdGlibGUgdHlwZXMgYW5kIGRvIGNoZWNrIGRpZmZlcmVudCBmcm9tIF9fY2hlY2tfaWZfb3duZXI7CisJYWRkZWQgbWVzc2FnZSBmb3IgY2hlY2sgX19jaGVja19pZl9ub3Rfb3duZXIuCisKKwkqIHRlc3QvdW5pdC9tdmN0b3JfdGVzdC5jcHAsIHRlc3QvdW5pdC9wdHJzcGVjX3Rlc3QuY3BwOiBmaXggdGVzdHMgdG8gc2F0aXNmeQorCWNoYW5nZXMgcmVsYXRlZCB0byAyMy4xLjEgVGFibGUgNjcgaW4gc3RscG9ydC9zdGwvZGVidWcvX3ZlY3Rvci5oLCBfZGVxdWUuaC0tLXNlZQorCXJlY29yZCAyMDA0LTEwLTE0IGJlbG93LgorCisyMDA0LTEwLTE0ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL2RlYnVnL19pdGVyYXRvci5oOiBNb3ZlIG9mIHNvbWUgX0RCR19pdGVyX2Jhc2UgYW5kIF9EQkdfaXRlcgorCW1ldGhvZHMgaW1wbGVtZW50YXRpb24gb3V0c2lkZSBzdHJ1Y3QgZGVmaW5pdGlvbiB0byBmaXggY2FsbCBvbiBpbmNvbXBsZXRlIAorCXR5cGUgY29tcGlsZSBlcnJvciBnZW5lcmF0ZWQgYnkgdGhlIGNhbGwgdG8gdGhlIF9JbmNyZW1lbnRhYmxlIG9yIF9EZXJlZmVyZW5jZWFibGUKKwlmdW5jdGlvbnMgcGFzc2luZyAqdGhpcyBhcyBpbnB1dCBwYXJhbWV0ZXIgdGhhbmtzIEFsZXhleSBTYXJ5dGNoZXYKKworCSogdGVzdC91bml0L3NzdHJlYW1fdGVzdC5jcHAsIGZzdHJlYW1fdGVzdC5jcHA6IEZpeCBvZiB0aGUgdGVzdHMgb24gc3RyZWFtYnVmIAorCXRocm93aW5nIGV4Y2VwdGlvbiBmb3IgcGxhdGZvcm0gd2l0aCBubyBleGNlcHRpb24gc3VwcG9ydC4KKworCSogc3RsL19zdHJpbmcuaDogQWRkIG9mIHRoZSBtaXNzaW5nIGNvbXBhcmUgbWV0aG9kcyBvbiB0aGUgYmFzaWNfc3RyaW5nIAorCWltcGxlbWVudGF0aW9uIHVzZWQgYnkgY29tcGlsZXJzIHN1cHBvcnRpbmcgdGVtcGxhdGUgbWV0aG9kcyB0aGFua3MgUGF0cmljaworCUJlbm5ldHQgcmVwb3J0LgorCisJKiBzdGxwb3J0L3N0bC9kZWJ1Zy9fdmVjdG9yLmgsIF9kZXF1ZS5oOiBBZGQgY2hlY2sgb24gdGhlIGluc2VydCByYW5nZSBtZXRob2QsIAorCXRoZSBpbnNlcnRlZCBjYW4gbm90IGJlIHBvaW50aW5nIHRvIHRoZSB0aGlzIGluc3RhbmNlIHdoZXJlIHRoZSBpbnNlcnRpb24gb2NjdXIuCisKKzIwMDQtMTAtMTMgIFBldHIgT3Z0Y2hlbmtvdiAgPHB0ckBpc2xhbmQuLi4+CisKKwkqIHNyYy9leHBsb3JlL01ha2VmaWxlcy9nbWFrZTogYSBiaXQgY29ycmVjdGlvbiBvZiBjb21waWxlZCBhbmQgaW5zdGFsbGVkIG5hbWVzCisJb2YgZXhlY3V0YWJsZXMgb24gKm5peCBzeXN0ZW1zLCBzZWUgcmVjb3JkIDIwMDQtMDktMjkgYnkgRnJhbmNvaXMuCisKKzIwMDQtMTAtMTIgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3RscG9ydC9zdGwvX2NvbmZpZy5oOiB0eXBvIGZpeCB0aGFua3MgS0wKKworCSogc3RscG9ydC9zdGwvX21vdmVfY29uc3RydWN0X2Z3ay5oLCBfc2V0LmgsIF9tYXAuaCwgX2hhc2hfc2V0LmgsIF9oYXNoX21hcC5oOgorCUV4dHJhIHNlbWljb2xvbnMgcmVtb3ZhbCB0aGFua3MgV2xvZGVrIFN6YWZyYW4gcmVwb3J0cy4KKworMjAwNC0xMC0xMSAgUGV0ciBPdnRjaGVua292ICA8cHRyQGlzbGFuZC4uLj4KKworCSogc3RscG9ydC9zdGwvX3JvcGUuaDogYWRkIHR5cGVuYW1lLgorCisyMDA0LTEwLTA4ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL19kZXF1ZS5oLCBfaGFzaHRhYmxlLmgsIF90cmVlLmgsIF9idmVjdG9yLmg6IFNwZWNpYWxpemF0aW9uIG9mIHRoZQorCV9fdHlwZV90cmFpdHMgc3RydWN0IGZvciB0aGUgaXRlcmF0b3IgdHlwZXMuCisKKwkqIHN0bHBvcnQvc3RsL191bmluaXRpYWxpemVkLmgsIF92ZWN0b3IuaDogUmVsYXggb2YgdGhlIHJ1bGVzIHRvIHBlcmZvcm0gc29tZSAKKwlvcHRpbWl6YXRpb25zLCBubyBtb3JlIFBPRCBjaGVjaywgcmF0aGVyIHVzZSBvZiB0aGUgdHJpdmlhbCBjb3B5IGNvbnN0cnVjdG9yLCAKKwl0cml2aWFsIGFzc2lnbm1lbnQgb3BlcmF0b3IgaW5mb3JtYXRpb25zLgorCisJKiBzdGxwb3J0L3N0bC9fY29uZmlnLmgsIF9lcGlsb2cuaDogQWRvcHRpb24gb2Ygc3RscG9ydCBhcyB0aGUgb2ZmaWNpYWwgU1RMcG9ydAorCW5hbWVzcGFjZSB3aGVuIHVzZXJzIGNhbm5vdCB1c2UgdGhlIHN0ZCBuYW1lc3BhY2UuCisKKzIwMDQtMTAtMDcgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3RscG9ydC9zdGwvX2xpc3QuaDogU3BlY2lhbGl6YXRpb24gb2YgdGhlIF9fdHlwZV90cmFpdHMgc3RydWN0IGZvciBsaXN0IGl0ZXJhdG9ycy4KKwlNb3ZlIG9mIHRoZSA9PSBhbmQgIT0gb3BlcmF0b3JzIGZyb20gdGhlIGJhc2UgaXRlcmF0b3IgY2xhc3MgdG8gdGhlIGl0ZXJhdG9yIGNsYXNzCisJdG8gbWFrZSBpdGVyYXRvciBvZiBkaWZmZXJlbnQgbGlzdCBpbnN0YW5jaWF0aW9uIG5vdCBjb21wYXJhYmxlIGFueW1vcmUuCisKKwkqIHN0bHBvcnQvc3RsL19zbGlzdC5oOiBkaXR0by4KKworMjAwNC0xMC0wNiAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzdGxwb3J0Li4uPgorCisJKiBzdGxwb3J0L3N0bC9fcm9wZS5oLCBfcm9wZS5jOiBDb2RlIHJldmlldywgdXNlIG9mIGdlbmVyYWwgU1RMcG9ydCB0b29scyByYXRoZXIKKwl0aGFuIHNwZWNpZmljIHJvcGUgb25lcy4gVXNlIG9mIGNvbXBpbGUgdGltZSBjaGVja3MgcmF0aGVyIHRoYW4gcnVudGltZS4KKworCSogc3RscG9ydC9zdGwvX2J2ZWN0b3IuaDogZml4IHRvIG1ha2UgdGhlIHZlY3Rvcjxib29sPiBzcGVjaWFsaXphdGlvbiBtb3ZhYmxlCisJdGhhbmtzIGEgS2VsbHkgVGhvbXBzb24gcmVwb3J0LgorCisyMDA0LTEwLTA1ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHN0bHBvcnQuLi4+CisKKwkqIHNyYy9leHBsb3JlL01ha2VmaWxlcy9ubWFrZTogQXBwbGljYXRpb24gb2YgYSBwYXRjaCBmcm9tIE1pY2hhZWwgRmluayB0byBzaW1wbGlmeQorCXRoZSBldmMgbWFrZSBzeXN0ZW0uCisKKwkqIGRvYy9SRUFETUUuZXZjNDogTmV3IHZlcnNpb24gZnJvbSBaZGVuZWsgTmVtZWMuCisKKzIwMDQtMTAtMDQgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogdGVzdC91bml0L3R5cGVfdHJhaXRzX3Rlc3QuY3BwOiBBIG5ldyB0ZXN0IGNhc2UgdG8gY2hlY2sgYmVoYXZpb3Igb2YKKwl0aGUgbnVtZXJvdXMgaGVscGVyIGZ1bmN0aW9ucyBmcm9tIHR5cGVfdHJhaXRzLmggYW5kIHR5cGVfbWFuaXBzLmguCisKKwkqIHN0bHBvcnQvc3RsL3R5cGVfdHJhaXRzLmg6IEZpeCBvZiBzb21lIGJ1Z3MgYW5kIGFkZGl0aW9uIG9mIHRoZSBfX3R5cGVfdHJhaXRzCisJc3BlY2lhbGl6YXRpb25zIG9mIGNvbnN0LCB2b2xhdGlsZSBhbmQgY29uc3Qgdm9sYXRpbGUgbmF0aXZlIHR5cGVzLgorCisJKiBzdGxwb3J0L3N0bC90eXBlX21hbmlwcy5oOiBNb2RpZmljYXRpb24gb2YgdGhlIF9fYm9vbDJ0eXBlIGRlZmF1bHQgdmFsdWUKKwlzbyB0aGF0IGl0IGNvbnNpZGVyIGFueSB2YWx1ZSBhcyB0cnVlIGFuZCBvbmx5IHRoZSAwIHZhbHVlIGZhbHNlLgorCisJKiBzdGxwb3J0L2NvbmZpZy9zdGxfbXN2Yy5oLCBzdGxwb3J0L3N0bC9fY29uZmlnLmg6IE1vZGlmaWNhdGlvbiBvZiB0aGUgU1RMcG9ydAorCXN0ZCBlcXVpdmFsZW50IG5hbWVzcGFjZSB0byBiZSBzdXJlIHRoYXQgdGhlIHVzZXIgcmVidWlsZCBjb3JyZWN0bHkgdGhlIFNUTHBvcnQgCisJbGlicmFyeSB3aGVuIGhlIGZvcmNlcyB0aGUgdXNlIG9mIHRoZSBkeW5hbWljIG9yIHN0YXRpYyBsaWJyYXJ5LgorCisJKiBzcmMvZXhwbG9yZS9NYWtlZmlsZXMvbm1ha2UvbGliL3ZjLWNvbW1vbi5tYWssIGFwcC92Yy1jb21tb24ubWFrOiBDcmVhdGlvbgorCW9mIHRoZSBTVExQX0JVSUxEX0ZPUkNFX1NUQVRJQ19SVU5USU1FIHRoYXQgZm9yY2VzIHVzZSBvZiB0aGUgc3RhdGljIHZlcnNpb24KKwlvZiB0aGUgbmF0aXZlIHJ1bnRpbWUuCisKKwkqIHRlc3QvdW5pdDogZml4IG9mIHNvbWUgdGVzdHMgdGhhdCBmYWlsZWQgdG8gY29tcGlsZSB1c2luZyB0aGUgCisJX1NUTFBfTk9fQU5BQ0hST05JU01TIG1hY3JvLgorCisyMDA0LTA5LTMwICBQZXRyIE92dGNoZW5rb3YgIDxwdHJAaXNsYW5kLi4uPgorCisJKiB0ZXN0L3JlZ3Jlc3Npb246IGNhdGFsb2cgcmVtb3ZlZC0tLWl0IG9ic29sZXRlIGFuZCB1bnN1cHBvcnRlZDsgdXNlCisJdGVzdC91bml0IHRlc3RzIGluc3RlYWQ7IGFsbCB0ZXN0cyBmcm9tIHRlc3QvcmVncmVzc2lvbiB3YXMgbW92ZWQgaW4gdGVzdC91bml0LAorCXNvbWV0aW1lcyBpbiByZWRlc2lnbmVkIGZvcm0uCisKKzIwMDQtMDktMjkgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAc3RscG9ydC4uLj4KKworCSogc3RscG9ydC9zdGwvX3N0cmluZ19pby5jOiBSZW1vdmFsIG9mIHRoZSBuYXRpdmUgbGlicmFyeSBzcGVjaWZpYyBjYWxscyBvZiAKKwl1c2VfZmFjZXQsIG9ubHkgdGhlIFNUTHBvcnQgc3RhbmRhcmQgb25lIGlzIHVzZWQuCisKKwkqIHN0bHBvcnQvc3RsL19hbGxvYy5oLCBfYWxsb2MuYywgc3JjL2RsbF9tYWluLmNwcDogSW1wbGVtZW50YXRpb24gb2YgYSBjbGVhbgorCXByb2Nlc3MgZm9yIHRoZSBub2RlX2FsbG9jIGFsbG9jYXRvci4gVGhpcyBjbGVhbiBpcyBhY3RpdmUgb25seSB3aGVuIAorCV9TVExQX0xFQUtTX1BFREFOVElDIGlzIGRlZmluZWQgYW5kIHlvdSBhcmUgdXNpbmcgU1RMcG9ydCBhcyBhIGR5bmFtaWMKKwlsaWJyYXJ5IHVuZGVyIFdpbjMyLgorCisJKiBzcmMvZXhwbG9yZTogVXBkYXRlcyBvZiBzZXZlcmFsIG1ha2VmaWxlcyB0byBjb25mb3JtIHRvIHRoZSBuZXcgbGlicmFyeQorCWFuZCBiaW5hcnkgbmFtaW5nIGNvbnZlbnRpb24uCisKKwkqIHNyYy9jX2xvY2FsZV93aW4zMi9jX2xvY2FsZV93aW4zMi5jOiBmaXggb2YgdGhlIG1lc3NhZ2UgZmFjZXQgbmFtZSBtYW5hZ2VtZW50CisJdGhhdCB3YXMgZ2VuZXJhdGluZyBhIG1lbW9yeSBsZWFrLgorCisyMDA0LTA5LTI5ICBQZXRyIE92dGNoZW5rb3YgIDxwdHJAaXNsYW5kLi4uPgorCisJKiBzdGxwb3J0L3N0bC9jaGFyX3RyYWl0cy5oOiBXaW5DRSBzZWVtcyBkb24ndCBkZWNsYXJlIG9mZl90OyB0aGFua3MgTWljaGFlbCBGaW5rLgorCisyMDA0LTA5LTI4ICBQZXRyIE92dGNoZW5rb3YgIDxwdHJAaXNsYW5kLi4uPgorCisJKiBSZXBvc2l0b3J5OiBpb3N0cmVhbXMgYW5kIHN0cmluZyB3cmFwcGVyIG1vZGUgcmVtb3ZlZCwgZHVlIHRvIG9uZXMgaGFzCisJYSBsb3Qgb2YgcmVzdHJpY3Rpb25zIGluIHVzYWdlIGFuZCBmcmVxdWVudGx5IGxlYWQgdG8gaGFyZCByZWNvZ25pemVkIHByb2JsZW1zLgorCVRvbm5zIG9mICpfU1RSRUFNUyBtYWNybyByZXBsYWNlZCBieSBfU1RMUF9VU0VfTk9fSU9TVFJFQU1TIG9yIF9TVExQX05PX0lPU1RSRUFNUworCWFzIGNvbmZpZ3VyYXRpb24gbWFjcm87ICpOQVRJVkVfU1RSSU5HIG1hY3JvIHJlbW92ZWQgYnkgdGhlIHNhbWUgcmVhc29ucy4KKworMjAwNC0wOS0yNyAgUGV0ciBPdnRjaGVua292ICA8cHRyQGlzbGFuZC4uLj4KKworCSogdGVzdC91bml0L2djYy5tYWs6IGZpeCBzdGxwb3J0IGxpYnJhcnkgbmFtZSBmb3IgU1RMUF9ERUJVRyBtb2RlIGZvciBTb2xhcmlzLAorCXRoYW5rcyBmb3Igc2VwYXJhdGUgbmFtZXNwYWNlcyBpbiBub3JtYWwgYW5kIFNUTFBfREVCVUcgbW9kZSwgc2VlIHJlY29yZAorCTIwMDQtMDktMTAgYmVsb3cuCisKKzIwMDQtMDktMjQgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNALi4uPgorCisJKiBzdGxwb3J0L2NvbmZpZy9zdGxfZ2NjLmg6IEZpeCBvZiB0aGUgcmVsYXRpdmUgaW5jbHVkZSBwYXRoIHVzZWQgdG8gYWNjZXNzIHRoZQorCW5hdGl2ZSBnY2MgaGVhZGVycy4gQmVmb3JlIHZlcnNpb24gMy40LjAgdGhlIDAgcGF0Y2ggbGV2ZWwgd2FzIG5vdCBwYXJ0IG9mIHRoZSAKKwlpbmNsdWRlCXBhdGguCisKKwkqIHN0bHBvcnQvc3RsL3R5cGVfdHJhaXRzLmgsIF92ZWN0b3IuaCwgX2FsZ29iYXNlLmgsIF9jb25zdHJ1Y3QuaDogUmVtb3ZhbAorCW9mIHRoZSBfX2FjdGlvbl9vbl9tb3ZlIHR5cGUgdHJhaXRzIHJlcGxhY2VkIGJ5IGEgZ2VuZXJhbGl6YXRpb24gb2YgdGhlIAorCWFscmVhZHkgZXhpc3RpbmcgX19tb3ZlX3RyYWl0cy4KKworCSogdGVzdC91bml0L212Y3Rvcl90ZXN0LmNwcDogTmV3IHRlc3QgY2FzZSBmb3IgdGhlIF9fbW92ZV90cmFpdHMgZmVhdHVyZS4KKworMjAwNC0wOS0yNCAgUGV0ciBPdnRjaGVua292ICA8cHRyQGlzbGFuZC4uLj4KKworCSogc3JjL2V4cGxvcmUvTWFrZWZpbGVzL2dtYWtlL3N1bm9zOiAnZXhwbG9yZScgbWFrZXN5c3RlbSBhZG9wdGVkIHRvIHdvcmsKKwl1bmRlciBTb2xhcmlzIHdpdGggR05VIG1ha2UuCisKKwkqIHRlc3QvdW5pdC9nY2MubWFrOiBkaXR0by4KKworCSogc3JjL2V4cGxvcmUvTWFrZWZpbGVzL2dtYWtlL2FwcC9nY2MubWFrOiBkaXR0by4KKworCSogc3JjL2V4cGxvcmUvTWFrZWZpbGVzL2dtYWtlL2xpYi9nY2MubWFrOiBkaXR0by4KKworCSogc3RscG9ydC9jbWF0aDogZml4IHNvbWUgbWF0aCBjYWxscyBmb3IgU29sYXJpcy4KKworCSogdGVzdC91bml0L2xpc3RfdGVzdC5jcHA6IGFkZCBpbGx1c3RyYXRpb24gZm9yIGxpc3QgaXRlcmF0b3IvcmV2ZXJzZV9pdGVyYXRvciBxdWVzdGlvbnMuCisKKwkqIHNyYy9leHBsb3JlL01ha2VmaWxlcy9nbWFrZS91bml4L2xpYi5tYWs6IG1vdmVkIGZyb20gbGludXgvbGliLm1haywgYXMKKwljb21tb24gcnVsZXMgZm9yIGFsbCAqbml4ZXMuCisKKwkqIHNyYy9leHBsb3JlL01ha2VmaWxlcy9nbWFrZS9saW51eC9saWIubWFrOiB1c2UgY29tbW9uIGZvciBhbGwgKm5peGVzIHJ1bGVzCisJaW4gdW5peC9saWIubWFrLgorCisJKiBzcmMvZXhwbG9yZS9NYWtlZmlsZXMvZ21ha2UvZnJlZWJzZC9saWIubWFrOiBkaXR0by4KKworCSogc3JjL2V4cGxvcmUvTWFrZWZpbGVzL2dtYWtlL29wZW5ic2QvbGliLm1hazogZGl0dG8uCisKKwkqIHNyYy9leHBsb3JlL01ha2VmaWxlcy9nbWFrZS9zdW5vcy9saWIubWFrOiBkaXR0by4KKworCSogc3JjL2V4cGxvcmUvTWFrZWZpbGVzL2dtYWtlL3VuaXgvbGliLm1haywgdGVzdC91bml0L2djYy5tYWs6IGNoYW5nZWQgbGlicmFyeSBuYW1lOworCWxpYnJhcmllcyBub3cgbmFtZWQgYXMgbGlic3RscG9ydCwgbGlic3RscG9ydGcsIGxpYnN0bHBvcnRzdGxnIGZvciBvcHRpbWl6ZWQsIHdpdGgKKwlkZWJ1ZyBzeW1ib2xzLCBhbmQgd2l0aCBkZWJ1ZyBzeW1ib2xzIGFuZCBfU1RMUF9ERUJVRyBtb2RlIGxpYnJhcmllcyByZXNwZWN0aXZseS4KKworMjAwNC0wOS0yMSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0AuLi4+CisKKwkqIHN0bHBvcnQvc3RsL2RlYnVnOiBNb2RpZmljYXRpb24gb2YgdGhlIF9fY2hlY2tfcmFuZ2UgY2xhc3MgaW4gdGhlIG1vcmUgZ2VuZXJhbAorCV9fY2hlY2tfY29uc3RydWN0LiBOb3cgaXQgYWxzbyBjaGVja3MgZm9yIG51bGwgcG9pbnRlcnMgaW4gdGhlIHN0cmluZyBpbnRlcmZhY2UuCisKKwkqIHNyYy9leHBsb3JlOiBBZG9wdGlvbiBvZiB0aGUgbmV3IGxpYnJhcnkgbmFtaW5nIGNvbnZlbnRpb24gZm9yIGFsbCBNaWNyb3NvZnQKKwljb21waWxlcnMgdGhhbmtzIE1pY2hhZWwgRmluaworCisyMDA0LTA5LTIwICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQC4uLj4KKworCSogc3JjL2V4cGxvcmUvTWFrZWZpbGVzL2dtYWtlL2N5Z3dpbiwgbWluZ3c6IEJ1aWxkIGNvbmZpZ3VyYXRpb24gZmlsZXMgbWVyZ2VzCisJd2l0aGluIGEgc2luZ2xlIGJ1aWxkIHN5c3RlbTogY3lnbWluZy4gRnV0dXJlIHBvcnRhZ2Ugb2YgU1RMcG9ydCBmb3IgY29tcGlsZXJzCisJdXNpbmcgdGhlIEdOVSB0b29scyB3aWxsIGJlIGF2YWlsYWJsZSBmcm9tIGJvdGggc3lzdGVtcy4gUmVtb3ZhbCBvZiB0aGUgdmM2IGJ1aWxkCisJdW5kZXIgY3lnd2luLCBmb3IgbW9uby1wbGF0Zm9ybSBjb21waWxlcnMgd2Ugc3VwcG9ydCBvbmx5IG9uZSBidWlsZCBzeXN0ZW0uCisKKwkqIHN0bHBvcnQvc3RsL192ZWN0b3IuaDogTW9kaWZpY2F0aW9uIG9mIHRoZSBkZXN0cnVjdG9yIGltcGxlbWVudGF0aW9uIHRvIGRlc3Ryb3llZAorCW9iamVjdCBpbnN0YW5jZXMgaW4gYSByZXZlcnNlIG9yZGVyIHRha2luZyBhZHZhbnRhZ2Ugb2YgdGhlIHdheSBlbGVtZW50cyBhcmUKKwlub3JtYWx5IGFkZGVkIHRvIHRoaXMgY29udGFpbmVyLgorCisyMDA0LTA5LTE2ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQC4uLj4KKworCSogdGVzdC91bml0L2NwcHVuaXQvY3BwdW5pdF9taW5pLmgsIGNwcHVuaXRfcHJveHkuaDogQWRhcHRhdGlvbiBvZiB0aGUgQ1BQVU5JVAorCWZyYW1ld29yayB0byB0YWtlIGNhcmUgb2YgdGhlIGV4Y2VwdGlvbiBhcyBmYWlsdXJlcyB0aGFua3MgWmRlbmVrIE5lbWVjCisKKwkqIHN0bHBvcnQvY29uZmlnL3N0bF9tc3ZjLmgsIHN0bF9iYy5oLCBzdGxfbXdlcmtzLmgsIHN0bHBvcnQvc3RsX3VzZXJfY29uZmlnLmg6CisJUmVtb3ZhbCBvZiB0aGUgbm9uIGludHVpdGl2ZSBhbmQgZGlmZmljdWx0IHRvIG1haW50YWluIGF1dG9tYXRpYyBsaW5raW5nIGZlYXR1cmUuCisKKwkqIEZpeGluZyBvZiB0aGUgbG9jYWxlIGltcGxlbWVudGF0aW9uIG1lY2FuaXNtLiBDbGFzc2ljIGxvY2FsZSBpbXBsZW1lbnRhdGlvbiBpcworCWFsc28gbWFuYWdlZCBieSBhIHJlZmVyZW5jZSBjb3VudGVyIHRvIGJlIHN1cmUgd2hlbiBpdCBpcyBwb3NzaWJsZSB0byByZWxlYXNlCisJdGhlIGFzc29jaWF0ZWQgcmVzc291cmNlcy4gRml4IG9mIGEgbWlzc2luZyBsb2NhbGUgaW1wbCByZWYgY291bnRlciBkZWNyZW1lbnQKKwlpbiB0aGUgdGVtcGxhdGUgbG9jYWxlIGNvbnN0cnVjdG9yIHRha2luZyBhIGZhY2V0LCBpdCB3YXMgYSBwb3NzaWJsZSBzb3VyY2Ugb2YKKwltZW1vcnkgbGVhayAuIEFkZGl0aW9uIG9mIGEgc3RhdGljIG9iamVjdCB3aXRoaW4gbG9jYWxlX2ltcGwuY3BwIGluIAorCV9TVExQX0xFQUtTX1BFREFOVElDIG1vZGUgdG8gZGVjcmVtZW50IHRoZSBnbG9iYWwgbG9jYWxlIGltcGwgcmVmIGNvdW50ZXIgd2hlbiAKKwlTVExwb3J0IGxpYnJhcnkgaXMgdW5sb2FkZWQuIEFkZGl0aW9uIG9mIGFsbCB0aGUgbWlzc2luZyBjbGFzc2ljIGxvY2FsZSBmYWNldHMKKwlkZXN0cnVjdG9yIGluIGZyZWVfY2xhc3NpY19sb2NhbGUuCisKKwkqIHNyYy9sb2NhbGVfY2F0YWxvZy5jcHA6IFRoZSBsb2NhbGUgYnkgbmFtZSBjb25zdHJ1Y3RvciBjaGVja3MgdGhlICJDIiBuYW1lCisJdG8gc2ltcGx5IGNvcHkgKGluY3JlbWVudCB0aGUgcmVmIGNvdW50ZXIpIHRoZSBjbGFzc2ljIGxvY2FsZSBpbXBsZW1lbnRhdGlvbiAKKwlyYXRoZXIgdGhhbiBpbnN0YW5jaWF0aW5nIGEgbmV3IG9uZS4KKworMjAwNC0wOS0xNSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0AuLi4+CisKKwkqIHN0bHBvcnQvc3RsL19saXN0LmM6IE1vZGlmaWNhdGlvbiBvZiB0aGUgX1Nfc29ydCBpbXBsZW1lbnRhdGlvbiwgdGhlIF9fY2FycnkgCisJbGlzdCBpbnN0YW5jZSBpcyBjcmVhdGVkIHVzaW5nIHRoZSBfX3RoYXQgYWxsb2NhdG9yIGluc3RhbmNlIGNvcHkgdG8gYmUgbW9yZQorCWFsbG9jYXRvciBmcmllbmRseS4KKworMjAwNC0wOS0xMSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0AuLi4+CisKKwkqIHN0bHBvcnQvY29uZmlnL3N0bF9pbnRlbC5oOiBDb25maWd1cmF0aW9uIHVwZGF0ZSBmb3IgV2luMzIgSW50ZWwgOC4wIAorCWNvbXBpbGVyIHRoYW5rcyBDaGFybGVtYWduZS4KKworMjAwNC0wOS0xMCAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0AuLi4+CisKKwkqIHN0bHBvcnQvc3RsL19jb25maWcuaDogVGhlIG5ldyBvZmZpY2lhbCBuYW1lc3BhY2UgaXMgbm93IHN0bHBfc3RkLiBfU1RMIGlzCisJanVzdCBhbiBhbGlhcy4gU1RMUE9SVCBtYWNybyBzdGlsbCBjb250YWlucyB0aGUgU1RMcG9ydCBzdGQgbmFtZXNwYWNlIGVxdWl2YWxlbnQuCisJTW9yZW92ZXIgaW4gX1NUTFBfREVCVUcgbW9kZSwgd2hpY2ggaXMgbm90IGJpbmFyeSBjb21wYXRpYmxlIHdpdGggdGhlIHJlbGVhc2UKKwlvciBkZWJ1ZyBtb2RlLCB0aGUgbmFtZXNwYWNlIGlzIHN0bHBkX3N0ZCB0byBnZW5lcmF0ZSBsaW5rIGVycm9yIHJhdGhlcgorCXRoYW4gcnVudGltZSBjcmFzaC4KKworMjAwNC0wOS0wOSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0AuLi4+CisKKwkqIHN0bHBvcnQvc3RsL19jb25maWcuaDogX1NUTFBfRE9OVF9VU0VfTkVTVEVEX1RDTEFTU19USFJPVUdIVF9UUEFSQU0gCisJcmVuYW1lZCB0byB0aGUgbW9yZSBpbnR1aXRpdmUgX1NUTFBfRE9OVF9TVVBQT1JUX1JFQklORF9NRU1CRVJfVEVNUExBVEUuCisKKwkqIHN0bHBvcnQvc3RsL19jb25maWcuaDogSW50cm9kdWN0aW9uIG9mIGEgbmV3IG5hbWVzcGFjZSBzdGxwX3ByaXZhdGUKKwlkZWZpbmVkIGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlLiBFdmVyeXRoaW5nIHRoYXQgaXMgU1RMcG9ydCBpbXBsZW1lbnRhdGlvbgorCWRldGFpbHMgc2hvdWxkIGJlIGluIHRoaXMgbmFtZXNwYWNlIHRvIGF2b2lkIHBvbHV0aW9uIG9mIHRoZSBzdGQgbmFtZXNwYWNlLgorCisJKiBzdGxwb3J0L3N0bC9faXRlcmF0b3JfYmFzZS5oOiBNb2RpZmljYXRpb24gb2YgdGhlIG1hY3JvIHVzZWQgdG8gY3JlYXRlCisJaXRlcmF0b3IgdHJhaXRzIGZvciBhbGwgdHJlZSBhbmQgaGFzaHRhYmxlIGJhc2VkIGNvbnRhaW5lcnMgdG8gbW92ZSBpdCBpbgorCXRoZSBzdGxwX3ByaXZhdGUgbmFtZXNwYWNlIHJhdGhlciB0aGFuIGRlZmluaW5nIGl0IGFzIG5lc3RlZCBzdHJ1Y3QsIGxpbWl0cworCXRoZSBzeW1ib2wgc2l6ZS4KKworMjAwNC0wOS0wOCAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0AuLi4+CisKKwkqIHRlc3QvdW5pdC9mc3RyZWFtX3Rlc3QuY3BwOiByZXN0YXVyYXRpb24gb2YgdGhlIHRlc3QgYWRkZWQgYnkgUGV0cgorCXRoZSAyMDA0LTA5LTAzLCBpdCBpcyBmaW5hbHkgYSBkaWZmZXJlbnQgdGVzdCBmcm9tIHRoZSBvbmUgaW4gc3N0cmVhbV90ZXN0LmNwcC4KKwlTb21lIG1vcmUgY2hlY2tzIGhhdmUgYWxzbyBiZWVuIGludGVncmF0ZWQuCisKKwkqIHN0bHBvcnQvc3RsL19vc3RyZWFtLmM6IE5ldyBmaXggb2YgdGhlIF9NX3VuYnVmZnVyZWRfY29weSBtZXRob2QgdGhhdCB3YXMKKwlzdGlsbCBidWdnZWQgaW4gY2FzZSBvZiBhIHRocm93aW5nIG91dHB1dCBzdHJlYW1idWYsIGRldGVjdGVkIHRoYW5rcyB0byB0aGUKKwl0ZXN0IGNhc2UuCisKKzIwMDQtMDktMDcgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNALi4uPgorCisJKiBzdGxwb3J0L2NvbmZpZy9zdGxfbXN2Yy5oOiBBZGQgZGVmaW5lcyBvZiB0aGUgX1NUTFBfVVNFX1NUQVRJQ19MSUIKKwlvciBfU1RMUF9VU0VfRFlOQU1JQ19MSUIgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IGtpbmQgb2YgYnVpbGQuCisKKwkqIHN0bHBvcnQvc3RsL19zdHJlYW1idWYuaCwgX3N0cmVhbWJ1Zy5jOiBGaXggYW4gdW5yZXNvbHZlZCBzeW1ib2wgCisJcHJvYmxlbSBmb3IgTVNWQzYgKGFuZCBiZWZvcmU/KSB3aGVuIFNUTHBvcnQgaXMgdXNlZCBhcyBhIHN0YXRpYyBsaWJyYXJ5LgorCisyMDA0LTA5LTA2ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQC4uLj4KKworCSogdGVzdC91bml0L25tYWtlLWV2Yy1jb21tb24ubWFrOiBVc2Ugb2YgdGhlIGR5bmFtaWMgcnVudGltZSBmb3IgdGhlCisJKi1zaGFyZWQgcnVsZXMgcmF0aGVyIHRoYW4gdGhlIHByZXZpb3VzIHN0YXRpYyB0aGFua3MgTWljaGFlbCBGaW5rLgorCisJKiB0ZXN0L3VuaXQvbm1ha2UtZXZjKi5tYWs6IGVuZCBvZiBidWlsZCBjb2RlIGZhY3RvcmlzYXRpb24sIHVzZSBvZiAKKwlubWFrZS1ldmMtY29tbW9uLm1hayB3aXRoaW4gYWxsIG1ha2VmaWxlcyB0aGFua3MgTWljaGFlbCBGaW5rLgorCisJKiB0ZXN0L3VuaXQvbG9jYWxlX3Rlc3QuY3BwOiBBcHBsaWNhdGlvbiBvZiBhIHBhdGNoIGZyb20gTWljaGFlbCBGaW5rCisJdG8gY2hlY2sgdGhlICJDIiBsb2NhbGUgb24gYWxsIHBsYXRmb3Jtcy4gRml4IG9mIHRoZSBtb25leV9nZXRfcHV0IHRlc3QKKwljYXNlIGZvciB0aGUgIkMiIGxvY2FsZS4KKworCSogdGVzdC91bml0L2FsbG9jYXRvcl90ZXN0LmNwcDogbmV3IHRlc3QgY2FzZSBmb3Igc3RkOjphbGxvY2F0b3IgY2hlY2tzLgorCisyMDA0LTA5LTA1ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQC4uLj4KKworCSogc3RscG9ydC9zdGwvX3N0cmluZ19oYXNoLmg6IFBlcmZvcm1hbmNlIGltcHJvdmVtZW50LCBtdWx0aXBsaWNhdGlvbgorCXJlcGxhY2VkIGJ5IHNoaWZ0IG9wZXJhdGlvbnMgdGhhbmtzIEdyZWcgUy4KKworCSogc3RscG9ydC9jb25maWcvc3RsX3dpbmNlXzQuaDogcmVtb3ZlZCwgbmV2ZXIgdXNlZCwgc3RsX2V2Yy5oIGhhcyBiZWVuIAorCXByZWZlcmVkLgorCisJKiB0ZXN0L3VuaXQvc3RyaW5nX3Rlc3QuY3BwOiBhZGRpdGlvbiBvZiBhIG5ldyB0ZXN0IHNob3J0X3N0cmluZ19vcHRpbV9idWcKKwl0byBjaGVjayBmb3IgYSBjb21waWxlciBidWdzIG1ha2luZyB0aGUgc2hvcnQgc3RyaW5nIG9wdGltIGludmFsaWQgdGhhbmtzCisJTWljaGFlbCBGaW5rLgorCisJKiBzdGxwb3J0L2NvbmZpZy9zdGxfZXZjLmg6IERlYWN0aXZhdGlvbiBvZiB0aGUgc2hvcnQgc3RyaW5nIG9wdGltaXphdGlvbgorCWJlY2F1c2Ugb2YgYSBjb21waWxlciBidWcgdGhhbmtzIE1pY2hhZWwgRmluay4KKworCSogc3JjL2V4cGxvcmU6IGZhY3RvcmlzYXRpb24gb2YgdGhlIGV2YyBidWlsZCBtYWtlZmlsZXMgdGhhbmtzIE1pY2hhZWwgRmluay4KKworCSogc3JjL2V4cGxvcmUvTWFrZWZpbGVzL25tYWtlL2xpYi9jbGVhbi5tYWssIG1hY3JvLm1hazogQWRkaXRpb24gb2Ygc29tZQorCWZpbGUgY2xlYW4gdXAgZm9yIHRoZSBjbG9iYmVyIHJ1bGUgdGhhbmtzIE1pY2hhZWwgRmluay4KKworMjAwNC0wOS0wMyAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0AuLi4+CisKKwkqIHRlc3QvdW5pdC9mc3RyZWFtX3Rlc3QuY3BwLCBzc3RyZWFtX3Rlc3QuY3BwOiBNb3ZlIG9mIHRoZSB0ZXN0IGZvciB0aGUKKwlpbmZpbml0ZSBsb29wIGZyb20gRnN0cmVhbVRlc3QgdGVzdCBjYXNlIHRvIFNzdHJlYW1UZXN0LCBhZGRpdGlvbiBvZiBzb21lCisJY2hlY2tzLgorCisJKiB0ZXN0L3VuaXQvZnVsbF9zdHJlYW1idWYuaDogc3RyZWFtYnVmIGltcGxlbWVudGF0aW9uIHNpbXVsYXRpbmcgZnVsbAorCW91dHB1dC4KKworCSogc3RscG9ydC9leGNlcHRpb246IHJlc3RhdXJhdGlvbiBvZiBzb21lIG1vZGlmaWNhdGlvbiByZW1vdmVkIGFmdGVyIHRoZQorCXJvbGxiYWNrIG9mIHRoZSAyMDA0LTA5LTAxLgorCisJKiBzdGxwb3J0L2NvbmZpZy9zdGxfZ2NjLmg6IGhvbW9nZW5laWZpY2F0aW9uIG9mIHRoZSBjb2Rpbmcgc3RhbmRhcmQgdXNlZAorCXdpdGhpbiBTVExwb3J0LCAyIHNwYWNlcyBpbmRlbnRhdGlvbnMgZXZlbiBmb3IgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMuCisJRG9pbmcgc28sIGRpc2NvdmVyZWQgYSB3ZWlyZCBjb25maWd1cmF0aW9uIGZvciBNYWMgT1MgcGxhdGZvcm0gKF9fQVBQTEVfXykKKwljb25jZXJuaW5nIHRoZSBfU1RMUF9OQVRJVkVfSU5DTFVERV9QQVRIIG1hY3JvIGRlZmluaXRpb24sIGZpeGVkLgorCisJKiBzdGxwb3J0L3N0bC9jb25maWcvc3RsXyoubWFrOiByZW1vdmFsIG9mIGFsbCByZWZlcmVuY2VzIHRvIHRoZSAKKwlfU1RMUF9SRURFRklORURfU1REIG1hY3JvIGFzIGl0IGlzIG5vdyB0aGUgZGVmYXVsdCBhbmQgb25seSB3YXkgU1RMcG9ydCAKKwl1c2UgdG8gcmVwbGFjZSBuYXRpdmUgU3RhbmRhcmQgbGlicmFyeS4KKworCSogdGVzdC91bml0L25tYWtlLXZjLWNvbW1vbi5tYWs6IGFkZCBpbmNsdXNpb24gb2YgdGhlIHZjX3dhcm5pbmdfZGlzYWJsZS5oCisJZmlsZSB0byBhdm9pZCB3YXJuaW5ncyBkdXJpbmcgYnVpbGQgcHJvY2VzcyB0aGFua3MgTWljaGFlbCBGaW5rLgorCisyMDA0LTA5LTAzICBQZXRyIE92dGNoZW5rb3YgIDxwdHJASXNsYW5kLi4uPgorCisJKiBzdGxwb3J0L3N0bC9fb3N0cmVhbS5jOiByZW1vdmVkIGluZmluaXRlIGxvb3AgaW4gY2FzZSB3aGVuIG91dGdvaW5nIHN0cmVhbQorCWNhbid0IGFjY2VwdCBtb3JlIGNoYXJzLiBUaGFua3MgRGFuaWVsIFdoaXRlLCBVbHJpY2ggRWNraGFyZHQsIEZyYW5jb2lzIER1bW9udC4KKworCSogdGVzdC91bml0L2ZzdHJlYW1fdGVzdC5jcHA6IHRlc3QgZm9yIHByb2JsZW0gYWJvdmUuIFRoYW5rcyBVbHJpY2ggRWNraGFyZHQuCisKKzIwMDQtMDktMDIgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNALi4uPgorCisJKiBzdGxwb3J0L2V4Y2VwdGlvbiwgc3RscG9ydC9zdGwvX3NpdGVfY29uZmlnLmgsIHRlc3QvdW5pdC9leGNlcHRpb25fdGVzdC5jcHA6CisJQ3JlYXRpb24gb2YgdGhlIF9TVExQX05PX1VORVhQRUNURURfRVhDRVBUX1NVUFBPUlQgbWFjcm8gdG8gc2lnbmFsIHN1cHBvcnQgb2YKKwl0aGUgdW5leHBlY3RlZCBleGNlcHRpb24gbWVjYW5pc20uIFJlbGF0ZWQgdHlwZS9mdW5jdGlvbiBhcmUgb25seSBicm91Z2h0IHRvIHRoZQorCVNUTHBvcnQgbmFtZXNwYWNlIGlmIGNvcnJlY3RseSBzdXBwb3J0ZWQsIGV4Y2VwdGlvbl90ZXN0LmNwcCBjaGVjayB0aGF0LgorCisJKiBOZXcgbW9kaWZpY2F0aW9uIG9mIHRoZSBfUmJfdHJlZSBhbmQgX0hhc2h0YWJsZSBhc3NvY2lhdGVkIGl0ZXJhdG9yIHN0cnVjdHMuCisJUmVtb3ZhbCBvZiB0aGUgY29udGFpbmVyX3R5cGUgcGFzcyB0aHJvdWdoIHRoZSBpdGVyYXRvciB0cmFpdHM7IGl0ZXJhdG9yIHRyYWl0cworCWlzIHRoZSB0eXBlIHRoYXQgd2lsbCBtYWtlIGVhY2ggZGVyaXZlZCBjb250YWluZXIgaXRlcmF0b3IgdHlwZSByZWFsIGRpZmZlcmVudAorCXR5cGUgbWFraW5nIHRoZW0gdW5jb21wYXJhYmxlLgorCisJKiBzdGxwb3J0L2N0eXBlLmg6IHJvbGxiYWNrIG9mIHRoZSBhYm92ZSByb2xsYmFjayA7LSkgb25seSBvZiBjb3Vyc2UgZm9yIHRoZSAKKwlXaW4gQ0UgY29kZSBmaXggdGhhdCB3YXMgcGFydCBvZiB0aGUgcHJldmlvdXMgY29tbWl0bWVudC4KKworMjAwNC0wOS0wMSAgUGV0ciBPdnRjaGVua292ICA8cHRyQElzbGFuZC4uLj4KKworCSogUm9sbGJhY2sgaW5jbHVkZSBzY2hlbWE6IGNvZGUgaXMgYnJva2VuLgorCisyMDA0LTA4LTMxICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQC4uLj4KKworCSogX1NUTFBfSU5DT01QTEVURV9FWENFUFRJT05fSEVBREVSIHJlcGxhY2UgYnkgdGhlIG1vcmUgaW50dWl0aXZlCisJX1NUTFBfTk9fVU5DQVVHSFRfRVhDRVBUX1NVUFBPUlQgbWFjcm8uCisKKwkqIE1vZGlmaWNhdGlvbiBvZiB0aGUgaW5jbHVkZSBzY2hlbWEgb2YgYWxsIHB1YmxpYyBoZWFkZXJzIGluIHN0bHBvcnQgZm9sZGVyCisJdGhhdCBuZWVkIHRvIGJlIHJlZW50cmFudC4gTm93IHRob3NlIGZpbGVzIGFyZSBmdWxseSBndWFyZGVkIGFuZCB0aGUgc3BlY2lmaWMKKwlTVExwb3J0IGNvZGUgaXMgb25seSBpbmNsdWRlZCBvbmNlIGF0IHRoZSBlbmQgb2YgdGhlIGluY2x1c2lvbiwgdGhlIHJlZW50cmFuY3kKKwlvbmx5IGNvbmNlcm4gaW5jbHVzaW9uIG9mIHRoZSBuYXRpdmUgaGVhZGVycy4KKworMjAwNC0wOC0zMCAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0AuLi4+CisKKwkqIHN0bHBvcnQvc3RsL19kZXF1ZS5jOiBGaXggb2YgYSBwc2V1ZG8gJ3VuaW5pdGlhbGl6ZWQgdmFyaWFibGUgdXNlZCcgdGhhbmtzIAorCU9saXZlciBTdG9lbmViZXJnLgorCisyMDA0LTA4LTI3ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQC4uLj4KKworCSogLk5ldCAyMDAyIChWQzcwKSBwb3J0YWdlLgorCisyMDA0LTA4LTI3ICBQZXRyIE92dGNoZW5rb3YgIDxwdHJASXNsYW5kLi4uPgorCisJKiBzcmMvZXhwbG9yZS9NYWtlZmlsZXMvZ21ha2UvZ2NjLm1haywgYXBwL2djYy5tYWssIGxpYi9nY2MubWFrOiBidWdneSBDKysKKwlsYW5ndWFnZSBzdXBwb3J0IGluIGxpYnN1cGMrKyBpbiBnY2MgYmVmb3JlIDMuMyBub3QgYWxsb3cgdG8gdXNlIGl0OworCWxpbmsgd2l0aCBsaWJzdGRjKysgaW5zdGVhZC4KKworCSogc3RscG9ydC9jb25maWcvc3RsX2ljYy5oOiBmaXggZmVhdHVyZXMgZm9yIGljYyA3LjE7IGZpeCBmZWF0dXJlcyBmb3IgTGludXgKKwlwbGF0Zm9ybXMuCisKKzIwMDQtMDgtMjQgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNALi4uPgorCisJKiBzdGxwb3J0L2NvbmZpZy9zdGxfZ2NjLmgsIHN0bF9tc3ZjLmg6IGZpeGluZyBvZiBjb25maWd1cmF0aW9uIGNvbmNlcm5pbmcKKwl1bmNhdWdodF9leGNlcHRpb24gYW5kIGV4Y2VwdGlvbiBoYW5kbGluZyBpbiBnZW5lcmFsIHRoYW5rcyBKb2huIFJvYmVydHMuCisKKwkqIHN0bHBvcnQvc3RsL190cmVlLmgsIF90cmVlLmM6IE1vZGlmaWNhdGlvbiBvZiB0aGUgX1JiX3RyZWVfaXRlcmF0b3IJc3RydWN0CisJdG8gYmUgYWJsZSB0byBkaXN0aWd1aXNoIGl0ZXJhdG9yIHR5cGVzIGZyb20gZGlmZmVyZW50IHRyZWUgYmFzZWQgY29udGFpbmVycworCVJlbW92YWwgb2YgdGhlID09IGFuZCAhPSBtZW1iZXIgb3BlcmF0b3JzIG9mIHRoZSBfUmJfdHJlZV9iYXNlX2l0ZXJhdG9yIHN0cnVjdAorCXJlcGxhY2VkIGJ5IGdsb2JhbCBvcGVyYXRvcnMgdGFraW5nIF9SYl90cmVlX2l0ZXJhdG9yIGFzIHBhcmFtZXRlcnMgYW5kIGNoZWNraW5nCisJdGhhdCB0aGUgaXRlcmF0b3JzIGFyZSBvZiB0aGUgc2FtZSBjb250YWluZXIgdHlwZSB0aGFua3MgSGFyb29uIE5hc3NpcnkgcmVwb3J0LgorCQorCSogc3RscG9ydC9zdGwvX21hcC5oLCBfc2V0Lmg6IE1vZGlmaWNhdGlvbiBvZiB0aGUgaXRlcmF0b3IgdHJhaXRzIHVzZWQgdG8gCisJaW5zdGFuY2lhdGUgdGhlIF9SYl90cmVlIGNsYXNzLgorCQorCSogc3RscG9ydC9zdGwvX2hhc2h0YWJsZS5oLCBfaGFzaHRhYmxlLmMsIF9oYXNoX3NldC5oLCBfaGFzaF9tYXAuaDogU2ltaWxhcgorCW1vZGlmaWNhdGlvbnMgdG8gdGhlIHByZXZpb3VzIG9uZSBpbiBvcmRlciB0byBtYWtlIGZvciBpbnN0YW5jZSB0aGUgaXRlcmF0b3IKKwlmcm9tIGhhc2hfbWFwIGFuZCBoYXNoX211bHRpbWFwIG5vdCBjb21wYXJhYmxlIGFueW1vcmUuCisJCisJKiBzdGxwb3J0L2NvbmZpZy9zdGxfd2luY2UuaCwgc3RscG9ydC9jdHlwZS5oOiBNb3ZlIG9mIHRoZSBpc3NwYWNlIEMgZnVuY3Rpb24KKwlXaW5kb3dzIENFIHNwZWNpZmljIGNvZGUgZnJvbSB0aGUgY29uZmlnIGZpbGUgdG8gdGhlIGN0eXBlLmggZmlsZS4gVGhpcyBmaXgKKwl3aWxsIGFsc28gYXBwbHkgdG8gRW1iZWRkZWQgQysrIC5OZXQgdGhhbmtzIERpcmsgcmVwb3J0LgorCisyMDA0LTA4LTIzICBQZXRyIE92dGNoZW5rb3YgIDxwdHJASXNsYW5kLi4uPgorCisJKiB0ZXN0L3VuaXQvY3BwdW5pdC9jcHB1bml0X3Byb3h5LmgsIHRlc3QvaW5pdC9nY2MubWFrOiBDUFBVTklUX01JTkkgcmVtb3ZlZC4KKworCSogc3JjL251bV9nZXRfZmxvYXQuY3BwOiBzdWdnZXN0aW9uIHRvIGZpeCBwcm9ibGVtIHdpdGggZmxvYXQgaW5wdXQgZm9yIGdjYyAzLjQueAorCXdpdGggb3B0aW1pemF0aW9uIGZsYWcuCisKKwkqIHRlc3QvdW5pdC9mbG9hdGlvX3Rlc3QuY3BwOiB0ZXN0IGZvciBpbmZpbml0eSBhbmQgbmVhcgorCisJKiBzcmMvZXhwbG9yZS9NYWtlZmlsZXMvZ21ha2UvZ2NjLm1haywgYXBwL2djYy5tYWssIGxpYi9nY2MubWFrOiBmaXggZGV0ZWN0aW9uIG9mCisJZ2NjIHZlcnNpb247IGdjYyBiZWZvcmUgMy54IGhhZCBsaWJnY2MuYSB0aGF0IGNvbnRhaW5zIHNvbWUgbGFuZ3VhZ2Ugc3VwcG9ydCwKKwlzbyBsaW5rIHdpdGggaXQgaW4gY2FzZSB3aGVuIHdlIGF2b2lkIGxpbmsgd2l0aCBsaWJzdGQrKy4gVGhpcyBoYXMgcmVsYXRpb24gb25seQorCWZvciBsaW51eCBzeXN0ZW1zLgorCisyMDA0LTA4LTE5ICBQZXRyIE92dGNoZW5rb3YgIDxwdHJASXNsYW5kLi4uPgorCisJKiBzcmMvZXhwbG9yZS9jb25maWd1cmUuYmF0OiBzZXR0aW5nIHVwIGNvbXBpbGluZyBTVExwb3J0IHVuZGVyIFdpbmRvd3MuCisJQ29udHJpYnV0aW9uIGJ5IE1pY2hhZWwgRmluay4KKworMjAwNC0wOC0xMyAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0AuLi4+CisKKwkqIHRlc3QvdW5pdC9nY2MubWFrOiBBZGRpdGlvbiBvZiB0aGUgX1NUTFBfTk9fQ1VTVE9NX0lPIGRlZmluZSB0byBtYWtlIHRlc3QKKwlidWlsZCBmYXN0ZXIuCisKKwkqIHN0bHBvcnQvc3RsL19saW1pdHMuaCwgX2xpbWl0cy5jOiBNb2RpZmljYXRpb24gb2YgdGhlIF9MaW1HIGNsYXNzIGRlZmluaXRpb24uCisJUmVtb3ZhbCBvZiB0aGUgc3RhdGljIHZhcmlhYmxlcywgcmVwbGFjZWQgYnkgc3RhdGljIG1ldGhvZCBoYXZpbmcgdGhlIHNhbWUgcm9sZQorCWJ1dCBtb3JlIHBvcnRhYmxlLiBGaXggbGluayBwcm9ibGVtIHdpdGggTVNWQyBjb21waWxlcnMgZmFtaWx5IHdoZW4gdXNpbmcgU1RMcG9ydAorCXN0YXRpYyBsaWJyYXJ5LgorCisJKiBzdGxwb3J0L3N0bC9fYml0c2V0LmgsIF9iaXRzZXQuYzogRGl0dG8gZm9yIHRoZSBfQnNfRyBjbGFzcy4KKworCSogc3RscG9ydC9zdGwvX2hhc2h0YWJsZS5oLCBfaGFzaHRhYmxlLmM6IERpdHRvIGZvciB0aGUgX1N0bF9wcmltZSBjbGFzcy4KKworCSogc3JjL2RsbF9tYWluLmNwcDogdGhhbmtzIHRvIHRoZSBwcmV2aW91cyBtb2RpZmljYXRpb24sIHJlbW92YWwgb2YgdGhlIAorCWNvbmNlcm5lZCBjb2RlIHdpdGhpbiBmb3JjZV9saW5rLgorCisyMDA0LTA4LTEzICBQZXRyIE92dGNoZW5rb3YgIDxwdHJASXNsYW5kLi4uPgorCisJKiB0ZXN0L3VuaXQvY3BwdW5pdC9jcHB1bml0X21pbmkuaCwgZmlsZV9yZXBvcnRlci5oLCB0ZXN0X21haW4uY3BwOgorCWFkZCBmdW5jdGlvbiB0byBwcmludCBtZXNzOyByZW1vdmUgZGVmIG9mIENQUFVOSVRfTUlOSSwgbm90IHJlcXVpcmVkOyBhZGQgY29uc3QKKwlxdWFsaWZpZXJzLgorCisJKiB0ZXN0L3VuaXQvbG9jYWxlX3Rlc3QuY3BwOiBwcmludCBjaGVja2VkIGxvY2FsZSBuYW1lOyByZXN0b3JlIHRhYmxlIHdpdGggZm9ybWF0CisJc3ltYm9scy0tcGFydGlhbGx5IHJvbGxiYWNrIGNoYW5nZXMgMjAwNC0wNy0yOTsgYWRkIHRlc3QgZm9yIHBvc3NpYmxlIGxvY2FsZQorCWluaXQvZGVpbml0IHByb2JsZW0tLS1JIGRvbid0IHNlZSBwcm9ibGVtLiBUZXN0IGluc3BpcmVkIGJ5IEFsZXggS29zaWxpbi4KKworMjAwNC0wOC0xMSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0AuLi4+CisKKwkqIHNyYy9leHBsb3JlL01ha2VmaWxlcy9ubWFrZTogZXh0ZW5zaW9uIG9mIHRoZSBuZXcgYnVpbGQgc3lzdGVtIGZvciBWQy5OZXQKKwkyMDA1IChWQzgpLgorCisJKiBzcmMvZXhwbG9yZS9NYWtlZmlsZXMvbm1ha2UvYXBwOiByZXN0YXVyYXRpb24gb2YgdGhlIGRlZmF1bHQgYmVoYXZpb3Igc2hhcmVkCisJcnVsZXMgZ2VuZXJhdGVzIGV4ZWN1dGFibGUgdXNpbmcgdGhlIFNUTHBvcnQgZHluYW1pYyBsaWJyYXJ5IGFuZCBzdGF0aWMgcnVsZXMKKwl1c2UgdGhlIHN0YXRpYyBsaWJyYXJpZXMuCisKKwkqIHN0bHBvcnQvc3RsL19zdHJpbmcuaDogQWRkIGNoZWNrIG9mIF9TVExQX05PX0lPU1RSRUFNUyB0byBmb3JjZSBpbmNsdXNpb24gb2YKKwlfc3RyaW5nLmMgaW4gdGhpcyBjYXNlLgorCQorCSogc3RscG9ydC9zdGwvX3N0cmluZy5jOiByZW1vdmFsIG9mIHRoZSBfU1RMUF9MSU5LX1RJTUVfSU5TVEFOVElBVElPTiBtYWNybyBjaGVjayAKKwliZWZvcmUgaW5jbHVzaW9uIGFzIHRoZSBjaGVjayBpcyBhbHJlYWR5IGRvbmUgdG8gaW5jbHVkZSBfc3RyaW5nLmMgZnJvbSBfc3RyaW5nLmguCisKKwkqIHN0bHBvcnQvc3RsL19pc3RyZWFtLmggX2lzdHJlYW0uYzogcmVtb3ZhbCBvZiB0aGUgX01fcHV0X251bSBmdW5jdGlvbiBkZWZpbml0aW9uCisJZnJvbSB0aGUgLmggYW5kIHJlbW92YWwgb2YgYWxsIHRoZSBpbmxpbmUgaW1wbGVtZW50YXRpb24gb2YgdGhlID4+IG9wZXJhdG9ycy4KKwlfTV9wdXRfbnVtIGlzIG5vdyBoaWRkZW4gaW4gdGhlIC5jIHRvIGF2b2lkIHRvIGhhdmUgdG8gZGVhbCB3aXRoIGV4cG9ydCBvZiB0aGlzCisJc3ltYm9sLiBGaXggZXJyb3JzIHdoaWxlIHVzaW5nIHRoZSBfU1RMUF9OT19DVVNUT01fSU8gbWFjcm8uCisJCisJKiBzdGxwb3J0L3N0bC9fb3N0cmVhbS5oIF9vc3RyZWFtLmMsIHNyYy9vc3RyZWFtLmNwcDogZGl0dG8gYnV0IGZvciB0aGUgX01fZ2V0X251bQorCWZ1bmN0aW9uLgorCQorCSogc3RscG9ydC9zdGwvX2lzdHJlYW0uaCBfaXN0cmVhbS5jOiBfTV9pbml0X3NraXAgYW5kIF9NX2luaXRfbm9za2lwIGFyZSBub3cgaW5saW5lCisJZnVuY3Rpb25zIGRlZmluZWQgd2l0aGluIHRoZSAuaCB0byBmaXggbGluayBlcnJvcnMgd2hlbiB1c2luZyB0aGUgX1NUTFBfTk9fQ1VTVE9NX0lPCisJbWFjcm8uCisKKzIwMDQtMDgtMTAgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNALi4uPgorCisJKiBzdGxwb3J0L3N0bC9fc3RyaW5nLmg6IGFkZCBjaGVjayBvZiB0aGUgX1NUTFBfRVhQT1NFX1NUUkVBTV9JTVBMRU1FTlRBVElPTgorCW1hY3JvIHRvIGluY2x1ZGUgdGhlIF9zdHJpbmcuYyBmaWxlLiBJbXByb3ZlIGNvbXBpbGUgdGltZSB3aGVuIF9TVExQX05PX0NVU1RPTV9JTworCWlzIGRlZmluZWQuCisKKwkqIHN0bHBvcnQvc3RsL19zdHJpbmcuaCwgc3RscG9ydC9zdGwvZGVidWcvX3N0cmluZy5oLCBfc3RyaW5nX21lbV90Lmg6IHJlc3RvcmF0aW9uCisJb2YgdGhlIHRlbXBsYXRlIG1ldGhvZCBzcGVjaWFsaXphdGlvbiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBiZXR3ZWVuIGNvbXBpbGVycworCWltcGxlbWVudGF0aW5nIHRlbXBsYXRlIG1ldGhvZCBhbmQgdGhlIG1vc3QgcmVjZW50IG9uZS4gSXQgaXMgY29uc2lkZXJlZCBhcyBhbiAKKwlTVExwb3J0IGV4dGVuc2lvbi4KKworMjAwNC0wOC0wOSAgUGV0ciBPdnRjaGVua292ICA8cHRyQElzbGFuZC4uLj4KKworCSogdGVzdC9jb21waWxlcjogdGVzdHMgdG8gY2hlY2sgd2hldGhlciBjb21waWxlciB1bmRlcnN0YW5kIG9yIG5vdCBzb21lCisJbGFuZ3VhZ2UgY29uc3RydWN0aW9uLiBJdCBpcyBOT1QgdGVzdHMgZm9yIGxhbmd1YWdlIHN1cHBvcnQgbGlicmFyaWVzLAorCW9ubHkgdGVzdHMgZm9yIGNvbXBpbGVyLiBUaGUgbWFpbiBwdXJwb3NlcyBvZiB0aGlzIHRlc3RzIGlzIHRvIGhlbHAKKwlmb3IgZGV2ZWxvcGVycyB0byBmaW5kIGNvcnJlY3Qgd29ya2Fyb3VuZHMsIGlmIGNvbXBpbGVyIGRvbid0IHVuZGVyc3RhbmQKKwlzb21lIGxhbmd1YWdlIGNvbnN0cnVjdGlvbnMuCisKKzIwMDQtMDgtMDkgIEZyYW5jb2lzIER1bW9udCA8ZHVtc0AuLi4+CisKKwkqIHN0bHBvcnQvc3RsL19saW1pdHMuaCwgc3RscG9ydC9jb25maWcvc3RsX215Y29tcC5oOiBpbnRyb2R1Y3Rpb24gb2YgYSBuZXcgbWFjcm8KKwljb25maWd1cmF0aW9uIHRvIHNpZ25hbCBubyBzdXBwb3J0IG9mIHRoZSBJRUMgNTU5IHNwZWNpZmljYXRpb24gZm9yIGZsb2F0aW5nIHBvaW50CisJbnVtYmVycy4KKwkKKwkqIHN0bHBvcnQvY29uZmlnL3N0bF9tc3ZjLmg6IGZpeCBvZiB0aGUgY29uZmlnIHRvIHNpZ25hbCBubyBJRUMgNTU5IHN1cHBvcnQgYmVmb3JlCisJVmlzdWFsIEMrKyAuTmV0IGV2ZW4gaWYgdGhlIGluZmluaXR5IHZhbHVlIGlzIGZpbmUuCisJCisJKiB0ZXN0L3VuaXQvbGltaXRzX3Rlc3QuY3BwOiBOZXcgdGVzdCBjYXNlIHRvIGNoZWNrIHRoZSByaWdodCBudW1lcmljX2xpbWl0cyBjbGFzcworCWNvbmZpZ3VyYXRpb24uIERvIG5vdCBjaGVjayB0aGUgc2lnbmFsaW5nX05hTiB5ZXQuLi4KKwkKKwkqIHN0bHBvcnQvY29uZmlnL3N0bF9tc3ZjLmg6IFZpc3VhbCAuTmV0IEJldGEgMjAwNSBwb3J0YWdlLgorCQorCSogc3RscG9ydC9zdGwvX2lvcy5oOiBNb3ZlIG9mIHRoZSBiYXNpY19pb3M6Om5hcnJvdyBhbmQgd2lkZW4gbWVtYmVyIG1ldGhvZCAKKwlzcGVjaWFsaXphdGlvbiBiZWZvcmUgdGhlIGV4cGxpY2l0IGluc3RhbmNpYXRpb24gb2YgdGhlIGJhc2ljX2lvcyBjbGFzcyBmb3IKKwl0aGUgY2hhciB0eXBlLgorCQorCSogc3RscG9ydC9zdGwvX2NvbnN0cnVjdC5oLCBfbnVtX3B1dC5jOiBmaXggb2Ygc29tZSB1bnVzZWQgcGFyYW1ldGVyIHdhcm5pbmcKKwl0aGFua3MgT2xpdmVyIFN0b2VuZWJlcmcgcmVwb3J0LgorCisyMDA0LTA4LTA1ICBGcmFuY29pcyBEdW1vbnQgPGR1bXNALi4uPgorCisJKiBGaXhlcyBvZiB0aGUgaW50ZXJuYWwgbW92ZSBmcmFtZXdvcmsgZm9yIGNvbXBpbGVycyBub3Qgc3VwcG9ydGluZyBwYXJ0aWFsCisJdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24uIFRoZSBwcm9ibGVtIHdhcyBkZXRlY3RlZCB0aGFua3MgdG8gdGhlIGJvb3N0IHJlZ3Jlc3Npb24KKwl0ZXN0IHN1aXRlLgorCisyMDA0LTA4LTA0ICBGcmFuY29pcyBEdW1vbnQgPGR1bXNALi4uPgorCisJKiBzdGxwb3J0L3N0bC9kZWJ1Zy9fbGlzdC5oLCBfc2xpc3QuaDogc21hbGwgcmV2aWV3IG9mIHRoZSBzdGxwb3J0IGRlYnVnIGNvZGUuCisJUmVtb3ZhbCBvZiBhbnkgU3RhbmRhcmQgcmVmZXJlbmNlIGluIHRoZSBzbGlzdCBjbGFzcyBkZWJ1ZyBpbXBsZW1lbnRhdGlvbi4gUmVtb3ZhbAorCW9mIHNvbWUgdW5qdXN0aWZpZWQgaXRlcmF0b3IgaW52YWxpZGF0aW9uLgorCisJKiBzdGxwb3J0L3N0bC9fbG9jYWxlLmgsIF9jb2xsYXRlLmgsIHNyYy9sb2NhbGUuY3BwLCBsb2NhbGVfY2F0YWxvZy5jcHAsIGxvY2FsZV9pbXBsLmNwcDoKKwlTcGxpdCBvZiB0aGUgbG9jYWxlIGNsYXNzIGltcGxlbWVudGF0aW9uIGludG8gX0xvY2FsZUJhc2UgYmFzZSBjbGFzcyB3aXRoIG5vIG1lbWJlcgorCXRlbXBsYXRlIG1ldGhvZHMgd2hpY2ggaXMgZXhwb3J0ZWQgYW5kIHRoZSBsb2NhbGUgY2xhc3Mgd2hpY2ggaXMgbm90IGV4cG9ydGVkLiBUaGlzCisJaXMgYSB3b3JrYXJvdW5kIGZvciB0aGUgTVNWQzYgY29tcGlsZXIuCisKKzIwMDQtMDgtMDMgIEZyYW5jb2lzIER1bW9udCA8ZHVtc0AuLi4+CisKKwkqIHN0bHBvcnQvc3RsL19pdGVyYXRvci5oOiBGaXggb2YgdGhlIGJhY2tfaW5zZXJ0X2l0ZXJhdG9yLCBmcm9udF9pbnNlcnRfaXRlcmF0b3IKKwlhbmQgaW5zZXJ0X2l0ZXJhdG9yIHRvIG1ha2UgdGhlbSBhc3NpZ25hYmxlIGxpa2Ugc3BlY2lmeSBpbiB0aGUgU3RhbmRhcmQgcmVxdWlyZW1lbnRzCisJb2YgdGhlIG91dHB1dCBpdGVyYXRvcnMuCisKKwkqIHRlc3QvdW5pdC9pbnNlcnRfdGVzdC5jcHAsIGZpbnNlcnRfdGVzdC5jcHAsIGJpbnNlcnRfdGVzdC5jcHA6IEFkZGl0aW9uIG9mIHRlc3RzIGZvcgorCXRoZSBhc3NpZ25tZW50IG9wZXJhdG9ycyBvbiB0aGUgb3V0cHV0IGl0ZXJhdG9ycy4KKworMjAwNC0wOC0wMiAgRnJhbmNvaXMgRHVtb250IDxkdW1zQC4uLj4KKworCSogc3RscG9ydC9zdGwvX3N0cmluZy5oLCBfc3RyaW5nLmMsIGRlYnVnL19zdHJpbmcuaDogc3BsaXQgb2YgdGhlIGJhc2ljX3N0cmluZworCWltcGxlbWVudGF0aW9uIGludG8gYSBjbGFzcyB3aXRoIG5vIG1lbWJlciB0ZW1wbGF0ZXMgYW5kIG9uZSB3aXRoIHRoZSBtZW1iZXIgCisJdGVtcGxhdGVzLiBPbmx5IHRoZSBvbmUgd2l0aCBubyBtZW1iZXIgdGVtcGxhdGVzIGlzIGV4cG9ydGVkLiBUaGlzIGlzIGEgTVNWQzYKKwlidWcgd29ya2Fyb3VuZCBhcyB0aGlzIGNvbXBpbGVyIHRyeSB0byBsb29rIGZvciB0aGUgY2xhc3MgbWV0aG9kIHN5bWJvbHMgd2l0aGluCisJdGhlIGR5bmFtaWMgbGlicmFyeSBldmVuIGlmIHRoaXMgc3ltYm9sIGlzIHRoZSBvbmUgb2YgdGVtcGxhdGUgbWV0aG9kIHdoaWNoIGlzIAorCW5vdCBleHBvcnRlZC4gVGhhdCBhbHNvIG1ha2UgdGhlIGJhc2ljX3N0cmluZyBpbXBsZW1lbnRhdGlvbiBtb3JlIGNsZWFuIHNvIGl0CisJaGFzIGJlZW4gYWRvcHRlZCBmb3IgYWxsIGNvbXBpbGVycy4KKworMjAwNC0wNy0yOSAgRnJhbmNvaXMgRHVtb250IDxkdW1zQC4uLj4KKworCSogdGVzdC91bml0L2xvY2FsZV90ZXN0LmNwcDogRml4IGJhZCBtYWNybyBfU1RMUF9OT19FWENFUFRJT05TIHNwZWxsaW5nIAorCWFuZCBhZGQgb2YgYSBjaGVjayBmb3IgcmVhbCBsb2NhbGUgaW1wbGVtZW50YXRpb24uIFBhdGNoIGRvbmUgYnkKKwlNaWNoYWVsIEZpbmsuCisKKwkqIHN0bHBvcnQvc3RsL2RlYnVnL19kZWJ1Zy5oLCBfZGVidWcuYywgX2l0ZXJhdG9yLmg6IE1vZGlmaWNhdGlvbiBvZiB0aGUKKwlfX2NoZWNrX3NhbWVfb3duZXJfb3JfbnVsbCBmdW5jdGlvbiBuYW1lIHRvIHRoZSBtb3JlIGludHVpdGl2ZSAKKwlfX2NoZWNrX3NhbWVfb3JfbnVsbF9vd25lciB0aGFua3MgYSBBbGVrc2V5IFNhbmluIHJlbWFyay4KKworMjAwNC0wNy0yNiAgUGV0ciBPdnRjaGVua292IDxwdHJASXNsYW5kLi4uPgorCisJKiBzcmMvZXhwbG9yZS9NYWtlZmlsZXMvZ21ha2UvbGliL2djYy5tYWs6IGF2b2lkIGxpbmthZ2Ugd2l0aCBsaWJzdGQrKworCWZvciBnY2MgY29tcGlsZXJzLgorCisJKiBzcmMvZXhwbG9yZS9NYWtlZmlsZXMvZ21ha2UvbGludXgvcnVsZXMtc28ubWFrOiBkaXR0bworCisJKiBzcmMvZXhwbG9yZS9NYWtlZmlsZXMvZ21ha2UvbGliL3J1bGVzLWEubWFrOiBkaXR0bworCisJKiBzcmMvZXhwbG9yZS9NYWtlZmlsZXMvZ21ha2UvYXBwL3RvcC5tYWs6IGRpdHRvCisKKzIwMDQtMDctMjEgIEZyYW5jb2lzIER1bW9udCA8ZHVtc0AuLi4+CisKKwkqIHN0bHBvcnQvY29uZmlnL3N0bF9nY2MuaDogRml4IG9mIGEgZ2NjIDMuMy4wIHRlc3QgdGhhdCBkaWQgbm90IGhhbmRsZQorCXRoZSBnY2MgMi45NS54IGNvcnJlY3RseSB0aGFua3MgSm9yZGFuIEJyZWVkaW5nLgorCisJKiBzcmMvY29tbW9uX3J1bGVzLm1hazogQWRkaXRpb24gb2YgdGhlIHN0bHBvcnQvc3RsL3BvaW50ZXJzIGZvbGRlciB3aXRoaW4KKwl0aGUgZm9sZGVyIHRvIGJlIGluc3RhbGwuIEFkZCBvZiBhIGNhbGwgdG8gcmFubGliIHVuZGVyIGxpbnV4IG1hbmRhdG9yeSB1bmRlcgorCU1hYyBPUyBYIGFuZCB3aXRob3V0IGltcGFjdCB1bmRlciB0aGUgb3RoZXIgVW5peGVzIHN5c3RlbXMuCisKKzIwMDQtMDctMTcgIEZyYW5jb2lzIER1bW9udCA8ZHVtc0AuLi4+CisKKwkqIEFwcGxpY2F0aW9uIG9mIGEgTWFjIE9TWCBwYXRjaCBmcm9tIEpvaG4gRGFuaWVsICh3d3cuZXRyZXNvZnQuY29tKQorCisyMDA0LTA3LTE1ICBGcmFuY29pcyBEdW1vbnQgPGR1bXNALi4uPgorCisJKiBzdGxwb3J0L3N0bC9fZXBpbG9nLmg6IHN5c3RlbWF0aWNhbCB1c2Ugb2YgdGhlIHJlZGVmaW5lZCBzdGQgbmFtZXNwYWNlCisJcmF0aGVyIHRoYW4gdXNpbmcgdGhlIG5hbWVzcGFjZSBpbmNsdXNpb24gc2NoZW1hLgorCisJKiB0ZXN0L3VuaXQvc2V0X3Rlc3QuY3BwOiBhZGRpdGlvbiBvZiBhIHRlc3QgY2FzZSB0byBzaG93IHRoZSBwcm9ibGVtIG9mCisJdGhlIG5hbWVzcGFjZSBpbmplY3Rpb24gc2NoZW1hLgorCisyMDA0LTA3LTEzICBGcmFuY29pcyBEdW1vbnQgPGR1bXNALi4uPgorCisJKiBzdGxwb3J0L251bWVyaWM6IHJlbW92YWwgb2YgdGhlIF9mdW5jdGlvbi5oIGhlYWRlciBpbmNsdWRlLgorCisJKiB0ZXN0L3VuaXQvZGl2aWRlX3Rlc3QuY3BwOiBhZGQgdGhlIG1pc3NpbmcgZnVuY3Rpb25uYWwgaGVhZGVyCisJaW5jbHVzaW9uLgorCisJKiBkb2MvUkVBRE1FLm1zdmM6IG5ldyBkb2Mgc3BlY2lmaWMgdG8gdGhlIE1TVkMrKyBmYW1pbHkgY29tcGlsZXIuCisKKzIwMDQtMDctMTIgIFBldHIgT3Z0Y2hlbmtvdiAgPHB0ckBJc2xhbmQuLi4+CisKKwkqIHRlc3QvdW5pdC9mc3RyZWFtX3Rlc3QuY3BwOiB0ZXN0cyBmb3IgdW5mb3JtYXR0ZWQgZXh0cmFjdGlvbiBidWcuCisKKwkqIHN0bHBvcnQvc3RsL19pc3RyZWFtLmM6IF9NX3JlYWRfdW5idWZmZXJlZCBzaG91bGQgbGVhdmUgZGVsaW1pdGVyCisJaW4gdGhlIHN0cmVhbSBpbiBjYXNlIG9mIHVuZm9ybWF0dGVkIGlucHV0LiBUaGFua3MgSm9lcmcgQmVja2VyLgorCisyMDA0LTA3LTA5ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQC4uLj4KKworCSogc3JjL3NnaV9taXBzcHJvLm1hazogYWRkIHRoZSAtTEFORzpsaWJjX2luX25hbWVzcGFjZV9zdGQ6T0ZGCisJdGhhbmtzIEphY2sgUGVyZHVlLgorCisyMDA0LTA3LTA4ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQC4uLj4KKworCSogZG9jL1JFQURNRS5ldmMzOiBhZGRpdGlvbm5hbCBkb2MgdGhhbmtzIE1pY2hhZWwgRmluaworCisyMDA0LTA3LTA4ICBQZXRyIE92dGNoZW5rb3YgIDxwdHJASXNsYW5kLi4uPgorCisJKiB0ZXN0L3VuaXQvc3N0cmVhbV90ZXN0LmNwcDogYWRkZWQgdHdvIHRlc3QgZm9yIHVuZm9ybWF0dGVkIGV4dHJhY3Rpb24KKwlhbmQgbmV3bGluZSBjaGFyYWN0ZXIuIEluc3BpcmVkIGJ5IEpvZXJnIEJlY2tlci4KKworMjAwNC0wNy0wNyAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0AuLi4+CisKKwkqIHN0bHBvcnQvc3RsL19oYXNodGFibGUuaCwgc3RscG9ydC9zdGwvX2hhc2h0YWJsZS5jLCAKKwlzdGxwb3J0L3N0bC9faGFzaF9zZXQuaCwgc3RscG9ydC9zdGwvX2hhc2hfbWFwLmg6IGdlbmVyYWxpemF0aW9uCisJb2YgdGhlIGl0ZXJhdG9yIHRyYWl0cyBhZG9wdGVkIG9uIHRoZSB0cmVlIGNsYXNzLiBOb3cgaXRlcmF0b3IgYW5kCisJY29uc3RfaXRlcmF0b3Igb24gaGFzaF9zZXQgYW5kIGhhc2hfbXVsdGlzZXQgYXJlIGRpZmZlcmVudCB0eXBlcworCWV2ZW4gaWYgaXRlcmF0b3IgaXMgc3RpbGwgaW1tdXRhYmxlLgorCisJKiBzdGxwb3J0L3N0bC9fZGVxdWUuaCwgc3RscG9ydC9zdGwvX2xpc3QuaCwgc3RscG9ydC9zdGwvX3NsaXN0Lmg6CisJTW9kaWZpY2F0aW9uIG9mIHRoZSBpdGVyYXRvciBjbGFzc2VzIHRvIG9ubHkgdXNlIHRoZSB0ZW1wbGF0ZQorCXBhcmFtZXRlciBfVHJhaXRzIHJhdGhlciB0aGFuIHVzaW5nIGFuIGV4dGVybmFsIHR5cGUgdHJhaXRzLiBJdCBpcworCXRoZSB3YXkgaGFzaCBjb250YWluZXJzIGFuZCBzb3J0ZWQgY29udGFpbmVycyBoYXZlIHRoZWlyIGl0ZXJhdG9yCisJc3RydWN0IHdvcmtpbmcuCisKKwkqIHN0bHBvcnQvc3RsL19pdGVyYXRvcl9iYXNlLmg6IEFkZGl0aW9uIG9mIHRoZSBpbW11dGFibGUgdHJhaXRzIAorCXN0cnVjdCBfQ29uc3RfQ29uc3RfdHJhaXRzIGFuZCBfTm9uY29uc3RfQ29uc3RfdHJhaXRzIGZvciAKKwlpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc2V0LCBtdWx0aXNldCwgaGFzaF9zZXQsIGhhc2hfbXVsdGlzZXQgCisJaXRlcmF0b3JzLgorCisJKiBzdGxwb3J0L3N0bC9jX2xvY2FsZS5oLCBzdGxwb3J0L3N0bC9kZWJ1Zy9fZGVidWcuaDogcmVtb3ZhbCBvZiAKKwl1bmp1c3RpZmllZCBfY29uZmlnLmggaW5jbHVzaW9ucworCisJKiBzdGxwb3J0L3N0bC9faXRlcmF0b3JfYmFzZS5oOiBpbmNsdXNpb24gb2YgdHlwZV90cmFpdHMuaCBvbmx5CisJZm9yIGNvbXBpbGVycyB0aGF0IG5lZWQgaXQuCisKKwkqIHN0bHBvcnQvc3RsL19hbGdvYmFzZS5oLCBzdGxwb3J0L3N0bC9kZWJ1Zy9fZGVidWcuaDogYWRkIGluY2x1c2lvbiAKKwlvZiB0eXBlX3RyYWl0cy5oLgorCisJKiBzdGxwb3J0L3N0bC9fYWxnby5oLCBzdGxwb3J0L3N0bC9fYWxnby5jOiBtb3ZlIG9mIHRoZSBfdGVtcGJ1Zi5oCisJaW5jbHVzaW9uIGZyb20gdGhlIC5oIHRvIHRoZSAuYyB0aGF0IGlzIHRoZSBvbmx5IG9uZSB0aGF0IG5lZWQgaXQuCisKKwkqIHN0bHBvcnQvc3RsL19jb25maWcuaDogYWRkaXRpb24gb2YgdGhlIGJvb3N0IHN1cHBvcnQgc2VjdGlvbi4KKworMjAwNC0wNy0wNyAgUGV0ciBPdnRjaGVua292ICA8cHRyQElzbGFuZC4uLj4KKworCSogc3RscG9ydC9zdGwvX21vbmV0YXJ5LmM6IGl0ZXJhdG9yIF9fc3RyX2ZpcnN0IG91dCBvZiByYW5nZSwKKwlpLmUuIG91dHNpZGUgX19zdHJfbGFzdCBpbiAnbWlzbWF0Y2gnIGNhbGwgaW4gX19nZXRfc3RyaW5nLCBpZiAKKwlzaXplIG9mIGludGVydmFsIFtfX2ZpcnN0LCBfX2xhc3QpIGlzIGxhcmdlciB0aGFuIHNpemUgb2YgaW50ZXJ2YWwKKwlbX19zdHJfZmlyc3QsIF9fc3RyX2xhc3QpLgorCisJKiB0ZXN0L3VuaXQvZnN0cmVhbV90ZXN0LmNwcDogdGVzdCBmb3IgY29ycmVjdCByZXBvcnQgYnkgdGVsbGcgYWRkZWQuCisKKzIwMDQtMDctMDUgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNALi4uPgorCisJKiBzdGxwb3J0L3N0bC9fbWFwLmg6IGludGVybmFsIHR5cGUgX1JlcF90eXBlIHNldCBhcyBwdWJsaWMgZm9yIHVzZQorCWluIHRoZSBfX21vdmVfdHJhaXRzIHNwZWNpYWxpemF0aW9uIHRoYW5rcyBPbGl2ZXIgU3RvZW5lYmVyZy4KKworCSogc3RscG9ydC9zdGwvX3NldC5oOiBzcGVjaWFsaXphdGlvbiBvZiB0aGUgX19tb3ZlX3RyYWl0cyB0byBtYWtlIHRoZQorCXNldCBhbmQgbXVsdGlzZXQgbW92YWJsZSB0aGFua3MgT2xpdmVyIFN0b2VuZWJlcmcuCisKKwkqIHN0bHBvcnQvc3RsL19mdW5jdGlvbl9iYXNlLmgsIHN0bHBvcnQvc3RsL19oZWFwcy5oOiByZW1vdmFsIG9mIHRoZSAKKwl1bmp1c3RpZmllZCBfY29uZmlnLmggaW5jbHVzaW9uIHRoYXQgc2hvdWxkIG9ubHkgYmUgaW5jbHVkZWQgZnJvbSB0aGUKKwlfcHJvbG9nLmggaGVhZGVyLgorCisyMDA0LTA3LTA1ICBQZXRyIE92dGNoZW5rb3YgIDxwdHJASXNsYW5kLi4uPgorCisJKiBzcmMvZmFjZXRzX2J5bmFtZS5jcHA6IGF2b2lkIHBhc3MgYWRkcmVzcyB0byBtZW1iZXIgb2YgZGVyaXZlZCBjbGFzcyBpbnRvCisJYmFzZSBjbGFzcyB2aWEgY29uc3RydWN0b3IuCisKKwkqIHNyYy9mYWNldHNfYnluYW1lLmNwcDogcmVtb3ZlIGZpcnN0IG1lbWJlci0tLUVPRi0tLW9mIF9NX2J5bmFtZV90YWJsZS0tLW9uZQorCW5vdCByZXF1aXJlZCBhbmQgbGVhZCB0byB3cm9uZyByZWZlcmVuY2U7IHRoaXMgYSBmaXggZm9yIHRlc3QgaW4KKwlsb2NhbGVfdGVzdC5jcHAuCisKKwkqIHNyYy9jdHlwZS5jcHA6IGRpdHRvLgorCisJKiBzcmMvY19sb2NhbGVfd2luMzIvY19sb2NhbGVfd2luMzIuYzogZGl0dG8uCisKKwkqIHN0bHBvcnQvc3RsL19jdHlwZS5oOiBkaXR0by4KKworMjAwNC0wNy0wMiAgUGV0ciBPdnRjaGVua292ICA8cHRyQElzbGFuZC4uLj4KKworCSogc3JjL2NfbG9jYWxlX2dsaWJjL2NfbG9jYWxlX2dsaWJjMi5jOiBtZXNzYWdlIGNhdGFsb2cgZnVuY3Rpb25zIGRlYWxpbmcKKwl3aXRoIG1lc3NhZ2UgY2F0YWxvZyBkZXNjcmlwdG9yOyBidXQgdGhpcyBkZXNjcmlwdG9yIG5vdCBuZWNlc3NhcnkgdG8gYmUKKwlpbnQ7IExpbnV4IHVzZSBoZXJlIHZvaWQgKiwgaS5lLiBwb2ludGVyIHRvIG1tYXAgc2VnbWVudC4KKworCSogc3RscG9ydC9zdGwvX21lc3NhZ2VzX2ZhY2V0cy5oOiBkaXR0by4KKworCSogc3JjL21lc3NhZ2VzLmNwcDogZGl0dG8uCisKKwkqIHNyYy9tZXNzYWdlX2ZhY2V0cy5oOiBkaXR0by4KKworCSogc3JjL2ZhY2V0c19ieW5hbWUuY3BwOiBkaXR0by4KKworCSogc3JjL2NfbG9jYWxlX3N0dWIuY3BwOiBkaXR0by4KKworCSogc3JjL2NfbG9jYWxlLmg6IGRpdHRvLgorCisJKiBzcmMvY19sb2NhbGVfZ2xpYmMvY19sb2NhbGVfZ2xpYmMyLmM6IGZpeCBfTG9jYWxlX2V4dHJhY3RfKl9uYW1lCisJZnVuY3Rpb25zLgorCisyMDA0LTA3LTAxICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQC4uLj4KKworCSogc3JjL2V4cGxvcmUvTWFrZWZpbGVzL25tYWtlL2xpYi92Yy1jb21tb24ubWFrOiBjcmVhdGlvbiBvZiB0aGUKKwlTVExQX0JVSUxEX0ZPUkNFX0RZTkFNSUNfUlVOVElNRSBvcHRpb24gdG8gY3JlYXRlIFNUTHBvcnQgc3RhdGl4CisJdmVyc2lvbnMgbW9yZSBlYXNpbHkuCisKKzIwMDQtMDYtMzAgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNALi4uPgorCisJKiBzdGxwb3J0L3N0bC9fZnVuY3Rpb24uaDogVXNlIGEgY2FsbF90cmFpdHMgdG8gYXZvaWQgdGhlIHJlZmVyZW5jZQorCXRvIHJlZmVyZW5jZSBwcm9ibGVtIGluIHN0cnVjdCBsaWtlIGJpbmRlcjFzdCBvciBiaW5kZXIybmQuCisKKzIwMDQtMDYtMjYgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNALi4uPgorCisJKiBzcmMvZXhwbG9yZS86IHBvcnRhZ2Ugb2YgdGhlIGV4cGxvcmUgYnVpbGQgc3lzdGVtIGZvciB0aGUgCisJTVNWQyAuTmV0IDIwMDMgY29tcGlsZXIuCisKKzIwMDQtMDYtMjQgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNALi4uPgorCisJKiBzdGxwb3J0L3N0bC9fc2l0ZV9jb25maWcuaDogQWRkaXRpb24gb2YgYW4gZW50cnkgZm9yIHRoZSBwZXIgdGhyZWFkCisJYWxsb2NhdG9yIGNvbmZpZ3VyYXRpb24uCisKKwkqIHN0bHBvcnQvc3RsL19jb25maWcuaDogQXZvaWQgdXNlIG9mIHRoZSBpbXBvcnQvZXhwb3J0IHRlY2huaXF1ZQorCXdoZW4gbm90IHVzaW5nIG93biBpb3N0cmVhbXMuIFRoaXMgd2F5IHlvdSBjYW4gdXNlIHRoZSBTVExwb3J0IGRlYnVnCisJbW9kZSB3aXRob3V0IGJ1aWxkaW5nIHRoZSBsaWJyYXJpZXMuCisKKzIwMDQtMDYtMjMgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNALi4uPgorCisJKiBleHRlbnNpb24gb2YgdGhlIGN5Z3dpbiBsaW5rIHByb2JsZW0gd29ya2Fyb3VuZCBmb3IgbWluZ3czMi4KKworCSogc3JjL2xvY2FsZV9jYXRhbG9nLmNwcDogTW92ZSBvZiB0aGUgX1NUTFBfbG9jayBvYmplY3QgaW5zdGFuY2UgCisJZGVjbGFyYXRpb24gdG8gbGltaXQgdGhlIGNyaXRpY2FsIHNlY3Rpb24gYW5kIGltcHJvdmUgcGVyZm9ybWFjZS4KKworCSogc3RscG9ydC9zdGwvX3B0aHJlYWRfYWxsb2MuaDogZml4IG9mIHRoZSBwdGhyZWFkX2FsbG9jYXRvciBhbmQKKwlwZXJfdGhyZWFkX2FsbG9jYXRvciBhbGxvY2F0ZSBtZXRob2QgdG8gY2hlY2sgZm9yIHRoZSByZXF1aXJlZCAKKwludW1iZXIgb2YgZWxlbWVudCBiZWZvcmUgbXVsdGlwbGljYXRpb24gd2l0aCB0aGUgc2l6ZSBvZiB0aGUgb2JqZWN0cworCXRvIGluc3RhbmNpYXRlLgorCisyMDA0LTA2LTIyICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQC4uLj4KKworCSogc3JjL2xvY2FsZV9jYXRhbG9nLmNwcDogZml4IG9mIHRoZSBsb2NhbGUgZmFjZXRzIHJlZ2lzdHJhdGlvbiBzeXN0ZW0uCisJVGhlIGhhc2ggY29udGFpbmVyIHVzZSBzdHJpbmcgYXMga2V5IHJhdGhlciB0aGFuIGNoYXIgY29uc3QqIHNvIHRoYXQKKwlhIGNvcHkgb2YgdGhlIGZhY2V0IG5hbWUgaXMgc3RvcmVkIHJhdGhlciB0aGFuIGEgY29weSBvZiB0aGUgc3RyaW5nCisJcG9pbnRlciB0aGF0IG1pZ2h0IGJlIGZyZWVkLiBXZSBhbHNvIGV4dHJhY3QgdGhlIGNvbXBsZXRlIGZhY2V0IG5hbWUKKwliZWZvcmUgc3RvcmluZyBpdCB0byBhdm9pZCBzdG9yZSBvZiBmYWNldCBhbGlhc2VzIHRoYXQgY2Fubm90IGJlIHJldHJpZXZlZAorCWF0IHJlbGVhc2UuCisKKzIwMDQtMDYtMjEgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAcy4uLj4KKworCSogUmVzdGF1cmF0aW9uIG9mIHRoZSBjeWd3aW4gc3VwcG9ydCAodXNpbmcgZ2NjIDMuMy4xKS4gRXh0ZW5zaW9uIG9mIHRoZQorCWV4cGxvcmUgYnVpbGQgc3lzdGVtLCB3b3JrYXJvdW5kIG9mIGEgbGluayBwcm9ibGVtIHdoZW4gdXNpbmcgc2hhcmVkCisJbGlicmFyaWVzLgorCisyMDA0LTA2LTEzICBQZXRyIE92dGNoZW5rb3YgIDxwdHJASXNsYW5kLi4uPgorCisJKiBzcmMvY19sb2NhbGVfZ2xpYmMvY19sb2NhbGVfZ2xpYmMyLmM6CWxvY2FsZV9kYXRhIGZvciBnbGliYyAyLjMgaXMgZGlmZmVyCisJZnJvbSBvbmUgZm9yIGdsaWJjIDIuMi4KKworMjAwNC0wNi0xMSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0AuLi4+CisKKwkqIHRlc3QvdW5pdDogTW9kaWZpY2F0aW9uIG9mIHNvbWUgdGVzdHMgdG8gbWFrZSB0aGUgYXNzZXJ0aW9uCisJY2xlYXJlci4gTWFpbmx5IGFkZCBvZiBjaGVjayBvZiB0aGUgc3RyZWFtcyBzdGF0ZSBiZWZvcmUgY2hlY2sKKwlvZiB0aGUgc3RyZWFtIGNvbnRlbnQuCisKKwkqIHRlc3QvdW5pdC9sb2NhbGVfdGVzdC5jcHA6IGZpeCBvZiB0aGUgdGhvdXNhbmRzIHNlcGFyYXRvciB3aGljaCBpcworCTB4YTAgdW5kZXIgV2luMzIgYW5kIG5vdCBhIHNpbXBsZSAnICcgZm9yIHRoZSBmcmVuY2ggbG9jYWxlLgorCisyMDA0LTA2LTA3ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQC4uLj4KKworCSogc3RscG9ydC9zdGwvX2FsZ28uYzogcm9sbGJhY2sgb2YgdGhlIHNvcnQgYWxnbyBpbXBsZW1lbnRhdGlvbgorCXRvIHRoZSA0LjUuMyB2ZXJzaW9uLgorCisyMDA0LTA2LTAzICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQC4uLj4KKworCSogc3RscG9ydC9zdGwvcG9pbnRlcnMvUkVBRE1FLCBkb2MvcG9pbnRlcl9zcGVjaWFsaXphdGlvbi50eHQ6IG1vdmUgYW5kCisJcmVuYW1lIG9mIHRoZSBkb2MgYWJvdXQgcG9pbnRlciBwYXJ0aWFsIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGZlYXR1cmUuCisKKwkqIGRvYy9SRUFETUUuZWN2NDogQ3JlYXRpb24gb2YgYSBkb2N1bWVudGF0aW9uIGFib3V0IHRoZSBpbnN0YWxsIGFuZCB1c2UKKwlvZiBTVExwb3J0IHdpdGhpbiBFbWJlZGRlZCBWaXN1YWwgQysrIDQgdGhhbmtzIFpkZW5layBOZW1lYy4KKworCSogZG9jL1JFQURNRS5lY3YzOiBDcmVhdGlvbiBvZiBhIGRvY3VtZW50YXRpb24gYWJvdXQgdGhlIHByb2Nlc3MgaW5zdGFsbG1lbnQKKwl3aXRoIHRoZSBFbWJlZGRlZCBWaXN1YWwgQysrIDMgdGhhbmtzIE1pY2hhZWwgRmluay4KKworCSogc3RscG9ydC9zdGwvX3NsaXN0Lmg6IGZpeCBvZiBhbiBpbnZhbGlkIHJlZmVyZW5jZSB0byBhIF9NX25vZGUgbWVtYmVyIGRhdGEKKwlvbiBhIF9TbGlzdF9ub2RlX2Jhc2Ugc3RydWN0ICh0aGFua3MgZ2NjIDMuNC4wKS4KKworCSogc3RscG9ydC9zdGwvX3N0cmluZy5jLCBzdGxwb3J0L3N0bC9fc3RyaW5nLmg6IGZpeCBvZiBtaXNzaW5nIHNjb3BlcyB0byAKKwlhY2Nlc3MgdGhlIGJhc2UgdGVtcGxhdGUgY2xhc3MgX1N0cmluZ19iYXNlIF9ERUZBVUxUX1NJWkUgZW51bSBtZW1iZXIuCisJKHRoYW5rcyBnY2MgMy40LjApCisKKwkqIHN0bHBvcnQvc3RsL19zdHJpbmdfYmFzZS5oOiBmaXggb2YgdGhlIGFub255bW91cyB1bmlvbiB1c2VkIGFzIGEgcGFyYW1ldGVyCisJb2YgdGhlIHRlbXBsYXRlIGZ1bmN0aW9uIHN3YXAuICh0aGFua3MgZ2NjIDMuNC4wKQorCisJKiBzdGxwb3J0L3N0bC9fb3N0cmVhbS5oOiBmaXhlcyBvZiB0aGUgbWlzc2luZyBzY29wZXMgdG8gYWNjZXNzIHRoZSBiYXNlZmllbGQgZW51bQorCXdpdGhpbiB0aGUgYmFzZSB0ZW1wbGF0ZSBjbGFzcyBiYXNpY19pb3MgZnJvbSB0aGUgYmFzaWNfb3N0cmVhbS4gKHRoYW5rcyBnY2MgMy40LjApCisKKwkqIHN0bHBvcnQvc3RsL19kZWJ1Zy5jOiBjbGVhbiB1cCBvZiBhIG5vIG1vcmUgdXNlIHRlbXBsYXRlIGZ1bmN0aW9uLiAKKwkodGhhbmtzIGdjYyAzLjQuMCkKKworCSogc3RscG9ydC9zdGwvX3JvcGUuaDogZml4IG9mIHRoZSBtaXNzaW5nIHNjb3BlIHRvIGFjY2VzcyBiYXNlIHRlbXBsYXRlIGNsYXNzIAorCWRhdGEgbWVtYmVyLiAodGhhbmtzIGdjYyAzLjQuMCkKKworMjAwNC0wNi0wMiAgUGV0ciBPdnRjaGVua292ICA8cHRyQGlzbGFuZC4uLj4KKworCSogc3JjL251bV9wdXRfZmxvYXQuY3BwOiBzb21lIGZpeGVzIGZvciBzeXN0ZW1zIHRoYXQgdXNlIHNucHJpbnRmIGZvcgorCW91dHB1dCwgaS5lLiBmb3IgRnJlZUJTRCBhbmQgT3BlbkJTRAorCisJKiB0ZXN0L3VuaXQvZmxvYXRpb190ZXN0LmNwcDogbGVzcyBwcmVjaXNlIHJlcXVlc3QsIHRoaXMgc2hvdWxkIHdvcmsKKwl3aXRoIHN0YXRpYyBidWZmZXIgZm9yIHN5c3RlbXMgdGhhdCB1c2Ugc25wcmludGYKKworCSogc3RscG9ydC9zdGwvX2NvbmZpZy5oOiBkZXRlY3QgTVQgZm9yIE9wZW5CU0QKKworCSogc3RscG9ydC9zdGwvX3RocmVhZHMuaDogdXNlIG9yaWdpbmFsIHNwaW5sb2NrIGZvciBPcGVuQlNECisKKzIwMDQtMDUtMjggIEZyYW5jb2lzIER1bW9udCAgPGR1bXNALi4uPgorCisJKiBzdGxwb3J0L2NvbmZpZy9zdGxfZ2NjLmg6IGZpeCBmb3IgdGhlIGdjYzMuNC4wIGNvbXBpbGVyLiBNb2RpZmljYXRpb24KKwlvZiB0aGUgaW5jbHVkZSBwYXRoIG1hY3JvIHRvIGdlbmVyYXRlIDMuNC4wIHJhdGhlciB0aGFuIDMuNCAuIE5lZWQKKwl0ZW1wbGF0ZSBrZXl3b3JkIHRvIHJldmVhbCB1c2Ugb2YgYSBuZXN0ZWQgdGVtcGxhdGUgY2xhc3MuCisKKwkqIHN0bHBvcnQvc3RsL19jb25maWcuaDogY3JlYXRpb24gb2YgdGhlIF9TVExQX0xPTkdfRE9VQkxFIG1hY3JvIHRoYXQgCisJZXh0ZW5kIHRvIGxvbmcgZG91YmxlIG9uIGNvbXBpbGVyIHN1cHBvcnRpbmcgaXQgYW5kIGRvdWJsZSBvbiB0aGUgb3RoZXIKKwlhcyBhIHdvcmthcm91bmQuCisKKwkqIHN0bHBvcnQvc3RsL19udW1fcHV0LmgsIHN0bHBvcnQvc3RsL19udW1fcHV0LmMsIHNyYy9udW1fcHV0X2Zsb2F0LmNwcDoKKwlBZGRpdGlvbiBvZiBmdW5jdGlvbnMgdG8gZ2V0IHRoZSBkaWdpdHMgZnJvbSBhIGxvbmcgZG91YmxlIGZvciB0aGUgbW9uZXRhcnkKKwlmYWNldC4KKworCSogc3RscG9ydC9zdGwvX21vbmV0YXJ5LmgsIHN0bHBvcnQvc3RsL19tb25ldGFyeS5jLCBzcmMvbW9uZXRhcnkuY3BwOgorCUltcGxlbWVudGF0aW9uIG9mIHRoZSBtaXNzaW5nIG1vbmV5X3B1dDo6cHV0IG1ldGhvZCB0YWtpbmcgYSBsb25nIGRvdWJsZS4KKwlGaXhpbmcgb2YgdGhlIGdyb3VwaW5nIGFwcGxpY2F0aW9uLgorCisJKiB0ZXN0L3VuaXQvTWFrZWZpbGUuaW5jLCB0ZXN0L3VuaXQvbG9jYWxlX3Rlc3QuY3BwOiBDcmVhdGlvbiBvZiBhIHVuaXQgdGVzdAorCWZvciB0aGUgbG9jYWxlIHN1cHBvcnQuIEF0IGNyZWF0aW9uIGl0IHRlc3RzIHRoZSBudW1fcHV0LCBudW1fZ2V0LCBtb25leV9wdXQsCisJbW9uZXlfZ2V0IGZhY2V0cy4KKworCSogc3JjL2ZhY2V0c19ieW5hbWUuY3BwOiBmaXggb2YgdGhlIG1vbmV0YXJ5IGZvcm1hdCBkZXRlcm1pbmF0aW9uIGZyb20KKwl0aGUgbG9jYWxlIHBsYXRmb3JtIEFQSSBpbmZvcm1hdGlvbnMuCisKKzIwMDQtMDUtMjggIFBldHIgT3Z0Y2hlbmtvdiAgPHB0ckBJc2xhbmQuLi4+CisKKwkqIHNyYy9leHBsb3JlL01ha2VmaWxlcy9nbWFrZS9zeXNpZC5tYWs6IGNvcnJlY3RseSBkZXRlY3QgTWluZ3cKKworCSogc3JjL2V4cGxvcmUvTWFrZWZpbGVzL2dtYWtlL21pbmd3OiBjb21waWxhdGlvbiB1bmRlciBNaW5ndworCisyMDA0LTA1LTI3ICBQZXRyIE92dGNoZW5rb3YgIDxwdHJASXNsYW5kLi4uPgorCisJKiBNYWtlZmlsZXMvZ21ha2UvbGludXgvZXh0ZXJuLm1hazogZml4IGxpYiBjYXRhbG9nIG5hbWUgaW4gY2FzZSBvZiBjcm9zcy1jb21waWxhdGlvbgorCisJKiBNYWtlZmlsZXMvZ21ha2UvZnJlZWJzZC9leHRlcm4ubWFrOiBkaXR0bworCisJKiBNYWtlZmlsZXMvZ21ha2Uvb3BlbmJzZC9leHRlcm4ubWFrOiBkaXR0bworCisyMDA0LTA1LTI2ICBQZXRyIE92dGNoZW5rb3YgIDxwdHJASXNsYW5kLi4uPgorCisJKiBSZXBvc2l0b3J5OiBTVExwb3J0IDUuMCBSQzEKKworMjAwNC0wNS0yNCAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0AuLi4+CisKKwkqIHN0bHBvcnQvc3RsL19pb3N0cmVhbV9zdHJpbmcuaDoKKwlGaXggb2YgdGhlIGlvc3RyaW5nX2FsbG9jYXRvciByZWJpbmQgZW1iZWRkZWQgc3RydWN0IGFuZCBpbXBsZW1lbnRhdGlvbgorCW9mIHRoZSBtaXNzaW5nIF9fc3RsX2FsbG9jX3JlYmluZCBhbmQgX19zdGxfYWxsb2NfY3JlYXRlIHVzZWZ1bCBmb3IgY29tcGlsZXIKKwlub3Qgc3VwcG9ydGluZyBvciBidWdneSBvbiB0aGUgbWVtYmVyIHRlbXBsYXRlIGZlYXR1cmUgKFZDNiBmb3IgaW5zdGFuY2UpLgorCisyMDA0LTA1LTIyICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQC4uLj4KKworCSogc3JjL251bV9wdXRfZmxvYXQuY3BwLCBzdGxwb3J0L3N0bC9fbnVtX3B1dC5oLCBzdGxwb3J0L3N0bC9fbnVtX3B1dC5jOgorCUNvcnJlY3Rpb24gb2YgdGhlIGxvY2FsZSBncm91cGluZyBzY2hlbWEgYXBwbGljYXRpb24gaW4gY2FzZSBvZiB0aGUgc2NpZW50aWZpYworCW91dHB1dCB3aGVuIHRoZXJlIGlzIG5vIGRlY2ltYWwgcG9pbnQuCisKKzIwMDQtMDUtMTkgIFBldHIgT3Z0Y2hlbmtvdiAgPHB0ckBJc2xhbmQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL190cmVlLmgsIHN0bHBvcnQvc3RsL2RlYnVnL190cmVlLmg6IGZpeCB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLCBzZWUgcmVjCisJMjAwNC0wNS0xNCBiZWxvdy4KKworMjAwNC0wNS0xNiAgUGV0ciBPdnRjaGVua292ICA8cHRyQElzbGFuZC4uLj4KKworCSogUmVwb3NpdG9yeTogU1RMcG9ydCA1LjAgYnJhbmNoCisKKzIwMDQtMDUtMTQgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNALi4uPgorCisJKiBzdGxwb3J0L3N0bC9fdHJlZS5oLCBzdGxwb3J0L3N0bC9fdHJlZS5jLCBzdGxwb3J0L3N0bC9fc2V0LmgsIHN0bHBvcnQvc3RsL19tYXAuaDoKKwlNb2RpZmljYXRpb24gb2YgdGhlIF9SYl90cmVlIGltcGxlbWVudGF0aW9uIHRvIHJlc3RvcmUgdGhlIG5vbiBtdXRhYmlsaXR5IG9mIHRoZSBzZXQKKwlpdGVyYXRvcnMgYnV0IHRvIGtlZXAgZGlzdGluY3QgdHlwZSBiZXR3ZWVuIGl0IGFuZCB0aGUgY29uc3RfaXRlcmF0b3IuCisKKzIwMDQtMDUtMTMgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNALi4uPgorCisJKiBzdGxwb3J0L2NvbmZpZy9zdGxfZXZjLmgsIHRlc3QvdW5pdC9ubWFrZS1ldmMzLm1hazogUG9ydGFnZSB0byB0aGUgV2luQ0UgMyBwbGF0Zm9ybS4KKwlUaGFua3MgTWljaGFlbCBGaW5rLgorCisyMDA0LTA1LTEzICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHMuLi4+CisKKwkqIHN0bHBvcnQvc3RsL19zZXQuaDogQWRkaXRpb24gb2YgdGhlIGNvbnN0L25vbi1jb25zdCBtZXRob2RzIGZvciBtYW55IG1ldGhvZHMgbm93IHRoYXQKKwlpdGVyYXRvciBhcmUgbm90IGNvbnN0X2l0ZXJhdG9yIGFueW1vcmUuIENvcnJlY3Rpb24gb2YgdGhlIG11bHRpc2V0IGludGVyZmFjZSB0byBiZQorCWhvbW9nZW5lb3VzIHdpdGggdGhlIHNldCBpbnRlcmZhY2UuCisKKzIwMDQtMDUtMDkgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNALi4uPgorCisJKiBzdGxwb3J0L3N0bC9jaGFyX3RyYWl0cy5oOiBBZGRpdGlvbiBvZiB0aGUgc3BlY2lmaWMgd2NoYXJfdCBzdGF0aWMgbWV0aG9kcyBzaW1pbGFyCisJdG8gdGhlIG9uZSBvZiB0aGUgY2hhciBzcGVjaWFsaXphdGlvbiBjYWxsaW5nIHRoZSB3aWRlIGZ1bmN0aW9ucy4KKworMjAwNC0wNS0wOCAgUGV0ciBPdnRjaGVua292ICA8cHRyQElzbGFuZC4uLj4KKworCSogc3RscG9ydC9zdGwvX3NldC5oOiBmaXggZGVmaW5pdGlvbiBvZiBjb25zdC9ub24tY29uc3QgZm9yIGZpbmQgYW5kICpfYm91bmQKKwltZXRob2RzLiBUaGFua3MgS0wgZm9yIHJlcG9ydC4KKworMjAwNC0wNS0wNyAgUGV0ciBPdnRjaGVua292ICA8cHRyQElzbGFuZC4uLj4KKworCSogc3RscG9ydC9zdGwvX3NldC5oOiBmaXggZGVmaW5pdGlvbiBvZiBjb25zdC9ub24tY29uc3QgaXRlcmF0b3JzLgorCVRoYW5rcyBJbHlhIENodmV0c292IGZvciByZXBvcnQuCisKKwkqIHRlc3QvdW5pdC9zZXRfdGVzdC5jcHA6IHRlc3QgdGhhdCBkZXRlY3QgYnVnIGFib3ZlLgorCisyMDA0LTA0LTI3ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHMuLi4+CisKKwkqIHN0bHBvcnQvc3RsL19jb21wbGV4Lmg6IHJlbW92YWwgb2YgYSBtYWNybyBndWFyZCBvbiB0aGUgdGVtcGxhdGUgIT0gb3BlcmF0b3IuCisKKwkqIHRlc3QvdW5pdC9jb21wbGV4X3Rlc3QuY3BwOiBjcmVhdGlvbiBvZiBhIHRlc3QgY2FzZSBmb3IgdGhlIGNvbXBsZXggY2xhc3MuCisKKzIwMDQtMDQtMjYgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAcy4uLj4KKworCSogc3RscG9ydC9zdGwvX2ZzdHJlYW0uaCwgc3JjL2ZzdHJlYW0uY3BwOiBleHRlbnNpb24gb2YgdGhlIGZzdHJlYW0gaW50ZXJmYWNlIHRvIGFjY2VwdCBXaW4zMgorCUhBTkRMRSBvbiBjb25zdHJ1Y3Rpb24gYW5kIGluIHRoZSBvcGVuIG1ldGhvZC4KKworMjAwNC0wNC0yNiAgUGV0ciBPdnRjaGVua292ICA8cHRyQElzbGFuZC4uLj4KKworCSogc3RscG9ydC9zdGwvX2lzdHJlYW0uaDogZG9uJ3QgY2hhbmdlIHZhbHVlIHdoaWxlIGlucHV0IGVycm9yIGhhcHBlbnMuCisJVGhhbmtzIE5peC4KKworCSogdGVzdC91bml0L3NzdHJlYW1fdGVzdC5jcHAsIHRlc3QvdW5pdC9mc3RyZWFtX3Rlc3QuY3BwOiBhZGRlZCB0ZXN0IGZvciBlcnJvcgorCWZsYWdzIGFuZCB1bmNoYW5nZWQgdmFsdWUgd2hlbiBpbnB1dCBlcnJvciBvY2N1ci4KKworMjAwNC0wNC0yMyAgUGV0ciBPdnRjaGVua292ICA8cHRyQElzbGFuZC4uLj4KKworCSogc3RscG9ydC9zdGwvX3JvcGUuaDogYWxsb3cgc2VhcmNoIG9mIHJvcGUsIGxpa2UgZG9uZSBpbiBzdHJpbmcKKworMjAwNC0wNC0yMSAgRnJhbmNvaXMgRHVtb250IDxkdW1zQC4uLj4KKworCSogc3RscG9ydC9zdGwvcG9pbnRlcnMvUkVBRE1FOiBDcmVhdGlvbiBvZiBhIGRvY3VtZW50YXRpb24gb24gdGhlIG5ldworCXBvaW50ZXIgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBmZWF0dXJlLgorCisyMDA0LTA0LTIwICBGcmFuY29pcyBEdW1vbnQgPGR1bXNAcy4uLj4KKworCSogc3RscG9ydC9zdGwvX3BhaXIuaDogbW9kaWZpY2F0aW9uIG9mIHRoZSBtYWtlX3BhaXIgc2lnbmF0dXJlLiBBZnRlciB0aGUgbGF0ZXN0CisJU3RhbmRhcmQgcmV2aXNpb24gaXQgdGFrZXMgcGFyYW1zIHBlciB2YWx1ZSBhbmQgbm90IHJlZmVyZW5jZSB0byBjb25zdC4KKworMjAwNC0wNC0yMCAgUGV0ciBPdnRjaGVua292ICA8cHRyQElzbGFuZC4uLj4KKworCSogc3RscG9ydC9zdGwvcG9pbnRlcnMvX2xpc3QuaDogJ2NsZWFyJyBtZXRob2Qgd2FzIGZvcmdvdC4KKworCSogdGVzdC91bml0L2xpc3RfdGVzdC5jcHA6IGNoZWNrIHByZXNlbmNlIG9mICdjbGVhcicKKworMjAwNC0wNC0xNSAgUGV0ciBPdnRjaGVua292ICA8cHRyQElzbGFuZC4uLj4KKworCSogdGVzdC91bml0L3BhcnRpYWxfdGVzdC5jcHA6IHdyb25nIGNvbXBhcmlzb24gZHVyaW5nIHRlc3QKKworCSogdGVzdC91bml0L3NvcnRfdGVzdC5jcHA6IGRpdHRvCisKKwkqIHRlc3QvdW5pdC9ybV9jcF90ZXN0LmNwcDogI2lmbmRlZiBub3QgcmVxdWlyZWQtLS1zaG91bGQgd29yaworCisJKiB0ZXN0L3VuaXQvdW5pcXVlX3Rlc3QuY3BwOiBkaXR0bworCisyMDA0LTA0LTE0ICBQZXRyIE92dGNoZW5rb3YgIDxwdHJASXNsYW5kLi4uPgorCisJKiBzdGxwb3J0L3R5cGVpbmZvLCBzdGxwb3J0L2NvbmZpZy9zdGxfd2luY2VfNC5oLCBzdGxwb3J0L3N0bC9kZWJ1Zy9fZGVidWcuYzogYWRhcHRhdGlvbiBmb3IgV2luIENFIC5ORVQ7CisJVGhhbmtzIFpkZW5layBOZW1lYy4KKworCSogc3RscG9ydC9zdGwvX2FsZ29iYXNlLmg6IGNhbGN1bGF0ZSBkaWZmZXJlbmNlIG9uY2UKKworCSogc3RscG9ydC9zdGwvcG9pbnRlcnMvX3ZlY3Rvci5oOiBtaXNzZWQgcmV0dXJucy4gVGhhbmtzIEtMLgorCisJKiBzdGxwb3J0L3N0bC9wb2ludGVycy9fbGlzdC5oOiBpZGVtLgorCisJKiBzdGxwb3J0L3N0bC9wb2ludGVycy9fZGVxdWUuaDogaWRlbS4KKworCSogc3RscG9ydC9zdGwvcG9pbnRlcnMvX3NsaXN0Lmg6IGlkZW0uCisKKwkqIHN0bHBvcnQvc3RsL192ZWN0b3IuYywgc3RscG9ydC9zdGwvX3ZlY3Rvci5oOiBiaWcgZW5vdWdoIGZ1bmN0aW9ucyBtb3ZlZCB0byBub24taW5saW5lIHNlY3Rpb24KKworCSogc3RscG9ydC9zdGwvX2l0ZXJhdG9yLmg6IHVzZSByZWZlcmVuY2UgaW5zdGVhZCBvZiBwb2ludGVyIGZvciBzdG9yZWQgY29udGFpbmVyCisKKzIwMDQtMDQtMDYgIFBldHIgT3Z0Y2hlbmtvdiAgPHB0ckBJc2xhbmQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL19wcm9sb2cuaDogd2hlbiB3ZSBpbiBfU1RMUF9SRURFRklORV9TVEQgbW9kZSwgd2UgcmVhbGx5CisJbmVlZCB0byAjdW5kZWYgc3RkLCBzZWUgbWlzdGFrZSAyMDA0LTAyLTE5IGJlbG93LgorCisJKiBzdGxwb3J0L2NvbmZpZy9zdGxfbXN2Yy5oOiBwYXJ0aWFsbHkgdW5kbyB3b3JrYXJvdW5kIDIwMDQtMDMtMzAsCisJbm90IHJlcXVpcmVkOyBwcm9ibGVtIHdhcyBzb2x2ZWQgYnkgI3VuZGVmIHN0ZCBpbiBfcHJvbG9nLmgKKworCSogc3RscG9ydC9zdGwvX2FiYnJldnMuaDogYWRkIG5ldyBhYmJyZXZzLS0tVkM2IGhhcyBwcm9ibGVtcyBpbiBkZWJ1ZyBtb2RlCisKKzIwMDQtMDQtMDMgIFBldHIgT3Z0Y2hlbmtvdiAgPHB0ckBJc2xhbmQuLi4+CisKKwkqIHN0bHBvcnQvc3RsX3VzZXJfY29uZmlnLmg6IGV4cG9zZSBfU1RMUF9ET05UX0ZPUkNFX01TVkNfTElCX05BTUUgZm9yCisJY29uZmlndXJhdGlvbi4KKwkKKwkqIHN0bHBvcnQvY29uZmlnL3N0bF9tc3ZjLmg6IGluY29ycG9yYXRlIGNvbnRlbnQgb2Ygc3RsX3NlbGVjdF9saWIuaCBhbmQKKwl2Y19zZWxlY3RfbGliLmg7IGEgYml0IGNsZWFuZWQuCisKKwkqIHN0bHBvcnQvY29uZmlnL3N0bF9zZWxlY3RfbGliLmg6IHJlbW92ZWQuCisKKwkqIHN0bHBvcnQvY29uZmlnL3ZjX3NlbGVjdF9saWIuaDogcmVtb3ZlZC4KKworMjAwNC0wNC0wMiAgUGV0ciBPdnRjaGVua292ICA8cHRyQElzbGFuZC4uLj4KKworCSogc3JjL3RpbWVfZmFjZXRzLmNwcDogYWRkICNpbmNsdWRlIDxjc3RkaW8+IGZvciBzcHJpbnRmOyByZW1vdmUKKwljX2NvcHlfc3RyaW5nIGZ1bmN0aW9uLgorCisJKiBzdGxwb3J0L3N0bC9fdGltZV9mYWNldHMuaDogZml4IGZvciBfU1RMUF9MRUFLU19QRURBTlRJQy4KKworMjAwNC0wNC0wMSAgUGV0ciBPdnRjaGVua292ICA8cHRyQElzbGFuZC4uLj4KKworCSogc3RscG9ydC9zdGwvX3N0cmluZy5oOiByZW9yZGVyIG9mIGluLWNsYXNzIHRlbXBsYXRlIGFuZAorCXF1YXppLXNwZWNpYWxpemF0aW9uIGZ1bmN0aW9uIG1ha2UgVkMgaGFwcHksIHJlZi4gMjAwNC0wMy0yOQorCisJKiBzdGxwb3J0L3N0bC9kZWJ1Zy9fc3RyaW5nLmg6IGZpeCBpbnNlcnQgYW5kIHJlcGxhY2UgZm9yCisJaXRlcmF0b3JzIHRoYXQgcmVmZXIgdG8gc2FtZSBzdHJpbmcgaW4gX1NUTFBfREVCVUcgbW9kZS4KKworMjAwNC0wMy0zMSAgUGV0ciBPdnRjaGVua292ICA8cHRyQElzbGFuZC4uLj4KKworCSogc3JjL2V4cGxvcmUvbm1ha2UtZXZjNC1hcm0ubWFrLCBzcmMvZXhwbG9yZS9ubWFrZS1ldmM0LXg4Ni5tYWssIGV0Yy46CisJcnVsZXMgZm9yIGVWQzQgY29tcGlsZXJzLS0tQVJNIGFuZCBpeDg2IHRhcmdldCBhcmNoaXRlY3R1cmVzLgorCUNvbnRyaWJ1dGlvbiBieSBaZGVuZWsgTmVtZWMuCisKKzIwMDQtMDMtMzAgIFBldHIgT3Z0Y2hlbmtvdiAgPHB0ckBJc2xhbmQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL19hbGdvLmM6IHdvcmthcm91bmQgZm9yIFZDIGNvbXBpbGVycy0tLW9uZXMgcGFzcyByZWZlcmVuY2UKKwl0byBwYXJlbnQgb2JqZWN0IGRpcmVjdGx5LCBwYXkgbm8gcmVnYXJkIGZvciB0ZW1wb3Jhcnkgb2JqZWN0CisKKwkqIHN0bHBvcnQvbmV3LCBzdGxwb3J0L3N0bC9fbmV3LmgsIHN0bHBvcnQvdHlwZWluZm8sIHN0bHBvcnQvY29uZmlnL3N0bF9tc3ZjLmg6CisJd29ya2Fyb3VuZCBmb3IgVkM2J3MgcHJvYmxlbSB3aXRoICd1c2luZycgZGlyZWN0aXZlLCB3aGlsZSBpbXBvcnQgbmF0aXZlCisJYmFkX2FsbG9jIGFuZCBzb21lIG90aGVyIGNsYXNzZXMgaW50byBTVExwb3J0J3MgbmFtZXNwYWNlCisKKwkqIHN0bHBvcnQvc3RsL19zdHJlYW1idWYuaDogZXhwb3J0IHRlbXBsYXRlIGNsYXNzLCB0byBtYWtlIFZDcyB0byBiZSBoYXBweS4KKworCSogc3RscG9ydC9zdGwvX3ZhbGFycmF5Lmg6IHVzZSA8bmV3Piwgbm90IDxzdGwvX25ldy5oPgorCisJKiBzcmMvZXhwbG9yZS9NYWtlZmlsZXMvbm1ha2UvbGliL21hY3JvLm1haywgdGVzdC91bml0L25tYWtlLXZjNi5tYWs6CisJZml4IHN0YXRpYyBsaWJyYXJ5IG5hbWVzCisKKzIwMDQtMDMtMjkgIFBldHIgT3Z0Y2hlbmtvdiAgPHB0ckBJc2xhbmQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL19zZXQuaDogZml4IHByb2JsZW1zIHdpdGggZXJhc2UgZnVuY3Rpb25zLgorCisJKiBzdGxwb3J0L3N0bC9fc3RyaW5nLmg6IFZDIGNvbXBpbGVyIGV4cGVjdCBvbmx5IG9uZSB2YXJpYW50LS0tdGVtcGxhdGUKKwlvciBub3QtLS1vZiByZXBsYWNlIGZ1bmN0aW9uIHdpdGggZm91ciBpdGVyYXRvcnMgaW4gcGFyYW1ldGVycy4KKworCSogdGVzdC91bml0L25tYWtlLXNyYy1wcmVmaXgubWFrOiByZWFsbHkga25vdyB3aGF0IGRvIHdpdGggc291cmNlcworCWluIGNwcHVuaXQuCisKKzIwMDQtMDMtMjUgIFBldHIgT3Z0Y2hlbmtvdiAgPHB0ckBJc2xhbmQuLi4+CisKKwkqIHN0bHBvcnQvc3RsL19zdHJpbmdfYmFzZS5oOiBlbmxhcmdlIGRlZmF1bHQgc3RyaW5nIHN0YXRpYyBidWZmZXIgc2l6ZQorCisJKiBzdGxwb3J0L3N0bC9kZWJ1Zy9fc3RyaW5nLmg6IGF2b2lkIGF0dGVtcHQgdG8gaW52YWxpZGF0ZSBpdGVyYXRvcnMgYmV5b25kCisJc3RyaW5nIHNpemUgcmFuZ2UuCisKKwkqIHN0bHBvcnQvY29uZmlnL3N0bF9nY2MuaDogaW5zdGFudGlhdGlvbiBzY2hlbWUgdGhhdCBpZGVmYXVsdCB1c2VkLS0td2l0b3V0CisJLS1yZXBvIG9wdGlvbi0tLWluIGdjYyAzIG1hZGUgdm9pZCBvZiBzZW5zZSBleHBsaWNpdCBpbnN0YW50aWF0aW9uIHdpdGhpbgorCWxpYnJhcnktLS1ub3RoaW5nIGV4Y2VwdCBpbmNyZWFzZWQgbGlicmFyeSBzaXplLgorCURlZmluZSBfU1RMUF9OT19GT1JDRV9JTlNUQU5USUFURSBpcyBkZWZhdWx0IG5vdyBmb3IgZ2NjIDMueC4KKworCSogc3RscG9ydC9zdGwvX3N0cmVhbWJ1Zi5oOiByZW1vdmUgc3BlY2lhbGl6YXRpb24gb2YKKwliYXNpY19zdHJlYW1idWY8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPi0tLXJlZmVyZW5jZSB0byBGSUxFIHN0cnVjdCBoZXJlCisJaXNuJ3QgcmVxdWlyZWQgYW5kIHJlYWxseSBub3QgdXNlZCBhbnl3YXJlLiBGdW5jdGlvbmFsaXR5IG9mIHN0YW5kYXJkIGlvCisJc3RyZWFtcywgaW5jbHVkaW5nIHN5bmNocm9uaXphdGlvbiB3aXRoIEMgc3RkIGlvIHN0cmVhbXMgcHJvdmlkZWQgaW4KKwlzcmMvc3RkaW9fc3RyZWFtYnVmLmNwcAorCisJKiBzdGxwb3J0L3N0bC9faW9zZndkLmg6IHNhbWUuCisKKwkqIHNyYy9mc3RyZWFtX2ltcGwuaCwgc3JjL2lvc3RyZWFtLmNwcCwgc3JjL3N0ZGlvX3N0cmVhbWJ1Zi5jcHA6IHNhbWUuCisJCisJKiBzcmMvc3RyZWFtYnVmLmNwcDogcmVtb3ZlZC4KKworCSogc3RscG9ydC9zdGwvX3N0ZGlvX2ZpbGUuaDogbW92ZWQuLi4KKwkqIHNyYy9fc3RkaW9fZmlsZS5oOiAuLi5oZXJlCisKKwkqIHN0bHBvcnQvc3RkaW9fc3RyZWFtYnVmOiBtb3ZlZC4uLgorCSogc3JjL19zdGRpb19maWxlLmg6IC4uLmhlcmUKKworCSogc3JjL2V4cGxvcmUvTWFrZWZpbGUuaW5jOiByZW1vdmUgc3RyZWFtYnVmLmNwcAorCisyMDA0LTAzLTI0ICBQZXRyIE92dGNoZW5rb3YgIDxwdHJASXNsYW5kLi4uPgorCisJKiBjX2xvY2FsZV9nbGliYzIuYzogcmVhbCBsb2NhbGUgaW1wbGVtZW50YXRpb24gZm9yIGdsaWJjIDIuMy54LgorCisyMDA0LTAzLTE1ICBQZXRyIE92dGNoZW5rb3YgIDxwdHJASXNsYW5kLi4uPgorCisJKiB0ZXN0L3VuaXQ6IHVuaXQgdGVzdCBzdWl0ZSBpbnRlbmRlZCBmb3IgdGVzdC9yZWdyZXNzaW9uIHJlcGxhY2VtZW50LgorCVpkZW5layBOZW1lYyBjb250cmlidXRpb24uCisKKzIwMDQtMDMtMDEgRnJhbmNvaXMgRHVtb250IDxkdW1zQHMuLi4+CisKKwkqIF9oYXNoX2Z1bi5oOiBDb3JyZWN0aW9uIG9mIHRoZSBoYXNoIHN0cnVjdCBzcGVjaWFsaXphdGlvbiBmb3IgdGhlIF9TVExQX0xPTkdfTE9ORworCXR5cGUuIFRoYW5rcyBWaWFubmV5IExlY3JvYXJkCisKKwkqIHR5cGVfdHJhaXRzLmg6IEludGVncmF0aW9uIG9mIHRoZSBib29zdCAod3d3LmJvb3N0Lm9yZykgdHlwZSB0cmFpdHMgd2l0aGluIFNUTHBvcnQuCisKKzIwMDQtMDItMjEgRnJhbmNvaXMgRHVtb250IDxkdW1zQHMuLi4+CisKKwkqIF90cmVlLmg6IE1vZGlmaWNhdGlvbiBvZiB0aGUgYmFzZSBjbGFzcyBpbXBsZW1lbnR0aW9uIHRvIGF2b2lkIHRoZSBzeXN0ZW1hdGljYWwKKwlkeW5hbWljIGFsbG9jYXRpb24gb2YgYSBub2RlIGFzIHRoZSByb290IG5vdGUgb2YgdGhlIFJCIHRyZWUuCisKKwkqIEFkZGl0aW9uIG9mIG1hbnkgbWlzc2luZyBtYWNybyBndWFyZHMgaW4gdGhlIHN0bHBvcnQgcHVibGljIGhlYWRlcnMgdG8gYXZvaWQgdG8gYnJlYWsKKwl0aGUgc3RscG9ydCBwcm9sb2cvZXBpbG9nIGluY2x1ZGUgZnJhbWV3b3JrLgorCisyMDA0LTAyLTE5ICBQZXRyIE92dGNoZW5rb3YgIDxwdHJASXNsYW5kLi4uPgorCisJKiBfc2xpc3QuaCwgZGVidWcvX3NsaXN0LmgsLCBkbGxfbWFpbi5jcHA6IHJlbW92ZSBleGNlc3Mgc2xpc3QgcmVkZWZpbml0aW9ucworCisJKiBkZWJ1Zy9fc2xpc3QuaDogY29tbWVudCBleHBsaWNpdCB1c2FnZSBvZiBuYW1lc3BhY2Ugd2l0aCBmdW5jdGlvbnMtLS11bmRlcgorCXNvbWUgY29uZGl0aW9ucyB0aGlzIGhhbmdzIGdjYyBjb21waWxlcnMuCisKKwkqIF9jb25maWcuaCwgX2N3Y2hhci5oLCBfZXBpbG9nLmgsIF9pdGVyYXRvcl9iYXNlLmgsIGRlYnVnL19kZWJ1Zy5jOiBtdWx0aXBsZSBpbXBvcnQKKwlvZiBfU1RMIG5hbWVzcGFjZSBpbnRvIHN0ZCwgYXMgbXVsdGlwbGUgaW1wb3J0IFZFTkRPUl9DU1REIG5hbWVzcGFjZSBpbnRvIF9TVEwKKwluYW1lc3BhY2UgbGVhZCB0byBjcmFzaCBvZiBnY2MgY29tcGlsZXJzLiBJbXBvcnQgb2YgX1NUTCBuYW1lc3BhY2UgaW50byBzdGQKKwluYW1lc3BhY2UgZG9uZSBvbmNlIGluIHRoZSBfY29uZmlnLmgsIG5vdCBpbiBfZXBpbG9nLmguCisKKwkqIF9wcm9sb2cuaDogdW5kZWYgc3RkIG5vdCByZXF1aXJlZCBpbiBhbGwgY2FzZXM7IGluc3RlYWQgdGhpcyBpcyB1c2VmdWwgb25seQorCWZvciByZWRlZmluaXRpb24gb2Ygc3RkIG5hbWVzcGFjZSwgYW5kIHNob3VsZCBiZSBkb25lIGluIHRoZSBfY29uZmlnLmguCisKKwkqIF9lcGlsb2cuaDogaW5jbHVkZSBvZiBfY29uZmlnLmggaGFzIG5vIHNlbnNlIGhlcmUuCisKKwkqIF90aHJlYWRzLmg6IHdyb25nIGltcG9ydCBvZiBfU1RMIG5hbWVzcGFjZSBpbnRvIGdsb2JhbCBuYW1lc3BhY2UKKworMjAwNC0wMi0xOCAgRnJhbmNvaXMgRHVtb250IDxkdW1zQHMuLi4+CisKKwkqIF9saXN0Lmg6IE1vZGlmaWNhdGlvbiBvZiB0aGUgYmFzZSBsaXN0IGNsYXNzIGJhc2VkIG9uIHRoZSBzbGlzdCBpbXBsZW1lbnRhdGlvbi4KKwlUaGUgbGlzdCBkbyBub3QgYWxsb2NhdGUgYSBub2RlIHN5c3RlbWF0aWNhbGx5IGFueW1vcmUgZXZlbiBmb3IgdGhlIGVtcHR5IGxpc3QuCisKKzIwMDQtMDItMTQgIFBldHIgT3Z0Y2hlbmtvdiAgPHB0ckBJc2xhbmQuLi4+CisKKwkqIGRlYnVnL19yZWxvcHNfY29udC5oLCBkZWJ1Zy9fc3RyaW5nLmg6IGZpeCB0eXBvcyBpbiB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbnMuCisKKzIwMDQtMDItMTIgIFBldHIgT3Z0Y2hlbmtvdiAgPHB0ckBJc2xhbmQuLi4+CisKKwkqIGV4cGxvcmUvaWNjLm1hazogZXhwZXJpbWVudGFsIG1ha2Ugc3lzdGVtIHN1cHBvcnQgSW50ZWwncyBpY2MgY29tcGlsZXIKKwlvbiBMaW51eC4KKworMjAwNC0wMi0wNSAgUGV0ciBPdnRjaGVua292ICA8cHRyQElzbGFuZC4uLj4KKworCSogaW9zdHJlYW0uY3BwLCBfaW9zX2Jhc2UuaCwgaW9zdHJlYW0sIGxvY2FsZV9pbXBsLmgsIGxvY2FsZV9pbXBsLmNwcDoKKwlyZXZpc2Ugc3RhbmRhcmQgaW9zdHJlYW0gYW5kIGxvY2FsZSBpbml0aWFsaXphdGlvbiwgcmVtb3ZlIHdvcnJpdHMgYWJvdXQKKwlvcmRlciBvZiBzdGF0aWMgb2JqZWN0cyBpbml0aWFsaXphdGlvbiBhcyBzb29uIGFzIHBvc3NpYmxlOyBhbGwgcmVhbAorCWluaXRpYWxpemF0aW9uIHNpdHVhdGVkIGluIHRoZSBsb2NhbGVfaW1wbC5jcHA7IGxvY2FsZSBpbml0aWFsaXphdGlvbgorCW1vdmVkIHRvIF9Mb2NhbGVfaW1wbCBjb25zdHJ1Y3Rvci0tLWxvY2FsZSB3aWxsIGJlIGNvcnJlY3RseSBpbml0aWFsaXplZAorCWVpdGhlciB2aWEgZGlyZWN0IGxvY2FsZSB1c2FnZSwgb3IgZHVyaW5nIHN0YW5kYXJkIGlvc3RyZWFtIGluaXRpYWxpemF0aW9uLAorCWFzIGlvc19iYXNlIG1lbWJlci4gVGhpcyBjaGFuZ2VzIG1heSBsZWFkIHRvIHByb2JsZW1zIHdpdGggRGlnaXRhbCBNYXJzCisJYW5kIEJvcmxhbmQgY29tcGlsZXJzLS0tc2hvdWxkIGJlIGNoZWNrZWQgYW5kIGZpeGVkLgorCisyMDA0LTAyLTAzICBGcmFuY29pcyBEdW1vbnQgPGR1bXNAcy4uLj4KKwkKKwkqIGludGVncmF0aW9uIG9mIGEgcG9ydGFnZSB0byB0aGUgV2luZG93cyBDRSAuTkVUIChlTWViZWRkZWQgVmlzdWFsCisJQysrIDQpIGNvbXBpbGVyIHRoYW5rcyBaZGVuZWsgTmVtZWsKKworMjAwNC0wMi0wMiAgUGV0ciBPdnRjaGVua292ICA8cHRyQElzbGFuZC4uLj4KKworCSogX2lvc3RyZWFtX3N0cmluZy5oOiBhdm9pZCB1c2FnZSBvZiBpb3N0cmluZyBpbiB0aGUgX1NUTFBfREVCVUcgbW9kZSwKKwlkdWUgdG8gaW9zdHJpbmc6Oml0ZXJhdG9yIG5vdCBjb252ZXJ0YWJsZSBpbnRvIHN0cmluZzo6aXRlcmF0b3IgaW4gdGhpcworCW1vZGUuCisKKzIwMDQtMDEtMjkgIFBldHIgT3Z0Y2hlbmtvdiAgPHB0ckBJc2xhbmQuLi4+CisKKwkqIF9zdHJpbmcuYzogYXZvaWQgJ2luc2VydCggaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvciApJworCWluc3RhbnRpYXRpb24gaW4gdGhlICdyZXBsYWNlJy0tLVZDNiBoYXMgcHJvYmxlbSBoZXJlLgorCisyMDA0LTAxLTI5ICBGcmFuY29pcyBEdW1vbnQgPGR1bXNAcy4uLj4KKwkKKwkqIGZhY2V0c19ieW5hbWUuY3BwOiBjb3JyZWN0aW9uIG9mIHRoZSB0eXBlaWQgdXNlIHRoYW5rcyB0byBVbHJpY2ggRWNraGFyZHQuCisKKwkqIF9pb3N0cmVhbV9zdHJpbmcuaDogY3JlYXRpb24gYW5kIGludGVncmF0aW9uIG9mIGEgc3BlY2lhbCBzdHJpbmcgdXNlZCB3aXRoaW4KKwl0aGUgaW9zdHJlYW0gaW1wbGVtZW50YXRpb24gdG8gZGlzcGxheSBmbG9hdGluZyBwb2ludCBudW1iZXJzLiBJdCBtaXhlcyBhIHN0YXRpYworCWJ1ZmZlciB3aXRoIGEgZHluYW1pYyBvbmUgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZS4KKworMjAwNC0wMS0yMiAgRnJhbmNvaXMgRHVtb250IDxkdW1zQHMuLi4+CisKKwkqIF9uZXcuaDogY2hlY2sgb2YgdGhlIF9TVExQX1VTRV9FWENFUFRJT05TIGJlZm9yZSBjb3JyZWN0aW9uIG9mIHRoZSBuZXcKKwlvcGVyYXRvciBiZWhhdmlvciBhbmQgYmFkX2FsbG9jIGV4Y2VwdGlvbiBkZWZpbml0aW9uLgorCisJKiBfaW9zX2Jhc2UuaDogcmVtb3ZhbCBvZiB0aGUgX01fZ2V0X2ZhY2V0IGZ1bmN0aW9uIG5vdCBmdWxseSBpbXBsZW1lbnRlZAorCWFuZCB1bnVzZWQgdGhhbmtzIFVscmljaCBFY2toYXJkdC4KKworCSogX2FsZ28uaDogY29ycmVjdGlvbiBvZiB0aGUgX19sZXNzXzIgaGVscGVyIHN0cnVjdCB0byByZW1vdmUKKwljb3B5IHRoYW5rcyBTZXJnZXkgVm9saworCisyMDA0LTAxLTE5ICBQZXRyIE92dGNoZW5rb3YgIDxwdHJASXNsYW5kLi4uPgorCisJKiBfZGVidWcuYzogYXZvaWQgcmVjdXJzaXZlIGxvY2tzIGluIF9fb3duZXJfbGlzdCdzIG11dGV4LS0tZXF1aXZhbGVudAorCWNvZGUgdXNlIHVuZGVybGllIGl0ZXJhdG9ycywgbm90IGRlYnVnIHdyYXBwZXIgaXRlcmF0b3JzLiBCeSB0aGUgd2F5IHRoaXMKKwlhcHByb2FjaCBmYXN0ZXItLS1ubyBleGNlc3NpdmUgY2hlY2tzOyBzb2x2ZWQgYnkgQm9yaXMgRm9taXRjaGV2LgorCisJKiBfdGhyZWFkLmgsIF9kZWJ1Zy5oOiByZWN1cnNpdmUtc2FmZSBtdXRleCBzdHJ1Y3R1cmUgcmVtb3ZlZC0tLW5vdAorCXJlcXVpcmVkIG1vcmU7IHNlZSByZWFzb24ganVzdCBhYm92ZS4KKworMjAwNC0wMS0wOSAgRnJhbmNvaXMgRHVtb250IDxkdW1zQHMuLi4+CisKKwkqIHR5cGVfbWFuaXAuaDogQ29ycmVjdGlvbiBvZiB0aGUgX0lzU2FtZSBzdHJ1Y3QgdG8gaGF2ZSBib3RoIHBhcnRpYWwgdGVtcGxhdGUKKwlzcGVjaWFsaXphdGlvbiB2ZXJzaW9uIGFuZCB0aGUgb3RoZXIgYmVoYXZpbmcgc2ltaWxhcmx5LgorCisyMDA0LTAxLTA3ICBGcmFuY29pcyBEdW1vbnQgPGR1bXNAcy4uLj4KKworCSogX2RlcXVlLmM6IE15c3RlcmlvdXMgY29waWVzIG9mIGluc3RhbmNlIHRvIHN0b3JlIGluIHRoZSBjb250YWluZXJzCisJaGFzIGJlZW4gcmVtb3ZlZC4KKworMjAwNC0wMS0wNSAgRnJhbmNvaXMgRHVtb250IDxkdW1zQHMuLi4+CisKKwkqIF9saXN0LmgsIF9zbGlzdC5oOiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgcG9pbnRlciBzcGVjaWFsaXphdGlvbiBmb3IgbGlzdAorCWFuZCBzbGlzdC4KKworMjAwMy0xMi0zMSAgUGV0ciBPdnRjaGVua292ICA8cHRyQElzbGFuZC4uLj4KKworCSogX3ZlY3Rvci5oLCBfdmVjdG9yLmMsIF9oYXNodGFibGUuaDogcmVtb3ZlIGV4Y2VzcyB2ZWN0b3IgcmVkZWZpbml0aW9ucworCisJKiBkZWJ1Zy9fdmVjdG9yLmg6IHBvaW50ZXIgc3BlY2lhbGl6YXRpb24gZm9yIHZlY3RvciBub3QgZGVyaXZlZAorCWZyb20gX1ZlY3Rvcl9iYXNlLCBzbyB3ZSBzaG91bGQgYXZvaWQgcmVmZXJlbmNlcyBvbiBfVmVjdG9yX2Jhc2UKKwljbGFzcyBtZW1iZXJzIGluIGRlYnVnIHdyYXBwZXIuCisKKzIwMDMtMTItMjIgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAcy4uLj4KKworCSogX3N0cmluZy5oOiB1c2UgX1NUTFBfRk9SQ0VfU1RSSU5HX1RFUk1JTkFUSU9OIGZsYWcgdG8gZW5mb3JjZQorCW51bGwtdGVybWluYXRpb24gb2YgZGF0YSBhc3NvY2lhdGVkIHdpdGggc3RyaW5nLgorCisyMDAzLTEyLTIwICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHMuLi4+CisKKwkqIF92ZWN0b3IuaDogSW1wbGVtZW50YXRpb24gb2YgdGhlIHBvaW50ZXIgc3BlY2lhbGl6YXRpb24gZm9yIHZlY3RvciB0byAKKwlhdm9pZCBjb2RlIGJsb2F0LgorCisyMDAzLTExLTI5ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHMuLi4+CisKKwkqIF9zdHJpbmcuaDogSW1wbGVtZW50YXRpb24gb2YgdGhlIHNob3J0IHN0cmluZyBvcHRpbWl6YXRpb24uCisJYmFzaWNfc3RyaW5nIGhhdmUgbm93IGEgc2hvcnQgc3RhdGljIGJ1ZmZlciB0byBhdm9pZCBjYWxsCisJdG8gdGhlIGFsbG9jYXRvciB3aGVuIHRoZSBzdHJpbmcgaXMgc2hvcnQuCisKKzIwMDMtMTEtMjkgIFBldHIgT3Z0Y2hlbmtvdiAgPHB0ckBJc2xhbmQuLi4+CisKKwkqIGN3Y2hhciwgX2NvbmZpZy5oLCBfY3djaGFyLmgsIF9zdGRpb19maWxlLmgsIGNfbG9jYWxlLmg6CisJc3VwcG9ydCBmb3IgT3BlbkJTRCwgZ2NjIDMuMy4xCisJCisJKiBzcmMvZXhwbG9yZS9NYWtlZmlsZXMvZ21ha2UvLi4uOiBzdXBwb3J0IGZvciBPcGVuQlNELCBnY2MgMy4zLjEKKworMjAwMy0xMS0xNyAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzLi4uPgorCisJKiBfYWxsb2MuaDogTW92ZSBvZiB0aGUgZGVmaW5pdGlvbiBvZiBfQWxsb2NfVHJhaXRzIGJlZm9yZSBpbmNsdXNpb24KKwlvZiBfcHRocmVhZF9hbGxvYy5oOyB0aGFua3MgRGllZ28gS2xhYmphbgorCisyMDAzLTExLTE2ICBQZXRyIE92dGNoZW5rb3YgIDxwdHJASXNsYW5kLi4uPgorCisJKiBfYWxnb2Jhc2UuaCwgX2FsZ28uYzogaXRlcl9zd2FwIGFuZCBfX2luc2VydGlvbl9zb3J0IGRvbid0CisJcHJvcGVybHkgZGVkdWNlIHZhbHVlIHR5cGUgb2YgaXRlcmF0b3IsIGluc3RlYWQgdXNlcyBkZXJlZmVyZW5jZSdzCisJcmV0dXJuIHR5cGU7IHRoaXMgb2NjdXIJd2hlbiBkZXJlZmVyZW5jZSByZXR1cm4gc29tZSBwcm94eSBvYmplY3QsCisJY29udmVydGlibGUgaW50byB2YWx1ZSB0eXBlLgorCVRoYW5rcyBQcnplbWVrIEt1Y3ptaWVyY3p5ayA8cHJ6ZW1la2s4MzRAdGxlbi5wbD4gZm9yIHJlcG9ydCwgdGVzdAorCWFuZCBzb2x1dGlvbi4KKworCSogaXRlcnN3cDAuY3BwLCBpdGVyc3dwMS5jcHAsIGl0ZXJzd3AuY3BwLCBzdGxfdGVzdC5jcHAsCisJc3RsX3Rlc3QuaCwgTWFrZWZpbGUuaW5jICh0ZXN0L3JlZ3Jlc3Npb24pOiBtb3ZlIGl0ZXJzd3AwX3Rlc3QsCisJaXRlcnN3cDFfdGVzdCBpbnRvIGl0ZXJzd3AuY3BwLCBhZGQgbmV3IHRlc3RzIGZvciBwcm9wZXJseSBkZWR1Y2UKKwl2YWx1ZSB0eXBlIG9mIGl0ZXJhdG9yLCB3aGVuIGRlcmVmZXJlbmNlIHJldHVybiBzb21lIHByb3h5IG9iamVjdC4KKworMjAwMy0xMS0xNSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzLi4uPgorCisJKiBfc3RyaW5nLmg6IGltcGxlbWVudGF0aW9uIG9mIHRoZSBleHByZXNzaW9uIHRlbXBsYXRlIGZvciBzdHJpbmcKKwlhZGRpdGlvbiB3aXRoIG90aGVyIHN0cmluZyBvciBDIHN0cmluZyBvciBjaGFyLgorCisJKiBfb3N0cmVhbS5oOiBhZG9wdGlvbiBvZiB0aGUgY2xhc3NpYyAoZXZlbiBpZiBub3QgY2xlYXIgaW4KKwl0aGUgc3RhbmRhcmQpIG91cHV0IGZvciBzaG9ydCBhbmQgaW50IG5lZ2F0aXZlIHZhbHVlcyBpbiBoZXhhCisJb3Igb2N0byBiYXNlcyB0aGF0IGlzIGRpc3BsYXkgYWNjb3JkaW5nIGl0cyBzaXplIGZvciB0aGUgY29tcGlsZXIuCisJdGhhbmtzIFRhbmFrYS4KKworMjAwMy0xMS0xNCAgUGV0ciBPdnRjaGVua292ICA8cHRyQElzbGFuZC4uLj4KKworCSogc3JjL2NfbG9jYWxlLmMsIHNyYy9jX2xvY2FsZV9nbGliYy9jX2xvY2FsZV9nbGliYzIuYzoJc3RlcCB0bworCXJlYWwgbG9jYWxlcyBzdXBwb3J0IHdpdGggZ2xpYmMgPj0gMi4yLngKKworCSogc3JjL2NfbG9jYWxlX2dsaWJjL2NfbG9jYWxlX2dsaWJjLmM6IGJpdCBmaXhlcyBmb3IgbG9jYWxlcworCXN1cHBvcnQgd2l0aCBnbGliYyA8IDEuOTAsIGFuZCwgcG9zc2libGUsIDEuOTAgPD0gZ2xpYmMgPCAyLjE7CisJd2UgY2FuJ3Qgc3VwcG9ydCB0aGlzIG9sZCBjb2RlLCBzbyBmaWxlCisJc3JjL2NfbG9jYWxlX2dsaWJjL2NfbG9jYWxlX2dsaWJjLmMgaXMgb2Jzb2xldGUsIGFuZCB3aWxsIGJlCisJcmVtb3ZlZC4KKworCSogc3JjL2V4cGxvcmUsIHRlc3QvcmVncmVzc2lvbi9leHBsb3JlOiBleHByaW1lbnRhbCBtYWtlIHN5c3RlbS4KKworMjAwMy0xMS0xMyAgUGV0ciBPdnRjaGVua292ICA8cHRyQGlzbGFuZC4uLj4KKworCSogU1RMcG9ydCAocmVwb3NpdG9yeSk6IGN1cnJlbnQgZGV2ZWxvcG1lbnQgbW92ZWQgdG8gQ1ZTIEhFQUQgc3RyZWFtLgorCisJKiBTVExwb3J0IChyZXBvc2l0b3J5KTogY3VycmVudCBkZXZlbG9wbWVudCBzdHJlYW0gbWFya2VkIGFzIFNUTHBvcnQgNS4wLgorCisyMDAzLTExLTAyICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHMuLi4+CisKKwkqIF9saW1pdHMuYzogQ29ycmVjdGlvbiBvZiB0aGUgcXVpZXQgYW5kIHNpZ25hbGluZyBOYU4gdGhhdCB3YXMgaW52ZXJ0ZWQKKwlmb3Igc2V2ZXJhbCBwbGF0Zm9ybTsgdGhhbmtzIEFsZXhleSBTYXJ5dGNoZXYuCisKKzIwMDMtMTEtMDEgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAcy4uLj4KKworCSogX3N0cmluZy5jOiBqdWRpY2lvdXMgY29ycmVjdGlvbiBmb3Igc3RyaW5nOjpmaW5kX2ZpcnN0X25vdF9vZiB0bworCWltcHJvdmUgcGVyZm9ybWFuY2U7IHRoYW5rcyBTdGVwaGVuIENsZWFyeS4KKworCSogX2JpdHNldC5oOiBpbnRlZ3JhdGlvbiBvZiBhIHdvcmthcm91bmQgZm9yIHVwIHRvIE1TVkM2IGNvbXBpbGVycworCWZvciB0aGUgYml0c2V0IGlucHV0IGFuZCBvdXRwdXQgb3BlcmF0b3JzOyB0aGFua3MgSmVzc2UgQm9vaGVyLgorCisJKiBfb3N0cmVhbS5oLCBfaXN0cmVhbS5oOiBmaXggb2YgYSBub24tc3RhbmRhcmQgYmVoYXZpb3Igb2YgdGhlIHNlZWtwCisJYW5kIHNlZWtnIGNhbGxzIGFuZCBjb25mb3JtYW5jZSB0byB0aGUgbGF0ZXN0IDIwMDMgc3RhbmRhcmQ7IHRoYW5rcyBUYW5ha2EuCisKKzIwMDMtMTAtMjYgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAcy4uLj4KKworCSogX21vbmV0YXJ5LmM6IGZpeCBhbiBvdGhlciBtZW1vcnkgb3ZlcnJ1biBvbiBtb25ldGFyeSBkaXNwbGF5OworCXRoYW5rcyBUYW5ha2EuCisKKzIwMDMtMTAtMjYgIFBldHIgT3Z0Y2hlbmtvdiAgPHB0ckBpc2xhbmQuLi4+CisKKwkqIGlvaXRlci5jcHAsIGdjYy5tYWssIHN0bF90ZXN0LmgsIHN0bF90ZXN0LmNwcCwgc3RsX3Rlc3QuZXhwCisJKHRlc3QvcmVncmVzc2lvbik6IHRlc3RzIGZvciBwb3N0Zml4IGluY3JlbWVudCBvcGVyYXRvciBhbmQKKwlpbmRpcmVjdGlvbiBvZiBpc3RyZWFtYnVmX2l0ZXJhdG9yLgorCisyMDAzLTEwLTI1ICBQZXRyIE92dGNoZW5rb3YgIDxwdHJAaXNsYW5kLi4uPgorCisJKiBfaXN0cmVhbWJ1Zl9pdGVyYXRvci5oOiBmaXggcG9zdGZpeCBpbmNyZW1lbnQgb3BlcmF0b3IKKwlvZiBpc3RyZWFtYnVmX2l0ZXJhdG9yIHRvIHByb3ZpZGUgY29uZm9ybWFuY2Ugd2l0aAorCUlTTy9JRUMgMTQ4ODI6MTk5OChFKSwgMjQuMS4xLCBwLjUxMSwgaS5lLgorCSpyKysgZXF1aXZhbGVudCB0byB7IFQgdG1wID0gKnI7ICsrcjsgcmV0dXJuIHRtcDsgfS4KKwlUaGFua3MgVGFuYWthIGZvciB0aGUgcmVwb3J0LgorCisyMDAzLTEwLTIzICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHMuLi4+CisJCisJKiBkZWJ1Zy86IG1vZGlmaWNhdGlvbiBvZiB0aGUgaW52YWxpZGF0aW9uIG9mIGl0ZXJhdG9ycyB0byBhdm9pZAorCWludmFsaWRhdGlvbiBvZiB0aGUgZW5kIGl0ZXJhdG9yIGZvciB0aGUgYXNzb2NpYXRpdmUgY29udGFpbmVycywKKwloYXNoZWQgY29udGFpbmVycyBhbmQgbGlzdCBvbiBjYWxscyB0byBjbGVhci9hc3NpZ24vYXNzaWdubWVudAorCW9wZXJhdG9yLiAodGhhbmtzICBBbGV4ZXkgIFNhcnl0Y2hldikKKworCSogX3JvcGUuaDogQ29ycmVjdGlvbiBvZiB0aGUgcm9wZTo6aXRlcmF0b3IgYW5kIHJvcGU6OmNvbnN0X2l0ZXJhdG9yCisJY29weSBjb25zdHJ1Y3RvciBhbmQgYXNzaWdubWVudCBvcGVyYXRvciAodGhhbmtzIEJyYWRsZXkgR3JhaW5nZXIpCisKKzIwMDMtMTAtMTYgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAcy4uLj4KKworCSogX2FsbG9jLmg6IEFkZCBvZiB0aGUgdGhyb3coKSBzcGVjaWZpY2F0aW9uIG9uIGFsbG9jYXRvciBjb21wYXJpc2lvbi4KKworCSogX2l0ZXJhdG9yLmg6IENvcnJlY3Rpb24gb2YgdGhlIG9wZXJhdG9yKysoaW50KSBzaWduYXR1cmUgdG8gY29uZm9ybQorCXRvIHRoZSBzdGFuZGFyZC4KKworCSogX2N0eXBlLmg6IHRvbG93ZXIgYW5kIHRvdXBwZXIgZm9yIHdjaGFyX3QgdHlwZXMuCisKKwkqIF92YWxhcnJheS5oOiBnc2xpY2VfYXJyYXk6Om9wZXJhdG9yID0gKGNvbnN0IHZhbHVlX3R5cGUmKSBub3QKKwljb25zdCBhbnltb3JlCisKKwkqIF92YWxhcnJheS5oOiBzbGljZV9hcnJheSBpZGVtCisKKwkqIF92YWxhcnJheS5oOiB2YWxhcnJheTxUPiBvcGVyYXRvciBbXShjb25zdCBnc2xpY2UmKSBmb3JtZXIgdmVyc2lvbgorCXdhcyB0YWtpbmcgYSBjb3B5IG9mIGdzbGljZQorCisJKiBfY29kZWN2dC5oOiBjb3JyZWN0aW9uIG9mIHRoZSBkZWZhdWx0IGNvZGVjdnQgY2xhc3MgZGVmaW5pdGlvbiBhbmQKKwljb3JyZWN0aW9uIG9mIHRoZSBvdXQgbWV0aG9kIAorCisJKGFsbCB0aGFua3MgUmljaGFyZCBQZW5nKQorCisyMDAzLTEwLTE2ICBGcmFuY29pcyBEdW1vbnQgIDxkdW1zQHMuLi4+CisKKwkqIGRlYnVnLzogYWRkIG9mIHRoZSBpdGVyYXRvciByYW5nZSBjaGVjayBvbiBhbGwgY29udGFpbmVyIGNvbnN0cnVjdG9ycy4KKworCSogX3N0cmluZy5oOiBjb3JyZWN0aW9uIG9mIGEgYnVnIG9uIHN0cmluZyBhdXRvIHJlZmVyZW5jaW5nIHRocm91Z2h0CisJc29tZSBtZXRob2QgbGlrZSBpbnNlcnQgYW5kIHJlcGxhY2UuICh0aGFua3MgVGFuYWthKQorCisJKiBfdmFsYXJyYXkuaDogY29ycmVjdGlvbiBvZiB0aGUgbWlzc2luZyBzbGljZV9hcnJheSBjb3B5IGNvbnN0cnVjdG9yCisJYW5kIGFzc2lnbm1lbnQgb3BlcmF0b3IgaW4gdGhlIHByaXZhdGUgc2VjdGlvbiAodGhhbmtzIFRhbmFrYSkKKworMjAwMy0xMC0xMSAgUGV0ciBPdnRjaGVua292ICA8cHRyQGlzbGFuZC4uLj4KKworCSogX3NzdHJlYW0uYzogW2lvXT9zdHJpbmdzdHJlYW0gbXVzdCBkbyBlcXVpdmFsZW50IG9mIHNlZWsgYXQgZW5kLAorCWFmdGVyIG9wZW5lZCB3aXRoIGlvc19iYXNlOjphdGU7IHRoaXMgYmVoYXZpb3VyIHVzZWZ1bCBvbmx5IHdoZW4gYnVmZmVyCisJaW5pdGlhbGl6ZWQgYnkgc3RyaW5nOyB0aGFua3MgVGFuYWthIGZvciB0aGUgcmVwb3J0LgorCQorMjAwMy0xMC0wNiAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzLi4uPgorCisJKiBfaXN0cmVhbWJ1Zl9pdGVyYXRvci5oLCBfb3N0cmVhbWJ1Zl9pdGVyYXRvci5oOiBjb3JyZWN0aW9uCisJb2YgdGhlIG1pc3NpbmcgaXRlcmF0b3IgYmFzZSBjbGFzcyAoVGhhbmtzIFRhbmFrYSkKKworMjAwMy0xMC0wNSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzLi4uPgorCisJKiBfc3RyaW5nLmg6IGNvcnJlY3Rpb24gb2YgdGhlIHJlcGxhY2UgaW1wbGVtZW50YXRpb24gYmFkbGluZyBmb3JtCisJZm9yIHNlbGYgcmVmZXJlbmNpbmcKKworCSogX3N0cmluZy5oLCBfc3RyaW5nLmM6IE1vZGlmaWNhdGlvbiBvZiB0aGUgX01fY29weSBtZXRob2QKKwl0byBfTV9tb3ZlIGFzIGJhc2ljX3N0cmluZyBkbyBub3QgY29ycmVjdGx5IGhhbmRsZWQgc2VsZiByZWZlcmVjaW5nOworCXRoYW5rcyBUYW5ha2EKKworMjAwMy0wOS0yNSAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzLi4uPgorCisJKiBjb21vIDQuMy4wIG9uIGxpbnV4IHN1cHBvcnQgKHRoYW5rcyBTeW5nZSBUb2RvIGFuZCBLYXJlbCBHYXJkYXMpCisKKwkqIFF1YXp5LWxlYWsgcGF0Y2g6IG1ha2UgbWVtb3J5IGRldGVjdGlvbiB0b29scyBoYXBwaWVyLAorCW9wdGlvbiBfU1RMUF9MRUFLU19QRURBTlRJQyBpbiBfc2l0ZV9jb25maWcuaC4gKHRoYW5rcyBQZXRyIE92dGNoZW5rb3YpCisKKzIwMDMtMDktMTkgIEZyYW5jb2lzIER1bW9udCAgPGR1bXNAcy4uLj4KKworCSogU3VwcG9ydCBvZiB0aGUgTGludXggSW50ZWwgQysrIHN1cHBvcnQgKHRoYW5rcyBCbGFpbmUgS3ViZXNoKQorCisJKiBGcmVlQlNEIHN1cHBvcnQgdXBkYXRlICh0aGFua3MgR3V5IE1pZGRsZXRvbikuCisKKyAgLS0tLQorCisgICogY29kZWN2dC5jcHA6IGNoYXJjb2RlIGNvcnJlY3Rpb24gaW4gdGhlIGRvX2luIG1ldGhvZCAodGhhbmtzIEogSGFtaWx0b24gcmVwb3J0KQorCisgIC0tLS0KKworICAqIF92YWxhcnJheS5oOiBDb3JyZWN0aW9uIG9mIHRoZSBtaXNzaW5nIGV4cGxpY2l0IGtleXdvcmQgaW4gZnJvbnQgb2Ygb25lIG9mIHRoZSB2YWxhcnJheSBjb25zdHJ1Y3RvcnMKKyAgICAgICAgICAgICAgICAgKHRoYW5rcyBTdGVwaGVuIENsYW1hZ2UpCisKKyAgLS0tLQorMjAwMy0wOC0xMCAgRnJhbmNvaXMgRHVtb250ICA8ZHVtc0BzLi4uPgorCisJKiBzdGRleGNlcHQ6IENvcnJlY3Rpb24gb2YgdGhlIG15c3RlcmlvdXMgNTAgbWVzc2FnZXMgZnJvbSBWQzcuTmV0ICh0aGFua3MgS3Jpc2ggUykKKworICAtLS0tCisKKyAgKiBfdmVjdG9yLmg6IGltcGxlbWVudGF0aW9uIG9mIHRoZSBtYXhfc2l6ZSBtZXRob2QgYmFzZWQgb24gdGhlIGFsbG9jYXRvcjo6bWF4X3NpemUgbWV0aG9kIAorICAgICAgICAgICAgICAgKHRoYW5rcyBHZW5uYXJvIFByb3RhIGZyb20gdGhlIGJvb3N0IGZvcnVtKS4KKworICAtLS0tCisKKyAgKiBfdmVjdG9yLmM6IGFkZCBvZiB0aGUgc3RhbmRhcmQgbGVuZ3RoX2Vycm9yIGV4Y2VwdGlvbiB0byB0aGUgcmVzZXJ2ZSBtZXRob2QgKHRoYW5rcyBTdGV2ZW4gWW91bmdzKS4KKworICAtLS0tCisKKyAgKiBfYWxsb2MuaDogYWRkIG9mIGEgY2hlY2sgb2YgdGhlIG51bWJlciBvZiBlbGVtZW50IHJlcXVpcmUgdG8gYWxsb2NhdG9yOjphbGxvY2F0ZSB0byBhdm9pZCBhIHBvc3NpYmxlCisgICAgICAgICAgICAgIHNpemVfdHlwZSBvdmVyZmxvdyAodGhhbmtzIFN0ZXZlbiBZb3VuZ3MpLgorCisgIC0tLS0KKworICAqIF9pc3RyZWFtLmg6IG1vdmUgb2YgdGhlIHdzIGltcGxlbWVudGF0aW9uIHdpdGhpbiB0aGUgaGVhZGVyIHRvIGF2b2lkIHVuZGVmaW5lZCBzeW1ib2wKKyAgICAgICAgICAgICAgICB1bmRlciBOT19DVVNUT01fSU8gbW9kZSAodGhhbmtzIFVscmljaCBFY2toYXJkdCkKKworICAtLS0tCisKKyAgKiBjdHlwZS5jcHAgOiBjaGFyY29kZSBjb3JyZWN0aW9uICh0aGFua3MgTWFya3VzIFN0aWVyIHJlcG9ydHMgYW5kIEFsYmVydG8gQmFyYmF0aSBjb3JyZWN0aW9uKQorCisgIC0tLS0KKworICAqIF9mdW5jdGlvbi5oIDogYWxsIGZ1bmN0aW9uIGNhbiBub3cgYmUgdXNlZCBpbiBhIG5vbi1jb25zdCB3b3JsZCAodGhhbmtzIEFsZXhleSBLaXJqdXNoa2luKQorCisgIC0tLS0KKworICAqIG1vdmUgY29uc3RydWN0b3IgZnJhbWV3b3JrIGludGVncmF0aW9uICh0aGFua3MgRnJhbmNvaXMgRHVtb250KQorCisgIC0tLS0KKworICAqIGNvbnRhaW5lcnMgaW50ZXJmYWNlIGNvcnJlY3Rpb24gZm9yIHN0YW5kYXJkIGNvbXBsaWFuY2Ugd2hlbiB1c2luZyBleHBsaWNpdAorICAgIGludGFuY2lhdGlvbiBvZiBub3QgZGVmYXVsdCBjb25zdHJ1Y3RpYmxlIHR5cGUuICh0aGFua3MgQWxleGVpIEFnYWZvbm92IHJlcG9ydCkKKworICAtLS0tCisKKyAgKiBpb3N0cmVhbS5jcHAsIGxvY2FsZV9pbXBsLmNwcCA6IHN0YXRpYyBpbml0aWFsaXphdGlvbiBtYWRlIHJvYnVzdCBmb3IgY2FzZSBvZiAKKyAgICBkeW5hbWljIGxvYWRlciBjaXJjdWxhciBkZXBlbmRhbmNpZXMgKFRoYW5rcyBBbGV4ZXkgU2FyeXRjaGV2IGZvciB0aGUgcmVwb3J0KQorCQorICAtLS0tCisJCisgICogX2Z1bmN0aW9uLmggOiBpbnRlZ3JhdGlvbiBvZiBhIG5ldyB3b3JrYXJvdW5kIGZvciBtZW1fZnVuXyogZmFtaWx5IAorICAgICAgICAgICAgICAgICAgZm9yIGNvbXBpbGVyIGhhdmluZyByZXR1cm4gdm9pZCBidWcgKFRoYW5rcyBQYXZlbCBLdXpuZXRzb3YpLgorCisgICogc3RsX3NvbGFyaXMuaCA6IHY4cGx1cyBjb21waWxhdGlvbiBmaXggKFRoYW5rcyBNdWtlc2ggS2Fwb29yKQorCisgICogbnVtX3B1dF9mbG9hdC5jcHAgOiBGcmVlQlNEIGZpeCAKKworICAqIF9jb25zdHJ1Y3QuaCA6IGZpeGVkIGNhc2UgZm9yIGNvbXBpbGVycyB3aXRoIGRlZmF1bHQgaW50ZWdlcgorICBjb25zdHJ1Y3RvciBidWcKKwkKKyAgLS0tCisJCisgICogZnN0cmVhbS5jcHAgOiB0ZXh0IGZpbGUgc3RyZWFtIHBvc2l0aW9uIGJ1ZyBjb3JyZWN0aW9uICh0aGFua3MgQ2hyaXN0b3BoZXIgS29obGVydCkKKworICAtLS0KKworICAqIF9udW1fcHV0LmMgOiBDb3JyZWN0aW9uIG9mIHRoZSBkaXNwbGF5IG9mIHRoZSBtaW4gNjQgYml0cyBzaWduZWQgaW50ZWdlciB2YWx1ZXMKKyAgICAgICAgICAgICAgICAgbGlrZSBudW1lcmljX2xpbWl0czxfX2ludDY0Pjo6bWluKCkgb24gV0lOMzIgZm9yIGluc3RhbmNlICh0aGFua3MgQW5kZXJzIERhbHZhbmRlcikKKworICAtLS0KKyAgKiBfbnVtX3B1dC5jIDogQWRkIG9mIHRoZSAnKycgc2lnbiB3aGVuIHJlcXVlc3RlZCBmb3IgdGhlIHVuc2lnbmVkIGludGVnZXIgZGlzcGxheSAKKyAgICAgICAgICAgICAgICAgKHRoYW5rcyBGcmFuY29pcyBEdW1vbnQpCisKKyAgLS0tCisKKyAgKiBkZWJ1ZyA6IG1hbnkgbWlzc2luZyBpdGVyYXRvciBpbnZhbGlkYXRpb24gY29ycmVjdGVkICh0aGFua3MgRGV0bGV2IFYuRGF2aWRzb24gYW5kIEZyYW5jb2lzIER1bW9udCkKKworICAtLS0KKworICAqIF9uZXcuaCA6IGludHJvZHVjdGlvbiBvZiBhIG5ldyBjb25maWcgY29tcGlsZXIgc3dpdGNoIGZvciB0aG9zZSB3aGljaCBkbyBkZWZpbmUKKyAgICAgICAgICAgICBiYWRfYWxsb2MgYnV0IHRoYXQgZG8gbm90IHRocm93IGl0ISAodGhhbmtzID8pCisgIC0tLQorICAqIF9uZXcuaCA6IGNsYXNzIG5vdGhyb3dfdCBjaGFuZ2VkIHRvIHN0cnVjdCBub3Rocm93X3QgKFRoYW5rcyBGcmFuY29pcyBEdW1vbnQpCisJLS0tCisJKiBfYnZlY3Rvci5oIDogQWRkaXRpb24gb2YgdGhlIHw9IGFuZCAmPSBvcGVyYXRvciBvbiB0aGUgX0JpdF9yZWZlcmVuY2Ugc3RydWN0ICh0aGFua3MgRWQgUmljZSkKKwktLS0KKwkqIFBlcmZvcm1hbmNlIGJ1ZyBpbiB0eXBlX3RyYWl0cy5oIGZpeGVkIChUaGFua3MgRnJhbmNvaXMgRHVtb250KQorCS0tLQorCSogQWRkZWQgTGludXggc3BpbiBsb2NrIGNvZGUgKCkKKwktLS0KKyAgICAqIEFkZGVkIEdDQy0zLnggY29uZmlndXJhdGlvbnMKKworCSogRml4ZWQgSFAgYUNDIHN1cHBvcnQKKworCSogQWRkZWQgT3BlbldhdGNvbSBzdXBwb3J0CisJCisJKiB2ZXJzaW9uIG51bWJlcnMgYnVtcGVkCisKKwkqIGlvc3RyZWFtcyBwb3J0ZWQgdG8gRU1YIChnY2Mgb24gT1MvMikgKFRoYW5rcyBNYXJ0aW4gU2NoYWZmb2VuZXIpCisKKwkqIGlvc3RyZWFtcyBwb3J0ZWQgdG8gQ1JBWSBVbmljb3MgQzkwLCBUOTAsIGFuZCBKOTAgKFRoYW5rcyBHZWlyIEpvaGFuc2VuKQorCQorCSogc3RsX3N1bnByby5oIDogZml4ZWQgbWJzdGF0ZSBkZWZpbml0aW9uIGZvciBTVU4gNC4yICh0aGFua3MgIGxlbmd6cSkKKworCSogY29tcGxleC5jcHAsIF9jb21wbGV4LmggOiB0ZW1wbGF0ZTw+IHVzZWQgZm9yIHNwZWNpYWxpemF0aW9ucworCisJKiBfbnVtX3B1dC5jIDogdW51c2VkIGxvY2FsZSB2YXJpYWJsZSByZW1vdmVkICh0aGFua3MgUGV0ciBPdnRjaGVua292KQorCisJKiBfYWxnby5oIDogX19yZXZlcnNlIGJlYXV0aWZpZWQgKHRoYW5rcyBLYWJhbm92KQorCisJKiBkbGxfbWFpbi5jcHAgOiBmb3JjZV9saW5rKCkgZm9yY2VkIHRvIGJlIGxpbmtlZCBpbgorCisJKiBzdGxfbXN2Yy5oIDogY29uZmlnIGNoYW5nZXMgZm9yIC5ORVQKKworCSogX2F1dG9fcHRyLmggOiAic3RydWN0IiBjaGFuZ2VkIHRvICJjbGFzcyIKKworCSogX2lzdHJlYW0uYyA6IE1fcmVhZF91bmJ1ZmZlcmVkIGZpeGVkICh0aGFua3MgIFN0ZWZhbiBTY2h3YXJ6ZXIgKQorIAkKKwkqIHN0bF9nY2MuaCA6IGFkZGVkIG1pc3NpbmcgaW5jbHVzaW9uIGZvciBTQ08gcGxhdGZvcm0gKHRoYW5rcyBFbW1hbnVlbCBTb2RlbikKKworCSogX3RyZWUuYyA6IG9wdGltaXplZCBpbnNlcnRfdW5pcXVlICh0aGFua3MgVGltb3RoeSkKKworCSogX2FsZ28uYyA6IHJlbGF4ZWQgdHlwZSByZXF1aXJlbWVudHMgZm9yIGxvd2VyX2JvdW5kLCB1cHBlcl9ib3VuZCwgYmluYXJ5X3NlYXJjaAorCisJKiBfYWxnby5oIDogYWRqYWNlbnRfZmluZCgpIGV4cHJlc3NlZCB3aXRoIGNvbXBhcmUtZnVuY3Rpb24gZmxhdm91cgorCisJKiBjcHBfcnVudGltZS90eXBlaW5mbyA6IG1hZGUgYWRqdXN0bWVudHMgZm9yIC5ORVQgKFRoYW5rcyBEYW5pZWwpCisKKwkqIGNzdGQvY2Fzc2VydCA6IGd1YXJkIHJlbW92ZWQgKHRoYW5rcyBFdmFuIENoZW5nKQorCQorVGhlIGZvbGxvd2luZyBjaGFuZ2VzIHdlcmUgbWFkZSBpbiA0LjUuMyBzaW5jZSA0LjUuMSByZWxlYXNlOgorCisJKiBpb3N0cmVhbXMgcG9ydGVkIHRvIFdpbmRvd3MgQ0UgKHRoYW5rcyBBbmRyZXcgV2F0ZXJzKQorCisJKiBpb3N0cmVhbXMgcG9ydGVkIHRvIEFtaWdhT1MgKHRoYW5rcyBTdGV2ZW4gU29saWUpCisKKwkqIGlvc3RyZWFtcyBwb3J0ZWQgdG8gTkNSIDMueCAodGhhbmtzIEVtbWFudWVsIFNvZGVuKQorCQorCSogX2hhc2hfbWFwOjpvcGVyYXRvcltdIDogZW5oYW5jZWQgdG8gYXZvaWQgY2FsbGluZyBkZWZhdWx0IG9iamVjdCBjb25zdHJ1Y3RvcgorCSAoVGhhbmtzIFl1cmkgVGFyYW5lbmtvIGZvciB0aGUgcmVwb3J0KQorCisJKiBJZGVudGlmaWVyICJfX3ZhbHVlIiBjaGFuZ2VkIGV2ZXJ5d2hlcmUgdG8gIl9fdmFsIiB0byBhdm9pZCBjbGFzaGVzIHdpdGggTWljcm9zb2Z0J3MgIm1hbmFnZWQgQysrIiBrZXl3b3JkICh0aGFua3MgQ3JvdyBmb3IgdGhlIHJlcG9ydCkKKworCSogTW9zdCBjb250YWluZXJzIDogc3dhcCgpIGZpeGVkIHRvIHN3YXAgbm9uLXN0YXRlbGVzcyBhbGxvY2F0b3JzIGNvcnJlY3RseSAodGhhbmtzIFNjb3R0IE1leWVycykKKworCSogX3NzdHJlYW0gOiBmaXggdG8gYWNjb3VudCBmb3IgaW9zX2Jhc2U6OmFwcCBmbGFnIHByb3Blcmx5CisKKwkqIHR5cGVfdHJhaXRzLmggOiBfSXNPS1RvTWVtQ3B5KCkgZml4ZWQgdG8gb25seSBhbGxvdyBtZW1jcHkoKSBmb3Igc2FtZSB0eXBlIGFyZ3VtZW50cyAodGhhbmtzICBFZCBCcmV5IGZvciB0aGUgcmVwb3J0KQorCQorCSogc3RsL19udW1fcHV0LmMsIHN0bC9fbGlzdC5jIDogd29ya2Fyb3VuZHMgZm9yIERlYmlhbiBnY2MgKHRoYW5rcyBMZXZlbnRlIEZhcmthcykKKwkKKwkqIDx0eXBlaW5mbz4gOiBmaXhlZCBNUyB3b3JrYXJvdW5kICh0aGFua3MgIFdpbCBFdmVycywgIEFuZHJldyBVc2hha292KQorCisJKiBfcHRocmVhZF9hbGxvYy5oIDogYWRkZWQgcGVyX3RocmVhZF9hbGxvY2F0b3IgY2xhc3M7IHJldHVybnMgbWVtb3J5IHRvIHRoZSBzYW1lIHRocmVhZCBpdCdzIGJlZW4gYWxsb2NhdGVkIGluLgorCisJKiBfaXRlcmF0b3Jfb2xkLmggOiByZXN0b3JlZCAtPigpIG9wZXJhdG9yIGZvciBNU1ZDICh0aGFua3MgRGFuaWVsIEFuZGVyc29uKQorCisJKiBhIGJ1bmNoIG9mIE1QVyBmaXhlcyAodGhhbmtzIFRzdXRvbXUgWW9zaGlkYSkKKworCSogX2NvbmZpZ19jb21wYXQuaCA6IGZpeGVkIGNvbXBhdGliaWxpdHkgZGVmaW5pdGlvbiBmb3IgX1NUTFBfTk9fRVhDRVBUSU9OUyAodGhhbmtzIE5pY29sYXMpCisKKwkqIF9mc3RyZWFtLmMgOiBmaXhlZCBidWcgaW4gX01fc2Vla19pbml0ICh0aGFua3MgUGF2ZWwgS3V6bmV0c292KQorCQorCSogX3JvcGUuaCA6IHJvcGU8Pjo6c3dhcCgpIG1ldGhvZHMgZml4ZWQgZm9yIG5vbi1wYXJ0aWFsIG9yZGVyaW5nIGNhc2UgKHRoYW5rcyBFcmljIE11c3NlcikKKyAJCisJKiBjb21sZXhfdHJpZy5jcHAgOiBmaXhlZCBidWcgb24gU0dJICh0aGFua3MgTW9ydGlzKQorCisJKiBBIGJ1bmNoIG9mIGZpeGVzIGZvciBIUCBhQ0MgY29tcGlsYXRpb24gd2l0aCAtQUEgb3B0aW9uICh0aGFua3MgIEpvaG4gQm9zc29tKQorCisJKiAqLmMgZmlsZXMgOiBhZGRlZCBjb25kaXRpb25hbCBpbmNsdXNpb24gb2YgY29ycmVzcG9uZGluZyAqLmggZmlsZSB0byBmaXggeGxDIGlzc3VlcyB3aXRoIC10ZW1waW5jIG9wdGlvbiAodGhhbmtzIEFsbGEgQm9nb2x5dWJvdiBmb3IgdGhlIHJlcG9ydCkKKworCSogX2F1dG9fcHRyLmggOiAic3RydWN0IiBjaGFuZ2VkIHRvICJjbGFzcyIgKHRoYW5rcyBBbGV4IFBpbnNrZXIgZm9yIHRoZSByZXBvcnQpCisKKwkqIF9jb25maWcuaC9zdGxfdXNlcl9jb25maWcuaCA6IGhhbmRsaW5nIG9mIG1hY3JvIF9TVExQX1dIT0xFX1ZFTkRPUl9TVEQgcmVjdGlmaWVkCisKKwkqIF9udW1fcHV0LmMgOiBkb19wdXQoY29uc3Qgdm9pZCopIGNoYW5nZWQgdG8gb3V0cHV0IHBvaW50ZXJzIGluIGhleCBmb3JtYXQgKHRoYW5rcyAgQWxleCBSb3NlbmJlcmcpCisKKwkqIHRlc3QvZWgvdGVzdF9hbGdvYmFzZS5jcHAgOiBmaXhlZCBhbGlnbm1lbnQgdG8gd29yayBvbiA2NC1iaXQgYXJjaGl0ZWN0dXJlcworCitUaGUgZm9sbG93aW5nIGNoYW5nZXMgd2VyZSBtYWRlIGluIDQuNS4xIGJldGEgMSBzaW5jZSA0LjUgcmVsZWFzZToKKworCSogX2NvbmZpZy5oLCBfZXBpbG9nLmggOiBuZXcgbmFtZXNwYWNlIGluY2x1c2lvbiBzY2hlbWEgaW1wbGVtZW50ZWQgZm9yIG93biBpb3N0cmVhbXMgbW9kZQorCSAobm8gc3RkOjogcmVkZWZpbml0aW9uOyBfU1RMOjogbmFtZXNwYWNlIGltcG9ydGVkIGludG8gc3RkOjosIGluc3RlYWQgb2Ygc3RkOjogaW1wb3J0ZWQgdG8gX1NUTC4KKwkgIEMgbGlicmFyeSBoZWFkZXIgZmlsZXMgd3JhcHBlcnMgYmVjb21lIG9ic29sZXRlIGlmIHRoaXMgbW9kZSBpcyB1c2VkIGFuZCBubyBvd24gbmFtZXNwYWNlIGlzIHNlbGVjdGVkLgorCSAgVGhleSB3aWxsIGJlIG1vdmVkIG91dCB0byBkaXN0aW5jdCBkaXJlY3RvcnkgaW4gdGhlIG5leHQgcmVsZWFzZSwgYW5kIGRlZmF1bHQgaXMgZ29pbmcgdG8gYmUgbm8gb3duIG5hbWVzcGFjZSAKKwkgIHdpdGggb3duIGlvc3RyZWFtcy4pCisgCSAgRm9yIHNvbWUgY29tcGlsZXJzIChWQzYpLCB0aGlzIG9ubHkgd29ya3Mgd2l0aCBfU1RMUF9OT19PV05fTkFNRVNQQUNFIGFuZCBfU1RMUF9PV05fSU9TVFJFQU1TIHNldHRpbmdzLiAKKwkKKwkqIGlvc3RyZWFtcyBwb3J0ZWQgdG8gU0NPIE9wZW5TZXJ2ZXIgKHRoYW5rcyBFbW1hbnVlbCBTb2RlbikKKworCSogc3BhcmNfYXRvbWljLnMgOiBhZGRlZCAic3RiYXIiIHRvIGZpeCBtdWx0aXByb2Nlc3NvciBjcmFzaGVzIG9uIFNQQVJDCisKKwkqIGRsbF9tYWluLmNwcCA6IGZvcmNlZCBsaW5rIG9mIEJzX0cgc3RhdGljIGRhdGEgbWVtYmVycyAodGhhbmtzICBTYW5keSBNYXJ0ZWwpLiBGdW5jdGlvbiB3cmFwcGVkIGluIFNUTHBvcnQgbmFtZXNwYWNlLgorCisJKiBfYWxsb2MuYyA6IGZpeGVkIF9TVExQX0NIVU5LX01BTExPQyBmb3IgZGVidWcgbWFsbG9jIGNvbmZpZ3VyYXRpb24gKHRoYW5rcyAgTWFya3VzIFNjaCBwZmxpbikKKworCSogX2NvbmZpZ19jb21wYXQuaCA6IGZpeGVkIGNvbXBhdGliaWxpdHkgc2VjdGlvbiBmb3IgX1NUTFBfTk9fT1dOX0lPU1RSRUFNUworCisJKiBmc3RyYW0uY3BwICwgdmM2LnVuaWNvZGUubWFrIDogZml4ZWQgYnVnIGluIHdpZGUgc3RyZWFtcyBoYW5kbGluZyBmb3IgVkM2ICh0aGFua3MgSmltIERvbHRlcikKKworCSogZXRjLyoudHh0IDogZmlsZXMgbGlzdCBicm9rZW4gdXAgaW50byBzZXZlcmFsIGNhdGVnb3JpZXMgZm9yIGZ1dHVyZSByZW9yZ2FuaXphdGlvbgorCisJKiBzdGxfbXN2Yy5oIDogZml4ZWQgbGlicmFyeSBzZWxlY3Rpb24gZm9yIC5ORVQgKFRoYW5rcyBGcmFueiBaZXR0aW5nKQorCisJKiBfZnRzcmVhbS5oLCBpb3N0cmVhbS5jcHAgOiBmaXhlZCBjb21waWxhdGlvbiBmb3IgX1NUTFBfTk9fRVhURU5TSU9OUyBjYXNlICh0aGFua3MgIEJlbiBEb3JtYW4gZm9yIHRoZSByZXBvcnQpCisKKwkqIGNoYXJfdHJhaXRzLmggOiBmcG9zPD4gb3BlcmF0b3JzID09IG1hZGUgbWVtYmVycyAodGhhbmtzICBUaG9tYXMgV2l0dCkKKworCSogX3RocmVhZHMuaCA6IGFkZGVkIHVzaW5nIGRpcmVjdGl2ZSBmb3IgU29sYXJpcyB4ODYgY29tcGlsZSAodGhhbmtzIE11a2VzaCBLYXBvb3IpCisKKwkqIF90aHJlYWRzLmggOiBmaXhlZCBJbnRlcmxvY2tlZFhYWCBkZWZpbml0aW9ucyBmb3IgVkMrKyA2LjAgU1A1ICh0aGFua3MgQW5kcmVhc00pCisKKwkqIGdjYy1pbnN0YWxsLWFwcGxlLW1hY29zeC5tYWsgOiBJTlNUQUxMX1NURVAgc2V0IHRvIGluc3RhbGxfdW5peCAoVGhhbmtzIFRyb24gVGhvbWFzKQorCisJKiBjb21tb24ubWFrIDogZGVmYXVsdCBpbnN0YWxsIGRpcmVjdG9yeSBmb3IgVW5peCBzZXQgdG8gL3Vzci9sb2NhbAorCisJKiBfc3RyaW5nLmggOiBfTV9udWxsIGV4cHJlc3NlZCB2aWEgX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRCAoVGhhbmtzIEFudGhvbnkpCisKKwkqIF9zaXRlX2NvbmZpZy5oIDogbWFkZSBzdXJlIF9TVExQX05PX1RIUkVBRFMgYXJlIHNldCBpZiBfTk9USFJFQURTIGlzIG9uIChUaGFua3MgSmVwcGUgTWFkc2VuKQorCisJKiBfY29uZmlnLmggOiBfU1RMUF9XSU4zMlRIUkVBRFMgaXMgc2V0IChidWdmaXgpICggdGhhbmtzIHRvIEFuZHJlYXMgTWFsemFobiApCisKKwkqIF9udW1fcHV0LmMsIGNvbW1vbl9ydWxlcy5tYWsgOiBwYXRjaGVzIGJ5IExldmVudGUgRmFya2FzIAorCisJKiBldGMvU1RMcG9ydC00LjUuMS5zcGVjIDogc3BlYyBmaWxlIHRvIGJ1aWxkIFNUTHBvcnQtNC41LjEgUlBNIGFkZGVkICh0aGFua3MgTGV2ZW50ZSBGYXJrYXMpCisKKwkqIF9hdXRvX3B0ci5oICwgX2RlYnVnLmMsIF9kZWJ1Zy5oIDogZGVidWcgY2hlY2sgZm9yIGF1dG9fcHRyIHBvaW50ZXIgYWRkZWQgKHRoYW5rcyBHZXJkIEhvZXJlbiBmb3IgdGhlIGlkZWEpCisKKwkqIGRlYnVnL192ZWN0b3IuaCA6IGludmFsaWRhdGlvbiBmb3IgZXJhc2UoKSBjb3JyZWN0ZWQgbm90IHRvIGludmFsaWRhdGUgY3VycmVudCBpdGVyYXRvciAoVGhhbmtzIEFMYmVydG8gQmFyYmF0aSkKKworCSogc3RsX2JjLmggOiByZXN0b3JlZCBhdXRvbWF0aWMgbGlicmFyeSBsaW5rIGRpcmVjdGl2ZSBmb3IgY2FzZXMgd2hlbiBTVExwb3J0IGlzIG5vdCBhIG5hdGl2ZSBsaWJyYXJ5CisKKworCSogX2F1dG9fcHRyLmggOiB0ZW1wbGF0ZSBjb25zdHJ1Y3RvciBjb252ZXJzaW9uIGJ1ZyBmaXhlZCAodGhhbmtzIG1iZXJnYWwpCisKKwkqIE1Jbmd3MzIgcGF0Y2hlcyBpbnRlZ3JhdGVkICh0aGFua3MgV3UgWW9uZ3dlaSkKKworCSogc3JjL2NvbXBsZXhfaW1wbC5oIDogY2FzZSBmb3IgREVDIENYWCBjaGFuZ2VkIHRvIGdlbmVyYWwsIGluc3RlYWQgb2YgZXh0ZW5zaW9uIGZ1bmN0aW9ucyBmb3IgZmxvYXQgYW5kIGxvbmcgZG91YmxlLCB0byBnZXQgaXQgY29tcGxpbGVkIHdpdGggQ0MgNi4xICh0aGFua3MgVG9ueSBNY0Nvbm5lbGwpIAorCisJKiBkbGxfbWFpbi5jcHAgOiBhZGRlZCBfX21hbGxvY19hbGxvYyBpbnN0YW50aWF0aW9uICh0aGFua3MgTWljaGFlbCBFaHJpZykKKworCSogX2RlYnVnLmMgOiBmaXhlZCByYWNlIGNvbmRpdGlvbiBpbiBfTV9kZXRhY2ggKHRoYW5rcyBBY2hpbSBTdHJlbXBsYXQpCisKKwkqIHRlc3QvKi9ocGFjYy5tYWsgOiBmaXhlZCBmbGFncyBhbmQgbGlicyAodGhhbmtzICBNaWNoYWVsIEVocmlnKQorCisJKiB0eXBlaW5mbyA6IGFkZGVkIGZpeCBmb3IgTVMgVkMgOjpiYWRfY2FzdCBjb25mdXNpb24gKHRoYW5rcyBBbGJlcnRvIEJhcmJhdGkpCisJCisJKiBkZWJ1Zy9fdmVjdG9yLmggOiByZW1vdmVkIGV4dHJhIGd1YXJkIGZvciBNU0NWIGFyb3VuZCBtZW1iZXIgdGVtcGxhdGUgY29uc3RydWN0b3IgKHRoYW5rcyBBbGJlcnRvIEJhcmJhdGkpCisJCisJKiBfZnN0cmVhbS5oIDogYWRkZWQgZXh0ZW5zaW9uIGJhc2ljX2ZzdHJlYW08PiBjb25zdHJ1Y3RvcnMgdGFraW5nIHByb3RlY3Rpb24gcGFyYW1ldGVyICh0aGFua3MgTXVrZXNoIEthcG9vciBmb3IgdGhlIGlkZWEpCisKKwkqIHN0bF9zdW5wcm8uaCA6IGFkZGVkIGFkZGl0aW9uYWwgQyBpbmNsdWRlIGRpcmVjdG9yeSBjaG9pY2UgZm9yIFNvbGFyaXMgNiY3ICh0aGFua3MgSm9obiBFLiBCb3Nzb20pCisJCisgICAgICAgICogX3ZlY3Rvci5jIDogYWRkZWQgX3ZlY3Rvci5oIGluY2x1c2lvbiBmb3IgX1NUTFBfTElOS19USU1FX0lOU1RBTlRJQVRJT04gY2FzZSAodGhhbmtzIEFsZXggVmFuaWMpCisKKworCSogX251bV9wdXQuYyA6IGZpeGVkIG92ZXJmbG93IGNhc2Ugd2l0aCBncm91cGluZyAodGhhbmtzIFdpbGwgRXZlcnMpCisJCisJKiBfaXN0cmVhbWJ1Zl9pdGVyYXRvci5oIDogZml4ZWQgZGlzdGFuY2VfdHlwZSByZXR1cm4gdHlwZSAodGhhbmtzIEFudGhvbnkgV2lsbGlhbXMpCisKKwkqIGRlYnVnL192ZWN0b3IuaCA6IGRlYnVnIHZlcnNpb24gb2YgcHVzaF9iYWNrKCkgYWRkZWQgKHRoYW5rcykKKworCSogSW9zdHJlYW1zIHBvcnRlZCB0byBMeW54T1MgMy4wICh0aGFua3MgRG1pdHJ5IEF6b3Z0c2V2KQorIAkKKwkqIHdyYXBwZXJzLyouaCA6IGFkZGVkIGluY2x1c2lvbnMgb2YgdGhlIG1hc3RlciBoZWFkZXIgdG8gZml4IHhsQyAzLnggY29tcGlsZSAoVGhhbmtzIERtaXRyeSBBem92dHNldikKKworCSogQ2hhbmdlcyBmb3IgQkNCNiBpbnRlZ3JhdGlvbiAodGhhbmtzIE5hdGhhbiBZb3JrKQorCisJKiBSZW1vdmVkIGFsbCBkZWFkIGNvZGUgYmxvY2tzIG1hcmtlZCBieSAjaWYgT0JTT0xFVEUgYW5kICNpZiAwCisKKwkqIFVwZGF0ZXMgYnVpbGQgc3BlYyBmaWxlIGZvciBMaW51eCBycG0gKHRoYW5rcyBMZXZlbmUgRmFya2FzLCBIYXJvbGQgdmFuIE9vc3Ryb20pCisKKwkqIGNvbXBsZXhfdHJpZy5jcHAgOiBsaW1pdHMgY2hhbmdlZCB0byBiZSBzdGF0aWMsIGZvciBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gKHRoYW5rcyBTZXJnZWkgTmlrb2xhZXYpCisKKwkqIF9hbGdvLmMgOiBlbGltaW5hdGVkIGRlZmF1bHQtY29uc3RydWN0ZWQgaXRlcmF0b3JzLCB0byBsaWZ0IHVubmVjZXNzYXJ5IHJlc3RyaWN0aW9uICh0aGFua3MgVG9uY2kgVG9taWMgKQorIAkKKwkqIF92ZWN0b3IuaCA6IGZpeGVkIGJ1ZyBpbiBhc3NpZ24oKSA6IGNvcHkgdXNlZCBpbnN0ZWFkIG9mIF9fY29weV9hdXggKFRoYW5rcyBUaW0gRmluZXIpCisKKwkqIHN0bF9zdW5wcm8uaCA6IHJlc3RvcmVkIF9TVExQX0hBU19OT19ORVdfQ19IRUFERVJTIHN3aXRjaCBmb3IgU1VOIENDIDQuMgorCisJKiA8bmV3PiA6IF9fc3RsX25ldyBkZWZpbml0aW9uIHB1dCBpbnRvIHRoZSBuYW1lc3BhY2UgKHRoYW5rcyBTYXRvc2hpIE5ha2FtdXJhKQorCisJKiBiY2IqLm1hayA6IGZpeGVkIG1kIGNvbW1hbmQgYW5kIERZTl9MSU5LICh0aGFua3MgS2lyYnkgWmhvdSkKKworCSogc3RsX3VzZXJfY29uZmlnLmggOiBhZGRlZCBfU1RMUF9VU0VfQ1VTVE9NX0NIQVJfVFlQRVNfSU8gc3dpdGNoIHRvIG9wdGltaXplIGlvc3RyZWFtcyBmb3IgZGVmYXVsdCBjYXNlCisJCisJKiBkZWJ1Zy9fdmVjdG9yLmggOiBmaXhlZCBkZWJ1ZyBjaGVjayBidWcgKHRoYW5rcyBHZXJkIEhvZXJlbikKKworCSogX2FsbG9jLmggOiBhbGxvY2F0b3I6OmNvbnN0cnVjdCB1c2VzIHN0ZDo6X0NvbnN0cnVjdCAodGhhbmtzIEdlcnQgR3Jvc3NtYW5uKQorCisJKiBzdGwvX2FsbG9jX29sZC5oIDogcmVzdG9yZWQgKHRoYW5rcyBHZXJ0IEdyb3NzbWFubikKKworCSogc3RsL190aHJlYWRzLmggOiBmaXhlZCBfU1RMUF9BVE9NSUNfeHh4IG1hY3JvcyBmb3IgREVDICh0aGFua3MgR2VydCBHcm9zc21hbikKKworCSogc3JjL19sb2NhbGVfaW1wbC5jcHAgOiBhZGRlZCBtaXNzaW5nIGd1YXJkcyBmb3IgY29kZWN2dDw+IGluIF9TVExQX05PX01CU1RBVEVfVCBjYXNlCisgCQorCQorVGhlIGZvbGxvd2luZyBjaGFuZ2VzIHdlcmUgbWFkZSBpbiA0LjUgcmVsZWFzZSBzaW5jZSA0LjUgYmV0YSA4IDoKKwkKKwkqIF90aHJlYWRzLmgsIGRlYnVnL19kZWJ1Zy5oIGV0YyA6IFNUTHBvcnQgaW9zdHJlYW1zIGxpYnJhcnkgbWFkZSBiaW5hcnkgY29tcGF0aWJsZSB3aXRoIHVzZXIgY29kZSBjb21waWxlciB3L28gbXVsdGl0aHJlYWRlZCBzd2l0Y2gsIGZvciBzb21lIHBsYXRmb3JtcworCQorCSogY29uZmlnL3N0bF9tc3ZjLmgsIDxjbWF0aD4gOiBjb3JyZWN0ZWQgX1NUTFBfTk9fVVNJTkdfRk9SX0dMT0JBTF9GVU5DVElPTlMgZm9yIFZDKysgNi4wIFNQNSAKKwkgIChUaGFua3MgQWxiZXJ0byBCYXJiYXRpKQorCisJKiBzcmMvdmM2Lm1hayA6IFJDIG1hY3JvIGRlZmluaXRpb24gcmVzdG9yZWQgKFRoYW5rcyBHcmFoYW0pCisKKwkqIHN0bC9fY21hdGguaCwgPGNtYXRoPiA6IHBhcnRzIG9mIGNvZGUgbW92ZWQgdG8gPGNtYXRoPiBhcyA8dmFsYXJyYXk+IHVzZXMgaXQgKFRoYW5rcyBTeW5nZSBUb2RvKQorCisJKiBzdGwvX3RyZWUuYyA6IGZpeGVkIGluc2VydF91bmlxdWUoKSB3aXRoIGEgaGludCBidWcgKFRoYW5rcyBTZXJnZSBQYXNoa292KQorIAkKKwkqIHNyYy9nY2MtKi5tYWsgOiByZW1vdmVkIC1ub3N0ZGluYysrIG9wdGlvbgorCisJKiBzdGxfc29sYXJpcy5oIDogZGVmaW5pdGlvbiBvZiBfU1RMUF9TVU5QUk9fRVhDTFVERSBtYWRlIGRlcGVuZGFudCBvbiBfWE9QRU4gbWFjcm8gaW5zdGVhZCBvZiBTVU4gQ0MgbWFjcm9zIChUaGFua3MgZWNvaGVuIGZvciB0aGUgcmVwb3J0KQorCisJKiBmc3RyZWFtLmNwcCA6IG1tYXBfY2h1bmsgbWFkZSB0byBiZSAxTSBpbnN0ZWFkIG9mIDE2TSBhcyB3YXMgb3JpZ2luYWxseSBpbnRlbmRlZCAodGhhbmtzIEFsZXhleSBTdGFyaWtvdnNraXkpCisJKiBzdGxfc3VucHJvLmggOiBfU1RMUF9MSU1JVEVEX0RFRkFVTFRfVEVNUExBVEVTIG5vdCBkZWZpbmVkIGZvciBjb21wYXQgbW9kZSBhbnltb3JlICggdGhhbmtzIE1pY2hhZWwgS29wcCkKKwkqIGRsbF9tYWluLmNwcCA6IGFkZGVkIGluc3RhbnRpYXRpb24gZm9yIF9Td2FwX2xvY2tfc3RydWN0PD4gKHRoYW5rcyBzaW1vbmIpCisKKwkqIF9vc3RyZWFtLmMgOiBmaXhlZCBmb3JtYXR0aW5nIGJ1ZyBmb3Igd2lkdGgoKT09MQorCisJKiBjb25maWcvX2VwaWxvZy5oIDogYWRkZWQgb3B0aW9uIHBvcCBzZWN0aW9uIGZvciBCb3JsYW5kLiAKKworCSogc3RsL190aHJlYWRzLmggOiBmaXhlZCBJbnRlcmxvY2tlZFhYWCBkZWNsYXJhdGlvbnMgZm9yIE1TIC5ORVQgKHRoYW5rcyBQaWVycyBIYWtlbikKKworCSogdmM3Lm1hayBtYWtlZmlsZSBhZGRlZCBmb3IgTVMgVkMrKyA3LjAgKC5ORVQpCisKKwkqIGZpeGVkIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZLCBldGMuIGZvciBNd2Vya3MgQ29kZVdhcnJpb3IgNS4wCisKKwkqIHN0bC9fbnVtX3B1dC5jIDogZml4ZWQgb3BlcmF0b3I8PCh2b2lkKikgdG8gdXNlIF9TVExQX0xPTkdfTE9ORyB3aGVyZSBhdmFpbGFibGUuCisKKwkqIF9TVExQX1dIT0xFX1ZFTkRPUl9TVEQgb3B0aW9uIGlzIGJhY2sgc3VwcG9ydGVkIChUaGFua3MgYW50b24gZXBoYW5vdiBmb3IgdGhlIGlucHV0KQorCisJKiBfY21hdGguaCA6IGFkZGVkIGd1YXJkIHRvIG1hc2sgYWRkaXRpb25hbCBvdmVybG9hZHMgKHRoYW5rcyBUaW0gU21pdGgpCisKKwkqIHN0bF9zb2xhcmlzLmggOiBtYnN0YXRlX3Qgc3R1ZmYgZGVmaW5lZCBoZXJlLCBvbGQtc3R5bGUgQyBoZWFkZXJzIHVzZWQgKFRoYW5rcyBNdWtlc2ggS2Fwb29yKQorCisJKiB0eXBlX3RyYWl0cy5oIDogX19kZWZhdWx0X2NvbnN0cnVjdGVkKCkgaW5saW5lZCAoVGhhbmtzIE1hdHQgRGF2aWVzKQorCisJKiBuZXcuaCA6IGZpeCBmb3IgZ2NjLTMuMCB0byBsb29rIGluIGJhY2t3YXJkIGRpcmVjdG9yeSAoVGhhbmtzIEtlbikgCisKKwkqIHN0bHBvcnQvdXNpbmcvaC9zdHJlYW1idWYuaCBhZGRlZCAoVGhhbmtzIEdlbm5hZGl5KQorCisJKiBBIGJ1bmNoIG9mIGNoYW5nZXMgZm9yIEJvcmxhbmQgc3RhdGljIGFuZCBETEwgY29tcGlsZSAoVGhhbmtzIE5hdGhhbiBZb3JrKQorCisJKiBzdGwvX2FsZ28uYyA6IGZpeGVkIGZpbmRfZW5kKCkgYnVnIChUaGFua3MgQWxiZXJ0byBCYXJiYXRpKQorCisJKiBzdGwvX3F1ZXVlLmggOiBwcmlvcml0eV9xdWV1ZTw+OjpfY29tcCByZW5hbWVkIHRvICJjb21wIiBhcyBzdGFuZGFyZCBzdGF0ZXMgKHRoYW5rcyBUb2RkIEdyZWVyKQorCisgICAgICAgICogX2xpbWl0cy5jIDogYWRkZWQgY29ycmVjdCBkYXRhIG1lbWJlciByZXByZXNlbnRhdGlvbnMgZm9yIEFTNDAwIGFuZCBBbHBoYSBtYWNoaW5lcyAodGhhbmtzIEhvbGdlciBTdGFzaCkKKyAJCisJKiBfdmVjdG9yLmggOiBhZGRlZCBjaGVjayB0byBhdm9pZCBjYWxsaW5nIGFsbG9jYXRvcjw+OjpkZWFsbG9jYXRlKDApICh0aGFua3MgU3RlcGhlbiBDbGVhcnkpCisKKwkqIGNvbmZpZy9fcHJvbG9nLmgsIGNvbmZpZy9fZXBpbG9nLmggOiBhZGRlZCBwdXNoL3BvcCBwYWNrKDgpIHByYWdtYXMgZm9yIE1TVkMgKHRoYW5rcyBUb2RkIEdyZWVyLCBBbGJlcnRvIEJhcmJhdGkpCisgCQorCSogZ2NjLm1haydzIDogZGVmYXVsdCBzcGVsbGluZyBmb3IgIi1wdGhyZWFkcyIgb3B0aW9uIGNoYW5nZWQgdG8gIi1wdGhyZWFkIiBhcyBtb3JlIHBsYXRmb3JtcyB1c2UgdGhhdC4KKwkKKwkKK1RoZSBmb2xsb3dpbmcgY2hhbmdlcyB3ZXJlIG1hZGUgaW4gNC41IGJldGEgOCBzaW5jZSA0LjUgYmV0YSA3IDoKKwkKKwkqIHN0bC9fZnN0cmVhbS5jIDogX01fdW5kZXJmbG93IGJ1ZyBmaXggZm9yIGN1c3RvbSBjb2RlY3Z0IGZhY2V0cyAodGhhbmtzIEFsYmVydG8gQmFyYmF0aSkKKwkKKwkqIGJjYzU1Lm1hayA6IGNfbG9jYWxlLmMgYWRkZWQgdG8gdGhlIGxpbmsgY29tbWFuZCAodGhhbmtzIFN0ZXZlIExvdmVzKQorCQorCSogX2l0ZXJhdG9yX2Jhc2UuaCAmIG1hbnkgb3RoZXIgcGxhY2VzIDogaXRlcmF0b3IgdGFncyBhcmUgYmVpbmcgYWNjZXB0ZWQgYnkgY29uc3QgcmVmZXJlbmNlIAorCSAgIGluc3RlYWQgb2YgdmFsdWUsIHRvIGZpeCBzZWdtZW50YXRpb24gZmF1bHRzIGV4cGVyaWVuY2VkIG9uIGNlcnRhaW4gcGxhdGZvcm1zIHdpdGggYmV0YTcuCisJICBUaGF0IGFsc28gc2hvdWxkIGltcHJvdmUgZWZmaWNpZW5jeSBvbiBzYW1lIHBsYXRmb3JtcyAoYXBwYXJlbnRseSwgZW1wdHkgdW5yZWZlcmVuY2VkIAorCSAgb2JqZWN0cyB3aXRoIG5vIGNvbnN0cnVjdG9ycy9kZXN0cnVjdG9ycyB3ZXJlIGNvcGllZCBvbiB0aGUgc3RhY2sgd2hlbiBwYXNzZWQgYnkgdmFsdWUpLgorCSAgQWNjb21wYW5pZWQgY2hhbmdlIGVsaW1pbmF0ZXMgaGFyZGNvZGVkIGRlZmVyZW5jZSBoYWNrIHVzZWQgaW4gcHJldmlvdXMgYmV0YS4KKwkgIFRoYW5rcyBldmVyeWJvZHkgd2hvIHJlcG9ydGVkIHRoaXMuCisKKwkqIHN0bF91c2VyX2NvbmZpZy5oIDogYWRkZWQgX1NUTFBfR0NDX1VTRVNfR05VX0xEIHN3aXRjaC4gVGhpcyBpcyBmb3IgdGhvc2UgcGxhdGZvcm1zIAorCSAgd2hlcmUgbmF0aXZlIGxpbmtlciBkb2VzIG5vdCBsZXQgZ2NjIHRvIGltcGxlbWVudCBhdXRvbWF0aWMgaW5zdGFudGlhdGlvbiBvZiBzdGF0aWMgCisJICB0ZW1wbGF0ZSBkYXRhIG1lbWJlcnMgKFRydTY0LCBBSVgsIEhQLVVYKS4gCisJICBJdCBpcyBiZWluZyBwdXQgaW4gdGhpcyBmaWxlIGFzIHRoZXJlIGlzIG5vIGF1dG9tYXRpYyB3YXkgdG8gY2hlY2sgaWYgd2UgYXJlIHVzaW5nIEdOVSBsZCBvciBub3QuCisJCisJKiBfcmFuZ2VfZXJvcnMuaCA6IGRlcGFuZGFuY3kgb24gPHN0ZGV4Y2VwdD4gYW5kIDxzdHJpbmc+IHJlbW92ZWQgZm9yIG93biBpb3N0cmVhbXMgbW9kZQorCSh0aGFua3MgRG91ZyBHaWxiZXJ0KQorCisJKiBkZWJ1Zy9fbGlzdC5oIDogInR5cGVuYW1lIiBhZGRlZCBpbiBuZXcgbWV0aG9kcyAodGhhbmtzIERvdWcgR2lsYmVydCkKKworCSogX2NvbmZpZy5oLCBzcmMvY29tbW9uX21hY3Jvcy5tYWsgOiBiZXRhIHZlcnNpb24gbnVtYmVyIGJ1bXBlZCAKKwkJCisJKiBzcmMvZnRyZWFtLmNwcCwgY19sb2NhbGVfd2luMzIuYyA6IGZpeGVzIGZvciBVTklDT0RFIGNvbXBpbGF0aW9uICh0aGFua3MgVmFsbykKKworCSogc3RsX2djYy5oLCBldGMgOiBjaGFuZ2VzIGZvciBHQ0Mgc3VwcG9ydCBvbiBUcnU2NCAodGhhbmtzIFRvYmlhcyBFcm5zdCkKKworCSogX2FsbG9jLmMgOiBmb3IgTVMgVkMsIG1hbGxvY19kYmcgb25seSB1c2VkIHdoZW4gX1NUTFBfREVCVUdfQUxMT0MgaXMgc2V0LCBub3QgZm9yIGFsbCBkZWJ1ZyBjb25maWdzCisgCSAgKFRoYW5rcyBBbnRvbiBFcGhhbm92KQorCisJKiB0ZXN0L2VoL2djYy5tYWsgOiBkaXJlY3RvcmllcyBzdHVmZiBmaXhlZCAoVGhhbmtzIEJyb2RpZSkKKworCSogc3RsL19jb21wbGV4LmggOiBmaXhlZCBkZWNsYXJhdGlvbnMgZm9yIGxvbmcgZG91YmxlIHNwZWNpYWxpemF0aW9ucyAoVGhhbmtzIFRzdXRvbXUgWW9zaGlkYSkKKworCSogbG9jYWxlX2J5bmFtZS5jcHAsIGV0Yy4gOiBmaXhlcyBmb3IgQXBwbGUgY29tcGlsZXJzIGJ5IFRzdXRvbXUgWW9zaGlkYS4KKworCSogX2lvc19iYXNlLmggOiBfX2V2ZW5rIGlkIGNoYW5nZWQgbm90IHRvIGNsYXNoIHdpdGggTVMgVkMrKyA3ICh0aGFua3MgUGF1bCBHaGV6emkpCisKKwkqIF9mc3RyZWFtLmMgOiBhZGRlZCBiYXNpY19maWxlYnVmIGNvbnN0cnVjdG9yIHdvcmthcm91bmQgZm9yIGNvbXBpbGVyIHdoaWNoIGRvIG5vdCBpbml0aWFsaXplIGJ1aWx0aW5zCisJICB0byB6ZXJvIHdoZW4gZGVmYXVsdCBjb25zdHJ1Y3RlZCAodGhhbmtzIEFsYmVydG8gQmFyYmF0aSkKKworCSogX2xvY2FsZS5oIDogcmVsYXhlZCBndWVyZCBhcm91bmQgdGVtcGxhdGVkIGxvY2FsZSBjb25zdHJ1Y3RvciAodGhhbmtzIEFsYmVydG8gQmFyYmF0aSkKKworCSogc3RsX213ZXJrcy5oIDogY2hhbmdlcyB0byBhY2NvbW9kYXRlIENvZGVXYXJyaW9yIDYuMiAodGhhbmtzIGNwcm9zc2VyKQorCisJKiBzdGwvX2NtYXRoLmggOiBleHRyYWN0ZWQgZnJvbSA8Y21hdGg+IGZvciBiZXR0ZXIgZGVjb3VwbGluZworCisJKiBzdGwvX3N0ZF9wcm9sb2cuaCwgc3RsL19zdGRfZXBpbG9nLmggOiBob29rcyBmb3IgZnV0dXJlIGFsdGVybmF0aXZlIG5hbWVzcGFjZSBpbmNsdXNpb24gc3R5bGUuCisKKwkqIGNvbmZpZy9zdGxfZ2NjLmggOiBnY2MtMy4wIG5vdyBzdXBwb3J0ZWQKKworCSogc3JjL2djYy1iZW9zLmggOiBvbmx5IHN0YXRpYyBsaWJyYXJ5IGlzIGJlaW5nIGJ1aWx0IChkeW5hbWljIHN0aWwgZG9uJ3Qgd29yaykgKHRoYW5rcyBKb2huIE1hZGRvY2spCisKKwkqIHVzaW5nL2lvc3RyZWFtIDogaW5jbHVkZWQgdXNpbmcvaXN0cmVhbSBhbmQgdXNpbmcvb3N0cmVhbQorCisJKiBkbGxfbWFpbi5jcHAgOiBmb3JjZV9saW5rKCkgZml4IHRvIHByZXZlbnQgbnVtZXJpY19saW1pdHMgc3RhdGljIG1lbWJlcnMgYW5kIAorCSAgX01faW5jcmVtZW50L2RlY3JlbWVudCBmcm9tIF90cmVlLmMgZnJvbSBiZWluZyBvcHRpbWl6ZWQgb3V0IGJ5IFZDKysKKwkgICh0aGFua3MgU29mdXMgTW9ydGVuc2VuLCBBbGJlcnRvIEJhcmJhdGkgKQorCisJKiBfYWxsb2MuYyA6IGFkZGVkIENIRUNLX05VTExfQUxMT0MgZm9yIF9TVExQX0NIVU5LX0FMTE9DIHdpdGggbWFsbG9jLCB0byB0aHJvdyBleGNlcHRpb24gaWYgbWFsbG9jIHJldHVybnMgMCAodGhhbmtzIGdodW50KQorCisJKiBzdGxfYmMuaCwgPGV4Y2VwdGlvbj4gOiBmaXhlZCBCb3JsYW5kIEMrKyBpbXBvcnQgb2YgdW5leHBlY3RlZCBoYW5kbGVyIHN0dWZmCisKKwkqIHN0bF9pYm0uaCwgZXRjLiA6IGZpeGVzIGZvciBJQk0gVmlzdWFsQWdlIDUuMDIgdG8gY29tcGlsZQorCisJKiB0eXBlX3RyYWl0cy5oIDogYm9vbDJ0eXBlPD4gY2hhbmdlZCB0byBiZSBwYXJhbWV0ZXJpemVkIG9uIGludCwgdG8gd29yayBhcm91bmQgU1VOIENDIGJ1Z3MgKHByb2JhYmx5IG90aGVycywgdG9vKQorCQorVGhlIGZvbGxvd2luZyBjaGFuZ2VzIHdlcmUgbWFkZSBpbiA0LjUgYmV0YSA3IHNpbmNlIDQuMSBiZXRhIDYgOgorCisJKiBzcGFyY19hdG9taWMucyA6IGZpbGUgbWlzc2luZyBmcm9tIHRoZSBkaXN0cmlidXRpb24gcmVzdG9yZWQKKworCSogZXRjLyBzdWJkaXJlY3RvcnkgY3JlYXRlZDsgbWlzY2VsbGFub3VzIGZpbGVzIG1vdmVkIHRoZXJlCisKKwkqIFNUTHBvcnQgcG9ydGVkIHRvIEJlT3MsIGNvbXBsZXRlIHdpdGggaW9zdHJlYW1zICh0aGFua3MgSm9obiBNYWRkb2NrKSAKKwkKKwkqIE1hY3JvIF9TVExQX05PX1NHSV9JT1NUUkVBTVMgcmVuYW1lZCB0byBfU1RMUF9OT19PV05fSU9TVFJFQU1TLCBvbGQgcmVmZXJlbmNlcyB0byBTR0kgcmVtb3ZlZDsgCisJCisJKiAicHJlcGFyZSIgdGFyZ2V0IGFkZGVkIHRvIGFsbCBtYWtlZmlsZXMgaW4gc3JjLzsgc2hvdWxkIGJlIHJ1biBiZWZvcmUgdXNpbmcgU1RMcG9ydDsKKwkgIG9uIG1vc3QgcGxhdGZvcm1zIGl0J3MgZW1wdHksIG9uIHNvbWUgb2YgdGhlbSBpdCBjcmVhdGVzIG5lY2Vzc2FyeSBzeW1ib2xpYyBsaW5rcywgZXRjLgorCQorCSogc3RsL19kZXF1ZS5oIDogZGVxdWU8Pjo6ZXJhc2UgYnVnIChpbnRyb2R1Y2VkIGluIDQuMWI0KSBmaXhlZCAodGhhbmtzIHRvIEJydWNlRmxvcm1hbikgCisJICAgICAgICAgICAgICAgOiBkZWZhdWx0IHBhcmFtZXRlciBpbiBjb25zdHJ1Y3RvciBidWcgZml4ZWQgKFRoYW5rcyB0byBBbGV4IFZhbmljKSAKKworCSogc3RsX21zdmMuaCA6IGV4cGxpY2l0IHRlbXBsYXRlIGZ1bmN0aW9uIGFncnVtZW50cyBlbmFibGVkIGZvciBWQysrOyAKKworCSogc3RsX3dpbmNlLmggOiBhZGRlZCA8d2luZG93cy5oPiBpbmNsdXNpb24KKworCSogc3RsL19saW1pdHMuaCA6IG51bWVyaWNfbGltaXRzPGJvb2w+OjpkaWdpdHMgY2hhbmdlZCBmcm9tIDAgdG8gMSAoVGhhbmtzIE11a2VzaCBLYXBvb3IpCisKKwkqIHN0bC9fZnVuY3Rpb25fYmFzZS5oIDogYWRkZWQgX19pZGVudGl0eV9lbGVtZW50KCkgKGV4dGVuc2lvbiBuYW1lKSwgX251bWVyaWMuaCA6IHRoaXMgb25lIHVzZWQgaW5zdGVhZCBvZiBpZGVudGl0eV9lbGVtZW50KCkgKFRoYW5rcyBIYWZlZXopCisgCisJKiBzdGxfbXN2Yy5oIDogZXhwbGljaXQgdGVtcGxhdGUgZnVuY3Rpb24gYWdydW1lbnRzIGVuYWJsZWQgZm9yIFZDKys7IAorCisJICB1c2VfZmFjZXQ8PiBub3cgZnVsbHkgY29uZm9ybXMgdG8gdGhlIHN0YW5kYXJkIHdpdGggVkMrKy4gKFRoYW5rcyBKZWZmIEtvaG4gZm9yIHRoZSBpbnB1dCkKKworCSogZnN0cmVhbS5jcHAgOiBMQVJHRV9JTlRFR0VSIHVzZWQgdG8gd29yayBhcm91bmQgSW50ZWwgc2hpZnQgaW5zdHJ1Y3Rpb24gYnVnICh0aGFua3MgVGhvbWFzIE1laXNjaG5lcikKKwkqIGZzdHJlYW0uY3BwIDogVUxMIG1hY3JvIGZpeGVkIGZvciBXaW4zMgorCSogZnN0cmVhbS5jcHAgOiBBZGRlZCB0ZXN0IGZvciBmb3IgSU5WQUxJRF9IQU5ETEVfVkFMVUUgYW5kIE5VTEwgYmFzZSBhbmQgX01fdmlld19pZCwKKyAJICBmb3IgX01fY2xvc2Ugb24gV2luMzIgKFRoYW5rcyBTdGVwaGVuIEJha2VyKQorCSogZnN0cmVhbS5jcHAgOiBGaXhlZCBjb3JuZXIgY2FzZSB3aXRoIG1tYXAoKSBvbiBFT0YgKFRoYW5rcyBKZW5zIE1hdXJlcikKKworICAgICAgICAqIF9pc3RyZWFtLmMgOiBmaXhlZCBfTV9yZWFkX2J1ZmZlcmVkIHNzc3NvIHRoYXQgaXQgZG9lcyBub3Qgc2tpcCBkZWxpbWl0ZXJzIChUaGFua3MgR2VyZCBIb2VyZW4pCisJCisJKiBzdGwvX3N0cmluZy5oIDogb3BlcmF0b3IgX19zdGRfc3RyaW5nKCkgdXNlcyBjb25zdHJ1Y3RvciB3aXRoIGEgc2l6ZSB0byBjb3JyZWN0bHkgaW5pdGlhbGl6ZSBzdHJpbmcgY29udGFpbmluZyBudWxsIGNoYXJzIChUaGFua3MgQXJtaW4pCisJCisJKiBpb21hbmlwIDogYWRkZWQgb3BlcmF0b3IgZm9yIHNldGZpbGwgb2JqZWN0IGFuZCBpc3RyZWFtICh3YXMgb3N0cmVhbSBvbmx5KSAoVGhhbmtzIE11a2VzaCBLYXBvb3IpCisJCisJKiBzdGwvX2xvY2FsZS5oICwgc3RsX2ludGVsLmggOiBmaXhlcyBmb3IgSW50ZWwgNS4wIGNvbXBpbGVyIChUaGFua3MgQW50b24gYW5kIE1hcmNlbGxvIFBpZXRyb2JvbikKKworCSogc3RsX3NvbGFyaXMuaCA6IGFkZGVkIF9TVExQX05PX05BVElWRV9XSURFX0ZVTkNUSU9OUworCQorCSogTmV3IG1ha2VmaWxlcyBhZGRlZCBmb3IgSW50ZWwgQysrIDUuMCBhbmQgVkMrKyA2LjAgaW4gc3JjLywgdGVzdC9laCwgdGVzdC9yZWdyZXNzaW9uIChUaGFua3MgdG8gTWFyY2VsbG8gUGlldHJvYm9uKQorCisJKiBfU1RMUF9OT19MT05HX0RPVUJMRSBjYXNlIGhhbmRsZWQgZm9yIFNUTHBvcnQgaW9zdHJlYW1zIGFzIHdlbGwgKHRoYW5rcyBKb2huIERhbmllbCkKKwkKKwkqIFNVTiBDQyBjb21waWxlciB0ZW1wbGF0ZSBjYWNoZSBpcyBiZWluZyBwcm9wZXJseSBjbGVhbmVkIHVwIChUaGFua3MgV2hpdG5leSBLZXcpCisKKwkqIGRsbF9tYWluLmNwcCA6IGFkZGVkIGV4dGVybiAiQyIgYXJvdW5kIERsbE1haW4oKSAoVGhhbmtzIERhbm55IFNtaXRoKQorCQorCSogdHlwZV90cmFpdHMuaCA6IGFkZGVkIGJvb2wgcGFyYW1ldGVyIHRvIHNodXQgdXAgd2FybmluZ3Mgb24gc29tZSBjb21waWxlcnMgKFRoYW5rcyBnbGFzc21hbikKKwkKKwkqIHN0bC9fcm9wZS5oLy5jLCBzcmMvbXJjcHAubWFrLCBzcmMvbXJjLm1haywgc3RsL190cmVlLmggOiBNUFcgJiBNUkMgZml4ZXMgYnkgVHN1dG9tdSBZb3NoaWRhCisKKwkqIHN0bF9nY2MuaCA6IGFkZGVkIHBhdGggZm9yIDxleGNlcHRpb25zPiBldCBhbCBmb3IgZ2NjLTIuOTUuMyBvbiBGcmVlQlNEIChUaGFua3MgdG8gCisJCisJKiBfdHJlZS5oIC9fdHJlZS5jIDogcG9pbnRlcnMgdXNlZCBhcyByZXR1cm4gdmFsdWVzIGluc3RlYWQgb2YgaXRlcmF0b3JzIGZvciBpbXBsZW1lbnRhdGlvbiAKKwkgIGZ1bmN0aW9ucywgZm9yIGVmZmljaWVuY3kuCisKKwkqIF9hbGdvLmgvLmMgOiBhZGRlZCBsZWFkaW5nIHVuZGVyc2Nyb3JlIHRvIHNvbWUgc3ltYm9scyAoVGhhbmtzIHRvIEVkIEphbWVzLUJlY2tlcm1hbiBmb3IgdGhlIHJlcG9ydCkKKwkKKwkqIGRsbF9tYWluLmNwcCA6IGZpeGVkIG5vdGhyb3cgb2JqZWN0IGluaXRpYWxpemF0aW9uIChUaGFua3MgdG8gRGFuIEluZ29sZCkKKworCSogYmV0YSBzdWZmaXggaW4gY29tbW9uX21hY3Jvcy5tYWsgdXBkYXRlZCAodGhhbmtzIHRvIFdoaXRuZXkgS2V3KQorCisJKiBjX2xvY2FsZV93aW4zMi5jIDogaW5jb21wbGUgZml4IGZvciBsb2NhbGUgY29tcGxldGVkICh0aGFua3MgdG8gQWxiZXJ0byBCYXJiYXRpKQorCisJKiBjX2xvY2FsZS5oIDogX0xvY2FsZV9BTFBIQSBkZWZpbml0aW9uIGZvciBWQysrIGFuZCBtaW5ndzMyIGZpeGVkICh0aGFua3MgRGFubnkgU21pdGgpCisJCisJKiBfdGhyZWFkcy5oIDogZml4ZWQgX0RFQ1RIUkVBRFMgYmxvY2sgdG8gd29yayBvbiBib3RoIERFQyBhbmQgSFAKKworCSogX2hhc2hfc2V0LmggOiBmaXhlZCB0eXBvIGluIE1TVkMrKyBidWcgd29ya2Fyb3VuZCAoIFRoYW5rcyB0byBKb25fSGFuc29uIGZvciB0aGUgcmVwb3J0KQorCisJKiBzdGxwb3J0L3N0cnN0cmVhbS5oIDogZml4ZWQgaW5jbHVzaW9uIGZvciBNU1ZDIDYgKFRoYW5rcyAgSm9hY2hpbSBBY2h0emVobnRlcikKKwkKKwkqIF9jb25maWcuaCA6IF9TVExQX1JFVEhST1cgY2hhbmdlZCB0byBhdm9pZCB3YXJuaW5ncyB3aXRoIE5PX0VYQ0VQVElPTlMgKHRoYW5rcyBSaWNobW9uZCkJCisKKwkqIF9oYXNodGFibGUuYyA6IHByaW1lIGxpc3QgZGVmaW5pdGlvbiBtYWRlIGNvbnNpc3RlbnQgKHRoYW5rcyBSYWluZXIgU2Nobml0a2VyKQorCisJKiBzdGxfaHBhY2MuaCA6ICBfU1RMUF9GT1JDRV9BTExPQ0FUT1JTIHdvcmthcm91bmQgdXNlZCBmb3IgVmVyc2lvbiAzLjE1IGFsc28gKHRoYW5rcyBSYWluZXIgU2Nobml0a2VyKQorCisJKiBzdGwvX3N0cmluZ19pby5jIDogZml4ZWQgdXNpbmcgZGlyZWN0aXZlIGluIG9wZXJhdG9yID4+KCkgKHRoYW5rcyBSYWluZXIgU2Nobml0a2VyKQorCisJKiBkZWJ1Zy9fZGVxdWUuaCA6IGEgY2hlY2sgaW4gZXJhc2UoKSBmaXhlZCAodGhhbmtzIEFuZHJlYXMgTWFsemFobikKKworCSogZGVidWcvX2xpc3QuaCA6IGFkZGVkIHJlbW92ZSgpIHRvIGRvIGl0ZXJhdG9yIGludmFsaWRhdGlvbjsgcmFuZ2UgZXJhc2UoKSBmaXhlZCB0byBkbyBpbnZhbGlkYXRpb24KKworCSogc3RsX3dhdGNvbS5oIDogYWRkZWQgc3dpdGNoZXM7IGRpc2FibGVkIG93biBpb3N0ZXJhbXMgYnkgZGVmYXVsdDsgCisJICAgICAgICAgICAgICAgICBlbmFibGVkIC0+KCkgb3BlcmF0b3IgZm9yIGl0ZXJhdG9ycyAodGhhbmtzIFN0ZXZlbiBHcmVlbikKKworCSogPGV4Y2VwdGlvbj4gOiBhZGRlZCB0aHJvdyBzcGVjIGZvciB3aGF0KCk7IHN0bF9zZ2kuaCA6IG1hZGUgX1NUTFBfTk9fRVhDRVBUSU9OUyBkZXBlbmQgb24gX19FWENFUFRJT05TIG1hY3JvIChUaGFua3MgQW50b24gRXBoYW5vdikKKworCSogX3N0cmluZ19pby5jIDogb3BlcmF0b3IgPDwgOiBmaXhlZCB3aWR0aCgpIGludGVycHJldGF0aW9uIGJ1ZworCisJKiBzdGxfaHBhY2MuaC9jbWF0aCA6IGZpeGVkIEhQIGFDQyBzZXR0aW5ncyBmb3IgLUFBIG9wdGlvbiAodGhhbmtzIERvdWcgR2lsYmVydCkgCisKKworCQorVGhlIGZvbGxvd2luZyBjaGFuZ2VzIHdlcmUgbWFkZSBpbiA0LjEgYmV0YSA2IHNpbmNlIDQuMSBiZXRhIDUgOgorCisJKiBfaXN0cmVhbS5oLCBfb3N0cmVhbS5oLCBfaW9zLmgsIF9mc3RyZWFtLmggOiBndWFyZCBtYWNyb3MgZml4ZWQgdG8gbm90IGNsYXNoIHdpdGggLmggZmlsZXMgaW4gInN0bHBvcnQiIGRpcmVjdG9yeQorCSAgQWxzbyBhbGwgdXNlcyBvZiB0aG9zZSBtYWNyb3MgZml4ZWQuICh0aGFua3MgdG8gR2VyZCBIb2VyZW4gZm9yIHRoZSByZXBvcnQpCisKKwkqIF9kZWJ1Zy5jL19kZWJ1Zy5oIDogZml4ZWQgc3dhcCgpIGZvciByYl90cmVlIGFuZCBsaXN0ICh0aGFua3MgdG8gR2VyZCBIb2VyZW4gZm9yIHRoZSByZXBvcnQpCisJICBzd2FwKCkgY2hhbmdlZCBub3QgdG8gaW52YWxpZGF0ZSBhbnkgaXRlcmF0b3JzLCBhcyBwcmVzY3JpYmVkIGJ5IHRoZSBzdGFuZGFyZCAKKworCSogZm9yY2VkIF9SRUVOVFJBTlQgdG8gYmUgZGVmaW5lZCB3aGVuIGNvbXBpbGluZyB3aXRoIFNUTHBvcnQgaW9zdHJlYW1zIGFuZCBfU1RMUF9ERUJVRworCSAgKHdpdGhvdXQgX1NUTFBfREVCVUcgaXQgc2VlbXMgdG8gYmUgYmluYXJ5IGNvbXBhdGlibGUgZXZlbiB3aXRob3V0IHRoYXQpCisJCisJKiBmYWNldHNfYnluYW1lLmNwcCBzb3VyY2UgaW50cm9kdWNlZCB0byByZXBsYWNlIGFsbCB4eF9ieW5hbWUuY3BwIGZpbGVzOworIAkgIHJlc3RvcmVkIHNlcGFyYXRlIGZhY2V0cyAuY3BwIGNvbXBsaWxhdGlvbiAodGhleSB1c2VkIHRvIGJlIGluY2x1ZGVkIGluIGxvY2FsZV9pbXBsLmNwcCkKKworCSogaW50cm9kdWNlZCBfU1RMUF9VU0VfUEVSVEhSRUFEX0FMTE9DIHRvIG9wdGlvbmFsbHkgdXNlIHBlci10aHJlYWQgYWxsb2NhdG9yIAorCSAgKF9QdGhyZWFkX2FsbG9jIGZyb20gX3B0aHJlYWRfYWxsb2MuaCkgYXMgdGhlIGRlYWZ1bHQgbm9kZSBhbGxvY2F0b3IuIE9ubHkgd29ya3Mgd2l0aCBwdGhyZWFkcyBmb3Igbm93LgorCSAgCisJKiBTd2l0Y2hlcyBfU1RMUF9ET05UX1JFREVGSU5FX1NURCBhbmQgX1NUTFBfV0hPTEVfVkVOT1JfU1REIGFyZSBiYWNrICh0aGFua3MgdG8gIEFudG9uIEVwaGFub3YgZm9yIHRoZSByZXBvcnQpCisJCisJKiBfdmVjdG9yLmggOiBmaXhlZCBidWcgaW4gdGVtcGxhdGUgdmVyc2lvbiBvZiBpbnNlcnQgKFRoYW5rcyB0byBZb3RhbSBNZWRpbmkgZm9yIHRoZSByZXBvcnQpCisJCisJKiBtb25ldGFyeS5jcHAgOiB1bm5lZGVkIGhhY2sgZm9yIGN5Z3dpbiByZW1vdmVkICh0aGFua3MgdG8gRGVhbiBTdHVydGV2YW50KSAKKworCSogPGlvc3RyZWFtPiA6IGZpeGVkIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgbWFjcm8KKworCSogY2luL2NvdXQvY2VyciByZWRlZmluZWQgaWYgbm8gbmFtZXNwYWNlcyBhbmQgU0dJIGlvc3RyZWFtcyBhcmUgdXNlZCwgZm9yIGFsbCBjb21waWxlcnMsIGp1c3QgaW4gY2FzZS4gCisJKiBfc3BhcmNfYXRvbWljLmggOiBmaXhlZCBhbmQgaW1wcm92ZWQgYXRvbWljIG9wcyBmb3IgZ2NjCisKKwkqIHRlc3QvcmVncmVzc2lvbiA6IG5vbi1iYWNrd2FyZC1jb21wYXRpYmxlIG9sZC1zdHlsZSBfX1NUTF94eCBtYWNyb3MgdXNlIGNoYW5nZWQgdG8gX1NUTFBfeHgKKworCSogY29uZmlnL3N0X2djYy5oIDogZGlzYWJsZWQgbm9uLXN0YW5kYXJkICJleHRlcm4iIHVzZSBmb3Igbm9uLURMTCB0ZW1wbGF0ZXMgCisKKwkqIG1pbmd3MzIgLSB1c2VkICd3aW5kb3dzLmggcmVwbGFjZW1lbnQnIHNlY3Rpb24gaW4gX3RocmVhZHMuaCAodGhhbmtzIHRvIERhbm55IFNtaXRoKQorCisJKiBsb2NhbGUgV2luMzIgYnVnIGZpeGVkICh0aGFua3MgdG8gQWxiZXJ0byBCYWxiYXJ0aSkKKworCSogbWluZ3czMiA6IF9TVExQX0NPTlNUX0lOSVRfQlVHIGRlZmluZWQgZm9yIGRsbCAodGhhbmtzIHRvIERhbm55IFNtaXRoKQorCisJKiAibWFrZSBjbGVhbiIgZ2xpdGNoZXMgZml4ZWQgKHRoYW5rcyB0byBXaGl0bmV5IEtldyBmb3IgdGhlIHJlcG9ydCkKKworCSogX2ZzdHJlYW0uYyA6IGZpeGVkIGNvZGVjdnQgYnVnIGZvciB2YXJpYWJsZSB3aWR0aCBlbmNvZGluZworCisJKiBfU1RMUF9BQk9SVCBtYWNybyBpbnRyb2R1Y2VkIHRvIGF2b2lkIGNsYXNoZXMgd2l0aCB0aGlyZC1wYXJ0eSBzdyByZWRlZmluaW5nIGFib3J0KCkgKHRoYW5rcyB0byBKZXJyeSkKKworCSogY19sb2NhbGVfd2luMzIgOiBmaXhlZCBwYXJzZSBidWcgaW4gX19QYXJzZUxvY2FsZVN0cmluZyAodGhhbmtzIHRvIERhbm55IFNtaXRoKQorCisJKiBleHRyYSBkZWNsc3BlY3MgcmVtb3ZlZCBmcm9tIHRlbXBsYXRlcyB0byBmaXggVkMrKyA3LjAgOyBvbmx5IGNvbmNyZXRlIGNsYXNzZXMgaGF2ZSBzcGVjaWZpZXJzICh0aGFua3MgdG8gSG9sZ2VyIFN0YXNjaCBmb3IgdGhlIHJlcG9ydCkKKworCSogc3RsX21zdmMuaCwgX2hhc2h0YWJsZS5oLy5jIDogZml4ZXMgZm9yIElBNjQgY29tcGlsYXRpb24gKHRoYW5rcyB0byBSYWluZXIgU2Nobml0a2VyICkKKworCSogZml4ZWQgYnVncyBpbiAibWFrZSBpbnN0YWxsIiBvbiBVbml4ICh0aGFua3MgdG8gQ2FybG9zIFBhbmlhZ28pCisKKwkqIGRsbF9tYWluLmNwcCA6IERpc2FibGVUaHJlYWRMaWJyYXJ5Q2FsbHMgdXNlZCBmb3Igb3B0aW1pemF0aW9uICh0aGFua3MgdG8gQWxiZXJ0byBCYXJiYXRpKQorCQorCSogZGxsX21haW4uY3BwIDogYSBkdW1teSBmdW5jdGlvbiBhZGRlZCB0byBmb3JjZSA8bGltaXRzPiBndXRzIGZvciBzdGF0aWMgVkMrKyBsaW5rICh0aGFua3MgdG8gQWxiZXJ0byBCYXJiYXRpKQorCisJKiBnY2MtbGludXgubWFrIDogZmxhZ3MgZml4ZWQgKHRoYW5rcyB0byBMZXZlbnRlIEZhcmthcyApCisKKwkqIHN0bF9tc3ZjLmgsIHN0bF9pbnRlbC5oIDogZml4ZWQgX19JQ0wgdmVyc2lvbiB0ZXN0ICh0aGFua3MgdG8gU2VyZ2UgUGFzaGtvdikKKworCSogdmVyc2lvbmluZyBzY2hlbWEgY2hhbmdlZCBvbiBXaW5kb3dzIHRvIGhhdmUgLmRsbCBleHRlbnNpb24gKHRoYW5rcyBldmVyeWJvZHkgZm9yIHRoZSBmZWVkYmFjaykKKworCSogTmV0QlNEIG1ha2VmaWxlcyBmaXhlZAorCisJKiBBIGJ1bmNoIG9mIGZpeGVzIGJ5IFRzdXRvbXUgWW9zaGlkYSA6IE1QVyBmaXhlcyBwbHVzIDoKKwkqIHN0bC9fY29uZmlnLmggOiBJIGJlbGlldmUgdGhlIGRlZmluaXRpb24gZm9yIF9TVExQX1NURCB1bmRlciBkZWJ1Zy9ub24tZGVidWcgY29uZmlndXJhdGlvbnMgc3dhcHBlZC4KKworCSogdHlwZWluZm8uaCA6IGFkZGVkIGNoZWNrIGZvciBfU1RMUF9OT19ORVdfSEVBREVSIGZvciB1c2luZyBkZWNsYXJhdGlvbi4KKyAgICAgICAgICBPdGhlcndpc2UgdGhyZWUgY2xhc3NlcyB3aWxsIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgbmFtZXNwYWNlIHN0ZCB3aGVuICNpbmNsdWRlIDx0eXBlaW5mbz4uCisKKwkqIF9pc3RyZWFtLmMgOiB1c2Ugb2YgYmluZDJuZCAod2hpY2ggcmVxdWlyZWQgX2Z1bmN0aW9uLmggaW5jbHVzaW9uKSBjaGFuZ2VkIHRvIHVzZSBhbHRlcm5hdGUgZnVuY3RvciAodGhhbmtzIHRvIFNlcmdlaSBOaWtvbGFldikKKyAJCisJKiBzdGxfbXN2Yy5oIDogcmVtb3ZlZCBlcnJvbmVvdXMgX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCBzZXR0aW5nIHdoaWNoIGNhdXNlZCBtYWpvciBjb2RlIGJsb2F0IGZvciBuYXRpdmUgc3RyZWFtcyBidWlsZHMgb24gVkMrKyAoVGhhbmtzIHRvIEpvaGFubmVzIEJydW5lbiBmb3IgdGhlIHJlcG9ydCkKKworCSogX3N0cmluZ19pby5jIDogZml4ZWQgSW50ZWwgQysrIGNvbXBpbGF0aW9uIGJ1ZyBpbiBuYXRpdmUgc3RyZWFtcyBtb2RlCisKKwkqIGZzdHJlYW0uY3BwIDogYWRkZWQgd3JpdGUtc2hhcmluZyBmb3IgZnN0cmVhbSBmaWxlIGhhbmRsZSAoVGhhbmtzIHRvIExlbGFuZCBCZXN0KQorCisJKiBzdGxfZ2NjLmggOiBkaXNhYmxlZCB3aWRlIGZ1bmN0aW9uIGltcG9ydHMgZm9yIGxpbnV4IChzb21lIHh4X1BPU0lYIG1hY3JvIHNob3VsZCBiZSByZWFsbHkgdXNlZDsgZGlzYWJsZWQgZm9yIGFsbCBsaW51eGVzIGZvciBub3cpLiBUaGFua3MgZXZlcnlib2R5IGZvciB0aGUgcmVwb3J0cy4KKworCSogS0FJIEMrKyA0LjAgaXMgbm93IHN1cHBvcnRlZCBvbiBTVU4KKworCSogTUFDIE9TIFggY29tcGlsYXRpb24gZml4ZWQgKHRoYW5rcyBQYXRyaWNrIEx1YnkgZm9yIHRoZSBwYXRjaCkKKworCSogSFAgYUNDIGZpeGVzIGJ5IE1pY2hhZWwgVHNpcmtpbgorCQorCSogIklORi9OQU4iIHN0cmluZyByZXByZXNlbnRhdGlvbiBmb3IgdXBwZXJjYXNlIGNoYW5nZWQgdG8gIkluZi9OYU4iIHRvIGJlaGF2ZSBsaWtlIHByaW50ZigpIG9uIG1vc3Qgc3lzdGVtcy4KKwkKKwkqIGRlYnVnL19pdGVyYXRvci5jIDogZml4ZWQgU1VOIDYuMCBjb21waWxlciBpbnRlcm5hbCBlcnJvciAKKworCSogdHlwZWluZm8uaCA6IGdsb2JhbCBzY29wZSB1c2VkIHRvIGltcG9ydCBiYWRfY2FzdCwgZXRjLiAodGhhbmtzIHRvIFZhbCBNZWxhbWVkKQorCQorCSogZGVidWcvX2xpc3QuaCA6IG1pc3NpbmcgdGVtcGxhdGUgdmVyc2lvbnMgb2YgcmVtb3ZlX2lmKCksIG1lcmdlKCkgYWRkZWQuIE1pc3NpbmcgcmVndWxhciBzb3J0KCkgYWRkZWQuCisJIChUaGFua3MgdG8gZGdlaHJpKQorCisJKiBkZWJ1Zy9fc2xpc3QuaCA6IG1pc3Npbmcgc29ydCgpICh0ZW1wbGF0ZSBhbmQgcmVndWxhcikgaW50ZXJmYWNlIGFkZGVkCisKKwkqIF9pc3RyZWFtLmggOiBlbGltaW5hdGVkIHdhcm5pbmcgYWJvdXQgY29tcGFyaXNvbiB3aXRoIHVuc2lnbmVkIChUaGFua3MgdG8gR2VyZCBIb2VyZW4gZm9yIHRoZSByZXBvcnQpCisKKwkqIHRlbXBsYXRlIGNvbnN0cnVjdG9ycyBmb3IgY29udGFpbmVycyBjaGFuZ2VkIHRvIGJlIG9uZSB2ZXJzaW9uIHdpdGggZGVmYXVsdCBhbGxvY2F0b3IgYWdydW1lbnQsIHdoZXJlIHBvc3NpYmxlLgorCQorICAgICAgICAqIHJlbWFpbmluZyBfU1RMXyBwcmVmaXhlcyBjaGFuZ2VkIHRvIF9TVExQXworCQorCSogU29sYXJpcyA3IGNvbXBpbGF0aW9uIGZpeGVkCisKKyAgICAgICAgKiBmc3RyZWFtLmNwcCA6IHNlZWsoKSBhbGxvd2VkIHRvIHNlZWsgcGFzdCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0gKFRoYW5rcyB0byBQaGlsbGlwIFRvbGFuZCBmb3IgdGhlIGlucHV0KQorVGhlIGZvbGxvd2luZyBjaGFuZ2VzIHdlcmUgbWFkZSBpbiA0LjEgYmV0YSA1IHNpbmNlIDQuMSBiZXRhIDQgOgorCisJKiBBbGwgaW50ZXJuYWwgbWFjcm9zIGNoYW5nZWQgdG8gaGF2ZSBwcmVmaXggX1NUTFBfIGluc3RlYWQgb2YgX19TVEwgb3IgX19TVExQT1JUIG9yIF9fU0dJX1NUTC4KKyAgICAgICAgICBUaGF0IGlzIHRvIGFsbG93IHNlYW1sZXNzIHdyYXBwaW5nIG9uIHBsYXRmb3JtcyB0aGF0IHVzZSBTR0kgU1RMIGFzIG5hdGl2ZSBTVEwvaW9zdHJlYW1zLgorCSAgRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIG1vc3Qgb2YgdXNlci1zZXR0YWJsZSBfX1NUTF94eHggbWFjcm9zIGFyZSBhY2NlcHRlZC4KKworCSogVmVyc2lvbmluZyBvZiBzaGFyZWQgbGlicmFyaWVzIG1hZGUgVU5JWC1jb21wbGlhbnQKKworCQorCSogU29tZSB0ZW1wb3JhcnkgbGlmZXRpbWUgcHJvYmxlbXMgaW4gU0dJIGlvc3RyZWFtcyB3aGljaCBtYXkgaW50cm9kdWNlIG1lbW9yeSBjb3JydXB0aW9uLCBmaXhlZC4KKworICAgICAgICAqIDxuZXc+IDogZml4ZWQgbWVtb3J5IGxlYWsgYnVnIGR1ZSB0byB1bmNsZXZlciBtYWNybyBleHBhbnNpb24gaW4gX19zdGxfbmV3ICh0aGFua3MgdG8gSm9hY2hpbSBBY2h0emVobnRlcikKKworCSogc3RsL190cmVlLmggOiBmaXhlZCBzZXZlcmFsIGJ1Z3MgaW4gbmV3IGNvZGUgZm9yIGNvcm5lciBjYXNlcyBpbiBpbnNlcnRfZXF1YWwoKS9pbnNlcnRfdW5pcXVlKCkgd2l0aCBhIGhpbnQgCisJICAodGhhbmtzIHRvIE1pY2hlYWwgVHNpcmtpbiBmb3IgdGhlIHJlcG9ydCBhbmQgcGF0Y2gpCisKKwkqIF92ZWN0b3IuaDoyODQgOiBfX2NvcHkgY2FsbCBmaXhlZCB0byBiZSBfX2NvcHlfYXV4ICh0aGFua3MgdG8gQWxleCBWYW5pYykKKworCSogX2NvbmZpZy5oIDogZml4ZWQgc3RhdGljIGJ1aWxkIGJ1ZyBkdWUgdG8gIF9fU1RMX0VYUE9TRV9HTE9CQUxTX0lNUExFTUVOVEFUSU9OIHR5cG8gKHRoYW5rcyB0byBTZXJnZSBQYXNoa292KQorCQorCSogZnN0cmVhbS5jcHA6IF9fcGlvaW5mbyBkZWZpbml0aW9uIGZvciBtaW5ndzMyIGZpeGVkIChUaGFua3MgdG8gRGFubnkgU21pdGgpCisKKwkqICouU1VOV0NDaCBmaWxlcyBjaGFuZ2VkIHRvIHJlZ3VsYXIgZmlsZXM7IG1vdmVkIHRvICJzdGxwb3J0IiBkaXJlY3RvcnkKKworCSogcHRocmVhZF9hbGxvYyA6IHNwbGl0IGludG8gPHB0aHJlYWRfYWxsb2M+LzxzdGwvX3B0aHJlYWRfYWxsb2MuaD4KKworCSogbGlnaHR3ZWlnaHQgYXRvbWljIG9wcyB1c2VkIG9uIFNQQVJDIHY4cGx1cyBhbmQgdjkgKGdjYyBhbmQgU1VOIENDKQorCQorCSogTWFjIE9TIFggc3VwcG9ydCBpbnRyb2R1Y2VkICh0aGFua3MgdG8gUGF0cmljayBMdWJ5KSAKKworCSogU0dJIGlvc3RyZWFtcyBwb3J0ZWQgdG8gREpHUFAgKHRoYW5rcyB0byBUYW5lcyBTcml2aXJvb2xjaGFpKQorCisJKiBTR0kgaW9zdHJlYW1zIHBvcnRlZCB0byBOZXRCU0QgKHRoYW5rcyB0byBNaWNoYWVsIFJhdWNoKQorCisJKiBGcmVlQlNEIGJ1aWxkIGZpeGVkLCBub3cgYnVpbGRzIGZvciB3Y2hhcl90IHRvbworCisJKiBERUMgQ1hYIGJ1aWxkIGZpeGVkOyByZXN0cmljdGVkIHRvIGR5bmFtaWMgbGliIG9ubHkKKworCSogU0dJIE1JUFNwcm8gYnVpbGQgZml4ZWQ7IEdOVSBtYWtlIGhhcyB0byBiZSB1c2VkCisKKwkqIFNldCBvZiBIUCBmaXhlcyBieSBNaWNoYWVsIFRzaXJraW4KKworCSogU2V0IG9mIFdhdGNvbSBmaXhlcyBieSBSaWNhcmRvIEdheW96bworCisJKiBCdW5jaCBvZiBBcHBsZSBNUkMvTVBXIGZpeGVzIGJ5IFRzdXRvbXUgWW9zaGlkYSBpbnRlZ3JhdGVkCisJCisJKiBCdW5jaCBvZiBpb3N0cmVhbSBmaXhlcyBmb3IgQ3lnd2luLCBCb3JsYW5kIGFuZCBJbnRlbCA0LjUsIGJ5IFNlcmdlIFBhc2hrb3YJCisJCisJKiBkZWJ1Zy9fbGlzdC5oIDogYWRkZWQgY2hlY2tpbmcgdmVyc2lvbnMgb2YgcG9wX2JhY2svcG9wX2Zyb250ICh0aGFua3MgdG8gUGVyIExpYm9yaXVzc2VuKQorCisJKiBzcmMvY19sb2NhbGVfd2luMzIuYyA6IGZpeCBmb3IgVkM1c3AzICh0aGFua3MgdG8gUGV0ciBPdnRjaGVua292KSwgZml4IGZvciBkYXkgb2Ygd2VlayBvcmRlciAodGhhbmtzIHRvIERhbm55IFNtaXRoKSwKKwkgIGZpeCBmb3IgbnVsbC10ZXJtaW5hdGlvbiBpbiBteV9sdG9hICh0aGFua3MgdG8gU2VyZ2UgUGFzaGtvdikKKwkKKwkqIFNvbWUgd2FybmluZ3MgaW4gZGVidWcgbW9kZSBmaXhlZCAodGhhbmtzIHRvIE1hcmNvKQorCisJKiB0eXBlX3RyYWl0cy5oIDogSXNQIGZ1bmN0aW9ucyByZXR1cm4gdHlwZXMgY2hhbmdlZCB0byBiZSBtb3JlIHBvcnRhYmxlICh0aGFua3MgdG8gU2VyZ2UgUGFzaGtvdiBmb3IgdGhlIHN1Z2dlc3Rpb24pLAorCSAgX19jZGVjbCBhZGRlZCBmb3IgV2luICh0aGFua3MgdG8gVG9kZCBXaWxzb24pCisKKwkqIGRlYnVnL190cmVlLmggOiBhZGRlZCBvd25lciBjaGVjayBmb3IgZXJhc2UoKSAodGhhbmtzIHRvIEFsYmVydG8gQmFyYmF0aSkKKworCSogc3RsL19vc3RyZWFtLmggOiA8PCBvcGVyYXRvciBzcGVjaWFsaXphdGlvbnMgYWRkZWQgZm9yIGNvbXBpbGVycyB3L28gcGFydGlhbCBvcmRlcmluZyAKKwkgICh0aGFua3MgdG8gQWxiZXJ0byBCYXJiYXRpIGZvciBwb2ludGluZyB0aGlzIG91dCkuCisKKwkqICJtYWtlIGluc3RhbGwiIG9uIFVOSVggOiBmaXhlZCB0aGUgdGFyZ2V0IG5vdCB0byByZW1vdmUgbGliIGRpcmVjdG9yeTsgCisJICAgZGVmYXVsdCBpbnN0YWxsZGlyIHJlc3RvcmVkIHRvIGJlIC91c3IvbG9jYWwgKHRoYW5rcyB0byBKZWZmIGRlIFZyaWVzIGZvciB0aGUgaW5wdXQpCisJCisJKiBfY29uc3RydWN0LmggOiBleHRyYSBjYXN0IGZvciBfX1NUTF9TSFJFRF9CWVRFIHJlbW92ZWQgKHRoYW5rcyB0byBraGVzaW4pCisJCisgCSogX3JlbG9wcy5oIGhlYWRlciBvYnNvbGV0ZWQ7IHNvbWUgZXh0cmEgaW5jbHVkZXMgcmVtb3ZlZAorCisJKiBfX1NUTF9TVEFUSUNfQ09OU1RfSU5JVF9CVUcgdXNlIG5vcm1hbGl6ZWQ7IG5vdyBpdCdzIHVzZWQgZm9yIGFsbCBjb21waWxlcnMgbm90IGFibGUKKwkgIHRvIHRyZWF0IGNvbnN0IG1lbWJlcnMgYXMgY29wbGlsZS10aW1lIGNvbnN0YW50czsgZW51bSB1c2VkIGZvciB0aGVtIChlLmcgVkMrKykuCisJICBUaGFua3MgdG8gIERlYW4gU3R1cnRldmFudCBhbmQgR2F2aW4gQ29sbGlucyBmb3IgdGhlIGlkZWFzLgorCQorCSogc3RscG9ydC9jbWF0aCA6IGZpeGVkIFNVTiBDQyA1LjAgY29tcGF0aWJpbGl0eSBtb2RlIGJ1ZyAodGhhbmtzIHRvIGFkZSBmb3IgdGhlIHJlcG9ydCkKKworCSogZGVidWcvX2hhc2h0YWJsZS5oIDogZml4ZWQgZXF1YWxfcmFuZ2UoKSBidWcgKHRoYW5rcyB0byBkZWNyYWZ0IGZvciB0aGUgcmVwb3J0KQorCisJKiBzdHJlYW1idWYuY3BwL19zdHJlYW1idWYuaCA6IGZpeGVzIHhzZ2V0bigpIGJ1ZyAodGhhbmtzIHRvIFZhZGltIEVnb3JvdikKKwkKKwkqIGlzdHJlYW1idWZfaXRlcmF0b3I8PiA6IG5vbmNvbmZvcm1pbmcgYmVoYXZpb3VyIGZpeGVkICh0aGFua3MgdG8gVG9tIFdpZG1lcikKKworCSogX251bV9wdXQuYyA6IGZpeGVkIGNvcm5lciBjYXNlIGZvciAweDgwMDAwMDAgb3V0cHV0LgorCQorICAgICAgICAqIG51bV9nZXQ8PiA6IGV4dHJhIGdldCgpIGFuZCBkb19nZXQoKSBtZW1iZXJzIGZvciAiaW50IiBhbmQgInNob3J0IiByZW1vdmVkOyBpc3RyZWFtIG9wZXJhdG9ycyBjaGFuZ2VkIGFjY29yZGluZ2x5CisJCisgICAgICAgICogX2l0cmVhbWJ1Zl9pdGVyYXRvci5oL19vc3RyZWFtYnVmX2l0ZXJhdG9yLmggaW50cm9kdWNlZCB0byBkZWNvdXBsZSB0aG9zZSBmcm9tIG51bV9nZXQvbnVtX3B1dAorCisJKiBnY2MgbWFrZWZpbGVzIGluIHNyYyA6ICItZm5vLWltcGxlbWVudC1pbmxpbmVzIiByZW1vdmVkCisKKwkqIEFkZGVkIHdvcmthcm91bmQgZm9yIGdjYydzIGxpbWl0cy5oIGFuZCBTVU4gVWx0cmEgd2l0aCAtbWNwdT11bHRyYXNwYXJjIGluIDMyLWJpdCBtb2RlLiAKKwkKKwkqIGlvc19iYXNlOjogdHlwZSBmb3IgY29uc3RhbnRzICBtYWRlICJpbnQiIGZvciBhbGwgY29tcGlsZXJzLCBhcyBpdCBtb3JlIGVmZmljaWVudCBhbmQgcGVyZmVjdGx5IGNvbXBsaWFudC4KKwkgCQorCSogZGVidWcvX2hhc2h0YWJsZS5oIDogZml4ZWQgdHlwbyBpbiBzd2FwKCkgKCB0aGFua3MgdG8gR2VyZCBIb2VyZW4gZm9yIHRoZSByZXBvcnQpCisKKwkqIGRlYnVnL19zdHJpbmcuaCA6ICsoKSBvcGVyYXRvcnMgZGVmaW5lZCB1bmNvbmRpdGlvbmFsbHkgKCB0aGFua3MgdG8gR2VyZCBIb2VyZW4gZm9yIHRoZSByZXBvcnQpCisKKwkqIF9pc3RyZWFtLmMgOiByZW1vdmVkIGRlcGVuZGFuY3kgb24gX2Z1bmN0aW9uLmggKHRoYW5rcyB0byBLZW5ueSBTaW1wc29uIGZvciB0aGUgcmVwb3J0KQorCisJKiBfbGltaXRzLmMgOiBmaXhlZCBsaXR0bGUtZW5kaWFuIHJlcHJlc2VudGF0aW9uIG9mIGluZmluaXR5ICYgTmFOICh0aGFua3MgdG8gUmVuZSB2YW4gT29zdHJ1bSkKKworCSogX3N0ZGlvX2ZpbGUuaCA6IGZpeGVkIHBvc3RkZWNyIG1hY3JvIGZvciA2NC1iaXQgU29sYXJpcyAodGhhbmtzIHRvIEppbSBDb2xlKQorCisJCitUaGUgZm9sbG93aW5nIGNoYW5nZXMgd2VyZSBtYWRlIGluIDQuMSBiZXRhIDQgc2luY2UgNC4xIGJldGEgMyA6CisJCisJKiBTaW11bGF0aW9uIG9mIGNsYXNzIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gKHRoYW5rcyB0byAgTWF0IE1hcmN1cyBhbmQgSmVzc2UgSm9uZXMgb2YgQWRvYmUpCisJICB1c2VkIHRvIHByb3ZpZGUgZm9sbG93aW5nIGVuaGFuY2VtZW50cyA6CisJCisJIC0gdHlwZV90cmFpdHMgYXJlIGF1dG9tYXRpY2FsbHkgc3BlY2lhbGl6ZWQgZm9yIGFsbCBwb2ludGVyIHR5cGVzIGZvciBhbGwgY29tcGlsZXJzLCAKKwkgICB3aGljaCBtYWtlcyB0aGVtIGFibGUgdG8gdXRpbGl6ZSB0eXBlX3RyYWl0cy1iYXNlZCBvcHRpbWl6YXRpb25zIHdoZW4gZGVhbGluZyB3aXRoIHBvaW50ZXIgdHlwZXMsIAorCSAgIGF1dG9tYXRpY2FsbHkuCisJCisJIC0gYWxsIGZ1bmN0aW9ucyBzcGVjaWFsaXplZCBmb3IgcG9pbnRlcnMgYW5kIG9wdGltaXplZCB2aWEgX190eXBlX3RyYWl0cworCSAgICggbGlrZSBjb3B5KCkvY29weV9iYWNrd2FyZCgpLCBfdW5pbml0aWFsaXplZF94eCkgbm93IGVuam95IHRoaXMgb3B0aW1pemF0aW9uIGZvciBhbGwgY29tcGlsZXJzIQorICAgICAgICAKKwktIGdlbmVyaWMgX192YWx1ZV90eXBlKCkvX19kaWZmZXJlbmNlX3R5cGUoKS9fX2l0ZXJhdG9yX2NhdGVnb3J5KCkgYXJlIHdyaXR0ZW4gc28gdXNlciBkb2VzIG5vdCBoYXZlCisJICAgdG8gc3VwcGx5IGFueSBvZiBpdHMgb3duIGV2ZW4gd2hlbiBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGlzIG5vdCBhdmFpbGFibGUuCisJICAgKE5vdGUgOiBnY2MtMi43IGFuZCBWQysrIDUueCwgNi54IGhhdmUgYnVncyB3aGljaCBwcmV2ZW50cyB0aGVtIGZyb20gdXNpbmcgdGhpcyBlbmhhbmNlbWVudCwgc3RpbGwpCisJCisJKiA8aXRlcmF0b3I+IDogYnkgZGVmYXVsdCwgbm9uLXN0YW5kYXJkIGl0ZXJhdG9yIHF1ZXJ5IG5hbWVzIGxpa2UgCisJICB2YWx1ZV90eXBlKCkvZGlmZmVyZW5jZV90eXBlKCkvaXRlcmF0b3JfY2F0ZWdvcnkoKSBhcmUgbm90IHVzZWQKKwkKKwkqIDxhbGdvPiA6IG1ham9yIHJldmlzaW9uOgorCSAgIC0gYWxnb3JpdGhtcyB3aXRob3V0IGV4cGxpY2l0IENvbXBhcmUoKSBmdW5jdGlvbiBleHByZXNzZWQgdmlhIHRoZSBvbmUgdGhhdCBoYXMgaXQgd2hlcmUgcG9zc2libGUuCisJICAgICBUaGlzIGNvbnNpZGVyYWJseSByZWR1Y2VzIGhlYWRlciBzaXplIGFuZCByZWR1Y2VzIGNvZGUgYmxvYXQgZm9yIHByb2dyYW1zIHdoaWNoIHVzZSBib3RoIGZsYXZvdXJzIG9mCisJICAgICB0aG9zZSBhbGdvcml0aG1zLgorCSAgIC0gc29tZSBmdW5jdGlvbiBib2RpZXMgbW92ZWQgYmV0d2VlbiAgLmMgYW5kIC5oIAorCSAgIC0gYWxsIGZ1bmN0aW9ucyB1c2VkIGludGVybmFsbHkgbW92ZWQgb3V0IHRvIF9hbGdvYmFzZS5oLCBzbyBubyBvdGhlciBoZWFkZXIgaW5jbHVkZXMgPF9hbGdvLmg+IGFueW1vcmUKKwkgICAtIGZpbmQoKSBzcGVjaWFsaXplZCBmb3IgcmFuZG9tIGFjY2VzcyBpdGVyYXRvcnMgcmVnYXJkbGVzcyBvZiBwYXJ0aWFsIHNwZWMuCisKKwkqIER5bmFtaWMgbGlicmFyaWVzICguRExMIGFuZCAuc28pIDogbmFtZSB2ZXJzaW9uaW5nIHVzZWQgdG8gcHJldmVudCBjbGFzaGVzIGJldHdlZW4gU1RMcG9ydCB2ZXJzaW9ucworCisJKiBzcmMvIDogY29kZSByZWdyb3VwZWQgYmV0d2VlbiAuY3BwIGZpbGVzIHRvIHByb3ZpZGUgZm9yIGxlc3MgZXhlY3V0YWJsZSBzaXplIHdpdGggZHVtYiBsaW5rZXJzOworCisJKiBsb2NhbGUgc3Vic3lzdGVtIGluaXRpYWxpemF0aW9uIDogc3RhcnR1cCBjaGFuZ2VkIHRvIHVzZSBzdGF0aWNhbGx5IGFsbG9jYXRlZCBzdHJ1Y3R1cmVzIGFzIG11Y2ggYXMgcG9zc2libGU7CisJCisJKiA8c3RsL19mdW5jdGlvbi5oPiA6IGJhc2ljIHN0dWZmIG1vdmVkIHRvIF9mdW5jdGlvbl9iYXNlLmggOyAKKwkgIG90aGVyIFNUTCBoZWFkZXJzIG5vdyBpbmNsdWRlIF9mdW5jdGlvbl9iYXNlLmggaW5zdGVhZAorCisJKiBfdGhyZWFkcy5oIDogTVQgc3VwcG9ydCBmb3IgT1MvMiBhZGRlZCAob25seSB0ZXN0ZWQgd2l0aCBWQUMrKykKKworCSogX3N0ZGlvX2ZpbGUuaCA6IGFkZGVkIHN1cHBvcnQgZm9yIFNvbGFyaXMgaW4gRUxGNjQgbW9kZSAodGhhbmtzIHRvIEhvbGdlciBTdGFzY2gpCisJCisJKiBzdGwvX2hhc2h0YWJsZS5oIDogW10gb3BlcmF0b3IgZm9yIGhhc2hfbWFwIG9wdGltaXplZCB0byB0YWtlIG5vIG1vcmUgdGhhbiBmaW5kKCkgd2hlbiBlbGVtZW50IGlzIHByZXNlbnQKKwkgIChUaGFua3MgdG8gVGhvbWFzIFdpdHQgZXQgYWwuKQorCisJKiBfb3N0cmVhbS5oIDogZml4IGZvciBkZWZhdWx0IHVuc2lnbmVkIGNoYXIgKHRoYW5rcyB0byAgSG9sZ2VyIFN0YXNjaCkKKwkKKwkqIGFsbCBfX1NUTF9BQkJSRVZTIGFiYnJldmlhdGlvbnMgbW92ZWQgYXNpZGUgaW4gX2FiYnJldnMuaCBoZWFkZXIuCisKKwkqIEZ1aml0c3UgQysrIENvbXBpbGVyIHN1cHBvcnQgYWRkZWQgKHRoYW5rcyB0byAgSG9sZ2VyIFN0YXNjaCkKKwkKKwkqIEluaXRpYWwgU0dJIGlvc3RyZWFtcyBwb3J0IHRvIE9TLzM5MCBpbnRyb2R1Y2VkICh0aGFua3MgdG8gIEhvbGdlciBTdGFzY2gpLgorCisJKiBNb3JlIG9uIFNHSSBpb3N0cmVhbXMgcG9ydCB0byB4bEMgNS4wICh0aGFua3MgdG8gIEhvbGdlciBTdGFzY2gpLgorCisJKiBGaXhlcyBmb3IgU0dJIE1JUFNwcm8gY29tcGlsZXJzIChUaGFua3MgdG8gUmFscGgpCisKKwkqIEZpeGVzIGZvciBIUCBhQ0MgY29tcGlsZXIgKFRoYW5rcyB0byBNaWNoYWVsIFRzaXJraW4pCisKKwkqIHN0bHBvcnQvU0M1IGRpcmVjdG9yeSA6IHJlbW92ZWQgQyBsaWJyYXJ5IC5oIGZpbGVzIHRvIGZpeCBjaXJjdWxhciBpbmNsdXNpb24gcHJvYmxlbSB3aXRoIFdTNi4wICsgQyBwcm9ncmFtcy4KKwkKKyAgICAgICAgKiAgaGFzaF9tYXA6OnN3YXAoKSBpbiBkZWJ1ZyBtb2RlIGZpeGVkICh0aGFua3MgdG8gQW50b24pIAorCQorCSogX19TVExfQ09NUElMRV9JTlNUQU5USUFURSBoYWNrIGZvciBERUMgcmVtb3ZlZCAodGhhbmtzIHRvIFJhbHBoKQorCisJKiBfX1NUTF9JTkxJTkVfU1RSSU5HX0xJVEVSQUxfQlVHIGRlZmluZWQgZm9yIEhQIGFDQyAoIHRoYW5rcyB0byBKYXNvbiBUYXlsb3IpCisKKwkqIF9iaXRzZXQuaCAtIG1lbWJlciB3b3JrYXJvdW5kIG9wZXJhdG9ycyBtYWRlIGNvbnN0ICh0aGFua3MgdG8gZHp3aWNrKSAKKworCSogX2JpdHNldC5oLy5jLCBoYXNodGFibGUuaCAtLSBzbWFsbCBidWdmaXhlcyAodGhhbmtzIHRvIExldmVudGUgRmFya2FzKQorCQorCSogPGV4Y2VwdGlvbj4gLSBub3cgaW5jbHVkZXMgZXhjZXB0aW9uLmggaWYgb25seSB0aGF0IGlzIGF2YWlsYWJsZS4KKworCSogdmVjdG9yOjphc3NpZ24oKSBpbnBsZW1lbnRlZCBmb3IgdmVjdG9yOjppdGVyYXRvciB3aGVuIG1lbWJlciB0ZW1wbGF0ZXMgYXJlIG5vdCBhdmFpbGFibGUgKFRoYW5rcyB0byBkendpY2spCisKKwkqIGZzdHJlYW0uY3BwIDogX19waW9pbmZvIHVzZWQgZm9yIE1pbkdXMzIgKHRoYW5rcyB0byBEYW5ueSBTbWl0aCkKKwkKK1RoZSBmb2xsb3dpbmcgY2hhbmdlcyB3ZXJlIG1hZGUgaW4gNC4xIGJldGEgMyBzaW5jZSA0LjEgYmV0YSAyIDoKKworCSogbGlzdDw+OjpjbGVhcigpIDogcHJvdGVjdGVkIGFjY2VzcyBidWcgZml4ZWQKKworCSogX19TVExfTVVURVhfSU5JVElBTElaRVIgc2V0IGJhY2sgdG8gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUiBmb3IgcHRocmVhZHMgY2FzZSwgCisJICBhcyBzb21lIHBsYXRmb3JtcyAoZWcgQUlYKSBkbyBub3QgdHJlYXQgemVyby1pbml0aWFsaXplZCBtdXRleCBhcyB2YWxpZCBvbmUgKHRoYW5rcyB0byBBbGV4IFZhbmljLCBKYWNrIEFuZHJld3MgZm9yIGhlbHApCisJCisJKiBzdGwvX2xpbWl0cy5jIDogZml4ZWQgdHlwbyBwcmV2ZW50aW5nIG51bWVyaWMgbGltaXRzIGNvbnN0YW50cyB0byBiZSBkZWZpbmVkIGZvciBfX1NUTF9MSVRUTEVfRU5ESUFOLAorCSAgY29uc3RhbnRzIGluaXRpYWxpemF0aW9uIGZpeGVkICh0aGFua3MgdG8gSW5nbyBEb25hc2NoKSAgCisKKwkqIHJlYWwgaW1wbGVtZW50YXRpb24gb2YgbG9jYWxlcyBmb3IgV2luMzIgY29udHJpYnV0ZWQgYnkgQW50b24gTGFwYWNoICh0aGFua3MgISkgbWVyZ2VkIGluLgorCQorCSogc3RsX3VzZXJfY29uZmlnLmgsIF9jb25maWcuaCA6IGNoYW5nZWQgZGVmYXVsdCB0byBub3QgZGVmaW5lIHJlbG9wczo6IG9wZXJhdG9ycworCSAgaW4gX19TVExfTk9fTkFNRVNQQUNFUyBtb2RlLgorCisJKiBfbnVtZXJpY19mYWNldHMuYy9udW1fcHV0LmNwcCA6IHByaW50aW5nIG9mIGludGVnZXIgZG8gbm90IHVzZSBzcHJpbnRmKCkgYW55bW9yZQorCisJKiAiaW5zdGFsbCIgdGFyZ2V0IGltcGxlbWVudGVkIGZvciBVTklYICYgVkMrKyBNYWtlZmlsZXMuIEl0IG5vdyBpbnN0YWxscyBoZWFkZXJzIGFuZCBsaWJyYXJpZXMuCisKKwkqICJzcmMiIDogZmlsZXMgbWVyZ2VkIHRvIGdldCBsZXNzIGNvbXBpbGF0aW9uIHRpbWUgYW5kIGxlc3Mgc3BhY2Ugb3ZlcmhlYWQgZm9yIGltcGVyZmVjdCBjb21waWxlcnMKKworCSogImRlYnVnIiBmbGF2b3VyIG9mIFNUTHBvcnQgZXhjbHVkZWQgZnJvbSBkZWZhdWx0IGJ1aWxkIGFuZCBhdXRvLXNlbGVjdCA7IAorCSAgcGxlYXNlIHVzZSBfX1NUTF9VU0VfREVCVUdfTElCIGFuZCBidWlsZCBkZWJ1ZyBTVExwb3J0IGxpYiBleHBsaWNpdGx5IHdpdGggIm1ha2UgZGVidWdfZHluYW1pYyIgCisJICBpZiB5b3UgcmVhbGx5IG5lZWQgaXQpLiAiYWxsIiBub3cgYnVpbGRzIDIga2luZHMgOiAicmVsZWFzZSIgYW5kICJTVExkZWJ1ZyIsIGZvciBzdGF0aWMgYW5kIGR5bmFtaWMgYnVpbGRzLiAgCisKKwkqIHN0bHBvcnRfcHJlZml4LmggOiBXSU4zMl9MRUFOX0FORF9NRUFOIHNldCBmb3IgV2luMzIgYnVpbGQgb2YgU1RMcG9ydCBsaWJyYXJ5LCBmb3Igc3BlZWQuCisKKwkqIEZyZWVCU0QgY29tcGlsZSBmaXhlZDsgbWFrZWZpbGVzIGFkZGVkLgorCisJKiBBbGwgIl9faW5pdCIgY2hhbmdlZCB0byAiX0luaXQiIHRvIGZpeCBjbGFzaGVzIHdpdGggREVDIGNvbnZlbnRpb25zICh0aGFua3MgdG8gSG9sZ2VyIFN0YXNjaCkKKworCSogX3JhbmdlX2Vycm9ycy5oIC0tIGZpeGVkIHRvIGFsd2F5cyBzZXQgX19TVExfRVhURVJOX1JBTkdFX0VSUk9SUyBmb3IgU0dJIGlvc3RyZWFtcyAodGhhbmtzIHRvIFNlcmdlIFBhc2hrb3YpCisJCisJKiAqZ2NjKiBtYWsgOiBzb21lIGZpbGVzIHJlbmFtZWQgdG8gZ2NjLXBsYXRmb3JtIG1hayAKKworCSogImV4dGVybiB0ZW1wbGF0ZSIgZXh0ZW5zaW9uIHVzZWQgZm9yIGdjYyAmIHN0YW5kYXJkIGkvbyBjbGFzc2VzLCB0byByZWR1Y2UgY29kZSBibG9hdCBpbiBhcHBsaWNhdGlvbidzIC5vCisKKwkqICJleHRlcm4gdGVtcGxhdGUiIGV4dGVuc2lvbiB1c2VkIGZvciBWQysrICYgc3RhbmRhcmQgaS9vIGNsYXNzZXMgKHdhcyBmb3IgRExMIG9ubHkpCisKKwkqIF9pdGVyYXRvci5oIDogYWRkZWQgdGVtcGxhdGUoYW5kIG5vbi10ZW1wbGF0ZSkgYXNzaWdubWVudCBvcGVyYXRvciBmb3IgcmV2ZXJzZV9pdGVyYXRvcjw+ICh0aGFua3MgdG8gcHN3KS4gIE9ic29sZXRlIEhQLXN0eWxlIGNvZGUgbW92ZWQgdG8gX2l0ZXJhdG9yX29sZC5oIAorCisJKiBfYWxsb2MuaCA6IG9ic29sZXRlIGNvZGUgZm9yIHJhdyBTR0kgYWxsb2NhdG9ycyBzdXBwb3J0IG1vdmVkIHRvIHNlcGFyYXRlIGhlYWRlciwgZm9yIGNvbXBpbGUtdGltZSBpbXByb3ZlbWVudAorCisJKiBNb3JlIGlvc3RyZWFtcyBjb2RlIGNvbmRpdGlvbmFsbHkgbW92ZWQgb3V0IGZvciBjbGllbnRzIHdobyBvbmx5IHVzZSBzdGFuZGFyZCBpL28gYW5kIGNhbiBzZXQgX19TVExfTk9fQ1VTVE9NX0lPIGZsYWcKKwkKKwkqIDxpb3N0cmVhbT4sIDxsb2NhbGU+IDogaW5pdGlhbGl6YXRpb24gb2YgbG9jYWxlIHN1YnN5c3RlbSBtYWRlIGluZGVwZW5kZW50IG9mIHN0YW5kYXJkIHN0cmVhbXMuCisJICBzeW5jX3dpdGhfc3RkaW8gY2FsbCBiZWZvcmUgaW9zdHJlYW0gaW5pdGlhbGl6YXRpb24gbm93IHdvcmtzLgorCQorCSogPGZzdHJlYW0+LCA8ZnN0cmVhbS5oPiA6IGFkZGVkIGluaXRpYWxpemF0aW9uIGNvZGUgZm9yIGxvY2FsZSAsIHNhbWUgYXMgaW4gPGxvY2FsZT4gCisJICAodGhhbmtzIHRvIEdlb3JnZSBUcm9qYW4gZm9yIHRoZSByZXBvcnQpCisKKwkqIGZzdHJlYW0uY3BwIDogZml4ZWQgcmVzb3VyY2UgbGVhayBpbiBjYXNlIG1lbW9yeSBtYXAgZmFpbHMgb24gV2luMzIgKHRoYW5rcyB0byBNYXJrIExhZmZvb24pCisJCisJKiA8Y21hdGg+LCA8Y3N0ZGxpYj4gOiBhZGRlZCBhZGRpdG9uYWwgb3ZlcmxvYWQgc2lnbmF0dXJlcyByZXF1aXJlZCBieSBjaGFwdGVyIDI2LjUgb2YgQU5TSSAodGhhbmtzIHRvIExldmVudGUgRmFya2FzIGZvcgorCSB0aGUgc3VnZ2VzdGlvbiksIHBsdXMgImxvbmcgbG9uZyIgZmxhdm91ciB3aGVyZSBhcHBsaWNhYmxlLiAKKwkKKwkqIF9fU1RMX0xPTkdfTE9ORyBnZW5lcmFsaXplZCB0byBzdXBwb3J0IF9faW50NjQgb24gV2luMzIgKHRoYW5rcyB0byBBZGFtIEdhdGVzIGZvciB0aGUgc3VnZ2VzdGlvbikKKworCSogX2ZzdHJlYW0uaCA6IGFkZGVkIGNvbnN0cnVjdG9yIGZyb20gZmlsZSBkZXNjcmlwdG9yLCBhcyBleHRlbnNpb24gKHRoYW5rcyB0byBlcmljX2FfYmVuc29uKQorCisJKiBfZnN0cmVhbS5oIDogYWRkZWQgYmFzaWNfZmlsZWJ1Zjw+OjpmZCgpIGZpbGUgZGVzY3JpcHRvciBhY2Nlc3NvciwgYXMgZXh0ZW5zaW9uICh0aGFua3MgdG8gR2VvcmdlIFRyb2phbikKKworCSogc3RsX3N1bnByby5oIDogc3Ryc3RyZWFtIG1hc2tlZCBmb3IgQ0MgNC4yIHRvIGF2b2lkIHZpcnR1YWwgdGFibGUgY2xhc2ggKHRoYW5rcyB0byBLZW4pCisKKwkqIHN0bF9tc3ZjLmggOiBtZW1iZXIgdGVtcGxhdGVzIGFsbG93ZWQgZm9yIFZDNSwgaXQncyBjYXBhYmxlIG9mIGhhZGxpbmcgbW9zdCBvZiB0aGVtIChzYW1lIHJlc3RyaWN0aW9ucyBhcyBWQzYgLS0gaW5saW5lKS4KKwkKKwkqIGRlYnVnL19kZWJ1Zy5jIDogc2xpZ2h0bHkgY2hhbmdlZCBmb3JtYXQgb2YgZGVidWcgbWVzc2FnZSB0byBwbGVhc2UgVkMrKyBJREUgKHRoYW5rcyBmb3IgQnJ1Y2UgRGF3c29uIGZvciB0aGUgc3VnZ2VzdGlvbikKKworCSogc3JjL3NnaV9taXBzcHJvLm1hayBhZGRlZCwgZm9yIFNHSSBNSVBTUHJvIGNvbXBpbGF0aW9uCisKKwkqIG1lcmdlZCBzZXJpZXMgb2YgSFAvU1VOIG1pbm9yIGZpeGVzIGJ5IFBldHIgT3Z0Y2hlbmtvdiAKKwkKKwkqIG1lcmdlZCBzZXJpZXMgb2YgSW50ZWwgNC41IGZpeGVzIGJ5IFNlcmdlIAorCisJKiB2Y19jb21tb24ubWFrIDogLVlkIGRyb3BwZWQsIGFzIG9ic29sZXRlICh0aGFua3MgdG8gcHN3KQorCisJKiBfcmFuZ2VfZXJyb3JzLmg6OTUgOiB1bnVzZWQgYXJndW1lbnQgcmVtb3ZlZCAodGhhbmtzIHRvIEdlb3JnZSBUcm9qYW4pCisKKwkqIF9zdHJpbmdfaW8uaCA6IHJlZmluZWQgX1dSVExJTkcgd29ya2Fyb3VuZCBmb3IgV2F0Y29tICh0aGFua3MgdG8gU2VyZ2UgUGFzaGtvdikKKworCSogX3RocmVhZHMuaCA6IGZpeGVkIFNHSSB0aHJlYWRzIGRhZmluZXMgZm9yIGdjYyBvbiBJUklYICh0aGFua3MgdG8gQnJldHQgRGVubmVyIGZvciB0aGUgcmVwb3J0KQorCisJKiA8dHlwZWluZm8uaD4sIDx0eXBlaW5mbz4gOiBtdXR1YWxseS1leGNsdXNpdmUgbWFjaGFuaXNtIGFkZGVkIHRvIGFsbG93IGluY2x1ZGluZyBib3RoIGluIHNhbWUgdW5pdC4KKworCSogSW5jbHVzaW9uIG9mIFNHSSBpb3N0cmVhbXMgaGVhZGVycyBwdXQgdG8gc29tZSBvcmRlcjsgX3N0cmVhbWJ1Zl9pdGVyYXRvci5oIGZpbGUgaW50cm9kdWNlZCB0byByZXNvbHZlIGNpcmN1bGFyIGRlcGVuZGFuY2llcworCQorVGhlIGZvbGxvd2luZyBjaGFuZ2VzIHdlcmUgbWFkZSBpbiA0LjEgYmV0YSAyIHNpbmNlIDQuMSBiZXRhIDEgOgorCQorCSogX2FsZ29iYXNlLmggOiBmaXhlZCBfX1NUTF9ERUNMQVJFX0NPUFlfVFJJVklBTCBkZWZpbml0aW9uCisJKHRoYW5rcyB0byBDaGFybGVzIEJ1cmZvb3QgZm9yIHRoZSByZXBvcnQpCisKKwkqIF9hbGdvYmFzZS5oIDogYWRkZWQgY29weV9iYWNrd2FyZCBzcGVjaWFsaXphdGlvbnMgZm9yIGJ1aWx0aW4gdHlwZXMgZm9yIGNvbXBpbGVycyB3L28gcGFydGlhbCBzcGVjLgorCisJKiBfY2hhcl90cmFpdHMuaCA6IGZpeGVkIHplcm8tbGVuZ3RoIGNoZWNrIGZvciBjb3B5ICh0aGFua3MgdG8gTWljaGFlbCBUc2lya2luKQorCisJKiBtc3ZjX3dhcm5pbmdzX29mZi5oIDogZml4ZWQgImFuZCIgdHlwbworCSh0aGFua3MgdG8gQ2hhcmxlcyBCdXJmb290IGZvciB0aGUgcmVwb3J0KQorCisgICAgICAgICogbnVtX3B1dF9mbG9hdC5jcHAgOiBmaXhlZCByb3VuZGluZyBmb3IgImciIGZvcm1hdCAodGhhbmtzIHRvIEJlcm5kIE1vaHIgZm9yIHRoZSByZXBvcnQpIAorCQorCSogSW5pdGlhbCBwb3J0IG9mIGlvc3RyZWFtcyB0byB4bEMgNS4wIGFkZGVkICh0aGFua3MgdG8gSmFjayBBbmRyZXdzKQorCQorCSogc3RsX3N1bnByby5oIDogYSBmaXggZm9yIEZvcnRlIGNvbmZpZyAoVGhhbmtzIHRvIEFsZXggVmFuaWMgZm9yIHRoZSByZXBvcnQpCisKKwkqIG9sZF9ocC9pdGVyYXRvci5oIDogZml4ZWQgaXRlcmF0b3JfY2F0ZWdvcnkoKS9ldGMuIGltcG9ydAorCisJKiBfdGhyZWFkcy5oIDogX19zdGxfYXRvbWljX3QgdXNlZCBpbnN0ZWFkIG9mICJ1bnNpZ25lZCBsb25nIiAodGhhbmtzIHRvIEFsZXggVmFuaWMgZm9yIHRoZSByZXBvcnQpCisJKiB1c2luZy9pb21hbmlwIDogb2xkLXN0cmVhbXMgcGF0aCB1c2VkIGZvciBuYXRpdmUgaW9tYW5pcC5oICh0aGFua3MgdG8gTWljaGFlbCBUc2lya2luIGZvciB0aGUgcmVwb3J0KS4KKworCSogX2JpdHNldC5oICwgX2JpdHNldC5jIDogZGlyZWN0IFNUTF9USFJPVyByZXBsYWNlZCB3aXRoIF9fc3RsX3Rocm93X3h4eCBjYWxscyAodGhhbmtzIHRvIE1pY2hhZWwgVHNpcmtpbiBmb3IgdGhlIHJlcG9ydCkKKworCSogcmFuZ2VfZXJyb3JzLmgvY3BwIDogYWRkZWQgZnVuY3Rpb25zIHRvIHN1cHBvcnQgdGhyb3dpbmcgb2YgIG92ZXJmbG93X2Vycm9yIGFuZCBpbnZhbGlkX2FyZ3VtZW50CisKKwkqIF90aHJlYWRzLmggOiBlbmdhbmNlZCBIUC1zcGVjaWZpYyBndWFyZHMgZm9yIEhQLVVYIDExICh0aGFua3MgdG8gTWF0dGhldyBDb2xsaW5zIGZvciB0aGUgcmVwb3J0KQorCisJKiBfc3RyaW5nLmggOiBjb21wYXJlKCkgYnVnZml4ICh0aGFua3MgdG8gQW50b24gU2VyZ2VldikKKworCSogbW9uZXlwdW5jdF9ieW5hbWVfdy5jcHAgOiByb2xsZWQgYmFjayB3cm9uZyBidWdmaXggKHRoYW5rcyB0byBLZW4pCisKKwkqIF92ZWN0b3IuaCwgX2RlcXVlLmgsIF9saXN0LmggOiBub25zdGFuZGFyZCB2ZXJzaW9ucyBvZiBwdXNoX2JhY2soKS9wdXNoX2Zyb250KCkgCisJICBtb3ZlZCB1bmRlciBfX1NUTF9OT19BTkFDSFJPTklTTVMgZ3VhcmQgKHRoYW5rcyB0byBFZCBCcmV5KQorCQorCSogX3RyZWUuYywgX2xpc3QuYywgX3NsaXN0LmMsIF9kZWJ1Zy5jIDogY29tcGlsZS10aW1lIGltcHJvdmVtZW50cworCQorCSogX3RyZWUuaC9jLCBfbGlzdC5oL2MsIF9zbGlzdC5oL2MsIF92ZWN0b3IuaC9jLCBfc3RyaW5nLmgvYyA6IHVzaW5nIGRpcmVjdGl2ZSBmb3IgZGF0YSBtZW1iZXJzIAorCSAgY2hhbmdlZCB0byBleHBsaWNpdCAidGhpcy0+Ii4KKwkKKwkqIF9jb21wbGV4LmggOiBzaWduYXR1cmVzIG9mIHNvbWUgbWV0aG9kcyBjaGFuZ2VkIHRvIHRha2UgdmFsdWVfdHlwZSBpbnN0ZWFkIG9mIGNvbnN0IHZhbHVlX3R5cGUmLCAKKwkgICBmb3IgYmV0dGVyIGNvbmZvcm1hbmNlICh0aGFua3MgdG8gUGV0ciBPdnRjaGVua292KQorCisJKiBCdW5jaCBvZiBmaXhlcyB0byBjb21waWxlIHdpdGggZ2NjIG9uIEhQLVVYIDEwLCAxMSAodGhhbmtzIHRvIFBldHIgT3Z0Y2hlbmtvdikKKworCSogQ29kZSBkdXBsaWNhdGlvbiBmb3IgX19TVExfSU5MSU5FX01FTUJFUl9URU1QTEFURVMgcmVtb3ZlZCAtLSBjb3JyZXNwb25kaW5nIG1ldGhvZHMgYXJlIGFsd2F5cyBpbmxpbmVkCisKKwkqIHN0bF9zdW5wcm8uaCA6IGZpeCBmb3IgIi1jb21wYXQiIG1vZGUgKHRoYW5rcyB0byBWaWpheSBSYW1hY2hhbmRyYW4pCisKKwkqIHB0aHJlYWQuaCA6IG5ldyB3cmFwcGVyIGFkZGVkCisKKwkqIEFkZGVkIGN1c3RvbSBwcm9sb2cvZXBpbG9nIGZvciBIUCBhQ0MgdG8gc2VsZWN0IGt0aHJlYWRzIG9uIEhQLVVYIDExIChUaGFua3MgdG8gTWljaGFlbCBUc2lya2luKQorCisJKiA8bmV3PiA6IGZpeGVkIHRocm93IHNwZWNpZmljYXRpb24gZm9yIGJhZF9hbGxvYyAoaGFzIHRvIGJlIGluaGVyaXRlZCkKKworCSogTWFjcm8gX19TVExfTkFUSVZFX0NQUF9SVU5USU1FX0lOQ0xVREVfUEFUSCBpbnRyb2R1Y2VkIHRvIHNwZWNpZnkgc2VwYXJhdGUgcGF0aCBmb3IgPGV4Y2VwdGlvbj4sIDx0eXBlaW5mbz4sIDxuZXc+LgorCSAgKHRoYW5rcyB0byBCcnlhbiBCeXJuZXMpCisJCisJKiA8c3RkaW9fc3RyZWFtYnVmPiA6IG1vdmVkIGZyb20gc3RscG9ydC9zdGwgdG8gc3RscG9ydCBkaXJlY3RvcnksIGZvciBTR0kgY29tcGF0aWJpbGl0eQorCQorVGhlIGZvbGxvd2luZyBjaGFuZ2VzIHdlcmUgbWFkZSBpbiA0LjEgYmV0YSAxIHNpbmNlIDQuMCA6CisKKwkqICBTdW4gRm9ydGUgNi4wIEMrKyBjb25maWd1cmF0aW9uIHByb3ZpZGVkICh0aGFua3MgdG8gQWxleGFuZGVyIFZhbmljIGZvciB0aGUgaW5wdXQpCisJCisJKiBfdGhyZWFkcy5oL19jb25maWcuaCA6IGFkZGVkIGVmZmljaWVudCBzdXBwb3J0IGZvciBhdG9taWMgb3BlcmF0aW9ucyBmb3IKKwkgIERFQyBDWFggYW5kIFdhdGNvbSAodGhhbmtzIHRvIFJpY2FyZG8gR2F5b3NvIGZvciB0aGUgaW5wdXQpLiAKKwkgIE1hY3JvcyBfX1NUTF9BVE9NSUNfeHh4IGludHJvZHVjZWQgdG8gZmFjaWxpdGF0ZSB0aGlzLgorCisJKiBfdHJlZS5oIDogb3B0aW1pemF0aW9ucyB0byBsb3dlciBudW1iZXIgb2YgY29tcGFyaXNvbnMgKHRoYW5rcyB0byBDcmFpZyBQb3dlcnMgZm9yIHRoZSBwYXRjaCkKKworCSogX3RyZWUuaCwgX2hhc2h0YWJsZS5oIGFuZCBjbGllbnRzIDogYWRkZWQgdGVtcGxhdGVkIGZpbmQoKSBhcyBhbiBleHRlbnNpb24gKHRoYW5rcyB0byBNaWNoYWVsIFRzaXJraW4gZm9yIHRoZSBzdWdnZXN0aW9uKQorCisJKiBfdHJlZS5oIDogY2hhbmdlZCBzb21lIGlubGluaW5nIGZvciBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24KKwkKKwkqIF9fbm9kZV9hbGxvYzo6IGFsbG9jYXRlIGJyb2tlbiBpbnRvIHR3byBmdW5jdGlvbnMgZm9yIGJldHRlciBpbmxpbmluZyAKKworCSogX3RocmVhZHMuaCA6IGFkZGVkIFBUSFJFQURfTVVURVhfSU5JVElBTElaRVIgZ3VhcmQgZm9yIEhQIHdvcmthcm91bmQKKworCSogc3RsX2JjLmggOiBvcHRpb24gc2V0IHRvIGNvbnRyb2wgYWxpZ25tZW50IGFuZCB2aXJ0dWFsIHRhYmxlICBiZWhhdmlvdXIgdG8gYmUgY29uc2lzdGVudDsgCisJIGxpYnJhcnkgbmFtZSBhZGp1c3RlZCB0byBzdGxwb3J0X2JjYzU1X3h4eAorCisJKiBfYWxnb2Jhc2UuaCwgX3VuaW5pdGlhbGl6ZWQuaCwgY2hhcl90cmFpdHMuaCAtLSBvcHRpbWl6ZWQgb3V0IGVtcHR5IG1lbWNweSgpIGNhbGxzIAorCSAgKHRoYW5rcyB0byBNaWNoYWVsIFRzaXJraW4gZm9yIHRoZSByZXBvcnQpLgorCQorCSogX2l0ZXJhdG9yLmggOiBmaXhlZCByZXZlcnNlX2l0ZXJhdG9yOjpvcGVyYXRvcisoaW50LCByZXZlcnNlX2l0ZXJhdG9yKSByZXNvbHV0aW9uCisJICAodGhhbmtzIHRvIEFudG9uIFNlcmdlZXYgZm9yIHRoZSBpbnB1dCkKKworCSogX2JpdHNldC5oIDogYml0c2V0PD46OnRlc3QgYnVnZml4ICh0aGFua3MgdG8gQW50b24gU2VyZ2VldiBmb3IgdGhlIHBhdGNoKQorCisJKiBjb21wbGV4X3RyaWcuY3BwIDogdXNlIG9mIF9fU1RMX05PX0xPTkdfRE9VQkxFIG1hZGUgY29uc2lzdGVudCwgZml4ZXMgZm9yIEJvcmxhbmQgb24gTGludXgKKwkgKHRoYW5rcyB0byBKb2huIFdpZWdsZXkgZm9yIHRoZSBpbnB1dCkKKwkKKwkqIG1vbmV5cHVuY3RfYnluYW1lX3cuY3BwIDogYnVnZml4ZXMgZm9yIHN0cmluZyBjb3B5aW5nICh0aGFua3MgdG8gQW50b24gU2VyZ2VldiBmb3IgdGhlIGlucHV0KQorCQorCSogV2F0Y29tLXNwZWNpZmljIGZpeGVzICh0aGFua3MgdG8gUmljYXJkbyBHYXlvc28gZm9yIHRoZSBpbnB1dCkKKworCSogc3JjL2NvbW1vbl9tYWNyb3MubWFrIDogc29tZSBpbnRlcm1lZGlhdGUgdGFyZ2V0cyBhZGRlZCAodGhhbmtzIHRvIEplcmVteSBmb3IgdGhlIHN1Z2dlc3Rpb24pIAorCQorCSogX2RlYnVnLmMgOiBmaXhlcyBmb3IgV2luIENFICh0aGFua3MgdG8gSm9obiBIeW5lcyBmb3IgdGhlIHBhdGNoKQorCisJKiBJbnRlbCBDQyA0LjAtc3BlY2lmaWMgZml4ZXMgKHRoYW5rcyB0byBTZWFuIENhdmFuYXVnaCBmb3IgdGhlIGlucHV0KQorCisJKiBfbGlzdC5jIDogd29ya2Fyb3VuZCBmb3IgV2F0Y29tIEMrKyAodGhhbmtzIHRvIE1pa2UgU3RlZWQgZm9yIHRoZSByZXBvcnQpCisKKwkqIF9fU1RMX05PX05BVElWRV9XSURFX1NUUkVBTVMgZGVmaW5pdGlvbiBmaXhlZCAodGhhbmtzIHRvIEdsZW4gU3VtbWVycyBmb3IgdGhlIHBhdGNoKQorCisJKiBjYXN0IG1hY3JvcyBmaXhlZCB0byBiZSBtb3JlIHJvYnVzdCAodGhhbmtzIHRvIEdlb2ZmIE9ha2hhbSBmb3IgdGhlIHJlcG9ydCkKKworCSogInN0cnN0cmVhbS5oIiBuYXRpdmUgaW5jbHVzaW9uIGZvciBWQyA2LjAgZml4ZWQgKHRoYW5rcyB0byAgU2F0aGlzaCBUIEMgZm9yIHRoZSByZXBvcnQpCisJCisJKiBkZWJ1Zy9fc3RyaW5nLmggOiBpbXByb3ZlbWVudCB0byBzdHJpbmcgd2l0aCBfX1NUTF9ERUJVRyB3L28gbWVtYmVyIHRlbXBsYXRlcyAKKwkgICh0aGFua3MgdG8gUGF1bCBGdXJuYW56IGZvciB0aGUgcmVwb3J0KQorCisJKiBkZWJ1Zy9fc3RyaW5nLmggOiBmaXhlZCBpbnRlcm5hbCBjb21waWxlciBlcnJvciBmb3IgVkMrKyA1LnggKHRoYW5rcyB0byBjaHZldHNvdiBmb3IgdGhlIHJlcG9ydCkKKwkKKwkqIGNzdGRpbywgc3RsL19zdHJlYW1idWYuaCA6IGZpeGVzIHRvIGFsbG93IGdjYyBjb21waWxhdGlvbiB3aXRoIC1hbnNpIGZsYWcKKworCSogd29ya2Fyb3VuZCBmb3IgY2luL2NvdXQgcmVuYW1pbmcgb24gSFBVWDExIGZvciAtRF9SRUVOVFJBTlQgKHRoYW5rZiB0byBKZWZmIFNwYXJrZXMgZm9yIHRoZSByZXBvcnQpCisKKwkqIGNpbi9jb3V0L2NlcnIvY2xvZyByZW5hbWluZyBpbiBTVExwb3J0IGZvciBDQyA0LjAgYW5kIFNHSSBpb3N0cmVhbXMsIAorCSB0byBhdm9pZCBzeW1ib2wgY2xhc2hlcyB3aXRoIG5hdGl2ZSBvbmVzICh0aGFua3MgdG8gRGlyayBTY2hyZWliIGZvciB0aGUgcmVwb3J0KQorCisJKiB0eXBlX2luZm8gc2NvcGUgZml4ZXMgZm9yIFZDKysgNi4wICh0aGFua3MgdG8gU2F0aGlzaCBUIEMgZm9yIHRoZSByZXBvcnQpCisKKwkqIHR5cGVpbmZvLmggdXNpbmcgZml4ZXMgKHRoYW5rcyB0byBHbGVuIFN1bW1lcnMgZm9yIHRoZSBpbnB1dCkKKwkKKwkqIHN0bGNvbXAuaCA6IGZpeGVzIHRvIGFsbG93IGNvbXBpbGF0aW9uIG9mIC5jIG1vZHVsZXMgd2l0aCBWQUMrKywgU3VuIENDLCBERUMgQ0MsIFdhdGNvbSBDQworCSAodGhhbmtzIHRvIERtaXRyeSBBLlN0ZWtsZW5ldiwgSm9uYXRoYW4gUmljaGFyZHNvbiBmb3IgdGhlIHJlcG9ydCkKKwkKKwkqIGRlYnVnL190cmVlLmggOiBmaXhlZCBpbnNlcnRfdW5pcXVlKCkgYnVnICh0aGFua3MgdG8gQmVuIExpYmxpdCBmb3IgdGhlIHJlcG9ydCkKKworCSogcmVncmVzc2lvbi9nY2MubWFrIG1hZGUgbm9uLWRlcGVuZGFudCBvbiAiLiIgaW4gdGhlIHBhdGggCisJICAodGhhbmtzIHRvIFRob21hcyBNYXRlbGljaCBmb3IgdGhlIHJlcG9ydCkKKwkKKwkqIGhtc2V0MS5jcHAgZml4ZWQgdG8gY29tcGlsZSB1bmRlciBPUzM5MCAoIHRoYW5rcyB0byBBbmRyZXkgS2hvdmFuc2tpeSBmb3IgdGhlIHJlcG9ydCkKKwkKZGlmZiAtLWdpdCBhL2V0Yy9SZWxlYXNlTm90ZS50eHQgYi9ldGMvUmVsZWFzZU5vdGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NDBkYjAKLS0tIC9kZXYvbnVsbAorKysgYi9ldGMvUmVsZWFzZU5vdGUudHh0CkBAIC0wLDAgKzEsMTM4IEBACis1LjI6CisKKy0gTWFqb3IgbW9kaWZpY2F0aW9uczoKKworCSogVXNlIG9mICNpbmNsdWRlX25leHQgdG8gYWNjZXNzIG5hdGl2ZSBwbGF0Zm9ybS9jb21waWxlciBoZWFkZXJzIHdoZW4gdGhlCisJcHJlcHJvY2Vzc29yIHN1cHBvcnQgaXQuIEVuaGFuY2UgU1RMcG9ydCBwb3J0YWJpbGl0eSBhcyBuYXRpdmUgaGVhZGVyIHBhdGggZG8KKwlub3QgaGF2ZSB0byBiZSBhZGFwdGVkIGVhY2ggdGltZSB0aGUgaGVhZGVyIHN0cnVjdHVyZSBpcyBtb2RpZmllZC4KKworCSogWWV0IGEgbW9kaWZpY2F0aW9uIG9mIHRoZSBpbmNsdWRlIHNjaGVtYSBpbiBhbGwgQysrIFN0YW5kYXJkIGhlYWRlcnMuIE5vdworCV9TVExQX1dIT0xFX05BVElWRV9TVEQgbW9kZSB3b3JrcyBhcyBleHBlY3RlZCwgdXNlZCBpbiBjb25qb25jdGlvbiB3aXRoCisJX1NUTFBfRE9OVF9SRURFRklORV9TVEQgaXQgaXMgcG9zc2libGUgdG8gdXNlIFNUTHBvcnQgaW4gc3RscG9ydCBuYW1lc3BhY2UgYXQKKwl0aGUgc2FtZSB0aW1lIGFzIHVzaW5nIG5hdGl2ZSBsaWJyYXJ5IGluIHN0ZCBuYW1lc3BhY2UuCisKKwkqIFVzZSBvZiB0aGUgZ2NjIHZpc2liaWxpdHkgZmVhdHVyZSBmb3IgZ2NjIHZlcnNpb25zIGFmdGVyIDQuMC4KKworCSogRm9yIGJ1aWxkcyB1bmRlciBXaW5kb3dzLCBTVExwb3J0IG5vdyBhZGFwdCB0byB0aGUgUFNESyB1c2VkIHRvIGJ1aWxkIGl0LiBJdAorCXNob3VsZCBiZSB0aGUgc2FtZSBhcyB0aGUgb25lIHVzZWQgd2hlbiBidWlsZGluZyBhbiBhcHBsaWNhdGlvbiB1c2luZyB0aGUKKwlTVExwb3J0IGxpYnMuIEEgY29tcGF0aWJpbGl0eSBkZXRlY3Rpb24gbWVjYW5pc20gaGFzIGJlZW4gaW1wbGVtZW50ZWQgaW4gb3JkZXIKKwl0byByZXBvcnQgbm90IGhvbW9nZW5lb3VzIGJ1aWxkIGVudmlyb25tZW50IHdpdGggYSBsaW5rIGVycm9yIHJhdGhlciB0aGFuIHVuZGVmaW5lZAorCXJ1bnRpbWUgZXJyb3IuCisKKy0gRW5oYW5jZW1lbnRzOgorCisJKiBVc2Ugb2YgbWFsbG9jIGJhc2VkIGFsbG9jYXRvciBvbiBzeXN0ZW0gaGF2aW5nIEdsaWJDIDIuMyBhbmQgbGF0ZXIsIGtlZXAKKwlub2RlIGFsbG9jYXRvciBmb3Igb3RoZXJzLgorCisJKiBEZWxheSBpbnN0YW5jaWF0aW9uIG9mIHR5cGUgdHJhaXRzIHR5cGUgaW4gdmVjdG9yIGFuZCBkZXF1ZSBpbXBsZW1lbnRhdGlvbiB0bworCWJlIGFibGUgdG8gdXNlIHNvbWUgb2YgdGhlIG5lc3RlZCB0eXBlcyBsaWtlIGl0ZXJhdG9yIGV2ZW4gaWYgdHlwZSB1c2VkIHRvCisJaW5zdGFuY2lhdGUgdGhlIGNvbnRhaW5lciBpcyBub3QgY29tcGxldGVseSBkZWZpbmVkLgorCQorCSogQ29udGFpbmVyIHBvaW50ZXIgc3BlY2lhbGl6YXRpb24gZmVhdHVyZSBub3cgd29ya3MgZXZlbiB3aXRoIGluY29tcGxldGUgdHlwZXMKKwl0aGFua3MgdG8gdXNlIG9mIHBhcnRpYWwgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24uCisKKzUuMToKKworLSBNYWpvciBtb2RpZmljYXRpb25zCisKKwkqIEZvbGRlciBhcmNoaXRlY3R1cmU6IEFsbCBjb25maWd1cmF0aW9uIGZpbGVzIGFyZSBub3cgaW4gc3RscG9ydC9zdGwvY29uZmlnIGZvbGRlci4KKwlzdGxwb3J0L3N0bF91c2VyX2NvbmZpZy5oIHJlbmFtZWQgYW5kIG1vdmVkIGFzIHN0bHBvcnQvc3RsL2NvbmZpZy91c2VyX2NvbmZpZy5oLgorCXN0bHBvcnQvc3RsL19zaXRlX2NvbmZpZy5oIHJlbmFtZWQgYW5kIG1vdmVkIGFzIHN0bHBvcnQvc3RsL2NvbmZpZy9ob3N0cy5oLgorCVNUTHBvcnQgY29uZmlndXJhdGlvbiBub3cgYWxzbyB0cnkgdG8gc2VwZXJhdGUgcGxhdGZvcm0gY29uZmlndXJhdGlvbiBmcm9tIGNvbXBpbGVyCisJb25lLgorCisJKiBBbGxvY2F0b3JzIGltcGxlbWVudGF0aW9uIGlzIGluIHNyYyBmb2xkZXIgdG8gZW5oYW5jZSBlbmNhcHN1bGF0aW9uLiBEZWZhdWx0CisJYWxsb2NhdG9yIHdoZW4gdXNpbmcgU1RMcG9ydCB3aXRob3V0IGJ1aWxkaW5nIGl0IChfU1RMUF9OT19JT1NUUkVBTVMpIGlzIHRoZSBzaW1wbGUKKwluZXcvZGVsZXRlIGJhc2VkIGFsbG9jYXRvciwgbm9kZSBhbGxvY2F0b3IgaXMgdGhlIGRlZmF1bHQgd2hlbiBidWlsZGluZyB0aGUgbGliLgorCisJKiBBY2Nlc3MgdG8gbmF0aXZlIGhlYWRlcnMgaGFzIGJlZW4gbW9kaWZpZWQgdG8gbWFrZSBTVExwb3J0IGxlc3MgZGVwZW5kYW50IG9uCisJbmF0aXZlIGhlYWRlcnMgaW50ZXJuYWwgaW5jbHVkZXMsIHNob3VsZCBpbXByb3ZlIHBvcnRhYmlsaXR5LgorCisJKiBTZWdyZWdhdGlvbiBvZiBoZWFkZXJzIGhhcyBiZWVuIGltcHJvdmVkLiBZb3UgbWlnaHQgaGF2ZSB0byBhZGQgbm93IG1pc3NpbmcKKwlmdW5jdGlvbmFsIG9yIGFsZ29yaXRobSBTdGFuZGFyZCBoZWFkZXJzIGluY2x1ZGUgaW4geW91ciBjb2RlLgorCistIEVuaGFuY2VtZW50cworCisJKiBTdXBwb3J0IGVuaGFuY2VtZW50czoKKwkgIC0gQm9ybGFuZCBjb21waWxlcnMgc3RhcnRpbmcgd2l0aCB0aGUgZnJlZSBvbmUgKDUuNS4xKQorCSAgLSBIUCBhQysrL0FOU0kgQyBCMzkxMEIgQS4wNi4wNgorCSAgLSBWaXN1YWwgU3R1ZGlvIDIwMDUgZm9yIFdpbmRvd3MgQ0UKKwkgIC0gVXNlIG9mIGludHJpbnNpYyB0eXBlIHRyYWl0cyBzdXBwb3J0IG9mIFZpc3VhbCBTdHVkaW8gMjAwNQorCisJKiBJbXByb3ZlZCBtZXRhIHByb2dyYW1taW5nIHRlY2huaXF1ZXMgZXNwZWNpYWxseSBpbiB1bmluaXRpYWxpemVkXyogYWxnb3JpdGhtcy4KKwlJZiB5b3UgbmVlZCBhIHZlY3RvciBvZiBudWxsIHBvaW50ZXIgcHJlZmVyIHRvIHdyaXRlICd2ZWN0b3I8dm9pZCo+IHYoMTApJyByYXRoZXIKKwl0aGFuICd2ZWN0b3I8dm9pZCo+IHYoMTAsICh2b2lkKikwKScuCisKKwkqIEZ1bGx5IGZ1bmN0aW9uYWwgcG9pbnRlciBzcGVjaWFsaXphdGlvbiBmZWF0dXJlIChfU1RMUF9VU0VfUFRSX1NQRUNJQUxJWkFUSU9OUykuCisKKwkqIEV4dGVuc2lvbiBvZiB0ZW1wbGF0ZSBzZWFyY2ggbWV0aG9kcyBpbiBhc3NvY2lhdGl2ZSBhbmQgaGFzaGVkIGNvbnRhaW5lciBoYXMKKwliZWVuIGNvbXBsZXRlZC4KKworCSogU1RMIHNhZmUgbW9kZTogTm93IGRldGVjdCBiYWRseSBpbXBsZW1lbnRlZCBzdHJpY3Qgd2VhayBvcmRlcmluZyBmdW5jdG9ycywgYXNzZXJ0CisJaWYgYSA8IGIgJiYgYiA8IGEuIFNhbWUgZm9yIGVxdWl2YWxlbnQgZnVuY3RvciB1c2VkIGluIGhhc2ggY29udGFpbmVyIGltcGxlbWVudGF0aW9uLAorCWFzc2VydCBpZiBhIDw9PiBiIGJ1dCAhKGIgPD0+IGEpLgorCisJKiBJbXByb3ZlZCBsb2NhbGUgY3JlYXRpb24gZGVsYXkgb24gV2luZG93cyBwbGF0Zm9ybS4KKworCSogU1RMIGNvbnRhaW5lcnMgaW1wbGVtZW50YXRpb24gbm93IGNvcnJlY3RseSBoYW5kbGUgYWxsb2NhdG9ycyB3aXRoIHN0YXRlLiBUaGlzIGtpbmQKKwlvZiBhbGxvY2F0b3IgaGFzIHRvIG92ZXJsb2FkIHN3YXAgbWV0aG9kIGlmIGFueSBzcGVjaWZpYyBhY3Rpb24gaGFzIHRvIGJlIG1hZGUgd2hlbgorCXN3YXBpbmcgMiBpbnN0YW5jZXMuCisKKwkqIFNUTHBvcnQgaXMgcmVhZHkgZm9yIHNhZmUgc3RyaW5nIGZ1bmN0aW9ucyAqX3MgKF9TVExQX1VTRV9TQUZFX1NUUklOR19GVU5DVElPTlMpCisKKwkqIE1hbnkgYnVnIGZpeGVzLCBzZWUgZXRjL0NoYW5nZUxvZy01LjEuCisKKzUuMDoKKworLSBNYWpvciBtb2RpZmljYXRpb25zCisKKwkqIE5vIG1vcmUgd3JhcHBlciBtb2RlOiB5b3UgY2FuIHVzZSBTVExwb3J0IGlvc3RyZWFtcyBvciBubyBpb3N0cmVhbXMKKwlhdCBhbGwuCisKKwkqIF9TVExQX05PX0NVU1RPTV9JTyBub3cgYWxzbyBoaWRlIGJhc2ljX3N0cmluZyBpbXBsZW1lbnRhdGlvbgorCisJKiBpbnRlcm5hbCBuYW1lc3BhY2Ugc2NoZW1hIGhhcyBiZWVuIG1vZGlmaWVkLCBzZWUgZG9jIGZvbGRlciBmb3IgYWRkaXRpb25uYWwKKwlpbmZvcm1hdGlvbnMuCisKKy0gRW5oYW5jZW1lbnRzCisKKwkqIFN1cHBvcnQgb2YgbWFueSBtb2Rlcm4gQysrIGNvbXBpbGVycyBhbmQgcGxhdGZvcm1zCisJICAtIGdjYyAzLjQuMCBhbmQgbGF0ZXIKKwkgIC0gTVNWQyAuTmV0IDIwMDIsIDIwMDMgYW5kIE1TVkMgMjAwNSBCZXRhCisJICAtIFdpbmRvd3MgQ0UgCisJc2VlIGJ1aWxkL3Rlc3QvdW5pdC9TVEFUVVMgZm9yIGEgY29tcGxldGUgbGlzdCBvZiB0ZXN0ZWQgcGxhdGZvcm1zL2NvbXBpbGVycworCisJKiBNb3ZlIHNlbWFudGljOiB2ZWN0b3Igb3IgZGVxdWUgb2YgYW55IG90aGVyIFNUTCBjb250YWluZXJzIGFyZSB1c2luZworCW1vdmUgc2VtYW50aWMgd2hlbiByZXNpemVkIG9yIG1vZGlmaWVkIHJhdGhlciB0aGFuIGNvcHkuCisKKwkqIE5ldyBjaGVja3MgaW4gc2FmZSBTVEwgbW9kZSBsaWtlIG51bGwgcG9pbnRlciBvciBjaGVjayBvZiBpdGVyYXRvciByYW5nZQorCXBhc3MgdG8gY29udGFpbmVyIGNvbnN0cnVjdG9ycy4KKworCSogRXhwcmVzc2lvbiB0ZW1wbGF0ZSBmb3Igc3RyaW5nIGNvbmNhdGVuYXRpb24gb3BlcmF0aW9ucyAoYXZhaWxhYmxlCisJdGhyb3VnaHQgdGhlIF9TVExQX1VTRV9URU1QTEFURV9FWFBSRVNTSU9OIGNvbmZpZyBvcHRpb24pCisKKwkqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBzaG9ydCBzdHJpbmcgb3B0aW1pemF0aW9uIHRyaWNrLCBiYXNpY19zdHJpbmcgaGF2ZQorCWEgc21hbGwgc3RhdGljIGJ1ZmZlciBpbiB0aGlzIGNhc2UuCisKKwkqIFNUTCBjb250YWluZXJzIHZlY3RvciwgZGVxdWUsIGxpc3QgYW5kIHNsaXN0IHBvaW50ZXIgc3BlY2lhbGl6YXRpb24gdG8KKwlsaW1pdCBjb2RlIGJsb2F0cyAoc2VlIF9TVExQX1VTRV9QVFJfU1BFQ0lBTElaQVRJT05TIG9uIGNvbmZpZyBmaWxlKQorCisJKiBVc2Ugb2YgYm9vc3QgdHlwZV90cmFpdHMgcmF0aGVyIHRoYW4gaW50ZXJuYWwgZXF1aXZhbGVudCB3aGVuIHJlcXVlc3RlZAorCShzZWUgX1NUTFBfVVNFX0JPT1NUX1NVUFBPUlQgaW4gY29uZmlnIGZpbGUpCisKKwkqIHNldC9tdWx0aXNldCwgb3IgbWFwL211bHRpbWFwIGl0ZXJhdG9ycyBjYW5ub3QgYmUgY29tcGFyZWQgYW55bW9yZS4KKworCSogdW5vcmRlcmVkX3NldCwgdW5vcmRlcmVkX211bHRpc2V0LCB1bm9yZGVyZWRfbWFwLCB1bm9yZGVyZWRfbXVsdGltYXAgaGFzaAorCWNvbnRhaW5lcnMgaW1wbGVtZW50YXRpb24gc3BlY2lmaWVkIGluIHRoZSBUUjEgZG9jdW1lbnQuCisKKwkqIFRoYW5rcyB0byB0aGUgX1NUTFBfTEVBS1NfUEVEQU5USUMgY29uZmlnIG9wdGlvbiB5b3UgY2FuIGFzayBTVExwb3J0IHRvCisJY2xlYW4gaXRzIG1lbW9yeSBwb29sIGJlZm9yZSBiZWluZyB1bmxvYWRlZCwgdXNlZnVsIHRvIG9ubHkgZGV0ZWN0IHJlYWwKKwltZW1vcnkgbGVhayBwcm9ibGVtcy4KKworCSogQ3JlYXRpb24gb2YgY29uZmlndXJhdGlvbiBzY3JpcHRzIHRvIG1ha2UgU1RMcG9ydCBjb25maWd1cmF0aW9uIGVhc2llci4KKworCSogSW1wcm92bWVudCBvZiBzb21lIGFsZ29yaXRobSBsaWtlIHNlYXJjaF9uIG9yIHN0YWJsZV9zb3J0LgorCisJKiBQb3J0ZWQgdG8gNjQgYml0cyBwbGF0Zm9ybXMuCisKKwkqIExhcmdlIGZpbGUgKCA+IDQgR28pIHN0cmVhbSBzdXBwb3J0IG9uIFdpbjMyIHBsYXRmb3JtLgpkaWZmIC0tZ2l0IGEvZXRjL1NUTHBvcnQtNC41LjEuc3BlYyBiL2V0Yy9TVExwb3J0LTQuNS4xLnNwZWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc2MDdmNQotLS0gL2Rldi9udWxsCisrKyBiL2V0Yy9TVExwb3J0LTQuNS4xLnNwZWMKQEAgLTAsMCArMSw5NiBAQAorJWRlZmluZSBNQUtFRklMRSBnY2MtbGludXgubWFrCisKK1N1bW1hcnk6IENvbXBsZXRlIEMrKyBzdGFuZGFyZCBsaWJyYXJ5CitOYW1lOiBTVExwb3J0CitWZXJzaW9uOiA0LjUuMQorUmVsZWFzZTogMQorQ29weXJpZ2h0OiBmcmVlIChzZWUgbGljZW5zZSksIHNlZSAvdXNyL3NoYXJlL2RvYy8le25hbWV9LSV7dmVyc2lvbn0vbGljZW5zZS5odG1sCitVUkw6IGh0dHA6Ly93d3cuc3RscG9ydC5vcmcvCitQYWNrYWdlcjogTGV2ZW50ZSBGYXJrYXMgPGxmYXJrYXNAbWluZG1ha2VyLmh1PgorR3JvdXA6IFN5c3RlbSBFbnZpcm9ubWVudC9MYW5ndWFnZXMKK0ljb246IHN0bHBvcnRfcG93ZXJlZF93aGl0ZS5naWYKK1NvdXJjZTA6IGh0dHA6Ly93d3cuc3RscG9ydC5vcmcvYXJjaGl2ZS8le25hbWV9LSV7dmVyc2lvbn0udGFyLmd6CitQYXRjaDA6IFNUTHBvcnQtcmVuYW1lLnBhdGNoCisjUGF0Y2gxOiBTVExwb3J0LXJ1bGVzLnBhdGNoCisjUGF0Y2gyOiBTVExwb3J0LWluc3RhbGwtZGlyLnBhdGNoCitCdWlsZHJvb3Q6ICV7X3RtcHBhdGh9LyV7bmFtZX0tJXt2ZXJzaW9ufS0lKGlkIC11IC1uKQorCislZGVzY3JpcHRpb24KK1NUTHBvcnQgaXMgYSBtdWx0aXBsYXRmb3JtIFNUTCBpbXBsZW1lbnRhdGlvbiBiYXNlZCBvbiBTR0kgU1RMLgorVGhpcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBydW50aW1lIGxpYnJhcnkgZm9yIFNUTHBvcnQuCisKKyVwYWNrYWdlIC1uIFNUTHBvcnQtZGV2ZWwKK1N1bW1hcnk6IENvbXBsZXRlIEMrKyBzdGFuZGFyZCBsaWJyYXJ5IGhlYWRlciBmaWxlcyBhbmQgbGlicmFyaWVzCitHcm91cDogRGV2ZWxvcG1lbnQvTGlicmFyaWVzCitSZXF1aXJlczogU1RMcG9ydCA9ICV7dmVyc2lvbn0KKworJWRlc2NyaXB0aW9uIC1uIFNUTHBvcnQtZGV2ZWwKK1NUTHBvcnQgaXMgYSBtdWx0aXBsYXRmb3JtIFNUTCBpbXBsZW1lbnRhdGlvbiBiYXNlZCBvbiBTR0kgU1RMLiBDb21wbGV0ZSAgIAorQysrIHN0YW5kYXJkIGxpYnJhcnksIGluY2x1ZGluZyA8Y29tcGxleD4gYW5kIFNHSSBTVEwgaW9zdHJlYW1zLiBJZiB5b3UKK3dvdWxkIGxpa2UgdG8gdXNlIHlvdXIgY29kZSB3aXRoIFNUTHBvcnQgYWRkCisiLW5vc3RkaW5jKysgLUkvdXNyL2luY2x1ZGUvc3RscG9ydCIgd2hlbiBjb21waWxlIGFuZCAtbHN0bHBvcnRfZ2NjIHdoZW4KK2xpbmsgKGVnOiBnY2MgLW5vc3RkaW5jKysgLUkvdXNyL2luY2x1ZGUvc3RscG9ydCB4LmNjIC1sc3RscG9ydF9nY2MpLgorCislcHJlcAorJXNldHVwCislcGF0Y2gwIC1wMQorIyVwYXRjaDEgLXAxCisjJXBhdGNoMiAtcDEKKworJWJ1aWxkCitjZCBzcmMKK21ha2UgLWYgJXtNQUtFRklMRX0gSU5TVEFMTERJUj0kUlBNX0JVSUxEX1JPT1QvdXNyIGNsZWFuIGFsbAorCislaW5zdGFsbAorcm0gLXJmICRSUE1fQlVJTERfUk9PVAorY2Qgc3JjCittYWtlIC1mICV7TUFLRUZJTEV9IElOU1RBTExESVI9JFJQTV9CVUlMRF9ST09UL3VzciBpbnN0YWxsCitjZCAkUlBNX0JVSUxEX1JPT1QvdXNyL2luY2x1ZGUvc3RscG9ydAorbG4gLXMgLiBleHQKKworJWNsZWFuCitybSAtcmYgJFJQTV9CVUlMRF9ST09UCisKKyVwb3N0IC1wIC9zYmluL2xkY29uZmlnCisKKyVwb3N0dW4gLXAgL3NiaW4vbGRjb25maWcKKworJXBvc3QgLW4gU1RMcG9ydC1kZXZlbAorL3NiaW4vbGRjb25maWcKKworJXBvc3R1biAtbiBTVExwb3J0LWRldmVsCisvc2Jpbi9sZGNvbmZpZworCislZmlsZXMKKyVkZWZhdHRyKC0scm9vdCxyb290KQorJWRvYyBkb2MvbGljZW5zZS5odG1sCisvdXNyL2xpYi9saWJzdGxwb3J0X2djYy5zbworIy91c3IvbGliL2xpYnN0bHBvcnRfZ2NjLnNvLiV7dmVyc2lvbn0KKy91c3IvbGliL2xpYnN0bHBvcnRfZ2NjLnNvLjQuNQorCislZmlsZXMgLW4gU1RMcG9ydC1kZXZlbAorJWRlZmF0dHIoLSxyb290LHJvb3QpCislZG9jIElOU1RBTEwgUkVBRE1FIGRvYyBldGMgdGVzdAorL3Vzci9saWIvbGlic3RscG9ydF9nY2MqLmEKKy91c3IvbGliL2xpYnN0bHBvcnRfZ2NjXypkZWJ1Zy5zbyoKKy91c3IvaW5jbHVkZS8qCisKKyVjaGFuZ2Vsb2cKKyogTW9uIERlYyAxMCAyMDAxIExldmVudGUgRmFya2FzIDxsZmFya2FzQG1pbmRtYWtlci5odT4KKy0gdXBncmFkZSB0byA0LjUuMQorCisqIEZyaSBOb3YgMTYgMjAwMSBMZXZlbnRlIEZhcmthcyA8bGZhcmthc0BtaW5kbWFrZXIuaHU+CistIG1lcmdlIHdpdGggSGFyb2xkJ3MgY2hhbmdlcworCisqIFRodSBOb3YgMTUgMjAwMSA8c3RscG9ydEBsYW5jZWVycGxhYXRzLm5sPgorLSByZWJ1aWxkIGZvciBSZWRIYXQgNy4yLCBzcGVjIGZpbGUgZml4ZXMuCisKKyogVHVlIE9jdCAgMiAyMDAxIExldmVudGUgRmFya2FzIDxsZmFya2FzQG1pbmRtYWtlci5odT4KKy0gdXBncmFkZSB0byA0LjUKKworKiBUaHUgT2N0IDI2IDIwMDAgTGV2ZW50ZSBGYXJrYXMgPGxmYXJrYXNAbWluZG1ha2VyLmh1PgorLSB1cGdyYWRlIHRvIDQuMS1iMworCisqIFRodSBKdWwgMTcgMjAwMCBMZXZlbnRlIEZhcmthcyA8bGZhcmthc0BtaW5kbWFrZXIuaHU+CistIGluaXRpYWwgcmVsZWFzZSB1c2UgU1RMcG9ydC00LjAKKwpkaWZmIC0tZ2l0IGEvZXRjL1NUTHBvcnQtNC41LjMuc3BlYyBiL2V0Yy9TVExwb3J0LTQuNS4zLnNwZWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJlOGNiNwotLS0gL2Rldi9udWxsCisrKyBiL2V0Yy9TVExwb3J0LTQuNS4zLnNwZWMKQEAgLTAsMCArMSw5NiBAQAorJWRlZmluZSBNQUtFRklMRSBnY2MtbGludXgubWFrCisKK1N1bW1hcnk6IENvbXBsZXRlIEMrKyBzdGFuZGFyZCBsaWJyYXJ5CitOYW1lOiBTVExwb3J0CitWZXJzaW9uOiA0LjUuMworUmVsZWFzZTogMQorQ29weXJpZ2h0OiBmcmVlIChzZWUgbGljZW5zZSksIHNlZSAvdXNyL3NoYXJlL2RvYy8le25hbWV9LSV7dmVyc2lvbn0vbGljZW5zZS5odG1sCitVUkw6IGh0dHA6Ly93d3cuc3RscG9ydC5vcmcvCitQYWNrYWdlcjogTGV2ZW50ZSBGYXJrYXMgPGxmYXJrYXNAbWluZG1ha2VyLmh1PgorR3JvdXA6IFN5c3RlbSBFbnZpcm9ubWVudC9MYW5ndWFnZXMKK0ljb246IHN0bHBvcnRfcG93ZXJlZF93aGl0ZS5naWYKK1NvdXJjZTA6IGh0dHA6Ly93d3cuc3RscG9ydC5vcmcvYXJjaGl2ZS8le25hbWV9LSV7dmVyc2lvbn0udGFyLmd6CisjUGF0Y2gwOiBTVExwb3J0LXJlbmFtZS5wYXRjaAorI1BhdGNoMTogU1RMcG9ydC1ydWxlcy5wYXRjaAorI1BhdGNoMjogU1RMcG9ydC1pbnN0YWxsLWRpci5wYXRjaAorQnVpbGRyb290OiAle190bXBwYXRofS8le25hbWV9LSV7dmVyc2lvbn0tJShpZCAtdSAtbikKKworJWRlc2NyaXB0aW9uCitTVExwb3J0IGlzIGEgbXVsdGlwbGF0Zm9ybSBTVEwgaW1wbGVtZW50YXRpb24gYmFzZWQgb24gU0dJIFNUTC4KK1RoaXMgcGFja2FnZSBjb250YWlucyB0aGUgcnVudGltZSBsaWJyYXJ5IGZvciBTVExwb3J0LgorCislcGFja2FnZSAtbiBTVExwb3J0LWRldmVsCitTdW1tYXJ5OiBDb21wbGV0ZSBDKysgc3RhbmRhcmQgbGlicmFyeSBoZWFkZXIgZmlsZXMgYW5kIGxpYnJhcmllcworR3JvdXA6IERldmVsb3BtZW50L0xpYnJhcmllcworUmVxdWlyZXM6IFNUTHBvcnQgPSAle3ZlcnNpb259CisKKyVkZXNjcmlwdGlvbiAtbiBTVExwb3J0LWRldmVsCitTVExwb3J0IGlzIGEgbXVsdGlwbGF0Zm9ybSBTVEwgaW1wbGVtZW50YXRpb24gYmFzZWQgb24gU0dJIFNUTC4gQ29tcGxldGUgICAKK0MrKyBzdGFuZGFyZCBsaWJyYXJ5LCBpbmNsdWRpbmcgPGNvbXBsZXg+IGFuZCBTR0kgU1RMIGlvc3RyZWFtcy4gSWYgeW91Cit3b3VsZCBsaWtlIHRvIHVzZSB5b3VyIGNvZGUgd2l0aCBTVExwb3J0IGFkZAorIi1ub3N0ZGluYysrIC1JL3Vzci9pbmNsdWRlL3N0bHBvcnQiIHdoZW4gY29tcGlsZSBhbmQgLWxzdGxwb3J0X2djYyB3aGVuCitsaW5rIChlZzogZ2NjIC1ub3N0ZGluYysrIC1JL3Vzci9pbmNsdWRlL3N0bHBvcnQgeC5jYyAtbHN0bHBvcnRfZ2NjKS4KKworJXByZXAKKyVzZXR1cAorJXBhdGNoMCAtcDEKKyMlcGF0Y2gxIC1wMQorIyVwYXRjaDIgLXAxCisKKyVidWlsZAorY2Qgc3JjCittYWtlIC1mICV7TUFLRUZJTEV9IElOU1RBTExESVI9JFJQTV9CVUlMRF9ST09UL3VzciBjbGVhbiBhbGwKKworJWluc3RhbGwKK3JtIC1yZiAkUlBNX0JVSUxEX1JPT1QKK2NkIHNyYworbWFrZSAtZiAle01BS0VGSUxFfSBJTlNUQUxMRElSPSRSUE1fQlVJTERfUk9PVC91c3IgaW5zdGFsbAorY2QgJFJQTV9CVUlMRF9ST09UL3Vzci9pbmNsdWRlL3N0bHBvcnQKK2xuIC1zIC4gZXh0CisKKyVjbGVhbgorcm0gLXJmICRSUE1fQlVJTERfUk9PVAorCislcG9zdCAtcCAvc2Jpbi9sZGNvbmZpZworCislcG9zdHVuIC1wIC9zYmluL2xkY29uZmlnCisKKyVwb3N0IC1uIFNUTHBvcnQtZGV2ZWwKKy9zYmluL2xkY29uZmlnCisKKyVwb3N0dW4gLW4gU1RMcG9ydC1kZXZlbAorL3NiaW4vbGRjb25maWcKKworJWZpbGVzCislZGVmYXR0cigtLHJvb3Qscm9vdCkKKyVkb2MgZG9jL2xpY2Vuc2UuaHRtbAorL3Vzci9saWIvbGlic3RscG9ydF9nY2Muc28KKyMvdXNyL2xpYi9saWJzdGxwb3J0X2djYy5zby4le3ZlcnNpb259CisvdXNyL2xpYi9saWJzdGxwb3J0X2djYy5zby40LjUKKworJWZpbGVzIC1uIFNUTHBvcnQtZGV2ZWwKKyVkZWZhdHRyKC0scm9vdCxyb290KQorJWRvYyBJTlNUQUxMIFJFQURNRSBkb2MgZXRjIHRlc3QKKy91c3IvbGliL2xpYnN0bHBvcnRfZ2NjKi5hCisvdXNyL2xpYi9saWJzdGxwb3J0X2djY18qZGVidWcuc28qCisvdXNyL2luY2x1ZGUvKgorCislY2hhbmdlbG9nCisqIE1vbiBEZWMgMTAgMjAwMSBMZXZlbnRlIEZhcmthcyA8bGZhcmthc0BtaW5kbWFrZXIuaHU+CistIHVwZ3JhZGUgdG8gNC41LjEKKworKiBGcmkgTm92IDE2IDIwMDEgTGV2ZW50ZSBGYXJrYXMgPGxmYXJrYXNAbWluZG1ha2VyLmh1PgorLSBtZXJnZSB3aXRoIEhhcm9sZCdzIGNoYW5nZXMKKworKiBUaHUgTm92IDE1IDIwMDEgPHN0bHBvcnRAbGFuY2VlcnBsYWF0cy5ubD4KKy0gcmVidWlsZCBmb3IgUmVkSGF0IDcuMiwgc3BlYyBmaWxlIGZpeGVzLgorCisqIFR1ZSBPY3QgIDIgMjAwMSBMZXZlbnRlIEZhcmthcyA8bGZhcmthc0BtaW5kbWFrZXIuaHU+CistIHVwZ3JhZGUgdG8gNC41CisKKyogVGh1IE9jdCAyNiAyMDAwIExldmVudGUgRmFya2FzIDxsZmFya2FzQG1pbmRtYWtlci5odT4KKy0gdXBncmFkZSB0byA0LjEtYjMKKworKiBUaHUgSnVsIDE3IDIwMDAgTGV2ZW50ZSBGYXJrYXMgPGxmYXJrYXNAbWluZG1ha2VyLmh1PgorLSBpbml0aWFsIHJlbGVhc2UgdXNlIFNUTHBvcnQtNC4wCisKZGlmZiAtLWdpdCBhL2V0Yy9TVExwb3J0LTQuNi5zcGVjIGIvZXRjL1NUTHBvcnQtNC42LnNwZWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM3ZDc4MgotLS0gL2Rldi9udWxsCisrKyBiL2V0Yy9TVExwb3J0LTQuNi5zcGVjCkBAIC0wLDAgKzEsOTkgQEAKKyVkZWZpbmUgTUFLRUZJTEUgZ2NjLWxpbnV4Lm1haworCitTdW1tYXJ5OiBDb21wbGV0ZSBDKysgc3RhbmRhcmQgbGlicmFyeQorTmFtZTogU1RMcG9ydAorVmVyc2lvbjogNC42CitSZWxlYXNlOiAxCitDb3B5cmlnaHQ6IGZyZWUgKHNlZSBsaWNlbnNlKSwgc2VlIC91c3Ivc2hhcmUvZG9jLyV7bmFtZX0tJXt2ZXJzaW9ufS9saWNlbnNlLmh0bWwKK1VSTDogaHR0cDovL3d3dy5zdGxwb3J0Lm9yZy8KK1BhY2thZ2VyOiBMZXZlbnRlIEZhcmthcyA8bGZhcmthc0BtaW5kbWFrZXIuaHU+CitHcm91cDogU3lzdGVtIEVudmlyb25tZW50L0xhbmd1YWdlcworSWNvbjogc3RscG9ydF9wb3dlcmVkX3doaXRlLmdpZgorU291cmNlMDogaHR0cDovL3d3dy5zdGxwb3J0Lm9yZy9hcmNoaXZlLyV7bmFtZX0tJXt2ZXJzaW9ufS50YXIuZ3oKKyNQYXRjaDA6IFNUTHBvcnQtcmVuYW1lLnBhdGNoCisjUGF0Y2gxOiBTVExwb3J0LXJ1bGVzLnBhdGNoCisjUGF0Y2gyOiBTVExwb3J0LWluc3RhbGwtZGlyLnBhdGNoCitCdWlsZHJvb3Q6ICV7X3RtcHBhdGh9LyV7bmFtZX0tJXt2ZXJzaW9ufS0lKGlkIC11IC1uKQorCislZGVzY3JpcHRpb24KK1NUTHBvcnQgaXMgYSBtdWx0aXBsYXRmb3JtIFNUTCBpbXBsZW1lbnRhdGlvbiBiYXNlZCBvbiBTR0kgU1RMLgorVGhpcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBydW50aW1lIGxpYnJhcnkgZm9yIFNUTHBvcnQuCisKKyVwYWNrYWdlIC1uIFNUTHBvcnQtZGV2ZWwKK1N1bW1hcnk6IENvbXBsZXRlIEMrKyBzdGFuZGFyZCBsaWJyYXJ5IGhlYWRlciBmaWxlcyBhbmQgbGlicmFyaWVzCitHcm91cDogRGV2ZWxvcG1lbnQvTGlicmFyaWVzCitSZXF1aXJlczogU1RMcG9ydCA9ICV7dmVyc2lvbn0KKworJWRlc2NyaXB0aW9uIC1uIFNUTHBvcnQtZGV2ZWwKK1NUTHBvcnQgaXMgYSBtdWx0aXBsYXRmb3JtIFNUTCBpbXBsZW1lbnRhdGlvbiBiYXNlZCBvbiBTR0kgU1RMLiBDb21wbGV0ZSAgIAorQysrIHN0YW5kYXJkIGxpYnJhcnksIGluY2x1ZGluZyA8Y29tcGxleD4gYW5kIFNHSSBTVEwgaW9zdHJlYW1zLiBJZiB5b3UKK3dvdWxkIGxpa2UgdG8gdXNlIHlvdXIgY29kZSB3aXRoIFNUTHBvcnQgYWRkCisiLW5vc3RkaW5jKysgLUkvdXNyL2luY2x1ZGUvc3RscG9ydCIgd2hlbiBjb21waWxlIGFuZCAtbHN0bHBvcnRfZ2NjIHdoZW4KK2xpbmsgKGVnOiBnY2MgLW5vc3RkaW5jKysgLUkvdXNyL2luY2x1ZGUvc3RscG9ydCB4LmNjIC1sc3RscG9ydF9nY2MpLgorCislcHJlcAorJXNldHVwCislcGF0Y2gwIC1wMQorIyVwYXRjaDEgLXAxCisjJXBhdGNoMiAtcDEKKworJWJ1aWxkCitjZCBzcmMKK21ha2UgLWYgJXtNQUtFRklMRX0gSU5TVEFMTERJUj0kUlBNX0JVSUxEX1JPT1QvdXNyIGNsZWFuIGFsbAorCislaW5zdGFsbAorcm0gLXJmICRSUE1fQlVJTERfUk9PVAorY2Qgc3JjCittYWtlIC1mICV7TUFLRUZJTEV9IElOU1RBTExESVI9JFJQTV9CVUlMRF9ST09UL3VzciBpbnN0YWxsCitjZCAkUlBNX0JVSUxEX1JPT1QvdXNyL2luY2x1ZGUvc3RscG9ydAorbG4gLXMgLiBleHQKKworJWNsZWFuCitybSAtcmYgJFJQTV9CVUlMRF9ST09UCisKKyVwb3N0IC1wIC9zYmluL2xkY29uZmlnCisKKyVwb3N0dW4gLXAgL3NiaW4vbGRjb25maWcKKworJXBvc3QgLW4gU1RMcG9ydC1kZXZlbAorL3NiaW4vbGRjb25maWcKKworJXBvc3R1biAtbiBTVExwb3J0LWRldmVsCisvc2Jpbi9sZGNvbmZpZworCislZmlsZXMKKyVkZWZhdHRyKC0scm9vdCxyb290KQorJWRvYyBkb2MvbGljZW5zZS5odG1sCisvdXNyL2xpYi9saWJzdGxwb3J0X2djYy5zbworIy91c3IvbGliL2xpYnN0bHBvcnRfZ2NjLnNvLiV7dmVyc2lvbn0KKy91c3IvbGliL2xpYnN0bHBvcnRfZ2NjLnNvLjQuNgorCislZmlsZXMgLW4gU1RMcG9ydC1kZXZlbAorJWRlZmF0dHIoLSxyb290LHJvb3QpCislZG9jIElOU1RBTEwgUkVBRE1FIGRvYyBldGMgdGVzdAorL3Vzci9saWIvbGlic3RscG9ydF9nY2MqLmEKKy91c3IvbGliL2xpYnN0bHBvcnRfZ2NjXypkZWJ1Zy5zbyoKKy91c3IvaW5jbHVkZS8qCisKKyVjaGFuZ2Vsb2cKKyogRnJpIE9jdCAzMSAyMDAzIDxib3Jpc0BzdGxwb3J0LmNvbT4KKy0gdXBncmFkZSB0byA0LjYKKworKiBNb24gRGVjIDEwIDIwMDEgTGV2ZW50ZSBGYXJrYXMgPGxmYXJrYXNAbWluZG1ha2VyLmh1PgorLSB1cGdyYWRlIHRvIDQuNS4xCisKKyogRnJpIE5vdiAxNiAyMDAxIExldmVudGUgRmFya2FzIDxsZmFya2FzQG1pbmRtYWtlci5odT4KKy0gbWVyZ2Ugd2l0aCBIYXJvbGQncyBjaGFuZ2VzCisKKyogVGh1IE5vdiAxNSAyMDAxIDxzdGxwb3J0QGxhbmNlZXJwbGFhdHMubmw+CistIHJlYnVpbGQgZm9yIFJlZEhhdCA3LjIsIHNwZWMgZmlsZSBmaXhlcy4KKworKiBUdWUgT2N0ICAyIDIwMDEgTGV2ZW50ZSBGYXJrYXMgPGxmYXJrYXNAbWluZG1ha2VyLmh1PgorLSB1cGdyYWRlIHRvIDQuNQorCisqIFRodSBPY3QgMjYgMjAwMCBMZXZlbnRlIEZhcmthcyA8bGZhcmthc0BtaW5kbWFrZXIuaHU+CistIHVwZ3JhZGUgdG8gNC4xLWIzCisKKyogVGh1IEp1bCAxNyAyMDAwIExldmVudGUgRmFya2FzIDxsZmFya2FzQG1pbmRtYWtlci5odT4KKy0gaW5pdGlhbCByZWxlYXNlIHVzZSBTVExwb3J0LTQuMAorCmRpZmYgLS1naXQgYS9ldGMvYXV0b2V4cC5kYXQgYi9ldGMvYXV0b2V4cC5kYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVjZWY1YgotLS0gL2Rldi9udWxsCisrKyBiL2V0Yy9hdXRvZXhwLmRhdApAQCAtMCwwICsxLDgzNSBAQAorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBUaGlzIGlzIHRoZSBkZXNjcmlwdGlvbiBvZiBTVExwb3J0IGRhdGEgc3RydWN0dXJlcyBpbiBWaXN1YWwgU3R1ZGlvIGRlYnVnZ2VyCis7IGxhbmd1YWdlLiBUaG9zZSBkZXNjcmlwdGlvbnMgaGFzIGJlZW4gdGVzdGVkIHdpdGggVmlzdWFsIEMrKyAyMDA1IEV4cHJlc3MKKzsgRWRpdGlvbiwgeW91IGFyZSB3ZWxjb21lIHRvIHJlcG9ydCBzdWNjZXNzZnVsIHVzYWdlIHdpdGggYW55IG90aGVyIFZpc3VhbAorOyBTdHVkaW8gdmVyc2lvbi4KKzsgVGhvc2UgZGVzY3JpcHRpb25zIGhhcyBiZWVuIHRlc3RlZCB3aXRoIFNUTHBvcnQgNS4yLjAuCis7IEhvdyB0byB1c2U6IENvcHkvUGFzdGUgdGhpcyBmaWxlIGNvbnRlbnQgaW4gdGhlIGF1dG9leHAuZGF0IGZpbGUgeW91IHdpbGwgZmluZAorOyBpbiB5b3VyIFZpc3VhbCBTdHVkaW8gaW5zdGFsbCwgZm9yIGluc3RhbmNlCis7IEM6XFByb2dyYW0gRmlsZXNcTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gOFxDb21tb243XFBhY2thZ2VzXERlYnVnZ2VyLCBpbiB0aGUKKzsgW1Zpc3VhbGl6ZXJdIHNlY3Rpb24uCis7IFRPRE86IEVuaGFuY2UgZGVidWcgaXRlcmF0b3IgdmlzdWFsaXphdGlvbiB0byByZXBvcnQgZW5kIGl0ZXJhdG9ycy4KKzsgVE9ETzogQWRkIHZpc3VhbGl6YXRpb24gZm9yIHJvcGUuCis7IFRPRE86IEZpeCBiaXRzZXQgdmlzdWFsaXphdGlvbi4KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgc3RscG9ydDo6YmFzaWNfc3RyaW5nCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGxwX3N0ZDo6YmFzaWNfc3RyaW5nPGNoYXIsKj58c3RscHhfc3RkOjpiYXNpY19zdHJpbmc8Y2hhciwqPnxzdGxwbXR4X3N0ZDo6YmFzaWNfc3RyaW5nPGNoYXIsKj58c3RscHhtdHhfc3RkOjpiYXNpY19zdHJpbmc8Y2hhciwqPnxzdGxwZF9zdGQ6OnByaXY6Ol9Ob25EYmdfc3RyPGNoYXIsKj58c3RscGR4X3N0ZDo6cHJpdjo6X05vbkRiZ19zdHI8Y2hhciwqPnxzdGxwZG10eF9zdGQ6OnByaXY6Ol9Ob25EYmdfc3RyPGNoYXIsKj58c3RscGR4bXR4X3N0ZDo6cHJpdjo6X05vbkRiZ19zdHI8Y2hhciwqPnsKKyAgICBwcmV2aWV3CisgICAgKAorICAgICAgICBbJGMuX01fc3RhcnRfb2Zfc3RvcmFnZS5fTV9kYXRhLCBzXQorICAgICkKKworICAgIHN0cmluZ3ZpZXcKKyAgICAoCisgICAgICAgIFskYy5fTV9zdGFydF9vZl9zdG9yYWdlLl9NX2RhdGEsIHNdCisgICAgKQorCisgICAgY2hpbGRyZW4KKyAgICAoCisgICAgICAgICMoCisgICAgICAgICAgICBbcmF3IHZpZXddOiBbJGMsIV0sCisgICAgICAgICAgICBidWZmZXI6IFsodW5zaWduZWQgaW50KSRjLl9NX3N0YXJ0X29mX3N0b3JhZ2UuX01fZGF0YSwgeF0sCisgICAgICAgICAgICBsZW5ndGg6ICRjLl9NX2ZpbmlzaCAtICRjLl9NX3N0YXJ0X29mX3N0b3JhZ2UuX01fZGF0YSwKKyAgICAgICAgICAgIGNhcGFjaXR5OiAjaWYoJGMuX01fc3RhcnRfb2Zfc3RvcmFnZS5fTV9kYXRhID09ICRjLl9NX2J1ZmZlcnMuX01fc3RhdGljX2J1ZikKKyAgICAgICAgICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgICAgICAgICAgJGMuX0RFRkFVTFRfU0laRQorICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICAgICAgICAgICRjLl9NX2J1ZmZlcnMuX01fZW5kX29mX3N0b3JhZ2UgLSAkYy5fTV9zdGFydF9vZl9zdG9yYWdlLl9NX2RhdGEKKyAgICAgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICNhcnJheQorICAgICAgICAgICAgKAorCQkJCWV4cHI6ICRjLl9NX3N0YXJ0X29mX3N0b3JhZ2UuX01fZGF0YVskaV0sCisJCQkJc2l6ZTogJGMuX01fZmluaXNoIC0gJGMuX01fc3RhcnRfb2Zfc3RvcmFnZS5fTV9kYXRhCisJCQkpCisgICAgICAgICkKKyAgICApCit9CisKK3N0bHBfc3RkOjpiYXNpY19zdHJpbmc8dW5zaWduZWQgc2hvcnQsKj58c3RscF9zdGQ6OmJhc2ljX3N0cmluZzx3Y2hhcl90LCo+fHN0bHB4X3N0ZDo6YmFzaWNfc3RyaW5nPHVuc2lnbmVkIHNob3J0LCo+fHN0bHB4X3N0ZDo6YmFzaWNfc3RyaW5nPHdjaGFyX3QsKj58c3RscG10eF9zdGQ6OmJhc2ljX3N0cmluZzx1bnNpZ25lZCBzaG9ydCwqPnxzdGxwbXR4X3N0ZDo6YmFzaWNfc3RyaW5nPHdjaGFyX3QsKj58c3RscHhtdHhfc3RkOjpiYXNpY19zdHJpbmc8dW5zaWduZWQgc2hvcnQsKj58c3RscHhtdHhfc3RkOjpiYXNpY19zdHJpbmc8d2NoYXJfdCwqPnxzdGxwZF9zdGQ6OnByaXY6Ol9Ob25EYmdfc3RyPHVuc2lnbmVkIHNob3J0LCo+fHN0bHBkX3N0ZDo6cHJpdjo6X05vbkRiZ19zdHI8d2NoYXJfdCwqPnxzdGxwZHhfc3RkOjpwcml2OjpfTm9uRGJnX3N0cjx1bnNpZ25lZCBzaG9ydCwqPnxzdGxwZHhfc3RkOjpwcml2OjpfTm9uRGJnX3N0cjx3Y2hhcl90LCo+fHN0bHBkbXR4X3N0ZDo6cHJpdjo6X05vbkRiZ19zdHI8dW5zaWduZWQgc2hvcnQsKj58c3RscGRtdHhfc3RkOjpwcml2OjpfTm9uRGJnX3N0cjx3Y2hhcl90LCo+fHN0bHBkeG10eF9zdGQ6OnByaXY6Ol9Ob25EYmdfc3RyPHVuc2lnbmVkIHNob3J0LCo+fHN0bHBkeG10eF9zdGQ6OnByaXY6Ol9Ob25EYmdfc3RyPHdjaGFyX3QsKj57CisgICAgcHJldmlldworICAgICgKKyAgICAgICAgWyRjLl9NX3N0YXJ0X29mX3N0b3JhZ2UuX01fZGF0YSwgc3VdCisgICAgKQorCisgICAgc3RyaW5ndmlldworICAgICgKKyAgICAgICAgWyRjLl9NX3N0YXJ0X29mX3N0b3JhZ2UuX01fZGF0YSwgc3VdCisgICAgKQorCisgICAgY2hpbGRyZW4KKyAgICAoCisgICAgICAgICMoCisgICAgICAgICAgICBbcmF3IHZpZXddOiBbJGMsIV0sCisgICAgICAgICAgICBidWZmZXI6IFsodW5zaWduZWQgaW50KSRjLl9NX3N0YXJ0X29mX3N0b3JhZ2UuX01fZGF0YSwgeF0sCisgICAgICAgICAgICBsZW5ndGg6ICRjLl9NX2ZpbmlzaCAtICRjLl9NX3N0YXJ0X29mX3N0b3JhZ2UuX01fZGF0YSwKKyAgICAgICAgICAgIGNhcGFjaXR5OiAjaWYoJGMuX01fc3RhcnRfb2Zfc3RvcmFnZS5fTV9kYXRhID09ICRjLl9NX2J1ZmZlcnMuX01fc3RhdGljX2J1ZikKKyAgICAgICAgICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgICAgICAgICAgJGMuX0RFRkFVTFRfU0laRQorICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICAgICAgICAgICRjLl9NX2J1ZmZlcnMuX01fZW5kX29mX3N0b3JhZ2UgLSAkYy5fTV9zdGFydF9vZl9zdG9yYWdlLl9NX2RhdGEKKyAgICAgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICNhcnJheQorICAgICAgICAgICAgKAorCQkJCWV4cHI6ICRjLl9NX3N0YXJ0X29mX3N0b3JhZ2UuX01fZGF0YVskaV0sCisJCQkJc2l6ZTogJGMuX01fZmluaXNoIC0gJGMuX01fc3RhcnRfb2Zfc3RvcmFnZS5fTV9kYXRhCisJCQkpCisgICAgICAgICkKKyAgICApCit9CisKK3N0bHBkX3N0ZDo6YmFzaWNfc3RyaW5nPCo+fHN0bHBkeF9zdGQ6OmJhc2ljX3N0cmluZzwqPnxzdGxwZG10eF9zdGQ6OmJhc2ljX3N0cmluZzwqPnxzdGxwZHhtdHhfc3RkOjpiYXNpY19zdHJpbmc8Kj57CisgICAgcHJldmlldworICAgICgKKwkJJGMuX01fbm9uX2RiZ19pbXBsCisJKQorCisgICAgc3RyaW5ndmlldworICAgICgKKwkJJGMuX01fbm9uX2RiZ19pbXBsCisgICAgKQorCisgICAgY2hpbGRyZW4KKyAgICAoCisgICAgICAgICMoCisgICAgICAgICAgICBbcmF3IHZpZXddOiBbJGMsIV0sCisgICAgICAgICAgICBzdHJpbmc6ICRjLl9NX25vbl9kYmdfaW1wbAorICAgICAgICAgKQorICAgICkKK30KKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBzdGxwb3J0Ojp2ZWN0b3IKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0bHBfc3RkOjp2ZWN0b3I8Ym9vbCwqPnxzdGxweF9zdGQ6OnZlY3Rvcjxib29sLCo+fHN0bHBtdHhfc3RkOjp2ZWN0b3I8Ym9vbCwqPnxzdGxweG10eF9zdGQ6OnZlY3Rvcjxib29sLCo+fHN0bHBkX3N0ZDo6cHJpdjo6X05vbkRiZ192ZWN0b3I8Ym9vbCwqPnxzdGxwZHhfc3RkOjpwcml2OjpfTm9uRGJnX3ZlY3Rvcjxib29sLCo+fHN0bHBkbXR4X3N0ZDo6cHJpdjo6X05vbkRiZ192ZWN0b3I8Ym9vbCwqPnxzdGxwZHhtdHhfc3RkOjpwcml2OjpfTm9uRGJnX3ZlY3Rvcjxib29sLCo+eworICAgIHByZXZpZXcKKyAgICAoCisgICAgICAgICMoCisJCQkiWyIsCisJCQkoJGMuX01fZmluaXNoLl9NX3AgLSAkYy5fTV9zdGFydC5fTV9wKSAqIHNpemVvZih1bnNpZ25lZCBpbnQpICogOCArICRjLl9NX2ZpbmlzaC5fTV9vZmZzZXQsCisJCQkiXSgiLAorCQkJI2FycmF5CisJCQkoCisJCQkJZXhwciA6ICgkYy5fTV9zdGFydC5fTV9wWyRpIC8gKHNpemVvZih1bnNpZ25lZCBpbnQpICogOCldID4+ICgkaSAlIChzaXplb2YodW5zaWduZWQgaW50KSAqIDgpKSksCisJCQkJc2l6ZSA6ICgoJGMuX01fZmluaXNoLl9NX3AgLSAkYy5fTV9zdGFydC5fTV9wKSAqIHNpemVvZih1bnNpZ25lZCBpbnQpICogOCArICRjLl9NX2ZpbmlzaC5fTV9vZmZzZXQpCisJCQkpICA6IChib29sKSgkZSAmIDEpLAorCQkJIikiCisJCSkKKwkpCisJY2hpbGRyZW4KKwkoCisJCSMoCisJCQlbcmF3IHZpZXddOiBbJGMsIV0sCisJCQlidWZmZXIgOiBbKHVuc2lnbmVkIGludCkkYy5fTV9zdGFydC5fTV9wLCB4XSwKKwkJCXNpemUgOiAoKCRjLl9NX2ZpbmlzaC5fTV9wIC0gJGMuX01fc3RhcnQuX01fcCkgKiBzaXplb2YodW5zaWduZWQgaW50KSAqIDggKyAkYy5fTV9maW5pc2guX01fb2Zmc2V0KSwKKwkJCSNhcnJheQorCQkJKAorCQkJCWV4cHIgOiAoJGMuX01fc3RhcnQuX01fcFskaSAvIChzaXplb2YodW5zaWduZWQgaW50KSAqIDgpXSA+PiAoJGkgJSAoc2l6ZW9mKHVuc2lnbmVkIGludCkgKiA4KSkpLAorCQkJCXNpemUgOiAoKCRjLl9NX2ZpbmlzaC5fTV9wIC0gJGMuX01fc3RhcnQuX01fcCkgKiBzaXplb2YodW5zaWduZWQgaW50KSAqIDggKyAkYy5fTV9maW5pc2guX01fb2Zmc2V0KQorCQkJKSAgOiAoYm9vbCkoJGUgJiAxKQorCQkpCisJKQorfQorCitzdGxwX3N0ZDo6cHJpdjo6X0JpdF9pdGVyPCo+fHN0bHB4X3N0ZDo6cHJpdjo6X0JpdF9pdGVyPCo+fHN0bHBtdHhfc3RkOjpwcml2OjpfQml0X2l0ZXI8Kj58c3RscHhtdHhfc3RkOjpwcml2OjpfQml0X2l0ZXI8Kj58c3RscGRfc3RkOjpwcml2OjpfQml0X2l0ZXI8Kj58c3RscGR4X3N0ZDo6cHJpdjo6X0JpdF9pdGVyPCo+fHN0bHBkbXR4X3N0ZDo6cHJpdjo6OjpfQml0X2l0ZXI8Kj58c3RscGR4bXR4X3N0ZDo6cHJpdjo6X0JpdF9pdGVyPCo+eworCXByZXZpZXcKKwkoCisJCSMoCisJCQkoYm9vbCkgKCgoKiRjLl9NX3ApID4+ICRjLl9NX29mZnNldCkgJiAxKQorCQkpCisJKQorCWNoaWxkcmVuCisJKAorCQkjKAorCQkJW3JhdyB2aWV3XTogWyRjLCFdLAorCQkJdmFsdWUgOiAoYm9vbCkgKCgoKiRjLl9NX3ApID4+ICRjLl9NX29mZnNldCkgJiAxKQorCQkpCisJKQorfQorCitzdGxwX3N0ZDo6dmVjdG9yPCo+fHN0bHB4X3N0ZDo6dmVjdG9yPCo+fHN0bHBtdHhfc3RkOjp2ZWN0b3I8Kj58c3RscHhtdHhfc3RkOjp2ZWN0b3I8Kj58c3RscGRfc3RkOjpwcml2OjpfTm9uRGJnX3ZlY3RvcjwqPnxzdGxwZHhfc3RkOjpwcml2OjpfTm9uRGJnX3ZlY3RvcjwqPnxzdGxwZG10eF9zdGQ6OnByaXY6Ol9Ob25EYmdfdmVjdG9yPCo+fHN0bHBkeG10eF9zdGQ6OnByaXY6Ol9Ob25EYmdfdmVjdG9yPCo+eworICAgIHByZXZpZXcKKyAgICAoCisgICAgICAgICMoCisgICAgICAgICAgICAiWyIsCisgICAgICAgICAgICAkYy5fTV9maW5pc2ggLSAkYy5fTV9zdGFydCwKKyAgICAgICAgICAgICIvIiwKKyAgICAgICAgICAgICRjLl9NX2VuZF9vZl9zdG9yYWdlLl9NX2RhdGEgLSAkYy5fTV9zdGFydCwKKyAgICAgICAgICAgICJdKCIsCisgICAgICAgICAgICAjYXJyYXkKKyAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICBleHByIDogICgkYy5fTV9zdGFydClbJGldLAorICAgICAgICAgICAgICAgIHNpemUgOiAgJGMuX01fZmluaXNoIC0gJGMuX01fc3RhcnQKKyAgICAgICAgICAgICksCisgICAgICAgICAgICAiKSIKKyAgICAgICAgKQorICAgICkKKyAgICBjaGlsZHJlbgorICAgICgKKyAgICAgICAgIygKKyAgICAgICAgICAgIFtyYXcgdmlld106IFskYywhXSwKKyAgICAgICAgICAgIHNpemUgOiAkYy5fTV9maW5pc2ggLSAkYy5fTV9zdGFydCwKKyAgICAgICAgICAgIGNhcGFjaXR5IDogJGMuX01fZW5kX29mX3N0b3JhZ2UuX01fZGF0YSAtICRjLl9NX3N0YXJ0LAorICAgICAgICAgICAgI2FycmF5CisgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgZXhwciA6ICAoJGMuX01fc3RhcnQpWyRpXSwKKyAgICAgICAgICAgICAgICBzaXplIDogICRjLl9NX2ZpbmlzaCAtICRjLl9NX3N0YXJ0CisgICAgICAgICAgICApCisgICAgICAgICkKKyAgICApCit9CisKK3N0bHBkX3N0ZDo6dmVjdG9yPCo+fHN0bHBkeF9zdGQ6OnZlY3RvcjwqPnxzdGxwZG10eF9zdGQ6OnZlY3RvcjwqPnxzdGxwZHhtdHhfc3RkOjp2ZWN0b3I8Kj57CisgICAgcHJldmlldworICAgICgKKwkJJGMuX01fbm9uX2RiZ19pbXBsCisgICAgKQorICAgIGNoaWxkcmVuCisgICAgKAorICAgICAgICAjKAorICAgICAgICAgICAgW3JhdyB2aWV3XSA6IFskYywhXSwKKyAgICAgICAgICAgIHZlY3RvciA6ICRjLl9NX25vbl9kYmdfaW1wbAorICAgICAgICAgKQorICAgICkKK30KKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBzdGxwb3J0OjpkZXF1ZQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RscF9zdGQ6OmRlcXVlPCosKj58c3RscHhfc3RkOjpkZXF1ZTwqLCo+fHN0bHBtdHhfc3RkOjpkZXF1ZTwqLCo+fHN0bHB4bXR4X3N0ZDo6ZGVxdWU8KiwqPnxzdGxwZF9zdGQ6OnByaXY6Ol9Ob25EYmdfZGVxdWU8KiwqPnxzdGxwZHhfc3RkOjpwcml2OjpfTm9uRGJnX2RlcXVlPCosKj58c3RscGRtdHhfc3RkOjpwcml2OjpfTm9uRGJnX2RlcXVlPCosKj58c3RscGR4bXR4X3N0ZDo6cHJpdjo6X05vbkRiZ19kZXF1ZTwqLCo+eworICAgIHByZXZpZXcKKyAgICAoCisJCSNpZiAoKCh1bnNpZ25lZCBpbnQpKCRjLl9NX3N0YXJ0Ll9NX2N1ciArIDEpIC0gKCh1bnNpZ25lZCBpbnQpJGMuX01fc3RhcnQuX01fY3VyKSkgPCBfTUFYX0JZVEVTKQorCQkoCisJCQkjKAorCQkJCSJbIiwKKwkJCQkoKCRjLl9NX2ZpbmlzaC5fTV9ub2RlIC0gJGMuX01fc3RhcnQuX01fbm9kZSArIDEpICogKF9NQVhfQllURVMgLyBzaXplb2YoJFQxKSkpIC0gKCRjLl9NX3N0YXJ0Ll9NX2N1ciAtICRjLl9NX3N0YXJ0Ll9NX2ZpcnN0KSAtICgkYy5fTV9maW5pc2guX01fbGFzdCAtICRjLl9NX2ZpbmlzaC5fTV9jdXIpLAorCQkJCSIvIiwKKwkJCQkoJGMuX01fZmluaXNoLl9NX25vZGUgLSAkYy5fTV9zdGFydC5fTV9ub2RlICsgMSkgKiAoX01BWF9CWVRFUyAvIHNpemVvZigkVDEpKSAtIDEsCisJCQkJIl0oIiwKKwkJCQkjYXJyYXkKKwkJCQkoCisJCQkJCWV4cHIgOiAqKCooJGMuX01fc3RhcnQuX01fbm9kZSArICgoJGkgKyAoJGMuX01fc3RhcnQuX01fY3VyIC0gJGMuX01fc3RhcnQuX01fZmlyc3QpKSAvIChfTUFYX0JZVEVTIC8gc2l6ZW9mKCRUMSkpKSkgKyAoKCRpICsgKCRjLl9NX3N0YXJ0Ll9NX2N1ciAtICRjLl9NX3N0YXJ0Ll9NX2ZpcnN0KSkgJSAoX01BWF9CWVRFUyAvIHNpemVvZigkVDEpKSkpLAorCQkJCQlzaXplIDogKCgkYy5fTV9maW5pc2guX01fbm9kZSAtICRjLl9NX3N0YXJ0Ll9NX25vZGUgKyAxKSAqIChfTUFYX0JZVEVTIC8gc2l6ZW9mKCRUMSkpKSAtICgkYy5fTV9zdGFydC5fTV9jdXIgLSAkYy5fTV9zdGFydC5fTV9maXJzdCkgLSAoJGMuX01fZmluaXNoLl9NX2xhc3QgLSAkYy5fTV9maW5pc2guX01fY3VyKQorCQkJCSksCisJCQkJIikiCisJCQkpCisJCSkKKwkJI2Vsc2UKKwkJKAorCQkJIygKKwkJCQkiWyIsCisJCQkJJGMuX01fZmluaXNoLl9NX25vZGUgLSAkYy5fTV9zdGFydC5fTV9ub2RlLAorCQkJCSIvIiwKKwkJCQkkYy5fTV9maW5pc2guX01fbm9kZSAtICRjLl9NX3N0YXJ0Ll9NX25vZGUsCisJCQkJIl0oIiwKKwkJCQkjYXJyYXkKKwkJCQkoCisJCQkJCWV4cHIgOiAqKigkYy5fTV9zdGFydC5fTV9ub2RlICsgJGkpLAorCQkJCQlzaXplIDogJGMuX01fZmluaXNoLl9NX25vZGUgLSAkYy5fTV9zdGFydC5fTV9ub2RlCisJCQkJKSwKKwkJCQkiKSIKKwkJCSkKKwkJKQorICAgICkKKyAgICBjaGlsZHJlbgorICAgICgKKwkJI2lmICgoKHVuc2lnbmVkIGludCkoJGMuX01fc3RhcnQuX01fY3VyICsgMSkgLSAoKHVuc2lnbmVkIGludCkkYy5fTV9zdGFydC5fTV9jdXIpKSA8IF9NQVhfQllURVMpCisJCSgKKwkJCSMoCisJCQkJW3JhdyB2aWV3XTogWyRjLCFdLAorCQkJCXNpemUgOiAoKCRjLl9NX2ZpbmlzaC5fTV9ub2RlIC0gJGMuX01fc3RhcnQuX01fbm9kZSArIDEpICogKF9NQVhfQllURVMgLyBzaXplb2YoJFQxKSkpIC0gKCRjLl9NX3N0YXJ0Ll9NX2N1ciAtICRjLl9NX3N0YXJ0Ll9NX2ZpcnN0KSAtICgkYy5fTV9maW5pc2guX01fbGFzdCAtICRjLl9NX2ZpbmlzaC5fTV9jdXIpLAorCQkJCWNhcGFjaXR5IDogKCRjLl9NX2ZpbmlzaC5fTV9ub2RlIC0gJGMuX01fc3RhcnQuX01fbm9kZSArIDEpICogKF9NQVhfQllURVMgLyBzaXplb2YoJFQxKSkgLSAxLAorCQkJCWZyb250IGZyZWUgc3BhY2UgOiAkYy5fTV9zdGFydC5fTV9jdXIgLSAkYy5fTV9zdGFydC5fTV9maXJzdCwKKwkJCQliYWNrIGZyZWUgc3BhY2UgOiAkYy5fTV9maW5pc2guX01fbGFzdCAtICRjLl9NX2ZpbmlzaC5fTV9jdXIgLSAxLAorCQkJCSNhcnJheQorCQkJCSgKKwkJCQkJZXhwciA6ICooKigkYy5fTV9zdGFydC5fTV9ub2RlICsgKCgkaSArICgkYy5fTV9zdGFydC5fTV9jdXIgLSAkYy5fTV9zdGFydC5fTV9maXJzdCkpIC8gKF9NQVhfQllURVMgLyBzaXplb2YoJFQxKSkpKSArICgoJGkgKyAoJGMuX01fc3RhcnQuX01fY3VyIC0gJGMuX01fc3RhcnQuX01fZmlyc3QpKSAlIChfTUFYX0JZVEVTIC8gc2l6ZW9mKCRUMSkpKSksCisJCQkJCXNpemUgOiAoKCRjLl9NX2ZpbmlzaC5fTV9ub2RlIC0gJGMuX01fc3RhcnQuX01fbm9kZSArIDEpICogKF9NQVhfQllURVMgLyBzaXplb2YoJFQxKSkpIC0gKCRjLl9NX3N0YXJ0Ll9NX2N1ciAtICRjLl9NX3N0YXJ0Ll9NX2ZpcnN0KSAtICgkYy5fTV9maW5pc2guX01fbGFzdCAtICRjLl9NX2ZpbmlzaC5fTV9jdXIpCisJCQkJKQorCQkJKQorCQkpCisJCSNlbHNlCisJCSgKKwkJCSMoCisJCQkJW3JhdyB2aWV3XSA6IFskYywhXSwKKwkJCQlzaXplIDogJGMuX01fZmluaXNoLl9NX25vZGUgLSAkYy5fTV9zdGFydC5fTV9ub2RlLAorCQkJCWNhcGFjaXR5IDogJGMuX01fZmluaXNoLl9NX25vZGUgLSAkYy5fTV9zdGFydC5fTV9ub2RlLAorCQkJCWZyb250IGZyZWUgc3BhY2UgOiAkYy5fTV9zdGFydC5fTV9jdXIgLSAkYy5fTV9zdGFydC5fTV9maXJzdCwKKwkJCQliYWNrIGZyZWUgc3BhY2UgOiAkYy5fTV9maW5pc2guX01fbGFzdCAtICRjLl9NX2ZpbmlzaC5fTV9jdXIgLSAxLAorCQkJCSNhcnJheQorCQkJCSgKKwkJCQkJZXhwciA6ICoqKCRjLl9NX3N0YXJ0Ll9NX25vZGUgKyAkaSksCisJCQkJCXNpemUgOiAkYy5fTV9maW5pc2guX01fbm9kZSAtICRjLl9NX3N0YXJ0Ll9NX25vZGUKKwkJCQkpCisJCQkpCisJCSkKKyAgICApCit9CisKK3N0bHBfc3RkOjpwcml2OjpfRGVxdWVfaXRlcmF0b3I8Kj58c3RscHhfc3RkOjpwcml2OjpfRGVxdWVfaXRlcmF0b3I8Kj58c3RscG10eF9zdGQ6OnByaXY6Ol9EZXF1ZV9pdGVyYXRvcjwqPnxzdGxweG10eF9zdGQ6OnByaXY6Ol9EZXF1ZV9pdGVyYXRvcjwqPnxzdGxwZF9zdGQ6OnByaXY6Ol9EZXF1ZV9pdGVyYXRvcjwqPnxzdGxwZHhfc3RkOjpwcml2OjpfRGVxdWVfaXRlcmF0b3I8Kj58c3RscGRtdHhfc3RkOjpwcml2OjpfRGVxdWVfaXRlcmF0b3I8Kj58c3RscGR4bXR4X3N0ZDo6cHJpdjo6X0RlcXVlX2l0ZXJhdG9yPCo+eworCXByZXZpZXcKKwkoCisJCSooJGMuX01fY3VyKQorCSkKKyAgICBjaGlsZHJlbgorICAgICgKKyAgICAgICAgIygKKyAgICAgICAgICAgIFtyYXcgdmlld10gOiBbJGMsICFdLAorICAgICAgICAgICAgcHRyIDogWyh1bnNpZ25lZCBpbnQpKCRjLl9NX2N1ciksIHhdLAorICAgICAgICAgICAgdmFsdWUgOiAqKCRjLl9NX2N1cikKKyAgICAgICAgKQorICAgICkKK30KKworc3RscGRfc3RkOjpkZXF1ZTwqPnxzdGxwZHhfc3RkOjpkZXF1ZTwqPnxzdGxwZG10eF9zdGQ6OmRlcXVlPCo+fHN0bHBkeG10eF9zdGQ6OmRlcXVlPCo+eworICAgIHByZXZpZXcKKyAgICAoCisJCSRjLl9NX25vbl9kYmdfaW1wbAorCSkKKyAgICBjaGlsZHJlbgorICAgICgKKyAgICAgICAgIygKKyAgICAgICAgICAgIFtyYXcgdmlld10gOiBbJGMsIV0sCisgICAgICAgICAgICBkZXF1ZSA6ICRjLl9NX25vbl9kYmdfaW1wbAorICAgICAgICApCisgICAgKQorfQorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHN0bHBvcnQ6Omxpc3QKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0bHBfc3RkOjpsaXN0PCosKj58c3RscHhfc3RkOjpsaXN0PCosKj58c3RscG10eF9zdGQ6Omxpc3Q8KiwqPnxzdGxweG10eF9zdGQ6Omxpc3Q8KiwqPnxzdGxwZF9zdGQ6OnByaXY6Ol9Ob25EYmdfbGlzdDwqLCo+fHN0bHBkeF9zdGQ6OnByaXY6Ol9Ob25EYmdfbGlzdDwqLCo+fHN0bHBkbXR4X3N0ZDo6cHJpdjo6X05vbkRiZ19saXN0PCosKj58c3RscGR4bXR4X3N0ZDo6cHJpdjo6X05vbkRiZ19saXN0PCosKj57CisgICAgcHJldmlldworICAgICgKKwkJIygKKwkJCSIoIiwKKwkJCSNsaXN0CisJCQkoCisJCQkJaGVhZCA6ICRjLl9NX25vZGUuX01fZGF0YS5fTV9uZXh0LAorCQkJCXNraXAgOiAmKCRjLl9NX25vZGUuX01fZGF0YSksCisJCQkJbmV4dCA6IF9NX25leHQsCisJCQkpOiAjKCAqKCRUMSopKCYoJGUpICsgMSkpLAorCQkJIikiCisJCSkKKyAgICApCisgICAgY2hpbGRyZW4KKyAgICAoCisgICAgICAgICMoCisgICAgICAgICAgICBbcmF3IHZpZXddOiBbJGMsIV0sCisgICAgICAgICAgICAjbGlzdAorICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgIGhlYWQgOiAkYy5fTV9ub2RlLl9NX2RhdGEuX01fbmV4dCwKKwkJCQlza2lwIDogJigkYy5fTV9ub2RlLl9NX2RhdGEpLAorICAgICAgICAgICAgICAgIG5leHQgOiBfTV9uZXh0LAorICAgICAgICAgICAgKTogIyggKigkVDEqKSgmKCRlKSArIDEpKQorICAgICAgICApCisgICAgKQorfQorCitzdGxwX3N0ZDo6cHJpdjo6X0xpc3RfaXRlcmF0b3I8KiwqPnxzdGxweF9zdGQ6OnByaXY6Ol9MaXN0X2l0ZXJhdG9yPCosKj58c3RscG10eF9zdGQ6OnByaXY6Ol9MaXN0X2l0ZXJhdG9yPCosKj58c3RscHhtdHhfc3RkOjpwcml2OjpfTGlzdF9pdGVyYXRvcjwqLCo+fHN0bHBkX3N0ZDo6cHJpdjo6X0xpc3RfaXRlcmF0b3I8KiwqPnxzdGxwZHhfc3RkOjpwcml2OjpfTGlzdF9pdGVyYXRvcjwqLCo+fHN0bHBkbXR4X3N0ZDo6cHJpdjo6X0xpc3RfaXRlcmF0b3I8KiwqPnxzdGxwZHhtdHhfc3RkOjpwcml2OjpfTGlzdF9pdGVyYXRvcjwqLCo+eworICAgIHByZXZpZXcKKyAgICAoCisgICAgICAgICMoKigkVDEgKikoJGMuX01fbm9kZSArIDEpKQorICAgICkKKyAgICBjaGlsZHJlbgorICAgICgKKyAgICAgICAgIygKKyAgICAgICAgICAgIFtyYXcgdmlld10gOiBbJGMsICFdLAorICAgICAgICAgICAgcHRyIDogWyh1bnNpZ25lZCBpbnQpKCRjLl9NX25vZGUgKyAxKSwgeF0sCisgICAgICAgICAgICB2YWx1ZSA6ICooJFQxICopKCRjLl9NX25vZGUgKyAxKQorICAgICAgICApCisgICAgKQorfQorCitzdGxwZF9zdGQ6Omxpc3Q8KiwqPnxzdGxwZHhfc3RkOjpsaXN0PCosKj58c3RscGRtdHhfc3RkOjpsaXN0PCosKj58c3RscGR4bXR4X3N0ZDo6bGlzdDwqLCo+eworICAgIHByZXZpZXcKKyAgICAoCisJCSRjLl9NX25vbl9kYmdfaW1wbAorICAgICkKKyAgICBjaGlsZHJlbgorICAgICgKKyAgICAgICAgIygKKyAgICAgICAgICAgIFtyYXcgdmlld10gOiBbJGMsIV0sCisgICAgICAgICAgICBsaXN0IDogJGMuX01fbm9uX2RiZ19pbXBsCisgICAgICAgICkKKyAgICApCit9CisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgc3RscG9ydDo6c2xpc3QKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0bHBfc3RkOjpzbGlzdDwqLCo+fHN0bHB4X3N0ZDo6c2xpc3Q8KiwqPnxzdGxwbXR4X3N0ZDo6c2xpc3Q8KiwqPnxzdGxweG10eF9zdGQ6OnNsaXN0PCosKj58c3RscGRfc3RkOjpwcml2OjpfTm9uRGJnX3NsaXN0PCosKj58c3RscGR4X3N0ZDo6cHJpdjo6X05vbkRiZ19zbGlzdDwqLCo+fHN0bHBkbXR4X3N0ZDo6cHJpdjo6X05vbkRiZ19zbGlzdDwqLCo+fHN0bHBkeG10eF9zdGQ6OnByaXY6Ol9Ob25EYmdfc2xpc3Q8KiwqPnsKKyAgICBwcmV2aWV3CisgICAgKAorCQkjKAorCQkJIigiLAorCQkJI2xpc3QKKwkJCSgKKwkJCQloZWFkIDogJGMuX01faGVhZC5fTV9kYXRhLl9NX25leHQsCisJCQkJc2tpcCA6ICYoJGMuX01faGVhZC5fTV9kYXRhKSwKKwkJCQluZXh0IDogX01fbmV4dCwKKwkJCSk6ICMoICooJFQxKikoJigkZSkgKyAxKSksCisJCQkiKSIKKwkJKQorICAgICkKKyAgICBjaGlsZHJlbgorICAgICgKKyAgICAgICAgIygKKyAgICAgICAgICAgIFtyYXcgdmlld106IFskYywhXSwKKyAgICAgICAgICAgICNsaXN0CisgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgaGVhZCA6ICRjLl9NX2hlYWQuX01fZGF0YS5fTV9uZXh0LAorCQkJCXNraXAgOiAmKCRjLl9NX2hlYWQuX01fZGF0YSksCisgICAgICAgICAgICAgICAgbmV4dCA6IF9NX25leHQsCisgICAgICAgICAgICApOiAjKCAqKCRUMSopKCYoJGUpICsgMSkpCisgICAgICAgICkKKyAgICApCit9CisKK3N0bHBfc3RkOjpwcml2OjpfU2xpc3RfaXRlcmF0b3I8KiwqPnxzdGxweF9zdGQ6OnByaXY6Ol9TbGlzdF9pdGVyYXRvcjwqLCo+fHN0bHBtdHhfc3RkOjpwcml2OjpfU2xpc3RfaXRlcmF0b3I8KiwqPnxzdGxweG10eF9zdGQ6OnByaXY6Ol9TbGlzdF9pdGVyYXRvcjwqLCo+fHN0bHBkX3N0ZDo6cHJpdjo6X1NsaXN0X2l0ZXJhdG9yPCosKj58c3RscGR4X3N0ZDo6cHJpdjo6X1NsaXN0X2l0ZXJhdG9yPCosKj58c3RscGRtdHhfc3RkOjpwcml2OjpfU2xpc3RfaXRlcmF0b3I8KiwqPnxzdGxwZHhtdHhfc3RkOjpwcml2OjpfU2xpc3RfaXRlcmF0b3I8KiwqPnsKKyAgICBwcmV2aWV3CisgICAgKAorICAgICAgICAjKCooJFQxICopKCRjLl9NX25vZGUgKyAxKSkKKyAgICApCisgICAgY2hpbGRyZW4KKyAgICAoCisgICAgICAgICMoCisgICAgICAgICAgICBbcmF3IHZpZXddIDogWyRjLCFdLAorICAgICAgICAgICAgcHRyIDogWyh1bnNpZ25lZCBpbnQpKCRjLl9NX25vZGUgKyAxKSwgeF0sCisgICAgICAgICAgICB2YWx1ZSA6ICooJFQxICopKCRjLl9NX25vZGUgKyAxKQorICAgICAgICApCisgICAgKQorfQorCitzdGxwZF9zdGQ6OnNsaXN0PCosKj58c3RscGR4X3N0ZDo6c2xpc3Q8KiwqPnxzdGxwZG10eF9zdGQ6OnNsaXN0PCosKj58c3RscGR4bXR4X3N0ZDo6c2xpc3Q8KiwqPnsKKyAgICBwcmV2aWV3CisgICAgKAorCQkkYy5fTV9ub25fZGJnX2ltcGwKKyAgICApCisgICAgY2hpbGRyZW4KKyAgICAoCisgICAgICAgICMoCisgICAgICAgICAgICBbcmF3IHZpZXddIDogWyRjLCFdLAorICAgICAgICAgICAgW3NsaXN0XSA6ICRjLl9NX25vbl9kYmdfaW1wbAorICAgICAgICApCisgICAgKQorfQorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHN0bHBvcnQ6OnBhaXIKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0bHBfc3RkOjpwYWlyPCosKj58c3RscHhfc3RkOjpwYWlyPCosKj58c3RscG10eF9zdGQ6OnBhaXI8KiwqPnxzdGxweG10eF9zdGQ6OnBhaXI8KiwqPnxzdGxwZF9zdGQ6OnBhaXI8KiwqPnxzdGxwZHhfc3RkOjpwYWlyPCosKj58c3RscGRtdHhfc3RkOjpwYWlyPCosKj58c3RscGR4bXR4X3N0ZDo6cGFpcjwqLCo+eworICAgIHByZXZpZXcKKyAgICAoCisgICAgICAgICMoCisgICAgICAgICAgICAiKCIsCisgICAgICAgICAgICAkYy5maXJzdCwKKyAgICAgICAgICAgICIsICIsCisgICAgICAgICAgICAkYy5zZWNvbmQsCisgICAgICAgICAgICAiKSIKKyAgICAgICAgKQorICAgICkKK30KKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBzdGxwb3J0OjptYXAsIHN0bHBvcnQ6Om11bHRpbWFwLCBzdGxwb3J0OjpzZXQsIHN0bHBvcnQ6Om11bHRpc2V0Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGxwX3N0ZDo6bWFwPCo+fHN0bHB4X3N0ZDo6bWFwPCo+fHN0bHBtdHhfc3RkOjptYXA8Kj58c3RscHhtdHhfc3RkOjptYXA8Kj58c3RscF9zdGQ6Om11bHRpbWFwPCo+fHN0bHB4X3N0ZDo6bXVsdGltYXA8Kj58c3RscG10eF9zdGQ6Om11bHRpbWFwPCo+fHN0bHB4bXR4X3N0ZDo6bXVsdGltYXA8Kj58c3RscF9zdGQ6OnNldDwqPnxzdGxweF9zdGQ6OnNldDwqPnxzdGxwbXR4X3N0ZDo6c2V0PCo+fHN0bHB4bXR4X3N0ZDo6c2V0PCo+fHN0bHBfc3RkOjptdWx0aXNldDwqPnxzdGxweF9zdGQ6Om11bHRpc2V0PCo+fHN0bHBtdHhfc3RkOjptdWx0aXNldDwqPnxzdGxweG10eF9zdGQ6Om11bHRpc2V0PCo+eworICAgIHByZXZpZXcKKyAgICAoCisJCSMoCisJCQkiWyIsCisJCQkkYy5fTV90Ll9NX25vZGVfY291bnQsCisJCQkiXSgiLAorCQkJJGMuX01fdCwKKwkJCSIpIgorCQkpCisgICAgKQorICAgIGNoaWxkcmVuCisgICAgKAorICAgICAgICAjKAorICAgICAgICAgICAgW3JhdyB2aWV3XTogWyRjLCFdLAorICAgICAgICAgICAgc2l6ZTogWyRjLl9NX3QuX01fbm9kZV9jb3VudF0sCisgICAgICAgICAgICB0cmVlOiAkYy5fTV90CisgICAgICAgICkKKyAgICApCit9CisKK3N0bHBkX3N0ZDo6bWFwPCo+fHN0bHBkeF9zdGQ6Om1hcDwqPnxzdGxwZG10eF9zdGQ6Om1hcDwqPnxzdGxwZHhtdHhfc3RkOjptYXA8Kj58c3RscGRfc3RkOjptdWx0aW1hcDwqPnxzdGxwZHhfc3RkOjptdWx0aW1hcDwqPnxzdGxwZG10eF9zdGQ6Om11bHRpbWFwPCo+fHN0bHBkeG10eF9zdGQ6Om11bHRpbWFwPCo+fHN0bHBkX3N0ZDo6c2V0PCo+fHN0bHBkeF9zdGQ6OnNldDwqPnxzdGxwZG10eF9zdGQ6OnNldDwqPnxzdGxwZHhtdHhfc3RkOjpzZXQ8Kj58c3RscGRfc3RkOjptdWx0aXNldDwqPnxzdGxwZHhfc3RkOjptdWx0aXNldDwqPnxzdGxwZG10eF9zdGQ6Om11bHRpc2V0PCo+fHN0bHBkeG10eF9zdGQ6Om11bHRpc2V0PCo+eworICAgIHByZXZpZXcKKyAgICAoCisJCSMoCisJCQkiWyIsCisJCQkkYy5fTV90Ll9NX25vbl9kYmdfaW1wbC5fTV9ub2RlX2NvdW50LAorCQkJIl0oIiwKKwkJCSRjLl9NX3QuX01fbm9uX2RiZ19pbXBsLAorCQkJIikiCisJCSkKKyAgICApCisgICAgY2hpbGRyZW4KKyAgICAoCisgICAgICAgICMoCisgICAgICAgICAgICBbcmF3IHZpZXddOiBbJGMsIV0sCisgICAgICAgICAgICBzaXplOiAkYy5fTV90Ll9NX25vbl9kYmdfaW1wbC5fTV9ub2RlX2NvdW50LAorICAgICAgICAgICAgdHJlZTogJGMuX01fdC5fTV9ub25fZGJnX2ltcGwKKyAgICAgICAgKQorICAgICkKK30KKworc3RscF9zdGQ6OnByaXY6Ol9SYl90cmVlPCosKiwqLCosKj58c3RscHhfc3RkOjpwcml2OjpfUmJfdHJlZTwqLCosKiwqLCo+fHN0bHBtdHhfc3RkOjpwcml2OjpfUmJfdHJlZTwqLCosKiwqLCo+fHN0bHB4bXR4X3N0ZDo6cHJpdjo6X1JiX3RyZWU8KiwqLCosKiwqPnxzdGxwZF9zdGQ6OnByaXY6Ol9Ob25EYmdfUmJfdHJlZTwqLCosKiwqLCo+fHN0bHBkeF9zdGQ6OnByaXY6Ol9Ob25EYmdfUmJfdHJlZTwqLCosKiwqLCo+fHN0bHBkbXR4X3N0ZDo6cHJpdjo6X05vbkRiZ19SYl90cmVlPCosKiwqLCosKj58c3RscGR4bXR4X3N0ZDo6cHJpdjo6X05vbkRiZ19SYl90cmVlPCosKiwqLCosKj57CisgICAgcHJldmlldworICAgICgKKwkJI3RyZWUKKwkJKAorCQkJaGVhZCA6ICRjLl9NX2hlYWRlci5fTV9kYXRhLl9NX3BhcmVudCwKKwkJCXNraXAgOiAmKCRjLl9NX2hlYWRlci5fTV9kYXRhKSwKKwkJCXNpemUgOiAkYy5fTV9ub2RlX2NvdW50LAorCQkJbGVmdCA6IF9NX2xlZnQsCisJCQlyaWdodCA6IF9NX3JpZ2h0CisJCSk6ICMoKigkVDMgKikoJigkZSkgKyAxKSkKKyAgICApCisgICAgY2hpbGRyZW4KKyAgICAoCisgICAgICAgICMoCisgICAgICAgICAgICBbcmF3IHZpZXddOiBbJGMsIV0sCisgICAgICAgICAgICAjdHJlZQorICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgIGhlYWQgOiAkYy5fTV9oZWFkZXIuX01fZGF0YS5fTV9wYXJlbnQsCisJCQkJc2tpcCA6ICYoJGMuX01faGVhZGVyLl9NX2RhdGEpLAorCQkJCXNpemUgOiAkYy5fTV9ub2RlX2NvdW50LAorICAgICAgICAgICAgICAgIGxlZnQgOiBfTV9sZWZ0LAorICAgICAgICAgICAgICAgIHJpZ2h0IDogX01fcmlnaHQKKyAgICAgICAgICAgICkgOiAjKCooJFQzICopKCYoJGUpICsgMSkpCisgICAgICAgICkKKyAgICApCit9CisKK3N0bHBfc3RkOjpwcml2OjpfUmJfdHJlZV9pdGVyYXRvcjwqLCo+fHN0bHB4X3N0ZDo6cHJpdjo6X1JiX3RyZWVfaXRlcmF0b3I8KiwqPnxzdGxwbXR4X3N0ZDo6cHJpdjo6X1JiX3RyZWVfaXRlcmF0b3I8KiwqPnxzdGxweG10eF9zdGQ6OnByaXY6Ol9SYl90cmVlX2l0ZXJhdG9yPCosKj58c3RscGRfc3RkOjpwcml2OjpfUmJfdHJlZV9pdGVyYXRvcjwqLCo+fHN0bHBkeF9zdGQ6OnByaXY6Ol9SYl90cmVlX2l0ZXJhdG9yPCosKj58c3RscGRtdHhfc3RkOjpwcml2OjpfUmJfdHJlZV9pdGVyYXRvcjwqLCo+fHN0bHBkeG10eF9zdGQ6OnByaXY6Ol9SYl90cmVlX2l0ZXJhdG9yPCosKj57CisgICAgcHJldmlldworICAgICgKKyAgICAgICAgWyooJFQxKikoJGMuX01fbm9kZSArIDEpXQorICAgICkKKyAgICBjaGlsZHJlbgorICAgICgKKyAgICAgICAgIygKKyAgICAgICAgICAgIFtyYXcgdmlld106IFskYywhXSwKKyAgICAgICAgICAgIHZhbHVlOiBbKigkVDEqKSgkYy5fTV9ub2RlICsgMSldLAorICAgICAgICAgICAgcHRyOiBbKHVuc2lnbmVkIGludCkoJGMuX01fbm9kZSArIDEpLCB4XQorICAgICAgICApCisgICAgKQorfQorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHN0bHBvcnQ6Omhhc2hfbWFwLCBzdGxwb3J0OjpoYXNoX211bHRpbWFwLCBzdGxwb3J0OjpoYXNoX3NldCwgc3RscG9ydDo6aGFzaF9tdWx0aXNldAorOyBzdGxwb3J0Ojp1bm9yZGVyZWRfbWFwLCBzdGxwb3J0Ojp1bm9yZGVyZWRfbXVsdGltYXAsIHN0bHBvcnQ6OnVub3JkZXJlZF9zZXQsIHN0bHBvcnQ6OnVub3JkZXJlZF9tdWx0aXNldAorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RscF9zdGQ6Omhhc2hfbWFwPCo+fHN0bHB4X3N0ZDo6aGFzaF9tYXA8Kj58c3RscG10eF9zdGQ6Omhhc2hfbWFwPCo+fHN0bHB4bXR4X3N0ZDo6aGFzaF9tYXA8Kj58c3RscF9zdGQ6Omhhc2hfbXVsdGltYXA8Kj58c3RscHhfc3RkOjpoYXNoX211bHRpbWFwPCo+fHN0bHBtdHhfc3RkOjpoYXNoX211bHRpbWFwPCo+fHN0bHB4bXR4X3N0ZDo6aGFzaF9tdWx0aW1hcDwqPnxzdGxwX3N0ZDo6aGFzaF9zZXQ8Kj58c3RscHhfc3RkOjpoYXNoX3NldDwqPnxzdGxwbXR4X3N0ZDo6aGFzaF9zZXQ8Kj58c3RscHhtdHhfc3RkOjpoYXNoX3NldDwqPnxzdGxwX3N0ZDo6aGFzaF9tdWx0aXNldDwqPnxzdGxweF9zdGQ6Omhhc2hfbXVsdGlzZXQ8Kj58c3RscG10eF9zdGQ6Omhhc2hfbXVsdGlzZXQ8Kj58c3RscHhtdHhfc3RkOjpoYXNoX211bHRpc2V0PCo+fHN0bHBfc3RkOjp0cjE6OnVub3JkZXJlZF9tYXA8Kj58c3RscHhfc3RkOjp0cjE6OnVub3JkZXJlZF9tYXA8Kj58c3RscG10eF9zdGQ6OnRyMTo6dW5vcmRlcmVkX21hcDwqPnxzdGxweG10eF9zdGQ6OnRyMTo6dW5vcmRlcmVkX21hcDwqPnxzdGxwX3N0ZDo6dHIxOjp1bm9yZGVyZWRfbXVsdGltYXA8Kj58c3RscHhfc3RkOjp0cjE6OnVub3JkZXJlZF9tdWx0aW1hcDwqPnxzdGxwbXR4X3N0ZDo6dHIxOjp1bm9yZGVyZWRfbXVsdGltYXA8Kj58c3RscHhtdHhfc3RkOjp0cjE6OnVub3JkZXJlZF9tdWx0aW1hcDwqPnxzdGxwX3N0ZDo6dHIxOjp1bm9yZGVyZWRfc2V0PCo+fHN0bHB4X3N0ZDo6dHIxOjp1bm9yZGVyZWRfc2V0PCo+fHN0bHBtdHhfc3RkOjp0cjE6OnVub3JkZXJlZF9zZXQ8Kj58c3RscHhtdHhfc3RkOjp0cjE6OnVub3JkZXJlZF9zZXQ8Kj58c3RscF9zdGQ6OnRyMTo6dW5vcmRlcmVkX211bHRpc2V0PCo+fHN0bHB4X3N0ZDo6dHIxOjp1bm9yZGVyZWRfbXVsdGlzZXQ8Kj58c3RscG10eF9zdGQ6OnRyMTo6dW5vcmRlcmVkX211bHRpc2V0PCo+fHN0bHB4bXR4X3N0ZDo6dHIxOjp1bm9yZGVyZWRfbXVsdGlzZXQ8Kj57CisgICAgcHJldmlldworICAgICgKKwkJIygKKwkJCSJbIiwKKwkJCSRjLl9NX2h0Ll9NX251bV9lbGVtZW50cywKKwkJCSJdIiwKKwkJCSRjLl9NX2h0CisJCSkKKyAgICApCisgICAgY2hpbGRyZW4KKyAgICAoCisgICAgICAgICMoCisgICAgICAgICAgICBbcmF3IHZpZXddOiBbJGMsIV0sCisgICAgICAgICAgICBoYXNodGFibGU6ICRjLl9NX2h0CisgICAgICAgICkKKyAgICApCit9CisKK3N0bHBkX3N0ZDo6aGFzaF9tYXA8Kj58c3RscGR4X3N0ZDo6aGFzaF9tYXA8Kj58c3RscGRtdHhfc3RkOjpoYXNoX21hcDwqPnxzdGxwZHhtdHhfc3RkOjpoYXNoX21hcDwqPnxzdGxwZF9zdGQ6Omhhc2hfbXVsdGltYXA8Kj58c3RscGR4X3N0ZDo6aGFzaF9tdWx0aW1hcDwqPnxzdGxwZG10eF9zdGQ6Omhhc2hfbXVsdGltYXA8Kj58c3RscGR4bXR4X3N0ZDo6aGFzaF9tdWx0aW1hcDwqPnxzdGxwZF9zdGQ6Omhhc2hfc2V0PCo+fHN0bHBkeF9zdGQ6Omhhc2hfc2V0PCo+fHN0bHBkbXR4X3N0ZDo6aGFzaF9zZXQ8Kj58c3RscGR4bXR4X3N0ZDo6aGFzaF9zZXQ8Kj58c3RscGRfc3RkOjpoYXNoX211bHRpc2V0PCo+fHN0bHBkeF9zdGQ6Omhhc2hfbXVsdGlzZXQ8Kj58c3RscGRtdHhfc3RkOjpoYXNoX211bHRpc2V0PCo+fHN0bHBkeG10eF9zdGQ6Omhhc2hfbXVsdGlzZXQ8Kj58c3RscGRfc3RkOjp0cjE6OnVub3JkZXJlZF9tYXA8Kj58c3RscGR4X3N0ZDo6dHIxOjp1bm9yZGVyZWRfbWFwPCo+fHN0bHBkbXR4X3N0ZDo6dHIxOjp1bm9yZGVyZWRfbWFwPCo+fHN0bHBkeG10eF9zdGQ6OnRyMTo6dW5vcmRlcmVkX21hcDwqPnxzdGxwZF9zdGQ6OnRyMTo6dW5vcmRlcmVkX211bHRpbWFwPCo+fHN0bHBkeF9zdGQ6OnRyMTo6dW5vcmRlcmVkX211bHRpbWFwPCo+fHN0bHBkbXR4X3N0ZDo6dHIxOjp1bm9yZGVyZWRfbXVsdGltYXA8Kj58c3RscGR4bXR4X3N0ZDo6dHIxOjp1bm9yZGVyZWRfbXVsdGltYXA8Kj58c3RscGRfc3RkOjp0cjE6OnVub3JkZXJlZF9zZXQ8Kj58c3RscGR4X3N0ZDo6dHIxOjp1bm9yZGVyZWRfc2V0PCo+fHN0bHBkbXR4X3N0ZDo6dHIxOjp1bm9yZGVyZWRfc2V0PCo+fHN0bHBkeG10eF9zdGQ6OnRyMTo6dW5vcmRlcmVkX3NldDwqPnxzdGxwZF9zdGQ6OnRyMTo6dW5vcmRlcmVkX211bHRpc2V0PCo+fHN0bHBkeF9zdGQ6OnRyMTo6dW5vcmRlcmVkX211bHRpc2V0PCo+fHN0bHBkbXR4X3N0ZDo6dHIxOjp1bm9yZGVyZWRfbXVsdGlzZXQ8Kj58c3RscGR4bXR4X3N0ZDo6dHIxOjp1bm9yZGVyZWRfbXVsdGlzZXQ8Kj57CisgICAgcHJldmlldworICAgICgKKwkJIygKKwkJCSJbIiwKKwkJCSRjLl9NX2h0Ll9NX25vbl9kYmdfaW1wbC5fTV9udW1fZWxlbWVudHMsCisJCQkiXSIsCisJCQkkYy5fTV9odC5fTV9ub25fZGJnX2ltcGwKKwkJKQorICAgICkKKyAgICBjaGlsZHJlbgorICAgICgKKyAgICAgICAgIygKKyAgICAgICAgICAgIFtyYXcgdmlld106IFskYywhXSwKKyAgICAgICAgICAgIGhhc2h0YWJsZTogJGMuX01faHQuX01fbm9uX2RiZ19pbXBsCisgICAgICAgICkKKyAgICApCit9CisKK3N0bHBfc3RkOjpoYXNodGFibGU8KiwqPnxzdGxweF9zdGQ6Omhhc2h0YWJsZTwqLCo+fHN0bHBtdHhfc3RkOjpoYXNodGFibGU8KiwqPnxzdGxweG10eF9zdGQ6Omhhc2h0YWJsZTwqLCo+fHN0bHBkX3N0ZDo6cHJpdjo6X05vbkRiZ19oYXNodGFibGU8KiwqPnxzdGxwZHhfc3RkOjpwcml2OjpfTm9uRGJnX2hhc2h0YWJsZTwqLCo+fHN0bHBkbXR4X3N0ZDo6cHJpdjo6X05vbkRiZ19oYXNodGFibGU8KiwqPnxzdGxwZHhtdHhfc3RkOjpwcml2OjpfTm9uRGJnX2hhc2h0YWJsZTwqLCo+eworICAgIHByZXZpZXcKKyAgICAoCisJCSRjLl9NX2VsZW1zCisgICAgKQorICAgIGNoaWxkcmVuCisgICAgKAorICAgICAgICAjKAorICAgICAgICAgICAgW3JhdyB2aWV3XTogWyRjLCFdLAorICAgICAgICAgICAgc2l6ZSA6ICRjLl9NX251bV9lbGVtZW50cywKKyAgICAgICAgICAgIGxvYWQgZmFjdG9yIDogKGZsb2F0KSRjLl9NX251bV9lbGVtZW50cyAvICgkYy5fTV9idWNrZXRzLl9NX2ZpbmlzaCAtICRjLl9NX2J1Y2tldHMuX01fc3RhcnQpLAorICAgICAgICAgICAgbWF4IGxvYWQgZmFjdG9yOiAkYy5fTV9tYXhfbG9hZF9mYWN0b3IsCisgICAgICAgICAgICBidWNrZXRzIDogJGMuX01fYnVja2V0cywKKyAgICAgICAgICAgIGVsZW1lbnRzIDogJGMuX01fZWxlbXMKKyAgICAgICAgKQorICAgICkKK30KKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBzdGxwb3J0OjpxdWV1ZSwgc3RscG9ydDo6cHJpb3JpdHlfcXVldWUsIHN0bHBvcnQ6OnN0YWNrCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGxwX3N0ZDo6cXVldWU8Kj58c3RscHhfc3RkOjpxdWV1ZTwqPnxzdGxwbXR4X3N0ZDo6cXVldWU8Kj58c3RscHhtdHhfc3RkOjpxdWV1ZTwqPnxzdGxwZF9zdGQ6OnF1ZXVlPCo+fHN0bHBkeF9zdGQ6OnF1ZXVlPCo+fHN0bHBkbXR4X3N0ZDo6cXVldWU8Kj58c3RscGR4bXR4X3N0ZDo6cXVldWU8Kj58c3RscF9zdGQ6OnByaW9yaXR5X3F1ZXVlPCo+fHN0bHB4X3N0ZDo6cHJpb3JpdHlfcXVldWU8Kj58c3RscG10eF9zdGQ6OnByaW9yaXR5X3F1ZXVlPCo+fHN0bHB4bXR4X3N0ZDo6cHJpb3JpdHlfcXVldWU8Kj58c3RscGRfc3RkOjpwcmlvcml0eV9xdWV1ZTwqPnxzdGxwZHhfc3RkOjpwcmlvcml0eV9xdWV1ZTwqPnxzdGxwZG10eF9zdGQ6OnByaW9yaXR5X3F1ZXVlPCo+fHN0bHBkeG10eF9zdGQ6OnByaW9yaXR5X3F1ZXVlPCo+fHN0bHBfc3RkOjpzdGFjazwqPnxzdGxweF9zdGQ6OnN0YWNrPCo+fHN0bHBtdHhfc3RkOjpzdGFjazwqPnxzdGxweG10eF9zdGQ6OnN0YWNrPCo+fHN0bHBkX3N0ZDo6c3RhY2s8Kj58c3RscGR4X3N0ZDo6c3RhY2s8Kj58c3RscGRtdHhfc3RkOjpzdGFjazwqPnxzdGxwZHhtdHhfc3RkOjpzdGFjazwqPnsKKwlwcmV2aWV3CisJKAorCQkkYy5jCisJKQorCWNoaWxkcmVuCisJKAorCQkjKAorCQkJW3JhdyB2aWV3XSA6IFskYywhXSwKKwkJCWNvbnRhaW5lciA6ICRjLmMKKwkJKQorCSkKK30KKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBzdGxwb3J0IGRlYnVnIGl0ZXJhdG9yCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGxwX3N0ZDo6cHJpdjo6X0RCR19pdGVyPCo+fHN0bHB4X3N0ZDo6cHJpdjo6X0RCR19pdGVyPCo+fHN0bHBtdHhfc3RkOjpwcml2OjpfREJHX2l0ZXI8Kj58c3RscHhtdHhfc3RkOjpwcml2OjpfREJHX2l0ZXI8Kj58c3RscGRfc3RkOjpwcml2OjpfREJHX2l0ZXI8Kj58c3RscGR4X3N0ZDo6cHJpdjo6X0RCR19pdGVyPCo+fHN0bHBkbXR4X3N0ZDo6cHJpdjo6X0RCR19pdGVyPCo+fHN0bHBkeG10eF9zdGQ6OnByaXY6Ol9EQkdfaXRlcjwqPnsKKwlwcmV2aWV3CisJKAorCQkjaWYoJGMuX01fb3duZXIgIT0gMCkKKwkJKAorCQkJJGMuX01faXRlcmF0b3IKKwkJKQorCQkjZWxzZQorCQkoCisJCQkidW5kZWZpbmVkIgorCQkpCisJKQorCWNoaWxkcmVuCisJKAorCQkjKAorCQkJI2lmKCRjLl9NX293bmVyICE9IDApCisJCQkoCisJCQkJIygKKwkJCQkJW3JhdyB2aWV3XSA6IFskYywhXSwKKwkJCQkJW2l0ZXJhdG9yXSA6ICRjLl9NX2l0ZXJhdG9yLAorCQkJCQlbdmFsaWRdIDogW3RydWVdCisJCQkJKQorCQkJKQorCQkJI2Vsc2UKKwkJCSgKKwkJCQkjKAorCQkJCQlbcmF3IHZpZXddIDogWyRjLCFdLAorCQkJCQlbdmFsaWRdIDogW2ZhbHNlXQorCQkJCSkKKwkJCSkKKwkJKQorCSkKK30KKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBzdGxwb3J0OjpiaXRzZXQKKzsgVE9ETzogRml4IGl0LCBpdCBkb2Vzbid0IHdvcmsgYXMgZXhwZWN0ZWQgZXZlbiB3aGVuIGFkZGluZyBhbiBlbnVtIHRvIHRoZSBiaXRzZXQKKzsgY2xhc3MgdG8gZ2V0IGFjY2VzcyB0byB0aGUgYml0c2V0IHN0YXRpYyBzaXplIHJhdGhlciB0aGFuIHVzaW5nICRUMS4KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0ZHBfc3RkOjpiaXRzZXQ8KiwqPnxzdGRweF9zdGQ6OmJpdHNldDwqLCo+fHN0ZHBtdHhfc3RkOjpiaXRzZXQ8KiwqPnxzdGRweG10eF9zdGQ6OmJpdHNldDwqLCo+fHN0ZHBkX3N0ZDo6Yml0c2V0PCo+fHN0ZHBkeF9zdGQ6OmJpdHNldDwqPnxzdGRwZG10eF9zdGQ6OmJpdHNldDwqPnxzdGRwZHhtdHhfc3RkOjpiaXRzZXQ8Kj57CisJcHJldmlldworCSgKKwkJIygKKwkJIlsiLAorCQkJJFQxLAorCQkiXSgiLAorCQkjYXJyYXkKKwkJKAorCQkJZXhwciA6ICgkYy5fTV93WyRpIC8gKHNpemVvZih1bnNpZ25lZCBsb25nKSAqIDgpXSA+PiAoJGkgJSAoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogOCkpKSwKKwkJCXNpemUgOiAkVDEKKwkJKSA6IFsoJGUgJiAxKSxkXSwKKwkJIikiCisJCSkKKwkpCisJY2hpbGRyZW4KKwkoCisJCSNhcnJheQorCQkoCisJCQlleHByIDogCSgkYy5fTV93WyRpIC8gKHNpemVvZih1bnNpZ25lZCBsb25nKSAqIDgpXSA+PiAoJGkgJSAoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogOCkpKSwKKwkJCXNpemUgOiAJJFQxCisJCSkgOiAoYm9vbCkoJGUgJiAxKQorCSkKK30KKworc3RkcF9zdGQ6OmJpdHNldDwqPjo6cmVmZXJlbmNlfHN0ZHB4X3N0ZDo6Yml0c2V0PCo+OjpyZWZlcmVuY2V8c3RkcG10eF9zdGQ6OmJpdHNldDwqPjo6cmVmZXJlbmNlfHN0ZHB4bXR4X3N0ZDo6Yml0c2V0PCo+OjpyZWZlcmVuY2V8c3RkcGRfc3RkOjpiaXRzZXQ8Kj46OnJlZmVyZW5jZXxzdGRwZHhfc3RkOjpiaXRzZXQ8Kj46OnJlZmVyZW5jZXxzdGRwZG10eF9zdGQ6OmJpdHNldDwqPjo6cmVmZXJlbmNlfHN0ZHBkeG10eF9zdGQ6OmJpdHNldDwqPnsKKyAgICBwcmV2aWV3CisgICAgKAorCQkjKAorCQkJImJpdHNldFsiLCAkYy5fTV9icG9zLCAiXSA9ICIsCisJCQkoYm9vbCkoKigkYy5fTV93cCkgPj4gJGMuX01fYnBvcykgJiAxKQorCQkpCisgICAgKQorfQorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHN0bHBvcnQ6OmF1dG9fcHRyCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGxwX3N0ZDo6YXV0b19wdHI8Kj58c3RscHhfc3RkOjphdXRvX3B0cjwqPnxzdGxwbXR4X3N0ZDo6YXV0b19wdHI8Kj58c3RscHhtdHhfc3RkOjphdXRvX3B0cjwqPnxzdGxwZF9zdGQ6OmF1dG9fcHRyPCo+fHN0bHBkeF9zdGQ6OmF1dG9fcHRyPCo+fHN0bHBkbXR4X3N0ZDo6YXV0b19wdHI8Kj58c3RscGR4bXR4X3N0ZDo6YXV0b19wdHI8Kj57CisgICAgcHJldmlldworICAgICgKKyAgICAgICAgI2lmKCgkYy5fTV9wKSAhPSAwKQorICAgICAgICAoCisgICAgICAgICAgICBbKigkVDEgKikkYy5fTV9wXQorICAgICAgICApCisgICAgICAgICNlbHNlCisgICAgICAgICgKKyAgICAgICAgICAgICJudWxsIgorICAgICAgICApCisgICAgKQorICAgIGNoaWxkcmVuCisgICAgKAorICAgICAgICAjaWYoKCRjLl9NX3ApICE9IDApCisgICAgICAgICgKKyAgICAgICAgICAgICMoCisgICAgICAgICAgICAgICAgW3JhdyB2aWV3XTogWyRjLCFdLAorICAgICAgICAgICAgICAgIHB0cjogWyh1bnNpZ25lZCBpbnQpJGMuX01fcCwgeF0sCisgICAgICAgICAgICAgICAgdmFsdWU6IFsqKCRUMSAqKSRjLl9NX3BdCisgICAgICAgICAgICApCisgICAgICAgICkKKyAgICAgICAgI2Vsc2UKKyAgICAgICAgKAorICAgICAgICAgICAgIygKKyAgICAgICAgICAgICAgICBbcmF3IHZpZXddOiBbJGMsIV0KKyAgICAgICAgICAgICkKKyAgICAgICAgKQorICAgICkKK30KKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyAgc3RscG9ydDo6Y29tcGxleAorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RscF9zdGQ6OmNvbXBsZXg8Kj58c3RscHhfc3RkOjpjb21wbGV4PCo+fHN0bHBtdHhfc3RkOjpjb21wbGV4PCo+fHN0bHB4bXR4X3N0ZDo6Y29tcGxleDwqPnxzdGxwZF9zdGQ6OmNvbXBsZXg8Kj58c3RscGR4X3N0ZDo6Y29tcGxleDwqPnxzdGxwZG10eF9zdGQ6OmNvbXBsZXg8Kj58c3RscGR4bXR4X3N0ZDo6Y29tcGxleDwqPnsKKwljaGlsZHJlbgorCSgKKwkJIygKKwkJCXJlYWw6ICRlLl9NX3JlLAorCQkJaW1hZ2luYXJ5OiAkZS5fTV9pbQorCQkpCisJKQorCXByZXZpZXcKKwkoCisJCSNpZigkZS5fTV9pbSAhPSAwKQorCQkoCisJCQkjaWYgKCRlLl9NX3JlICE9IDApCisJCQkoCQkJCQkJCQkJOyBSZWFsIGFuZCBJbWFnaW5hcnkgY29tcG9uZW50cworCQkJCSNpZiAoJGUuX01faW0gPj0gMCkKKwkJCQkoCisJCQkJCSMoJGUuX01fcmUsIitpKiIsICRlLl9NX2ltKQorCQkJCSkKKwkJCQkjZWxzZQorCQkJCSgKKwkJCQkJIygkZS5fTV9yZSwiLWkqIiwgLSRlLl9NX2ltKQorCQkJCSkKKwkJCSkKKwkJCSNlbHNlCisJCQkoCQkJCQkJCQkJOyBQdXJlbHkgaW1hZ2luYXJ5CisJCQkJI2lmICgkZS5fTV9pbSA+PSAwLjApCisJCQkJKAorCQkJCQkjKCJpKiIsICRlLl9NX2ltKQorCQkJCSkKKwkJCQkjZWxzZQorCQkJCSgKKwkJCQkJIygiLWkqIiwgLSRlLl9NX2ltKQorCQkJCSkKKwkJCSkKKwkJKQorCQkjZWxzZQorCQkoCQkJCQkJCQkJCTsgUHVyZWx5IHJlYWwKKwkJCSRlLl9NX3JlCisJCSkKKwkpCit9CisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgIHN0bHBvcnQ6OnZhbGFycmF5Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0bHBfc3RkOjp2YWxhcnJheTwqPnxzdGxweF9zdGQ6OnZhbGFycmF5PCo+fHN0bHBtdHhfc3RkOjp2YWxhcnJheTwqPnxzdGxweG10eF9zdGQ6OnZhbGFycmF5PCo+fHN0bHBkX3N0ZDo6dmFsYXJyYXk8Kj58c3RscGR4X3N0ZDo6dmFsYXJyYXk8Kj58c3RscGRtdHhfc3RkOjp2YWxhcnJheTwqPnxzdGxwZHhtdHhfc3RkOjp2YWxhcnJheTwqPnsKKyAgICBwcmV2aWV3CisgICAgKAorCQkjKAorCQkJIlsiLAorICAgICAgICAgICAgJGMuX01fc2l6ZSAsCisgICAgICAgICAgICAiXSgiLAorICAgICAgICAgICAgI2FycmF5CisgICAgICAgICAgICAoCisJCQkJZXhwciA6IAkoJGMuX01fZmlyc3QpWyRpXSwKKwkJCQlzaXplIDogCSRjLl9NX3NpemUKKwkJCSksCisJCQkiKSIKKwkJKQorCSkKKworCWNoaWxkcmVuCisJKAorCQkjYXJyYXkKKwkJKAorCQkJZXhwciA6CSgkYy5fTV9maXJzdClbJGldLAorCQkJc2l6ZSA6CSRjLl9NX3NpemUKKwkJKQorCSkKK30KKworc3RscF9zdGQ6OnNsaWNlfHN0bHB4X3N0ZDo6c2xpY2V8c3RscG10eF9zdGQ6OnNsaWNlfHN0bHB4bXR4X3N0ZDo6c2xpY2V8c3RscGRfc3RkOjpzbGljZXxzdGxwZHhfc3RkOjpzbGljZXxzdGxwZG10eF9zdGQ6OnNsaWNlfHN0bHBkeG10eF9zdGQ6OnNsaWNleworCXByZXZpZXcKKwkoCisJCSMoCisJCQkic3RhcnQgPSAiLAorCQkJJGMuX01fc3RhcnQsCisJCQkiLCBzaXplID0gIiwKKwkJCSRjLl9NX2xlbmd0aCwKKwkJCSIsIHN0cmlkZSA9ICIsCisJCQkkYy5fTV9zdHJpZGUKKwkJKQorCSkKKwljaGlsZHJlbgorCSgKKwkJIygKKwkJCVtyYXcgdmlld10gOiBbJGMsIV0sCisJCQlzdGFydCA6ICRjLl9NX3N0YXJ0LAorCQkJc2l6ZSA6ICRjLl9NX2xlbmd0aCwKKwkJCXN0cmlkZSA6ICRjLl9NX3N0cmlkZQorCQkpCisJKQorfQorCitzdGxwX3N0ZDo6Z3NsaWNlfHN0bHB4X3N0ZDo6Z3NsaWNlfHN0bHBtdHhfc3RkOjpnc2xpY2V8c3RscHhtdHhfc3RkOjpnc2xpY2V8c3RscGRfc3RkOjpnc2xpY2V8c3RscGR4X3N0ZDo6Z3NsaWNlfHN0bHBkbXR4X3N0ZDo6Z3NsaWNlfHN0bHBkeG10eF9zdGQ6OmdzbGljZXsKKwlwcmV2aWV3CisJKAorCQkjKAorCQkJInN0YXJ0ID0gIiwKKwkJCSRjLl9NX3N0YXJ0LAorCQkJIiwgc2l6ZXMgPSAiLAorCQkJJGMuX01fbGVuZ3RocywKKwkJCSIsIHN0cmlkZXMgPSAiLAorCQkJJGMuX01fc3RyaWRlcworCQkpCisJKQorCWNoaWxkcmVuCisJKAorCQkjKAorCQkJW3JhdyB2aWV3XSA6IFskYywhXSwKKwkJCXN0YXJ0IDogJGMuX01fc3RhcnQsCisJCQlzaXplcyA6ICRjLl9NX2xlbmd0aHMsCisJCQlzdHJpZGVzIDogJGMuX01fc3RyaWRlcworCQkpCisJKQorfQpkaWZmIC0tZ2l0IGEvZXRjL21zdmNpbmNsLmRhdCBiL2V0Yy9tc3ZjaW5jbC5kYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRkNjg4MQotLS0gL2Rldi9udWxsCisrKyBiL2V0Yy9tc3ZjaW5jbC5kYXQKQEAgLTAsMCArMSwzMDkgQEAKK2FsZ28uaAorYWxnb2Jhc2UuaAorYWxnb3JpdGguaAorYWxnb3JpdGhtCithbGxvYy5oCitiaXRzZXQKK2JpdHNldC5oCitidmVjdG9yLmgKK2Nhc3NlcnQKK2Nhc3NlcnQuaAorY2N0eXBlCitjY3R5cGUuaAorY2Vycm5vCitjZXJybm8uaAorY2Zsb2F0CitjZmxvYXQuaAorY2hhcl90cmFpdHMuaAorY2xpbWl0cworY2xpbWl0cy5oCitjbG9jYWxlCitjbG9jYWxlLmgKK2NtYXRoCitjbWF0aC5oCitjb21wbGV4Citjb21wbGV4LmgKK2NvbmNlcHRfY2hlY2tzLmgKK2NvbmZpZ3VyZQorY29uZmlndXJlLmluCitjc2V0am1wCitjc2V0am1wLmgKK2NzaWduYWwKK2NzaWduYWwuaAorY3N0ZGFyZworY3N0ZGFyZy5oCitjc3RkZGVmCitjc3RkZGVmLmgKK2NzdGRpbworY3N0ZGlvLmgKK2NzdGRsaWIKK2NzdGRsaWIuaAorY3N0cmluZworY3N0cmluZy5oCitjdGltZQorY3RpbWUuaAorY3R5cGUuaAorY3djaGFyCitjd2NoYXIuaAorY3djdHlwZQorY3djdHlwZS5oCitjX2xvY2FsZS5oCitkZWZhbGxvYy5oCitkZXF1ZQorZGVxdWUuaAorZXhjZXB0aW8uaAorZXhjZXB0aW9uCitleGNlcHRpb24uaAorZXhwb3J0Citmc3RyZWFtCitmc3RyZWFtLmgKK2Z1bmN0aW9uLmgKK2Z1bmN0aW9uYWwKK2hhc2h0YWJsZS5oCitoYXNoX21hcAoraGFzaF9tYXAuaAoraGFzaF9zZXQKK2hhc2hfc2V0LmgKK2hlYXAuaAoraW9tYW5pcAoraW9tYW5pcC5oCitpb3MKK2lvcy5oCitpb3Nmd2QKK2lvc2Z3ZC5oCitpb3N0cmVhbQoraW9zdHJlYW0uaAoraXN0cmVhbQoraXN0cmVhbS5oCitpdGVyYXRvcgoraXRlcmF0b3IuaAorbGltaXRzCitsaW1pdHMuaAorbGlzdAorbGlzdC5oCitsb2NhbGUKK2xvY2FsZS5oCittYXAKK21hcC5oCittYXRoLmgKK21lbS5oCittZW1vcnkKK21lbW9yeS5oCittbWVtb3J5LmgKK21zbF9zdHJpbmcuaAorbXVsdGltYXAuaAorbXVsdGlzZXQuaAorbmV3CituZXcuaAorbnVtZXJpYworbnVtZXJpYy5oCitudW1lcmljLmgKK29zdHJlYW0KK29zdHJlYW0uaAorcGFpci5oCitwdGhyZWFkLmgKK3B0aHJlYWRfYWxsb2MKK3B0aHJlYWRfYWxsb2MuaAorcXVldWUKK3F1ZXVlLmgKK3JvcGUKK3JvcGUuaAorc2V0CitzZXQuaAorc2V0am1wLmgKK3NpZ25hbC5oCitzbGlzdAorc2xpc3QuaAorc3N0cmVhbQorc3N0cmVhbS5oCitzdGFjaworc3RhY2suaAorc3RkYXJnLmgKK3N0ZGRlZi5oCitzdGRkZWYuaAorc3RkZXhjZXAuaAorc3RkZXhjZXB0CitzdGRpby5oCitzdGRpb19zdHJlYW1idWYKK3N0ZGxpYi5oCitzdGRsaWIuaAorc3RsY29tcC5oCitzdGxjb25mLmguaW4KK3N0bF9hcGNjLmgKK3N0bF9hcHBsZS5iYWsuaAorc3RsX2FwcGxlLmgKK3N0bF9hczQwMC5oCitzdGxfYmMuaAorc3RsX2NvbW8uaAorc3RsX2NvbmZpeC5oCitzdGxfZGVjLmgKK3N0bF9kZWNfdm1zLmgKK3N0bF9mdWppdHN1LmgKK3N0bF9nY2MuaAorc3RsX2hwYWNjLmgKK3N0bF9pYm0uaAorc3RsX2ludGVsLmgKK3N0bF9rYWkuaAorc3RsX21sYy5oCitzdGxfbXN2Yy5oCitzdGxfbXdlcmtzLmgKK3N0bF9teWNvbXAuaAorc3RsX3Njby5oCitzdGxfc2VsZWN0X2xpYi5oCitzdGxfc2dpLmgKK3N0bF9zb2xhcmlzLmgKK3N0bF9zdW5wcm8uaAorc3RsX3N5bWFudGVjLmgKK3N0bF90bXBsLmgKK3N0bF91c2VyX2NvbmZpZy5oCitzdGxfd2F0Y29tLmgKK3N0bF93aW5jZS5oCitzdHJlYW1idS5oCitzdHJlYW1idWYKK3N0cmVhbWJ1Zi5oCitzdHJpbmcKK3N0cmluZy5oCitzdHJzdHJlYS5oCitzdHJzdHJlYW0KK3N0cnN0cmVhbS5oCit0ZW1wYnVmLmgKK3RpbWUuaAordHJlZS5oCit0eXBlaW5mbwordHlwZWluZm8uaAordHlwZV90cmFpdHMuaAordXRpbGl0eQordXRpbGl0eS5oCit2YWxhcnJheQordmFsYXJyYXkuaAordmNfc2VsZWN0X2xpYi5oCit2ZWN0b3IKK3ZlY3Rvci5oCit3Y2hhci5oCit3Y3R5cGUuaAorX2FiYnJldnMuaAorX2FsZ28uYworX2FsZ28uaAorX2FsZ29iYXNlLmMKK19hbGdvYmFzZS5oCitfYWxsb2MuYworX2FsbG9jLmgKK19hbGxvY19vbGQuaAorX2F1dG9fcHRyLmgKK19iaXRzZXQuYworX2JpdHNldC5oCitfYnZlY3Rvci5oCitfY2hlY2tfY29uZmlnLmgKK19jb2RlY3Z0LmgKK19jb2xsYXRlLmgKK19jb21wbGV4LmMKK19jb21wbGV4LmgKK19jb25maWcuaAorX2NvbmZpZ19jb21wYXQuaAorX2NvbmZpZ19jb21wYXRfcG9zdC5oCitfY29uc3RydWN0LmgKK19jdHJhaXRzX2Zucy5oCitfY3R5cGUuaAorX2N3Y2hhci5oCitfZGVidWcuYworX2RlYnVnLmgKK19kZXF1ZS5jCitfZGVxdWUuaAorX2VwaWxvZy5oCitfZXBpbG9nLmgKK19leGNlcHRpb24uaAorX2ZzdHJlYW0uYworX2ZzdHJlYW0uaAorX2Z1bmN0aW9uLmgKK19mdW5jdGlvbl9iYXNlLmgKK19oYXNodGFibGUuYworX2hhc2h0YWJsZS5oCitfaGFzaF9mdW4uaAorX2hhc2hfbWFwLmgKK19oYXNoX3NldC5oCitfaGVhcC5jCitfaGVhcC5oCitfaW9zLmMKK19pb3MuaAorX2lvc2Z3ZC5oCitfaW9zX2Jhc2UuaAorX2lzdHJlYW0uYworX2lzdHJlYW0uaAorX2lzdHJlYW1idWZfaXRlcmF0b3IuaAorX2l0ZXJhdG9yLmgKK19pdGVyYXRvci5oCitfaXRlcmF0b3JfYmFzZS5oCitfaXRlcmF0b3Jfb2xkLmgKK19saW1pdHMuYworX2xpbWl0cy5oCitfbGlzdC5jCitfbGlzdC5oCitfbGlzdC5oCitfbG9jYWxlLmgKK19tYXAuaAorX21lc3NhZ2VzX2ZhY2V0cy5oCitfbW1hcC5oCitfbW9uZXRhcnkuYworX21vbmV0YXJ5LmgKK19tc3ZjX3dhcm5pbmdzX29mZi5oCitfbnVsbF9zdHJlYW0uaAorX251bWVyaWMuYworX251bWVyaWMuaAorX251bXB1bmN0LmgKK19udW1fZ2V0LmMKK19udW1fZ2V0LmgKK19udW1fcHV0LmMKK19udW1fcHV0LmgKK19vc3RyZWFtLmMKK19vc3RyZWFtLmgKK19vc3RyZWFtYnVmX2l0ZXJhdG9yLmgKK19wYWlyLmgKK19wcm9sb2cuaAorX3B0aHJlYWRfYWxsb2MuaAorX3B0cnNfc3BlY2lhbGl6ZS5oCitfcXVldWUuaAorX3JhbmdlX2Vycm9ycy5oCitfcmF3X3N0b3JhZ2VfaXRlci5oCitfcmVsb3BzLmgKK19yZWxvcHNfY29udC5oCitfcmVsb3BzX3RlbXBsYXRlLmgKK19yb3BlLmMKK19yb3BlLmgKK19zZXQuaAorX3NldF9vcGVyYXRvcnMuaAorX3NpdGVfY29uZmlnLmgKK19zbGlzdC5jCitfc2xpc3QuaAorX3NsaXN0X2Jhc2UuYworX3NsaXN0X2Jhc2UuaAorX3NwYXJjX2F0b21pYy5oCitfc3N0cmVhbS5jCitfc3N0cmVhbS5oCitfc3RhY2suaAorX3N0ZGlvX2ZpbGUuaAorX3N0ZGlvX2ZpbGUuaC5uZXcKK19zdHJlYW1idWYuYworX3N0cmVhbWJ1Zi5oCitfc3RyZWFtYnVmX2l0ZXJhdG9yLmgKK19zdHJlYW1faXRlcmF0b3IuaAorX3N0cmluZy5jCitfc3RyaW5nLmgKK19zdHJpbmdfZndkLmMKK19zdHJpbmdfZndkLmgKK19zdHJpbmdfaGFzaC5oCitfc3RyaW5nX2lvLmMKK19zdHJpbmdfaW8uaAorX3N0cnN0cmVhbS5oCitfdGVtcGJ1Zi5jCitfdGVtcGJ1Zi5oCitfdGhyZWFkcy5jCitfdGhyZWFkcy5oCitfdGltZV9mYWNldHMuYworX3RpbWVfZmFjZXRzLmgKK190cmVlLmMKK190cmVlLmgKK191bmluaXRpYWxpemVkLmgKK192YWxhcnJheS5jCitfdmFsYXJyYXkuaAorX3ZlY3Rvci5jCitfdmVjdG9yLmgKZGlmZiAtLWdpdCBhL2V0Yy9zdGRfaGVhZGVycy50eHQgYi9ldGMvc3RkX2hlYWRlcnMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMWU4ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9ldGMvc3RkX2hlYWRlcnMudHh0CkBAIC0wLDAgKzEsMzQgQEAKK2FsZ29yaXRobQorYml0c2V0Citjb21wbGV4CitkZXF1ZQorZnN0cmVhbQorZnVuY3Rpb25hbAoraGFzaF9tYXAKK2hhc2hfc2V0Citpb21hbmlwCitpb3MKK2lvc2Z3ZAoraW9zdHJlYW0KK2lzdHJlYW0KK2l0ZXJhdG9yCitsaW1pdHMKK2xpc3QKK2xvY2FsZQorbWFwCittZW1vcnkKK251bWVyaWMKK29zdHJlYW0KK3B0aHJlYWRfYWxsb2MKK3F1ZXVlCitzZXQKK3NsaXN0Citzc3RyZWFtCitzdGFjaworc3RkZXhjZXB0CitzdHJlYW1idWYKK3N0cmluZworc3Ryc3RyZWFtCit1dGlsaXR5Cit2YWxhcnJheQordmVjdG9yCmRpZmYgLS1naXQgYS9ldGMvc3RkX2hlYWRlcnNfYy50eHQgYi9ldGMvc3RkX2hlYWRlcnNfYy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc1M2I3ZAotLS0gL2Rldi9udWxsCisrKyBiL2V0Yy9zdGRfaGVhZGVyc19jLnR4dApAQCAtMCwwICsxLDE3IEBACitjYXNzZXJ0CitjY3R5cGUKK2NlcnJubworY2Zsb2F0CitjbGltaXRzCitjbG9jYWxlCitjbWF0aAorY3NldGptcAorY3NpZ25hbAorY3N0ZGFyZworY3N0ZGRlZgorY3N0ZGlvCitjc3RkbGliCitjc3RyaW5nCitjdGltZQorY3djaGFyCitjd2N0eXBlCmRpZmYgLS1naXQgYS9ldGMvc3RkX2hlYWRlcnNfY19oLnR4dCBiL2V0Yy9zdGRfaGVhZGVyc19jX2gudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNzhjZDcKLS0tIC9kZXYvbnVsbAorKysgYi9ldGMvc3RkX2hlYWRlcnNfY19oLnR4dApAQCAtMCwwICsxLDEzIEBACitjdHlwZS5oCitsb2NhbGUuaAorbWF0aC5oCitzZXRqbXAuaAorc2lnbmFsLmgKK3N0ZGFyZy5oCitzdGRkZWYuaAorc3RkaW8uaAorc3RkbGliLmgKK3N0cmluZy5oCit0aW1lLmgKK3djaGFyLmgKK3djdHlwZS5oCmRpZmYgLS1naXQgYS9ldGMvc3RkX2hlYWRlcnNfY2xhc3NpY19pb3N0cmVhbXMudHh0IGIvZXRjL3N0ZF9oZWFkZXJzX2NsYXNzaWNfaW9zdHJlYW1zLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjAzNWRkCi0tLSAvZGV2L251bGwKKysrIGIvZXRjL3N0ZF9oZWFkZXJzX2NsYXNzaWNfaW9zdHJlYW1zLnR4dApAQCAtMCwwICsxLDggQEAKK2ZzdHJlYW0uaAoraW9tYW5pcC5oCitpb3MuaAoraW9zdHJlYW0uaAoraXN0cmVhbS5oCitvc3RyZWFtLmgKK3N0cmVhbWJ1Zi5oCitzdHJzdHJlYW0uaApkaWZmIC0tZ2l0IGEvZXRjL3N0ZF9oZWFkZXJzX2NwcF9ydW50aW1lLnR4dCBiL2V0Yy9zdGRfaGVhZGVyc19jcHBfcnVudGltZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBmOTNiYgotLS0gL2Rldi9udWxsCisrKyBiL2V0Yy9zdGRfaGVhZGVyc19jcHBfcnVudGltZS50eHQKQEAgLTAsMCArMSwzIEBACitleGNlcHRpb24KK25ldwordHlwZWluZm8KZGlmZiAtLWdpdCBhL2V0Yy9zdGRfaGVhZGVyc19jcHBfcnVudGltZV9oLnR4dCBiL2V0Yy9zdGRfaGVhZGVyc19jcHBfcnVudGltZV9oLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzFmYjFkCi0tLSAvZGV2L251bGwKKysrIGIvZXRjL3N0ZF9oZWFkZXJzX2NwcF9ydW50aW1lX2gudHh0CkBAIC0wLDAgKzEsMyBAQAorZXhjZXB0aW9uLmgKK25ldy5oCit0eXBlaW5mby5oCmRpZmYgLS1naXQgYS9ldGMvc3RscG9ydF9wb3dlcmVkX3JlZC5naWYgYi9ldGMvc3RscG9ydF9wb3dlcmVkX3JlZC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY3MjVkMQotLS0gL2Rldi9udWxsCisrKyBiL2V0Yy9zdGxwb3J0X3Bvd2VyZWRfcmVkLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ldGMvc3RscG9ydF9wb3dlcmVkX3doaXRlLmdpZiBiL2V0Yy9zdGxwb3J0X3Bvd2VyZWRfd2hpdGUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZWEwZmMKLS0tIC9kZXYvbnVsbAorKysgYi9ldGMvc3RscG9ydF9wb3dlcmVkX3doaXRlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGNlcHRpb24gYi9leGNlcHRpb24KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4ZThjZDcuLjAwMDAwMDAKLS0tIGEvZXhjZXB0aW9uCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3Ci0gKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICovCi0KLS8vIFRoaXMgaGVhZGVyIGV4aXN0cyBzb2xlbHkgZm9yIHBvcnRhYmlsaXR5LiAgTm9ybWFsbHkgaXQganVzdCBpbmNsdWRlcwotLy8gdGhlIG5hdGl2ZSBoZWFkZXIgPGV4Y2VwdGlvbj4uCi0KLSNpZm5kZWYgX1NUTFBfRVhDRVBUSU9OCi0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCkKLSMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4NDIzCi0jICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgotI2VsaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHg0MjMpCi0jICBkZWZpbmUgX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lECi0jICBkZWZpbmUgX1NUTFBfRVhDRVBUSU9OCi0jZW5kaWYKLQotI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEICE9IDB4NDIzKSB8fCBkZWZpbmVkIChfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQpCi0vKiBJZiB3ZSBhcmUgaGVyZSBpdCBtZWFucyB0aGF0IHdlIGFyZSBpbiBhbiBpbmNsdWRlIGNhbGxlZCAKLSAqIGZyb20gdGhlIG5hdGl2ZSBsaWIgd2hpY2ggbWVhbnMgdGhhdCB3ZSBjYW4gc2ltcGx5IGZvcndhcmQgdGhpcwotICogY2FsbCB0byB0aGUgbmF0aXZlIGV4Y2VwdGlvbiBoZWFkZXI6Ci0gKi8KLSMgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9SVU5USU1FX0hFQURFUihleGNlcHRpb24pCi0jZWxzZQotIyAgaW5jbHVkZSA8c3RsL19leGNlcHRpb24uaD4KLSNlbmRpZgotCi0jaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHg0MjMpCi0jICBpZiAhZGVmaW5lZChfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQpCi0jICAgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+Ci0jICAgIHVuZGVmICBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECi0jICBlbHNlCi0jICAgIHVuZGVmICBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKLSMgIGVuZGlmCi0jZW5kaWYKLQotI2VuZGlmIC8qIF9TVExQX0VYQ0VQVElPTiAqLwotCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6CmRpZmYgLS1naXQgYS9leGNlcHRpb24uaCBiL2V4Y2VwdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTkzN2FiLi4wMDAwMDAwCi0tLSBhL2V4Y2VwdGlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogQm9yaXMgRm9taXRjaGV2Ci0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICovCi0KLSNpZm5kZWYgX1NUTFBfT0xEU1REX2V4Y2VwdGlvbgotI2RlZmluZSBfU1RMUF9PTERTVERfZXhjZXB0aW9uCi0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCkKLSMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4ODI0Ci0jICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfX0JPUkxBTkRDX18pIHx8IGRlZmluZWQgKF9NU0NfVkVSKQotIyAgaW5jbHVkZSA8ZXhjZXB0aW9uPgotI2Vsc2UKLSMgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9SVU5USU1FX0hFQURFUihleGNlcHRpb24uaCkKLSNlbmRpZgotCi0jaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHg4MjQpCi0jICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgotIyAgdW5kZWYgIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKLSNlbmRpZgotCi0jZW5kaWYgLyogX1NUTFBfT0xEU1REX2V4Y2VwdGlvbiAqLwotCi0vLyBMb2NhbCBWYXJpYWJsZXM6Ci0vLyBtb2RlOkMrKwotLy8gRW5kOgpkaWZmIC0tZ2l0IGEvZmxvYXQuaCBiL2Zsb2F0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3YWRiNTcuLjAwMDAwMDAKLS0tIGEvZmxvYXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0jaWYgIWRlZmluZWQgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQpCi0jICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDIwMwotIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KLSNlbGlmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MjAzKSAmJiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQotIyAgZGVmaW5lIF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRAotI2VsaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgyMDMpCi0jICBlcnJvciBUaGlzIGhlYWRlciBpcyBvbmx5IHJlZW50cmFudCBvbmNlLCBpdCBzaG91bGQgYmUgbW9kaWZpZWQgaWYgaXQgaGFzIHRvIGJlIGluY2x1ZGVkIG1vcmUuCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9TVExQX1dDRV9FVkMzKQotc3RydWN0IF9leGNlcHRpb247Ci0jZW5kaWYKLQotI2luY2x1ZGUgX1NUTFBfTkFUSVZFX0NfSEVBREVSKGZsb2F0LmgpCi0KLSNpZiBkZWZpbmVkKF9fQk9STEFORENfXykgJiYgZGVmaW5lZCAoX19jcGx1c3BsdXMpICYmIChfX0JPUkxBTkRDX18gPj0gMHg1NjApCi1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLXVzaW5nIDo6X21heF9kYmxlOwotdXNpbmcgOjpfbWF4X2ZsdDsKLXVzaW5nIDo6X21heF9sZGJsZTsKLXVzaW5nIDo6X3RpbnlfbGRibGU7Ci1fU1RMUF9FTkRfTkFNRVNQQUNFCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9fQk9STEFORENfXykgJiYgZGVmaW5lZCAoX19jcGx1c3BsdXMpICYmICFkZWZpbmVkIChfU1RMUF9CQ0NfRlBVX0JVRykKLSMgIGRlZmluZSBfU1RMUF9CQ0NfRlBVX0JVRwotLy8gSWdub3JlIEZQVSBleGNlcHRpb25zLCBzZXQgRlBVIHByZWNpc2lvbiB0byA1MyBiaXRzIGZvciBmbG9hdGlvX3Rlc3QgYW5kIGNtYXRoX3Rlc3QKLXN0YXRpYyB1bnNpZ25lZCBpbnQgX2JjY19mcHVfYnVnID0gX2NvbnRyb2w4NyhQQ181M3xNQ1dfRU0sIE1DV19QQ3xNQ1dfRU0pOwotdGVtcGxhdGUgPGNsYXNzIF9GcD4KLWludCBfX2ZwY2xhc3MoX0ZwIF9fdmFsKQoteyBpbnQgX19mID0gX2ZwY2xhc3MoX192YWwpOyBfY29udHJvbDg3KFBDXzUzfE1DV19FTSwgTUNXX1BDfE1DV19FTSk7IHJldHVybiBfX2Y7IH0KLSMgIGRlZmluZSBfZnBjbGFzcyBfX2ZwY2xhc3MKLSNlbmRpZgotCi0jaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgyMDMpCi0jICBpZiAhIGRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKLSMgICAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KLSMgICAgdW5kZWYgIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKLSMgIGVuZGlmCi0jICB1bmRlZiAgX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lECi0jZW5kaWYKZGlmZiAtLWdpdCBhL2ZzdHJlYW0gYi9mc3RyZWFtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmRmNjQ1Li4wMDAwMDAwCi0tLSBhL2ZzdHJlYW0KKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0KLS8vIFRoaXMgaGVhZGVyIGRlZmluZXMgY2xhc3NlcyBiYXNpY19maWxlYnVmLCBiYXNpY19pZnN0cmVhbSwKLS8vIGJhc2ljX29mc3RyZWFtLCBhbmQgYmFzaWNfZnN0cmVhbS4gIFRoZXNlIGNsYXNzZXMgcmVwcmVzZW50Ci0vLyBzdHJlYW1idWZzIGFuZCBzdHJlYW1zIHdob3NlIHNvdXJjZXMgb3IgZGVzdGluYXRpb25zIGFyZSBmaWxlcy4KLQotI2lmbmRlZiBfU1RMUF9GU1RSRUFNCi0jZGVmaW5lIF9TVExQX0ZTVFJFQU0KLQotIyBpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAotIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHgxMDI1Ci0jICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgotIyBlbmRpZgotCi0jaWZkZWYgX1NUTFBfUFJBR01BX09OQ0UKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZgotCi0jIGluY2x1ZGUgPHN0bC9faW9zZXJyLmg+Ci0jIGluY2x1ZGUgPHN0bC9fZnN0cmVhbS5oPgotCi0jIGlmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MTAyNSkKLSMgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+Ci0jICB1bmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECi0jIGVuZGlmCi0KLSNlbmRpZiAvKiBfU1RMUF9GU1RSRUFNICovCi0KLQotLy8gTG9jYWwgVmFyaWFibGVzOgotLy8gbW9kZTpDKysKLS8vIEVuZDoKZGlmZiAtLWdpdCBhL2Z1bmN0aW9uYWwgYi9mdW5jdGlvbmFsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDc0MTAzLi4wMDAwMDAwCi0tLSBhL2Z1bmN0aW9uYWwKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKLSAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogQm9yaXMgRm9taXRjaGV2Ci0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICovCi0KLSNpZm5kZWYgX1NUTFBfRlVOQ1RJT05BTAotI2RlZmluZSBfU1RMUF9GVU5DVElPTkFMCi0KLSMgaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKLSMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MjcKLSMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+Ci0jIGVuZGlmCi0KLSMgaWZkZWYgX1NUTFBfUFJBR01BX09OQ0UKLSMgIHByYWdtYSBvbmNlCi0jIGVuZGlmCi0KLSMgaWYgZGVmaW5lZCAoX1NUTFBfSU1QT1JUX1ZFTkRPUl9TVEQpCi0jICBpbmNsdWRlIF9TVExQX05BVElWRV9IRUFERVIoZnVuY3Rpb25hbCkKLSMgZW5kaWYKLQotIyBpZm5kZWYgX1NUTFBfSU5URVJOQUxfRlVOQ1RJT05fSAotIyAgaW5jbHVkZSA8c3RsL19mdW5jdGlvbi5oPgotIyBlbmRpZgotCi0jIGlmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MjcpCi0jICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgotIyAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAotIyBlbmRpZgotCi0jZW5kaWYgLyogX1NUTFBfRlVOQ1RJT05BTCAqLwotCi0vLyBMb2NhbCBWYXJpYWJsZXM6Ci0vLyBtb2RlOkMrKwotLy8gRW5kOgpkaWZmIC0tZ2l0IGEvaW9tYW5pcCBiL2lvbWFuaXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NTYxOTAuLjAwMDAwMDAKLS0tIGEvaW9tYW5pcAorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0jaWZuZGVmIF9TVExQX0lPTUFOSVAKLSNkZWZpbmUgX1NUTFBfSU9NQU5JUAotCi0jaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKLSMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MTAzMAotIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KLSNlbmRpZgotCi0jaWZkZWYgX1NUTFBfUFJBR01BX09OQ0UKLSMgIHByYWdtYSBvbmNlCi0jZW5kaWYKLQotI2luY2x1ZGUgPHN0bC9faW9zZXJyLmg+Ci0jaW5jbHVkZSA8c3RsL19pc3RyZWFtLmg+ICAgICAgICAgICAgICAvLyBJbmNsdWRlcyA8b3N0cmVhbT4gYW5kIDxpb3M+Ci0KLV9TVExQX0JFR0lOX05BTUVTUEFDRQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIE1hY2hpbmVyeSBmb3IgZGVmaW5pbmcgbWFuaXB1bGF0b3JzLgotCi0vLyBDbGFzcyB0aGF0IGNhbGxzIG9uZSBvZiBpb3NfYmFzZSdzIHNpbmdsZS1hcmd1bWVudCBtZW1iZXIgZnVuY3Rpb25zLgotdGVtcGxhdGUgPGNsYXNzIF9Bcmc+Ci1zdHJ1Y3QgX0lvc19NYW5pcF8xIHsKLSAgIHR5cGVkZWYgX0FyZyAoaW9zX2Jhc2U6OipfX2ZfcHRyX3R5cGUpKF9BcmcpOwotCi0gIF9Jb3NfTWFuaXBfMShfX2ZfcHRyX3R5cGUgX19mLCBjb25zdCBfQXJnJiBfX2FyZykKLSAgICA6IF9NX2YoX19mKSwgX01fYXJnKF9fYXJnKSB7fQotCi0gIHZvaWQgb3BlcmF0b3IoKShpb3NfYmFzZSYgX19pb3MpIGNvbnN0Ci0gIHsgKF9faW9zLipfTV9mKShfTV9hcmcpOyB9Ci0KLSAgX19mX3B0cl90eXBlIF9NX2Y7Ci0gIF9BcmcgX01fYXJnOwotfTsKLQotLy8gQ2xhc3MgdGhhdCBjYWxscyBvbmUgb2YgaW9zX2Jhc2UncyB0d28tYXJndW1lbnQgbWVtYmVyIGZ1bmN0aW9ucy4KLXN0cnVjdCBfSW9zX1NldGZfTWFuaXAgewotICBpb3NfYmFzZTo6Zm10ZmxhZ3MgX01fZmxhZzsKLSAgaW9zX2Jhc2U6OmZtdGZsYWdzIF9NX21hc2s7Ci0gIGJvb2wgX01fdHdvX2FyZ3M7Ci0KLSAgX0lvc19TZXRmX01hbmlwKGlvc19iYXNlOjpmbXRmbGFncyBfX2YpCi0gICAgOiBfTV9mbGFnKF9fZiksIF9NX21hc2soMCksIF9NX3R3b19hcmdzKGZhbHNlKSB7fQotCi0gIF9Jb3NfU2V0Zl9NYW5pcChpb3NfYmFzZTo6Zm10ZmxhZ3MgX19mLCBpb3NfYmFzZTo6Zm10ZmxhZ3MgX19tKQotICAgIDogX01fZmxhZyhfX2YpLCBfTV9tYXNrKF9fbSksIF9NX3R3b19hcmdzKHRydWUpIHt9Ci0KLSAgdm9pZCBvcGVyYXRvcigpKGlvc19iYXNlJiBfX2lvcykgY29uc3QgewotICAgIGlmIChfTV90d29fYXJncykKLSAgICAgIF9faW9zLnNldGYoX01fZmxhZywgX01fbWFzayk7Ci0gICAgZWxzZQotICAgICAgX19pb3Muc2V0ZihfTV9mbGFnKTsKLSAgfQotfTsKLQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQXJnPgotaW5saW5lIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX1NUTFBfQ0FMTAotb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXN0ciwKLSAgICAgICAgICAgY29uc3QgX0lvc19NYW5pcF8xPF9Bcmc+JiBfX2YpIHsKLSAgX19mKF9faXN0cik7Ci0gIHJldHVybiBfX2lzdHI7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9Bcmc+Ci1pbmxpbmUgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfU1RMUF9DQUxMCi1vcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKLSAgICAgICAgICAgY29uc3QgX0lvc19NYW5pcF8xPF9Bcmc+JiBfX2YpIHsKLSAgX19mKF9fb3MpOwotICByZXR1cm4gX19vczsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KLWlubGluZSBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9TVExQX0NBTEwKLW9wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzdHIsIGNvbnN0IF9Jb3NfU2V0Zl9NYW5pcCYgX19mKSB7Ci0gIF9fZihfX2lzdHIpOwotICByZXR1cm4gX19pc3RyOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotaW5saW5lIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX1NUTFBfQ0FMTAotb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsIGNvbnN0IF9Jb3NfU2V0Zl9NYW5pcCYgX19mKSB7Ci0gIF9fZihfX29zKTsKLSAgcmV0dXJuIF9fb3M7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gVGhlIGlvc19iYXNlIG1hbmlwdWxhdG9ycy4KLWlubGluZSBfSW9zX1NldGZfTWFuaXAgIF9TVExQX0NBTEwgcmVzZXRpb3NmbGFncyhpb3NfYmFzZTo6Zm10ZmxhZ3MgX19tYXNrKQoteyByZXR1cm4gX0lvc19TZXRmX01hbmlwKDAsIF9fbWFzayk7IH0KLQotaW5saW5lIF9Jb3NfU2V0Zl9NYW5pcCBfU1RMUF9DQUxMIHNldGlvc2ZsYWdzKGlvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWcpCi17IHJldHVybiBfSW9zX1NldGZfTWFuaXAoX19mbGFnKTsgfQotCi1pbmxpbmUgX0lvc19TZXRmX01hbmlwIF9TVExQX0NBTEwgc2V0YmFzZShpbnQgX19uKSB7Ci0gIGlvc19iYXNlOjpmbXRmbGFncyBfX2Jhc2UgPSBfX24gPT0gOCAgPyBpb3NfYmFzZTo6b2N0IDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbiA9PSAxMCA/IGlvc19iYXNlOjpkZWMgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19uID09IDE2ID8gaW9zX2Jhc2U6OmhleCA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6Zm10ZmxhZ3MoMCk7Ci0gIHJldHVybiBfSW9zX1NldGZfTWFuaXAoX19iYXNlLCBpb3NfYmFzZTo6YmFzZWZpZWxkKTsKLX0KLQotaW5saW5lIF9Jb3NfTWFuaXBfMTxzdHJlYW1zaXplPiBfU1RMUF9DQUxMCi1zZXRwcmVjaXNpb24oaW50IF9fbikgewotICBfSW9zX01hbmlwXzE8c3RyZWFtc2l6ZT46Ol9fZl9wdHJfdHlwZSBfX2YgPSAmaW9zX2Jhc2U6OnByZWNpc2lvbjsKLSAgcmV0dXJuIF9Jb3NfTWFuaXBfMTxzdHJlYW1zaXplPihfX2YsIF9fbik7Ci19Ci0KLWlubGluZSBfSW9zX01hbmlwXzE8c3RyZWFtc2l6ZT4gIF9TVExQX0NBTEwKLXNldHcoaW50IF9fbikgewotICBfSW9zX01hbmlwXzE8c3RyZWFtc2l6ZT46Ol9fZl9wdHJfdHlwZSBfX2YgPSAmaW9zX2Jhc2U6OndpZHRoOyAgCi0gIHJldHVybiBfSW9zX01hbmlwXzE8c3RyZWFtc2l6ZT4oX19mLCBfX24pOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHNldGZpbGwsIGEgbWFuaXB1bGF0b3IgdGhhdCBvcGVyYXRlcyBvbiBiYXNpY19pb3M8PiBpbnN0ZWFkIG9mIGlvc19iYXNlLgotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgotc3RydWN0IF9TZXRmaWxsX01hbmlwIHsKLSAgX1NldGZpbGxfTWFuaXAoX0NoYXJUIF9fYykgOiBfTV9jKF9fYykge30KLSAgX0NoYXJUIF9NX2M7Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQ2hhclQyLCBjbGFzcyBfVHJhaXRzPgotaW5saW5lIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX1NUTFBfQ0FMTAotb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCi0gICAgICAgICAgIGNvbnN0IF9TZXRmaWxsX01hbmlwPF9DaGFyVDI+JiBfX20pIHsKLSAgX19vcy5maWxsKF9fbS5fTV9jKTsKLSAgcmV0dXJuIF9fb3M7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9DaGFyVDIsIGNsYXNzIF9UcmFpdHM+Ci1pbmxpbmUgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfU1RMUF9DQUxMCi1vcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKLSAgICAgICAgICAgY29uc3QgX1NldGZpbGxfTWFuaXA8X0NoYXJUMj4mIF9fbSkgewotICBfX2lzLmZpbGwoX19tLl9NX2MpOwotICByZXR1cm4gX19pczsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KLWlubGluZSBfU2V0ZmlsbF9NYW5pcDxfQ2hhclQ+IF9TVExQX0NBTEwKLXNldGZpbGwoX0NoYXJUIF9fYykgewotICByZXR1cm4gX1NldGZpbGxfTWFuaXA8X0NoYXJUPihfX2MpOwotfQotCi1fU1RMUF9FTkRfTkFNRVNQQUNFCi0KLSNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDEwMzApCi0jICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgotIyAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAotI2VuZGlmCi0KLSNlbmRpZiAvKiBfU1RMUF9JT01BTklQICovCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6CmRpZmYgLS1naXQgYS9pb3MgYi9pb3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhOTIzYWQuLjAwMDAwMDAKLS0tIGEvaW9zCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLQotI2lmbmRlZiBfU1RMUF9JT1MKLSNkZWZpbmUgX1NUTFBfSU9TCi0KLSMgaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKLSMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MTAzMgotIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KLSMgZW5kaWYKLQotIyBpZmRlZiBfU1RMUF9QUkFHTUFfT05DRQotIyAgcHJhZ21hIG9uY2UKLSMgZW5kaWYKLQotIyBpbmNsdWRlIDxzdGwvX2lvc2Vyci5oPgotIyBpbmNsdWRlIDxzdGwvX2lvcy5oPgotCi0jIGlmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MTAzMikKLSMgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+Ci0jICB1bmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECi0jIGVuZGlmCi0KLSNlbmRpZiAvKiBfU1RMUF9JT1MgKi8KLQotLy8gTG9jYWwgVmFyaWFibGVzOgotLy8gbW9kZTpDKysKLS8vIEVuZDoKZGlmZiAtLWdpdCBhL2lvc2Z3ZCBiL2lvc2Z3ZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE0NDk4Mi4uMDAwMDAwMAotLS0gYS9pb3Nmd2QKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0jaWZuZGVmIF9TVExQX0lPU0ZXRAotI2RlZmluZSBfU1RMUF9JT1NGV0QKLQotI2lmbmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECi0jICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDEwMzQKLSMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+Ci0jZW5kaWYKLQotI2lmZGVmIF9TVExQX1BSQUdNQV9PTkNFCi0jICBwcmFnbWEgb25jZQotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX05PX0lPU1RSRUFNUykKLQotIyAgaWYgZGVmaW5lZCAoX1NUTFBfSEFTX1dDSEFSX1QpICYmICFkZWZpbmVkIChfU1RMUF9JTlRFUk5BTF9DV0NIQVIpCi0jICAgIGluY2x1ZGUgPHN0bC9fY3djaGFyLmg+Ci0jICBlbmRpZiAvKiBfU1RMUF9IQVNfV0NIQVJfVCAmJiAhX1NUTFBfQ1dDSEFSICovICAgICAgCi0KLSMgIGluY2x1ZGUgPHN0bC9faW9zZndkLmg+Ci0jZWxzZQotIyAgaW5jbHVkZSA8c3RsL2NoYXJfdHJhaXRzLmg+Ci0jZW5kaWYgLyogX1NUTFBfVVNFX05PX0lPU1RSRUFNUyAqLwotCi0jaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgxMDM0KQotIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KLSMgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKLSNlbmRpZgotCi0jZW5kaWYgLyogX1NUTFBfSU9TRldEICovCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6CmRpZmYgLS1naXQgYS9pb3N0cmVhbSBiL2lvc3RyZWFtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTI4OWU0Li4wMDAwMDAwCi0tLSBhL2lvc3RyZWFtCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLQotI2lmbmRlZiBfU1RMUF9JT1NUUkVBTQotI2RlZmluZSBfU1RMUF9JT1NUUkVBTQotCi0jIGlmbmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECi0jICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDEwMzcKLSMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+Ci0jIGVuZGlmCi0KLSMgaWZkZWYgX1NUTFBfUFJBR01BX09OQ0UKLSMgIHByYWdtYSBvbmNlCi0jIGVuZGlmCi0KLSNpbmNsdWRlIDxzdGwvX2lvc2Vyci5oPgotCi0jaWZkZWYgX1NUTFBfUkVESVJFQ1RfU1REU1RSRUFNUwotLy8gZm9yIG9mc3RyZWFtIHJlZGlyZWN0aW9uCi0jIGluY2x1ZGUgPGZzdHJlYW0+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0bC9faW9zZndkLmg+Ci0jaW5jbHVkZSA8c3RsL19pc3RyZWFtLmg+Ci0KLV9TVExQX0JFR0lOX05BTUVTUEFDRQotCi0jaWZuZGVmIF9TVExQX1VTRV9OQU1FU1BBQ0VTCi0vLyBpbiBjYXNlIG9mIFNHSSBpb3N0cmVhbXMsIHdlIGhhdmUgdG8gcmVuYW1lIG91ciBzdHJlYW1zIG5vdCB0byBjbGFzaCB3aXRoIHRob3NlCi0vLyBwcm92aWRlZCBpbiBuYXRpdmUgbGliCi0jIGRlZmluZSBjaW4gX1NUTFBfY2luCi0jIGRlZmluZSBjb3V0IF9TVExQX2NvdXQKLSMgZGVmaW5lIGNlcnIgX1NUTFBfY2VycgotIyBkZWZpbmUgY2xvZyBfU1RMUF9jbG9nCi0jZW5kaWYKLQotLy8gTm90ZTogY2luIGFuZCB3Y2luIGFyZSBib3RoIGFzc29jaWF0ZWQgd2l0aCBzdGRpby4gIFRoZSBDIHN0YW5kYXJkCi0vLyAoQW1lbmRtZW50IDEsIHNlY3Rpb24gNC42LjIuMSkgc2F5cyB0aGF0IGl0IGlzIGFuIGVycm9yIHRvIG1peAotLy8gd2lkZS0gYW5kIG5hcnJvdy1vcmllbnRlZCBJL08gb24gdGhlIHNhbWUgc3RyZWFtLiAgVGhpcyBpbXBsaWVzCi0vLyB0aGF0IGl0IGlzIGFuIGVycm9yIHRvIHVzZSBib3RoIGNpbiBhbmQgd2NpbiBpbiB0aGUgc2FtZSBDKysKLS8vIHByb2dyYW07IHRoZSBzYW1lIGFwcGxpZXMgdG8gY291dCBhbmQgd2NvdXQsIGFuZCBjZXJyL2Nsb2cgYW5kCi0vLyB3Y2Vyci93Y2xvZy4KLQotIyBpZmRlZiBfU1RMUF9SRURJUkVDVF9TVERTVFJFQU1TCi1leHRlcm4gX1NUTFBfREVDTFNQRUMgaXN0cmVhbSBjaW47Ci1leHRlcm4gX1NUTFBfREVDTFNQRUMgb2ZzdHJlYW0gY291dDsKLWV4dGVybiBfU1RMUF9ERUNMU1BFQyBvZnN0cmVhbSBjZXJyOwotZXh0ZXJuIF9TVExQX0RFQ0xTUEVDIG9mc3RyZWFtIGNsb2c7Ci0jIGVsc2UKLWV4dGVybiBfU1RMUF9ERUNMU1BFQyBpc3RyZWFtIGNpbjsKLWV4dGVybiBfU1RMUF9ERUNMU1BFQyBvc3RyZWFtIGNvdXQ7Ci1leHRlcm4gX1NUTFBfREVDTFNQRUMgb3N0cmVhbSBjZXJyOwotZXh0ZXJuIF9TVExQX0RFQ0xTUEVDIG9zdHJlYW0gY2xvZzsKLSMgZW5kaWYKLQotIyBpZm5kZWYgX1NUTFBfTk9fV0NIQVJfVAotZXh0ZXJuIF9TVExQX0RFQ0xTUEVDIHdpc3RyZWFtIHdjaW47Ci1leHRlcm4gX1NUTFBfREVDTFNQRUMgd29zdHJlYW0gd2NvdXQ7Ci1leHRlcm4gX1NUTFBfREVDTFNQRUMgd29zdHJlYW0gd2NlcnI7Ci1leHRlcm4gX1NUTFBfREVDTFNQRUMgd29zdHJlYW0gd2Nsb2c7Ci0jIGVuZGlmCi0KLV9TVExQX0VORF9OQU1FU1BBQ0UKLQotLy8jIGVsaWYgZGVmaW5lZCAoIF9TVExQX1VTRV9OT19JT1NUUkVBTVMgKQotLy8jICBpbmNsdWRlIDxzdGwvX251bGxfc3RyZWFtLmg+Ci0KLSMgaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgxMDM3KQotIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KLSMgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKLSMgZW5kaWYKLQotI2VuZGlmIC8qIF9TVExQX0lPU1RSRUFNICovCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6CmRpZmYgLS1naXQgYS9pc282NDYuaCBiL2lzbzY0Ni5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNThlZDNiLi4wMDAwMDAwCi0tLSBhL2lzbzY0Ni5oCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogQm9yaXMgRm9taXRjaGV2Ci0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICovCi0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCkKLSMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MjA0Ci0jICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgotI2VsaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgyMDQpICYmICFkZWZpbmVkIChfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQpCi0jICBkZWZpbmUgX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lECi0jZW5kaWYKLQotLyogZXZjMyBkb2Vzbid0IGhhdmUgaXNvNjQ2LmggKi8KLSNpZiAhZGVmaW5lZCAoX1NUTFBfV0NFX0VWQzMpICYmICFkZWZpbmVkIChOX1BMQVRfTkxNKSAmJiAhZGVmaW5lZCAoX19CT1JMQU5EQ19fKQotIyAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ19IRUFERVIoaXNvNjQ2LmgpCi0jZW5kaWYKLQotI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MjA0KQotIyAgaWYgISBkZWZpbmVkIChfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQpCi0jICAgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+Ci0jICAgIHVuZGVmICBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECi0jICBlbmRpZgotIyAgdW5kZWYgIF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRAotI2VuZGlmCi0KLS8qIExvY2FsIFZhcmlhYmxlczoKLSAqIG1vZGU6QysrCi0gKiBFbmQ6Ci0gKi8KZGlmZiAtLWdpdCBhL2lzdHJlYW0gYi9pc3RyZWFtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzI4OGJhLi4wMDAwMDAwCi0tLSBhL2lzdHJlYW0KKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0jaWZuZGVmIF9TVExQX0lTVFJFQU0KLSNkZWZpbmUgX1NUTFBfSVNUUkVBTQotCi0jaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKLSMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MTAzNgotIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KLSNlbmRpZgotCi0jaWZkZWYgX1NUTFBfUFJBR01BX09OQ0UKLSMgIHByYWdtYSBvbmNlCi0jZW5kaWYKLQotI2luY2x1ZGUgPHN0bC9faW9zZXJyLmg+Ci0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfSVNUUkVBTQotIyAgaW5jbHVkZSA8c3RsL19pc3RyZWFtLmg+Ci0jZW5kaWYKLQotI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MTAzNikKLSMgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+Ci0jICB1bmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECi0jZW5kaWYKLQotI2VuZGlmIC8qIF9TVExQX0lTVFJFQU0gKi8KLQotLy8gTG9jYWwgVmFyaWFibGVzOgotLy8gbW9kZTpDKysKLS8vIEVuZDoKZGlmZiAtLWdpdCBhL2l0ZXJhdG9yIGIvaXRlcmF0b3IKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwOGNhZjQuLjAwMDAwMDAKLS0tIGEvaXRlcmF0b3IKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NAotICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NwotICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk3Ci0gKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5Ci0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLQotI2lmbmRlZiBfU1RMUF9JVEVSQVRPUgotI2RlZmluZSBfU1RMUF9JVEVSQVRPUgotCi0jIGlmbmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECi0jICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDM4Ci0jICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgotIyBlbmRpZgotCi0jIGlmZGVmIF9TVExQX1BSQUdNQV9PTkNFCi0jICBwcmFnbWEgb25jZQotIyBlbmRpZgotCi0jaWYgZGVmaW5lZCAoX1NUTFBfSU1QT1JUX1ZFTkRPUl9TVEQpCi0jIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0hFQURFUihpdGVyYXRvcikKLSNlbmRpZiAvKiBJTVBPUlQgKi8KLQotIyBpZm5kZWYgX1NUTFBfSU5URVJOQUxfSVRFUkFUT1JfSAotIyAgaW5jbHVkZSA8c3RsL19pdGVyYXRvci5oPgotIyBlbmRpZgotCi0jIGlmbmRlZiBfU1RMUF9JTlRFUk5BTF9TVFJFQU1fSVRFUkFUT1JfSAotIyAgaW5jbHVkZSA8c3RsL19zdHJlYW1faXRlcmF0b3IuaD4KLSMgZW5kaWYKLQotIyBpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDM4KQotIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KLSMgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKLSMgZW5kaWYKLQotI2VuZGlmIC8qIF9TVExQX0lURVJBVE9SICovCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6CmRpZmYgLS1naXQgYS9saWJzdGxwb3J0Lm1rIGIvbGlic3RscG9ydC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2I1MTI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlic3RscG9ydC5tawpAQCAtMCwwICsxLDEyIEBACisjIEFkZCBhIGNvdXBsZSBpbmNsdWRlIHBhdGhzIHRvIHVzZSBzdGxwb3J0LgorCisjIE9ubHkgdXNlIHRoaXMgb24gdGhlIGRldmljZSBvciBlbXVsYXRvci4KK2lmZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkKKyQoZXJyb3IgU1RMUG9ydCBub3Qgc3VpdGFibGUgZm9yIHRoZSBzaW11bGF0b3IhICQoTE9DQUxfUEFUSCkpCitlbmRpZgorCisjIE1ha2Ugc3VyZSBiaW9uaWMgaXMgZmlyc3Qgc28gd2UgY2FuIGluY2x1ZGUgc3lzdGVtIGhlYWRlcnMuCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKwliaW9uaWMgXAorCWV4dGVybmFsL3N0bHBvcnQvc3RscG9ydCBcCisJJChMT0NBTF9DX0lOQ0xVREVTKQpkaWZmIC0tZ2l0IGEvbGltaXRzIGIvbGltaXRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGRiOWViLi4wMDAwMDAwCi0tLSBhL2xpbWl0cworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTcKLSAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogQm9yaXMgRm9taXRjaGV2Ci0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICovCi0KLSNpZm5kZWYgX1NUTFBfTElNSVRTCi0jZGVmaW5lIF9TVExQX0xJTUlUUwotCi0jaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKLSMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MzkKLSMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+Ci0jZW5kaWYKLQotI2lmZGVmIF9TVExQX1BSQUdNQV9PTkNFCi0jICBwcmFnbWEgb25jZQotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfTElNSVRTCi0jICBpbmNsdWRlIDxzdGwvX2xpbWl0cy5oPgotI2VuZGlmCi0KLSNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDM5KQotIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KLSMgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKLSNlbmRpZgotCi0jZW5kaWYgLyogX1NUTFBfTElNSVRTICovCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6CmRpZmYgLS1naXQgYS9saW1pdHMuaCBiL2xpbWl0cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzUzYWYxLi4wMDAwMDAwCi0tLSBhL2xpbWl0cy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogQm9yaXMgRm9taXRjaGV2Ci0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICovCi0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCkKLSMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MjAxCi0jICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgotI2VsaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgyMDEpICYmICEgZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQotIyAgZGVmaW5lIF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRAotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9TVExQX1dDRV9FVkMzKQotc3RydWN0IF9leGNlcHRpb247Ci0jZW5kaWYKLQotI2luY2x1ZGUgX1NUTFBfTkFUSVZFX0NfSEVBREVSKGxpbWl0cy5oKQotCi0jaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgyMDEpCi0jICBpZiAhIGRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKLSMgICAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KLSMgICAgdW5kZWYgIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKLSMgIGVuZGlmCi0jICB1bmRlZiAgX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lECi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpc3QgYi9saXN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjM4ZjA0Li4wMDAwMDAwCi0tLSBhL2xpc3QKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NAotICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NwotICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk3Ci0gKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5Ci0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLQotI2lmbmRlZiBfU1RMUF9MSVNUCi0jZGVmaW5lIF9TVExQX0xJU1QKLQotI2lmbmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECi0jICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDQwCi0jICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgotI2VuZGlmCi0KLSNpZmRlZiBfU1RMUF9QUkFHTUFfT05DRQotIyAgcHJhZ21hIG9uY2UKLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0xJU1RfSAotIyAgaW5jbHVkZSA8c3RsL19saXN0Lmg+Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9TVExQX0lNUE9SVF9WRU5ET1JfU1REKQotIyAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfSEVBREVSKGxpc3QpCi0jZW5kaWYKLQotI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4NDApCi0jICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgotIyAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAotI2VuZGlmCi0KLSNlbmRpZiAvKiBfU1RMUF9MSVNUICovCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6CmRpZmYgLS1naXQgYS9sb2NhbGUgYi9sb2NhbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4OWJmZTMuLjAwMDAwMDAKLS0tIGEvbG9jYWxlCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogQm9yaXMgRm9taXRjaGV2Ci0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICovCi0jaWZuZGVmIF9TVExQX0xPQ0FMRQotI2RlZmluZSBfU1RMUF9MT0NBTEUKLQotLy8gQmFzaWMgZnJhbWV3b3JrOiBjbGFzcyBsb2NhbGUgYW5kIGNsYXNzIGxvY2FsZTo6ZmFjZXQKLQotI2lmbmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECi0jICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDEwNDEKLSMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+Ci0jZW5kaWYKLQotI2lmZGVmIF9TVExQX1BSQUdNQV9PTkNFCi0jICBwcmFnbWEgb25jZQotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGwvX2lvc2Vyci5oPgotCi0vLyBJbmRpdmlkdWFsIGZhY2V0cwotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DVFlQRV9ICi0jICBpbmNsdWRlIDxzdGwvX2N0eXBlLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DT0RFQ1ZUX0gKLSMgIGluY2x1ZGUgPHN0bC9fY29kZWN2dC5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ09MTEFURV9ICi0jICBpbmNsdWRlIDxzdGwvX2NvbGxhdGUuaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX05VTV9QVVRfSAotIyAgaW5jbHVkZSA8c3RsL19udW1fcHV0Lmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9OVU1fR0VUX0gKLSMgIGluY2x1ZGUgPHN0bC9fbnVtX2dldC5oPgotI2VuZGlmCi0KLS8vIHRob3NlIG5ldmVyIGluY2x1ZGVkIHNlcGFyYXRlbHkgYW55d2F5Ci0jaW5jbHVkZSA8c3RsL19tb25ldGFyeS5oPgotI2luY2x1ZGUgPHN0bC9fdGltZV9mYWNldHMuaD4KLSNpbmNsdWRlIDxzdGwvX21lc3NhZ2VzX2ZhY2V0cy5oPgotCi0vLyBzb21lIHN0dWZmIGZvciBzdHJlYW1idWYgaXRlcmF0b3JzIGVuZGVkIHVwIGRlZmluZWQgdGhlcmUKLS8vIFN0cmljdGx5IHNwZWFraW5nLCBfaXN0cmVhbS5oIHBvcnRpb24gaXMgb25seSByZXF1aXJlZCBmb3IgPGl0ZXJhdG9yPiwgYnV0IGl0IG1heSBicmVhayB0b28gbWFueQotLy8gcHJvZ3JhbXMgaWYgd2Ugb21pdCBpdAotI2lmbmRlZiBfU1RMUF9JU1RSRUFNX0gKLSMgIGluY2x1ZGUgPHN0bC9faXN0cmVhbS5oPgotI2VuZGlmCi0KLS8vIENvbnZlbmllbmNlIGludGVyZmFjZXMKLSN1bmRlZiBpc3NwYWNlCi0jdW5kZWYgaXNwcmludAotI3VuZGVmIGlzY250cmwKLSN1bmRlZiBpc3VwcGVyCi0jdW5kZWYgaXNsb3dlcgotI3VuZGVmIGlzYWxwaGEKLSN1bmRlZiBpc2RpZ2l0Ci0jdW5kZWYgaXNwdW5jdAotI3VuZGVmIGlzeGRpZ2l0Ci0jdW5kZWYgaXNhbG51bQotI3VuZGVmIGlzZ3JhcGgKLSN1bmRlZiB0b3VwcGVyCi0jdW5kZWYgdG9sb3dlcgotCi1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4gCi1pbmxpbmUgYm9vbCBpc3NwYWNlIChfQ2hhclQgYywgY29uc3QgbG9jYWxlJiBsb2MpCi17IHJldHVybiAodXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihsb2MpKS5pcyhjdHlwZV9iYXNlOjpzcGFjZSwgYyk7IH0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4gCi1pbmxpbmUgYm9vbCBpc3ByaW50IChfQ2hhclQgYywgY29uc3QgbG9jYWxlJiBsb2MpCi17IHJldHVybiAodXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihsb2MpKS5pcyhjdHlwZV9iYXNlOjpwcmludCwgYyk7IH0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4gCi1pbmxpbmUgYm9vbCBpc2NudHJsIChfQ2hhclQgYywgY29uc3QgbG9jYWxlJiBsb2MpCi17IHJldHVybiAodXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihsb2MpKS5pcyhjdHlwZV9iYXNlOjpjbnRybCwgYyk7IH0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4gCi1pbmxpbmUgYm9vbCBpc3VwcGVyIChfQ2hhclQgYywgY29uc3QgbG9jYWxlJiBsb2MpCi17IHJldHVybiAodXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihsb2MpKS5pcyhjdHlwZV9iYXNlOjp1cHBlciwgYyk7IH0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4gCi1pbmxpbmUgYm9vbCBpc2xvd2VyIChfQ2hhclQgYywgY29uc3QgbG9jYWxlJiBsb2MpCi17IHJldHVybiAodXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihsb2MpKS5pcyhjdHlwZV9iYXNlOjpsb3dlciwgYyk7IH0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4gCi1pbmxpbmUgYm9vbCBpc2FscGhhIChfQ2hhclQgYywgY29uc3QgbG9jYWxlJiBsb2MpCi17IHJldHVybiAodXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihsb2MpKS5pcyhjdHlwZV9iYXNlOjphbHBoYSwgYyk7IH0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4gCi1pbmxpbmUgYm9vbCBpc2RpZ2l0IChfQ2hhclQgYywgY29uc3QgbG9jYWxlJiBsb2MpCi17IHJldHVybiAodXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihsb2MpKS5pcyhjdHlwZV9iYXNlOjpkaWdpdCwgYyk7IH0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4gCi1pbmxpbmUgYm9vbCBpc3B1bmN0IChfQ2hhclQgYywgY29uc3QgbG9jYWxlJiBsb2MpCi17IHJldHVybiAodXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihsb2MpKS5pcyhjdHlwZV9iYXNlOjpwdW5jdCwgYyk7IH0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4gCi1pbmxpbmUgYm9vbCBpc3hkaWdpdCAoX0NoYXJUIGMsIGNvbnN0IGxvY2FsZSYgbG9jKQoteyByZXR1cm4gKHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4obG9jKSkuaXMoY3R5cGVfYmFzZTo6eGRpZ2l0LCBjKTsgfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPiAKLWlubGluZSBib29sIGlzYWxudW0gKF9DaGFyVCBjLCBjb25zdCBsb2NhbGUmIGxvYykKLXsgcmV0dXJuICh1c2VfZmFjZXQ8Y3R5cGU8X0NoYXJUPiA+KGxvYykpLmlzKGN0eXBlX2Jhc2U6OmFsbnVtLCBjKTsgfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPiAKLWlubGluZSBib29sIGlzZ3JhcGggKF9DaGFyVCBjLCBjb25zdCBsb2NhbGUmIGxvYykKLXsgcmV0dXJuICh1c2VfZmFjZXQ8Y3R5cGU8X0NoYXJUPiA+KGxvYykpLmlzKGN0eXBlX2Jhc2U6OmdyYXBoLCBjKTsgfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgotaW5saW5lIF9DaGFyVCB0b3VwcGVyKF9DaGFyVCBjLCBjb25zdCBsb2NhbGUmIGxvYykKLXsgcmV0dXJuICh1c2VfZmFjZXQ8Y3R5cGU8X0NoYXJUPiA+KGxvYykpLnRvdXBwZXIoYyk7IH0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KLWlubGluZSBfQ2hhclQgdG9sb3dlcihfQ2hhclQgYywgY29uc3QgbG9jYWxlJiBsb2MpCi17IHJldHVybiAodXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihsb2MpKS50b2xvd2VyKGMpOyB9Ci0KLV9TVExQX0VORF9OQU1FU1BBQ0UKLQotI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MTA0MSkKLSMgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+Ci0jICB1bmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECi0jZW5kaWYKLQotI2VuZGlmIC8qIF9TVExQX0xPQ0FMRSAqLwotCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6CmRpZmYgLS1naXQgYS9sb2NhbGUuaCBiL2xvY2FsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmY3NjkxLi4wMDAwMDAwCi0tLSBhL2xvY2FsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogQm9yaXMgRm9taXRjaGV2Ci0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICovCi0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCkKLSMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MjQyCi0jICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgotI2VsaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgyNDIpCi0jICBpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQotIyAgICBkZWZpbmUgX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lECi0jICBlbHNlCi0jICAgIGVycm9yIFNUTHBvcnQgaW5jbHVkZSBzY2hlbWEgdmlvbGF0aW9uCi0jICBlbmRpZgotI2VuZGlmCi0KLS8qIGV2YzMgZG9lc24ndCBoYXZlIGxvY2FsZS5oICovCi0jaWZuZGVmIF9TVExQX1dDRV9FVkMzCi0jICBpbmNsdWRlIF9TVExQX05BVElWRV9DX0hFQURFUihsb2NhbGUuaCkKLSNlbmRpZgotCi0jaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgyNDIpCi0jICBpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQotIyAgICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgotIyAgICB1bmRlZiAgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAotIyAgZWxzZQotIyAgICB1bmRlZiAgX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lECi0jICBlbmRpZgotI2VuZGlmCi0KLS8qIExvY2FsIFZhcmlhYmxlczoKLSAqIG1vZGU6QysrCi0gKiBFbmQ6Ci0gKi8KZGlmZiAtLWdpdCBhL21hcCBiL21hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE4YTg5Yi4uMDAwMDAwMAotLS0gYS9tYXAKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NAotICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NwotICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk3Ci0gKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5Ci0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLQotI2lmbmRlZiBfU1RMUF9NQVAKLSNkZWZpbmUgX1NUTFBfTUFQCi0KLSNpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAotIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHg0MwotIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KLSNlbmRpZgotCi0jaWZkZWYgX1NUTFBfUFJBR01BX09OQ0UKLSMgIHByYWdtYSBvbmNlCi0jZW5kaWYKLQotI2luY2x1ZGUgPHN0bC9fbWFwLmg+Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9JTVBPUlRfVkVORE9SX1NURCkKLSMgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0hFQURFUihtYXApCi0jZW5kaWYKLQotI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4NDMpCi0jICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgotIyAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAotI2VuZGlmCi0KLSNlbmRpZiAvKiBfU1RMUF9NQVAgKi8KLQotLy8gTG9jYWwgVmFyaWFibGVzOgotLy8gbW9kZTpDKysKLS8vIEVuZDoKZGlmZiAtLWdpdCBhL21hdGguaCBiL21hdGguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdiZjU0MS4uMDAwMDAwMAotLS0gYS9tYXRoLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLQotI2lmICFkZWZpbmVkIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEKQotIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHgyNDQKLSMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+Ci0jZWxpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDI0NCkgJiYgIWRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKLSMgIGRlZmluZSBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQgKGV4Y2VwdGlvbikgJiYgKCFkZWZpbmVkIChfX0tDQykgfHwgKF9fS0NDX1ZFUlNJT04gPCA0MDAwKSkgJiYgXAotICAgICEoZGVmaW5lZChfX0lCTUNQUF9fKSAmJiAoNTAwIDw9IF9fSUJNQ1BQX18pKSAmJiAhZGVmaW5lZChfU1RMUF9XQ0VfRVZDMykKLSMgIGRlZmluZSBfU1RMUF9FWENFUFRJT05fV0FTX1JFREVGSU5FRCAxCi0jICBkZWZpbmUgZXhjZXB0aW9uIF9fbWF0aF9leGNlcHRpb24KLSNlbmRpZgotCi0jaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ19IRUFERVIobWF0aC5oKQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfRVhDRVBUSU9OX1dBU19SRURFRklORUQpCi0jICB1bmRlZiBleGNlcHRpb24KLSMgIHVuZGVmIF9TVExQX0VYQ0VQVElPTl9XQVNfUkVERUZJTkVECi0jZW5kaWYKLQotI2lmZGVmIF9TVExQX1dDRV9FVkMzCi0jICB1bmRlZiBfZXhjZXB0aW9uCi0jICBkZWZpbmUgX2V4Y2VwdGlvbiBleGNlcHRpb24KLSNlbmRpZgotCi0jaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgyNDQpCi0jICBpZiAhIGRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKLSMgICAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KLSMgICAgdW5kZWYgIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKLSMgIGVsc2UKLSMgICAgdW5kZWYgIF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRAotIyAgZW5kaWYKLSNlbmRpZgotCi0vKiBMb2NhbCBWYXJpYWJsZXM6Ci0gKiBtb2RlOkMrKwotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9tZW0uaCBiL21lbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGIzOTM1Li4wMDAwMDAwCi0tLSBhL21lbS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogQm9yaXMgRm9taXRjaGV2Ci0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICovCi0KLSNpZm5kZWYgX1NUTFBfbWVtX2gKLQotI2lmICFkZWZpbmVkIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEKQotIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHgyNDUKLSMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+Ci0jZWxpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDI0NSkgJiYgIWRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKLSMgIGRlZmluZSBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKLSNlbmRpZgotCi0jaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgIT0gMHgyNDUpIHx8IGRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKLSMgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NfSEVBREVSKG1lbS5oKQotI2Vsc2UKLSMgIGlmIGRlZmluZWQgKF9fQk9STEFORENfXykgJiYgZGVmaW5lZCAoX19VU0lOR19DTkFNRV9fKQotIyAgICBkZWZpbmUgX1VTSU5HX0NOQU1FX1dBU19VTkRFRklORUQKLSMgICAgdW5kZWYgX19VU0lOR19DTkFNRV9fCi0jICBlbmRpZgotCi0jICBpbmNsdWRlIF9TVExQX05BVElWRV9DX0hFQURFUihtZW0uaCkKLQotIyAgaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKSAmJiBkZWZpbmVkIChfVVNJTkdfQ05BTUVfV0FTX1VOREVGSU5FRCkKLSMgICAgZGVmaW5lIF9fVVNJTkdfQ05BTUVfXwotIyAgICBkZWZpbmUgX1NUTFBfbWVtX2ggMQotIyAgICB1bmRlZiBfVVNJTkdfQ05BTUVfV0FTX1VOREVGSU5FRAotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgyNDUpCi0jICBpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQotIyAgICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgotIyAgICB1bmRlZiAgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAotIyAgZW5kaWYKLSMgIHVuZGVmICBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKLSNlbmRpZgotCi0jZW5kaWYgLyogX1NUTFBfbWVtX2ggKi8KLQotLyogTG9jYWwgVmFyaWFibGVzOgotICogbW9kZTpDKysKLSAqIEVuZDoKLSAqLwpkaWZmIC0tZ2l0IGEvbWVtb3J5IGIvbWVtb3J5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWFmODgzLi4wMDAwMDAwCi0tLSBhL21lbW9yeQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMTk5OQotICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLQotI2lmbmRlZiBfU1RMUF9NRU1PUlkKLSNkZWZpbmUgX1NUTFBfTUVNT1JZCi0KLSNpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAotIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHg0NgotIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KLSNlbmRpZgotCi0jaWZkZWYgX1NUTFBfUFJBR01BX09OQ0UKLSMgIHByYWdtYSBvbmNlCi0jZW5kaWYKLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9BTExPQ19ICi0jICBpbmNsdWRlIDxzdGwvX2FsbG9jLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9URU1QQlVGX0gKLSMgIGluY2x1ZGUgPHN0bC9fdGVtcGJ1Zi5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfUkFXX1NUT1JBR0VfSVRFUl9ICi0jICBpbmNsdWRlIDxzdGwvX3Jhd19zdG9yYWdlX2l0ZXIuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RsL19hdXRvX3B0ci5oPgotCi0jaWYgZGVmaW5lZCAoX1NUTFBfSU1QT1JUX1ZFTkRPUl9TVEQpCi0KLSMgIGlmIGRlZmluZWQgKF9fTVNMX18pCi0jICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0hFQURFUihsaW1pdHMpCi0jICBlbmRpZgotCi0jICBpbmNsdWRlIF9TVExQX05BVElWRV9IRUFERVIobWVtb3J5KQotCi0jICBpZiBkZWZpbmVkIChfX01TTF9fKSAmJiAoX19NU0xfXyA+PSAweDI0MDUgICAmJiBfX01TTF9fIDwgMHg1MjAxKSAKLS8qICA5ODA0MDEgdnNzICBNU0wgMi40ICBQcm8gMyBSZWxlYXNlICAqLyAgCi0jICAgIGluY2x1ZGUgPG5ld19tZW0uaD4KLSMgIGVuZGlmCi0KLSNlbmRpZgotCi0jaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHg0NikKLSMgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+Ci0jICB1bmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECi0jZW5kaWYKLQotI2VuZGlmIC8qIF9TVExQX01FTU9SWSAqLwotCi0vLyBMb2NhbCBWYXJpYWJsZXM6Ci0vLyBtb2RlOkMrKwotLy8gRW5kOgotCmRpZmYgLS1naXQgYS9uZXcgYi9uZXcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMTNkYWIuLjAwMDAwMDAKLS0tIGEvbmV3CisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogQm9yaXMgRm9taXRjaGV2Ci0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICovCi0KLSNpZm5kZWYgX1NUTFBfTkVXX0hFQURFUgotI2RlZmluZSBfU1RMUF9ORVdfSEVBREVSCi0KLSNpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAotIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHg0NDcKLSMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+Ci0jZW5kaWYKLQotI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEICE9IDB4NDQ3KQotIyAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ1BQX1JVTlRJTUVfSEVBREVSKG5ldykKLSNlbHNlCi0jICBpZm5kZWYgX1NUTFBfTkVXX0hfSEVBREVSCi0jICAgIGluY2x1ZGUgPHN0bC9fbmV3Lmg+Ci0jICBlbmRpZgotI2VuZGlmCi0KLSNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDQ0NykKLSMgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+Ci0jICB1bmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECi0jZW5kaWYKLQotI2VuZGlmIC8qIF9TVExQX05FVyAqLwotCi0vLyBMb2NhbCBWYXJpYWJsZXM6Ci0vLyBtb2RlOkMrKwotLy8gRW5kOgpkaWZmIC0tZ2l0IGEvbmV3LmggYi9uZXcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ4OWI1ZC4uMDAwMDAwMAotLS0gYS9uZXcuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0jaWYgIWRlZmluZWQgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQpCi0jICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDg0OAotIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KLSNlbGlmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4ODQ4KSAmJiAhIGRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKLSMgIGRlZmluZSBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoX1NUTFBfTk9fTkVXX0hFQURFUikKLSMgIGlmIGRlZmluZWQgKF9fQk9STEFORENfXykKLSMgICAgaW5jbHVkZSA8bmV3PgotIyAgZWxpZiBkZWZpbmVkKF9fSU5URUxfQ09NUElMRVIpICYmIChfX0lOVEVMX0NPTVBJTEVSID49IDgwMCAmJiAhZGVmaW5lZChfTVNDX1ZFUikpCi0jICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX09MRF9TVFJFQU1TX0hFQURFUihuZXcuaCkKLSMgIGVsc2UKLSMgICAgaWYgZGVmaW5lZCAoX19HTlVDX18pICYmIChfX0dOVUNfXyA+PSAzKQotIyAgICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX09MRF9TVFJFQU1TX0hFQURFUihuZXcuaCkKLSMgICAgZWxzZQotIyAgICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9SVU5USU1FX0hFQURFUihuZXcuaCkKLSMgICAgZW5kaWYKLSMgIGVuZGlmCi0jZW5kaWYgLyogIWRlZmluZWQoX1NUTFBfTk9fTkVXX0hFQURFUikgKi8KLQotI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4ODQ4KQotIyAgaWYgISBkZWZpbmVkIChfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQpCi0jICAgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+Ci0jICAgIHVuZGVmICBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECi0jICBlbHNlCi0jICAgIHVuZGVmICBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKLSMgIGVuZGlmCi0jZW5kaWYKLQotLy8gTG9jYWwgVmFyaWFibGVzOgotLy8gbW9kZTpDKysKLS8vIEVuZDoKZGlmZiAtLWdpdCBhL251bWVyaWMgYi9udW1lcmljCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTMyY2ZlLi4wMDAwMDAwCi0tLSBhL251bWVyaWMKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NAotICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NwotICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLQotI2lmbmRlZiBfU1RMUF9OVU1FUklDCi0jZGVmaW5lIF9TVExQX05VTUVSSUMKLQotI2lmbmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECi0jICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDQ5Ci0jICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgotI2VuZGlmCi0KLSNpZmRlZiBfU1RMUF9QUkFHTUFfT05DRQotIyAgcHJhZ21hIG9uY2UKLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX05VTUVSSUNfSAotIyAgaW5jbHVkZSA8c3RsL19udW1lcmljLmg+Ci0jZW5kaWYKLQotI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4NDkpCi0jICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgotIyAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAotI2VuZGlmCi0KLSNlbmRpZiAvKiBfU1RMUF9OVU1FUklDICovCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6CmRpZmYgLS1naXQgYS9vc3RyZWFtIGIvb3N0cmVhbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNmODIzZi4uMDAwMDAwMAotLS0gYS9vc3RyZWFtCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLSNpZm5kZWYgX1NUTFBfT1NUUkVBTQotI2RlZmluZSBfU1RMUF9PU1RSRUFNCi0KLSMgaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKLSMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MTA1MAotIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KLSMgZW5kaWYKLQotIyBpZmRlZiBfU1RMUF9QUkFHTUFfT05DRQotIyAgcHJhZ21hIG9uY2UKLSMgZW5kaWYKLQotIyBpbmNsdWRlIDxzdGwvX2lvc2Vyci5oPgotIyBpbmNsdWRlIDxzdGwvX29zdHJlYW0uaD4KLQotIyBpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDEwNTApCi0jICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgotIyAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAotIyBlbmRpZgotCi0jZW5kaWYgLyogX1NUTFBfT1NUUkVBTSAqLwotCi0vLyBMb2NhbCBWYXJpYWJsZXM6Ci0vLyBtb2RlOkMrKwotLy8gRW5kOgpkaWZmIC0tZ2l0IGEvcHRocmVhZC5oIGIvcHRocmVhZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2MwYzI0Li4wMDAwMDAwCi0tLSBhL3B0aHJlYWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0jIGlmICFkZWZpbmVkIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEKQotIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHgyODAKLSMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+Ci0jIGVsaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgyODApICYmICEgZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQotIyAgZGVmaW5lIF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRAotIyBlbmRpZgotCi0jIGlmIGRlZmluZWQgKF9fU1VOUFJPX0NDKSB8fCBkZWZpbmVkIChfX0hQX2FDQykKLSMgaW5jbHVkZSAiL3Vzci9pbmNsdWRlL3B0aHJlYWQuaCIKLSMgZWxzZQotIyBpbmNsdWRlIF9TVExQX05BVElWRV9DX0hFQURFUihwdGhyZWFkLmgpCi0jIGVuZGlmCi0KLSMgaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgyODApCi0jICBpZiAhIGRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKLSMgICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgotIyAgIHVuZGVmICBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECi0jICBlbHNlCi0jICAgdW5kZWYgIF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRAotIyAgZW5kaWYKLSMgZW5kaWYKLQotLyoKLSBMb2NhbCBWYXJpYWJsZXM6Ci0gbW9kZTpDKysKLSBFbmQ6Ci0qLwpkaWZmIC0tZ2l0IGEvcXVldWUgYi9xdWV1ZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkwYmMwNi4uMDAwMDAwMAotLS0gYS9xdWV1ZQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk0Ci0gKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3Ci0gKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTcKLSAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0jaWZuZGVmIF9TVExQX1FVRVVFCi0jZGVmaW5lIF9TVExQX1FVRVVFCi0KLSNpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAotIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHg1MwotIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KLSNlbmRpZgotCi0jaWZkZWYgX1NUTFBfUFJBR01BX09OQ0UKLSMgIHByYWdtYSBvbmNlCi0jZW5kaWYKLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9RVUVVRV9ICi0jICBpbmNsdWRlIDxzdGwvX3F1ZXVlLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBfU1RMUF9GVU5DVElPTkFMCi0jICBpbmNsdWRlIDxmdW5jdGlvbmFsPgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9JTVBPUlRfVkVORE9SX1NURCkKLSMgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0hFQURFUihxdWV1ZSkKLSNlbmRpZgotCi0jaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHg1MykKLSMgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+Ci0jICB1bmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECi0jZW5kaWYKLQotI2VuZGlmIC8qIF9TVExQX1FVRVVFICovCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6CmRpZmYgLS1naXQgYS9zZXQgYi9zZXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjM2RkMmQuLjAwMDAwMDAKLS0tIGEvc2V0CisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTQKLSAqIEhld2xldHQtUGFja2FyZCBDb21wYW55Ci0gKgotICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKLSAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NwotICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogQm9yaXMgRm9taXRjaGV2Ci0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICovCi0KLSNpZm5kZWYgX1NUTFBfU0VUCi0jZGVmaW5lIF9TVExQX1NFVAotCi0jaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKLSMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4NTUKLSMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+Ci0jZW5kaWYKLQotI2lmZGVmIF9TVExQX1BSQUdNQV9PTkNFCi0jICBwcmFnbWEgb25jZQotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGwvX3NldC5oPgotCi0jaWYgZGVmaW5lZCAoX1NUTFBfSU1QT1JUX1ZFTkRPUl9TVEQpCi0jICBpbmNsdWRlIF9TVExQX05BVElWRV9IRUFERVIoc2V0KQotI2VuZGlmCi0KLSNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDU1KQotIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KLSMgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKLSNlbmRpZgotCi0jZW5kaWYgLyogX1NUTFBfU0VUICovCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6CmRpZmYgLS1naXQgYS9zZXRqbXAuaCBiL3NldGptcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWJlZjE2Li4wMDAwMDAwCi0tLSBhL3NldGptcC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogQm9yaXMgRm9taXRjaGV2Ci0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICovCi0KLSNpZm5kZWYgX1NUTFBfU0VUSk1QX0gKLQotI2lmICFkZWZpbmVkIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEKQotIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHgyNTYKLSMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+Ci0jZWxpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDI1NikgJiYgIWRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKLSMgIGRlZmluZSBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKLSMgIGRlZmluZSBfU1RMUF9TRVRKTVBfSAotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9TVExQX1dDRV9FVkMzKQotc3RydWN0IF9leGNlcHRpb247Ci0jZW5kaWYKLQotI2lmICFkZWZpbmVkIChzZXRqbXApCi0jICBkZWZpbmUgX1NUTFBfTkFUSVZFX1NFVEpNUF9IX0lOQ0xVREVECi0jICBpbmNsdWRlIF9TVExQX05BVElWRV9DX0hFQURFUihzZXRqbXAuaCkKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQgKF9TVExQX05BVElWRV9TRVRKTVBfSF9JTkNMVURFRCkKLS8qIFNlZSBlcnJuby5oIGZpbGUgZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhpcyBwcm9ibGVtLiAqLwotIyAgZXJyb3Igc2V0am1wIGhhcyBiZWVuIGRlZmluZWQgYmVmb3JlIGluY2x1c2lvbiBvZiBzZXRqbXAuaCBoZWFkZXIuCi0jZW5kaWYKLQotI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MjU2KQotIyAgaWYgISBkZWZpbmVkIChfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQpCi0jICAgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+Ci0jICAgIHVuZGVmICBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECi0jICBlbHNlCi0jICAgIHVuZGVmICBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKLSMgIGVuZGlmCi0jZW5kaWYKLSNlbmRpZiAvKiBfU1RMUF9TRVRKTVBfSCAqLwpkaWZmIC0tZ2l0IGEvc2lnbmFsLmggYi9zaWduYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IzYzcwYS4uMDAwMDAwMAotLS0gYS9zaWduYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0jaWYgIWRlZmluZWQgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQpCi0jICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDI1NwotIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KLSNlbGlmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MjU3KSAmJiAhIGRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKLSMgIGRlZmluZSBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKLSNlbmRpZgotCi0vKiBldmMzIGFuZCBldmM0IGRvbid0IGhhdmUgc2lnbmFsLmggKi8KLSNpZm5kZWYgX1NUTFBfV0NFCi0jICBpbmNsdWRlIF9TVExQX05BVElWRV9DX0hFQURFUihzaWduYWwuaCkKLSNlbmRpZgotCi0jaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgyNTcpCi0jICBpZiAhIGRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKLSMgICAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KLSMgICAgdW5kZWYgIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKLSMgIGVuZGlmCi0jICB1bmRlZiAgX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lECi0jZW5kaWYKLQotLyogTG9jYWwgVmFyaWFibGVzOgotICogbW9kZTpDKysKLSAqIEVuZDoKLSAqLwpkaWZmIC0tZ2l0IGEvc3JjL19zdGRpb19maWxlLmggYi9zcmMvX3N0ZGlvX2ZpbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTEzZmM0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL19zdGRpb19maWxlLmgKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfU1RESU9fRklMRV9ICisjZGVmaW5lIF9TVExQX1NURElPX0ZJTEVfSAorCisvKiBUaGlzIGZpbGUgcHJvdmlkZXMgYSBsb3ctbGV2ZWwgaW50ZXJmYWNlIGJldHdlZW4gdGhlIGludGVybmFsCisgKiByZXByZXNlbnRhdGlvbiBvZiBzdHJ1Y3QgRklMRSwgZnJvbSB0aGUgQyBzdGRpbyBsaWJyYXJ5LCBhbmQKKyAqIHRoZSBDKysgSS9PIGxpYnJhcnkuICovCisKKyNpZm5kZWYgX1NUTFBfQ1NURElPCisjICBpbmNsdWRlIDxjc3RkaW8+CisjZW5kaWYKKyNpZm5kZWYgX1NUTFBfQ1NURERFRgorIyAgaW5jbHVkZSA8Y3N0ZGRlZj4KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19NU0xfXykKKyMgIGluY2x1ZGUgPHVuaXguaD4gIC8qIGdldCB0aGUgZGVmaW5pdGlvbiBvZiBmaWxlbm8gKi8KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworI2lmIGRlZmluZWQgKF9TVExQX1dDRSkKKworaW5saW5lIGludCBfRklMRV9mZChjb25zdCBGSUxFICpfX2YpIHsKKyAgLyogQ2hlY2sgaWYgRklMRSBpcyBvbmUgb2YgdGhlIHRocmVlIHN0YW5kYXJkIHN0cmVhbXMKKyAgICAgV2UgZG8gdGhpcyBjaGVjayBmaXJzdCwgYmVjYXVzZSBpbnZva2luZyBfZmlsZW5vKCkgb24gb25lIG9mIHRoZW0KKyAgICAgY2F1c2VzIGEgdGVybWluYWwgd2luZG93IHRvIGJlIGNyZWF0ZWQuIFRoaXMgYWxzbyBoYXBwZW5zIGlmIHlvdSBkbworICAgICBhbnkgSU8gb24gdGhlbSwgYnV0IG1lcmVseSByZXRyaWV2aW5nIHRoZSBmaWxlZGVzY3JpcHRvciBzaG91bGRuJ3QKKyAgICAgYWxyZWFkeSBkbyB0aGF0LgorCisgICAgIE9idmlvdXNseSB0aGlzIGlzIHByZXR0eSBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyBiZWNhdXNlIGl0IHJlcXVpcmVzCisgICAgIHRoYXQgaW5kZWVkIHRoZSBmaXJzdCB0aHJlZSBGRHMgYXJlIGFsd2F5cyB0aGUgc2FtZSwgYnV0IHRoYXQgaXMgbm90CisgICAgIG9ubHkgY29tbW9uIGJ1dCBhbG1vc3QgZ3VhcmFudGVlZC4gKi8KKyAgZm9yIChpbnQgX19mZCA9IDA7IF9fZmQgIT0gMzsgKytfX2ZkKSB7CisgICAgaWYgKF9fZiA9PSBfZ2V0c3RkZmlsZXgoX19mZCkpCisgICAgICByZXR1cm4gX19mZDsKKyAgfQorCisgIC8qIE5vcm1hbCBmaWxlcy4gKi8KKyAgcmV0dXJuIChpbnQpOjpfZmlsZW5vKChGSUxFKilfX2YpOyAKK30KKworIyBlbGlmIGRlZmluZWQgKF9TVExQX1NDT19PUEVOU0VSVkVSKSB8fCBkZWZpbmVkIChfX05DUl9TVlIpCisKK2lubGluZSBpbnQgX0ZJTEVfZmQoY29uc3QgRklMRSAqX19mKSB7IHJldHVybiBfX2YtPl9fZmlsZTsgfQorCisjIGVsaWYgZGVmaW5lZCAoX19zdW4pICYmIGRlZmluZWQgKF9MUDY0KQorCitpbmxpbmUgaW50IF9GSUxFX2ZkKGNvbnN0IEZJTEUgKl9fZikgeyByZXR1cm4gKGludCkgX19mLT5fX3BhZFsyXTsgfQorCisjZWxpZiBkZWZpbmVkIChfX2hwdXgpIC8qICYmIGRlZmluZWQoX19ocHBhKSAmJiBkZWZpbmVkKF9fSFBfYUNDKSkgKi8gfHwgXAorICAgICAgZGVmaW5lZCAoX19NVlNfXykgfHwgXAorICAgICAgZGVmaW5lZCAoX1NUTFBfVVNFX1VDTElCQykgLyogc2hvdWxkIGJlIGJlZm9yZSBfU1RMUF9VU0VfR0xJQkMgKi8KKworaW5saW5lIGludCBfRklMRV9mZChjb25zdCBGSUxFICpfX2YpIHsgcmV0dXJuIGZpbGVubyhfX0NPTlNUX0NBU1QoRklMRSosIF9fZikpOyB9CisKKyNlbGlmIGRlZmluZWQgKF9TVExQX1VTRV9HTElCQykKKworaW5saW5lIGludCBfRklMRV9mZChjb25zdCBGSUxFICpfX2YpIHsgcmV0dXJuIF9fZi0+X2ZpbGVubzsgfQorCisjZWxpZiBkZWZpbmVkIChfX0JPUkxBTkRDX18pCisKK2lubGluZSBpbnQgX0ZJTEVfZmQoY29uc3QgRklMRSAqX19mKSB7IHJldHVybiBfX2YtPmZkOyB9CisKKyNlbGlmIGRlZmluZWQgKF9fTVdFUktTX18pCisKKy8qIHVzaW5nIE1XRVJLUy1zcGVjaWZpYyBkZWZpbmVzIGhlcmUgdG8gZGV0ZWN0IG90aGVyIE9TIHRhcmdldHMKKyAqIGR3YTogSSdtIG5vdCBzdXJlIHRoZXkgcHJvdmlkZSBmaWxlbm8gZm9yIGFsbCBPUydzLCBidXQgdGhpcyBzaG91bGQKKyAqIHdvcmsgZm9yIFdpbjMyIGFuZCBXaW5DRQorCisgKiBIbW0sIGF0IGxlYXN0IGZvciBOb3ZlbGwgTmV0V2FyZSBfX2Rlc3Rfb3MgPT0gX19tYWNfb3MgdHJ1ZSB0b28uLgorICogTWF5IGJlIGJvdGggX19kZXN0X29zIGFuZCBfX21hY19vcyBkZWZpbmVkIGFuZCBlbXB0eT8gICAtIHB0ciAqLworIyAgaWYgX19kZXN0X29zID09IF9fbWFjX29zCitpbmxpbmUgaW50IF9GSUxFX2ZkKGNvbnN0IEZJTEUgKl9fZikgeyByZXR1cm4gOjpmaWxlbm8oX19DT05TVF9DQVNUKEZJTEUqLCBfX2YpKTsgfQorIyAgZWxzZQoraW5saW5lIGludCBfRklMRV9mZChjb25zdCBGSUxFICpfX2YpIHsgcmV0dXJuIDo6X2ZpbGVubyhfX0NPTlNUX0NBU1QoRklMRSosIF9fZikpOyB9CisjICBlbmRpZgorCisjZWxpZiBkZWZpbmVkIChfX1FOWE5UT19fKSB8fCBkZWZpbmVkIChfX1dBVENPTUNfXykgfHwgZGVmaW5lZCAoX19FTVhfXykKKworaW5saW5lIGludCBfRklMRV9mZChjb25zdCBGSUxFICpfX2YpIHsgcmV0dXJuIF9fZi0+X2hhbmRsZTsgfQorCisjZWxpZiBkZWZpbmVkIChfX0x5bnhfXykKKworLyogdGhlIHByb3RvdHlwZXMgYXJlIHRha2VuIGZyb20gTHlueE9TIHBhdGNoIGZvciBTVExwb3J0IDQuMCAqLworaW5saW5lIGludCBfRklMRV9mZChjb25zdCBGSUxFICpfX2YpIHsgcmV0dXJuIF9fZi0+X2ZkOyB9CisKKyNlbHNlICAvKiBUaGUgbW9zdCBjb21tb24gYWNjZXNzIHRvIGZpbGUgZGVzY3JpcHRvci4gKi8KKworaW5saW5lIGludCBfRklMRV9mZChjb25zdCBGSUxFICpfX2YpIHsgcmV0dXJuIF9fZi0+X2ZpbGU7IH0KKworI2VuZGlmCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2VuZGlmIC8qIF9TVExQX1NURElPX0ZJTEVfSCAqLworCisvKiBMb2NhbCBWYXJpYWJsZXM6CisgKiBtb2RlOkMrKworICogRW5kOiAqLwpkaWZmIC0tZ2l0IGEvc3JjL2FjcXVpcmVfcmVsZWFzZS5oIGIvc3JjL2FjcXVpcmVfcmVsZWFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlYTczZGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYWNxdWlyZV9yZWxlYXNlLmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBBQ1FVSVJFX1JFTEVBU0VfSAorI2RlZmluZSBBQ1FVSVJFX1JFTEVBU0VfSAorCisjaW5jbHVkZSAiY19sb2NhbGUuaCIKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK19Mb2NhbGVfY3R5cGUqIF9TVExQX0NBTEwgX19hY3F1aXJlX2N0eXBlKGNvbnN0IGNoYXIqICZuYW1lLCBjaGFyICpidWYsIF9Mb2NhbGVfbmFtZV9oaW50KiBoaW50LCBpbnQgKl9fZXJyX2NvZGUpOworX0xvY2FsZV9jb2RlY3Z0KiBfU1RMUF9DQUxMIF9fYWNxdWlyZV9jb2RlY3Z0KGNvbnN0IGNoYXIqICZuYW1lLCBjaGFyICpidWYsIF9Mb2NhbGVfbmFtZV9oaW50KiBoaW50LCBpbnQgKl9fZXJyX2NvZGUpOworX0xvY2FsZV9udW1lcmljKiBfU1RMUF9DQUxMIF9fYWNxdWlyZV9udW1lcmljKGNvbnN0IGNoYXIqICZuYW1lLCBjaGFyICpidWYsIF9Mb2NhbGVfbmFtZV9oaW50KiBoaW50LCBpbnQgKl9fZXJyX2NvZGUpOworX0xvY2FsZV9jb2xsYXRlKiBfU1RMUF9DQUxMIF9fYWNxdWlyZV9jb2xsYXRlKGNvbnN0IGNoYXIqICZuYW1lLCBjaGFyICpidWYsIF9Mb2NhbGVfbmFtZV9oaW50KiBoaW50LCBpbnQgKl9fZXJyX2NvZGUpOworX0xvY2FsZV9tb25ldGFyeSogX1NUTFBfQ0FMTCBfX2FjcXVpcmVfbW9uZXRhcnkoY29uc3QgY2hhciogJm5hbWUsIGNoYXIgKmJ1ZiwgX0xvY2FsZV9uYW1lX2hpbnQqIGhpbnQsIGludCAqX19lcnJfY29kZSk7CitfTG9jYWxlX3RpbWUqIF9TVExQX0NBTEwgX19hY3F1aXJlX3RpbWUoY29uc3QgY2hhciogJm5hbWUsIGNoYXIgKmJ1ZiwgX0xvY2FsZV9uYW1lX2hpbnQqLCBpbnQgKl9fZXJyX2NvZGUpOworX0xvY2FsZV9tZXNzYWdlcyogX1NUTFBfQ0FMTCBfX2FjcXVpcmVfbWVzc2FnZXMoY29uc3QgY2hhciogJm5hbWUsIGNoYXIgKmJ1ZiwgX0xvY2FsZV9uYW1lX2hpbnQqIGhpbnQsIGludCAqX19lcnJfY29kZSk7CisKK3ZvaWQgX1NUTFBfQ0FMTCBfX3JlbGVhc2VfY3R5cGUoX0xvY2FsZV9jdHlwZSogY2F0KTsKK3ZvaWQgX1NUTFBfQ0FMTCBfX3JlbGVhc2VfY29kZWN2dChfTG9jYWxlX2NvZGVjdnQqIGNhdCk7Cit2b2lkIF9TVExQX0NBTEwgX19yZWxlYXNlX251bWVyaWMoX0xvY2FsZV9udW1lcmljKiBjYXQpOwordm9pZCBfU1RMUF9DQUxMIF9fcmVsZWFzZV9jb2xsYXRlKF9Mb2NhbGVfY29sbGF0ZSogY2F0KTsKK3ZvaWQgX1NUTFBfQ0FMTCBfX3JlbGVhc2VfbW9uZXRhcnkoX0xvY2FsZV9tb25ldGFyeSogY2F0KTsKK3ZvaWQgX1NUTFBfQ0FMTCBfX3JlbGVhc2VfdGltZShfTG9jYWxlX3RpbWUqIF9fdGltZSk7Cit2b2lkIF9TVExQX0NBTEwgX19yZWxlYXNlX21lc3NhZ2VzKF9Mb2NhbGVfbWVzc2FnZXMqIGNhdCk7CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLyogQUNRVUlSRV9SRUxFQVNFX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9hbGlnbmVkX2J1ZmZlci5oIGIvc3JjL2FsaWduZWRfYnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZmNmNhNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9hbGlnbmVkX2J1ZmZlci5oCkBAIC0wLDAgKzEsMjEgQEAKKyNpZm5kZWYgQUxJR05FRF9CVUZGRVJfSAorI2RlZmluZSBBTElHTkVEX0JVRkZFUl9ICisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorLy8gdGhpcyBpcyBmb3IgZmFrZSBpbml0aWFsaXphdGlvbgordGVtcGxhdGU8Y2xhc3MgVD4KK3VuaW9uIF9TdGxfYWxpZ25lZF9idWZmZXIgeworICBjaGFyIGJ1ZltzaXplb2YoVCldOworICBzdHJ1Y3QgeyBkb3VibGUgYTsgZG91YmxlIGI7IH0gcGFkZGluZzsKKworICBUKiBvcGVyYXRvciYoKSB7CisgICAgcmV0dXJuIF9fUkVJTlRFUlBSRVRfQ0FTVChUKiwgdGhpcyk7CisgIH0KKworICBUIGNvbnN0KiBvcGVyYXRvciYoKSBjb25zdCB7CisgICAgcmV0dXJuIF9fUkVJTlRFUlBSRVRfQ0FTVChUIGNvbnN0KiwgdGhpcyk7CisgIH0KK307CitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2FsbG9jYXRvcnMuY3BwIGIvc3JjL2FsbG9jYXRvcnMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYmNjYTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYWxsb2NhdG9ycy5jcHAKQEAgLTAsMCArMSwxMTIxIEBACisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaW5jbHVkZSAic3RscG9ydF9wcmVmaXguaCIKKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2lmIGRlZmluZWQgKF9fR05VQ19fKSAmJiAoZGVmaW5lZCAoX19DWUdXSU5fXykgfHwgZGVmaW5lZCAoX19NSU5HVzMyX18pKQorIyAgaW5jbHVkZSA8bWFsbG9jLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX1BUSFJFQURTKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fVEhSRUFEUykKKyMgIGluY2x1ZGUgPHB0aHJlYWRfYWxsb2M+CisjICBpbmNsdWRlIDxjZXJybm8+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0bC9fdGhyZWFkcy5oPgorCisjaW5jbHVkZSAibG9ja19mcmVlX3NsaXN0LmgiCisKKyNpZiBkZWZpbmVkIChfX1dBVENPTUNfXykKKyMgIHByYWdtYSB3YXJuaW5nIDEzIDkKKyMgIHByYWdtYSB3YXJuaW5nIDM2NyA5CisjICBwcmFnbWEgd2FybmluZyAzNjggOQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9TR0lfVEhSRUFEUykKKyAgLy8gV2UgdGVzdCB3aGV0aGVyIHRocmVhZHMgYXJlIGluIHVzZSBiZWZvcmUgbG9ja2luZy4KKyAgLy8gUGVyaGFwcyB0aGlzIHNob3VsZCBiZSBtb3ZlZCBpbnRvIHN0bF90aHJlYWRzLmgsIGJ1dCB0aGF0CisgIC8vIHByb2JhYmx5IG1ha2VzIGl0IGhhcmRlciB0byBhdm9pZCB0aGUgcHJvY2VkdXJlIGNhbGwgd2hlbgorICAvLyBpdCBpc24ndCBuZWVkZWQuCitleHRlcm4gIkMiIHsKKyAgZXh0ZXJuIGludCBfX3VzX3JzdGhyZWFkX21hbGxvYzsKK30KKyNlbmRpZgorCisvLyBTcGVjaWFsaXNlZCBkZWJ1ZyBmb3JtIG9mIG5ldyBvcGVyYXRvciB3aGljaCBkb2VzIG5vdCBwcm92aWRlICJmYWxzZSIKKy8vIG1lbW9yeSBsZWFrcyB3aGVuIHJ1biB3aXRoIGRlYnVnIENSVCBsaWJyYXJpZXMuCisjaWYgZGVmaW5lZCAoX1NUTFBfTVNWQykgJiYgKF9TVExQX01TVkMgPj0gMTAyMCAmJiBkZWZpbmVkIChfU1RMUF9ERUJVR19BTExPQykpICYmICFkZWZpbmVkIChfU1RMUF9XQ0UpCisjICBpbmNsdWRlIDxjcnRkYmcuaD4KK2lubGluZSBjaGFyKiBfX3N0bHBfbmV3X2NodW5rKHNpemVfdCBfX2J5dGVzKSB7CisgIHZvaWQgKl9fY2h1bmsgPSBfU1RMUF9DSEVDS19OVUxMX0FMTE9DKDo6b3BlcmF0b3IgbmV3KF9fYnl0ZXMsIF9fRklMRV9fLCBfX0xJTkVfXykpOworICByZXR1cm4gX19TVEFUSUNfQ0FTVChjaGFyKiwgX19jaHVuayk7Cit9CitpbmxpbmUgdm9pZCBfX3N0bHBfZGVsZXRlX2NodW5jayh2b2lkKiBfX3ApIHsgOjpvcGVyYXRvciBkZWxldGUoX19wLCBfX0ZJTEVfXywgX19MSU5FX18pOyB9CisjZWxzZQorIyAgaWZkZWYgX1NUTFBfTk9ERV9BTExPQ19VU0VfTUFMTE9DCisjICAgIGluY2x1ZGUgPGNzdGRsaWI+CitpbmxpbmUgY2hhciogX19zdGxwX25ld19jaHVuayhzaXplX3QgX19ieXRlcykgeworICAvLyBkbyBub3QgdXNlIF9TVExQX0NIRUNLX05VTExfQUxMT0MsIHRoaXMgbWFjcm8gaXMgZGVkaWNhdGVkIHRvIG5ldyBvcGVyYXRvci4KKyAgdm9pZCAqX19jaHVuayA9IF9TVExQX1ZFTkRPUl9DU1REOjptYWxsb2MoX19ieXRlcyk7CisgIGlmIChfX2NodW5rID09IDApIHsKKyAgICBfU1RMUF9USFJPV19CQURfQUxMT0M7CisgIH0KKyAgcmV0dXJuIF9fU1RBVElDX0NBU1QoY2hhciosIF9fY2h1bmspOworfQoraW5saW5lIHZvaWQgX19zdGxwX2RlbGV0ZV9jaHVuY2sodm9pZCogX19wKSB7IF9TVExQX1ZFTkRPUl9DU1REOjpmcmVlKF9fcCk7IH0KKyMgIGVsc2UKK2lubGluZSBjaGFyKiBfX3N0bHBfbmV3X2NodW5rKHNpemVfdCBfX2J5dGVzKQoreyByZXR1cm4gX19TVEFUSUNfQ0FTVChjaGFyKiwgX1NUTFBfU1REOjpfX3N0bF9uZXcoX19ieXRlcykpOyB9CitpbmxpbmUgdm9pZCBfX3N0bHBfZGVsZXRlX2NodW5jayh2b2lkKiBfX3ApIHsgX1NUTFBfU1REOjpfX3N0bF9kZWxldGUoX19wKTsgfQorIyAgZW5kaWYKKyNlbmRpZgorCisvKiBUaGlzIGlzIGFuIGFkZGl0aW9uYWwgYXRvbWljIG9wZXJhdGlvbnMgdG8gdGhlIG9uZXMgYWxyZWFkeSBkZWZpbmVkIGluCisgKiBzdGwvX3RocmVhZHMuaCwgcGxhdGZvcm0gc2hvdWxkIHRyeSB0byBzdXBwb3J0IGl0IHRvIGltcHJvdmUgcGVyZm9ybWFuY2UuCisgKiBfX2FkZF9hdG9taWNfdCBfU1RMUF9BVE9NSUNfQUREKHZvbGF0aWxlIF9fYWRkX2F0b21pY190KiBfX3RhcmdldCwgX19hZGRfYXRvbWljX3QgX192YWwpIDoKKyAqIGRvZXMgKl9fdGFyZ2V0ID0gKl9fdGFyZ2V0ICsgX192YWwgYW5kIHJldHVybnMgdGhlIG9sZCAqX190YXJnZXQgdmFsdWUgKi8KK3R5cGVkZWYgbG9uZyBfX2FkZF9hdG9taWNfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBfX3VhZGRfYXRvbWljX3Q7CisKKyNpZiBkZWZpbmVkIChfX0dOVUNfXykgJiYgZGVmaW5lZCAoX19pMzg2X18pCitpbmxpbmUgbG9uZyBfU1RMUF9hdG9taWNfYWRkX2djY194ODYobG9uZyB2b2xhdGlsZSogcCwgbG9uZyBhZGRlbmQpIHsKKyAgbG9uZyByZXN1bHQ7CisgIF9fYXNtX18gX192b2xhdGlsZV9fCisgICAgKCJsb2NrOyB4YWRkbCAlMSwgJTA7IgorICAgIDoiPW0iICgqcCksICI9ciIgKHJlc3VsdCkKKyAgICA6Im0iICAoKnApLCAiMSIgIChhZGRlbmQpCisgICAgOiJjYyIpOworIHJldHVybiByZXN1bHQgKyBhZGRlbmQ7Cit9CisjICBkZWZpbmUgX1NUTFBfQVRPTUlDX0FERChfX2RzdCwgX192YWwpICBfU1RMUF9hdG9taWNfYWRkX2djY194ODYoX19kc3QsIF9fdmFsKQorI2VsaWYgZGVmaW5lZCAoX1NUTFBfV0lOMzJUSFJFQURTKQorLy8gVGhlIFdpbjMyIEFQSSBmdW5jdGlvbiBJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkIGlzIG5vdCBhdmFpbGFibGUgb24gV2luZG93cyA5NS4KKyMgIGlmICFkZWZpbmVkIChfU1RMUF9XSU45NV9MSUtFKQorIyAgICBpZiBkZWZpbmVkIChfU1RMUF9ORVdfUExBVEZPUk1fU0RLKQorIyAgICAgIGRlZmluZSBfU1RMUF9BVE9NSUNfQUREKF9fZHN0LCBfX3ZhbCkgSW50ZXJsb2NrZWRFeGNoYW5nZUFkZChfX2RzdCwgX192YWwpCisjICAgIGVsc2UKKyMgICAgICBkZWZpbmUgX1NUTFBfQVRPTUlDX0FERChfX2RzdCwgX192YWwpIEludGVybG9ja2VkRXhjaGFuZ2VBZGQoX19DT05TVF9DQVNUKF9fYWRkX2F0b21pY190KiwgX19kc3QpLCBfX3ZhbCkKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fT1M0MDBfXykKKy8vIGR1bXMgMDIvMDUvMjAwNzogaXMgaXQgcmVhbGx5IG5lY2Vzc2FyeSA/CitlbnVtIHsgX0FMSUdOID0gMTYsIF9BTElHTl9TSElGVCA9IDQgfTsKKyNlbHNlCitlbnVtIHsgX0FMSUdOID0gMiAqIHNpemVvZih2b2lkKiksIF9BTElHTl9TSElGVCA9IDIgKyBzaXplb2Yodm9pZCopIC8gNCB9OworI2VuZGlmCisKKyNkZWZpbmUgX1NfRlJFRUxJU1RfSU5ERVgoX19ieXRlcykgKChfX2J5dGVzIC0gc2l6ZV90KDEpKSA+PiAoaW50KV9BTElHTl9TSElGVCkKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKKy8vIG1hbGxvY19hbGxvYyBvdXQtb2YtbWVtb3J5IGhhbmRsaW5nCitzdGF0aWMgX19vb21faGFuZGxlcl90eXBlIF9fb29tX2hhbmRsZXIgPSBfX1NUQVRJQ19DQVNUKF9fb29tX2hhbmRsZXJfdHlwZSwgMCk7CisKKyNpZmRlZiBfU1RMUF9USFJFQURTCitfU1RMUF9tdXRleCBfX29vbV9oYW5kbGVyX2xvY2s7CisjZW5kaWYKKwordm9pZCogX1NUTFBfQ0FMTCBfX21hbGxvY19hbGxvYzo6YWxsb2NhdGUoc2l6ZV90IF9fbikKK3sKKyAgdm9pZCAqX19yZXN1bHQgPSBtYWxsb2MoX19uKTsKKyAgaWYgKCAwID09IF9fcmVzdWx0ICkgeworICAgIF9fb29tX2hhbmRsZXJfdHlwZSBfX215X21hbGxvY19oYW5kbGVyOworCisgICAgZm9yICg7OykgeworICAgICAgeworI2lmZGVmIF9TVExQX1RIUkVBRFMKKyAgICAgICAgX1NUTFBfYXV0b19sb2NrIF9sKCBfX29vbV9oYW5kbGVyX2xvY2sgKTsKKyNlbmRpZgorICAgICAgICBfX215X21hbGxvY19oYW5kbGVyID0gX19vb21faGFuZGxlcjsKKyAgICAgIH0KKyAgICAgIGlmICggMCA9PSBfX215X21hbGxvY19oYW5kbGVyKSB7CisgICAgICAgIF9TVExQX1RIUk9XX0JBRF9BTExPQzsKKyAgICAgIH0KKyAgICAgICgqX19teV9tYWxsb2NfaGFuZGxlcikoKTsKKyAgICAgIF9fcmVzdWx0ID0gbWFsbG9jKF9fbik7CisgICAgICBpZiAoIF9fcmVzdWx0ICkKKyAgICAgICAgcmV0dXJuIF9fcmVzdWx0OworICAgIH0KKyAgfQorICByZXR1cm4gX19yZXN1bHQ7Cit9CisKK19fb29tX2hhbmRsZXJfdHlwZSBfU1RMUF9DQUxMIF9fbWFsbG9jX2FsbG9jOjpzZXRfbWFsbG9jX2hhbmRsZXIoX19vb21faGFuZGxlcl90eXBlIF9fZikKK3sKKyNpZmRlZiBfU1RMUF9USFJFQURTCisgIF9TVExQX2F1dG9fbG9jayBfbCggX19vb21faGFuZGxlcl9sb2NrICk7CisjZW5kaWYKKyAgX19vb21faGFuZGxlcl90eXBlIF9fb2xkID0gX19vb21faGFuZGxlcjsKKyAgX19vb21faGFuZGxlciA9IF9fZjsKKyAgcmV0dXJuIF9fb2xkOworfQorCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBEZWZhdWx0IG5vZGUgYWxsb2NhdG9yLgorLy8gV2l0aCBhIHJlYXNvbmFibGUgY29tcGlsZXIsIHRoaXMgc2hvdWxkIGJlIHJvdWdobHkgYXMgZmFzdCBhcyB0aGUKKy8vIG9yaWdpbmFsIFNUTCBjbGFzcy1zcGVjaWZpYyBhbGxvY2F0b3JzLCBidXQgd2l0aCBsZXNzIGZyYWdtZW50YXRpb24uCisvLworLy8gSW1wb3J0YW50IGltcGxlbWVudGF0aW9uIHByb3BlcnRpZXM6CisvLyAxLiBJZiB0aGUgY2xpZW50IHJlcXVlc3QgYW4gb2JqZWN0IG9mIHNpemUgPiBfTUFYX0JZVEVTLCB0aGUgcmVzdWx0aW5nCisvLyAgICBvYmplY3Qgd2lsbCBiZSBvYnRhaW5lZCBkaXJlY3RseSBmcm9tIG1hbGxvYy4KKy8vIDIuIEluIGFsbCBvdGhlciBjYXNlcywgd2UgYWxsb2NhdGUgYW4gb2JqZWN0IG9mIHNpemUgZXhhY3RseQorLy8gICAgX1Nfcm91bmRfdXAocmVxdWVzdGVkX3NpemUpLiAgVGh1cyB0aGUgY2xpZW50IGhhcyBlbm91Z2ggc2l6ZQorLy8gICAgaW5mb3JtYXRpb24gdGhhdCB3ZSBjYW4gcmV0dXJuIHRoZSBvYmplY3QgdG8gdGhlIHByb3BlciBmcmVlIGxpc3QKKy8vICAgIHdpdGhvdXQgcGVybWFuZW50bHkgbG9zaW5nIHBhcnQgb2YgdGhlIG9iamVjdC4KKy8vCisKKyNkZWZpbmUgX1NUTFBfTkZSRUVMSVNUUyAxNgorCisjaWYgZGVmaW5lZCAoX1NUTFBfTEVBS1NfUEVEQU5USUMpICYmIGRlZmluZWQgKF9TVExQX1VTRV9EWU5BTUlDX0xJQikKKy8qCisgKiBXZSBjYW4gb25seSBkbyBjbGVhbnVwIG9mIHRoZSBub2RlIGFsbG9jYXRvciBtZW1vcnkgcG9vbCBpZiB3ZSBhcmUKKyAqIHN1cmUgdGhhdCB0aGUgU1RMcG9ydCBsaWJyYXJ5IGlzIHVzZWQgYXMgYSBzaGFyZWQgb25lIGFzIGl0IGd1YXJhbnRpZXMKKyAqIHRoZSB1bmljaXR5IG9mIHRoZSBub2RlIGFsbG9jYXRvciBpbnN0YW5jZS4gV2l0aG91dCB0aGF0IGd1YXJhbnR5IG5vZGUKKyAqIGFsbG9jYXRvciBpbnN0YW5jZXMgbWlnaHQgZXhjaGFuZ2UgbWVtb3J5IGJsb2NrcyBtYWtpbmcgdGhlIGltcGxlbWVudGF0aW9uCisgKiBvZiBhIGNsZWFuaW5nIHByb2Nlc3MgbXVjaCBtb3JlIGNvbXBsaWNhdGVkLgorICovCisjICBkZWZpbmUgX1NUTFBfRE9fQ0xFQU5fTk9ERV9BTExPQworI2VuZGlmCisKKy8qIFdoZW4gU1RMcG9ydCBpcyB1c2VkIHdpdGhvdXQgbXVsdGkgdGhyZWFkZWQgc2FmZXR5IHdlIHVzZSB0aGUgbm9kZSBhbGxvY2F0b3IKKyAqIGltcGxlbWVudGF0aW9uIHdpdGggbG9ja3MgYXMgbG9ja3MgYmVjb21lcyBuby1vcC4gVGhlIGxvY2sgZnJlZSBpbXBsZW1lbnRhdGlvbgorICogYWx3YXlzIHVzZSBzeXN0ZW0gc3BlY2lmaWMgYXRvbWljIG9wZXJhdGlvbnMgd2hpY2ggYXJlIHNsb3dlciB0aGFuICdub3JtYWwnCisgKiBvbmVzLgorICovCisjaWYgZGVmaW5lZCAoX1NUTFBfVEhSRUFEUykgJiYgXAorICAgIGRlZmluZWQgKF9TVExQX0hBU19BVE9NSUNfRlJFRUxJU1QpICYmIGRlZmluZWQgKF9TVExQX0FUT01JQ19BREQpCisvKgorICogV2UgaGF2ZSBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYXRvbWljIGZyZWVsaXN0IChfU1RMUF9hdG9taWNfZnJlZWxpc3QpCisgKiBmb3IgdGhpcyBhcmNoaXRlY3R1cmUgYW5kIGNvbXBpbGVyLiAgVGhhdCBtZWFucyB3ZSBjYW4gdXNlIHRoZSBub24tYmxvY2tpbmcKKyAqIGltcGxlbWVudGF0aW9uIG9mIHRoZSBub2RlLWFsbG9jYXRpb24gZW5naW5lLiovCisjICBkZWZpbmUgX1NUTFBfVVNFX0xPQ0tfRlJFRV9JTVBMRU1FTlRBVElPTgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX0xPQ0tfRlJFRV9JTVBMRU1FTlRBVElPTikKKyMgIGlmIGRlZmluZWQgKF9TVExQX1RIUkVBRFMpCisKK2NsYXNzIF9Ob2RlX0FsbG9jX0xvY2sgeworICBzdGF0aWMgX1NUTFBfU1RBVElDX01VVEVYJiBfU19NdXRleCgpIHsKKyAgICBzdGF0aWMgX1NUTFBfU1RBVElDX01VVEVYIG11dGV4IF9TVExQX01VVEVYX0lOSVRJQUxJWkVSOworICAgIHJldHVybiBtdXRleDsKKyAgfQorcHVibGljOgorICBfTm9kZV9BbGxvY19Mb2NrKCkgeworIyAgICBpZiBkZWZpbmVkIChfU1RMUF9TR0lfVEhSRUFEUykKKyAgICBpZiAoX191c19yc3RocmVhZF9tYWxsb2MpCisjICAgIGVuZGlmCisgICAgICBfU19NdXRleCgpLl9NX2FjcXVpcmVfbG9jaygpOworICB9CisKKyAgfl9Ob2RlX0FsbG9jX0xvY2soKSB7CisjICAgIGlmIGRlZmluZWQgKF9TVExQX1NHSV9USFJFQURTKQorICAgIGlmIChfX3VzX3JzdGhyZWFkX21hbGxvYykKKyMgICAgZW5kaWYKKyAgICAgIF9TX011dGV4KCkuX01fcmVsZWFzZV9sb2NrKCk7CisgIH0KK307CisKKyMgIGVsc2UKKworY2xhc3MgX05vZGVfQWxsb2NfTG9jayB7CitwdWJsaWM6CisgIF9Ob2RlX0FsbG9jX0xvY2soKSB7IH0KKyAgfl9Ob2RlX0FsbG9jX0xvY2soKSB7IH0KK307CisKKyMgIGVuZGlmCisKK3N0cnVjdCBfTm9kZV9hbGxvY19vYmogeworICBfTm9kZV9hbGxvY19vYmogKiBfTV9uZXh0OworfTsKKyNlbmRpZgorCitjbGFzcyBfX25vZGVfYWxsb2NfaW1wbCB7CisgIHN0YXRpYyBpbmxpbmUgc2l6ZV90IF9TVExQX0NBTEwgX1Nfcm91bmRfdXAoc2l6ZV90IF9fYnl0ZXMpCisgIHsgcmV0dXJuICgoKF9fYnl0ZXMpICsgKHNpemVfdClfQUxJR04tMSkgJiB+KChzaXplX3QpX0FMSUdOIC0gMSkpOyB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfTE9DS19GUkVFX0lNUExFTUVOVEFUSU9OKQorICB0eXBlZGVmIF9TVExQX2F0b21pY19mcmVlbGlzdDo6aXRlbSAgIF9PYmo7CisgIHR5cGVkZWYgX1NUTFBfYXRvbWljX2ZyZWVsaXN0ICAgICAgICAgX0ZyZWVsaXN0OworICB0eXBlZGVmIF9TVExQX2F0b21pY19mcmVlbGlzdCAgICAgICAgIF9DaHVua0xpc3Q7CisKKyAgLy8gSGVhZGVyIG9mIGJsb2NrcyBvZiBtZW1vcnkgdGhhdCBoYXZlIGJlZW4gYWxsb2NhdGVkIGFzIHBhcnQgb2YKKyAgLy8gYSBsYXJnZXIgY2h1bmsgYnV0IGhhdmUgbm90IHlldCBiZWVuIGNob3BwZWQgdXAgaW50byBub2Rlcy4KKyAgc3RydWN0IF9GcmVlQmxvY2tIZWFkZXIgOiBwdWJsaWMgX1NUTFBfYXRvbWljX2ZyZWVsaXN0OjppdGVtIHsKKyAgICBjaGFyKiBfTV9lbmQ7ICAgICAvLyBwb2ludGVyIHRvIGVuZCBvZiBmcmVlIG1lbW9yeQorICB9OworI2Vsc2UKKyAgdHlwZWRlZiBfTm9kZV9hbGxvY19vYmogICAgICAgX09iajsKKyAgdHlwZWRlZiBfT2JqKiBfU1RMUF9WT0xBVElMRSAgX0ZyZWVsaXN0OworICB0eXBlZGVmIF9PYmoqICAgICAgICAgICAgICAgICBfQ2h1bmtMaXN0OworI2VuZGlmCisKK3ByaXZhdGU6CisgIC8vIFJldHVybnMgYW4gb2JqZWN0IG9mIHNpemUgX19uLCBhbmQgb3B0aW9uYWxseSBhZGRzIHRvIHNpemUgX19uIGZyZWUgbGlzdC4KKyAgc3RhdGljIF9PYmoqIF9TX3JlZmlsbChzaXplX3QgX19uKTsKKyAgLy8gQWxsb2NhdGVzIGEgY2h1bmsgZm9yIG5vYmpzIG9mIHNpemUgX19wX3NpemUuICBub2JqcyBtYXkgYmUgcmVkdWNlZAorICAvLyBpZiBpdCBpcyBpbmNvbnZlbmllbnQgdG8gYWxsb2NhdGUgdGhlIHJlcXVlc3RlZCBudW1iZXIuCisgIHN0YXRpYyBjaGFyKiBfU19jaHVua19hbGxvYyhzaXplX3QgX19wX3NpemUsIGludCYgX19ub2Jqcyk7CisgIC8vIENodW5rIGFsbG9jYXRpb24gc3RhdGUuCisgIHN0YXRpYyBfRnJlZWxpc3QgX1NfZnJlZV9saXN0W19TVExQX05GUkVFTElTVFNdOworICAvLyBBbW91bnQgb2YgdG90YWwgYWxsb2NhdGVkIG1lbW9yeQorI2lmIGRlZmluZWQgKF9TVExQX1VTRV9MT0NLX0ZSRUVfSU1QTEVNRU5UQVRJT04pCisgIHN0YXRpYyBfU1RMUF9WT0xBVElMRSBfX2FkZF9hdG9taWNfdCBfU19oZWFwX3NpemU7CisjZWxzZQorICBzdGF0aWMgc2l6ZV90IF9TX2hlYXBfc2l6ZTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX0xPQ0tfRlJFRV9JTVBMRU1FTlRBVElPTikKKyAgLy8gTGlzdCBvZiBibG9ja3Mgb2YgZnJlZSBtZW1vcnkKKyAgc3RhdGljIF9TVExQX2F0b21pY19mcmVlbGlzdCAgX1NfZnJlZV9tZW1fYmxvY2tzOworI2Vsc2UKKyAgLy8gU3RhcnQgb2YgdGhlIGN1cnJlbnQgZnJlZSBtZW1vcnkgYnVmZmVyCisgIHN0YXRpYyBjaGFyKiBfU19zdGFydF9mcmVlOworICAvLyBFbmQgb2YgdGhlIGN1cnJlbnQgZnJlZSBtZW1vcnkgYnVmZmVyCisgIHN0YXRpYyBjaGFyKiBfU19lbmRfZnJlZTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfRE9fQ0xFQU5fTk9ERV9BTExPQykKK3B1YmxpYzoKKyAgLy8gTWV0aG9kcyB0byByZXBvcnQgYWxsb2MvZGVhbGxvYyBjYWxscyB0byB0aGUgY291bnRlciBzeXN0ZW0uCisjICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfTE9DS19GUkVFX0lNUExFTUVOVEFUSU9OKQorICB0eXBlZGVmIF9TVExQX1ZPTEFUSUxFIF9fc3RsX2F0b21pY190IF9BbGxvY0NvdW50ZXI7CisjICBlbHNlCisgIHR5cGVkZWYgX19zdGxfYXRvbWljX3QgX0FsbG9jQ291bnRlcjsKKyMgIGVuZGlmCisgIHN0YXRpYyBfQWxsb2NDb3VudGVyJiBfU1RMUF9DQUxMIF9TX2FsbG9jX2NvdW50ZXIoKTsKKyAgc3RhdGljIHZvaWQgX1NfYWxsb2NfY2FsbCgpOworICBzdGF0aWMgdm9pZCBfU19kZWFsbG9jX2NhbGwoKTsKKworcHJpdmF0ZToKKyAgLy8gRnJlZSBhbGwgdGhlIGFsbG9jYXRlZCBjaHVuY2tzIG9mIG1lbW9yeQorICBzdGF0aWMgdm9pZCBfU19jaHVua19kZWFsbG9jKCk7CisgIC8vIEJlZ2lubmluZyBvZiB0aGUgbGlua2VkIGxpc3Qgb2YgYWxsb2NhdGVkIGNodW5rcyBvZiBtZW1vcnkKKyAgc3RhdGljIF9DaHVua0xpc3QgX1NfY2h1bmtzOworI2VuZGlmIC8qIF9TVExQX0RPX0NMRUFOX05PREVfQUxMT0MgKi8KKworcHVibGljOgorICAvKiBfX24gbXVzdCBiZSA+IDAgICAgICAqLworICBzdGF0aWMgdm9pZCogX01fYWxsb2NhdGUoc2l6ZV90JiBfX24pOworICAvKiBfX3AgbWF5IG5vdCBiZSAwICovCisgIHN0YXRpYyB2b2lkIF9NX2RlYWxsb2NhdGUodm9pZCAqX19wLCBzaXplX3QgX19uKTsKK307CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX0xPQ0tfRlJFRV9JTVBMRU1FTlRBVElPTikKK3ZvaWQqIF9fbm9kZV9hbGxvY19pbXBsOjpfTV9hbGxvY2F0ZShzaXplX3QmIF9fbikgeworICBfX24gPSBfU19yb3VuZF91cChfX24pOworICBfT2JqICogX1NUTFBfVk9MQVRJTEUgKiBfX215X2ZyZWVfbGlzdCA9IF9TX2ZyZWVfbGlzdCArIF9TX0ZSRUVMSVNUX0lOREVYKF9fbik7CisgIF9PYmogKl9fcjsKKworICAvLyBBY3F1aXJlIHRoZSBsb2NrIGhlcmUgd2l0aCBhIGNvbnN0cnVjdG9yIGNhbGwuCisgIC8vIFRoaXMgZW5zdXJlcyB0aGF0IGl0IGlzIHJlbGVhc2VkIGluIGV4aXQgb3IgZHVyaW5nIHN0YWNrCisgIC8vIHVud2luZGluZy4KKyAgX05vZGVfQWxsb2NfTG9jayBfX2xvY2tfaW5zdGFuY2U7CisKKyAgaWYgKCAoX19yICA9ICpfX215X2ZyZWVfbGlzdCkgIT0gMCApIHsKKyAgICAqX19teV9mcmVlX2xpc3QgPSBfX3ItPl9NX25leHQ7CisgIH0gZWxzZSB7CisgICAgX19yID0gX1NfcmVmaWxsKF9fbik7CisgIH0KKyMgIGlmIGRlZmluZWQgKF9TVExQX0RPX0NMRUFOX05PREVfQUxMT0MpCisgIF9TX2FsbG9jX2NhbGwoKTsKKyMgIGVuZGlmCisgIC8vIGxvY2sgaXMgcmVsZWFzZWQgaGVyZQorICByZXR1cm4gX19yOworfQorCit2b2lkIF9fbm9kZV9hbGxvY19pbXBsOjpfTV9kZWFsbG9jYXRlKHZvaWQgKl9fcCwgc2l6ZV90IF9fbikgeworICBfT2JqICogX1NUTFBfVk9MQVRJTEUgKiBfX215X2ZyZWVfbGlzdCA9IF9TX2ZyZWVfbGlzdCArIF9TX0ZSRUVMSVNUX0lOREVYKF9fbik7CisgIF9PYmogKiBfX3BvYmogPSBfX1NUQVRJQ19DQVNUKF9PYmoqLCBfX3ApOworCisgIC8vIGFjcXVpcmUgbG9jaworICBfTm9kZV9BbGxvY19Mb2NrIF9fbG9ja19pbnN0YW5jZTsKKyAgX19wb2JqLT5fTV9uZXh0ID0gKl9fbXlfZnJlZV9saXN0OworICAqX19teV9mcmVlX2xpc3QgPSBfX3BvYmo7CisKKyMgIGlmIGRlZmluZWQgKF9TVExQX0RPX0NMRUFOX05PREVfQUxMT0MpCisgIF9TX2RlYWxsb2NfY2FsbCgpOworIyAgZW5kaWYKKyAgLy8gbG9jayBpcyByZWxlYXNlZCBoZXJlCit9CisKKyMgIGlmIGRlZmluZWQgKF9TVExQX0RPX0NMRUFOX05PREVfQUxMT0MpCisjICAgIGRlZmluZSBfU1RMUF9PRkZTRVQgc2l6ZW9mKF9PYmopCisjICBlbHNlCisjICAgIGRlZmluZSBfU1RMUF9PRkZTRVQgMAorIyAgZW5kaWYKKworLyogV2UgYWxsb2NhdGUgbWVtb3J5IGluIGxhcmdlIGNodW5rcyBpbiBvcmRlciB0byBhdm9pZCBmcmFnbWVudGluZyAgICAgKi8KKy8qIHRoZSBtYWxsb2MgaGVhcCB0b28gbXVjaC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBXZSBhc3N1bWUgdGhhdCBzaXplIGlzIHByb3Blcmx5IGFsaWduZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogV2UgaG9sZCB0aGUgYWxsb2NhdGlvbiBsb2NrLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK2NoYXIqIF9fbm9kZV9hbGxvY19pbXBsOjpfU19jaHVua19hbGxvYyhzaXplX3QgX3Bfc2l6ZSwgaW50JiBfX25vYmpzKSB7CisgIGNoYXIqIF9fcmVzdWx0OworICBzaXplX3QgX190b3RhbF9ieXRlcyA9IF9wX3NpemUgKiBfX25vYmpzOworICBzaXplX3QgX19ieXRlc19sZWZ0ID0gX1NfZW5kX2ZyZWUgLSBfU19zdGFydF9mcmVlOworCisgIGlmIChfX2J5dGVzX2xlZnQgPiAwKSB7CisgICAgaWYgKF9fYnl0ZXNfbGVmdCA+PSBfX3RvdGFsX2J5dGVzKSB7CisgICAgICBfX3Jlc3VsdCA9IF9TX3N0YXJ0X2ZyZWU7CisgICAgICBfU19zdGFydF9mcmVlICs9IF9fdG90YWxfYnl0ZXM7CisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorCisgICAgaWYgKF9fYnl0ZXNfbGVmdCA+PSBfcF9zaXplKSB7CisgICAgICBfX25vYmpzID0gKGludCkoX19ieXRlc19sZWZ0IC8gX3Bfc2l6ZSk7CisgICAgICBfX3RvdGFsX2J5dGVzID0gX3Bfc2l6ZSAqIF9fbm9ianM7CisgICAgICBfX3Jlc3VsdCA9IF9TX3N0YXJ0X2ZyZWU7CisgICAgICBfU19zdGFydF9mcmVlICs9IF9fdG90YWxfYnl0ZXM7CisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorCisgICAgLy8gVHJ5IHRvIG1ha2UgdXNlIG9mIHRoZSBsZWZ0LW92ZXIgcGllY2UuCisgICAgX09iaiogX1NUTFBfVk9MQVRJTEUqIF9fbXlfZnJlZV9saXN0ID0gX1NfZnJlZV9saXN0ICsgX1NfRlJFRUxJU1RfSU5ERVgoX19ieXRlc19sZWZ0KTsKKyAgICBfX1JFSU5URVJQUkVUX0NBU1QoX09iaiosIF9TX3N0YXJ0X2ZyZWUpLT5fTV9uZXh0ID0gKl9fbXlfZnJlZV9saXN0OworICAgICpfX215X2ZyZWVfbGlzdCA9IF9fUkVJTlRFUlBSRVRfQ0FTVChfT2JqKiwgX1Nfc3RhcnRfZnJlZSk7CisgICAgX1Nfc3RhcnRfZnJlZSA9IF9TX2VuZF9mcmVlID0gMDsKKyAgfQorCisgIHNpemVfdCBfX2J5dGVzX3RvX2dldCA9IDIgKiBfX3RvdGFsX2J5dGVzICsgX1Nfcm91bmRfdXAoX1NfaGVhcF9zaXplKSArIF9TVExQX09GRlNFVDsKKworICBfU1RMUF9UUlkgeworICAgIF9TX3N0YXJ0X2ZyZWUgPSBfX3N0bHBfbmV3X2NodW5rKF9fYnl0ZXNfdG9fZ2V0KTsKKyAgfQorI2lmIGRlZmluZWQgKF9TVExQX1VTRV9FWENFUFRJT05TKQorICBjYXRjaCAoY29uc3QgX1NUTFBfU1REOjpiYWRfYWxsb2MmKSB7CisgICAgX09iaiogX1NUTFBfVk9MQVRJTEUqIF9fbXlfZnJlZV9saXN0OworICAgIF9PYmoqIF9fcDsKKyAgICAvLyBUcnkgdG8gZG8gd2l0aCB3aGF0IHdlIGhhdmUuICBUaGF0IGNhbid0IGh1cnQuCisgICAgLy8gV2UgZG8gbm90IHRyeSBzbWFsbGVyIHJlcXVlc3RzLCBzaW5jZSB0aGF0IHRlbmRzCisgICAgLy8gdG8gcmVzdWx0IGluIGRpc2FzdGVyIG9uIG11bHRpLXByb2Nlc3MgbWFjaGluZXMuCisgICAgZm9yIChzaXplX3QgX19pID0gX3Bfc2l6ZTsgX19pIDw9IChzaXplX3QpX01BWF9CWVRFUzsgX19pICs9IChzaXplX3QpX0FMSUdOKSB7CisgICAgICBfX215X2ZyZWVfbGlzdCA9IF9TX2ZyZWVfbGlzdCArIF9TX0ZSRUVMSVNUX0lOREVYKF9faSk7CisgICAgICBfX3AgPSAqX19teV9mcmVlX2xpc3Q7CisgICAgICBpZiAoMCAhPSBfX3ApIHsKKyAgICAgICAgKl9fbXlfZnJlZV9saXN0ID0gX19wIC0+IF9NX25leHQ7CisgICAgICAgIF9TX3N0YXJ0X2ZyZWUgPSBfX1JFSU5URVJQUkVUX0NBU1QoY2hhciosIF9fcCk7CisgICAgICAgIF9TX2VuZF9mcmVlID0gX1Nfc3RhcnRfZnJlZSArIF9faTsKKyAgICAgICAgcmV0dXJuIF9TX2NodW5rX2FsbG9jKF9wX3NpemUsIF9fbm9ianMpOworICAgICAgICAvLyBBbnkgbGVmdG92ZXIgcGllY2Ugd2lsbCBldmVudHVhbGx5IG1ha2UgaXQgdG8gdGhlCisgICAgICAgIC8vIHJpZ2h0IGZyZWUgbGlzdC4KKyAgICAgIH0KKyAgICB9CisgICAgX19ieXRlc190b19nZXQgPSBfX3RvdGFsX2J5dGVzICsgX1NUTFBfT0ZGU0VUOworICAgIF9TX3N0YXJ0X2ZyZWUgPSBfX3N0bHBfbmV3X2NodW5rKF9fYnl0ZXNfdG9fZ2V0KTsKKyAgfQorI2VuZGlmCisKKyAgX1NfaGVhcF9zaXplICs9IF9fYnl0ZXNfdG9fZ2V0ID4+IDQ7CisjICBpZiBkZWZpbmVkIChfU1RMUF9ET19DTEVBTl9OT0RFX0FMTE9DKQorICBfX1JFSU5URVJQUkVUX0NBU1QoX09iaiosIF9TX3N0YXJ0X2ZyZWUpLT5fTV9uZXh0ID0gX1NfY2h1bmtzOworICBfU19jaHVua3MgPSBfX1JFSU5URVJQUkVUX0NBU1QoX09iaiosIF9TX3N0YXJ0X2ZyZWUpOworIyAgZW5kaWYKKyAgX1NfZW5kX2ZyZWUgPSBfU19zdGFydF9mcmVlICsgX19ieXRlc190b19nZXQ7CisgIF9TX3N0YXJ0X2ZyZWUgKz0gX1NUTFBfT0ZGU0VUOworICByZXR1cm4gX1NfY2h1bmtfYWxsb2MoX3Bfc2l6ZSwgX19ub2Jqcyk7Cit9CisKKy8qIFJldHVybnMgYW4gb2JqZWN0IG9mIHNpemUgX19uLCBhbmQgb3B0aW9uYWxseSBhZGRzIHRvIHNpemUgX19uIGZyZWUgbGlzdC4qLworLyogV2UgYXNzdW1lIHRoYXQgX19uIGlzIHByb3Blcmx5IGFsaWduZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBXZSBob2xkIHRoZSBhbGxvY2F0aW9uIGxvY2suICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK19Ob2RlX2FsbG9jX29iaiogX19ub2RlX2FsbG9jX2ltcGw6Ol9TX3JlZmlsbChzaXplX3QgX19uKSB7CisgIGludCBfX25vYmpzID0gMjA7CisgIGNoYXIqIF9fY2h1bmsgPSBfU19jaHVua19hbGxvYyhfX24sIF9fbm9ianMpOworCisgIGlmICgxID09IF9fbm9ianMpIHJldHVybiBfX1JFSU5URVJQUkVUX0NBU1QoX09iaiosIF9fY2h1bmspOworCisgIF9PYmoqIF9TVExQX1ZPTEFUSUxFKiBfX215X2ZyZWVfbGlzdCA9IF9TX2ZyZWVfbGlzdCArIF9TX0ZSRUVMSVNUX0lOREVYKF9fbik7CisgIF9PYmoqIF9fcmVzdWx0OworICBfT2JqKiBfX2N1cnJlbnRfb2JqOworICBfT2JqKiBfX25leHRfb2JqOworCisgIC8qIEJ1aWxkIGZyZWUgbGlzdCBpbiBjaHVuayAqLworICBfX3Jlc3VsdCA9IF9fUkVJTlRFUlBSRVRfQ0FTVChfT2JqKiwgX19jaHVuayk7CisgICpfX215X2ZyZWVfbGlzdCA9IF9fbmV4dF9vYmogPSBfX1JFSU5URVJQUkVUX0NBU1QoX09iaiosIF9fY2h1bmsgKyBfX24pOworICBmb3IgKC0tX19ub2JqczsgLS1fX25vYmpzOyApIHsKKyAgICBfX2N1cnJlbnRfb2JqID0gX19uZXh0X29iajsKKyAgICBfX25leHRfb2JqID0gX19SRUlOVEVSUFJFVF9DQVNUKF9PYmoqLCBfX1JFSU5URVJQUkVUX0NBU1QoY2hhciosIF9fbmV4dF9vYmopICsgX19uKTsKKyAgICBfX2N1cnJlbnRfb2JqLT5fTV9uZXh0ID0gX19uZXh0X29iajsKKyAgfQorICBfX25leHRfb2JqLT5fTV9uZXh0ID0gMDsKKyAgcmV0dXJuIF9fcmVzdWx0OworfQorCisjICBpZiBkZWZpbmVkIChfU1RMUF9ET19DTEVBTl9OT0RFX0FMTE9DKQordm9pZCBfX25vZGVfYWxsb2NfaW1wbDo6X1NfYWxsb2NfY2FsbCgpCit7ICsrX1NfYWxsb2NfY291bnRlcigpOyB9CisKK3ZvaWQgX19ub2RlX2FsbG9jX2ltcGw6Ol9TX2RlYWxsb2NfY2FsbCgpIHsKKyAgX19zdGxfYXRvbWljX3QgJmNvdW50ZXIgPSBfU19hbGxvY19jb3VudGVyKCk7CisgIGlmICgtLWNvdW50ZXIgPT0gMCkKKyAgeyBfU19jaHVua19kZWFsbG9jKCk7IH0KK30KKworLyogV2UgZGVhbGxvY2F0ZSBhbGwgdGhlIG1lbW9yeSBjaHVua3MgICAgICAqLwordm9pZCBfX25vZGVfYWxsb2NfaW1wbDo6X1NfY2h1bmtfZGVhbGxvYygpIHsKKyAgX09iaiAqX19wY3VyID0gX1NfY2h1bmtzLCAqX19wbmV4dDsKKyAgd2hpbGUgKF9fcGN1ciAhPSAwKSB7CisgICAgX19wbmV4dCA9IF9fcGN1ci0+X01fbmV4dDsKKyAgICBfX3N0bHBfZGVsZXRlX2NodW5jayhfX3BjdXIpOworICAgIF9fcGN1ciA9IF9fcG5leHQ7CisgIH0KKyAgX1NfY2h1bmtzID0gMDsKKyAgX1Nfc3RhcnRfZnJlZSA9IF9TX2VuZF9mcmVlID0gMDsKKyAgX1NfaGVhcF9zaXplID0gMDsKKyAgbWVtc2V0KF9fUkVJTlRFUlBSRVRfQ0FTVChjaGFyKiwgX19DT05TVF9DQVNUKF9PYmoqKiwgJl9TX2ZyZWVfbGlzdFswXSkpLCAwLCBfU1RMUF9ORlJFRUxJU1RTICogc2l6ZW9mKF9PYmoqKSk7Cit9CisjICBlbmRpZgorCisjZWxzZQorCit2b2lkKiBfX25vZGVfYWxsb2NfaW1wbDo6X01fYWxsb2NhdGUoc2l6ZV90JiBfX24pIHsKKyAgX19uID0gX1Nfcm91bmRfdXAoX19uKTsKKyAgX09iaiogX19yID0gX1NfZnJlZV9saXN0W19TX0ZSRUVMSVNUX0lOREVYKF9fbildLnBvcCgpOworICBpZiAoX19yICA9PSAwKQorICB7IF9fciA9IF9TX3JlZmlsbChfX24pOyB9CisKKyMgIGlmIGRlZmluZWQgKF9TVExQX0RPX0NMRUFOX05PREVfQUxMT0MpCisgIF9TX2FsbG9jX2NhbGwoKTsKKyMgIGVuZGlmCisgIHJldHVybiBfX3I7Cit9CisKK3ZvaWQgX19ub2RlX2FsbG9jX2ltcGw6Ol9NX2RlYWxsb2NhdGUodm9pZCAqX19wLCBzaXplX3QgX19uKSB7CisgIF9TX2ZyZWVfbGlzdFtfU19GUkVFTElTVF9JTkRFWChfX24pXS5wdXNoKF9fU1RBVElDX0NBU1QoX09iaiosIF9fcCkpOworCisjICBpZiBkZWZpbmVkIChfU1RMUF9ET19DTEVBTl9OT0RFX0FMTE9DKQorICBfU19kZWFsbG9jX2NhbGwoKTsKKyMgIGVuZGlmCit9CisKKy8qIFJldHVybnMgYW4gb2JqZWN0IG9mIHNpemUgX19uLCBhbmQgb3B0aW9uYWxseSBhZGRzIGFkZGl0aW9uYWwgb25lcyB0byAgICAqLworLyogZnJlZWxpc3Qgb2Ygb2JqZWN0cyBvZiBzaXplIF9fbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBXZSBhc3N1bWUgdGhhdCBfX24gaXMgcHJvcGVybHkgYWxpZ25lZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK19fbm9kZV9hbGxvY19pbXBsOjpfT2JqKiBfX25vZGVfYWxsb2NfaW1wbDo6X1NfcmVmaWxsKHNpemVfdCBfX24pIHsKKyAgaW50IF9fbm9ianMgPSAyMDsKKyAgY2hhciogX19jaHVuayA9IF9TX2NodW5rX2FsbG9jKF9fbiwgX19ub2Jqcyk7CisKKyAgaWYgKF9fbm9ianMgPD0gMSkKKyAgICByZXR1cm4gX19SRUlOVEVSUFJFVF9DQVNUKF9PYmoqLCBfX2NodW5rKTsKKworICAvLyBQdXNoIGFsbCBuZXcgbm9kZXMgKG1pbnVzIGZpcnN0IG9uZSkgb250byBmcmVlbGlzdAorICBfT2JqKiBfX3Jlc3VsdCAgID0gX19SRUlOVEVSUFJFVF9DQVNUKF9PYmoqLCBfX2NodW5rKTsKKyAgX09iaiogX19jdXJfaXRlbSA9IF9fcmVzdWx0OworICBfRnJlZWxpc3QqIF9fbXlfZnJlZWxpc3QgPSBfU19mcmVlX2xpc3QgKyBfU19GUkVFTElTVF9JTkRFWChfX24pOworICBmb3IgKC0tX19ub2JqczsgX19ub2JqcyAhPSAwOyAtLV9fbm9ianMpIHsKKyAgICBfX2N1cl9pdGVtICA9IF9fUkVJTlRFUlBSRVRfQ0FTVChfT2JqKiwgX19SRUlOVEVSUFJFVF9DQVNUKGNoYXIqLCBfX2N1cl9pdGVtKSArIF9fbik7CisgICAgX19teV9mcmVlbGlzdC0+cHVzaChfX2N1cl9pdGVtKTsKKyAgfQorICByZXR1cm4gX19yZXN1bHQ7Cit9CisKKyMgIGlmIGRlZmluZWQgKF9TVExQX0RPX0NMRUFOX05PREVfQUxMT0MpCisjICAgIGRlZmluZSBfU1RMUF9PRkZTRVQgX0FMSUdOCisjICBlbHNlCisjICAgIGRlZmluZSBfU1RMUF9PRkZTRVQgMAorIyAgZW5kaWYKKworLyogV2UgYWxsb2NhdGUgbWVtb3J5IGluIGxhcmdlIGNodW5rcyBpbiBvcmRlciB0byBhdm9pZCBmcmFnbWVudGluZyAgICAgKi8KKy8qIHRoZSBtYWxsb2MgaGVhcCB0b28gbXVjaC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBXZSBhc3N1bWUgdGhhdCBzaXplIGlzIHByb3Blcmx5IGFsaWduZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworY2hhciogX19ub2RlX2FsbG9jX2ltcGw6Ol9TX2NodW5rX2FsbG9jKHNpemVfdCBfcF9zaXplLCBpbnQmIF9fbm9ianMpIHsKKyMgIGlmIGRlZmluZWQgKF9TVExQX0RPX0NMRUFOX05PREVfQUxMT0MpCisgIC8vV2UgYXJlIGdvaW5nIHRvIGFkZCBhIHNtYWxsIG1lbW9yeSBibG9jayB0byBrZWVwIGFsbCB0aGUgYWxsb2NhdGVkIGJsb2NrcworICAvL2FkZHJlc3MsIHdlIG5lZWQgdG8gZG8gc28gcmVzcGVjdGluZyB0aGUgbWVtb3J5IGFsaWdubWVudC4gVGhlIGZvbGxvd2luZworICAvL3N0YXRpYyBhc3NlcnQgY2hlY2tzIHRoYXQgdGhlIHJlc2VydmVkIGJsb2NrIGlzIGJpZyBlbm91Z2ggdG8gc3RvcmUgYSBwb2ludGVyLgorICBfU1RMUF9TVEFUSUNfQVNTRVJUKHNpemVvZihfT2JqKSA8PSBfQUxJR04pCisjICBlbmRpZgorICBjaGFyKiAgX19yZXN1bHQgICAgICAgPSAwOworICBfX2FkZF9hdG9taWNfdCBfX3RvdGFsX2J5dGVzICA9IF9fU1RBVElDX0NBU1QoX19hZGRfYXRvbWljX3QsIF9wX3NpemUpICogX19ub2JqczsKKworICBfRnJlZUJsb2NrSGVhZGVyKiBfX2Jsb2NrID0gX19TVEFUSUNfQ0FTVChfRnJlZUJsb2NrSGVhZGVyKiwgX1NfZnJlZV9tZW1fYmxvY2tzLnBvcCgpKTsKKyAgaWYgKF9fYmxvY2sgIT0gMCkgeworICAgIC8vIFdlIGNoZWNrZWQgYSBibG9jayBvdXQgYW5kIGNhbiBub3cgbWVzcyB3aXRoIGl0IHdpdGggaW1wdWduaXR5LgorICAgIC8vIFdlJ2xsIHB1dCB0aGUgcmVtYWluZGVyIGJhY2sgaW50byB0aGUgbGlzdCBpZiB3ZSdyZSBkb25lIHdpdGggaXQgYmVsb3cuCisgICAgY2hhciogIF9fYnVmX3N0YXJ0ICA9IF9fUkVJTlRFUlBSRVRfQ0FTVChjaGFyKiwgX19ibG9jayk7CisgICAgX19hZGRfYXRvbWljX3QgX19ieXRlc19sZWZ0ID0gX19ibG9jay0+X01fZW5kIC0gX19idWZfc3RhcnQ7CisKKyAgICBpZiAoKF9fYnl0ZXNfbGVmdCA8IF9fdG90YWxfYnl0ZXMpICYmIChfX2J5dGVzX2xlZnQgPj0gX19TVEFUSUNfQ0FTVChfX2FkZF9hdG9taWNfdCwgX3Bfc2l6ZSkpKSB7CisgICAgICAvLyBUaGVyZSdzIGVub3VnaCBsZWZ0IGZvciBhdCBsZWFzdCBvbmUgb2JqZWN0LCBidXQgbm90IGFzIG11Y2ggYXMgd2Ugd2FudGVkCisgICAgICBfX3Jlc3VsdCAgICAgID0gX19idWZfc3RhcnQ7CisgICAgICBfX25vYmpzICAgICAgID0gKGludCkoX19ieXRlc19sZWZ0L19wX3NpemUpOworICAgICAgX190b3RhbF9ieXRlcyA9IF9fU1RBVElDX0NBU1QoX19hZGRfYXRvbWljX3QsIF9wX3NpemUpICogX19ub2JqczsKKyAgICAgIF9fYnl0ZXNfbGVmdCAtPSBfX3RvdGFsX2J5dGVzOworICAgICAgX19idWZfc3RhcnQgICs9IF9fdG90YWxfYnl0ZXM7CisgICAgfQorICAgIGVsc2UgaWYgKF9fYnl0ZXNfbGVmdCA+PSBfX3RvdGFsX2J5dGVzKSB7CisgICAgICAvLyBUaGUgYmxvY2sgaGFzIGVub3VnaCBsZWZ0IHRvIHNhdGlzZnkgYWxsIHRoYXQgd2FzIGFza2VkIGZvcgorICAgICAgX19yZXN1bHQgICAgICA9IF9fYnVmX3N0YXJ0OworICAgICAgX19ieXRlc19sZWZ0IC09IF9fdG90YWxfYnl0ZXM7CisgICAgICBfX2J1Zl9zdGFydCAgKz0gX190b3RhbF9ieXRlczsKKyAgICB9CisKKyAgICBpZiAoX19ieXRlc19sZWZ0ICE9IDApIHsKKyAgICAgIC8vIFRoZXJlIGlzIHN0aWxsIHNvbWUgbWVtb3J5IGxlZnQgb3ZlciBpbiBibG9jayBhZnRlciB3ZSBzYXRpc2ZpZWQgb3VyIHJlcXVlc3QuCisgICAgICBpZiAoKF9fcmVzdWx0ICE9IDApICYmIChfX2J5dGVzX2xlZnQgPj0gKF9fYWRkX2F0b21pY190KXNpemVvZihfRnJlZUJsb2NrSGVhZGVyKSkpIHsKKyAgICAgICAgLy8gV2Ugd2VyZSBhYmxlIHRvIGFsbG9jYXRlIGF0IGxlYXN0IG9uZSBvYmplY3QgYW5kIHRoZXJlIGlzIHN0aWxsIGVub3VnaAorICAgICAgICAvLyBsZWZ0IHRvIHB1dCByZW1haW5kZXIgYmFjayBpbnRvIGxpc3QuCisgICAgICAgIF9GcmVlQmxvY2tIZWFkZXIqIF9fbmV3YmxvY2sgPSBfX1JFSU5URVJQUkVUX0NBU1QoX0ZyZWVCbG9ja0hlYWRlciosIF9fYnVmX3N0YXJ0KTsKKyAgICAgICAgX19uZXdibG9jay0+X01fZW5kICA9IF9fYmxvY2stPl9NX2VuZDsKKyAgICAgICAgX1NfZnJlZV9tZW1fYmxvY2tzLnB1c2goX19uZXdibG9jayk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgLy8gV2Ugd2VyZSBub3QgYWJsZSB0byBhbGxvY2F0ZSBlbm91Z2ggZm9yIGF0IGxlYXN0IG9uZSBvYmplY3QuCisgICAgICAgIC8vIFNob3ZlIGludG8gZnJlZWxpc3Qgb2YgbmVhcmVzdCAocm91bmRlZC1kb3duISkgc2l6ZS4KKyAgICAgICAgc2l6ZV90IF9fcm91bmRlZF9kb3duID0gX1Nfcm91bmRfdXAoX19ieXRlc19sZWZ0ICsgMSkgLSAoc2l6ZV90KV9BTElHTjsKKyAgICAgICAgaWYgKF9fcm91bmRlZF9kb3duID4gMCkKKyAgICAgICAgICBfU19mcmVlX2xpc3RbX1NfRlJFRUxJU1RfSU5ERVgoX19yb3VuZGVkX2Rvd24pXS5wdXNoKChfT2JqKilfX2J1Zl9zdGFydCk7CisgICAgICB9CisgICAgfQorICAgIGlmIChfX3Jlc3VsdCAhPSAwKQorICAgICAgcmV0dXJuIF9fcmVzdWx0OworICB9CisKKyAgLy8gV2UgY291bGRuJ3Qgc2F0aXNmeSBpdCBmcm9tIHRoZSBsaXN0IG9mIGZyZWUgYmxvY2tzLCBnZXQgbmV3IG1lbW9yeS4KKyAgX19hZGRfYXRvbWljX3QgX19ieXRlc190b19nZXQgPSAyICogX190b3RhbF9ieXRlcyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19TVEFUSUNfQ0FTVChfX2FkZF9hdG9taWNfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TX3JvdW5kX3VwKF9fU1RBVElDX0NBU1QoX191YWRkX2F0b21pY190LCBfU1RMUF9BVE9NSUNfQUREKCZfU19oZWFwX3NpemUsIDApKSkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9PRkZTRVQ7CisgIF9TVExQX1RSWSB7CisgICAgX19yZXN1bHQgPSBfX3N0bHBfbmV3X2NodW5rKF9fYnl0ZXNfdG9fZ2V0KTsKKyAgfQorI2lmIGRlZmluZWQgKF9TVExQX1VTRV9FWENFUFRJT05TKQorICBjYXRjaCAoY29uc3QgYmFkX2FsbG9jJikgeworICAgIC8vIEFsbG9jYXRpb24gZmFpbGVkOyB0cnkgdG8gY2FuaWJhbGl6ZSBmcm9tIGZyZWVsaXN0IG9mIGEgbGFyZ2VyIG9iamVjdCBzaXplLgorICAgIGZvciAoc2l6ZV90IF9faSA9IF9wX3NpemU7IF9faSA8PSAoc2l6ZV90KV9NQVhfQllURVM7IF9faSArPSAoc2l6ZV90KV9BTElHTikgeworICAgICAgX09iaiogX19wICA9IF9TX2ZyZWVfbGlzdFtfU19GUkVFTElTVF9JTkRFWChfX2kpXS5wb3AoKTsKKyAgICAgIGlmICgwICE9IF9fcCkgeworICAgICAgICBpZiAoX19pIDwgc2l6ZW9mKF9GcmVlQmxvY2tIZWFkZXIpKSB7CisgICAgICAgICAgLy8gTm90IGVub3VnaCB0byBwdXQgaW50byBsaXN0IG9mIGZyZWUgYmxvY2tzLCBkaXZ2eSBpdCB1cCBoZXJlLgorICAgICAgICAgIC8vIFVzZSBhcyBtdWNoIGFzIHBvc3NpYmxlIGZvciB0aGlzIHJlcXVlc3QgYW5kIHNob3ZlIHJlbWFpbmRlciBpbnRvIGZyZWVsaXN0LgorICAgICAgICAgIF9fbm9ianMgPSAoaW50KShfX2kvX3Bfc2l6ZSk7CisgICAgICAgICAgX190b3RhbF9ieXRlcyA9IF9fbm9ianMgKiBfX1NUQVRJQ19DQVNUKF9fYWRkX2F0b21pY190LCBfcF9zaXplKTsKKyAgICAgICAgICBzaXplX3QgX19ieXRlc19sZWZ0ID0gX19pIC0gX190b3RhbF9ieXRlczsKKyAgICAgICAgICBzaXplX3QgX19yb3VuZGVkX2Rvd24gPSBfU19yb3VuZF91cChfX2J5dGVzX2xlZnQrMSkgLSAoc2l6ZV90KV9BTElHTjsKKyAgICAgICAgICBpZiAoX19yb3VuZGVkX2Rvd24gPiAwKSB7CisgICAgICAgICAgICBfU19mcmVlX2xpc3RbX1NfRlJFRUxJU1RfSU5ERVgoX19yb3VuZGVkX2Rvd24pXS5wdXNoKF9fUkVJTlRFUlBSRVRfQ0FTVChfT2JqKiwgX19SRUlOVEVSUFJFVF9DQVNUKGNoYXIqLCBfX3ApICsgX190b3RhbF9ieXRlcykpOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gX19SRUlOVEVSUFJFVF9DQVNUKGNoYXIqLCBfX3ApOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIC8vIEFkZCBub2RlIHRvIGxpc3Qgb2YgYXZhaWxhYmxlIGJsb2NrcyBhbmQgcmVjdXJzaXZlbHkgYWxsb2NhdGUgZnJvbSBpdC4KKyAgICAgICAgICBfRnJlZUJsb2NrSGVhZGVyKiBfX25ld2Jsb2NrID0gKF9GcmVlQmxvY2tIZWFkZXIqKV9fcDsKKyAgICAgICAgICBfX25ld2Jsb2NrLT5fTV9lbmQgID0gX19SRUlOVEVSUFJFVF9DQVNUKGNoYXIqLCBfX3ApICsgX19pOworICAgICAgICAgIF9TX2ZyZWVfbWVtX2Jsb2Nrcy5wdXNoKF9fbmV3YmxvY2spOworICAgICAgICAgIHJldHVybiBfU19jaHVua19hbGxvYyhfcF9zaXplLCBfX25vYmpzKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8vIFdlIHdlcmUgbm90IGFibGUgdG8gZmluZCBzb21ldGhpbmcgaW4gYSBmcmVlbGlzdCwgdHJ5IHRvIGFsbG9jYXRlIGEgc21hbGxlciBhbW91bnQuCisgICAgX19ieXRlc190b19nZXQgID0gX190b3RhbF9ieXRlcyArIF9TVExQX09GRlNFVDsKKyAgICBfX3Jlc3VsdCA9IF9fc3RscF9uZXdfY2h1bmsoX19ieXRlc190b19nZXQpOworCisgICAgLy8gVGhpcyBzaG91bGQgZWl0aGVyIHRocm93IGFuIGV4Y2VwdGlvbiBvciByZW1lZHkgdGhlIHNpdHVhdGlvbi4KKyAgICAvLyBUaHVzIHdlIGFzc3VtZSBpdCBzdWNjZWVkZWQuCisgIH0KKyNlbmRpZgorICAvLyBBbGlnbm1lbnQgY2hlY2sKKyAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoKChfX1JFSU5URVJQUkVUX0NBU1Qoc2l6ZV90LCBfX3Jlc3VsdCkgJiBfX1NUQVRJQ19DQVNUKHNpemVfdCwgX0FMSUdOIC0gMSkpID09IDApLAorICAgICAgICAgICAgICAgICAgICAgICBfU3RsTXNnX0RCQV9ERUxFVEVEX1RXSUNFKQorICBfU1RMUF9BVE9NSUNfQUREKCZfU19oZWFwX3NpemUsIF9fYnl0ZXNfdG9fZ2V0ID4+IDQpOworCisjICBpZiBkZWZpbmVkIChfU1RMUF9ET19DTEVBTl9OT0RFX0FMTE9DKQorICAvLyBXZSBoYXZlIHRvIHRyYWNrIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGNodW5rcyBmb3IgcmVsZWFzZSBvbiBleGl0LgorICBfU19jaHVua3MucHVzaChfX1JFSU5URVJQUkVUX0NBU1QoX09iaiosIF9fcmVzdWx0KSk7CisgIF9fcmVzdWx0ICAgICAgICs9IF9BTElHTjsKKyAgX19ieXRlc190b19nZXQgLT0gX0FMSUdOOworIyAgZW5kaWYKKworICBpZiAoX19ieXRlc190b19nZXQgPiBfX3RvdGFsX2J5dGVzKSB7CisgICAgLy8gUHVzaCBleGNlc3MgbWVtb3J5IGFsbG9jYXRlZCBpbiB0aGlzIGNodW5rIGludG8gbGlzdCBvZiBmcmVlIG1lbW9yeSBibG9ja3MKKyAgICBfRnJlZUJsb2NrSGVhZGVyKiBfX2ZyZWVibG9jayA9IF9fUkVJTlRFUlBSRVRfQ0FTVChfRnJlZUJsb2NrSGVhZGVyKiwgX19yZXN1bHQgKyBfX3RvdGFsX2J5dGVzKTsKKyAgICBfX2ZyZWVibG9jay0+X01fZW5kICA9IF9fcmVzdWx0ICsgX19ieXRlc190b19nZXQ7CisgICAgX1NfZnJlZV9tZW1fYmxvY2tzLnB1c2goX19mcmVlYmxvY2spOworICB9CisgIHJldHVybiBfX3Jlc3VsdDsKK30KKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfRE9fQ0xFQU5fTk9ERV9BTExPQykKK3ZvaWQgX19ub2RlX2FsbG9jX2ltcGw6Ol9TX2FsbG9jX2NhbGwoKQoreyBfU1RMUF9BVE9NSUNfSU5DUkVNRU5UKCZfU19hbGxvY19jb3VudGVyKCkpOyB9CisKK3ZvaWQgX19ub2RlX2FsbG9jX2ltcGw6Ol9TX2RlYWxsb2NfY2FsbCgpIHsKKyAgX1NUTFBfVk9MQVRJTEUgX19zdGxfYXRvbWljX3QgKnBjb3VudGVyID0gJl9TX2FsbG9jX2NvdW50ZXIoKTsKKyAgaWYgKF9TVExQX0FUT01JQ19ERUNSRU1FTlQocGNvdW50ZXIpID09IDApCisgICAgX1NfY2h1bmtfZGVhbGxvYygpOworfQorCisvKiBXZSBkZWFsbG9jYXRlIGFsbCB0aGUgbWVtb3J5IGNodW5rcyAgICAgICovCit2b2lkIF9fbm9kZV9hbGxvY19pbXBsOjpfU19jaHVua19kZWFsbG9jKCkgeworICAvLyBOb3RlOiBUaGUgX05vZGVfYWxsb2NfaGVscGVyIGNsYXNzIGVuc3VyZXMgdGhhdCB0aGlzIGZ1bmN0aW9uCisgIC8vIHdpbGwgb25seSBiZSBjYWxsZWQgd2hlbiB0aGUgKHNoYXJlZCkgbGlicmFyeSBpcyB1bmxvYWRlZCBvciB0aGUKKyAgLy8gcHJvY2VzcyBpcyBzaHV0ZG93bi4gIEl0J3MgdGh1cyBub3QgcG9zc2libGUgdGhhdCBhbm90aGVyIHRocmVhZAorICAvLyBpcyBjdXJyZW50bHkgdHJ5aW5nIHRvIGFsbG9jYXRlIGEgbm9kZSAod2UncmUgbm90IHRocmVhZC1zYWZlIGhlcmUpLgorICAvLworCisgIC8vIENsZWFyIHRoZSBmcmVlIGJsb2NrcyBhbmQgYWxsIGZyZWVsaXN0c3QuICBUaGlzIG1ha2VzIHN1cmUgdGhhdCBpZgorICAvLyBmb3Igc29tZSByZWFzb24gbW9yZSBtZW1vcnkgaXMgYWxsb2NhdGVkIGFnYWluIGR1cmluZyBzaHV0ZG93bgorICAvLyAoaXQnZCBhbHNvIGJlIHJlYWxseSBuYXN0eSB0byBsZWF2ZSByZWZlcmVuY2VzIHRvIGRlYWxsb2NhdGVkIG1lbW9yeSkuCisgIF9TX2ZyZWVfbWVtX2Jsb2Nrcy5jbGVhcigpOworICBfU19oZWFwX3NpemUgICAgICA9IDA7CisKKyAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX1NUTFBfTkZSRUVMSVNUUzsgKytfX2kpIHsKKyAgICBfU19mcmVlX2xpc3RbX19pXS5jbGVhcigpOworICB9CisKKyAgLy8gRGV0YWNoIGxpc3Qgb2YgY2h1bmtzIGFuZCBmcmVlIHRoZW0gYWxsCisgIF9PYmoqIF9fY2h1bmsgPSBfU19jaHVua3MuY2xlYXIoKTsKKyAgd2hpbGUgKF9fY2h1bmsgIT0gMCkgeworICAgIF9PYmoqIF9fbmV4dCA9IF9fY2h1bmstPl9NX25leHQ7CisgICAgX19zdGxwX2RlbGV0ZV9jaHVuY2soX19jaHVuayk7CisgICAgX19jaHVuayAgPSBfX25leHQ7CisgIH0KK30KKyMgIGVuZGlmCisKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfRE9fQ0xFQU5fTk9ERV9BTExPQykKK3N0cnVjdCBfX25vZGVfYWxsb2NfY2xlYW5lciB7CisgIH5fX25vZGVfYWxsb2NfY2xlYW5lcigpCisgIHsgX19ub2RlX2FsbG9jX2ltcGw6Ol9TX2RlYWxsb2NfY2FsbCgpOyB9Cit9OworCisjICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfTE9DS19GUkVFX0lNUExFTUVOVEFUSU9OKQorX1NUTFBfVk9MQVRJTEUgX19zdGxfYXRvbWljX3QmIF9TVExQX0NBTEwKKyMgIGVsc2UKK19fc3RsX2F0b21pY190JiBfU1RMUF9DQUxMCisjICBlbmRpZgorX19ub2RlX2FsbG9jX2ltcGw6Ol9TX2FsbG9jX2NvdW50ZXIoKSB7CisgIHN0YXRpYyBfQWxsb2NDb3VudGVyIF9TX2NvdW50ZXIgPSAxOworICBzdGF0aWMgX19ub2RlX2FsbG9jX2NsZWFuZXIgX1Nfbm9kZV9hbGxvY19jbGVhbmVyOworICByZXR1cm4gX1NfY291bnRlcjsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKF9TVExQX1VTRV9MT0NLX0ZSRUVfSU1QTEVNRU5UQVRJT04pCitfTm9kZV9hbGxvY19vYmogKiBfU1RMUF9WT0xBVElMRQorX19ub2RlX2FsbG9jX2ltcGw6Ol9TX2ZyZWVfbGlzdFtfU1RMUF9ORlJFRUxJU1RTXQorPSB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH07CisvLyBUaGUgMTYgemVyb3MgYXJlIG5lY2Vzc2FyeSB0byBtYWtlIHZlcnNpb24gNC4xIG9mIHRoZSBTdW5Qcm8KKy8vIGNvbXBpbGVyIGhhcHB5LiAgT3RoZXJ3aXNlIGl0IGFwcGVhcnMgdG8gYWxsb2NhdGUgdG9vIGxpdHRsZQorLy8gc3BhY2UgZm9yIHRoZSBhcnJheS4KKyNlbHNlCitfU1RMUF9hdG9taWNfZnJlZWxpc3QgX19ub2RlX2FsbG9jX2ltcGw6Ol9TX2ZyZWVfbGlzdFtfU1RMUF9ORlJFRUxJU1RTXTsKK19TVExQX2F0b21pY19mcmVlbGlzdCBfX25vZGVfYWxsb2NfaW1wbDo6X1NfZnJlZV9tZW1fYmxvY2tzOworI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX0xPQ0tfRlJFRV9JTVBMRU1FTlRBVElPTikKK2NoYXIgKl9fbm9kZV9hbGxvY19pbXBsOjpfU19zdGFydF9mcmVlID0gMDsKK2NoYXIgKl9fbm9kZV9hbGxvY19pbXBsOjpfU19lbmRfZnJlZSA9IDA7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9MT0NLX0ZSRUVfSU1QTEVNRU5UQVRJT04pCitfU1RMUF9WT0xBVElMRSBfX2FkZF9hdG9taWNfdAorI2Vsc2UKK3NpemVfdAorI2VuZGlmCitfX25vZGVfYWxsb2NfaW1wbDo6X1NfaGVhcF9zaXplID0gMDsKKworI2lmIGRlZmluZWQgKF9TVExQX0RPX0NMRUFOX05PREVfQUxMT0MpCisjICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfTE9DS19GUkVFX0lNUExFTUVOVEFUSU9OKQorX1NUTFBfYXRvbWljX2ZyZWVsaXN0IF9fbm9kZV9hbGxvY19pbXBsOjpfU19jaHVua3M7CisjICBlbHNlCitfTm9kZV9hbGxvY19vYmoqIF9fbm9kZV9hbGxvY19pbXBsOjpfU19jaHVua3MgID0gMDsKKyMgIGVuZGlmCisjZW5kaWYKKwordm9pZCAqIF9TVExQX0NBTEwgX19ub2RlX2FsbG9jOjpfTV9hbGxvY2F0ZShzaXplX3QmIF9fbikKK3sgcmV0dXJuIF9fbm9kZV9hbGxvY19pbXBsOjpfTV9hbGxvY2F0ZShfX24pOyB9CisKK3ZvaWQgX1NUTFBfQ0FMTCBfX25vZGVfYWxsb2M6Ol9NX2RlYWxsb2NhdGUodm9pZCAqX19wLCBzaXplX3QgX19uKQoreyBfX25vZGVfYWxsb2NfaW1wbDo6X01fZGVhbGxvY2F0ZShfX3AsIF9fbik7IH0KKworI2lmIGRlZmluZWQgKF9TVExQX1BUSFJFQURTKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fVEhSRUFEUykKKworIyAgZGVmaW5lIF9TVExQX0RBVEFfQUxJR05NRU5UIDgKKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBfX3BlcnRocmVhZF9hbGxvYyBpbXBsZW1lbnRhdGlvbgordW5pb24gX1B0aHJlYWRfYWxsb2Nfb2JqIHsKKyAgdW5pb24gX1B0aHJlYWRfYWxsb2Nfb2JqICogX19mcmVlX2xpc3RfbGluazsKKyAgY2hhciBfX2NsaWVudF9kYXRhW19TVExQX0RBVEFfQUxJR05NRU5UXTsgICAgLyogVGhlIGNsaWVudCBzZWVzIHRoaXMuICAgICovCit9OworCisvLyBQdGhyZWFkIGFsbG9jYXRvcnMgZG9uJ3QgYXBwZWFyIHRvIHRoZSBjbGllbnQgdG8gaGF2ZSBtZWFuaW5nZnVsCisvLyBpbnN0YW5jZXMuICBXZSBkbyBpbiBmYWN0IG5lZWQgdG8gYXNzb2NpYXRlIHNvbWUgc3RhdGUgd2l0aCBlYWNoCisvLyB0aHJlYWQuICBUaGF0IHN0YXRlIGlzIHJlcHJlc2VudGVkIGJ5IF9QdGhyZWFkX2FsbG9jX3Blcl90aHJlYWRfc3RhdGUuCisKK3N0cnVjdCBfUHRocmVhZF9hbGxvY19wZXJfdGhyZWFkX3N0YXRlIHsKKyAgdHlwZWRlZiBfUHRocmVhZF9hbGxvY19vYmogX19vYmo7CisgIGVudW0geyBfU19ORlJFRUxJU1RTID0gX01BWF9CWVRFUyAvIF9TVExQX0RBVEFfQUxJR05NRU5UIH07CisKKyAgLy8gRnJlZSBsaXN0IGxpbmsgZm9yIGxpc3Qgb2YgYXZhaWxhYmxlIHBlciB0aHJlYWQgc3RydWN0dXJlcy4KKyAgLy8gV2hlbiBvbmUgb2YgdGhlc2UgYmVjb21lcyBhdmFpbGFibGUgZm9yIHJldXNlIGR1ZSB0byB0aHJlYWQKKyAgLy8gdGVybWluYXRpb24sIGFueSBvYmplY3RzIGluIGl0cyBmcmVlIGxpc3QgcmVtYWluIGFzc29jaWF0ZWQKKyAgLy8gd2l0aCBpdC4gIFRoZSB3aG9sZSBzdHJ1Y3R1cmUgbWF5IHRoZW4gYmUgdXNlZCBieSBhIG5ld2x5CisgIC8vIGNyZWF0ZWQgdGhyZWFkLgorICBfUHRocmVhZF9hbGxvY19wZXJfdGhyZWFkX3N0YXRlKCkgOiBfX25leHQoMCkKKyAgeyBtZW1zZXQoKHZvaWQgKilfX0NPTlNUX0NBU1QoX1B0aHJlYWRfYWxsb2Nfb2JqKiosIF9fZnJlZV9saXN0KSwgMCwgKHNpemVfdClfU19ORlJFRUxJU1RTICogc2l6ZW9mKF9fb2JqICopKTsgfQorICAvLyBSZXR1cm5zIGFuIG9iamVjdCBvZiBzaXplIF9fbiwgYW5kIHBvc3NpYmx5IGFkZHMgdG8gc2l6ZSBuIGZyZWUgbGlzdC4KKyAgdm9pZCAqX01fcmVmaWxsKHNpemVfdCBfX24pOworCisgIF9QdGhyZWFkX2FsbG9jX29iaiogdm9sYXRpbGUgX19mcmVlX2xpc3RbX1NfTkZSRUVMSVNUU107CisgIF9QdGhyZWFkX2FsbG9jX3Blcl90aHJlYWRfc3RhdGUgKl9fbmV4dDsKKyAgLy8gdGhpcyBkYXRhIG1lbWJlciBpcyBvbmx5IHRvIGJlIHVzZWQgYnkgcGVyX3RocmVhZF9hbGxvY2F0b3IsIHdoaWNoIHJldHVybnMgbWVtb3J5IHRvIHRoZSBvcmlnaW5hdGluZyB0aHJlYWQuCisgIF9TVExQX211dGV4IF9NX2xvY2s7Cit9OworCisvLyBQdGhyZWFkLXNwZWNpZmljIGFsbG9jYXRvci4KK2NsYXNzIF9QdGhyZWFkX2FsbG9jX2ltcGwgeworcHVibGljOiAvLyBidXQgb25seSBmb3IgaW50ZXJuYWwgdXNlOgorICB0eXBlZGVmIF9QdGhyZWFkX2FsbG9jX3Blcl90aHJlYWRfc3RhdGUgX19zdGF0ZV90eXBlOworICB0eXBlZGVmIGNoYXIgdmFsdWVfdHlwZTsKKworICAvLyBBbGxvY2F0ZXMgYSBjaHVuayBmb3Igbm9ianMgb2Ygc2l6ZSBzaXplLiAgbm9ianMgbWF5IGJlIHJlZHVjZWQKKyAgLy8gaWYgaXQgaXMgaW5jb252ZW5pZW50IHRvIGFsbG9jYXRlIHRoZSByZXF1ZXN0ZWQgbnVtYmVyLgorICBzdGF0aWMgY2hhciAqX1NfY2h1bmtfYWxsb2Moc2l6ZV90IF9fc2l6ZSwgc2l6ZV90ICZfX25vYmpzLCBfX3N0YXRlX3R5cGUqKTsKKworICBlbnVtIHtfU19BTElHTiA9IF9TVExQX0RBVEFfQUxJR05NRU5UfTsKKworICBzdGF0aWMgc2l6ZV90IF9TX3JvdW5kX3VwKHNpemVfdCBfX2J5dGVzKQorICB7IHJldHVybiAoKChfX2J5dGVzKSArIChpbnQpX1NfQUxJR04gLSAxKSAmIH4oKGludClfU19BTElHTiAtIDEpKTsgfQorICBzdGF0aWMgc2l6ZV90IF9TX2ZyZWVsaXN0X2luZGV4KHNpemVfdCBfX2J5dGVzKQorICB7IHJldHVybiAoKChfX2J5dGVzKSArIChpbnQpX1NfQUxJR04gLSAxKSAvIChpbnQpX1NfQUxJR04gLSAxKTsgfQorCitwcml2YXRlOgorICAvLyBDaHVuayBhbGxvY2F0aW9uIHN0YXRlLiBBbmQgb3RoZXIgc2hhcmVkIHN0YXRlLgorICAvLyBQcm90ZWN0ZWQgYnkgX1NfY2h1bmtfYWxsb2NhdG9yX2xvY2suCisgIHN0YXRpYyBfU1RMUF9TVEFUSUNfTVVURVggX1NfY2h1bmtfYWxsb2NhdG9yX2xvY2s7CisgIHN0YXRpYyBjaGFyICpfU19zdGFydF9mcmVlOworICBzdGF0aWMgY2hhciAqX1NfZW5kX2ZyZWU7CisgIHN0YXRpYyBzaXplX3QgX1NfaGVhcF9zaXplOworICBzdGF0aWMgX19zdGF0ZV90eXBlICpfU19mcmVlX3Blcl90aHJlYWRfc3RhdGVzOworICBzdGF0aWMgcHRocmVhZF9rZXlfdCBfU19rZXk7CisgIHN0YXRpYyBib29sIF9TX2tleV9pbml0aWFsaXplZDsKKyAgLy8gUHRocmVhZCBrZXkgdW5kZXIgd2hpY2ggcGVyIHRocmVhZCBzdGF0ZSBpcyBzdG9yZWQuCisgIC8vIEFsbG9jYXRvciBpbnN0YW5jZXMgdGhhdCBhcmUgY3VycmVudGx5IHVuY2xhaW1lZCBieSBhbnkgdGhyZWFkLgorICBzdGF0aWMgdm9pZCBfU19kZXN0cnVjdG9yKHZvaWQgKmluc3RhbmNlKTsKKyAgLy8gRnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uIHRocmVhZCBleGl0IHRvIHJlY2xhaW0gcGVyIHRocmVhZAorICAvLyBzdGF0ZS4KKyAgc3RhdGljIF9fc3RhdGVfdHlwZSAqX1NfbmV3X3Blcl90aHJlYWRfc3RhdGUoKTsKK3B1YmxpYzoKKyAgLy8gUmV0dXJuIGEgcmVjeWNsZWQgb3IgbmV3IHBlciB0aHJlYWQgc3RhdGUuCisgIHN0YXRpYyBfX3N0YXRlX3R5cGUgKl9TX2dldF9wZXJfdGhyZWFkX3N0YXRlKCk7Citwcml2YXRlOgorICAgICAgICAvLyBlbnN1cmUgdGhhdCB0aGUgY3VycmVudCB0aHJlYWQgaGFzIGFuIGFzc29jaWF0ZWQKKyAgICAgICAgLy8gcGVyIHRocmVhZCBzdGF0ZS4KKyAgY2xhc3MgX01fbG9jazsKKyAgZnJpZW5kIGNsYXNzIF9NX2xvY2s7CisgIGNsYXNzIF9NX2xvY2sgeworICBwdWJsaWM6CisgICAgX01fbG9jayAoKSB7IF9TX2NodW5rX2FsbG9jYXRvcl9sb2NrLl9NX2FjcXVpcmVfbG9jaygpOyB9CisgICAgfl9NX2xvY2sgKCkgeyBfU19jaHVua19hbGxvY2F0b3JfbG9jay5fTV9yZWxlYXNlX2xvY2soKTsgfQorICB9OworCitwdWJsaWM6CisKKyAgLyogbiBtdXN0IGJlID4gMCAgICAgICovCisgIHN0YXRpYyB2b2lkICogYWxsb2NhdGUoc2l6ZV90JiBfX24pOworCisgIC8qIHAgbWF5IG5vdCBiZSAwICovCisgIHN0YXRpYyB2b2lkIGRlYWxsb2NhdGUodm9pZCAqX19wLCBzaXplX3QgX19uKTsKKworICAvLyBib3JpcyA6IHZlcnNpb25zIGZvciBwZXJfdGhyZWFkX2FsbG9jYXRvcgorICAvKiBuIG11c3QgYmUgPiAwICAgICAgKi8KKyAgc3RhdGljIHZvaWQgKiBhbGxvY2F0ZShzaXplX3QmIF9fbiwgX19zdGF0ZV90eXBlKiBfX2EpOworCisgIC8qIHAgbWF5IG5vdCBiZSAwICovCisgIHN0YXRpYyB2b2lkIGRlYWxsb2NhdGUodm9pZCAqX19wLCBzaXplX3QgX19uLCBfX3N0YXRlX3R5cGUqIF9fYSk7CisKKyAgc3RhdGljIHZvaWQgKiByZWFsbG9jYXRlKHZvaWQgKl9fcCwgc2l6ZV90IF9fb2xkX3N6LCBzaXplX3QmIF9fbmV3X3N6KTsKK307CisKKy8qIFJldHVybnMgYW4gb2JqZWN0IG9mIHNpemUgbiwgYW5kIG9wdGlvbmFsbHkgYWRkcyB0byBzaXplIG4gZnJlZSBsaXN0LiovCisvKiBXZSBhc3N1bWUgdGhhdCBuIGlzIHByb3Blcmx5IGFsaWduZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogV2UgaG9sZCB0aGUgYWxsb2NhdGlvbiBsb2NrLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3ZvaWQgKl9QdGhyZWFkX2FsbG9jX3Blcl90aHJlYWRfc3RhdGU6Ol9NX3JlZmlsbChzaXplX3QgX19uKSB7CisgIHR5cGVkZWYgX1B0aHJlYWRfYWxsb2Nfb2JqIF9fb2JqOworICBzaXplX3QgX19ub2JqcyA9IDEyODsKKyAgY2hhciAqIF9fY2h1bmsgPSBfUHRocmVhZF9hbGxvY19pbXBsOjpfU19jaHVua19hbGxvYyhfX24sIF9fbm9ianMsIHRoaXMpOworICBfX29iaiAqIHZvbGF0aWxlICogX19teV9mcmVlX2xpc3Q7CisgIF9fb2JqICogX19yZXN1bHQ7CisgIF9fb2JqICogX19jdXJyZW50X29iaiwgKiBfX25leHRfb2JqOworICBzaXplX3QgX19pOworCisgIGlmICgxID09IF9fbm9ianMpICB7CisgICAgcmV0dXJuIF9fY2h1bms7CisgIH0KKworICBfX215X2ZyZWVfbGlzdCA9IF9fZnJlZV9saXN0ICsgX1B0aHJlYWRfYWxsb2NfaW1wbDo6X1NfZnJlZWxpc3RfaW5kZXgoX19uKTsKKworICAvKiBCdWlsZCBmcmVlIGxpc3QgaW4gY2h1bmsgKi8KKyAgX19yZXN1bHQgPSAoX19vYmogKilfX2NodW5rOworICAqX19teV9mcmVlX2xpc3QgPSBfX25leHRfb2JqID0gKF9fb2JqICopKF9fY2h1bmsgKyBfX24pOworICBmb3IgKF9faSA9IDE7IDsgKytfX2kpIHsKKyAgICBfX2N1cnJlbnRfb2JqID0gX19uZXh0X29iajsKKyAgICBfX25leHRfb2JqID0gKF9fb2JqICopKChjaGFyICopX19uZXh0X29iaiArIF9fbik7CisgICAgaWYgKF9fbm9ianMgLSAxID09IF9faSkgeworICAgICAgX19jdXJyZW50X29iaiAtPiBfX2ZyZWVfbGlzdF9saW5rID0gMDsKKyAgICAgIGJyZWFrOworICAgIH0gZWxzZSB7CisgICAgICBfX2N1cnJlbnRfb2JqIC0+IF9fZnJlZV9saXN0X2xpbmsgPSBfX25leHRfb2JqOworICAgIH0KKyAgfQorICByZXR1cm4gX19yZXN1bHQ7Cit9CisKK3ZvaWQgX1B0aHJlYWRfYWxsb2NfaW1wbDo6X1NfZGVzdHJ1Y3Rvcih2b2lkICpfX2luc3RhbmNlKSB7CisgIF9NX2xvY2sgX19sb2NrX2luc3RhbmNlOyAgLy8gTmVlZCB0byBhY3F1aXJlIGxvY2sgaGVyZS4KKyAgX1B0aHJlYWRfYWxsb2NfcGVyX3RocmVhZF9zdGF0ZSogX19zID0gKF9QdGhyZWFkX2FsbG9jX3Blcl90aHJlYWRfc3RhdGUqKV9faW5zdGFuY2U7CisgIF9fcyAtPiBfX25leHQgPSBfU19mcmVlX3Blcl90aHJlYWRfc3RhdGVzOworICBfU19mcmVlX3Blcl90aHJlYWRfc3RhdGVzID0gX19zOworfQorCitfUHRocmVhZF9hbGxvY19wZXJfdGhyZWFkX3N0YXRlKiBfUHRocmVhZF9hbGxvY19pbXBsOjpfU19uZXdfcGVyX3RocmVhZF9zdGF0ZSgpIHsKKyAgLyogbG9jayBhbHJlYWR5IGhlbGQgaGVyZS4gICovCisgIGlmICgwICE9IF9TX2ZyZWVfcGVyX3RocmVhZF9zdGF0ZXMpIHsKKyAgICBfUHRocmVhZF9hbGxvY19wZXJfdGhyZWFkX3N0YXRlICpfX3Jlc3VsdCA9IF9TX2ZyZWVfcGVyX3RocmVhZF9zdGF0ZXM7CisgICAgX1NfZnJlZV9wZXJfdGhyZWFkX3N0YXRlcyA9IF9TX2ZyZWVfcGVyX3RocmVhZF9zdGF0ZXMgLT4gX19uZXh0OworICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgfQorICBlbHNlIHsKKyAgICByZXR1cm4gbmV3IF9QdGhyZWFkX2FsbG9jX3Blcl90aHJlYWRfc3RhdGU7CisgIH0KK30KKworX1B0aHJlYWRfYWxsb2NfcGVyX3RocmVhZF9zdGF0ZSogX1B0aHJlYWRfYWxsb2NfaW1wbDo6X1NfZ2V0X3Blcl90aHJlYWRfc3RhdGUoKSB7CisgIGludCBfX3JldF9jb2RlOworICBfX3N0YXRlX3R5cGUqIF9fcmVzdWx0OworCisgIGlmIChfU19rZXlfaW5pdGlhbGl6ZWQgJiYgKF9fcmVzdWx0ID0gKF9fc3RhdGVfdHlwZSopIHB0aHJlYWRfZ2V0c3BlY2lmaWMoX1Nfa2V5KSkpCisgICAgcmV0dXJuIF9fcmVzdWx0OworCisgIC8qUkVGRVJFTkNFRCovCisgIF9NX2xvY2sgX19sb2NrX2luc3RhbmNlOyAgLy8gTmVlZCB0byBhY3F1aXJlIGxvY2sgaGVyZS4KKyAgaWYgKCFfU19rZXlfaW5pdGlhbGl6ZWQpIHsKKyAgICBpZiAocHRocmVhZF9rZXlfY3JlYXRlKCZfU19rZXksIF9TX2Rlc3RydWN0b3IpKSB7CisgICAgICBfU1RMUF9USFJPV19CQURfQUxMT0M7ICAvLyBmYWlsZWQKKyAgICB9CisgICAgX1Nfa2V5X2luaXRpYWxpemVkID0gdHJ1ZTsKKyAgfQorCisgIF9fcmVzdWx0ID0gX1NfbmV3X3Blcl90aHJlYWRfc3RhdGUoKTsKKyAgX19yZXRfY29kZSA9IHB0aHJlYWRfc2V0c3BlY2lmaWMoX1Nfa2V5LCBfX3Jlc3VsdCk7CisgIGlmIChfX3JldF9jb2RlKSB7CisgICAgaWYgKF9fcmV0X2NvZGUgPT0gRU5PTUVNKSB7CisgICAgICBfU1RMUF9USFJPV19CQURfQUxMT0M7CisgICAgfSBlbHNlIHsKKyAgLy8gRUlOVkFMCisgICAgICBfU1RMUF9BQk9SVCgpOworICAgIH0KKyAgfQorICByZXR1cm4gX19yZXN1bHQ7Cit9CisKKy8qIFdlIGFsbG9jYXRlIG1lbW9yeSBpbiBsYXJnZSBjaHVua3MgaW4gb3JkZXIgdG8gYXZvaWQgZnJhZ21lbnRpbmcgICAgICovCisvKiB0aGUgbWFsbG9jIGhlYXAgdG9vIG11Y2guICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogV2UgYXNzdW1lIHRoYXQgc2l6ZSBpcyBwcm9wZXJseSBhbGlnbmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK2NoYXIgKl9QdGhyZWFkX2FsbG9jX2ltcGw6Ol9TX2NodW5rX2FsbG9jKHNpemVfdCBfX3Bfc2l6ZSwgc2l6ZV90ICZfX25vYmpzLCBfUHRocmVhZF9hbGxvY19wZXJfdGhyZWFkX3N0YXRlICpfX2EpIHsKKyAgdHlwZWRlZiBfUHRocmVhZF9hbGxvY19vYmogX19vYmo7CisgIHsKKyAgICBjaGFyICogX19yZXN1bHQ7CisgICAgc2l6ZV90IF9fdG90YWxfYnl0ZXM7CisgICAgc2l6ZV90IF9fYnl0ZXNfbGVmdDsKKyAgICAvKlJFRkVSRU5DRUQqLworICAgIF9NX2xvY2sgX19sb2NrX2luc3RhbmNlOyAgICAgICAgIC8vIEFjcXVpcmUgbG9jayBmb3IgdGhpcyByb3V0aW5lCisKKyAgICBfX3RvdGFsX2J5dGVzID0gX19wX3NpemUgKiBfX25vYmpzOworICAgIF9fYnl0ZXNfbGVmdCA9IF9TX2VuZF9mcmVlIC0gX1Nfc3RhcnRfZnJlZTsKKyAgICBpZiAoX19ieXRlc19sZWZ0ID49IF9fdG90YWxfYnl0ZXMpIHsKKyAgICAgIF9fcmVzdWx0ID0gX1Nfc3RhcnRfZnJlZTsKKyAgICAgIF9TX3N0YXJ0X2ZyZWUgKz0gX190b3RhbF9ieXRlczsKKyAgICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgICB9IGVsc2UgaWYgKF9fYnl0ZXNfbGVmdCA+PSBfX3Bfc2l6ZSkgeworICAgICAgX19ub2JqcyA9IF9fYnl0ZXNfbGVmdC9fX3Bfc2l6ZTsKKyAgICAgIF9fdG90YWxfYnl0ZXMgPSBfX3Bfc2l6ZSAqIF9fbm9ianM7CisgICAgICBfX3Jlc3VsdCA9IF9TX3N0YXJ0X2ZyZWU7CisgICAgICBfU19zdGFydF9mcmVlICs9IF9fdG90YWxfYnl0ZXM7CisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfSBlbHNlIHsKKyAgICAgIHNpemVfdCBfX2J5dGVzX3RvX2dldCA9IDIgKiBfX3RvdGFsX2J5dGVzICsgX1Nfcm91bmRfdXAoX1NfaGVhcF9zaXplKTsKKyAgICAgIC8vIFRyeSB0byBtYWtlIHVzZSBvZiB0aGUgbGVmdC1vdmVyIHBpZWNlLgorICAgICAgaWYgKF9fYnl0ZXNfbGVmdCA+IDApIHsKKyAgICAgICAgX19vYmogKiB2b2xhdGlsZSAqIF9fbXlfZnJlZV9saXN0ID0gX19hLT5fX2ZyZWVfbGlzdCArIF9TX2ZyZWVsaXN0X2luZGV4KF9fYnl0ZXNfbGVmdCk7CisgICAgICAgICgoX19vYmogKilfU19zdGFydF9mcmVlKSAtPiBfX2ZyZWVfbGlzdF9saW5rID0gKl9fbXlfZnJlZV9saXN0OworICAgICAgICAqX19teV9mcmVlX2xpc3QgPSAoX19vYmogKilfU19zdGFydF9mcmVlOworICAgICAgfQorIyAgaWZkZWYgX1NHSV9TT1VSQ0UKKyAgICAgIC8vIFRyeSB0byBnZXQgbWVtb3J5IHRoYXQncyBhbGlnbmVkIG9uIHNvbWV0aGluZyBsaWtlIGEKKyAgICAgIC8vIGNhY2hlIGxpbmUgYm91bmRhcnksIHNvIGFzIHRvIGF2b2lkIHBhcmNlbGluZyBvdXQKKyAgICAgIC8vIHBhcnRzIG9mIHRoZSBzYW1lIGxpbmUgdG8gZGlmZmVyZW50IHRocmVhZHMgYW5kIHRodXMKKyAgICAgIC8vIHBvc3NpYmx5IGRpZmZlcmVudCBwcm9jZXNzb3JzLgorICAgICAgeworICAgICAgICBjb25zdCBpbnQgX19jYWNoZV9saW5lX3NpemUgPSAxMjg7ICAvLyBwcm9iYWJsZSB1cHBlciBib3VuZAorICAgICAgICBfX2J5dGVzX3RvX2dldCAmPSB+KF9fY2FjaGVfbGluZV9zaXplLTEpOworICAgICAgICBfU19zdGFydF9mcmVlID0gKGNoYXIgKiltZW1hbGlnbihfX2NhY2hlX2xpbmVfc2l6ZSwgX19ieXRlc190b19nZXQpOworICAgICAgICBpZiAoMCA9PSBfU19zdGFydF9mcmVlKSB7CisgICAgICAgICAgX1Nfc3RhcnRfZnJlZSA9IChjaGFyICopX19tYWxsb2NfYWxsb2M6OmFsbG9jYXRlKF9fYnl0ZXNfdG9fZ2V0KTsKKyAgICAgICAgfQorICAgICAgfQorIyAgZWxzZSAgLyogIVNHSV9TT1VSQ0UgKi8KKyAgICAgIF9TX3N0YXJ0X2ZyZWUgPSAoY2hhciAqKV9fbWFsbG9jX2FsbG9jOjphbGxvY2F0ZShfX2J5dGVzX3RvX2dldCk7CisjICBlbmRpZgorICAgICAgX1NfaGVhcF9zaXplICs9IF9fYnl0ZXNfdG9fZ2V0ID4+IDQ7CisgICAgICBfU19lbmRfZnJlZSA9IF9TX3N0YXJ0X2ZyZWUgKyBfX2J5dGVzX3RvX2dldDsKKyAgICB9CisgIH0KKyAgLy8gbG9jayBpcyByZWxlYXNlZCBoZXJlCisgIHJldHVybiBfU19jaHVua19hbGxvYyhfX3Bfc2l6ZSwgX19ub2JqcywgX19hKTsKK30KKworCisvKiBuIG11c3QgYmUgPiAwICAgICAgKi8KK3ZvaWQgKl9QdGhyZWFkX2FsbG9jX2ltcGw6OmFsbG9jYXRlKHNpemVfdCYgX19uKSB7CisgIHR5cGVkZWYgX1B0aHJlYWRfYWxsb2Nfb2JqIF9fb2JqOworICBfX29iaiAqIHZvbGF0aWxlICogX19teV9mcmVlX2xpc3Q7CisgIF9fb2JqICogX19yZXN1bHQ7CisgIF9fc3RhdGVfdHlwZSogX19hOworCisgIGlmIChfX24gPiBfTUFYX0JZVEVTKSB7CisgICAgcmV0dXJuIF9fbWFsbG9jX2FsbG9jOjphbGxvY2F0ZShfX24pOworICB9CisKKyAgX19uID0gX1Nfcm91bmRfdXAoX19uKTsKKyAgX19hID0gX1NfZ2V0X3Blcl90aHJlYWRfc3RhdGUoKTsKKworICBfX215X2ZyZWVfbGlzdCA9IF9fYS0+X19mcmVlX2xpc3QgKyBfU19mcmVlbGlzdF9pbmRleChfX24pOworICBfX3Jlc3VsdCA9ICpfX215X2ZyZWVfbGlzdDsKKyAgaWYgKF9fcmVzdWx0ID09IDApIHsKKyAgICB2b2lkICpfX3IgPSBfX2EtPl9NX3JlZmlsbChfX24pOworICAgIHJldHVybiBfX3I7CisgIH0KKyAgKl9fbXlfZnJlZV9saXN0ID0gX19yZXN1bHQtPl9fZnJlZV9saXN0X2xpbms7CisgIHJldHVybiBfX3Jlc3VsdDsKK307CisKKy8qIHAgbWF5IG5vdCBiZSAwICovCit2b2lkIF9QdGhyZWFkX2FsbG9jX2ltcGw6OmRlYWxsb2NhdGUodm9pZCAqX19wLCBzaXplX3QgX19uKSB7CisgIHR5cGVkZWYgX1B0aHJlYWRfYWxsb2Nfb2JqIF9fb2JqOworICBfX29iaiAqX19xID0gKF9fb2JqICopX19wOworICBfX29iaiAqIHZvbGF0aWxlICogX19teV9mcmVlX2xpc3Q7CisgIF9fc3RhdGVfdHlwZSogX19hOworCisgIGlmIChfX24gPiBfTUFYX0JZVEVTKSB7CisgICAgICBfX21hbGxvY19hbGxvYzo6ZGVhbGxvY2F0ZShfX3AsIF9fbik7CisgICAgICByZXR1cm47CisgIH0KKworICBfX2EgPSBfU19nZXRfcGVyX3RocmVhZF9zdGF0ZSgpOworCisgIF9fbXlfZnJlZV9saXN0ID0gX19hLT5fX2ZyZWVfbGlzdCArIF9TX2ZyZWVsaXN0X2luZGV4KF9fbik7CisgIF9fcSAtPiBfX2ZyZWVfbGlzdF9saW5rID0gKl9fbXlfZnJlZV9saXN0OworICAqX19teV9mcmVlX2xpc3QgPSBfX3E7Cit9CisKKy8vIGJvcmlzIDogdmVyc2lvbnMgZm9yIHBlcl90aHJlYWRfYWxsb2NhdG9yCisvKiBuIG11c3QgYmUgPiAwICAgICAgKi8KK3ZvaWQgKl9QdGhyZWFkX2FsbG9jX2ltcGw6OmFsbG9jYXRlKHNpemVfdCYgX19uLCBfX3N0YXRlX3R5cGUqIF9fYSkgeworICB0eXBlZGVmIF9QdGhyZWFkX2FsbG9jX29iaiBfX29iajsKKyAgX19vYmogKiB2b2xhdGlsZSAqIF9fbXlfZnJlZV9saXN0OworICBfX29iaiAqIF9fcmVzdWx0OworCisgIGlmIChfX24gPiBfTUFYX0JZVEVTKSB7CisgICAgcmV0dXJuIF9fbWFsbG9jX2FsbG9jOjphbGxvY2F0ZShfX24pOworICB9CisgIF9fbiA9IF9TX3JvdW5kX3VwKF9fbik7CisKKyAgLy8gYm9yaXMgOiBoZXJlLCB3ZSBoYXZlIHRvIGxvY2sgcGVyIHRocmVhZCBzdGF0ZSwgYXMgd2UgbWF5IGJlIGdldHRpbmcgbWVtb3J5IGZyb20KKyAgLy8gZGlmZmVyZW50IHRocmVhZCBwb29sLgorICBfU1RMUF9hdXRvX2xvY2sgX19sb2NrKF9fYS0+X01fbG9jayk7CisKKyAgX19teV9mcmVlX2xpc3QgPSBfX2EtPl9fZnJlZV9saXN0ICsgX1NfZnJlZWxpc3RfaW5kZXgoX19uKTsKKyAgX19yZXN1bHQgPSAqX19teV9mcmVlX2xpc3Q7CisgIGlmIChfX3Jlc3VsdCA9PSAwKSB7CisgICAgdm9pZCAqX19yID0gX19hLT5fTV9yZWZpbGwoX19uKTsKKyAgICByZXR1cm4gX19yOworICB9CisgICpfX215X2ZyZWVfbGlzdCA9IF9fcmVzdWx0LT5fX2ZyZWVfbGlzdF9saW5rOworICByZXR1cm4gX19yZXN1bHQ7Cit9OworCisvKiBwIG1heSBub3QgYmUgMCAqLwordm9pZCBfUHRocmVhZF9hbGxvY19pbXBsOjpkZWFsbG9jYXRlKHZvaWQgKl9fcCwgc2l6ZV90IF9fbiwgX19zdGF0ZV90eXBlKiBfX2EpIHsKKyAgdHlwZWRlZiBfUHRocmVhZF9hbGxvY19vYmogX19vYmo7CisgIF9fb2JqICpfX3EgPSAoX19vYmogKilfX3A7CisgIF9fb2JqICogdm9sYXRpbGUgKiBfX215X2ZyZWVfbGlzdDsKKworICBpZiAoX19uID4gX01BWF9CWVRFUykgeworICAgIF9fbWFsbG9jX2FsbG9jOjpkZWFsbG9jYXRlKF9fcCwgX19uKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBib3JpcyA6IGhlcmUsIHdlIGhhdmUgdG8gbG9jayBwZXIgdGhyZWFkIHN0YXRlLCBhcyB3ZSBtYXkgYmUgcmV0dXJuaW5nIG1lbW9yeSBmcm9tCisgIC8vIGRpZmZlcmVudCB0aHJlYWQuCisgIF9TVExQX2F1dG9fbG9jayBfX2xvY2soX19hLT5fTV9sb2NrKTsKKworICBfX215X2ZyZWVfbGlzdCA9IF9fYS0+X19mcmVlX2xpc3QgKyBfU19mcmVlbGlzdF9pbmRleChfX24pOworICBfX3EgLT4gX19mcmVlX2xpc3RfbGluayA9ICpfX215X2ZyZWVfbGlzdDsKKyAgKl9fbXlfZnJlZV9saXN0ID0gX19xOworfQorCit2b2lkICpfUHRocmVhZF9hbGxvY19pbXBsOjpyZWFsbG9jYXRlKHZvaWQgKl9fcCwgc2l6ZV90IF9fb2xkX3N6LCBzaXplX3QmIF9fbmV3X3N6KSB7CisgIHZvaWQgKiBfX3Jlc3VsdDsKKyAgc2l6ZV90IF9fY29weV9zejsKKworICBpZiAoX19vbGRfc3ogPiBfTUFYX0JZVEVTICYmIF9fbmV3X3N6ID4gX01BWF9CWVRFUykgeworICAgIHJldHVybiByZWFsbG9jKF9fcCwgX19uZXdfc3opOworICB9CisKKyAgaWYgKF9TX3JvdW5kX3VwKF9fb2xkX3N6KSA9PSBfU19yb3VuZF91cChfX25ld19zeikpIHJldHVybiBfX3A7CisgIF9fcmVzdWx0ID0gYWxsb2NhdGUoX19uZXdfc3opOworICBfX2NvcHlfc3ogPSBfX25ld19zeiA+IF9fb2xkX3N6PyBfX29sZF9zeiA6IF9fbmV3X3N6OworICBtZW1jcHkoX19yZXN1bHQsIF9fcCwgX19jb3B5X3N6KTsKKyAgZGVhbGxvY2F0ZShfX3AsIF9fb2xkX3N6KTsKKyAgcmV0dXJuIF9fcmVzdWx0OworfQorCitfUHRocmVhZF9hbGxvY19wZXJfdGhyZWFkX3N0YXRlKiBfUHRocmVhZF9hbGxvY19pbXBsOjpfU19mcmVlX3Blcl90aHJlYWRfc3RhdGVzID0gMDsKK3B0aHJlYWRfa2V5X3QgX1B0aHJlYWRfYWxsb2NfaW1wbDo6X1Nfa2V5ID0gMDsKK19TVExQX1NUQVRJQ19NVVRFWCBfUHRocmVhZF9hbGxvY19pbXBsOjpfU19jaHVua19hbGxvY2F0b3JfbG9jayBfU1RMUF9NVVRFWF9JTklUSUFMSVpFUjsKK2Jvb2wgX1B0aHJlYWRfYWxsb2NfaW1wbDo6X1Nfa2V5X2luaXRpYWxpemVkID0gZmFsc2U7CitjaGFyICpfUHRocmVhZF9hbGxvY19pbXBsOjpfU19zdGFydF9mcmVlID0gMDsKK2NoYXIgKl9QdGhyZWFkX2FsbG9jX2ltcGw6Ol9TX2VuZF9mcmVlID0gMDsKK3NpemVfdCBfUHRocmVhZF9hbGxvY19pbXBsOjpfU19oZWFwX3NpemUgPSAwOworCit2b2lkICogX1NUTFBfQ0FMTCBfUHRocmVhZF9hbGxvYzo6YWxsb2NhdGUoc2l6ZV90JiBfX24pCit7IHJldHVybiBfUHRocmVhZF9hbGxvY19pbXBsOjphbGxvY2F0ZShfX24pOyB9Cit2b2lkIF9TVExQX0NBTEwgX1B0aHJlYWRfYWxsb2M6OmRlYWxsb2NhdGUodm9pZCAqX19wLCBzaXplX3QgX19uKQoreyBfUHRocmVhZF9hbGxvY19pbXBsOjpkZWFsbG9jYXRlKF9fcCwgX19uKTsgfQordm9pZCAqIF9TVExQX0NBTEwgX1B0aHJlYWRfYWxsb2M6OmFsbG9jYXRlKHNpemVfdCYgX19uLCBfX3N0YXRlX3R5cGUqIF9fYSkKK3sgcmV0dXJuIF9QdGhyZWFkX2FsbG9jX2ltcGw6OmFsbG9jYXRlKF9fbiwgX19hKTsgfQordm9pZCBfU1RMUF9DQUxMIF9QdGhyZWFkX2FsbG9jOjpkZWFsbG9jYXRlKHZvaWQgKl9fcCwgc2l6ZV90IF9fbiwgX19zdGF0ZV90eXBlKiBfX2EpCit7IF9QdGhyZWFkX2FsbG9jX2ltcGw6OmRlYWxsb2NhdGUoX19wLCBfX24sIF9fYSk7IH0KK3ZvaWQgKiBfU1RMUF9DQUxMIF9QdGhyZWFkX2FsbG9jOjpyZWFsbG9jYXRlKHZvaWQgKl9fcCwgc2l6ZV90IF9fb2xkX3N6LCBzaXplX3QmIF9fbmV3X3N6KQoreyByZXR1cm4gX1B0aHJlYWRfYWxsb2NfaW1wbDo6cmVhbGxvY2F0ZShfX3AsIF9fb2xkX3N6LCBfX25ld19zeik7IH0KK19QdGhyZWFkX2FsbG9jX3Blcl90aHJlYWRfc3RhdGUqIF9TVExQX0NBTEwgX1B0aHJlYWRfYWxsb2M6Ol9TX2dldF9wZXJfdGhyZWFkX3N0YXRlKCkKK3sgcmV0dXJuIF9QdGhyZWFkX2FsbG9jX2ltcGw6Ol9TX2dldF9wZXJfdGhyZWFkX3N0YXRlKCk7IH0KKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKKyNlbmRpZgorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyN1bmRlZiBfU19GUkVFTElTVF9JTkRFWApkaWZmIC0tZ2l0IGEvc3JjL2JpdHNldC5jcHAgYi9zcmMvYml0c2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGYxNzk5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2JpdHNldC5jcHAKQEAgLTAsMCArMSwxNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpbmNsdWRlICJzdGxwb3J0X3ByZWZpeC5oIgorCisjaW5jbHVkZSA8Yml0c2V0PgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIExvb2t1cCB0YWJsZXMgZm9yIGZpbmQgYW5kIGNvdW50IG9wZXJhdGlvbnMuCisKK3NpemVfdCBfQnNfRzo6X1NfY291bnQoY29uc3QgdW5zaWduZWQgY2hhciAqX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqX19sYXN0KQoreworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBfYml0X2NvdW50WzI1Nl0gPSB7CisgIDAsIC8qICAgMCAqLyAxLCAvKiAgIDEgKi8gMSwgLyogICAyICovIDIsIC8qICAgMyAqLyAxLCAvKiAgIDQgKi8KKyAgMiwgLyogICA1ICovIDIsIC8qICAgNiAqLyAzLCAvKiAgIDcgKi8gMSwgLyogICA4ICovIDIsIC8qICAgOSAqLworICAyLCAvKiAgMTAgKi8gMywgLyogIDExICovIDIsIC8qICAxMiAqLyAzLCAvKiAgMTMgKi8gMywgLyogIDE0ICovCisgIDQsIC8qICAxNSAqLyAxLCAvKiAgMTYgKi8gMiwgLyogIDE3ICovIDIsIC8qICAxOCAqLyAzLCAvKiAgMTkgKi8KKyAgMiwgLyogIDIwICovIDMsIC8qICAyMSAqLyAzLCAvKiAgMjIgKi8gNCwgLyogIDIzICovIDIsIC8qICAyNCAqLworICAzLCAvKiAgMjUgKi8gMywgLyogIDI2ICovIDQsIC8qICAyNyAqLyAzLCAvKiAgMjggKi8gNCwgLyogIDI5ICovCisgIDQsIC8qICAzMCAqLyA1LCAvKiAgMzEgKi8gMSwgLyogIDMyICovIDIsIC8qICAzMyAqLyAyLCAvKiAgMzQgKi8KKyAgMywgLyogIDM1ICovIDIsIC8qICAzNiAqLyAzLCAvKiAgMzcgKi8gMywgLyogIDM4ICovIDQsIC8qICAzOSAqLworICAyLCAvKiAgNDAgKi8gMywgLyogIDQxICovIDMsIC8qICA0MiAqLyA0LCAvKiAgNDMgKi8gMywgLyogIDQ0ICovCisgIDQsIC8qICA0NSAqLyA0LCAvKiAgNDYgKi8gNSwgLyogIDQ3ICovIDIsIC8qICA0OCAqLyAzLCAvKiAgNDkgKi8KKyAgMywgLyogIDUwICovIDQsIC8qICA1MSAqLyAzLCAvKiAgNTIgKi8gNCwgLyogIDUzICovIDQsIC8qICA1NCAqLworICA1LCAvKiAgNTUgKi8gMywgLyogIDU2ICovIDQsIC8qICA1NyAqLyA0LCAvKiAgNTggKi8gNSwgLyogIDU5ICovCisgIDQsIC8qICA2MCAqLyA1LCAvKiAgNjEgKi8gNSwgLyogIDYyICovIDYsIC8qICA2MyAqLyAxLCAvKiAgNjQgKi8KKyAgMiwgLyogIDY1ICovIDIsIC8qICA2NiAqLyAzLCAvKiAgNjcgKi8gMiwgLyogIDY4ICovIDMsIC8qICA2OSAqLworICAzLCAvKiAgNzAgKi8gNCwgLyogIDcxICovIDIsIC8qICA3MiAqLyAzLCAvKiAgNzMgKi8gMywgLyogIDc0ICovCisgIDQsIC8qICA3NSAqLyAzLCAvKiAgNzYgKi8gNCwgLyogIDc3ICovIDQsIC8qICA3OCAqLyA1LCAvKiAgNzkgKi8KKyAgMiwgLyogIDgwICovIDMsIC8qICA4MSAqLyAzLCAvKiAgODIgKi8gNCwgLyogIDgzICovIDMsIC8qICA4NCAqLworICA0LCAvKiAgODUgKi8gNCwgLyogIDg2ICovIDUsIC8qICA4NyAqLyAzLCAvKiAgODggKi8gNCwgLyogIDg5ICovCisgIDQsIC8qICA5MCAqLyA1LCAvKiAgOTEgKi8gNCwgLyogIDkyICovIDUsIC8qICA5MyAqLyA1LCAvKiAgOTQgKi8KKyAgNiwgLyogIDk1ICovIDIsIC8qICA5NiAqLyAzLCAvKiAgOTcgKi8gMywgLyogIDk4ICovIDQsIC8qICA5OSAqLworICAzLCAvKiAxMDAgKi8gNCwgLyogMTAxICovIDQsIC8qIDEwMiAqLyA1LCAvKiAxMDMgKi8gMywgLyogMTA0ICovCisgIDQsIC8qIDEwNSAqLyA0LCAvKiAxMDYgKi8gNSwgLyogMTA3ICovIDQsIC8qIDEwOCAqLyA1LCAvKiAxMDkgKi8KKyAgNSwgLyogMTEwICovIDYsIC8qIDExMSAqLyAzLCAvKiAxMTIgKi8gNCwgLyogMTEzICovIDQsIC8qIDExNCAqLworICA1LCAvKiAxMTUgKi8gNCwgLyogMTE2ICovIDUsIC8qIDExNyAqLyA1LCAvKiAxMTggKi8gNiwgLyogMTE5ICovCisgIDQsIC8qIDEyMCAqLyA1LCAvKiAxMjEgKi8gNSwgLyogMTIyICovIDYsIC8qIDEyMyAqLyA1LCAvKiAxMjQgKi8KKyAgNiwgLyogMTI1ICovIDYsIC8qIDEyNiAqLyA3LCAvKiAxMjcgKi8gMSwgLyogMTI4ICovIDIsIC8qIDEyOSAqLworICAyLCAvKiAxMzAgKi8gMywgLyogMTMxICovIDIsIC8qIDEzMiAqLyAzLCAvKiAxMzMgKi8gMywgLyogMTM0ICovCisgIDQsIC8qIDEzNSAqLyAyLCAvKiAxMzYgKi8gMywgLyogMTM3ICovIDMsIC8qIDEzOCAqLyA0LCAvKiAxMzkgKi8KKyAgMywgLyogMTQwICovIDQsIC8qIDE0MSAqLyA0LCAvKiAxNDIgKi8gNSwgLyogMTQzICovIDIsIC8qIDE0NCAqLworICAzLCAvKiAxNDUgKi8gMywgLyogMTQ2ICovIDQsIC8qIDE0NyAqLyAzLCAvKiAxNDggKi8gNCwgLyogMTQ5ICovCisgIDQsIC8qIDE1MCAqLyA1LCAvKiAxNTEgKi8gMywgLyogMTUyICovIDQsIC8qIDE1MyAqLyA0LCAvKiAxNTQgKi8KKyAgNSwgLyogMTU1ICovIDQsIC8qIDE1NiAqLyA1LCAvKiAxNTcgKi8gNSwgLyogMTU4ICovIDYsIC8qIDE1OSAqLworICAyLCAvKiAxNjAgKi8gMywgLyogMTYxICovIDMsIC8qIDE2MiAqLyA0LCAvKiAxNjMgKi8gMywgLyogMTY0ICovCisgIDQsIC8qIDE2NSAqLyA0LCAvKiAxNjYgKi8gNSwgLyogMTY3ICovIDMsIC8qIDE2OCAqLyA0LCAvKiAxNjkgKi8KKyAgNCwgLyogMTcwICovIDUsIC8qIDE3MSAqLyA0LCAvKiAxNzIgKi8gNSwgLyogMTczICovIDUsIC8qIDE3NCAqLworICA2LCAvKiAxNzUgKi8gMywgLyogMTc2ICovIDQsIC8qIDE3NyAqLyA0LCAvKiAxNzggKi8gNSwgLyogMTc5ICovCisgIDQsIC8qIDE4MCAqLyA1LCAvKiAxODEgKi8gNSwgLyogMTgyICovIDYsIC8qIDE4MyAqLyA0LCAvKiAxODQgKi8KKyAgNSwgLyogMTg1ICovIDUsIC8qIDE4NiAqLyA2LCAvKiAxODcgKi8gNSwgLyogMTg4ICovIDYsIC8qIDE4OSAqLworICA2LCAvKiAxOTAgKi8gNywgLyogMTkxICovIDIsIC8qIDE5MiAqLyAzLCAvKiAxOTMgKi8gMywgLyogMTk0ICovCisgIDQsIC8qIDE5NSAqLyAzLCAvKiAxOTYgKi8gNCwgLyogMTk3ICovIDQsIC8qIDE5OCAqLyA1LCAvKiAxOTkgKi8KKyAgMywgLyogMjAwICovIDQsIC8qIDIwMSAqLyA0LCAvKiAyMDIgKi8gNSwgLyogMjAzICovIDQsIC8qIDIwNCAqLworICA1LCAvKiAyMDUgKi8gNSwgLyogMjA2ICovIDYsIC8qIDIwNyAqLyAzLCAvKiAyMDggKi8gNCwgLyogMjA5ICovCisgIDQsIC8qIDIxMCAqLyA1LCAvKiAyMTEgKi8gNCwgLyogMjEyICovIDUsIC8qIDIxMyAqLyA1LCAvKiAyMTQgKi8KKyAgNiwgLyogMjE1ICovIDQsIC8qIDIxNiAqLyA1LCAvKiAyMTcgKi8gNSwgLyogMjE4ICovIDYsIC8qIDIxOSAqLworICA1LCAvKiAyMjAgKi8gNiwgLyogMjIxICovIDYsIC8qIDIyMiAqLyA3LCAvKiAyMjMgKi8gMywgLyogMjI0ICovCisgIDQsIC8qIDIyNSAqLyA0LCAvKiAyMjYgKi8gNSwgLyogMjI3ICovIDQsIC8qIDIyOCAqLyA1LCAvKiAyMjkgKi8KKyAgNSwgLyogMjMwICovIDYsIC8qIDIzMSAqLyA0LCAvKiAyMzIgKi8gNSwgLyogMjMzICovIDUsIC8qIDIzNCAqLworICA2LCAvKiAyMzUgKi8gNSwgLyogMjM2ICovIDYsIC8qIDIzNyAqLyA2LCAvKiAyMzggKi8gNywgLyogMjM5ICovCisgIDQsIC8qIDI0MCAqLyA1LCAvKiAyNDEgKi8gNSwgLyogMjQyICovIDYsIC8qIDI0MyAqLyA1LCAvKiAyNDQgKi8KKyAgNiwgLyogMjQ1ICovIDYsIC8qIDI0NiAqLyA3LCAvKiAyNDcgKi8gNSwgLyogMjQ4ICovIDYsIC8qIDI0OSAqLworICA2LCAvKiAyNTAgKi8gNywgLyogMjUxICovIDYsIC8qIDI1MiAqLyA3LCAvKiAyNTMgKi8gNywgLyogMjU0ICovCisgIDggIC8qIDI1NSAqLworICB9OworCisgIHNpemVfdCBfX3Jlc3VsdCgwKTsKKyAgd2hpbGUgKCBfX2ZpcnN0IDwgX19sYXN0ICkgeworICAgIF9fcmVzdWx0ICs9IF9iaXRfY291bnRbKihfX2ZpcnN0KyspXTsKKyAgfQorICByZXR1cm4gX19yZXN1bHQ7Cit9CisKK3Vuc2lnbmVkIGNoYXIgX0JzX0c6Ol9TX2ZpcnN0X29uZSh1bnNpZ25lZCBjaGFyIF9fYnl0ZSkKK3sKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgX2ZpcnN0X29uZVsyNTZdID0geworICAwLCAvKiAgIDAgKi8gMCwgLyogICAxICovIDEsIC8qICAgMiAqLyAwLCAvKiAgIDMgKi8gMiwgLyogICA0ICovCisgIDAsIC8qICAgNSAqLyAxLCAvKiAgIDYgKi8gMCwgLyogICA3ICovIDMsIC8qICAgOCAqLyAwLCAvKiAgIDkgKi8KKyAgMSwgLyogIDEwICovIDAsIC8qICAxMSAqLyAyLCAvKiAgMTIgKi8gMCwgLyogIDEzICovIDEsIC8qICAxNCAqLworICAwLCAvKiAgMTUgKi8gNCwgLyogIDE2ICovIDAsIC8qICAxNyAqLyAxLCAvKiAgMTggKi8gMCwgLyogIDE5ICovCisgIDIsIC8qICAyMCAqLyAwLCAvKiAgMjEgKi8gMSwgLyogIDIyICovIDAsIC8qICAyMyAqLyAzLCAvKiAgMjQgKi8KKyAgMCwgLyogIDI1ICovIDEsIC8qICAyNiAqLyAwLCAvKiAgMjcgKi8gMiwgLyogIDI4ICovIDAsIC8qICAyOSAqLworICAxLCAvKiAgMzAgKi8gMCwgLyogIDMxICovIDUsIC8qICAzMiAqLyAwLCAvKiAgMzMgKi8gMSwgLyogIDM0ICovCisgIDAsIC8qICAzNSAqLyAyLCAvKiAgMzYgKi8gMCwgLyogIDM3ICovIDEsIC8qICAzOCAqLyAwLCAvKiAgMzkgKi8KKyAgMywgLyogIDQwICovIDAsIC8qICA0MSAqLyAxLCAvKiAgNDIgKi8gMCwgLyogIDQzICovIDIsIC8qICA0NCAqLworICAwLCAvKiAgNDUgKi8gMSwgLyogIDQ2ICovIDAsIC8qICA0NyAqLyA0LCAvKiAgNDggKi8gMCwgLyogIDQ5ICovCisgIDEsIC8qICA1MCAqLyAwLCAvKiAgNTEgKi8gMiwgLyogIDUyICovIDAsIC8qICA1MyAqLyAxLCAvKiAgNTQgKi8KKyAgMCwgLyogIDU1ICovIDMsIC8qICA1NiAqLyAwLCAvKiAgNTcgKi8gMSwgLyogIDU4ICovIDAsIC8qICA1OSAqLworICAyLCAvKiAgNjAgKi8gMCwgLyogIDYxICovIDEsIC8qICA2MiAqLyAwLCAvKiAgNjMgKi8gNiwgLyogIDY0ICovCisgIDAsIC8qICA2NSAqLyAxLCAvKiAgNjYgKi8gMCwgLyogIDY3ICovIDIsIC8qICA2OCAqLyAwLCAvKiAgNjkgKi8KKyAgMSwgLyogIDcwICovIDAsIC8qICA3MSAqLyAzLCAvKiAgNzIgKi8gMCwgLyogIDczICovIDEsIC8qICA3NCAqLworICAwLCAvKiAgNzUgKi8gMiwgLyogIDc2ICovIDAsIC8qICA3NyAqLyAxLCAvKiAgNzggKi8gMCwgLyogIDc5ICovCisgIDQsIC8qICA4MCAqLyAwLCAvKiAgODEgKi8gMSwgLyogIDgyICovIDAsIC8qICA4MyAqLyAyLCAvKiAgODQgKi8KKyAgMCwgLyogIDg1ICovIDEsIC8qICA4NiAqLyAwLCAvKiAgODcgKi8gMywgLyogIDg4ICovIDAsIC8qICA4OSAqLworICAxLCAvKiAgOTAgKi8gMCwgLyogIDkxICovIDIsIC8qICA5MiAqLyAwLCAvKiAgOTMgKi8gMSwgLyogIDk0ICovCisgIDAsIC8qICA5NSAqLyA1LCAvKiAgOTYgKi8gMCwgLyogIDk3ICovIDEsIC8qICA5OCAqLyAwLCAvKiAgOTkgKi8KKyAgMiwgLyogMTAwICovIDAsIC8qIDEwMSAqLyAxLCAvKiAxMDIgKi8gMCwgLyogMTAzICovIDMsIC8qIDEwNCAqLworICAwLCAvKiAxMDUgKi8gMSwgLyogMTA2ICovIDAsIC8qIDEwNyAqLyAyLCAvKiAxMDggKi8gMCwgLyogMTA5ICovCisgIDEsIC8qIDExMCAqLyAwLCAvKiAxMTEgKi8gNCwgLyogMTEyICovIDAsIC8qIDExMyAqLyAxLCAvKiAxMTQgKi8KKyAgMCwgLyogMTE1ICovIDIsIC8qIDExNiAqLyAwLCAvKiAxMTcgKi8gMSwgLyogMTE4ICovIDAsIC8qIDExOSAqLworICAzLCAvKiAxMjAgKi8gMCwgLyogMTIxICovIDEsIC8qIDEyMiAqLyAwLCAvKiAxMjMgKi8gMiwgLyogMTI0ICovCisgIDAsIC8qIDEyNSAqLyAxLCAvKiAxMjYgKi8gMCwgLyogMTI3ICovIDcsIC8qIDEyOCAqLyAwLCAvKiAxMjkgKi8KKyAgMSwgLyogMTMwICovIDAsIC8qIDEzMSAqLyAyLCAvKiAxMzIgKi8gMCwgLyogMTMzICovIDEsIC8qIDEzNCAqLworICAwLCAvKiAxMzUgKi8gMywgLyogMTM2ICovIDAsIC8qIDEzNyAqLyAxLCAvKiAxMzggKi8gMCwgLyogMTM5ICovCisgIDIsIC8qIDE0MCAqLyAwLCAvKiAxNDEgKi8gMSwgLyogMTQyICovIDAsIC8qIDE0MyAqLyA0LCAvKiAxNDQgKi8KKyAgMCwgLyogMTQ1ICovIDEsIC8qIDE0NiAqLyAwLCAvKiAxNDcgKi8gMiwgLyogMTQ4ICovIDAsIC8qIDE0OSAqLworICAxLCAvKiAxNTAgKi8gMCwgLyogMTUxICovIDMsIC8qIDE1MiAqLyAwLCAvKiAxNTMgKi8gMSwgLyogMTU0ICovCisgIDAsIC8qIDE1NSAqLyAyLCAvKiAxNTYgKi8gMCwgLyogMTU3ICovIDEsIC8qIDE1OCAqLyAwLCAvKiAxNTkgKi8KKyAgNSwgLyogMTYwICovIDAsIC8qIDE2MSAqLyAxLCAvKiAxNjIgKi8gMCwgLyogMTYzICovIDIsIC8qIDE2NCAqLworICAwLCAvKiAxNjUgKi8gMSwgLyogMTY2ICovIDAsIC8qIDE2NyAqLyAzLCAvKiAxNjggKi8gMCwgLyogMTY5ICovCisgIDEsIC8qIDE3MCAqLyAwLCAvKiAxNzEgKi8gMiwgLyogMTcyICovIDAsIC8qIDE3MyAqLyAxLCAvKiAxNzQgKi8KKyAgMCwgLyogMTc1ICovIDQsIC8qIDE3NiAqLyAwLCAvKiAxNzcgKi8gMSwgLyogMTc4ICovIDAsIC8qIDE3OSAqLworICAyLCAvKiAxODAgKi8gMCwgLyogMTgxICovIDEsIC8qIDE4MiAqLyAwLCAvKiAxODMgKi8gMywgLyogMTg0ICovCisgIDAsIC8qIDE4NSAqLyAxLCAvKiAxODYgKi8gMCwgLyogMTg3ICovIDIsIC8qIDE4OCAqLyAwLCAvKiAxODkgKi8KKyAgMSwgLyogMTkwICovIDAsIC8qIDE5MSAqLyA2LCAvKiAxOTIgKi8gMCwgLyogMTkzICovIDEsIC8qIDE5NCAqLworICAwLCAvKiAxOTUgKi8gMiwgLyogMTk2ICovIDAsIC8qIDE5NyAqLyAxLCAvKiAxOTggKi8gMCwgLyogMTk5ICovCisgIDMsIC8qIDIwMCAqLyAwLCAvKiAyMDEgKi8gMSwgLyogMjAyICovIDAsIC8qIDIwMyAqLyAyLCAvKiAyMDQgKi8KKyAgMCwgLyogMjA1ICovIDEsIC8qIDIwNiAqLyAwLCAvKiAyMDcgKi8gNCwgLyogMjA4ICovIDAsIC8qIDIwOSAqLworICAxLCAvKiAyMTAgKi8gMCwgLyogMjExICovIDIsIC8qIDIxMiAqLyAwLCAvKiAyMTMgKi8gMSwgLyogMjE0ICovCisgIDAsIC8qIDIxNSAqLyAzLCAvKiAyMTYgKi8gMCwgLyogMjE3ICovIDEsIC8qIDIxOCAqLyAwLCAvKiAyMTkgKi8KKyAgMiwgLyogMjIwICovIDAsIC8qIDIyMSAqLyAxLCAvKiAyMjIgKi8gMCwgLyogMjIzICovIDUsIC8qIDIyNCAqLworICAwLCAvKiAyMjUgKi8gMSwgLyogMjI2ICovIDAsIC8qIDIyNyAqLyAyLCAvKiAyMjggKi8gMCwgLyogMjI5ICovCisgIDEsIC8qIDIzMCAqLyAwLCAvKiAyMzEgKi8gMywgLyogMjMyICovIDAsIC8qIDIzMyAqLyAxLCAvKiAyMzQgKi8KKyAgMCwgLyogMjM1ICovIDIsIC8qIDIzNiAqLyAwLCAvKiAyMzcgKi8gMSwgLyogMjM4ICovIDAsIC8qIDIzOSAqLworICA0LCAvKiAyNDAgKi8gMCwgLyogMjQxICovIDEsIC8qIDI0MiAqLyAwLCAvKiAyNDMgKi8gMiwgLyogMjQ0ICovCisgIDAsIC8qIDI0NSAqLyAxLCAvKiAyNDYgKi8gMCwgLyogMjQ3ICovIDMsIC8qIDI0OCAqLyAwLCAvKiAyNDkgKi8KKyAgMSwgLyogMjUwICovIDAsIC8qIDI1MSAqLyAyLCAvKiAyNTIgKi8gMCwgLyogMjUzICovIDEsIC8qIDI1NCAqLworICAwLCAvKiAyNTUgKi8KKyAgfTsKKyAgcmV0dXJuIF9maXJzdF9vbmVbX19ieXRlXTsKK30KKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK19TVExQX0VORF9OQU1FU1BBQ0UKZGlmZiAtLWdpdCBhL3NyYy9jX2xvY2FsZS5jIGIvc3JjL2NfbG9jYWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc2ZTIyZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jX2xvY2FsZS5jCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpbmNsdWRlICJzdGxwb3J0X3ByZWZpeC5oIgorCisjaW5jbHVkZSAiY19sb2NhbGUuaCIKKworI2lmIGRlZmluZWQgKF9TVExQX1dJTjMyKSAmJiAhZGVmaW5lZCAoX1NUTFBfV0NFKQorIyAgaW5jbHVkZSAiY19sb2NhbGVfd2luMzIvY19sb2NhbGVfd2luMzIuYyIKKyNlbGlmIGRlZmluZWQgKF9TVExQX1VTRV9HTElCQzJfTE9DQUxJWkFUSU9OKQorIyAgaW5jbHVkZSAiY19sb2NhbGVfZ2xpYmMvY19sb2NhbGVfZ2xpYmMyLmMiIC8qIGdsaWJjIDIuMiBhbmQgbmV3ZXIgKi8KKyNlbHNlCisjICBpbmNsdWRlICJjX2xvY2FsZV9kdW1teS9jX2xvY2FsZV9kdW1teS5jIgorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvY19sb2NhbGUuaCBiL3NyYy9jX2xvY2FsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ZDk5NjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY19sb2NhbGUuaApAQCAtMCwwICsxLDQ1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworLyoKKyAqIEl0IGlzIGltcG9zc2libGUgdG8gd3JpdGUgdGhlIEMrKyBsb2NhbGUgbGlicmFyeSBpbiB0ZXJtcyBvZiBsb2NhbGVzCisgKiBhcyBkZWZpbmVkIGluIHRoZSBDIHN0YW5kYXJkLiAgSW5zdGVhZCwgd2Ugd3JpdGUgdGhlIEMrKyBsb2NhbGUgYW5kIEkvTworICogbGlicmFyeSBpbiB0ZXJtcyBvZiBhIGxvdyBsZXZlbCBDLWxpa2UgaW50ZXJmYWNlLiAgVGhpcyBmaWxlIGRlZmluZXMKKyAqIHRoYXQgaW50ZXJmYWNlLgorICoKKyAqIFRoZSBsb3ctbGV2ZWwgbG9jYWxlIGludGVyZmFjZSBjYW4ndCBiZSB3cml0dGVuIHBvcnRhYmx5OyB0aGVyZQorICogbXVzdCBiZSBhIHZlcnNpb24gb2YgaXQgZm9yIGVhY2ggcGxhdGZvcm0gdGhhdCB0aGUgQysrIGxpYnJhcnkKKyAqIGlzIHBvcnRlZCB0by4gIE9uIG1hbnkgc3lzdGVtcyB0aGlzIGludGVyZmFjZSBtYXkgYmUgYSB0aGluIHdyYXBwZXIKKyAqIGZvciBleGlzdGluZyBmdW5jdGlvbmFsaXR5LgorICovCisKKyNpZm5kZWYgX1NUTFBfQ19MT0NBTEVfSU1QTF9ICisjZGVmaW5lIF9TVExQX0NfTE9DQUxFX0lNUExfSAorCisjaW5jbHVkZSAic3RscG9ydF9wcmVmaXguaCIKKworI2luY2x1ZGUgPHdjaGFyLmg+IC8qIGZvciBtYnN0YXRlX3QgKi8KKyNpbmNsdWRlIDxzdGwvY19sb2NhbGUuaD4KKworc3RydWN0IF9Mb2NhbGVfbmFtZV9oaW50OworCisjaWYgZGVmaW5lZCAoX0dOVV9TT1VSQ0UpICYmIGRlZmluZWQgKF9fR0xJQkNfXykgJiYgXAorICAgICgoX19HTElCQ19fID4gMikgfHwgKF9fR0xJQkNfXyA9PSAyICYmIF9fR0xJQkNfTUlOT1JfXyA+PSAyKSkKKyMgIGRlZmluZSBfU1RMUF9VU0VfR0xJQkMyX0xPQ0FMSVpBVElPTgorIyAgaW5jbHVkZSA8bmxfdHlwZXMuaD4KK3R5cGVkZWYgbmxfY2F0ZCBubF9jYXRkX3R5cGU7CisjZWxzZQordHlwZWRlZiBpbnQgbmxfY2F0ZF90eXBlOworI2VuZGlmCisKKy8qCisgKiBBIG51bWJlcjogdGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgc2ltcGxlIGxvY2FsZSBuYW1lLgorICogKGkuZS4gYSBuYW1lIGxpa2UgbGlrZSBlbl9VUywgYXMgb3Bwb3NlZCB0byBhIG5hbWUgbGlrZQorICogZW5fVVMvZGVfQVQvZGVfQVQvZXNfTVgvZW5fVVMvZW5fVVMpICovCisjZGVmaW5lIF9Mb2NhbGVfTUFYX1NJTVBMRV9OQU1FIDI1NgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qCisgKiBUeXBlZGVmczoKKyAqLwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgX0xvY2FsZV9tYXNrX3Q7CisKKy8qIEZ1bmN0aW9uIGNhbGxlZCBkdXJpbmcgU1RMcG9ydCBsaWJyYXJ5IGxvYWQgcGhhc2UuIE1pZ2h0IGNvbnRhaW4gYW55CisgKiBjb2RlIG5lY2Vzc2FyeSB0byB0aGUgcGxhdGZvcm0gbG9jYWxpemF0aW9uIGxheWVyLgorICovCit2b2lkIF9Mb2NhbGVfaW5pdCh2b2lkKTsKKworLyogRnVuY3Rpb24gY2FsbGVkIGR1cmluZyBTVExwb3J0IGxpYnJhcnkgdW5sb2FkLiBNaWdodCBjb250YWluIGFueQorICogY29kZSBuZWNlc3NhcnkgdG8gdGhlIHBsYXRmb3JtIGxvY2FsaXphdGlvbiBsYXllci4KKyAqLwordm9pZCBfTG9jYWxlX2ZpbmFsKHZvaWQpOworCisvKiBDcmVhdGUgYSBjYXRlZ29yeSBvZiB0aGUgbG9jYWxlIHdpdGggdGhlIGdpdmVuIG5hbWUuCisgKgorICogVGhlIGNoYXIqIGFyZ3VtZW50IGlzIGEgc2ltcGxlIChub3QgYSBjb21wb3NpdGUpIGxvY2FsZSBuYW1lLCB3aGljaCBtYXkKKyAqIG5laXRoZXIgYmUgYW4gZW1wdHkgc3RyaW5nIG5vciBhIG51bGwgcG9pbnRlci4KKyAqCisgKiBUaGVzZSBmdW5jdGlvbnMgcmV0dXJuIE5VTEwgdG8gaW5kaWNhdGUgZmFpbHVyZS4gRmFpbHVyZSByZWFzb24gc2hvdWxkIGJlIHJlcG9ydGVkCisgKiB1c2luZyB0aGUgX19lcnJfY29kZSBwb2ludGVyLgorICovCitzdHJ1Y3QgX0xvY2FsZV9jdHlwZSogX0xvY2FsZV9jdHlwZV9jcmVhdGUoY29uc3QgY2hhciAqLCBzdHJ1Y3QgX0xvY2FsZV9uYW1lX2hpbnQqLCBpbnQgKiAvKiBfX2Vycl9jb2RlICovKTsKK3N0cnVjdCBfTG9jYWxlX2NvZGVjdnQqIF9Mb2NhbGVfY29kZWN2dF9jcmVhdGUoY29uc3QgY2hhciAqLCBzdHJ1Y3QgX0xvY2FsZV9uYW1lX2hpbnQqLCBpbnQgKiAvKiBfX2Vycl9jb2RlICovKTsKK3N0cnVjdCBfTG9jYWxlX251bWVyaWMqIF9Mb2NhbGVfbnVtZXJpY19jcmVhdGUoY29uc3QgY2hhciAqLCBzdHJ1Y3QgX0xvY2FsZV9uYW1lX2hpbnQqLCBpbnQgKiAvKiBfX2Vycl9jb2RlICovKTsKK3N0cnVjdCBfTG9jYWxlX3RpbWUqIF9Mb2NhbGVfdGltZV9jcmVhdGUoY29uc3QgY2hhciAqLCBzdHJ1Y3QgX0xvY2FsZV9uYW1lX2hpbnQqLCBpbnQgKiAvKiBfX2Vycl9jb2RlICovKTsKK3N0cnVjdCBfTG9jYWxlX2NvbGxhdGUqIF9Mb2NhbGVfY29sbGF0ZV9jcmVhdGUoY29uc3QgY2hhciAqLCBzdHJ1Y3QgX0xvY2FsZV9uYW1lX2hpbnQqLCBpbnQgKiAvKiBfX2Vycl9jb2RlICovKTsKK3N0cnVjdCBfTG9jYWxlX21vbmV0YXJ5KiBfTG9jYWxlX21vbmV0YXJ5X2NyZWF0ZShjb25zdCBjaGFyICosIHN0cnVjdCBfTG9jYWxlX25hbWVfaGludCosIGludCAqIC8qIF9fZXJyX2NvZGUgKi8pOworc3RydWN0IF9Mb2NhbGVfbWVzc2FnZXMqIF9Mb2NhbGVfbWVzc2FnZXNfY3JlYXRlKGNvbnN0IGNoYXIgKiwgc3RydWN0IF9Mb2NhbGVfbmFtZV9oaW50KiwgaW50ICogLyogX19lcnJfY29kZSAqLyk7CisKKy8qIEdpdmUgZXJyb3IgcmVhc29uIG9uIGZhaWx1cmUgb2Ygb25lIG9mIHRoZSBfTG9jYWxlXypfY3JlYXRlIGZ1bmN0aW9ucy4gQXZhaWxhYmxlCisgKiByZWFzb25zIGFyZToKKyAqIDA6IE5vIHNwZWNpZmljIGVycm9yIHJlYXNvbiBoYXMgYmVlbiByZXBvcnRlZC4KKyAqIDE6IE5vIHBsYXRmb3JtIHN1cHBvcnQgZm9yIHRoZSBnaXZlbiBmYWNldC4KKyAqIDI6IFVua25vd24gbG9jYWxlIG5hbWUKKyAqIDM6IE5vIHBsYXRmb3JtIEFQSSBmb3IgbG9jYWxpemF0aW9uIHN1cHBvcnQuCisgKiA0OiBObyBtb3JlIG1lbW9yeQorICovCisjZGVmaW5lIF9TVExQX0xPQ19VTkRFRklORUQgMAorI2RlZmluZSBfU1RMUF9MT0NfVU5TVVBQT1JURURfRkFDRVRfQ0FURUdPUlkgMQorI2RlZmluZSBfU1RMUF9MT0NfVU5LTk9XTl9OQU1FIDIKKyNkZWZpbmUgX1NUTFBfTE9DX05PX1BMQVRGT1JNX1NVUFBPUlQgMworI2RlZmluZSBfU1RMUF9MT0NfTk9fTUVNT1JZIDQKKworLyogUmVsZWFzZSBhIGNhdGVnb3J5IG9mIGEgbG9jYWxlCisgKgorICogVGhlc2UgZnVuY3Rpb25zIGFyZSB1c2VkIHRvIHJlbGVhc2UgYSBjYXRlZ29yeSBhY3F1aXJlZCB3aXRoIHRoZQorICogYWNjb3JkaW5nIF9Mb2NhbGVfKl9jcmVhdGUoKSBmdW5jdGlvbnMuCisgKi8KK3ZvaWQgX0xvY2FsZV9jdHlwZV9kZXN0cm95KHN0cnVjdCBfTG9jYWxlX2N0eXBlICopOwordm9pZCBfTG9jYWxlX2NvZGVjdnRfZGVzdHJveShzdHJ1Y3QgX0xvY2FsZV9jb2RlY3Z0ICopOwordm9pZCBfTG9jYWxlX251bWVyaWNfZGVzdHJveShzdHJ1Y3QgX0xvY2FsZV9udW1lcmljICopOwordm9pZCBfTG9jYWxlX3RpbWVfZGVzdHJveShzdHJ1Y3QgX0xvY2FsZV90aW1lICopOwordm9pZCBfTG9jYWxlX2NvbGxhdGVfZGVzdHJveShzdHJ1Y3QgX0xvY2FsZV9jb2xsYXRlICopOwordm9pZCBfTG9jYWxlX21vbmV0YXJ5X2Rlc3Ryb3koc3RydWN0IF9Mb2NhbGVfbW9uZXRhcnkgKik7Cit2b2lkIF9Mb2NhbGVfbWVzc2FnZXNfZGVzdHJveShzdHJ1Y3QgX0xvY2FsZV9tZXNzYWdlcyAqKTsKKworLyoKKyAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHVzZXIncyBkZWZhdWx0IGxvY2FsZSBpbiBlYWNoCisgKiBjYXRlZ29yeSwgYXMgYSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nLiAgQSBOVUxMIHZhbHVlCisgKiBtZWFucyB0aGUgZGVmYXVsdCAiQyIgbG9jYWxlLgorICovCitjb25zdCBjaGFyICogX0xvY2FsZV9jdHlwZV9kZWZhdWx0KGNoYXIgKiBfX2J1Zik7Citjb25zdCBjaGFyICogX0xvY2FsZV9udW1lcmljX2RlZmF1bHQoY2hhciAqIF9fYnVmKTsKK2NvbnN0IGNoYXIgKiBfTG9jYWxlX3RpbWVfZGVmYXVsdChjaGFyICogX19idWYpOworY29uc3QgY2hhciAqIF9Mb2NhbGVfY29sbGF0ZV9kZWZhdWx0KGNoYXIgKiBfX2J1Zik7Citjb25zdCBjaGFyICogX0xvY2FsZV9tb25ldGFyeV9kZWZhdWx0KGNoYXIgKiBfX2J1Zik7Citjb25zdCBjaGFyICogX0xvY2FsZV9tZXNzYWdlc19kZWZhdWx0KGNoYXIgKiBfX2J1Zik7CisKKy8qIFJldHJpZXZlIHRoZSBuYW1lIG9mIHRoZSBnaXZlbiBjYXRlZ29yeQorICoKKyAqIF9fYnVmIHBvaW50cyB0byBhIGJ1ZmZlciB0aGF0IGNhbiBob2xkIGF0IGxlYXN0IF9Mb2NhbGVfTUFYX1NJTVBMRV9OQU1FCisgKiBjaGFyYWN0ZXJzLiAgVGhlc2UgZnVuY3Rpb25zIHN0b3JlIHRoZSBuYW1lLCBhcyBhIG51bGwtdGVybWluYXRlZAorICogc3RyaW5nLCBpbiBfX2J1Zi4gVGhpcyBmdW5jdGlvbiBjYW4ndCBmYWlsLCBhdCB3b3JzdCBuYW1lIGlzIHRydW5jYXRlZC4KKyAqLworY2hhciBjb25zdCogX0xvY2FsZV9jdHlwZV9uYW1lKGNvbnN0IHN0cnVjdCBfTG9jYWxlX2N0eXBlICosIGNoYXIqIF9fYnVmKTsKK2NoYXIgY29uc3QqIF9Mb2NhbGVfY29kZWN2dF9uYW1lKGNvbnN0IHN0cnVjdCBfTG9jYWxlX2NvZGVjdnQgKiwgY2hhciogX19idWYpOworY2hhciBjb25zdCogX0xvY2FsZV9udW1lcmljX25hbWUoY29uc3Qgc3RydWN0IF9Mb2NhbGVfbnVtZXJpYyAqLCBjaGFyKiBfX2J1Zik7CitjaGFyIGNvbnN0KiBfTG9jYWxlX3RpbWVfbmFtZShjb25zdCBzdHJ1Y3QgX0xvY2FsZV90aW1lICosIGNoYXIqIF9fYnVmKTsKK2NoYXIgY29uc3QqIF9Mb2NhbGVfY29sbGF0ZV9uYW1lKGNvbnN0IHN0cnVjdCBfTG9jYWxlX2NvbGxhdGUgKiwgY2hhciogIF9fYnVmKTsKK2NoYXIgY29uc3QqIF9Mb2NhbGVfbW9uZXRhcnlfbmFtZShjb25zdCBzdHJ1Y3QgX0xvY2FsZV9tb25ldGFyeSAqLCBjaGFyKiBfX2J1Zik7CitjaGFyIGNvbnN0KiBfTG9jYWxlX21lc3NhZ2VzX25hbWUoY29uc3Qgc3RydWN0IF9Mb2NhbGVfbWVzc2FnZXMgKiwgY2hhciogX19idWYpOworCisvKgorICogY25hbWUgaXMgYSAocG9zc2libHkgY29tcG9zaXRlKSBsb2NhbGUgbmFtZS0tLWkuZS4gYSBuYW1lIHRoYXQgY2FuCisgKiBiZSBwYXNzZWQgdG8gc2V0bG9jYWxlLiBfX2J1ZiBwb2ludHMgdG8gYW4gYXJyYXkgbGFyZ2UgZW5vdWdoIHRvCisgKiBzdG9yZSBhdCBsZWFzdCBfTG9jYWxlX01BWF9TSU1QTEVfTkFNRSBjaGFyYWN0ZXJzLCBhbmQgZWFjaCBvZiB0aGVzZQorICogZnVuY3Rpb25zIGV4dHJhY3RzIHRoZSBuYW1lIG9mIGEgc2luZ2xlIGNhdGVnb3J5LCBzdG9yZXMgaXQgaW4gYnVmCisgKiBhcyBhIG51bGwtdGVybWluYXRlZCBzdHJpbmcsIGFuZCByZXR1cm5zIGJ1Zi4KKyAqLworY2hhciBjb25zdCogX0xvY2FsZV9leHRyYWN0X2N0eXBlX25hbWUoY29uc3QgY2hhciAqY25hbWUsIGNoYXIgKl9fYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IF9Mb2NhbGVfbmFtZV9oaW50KiBfX2hpbnQsIGludCAqX19lcnJfY29kZSk7CitjaGFyIGNvbnN0KiBfTG9jYWxlX2V4dHJhY3RfbnVtZXJpY19uYW1lKGNvbnN0IGNoYXIgKmNuYW1lLCBjaGFyICpfX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IF9Mb2NhbGVfbmFtZV9oaW50KiBfX2hpbnQsIGludCAqX19lcnJfY29kZSk7CitjaGFyIGNvbnN0KiBfTG9jYWxlX2V4dHJhY3RfdGltZV9uYW1lKGNvbnN0IGNoYXIgKmNuYW1lLCBjaGFyICpfX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IF9Mb2NhbGVfbmFtZV9oaW50KiBfX2hpbnQsIGludCAqX19lcnJfY29kZSk7CitjaGFyIGNvbnN0KiBfTG9jYWxlX2V4dHJhY3RfY29sbGF0ZV9uYW1lKGNvbnN0IGNoYXIgKmNuYW1lLCBjaGFyICpfX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IF9Mb2NhbGVfbmFtZV9oaW50KiBfX2hpbnQsIGludCAqX19lcnJfY29kZSk7CitjaGFyIGNvbnN0KiBfTG9jYWxlX2V4dHJhY3RfbW9uZXRhcnlfbmFtZShjb25zdCBjaGFyICpjbmFtZSwgY2hhciAqX19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgX0xvY2FsZV9uYW1lX2hpbnQqIF9faGludCwgaW50ICpfX2Vycl9jb2RlKTsKK2NoYXIgY29uc3QqIF9Mb2NhbGVfZXh0cmFjdF9tZXNzYWdlc19uYW1lKGNvbnN0IGNoYXIgKmNuYW1lLCBjaGFyICpfX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBfTG9jYWxlX25hbWVfaGludCogX19oaW50LCBpbnQgKl9fZXJyX2NvZGUpOworCisvKiBGdW5jdGlvbnMgdG8gaW1wcm92ZSBsb2NhbGUgY3JlYXRpb24gcHJvY2Vzcy4gRm9yIHNvbWUgbG9jYWxlIEFQSSAoV2luMzIpCisgKiB5b3UgbmVlZCB0byBmaW5kIGEgbG9jYWxlIGlkZW50aWZpY2F0aW9uIGZyb20gdGhlIG5hbWUgd2hpY2ggY2FuIGJlIGEKKyAqIHJhdGhlciBleHBlbnNpdmUgb3BlcmF0aW9uIGVzcGVjaWFsbHkgaWYgeW91IGRvIHNvIGZvciBhbGwgZmFjZXRzIG9mIGEKKyAqIGxvY2FsZS4gVGhvc2UgZnVuY3Rpb25zIGNhbiBiZSB1c2VkIHRvIGV4dHJhY3QgZnJvbSBhIEFQSSBkZXBlbmRlbnQgZmFjZXQKKyAqIHN0cnVjdCB0aGUgaW5mb3JtYXRpb24gbmVjZXNzYXJ5IHRvIHNraXAgdGhpcyBsb29rdXAgcHJvY2VzcyBmb3Igb3RoZXIKKyAqIGZhY2V0cyBjcmVhdGlvbi4gSWYgbm90IHN1cHBvcnRlZCB0aG9zZSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIE5VTEwuCisgKi8KK3N0cnVjdCBfTG9jYWxlX25hbWVfaGludCogX0xvY2FsZV9nZXRfY3R5cGVfaGludChzdHJ1Y3QgX0xvY2FsZV9jdHlwZSopOworc3RydWN0IF9Mb2NhbGVfbmFtZV9oaW50KiBfTG9jYWxlX2dldF9udW1lcmljX2hpbnQoc3RydWN0IF9Mb2NhbGVfbnVtZXJpYyopOworc3RydWN0IF9Mb2NhbGVfbmFtZV9oaW50KiBfTG9jYWxlX2dldF90aW1lX2hpbnQoc3RydWN0IF9Mb2NhbGVfdGltZSopOworc3RydWN0IF9Mb2NhbGVfbmFtZV9oaW50KiBfTG9jYWxlX2dldF9jb2xsYXRlX2hpbnQoc3RydWN0IF9Mb2NhbGVfY29sbGF0ZSopOworc3RydWN0IF9Mb2NhbGVfbmFtZV9oaW50KiBfTG9jYWxlX2dldF9tb25ldGFyeV9oaW50KHN0cnVjdCBfTG9jYWxlX21vbmV0YXJ5Kik7CitzdHJ1Y3QgX0xvY2FsZV9uYW1lX2hpbnQqIF9Mb2NhbGVfZ2V0X21lc3NhZ2VzX2hpbnQoc3RydWN0IF9Mb2NhbGVfbWVzc2FnZXMqKTsKKworLyoKKyAqIEZVTkNUSU9OUyBUSEFUIFVTRSBDVFlQRQorICovCisKKy8qCisgKiBOYXJyb3cgY2hhcmFjdGVyIGZ1bmN0aW9uczoKKyAqLworCisvKgorICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgY3R5cGUgdGFibGUuICBUaGUgdGFibGUgaXMKKyAqIGF0IGxlYXN0IDI1NyBieXRlcyBsb25nOyBpZiBwIGlzIHRoZSBwb2ludGVyIHJldHVybmVkIGJ5IHRoaXMKKyAqIGZ1bmN0aW9uLCB0aGVuIHBbY10gaXMgdmFsaWQgaWYgYyBpcyBFT0Ygb3IgaWYgcCBpcyBhbnkgdmFsdWUgb2YKKyAqIHR5cGUgdW5zaWduZWQgY2hhci4KKyAqLworY29uc3QgX0xvY2FsZV9tYXNrX3QgKiBfTG9jYWxlX2N0eXBlX3RhYmxlKHN0cnVjdCBfTG9jYWxlX2N0eXBlICopOworCisvKgorICogYyBpcyBlaXRoZXIgRU9GLCBvciBhbiB1bnNpZ25lZCBjaGFyIHZhbHVlLgorICovCitpbnQgX0xvY2FsZV90b3VwcGVyKHN0cnVjdCBfTG9jYWxlX2N0eXBlICosIGludCAvKiBjICovKTsKK2ludCBfTG9jYWxlX3RvbG93ZXIoc3RydWN0IF9Mb2NhbGVfY3R5cGUgKiwgaW50IC8qIGMgKi8pOworCisKKyNpZm5kZWYgX1NUTFBfTk9fV0NIQVJfVAorLyoKKyAqIFdpZGUgY2hhcmFjdGVyIGZ1bmN0aW9uczoKKyAqLworX0xvY2FsZV9tYXNrX3QgX1dMb2NhbGVfY3R5cGUoc3RydWN0IF9Mb2NhbGVfY3R5cGUgKiwgd2ludF90LCBfTG9jYWxlX21hc2tfdCk7Cit3aW50X3QgX1dMb2NhbGVfdG9sb3dlcihzdHJ1Y3QgX0xvY2FsZV9jdHlwZSAqLCB3aW50X3QpOword2ludF90IF9XTG9jYWxlX3RvdXBwZXIoc3RydWN0IF9Mb2NhbGVfY3R5cGUgKiwgd2ludF90KTsKKworLyoKKyAqIE11bHRpYnl0ZSBmdW5jdGlvbnM6CisgKi8KKworLyoKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBvZiB0aGUgbG9uZ2VzdCBhbGxvd2VkIG11bHRpYnl0ZQorICogY2hhcmFjdGVyIGluIHRoZSBjdXJyZW50IGVuY29kaW5nLgorICovCitpbnQgX1dMb2NhbGVfbWJfY3VyX21heChzdHJ1Y3QgX0xvY2FsZV9jb2RlY3Z0ICopOworCisvKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIHRoZSBzaG9ydGVzdCBhbGxvd2VkIG11bHRpYnl0ZQorICogY2hhcmFjdGVyIGluIHRoZSBjdXJyZW50IGVuY29kaW5nLgorICovCitpbnQgX1dMb2NhbGVfbWJfY3VyX21pbihzdHJ1Y3QgX0xvY2FsZV9jb2RlY3Z0ICopOworCisvKgorICogUmV0dXJucyAxIGlmIHRoZSBjdXJyZW50IG11bHRpYnl0ZSBlbmNvZGluZyBpcyBzdGF0ZWxlc3MKKyAqIGFuZCBkb2VzIG5vdCByZXF1aXJlIHRoZSB1c2Ugb2YgYW4gbWJzdGF0ZV90IHZhbHVlLgorICovCitpbnQgX1dMb2NhbGVfaXNfc3RhdGVsZXNzKHN0cnVjdCBfTG9jYWxlX2NvZGVjdnQgKik7CisKKy8qCisgKiBBbG1vc3QgaWRlbnRpY2FsIHRvIG1icnRvd2MsIGZyb20gNC42LjUuMy4yIG9mIE5BMS4gIFRoZSBvbmx5CisgKiBpbXBvcnRhbnQgZGlmZmVyZW5jZSBpcyB0aGF0IG1icnRvd2MgdHJlYXRzIG51bGwgd2lkZSBjaGFyYWN0ZXJzCisgKiBhcyBzcGVjaWFsLCBhbmQgd2UgZG9uJ3QuICBTcGVjaWZpY2FsbHk6IGV4YW1pbmVzIHRoZSBjaGFyYWN0ZXJzCisgKiBpbiBbZnJvbSwgZnJvbSArIG4pLCBleHRyYWN0cyBhIHNpbmdsZSB3aWRlIGNoYXJhY3RlciwgYW5kIHN0b3JlcworICogaXQgaW4gKnRvLiAgTW9kaWZpZXMgc2hpZnRfc3RhdGUgaWYgYXBwcm9wcmlhdGUuICBUaGUgcmV0dXJuIHZhbHVlLAorICogd2hpY2ggaXMgYWx3YXlzIHBvc2l0aXZlLCBpcyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZXh0cmFjdGVkIGZyb20KKyAqIHRoZSBpbnB1dCBzZXF1ZW5jZS4gIFJldHVybiB2YWx1ZSBpcyAoc2l6ZV90KSAtMSBpZiB0aGVyZSB3YXMgYW4KKyAqIGVuY29kaW5nIGVycm9yIGluIHRoZSBpbnB1dCBzZXF1ZW5jZSwgYW5kIChzaXplX3QpIC0yIGlmCisgKiBbZnJvbSwgZnJvbSArIG4pIGlzIGNvcnJlY3QgYnV0IG5vdCBjb21wbGV0ZS4gIE5vbmUgb2YgdGhlIHBvaW50ZXIKKyAqIGFyZ3VtZW50cyBtYXkgYmUgbnVsbCBwb2ludGVycy4KKyAqLworc2l6ZV90IF9XTG9jYWxlX21idG93YyhzdHJ1Y3QgX0xvY2FsZV9jb2RlY3Z0ICosCisgICAgICAgICAgICAgICAgICAgICAgIHdjaGFyX3QgKiAvKiB0byAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIC8qIGZyb20gKi8sIHNpemVfdCAvKiBuICovLAorICAgICAgICAgICAgICAgICAgICAgICBtYnN0YXRlX3QgKik7CisKKy8qCisgKiBBZ2FpbiwgdmVyeSBzaW1pbGFyIHRvIHdjcnRvbWIuICBUaGUgZGlmZmVyZW5jZXMgYXJlIHRoYXQgKDEpIGl0CisgKiBkb2Vzbid0IHRyZWF0IG51bGwgY2hhcmFjdGVycyBhcyBzcGVjaWFsOyBhbmQgKDIpIGl0IHN0b3JlcyBhdCBtb3N0CisgKiBuIGNoYXJhY3RlcnMuICBDb252ZXJ0cyBjIHRvIGEgbXVsdGlieXRlIHNlcXVlbmNlLCBzdG9yZXMgdGhhdAorICogc2VxdWVuY2UgaW4gdGhlIGFycmF5ICd0bycsIGFuZCByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIHNlcXVlbmNlLgorICogTW9kaWZpZXMgc2hpZnRfc3RhdGUgaWYgYXBwcm9wcmlhdGUuICBUaGUgcmV0dXJuIHZhbHVlIGlzIChzaXplX3QpIC0xCisgKiBpZiBjIGlzIG5vdCBhIHZhbGlkIHdpZGUgY2hhcmFjdGVyLCBhbmQgKHNpemVfdCkgLTIgaWYgdGhlIGxlbmd0aCBvZgorICogdGhlIG11bHRpYnl0ZSBjaGFyYWN0ZXIgc2VxdWVuY2UgaXMgZ3JlYXRlciB0aGFuIG4uCisgKi8KK3NpemVfdCBfV0xvY2FsZV93Y3RvbWIoc3RydWN0IF9Mb2NhbGVfY29kZWN2dCAqLAorICAgICAgICAgICAgICAgICAgICAgICBjaGFyICosIHNpemVfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgbWJzdGF0ZV90ICopOworCisvKgorICogSW5zZXJ0cyB3aGF0ZXZlciBjaGFyYWN0ZXJzIGFyZSBuZWNlc3NhcnkgdG8gcmVzdG9yZSBzdCB0byBhbgorICogaW5pdGlhbCBzaGlmdCBzdGF0ZS4gIFNldHMgKm5leHQgdG8gYnVmICsgbSwgd2hlcmUgbSBpcyB0aGUgbnVtYmVyCisgKiBvZiBjaGFyYWN0ZXJzIGluc2VydGVkLiAgKDAgPD0gbSA8PSBuLikgIFJldHVybnMgbSB0byBpbmRpY2F0ZQorICogc3VjY2VzcywgKHNpemVfdCkgLTEgdG8gaW5kaWNhdGUgZXJyb3IsIChzaXplX3QpIC0yIHRvIGluZGljYXRlCisgKiBwYXJ0aWFsIHN1Y2Nlc3MgKG1vcmUgdGhhbiBuIGNoYXJhY3RlcnMgbmVlZGVkKS4gIEZvciBzdWNjZXNzIG9yIHBhcnRpYWwKKyAqIHN1Y2Nlc3MsIHNldHMgKm5leHQgdG8gYnVmICsgbS4KKyAqLworc2l6ZV90IF9XTG9jYWxlX3Vuc2hpZnQoc3RydWN0IF9Mb2NhbGVfY29kZWN2dCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgbWJzdGF0ZV90ICosCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICosIHNpemVfdCwgY2hhciAqKik7CisjZW5kaWYKKworLyoKKyAqIEZVTkNUSU9OUyBUSEFUIFVTRSBDT0xMQVRFCisgKi8KKworLyoKKyAqIENvbXBhcmVzIHRoZSB0d28gc2VxdWVuY2VzIFtzMSwgczEgKyBuMSkgYW5kIFtzMiwgczIgKyBuMikuICBOZWl0aGVyCisgKiBzZXF1ZW5jZSBpcyBhc3N1bWVkIHRvIGJlIG51bGwtdGVybWluYXRlZCwgYW5kIG51bGwgY2hhcmFjdGVycworICogYXJlbid0IHNwZWNpYWwuICBJZiB0aGUgdHdvIHNlcXVlbmNlcyBhcmUgdGhlIHNhbWUgdXAgdGhyb3VnaAorICogbWluKG4xLCBuMiksIHRoZW4gdGhlIHNlcXVlbmNlIHRoYXQgY29tcGFyZXMgbGVzcyBpcyB3aGljaGV2ZXIgb25lCisgKiBpcyBzaG9ydGVyLgorICovCitpbnQgX0xvY2FsZV9zdHJjbXAoc3RydWN0IF9Mb2NhbGVfY29sbGF0ZSAqLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiAvKiBzMSAqLywgc2l6ZV90IC8qIG4xICovLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiAvKiBzMiAqLywgc2l6ZV90IC8qIG4yICovKTsKKyNpZm5kZWYgX1NUTFBfTk9fV0NIQVJfVAoraW50IF9XTG9jYWxlX3N0cmNtcChzdHJ1Y3QgX0xvY2FsZV9jb2xsYXRlICosCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QgKiAvKiBzMSAqLywgc2l6ZV90IC8qIG4xICovLAorICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90ICogLyogczIgKi8sIHNpemVfdCAvKiBuMiAqLyk7CisjZW5kaWYKKworLyoKKyAqIENyZWF0ZXMgYSB0cmFuc2Zvcm1lZCB2ZXJzaW9uIG9mIHRoZSBzdHJpbmcgW3MyLCBzMiArIG4yKS4gIFRoZQorICogc3RyaW5nIG1heSBjb250YWluIGVtYmVkZGVkIG51bGwgY2hhcmFjdGVyczsgbnVsbHMgYXJlbid0IHNwZWNpYWwuCisgKiBUaGUgdHJhbnNmb3JtZWQgc3RyaW5nIGJlZ2lucyBhdCBzMSwgYW5kIGNvbnRhaW5zIGF0IG1vc3QgbjEKKyAqIGNoYXJhY3RlcnMuICBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBsZW5ndGggb2YgdGhlIHRyYW5zZm9ybWVkCisgKiBzdHJpbmcuICBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBuMSB0aGVuIHRoaXMgaXMgYW4KKyAqIGVycm9yIGNvbmRpdGlvbjogaXQgaW5kaWNhdGVzIHRoYXQgdGhlcmUgd2Fzbid0IGVub3VnaCBzcGFjZS4gIEluCisgKiB0aGF0IGNhc2UsIHRoZSBjb250ZW50cyBvZiBbczEsIHMxICsgbjEpIGlzIHVuc3BlY2lmaWVkLgorKi8KK3NpemVfdCBfTG9jYWxlX3N0cnhmcm0oc3RydWN0IF9Mb2NhbGVfY29sbGF0ZSAqLAorICAgICAgICAgICAgICAgICAgICAgICBjaGFyICogLyogczEgKi8sIHNpemVfdCAvKiBuMSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIC8qIHMyICovLCBzaXplX3QgLyogbjIgKi8pOworCisjaWZuZGVmIF9TVExQX05PX1dDSEFSX1QKK3NpemVfdCBfV0xvY2FsZV9zdHJ4ZnJtKHN0cnVjdCBfTG9jYWxlX2NvbGxhdGUgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHdjaGFyX3QgKiAvKiBzMSAqLywgc2l6ZV90IC8qIG4xICovLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCAqIC8qIHMyICovLCBzaXplX3QgLyogbjIgKi8pOworI2VuZGlmCisKKworLyoKKyAqIEZVTkNUSU9OUyBUSEFUIFVTRSBOVU1FUklDCisgKi8KKworLyoKKyAqIEVxdWl2YWxlbnQgdG8gdGhlIGZpcnN0IHRocmVlIGZpZWxkcyBpbiBzdHJ1Y3QgbGNvbnYuICAoQyBzdGFuZGFyZCwKKyAqIHNlY3Rpb24gNy40LikKKyAqLworY2hhciBfTG9jYWxlX2RlY2ltYWxfcG9pbnQoc3RydWN0IF9Mb2NhbGVfbnVtZXJpYyAqKTsKK2NoYXIgX0xvY2FsZV90aG91c2FuZHNfc2VwKHN0cnVjdCBfTG9jYWxlX251bWVyaWMgKik7Citjb25zdCBjaGFyICogX0xvY2FsZV9ncm91cGluZyhzdHJ1Y3QgX0xvY2FsZV9udW1lcmljICopOworCisjaWZuZGVmIF9TVExQX05PX1dDSEFSX1QKK3djaGFyX3QgX1dMb2NhbGVfZGVjaW1hbF9wb2ludChzdHJ1Y3QgX0xvY2FsZV9udW1lcmljICopOword2NoYXJfdCBfV0xvY2FsZV90aG91c2FuZHNfc2VwKHN0cnVjdCBfTG9jYWxlX251bWVyaWMgKik7CisjZW5kaWYKKworLyoKKyAqIFJldHVybiAidHJ1ZSIgYW5kICJmYWxzZSIgaW4gRW5nbGlzaCBsb2NhbGVzLCBhbmQgc29tZXRoaW5nCisgKiBhcHByb3ByaWF0ZSBpbiBub24tRW5nbGlzaCBsb2NhbGVzLgorICovCitjb25zdCBjaGFyICogX0xvY2FsZV90cnVlKHN0cnVjdCBfTG9jYWxlX251bWVyaWMgKik7Citjb25zdCBjaGFyICogX0xvY2FsZV9mYWxzZShzdHJ1Y3QgX0xvY2FsZV9udW1lcmljICopOworCisjaWZuZGVmIF9TVExQX05PX1dDSEFSX1QKK2NvbnN0IHdjaGFyX3QgKiBfV0xvY2FsZV90cnVlKHN0cnVjdCBfTG9jYWxlX251bWVyaWMgKiwgd2NoYXJfdCogLyogYnVmICovLCBzaXplX3QgLyogYnVmU2l6ZSAqLyk7Citjb25zdCB3Y2hhcl90ICogX1dMb2NhbGVfZmFsc2Uoc3RydWN0IF9Mb2NhbGVfbnVtZXJpYyAqLCB3Y2hhcl90KiAvKiBidWYgKi8sIHNpemVfdCAvKiBidWZTaXplICovKTsKKyNlbmRpZgorCisvKgorICogRlVOQ1RJT05TIFRIQVQgVVNFIE1PTkVUQVJZCisgKi8KKworLyoKKyAqIFJldHVybiB0aGUgb2J2aW91cyBmaWVsZHMgb2Ygc3RydWN0IGxjb252LgorICovCitjb25zdCBjaGFyICogX0xvY2FsZV9pbnRfY3Vycl9zeW1ib2woc3RydWN0IF9Mb2NhbGVfbW9uZXRhcnkgKik7Citjb25zdCBjaGFyICogX0xvY2FsZV9jdXJyZW5jeV9zeW1ib2woc3RydWN0IF9Mb2NhbGVfbW9uZXRhcnkgKik7CitjaGFyICAgICAgICAgX0xvY2FsZV9tb25fZGVjaW1hbF9wb2ludChzdHJ1Y3QgX0xvY2FsZV9tb25ldGFyeSAqKTsKK2NoYXIgICAgICAgICBfTG9jYWxlX21vbl90aG91c2FuZHNfc2VwKHN0cnVjdCBfTG9jYWxlX21vbmV0YXJ5ICopOworY29uc3QgY2hhciAqIF9Mb2NhbGVfbW9uX2dyb3VwaW5nKHN0cnVjdCBfTG9jYWxlX21vbmV0YXJ5ICopOworY29uc3QgY2hhciAqIF9Mb2NhbGVfcG9zaXRpdmVfc2lnbihzdHJ1Y3QgX0xvY2FsZV9tb25ldGFyeSAqKTsKK2NvbnN0IGNoYXIgKiBfTG9jYWxlX25lZ2F0aXZlX3NpZ24oc3RydWN0IF9Mb2NhbGVfbW9uZXRhcnkgKik7CitjaGFyICAgICAgICAgX0xvY2FsZV9pbnRfZnJhY19kaWdpdHMoc3RydWN0IF9Mb2NhbGVfbW9uZXRhcnkgKik7CitjaGFyICAgICAgICAgX0xvY2FsZV9mcmFjX2RpZ2l0cyhzdHJ1Y3QgX0xvY2FsZV9tb25ldGFyeSAqKTsKK2ludCAgICAgICAgICBfTG9jYWxlX3BfY3NfcHJlY2VkZXMoc3RydWN0IF9Mb2NhbGVfbW9uZXRhcnkgKik7CitpbnQgICAgICAgICAgX0xvY2FsZV9wX3NlcF9ieV9zcGFjZShzdHJ1Y3QgX0xvY2FsZV9tb25ldGFyeSAqKTsKK2ludCAgICAgICAgICBfTG9jYWxlX3Bfc2lnbl9wb3NuKHN0cnVjdCBfTG9jYWxlX21vbmV0YXJ5ICopOworaW50ICAgICAgICAgIF9Mb2NhbGVfbl9jc19wcmVjZWRlcyhzdHJ1Y3QgX0xvY2FsZV9tb25ldGFyeSAqKTsKK2ludCAgICAgICAgICBfTG9jYWxlX25fc2VwX2J5X3NwYWNlKHN0cnVjdCBfTG9jYWxlX21vbmV0YXJ5ICopOworaW50ICAgICAgICAgIF9Mb2NhbGVfbl9zaWduX3Bvc24oc3RydWN0IF9Mb2NhbGVfbW9uZXRhcnkgKik7CisKKyNpZm5kZWYgX1NUTFBfTk9fV0NIQVJfVAorY29uc3Qgd2NoYXJfdCAqIF9XTG9jYWxlX2ludF9jdXJyX3N5bWJvbChzdHJ1Y3QgX0xvY2FsZV9tb25ldGFyeSAqLCB3Y2hhcl90KiAvKiBidWYgKi8sIHNpemVfdCAvKiBidWZTaXplICovKTsKK2NvbnN0IHdjaGFyX3QgKiBfV0xvY2FsZV9jdXJyZW5jeV9zeW1ib2woc3RydWN0IF9Mb2NhbGVfbW9uZXRhcnkgKiwgd2NoYXJfdCogLyogYnVmICovLCBzaXplX3QgLyogYnVmU2l6ZSAqLyk7Cit3Y2hhcl90ICAgICAgICAgX1dMb2NhbGVfbW9uX2RlY2ltYWxfcG9pbnQoc3RydWN0IF9Mb2NhbGVfbW9uZXRhcnkgKik7Cit3Y2hhcl90ICAgICAgICAgX1dMb2NhbGVfbW9uX3Rob3VzYW5kc19zZXAoc3RydWN0IF9Mb2NhbGVfbW9uZXRhcnkgKik7Citjb25zdCB3Y2hhcl90ICogX1dMb2NhbGVfcG9zaXRpdmVfc2lnbihzdHJ1Y3QgX0xvY2FsZV9tb25ldGFyeSAqLCB3Y2hhcl90KiAvKiBidWYgKi8sIHNpemVfdCAvKiBidWZTaXplICovKTsKK2NvbnN0IHdjaGFyX3QgKiBfV0xvY2FsZV9uZWdhdGl2ZV9zaWduKHN0cnVjdCBfTG9jYWxlX21vbmV0YXJ5ICosIHdjaGFyX3QqIC8qIGJ1ZiAqLywgc2l6ZV90IC8qIGJ1ZlNpemUgKi8pOworI2VuZGlmCisKKy8qCisgKiBGVU5DVElPTlMgVEhBVCBVU0UgVElNRQorICovCisKKy8qCisgKiBtb250aCBpcyBpbiB0aGUgcmFuZ2UgWzAsIDEyKS4KKyAqLworY29uc3QgY2hhciAqIF9Mb2NhbGVfZnVsbF9tb250aG5hbWUoc3RydWN0IF9Mb2NhbGVfdGltZSAqLCBpbnQgLyogbW9udGggKi8pOworY29uc3QgY2hhciAqIF9Mb2NhbGVfYWJicmV2X21vbnRobmFtZShzdHJ1Y3QgX0xvY2FsZV90aW1lICosIGludCAvKiBtb250aCAqLyk7CisKKyNpZm5kZWYgX1NUTFBfTk9fV0NIQVJfVAorY29uc3Qgd2NoYXJfdCAqIF9XTG9jYWxlX2Z1bGxfbW9udGhuYW1lKHN0cnVjdCBfTG9jYWxlX3RpbWUgKiwgaW50IC8qIG1vbnRoICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdjaGFyX3QqIC8qIGJ1ZiAqLywgc2l6ZV90IC8qIGJ1ZlNpemUgKi8pOworY29uc3Qgd2NoYXJfdCAqIF9XTG9jYWxlX2FiYnJldl9tb250aG5hbWUoc3RydWN0IF9Mb2NhbGVfdGltZSAqLCBpbnQgLyogbW9udGggKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Y2hhcl90KiAvKiBidWYgKi8sIHNpemVfdCAvKiBidWZTaXplICovKTsKKyNlbmRpZgorCisvKgorICogZGF5IGlzIGluIHRoZSByYW5nZSBbMCwgNykuICBTdW5kYXkgaXMgMC4KKyAqLworY29uc3QgY2hhciAqIF9Mb2NhbGVfZnVsbF9kYXlvZndlZWsoc3RydWN0IF9Mb2NhbGVfdGltZSAqLCBpbnQgLyogZGF5ICovKTsKK2NvbnN0IGNoYXIgKiBfTG9jYWxlX2FiYnJldl9kYXlvZndlZWsoc3RydWN0IF9Mb2NhbGVfdGltZSAqLCBpbnQgLyogZGF5ICovKTsKKworI2lmbmRlZiBfU1RMUF9OT19XQ0hBUl9UCitjb25zdCB3Y2hhcl90ICogX1dMb2NhbGVfZnVsbF9kYXlvZndlZWsoc3RydWN0IF9Mb2NhbGVfdGltZSAqLCBpbnQgLyogZGF5ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdjaGFyX3QqIC8qIGJ1ZiAqLywgc2l6ZV90IC8qIGJ1ZlNpemUgKi8pOworY29uc3Qgd2NoYXJfdCAqIF9XTG9jYWxlX2FiYnJldl9kYXlvZndlZWsoc3RydWN0IF9Mb2NhbGVfdGltZSAqLCBpbnQgLyogZGF5ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2NoYXJfdCogLyogYnVmICovLCBzaXplX3QgLyogYnVmU2l6ZSAqLyk7CisjZW5kaWYKKworY29uc3QgY2hhciAqIF9Mb2NhbGVfZF90X2ZtdChzdHJ1Y3QgX0xvY2FsZV90aW1lICopOworY29uc3QgY2hhciAqIF9Mb2NhbGVfZF9mbXQoc3RydWN0IF9Mb2NhbGVfdGltZSAqKTsKK2NvbnN0IGNoYXIgKiBfTG9jYWxlX3RfZm10KHN0cnVjdCBfTG9jYWxlX3RpbWUgKik7Citjb25zdCBjaGFyICogX0xvY2FsZV9sb25nX2RfdF9mbXQoc3RydWN0IF9Mb2NhbGVfdGltZSopOworY29uc3QgY2hhciAqIF9Mb2NhbGVfbG9uZ19kX2ZtdChzdHJ1Y3QgX0xvY2FsZV90aW1lKik7CisKK2NvbnN0IGNoYXIgKiBfTG9jYWxlX2FtX3N0cihzdHJ1Y3QgX0xvY2FsZV90aW1lICopOworY29uc3QgY2hhciAqIF9Mb2NhbGVfcG1fc3RyKHN0cnVjdCBfTG9jYWxlX3RpbWUgKik7CisKKyNpZm5kZWYgX1NUTFBfTk9fV0NIQVJfVAorY29uc3Qgd2NoYXJfdCAqIF9XTG9jYWxlX2FtX3N0cihzdHJ1Y3QgX0xvY2FsZV90aW1lICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdjaGFyX3QqIC8qIGJ1ZiAqLywgc2l6ZV90IC8qIGJ1ZlNpemUgKi8pOworY29uc3Qgd2NoYXJfdCAqIF9XTG9jYWxlX3BtX3N0cihzdHJ1Y3QgX0xvY2FsZV90aW1lICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdjaGFyX3QqIC8qIGJ1ZiAqLywgc2l6ZV90IC8qIGJ1ZlNpemUgKi8pOworI2VuZGlmCisKKy8qCisgKiBGVU5DVElPTlMgVEhBVCBVU0UgTUVTU0FHRVMKKyAqLworCisvKgorICogVmVyeSBzaW1pbGFyIHRvIGNhdG9wZW4sIGV4Y2VwdCB0aGF0IGl0IHVzZXMgdGhlIGdpdmVuIG1lc3NhZ2UKKyAqIGNhdGVnb3J5IHRvIGRldGVybWluZSB3aGljaCBjYXRhbG9nIHRvIG9wZW4uCisgKi8KK25sX2NhdGRfdHlwZSBfTG9jYWxlX2NhdG9wZW4oc3RydWN0IF9Mb2NhbGVfbWVzc2FnZXMqLCBjb25zdCBjaGFyKik7CisKKy8qIENvbXBsZW1lbnRhcnkgdG8gX0xvY2FsZV9jYXRvcGVuLgorICogVGhlIGNhdGFsb2cgbXVzdCBiZSBhIHZhbHVlIHRoYXQgd2FzIHJldHVybmVkIGJ5IGEgcHJldmlvdXMgY2FsbAorICogdG8gX0xvY2FsZV9jYXRvcGVuLgorICovCit2b2lkIF9Mb2NhbGVfY2F0Y2xvc2Uoc3RydWN0IF9Mb2NhbGVfbWVzc2FnZXMqLCBubF9jYXRkX3R5cGUpOworCisvKgorICogUmV0dXJucyBhIHN0cmluZywgaWRlbnRpZmllZCBieSBhIHNldCBpbmRleCBhbmQgYSBtZXNzYWdlIGluZGV4LAorICogZnJvbSBhbiBvcGVuZWQgbWVzc2FnZSBjYXRhbG9nLiAgUmV0dXJucyB0aGUgc3VwcGxpZWQgZGVmYXVsdCBpZgorICogbm8gc3VjaCBzdHJpbmcgZXhpc3RzLgorICovCitjb25zdCBjaGFyICogX0xvY2FsZV9jYXRnZXRzKHN0cnVjdCBfTG9jYWxlX21lc3NhZ2VzICosIG5sX2NhdGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50LCBpbnQsY29uc3QgY2hhciAqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9TVExQX0NfTE9DQUxFX0lNUExfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NfbG9jYWxlX2R1bW15L2NfbG9jYWxlX2R1bW15LmMgYi9zcmMvY19sb2NhbGVfZHVtbXkvY19sb2NhbGVfZHVtbXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTQ4ZjIzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NfbG9jYWxlX2R1bW15L2NfbG9jYWxlX2R1bW15LmMKQEAgLTAsMCArMSw0ODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKy8qIFRoaXMgaXMgYSAic3R1YiIgaW1wbGVtZW50YXRpb24gb2YgdGhlICJjX2xvY2FsZS5oIiBpbnRlcmZhY2UsCisgICBpbnRlbmRlZCBmb3Igb3BlcmF0aW5nIHN5c3RlbXMgd2hlcmUgd2UgaGF2ZSBub3QgeWV0IHdyaXR0ZW4KKyAgIGEgcmVhbCBpbXBsZW1lbnRhdGlvbi4gIEEgQysrIGxpYnJhcnkgdXNpbmcgdGhpcyBzdHViIGltcGxlbWVudGF0aW9uCisgICBpcyBzdGlsbCBzdGFuZGFyZC1jb25mb3JtaW5nLCBzaW5jZSB0aGUgQysrIHN0YW5kYXJkIGRvZXMgbm90IHJlcXVpcmUKKyAgIHRoYXQgYW55IGxvY2FsZXMgb3RoZXIgdGhhbiAiQyIgYmUgc3VwcG9ydGVkLgorKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHdjaGFyLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDx3Y3R5cGUuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9TQUZFX1NUUklOR19GVU5DVElPTlMpCisjICBkZWZpbmUgX1NUTFBfU1RSTkNQWShELCBEUywgUywgQykgc3RybmNweV9zKEQsIERTLCBTLCBDKQorIyAgaWYgIWRlZmluZWQgKF9TVExQX05PX1dDSEFSX1QpCisjICAgIGRlZmluZSBfU1RMUF9XQ1NOQ1BZKEQsIERTLCBTLCBDKSB3Y3NuY3B5X3MoRCwgRFMsIFMsIEMpCisjICBlbmRpZgorI2Vsc2UKKyMgIGRlZmluZSBfU1RMUF9TVFJOQ1BZKEQsIERTLCBTLCBDKSBzdHJuY3B5KEQsIFMsIEMpCisjICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkKKyMgICAgZGVmaW5lIF9TVExQX1dDU05DUFkoRCwgRFMsIFMsIEMpIHdjc25jcHkoRCwgUywgQykKKyMgIGVuZGlmCisjZW5kaWYKKworc3RhdGljIGNvbnN0IGNoYXIgKl9DX25hbWUgPSAiQyI7CitzdGF0aWMgY29uc3QgY2hhciAqX2VtcHR5X3N0ciA9ICIiOworI2lmbmRlZiBfU1RMUF9OT19XQ0hBUl9UCitzdGF0aWMgY29uc3Qgd2NoYXJfdCAqX2VtcHR5X3dzdHIgPSBMIiI7CisjZW5kaWYKKworc3RhdGljIF9Mb2NhbGVfbWFza190IGN0YWJsZVsyNTZdOworCisvKiBGcmFtZXdvcmsgZnVuY3Rpb25zICovCisKK3ZvaWQgX0xvY2FsZV9pbml0KHZvaWQpIHsKKyAgLyogQ3R5cGUgdGFibGUgZm9yIHRoZSBBU0NJSSBjaGFyYWN0ZXIgc2V0LiAqLworICBjaGFyIGM7CisgIC8qIFdlIG1pZ2h0IG5ldmVyIHJlYWNoIDEyOCB3aGVuIGNoYXIgaXMgc2lnbmVkLiAqLworICBmb3IgKGMgPSAwOyAvKiBjICE9IDEyOCAqLzsgKytjKSB7CisgICAgaWYgKGlzYWxwaGEoYykpIGN0YWJsZVsodW5zaWduZWQgY2hhciljXSB8PSBfTG9jYWxlX0FMUEhBOworICAgIGlmIChpc2NudHJsKGMpKSBjdGFibGVbKHVuc2lnbmVkIGNoYXIpY10gfD0gX0xvY2FsZV9DTlRSTDsKKyAgICBpZiAoaXNkaWdpdChjKSkgY3RhYmxlWyh1bnNpZ25lZCBjaGFyKWNdIHw9IF9Mb2NhbGVfRElHSVQ7CisgICAgaWYgKGlzcHJpbnQoYykpIGN0YWJsZVsodW5zaWduZWQgY2hhciljXSB8PSBfTG9jYWxlX1BSSU5UOworICAgIGlmIChpc3B1bmN0KGMpKSBjdGFibGVbKHVuc2lnbmVkIGNoYXIpY10gfD0gX0xvY2FsZV9QVU5DVDsKKyAgICBpZiAoaXNzcGFjZShjKSkgY3RhYmxlWyh1bnNpZ25lZCBjaGFyKWNdIHw9IF9Mb2NhbGVfU1BBQ0U7CisgICAgaWYgKGlzeGRpZ2l0KGMpKSBjdGFibGVbKHVuc2lnbmVkIGNoYXIpY10gfD0gX0xvY2FsZV9YRElHSVQ7CisgICAgaWYgKGlzdXBwZXIoYykpIGN0YWJsZVsodW5zaWduZWQgY2hhciljXSB8PSBfTG9jYWxlX1VQUEVSOworICAgIGlmIChpc2xvd2VyKGMpKSBjdGFibGVbKHVuc2lnbmVkIGNoYXIpY10gfD0gX0xvY2FsZV9MT1dFUjsKKyAgICBpZiAoYyA9PSAxMjcpIGJyZWFrOworICB9CisKKyAgLyogQVNDSUkgaXMgYSA3LWJpdCBjb2RlLCBzbyBldmVyeXRoaW5nIGVsc2UgaXMgbm9uLUFTQ0lJLiAqLworICBtZW1zZXQoJihjdGFibGVbMTI4XSksIDAsIDEyOCAqIHNpemVvZihfTG9jYWxlX21hc2tfdCkpOworfQorCit2b2lkIF9Mb2NhbGVfZmluYWwodm9pZCkKK3t9CisKK3ZvaWQqIF9Mb2NhbGVfY3JlYXRlKGNvbnN0IGNoYXIqIG5hbWUsIGludCAqX19lcnJfY29kZSkgeworICBpZiAobmFtZVswXSA9PSAnQycgJiYgbmFtZVsxXSA9PSAwKQorICB7IHJldHVybiAodm9pZCopMHgxOyB9CisgICpfX2Vycl9jb2RlID0gX1NUTFBfTE9DX05PX1BMQVRGT1JNX1NVUFBPUlQ7IHJldHVybiAwOworfQorCitzdHJ1Y3QgX0xvY2FsZV9jdHlwZSogX0xvY2FsZV9jdHlwZV9jcmVhdGUoY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgX0xvY2FsZV9uYW1lX2hpbnQqIGhpbnQsIGludCAqX19lcnJfY29kZSkKK3sgcmV0dXJuIChzdHJ1Y3QgX0xvY2FsZV9jdHlwZSopX0xvY2FsZV9jcmVhdGUobmFtZSwgX19lcnJfY29kZSk7IH0KKworc3RydWN0IF9Mb2NhbGVfY29kZWN2dCogX0xvY2FsZV9jb2RlY3Z0X2NyZWF0ZShjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgX0xvY2FsZV9uYW1lX2hpbnQqIGhpbnQsIGludCAqX19lcnJfY29kZSkKK3sgcmV0dXJuIChzdHJ1Y3QgX0xvY2FsZV9jb2RlY3Z0KilfTG9jYWxlX2NyZWF0ZShuYW1lLCBfX2Vycl9jb2RlKTsgfQorCitzdHJ1Y3QgX0xvY2FsZV9udW1lcmljKiBfTG9jYWxlX251bWVyaWNfY3JlYXRlKGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBfTG9jYWxlX25hbWVfaGludCogaGludCwgaW50ICpfX2Vycl9jb2RlKQoreyByZXR1cm4gKHN0cnVjdCBfTG9jYWxlX251bWVyaWMqKV9Mb2NhbGVfY3JlYXRlKG5hbWUsIF9fZXJyX2NvZGUpOyB9CisKK3N0cnVjdCBfTG9jYWxlX3RpbWUqIF9Mb2NhbGVfdGltZV9jcmVhdGUoY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IF9Mb2NhbGVfbmFtZV9oaW50KiBoaW50LCBpbnQgKl9fZXJyX2NvZGUpCit7IHJldHVybiAoc3RydWN0IF9Mb2NhbGVfdGltZSopX0xvY2FsZV9jcmVhdGUobmFtZSwgX19lcnJfY29kZSk7IH0KKworc3RydWN0IF9Mb2NhbGVfY29sbGF0ZSogX0xvY2FsZV9jb2xsYXRlX2NyZWF0ZShjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgX0xvY2FsZV9uYW1lX2hpbnQqIGhpbnQsIGludCAqX19lcnJfY29kZSkKK3sgcmV0dXJuIChzdHJ1Y3QgX0xvY2FsZV9jb2xsYXRlKilfTG9jYWxlX2NyZWF0ZShuYW1lLCBfX2Vycl9jb2RlKTsgfQorCitzdHJ1Y3QgX0xvY2FsZV9tb25ldGFyeSogX0xvY2FsZV9tb25ldGFyeV9jcmVhdGUoY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgX0xvY2FsZV9uYW1lX2hpbnQqIGhpbnQsIGludCAqX19lcnJfY29kZSkKK3sgcmV0dXJuIChzdHJ1Y3QgX0xvY2FsZV9tb25ldGFyeSopX0xvY2FsZV9jcmVhdGUobmFtZSwgX19lcnJfY29kZSk7IH0KKworc3RydWN0IF9Mb2NhbGVfbWVzc2FnZXMqIF9Mb2NhbGVfbWVzc2FnZXNfY3JlYXRlKGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IF9Mb2NhbGVfbmFtZV9oaW50KiBoaW50LCBpbnQgKl9fZXJyX2NvZGUpCit7IHJldHVybiAoc3RydWN0IF9Mb2NhbGVfbWVzc2FnZXMqKV9Mb2NhbGVfY3JlYXRlKG5hbWUsIF9fZXJyX2NvZGUpOyB9CisKK2NvbnN0IGNoYXIgKl9Mb2NhbGVfY3R5cGVfZGVmYXVsdChjaGFyKiBidWYpICAgIHsgcmV0dXJuIF9DX25hbWU7IH0KK2NvbnN0IGNoYXIgKl9Mb2NhbGVfbnVtZXJpY19kZWZhdWx0KGNoYXIgKiBidWYpIHsgcmV0dXJuIF9DX25hbWU7IH0KK2NvbnN0IGNoYXIgKl9Mb2NhbGVfdGltZV9kZWZhdWx0KGNoYXIqIGJ1ZikgICAgIHsgcmV0dXJuIF9DX25hbWU7IH0KK2NvbnN0IGNoYXIgKl9Mb2NhbGVfY29sbGF0ZV9kZWZhdWx0KGNoYXIqIGJ1ZikgIHsgcmV0dXJuIF9DX25hbWU7IH0KK2NvbnN0IGNoYXIgKl9Mb2NhbGVfbW9uZXRhcnlfZGVmYXVsdChjaGFyKiBidWYpIHsgcmV0dXJuIF9DX25hbWU7IH0KK2NvbnN0IGNoYXIgKl9Mb2NhbGVfbWVzc2FnZXNfZGVmYXVsdChjaGFyKiBidWYpIHsgcmV0dXJuIF9DX25hbWU7IH0KKworY2hhciBjb25zdCogX0xvY2FsZV9jdHlwZV9uYW1lKGNvbnN0IHN0cnVjdCBfTG9jYWxlX2N0eXBlICpsY3R5cGUsIGNoYXIqIGJ1ZikKK3sgcmV0dXJuIF9DX25hbWU7IH0KKworY2hhciBjb25zdCogX0xvY2FsZV9jb2RlY3Z0X25hbWUoY29uc3Qgc3RydWN0IF9Mb2NhbGVfY29kZWN2dCAqbGNvZGVjdnQsIGNoYXIqIGJ1ZikKK3sgcmV0dXJuIF9DX25hbWU7IH0KKworY2hhciBjb25zdCogX0xvY2FsZV9udW1lcmljX25hbWUoY29uc3Qgc3RydWN0IF9Mb2NhbGVfbnVtZXJpYyAqbG51bSwgY2hhciogYnVmKQoreyByZXR1cm4gX0NfbmFtZTsgfQorCitjaGFyIGNvbnN0KiBfTG9jYWxlX3RpbWVfbmFtZShjb25zdCBzdHJ1Y3QgX0xvY2FsZV90aW1lICpsdGltZSwgY2hhciogYnVmKQoreyByZXR1cm4gX0NfbmFtZTsgfQorCitjaGFyIGNvbnN0KiBfTG9jYWxlX2NvbGxhdGVfbmFtZShjb25zdCBzdHJ1Y3QgX0xvY2FsZV9jb2xsYXRlICpsY29sLCBjaGFyKiBidWYpCit7IHJldHVybiBfQ19uYW1lOyB9CisKK2NoYXIgY29uc3QqIF9Mb2NhbGVfbW9uZXRhcnlfbmFtZShjb25zdCBzdHJ1Y3QgX0xvY2FsZV9tb25ldGFyeSAqbG1vbiwgY2hhciogYnVmKQoreyByZXR1cm4gX0NfbmFtZTsgfQorCitjaGFyIGNvbnN0KiBfTG9jYWxlX21lc3NhZ2VzX25hbWUoY29uc3Qgc3RydWN0IF9Mb2NhbGVfbWVzc2FnZXMgKmxtZXMsIGNoYXIqIGJ1ZikKK3sgcmV0dXJuIF9DX25hbWU7IH0KKwordm9pZCBfTG9jYWxlX2N0eXBlX2Rlc3Ryb3koc3RydWN0IF9Mb2NhbGVfY3R5cGUgKmxjdHlwZSkgICAgIHt9Cit2b2lkIF9Mb2NhbGVfY29kZWN2dF9kZXN0cm95KHN0cnVjdCBfTG9jYWxlX2NvZGVjdnQgKmxjb2RlY3Z0KSAgIHt9Cit2b2lkIF9Mb2NhbGVfbnVtZXJpY19kZXN0cm95KHN0cnVjdCBfTG9jYWxlX251bWVyaWMgKmxudW0pICAge30KK3ZvaWQgX0xvY2FsZV90aW1lX2Rlc3Ryb3koc3RydWN0IF9Mb2NhbGVfdGltZSAqbHRpbWUpICAgICAgICB7fQordm9pZCBfTG9jYWxlX2NvbGxhdGVfZGVzdHJveShzdHJ1Y3QgX0xvY2FsZV9jb2xsYXRlICpsY29sKSAgIHt9Cit2b2lkIF9Mb2NhbGVfbW9uZXRhcnlfZGVzdHJveShzdHJ1Y3QgX0xvY2FsZV9tb25ldGFyeSAqbG1vbikge30KK3ZvaWQgX0xvY2FsZV9tZXNzYWdlc19kZXN0cm95KHN0cnVjdCBfTG9jYWxlX21lc3NhZ2VzICpsbWVzKSB7fQorCitzdGF0aWMgY2hhciBjb25zdCogX0xvY2FsZV9leHRyYWN0X25hbWUoY29uc3QgY2hhciogbmFtZSwgaW50ICpfX2Vycl9jb2RlKSB7CisgIC8vIFdoZW4gdGhlIHJlcXVlc3QgaXMgdGhlIGRlZmF1bHQgbG9jYWxlIG9yIHRoZSAiQyIgbG9jYWxlIHdlIGFuc3dlciAiQyIuCisgIGlmIChuYW1lWzBdID09IDAgfHwKKyAgICAgIChuYW1lWzBdID09ICdDJyAmJiBuYW1lWzFdID09IDApKQorICB7ICByZXR1cm4gX0NfbmFtZTsgfQorICAqX19lcnJfY29kZSA9IF9TVExQX0xPQ19OT19QTEFURk9STV9TVVBQT1JUOyByZXR1cm4gMDsKK30KKworY2hhciBjb25zdCogX0xvY2FsZV9leHRyYWN0X2N0eXBlX25hbWUoY29uc3QgY2hhciAqbmFtZSwgY2hhciAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IF9Mb2NhbGVfbmFtZV9oaW50KiBoaW50LCBpbnQgKl9fZXJyX2NvZGUpCit7IHJldHVybiBfTG9jYWxlX2V4dHJhY3RfbmFtZShuYW1lLCBfX2Vycl9jb2RlKTsgfQorCitjaGFyIGNvbnN0KiBfTG9jYWxlX2V4dHJhY3RfbnVtZXJpY19uYW1lKGNvbnN0IGNoYXIgKm5hbWUsIGNoYXIgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IF9Mb2NhbGVfbmFtZV9oaW50KiBoaW50LCBpbnQgKl9fZXJyX2NvZGUpCit7IHJldHVybiBfTG9jYWxlX2V4dHJhY3RfbmFtZShuYW1lLCBfX2Vycl9jb2RlKTsgfQorCitjaGFyIGNvbnN0KiBfTG9jYWxlX2V4dHJhY3RfdGltZV9uYW1lKGNvbnN0IGNoYXIqbmFtZSwgY2hhciAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgX0xvY2FsZV9uYW1lX2hpbnQqIGhpbnQsIGludCAqX19lcnJfY29kZSkKK3sgcmV0dXJuIF9Mb2NhbGVfZXh0cmFjdF9uYW1lKG5hbWUsIF9fZXJyX2NvZGUpOyB9CisKK2NoYXIgY29uc3QqIF9Mb2NhbGVfZXh0cmFjdF9jb2xsYXRlX25hbWUoY29uc3QgY2hhciAqbmFtZSwgY2hhciAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgX0xvY2FsZV9uYW1lX2hpbnQqIGhpbnQsIGludCAqX19lcnJfY29kZSkKK3sgcmV0dXJuIF9Mb2NhbGVfZXh0cmFjdF9uYW1lKG5hbWUsIF9fZXJyX2NvZGUpOyB9CisKK2NoYXIgY29uc3QqIF9Mb2NhbGVfZXh0cmFjdF9tb25ldGFyeV9uYW1lKGNvbnN0IGNoYXIgKm5hbWUsIGNoYXIgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBfTG9jYWxlX25hbWVfaGludCogaGludCwgaW50ICpfX2Vycl9jb2RlKQoreyByZXR1cm4gX0xvY2FsZV9leHRyYWN0X25hbWUobmFtZSwgX19lcnJfY29kZSk7IH0KKworY2hhciBjb25zdCogX0xvY2FsZV9leHRyYWN0X21lc3NhZ2VzX25hbWUoY29uc3QgY2hhciAqbmFtZSwgY2hhciAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IF9Mb2NhbGVfbmFtZV9oaW50KiBoaW50LCBpbnQgKl9fZXJyX2NvZGUpCit7IHJldHVybiBfTG9jYWxlX2V4dHJhY3RfbmFtZShuYW1lLCBfX2Vycl9jb2RlKTsgfQorCitzdHJ1Y3QgX0xvY2FsZV9uYW1lX2hpbnQqIF9Mb2NhbGVfZ2V0X2N0eXBlX2hpbnQoc3RydWN0IF9Mb2NhbGVfY3R5cGUqIGN0eXBlKQoreyByZXR1cm4gMDsgfQorc3RydWN0IF9Mb2NhbGVfbmFtZV9oaW50KiBfTG9jYWxlX2dldF9udW1lcmljX2hpbnQoc3RydWN0IF9Mb2NhbGVfbnVtZXJpYyogbnVtZXJpYykKK3sgcmV0dXJuIDA7IH0KK3N0cnVjdCBfTG9jYWxlX25hbWVfaGludCogX0xvY2FsZV9nZXRfdGltZV9oaW50KHN0cnVjdCBfTG9jYWxlX3RpbWUqIHRpbWUpCit7IHJldHVybiAwOyB9CitzdHJ1Y3QgX0xvY2FsZV9uYW1lX2hpbnQqIF9Mb2NhbGVfZ2V0X2NvbGxhdGVfaGludChzdHJ1Y3QgX0xvY2FsZV9jb2xsYXRlKiBjb2xsYXRlKQoreyByZXR1cm4gMDsgfQorc3RydWN0IF9Mb2NhbGVfbmFtZV9oaW50KiBfTG9jYWxlX2dldF9tb25ldGFyeV9oaW50KHN0cnVjdCBfTG9jYWxlX21vbmV0YXJ5KiBtb25ldGFyeSkKK3sgcmV0dXJuIDA7IH0KK3N0cnVjdCBfTG9jYWxlX25hbWVfaGludCogX0xvY2FsZV9nZXRfbWVzc2FnZXNfaGludChzdHJ1Y3QgX0xvY2FsZV9tZXNzYWdlcyogbWVzc2FnZXMpCit7IHJldHVybiAwOyB9CisKKy8qIGN0eXBlICovCitjb25zdCBfTG9jYWxlX21hc2tfdCogX0xvY2FsZV9jdHlwZV90YWJsZShzdHJ1Y3QgX0xvY2FsZV9jdHlwZSogbGN0eXBlKSB7CisgIF9TVExQX01BUktfUEFSQU1FVEVSX0FTX1VOVVNFRChsY3R5cGUpCisgIHJldHVybiBjdGFibGU7Cit9CisKK2ludCBfTG9jYWxlX3RvdXBwZXIoc3RydWN0IF9Mb2NhbGVfY3R5cGUqbGN0eXBlLCBpbnQgYykKK3sgcmV0dXJuIHRvdXBwZXIoYyk7IH0KKworaW50IF9Mb2NhbGVfdG9sb3dlcihzdHJ1Y3QgX0xvY2FsZV9jdHlwZSpsY3R5cGUsIGludCBjKQoreyByZXR1cm4gdG9sb3dlcihjKTsgfQorCisjaWZuZGVmIF9TVExQX05PX1dDSEFSX1QKK19Mb2NhbGVfbWFza190IF9XTG9jYWxlX2N0eXBlKHN0cnVjdCBfTG9jYWxlX2N0eXBlICpsY3R5cGUsIHdpbnRfdCB3YywgX0xvY2FsZV9tYXNrX3QgbWFzaykgeworICBfTG9jYWxlX21hc2tfdCByZXQgPSAwOworICBpZiAoKG1hc2sgJiBfTG9jYWxlX0FMUEhBKSAhPSAwICYmIGlzd2FscGhhKHdjKSkKKyAgICByZXQgfD0gX0xvY2FsZV9BTFBIQTsKKyAgCisgIGlmICgobWFzayAmIF9Mb2NhbGVfQ05UUkwpICE9IDAgJiYgaXN3Y250cmwod2MpKQorICAgIHJldCB8PSBfTG9jYWxlX0NOVFJMOworCisgIGlmICgobWFzayAmIF9Mb2NhbGVfRElHSVQpICE9IDAgJiYgaXN3ZGlnaXQod2MpKQorICAgIHJldCB8PSBfTG9jYWxlX0RJR0lUOworCisgIGlmICgobWFzayAmIF9Mb2NhbGVfUFJJTlQpICE9IDAgJiYgaXN3cHJpbnQod2MpKSAKKyAgICByZXQgfD0gX0xvY2FsZV9QUklOVDsKKworICBpZiAoKG1hc2sgJiBfTG9jYWxlX1BVTkNUKSAhPSAwICYmIGlzd3B1bmN0KHdjKSkKKyAgICByZXQgfD0gX0xvY2FsZV9QVU5DVDsKKworICBpZiAoKG1hc2sgJiBfTG9jYWxlX1NQQUNFKSAhPSAwICYmIGlzd3NwYWNlKHdjKSkKKyAgICByZXQgfD0gX0xvY2FsZV9TUEFDRTsKKworICBpZiAoKG1hc2sgJiBfTG9jYWxlX1hESUdJVCkgIT0gMCAmJiBpc3d4ZGlnaXQod2MpKQorICAgIHJldCB8PSBfTG9jYWxlX1hESUdJVDsKKworICBpZiAoKG1hc2sgJiBfTG9jYWxlX1VQUEVSKSAhPSAwICYmIGlzd3VwcGVyKHdjKSkKKyAgICByZXQgfD0gX0xvY2FsZV9VUFBFUjsKKworICBpZiAoKG1hc2sgJiBfTG9jYWxlX0xPV0VSKSAhPSAwICYmIGlzd2xvd2VyKHdjKSkKKyAgICByZXQgfD0gX0xvY2FsZV9MT1dFUjsKKworICByZXR1cm4gcmV0OworfQorCit3aW50X3QgX1dMb2NhbGVfdG9sb3dlcihzdHJ1Y3QgX0xvY2FsZV9jdHlwZSAqbGN0eXBlLCB3aW50X3Qgd2MpCit7IHJldHVybiB0b3dsb3dlcih3Yyk7IH0KKword2ludF90IF9XTG9jYWxlX3RvdXBwZXIoc3RydWN0IF9Mb2NhbGVfY3R5cGUgKmxjdHlwZSwgd2ludF90IHdjKQoreyByZXR1cm4gdG93dXBwZXIod2MpOyB9CisKK2ludCBfV0xvY2FsZV9tYl9jdXJfbWF4IChzdHJ1Y3QgX0xvY2FsZV9jb2RlY3Z0ICpsY29kZWN2dCkgeyByZXR1cm4gMTsgfQoraW50IF9XTG9jYWxlX21iX2N1cl9taW4gKHN0cnVjdCBfTG9jYWxlX2NvZGVjdnQgKmxjb2RlY3Z0KSB7IHJldHVybiAxOyB9CitpbnQgX1dMb2NhbGVfaXNfc3RhdGVsZXNzIChzdHJ1Y3QgX0xvY2FsZV9jb2RlY3Z0ICpsY29kZWN2dCkgeyByZXR1cm4gMTsgfQorCitzaXplX3QgX1dMb2NhbGVfbWJ0b3djKHN0cnVjdCBfTG9jYWxlX2NvZGVjdnQgKmxjb2RlY3Z0LAorICAgICAgICAgICAgICAgICAgICAgICB3Y2hhcl90ICp0bywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZnJvbSwgc2l6ZV90IG4sCisgICAgICAgICAgICAgICAgICAgICAgIG1ic3RhdGVfdCAqc3QpCit7ICp0byA9ICpmcm9tOyByZXR1cm4gMTsgfQorCitzaXplX3QgX1dMb2NhbGVfd2N0b21iKHN0cnVjdCBfTG9jYWxlX2NvZGVjdnQgKmxjb2RlY3Z0LAorICAgICAgICAgICAgICAgICAgICAgICBjaGFyICp0bywgc2l6ZV90IG4sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QgYywKKyAgICAgICAgICAgICAgICAgICAgICAgbWJzdGF0ZV90ICpzdCkKK3sgKnRvID0gKGNoYXIpYzsgcmV0dXJuIDE7IH0KKworc2l6ZV90IF9XTG9jYWxlX3Vuc2hpZnQoc3RydWN0IF9Mb2NhbGVfY29kZWN2dCAqbGNvZGVjdnQsCisgICAgICAgICAgICAgICAgICAgICAgICBtYnN0YXRlX3QgKnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqYnVmLCBzaXplX3QgbiwgY2hhciAqKiBuZXh0KQoreyAqbmV4dCA9IGJ1ZjsgcmV0dXJuIDA7IH0KKyNlbmRpZgorCisvKiBDb2xsYXRlICovCisgaW50IF9Mb2NhbGVfc3RyY21wKHN0cnVjdCBfTG9jYWxlX2NvbGxhdGUqIGxjb2wsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMxLCBzaXplX3QgbjEsIGNvbnN0IGNoYXIqIHMyLCBzaXplX3QgbjIpIHsKKyAgaW50IHJldCA9IDA7CisgIGNoYXIgYnVmMVs2NF0sIGJ1ZjJbNjRdOworICB3aGlsZSAobjEgPiAwIHx8IG4yID4gMCkgeworICAgIHNpemVfdCBidWZzaXplMSA9IG4xIDwgNjMgPyBuMSA6IDYzOworICAgIHNpemVfdCBidWZzaXplMiA9IG4yIDwgNjMgPyBuMiA6IDYzOworICAgIF9TVExQX1NUUk5DUFkoYnVmMSwgNjQsIHMxLCBidWZzaXplMSk7IGJ1ZjFbYnVmc2l6ZTFdID0gMDsKKyAgICBfU1RMUF9TVFJOQ1BZKGJ1ZjIsIDY0LCBzMiwgYnVmc2l6ZTIpOyBidWYyW2J1ZnNpemUyXSA9IDA7CisKKyAgICByZXQgPSBzdHJjbXAoYnVmMSwgYnVmMik7CisgICAgaWYgKHJldCAhPSAwKSByZXR1cm4gcmV0IDwgMCA/IC0xIDogMTsKKyAgICBzMSArPSBidWZzaXplMTsgbjEgLT0gYnVmc2l6ZTE7CisgICAgczIgKz0gYnVmc2l6ZTI7IG4yIC09IGJ1ZnNpemUyOworICB9CisgIHJldHVybiByZXQgPT0gMCA/IDAgOiAocmV0IDwgMCA/IC0xIDogMSk7Cit9CisKKyNpZm5kZWYgX1NUTFBfTk9fV0NIQVJfVAorCitpbnQgX1dMb2NhbGVfc3RyY21wKHN0cnVjdCBfTG9jYWxlX2NvbGxhdGUqIGxjb2wsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHMxLCBzaXplX3QgbjEsIGNvbnN0IHdjaGFyX3QqIHMyLCBzaXplX3QgbjIpIHsKKyAgaW50IHJldCA9IDA7CisgIHdjaGFyX3QgYnVmMVs2NF0sIGJ1ZjJbNjRdOworICB3aGlsZSAobjEgPiAwIHx8IG4yID4gMCkgeworICAgIHNpemVfdCBidWZzaXplMSA9IG4xIDwgNjMgPyBuMSA6IDYzOworICAgIHNpemVfdCBidWZzaXplMiA9IG4yIDwgNjMgPyBuMiA6IDYzOworICAgIF9TVExQX1dDU05DUFkoYnVmMSwgNjQsIHMxLCBidWZzaXplMSk7IGJ1ZjFbYnVmc2l6ZTFdID0gMDsKKyAgICBfU1RMUF9XQ1NOQ1BZKGJ1ZjIsIDY0LCBzMiwgYnVmc2l6ZTIpOyBidWYyW2J1ZnNpemUyXSA9IDA7CisKKyAgICByZXQgPSB3Y3NjbXAoYnVmMSwgYnVmMik7CisgICAgaWYgKHJldCAhPSAwKSByZXR1cm4gcmV0IDwgMCA/IC0xIDogMTsKKyAgICBzMSArPSBidWZzaXplMTsgbjEgLT0gYnVmc2l6ZTE7CisgICAgczIgKz0gYnVmc2l6ZTI7IG4yIC09IGJ1ZnNpemUyOworICB9CisgIHJldHVybiByZXQgPT0gMCA/IDAgOiAocmV0IDwgMCA/IC0xIDogMSk7Cit9CisKKyNlbmRpZgorCitzaXplX3QgX0xvY2FsZV9zdHJ4ZnJtKHN0cnVjdCBfTG9jYWxlX2NvbGxhdGUqIGxjb2wsCisgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGRlc3QsIHNpemVfdCBkZXN0X24sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHNyYywgc2l6ZV90IHNyY19uKSB7CisgIGlmIChkZXN0ICE9IDApIHsKKyAgICBfU1RMUF9TVFJOQ1BZKGRlc3QsIGRlc3Rfbiwgc3JjLCBkZXN0X24gLSAxKTsgZGVzdFtkZXN0X24gLSAxXSA9IDA7CisgIH0KKyAgcmV0dXJuIHNyY19uOworfQorCisjaWZuZGVmIF9TVExQX05PX1dDSEFSX1QKKworc2l6ZV90IF9XTG9jYWxlX3N0cnhmcm0oc3RydWN0IF9Mb2NhbGVfY29sbGF0ZSogbGNvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHdjaGFyX3QqIGRlc3QsIHNpemVfdCBkZXN0X24sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBzcmMsIHNpemVfdCBzcmNfbikgeworICBpZiAoZGVzdCAhPSAwKSB7CisgICAgX1NUTFBfV0NTTkNQWShkZXN0LCBkZXN0X24sIHNyYywgZGVzdF9uIC0gMSk7IGRlc3RbZGVzdF9uIC0gMV0gPSAwOworICB9CisgIHJldHVybiBzcmNfbjsKK30KKworI2VuZGlmCisKKy8qIE51bWVyaWMgKi8KKworY2hhciBfTG9jYWxlX2RlY2ltYWxfcG9pbnQoc3RydWN0IF9Mb2NhbGVfbnVtZXJpYyogbG51bSkKK3sgcmV0dXJuICcuJzsgfQorY2hhciBfTG9jYWxlX3Rob3VzYW5kc19zZXAoc3RydWN0IF9Mb2NhbGVfbnVtZXJpYyogbG51bSkKK3sgcmV0dXJuICcsJzsgfQorY29uc3QgY2hhciogX0xvY2FsZV9ncm91cGluZyhzdHJ1Y3QgX0xvY2FsZV9udW1lcmljICogbG51bSkKK3sgcmV0dXJuIF9lbXB0eV9zdHI7IH0KK2NvbnN0IGNoYXIgKiBfTG9jYWxlX3RydWUoc3RydWN0IF9Mb2NhbGVfbnVtZXJpYyAqIGxudW0pCit7IHJldHVybiAidHJ1ZSI7IH0KK2NvbnN0IGNoYXIgKiBfTG9jYWxlX2ZhbHNlKHN0cnVjdCBfTG9jYWxlX251bWVyaWMgKiBsbnVtKQoreyByZXR1cm4gImZhbHNlIjsgfQorCisjaWZuZGVmIF9TVExQX05PX1dDSEFSX1QKK3djaGFyX3QgX1dMb2NhbGVfZGVjaW1hbF9wb2ludChzdHJ1Y3QgX0xvY2FsZV9udW1lcmljKiBsbnVtKQoreyByZXR1cm4gTCcuJzsgfQord2NoYXJfdCBfV0xvY2FsZV90aG91c2FuZHNfc2VwKHN0cnVjdCBfTG9jYWxlX251bWVyaWMqIGxudW0pCit7IHJldHVybiBMJywnOyB9Citjb25zdCB3Y2hhcl90ICogX1dMb2NhbGVfdHJ1ZShzdHJ1Y3QgX0xvY2FsZV9udW1lcmljKiBsbnVtLCB3Y2hhcl90KiBidWYsIHNpemVfdCBidWZTaXplKQoreyByZXR1cm4gTCJ0cnVlIjsgfQorY29uc3Qgd2NoYXJfdCAqIF9XTG9jYWxlX2ZhbHNlKHN0cnVjdCBfTG9jYWxlX251bWVyaWMqIGxudW0sIHdjaGFyX3QqIGJ1Ziwgc2l6ZV90IGJ1ZlNpemUpCit7IHJldHVybiBMImZhbHNlIjsgfQorI2VuZGlmCisKKy8qIE1vbmV0YXJ5ICovCisKK2NvbnN0IGNoYXIqIF9Mb2NhbGVfaW50X2N1cnJfc3ltYm9sKHN0cnVjdCBfTG9jYWxlX21vbmV0YXJ5ICogbG1vbikKK3sgcmV0dXJuIF9lbXB0eV9zdHI7IH0KK2NvbnN0IGNoYXIqIF9Mb2NhbGVfY3VycmVuY3lfc3ltYm9sKHN0cnVjdCBfTG9jYWxlX21vbmV0YXJ5ICogbG1vbikKK3sgcmV0dXJuIF9lbXB0eV9zdHI7IH0KK2NoYXIgICAgICAgIF9Mb2NhbGVfbW9uX2RlY2ltYWxfcG9pbnQoc3RydWN0IF9Mb2NhbGVfbW9uZXRhcnkgKiBsbW9uKQoreyByZXR1cm4gJy4nOyB9CitjaGFyICAgICAgICBfTG9jYWxlX21vbl90aG91c2FuZHNfc2VwKHN0cnVjdCBfTG9jYWxlX21vbmV0YXJ5ICogbG1vbikKK3sgcmV0dXJuICcsJzsgfQorY29uc3QgY2hhciogX0xvY2FsZV9tb25fZ3JvdXBpbmcoc3RydWN0IF9Mb2NhbGVfbW9uZXRhcnkgKiBsbW9uKQoreyByZXR1cm4gX2VtcHR5X3N0cjsgfQorY29uc3QgY2hhciogX0xvY2FsZV9wb3NpdGl2ZV9zaWduKHN0cnVjdCBfTG9jYWxlX21vbmV0YXJ5ICogbG1vbikKK3sgcmV0dXJuIF9lbXB0eV9zdHI7IH0KK2NvbnN0IGNoYXIqIF9Mb2NhbGVfbmVnYXRpdmVfc2lnbihzdHJ1Y3QgX0xvY2FsZV9tb25ldGFyeSAqIGxtb24pCit7IHJldHVybiBfZW1wdHlfc3RyOyB9CitjaGFyICAgICAgICBfTG9jYWxlX2ludF9mcmFjX2RpZ2l0cyhzdHJ1Y3QgX0xvY2FsZV9tb25ldGFyeSAqIGxtb24pCit7IHJldHVybiAwOyB9CitjaGFyICAgICAgICBfTG9jYWxlX2ZyYWNfZGlnaXRzKHN0cnVjdCBfTG9jYWxlX21vbmV0YXJ5ICogbG1vbikKK3sgcmV0dXJuIDA7IH0KK2ludCAgICAgICAgIF9Mb2NhbGVfcF9jc19wcmVjZWRlcyhzdHJ1Y3QgX0xvY2FsZV9tb25ldGFyeSAqIGxtb24pCit7IHJldHVybiBDSEFSX01BWDsgfQoraW50ICAgICAgICAgX0xvY2FsZV9wX3NlcF9ieV9zcGFjZShzdHJ1Y3QgX0xvY2FsZV9tb25ldGFyeSAqIGxtb24pCit7IHJldHVybiBDSEFSX01BWDsgfQoraW50ICAgICAgICAgX0xvY2FsZV9wX3NpZ25fcG9zbihzdHJ1Y3QgX0xvY2FsZV9tb25ldGFyeSAqIGxtb24pCit7IHJldHVybiBDSEFSX01BWDsgfQoraW50ICAgICAgICAgX0xvY2FsZV9uX2NzX3ByZWNlZGVzKHN0cnVjdCBfTG9jYWxlX21vbmV0YXJ5ICogbG1vbikKK3sgcmV0dXJuIENIQVJfTUFYOyB9CitpbnQgICAgICAgICAgX0xvY2FsZV9uX3NlcF9ieV9zcGFjZShzdHJ1Y3QgX0xvY2FsZV9tb25ldGFyeSAqIGxtb24pCit7IHJldHVybiBDSEFSX01BWDsgfQoraW50ICAgICAgICAgIF9Mb2NhbGVfbl9zaWduX3Bvc24oc3RydWN0IF9Mb2NhbGVfbW9uZXRhcnkgKiBsbW9uKQoreyByZXR1cm4gQ0hBUl9NQVg7IH0KKworI2lmbmRlZiBfU1RMUF9OT19XQ0hBUl9UCitjb25zdCB3Y2hhcl90KiBfV0xvY2FsZV9pbnRfY3Vycl9zeW1ib2woc3RydWN0IF9Mb2NhbGVfbW9uZXRhcnkgKiBsbW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdjaGFyX3QqIGJ1Ziwgc2l6ZV90IGJ1ZlNpemUpCit7IHJldHVybiBfZW1wdHlfd3N0cjsgfQorY29uc3Qgd2NoYXJfdCogX1dMb2NhbGVfY3VycmVuY3lfc3ltYm9sKHN0cnVjdCBfTG9jYWxlX21vbmV0YXJ5ICogbG1vbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Y2hhcl90KiBidWYsIHNpemVfdCBidWZTaXplKQoreyByZXR1cm4gX2VtcHR5X3dzdHI7IH0KK3djaGFyX3QgICAgICAgIF9XTG9jYWxlX21vbl9kZWNpbWFsX3BvaW50KHN0cnVjdCBfTG9jYWxlX21vbmV0YXJ5ICogbG1vbikKK3sgcmV0dXJuIEwnLic7IH0KK3djaGFyX3QgICAgICAgIF9XTG9jYWxlX21vbl90aG91c2FuZHNfc2VwKHN0cnVjdCBfTG9jYWxlX21vbmV0YXJ5ICogbG1vbikKK3sgcmV0dXJuIEwnLCc7IH0KK2NvbnN0IHdjaGFyX3QqIF9XTG9jYWxlX3Bvc2l0aXZlX3NpZ24oc3RydWN0IF9Mb2NhbGVfbW9uZXRhcnkgKiBsbW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Y2hhcl90KiBidWYsIHNpemVfdCBidWZTaXplKQoreyByZXR1cm4gX2VtcHR5X3dzdHI7IH0KK2NvbnN0IHdjaGFyX3QqIF9XTG9jYWxlX25lZ2F0aXZlX3NpZ24oc3RydWN0IF9Mb2NhbGVfbW9uZXRhcnkgKiBsbW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Y2hhcl90KiBidWYsIHNpemVfdCBidWZTaXplKQoreyByZXR1cm4gX2VtcHR5X3dzdHI7IH0KKyNlbmRpZgorCisvKiBUaW1lICovCitzdGF0aWMgY29uc3QgY2hhciogZnVsbF9tb250aG5hbWVbXSA9Cit7ICJKYW51YXJ5IiwgIkZlYnJ1YXJ5IiwgIk1hcmNoIiwgIkFwcmlsIiwgIk1heSIsICJKdW5lIiwKKyAgIkp1bHkiLCAiQXVndXN0IiwgIlNlcHRlbWJlciIsICJPY3RvYmVyIiwgIk5vdmVtYmVyIiwgIkRlY2VtYmVyIiB9OworY29uc3QgY2hhciAqIF9Mb2NhbGVfZnVsbF9tb250aG5hbWUoc3RydWN0IF9Mb2NhbGVfdGltZSAqIGx0aW1lLCBpbnQgbikKK3sgcmV0dXJuIGZ1bGxfbW9udGhuYW1lW25dOyB9CisKK3N0YXRpYyBjb25zdCBjaGFyKiBhYmJyZXZfbW9udGhuYW1lW10gPQoreyAiSmFuIiwgIkZlYiIsICJNYXIiLCAiQXByIiwgIk1heSIsICJKdW4iLAorICAiSnVsIiwgIkF1ZyIsICJTZXAiLCAiT2N0IiwgIk5vdiIsICJEZWMiIH07Citjb25zdCBjaGFyICogX0xvY2FsZV9hYmJyZXZfbW9udGhuYW1lKHN0cnVjdCBfTG9jYWxlX3RpbWUgKiBsdGltZSwgaW50IG4pCit7IHJldHVybiBhYmJyZXZfbW9udGhuYW1lW25dOyB9CisKK3N0YXRpYyBjb25zdCBjaGFyKiBmdWxsX2RheW5hbWVbXSA9Cit7ICJTdW5kYXkiLCAiTW9uZGF5IiwgIlR1ZXNkYXkiLCAiV2VkbmVzZGF5IiwgIlRodXJzZGF5IiwgIkZyaWRheSIsICJTYXR1cmRheSIgfTsKK2NvbnN0IGNoYXIgKiBfTG9jYWxlX2Z1bGxfZGF5b2Z3ZWVrKHN0cnVjdCBfTG9jYWxlX3RpbWUgKiBsdGltZSwgaW50IG4pCit7IHJldHVybiBmdWxsX2RheW5hbWVbbl07IH0KKworc3RhdGljIGNvbnN0IGNoYXIqIGFiYnJldl9kYXluYW1lW10gPQoreyAiU3VuIiwgIk1vbiIsICJUdWUiLCAiV2VkIiwgIlRodSIsICJGcmkiLCAiU2F0IiB9OworY29uc3QgY2hhciAqIF9Mb2NhbGVfYWJicmV2X2RheW9md2VlayhzdHJ1Y3QgX0xvY2FsZV90aW1lICogbHRpbWUsIGludCBuKQoreyByZXR1cm4gYWJicmV2X2RheW5hbWVbbl07IH0KKworY29uc3QgY2hhciogX0xvY2FsZV9kX3RfZm10KHN0cnVjdCBfTG9jYWxlX3RpbWUqIGx0aW1lKQoreyByZXR1cm4gIiVtLyVkLyV5IjsgfQorY29uc3QgY2hhciogX0xvY2FsZV9kX2ZtdChzdHJ1Y3QgX0xvY2FsZV90aW1lKiBsdGltZSkKK3sgcmV0dXJuICIlbS8lZC8leSI7IH0KK2NvbnN0IGNoYXIqIF9Mb2NhbGVfdF9mbXQoc3RydWN0IF9Mb2NhbGVfdGltZSogbHRpbWUpCit7IHJldHVybiAiJUg6JU06JVMiOyB9Citjb25zdCBjaGFyKiBfTG9jYWxlX2xvbmdfZF90X2ZtdChzdHJ1Y3QgX0xvY2FsZV90aW1lKiBsdGltZSkKK3sgcmV0dXJuIF9lbXB0eV9zdHI7IH0KK2NvbnN0IGNoYXIqIF9Mb2NhbGVfbG9uZ19kX2ZtdChzdHJ1Y3QgX0xvY2FsZV90aW1lKiBsdGltZSkKK3sgcmV0dXJuIF9lbXB0eV9zdHI7IH0KK2NvbnN0IGNoYXIqIF9Mb2NhbGVfYW1fc3RyKHN0cnVjdCBfTG9jYWxlX3RpbWUqIGx0aW1lKQoreyByZXR1cm4gIkFNIjsgfQorY29uc3QgY2hhciogX0xvY2FsZV9wbV9zdHIoc3RydWN0IF9Mb2NhbGVfdGltZSogbHRpbWUpCit7IHJldHVybiAiUE0iOyB9CisKKyNpZm5kZWYgX1NUTFBfTk9fV0NIQVJfVAorc3RhdGljIGNvbnN0IHdjaGFyX3QqIGZ1bGxfd21vbnRobmFtZVtdID0KK3sgTCJKYW51YXJ5IiwgTCJGZWJydWFyeSIsIEwiTWFyY2giLCBMIkFwcmlsIiwgTCJNYXkiLCBMIkp1bmUiLAorICBMIkp1bHkiLCBMIkF1Z3VzdCIsIEwiU2VwdGVtYmVyIiwgTCJPY3RvYmVyIiwgTCJOb3ZlbWJlciIsIEwiRGVjZW1iZXIiIH07Citjb25zdCB3Y2hhcl90ICogX1dMb2NhbGVfZnVsbF9tb250aG5hbWUoc3RydWN0IF9Mb2NhbGVfdGltZSAqIGx0aW1lLCBpbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Y2hhcl90KiBidWYsIHNpemVfdCBidWZTaXplKQoreyByZXR1cm4gZnVsbF93bW9udGhuYW1lW25dOyB9CisKK3N0YXRpYyBjb25zdCB3Y2hhcl90KiBhYmJyZXZfd21vbnRobmFtZVtdID0KK3sgTCJKYW4iLCBMIkZlYiIsIEwiTWFyIiwgTCJBcHIiLCBMIk1heSIsIEwiSnVuIiwKKyAgTCJKdWwiLCBMIkF1ZyIsIEwiU2VwIiwgTCJPY3QiLCBMIk5vdiIsIEwiRGVjIiB9OworY29uc3Qgd2NoYXJfdCAqIF9XTG9jYWxlX2FiYnJldl9tb250aG5hbWUoc3RydWN0IF9Mb2NhbGVfdGltZSAqIGx0aW1lLCBpbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdjaGFyX3QqIGJ1Ziwgc2l6ZV90IGJ1ZlNpemUpCit7IHJldHVybiBhYmJyZXZfd21vbnRobmFtZVtuXTsgfQorCitzdGF0aWMgY29uc3Qgd2NoYXJfdCogZnVsbF93ZGF5bmFtZVtdID0KK3sgTCJTdW5kYXkiLCBMIk1vbmRheSIsIEwiVHVlc2RheSIsIEwiV2VkbmVzZGF5IiwgTCJUaHVyc2RheSIsIEwiRnJpZGF5IiwgTCJTYXR1cmRheSIgfTsKK2NvbnN0IHdjaGFyX3QgKiBfV0xvY2FsZV9mdWxsX2RheW9md2VlayhzdHJ1Y3QgX0xvY2FsZV90aW1lICogbHRpbWUsIGludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdjaGFyX3QqIGJ1Ziwgc2l6ZV90IGJ1ZlNpemUpCit7IHJldHVybiBmdWxsX3dkYXluYW1lW25dOyB9CisKK3N0YXRpYyBjb25zdCB3Y2hhcl90KiBhYmJyZXZfd2RheW5hbWVbXSA9Cit7IEwiU3VuIiwgTCJNb24iLCBMIlR1ZSIsIEwiV2VkIiwgTCJUaHUiLCBMIkZyaSIsIEwiU2F0IiB9OworY29uc3Qgd2NoYXJfdCAqIF9XTG9jYWxlX2FiYnJldl9kYXlvZndlZWsoc3RydWN0IF9Mb2NhbGVfdGltZSAqIGx0aW1lLCBpbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdjaGFyX3QqIGJ1Ziwgc2l6ZV90IGJ1ZlNpemUpCit7IHJldHVybiBhYmJyZXZfd2RheW5hbWVbbl07IH0KKworY29uc3Qgd2NoYXJfdCogX1dMb2NhbGVfYW1fc3RyKHN0cnVjdCBfTG9jYWxlX3RpbWUqIGx0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdjaGFyX3QqIGJ1Ziwgc2l6ZV90IGJ1ZlNpemUpCit7IHJldHVybiBMIkFNIjsgfQorY29uc3Qgd2NoYXJfdCogX1dMb2NhbGVfcG1fc3RyKHN0cnVjdCBfTG9jYWxlX3RpbWUqIGx0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdjaGFyX3QqIGJ1Ziwgc2l6ZV90IGJ1ZlNpemUpCit7IHJldHVybiBMIlBNIjsgfQorI2VuZGlmCisKKy8qIE1lc3NhZ2VzICovCisKK25sX2NhdGRfdHlwZSBfTG9jYWxlX2NhdG9wZW4oc3RydWN0IF9Mb2NhbGVfbWVzc2FnZXMqIGxtZXMsIGNvbnN0IGNoYXIqIG5hbWUpCit7IHJldHVybiAtMTsgfQordm9pZCBfTG9jYWxlX2NhdGNsb3NlKHN0cnVjdCBfTG9jYWxlX21lc3NhZ2VzKiBsbWVzLCBubF9jYXRkX3R5cGUgY2F0KSB7fQorY29uc3QgY2hhciogX0xvY2FsZV9jYXRnZXRzKHN0cnVjdCBfTG9jYWxlX21lc3NhZ2VzKiBsbWVzLCBubF9jYXRkX3R5cGUgY2F0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXRpZCwgaW50IG1zZ2lkLCBjb25zdCBjaGFyICpkZmF1bHQpCit7IHJldHVybiBkZmF1bHQ7IH0KZGlmZiAtLWdpdCBhL3NyYy9jX2xvY2FsZV9nbGliYy9jX2xvY2FsZV9nbGliYzIuYyBiL3NyYy9jX2xvY2FsZV9nbGliYy9jX2xvY2FsZV9nbGliYzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2Y4Mjc5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NfbG9jYWxlX2dsaWJjL2NfbG9jYWxlX2dsaWJjMi5jCkBAIC0wLDAgKzEsNzA1IEBACisjaW5jbHVkZSA8bG9jYWxlLmg+CisjaW5jbHVkZSA8bGFuZ2luZm8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHdjdHlwZS5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCitzdGF0aWMgY29uc3QgY2hhciAqX2VtcHR5X3N0ciA9ICIiOworc3RhdGljIGNvbnN0IGNoYXIgKl9DX25hbWUgPSAiQyI7CisKK3N0YXRpYyB3Y2hhcl90KiBfVG9XQ2hhcihjb25zdCBjaGFyKiBidWYsIHdjaGFyX3QgKndidWYsIHNpemVfdCB3YnVmU2l6ZSkgeworICB3Y2hhcl90ICp3Y3VyID0gd2J1ZjsKKyAgd2NoYXJfdCAqd2VuZCA9IHdidWYgKyB3YnVmU2l6ZSAtIDE7CisgIGZvciAoOyB3Y3VyICE9IHdlbmQgJiYgKmJ1ZiAhPSAwOyArK2J1ZiwgKyt3Y3VyKQorICAgICp3Y3VyID0gKmJ1ZjsKKyAgKndjdXIgPSAwOworICByZXR1cm4gd2J1ZjsKK30KKworI2lmIDAKK3N0cnVjdCBfTG9jYWxlX2N0eXBlCit7CisgIGxvY2FsZV90IF9fY2xvYzsKK307CisKK3N0cnVjdCBfTG9jYWxlX251bWVyaWMKK3sKKyAgbG9jYWxlX3QgX19jbG9jOworfTsKKworc3RydWN0IF9Mb2NhbGVfdGltZQoreworICBsb2NhbGVfdCBfX2Nsb2M7Cit9OworCitzdHJ1Y3QgX0xvY2FsZV9jb2xsYXRlCit7CisgIGxvY2FsZV90IF9fY2xvYzsKK307CisKK3N0cnVjdCBfTG9jYWxlX21vbmV0YXJ5Cit7CisgIGxvY2FsZV90IF9fY2xvYzsKK307CisKK3N0cnVjdCBfTG9jYWxlX21lc3NhZ2VzCit7CisgIGxvY2FsZV90IF9fY2xvYzsKK307CisjZW5kaWYKKwordm9pZCBfTG9jYWxlX2luaXQoKQore30KKwordm9pZCBfTG9jYWxlX2ZpbmFsKCkKK3t9CisKK3N0cnVjdCBfTG9jYWxlX2N0eXBlICpfTG9jYWxlX2N0eXBlX2NyZWF0ZShjb25zdCBjaGFyICpubSwgc3RydWN0IF9Mb2NhbGVfbmFtZV9oaW50KiBoaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqX19lcnJfY29kZSkgeworICAqX19lcnJfY29kZSA9IF9TVExQX0xPQ19VTktOT1dOX05BTUU7CisgIHJldHVybiAoc3RydWN0IF9Mb2NhbGVfY3R5cGUqKW5ld2xvY2FsZShMQ19DVFlQRV9NQVNLLCBubSwgTlVMTCk7Cit9CisKK3N0cnVjdCBfTG9jYWxlX2NvZGVjdnQgKl9Mb2NhbGVfY29kZWN2dF9jcmVhdGUoY29uc3QgY2hhciAqbm0sIHN0cnVjdCBfTG9jYWxlX25hbWVfaGludCogaGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpfX2Vycl9jb2RlKSB7CisgIC8vIEdsaWJjIGRvIG5vdCBzdXBwb3J0IG11bHRpYnl0ZSBtYW5pcHVsYXRpb24gZm9yIHRoZSBtb21lbnQsIGl0IHNpbXBseSBpbXBsZW1lbnRzICJDIi4KKyAgaWYgKG5tWzBdID09ICdDJyAmJiBubVsxXSA9PSAwKQorICB7IHJldHVybiAoc3RydWN0IF9Mb2NhbGVfY29kZWN2dCopMHgwMTsgfQorICAqX19lcnJfY29kZSA9IF9TVExQX0xPQ19OT19QTEFURk9STV9TVVBQT1JUOyByZXR1cm4gMDsKK30KKworc3RydWN0IF9Mb2NhbGVfbnVtZXJpYyAqX0xvY2FsZV9udW1lcmljX2NyZWF0ZShjb25zdCBjaGFyICpubSwgc3RydWN0IF9Mb2NhbGVfbmFtZV9oaW50KiBoaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKl9fZXJyX2NvZGUpIHsKKyAgKl9fZXJyX2NvZGUgPSBfU1RMUF9MT0NfVU5LTk9XTl9OQU1FOworICByZXR1cm4gKHN0cnVjdCBfTG9jYWxlX251bWVyaWMqKW5ld2xvY2FsZShMQ19OVU1FUklDX01BU0ssIG5tLCBOVUxMKTsKK30KKyAgCitzdHJ1Y3QgX0xvY2FsZV90aW1lICpfTG9jYWxlX3RpbWVfY3JlYXRlKGNvbnN0IGNoYXIgKm5tLCBzdHJ1Y3QgX0xvY2FsZV9uYW1lX2hpbnQqIGhpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqX19lcnJfY29kZSkgeworICAqX19lcnJfY29kZSA9IF9TVExQX0xPQ19VTktOT1dOX05BTUU7CisgIHJldHVybiAoc3RydWN0IF9Mb2NhbGVfdGltZSopbmV3bG9jYWxlKExDX1RJTUVfTUFTSywgbm0sIE5VTEwpOworfQorCitzdHJ1Y3QgX0xvY2FsZV9jb2xsYXRlICpfTG9jYWxlX2NvbGxhdGVfY3JlYXRlKGNvbnN0IGNoYXIgKm5tLCBzdHJ1Y3QgX0xvY2FsZV9uYW1lX2hpbnQqIGhpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqX19lcnJfY29kZSkgeworICAqX19lcnJfY29kZSA9IF9TVExQX0xPQ19VTktOT1dOX05BTUU7CisgIHJldHVybiAoc3RydWN0IF9Mb2NhbGVfY29sbGF0ZSopbmV3bG9jYWxlKExDX0NPTExBVEVfTUFTSywgbm0sIE5VTEwpOworfQorCitzdHJ1Y3QgX0xvY2FsZV9tb25ldGFyeSAqX0xvY2FsZV9tb25ldGFyeV9jcmVhdGUoY29uc3QgY2hhciAqbm0sIHN0cnVjdCBfTG9jYWxlX25hbWVfaGludCogaGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKl9fZXJyX2NvZGUpIHsKKyAgKl9fZXJyX2NvZGUgPSBfU1RMUF9MT0NfVU5LTk9XTl9OQU1FOworICByZXR1cm4gKHN0cnVjdCBfTG9jYWxlX21vbmV0YXJ5KiluZXdsb2NhbGUoTENfTU9ORVRBUllfTUFTSywgbm0sIE5VTEwpOworfQorCitzdHJ1Y3QgX0xvY2FsZV9tZXNzYWdlcyAqX0xvY2FsZV9tZXNzYWdlc19jcmVhdGUoY29uc3QgY2hhciAqbm0sIHN0cnVjdCBfTG9jYWxlX25hbWVfaGludCogaGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKl9fZXJyX2NvZGUpIHsKKyAgKl9fZXJyX2NvZGUgPSBfU1RMUF9MT0NfVU5LTk9XTl9OQU1FOworICByZXR1cm4gKHN0cnVjdCBfTG9jYWxlX21lc3NhZ2VzKiluZXdsb2NhbGUoTENfTUVTU0FHRVNfTUFTSywgbm0sIE5VTEwpOworfQorCisvKgorICB0cnkgdG8gc2VlIGxvY2FsZSBjYXRlZ29yeSBMQyBzaG91bGQgYmUgdXNlZCBmcm9tIGVudmlyb25tZW50OworICBhY2NvcmRpbmcgUE9TSVgsIHRoZSBvcmRlciBpcworICAxLiBMQ19BTEwKKyAgMi4gY2F0ZWdvcnkgKExDX0NUWVBFLCBMQ19OVU1FUklDLCAuLi4gKQorICAzLiBMQU5HCisgIElmIHNldCBub3RoaW5nLCByZXR1cm4gIkMiICh0aGlzIHJlYWxseSBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYykuCisqLworc3RhdGljIGNvbnN0IGNoYXIgKl9Mb2NhbGVfYXV4X2RlZmF1bHQoIGNvbnN0IGNoYXIgKkxDLCBjaGFyICpubSApCit7CisgIGNoYXIgKm5hbWUgPSBnZXRlbnYoICJMQ19BTEwiICk7CisKKyAgaWYgKCBuYW1lICE9IE5VTEwgJiYgKm5hbWUgIT0gMCApIHsKKyAgICByZXR1cm4gbmFtZTsKKyAgfQorICBuYW1lID0gZ2V0ZW52KCBMQyApOworICBpZiAoIG5hbWUgIT0gTlVMTCAmJiAqbmFtZSAhPSAwICkgeworICAgIHJldHVybiBuYW1lOworICB9CisgIG5hbWUgPSBnZXRlbnYoICJMQU5HIiApOworICBpZiAoIG5hbWUgIT0gTlVMTCAmJiAqbmFtZSAhPSAwICkgeworICAgIHJldHVybiBuYW1lOworICB9CisKKyAgcmV0dXJuIF9DX25hbWU7Cit9CisKK2NvbnN0IGNoYXIgKl9Mb2NhbGVfY3R5cGVfZGVmYXVsdCggY2hhciAqbm0gKQoreworICByZXR1cm4gX0xvY2FsZV9hdXhfZGVmYXVsdCggIkxDX0NUWVBFIiwgbm0gKTsKK30KKworY29uc3QgY2hhciAqX0xvY2FsZV9udW1lcmljX2RlZmF1bHQoIGNoYXIgKm5tICkKK3sKKyAgcmV0dXJuIF9Mb2NhbGVfYXV4X2RlZmF1bHQoICJMQ19OVU1FUklDIiwgbm0gKTsKK30KKworY29uc3QgY2hhciAqX0xvY2FsZV90aW1lX2RlZmF1bHQoIGNoYXIgKm5tICkKK3sKKyAgcmV0dXJuIF9Mb2NhbGVfYXV4X2RlZmF1bHQoICJMQ19USU1FIiwgbm0gKTsKK30KKworY29uc3QgY2hhciAqX0xvY2FsZV9jb2xsYXRlX2RlZmF1bHQoIGNoYXIgKm5tICkKK3sKKyAgcmV0dXJuIF9Mb2NhbGVfYXV4X2RlZmF1bHQoICJMQ19DT0xMQVRFIiwgbm0gKTsKK30KKworY29uc3QgY2hhciAqX0xvY2FsZV9tb25ldGFyeV9kZWZhdWx0KCBjaGFyICpubSApCit7CisgIHJldHVybiBfTG9jYWxlX2F1eF9kZWZhdWx0KCAiTENfTU9ORVRBUlkiLCBubSApOworfQorCitjb25zdCBjaGFyICpfTG9jYWxlX21lc3NhZ2VzX2RlZmF1bHQoIGNoYXIgKm5tICkKK3sKKyAgcmV0dXJuIF9Mb2NhbGVfYXV4X2RlZmF1bHQoICJMQ19NRVNTQUdFUyIsIG5tICk7Cit9CisKK2NoYXIgY29uc3QqX0xvY2FsZV9jdHlwZV9uYW1lKCBjb25zdCBzdHJ1Y3QgX0xvY2FsZV9jdHlwZSAqX19sb2MsIGNoYXIgKmJ1ZiApCit7CisgIHJldHVybiAoKGxvY2FsZV90KV9fbG9jKS0+X19uYW1lc1tMQ19DVFlQRV07Cit9CisKK2NoYXIgY29uc3QqX0xvY2FsZV9jb2RlY3Z0X25hbWUoIGNvbnN0IHN0cnVjdCBfTG9jYWxlX2NvZGVjdnQgKl9fbG9jLCBjaGFyICpidWYgKQoreworICByZXR1cm4gX0NfbmFtZTsKK30KKworY2hhciBjb25zdCpfTG9jYWxlX251bWVyaWNfbmFtZSggY29uc3Qgc3RydWN0IF9Mb2NhbGVfbnVtZXJpYyAqX19sb2MsIGNoYXIgKmJ1ZiApCit7CisgIHJldHVybiAoKGxvY2FsZV90KV9fbG9jKS0+X19uYW1lc1tMQ19OVU1FUklDXTsKK30KKworY2hhciBjb25zdCpfTG9jYWxlX3RpbWVfbmFtZSggY29uc3Qgc3RydWN0IF9Mb2NhbGVfdGltZSAqX19sb2MsIGNoYXIgKmJ1ZiApCit7CisgIHJldHVybiAoKGxvY2FsZV90KV9fbG9jKS0+X19uYW1lc1tMQ19USU1FXTsKK30KKworY2hhciBjb25zdCpfTG9jYWxlX2NvbGxhdGVfbmFtZSggY29uc3Qgc3RydWN0IF9Mb2NhbGVfY29sbGF0ZSAqX19sb2MsIGNoYXIgKmJ1ZiApCit7CisgIHJldHVybiAoKGxvY2FsZV90KV9fbG9jKS0+X19uYW1lc1tMQ19DT0xMQVRFXTsKK30KKworY2hhciBjb25zdCpfTG9jYWxlX21vbmV0YXJ5X25hbWUoIGNvbnN0IHN0cnVjdCBfTG9jYWxlX21vbmV0YXJ5ICpfX2xvYywgY2hhciAqYnVmICkKK3sKKyAgcmV0dXJuICgobG9jYWxlX3QpX19sb2MpLT5fX25hbWVzW0xDX01PTkVUQVJZXTsKK30KKworY2hhciBjb25zdCpfTG9jYWxlX21lc3NhZ2VzX25hbWUoIGNvbnN0IHN0cnVjdCBfTG9jYWxlX21lc3NhZ2VzICpfX2xvYywgY2hhciAqYnVmICkKK3sKKyAgcmV0dXJuICgobG9jYWxlX3QpX19sb2MpLT5fX25hbWVzW0xDX01FU1NBR0VTXTsKK30KKwordm9pZCBfTG9jYWxlX2N0eXBlX2Rlc3Ryb3koIHN0cnVjdCBfTG9jYWxlX2N0eXBlICpfX2xvYyApCit7IGZyZWVsb2NhbGUoKGxvY2FsZV90KV9fbG9jKTsgfQorCit2b2lkIF9Mb2NhbGVfY29kZWN2dF9kZXN0cm95KCBzdHJ1Y3QgX0xvY2FsZV9jb2RlY3Z0ICpfX2xvYyApCit7fQorCit2b2lkIF9Mb2NhbGVfbnVtZXJpY19kZXN0cm95KCBzdHJ1Y3QgX0xvY2FsZV9udW1lcmljICpfX2xvYyApCit7IGZyZWVsb2NhbGUoKGxvY2FsZV90KV9fbG9jKTsgfQorCit2b2lkIF9Mb2NhbGVfdGltZV9kZXN0cm95KCBzdHJ1Y3QgX0xvY2FsZV90aW1lICpfX2xvYyApCit7IGZyZWVsb2NhbGUoKGxvY2FsZV90KV9fbG9jKTsgfQorCit2b2lkIF9Mb2NhbGVfY29sbGF0ZV9kZXN0cm95KCBzdHJ1Y3QgX0xvY2FsZV9jb2xsYXRlICpfX2xvYyApCit7IGZyZWVsb2NhbGUoKGxvY2FsZV90KV9fbG9jKTsgfQorCit2b2lkIF9Mb2NhbGVfbW9uZXRhcnlfZGVzdHJveSggc3RydWN0IF9Mb2NhbGVfbW9uZXRhcnkgKl9fbG9jICkKK3sgZnJlZWxvY2FsZSgobG9jYWxlX3QpX19sb2MpOyB9CisKK3ZvaWQgX0xvY2FsZV9tZXNzYWdlc19kZXN0cm95KCBzdHJ1Y3QgX0xvY2FsZV9tZXNzYWdlcyogX19sb2MgKQoreyBmcmVlbG9jYWxlKChsb2NhbGVfdClfX2xvYyk7IH0KKworLyoKKyAqIGxvY2FsZSBsb2MgZXhwZWN0ZWQgZWl0aGVyIGxvY2FsZSBuYW1lIGluZGVlZCAocGxhdGZvcm0tc3BlY2lmaWMpCisgKiBvciBzdHJpbmcgbGlrZSAiTENfQ1RZUEU9TG9jYWxlTmFtZUZvckNUeXBlO0xDX05VTUVSSUM9TG9jYWxlTmFtZUZvck51bTsiCisgKgorICovCisKK3N0YXRpYyBjaGFyIGNvbnN0Kl9fRXh0cmFjdF9sb2NhbGVfbmFtZSggY29uc3QgY2hhciAqbG9jLCBjb25zdCBjaGFyICpjYXRlZ29yeSwgY2hhciAqYnVmICkKK3sKKyAgY2hhciAqZXhwcjsKKyAgc2l6ZV90IGxlbl9uYW1lOworCisgIGlmKCBsb2NbMF09PSdMJyAmJiBsb2NbMV09PSdDJyAmJiBsb2NbMl09PSdfJykgeworICAgIGV4cHIgPSBzdHJzdHIoIChjaGFyKilsb2MsIGNhdGVnb3J5ICk7CisgICAgaWYgKCBleHByID09IE5VTEwgKQorICAgICAgcmV0dXJuIE5VTEw7IC8qIENhdGVnb3J5IG5vdCBmb3VuZC4gKi8KKyAgICArK2V4cHI7CisgICAgbGVuX25hbWUgPSBzdHJjc3BuKCBleHByLCAiOyIgKTsKKyAgICBsZW5fbmFtZSA9IGxlbl9uYW1lID49IF9Mb2NhbGVfTUFYX1NJTVBMRV9OQU1FID8gX0xvY2FsZV9NQVhfU0lNUExFX05BTUUgLSAxIDogbGVuX25hbWU7CisgICAgc3RybmNweSggYnVmLCBleHByLCBsZW5fbmFtZSApOworICAgIGJ1ZltsZW5fbmFtZV0gPSAwOworICAgIHJldHVybiBidWY7CisgIH0KKyAgcmV0dXJuIGxvYzsKK30KKworY2hhciBjb25zdCpfTG9jYWxlX2V4dHJhY3RfY3R5cGVfbmFtZShjb25zdCBjaGFyICpsb2MsIGNoYXIgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IF9Mb2NhbGVfbmFtZV9oaW50KiBoaW50LCBpbnQgKl9fZXJyX2NvZGUpCit7IHJldHVybiBfX0V4dHJhY3RfbG9jYWxlX25hbWUoIGxvYywgIkxDX0NUWVBFPSIsIGJ1ZiApOyB9CisKK2NoYXIgY29uc3QqX0xvY2FsZV9leHRyYWN0X251bWVyaWNfbmFtZShjb25zdCBjaGFyICpsb2MsIGNoYXIgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgX0xvY2FsZV9uYW1lX2hpbnQqIGhpbnQsIGludCAqX19lcnJfY29kZSkKK3sgcmV0dXJuIF9fRXh0cmFjdF9sb2NhbGVfbmFtZSggbG9jLCAiTENfTlVNRVJJQz0iLCBidWYgKTsgfQorCitjaGFyIGNvbnN0Kl9Mb2NhbGVfZXh0cmFjdF90aW1lX25hbWUoY29uc3QgY2hhciAqbG9jLCBjaGFyICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IF9Mb2NhbGVfbmFtZV9oaW50KiBoaW50LCBpbnQgKl9fZXJyX2NvZGUpCit7IHJldHVybiBfX0V4dHJhY3RfbG9jYWxlX25hbWUoIGxvYywgIkxDX1RJTUU9IiwgYnVmICk7IH0KKworY2hhciBjb25zdCpfTG9jYWxlX2V4dHJhY3RfY29sbGF0ZV9uYW1lKGNvbnN0IGNoYXIgKmxvYywgY2hhciAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBfTG9jYWxlX25hbWVfaGludCogaGludCwgaW50ICpfX2Vycl9jb2RlKQoreyByZXR1cm4gX19FeHRyYWN0X2xvY2FsZV9uYW1lKCBsb2MsICJMQ19DT0xMQVRFPSIsIGJ1ZiApOyB9CisKK2NoYXIgY29uc3QqX0xvY2FsZV9leHRyYWN0X21vbmV0YXJ5X25hbWUoY29uc3QgY2hhciAqbG9jLCBjaGFyICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBfTG9jYWxlX25hbWVfaGludCogaGludCwgaW50ICpfX2Vycl9jb2RlKQoreyByZXR1cm4gX19FeHRyYWN0X2xvY2FsZV9uYW1lKCBsb2MsICJMQ19NT05FVEFSWT0iLCBidWYgKTsgfQorCitjaGFyIGNvbnN0Kl9Mb2NhbGVfZXh0cmFjdF9tZXNzYWdlc19uYW1lKGNvbnN0IGNoYXIgKmxvYywgY2hhciAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgX0xvY2FsZV9uYW1lX2hpbnQqIGhpbnQsIGludCAqX19lcnJfY29kZSkKK3sgcmV0dXJuIF9fRXh0cmFjdF9sb2NhbGVfbmFtZSggbG9jLCAiTENfTUVTU0FHRVM9IiwgYnVmICk7IH0KKworc3RydWN0IF9Mb2NhbGVfbmFtZV9oaW50KiBfTG9jYWxlX2dldF9jdHlwZV9oaW50KHN0cnVjdCBfTG9jYWxlX2N0eXBlKiBjdHlwZSkKK3sgcmV0dXJuIDA7IH0KK3N0cnVjdCBfTG9jYWxlX25hbWVfaGludCogX0xvY2FsZV9nZXRfbnVtZXJpY19oaW50KHN0cnVjdCBfTG9jYWxlX251bWVyaWMqIG51bWVyaWMpCit7IHJldHVybiAwOyB9CitzdHJ1Y3QgX0xvY2FsZV9uYW1lX2hpbnQqIF9Mb2NhbGVfZ2V0X3RpbWVfaGludChzdHJ1Y3QgX0xvY2FsZV90aW1lKiB0aW1lKQoreyByZXR1cm4gMDsgfQorc3RydWN0IF9Mb2NhbGVfbmFtZV9oaW50KiBfTG9jYWxlX2dldF9jb2xsYXRlX2hpbnQoc3RydWN0IF9Mb2NhbGVfY29sbGF0ZSogY29sbGF0ZSkKK3sgcmV0dXJuIDA7IH0KK3N0cnVjdCBfTG9jYWxlX25hbWVfaGludCogX0xvY2FsZV9nZXRfbW9uZXRhcnlfaGludChzdHJ1Y3QgX0xvY2FsZV9tb25ldGFyeSogbW9uZXRhcnkpCit7IHJldHVybiAwOyB9CitzdHJ1Y3QgX0xvY2FsZV9uYW1lX2hpbnQqIF9Mb2NhbGVfZ2V0X21lc3NhZ2VzX2hpbnQoc3RydWN0IF9Mb2NhbGVfbWVzc2FnZXMqIG1lc3NhZ2VzKQoreyByZXR1cm4gMDsgfQorCisvKiBjdHlwZSAqLworCitjb25zdCBfTG9jYWxlX21hc2tfdCAqX0xvY2FsZV9jdHlwZV90YWJsZSggc3RydWN0IF9Mb2NhbGVfY3R5cGUgKl9fbG9jICkKK3sKKyAgLyogcmV0dXJuIHRhYmxlIHdpdGggbWFza3MgKHVwcGVyLCBsb3dlciwgYWxwaGEsIGV0Yy4pICovCisgIF9TVExQX1NUQVRJQ19BU1NFUlQoIHNpemVvZihfTG9jYWxlX21hc2tfdCkgPT0gc2l6ZW9mKCgobG9jYWxlX3QpX19sb2MpLT5fX2N0eXBlX2JbMF0pICkKKyAgcmV0dXJuICgobG9jYWxlX3QpX19sb2MpLT5fX2N0eXBlX2I7Cit9CisKK2ludCBfTG9jYWxlX3RvdXBwZXIoIHN0cnVjdCBfTG9jYWxlX2N0eXBlICpfX2xvYywgaW50IGMgKQoreyByZXR1cm4gKChsb2NhbGVfdClfX2xvYyktPl9fY3R5cGVfdG91cHBlcltjXTsgfQorCitpbnQgX0xvY2FsZV90b2xvd2VyKCBzdHJ1Y3QgX0xvY2FsZV9jdHlwZSAqX19sb2MsIGludCBjICkKK3sgcmV0dXJuICgobG9jYWxlX3QpX19sb2MpLT5fX2N0eXBlX3RvbG93ZXJbY107IH0KKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQorX0xvY2FsZV9tYXNrX3QgX1dMb2NhbGVfY3R5cGUoIHN0cnVjdCBfTG9jYWxlX2N0eXBlICpfX2xvYywgd2ludF90IHdjLCBfTG9jYWxlX21hc2tfdCBfX21hc2sgKQoreworICBfTG9jYWxlX21hc2tfdCByZXQgPSAwOworICBpZiAoKF9fbWFzayAmIF9Mb2NhbGVfQUxQSEEpICE9IDAgJiYgaXN3YWxwaGFfbCh3YywgKGxvY2FsZV90KV9fbG9jKSkKKyAgICByZXQgfD0gX0xvY2FsZV9BTFBIQTsKKyAgCisgIGlmICgoX19tYXNrICYgX0xvY2FsZV9DTlRSTCkgIT0gMCAmJiBpc3djbnRybF9sKHdjLCAobG9jYWxlX3QpX19sb2MpKQorICAgIHJldCB8PSBfTG9jYWxlX0NOVFJMOworCisgIGlmICgoX19tYXNrICYgX0xvY2FsZV9ESUdJVCkgIT0gMCAmJiBpc3dkaWdpdF9sKHdjLCAobG9jYWxlX3QpX19sb2MpKQorICAgIHJldCB8PSBfTG9jYWxlX0RJR0lUOworCisgIGlmICgoX19tYXNrICYgX0xvY2FsZV9QUklOVCkgIT0gMCAmJiBpc3dwcmludF9sKHdjLCAobG9jYWxlX3QpX19sb2MpKSAKKyAgICByZXQgfD0gX0xvY2FsZV9QUklOVDsKKworICBpZiAoKF9fbWFzayAmIF9Mb2NhbGVfUFVOQ1QpICE9IDAgJiYgaXN3cHVuY3RfbCh3YywgKGxvY2FsZV90KV9fbG9jKSkKKyAgICByZXQgfD0gX0xvY2FsZV9QVU5DVDsKKworICBpZiAoKF9fbWFzayAmIF9Mb2NhbGVfU1BBQ0UpICE9IDAgJiYgaXN3c3BhY2VfbCh3YywgKGxvY2FsZV90KV9fbG9jKSkKKyAgICByZXQgfD0gX0xvY2FsZV9TUEFDRTsKKworICBpZiAoKF9fbWFzayAmIF9Mb2NhbGVfWERJR0lUKSAhPSAwICYmIGlzd3hkaWdpdF9sKHdjLCAobG9jYWxlX3QpX19sb2MpKQorICAgIHJldCB8PSBfTG9jYWxlX1hESUdJVDsKKworICBpZiAoKF9fbWFzayAmIF9Mb2NhbGVfVVBQRVIpICE9IDAgJiYgaXN3dXBwZXJfbCh3YywgKGxvY2FsZV90KV9fbG9jKSkKKyAgICByZXQgfD0gX0xvY2FsZV9VUFBFUjsKKworICBpZiAoKF9fbWFzayAmIF9Mb2NhbGVfTE9XRVIpICE9IDAgJiYgaXN3bG93ZXJfbCh3YywgKGxvY2FsZV90KV9fbG9jKSkKKyAgICByZXQgfD0gX0xvY2FsZV9MT1dFUjsKKworICByZXR1cm4gcmV0OworfQorCit3aW50X3QgX1dMb2NhbGVfdG9sb3dlciggc3RydWN0IF9Mb2NhbGVfY3R5cGUgKl9fbG9jLCB3aW50X3QgYyApCit7CisgIHJldHVybiB0b3dsb3dlcl9sKCBjLCAoKGxvY2FsZV90KV9fbG9jKSApOworfQorCit3aW50X3QgX1dMb2NhbGVfdG91cHBlciggc3RydWN0IF9Mb2NhbGVfY3R5cGUgKl9fbG9jLCB3aW50X3QgYyApCit7CisgIHJldHVybiB0b3d1cHBlcl9sKCBjLCAoKGxvY2FsZV90KV9fbG9jKSApOworfQorI2VuZGlmCisKK2ludCBfV0xvY2FsZV9tYl9jdXJfbWF4KCBzdHJ1Y3QgX0xvY2FsZV9jb2RlY3Z0ICogbGNvZGVjdnQpIHsgcmV0dXJuIDE7IH0KK2ludCBfV0xvY2FsZV9tYl9jdXJfbWluKCBzdHJ1Y3QgX0xvY2FsZV9jb2RlY3Z0ICogbGNvZGVjdnQpIHsgcmV0dXJuIDE7IH0KK2ludCBfV0xvY2FsZV9pc19zdGF0ZWxlc3MoIHN0cnVjdCBfTG9jYWxlX2NvZGVjdnQgKiBsY29kZWN2dCkgeyByZXR1cm4gMTsgfQorCisjaWYgIWRlZmluZWQgKF9TVExQX05PX1dDSEFSX1QpCitzaXplX3QgX1dMb2NhbGVfbWJ0b3djKHN0cnVjdCBfTG9jYWxlX2NvZGVjdnQgKmxjb2RlY3Z0LAorICAgICAgICAgICAgICAgICAgICAgICB3Y2hhcl90ICp0bywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZnJvbSwgc2l6ZV90IG4sCisgICAgICAgICAgICAgICAgICAgICAgIG1ic3RhdGVfdCAqc3QpCit7ICp0byA9ICpmcm9tOyByZXR1cm4gMTsgfQorCitzaXplX3QgX1dMb2NhbGVfd2N0b21iKHN0cnVjdCBfTG9jYWxlX2NvZGVjdnQgKmxjb2RlY3Z0LAorICAgICAgICAgICAgICAgICAgICAgICBjaGFyICp0bywgc2l6ZV90IG4sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QgYywKKyAgICAgICAgICAgICAgICAgICAgICAgbWJzdGF0ZV90ICpzdCkKK3sgKnRvID0gKGNoYXIpYzsgcmV0dXJuIDE7IH0KKyNlbmRpZgorCitzaXplX3QgX1dMb2NhbGVfdW5zaGlmdChzdHJ1Y3QgX0xvY2FsZV9jb2RlY3Z0ICpsY29kZWN2dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ic3RhdGVfdCAqc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpidWYsIHNpemVfdCBuLCBjaGFyICoqIG5leHQpCit7ICpuZXh0ID0gYnVmOyByZXR1cm4gMDsgfQorCisvKiBDb2xsYXRlICovCitpbnQgX0xvY2FsZV9zdHJjbXAoc3RydWN0IF9Mb2NhbGVfY29sbGF0ZSAqIF9fbG9jLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnMxLCBzaXplX3QgbjEsCisJCSAgIGNvbnN0IGNoYXIgKnMyLCBzaXplX3QgbjIpIHsKKyAgaW50IHJldCA9IDA7CisgIGNoYXIgYnVmMVs2NF0sIGJ1ZjJbNjRdOworICB3aGlsZSAobjEgPiAwIHx8IG4yID4gMCkgeworICAgIHNpemVfdCBidWZzaXplMSA9IG4xIDwgNjMgPyBuMSA6IDYzOworICAgIHNpemVfdCBidWZzaXplMiA9IG4yIDwgNjMgPyBuMiA6IDYzOworICAgIHN0cm5jcHkoYnVmMSwgczEsIGJ1ZnNpemUxKTsgYnVmMVtidWZzaXplMV0gPSAwOworICAgIHN0cm5jcHkoYnVmMiwgczIsIGJ1ZnNpemUyKTsgYnVmMltidWZzaXplMl0gPSAwOworCisgICAgcmV0ID0gc3RyY29sbF9sKGJ1ZjEsIGJ1ZjIsIChsb2NhbGVfdClfX2xvYyk7CisgICAgaWYgKHJldCAhPSAwKSByZXR1cm4gcmV0OworICAgIHMxICs9IGJ1ZnNpemUxOyBuMSAtPSBidWZzaXplMTsKKyAgICBzMiArPSBidWZzaXplMjsgbjIgLT0gYnVmc2l6ZTI7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQoraW50IF9XTG9jYWxlX3N0cmNtcChzdHJ1Y3QgX0xvY2FsZV9jb2xsYXRlICpfX2xvYywKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCAqczEsIHNpemVfdCBuMSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCAqczIsIHNpemVfdCBuMikgeworICBpbnQgcmV0ID0gMDsKKyAgd2NoYXJfdCBidWYxWzY0XSwgYnVmMls2NF07CisgIHdoaWxlIChuMSA+IDAgfHwgbjIgPiAwKSB7CisgICAgc2l6ZV90IGJ1ZnNpemUxID0gbjEgPCA2MyA/IG4xIDogNjM7CisgICAgc2l6ZV90IGJ1ZnNpemUyID0gbjIgPCA2MyA/IG4yIDogNjM7CisgICAgd2NzbmNweShidWYxLCBzMSwgYnVmc2l6ZTEpOyBidWYxW2J1ZnNpemUxXSA9IDA7CisgICAgd2NzbmNweShidWYyLCBzMiwgYnVmc2l6ZTIpOyBidWYyW2J1ZnNpemUyXSA9IDA7CisKKyAgICByZXQgPSB3Y3Njb2xsX2woYnVmMSwgYnVmMiwgKGxvY2FsZV90KV9fbG9jKTsKKyAgICBpZiAocmV0ICE9IDApIHJldHVybiByZXQ7CisgICAgczEgKz0gYnVmc2l6ZTE7IG4xIC09IGJ1ZnNpemUxOworICAgIHMyICs9IGJ1ZnNpemUyOyBuMiAtPSBidWZzaXplMjsKKyAgfQorICByZXR1cm4gcmV0OworfQorCisjZW5kaWYKKworc2l6ZV90IF9Mb2NhbGVfc3RyeGZybShzdHJ1Y3QgX0xvY2FsZV9jb2xsYXRlICpfX2xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZGVzdCwgc2l6ZV90IGRlc3RfbiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3JjLCBzaXplX3Qgc3JjX24gKQoreworICBjb25zdCBjaGFyICpyZWFsX3NyYzsKKyAgY2hhciAqYnVmID0gTlVMTDsKKyAgc2l6ZV90IHJlc3VsdDsKKworICBpZiAoc3JjX24gPT0gMCkKKyAgeworICAgIGlmIChkZXN0ICE9IE5VTEwpIGRlc3RbMF0gPSAwOworICAgIHJldHVybiAwOworICB9CisgIGlmIChzcmNbc3JjX25dICE9IDApIHsKKyAgICBidWYgPSBtYWxsb2Moc3JjX24gKyAxKTsKKyAgICBzdHJuY3B5KGJ1Ziwgc3JjLCBzcmNfbik7CisgICAgYnVmW3NyY19uXSA9IDA7CisgICAgcmVhbF9zcmMgPSBidWY7CisgIH0KKyAgZWxzZQorICAgIHJlYWxfc3JjID0gc3JjOworICByZXN1bHQgPSBzdHJ4ZnJtX2woZGVzdCwgcmVhbF9zcmMsIGRlc3RfbiwgKGxvY2FsZV90KV9fbG9jKTsKKyAgaWYgKGJ1ZiAhPSBOVUxMKSBmcmVlKGJ1Zik7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKyMgaWZuZGVmIF9TVExQX05PX1dDSEFSX1QKKworc2l6ZV90IF9XTG9jYWxlX3N0cnhmcm0oIHN0cnVjdCBfTG9jYWxlX2NvbGxhdGUgKl9fbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgd2NoYXJfdCAqZGVzdCwgc2l6ZV90IGRlc3RfbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QgKnNyYywgc2l6ZV90IHNyY19uICkKK3sKKyAgY29uc3Qgd2NoYXJfdCAqcmVhbF9zcmM7CisgIHdjaGFyX3QgKmJ1ZiA9IE5VTEw7CisgIHNpemVfdCByZXN1bHQ7CisKKyAgaWYgKHNyY19uID09IDApCisgIHsKKyAgICBpZiAoZGVzdCAhPSBOVUxMKSBkZXN0WzBdID0gMDsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoc3JjW3NyY19uXSAhPSAwKSB7CisgICAgYnVmID0gbWFsbG9jKChzcmNfbiArIDEpICogc2l6ZW9mKHdjaGFyX3QpKTsKKyAgICB3Y3NuY3B5KGJ1Ziwgc3JjLCBzcmNfbik7CisgICAgYnVmW3NyY19uXSA9IDA7CisgICAgcmVhbF9zcmMgPSBidWY7CisgIH0KKyAgZWxzZQorICAgIHJlYWxfc3JjID0gc3JjOworICByZXN1bHQgPSB3Y3N4ZnJtX2woZGVzdCwgcmVhbF9zcmMsIGRlc3RfbiwgKGxvY2FsZV90KV9fbG9jKTsKKyAgaWYgKGJ1ZiAhPSBOVUxMKSBmcmVlKGJ1Zik7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKyMgZW5kaWYKKworLyogTnVtZXJpYyAqLworCitjaGFyIF9Mb2NhbGVfZGVjaW1hbF9wb2ludChzdHJ1Y3QgX0xvY2FsZV9udW1lcmljICpfX2xvYykKK3sKKyAgcmV0dXJuICoobmxfbGFuZ2luZm9fbChSQURJWENIQVIsIChsb2NhbGVfdClfX2xvYykpOworfQorCitjaGFyIF9Mb2NhbGVfdGhvdXNhbmRzX3NlcChzdHJ1Y3QgX0xvY2FsZV9udW1lcmljICpfX2xvYykKK3sKKyAgcmV0dXJuICoobmxfbGFuZ2luZm9fbChUSE9VU0VQLCAobG9jYWxlX3QpX19sb2MpKTsKK30KKworY29uc3QgY2hhciogX0xvY2FsZV9ncm91cGluZyhzdHJ1Y3QgX0xvY2FsZV9udW1lcmljICpfX2xvYykKK3sKKyAgcmV0dXJuIChfTG9jYWxlX3Rob3VzYW5kc19zZXAoX19sb2MpICE9IDAgKSA/IChubF9sYW5naW5mb19sKEdST1VQSU5HLCAobG9jYWxlX3QpX19sb2MpKSA6IF9lbXB0eV9zdHI7Cit9CisKK2NvbnN0IGNoYXIgKl9Mb2NhbGVfdHJ1ZShzdHJ1Y3QgX0xvY2FsZV9udW1lcmljICpfX2xvYykKK3sKKyAgcmV0dXJuIG5sX2xhbmdpbmZvX2woWUVTU1RSLCAobG9jYWxlX3QpX19sb2MpOworfQorCitjb25zdCBjaGFyICpfTG9jYWxlX2ZhbHNlKHN0cnVjdCBfTG9jYWxlX251bWVyaWMgKl9fbG9jKQoreworICByZXR1cm4gbmxfbGFuZ2luZm9fbChOT1NUUiwgKGxvY2FsZV90KV9fbG9jKTsKK30KKworI2lmbmRlZiBfU1RMUF9OT19XQ0hBUl9UCit3Y2hhcl90IF9XTG9jYWxlX2RlY2ltYWxfcG9pbnQoc3RydWN0IF9Mb2NhbGVfbnVtZXJpYyAqX19sb2MpCit7IHJldHVybiAod2NoYXJfdClfTG9jYWxlX2RlY2ltYWxfcG9pbnQoX19sb2MpOyB9Cit3Y2hhcl90IF9XTG9jYWxlX3Rob3VzYW5kc19zZXAoc3RydWN0IF9Mb2NhbGVfbnVtZXJpYyAqX19sb2MpCit7IHJldHVybiAod2NoYXJfdClfTG9jYWxlX3Rob3VzYW5kc19zZXAoX19sb2MpOyB9Citjb25zdCB3Y2hhcl90ICpfV0xvY2FsZV90cnVlKHN0cnVjdCBfTG9jYWxlX251bWVyaWMgKl9fbG9jLCB3Y2hhcl90ICpidWYsIHNpemVfdCBidWZTaXplKQoreyByZXR1cm4gX1RvV0NoYXIoX0xvY2FsZV90cnVlKF9fbG9jKSwgYnVmLCBidWZTaXplKTsgfQorY29uc3Qgd2NoYXJfdCAqX1dMb2NhbGVfZmFsc2Uoc3RydWN0IF9Mb2NhbGVfbnVtZXJpYyAqX19sb2MsIHdjaGFyX3QgKmJ1Ziwgc2l6ZV90IGJ1ZlNpemUpCit7IHJldHVybiBfVG9XQ2hhcihfTG9jYWxlX2ZhbHNlKF9fbG9jKSwgYnVmLCBidWZTaXplKTsgfQorI2VuZGlmCisKKy8qIE1vbmV0YXJ5ICovCisKK2NvbnN0IGNoYXIgKl9Mb2NhbGVfaW50X2N1cnJfc3ltYm9sKHN0cnVjdCBfTG9jYWxlX21vbmV0YXJ5ICpfX2xvYykKK3sKKyAgcmV0dXJuIG5sX2xhbmdpbmZvX2woSU5UX0NVUlJfU1lNQk9MLCAobG9jYWxlX3QpX19sb2MpOworfQorCitjb25zdCBjaGFyICpfTG9jYWxlX2N1cnJlbmN5X3N5bWJvbChzdHJ1Y3QgX0xvY2FsZV9tb25ldGFyeSAqX19sb2MpCit7CisgIHJldHVybiBubF9sYW5naW5mb19sKENVUlJFTkNZX1NZTUJPTCwgKGxvY2FsZV90KV9fbG9jKTsKK30KKworY2hhciBfTG9jYWxlX21vbl9kZWNpbWFsX3BvaW50KHN0cnVjdCBfTG9jYWxlX21vbmV0YXJ5ICogX19sb2MpCit7CisgIHJldHVybiAqKG5sX2xhbmdpbmZvX2woTU9OX0RFQ0lNQUxfUE9JTlQsKGxvY2FsZV90KV9fbG9jKSk7Cit9CisKK2NoYXIgX0xvY2FsZV9tb25fdGhvdXNhbmRzX3NlcChzdHJ1Y3QgX0xvY2FsZV9tb25ldGFyeSAqX19sb2MpCit7CisgIHJldHVybiAqKG5sX2xhbmdpbmZvX2woTU9OX1RIT1VTQU5EU19TRVAsIChsb2NhbGVfdClfX2xvYykpOworfQorCisjaWZuZGVmIF9TVExQX05PX1dDSEFSX1QKK2NvbnN0IHdjaGFyX3QgKl9XTG9jYWxlX2ludF9jdXJyX3N5bWJvbChzdHJ1Y3QgX0xvY2FsZV9tb25ldGFyeSAqX19sb2MsIHdjaGFyX3QgKmJ1Ziwgc2l6ZV90IGJ1ZlNpemUpCit7IHJldHVybiBfVG9XQ2hhcihfTG9jYWxlX2ludF9jdXJyX3N5bWJvbChfX2xvYyksIGJ1ZiwgYnVmU2l6ZSk7IH0KK2NvbnN0IHdjaGFyX3QgKl9XTG9jYWxlX2N1cnJlbmN5X3N5bWJvbChzdHJ1Y3QgX0xvY2FsZV9tb25ldGFyeSAqX19sb2MsIHdjaGFyX3QgKmJ1Ziwgc2l6ZV90IGJ1ZlNpemUpCit7IHJldHVybiBfVG9XQ2hhcihfTG9jYWxlX2N1cnJlbmN5X3N5bWJvbChfX2xvYyksIGJ1ZiwgYnVmU2l6ZSk7IH0KK3djaGFyX3QgX1dMb2NhbGVfbW9uX2RlY2ltYWxfcG9pbnQoc3RydWN0IF9Mb2NhbGVfbW9uZXRhcnkgKiBfX2xvYykKK3sgcmV0dXJuICh3Y2hhcl90KV9Mb2NhbGVfbW9uX2RlY2ltYWxfcG9pbnQoX19sb2MpOyB9Cit3Y2hhcl90IF9XTG9jYWxlX21vbl90aG91c2FuZHNfc2VwKHN0cnVjdCBfTG9jYWxlX21vbmV0YXJ5ICogX19sb2MpCit7IHJldHVybiAod2NoYXJfdClfTG9jYWxlX21vbl90aG91c2FuZHNfc2VwKF9fbG9jKTsgfQorY29uc3Qgd2NoYXJfdCAqX1dMb2NhbGVfcG9zaXRpdmVfc2lnbihzdHJ1Y3QgX0xvY2FsZV9tb25ldGFyeSAqX19sb2MsIHdjaGFyX3QgKmJ1Ziwgc2l6ZV90IGJ1ZlNpemUpCit7IHJldHVybiBfVG9XQ2hhcihfTG9jYWxlX3Bvc2l0aXZlX3NpZ24oX19sb2MpLCBidWYsIGJ1ZlNpemUpOyB9Citjb25zdCB3Y2hhcl90ICpfV0xvY2FsZV9uZWdhdGl2ZV9zaWduKHN0cnVjdCBfTG9jYWxlX21vbmV0YXJ5ICpfX2xvYywgd2NoYXJfdCAqYnVmLCBzaXplX3QgYnVmU2l6ZSkKK3sgcmV0dXJuIF9Ub1dDaGFyKF9Mb2NhbGVfbmVnYXRpdmVfc2lnbihfX2xvYyksIGJ1ZiwgYnVmU2l6ZSk7IH0KKyNlbmRpZgorCitjb25zdCBjaGFyICpfTG9jYWxlX21vbl9ncm91cGluZyhzdHJ1Y3QgX0xvY2FsZV9tb25ldGFyeSAqX19sb2MpCit7CisgIHJldHVybiAoX0xvY2FsZV9tb25fdGhvdXNhbmRzX3NlcCggX19sb2MgKSAhPSAwICkgPyBubF9sYW5naW5mb19sKE1PTl9HUk9VUElORywgKGxvY2FsZV90KV9fbG9jKSA6IF9lbXB0eV9zdHI7Cit9CisKK2NvbnN0IGNoYXIgKl9Mb2NhbGVfcG9zaXRpdmVfc2lnbihzdHJ1Y3QgX0xvY2FsZV9tb25ldGFyeSAqX19sb2MpCit7CisgIHJldHVybiBubF9sYW5naW5mb19sKFBPU0lUSVZFX1NJR04sIChsb2NhbGVfdClfX2xvYyk7Cit9CisKK2NvbnN0IGNoYXIgKl9Mb2NhbGVfbmVnYXRpdmVfc2lnbihzdHJ1Y3QgX0xvY2FsZV9tb25ldGFyeSAqX19sb2MpCit7CisgIHJldHVybiBubF9sYW5naW5mb19sKE5FR0FUSVZFX1NJR04sIChsb2NhbGVfdClfX2xvYyk7Cit9CisKK2NoYXIgX0xvY2FsZV9pbnRfZnJhY19kaWdpdHMoc3RydWN0IF9Mb2NhbGVfbW9uZXRhcnkgKl9fbG9jKQoreworICAvKiBXZSBhcmUgZm9yY2VkIHRvIG1hbnVhbGx5IGhhbmRsZWQgdGhlICJDIiBsb2NhbGUgZm9yIGNvbnNpc3RlbmN5IHdpdGgKKyAgICogdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaW4gU1RMcG9ydC4gKi8KKyAgY29uc3QgY2hhciogbG5hbWUgPSAoKGxvY2FsZV90KV9fbG9jKS0+X19uYW1lc1tMQ19NT05FVEFSWV07CisgIGlmIChsbmFtZVswXSA9PSAnQycgJiYgbG5hbWVbMV0gPT0gMCkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuICoobmxfbGFuZ2luZm9fbChJTlRfRlJBQ19ESUdJVFMsIChsb2NhbGVfdClfX2xvYykpOworfQorCitjaGFyIF9Mb2NhbGVfZnJhY19kaWdpdHMoc3RydWN0IF9Mb2NhbGVfbW9uZXRhcnkgKl9fbG9jKQoreworICAvKiBXZSBhcmUgZm9yY2VkIHRvIG1hbnVhbGx5IGhhbmRsZWQgdGhlICJDIiBsb2NhbGUgZm9yIGNvbnNpc3RlbmN5IHdpdGgKKyAgICogdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaW4gU1RMcG9ydC4gKi8KKyAgY29uc3QgY2hhciogbG5hbWUgPSAoKGxvY2FsZV90KV9fbG9jKS0+X19uYW1lc1tMQ19NT05FVEFSWV07CisgIGlmIChsbmFtZVswXSA9PSAnQycgJiYgbG5hbWVbMV0gPT0gMCkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuICoobmxfbGFuZ2luZm9fbChGUkFDX0RJR0lUUywgKGxvY2FsZV90KV9fbG9jKSk7Cit9CisKKy8qIDEgaWYgY3VycmVuY3lfc3ltYm9sIHByZWNlZGVzIGEgcG9zaXRpdmUgdmFsdWUsIDAgaWYgc3VjY2VlZHMgKi8KK2ludCBfTG9jYWxlX3BfY3NfcHJlY2VkZXMoc3RydWN0IF9Mb2NhbGVfbW9uZXRhcnkgKl9fbG9jKQoreworICByZXR1cm4gKihubF9sYW5naW5mb19sKFBfQ1NfUFJFQ0VERVMsIChsb2NhbGVfdClfX2xvYykpOworfQorCisvKiAxIGlmIGEgc3BhY2Ugc2VwYXJhdGVzIGN1cnJlbmN5X3N5bWJvbCBmcm9tIGEgcG9zaXRpdmUgdmFsdWUuICovCitpbnQgX0xvY2FsZV9wX3NlcF9ieV9zcGFjZShzdHJ1Y3QgX0xvY2FsZV9tb25ldGFyeSAqX19sb2MpCit7CisgIHJldHVybiAqKG5sX2xhbmdpbmZvX2woUF9TRVBfQllfU1BBQ0UsIChsb2NhbGVfdClfX2xvYykpOworfQorCisvKgorICogMCBQYXJlbnRoZXNlcyBzdXJyb3VuZCB0aGUgcXVhbnRpdHkgYW5kIGN1cnJlbmN5X3N5bWJvbAorICogMSBUaGUgc2lnbiBzdHJpbmcgcHJlY2VkZXMgdGhlIHF1YW50aXR5IGFuZCBjdXJyZW5jeV9zeW1ib2wKKyAqIDIgVGhlIHNpZ24gc3RyaW5nIHN1Y2NlZWRzIHRoZSBxdWFudGl0eSBhbmQgY3VycmVuY3lfc3ltYm9sLgorICogMyBUaGUgc2lnbiBzdHJpbmcgaW1tZWRpYXRlbHkgcHJlY2VkZXMgdGhlIGN1cnJlbmN5X3N5bWJvbC4KKyAqIDQgVGhlIHNpZ24gc3RyaW5nIGltbWVkaWF0ZWx5IHN1Y2NlZWRzIHRoZSBjdXJyZW5jeV9zeW1ib2wuCisgKi8KK2ludCBfTG9jYWxlX3Bfc2lnbl9wb3NuKHN0cnVjdCBfTG9jYWxlX21vbmV0YXJ5ICpfX2xvYykKK3sKKyAgcmV0dXJuICoobmxfbGFuZ2luZm9fbChQX1NJR05fUE9TTiwgKGxvY2FsZV90KV9fbG9jKSk7Cit9CisKKy8qIDEgaWYgY3VycmVuY3lfc3ltYm9sIHByZWNlZGVzIGEgbmVnYXRpdmUgdmFsdWUsIDAgaWYgc3VjY2VlZHMgKi8KK2ludCBfTG9jYWxlX25fY3NfcHJlY2VkZXMoc3RydWN0IF9Mb2NhbGVfbW9uZXRhcnkgKl9fbG9jKQoreworICByZXR1cm4gKihubF9sYW5naW5mb19sKE5fQ1NfUFJFQ0VERVMsIChsb2NhbGVfdClfX2xvYykpOworfQorCisvKiAxIGlmIGEgc3BhY2Ugc2VwYXJhdGVzIGN1cnJlbmN5X3N5bWJvbCBmcm9tIGEgbmVnYXRpdmUgdmFsdWUuICovCitpbnQgX0xvY2FsZV9uX3NlcF9ieV9zcGFjZShzdHJ1Y3QgX0xvY2FsZV9tb25ldGFyeSAqX19sb2MpCit7CisgIHJldHVybiAqKG5sX2xhbmdpbmZvX2woTl9TRVBfQllfU1BBQ0UsIChsb2NhbGVfdClfX2xvYykpOworfQorCisvKgorICogMCBQYXJlbnRoZXNlcyBzdXJyb3VuZCB0aGUgcXVhbnRpdHkgYW5kIGN1cnJlbmN5X3N5bWJvbAorICogMSBUaGUgc2lnbiBzdHJpbmcgcHJlY2VkZXMgdGhlIHF1YW50aXR5IGFuZCBjdXJyZW5jeV9zeW1ib2wKKyAqIDIgVGhlIHNpZ24gc3RyaW5nIHN1Y2NlZWRzIHRoZSBxdWFudGl0eSBhbmQgY3VycmVuY3lfc3ltYm9sLgorICogMyBUaGUgc2lnbiBzdHJpbmcgaW1tZWRpYXRlbHkgcHJlY2VkZXMgdGhlIGN1cnJlbmN5X3N5bWJvbC4KKyAqIDQgVGhlIHNpZ24gc3RyaW5nIGltbWVkaWF0ZWx5IHN1Y2NlZWRzIHRoZSBjdXJyZW5jeV9zeW1ib2wuCisgKi8KK2ludCBfTG9jYWxlX25fc2lnbl9wb3NuKHN0cnVjdCBfTG9jYWxlX21vbmV0YXJ5ICpfX2xvYykKK3sKKyAgcmV0dXJuICoobmxfbGFuZ2luZm9fbChOX1NJR05fUE9TTiwgKGxvY2FsZV90KV9fbG9jKSk7Cit9CisKKworLyogVGltZSAqLworY29uc3QgY2hhciAqX0xvY2FsZV9mdWxsX21vbnRobmFtZShzdHJ1Y3QgX0xvY2FsZV90aW1lICpfX2xvYywgaW50IF9tICkKK3sKKyAgcmV0dXJuIG5sX2xhbmdpbmZvX2woTU9OXzEgKyBfbSwgKGxvY2FsZV90KV9fbG9jKTsKK30KKworY29uc3QgY2hhciAqX0xvY2FsZV9hYmJyZXZfbW9udGhuYW1lKHN0cnVjdCBfTG9jYWxlX3RpbWUgKl9fbG9jLCBpbnQgX20gKQoreworICByZXR1cm4gbmxfbGFuZ2luZm9fbChBQk1PTl8xICsgX20sIChsb2NhbGVfdClfX2xvYyk7Cit9CisKK2NvbnN0IGNoYXIgKl9Mb2NhbGVfZnVsbF9kYXlvZndlZWsoc3RydWN0IF9Mb2NhbGVfdGltZSAqX19sb2MsIGludCBfZCApCit7CisgIHJldHVybiBubF9sYW5naW5mb19sKERBWV8xICsgX2QsIChsb2NhbGVfdClfX2xvYyk7Cit9CisKK2NvbnN0IGNoYXIgKl9Mb2NhbGVfYWJicmV2X2RheW9md2VlayhzdHJ1Y3QgX0xvY2FsZV90aW1lICpfX2xvYywgaW50IF9kICkKK3sKKyAgcmV0dXJuIG5sX2xhbmdpbmZvX2woQUJEQVlfMSArIF9kLCAobG9jYWxlX3QpX19sb2MpOworfQorCitjb25zdCBjaGFyICpfTG9jYWxlX2RfdF9mbXQoc3RydWN0IF9Mb2NhbGVfdGltZSAqX19sb2MpCit7CisgIHJldHVybiBubF9sYW5naW5mb19sKERfVF9GTVQsIChsb2NhbGVfdClfX2xvYyk7Cit9CisKK2NvbnN0IGNoYXIgKl9Mb2NhbGVfZF9mbXQoc3RydWN0IF9Mb2NhbGVfdGltZSAqX19sb2MgKQoreworICByZXR1cm4gbmxfbGFuZ2luZm9fbChEX0ZNVCwgKGxvY2FsZV90KV9fbG9jKTsKK30KKworY29uc3QgY2hhciAqX0xvY2FsZV90X2ZtdChzdHJ1Y3QgX0xvY2FsZV90aW1lICpfX2xvYyApCit7CisgIHJldHVybiBubF9sYW5naW5mb19sKFRfRk1ULCAobG9jYWxlX3QpX19sb2MpOworfQorCitjb25zdCBjaGFyICpfTG9jYWxlX2xvbmdfZF90X2ZtdChzdHJ1Y3QgX0xvY2FsZV90aW1lICpfX2xvYyApCit7CisgIHJldHVybiBubF9sYW5naW5mb19sKEVSQV9EX1RfRk1ULCAobG9jYWxlX3QpX19sb2MpOworfQorCitjb25zdCBjaGFyICpfTG9jYWxlX2xvbmdfZF9mbXQoc3RydWN0IF9Mb2NhbGVfdGltZSAqX19sb2MgKQoreworICByZXR1cm4gbmxfbGFuZ2luZm9fbChFUkFfRF9GTVQsIChsb2NhbGVfdClfX2xvYyk7Cit9CisKK2NvbnN0IGNoYXIgKl9Mb2NhbGVfYW1fc3RyKHN0cnVjdCBfTG9jYWxlX3RpbWUgKl9fbG9jICkKK3sKKyAgcmV0dXJuIG5sX2xhbmdpbmZvX2woQU1fU1RSLCAobG9jYWxlX3QpX19sb2MpOworfQorCitjb25zdCBjaGFyICpfTG9jYWxlX3BtX3N0cihzdHJ1Y3QgX0xvY2FsZV90aW1lKiBfX2xvYyApCit7CisgIHJldHVybiBubF9sYW5naW5mb19sKFBNX1NUUiwgKGxvY2FsZV90KV9fbG9jKTsKK30KKworI2lmbmRlZiBfU1RMUF9OT19XQ0hBUl9UCitjb25zdCB3Y2hhcl90ICpfV0xvY2FsZV9mdWxsX21vbnRobmFtZShzdHJ1Y3QgX0xvY2FsZV90aW1lICpfX2xvYywgaW50IF9tLCB3Y2hhcl90ICpidWYsIHNpemVfdCBidWZTaXplKQoreyByZXR1cm4gX1RvV0NoYXIoX0xvY2FsZV9mdWxsX21vbnRobmFtZShfX2xvYywgX20pLCBidWYsIGJ1ZlNpemUpOyB9Citjb25zdCB3Y2hhcl90ICpfV0xvY2FsZV9hYmJyZXZfbW9udGhuYW1lKHN0cnVjdCBfTG9jYWxlX3RpbWUgKl9fbG9jLCBpbnQgX20sIHdjaGFyX3QgKmJ1Ziwgc2l6ZV90IGJ1ZlNpemUpCit7IHJldHVybiBfVG9XQ2hhcihfTG9jYWxlX2FiYnJldl9tb250aG5hbWUoX19sb2MsIF9tKSwgYnVmLCBidWZTaXplKTsgfQorY29uc3Qgd2NoYXJfdCAqX1dMb2NhbGVfZnVsbF9kYXlvZndlZWsoc3RydWN0IF9Mb2NhbGVfdGltZSAqX19sb2MsIGludCBfZCwgd2NoYXJfdCAqYnVmLCBzaXplX3QgYnVmU2l6ZSkKK3sgcmV0dXJuIF9Ub1dDaGFyKF9Mb2NhbGVfZnVsbF9kYXlvZndlZWsoX19sb2MsIF9kKSwgYnVmLCBidWZTaXplKTsgfQorY29uc3Qgd2NoYXJfdCAqX1dMb2NhbGVfYWJicmV2X2RheW9md2VlayhzdHJ1Y3QgX0xvY2FsZV90aW1lICpfX2xvYywgaW50IF9kLCB3Y2hhcl90ICpidWYsIHNpemVfdCBidWZTaXplKQoreyByZXR1cm4gX1RvV0NoYXIoX0xvY2FsZV9hYmJyZXZfZGF5b2Z3ZWVrKF9fbG9jLCBfZCksIGJ1ZiwgYnVmU2l6ZSk7IH0KK2NvbnN0IHdjaGFyX3QgKl9XTG9jYWxlX2FtX3N0cihzdHJ1Y3QgX0xvY2FsZV90aW1lICpfX2xvYywgd2NoYXJfdCAqYnVmLCBzaXplX3QgYnVmU2l6ZSkKK3sgcmV0dXJuIF9Ub1dDaGFyKF9Mb2NhbGVfYW1fc3RyKF9fbG9jKSwgYnVmLCBidWZTaXplKTsgfQorY29uc3Qgd2NoYXJfdCAqX1dMb2NhbGVfcG1fc3RyKHN0cnVjdCBfTG9jYWxlX3RpbWUqIF9fbG9jLCB3Y2hhcl90ICpidWYsIHNpemVfdCBidWZTaXplKQoreyByZXR1cm4gX1RvV0NoYXIoX0xvY2FsZV9wbV9zdHIoX19sb2MpLCBidWYsIGJ1ZlNpemUpOyB9CisjZW5kaWYKKworLyogTWVzc2FnZXMgKi8KKworbmxfY2F0ZF90eXBlIF9Mb2NhbGVfY2F0b3BlbihzdHJ1Y3QgX0xvY2FsZV9tZXNzYWdlcyAqX19sb2MsIGNvbnN0IGNoYXIgKl9fY2F0X25hbWUgKQoreworICByZXR1cm4gY2F0b3BlbiggX19jYXRfbmFtZSwgTkxfQ0FUX0xPQ0FMRSApOworfQorCit2b2lkIF9Mb2NhbGVfY2F0Y2xvc2Uoc3RydWN0IF9Mb2NhbGVfbWVzc2FnZXMgKl9fbG9jLCBubF9jYXRkX3R5cGUgX19jYXQgKQoreworICBjYXRjbG9zZSggX19jYXQgKTsKK30KKworY29uc3QgY2hhciAqX0xvY2FsZV9jYXRnZXRzKHN0cnVjdCBfTG9jYWxlX21lc3NhZ2VzICpfX2xvYywgbmxfY2F0ZF90eXBlIF9fY2F0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBfX3NldGlkLCBpbnQgX19tc2dpZCwgY29uc3QgY2hhciAqZGZhdWx0KQoreworICByZXR1cm4gY2F0Z2V0cyggX19jYXQsIF9fc2V0aWQsIF9fbXNnaWQsIGRmYXVsdCApOworfQpkaWZmIC0tZ2l0IGEvc3JjL2NfbG9jYWxlX3dpbjMyL2NfbG9jYWxlX3dpbjMyLmMgYi9zcmMvY19sb2NhbGVfd2luMzIvY19sb2NhbGVfd2luMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWI5NThkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NfbG9jYWxlX3dpbjMyL2NfbG9jYWxlX3dpbjMyLmMKQEAgLTAsMCArMSwxNzg2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFdyaXR0ZW4gMjAwMAorICogQW50b24gTGFwYWNoCisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpZiBkZWZpbmVkIChfU1RMUF9NU1ZDKSB8fCBkZWZpbmVkIChfX0lDTCkKKyMgIGluY2x1ZGUgPG1lbW9yeS5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bG9jYWxlLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9TQUZFX1NUUklOR19GVU5DVElPTlMpCisjICBkZWZpbmUgX1NUTFBfU1RSQ1BZKEQsIERTLCBTKSBzdHJjcHlfcyhELCBEUywgUykKKyMgIGRlZmluZSBfU1RMUF9TVFJOQ1BZKEQsIERTLCBTLCBDKSBzdHJuY3B5X3MoRCwgRFMsIFMsIEMpCisjICBkZWZpbmUgX1NUTFBfU1RSQ0FUKEQsIERTLCBTKSBzdHJjYXRfcyhELCBEUywgUykKKyNlbHNlCisjICBkZWZpbmUgX1NUTFBfU1RSQ1BZKEQsIERTLCBTKSBzdHJjcHkoRCwgUykKKyMgIGRlZmluZSBfU1RMUF9TVFJOQ1BZKEQsIERTLCBTLCBDKSBzdHJuY3B5KEQsIFMsIEMpCisjICBkZWZpbmUgX1NUTFBfU1RSQ0FUKEQsIERTLCBTKSBzdHJjYXQoRCwgUykKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBGcmFtZXdvcmsgZnVuY3Rpb25zICovCisvKgorICBsb2NhbGUgOjogImxhbmdbX2NvdW50cnlbLmNvZGVfcGFnZV1dIgorICB8ICIuY29kZV9wYWdlIgorICB8ICIiCisgIHwgTlVMTAorCisqLworCit0eXBlZGVmIHN0cnVjdCBfTE9DQUxFQ09OViB7CisgIGNvbnN0IGNoYXIqIG5hbWU7CisgIGNvbnN0IGNoYXIqIGFiYnJldjsKK30gTE9DQUxFQ09OVjsKKworI2RlZmluZSBNQVhfTEFOR19MRU4gICAgICAgIDY0ICAvKiBtYXggbGFuZ3VhZ2UgbmFtZSBsZW5ndGggKi8KKyNkZWZpbmUgTUFYX0NUUllfTEVOICAgICAgICA2NCAgLyogbWF4IGNvdW50cnkgbmFtZSBsZW5ndGggKi8KKyNkZWZpbmUgTUFYX01PRElGSUVSX0xFTiAgICAwICAgLyogbWF4IG1vZGlmaWVyIG5hbWUgbGVuZ3RoIC0gbi9hICovCisjZGVmaW5lIE1BWF9MQ19MRU4gICAgICAgICAgKE1BWF9MQU5HX0xFTitNQVhfQ1RSWV9MRU4rTUFYX01PRElGSUVSX0xFTiszKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtYXggZW50aXJlIGxvY2FsZSBzdHJpbmcgbGVuZ3RoICovCisjZGVmaW5lIE1BWF9DUF9MRU4gICAgICAgICAgNSAgIC8qIG1heCBjb2RlIHBhZ2UgbmFtZSBsZW5ndGggKi8KKworI2lmICFkZWZpbmVkIChMQU5HX0lOVkFSSUFOVCkKKyMgIGRlZmluZSBMQU5HX0lOVkFSSUFOVCAweDdmCisjICBkZWZpbmUgX1NUTFBfTEFOR19JTlZBUklBTlRfREVGSU5FRAorI2VuZGlmCisKKyNpZm5kZWYgQ1BfVVRGNworIyAgZGVmaW5lIENQX1VURjcgNjUwMDAKKyNlbmRpZgorCisjaWZuZGVmIENQX1VURjgKKyMgIGRlZmluZSBDUF9VVEY4IDY1MDAxCisjZW5kaWYKKworI2RlZmluZSBJTlZBUklBTlRfTENJRCBNQUtFTENJRChNQUtFTEFOR0lEKExBTkdfSU5WQVJJQU5ULCBTVUJMQU5HX05FVVRSQUwpLCBTT1JUX0RFRkFVTFQpCisKK3N0YXRpYyBjb25zdCBjaGFyICpfQ19uYW1lID0gIkMiOworCisvKiAgbm9uLU5MUyBsYW5ndWFnZSBzdHJpbmcgdGFibGUgKi8KK3N0YXRpYyBMT0NBTEVDT05WIF9fcmdfbGFuZ3VhZ2VbXSA9IHsKKyAgeyJhbWVyaWNhbiIsICAgICAgICAgICAgICAgICAgICAiRU5VIn0sCisgIHsiYW1lcmljYW4gZW5nbGlzaCIsICAgICAgICAgICAgIkVOVSJ9LAorICB7ImFtZXJpY2FuLWVuZ2xpc2giLCAgICAgICAgICAgICJFTlUifSwKKyAgeyJhdXN0cmFsaWFuIiwgICAgICAgICAgICAgICAgICAiRU5BIn0sCisgIHsiYmVsZ2lhbiIsICAgICAgICAgICAgICAgICAgICAgIk5MQiJ9LAorICB7ImNhbmFkaWFuIiwgICAgICAgICAgICAgICAgICAgICJFTkMifSwKKyAgeyJjaGgiLCAgICAgICAgICAgICAgICAgICAgICAgICAiWkhIIn0sCisgIHsiY2hpIiwgICAgICAgICAgICAgICAgICAgICAgICAgIlpISSJ9LAorICB7ImNoaW5lc2UiLCAgICAgICAgICAgICAgICAgICAgICJDSFMifSwKKyAgeyJjaGluZXNlLWhvbmdrb25nIiwgICAgICAgICAgICAiWkhIIn0sCisgIHsiY2hpbmVzZS1zaW1wbGlmaWVkIiwgICAgICAgICAgIkNIUyJ9LAorICB7ImNoaW5lc2Utc2luZ2Fwb3JlIiwgICAgICAgICAgICJaSEkifSwKKyAgeyJjaGluZXNlLXRyYWRpdGlvbmFsIiwgICAgICAgICAiQ0hUIn0sCisgIHsiZHV0Y2gtYmVsZ2lhbiIsICAgICAgICAgICAgICAgIk5MQiJ9LAorICB7ImVuZ2xpc2gtYW1lcmljYW4iLCAgICAgICAgICAgICJFTlUifSwKKyAgeyJlbmdsaXNoLWF1cyIsICAgICAgICAgICAgICAgICAiRU5BIn0sCisgIHsiZW5nbGlzaC1iZWxpemUiLCAgICAgICAgICAgICAgIkVOTCJ9LAorICB7ImVuZ2xpc2gtY2FuIiwgICAgICAgICAgICAgICAgICJFTkMifSwKKyAgeyJlbmdsaXNoLWNhcmliYmVhbiIsICAgICAgICAgICAiRU5CIn0sCisgIHsiZW5nbGlzaC1pcmUiLCAgICAgICAgICAgICAgICAgIkVOSSJ9LAorICB7ImVuZ2xpc2gtamFtYWljYSIsICAgICAgICAgICAgICJFTkoifSwKKyAgeyJlbmdsaXNoLW56IiwgICAgICAgICAgICAgICAgICAiRU5aIn0sCisgIHsiZW5nbGlzaC1zb3V0aCBhZnJpY2EiLCAgICAgICAgIkVOUyJ9LAorICB7ImVuZ2xpc2gtdHJpbmlkYWQgeSB0b2JhZ28iLCAgICJFTlQifSwKKyAgeyJlbmdsaXNoLXVrIiwgICAgICAgICAgICAgICAgICAiRU5HIn0sCisgIHsiZW5nbGlzaC11cyIsICAgICAgICAgICAgICAgICAgIkVOVSJ9LAorICB7ImVuZ2xpc2gtdXNhIiwgICAgICAgICAgICAgICAgICJFTlUifSwKKyAgeyJmcmVuY2gtYmVsZ2lhbiIsICAgICAgICAgICAgICAiRlJCIn0sCisgIHsiZnJlbmNoLWNhbmFkaWFuIiwgICAgICAgICAgICAgIkZSQyJ9LAorICB7ImZyZW5jaC1sdXhlbWJvdXJnIiwgICAgICAgICAgICJGUkwifSwKKyAgeyJmcmVuY2gtc3dpc3MiLCAgICAgICAgICAgICAgICAiRlJTIn0sCisgIHsiZ2VybWFuLWF1c3RyaWFuIiwgICAgICAgICAgICAgIkRFQSJ9LAorICB7Imdlcm1hbi1saWNodGVuc3RlaW4iLCAgICAgICAgICJERUMifSwKKyAgeyJnZXJtYW4tbHV4ZW1ib3VyZyIsICAgICAgICAgICAiREVMIn0sCisgIHsiZ2VybWFuLXN3aXNzIiwgICAgICAgICAgICAgICAgIkRFUyJ9LAorICB7ImlyaXNoLWVuZ2xpc2giLCAgICAgICAgICAgICAgICJFTkkifSwKKyAgeyJpdGFsaWFuLXN3aXNzIiwgICAgICAgICAgICAgICAiSVRTIn0sCisgIHsibm9yd2VnaWFuIiwgICAgICAgICAgICAgICAgICAgIk5PUiJ9LAorICB7Im5vcndlZ2lhbi1ib2ttYWwiLCAgICAgICAgICAgICJOT1IifSwKKyAgeyJub3J3ZWdpYW4tbnlub3JzayIsICAgICAgICAgICAiTk9OIn0sCisgIHsicG9ydHVndWVzZS1icmF6aWxpYW4iLCAgICAgICAgIlBUQiJ9LAorICB7InNwYW5pc2gtYXJnZW50aW5hIiwgICAgICAgICAgICJFU1MifSwKKyAgeyJzcGFuaXNoLWJvbGl2aWEiLCAgICAgICAgICAgICAiRVNCIn0sCisgIHsic3BhbmlzaC1jaGlsZSIsICAgICAgICAgICAgICAgIkVTTCJ9LAorICB7InNwYW5pc2gtY29sb21iaWEiLCAgICAgICAgICAgICJFU08ifSwKKyAgeyJzcGFuaXNoLWNvc3RhIHJpY2EiLCAgICAgICAgICAiRVNDIn0sCisgIHsic3BhbmlzaC1kb21pbmljYW4gcmVwdWJsaWMiLCAgIkVTRCJ9LAorICB7InNwYW5pc2gtZWN1YWRvciIsICAgICAgICAgICAgICJFU0YifSwKKyAgeyJzcGFuaXNoLWVsIHNhbHZhZG9yIiwgICAgICAgICAiRVNFIn0sCisgIHsic3BhbmlzaC1ndWF0ZW1hbGEiLCAgICAgICAgICAgIkVTRyJ9LAorICB7InNwYW5pc2gtaG9uZHVyYXMiLCAgICAgICAgICAgICJFU0gifSwKKyAgeyJzcGFuaXNoLW1leGljYW4iLCAgICAgICAgICAgICAiRVNNIn0sCisgIHsic3BhbmlzaC1tb2Rlcm4iLCAgICAgICAgICAgICAgIkVTTiJ9LAorICB7InNwYW5pc2gtbmljYXJhZ3VhIiwgICAgICAgICAgICJFU0kifSwKKyAgeyJzcGFuaXNoLXBhbmFtYSIsICAgICAgICAgICAgICAiRVNBIn0sCisgIHsic3BhbmlzaC1wYXJhZ3VheSIsICAgICAgICAgICAgIkVTWiJ9LAorICB7InNwYW5pc2gtcGVydSIsICAgICAgICAgICAgICAgICJFU1IifSwKKyAgeyJzcGFuaXNoLXB1ZXJ0byByaWNvIiwgICAgICAgICAiRVNVIn0sCisgIHsic3BhbmlzaC11cnVndWF5IiwgICAgICAgICAgICAgIkVTWSJ9LAorICB7InNwYW5pc2gtdmVuZXp1ZWxhIiwgICAgICAgICAgICJFU1YifSwKKyAgeyJzd2VkaXNoLWZpbmxhbmQiLCAgICAgICAgICAgICAiU1ZGIn0sCisgIHsic3dpc3MiLCAgICAgICAgICAgICAgICAgICAgICAgIkRFUyJ9LAorICB7InVrIiwgICAgICAgICAgICAgICAgICAgICAgICAgICJFTkcifSwKKyAgeyJ1cyIsICAgICAgICAgICAgICAgICAgICAgICAgICAiRU5VIn0sCisgIHsidXNhIiwgICAgICAgICAgICAgICAgICAgICAgICAgIkVOVSJ9Cit9OworCisvKiAgbm9uLU5MUyBjb3VudHJ5IHN0cmluZyB0YWJsZSAqLworc3RhdGljIExPQ0FMRUNPTlYgX19yZ19jb3VudHJ5W10gPSB7CisgIHsiYW1lcmljYSIsICAgICAgICAgICAgICAgICAgICAgIlVTQSJ9LAorICB7ImJyaXRhaW4iLCAgICAgICAgICAgICAgICAgICAgICJHQlIifSwKKyAgeyJjaGluYSIsICAgICAgICAgICAgICAgICAgICAgICAiQ0hOIn0sCisgIHsiY3plY2giLCAgICAgICAgICAgICAgICAgICAgICAgIkNaRSJ9LAorICB7ImVuZ2xhbmQiLCAgICAgICAgICAgICAgICAgICAgICJHQlIifSwKKyAgeyJncmVhdCBicml0YWluIiwgICAgICAgICAgICAgICAiR0JSIn0sCisgIHsiaG9sbGFuZCIsICAgICAgICAgICAgICAgICAgICAgIk5MRCJ9LAorICB7Imhvbmcta29uZyIsICAgICAgICAgICAgICAgICAgICJIS0cifSwKKyAgeyJuZXctemVhbGFuZCIsICAgICAgICAgICAgICAgICAiTlpMIn0sCisgIHsibnoiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIk5aTCJ9LAorICB7InByIGNoaW5hIiwgICAgICAgICAgICAgICAgICAgICJDSE4ifSwKKyAgeyJwci1jaGluYSIsICAgICAgICAgICAgICAgICAgICAiQ0hOIn0sCisgIHsicHVlcnRvLXJpY28iLCAgICAgICAgICAgICAgICAgIlBSSSJ9LAorICB7InNsb3ZhayIsICAgICAgICAgICAgICAgICAgICAgICJTVksifSwKKyAgeyJzb3V0aCBhZnJpY2EiLCAgICAgICAgICAgICAgICAiWkFGIn0sCisgIHsic291dGgga29yZWEiLCAgICAgICAgICAgICAgICAgIktPUiJ9LAorICB7InNvdXRoLWFmcmljYSIsICAgICAgICAgICAgICAgICJaQUYifSwKKyAgeyJzb3V0aC1rb3JlYSIsICAgICAgICAgICAgICAgICAiS09SIn0sCisgIHsidHJpbmlkYWQgJiB0b2JhZ28iLCAgICAgICAgICAgIlRUTyJ9LAorICB7InVrIiwgICAgICAgICAgICAgICAgICAgICAgICAgICJHQlIifSwKKyAgeyJ1bml0ZWQta2luZ2RvbSIsICAgICAgICAgICAgICAiR0JSIn0sCisgIHsidW5pdGVkLXN0YXRlcyIsICAgICAgICAgICAgICAgIlVTQSJ9LAorICB7InVzIiwgICAgICAgICAgICAgICAgICAgICAgICAgICJVU0EifSwKK307CisKK3R5cGVkZWYgc3RydWN0IF9Mb2NhbGVfbmFtZV9oaW50IHsKKyAgTENJRCBpZDsKK30gX0xvY2FsZV9sY2lkX3Q7CisKK3R5cGVkZWYgc3RydWN0IF9Mb2NhbGVfY3R5cGUgeworICBfTG9jYWxlX2xjaWRfdCBsYzsKKyAgVUlOVCBjcDsKKyAgdW5zaWduZWQgc2hvcnQgY3RhYmxlWzI1Nl07Cit9IF9Mb2NhbGVfY3R5cGVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgX0xvY2FsZV9udW1lcmljIHsKKyAgX0xvY2FsZV9sY2lkX3QgbGM7CisgIGNoYXIgY3BbTUFYX0NQX0xFTiArIDFdOworICBjaGFyIGRlY2ltYWxfcG9pbnRbNF07CisgIGNoYXIgdGhvdXNhbmRzX3NlcFs0XTsKKyAgY2hhciAqZ3JvdXBpbmc7Cit9IF9Mb2NhbGVfbnVtZXJpY190OworCit0eXBlZGVmIHN0cnVjdCBfTG9jYWxlX3RpbWUgeworICBfTG9jYWxlX2xjaWRfdCBsYzsKKyAgY2hhciBjcFtNQVhfQ1BfTEVOICsgMV07CisgIGNoYXIgKm1vbnRoWzEyXTsKKyAgY2hhciAqYWJicmV2X21vbnRoWzEyXTsKKyAgY2hhciAqZGF5b2Z3ZWVrWzddOworICBjaGFyICphYmJyZXZfZGF5b2Z3ZWVrWzddOworICBjaGFyICpkYXRlX3RpbWVfZm9ybWF0OworICBjaGFyICpsb25nX2RhdGVfdGltZV9mb3JtYXQ7CisgIGNoYXIgKmRhdGVfZm9ybWF0OworICBjaGFyICpsb25nX2RhdGVfZm9ybWF0OworICBjaGFyICp0aW1lX2Zvcm1hdDsKKyAgY2hhciBhbVs5XTsKKyAgY2hhciBwbVs5XTsKK30gX0xvY2FsZV90aW1lX3Q7CisKK3R5cGVkZWYgc3RydWN0IF9Mb2NhbGVfY29sbGF0ZSB7CisgIF9Mb2NhbGVfbGNpZF90IGxjOworICBjaGFyIGNwW01BWF9DUF9MRU4gKyAxXTsKK30gX0xvY2FsZV9jb2xsYXRlX3Q7CisKK3R5cGVkZWYgc3RydWN0IF9Mb2NhbGVfbW9uZXRhcnkgeworICBfTG9jYWxlX2xjaWRfdCBsYzsKKyAgY2hhciBjcFtNQVhfQ1BfTEVOICsgMV07CisgIGNoYXIgZGVjaW1hbF9wb2ludFs0XTsKKyAgY2hhciB0aG91c2FuZHNfc2VwWzRdOworICBjaGFyICpncm91cGluZzsKKyAgY2hhciBpbnRfY3Vycl9zeW1ib2xbNV07IC8qIDMgKyAxICsgMSAqLworICBjaGFyIGN1cnJfc3ltYm9sWzZdOworICBjaGFyIG5lZ2F0aXZlX3NpZ25bNV07CisgIGNoYXIgcG9zaXRpdmVfc2lnbls1XTsKKyAgaW50IGZyYWNfZGlnaXRzOworICBpbnQgaW50X2ZyYWNfZGlnaXRzOworfSBfTG9jYWxlX21vbmV0YXJ5X3Q7CisKKy8qIEludGVybmFsIGZ1bmN0aW9uICovCitzdGF0aWMgdm9pZCBfX0ZpeEdyb3VwaW5nKGNoYXIgKmdyb3VwaW5nKTsKK3N0YXRpYyBjb25zdCBjaGFyKiBfX0NvbnZlcnROYW1lKGNvbnN0IGNoYXIqIGxuYW1lLCBMT0NBTEVDT05WKiBDb252VGFibGUsIGludCBUYWJsZVNpemUpOworc3RhdGljIGludCBfX1BhcnNlTG9jYWxlU3RyaW5nKGNvbnN0IGNoYXIqIGxuYW1lLCBjaGFyKiBsYW5nLCBjaGFyKiBjdHJ5LCBjaGFyKiBwYWdlKTsKK3N0YXRpYyBpbnQgX19HZXRMQ0lEKGNvbnN0IGNoYXIqIGxhbmcsIGNvbnN0IGNoYXIqIGN0cnksIExDSUQqIGxjaWQpOworc3RhdGljIGludCBfX0dldExDSURGcm9tTmFtZShjb25zdCBjaGFyKiBsbmFtZSwgTENJRCogbGNpZCwgY2hhciAqY3AsIF9Mb2NhbGVfbGNpZF90ICpoaW50KTsKK3N0YXRpYyBjaGFyIGNvbnN0KiBfX0dldExvY2FsZU5hbWUoTENJRCBsY2lkLCBjb25zdCBjaGFyKiBjcCwgY2hhciogYnVmKTsKK3N0YXRpYyBjaGFyIGNvbnN0KiBfX0V4dHJhY3RfbG9jYWxlX25hbWUoY29uc3QgY2hhciogbG9jLCBjb25zdCBjaGFyKiBjYXRlZ29yeSwgY2hhciogYnVmKTsKK3N0YXRpYyBjaGFyIGNvbnN0KiBfX1RyYW5zbGF0ZVRvU3lzdGVtKGNvbnN0IGNoYXIqIGxuYW1lLCBjaGFyKiBidWYsIF9Mb2NhbGVfbGNpZF90KiBoaW50LCBpbnQgKl9fZXJyX2NvZGUpOworc3RhdGljIHZvaWQgX19HZXRMb2NhbGVJbmZvVXNpbmdBQ1AoTENJRCBsY2lkLCBjb25zdCBjaGFyKiBjcCwgTENUWVBFIGxjdHlwZSwgY2hhciogYnVmLCBpbnQgYnVmX3NpemUsIHdjaGFyX3QqIHdidWYsIGludCB3YnVmX3NpemUpOworc3RhdGljIGludCBfX2ludEdldEFDUChMQ0lEIGxjaWQpOworc3RhdGljIGludCBfX2ludEdldE9DUChMQ0lEIGxjaWQpOworc3RhdGljIGludCBfX0dldERlZmF1bHRDUChMQ0lEIGxjaWQpOworc3RhdGljIGNoYXIqIF9fQ29udmVydFRvQ1AoaW50IGZyb21fY3AsIGludCB0b19jcCwgY29uc3QgY2hhciAqZnJvbSwgc2l6ZV90IHNpemUsIHNpemVfdCAqcmV0X2J1Zl9zaXplKTsKK3N0YXRpYyB2b2lkIG15X2x0b2EobG9uZyBfX3gsIGNoYXIqIGJ1Zik7CisKK3ZvaWQgbXlfbHRvYShsb25nIF9feCwgY2hhciogYnVmKSB7CisgIGNoYXIgcmJ1Zls2NF07CisgIGNoYXIqIHB0ciA9IHJidWY7CisKKyAgaWYgKF9feCA9PSAwKQorICAgICpwdHIrKyA9ICcwJzsKKyAgZWxzZSB7CisgICAgZm9yICg7IF9feCAhPSAwOyBfX3ggLz0gMTApCisgICAgICAqcHRyKysgPSAoY2hhcikoX194ICUgMTApICsgJzAnOworICB9CisgIHdoaWxlKHB0ciA+IHJidWYpICpidWYrKyA9ICotLXB0cjsKKyAgLyogcHN3ICovCisgICpidWYgPSAnXDAnOworfQorCisjaWYgZGVmaW5lZCAoX19jcGx1c3BsdXMpCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK19Mb2NhbGVfbGNpZF90KiBfTG9jYWxlX2dldF9jdHlwZV9oaW50KF9Mb2NhbGVfY3R5cGVfdCogbHR5cGUpCit7IHJldHVybiAobHR5cGUgIT0gMCkgPyAmbHR5cGUtPmxjIDogMDsgfQorX0xvY2FsZV9sY2lkX3QqIF9Mb2NhbGVfZ2V0X251bWVyaWNfaGludChfTG9jYWxlX251bWVyaWNfdCogbG51bWVyaWMpCit7IHJldHVybiAobG51bWVyaWMgIT0gMCkgPyAmbG51bWVyaWMtPmxjIDogMDsgfQorX0xvY2FsZV9sY2lkX3QqIF9Mb2NhbGVfZ2V0X3RpbWVfaGludChfTG9jYWxlX3RpbWVfdCogbHRpbWUpCit7IHJldHVybiAobHRpbWUgIT0gMCkgPyAmbHRpbWUtPmxjIDogMDsgfQorX0xvY2FsZV9sY2lkX3QqIF9Mb2NhbGVfZ2V0X2NvbGxhdGVfaGludChfTG9jYWxlX2NvbGxhdGVfdCogbGNvbGxhdGUpCit7IHJldHVybiAobGNvbGxhdGUgIT0gMCkgPyAmbGNvbGxhdGUtPmxjIDogMDsgfQorX0xvY2FsZV9sY2lkX3QqIF9Mb2NhbGVfZ2V0X21vbmV0YXJ5X2hpbnQoX0xvY2FsZV9tb25ldGFyeV90KiBsbW9uZXRhcnkpCit7IHJldHVybiAobG1vbmV0YXJ5ICE9IDApID8gJmxtb25ldGFyeS0+bGMgOiAwOyB9CitfTG9jYWxlX2xjaWRfdCogX0xvY2FsZV9nZXRfbWVzc2FnZXNfaGludChzdHJ1Y3QgX0xvY2FsZV9tZXNzYWdlcyogbG1lc3NhZ2VzKSB7CisgIF9TVExQX01BUktfUEFSQU1FVEVSX0FTX1VOVVNFRChsbWVzc2FnZXMpCisgIHJldHVybiAwOworfQorCisjZGVmaW5lIE1BUCh4LCB5KSBpZiAoKG1hc2sgJiB4KSAhPSAwKSByZXQgfD0gKHkpCit1bnNpZ25lZCBzaG9ydCBNYXBDdHlwZU1hc2sodW5zaWduZWQgc2hvcnQgbWFzaykgeworICB1bnNpZ25lZCBzaG9ydCByZXQgPSAwOworICBNQVAoQzFfVVBQRVIsIF9Mb2NhbGVfVVBQRVIgfCBfTG9jYWxlX1BSSU5UKTsKKyAgTUFQKEMxX0xPV0VSLCBfTG9jYWxlX0xPV0VSIHwgX0xvY2FsZV9QUklOVCk7CisgIE1BUChDMV9ESUdJVCwgX0xvY2FsZV9ESUdJVCB8IF9Mb2NhbGVfUFJJTlQpOworICBNQVAoQzFfU1BBQ0UsIF9Mb2NhbGVfU1BBQ0UgfCBfTG9jYWxlX1BSSU5UKTsKKyAgTUFQKEMxX1BVTkNULCBfTG9jYWxlX1BVTkNUIHwgX0xvY2FsZV9QUklOVCk7CisgIC8qIE1BUChDMV9CTEFOSywgPyk7ICovCisgIE1BUChDMV9YRElHSVQsIF9Mb2NhbGVfWERJR0lUIHwgX0xvY2FsZV9QUklOVCk7CisgIE1BUChDMV9BTFBIQSwgX0xvY2FsZV9BTFBIQSB8IF9Mb2NhbGVfUFJJTlQpOworICBpZiAoKG1hc2sgJiBDMV9DTlRSTCkgIT0gMCkgeyByZXQgfD0gX0xvY2FsZV9DTlRSTDsgcmV0ICY9IH5fTG9jYWxlX1BSSU5UOyB9CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIE1hcEN0eXBlTWFza3ModW5zaWduZWQgc2hvcnQgKmN1ciwgdW5zaWduZWQgc2hvcnQgKmVuZCkgeworICBmb3IgKDsgY3VyICE9IGVuZDsgKytjdXIpIHsKKyAgICAqY3VyID0gTWFwQ3R5cGVNYXNrKCpjdXIpOworICB9Cit9CisKK19Mb2NhbGVfY3R5cGVfdCogX0xvY2FsZV9jdHlwZV9jcmVhdGUoY29uc3QgY2hhciAqIG5hbWUsIF9Mb2NhbGVfbGNpZF90KiBsY19oaW50LCBpbnQgKl9fZXJyX2NvZGUpIHsKKyAgY2hhciBjcF9uYW1lW01BWF9DUF9MRU4gKyAxXTsKKyAgaW50IE5hdGl2ZUNQOworICB1bnNpZ25lZCBjaGFyIEJ1ZmZlclsyNTZdOworICB1bnNpZ25lZCBjaGFyICpwdHI7CisgIENQSU5GTyBDUEluZm87CisgIGludCBpOworICB3Y2hhcl90ICp3YnVmZmVyOworICBpbnQgQnVmZmVyU2l6ZTsKKworICBfTG9jYWxlX2N0eXBlX3QgKmx0eXBlID0gKF9Mb2NhbGVfY3R5cGVfdCopbWFsbG9jKHNpemVvZihfTG9jYWxlX2N0eXBlX3QpKTsKKworICBpZiAoIWx0eXBlKSB7ICpfX2Vycl9jb2RlID0gX1NUTFBfTE9DX05PX01FTU9SWTsgcmV0dXJuIGx0eXBlOyB9CisgIG1lbXNldChsdHlwZSwgMCwgc2l6ZW9mKF9Mb2NhbGVfY3R5cGVfdCkpOworCisgIGlmIChfX0dldExDSURGcm9tTmFtZShuYW1lLCAmbHR5cGUtPmxjLmlkLCBjcF9uYW1lLCBsY19oaW50KSA9PSAtMSkKKyAgeyBmcmVlKGx0eXBlKTsgKl9fZXJyX2NvZGUgPSBfU1RMUF9MT0NfVU5LTk9XTl9OQU1FOyByZXR1cm4gTlVMTDsgfQorCisjaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKQorICBpZiAoIGx0eXBlLT5sYy5pZCA9PSBJTlZBUklBTlRfTENJRCAmJiBuYW1lWzBdID09ICdDJyAmJiBuYW1lWzFdID09IDAgKQorICB7IGx0eXBlLT5sYy5pZCA9IDB4NDA5OyB9CisjZW5kaWYKKworICBsdHlwZS0+Y3AgPSBhdG9pKGNwX25hbWUpOworCisgIE5hdGl2ZUNQID0gX19HZXREZWZhdWx0Q1AobHR5cGUtPmxjLmlkKTsKKworICAvKiBNYWtlIHRhYmxlIHdpdGggYWxsIGNoYXJhY3RlcnMuICovCisgIGZvciAoaSA9IDA7IGkgPCAyNTY7ICsraSkgQnVmZmVyW2ldID0gKHVuc2lnbmVkIGNoYXIpaTsKKworICBpZiAoIUdldENQSW5mbyhOYXRpdmVDUCwgJkNQSW5mbykpIHsgZnJlZShsdHlwZSk7IHJldHVybiBOVUxMOyB9CisKKyAgaWYgKENQSW5mby5NYXhDaGFyU2l6ZSA+IDEpIHsKKyAgICBmb3IgKHB0ciA9ICh1bnNpZ25lZCBjaGFyKilDUEluZm8uTGVhZEJ5dGU7ICpwdHIgJiYgKihwdHIgKyAxKTsgcHRyKz0yKQorICAgICAgZm9yIChpID0gKnB0cjsgaSA8PSAqKHB0ciArIDEpOyArK2kpIEJ1ZmZlcltpXSA9IDA7CisgIH0KKworICBpZiAoKFVJTlQpTmF0aXZlQ1AgIT0gbHR5cGUtPmNwKSB7CisgICAgT1NWRVJTSU9OSU5GTyB2ZXJfaW5mbzsKKyAgICB2ZXJfaW5mby5kd09TVmVyc2lvbkluZm9TaXplID0gc2l6ZW9mKHZlcl9pbmZvKTsKKyAgICBHZXRWZXJzaW9uRXgoJnZlcl9pbmZvKTsKKyAgICBpZiAodmVyX2luZm8uZHdQbGF0Zm9ybUlkID09IFZFUl9QTEFURk9STV9XSU4zMl9OVCkgeworICAgICAgLyogQ29udmVydCBjaGFyYWN0ZXIgc2VxdWVuY2UgdG8gVW5pY29kZS4gKi8KKyAgICAgIEJ1ZmZlclNpemUgPSBNdWx0aUJ5dGVUb1dpZGVDaGFyKGx0eXBlLT5jcCwgTUJfUFJFQ09NUE9TRUQsIChjb25zdCBjaGFyKilCdWZmZXIsIDI1NiwgTlVMTCwgMCk7CisgICAgICBpZiAoIUJ1ZmZlclNpemUpIHsgZnJlZShsdHlwZSk7ICpfX2Vycl9jb2RlID0gX1NUTFBfTE9DX1VOS05PV05fTkFNRTsgcmV0dXJuIE5VTEw7IH0KKyAgICAgIHdidWZmZXIgPSAod2NoYXJfdCopbWFsbG9jKEJ1ZmZlclNpemUgKiBzaXplb2Yod2NoYXJfdCkpOworICAgICAgaWYgKCF3YnVmZmVyKSB7IGZyZWUobHR5cGUpOyAqX19lcnJfY29kZSA9IF9TVExQX0xPQ19OT19NRU1PUlk7IHJldHVybiBOVUxMOyB9CisgICAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKGx0eXBlLT5jcCwgTUJfUFJFQ09NUE9TRUQsIChjb25zdCBjaGFyKilCdWZmZXIsIDI1Niwgd2J1ZmZlciwgQnVmZmVyU2l6ZSk7CisKKyAgICAgIEdldFN0cmluZ1R5cGVXKENUX0NUWVBFMSwgd2J1ZmZlciwgMjU2LCBsdHlwZS0+Y3RhYmxlKTsKKyAgICAgIE1hcEN0eXBlTWFza3MobHR5cGUtPmN0YWJsZSwgbHR5cGUtPmN0YWJsZSArIDI1Nik7CisgICAgICBmcmVlKHdidWZmZXIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHVuc2lnbmVkIHNob3J0IGN0YWJsZVsyNTZdOworICAgICAgdW5zaWduZWQgY2hhciBUYXJnZXRCdWZmZXJbMjU2XTsKKyAgICAgIEdldFN0cmluZ1R5cGVBKGx0eXBlLT5sYy5pZCwgQ1RfQ1RZUEUxLCAoY29uc3QgY2hhciopQnVmZmVyLCAyNTYsIGN0YWJsZSk7CisKKyAgICAgIC8qIENvbnZlcnQgY2hhcmFjdGVyIHNlcXVlbmNlIHRvIHRhcmdldCBjb2RlIHBhZ2UuICovCisgICAgICBCdWZmZXJTaXplID0gTXVsdGlCeXRlVG9XaWRlQ2hhcihOYXRpdmVDUCwgTUJfUFJFQ09NUE9TRUQsIChjb25zdCBjaGFyKilCdWZmZXIsIDI1NiwgTlVMTCwgMCk7CisgICAgICBpZiAoIUJ1ZmZlclNpemUpIHsgZnJlZShsdHlwZSk7ICpfX2Vycl9jb2RlID0gX1NUTFBfTE9DX1VOS05PV05fTkFNRTsgcmV0dXJuIE5VTEw7IH0KKyAgICAgIHdidWZmZXIgPSAod2NoYXJfdCopbWFsbG9jKEJ1ZmZlclNpemUgKiBzaXplb2Yod2NoYXJfdCkpOworICAgICAgaWYgKCF3YnVmZmVyKSB7IGZyZWUobHR5cGUpOyAqX19lcnJfY29kZSA9IF9TVExQX0xPQ19OT19NRU1PUlk7IHJldHVybiBOVUxMOyB9CisgICAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKE5hdGl2ZUNQLCBNQl9QUkVDT01QT1NFRCwgKGNvbnN0IGNoYXIqKUJ1ZmZlciwgMjU2LCB3YnVmZmVyLCBCdWZmZXJTaXplKTsKKyAgICAgIGlmICghV2lkZUNoYXJUb011bHRpQnl0ZShsdHlwZS0+Y3AsIFdDX0NPTVBPU0lURUNIRUNLIHwgV0NfU0VQQ0hBUlMsIHdidWZmZXIsIEJ1ZmZlclNpemUsIChjaGFyKilUYXJnZXRCdWZmZXIsIDI1NiwgTlVMTCwgRkFMU0UpKQorICAgICAgeyBmcmVlKHdidWZmZXIpOyBmcmVlKGx0eXBlKTsgKl9fZXJyX2NvZGUgPSBfU1RMUF9MT0NfVU5LTk9XTl9OQU1FOyByZXR1cm4gTlVMTDsgfQorCisgICAgICBmcmVlKHdidWZmZXIpOworCisgICAgICAvKiBUcmFuc2xhdGUgY3R5cGUgdGFibGUuICovCisgICAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKKyAgICAgICAgaWYgKCFUYXJnZXRCdWZmZXJbaV0pIGNvbnRpbnVlOworICAgICAgICBsdHlwZS0+Y3RhYmxlW1RhcmdldEJ1ZmZlcltpXV0gPSBNYXBDdHlwZU1hc2soY3RhYmxlW2ldKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgR2V0U3RyaW5nVHlwZUEobHR5cGUtPmxjLmlkLCBDVF9DVFlQRTEsIChjb25zdCBjaGFyKilCdWZmZXIsIDI1NiwgbHR5cGUtPmN0YWJsZSk7CisgICAgTWFwQ3R5cGVNYXNrcyhsdHlwZS0+Y3RhYmxlLCBsdHlwZS0+Y3RhYmxlICsgMjU2KTsKKyAgfQorICByZXR1cm4gbHR5cGU7Cit9CisKK19Mb2NhbGVfbnVtZXJpY190KiBfTG9jYWxlX251bWVyaWNfY3JlYXRlKGNvbnN0IGNoYXIgKiBuYW1lLCBfTG9jYWxlX2xjaWRfdCogbGNfaGludCwgaW50ICpfX2Vycl9jb2RlKSB7CisgIHdjaGFyX3Qgd2J1Zls0XTsKKyAgY2hhciAqR3JvdXBpbmdCdWZmZXI7CisgIGludCBCdWZmZXJTaXplOworCisgIF9Mb2NhbGVfbnVtZXJpY190ICpsbnVtID0gKF9Mb2NhbGVfbnVtZXJpY190KiltYWxsb2Moc2l6ZW9mKF9Mb2NhbGVfbnVtZXJpY190KSk7CisgIGlmICghbG51bSkgeyAqX19lcnJfY29kZSA9IF9TVExQX0xPQ19OT19NRU1PUlk7IHJldHVybiBsbnVtOyB9CisgIG1lbXNldChsbnVtLCAwLCBzaXplb2YoX0xvY2FsZV9udW1lcmljX3QpKTsKKworICBpZiAoX19HZXRMQ0lERnJvbU5hbWUobmFtZSwgJmxudW0tPmxjLmlkLCBsbnVtLT5jcCwgbGNfaGludCkgPT0gLTEpCisgIHsgZnJlZShsbnVtKTsgKl9fZXJyX2NvZGUgPSBfU1RMUF9MT0NfVU5LTk9XTl9OQU1FOyByZXR1cm4gTlVMTDsgfQorCisjaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKQorICBpZiAobG51bS0+bGMuaWQgIT0gSU5WQVJJQU5UX0xDSUQpIHsKKyNlbmRpZgorICBfX0dldExvY2FsZUluZm9Vc2luZ0FDUChsbnVtLT5sYy5pZCwgbG51bS0+Y3AsIExPQ0FMRV9TREVDSU1BTCwgbG51bS0+ZGVjaW1hbF9wb2ludCwgNCwgd2J1ZiwgNCk7CisgIF9fR2V0TG9jYWxlSW5mb1VzaW5nQUNQKGxudW0tPmxjLmlkLCBsbnVtLT5jcCwgTE9DQUxFX1NUSE9VU0FORCwgbG51bS0+dGhvdXNhbmRzX3NlcCwgNCwgd2J1ZiwgNCk7CisjaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKQorICB9CisgIGVsc2UKKyAgICBsbnVtLT5kZWNpbWFsX3BvaW50WzBdID0gJy4nOworI2VuZGlmCisKKyAgaWYgKGxudW0tPmxjLmlkICE9IElOVkFSSUFOVF9MQ0lEKSB7CisgICAgQnVmZmVyU2l6ZSA9IEdldExvY2FsZUluZm9BKGxudW0tPmxjLmlkLCBMT0NBTEVfU0dST1VQSU5HLCBOVUxMLCAwKTsKKyAgICBHcm91cGluZ0J1ZmZlciA9IChjaGFyKiltYWxsb2MoQnVmZmVyU2l6ZSk7CisgICAgaWYgKCFHcm91cGluZ0J1ZmZlcikgeyBmcmVlKGxudW0pOyAqX19lcnJfY29kZSA9IF9TVExQX0xPQ19OT19NRU1PUlk7IHJldHVybiBOVUxMOyB9CisgICAgR2V0TG9jYWxlSW5mb0EobG51bS0+bGMuaWQsIExPQ0FMRV9TR1JPVVBJTkcsIEdyb3VwaW5nQnVmZmVyLCBCdWZmZXJTaXplKTsKKyAgICBfX0ZpeEdyb3VwaW5nKEdyb3VwaW5nQnVmZmVyKTsKKyAgICBsbnVtLT5ncm91cGluZyA9IEdyb3VwaW5nQnVmZmVyOworICB9CisgIGVsc2UgeworICAgIGxudW0tPmdyb3VwaW5nID0gKGNoYXIqKW1hbGxvYygxKTsKKyAgICBpZiAoIWxudW0tPmdyb3VwaW5nKSB7IGZyZWUobG51bSk7ICpfX2Vycl9jb2RlID0gX1NUTFBfTE9DX05PX01FTU9SWTsgcmV0dXJuIE5VTEw7IH0KKyAgICBsbnVtLT5ncm91cGluZ1swXSA9IDA7CisgIH0KKworICByZXR1cm4gbG51bTsKK30KKworc3RhdGljIGludCBfX0NvbnZlcnREYXRlKGNvbnN0IGNoYXIgKk5URGF0ZSwgY2hhciAqYnVmZmVyLCBpbnQgYnVmX3NpemUpIHsKKyAgLyogVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBhbiBpbmNvbXBsZXRlIGJ1ZmZlciBpZiBidWZmZXIgaXMgbm90IGxvbmcgZW5vdWdoICovCisgIGNvbnN0IGNoYXIgKmN1cl9jaGFyOworICBjaGFyICpjdXJfb3V0cHV0LCAqZW5kX291dHB1dDsKKworICAvKiBDb3JyZWN0IHRpbWUgZm9ybWF0LiAqLworICBjdXJfY2hhciA9IE5URGF0ZTsKKyAgY3VyX291dHB1dCA9IGJ1ZmZlcjsKKyAgZW5kX291dHB1dCA9IGN1cl9vdXRwdXQgKyBidWZfc2l6ZTsKKyAgYnVmX3NpemUgPSAwOworICB3aGlsZSAoKmN1cl9jaGFyKSB7CisgICAgaWYgKGN1cl9vdXRwdXQgJiYgKGN1cl9vdXRwdXQgPT0gZW5kX291dHB1dCkpIGJyZWFrOworICAgIHN3aXRjaCAoKmN1cl9jaGFyKSB7CisgICAgY2FzZSAnZCc6CisgICAgeworICAgICAgaWYgKCooY3VyX2NoYXIgKyAxKSA9PSAnZCcpIHsKKyAgICAgICAgaWYgKGN1cl9vdXRwdXQgJiYgKGN1cl9vdXRwdXQgKyAyID4gZW5kX291dHB1dCkpIHsKKyAgICAgICAgICAqY3VyX291dHB1dCA9IDA7CisgICAgICAgICAgcmV0dXJuICsrYnVmX3NpemU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCooY3VyX2NoYXIgKyAyKSA9PSAnZCcpIHsKKyAgICAgICAgICBpZiAoKihjdXJfY2hhciArIDMpID09ICdkJykgeworICAgICAgICAgICAgaWYgKGN1cl9vdXRwdXQpIHsgKihjdXJfb3V0cHV0KyspID0gJyUnOyAqKGN1cl9vdXRwdXQrKykgPSAnQSc7IH0KKyAgICAgICAgICAgIGJ1Zl9zaXplICs9IDI7CisgICAgICAgICAgICBjdXJfY2hhciArPSAzOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChjdXJfb3V0cHV0KSB7ICooY3VyX291dHB1dCsrKSA9ICclJzsgKihjdXJfb3V0cHV0KyspID0gJ2EnOyB9CisgICAgICAgICAgICBidWZfc2l6ZSArPSAyOworICAgICAgICAgICAgY3VyX2NoYXIgKz0gMjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgaWYgKGN1cl9vdXRwdXQpIHsgKihjdXJfb3V0cHV0KyspID0gJyUnOyAqKGN1cl9vdXRwdXQrKykgPSAnZCc7IH0KKyAgICAgICAgICBidWZfc2l6ZSArPSAyOworICAgICAgICAgIGN1cl9jaGFyKys7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBpZiAoY3VyX291dHB1dCAmJiAoY3VyX291dHB1dCArIDMgPiBlbmRfb3V0cHV0KSkgeworICAgICAgICAgICpjdXJfb3V0cHV0ID0gMDsKKyAgICAgICAgICByZXR1cm4gKytidWZfc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY3VyX291dHB1dCkgeyAqKGN1cl9vdXRwdXQrKykgPSAnJSc7ICooY3VyX291dHB1dCsrKSA9ICcjJzsgKihjdXJfb3V0cHV0KyspID0gJ2QnOyB9CisgICAgICAgIGJ1Zl9zaXplICs9IDM7CisgICAgICB9CisgICAgfQorICAgIGJyZWFrOworICAgIGNhc2UgJ00nOgorICAgIHsKKyAgICAgIGlmICgqKGN1cl9jaGFyICsgMSkgPT0gJ00nKSB7CisgICAgICAgIGlmIChjdXJfb3V0cHV0ICYmIChjdXJfb3V0cHV0ICsgMiA+IGVuZF9vdXRwdXQpKSB7CisgICAgICAgICAgKmN1cl9vdXRwdXQgPSAwOworICAgICAgICAgIHJldHVybiArK2J1Zl9zaXplOworICAgICAgICB9CisgICAgICAgIGlmICgqKGN1cl9jaGFyICsgMikgPT0gJ00nKSB7CisgICAgICAgICAgaWYgKCooY3VyX2NoYXIgKyAzKSA9PSAnTScpIHsKKyAgICAgICAgICAgIGlmIChjdXJfb3V0cHV0KSB7ICooY3VyX291dHB1dCsrKSA9ICclJzsgKihjdXJfb3V0cHV0KyspID0gJ0InOyB9CisgICAgICAgICAgICBidWZfc2l6ZSArPSAyOworICAgICAgICAgICAgY3VyX2NoYXIgKz0gMzsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoY3VyX291dHB1dCkgeyAqKGN1cl9vdXRwdXQrKykgPSAnJSc7ICooY3VyX291dHB1dCsrKSA9ICdiJzsgfQorICAgICAgICAgICAgYnVmX3NpemUgKz0gMjsKKyAgICAgICAgICAgIGN1cl9jaGFyICs9IDI7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIGlmIChjdXJfb3V0cHV0KSB7ICooY3VyX291dHB1dCsrKSA9ICclJzsgKihjdXJfb3V0cHV0KyspID0gJ20nOyB9CisgICAgICAgICAgYnVmX3NpemUgKz0gMjsKKyAgICAgICAgICBjdXJfY2hhcisrOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgaWYgKGN1cl9vdXRwdXQgJiYgKGN1cl9vdXRwdXQgKyAzID4gZW5kX291dHB1dCkpIHsKKyAgICAgICAgICAqY3VyX291dHB1dCA9IDA7CisgICAgICAgICAgcmV0dXJuICsrYnVmX3NpemU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGN1cl9vdXRwdXQpIHsgKihjdXJfb3V0cHV0KyspID0gJyUnOyAqKGN1cl9vdXRwdXQrKykgPSAnIyc7ICooY3VyX291dHB1dCsrKSA9ICdtJzsgfQorICAgICAgICBidWZfc2l6ZSArPSAzOworICAgICAgfQorICAgIH0KKyAgICBicmVhazsKKyAgICBjYXNlICd5JzoKKyAgICB7CisgICAgICBpZiAoKihjdXJfY2hhciArIDEpID09ICd5JykgeworICAgICAgICBpZiAoY3VyX291dHB1dCAmJiAoY3VyX291dHB1dCArIDIgPiBlbmRfb3V0cHV0KSkgeworICAgICAgICAgICpjdXJfb3V0cHV0ID0gMDsKKyAgICAgICAgICByZXR1cm4gKytidWZfc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKihjdXJfY2hhciArIDIpID09ICd5JyAmJiAqKGN1cl9jaGFyICsgMykgPT0gJ3knKSB7CisgICAgICAgICAgaWYgKGN1cl9vdXRwdXQpIHsgKihjdXJfb3V0cHV0KyspID0gJyUnOyAqKGN1cl9vdXRwdXQrKykgPSAnWSc7IH0KKyAgICAgICAgICBidWZfc2l6ZSArPSAyOworICAgICAgICAgIGN1cl9jaGFyICs9IDM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgaWYgKGN1cl9vdXRwdXQpIHsgKihjdXJfb3V0cHV0KyspID0gJyUnOyAqKGN1cl9vdXRwdXQrKykgPSAneSc7IH0KKyAgICAgICAgICBidWZfc2l6ZSArPSAyOworICAgICAgICAgIGN1cl9jaGFyKys7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBpZiAoY3VyX291dHB1dCAmJiAoY3VyX291dHB1dCArIDMgPiBlbmRfb3V0cHV0KSkgeworICAgICAgICAgICpjdXJfb3V0cHV0ID0gMDsKKyAgICAgICAgICByZXR1cm4gKytidWZfc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY3VyX291dHB1dCkgeyAqKGN1cl9vdXRwdXQrKykgPSAnJSc7ICooY3VyX291dHB1dCsrKSA9ICcjJzsgKihjdXJfb3V0cHV0KyspID0gJ3knOyB9CisgICAgICAgIGJ1Zl9zaXplICs9IDM7CisgICAgICB9CisgICAgfQorICAgIGJyZWFrOworICAgIGNhc2UgJyUnOgorICAgIHsKKyAgICAgIGlmIChjdXJfb3V0cHV0ICYmIChjdXJfb3V0cHV0ICsgMiA+IGVuZF9vdXRwdXQpKSB7CisgICAgICAgICpjdXJfb3V0cHV0ID0gMDsKKyAgICAgICAgcmV0dXJuICsrYnVmX3NpemU7CisgICAgICB9CisgICAgICBpZiAoY3VyX291dHB1dCkgeyAqKGN1cl9vdXRwdXQrKykgPSAnJSc7ICooY3VyX291dHB1dCsrKSA9ICclJzsgfQorICAgICAgYnVmX3NpemUgKz0gMjsKKyAgICB9CisgICAgYnJlYWs7CisgICAgY2FzZSAnXCcnOgorICAgIHsKKyAgICAgICsrY3VyX2NoYXI7CisgICAgICB3aGlsZSAoKmN1cl9jaGFyICE9ICdcJycgJiYgKmN1cl9jaGFyICE9IDAgJiYgKGN1cl9vdXRwdXQgPT0gTlVMTCB8fCBjdXJfb3V0cHV0ICE9IGVuZF9vdXRwdXQpKSB7CisgICAgICAgIGlmIChjdXJfb3V0cHV0KSB7ICpjdXJfb3V0cHV0KysgPSAqY3VyX2NoYXI7IH0KKyAgICAgICAgKytjdXJfY2hhcjsKKyAgICAgICAgYnVmX3NpemUgKz0gMTsKKyAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICB7CisgICAgICBpZiAoY3VyX291dHB1dCkgeyAqKGN1cl9vdXRwdXQrKykgPSAqY3VyX2NoYXI7IH0KKyAgICAgIGJ1Zl9zaXplICs9IDE7CisgICAgfQorICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoKmN1cl9jaGFyID09IDApIGJyZWFrOworICAgICsrY3VyX2NoYXI7CisgIH0KKworICBpZiAoIWN1cl9vdXRwdXQgfHwgY3VyX291dHB1dCAhPSBlbmRfb3V0cHV0KSB7CisgICAgaWYgKGN1cl9vdXRwdXQpICpjdXJfb3V0cHV0ID0gMDsKKyAgICBidWZfc2l6ZSArPSAxOworICB9CisgIGVsc2UgeworICAgIC8qIFdlIHRydW5jIHJlc3VsdCAqLworICAgICooLS1jdXJfb3V0cHV0KSA9IDA7CisgIH0KKworICByZXR1cm4gYnVmX3NpemU7Cit9CisKK3N0YXRpYyBpbnQgX19Db252ZXJ0VGltZShjb25zdCBjaGFyICpOVFRpbWUsIGNoYXIgKmJ1ZmZlciwgaW50IGJ1Zl9zaXplKSB7CisgIGNvbnN0IGNoYXIgKmN1cl9jaGFyOworICBjaGFyICpjdXJfb3V0cHV0LCAqZW5kX291dHB1dDsKKyAgY3VyX2NoYXIgPSBOVFRpbWU7CisgIGN1cl9vdXRwdXQgPSBidWZmZXI7CisgIGVuZF9vdXRwdXQgPSBjdXJfb3V0cHV0ICsgYnVmX3NpemU7CisgIGJ1Zl9zaXplID0gMDsKKyAgd2hpbGUgKCpjdXJfY2hhcikgeworICAgIHN3aXRjaCgqY3VyX2NoYXIpIHsKKyAgICBjYXNlICdoJzoKKyAgICAgIGlmICgqKGN1cl9jaGFyICsgMSkgPT0gJ2gnKSB7CisgICAgICAgIGlmIChjdXJfb3V0cHV0ICYmIChjdXJfb3V0cHV0ICsgMiA+IGVuZF9vdXRwdXQpKSB7CisgICAgICAgICAgKmN1cl9vdXRwdXQgPSAwOworICAgICAgICAgIHJldHVybiArK2J1Zl9zaXplOworICAgICAgICB9CisgICAgICAgIGlmIChjdXJfb3V0cHV0KSB7ICooY3VyX291dHB1dCsrKSA9ICclJzsgKihjdXJfb3V0cHV0KyspID0gJ0knOyB9CisgICAgICAgIGJ1Zl9zaXplICs9IDI7CisgICAgICAgICsrY3VyX2NoYXI7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgaWYgKGN1cl9vdXRwdXQgJiYgKGN1cl9vdXRwdXQgKyAzID4gZW5kX291dHB1dCkpIHsKKyAgICAgICAgICAqY3VyX291dHB1dCA9IDA7CisgICAgICAgICAgcmV0dXJuICsrYnVmX3NpemU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGN1cl9vdXRwdXQpIHsgKihjdXJfb3V0cHV0KyspID0gJyUnOyAqKGN1cl9vdXRwdXQrKykgPSAnIyc7ICooY3VyX291dHB1dCsrKSA9ICdJJzsgfQorICAgICAgICBidWZfc2l6ZSArPSAzOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAnSCc6CisgICAgICBpZiAoKihjdXJfY2hhciArIDEpID09ICdIJykgeworICAgICAgICBpZiAoY3VyX291dHB1dCAmJiAoY3VyX291dHB1dCArIDIgPiBlbmRfb3V0cHV0KSkgeworICAgICAgICAgICpjdXJfb3V0cHV0ID0gMDsKKyAgICAgICAgICByZXR1cm4gKytidWZfc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY3VyX291dHB1dCkgeyAqKGN1cl9vdXRwdXQrKykgPSAnJSc7ICooY3VyX291dHB1dCsrKSA9ICdIJzsgfQorICAgICAgICBidWZfc2l6ZSArPSAyOworICAgICAgICArK2N1cl9jaGFyOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGlmIChjdXJfb3V0cHV0ICYmIChjdXJfb3V0cHV0ICsgMyA+IGVuZF9vdXRwdXQpKSB7CisgICAgICAgICAgKmN1cl9vdXRwdXQgPSAwOworICAgICAgICAgIHJldHVybiArK2J1Zl9zaXplOworICAgICAgICB9CisgICAgICAgIGlmIChjdXJfb3V0cHV0KSB7ICooY3VyX291dHB1dCsrKSA9ICclJzsgKihjdXJfb3V0cHV0KyspID0gJyMnOyAqKGN1cl9vdXRwdXQrKykgPSAnSCc7IH0KKyAgICAgICAgYnVmX3NpemUgKz0gMzsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ20nOgorICAgICAgaWYgKCooY3VyX2NoYXIgKyAxKSA9PSAnbScpIHsKKyAgICAgICAgaWYgKGN1cl9vdXRwdXQgJiYgKGN1cl9vdXRwdXQgKyAyID4gZW5kX291dHB1dCkpIHsKKyAgICAgICAgICAqY3VyX291dHB1dCA9IDA7CisgICAgICAgICAgcmV0dXJuICsrYnVmX3NpemU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGN1cl9vdXRwdXQpIHsgKihjdXJfb3V0cHV0KyspID0gJyUnOyAqKGN1cl9vdXRwdXQrKykgPSAnTSc7IH0KKyAgICAgICAgYnVmX3NpemUgKz0gMjsKKyAgICAgICAgY3VyX2NoYXIrKzsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBpZiAoY3VyX291dHB1dCAmJiAoY3VyX291dHB1dCArIDMgPiBlbmRfb3V0cHV0KSkgeworICAgICAgICAgICpjdXJfb3V0cHV0ID0gMDsKKyAgICAgICAgICByZXR1cm4gKytidWZfc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY3VyX291dHB1dCkgeyAqKGN1cl9vdXRwdXQrKykgPSAnJSc7ICooY3VyX291dHB1dCsrKSA9ICcjJzsgKihjdXJfb3V0cHV0KyspID0gJ00nOyB9CisgICAgICAgIGJ1Zl9zaXplICs9IDM7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICdzJzoKKyAgICAgIGlmICgqKGN1cl9jaGFyICsgMSkgPT0gJ3MnKSB7CisgICAgICAgIGlmIChjdXJfb3V0cHV0ICYmIChjdXJfb3V0cHV0ICsgMiA+IGVuZF9vdXRwdXQpKSB7CisgICAgICAgICAgKmN1cl9vdXRwdXQgPSAwOworICAgICAgICAgIHJldHVybiArK2J1Zl9zaXplOworICAgICAgICB9CisgICAgICAgIGlmIChjdXJfb3V0cHV0KSB7ICooY3VyX291dHB1dCsrKSA9ICclJzsgKihjdXJfb3V0cHV0KyspID0gJ1MnOyB9CisgICAgICAgIGJ1Zl9zaXplICs9IDI7CisgICAgICAgICsrY3VyX2NoYXI7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgaWYgKGN1cl9vdXRwdXQgJiYgKGN1cl9vdXRwdXQgKyAzID4gZW5kX291dHB1dCkpIHsKKyAgICAgICAgICAqY3VyX291dHB1dCA9IDA7CisgICAgICAgICAgcmV0dXJuICsrYnVmX3NpemU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGN1cl9vdXRwdXQpIHsgKihjdXJfb3V0cHV0KyspID0gJyUnOyAqKGN1cl9vdXRwdXQrKykgPSAnIyc7ICooY3VyX291dHB1dCsrKSA9ICdTJzsgfQorICAgICAgICBidWZfc2l6ZSArPSAzOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAndCc6CisgICAgICBpZiAoKihjdXJfY2hhciArIDEpID09ICd0JykKKyAgICAgICAgKytjdXJfY2hhcjsKKyAgICAgIGlmIChjdXJfb3V0cHV0ICYmIChjdXJfb3V0cHV0ICsgMiA+IGVuZF9vdXRwdXQpKSB7CisgICAgICAgICpjdXJfb3V0cHV0ID0gMDsKKyAgICAgICAgcmV0dXJuICsrYnVmX3NpemU7CisgICAgICB9CisgICAgICBpZiAoY3VyX291dHB1dCkgeyAqKGN1cl9vdXRwdXQrKykgPSAnJSc7ICooY3VyX291dHB1dCsrKSA9ICdwJzsgfQorICAgICAgYnVmX3NpemUgKz0gMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJyUnOgorICAgICAgaWYgKGN1cl9vdXRwdXQgJiYgKGN1cl9vdXRwdXQgKyAyID4gZW5kX291dHB1dCkpIHsKKyAgICAgICAgKmN1cl9vdXRwdXQgPSAwOworICAgICAgICByZXR1cm4gKytidWZfc2l6ZTsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJfb3V0cHV0KSB7ICooY3VyX291dHB1dCsrKT0nJSc7ICooY3VyX291dHB1dCsrKT0nJSc7IH0KKyAgICAgIGJ1Zl9zaXplICs9IDI7CisgICAgICBicmVhazsKKyAgICBjYXNlICdcJyc6CisgICAgICArK2N1cl9jaGFyOworICAgICAgd2hpbGUgKCpjdXJfY2hhciAhPSAnXCcnICYmICpjdXJfY2hhciAhPSAwICYmICghY3VyX291dHB1dCB8fCAoY3VyX291dHB1dCAhPSBlbmRfb3V0cHV0KSkpIHsKKyAgICAgICAgaWYgKGN1cl9vdXRwdXQpICpjdXJfb3V0cHV0KysgPSAqY3VyX2NoYXI7CisgICAgICAgICsrY3VyX2NoYXI7CisgICAgICAgIGJ1Zl9zaXplICs9IDE7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgaWYgKGN1cl9vdXRwdXQpIHsgKihjdXJfb3V0cHV0KyspID0gKmN1cl9jaGFyOyB9CisgICAgICBidWZfc2l6ZSArPSAxOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICgqY3VyX2NoYXIgPT0gMCkgYnJlYWs7CisgICAgKytjdXJfY2hhcjsKKyAgfQorCisgIGlmICghY3VyX291dHB1dCB8fCBjdXJfb3V0cHV0ICE9IGVuZF9vdXRwdXQpIHsKKyAgICBpZiAoY3VyX291dHB1dCkgKmN1cl9vdXRwdXQgPSAwOworICAgIGJ1Zl9zaXplICs9IDE7CisgIH0KKyAgZWxzZSB7CisgICAgLyogV2UgdHJ1bmMgcmVzdWx0ICovCisgICAgKigtLWN1cl9vdXRwdXQpID0gMDsKKyAgfQorCisgIHJldHVybiBidWZfc2l6ZTsKK30KKworX0xvY2FsZV90aW1lX3QqIF9Mb2NhbGVfdGltZV9jcmVhdGUoY29uc3QgY2hhciAqIG5hbWUsIF9Mb2NhbGVfbGNpZF90KiBsY19oaW50LCBpbnQgKl9fZXJyX2NvZGUpIHsKKyAgaW50IHNpemUsIG1vbnRoLCBkYXlvZndlZWs7CisgIHNpemVfdCBsZW5ndGg7CisgIGNoYXIgZm10ODBbODBdOworICB3Y2hhcl90IHdidWY4MFs4MF07CisKKyAgX0xvY2FsZV90aW1lX3QgKmx0aW1lID0gKF9Mb2NhbGVfdGltZV90KiltYWxsb2Moc2l6ZW9mKF9Mb2NhbGVfdGltZV90KSk7CisgIAorICBpZiAoIWx0aW1lKSB7ICpfX2Vycl9jb2RlID0gX1NUTFBfTE9DX05PX01FTU9SWTsgcmV0dXJuIGx0aW1lOyB9CisgIG1lbXNldChsdGltZSwgMCwgc2l6ZW9mKF9Mb2NhbGVfdGltZV90KSk7CisKKyAgaWYgKF9fR2V0TENJREZyb21OYW1lKG5hbWUsICZsdGltZS0+bGMuaWQsIGx0aW1lLT5jcCwgbGNfaGludCkgPT0gLTEpCisgIHsgZnJlZShsdGltZSk7ICpfX2Vycl9jb2RlID0gX1NUTFBfTE9DX1VOS05PV05fTkFNRTsgcmV0dXJuIE5VTEw7IH0KKworI2lmIGRlZmluZWQgKF9fQk9STEFORENfXykKKyAgaWYgKCBsdGltZS0+bGMuaWQgPT0gSU5WQVJJQU5UX0xDSUQgJiYgbmFtZVswXSA9PSAnQycgJiYgbmFtZVsxXSA9PSAwICkKKyAgeyBsdGltZS0+bGMuaWQgPSAweDQwOTsgfQorI2VuZGlmCisKKyAgZm9yIChtb250aCA9IExPQ0FMRV9TTU9OVEhOQU1FMTsgbW9udGggPD0gTE9DQUxFX1NNT05USE5BTUUxMjsgKyttb250aCkgeyAvKiBTbWFsbCBoYWNrIDotKSAqLworICAgIHNpemUgPSBHZXRMb2NhbGVJbmZvQShsdGltZS0+bGMuaWQsIG1vbnRoLCBOVUxMLCAwKTsKKyAgICBsdGltZS0+bW9udGhbbW9udGggLSBMT0NBTEVfU01PTlRITkFNRTFdID0gKGNoYXIqKW1hbGxvYyhzaXplKTsKKyAgICBpZiAoIWx0aW1lLT5tb250aFttb250aCAtIExPQ0FMRV9TTU9OVEhOQU1FMV0pCisgICAgeyBfTG9jYWxlX3RpbWVfZGVzdHJveShsdGltZSk7ICpfX2Vycl9jb2RlID0gX1NUTFBfTE9DX05PX01FTU9SWTsgcmV0dXJuIE5VTEw7IH0KKyAgICBfX0dldExvY2FsZUluZm9Vc2luZ0FDUChsdGltZS0+bGMuaWQsIGx0aW1lLT5jcCwgbW9udGgsIGx0aW1lLT5tb250aFttb250aCAtIExPQ0FMRV9TTU9OVEhOQU1FMV0sIHNpemUsIHdidWY4MCwgODApOworICB9CisKKyAgZm9yIChtb250aCA9IExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTsgbW9udGggPD0gTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMjsgKyttb250aCkgeworICAgIHNpemUgPSBHZXRMb2NhbGVJbmZvQShsdGltZS0+bGMuaWQsIG1vbnRoLCBOVUxMLCAwKTsKKyAgICBsdGltZS0+YWJicmV2X21vbnRoW21vbnRoIC0gTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxXSA9IChjaGFyKiltYWxsb2Moc2l6ZSk7CisgICAgaWYgKCFsdGltZS0+YWJicmV2X21vbnRoW21vbnRoIC0gTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxXSkKKyAgICB7IF9Mb2NhbGVfdGltZV9kZXN0cm95KGx0aW1lKTsgKl9fZXJyX2NvZGUgPSBfU1RMUF9MT0NfTk9fTUVNT1JZOyByZXR1cm4gTlVMTDsgfQorICAgIF9fR2V0TG9jYWxlSW5mb1VzaW5nQUNQKGx0aW1lLT5sYy5pZCwgbHRpbWUtPmNwLCBtb250aCwgbHRpbWUtPmFiYnJldl9tb250aFttb250aCAtIExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMV0sIHNpemUsIHdidWY4MCwgODApOworICB9CisKKyAgZm9yIChkYXlvZndlZWsgPSBMT0NBTEVfU0RBWU5BTUUxOyBkYXlvZndlZWsgPD0gTE9DQUxFX1NEQVlOQU1FNzsgKytkYXlvZndlZWspIHsKKyAgICBpbnQgZGF5aW5kZXggPSAoIGRheW9md2VlayAhPSBMT0NBTEVfU0RBWU5BTUU3ICkgPyBkYXlvZndlZWsgLSBMT0NBTEVfU0RBWU5BTUUxICsgMSA6IDA7CisgICAgc2l6ZSA9IEdldExvY2FsZUluZm9BKGx0aW1lLT5sYy5pZCwgZGF5b2Z3ZWVrLCBOVUxMLCAwKTsKKyAgICBsdGltZS0+ZGF5b2Z3ZWVrW2RheWluZGV4XSA9IChjaGFyKiltYWxsb2Moc2l6ZSk7CisgICAgaWYgKCFsdGltZS0+ZGF5b2Z3ZWVrW2RheWluZGV4XSkKKyAgICB7IF9Mb2NhbGVfdGltZV9kZXN0cm95KGx0aW1lKTsgKl9fZXJyX2NvZGUgPSBfU1RMUF9MT0NfTk9fTUVNT1JZOyByZXR1cm4gTlVMTDsgfQorICAgIF9fR2V0TG9jYWxlSW5mb1VzaW5nQUNQKGx0aW1lLT5sYy5pZCwgbHRpbWUtPmNwLCBkYXlvZndlZWssIGx0aW1lLT5kYXlvZndlZWtbZGF5aW5kZXhdLCBzaXplLCB3YnVmODAsIDgwKTsKKyAgfQorCisgIGZvciAoZGF5b2Z3ZWVrID0gTE9DQUxFX1NBQkJSRVZEQVlOQU1FMTsgZGF5b2Z3ZWVrIDw9IExPQ0FMRV9TQUJCUkVWREFZTkFNRTc7ICsrZGF5b2Z3ZWVrKSB7CisgICAgaW50IGRheWluZGV4ID0gKCBkYXlvZndlZWsgIT0gTE9DQUxFX1NBQkJSRVZEQVlOQU1FNyApID8gZGF5b2Z3ZWVrIC0gTE9DQUxFX1NBQkJSRVZEQVlOQU1FMSArIDEgOiAwOworICAgIHNpemUgPSBHZXRMb2NhbGVJbmZvQShsdGltZS0+bGMuaWQsIGRheW9md2VlaywgTlVMTCwgMCk7CisgICAgbHRpbWUtPmFiYnJldl9kYXlvZndlZWtbZGF5aW5kZXhdID0gKGNoYXIqKW1hbGxvYyhzaXplKTsKKyAgICBpZiAoIWx0aW1lLT5hYmJyZXZfZGF5b2Z3ZWVrW2RheWluZGV4XSkKKyAgICB7IF9Mb2NhbGVfdGltZV9kZXN0cm95KGx0aW1lKTsgKl9fZXJyX2NvZGUgPSBfU1RMUF9MT0NfTk9fTUVNT1JZOyByZXR1cm4gTlVMTDsgfQorICAgIF9fR2V0TG9jYWxlSW5mb1VzaW5nQUNQKGx0aW1lLT5sYy5pZCwgbHRpbWUtPmNwLCBkYXlvZndlZWssIGx0aW1lLT5hYmJyZXZfZGF5b2Z3ZWVrW2RheWluZGV4XSwgc2l6ZSwgd2J1ZjgwLCA4MCk7CisgIH0KKworICBfX0dldExvY2FsZUluZm9Vc2luZ0FDUChsdGltZS0+bGMuaWQsIGx0aW1lLT5jcCwgTE9DQUxFX1NTSE9SVERBVEUsIGZtdDgwLCA4MCwgd2J1ZjgwLCA4MCk7CisgIHNpemUgPSBfX0NvbnZlcnREYXRlKGZtdDgwLCBOVUxMLCAwKTsKKyAgbHRpbWUtPmRhdGVfZm9ybWF0ID0gKGNoYXIqKW1hbGxvYyhzaXplKTsKKyAgaWYgKCFsdGltZS0+ZGF0ZV9mb3JtYXQpCisgIHsgX0xvY2FsZV90aW1lX2Rlc3Ryb3kobHRpbWUpOyAqX19lcnJfY29kZSA9IF9TVExQX0xPQ19OT19NRU1PUlk7IHJldHVybiBOVUxMOyB9CisgIF9fQ29udmVydERhdGUoZm10ODAsIGx0aW1lLT5kYXRlX2Zvcm1hdCwgc2l6ZSk7CisKKyAgX19HZXRMb2NhbGVJbmZvVXNpbmdBQ1AobHRpbWUtPmxjLmlkLCBsdGltZS0+Y3AsIExPQ0FMRV9TTE9OR0RBVEUsIGZtdDgwLCA4MCwgd2J1ZjgwLCA4MCk7CisgIHNpemUgPSBfX0NvbnZlcnREYXRlKGZtdDgwLCBOVUxMLCAwKTsKKyAgbHRpbWUtPmxvbmdfZGF0ZV9mb3JtYXQgPSAoY2hhciopbWFsbG9jKHNpemUpOworICBpZiAoIWx0aW1lLT5sb25nX2RhdGVfZm9ybWF0KQorICB7IF9Mb2NhbGVfdGltZV9kZXN0cm95KGx0aW1lKTsqX19lcnJfY29kZSA9IF9TVExQX0xPQ19OT19NRU1PUlk7IHJldHVybiBOVUxMOyB9CisgIF9fQ29udmVydERhdGUoZm10ODAsIGx0aW1lLT5sb25nX2RhdGVfZm9ybWF0LCBzaXplKTsKKworICBfX0dldExvY2FsZUluZm9Vc2luZ0FDUChsdGltZS0+bGMuaWQsIGx0aW1lLT5jcCwgTE9DQUxFX1NUSU1FRk9STUFULCBmbXQ4MCwgODAsIHdidWY4MCwgODApOworICBzaXplID0gX19Db252ZXJ0VGltZShmbXQ4MCwgTlVMTCwgMCk7CisgIGx0aW1lLT50aW1lX2Zvcm1hdCA9IChjaGFyKiltYWxsb2Moc2l6ZSk7CisgIGlmICghbHRpbWUtPnRpbWVfZm9ybWF0KQorICB7IF9Mb2NhbGVfdGltZV9kZXN0cm95KGx0aW1lKTsgKl9fZXJyX2NvZGUgPSBfU1RMUF9MT0NfTk9fTUVNT1JZOyByZXR1cm4gTlVMTDsgfQorICBfX0NvbnZlcnRUaW1lKGZtdDgwLCBsdGltZS0+dGltZV9mb3JtYXQsIHNpemUpOworCisgIC8qIE5UIGRvZXNuJ3QgcHJvdmlkZSB0aGlzIGluZm9ybWF0aW9uLCB3ZSBtdXN0IHNpbXVsYXRlLiAqLworICBsZW5ndGggPSBzdHJsZW4obHRpbWUtPmRhdGVfZm9ybWF0KSArIHN0cmxlbihsdGltZS0+dGltZV9mb3JtYXQpICsgMSAvKiBzcGFjZSAqLyArIDEgLyogdHJhaWxpbmcgMCAqLzsKKyAgbHRpbWUtPmRhdGVfdGltZV9mb3JtYXQgPSAoY2hhciopbWFsbG9jKGxlbmd0aCk7CisgIGlmICghbHRpbWUtPmRhdGVfdGltZV9mb3JtYXQpCisgIHsgX0xvY2FsZV90aW1lX2Rlc3Ryb3kobHRpbWUpOyAqX19lcnJfY29kZSA9IF9TVExQX0xPQ19OT19NRU1PUlk7IHJldHVybiBOVUxMOyB9CisgIF9TVExQX1NUUkNQWShsdGltZS0+ZGF0ZV90aW1lX2Zvcm1hdCwgbGVuZ3RoLCBsdGltZS0+ZGF0ZV9mb3JtYXQpOworICBfU1RMUF9TVFJDQVQobHRpbWUtPmRhdGVfdGltZV9mb3JtYXQsIGxlbmd0aCwgIiAiKTsKKyAgX1NUTFBfU1RSQ0FUKGx0aW1lLT5kYXRlX3RpbWVfZm9ybWF0LCBsZW5ndGgsIGx0aW1lLT50aW1lX2Zvcm1hdCk7CisKKyAgLyogTlQgZG9lc24ndCBwcm92aWRlIHRoaXMgaW5mb3JtYXRpb24sIHdlIG11c3Qgc2ltdWxhdGUuICovCisgIGxlbmd0aCA9IHN0cmxlbihsdGltZS0+bG9uZ19kYXRlX2Zvcm1hdCkgKyBzdHJsZW4obHRpbWUtPnRpbWVfZm9ybWF0KSArIDEgLyogc3BhY2UgKi8gKyAxIC8qIHRyYWlsaW5nIDAgKi87CisgIGx0aW1lLT5sb25nX2RhdGVfdGltZV9mb3JtYXQgPSAoY2hhciopbWFsbG9jKGxlbmd0aCk7CisgIGlmICghbHRpbWUtPmxvbmdfZGF0ZV90aW1lX2Zvcm1hdCkKKyAgeyBfTG9jYWxlX3RpbWVfZGVzdHJveShsdGltZSk7ICpfX2Vycl9jb2RlID0gX1NUTFBfTE9DX05PX01FTU9SWTsgcmV0dXJuIE5VTEw7IH0KKyAgX1NUTFBfU1RSQ1BZKGx0aW1lLT5sb25nX2RhdGVfdGltZV9mb3JtYXQsIGxlbmd0aCwgbHRpbWUtPmxvbmdfZGF0ZV9mb3JtYXQpOworICBfU1RMUF9TVFJDQVQobHRpbWUtPmxvbmdfZGF0ZV90aW1lX2Zvcm1hdCwgbGVuZ3RoLCAiICIpOworICBfU1RMUF9TVFJDQVQobHRpbWUtPmxvbmdfZGF0ZV90aW1lX2Zvcm1hdCwgbGVuZ3RoLCBsdGltZS0+dGltZV9mb3JtYXQpOworCisgIF9fR2V0TG9jYWxlSW5mb1VzaW5nQUNQKGx0aW1lLT5sYy5pZCwgbHRpbWUtPmNwLCBMT0NBTEVfUzExNTksIGx0aW1lLT5hbSwgOSwgd2J1ZjgwLCA4MCk7CisgIF9fR2V0TG9jYWxlSW5mb1VzaW5nQUNQKGx0aW1lLT5sYy5pZCwgbHRpbWUtPmNwLCBMT0NBTEVfUzIzNTksIGx0aW1lLT5wbSwgOSwgd2J1ZjgwLCA4MCk7CisKKyAgcmV0dXJuIGx0aW1lOworfQorCitfTG9jYWxlX2NvbGxhdGVfdCogX0xvY2FsZV9jb2xsYXRlX2NyZWF0ZShjb25zdCBjaGFyICogbmFtZSwgX0xvY2FsZV9sY2lkX3QqIGxjX2hpbnQsIGludCAqX19lcnJfY29kZSkgeworICBfTG9jYWxlX2NvbGxhdGVfdCAqbGNvbCA9IChfTG9jYWxlX2NvbGxhdGVfdCopbWFsbG9jKHNpemVvZihfTG9jYWxlX2NvbGxhdGVfdCkpOworICBpZiAoIWxjb2wpIHsgKl9fZXJyX2NvZGUgPSBfU1RMUF9MT0NfTk9fTUVNT1JZOyByZXR1cm4gbGNvbDsgfQorICBtZW1zZXQobGNvbCwgMCwgc2l6ZW9mKF9Mb2NhbGVfY29sbGF0ZV90KSk7CisKKyAgaWYgKF9fR2V0TENJREZyb21OYW1lKG5hbWUsICZsY29sLT5sYy5pZCwgbGNvbC0+Y3AsIGxjX2hpbnQpID09IC0xKQorICB7IGZyZWUobGNvbCk7ICpfX2Vycl9jb2RlID0gX1NUTFBfTE9DX1VOS05PV05fTkFNRTsgcmV0dXJuIE5VTEw7IH0KKworI2lmIGRlZmluZWQgKF9fQk9STEFORENfXykKKyAgaWYgKCBsY29sLT5sYy5pZCA9PSBJTlZBUklBTlRfTENJRCAmJiBuYW1lWzBdID09ICdDJyAmJiBuYW1lWzFdID09IDAgKQorICB7IGxjb2wtPmxjLmlkID0gMHg0MDk7IH0KKyNlbmRpZgorCisgIHJldHVybiBsY29sOworfQorCitfTG9jYWxlX21vbmV0YXJ5X3QqIF9Mb2NhbGVfbW9uZXRhcnlfY3JlYXRlKGNvbnN0IGNoYXIgKiBuYW1lLCBfTG9jYWxlX2xjaWRfdCogbGNfaGludCwgaW50ICpfX2Vycl9jb2RlKSB7CisgIGNoYXIgKkdyb3VwaW5nQnVmZmVyOworICBpbnQgQnVmZmVyU2l6ZTsKKyAgY2hhciBGcmFjRGlnaXRzWzNdOworICB3Y2hhcl90IHdidWZbNl07CisKKyAgX0xvY2FsZV9tb25ldGFyeV90ICpsbW9uID0gKF9Mb2NhbGVfbW9uZXRhcnlfdCopbWFsbG9jKHNpemVvZihfTG9jYWxlX21vbmV0YXJ5X3QpKTsKKyAgaWYgKCFsbW9uKSB7ICpfX2Vycl9jb2RlID0gX1NUTFBfTE9DX05PX01FTU9SWTsgcmV0dXJuIGxtb247IH0KKyAgbWVtc2V0KGxtb24sIDAsIHNpemVvZihfTG9jYWxlX21vbmV0YXJ5X3QpKTsKKworICBpZiAoX19HZXRMQ0lERnJvbU5hbWUobmFtZSwgJmxtb24tPmxjLmlkLCBsbW9uLT5jcCwgbGNfaGludCkgPT0gLTEpCisgIHsgZnJlZShsbW9uKTsgKl9fZXJyX2NvZGUgPSBfU1RMUF9MT0NfVU5LTk9XTl9OQU1FOyByZXR1cm4gTlVMTDsgfQorCisgIGlmIChsbW9uLT5sYy5pZCAhPSBJTlZBUklBTlRfTENJRCkgeworICAgIC8qIEV4dHJhY3QgaW5mb3JtYXRpb24gYWJvdXQgbW9uZXRhcnkgc3lzdGVtICovCisgICAgX19HZXRMb2NhbGVJbmZvVXNpbmdBQ1AobG1vbi0+bGMuaWQsIGxtb24tPmNwLCBMT0NBTEVfU0RFQ0lNQUwsIGxtb24tPmRlY2ltYWxfcG9pbnQsIDQsIHdidWYsIDYpOworICAgIF9fR2V0TG9jYWxlSW5mb1VzaW5nQUNQKGxtb24tPmxjLmlkLCBsbW9uLT5jcCwgTE9DQUxFX1NUSE9VU0FORCwgbG1vbi0+dGhvdXNhbmRzX3NlcCwgNCwgd2J1ZiwgNik7CisKKyAgICBCdWZmZXJTaXplID0gR2V0TG9jYWxlSW5mb0EobG1vbi0+bGMuaWQsIExPQ0FMRV9TR1JPVVBJTkcsIE5VTEwsIDApOworICAgIEdyb3VwaW5nQnVmZmVyID0gKGNoYXIqKW1hbGxvYyhCdWZmZXJTaXplKTsKKyAgICBpZiAoIUdyb3VwaW5nQnVmZmVyKQorICAgIHsgbG1vbi0+Z3JvdXBpbmcgPSBOVUxMOyAqX19lcnJfY29kZSA9IF9TVExQX0xPQ19OT19NRU1PUlk7IHJldHVybiBsbW9uOyB9CisgICAgR2V0TG9jYWxlSW5mb0EobG1vbi0+bGMuaWQsIExPQ0FMRV9TR1JPVVBJTkcsIEdyb3VwaW5nQnVmZmVyLCBCdWZmZXJTaXplKTsKKyAgICBfX0ZpeEdyb3VwaW5nKEdyb3VwaW5nQnVmZmVyKTsKKyAgICBsbW9uLT5ncm91cGluZyA9IEdyb3VwaW5nQnVmZmVyOworCisgICAgX19HZXRMb2NhbGVJbmZvVXNpbmdBQ1AobG1vbi0+bGMuaWQsIGxtb24tPmNwLCBMT0NBTEVfU0NVUlJFTkNZLCBsbW9uLT5jdXJyX3N5bWJvbCwgNiwgd2J1ZiwgNik7CisgICAgX19HZXRMb2NhbGVJbmZvVXNpbmdBQ1AobG1vbi0+bGMuaWQsIGxtb24tPmNwLCBMT0NBTEVfU05FR0FUSVZFU0lHTiwgbG1vbi0+bmVnYXRpdmVfc2lnbiwgNSwgd2J1ZiwgNik7CisgICAgX19HZXRMb2NhbGVJbmZvVXNpbmdBQ1AobG1vbi0+bGMuaWQsIGxtb24tPmNwLCBMT0NBTEVfU1BPU0lUSVZFU0lHTiwgbG1vbi0+cG9zaXRpdmVfc2lnbiwgNSwgd2J1ZiwgNik7CisKKyAgICBHZXRMb2NhbGVJbmZvQShsbW9uLT5sYy5pZCwgTE9DQUxFX0lDVVJSRElHSVRTLCBGcmFjRGlnaXRzLCAzKTsKKyAgICBsbW9uLT5mcmFjX2RpZ2l0cyA9IGF0b2koRnJhY0RpZ2l0cyk7CisKKyAgICBHZXRMb2NhbGVJbmZvQShsbW9uLT5sYy5pZCwgTE9DQUxFX0lJTlRMQ1VSUkRJR0lUUywgRnJhY0RpZ2l0cywgMyk7CisgICAgbG1vbi0+aW50X2ZyYWNfZGlnaXRzID0gYXRvaShGcmFjRGlnaXRzKTsKKworICAgIF9fR2V0TG9jYWxlSW5mb1VzaW5nQUNQKGxtb24tPmxjLmlkLCBsbW9uLT5jcCwgTE9DQUxFX1NJTlRMU1lNQk9MLCBsbW9uLT5pbnRfY3Vycl9zeW1ib2wsIDUsIHdidWYsIDYpOworICAgIC8qIEV2ZW4gaWYgUGxhdGZvcm0gU0RLIGRvY3VtZW50YXRpb24gc2F5cyB0aGF0IHRoZSByZXR1cm5lZCBzeW1ib2wgc2hvdWxkCisgICAgICogYmUgYSAzIGxldHRlcnMgc3ltYm9sIGZvbGxvd2VkIGJ5IGEgc2VwZXJhdGlvbiBjaGFyYWN0ZXIsIGV4cGVyaW1lbnRhdGlvbgorICAgICAqIGhhcyBzaG93biB0aGF0IG5vIHNlcGVyYXRpb24gY2hhcmFjdGVyIGlzIGV2ZXIgYXBwZW5kZWQuIFdlIGFyZSBhZGRpbmcgaXQKKyAgICAgKiBvdXJzZWxmIHRvIGNvbmZvcm0gdG8gdGhlIFBPU0lYIHNwZWNpZmljYXRpb24uCisgICAgICovCisgICAgaWYgKGxtb24tPmludF9jdXJyX3N5bWJvbFszXSA9PSAwKSB7CisgICAgICBsbW9uLT5pbnRfY3Vycl9zeW1ib2xbM10gPSAnICc7CisgICAgICBsbW9uLT5pbnRfY3Vycl9zeW1ib2xbNF0gPSAwOworICAgIH0KKyAgfQorICAvKiBlbHNlIGl0IGlzIGFscmVhZHkgb2sgKi8KKworICByZXR1cm4gbG1vbjsKK30KKworc3RydWN0IF9Mb2NhbGVfbWVzc2FnZXMqIF9Mb2NhbGVfbWVzc2FnZXNfY3JlYXRlKGNvbnN0IGNoYXIgKm5hbWUsIF9Mb2NhbGVfbGNpZF90KiBsY19oaW50LCBpbnQgKl9fZXJyX2NvZGUpIHsKKyAgLyogVGhlIFdpbjMyIEFQSSBoYXMgbm8gc3VwcG9ydCBmb3IgbWVzc2FnZXMgZmFjZXQgKi8KKyAgX1NUTFBfTUFSS19QQVJBTUVURVJfQVNfVU5VU0VEKG5hbWUpCisgIF9TVExQX01BUktfUEFSQU1FVEVSX0FTX1VOVVNFRChsY19oaW50KQorICAqX19lcnJfY29kZSA9IF9TVExQX0xPQ19VTlNVUFBPUlRFRF9GQUNFVF9DQVRFR09SWTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyKiBfTG9jYWxlX2NvbW1vbl9kZWZhdWx0KGNoYXIqIGJ1ZikgeworICBjaGFyIGNwW01BWF9DUF9MRU4gKyAxXTsKKyAgaW50IENvZGVQYWdlID0gX19HZXREZWZhdWx0Q1AoTE9DQUxFX1VTRVJfREVGQVVMVCk7CisgIG15X2x0b2EoQ29kZVBhZ2UsIGNwKTsKKyAgcmV0dXJuIF9fR2V0TG9jYWxlTmFtZShMT0NBTEVfVVNFUl9ERUZBVUxULCBjcCwgYnVmKTsKK30KKworY29uc3QgY2hhciogX0xvY2FsZV9jdHlwZV9kZWZhdWx0KGNoYXIqIGJ1ZikKK3sgcmV0dXJuIF9Mb2NhbGVfY29tbW9uX2RlZmF1bHQoYnVmKTsgfQorCitjb25zdCBjaGFyKiBfTG9jYWxlX251bWVyaWNfZGVmYXVsdChjaGFyICogYnVmKQoreyByZXR1cm4gX0xvY2FsZV9jb21tb25fZGVmYXVsdChidWYpOyB9CisKK2NvbnN0IGNoYXIqIF9Mb2NhbGVfdGltZV9kZWZhdWx0KGNoYXIqIGJ1ZikKK3sgcmV0dXJuIF9Mb2NhbGVfY29tbW9uX2RlZmF1bHQoYnVmKTsgfQorCitjb25zdCBjaGFyKiBfTG9jYWxlX2NvbGxhdGVfZGVmYXVsdChjaGFyKiBidWYpCit7IHJldHVybiBfTG9jYWxlX2NvbW1vbl9kZWZhdWx0KGJ1Zik7IH0KKworY29uc3QgY2hhciogX0xvY2FsZV9tb25ldGFyeV9kZWZhdWx0KGNoYXIqIGJ1ZikKK3sgcmV0dXJuIF9Mb2NhbGVfY29tbW9uX2RlZmF1bHQoYnVmKTsgfQorCitjb25zdCBjaGFyKiBfTG9jYWxlX21lc3NhZ2VzX2RlZmF1bHQoY2hhciogYnVmKQoreyByZXR1cm4gX0xvY2FsZV9jb21tb25fZGVmYXVsdChidWYpOyB9CisKK2NoYXIgY29uc3QqIF9Mb2NhbGVfY3R5cGVfbmFtZShjb25zdCBfTG9jYWxlX2N0eXBlX3QqIGx0eXBlLCBjaGFyKiBidWYpIHsKKyAgY2hhciBjcF9idWZbTUFYX0NQX0xFTiArIDFdOworICBteV9sdG9hKGx0eXBlLT5jcCwgY3BfYnVmKTsKKyAgcmV0dXJuIF9fR2V0TG9jYWxlTmFtZShsdHlwZS0+bGMuaWQsIGNwX2J1ZiwgYnVmKTsKK30KKworY2hhciBjb25zdCogX0xvY2FsZV9udW1lcmljX25hbWUoY29uc3QgX0xvY2FsZV9udW1lcmljX3QqIGxudW0sIGNoYXIqIGJ1ZikKK3sgcmV0dXJuIF9fR2V0TG9jYWxlTmFtZShsbnVtLT5sYy5pZCwgbG51bS0+Y3AsIGJ1Zik7IH0KKworY2hhciBjb25zdCogX0xvY2FsZV90aW1lX25hbWUoY29uc3QgX0xvY2FsZV90aW1lX3QqIGx0aW1lLCBjaGFyKiBidWYpCit7IHJldHVybiBfX0dldExvY2FsZU5hbWUobHRpbWUtPmxjLmlkLCBsdGltZS0+Y3AsIGJ1Zik7IH0KKworY2hhciBjb25zdCogX0xvY2FsZV9jb2xsYXRlX25hbWUoY29uc3QgX0xvY2FsZV9jb2xsYXRlX3QqIGxjb2wsIGNoYXIqIGJ1ZikKK3sgcmV0dXJuIF9fR2V0TG9jYWxlTmFtZShsY29sLT5sYy5pZCwgbGNvbC0+Y3AsIGJ1Zik7IH0KKworY2hhciBjb25zdCogX0xvY2FsZV9tb25ldGFyeV9uYW1lKGNvbnN0IF9Mb2NhbGVfbW9uZXRhcnlfdCogbG1vbiwgY2hhciogYnVmKQoreyByZXR1cm4gX19HZXRMb2NhbGVOYW1lKGxtb24tPmxjLmlkLCBsbW9uLT5jcCwgYnVmKTsgfQorCitjaGFyIGNvbnN0KiBfTG9jYWxlX21lc3NhZ2VzX25hbWUoY29uc3Qgc3RydWN0IF9Mb2NhbGVfbWVzc2FnZXMqIGxtZXMsIGNoYXIqIGJ1ZikgeworICBfU1RMUF9NQVJLX1BBUkFNRVRFUl9BU19VTlVTRUQobG1lcykKKyAgX1NUTFBfTUFSS19QQVJBTUVURVJfQVNfVU5VU0VEKGJ1ZikKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgX0xvY2FsZV9jdHlwZV9kZXN0cm95KF9Mb2NhbGVfY3R5cGVfdCogbHR5cGUpIHsKKyAgaWYgKCFsdHlwZSkgcmV0dXJuOworCisgIGZyZWUobHR5cGUpOworfQorCit2b2lkIF9Mb2NhbGVfbnVtZXJpY19kZXN0cm95KF9Mb2NhbGVfbnVtZXJpY190KiBsbnVtKSB7CisgIGlmICghbG51bSkgcmV0dXJuOworCisgIGlmIChsbnVtLT5ncm91cGluZykgZnJlZShsbnVtLT5ncm91cGluZyk7CisgIGZyZWUobG51bSk7Cit9CisKK3ZvaWQgX0xvY2FsZV90aW1lX2Rlc3Ryb3koX0xvY2FsZV90aW1lX3QqIGx0aW1lKSB7CisgIGludCBpOworICBpZiAoIWx0aW1lKSByZXR1cm47CisKKyAgZm9yIChpID0gMDsgaSA8IDEyOyArK2kpIHsKKyAgICBpZiAobHRpbWUtPm1vbnRoW2ldKSBmcmVlKGx0aW1lLT5tb250aFtpXSk7CisgICAgaWYgKGx0aW1lLT5hYmJyZXZfbW9udGhbaV0pIGZyZWUobHRpbWUtPmFiYnJldl9tb250aFtpXSk7CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgNzsgKytpKSB7CisgICAgaWYgKGx0aW1lLT5kYXlvZndlZWtbaV0pIGZyZWUobHRpbWUtPmRheW9md2Vla1tpXSk7CisgICAgaWYgKGx0aW1lLT5hYmJyZXZfZGF5b2Z3ZWVrW2ldKSBmcmVlKGx0aW1lLT5hYmJyZXZfZGF5b2Z3ZWVrW2ldKTsKKyAgfQorCisgIGlmIChsdGltZS0+ZGF0ZV9mb3JtYXQpIGZyZWUobHRpbWUtPmRhdGVfZm9ybWF0KTsKKyAgaWYgKGx0aW1lLT5sb25nX2RhdGVfZm9ybWF0KSBmcmVlKGx0aW1lLT5sb25nX2RhdGVfZm9ybWF0KTsKKyAgaWYgKGx0aW1lLT50aW1lX2Zvcm1hdCkgZnJlZShsdGltZS0+dGltZV9mb3JtYXQpOworICBpZiAobHRpbWUtPmRhdGVfdGltZV9mb3JtYXQpIGZyZWUobHRpbWUtPmRhdGVfdGltZV9mb3JtYXQpOworICBpZiAobHRpbWUtPmxvbmdfZGF0ZV90aW1lX2Zvcm1hdCkgZnJlZShsdGltZS0+bG9uZ19kYXRlX3RpbWVfZm9ybWF0KTsKKworICBmcmVlKGx0aW1lKTsKK30KKwordm9pZCBfTG9jYWxlX2NvbGxhdGVfZGVzdHJveShfTG9jYWxlX2NvbGxhdGVfdCogbGNvbCkgeworICBpZiAoIWxjb2wpIHJldHVybjsKKworICBmcmVlKGxjb2wpOworfQorCit2b2lkIF9Mb2NhbGVfbW9uZXRhcnlfZGVzdHJveShfTG9jYWxlX21vbmV0YXJ5X3QqIGxtb24pIHsKKyAgaWYgKCFsbW9uKSByZXR1cm47CisKKyAgaWYgKGxtb24tPmdyb3VwaW5nKSBmcmVlKGxtb24tPmdyb3VwaW5nKTsKKyAgZnJlZShsbW9uKTsKK30KKwordm9pZCBfTG9jYWxlX21lc3NhZ2VzX2Rlc3Ryb3koc3RydWN0IF9Mb2NhbGVfbWVzc2FnZXMqIGxtZXMpCit7IF9TVExQX01BUktfUEFSQU1FVEVSX0FTX1VOVVNFRChsbWVzKSB9CisKK3N0YXRpYyBjaGFyIGNvbnN0KiBfTG9jYWxlX2V4dHJhY3RfY2F0ZWdvcnlfbmFtZShjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiBjYXRlZ29yeSwgY2hhciogYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Mb2NhbGVfbGNpZF90KiBoaW50LCBpbnQgKl9fZXJyX2NvZGUpIHsKKyAgY29uc3QgY2hhciogY25hbWUgPSBfX0V4dHJhY3RfbG9jYWxlX25hbWUobmFtZSwgY2F0ZWdvcnksIGJ1Zik7CisgIGlmIChjbmFtZSA9PSAwIHx8IChjbmFtZVswXSA9PSAnQycgJiYgY25hbWVbMV0gPT0gMCkpIHsKKyAgICByZXR1cm4gY25hbWU7CisgIH0KKyAgcmV0dXJuIF9fVHJhbnNsYXRlVG9TeXN0ZW0oY25hbWUsIGJ1ZiwgaGludCwgX19lcnJfY29kZSk7Cit9CisKK2NoYXIgY29uc3QqIF9Mb2NhbGVfZXh0cmFjdF9jdHlwZV9uYW1lKGNvbnN0IGNoYXIqIGNuYW1lLCBjaGFyKiBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTG9jYWxlX2xjaWRfdCogaGludCwgaW50ICpfX2Vycl9jb2RlKQoreyByZXR1cm4gX0xvY2FsZV9leHRyYWN0X2NhdGVnb3J5X25hbWUoY25hbWUsICJMQ19DVFlQRSIsIGJ1ZiwgaGludCwgX19lcnJfY29kZSk7IH0KKworY2hhciBjb25zdCogX0xvY2FsZV9leHRyYWN0X251bWVyaWNfbmFtZShjb25zdCBjaGFyKiBjbmFtZSwgY2hhciogYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTG9jYWxlX2xjaWRfdCogaGludCwgaW50ICpfX2Vycl9jb2RlKQoreyByZXR1cm4gX0xvY2FsZV9leHRyYWN0X2NhdGVnb3J5X25hbWUoY25hbWUsICJMQ19OVU1FUklDIiwgYnVmLCBoaW50LCBfX2Vycl9jb2RlKTsgfQorCitjaGFyIGNvbnN0KiBfTG9jYWxlX2V4dHJhY3RfdGltZV9uYW1lKGNvbnN0IGNoYXIqIGNuYW1lLCBjaGFyKiBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Mb2NhbGVfbGNpZF90KiBoaW50LCBpbnQgKl9fZXJyX2NvZGUpCit7IHJldHVybiBfTG9jYWxlX2V4dHJhY3RfY2F0ZWdvcnlfbmFtZShjbmFtZSwgIkxDX1RJTUUiLCBidWYsIGhpbnQsIF9fZXJyX2NvZGUpOyB9CisKK2NoYXIgY29uc3QqIF9Mb2NhbGVfZXh0cmFjdF9jb2xsYXRlX25hbWUoY29uc3QgY2hhciogY25hbWUsIGNoYXIqIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0xvY2FsZV9sY2lkX3QqIGhpbnQsIGludCAqX19lcnJfY29kZSkKK3sgcmV0dXJuIF9Mb2NhbGVfZXh0cmFjdF9jYXRlZ29yeV9uYW1lKGNuYW1lLCAiTENfQ09MTEFURSIsIGJ1ZiwgaGludCwgX19lcnJfY29kZSk7IH0KKworY2hhciBjb25zdCogX0xvY2FsZV9leHRyYWN0X21vbmV0YXJ5X25hbWUoY29uc3QgY2hhciogY25hbWUsIGNoYXIqIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Mb2NhbGVfbGNpZF90KiBoaW50LCBpbnQgKl9fZXJyX2NvZGUpCit7IHJldHVybiBfTG9jYWxlX2V4dHJhY3RfY2F0ZWdvcnlfbmFtZShjbmFtZSwgIkxDX01PTkVUQVJZIiwgYnVmLCBoaW50LCBfX2Vycl9jb2RlKTsgfQorCitjaGFyIGNvbnN0KiBfTG9jYWxlX2V4dHJhY3RfbWVzc2FnZXNfbmFtZShjb25zdCBjaGFyKiBjbmFtZSwgY2hhciogYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0xvY2FsZV9sY2lkX3QqIGhpbnQsIGludCAqX19lcnJfY29kZSkgeworICBpZiAoY25hbWVbMF0gPT0gJ0wnICYmIGNuYW1lWzFdID09ICdDJyAmJiBjbmFtZVsyXSA9PSAnXycpIHsKKyAgICByZXR1cm4gX0NfbmFtZTsKKyAgfQorICBpZiAoY25hbWVbMF0gPT0gJ0MnICYmIGNuYW1lWzFdID09IDApIHsKKyAgICByZXR1cm4gX0NfbmFtZTsKKyAgfQorICByZXR1cm4gX19UcmFuc2xhdGVUb1N5c3RlbShjbmFtZSwgYnVmLCBoaW50LCBfX2Vycl9jb2RlKTsKK30KKworLyogY3R5cGUgKi8KKworY29uc3QgX0xvY2FsZV9tYXNrX3QqIF9Mb2NhbGVfY3R5cGVfdGFibGUoX0xvY2FsZV9jdHlwZV90KiBsdHlwZSkgeworICBfU1RMUF9TVEFUSUNfQVNTRVJUKHNpemVvZihfTG9jYWxlX21hc2tfdCkgPT0gc2l6ZW9mKGx0eXBlLT5jdGFibGVbMF0pKQorICByZXR1cm4gKGNvbnN0IF9Mb2NhbGVfbWFza190KilsdHlwZS0+Y3RhYmxlOworfQorCitpbnQgX0xvY2FsZV90b3VwcGVyKF9Mb2NhbGVfY3R5cGVfdCogbHR5cGUsIGludCBjKSB7CisgIGNoYXIgYnVmWzJdLCBvdXRfYnVmWzJdOworICBidWZbMF0gPSAoY2hhciljOyBidWZbMV0gPSAwOworICBpZiAoKFVJTlQpX19HZXREZWZhdWx0Q1AobHR5cGUtPmxjLmlkKSA9PSBsdHlwZS0+Y3ApIHsKKyAgICBMQ01hcFN0cmluZ0EobHR5cGUtPmxjLmlkLCBMQ01BUF9MSU5HVUlTVElDX0NBU0lORyB8IExDTUFQX1VQUEVSQ0FTRSwgYnVmLCAyLCBvdXRfYnVmLCAyKTsKKyAgICByZXR1cm4gb3V0X2J1ZlswXTsKKyAgfQorICBlbHNlIHsKKyAgICB3Y2hhcl90IHdidWZbMl07CisgICAgTXVsdGlCeXRlVG9XaWRlQ2hhcihsdHlwZS0+Y3AsIE1CX1BSRUNPTVBPU0VELCBidWYsIDIsIHdidWYsIDIpOworICAgIFdpZGVDaGFyVG9NdWx0aUJ5dGUoX19HZXREZWZhdWx0Q1AobHR5cGUtPmxjLmlkKSwgV0NfQ09NUE9TSVRFQ0hFQ0sgfCBXQ19TRVBDSEFSUywgd2J1ZiwgMiwgYnVmLCAyLCBOVUxMLCBGQUxTRSk7CisKKyAgICBMQ01hcFN0cmluZ0EobHR5cGUtPmxjLmlkLCBMQ01BUF9MSU5HVUlTVElDX0NBU0lORyB8IExDTUFQX1VQUEVSQ0FTRSwgYnVmLCAyLCBvdXRfYnVmLCAyKTsKKworICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoX19HZXREZWZhdWx0Q1AobHR5cGUtPmxjLmlkKSwgTUJfUFJFQ09NUE9TRUQsIG91dF9idWYsIDIsIHdidWYsIDIpOworICAgIFdpZGVDaGFyVG9NdWx0aUJ5dGUobHR5cGUtPmNwLCBXQ19DT01QT1NJVEVDSEVDSyB8IFdDX1NFUENIQVJTLCB3YnVmLCAyLCBvdXRfYnVmLCAyLCBOVUxMLCBGQUxTRSk7CisgICAgcmV0dXJuIG91dF9idWZbMF07CisgIH0KK30KKworaW50IF9Mb2NhbGVfdG9sb3dlcihfTG9jYWxlX2N0eXBlX3QqIGx0eXBlLCBpbnQgYykgeworICBjaGFyIGJ1ZlsyXSwgb3V0X2J1ZlsyXTsKKyAgYnVmWzBdID0gKGNoYXIpYzsgYnVmWzFdID0gMDsKKyAgaWYgKChVSU5UKV9fR2V0RGVmYXVsdENQKGx0eXBlLT5sYy5pZCkgPT0gbHR5cGUtPmNwKSB7CisgICAgTENNYXBTdHJpbmdBKGx0eXBlLT5sYy5pZCwgTENNQVBfTElOR1VJU1RJQ19DQVNJTkcgfCBMQ01BUF9MT1dFUkNBU0UsIGJ1ZiwgMiwgb3V0X2J1ZiwgMik7CisgICAgcmV0dXJuIG91dF9idWZbMF07CisgIH0KKyAgZWxzZSB7CisgICAgd2NoYXJfdCB3YnVmWzJdOworICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIobHR5cGUtPmNwLCBNQl9QUkVDT01QT1NFRCwgYnVmLCAyLCB3YnVmLCAyKTsKKyAgICBXaWRlQ2hhclRvTXVsdGlCeXRlKF9fR2V0RGVmYXVsdENQKGx0eXBlLT5sYy5pZCksIFdDX0NPTVBPU0lURUNIRUNLIHwgV0NfU0VQQ0hBUlMsIHdidWYsIDIsIGJ1ZiwgMiwgTlVMTCwgRkFMU0UpOworCisgICAgTENNYXBTdHJpbmdBKGx0eXBlLT5sYy5pZCwgTENNQVBfTElOR1VJU1RJQ19DQVNJTkcgfCBMQ01BUF9MT1dFUkNBU0UsIGJ1ZiwgMiwgb3V0X2J1ZiwgMik7CisKKyAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKF9fR2V0RGVmYXVsdENQKGx0eXBlLT5sYy5pZCksIE1CX1BSRUNPTVBPU0VELCBvdXRfYnVmLCAyLCB3YnVmLCAyKTsKKyAgICBXaWRlQ2hhclRvTXVsdGlCeXRlKGx0eXBlLT5jcCwgV0NfQ09NUE9TSVRFQ0hFQ0sgfCBXQ19TRVBDSEFSUywgd2J1ZiwgMiwgb3V0X2J1ZiwgMiwgTlVMTCwgRkFMU0UpOworICAgIHJldHVybiBvdXRfYnVmWzBdOworICB9Cit9CisKKyNpZm5kZWYgQ1NUUl9FUVVBTCAvKiBWQzVTUDMqLworIyAgZGVmaW5lIENTVFJfRVFVQUwgMgorI2VuZGlmCisjaWZuZGVmIENTVFJfTEVTU19USEFOIC8qIFZDNVNQMyAqLworIyAgZGVmaW5lIENTVFJfTEVTU19USEFOIDEKKyNlbmRpZgorCitzdGF0aWMgRFdPUkQgbWF4X0RXT1JEID0gMHhmZmZmZmZmZjsKK3N0YXRpYyBEV09SRCB0cmltX3NpemVfdF90b19EV09SRChzaXplX3QgbikgeyByZXR1cm4gbiA8IChzaXplX3QpbWF4X0RXT1JEID8gKERXT1JEKW4gOiBtYXhfRFdPUkQ7IH0KKworLyogQ29sbGF0ZSAqLworLyogVGhpcyBmdW5jdGlvbiB0YWtlcyBjYXJlIG9mIHRoZSBwb3RlbnRpYWwgc2l6ZV90IERXT1JEIGRpZmZlcmVudCBzaXplLiAqLworc3RhdGljIGludCBfTG9jYWxlX3N0cmNtcF9hdXhBKF9Mb2NhbGVfY29sbGF0ZV90KiBsY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMxLCBzaXplX3QgbjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczIsIHNpemVfdCBuMikgeworICBpbnQgcmVzdWx0ID0gQ1NUUl9FUVVBTDsKKyAgd2hpbGUgKG4xID4gMCB8fCBuMiA+IDApIHsKKyAgICBEV09SRCBzaXplMSA9IHRyaW1fc2l6ZV90X3RvX0RXT1JEKG4xKTsKKyAgICBEV09SRCBzaXplMiA9IHRyaW1fc2l6ZV90X3RvX0RXT1JEKG4yKTsKKyAgICByZXN1bHQgPSBDb21wYXJlU3RyaW5nQShsY29sLT5sYy5pZCwgMCwgczEsIHNpemUxLCBzMiwgc2l6ZTIpOworICAgIGlmIChyZXN1bHQgIT0gQ1NUUl9FUVVBTCkKKyAgICAgIGJyZWFrOworICAgIG4xIC09IHNpemUxOworICAgIG4yIC09IHNpemUyOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludCBfTG9jYWxlX3N0cmNtcChfTG9jYWxlX2NvbGxhdGVfdCogbGNvbCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMSwgc2l6ZV90IG4xLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMyLCBzaXplX3QgbjIpIHsKKyAgaW50IHJlc3VsdDsKKyAgaWYgKF9fR2V0RGVmYXVsdENQKGxjb2wtPmxjLmlkKSA9PSBhdG9pKGxjb2wtPmNwKSkgeworICAgIHJlc3VsdCA9IF9Mb2NhbGVfc3RyY21wX2F1eEEobGNvbCwgczEsIG4xLCBzMiwgbjIpOworICB9CisgIGVsc2UgeworICAgIGNoYXIgKmJ1ZjEsICpidWYyOworICAgIHNpemVfdCBzaXplMSwgc2l6ZTI7CisgICAgYnVmMSA9IF9fQ29udmVydFRvQ1AoYXRvaShsY29sLT5jcCksIF9fR2V0RGVmYXVsdENQKGxjb2wtPmxjLmlkKSwgczEsIG4xLCAmc2l6ZTEpOworICAgIGJ1ZjIgPSBfX0NvbnZlcnRUb0NQKGF0b2kobGNvbC0+Y3ApLCBfX0dldERlZmF1bHRDUChsY29sLT5sYy5pZCksIHMyLCBuMiwgJnNpemUyKTsKKworICAgIHJlc3VsdCA9IF9Mb2NhbGVfc3RyY21wX2F1eEEobGNvbCwgYnVmMSwgc2l6ZTEsIGJ1ZjIsIHNpemUyKTsKKyAgICBmcmVlKGJ1ZjEpOyBmcmVlKGJ1ZjIpOworICB9CisgIHJldHVybiAocmVzdWx0ID09IENTVFJfRVFVQUwpID8gMCA6IChyZXN1bHQgPT0gQ1NUUl9MRVNTX1RIQU4pID8gLTEgOiAxOworfQorCitzaXplX3QgX0xvY2FsZV9zdHJ4ZnJtKF9Mb2NhbGVfY29sbGF0ZV90KiBsY29sLAorICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBkc3QsIHNpemVfdCBkc3Rfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc3JjLCBzaXplX3Qgc3JjX3NpemUpIHsKKyAgaW50IHJlc3VsdDsKKworICAvKiBUaGUgV2luZG93cyBBUEkgZG8gbm90IHN1cHBvcnQgdHJhbnNmb3JtYXRpb24gb2YgdmVyeSBsb25nIHN0cmluZ3MgKHNyY19zaXplID4gSU5UX01BWCkKKyAgICogSW4gdGhpcyBjYXNlIHRoZSByZXN1bHQgd2lsbCBqdXN0IGJlIHRoZSBpbnB1dCBzdHJpbmc6CisgICAqLworICBpZiAoc3JjX3NpemUgPiBJTlRfTUFYKSB7CisgICAgaWYgKGRzdCAhPSAwKSB7CisgICAgICBfU1RMUF9TVFJOQ1BZKGRzdCwgZHN0X3NpemUsIHNyYywgc3JjX3NpemUpOworICAgIH0KKyAgICByZXR1cm4gc3JjX3NpemU7CisgIH0KKyAgaWYgKGRzdF9zaXplID4gSU5UX01BWCkgeworICAgIC8qIG5vdyB0aGF0IHdlIGtub3cgdGhhdCBzcmNfc2l6ZSA8PSBJTlRfTUFYIHdlIGNhbiBzYWZlbHkgZGVjcmVhc2UgZHN0X3NpemUgdG8gSU5UX01BWC4gKi8KKyAgICBkc3Rfc2l6ZSA9IElOVF9NQVg7CisgIH0KKworICBpZiAoX19HZXREZWZhdWx0Q1AobGNvbC0+bGMuaWQpID09IGF0b2kobGNvbC0+Y3ApKQorICAgIHJlc3VsdCA9IExDTWFwU3RyaW5nQShsY29sLT5sYy5pZCwgTENNQVBfU09SVEtFWSwgc3JjLCAoaW50KXNyY19zaXplLCBkc3QsIChpbnQpZHN0X3NpemUpOworICBlbHNlIHsKKyAgICBjaGFyICpidWY7CisgICAgc2l6ZV90IHNpemU7CisgICAgYnVmID0gX19Db252ZXJ0VG9DUChhdG9pKGxjb2wtPmNwKSwgX19HZXREZWZhdWx0Q1AobGNvbC0+bGMuaWQpLCBzcmMsIHNyY19zaXplLCAmc2l6ZSk7CisKKyAgICByZXN1bHQgPSBMQ01hcFN0cmluZ0EobGNvbC0+bGMuaWQsIExDTUFQX1NPUlRLRVksIGJ1ZiwgKGludClzaXplLCBkc3QsIChpbnQpZHN0X3NpemUpOworICAgIGZyZWUoYnVmKTsKKyAgfQorICByZXR1cm4gcmVzdWx0ICE9IDAgPyByZXN1bHQgLSAxIDogMDsKK30KKworLyogTnVtZXJpYyAqLworc3RhdGljIGNvbnN0IGNoYXIqIF9fdHJ1ZV9uYW1lID0gInRydWUiOworc3RhdGljIGNvbnN0IGNoYXIqIF9fZmFsc2VfbmFtZSA9ICJmYWxzZSI7CisKK2NoYXIgX0xvY2FsZV9kZWNpbWFsX3BvaW50KF9Mb2NhbGVfbnVtZXJpY190KiBsbnVtKQoreyByZXR1cm4gbG51bS0+ZGVjaW1hbF9wb2ludFswXTsgfQorCitjaGFyIF9Mb2NhbGVfdGhvdXNhbmRzX3NlcChfTG9jYWxlX251bWVyaWNfdCogbG51bSkKK3sgcmV0dXJuIGxudW0tPnRob3VzYW5kc19zZXBbMF07IH0KKworY29uc3QgY2hhciogX0xvY2FsZV9ncm91cGluZyhfTG9jYWxlX251bWVyaWNfdCAqIGxudW0pIHsKKyAgaWYgKCFsbnVtLT5ncm91cGluZykgcmV0dXJuICIiOworICBlbHNlIHJldHVybiBsbnVtLT5ncm91cGluZzsKK30KKworY29uc3QgY2hhciAqIF9Mb2NhbGVfdHJ1ZShfTG9jYWxlX251bWVyaWNfdCAqIGxudW0pIHsKKyAgX1NUTFBfTUFSS19QQVJBTUVURVJfQVNfVU5VU0VEKGxudW0pCisgIHJldHVybiBfX3RydWVfbmFtZTsgLyogTlQgZG9lcyd0IHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyAqLworfQorCitjb25zdCBjaGFyICogX0xvY2FsZV9mYWxzZShfTG9jYWxlX251bWVyaWNfdCAqIGxudW0pIHsKKyAgX1NUTFBfTUFSS19QQVJBTUVURVJfQVNfVU5VU0VEKGxudW0pCisgIHJldHVybiBfX2ZhbHNlX25hbWU7IC8qIE5UIGRvZXMndCBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgKi8KK30KKworLyogTW9uZXRhcnkgKi8KK2NvbnN0IGNoYXIqIF9Mb2NhbGVfaW50X2N1cnJfc3ltYm9sKF9Mb2NhbGVfbW9uZXRhcnlfdCAqIGxtb24pCit7IHJldHVybiBsbW9uLT5pbnRfY3Vycl9zeW1ib2w7IH0KKworY29uc3QgY2hhciogX0xvY2FsZV9jdXJyZW5jeV9zeW1ib2woX0xvY2FsZV9tb25ldGFyeV90ICogbG1vbikKK3sgcmV0dXJuIGxtb24tPmN1cnJfc3ltYm9sOyB9CisKK2NoYXIgX0xvY2FsZV9tb25fZGVjaW1hbF9wb2ludChfTG9jYWxlX21vbmV0YXJ5X3QgKiBsbW9uKQoreyByZXR1cm4gbG1vbi0+ZGVjaW1hbF9wb2ludFswXTsgfQorCitjaGFyIF9Mb2NhbGVfbW9uX3Rob3VzYW5kc19zZXAoX0xvY2FsZV9tb25ldGFyeV90ICogbG1vbikKK3sgcmV0dXJuIGxtb24tPnRob3VzYW5kc19zZXBbMF07IH0KKworY29uc3QgY2hhciogX0xvY2FsZV9tb25fZ3JvdXBpbmcoX0xvY2FsZV9tb25ldGFyeV90ICogbG1vbikgeworICBpZiAoIWxtb24tPmdyb3VwaW5nKSByZXR1cm4gIiI7CisgIGVsc2UgcmV0dXJuIGxtb24tPmdyb3VwaW5nOworfQorCitjb25zdCBjaGFyKiBfTG9jYWxlX3Bvc2l0aXZlX3NpZ24oX0xvY2FsZV9tb25ldGFyeV90ICogbG1vbikKK3sgcmV0dXJuIGxtb24tPnBvc2l0aXZlX3NpZ247IH0KKworY29uc3QgY2hhciogX0xvY2FsZV9uZWdhdGl2ZV9zaWduKF9Mb2NhbGVfbW9uZXRhcnlfdCAqIGxtb24pCit7IHJldHVybiBsbW9uLT5uZWdhdGl2ZV9zaWduOyB9CisKK2NoYXIgX0xvY2FsZV9pbnRfZnJhY19kaWdpdHMoX0xvY2FsZV9tb25ldGFyeV90ICogbG1vbikKK3sgcmV0dXJuIChjaGFyKWxtb24tPmludF9mcmFjX2RpZ2l0czsgfQorCitjaGFyIF9Mb2NhbGVfZnJhY19kaWdpdHMoX0xvY2FsZV9tb25ldGFyeV90ICogbG1vbikKK3sgcmV0dXJuIChjaGFyKWxtb24tPmZyYWNfZGlnaXRzOyB9CisKK2ludCBfTG9jYWxlX3BfY3NfcHJlY2VkZXMoX0xvY2FsZV9tb25ldGFyeV90ICogbG1vbikgeworICBjaGFyIGxvY19kYXRhWzJdOworICBHZXRMb2NhbGVJbmZvQShsbW9uLT5sYy5pZCwgTE9DQUxFX0lQT1NTWU1QUkVDRURFUywgbG9jX2RhdGEsIDIpOworICBpZiAobG9jX2RhdGFbMF0gPT0gJzAnKSByZXR1cm4gMDsKKyAgZWxzZSBpZiAobG9jX2RhdGFbMF0gPT0gJzEnKSByZXR1cm4gMTsKKyAgZWxzZSByZXR1cm4gLTE7Cit9CisKK2ludCBfTG9jYWxlX3Bfc2VwX2J5X3NwYWNlKF9Mb2NhbGVfbW9uZXRhcnlfdCAqIGxtb24pIHsKKyAgY2hhciBsb2NfZGF0YVsyXTsKKyAgR2V0TG9jYWxlSW5mb0EobG1vbi0+bGMuaWQsIExPQ0FMRV9JUE9TU0VQQllTUEFDRSwgbG9jX2RhdGEsIDIpOworICBpZiAobG9jX2RhdGFbMF0gPT0gJzAnKSByZXR1cm4gMDsKKyAgZWxzZSBpZiAobG9jX2RhdGFbMF0gPT0gJzEnKSByZXR1cm4gMTsKKyAgZWxzZSByZXR1cm4gLTE7Cit9CisKK2ludCBfTG9jYWxlX3Bfc2lnbl9wb3NuKF9Mb2NhbGVfbW9uZXRhcnlfdCAqIGxtb24pIHsKKyAgY2hhciBsb2NfZGF0YVsyXTsKKyAgaWYgKGxtb24tPmxjLmlkICE9IElOVkFSSUFOVF9MQ0lEKSB7CisgICAgR2V0TG9jYWxlSW5mb0EobG1vbi0+bGMuaWQsIExPQ0FMRV9JUE9TU0lHTlBPU04sIGxvY19kYXRhLCAyKTsKKyAgICByZXR1cm4gYXRvaShsb2NfZGF0YSk7CisgIH0KKyAgZWxzZSB7CisgICAgcmV0dXJuIENIQVJfTUFYOworICB9Cit9CisKK2ludCBfTG9jYWxlX25fY3NfcHJlY2VkZXMoX0xvY2FsZV9tb25ldGFyeV90ICogbG1vbikgeworICBjaGFyIGxvY19kYXRhWzJdOworICBHZXRMb2NhbGVJbmZvQShsbW9uLT5sYy5pZCwgTE9DQUxFX0lORUdTWU1QUkVDRURFUywgbG9jX2RhdGEsIDIpOworICBpZiAobG9jX2RhdGFbMF0gPT0gJzAnKSByZXR1cm4gMDsKKyAgZWxzZSBpZiAobG9jX2RhdGFbMF0gPT0gJzEnKSByZXR1cm4gMTsKKyAgZWxzZSByZXR1cm4gLTE7Cit9CisKK2ludCBfTG9jYWxlX25fc2VwX2J5X3NwYWNlKF9Mb2NhbGVfbW9uZXRhcnlfdCAqIGxtb24pIHsKKyAgY2hhciBsb2NfZGF0YVsyXTsKKyAgR2V0TG9jYWxlSW5mb0EobG1vbi0+bGMuaWQsIExPQ0FMRV9JTkVHU0VQQllTUEFDRSwgbG9jX2RhdGEsIDIpOworICBpZiAobG9jX2RhdGFbMF0gPT0gJzAnKSByZXR1cm4gMDsKKyAgZWxzZSBpZiAobG9jX2RhdGFbMF0gPT0gJzEnKSByZXR1cm4gMTsKKyAgZWxzZSByZXR1cm4gLTE7Cit9CisKK2ludCBfTG9jYWxlX25fc2lnbl9wb3NuKF9Mb2NhbGVfbW9uZXRhcnlfdCAqIGxtb24pIHsKKyAgY2hhciBsb2NfZGF0YVsyXTsKKyAgaWYgKGxtb24tPmxjLmlkICE9IElOVkFSSUFOVF9MQ0lEKSB7CisgICAgR2V0TG9jYWxlSW5mb0EobG1vbi0+bGMuaWQsIExPQ0FMRV9JTkVHU0lHTlBPU04sIGxvY19kYXRhLCAyKTsKKyAgICByZXR1cm4gYXRvaShsb2NfZGF0YSk7CisgIH0KKyAgZWxzZSB7CisgICAgcmV0dXJuIENIQVJfTUFYOworICB9Cit9CisKKy8qIFRpbWUgKi8KK2NvbnN0IGNoYXIgKiBfTG9jYWxlX2Z1bGxfbW9udGhuYW1lKF9Mb2NhbGVfdGltZV90ICogbHRpbWUsIGludCBtb250aCkgeworICBjb25zdCBjaGFyICoqbmFtZXMgPSAoY29uc3QgY2hhcioqKWx0aW1lLT5tb250aDsKKyAgcmV0dXJuIG5hbWVzW21vbnRoXTsKK30KKworY29uc3QgY2hhciAqIF9Mb2NhbGVfYWJicmV2X21vbnRobmFtZShfTG9jYWxlX3RpbWVfdCAqIGx0aW1lLCBpbnQgbW9udGgpIHsKKyAgY29uc3QgY2hhciAqKm5hbWVzID0gKGNvbnN0IGNoYXIqKilsdGltZS0+YWJicmV2X21vbnRoOworICByZXR1cm4gbmFtZXNbbW9udGhdOworfQorCitjb25zdCBjaGFyICogX0xvY2FsZV9mdWxsX2RheW9md2VlayhfTG9jYWxlX3RpbWVfdCAqIGx0aW1lLCBpbnQgZGF5KSB7CisgIGNvbnN0IGNoYXIgKipuYW1lcyA9IChjb25zdCBjaGFyKiopbHRpbWUtPmRheW9md2VlazsKKyAgcmV0dXJuIG5hbWVzW2RheV07Cit9CisKK2NvbnN0IGNoYXIgKiBfTG9jYWxlX2FiYnJldl9kYXlvZndlZWsoX0xvY2FsZV90aW1lX3QgKiBsdGltZSwgaW50IGRheSkgeworICBjb25zdCBjaGFyICoqbmFtZXMgPSAoY29uc3QgY2hhcioqKWx0aW1lLT5hYmJyZXZfZGF5b2Z3ZWVrOworICByZXR1cm4gbmFtZXNbZGF5XTsKK30KKworY29uc3QgY2hhciogX0xvY2FsZV9kX3RfZm10KF9Mb2NhbGVfdGltZV90KiBsdGltZSkKK3sgcmV0dXJuIGx0aW1lLT5kYXRlX3RpbWVfZm9ybWF0OyB9CisKK2NvbnN0IGNoYXIqIF9Mb2NhbGVfbG9uZ19kX3RfZm10KF9Mb2NhbGVfdGltZV90KiBsdGltZSkKK3sgcmV0dXJuIGx0aW1lLT5sb25nX2RhdGVfdGltZV9mb3JtYXQ7IH0KKworY29uc3QgY2hhciogX0xvY2FsZV9kX2ZtdChfTG9jYWxlX3RpbWVfdCogbHRpbWUpCit7IHJldHVybiBsdGltZS0+ZGF0ZV9mb3JtYXQ7IH0KKworY29uc3QgY2hhciogX0xvY2FsZV9sb25nX2RfZm10KF9Mb2NhbGVfdGltZV90KiBsdGltZSkKK3sgcmV0dXJuIGx0aW1lLT5sb25nX2RhdGVfZm9ybWF0OyB9CisKK2NvbnN0IGNoYXIqIF9Mb2NhbGVfdF9mbXQoX0xvY2FsZV90aW1lX3QqIGx0aW1lKQoreyByZXR1cm4gbHRpbWUtPnRpbWVfZm9ybWF0OyB9CisKK2NvbnN0IGNoYXIqIF9Mb2NhbGVfYW1fc3RyKF9Mb2NhbGVfdGltZV90KiBsdGltZSkKK3sgcmV0dXJuIGx0aW1lLT5hbTsgfQorCitjb25zdCBjaGFyKiBfTG9jYWxlX3BtX3N0cihfTG9jYWxlX3RpbWVfdCogbHRpbWUpCit7IHJldHVybiBsdGltZS0+cG07IH0KKworLyogTWVzc2FnZXMgKi8KK25sX2NhdGRfdHlwZSBfTG9jYWxlX2NhdG9wZW4oc3RydWN0IF9Mb2NhbGVfbWVzc2FnZXMqIGxtZXMsIGNvbnN0IGNoYXIqIGNhdF9uYW1lKSB7CisgIF9TVExQX01BUktfUEFSQU1FVEVSX0FTX1VOVVNFRChsbWVzKQorICBfU1RMUF9NQVJLX1BBUkFNRVRFUl9BU19VTlVTRUQoY2F0X25hbWUpCisgIHJldHVybiAtMTsKK30KK3ZvaWQgX0xvY2FsZV9jYXRjbG9zZShzdHJ1Y3QgX0xvY2FsZV9tZXNzYWdlcyogbG1lcywgbmxfY2F0ZF90eXBlIGNhdCkgeworICBfU1RMUF9NQVJLX1BBUkFNRVRFUl9BU19VTlVTRUQobG1lcykKKyAgX1NUTFBfTUFSS19QQVJBTUVURVJfQVNfVU5VU0VEKCZjYXQpCit9Citjb25zdCBjaGFyKiBfTG9jYWxlX2NhdGdldHMoc3RydWN0IF9Mb2NhbGVfbWVzc2FnZXMqIGxtZXMsIG5sX2NhdGRfdHlwZSBjYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNldGlkLCBpbnQgbXNnaWQsIGNvbnN0IGNoYXIgKmRmYXVsdCkgeworICBfU1RMUF9NQVJLX1BBUkFNRVRFUl9BU19VTlVTRUQobG1lcykKKyAgX1NUTFBfTUFSS19QQVJBTUVURVJfQVNfVU5VU0VEKCZjYXQpCisgIF9TVExQX01BUktfUEFSQU1FVEVSX0FTX1VOVVNFRCgmc2V0aWQpCisgIF9TVExQX01BUktfUEFSQU1FVEVSX0FTX1VOVVNFRCgmbXNnaWQpCisgIHJldHVybiBkZmF1bHQ7Cit9CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBleHRlcm4gQyAqLworX1NUTFBfRU5EX05BTUVTUEFDRQorI2VuZGlmCisKK3ZvaWQgX19GaXhHcm91cGluZyhjaGFyICpncm91cGluZykgeworICAvKiBUaGlzIGNvbnZlcnRzIE5UIHZlcnNpb24gd2hpY2ggdXNlcyAnMCcgaW5zdGVhZCBvZiAwLCBldGMgOyB0byBBTlNJICovCisgIGNoYXIgKmcgPSBncm91cGluZzsKKyAgY2hhciBidWlsZGluZ19ncm91cCA9IDA7CisgIGNoYXIgcmVwZWF0X2xhc3QgPSAwOworICAvKiBDaGVjayB0aGVyZSBpcyBhIGdyb3VwaW5nIGluZm8gb3RoZXJ3aXNlIHdlIHdvdWxkIGFkZCBhIHVzZWxlc3MgQ0hBUl9NQVggKi8KKyAgaWYgKCpnKSB7CisgICAgZm9yICg7ICpnOyArK2cpIHsKKyAgICAgIGlmICgqZyA+ICcwJyAmJiAqZyA8PSAnOScpIHsKKyAgICAgICAgaWYgKCFidWlsZGluZ19ncm91cCkgeworICAgICAgICAgICpncm91cGluZyA9ICpnIC0gJzAnOworICAgICAgICAgIGJ1aWxkaW5nX2dyb3VwID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAvKiBLbm93biBpc3N1ZTogZ3JvdXBpbmcgbWlnaHQgcm9sbC4gKi8KKyAgICAgICAgICAqZ3JvdXBpbmcgPSAqZ3JvdXBpbmcgKiAxMCArICpnIC0gJzAnOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIGlmICgqZyA9PSAnMCcpIHsKKyAgICAgICAgaWYgKCFidWlsZGluZ19ncm91cCkgeworICAgICAgICAgIHJlcGVhdF9sYXN0ID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgLyogS25vd24gaXNzdWU6IGdyb3VwaW5nIG1pZ2h0IHJvbGwuICovCisgICAgICAgICAgKmdyb3VwaW5nICo9IDEwOworICAgICAgfQorICAgICAgZWxzZSBpZiAoKmcgPT0gJzsnKSB7CisgICAgICAgIC8qIFN0b3AgYWRkaW5nIHRvIHRoZSBjdXJyZW50IGdyb3VwICovCisgICAgICAgIGJ1aWxkaW5nX2dyb3VwID0gMDsKKyAgICAgICAgKytncm91cGluZzsKKyAgICAgIH0KKyAgICAgIC8qIGVsc2Ugd2UgaWdub3JlIHRoZSBjaGFyYWN0ZXIgKi8KKyAgICB9CisKKyAgICBpZiAoIXJlcGVhdF9sYXN0KQorICAgICAgKmdyb3VwaW5nKysgPSBDSEFSX01BWDsKKyAgICAqZ3JvdXBpbmcgPSAwOworICB9Cit9CisKK2NvbnN0IGNoYXIqIF9fQ29udmVydE5hbWUoY29uc3QgY2hhciogbG5hbWUsIExPQ0FMRUNPTlYqIENvbnZUYWJsZSwgaW50IFRhYmxlU2l6ZSkgeworICBpbnQgaTsKKyAgaW50IGNtcDsKKyAgaW50IGxvdyA9IDA7CisgIGludCBoaWdoID0gVGFibGVTaXplIC0gMTsKKworICAvKiAgdHlwaWNhbCBiaW5hcnkgc2VhcmNoIC0gZG8gdW50aWwgbm8gbW9yZSB0byBzZWFyY2ggb3IgbWF0Y2ggKi8KKyAgd2hpbGUgKGxvdyA8PSBoaWdoKSB7CisgICAgaSA9IChsb3cgKyBoaWdoKSAvIDI7CisKKyAgICBpZiAoKGNtcCA9IGxzdHJjbXBpQShsbmFtZSwgKCooQ29udlRhYmxlICsgaSkpLm5hbWUpKSA9PSAwKQorICAgICAgcmV0dXJuICgqKENvbnZUYWJsZSArIGkpKS5hYmJyZXY7CisgICAgZWxzZSBpZiAoY21wIDwgMCkKKyAgICAgIGhpZ2ggPSBpIC0gMTsKKyAgICBlbHNlCisgICAgICBsb3cgPSBpICsgMTsKKyAgfQorICByZXR1cm4gbG5hbWU7Cit9CisKK2ludCBfX1BhcnNlTG9jYWxlU3RyaW5nKGNvbnN0IGNoYXIqIGxuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogbGFuZywgY2hhciogY3RyeSwgY2hhciogcGFnZSkgeworICBpbnQgcGFyYW0gPSAwOworICBzaXplX3QgbGVuOworICBzaXplX3QgdG1wTGVuOworCisgIGlmIChsbmFtZVswXSA9PSAwKQorICAgIHJldHVybiAwOworCisgIC8qIFdlIGxvb2sgZm9yIHRoZSBmaXJzdCBjb3VudHJ5IHNlcGFyYXRvciAnXycgKi8KKyAgbGVuID0gc3RyY3NwbihsbmFtZSwgIl8iKTsKKyAgaWYgKGxuYW1lW2xlbl0gPT0gJ18nKSB7CisgICAgaWYgKGxlbiA9PSAwIHx8IGxlbiA+IE1BWF9MQU5HX0xFTikgcmV0dXJuIC0xOyAvKiBlbXB0eSBsYW5nIGlzIGludmFsaWQqLworICAgIF9TVExQX1NUUk5DUFkobGFuZywgTUFYX0xBTkdfTEVOICsgMSwgbG5hbWUsIGxlbik7CisgICAgbG5hbWUgKz0gbGVuICsgMTsKKyAgICArK3BhcmFtOworICB9CisKKyAgLyogV2UgbG9vayBmb3IgdGhlIGxhc3QgY29kZSBwYWdlIHNlcGFyYXRvciAnLicgKi8KKyAgbGVuID0gLTE7CisgIHRtcExlbiA9IHN0cmNzcG4obG5hbWUsICIuIik7CisgIHdoaWxlIChsbmFtZVt0bXBMZW5dID09ICcuJykgeworICAgIGxlbiA9IHRtcExlbjsgKyt0bXBMZW47CisgICAgdG1wTGVuICs9IHN0cmNzcG4obG5hbWUgKyB0bXBMZW4sICIuIik7CisgIH0KKyAgaWYgKGxlbiAhPSAtMSkgeyAvKiBNZWFucyB0aGF0IHdlIGZvdW5kIGEgJy4nICovCisgICAgaWYgKHBhcmFtID09IDApIHsKKyAgICAgIC8qIFdlIGhhdmUgbm8gbGFuZyB5ZXQgc28gd2UgaGF2ZSB0byBmaWxsIGl0IGZpcnN0LCBubyBjb3VudHJ5ICovCisgICAgICBpZiAobGVuID4gTUFYX0xBTkdfTEVOKSByZXR1cm4gLTE7CisgICAgICBpZiAobGVuID09IDApIHsKKyAgICAgICAgLyogTm8gbGFuZ3VhZ2Ugbm9yIGNvdW50cnksIG9ubHkgY29kZSBwYWdlICovCisgICAgICAgICsrcGFyYW07CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7IF9TVExQX1NUUk5DUFkobGFuZywgTUFYX0xBTkdfTEVOICsgMSwgbG5hbWUsIGxlbik7IH0KKyAgICAgICsrcGFyYW07CisgICAgfQorICAgIGVsc2UgeworICAgICAgLyogV2UgYWxyZWFkeSBoYXZlIGEgbGFuZyBzbyB3ZSBhcmUgbm93IGxvb2tpbmcgZm9yIHRoZSBjb3VudHJ5OiAqLworICAgICAgaWYgKGxlbiA9PSAwKSByZXR1cm4gLTE7IC8qIFdlIGZvcmJpZCBsb2NhbGUgbmFtZSB3aXRoIHRoZSAiXy4iIG1vdGlmIGluIGl0ICovCisgICAgICBpZiAobGVuID4gTUFYX0NUUllfTEVOKSByZXR1cm4gLTE7CisgICAgICBfU1RMUF9TVFJOQ1BZKGN0cnksIE1BWF9DVFJZX0xFTiArIDEsIGxuYW1lLCBsZW4pOworICAgIH0KKyAgICArK3BhcmFtOworICAgIGxuYW1lICs9IGxlbiArIDE7CisgIH0KKworICAvKiBXZSBsb29rIGZvciAnLCcgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBQT1NJWCAqLworICBsZW4gPSBzdHJjc3BuKGxuYW1lLCAiLCIpOworICBzd2l0Y2ggKHBhcmFtKSB7CisgICAgY2FzZSAwOgorICAgICAgaWYgKGxlbiA+IE1BWF9MQU5HX0xFTikgcmV0dXJuIC0xOworICAgICAgX1NUTFBfU1RSTkNQWShsYW5nLCBNQVhfTEFOR19MRU4gKyAxLCBsbmFtZSwgbGVuKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgIGlmIChsZW4gPiBNQVhfQ1RSWV9MRU4pIHJldHVybiAtMTsKKyAgICAgIF9TVExQX1NUUk5DUFkoY3RyeSwgTUFYX0NUUllfTEVOICsgMSwgbG5hbWUsIGxlbik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgaWYgKGxlbiA+IE1BWF9DUF9MRU4pIHJldHVybiAtMTsKKyAgICAgIF9TVExQX1NUUk5DUFkocGFnZSwgTUFYX0NQX0xFTiArIDEsIGxuYW1lLCBsZW4pOworICAgICAgYnJlYWs7CisgIH0KKworICAvKiAnLCcgUE9TSVggbW9kaWZpZXIgaXMgbm90IHVzZWQgaW4gTlQgKi8KKyAgcmV0dXJuIDA7Cit9CisKKy8qIERhdGEgbmVjZXNzYXJ5IGZvciBmaW5kIExDSUQqLworc3RhdGljIENSSVRJQ0FMX1NFQ1RJT04gX19jcml0aWNhbFNlY3Rpb247CitzdGF0aWMgaW50IF9fRmluZEZsYWc7CitzdGF0aWMgTENJRCBfX0ZuZExDSUQ7CitzdGF0aWMgY29uc3QgY2hhciogX19GbmRMYW5nOworc3RhdGljIGNvbnN0IGNoYXIqIF9fRm5kQ3RyeTsKKwordm9pZCBfTG9jYWxlX2luaXQoKQoreyBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKCZfX2NyaXRpY2FsU2VjdGlvbik7IH0KKwordm9pZCBfTG9jYWxlX2ZpbmFsKCkKK3sgRGVsZXRlQ3JpdGljYWxTZWN0aW9uKCZfX2NyaXRpY2FsU2VjdGlvbik7IH0KKworc3RhdGljIExDSUQgTG9jYWxlRnJvbUhleChjb25zdCBjaGFyKiBsb2NhbGUpIHsKKyAgdW5zaWduZWQgbG9uZyByZXN1bHQgPSAwOworICBpbnQgZGlnaXQ7CisgIHdoaWxlICgqbG9jYWxlKSB7CisgICAgcmVzdWx0IDw8PSA0OworICAgIGRpZ2l0ID0gKCpsb2NhbGUgPj0gJzAnICYmICpsb2NhbGUgPD0gJzknKSA/ICpsb2NhbGUgLSAnMCc6CisgICAgICAgICAgICAoKmxvY2FsZSA+PSAnQScgJiYgKmxvY2FsZSA8PSAnRicpID8gKCpsb2NhbGUgLSAnQScpICsgMTAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoKmxvY2FsZSAtICdhJykgKyAxMDsKKyAgICByZXN1bHQgKz0gZGlnaXQ7CisgICAgKytsb2NhbGU7CisgIH0KKyAgcmV0dXJuIChMQ0lEKXJlc3VsdDsKK30KKworc3RhdGljIEJPT0wgQ0FMTEJBQ0sgRW51bUxvY2FsZXNQcm9jQShMUFNUUiBsb2NhbGUpIHsKKyAgTENJRCBsY2lkID0gTG9jYWxlRnJvbUhleChsb2NhbGUpOworICBpbnQgTGFuZ0ZsYWcgPSAwLCBDdHJ5RmxhZyA9ICFfX0ZuZEN0cnk7CisgIHN0YXRpYyBjaGFyIExhbmdbTUFYX0xBTkdfTEVOXSwgQ3RyeVtNQVhfQ1RSWV9MRU5dOworCisgIEdldExvY2FsZUluZm9BKGxjaWQsIExPQ0FMRV9TRU5HTEFOR1VBR0UsIExhbmcsIE1BWF9MQU5HX0xFTik7CisgIGlmIChsc3RyY21waUEoTGFuZywgX19GbmRMYW5nKSAhPSAwKSB7CisgICAgR2V0TG9jYWxlSW5mb0EobGNpZCwgTE9DQUxFX1NBQkJSRVZMQU5HTkFNRSwgTGFuZywgTUFYX0xBTkdfTEVOKTsKKyAgICBpZiAobHN0cmNtcGlBKExhbmcsIF9fRm5kTGFuZykgIT0gMCkgeworICAgICAgR2V0TG9jYWxlSW5mb0EobGNpZCwgTE9DQUxFX1NJU082MzlMQU5HTkFNRSwgTGFuZywgTUFYX0xBTkdfTEVOKTsKKyAgICAgIGlmIChsc3RyY21waUEoTGFuZywgX19GbmRMYW5nKSA9PSAwKSBMYW5nRmxhZyA9IDE7CisgICAgfQorICAgIGVsc2UgTGFuZ0ZsYWcgPSAxOworICB9CisgIGVsc2UgTGFuZ0ZsYWcgPSAxOworCisgIGlmIChfX0ZuZEN0cnkpIHsKKyAgICBHZXRMb2NhbGVJbmZvQShsY2lkLCBMT0NBTEVfU0VOR0NPVU5UUlksIEN0cnksIE1BWF9DVFJZX0xFTik7CisgICAgaWYgKGxzdHJjbXBpQShDdHJ5LCBfX0ZuZEN0cnkpICE9IDApIHsKKyAgICAgIEdldExvY2FsZUluZm9BKGxjaWQsIExPQ0FMRV9TQUJCUkVWQ1RSWU5BTUUsIEN0cnksIE1BWF9DVFJZX0xFTik7CisgICAgICBpZiAobHN0cmNtcGlBKEN0cnksIF9fRm5kQ3RyeSkgIT0gMCkgeworICAgICAgICBHZXRMb2NhbGVJbmZvQShsY2lkLCBMT0NBTEVfU0lTTzMxNjZDVFJZTkFNRSwgQ3RyeSwgTUFYX0NUUllfTEVOKTsKKyAgICAgICAgaWYgKGxzdHJjbXBpQShDdHJ5LCBfX0ZuZEN0cnkpID09IDApIEN0cnlGbGFnID0gMTsKKyAgICAgIH0KKyAgICAgIGVsc2UgQ3RyeUZsYWcgPSAxOworICAgIH0KKyAgICBlbHNlCisgICAgICBDdHJ5RmxhZyA9IDE7CisgIH0KKworICBpZiAoTGFuZ0ZsYWcgJiYgQ3RyeUZsYWcpIHsKKyAgICBfX0ZpbmRGbGFnID0gMTsKKyAgICBfX0ZuZExDSUQgPSBsY2lkOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitpbnQgX19HZXRMQ0lEKGNvbnN0IGNoYXIqIGxhbmcsIGNvbnN0IGNoYXIqIGN0cnksIExDSUQqIGxjaWQpIHsKKyAgaW50IHJldDsKKyAgRW50ZXJDcml0aWNhbFNlY3Rpb24oJl9fY3JpdGljYWxTZWN0aW9uKTsKKworICBfX0ZpbmRGbGFnID0gMDsKKyAgX19GbmRMYW5nID0gbGFuZzsKKyAgX19GbmRDdHJ5ID0gY3RyeTsKKyAgRW51bVN5c3RlbUxvY2FsZXNBKEVudW1Mb2NhbGVzUHJvY0EsIExDSURfSU5TVEFMTEVEKTsKKworICBpZiAoX19GaW5kRmxhZyAhPSAwKSAqbGNpZCA9IF9fRm5kTENJRDsKKyAgcmV0ID0gX19GaW5kRmxhZyAhPSAwID8gMCA6IC0xOworCisgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZfX2NyaXRpY2FsU2VjdGlvbik7CisgIHJldHVybiByZXQ7Cit9CisKK2ludCBfX0dldExDSURGcm9tTmFtZShjb25zdCBjaGFyKiBsbmFtZSwgTENJRCogbGNpZCwgY2hhciogY3AsIF9Mb2NhbGVfbGNpZF90ICpoaW50KSB7CisgIGNoYXIgbGFuZ1tNQVhfTEFOR19MRU4gKyAxXSwgY3RyeVtNQVhfQ1RSWV9MRU4gKyAxXSwgcGFnZVtNQVhfQ1BfTEVOICsgMV07CisgIGludCByZXN1bHQgPSAwOworICBpZiAobG5hbWUgPT0gTlVMTCB8fCBsbmFtZVswXSA9PSAwKSB7CisgICAgKmxjaWQgPSBMT0NBTEVfVVNFUl9ERUZBVUxUOworICAgIHJldHVybiAwOworICB9CisKKyAgbWVtc2V0KGxhbmcsIDAsIE1BWF9MQU5HX0xFTiArIDEpOworICBtZW1zZXQoY3RyeSwgMCwgTUFYX0NUUllfTEVOICsgMSk7CisgIG1lbXNldChwYWdlLCAwLCBNQVhfQ1BfTEVOICsgMSk7CisgIGlmIChfX1BhcnNlTG9jYWxlU3RyaW5nKGxuYW1lLCBsYW5nLCBjdHJ5LCBwYWdlKSA9PSAtMSkgcmV0dXJuIC0xOworCisgIGlmIChoaW50ICE9IDApIHsKKyAgICAqbGNpZCA9IGhpbnQtPmlkOworICB9CisgIGVsc2UgeworICAgIGlmIChsYW5nWzBdID09IDAgJiYgY3RyeVswXSA9PSAwKQorICAgICAgKmxjaWQgPSBMT0NBTEVfVVNFUl9ERUZBVUxUOyAvKiBPbmx5IGNvZGUgcGFnZSBnaXZlbi4gKi8KKyAgICBlbHNlIHsKKyAgICAgIGlmIChjdHJ5WzBdID09IDApIHsKKyAgICAgICAgcmVzdWx0ID0gX19HZXRMQ0lEKF9fQ29udmVydE5hbWUobGFuZywgX19yZ19sYW5ndWFnZSwgc2l6ZW9mKF9fcmdfbGFuZ3VhZ2UpIC8gc2l6ZW9mKExPQ0FMRUNPTlYpKSwgTlVMTCwgbGNpZCk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gMCkgeworICAgICAgICAgIC8qIENoZWNrICdDJyBzcGVjaWFsIGNhc2UuIENoZWNrIGlzIGRvbmUgYWZ0ZXIgY2FsbCB0byBfX0dldExDSUQgYmVjYXVzZSBub3JtYWwgcHJvZ3JhbXMgZG8gbm90CisgICAgICAgICAgICogZ2VuZXJhdGUgZmFjZXQgZnJvbSAnQycgbmFtZSwgdGhleSB1c2UgdGhlIGxvY2FsZTo6Y2xhc3NpYygpIGZhY2V0cy4gKi8KKyAgICAgICAgICBpZiAobGFuZ1swXSA9PSAnQycgJiYgbGFuZ1sxXSA9PSAwKSB7CisgICAgICAgICAgICAqbGNpZCA9IElOVkFSSUFOVF9MQ0lEOworICAgICAgICAgICAgcmVzdWx0ID0gMDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICByZXN1bHQgPSBfX0dldExDSUQoX19Db252ZXJ0TmFtZShsYW5nLCBfX3JnX2xhbmd1YWdlLCBzaXplb2YoX19yZ19sYW5ndWFnZSkgLyBzaXplb2YoTE9DQUxFQ09OVikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX19Db252ZXJ0TmFtZShjdHJ5LCBfX3JnX2NvdW50cnksIHNpemVvZihfX3JnX2NvdW50cnkpIC8gc2l6ZW9mKExPQ0FMRUNPTlYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxjaWQpOworICAgICAgICBpZiAocmVzdWx0ICE9IDApIHsKKyAgICAgICAgICAvKiBOb24gTkxTIG1hcHBpbmcgbWlnaHQgaW50cm9kdWNlIHByb2JsZW0gd2l0aCBzb21lIGxvY2FsZXMgd2hlbiBvbmx5IG9uZSBlbnRyeSBpcyBtYXBwZWQsCisgICAgICAgICAgICogdGhlIGxhbmcgb3IgdGhlIGNvdW50cnkgKGV4YW1wbGU6IGNoaW5lc2UgbG9jYWxlcyBsaWtlICdjaGluZXNlX3RhaXdhbicgZ2l2ZXMgJ0NIU190YWl3YW4nCisgICAgICAgICAgICogdGhhdCBkbyBub3QgZXhpc3RzIGluIHN5c3RlbSkuIFRoaXMgaXMgd2h5IHdlIGFyZSBnaXZpbmcgdGhpcyBsb2NhbGUgYW4gb3RoZXIgY2hhbmNlIGJ5CisgICAgICAgICAgICogY2FsbGluZyBfX0dldExDSUQgd2l0aG91dCB0aGUgbWFwcGluZy4gKi8KKyAgICAgICAgICByZXN1bHQgPSBfX0dldExDSUQobGFuZywgY3RyeSwgbGNpZCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAocmVzdWx0ID09IDApIHsKKyAgICAvKiBIYW5kbGluZyBjb2RlIHBhZ2UgKi8KKyAgICBpZiAobHN0cmNtcGlBKHBhZ2UsICJBQ1AiKSA9PSAwIHx8IHBhZ2VbMF0gPT0gMCkKKyAgICAgIG15X2x0b2EoX19pbnRHZXRBQ1AoKmxjaWQpLCBjcCk7CisgICAgZWxzZSBpZiAobHN0cmNtcGlBKHBhZ2UsICJPQ1AiKSA9PSAwKQorICAgICAgbXlfbHRvYShfX2ludEdldE9DUCgqbGNpZCksIGNwKTsKKyAgICBlbHNlIGlmIChsc3RyY21waUEocGFnZSwgIlVURjciKSA9PSAwKQorICAgICAgbXlfbHRvYShDUF9VVEY3LCBjcCk7CisgICAgZWxzZSBpZiAobHN0cmNtcGlBKHBhZ2UsICJVVEY4IikgPT0gMCkKKyAgICAgIG15X2x0b2EoQ1BfVVRGOCwgY3ApOworICAgIGVsc2UKKyAgICAgIF9TVExQX1NUUk5DUFkoY3AsIE1BWF9DUF9MRU4gKyAxLCBwYWdlLCA1KTsKKworICAgIC8qIENvZGUgcGFnZSBtdXN0IGJlIGFuIGludGVnZXIgdmFsdWUsCisgICAgICogMCByZXR1cm5lZCBieSBfX2ludEdldEFDUCBhbmQgMSByZXR1cm5lZCBieSBfX2ludEdldE9DUCBhcmUgaW52YWxpZAorICAgICAqIHZhbHVlcy4KKyAgICAgKi8KKyAgICBpZiAoY3BbMV0gPT0gMCAmJiAoY3BbMF0gPT0gJzAnIHx8IGNwWzFdID09ICcxJykpCisgICAgICByZXR1cm4gLTE7CisgICAgZWxzZSBpZiAoYXRvaShjcCkgPT0gMCkKKyAgICAgIHJldHVybiAtMTsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKK2NoYXIgY29uc3QqIF9fR2V0TG9jYWxlTmFtZShMQ0lEIGxjaWQsIGNvbnN0IGNoYXIqIGNwLCBjaGFyKiBidWYpIHsKKyAgaWYgKGxjaWQgPT0gSU5WQVJJQU5UX0xDSUQpIHsKKyAgICByZXR1cm4gX0NfbmFtZTsKKyAgfQorICBlbHNlIHsKKyAgICBjaGFyIGxhbmdbTUFYX0xBTkdfTEVOICsgMV0sIGN0cnlbTUFYX0NUUllfTEVOICsgMV07CisgICAgR2V0TG9jYWxlSW5mb0EobGNpZCwgTE9DQUxFX1NFTkdMQU5HVUFHRSwgbGFuZywgTUFYX0xBTkdfTEVOKTsKKyAgICBHZXRMb2NhbGVJbmZvQShsY2lkLCBMT0NBTEVfU0VOR0NPVU5UUlksIGN0cnksIE1BWF9DVFJZX0xFTik7CisgICAgX1NUTFBfU1RSQ1BZKGJ1ZiwgX0xvY2FsZV9NQVhfU0lNUExFX05BTUUsIGxhbmcpOworICAgIF9TVExQX1NUUkNBVChidWYsIF9Mb2NhbGVfTUFYX1NJTVBMRV9OQU1FLCAiXyIpOworICAgIF9TVExQX1NUUkNBVChidWYsIF9Mb2NhbGVfTUFYX1NJTVBMRV9OQU1FLCBjdHJ5KTsKKyAgICBfU1RMUF9TVFJDQVQoYnVmLCBfTG9jYWxlX01BWF9TSU1QTEVfTkFNRSwgIi4iKTsKKyAgICBfU1RMUF9TVFJDQVQoYnVmLCBfTG9jYWxlX01BWF9TSU1QTEVfTkFNRSwgY3ApOworICAgIHJldHVybiBidWY7CisgIH0KK30KKworY2hhciBjb25zdCogX19FeHRyYWN0X2xvY2FsZV9uYW1lKGNvbnN0IGNoYXIqIGxvYywgY29uc3QgY2hhciogY2F0ZWdvcnksIGNoYXIqIGJ1ZikgeworICBjaGFyICpleHByOworICBzaXplX3QgbGVuX25hbWU7CisKKyAgaWYgKGxvY1swXSA9PSAnTCcgJiYgbG9jWzFdID09ICdDJyAmJiBsb2NbMl0gPT0gJ18nKSB7CisgICAgZXhwciA9IHN0cnN0cigoY2hhciopbG9jLCBjYXRlZ29yeSk7CisgICAgaWYgKGV4cHIgPT0gTlVMTCkgcmV0dXJuIE5VTEw7IC8qIENhdGVnb3J5IG5vdCBmb3VuZC4gKi8KKyAgICBleHByID0gc3RyY2hyKGV4cHIsICc9Jyk7CisgICAgaWYgKGV4cHIgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKytleHByOworICAgIGxlbl9uYW1lID0gc3RyY3NwbihleHByLCAiOyIpOworICAgIGxlbl9uYW1lID0gbGVuX25hbWUgPj0gX0xvY2FsZV9NQVhfU0lNUExFX05BTUUgPyBfTG9jYWxlX01BWF9TSU1QTEVfTkFNRSAtIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbGVuX25hbWU7CisgICAgX1NUTFBfU1RSTkNQWShidWYsIF9Mb2NhbGVfTUFYX1NJTVBMRV9OQU1FLCBleHByLCBsZW5fbmFtZSk7IGJ1ZltsZW5fbmFtZV0gPSAwOworICAgIHJldHVybiBidWY7CisgIH0KKyAgZWxzZSB7CisgICAgcmV0dXJuIGxvYzsKKyAgfQorfQorCitjaGFyIGNvbnN0KiBfX1RyYW5zbGF0ZVRvU3lzdGVtKGNvbnN0IGNoYXIqIGxuYW1lLCBjaGFyKiBidWYsIF9Mb2NhbGVfbGNpZF90KiBoaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKl9fZXJyX2NvZGUpIHsKKyAgTENJRCBsY2lkOworICBjaGFyIGNwW01BWF9DUF9MRU4gKyAxXTsKKyAgaWYgKF9fR2V0TENJREZyb21OYW1lKGxuYW1lLCAmbGNpZCwgY3AsIGhpbnQpICE9IDApCisgIHsgKl9fZXJyX2NvZGUgPSBfU1RMUF9MT0NfVU5LTk9XTl9OQU1FOyByZXR1cm4gTlVMTDsgfQorCisgIHJldHVybiBfX0dldExvY2FsZU5hbWUobGNpZCwgY3AsIGJ1Zik7Cit9CisKK3ZvaWQgX19HZXRMb2NhbGVJbmZvVXNpbmdBQ1AoTENJRCBsY2lkLCBjb25zdCBjaGFyKiBjcCwgTENUWVBFIGxjdHlwZSwgY2hhciogYnVmLCBpbnQgYnVmX3NpemUsIHdjaGFyX3QqIHdidWYsIGludCB3YnVmX3NpemUpIHsKKyAgd2NoYXJfdCAqQnVmZmVyOworICBpbnQgQnVmZmVyU2l6ZTsKKyAgaW50IGljcDsKKworICBHZXRMb2NhbGVJbmZvQShsY2lkLCBsY3R5cGUsIGJ1ZiwgYnVmX3NpemUpOworCisgIGljcCA9IGF0b2koY3ApOworICBpZiAoaWNwICE9IENQX0FDUCAmJiBidWZbMF0gIT0gMCkgeworICAgIEJ1ZmZlclNpemUgPSBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX0FDUCwgMCwgYnVmLCAtMSwgTlVMTCwgMCk7CisgICAgaWYgKEJ1ZmZlclNpemUgPiB3YnVmX3NpemUpCisgICAgeworICAgICAgQnVmZmVyID0gKHdjaGFyX3QqKW1hbGxvYyhzaXplb2Yod2NoYXJfdCkgKiBCdWZmZXJTaXplKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIEJ1ZmZlciA9IHdidWY7CisgICAgfQorICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQLCAwLCBidWYsIC0xLCBCdWZmZXIsIEJ1ZmZlclNpemUpOworICAgIFdpZGVDaGFyVG9NdWx0aUJ5dGUoaWNwLCAwLCBCdWZmZXIsIC0xLCBidWYsIGJ1Zl9zaXplLCBOVUxMLCBOVUxMKTsKKyAgICBpZiAoQnVmZmVyICE9IHdidWYpCisgICAgeworICAgICAgZnJlZShCdWZmZXIpOworICAgIH0KKyAgfQorfQorCisvKiBSZXR1cm4gMCBpZiBBTlNJIGNvZGUgcGFnZSBub3QgdXNlZCAqLworaW50IF9faW50R2V0QUNQKExDSUQgbGNpZCkgeworICBjaGFyIGNwWzZdOworICBpZiAoIUdldExvY2FsZUluZm9BKGxjaWQsIExPQ0FMRV9JREVGQVVMVEFOU0lDT0RFUEFHRSwgY3AsIDYpKSB7CisjaWYgZGVmaW5lZCAoX1NUTFBfTEFOR19JTlZBUklBTlRfREVGSU5FRCkKKyAgICBpZiAobGNpZCA9PSBJTlZBUklBTlRfTENJRCkgeworICAgICAgLyogV2UgYXJlIHVzaW5nIGEgbGltaXRlZCBQU0RLLCB3ZSByZWx5IG9uIHRoZSBtb3N0IGNvbW1vbiBjb2RlIHBhZ2UgKi8KKyAgICAgIHJldHVybiAxMjUyOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiAwOworICB9CisgIHJldHVybiBhdG9pKGNwKTsKK30KKworLyogUmV0dXJuIDEgaWYgT0VNIGNvZGUgcGFnZSBub3QgdXNlZCAqLworaW50IF9faW50R2V0T0NQKExDSUQgbGNpZCkgeworICBjaGFyIGNwWzZdOworICBpZiAoIUdldExvY2FsZUluZm9BKGxjaWQsIExPQ0FMRV9JREVGQVVMVENPREVQQUdFLCBjcCwgNikpCisgICAgcmV0dXJuIDA7CisgIHJldHVybiBhdG9pKGNwKTsKK30KKworaW50IF9fR2V0RGVmYXVsdENQKExDSUQgbGNpZCkgeworICBpbnQgY3AgPSBfX2ludEdldEFDUChsY2lkKTsKKyAgaWYgKGNwID09IDApIHJldHVybiBfX2ludEdldE9DUChsY2lkKTsKKyAgZWxzZSByZXR1cm4gY3A7Cit9CisKK3N0YXRpYyBpbnQgdHJpbV9zaXplX3RfdG9faW50KHNpemVfdCBuKSB7IHJldHVybiBuIDwgKHNpemVfdClJTlRfTUFYID8gKGludCluIDogSU5UX01BWDsgfQorCitjaGFyKiBfX0NvbnZlcnRUb0NQKGludCBmcm9tX2NwLCBpbnQgdG9fY3AsIGNvbnN0IGNoYXIgKmZyb20sIHNpemVfdCBzaXplLCBzaXplX3QgKnJldF9idWZfc2l6ZSkgeworICBzaXplX3Qgd2J1ZmZlcl9zaXplLCBidWZmZXJfc2l6ZSwgZnJvbV9vZmZzZXQsIHdidWZfb2Zmc2V0OworICBpbnQgZnJvbV9zaXplLCB0b19zaXplLCB3YnVmX3NpemU7CisgIHdjaGFyX3QgKndidWZmZXI7CisgIGNoYXIqIGJ1ZmZlcjsKKworICBzaXplX3Qgb3JpZ19zaXplID0gc2l6ZTsKKworICB3YnVmZmVyX3NpemUgPSAwOworICBmcm9tX29mZnNldCA9IDA7CisgIHdoaWxlIChzaXplID4gMCkgeworICAgIGZyb21fc2l6ZSA9IHRyaW1fc2l6ZV90X3RvX2ludChzaXplKTsKKyAgICB3YnVmZmVyX3NpemUgKz0gTXVsdGlCeXRlVG9XaWRlQ2hhcihmcm9tX2NwLCBNQl9QUkVDT01QT1NFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tICsgZnJvbV9vZmZzZXQsIGZyb21fc2l6ZSwgTlVMTCwgMCk7CisgICAgZnJvbV9vZmZzZXQgKz0gZnJvbV9zaXplOworICAgIHNpemUgLT0gZnJvbV9zaXplOworICB9CisKKyAgd2J1ZmZlciA9ICh3Y2hhcl90KiltYWxsb2Moc2l6ZW9mKHdjaGFyX3QpKndidWZmZXJfc2l6ZSk7CisKKyAgc2l6ZSA9IG9yaWdfc2l6ZTsKKyAgd2J1Zl9vZmZzZXQgPSAwOworICBmcm9tX29mZnNldCA9IDA7CisgIHdoaWxlIChzaXplID4gMCkgeworICAgIGZyb21fc2l6ZSA9IHRyaW1fc2l6ZV90X3RvX2ludChzaXplKTsKKyAgICB3YnVmX3NpemUgPSB0cmltX3NpemVfdF90b19pbnQod2J1ZmZlcl9zaXplIC0gd2J1Zl9vZmZzZXQpOworICAgIHdidWZfb2Zmc2V0ICs9IE11bHRpQnl0ZVRvV2lkZUNoYXIoZnJvbV9jcCwgTUJfUFJFQ09NUE9TRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tICsgZnJvbV9vZmZzZXQsIGZyb21fc2l6ZSwgd2J1ZmZlciArIHdidWZfb2Zmc2V0LCB3YnVmX3NpemUpOworICAgIGZyb21fb2Zmc2V0ICs9IGZyb21fc2l6ZTsKKyAgICBzaXplIC09IGZyb21fc2l6ZTsKKyAgfQorCisgIGJ1ZmZlcl9zaXplID0gMDsKKyAgd2J1Zl9vZmZzZXQgPSAwOworICBzaXplID0gd2J1ZmZlcl9zaXplOworICB3aGlsZSAoc2l6ZSA+IDApIHsKKyAgICB3YnVmX3NpemUgPSB0cmltX3NpemVfdF90b19pbnQoc2l6ZSk7CisgICAgYnVmZmVyX3NpemUgKz0gV2lkZUNoYXJUb011bHRpQnl0ZSh0b19jcCwgV0NfQ09NUE9TSVRFQ0hFQ0sgfCBXQ19TRVBDSEFSUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdidWZmZXIgKyB3YnVmX29mZnNldCwgd2J1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgTlVMTCwgRkFMU0UpOworICAgIHdidWZfb2Zmc2V0ICs9IHdidWZfc2l6ZTsKKyAgICBzaXplIC09IHdidWZfc2l6ZTsKKyAgfQorCisgIGJ1ZmZlciA9IChjaGFyKiltYWxsb2MoYnVmZmVyX3NpemUpOworICAqcmV0X2J1Zl9zaXplID0gYnVmZmVyX3NpemU7CisKKyAgc2l6ZSA9IHdidWZmZXJfc2l6ZTsKKyAgd2J1Zl9vZmZzZXQgPSAwOworICB3aGlsZSAoc2l6ZSA+IDApIHsKKyAgICB3YnVmX3NpemUgPSB0cmltX3NpemVfdF90b19pbnQoc2l6ZSk7CisgICAgdG9fc2l6ZSA9IHRyaW1fc2l6ZV90X3RvX2ludChidWZmZXJfc2l6ZSk7CisgICAgYnVmZmVyX3NpemUgLT0gV2lkZUNoYXJUb011bHRpQnl0ZSh0b19jcCwgV0NfQ09NUE9TSVRFQ0hFQ0sgfCBXQ19TRVBDSEFSUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdidWZmZXIgKyB3YnVmX29mZnNldCwgd2J1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCB0b19zaXplLCBOVUxMLCBGQUxTRSk7CisgICAgd2J1Zl9vZmZzZXQgKz0gd2J1Zl9zaXplOworICAgIHNpemUgLT0gd2J1Zl9zaXplOworICB9CisKKyAgZnJlZSh3YnVmZmVyKTsKKyAgcmV0dXJuIGJ1ZmZlcjsKK30KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9OT19XQ0hBUl9UCisjICBpbmNsdWRlICJjX3dsb2NhbGVfd2luMzIuYyIKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2NfbG9jYWxlX3dpbjMyL2Nfd2xvY2FsZV93aW4zMi5jIGIvc3JjL2NfbG9jYWxlX3dpbjMyL2Nfd2xvY2FsZV93aW4zMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMjY1OWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY19sb2NhbGVfd2luMzIvY193bG9jYWxlX3dpbjMyLmMKQEAgLTAsMCArMSwzMTQgQEAKKy8qDQorICogQ29weXJpZ2h0IChjKSAyMDA3IDIwMDgNCisgKiBGcmFuY29pcyBEdW1vbnQNCisgKg0KKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZA0KKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4NCisgKg0KKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQNCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuDQorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLA0KKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzDQorICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4NCisgKg0KKyAqLw0KKw0KKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfU0FGRV9TVFJJTkdfRlVOQ1RJT05TKQ0KKyMgIGRlZmluZSBfU1RMUF9XQ1NOQ1BZKEQsIERTLCBTLCBDKSB3Y3NuY3B5X3MoRCwgRFMsIFMsIEMpDQorI2Vsc2UNCisjICBkZWZpbmUgX1NUTFBfV0NTTkNQWShELCBEUywgUywgQykgd2NzbmNweShELCBTLCBDKQ0KKyNlbmRpZg0KKw0KK3N0YXRpYyBjb25zdCB3Y2hhcl90KiBfX3d0cnVlX25hbWUgPSBMInRydWUiOw0KK3N0YXRpYyBjb25zdCB3Y2hhcl90KiBfX3dmYWxzZV9uYW1lID0gTCJmYWxzZSI7DQorDQordHlwZWRlZiBzdHJ1Y3QgX0xvY2FsZV9jb2RlY3Z0IHsNCisgIF9Mb2NhbGVfbGNpZF90IGxjOw0KKyAgVUlOVCBjcDsNCisgIHVuc2lnbmVkIGNoYXIgY2xlYWRzWzI1NiAvIENIQVJfQklUXTsNCisgIHVuc2lnbmVkIGNoYXIgbWF4X2NoYXJfc2l6ZTsNCisgIERXT1JEIG1idG93Y19mbGFnczsNCisgIERXT1JEIHdjdG9tYl9mbGFnczsNCit9IF9Mb2NhbGVfY29kZWN2dF90Ow0KKw0KKy8qIEN0eXBlICovDQorX0xvY2FsZV9tYXNrX3QgX1dMb2NhbGVfY3R5cGUoX0xvY2FsZV9jdHlwZV90KiBsdHlwZSwgd2ludF90IGMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0xvY2FsZV9tYXNrX3Qgd2hpY2hfYml0cykgew0KKyAgd2NoYXJfdCBidWZbMl07DQorICBXT1JEIG91dFsyXTsNCisgIGJ1ZlswXSA9IGM7IGJ1ZlsxXSA9IDA7DQorICBHZXRTdHJpbmdUeXBlVyhDVF9DVFlQRTEsIGJ1ZiwgLTEsIG91dCk7DQorICBfU1RMUF9NQVJLX1BBUkFNRVRFUl9BU19VTlVTRUQobHR5cGUpDQorICByZXR1cm4gKF9Mb2NhbGVfbWFza190KShNYXBDdHlwZU1hc2sob3V0WzBdKSAmIHdoaWNoX2JpdHMpOw0KK30NCisNCit3aW50X3QgX1dMb2NhbGVfdG9sb3dlcihfTG9jYWxlX2N0eXBlX3QqIGx0eXBlLCB3aW50X3QgYykgew0KKyAgd2NoYXJfdCBpbl9jID0gYzsNCisgIHdjaGFyX3QgcmVzOw0KKw0KKyAgTENNYXBTdHJpbmdXKGx0eXBlLT5sYy5pZCwgTENNQVBfTE9XRVJDQVNFLCAmaW5fYywgMSwgJnJlcywgMSk7DQorICByZXR1cm4gcmVzOw0KK30NCisNCit3aW50X3QgX1dMb2NhbGVfdG91cHBlcihfTG9jYWxlX2N0eXBlX3QqIGx0eXBlLCB3aW50X3QgYykgew0KKyAgd2NoYXJfdCBpbl9jID0gYzsNCisgIHdjaGFyX3QgcmVzOw0KKw0KKyAgTENNYXBTdHJpbmdXKGx0eXBlLT5sYy5pZCwgTENNQVBfVVBQRVJDQVNFLCAmaW5fYywgMSwgJnJlcywgMSk7DQorICByZXR1cm4gcmVzOw0KK30NCisNCitfTG9jYWxlX2NvZGVjdnRfdCogX0xvY2FsZV9jb2RlY3Z0X2NyZWF0ZShjb25zdCBjaGFyICogbmFtZSwgX0xvY2FsZV9sY2lkX3QqIGxjX2hpbnQsIGludCAqX19lcnJfY29kZSkgew0KKyAgY2hhciBjcF9uYW1lW01BWF9DUF9MRU4gKyAxXTsNCisgIHVuc2lnbmVkIGNoYXIgKnB0cjsNCisgIENQSU5GTyBDUEluZm87DQorICBpbnQgaTsNCisNCisgIF9Mb2NhbGVfY29kZWN2dF90ICpsY29kZWN2dCA9IChfTG9jYWxlX2NvZGVjdnRfdCopbWFsbG9jKHNpemVvZihfTG9jYWxlX2NvZGVjdnRfdCkpOw0KKw0KKyAgaWYgKCFsY29kZWN2dCkgeyAqX19lcnJfY29kZSA9IF9TVExQX0xPQ19OT19NRU1PUlk7IHJldHVybiBsY29kZWN2dDsgfQ0KKyAgbWVtc2V0KGxjb2RlY3Z0LCAwLCBzaXplb2YoX0xvY2FsZV9jb2RlY3Z0X3QpKTsNCisNCisgIGlmIChfX0dldExDSURGcm9tTmFtZShuYW1lLCAmbGNvZGVjdnQtPmxjLmlkLCBjcF9uYW1lLCBsY19oaW50KSA9PSAtMSkNCisgIHsgZnJlZShsY29kZWN2dCk7ICpfX2Vycl9jb2RlID0gX1NUTFBfTE9DX1VOS05PV05fTkFNRTsgcmV0dXJuIE5VTEw7IH0NCisNCisgIGxjb2RlY3Z0LT5jcCA9IGF0b2koY3BfbmFtZSk7DQorICBpZiAoIUdldENQSW5mbyhsY29kZWN2dC0+Y3AsICZDUEluZm8pKSB7IGZyZWUobGNvZGVjdnQpOyByZXR1cm4gTlVMTDsgfQ0KKw0KKyAgaWYgKGxjb2RlY3Z0LT5jcCAhPSBDUF9VVEY3ICYmIGxjb2RlY3Z0LT5jcCAhPSBDUF9VVEY4KSB7DQorICAgIGxjb2RlY3Z0LT5tYnRvd2NfZmxhZ3MgPSBNQl9QUkVDT01QT1NFRDsNCisgICAgbGNvZGVjdnQtPndjdG9tYl9mbGFncyA9IFdDX0NPTVBPU0lURUNIRUNLIHwgV0NfU0VQQ0hBUlM7DQorICB9DQorICBsY29kZWN2dC0+bWF4X2NoYXJfc2l6ZSA9IENQSW5mby5NYXhDaGFyU2l6ZTsNCisNCisgIGlmIChDUEluZm8uTWF4Q2hhclNpemUgPiAxKSB7DQorICAgIGZvciAocHRyID0gKHVuc2lnbmVkIGNoYXIqKUNQSW5mby5MZWFkQnl0ZTsgKnB0ciAmJiAqKHB0ciArIDEpOyBwdHIgKz0gMikNCisgICAgICBmb3IgKGkgPSAqcHRyOyBpIDw9ICoocHRyICsgMSk7ICsraSkgbGNvZGVjdnQtPmNsZWFkc1tpIC8gQ0hBUl9CSVRdIHw9ICgweDAxIDw8IGkgJSBDSEFSX0JJVCk7DQorICB9DQorDQorICByZXR1cm4gbGNvZGVjdnQ7DQorfQ0KKw0KK2NoYXIgY29uc3QqIF9Mb2NhbGVfY29kZWN2dF9uYW1lKGNvbnN0IF9Mb2NhbGVfY29kZWN2dF90KiBsY29kZWN2dCwgY2hhciogYnVmKSB7DQorICBjaGFyIGNwX2J1ZltNQVhfQ1BfTEVOICsgMV07DQorICBteV9sdG9hKGxjb2RlY3Z0LT5jcCwgY3BfYnVmKTsNCisgIHJldHVybiBfX0dldExvY2FsZU5hbWUobGNvZGVjdnQtPmxjLmlkLCBjcF9idWYsIGJ1Zik7DQorfQ0KKw0KK3ZvaWQgX0xvY2FsZV9jb2RlY3Z0X2Rlc3Ryb3koX0xvY2FsZV9jb2RlY3Z0X3QqIGxjb2RlY3Z0KSB7DQorICBpZiAoIWxjb2RlY3Z0KSByZXR1cm47DQorDQorICBmcmVlKGxjb2RlY3Z0KTsNCit9DQorDQoraW50IF9XTG9jYWxlX21iX2N1cl9tYXggKF9Mb2NhbGVfY29kZWN2dF90ICogbGNvZGVjdnQpDQoreyByZXR1cm4gbGNvZGVjdnQtPm1heF9jaGFyX3NpemU7IH0NCisNCitpbnQgX1dMb2NhbGVfbWJfY3VyX21pbiAoX0xvY2FsZV9jb2RlY3Z0X3QgKmxjb2RlY3Z0KSB7DQorICBfU1RMUF9NQVJLX1BBUkFNRVRFUl9BU19VTlVTRUQobGNvZGVjdnQpDQorICByZXR1cm4gMTsNCit9DQorDQoraW50IF9XTG9jYWxlX2lzX3N0YXRlbGVzcyAoX0xvY2FsZV9jb2RlY3Z0X3QgKiBsY29kZWN2dCkNCit7IHJldHVybiAobGNvZGVjdnQtPm1heF9jaGFyX3NpemUgPT0gMSkgPyAxIDogMDsgfQ0KKw0KK3N0YXRpYyBpbnQgX19pc2xlYWRieXRlKGludCBpLCB1bnNpZ25lZCBjaGFyICpjdGFibGUpIHsNCisgIHVuc2lnbmVkIGNoYXIgYyA9ICh1bnNpZ25lZCBjaGFyKWk7DQorICByZXR1cm4gKGN0YWJsZVtjIC8gQ0hBUl9CSVRdICYgKDB4MDEgPDwgYyAlIENIQVJfQklUKSk7DQorfQ0KKw0KK3N0YXRpYyBpbnQgX19tYnRvd2MoX0xvY2FsZV9jb2RlY3Z0X3QgKmwsIHdjaGFyX3QgKmRzdCwgY29uc3QgY2hhciAqZnJvbSwgdW5zaWduZWQgaW50IGNvdW50KSB7DQorICBpbnQgcmVzdWx0Ow0KKw0KKyAgaWYgKGwtPmNwID09IENQX1VURjcgfHwgbC0+Y3AgPT0gQ1BfVVRGOCkgew0KKyAgICByZXN1bHQgPSBNdWx0aUJ5dGVUb1dpZGVDaGFyKGwtPmNwLCBsLT5tYnRvd2NfZmxhZ3MsIGZyb20sIGNvdW50LCBkc3QsIDEpOw0KKyAgICBpZiAocmVzdWx0ID09IDApIHsNCisgICAgICBzd2l0Y2ggKEdldExhc3RFcnJvcigpKSB7DQorICAgICAgICBjYXNlIEVSUk9SX05PX1VOSUNPREVfVFJBTlNMQVRJT046DQorICAgICAgICAgIHJldHVybiAtMjsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgIHJldHVybiAtMTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIGVsc2Ugew0KKyAgICBpZiAoY291bnQgPT0gMSAmJiBfX2lzbGVhZGJ5dGUoKmZyb20sIGwtPmNsZWFkcykpIHJldHVybiAoc2l6ZV90KS0yOw0KKyAgICByZXN1bHQgPSBNdWx0aUJ5dGVUb1dpZGVDaGFyKGwtPmNwLCBsLT5tYnRvd2NfZmxhZ3MsIGZyb20sIGNvdW50LCBkc3QsIDEpOw0KKyAgICBpZiAocmVzdWx0ID09IDApIHJldHVybiAtMTsNCisgIH0NCisNCisgIHJldHVybiByZXN1bHQ7DQorfQ0KKw0KK3NpemVfdCBfV0xvY2FsZV9tYnRvd2MoX0xvY2FsZV9jb2RlY3Z0X3QgKmxjb2RlY3Z0LCB3Y2hhcl90ICp0bywNCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZyb20sIHNpemVfdCBuLCBtYnN0YXRlX3QgKnNoaWZ0X3N0YXRlKSB7DQorICBpbnQgcmVzdWx0Ow0KKyAgX1NUTFBfTUFSS19QQVJBTUVURVJfQVNfVU5VU0VEKHNoaWZ0X3N0YXRlKQ0KKyAgaWYgKGxjb2RlY3Z0LT5tYXhfY2hhcl9zaXplID09IDEpIHsgLyogU2luZ2xlIGJ5dGUgZW5jb2RpbmcuICovDQorICAgIHJlc3VsdCA9IE11bHRpQnl0ZVRvV2lkZUNoYXIobGNvZGVjdnQtPmNwLCBsY29kZWN2dC0+bWJ0b3djX2ZsYWdzLCBmcm9tLCAxLCB0bywgMSk7DQorICAgIGlmIChyZXN1bHQgPT0gMCkgcmV0dXJuIChzaXplX3QpLTE7DQorICAgIHJldHVybiByZXN1bHQ7DQorICB9DQorICBlbHNlIHsgLyogTXVsdGkgYnl0ZSBlbmNvZGluZy4gKi8NCisgICAgaW50IHJldHZhbDsNCisgICAgdW5zaWduZWQgaW50IGNvdW50ID0gMTsNCisgICAgd2hpbGUgKG4tLSkgew0KKyAgICAgIHJldHZhbCA9IF9fbWJ0b3djKGxjb2RlY3Z0LCB0bywgZnJvbSwgY291bnQpOw0KKyAgICAgIGlmIChyZXR2YWwgPT0gLTIpDQorICAgICAgeyBpZiAoKytjb3VudCA+ICgodW5zaWduZWQgaW50KWxjb2RlY3Z0LT5tYXhfY2hhcl9zaXplKSkgcmV0dXJuIChzaXplX3QpLTE7IH0NCisgICAgICBlbHNlIGlmIChyZXR2YWwgPT0gLTEpDQorICAgICAgeyByZXR1cm4gKHNpemVfdCktMTsgfQ0KKyAgICAgIGVsc2UNCisgICAgICB7IHJldHVybiBjb3VudDsgfQ0KKyAgICB9DQorICAgIHJldHVybiAoc2l6ZV90KS0yOw0KKyAgfQ0KK30NCisNCitzaXplX3QgX1dMb2NhbGVfd2N0b21iKF9Mb2NhbGVfY29kZWN2dF90ICpsY29kZWN2dCwgY2hhciAqdG8sIHNpemVfdCBuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCBjLCBtYnN0YXRlX3QgKnNoaWZ0X3N0YXRlKSB7DQorICBpbnQgc2l6ZSA9IFdpZGVDaGFyVG9NdWx0aUJ5dGUobGNvZGVjdnQtPmNwLCBsY29kZWN2dC0+d2N0b21iX2ZsYWdzLCAmYywgMSwgTlVMTCwgMCwgTlVMTCwgTlVMTCk7DQorDQorICBpZiAoIXNpemUpIHJldHVybiAoc2l6ZV90KS0xOw0KKyAgaWYgKChzaXplX3Qpc2l6ZSA+IG4pIHJldHVybiAoc2l6ZV90KS0yOw0KKw0KKyAgaWYgKG4gPiBJTlRfTUFYKQ0KKyAgICAvKiBMaW1pdGluZyB0aGUgb3V0cHV0IGJ1ZiBzaXplIHRvIElOVF9NQVggc2VlbXMgbGlrZSByZWFzb25hYmxlIHRvIHRyYW5zZm9ybSBhIHNpbmdsZSB3Y2hhcl90LiAqLw0KKyAgICBuID0gSU5UX01BWDsNCisNCisgIFdpZGVDaGFyVG9NdWx0aUJ5dGUobGNvZGVjdnQtPmNwLCAgbGNvZGVjdnQtPndjdG9tYl9mbGFncywgJmMsIDEsIHRvLCAoaW50KW4sIE5VTEwsIE5VTEwpOw0KKw0KKyAgX1NUTFBfTUFSS19QQVJBTUVURVJfQVNfVU5VU0VEKHNoaWZ0X3N0YXRlKQ0KKyAgcmV0dXJuIChzaXplX3Qpc2l6ZTsNCit9DQorDQorc2l6ZV90IF9XTG9jYWxlX3Vuc2hpZnQoX0xvY2FsZV9jb2RlY3Z0X3QgKmxjb2RlY3Z0LCBtYnN0YXRlX3QgKnN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmJ1Ziwgc2l6ZV90IG4sIGNoYXIgKipuZXh0KSB7DQorICAvKiBfV0xvY2FsZV93Y3RvbWIgZG8gbm90IGV2ZW4gdG91Y2ggdG8gc3QsIHRoZXJlIGlzIG5vdGhpbmcgdG8gdW5zaGlmdCBpbiB0aGlzIGxvY2FsaXphdGlvbiBpbXBsZW1lbnRhdGlvbi4gKi8NCisgIF9TVExQX01BUktfUEFSQU1FVEVSX0FTX1VOVVNFRChsY29kZWN2dCkNCisgIF9TVExQX01BUktfUEFSQU1FVEVSX0FTX1VOVVNFRChzdCkNCisgIF9TVExQX01BUktfUEFSQU1FVEVSX0FTX1VOVVNFRCgmbikNCisgICpuZXh0ID0gYnVmOw0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KKy8qIENvbGxhdGUgKi8NCisvKiBUaGlzIGZ1bmN0aW9uIHRha2VzIGNhcmUgb2YgdGhlIHBvdGVudGlhbCBzaXplX3QgRFdPUkQgZGlmZmVyZW50IHNpemUuICovDQorc3RhdGljIGludCBfV0xvY2FsZV9zdHJjbXBfYXV4KF9Mb2NhbGVfY29sbGF0ZV90KiBsY29sLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBzMSwgc2l6ZV90IG4xLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBzMiwgc2l6ZV90IG4yKSB7DQorICBpbnQgcmVzdWx0ID0gQ1NUUl9FUVVBTDsNCisgIHdoaWxlIChuMSA+IDAgfHwgbjIgPiAwKSB7DQorICAgIERXT1JEIHNpemUxID0gdHJpbV9zaXplX3RfdG9fRFdPUkQobjEpOw0KKyAgICBEV09SRCBzaXplMiA9IHRyaW1fc2l6ZV90X3RvX0RXT1JEKG4yKTsNCisgICAgcmVzdWx0ID0gQ29tcGFyZVN0cmluZ1cobGNvbC0+bGMuaWQsIDAsIHMxLCBzaXplMSwgczIsIHNpemUyKTsNCisgICAgaWYgKHJlc3VsdCAhPSBDU1RSX0VRVUFMKQ0KKyAgICAgIGJyZWFrOw0KKyAgICBuMSAtPSBzaXplMTsNCisgICAgbjIgLT0gc2l6ZTI7DQorICB9DQorICByZXR1cm4gcmVzdWx0Ow0KK30NCisNCitpbnQgX1dMb2NhbGVfc3RyY21wKF9Mb2NhbGVfY29sbGF0ZV90KiBsY29sLA0KKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogczEsIHNpemVfdCBuMSwNCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHMyLCBzaXplX3QgbjIpIHsNCisgIGludCByZXN1bHQ7DQorICByZXN1bHQgPSBfV0xvY2FsZV9zdHJjbXBfYXV4KGxjb2wsIHMxLCBuMSwgczIsIG4yKTsNCisgIHJldHVybiAocmVzdWx0ID09IENTVFJfRVFVQUwpID8gMCA6IChyZXN1bHQgPT0gQ1NUUl9MRVNTX1RIQU4pID8gLTEgOiAxOw0KK30NCisNCitzaXplX3QgX1dMb2NhbGVfc3RyeGZybShfTG9jYWxlX2NvbGxhdGVfdCogbGNvbCwNCisgICAgICAgICAgICAgICAgICAgICAgICB3Y2hhcl90KiBkc3QsIHNpemVfdCBkc3Rfc2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBzcmMsIHNpemVfdCBzcmNfc2l6ZSkgew0KKyAgaW50IHJlc3VsdCwgaTsNCisNCisgIC8qIHNlZSBfTG9jYWxlX3N0cnhmcm06ICovDQorICBpZiAoc3JjX3NpemUgPiBJTlRfTUFYKSB7DQorICAgIGlmIChkc3QgIT0gMCkgew0KKyAgICAgIF9TVExQX1dDU05DUFkoZHN0LCBkc3Rfc2l6ZSwgc3JjLCBzcmNfc2l6ZSk7DQorICAgIH0NCisgICAgcmV0dXJuIHNyY19zaXplOw0KKyAgfQ0KKyAgaWYgKGRzdF9zaXplID4gSU5UX01BWCkgew0KKyAgICBkc3Rfc2l6ZSA9IElOVF9NQVg7DQorICB9DQorICByZXN1bHQgPSBMQ01hcFN0cmluZ1cobGNvbC0+bGMuaWQsIExDTUFQX1NPUlRLRVksIHNyYywgKGludClzcmNfc2l6ZSwgZHN0LCAoaW50KWRzdF9zaXplKTsNCisgIGlmIChyZXN1bHQgIT0gMCAmJiBkc3QgIT0gMCkgew0KKyAgICBmb3IgKGkgPSByZXN1bHQgLSAxOyBpID49IDA7IC0taSkgew0KKyAgICAgIGRzdFtpXSA9ICgodW5zaWduZWQgY2hhciopZHN0KVtpXTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIHJlc3VsdCAhPSAwID8gcmVzdWx0IC0gMSA6IDA7DQorfQ0KKw0KKy8qIE51bWVyaWMgKi8NCit3Y2hhcl90IF9XTG9jYWxlX2RlY2ltYWxfcG9pbnQoX0xvY2FsZV9udW1lcmljX3QqIGxudW0pIHsNCisgIHdjaGFyX3QgYnVmWzRdOw0KKyAgR2V0TG9jYWxlSW5mb1cobG51bS0+bGMuaWQsIExPQ0FMRV9TREVDSU1BTCwgYnVmLCA0KTsNCisgIHJldHVybiBidWZbMF07DQorfQ0KKw0KK3djaGFyX3QgX1dMb2NhbGVfdGhvdXNhbmRzX3NlcChfTG9jYWxlX251bWVyaWNfdCogbG51bSkgew0KKyAgd2NoYXJfdCBidWZbNF07DQorICBHZXRMb2NhbGVJbmZvVyhsbnVtLT5sYy5pZCwgTE9DQUxFX1NUSE9VU0FORCwgYnVmLCA0KTsNCisgIHJldHVybiBidWZbMF07DQorfQ0KKw0KK2NvbnN0IHdjaGFyX3QgKiBfV0xvY2FsZV90cnVlKF9Mb2NhbGVfbnVtZXJpY190KiBsbnVtLCB3Y2hhcl90KiBidWYsIHNpemVfdCBidWZTaXplKSB7DQorICBfU1RMUF9NQVJLX1BBUkFNRVRFUl9BU19VTlVTRUQobG51bSkNCisgIF9TVExQX01BUktfUEFSQU1FVEVSX0FTX1VOVVNFRChidWYpDQorICBfU1RMUF9NQVJLX1BBUkFNRVRFUl9BU19VTlVTRUQoJmJ1ZlNpemUpDQorICByZXR1cm4gX193dHJ1ZV9uYW1lOw0KK30NCisNCitjb25zdCB3Y2hhcl90ICogX1dMb2NhbGVfZmFsc2UoX0xvY2FsZV9udW1lcmljX3QqIGxudW0sIHdjaGFyX3QqIGJ1Ziwgc2l6ZV90IGJ1ZlNpemUpIHsNCisgIF9TVExQX01BUktfUEFSQU1FVEVSX0FTX1VOVVNFRChsbnVtKQ0KKyAgX1NUTFBfTUFSS19QQVJBTUVURVJfQVNfVU5VU0VEKGJ1ZikNCisgIF9TVExQX01BUktfUEFSQU1FVEVSX0FTX1VOVVNFRCgmYnVmU2l6ZSkNCisgIHJldHVybiBfX3dmYWxzZV9uYW1lOw0KK30NCisNCisvKiBNb25ldGFyeSAqLw0KK2NvbnN0IHdjaGFyX3QqIF9XTG9jYWxlX2ludF9jdXJyX3N5bWJvbChfTG9jYWxlX21vbmV0YXJ5X3QgKiBsbW9uLCB3Y2hhcl90KiBidWYsIHNpemVfdCBidWZTaXplKQ0KK3sgR2V0TG9jYWxlSW5mb1cobG1vbi0+bGMuaWQsIExPQ0FMRV9TSU5UTFNZTUJPTCwgYnVmLCAoaW50KWJ1ZlNpemUpOyByZXR1cm4gYnVmOyB9DQorDQorY29uc3Qgd2NoYXJfdCogX1dMb2NhbGVfY3VycmVuY3lfc3ltYm9sKF9Mb2NhbGVfbW9uZXRhcnlfdCAqIGxtb24sIHdjaGFyX3QqIGJ1Ziwgc2l6ZV90IGJ1ZlNpemUpDQoreyBHZXRMb2NhbGVJbmZvVyhsbW9uLT5sYy5pZCwgTE9DQUxFX1NDVVJSRU5DWSwgYnVmLCAoaW50KWJ1ZlNpemUpOyByZXR1cm4gYnVmOyB9DQorDQord2NoYXJfdCBfV0xvY2FsZV9tb25fZGVjaW1hbF9wb2ludChfTG9jYWxlX21vbmV0YXJ5X3QgKiBsbW9uKQ0KK3sgcmV0dXJuIGxtb24tPmRlY2ltYWxfcG9pbnRbMF07IH0NCisNCit3Y2hhcl90IF9XTG9jYWxlX21vbl90aG91c2FuZHNfc2VwKF9Mb2NhbGVfbW9uZXRhcnlfdCAqIGxtb24pDQoreyByZXR1cm4gbG1vbi0+dGhvdXNhbmRzX3NlcFswXTsgfQ0KKw0KK2NvbnN0IHdjaGFyX3QqIF9XTG9jYWxlX3Bvc2l0aXZlX3NpZ24oX0xvY2FsZV9tb25ldGFyeV90ICogbG1vbiwgd2NoYXJfdCogYnVmLCBzaXplX3QgYnVmU2l6ZSkNCit7IEdldExvY2FsZUluZm9XKGxtb24tPmxjLmlkLCBMT0NBTEVfU1BPU0lUSVZFU0lHTiwgYnVmLCAoaW50KWJ1ZlNpemUpOyByZXR1cm4gYnVmOyB9DQorDQorY29uc3Qgd2NoYXJfdCogX1dMb2NhbGVfbmVnYXRpdmVfc2lnbihfTG9jYWxlX21vbmV0YXJ5X3QgKiBsbW9uLCB3Y2hhcl90KiBidWYsIHNpemVfdCBidWZTaXplKQ0KK3sgR2V0TG9jYWxlSW5mb1cobG1vbi0+bGMuaWQsIExPQ0FMRV9TTkVHQVRJVkVTSUdOLCBidWYsIChpbnQpYnVmU2l6ZSk7IHJldHVybiBidWY7IH0NCisNCisvKiBUaW1lICovDQorY29uc3Qgd2NoYXJfdCAqIF9XTG9jYWxlX2Z1bGxfbW9udGhuYW1lKF9Mb2NhbGVfdGltZV90ICogbHRpbWUsIGludCBtb250aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2NoYXJfdCogYnVmLCBzaXplX3QgYnVmU2l6ZSkNCit7IEdldExvY2FsZUluZm9XKGx0aW1lLT5sYy5pZCwgTE9DQUxFX1NNT05USE5BTUUxICsgbW9udGgsIGJ1ZiwgKGludClidWZTaXplKTsgcmV0dXJuIGJ1ZjsgfQ0KKw0KK2NvbnN0IHdjaGFyX3QgKiBfV0xvY2FsZV9hYmJyZXZfbW9udGhuYW1lKF9Mb2NhbGVfdGltZV90ICogbHRpbWUsIGludCBtb250aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Y2hhcl90KiBidWYsIHNpemVfdCBidWZTaXplKQ0KK3sgR2V0TG9jYWxlSW5mb1cobHRpbWUtPmxjLmlkLCBMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEgKyBtb250aCwgYnVmLCAoaW50KWJ1ZlNpemUpOyByZXR1cm4gYnVmOyB9DQorDQorY29uc3Qgd2NoYXJfdCAqIF9XTG9jYWxlX2Z1bGxfZGF5b2Z3ZWVrKF9Mb2NhbGVfdGltZV90ICogbHRpbWUsIGludCBkYXksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdjaGFyX3QqIGJ1Ziwgc2l6ZV90IGJ1ZlNpemUpDQoreyBHZXRMb2NhbGVJbmZvVyhsdGltZS0+bGMuaWQsIExPQ0FMRV9TREFZTkFNRTEgKyBkYXksIGJ1ZiwgKGludClidWZTaXplKTsgcmV0dXJuIGJ1ZjsgfQ0KKw0KK2NvbnN0IHdjaGFyX3QgKiBfV0xvY2FsZV9hYmJyZXZfZGF5b2Z3ZWVrKF9Mb2NhbGVfdGltZV90ICogbHRpbWUsIGludCBkYXksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2NoYXJfdCogYnVmLCBzaXplX3QgYnVmU2l6ZSkNCit7IEdldExvY2FsZUluZm9XKGx0aW1lLT5sYy5pZCwgTE9DQUxFX1NBQkJSRVZEQVlOQU1FMSArIGRheSwgYnVmLCAoaW50KWJ1ZlNpemUpOyByZXR1cm4gYnVmOyB9DQorDQorY29uc3Qgd2NoYXJfdCogX1dMb2NhbGVfYW1fc3RyKF9Mb2NhbGVfdGltZV90KiBsdGltZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2NoYXJfdCogYnVmLCBzaXplX3QgYnVmU2l6ZSkNCit7IEdldExvY2FsZUluZm9XKGx0aW1lLT5sYy5pZCwgTE9DQUxFX1MxMTU5LCBidWYsIChpbnQpYnVmU2l6ZSk7IHJldHVybiBidWY7IH0NCisNCitjb25zdCB3Y2hhcl90KiBfV0xvY2FsZV9wbV9zdHIoX0xvY2FsZV90aW1lX3QqIGx0aW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Y2hhcl90KiBidWYsIHNpemVfdCBidWZTaXplKQ0KK3sgR2V0TG9jYWxlSW5mb1cobHRpbWUtPmxjLmlkLCBMT0NBTEVfUzIzNTksIGJ1ZiwgKGludClidWZTaXplKTsgcmV0dXJuIGJ1ZjsgfQ0KZGlmZiAtLWdpdCBhL3NyYy9jb2RlY3Z0LmNwcCBiL3NyYy9jb2RlY3Z0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTNhMjYyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvZGVjdnQuY3BwCkBAIC0wLDAgKzEsMTQzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworI2luY2x1ZGUgInN0bHBvcnRfcHJlZml4LmgiCisKKyNpbmNsdWRlIDxsb2NhbGU+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb2RlY3Z0PGNoYXIsIGNoYXIsIG1ic3RhdGVfdD4KKworY29kZWN2dDxjaGFyLCBjaGFyLCBtYnN0YXRlX3Q+Ojp+Y29kZWN2dCgpIHt9CisKK2ludCBjb2RlY3Z0PGNoYXIsIGNoYXIsIG1ic3RhdGVfdD46OmRvX2xlbmd0aChzdGF0ZV90eXBlJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgY2hhciogZnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgY2hhciogZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBteCkgY29uc3QKK3sgcmV0dXJuIChpbnQpKG1pbikgKCBfX1NUQVRJQ19DQVNUKHNpemVfdCwgKGVuZCAtIGZyb20pKSwgbXgpOyB9CisKK2ludCBjb2RlY3Z0PGNoYXIsIGNoYXIsIG1ic3RhdGVfdD46OmRvX21heF9sZW5ndGgoKSBjb25zdCBfU1RMUF9OT1RIUk9XCit7IHJldHVybiAxOyB9CisKK2Jvb2wKK2NvZGVjdnQ8Y2hhciwgY2hhciwgbWJzdGF0ZV90Pjo6ZG9fYWx3YXlzX25vY29udigpIGNvbnN0IF9TVExQX05PVEhST1cKK3sgcmV0dXJuIHRydWU7IH0KKworaW50Citjb2RlY3Z0PGNoYXIsIGNoYXIsIG1ic3RhdGVfdD46OmRvX2VuY29kaW5nKCkgY29uc3QgX1NUTFBfTk9USFJPVworeyByZXR1cm4gMTsgfQorCitjb2RlY3Z0X2Jhc2U6OnJlc3VsdAorY29kZWN2dDxjaGFyLCBjaGFyLCBtYnN0YXRlX3Q+Ojpkb191bnNoaWZ0KHN0YXRlX3R5cGUmIC8qIF9fc3RhdGUgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogICAgICAgX190bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiAgICAgICAvKiBfX3RvX2xpbWl0ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqJiAgICAgIF9fdG9fbmV4dCkgY29uc3QKK3sgX190b19uZXh0ID0gX190bzsgcmV0dXJuIG5vY29udjsgfQorCitjb2RlY3Z0X2Jhc2U6OnJlc3VsdAorY29kZWN2dDxjaGFyLCBjaGFyLCBtYnN0YXRlX3Q+Ojpkb19pbiAoc3RhdGVfdHlwZSYgIC8qIF9fc3RhdGUgKi8gLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIF9fZnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAvKiBfX2Zyb21fZW5kICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciomIF9fZnJvbV9uZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogICAgICAgIF9fdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiAgICAgICAgLyogX190b19lbmQgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiYgICAgICAgX190b19uZXh0KSBjb25zdAoreyBfX2Zyb21fbmV4dCA9IF9fZnJvbTsgX190b19uZXh0ICAgPSBfX3RvOyByZXR1cm4gbm9jb252OyB9CisKK2NvZGVjdnRfYmFzZTo6cmVzdWx0Citjb2RlY3Z0PGNoYXIsIGNoYXIsIG1ic3RhdGVfdD46OmRvX291dChzdGF0ZV90eXBlJiAgLyogX19zdGF0ZSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBfX2Zyb20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgLyogX19mcm9tX2VuZCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqJiBfX2Zyb21fbmV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqICAgICAgICBfX3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogICAgICAgIC8qIF9fdG9fbGltaXQgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiYgICAgICAgX190b19uZXh0KSBjb25zdAoreyBfX2Zyb21fbmV4dCA9IF9fZnJvbTsgX190b19uZXh0ICAgPSBfX3RvOyByZXR1cm4gbm9jb252OyB9CisKKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb2RlY3Z0PHdjaGFyX3QsIGNoYXIsIG1ic3RhdGVfdD4KKworY29kZWN2dDx3Y2hhcl90LCBjaGFyLCBtYnN0YXRlX3Q+Ojp+Y29kZWN2dCgpIHt9CisKKworY29kZWN2dDx3Y2hhcl90LCBjaGFyLCBtYnN0YXRlX3Q+OjpyZXN1bHQKK2NvZGVjdnQ8d2NoYXJfdCwgY2hhciwgbWJzdGF0ZV90Pjo6ZG9fb3V0KHN0YXRlX3R5cGUmICAgICAgICAgLyogc3RhdGUgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnRlcm5fdHlwZSogIGZyb20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnRlcm5fdHlwZSogIGZyb21fZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ZXJuX3R5cGUqJiBmcm9tX25leHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5fdHlwZSogICAgICAgIHRvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuX3R5cGUqICAgICAgICB0b19saW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybl90eXBlKiYgICAgICAgdG9fbmV4dCkgY29uc3QgeworICBwdHJkaWZmX3QgbGVuID0gKG1pbikgKGZyb21fZW5kIC0gZnJvbSwgdG9fbGltaXQgLSB0byk7CisgIGNvcHkoZnJvbSwgZnJvbSArIGxlbiwgdG8pOworICBmcm9tX25leHQgPSBmcm9tICsgbGVuOworICB0b19uZXh0ICAgPSB0byAgICsgbGVuOworICByZXR1cm4gb2s7Cit9CisKK2NvZGVjdnQ8d2NoYXJfdCwgY2hhciwgbWJzdGF0ZV90Pjo6cmVzdWx0Citjb2RlY3Z0PHdjaGFyX3QsIGNoYXIsIG1ic3RhdGVfdD46OmRvX2luIChzdGF0ZV90eXBlJiAgICAgICAvKiBzdGF0ZSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4dGVybl90eXBlKiAgZnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4dGVybl90eXBlKiAgZnJvbV9lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleHRlcm5fdHlwZSomIGZyb21fbmV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybl90eXBlKiAgICAgICAgdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5fdHlwZSogICAgICAgIHRvX2xpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuX3R5cGUqJiAgICAgICB0b19uZXh0KSBjb25zdCB7CisgIHB0cmRpZmZfdCBsZW4gPSAobWluKSAoZnJvbV9lbmQgLSBmcm9tLCB0b19saW1pdCAtIHRvKTsKKyAgY29weShfX1JFSU5URVJQUkVUX0NBU1QoY29uc3QgdW5zaWduZWQgY2hhciosIGZyb20pLAorICAgICAgIF9fUkVJTlRFUlBSRVRfQ0FTVChjb25zdCB1bnNpZ25lZCBjaGFyKiwgZnJvbSkgKyBsZW4sIHRvKTsKKyAgZnJvbV9uZXh0ID0gZnJvbSArIGxlbjsKKyAgdG9fbmV4dCAgID0gdG8gICArIGxlbjsKKyAgcmV0dXJuIG9rOworfQorCitjb2RlY3Z0PHdjaGFyX3QsIGNoYXIsIG1ic3RhdGVfdD46OnJlc3VsdAorY29kZWN2dDx3Y2hhcl90LCBjaGFyLCBtYnN0YXRlX3Q+Ojpkb191bnNoaWZ0KHN0YXRlX3R5cGUmICAgLyogc3RhdGUgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuX3R5cGUqICB0bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5fdHlwZSogICwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5fdHlwZSomIHRvX25leHQpIGNvbnN0IHsKKyAgdG9fbmV4dCA9IHRvOworICByZXR1cm4gbm9jb252OworfQorCitpbnQgY29kZWN2dDx3Y2hhcl90LCBjaGFyLCBtYnN0YXRlX3Q+Ojpkb19lbmNvZGluZygpIGNvbnN0IF9TVExQX05PVEhST1cKK3sgcmV0dXJuIDE7IH0KKworYm9vbCBjb2RlY3Z0PHdjaGFyX3QsIGNoYXIsIG1ic3RhdGVfdD46OmRvX2Fsd2F5c19ub2NvbnYoKSBjb25zdCBfU1RMUF9OT1RIUk9XCit7IHJldHVybiB0cnVlOyB9CisKK2ludCBjb2RlY3Z0PHdjaGFyX3QsIGNoYXIsIG1ic3RhdGVfdD46OmRvX2xlbmd0aChzdGF0ZV90eXBlJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgZXh0ZXJuX3R5cGUqIGZyb20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgIGV4dGVybl90eXBlKiBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG14KSBjb25zdAoreyByZXR1cm4gKGludCkobWluKSAoKHNpemVfdCkgKGVuZCAtIGZyb20pLCBteCk7IH0KKworaW50IGNvZGVjdnQ8d2NoYXJfdCwgY2hhciwgbWJzdGF0ZV90Pjo6ZG9fbWF4X2xlbmd0aCgpIGNvbnN0IF9TVExQX05PVEhST1cKK3sgcmV0dXJuIDE7IH0KKyNlbmRpZiAvKiB3Y2hhcl90ICovCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKKwpkaWZmIC0tZ2l0IGEvc3JjL2NvbGxhdGUuY3BwIGIvc3JjL2NvbGxhdGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNTU0MGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29sbGF0ZS5jcHAKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKyNpbmNsdWRlICJzdGxwb3J0X3ByZWZpeC5oIgorCisjaW5jbHVkZSA8bG9jYWxlPgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworLy8gY29sbGF0ZTxjaGFyPgorCitjb2xsYXRlPGNoYXI+Ojp+Y29sbGF0ZSgpIHt9CisKK2ludCBjb2xsYXRlPGNoYXI+Ojpkb19jb21wYXJlKGNvbnN0IGNoYXIqIGxvdzEsIGNvbnN0IGNoYXIqIGhpZ2gxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbG93MiwgY29uc3QgY2hhciogaGlnaDIpIGNvbnN0Cit7IHJldHVybiBfU1RMUF9QUklWIF9fbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmVfM3dheShsb3cxLCBoaWdoMSwgbG93MiwgaGlnaDIpOyB9CisKK3N0cmluZyBjb2xsYXRlPGNoYXI+Ojpkb190cmFuc2Zvcm0oY29uc3QgY2hhciogbG93LCBjb25zdCBjaGFyKiBoaWdoKSBjb25zdAoreyByZXR1cm4gc3RyaW5nKGxvdywgaGlnaCk7IH0KKworbG9uZyBjb2xsYXRlPGNoYXI+Ojpkb19oYXNoKGNvbnN0IGNoYXIqIGxvdywgY29uc3QgY2hhciogaGlnaCkgY29uc3QgeworICB1bnNpZ25lZCBsb25nIHJlc3VsdCA9IDA7CisgIGZvciAoIDsgbG93IDwgaGlnaDsgKytsb3cpCisgICAgcmVzdWx0ID0gNSAqIHJlc3VsdCArICpsb3c7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkKKy8vIGNvbGxhdGU8d2NoYXJfdD4KKworY29sbGF0ZTx3Y2hhcl90Pjo6fmNvbGxhdGUoKSB7fQorCitpbnQKK2NvbGxhdGU8d2NoYXJfdD46OmRvX2NvbXBhcmUoY29uc3Qgd2NoYXJfdCogbG93MSwgY29uc3Qgd2NoYXJfdCogaGlnaDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIGxvdzIsIGNvbnN0IHdjaGFyX3QqIGhpZ2gyKSBjb25zdAoreyByZXR1cm4gX1NUTFBfUFJJViBfX2xleGljb2dyYXBoaWNhbF9jb21wYXJlXzN3YXkobG93MSwgaGlnaDEsIGxvdzIsIGhpZ2gyKTsgfQorCit3c3RyaW5nIGNvbGxhdGU8d2NoYXJfdD46OmRvX3RyYW5zZm9ybShjb25zdCB3Y2hhcl90KiBsb3csIGNvbnN0IHdjaGFyX3QqIGhpZ2gpIGNvbnN0Cit7IHJldHVybiB3c3RyaW5nKGxvdywgaGlnaCk7IH0KKworbG9uZyBjb2xsYXRlPHdjaGFyX3Q+Ojpkb19oYXNoKGNvbnN0IHdjaGFyX3QqIGxvdywgY29uc3Qgd2NoYXJfdCogaGlnaCkgY29uc3QgeworICB1bnNpZ25lZCBsb25nIHJlc3VsdCA9IDA7CisgIGZvciAoIDsgbG93IDwgaGlnaDsgKytsb3cpCisgICAgcmVzdWx0ID0gNSAqIHJlc3VsdCArICpsb3c7CisgIHJldHVybiByZXN1bHQ7Cit9CisjZW5kaWYKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CisKZGlmZiAtLWdpdCBhL3NyYy9jb21wbGV4LmNwcCBiL3NyYy9jb21wbGV4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGYzMTBjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvbXBsZXguY3BwCkBAIC0wLDAgKzEsMzQ3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaW5jbHVkZSAic3RscG9ydF9wcmVmaXguaCIKKworI2luY2x1ZGUgPG51bWVyaWM+CisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8Y29tcGxleD4KKworI2lmIGRlZmluZWQgKF9TVExQX01TVkNfTElCKSAmJiAoX1NUTFBfTVNWQ19MSUIgPj0gMTQwMCkKKy8vIGh5cG90IGlzIGRlcHJlY2F0ZWQuCisjICBpZiBkZWZpbmVkIChfU1RMUF9NU1ZDKQorIyAgICBwcmFnbWEgd2FybmluZyAoZGlzYWJsZSA6IDQ5OTYpCisjICBlbGlmIGRlZmluZWQgKF9fSUNMKQorIyAgICBwcmFnbWEgd2FybmluZyAoZGlzYWJsZSA6IDE0NzgpCisjICBlbmRpZgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisvLyBDb21wbGV4IGRpdmlzaW9uIGFuZCBzcXVhcmUgcm9vdHMuCisKKy8vIEFic29sdXRlIHZhbHVlCitfU1RMUF9URU1QTEFURV9OVUxMCitfU1RMUF9ERUNMU1BFQyBmbG9hdCBfU1RMUF9DQUxMIGFicyhjb25zdCBjb21wbGV4PGZsb2F0PiYgX196KQoreyByZXR1cm4gOjpoeXBvdChfX3ouX01fcmUsIF9fei5fTV9pbSk7IH0KK19TVExQX1RFTVBMQVRFX05VTEwKK19TVExQX0RFQ0xTUEVDIGRvdWJsZSBfU1RMUF9DQUxMIGFicyhjb25zdCBjb21wbGV4PGRvdWJsZT4mIF9feikKK3sgcmV0dXJuIDo6aHlwb3QoX196Ll9NX3JlLCBfX3ouX01faW0pOyB9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTE9OR19ET1VCTEUpCitfU1RMUF9URU1QTEFURV9OVUxMCitfU1RMUF9ERUNMU1BFQyBsb25nIGRvdWJsZSBfU1RMUF9DQUxMIGFicyhjb25zdCBjb21wbGV4PGxvbmcgZG91YmxlPiYgX196KQoreyByZXR1cm4gOjpoeXBvdChfX3ouX01fcmUsIF9fei5fTV9pbSk7IH0KKyNlbmRpZgorCisvLyBQaGFzZQorCitfU1RMUF9URU1QTEFURV9OVUxMCitfU1RMUF9ERUNMU1BFQyBmbG9hdCBfU1RMUF9DQUxMIGFyZyhjb25zdCBjb21wbGV4PGZsb2F0PiYgX196KQoreyByZXR1cm4gOjphdGFuMihfX3ouX01faW0sIF9fei5fTV9yZSk7IH0KKworX1NUTFBfVEVNUExBVEVfTlVMTAorX1NUTFBfREVDTFNQRUMgZG91YmxlIF9TVExQX0NBTEwgYXJnKGNvbnN0IGNvbXBsZXg8ZG91YmxlPiYgX196KQoreyByZXR1cm4gOjphdGFuMihfX3ouX01faW0sIF9fei5fTV9yZSk7IH0KKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19MT05HX0RPVUJMRSkKK19TVExQX1RFTVBMQVRFX05VTEwKK19TVExQX0RFQ0xTUEVDIGxvbmcgZG91YmxlIF9TVExQX0NBTEwgYXJnKGNvbnN0IGNvbXBsZXg8bG9uZyBkb3VibGU+JiBfX3opCit7IHJldHVybiA6OmF0YW4yKF9fei5fTV9pbSwgX196Ll9NX3JlKTsgfQorI2VuZGlmCisKKy8vIENvbnN0cnVjdCBhIGNvbXBsZXggbnVtYmVyIGZyb20gcG9sYXIgcmVwcmVzZW50YXRpb24KK19TVExQX1RFTVBMQVRFX05VTEwKK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8ZmxvYXQ+IF9TVExQX0NBTEwgcG9sYXIoY29uc3QgZmxvYXQmIF9fcmhvLCBjb25zdCBmbG9hdCYgX19waGkpCit7IHJldHVybiBjb21wbGV4PGZsb2F0PihfX3JobyAqIDo6Y29zKF9fcGhpKSwgX19yaG8gKiA6OnNpbihfX3BoaSkpOyB9CitfU1RMUF9URU1QTEFURV9OVUxMCitfU1RMUF9ERUNMU1BFQyBjb21wbGV4PGRvdWJsZT4gX1NUTFBfQ0FMTCBwb2xhcihjb25zdCBkb3VibGUmIF9fcmhvLCBjb25zdCBkb3VibGUmIF9fcGhpKQoreyByZXR1cm4gY29tcGxleDxkb3VibGU+KF9fcmhvICogOjpjb3MoX19waGkpLCBfX3JobyAqIDo6c2luKF9fcGhpKSk7IH0KKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19MT05HX0RPVUJMRSkKK19TVExQX1RFTVBMQVRFX05VTEwKK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8bG9uZyBkb3VibGU+IF9TVExQX0NBTEwgcG9sYXIoY29uc3QgbG9uZyBkb3VibGUmIF9fcmhvLCBjb25zdCBsb25nIGRvdWJsZSYgX19waGkpCit7IHJldHVybiBjb21wbGV4PGxvbmcgZG91YmxlPihfX3JobyAqIDo6Y29zKF9fcGhpKSwgX19yaG8gKiA6OnNpbihfX3BoaSkpOyB9CisjZW5kaWYKKworLy8gRGl2aXNpb24KK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdGF0aWMgdm9pZCBfZGl2VChjb25zdCBfVHAmIF9fejFfciwgY29uc3QgX1RwJiBfX3oxX2ksCisgICAgICAgICAgICAgICAgICBjb25zdCBfVHAmIF9fejJfciwgY29uc3QgX1RwJiBfX3oyX2ksCisgICAgICAgICAgICAgICAgICBfVHAmIF9fcmVzX3IsIF9UcCYgX19yZXNfaSkgeworICBfVHAgX19hciA9IF9fejJfciA+PSAwID8gX196Ml9yIDogLV9fejJfcjsKKyAgX1RwIF9fYWkgPSBfX3oyX2kgPj0gMCA/IF9fejJfaSA6IC1fX3oyX2k7CisKKyAgaWYgKF9fYXIgPD0gX19haSkgeworICAgIF9UcCBfX3JhdGlvID0gX196Ml9yIC8gX196Ml9pOworICAgIF9UcCBfX2Rlbm9tID0gX196Ml9pICogKDEgKyBfX3JhdGlvICogX19yYXRpbyk7CisgICAgX19yZXNfciA9IChfX3oxX3IgKiBfX3JhdGlvICsgX196MV9pKSAvIF9fZGVub207CisgICAgX19yZXNfaSA9IChfX3oxX2kgKiBfX3JhdGlvIC0gX196MV9yKSAvIF9fZGVub207CisgIH0KKyAgZWxzZSB7CisgICAgX1RwIF9fcmF0aW8gPSBfX3oyX2kgLyBfX3oyX3I7CisgICAgX1RwIF9fZGVub20gPSBfX3oyX3IgKiAoMSArIF9fcmF0aW8gKiBfX3JhdGlvKTsKKyAgICBfX3Jlc19yID0gKF9fejFfciArIF9fejFfaSAqIF9fcmF0aW8pIC8gX19kZW5vbTsKKyAgICBfX3Jlc19pID0gKF9fejFfaSAtIF9fejFfciAqIF9fcmF0aW8pIC8gX19kZW5vbTsKKyAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RhdGljIHZvaWQgX2RpdlQoY29uc3QgX1RwJiBfX3oxX3IsCisgICAgICAgICAgICAgICAgICBjb25zdCBfVHAmIF9fejJfciwgY29uc3QgX1RwJiBfX3oyX2ksCisgICAgICAgICAgICAgICAgICBfVHAmIF9fcmVzX3IsIF9UcCYgX19yZXNfaSkgeworICBfVHAgX19hciA9IF9fejJfciA+PSAwID8gX196Ml9yIDogLV9fejJfcjsKKyAgX1RwIF9fYWkgPSBfX3oyX2kgPj0gMCA/IF9fejJfaSA6IC1fX3oyX2k7CisKKyAgaWYgKF9fYXIgPD0gX19haSkgeworICAgIF9UcCBfX3JhdGlvID0gX196Ml9yIC8gX196Ml9pOworICAgIF9UcCBfX2Rlbm9tID0gX196Ml9pICogKDEgKyBfX3JhdGlvICogX19yYXRpbyk7CisgICAgX19yZXNfciA9IChfX3oxX3IgKiBfX3JhdGlvKSAvIF9fZGVub207CisgICAgX19yZXNfaSA9IC0gX196MV9yIC8gX19kZW5vbTsKKyAgfQorICBlbHNlIHsKKyAgICBfVHAgX19yYXRpbyA9IF9fejJfaSAvIF9fejJfcjsKKyAgICBfVHAgX19kZW5vbSA9IF9fejJfciAqICgxICsgX19yYXRpbyAqIF9fcmF0aW8pOworICAgIF9fcmVzX3IgPSBfX3oxX3IgLyBfX2Rlbm9tOworICAgIF9fcmVzX2kgPSAtIChfX3oxX3IgKiBfX3JhdGlvKSAvIF9fZGVub207CisgIH0KK30KKwordm9pZCBfU1RMUF9DQUxMCitjb21wbGV4PGZsb2F0Pjo6X2Rpdihjb25zdCBmbG9hdCYgX196MV9yLCBjb25zdCBmbG9hdCYgX196MV9pLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQmIF9fejJfciwgY29uc3QgZmxvYXQmIF9fejJfaSwKKyAgICAgICAgICAgICAgICAgICAgIGZsb2F0JiBfX3Jlc19yLCBmbG9hdCYgX19yZXNfaSkKK3sgX2RpdlQoX196MV9yLCBfX3oxX2ksIF9fejJfciwgX196Ml9pLCBfX3Jlc19yLCBfX3Jlc19pKTsgfQorCit2b2lkIF9TVExQX0NBTEwKK2NvbXBsZXg8ZmxvYXQ+OjpfZGl2KGNvbnN0IGZsb2F0JiBfX3oxX3IsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCYgX196Ml9yLCBjb25zdCBmbG9hdCYgX196Ml9pLAorICAgICAgICAgICAgICAgICAgICAgZmxvYXQmIF9fcmVzX3IsIGZsb2F0JiBfX3Jlc19pKQoreyBfZGl2VChfX3oxX3IsIF9fejJfciwgX196Ml9pLCBfX3Jlc19yLCBfX3Jlc19pKTsgfQorCisKK3ZvaWQgIF9TVExQX0NBTEwKK2NvbXBsZXg8ZG91YmxlPjo6X2Rpdihjb25zdCBkb3VibGUmIF9fejFfciwgY29uc3QgZG91YmxlJiBfX3oxX2ksCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlJiBfX3oyX3IsIGNvbnN0IGRvdWJsZSYgX196Ml9pLAorICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSYgX19yZXNfciwgZG91YmxlJiBfX3Jlc19pKQoreyBfZGl2VChfX3oxX3IsIF9fejFfaSwgX196Ml9yLCBfX3oyX2ksIF9fcmVzX3IsIF9fcmVzX2kpOyB9CisKK3ZvaWQgX1NUTFBfQ0FMTAorY29tcGxleDxkb3VibGU+OjpfZGl2KGNvbnN0IGRvdWJsZSYgX196MV9yLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSYgX196Ml9yLCBjb25zdCBkb3VibGUmIF9fejJfaSwKKyAgICAgICAgICAgICAgICAgICAgICBkb3VibGUmIF9fcmVzX3IsIGRvdWJsZSYgX19yZXNfaSkKK3sgX2RpdlQoX196MV9yLCBfX3oyX3IsIF9fejJfaSwgX19yZXNfciwgX19yZXNfaSk7IH0KKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19MT05HX0RPVUJMRSkKK3ZvaWQgIF9TVExQX0NBTEwKK2NvbXBsZXg8bG9uZyBkb3VibGU+OjpfZGl2KGNvbnN0IGxvbmcgZG91YmxlJiBfX3oxX3IsIGNvbnN0IGxvbmcgZG91YmxlJiBfX3oxX2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb25nIGRvdWJsZSYgX196Ml9yLCBjb25zdCBsb25nIGRvdWJsZSYgX196Ml9pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBkb3VibGUmIF9fcmVzX3IsIGxvbmcgZG91YmxlJiBfX3Jlc19pKQoreyBfZGl2VChfX3oxX3IsIF9fejFfaSwgX196Ml9yLCBfX3oyX2ksIF9fcmVzX3IsIF9fcmVzX2kpOyB9CisKK3ZvaWQgX1NUTFBfQ0FMTAorY29tcGxleDxsb25nIGRvdWJsZT46Ol9kaXYoY29uc3QgbG9uZyBkb3VibGUmIF9fejFfciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvbmcgZG91YmxlJiBfX3oyX3IsIGNvbnN0IGxvbmcgZG91YmxlJiBfX3oyX2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGRvdWJsZSYgX19yZXNfciwgbG9uZyBkb3VibGUmIF9fcmVzX2kpCit7IF9kaXZUKF9fejFfciwgX196Ml9yLCBfX3oyX2ksIF9fcmVzX3IsIF9fcmVzX2kpOyB9CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTcXVhcmUgcm9vdAordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0YXRpYyBjb21wbGV4PF9UcD4gc3FydFQoY29uc3QgY29tcGxleDxfVHA+JiB6KSB7CisgIF9UcCByZSA9IHouX01fcmU7CisgIF9UcCBpbSA9IHouX01faW07CisgIF9UcCBtYWcgPSA6Omh5cG90KHJlLCBpbSk7CisgIGNvbXBsZXg8X1RwPiByZXN1bHQ7CisKKyAgaWYgKG1hZyA9PSAwLmYpIHsKKyAgICByZXN1bHQuX01fcmUgPSByZXN1bHQuX01faW0gPSAwLmY7CisgIH0gZWxzZSBpZiAocmUgPiAwLmYpIHsKKyAgICByZXN1bHQuX01fcmUgPSA6OnNxcnQoMC41ZiAqIChtYWcgKyByZSkpOworICAgIHJlc3VsdC5fTV9pbSA9IGltL3Jlc3VsdC5fTV9yZS8yLmY7CisgIH0gZWxzZSB7CisgICAgcmVzdWx0Ll9NX2ltID0gOjpzcXJ0KDAuNWYgKiAobWFnIC0gcmUpKTsKKyAgICBpZiAoaW0gPCAwLmYpCisgICAgICByZXN1bHQuX01faW0gPSAtIHJlc3VsdC5fTV9pbTsKKyAgICByZXN1bHQuX01fcmUgPSBpbS9yZXN1bHQuX01faW0vMi5mOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK2NvbXBsZXg8ZmxvYXQ+IF9TVExQX0NBTEwKK3NxcnQoY29uc3QgY29tcGxleDxmbG9hdD4mIHopIHsgcmV0dXJuIHNxcnRUKHopOyB9CisKK2NvbXBsZXg8ZG91YmxlPiAgX1NUTFBfQ0FMTAorc3FydChjb25zdCBjb21wbGV4PGRvdWJsZT4mIHopIHsgcmV0dXJuIHNxcnRUKHopOyB9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTE9OR19ET1VCTEUpCitjb21wbGV4PGxvbmcgZG91YmxlPiBfU1RMUF9DQUxMCitzcXJ0KGNvbnN0IGNvbXBsZXg8bG9uZyBkb3VibGU+JiB6KSB7IHJldHVybiBzcXJ0VCh6KTsgfQorI2VuZGlmCisKKy8vIGV4cCwgbG9nLCBwb3cgZm9yIGNvbXBsZXg8ZmxvYXQ+LCBjb21wbGV4PGRvdWJsZT4sIGFuZCBjb21wbGV4PGxvbmcgZG91YmxlPgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBleHAKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdGF0aWMgY29tcGxleDxfVHA+IGV4cFQoY29uc3QgY29tcGxleDxfVHA+JiB6KSB7CisgIF9UcCBleHB4ID0gOjpleHAoei5fTV9yZSk7CisgIHJldHVybiBjb21wbGV4PF9UcD4oZXhweCAqIDo6Y29zKHouX01faW0pLAorICAgICAgICAgICAgICAgICAgICAgIGV4cHggKiA6OnNpbih6Ll9NX2ltKSk7Cit9CitfU1RMUF9ERUNMU1BFQyBjb21wbGV4PGZsb2F0PiAgX1NUTFBfQ0FMTCBleHAoY29uc3QgY29tcGxleDxmbG9hdD4mIHopCit7IHJldHVybiBleHBUKHopOyB9CisKK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8ZG91YmxlPiBfU1RMUF9DQUxMIGV4cChjb25zdCBjb21wbGV4PGRvdWJsZT4mIHopCit7IHJldHVybiBleHBUKHopOyB9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTE9OR19ET1VCTEUpCitfU1RMUF9ERUNMU1BFQyBjb21wbGV4PGxvbmcgZG91YmxlPiBfU1RMUF9DQUxMIGV4cChjb25zdCBjb21wbGV4PGxvbmcgZG91YmxlPiYgeikKK3sgcmV0dXJuIGV4cFQoeik7IH0KKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvZzEwCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RhdGljIGNvbXBsZXg8X1RwPiBsb2cxMFQoY29uc3QgY29tcGxleDxfVHA+JiB6LCBjb25zdCBfVHAmIGxuMTBfaW52KSB7CisgIGNvbXBsZXg8X1RwPiByOworCisgIHIuX01faW0gPSA6OmF0YW4yKHouX01faW0sIHouX01fcmUpICogbG4xMF9pbnY7CisgIHIuX01fcmUgPSA6OmxvZzEwKDo6aHlwb3Qoei5fTV9yZSwgei5fTV9pbSkpOworICByZXR1cm4gcjsKK30KKworc3RhdGljIGNvbnN0IGZsb2F0IExOMTBfSU5WRiA9IDEuZiAvIDo6bG9nKDEwLmYpOworX1NUTFBfREVDTFNQRUMgY29tcGxleDxmbG9hdD4gX1NUTFBfQ0FMTCBsb2cxMChjb25zdCBjb21wbGV4PGZsb2F0PiYgeikKK3sgcmV0dXJuIGxvZzEwVCh6LCBMTjEwX0lOVkYpOyB9CisKK3N0YXRpYyBjb25zdCBkb3VibGUgTE4xMF9JTlYgPSAxLiAvIDo6bG9nMTAoMTAuKTsKK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8ZG91YmxlPiBfU1RMUF9DQUxMIGxvZzEwKGNvbnN0IGNvbXBsZXg8ZG91YmxlPiYgeikKK3sgcmV0dXJuIGxvZzEwVCh6LCBMTjEwX0lOVik7IH0KKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19MT05HX0RPVUJMRSkKK3N0YXRpYyBjb25zdCBsb25nIGRvdWJsZSBMTjEwX0lOVkwgPSAxLmwgLyA6OmxvZygxMC5sKTsKK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8bG9uZyBkb3VibGU+IF9TVExQX0NBTEwgbG9nMTAoY29uc3QgY29tcGxleDxsb25nIGRvdWJsZT4mIHopCit7IHJldHVybiBsb2cxMFQoeiwgTE4xMF9JTlZMKTsgfQorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9nCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RhdGljIGNvbXBsZXg8X1RwPiBsb2dUKGNvbnN0IGNvbXBsZXg8X1RwPiYgeikgeworICBjb21wbGV4PF9UcD4gcjsKKworICByLl9NX2ltID0gOjphdGFuMih6Ll9NX2ltLCB6Ll9NX3JlKTsKKyAgci5fTV9yZSA9IDo6bG9nKDo6aHlwb3Qoei5fTV9yZSwgei5fTV9pbSkpOworICByZXR1cm4gcjsKK30KK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8ZmxvYXQ+IF9TVExQX0NBTEwgbG9nKGNvbnN0IGNvbXBsZXg8ZmxvYXQ+JiB6KQoreyByZXR1cm4gbG9nVCh6KTsgfQorCitfU1RMUF9ERUNMU1BFQyBjb21wbGV4PGRvdWJsZT4gX1NUTFBfQ0FMTCBsb2coY29uc3QgY29tcGxleDxkb3VibGU+JiB6KQoreyByZXR1cm4gbG9nVCh6KTsgfQorCisjaWZuZGVmIF9TVExQX05PX0xPTkdfRE9VQkxFCitfU1RMUF9ERUNMU1BFQyBjb21wbGV4PGxvbmcgZG91YmxlPiBfU1RMUF9DQUxMIGxvZyhjb25zdCBjb21wbGV4PGxvbmcgZG91YmxlPiYgeikKK3sgcmV0dXJuIGxvZ1Qoeik7IH0KKyMgZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBwb3cKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdGF0aWMgY29tcGxleDxfVHA+IHBvd1QoY29uc3QgX1RwJiBhLCBjb25zdCBjb21wbGV4PF9UcD4mIGIpIHsKKyAgX1RwIGxvZ3IgPSA6OmxvZyhhKTsKKyAgX1RwIHggPSA6OmV4cChsb2dyICogYi5fTV9yZSk7CisgIF9UcCB5ID0gbG9nciAqIGIuX01faW07CisKKyAgcmV0dXJuIGNvbXBsZXg8X1RwPih4ICogOjpjb3MoeSksIHggKiA6OnNpbih5KSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdGF0aWMgY29tcGxleDxfVHA+IHBvd1QoY29uc3QgY29tcGxleDxfVHA+JiB6X2luLCBpbnQgbikgeworICBjb21wbGV4PF9UcD4geiA9IHpfaW47CisgIHogPSBfU1RMUF9QUklWIF9fcG93ZXIoeiwgKG4gPCAwID8gLW4gOiBuKSwgbXVsdGlwbGllczwgY29tcGxleDxfVHA+ID4oKSk7CisgIGlmIChuIDwgMCkKKyAgICByZXR1cm4gX1RwKDEuMCkgLyB6OworICBlbHNlCisgICAgcmV0dXJuIHo7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdGF0aWMgY29tcGxleDxfVHA+IHBvd1QoY29uc3QgY29tcGxleDxfVHA+JiBhLCBjb25zdCBfVHAmIGIpIHsKKyAgX1RwIGxvZ3IgPSA6OmxvZyg6Omh5cG90KGEuX01fcmUsYS5fTV9pbSkpOworICBfVHAgbG9naSA9IDo6YXRhbjIoYS5fTV9pbSwgYS5fTV9yZSk7CisgIF9UcCB4ID0gOjpleHAobG9nciAqIGIpOworICBfVHAgeSA9IGxvZ2kgKiBiOworCisgIHJldHVybiBjb21wbGV4PF9UcD4oeCAqIDo6Y29zKHkpLCB4ICogOjpzaW4oeSkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RhdGljIGNvbXBsZXg8X1RwPiBwb3dUKGNvbnN0IGNvbXBsZXg8X1RwPiYgYSwgY29uc3QgY29tcGxleDxfVHA+JiBiKSB7CisgIF9UcCBsb2dyID0gOjpsb2coOjpoeXBvdChhLl9NX3JlLGEuX01faW0pKTsKKyAgX1RwIGxvZ2kgPSA6OmF0YW4yKGEuX01faW0sIGEuX01fcmUpOworICBfVHAgeCA9IDo6ZXhwKGxvZ3IgKiBiLl9NX3JlIC0gbG9naSAqIGIuX01faW0pOworICBfVHAgeSA9IGxvZ3IgKiBiLl9NX2ltICsgbG9naSAqIGIuX01fcmU7CisKKyAgcmV0dXJuIGNvbXBsZXg8X1RwPih4ICogOjpjb3MoeSksIHggKiA6OnNpbih5KSk7Cit9CisKK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8ZmxvYXQ+IF9TVExQX0NBTEwgcG93KGNvbnN0IGZsb2F0JiBhLCBjb25zdCBjb21wbGV4PGZsb2F0PiYgYikKK3sgcmV0dXJuIHBvd1QoYSwgYik7IH0KKworX1NUTFBfREVDTFNQRUMgY29tcGxleDxmbG9hdD4gX1NUTFBfQ0FMTCBwb3coY29uc3QgY29tcGxleDxmbG9hdD4mIHpfaW4sIGludCBuKQoreyByZXR1cm4gcG93VCh6X2luLCBuKTsgfQorCitfU1RMUF9ERUNMU1BFQyBjb21wbGV4PGZsb2F0PiBfU1RMUF9DQUxMIHBvdyhjb25zdCBjb21wbGV4PGZsb2F0PiYgYSwgY29uc3QgZmxvYXQmIGIpCit7IHJldHVybiBwb3dUKGEsIGIpOyB9CisKK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8ZmxvYXQ+IF9TVExQX0NBTEwgcG93KGNvbnN0IGNvbXBsZXg8ZmxvYXQ+JiBhLCBjb25zdCBjb21wbGV4PGZsb2F0PiYgYikKK3sgcmV0dXJuIHBvd1QoYSwgYik7IH0KKworX1NUTFBfREVDTFNQRUMgY29tcGxleDxkb3VibGU+IF9TVExQX0NBTEwgcG93KGNvbnN0IGRvdWJsZSYgYSwgY29uc3QgY29tcGxleDxkb3VibGU+JiBiKQoreyByZXR1cm4gcG93VChhLCBiKTsgfQorCitfU1RMUF9ERUNMU1BFQyBjb21wbGV4PGRvdWJsZT4gX1NUTFBfQ0FMTCBwb3coY29uc3QgY29tcGxleDxkb3VibGU+JiB6X2luLCBpbnQgbikKK3sgcmV0dXJuIHBvd1Qoel9pbiwgbik7IH0KKworX1NUTFBfREVDTFNQRUMgY29tcGxleDxkb3VibGU+IF9TVExQX0NBTEwgcG93KGNvbnN0IGNvbXBsZXg8ZG91YmxlPiYgYSwgY29uc3QgZG91YmxlJiBiKQoreyByZXR1cm4gcG93VChhLCBiKTsgfQorCitfU1RMUF9ERUNMU1BFQyBjb21wbGV4PGRvdWJsZT4gX1NUTFBfQ0FMTCBwb3coY29uc3QgY29tcGxleDxkb3VibGU+JiBhLCBjb25zdCBjb21wbGV4PGRvdWJsZT4mIGIpCit7IHJldHVybiBwb3dUKGEsIGIpOyB9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTE9OR19ET1VCTEUpCitfU1RMUF9ERUNMU1BFQyBjb21wbGV4PGxvbmcgZG91YmxlPiBfU1RMUF9DQUxMIHBvdyhjb25zdCBsb25nIGRvdWJsZSYgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBsZXg8bG9uZyBkb3VibGU+JiBiKQoreyByZXR1cm4gcG93VChhLCBiKTsgfQorCisKK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8bG9uZyBkb3VibGU+IF9TVExQX0NBTEwgcG93KGNvbnN0IGNvbXBsZXg8bG9uZyBkb3VibGU+JiB6X2luLCBpbnQgbikKK3sgcmV0dXJuIHBvd1Qoel9pbiwgbik7IH0KKworX1NUTFBfREVDTFNQRUMgY29tcGxleDxsb25nIGRvdWJsZT4gX1NUTFBfQ0FMTCBwb3coY29uc3QgY29tcGxleDxsb25nIGRvdWJsZT4mIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb25nIGRvdWJsZSYgYikKK3sgcmV0dXJuIHBvd1QoYSwgYik7IH0KKworX1NUTFBfREVDTFNQRUMgY29tcGxleDxsb25nIGRvdWJsZT4gX1NUTFBfQ0FMTCBwb3coY29uc3QgY29tcGxleDxsb25nIGRvdWJsZT4mIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wbGV4PGxvbmcgZG91YmxlPiYgYikKK3sgcmV0dXJuIHBvd1QoYSwgYik7IH0KKyNlbmRpZgorCitfU1RMUF9FTkRfTkFNRVNQQUNFCmRpZmYgLS1naXQgYS9zcmMvY29tcGxleF9pby5jcHAgYi9zcmMvY29tcGxleF9pby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNiNjYzNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb21wbGV4X2lvLmNwcApAQCAtMCwwICsxLDE1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2luY2x1ZGUgInN0bHBvcnRfcHJlZml4LmgiCisKKyNpbmNsdWRlIDxjb21wbGV4PgorI2luY2x1ZGUgPGlzdHJlYW0+CisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisvLyBTcGVjaWFsaXphdGlvbnMgZm9yIG5hcnJvdyBjaGFyYWN0ZXJzOyBsZXRzIHVzIGF2b2lkIHRoZSBudWlzYW5jZSBvZgorLy8gd2lkZW5pbmcuCitfU1RMUF9PUEVSQVRPUl9TUEVDCitiYXNpY19vc3RyZWFtPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4mIF9TVExQX0NBTEwKK29wZXJhdG9yPDwgKGJhc2ljX29zdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiYgX19vcywgY29uc3QgY29tcGxleDxmbG9hdD4mIF9feikKK3sgcmV0dXJuIF9fb3MgPDwgJygnIDw8IChkb3VibGUpX196LnJlYWwoKSA8PCAnLCcgPDwgKGRvdWJsZSlfX3ouaW1hZygpIDw8ICcpJzsgfQorCitfU1RMUF9PUEVSQVRPUl9TUEVDCitiYXNpY19vc3RyZWFtPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4mIF9TVExQX0NBTEwKK29wZXJhdG9yPDwgKGJhc2ljX29zdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiYgX19vcywgY29uc3QgY29tcGxleDxkb3VibGU+JiBfX3opCit7IHJldHVybiBfX29zIDw8ICcoJyA8PCBfX3oucmVhbCgpIDw8ICcsJyA8PCBfX3ouaW1hZygpIDw8ICcpJzsgfQorCisjaWZuZGVmIF9TVExQX05PX0xPTkdfRE9VQkxFCitfU1RMUF9PUEVSQVRPUl9TUEVDCitiYXNpY19vc3RyZWFtPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4mIF9TVExQX0NBTEwKK29wZXJhdG9yPDwgKGJhc2ljX29zdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiYgX19vcywgY29uc3QgY29tcGxleDxsb25nIGRvdWJsZT4mIF9feikKK3sgcmV0dXJuIF9fb3MgPDwgJygnIDw8IF9fei5yZWFsKCkgPDwgJywnIDw8IF9fei5pbWFnKCkgPDwgJyknOyB9CisjZW5kaWYKKworLy8gU3BlY2lhbGl6YXRpb24gZm9yIG5hcnJvdyBjaGFyYWN0ZXJzOyBsZXRzIHVzIGF2b2lkIHdpZGVuLgorX1NUTFBfT1BFUkFUT1JfU1BFQworYmFzaWNfaXN0cmVhbTxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+JiBfU1RMUF9DQUxMCitvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiYgX19pcywgY29tcGxleDxmbG9hdD4mIF9feikgeworICBmbG9hdCAgX19yZSA9IDA7CisgIGZsb2F0ICBfX2ltID0gMDsKKworICBjaGFyIF9fYzsKKworICBfX2lzID4+IF9fYzsKKyAgaWYgKF9fYyA9PSAnKCcpIHsKKyAgICBfX2lzID4+IF9fcmUgPj4gX19jOworICAgIGlmIChfX2MgPT0gJywnKQorICAgICAgX19pcyA+PiBfX2ltID4+IF9fYzsKKyAgICBpZiAoX19jICE9ICcpJykKKyAgICAgIF9faXMuc2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworICB9CisgIGVsc2UgeworICAgIF9faXMucHV0YmFjayhfX2MpOworICAgIF9faXMgPj4gX19yZTsKKyAgfQorCisgIGlmIChfX2lzKQorICAgIF9feiA9IGNvbXBsZXg8ZmxvYXQ+KF9fcmUsIF9faW0pOworICByZXR1cm4gX19pczsKK30KKworX1NUTFBfT1BFUkFUT1JfU1BFQworYmFzaWNfaXN0cmVhbTxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+JiBfU1RMUF9DQUxMCitvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiYgX19pcywgY29tcGxleDxkb3VibGU+JiBfX3opIHsKKyAgZG91YmxlICBfX3JlID0gMDsKKyAgZG91YmxlICBfX2ltID0gMDsKKworICBjaGFyIF9fYzsKKworICBfX2lzID4+IF9fYzsKKyAgaWYgKF9fYyA9PSAnKCcpIHsKKyAgICBfX2lzID4+IF9fcmUgPj4gX19jOworICAgIGlmIChfX2MgPT0gJywnKQorICAgICAgX19pcyA+PiBfX2ltID4+IF9fYzsKKyAgICBpZiAoX19jICE9ICcpJykKKyAgICAgIF9faXMuc2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworICB9CisgIGVsc2UgeworICAgIF9faXMucHV0YmFjayhfX2MpOworICAgIF9faXMgPj4gX19yZTsKKyAgfQorCisgIGlmIChfX2lzKQorICAgIF9feiA9IGNvbXBsZXg8ZG91YmxlPihfX3JlLCBfX2ltKTsKKyAgcmV0dXJuIF9faXM7Cit9CisKKyNpZm5kZWYgX1NUTFBfTk9fTE9OR19ET1VCTEUKK19TVExQX09QRVJBVE9SX1NQRUMKK2Jhc2ljX2lzdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiYgX1NUTFBfQ0FMTAorb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4mIF9faXMsIGNvbXBsZXg8bG9uZyBkb3VibGU+JiBfX3opIHsKKyAgbG9uZyBkb3VibGUgIF9fcmUgPSAwOworICBsb25nIGRvdWJsZSAgX19pbSA9IDA7CisKKyAgY2hhciBfX2M7CisKKyAgX19pcyA+PiBfX2M7CisgIGlmIChfX2MgPT0gJygnKSB7CisgICAgX19pcyA+PiBfX3JlID4+IF9fYzsKKyAgICBpZiAoX19jID09ICcsJykKKyAgICAgIF9faXMgPj4gX19pbSA+PiBfX2M7CisgICAgaWYgKF9fYyAhPSAnKScpCisgICAgICBfX2lzLnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKKyAgfQorICBlbHNlIHsKKyAgICBfX2lzLnB1dGJhY2soX19jKTsKKyAgICBfX2lzID4+IF9fcmU7CisgIH0KKworICBpZiAoX19pcykKKyAgICBfX3ogPSBjb21wbGV4PGxvbmcgZG91YmxlPihfX3JlLCBfX2ltKTsKKyAgcmV0dXJuIF9faXM7Cit9CisjZW5kaWYKKworLy8gRm9yY2UgaW5zdGFudGlhdGlvbiBvZiBjb21wbGV4IEkvTyBmdW5jdGlvbnMKKyNpZiAhKGRlZmluZWQgKF9TVExQX05PX0ZPUkNFX0lOU1RBTlRJQVRFKSB8fCBkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKSkKKworX1NUTFBfT1BFUkFUT1JfU1BFQyBiYXNpY19pc3RyZWFtPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4mICBfU1RMUF9DQUxMCitvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPiYsIGNvbXBsZXg8ZmxvYXQ+Jik7CisKK19TVExQX09QRVJBVE9SX1NQRUMgYmFzaWNfaXN0cmVhbTx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+JiAgX1NUTFBfQ0FMTAorb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4mLCBjb21wbGV4PGRvdWJsZT4mKTsKKworI2lmbmRlZiBfU1RMUF9OT19MT05HX0RPVUJMRQorX1NUTFBfT1BFUkFUT1JfU1BFQyBiYXNpY19pc3RyZWFtPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4mICBfU1RMUF9DQUxMCitvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPiYsIGNvbXBsZXg8bG9uZyBkb3VibGU+Jik7CisKK19TVExQX09QRVJBVE9SX1NQRUMgYmFzaWNfb3N0cmVhbTx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+JiAgX1NUTFBfQ0FMTAorb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4mLCBjb25zdCBjb21wbGV4PGxvbmcgZG91YmxlPiYpOworI2VuZGlmCisKK19TVExQX09QRVJBVE9SX1NQRUMgYmFzaWNfb3N0cmVhbTx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+JiAgX1NUTFBfQ0FMTAorb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4mLCBjb25zdCBjb21wbGV4PGZsb2F0PiYpOworCitfU1RMUF9PUEVSQVRPUl9TUEVDIGJhc2ljX29zdHJlYW08d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPiYgIF9TVExQX0NBTEwKK29wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+JiwgY29uc3QgY29tcGxleDxkb3VibGU+Jik7CisKKyNlbmRpZiAvKiBfU1RMUF9OT19XQ0hBUl9UICovCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgorCmRpZmYgLS1naXQgYS9zcmMvY29tcGxleF90cmlnLmNwcCBiL3NyYy9jb21wbGV4X3RyaWcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1NjZmZTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29tcGxleF90cmlnLmNwcApAQCAtMCwwICsxLDE5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKyNpbmNsdWRlICJzdGxwb3J0X3ByZWZpeC5oIgorCisKKy8vIFRyaWdvbm9tZXRyaWMgYW5kIGh5cGVyYm9saWMgZnVuY3Rpb25zIGZvciBjb21wbGV4PGZsb2F0PiwKKy8vIGNvbXBsZXg8ZG91YmxlPiwgYW5kIGNvbXBsZXg8bG9uZyBkb3VibGU+CisjaW5jbHVkZSA8Y29tcGxleD4KKyNpbmNsdWRlIDxjZmxvYXQ+CisjaW5jbHVkZSA8Y21hdGg+CisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gaGVscGVycworI2lmIGRlZmluZWQgKF9fc2dpKQorICBzdGF0aWMgY29uc3QgdW5pb24geyB1bnNpZ25lZCBpbnQgaTsgZmxvYXQgZjsgfSBmbG9hdF91bGltaXQgPSB7IDB4NDJiMmQ0ZmMgfTsKKyAgc3RhdGljIGNvbnN0IGZsb2F0IGZsb2F0X2xpbWl0ID0gZmxvYXRfdWxpbWl0LmY7CisgIHN0YXRpYyB1bmlvbiB7CisgICAgc3RydWN0IHsgdW5zaWduZWQgaW50IGg7IHVuc2lnbmVkIGludCBsOyB9IHc7CisgICAgZG91YmxlIGQ7CisgIH0gZG91YmxlX3VsaW1pdCA9IHsgMHg0MDg2MzNjZSwgMHg4ZmI5Zjg3ZCB9OworICBzdGF0aWMgY29uc3QgZG91YmxlIGRvdWJsZV9saW1pdCA9IGRvdWJsZV91bGltaXQuZDsKKyAgc3RhdGljIHVuaW9uIHsKKyAgICBzdHJ1Y3QgeyB1bnNpZ25lZCBpbnQgaFsyXTsgdW5zaWduZWQgaW50IGxbMl07IH0gdzsKKyAgICBsb25nIGRvdWJsZSBsZDsKKyAgfSBsZG91YmxlX3VsaW1pdCA9IHsweDQwODYzM2NlLCAweDhmYjlmODdlLCAweGJkMjNiNjU5LCAweDRlOWJkOGIxfTsKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9OT19MT05HX0RPVUJMRSkKKyAgc3RhdGljIGNvbnN0IGxvbmcgZG91YmxlIGxkb3VibGVfbGltaXQgPSBsZG91YmxlX3VsaW1pdC5sZDsKKyMgIGVuZGlmCisjZWxzZQorIyAgaWYgZGVmaW5lZCAoTV9MTjIpICYmIGRlZmluZWQgKEZMVF9NQVhfRVhQKQorICBzdGF0aWMgY29uc3QgZmxvYXQgZmxvYXRfbGltaXQgPSBmbG9hdChNX0xOMiAqIEZMVF9NQVhfRVhQKTsKKyAgc3RhdGljIGNvbnN0IGRvdWJsZSBkb3VibGVfbGltaXQgPSBNX0xOMiAqIERCTF9NQVhfRVhQOworIyAgZWxzZQorICBzdGF0aWMgY29uc3QgZmxvYXQgZmxvYXRfbGltaXQgPSA6OmxvZyhGTFRfTUFYKTsKKyAgc3RhdGljIGNvbnN0IGRvdWJsZSBkb3VibGVfbGltaXQgPSA6OmxvZyhEQkxfTUFYKTsKKyMgIGVuZGlmCisjICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTE9OR19ET1VCTEUpCisjICAgIGlmIGRlZmluZWQgKE1fTE4ybCkKKyAgc3RhdGljIGNvbnN0IGxvbmcgZG91YmxlIGxkb3VibGVfbGltaXQgPSBNX0xOMmwgKiBMREJMX01BWF9FWFA7CisjICAgIGVsc2UKKyAgc3RhdGljIGNvbnN0IGxvbmcgZG91YmxlIGxkb3VibGVfbGltaXQgPSA6OmxvZyhMREJMX01BWCk7CisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBzaW4KK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdGF0aWMgY29tcGxleDxfVHA+IHNpblQoY29uc3QgY29tcGxleDxfVHA+JiB6KSB7CisgIHJldHVybiBjb21wbGV4PF9UcD4oOjpzaW4oei5fTV9yZSkgKiA6OmNvc2goei5fTV9pbSksCisgICAgICAgICAgICAgICAgICAgICAgOjpjb3Moei5fTV9yZSkgKiA6OnNpbmgoei5fTV9pbSkpOworfQorCitfU1RMUF9ERUNMU1BFQyBjb21wbGV4PGZsb2F0PiBfU1RMUF9DQUxMIHNpbihjb25zdCBjb21wbGV4PGZsb2F0PiYgeikKK3sgcmV0dXJuIHNpblQoeik7IH0KKworX1NUTFBfREVDTFNQRUMgY29tcGxleDxkb3VibGU+IF9TVExQX0NBTEwgc2luKGNvbnN0IGNvbXBsZXg8ZG91YmxlPiYgeikKK3sgcmV0dXJuIHNpblQoeik7IH0KKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19MT05HX0RPVUJMRSkKK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8bG9uZyBkb3VibGU+IF9TVExQX0NBTEwgc2luKGNvbnN0IGNvbXBsZXg8bG9uZyBkb3VibGU+JiB6KQoreyByZXR1cm4gc2luVCh6KTsgfQorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29zCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RhdGljIGNvbXBsZXg8X1RwPiBjb3NUKGNvbnN0IGNvbXBsZXg8X1RwPiYgeikgeworICByZXR1cm4gY29tcGxleDxfVHA+KDo6Y29zKHouX01fcmUpICogOjpjb3NoKHouX01faW0pLAorICAgICAgICAgICAgICAgICAgICAgLTo6c2luKHouX01fcmUpICogOjpzaW5oKHouX01faW0pKTsKK30KKworX1NUTFBfREVDTFNQRUMgY29tcGxleDxmbG9hdD4gX1NUTFBfQ0FMTCBjb3MoY29uc3QgY29tcGxleDxmbG9hdD4mIHopCit7IHJldHVybiBjb3NUKHopOyB9CisKK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8ZG91YmxlPiBfU1RMUF9DQUxMIGNvcyhjb25zdCBjb21wbGV4PGRvdWJsZT4mIHopCit7IHJldHVybiBjb3NUKHopOyB9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTE9OR19ET1VCTEUpCitfU1RMUF9ERUNMU1BFQyBjb21wbGV4PGxvbmcgZG91YmxlPiBfU1RMUF9DQUxMIGNvcyhjb25zdCBjb21wbGV4PGxvbmcgZG91YmxlPiYgeikKK3sgcmV0dXJuIGNvc1Qoeik7IH0KKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHRhbgordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0YXRpYyBjb21wbGV4PF9UcD4gdGFuVChjb25zdCBjb21wbGV4PF9UcD4mIHosIGNvbnN0IF9UcCYgVHBfbGltaXQpIHsKKyAgX1RwIHJlMiA9IDIuZiAqIHouX01fcmU7CisgIF9UcCBpbTIgPSAyLmYgKiB6Ll9NX2ltOworCisgIGlmICg6OmFicyhpbTIpID4gVHBfbGltaXQpCisgICAgcmV0dXJuIGNvbXBsZXg8X1RwPigwLmYsIChpbTIgPiAwID8gMS5mIDogLTEuZikpOworICBlbHNlIHsKKyAgICBfVHAgZGVuID0gOjpjb3MocmUyKSArIDo6Y29zaChpbTIpOworICAgIHJldHVybiBjb21wbGV4PF9UcD4oOjpzaW4ocmUyKSAvIGRlbiwgOjpzaW5oKGltMikgLyBkZW4pOworICB9Cit9CisKK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8ZmxvYXQ+IF9TVExQX0NBTEwgdGFuKGNvbnN0IGNvbXBsZXg8ZmxvYXQ+JiB6KQoreyByZXR1cm4gdGFuVCh6LCBmbG9hdF9saW1pdCk7IH0KKworX1NUTFBfREVDTFNQRUMgY29tcGxleDxkb3VibGU+IF9TVExQX0NBTEwgdGFuKGNvbnN0IGNvbXBsZXg8ZG91YmxlPiYgeikKK3sgcmV0dXJuIHRhblQoeiwgZG91YmxlX2xpbWl0KTsgfQorCisjaWYgIWRlZmluZWQgKF9TVExQX05PX0xPTkdfRE9VQkxFKQorX1NUTFBfREVDTFNQRUMgY29tcGxleDxsb25nIGRvdWJsZT4gX1NUTFBfQ0FMTCB0YW4oY29uc3QgY29tcGxleDxsb25nIGRvdWJsZT4mIHopCit7IHJldHVybiB0YW5UKHosIGxkb3VibGVfbGltaXQpOyB9CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBzaW5oCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RhdGljIGNvbXBsZXg8X1RwPiBzaW5oVChjb25zdCBjb21wbGV4PF9UcD4mIHopIHsKKyAgcmV0dXJuIGNvbXBsZXg8X1RwPig6OnNpbmgoei5fTV9yZSkgKiA6OmNvcyh6Ll9NX2ltKSwKKyAgICAgICAgICAgICAgICAgICAgICA6OmNvc2goei5fTV9yZSkgKiA6OnNpbih6Ll9NX2ltKSk7Cit9CisKK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8ZmxvYXQ+IF9TVExQX0NBTEwgc2luaChjb25zdCBjb21wbGV4PGZsb2F0PiYgeikKK3sgcmV0dXJuIHNpbmhUKHopOyB9CisKK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8ZG91YmxlPiBfU1RMUF9DQUxMIHNpbmgoY29uc3QgY29tcGxleDxkb3VibGU+JiB6KQoreyByZXR1cm4gc2luaFQoeik7IH0KKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19MT05HX0RPVUJMRSkKK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8bG9uZyBkb3VibGU+IF9TVExQX0NBTEwgc2luaChjb25zdCBjb21wbGV4PGxvbmcgZG91YmxlPiYgeikKK3sgcmV0dXJuIHNpbmhUKHopOyB9CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb3NoCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RhdGljIGNvbXBsZXg8X1RwPiBjb3NoVChjb25zdCBjb21wbGV4PF9UcD4mIHopIHsKKyAgcmV0dXJuIGNvbXBsZXg8X1RwPig6OmNvc2goei5fTV9yZSkgKiA6OmNvcyh6Ll9NX2ltKSwKKyAgICAgICAgICAgICAgICAgICAgICA6OnNpbmgoei5fTV9yZSkgKiA6OnNpbih6Ll9NX2ltKSk7Cit9CisKK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8ZmxvYXQ+IF9TVExQX0NBTEwgY29zaChjb25zdCBjb21wbGV4PGZsb2F0PiYgeikKK3sgcmV0dXJuIGNvc2hUKHopOyB9CisKK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8ZG91YmxlPiBfU1RMUF9DQUxMIGNvc2goY29uc3QgY29tcGxleDxkb3VibGU+JiB6KQoreyByZXR1cm4gY29zaFQoeik7IH0KKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19MT05HX0RPVUJMRSkKK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8bG9uZyBkb3VibGU+IF9TVExQX0NBTEwgY29zaChjb25zdCBjb21wbGV4PGxvbmcgZG91YmxlPiYgeikKK3sgcmV0dXJuIGNvc2hUKHopOyB9CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0YW5oCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RhdGljIGNvbXBsZXg8X1RwPiB0YW5oVChjb25zdCBjb21wbGV4PF9UcD4mIHosIGNvbnN0IF9UcCYgVHBfbGltaXQpIHsKKyAgX1RwIHJlMiA9IDIuZiAqIHouX01fcmU7CisgIF9UcCBpbTIgPSAyLmYgKiB6Ll9NX2ltOworICBpZiAoOjphYnMocmUyKSA+IFRwX2xpbWl0KQorICAgIHJldHVybiBjb21wbGV4PF9UcD4oKHJlMiA+IDAgPyAxLmYgOiAtMS5mKSwgMC5mKTsKKyAgZWxzZSB7CisgICAgX1RwIGRlbiA9IDo6Y29zaChyZTIpICsgOjpjb3MoaW0yKTsKKyAgICByZXR1cm4gY29tcGxleDxfVHA+KDo6c2luaChyZTIpIC8gZGVuLCA6OnNpbihpbTIpIC8gZGVuKTsKKyAgfQorfQorCitfU1RMUF9ERUNMU1BFQyBjb21wbGV4PGZsb2F0PiBfU1RMUF9DQUxMIHRhbmgoY29uc3QgY29tcGxleDxmbG9hdD4mIHopCit7IHJldHVybiB0YW5oVCh6LCBmbG9hdF9saW1pdCk7IH0KKworX1NUTFBfREVDTFNQRUMgY29tcGxleDxkb3VibGU+IF9TVExQX0NBTEwgdGFuaChjb25zdCBjb21wbGV4PGRvdWJsZT4mIHopCit7IHJldHVybiB0YW5oVCh6LCBkb3VibGVfbGltaXQpOyB9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTE9OR19ET1VCTEUpCitfU1RMUF9ERUNMU1BFQyBjb21wbGV4PGxvbmcgZG91YmxlPiBfU1RMUF9DQUxMIHRhbmgoY29uc3QgY29tcGxleDxsb25nIGRvdWJsZT4mIHopCit7IHJldHVybiB0YW5oVCh6LCBsZG91YmxlX2xpbWl0KTsgfQorI2VuZGlmCisKK19TVExQX0VORF9OQU1FU1BBQ0UKZGlmZiAtLWdpdCBhL3NyYy9jdHlwZS5jcHAgYi9zcmMvY3R5cGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZTg0YjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY3R5cGUuY3BwCkBAIC0wLDAgKzEsNDg2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaW5jbHVkZSAic3RscG9ydF9wcmVmaXguaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxsb2NhbGU+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKworI2luY2x1ZGUgImNfbG9jYWxlLmgiCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGN0eXBlPGNoYXI+CisKKy8vIFRoZSBjbGFzc2ljIHRhYmxlOiBzdGF0aWMgZGF0YSBtZW1iZXJzLgorCisjaWYgIWRlZmluZWQgKF9TVExQX1NUQVRJQ19DT05TVF9JTklUX0JVRykgJiYgIWRlZmluZWQgKF9TVExQX05PX1NUQVRJQ19DT05TVF9ERUZJTklUSU9OKQorLy8qVFkgMDIvMjUvMjAwMCAtIGFkZGVkIHdvcmthcm91bmQgZm9yIE1QVyBjb21waWxlcnM7IHRoZXkgY29uZnVzZSBvbiBpbi1jbGFzcyBzdGF0aWMgY29uc3QKK2NvbnN0IHNpemVfdCBjdHlwZTxjaGFyPjo6dGFibGVfc2l6ZTsKKyNlbmRpZgorCisvLyBUaGlzIG1hY3JvIGlzIHNwZWNpZmljYWxseSBmb3IgcGxhdGZvcm1zIHdoZXJlIGlzcHJpbnQoKSByZWxpZXMKKy8vIG9uIHNlcGFyYXRlIGZsYWcKKworY29uc3QgY3R5cGVfYmFzZTo6bWFzayoKK2N0eXBlPGNoYXI+OjpjbGFzc2ljX3RhYmxlKCkgX1NUTFBfTk9USFJPVyB7CisgIC8qIEN0eXBlIHRhYmxlIGZvciB0aGUgQVNDSUkgY2hhcmFjdGVyIHNldC4gKi8KKyAgc3RhdGljIGNvbnN0IGN0eXBlX2Jhc2U6Om1hc2sgX1NfY2xhc3NpY190YWJsZVt0YWJsZV9zaXplXSA9IHsKKyAgICBjbnRybCAvKiBudWxsICovLAorICAgIGNudHJsIC8qIF5BICovLAorICAgIGNudHJsIC8qIF5CICovLAorICAgIGNudHJsIC8qIF5DICovLAorICAgIGNudHJsIC8qIF5EICovLAorICAgIGNudHJsIC8qIF5FICovLAorICAgIGNudHJsIC8qIF5GICovLAorICAgIGNudHJsIC8qIF5HICovLAorICAgIGNudHJsIC8qIF5IICovLAorICAgIGN0eXBlX2Jhc2U6Om1hc2soc3BhY2UgfCBjbnRybCkgLyogdGFiICovLAorICAgIGN0eXBlX2Jhc2U6Om1hc2soc3BhY2UgfCBjbnRybCkgLyogTEYgKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhzcGFjZSB8IGNudHJsKSAvKiBeSyAqLywKKyAgICBjdHlwZV9iYXNlOjptYXNrKHNwYWNlIHwgY250cmwpIC8qIEZGICovLAorICAgIGN0eXBlX2Jhc2U6Om1hc2soc3BhY2UgfCBjbnRybCkgLyogXk0gKi8sCisgICAgY250cmwgLyogXk4gKi8sCisgICAgY250cmwgLyogXk8gKi8sCisgICAgY250cmwgLyogXlAgKi8sCisgICAgY250cmwgLyogXlEgKi8sCisgICAgY250cmwgLyogXlIgKi8sCisgICAgY250cmwgLyogXlMgKi8sCisgICAgY250cmwgLyogXlQgKi8sCisgICAgY250cmwgLyogXlUgKi8sCisgICAgY250cmwgLyogXlYgKi8sCisgICAgY250cmwgLyogXlcgKi8sCisgICAgY250cmwgLyogXlggKi8sCisgICAgY250cmwgLyogXlkgKi8sCisgICAgY250cmwgLyogXlogKi8sCisgICAgY250cmwgLyogZXNjICovLAorICAgIGNudHJsIC8qIF5cICovLAorICAgIGNudHJsIC8qIF5dICovLAorICAgIGNudHJsIC8qIF5eICovLAorICAgIGNudHJsIC8qIF5fICovLAorICAgIGN0eXBlX2Jhc2U6Om1hc2soc3BhY2UgfCBwcmludCkgLyogICovLAorICAgIGN0eXBlX2Jhc2U6Om1hc2socHVuY3QgfCBwcmludCkgLyogISAqLywKKyAgICBjdHlwZV9iYXNlOjptYXNrKHB1bmN0IHwgcHJpbnQpIC8qICIgKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhwdW5jdCB8IHByaW50KSAvKiAjICovLAorICAgIGN0eXBlX2Jhc2U6Om1hc2socHVuY3QgfCBwcmludCkgLyogJCAqLywKKyAgICBjdHlwZV9iYXNlOjptYXNrKHB1bmN0IHwgcHJpbnQpIC8qICUgKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhwdW5jdCB8IHByaW50KSAvKiAmICovLAorICAgIGN0eXBlX2Jhc2U6Om1hc2socHVuY3QgfCBwcmludCkgLyogJyAqLywKKyAgICBjdHlwZV9iYXNlOjptYXNrKHB1bmN0IHwgcHJpbnQpIC8qICggKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhwdW5jdCB8IHByaW50KSAvKiApICovLAorICAgIGN0eXBlX2Jhc2U6Om1hc2socHVuY3QgfCBwcmludCkgLyogKiAqLywKKyAgICBjdHlwZV9iYXNlOjptYXNrKHB1bmN0IHwgcHJpbnQpIC8qICsgKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhwdW5jdCB8IHByaW50KSAvKiAsICovLAorICAgIGN0eXBlX2Jhc2U6Om1hc2socHVuY3QgfCBwcmludCkgLyogLSAqLywKKyAgICBjdHlwZV9iYXNlOjptYXNrKHB1bmN0IHwgcHJpbnQpIC8qIC4gKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhwdW5jdCB8IHByaW50KSAvKiAvICovLAorICAgIGN0eXBlX2Jhc2U6Om1hc2soZGlnaXQgfCBwcmludCB8IHhkaWdpdCkgLyogMCAqLywKKyAgICBjdHlwZV9iYXNlOjptYXNrKGRpZ2l0IHwgcHJpbnQgfCB4ZGlnaXQpIC8qIDEgKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhkaWdpdCB8IHByaW50IHwgeGRpZ2l0KSAvKiAyICovLAorICAgIGN0eXBlX2Jhc2U6Om1hc2soZGlnaXQgfCBwcmludCB8IHhkaWdpdCkgLyogMyAqLywKKyAgICBjdHlwZV9iYXNlOjptYXNrKGRpZ2l0IHwgcHJpbnQgfCB4ZGlnaXQpIC8qIDQgKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhkaWdpdCB8IHByaW50IHwgeGRpZ2l0KSAvKiA1ICovLAorICAgIGN0eXBlX2Jhc2U6Om1hc2soZGlnaXQgfCBwcmludCB8IHhkaWdpdCkgLyogNiAqLywKKyAgICBjdHlwZV9iYXNlOjptYXNrKGRpZ2l0IHwgcHJpbnQgfCB4ZGlnaXQpIC8qIDcgKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhkaWdpdCB8IHByaW50IHwgeGRpZ2l0KSAvKiA4ICovLAorICAgIGN0eXBlX2Jhc2U6Om1hc2soZGlnaXQgfCBwcmludCB8IHhkaWdpdCkgLyogOSAqLywKKyAgICBjdHlwZV9iYXNlOjptYXNrKHB1bmN0IHwgcHJpbnQpIC8qIDogKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhwdW5jdCB8IHByaW50KSAvKiA7ICovLAorICAgIGN0eXBlX2Jhc2U6Om1hc2socHVuY3QgfCBwcmludCkgLyogPCAqLywKKyAgICBjdHlwZV9iYXNlOjptYXNrKHB1bmN0IHwgcHJpbnQpIC8qID0gKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhwdW5jdCB8IHByaW50KSAvKiA+ICovLAorICAgIGN0eXBlX2Jhc2U6Om1hc2socHVuY3QgfCBwcmludCkgLyogPyAqLywKKyAgICBjdHlwZV9iYXNlOjptYXNrKHB1bmN0IHwgcHJpbnQpIC8qICEgKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhhbHBoYSB8IHByaW50IHwgdXBwZXIgfCB4ZGlnaXQpIC8qIEEgKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhhbHBoYSB8IHByaW50IHwgdXBwZXIgfCB4ZGlnaXQpIC8qIEIgKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhhbHBoYSB8IHByaW50IHwgdXBwZXIgfCB4ZGlnaXQpIC8qIEMgKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhhbHBoYSB8IHByaW50IHwgdXBwZXIgfCB4ZGlnaXQpIC8qIEQgKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhhbHBoYSB8IHByaW50IHwgdXBwZXIgfCB4ZGlnaXQpIC8qIEUgKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhhbHBoYSB8IHByaW50IHwgdXBwZXIgfCB4ZGlnaXQpIC8qIEYgKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhhbHBoYSB8IHByaW50IHwgdXBwZXIpIC8qIEcgKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhhbHBoYSB8IHByaW50IHwgdXBwZXIpIC8qIEggKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhhbHBoYSB8IHByaW50IHwgdXBwZXIpIC8qIEkgKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhhbHBoYSB8IHByaW50IHwgdXBwZXIpIC8qIEogKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhhbHBoYSB8IHByaW50IHwgdXBwZXIpIC8qIEsgKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhhbHBoYSB8IHByaW50IHwgdXBwZXIpIC8qIEwgKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhhbHBoYSB8IHByaW50IHwgdXBwZXIpIC8qIE0gKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhhbHBoYSB8IHByaW50IHwgdXBwZXIpIC8qIE4gKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhhbHBoYSB8IHByaW50IHwgdXBwZXIpIC8qIE8gKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhhbHBoYSB8IHByaW50IHwgdXBwZXIpIC8qIFAgKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhhbHBoYSB8IHByaW50IHwgdXBwZXIpIC8qIFEgKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhhbHBoYSB8IHByaW50IHwgdXBwZXIpIC8qIFIgKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhhbHBoYSB8IHByaW50IHwgdXBwZXIpIC8qIFMgKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhhbHBoYSB8IHByaW50IHwgdXBwZXIpIC8qIFQgKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhhbHBoYSB8IHByaW50IHwgdXBwZXIpIC8qIFUgKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhhbHBoYSB8IHByaW50IHwgdXBwZXIpIC8qIFYgKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhhbHBoYSB8IHByaW50IHwgdXBwZXIpIC8qIFcgKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhhbHBoYSB8IHByaW50IHwgdXBwZXIpIC8qIFggKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhhbHBoYSB8IHByaW50IHwgdXBwZXIpIC8qIFkgKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhhbHBoYSB8IHByaW50IHwgdXBwZXIpIC8qIFogKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhwdW5jdCB8IHByaW50KSAvKiBbICovLAorICAgIGN0eXBlX2Jhc2U6Om1hc2socHVuY3QgfCBwcmludCkgLyogXCAqLywKKyAgICBjdHlwZV9iYXNlOjptYXNrKHB1bmN0IHwgcHJpbnQpIC8qIF0gKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhwdW5jdCB8IHByaW50KSAvKiBeICovLAorICAgIGN0eXBlX2Jhc2U6Om1hc2socHVuY3QgfCBwcmludCkgLyogXyAqLywKKyAgICBjdHlwZV9iYXNlOjptYXNrKHB1bmN0IHwgcHJpbnQpIC8qIGAgKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhhbHBoYSB8IHByaW50IHwgbG93ZXIgfCB4ZGlnaXQpIC8qIGEgKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhhbHBoYSB8IHByaW50IHwgbG93ZXIgfCB4ZGlnaXQpIC8qIGIgKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhhbHBoYSB8IHByaW50IHwgbG93ZXIgfCB4ZGlnaXQpIC8qIGMgKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhhbHBoYSB8IHByaW50IHwgbG93ZXIgfCB4ZGlnaXQpIC8qIGQgKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhhbHBoYSB8IHByaW50IHwgbG93ZXIgfCB4ZGlnaXQpIC8qIGUgKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhhbHBoYSB8IHByaW50IHwgbG93ZXIgfCB4ZGlnaXQpIC8qIGYgKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhhbHBoYSB8IHByaW50IHwgbG93ZXIpIC8qIGcgKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhhbHBoYSB8IHByaW50IHwgbG93ZXIpIC8qIGggKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhhbHBoYSB8IHByaW50IHwgbG93ZXIpIC8qIGkgKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhhbHBoYSB8IHByaW50IHwgbG93ZXIpIC8qIGogKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhhbHBoYSB8IHByaW50IHwgbG93ZXIpIC8qIGsgKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhhbHBoYSB8IHByaW50IHwgbG93ZXIpIC8qIGwgKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhhbHBoYSB8IHByaW50IHwgbG93ZXIpIC8qIG0gKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhhbHBoYSB8IHByaW50IHwgbG93ZXIpIC8qIG4gKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhhbHBoYSB8IHByaW50IHwgbG93ZXIpIC8qIG8gKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhhbHBoYSB8IHByaW50IHwgbG93ZXIpIC8qIHAgKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhhbHBoYSB8IHByaW50IHwgbG93ZXIpIC8qIHEgKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhhbHBoYSB8IHByaW50IHwgbG93ZXIpIC8qIHIgKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhhbHBoYSB8IHByaW50IHwgbG93ZXIpIC8qIHMgKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhhbHBoYSB8IHByaW50IHwgbG93ZXIpIC8qIHQgKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhhbHBoYSB8IHByaW50IHwgbG93ZXIpIC8qIHUgKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhhbHBoYSB8IHByaW50IHwgbG93ZXIpIC8qIHYgKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhhbHBoYSB8IHByaW50IHwgbG93ZXIpIC8qIHcgKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhhbHBoYSB8IHByaW50IHwgbG93ZXIpIC8qIHggKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhhbHBoYSB8IHByaW50IHwgbG93ZXIpIC8qIHkgKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhhbHBoYSB8IHByaW50IHwgbG93ZXIpIC8qIHogKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhwdW5jdCB8IHByaW50KSAvKiB7ICovLAorICAgIGN0eXBlX2Jhc2U6Om1hc2socHVuY3QgfCBwcmludCkgLyogfCAqLywKKyAgICBjdHlwZV9iYXNlOjptYXNrKHB1bmN0IHwgcHJpbnQpIC8qIH0gKi8sCisgICAgY3R5cGVfYmFzZTo6bWFzayhwdW5jdCB8IHByaW50KSAvKiB+ICovLAorICAgIGNudHJsIC8qIGRlbCAoMHg3ZikqLywKKyAgICAvKiBBU0NJSSBpcyBhIDctYml0IGNvZGUsIHNvIGV2ZXJ5dGhpbmcgZWxzZSBpcyBub24tQVNDSUkgKi8KKyAgICBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCAgY3R5cGVfYmFzZTo6bWFzaygwKSwKKyAgICBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCAgY3R5cGVfYmFzZTo6bWFzaygwKSwKKyAgICBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCAgY3R5cGVfYmFzZTo6bWFzaygwKSwKKyAgICBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCAgY3R5cGVfYmFzZTo6bWFzaygwKSwKKyAgICBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCAgY3R5cGVfYmFzZTo6bWFzaygwKSwKKyAgICBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCAgY3R5cGVfYmFzZTo6bWFzaygwKSwKKyAgICBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCAgY3R5cGVfYmFzZTo6bWFzaygwKSwKKyAgICBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCAgY3R5cGVfYmFzZTo6bWFzaygwKSwKKyAgICBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCAgY3R5cGVfYmFzZTo6bWFzaygwKSwKKyAgICBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCAgY3R5cGVfYmFzZTo6bWFzaygwKSwKKyAgICBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCAgY3R5cGVfYmFzZTo6bWFzaygwKSwKKyAgICBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCAgY3R5cGVfYmFzZTo6bWFzaygwKSwKKyAgICBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCAgY3R5cGVfYmFzZTo6bWFzaygwKSwKKyAgICBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCAgY3R5cGVfYmFzZTo6bWFzaygwKSwKKyAgICBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCAgY3R5cGVfYmFzZTo6bWFzaygwKSwKKyAgICBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCBjdHlwZV9iYXNlOjptYXNrKDApLCAgY3R5cGVfYmFzZTo6bWFzaygwKQorICB9OworICByZXR1cm4gX1NfY2xhc3NpY190YWJsZTsKK30KKworLy8gRm9yIGV2ZXJ5IGMgaW4gdGhlIHJhbmdlIDAgPD0gYyA8IDI1NiwgX1NfdXBwZXJbY10gaXMgdGhlCisvLyB1cHBlcmNhc2VkIHZlcnNpb24gb2YgYyBhbmQgX1NfbG93ZXJbY10gaXMgdGhlIGxvd2VyY2FzZWQKKy8vIHZlcnNpb24uICBBcyBiZWZvcmUsIHRoZXNlIHR3byB0YWJsZXMgYXNzdW1lIHRoZSBBU0NJSSBjaGFyYWN0ZXIKKy8vIHNldC4KKworY29uc3QgdW5zaWduZWQgY2hhciBfU191cHBlcltjdHlwZTxjaGFyPjo6dGFibGVfc2l6ZV0gPQoreworICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LAorICAweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLAorICAweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LAorICAweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLAorICAweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LAorICAweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLAorICAweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LAorICAweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLAorICAweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LAorICAweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLAorICAweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LAorICAweDU4LCAweDU5LCAweDVhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLAorICAweDYwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LAorICAweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLAorICAweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LAorICAweDU4LCAweDU5LCAweDVhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLAorICAweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LAorICAweDg4LCAweDg5LCAweDhhLCAweDhiLCAweDhjLCAweDhkLCAweDhlLCAweDhmLAorICAweDkwLCAweDkxLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LAorICAweDk4LCAweDk5LCAweDlhLCAweDliLCAweDljLCAweDlkLCAweDllLCAweDlmLAorICAweGEwLCAweGExLCAweGEyLCAweGEzLCAweGE0LCAweGE1LCAweGE2LCAweGE3LAorICAweGE4LCAweGE5LCAweGFhLCAweGFiLCAweGFjLCAweGFkLCAweGFlLCAweGFmLAorICAweGIwLCAweGIxLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI2LCAweGI3LAorICAweGI4LCAweGI5LCAweGJhLCAweGJiLCAweGJjLCAweGJkLCAweGJlLCAweGJmLAorICAweGMwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LAorICAweGM4LCAweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLAorICAweGQwLCAweGQxLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LAorICAweGQ4LCAweGQ5LCAweGRhLCAweGRiLCAweGRjLCAweGRkLCAweGRlLCAweGRmLAorICAweGUwLCAweGUxLCAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LAorICAweGU4LCAweGU5LCAweGVhLCAweGViLCAweGVjLCAweGVkLCAweGVlLCAweGVmLAorICAweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LAorICAweGY4LCAweGY5LCAweGZhLCAweGZiLCAweGZjLCAweGZkLCAweGZlLCAweGZmCit9OworCitjb25zdCB1bnNpZ25lZCBjaGFyIF9TX2xvd2VyW2N0eXBlPGNoYXI+Ojp0YWJsZV9zaXplXSA9Cit7CisgIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsCisgIDB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsCisgIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsCisgIDB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsCisgIDB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsCisgIDB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsCisgIDB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsCisgIDB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsCisgIDB4NDAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsCisgIDB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsCisgIDB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsCisgIDB4NzgsIDB4NzksIDB4N2EsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsCisgIDB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsCisgIDB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsCisgIDB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsCisgIDB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsCisgIDB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsCisgIDB4ODgsIDB4ODksIDB4OGEsIDB4OGIsIDB4OGMsIDB4OGQsIDB4OGUsIDB4OGYsCisgIDB4OTAsIDB4OTEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsCisgIDB4OTgsIDB4OTksIDB4OWEsIDB4OWIsIDB4OWMsIDB4OWQsIDB4OWUsIDB4OWYsCisgIDB4YTAsIDB4YTEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsIDB4YTYsIDB4YTcsCisgIDB4YTgsIDB4YTksIDB4YWEsIDB4YWIsIDB4YWMsIDB4YWQsIDB4YWUsIDB4YWYsCisgIDB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4YjYsIDB4YjcsCisgIDB4YjgsIDB4YjksIDB4YmEsIDB4YmIsIDB4YmMsIDB4YmQsIDB4YmUsIDB4YmYsCisgIDB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsCisgIDB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsCisgIDB4ZDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsCisgIDB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsIDB4ZGMsIDB4ZGQsIDB4ZGUsIDB4ZGYsCisgIDB4ZTAsIDB4ZTEsIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsCisgIDB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsCisgIDB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsCisgIDB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYKK307CisKKy8vQW4gaGVscGVyIHN0cnVjdCB0byBjaGVjayB3Y2hhcl90IGluZGV4IHdpdGhvdXQgZ2VuZXJhdGluZyB3YXJuaW5ncworLy91bmRlciBzb21lIGNvbXBpbGVycyAoZ2NjKSBiZWNhdXNlIG9mIGEgbGltaXRlZCByYW5nZSBvZiB2YWx1ZQorLy8od2hlbiB3Y2hhcl90IGlzIHVuc2lnbmVkKQordGVtcGxhdGUgPGJvb2wgX0lzU2lnbmVkPgorc3RydWN0IF9XQ2hhckluZGV4VDsKKworI2lmICEoZGVmaW5lZCAoX19CT1JMQU5EQ19fKSAmJiAhZGVmaW5lZChfX2xpbnV4X18pKSAmJiBcCisgICAgIShkZWZpbmVkIChfX0dOVUNfXykgJiYgKGRlZmluZWQgKF9fTUlOR1czMl9fKSB8fCBkZWZpbmVkIChfX0NZR1dJTl9fKSkpICYmIFwKKyAgICAhZGVmaW5lZCAoX19JQ0wpCitfU1RMUF9URU1QTEFURV9OVUxMCitzdHJ1Y3QgX1dDaGFySW5kZXhUPHRydWU+IHsKKyAgc3RhdGljIGJvb2wgaW5fcmFuZ2Uod2NoYXJfdCBjLCBzaXplX3QgdXBwZXJCb3VuZCkgeworICAgIHJldHVybiBjID49IDAgJiYgc2l6ZV90KGMpIDwgdXBwZXJCb3VuZDsKKyAgfQorfTsKKyNlbmRpZgorCitfU1RMUF9URU1QTEFURV9OVUxMCitzdHJ1Y3QgX1dDaGFySW5kZXhUPGZhbHNlPiB7CisgIHN0YXRpYyBib29sIGluX3JhbmdlKHdjaGFyX3QgYywgc2l6ZV90IHVwcGVyQm91bmQpIHsKKyAgICByZXR1cm4gc2l6ZV90KGMpIDwgdXBwZXJCb3VuZDsKKyAgfQorfTsKKwordHlwZWRlZiBfV0NoYXJJbmRleFQ8d2NoYXJfdCgtMSkgPCAwPiBfV0NoYXJJbmRleDsKKworLy8gU29tZSBoZWxwZXIgZnVuY3Rpb25zIHVzZWQgaW4gY3R5cGU8Pjo6c2Nhbl9pcyBhbmQgc2Nhbl9pc19ub3QuCisKK3N0cnVjdCBfQ3R5cGVfaXNfbWFzayA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxjaGFyLCBib29sPiB7CisgIGN0eXBlX2Jhc2U6Om1hc2sgX01hc2s7CisgIGNvbnN0IGN0eXBlX2Jhc2U6Om1hc2sqIF9NX3RhYmxlOworCisgIF9DdHlwZV9pc19tYXNrKGN0eXBlX2Jhc2U6Om1hc2sgX19tLCBjb25zdCBjdHlwZV9iYXNlOjptYXNrKiBfX3QpIDogX01hc2soX19tKSwgX01fdGFibGUoX190KSB7fQorICBib29sIG9wZXJhdG9yKCkoY2hhciBfX2MpIGNvbnN0IHsgcmV0dXJuIChfTV90YWJsZVsodW5zaWduZWQgY2hhcikgX19jXSAmIF9NYXNrKSAhPSAwOyB9Cit9OworCitzdHJ1Y3QgX0N0eXBlX25vdF9tYXNrIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPGNoYXIsIGJvb2w+IHsKKyAgY3R5cGVfYmFzZTo6bWFzayBfTWFzazsKKyAgY29uc3QgY3R5cGVfYmFzZTo6bWFzayogX01fdGFibGU7CisKKyAgX0N0eXBlX25vdF9tYXNrKGN0eXBlX2Jhc2U6Om1hc2sgX19tLCBjb25zdCBjdHlwZV9iYXNlOjptYXNrKiBfX3QpIDogX01hc2soX19tKSwgX01fdGFibGUoX190KSB7fQorICBib29sIG9wZXJhdG9yKCkoY2hhciBfX2MpIGNvbnN0IHsgcmV0dXJuIChfTV90YWJsZVsodW5zaWduZWQgY2hhcikgX19jXSAmIF9NYXNrKSA9PSAwOyB9Cit9OworCitjdHlwZTxjaGFyPjo6Y3R5cGUoY29uc3QgY3R5cGVfYmFzZTo6bWFzayAqIF9fdGFiLCBib29sIF9fZGVsLCBzaXplX3QgX19yZWZzKSA6CisgIGxvY2FsZTo6ZmFjZXQoX19yZWZzKSwKKyAgX01fY3R5cGVfdGFibGUoX190YWIgPyBfX3RhYiA6IGNsYXNzaWNfdGFibGUoKSksCisgIF9NX2RlbGV0ZShfX3RhYiAmJiBfX2RlbCkKK3t9CisKK2N0eXBlPGNoYXI+Ojp+Y3R5cGUoKSB7CisgIGlmIChfTV9kZWxldGUpCisgICAgZGVsZXRlW10gX19DT05TVF9DQVNUKGN0eXBlX2Jhc2U6Om1hc2sgKiwgX01fY3R5cGVfdGFibGUpOworfQorCitjb25zdCBjaGFyKgorI2lmIGRlZmluZWQgKF9fRE1DX18pCitfU1RMUF9ERUNMU1BFQworI2VuZGlmCitjdHlwZTxjaGFyPjo6c2Nhbl9pcyhjdHlwZV9iYXNlOjptYXNrICBfX20sIGNvbnN0IGNoYXIqIF9fbG93LCBjb25zdCBjaGFyKiBfX2hpZ2gpIGNvbnN0Cit7IHJldHVybiBfU1RMUF9TVEQ6OmZpbmRfaWYoX19sb3csIF9faGlnaCwgX0N0eXBlX2lzX21hc2soX19tLCBfTV9jdHlwZV90YWJsZSkpOyB9CisKK2NvbnN0IGNoYXIqCisjaWYgZGVmaW5lZCAoX19ETUNfXykKK19TVExQX0RFQ0xTUEVDCisjZW5kaWYKK2N0eXBlPGNoYXI+OjpzY2FuX25vdChjdHlwZV9iYXNlOjptYXNrICBfX20sIGNvbnN0IGNoYXIqIF9fbG93LCBjb25zdCBjaGFyKiBfX2hpZ2gpIGNvbnN0Cit7IHJldHVybiBfU1RMUF9TVEQ6OmZpbmRfaWYoX19sb3csIF9faGlnaCwgX0N0eXBlX25vdF9tYXNrKF9fbSwgX01fY3R5cGVfdGFibGUpKTsgfQorCitjaGFyIGN0eXBlPGNoYXI+Ojpkb190b3VwcGVyKGNoYXIgX19jKSBjb25zdAoreyByZXR1cm4gKGNoYXIpIF9TX3VwcGVyWyh1bnNpZ25lZCBjaGFyKSBfX2NdOyB9CitjaGFyIGN0eXBlPGNoYXI+Ojpkb190b2xvd2VyKGNoYXIgX19jKSBjb25zdAoreyByZXR1cm4gKGNoYXIpIF9TX2xvd2VyWyh1bnNpZ25lZCBjaGFyKSBfX2NdOyB9CisKK2NvbnN0IGNoYXIqIGN0eXBlPGNoYXI+Ojpkb190b3VwcGVyKGNoYXIqIF9fbG93LCBjb25zdCBjaGFyKiBfX2hpZ2gpIGNvbnN0IHsKKyAgZm9yICggOyBfX2xvdyA8IF9faGlnaDsgKytfX2xvdykKKyAgICAqX19sb3cgPSAoY2hhcikgX1NfdXBwZXJbKHVuc2lnbmVkIGNoYXIpICpfX2xvd107CisgIHJldHVybiBfX2hpZ2g7Cit9Citjb25zdCBjaGFyKiBjdHlwZTxjaGFyPjo6ZG9fdG9sb3dlcihjaGFyKiBfX2xvdywgY29uc3QgY2hhciogX19oaWdoKSBjb25zdCB7CisgIGZvciAoIDsgX19sb3cgPCBfX2hpZ2g7ICsrX19sb3cpCisgICAgKl9fbG93ID0gKGNoYXIpIF9TX2xvd2VyWyh1bnNpZ25lZCBjaGFyKSAqX19sb3ddOworICByZXR1cm4gX19oaWdoOworfQorCitjaGFyCitjdHlwZTxjaGFyPjo6ZG9fd2lkZW4oY2hhciBfX2MpIGNvbnN0IHsgcmV0dXJuIF9fYzsgfQorCitjb25zdCBjaGFyKgorY3R5cGU8Y2hhcj46OmRvX3dpZGVuKGNvbnN0IGNoYXIqIF9fbG93LCBjb25zdCBjaGFyKiBfX2hpZ2gsCisgICAgICAgICAgICAgICAgICAgICAgY2hhciogX190bykgY29uc3QgeworICBfU1RMUF9QUklWIF9fY29weV90cml2aWFsKF9fbG93LCBfX2hpZ2gsIF9fdG8pOworICByZXR1cm4gX19oaWdoOworfQorY2hhcgorY3R5cGU8Y2hhcj46OmRvX25hcnJvdyhjaGFyIF9fYywgY2hhciAvKiBkZmF1bHQgKi8gKSBjb25zdCB7IHJldHVybiBfX2M7IH0KK2NvbnN0IGNoYXIqCitjdHlwZTxjaGFyPjo6ZG9fbmFycm93KGNvbnN0IGNoYXIqIF9fbG93LCBjb25zdCBjaGFyKiBfX2hpZ2gsCisgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgLyogZGZhdWx0ICovLCBjaGFyKiBfX3RvKSBjb25zdCB7CisgIF9TVExQX1BSSVYgX19jb3B5X3RyaXZpYWwoX19sb3csIF9faGlnaCwgX190byk7CisgIHJldHVybiBfX2hpZ2g7Cit9CisKKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQorCitzdHJ1Y3QgX0N0eXBlX3dfaXNfbWFzayA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjx3Y2hhcl90LCBib29sPiB7CisgIGN0eXBlX2Jhc2U6Om1hc2sgTTsKKyAgY29uc3QgY3R5cGVfYmFzZTo6bWFzayogdGFibGU7CisKKyAgX0N0eXBlX3dfaXNfbWFzayhjdHlwZV9iYXNlOjptYXNrIG0sIGNvbnN0IGN0eXBlX2Jhc2U6Om1hc2sqIHQpCisgICAgOiBNKG0pLCB0YWJsZSh0KSB7fQorICBib29sIG9wZXJhdG9yKCkod2NoYXJfdCBjKSBjb25zdAorICB7IHJldHVybiBfV0NoYXJJbmRleDo6aW5fcmFuZ2UoYywgY3R5cGU8Y2hhcj46OnRhYmxlX3NpemUpICYmICh0YWJsZVtjXSAmIE0pOyB9Cit9OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGN0eXBlPHdjaGFyX3Q+CisKK2N0eXBlPHdjaGFyX3Q+Ojp+Y3R5cGUoKSB7fQorCisKK2Jvb2wgY3R5cGU8d2NoYXJfdD46OmRvX2lzKGN0eXBlX2Jhc2U6Om1hc2sgIG0sIHdjaGFyX3QgYykgY29uc3QgeworICBjb25zdCBjdHlwZV9iYXNlOjptYXNrICogdGFibGUgPSBjdHlwZTxjaGFyPjo6Y2xhc3NpY190YWJsZSgpOworICByZXR1cm4gX1dDaGFySW5kZXg6OmluX3JhbmdlKGMsIGN0eXBlPGNoYXI+Ojp0YWJsZV9zaXplKSAmJiAobSAmIHRhYmxlW2NdKTsKK30KKworY29uc3Qgd2NoYXJfdCogY3R5cGU8d2NoYXJfdD46OmRvX2lzKGNvbnN0IHdjaGFyX3QqIGxvdywgY29uc3Qgd2NoYXJfdCogaGlnaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHlwZV9iYXNlOjptYXNrICogdmVjKSBjb25zdCB7CisgIC8vIGJvcmlzIDogbm90IGNsZWFyIGlmIHRoaXMgaXMgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvLi4uCisgIGNvbnN0IGN0eXBlX2Jhc2U6Om1hc2sgKiB0YWJsZSA9IGN0eXBlPGNoYXI+OjpjbGFzc2ljX3RhYmxlKCk7CisgIHdjaGFyX3QgYzsKKyAgZm9yICggOyBsb3cgPCBoaWdoOyArK2xvdywgKyt2ZWMpIHsKKyAgICBjID0gKmxvdzsKKyAgICAqdmVjID0gX1dDaGFySW5kZXg6OmluX3JhbmdlKGMsIGN0eXBlPGNoYXI+Ojp0YWJsZV9zaXplKSA/IHRhYmxlW2NdIDogY3R5cGVfYmFzZTo6bWFzaygwKTsKKyAgfQorICByZXR1cm4gaGlnaDsKK30KKworY29uc3Qgd2NoYXJfdCoKK2N0eXBlPHdjaGFyX3Q+Ojpkb19zY2FuX2lzKGN0eXBlX2Jhc2U6Om1hc2sgIG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBsb3csIGNvbnN0IHdjaGFyX3QqIGhpZ2gpIGNvbnN0IHsKKyAgcmV0dXJuIGZpbmRfaWYobG93LCBoaWdoLCBfQ3R5cGVfd19pc19tYXNrKG0sIGN0eXBlPGNoYXI+OjpjbGFzc2ljX3RhYmxlKCkpKTsKK30KKworCitjb25zdCB3Y2hhcl90KgorY3R5cGU8d2NoYXJfdD46OmRvX3NjYW5fbm90KGN0eXBlX2Jhc2U6Om1hc2sgIG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogbG93LCBjb25zdCB3Y2hhcl90KiBoaWdoKSBjb25zdCB7CisgIHJldHVybiBmaW5kX2lmKGxvdywgaGlnaCwgbm90MShfQ3R5cGVfd19pc19tYXNrKG0sIGN0eXBlPGNoYXI+OjpjbGFzc2ljX3RhYmxlKCkpKSk7Cit9CisKK3djaGFyX3QgY3R5cGU8d2NoYXJfdD46OmRvX3RvdXBwZXIod2NoYXJfdCBjKSBjb25zdCB7CisgIHJldHVybiBfV0NoYXJJbmRleDo6aW5fcmFuZ2UoYywgY3R5cGU8Y2hhcj46OnRhYmxlX3NpemUpID8gKHdjaGFyX3QpX1NfdXBwZXJbY10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjOworfQorCitjb25zdCB3Y2hhcl90KgorY3R5cGU8d2NoYXJfdD46OmRvX3RvdXBwZXIod2NoYXJfdCogbG93LCBjb25zdCB3Y2hhcl90KiBoaWdoKSBjb25zdCB7CisgIGZvciAoIDsgbG93IDwgaGlnaDsgKytsb3cpIHsKKyAgICB3Y2hhcl90IGMgPSAqbG93OworICAgICpsb3cgPSBfV0NoYXJJbmRleDo6aW5fcmFuZ2UoYywgY3R5cGU8Y2hhcj46OnRhYmxlX3NpemUpID8gKHdjaGFyX3QpX1NfdXBwZXJbY10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGM7CisgIH0KKyAgcmV0dXJuIGhpZ2g7Cit9CisKK3djaGFyX3QgY3R5cGU8d2NoYXJfdD46OmRvX3RvbG93ZXIod2NoYXJfdCBjKSBjb25zdCB7CisgIHJldHVybiBfV0NoYXJJbmRleDo6aW5fcmFuZ2UoYywgY3R5cGU8Y2hhcj46OnRhYmxlX3NpemUpID8gKHdjaGFyX3QpX1NfbG93ZXJbY10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjOworfQorCitjb25zdCB3Y2hhcl90KgorY3R5cGU8d2NoYXJfdD46OmRvX3RvbG93ZXIod2NoYXJfdCogbG93LCBjb25zdCB3Y2hhcl90KiBoaWdoKSBjb25zdCB7CisgIGZvciAoIDsgbG93IDwgaGlnaDsgKytsb3cpIHsKKyAgICB3Y2hhcl90IGMgPSAqbG93OworICAgICpsb3cgPSBfV0NoYXJJbmRleDo6aW5fcmFuZ2UoYywgY3R5cGU8Y2hhcj46OnRhYmxlX3NpemUpID8gKHdjaGFyX3QpX1NfbG93ZXJbY10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGM7CisgIH0KKyAgcmV0dXJuIGhpZ2g7Cit9CisKK3djaGFyX3QgY3R5cGU8d2NoYXJfdD46OmRvX3dpZGVuKGNoYXIgYykgY29uc3QgeworICByZXR1cm4gKHdjaGFyX3QpKHVuc2lnbmVkIGNoYXIpYzsKK30KKworY29uc3QgY2hhcioKK2N0eXBlPHdjaGFyX3Q+Ojpkb193aWRlbihjb25zdCBjaGFyKiBsb3csIGNvbnN0IGNoYXIqIGhpZ2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgd2NoYXJfdCogZGVzdCkgY29uc3QgeworICB3aGlsZSAobG93ICE9IGhpZ2gpCisgICAgKmRlc3QrKyA9ICh3Y2hhcl90KSh1bnNpZ25lZCBjaGFyKSpsb3crKzsKKyAgcmV0dXJuIGhpZ2g7Cit9CisKK2NoYXIgY3R5cGU8d2NoYXJfdD46OmRvX25hcnJvdyh3Y2hhcl90IGMsIGNoYXIgZGZhdWx0KSBjb25zdAoreyByZXR1cm4gKHVuc2lnbmVkIGNoYXIpYyA9PSBjID8gKGNoYXIpYyA6IGRmYXVsdDsgfQorCitjb25zdCB3Y2hhcl90KiBjdHlwZTx3Y2hhcl90Pjo6ZG9fbmFycm93KGNvbnN0IHdjaGFyX3QqIGxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogaGlnaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBkZmF1bHQsIGNoYXIqIGRlc3QpIGNvbnN0IHsKKyAgd2hpbGUgKGxvdyAhPSBoaWdoKSB7CisgICAgd2NoYXJfdCBjID0gKmxvdysrOworICAgICpkZXN0KysgPSAodW5zaWduZWQgY2hhciljID09IGMgPyAoY2hhciljIDogZGZhdWx0OworICB9CisKKyAgcmV0dXJuIGhpZ2g7Cit9CisKKyMgZW5kaWYKK19TVExQX0VORF9OQU1FU1BBQ0UKKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKKwpkaWZmIC0tZ2l0IGEvc3JjL2N4YS5jIGIvc3JjL2N4YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ODE3MGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY3hhLmMKQEAgLTAsMCArMSwxOTggQEAKKyNpbmNsdWRlICJzdGxwb3J0X3ByZWZpeC5oIgorCisjaWYgZGVmaW5lZChfX3VuaXgpICYmIGRlZmluZWQoX19HTlVDX18pCisKKyNpZmRlZiBfX0ZyZWVCU0RfXworIyAgaW5jbHVkZSA8b3NyZWxkYXRlLmg+CisjZW5kaWYKKworI2lmIChkZWZpbmVkKF9fRnJlZUJTRF9fKSAmJiAoX19GcmVlQlNEX3ZlcnNpb24gPCA1MDMwMDEpKSB8fCBkZWZpbmVkKF9fc3VuKSB8fCBkZWZpbmVkIChfX2hwdXgpCisvKiBOb3RlOiBfX2N4YV9maW5hbGl6ZSBhbmQgX19jeGFfYXRleGl0IHByZXNlbnQgaW4gbGliYyBpbiBGcmVlQlNEIDUuMyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKKy8qIF9fYXNtX18gKCIuc3ltdmVyICIgIl9fY3hhX2ZpbmFsaXplIiAiLCIgIl9fY3hhX2ZpbmFsaXplIiAiQCIgIlNUTFBPUlRfNV8wXzAiKTsgKi8KKy8qIF9fYXNtX18gKCIuc3ltdmVyICIgIl9fY3hhX2ZpbmFsaXplIiAiLCIgIl9fY3hhX2ZpbmFsaXplIiAiQEAiICJTVExQT1JUXzVfMF8wIik7ICovCisKKy8qIE5vdCBhdG9taWMhICovCisvKiBCdXQgd2UgY2FuIHVzZSBzdGF0aWMgbXV0ZXhlcyBoZXJlOiBJIGhvcGUgdGhhdCBwZXJmb3JtYW5jZSBpc3N1ZSBpc24ndCB2ZXJ5CisgICBzaWduaWZpY2FudCBvbiB1bmxvYWRpbmcgKGZvciBvbmx5IGZldyBjYWxscywgfjEwKSAtIHB0ciAqLworCisvKgorI2RlZmluZSBhdG9taWNfY29tcGFyZV9hbmRfZXhjaGFuZ2VfYm9vbF9hY3EobWVtLCBuZXd2YWwsIG9sZHZhbCkgXAorICAoeyBfX3R5cGVvZiAobWVtKSBfX2dtZW1wID0gKG1lbSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgX190eXBlb2YgKCptZW0pIF9fZ25ld3ZhbCA9IChuZXd2YWwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAqX19nbWVtcCA9PSAob2xkdmFsKSA/ICgqX19nbWVtcCA9IF9fZ25ld3ZhbCwgMCkgOiAxOyB9KQorKi8KKworZW51bSB7CisgIGVmX2ZyZWUsIC8qIGBlZl9mcmVlJyBNVVNUIGJlIHplcm8hICAqLworICBlZl91cywKKyAgZWZfb24sCisgIGVmX2F0LAorICBlZl9jeGEKK307CisKK3N0cnVjdCBleGl0X2Z1bmN0aW9uCit7CisgIC8qIGBmbGF2b3VyJyBzaG91bGQgYmUgb2YgdHlwZSBvZiB0aGUgYGVudW0nIGFib3ZlIGJ1dCBzaW5jZSB3ZSBuZWVkCisgICAgIHRoaXMgZWxlbWVudCBpbiBhbiBhdG9taWMgb3BlcmF0aW9uIHdlIGhhdmUgdG8gdXNlIGBsb25nIGludCcuICAqLworICBsb25nIGludCBmbGF2b3I7CisgIHVuaW9uIHsKKyAgICB2b2lkICgqYXQpKHZvaWQpOworICAgIHN0cnVjdCB7CisgICAgICB2b2lkICgqZm4pKGludCBzdGF0dXMsIHZvaWQgKmFyZyk7CisgICAgICB2b2lkICphcmc7CisgICAgfSBvbjsKKyAgICBzdHJ1Y3QgeworICAgICAgdm9pZCAoKmZuKSh2b2lkICphcmcsIGludCBzdGF0dXMpOworICAgICAgdm9pZCAqYXJnOworICAgICAgdm9pZCAqZHNvX2hhbmRsZTsKKyAgICB9IGN4YTsKKyAgfSBmdW5jOworfTsKKworc3RydWN0IGV4aXRfZnVuY3Rpb25fbGlzdAoreworICBzdHJ1Y3QgZXhpdF9mdW5jdGlvbl9saXN0ICpuZXh0OworICBzaXplX3QgaWR4OworICBzdHJ1Y3QgZXhpdF9mdW5jdGlvbiBmbnNbMzJdOworfTsKKworc3RydWN0IGV4aXRfZnVuY3Rpb24gKl9fbmV3X2V4aXRmbiAodm9pZCk7CisKKy8qIFJlZ2lzdGVyIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJ5IGV4aXQgb3Igd2hlbiBhIHNoYXJlZCBsaWJyYXJ5CisgICBpcyB1bmxvYWRlZC4gIFRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgZnJvbSBjb2RlIGdlbmVyYXRlZCBieQorICAgdGhlIEMrKyBjb21waWxlci4gICovCitpbnQgX19jeGFfYXRleGl0KHZvaWQgKCpmdW5jKSh2b2lkICopLCB2b2lkICphcmcsIHZvaWQgKmQpCit7CisgIHN0cnVjdCBleGl0X2Z1bmN0aW9uICpuZXcgPSBfX25ld19leGl0Zm4gKCk7CisKKyAgaWYgKCBuZXcgPT0gTlVMTCApCisgICAgcmV0dXJuIC0xOworCisgIG5ldy0+Zmxhdm9yID0gZWZfY3hhOworICBuZXctPmZ1bmMuY3hhLmZuID0gKHZvaWQgKCopICh2b2lkICosIGludCkpIGZ1bmM7CisgIG5ldy0+ZnVuYy5jeGEuYXJnID0gYXJnOworICBuZXctPmZ1bmMuY3hhLmRzb19oYW5kbGUgPSBkOworICByZXR1cm4gMDsKK30KKworCisvKiBXZSBjaGFuZ2UgZ2xvYmFsIGRhdGEsIHNvIHdlIG5lZWQgbG9ja2luZy4gICovCisjaWZkZWYgX19saW51eF9fCitzdGF0aWMgcHRocmVhZF9tdXRleF90IGxvY2sgPSBQVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUSUFMSVpFUl9OUDsKKyNlbmRpZgorLyogI2lmZGVmIF9fRnJlZUJTRF9fICovCisjaWYgMAorc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBsb2NrID0KKyAgeyBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRSAvKiBQVEhSRUFEX01VVEVYX0RFRkFVTFQgKi8sIFBUSFJFQURfUFJJT19OT05FLCB7TlVMTCxOVUxMfSwKKyAgICBOVUxMLCB7IE5VTEwgfSwgLyogTVVURVhfRkxBR1NfUFJJVkFURSAqLyAweDEsIDAsIDAsIDAsIHtOVUxMLCBOVUxMfSwKKyAgICB7IDAsIDAsIDAsIDAgfSB9OworI2VuZGlmCisjaWZkZWYgX19zdW4KK3N0YXRpYyBwdGhyZWFkX211dGV4X3QgbG9jayA9CisgIHt7MCwgMCwgMCwgUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkUsIF9NVVRFWF9NQUdJQ30sIHt7ezB9fX0sIDB9OworI2VuZGlmCisjaWZkZWYgX19ocHV4CitzdGF0aWMgcHRocmVhZF9tdXRleF90IGxvY2sgPSBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRV9JTklUSUFMSVpFUl9OUDsKKyMgIGlmZGVmIF9faWE2NAordm9pZCAqX19kc29faGFuZGxlID0gKHZvaWQgKikgJl9fZHNvX2hhbmRsZTsKKyMgIGVuZGlmCisjZW5kaWYKKworCitzdGF0aWMgc3RydWN0IGV4aXRfZnVuY3Rpb25fbGlzdCBpbml0aWFsOworc3RydWN0IGV4aXRfZnVuY3Rpb25fbGlzdCAqX19leGl0X2Z1bmNzID0gJmluaXRpYWw7CisKK3N0cnVjdCBleGl0X2Z1bmN0aW9uICpfX25ld19leGl0Zm4odm9pZCkKK3sKKyAgc3RydWN0IGV4aXRfZnVuY3Rpb25fbGlzdCAqbDsKKyAgc2l6ZV90IGkgPSAwOworCisjaWZuZGVmIF9fRnJlZUJTRF9fCisgIHB0aHJlYWRfbXV0ZXhfbG9jayggJmxvY2sgKTsKKyNlbmRpZgorCisgIGZvciAobCA9IF9fZXhpdF9mdW5jczsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkgeworICAgIGZvciAoaSA9IDA7IGkgPCBsLT5pZHg7ICsraSkKKyAgICAgIGlmIChsLT5mbnNbaV0uZmxhdm9yID09IGVmX2ZyZWUpCisgICAgICAgIGJyZWFrOworICAgIGlmICggaSA8IGwtPmlkeCApCisgICAgICBicmVhazsKKworICAgIGlmIChsLT5pZHggPCBzaXplb2YgKGwtPmZucykgLyBzaXplb2YgKGwtPmZuc1swXSkpIHsKKyAgICAgIGkgPSBsLT5pZHgrKzsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmIChsID09IE5VTEwpIHsKKyAgICBsID0gKHN0cnVjdCBleGl0X2Z1bmN0aW9uX2xpc3QgKiltYWxsb2MoIHNpemVvZihzdHJ1Y3QgZXhpdF9mdW5jdGlvbl9saXN0KSApOworICAgIGlmIChsICE9IE5VTEwpIHsKKyAgICAgIGwtPm5leHQgPSBfX2V4aXRfZnVuY3M7CisgICAgICBfX2V4aXRfZnVuY3MgPSBsOworCisgICAgICBsLT5pZHggPSAxOworICAgICAgaSA9IDA7CisgICAgfQorICB9CisKKyAgLyogTWFyayBlbnRyeSBhcyB1c2VkLCBidXQgd2UgZG9uJ3Qga25vdyB0aGUgZmxhdm9yIG5vdy4gICovCisgIGlmICggbCAhPSBOVUxMICkKKyAgICBsLT5mbnNbaV0uZmxhdm9yID0gZWZfdXM7CisKKyNpZm5kZWYgX19GcmVlQlNEX18KKyAgcHRocmVhZF9tdXRleF91bmxvY2soICZsb2NrICk7CisjZW5kaWYKKworICByZXR1cm4gbCA9PSBOVUxMID8gTlVMTCA6ICZsLT5mbnNbaV07Cit9CisKKy8qIElmIEQgaXMgbm9uLU5VTEwsIGNhbGwgYWxsIGZ1bmN0aW9ucyByZWdpc3RlcmVkIHdpdGggYF9fY3hhX2F0ZXhpdCcKKyAgIHdpdGggdGhlIHNhbWUgZHNvIGhhbmRsZS4gIE90aGVyd2lzZSwgaWYgRCBpcyBOVUxMLCBjYWxsIGFsbCBvZiB0aGUKKyAgIHJlZ2lzdGVyZWQgaGFuZGxlcnMuICAqLworCisvKgorICogTm90ZSwgdGhhdCBvcmlnaW5hbCBfX2N4YV9maW5hbGl6ZSBkb24ndCB1c2UgbG9jaywgYnV0IHVzZSBfX2V4aXRfZnVuY3MKKyAqIGkuZS4gZ2xvYmFsIGRhdGEuCisgKi8KK3ZvaWQgX19jeGFfZmluYWxpemUodm9pZCAqZCkKK3sKKyAgc3RydWN0IGV4aXRfZnVuY3Rpb25fbGlzdCAqZnVuY3M7CisKKyNpZm5kZWYgX19GcmVlQlNEX18KKyAgcHRocmVhZF9tdXRleF9sb2NrKCAmbG9jayApOworI2VuZGlmCisKKyAgZm9yIChmdW5jcyA9IF9fZXhpdF9mdW5jczsgZnVuY3M7IGZ1bmNzID0gZnVuY3MtPm5leHQpIHsKKyAgICBzdHJ1Y3QgZXhpdF9mdW5jdGlvbiAqZjsKKworICAgIGZvciAoZiA9ICZmdW5jcy0+Zm5zW2Z1bmNzLT5pZHggLSAxXTsgZiA+PSAmZnVuY3MtPmZuc1swXTsgLS1mKSB7CisgICAgICBpZiAoIChkID09IE5VTEwgfHwgZCA9PSBmLT5mdW5jLmN4YS5kc29faGFuZGxlKSAmJiAoZi0+Zmxhdm9yID09IGVmX2N4YSkgKSB7CisgICAgICAgIGYtPmZsYXZvciA9IGVmX2ZyZWU7CisgICAgICAgICgqZi0+ZnVuYy5jeGEuZm4pIChmLT5mdW5jLmN4YS5hcmcsIDApOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIFJlbW92ZSB0aGUgcmVnaXN0ZXJlZCBmb3JrIGhhbmRsZXJzLiAgV2UgZG8gbm90IGhhdmUgdG8KKyAgICAgdW5yZWdpc3RlciBhbnl0aGluZyBpZiB0aGUgcHJvZ3JhbSBpcyBnb2luZyB0byB0ZXJtaW5hdGUgYW55d2F5LiAgKi8KKyNpZmRlZiBVTlJFR0lTVEVSX0FURk9SSworICBpZiAoZCAhPSBOVUxMKQorICAgIFVOUkVHSVNURVJfQVRGT1JLIChkKTsKKyNlbmRpZgorI2lmbmRlZiBfX0ZyZWVCU0RfXworICBwdGhyZWFkX211dGV4X3VubG9jayggJmxvY2sgKTsKKyNlbmRpZgorfQorCisvKiBfX2FzbV9fICgiLnN5bXZlciAiICJfX2N4YV9maW5hbGl6ZSIgIiwiICJfX2N4YV9maW5hbGl6ZSIgIkBAIiAiU1RMUE9SVF81XzBfMCIpOyAqLworLyogdm9pZCBfX2N4YV9maW5hbGl6ZSh2b2lkICpkKSBfX2F0dHJpYnV0ZV9fICgod2VhaykpOyAqLworCisjZW5kaWYgLyogT1MgbmFtZSAqLworI2VuZGlmIC8qIF9fdW5peCAqLworCmRpZmYgLS1naXQgYS9zcmMvZGV0YWlscy9mc3RyZWFtX3N0ZGlvLmNwcCBiL3NyYy9kZXRhaWxzL2ZzdHJlYW1fc3RkaW8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzOTJmZmQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZGV0YWlscy9mc3RyZWFtX3N0ZGlvLmNwcApAQCAtMCwwICsxLDM4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmIGRlZmluZWQgIChfX1NVTlBQUk9fQ0MpICAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fTkVXX0NfSEVBREVSUykKKyMgIGluY2x1ZGUgPHRpbWUuaD4KKy8vIEZvciBzdW5wcm8sIGl0IGNob2tlcyBpZiB0aW1lLmggaXMgaW5jbHVkZWQgdGhyb3VnaCBzdGF0LmgKKyNlbmRpZgorCisjaW5jbHVkZSA8ZnN0cmVhbT4KKworI2lmZGVmIF9fQ1lHV0lOX18KKyMgIGRlZmluZSBfX2ludDY0IGxvbmcgbG9uZworI2VuZGlmCisKKyNpbmNsdWRlIDxjc3RkaW8+CisjaWYgIWRlZmluZWQoX19JU0NQUF9fKQorZXh0ZXJuICJDIiB7CisjICBpbmNsdWRlIDxzeXMvc3RhdC5oPgorfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKCBfX01TTF9fICkKKyMgIGluY2x1ZGUgPHVuaXguaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX0lTQ1BQX18pCisjICBpbmNsdWRlIDxjX2xvY2FsZV9pcy9maWxlc3RhdC5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fQkVPU19fKSAmJiBkZWZpbmVkKF9fSU5URUxfXykKKyMgIGluY2x1ZGUgPGZjbnRsLmg+CisjICBpbmNsdWRlIDxzeXMvc3RhdC5oPiAgICAgICAgIC8vIEZvciBfZnN0YXQKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfTVNWQykgfHwgZGVmaW5lZCAoX19NSU5HVzMyX18pCisjICBpbmNsdWRlIDxmY250bC5oPgorIyAgZGVmaW5lIFNfSVJFQUQgX1NfSVJFQUQKKyMgIGRlZmluZSBTX0lXUklURSBfU19JV1JJVEUKKyMgIGRlZmluZSBTX0lGUkVHIF9TX0lGUkVHCisgICAgIC8vIG1hcCBwZXJtaXNzaW9uIG1hc2tzCisjICBpZm5kZWYgU19JUlVTUgorIyAgICBkZWZpbmUgU19JUlVTUiBfU19JUkVBRAorIyAgICBkZWZpbmUgU19JV1VTUiBfU19JV1JJVEUKKyMgIGVuZGlmCisjICBpZm5kZWYgU19JUkdSUAorIyAgICBkZWZpbmUgU19JUkdSUCBfU19JUkVBRAorIyAgICBkZWZpbmUgU19JV0dSUCBfU19JV1JJVEUKKyMgIGVuZGlmCisjICBpZm5kZWYgU19JUk9USAorIyAgICBkZWZpbmUgU19JUk9USCBfU19JUkVBRAorIyAgICBkZWZpbmUgU19JV09USCBfU19JV1JJVEUKKyMgIGVuZGlmCisKKyMgIGlmbmRlZiBPX1JET05MWQorIyAgICBkZWZpbmUgT19SRE9OTFkgX09fUkRPTkxZCisjICAgIGRlZmluZSBPX1dST05MWSBfT19XUk9OTFkKKyMgICAgZGVmaW5lIE9fUkRXUiAgIF9PX1JEV1IKKyMgICAgZGVmaW5lIE9fQVBQRU5EIF9PX0FQUEVORAorIyAgICBkZWZpbmUgT19DUkVBVCAgX09fQ1JFQVQKKyMgICAgZGVmaW5lIE9fVFJVTkMgIF9PX1RSVU5DCisjICAgIGRlZmluZSBPX1RFWFQgICBfT19URVhUCisjICAgIGRlZmluZSBPX0JJTkFSWSBfT19CSU5BUlkKKyMgIGVuZGlmCisKKyMgIGlmbmRlZiBPX0FDQ01PREUKKyMgICAgZGVmaW5lIE9fQUNDTU9ERSAoT19SRE9OTFl8T19XUk9OTFl8T19SRFdSKQorIyAgZW5kaWYKKyNlbmRpZgorCitjb25zdCBfU1RMUF9mZCBJTlZBTElEX1NUTFBfRkQgPSAtMTsKKworCisjICBpZmRlZiBfX01TTF9fCisjICAgIGRlZmluZSBfT19URVhUIDB4MAorIyAgICBpZiAhZGVmaW5lZCggT19URVhUICkKKyMgICAgICBkZWZpbmUgT19URVhUIF9PX1RFWFQKKyMgICAgZW5kaWYKKyMgICAgZGVmaW5lIF9TX0lGUkVHIFNfSUZSRUcKKyMgICAgZGVmaW5lIFNfSVJFQUQgICAgICAgIFNfSVJVU1IKKyMgICAgZGVmaW5lIFNfSVdSSVRFICAgICAgIFNfSVdVU1IKKyMgICAgZGVmaW5lIFNfSUVYRUMgICAgICAgIFNfSVhVU1IKKyMgICAgZGVmaW5lIF9TX0lXUklURSBTX0lXUklURQorIyAgICBkZWZpbmUgX1NfSVJFQUQgU19JUkVBRAorIyAgICBkZWZpbmUgX29wZW4gb3BlbgorIyAgICBkZWZpbmUgX2Nsb3NlIGNsb3NlCisjICAgIGRlZmluZSBfcmVhZCByZWFkCisjICAgIGRlZmluZSBfd3JpdGUgd3JpdGUKKyMgIGVuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisvLyBDb21wYXJlIHdpdGggc3RyZWFtb2ZmIGRlZmluaXRpb24gaW4gc3RsL2NoYXJfdHJhaXRzLmghCisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfREVGQVVMVF9GSUxFX09GRlNFVCkgfHwgXAorICAgICghZGVmaW5lZChfTEFSR0VGSUxFX1NPVVJDRSkgJiYgIWRlZmluZWQoX0xBUkdFRklMRTY0X1NPVVJDRSkpCisjICBkZWZpbmUgRk9QRU4gZm9wZW4KKyMgIGRlZmluZSBGU0VFSyBmc2VlaworIyAgZGVmaW5lIEZTVEFUIGZzdGF0CisjICBkZWZpbmUgU1RBVCAgc3RhdAorIyAgZGVmaW5lIEZURUxMIGZ0ZWxsCisjZWxzZQorIyAgZGVmaW5lIEZPUEVOIGZvcGVuNjQKKyMgIGRlZmluZSBGU0VFSyBmc2Vla282NAorIyAgZGVmaW5lIEZTVEFUIGZzdGF0NjQKKyMgIGRlZmluZSBTVEFUICBzdGF0NjQKKyMgIGRlZmluZSBGVEVMTCBmdGVsbG82NAorI2VuZGlmCisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKworLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgX0ZpbGVidWZfYmFzZS4KKworc3RhdGljIGJvb2wgX19pc19yZWd1bGFyX2ZpbGUoX1NUTFBfZmQgZmQpIHsKKyAgc3RydWN0IFNUQVQgYnVmOworICByZXR1cm4gRlNUQVQoZmQsICZidWYpID09IDAgJiYgKGJ1Zi5zdF9tb2RlICYgU19JRlJFRykgIT0gMCA7Cit9CisKKy8vIE51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRoZSBmaWxlLgorc3RhdGljIHN0cmVhbW9mZiBfX2ZpbGVfc2l6ZShfU1RMUF9mZCBmZCkgeworICBzdHJlYW1vZmYgcmV0ID0gMDsKKworICBzdHJ1Y3QgU1RBVCBidWY7CisgIGlmIChGU1RBVChmZCwgJmJ1ZikgPT0gMCAmJiAoYnVmLnN0X21vZGUgJiBTX0lGUkVHKSAhPSAwKQorICAgIHJldCA9IGJ1Zi5zdF9zaXplID4gMCA/IGJ1Zi5zdF9zaXplIDogMDsKKworICByZXR1cm4gcmV0OworfQorCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKworLy8gQWxsIHZlcnNpb24gb2YgVW5peCBoYXZlIG1tYXAgYW5kIGxzZWVrIHN5c3RlbSBjYWxscy4gIFNvbWUgYWxzbyBoYXZlCisvLyBsb25nZXIgdmVyc2lvbnMgb2YgdGhvc2Ugc3lzdGVtIGNhbGxzIHRvIGFjY29tbW9kYXRlIDY0LWJpdCBvZmZzZXRzLgorLy8gSWYgd2UncmUgb24gYSBVbml4IHN5c3RlbSwgZGVmaW5lIHNvbWUgbWFjcm9zIHRvIGVuY2Fwc3VsYXRlIHRob3NlCisvLyBkaWZmZXJlbmNlcy4KKworc2l6ZV90IF9GaWxlYnVmX2Jhc2U6Ol9NX3BhZ2Vfc2l6ZSA9IDQwOTY7CisKK19GaWxlYnVmX2Jhc2U6Ol9GaWxlYnVmX2Jhc2UoKQorICA6IF9NX2ZpbGVfaWQoSU5WQUxJRF9TVExQX0ZEKSwKKyAgICBfTV9vcGVubW9kZSgwKSwKKyAgICBfTV9pc19vcGVuKGZhbHNlKSwKKyAgICBfTV9zaG91bGRfY2xvc2UoZmFsc2UpCit7fQorCit2b2lkIF9GaWxlYnVmX2Jhc2U6Ol9TX2luaXRpYWxpemUoKQoreworCit9CisKKy8vIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgZmlsZS4gIFRoaXMgaXMgYSB3cmFwcGVyIGZvciBzdGF0LgorLy8gUmV0dXJucyB6ZXJvIGlmIHRoZSBzaXplIGNhbm5vdCBiZSBkZXRlcm1pbmVkIG9yIGlzIGlsbC1kZWZpbmVkLgorc3RyZWFtb2ZmIF9GaWxlYnVmX2Jhc2U6Ol9NX2ZpbGVfc2l6ZSgpCit7CisgIHJldHVybiBfU1RMUF9QUklWIF9fZmlsZV9zaXplKF9NX2ZpbGVfaWQpOworfQorCitib29sIF9GaWxlYnVmX2Jhc2U6Ol9NX29wZW4oY29uc3QgY2hhciogbmFtZSwgaW9zX2Jhc2U6Om9wZW5tb2RlIG9wZW5tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgcGVybWlzc2lvbikKK3sKKyAgX1NUTFBfZmQgZmlsZV9ubzsKKworICBpZiAoX01faXNfb3BlbikKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gdXNlIEZJTEUtYmFzZWQgaS9vCisgIGNvbnN0IGNoYXIqIGZsYWdzOworCisgIHN3aXRjaCAob3Blbm1vZGUgJiAofmlvc19iYXNlOjphdGUpKSB7CisgICAgY2FzZSBpb3NfYmFzZTo6b3V0OgorICAgIGNhc2UgaW9zX2Jhc2U6Om91dCB8IGlvc19iYXNlOjp0cnVuYzoKKyAgICAgIGZsYWdzID0gInciOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGlvc19iYXNlOjpvdXQgfCBpb3NfYmFzZTo6YmluYXJ5OgorICAgIGNhc2UgaW9zX2Jhc2U6Om91dCB8IGlvc19iYXNlOjp0cnVuYyB8IGlvc19iYXNlOjpiaW5hcnk6CisgICAgICBmbGFncyA9ICJ3YiI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgaW9zX2Jhc2U6Om91dCB8IGlvc19iYXNlOjphcHA6CisgICAgICBmbGFncyA9ICJhIjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBpb3NfYmFzZTo6b3V0IHwgaW9zX2Jhc2U6OmFwcCB8IGlvc19iYXNlOjpiaW5hcnk6CisgICAgICBmbGFncyA9ICJhYiI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgaW9zX2Jhc2U6OmluOgorICAgICAgZmxhZ3MgPSAiciI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6OmJpbmFyeToKKyAgICAgIGZsYWdzID0gInJiIjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0OgorICAgICAgZmxhZ3MgPSAicisiOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQgfCBpb3NfYmFzZTo6YmluYXJ5OgorICAgICAgZmxhZ3MgPSAicitiIjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0IHwgaW9zX2Jhc2U6OnRydW5jOgorICAgICAgZmxhZ3MgPSAidysiOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQgfCBpb3NfYmFzZTo6dHJ1bmMgfCBpb3NfYmFzZTo6YmluYXJ5OgorICAgICAgZmxhZ3MgPSAidytiIjsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGFib3ZlIGFyZSB0aGUgb25seSBjb21iaW5hdGlvbnMgb2YKKyAgICAgIHJldHVybiBmYWxzZTsgICAgICAgICAgICAgICAvLyBmbGFncyBhbGxvd2VkIGJ5IHRoZSBDKysgc3RhbmRhcmQuCisgIH0KKworICAvLyBmYnAgOiBUT0RPIDogc2V0IHBlcm1pc3Npb25zICEKKyAgKHZvaWQpcGVybWlzc2lvbjsgLy8gY3VycmVudGx5IHVudXNlZCAgICAvLypUWSAwMi8yNi8yMDAwIC0gYWRkZWQgdG8gc3VwcHJlc3Mgd2FybmluZyBtZXNzYWdlCisgIF9NX2ZpbGUgPSBGT1BFTihuYW1lLCBmbGFncyk7CisKKyAgaWYgKF9NX2ZpbGUpIHsKKyAgICBmaWxlX25vID0gZmlsZW5vKF9NX2ZpbGUpOworICB9IGVsc2UgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIHVuc2V0IGJ1ZmZlcmluZyBpbW1lZGlhdGVseQorICBzZXRidWYoX01fZmlsZSwgMCk7CisKKyAgX01faXNfb3BlbiA9IHRydWU7CisKKyAgaWYgKG9wZW5tb2RlICYgaW9zX2Jhc2U6OmF0ZSkgeworICAgIGlmIChGU0VFSyhfTV9maWxlLCAwLCBTRUVLX0VORCkgIT0gMCkKKyAgICAgIF9NX2lzX29wZW4gPSBmYWxzZTsKKyAgfQorCisgIF9NX2ZpbGVfaWQgPSBmaWxlX25vOworICBfTV9zaG91bGRfY2xvc2UgPSBfTV9pc19vcGVuOworICBfTV9vcGVubW9kZSA9IG9wZW5tb2RlOworCisgIGlmIChfTV9pc19vcGVuKQorICAgIF9NX3JlZ3VsYXJfZmlsZSA9IF9TVExQX1BSSVYgX19pc19yZWd1bGFyX2ZpbGUoX01fZmlsZV9pZCk7CisKKyAgcmV0dXJuIChfTV9pc19vcGVuICE9IDApOworfQorCisKK2Jvb2wgX0ZpbGVidWZfYmFzZTo6X01fb3Blbihjb25zdCBjaGFyKiBuYW1lLCBpb3NfYmFzZTo6b3Blbm1vZGUgb3Blbm1vZGUpCit7CisgIC8vIFRoaXMgZG9lc24ndCByZWFsbHkgZ3JhbnQgZXZlcnlvbmUgaW4gdGhlIHdvcmxkIHJlYWQvd3JpdGUKKyAgLy8gYWNjZXNzLiAgT24gVW5peCwgZmlsZS1jcmVhdGlvbiBzeXN0ZW0gY2FsbHMgYWx3YXlzIGNsZWFyCisgIC8vIGJpdHMgdGhhdCBhcmUgc2V0IGluIHRoZSB1bWFzayBmcm9tIHRoZSBwZXJtaXNzaW9ucyBmbGFnLgorICByZXR1cm4gdGhpcy0+X01fb3BlbihuYW1lLCBvcGVubW9kZSwgU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lSR1JQIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNfSVdHUlAgfCBTX0lST1RIIHwgU19JV09USCk7Cit9CisKKy8vIEFzc29jaWF0ZWQgdGhlIGZpbGVidWYgd2l0aCBhIGZpbGUgZGVzY3JpcHRvciBwb2ludGluZyB0byBhbiBhbHJlYWR5LQorLy8gb3BlbiBmaWxlLiAgTW9kZSBpcyBzZXQgdG8gYmUgY29uc2lzdGVudCB3aXRoIHRoZSB3YXkgdGhhdCB0aGUgZmlsZQorLy8gd2FzIG9wZW5lZC4KK2Jvb2wgX0ZpbGVidWZfYmFzZTo6X01fb3BlbiggaW50IGZpbGVfbm8sIGlvc19iYXNlOjpvcGVubW9kZSApCit7CisgIGlmIChfTV9pc19vcGVuIHx8IGZpbGVfbm8gPCAwKQorICAgIHJldHVybiBmYWxzZTsKKworICBzdHJ1Y3QgU1RBVCBidWY7CisgIGlmIChGU1RBVChmaWxlX25vLCAmYnVmKSAhPSAwKQorICAgIHJldHVybiBmYWxzZTsKKyAgaW50IG1vZGUgPSBidWYuc3RfbW9kZTsKKworICBzd2l0Y2ggKCBtb2RlICYgKFNfSVdSSVRFIHwgU19JUkVBRCkgKSB7CisgICAgY2FzZSBTX0lSRUFEOgorICAgICAgX01fb3Blbm1vZGUgPSBpb3NfYmFzZTo6aW47CisgICAgICBicmVhazsKKyAgICBjYXNlIFNfSVdSSVRFOgorICAgICAgX01fb3Blbm1vZGUgPSBpb3NfYmFzZTo6b3V0OworICAgICAgYnJlYWs7CisgICAgY2FzZSAoU19JV1JJVEUgfCBTX0lSRUFEKToKKyAgICAgIF9NX29wZW5tb2RlID0gaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6Om91dDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgX01fZmlsZV9pZCA9IGZpbGVfbm87CisgIF9NX2lzX29wZW4gPSB0cnVlOworICBfTV9zaG91bGRfY2xvc2UgPSBmYWxzZTsKKyAgX01fcmVndWxhcl9maWxlID0gX1NUTFBfUFJJViBfX2lzX3JlZ3VsYXJfZmlsZShfTV9maWxlX2lkKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgX0ZpbGVidWZfYmFzZTo6X01fY2xvc2UoKQoreworICBpZiAoIV9NX2lzX29wZW4pCisgICAgcmV0dXJuIGZhbHNlOworCisgIGJvb2wgb2sgPSBfTV9zaG91bGRfY2xvc2UgPyAoZmNsb3NlKF9NX2ZpbGUpID09IDApIDogdHJ1ZTsKKworICBfTV9pc19vcGVuID0gX01fc2hvdWxkX2Nsb3NlID0gZmFsc2U7CisgIF9NX29wZW5tb2RlID0gMDsKKyAgcmV0dXJuIG9rOworfQorCisvLyBSZWFkIHVwIHRvIG4gY2hhcmFjdGVycyBpbnRvIGEgYnVmZmVyLiAgUmV0dXJuIHZhbHVlIGlzIG51bWJlciBvZgorLy8gY2hhcmFjdGVycyByZWFkLgorcHRyZGlmZl90IF9GaWxlYnVmX2Jhc2U6Ol9NX3JlYWQoY2hhciogYnVmLCBwdHJkaWZmX3QgbikgeworICByZXR1cm4gZnJlYWQoYnVmLCAxLCBuLCBfTV9maWxlKTsKK30KKworLy8gV3JpdGUgbiBjaGFyYWN0ZXJzIGZyb20gYSBidWZmZXIuICBSZXR1cm4gdmFsdWU6IHRydWUgaWYgd2UgbWFuYWdlZAorLy8gdG8gd3JpdGUgdGhlIGVudGlyZSBidWZmZXIsIGZhbHNlIGlmIHdlIGRpZG4ndC4KK2Jvb2wgX0ZpbGVidWZfYmFzZTo6X01fd3JpdGUoY2hhciogYnVmLCBwdHJkaWZmX3QgbikKK3sKKyAgZm9yICg7OykgeworICAgIHB0cmRpZmZfdCB3cml0dGVuID0gZndyaXRlKGJ1ZiwgMSwgbiwgX01fZmlsZSk7CisKKyAgICBpZiAobiA9PSB3cml0dGVuKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAod3JpdHRlbiA+IDAgJiYgd3JpdHRlbiA8IG4pIHsKKyAgICAgIG4gLT0gd3JpdHRlbjsKKyAgICAgIGJ1ZiArPSB3cml0dGVuOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9Cit9CisKKy8vIFdyYXBwZXIgZm9yIGxzZWVrIG9yIHRoZSBsaWtlLgorc3RyZWFtb2ZmIF9GaWxlYnVmX2Jhc2U6Ol9NX3NlZWsoc3RyZWFtb2ZmIG9mZnNldCwgaW9zX2Jhc2U6OnNlZWtkaXIgZGlyKQoreworICBpbnQgd2hlbmNlOworCisgIHN3aXRjaCAoIGRpciApIHsKKyAgICBjYXNlIGlvc19iYXNlOjpiZWc6CisgICAgICBpZiAob2Zmc2V0IDwgMCAvKiB8fCBvZmZzZXQgPiBfTV9maWxlX3NpemUoKSAqLyApCisgICAgICAgIHJldHVybiBzdHJlYW1vZmYoLTEpOworICAgICAgd2hlbmNlID0gU0VFS19TRVQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIGlvc19iYXNlOjpjdXI6CisgICAgICB3aGVuY2UgPSBTRUVLX0NVUjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgaW9zX2Jhc2U6OmVuZDoKKyAgICAgIGlmICgvKiBvZmZzZXQgPiAwIHx8ICovICAtb2Zmc2V0ID4gX01fZmlsZV9zaXplKCkgKQorICAgICAgICByZXR1cm4gc3RyZWFtb2ZmKC0xKTsKKyAgICAgIHdoZW5jZSA9IFNFRUtfRU5EOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBzdHJlYW1vZmYoLTEpOworICB9CisKKyAgaWYgKCBGU0VFSyhfTV9maWxlLCBvZmZzZXQsIHdoZW5jZSkgPT0gMCApIHsKKyAgICByZXR1cm4gRlRFTEwoX01fZmlsZSk7CisgIH0KKworICByZXR1cm4gc3RyZWFtb2ZmKC0xKTsKK30KKworCisvLyBBdHRlbXB0cyB0byBtZW1vcnktbWFwIGxlbiBieXRlcyBvZiB0aGUgY3VycmVudCBmaWxlLCBzdGFydGluZworLy8gYXQgcG9zaXRpb24gb2Zmc2V0LiAgUHJlY29uZGl0aW9uOiBvZmZzZXQgaXMgYSBtdWx0aXBsZSBvZiB0aGUKKy8vIHBhZ2Ugc2l6ZS4gIFBvc3Rjb25kaXRpb246IHJldHVybiB2YWx1ZSBpcyBhIG51bGwgcG9pbnRlciBpZiB0aGUKKy8vIG1lbW9yeSBtYXBwaW5nIGZhaWxlZC4gIE90aGVyd2lzZSB0aGUgcmV0dXJuIHZhbHVlIGlzIGEgcG9pbnRlciB0bworLy8gdGhlIG1lbW9yeS1tYXBwZWQgZmlsZSBhbmQgdGhlIGZpbGUgcG9zaXRpb24gaXMgc2V0IHRvIG9mZnNldC4KK3ZvaWQgKl9GaWxlYnVmX2Jhc2U6Ol9NX21tYXAoc3RyZWFtb2ZmLCBzdHJlYW1vZmYgKQoreworICByZXR1cm4gMDsKK30KKwordm9pZCBfRmlsZWJ1Zl9iYXNlOjpfTV91bm1hcCh2b2lkKiwgc3RyZWFtb2ZmKQoreworICAvLyBwcmVjb25kaXRpb24gOiB0aGVyZSBpcyBhIHZhbGlkIG1hcHBpbmcgYXQgdGhlIG1vbWVudAorfQorCitfU1RMUF9FTkRfTkFNRVNQQUNFCmRpZmYgLS1naXQgYS9zcmMvZGV0YWlscy9mc3RyZWFtX3VuaXN0ZC5jcHAgYi9zcmMvZGV0YWlscy9mc3RyZWFtX3VuaXN0ZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ0MDg4MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9kZXRhaWxzL2ZzdHJlYW1fdW5pc3RkLmNwcApAQCAtMCwwICsxLDM0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmIGRlZmluZWQgIChfX1NVTlBQUk9fQ0MpICAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fTkVXX0NfSEVBREVSUykKKyMgIGluY2x1ZGUgPHRpbWUuaD4KKy8vIEZvciBzdW5wcm8sIGl0IGNob2tlcyBpZiB0aW1lLmggaXMgaW5jbHVkZWQgdGhyb3VnaCBzdGF0LmgKKyNlbmRpZgorCisjaW5jbHVkZSA8ZnN0cmVhbT4KKworI2lmZGVmIF9fQ1lHV0lOX18KKyMgIGRlZmluZSBfX2ludDY0IGxvbmcgbG9uZworI2VuZGlmCisKK2V4dGVybiAiQyIgeworLy8gb3Blbi9jbG9zZS9yZWFkL3dyaXRlCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4gICAgICAgICAgIC8vIEZvciBzdGF0CisjaWYgIWRlZmluZWQgKF9DUkFZKSAmJiAhIGRlZmluZWQgKF9fRU1YX18pCisjICBpbmNsdWRlIDxzeXMvbW1hbi5oPiAgICAgICAgICAgLy8gRm9yIG1tYXAKKyNlbmRpZgorCisvLyAgb24gSFAtVVggMTEsIHRoaXMgb25lIGNvbnRyYWRpY3RzIHdpdGggcHRocmVhZC5oIG9uIHB0aHJlYWRfYXRmb3JrLCB1bmxlc3Mgd2UgdW5zZXQgdGhpcworI2lmIGRlZmluZWQgKF9faHB1eCkgJiYgZGVmaW5lZCAoX19HTlVDX18pCisjICB1bmRlZiBfSU5DTFVERV9QT1NJWDFDX1NPVVJDRQorI2VuZGlmCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorfQorCisjaWZkZWYgX19BUFBMRV9fCisjICBpbmNsdWRlIDxzeXMvc3lzY3RsLmg+CisjZW5kaWYKKworY29uc3QgX1NUTFBfZmQgSU5WQUxJRF9TVExQX0ZEID0gLTE7CisKKyNpZm5kZWYgT19BQ0NNT0RFCisjICBkZWZpbmUgT19BQ0NNT0RFIChPX1JET05MWXxPX1dST05MWXxPX1JEV1IpCisjZW5kaWYKKworLy8gQ29tcGFyZSB3aXRoIHN0cmVhbW9mZiBkZWZpbml0aW9uIGluIHN0bC9jaGFyX3RyYWl0cy5oIQorI2lmIGRlZmluZWQgKF9TVExQX1VTRV9ERUZBVUxUX0ZJTEVfT0ZGU0VUKSB8fCBcCisgICAgKCFkZWZpbmVkKF9MQVJHRUZJTEVfU09VUkNFKSAmJiAhZGVmaW5lZCAoX0xBUkdFRklMRTY0X1NPVVJDRSkpCisjICBkZWZpbmUgRlNUQVQgZnN0YXQKKyMgIGRlZmluZSBTVEFUICBzdGF0CisjICBkZWZpbmUgTFNFRUsgbHNlZWsKKyMgIGRlZmluZSBNTUFQICBtbWFwCisjICBkZWZpbmUgT1BFTiAgb3BlbgorI2Vsc2UKKyMgIGRlZmluZSBGU1RBVCBmc3RhdDY0CisjICBkZWZpbmUgU1RBVCAgc3RhdDY0CisjICBkZWZpbmUgTFNFRUsgbHNlZWs2NAorIyAgZGVmaW5lIE1NQVAgIG1tYXA2NAorIyAgZGVmaW5lIE9QRU4gIG9wZW42NAorI2VuZGlmCisKKyNpZm5kZWYgTUFQX0ZBSUxFRCAvKiBNTUFQIGZhaWx1cmUgcmV0dXJuIGNvZGUgKi8KKyMgIGRlZmluZSBNQVBfRkFJTEVEIC0xCisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKK3N0YXRpYyBpb3NfYmFzZTo6b3Blbm1vZGUgZmxhZ190b19vcGVubW9kZShpbnQgbW9kZSkKK3sKKyAgaW9zX2Jhc2U6Om9wZW5tb2RlIHJldCA9IGlvc19iYXNlOjpfX2RlZmF1bHRfbW9kZTsKKworICBzd2l0Y2ggKCBtb2RlICYgT19BQ0NNT0RFICkgeworICAgIGNhc2UgT19SRE9OTFk6CisgICAgICByZXQgPSBpb3NfYmFzZTo6aW47CisgICAgICBicmVhazsKKyAgICBjYXNlIE9fV1JPTkxZOgorICAgICAgcmV0ID0gaW9zX2Jhc2U6Om91dDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgT19SRFdSOgorICAgICAgcmV0ID0gaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6Om91dDsKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKCBtb2RlICYgT19BUFBFTkQgKQorICAgIHJldCB8PSBpb3NfYmFzZTo6YXBwOworCisgIHJldHVybiByZXQ7Cit9CisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKworLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgX0ZpbGVidWZfYmFzZS4KKworc3RhdGljIGJvb2wgX19pc19yZWd1bGFyX2ZpbGUoX1NUTFBfZmQgZmQpIHsKKyAgc3RydWN0IFNUQVQgYnVmOworICByZXR1cm4gRlNUQVQoZmQsICZidWYpID09IDAgJiYgU19JU1JFRyhidWYuc3RfbW9kZSk7Cit9CisKKy8vIE51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRoZSBmaWxlLgorc3RhdGljIHN0cmVhbW9mZiBfX2ZpbGVfc2l6ZShfU1RMUF9mZCBmZCkgeworICBzdHJlYW1vZmYgcmV0ID0gMDsKKworICBzdHJ1Y3QgU1RBVCBidWY7CisgIGlmIChGU1RBVChmZCwgJmJ1ZikgPT0gMCAmJiBTX0lTUkVHKGJ1Zi5zdF9tb2RlKSkKKyAgICByZXQgPSBidWYuc3Rfc2l6ZSA+IDAgPyBidWYuc3Rfc2l6ZSA6IDA7CisKKyAgcmV0dXJuIHJldDsKK30KKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK3NpemVfdCBfRmlsZWJ1Zl9iYXNlOjpfTV9wYWdlX3NpemUgPSA0MDk2OworCitfRmlsZWJ1Zl9iYXNlOjpfRmlsZWJ1Zl9iYXNlKCkKKyAgOiBfTV9maWxlX2lkKElOVkFMSURfU1RMUF9GRCksCisgICAgX01fb3Blbm1vZGUoMCksCisgICAgX01faXNfb3BlbihmYWxzZSksCisgICAgX01fc2hvdWxkX2Nsb3NlKGZhbHNlKQore30KKwordm9pZCBfRmlsZWJ1Zl9iYXNlOjpfU19pbml0aWFsaXplKCkKK3sKKyNpZiBkZWZpbmVkIChfX0FQUExFX18pCisgIGludCBtaWJbMl07CisgIHNpemVfdCBwYWdlc2l6ZSwgbGVuOworICBtaWJbMF0gPSBDVExfSFc7CisgIG1pYlsxXSA9IEhXX1BBR0VTSVpFOworICBsZW4gPSBzaXplb2YocGFnZXNpemUpOworICBzeXNjdGwobWliLCAyLCAmcGFnZXNpemUsICZsZW4sIE5VTEwsIDApOworICBfTV9wYWdlX3NpemUgPSBwYWdlc2l6ZTsKKyNlbGlmIGRlZmluZWQgKF9fREpHUFApICYmIGRlZmluZWQgKF9DUkFZKQorICBfTV9wYWdlX3NpemUgPSBCVUZTSVo7CisjZWxzZQorICBfTV9wYWdlX3NpemUgPSBzeXNjb25mKF9TQ19QQUdFU0laRSk7CisjZW5kaWYKK30KKworLy8gUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBmaWxlLiAgVGhpcyBpcyBhIHdyYXBwZXIgZm9yIHN0YXQuCisvLyBSZXR1cm5zIHplcm8gaWYgdGhlIHNpemUgY2Fubm90IGJlIGRldGVybWluZWQgb3IgaXMgaWxsLWRlZmluZWQuCitzdHJlYW1vZmYgX0ZpbGVidWZfYmFzZTo6X01fZmlsZV9zaXplKCkKK3sKKyAgcmV0dXJuIF9TVExQX1BSSVYgX19maWxlX3NpemUoX01fZmlsZV9pZCk7Cit9CisKK2Jvb2wgX0ZpbGVidWZfYmFzZTo6X01fb3Blbihjb25zdCBjaGFyKiBuYW1lLCBpb3NfYmFzZTo6b3Blbm1vZGUgb3Blbm1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBwZXJtaXNzaW9uKQoreworICBfU1RMUF9mZCBmaWxlX25vOworCisgIGlmIChfTV9pc19vcGVuKQorICAgIHJldHVybiBmYWxzZTsKKworICBpbnQgZmxhZ3MgPSAwOworCisgIC8vIFVuaXggbWFrZXMgbm8gZGlzdGluY3Rpb24gYmV0d2VlbiB0ZXh0IGFuZCBiaW5hcnkgZmlsZXMuCisgIHN3aXRjaCAoIG9wZW5tb2RlICYgKH5pb3NfYmFzZTo6YXRlICYgfmlvc19iYXNlOjpiaW5hcnkpICkgeworICAgIGNhc2UgaW9zX2Jhc2U6Om91dDoKKyAgICBjYXNlIGlvc19iYXNlOjpvdXQgfCBpb3NfYmFzZTo6dHJ1bmM6CisgICAgICBmbGFncyA9IE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkM7CisgICAgICBicmVhazsKKyAgICBjYXNlIGlvc19iYXNlOjphcHA6CisgICAgY2FzZSBpb3NfYmFzZTo6b3V0IHwgaW9zX2Jhc2U6OmFwcDoKKyAgICAgIGZsYWdzID0gT19XUk9OTFkgfCBPX0NSRUFUIHwgT19BUFBFTkQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIGlvc19iYXNlOjppbjoKKyAgICAgIGZsYWdzID0gT19SRE9OTFk7CisgICAgICBwZXJtaXNzaW9uID0gMDsgICAgICAgICAgICAgLy8gSXJyZWxldmFudCB1bmxlc3Mgd2UncmUgd3JpdGluZy4KKyAgICAgIGJyZWFrOworICAgIGNhc2UgaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6Om91dDoKKyAgICAgIGZsYWdzID0gT19SRFdSOworICAgICAgYnJlYWs7CisgICAgY2FzZSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0IHwgaW9zX2Jhc2U6OnRydW5jOgorICAgICAgZmxhZ3MgPSBPX1JEV1IgfCBPX0NSRUFUIHwgT19UUlVOQzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6OmFwcDoKKyAgICBjYXNlIGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQgfCBpb3NfYmFzZTo6YXBwOgorICAgICAgZmxhZ3MgPSBPX1JEV1IgfCBPX0NSRUFUIHwgT19BUFBFTkQ7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgYWJvdmUgYXJlIHRoZSBvbmx5IGNvbWJpbmF0aW9ucyBvZgorICAgICAgcmV0dXJuIGZhbHNlOyAgICAgICAgICAgICAgIC8vIGZsYWdzIGFsbG93ZWQgYnkgdGhlIEMrKyBzdGFuZGFyZC4KKyAgfQorCisgIGZpbGVfbm8gPSBPUEVOKG5hbWUsIGZsYWdzLCBwZXJtaXNzaW9uKTsKKworICBpZiAoZmlsZV9ubyA8IDApCisgICAgcmV0dXJuIGZhbHNlOworCisgIF9NX2lzX29wZW4gPSB0cnVlOworCisgIGlmICgob3Blbm1vZGUgJiAoaW9zX2Jhc2U6OmF0ZSB8IGlvc19iYXNlOjphcHApKSAmJiAoTFNFRUsoZmlsZV9ubywgMCwgU0VFS19FTkQpID09IC0xKSkgeworICAgIF9NX2lzX29wZW4gPSBmYWxzZTsKKyAgfQorCisgIF9NX2ZpbGVfaWQgPSBmaWxlX25vOworICBfTV9zaG91bGRfY2xvc2UgPSBfTV9pc19vcGVuOworICBfTV9vcGVubW9kZSA9IG9wZW5tb2RlOworCisgIGlmIChfTV9pc19vcGVuKQorICAgIF9NX3JlZ3VsYXJfZmlsZSA9IF9TVExQX1BSSVYgX19pc19yZWd1bGFyX2ZpbGUoX01fZmlsZV9pZCk7CisKKyAgcmV0dXJuIChfTV9pc19vcGVuICE9IDApOworfQorCisKK2Jvb2wgX0ZpbGVidWZfYmFzZTo6X01fb3Blbihjb25zdCBjaGFyKiBuYW1lLCBpb3NfYmFzZTo6b3Blbm1vZGUgb3Blbm1vZGUpCit7CisgIC8vIFRoaXMgZG9lc24ndCByZWFsbHkgZ3JhbnQgZXZlcnlvbmUgaW4gdGhlIHdvcmxkIHJlYWQvd3JpdGUKKyAgLy8gYWNjZXNzLiAgT24gVW5peCwgZmlsZS1jcmVhdGlvbiBzeXN0ZW0gY2FsbHMgYWx3YXlzIGNsZWFyCisgIC8vIGJpdHMgdGhhdCBhcmUgc2V0IGluIHRoZSB1bWFzayBmcm9tIHRoZSBwZXJtaXNzaW9ucyBmbGFnLgorICByZXR1cm4gdGhpcy0+X01fb3BlbihuYW1lLCBvcGVubW9kZSwgU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lSR1JQIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNfSVdHUlAgfCBTX0lST1RIIHwgU19JV09USCk7Cit9CisKKy8vIEFzc29jaWF0ZWQgdGhlIGZpbGVidWYgd2l0aCBhIGZpbGUgZGVzY3JpcHRvciBwb2ludGluZyB0byBhbiBhbHJlYWR5LQorLy8gb3BlbiBmaWxlLiAgTW9kZSBpcyBzZXQgdG8gYmUgY29uc2lzdGVudCB3aXRoIHRoZSB3YXkgdGhhdCB0aGUgZmlsZQorLy8gd2FzIG9wZW5lZC4KK2Jvb2wgX0ZpbGVidWZfYmFzZTo6X01fb3BlbihpbnQgZmlsZV9ubywgaW9zX2Jhc2U6Om9wZW5tb2RlKQoreworICBpZiAoX01faXNfb3BlbiB8fCBmaWxlX25vIDwgMCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaW50IG1vZGUgPSBmY250bChmaWxlX25vLCBGX0dFVEZMKTsKKworICBpZiAobW9kZSA9PSAtMSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgX01fb3Blbm1vZGUgPSBmbGFnX3RvX29wZW5tb2RlKG1vZGUpOworICBfTV9maWxlX2lkID0gZmlsZV9ubzsKKworICBfTV9pc19vcGVuID0gdHJ1ZTsKKyAgX01fc2hvdWxkX2Nsb3NlID0gZmFsc2U7CisgIF9NX3JlZ3VsYXJfZmlsZSA9IF9TVExQX1BSSVYgX19pc19yZWd1bGFyX2ZpbGUoX01fZmlsZV9pZCk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIF9GaWxlYnVmX2Jhc2U6Ol9NX2Nsb3NlKCkKK3sKKyAgaWYgKCFfTV9pc19vcGVuKQorICAgIHJldHVybiBmYWxzZTsKKworICBib29sIG9rID0gX01fc2hvdWxkX2Nsb3NlID8gKGNsb3NlKF9NX2ZpbGVfaWQpID09IDApIDogdHJ1ZTsKKworICBfTV9pc19vcGVuID0gX01fc2hvdWxkX2Nsb3NlID0gZmFsc2U7CisgIF9NX29wZW5tb2RlID0gMDsKKyAgcmV0dXJuIG9rOworfQorCisvLyBSZWFkIHVwIHRvIG4gY2hhcmFjdGVycyBpbnRvIGEgYnVmZmVyLiAgUmV0dXJuIHZhbHVlIGlzIG51bWJlciBvZgorLy8gY2hhcmFjdGVycyByZWFkLgorcHRyZGlmZl90IF9GaWxlYnVmX2Jhc2U6Ol9NX3JlYWQoY2hhciogYnVmLCBwdHJkaWZmX3QgbikKK3sKKyAgcmV0dXJuIHJlYWQoX01fZmlsZV9pZCwgYnVmLCBuKTsKK30KKworLy8gV3JpdGUgbiBjaGFyYWN0ZXJzIGZyb20gYSBidWZmZXIuICBSZXR1cm4gdmFsdWU6IHRydWUgaWYgd2UgbWFuYWdlZAorLy8gdG8gd3JpdGUgdGhlIGVudGlyZSBidWZmZXIsIGZhbHNlIGlmIHdlIGRpZG4ndC4KK2Jvb2wgX0ZpbGVidWZfYmFzZTo6X01fd3JpdGUoY2hhciogYnVmLCBwdHJkaWZmX3QgbikKK3sKKyAgZm9yICg7OykgeworICAgIHB0cmRpZmZfdCB3cml0dGVuID0gd3JpdGUoX01fZmlsZV9pZCwgYnVmLCBuKTsKKworICAgIGlmIChuID09IHdyaXR0ZW4pIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGlmICh3cml0dGVuID4gMCAmJiB3cml0dGVuIDwgbikgeworICAgICAgbiAtPSB3cml0dGVuOworICAgICAgYnVmICs9IHdyaXR0ZW47CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KK30KKworLy8gV3JhcHBlciBmb3IgbHNlZWsgb3IgdGhlIGxpa2UuCitzdHJlYW1vZmYgX0ZpbGVidWZfYmFzZTo6X01fc2VlayhzdHJlYW1vZmYgb2Zmc2V0LCBpb3NfYmFzZTo6c2Vla2RpciBkaXIpCit7CisgIGludCB3aGVuY2U7CisKKyAgc3dpdGNoICggZGlyICkgeworICAgIGNhc2UgaW9zX2Jhc2U6OmJlZzoKKyAgICAgIGlmIChvZmZzZXQgPCAwIC8qIHx8IG9mZnNldCA+IF9NX2ZpbGVfc2l6ZSgpICovICkKKyAgICAgICAgcmV0dXJuIHN0cmVhbW9mZigtMSk7CisgICAgICB3aGVuY2UgPSBTRUVLX1NFVDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgaW9zX2Jhc2U6OmN1cjoKKyAgICAgIHdoZW5jZSA9IFNFRUtfQ1VSOworICAgICAgYnJlYWs7CisgICAgY2FzZSBpb3NfYmFzZTo6ZW5kOgorICAgICAgaWYgKC8qIG9mZnNldCA+IDAgfHwgKi8gIC1vZmZzZXQgPiBfTV9maWxlX3NpemUoKSApCisgICAgICAgIHJldHVybiBzdHJlYW1vZmYoLTEpOworICAgICAgd2hlbmNlID0gU0VFS19FTkQ7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIHN0cmVhbW9mZigtMSk7CisgIH0KKworICByZXR1cm4gTFNFRUsoX01fZmlsZV9pZCwgb2Zmc2V0LCB3aGVuY2UpOworfQorCisvLyBBdHRlbXB0cyB0byBtZW1vcnktbWFwIGxlbiBieXRlcyBvZiB0aGUgY3VycmVudCBmaWxlLCBzdGFydGluZworLy8gYXQgcG9zaXRpb24gb2Zmc2V0LiAgUHJlY29uZGl0aW9uOiBvZmZzZXQgaXMgYSBtdWx0aXBsZSBvZiB0aGUKKy8vIHBhZ2Ugc2l6ZS4gIFBvc3Rjb25kaXRpb246IHJldHVybiB2YWx1ZSBpcyBhIG51bGwgcG9pbnRlciBpZiB0aGUKKy8vIG1lbW9yeSBtYXBwaW5nIGZhaWxlZC4gIE90aGVyd2lzZSB0aGUgcmV0dXJuIHZhbHVlIGlzIGEgcG9pbnRlciB0bworLy8gdGhlIG1lbW9yeS1tYXBwZWQgZmlsZSBhbmQgdGhlIGZpbGUgcG9zaXRpb24gaXMgc2V0IHRvIG9mZnNldC4KK3ZvaWQqIF9GaWxlYnVmX2Jhc2U6Ol9NX21tYXAoc3RyZWFtb2ZmIG9mZnNldCwgc3RyZWFtb2ZmIGxlbikKK3sKKyAgdm9pZCogYmFzZTsKKyNpZiAhZGVmaW5lZCAoX19ESkdQUCkgJiYgIWRlZmluZWQgKF9DUkFZKQorICBiYXNlID0gTU1BUCgwLCBsZW4sIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIF9NX2ZpbGVfaWQsIG9mZnNldCk7CisgIGlmIChiYXNlICE9ICh2b2lkKilNQVBfRkFJTEVEKSB7CisgICAgaWYgKExTRUVLKF9NX2ZpbGVfaWQsIG9mZnNldCArIGxlbiwgU0VFS19TRVQpIDwgMCkgeworICAgICAgdGhpcy0+X01fdW5tYXAoYmFzZSwgbGVuKTsKKyAgICAgIGJhc2UgPSAwOworICAgIH0KKyAgfSBlbHNlCisgICAgYmFzZSA9MDsKKyNlbHNlCisgIF9TVExQX01BUktfUEFSQU1FVEVSX0FTX1VOVVNFRCgmb2Zmc2V0KQorICBfU1RMUF9NQVJLX1BBUkFNRVRFUl9BU19VTlVTRUQoJmxlbikKKyAgYmFzZSA9IDA7CisjZW5kaWYKKyAgcmV0dXJuIGJhc2U7Cit9CisKK3ZvaWQgX0ZpbGVidWZfYmFzZTo6X01fdW5tYXAodm9pZCogYmFzZSwgc3RyZWFtb2ZmIGxlbikKK3sKKyAgLy8gcHJlY29uZGl0aW9uIDogdGhlcmUgaXMgYSB2YWxpZCBtYXBwaW5nIGF0IHRoZSBtb21lbnQKKyNpZiAhZGVmaW5lZCAoX19ESkdQUCkgJiYgIWRlZmluZWQgKF9DUkFZKQorICBtdW5tYXAoKGNoYXIqKWJhc2UsIGxlbik7CisjZWxzZQorICBfU1RMUF9NQVJLX1BBUkFNRVRFUl9BU19VTlVTRUQoJmxlbikKKyAgX1NUTFBfTUFSS19QQVJBTUVURVJfQVNfVU5VU0VEKGJhc2UpCisjZW5kaWYKK30KKworX1NUTFBfRU5EX05BTUVTUEFDRQpkaWZmIC0tZ2l0IGEvc3JjL2RldGFpbHMvZnN0cmVhbV93aW4zMmlvLmNwcCBiL3NyYy9kZXRhaWxzL2ZzdHJlYW1fd2luMzJpby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjczZjM2NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9kZXRhaWxzL2ZzdHJlYW1fd2luMzJpby5jcHAKQEAgLTAsMCArMSw2MjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpbmNsdWRlIDxmc3RyZWFtPgorCisjaWYgIWRlZmluZWQgKF9TVExQX1dDRSkKKyMgIGlmZGVmIF9fQk9STEFORENfXworIyAgICBpbmNsdWRlIDxjZmNudGwuaD4gICAgICAgICAgIC8vIEZvciBfT19SRE9OTFksIGV0YworIyAgZWxzZQorIyAgICBpbmNsdWRlIDxpby5oPiAgICAgICAgICAgICAgIC8vIEZvciBfZ2V0X29zZmhhbmRsZQorIyAgICBpbmNsdWRlIDxmY250bC5oPiAgICAgICAgICAgIC8vIEZvciBfT19SRE9OTFksIGV0YworIyAgZW5kaWYKKyMgIGluY2x1ZGUgPHN5cy9zdGF0Lmg+ICAgICAgICAgLy8gRm9yIF9mc3RhdAorI2VuZGlmCisKKyNkZWZpbmUgX1RFWFRCVUZfU0laRSAweDEwMDAKKworY29uc3QgX1NUTFBfZmQgSU5WQUxJRF9TVExQX0ZEID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisKKyNpZiAhZGVmaW5lZCAoSU5WQUxJRF9TRVRfRklMRV9QT0lOVEVSKQorIyAgZGVmaW5lIElOVkFMSURfU0VUX0ZJTEVfUE9JTlRFUiAweGZmZmZmZmZmCisjZW5kaWYKKworI2lmbmRlZiBPX0FDQ01PREUKKyMgIGRlZmluZSBPX0FDQ01PREUgKE9fUkRPTkxZfE9fV1JPTkxZfE9fUkRXUikKKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworI2lmICFkZWZpbmVkKF9fTVNMX18pICYmICFkZWZpbmVkKF9TVExQX1dDRSkKK3N0YXRpYyBpb3NfYmFzZTo6b3Blbm1vZGUgZmxhZ190b19vcGVubW9kZShpbnQgbW9kZSkgeworICBpb3NfYmFzZTo6b3Blbm1vZGUgcmV0ID0gaW9zX2Jhc2U6Ol9fZGVmYXVsdF9tb2RlOworCisgIHN3aXRjaCAobW9kZSAmIE9fQUNDTU9ERSkgeworICBjYXNlIE9fUkRPTkxZOgorICAgIHJldCA9IGlvc19iYXNlOjppbjsgYnJlYWs7CisgIGNhc2UgT19XUk9OTFk6CisgICAgcmV0ID0gaW9zX2Jhc2U6Om91dDsgYnJlYWs7CisgIGNhc2UgT19SRFdSOgorICAgIHJldCA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQ7IGJyZWFrOworICB9CisKKyAgaWYgKG1vZGUgJiBPX0FQUEVORCkKKyAgICByZXQgfD0gaW9zX2Jhc2U6OmFwcDsKKworICBpZiAobW9kZSAmIE9fQklOQVJZKQorICAgIHJldCB8PSBpb3NfYmFzZTo6YmluYXJ5OworCisgIHJldHVybiByZXQ7Cit9CisjZW5kaWYKKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCisvLyBIZWxwZXIgZnVuY3Rpb25zIGZvciBfRmlsZWJ1Zl9iYXNlLgorCitzdGF0aWMgYm9vbCBfX2lzX3JlZ3VsYXJfZmlsZShfU1RMUF9mZCBmZCkgeworICBCWV9IQU5ETEVfRklMRV9JTkZPUk1BVElPTiBpbmZvOworCisgIC8vIFJldHVybiB0cnVlIGlmIHRoZSBmaWxlIGhhbmRsZSBpc24ndCBhIGRpcmVjdG9yeS4KKyAgcmV0dXJuIEdldEZpbGVJbmZvcm1hdGlvbkJ5SGFuZGxlKGZkLCAmaW5mbykgJiYgCisgICAgICAgICAoKGluZm8uZHdGaWxlQXR0cmlidXRlcyAmIEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWSkgPT0gMCk7Cit9CisKKy8vIE51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRoZSBmaWxlLgorc3RhdGljIHN0cmVhbW9mZiBfX2ZpbGVfc2l6ZShfU1RMUF9mZCBmZCkgeworICBzdHJlYW1vZmYgcmV0ID0gMDsKKworIExBUkdFX0lOVEVHRVIgbGk7CisgbGkuTG93UGFydCA9IEdldEZpbGVTaXplKGZkLCAodW5zaWduZWQgbG9uZyopICZsaS5IaWdoUGFydCk7CisgaWYgKGxpLkxvd1BhcnQgIT0gSU5WQUxJRF9GSUxFX1NJWkUgfHwgR2V0TGFzdEVycm9yKCkgPT0gTk9fRVJST1IpCisgICByZXQgPSBsaS5RdWFkUGFydDsKKworICByZXR1cm4gcmV0OworfQorCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKworLy8gVmlzdWFsIEMrKyBhbmQgSW50ZWwgdXNlIHRoaXMsIGJ1dCBub3QgTWV0cm93ZXJrcworLy8gQWxzbyBNaW5HVywgbXN2Y3J0LmRsbCAoYnV0IG5vdCBjcnRkbGwuZGxsKSBkZXBlbmRlbnQgdmVyc2lvbgorI2lmIChkZWZpbmVkIChfU1RMUF9NU1ZDX0xJQikgJiYgIWRlZmluZWQgKF9TVExQX1dDRSkpIHx8IFwKKyAgICAoZGVmaW5lZCAoX19NSU5HVzMyX18pICYmIGRlZmluZWQgKF9fTVNWQ1JUX18pKQorCisvLyBmY250bChmaWxlbm8sIEZfR0VURkwpIGZvciBNaWNyb3NvZnQgbGlicmFyeQorLy8gJ3NlbWktZG9jdW1lbnRlZCcgZGVmaW5lczoKKyMgIGRlZmluZSBJT0lORk9fTDJFICAgICAgICAgIDUKKyMgIGRlZmluZSBJT0lORk9fQVJSQVlfRUxUUyAgICgxIDw8IElPSU5GT19MMkUpCisjICBkZWZpbmUgX3Bpb2luZm8oaSkgKCBfX3Bpb2luZm9bKGkpID4+IElPSU5GT19MMkVdICsgXAorICAgICAgICAgICAgICAoKGkpICYgKElPSU5GT19BUlJBWV9FTFRTIC0gMSkpICkKKyMgIGRlZmluZSBGQVBQRU5EICAgICAgICAgMHgyMCAgICAvLyBPX0FQUEVORCBmbGFnCisjICBkZWZpbmUgRlRFWFQgICAgICAgICAgIDB4ODAgICAgLy8gT19URVhUIGZsYWcKKy8vIGVuZCBvZiAnc2VtaS1kb2N1bWVudGVkJyBkZWZpbmVzCisKKy8vICdzZW1pLWRvY3VtZW50ZWQnIGludGVybmFsIHN0cnVjdHVyZQorZXh0ZXJuICJDIiB7CisgIHN0cnVjdCBpb2luZm8geworICAgIGxvbmcgb3NmaG5kOyAgICAvLyB0aGUgcmVhbCBvcyBIQU5ETEUKKyAgICBjaGFyIG9zZmlsZTsgICAgLy8gZmlsZSBoYW5kbGUgZmxhZ3MKKyAgICBjaGFyIHBpcGVjaDsgICAgLy8gcGlwZSBidWZmZXIKKyMgIGlmIGRlZmluZWQgKF9NVCkKKyAgICAvLyBtdWx0aS10aHJlYWRlZCBsb2NraW5nCisgICAgaW50IGxvY2tpbml0ZmxhZzsKKyAgICBDUklUSUNBTF9TRUNUSU9OIGxvY2s7CisjICBlbmRpZgorICB9OworIyAgaWYgZGVmaW5lZCAoX19NSU5HVzMyX18pCisgX19NSU5HV19JTVBPUlQgaW9pbmZvICogX19waW9pbmZvW107CisjICBlbHNlCisgIGV4dGVybiBfQ1JUSU1QIGlvaW5mbyAqIF9fcGlvaW5mb1tdOworIyAgZW5kaWYKK30gLy8gZXh0ZXJuICJDIgorLy8gZW5kIG9mICdzZW1pLWRvY3VtZW50ZWQnIGRlY2xhcmF0aW9ucworCitzdGF0aWMgaW9zX2Jhc2U6Om9wZW5tb2RlIF9nZXRfb3NmZmxhZ3MoaW50IGZkLCBIQU5ETEUgb3NoYW5kbGUpIHsKKyAgY2hhciBkb3NmbGFncyA9IDA7CisgIGlmIChmZCA+PSAwKQorICAgIGRvc2ZsYWdzID0gX3Bpb2luZm8oZmQpLT5vc2ZpbGU7CisgIC8vZWxzZQorICAgIC8vdGhlIGZpbGUgd2lsbCBiZSBjb25zaWRlcmVkIGFzIG9wZW4gaW4gYmluYXJ5IG1vZGUgd2l0aCBubyBhcHBlbmQgYXR0cmlidXRlCisgIC8vIGVuZCBvZiAnc2VtaS1kb2N1bWVudGVkJyBzdHVmZgorCisgIGludCBtb2RlID0gMDsKKyAgaWYgKGRvc2ZsYWdzICYgRkFQUEVORCkKKyAgICBtb2RlIHw9IE9fQVBQRU5EOworCisgIGlmIChkb3NmbGFncyAmIEZURVhUKQorICAgIG1vZGUgfD0gT19URVhUOworICBlbHNlCisgICAgbW9kZSB8PSBPX0JJTkFSWTsKKworICAvLyBGb3IgUmVhZC9Xcml0ZSBhY2Nlc3Mgd2UgaGF2ZSB0byBndWVzcworICBEV09SRCBkdW1teSwgZHVtbXkyOworICBCT09MIHdyaXRlT2sgPSBXcml0ZUZpbGUob3NoYW5kbGUsICZkdW1teTIsIDAsICZkdW1teSwgMCk7CisgIEJPT0wgcmVhZE9rID0gUmVhZEZpbGUob3NoYW5kbGUsICZkdW1teTIsIDAsICZkdW1teSwgTlVMTCk7CisgIGlmICh3cml0ZU9rICYmIHJlYWRPaykKKyAgICBtb2RlIHw9IE9fUkRXUjsKKyAgZWxzZSBpZiAocmVhZE9rKQorICAgIG1vZGUgfD0gT19SRE9OTFk7CisgIGVsc2UKKyAgICBtb2RlIHw9IE9fV1JPTkxZOworCisgIHJldHVybiBmbGFnX3RvX29wZW5tb2RlKG1vZGUpOworfQorCisjZWxpZiBkZWZpbmVkIChfX0RNQ19fKQorCisjICBkZWZpbmUgRkhORF9BUFBFTkQgMHgwNAorIyAgZGVmaW5lIEZITkRfREVWSUNFIDB4MDgKKyMgIGRlZmluZSBGSE5EX1RFWFQgICAweDEwCisKK2V4dGVybiAiQyIgdW5zaWduZWQgY2hhciBfX2ZobmRfaW5mb1tfTkZJTEVdOworCitzdGF0aWMgaW9zX2Jhc2U6Om9wZW5tb2RlIF9nZXRfb3NmZmxhZ3MoaW50IGZkLCBIQU5ETEUgb3NoYW5kbGUpIHsKKyAgaW50IG1vZGUgPSAwOworCisgIGlmIChfX2ZobmRfaW5mb1tmZF0gJiBGSE5EX0FQUEVORCkKKyAgICBtb2RlIHw9IE9fQVBQRU5EOworCisgIGlmIChfX2ZobmRfaW5mb1tmZF0gJiBGSE5EX1RFWFQgPT0gMCkKKyAgICBtb2RlIHw9IE9fQklOQVJZOworCisgIGZvciAoRklMRSAqZnAgPSAmX2lvYlswXTsgZnAgPCAmX2lvYltfTkZJTEVdOyBmcCsrKSB7CisgICAgaWYgKChmaWxlbm8oZnApID09IGZkKSAmJiAoZnAtPl9mbGFnICYgKF9JT1JFQUQgfCBfSU9XUlQgfCBfSU9SVykpKSB7CisgICAgICBjb25zdCBpbnQgb3NmbGFncyA9IGZwLT5fZmxhZzsKKworICAgICAgaWYgKChvc2ZsYWdzICYgX0lPUkVBRCkgJiYgIShvc2ZsYWdzICYgX0lPV1JUKSAmJiAhKG9zZmxhZ3MgJiBfSU9SVykpCisgICAgICAgIG1vZGUgfD0gT19SRE9OTFk7CisgICAgICBlbHNlIGlmICgob3NmbGFncyAmIF9JT1dSVCkgJiYgIShvc2ZsYWdzICYgX0lPUkVBRCkgJiYgIShvc2ZsYWdzICYgX0lPUlcpKQorICAgICAgICBtb2RlIHw9IE9fV1JPTkxZOworICAgICAgZWxzZQorICAgICAgICBtb2RlIHw9IE9fUkRXUjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIHJldHVybiBmbGFnX3RvX29wZW5tb2RlKG1vZGUpOworfQorI2VuZGlmCisKK3NpemVfdCBfRmlsZWJ1Zl9iYXNlOjpfTV9wYWdlX3NpemUgPSA0MDk2OworCitfRmlsZWJ1Zl9iYXNlOjpfRmlsZWJ1Zl9iYXNlKCkKKyAgOiBfTV9maWxlX2lkKElOVkFMSURfU1RMUF9GRCksCisgICAgX01fb3Blbm1vZGUoMCksCisgICAgX01faXNfb3BlbihmYWxzZSksCisgICAgX01fc2hvdWxkX2Nsb3NlKGZhbHNlKSwKKyAgICBfTV92aWV3X2lkKDApCit7fQorCit2b2lkIF9GaWxlYnVmX2Jhc2U6Ol9TX2luaXRpYWxpemUoKSB7CisgIFNZU1RFTV9JTkZPIFN5c3RlbUluZm87CisgIEdldFN5c3RlbUluZm8oJlN5c3RlbUluZm8pOworICBfTV9wYWdlX3NpemUgPSBTeXN0ZW1JbmZvLmR3UGFnZVNpemU7CisgIC8vIG1pZ2h0IGJlIC5kd0FsbG9jYXRpb25HcmFudWxhcml0eQorfQorCisvLyBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIGZpbGUuICBUaGlzIGlzIGEgd3JhcHBlciBmb3Igc3RhdC4KKy8vIFJldHVybnMgemVybyBpZiB0aGUgc2l6ZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZCBvciBpcyBpbGwtZGVmaW5lZC4KK3N0cmVhbW9mZiBfRmlsZWJ1Zl9iYXNlOjpfTV9maWxlX3NpemUoKSB7CisgIHJldHVybiBfU1RMUF9QUklWIF9fZmlsZV9zaXplKF9NX2ZpbGVfaWQpOworfQorCitib29sIF9GaWxlYnVmX2Jhc2U6Ol9NX29wZW4oY29uc3QgY2hhciogbmFtZSwgaW9zX2Jhc2U6Om9wZW5tb2RlIG9wZW5tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgcGVybWlzc2lvbikgeworICBfU1RMUF9mZCBmaWxlX25vOworCisgIGlmIChfTV9pc19vcGVuKQorICAgIHJldHVybiBmYWxzZTsKKworICBEV09SRCBkd0Rlc2lyZWRBY2Nlc3MsIGR3Q3JlYXRpb25EaXNwb3NpdGlvbjsKKyAgYm9vbCBkb1RydW5jYXRlID0gZmFsc2U7CisKKyAgc3dpdGNoIChvcGVubW9kZSAmICh+aW9zX2Jhc2U6OmF0ZSAmIH5pb3NfYmFzZTo6YmluYXJ5KSkgeworICBjYXNlIGlvc19iYXNlOjpvdXQ6CisgIGNhc2UgaW9zX2Jhc2U6Om91dCB8IGlvc19iYXNlOjp0cnVuYzoKKyAgICBkd0Rlc2lyZWRBY2Nlc3MgPSBHRU5FUklDX1dSSVRFOworICAgIGR3Q3JlYXRpb25EaXNwb3NpdGlvbiA9IE9QRU5fQUxXQVlTOworICAgIC8vIGJvcmlzIDogZXZlbiB0aG91Z2ggaXQgaXMgdmVyeSBub24taW50dWl0aXZlLCBzdGFuZGFyZAorICAgIC8vIHJlcXVpcmVzIHRoZW0gYm90aCB0byBiZWhhdmUgc2FtZS4KKyAgICBkb1RydW5jYXRlID0gdHJ1ZTsKKyAgICBicmVhazsKKyAgY2FzZSBpb3NfYmFzZTo6b3V0IHwgaW9zX2Jhc2U6OmFwcDoKKyAgICBkd0Rlc2lyZWRBY2Nlc3MgPSBHRU5FUklDX1dSSVRFOworICAgIGR3Q3JlYXRpb25EaXNwb3NpdGlvbiA9IE9QRU5fQUxXQVlTOworICAgIGJyZWFrOworICBjYXNlIGlvc19iYXNlOjppbjoKKyAgICBkd0Rlc2lyZWRBY2Nlc3MgPSBHRU5FUklDX1JFQUQ7CisgICAgZHdDcmVhdGlvbkRpc3Bvc2l0aW9uID0gT1BFTl9FWElTVElORzsKKyAgICBwZXJtaXNzaW9uID0gMDsgICAgICAgICAgICAgLy8gSXJyZWxldmFudCB1bmxlc3Mgd2UncmUgd3JpdGluZy4KKyAgICBicmVhazsKKyAgY2FzZSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0OgorICAgIGR3RGVzaXJlZEFjY2VzcyA9IEdFTkVSSUNfUkVBRCB8IEdFTkVSSUNfV1JJVEU7CisgICAgZHdDcmVhdGlvbkRpc3Bvc2l0aW9uID0gT1BFTl9FWElTVElORzsKKyAgICBicmVhazsKKyAgY2FzZSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0IHwgaW9zX2Jhc2U6OnRydW5jOgorICAgIGR3RGVzaXJlZEFjY2VzcyA9IEdFTkVSSUNfUkVBRCB8IEdFTkVSSUNfV1JJVEU7CisgICAgZHdDcmVhdGlvbkRpc3Bvc2l0aW9uID0gT1BFTl9BTFdBWVM7CisgICAgZG9UcnVuY2F0ZSA9IHRydWU7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBhYm92ZSBhcmUgdGhlIG9ubHkgY29tYmluYXRpb25zIG9mCisgICAgcmV0dXJuIGZhbHNlOyAgICAgICAgICAgICAgIC8vIGZsYWdzIGFsbG93ZWQgYnkgdGhlIEMrKyBzdGFuZGFyZC4KKyAgfQorCisgIERXT1JEIGR3U2hhcmVNb2RlID0gRklMRV9TSEFSRV9SRUFEIHwgRklMRV9TSEFSRV9XUklURTsKKworI2lmIGRlZmluZWQoX1NUTFBfVVNFX1dJREVfSU5URVJGQUNFKQorICAgIGZpbGVfbm8gPSBDcmVhdGVGaWxlIChfU1RMUF9QUklWIF9fQVNDSUlUb1dpZGUobmFtZSkuY19zdHIoKSwKKyNlbHNlCisgICAgZmlsZV9ubyA9IENyZWF0ZUZpbGVBKG5hbWUsCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZHdEZXNpcmVkQWNjZXNzLCBkd1NoYXJlTW9kZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZHdDcmVhdGlvbkRpc3Bvc2l0aW9uLCBwZXJtaXNzaW9uLCAwKTsKKworICBpZiAoZmlsZV9ubyA9PSBJTlZBTElEX1NUTFBfRkQpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmICgKKyNpZiAhZGVmaW5lZCAoX1NUTFBfV0NFKQorICAgICAgR2V0RmlsZVR5cGUoZmlsZV9ubykgPT0gRklMRV9UWVBFX0RJU0sgJiYKKyNlbmRpZgorICAgICAgKChkb1RydW5jYXRlICYmIFNldEVuZE9mRmlsZShmaWxlX25vKSA9PSAwKSB8fAorICAgICAgICgoKG9wZW5tb2RlICYgaW9zX2Jhc2U6OmF0ZSkgIT0gMCkgJiYKKyAgICAgICAgKFNldEZpbGVQb2ludGVyKGZpbGVfbm8sIDAsIE5VTEwsIEZJTEVfRU5EKSA9PSBJTlZBTElEX1NFVF9GSUxFX1BPSU5URVIpKSkpIHsKKyAgICBDbG9zZUhhbmRsZShmaWxlX25vKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBfTV9pc19vcGVuID0gdHJ1ZTsKKyAgX01fZmlsZV9pZCA9IGZpbGVfbm87CisgIF9NX3Nob3VsZF9jbG9zZSA9IF9NX2lzX29wZW47CisgIF9NX29wZW5tb2RlID0gb3Blbm1vZGU7CisKKyAgaWYgKF9NX2lzX29wZW4pCisgICAgX01fcmVndWxhcl9maWxlID0gX1NUTFBfUFJJViBfX2lzX3JlZ3VsYXJfZmlsZShfTV9maWxlX2lkKTsKKworICByZXR1cm4gKF9NX2lzX29wZW4gIT0gMCk7Cit9CisKK2Jvb2wgX0ZpbGVidWZfYmFzZTo6X01fb3Blbihjb25zdCBjaGFyKiBuYW1lLCBpb3NfYmFzZTo6b3Blbm1vZGUgb3Blbm1vZGUpIHsKKyAgLy8gVGhpcyBkb2Vzbid0IHJlYWxseSBncmFudCBldmVyeW9uZSBpbiB0aGUgd29ybGQgcmVhZC93cml0ZQorICAvLyBhY2Nlc3MuICBPbiBVbml4LCBmaWxlLWNyZWF0aW9uIHN5c3RlbSBjYWxscyBhbHdheXMgY2xlYXIKKyAgLy8gYml0cyB0aGF0IGFyZSBzZXQgaW4gdGhlIHVtYXNrIGZyb20gdGhlIHBlcm1pc3Npb25zIGZsYWcuCisgIHJldHVybiB0aGlzLT5fTV9vcGVuKG5hbWUsIG9wZW5tb2RlLCBGSUxFX0FUVFJJQlVURV9OT1JNQUwpOworfQorCitib29sIF9GaWxlYnVmX2Jhc2U6Ol9NX29wZW4oX1NUTFBfZmQgX19pZCwgaW9zX2Jhc2U6Om9wZW5tb2RlIGluaXRfbW9kZSkgeworI2lmIChkZWZpbmVkIChfU1RMUF9NU1ZDX0xJQikgJiYgIWRlZmluZWQgKF9TVExQX1dDRSkpIHx8IFwKKyAgICAoZGVmaW5lZCAoX19NSU5HVzMyX18pICYmIGRlZmluZWQgKF9fTVNWQ1JUX18pKSB8fCBkZWZpbmVkIChfX0RNQ19fKQorCisgIGlmIChfTV9pc19vcGVuIHx8IF9faWQgPT0gSU5WQUxJRF9TVExQX0ZEKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoaW5pdF9tb2RlICE9IGlvc19iYXNlOjpfX2RlZmF1bHRfbW9kZSkKKyAgICBfTV9vcGVubW9kZSA9IGluaXRfbW9kZTsKKyAgZWxzZQorICAgIF9NX29wZW5tb2RlID0gX2dldF9vc2ZmbGFncygtMSwgX19pZCk7CisKKyAgX01faXNfb3BlbiA9IHRydWU7CisgIF9NX2ZpbGVfaWQgPSBfX2lkOworICBfTV9zaG91bGRfY2xvc2UgPSBmYWxzZTsKKyAgX01fcmVndWxhcl9maWxlID0gX1NUTFBfUFJJViBfX2lzX3JlZ3VsYXJfZmlsZShfTV9maWxlX2lkKTsKKworICByZXR1cm4gdHJ1ZTsKKyNlbHNlCisgICh2b2lkKV9faWQ7CisgICh2b2lkKWluaXRfbW9kZTsgICAgLy8gZHdhIDQvMjcvMDAgLSBzdXBwcmVzcyB1bnVzZWQgcGFyYW1ldGVyIHdhcm5pbmcKKworICAvLyBub3QgYXZhaWxhYmxlIGZvciB0aGUgQVBJCisgIHJldHVybiBmYWxzZTsKKworI2VuZGlmCit9CisKKy8vIEFzc29jaWF0ZWQgdGhlIGZpbGVidWYgd2l0aCBhIGZpbGUgZGVzY3JpcHRvciBwb2ludGluZyB0byBhbiBhbHJlYWR5LQorLy8gb3BlbiBmaWxlLiAgTW9kZSBpcyBzZXQgdG8gYmUgY29uc2lzdGVudCB3aXRoIHRoZSB3YXkgdGhhdCB0aGUgZmlsZQorLy8gd2FzIG9wZW5lZC4KK2Jvb2wgX0ZpbGVidWZfYmFzZTo6X01fb3BlbihpbnQgZmlsZV9ubywgaW9zX2Jhc2U6Om9wZW5tb2RlIGluaXRfbW9kZSkgeworICBpZiAoX01faXNfb3BlbiB8fCBmaWxlX25vIDwgMCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyNpZiAoZGVmaW5lZCAoX1NUTFBfTVNWQ19MSUIpICYmICFkZWZpbmVkIChfU1RMUF9XQ0UpKSB8fCBcCisgICAgKGRlZmluZWQgKF9fTUlOR1czMl9fKSAmJiBkZWZpbmVkIChfX01TVkNSVF9fKSkgfHwgZGVmaW5lZCAoX19ETUNfXykKKworICBIQU5ETEUgb3NoYW5kbGUgPSAoSEFORExFKV9nZXRfb3NmaGFuZGxlKGZpbGVfbm8pOworICBpZiAob3NoYW5kbGUgPT0gSU5WQUxJRF9TVExQX0ZEKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoaW5pdF9tb2RlICE9IGlvc19iYXNlOjpfX2RlZmF1bHRfbW9kZSkKKyAgICBfTV9vcGVubW9kZSA9IGluaXRfbW9kZTsKKyAgZWxzZQorICAgIF9NX29wZW5tb2RlID0gX2dldF9vc2ZmbGFncyhmaWxlX25vLCBvc2hhbmRsZSk7CisKKyAgX01fZmlsZV9pZCA9IG9zaGFuZGxlOworICBfTV9pc19vcGVuID0gdHJ1ZTsKKyAgX01fc2hvdWxkX2Nsb3NlID0gZmFsc2U7CisgIF9NX3JlZ3VsYXJfZmlsZSA9IF9TVExQX1BSSVYgX19pc19yZWd1bGFyX2ZpbGUoX01fZmlsZV9pZCk7CisgIHJldHVybiB0cnVlOworI2Vsc2UKKyAgX1NUTFBfTUFSS19QQVJBTUVURVJfQVNfVU5VU0VEKCZpbml0X21vZGUpCisgIC8vIG5vdCBhdmFpbGFibGUgZm9yIHRoZSBBUEkKKyAgcmV0dXJuIGZhbHNlOworI2VuZGlmCit9CisKK2Jvb2wgX0ZpbGVidWZfYmFzZTo6X01fY2xvc2UoKSB7CisgIGlmICghX01faXNfb3BlbikKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgYm9vbCBvazsKKworICBpZiAoIV9NX3Nob3VsZF9jbG9zZSkKKyAgICBvayA9IHRydWU7CisgIGVsc2UgeworICAgIGlmIChfTV9maWxlX2lkICE9IElOVkFMSURfU1RMUF9GRCkgeworICAgICAgb2sgPSAoQ2xvc2VIYW5kbGUoX01fZmlsZV9pZCkgIT0gMCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgb2sgPSBmYWxzZTsKKyAgICB9CisgIH0KKworICBfTV9pc19vcGVuID0gX01fc2hvdWxkX2Nsb3NlID0gZmFsc2U7CisgIF9NX29wZW5tb2RlID0gMDsKKyAgcmV0dXJuIG9rOworfQorCisKKyNkZWZpbmUgX1NUTFBfTEYgMTAKKyNkZWZpbmUgX1NUTFBfQ1IgMTMKKyNkZWZpbmUgX1NUTFBfQ1RSTFogMjYKKworLy8gUmVhZCB1cCB0byBuIGNoYXJhY3RlcnMgaW50byBhIGJ1ZmZlci4gIFJldHVybiB2YWx1ZSBpcyBudW1iZXIgb2YKKy8vIGNoYXJhY3RlcnMgcmVhZC4KK3B0cmRpZmZfdCBfRmlsZWJ1Zl9iYXNlOjpfTV9yZWFkKGNoYXIqIGJ1ZiwgcHRyZGlmZl90IG4pIHsKKyAgcHRyZGlmZl90IHJlYWRlbiA9IDA7CisgIC8vSGVyZSBjYXN0IHRvIHNpemVfdCBpcyBzYWZlIGFzIG4gY2Fubm90IGJlIG5lZ2F0aXZlLgorICBzaXplX3QgY2h1bmtTaXplID0gKG1pbikoc2l6ZV90KDB4ZmZmZmZmZmYpLCBfX1NUQVRJQ19DQVNUKHNpemVfdCwgbikpOworICAvLyBUaGUgZm9sbG93aW5nLCB3aGlsZSB2YWxpZGF0aW5nIHRoYXQgd2UgYXJlIHN0aWxsIGFibGUgdG8gZXh0cmFjdCBjaHVua1NpemUKKyAgLy8gY2hhcmF0ZXJzIHRvIHRoZSBidWZmZXIsIGF2b2lkcyBleHRyYWN0aW9uIG9mIHRvbyBzbWFsbCBjaHVuayBvZiBkYXRhcworICAvLyB3aGljaCB3b3VsZCBiZSBjb3VudGVyIHBlcmZvcm1hbnQuCisgIHdoaWxlIChfX1NUQVRJQ19DQVNUKHNpemVfdCwgKG4gLSByZWFkZW4pKSA+PSBjaHVua1NpemUpIHsKKyAgICBEV09SRCBudW1iZXJPZkJ5dGVzUmVhZDsKKyAgICBSZWFkRmlsZShfTV9maWxlX2lkLCBidWYgKyByZWFkZW4sIF9fU1RBVElDX0NBU1QoRFdPUkQsIGNodW5rU2l6ZSksICZudW1iZXJPZkJ5dGVzUmVhZCwgMCk7CisKKyAgICBpZiAobnVtYmVyT2ZCeXRlc1JlYWQgPT0gMCkKKyAgICAgIGJyZWFrOworCisgICAgaWYgKCEoX01fb3Blbm1vZGUgJiBpb3NfYmFzZTo6YmluYXJ5KSkgeworICAgICAgLy8gdHJhbnNsYXRlIENSLUxGcyB0byBMRnMgaW4gdGhlIGJ1ZmZlcgorICAgICAgY2hhciAqdG8gPSBidWYgKyByZWFkZW47CisgICAgICBjaGFyICpmcm9tID0gdG87CisgICAgICBjaGFyICpsYXN0ID0gZnJvbSArIG51bWJlck9mQnl0ZXNSZWFkIC0gMTsKKyAgICAgIGZvciAoOyBmcm9tIDw9IGxhc3QgJiYgKmZyb20gIT0gX1NUTFBfQ1RSTFo7ICsrZnJvbSkgeworICAgICAgICBpZiAoKmZyb20gIT0gX1NUTFBfQ1IpCisgICAgICAgICAgKnRvKysgPSAqZnJvbTsKKyAgICAgICAgZWxzZSB7IC8vIGZvdW5kIENSCisgICAgICAgICAgaWYgKGZyb20gPCBsYXN0KSB7IC8vIG5vdCBhdCBidWZmZXIgZW5kCisgICAgICAgICAgICBpZiAoKihmcm9tICsgMSkgIT0gX1NUTFBfTEYpCisgICAgICAgICAgICAgICp0bysrID0gX1NUTFBfQ1I7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgeyAvLyBsYXN0IGNoYXIgaXMgQ1IsIHBlZWsgZm9yIExGCisgICAgICAgICAgICBjaGFyIHBlZWsgPSAnICc7CisgICAgICAgICAgICBEV09SRCBOdW1iZXJPZkJ5dGVzUGVla2VkOworICAgICAgICAgICAgUmVhZEZpbGUoX01fZmlsZV9pZCwgKExQVk9JRCkmcGVlaywgMSwgJk51bWJlck9mQnl0ZXNQZWVrZWQsIDApOworICAgICAgICAgICAgaWYgKE51bWJlck9mQnl0ZXNQZWVrZWQgIT0gMCkgeworICAgICAgICAgICAgICBpZiAocGVlayAhPSBfU1RMUF9MRikgeyAvL25vdCBhIDxDUj48TEY+IGNvbWJpbmF0aW9uCisgICAgICAgICAgICAgICAgKnRvKysgPSBfU1RMUF9DUjsKKyAgICAgICAgICAgICAgICBpZiAoKHRvIDwgYnVmICsgbikgJiYgKHBlZWsgIT0gX1NUTFBfQ1IpKQorICAgICAgICAgICAgICAgICAgLy9XZSBoYXZlIGVub3VnaCBwbGFjZSB0byBzdG9yZSBwZWVrIGFuZCBpdCBpcyBubyBhIHNwZWNpYWwKKyAgICAgICAgICAgICAgICAgIC8vX1NUTFBfQ1IgY2hhcmFjdGVyLCB3ZSBjYW4gc3RvcmUgaXQuCisgICAgICAgICAgICAgICAgICAqdG8rKyA9IHBlZWs7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgU2V0RmlsZVBvaW50ZXIoX01fZmlsZV9pZCwgKExPTkcpLTEsIDAsIEZJTEVfQ1VSUkVOVCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gQSA8Q1I+PExGPiBjb21iaW5hdGlvbiwgd2Uga2VlcCB0aGUgPExGPjoKKyAgICAgICAgICAgICAgICAqdG8rKyA9IF9TVExQX0xGOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgLyogVGhpcyBjYXNlIGlzIHRlZGlvdXMsIHdlIGNvdWxkCisgICAgICAgICAgICAgICAqICAtIHB1dCBwZWVrIGJhY2sgaW4gdGhlIGZpbGUgYnV0IHRoaXMgd291bGQgdGhlbiBnZW5lcmF0ZSBhbiBpbmZpbml0ZSBsb29wCisgICAgICAgICAgICAgICAqICAtIHJlcG9ydCBhbiBlcnJvciBhcyB3ZSBkb24ndCBrbm93IGlmIGluIGEgZnV0dXJlIGNhbGwgdG8gUmVhZEZpbGUgd2Ugd29uJ3QgdGhlbgorICAgICAgICAgICAgICAgKiAgICBnZXQgYSA8TEY+LiBEb2luZyBzbyB3b3VsZCBtYWtlIGFsbCBmaWxlcyB3aXRoIGEgPENSPiBsYXN0IGFuIGludmFsaWQgZmlsZQorICAgICAgICAgICAgICAgKiAgICBmb3IgU1RMcG9ydCwgYSBoYXJkIHNvbHV0aW9uIGZvciBTVExwb3J0IGNsaWVudHMuCisgICAgICAgICAgICAgICAqICAtIHN0b3JlIHRoZSA8Q1I+IGluIHRoZSByZXR1cm5lZCBidWZmZXIsIHRoZSBjaG9zZW4gc29sdXRpb24sIGV2ZW4gaWYgaW4gdGhpcworICAgICAgICAgICAgICAgKiAgICBjYXNlIHdlIGNvdWxkIG1pc3MgYSA8Q1I+PExGPiBjb21iaW5hdGlvbi4KKyAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICp0bysrID0gX1NUTFBfQ1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9IC8vIGZvdW5kIENSCisgICAgICB9IC8vIGZvcgorICAgICAgcmVhZGVuID0gdG8gLSBidWY7CisgICAgICAvLyBzZWVrIGJhY2sgdG8gVEVYVCBlbmQgb2YgZmlsZSBpZiBoaXQgQ1RSTC1aCisgICAgICBpZiAoZnJvbSA8PSBsYXN0KSB7IC8vIHRlcm1pbmF0ZWQgZHVlIHRvIENUUkxaCisgICAgICAgIFNldEZpbGVQb2ludGVyKF9NX2ZpbGVfaWQsIC0oTE9ORykoKGxhc3QgKyAxKSAtIGZyb20pLCAwLCBGSUxFX0NVUlJFTlQpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgICAgcmVhZGVuICs9IG51bWJlck9mQnl0ZXNSZWFkOworICB9CisgIHJldHVybiByZWFkZW47Cit9CisKKy8vIFdyaXRlIG4gY2hhcmFjdGVycyBmcm9tIGEgYnVmZmVyLiAgUmV0dXJuIHZhbHVlOiB0cnVlIGlmIHdlIG1hbmFnZWQKKy8vIHRvIHdyaXRlIHRoZSBlbnRpcmUgYnVmZmVyLCBmYWxzZSBpZiB3ZSBkaWRuJ3QuCitib29sIF9GaWxlYnVmX2Jhc2U6Ol9NX3dyaXRlKGNoYXIqIGJ1ZiwgcHRyZGlmZl90IG4pIHsKKyAgZm9yICg7OykgeworICAgIHB0cmRpZmZfdCB3cml0dGVuOworCisgICAgLy9JbiB0aGUgZm9sbG93aW5nIGltcGxlbWVudGF0aW9uIHdlIGFyZSBnb2luZyB0byBjYXN0IG1vc3Qgb2YgdGhlIHB0cmRpZmZfdAorICAgIC8vdmFsdWVzIGluIHNpemVfdCB0byB3b3JrIHdpdGggY29oZXJlbnQgdW5zaWduZWQgdmFsdWVzLiBEb2luZyBzbyBtYWtlIGNvZGUKKyAgICAvL21vcmUgc2ltcGxlIGVzcGVjaWFsbHkgaW4gdGhlIG1pbiBmdW5jdGlvbiBjYWxsLgorCisgICAgLy8gSW4gYXBwZW5kIG1vZGUsIGV2ZXJ5IHdyaXRlIGRvZXMgYW4gaW1wbGljaXQgc2VlayB0byB0aGUgZW5kCisgICAgLy8gb2YgdGhlIGZpbGUuCisgICAgaWYgKF9NX29wZW5tb2RlICYgaW9zX2Jhc2U6OmFwcCkKKyAgICAgIF9NX3NlZWsoMCwgaW9zX2Jhc2U6OmVuZCk7CisKKyAgICBpZiAoX01fb3Blbm1vZGUgJiBpb3NfYmFzZTo6YmluYXJ5KSB7CisgICAgICAvLyBiaW5hcnkgbW9kZQorICAgICAgc2l6ZV90IGJ5dGVzX3RvX3dyaXRlID0gKHNpemVfdCluOworICAgICAgRFdPUkQgTnVtYmVyT2ZCeXRlc1dyaXR0ZW47CisgICAgICB3cml0dGVuID0gMDsKKyAgICAgIGZvciAoOyBieXRlc190b193cml0ZSAhPSAwOykgeworICAgICAgICBXcml0ZUZpbGUoX01fZmlsZV9pZCwgYnVmICsgd3JpdHRlbiwKKyAgICAgICAgICAgICAgICAgIF9fU1RBVElDX0NBU1QoRFdPUkQsIChtaW4pKHNpemVfdCgweGZmZmZmZmZmKSwgYnl0ZXNfdG9fd3JpdGUpKSwKKyAgICAgICAgICAgICAgICAgICZOdW1iZXJPZkJ5dGVzV3JpdHRlbiwgMCk7CisgICAgICAgIGlmIChOdW1iZXJPZkJ5dGVzV3JpdHRlbiA9PSAwKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgYnl0ZXNfdG9fd3JpdGUgLT0gTnVtYmVyT2ZCeXRlc1dyaXR0ZW47CisgICAgICAgIHdyaXR0ZW4gKz0gTnVtYmVyT2ZCeXRlc1dyaXR0ZW47CisgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgY2hhciB0ZXh0YnVmW19URVhUQlVGX1NJWkUgKyAxXTsgLy8gZXh0cmEgMSBpbiBjYXNlIExGIGF0IGVuZAorICAgICAgY2hhciAqIG5leHRibG9jayA9IGJ1ZiwgKiBwdHJ0ZXh0YnVmID0gdGV4dGJ1ZjsKKyAgICAgIGNoYXIgKiBlbmR0ZXh0YnVmID0gdGV4dGJ1ZiArIF9URVhUQlVGX1NJWkU7CisgICAgICBjaGFyICogZW5kYmxvY2sgPSBidWYgKyBuOworICAgICAgcHRyZGlmZl90IG5leHRibG9ja3NpemUgPSAobWluKSAobiwgKHB0cmRpZmZfdClfVEVYVEJVRl9TSVpFKTsKKyAgICAgIGNoYXIgKiBuZXh0bGY7CisKKyAgICAgIHdoaWxlICggKG5leHRibG9ja3NpemUgPiAwKSAmJgorICAgICAgICAgICAgICAobmV4dGxmID0gKGNoYXIgKiltZW1jaHIobmV4dGJsb2NrLCBfU1RMUF9MRiwgbmV4dGJsb2Nrc2l6ZSkpICE9IDApIHsKKyAgICAgICAgcHRyZGlmZl90IGxpbmVsZW5ndGggPSBuZXh0bGYgLSBuZXh0YmxvY2s7CisgICAgICAgIG1lbWNweShwdHJ0ZXh0YnVmLCBuZXh0YmxvY2ssIGxpbmVsZW5ndGgpOworICAgICAgICBwdHJ0ZXh0YnVmICs9IGxpbmVsZW5ndGg7CisgICAgICAgIG5leHRibG9jayArPSAobGluZWxlbmd0aCArIDEpOworICAgICAgICAqIHB0cnRleHRidWYgKysgPSBfU1RMUF9DUjsKKyAgICAgICAgKiBwdHJ0ZXh0YnVmICsrID0gX1NUTFBfTEY7CisgICAgICAgIG5leHRibG9ja3NpemUgPSAobWluKSAocHRyZGlmZl90KGVuZGJsb2NrIC0gbmV4dGJsb2NrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWF4KSAocHRyZGlmZl90KDApLCBwdHJkaWZmX3QoZW5kdGV4dGJ1ZiAtIHB0cnRleHRidWYpKSk7CisgICAgICB9CisgICAgICAvLyB3cml0ZSBvdXQgd2hhdCdzIGxlZnQsID4gY29uZGl0aW9uIGlzIGhlcmUgc2luY2UgZm9yIExGIGF0IHRoZSBlbmQgLAorICAgICAgLy8gZW5kdGV4dGJ1ZiBtYXkgZ2V0IDwgcHRydGV4dGJ1ZiAuLi4KKyAgICAgIGlmIChuZXh0YmxvY2tzaXplID4gMCkgeworICAgICAgICBtZW1jcHkocHRydGV4dGJ1ZiwgbmV4dGJsb2NrLCBuZXh0YmxvY2tzaXplKTsKKyAgICAgICAgcHRydGV4dGJ1ZiArPSBuZXh0YmxvY2tzaXplOworICAgICAgICBuZXh0YmxvY2sgKz0gbmV4dGJsb2Nrc2l6ZTsKKyAgICAgIH0KKyAgICAgIC8vIG5vdyB3cml0ZSBvdXQgdGhlIHRyYW5zbGF0ZWQgYnVmZmVyCisgICAgICBjaGFyICogd3JpdGV0ZXh0YnVmID0gdGV4dGJ1ZjsKKyAgICAgIGZvciAoc2l6ZV90IE51bWJlck9mQnl0ZXNUb1dyaXRlID0gKHNpemVfdCkocHRydGV4dGJ1ZiAtIHRleHRidWYpOworICAgICAgICAgICBOdW1iZXJPZkJ5dGVzVG9Xcml0ZTspIHsKKyAgICAgICAgRFdPUkQgTnVtYmVyT2ZCeXRlc1dyaXR0ZW47CisgICAgICAgIFdyaXRlRmlsZSgoSEFORExFKV9NX2ZpbGVfaWQsIHdyaXRldGV4dGJ1ZiwKKyAgICAgICAgICAgICAgICAgIF9fU1RBVElDX0NBU1QoRFdPUkQsIChtaW4pKHNpemVfdCgweGZmZmZmZmZmKSwgTnVtYmVyT2ZCeXRlc1RvV3JpdGUpKSwKKyAgICAgICAgICAgICAgICAgICZOdW1iZXJPZkJ5dGVzV3JpdHRlbiwgMCk7CisgICAgICAgIGlmICghTnVtYmVyT2ZCeXRlc1dyaXR0ZW4pIC8vIHdyaXRlIHNob3J0ZmFsbAorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgd3JpdGV0ZXh0YnVmICs9IE51bWJlck9mQnl0ZXNXcml0dGVuOworICAgICAgICBOdW1iZXJPZkJ5dGVzVG9Xcml0ZSAtPSBOdW1iZXJPZkJ5dGVzV3JpdHRlbjsKKyAgICAgIH0KKyAgICAgIC8vIGNvdW50IG5vbi10cmFuc2xhdGVkIGNoYXJhY3RlcnMKKyAgICAgIHdyaXR0ZW4gPSAobmV4dGJsb2NrIC0gYnVmKTsKKyAgICB9CisKKyAgICBpZiAobiA9PSB3cml0dGVuKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgZWxzZSBpZiAod3JpdHRlbiA+IDAgJiYgd3JpdHRlbiA8IG4pIHsKKyAgICAgIG4gLT0gd3JpdHRlbjsKKyAgICAgIGJ1ZiArPSB3cml0dGVuOworICAgIH0KKyAgICBlbHNlCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworLy8gV3JhcHBlciBmb3IgbHNlZWsgb3IgdGhlIGxpa2UuCitzdHJlYW1vZmYgX0ZpbGVidWZfYmFzZTo6X01fc2VlayhzdHJlYW1vZmYgb2Zmc2V0LCBpb3NfYmFzZTo6c2Vla2RpciBkaXIpIHsKKyAgc3RyZWFtb2ZmIHJlc3VsdCA9IC0xOworICBpbnQgd2hlbmNlOworCisgIHN3aXRjaChkaXIpIHsKKyAgY2FzZSBpb3NfYmFzZTo6YmVnOgorICAgIGlmIChvZmZzZXQgPCAwIC8qIHx8IG9mZnNldCA+IF9NX2ZpbGVfc2l6ZSgpICovICkKKyAgICAgIHJldHVybiBzdHJlYW1vZmYoLTEpOworICAgIHdoZW5jZSA9IEZJTEVfQkVHSU47CisgICAgYnJlYWs7CisgIGNhc2UgaW9zX2Jhc2U6OmN1cjoKKyAgICB3aGVuY2UgPSBGSUxFX0NVUlJFTlQ7CisgICAgYnJlYWs7CisgIGNhc2UgaW9zX2Jhc2U6OmVuZDoKKyAgICBpZiAoLyogb2Zmc2V0ID4gMCB8fCAqLyAgLW9mZnNldCA+IF9NX2ZpbGVfc2l6ZSgpICkKKyAgICAgIHJldHVybiBzdHJlYW1vZmYoLTEpOworICAgIHdoZW5jZSA9IEZJTEVfRU5EOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIHJldHVybiBzdHJlYW1vZmYoLTEpOworICB9CisKKyAgTEFSR0VfSU5URUdFUiBsaTsKKyAgbGkuUXVhZFBhcnQgPSBvZmZzZXQ7CisgIGxpLkxvd1BhcnQgPSBTZXRGaWxlUG9pbnRlcihfTV9maWxlX2lkLCBsaS5Mb3dQYXJ0LCAmbGkuSGlnaFBhcnQsIHdoZW5jZSk7CisgIGlmIChsaS5Mb3dQYXJ0ICE9IElOVkFMSURfU0VUX0ZJTEVfUE9JTlRFUiB8fCBHZXRMYXN0RXJyb3IoKSA9PSBOT19FUlJPUikKKyAgICByZXN1bHQgPSBsaS5RdWFkUGFydDsKKworICByZXR1cm4gcmVzdWx0OworfQorCisKKy8vIEF0dGVtcHRzIHRvIG1lbW9yeS1tYXAgbGVuIGJ5dGVzIG9mIHRoZSBjdXJyZW50IGZpbGUsIHN0YXJ0aW5nCisvLyBhdCBwb3NpdGlvbiBvZmZzZXQuICBQcmVjb25kaXRpb246IG9mZnNldCBpcyBhIG11bHRpcGxlIG9mIHRoZQorLy8gcGFnZSBzaXplLiAgUG9zdGNvbmRpdGlvbjogcmV0dXJuIHZhbHVlIGlzIGEgbnVsbCBwb2ludGVyIGlmIHRoZQorLy8gbWVtb3J5IG1hcHBpbmcgZmFpbGVkLiAgT3RoZXJ3aXNlIHRoZSByZXR1cm4gdmFsdWUgaXMgYSBwb2ludGVyIHRvCisvLyB0aGUgbWVtb3J5LW1hcHBlZCBmaWxlIGFuZCB0aGUgZmlsZSBwb3NpdGlvbiBpcyBzZXQgdG8gb2Zmc2V0Lgordm9pZCogX0ZpbGVidWZfYmFzZTo6X01fbW1hcChzdHJlYW1vZmYgb2Zmc2V0LCBzdHJlYW1vZmYgbGVuKSB7CisgIHZvaWQqIGJhc2U7CisgIF9NX3ZpZXdfaWQgPSBDcmVhdGVGaWxlTWFwcGluZyhfTV9maWxlX2lkLCAoUFNFQ1VSSVRZX0FUVFJJQlVURVMpMCAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFX1JFQURPTkxZLCAwIC8qIGxlbiA+PiAzMiAqLyAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC8qIGxlbiAmIDB4RkZGRkZGRkYgKi8gLCAvLyBsb3ctb3JkZXIgRFdPUkQgb2Ygc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisKKyAgaWYgKF9NX3ZpZXdfaWQpIHsKKyNpZiAwCisvKgorICAgIHByaW50ZigidmlldyAleCBjcmVhdGVkIGZyb20gZmlsZSAleCwgZXJyb3IgPSAlZCwgc2l6ZSA9ICVkLCBtYXBfb2Zmc2V0ID0gJWQgbWFwX2xlbiA9ICVkXG4iLAorICAgICBfTV92aWV3X2lkLCBfTV9maWxlX2lkLCBHZXRMYXN0RXJyb3IoKSwKKyAgICAgKGludCljdXJfZmlsZXNpemUsIFVMTChvZmZzZXQpICYgMHhmZmZmZmZmZiwgbGVuKTsKKyovCisjZW5kaWYKKyAgICBMQVJHRV9JTlRFR0VSIGxpOworICAgIGxpLlF1YWRQYXJ0ID0gb2Zmc2V0OworICAgIGJhc2UgPSBNYXBWaWV3T2ZGaWxlKF9NX3ZpZXdfaWQsIEZJTEVfTUFQX1JFQUQsIGxpLkhpZ2hQYXJ0LCBsaS5Mb3dQYXJ0LAorI2lmICFkZWZpbmVkIChfX0RNQ19fKQorICAgICAgICAgICAgICAgICAgICAgICAgIF9fU1RBVElDX0NBU1QoU0laRV9ULCBsZW4pKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgX19TVEFUSUNfQ0FTVChEV09SRCwgbGVuKSk7CisjZW5kaWYKKyAgICAvLyBjaGVjayBpZiBtYXBwaW5nIHN1Y2NlZGVkIGFuZCBpcyB1c2FibGUKKyAgICBpZiAoYmFzZSA9PSAwICB8fCBfTV9zZWVrKG9mZnNldCArIGxlbiwgaW9zX2Jhc2U6OmJlZykgPCAwKSB7CisgICAgICB0aGlzLT5fTV91bm1hcChiYXNlLCBsZW4pOworICAgICAgYmFzZSA9IDA7CisgICAgfQorICB9IGVsc2UKKyAgICBiYXNlID0gMDsKKworICByZXR1cm4gYmFzZTsKK30KKwordm9pZCBfRmlsZWJ1Zl9iYXNlOjpfTV91bm1hcCh2b2lkKiBiYXNlLCBzdHJlYW1vZmYgbGVuKSB7CisgIC8vIHByZWNvbmRpdGlvbiA6IHRoZXJlIGlzIGEgdmFsaWQgbWFwcGluZyBhdCB0aGUgbW9tZW50CisgIGlmIChiYXNlICE9IE5VTEwpCisgICAgVW5tYXBWaWV3T2ZGaWxlKGJhc2UpOworICAvLyBkZXN0cm95IHZpZXcgaGFuZGxlIGFzIHdlbGwKKyAgaWYgKF9NX3ZpZXdfaWQgIT0gTlVMTCkKKyAgICBDbG9zZUhhbmRsZShfTV92aWV3X2lkKTsKKyAgX01fdmlld19pZCA9IE5VTEw7CisgICh2b2lkKWxlbjsgLy91bnVzZWQgdmFyaWFibGUKK30KKworX1NUTFBfRU5EX05BTUVTUEFDRQpkaWZmIC0tZ2l0IGEvc3JjL2RsbF9tYWluLmNwcCBiL3NyYy9kbGxfbWFpbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFhYTcyMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9kbGxfbWFpbi5jcHAKQEAgLTAsMCArMSwyNjIgQEAKKyAvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2RlZmluZSBfU1RMUF9FWFBPU0VfR0xPQkFMU19JTVBMRU1FTlRBVElPTgorCisjaW5jbHVkZSAic3RscG9ydF9wcmVmaXguaCIKKworI2lmICFkZWZpbmVkIChfU1RMUF9ERUJVRykgJiYgISBkZWZpbmVkIChfU1RMUF9BU1NFUlRJT05TKQorIyAgaWYgIWRlZmluZWQgKF9fQVBQTEVfXykgfHwgIWRlZmluZWQgKF9fR05VQ19fKSB8fCAoX19HTlVDX18gPCAzKSB8fCAoKF9fR05VQ19fID09IDMpICYmIChfX0dOVUNfTUlOT1JfXyA8IDMpKQorLyogZHVtczogUGxlYXNlIGlmIHRoZSBmb2xsb3dpbmcgY29kZSB3YXMgYmVpbmcgdW5jb21tZW50ZWQgcGxlYXNlIGV4cGxhaW4gd2h5CisgKiBhcyBmb3IgdGhlIG1vbWVudCBpdCBvbmx5IGxvb2tzIGxpa2UgYSBzb3VyY2Ugb2YgaW5jb25zaXN0ZW5jeSBpbiB0aGUgd2F5CisgKiBTVExwb3J0IGRpZmZlcmVudCB0cmFuc2xhdGlvbiB1bml0cyBhcmUgY29tcGlsZWQuCisgKi8KKy8vIyAgICBkZWZpbmUgX1NUTFBfQVNTRVJUSU9OUyAxCisjICBlbmRpZgorI2VuZGlmCisKKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8c2xpc3Q+CisjaW5jbHVkZSA8ZGVxdWU+CisjaW5jbHVkZSA8aGFzaF9tYXA+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisjaW5jbHVkZSA8Yml0c2V0PgorI2luY2x1ZGUgPGxvY2FsZT4KKworI2lmIGRlZmluZWQgKF9fRE1DX18pCisvLyBmb3Igcm9wZSBzdGF0aWMgbWVtYmVycworIyAgaW5jbHVkZSA8cm9wZT4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RsL19yYW5nZV9lcnJvcnMuYz4KKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKKyNpZiBkZWZpbmVkIChfU1RMUF9OT19FWENFUFRJT05fSEVBREVSKSB8fCBkZWZpbmVkIChfU1RMUF9CUk9LRU5fRVhDRVBUSU9OX0NMQVNTKQorZXhjZXB0aW9uOjpleGNlcHRpb24oKSBfU1RMUF9OT1RIUk9XIHt9CitleGNlcHRpb246On5leGNlcHRpb24oKSBfU1RMUF9OT1RIUk9XIHt9CitiYWRfZXhjZXB0aW9uOjpiYWRfZXhjZXB0aW9uKCkgX1NUTFBfTk9USFJPVyB7fQorYmFkX2V4Y2VwdGlvbjo6fmJhZF9leGNlcHRpb24oKSBfU1RMUF9OT1RIUk9XIHt9Citjb25zdCBjaGFyKiBleGNlcHRpb246OndoYXQoKSBjb25zdCBfU1RMUF9OT1RIUk9XIHsgcmV0dXJuICJjbGFzcyBleGNlcHRpb24iOyB9Citjb25zdCBjaGFyKiBiYWRfZXhjZXB0aW9uOjp3aGF0KCkgY29uc3QgX1NUTFBfTk9USFJPVyB7IHJldHVybiAiY2xhc3MgYmFkX2V4Y2VwdGlvbiI7IH0KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfT1dOX1NUREVYQ0VQVCkKKyMgIGluY2x1ZGUgPHN0bC9fc3RkZXhjZXB0X2Jhc2UuYz4KKworLy8gYm9yaXMgOiB0aG9zZSBhcmUgbmVlZGVkIHRvIGZvcmNlIHR5cGVpbmZvIG5vZGVzIHRvIGJlIGNyZWF0ZWQgaW4gaGVyZSBvbmx5Citsb2dpY19lcnJvcjo6fmxvZ2ljX2Vycm9yKCkgX1NUTFBfTk9USFJPV19JTkhFUkVOVExZIHt9CitydW50aW1lX2Vycm9yOjp+cnVudGltZV9lcnJvcigpIF9TVExQX05PVEhST1dfSU5IRVJFTlRMWSB7fQorZG9tYWluX2Vycm9yOjp+ZG9tYWluX2Vycm9yKCkgX1NUTFBfTk9USFJPV19JTkhFUkVOVExZIHt9CitpbnZhbGlkX2FyZ3VtZW50Ojp+aW52YWxpZF9hcmd1bWVudCgpIF9TVExQX05PVEhST1dfSU5IRVJFTlRMWSB7fQorbGVuZ3RoX2Vycm9yOjp+bGVuZ3RoX2Vycm9yKCkgX1NUTFBfTk9USFJPV19JTkhFUkVOVExZIHt9CitvdXRfb2ZfcmFuZ2U6On5vdXRfb2ZfcmFuZ2UoKSBfU1RMUF9OT1RIUk9XX0lOSEVSRU5UTFkge30KK3JhbmdlX2Vycm9yOjp+cmFuZ2VfZXJyb3IoKSBfU1RMUF9OT1RIUk9XX0lOSEVSRU5UTFkge30KK292ZXJmbG93X2Vycm9yOjp+b3ZlcmZsb3dfZXJyb3IoKSBfU1RMUF9OT1RIUk9XX0lOSEVSRU5UTFkge30KK3VuZGVyZmxvd19lcnJvcjo6fnVuZGVyZmxvd19lcnJvcigpIF9TVExQX05PVEhST1dfSU5IRVJFTlRMWSB7fQorCisjZW5kaWYKKworI2lmICFkZWZpbmVkKF9TVExQX1dDRV9FVkMzKQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfTk9fQkFEX0FMTE9DKQorY29uc3Qgbm90aHJvd190IG5vdGhyb3cgLyogPSB7fSAqLzsKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19GT1JDRV9JTlNUQU5USUFURSkKKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpIHx8IGRlZmluZWQgKF9TVExQX0FTU0VSVElPTlMpCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCit0ZW1wbGF0ZSBjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBfX3N0bF9kZWJ1Z19lbmdpbmU8Ym9vbD47CitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKyMgIGVuZGlmCisKK3RlbXBsYXRlIGNsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIF9fZGVidWdfYWxsb2M8X19ub2RlX2FsbG9jPjsKK3RlbXBsYXRlIGNsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIF9fZGVidWdfYWxsb2M8X19uZXdfYWxsb2M+OworCisvL0V4cG9ydCBvZiB0aGUgdHlwZXMgdXNlZCB0byByZXByZXNlbnQgYnVja2V0cyBpbiB0aGUgaGFzaHRhYmxlIGltcGxlbWVudGF0aW9uLgorLyoKKyAqIEZvciB0aGUgdmVjdG9yIGNsYXNzIHdlIGRvIG5vdCB1c2UgYW55IE1TVkM2IHdvcmthcm91bmQgZXZlbiBpZiB3ZSBleHBvcnQgaXQgZnJvbQorICogdGhlIFNUTHBvcnQgZHluYW1pYyBsaWJyYXJpZXMgYmVjYXVzZSB3ZSBrbm93IHdoYXQgbWV0aG9kcyBhcmUgY2FsbGVkIGFuZCBub25lIGlzCisgKiBhIHRlbXBsYXRlIG1ldGhvZC4gTW9yZW92ZXIgdGhlIGV4cG9ydGVkIGNsYXNzIGlzIGFuIGluc3RhbmNpYXRpb24gb2YgdmVjdG9yIHdpdGgKKyAqIF9TbGlzdF9ub2RlX2Jhc2Ugc3RydWN0IHRoYXQgaXMgYW4gaW50ZXJuYWwgU1RMcG9ydCBjbGFzcyB0aGF0IG5vIHVzZXIgc2hvdWxkIGV2ZXIKKyAqIHVzZS4KKyAqLworIyAgaWYgIWRlZmluZWQgKF9TVExQX1VTRV9QVFJfU1BFQ0lBTElaQVRJT05TKQordGVtcGxhdGUgY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgYWxsb2NhdG9yPF9TVExQX1BSSVYgX1NsaXN0X25vZGVfYmFzZSo+OworCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCit0ZW1wbGF0ZSBjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBfU1RMUF9hbGxvY19wcm94eTxfU2xpc3Rfbm9kZV9iYXNlKiosIF9TbGlzdF9ub2RlX2Jhc2UqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yPF9TbGlzdF9ub2RlX2Jhc2UqPiA+OwordGVtcGxhdGUgY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgX1ZlY3Rvcl9iYXNlPF9TbGlzdF9ub2RlX2Jhc2UqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRvcjxfU2xpc3Rfbm9kZV9iYXNlKj4gPjsKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorIyAgZW5kaWYKKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCit0ZW1wbGF0ZSBjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBfU1RMUF9OT05fREJHX05BTUUodmVjdG9yKTxfU2xpc3Rfbm9kZV9iYXNlKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRvcjxfU2xpc3Rfbm9kZV9iYXNlKj4gPjsKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorIyAgZW5kaWYKKwordGVtcGxhdGUgY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgdmVjdG9yPF9TVExQX1BSSVYgX1NsaXN0X25vZGVfYmFzZSosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yPF9TVExQX1BSSVYgX1NsaXN0X25vZGVfYmFzZSo+ID47CisvL0VuZCBvZiBoYXNodGFibGUgYnVja2V0IHR5cGVzIGV4cG9ydC4KKworLy9FeHBvcnQgb2YgX0xvY2FsZV9pbXBsIGZhY2V0cyBjb250YWluZXI6CisjICBpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX1BUUl9TUEVDSUFMSVpBVElPTlMpCit0ZW1wbGF0ZSBjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBhbGxvY2F0b3I8bG9jYWxlOjpmYWNldCo+OworCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCit0ZW1wbGF0ZSBjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBfU1RMUF9hbGxvY19wcm94eTxsb2NhbGU6OmZhY2V0KiosIGxvY2FsZTo6ZmFjZXQqLCBhbGxvY2F0b3I8bG9jYWxlOjpmYWNldCo+ID47Cit0ZW1wbGF0ZSBjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBfVmVjdG9yX2Jhc2U8bG9jYWxlOjpmYWNldCosIGFsbG9jYXRvcjxsb2NhbGU6OmZhY2V0Kj4gPjsKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCisjICBlbmRpZgorIyAgaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisjICAgIGRlZmluZSBfU1RMUF9OT05fREJHX1ZFQ1RPUiBfU1RMUF9OT05fREJHX05BTUUodmVjdG9yKQordGVtcGxhdGUgY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgX19jb25zdHJ1Y3RfY2hlY2tlcjxfU1RMUF9QUklWIF9TVExQX05PTl9EQkdfVkVDVE9SPGxvY2FsZTo6ZmFjZXQqLCBhbGxvY2F0b3I8bG9jYWxlOjpmYWNldCo+ID4gPjsKK3RlbXBsYXRlIGNsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIF9TVExQX05PTl9EQkdfVkVDVE9SPGxvY2FsZTo6ZmFjZXQqLCBhbGxvY2F0b3I8bG9jYWxlOjpmYWNldCo+ID47CisjICAgIHVuZGVmIF9TVExQX05PTl9EQkdfVkVDVE9SCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKyMgIGVuZGlmCisKK3RlbXBsYXRlIGNsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIHZlY3Rvcjxsb2NhbGU6OmZhY2V0KiwgYWxsb2NhdG9yPGxvY2FsZTo6ZmFjZXQqPiA+OworLy9FbmQgb2YgZXhwb3J0IG9mIF9Mb2NhbGVfaW1wbCBmYWNldHMgY29udGFpbmVyLgorCisjICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfUFRSX1NQRUNJQUxJWkFUSU9OUykKK3RlbXBsYXRlIGNsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIGFsbG9jYXRvcjx2b2lkKj47CisKK3R5cGVkZWYgX1NUTFBfUFJJViBfTGlzdF9ub2RlPHZvaWQqPiBfVm9pZFB0cl9Ob2RlOwordGVtcGxhdGUgY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgYWxsb2NhdG9yPF9Wb2lkUHRyX05vZGU+OworCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIGNsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIF9TVExQX2FsbG9jX3Byb3h5PHZvaWQqKiwgdm9pZCosIGFsbG9jYXRvcjx2b2lkKj4gPjsKK3RlbXBsYXRlIGNsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIF9WZWN0b3JfYmFzZTx2b2lkKiwgYWxsb2NhdG9yPHZvaWQqPiA+OwordGVtcGxhdGUgY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgX1NUTFBfUFRSX0lNUExfTkFNRSh2ZWN0b3IpPHZvaWQqLCBhbGxvY2F0b3I8dm9pZCo+ID47CisKK3RlbXBsYXRlIGNsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIF9MaXN0X25vZGU8dm9pZCo+OwordGVtcGxhdGUgY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgX1NUTFBfYWxsb2NfcHJveHk8X0xpc3Rfbm9kZV9iYXNlLCBfVm9pZFB0cl9Ob2RlLCBhbGxvY2F0b3I8X1ZvaWRQdHJfTm9kZT4gPjsKK3RlbXBsYXRlIGNsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIF9MaXN0X2Jhc2U8dm9pZCosIGFsbG9jYXRvcjx2b2lkKj4gPjsKK3RlbXBsYXRlIGNsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIF9TVExQX1BUUl9JTVBMX05BTUUobGlzdCk8dm9pZCosIGFsbG9jYXRvcjx2b2lkKj4gPjsKKwordGVtcGxhdGUgY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgX1NsaXN0X25vZGU8dm9pZCo+OwordGVtcGxhdGUgY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgX1NUTFBfYWxsb2NfcHJveHk8X1NsaXN0X25vZGVfYmFzZSwgX1NsaXN0X25vZGU8dm9pZCo+LCBhbGxvY2F0b3I8X1NsaXN0X25vZGU8dm9pZCo+ID4gPjsKK3RlbXBsYXRlIGNsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIF9TbGlzdF9iYXNlPHZvaWQqLCBhbGxvY2F0b3I8dm9pZCo+ID47Cit0ZW1wbGF0ZSBjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBfU1RMUF9QVFJfSU1QTF9OQU1FKHNsaXN0KTx2b2lkKiwgYWxsb2NhdG9yPHZvaWQqPiA+OworCit0ZW1wbGF0ZSBjbGFzcyAgX1NUTFBfQ0xBU1NfREVDTFNQRUMgX1NUTFBfYWxsb2NfcHJveHk8c2l6ZV90LCB2b2lkKiwgYWxsb2NhdG9yPHZvaWQqPiA+OwordGVtcGxhdGUgY2xhc3MgIF9TVExQX0NMQVNTX0RFQ0xTUEVDIF9TVExQX2FsbG9jX3Byb3h5PHZvaWQqKiosIHZvaWQqKiwgYWxsb2NhdG9yPHZvaWQqKj4gPjsKK3RlbXBsYXRlIHN0cnVjdCBfU1RMUF9DTEFTU19ERUNMU1BFQyBfRGVxdWVfaXRlcmF0b3I8dm9pZCosIF9Ob25jb25zdF90cmFpdHM8dm9pZCo+ID47Cit0ZW1wbGF0ZSBjbGFzcyAgX1NUTFBfQ0xBU1NfREVDTFNQRUMgX0RlcXVlX2Jhc2U8dm9pZCosIGFsbG9jYXRvcjx2b2lkKj4gPjsKK3RlbXBsYXRlIGNsYXNzICBfU1RMUF9DTEFTU19ERUNMU1BFQyBfU1RMUF9QVFJfSU1QTF9OQU1FKGRlcXVlKTx2b2lkKiwgYWxsb2NhdG9yPHZvaWQqPiA+OworCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKworIyAgZW5kaWYgLyogX1NUTFBfVVNFX1BUUl9TUEVDSUFMSVpBVElPTlMgKi8KKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCit0ZW1wbGF0ZSBjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBfUmJfZ2xvYmFsPGJvb2w+OwordGVtcGxhdGUgY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgX0xpc3RfZ2xvYmFsPGJvb2w+OworCit0ZW1wbGF0ZSBjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBfU2xfZ2xvYmFsPGJvb2w+OwordGVtcGxhdGUgY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgX1N0bF9wcmltZTxib29sPjsKKwordGVtcGxhdGUgY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgX0xpbUc8Ym9vbD47CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCisjZW5kaWYgLyogX1NUTFBfTk9fRk9SQ0VfSU5TVEFOVElBVEUgKi8KKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjaWYgZGVmaW5lZCAoX1NUTFBfU0lHTkFMX1JVTlRJTUVfQ09NUEFUSUJJTElUWSkKK2V4dGVybiAiQyIgdm9pZCBfU1RMUF9ERUNMU1BFQyBfU1RMUF9DQUxMIF9TVExQX1NJR05BTF9SVU5USU1FX0NPTVBBVElCSUxJVFkoKSB7fQorI2VuZGlmCisKKyNkZWZpbmUgRk9SQ0VfU1lNQk9MIGV4dGVybgorCisjaWYgZGVmaW5lZCAoX1dJTjMyKSAmJiBkZWZpbmVkIChfU1RMUF9VU0VfREVDTFNQRUMpICYmICFkZWZpbmVkIChfU1RMUF9VU0VfU1RBVElDX0xJQikKKy8vIHN0bHBvcnRtdC5jcHAgOiBEZWZpbmVzIHRoZSBlbnRyeSBwb2ludCBmb3IgdGhlIERMTCBhcHBsaWNhdGlvbi4KKy8vCisjICB1bmRlZiBGT1JDRV9TWU1CT0wKKyMgIGRlZmluZSBGT1JDRV9TWU1CT0wgQVBJRU5UUlkKKworZXh0ZXJuICJDIiB7CisKK0JPT0wgQVBJRU5UUlkgRGxsTWFpbiggSEFORExFIGhNb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgIERXT1JEICB1bF9yZWFzb25fZm9yX2NhbGwsCisgICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCkgeworICBzd2l0Y2ggKHVsX3JlYXNvbl9mb3JfY2FsbCkgeworICAgIGNhc2UgRExMX1BST0NFU1NfQVRUQUNIOgorICAgICAgRGlzYWJsZVRocmVhZExpYnJhcnlDYWxscygoSElOU1RBTkNFKWhNb2R1bGUpOworICAgIGNhc2UgRExMX1RIUkVBRF9BVFRBQ0g6CisgICAgY2FzZSBETExfVEhSRUFEX0RFVEFDSDoKKyAgICBjYXNlIERMTF9QUk9DRVNTX0RFVEFDSDoKKyAgICAgIGJyZWFrOworICAgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK30gLyogZXh0ZXJuICJDIiAqLworCisjaWYgIWRlZmluZWQgKF9TVExQX01TVkMpICYmICFkZWZpbmVkIChfX01JTkdXMzJfXykKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCitzdGF0aWMgdm9pZCBGT1JDRV9TWU1CT0wKK2ZvcmNlX2xpbmsoKSB7CisgIHNldDxpbnQ+OjppdGVyYXRvciBpdGVyOworICAvLyBfTV9pbmNyZW1lbnQ7IF9NX2RlY3JlbWVudCBpbnN0YW50aWF0aW9uCisgICsraXRlcjsKKyAgLS1pdGVyOworfQorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisjZW5kaWYKKworI2VuZGlmIC8qIF9XSU4zMiAqLworCisjaWYgZGVmaW5lZCAoX19JQ0wpICYmIChfX0lDTCA+PSA5MDApICYmIChfU1RMUF9NU1ZDX0xJQiA8IDEzMDApCisjICB1bmRlZiBzdGQKKworbmFtZXNwYWNlIHN0ZAoreworICB2b2lkIF9TVExQX0NBTEwgdW5leHBlY3RlZCgpIHsKKyAgICB1bmV4cGVjdGVkX2hhbmRsZXIgaGRsOworICAgIHNldF91bmV4cGVjdGVkKGhkbCA9IHNldF91bmV4cGVjdGVkKCh1bmV4cGVjdGVkX2hhbmRsZXIpMCkpOworICAgIGhkbCgpOworICB9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9mYWNldHNfYnluYW1lLmNwcCBiL3NyYy9mYWNldHNfYnluYW1lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2QxYTNkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2ZhY2V0c19ieW5hbWUuY3BwCkBAIC0wLDAgKzEsMTA1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKyNpbmNsdWRlICJzdGxwb3J0X3ByZWZpeC5oIgorCisjaW5jbHVkZSA8aGFzaF9tYXA+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8bG9jYWxlPgorI2luY2x1ZGUgPGlzdHJlYW0+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKworI2luY2x1ZGUgImNfbG9jYWxlLmgiCisjaW5jbHVkZSAibG9jYWxlX2ltcGwuaCIKKyNpbmNsdWRlICJhY3F1aXJlX3JlbGVhc2UuaCIKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY3R5cGVfYnluYW1lPGNoYXI+CisKKyNpZiBkZWZpbmVkIChfX0RNQ19fKQorX1NUTFBfREVDTFNQRUMKKyNlbmRpZgorY3R5cGVfYnluYW1lPGNoYXI+OjpjdHlwZV9ieW5hbWUoY29uc3QgY2hhciogbmFtZSwgc2l6ZV90IHJlZnMpCisgICAgOiBjdHlwZTxjaGFyPiggMCwgZmFsc2UsIHJlZnMpIHsKKyAgaWYgKCFuYW1lKQorICAgIGxvY2FsZTo6X01fdGhyb3dfb25fbnVsbF9uYW1lKCk7CisKKyAgaW50IF9fZXJyX2NvZGU7CisgIGNoYXIgYnVmW19Mb2NhbGVfTUFYX1NJTVBMRV9OQU1FXTsKKyAgX01fY3R5cGUgPSBfU1RMUF9QUklWIF9fYWNxdWlyZV9jdHlwZShuYW1lLCBidWYsIDAsICZfX2Vycl9jb2RlKTsKKyAgaWYgKCFfTV9jdHlwZSkKKyAgICBsb2NhbGU6Ol9NX3Rocm93X29uX2NyZWF0aW9uX2ZhaWx1cmUoX19lcnJfY29kZSwgbmFtZSwgImN0eXBlIik7CisKKyAgX01faW5pdCgpOworfQorCit2b2lkIGN0eXBlX2J5bmFtZTxjaGFyPjo6X01faW5pdCgpIHsKKyAgX01fY3R5cGVfdGFibGUgPSBfTV9ieW5hbWVfdGFibGU7CisKKyAgLy8gV2UgaGF2ZSB0byBkbyB0aGlzLCBpbnN0ZWFkIG9mIGp1c3QgcG9pbnRlciB0d2lkZGxpbmcsIGJlY2F1c2UKKyAgLy8gY3R5cGVfYmFzZTo6bWFzayBpc24ndCB0aGUgc2FtZSB0eXBlIGFzIF9Mb2NhbGVfbWFza190LgorICBjb25zdCBfTG9jYWxlX21hc2tfdCogcCA9IF9Mb2NhbGVfY3R5cGVfdGFibGUoX01fY3R5cGUpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSAhPSB0YWJsZV9zaXplOyArK2kpIHsKKyAgICBfTV9ieW5hbWVfdGFibGVbaV0gPSBjdHlwZV9iYXNlOjptYXNrKHBbaV0pOworICB9Cit9CisKK2N0eXBlX2J5bmFtZTxjaGFyPjo6fmN0eXBlX2J5bmFtZSgpCit7IF9TVExQX1BSSVYgX19yZWxlYXNlX2N0eXBlKF9NX2N0eXBlKTsgfQorCitjaGFyIGN0eXBlX2J5bmFtZTxjaGFyPjo6ZG9fdG91cHBlcihjaGFyIGMpIGNvbnN0Cit7IHJldHVybiAoY2hhcilfTG9jYWxlX3RvdXBwZXIoX01fY3R5cGUsIGMpOyB9CisKK2NoYXIgY3R5cGVfYnluYW1lPGNoYXI+Ojpkb190b2xvd2VyKGNoYXIgYykgY29uc3QKK3sgcmV0dXJuIChjaGFyKV9Mb2NhbGVfdG9sb3dlcihfTV9jdHlwZSwgYyk7IH0KKworY29uc3QgY2hhcioKK2N0eXBlX2J5bmFtZTxjaGFyPjo6ZG9fdG91cHBlcihjaGFyKiBmaXJzdCwgY29uc3QgY2hhciogbGFzdCkgY29uc3QgeworICBmb3IgKCA7IGZpcnN0ICE9IGxhc3QgOyArK2ZpcnN0KQorICAgICpmaXJzdCA9IChjaGFyKV9Mb2NhbGVfdG91cHBlcihfTV9jdHlwZSwgKmZpcnN0KTsKKyAgcmV0dXJuIGxhc3Q7Cit9CisKK2NvbnN0IGNoYXIqCitjdHlwZV9ieW5hbWU8Y2hhcj46OmRvX3RvbG93ZXIoY2hhciogZmlyc3QsIGNvbnN0IGNoYXIqIGxhc3QpIGNvbnN0IHsKKyAgZm9yICggOyBmaXJzdCAhPSBsYXN0IDsgKytmaXJzdCkKKyAgICAqZmlyc3QgPSAoY2hhcilfTG9jYWxlX3RvbG93ZXIoX01fY3R5cGUsICpmaXJzdCk7CisgIHJldHVybiBsYXN0OworfQorCisKKy8vIFNvbWUgaGVscGVyIGZ1bmN0aW9ucyB1c2VkIGluIGN0eXBlPD46OnNjYW5faXMgYW5kIHNjYW5faXNfbm90LgorI2lmICFkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQorCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKKy8vIGN0eXBlX2J5bmFtZTx3Y2hhcl90PgorCitzdHJ1Y3QgX0N0eXBlX2J5bmFtZV93X2lzX21hc2sgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248d2NoYXJfdCwgYm9vbD4geworICBfTG9jYWxlX21hc2tfdCBNOworICBfTG9jYWxlX2N0eXBlKiBNX2N0cDsKKworICBfQ3R5cGVfYnluYW1lX3dfaXNfbWFzayhfTG9jYWxlX21hc2tfdCBtLCBfTG9jYWxlX2N0eXBlKiBjKQorICAgIDogTShtKSwgTV9jdHAoYykge30KKyAgYm9vbCBvcGVyYXRvcigpKHdjaGFyX3QgYykgY29uc3QKKyAgeyByZXR1cm4gX1dMb2NhbGVfY3R5cGUoTV9jdHAsIGMsIE0pICE9IDA7IH0KK307CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCisjaWYgZGVmaW5lZCAoX19ETUNfXykKK19TVExQX0RFQ0xTUEVDCisjZW5kaWYKK2N0eXBlX2J5bmFtZTx3Y2hhcl90Pjo6Y3R5cGVfYnluYW1lKGNvbnN0IGNoYXIqIG5hbWUsIHNpemVfdCByZWZzKQorICA6IGN0eXBlPHdjaGFyX3Q+KHJlZnMpIHsKKyAgaWYgKCFuYW1lKQorICAgIGxvY2FsZTo6X01fdGhyb3dfb25fbnVsbF9uYW1lKCk7CisKKyAgaW50IF9fZXJyX2NvZGU7CisgIGNoYXIgYnVmW19Mb2NhbGVfTUFYX1NJTVBMRV9OQU1FXTsKKyAgX01fY3R5cGUgPSBfU1RMUF9QUklWIF9fYWNxdWlyZV9jdHlwZShuYW1lLCBidWYsIDAsICZfX2Vycl9jb2RlKTsKKyAgaWYgKCFfTV9jdHlwZSkKKyAgICBsb2NhbGU6Ol9NX3Rocm93X29uX2NyZWF0aW9uX2ZhaWx1cmUoX19lcnJfY29kZSwgbmFtZSwgImN0eXBlIik7Cit9CisKK2N0eXBlX2J5bmFtZTx3Y2hhcl90Pjo6fmN0eXBlX2J5bmFtZSgpCit7IF9TVExQX1BSSVYgX19yZWxlYXNlX2N0eXBlKF9NX2N0eXBlKTsgfQorCitib29sIGN0eXBlX2J5bmFtZTx3Y2hhcl90Pjo6ZG9faXMoY3R5cGVfYmFzZTo6bWFzayAgbSwgd2NoYXJfdCBjKSBjb25zdAoreyByZXR1cm4gX1dMb2NhbGVfY3R5cGUoX01fY3R5cGUsIGMsIChfTG9jYWxlX21hc2tfdCltKSAhPSAwOyB9CisKK2NvbnN0IHdjaGFyX3QqCitjdHlwZV9ieW5hbWU8d2NoYXJfdD46OmRvX2lzKGNvbnN0IHdjaGFyX3QqIGxvdywgY29uc3Qgd2NoYXJfdCogaGlnaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R5cGVfYmFzZTo6bWFzayAqIG0pIGNvbnN0IHsKKyAgX0xvY2FsZV9tYXNrX3QgYWxsX2JpdHMgPSBfTG9jYWxlX21hc2tfdChjdHlwZV9iYXNlOjpzcGFjZSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R5cGVfYmFzZTo6cHJpbnQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eXBlX2Jhc2U6OmNudHJsIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHlwZV9iYXNlOjp1cHBlciB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R5cGVfYmFzZTo6bG93ZXIgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eXBlX2Jhc2U6OmFscGhhIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHlwZV9iYXNlOjpkaWdpdCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R5cGVfYmFzZTo6cHVuY3QgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eXBlX2Jhc2U6OnhkaWdpdCk7CisKKyAgZm9yICggOyBsb3cgPCBoaWdoOyArK2xvdywgKyttKQorICAgICptID0gY3R5cGVfYmFzZTo6bWFzayAoX1dMb2NhbGVfY3R5cGUoX01fY3R5cGUsICpsb3csIGFsbF9iaXRzKSk7CisgIHJldHVybiBoaWdoOworfQorCitjb25zdCB3Y2hhcl90KgorY3R5cGVfYnluYW1lPHdjaGFyX3Q+CisgIDo6ZG9fc2Nhbl9pcyhjdHlwZV9iYXNlOjptYXNrICBtLCBjb25zdCB3Y2hhcl90KiBsb3csIGNvbnN0IHdjaGFyX3QqIGhpZ2gpIGNvbnN0Cit7IHJldHVybiBmaW5kX2lmKGxvdywgaGlnaCwgX1NUTFBfUFJJViBfQ3R5cGVfYnluYW1lX3dfaXNfbWFzayhtLCBfTV9jdHlwZSkpOyB9CisKK2NvbnN0IHdjaGFyX3QqCitjdHlwZV9ieW5hbWU8d2NoYXJfdD4KKyAgOjpkb19zY2FuX25vdChjdHlwZV9iYXNlOjptYXNrICBtLCBjb25zdCB3Y2hhcl90KiBsb3csIGNvbnN0IHdjaGFyX3QqIGhpZ2gpIGNvbnN0Cit7IHJldHVybiBmaW5kX2lmKGxvdywgaGlnaCwgbm90MShfU1RMUF9QUklWIF9DdHlwZV9ieW5hbWVfd19pc19tYXNrKG0sIF9NX2N0eXBlKSkpOyB9CisKK3djaGFyX3QgY3R5cGVfYnluYW1lPHdjaGFyX3Q+Ojpkb190b3VwcGVyKHdjaGFyX3QgYykgY29uc3QKK3sgcmV0dXJuIF9XTG9jYWxlX3RvdXBwZXIoX01fY3R5cGUsIGMpOyB9CisKK2NvbnN0IHdjaGFyX3QqCitjdHlwZV9ieW5hbWU8d2NoYXJfdD46OmRvX3RvdXBwZXIod2NoYXJfdCogbG93LCBjb25zdCB3Y2hhcl90KiBoaWdoKSBjb25zdCB7CisgIGZvciAoIDsgbG93IDwgaGlnaDsgKytsb3cpCisgICAgKmxvdyA9IF9XTG9jYWxlX3RvdXBwZXIoX01fY3R5cGUsICpsb3cpOworICByZXR1cm4gaGlnaDsKK30KKword2NoYXJfdCBjdHlwZV9ieW5hbWU8d2NoYXJfdD46OmRvX3RvbG93ZXIod2NoYXJfdCBjKSBjb25zdAoreyByZXR1cm4gX1dMb2NhbGVfdG9sb3dlcihfTV9jdHlwZSwgYyk7IH0KKworY29uc3Qgd2NoYXJfdCoKK2N0eXBlX2J5bmFtZTx3Y2hhcl90Pjo6ZG9fdG9sb3dlcih3Y2hhcl90KiBsb3csIGNvbnN0IHdjaGFyX3QqIGhpZ2gpIGNvbnN0IHsKKyAgZm9yICggOyBsb3cgPCBoaWdoOyArK2xvdykKKyAgICAqbG93ID0gX1dMb2NhbGVfdG9sb3dlcihfTV9jdHlwZSwgKmxvdyk7CisgIHJldHVybiBoaWdoOworfQorCisjZW5kaWYgLyogV0NIQVJfVCAqLworCisvLyBjb2xsYXRlX2J5bmFtZTxjaGFyPgorI2lmIGRlZmluZWQgKF9fRE1DX18pCitfU1RMUF9ERUNMU1BFQworI2VuZGlmCitjb2xsYXRlX2J5bmFtZTxjaGFyPjo6Y29sbGF0ZV9ieW5hbWUoY29uc3QgY2hhciogbmFtZSwgc2l6ZV90IHJlZnMpCisgIDogY29sbGF0ZTxjaGFyPihyZWZzKSB7CisgIGlmICghbmFtZSkKKyAgICBsb2NhbGU6Ol9NX3Rocm93X29uX251bGxfbmFtZSgpOworCisgIGludCBfX2Vycl9jb2RlOworICBjaGFyIGJ1ZltfTG9jYWxlX01BWF9TSU1QTEVfTkFNRV07CisgIF9NX2NvbGxhdGUgPSBfU1RMUF9QUklWIF9fYWNxdWlyZV9jb2xsYXRlKG5hbWUsIGJ1ZiwgMCwgJl9fZXJyX2NvZGUpOworICBpZiAoIV9NX2NvbGxhdGUpCisgICAgbG9jYWxlOjpfTV90aHJvd19vbl9jcmVhdGlvbl9mYWlsdXJlKF9fZXJyX2NvZGUsIG5hbWUsICJjb2xsYXRlIik7Cit9CisKK2NvbGxhdGVfYnluYW1lPGNoYXI+Ojp+Y29sbGF0ZV9ieW5hbWUoKQoreyBfU1RMUF9QUklWIF9fcmVsZWFzZV9jb2xsYXRlKF9NX2NvbGxhdGUpOyB9CisKK2ludCBjb2xsYXRlX2J5bmFtZTxjaGFyPjo6ZG9fY29tcGFyZShjb25zdCBjaGFyKiBfX2xvdzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogX19oaWdoMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBfX2xvdzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogX19oaWdoMikgY29uc3QgeworICByZXR1cm4gX0xvY2FsZV9zdHJjbXAoX01fY29sbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fbG93MSwgX19oaWdoMSAtIF9fbG93MSwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fbG93MiwgX19oaWdoMiAtIF9fbG93Mik7Cit9CisKK2NvbGxhdGVfYnluYW1lPGNoYXI+OjpzdHJpbmdfdHlwZQorY29sbGF0ZV9ieW5hbWU8Y2hhcj46OmRvX3RyYW5zZm9ybShjb25zdCBjaGFyKiBsb3csIGNvbnN0IGNoYXIqIGhpZ2gpIGNvbnN0IHsKKyAgaWYgKGxvdyA9PSBoaWdoKQorICAgIHJldHVybiBzdHJpbmdfdHlwZSgpOworCisgIHNpemVfdCBuID0gX0xvY2FsZV9zdHJ4ZnJtKF9NX2NvbGxhdGUsIE5VTEwsIDAsIGxvdywgaGlnaCAtIGxvdyk7CisKKyAgLy8gTk9UIFBPUlRBQkxFLiAgV2hhdCB3ZSdyZSBkb2luZyByZWxpZXMgb24gaW50ZXJuYWwgZGV0YWlscyBvZiB0aGUKKyAgLy8gc3RyaW5nIGltcGxlbWVudGF0aW9uLiAgKENvbnRpZ3VpdHkgb2Ygc3RyaW5nIGVsZW1lbnRzIGFuZCBwcmVzZW5jZQorICAvLyBvZiB0cmFpbGluZyB6ZXJvLikKKyAgc3RyaW5nX3R5cGUgYnVmKG4sIDApOworICBfTG9jYWxlX3N0cnhmcm0oX01fY29sbGF0ZSwgJigqYnVmLmJlZ2luKCkpLCBuICsgMSwgbG93LCBoaWdoIC0gbG93KTsKKyAgcmV0dXJuIGJ1ZjsKK30KKworCisjaWYgIWRlZmluZWQgKF9TVExQX05PX1dDSEFSX1QpCisKKy8vIGNvbGxhdGVfYnluYW1lPHdjaGFyX3Q+CisKKyNpZiBkZWZpbmVkIChfX0RNQ19fKQorX1NUTFBfREVDTFNQRUMKKyNlbmRpZgorY29sbGF0ZV9ieW5hbWU8d2NoYXJfdD46OmNvbGxhdGVfYnluYW1lKGNvbnN0IGNoYXIqIG5hbWUsIHNpemVfdCByZWZzKQorICA6IGNvbGxhdGU8d2NoYXJfdD4ocmVmcykgeworICBpZiAoIW5hbWUpCisgICAgbG9jYWxlOjpfTV90aHJvd19vbl9udWxsX25hbWUoKTsKKworICBpbnQgX19lcnJfY29kZTsKKyAgY2hhciBidWZbX0xvY2FsZV9NQVhfU0lNUExFX05BTUVdOworICBfTV9jb2xsYXRlID0gX1NUTFBfUFJJViBfX2FjcXVpcmVfY29sbGF0ZShuYW1lLCBidWYsIDAsICZfX2Vycl9jb2RlKTsKKyAgaWYgKCFfTV9jb2xsYXRlKQorICAgIGxvY2FsZTo6X01fdGhyb3dfb25fY3JlYXRpb25fZmFpbHVyZShfX2Vycl9jb2RlLCBuYW1lLCAiY29sbGF0ZSIpOworfQorCitjb2xsYXRlX2J5bmFtZTx3Y2hhcl90Pjo6fmNvbGxhdGVfYnluYW1lKCkKK3sgX1NUTFBfUFJJViBfX3JlbGVhc2VfY29sbGF0ZShfTV9jb2xsYXRlKTsgfQorCitpbnQgY29sbGF0ZV9ieW5hbWU8d2NoYXJfdD46OmRvX2NvbXBhcmUoY29uc3Qgd2NoYXJfdCogbG93MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBoaWdoMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBsb3cyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIGhpZ2gyKSBjb25zdCB7CisgIHJldHVybiBfV0xvY2FsZV9zdHJjbXAoX01fY29sbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsb3cxLCBoaWdoMSAtIGxvdzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgbG93MiwgaGlnaDIgLSBsb3cyKTsKK30KKworY29sbGF0ZV9ieW5hbWU8d2NoYXJfdD46OnN0cmluZ190eXBlCitjb2xsYXRlX2J5bmFtZTx3Y2hhcl90Pjo6ZG9fdHJhbnNmb3JtKGNvbnN0IHdjaGFyX3QqIGxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogaGlnaCkgY29uc3QgeworICBpZiAobG93ID09IGhpZ2gpCisgICAgcmV0dXJuIHN0cmluZ190eXBlKCk7CisKKyAgc2l6ZV90IG4gPSBfV0xvY2FsZV9zdHJ4ZnJtKF9NX2NvbGxhdGUsIE5VTEwsIDAsIGxvdywgaGlnaCAtIGxvdyk7CisKKyAgLy8gTk9UIFBPUlRBQkxFLiAgV2hhdCB3ZSdyZSBkb2luZyByZWxpZXMgb24gaW50ZXJuYWwgZGV0YWlscyBvZiB0aGUKKyAgLy8gc3RyaW5nIGltcGxlbWVudGF0aW9uLiAgKENvbnRpZ3VpdHkgb2Ygc3RyaW5nIGVsZW1lbnRzIGFuZCBwcmVzZW5jZQorICAvLyBvZiB0cmFpbGluZyB6ZXJvLikKKyAgc3RyaW5nX3R5cGUgYnVmKG4sIDApOworICBfV0xvY2FsZV9zdHJ4ZnJtKF9NX2NvbGxhdGUsICYoKmJ1Zi5iZWdpbigpKSwgbiArIDEsIGxvdywgaGlnaCAtIGxvdyk7CisgIHJldHVybiBidWY7Cit9CisKKyNlbmRpZiAvKiAgX1NUTFBfTk9fV0NIQVJfVCAqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvZGVjdnRfYnluYW1lPGNoYXI+CisKK2NvZGVjdnRfYnluYW1lPGNoYXIsIGNoYXIsIG1ic3RhdGVfdD4KKyAgOjpjb2RlY3Z0X2J5bmFtZShjb25zdCBjaGFyKiBuYW1lLCBzaXplX3QgcmVmcykKKyAgICA6IGNvZGVjdnQ8Y2hhciwgY2hhciwgbWJzdGF0ZV90PihyZWZzKSB7CisgIGlmICghbmFtZSkKKyAgICBsb2NhbGU6Ol9NX3Rocm93X29uX251bGxfbmFtZSgpOworfQorCitjb2RlY3Z0X2J5bmFtZTxjaGFyLCBjaGFyLCBtYnN0YXRlX3Q+Ojp+Y29kZWN2dF9ieW5hbWUoKSB7fQorCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb2RlY3Z0X2J5bmFtZTx3Y2hhcl90PgorY29kZWN2dF9ieW5hbWU8d2NoYXJfdCwgY2hhciwgbWJzdGF0ZV90Pjo6Y29kZWN2dF9ieW5hbWUoY29uc3QgY2hhciogbmFtZSwgc2l6ZV90IHJlZnMpCisgIDogY29kZWN2dDx3Y2hhcl90LCBjaGFyLCBtYnN0YXRlX3Q+KHJlZnMpIHsKKyAgaWYgKCFuYW1lKQorICAgIGxvY2FsZTo6X01fdGhyb3dfb25fbnVsbF9uYW1lKCk7CisKKyAgaW50IF9fZXJyX2NvZGU7CisgIGNoYXIgYnVmW19Mb2NhbGVfTUFYX1NJTVBMRV9OQU1FXTsKKyAgX01fY29kZWN2dCA9IF9TVExQX1BSSVYgX19hY3F1aXJlX2NvZGVjdnQobmFtZSwgYnVmLCAwLCAmX19lcnJfY29kZSk7CisgIGlmICghX01fY29kZWN2dCkKKyAgICBsb2NhbGU6Ol9NX3Rocm93X29uX2NyZWF0aW9uX2ZhaWx1cmUoX19lcnJfY29kZSwgbmFtZSwgImN0eXBlIik7Cit9CisKK2NvZGVjdnRfYnluYW1lPHdjaGFyX3QsIGNoYXIsIG1ic3RhdGVfdD46On5jb2RlY3Z0X2J5bmFtZSgpCit7IF9TVExQX1BSSVYgX19yZWxlYXNlX2NvZGVjdnQoX01fY29kZWN2dCk7IH0KKworY29kZWN2dDx3Y2hhcl90LCBjaGFyLCBtYnN0YXRlX3Q+OjpyZXN1bHQKK2NvZGVjdnRfYnluYW1lPHdjaGFyX3QsIGNoYXIsIG1ic3RhdGVfdD46OmRvX291dChzdGF0ZV90eXBlJiAgICAgICAgIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludGVybl90eXBlKiAgZnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnRlcm5fdHlwZSogIGZyb21fZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludGVybl90eXBlKiYgZnJvbV9uZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybl90eXBlKiAgICAgICAgdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuX3R5cGUqICAgICAgICB0b19saW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5fdHlwZSomICAgICAgIHRvX25leHQpIGNvbnN0IHsKKyAgd2hpbGUgKGZyb20gIT0gZnJvbV9lbmQgJiYgdG8gIT0gdG9fbGltaXQpIHsKKyAgICBzaXplX3QgY2hhcnNfc3RvcmVkID0gX1dMb2NhbGVfd2N0b21iKF9NX2NvZGVjdnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bywgdG9fbGltaXQgLSB0bywgKmZyb20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdGUpOworICAgIGlmIChjaGFyc19zdG9yZWQgPT0gKHNpemVfdCkgLTEpIHsKKyAgICAgIGZyb21fbmV4dCA9IGZyb207CisgICAgICB0b19uZXh0ICAgPSB0bzsKKyAgICAgIHJldHVybiBlcnJvcjsKKyAgICB9CisgICAgZWxzZSBpZiAoY2hhcnNfc3RvcmVkID09IChzaXplX3QpIC0yKSB7CisgICAgICBmcm9tX25leHQgPSBmcm9tOworICAgICAgdG9fbmV4dCAgID0gdG87CisgICAgICByZXR1cm4gcGFydGlhbDsKKyAgICB9CisKKyAgICArK2Zyb207CisgICAgdG8gKz0gY2hhcnNfc3RvcmVkOworICB9CisKKyAgZnJvbV9uZXh0ID0gZnJvbTsKKyAgdG9fbmV4dCAgID0gdG87CisgIHJldHVybiBvazsKK30KKworY29kZWN2dDx3Y2hhcl90LCBjaGFyLCBtYnN0YXRlX3Q+OjpyZXN1bHQKK2NvZGVjdnRfYnluYW1lPHdjaGFyX3QsIGNoYXIsIG1ic3RhdGVfdD46OmRvX2luKHN0YXRlX3R5cGUmICAgICAgICAgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleHRlcm5fdHlwZSogIGZyb20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleHRlcm5fdHlwZSogIGZyb21fZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXh0ZXJuX3R5cGUqJiBmcm9tX25leHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5fdHlwZSogICAgICAgIHRvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuX3R5cGUqICAgICAgICB0b19lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5fdHlwZSomICAgICAgIHRvX25leHQpIGNvbnN0IHsKKyAgd2hpbGUgKGZyb20gIT0gZnJvbV9lbmQgJiYgdG8gIT0gdG9fZW5kKSB7CisgICAgc2l6ZV90IGNoYXJzX3JlYWQgPSBfV0xvY2FsZV9tYnRvd2MoX01fY29kZWN2dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bywgZnJvbSwgZnJvbV9lbmQgLSBmcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0ZSk7CisgICAgaWYgKGNoYXJzX3JlYWQgPT0gKHNpemVfdCkgLTEpIHsKKyAgICAgIGZyb21fbmV4dCA9IGZyb207CisgICAgICB0b19uZXh0ICAgPSB0bzsKKyAgICAgIHJldHVybiBlcnJvcjsKKyAgICB9CisKKyAgICBpZiAoY2hhcnNfcmVhZCA9PSAoc2l6ZV90KSAtMikgeworICAgICAgZnJvbV9uZXh0ID0gZnJvbTsKKyAgICAgIHRvX25leHQgICA9IHRvOworICAgICAgcmV0dXJuIHBhcnRpYWw7CisgICAgfQorCisgICAgZnJvbSArPSBjaGFyc19yZWFkOworICAgIHRvKys7CisgIH0KKworICBmcm9tX25leHQgPSBmcm9tOworICB0b19uZXh0ICAgPSB0bzsKKyAgcmV0dXJuIG9rOworfQorCitjb2RlY3Z0PHdjaGFyX3QsIGNoYXIsIG1ic3RhdGVfdD46OnJlc3VsdAorY29kZWN2dF9ieW5hbWU8d2NoYXJfdCwgY2hhciwgbWJzdGF0ZV90Pjo6ZG9fdW5zaGlmdChzdGF0ZV90eXBlJiAgIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5fdHlwZSogIHRvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5fdHlwZSogIHRvX2xpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5fdHlwZSomIHRvX25leHQpIGNvbnN0IHsKKyAgdG9fbmV4dCA9IHRvOworICBzaXplX3QgcmVzdWx0ID0gX1dMb2NhbGVfdW5zaGlmdChfTV9jb2RlY3Z0LCAmc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvLCB0b19saW1pdCAtIHRvLCAmdG9fbmV4dCk7CisgIGlmIChyZXN1bHQgPT0gKHNpemVfdCkgLTEpCisgICAgcmV0dXJuIGVycm9yOworICBlbHNlIGlmIChyZXN1bHQgPT0gKHNpemVfdCkgLTIpCisgICAgcmV0dXJuIHBhcnRpYWw7CisgIGVsc2UKKyMgICAgaWYgZGVmaW5lZCAoX19JU0NQUF9fKQorICAgIHJldHVybiAvKnRvX25leHQgPT0gdG8gPyBub2NvbnYgOiovIG9rOworIyAgICBlbHNlCisgICAgcmV0dXJuIHRvX25leHQgPT0gdG8gPyBub2NvbnYgOiBvazsKKyMgICAgZW5kaWYKK30KKworaW50Citjb2RlY3Z0X2J5bmFtZTx3Y2hhcl90LCBjaGFyLCBtYnN0YXRlX3Q+Ojpkb19lbmNvZGluZygpIGNvbnN0IF9TVExQX05PVEhST1cgeworICBpZiAoX1dMb2NhbGVfaXNfc3RhdGVsZXNzKF9NX2NvZGVjdnQpKSB7CisgICAgaW50IG1heF93aWR0aCA9IF9XTG9jYWxlX21iX2N1cl9tYXgoX01fY29kZWN2dCk7CisgICAgaW50IG1pbl93aWR0aCA9IF9XTG9jYWxlX21iX2N1cl9taW4oX01fY29kZWN2dCk7CisgICAgcmV0dXJuIG1pbl93aWR0aCA9PSBtYXhfd2lkdGggPyBtaW5fd2lkdGggOiAwOworICB9CisgIGVsc2UKKyAgICByZXR1cm4gLTE7Cit9CisKK2Jvb2wKK2NvZGVjdnRfYnluYW1lPHdjaGFyX3QsIGNoYXIsIG1ic3RhdGVfdD46OmRvX2Fsd2F5c19ub2NvbnYoKSBjb25zdCBfU1RMUF9OT1RIUk9XCit7IHJldHVybiBmYWxzZTsgfQorCitpbnQKK2NvZGVjdnRfYnluYW1lPHdjaGFyX3QsIGNoYXIsIG1ic3RhdGVfdD46OmRvX2xlbmd0aChzdGF0ZV90eXBlJiAgICAgICAgIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICBleHRlcm5fdHlwZSogZnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgZXh0ZXJuX3R5cGUqIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgIG14KSBjb25zdCB7CisgIHNpemVfdCBfX2NvdW50ID0gMDsKKyAgd2hpbGUgKGZyb20gIT0gZW5kICYmIG14LS0pIHsKKyAgICBpbnRlcm5fdHlwZSBfX2R1bW15OworICAgIHNpemVfdCBjaGFyc19yZWFkID0gX1dMb2NhbGVfbWJ0b3djKF9NX2NvZGVjdnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJl9fZHVtbXksIGZyb20sIGVuZCAtIGZyb20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXRlKTsKKyAgICBpZiAoKGNoYXJzX3JlYWQgPT0gKHNpemVfdCkgLTEpIHx8IChjaGFyc19yZWFkID09IChzaXplX3QpIC0yKSkgLy8gZXJyb3Igb3IgcGFydGlhbAorICAgICAgYnJlYWs7CisgICAgX19jb3VudCArPSBjaGFyc19yZWFkOworICAgIGZyb20gKz0gY2hhcnNfcmVhZDsKKyAgfQorICByZXR1cm4gaW50KF9fY291bnQpOyAKK30KKworaW50Citjb2RlY3Z0X2J5bmFtZTx3Y2hhcl90LCBjaGFyLCBtYnN0YXRlX3Q+Ojpkb19tYXhfbGVuZ3RoKCkgY29uc3QgX1NUTFBfTk9USFJPVworeyByZXR1cm4gX1dMb2NhbGVfbWJfY3VyX21heChfTV9jb2RlY3Z0KTsgfQorI2VuZGlmCisKKy8vIG51bXB1bmN0X2J5bmFtZTxjaGFyPgorbnVtcHVuY3RfYnluYW1lPGNoYXI+OjpudW1wdW5jdF9ieW5hbWUoY29uc3QgY2hhciogbmFtZSwgc2l6ZV90IHJlZnMpCis6IG51bXB1bmN0PGNoYXI+KHJlZnMpIHsKKyAgaWYgKCFuYW1lKQorICAgIGxvY2FsZTo6X01fdGhyb3dfb25fbnVsbF9uYW1lKCk7CisKKyAgaW50IF9fZXJyX2NvZGU7CisgIGNoYXIgYnVmW19Mb2NhbGVfTUFYX1NJTVBMRV9OQU1FXTsKKyAgX01fbnVtZXJpYyA9IF9TVExQX1BSSVYgX19hY3F1aXJlX251bWVyaWMobmFtZSwgYnVmLCAwLCAmX19lcnJfY29kZSk7CisgIGlmICghX01fbnVtZXJpYykKKyAgICBsb2NhbGU6Ol9NX3Rocm93X29uX2NyZWF0aW9uX2ZhaWx1cmUoX19lcnJfY29kZSwgbmFtZSwgIm51bXB1bmN0Iik7Cit9CisKK251bXB1bmN0X2J5bmFtZTxjaGFyPjo6fm51bXB1bmN0X2J5bmFtZSgpCit7IF9TVExQX1BSSVYgX19yZWxlYXNlX251bWVyaWMoX01fbnVtZXJpYyk7IH0KKworY2hhciBudW1wdW5jdF9ieW5hbWU8Y2hhcj46OmRvX2RlY2ltYWxfcG9pbnQoKSBjb25zdAoreyByZXR1cm4gX0xvY2FsZV9kZWNpbWFsX3BvaW50KF9NX251bWVyaWMpOyB9CisKK2NoYXIgbnVtcHVuY3RfYnluYW1lPGNoYXI+Ojpkb190aG91c2FuZHNfc2VwKCkgY29uc3QKK3sgcmV0dXJuIF9Mb2NhbGVfdGhvdXNhbmRzX3NlcChfTV9udW1lcmljKTsgfQorCitzdHJpbmcgbnVtcHVuY3RfYnluYW1lPGNoYXI+Ojpkb19ncm91cGluZygpIGNvbnN0IHsKKyAgY29uc3QgY2hhciAqIF9fZ3JvdXBpbmcgPSBfTG9jYWxlX2dyb3VwaW5nKF9NX251bWVyaWMpOworICBpZiAoX19ncm91cGluZyAhPSBOVUxMICYmIF9fZ3JvdXBpbmdbMF0gPT0gQ0hBUl9NQVgpCisgICAgX19ncm91cGluZyA9ICIiOworICByZXR1cm4gX19ncm91cGluZzsKK30KKworc3RyaW5nIG51bXB1bmN0X2J5bmFtZTxjaGFyPjo6ZG9fdHJ1ZW5hbWUoKSBjb25zdAoreyByZXR1cm4gX0xvY2FsZV90cnVlKF9NX251bWVyaWMpOyB9CisKK3N0cmluZyBudW1wdW5jdF9ieW5hbWU8Y2hhcj46OmRvX2ZhbHNlbmFtZSgpIGNvbnN0Cit7IHJldHVybiBfTG9jYWxlX2ZhbHNlKF9NX251bWVyaWMpOyB9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbnVtcHVuY3Q8d2NoYXJfdD4KKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQorCisvLyBudW1wdW5jdF9ieW5hbWU8d2NoYXJfdD4KKworbnVtcHVuY3RfYnluYW1lPHdjaGFyX3Q+OjpudW1wdW5jdF9ieW5hbWUoY29uc3QgY2hhciogbmFtZSwgc2l6ZV90IHJlZnMpCis6IG51bXB1bmN0PHdjaGFyX3Q+KHJlZnMpIHsKKyAgaWYgKCFuYW1lKQorICAgIGxvY2FsZTo6X01fdGhyb3dfb25fbnVsbF9uYW1lKCk7CisKKyAgaW50IF9fZXJyX2NvZGU7CisgIGNoYXIgYnVmW19Mb2NhbGVfTUFYX1NJTVBMRV9OQU1FXTsKKyAgX01fbnVtZXJpYyA9IF9TVExQX1BSSVYgX19hY3F1aXJlX251bWVyaWMobmFtZSwgYnVmLCAwLCAmX19lcnJfY29kZSk7CisgIGlmICghX01fbnVtZXJpYykKKyAgICBsb2NhbGU6Ol9NX3Rocm93X29uX2NyZWF0aW9uX2ZhaWx1cmUoX19lcnJfY29kZSwgbmFtZSwgIm51bXB1bmN0Iik7Cit9CisKK251bXB1bmN0X2J5bmFtZTx3Y2hhcl90Pjo6fm51bXB1bmN0X2J5bmFtZSgpCit7IF9TVExQX1BSSVYgX19yZWxlYXNlX251bWVyaWMoX01fbnVtZXJpYyk7IH0KKword2NoYXJfdCBudW1wdW5jdF9ieW5hbWU8d2NoYXJfdD46OmRvX2RlY2ltYWxfcG9pbnQoKSBjb25zdAoreyByZXR1cm4gX1dMb2NhbGVfZGVjaW1hbF9wb2ludChfTV9udW1lcmljKTsgfQorCit3Y2hhcl90IG51bXB1bmN0X2J5bmFtZTx3Y2hhcl90Pjo6ZG9fdGhvdXNhbmRzX3NlcCgpIGNvbnN0Cit7IHJldHVybiBfV0xvY2FsZV90aG91c2FuZHNfc2VwKF9NX251bWVyaWMpOyB9CisKK3N0cmluZyBudW1wdW5jdF9ieW5hbWU8d2NoYXJfdD46OmRvX2dyb3VwaW5nKCkgY29uc3QgeworICBjb25zdCBjaGFyICogX19ncm91cGluZyA9IF9Mb2NhbGVfZ3JvdXBpbmcoX01fbnVtZXJpYyk7CisgIGlmIChfX2dyb3VwaW5nICE9IE5VTEwgJiYgX19ncm91cGluZ1swXSA9PSBDSEFSX01BWCkKKyAgICBfX2dyb3VwaW5nID0gIiI7CisgIHJldHVybiBfX2dyb3VwaW5nOworfQorCit3c3RyaW5nIG51bXB1bmN0X2J5bmFtZTx3Y2hhcl90Pjo6ZG9fdHJ1ZW5hbWUoKSBjb25zdCB7CisgIHdjaGFyX3QgYnVmWzE2XTsKKyAgcmV0dXJuIF9XTG9jYWxlX3RydWUoX01fbnVtZXJpYywgX1NUTFBfQVJSQVlfQU5EX1NJWkUoYnVmKSk7Cit9CisKK3dzdHJpbmcgbnVtcHVuY3RfYnluYW1lPHdjaGFyX3Q+Ojpkb19mYWxzZW5hbWUoKSBjb25zdCB7CisgIHdjaGFyX3QgYnVmWzE2XTsKKyAgcmV0dXJuIF9XTG9jYWxlX2ZhbHNlKF9NX251bWVyaWMsIF9TVExQX0FSUkFZX0FORF9TSVpFKGJ1ZikpOworfQorCisjZW5kaWYKKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCitzdGF0aWMgdm9pZCBfSW5pdF9tb25ldGFyeV9mb3JtYXRzKG1vbmV5X2Jhc2U6OnBhdHRlcm4mIHBvc19mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbmV5X2Jhc2U6OnBhdHRlcm4mIG5lZ19mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Mb2NhbGVfbW9uZXRhcnkgKiBtb25ldGFyeSkgeworICBzd2l0Y2ggKF9Mb2NhbGVfcF9zaWduX3Bvc24obW9uZXRhcnkpKSB7CisgICAgY2FzZSAwOiAvLyBQYXJlbnRoZXNlcyBzdXJyb3VuZCB0aGUgcXVhbnRpdHkgYW5kIGN1cnJlbmN5IHN5bWJvbAorICAgIGNhc2UgMTogLy8gVGhlIHNpZ24gc3RyaW5nIHByZWNlZGVzIHRoZSBxdWFudGl0eSBhbmQgY3VycmVuY3kgc3ltYm9sCisgICAgICBwb3NfZm9ybWF0LmZpZWxkWzBdID0gKGNoYXIpIG1vbmV5X2Jhc2U6OnNpZ247CisgICAgICBpZiAoX0xvY2FsZV9wX2NzX3ByZWNlZGVzKG1vbmV0YXJ5KSkgeworICAgICAgICAvLyAxIGlmIGN1cnJlbmN5IHN5bWJvbCBwcmVjZWRlcyBhIHBvc2l0aXZlIHZhbHVlCisgICAgICAgIHBvc19mb3JtYXQuZmllbGRbMV0gPSAoY2hhcikgbW9uZXlfYmFzZTo6c3ltYm9sOworICAgICAgICBpZiAoX0xvY2FsZV9wX3NlcF9ieV9zcGFjZShtb25ldGFyeSkpIHsKKyAgICAgICAgICAvLyBhIHNwYWNlIHNlcGFyYXRlcyBjdXJyZW5jeSBzeW1ib2wgZnJvbSBhIHBvc2l0aXZlIHZhbHVlLgorICAgICAgICAgIHBvc19mb3JtYXQuZmllbGRbMl0gPSAoY2hhcikgbW9uZXlfYmFzZTo6c3BhY2U7CisgICAgICAgICAgcG9zX2Zvcm1hdC5maWVsZFszXSA9IChjaGFyKSBtb25leV9iYXNlOjp2YWx1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBhIHNwYWNlIG5vdCBzZXBhcmF0ZXMgY3VycmVuY3kgc3ltYm9sIGZyb20gYSBwb3NpdGl2ZSB2YWx1ZS4KKyAgICAgICAgICBwb3NfZm9ybWF0LmZpZWxkWzJdID0gKGNoYXIpIG1vbmV5X2Jhc2U6OnZhbHVlOworICAgICAgICAgIHBvc19mb3JtYXQuZmllbGRbM10gPSAoY2hhcikgbW9uZXlfYmFzZTo6bm9uZTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gMCBpZiBjdXJyZW5jeSBzeW1ib2wgc3VjY2VlZHMgYSBwb3NpdGl2ZSB2YWx1ZQorICAgICAgICBwb3NfZm9ybWF0LmZpZWxkWzFdID0gKGNoYXIpIG1vbmV5X2Jhc2U6OnZhbHVlOworICAgICAgICBpZiAoX0xvY2FsZV9wX3NlcF9ieV9zcGFjZShtb25ldGFyeSkpIHsKKyAgICAgICAgICAvLyBhIHNwYWNlIHNlcGFyYXRlcyBjdXJyZW5jeSBzeW1ib2wgZnJvbSBhIHBvc2l0aXZlIHZhbHVlLgorICAgICAgICAgIHBvc19mb3JtYXQuZmllbGRbMl0gPSAoY2hhcikgbW9uZXlfYmFzZTo6c3BhY2U7CisgICAgICAgICAgcG9zX2Zvcm1hdC5maWVsZFszXSA9IChjaGFyKSBtb25leV9iYXNlOjpzeW1ib2w7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gYSBzcGFjZSBub3Qgc2VwYXJhdGVzIGN1cnJlbmN5IHN5bWJvbCBmcm9tIGEgcG9zaXRpdmUgdmFsdWUuCisgICAgICAgICAgcG9zX2Zvcm1hdC5maWVsZFsyXSA9IChjaGFyKSBtb25leV9iYXNlOjpzeW1ib2w7CisgICAgICAgICAgcG9zX2Zvcm1hdC5maWVsZFszXSA9IChjaGFyKSBtb25leV9iYXNlOjpub25lOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6IC8vIFRoZSBzaWduIHN0cmluZyBzdWNjZWVkcyB0aGUgcXVhbnRpdHkgYW5kIGN1cnJlbmN5IHN5bWJvbC4KKyAgICAgIGlmIChfTG9jYWxlX3BfY3NfcHJlY2VkZXMobW9uZXRhcnkpKSB7CisgICAgICAgIC8vIDEgaWYgY3VycmVuY3kgc3ltYm9sIHByZWNlZGVzIGEgcG9zaXRpdmUgdmFsdWUKKyAgICAgICAgcG9zX2Zvcm1hdC5maWVsZFswXSA9IChjaGFyKSBtb25leV9iYXNlOjpzeW1ib2w7CisgICAgICAgIGlmIChfTG9jYWxlX3Bfc2VwX2J5X3NwYWNlKG1vbmV0YXJ5KSkgeworICAgICAgICAgIC8vIGEgc3BhY2Ugc2VwYXJhdGVzIGN1cnJlbmN5IHN5bWJvbCBmcm9tIGEgcG9zaXRpdmUgdmFsdWUuCisgICAgICAgICAgcG9zX2Zvcm1hdC5maWVsZFsxXSA9IChjaGFyKSBtb25leV9iYXNlOjpzcGFjZTsKKyAgICAgICAgICBwb3NfZm9ybWF0LmZpZWxkWzJdID0gKGNoYXIpIG1vbmV5X2Jhc2U6OnZhbHVlOworICAgICAgICAgIHBvc19mb3JtYXQuZmllbGRbM10gPSAoY2hhcikgbW9uZXlfYmFzZTo6c2lnbjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBhIHNwYWNlIG5vdCBzZXBhcmF0ZXMgY3VycmVuY3kgc3ltYm9sIGZyb20gYSBwb3NpdGl2ZSB2YWx1ZS4KKyAgICAgICAgICBwb3NfZm9ybWF0LmZpZWxkWzFdID0gKGNoYXIpIG1vbmV5X2Jhc2U6OnZhbHVlOworICAgICAgICAgIHBvc19mb3JtYXQuZmllbGRbMl0gPSAoY2hhcikgbW9uZXlfYmFzZTo6c2lnbjsKKyAgICAgICAgICBwb3NfZm9ybWF0LmZpZWxkWzNdID0gKGNoYXIpIG1vbmV5X2Jhc2U6Om5vbmU7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIDAgaWYgY3VycmVuY3kgc3ltYm9sIHN1Y2NlZWRzIGEgcG9zaXRpdmUgdmFsdWUKKyAgICAgICAgcG9zX2Zvcm1hdC5maWVsZFswXSA9IChjaGFyKSBtb25leV9iYXNlOjp2YWx1ZTsKKyAgICAgICAgaWYgKF9Mb2NhbGVfcF9zZXBfYnlfc3BhY2UobW9uZXRhcnkpKSB7CisgICAgICAgICAgLy8gYSBzcGFjZSBzZXBhcmF0ZXMgY3VycmVuY3kgc3ltYm9sIGZyb20gYSBwb3NpdGl2ZSB2YWx1ZS4KKyAgICAgICAgICBwb3NfZm9ybWF0LmZpZWxkWzFdID0gKGNoYXIpIG1vbmV5X2Jhc2U6OnNwYWNlOworICAgICAgICAgIHBvc19mb3JtYXQuZmllbGRbMl0gPSAoY2hhcikgbW9uZXlfYmFzZTo6c3ltYm9sOworICAgICAgICAgIHBvc19mb3JtYXQuZmllbGRbM10gPSAoY2hhcikgbW9uZXlfYmFzZTo6c2lnbjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBhIHNwYWNlIG5vdCBzZXBhcmF0ZXMgY3VycmVuY3kgc3ltYm9sIGZyb20gYSBwb3NpdGl2ZSB2YWx1ZS4KKyAgICAgICAgICBwb3NfZm9ybWF0LmZpZWxkWzFdID0gKGNoYXIpIG1vbmV5X2Jhc2U6OnN5bWJvbDsKKyAgICAgICAgICBwb3NfZm9ybWF0LmZpZWxkWzJdID0gKGNoYXIpIG1vbmV5X2Jhc2U6OnNpZ247CisgICAgICAgICAgcG9zX2Zvcm1hdC5maWVsZFszXSA9IChjaGFyKSBtb25leV9iYXNlOjpub25lOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIDM6IC8vIFRoZSBzaWduIHN0cmluZyBpbW1lZGlhdGVseSBwcmVjZWRlcyB0aGUgY3VycmVuY3kgc3ltYm9sLgorICAgICAgaWYgKF9Mb2NhbGVfcF9jc19wcmVjZWRlcyhtb25ldGFyeSkpIHsKKyAgICAgICAgLy8gMSBpZiBjdXJyZW5jeSBzeW1ib2wgcHJlY2VkZXMgYSBwb3NpdGl2ZSB2YWx1ZQorICAgICAgICBwb3NfZm9ybWF0LmZpZWxkWzBdID0gKGNoYXIpIG1vbmV5X2Jhc2U6OnNpZ247CisgICAgICAgIHBvc19mb3JtYXQuZmllbGRbMV0gPSAoY2hhcikgbW9uZXlfYmFzZTo6c3ltYm9sOworICAgICAgICBpZiAoX0xvY2FsZV9wX3NlcF9ieV9zcGFjZShtb25ldGFyeSkpIHsKKyAgICAgICAgICAvLyBhIHNwYWNlIHNlcGFyYXRlcyBjdXJyZW5jeSBzeW1ib2wgZnJvbSBhIHBvc2l0aXZlIHZhbHVlLgorICAgICAgICAgIHBvc19mb3JtYXQuZmllbGRbMl0gPSAoY2hhcikgbW9uZXlfYmFzZTo6c3BhY2U7CisgICAgICAgICAgcG9zX2Zvcm1hdC5maWVsZFszXSA9IChjaGFyKSBtb25leV9iYXNlOjp2YWx1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBhIHNwYWNlIG5vdCBzZXBhcmF0ZXMgY3VycmVuY3kgc3ltYm9sIGZyb20gYSBwb3NpdGl2ZSB2YWx1ZS4KKyAgICAgICAgICBwb3NfZm9ybWF0LmZpZWxkWzJdID0gKGNoYXIpIG1vbmV5X2Jhc2U6OnZhbHVlOworICAgICAgICAgIHBvc19mb3JtYXQuZmllbGRbM10gPSAoY2hhcikgbW9uZXlfYmFzZTo6bm9uZTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gMCBpZiBjdXJyZW5jeSBzeW1ib2wgc3VjY2VlZHMgYSBwb3NpdGl2ZSB2YWx1ZQorICAgICAgICBwb3NfZm9ybWF0LmZpZWxkWzBdID0gKGNoYXIpIG1vbmV5X2Jhc2U6OnZhbHVlOworICAgICAgICBwb3NfZm9ybWF0LmZpZWxkWzFdID0gKGNoYXIpIG1vbmV5X2Jhc2U6OnNpZ247CisgICAgICAgIHBvc19mb3JtYXQuZmllbGRbMl0gPSAoY2hhcikgbW9uZXlfYmFzZTo6c3ltYm9sOworICAgICAgICBwb3NfZm9ybWF0LmZpZWxkWzNdID0gKGNoYXIpIG1vbmV5X2Jhc2U6Om5vbmU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ6IC8vIFRoZSBzaWduIHN0cmluZyBpbW1lZGlhdGVseSBzdWNjZWVkcyB0aGUgY3VycmVuY3kgc3ltYm9sLgorICAgICAgaWYgKF9Mb2NhbGVfcF9jc19wcmVjZWRlcyhtb25ldGFyeSkpIHsKKyAgICAgICAgLy8gMSBpZiBjdXJyZW5jeSBzeW1ib2wgcHJlY2VkZXMgYSBwb3NpdGl2ZSB2YWx1ZQorICAgICAgICBwb3NfZm9ybWF0LmZpZWxkWzBdID0gKGNoYXIpIG1vbmV5X2Jhc2U6OnN5bWJvbDsKKyAgICAgICAgcG9zX2Zvcm1hdC5maWVsZFsxXSA9IChjaGFyKSBtb25leV9iYXNlOjpzaWduOworICAgICAgICBwb3NfZm9ybWF0LmZpZWxkWzJdID0gKGNoYXIpIG1vbmV5X2Jhc2U6OnZhbHVlOworICAgICAgICBwb3NfZm9ybWF0LmZpZWxkWzNdID0gKGNoYXIpIG1vbmV5X2Jhc2U6Om5vbmU7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyAwIGlmIGN1cnJlbmN5IHN5bWJvbCBzdWNjZWVkcyBhIHBvc2l0aXZlIHZhbHVlCisgICAgICAgIHBvc19mb3JtYXQuZmllbGRbMF0gPSAoY2hhcikgbW9uZXlfYmFzZTo6dmFsdWU7CisgICAgICAgIGlmIChfTG9jYWxlX3Bfc2VwX2J5X3NwYWNlKG1vbmV0YXJ5KSkgeworICAgICAgICAgIC8vIGEgc3BhY2Ugc2VwYXJhdGVzIGN1cnJlbmN5IHN5bWJvbCBmcm9tIGEgcG9zaXRpdmUgdmFsdWUuCisgICAgICAgICAgcG9zX2Zvcm1hdC5maWVsZFsxXSA9IChjaGFyKSBtb25leV9iYXNlOjpzcGFjZTsKKyAgICAgICAgICBwb3NfZm9ybWF0LmZpZWxkWzJdID0gKGNoYXIpIG1vbmV5X2Jhc2U6OnN5bWJvbDsKKyAgICAgICAgICBwb3NfZm9ybWF0LmZpZWxkWzNdID0gKGNoYXIpIG1vbmV5X2Jhc2U6OnNpZ247CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gYSBzcGFjZSBub3Qgc2VwYXJhdGVzIGN1cnJlbmN5IHN5bWJvbCBmcm9tIGEgcG9zaXRpdmUgdmFsdWUuCisgICAgICAgICAgcG9zX2Zvcm1hdC5maWVsZFsxXSA9IChjaGFyKSBtb25leV9iYXNlOjpzeW1ib2w7CisgICAgICAgICAgcG9zX2Zvcm1hdC5maWVsZFsyXSA9IChjaGFyKSBtb25leV9iYXNlOjpzaWduOworICAgICAgICAgIHBvc19mb3JtYXQuZmllbGRbM10gPSAoY2hhcikgbW9uZXlfYmFzZTo6bm9uZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDogLy8gRGVmYXVsdCBDKysgU3RhbmRhcmQgZm9ybWF0CisgICAgICBwb3NfZm9ybWF0LmZpZWxkWzBdID0gKGNoYXIpIG1vbmV5X2Jhc2U6OnN5bWJvbDsKKyAgICAgIHBvc19mb3JtYXQuZmllbGRbMV0gPSAoY2hhcikgbW9uZXlfYmFzZTo6c2lnbjsKKyAgICAgIHBvc19mb3JtYXQuZmllbGRbMl0gPSAoY2hhcikgbW9uZXlfYmFzZTo6bm9uZTsKKyAgICAgIHBvc19mb3JtYXQuZmllbGRbM10gPSAoY2hhcikgbW9uZXlfYmFzZTo6dmFsdWU7CisgICAgICBicmVhazsKKyAgfQorCisgIHN3aXRjaCAoX0xvY2FsZV9uX3NpZ25fcG9zbihtb25ldGFyeSkpIHsKKyAgICBjYXNlIDA6IC8vIFBhcmVudGhlc2VzIHN1cnJvdW5kIHRoZSBxdWFudGl0eSBhbmQgY3VycmVuY3kgc3ltYm9sCisgICAgY2FzZSAxOiAvLyBUaGUgc2lnbiBzdHJpbmcgcHJlY2VkZXMgdGhlIHF1YW50aXR5IGFuZCBjdXJyZW5jeSBzeW1ib2wKKyAgICAgIG5lZ19mb3JtYXQuZmllbGRbMF0gPSAoY2hhcikgbW9uZXlfYmFzZTo6c2lnbjsKKyAgICAgIGlmIChfTG9jYWxlX25fY3NfcHJlY2VkZXMobW9uZXRhcnkpKSB7CisgICAgICAgIC8vIDEgaWYgY3VycmVuY3kgc3ltYm9sIHByZWNlZGVzIGEgbmVnYXRpdmUgdmFsdWUKKyAgICAgICAgbmVnX2Zvcm1hdC5maWVsZFsxXSA9IChjaGFyKSBtb25leV9iYXNlOjpzeW1ib2w7CisgICAgICAgIGlmIChfTG9jYWxlX25fc2VwX2J5X3NwYWNlKG1vbmV0YXJ5KSkgeworICAgICAgICAgIC8vIGEgc3BhY2Ugc2VwYXJhdGVzIGN1cnJlbmN5IHN5bWJvbCBmcm9tIGEgbmVnYXRpdmUgdmFsdWUuCisgICAgICAgICAgbmVnX2Zvcm1hdC5maWVsZFsyXSA9IChjaGFyKSBtb25leV9iYXNlOjpzcGFjZTsKKyAgICAgICAgICBuZWdfZm9ybWF0LmZpZWxkWzNdID0gKGNoYXIpIG1vbmV5X2Jhc2U6OnZhbHVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIGEgc3BhY2Ugbm90IHNlcGFyYXRlcyBjdXJyZW5jeSBzeW1ib2wgZnJvbSBhIG5lZ2F0aXZlIHZhbHVlLgorICAgICAgICAgIG5lZ19mb3JtYXQuZmllbGRbMl0gPSAoY2hhcikgbW9uZXlfYmFzZTo6dmFsdWU7CisgICAgICAgICAgbmVnX2Zvcm1hdC5maWVsZFszXSA9IChjaGFyKSBtb25leV9iYXNlOjpub25lOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyAwIGlmIGN1cnJlbmN5IHN5bWJvbCBzdWNjZWVkcyBhIG5lZ2F0aXZlIHZhbHVlCisgICAgICAgIG5lZ19mb3JtYXQuZmllbGRbMV0gPSAoY2hhcikgbW9uZXlfYmFzZTo6dmFsdWU7CisgICAgICAgIGlmIChfTG9jYWxlX25fc2VwX2J5X3NwYWNlKG1vbmV0YXJ5KSkgeworICAgICAgICAgIC8vIGEgc3BhY2Ugc2VwYXJhdGVzIGN1cnJlbmN5IHN5bWJvbCBmcm9tIGEgbmVnYXRpdmUgdmFsdWUuCisgICAgICAgICAgbmVnX2Zvcm1hdC5maWVsZFsyXSA9IChjaGFyKSBtb25leV9iYXNlOjpzcGFjZTsKKyAgICAgICAgICBuZWdfZm9ybWF0LmZpZWxkWzNdID0gKGNoYXIpIG1vbmV5X2Jhc2U6OnN5bWJvbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBhIHNwYWNlIG5vdCBzZXBhcmF0ZXMgY3VycmVuY3kgc3ltYm9sIGZyb20gYSBuZWdhdGl2ZSB2YWx1ZS4KKyAgICAgICAgICBuZWdfZm9ybWF0LmZpZWxkWzJdID0gKGNoYXIpIG1vbmV5X2Jhc2U6OnN5bWJvbDsKKyAgICAgICAgICBuZWdfZm9ybWF0LmZpZWxkWzNdID0gKGNoYXIpIG1vbmV5X2Jhc2U6Om5vbmU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjogLy8gVGhlIHNpZ24gc3RyaW5nIHN1Y2NlZWRzIHRoZSBxdWFudGl0eSBhbmQgY3VycmVuY3kgc3ltYm9sLgorICAgICAgaWYgKF9Mb2NhbGVfbl9jc19wcmVjZWRlcyhtb25ldGFyeSkpIHsKKyAgICAgICAgLy8gMSBpZiBjdXJyZW5jeSBzeW1ib2wgcHJlY2VkZXMgYSBuZWdhdGl2ZSB2YWx1ZQorICAgICAgICBuZWdfZm9ybWF0LmZpZWxkWzBdID0gKGNoYXIpIG1vbmV5X2Jhc2U6OnN5bWJvbDsKKyAgICAgICAgaWYgKF9Mb2NhbGVfbl9zZXBfYnlfc3BhY2UobW9uZXRhcnkpKSB7CisgICAgICAgICAgLy8gYSBzcGFjZSBzZXBhcmF0ZXMgY3VycmVuY3kgc3ltYm9sIGZyb20gYSBuZWdhdGl2ZSB2YWx1ZS4KKyAgICAgICAgICBuZWdfZm9ybWF0LmZpZWxkWzFdID0gKGNoYXIpIG1vbmV5X2Jhc2U6OnNwYWNlOworICAgICAgICAgIG5lZ19mb3JtYXQuZmllbGRbMl0gPSAoY2hhcikgbW9uZXlfYmFzZTo6dmFsdWU7CisgICAgICAgICAgbmVnX2Zvcm1hdC5maWVsZFszXSA9IChjaGFyKSBtb25leV9iYXNlOjpzaWduOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIGEgc3BhY2Ugbm90IHNlcGFyYXRlcyBjdXJyZW5jeSBzeW1ib2wgZnJvbSBhIG5lZ2F0aXZlIHZhbHVlLgorICAgICAgICAgIG5lZ19mb3JtYXQuZmllbGRbMV0gPSAoY2hhcikgbW9uZXlfYmFzZTo6dmFsdWU7CisgICAgICAgICAgbmVnX2Zvcm1hdC5maWVsZFsyXSA9IChjaGFyKSBtb25leV9iYXNlOjpzaWduOworICAgICAgICAgIG5lZ19mb3JtYXQuZmllbGRbM10gPSAoY2hhcikgbW9uZXlfYmFzZTo6bm9uZTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gMCBpZiBjdXJyZW5jeSBzeW1ib2wgc3VjY2VlZHMgYSBuZWdhdGl2ZSB2YWx1ZQorICAgICAgICBuZWdfZm9ybWF0LmZpZWxkWzBdID0gKGNoYXIpIG1vbmV5X2Jhc2U6OnZhbHVlOworICAgICAgICBpZiAoX0xvY2FsZV9uX3NlcF9ieV9zcGFjZShtb25ldGFyeSkpIHsKKyAgICAgICAgICAvLyBhIHNwYWNlIHNlcGFyYXRlcyBjdXJyZW5jeSBzeW1ib2wgZnJvbSBhIG5lZ2F0aXZlIHZhbHVlLgorICAgICAgICAgIG5lZ19mb3JtYXQuZmllbGRbMV0gPSAoY2hhcikgbW9uZXlfYmFzZTo6c3BhY2U7CisgICAgICAgICAgbmVnX2Zvcm1hdC5maWVsZFsyXSA9IChjaGFyKSBtb25leV9iYXNlOjpzeW1ib2w7CisgICAgICAgICAgbmVnX2Zvcm1hdC5maWVsZFszXSA9IChjaGFyKSBtb25leV9iYXNlOjpzaWduOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIGEgc3BhY2Ugbm90IHNlcGFyYXRlcyBjdXJyZW5jeSBzeW1ib2wgZnJvbSBhIG5lZ2F0aXZlIHZhbHVlLgorICAgICAgICAgIG5lZ19mb3JtYXQuZmllbGRbMV0gPSAoY2hhcikgbW9uZXlfYmFzZTo6c3ltYm9sOworICAgICAgICAgIG5lZ19mb3JtYXQuZmllbGRbMl0gPSAoY2hhcikgbW9uZXlfYmFzZTo6c2lnbjsKKyAgICAgICAgICBuZWdfZm9ybWF0LmZpZWxkWzNdID0gKGNoYXIpIG1vbmV5X2Jhc2U6Om5vbmU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzogLy8gVGhlIHNpZ24gc3RyaW5nIGltbWVkaWF0ZWx5IHByZWNlZGVzIHRoZSBjdXJyZW5jeSBzeW1ib2wuCisgICAgICBpZiAoX0xvY2FsZV9uX2NzX3ByZWNlZGVzKG1vbmV0YXJ5KSkgeworICAgICAgICAvLyAxIGlmIGN1cnJlbmN5IHN5bWJvbCBwcmVjZWRlcyBhIG5lZ2F0aXZlIHZhbHVlCisgICAgICAgIG5lZ19mb3JtYXQuZmllbGRbMF0gPSAoY2hhcikgbW9uZXlfYmFzZTo6c2lnbjsKKyAgICAgICAgbmVnX2Zvcm1hdC5maWVsZFsxXSA9IChjaGFyKSBtb25leV9iYXNlOjpzeW1ib2w7CisgICAgICAgIGlmIChfTG9jYWxlX25fc2VwX2J5X3NwYWNlKG1vbmV0YXJ5KSkgeworICAgICAgICAgIC8vIGEgc3BhY2Ugc2VwYXJhdGVzIGN1cnJlbmN5IHN5bWJvbCBmcm9tIGEgbmVnYXRpdmUgdmFsdWUuCisgICAgICAgICAgbmVnX2Zvcm1hdC5maWVsZFsyXSA9IChjaGFyKSBtb25leV9iYXNlOjpzcGFjZTsKKyAgICAgICAgICBuZWdfZm9ybWF0LmZpZWxkWzNdID0gKGNoYXIpIG1vbmV5X2Jhc2U6OnZhbHVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIGEgc3BhY2Ugbm90IHNlcGFyYXRlcyBjdXJyZW5jeSBzeW1ib2wgZnJvbSBhIG5lZ2F0aXZlIHZhbHVlLgorICAgICAgICAgIG5lZ19mb3JtYXQuZmllbGRbMl0gPSAoY2hhcikgbW9uZXlfYmFzZTo6dmFsdWU7CisgICAgICAgICAgbmVnX2Zvcm1hdC5maWVsZFszXSA9IChjaGFyKSBtb25leV9iYXNlOjpub25lOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyAwIGlmIGN1cnJlbmN5IHN5bWJvbCBzdWNjZWVkcyBhIG5lZ2F0aXZlIHZhbHVlCisgICAgICAgIG5lZ19mb3JtYXQuZmllbGRbMF0gPSAoY2hhcikgbW9uZXlfYmFzZTo6dmFsdWU7CisgICAgICAgIG5lZ19mb3JtYXQuZmllbGRbMV0gPSAoY2hhcikgbW9uZXlfYmFzZTo6c2lnbjsKKyAgICAgICAgbmVnX2Zvcm1hdC5maWVsZFsyXSA9IChjaGFyKSBtb25leV9iYXNlOjpzeW1ib2w7CisgICAgICAgIG5lZ19mb3JtYXQuZmllbGRbM10gPSAoY2hhcikgbW9uZXlfYmFzZTo6bm9uZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDogLy8gVGhlIHNpZ24gc3RyaW5nIGltbWVkaWF0ZWx5IHN1Y2NlZWRzIHRoZSBjdXJyZW5jeSBzeW1ib2wuCisgICAgICBpZiAoX0xvY2FsZV9uX2NzX3ByZWNlZGVzKG1vbmV0YXJ5KSkgeworICAgICAgICAvLyAxIGlmIGN1cnJlbmN5IHN5bWJvbCBwcmVjZWRlcyBhIG5lZ2F0aXZlIHZhbHVlCisgICAgICAgIG5lZ19mb3JtYXQuZmllbGRbMF0gPSAoY2hhcikgbW9uZXlfYmFzZTo6c3ltYm9sOworICAgICAgICBuZWdfZm9ybWF0LmZpZWxkWzFdID0gKGNoYXIpIG1vbmV5X2Jhc2U6OnNpZ247CisgICAgICAgIG5lZ19mb3JtYXQuZmllbGRbMl0gPSAoY2hhcikgbW9uZXlfYmFzZTo6bm9uZTsKKyAgICAgICAgbmVnX2Zvcm1hdC5maWVsZFszXSA9IChjaGFyKSBtb25leV9iYXNlOjp2YWx1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIDAgaWYgY3VycmVuY3kgc3ltYm9sIHN1Y2NlZWRzIGEgbmVnYXRpdmUgdmFsdWUKKyAgICAgICAgbmVnX2Zvcm1hdC5maWVsZFswXSA9IChjaGFyKSBtb25leV9iYXNlOjp2YWx1ZTsKKyAgICAgICAgaWYgKF9Mb2NhbGVfbl9zZXBfYnlfc3BhY2UobW9uZXRhcnkpKSB7CisgICAgICAgICAgLy8gYSBzcGFjZSBzZXBhcmF0ZXMgY3VycmVuY3kgc3ltYm9sIGZyb20gYSBuZWdhdGl2ZSB2YWx1ZS4KKyAgICAgICAgICBuZWdfZm9ybWF0LmZpZWxkWzFdID0gKGNoYXIpIG1vbmV5X2Jhc2U6OnNwYWNlOworICAgICAgICAgIG5lZ19mb3JtYXQuZmllbGRbMl0gPSAoY2hhcikgbW9uZXlfYmFzZTo6c3ltYm9sOworICAgICAgICAgIG5lZ19mb3JtYXQuZmllbGRbM10gPSAoY2hhcikgbW9uZXlfYmFzZTo6c2lnbjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBhIHNwYWNlIG5vdCBzZXBhcmF0ZXMgY3VycmVuY3kgc3ltYm9sIGZyb20gYSBuZWdhdGl2ZSB2YWx1ZS4KKyAgICAgICAgICBuZWdfZm9ybWF0LmZpZWxkWzFdID0gKGNoYXIpIG1vbmV5X2Jhc2U6OnN5bWJvbDsKKyAgICAgICAgICBuZWdfZm9ybWF0LmZpZWxkWzJdID0gKGNoYXIpIG1vbmV5X2Jhc2U6OnNpZ247CisgICAgICAgICAgbmVnX2Zvcm1hdC5maWVsZFszXSA9IChjaGFyKSBtb25leV9iYXNlOjpub25lOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OiAvLyBEZWZhdWx0IEMrKyBTdGFuZGFyZCBmb3JtYXQKKyAgICAgIG5lZ19mb3JtYXQuZmllbGRbMF0gPSAoY2hhcikgbW9uZXlfYmFzZTo6c3ltYm9sOworICAgICAgbmVnX2Zvcm1hdC5maWVsZFsxXSA9IChjaGFyKSBtb25leV9iYXNlOjpzaWduOworICAgICAgbmVnX2Zvcm1hdC5maWVsZFsyXSA9IChjaGFyKSBtb25leV9iYXNlOjpub25lOworICAgICAgbmVnX2Zvcm1hdC5maWVsZFszXSA9IChjaGFyKSBtb25leV9iYXNlOjp2YWx1ZTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKy8vIGludGVybmF0aW9uYWwgdmFyaWFudCBvZiBtb25ldGFyeQorCisvKgorICogaW50X2N1cnJfc3ltYm9sCisgKgorICogICBUaGUgaW50ZXJuYXRpb25hbCBjdXJyZW5jeSBzeW1ib2wuIFRoZSBvcGVyYW5kIGlzIGEgZm91ci1jaGFyYWN0ZXIKKyAqICAgc3RyaW5nLCB3aXRoIHRoZSBmaXJzdCB0aHJlZSBjaGFyYWN0ZXJzIGNvbnRhaW5pbmcgdGhlIGFscGhhYmV0aWMKKyAqICAgaW50ZXJuYXRpb25hbCBjdXJyZW5jeSBzeW1ib2wgaW4gYWNjb3JkYW5jZSB3aXRoIHRob3NlIHNwZWNpZmllZAorICogICBpbiB0aGUgSVNPIDQyMTcgc3BlY2lmaWNhdGlvbi4gVGhlIGZvdXJ0aCBjaGFyYWN0ZXIgaXMgdGhlIGNoYXJhY3RlciB1c2VkCisgKiAgIHRvIHNlcGFyYXRlIHRoZSBpbnRlcm5hdGlvbmFsIGN1cnJlbmN5IHN5bWJvbCBmcm9tIHRoZSBtb25ldGFyeSBxdWFudGl0eS4KKyAqCisgKiAoaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvNzk5MDk4OTc3NS94YmQvbG9jYWxlLmh0bWwpCisgKi8KKworLyoKKyAqIFN0YW5kYXJkcyBhcmUgdW5jbGVhciBpbiB0aGUgdXNhZ2Ugb2YgaW50ZXJuYXRpb25hbCBjdXJyZW5jeQorICogYW5kIG1vbmV0YXJ5IGZvcm1hdHMuCisgKiBCdXQgSSBhbSBleHBlY3QgdGhhdCBpbnRlcm5hdGlvbmFsIGN1cnJlbmN5IHN5bWJvbCBzaG91bGQgYmUgdGhlIGZpcnN0CisgKiAobm90IGRlcGVuZHMgdXBvbiB3aGVyZSBjdXJyZW5jeSBzeW1ib2wgc2l0dWF0ZWQgaW4gdGhlIG5hdGlvbmFsCisgKiBmb3JtYXQpLgorICoKKyAqIElmIHRoaXMgaXNuJ3Qgc28sIGxldCdzIHNlZToKKyAqICAgICAgIDEgMjM0LjU2IFJVUgorICogICAgICAgR0JQIDEsMjM0LjU2CisgKiAgICAgICBVU0QgMSwyMzQuNTYKKyAqIFRoZSBzaXR1YXRpb24gcmVhbGx5IGlzIHdvcnNlIHRoYW4geW91IHNlZSBhYm92ZToKKyAqIFJVUiB0eXBlZCB3cm9uZyBoZXJlLS0taXQgcHJpbnRzICcxIDIzNC41NiBSVVIgJyAoc2VlIHNwYWNlIGFmdGVyIFJVUikuCisgKiBUaGlzIGlzIGR1ZSB0byBpbnRsX2ZtcC5jdXJyX3N5bWJvbCgpID09ICJSVVIgIi4gKHNlZSByZWZlcmVuY2UgaW4gY29tbWVudHMKKyAqIGFib3ZlKS4KKyAqCisgKi8KKworc3RhdGljIHZvaWQgX0luaXRfbW9uZXRhcnlfZm9ybWF0c19pbnQobW9uZXlfYmFzZTo6cGF0dGVybiYgcG9zX2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbmV5X2Jhc2U6OnBhdHRlcm4mIG5lZ19mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTG9jYWxlX21vbmV0YXJ5ICogbW9uZXRhcnkpCit7CisKKyAgc3dpdGNoIChfTG9jYWxlX3Bfc2lnbl9wb3NuKG1vbmV0YXJ5KSkgeworICAgIGNhc2UgMDogLy8gUGFyZW50aGVzZXMgc3Vycm91bmQgdGhlIHF1YW50aXR5IGFuZCBjdXJyZW5jeSBzeW1ib2wKKyAgICBjYXNlIDE6IC8vIFRoZSBzaWduIHN0cmluZyBwcmVjZWRlcyB0aGUgcXVhbnRpdHkgYW5kIGN1cnJlbmN5IHN5bWJvbAorICAgICAgcG9zX2Zvcm1hdC5maWVsZFswXSA9IChjaGFyKSBtb25leV9iYXNlOjpzeW1ib2w7CisgICAgICBwb3NfZm9ybWF0LmZpZWxkWzFdID0gKGNoYXIpIG1vbmV5X2Jhc2U6OnNpZ247CisgICAgICBwb3NfZm9ybWF0LmZpZWxkWzJdID0gKGNoYXIpIG1vbmV5X2Jhc2U6OnZhbHVlOworICAgICAgcG9zX2Zvcm1hdC5maWVsZFszXSA9IChjaGFyKSBtb25leV9iYXNlOjpub25lOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOiAvLyBUaGUgc2lnbiBzdHJpbmcgc3VjY2VlZHMgdGhlIHF1YW50aXR5IGFuZCBjdXJyZW5jeSBzeW1ib2wuCisgICAgICBwb3NfZm9ybWF0LmZpZWxkWzBdID0gKGNoYXIpIG1vbmV5X2Jhc2U6OnN5bWJvbDsKKyAgICAgIHBvc19mb3JtYXQuZmllbGRbMV0gPSAoY2hhcikgbW9uZXlfYmFzZTo6dmFsdWU7CisgICAgICBwb3NfZm9ybWF0LmZpZWxkWzJdID0gKGNoYXIpIG1vbmV5X2Jhc2U6OnNpZ247CisgICAgICBwb3NfZm9ybWF0LmZpZWxkWzNdID0gKGNoYXIpIG1vbmV5X2Jhc2U6Om5vbmU7CisgICAgICBicmVhazsKKyAgICBjYXNlIDM6IC8vIFRoZSBzaWduIHN0cmluZyBpbW1lZGlhdGVseSBwcmVjZWRlcyB0aGUgY3VycmVuY3kgc3ltYm9sLgorICAgIGNhc2UgNDogLy8gVGhlIHNpZ24gc3RyaW5nIGltbWVkaWF0ZWx5IHN1Y2NlZWRzIHRoZSBjdXJyZW5jeSBzeW1ib2wuCisgICAgICBwb3NfZm9ybWF0LmZpZWxkWzBdID0gKGNoYXIpIG1vbmV5X2Jhc2U6OnN5bWJvbDsKKyAgICAgIGlmIChfTG9jYWxlX3BfY3NfcHJlY2VkZXMobW9uZXRhcnkpKSB7CisgICAgICAgIC8vIDEgaWYgY3VycmVuY3kgc3ltYm9sIHByZWNlZGVzIGEgcG9zaXRpdmUgdmFsdWUKKyAgICAgICAgcG9zX2Zvcm1hdC5maWVsZFsxXSA9IChjaGFyKSBtb25leV9iYXNlOjpzaWduOworICAgICAgICBwb3NfZm9ybWF0LmZpZWxkWzJdID0gKGNoYXIpIG1vbmV5X2Jhc2U6OnZhbHVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gMCBpZiBjdXJyZW5jeSBzeW1ib2wgc3VjY2VlZHMgYSBwb3NpdGl2ZSB2YWx1ZQorICAgICAgICBwb3NfZm9ybWF0LmZpZWxkWzFdID0gKGNoYXIpIG1vbmV5X2Jhc2U6OnZhbHVlOworICAgICAgICBwb3NfZm9ybWF0LmZpZWxkWzJdID0gKGNoYXIpIG1vbmV5X2Jhc2U6OnNpZ247CisgICAgICB9CisgICAgICBwb3NfZm9ybWF0LmZpZWxkWzNdID0gKGNoYXIpIG1vbmV5X2Jhc2U6Om5vbmU7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OiAvLyBEZWZhdWx0IEMrKyBTdGFuZGFyZCBmb3JtYXQKKyAgICAgIHBvc19mb3JtYXQuZmllbGRbMF0gPSAoY2hhcikgbW9uZXlfYmFzZTo6c3ltYm9sOworICAgICAgcG9zX2Zvcm1hdC5maWVsZFsxXSA9IChjaGFyKSBtb25leV9iYXNlOjpzaWduOworICAgICAgcG9zX2Zvcm1hdC5maWVsZFsyXSA9IChjaGFyKSBtb25leV9iYXNlOjpub25lOworICAgICAgcG9zX2Zvcm1hdC5maWVsZFszXSA9IChjaGFyKSBtb25leV9iYXNlOjp2YWx1ZTsKKyAgICAgIGJyZWFrOworICB9CisKKworICBzd2l0Y2ggKF9Mb2NhbGVfbl9zaWduX3Bvc24obW9uZXRhcnkpKSB7CisgICAgY2FzZSAwOiAvLyBQYXJlbnRoZXNlcyBzdXJyb3VuZCB0aGUgcXVhbnRpdHkgYW5kIGN1cnJlbmN5IHN5bWJvbAorICAgIGNhc2UgMTogLy8gVGhlIHNpZ24gc3RyaW5nIHByZWNlZGVzIHRoZSBxdWFudGl0eSBhbmQgY3VycmVuY3kgc3ltYm9sCisgICAgICBuZWdfZm9ybWF0LmZpZWxkWzBdID0gKGNoYXIpIG1vbmV5X2Jhc2U6OnN5bWJvbDsKKyAgICAgIG5lZ19mb3JtYXQuZmllbGRbMV0gPSAoY2hhcikgbW9uZXlfYmFzZTo6c2lnbjsKKyAgICAgIG5lZ19mb3JtYXQuZmllbGRbMl0gPSAoY2hhcikgbW9uZXlfYmFzZTo6dmFsdWU7CisgICAgICBuZWdfZm9ybWF0LmZpZWxkWzNdID0gKGNoYXIpIG1vbmV5X2Jhc2U6Om5vbmU7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6IC8vIFRoZSBzaWduIHN0cmluZyBzdWNjZWVkcyB0aGUgcXVhbnRpdHkgYW5kIGN1cnJlbmN5IHN5bWJvbC4KKyAgICAgIG5lZ19mb3JtYXQuZmllbGRbMF0gPSAoY2hhcikgbW9uZXlfYmFzZTo6c3ltYm9sOworICAgICAgbmVnX2Zvcm1hdC5maWVsZFsxXSA9IChjaGFyKSBtb25leV9iYXNlOjp2YWx1ZTsKKyAgICAgIG5lZ19mb3JtYXQuZmllbGRbMl0gPSAoY2hhcikgbW9uZXlfYmFzZTo6c2lnbjsKKyAgICAgIG5lZ19mb3JtYXQuZmllbGRbM10gPSAoY2hhcikgbW9uZXlfYmFzZTo6bm9uZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzogLy8gVGhlIHNpZ24gc3RyaW5nIGltbWVkaWF0ZWx5IHByZWNlZGVzIHRoZSBjdXJyZW5jeSBzeW1ib2wuCisgICAgY2FzZSA0OiAvLyBUaGUgc2lnbiBzdHJpbmcgaW1tZWRpYXRlbHkgc3VjY2VlZHMgdGhlIGN1cnJlbmN5IHN5bWJvbC4KKyAgICAgIG5lZ19mb3JtYXQuZmllbGRbMF0gPSAoY2hhcikgbW9uZXlfYmFzZTo6c3ltYm9sOworICAgICAgaWYgKF9Mb2NhbGVfbl9jc19wcmVjZWRlcyhtb25ldGFyeSkpIHsKKyAgICAgICAgLy8gMSBpZiBjdXJyZW5jeSBzeW1ib2wgcHJlY2VkZXMgYSBuZWdhdGl2ZSB2YWx1ZQorICAgICAgICBuZWdfZm9ybWF0LmZpZWxkWzFdID0gKGNoYXIpIG1vbmV5X2Jhc2U6OnNpZ247CisgICAgICAgIG5lZ19mb3JtYXQuZmllbGRbMl0gPSAoY2hhcikgbW9uZXlfYmFzZTo6dmFsdWU7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyAwIGlmIGN1cnJlbmN5IHN5bWJvbCBzdWNjZWVkcyBhIG5lZ2F0aXZlIHZhbHVlCisgICAgICAgIG5lZ19mb3JtYXQuZmllbGRbMV0gPSAoY2hhcikgbW9uZXlfYmFzZTo6dmFsdWU7CisgICAgICAgIG5lZ19mb3JtYXQuZmllbGRbMl0gPSAoY2hhcikgbW9uZXlfYmFzZTo6c2lnbjsKKyAgICAgIH0KKyAgICAgIG5lZ19mb3JtYXQuZmllbGRbM10gPSAoY2hhcikgbW9uZXlfYmFzZTo6bm9uZTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6IC8vIERlZmF1bHQgQysrIFN0YW5kYXJkIGZvcm1hdAorICAgICAgbmVnX2Zvcm1hdC5maWVsZFswXSA9IChjaGFyKSBtb25leV9iYXNlOjpzeW1ib2w7CisgICAgICBuZWdfZm9ybWF0LmZpZWxkWzFdID0gKGNoYXIpIG1vbmV5X2Jhc2U6OnNpZ247CisgICAgICBuZWdfZm9ybWF0LmZpZWxkWzJdID0gKGNoYXIpIG1vbmV5X2Jhc2U6Om5vbmU7CisgICAgICBuZWdfZm9ybWF0LmZpZWxkWzNdID0gKGNoYXIpIG1vbmV5X2Jhc2U6OnZhbHVlOworICAgICAgYnJlYWs7CisgIH0KK30KKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKKy8vCisvLyBtb25leXB1bmN0X2J5bmFtZTw+CisvLworbW9uZXlwdW5jdF9ieW5hbWU8Y2hhciwgdHJ1ZT46Om1vbmV5cHVuY3RfYnluYW1lKGNvbnN0IGNoYXIgKiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCByZWZzKQorICAgIDogbW9uZXlwdW5jdDxjaGFyLCB0cnVlPihyZWZzKSB7CisgIGlmICghbmFtZSkKKyAgICBsb2NhbGU6Ol9NX3Rocm93X29uX251bGxfbmFtZSgpOworCisgIGludCBfX2Vycl9jb2RlOworICBjaGFyIGJ1ZltfTG9jYWxlX01BWF9TSU1QTEVfTkFNRV07CisgIF9NX21vbmV0YXJ5ID0gX1NUTFBfUFJJViBfX2FjcXVpcmVfbW9uZXRhcnkobmFtZSwgYnVmLCAwLCAmX19lcnJfY29kZSk7CisgIGlmICghX01fbW9uZXRhcnkpCisgICAgbG9jYWxlOjpfTV90aHJvd19vbl9jcmVhdGlvbl9mYWlsdXJlKF9fZXJyX2NvZGUsIG5hbWUsICJtb25leXB1bmN0Iik7CisKKyAgX1NUTFBfUFJJViBfSW5pdF9tb25ldGFyeV9mb3JtYXRzX2ludChfTV9wb3NfZm9ybWF0LCBfTV9uZWdfZm9ybWF0LCBfTV9tb25ldGFyeSk7Cit9CisKK21vbmV5cHVuY3RfYnluYW1lPGNoYXIsIHRydWU+Ojptb25leXB1bmN0X2J5bmFtZShfTG9jYWxlX21vbmV0YXJ5ICpfX21vbikKKyAgOiBfTV9tb25ldGFyeShfX21vbikgeworICBfU1RMUF9QUklWIF9Jbml0X21vbmV0YXJ5X2Zvcm1hdHNfaW50KF9NX3Bvc19mb3JtYXQsIF9NX25lZ19mb3JtYXQsIF9NX21vbmV0YXJ5KTsKK30KKworbW9uZXlwdW5jdF9ieW5hbWU8Y2hhciwgdHJ1ZT46On5tb25leXB1bmN0X2J5bmFtZSgpCit7IF9TVExQX1BSSVYgX19yZWxlYXNlX21vbmV0YXJ5KF9NX21vbmV0YXJ5KTsgfQorCitjaGFyIG1vbmV5cHVuY3RfYnluYW1lPGNoYXIsIHRydWU+Ojpkb19kZWNpbWFsX3BvaW50KCkgY29uc3QKK3sgcmV0dXJuIF9Mb2NhbGVfbW9uX2RlY2ltYWxfcG9pbnQoX01fbW9uZXRhcnkpOyB9CisKK2NoYXIgbW9uZXlwdW5jdF9ieW5hbWU8Y2hhciwgdHJ1ZT46OmRvX3Rob3VzYW5kc19zZXAoKSBjb25zdAoreyByZXR1cm4gX0xvY2FsZV9tb25fdGhvdXNhbmRzX3NlcChfTV9tb25ldGFyeSk7IH0KKworc3RyaW5nIG1vbmV5cHVuY3RfYnluYW1lPGNoYXIsIHRydWU+Ojpkb19ncm91cGluZygpIGNvbnN0Cit7IHJldHVybiBfTG9jYWxlX21vbl9ncm91cGluZyhfTV9tb25ldGFyeSk7IH0KKworc3RyaW5nIG1vbmV5cHVuY3RfYnluYW1lPGNoYXIsIHRydWU+Ojpkb19jdXJyX3N5bWJvbCgpIGNvbnN0Cit7IHJldHVybiBfTG9jYWxlX2ludF9jdXJyX3N5bWJvbChfTV9tb25ldGFyeSk7IH0KKworc3RyaW5nIG1vbmV5cHVuY3RfYnluYW1lPGNoYXIsIHRydWU+Ojpkb19wb3NpdGl2ZV9zaWduKCkgY29uc3QKK3sgcmV0dXJuIF9Mb2NhbGVfcG9zaXRpdmVfc2lnbihfTV9tb25ldGFyeSk7IH0KKworc3RyaW5nIG1vbmV5cHVuY3RfYnluYW1lPGNoYXIsIHRydWU+Ojpkb19uZWdhdGl2ZV9zaWduKCkgY29uc3QKK3sgcmV0dXJuIF9Mb2NhbGVfbmVnYXRpdmVfc2lnbihfTV9tb25ldGFyeSk7IH0KKworaW50IG1vbmV5cHVuY3RfYnluYW1lPGNoYXIsIHRydWU+Ojpkb19mcmFjX2RpZ2l0cygpIGNvbnN0Cit7IHJldHVybiBfTG9jYWxlX2ludF9mcmFjX2RpZ2l0cyhfTV9tb25ldGFyeSk7IH0KKworbW9uZXlwdW5jdF9ieW5hbWU8Y2hhciwgZmFsc2U+Ojptb25leXB1bmN0X2J5bmFtZShjb25zdCBjaGFyICogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHJlZnMpCisgICAgOiBtb25leXB1bmN0PGNoYXIsIGZhbHNlPihyZWZzKSB7CisgIGlmICghbmFtZSkKKyAgICBsb2NhbGU6Ol9NX3Rocm93X29uX251bGxfbmFtZSgpOworCisgIGludCBfX2Vycl9jb2RlOworICBjaGFyIGJ1ZltfTG9jYWxlX01BWF9TSU1QTEVfTkFNRV07CisgIF9NX21vbmV0YXJ5ID0gX1NUTFBfUFJJViBfX2FjcXVpcmVfbW9uZXRhcnkobmFtZSwgYnVmLCAwLCAmX19lcnJfY29kZSk7CisgIGlmICghX01fbW9uZXRhcnkpCisgICAgbG9jYWxlOjpfTV90aHJvd19vbl9jcmVhdGlvbl9mYWlsdXJlKF9fZXJyX2NvZGUsIG5hbWUsICJtb25leXB1bmN0Iik7CisKKyAgX1NUTFBfUFJJViBfSW5pdF9tb25ldGFyeV9mb3JtYXRzKF9NX3Bvc19mb3JtYXQsIF9NX25lZ19mb3JtYXQsIF9NX21vbmV0YXJ5KTsKK30KKworbW9uZXlwdW5jdF9ieW5hbWU8Y2hhciwgZmFsc2U+Ojptb25leXB1bmN0X2J5bmFtZShfTG9jYWxlX21vbmV0YXJ5ICpfX21vbikKKyAgOiBfTV9tb25ldGFyeShfX21vbikgeworICBfU1RMUF9QUklWIF9Jbml0X21vbmV0YXJ5X2Zvcm1hdHMoX01fcG9zX2Zvcm1hdCwgX01fbmVnX2Zvcm1hdCwgX01fbW9uZXRhcnkpOworfQorCittb25leXB1bmN0X2J5bmFtZTxjaGFyLCBmYWxzZT46On5tb25leXB1bmN0X2J5bmFtZSgpCit7IF9TVExQX1BSSVYgX19yZWxlYXNlX21vbmV0YXJ5KF9NX21vbmV0YXJ5KTsgfQorCitjaGFyIG1vbmV5cHVuY3RfYnluYW1lPGNoYXIsIGZhbHNlPjo6ZG9fZGVjaW1hbF9wb2ludCgpIGNvbnN0Cit7IHJldHVybiBfTG9jYWxlX21vbl9kZWNpbWFsX3BvaW50KF9NX21vbmV0YXJ5KTsgfQorCitjaGFyIG1vbmV5cHVuY3RfYnluYW1lPGNoYXIsIGZhbHNlPjo6ZG9fdGhvdXNhbmRzX3NlcCgpIGNvbnN0Cit7IHJldHVybiBfTG9jYWxlX21vbl90aG91c2FuZHNfc2VwKF9NX21vbmV0YXJ5KTsgfQorCitzdHJpbmcgbW9uZXlwdW5jdF9ieW5hbWU8Y2hhciwgZmFsc2U+Ojpkb19ncm91cGluZygpIGNvbnN0Cit7IHJldHVybiBfTG9jYWxlX21vbl9ncm91cGluZyhfTV9tb25ldGFyeSk7IH0KKworc3RyaW5nIG1vbmV5cHVuY3RfYnluYW1lPGNoYXIsIGZhbHNlPjo6ZG9fY3Vycl9zeW1ib2woKSBjb25zdAoreyByZXR1cm4gX0xvY2FsZV9jdXJyZW5jeV9zeW1ib2woX01fbW9uZXRhcnkpOyB9CisKK3N0cmluZyBtb25leXB1bmN0X2J5bmFtZTxjaGFyLCBmYWxzZT46OmRvX3Bvc2l0aXZlX3NpZ24oKSBjb25zdAoreyByZXR1cm4gX0xvY2FsZV9wb3NpdGl2ZV9zaWduKF9NX21vbmV0YXJ5KTsgfQorCitzdHJpbmcgbW9uZXlwdW5jdF9ieW5hbWU8Y2hhciwgZmFsc2U+Ojpkb19uZWdhdGl2ZV9zaWduKCkgY29uc3QKK3sgcmV0dXJuIF9Mb2NhbGVfbmVnYXRpdmVfc2lnbihfTV9tb25ldGFyeSk7IH0KKworaW50IG1vbmV5cHVuY3RfYnluYW1lPGNoYXIsIGZhbHNlPjo6ZG9fZnJhY19kaWdpdHMoKSBjb25zdAoreyByZXR1cm4gX0xvY2FsZV9mcmFjX2RpZ2l0cyhfTV9tb25ldGFyeSk7IH0KKworLy8KKy8vIG1vbmV5cHVuY3RfYnluYW1lPHdjaGFyX3Q+CisvLworI2lmICFkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQorCittb25leXB1bmN0X2J5bmFtZTx3Y2hhcl90LCB0cnVlPjo6bW9uZXlwdW5jdF9ieW5hbWUoY29uc3QgY2hhciAqIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHJlZnMpCisgICAgOiBtb25leXB1bmN0PHdjaGFyX3QsIHRydWU+KHJlZnMpIHsKKyAgaWYgKCFuYW1lKQorICAgIGxvY2FsZTo6X01fdGhyb3dfb25fbnVsbF9uYW1lKCk7CisKKyAgaW50IF9fZXJyX2NvZGU7CisgIGNoYXIgYnVmW19Mb2NhbGVfTUFYX1NJTVBMRV9OQU1FXTsKKyAgX01fbW9uZXRhcnkgPSBfU1RMUF9QUklWIF9fYWNxdWlyZV9tb25ldGFyeShuYW1lLCBidWYsIDAsICZfX2Vycl9jb2RlKTsKKyAgaWYgKCFfTV9tb25ldGFyeSkKKyAgICBsb2NhbGU6Ol9NX3Rocm93X29uX2NyZWF0aW9uX2ZhaWx1cmUoX19lcnJfY29kZSwgbmFtZSwgIm1vbmV5cHVuY3QiKTsKKworICBfU1RMUF9QUklWIF9Jbml0X21vbmV0YXJ5X2Zvcm1hdHNfaW50KF9NX3Bvc19mb3JtYXQsIF9NX25lZ19mb3JtYXQsIF9NX21vbmV0YXJ5KTsKK30KKworbW9uZXlwdW5jdF9ieW5hbWU8d2NoYXJfdCwgdHJ1ZT46Om1vbmV5cHVuY3RfYnluYW1lKF9Mb2NhbGVfbW9uZXRhcnkgKl9fbW9uKQorICA6IF9NX21vbmV0YXJ5KF9fbW9uKSB7CisgIF9TVExQX1BSSVYgX0luaXRfbW9uZXRhcnlfZm9ybWF0c19pbnQoX01fcG9zX2Zvcm1hdCwgX01fbmVnX2Zvcm1hdCwgX01fbW9uZXRhcnkpOworfQorCittb25leXB1bmN0X2J5bmFtZTx3Y2hhcl90LCB0cnVlPjo6fm1vbmV5cHVuY3RfYnluYW1lKCkKK3sgX1NUTFBfUFJJViBfX3JlbGVhc2VfbW9uZXRhcnkoX01fbW9uZXRhcnkpOyB9CisKK3djaGFyX3QgbW9uZXlwdW5jdF9ieW5hbWU8d2NoYXJfdCwgdHJ1ZT46OmRvX2RlY2ltYWxfcG9pbnQoKSBjb25zdAoreyByZXR1cm4gX0xvY2FsZV9tb25fZGVjaW1hbF9wb2ludChfTV9tb25ldGFyeSk7IH0KKword2NoYXJfdCBtb25leXB1bmN0X2J5bmFtZTx3Y2hhcl90LCB0cnVlPjo6ZG9fdGhvdXNhbmRzX3NlcCgpIGNvbnN0Cit7IHJldHVybiBfTG9jYWxlX21vbl90aG91c2FuZHNfc2VwKF9NX21vbmV0YXJ5KTsgfQorCitzdHJpbmcgbW9uZXlwdW5jdF9ieW5hbWU8d2NoYXJfdCwgdHJ1ZT46OmRvX2dyb3VwaW5nKCkgY29uc3QKK3sgcmV0dXJuIF9Mb2NhbGVfbW9uX2dyb3VwaW5nKF9NX21vbmV0YXJ5KTsgfQorCitpbmxpbmUgd3N0cmluZyBfX2RvX3dpZGVuIChzdHJpbmcgY29uc3QmIHN0cikgeworI2lmIGRlZmluZWQgKF9TVExQX05PX01FTUJFUl9URU1QTEFURVMpIHx8IGRlZmluZWQgKF9TVExQX01TVkMpCisgIHdzdHJpbmc6Ol9SZXNlcnZlX3QgX19SZXNlcnZlOworICBzaXplX3QgX19zaXplID0gc3RyLnNpemUoKTsKKyAgd3N0cmluZyByZXN1bHQoX19SZXNlcnZlLCBfX3NpemUpOworICBjb3B5KHN0ci5iZWdpbigpLCBzdHIuZW5kKCksIHJlc3VsdC5iZWdpbigpKTsKKyNlbHNlCisgIHdzdHJpbmcgcmVzdWx0KHN0ci5iZWdpbigpLCBzdHIuZW5kKCkpOworI2VuZGlmCisgIHJldHVybiByZXN1bHQ7Cit9CisKK3dzdHJpbmcgbW9uZXlwdW5jdF9ieW5hbWU8d2NoYXJfdCwgdHJ1ZT46OmRvX2N1cnJfc3ltYm9sKCkgY29uc3QKK3sgd2NoYXJfdCBidWZbMTZdOyByZXR1cm4gX1dMb2NhbGVfaW50X2N1cnJfc3ltYm9sKF9NX21vbmV0YXJ5LCBfU1RMUF9BUlJBWV9BTkRfU0laRShidWYpKTsgfQorCit3c3RyaW5nIG1vbmV5cHVuY3RfYnluYW1lPHdjaGFyX3QsIHRydWU+Ojpkb19wb3NpdGl2ZV9zaWduKCkgY29uc3QKK3sgd2NoYXJfdCBidWZbMTZdOyByZXR1cm4gX1dMb2NhbGVfcG9zaXRpdmVfc2lnbihfTV9tb25ldGFyeSwgX1NUTFBfQVJSQVlfQU5EX1NJWkUoYnVmKSk7IH0KKword3N0cmluZyBtb25leXB1bmN0X2J5bmFtZTx3Y2hhcl90LCB0cnVlPjo6ZG9fbmVnYXRpdmVfc2lnbigpIGNvbnN0Cit7IHdjaGFyX3QgYnVmWzE2XTsgcmV0dXJuIF9XTG9jYWxlX25lZ2F0aXZlX3NpZ24oX01fbW9uZXRhcnksIF9TVExQX0FSUkFZX0FORF9TSVpFKGJ1ZikpOyB9CisKK2ludCBtb25leXB1bmN0X2J5bmFtZTx3Y2hhcl90LCB0cnVlPjo6ZG9fZnJhY19kaWdpdHMoKSBjb25zdAoreyByZXR1cm4gX0xvY2FsZV9pbnRfZnJhY19kaWdpdHMoX01fbW9uZXRhcnkpOyB9CisKK21vbmV5cHVuY3RfYnluYW1lPHdjaGFyX3QsIGZhbHNlPjo6bW9uZXlwdW5jdF9ieW5hbWUoY29uc3QgY2hhciAqIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCByZWZzKQorICAgIDogbW9uZXlwdW5jdDx3Y2hhcl90LCBmYWxzZT4ocmVmcykgeworICBpZiAoIW5hbWUpCisgICAgbG9jYWxlOjpfTV90aHJvd19vbl9udWxsX25hbWUoKSA7CisKKyAgaW50IF9fZXJyX2NvZGU7CisgIGNoYXIgYnVmW19Mb2NhbGVfTUFYX1NJTVBMRV9OQU1FXTsKKyAgX01fbW9uZXRhcnkgPSBfU1RMUF9QUklWIF9fYWNxdWlyZV9tb25ldGFyeShuYW1lLCBidWYsIDAsICZfX2Vycl9jb2RlKTsKKyAgaWYgKCFfTV9tb25ldGFyeSkKKyAgICBsb2NhbGU6Ol9NX3Rocm93X29uX2NyZWF0aW9uX2ZhaWx1cmUoX19lcnJfY29kZSwgbmFtZSwgIm1vbmV5cHVuY3QiKTsKKworICBfU1RMUF9QUklWIF9Jbml0X21vbmV0YXJ5X2Zvcm1hdHMoX01fcG9zX2Zvcm1hdCwgX01fbmVnX2Zvcm1hdCwgX01fbW9uZXRhcnkpOworfQorCittb25leXB1bmN0X2J5bmFtZTx3Y2hhcl90LCBmYWxzZT46Om1vbmV5cHVuY3RfYnluYW1lKF9Mb2NhbGVfbW9uZXRhcnkgKl9fbW9uKQorICA6IF9NX21vbmV0YXJ5KF9fbW9uKSB7CisgIF9TVExQX1BSSVYgX0luaXRfbW9uZXRhcnlfZm9ybWF0cyhfTV9wb3NfZm9ybWF0LCBfTV9uZWdfZm9ybWF0LCBfTV9tb25ldGFyeSk7Cit9CisKK21vbmV5cHVuY3RfYnluYW1lPHdjaGFyX3QsIGZhbHNlPjo6fm1vbmV5cHVuY3RfYnluYW1lKCkKK3sgX1NUTFBfUFJJViBfX3JlbGVhc2VfbW9uZXRhcnkoX01fbW9uZXRhcnkpOyB9CisKK3djaGFyX3QgbW9uZXlwdW5jdF9ieW5hbWU8d2NoYXJfdCwgZmFsc2U+Ojpkb19kZWNpbWFsX3BvaW50KCkgY29uc3QKK3sgcmV0dXJuIF9Mb2NhbGVfbW9uX2RlY2ltYWxfcG9pbnQoX01fbW9uZXRhcnkpOyB9CisKK3djaGFyX3QgbW9uZXlwdW5jdF9ieW5hbWU8d2NoYXJfdCwgZmFsc2U+Ojpkb190aG91c2FuZHNfc2VwKCkgY29uc3QKK3sgcmV0dXJuIF9Mb2NhbGVfbW9uX3Rob3VzYW5kc19zZXAoX01fbW9uZXRhcnkpOyB9CisKK3N0cmluZyBtb25leXB1bmN0X2J5bmFtZTx3Y2hhcl90LCBmYWxzZT46OmRvX2dyb3VwaW5nKCkgY29uc3QKK3sgcmV0dXJuIF9Mb2NhbGVfbW9uX2dyb3VwaW5nKF9NX21vbmV0YXJ5KTsgfQorCit3c3RyaW5nIG1vbmV5cHVuY3RfYnluYW1lPHdjaGFyX3QsIGZhbHNlPjo6ZG9fY3Vycl9zeW1ib2woKSBjb25zdAoreyB3Y2hhcl90IGJ1ZlsxNl07IHJldHVybiBfV0xvY2FsZV9jdXJyZW5jeV9zeW1ib2woX01fbW9uZXRhcnksIF9TVExQX0FSUkFZX0FORF9TSVpFKGJ1ZikpOyB9CisKK3dzdHJpbmcgbW9uZXlwdW5jdF9ieW5hbWU8d2NoYXJfdCwgZmFsc2U+Ojpkb19wb3NpdGl2ZV9zaWduKCkgY29uc3QKK3sgd2NoYXJfdCBidWZbMTZdOyByZXR1cm4gX1dMb2NhbGVfcG9zaXRpdmVfc2lnbihfTV9tb25ldGFyeSwgX1NUTFBfQVJSQVlfQU5EX1NJWkUoYnVmKSk7IH0KKword3N0cmluZyBtb25leXB1bmN0X2J5bmFtZTx3Y2hhcl90LCBmYWxzZT46OmRvX25lZ2F0aXZlX3NpZ24oKSBjb25zdAoreyB3Y2hhcl90IGJ1ZlsxNl07IHJldHVybiBfV0xvY2FsZV9uZWdhdGl2ZV9zaWduKF9NX21vbmV0YXJ5LCBfU1RMUF9BUlJBWV9BTkRfU0laRShidWYpKTsgfQorCitpbnQgbW9uZXlwdW5jdF9ieW5hbWU8d2NoYXJfdCwgZmFsc2U+Ojpkb19mcmFjX2RpZ2l0cygpIGNvbnN0Cit7IHJldHVybiBfTG9jYWxlX2ZyYWNfZGlnaXRzKF9NX21vbmV0YXJ5KTsgfQorCisjZW5kaWYKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCmRpZmYgLS1naXQgYS9zcmMvZnN0cmVhbS5jcHAgYi9zcmMvZnN0cmVhbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE1NDNiYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9mc3RyZWFtLmNwcApAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2luY2x1ZGUgInN0bHBvcnRfcHJlZml4LmgiCisKKyNpZmRlZiBfU1RMUF9VU0VfVU5JWF9JTworIyBpbmNsdWRlICJkZXRhaWxzL2ZzdHJlYW1fdW5pc3RkLmNwcCIKKyNlbGlmIGRlZmluZWQoX1NUTFBfVVNFX1NURElPX0lPKQorIyBpbmNsdWRlICJkZXRhaWxzL2ZzdHJlYW1fc3RkaW8uY3BwIgorI2VsaWYgZGVmaW5lZChfU1RMUF9VU0VfV0lOMzJfSU8pCisjIGluY2x1ZGUgImRldGFpbHMvZnN0cmVhbV93aW4zMmlvLmNwcCIKKyNlbHNlCisjICBlcnJvciAiQ2FuJ3QgcmVjb2duaXplIElPIHNjaGVtZSB0byB1c2UiCisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKKy8vIGZicCA6IGxldCB1cyBtYXAgMSBNQiBtYXhpbXVtLCBqdXN0IGJlIHN1cmUgbm90IHRvIHRyYXNoIFZNCisjZGVmaW5lIE1NQVBfQ0hVTksgMHgxMDAwMDBMCisKK19VbmRlcmZsb3c8IGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID46OmludF90eXBlIF9TVExQX0NBTEwKK19VbmRlcmZsb3c8IGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID46Ol9NX2RvaXQoYmFzaWNfZmlsZWJ1ZjxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+KiBfX3RoaXMpCit7CisgIHR5cGVkZWYgY2hhcl90cmFpdHM8Y2hhcj4gdHJhaXRzX3R5cGU7CisgIHR5cGVkZWYgdHJhaXRzX3R5cGU6OmludF90eXBlIGludF90eXBlOworCisgIGlmICghX190aGlzLT5fTV9pbl9pbnB1dF9tb2RlKSB7CisgICAgaWYgKCFfX3RoaXMtPl9NX3N3aXRjaF90b19pbnB1dF9tb2RlKCkpCisgICAgICByZXR1cm4gdHJhaXRzX3R5cGU6OmVvZigpOworICB9CisgIGVsc2UgaWYgKF9fdGhpcy0+X01faW5fcHV0YmFja19tb2RlKSB7CisgICAgX190aGlzLT5fTV9leGl0X3B1dGJhY2tfbW9kZSgpOworICAgIGlmIChfX3RoaXMtPmdwdHIoKSAhPSBfX3RoaXMtPmVncHRyKCkpIHsKKyAgICAgIGludF90eXBlIF9fYyA9IHRyYWl0c190eXBlOjp0b19pbnRfdHlwZSgqX190aGlzLT5ncHRyKCkpOworICAgICAgcmV0dXJuIF9fYzsKKyAgICB9CisgIH0KKworICAvLyBJZiBpdCdzIGEgZGlzayBmaWxlLCBhbmQgaWYgdGhlIGludGVybmFsIGFuZCBleHRlcm5hbCBjaGFyYWN0ZXIKKyAgLy8gc2VxdWVuY2VzIGFyZSBndWFyYW50ZWVkIHRvIGJlIGlkZW50aWNhbCwgdGhlbiB0cnkgdG8gdXNlIG1lbW9yeQorICAvLyBtYXBwZWQgSS9PLiAgT3RoZXJ3aXNlLCByZXZlcnQgdG8gb3JkaW5hcnkgcmVhZC4KKyAgaWYgKF9fdGhpcy0+X01fYmFzZS5fX3JlZ3VsYXJfZmlsZSgpCisgICAgICAmJiBfX3RoaXMtPl9NX2Fsd2F5c19ub2NvbnYKKyAgICAgICYmIF9fdGhpcy0+X01fYmFzZS5fTV9pbl9iaW5hcnlfbW9kZSgpKSB7CisgICAgLy8gSWYgd2UndmUgbW1hcHBlZCBwYXJ0IG9mIHRoZSBmaWxlIGFscmVhZHksIHRoZW4gdW5tYXAgaXQuCisgICAgaWYgKF9fdGhpcy0+X01fbW1hcF9iYXNlKQorICAgICAgX190aGlzLT5fTV9iYXNlLl9NX3VubWFwKF9fdGhpcy0+X01fbW1hcF9iYXNlLCBfX3RoaXMtPl9NX21tYXBfbGVuKTsKKworICAgIC8vIERldGVybWluZSB0aGUgcG9zaXRpb24gd2hlcmUgd2Ugc3RhcnQgbWFwcGluZy4gIEl0IGhhcyB0byBiZQorICAgIC8vIGEgbXVsdGlwbGUgb2YgdGhlIHBhZ2Ugc2l6ZS4KKyAgICBzdHJlYW1vZmYgX19jdXIgPSBfX3RoaXMtPl9NX2Jhc2UuX01fc2VlaygwLCBpb3NfYmFzZTo6Y3VyKTsKKyAgICBzdHJlYW1vZmYgX19zaXplID0gX190aGlzLT5fTV9iYXNlLl9NX2ZpbGVfc2l6ZSgpOworICAgIGlmIChfX3NpemUgPiAwICYmIF9fY3VyID49IDAgJiYgX19jdXIgPCBfX3NpemUpIHsKKyAgICAgIHN0cmVhbW9mZiBfX29mZnNldCA9IChfX2N1ciAvIF9fdGhpcy0+X01fYmFzZS5fX3BhZ2Vfc2l6ZSgpKSAqIF9fdGhpcy0+X01fYmFzZS5fX3BhZ2Vfc2l6ZSgpOworICAgICAgc3RyZWFtb2ZmIF9fcmVtYWluZGVyID0gX19jdXIgLSBfX29mZnNldDsKKworICAgICAgX190aGlzLT5fTV9tbWFwX2xlbiA9IF9fc2l6ZSAtIF9fb2Zmc2V0OworCisgICAgICBpZiAoX190aGlzLT5fTV9tbWFwX2xlbiA+IE1NQVBfQ0hVTkspCisgICAgICAgIF9fdGhpcy0+X01fbW1hcF9sZW4gPSBNTUFQX0NIVU5LOworCisgICAgICBpZiAoKF9fdGhpcy0+X01fbW1hcF9iYXNlID0gX190aGlzLT5fTV9iYXNlLl9NX21tYXAoX19vZmZzZXQsIF9fdGhpcy0+X01fbW1hcF9sZW4pKSAhPSAwKSB7CisgICAgICAgIF9fdGhpcy0+c2V0ZyhfX1NUQVRJQ19DQVNUKGNoYXIqLCBfX3RoaXMtPl9NX21tYXBfYmFzZSksCisgICAgICAgICAgICAgICAgICAgICBfX1NUQVRJQ19DQVNUKGNoYXIqLCBfX3RoaXMtPl9NX21tYXBfYmFzZSkgKyBfX1NUQVRJQ19DQVNUKHB0cmRpZmZfdCwgX19yZW1haW5kZXIpLAorICAgICAgICAgICAgICAgICAgICAgX19TVEFUSUNfQ0FTVChjaGFyKiwgX190aGlzLT5fTV9tbWFwX2Jhc2UpICsgX19TVEFUSUNfQ0FTVChwdHJkaWZmX3QsIF9fdGhpcy0+X01fbW1hcF9sZW4pKTsKKyAgICAgICAgcmV0dXJuIHRyYWl0c190eXBlOjp0b19pbnRfdHlwZSgqX190aGlzLT5ncHRyKCkpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBfX3RoaXMtPl9NX21tYXBfbGVuID0gMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBfX3RoaXMtPl9NX21tYXBfYmFzZSA9IDA7CisgICAgICBfX3RoaXMtPl9NX21tYXBfbGVuID0gMDsKKyAgICB9CisgIH0KKworICByZXR1cm4gX190aGlzLT5fTV91bmRlcmZsb3dfYXV4KCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRm9yY2UgaW5zdGFudGlhdGlvbiBvZiBmaWxlYnVmIGFuZCBmc3RyZWFtIGNsYXNzZXMuCisjaWYgIWRlZmluZWQoX1NUTFBfTk9fRk9SQ0VfSU5TVEFOVElBVEUpCisKK3RlbXBsYXRlIGNsYXNzIGJhc2ljX2ZpbGVidWY8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPjsKK3RlbXBsYXRlIGNsYXNzIGJhc2ljX2lmc3RyZWFtPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID47Cit0ZW1wbGF0ZSBjbGFzcyBiYXNpY19vZnN0cmVhbTxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+OwordGVtcGxhdGUgY2xhc3MgYmFzaWNfZnN0cmVhbTxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+OworCisjICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkKK3RlbXBsYXRlIGNsYXNzIF9VbmRlcmZsb3c8d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPjsKK3RlbXBsYXRlIGNsYXNzIGJhc2ljX2ZpbGVidWY8d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPjsKK3RlbXBsYXRlIGNsYXNzIGJhc2ljX2lmc3RyZWFtPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID47Cit0ZW1wbGF0ZSBjbGFzcyBiYXNpY19vZnN0cmVhbTx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+OwordGVtcGxhdGUgY2xhc3MgYmFzaWNfZnN0cmVhbTx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+OworIyAgZW5kaWYgLyogX1NUTFBfTk9fV0NIQVJfVCAqLworCisjZW5kaWYKKworX1NUTFBfRU5EX05BTUVTUEFDRQpkaWZmIC0tZ2l0IGEvc3JjL2lvcy5jcHAgYi9zcmMvaW9zLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjM1ZTBiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2lvcy5jcHAKQEAgLTAsMCArMSwzMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpbmNsdWRlICJzdGxwb3J0X3ByZWZpeC5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGlvcz4KKyNpbmNsdWRlIDxsb2NhbGU+CisjaW5jbHVkZSA8b3N0cmVhbT4gLy8gZm9yIF9fZ2V0X29zdHJlYW1idWYgZGVmaW5pdGlvbgorCisjaW5jbHVkZSAiYWxpZ25lZF9idWZmZXIuaCIKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gaW9zX2Jhc2UgbWVtYmVycworCisvLyBjbGFzcyBpb3NfYmFzZTo6ZmFpbHVyZSwgYSBzdWJjbGFzcyBvZiBleGNlcHRpb24uICBJdCdzIHVzZWQgc29sZWx5CisvLyBmb3IgcmVwb3J0aW5nIGVycm9ycy4KKworaW9zX2Jhc2U6OmZhaWx1cmU6OmZhaWx1cmUoY29uc3Qgc3RyaW5nJiBzKQorICA6IF9fTmFtZWRfZXhjZXB0aW9uKHMpCit7fQorCitpb3NfYmFzZTo6ZmFpbHVyZTo6fmZhaWx1cmUoKSBfU1RMUF9OT1RIUk9XX0lOSEVSRU5UTFkge30KKworI2lmICFkZWZpbmVkIChfU1RMUF9TVEFUSUNfQ09OU1RfSU5JVF9CVUcpICYmICFkZWZpbmVkIChfU1RMUF9OT19TVEFUSUNfQ09OU1RfREVGSU5JVElPTikKKy8vIERlZmluaXRpb25zIG9mIGlvc19iYXNlJ3MgZm9ybWF0dGluZyBmbGFncy4KK2NvbnN0IGlvc19iYXNlOjpmbXRmbGFncyBpb3NfYmFzZTo6bGVmdDsKK2NvbnN0IGlvc19iYXNlOjpmbXRmbGFncyBpb3NfYmFzZTo6cmlnaHQ7Citjb25zdCBpb3NfYmFzZTo6Zm10ZmxhZ3MgaW9zX2Jhc2U6OmludGVybmFsOworY29uc3QgaW9zX2Jhc2U6OmZtdGZsYWdzIGlvc19iYXNlOjpkZWM7Citjb25zdCBpb3NfYmFzZTo6Zm10ZmxhZ3MgaW9zX2Jhc2U6OmhleDsKK2NvbnN0IGlvc19iYXNlOjpmbXRmbGFncyBpb3NfYmFzZTo6b2N0OworY29uc3QgaW9zX2Jhc2U6OmZtdGZsYWdzIGlvc19iYXNlOjpmaXhlZDsKK2NvbnN0IGlvc19iYXNlOjpmbXRmbGFncyBpb3NfYmFzZTo6c2NpZW50aWZpYzsKK2NvbnN0IGlvc19iYXNlOjpmbXRmbGFncyBpb3NfYmFzZTo6Ym9vbGFscGhhOworY29uc3QgaW9zX2Jhc2U6OmZtdGZsYWdzIGlvc19iYXNlOjpzaG93YmFzZTsKK2NvbnN0IGlvc19iYXNlOjpmbXRmbGFncyBpb3NfYmFzZTo6c2hvd3BvaW50OworY29uc3QgaW9zX2Jhc2U6OmZtdGZsYWdzIGlvc19iYXNlOjpzaG93cG9zOworY29uc3QgaW9zX2Jhc2U6OmZtdGZsYWdzIGlvc19iYXNlOjpza2lwd3M7Citjb25zdCBpb3NfYmFzZTo6Zm10ZmxhZ3MgaW9zX2Jhc2U6OnVuaXRidWY7Citjb25zdCBpb3NfYmFzZTo6Zm10ZmxhZ3MgaW9zX2Jhc2U6OnVwcGVyY2FzZTsKK2NvbnN0IGlvc19iYXNlOjpmbXRmbGFncyBpb3NfYmFzZTo6YWRqdXN0ZmllbGQ7Citjb25zdCBpb3NfYmFzZTo6Zm10ZmxhZ3MgaW9zX2Jhc2U6OmJhc2VmaWVsZDsKK2NvbnN0IGlvc19iYXNlOjpmbXRmbGFncyBpb3NfYmFzZTo6ZmxvYXRmaWVsZDsKKworLy8gRGVmaW5pdGlvbnMgb2YgaW9zX2Jhc2UncyBzdGF0ZSBmbGFncy4KK2NvbnN0IGlvc19iYXNlOjppb3N0YXRlIGlvc19iYXNlOjpnb29kYml0OworY29uc3QgaW9zX2Jhc2U6Omlvc3RhdGUgaW9zX2Jhc2U6OmJhZGJpdDsKK2NvbnN0IGlvc19iYXNlOjppb3N0YXRlIGlvc19iYXNlOjplb2ZiaXQ7Citjb25zdCBpb3NfYmFzZTo6aW9zdGF0ZSBpb3NfYmFzZTo6ZmFpbGJpdDsKKworLy8gRGVmaW5pdGlvbnMgb2YgaW9zX2Jhc2UncyBvcGVubW9kZSBmbGFncy4KK2NvbnN0IGlvc19iYXNlOjpvcGVubW9kZSBpb3NfYmFzZTo6YXBwOworY29uc3QgaW9zX2Jhc2U6Om9wZW5tb2RlIGlvc19iYXNlOjphdGU7Citjb25zdCBpb3NfYmFzZTo6b3Blbm1vZGUgaW9zX2Jhc2U6OmJpbmFyeTsKK2NvbnN0IGlvc19iYXNlOjpvcGVubW9kZSBpb3NfYmFzZTo6aW47Citjb25zdCBpb3NfYmFzZTo6b3Blbm1vZGUgaW9zX2Jhc2U6Om91dDsKK2NvbnN0IGlvc19iYXNlOjpvcGVubW9kZSBpb3NfYmFzZTo6dHJ1bmM7CisKKy8vIERlZmluaXRpb25zIG9mIGlvc19iYXNlJ3Mgc2Vla2RpciBmbGFncy4KK2NvbnN0IGlvc19iYXNlOjpzZWVrZGlyIGlvc19iYXNlOjpiZWc7Citjb25zdCBpb3NfYmFzZTo6c2Vla2RpciBpb3NfYmFzZTo6Y3VyOworY29uc3QgaW9zX2Jhc2U6OnNlZWtkaXIgaW9zX2Jhc2U6OmVuZDsKKworI2VuZGlmCisKKy8vIEludGVybmFsIGZ1bmN0aW9ucyB1c2VkIGZvciBtYW5hZ2luZyBleHBvbmVudGlhbGx5LWdyb3dpbmcgYXJyYXlzIG9mCisvLyBQT0QgdHlwZXMuCisKKy8vIGFycmF5IGlzIGEgcG9pbnRlciB0byBOIGVsZW1lbnRzIG9mIHR5cGUgUE9EVHlwZS4gIEV4cGFuZHMgdGhlIGFycmF5LAorLy8gaWYgbmVjZXNzYXJ5LCBzbyB0aGF0IGFycmF5W2luZGV4XSBpcyBtZWFuaW5nZnVsLiAgQWxsIG5ldyBlbGVtZW50cyBhcmUKKy8vIGluaXRpYWxpemVkIHRvIHplcm8uICBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbmV3IGFycmF5LCBhbmQgdGhlIG5ldworLy8gc2l6ZS4KKwordGVtcGxhdGUgPGNsYXNzIFBPRFR5cGU+CitzdGF0aWMgcGFpcjxQT0RUeXBlKiwgc2l6ZV90PgorX1N0bF9leHBhbmRfYXJyYXkoUE9EVHlwZSogX19hcnJheSwgc2l6ZV90IE4sIGludCBpbmRleCkgeworICBpZiAoKGludClOIDwgaW5kZXggKyAxKSB7CisgICAgc2l6ZV90IG5ld19OID0gKG1heCkoMiAqIE4sIHNpemVfdChpbmRleCArIDEpKTsKKyAgICBQT0RUeXBlKiBuZXdfYXJyYXkKKyAgICAgID0gX19TVEFUSUNfQ0FTVChQT0RUeXBlKixyZWFsbG9jKF9fYXJyYXksIG5ld19OICogc2l6ZW9mKFBPRFR5cGUpKSk7CisgICAgaWYgKG5ld19hcnJheSkgeworICAgICAgZmlsbChuZXdfYXJyYXkgKyBOLCBuZXdfYXJyYXkgKyBuZXdfTiwgUE9EVHlwZSgpKTsKKyAgICAgIHJldHVybiBwYWlyPFBPRFR5cGUqLCBzaXplX3Q+KG5ld19hcnJheSwgbmV3X04pOworICAgIH0KKyAgICBlbHNlCisgICAgICByZXR1cm4gcGFpcjxQT0RUeXBlKiwgc2l6ZV90PihfX1NUQVRJQ19DQVNUKFBPRFR5cGUqLDApLCAwKTsKKyAgfQorICBlbHNlCisgICAgcmV0dXJuIHBhaXI8UE9EVHlwZSosIHNpemVfdD4oX19hcnJheSwgTik7Cit9CisKKy8vIGFycmF5IGlzIGEgcG9pbnRlciB0byBOIGVsZW1lbnRzIG9mIHR5cGUgUE9EVHlwZS4gIEFsbG9jYXRlIGEgbmV3CisvLyBhcnJheSBvZiBOIGVsZW1lbnRzLCBjb3B5aW5nIHRoZSB2YWx1ZXMgZnJvbSB0aGUgb2xkIGFycmF5IHRvIHRoZSBuZXcuCisvLyBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBuZXcgYXJyYXkuICBJdCBpcyBhc3N1bWVkIHRoYXQgYXJyYXkgaXMgbm9uLW51bGwKKy8vIGFuZCBOIGlzIG5vbnplcm8uCit0ZW1wbGF0ZSA8Y2xhc3MgUE9EVHlwZT4KK3N0YXRpYyBQT0RUeXBlKiBfU3RsX2NvcHlfYXJyYXkoY29uc3QgUE9EVHlwZSogX19hcnJheSwgc2l6ZV90IE4pIHsKKyAgUE9EVHlwZSogcmVzdWx0ID0gX19TVEFUSUNfQ0FTVChQT0RUeXBlKixtYWxsb2MoTiAqIHNpemVvZihQT0RUeXBlKSkpOworICBpZiAocmVzdWx0KQorICAgIGNvcHkoX19hcnJheSwgX19hcnJheSArIE4sIHJlc3VsdCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK2xvY2FsZSBpb3NfYmFzZTo6aW1idWUoY29uc3QgbG9jYWxlJiBsb2MpIHsKKyAgaWYgKGxvYyAhPSBfTV9sb2NhbGUpIHsKKyAgICBsb2NhbGUgcHJldmlvdXMgPSBfTV9sb2NhbGU7CisgICAgX01fbG9jYWxlID0gbG9jOworICAgIF9NX2ludm9rZV9jYWxsYmFja3MoaW1idWVfZXZlbnQpOworICAgIHJldHVybiBwcmV2aW91czsKKyAgfQorICBlbHNlIHsKKyAgICBfTV9pbnZva2VfY2FsbGJhY2tzKGltYnVlX2V2ZW50KTsKKyAgICByZXR1cm4gX01fbG9jYWxlOworICB9Cit9CisKK2ludCBfU1RMUF9DQUxMIGlvc19iYXNlOjp4YWxsb2MoKSB7CisjaWYgZGVmaW5lZCAoX1NUTFBfVEhSRUFEUykgJiYgXAorICAgIGRlZmluZWQgKF9TVExQX1dJTjMyVEhSRUFEUykgJiYgZGVmaW5lZCAoX1NUTFBfTkVXX1BMQVRGT1JNX1NESykKKyAgc3RhdGljIHZvbGF0aWxlIF9fc3RsX2F0b21pY190IF9TX2luZGV4ID0gMDsKKyAgcmV0dXJuIF9TVExQX0FUT01JQ19JTkNSRU1FTlQoJl9TX2luZGV4KTsKKyNlbHNlCisgIHN0YXRpYyBpbnQgX1NfaW5kZXggPSAwOworICBzdGF0aWMgX1NUTFBfU1RBVElDX01VVEVYIF9fbG9jayBfU1RMUF9NVVRFWF9JTklUSUFMSVpFUjsKKyAgX1NUTFBfYXV0b19sb2NrIHNlbnRyeShfX2xvY2spOworICByZXR1cm4gX1NfaW5kZXgrKzsKKyNlbmRpZgorfQorCitsb25nJiBpb3NfYmFzZTo6aXdvcmQoaW50IGluZGV4KSB7CisgIHN0YXRpYyBsb25nIGR1bW15ID0gMDsKKworICBwYWlyPGxvbmcqLCBzaXplX3Q+IHRtcCA9IF9TdGxfZXhwYW5kX2FycmF5KF9NX2l3b3JkcywgX01fbnVtX2l3b3JkcywgaW5kZXgpOworICBpZiAodG1wLmZpcnN0KSB7ICAgICAgICAgICAgICAvLyBUaGUgYWxsb2NhdGlvbiwgaWYgYW55LCBzdWNjZWVkZWQuCisgICAgX01faXdvcmRzID0gdG1wLmZpcnN0OworICAgIF9NX251bV9pd29yZHMgPSB0bXAuc2Vjb25kOworICAgIHJldHVybiBfTV9pd29yZHNbaW5kZXhdOworICB9CisgIGVsc2UgeworICAgIF9NX3NldHN0YXRlX25vdGhyb3coYmFkYml0KTsKKyAgICBfTV9jaGVja19leGNlcHRpb25fbWFzaygpOworICAgIHJldHVybiBkdW1teTsKKyAgfQorfQorCisKK3ZvaWQqJiBpb3NfYmFzZTo6cHdvcmQoaW50IGluZGV4KSB7CisgIHN0YXRpYyB2b2lkKiBkdW1teSA9IDA7CisKKyAgcGFpcjx2b2lkKiosIHNpemVfdD4gdG1wID0gX1N0bF9leHBhbmRfYXJyYXkoX01fcHdvcmRzLCBfTV9udW1fcHdvcmRzLCBpbmRleCk7CisgIGlmICh0bXAuZmlyc3QpIHsgICAgICAgICAgICAgIC8vIFRoZSBhbGxvY2F0aW9uLCBpZiBhbnksIHN1Y2NlZWRlZC4KKyAgICBfTV9wd29yZHMgPSB0bXAuZmlyc3Q7CisgICAgX01fbnVtX3B3b3JkcyA9IHRtcC5zZWNvbmQ7CisgICAgcmV0dXJuIF9NX3B3b3Jkc1tpbmRleF07CisgIH0KKyAgZWxzZSB7CisgICAgX01fc2V0c3RhdGVfbm90aHJvdyhiYWRiaXQpOworICAgIF9NX2NoZWNrX2V4Y2VwdGlvbl9tYXNrKCk7CisgICAgcmV0dXJuIGR1bW15OworICB9Cit9CisKK3ZvaWQgaW9zX2Jhc2U6OnJlZ2lzdGVyX2NhbGxiYWNrKGV2ZW50X2NhbGxiYWNrIF9fZm4sIGludCBpbmRleCkgeworICBwYWlyPHBhaXI8ZXZlbnRfY2FsbGJhY2ssIGludD4qLCBzaXplX3Q+IHRtcAorICAgID0gX1N0bF9leHBhbmRfYXJyYXkoX01fY2FsbGJhY2tzLCBfTV9udW1fY2FsbGJhY2tzLCAoaW50KV9NX2NhbGxiYWNrX2luZGV4IC8qIGZicDogaW5kZXggPz8/ICovICk7CisgIGlmICh0bXAuZmlyc3QpIHsKKyAgICBfTV9jYWxsYmFja3MgPSB0bXAuZmlyc3Q7CisgICAgX01fbnVtX2NhbGxiYWNrcyA9IHRtcC5zZWNvbmQ7CisgICAgX01fY2FsbGJhY2tzW19NX2NhbGxiYWNrX2luZGV4KytdID0gbWFrZV9wYWlyKF9fZm4sIGluZGV4KTsKKyAgfQorICBlbHNlIHsKKyAgICBfTV9zZXRzdGF0ZV9ub3Rocm93KGJhZGJpdCk7CisgICAgX01fY2hlY2tfZXhjZXB0aW9uX21hc2soKTsKKyAgfQorfQorCisvLyBJbnZva2VzIGFsbCBjdXJyZW50bHkgcmVnaXN0ZXJlZCBjYWxsYmFja3MgZm9yIGEgcGFydGljdWxhciBldmVudC4KKy8vIEJlaGF2ZXMgY29ycmVjdGx5IGV2ZW4gaWYgb25lIG9mIHRoZSBjYWxsYmFja3MgYWRkcyBhIG5ldyBjYWxsYmFjay4KK3ZvaWQgaW9zX2Jhc2U6Ol9NX2ludm9rZV9jYWxsYmFja3MoZXZlbnQgRSkgeworICBmb3IgKHNpemVfdCBpID0gX01fY2FsbGJhY2tfaW5kZXg7IGkgPiAwOyAtLWkpIHsKKyAgICBldmVudF9jYWxsYmFjayBmID0gX01fY2FsbGJhY2tzW2ktMV0uZmlyc3Q7CisgICAgaW50IG4gPSBfTV9jYWxsYmFja3NbaS0xXS5zZWNvbmQ7CisgICAgZihFLCAqdGhpcywgbik7CisgIH0KK30KKworLy8gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaWYgdGhlIHN0YXRlLCByZHN0YXRlKCksIGhhcyBhIGJpdCBzZXQKKy8vIHRoYXQgaXMgYWxzbyBzZXQgaW4gdGhlIGV4Y2VwdGlvbiBtYXNrIGV4Y2VwdGlvbnMoKS4KK3ZvaWQgaW9zX2Jhc2U6Ol9NX3Rocm93X2ZhaWx1cmUoKSB7CisgIGNvbnN0IGNoYXIqIGFyZyA7CisjIGlmIDAKKyAgY2hhciBidWZmZXJbMjU2XTsKKyAgY2hhciogcHRyOworICBzdHJjcHkoYnVmZmVyLCAiaW9zIGZhaWx1cmU6IHJkc3RhdGUgPSAweCIpOworICBwdHIgPSBfX3dyaXRlX2ludGVnZXIoYnVmZmVyK3N0cmxlbihidWZmZXIpLCBpb3NfYmFzZTo6aGV4LCBfX1NUQVRJQ19DQVNUKHVuc2lnbmVkIGxvbmcsX01faW9zdGF0ZSkpOworICBzdHJjcHkocHRyLCAiIG1hc2sgPSAweCIpOworICBwdHIgPSBfX3dyaXRlX2ludGVnZXIoYnVmZmVyK3N0cmxlbihidWZmZXIpLCBpb3NfYmFzZTo6aGV4LCBfX1NUQVRJQ19DQVNUKHVuc2lnbmVkIGxvbmcsX01fZXhjZXB0aW9uX21hc2spKTsKKyAgKnB0ciA9IDA7CisgIGFyZyA9IGJ1ZmZlcjsKKyMgZWxzZQorICBhcmcgPSAiaW9zIGZhaWx1cmUiOworIyBlbmRpZgorCisjIGlmbmRlZiBfU1RMUF9VU0VfRVhDRVBUSU9OUworICBmcHV0cyhhcmcsIHN0ZGVycik7CisjIGVsc2UKKyAgdGhyb3cgZmFpbHVyZShhcmcpOworIyBlbmRpZgorfQorCisvLyBDb3B5IHgncyBzdGF0ZSB0byAqdGhpcy4gIFRoaXMgbWVtYmVyIGZ1bmN0aW9uIGlzIHVzZWQgaW4gdGhlCisvLyBpbXBsZW1lbnRhdGlvbiBvZiBiYXNpY19pb3M6OmNvcHlmbXQuICBEb2VzIG5vdCBjb3B5IF9NX2V4Y2VwdGlvbl9tYXNrCisvLyBvciBfTV9pb3N0YXRlLgordm9pZCBpb3NfYmFzZTo6X01fY29weV9zdGF0ZShjb25zdCBpb3NfYmFzZSYgeCkgeworICBfTV9mbXRmbGFncyAgPSB4Ll9NX2ZtdGZsYWdzOyAvLyBDb3B5IHRoZSBmbGFncywgZXhjZXB0IGZvciBfTV9pb3N0YXRlCisgIF9NX29wZW5tb2RlICA9IHguX01fb3Blbm1vZGU7IC8vIGFuZCBfTV9leGNlcHRpb25fbWFzay4KKyAgX01fc2Vla2RpciAgID0geC5fTV9zZWVrZGlyOworICBfTV9wcmVjaXNpb24gPSB4Ll9NX3ByZWNpc2lvbjsKKyAgX01fd2lkdGggICAgID0geC5fTV93aWR0aDsKKyAgX01fbG9jYWxlICAgID0geC5fTV9sb2NhbGU7CisKKyAgaWYgKHguX01fY2FsbGJhY2tzKSB7CisgICAgcGFpcjxldmVudF9jYWxsYmFjaywgaW50PiogdG1wID0gX1N0bF9jb3B5X2FycmF5KHguX01fY2FsbGJhY2tzLCB4Ll9NX2NhbGxiYWNrX2luZGV4KTsKKyAgICBpZiAodG1wKSB7CisgICAgICBmcmVlKF9NX2NhbGxiYWNrcyk7CisgICAgICBfTV9jYWxsYmFja3MgPSB0bXA7CisgICAgICBfTV9udW1fY2FsbGJhY2tzID0gX01fY2FsbGJhY2tfaW5kZXggPSB4Ll9NX2NhbGxiYWNrX2luZGV4OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIF9NX3NldHN0YXRlX25vdGhyb3coYmFkYml0KTsKKyAgICAgIF9NX2NoZWNrX2V4Y2VwdGlvbl9tYXNrKCk7CisgICAgfQorICB9CisKKyAgaWYgKHguX01faXdvcmRzKSB7CisgICAgbG9uZyogdG1wID0gX1N0bF9jb3B5X2FycmF5KHguX01faXdvcmRzLCB4Ll9NX251bV9pd29yZHMpOworICAgIGlmICh0bXApIHsKKyAgICAgIGZyZWUoX01faXdvcmRzKTsKKyAgICAgIF9NX2l3b3JkcyA9IHRtcDsKKyAgICAgIF9NX251bV9pd29yZHMgPSB4Ll9NX251bV9pd29yZHM7CisgICAgfQorICAgIGVsc2UgeworICAgICAgX01fc2V0c3RhdGVfbm90aHJvdyhiYWRiaXQpOworICAgICAgX01fY2hlY2tfZXhjZXB0aW9uX21hc2soKTsKKyAgICB9CisgIH0KKworICBpZiAoeC5fTV9wd29yZHMpIHsKKyAgICB2b2lkKiogdG1wID0gX1N0bF9jb3B5X2FycmF5KHguX01fcHdvcmRzLCB4Ll9NX251bV9wd29yZHMpOworICAgIGlmICh0bXApIHsKKyAgICAgIGZyZWUoX01fcHdvcmRzKTsKKyAgICAgIF9NX3B3b3JkcyA9IHRtcDsKKyAgICAgIF9NX251bV9wd29yZHMgPSB4Ll9NX251bV9wd29yZHM7CisgICAgfQorICAgIGVsc2UgeworICAgICAgX01fc2V0c3RhdGVfbm90aHJvdyhiYWRiaXQpOworICAgICAgX01fY2hlY2tfZXhjZXB0aW9uX21hc2soKTsKKyAgICB9CisgIH0KK30KKworLy8gaW9zJ3MgKHByb3RlY3RlZCkgZGVmYXVsdCBjb25zdHJ1Y3Rvci4gIFRoZSBzdGFuZGFyZCBzYXlzIHRoYXQgYWxsCisvLyBmaWVsZHMgaGF2ZSBpbmRldGVybWluYXRlIHZhbHVlczsgd2UgaW5pdGlhbGl6ZSB0aGVtIHRvIHplcm8gZm9yCisvLyBzaW1wbGljaXR5LiAgVGhlIG9ubHkgdGhpbmcgdGhhdCByZWFsbHkgbWF0dGVycyBpcyB0aGF0IHRoZSBhcnJheXMKKy8vIGFyZSBhbGwgaW5pdGlhbGx5IG51bGwgcG9pbnRlcnMsIGFuZCB0aGUgYXJyYXkgZWxlbWVudCBjb3VudHMgYXJlIGFsbAorLy8gaW5pdGlhbGx5IHplcm8uCitpb3NfYmFzZTo6aW9zX2Jhc2UoKQorICA6IF9NX2ZtdGZsYWdzKDApLCBfTV9pb3N0YXRlKDApLCBfTV9vcGVubW9kZSgwKSwgX01fc2Vla2RpcigwKSwKKyAgICBfTV9leGNlcHRpb25fbWFzaygwKSwKKyAgICBfTV9wcmVjaXNpb24oMCksIF9NX3dpZHRoKDApLAorICAgIF9NX2xvY2FsZSgpLAorICAgIF9NX2NhbGxiYWNrcygwKSwgX01fbnVtX2NhbGxiYWNrcygwKSwgX01fY2FsbGJhY2tfaW5kZXgoMCksCisgICAgX01faXdvcmRzKDApLCBfTV9udW1faXdvcmRzKDApLAorICAgIF9NX3B3b3JkcygwKSwKKyAgICBfTV9udW1fcHdvcmRzKDApCit7fQorCisvLyBpb3MncyBkZXN0cnVjdG9yLgoraW9zX2Jhc2U6On5pb3NfYmFzZSgpIHsKKyAgX01faW52b2tlX2NhbGxiYWNrcyhlcmFzZV9ldmVudCk7CisgIGZyZWUoX01fY2FsbGJhY2tzKTsKKyAgZnJlZShfTV9pd29yZHMpOworICBmcmVlKF9NX3B3b3Jkcyk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRm9yY2UgaW5zdGFudGlhdGlvbiBvZiBiYXNpY19pb3MKKy8vIEZvciBETEwgZXhwb3J0cywgdGhleSBhcmUgYWxyZWFkeSBpbnN0YW50aWF0ZWQuCisjaWYgIWRlZmluZWQoX1NUTFBfTk9fRk9SQ0VfSU5TVEFOVElBVEUpCit0ZW1wbGF0ZSBjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBiYXNpY19pb3M8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPjsKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQordGVtcGxhdGUgY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgYmFzaWNfaW9zPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID47CisjICBlbmRpZiAvKiBfU1RMUF9OT19XQ0hBUl9UICovCisjZW5kaWYKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3JjL2lvc3RyZWFtLmNwcCBiL3NyYy9pb3N0cmVhbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQzMzI5YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9pb3N0cmVhbS5jcHAKQEAgLTAsMCArMSwzNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisjaW5jbHVkZSAic3RscG9ydF9wcmVmaXguaCIKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxpc3RyZWFtPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaWYgZGVmaW5lZCAoX1NUTFBfTVNWQykgfHwgZGVmaW5lZCAoX19NV0VSS1NfXykgfHwgZGVmaW5lZCAoX19JQ0wpIHx8IGRlZmluZWQgKF9fSVNDUFBfXykKKyMgIGRlZmluZSBfU1RMUF9VU0VfTk9UX0lOSVRfU0VHTUVOVAorIyAgaW5jbHVkZSA8aW9zdHJlYW0+CisjZW5kaWYKKworI2luY2x1ZGUgInN0ZGlvX3N0cmVhbWJ1Zi5oIgorI2luY2x1ZGUgImFsaWduZWRfYnVmZmVyLmgiCisjaW5jbHVkZSAiX3N0ZGlvX2ZpbGUuaCIKKyNpbmNsdWRlICJjX2xvY2FsZS5oIgorCisvLyBib3JpcyA6IG5vdGUgdGhpcyBpcyByZXBlYXRlZCBpbiA8aW9zdHJlYW0+CisjaWZuZGVmIF9TVExQX1VTRV9OQU1FU1BBQ0VTCisvLyBpbiBjYXNlIG9mIFNHSSBpb3N0cmVhbXMsIHdlIGhhdmUgdG8gcmVuYW1lIG91ciBzdHJlYW1zIG5vdCB0byBjbGFzaCB3aXRoIHRob3NlCisvLyBwcm92aWRlZCBpbiBuYXRpdmUgbGliCisjICBkZWZpbmUgY2luIF9TVExQX2NpbgorIyAgZGVmaW5lIGNvdXQgX1NUTFBfY291dAorIyAgZGVmaW5lIGNlcnIgX1NUTFBfY2VycgorIyAgZGVmaW5lIGNsb2cgX1NUTFBfY2xvZworI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisvLyBUaGlzIGZpbGUgaGFuZGxlcyBpb3N0cmVhbSBpbml0aWFsaXphdGlvbi4gIEl0IGlzIGluaGVyZW50bHkKKy8vIG5vbnBvcnRhYmxlLCBzaW5jZSB0aGUgQysrIGxhbmd1YWdlIGRlZmluaXRpb24gcHJvdmlkZXMgbm8gbWVjaGFuaXNtCisvLyBmb3IgY29udHJvbGxpbmcgb3JkZXIgb2YgaW5pdGlhbGl6YXRpb24gb2Ygbm9ubG9jYWwgb2JqZWN0cy4KKy8vIEluaXRpYWxpemF0aW9uIGhhcyB0aHJlZSBwYXJ0cywgd2hpY2ggbXVzdCBiZSBwZXJmb3JtZWQgaW4gdGhlIGZvbGxvd2luZworLy8gb3JkZXI6CisvLyAgKDEpIEluaXRpYWxpemUgdGhlIGxvY2FsZSBzeXN0ZW0KKy8vICAoMikgQ2FsbCB0aGUgY29uc3RydWN0b3JzIGZvciB0aGUgZWlnaHQgZ2xvYmFsIHN0cmVhbSBvYmplY3RzLgorLy8gICgzKSBDcmVhdGUgc3RyZWFtYnVmcyBmb3IgdGhlIGdsb2JhbCBzdHJlYW0gb2JqZWN0cywgYW5kIGluaXRpYWxpemUKKy8vICAgICAgdGhlIHN0cmVhbSBvYmplY3RzIGJ5IGNhbGxpbmcgdGhlIGluaXQoKSBtZW1iZXIgZnVuY3Rpb24uCisKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9OT1RfSU5JVF9TRUdNRU5UKQorCisvLyBEZWZpbml0aW9ucyBvZiB0aGUgZWlnaHQgZ2xvYmFsIEkvTyBvYmplY3RzIHRoYXQgYXJlIGRlY2xhcmVkIGluCisvLyA8aW9zdHJlYW0+LiBGb3Igc29tZSBjb21waWxlcnMgd2UgdXNlIHByYWdtYXMgdG8gcHV0IHRoZSBnbG9iYWwgSS9PCisvLyBvYmplY3RzIGludG8gYW4gaW5pdGlhbGl6YXRpb24gc2VnbWVudCB0aGF0IHdpbGwgbm90CisvLyBiZSBleGVjdXRlZC4gV2UgdGhlbiBleHBsaWNpdGx5IGludm9rZSB0aGUgY29uc3RydWN0b3JzCisvLyB3aXRoIHBsYWNlbWVudCBuZXcgaW4gaW9zX2Jhc2U6Ol9TX2luaXRpYWxpemUoKQorCisjICBpZiBkZWZpbmVkIChfX01XRVJLU19fKQorIyAgICBwcmFnbWEgc3VwcHJlc3NfaW5pdF9jb2RlIG9uCisjICBlbHNlCisjICAgIHByYWdtYSBpbml0X3NlZygiU1RMUE9SVF9OT19JTklUIikKKyMgIGVuZGlmCisKK19TVExQX0RFQ0xTUEVDIGlzdHJlYW0gY2luKDApOworX1NUTFBfREVDTFNQRUMgb3N0cmVhbSBjb3V0KDApOworX1NUTFBfREVDTFNQRUMgb3N0cmVhbSBjZXJyKDApOworX1NUTFBfREVDTFNQRUMgb3N0cmVhbSBjbG9nKDApOworCisjICBpZm5kZWYgX1NUTFBfTk9fV0NIQVJfVAorX1NUTFBfREVDTFNQRUMgd2lzdHJlYW0gd2NpbigwKTsKK19TVExQX0RFQ0xTUEVDIHdvc3RyZWFtIHdjb3V0KDApOworX1NUTFBfREVDTFNQRUMgd29zdHJlYW0gd2NlcnIoMCk7CitfU1RMUF9ERUNMU1BFQyB3b3N0cmVhbSB3Y2xvZygwKTsKKyMgIGVuZGlmCisKKyMgIGlmIGRlZmluZWQgKF9fTVdFUktTX18pCisjICAgIHByYWdtYSBzdXBwcmVzc19pbml0X2NvZGUgb2ZmCisjICBlbmRpZgorCisjZWxzZQorCisvLyBEZWZpbml0aW9ucyBvZiB0aGUgZWlnaHQgZ2xvYmFsIEkvTyBvYmplY3RzIHRoYXQgYXJlIGRlY2xhcmVkIGluCisvLyA8aW9zdHJlYW0+LiAgRGlzZ3VzdGluZyBoYWNrOiB3ZSBkZWxpYmVyYXRlbHkgZGVmaW5lIHRoZW0gd2l0aCB0aGUKKy8vIHdyb25nIHR5cGVzIHNvIHRoYXQgdGhlIGNvbnN0cnVjdG9ycyBkb24ndCBnZXQgcnVuIGF1dG9tYXRpY2FsbHkuCisvLyBXZSBuZWVkIHNwZWNpYWwgdHJpY2tzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZXNlIG9iamVjdHMgYXJlIHN0cnVjdC0KKy8vIGFsaWduZWQgcmF0aGVyIHRoYW4gYnl0ZS1hbGlnbmVkLgorCisvLyBUaGlzIGlzIG5vdCBwb3J0YWJsZS4gIERlY2xhcmluZyBhIHZhcmlhYmxlIHdpdGggZGlmZmVyZW50IHR5cGVzIGluCisvLyB0d28gdHJhbnNsYXRpb25zIHVuaXRzIGlzICJ1bmRlZmluZWQiLCBhY2NvcmRpbmcgdG8gdGhlIEMrKyBzdGFuZGFyZC4KKy8vIE1vc3QgY29tcGlsZXJzLCBob3dldmVyLCBzaWxlbnRseSBhY2NlcHQgdGhpcyBpbnN0ZWFkIG9mIGRpYWdub3NpbmcKKy8vIGl0IGFzIGFuIGVycm9yLgorCisjICBpZm5kZWYgX19ETUNfXworX1NUTFBfREVDTFNQRUMgX1N0bF9hbGlnbmVkX2J1ZmZlcjxpc3RyZWFtPiBjaW47CitfU1RMUF9ERUNMU1BFQyBfU3RsX2FsaWduZWRfYnVmZmVyPG9zdHJlYW0+IGNvdXQ7CitfU1RMUF9ERUNMU1BFQyBfU3RsX2FsaWduZWRfYnVmZmVyPG9zdHJlYW0+IGNlcnI7CitfU1RMUF9ERUNMU1BFQyBfU3RsX2FsaWduZWRfYnVmZmVyPG9zdHJlYW0+IGNsb2c7CisjICBlbHNlCitfU3RsX2FsaWduZWRfYnVmZmVyPGlzdHJlYW0+IGNpbjsKK19TdGxfYWxpZ25lZF9idWZmZXI8b3N0cmVhbT4gY291dDsKK19TdGxfYWxpZ25lZF9idWZmZXI8b3N0cmVhbT4gY2VycjsKK19TdGxfYWxpZ25lZF9idWZmZXI8b3N0cmVhbT4gY2xvZzsKKworIyAgICBwcmFnbWEgYWxpYXMoIj9jaW5Ac3RkQEAzVj8kYmFzaWNfaXN0cmVhbUBzdGRARFY/JGNoYXJfdHJhaXRzQHN0ZEBEQDFAQDFAQSIsICI/Y2luQHN0ZEBAM1Q/JF9TdGxfYWxpZ25lZF9idWZmZXJAc3RkQFY/JGJhc2ljX2lzdHJlYW1Ac3RkQERWPyRjaGFyX3RyYWl0c0BzdGRAREAxQEAxQEAxQEEiKQorIyAgICBwcmFnbWEgYWxpYXMoIj9jb3V0QHN0ZEBAM1Y/JGJhc2ljX29zdHJlYW1Ac3RkQERWPyRjaGFyX3RyYWl0c0BzdGRAREAxQEAxQEEiLCAiP2NvdXRAc3RkQEAzVD8kX1N0bF9hbGlnbmVkX2J1ZmZlckBzdGRAVj8kYmFzaWNfb3N0cmVhbUBzdGRARFY/JGNoYXJfdHJhaXRzQHN0ZEBEQDFAQDFAQDFAQSIpCisjICAgIHByYWdtYSBhbGlhcygiP2NlcnJAc3RkQEAzVj8kYmFzaWNfb3N0cmVhbUBzdGRARFY/JGNoYXJfdHJhaXRzQHN0ZEBEQDFAQDFAQSIsICI/Y2VyckBzdGRAQDNUPyRfU3RsX2FsaWduZWRfYnVmZmVyQHN0ZEBWPyRiYXNpY19vc3RyZWFtQHN0ZEBEVj8kY2hhcl90cmFpdHNAc3RkQERAMUBAMUBAMUBBIikKKyMgICAgcHJhZ21hIGFsaWFzKCI/Y2xvZ0BzdGRAQDNWPyRiYXNpY19vc3RyZWFtQHN0ZEBEVj8kY2hhcl90cmFpdHNAc3RkQERAMUBAMUBBIiwgIj9jbG9nQHN0ZEBAM1Q/JF9TdGxfYWxpZ25lZF9idWZmZXJAc3RkQFY/JGJhc2ljX29zdHJlYW1Ac3RkQERWPyRjaGFyX3RyYWl0c0BzdGRAREAxQEAxQEAxQEEiKQorIyAgZW5kaWYKKworIyAgaWZuZGVmIF9TVExQX05PX1dDSEFSX1QKKworIyAgICBpZm5kZWYgX19ETUNfXworX1NUTFBfREVDTFNQRUMgX1N0bF9hbGlnbmVkX2J1ZmZlcjx3aXN0cmVhbT4gd2NpbjsKK19TVExQX0RFQ0xTUEVDIF9TdGxfYWxpZ25lZF9idWZmZXI8d29zdHJlYW0+IHdjb3V0OworX1NUTFBfREVDTFNQRUMgX1N0bF9hbGlnbmVkX2J1ZmZlcjx3b3N0cmVhbT4gd2NlcnI7CitfU1RMUF9ERUNMU1BFQyBfU3RsX2FsaWduZWRfYnVmZmVyPHdvc3RyZWFtPiB3Y2xvZzsKKyMgICAgZWxzZQorX1N0bF9hbGlnbmVkX2J1ZmZlcjx3aXN0cmVhbT4gd2NpbjsKK19TdGxfYWxpZ25lZF9idWZmZXI8d29zdHJlYW0+IHdjb3V0OworX1N0bF9hbGlnbmVkX2J1ZmZlcjx3b3N0cmVhbT4gd2NlcnI7CitfU3RsX2FsaWduZWRfYnVmZmVyPHdvc3RyZWFtPiB3Y2xvZzsKKworIyAgICAgIHByYWdtYSBhbGlhcygiP3djaW5Ac3RkQEAzVj8kYmFzaWNfaXN0cmVhbUBzdGRAX1lWPyRjaGFyX3RyYWl0c0BzdGRAX1lAMUBAMUBBIiwgIj93Y2luQHN0ZEBAM1Q/JF9TdGxfYWxpZ25lZF9idWZmZXJAc3RkQFY/JGJhc2ljX2lzdHJlYW1Ac3RkQF9ZVj8kY2hhcl90cmFpdHNAc3RkQF9ZQDFAQDFAQDFAQSIpCisjICAgICAgcHJhZ21hIGFsaWFzKCI/d2NvdXRAc3RkQEAzVj8kYmFzaWNfb3N0cmVhbUBzdGRAX1lWPyRjaGFyX3RyYWl0c0BzdGRAX1lAMUBAMUBBIiwgIj93Y291dEBzdGRAQDNUPyRfU3RsX2FsaWduZWRfYnVmZmVyQHN0ZEBWPyRiYXNpY19vc3RyZWFtQHN0ZEBfWVY/JGNoYXJfdHJhaXRzQHN0ZEBfWUAxQEAxQEAxQEEiKQorIyAgICAgIHByYWdtYSBhbGlhcygiP3djZXJyQHN0ZEBAM1Y/JGJhc2ljX29zdHJlYW1Ac3RkQF9ZVj8kY2hhcl90cmFpdHNAc3RkQF9ZQDFAQDFAQSIsICI/d2NlcnJAc3RkQEAzVD8kX1N0bF9hbGlnbmVkX2J1ZmZlckBzdGRAVj8kYmFzaWNfb3N0cmVhbUBzdGRAX1lWPyRjaGFyX3RyYWl0c0BzdGRAX1lAMUBAMUBAMUBBIikKKyMgICAgICBwcmFnbWEgYWxpYXMoIj93Y2xvZ0BzdGRAQDNWPyRiYXNpY19vc3RyZWFtQHN0ZEBfWVY/JGNoYXJfdHJhaXRzQHN0ZEBfWUAxQEAxQEEiLCAiP3djbG9nQHN0ZEBAM1Q/JF9TdGxfYWxpZ25lZF9idWZmZXJAc3RkQFY/JGJhc2ljX29zdHJlYW1Ac3RkQF9ZVj8kY2hhcl90cmFpdHNAc3RkQF9ZQDFAQDFAQDFAQSIpCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmIC8qIFNUTF9NU1ZDIHx8IF9fTVdFUktTX18gKi8KKworLy8gTWVtYmVyIGZ1bmN0aW9ucyBmcm9tIGNsYXNzIGlvc19iYXNlIGFuZCBpb3NfYmFzZTo6SW5pdAorCitsb25nIGlvc19iYXNlOjpJbml0OjpfU19jb3VudCA9IDA7CisvLyBieSBkZWZhdWx0LCB0aG9zZSBhcmUgc3luY2VkCitib29sIGlvc19iYXNlOjpfU19pc19zeW5jZWQgPSB0cnVlOworCitpb3NfYmFzZTo6SW5pdDo6SW5pdCgpIHsKKyAgaWYgKF9TX2NvdW50KysgPT0gMCkgeworICAgIF9Mb2NhbGVfaW5pdCgpOworICAgIGlvc19iYXNlOjpfU19pbml0aWFsaXplKCk7CisgICAgX0ZpbGVidWZfYmFzZTo6X1NfaW5pdGlhbGl6ZSgpOworICB9Cit9CisKK2lvc19iYXNlOjpJbml0Ojp+SW5pdCgpIHsKKyAgaWYgKC0tX1NfY291bnQgPT0gMCkgeworICAgIGlvc19iYXNlOjpfU191bmluaXRpYWxpemUoKTsKKyAgICBfTG9jYWxlX2ZpbmFsKCk7CisgIH0KK30KKworc3RhdGljIGludCBfU3RsX2V4dHJhY3Rfb3Blbl9wYXJhbShGSUxFKiBmKQoreyByZXR1cm4gX0ZJTEVfZmQoZik7IH0KKworI2lmZGVmIF9TVExQX1JFRElSRUNUX1NURFNUUkVBTVMKK3N0YXRpYyBjb25zdCBjaGFyKiBfU3RsX2V4dHJhY3Rfb3Blbl9wYXJhbShjb25zdCBjaGFyKiBuYW1lKQoreyByZXR1cm4gbmFtZTsgfQorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdGF0aWMgZmlsZWJ1ZioKK19TdGxfY3JlYXRlX2ZpbGVidWYoX1RwIHgsIGlvc19iYXNlOjpvcGVubW9kZSBtb2RlICkgeworICBhdXRvX3B0cjxmaWxlYnVmPiByZXN1bHQobmV3IGJhc2ljX2ZpbGVidWY8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPigpKTsKKyAgcmVzdWx0LT5vcGVuKF9TdGxfZXh0cmFjdF9vcGVuX3BhcmFtKHgpLCBtb2RlKTsKKworICBpZiAocmVzdWx0LT5pc19vcGVuKCkpCisgICAgcmV0dXJuIHJlc3VsdC5yZWxlYXNlKCk7CisKKyAgcmV0dXJuIDA7Cit9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkKK3N0YXRpYyB3ZmlsZWJ1ZioKK19TdGxfY3JlYXRlX3dmaWxlYnVmKEZJTEUqIGYsIGlvc19iYXNlOjpvcGVubW9kZSBtb2RlKSB7CisgIGF1dG9fcHRyPHdmaWxlYnVmPiByZXN1bHQobmV3IGJhc2ljX2ZpbGVidWY8d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPigpKTsKKyAgcmVzdWx0LT5fTV9vcGVuKF9GSUxFX2ZkKGYpLCBtb2RlKTsKKworICBpZiAocmVzdWx0LT5pc19vcGVuKCkpCisgICAgcmV0dXJuIHJlc3VsdC5yZWxlYXNlKCk7CisKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKwordm9pZCAgX1NUTFBfQ0FMTCBpb3NfYmFzZTo6X1NfaW5pdGlhbGl6ZSgpIHsKKyNpZiAhZGVmaW5lZCAoX1NUTFBfSEFTX05PX05BTUVTUEFDRVMpICYmICFkZWZpbmVkIChfU1RMUF9ET05UX1VTRV9QUklWX05BTUVTUEFDRSkKKyAgdXNpbmcgX1NUTFBfUFJJViBzdGRpb19pc3RyZWFtYnVmOworICB1c2luZyBfU1RMUF9QUklWIHN0ZGlvX29zdHJlYW1idWY7CisjZW5kaWYKKworICBhdXRvX3B0cjxzdHJlYW1idWY+IGNpbl9idWY7CisgIGF1dG9fcHRyPHN0cmVhbWJ1Zj4gY291dF9idWY7CisgIGF1dG9fcHRyPHN0cmVhbWJ1Zj4gY2Vycl9idWY7CisgIGF1dG9fcHRyPHN0cmVhbWJ1Zj4gY2xvZ19idWY7CisKKyAgaWYgKF9TX2lzX3N5bmNlZCkKKyAgICBjaW5fYnVmLnJlc2V0KG5ldyBzdGRpb19pc3RyZWFtYnVmKHN0ZGluKSk7CisgIGVsc2UKKyAgICBjaW5fYnVmLnJlc2V0KF9TdGxfY3JlYXRlX2ZpbGVidWYoc3RkaW4sIGlvc19iYXNlOjppbikpOworCisgIGlmIChfU19pc19zeW5jZWQpIHsKKyNpZmRlZiBfU1RMUF9SRURJUkVDVF9TVERTVFJFQU1TCisgICAgY291dF9idWYucmVzZXQoX1N0bF9jcmVhdGVfZmlsZWJ1ZigiL3N0ZG91dC50eHQiLCBpb3M6Om91dCkpOworICAgIGNlcnJfYnVmLnJlc2V0KF9TdGxfY3JlYXRlX2ZpbGVidWYoIi9zdGRlcnIudHh0IiwgaW9zOjpvdXQpKTsKKyAgICBjbG9nX2J1Zi5yZXNldChfU3RsX2NyZWF0ZV9maWxlYnVmKCIvc3RkbG9nLnR4dCIsIGlvczo6b3V0KSk7CisjZWxzZQorICAgIGNvdXRfYnVmLnJlc2V0KG5ldyBzdGRpb19vc3RyZWFtYnVmKHN0ZG91dCkpOworICAgIGNlcnJfYnVmLnJlc2V0KG5ldyBzdGRpb19vc3RyZWFtYnVmKHN0ZGVycikpOworICAgIGNsb2dfYnVmLnJlc2V0KG5ldyBzdGRpb19vc3RyZWFtYnVmKHN0ZGVycikpOworI2VuZGlmCisgIH0KKyAgZWxzZSB7CisgICAgY291dF9idWYucmVzZXQoX1N0bF9jcmVhdGVfZmlsZWJ1ZihzdGRvdXQsIGlvc19iYXNlOjpvdXQpKTsKKyAgICBjZXJyX2J1Zi5yZXNldChfU3RsX2NyZWF0ZV9maWxlYnVmKHN0ZGVyciwgaW9zX2Jhc2U6Om91dCkpOworICAgIGNsb2dfYnVmLnJlc2V0KF9TdGxfY3JlYXRlX2ZpbGVidWYoc3RkZXJyLCBpb3NfYmFzZTo6b3V0KSk7CisgIH0KKworICBpc3RyZWFtKiBwdHJfY2luICA9IG5ldygmY2luKSAgaXN0cmVhbShjaW5fYnVmLmdldCgpKTsgY2luX2J1Zi5yZWxlYXNlKCk7CisgIG9zdHJlYW0qIHB0cl9jb3V0ID0gbmV3KCZjb3V0KSBvc3RyZWFtKGNvdXRfYnVmLmdldCgpKTsgY291dF9idWYucmVsZWFzZSgpOworICBvc3RyZWFtKiBwdHJfY2VyciA9IG5ldygmY2Vycikgb3N0cmVhbShjZXJyX2J1Zi5nZXQoKSk7IGNlcnJfYnVmLnJlbGVhc2UoKTsKKyAgLypvc3RyZWFtKiBwdHJfY2xvZyA9ICovIG5ldygmY2xvZykgb3N0cmVhbShjbG9nX2J1Zi5nZXQoKSk7IGNsb2dfYnVmLnJlbGVhc2UoKTsKKyAgcHRyX2Npbi0+dGllKHB0cl9jb3V0KTsKKyAgcHRyX2NlcnItPnNldGYoaW9zX2Jhc2U6OnVuaXRidWYpOworCisjaWZuZGVmIF9TVExQX05PX1dDSEFSX1QKKyAgYXV0b19wdHI8d2ZpbGVidWY+IHdpbihfU3RsX2NyZWF0ZV93ZmlsZWJ1ZihzdGRpbiwgaW9zX2Jhc2U6OmluKSk7CisgIGF1dG9fcHRyPHdmaWxlYnVmPiB3b3V0KF9TdGxfY3JlYXRlX3dmaWxlYnVmKHN0ZG91dCwgaW9zX2Jhc2U6Om91dCkpOworICBhdXRvX3B0cjx3ZmlsZWJ1Zj4gd2VycihfU3RsX2NyZWF0ZV93ZmlsZWJ1ZihzdGRlcnIsIGlvc19iYXNlOjpvdXQpKTsKKyAgYXV0b19wdHI8d2ZpbGVidWY+IHdsb2coX1N0bF9jcmVhdGVfd2ZpbGVidWYoc3RkZXJyLCBpb3NfYmFzZTo6b3V0KSk7CisKKyAgLy8gUnVuIGNvbnN0cnVjdG9ycyBmb3IgdGhlIGZvdXIgd2lkZSBzdHJlYW0gb2JqZWN0cy4KKyAgd2lzdHJlYW0qIHB0cl93Y2luICA9IG5ldygmd2NpbikgIHdpc3RyZWFtKHdpbi5nZXQoKSk7IHdpbi5yZWxlYXNlKCk7CisgIHdvc3RyZWFtKiBwdHJfd2NvdXQgPSBuZXcoJndjb3V0KSB3b3N0cmVhbSh3b3V0LmdldCgpKTsgd291dC5yZWxlYXNlKCk7CisgIHdvc3RyZWFtKiBwdHJfd2NlcnIgPSBuZXcoJndjZXJyKSB3b3N0cmVhbSh3ZXJyLmdldCgpKTsgd2Vyci5yZWxlYXNlKCk7CisgIC8qd29zdHJlYW0qIHB0cl93Y2xvZyA9ICovIG5ldygmd2Nsb2cpIHdvc3RyZWFtKHdsb2cuZ2V0KCkpOyB3bG9nLnJlbGVhc2UoKTsKKworICBwdHJfd2Npbi0+dGllKHB0cl93Y291dCk7CisgIHB0cl93Y2Vyci0+c2V0Zihpb3NfYmFzZTo6dW5pdGJ1Zik7CisjZW5kaWYKK30KKwordm9pZCBfU1RMUF9DQUxMIGlvc19iYXNlOjpfU191bmluaXRpYWxpemUoKSB7CisgIC8vIE5vdGUgdGhhdCBkZXN0cm95aW5nIG91dHB1dCBzdHJlYW1idWZzIGZsdXNoZXMgdGhlIGJ1ZmZlcnMuCisgIGlzdHJlYW0qIHB0cl9jaW4gID0gJmNpbjsKKyAgb3N0cmVhbSogcHRyX2NvdXQgPSAmY291dDsKKyAgb3N0cmVhbSogcHRyX2NlcnIgPSAmY2VycjsKKyAgb3N0cmVhbSogcHRyX2Nsb2cgPSAmY2xvZzsKKworICAvLyBXZSBkb24ndCB3YW50IGFueSBleGNlcHRpb25zIGJlaW5nIHRocm93biBoZXJlCisgIHB0cl9jaW4tPmV4Y2VwdGlvbnMoMCk7CisgIHB0cl9jb3V0LT5leGNlcHRpb25zKDApOworICBwdHJfY2Vyci0+ZXhjZXB0aW9ucygwKTsKKyAgcHRyX2Nsb2ctPmV4Y2VwdGlvbnMoMCk7CisKKyAgZGVsZXRlIHB0cl9jaW4tPnJkYnVmKDApOworICBkZWxldGUgcHRyX2NvdXQtPnJkYnVmKDApOworICBkZWxldGUgcHRyX2NlcnItPnJkYnVmKDApOworICBkZWxldGUgcHRyX2Nsb2ctPnJkYnVmKDApOworCisgIF9EZXN0cm95KHB0cl9jaW4pOworICBfRGVzdHJveShwdHJfY291dCk7CisgIF9EZXN0cm95KHB0cl9jZXJyKTsKKyAgX0Rlc3Ryb3kocHRyX2Nsb2cpOworCisjaWZuZGVmIF9TVExQX05PX1dDSEFSX1QKKyAgd2lzdHJlYW0qIHB0cl93Y2luICA9ICZ3Y2luOworICB3b3N0cmVhbSogcHRyX3djb3V0ID0gJndjb3V0OworICB3b3N0cmVhbSogcHRyX3djZXJyID0gJndjZXJyOworICB3b3N0cmVhbSogcHRyX3djbG9nID0gJndjbG9nOworCisgIC8vIFdlIGRvbid0IHdhbnQgYW55IGV4Y2VwdGlvbnMgYmVpbmcgdGhyb3duIGhlcmUKKyAgcHRyX3djaW4tPmV4Y2VwdGlvbnMoMCk7CisgIHB0cl93Y291dC0+ZXhjZXB0aW9ucygwKTsKKyAgcHRyX3djZXJyLT5leGNlcHRpb25zKDApOworICBwdHJfd2Nsb2ctPmV4Y2VwdGlvbnMoMCk7CisKKyAgZGVsZXRlIHB0cl93Y2luLT5yZGJ1ZigwKTsKKyAgZGVsZXRlIHB0cl93Y291dC0+cmRidWYoMCk7CisgIGRlbGV0ZSBwdHJfd2NlcnItPnJkYnVmKDApOworICBkZWxldGUgcHRyX3djbG9nLT5yZGJ1ZigwKTsKKworICBfRGVzdHJveShwdHJfd2Npbik7CisgIF9EZXN0cm95KHB0cl93Y291dCk7CisgIF9EZXN0cm95KHB0cl93Y2Vycik7CisgIF9EZXN0cm95KHB0cl93Y2xvZyk7CisjZW5kaWYKK30KKworCitib29sIF9TVExQX0NBTEwgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhib29sIHN5bmMpIHsKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9IQVNfTk9fTkFNRVNQQUNFUykgJiYgIWRlZmluZWQgKF9TVExQX0RPTlRfVVNFX1BSSVZfTkFNRVNQQUNFKQorICB1c2luZyBfU1RMUF9QUklWIHN0ZGlvX2lzdHJlYW1idWY7CisgIHVzaW5nIF9TVExQX1BSSVYgc3RkaW9fb3N0cmVhbWJ1ZjsKKyMgIGVuZGlmCisKKyAgaWYgKHN5bmMgPT0gX1NfaXNfc3luY2VkKSByZXR1cm4gc3luYzsKKworICAvLyBpZiBieSBhbnkgY2hhbmNlIHdlIGdvdCB0aGVyZSBiZWZvcmUgc3RkIHN0cmVhbXMgaW5pdGlhbGl6YXRpb24sCisgIC8vIGp1c3Qgc2V0IHRoZSBzeW5jIGZsYWcgYW5kIGV4aXQKKyAgaWYgKEluaXQ6Ol9TX2NvdW50ID09IDApIHsKKyAgICBfU19pc19zeW5jZWQgPSBzeW5jOworICAgIHJldHVybiBzeW5jOworICB9CisKKyAgYXV0b19wdHI8c3RyZWFtYnVmPiBjaW5fYnVmOworICBhdXRvX3B0cjxzdHJlYW1idWY+IGNvdXRfYnVmOworICBhdXRvX3B0cjxzdHJlYW1idWY+IGNlcnJfYnVmOworICBhdXRvX3B0cjxzdHJlYW1idWY+IGNsb2dfYnVmOworCisgIGlmIChzeW5jKQorICAgIGNpbl9idWYucmVzZXQobmV3IHN0ZGlvX2lzdHJlYW1idWYoc3RkaW4pKTsKKyAgZWxzZQorICAgIGNpbl9idWYucmVzZXQoX1N0bF9jcmVhdGVfZmlsZWJ1ZihzdGRpbiwgaW9zX2Jhc2U6OmluKSk7CisKKyAgaWYgKHN5bmMpIHsKKyNpZmRlZiBfU1RMUF9SRURJUkVDVF9TVERTVFJFQU1TCisgICAgY291dF9idWYucmVzZXQoX1N0bF9jcmVhdGVfZmlsZWJ1ZigiL3N0ZG91dC50eHQiLCBpb3M6Om91dCkpOworICAgIGNlcnJfYnVmLnJlc2V0KF9TdGxfY3JlYXRlX2ZpbGVidWYoIi9zdGRlcnIudHh0IiwgaW9zOjpvdXQpKTsKKyAgICBjbG9nX2J1Zi5yZXNldChfU3RsX2NyZWF0ZV9maWxlYnVmKCIvc3RkbG9nLnR4dCIsIGlvczo6b3V0KSk7CisjZWxzZQorICAgIGNvdXRfYnVmLnJlc2V0KG5ldyBzdGRpb19vc3RyZWFtYnVmKHN0ZG91dCkpOworICAgIGNlcnJfYnVmLnJlc2V0KG5ldyBzdGRpb19vc3RyZWFtYnVmKHN0ZGVycikpOworICAgIGNsb2dfYnVmLnJlc2V0KG5ldyBzdGRpb19vc3RyZWFtYnVmKHN0ZGVycikpOworI2VuZGlmCisgIH0KKyAgZWxzZSB7CisgICAgY291dF9idWYucmVzZXQoX1N0bF9jcmVhdGVfZmlsZWJ1ZihzdGRvdXQsIGlvc19iYXNlOjpvdXQpKTsKKyAgICBjZXJyX2J1Zi5yZXNldChfU3RsX2NyZWF0ZV9maWxlYnVmKHN0ZGVyciwgaW9zX2Jhc2U6Om91dCkpOworICAgIGNsb2dfYnVmLnJlc2V0KF9TdGxfY3JlYXRlX2ZpbGVidWYoc3RkZXJyLCBpb3NfYmFzZTo6b3V0KSk7CisgIH0KKworICBpZiAoY2luX2J1Zi5nZXQoKSAhPSAwICYmIGNvdXRfYnVmLmdldCgpICE9IDAgJiYgY2Vycl9idWYuZ2V0KCkgIT0gMCAmJiBjbG9nX2J1Zi5nZXQoKSAhPSAwKSB7CisgICAgLy8gV2hlbiBzdHJlYW1idWYgcGFzc2VkIHRvIHJkYnVmIGlzIG5vdCBudWxsLCByZGJ1ZiBpcyBleGNlcHRpb24gc2FmZToKKyAgICBkZWxldGUgKCZjaW4pLT5yZGJ1ZihjaW5fYnVmLnJlbGVhc2UoKSk7CisgICAgZGVsZXRlICgmY291dCktPnJkYnVmKGNvdXRfYnVmLnJlbGVhc2UoKSk7CisgICAgZGVsZXRlICgmY2VyciktPnJkYnVmKGNlcnJfYnVmLnJlbGVhc2UoKSk7CisgICAgZGVsZXRlICgmY2xvZyktPnJkYnVmKGNsb2dfYnVmLnJlbGVhc2UoKSk7CisgICAgX1NfaXNfc3luY2VkID0gc3luYzsKKyAgfQorCisgIHJldHVybiBfU19pc19zeW5jZWQ7Cit9CisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3NyYy9pc3RyZWFtLmNwcCBiL3NyYy9pc3RyZWFtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTUzNjRjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2lzdHJlYW0uY3BwCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisjIGluY2x1ZGUgInN0bHBvcnRfcHJlZml4LmgiCisKKyNpbmNsdWRlIDxpc3RyZWFtPgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworI2lmICFkZWZpbmVkKF9TVExQX05PX0ZPUkNFX0lOU1RBTlRJQVRFKQorCisvLyBpbnN0YW50aWF0aW9ucworIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCkKK3RlbXBsYXRlIGNsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIF9Jc2VudHJ5PGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID47CisjICBlbmRpZgorCit0ZW1wbGF0ZSBjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBiYXNpY19pb3N0cmVhbTxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+OwordGVtcGxhdGUgY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgYmFzaWNfaXN0cmVhbTxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+OworCisjICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkKKyMgICAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCkKK3RlbXBsYXRlIGNsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIF9Jc2VudHJ5PHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID47CisjICAgIGVuZGlmCit0ZW1wbGF0ZSBjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBiYXNpY19pc3RyZWFtPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID47Cit0ZW1wbGF0ZSBjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBiYXNpY19pb3N0cmVhbTx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+OworIyAgZW5kaWYgLyogIV9TVExQX05PX1dDSEFSX1QgKi8KKworI2VuZGlmIC8qIF9TVExQX05PX0ZPUkNFX0lOU1RBTlRJQVRFICovCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3NyYy9sb2NhbGUuY3BwIGIvc3JjL2xvY2FsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRmOTc2YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9sb2NhbGUuY3BwCkBAIC0wLDAgKzEsNDQ1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaW5jbHVkZSAic3RscG9ydF9wcmVmaXguaCIKKworI2luY2x1ZGUgPGxvY2FsZT4KKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisKKyNpbmNsdWRlICJjX2xvY2FsZS5oIgorI2luY2x1ZGUgImxvY2FsZV9pbXBsLmgiCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCitzdGF0aWMgY29uc3Qgc3RyaW5nIF9OYW1lbGVzcygiKiIpOworCitzdGF0aWMgaW5saW5lIGJvb2wgaXNfQ19sb2NhbGVfbmFtZSAoY29uc3QgY2hhciogbmFtZSkKK3sgcmV0dXJuICgobmFtZVswXSA9PSAnQycpICYmIChuYW1lWzFdID09IDApKTsgfQorCitsb2NhbGUqIF9TdGxfZ2V0X2NsYXNzaWNfbG9jYWxlKCk7Citsb2NhbGUqIF9TdGxfZ2V0X2dsb2JhbF9sb2NhbGUoKTsKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9NU1ZDNl9NRU1fVF9CVUdfV09SS0FST1VORCkgfHwgXAorICAgIGRlZmluZWQgKF9TVExQX1NJR05BTF9SVU5USU1FX0NPTVBBVElCSUxJVFkpIHx8IGRlZmluZWQgKF9TVExQX0NIRUNLX1JVTlRJTUVfQ09NUEFUSUJJTElUWSkKKyMgIGRlZmluZSBsb2NhbGUgX1NUTFBfTk9fTUVNX1RfTkFNRShsb2MpCisjZW5kaWYKKworbG9jYWxlOjpmYWNldDo6fmZhY2V0KCkge30KKworI2lmICFkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKSB8fCBkZWZpbmVkIChfU1RMUF9JTkxJTkVfTUVNQkVSX1RFTVBMQVRFUykKKy8vIG1lbWJlcnMgdGhhdCBmYWlsIHRvIGJlIHRlbXBsYXRlcworYm9vbCBsb2NhbGU6Om9wZXJhdG9yKCkoY29uc3Qgc3RyaW5nJiBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIF9feSkgY29uc3QKK3sgcmV0dXJuIF9fbG9jYWxlX2RvX29wZXJhdG9yX2NhbGwoKnRoaXMsIF9feCwgX195KTsgfQorCisjICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkKK2Jvb2wgbG9jYWxlOjpvcGVyYXRvcigpKGNvbnN0IHdzdHJpbmcmIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdzdHJpbmcmIF9feSkgY29uc3QKK3sgcmV0dXJuIF9fbG9jYWxlX2RvX29wZXJhdG9yX2NhbGwoKnRoaXMsIF9feCwgX195KTsgfQorIyAgZW5kaWYKKyNlbmRpZgorCit2b2lkIF9TVExQX0NBTEwgbG9jYWxlOjpfTV90aHJvd19vbl9udWxsX25hbWUoKQoreyBfU1RMUF9USFJPVyhydW50aW1lX2Vycm9yKCJJbnZhbGlkIG51bGwgbG9jYWxlIG5hbWUiKSk7IH0KKwordm9pZCBfU1RMUF9DQUxMIGxvY2FsZTo6X01fdGhyb3dfb25fY29tYmluZV9lcnJvcihjb25zdCBzdHJpbmcmIG5hbWUpIHsKKyAgc3RyaW5nIHdoYXQgPSAiVW5hYmxlIHRvIGZpbmQgZmFjZXQiOworICB3aGF0ICs9ICIgaW4gIjsKKyAgd2hhdCArPSBuYW1lLmVtcHR5KCkgPyAic3lzdGVtIiA6IG5hbWUuY19zdHIoKTsKKyAgd2hhdCArPSAiIGxvY2FsZSI7CisgIF9TVExQX1RIUk9XKHJ1bnRpbWVfZXJyb3Iod2hhdC5jX3N0cigpKSk7Cit9CisKK3ZvaWQgX1NUTFBfQ0FMTCBsb2NhbGU6Ol9NX3Rocm93X29uX2NyZWF0aW9uX2ZhaWx1cmUoaW50IF9fZXJyX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIqIGZhY2V0KSB7CisgIHN0cmluZyB3aGF0OworICBzd2l0Y2ggKF9fZXJyX2NvZGUpIHsKKyAgICBjYXNlIF9TVExQX0xPQ19VTlNVUFBPUlRFRF9GQUNFVF9DQVRFR09SWToKKyAgICAgIHdoYXQgPSAiTm8gcGxhdGZvcm0gbG9jYWxpemF0aW9uIHN1cHBvcnQgZm9yICI7CisgICAgICB3aGF0ICs9IGZhY2V0OworICAgICAgd2hhdCArPSAiIGZhY2V0IGNhdGVnb3J5LCB1bmFibGUgdG8gY3JlYXRlIGZhY2V0IGZvciAiOworICAgICAgd2hhdCArPSBuYW1lWzBdID09IDAgPyAic3lzdGVtIiA6IG5hbWU7CisgICAgICB3aGF0ICs9ICIgbG9jYWxlIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgX1NUTFBfTE9DX05PX1BMQVRGT1JNX1NVUFBPUlQ6CisgICAgICB3aGF0ID0gIk5vIHBsYXRmb3JtIGxvY2FsaXphdGlvbiBzdXBwb3J0LCB1bmFibGUgdG8gY3JlYXRlICI7CisgICAgICB3aGF0ICs9IG5hbWVbMF0gPT0gMCA/ICJzeXN0ZW0iIDogbmFtZTsKKyAgICAgIHdoYXQgKz0gIiBsb2NhbGUiOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICBjYXNlIF9TVExQX0xPQ19VTktOT1dOX05BTUU6CisgICAgICB3aGF0ID0gIlVuYWJsZSB0byBjcmVhdGUgZmFjZXQgIjsKKyAgICAgIHdoYXQgKz0gZmFjZXQ7CisgICAgICB3aGF0ICs9ICIgZnJvbSBuYW1lICciOworICAgICAgd2hhdCArPSBuYW1lOworICAgICAgd2hhdCArPSAiJyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIF9TVExQX0xPQ19OT19NRU1PUlk6CisgICAgICBfU1RMUF9USFJPV19CQURfQUxMT0M7CisgICAgICBicmVhazsKKyAgfQorCisgIF9TVExQX1RIUk9XKHJ1bnRpbWVfZXJyb3Iod2hhdC5jX3N0cigpKSk7Cit9CisKKy8vIFRha2VzIGEgcmVmZXJlbmNlIHRvIGEgbG9jYWxlOjppZCwgYXNzaWduIGEgbnVtZXJpYyBpbmRleCBpZiBub3QgYWxyZWFkeQorLy8gYWZmZWN0ZWQgYW5kIHJldHVybnMgaXQuIFRoZSByZXR1cm5lZCBpbmRleCBpcyBhbHdheXMgcG9zaXRpdmUuCitzdGF0aWMgY29uc3QgbG9jYWxlOjppZCYgX1N0bF9sb2NfZ2V0X2luZGV4KGxvY2FsZTo6aWQmIGlkKSB7CisgIGlmIChpZC5fTV9pbmRleCA9PSAwKSB7CisjaWYgZGVmaW5lZCAoX1NUTFBfQVRPTUlDX0lOQ1JFTUVOVCkgJiYgIWRlZmluZWQgKF9TVExQX1dJTjk1X0xJS0UpCisgICAgc3RhdGljIF9TVExQX1ZPTEFUSUxFIF9fc3RsX2F0b21pY190IF9TX2luZGV4ID0gX19TVEFUSUNfQ0FTVChfX3N0bF9hdG9taWNfdCwgbG9jYWxlOjppZDo6X1NfbWF4KTsKKyAgICBpZC5fTV9pbmRleCA9IF9TVExQX0FUT01JQ19JTkNSRU1FTlQoJl9TX2luZGV4KTsKKyNlbHNlCisgICAgc3RhdGljIF9TVExQX1NUQVRJQ19NVVRFWCBfSW5kZXhfbG9jayBfU1RMUF9NVVRFWF9JTklUSUFMSVpFUjsKKyAgICBfU1RMUF9hdXRvX2xvY2sgc2VudHJ5KF9JbmRleF9sb2NrKTsKKyAgICBzaXplX3QgbmV3X2luZGV4ID0gbG9jYWxlOjppZDo6X1NfbWF4Kys7CisgICAgaWQuX01faW5kZXggPSBuZXdfaW5kZXg7CisjZW5kaWYKKyAgfQorICByZXR1cm4gaWQ7Cit9CisKKy8vIERlZmF1bHQgY29uc3RydWN0b3I6IGNyZWF0ZSBhIGNvcHkgb2YgdGhlIGdsb2JhbCBsb2NhbGUuCitsb2NhbGU6OmxvY2FsZSgpIF9TVExQX05PVEhST1cKKyAgOiBfTV9pbXBsKF9nZXRfTG9jYWxlX2ltcGwoX1N0bF9nZXRfZ2xvYmFsX2xvY2FsZSgpLT5fTV9pbXBsKSkKK3t9CisKKy8vIENvcHkgY29uc3RydWN0b3IKK2xvY2FsZTo6bG9jYWxlKGNvbnN0IGxvY2FsZSYgTCkgX1NUTFBfTk9USFJPVworICA6IF9NX2ltcGwoIF9nZXRfTG9jYWxlX2ltcGwoIEwuX01faW1wbCApICkKK3t9CisKK3ZvaWQgbG9jYWxlOjpfTV9pbnNlcnQoZmFjZXQqIGYsIGxvY2FsZTo6aWQmIG4pIHsKKyAgaWYgKGYpCisgICAgX01faW1wbC0+aW5zZXJ0KGYsIF9TdGxfbG9jX2dldF9pbmRleChuKSk7Cit9CisKK2xvY2FsZTo6bG9jYWxlKCBfTG9jYWxlX2ltcGwqIGltcGwgKSA6CisgIF9NX2ltcGwoIF9nZXRfTG9jYWxlX2ltcGwoIGltcGwgKSApCit7fQorCisvLyBDcmVhdGUgYSBsb2NhbGUgZnJvbSBhIG5hbWUuCitsb2NhbGU6OmxvY2FsZShjb25zdCBjaGFyKiBuYW1lKQorICA6IF9NX2ltcGwoMCkgeworICBpZiAoIW5hbWUpCisgICAgX01fdGhyb3dfb25fbnVsbF9uYW1lKCk7CisKKyAgaWYgKGlzX0NfbG9jYWxlX25hbWUobmFtZSkpIHsKKyAgICBfTV9pbXBsID0gX2dldF9Mb2NhbGVfaW1wbCggbG9jYWxlOjpjbGFzc2ljKCkuX01faW1wbCApOworICAgIHJldHVybjsKKyAgfQorCisgIF9Mb2NhbGVfaW1wbCogaW1wbCA9IDA7CisgIF9TVExQX1RSWSB7CisgICAgaW1wbCA9IG5ldyBfTG9jYWxlX2ltcGwobG9jYWxlOjppZDo6X1NfbWF4LCBuYW1lKTsKKworICAgIC8vIEluc2VydCBjYXRlZ29yaWVzIG9uZSBhdCBhIHRpbWUuCisgICAgX0xvY2FsZV9uYW1lX2hpbnQgKmhpbnQgPSAwOworICAgIGNvbnN0IGNoYXIqIGN0eXBlX25hbWUgPSBuYW1lOworICAgIGNoYXIgY3R5cGVfYnVmW19Mb2NhbGVfTUFYX1NJTVBMRV9OQU1FXTsKKyAgICBjb25zdCBjaGFyKiBudW1lcmljX25hbWUgPSBuYW1lOworICAgIGNoYXIgbnVtZXJpY19idWZbX0xvY2FsZV9NQVhfU0lNUExFX05BTUVdOworICAgIGNvbnN0IGNoYXIqIHRpbWVfbmFtZSA9IG5hbWU7CisgICAgY2hhciB0aW1lX2J1ZltfTG9jYWxlX01BWF9TSU1QTEVfTkFNRV07CisgICAgY29uc3QgY2hhciogY29sbGF0ZV9uYW1lID0gbmFtZTsKKyAgICBjaGFyIGNvbGxhdGVfYnVmW19Mb2NhbGVfTUFYX1NJTVBMRV9OQU1FXTsKKyAgICBjb25zdCBjaGFyKiBtb25ldGFyeV9uYW1lID0gbmFtZTsKKyAgICBjaGFyIG1vbmV0YXJ5X2J1ZltfTG9jYWxlX01BWF9TSU1QTEVfTkFNRV07CisgICAgY29uc3QgY2hhciogbWVzc2FnZXNfbmFtZSA9IG5hbWU7CisgICAgY2hhciBtZXNzYWdlc19idWZbX0xvY2FsZV9NQVhfU0lNUExFX05BTUVdOworICAgIGhpbnQgPSBpbXBsLT5pbnNlcnRfY3R5cGVfZmFjZXRzKGN0eXBlX25hbWUsIGN0eXBlX2J1ZiwgaGludCk7CisgICAgaGludCA9IGltcGwtPmluc2VydF9udW1lcmljX2ZhY2V0cyhudW1lcmljX25hbWUsIG51bWVyaWNfYnVmLCBoaW50KTsKKyAgICBoaW50ID0gaW1wbC0+aW5zZXJ0X3RpbWVfZmFjZXRzKHRpbWVfbmFtZSwgdGltZV9idWYsIGhpbnQpOworICAgIGhpbnQgPSBpbXBsLT5pbnNlcnRfY29sbGF0ZV9mYWNldHMoY29sbGF0ZV9uYW1lLCBjb2xsYXRlX2J1ZiwgaGludCk7CisgICAgaGludCA9IGltcGwtPmluc2VydF9tb25ldGFyeV9mYWNldHMobW9uZXRhcnlfbmFtZSwgbW9uZXRhcnlfYnVmLCBoaW50KTsKKyAgICBpbXBsLT5pbnNlcnRfbWVzc2FnZXNfZmFjZXRzKG1lc3NhZ2VzX25hbWUsIG1lc3NhZ2VzX2J1ZiwgaGludCk7CisKKyAgICAvLyBUcnkgdG8gdXNlIGEgbm9ybWFsaXplIGxvY2FsZSBuYW1lIGluIG9yZGVyIHRvIGhhdmUgdGhlID09IG9wZXJhdG9yCisgICAgLy8gdG8gYmVoYXZlIGNvcnJlY3RseToKKyAgICBpZiAoc3RyY21wKGN0eXBlX25hbWUsIG51bWVyaWNfbmFtZSkgPT0gMCAmJgorICAgICAgICBzdHJjbXAoY3R5cGVfbmFtZSwgdGltZV9uYW1lKSA9PSAwICYmCisgICAgICAgIHN0cmNtcChjdHlwZV9uYW1lLCBjb2xsYXRlX25hbWUpID09IDAgJiYKKyAgICAgICAgc3RyY21wKGN0eXBlX25hbWUsIG1vbmV0YXJ5X25hbWUpID09IDAgJiYKKyAgICAgICAgc3RyY21wKGN0eXBlX25hbWUsIG1lc3NhZ2VzX25hbWUpID09IDApIHsKKyAgICAgIGltcGwtPm5hbWUgPSBjdHlwZV9uYW1lOworICAgIH0KKyAgICAvLyBlbHNlIHdlIGtlZXAgY3VycmVudCBuYW1lLgorCisgICAgLy8gcmVhc3NpZ24gaW1wbAorICAgIF9NX2ltcGwgPSBfZ2V0X0xvY2FsZV9pbXBsKCBpbXBsICk7CisgIH0KKyAgX1NUTFBfVU5XSU5EKGRlbGV0ZSBpbXBsKTsKK30KKworc3RhdGljIHZvaWQgX1N0bF9sb2NfY29tYmluZV9uYW1lc19hdXgoX0xvY2FsZV9pbXBsKiBMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGN0eXBlX25hbWUsIGNvbnN0IGNoYXIqIHRpbWVfbmFtZSwgY29uc3QgY2hhciogbnVtZXJpY19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY29sbGF0ZV9uYW1lLCBjb25zdCBjaGFyKiBtb25ldGFyeV9uYW1lLCBjb25zdCBjaGFyKiBtZXNzYWdlc19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlOjpjYXRlZ29yeSBjKSB7CisgIC8vIFRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgd2hlbiBuYW1lcyBoYXMgYmVlbiB2YWxpZGF0ZWQgc28gdXNpbmcgX0xvY2FsZV9leHRyYWN0XypfbmFtZQorICAvLyBjYW4ndCBmYWlsLgorICBpbnQgX19lcnJfY29kZTsKKyAgY2hhciBidWZbX0xvY2FsZV9NQVhfU0lNUExFX05BTUVdOworICBMLT5uYW1lID0gc3RyaW5nKCJMQ19DVFlQRT0iKSArIF9Mb2NhbGVfZXh0cmFjdF9jdHlwZV9uYW1lKChjICYgbG9jYWxlOjpjdHlwZSkgPyBjdHlwZV9uYW1lIDogbmFtZSwgYnVmLCAwLCAmX19lcnJfY29kZSkgKyAiOyI7CisgIEwtPm5hbWUgKz0gc3RyaW5nKCJMQ19USU1FPSIpICsgX0xvY2FsZV9leHRyYWN0X3RpbWVfbmFtZSgoYyAmIGxvY2FsZTo6dGltZSkgPyB0aW1lX25hbWUgOiBuYW1lLCBidWYsIDAsICZfX2Vycl9jb2RlKSArICI7IjsKKyAgTC0+bmFtZSArPSBzdHJpbmcoIkxDX05VTUVSSUM9IikgKyBfTG9jYWxlX2V4dHJhY3RfbnVtZXJpY19uYW1lKChjICYgbG9jYWxlOjpudW1lcmljKSA/IG51bWVyaWNfbmFtZSA6IG5hbWUsIGJ1ZiwgMCwgJl9fZXJyX2NvZGUpICsgIjsiOworICBMLT5uYW1lICs9IHN0cmluZygiTENfQ09MTEFURT0iKSArIF9Mb2NhbGVfZXh0cmFjdF9jb2xsYXRlX25hbWUoKGMgJiBsb2NhbGU6OmNvbGxhdGUpID8gY29sbGF0ZV9uYW1lIDogbmFtZSwgYnVmLCAwLCAmX19lcnJfY29kZSkgKyAiOyI7CisgIEwtPm5hbWUgKz0gc3RyaW5nKCJMQ19NT05FVEFSWT0iKSArIF9Mb2NhbGVfZXh0cmFjdF9tb25ldGFyeV9uYW1lKChjICYgbG9jYWxlOjptb25ldGFyeSkgPyBtb25ldGFyeV9uYW1lIDogbmFtZSwgYnVmLCAwLCAmX19lcnJfY29kZSkgKyAiOyI7CisgIEwtPm5hbWUgKz0gc3RyaW5nKCJMQ19NRVNTQUdFUz0iKSArIF9Mb2NhbGVfZXh0cmFjdF9tZXNzYWdlc19uYW1lKChjICYgbG9jYWxlOjptZXNzYWdlcykgPyBtZXNzYWdlc19uYW1lIDogbmFtZSwgYnVmLCAwLCAmX19lcnJfY29kZSk7Cit9CisKKy8vIEdpdmUgTCBhIG5hbWUgd2hlcmUgYWxsIGZhY2V0cyBleGNlcHQgdGhvc2UgaW4gY2F0ZWdvcnkgYworLy8gYXJlIHRha2VuIGZyb20gbmFtZTEsIGFuZCB0aG9zZSBpbiBjYXRlZ29yeSBjIGFyZSB0YWtlbiBmcm9tIG5hbWUyLgorc3RhdGljIHZvaWQgX1N0bF9sb2NfY29tYmluZV9uYW1lcyhfTG9jYWxlX2ltcGwqIEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG5hbWUxLCBjb25zdCBjaGFyKiBuYW1lMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlOjpjYXRlZ29yeSBjKSB7CisgIGlmICgoYyAmIGxvY2FsZTo6YWxsKSA9PSAwIHx8IHN0cmNtcChuYW1lMSwgbmFtZTEpID09IDApCisgICAgTC0+bmFtZSA9IG5hbWUxOworICBlbHNlIGlmICgoYyAmIGxvY2FsZTo6YWxsKSA9PSBsb2NhbGU6OmFsbCkKKyAgICBMLT5uYW1lID0gbmFtZTI7CisgIGVsc2UgeworICAgIF9TdGxfbG9jX2NvbWJpbmVfbmFtZXNfYXV4KEwsIG5hbWUxLCBuYW1lMiwgbmFtZTIsIG5hbWUyLCBuYW1lMiwgbmFtZTIsIG5hbWUyLCBjKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBfU3RsX2xvY19jb21iaW5lX25hbWVzKF9Mb2NhbGVfaW1wbCogTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY3R5cGVfbmFtZSwgY29uc3QgY2hhciogdGltZV9uYW1lLCBjb25zdCBjaGFyKiBudW1lcmljX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbGxhdGVfbmFtZSwgY29uc3QgY2hhciogbW9uZXRhcnlfbmFtZSwgY29uc3QgY2hhciogbWVzc2FnZXNfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlOjpjYXRlZ29yeSBjKSB7CisgIGlmICgoYyAmIGxvY2FsZTo6YWxsKSA9PSAwIHx8IChzdHJjbXAobmFtZSwgY3R5cGVfbmFtZSkgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyY21wKG5hbWUsIHRpbWVfbmFtZSkgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyY21wKG5hbWUsIG51bWVyaWNfbmFtZSkgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyY21wKG5hbWUsIGNvbGxhdGVfbmFtZSkgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyY21wKG5hbWUsIG1vbmV0YXJ5X25hbWUpID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNtcChuYW1lLCBtZXNzYWdlc19uYW1lKSA9PSAwKSkKKyAgICBMLT5uYW1lID0gbmFtZTsKKyAgZWxzZSBpZiAoKGMgJiBsb2NhbGU6OmFsbCkgPT0gbG9jYWxlOjphbGwgJiYgc3RyY21wKGN0eXBlX25hbWUsIHRpbWVfbmFtZSkgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJjbXAoY3R5cGVfbmFtZSwgbnVtZXJpY19uYW1lKSA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNtcChjdHlwZV9uYW1lLCBjb2xsYXRlX25hbWUpID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyY21wKGN0eXBlX25hbWUsIG1vbmV0YXJ5X25hbWUpID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyY21wKGN0eXBlX25hbWUsIG1lc3NhZ2VzX25hbWUpID09IDApCisgICAgTC0+bmFtZSA9IGN0eXBlX25hbWU7CisgIGVsc2UgeworICAgIF9TdGxfbG9jX2NvbWJpbmVfbmFtZXNfYXV4KEwsIG5hbWUsIGN0eXBlX25hbWUsIHRpbWVfbmFtZSwgbnVtZXJpY19uYW1lLCBjb2xsYXRlX25hbWUsIG1vbmV0YXJ5X25hbWUsIG1lc3NhZ2VzX25hbWUsIGMpOworICB9Cit9CisKKworLy8gQ3JlYXRlIGEgbG9jYWxlIHRoYXQncyBhIGNvcHkgb2YgTCwgZXhjZXB0IHRoYXQgYWxsIG9mIHRoZSBmYWNldHMKKy8vIGluIGNhdGVnb3J5IGMgYXJlIGluc3RlYWQgY29uc3RydWN0ZWQgYnkgbmFtZS4KK2xvY2FsZTo6bG9jYWxlKGNvbnN0IGxvY2FsZSYgTCwgY29uc3QgY2hhciogbmFtZSwgbG9jYWxlOjpjYXRlZ29yeSBjKQorICA6IF9NX2ltcGwoMCkgeworICBpZiAoIW5hbWUpCisgICAgX01fdGhyb3dfb25fbnVsbF9uYW1lKCk7CisKKyAgaWYgKF9OYW1lbGVzcyA9PSBuYW1lKQorICAgIF9TVExQX1RIUk9XKHJ1bnRpbWVfZXJyb3IoKHN0cmluZygiSW52YWxpZCBsb2NhbGUgbmFtZSAnIikgKyBfTmFtZWxlc3MgKyAiJyIpLmNfc3RyKCkpKTsKKworICBfTG9jYWxlX2ltcGwqIGltcGwgPSAwOworCisgIF9TVExQX1RSWSB7CisgICAgaW1wbCA9IG5ldyBfTG9jYWxlX2ltcGwoKkwuX01faW1wbCk7CisKKyAgICBfTG9jYWxlX25hbWVfaGludCAqaGludCA9IDA7CisgICAgY29uc3QgY2hhciogY3R5cGVfbmFtZSA9IG5hbWU7CisgICAgY2hhciBjdHlwZV9idWZbX0xvY2FsZV9NQVhfU0lNUExFX05BTUVdOworICAgIGNvbnN0IGNoYXIqIG51bWVyaWNfbmFtZSA9IG5hbWU7CisgICAgY2hhciBudW1lcmljX2J1ZltfTG9jYWxlX01BWF9TSU1QTEVfTkFNRV07CisgICAgY29uc3QgY2hhciogdGltZV9uYW1lID0gbmFtZTsKKyAgICBjaGFyIHRpbWVfYnVmW19Mb2NhbGVfTUFYX1NJTVBMRV9OQU1FXTsKKyAgICBjb25zdCBjaGFyKiBjb2xsYXRlX25hbWUgPSBuYW1lOworICAgIGNoYXIgY29sbGF0ZV9idWZbX0xvY2FsZV9NQVhfU0lNUExFX05BTUVdOworICAgIGNvbnN0IGNoYXIqIG1vbmV0YXJ5X25hbWUgPSBuYW1lOworICAgIGNoYXIgbW9uZXRhcnlfYnVmW19Mb2NhbGVfTUFYX1NJTVBMRV9OQU1FXTsKKyAgICBjb25zdCBjaGFyKiBtZXNzYWdlc19uYW1lID0gbmFtZTsKKyAgICBjaGFyIG1lc3NhZ2VzX2J1ZltfTG9jYWxlX01BWF9TSU1QTEVfTkFNRV07CisgICAgaWYgKGMgJiBsb2NhbGU6OmN0eXBlKQorICAgICAgaGludCA9IGltcGwtPmluc2VydF9jdHlwZV9mYWNldHMoY3R5cGVfbmFtZSwgY3R5cGVfYnVmLCBoaW50KTsKKyAgICBpZiAoYyAmIGxvY2FsZTo6bnVtZXJpYykKKyAgICAgIGhpbnQgPSBpbXBsLT5pbnNlcnRfbnVtZXJpY19mYWNldHMobnVtZXJpY19uYW1lLCBudW1lcmljX2J1ZiwgaGludCk7CisgICAgaWYgKGMgJiBsb2NhbGU6OnRpbWUpCisgICAgICBoaW50ID0gaW1wbC0+aW5zZXJ0X3RpbWVfZmFjZXRzKHRpbWVfbmFtZSwgdGltZV9idWYsIGhpbnQpOworICAgIGlmIChjICYgbG9jYWxlOjpjb2xsYXRlKQorICAgICAgaGludCA9IGltcGwtPmluc2VydF9jb2xsYXRlX2ZhY2V0cyhjb2xsYXRlX25hbWUsIGNvbGxhdGVfYnVmLCBoaW50KTsKKyAgICBpZiAoYyAmIGxvY2FsZTo6bW9uZXRhcnkpCisgICAgICBoaW50ID0gaW1wbC0+aW5zZXJ0X21vbmV0YXJ5X2ZhY2V0cyhtb25ldGFyeV9uYW1lLCBtb25ldGFyeV9idWYsaGludCk7CisgICAgaWYgKGMgJiBsb2NhbGU6Om1lc3NhZ2VzKQorICAgICAgaW1wbC0+aW5zZXJ0X21lc3NhZ2VzX2ZhY2V0cyhtZXNzYWdlc19uYW1lLCBtZXNzYWdlc19idWYsIGhpbnQpOworCisgICAgX1N0bF9sb2NfY29tYmluZV9uYW1lcyhpbXBsLCBMLl9NX2ltcGwtPm5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eXBlX25hbWUsIHRpbWVfbmFtZSwgbnVtZXJpY19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGF0ZV9uYW1lLCBtb25ldGFyeV9uYW1lLCBtZXNzYWdlc19uYW1lLCBjKTsKKyAgICBfTV9pbXBsID0gX2dldF9Mb2NhbGVfaW1wbCggaW1wbCApOworICB9CisgIF9TVExQX1VOV0lORChkZWxldGUgaW1wbCkKK30KKworLy8gQ29udHJ1Y3QgYSBuZXcgbG9jYWxlIHdoZXJlIGFsbCBmYWNldHMgdGhhdCBhcmVuJ3QgaW4gY2F0ZWdvcnkgYworLy8gY29tZSBmcm9tIEwxLCBhbmQgYWxsIHRob3NlIHRoYXQgYXJlIGluIGNhdGVnb3J5IGMgY29tZSBmcm9tIEwyLgorbG9jYWxlOjpsb2NhbGUoY29uc3QgbG9jYWxlJiBMMSwgY29uc3QgbG9jYWxlJiBMMiwgY2F0ZWdvcnkgYykKKyAgOiBfTV9pbXBsKDApIHsKKyAgX0xvY2FsZV9pbXBsKiBpbXBsID0gbmV3IF9Mb2NhbGVfaW1wbCgqTDEuX01faW1wbCk7CisKKyAgX0xvY2FsZV9pbXBsKiBpMiA9IEwyLl9NX2ltcGw7CisKKyAgaWYgKEwxLm5hbWUoKSAhPSBfTmFtZWxlc3MgJiYgTDIubmFtZSgpICE9IF9OYW1lbGVzcykKKyAgICBfU3RsX2xvY19jb21iaW5lX25hbWVzKGltcGwsIEwxLl9NX2ltcGwtPm5hbWUuY19zdHIoKSwgTDIuX01faW1wbC0+bmFtZS5jX3N0cigpLCBjKTsKKyAgZWxzZSB7CisgICAgaW1wbC0+bmFtZSA9IF9OYW1lbGVzczsKKyAgfQorCisgIGlmIChjICYgY29sbGF0ZSkgeworICAgIGltcGwtPmluc2VydCggaTIsIF9TVExQX1NURDo6Y29sbGF0ZTxjaGFyPjo6aWQpOworIyBpZm5kZWYgX1NUTFBfTk9fV0NIQVJfVAorICAgIGltcGwtPmluc2VydCggaTIsIF9TVExQX1NURDo6Y29sbGF0ZTx3Y2hhcl90Pjo6aWQpOworIyBlbmRpZgorICB9CisgIGlmIChjICYgY3R5cGUpIHsKKyAgICBpbXBsLT5pbnNlcnQoIGkyLCBfU1RMUF9TVEQ6OmN0eXBlPGNoYXI+OjppZCk7CisgICAgaW1wbC0+aW5zZXJ0KCBpMiwgX1NUTFBfU1REOjpjb2RlY3Z0PGNoYXIsIGNoYXIsIG1ic3RhdGVfdD46OmlkKTsKKyMgaWZuZGVmIF9TVExQX05PX1dDSEFSX1QKKyAgICBpbXBsLT5pbnNlcnQoIGkyLCBfU1RMUF9TVEQ6OmN0eXBlPHdjaGFyX3Q+OjppZCk7CisgICAgaW1wbC0+aW5zZXJ0KCBpMiwgX1NUTFBfU1REOjpjb2RlY3Z0PHdjaGFyX3QsIGNoYXIsIG1ic3RhdGVfdD46OmlkKTsKKyMgZW5kaWYKKyAgfQorICBpZiAoYyAmIG1vbmV0YXJ5KSB7CisgICAgaW1wbC0+aW5zZXJ0KCBpMiwgX1NUTFBfU1REOjptb25leXB1bmN0PGNoYXIsIHRydWU+OjppZCk7CisgICAgaW1wbC0+aW5zZXJ0KCBpMiwgX1NUTFBfU1REOjptb25leXB1bmN0PGNoYXIsIGZhbHNlPjo6aWQpOworICAgIGltcGwtPmluc2VydCggaTIsIF9TVExQX1NURDo6bW9uZXlfZ2V0PGNoYXIsIGlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiA+OjppZCk7CisgICAgaW1wbC0+aW5zZXJ0KCBpMiwgX1NUTFBfU1REOjptb25leV9wdXQ8Y2hhciwgb3N0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+ID46OmlkKTsKKyMgaWZuZGVmIF9TVExQX05PX1dDSEFSX1QKKyAgICBpbXBsLT5pbnNlcnQoIGkyLCBfU1RMUF9TVEQ6Om1vbmV5cHVuY3Q8d2NoYXJfdCwgdHJ1ZT46OmlkKTsKKyAgICBpbXBsLT5pbnNlcnQoIGkyLCBfU1RMUF9TVEQ6Om1vbmV5cHVuY3Q8d2NoYXJfdCwgZmFsc2U+OjppZCk7CisgICAgaW1wbC0+aW5zZXJ0KCBpMiwgX1NUTFBfU1REOjptb25leV9nZXQ8d2NoYXJfdCwgaXN0cmVhbWJ1Zl9pdGVyYXRvcjx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+ID46OmlkKTsKKyAgICBpbXBsLT5pbnNlcnQoIGkyLCBfU1RMUF9TVEQ6Om1vbmV5X3B1dDx3Y2hhcl90LCBvc3RyZWFtYnVmX2l0ZXJhdG9yPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4gPjo6aWQpOworIyBlbmRpZgorICB9CisgIGlmIChjICYgbnVtZXJpYykgeworICAgIGltcGwtPmluc2VydCggaTIsIF9TVExQX1NURDo6bnVtcHVuY3Q8Y2hhcj46OmlkKTsKKyAgICBpbXBsLT5pbnNlcnQoIGkyLCBfU1RMUF9TVEQ6Om51bV9nZXQ8Y2hhciwgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+ID46OmlkKTsKKyAgICBpbXBsLT5pbnNlcnQoIGkyLCBfU1RMUF9TVEQ6Om51bV9wdXQ8Y2hhciwgb3N0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+ID46OmlkKTsKKyMgaWZuZGVmIF9TVExQX05PX1dDSEFSX1QKKyAgICBpbXBsLT5pbnNlcnQoIGkyLCBfU1RMUF9TVEQ6Om51bXB1bmN0PHdjaGFyX3Q+OjppZCk7CisgICAgaW1wbC0+aW5zZXJ0KCBpMiwgX1NUTFBfU1REOjpudW1fZ2V0PHdjaGFyX3QsIGlzdHJlYW1idWZfaXRlcmF0b3I8d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPiA+OjppZCk7CisgICAgaW1wbC0+aW5zZXJ0KCBpMiwgX1NUTFBfU1REOjpudW1fcHV0PHdjaGFyX3QsIG9zdHJlYW1idWZfaXRlcmF0b3I8d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPiA+OjppZCk7CisjIGVuZGlmCisgIH0KKyAgaWYgKGMgJiB0aW1lKSB7CisgICAgaW1wbC0+aW5zZXJ0KCBpMiwgX1NUTFBfU1REOjp0aW1lX2dldDxjaGFyLCBpc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4gPjo6aWQpOworICAgIGltcGwtPmluc2VydCggaTIsIF9TVExQX1NURDo6dGltZV9wdXQ8Y2hhciwgb3N0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+ID46OmlkKTsKKyMgaWZuZGVmIF9TVExQX05PX1dDSEFSX1QKKyAgICBpbXBsLT5pbnNlcnQoIGkyLCBfU1RMUF9TVEQ6OnRpbWVfZ2V0PHdjaGFyX3QsIGlzdHJlYW1idWZfaXRlcmF0b3I8d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPiA+OjppZCk7CisgICAgaW1wbC0+aW5zZXJ0KCBpMiwgX1NUTFBfU1REOjp0aW1lX3B1dDx3Y2hhcl90LCBvc3RyZWFtYnVmX2l0ZXJhdG9yPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4gPjo6aWQpOworIyBlbmRpZgorICB9CisgIGlmIChjICYgbWVzc2FnZXMpIHsKKyAgICBpbXBsLT5pbnNlcnQoIGkyLCBfU1RMUF9TVEQ6Om1lc3NhZ2VzPGNoYXI+OjppZCk7CisjIGlmbmRlZiBfU1RMUF9OT19XQ0hBUl9UCisgICAgaW1wbC0+aW5zZXJ0KCBpMiwgX1NUTFBfU1REOjptZXNzYWdlczx3Y2hhcl90Pjo6aWQpOworIyBlbmRpZgorICB9CisgIF9NX2ltcGwgPSBfZ2V0X0xvY2FsZV9pbXBsKCBpbXBsICk7Cit9CisKKy8vIERlc3RydWN0b3IuCitsb2NhbGU6On5sb2NhbGUoKSBfU1RMUF9OT1RIUk9XIHsKKyAgaWYgKF9NX2ltcGwpCisgICAgX3JlbGVhc2VfTG9jYWxlX2ltcGwoX01faW1wbCk7Cit9CisKKy8vIEFzc2lnbm1lbnQgb3BlcmF0b3IuICBNdWNoIGxpa2UgdGhlIGNvcHkgY29uc3RydWN0b3I6IGp1c3QgYSBiaXQgb2YKKy8vIHBvaW50ZXIgdHdpZGRsaW5nLgorY29uc3QgbG9jYWxlJiBsb2NhbGU6Om9wZXJhdG9yPShjb25zdCBsb2NhbGUmIEwpIF9TVExQX05PVEhST1cgeworICBpZiAodGhpcy0+X01faW1wbCAhPSBMLl9NX2ltcGwpIHsKKyAgICBpZiAodGhpcy0+X01faW1wbCkKKyAgICAgIF9yZWxlYXNlX0xvY2FsZV9pbXBsKHRoaXMtPl9NX2ltcGwpOworICAgIHRoaXMtPl9NX2ltcGwgPSBfZ2V0X0xvY2FsZV9pbXBsKEwuX01faW1wbCk7CisgIH0KKyAgcmV0dXJuICp0aGlzOworfQorCitsb2NhbGU6OmZhY2V0KiBsb2NhbGU6Ol9NX2dldF9mYWNldChjb25zdCBsb2NhbGU6OmlkJiBuKSBjb25zdCB7CisgIHJldHVybiBuLl9NX2luZGV4IDwgX01faW1wbC0+c2l6ZSgpID8gX01faW1wbC0+ZmFjZXRzX3ZlY1tuLl9NX2luZGV4XSA6IDA7Cit9CisKK2xvY2FsZTo6ZmFjZXQqIGxvY2FsZTo6X01fdXNlX2ZhY2V0KGNvbnN0IGxvY2FsZTo6aWQmIG4pIGNvbnN0IHsKKyAgbG9jYWxlOjpmYWNldCogZiA9IChuLl9NX2luZGV4IDwgX01faW1wbC0+c2l6ZSgpID8gX01faW1wbC0+ZmFjZXRzX3ZlY1tuLl9NX2luZGV4XSA6IDApOworICBpZiAoIWYpCisgICAgX01faW1wbC0+X01fdGhyb3dfYmFkX2Nhc3QoKTsKKyAgcmV0dXJuIGY7Cit9CisKK3N0cmluZyBsb2NhbGU6Om5hbWUoKSBjb25zdCB7CisgIHJldHVybiBfTV9pbXBsLT5uYW1lOworfQorCisvLyBDb21wYXJlIHR3byBsb2NhbGVzIGZvciBlcXVhbGl0eS4KK2Jvb2wgbG9jYWxlOjpvcGVyYXRvcj09KGNvbnN0IGxvY2FsZSYgTCkgY29uc3QgeworICByZXR1cm4gdGhpcy0+X01faW1wbCA9PSBMLl9NX2ltcGwgfHwKKyAgICAgICAgICh0aGlzLT5uYW1lKCkgPT0gTC5uYW1lKCkgJiYgdGhpcy0+bmFtZSgpICE9IF9OYW1lbGVzcyk7Cit9CisKK2Jvb2wgbG9jYWxlOjpvcGVyYXRvciE9KGNvbnN0IGxvY2FsZSYgTCkgY29uc3QgeworICByZXR1cm4gISgqdGhpcyA9PSBMKTsKK30KKworLy8gc3RhdGljIGRhdGEgbWVtYmVycy4KKworY29uc3QgbG9jYWxlJiBfU1RMUF9DQUxMIGxvY2FsZTo6Y2xhc3NpYygpIHsKKyAgcmV0dXJuICpfU3RsX2dldF9jbGFzc2ljX2xvY2FsZSgpOworfQorCisjaWYgIWRlZmluZWQgKF9TVExQX1VTRV9NU1ZDNl9NRU1fVF9CVUdfV09SS0FST1VORCkKK2xvY2FsZSBfU1RMUF9DQUxMIGxvY2FsZTo6Z2xvYmFsKGNvbnN0IGxvY2FsZSYgTCkgeworI2Vsc2UKK19Mb2NhbGVfaW1wbCogX1NUTFBfQ0FMTCBsb2NhbGU6Omdsb2JhbChjb25zdCBsb2NhbGUmIEwpIHsKKyNlbmRpZgorICBsb2NhbGUgb2xkKF9TdGxfZ2V0X2dsb2JhbF9sb2NhbGUoKS0+X01faW1wbCk7CisgIGlmIChfU3RsX2dldF9nbG9iYWxfbG9jYWxlKCktPl9NX2ltcGwgIT0gTC5fTV9pbXBsKSB7CisgICAgX3JlbGVhc2VfTG9jYWxlX2ltcGwoX1N0bF9nZXRfZ2xvYmFsX2xvY2FsZSgpLT5fTV9pbXBsKTsKKyAgICAvLyB0aGlzIGFzc2lnbiBzaG91bGQgYmUgYXRvbWljLCBzaG91bGQgYmUgZml4ZWQgaGVyZToKKyAgICBfU3RsX2dldF9nbG9iYWxfbG9jYWxlKCktPl9NX2ltcGwgPSBfZ2V0X0xvY2FsZV9pbXBsKEwuX01faW1wbCk7CisKKyAgICAvLyBTZXQgdGhlIGdsb2JhbCBDIGxvY2FsZSwgaWYgYXBwcm9wcmlhdGUuCisjaWYgIWRlZmluZWQoX1NUTFBfTk9fTE9DQUxFX1NVUFBPUlQpCisgICAgaWYgKEwubmFtZSgpICE9IF9OYW1lbGVzcykKKyAgICAgIHNldGxvY2FsZShMQ19BTEwsIEwubmFtZSgpLmNfc3RyKCkpOworI2VuZGlmCisgIH0KKworI2lmICFkZWZpbmVkIChfU1RMUF9VU0VfTVNWQzZfTUVNX1RfQlVHX1dPUktBUk9VTkQpCisgIHJldHVybiBvbGQ7CisjZWxzZQorICByZXR1cm4gb2xkLl9NX2ltcGw7CisjZW5kaWYKK30KKworI2lmICFkZWZpbmVkIChfU1RMUF9TVEFUSUNfQ09OU1RfSU5JVF9CVUcpICYmICFkZWZpbmVkIChfU1RMUF9OT19TVEFUSUNfQ09OU1RfREVGSU5JVElPTikKK2NvbnN0IGxvY2FsZTo6Y2F0ZWdvcnkgbG9jYWxlOjpub25lOworY29uc3QgbG9jYWxlOjpjYXRlZ29yeSBsb2NhbGU6OmNvbGxhdGU7Citjb25zdCBsb2NhbGU6OmNhdGVnb3J5IGxvY2FsZTo6Y3R5cGU7Citjb25zdCBsb2NhbGU6OmNhdGVnb3J5IGxvY2FsZTo6bW9uZXRhcnk7Citjb25zdCBsb2NhbGU6OmNhdGVnb3J5IGxvY2FsZTo6bnVtZXJpYzsKK2NvbnN0IGxvY2FsZTo6Y2F0ZWdvcnkgbG9jYWxlOjp0aW1lOworY29uc3QgbG9jYWxlOjpjYXRlZ29yeSBsb2NhbGU6Om1lc3NhZ2VzOworY29uc3QgbG9jYWxlOjpjYXRlZ29yeSBsb2NhbGU6OmFsbDsKKyNlbmRpZgorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKZGlmZiAtLWdpdCBhL3NyYy9sb2NhbGVfY2F0YWxvZy5jcHAgYi9zcmMvbG9jYWxlX2NhdGFsb2cuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZTY3MmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbG9jYWxlX2NhdGFsb2cuY3BwCkBAIC0wLDAgKzEsMjg4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworI2luY2x1ZGUgInN0bHBvcnRfcHJlZml4LmgiCisKKyNpbmNsdWRlIDxoYXNoX21hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxsb2NhbGU+CisjaW5jbHVkZSA8aXN0cmVhbT4KKworI2luY2x1ZGUgImNfbG9jYWxlLmgiCisjaW5jbHVkZSAibG9jYWxlX2ltcGwuaCIKKyNpbmNsdWRlICJhY3F1aXJlX3JlbGVhc2UuaCIKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKKy8vIFRob3NlIHdyYXBwZXJzIGFyZSBuZWVkZWQgdG8gdXNlIGxvY2FsZSBmdW5jdGlvbnMgaW4gX19hY3F1aXJlX2NhdGVnb3J5LAorLy8gYWxsIGZ1bmN0aW9ucyBoYXZlIHRvIHByZXNlbnQgdGhlIHNhbWUgcHJvdG90eXBlLgorCitzdGF0aWMgdm9pZCogX0xvY19jdHlwZV9jcmVhdGUoY29uc3QgY2hhciAqIHMsIF9Mb2NhbGVfbmFtZV9oaW50KiBoaW50LCBpbnQgKl9fZXJyX2NvZGUpCit7IHJldHVybiBfTG9jYWxlX2N0eXBlX2NyZWF0ZShzLCBoaW50LCBfX2Vycl9jb2RlKTsgfQorc3RhdGljIHZvaWQqIF9Mb2NfY29kZWN2dF9jcmVhdGUoY29uc3QgY2hhciAqIHMsIF9Mb2NhbGVfbmFtZV9oaW50KiBoaW50LCBpbnQgKl9fZXJyX2NvZGUpCit7IHJldHVybiBfTG9jYWxlX2NvZGVjdnRfY3JlYXRlKHMsIGhpbnQsIF9fZXJyX2NvZGUpOyB9CitzdGF0aWMgdm9pZCogX0xvY19udW1lcmljX2NyZWF0ZShjb25zdCBjaGFyICogcywgX0xvY2FsZV9uYW1lX2hpbnQqIGhpbnQsIGludCAqX19lcnJfY29kZSkKK3sgcmV0dXJuIF9Mb2NhbGVfbnVtZXJpY19jcmVhdGUocywgaGludCwgX19lcnJfY29kZSk7IH0KK3N0YXRpYyB2b2lkKiBfTG9jX3RpbWVfY3JlYXRlKGNvbnN0IGNoYXIgKiBzLCBfTG9jYWxlX25hbWVfaGludCogaGludCwgaW50ICpfX2Vycl9jb2RlKQoreyByZXR1cm4gX0xvY2FsZV90aW1lX2NyZWF0ZShzLCBoaW50LCBfX2Vycl9jb2RlKTsgfQorc3RhdGljIHZvaWQqIF9Mb2NfY29sbGF0ZV9jcmVhdGUoY29uc3QgY2hhciAqIHMsIF9Mb2NhbGVfbmFtZV9oaW50KiBoaW50LCBpbnQgKl9fZXJyX2NvZGUpCit7IHJldHVybiBfTG9jYWxlX2NvbGxhdGVfY3JlYXRlKHMsIGhpbnQsIF9fZXJyX2NvZGUpOyB9CitzdGF0aWMgdm9pZCogX0xvY19tb25ldGFyeV9jcmVhdGUoY29uc3QgY2hhciAqIHMsIF9Mb2NhbGVfbmFtZV9oaW50KiBoaW50LCBpbnQgKl9fZXJyX2NvZGUpCit7IHJldHVybiBfTG9jYWxlX21vbmV0YXJ5X2NyZWF0ZShzLCBoaW50LCBfX2Vycl9jb2RlKTsgfQorc3RhdGljIHZvaWQqIF9Mb2NfbWVzc2FnZXNfY3JlYXRlKGNvbnN0IGNoYXIgKiBzLCBfTG9jYWxlX25hbWVfaGludCogaGludCwgaW50ICpfX2Vycl9jb2RlKQoreyByZXR1cm4gX0xvY2FsZV9tZXNzYWdlc19jcmVhdGUocywgaGludCwgX19lcnJfY29kZSk7IH0KKworc3RhdGljIGNoYXIgY29uc3QqIF9Mb2NfY3R5cGVfbmFtZSh2b2lkKiBsLCBjaGFyKiBzKQoreyByZXR1cm4gX0xvY2FsZV9jdHlwZV9uYW1lKChfTG9jYWxlX2N0eXBlKilsLCBzKTsgfQorc3RhdGljIGNoYXIgY29uc3QqIF9Mb2NfY29kZWN2dF9uYW1lKHZvaWQqIGwsIGNoYXIqIHMpCit7IHJldHVybiBfTG9jYWxlX2NvZGVjdnRfbmFtZSgoX0xvY2FsZV9jb2RlY3Z0KilsLCBzKTsgfQorc3RhdGljIGNoYXIgY29uc3QqIF9Mb2NfbnVtZXJpY19uYW1lKHZvaWQqIGwsIGNoYXIqIHMpCit7IHJldHVybiBfTG9jYWxlX251bWVyaWNfbmFtZSgoX0xvY2FsZV9udW1lcmljKilsLCBzKTsgfQorc3RhdGljIGNoYXIgY29uc3QqIF9Mb2NfdGltZV9uYW1lKHZvaWQqIGwsIGNoYXIqIHMpCit7IHJldHVybiBfTG9jYWxlX3RpbWVfbmFtZSgoX0xvY2FsZV90aW1lKilsLCBzKTsgfQorc3RhdGljIGNoYXIgY29uc3QqIF9Mb2NfY29sbGF0ZV9uYW1lKHZvaWQqIGwsIGNoYXIqIHMpCit7IHJldHVybiBfTG9jYWxlX2NvbGxhdGVfbmFtZSgoX0xvY2FsZV9jb2xsYXRlKilsLCBzKTsgfQorc3RhdGljIGNoYXIgY29uc3QqIF9Mb2NfbW9uZXRhcnlfbmFtZSh2b2lkKiBsLCBjaGFyKiBzKQoreyByZXR1cm4gX0xvY2FsZV9tb25ldGFyeV9uYW1lKChfTG9jYWxlX21vbmV0YXJ5KilsLCBzKTsgfQorc3RhdGljIGNoYXIgY29uc3QqIF9Mb2NfbWVzc2FnZXNfbmFtZSh2b2lkKiBsLCBjaGFyKiBzKQoreyByZXR1cm4gX0xvY2FsZV9tZXNzYWdlc19uYW1lKChfTG9jYWxlX21lc3NhZ2VzKilsLCBzKTsgfQorCitzdGF0aWMgY29uc3QgY2hhciogX0xvY19jdHlwZV9kZWZhdWx0KGNoYXIqIHApCit7IHJldHVybiBfTG9jYWxlX2N0eXBlX2RlZmF1bHQocCk7IH0KK3N0YXRpYyBjb25zdCBjaGFyKiBfTG9jX251bWVyaWNfZGVmYXVsdChjaGFyICogcCkKK3sgcmV0dXJuIF9Mb2NhbGVfbnVtZXJpY19kZWZhdWx0KHApOyB9CitzdGF0aWMgY29uc3QgY2hhciogX0xvY190aW1lX2RlZmF1bHQoY2hhciogcCkKK3sgcmV0dXJuIF9Mb2NhbGVfdGltZV9kZWZhdWx0KHApOyB9CitzdGF0aWMgY29uc3QgY2hhciogX0xvY19jb2xsYXRlX2RlZmF1bHQoY2hhciogcCkKK3sgcmV0dXJuIF9Mb2NhbGVfY29sbGF0ZV9kZWZhdWx0KHApOyB9CitzdGF0aWMgY29uc3QgY2hhciogX0xvY19tb25ldGFyeV9kZWZhdWx0KGNoYXIqIHApCit7IHJldHVybiBfTG9jYWxlX21vbmV0YXJ5X2RlZmF1bHQocCk7IH0KK3N0YXRpYyBjb25zdCBjaGFyKiBfTG9jX21lc3NhZ2VzX2RlZmF1bHQoY2hhciogcCkKK3sgcmV0dXJuIF9Mb2NhbGVfbWVzc2FnZXNfZGVmYXVsdChwKTsgfQorCitzdGF0aWMgdm9pZCBfTG9jX2N0eXBlX2Rlc3Ryb3kodm9pZCogcCkgICAge19Mb2NhbGVfY3R5cGVfZGVzdHJveSgoX0xvY2FsZV9jdHlwZSopcCk7IH0KK3N0YXRpYyB2b2lkIF9Mb2NfY29kZWN2dF9kZXN0cm95KHZvaWQqIHApICAgIHtfTG9jYWxlX2NvZGVjdnRfZGVzdHJveSgoX0xvY2FsZV9jb2RlY3Z0KilwKTsgfQorc3RhdGljIHZvaWQgX0xvY19udW1lcmljX2Rlc3Ryb3kodm9pZCogcCkgIHtfTG9jYWxlX251bWVyaWNfZGVzdHJveSgoX0xvY2FsZV9udW1lcmljKilwKTsgfQorc3RhdGljIHZvaWQgX0xvY190aW1lX2Rlc3Ryb3kodm9pZCogcCkgICAgIHtfTG9jYWxlX3RpbWVfZGVzdHJveSgoX0xvY2FsZV90aW1lKilwKTt9CitzdGF0aWMgdm9pZCBfTG9jX2NvbGxhdGVfZGVzdHJveSh2b2lkKiBwKSAge19Mb2NhbGVfY29sbGF0ZV9kZXN0cm95KChfTG9jYWxlX2NvbGxhdGUqKXApO30KK3N0YXRpYyB2b2lkIF9Mb2NfbW9uZXRhcnlfZGVzdHJveSh2b2lkKiBwKSB7X0xvY2FsZV9tb25ldGFyeV9kZXN0cm95KChfTG9jYWxlX21vbmV0YXJ5KilwKTt9CitzdGF0aWMgdm9pZCBfTG9jX21lc3NhZ2VzX2Rlc3Ryb3kodm9pZCogcCkge19Mb2NhbGVfbWVzc2FnZXNfZGVzdHJveSgoX0xvY2FsZV9tZXNzYWdlcyopcCk7fQorCit0eXBlZGVmIHZvaWQqICgqbG9jX2NyZWF0ZV9mdW5jX3QpKGNvbnN0IGNoYXIgKiwgX0xvY2FsZV9uYW1lX2hpbnQqLCBpbnQgKl9fZXJyX2NvZGUpOwordHlwZWRlZiBjaGFyIGNvbnN0KiAoKmxvY19uYW1lX2Z1bmNfdCkodm9pZCogbCwgY2hhciogcyk7Cit0eXBlZGVmIHZvaWQgKCpsb2NfZGVzdHJveV9mdW5jX3QpKHZvaWQqIGwpOwordHlwZWRlZiBjb25zdCBjaGFyKiAoKmxvY19kZWZhdWx0X25hbWVfZnVuY190KShjaGFyKiBzKTsKK3R5cGVkZWYgY2hhciBjb25zdCogKCpsb2NfZXh0cmFjdF9uYW1lX2Z1bmNfdCkoY29uc3QgY2hhciosIGNoYXIqLCBfTG9jYWxlX25hbWVfaGludCosIGludCAqX19lcnJfY29kZSk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQWNxdWlyZSBhbmQgcmVsZWFzZSBsb3ctbGV2ZWwgY2F0ZWdvcnkgb2JqZWN0cy4gIFRoZSB3aG9sZSBwb2ludCBvZgorLy8gdGhpcyBpcyBzbyB0aGF0IHdlIGRvbid0IGFsbG9jYXRlIChzYXkpIGZvdXIgZGlmZmVyZW50IF9Mb2NhbGVfY3R5cGUKKy8vIG9iamVjdHMgZm9yIGEgc2luZ2xlIGxvY2FsZS4KKworLy8gR2xvYmFsIGhhc2ggdGFibGVzIGZvciBjYXRlZ29yeSBvYmplY3RzLgordHlwZWRlZiBoYXNoX21hcDxzdHJpbmcsIHBhaXI8dm9pZCosIHNpemVfdD4sIGhhc2g8c3RyaW5nPiwgZXF1YWxfdG88c3RyaW5nPiA+IENhdGVnb3J5X01hcDsKKworLy8gTG9vayB1cCBhIGNhdGVnb3J5IGJ5IG5hbWUKK3N0YXRpYyBDYXRlZ29yeV9NYXAqKiBjdHlwZV9oYXNoKCkgeworICBzdGF0aWMgQ2F0ZWdvcnlfTWFwICpfU19jdHlwZV9oYXNoID0gMDsKKyAgcmV0dXJuICZfU19jdHlwZV9oYXNoOworfQorc3RhdGljIENhdGVnb3J5X01hcCoqIGNvZGVjdnRfaGFzaCgpIHsKKyAgc3RhdGljIENhdGVnb3J5X01hcCAqX1NfY29kZWN2dF9oYXNoID0gMDsKKyAgcmV0dXJuICZfU19jb2RlY3Z0X2hhc2g7Cit9CitzdGF0aWMgQ2F0ZWdvcnlfTWFwKiogbnVtZXJpY19oYXNoKCkgeworICBzdGF0aWMgQ2F0ZWdvcnlfTWFwICpfU19udW1lcmljX2hhc2ggPSAwOworICByZXR1cm4gJl9TX251bWVyaWNfaGFzaDsKK30KK3N0YXRpYyBDYXRlZ29yeV9NYXAqKiB0aW1lX2hhc2goKSB7CisgIHN0YXRpYyBDYXRlZ29yeV9NYXAgKl9TX3RpbWVfaGFzaCA9IDA7CisgIHJldHVybiAmX1NfdGltZV9oYXNoOworfQorc3RhdGljIENhdGVnb3J5X01hcCoqIGNvbGxhdGVfaGFzaCgpIHsKKyAgc3RhdGljIENhdGVnb3J5X01hcCAqX1NfY29sbGF0ZV9oYXNoID0gMDsKKyAgcmV0dXJuICZfU19jb2xsYXRlX2hhc2g7Cit9CitzdGF0aWMgQ2F0ZWdvcnlfTWFwKiogbW9uZXRhcnlfaGFzaCgpIHsKKyAgc3RhdGljIENhdGVnb3J5X01hcCAqX1NfbW9uZXRhcnlfaGFzaCA9IDA7CisgIHJldHVybiAmX1NfbW9uZXRhcnlfaGFzaDsKK30KK3N0YXRpYyBDYXRlZ29yeV9NYXAqKiBtZXNzYWdlc19oYXNoKCkgeworICBzdGF0aWMgQ2F0ZWdvcnlfTWFwICpfU19tZXNzYWdlc19oYXNoOworICByZXR1cm4gJl9TX21lc3NhZ2VzX2hhc2g7Cit9CisKKy8vIFdlIGhhdmUgYSBzaW5nbGUgbG9jayBmb3IgYWxsIG9mIHRoZSBoYXNoIHRhYmxlcy4gIFdlIG1heSB3aXNoIHRvCisvLyByZXBsYWNlIGl0IHdpdGggc2l4IGRpZmZlcmVudCBsb2Nrcy4KKy8qIFJFRkVSRU5DRUQgKi8KK3N0YXRpYyBfU1RMUF9TVEFUSUNfTVVURVgmIGNhdGVnb3J5X2hhc2hfbXV0ZXgoKSB7CisgIHN0YXRpYyBfU1RMUF9TVEFUSUNfTVVURVggbG9jayBfU1RMUF9NVVRFWF9JTklUSUFMSVpFUjsKKyAgcmV0dXJuIGxvY2s7Cit9CisKK3N0YXRpYyB2b2lkKgorX19hY3F1aXJlX2NhdGVnb3J5KGNvbnN0IGNoYXIqICZuYW1lLCBjaGFyICpidWYsIF9Mb2NhbGVfbmFtZV9oaW50KiBoaW50LAorICAgICAgICAgICAgICAgICAgIGxvY19leHRyYWN0X25hbWVfZnVuY190IGV4dHJhY3RfbmFtZSwKKyAgICAgICAgICAgICAgICAgICBsb2NfY3JlYXRlX2Z1bmNfdCBjcmVhdGVfb2JqLCBsb2NfZGVmYXVsdF9uYW1lX2Z1bmNfdCBkZWZhdWx0X25hbWUsCisgICAgICAgICAgICAgICAgICAgQ2F0ZWdvcnlfTWFwICoqIE0sIGludCAqX19lcnJfY29kZSkgeworI2lmICFkZWZpbmVkIChfX0JPUkxBTkRDX18pIHx8IChfX0JPUkxBTkRDX18gPj0gMHg1NjQpCisgIHR5cGVkZWYgQ2F0ZWdvcnlfTWFwOjppdGVyYXRvciBDYXRlZ29yeV9pdGVyYXRvcjsKKyAgcGFpcjxDYXRlZ29yeV9pdGVyYXRvciwgYm9vbD4gcmVzdWx0OworI2Vsc2UKKyMgIGlmICFkZWZpbmVkKF9TVExQX0RFQlVHKQorICBwYWlyPF9IdF9pdGVyYXRvcjxfU2xpc3RfaXRlcmF0b3I8cGFpcjxjb25zdCBzdHJpbmcscGFpcjx2b2lkICosdW5zaWduZWQgaW50PiA+LF9Ob25jb25zdF90cmFpdHM8cGFpcjxjb25zdCBzdHJpbmcscGFpcjx2b2lkICosdW5zaWduZWQgaW50PiA+ID4gPixfTm9uTG9jYWxIYXNoTWFwVHJhaXRzVDxwYWlyPGNvbnN0IHN0cmluZyxwYWlyPHZvaWQgKix1bnNpZ25lZCBpbnQ+ID4gPiA+LCBib29sPiByZXN1bHQ7CisjICBlbHNlCisgIHBhaXI8X0RCR19pdGVyPF9Ob25EYmdfaGFzaHRhYmxlPHBhaXI8Y29uc3Qgc3RyaW5nLHBhaXI8dm9pZCAqLHVuc2lnbmVkIGludD4gPixzdHJpbmcsaGFzaDxzdHJpbmc+LF9IYXNoTWFwVHJhaXRzVDxwYWlyPGNvbnN0IHN0cmluZyxwYWlyPHZvaWQgKix1bnNpZ25lZCBpbnQ+ID4gPixfU2VsZWN0MXN0PHBhaXI8Y29uc3Qgc3RyaW5nLHBhaXI8dm9pZCAqLHVuc2lnbmVkIGludD4gPiA+LF9EYmdFcXVhbDxzdHJpbmcsZXF1YWxfdG88c3RyaW5nPiA+LGFsbG9jYXRvcjxwYWlyPGNvbnN0IHN0cmluZyxwYWlyPHZvaWQgKix1bnNpZ25lZCBpbnQ+ID4gPiA+LF9EYmdUcmFpdHM8X05vbkxvY2FsSGFzaE1hcFRyYWl0c1Q8cGFpcjxjb25zdCBzdHJpbmcscGFpcjx2b2lkICosdW5zaWduZWQgaW50PiA+ID4gPiA+LCBib29sPiByZXN1bHQ7CisjICBlbmRpZgorI2VuZGlmCisKKyAgKl9fZXJyX2NvZGUgPSBfU1RMUF9MT0NfVU5ERUZJTkVEOworCisgIC8vIEZpbmQgd2hhdCBuYW1lIHRvIGxvb2sgZm9yLiBCZSBjYXJlZnVsIGlmIHVzZXIgcmVxdWVzdHMgdGhlIGRlZmF1bHQuCisgIGlmIChuYW1lWzBdID09IDApIHsKKyAgICBuYW1lID0gZGVmYXVsdF9uYW1lKGJ1Zik7CisgICAgaWYgKG5hbWUgPT0gMCB8fCBuYW1lWzBdID09IDApCisgICAgICBuYW1lID0gIkMiOworICB9CisgIGVsc2UgeworICAgIGNvbnN0IGNoYXIqIGNuYW1lID0gZXh0cmFjdF9uYW1lKG5hbWUsIGJ1ZiwgaGludCwgX19lcnJfY29kZSk7CisgICAgaWYgKGNuYW1lID09IDApIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBuYW1lID0gY25hbWU7CisgIH0KKworICBDYXRlZ29yeV9NYXA6OnZhbHVlX3R5cGUgX19lKG5hbWUsIHBhaXI8dm9pZCosc2l6ZV90Pigodm9pZCopMCxzaXplX3QoMCkpKTsKKworICBfU1RMUF9hdXRvX2xvY2sgc2VudHJ5KGNhdGVnb3J5X2hhc2hfbXV0ZXgoKSk7CisKKyAgaWYgKCEqTSkKKyAgICAqTSA9IG5ldyBDYXRlZ29yeV9NYXAoKTsKKworICAvLyBMb29rIGZvciBhbiBleGlzdGluZyBlbnRyeSB3aXRoIHRoYXQgbmFtZS4KKyAgcmVzdWx0ID0gKCpNKS0+aW5zZXJ0X25vcmVzaXplKF9fZSk7CisKKyAgaWYgKHJlc3VsdC5zZWNvbmQpIHsKKyAgICAvLyBUaGVyZSB3YXMgbm8gZW50cnkgaW4gdGhlIG1hcCBhbHJlYWR5LiAgQ3JlYXRlIHRoZSBjYXRlZ29yeS4KKyAgICAoKnJlc3VsdC5maXJzdCkuc2Vjb25kLmZpcnN0ID0gY3JlYXRlX29iaihuYW1lLCBoaW50LCBfX2Vycl9jb2RlKTsKKyAgICBpZiAoISgqcmVzdWx0LmZpcnN0KS5zZWNvbmQuZmlyc3QpIHsKKyAgICAgICgqTSktPmVyYXNlKHJlc3VsdC5maXJzdCk7CisjaWYgZGVmaW5lZCAoX1NUTFBfTEVBS1NfUEVEQU5USUMpCisgICAgICBpZiAoKCpNKS0+ZW1wdHkoKSkgeworICAgICAgICBkZWxldGUgKk07CisgICAgICAgICpNID0gMDsKKyAgICAgIH0KKyNlbmRpZgorICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisKKyAgLy8gSW5jcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQuCisgICsrKCgqcmVzdWx0LmZpcnN0KS5zZWNvbmQuc2Vjb25kKTsKKworICByZXR1cm4gKCpyZXN1bHQuZmlyc3QpLnNlY29uZC5maXJzdDsKK30KKworc3RhdGljIHZvaWQKK19fcmVsZWFzZV9jYXRlZ29yeSh2b2lkKiBjYXQsCisgICAgICAgICAgICAgICAgICAgbG9jX2Rlc3Ryb3lfZnVuY190IGRlc3Ryb3lfZnVuLAorICAgICAgICAgICAgICAgICAgIGxvY19uYW1lX2Z1bmNfdCBnZXRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICBDYXRlZ29yeV9NYXAqKiBNKSB7CisgIENhdGVnb3J5X01hcCAqcE0gPSAqTTsKKworICBpZiAoY2F0ICYmIHBNKSB7CisgICAgLy8gRmluZCB0aGUgbmFtZSBvZiB0aGUgY2F0ZWdvcnkgb2JqZWN0LgorICAgIGNoYXIgYnVmW19Mb2NhbGVfTUFYX1NJTVBMRV9OQU1FICsgMV07CisgICAgY2hhciBjb25zdCogbmFtZSA9IGdldF9uYW1lKGNhdCwgYnVmKTsKKworICAgIGlmIChuYW1lICE9IDApIHsKKyAgICAgIF9TVExQX2F1dG9fbG9jayBzZW50cnkoY2F0ZWdvcnlfaGFzaF9tdXRleCgpKTsKKyAgICAgIENhdGVnb3J5X01hcDo6aXRlcmF0b3IgaXQgPSBwTS0+ZmluZChuYW1lKTsKKyAgICAgIGlmIChpdCAhPSBwTS0+ZW5kKCkpIHsKKyAgICAgICAgLy8gRGVjcmVtZW50IHRoZSByZWYgY291bnQuICBJZiBpdCBnb2VzIHRvIHplcm8sIGRlbGV0ZSB0aGlzIGNhdGVnb3J5CisgICAgICAgIC8vIGZyb20gdGhlIG1hcC4KKyAgICAgICAgaWYgKC0tKCgqaXQpLnNlY29uZC5zZWNvbmQpID09IDApIHsKKyAgICAgICAgICB2b2lkKiBjYXQxID0gKCppdCkuc2Vjb25kLmZpcnN0OworICAgICAgICAgIGRlc3Ryb3lfZnVuKGNhdDEpOworICAgICAgICAgIHBNLT5lcmFzZShpdCk7CisjaWYgZGVmaW5lZCAoX1NUTFBfTEVBS1NfUEVEQU5USUMpCisgICAgICAgICAgaWYgKHBNLT5lbXB0eSgpKSB7CisgICAgICAgICAgICBkZWxldGUgcE07CisgICAgICAgICAgICAqTSA9IDA7CisgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworX0xvY2FsZV9jdHlwZSogX1NUTFBfQ0FMTCBfX2FjcXVpcmVfY3R5cGUoY29uc3QgY2hhciogJm5hbWUsIGNoYXIgKmJ1ZiwgX0xvY2FsZV9uYW1lX2hpbnQqIGhpbnQsIGludCAqX19lcnJfY29kZSkgeworICByZXR1cm4gX19SRUlOVEVSUFJFVF9DQVNUKF9Mb2NhbGVfY3R5cGUqLCBfX2FjcXVpcmVfY2F0ZWdvcnkobmFtZSwgYnVmLCBoaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0xvY2FsZV9leHRyYWN0X2N0eXBlX25hbWUsIF9Mb2NfY3R5cGVfY3JlYXRlLCBfTG9jX2N0eXBlX2RlZmF1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHlwZV9oYXNoKCksIF9fZXJyX2NvZGUpKTsKK30KK19Mb2NhbGVfY29kZWN2dCogX1NUTFBfQ0FMTCBfX2FjcXVpcmVfY29kZWN2dChjb25zdCBjaGFyKiAmbmFtZSwgY2hhciAqYnVmLCBfTG9jYWxlX25hbWVfaGludCogaGludCwgaW50ICpfX2Vycl9jb2RlKSB7CisgIHJldHVybiBfX1JFSU5URVJQUkVUX0NBU1QoX0xvY2FsZV9jb2RlY3Z0KiwgX19hY3F1aXJlX2NhdGVnb3J5KG5hbWUsIGJ1ZiwgaGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0xvY2FsZV9leHRyYWN0X2N0eXBlX25hbWUsIF9Mb2NfY29kZWN2dF9jcmVhdGUsIF9Mb2NfY3R5cGVfZGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWN2dF9oYXNoKCksIF9fZXJyX2NvZGUpKTsKK30KK19Mb2NhbGVfbnVtZXJpYyogX1NUTFBfQ0FMTCBfX2FjcXVpcmVfbnVtZXJpYyhjb25zdCBjaGFyKiAmbmFtZSwgY2hhciAqYnVmLCBfTG9jYWxlX25hbWVfaGludCogaGludCwgaW50ICpfX2Vycl9jb2RlKSB7CisgIHJldHVybiBfX1JFSU5URVJQUkVUX0NBU1QoX0xvY2FsZV9udW1lcmljKiwgX19hY3F1aXJlX2NhdGVnb3J5KG5hbWUsIGJ1ZiwgaGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0xvY2FsZV9leHRyYWN0X251bWVyaWNfbmFtZSwgX0xvY19udW1lcmljX2NyZWF0ZSwgX0xvY19udW1lcmljX2RlZmF1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWVyaWNfaGFzaCgpLCBfX2Vycl9jb2RlKSk7Cit9CitfTG9jYWxlX3RpbWUqIF9TVExQX0NBTEwgX19hY3F1aXJlX3RpbWUoY29uc3QgY2hhciogJm5hbWUsIGNoYXIgKmJ1ZiwgX0xvY2FsZV9uYW1lX2hpbnQqIGhpbnQsIGludCAqX19lcnJfY29kZSkgeworICByZXR1cm4gX19SRUlOVEVSUFJFVF9DQVNUKF9Mb2NhbGVfdGltZSosIF9fYWNxdWlyZV9jYXRlZ29yeShuYW1lLCBidWYsIGhpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Mb2NhbGVfZXh0cmFjdF90aW1lX25hbWUsIF9Mb2NfdGltZV9jcmVhdGUsIF9Mb2NfdGltZV9kZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lX2hhc2goKSwgX19lcnJfY29kZSkpOworfQorX0xvY2FsZV9jb2xsYXRlKiBfU1RMUF9DQUxMIF9fYWNxdWlyZV9jb2xsYXRlKGNvbnN0IGNoYXIqICZuYW1lLCBjaGFyICpidWYsIF9Mb2NhbGVfbmFtZV9oaW50KiBoaW50LCBpbnQgKl9fZXJyX2NvZGUpIHsKKyAgcmV0dXJuIF9fUkVJTlRFUlBSRVRfQ0FTVChfTG9jYWxlX2NvbGxhdGUqLCBfX2FjcXVpcmVfY2F0ZWdvcnkobmFtZSwgYnVmLCBoaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTG9jYWxlX2V4dHJhY3RfY29sbGF0ZV9uYW1lLCBfTG9jX2NvbGxhdGVfY3JlYXRlLCBfTG9jX2NvbGxhdGVfZGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGF0ZV9oYXNoKCksIF9fZXJyX2NvZGUpKTsKK30KK19Mb2NhbGVfbW9uZXRhcnkqIF9TVExQX0NBTEwgX19hY3F1aXJlX21vbmV0YXJ5KGNvbnN0IGNoYXIqICZuYW1lLCBjaGFyICpidWYsIF9Mb2NhbGVfbmFtZV9oaW50KiBoaW50LCBpbnQgKl9fZXJyX2NvZGUpIHsKKyAgcmV0dXJuIF9fUkVJTlRFUlBSRVRfQ0FTVChfTG9jYWxlX21vbmV0YXJ5KiwgX19hY3F1aXJlX2NhdGVnb3J5KG5hbWUsIGJ1ZiwgaGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Mb2NhbGVfZXh0cmFjdF9tb25ldGFyeV9uYW1lLCBfTG9jX21vbmV0YXJ5X2NyZWF0ZSwgX0xvY19tb25ldGFyeV9kZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9uZXRhcnlfaGFzaCgpLCBfX2Vycl9jb2RlKSk7Cit9CitfTG9jYWxlX21lc3NhZ2VzKiBfU1RMUF9DQUxMIF9fYWNxdWlyZV9tZXNzYWdlcyhjb25zdCBjaGFyKiAmbmFtZSwgY2hhciAqYnVmLCBfTG9jYWxlX25hbWVfaGludCogaGludCwgaW50ICpfX2Vycl9jb2RlKSB7CisgIHJldHVybiBfX1JFSU5URVJQUkVUX0NBU1QoX0xvY2FsZV9tZXNzYWdlcyosIF9fYWNxdWlyZV9jYXRlZ29yeShuYW1lLCBidWYsIGhpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTG9jYWxlX2V4dHJhY3RfbWVzc2FnZXNfbmFtZSwgX0xvY19tZXNzYWdlc19jcmVhdGUsIF9Mb2NfbWVzc2FnZXNfZGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzX2hhc2goKSwgX19lcnJfY29kZSkpOworfQorCit2b2lkIF9TVExQX0NBTEwgX19yZWxlYXNlX2N0eXBlKF9Mb2NhbGVfY3R5cGUqIGNhdCkKK3sgX19yZWxlYXNlX2NhdGVnb3J5KGNhdCwgX0xvY19jdHlwZV9kZXN0cm95LCBfTG9jX2N0eXBlX25hbWUsIGN0eXBlX2hhc2goKSk7IH0KK3ZvaWQgX1NUTFBfQ0FMTCBfX3JlbGVhc2VfY29kZWN2dChfTG9jYWxlX2NvZGVjdnQqIGNhdCkKK3sgX19yZWxlYXNlX2NhdGVnb3J5KGNhdCwgX0xvY19jb2RlY3Z0X2Rlc3Ryb3ksIF9Mb2NfY29kZWN2dF9uYW1lLCBjb2RlY3Z0X2hhc2goKSk7IH0KK3ZvaWQgX1NUTFBfQ0FMTCBfX3JlbGVhc2VfbnVtZXJpYyhfTG9jYWxlX251bWVyaWMqIGNhdCkKK3sgX19yZWxlYXNlX2NhdGVnb3J5KGNhdCwgX0xvY19udW1lcmljX2Rlc3Ryb3ksIF9Mb2NfbnVtZXJpY19uYW1lLCBudW1lcmljX2hhc2goKSk7IH0KK3ZvaWQgX1NUTFBfQ0FMTCBfX3JlbGVhc2VfdGltZShfTG9jYWxlX3RpbWUqIGNhdCkKK3sgX19yZWxlYXNlX2NhdGVnb3J5KGNhdCwgX0xvY190aW1lX2Rlc3Ryb3ksIF9Mb2NfdGltZV9uYW1lLCB0aW1lX2hhc2goKSk7IH0KK3ZvaWQgX1NUTFBfQ0FMTCBfX3JlbGVhc2VfY29sbGF0ZShfTG9jYWxlX2NvbGxhdGUqIGNhdCkKK3sgX19yZWxlYXNlX2NhdGVnb3J5KGNhdCwgX0xvY19jb2xsYXRlX2Rlc3Ryb3ksIF9Mb2NfY29sbGF0ZV9uYW1lLCBjb2xsYXRlX2hhc2goKSk7IH0KK3ZvaWQgX1NUTFBfQ0FMTCBfX3JlbGVhc2VfbW9uZXRhcnkoX0xvY2FsZV9tb25ldGFyeSogY2F0KQoreyBfX3JlbGVhc2VfY2F0ZWdvcnkoY2F0LCBfTG9jX21vbmV0YXJ5X2Rlc3Ryb3ksIF9Mb2NfbW9uZXRhcnlfbmFtZSwgbW9uZXRhcnlfaGFzaCgpKTsgfQordm9pZCBfU1RMUF9DQUxMIF9fcmVsZWFzZV9tZXNzYWdlcyhfTG9jYWxlX21lc3NhZ2VzKiBjYXQpCit7IF9fcmVsZWFzZV9jYXRlZ29yeShjYXQsIF9Mb2NfbWVzc2FnZXNfZGVzdHJveSwgX0xvY19tZXNzYWdlc19uYW1lLCBtZXNzYWdlc19oYXNoKCkpOyB9CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorX1NUTFBfRU5EX05BTUVTUEFDRQpkaWZmIC0tZ2l0IGEvc3JjL2xvY2FsZV9pbXBsLmNwcCBiL3NyYy9sb2NhbGVfaW1wbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAzYjYwMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9sb2NhbGVfaW1wbC5jcHAKQEAgLTAsMCArMSw3NjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisjaW5jbHVkZSAic3RscG9ydF9wcmVmaXguaCIKKworI2luY2x1ZGUgPGxvY2FsZT4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dHlwZWluZm8+CisKKyNpbmNsdWRlICJjX2xvY2FsZS5oIgorI2luY2x1ZGUgImFsaWduZWRfYnVmZmVyLmgiCisjaW5jbHVkZSAiYWNxdWlyZV9yZWxlYXNlLmgiCisjaW5jbHVkZSAibG9jYWxlX2ltcGwuaCIKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKK3N0YXRpYyBjb25zdCBzdHJpbmcgX05hbWVsZXNzKCIqIik7CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc19DX2xvY2FsZV9uYW1lIChjb25zdCBjaGFyKiBuYW1lKQoreyByZXR1cm4gKChuYW1lWzBdID09ICdDJykgJiYgKG5hbWVbMV0gPT0gMCkpOyB9CisKK2xvY2FsZTo6ZmFjZXQgKiBfU1RMUF9DQUxMIF9nZXRfZmFjZXQobG9jYWxlOjpmYWNldCAqZikKK3sKKyAgaWYgKGYgIT0gMCkKKyAgICBmLT5fTV9pbmNyKCk7CisgIHJldHVybiBmOworfQorCit2b2lkIF9TVExQX0NBTEwgX3JlbGVhc2VfZmFjZXQobG9jYWxlOjpmYWNldCAqJmYpCit7CisgIGlmICgoZiAhPSAwKSAmJiAoZi0+X01fZGVjcigpID09IDApKSB7CisgICAgZGVsZXRlIGY7CisgICAgZiA9IDA7CisgIH0KK30KKworc2l6ZV90IGxvY2FsZTo6aWQ6Ol9TX21heCA9IDI3OworCitzdGF0aWMgdm9pZCBfU3RsX2xvY19hc3NpZ25faWRzKCk7CisKK3N0YXRpYyBfU3RsX2FsaWduZWRfYnVmZmVyPF9Mb2NhbGVfaW1wbDo6SW5pdD4gX19Mb2NfaW5pdF9idWY7CisKK19Mb2NhbGVfaW1wbDo6SW5pdDo6SW5pdCgpIHsKKyAgaWYgKF9NX2NvdW50KCkuX01faW5jcigpID09IDEpIHsKKyAgICBfTG9jYWxlX2ltcGw6Ol9TX2luaXRpYWxpemUoKTsKKyAgfQorfQorCitfTG9jYWxlX2ltcGw6OkluaXQ6On5Jbml0KCkgeworICBpZiAoX01fY291bnQoKS5fTV9kZWNyKCkgPT0gMCkgeworICAgIF9Mb2NhbGVfaW1wbDo6X1NfdW5pbml0aWFsaXplKCk7CisgIH0KK30KKworX1JlZmNvdW50X0Jhc2UmIF9Mb2NhbGVfaW1wbDo6SW5pdDo6X01fY291bnQoKSBjb25zdCB7CisgIHN0YXRpYyBfUmVmY291bnRfQmFzZSBfU19jb3VudCgwKTsKKyAgcmV0dXJuIF9TX2NvdW50OworfQorCitfTG9jYWxlX2ltcGw6Ol9Mb2NhbGVfaW1wbChjb25zdCBjaGFyKiBzKQorICA6IF9SZWZjb3VudF9CYXNlKDApLCBuYW1lKHMpLCBmYWNldHNfdmVjKCkgeworICBmYWNldHNfdmVjLnJlc2VydmUoIGxvY2FsZTo6aWQ6Ol9TX21heCApOworICBuZXcgKCZfX0xvY19pbml0X2J1ZikgSW5pdCgpOworfQorCitfTG9jYWxlX2ltcGw6Ol9Mb2NhbGVfaW1wbCggX0xvY2FsZV9pbXBsIGNvbnN0JiBsb2NpbXBsICkKKyAgOiBfUmVmY291bnRfQmFzZSgwKSwgbmFtZShsb2NpbXBsLm5hbWUpLCBmYWNldHNfdmVjKCkgeworICBmb3JfZWFjaCggbG9jaW1wbC5mYWNldHNfdmVjLmJlZ2luKCksIGxvY2ltcGwuZmFjZXRzX3ZlYy5lbmQoKSwgX2dldF9mYWNldCk7CisgIGZhY2V0c192ZWMgPSBsb2NpbXBsLmZhY2V0c192ZWM7CisgIG5ldyAoJl9fTG9jX2luaXRfYnVmKSBJbml0KCk7Cit9CisKK19Mb2NhbGVfaW1wbDo6X0xvY2FsZV9pbXBsKCBzaXplX3QgbiwgY29uc3QgY2hhciogcykKKyAgOiBfUmVmY291bnRfQmFzZSgwKSwgbmFtZShzKSwgZmFjZXRzX3ZlYyhuLCAwKSB7CisgIG5ldyAoJl9fTG9jX2luaXRfYnVmKSBJbml0KCk7Cit9CisKK19Mb2NhbGVfaW1wbDo6fl9Mb2NhbGVfaW1wbCgpIHsKKyAgKCZfX0xvY19pbml0X2J1ZiktPn5Jbml0KCk7CisgIGZvcl9lYWNoKCBmYWNldHNfdmVjLmJlZ2luKCksIGZhY2V0c192ZWMuZW5kKCksIF9yZWxlYXNlX2ZhY2V0KTsKK30KKworLy8gSW5pdGlhbGl6YXRpb24gb2YgdGhlIGxvY2FsZSBzeXN0ZW0uICBUaGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZQorLy8gYW55IGxvY2FsZXMgYXJlIGNvbnN0cnVjdGVkLiAgKE1lYW5pbmcgdGhhdCBpdCBtdXN0IGJlIGNhbGxlZCB3aGVuCisvLyB0aGUgSS9PIGxpYnJhcnkgaXRzZWxmIGlzIGluaXRpYWxpemVkLikKK3ZvaWQgX1NUTFBfQ0FMTCBfTG9jYWxlX2ltcGw6Ol9TX2luaXRpYWxpemUoKSB7CisgIF9TdGxfbG9jX2Fzc2lnbl9pZHMoKTsKKyAgbWFrZV9jbGFzc2ljX2xvY2FsZSgpOworfQorCisvLyBSZWxlYXNlIG9mIHRoZSBjbGFzc2ljIGxvY2FsZSByZXNzb3VyY2VzLiBIYXMgdG8gYmUgY2FsbGVkIGFmdGVyIHRoZSBsYXN0CisvLyBsb2NhbGUgZGVzdHJ1Y3Rpb24gYW5kIG5vdCBvbmx5IGFmdGVyIHRoZSBjbGFzc2ljIGxvY2FsZSBkZXN0cnVjdGlvbiBhcworLy8gdGhlIGZhY2V0cyBjYW4gYmUgc2hhcmVkIGJldHdlZW4gZGlmZmVyZW50IGZhY2V0cy4KK3ZvaWQgX1NUTFBfQ0FMTCBfTG9jYWxlX2ltcGw6Ol9TX3VuaW5pdGlhbGl6ZSgpIHsKKyAgLy9Ob3QgbmVjZXNzYXJ5IGFueW1vcmUgYXMgY2xhc3NpYyBmYWNldHMgYXJlIG5vdyAnbm9ybWFsJyBkeW5hbWljYWxseSBhbGxvY2F0ZWQKKyAgLy9mYWNldHMgd2l0aCBhIHJlZmVyZW5jZSBjb3VudGVyIHRlbGxpbmcgdG8gX3JlbGVhc2VfZmFjZXQgd2hlbiB0aGUgZmFjZXQgY2FuIGJlCisgIC8vZGVsZXRlZC4KKyAgLy9mcmVlX2NsYXNzaWNfbG9jYWxlKCk7Cit9CisKKy8vIF9Mb2NhbGVfaW1wbCBub24taW5saW5lIG1lbWJlciBmdW5jdGlvbnMuCit2b2lkIF9TVExQX0NBTEwgX0xvY2FsZV9pbXBsOjpfTV90aHJvd19iYWRfY2FzdCgpIHsKKyAgX1NUTFBfVEhST1coYmFkX2Nhc3QoKSk7Cit9CisKK3ZvaWQgX0xvY2FsZV9pbXBsOjppbnNlcnQoX0xvY2FsZV9pbXBsICpmcm9tLCBjb25zdCBsb2NhbGU6OmlkJiBuKSB7CisgIGlmIChuLl9NX2luZGV4ID4gMCAmJiBuLl9NX2luZGV4IDwgZnJvbS0+c2l6ZSgpKSB7CisgICAgdGhpcy0+aW5zZXJ0KGZyb20tPmZhY2V0c192ZWNbbi5fTV9pbmRleF0sIG4pOworICB9Cit9CisKK2xvY2FsZTo6ZmFjZXQqIF9Mb2NhbGVfaW1wbDo6aW5zZXJ0KGxvY2FsZTo6ZmFjZXQgKmYsIGNvbnN0IGxvY2FsZTo6aWQmIG4pIHsKKyAgaWYgKGYgPT0gMCB8fCBuLl9NX2luZGV4ID09IDApCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKG4uX01faW5kZXggPj0gZmFjZXRzX3ZlYy5zaXplKCkpIHsKKyAgICBmYWNldHNfdmVjLnJlc2l6ZShuLl9NX2luZGV4ICsgMSk7CisgIH0KKworICBpZiAoZiAhPSBmYWNldHNfdmVjW24uX01faW5kZXhdKQorICB7CisgICAgX3JlbGVhc2VfZmFjZXQoZmFjZXRzX3ZlY1tuLl9NX2luZGV4XSk7CisgICAgZmFjZXRzX3ZlY1tuLl9NX2luZGV4XSA9IF9nZXRfZmFjZXQoZik7CisgIH0KKworICByZXR1cm4gZjsKK30KKworLy8KKy8vIDxsb2NhbGU+IGNvbnRlbnQgd2hpY2ggaXMgZGVwZW5kZW50IG9uIHRoZSBuYW1lCisvLworCisvKiBTaXggZnVuY3Rpb25zLCBvbmUgZm9yIGVhY2ggY2F0ZWdvcnkuICBFYWNoIG9mIHRoZW0gdGFrZXMgYQorICogYSBuYW1lLCBjb25zdHJ1Y3RzIHRoYXQgYXBwcm9wcmlhdGUgY2F0ZWdvcnkgZmFjZXRzIGJ5IG5hbWUsCisgKiBhbmQgaW5zZXJ0cyB0aGVtIGludG8gdGhlIGxvY2FsZS4gKi8KK19Mb2NhbGVfbmFtZV9oaW50KiBfTG9jYWxlX2ltcGw6Omluc2VydF9jdHlwZV9mYWNldHMoY29uc3QgY2hhciogJm5hbWUsIGNoYXIgKmJ1ZiwgX0xvY2FsZV9uYW1lX2hpbnQqIGhpbnQpIHsKKyAgaWYgKG5hbWVbMF0gPT0gMCkKKyAgICBuYW1lID0gX0xvY2FsZV9jdHlwZV9kZWZhdWx0KGJ1Zik7CisKKyAgaWYgKG5hbWUgPT0gMCB8fCBuYW1lWzBdID09IDAgfHwgaXNfQ19sb2NhbGVfbmFtZShuYW1lKSkgeworICAgIF9Mb2NhbGVfaW1wbCogaTIgPSBsb2NhbGU6OmNsYXNzaWMoKS5fTV9pbXBsOworICAgIHRoaXMtPmluc2VydChpMiwgY3R5cGU8Y2hhcj46OmlkKTsKKyAgICB0aGlzLT5pbnNlcnQoaTIsIGNvZGVjdnQ8Y2hhciwgY2hhciwgbWJzdGF0ZV90Pjo6aWQpOworI2lmbmRlZiBfU1RMUF9OT19XQ0hBUl9UCisgICAgdGhpcy0+aW5zZXJ0KGkyLCBjdHlwZTx3Y2hhcl90Pjo6aWQpOworICAgIHRoaXMtPmluc2VydChpMiwgY29kZWN2dDx3Y2hhcl90LCBjaGFyLCBtYnN0YXRlX3Q+OjppZCk7CisjZW5kaWYKKyAgfSBlbHNlIHsKKyAgICBsb2NhbGU6OmZhY2V0KiAgICBjdCAgPSAwOworICAgIGxvY2FsZTo6ZmFjZXQqICAgIGN2dCA9IDA7CisjaWZuZGVmIF9TVExQX05PX1dDSEFSX1QKKyAgICBsb2NhbGU6OmZhY2V0KiB3Y3QgICAgPSAwOworICAgIGxvY2FsZTo6ZmFjZXQqIHdjdnQgICA9IDA7CisjZW5kaWYKKyAgICBpbnQgX19lcnJfY29kZTsKKyAgICBfTG9jYWxlX2N0eXBlICpfX2xjdCA9IF9TVExQX1BSSVYgX19hY3F1aXJlX2N0eXBlKG5hbWUsIGJ1ZiwgaGludCwgJl9fZXJyX2NvZGUpOworICAgIGlmICghX19sY3QpIHsKKyAgICAgIGxvY2FsZTo6X01fdGhyb3dfb25fY3JlYXRpb25fZmFpbHVyZShfX2Vycl9jb2RlLCBuYW1lLCAiY3R5cGUiKTsKKyAgICAgIHJldHVybiBoaW50OworICAgIH0KKworICAgIGlmIChoaW50ID09IDApIGhpbnQgPSBfTG9jYWxlX2dldF9jdHlwZV9oaW50KF9fbGN0KTsKKworICAgIF9TVExQX1RSWSB7CisgICAgICBjdCAgID0gbmV3IGN0eXBlX2J5bmFtZTxjaGFyPihfX2xjdCk7CisgICAgfQorICAgIF9TVExQX1VOV0lORChfU1RMUF9QUklWIF9fcmVsZWFzZV9jdHlwZShfX2xjdCkpOworCisgICAgX1NUTFBfVFJZIHsKKyAgICAgIGN2dCAgPSBuZXcgY29kZWN2dF9ieW5hbWU8Y2hhciwgY2hhciwgbWJzdGF0ZV90PihuYW1lKTsKKyAgICB9CisgICAgX1NUTFBfVU5XSU5EKGRlbGV0ZSBjdCk7CisKKyNpZm5kZWYgX1NUTFBfTk9fV0NIQVJfVAorICAgIF9TVExQX1RSWSB7CisgICAgICBfTG9jYWxlX2N0eXBlICpfX2x3Y3QgPSBfU1RMUF9QUklWIF9fYWNxdWlyZV9jdHlwZShuYW1lLCBidWYsIGhpbnQsICZfX2Vycl9jb2RlKTsKKyAgICAgIGlmICghX19sd2N0KSB7CisgICAgICAgIGxvY2FsZTo6X01fdGhyb3dfb25fY3JlYXRpb25fZmFpbHVyZShfX2Vycl9jb2RlLCBuYW1lLCAiY3R5cGUiKTsKKyAgICAgICAgcmV0dXJuIGhpbnQ7CisgICAgICB9CisKKyAgICAgIF9TVExQX1RSWSB7CisgICAgICAgIHdjdCAgPSBuZXcgY3R5cGVfYnluYW1lPHdjaGFyX3Q+KF9fbHdjdCk7CisgICAgICB9CisgICAgICBfU1RMUF9VTldJTkQoX1NUTFBfUFJJViBfX3JlbGVhc2VfY3R5cGUoX19sd2N0KSk7CisgICAgICAKKyAgICAgIF9Mb2NhbGVfY29kZWN2dCAqX19sd2N2dCA9IF9TVExQX1BSSVYgX19hY3F1aXJlX2NvZGVjdnQobmFtZSwgYnVmLCBoaW50LCAmX19lcnJfY29kZSk7CisgICAgICBpZiAoX19sd2N2dCkgeworICAgICAgICBfU1RMUF9UUlkgeworICAgICAgICAgIHdjdnQgPSBuZXcgY29kZWN2dF9ieW5hbWU8d2NoYXJfdCwgY2hhciwgbWJzdGF0ZV90PihfX2x3Y3Z0KTsKKyAgICAgICAgfQorICAgICAgICBfU1RMUF9VTldJTkQoX1NUTFBfUFJJViBfX3JlbGVhc2VfY29kZWN2dChfX2x3Y3Z0KTsgZGVsZXRlIHdjdCk7CisgICAgICB9CisgICAgfQorICAgIF9TVExQX1VOV0lORChkZWxldGUgY3Z0OyBkZWxldGUgY3QpOworI2VuZGlmCisKKyAgICB0aGlzLT5pbnNlcnQoY3QsIGN0eXBlPGNoYXI+OjppZCk7CisgICAgdGhpcy0+aW5zZXJ0KGN2dCwgY29kZWN2dDxjaGFyLCBjaGFyLCBtYnN0YXRlX3Q+OjppZCk7CisjaWZuZGVmIF9TVExQX05PX1dDSEFSX1QKKyAgICB0aGlzLT5pbnNlcnQod2N0LCBjdHlwZTx3Y2hhcl90Pjo6aWQpOworICAgIGlmICh3Y3Z0KSB0aGlzLT5pbnNlcnQod2N2dCwgY29kZWN2dDx3Y2hhcl90LCBjaGFyLCBtYnN0YXRlX3Q+OjppZCk7CisjZW5kaWYKKyAgfQorICByZXR1cm4gaGludDsKK30KKworX0xvY2FsZV9uYW1lX2hpbnQqIF9Mb2NhbGVfaW1wbDo6aW5zZXJ0X251bWVyaWNfZmFjZXRzKGNvbnN0IGNoYXIqICZuYW1lLCBjaGFyICpidWYsIF9Mb2NhbGVfbmFtZV9oaW50KiBoaW50KSB7CisgIGlmIChuYW1lWzBdID09IDApCisgICAgbmFtZSA9IF9Mb2NhbGVfbnVtZXJpY19kZWZhdWx0KGJ1Zik7CisKKyAgX0xvY2FsZV9pbXBsKiBpMiA9IGxvY2FsZTo6Y2xhc3NpYygpLl9NX2ltcGw7CisKKyAgLy8gV2UgZmlyc3QgaW5zZXJ0IG5hbWUgaW5kZXBlbmRhbnQgZmFjZXRzIHRha2VuIGZyb20gdGhlIGNsYXNzaWMgbG9jYWxlIGluc3RhbmNlOgorICB0aGlzLT5pbnNlcnQoaTIsCisgICAgICAgICAgICAgICBudW1fcHV0PGNoYXIsIG9zdHJlYW1idWZfaXRlcmF0b3I8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiAgPjo6aWQpOworICB0aGlzLT5pbnNlcnQoaTIsCisgICAgICAgICAgICAgICBudW1fZ2V0PGNoYXIsIGlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiA+OjppZCk7CisjaWZuZGVmIF9TVExQX05PX1dDSEFSX1QKKyAgdGhpcy0+aW5zZXJ0KGkyLAorICAgICAgICAgICAgICAgbnVtX2dldDx3Y2hhcl90LCBpc3RyZWFtYnVmX2l0ZXJhdG9yPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4gID46OmlkKTsKKyAgdGhpcy0+aW5zZXJ0KGkyLAorICAgICAgICAgICAgICAgbnVtX3B1dDx3Y2hhcl90LCBvc3RyZWFtYnVmX2l0ZXJhdG9yPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4gPjo6aWQpOworI2VuZGlmCisKKyAgaWYgKG5hbWUgPT0gMCB8fCBuYW1lWzBdID09IDAgfHwgaXNfQ19sb2NhbGVfbmFtZShuYW1lKSkgeworICAgIHRoaXMtPmluc2VydChpMiwgbnVtcHVuY3Q8Y2hhcj46OmlkKTsKKyNpZm5kZWYgX1NUTFBfTk9fV0NIQVJfVAorICAgIHRoaXMtPmluc2VydChpMiwgbnVtcHVuY3Q8d2NoYXJfdD46OmlkKTsKKyNlbmRpZgorICB9CisgIGVsc2UgeworICAgIGxvY2FsZTo6ZmFjZXQqIHB1bmN0ICA9IDA7CisjaWZuZGVmIF9TVExQX05PX1dDSEFSX1QKKyAgICBsb2NhbGU6OmZhY2V0KiB3cHVuY3QgPSAwOworI2VuZGlmCisKKyAgICBpbnQgX19lcnJfY29kZTsKKyAgICBfTG9jYWxlX251bWVyaWMgKl9fbHB1bmN0ID0gX1NUTFBfUFJJViBfX2FjcXVpcmVfbnVtZXJpYyhuYW1lLCBidWYsIGhpbnQsICZfX2Vycl9jb2RlKTsKKyAgICBpZiAoIV9fbHB1bmN0KSB7CisgICAgICBsb2NhbGU6Ol9NX3Rocm93X29uX2NyZWF0aW9uX2ZhaWx1cmUoX19lcnJfY29kZSwgbmFtZSwgIm51bXB1bmN0Iik7CisgICAgICByZXR1cm4gaGludDsKKyAgICB9CisKKyAgICBpZiAoaGludCA9PSAwKSBoaW50ID0gX0xvY2FsZV9nZXRfbnVtZXJpY19oaW50KF9fbHB1bmN0KTsKKyAgICBfU1RMUF9UUlkgeworICAgICAgcHVuY3QgPSBuZXcgbnVtcHVuY3RfYnluYW1lPGNoYXI+KF9fbHB1bmN0KTsKKyAgICB9CisgICAgX1NUTFBfVU5XSU5EKF9TVExQX1BSSVYgX19yZWxlYXNlX251bWVyaWMoX19scHVuY3QpKTsKKworI2lmbmRlZiBfU1RMUF9OT19XQ0hBUl9UCisgICAgX0xvY2FsZV9udW1lcmljICpfX2x3cHVuY3QgPSBfU1RMUF9QUklWIF9fYWNxdWlyZV9udW1lcmljKG5hbWUsIGJ1ZiwgaGludCwgJl9fZXJyX2NvZGUpOworICAgIGlmICghX19sd3B1bmN0KSB7CisgICAgICBkZWxldGUgcHVuY3Q7CisgICAgICBsb2NhbGU6Ol9NX3Rocm93X29uX2NyZWF0aW9uX2ZhaWx1cmUoX19lcnJfY29kZSwgbmFtZSwgIm51bXB1bmN0Iik7CisgICAgICByZXR1cm4gaGludDsKKyAgICB9CisgICAgaWYgKF9fbHdwdW5jdCkgeworICAgICAgX1NUTFBfVFJZIHsKKyAgICAgICAgd3B1bmN0ICA9IG5ldyBudW1wdW5jdF9ieW5hbWU8d2NoYXJfdD4oX19sd3B1bmN0KTsKKyAgICAgIH0KKyAgICAgIF9TVExQX1VOV0lORChfU1RMUF9QUklWIF9fcmVsZWFzZV9udW1lcmljKF9fbHdwdW5jdCk7IGRlbGV0ZSBwdW5jdCk7CisgICAgfQorI2VuZGlmCisKKyAgICB0aGlzLT5pbnNlcnQocHVuY3QsIG51bXB1bmN0PGNoYXI+OjppZCk7CisjaWZuZGVmIF9TVExQX05PX1dDSEFSX1QKKyAgICB0aGlzLT5pbnNlcnQod3B1bmN0LCBudW1wdW5jdDx3Y2hhcl90Pjo6aWQpOworI2VuZGlmCisgIH0KKyAgcmV0dXJuIGhpbnQ7Cit9CisKK19Mb2NhbGVfbmFtZV9oaW50KiBfTG9jYWxlX2ltcGw6Omluc2VydF90aW1lX2ZhY2V0cyhjb25zdCBjaGFyKiAmbmFtZSwgY2hhciAqYnVmLCBfTG9jYWxlX25hbWVfaGludCogaGludCkgeworICBpZiAobmFtZVswXSA9PSAwKQorICAgIG5hbWUgPSBfTG9jYWxlX3RpbWVfZGVmYXVsdChidWYpOworCisgIGlmIChuYW1lID09IDAgfHwgbmFtZVswXSA9PSAwIHx8IGlzX0NfbG9jYWxlX25hbWUobmFtZSkpIHsKKyAgICBfTG9jYWxlX2ltcGwqIGkyID0gbG9jYWxlOjpjbGFzc2ljKCkuX01faW1wbDsKKyAgICB0aGlzLT5pbnNlcnQoaTIsCisgICAgICAgICAgICAgICAgIHRpbWVfZ2V0PGNoYXIsIGlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiA+OjppZCk7CisgICAgdGhpcy0+aW5zZXJ0KGkyLAorICAgICAgICAgICAgICAgICB0aW1lX3B1dDxjaGFyLCBvc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4gPjo6aWQpOworI2lmbmRlZiBfU1RMUF9OT19XQ0hBUl9UCisgICAgdGhpcy0+aW5zZXJ0KGkyLAorICAgICAgICAgICAgICAgICB0aW1lX2dldDx3Y2hhcl90LCBpc3RyZWFtYnVmX2l0ZXJhdG9yPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4gPjo6aWQpOworICAgIHRoaXMtPmluc2VydChpMiwKKyAgICAgICAgICAgICAgICAgdGltZV9wdXQ8d2NoYXJfdCwgb3N0cmVhbWJ1Zl9pdGVyYXRvcjx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+ID46OmlkKTsKKyNlbmRpZgorICB9IGVsc2UgeworICAgIGxvY2FsZTo6ZmFjZXQgKmdldCA9IDA7CisgICAgbG9jYWxlOjpmYWNldCAqcHV0ID0gMDsKKyNpZm5kZWYgX1NUTFBfTk9fV0NIQVJfVAorICAgIGxvY2FsZTo6ZmFjZXQgKndnZXQgPSAwOworICAgIGxvY2FsZTo6ZmFjZXQgKndwdXQgPSAwOworI2VuZGlmCisKKyAgICBpbnQgX19lcnJfY29kZTsKKyAgICBfTG9jYWxlX3RpbWUgKl9fdGltZSA9IF9TVExQX1BSSVYgX19hY3F1aXJlX3RpbWUobmFtZSwgYnVmLCBoaW50LCAmX19lcnJfY29kZSk7CisgICAgaWYgKCFfX3RpbWUpIHsKKyAgICAgIC8vIHRpbWUgZmFjZXRzIGNhdGVnb3J5IGlzIG5vdCBtYW5kYXRvcnkgZm9yIGNvcnJlY3Qgc3RyZWFtIGJlaGF2aW9yIHNvIGlmIHBsYXRmb3JtCisgICAgICAvLyBkbyBub3Qgc3VwcG9ydCBpdCB3ZSBkbyBub3QgZ2VuZXJhdGUgYSBydW50aW1lX2Vycm9yIGV4Y2VwdGlvbi4KKyAgICAgIGlmIChfX2Vycl9jb2RlID09IF9TVExQX0xPQ19OT19NRU1PUlkpIHsKKyAgICAgICAgX1NUTFBfVEhST1dfQkFEX0FMTE9DOworICAgICAgfQorICAgICAgcmV0dXJuIGhpbnQ7CisgICAgfQorCisgICAgaWYgKCFoaW50KSBoaW50ID0gX0xvY2FsZV9nZXRfdGltZV9oaW50KF9fdGltZSk7CisgICAgX1NUTFBfVFJZIHsKKyAgICAgIGdldCA9IG5ldyB0aW1lX2dldF9ieW5hbWU8Y2hhciwgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+ID4oX190aW1lKTsKKyAgICAgIHB1dCA9IG5ldyB0aW1lX3B1dF9ieW5hbWU8Y2hhciwgb3N0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+ID4oX190aW1lKTsKKyNpZm5kZWYgX1NUTFBfTk9fV0NIQVJfVAorICAgICAgd2dldCA9IG5ldyB0aW1lX2dldF9ieW5hbWU8d2NoYXJfdCwgaXN0cmVhbWJ1Zl9pdGVyYXRvcjx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+ID4oX190aW1lKTsKKyAgICAgIHdwdXQgPSBuZXcgdGltZV9wdXRfYnluYW1lPHdjaGFyX3QsIG9zdHJlYW1idWZfaXRlcmF0b3I8d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPiA+KF9fdGltZSk7CisjZW5kaWYKKyAgICB9CisjaWZuZGVmIF9TVExQX05PX1dDSEFSX1QKKyAgICBfU1RMUF9VTldJTkQoZGVsZXRlIHdnZXQ7IGRlbGV0ZSBwdXQ7IGRlbGV0ZSBnZXQ7IF9TVExQX1BSSVYgX19yZWxlYXNlX3RpbWUoX190aW1lKSk7CisjZWxzZQorICAgIF9TVExQX1VOV0lORChkZWxldGUgZ2V0OyBfU1RMUF9QUklWIF9fcmVsZWFzZV90aW1lKF9fdGltZSkpOworI2VuZGlmCisKKyAgICBfU1RMUF9QUklWIF9fcmVsZWFzZV90aW1lKF9fdGltZSk7CisKKyAgICB0aGlzLT5pbnNlcnQoZ2V0LCB0aW1lX2dldDxjaGFyLCBpc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4gPjo6aWQpOworICAgIHRoaXMtPmluc2VydChwdXQsIHRpbWVfcHV0PGNoYXIsIG9zdHJlYW1idWZfaXRlcmF0b3I8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiA+OjppZCk7CisjaWZuZGVmIF9TVExQX05PX1dDSEFSX1QKKyAgICB0aGlzLT5pbnNlcnQod2dldCwgdGltZV9nZXQ8d2NoYXJfdCwgaXN0cmVhbWJ1Zl9pdGVyYXRvcjx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+ID46OmlkKTsKKyAgICB0aGlzLT5pbnNlcnQod3B1dCwgdGltZV9wdXQ8d2NoYXJfdCwgb3N0cmVhbWJ1Zl9pdGVyYXRvcjx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+ID46OmlkKTsKKyNlbmRpZgorICB9CisgIHJldHVybiBoaW50OworfQorCitfTG9jYWxlX25hbWVfaGludCogX0xvY2FsZV9pbXBsOjppbnNlcnRfY29sbGF0ZV9mYWNldHMoY29uc3QgY2hhciogJm5hbWUsIGNoYXIgKmJ1ZiwgX0xvY2FsZV9uYW1lX2hpbnQqIGhpbnQpIHsKKyAgaWYgKG5hbWVbMF0gPT0gMCkKKyAgICBuYW1lID0gX0xvY2FsZV9jb2xsYXRlX2RlZmF1bHQoYnVmKTsKKworICBpZiAobmFtZSA9PSAwIHx8IG5hbWVbMF0gPT0gMCB8fCBpc19DX2xvY2FsZV9uYW1lKG5hbWUpKSB7CisgICAgX0xvY2FsZV9pbXBsKiBpMiA9IGxvY2FsZTo6Y2xhc3NpYygpLl9NX2ltcGw7CisgICAgdGhpcy0+aW5zZXJ0KGkyLCBjb2xsYXRlPGNoYXI+OjppZCk7CisjaWZuZGVmIF9TVExQX05PX1dDSEFSX1QKKyAgICB0aGlzLT5pbnNlcnQoaTIsIGNvbGxhdGU8d2NoYXJfdD46OmlkKTsKKyNlbmRpZgorICB9CisgIGVsc2UgeworICAgIGxvY2FsZTo6ZmFjZXQgKmNvbCA9IDA7CisjaWZuZGVmIF9TVExQX05PX1dDSEFSX1QKKyAgICBsb2NhbGU6OmZhY2V0ICp3Y29sID0gMDsKKyNlbmRpZgorCisgICAgaW50IF9fZXJyX2NvZGU7CisgICAgX0xvY2FsZV9jb2xsYXRlICpfX2NvbGwgPSBfU1RMUF9QUklWIF9fYWNxdWlyZV9jb2xsYXRlKG5hbWUsIGJ1ZiwgaGludCwgJl9fZXJyX2NvZGUpOworICAgIGlmICghX19jb2xsKSB7CisgICAgICBpZiAoX19lcnJfY29kZSA9PSBfU1RMUF9MT0NfTk9fTUVNT1JZKSB7CisgICAgICAgIF9TVExQX1RIUk9XX0JBRF9BTExPQzsKKyAgICAgIH0KKyAgICAgIHJldHVybiBoaW50OworICAgIH0KKworICAgIGlmIChoaW50ID09IDApIGhpbnQgPSBfTG9jYWxlX2dldF9jb2xsYXRlX2hpbnQoX19jb2xsKTsKKyAgICBfU1RMUF9UUlkgeworICAgICAgY29sID0gbmV3IGNvbGxhdGVfYnluYW1lPGNoYXI+KF9fY29sbCk7CisgICAgfQorICAgIF9TVExQX1VOV0lORChfU1RMUF9QUklWIF9fcmVsZWFzZV9jb2xsYXRlKF9fY29sbCkpOworCisjaWZuZGVmIF9TVExQX05PX1dDSEFSX1QKKyAgICBfTG9jYWxlX2NvbGxhdGUgKl9fd2NvbGwgPSBfU1RMUF9QUklWIF9fYWNxdWlyZV9jb2xsYXRlKG5hbWUsIGJ1ZiwgaGludCwgJl9fZXJyX2NvZGUpOworICAgIGlmICghX193Y29sbCkgeworICAgICAgaWYgKF9fZXJyX2NvZGUgPT0gX1NUTFBfTE9DX05PX01FTU9SWSkgeworICAgICAgICBkZWxldGUgY29sOworICAgICAgICBfU1RMUF9USFJPV19CQURfQUxMT0M7CisgICAgICB9CisgICAgfQorICAgIGlmIChfX3djb2xsKSB7CisgICAgICBfU1RMUF9UUlkgeworICAgICAgICB3Y29sICA9IG5ldyBjb2xsYXRlX2J5bmFtZTx3Y2hhcl90PihfX3djb2xsKTsKKyAgICAgIH0KKyAgICAgIF9TVExQX1VOV0lORChfU1RMUF9QUklWIF9fcmVsZWFzZV9jb2xsYXRlKF9fd2NvbGwpOyBkZWxldGUgY29sKTsKKyAgICB9CisjZW5kaWYKKworICAgIHRoaXMtPmluc2VydChjb2wsIGNvbGxhdGU8Y2hhcj46OmlkKTsKKyNpZm5kZWYgX1NUTFBfTk9fV0NIQVJfVAorICAgIGlmICh3Y29sKSB0aGlzLT5pbnNlcnQod2NvbCwgY29sbGF0ZTx3Y2hhcl90Pjo6aWQpOworI2VuZGlmCisgIH0KKyAgcmV0dXJuIGhpbnQ7Cit9CisKK19Mb2NhbGVfbmFtZV9oaW50KiBfTG9jYWxlX2ltcGw6Omluc2VydF9tb25ldGFyeV9mYWNldHMoY29uc3QgY2hhciogJm5hbWUsIGNoYXIgKmJ1ZiwgX0xvY2FsZV9uYW1lX2hpbnQqIGhpbnQpIHsKKyAgaWYgKG5hbWVbMF0gPT0gMCkKKyAgICBuYW1lID0gX0xvY2FsZV9tb25ldGFyeV9kZWZhdWx0KGJ1Zik7CisKKyAgX0xvY2FsZV9pbXBsKiBpMiA9IGxvY2FsZTo6Y2xhc3NpYygpLl9NX2ltcGw7CisKKyAgLy8gV2UgZmlyc3QgaW5zZXJ0IG5hbWUgaW5kZXBlbmRhbnQgZmFjZXRzIHRha2VuIGZyb20gdGhlIGNsYXNzaWMgbG9jYWxlIGluc3RhbmNlOgorICB0aGlzLT5pbnNlcnQoaTIsIG1vbmV5X2dldDxjaGFyLCBpc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4gPjo6aWQpOworICB0aGlzLT5pbnNlcnQoaTIsIG1vbmV5X3B1dDxjaGFyLCBvc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4gPjo6aWQpOworI2lmbmRlZiBfU1RMUF9OT19XQ0hBUl9UCisgIHRoaXMtPmluc2VydChpMiwgbW9uZXlfZ2V0PHdjaGFyX3QsIGlzdHJlYW1idWZfaXRlcmF0b3I8d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPiA+OjppZCk7CisgIHRoaXMtPmluc2VydChpMiwgbW9uZXlfcHV0PHdjaGFyX3QsIG9zdHJlYW1idWZfaXRlcmF0b3I8d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPiA+OjppZCk7CisjZW5kaWYKKworICBpZiAobmFtZSA9PSAwIHx8IG5hbWVbMF0gPT0gMCB8fCBpc19DX2xvY2FsZV9uYW1lKG5hbWUpKSB7CisgICAgdGhpcy0+aW5zZXJ0KGkyLCBtb25leXB1bmN0PGNoYXIsIGZhbHNlPjo6aWQpOworICAgIHRoaXMtPmluc2VydChpMiwgbW9uZXlwdW5jdDxjaGFyLCB0cnVlPjo6aWQpOworI2lmbmRlZiBfU1RMUF9OT19XQ0hBUl9UCisgICAgdGhpcy0+aW5zZXJ0KGkyLCBtb25leXB1bmN0PHdjaGFyX3QsIGZhbHNlPjo6aWQpOworICAgIHRoaXMtPmluc2VydChpMiwgbW9uZXlwdW5jdDx3Y2hhcl90LCB0cnVlPjo6aWQpOworI2VuZGlmCisgIH0KKyAgZWxzZSB7CisgICAgbG9jYWxlOjpmYWNldCAqcHVuY3QgICA9IDA7CisgICAgbG9jYWxlOjpmYWNldCAqaXB1bmN0ICA9IDA7CisKKyNpZm5kZWYgX1NUTFBfTk9fV0NIQVJfVAorICAgIGxvY2FsZTo6ZmFjZXQqIHdwdW5jdCAgPSAwOworICAgIGxvY2FsZTo6ZmFjZXQqIHdpcHVuY3QgPSAwOworI2VuZGlmCisKKyAgICBpbnQgX19lcnJfY29kZTsKKyAgICBfTG9jYWxlX21vbmV0YXJ5ICpfX21vbiA9IF9TVExQX1BSSVYgX19hY3F1aXJlX21vbmV0YXJ5KG5hbWUsIGJ1ZiwgaGludCwgJl9fZXJyX2NvZGUpOworICAgIGlmICghX19tb24pIHsKKyAgICAgIGlmIChfX2Vycl9jb2RlID09IF9TVExQX0xPQ19OT19NRU1PUlkpIHsKKyAgICAgICAgX1NUTFBfVEhST1dfQkFEX0FMTE9DOworICAgICAgfQorICAgICAgcmV0dXJuIGhpbnQ7CisgICAgfQorCisgICAgaWYgKGhpbnQgPT0gMCkgaGludCA9IF9Mb2NhbGVfZ2V0X21vbmV0YXJ5X2hpbnQoX19tb24pOworCisgICAgX1NUTFBfVFJZIHsKKyAgICAgIHB1bmN0ICAgPSBuZXcgbW9uZXlwdW5jdF9ieW5hbWU8Y2hhciwgZmFsc2U+KF9fbW9uKTsKKyAgICB9CisgICAgX1NUTFBfVU5XSU5EKF9TVExQX1BSSVYgX19yZWxlYXNlX21vbmV0YXJ5KF9fbW9uKSk7CisKKyAgICBfTG9jYWxlX21vbmV0YXJ5ICpfX2ltb24gPSBfU1RMUF9QUklWIF9fYWNxdWlyZV9tb25ldGFyeShuYW1lLCBidWYsIGhpbnQsICZfX2Vycl9jb2RlKTsKKyAgICBpZiAoIV9faW1vbikgeworICAgICAgZGVsZXRlIHB1bmN0OworICAgICAgaWYgKF9fZXJyX2NvZGUgPT0gX1NUTFBfTE9DX05PX01FTU9SWSkgeworICAgICAgICBfU1RMUF9USFJPV19CQURfQUxMT0M7CisgICAgICB9CisgICAgICByZXR1cm4gaGludDsKKyAgICB9CisKKyAgICBfU1RMUF9UUlkgeworICAgICAgaXB1bmN0ICA9IG5ldyBtb25leXB1bmN0X2J5bmFtZTxjaGFyLCB0cnVlPihfX2ltb24pOworICAgIH0KKyAgICBfU1RMUF9VTldJTkQoX1NUTFBfUFJJViBfX3JlbGVhc2VfbW9uZXRhcnkoX19pbW9uKTsgZGVsZXRlIHB1bmN0KTsKKworI2lmbmRlZiBfU1RMUF9OT19XQ0hBUl9UCisgICAgX1NUTFBfVFJZIHsKKyAgICAgIF9Mb2NhbGVfbW9uZXRhcnkgKl9fd21vbiA9IF9TVExQX1BSSVYgX19hY3F1aXJlX21vbmV0YXJ5KG5hbWUsIGJ1ZiwgaGludCwgJl9fZXJyX2NvZGUpOworICAgICAgaWYgKCFfX3dtb24pIHsKKyAgICAgICAgaWYgKF9fZXJyX2NvZGUgPT0gX1NUTFBfTE9DX05PX01FTU9SWSkgeworICAgICAgICAgIF9TVExQX1RIUk9XX0JBRF9BTExPQzsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoX193bW9uKSB7CisgICAgICAgIF9TVExQX1RSWSB7CisgICAgICAgICAgd3B1bmN0ICA9IG5ldyBtb25leXB1bmN0X2J5bmFtZTx3Y2hhcl90LCBmYWxzZT4oX193bW9uKTsKKyAgICAgICAgfQorICAgICAgICBfU1RMUF9VTldJTkQoX1NUTFBfUFJJViBfX3JlbGVhc2VfbW9uZXRhcnkoX193bW9uKSk7CisgICAgICAKKyAgICAgICAgX0xvY2FsZV9tb25ldGFyeSAqX193aW1vbiA9IF9TVExQX1BSSVYgX19hY3F1aXJlX21vbmV0YXJ5KG5hbWUsIGJ1ZiwgaGludCwgJl9fZXJyX2NvZGUpOworICAgICAgICBpZiAoIV9fd2ltb24pIHsKKyAgICAgICAgICBkZWxldGUgd3B1bmN0OworICAgICAgICAgIGlmIChfX2Vycl9jb2RlID09IF9TVExQX0xPQ19OT19NRU1PUlkpIHsKKyAgICAgICAgICAgIF9TVExQX1RIUk9XX0JBRF9BTExPQzsKKyAgICAgICAgICB9CisgICAgICAgICAgd3B1bmN0ID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICBfU1RMUF9UUlkgeworICAgICAgICAgICAgd2lwdW5jdCA9IG5ldyBtb25leXB1bmN0X2J5bmFtZTx3Y2hhcl90LCB0cnVlPihfX3dpbW9uKTsKKyAgICAgICAgICB9CisgICAgICAgICAgX1NUTFBfVU5XSU5EKF9TVExQX1BSSVYgX19yZWxlYXNlX21vbmV0YXJ5KF9fd2ltb24pOyBkZWxldGUgd3B1bmN0KTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBfU1RMUF9VTldJTkQoZGVsZXRlIGlwdW5jdDsgZGVsZXRlIHB1bmN0KTsKKyNlbmRpZgorCisgICAgdGhpcy0+aW5zZXJ0KHB1bmN0LCBtb25leXB1bmN0PGNoYXIsIGZhbHNlPjo6aWQpOworICAgIHRoaXMtPmluc2VydChpcHVuY3QsIG1vbmV5cHVuY3Q8Y2hhciwgdHJ1ZT46OmlkKTsKKyNpZm5kZWYgX1NUTFBfTk9fV0NIQVJfVAorICAgIGlmICh3cHVuY3QpIHRoaXMtPmluc2VydCh3cHVuY3QsIG1vbmV5cHVuY3Q8d2NoYXJfdCwgZmFsc2U+OjppZCk7CisgICAgaWYgKHdpcHVuY3QpIHRoaXMtPmluc2VydCh3aXB1bmN0LCBtb25leXB1bmN0PHdjaGFyX3QsIHRydWU+OjppZCk7CisjZW5kaWYKKyAgfQorICByZXR1cm4gaGludDsKK30KKworX0xvY2FsZV9uYW1lX2hpbnQqIF9Mb2NhbGVfaW1wbDo6aW5zZXJ0X21lc3NhZ2VzX2ZhY2V0cyhjb25zdCBjaGFyKiAmbmFtZSwgY2hhciAqYnVmLCBfTG9jYWxlX25hbWVfaGludCogaGludCkgeworICBpZiAobmFtZVswXSA9PSAwKQorICAgIG5hbWUgPSBfTG9jYWxlX21lc3NhZ2VzX2RlZmF1bHQoYnVmKTsKKworICBpZiAobmFtZSA9PSAwIHx8IG5hbWVbMF0gPT0gMCB8fCBpc19DX2xvY2FsZV9uYW1lKG5hbWUpKSB7CisgICAgX0xvY2FsZV9pbXBsKiBpMiA9IGxvY2FsZTo6Y2xhc3NpYygpLl9NX2ltcGw7CisgICAgdGhpcy0+aW5zZXJ0KGkyLCBtZXNzYWdlczxjaGFyPjo6aWQpOworI2lmbmRlZiBfU1RMUF9OT19XQ0hBUl9UCisgICAgdGhpcy0+aW5zZXJ0KGkyLCBtZXNzYWdlczx3Y2hhcl90Pjo6aWQpOworI2VuZGlmCisgIH0KKyAgZWxzZSB7CisgICAgbG9jYWxlOjpmYWNldCAqbXNnICA9IDA7CisjaWZuZGVmIF9TVExQX05PX1dDSEFSX1QKKyAgICBsb2NhbGU6OmZhY2V0ICp3bXNnID0gMDsKKyNlbmRpZgorCisgICAgaW50IF9fZXJyX2NvZGU7CisgICAgX0xvY2FsZV9tZXNzYWdlcyAqX19tc2cgPSBfU1RMUF9QUklWIF9fYWNxdWlyZV9tZXNzYWdlcyhuYW1lLCBidWYsIGhpbnQsICZfX2Vycl9jb2RlKTsKKyAgICBpZiAoIV9fbXNnKSB7CisgICAgICBpZiAoX19lcnJfY29kZSA9PSBfU1RMUF9MT0NfTk9fTUVNT1JZKSB7CisgICAgICAgIF9TVExQX1RIUk9XX0JBRF9BTExPQzsKKyAgICAgIH0KKyAgICAgIHJldHVybiBoaW50OworICAgIH0KKworICAgIF9TVExQX1RSWSB7CisgICAgICBtc2cgID0gbmV3IG1lc3NhZ2VzX2J5bmFtZTxjaGFyPihfX21zZyk7CisgICAgfQorICAgIF9TVExQX1VOV0lORChfU1RMUF9QUklWIF9fcmVsZWFzZV9tZXNzYWdlcyhfX21zZykpOworCisjaWZuZGVmIF9TVExQX05PX1dDSEFSX1QKKyAgICBfU1RMUF9UUlkgeworICAgICAgX0xvY2FsZV9tZXNzYWdlcyAqX193bXNnID0gX1NUTFBfUFJJViBfX2FjcXVpcmVfbWVzc2FnZXMobmFtZSwgYnVmLCBoaW50LCAmX19lcnJfY29kZSk7CisgICAgICBpZiAoIV9fd21zZykgeworICAgICAgICBpZiAoX19lcnJfY29kZSA9PSBfU1RMUF9MT0NfTk9fTUVNT1JZKSB7CisgICAgICAgICAgX1NUTFBfVEhST1dfQkFEX0FMTE9DOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChfX3dtc2cpIHsKKyAgICAgICAgX1NUTFBfVFJZIHsKKyAgICAgICAgICB3bXNnID0gbmV3IG1lc3NhZ2VzX2J5bmFtZTx3Y2hhcl90PihfX3dtc2cpOworICAgICAgICB9CisgICAgICAgIF9TVExQX1VOV0lORChfU1RMUF9QUklWIF9fcmVsZWFzZV9tZXNzYWdlcyhfX3dtc2cpKTsKKyAgICAgIH0KKyAgICB9CisgICAgX1NUTFBfVU5XSU5EKGRlbGV0ZSBtc2cpOworI2VuZGlmCisKKyAgICB0aGlzLT5pbnNlcnQobXNnLCBtZXNzYWdlczxjaGFyPjo6aWQpOworI2lmbmRlZiBfU1RMUF9OT19XQ0hBUl9UCisgICAgaWYgKHdtc2cpIHRoaXMtPmluc2VydCh3bXNnLCBtZXNzYWdlczx3Y2hhcl90Pjo6aWQpOworI2VuZGlmCisgIH0KKyAgcmV0dXJuIGhpbnQ7Cit9CisKK3N0YXRpYyB2b2lkIF9TdGxfbG9jX2Fzc2lnbl9pZHMoKSB7CisgIC8vIFRoaXMgYXNzaWducyBpZHMgdG8gZXZlcnkgZmFjZXQgdGhhdCBpcyBhIG1lbWJlciBvZiBhIGNhdGVnb3J5LAorICAvLyBhbmQgYWxzbyB0byBtb25leV9nZXQvcHV0LCBudW1fZ2V0L3B1dCwgYW5kIHRpbWVfZ2V0L3B1dAorICAvLyBpbnN0YW50aWF0ZWQgdXNpbmcgb3JkaW5hcnkgcG9pbnRlcnMgYXMgdGhlIGlucHV0L291dHB1dAorICAvLyBpdGVyYXRvcnMuICAoVGhlIGRlZmF1bHQgaXMgW2lvXXN0cmVhbWJ1Zl9pdGVyYXRvci4pCisKKyAgbW9uZXlfZ2V0PGNoYXIsIGlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiA+OjppZC5fTV9pbmRleCAgICAgICAgICA9IDg7CisgIG1vbmV5X3B1dDxjaGFyLCBvc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4gPjo6aWQuX01faW5kZXggICAgICAgICAgPSA5OworICBudW1fZ2V0PGNoYXIsIGlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiA+OjppZC5fTV9pbmRleCAgICAgICAgICAgID0gMTA7CisgIG51bV9wdXQ8Y2hhciwgb3N0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+ID46OmlkLl9NX2luZGV4ICAgICAgICAgICAgPSAxMTsKKyAgdGltZV9nZXQ8Y2hhciwgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+ID46OmlkLl9NX2luZGV4ICAgICAgICAgICA9IDEyOworICB0aW1lX3B1dDxjaGFyLCBvc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4gPjo6aWQuX01faW5kZXggICAgICAgICAgID0gMTM7CisKKyNpZm5kZWYgX1NUTFBfTk9fV0NIQVJfVAorICBtb25leV9nZXQ8d2NoYXJfdCwgaXN0cmVhbWJ1Zl9pdGVyYXRvcjx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+ID46OmlkLl9NX2luZGV4ID0gMjE7CisgIG1vbmV5X3B1dDx3Y2hhcl90LCBvc3RyZWFtYnVmX2l0ZXJhdG9yPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4gPjo6aWQuX01faW5kZXggPSAyMjsKKyAgbnVtX2dldDx3Y2hhcl90LCBpc3RyZWFtYnVmX2l0ZXJhdG9yPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4gPjo6aWQuX01faW5kZXggICA9IDIzOworICBudW1fcHV0PHdjaGFyX3QsIG9zdHJlYW1idWZfaXRlcmF0b3I8d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPiA+IDo6aWQuX01faW5kZXggID0gMjQ7CisgIHRpbWVfZ2V0PHdjaGFyX3QsIGlzdHJlYW1idWZfaXRlcmF0b3I8d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPiA+OjppZC5fTV9pbmRleCAgPSAyNTsKKyAgdGltZV9wdXQ8d2NoYXJfdCwgb3N0cmVhbWJ1Zl9pdGVyYXRvcjx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+ID46OmlkLl9NX2luZGV4ICA9IDI2OworI2VuZGlmCisgIC8vICBsb2NhbGU6OmlkOjpfU19tYXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNzsKK30KKworLy8gVG8gYWNjZXNzIHRob3NlIHN0YXRpYyBpbnN0YW5jZSB1c2UgdGhlIGdldHRlciBiZWxvdywgdGhleSBndWFyYW50eQorLy8gYSBjb3JyZWN0IGluaXRpYWxpemF0aW9uLgorc3RhdGljIGxvY2FsZSAqX1N0bF9jbGFzc2ljX2xvY2FsZSA9IDA7CitzdGF0aWMgbG9jYWxlICpfU3RsX2dsb2JhbF9sb2NhbGUgPSAwOworCitsb2NhbGUqIF9TdGxfZ2V0X2NsYXNzaWNfbG9jYWxlKCkgeworICBzdGF0aWMgX0xvY2FsZV9pbXBsOjpJbml0IGluaXQ7CisgIHJldHVybiBfU3RsX2NsYXNzaWNfbG9jYWxlOworfQorCitsb2NhbGUqIF9TdGxfZ2V0X2dsb2JhbF9sb2NhbGUoKSB7CisgIHN0YXRpYyBfTG9jYWxlX2ltcGw6OkluaXQgaW5pdDsKKyAgcmV0dXJuIF9TdGxfZ2xvYmFsX2xvY2FsZTsKK30KKworI2lmIGRlZmluZWQgKF9TVExQX01TVkMpIHx8IGRlZmluZWQgKF9fSUNMKSB8fCBkZWZpbmVkIChfX0lTQ1BQX18pIHx8IGRlZmluZWQgKF9fRE1DX18pCisvKgorICogVGhlIGZvbGxvd2luZyBzdGF0aWMgdmFyaWFibGUgbmVlZHMgdG8gYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIFNUTHBvcnQKKyAqIHVzZXJzIHN0YXRpYyB2YXJpYWJsZSBpbiBvcmRlciBmb3IgaGltIHRvIGJlIGFibGUgdG8gdXNlIFN0YW5kYXJkCisgKiBzdHJlYW1zIGluIGl0cyB2YXJpYWJsZSBpbml0aWFsaXphdGlvbi4KKyAqIFRoaXMgdmFyaWFibGUgaXMgaGVyZSBiZWNhdXNlIE1TVkMgZG8gbm90IGFsbG93IHRvIGNoYW5nZSB0aGUgaW5pdGlhbGl6YXRpb24KKyAqIHNlZ21lbnQgaW4gYSBnaXZlbiB0cmFuc2xhdGlvbiB1bml0LCBpb3N0cmVhbS5jcHAgYWxyZWFkeSBjb250YWlucyBhbgorICogaW5pdGlhbGl6YXRpb24gc2VnbWVudCBzcGVjaWZpY2F0aW9uLgorICovCisjICBwcmFnbWEgd2FybmluZyAoZGlzYWJsZSA6IDQwNzMpCisjICBwcmFnbWEgaW5pdF9zZWcobGliKQorI2VuZGlmCisKK3N0YXRpYyBpb3NfYmFzZTo6SW5pdCBfSW9zSW5pdDsKKwordm9pZCBfTG9jYWxlX2ltcGw6Om1ha2VfY2xhc3NpY19sb2NhbGUoKSB7CisgIC8vIFRoaXMgZnVuY2lvbiB3aWxsIGJlIGNhbGxlZCBvbmNlOiBkdXJpbmcgYnVpbGQgY2xhc3NpYyBfTG9jYWxlX2ltcGwKKworICAvLyBUaGUgY2xhc3NpYyBsb2NhbGUgY29udGFpbnMgZXZlcnkgZmFjZXQgdGhhdCBiZWxvbmdzIHRvIGEgY2F0ZWdvcnkuCisgIHN0YXRpYyBfU3RsX2FsaWduZWRfYnVmZmVyPF9Mb2NhbGVfaW1wbD4gX0xvY2FsZV9jbGFzc2ljX2ltcGxfYnVmOworICBfTG9jYWxlX2ltcGwgKmNsYXNzaWMgPSBuZXcoJl9Mb2NhbGVfY2xhc3NpY19pbXBsX2J1ZikgX0xvY2FsZV9pbXBsKCJDIik7CisKKyAgbG9jYWxlOjpmYWNldCogY2xhc3NpY19mYWNldHNbXSA9IHsKKyAgICAwLAorICAgIG5ldyBjb2xsYXRlPGNoYXI+KDEpLAorICAgIG5ldyBjdHlwZTxjaGFyPigwLCBmYWxzZSwgMSksCisgICAgbmV3IGNvZGVjdnQ8Y2hhciwgY2hhciwgbWJzdGF0ZV90PigxKSwKKyAgICBuZXcgbW9uZXlwdW5jdDxjaGFyLCB0cnVlPigxKSwKKyAgICBuZXcgbW9uZXlwdW5jdDxjaGFyLCBmYWxzZT4oMSksCisgICAgbmV3IG51bXB1bmN0PGNoYXI+KDEpLAorICAgIG5ldyBtZXNzYWdlczxjaGFyPigxKSwKKyAgICBuZXcgbW9uZXlfZ2V0PGNoYXIsIGlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiA+KDEpLAorICAgIG5ldyBtb25leV9wdXQ8Y2hhciwgb3N0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+ID4oMSksCisgICAgbmV3IG51bV9nZXQ8Y2hhciwgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+ID4oMSksCisgICAgbmV3IG51bV9wdXQ8Y2hhciwgb3N0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+ID4oMSksCisgICAgbmV3IHRpbWVfZ2V0PGNoYXIsIGlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiA+KDEpLAorICAgIG5ldyB0aW1lX3B1dDxjaGFyLCBvc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4gPigxKSwKKyNpZm5kZWYgX1NUTFBfTk9fV0NIQVJfVAorICAgIG5ldyBjb2xsYXRlPHdjaGFyX3Q+KDEpLAorICAgIG5ldyBjdHlwZTx3Y2hhcl90PigxKSwKKyAgICBuZXcgY29kZWN2dDx3Y2hhcl90LCBjaGFyLCBtYnN0YXRlX3Q+KDEpLAorICAgIG5ldyBtb25leXB1bmN0PHdjaGFyX3QsIHRydWU+KDEpLAorICAgIG5ldyBtb25leXB1bmN0PHdjaGFyX3QsIGZhbHNlPigxKSwKKyAgICBuZXcgbnVtcHVuY3Q8d2NoYXJfdD4oMSksCisgICAgbmV3IG1lc3NhZ2VzPHdjaGFyX3Q+KDEpLAorICAgIG5ldyBtb25leV9nZXQ8d2NoYXJfdCwgaXN0cmVhbWJ1Zl9pdGVyYXRvcjx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+ID4oMSksCisgICAgbmV3IG1vbmV5X3B1dDx3Y2hhcl90LCBvc3RyZWFtYnVmX2l0ZXJhdG9yPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4gPigxKSwKKyAgICBuZXcgbnVtX2dldDx3Y2hhcl90LCBpc3RyZWFtYnVmX2l0ZXJhdG9yPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4gPigxKSwKKyAgICBuZXcgbnVtX3B1dDx3Y2hhcl90LCBvc3RyZWFtYnVmX2l0ZXJhdG9yPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4gPigxKSwKKyAgICBuZXcgdGltZV9nZXQ8d2NoYXJfdCwgaXN0cmVhbWJ1Zl9pdGVyYXRvcjx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+ID4oMSksCisgICAgbmV3IHRpbWVfcHV0PHdjaGFyX3QsIG9zdHJlYW1idWZfaXRlcmF0b3I8d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPiA+KDEpLAorI2VuZGlmCisgICAgMAorICB9OworCisgIGNvbnN0IHNpemVfdCBuYl9jbGFzc2ljX2ZhY2V0cyA9IHNpemVvZihjbGFzc2ljX2ZhY2V0cykgLyBzaXplb2YobG9jYWxlOjpmYWNldCAqKTsKKyAgY2xhc3NpYy0+ZmFjZXRzX3ZlYy5yZXNlcnZlKG5iX2NsYXNzaWNfZmFjZXRzKTsKKyAgY2xhc3NpYy0+ZmFjZXRzX3ZlYy5hc3NpZ24oJmNsYXNzaWNfZmFjZXRzWzBdLCAmY2xhc3NpY19mYWNldHNbMF0gKyBuYl9jbGFzc2ljX2ZhY2V0cyk7CisKKyAgc3RhdGljIGxvY2FsZSBfTG9jYWxlX2NsYXNzaWMoY2xhc3NpYyk7CisgIF9TdGxfY2xhc3NpY19sb2NhbGUgPSAmX0xvY2FsZV9jbGFzc2ljOworCisgIHN0YXRpYyBsb2NhbGUgX0xvY2FsZV9nbG9iYWwoY2xhc3NpYyk7CisgIF9TdGxfZ2xvYmFsX2xvY2FsZSA9ICZfTG9jYWxlX2dsb2JhbDsKK30KKworLy8gRGVjbGFyYXRpb25zIG9mIChub24tdGVtcGxhdGUpIGZhY2V0cycgc3RhdGljIGRhdGEgbWVtYmVycworLy8gc2l6ZV90IGxvY2FsZTo6aWQ6Ol9TX21heCA9IDI3OyAvLyBtYWRlIGJlZm9yZQorCitsb2NhbGU6OmlkIGNvbGxhdGU8Y2hhcj46OmlkID0geyAxIH07Citsb2NhbGU6OmlkIGN0eXBlPGNoYXI+OjppZCA9IHsgMiB9OworbG9jYWxlOjppZCBjb2RlY3Z0PGNoYXIsIGNoYXIsIG1ic3RhdGVfdD46OmlkID0geyAzIH07Citsb2NhbGU6OmlkIG1vbmV5cHVuY3Q8Y2hhciwgdHJ1ZT46OmlkID0geyA0IH07Citsb2NhbGU6OmlkIG1vbmV5cHVuY3Q8Y2hhciwgZmFsc2U+OjppZCA9IHsgNSB9OworbG9jYWxlOjppZCBudW1wdW5jdDxjaGFyPjo6aWQgPSB7IDYgfSA7Citsb2NhbGU6OmlkIG1lc3NhZ2VzPGNoYXI+OjppZCA9IHsgNyB9OworCisjaWZuZGVmIF9TVExQX05PX1dDSEFSX1QKK2xvY2FsZTo6aWQgY29sbGF0ZTx3Y2hhcl90Pjo6aWQgPSB7IDE0IH07Citsb2NhbGU6OmlkIGN0eXBlPHdjaGFyX3Q+OjppZCA9IHsgMTUgfTsKK2xvY2FsZTo6aWQgY29kZWN2dDx3Y2hhcl90LCBjaGFyLCBtYnN0YXRlX3Q+OjppZCA9IHsgMTYgfTsKK2xvY2FsZTo6aWQgbW9uZXlwdW5jdDx3Y2hhcl90LCB0cnVlPjo6aWQgPSB7IDE3IH0gOworbG9jYWxlOjppZCBtb25leXB1bmN0PHdjaGFyX3QsIGZhbHNlPjo6aWQgPSB7IDE4IH0gOworbG9jYWxlOjppZCBudW1wdW5jdDx3Y2hhcl90Pjo6aWQgPSB7IDE5IH07Citsb2NhbGU6OmlkIG1lc3NhZ2VzPHdjaGFyX3Q+OjppZCA9IHsgMjAgfTsKKyNlbmRpZgorCitfU1RMUF9ERUNMU1BFQyBfTG9jYWxlX2ltcGwqIF9TVExQX0NBTEwgX2dldF9Mb2NhbGVfaW1wbChfTG9jYWxlX2ltcGwgKmxvYykKK3sKKyAgX1NUTFBfQVNTRVJUKCBsb2MgIT0gMCApOworICBsb2MtPl9NX2luY3IoKTsKKyAgcmV0dXJuIGxvYzsKK30KKwordm9pZCBfU1RMUF9DQUxMIF9yZWxlYXNlX0xvY2FsZV9pbXBsKF9Mb2NhbGVfaW1wbCAqJiBsb2MpCit7CisgIF9TVExQX0FTU0VSVCggbG9jICE9IDAgKTsKKyAgaWYgKGxvYy0+X01fZGVjcigpID09IDApIHsKKyAgICBpZiAoKmxvYyAhPSAqX1N0bF9jbGFzc2ljX2xvY2FsZSkKKyAgICAgIGRlbGV0ZSBsb2M7CisgICAgZWxzZQorICAgICAgbG9jLT5+X0xvY2FsZV9pbXBsKCk7CisgICAgbG9jID0gMDsKKyAgfQorfQorCitfU1RMUF9ERUNMU1BFQyBfTG9jYWxlX2ltcGwqIF9TVExQX0NBTEwgX2NvcHlfTmFtZWxlc3NfTG9jYWxlX2ltcGwoX0xvY2FsZV9pbXBsICpsb2MpCit7CisgIF9TVExQX0FTU0VSVCggbG9jICE9IDAgKTsKKyAgX0xvY2FsZV9pbXBsICpsb2NfbmV3ID0gbmV3IF9Mb2NhbGVfaW1wbCgqbG9jKTsKKyAgbG9jX25ldy0+bmFtZSA9IF9OYW1lbGVzczsKKyAgcmV0dXJuIGxvY19uZXc7Cit9CisKKy8qIF9HZXRGYWNldElkIGltcGxlbWVudGF0aW9uIGhhdmUgdG8gYmUgaGVyZSBpbiBvcmRlciB0byBiZSBpbiB0aGUgc2FtZSB0cmFuc2xhdGlvbiB1bml0CisgKiBhcyB3aGVyZSBpZCBhcmUgaW5pdGlhbGl6ZSAoaW4gX1N0bF9sb2NfYXNzaWduX2lkcykgKi8KK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKworX1NUTFBfREVDTFNQRUMgbG9jYWxlOjppZCYgX1NUTFBfQ0FMTCBfR2V0RmFjZXRJZChjb25zdCBtb25leV9nZXQ8Y2hhciwgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+ID4qKQoreyByZXR1cm4gbW9uZXlfZ2V0PGNoYXIsIGlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiA+OjppZDsgfQorX1NUTFBfREVDTFNQRUMgbG9jYWxlOjppZCYgX1NUTFBfQ0FMTCBfR2V0RmFjZXRJZChjb25zdCBtb25leV9wdXQ8Y2hhciwgb3N0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+ID4qKQoreyByZXR1cm4gbW9uZXlfcHV0PGNoYXIsIG9zdHJlYW1idWZfaXRlcmF0b3I8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiA+OjppZDsgfQorI2lmbmRlZiBfU1RMUF9OT19XQ0hBUl9UCitfU1RMUF9ERUNMU1BFQyBsb2NhbGU6OmlkJiBfU1RMUF9DQUxMIF9HZXRGYWNldElkKGNvbnN0IG1vbmV5X2dldDx3Y2hhcl90LCBpc3RyZWFtYnVmX2l0ZXJhdG9yPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4gPiopCit7IHJldHVybiBtb25leV9nZXQ8d2NoYXJfdCwgaXN0cmVhbWJ1Zl9pdGVyYXRvcjx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+ID46OmlkOyB9CitfU1RMUF9ERUNMU1BFQyBsb2NhbGU6OmlkJiBfU1RMUF9DQUxMIF9HZXRGYWNldElkKGNvbnN0IG1vbmV5X3B1dDx3Y2hhcl90LCBvc3RyZWFtYnVmX2l0ZXJhdG9yPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4gPiopCit7IHJldHVybiBtb25leV9wdXQ8d2NoYXJfdCwgb3N0cmVhbWJ1Zl9pdGVyYXRvcjx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+ID46OmlkOyB9CisjZW5kaWYKKworX1NUTFBfREVDTFNQRUMgbG9jYWxlOjppZCYgX1NUTFBfQ0FMTCBfR2V0RmFjZXRJZChjb25zdCBudW1fZ2V0PGNoYXIsIGlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiA+KikKK3sgcmV0dXJuIG51bV9nZXQ8Y2hhciwgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+ID46OmlkOyB9CisjaWZuZGVmIF9TVExQX05PX1dDSEFSX1QKK19TVExQX0RFQ0xTUEVDIGxvY2FsZTo6aWQmIF9TVExQX0NBTEwgX0dldEZhY2V0SWQoY29uc3QgbnVtX2dldDx3Y2hhcl90LCBpc3RyZWFtYnVmX2l0ZXJhdG9yPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4gPiopCit7IHJldHVybiBudW1fZ2V0PHdjaGFyX3QsIGlzdHJlYW1idWZfaXRlcmF0b3I8d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPiA+OjppZDsgfQorI2VuZGlmCisKK19TVExQX0RFQ0xTUEVDIGxvY2FsZTo6aWQmIF9TVExQX0NBTEwgX0dldEZhY2V0SWQoY29uc3QgbnVtX3B1dDxjaGFyLCBvc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4gPiopCit7IHJldHVybiBudW1fcHV0PGNoYXIsIG9zdHJlYW1idWZfaXRlcmF0b3I8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiA+OjppZDsgfQorI2lmbmRlZiBfU1RMUF9OT19XQ0hBUl9UCitfU1RMUF9ERUNMU1BFQyBsb2NhbGU6OmlkJiBfU1RMUF9DQUxMIF9HZXRGYWNldElkKGNvbnN0IG51bV9wdXQ8d2NoYXJfdCwgb3N0cmVhbWJ1Zl9pdGVyYXRvcjx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+ID4qKQoreyByZXR1cm4gbnVtX3B1dDx3Y2hhcl90LCBvc3RyZWFtYnVmX2l0ZXJhdG9yPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4gPjo6aWQ7IH0KKyNlbmRpZgorCitfU1RMUF9ERUNMU1BFQyBsb2NhbGU6OmlkJiBfU1RMUF9DQUxMIF9HZXRGYWNldElkKGNvbnN0IHRpbWVfZ2V0PGNoYXIsIGlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiA+KikKK3sgcmV0dXJuIHRpbWVfZ2V0PGNoYXIsIGlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiA+OjppZDsgfQorX1NUTFBfREVDTFNQRUMgbG9jYWxlOjppZCYgX1NUTFBfQ0FMTCBfR2V0RmFjZXRJZChjb25zdCB0aW1lX3B1dDxjaGFyLCBvc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4gPiopCit7IHJldHVybiB0aW1lX3B1dDxjaGFyLCBvc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4gPjo6aWQ7IH0KKyNpZm5kZWYgX1NUTFBfTk9fV0NIQVJfVAorX1NUTFBfREVDTFNQRUMgbG9jYWxlOjppZCYgX1NUTFBfQ0FMTCBfR2V0RmFjZXRJZChjb25zdCB0aW1lX2dldDx3Y2hhcl90LCBpc3RyZWFtYnVmX2l0ZXJhdG9yPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4gPiopCit7IHJldHVybiB0aW1lX2dldDx3Y2hhcl90LCBpc3RyZWFtYnVmX2l0ZXJhdG9yPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4gPjo6aWQ7IH0KK19TVExQX0RFQ0xTUEVDIGxvY2FsZTo6aWQmIF9TVExQX0NBTEwgX0dldEZhY2V0SWQoY29uc3QgdGltZV9wdXQ8d2NoYXJfdCwgb3N0cmVhbWJ1Zl9pdGVyYXRvcjx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+ID4qKQoreyByZXR1cm4gdGltZV9wdXQ8d2NoYXJfdCwgb3N0cmVhbWJ1Zl9pdGVyYXRvcjx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+ID46OmlkOyB9CisjZW5kaWYKKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKwpkaWZmIC0tZ2l0IGEvc3JjL2xvY2FsZV9pbXBsLmggYi9zcmMvbG9jYWxlX2ltcGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWE2OTRjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2xvY2FsZV9pbXBsLmgKQEAgLTAsMCArMSwxMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgTE9DQUxFX0lNUExfSAorI2RlZmluZSBMT0NBTEVfSU1QTF9ICisKKyNpbmNsdWRlIDxjbG9jYWxlPiAgICAgICAgICAgICAvLyBDIGxvY2FsZSBoZWFkZXIgZmlsZS4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGxvY2FsZT4KKyNpbmNsdWRlICJjX2xvY2FsZS5oIgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9URU1QTEFURV9FWFBPUlQpCisvL0V4cG9ydCBvZiBfTG9jYWxlX2ltcGwgZmFjZXRzIGNvbnRhaW5lcjoKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9VU0VfUFRSX1NQRUNJQUxJWkFUSU9OUykKKy8vSWYgd2UgYXJlIHVzaW5nIHBvaW50ZXIgc3BlY2lhbGl6YXRpb24sIHZlY3Rvcjxsb2NhbGU6OmZhY2V0Kj4gd2lsbCB1c2UKKy8vdGhlIGFscmVhZHkgZXhwb3J0ZWQgdmVjdG9yPHZvaWQqPiBpbXBsZW1lbnRhdGlvbi4KK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBhbGxvY2F0b3I8bG9jYWxlOjpmYWNldCo+OworCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBfU1RMUF9hbGxvY19wcm94eTxsb2NhbGU6OmZhY2V0KiosIGxvY2FsZTo6ZmFjZXQqLCBhbGxvY2F0b3I8bG9jYWxlOjpmYWNldCo+ID47CitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgX1ZlY3Rvcl9iYXNlPGxvY2FsZTo6ZmFjZXQqLCBhbGxvY2F0b3I8bG9jYWxlOjpmYWNldCo+ID47CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorIyAgZW5kaWYKKyMgIGlmIGRlZmluZWQgKF9TVExQX0RFQlVHKQorX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorIyAgICBkZWZpbmUgX1NUTFBfTk9OX0RCR19WRUNUT1IgX1NUTFBfTk9OX0RCR19OQU1FKHZlY3RvcikKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBfX2NvbnN0cnVjdF9jaGVja2VyPF9TVExQX05PTl9EQkdfVkVDVE9SPGxvY2FsZTo6ZmFjZXQqLCBhbGxvY2F0b3I8bG9jYWxlOjpmYWNldCo+ID4gPjsKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBfU1RMUF9OT05fREJHX1ZFQ1RPUjxsb2NhbGU6OmZhY2V0KiwgYWxsb2NhdG9yPGxvY2FsZTo6ZmFjZXQqPiA+OworIyAgICB1bmRlZiBfU1RMUF9OT05fREJHX1ZFQ1RPUgorX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisjICBlbmRpZgorCitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgdmVjdG9yPGxvY2FsZTo6ZmFjZXQqLCBhbGxvY2F0b3I8bG9jYWxlOjpmYWNldCo+ID47CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDbGFzcyBfTG9jYWxlX2ltcGwKKy8vIFRoaXMgaXMgdGhlIGJhc2UgY2xhc3Mgd2hpY2ggaW1wbGVtZW50cyBhY2Nlc3Mgb25seSBhbmQgaXMgc3VwcG9zZWQgdG8KKy8vIGJlIHVzZWQgZm9yIGNsYXNzaWMgbG9jYWxlIG9ubHkKK2NsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIF9Mb2NhbGVfaW1wbCA6IHB1YmxpYyBfUmVmY291bnRfQmFzZSB7CisgIHB1YmxpYzoKKyAgICBfTG9jYWxlX2ltcGwoY29uc3QgY2hhciogcyk7CisgICAgX0xvY2FsZV9pbXBsKGNvbnN0IF9Mb2NhbGVfaW1wbCYpOworICAgIF9Mb2NhbGVfaW1wbChzaXplX3QgbiwgY29uc3QgY2hhciogcyk7CisKKyAgcHJpdmF0ZToKKyAgICB+X0xvY2FsZV9pbXBsKCk7CisKKyAgcHVibGljOgorICAgIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gZmFjZXRzX3ZlYy5zaXplKCk7IH0KKworICAgIGJhc2ljX3N0cmluZzxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiwgYWxsb2NhdG9yPGNoYXI+ID4gbmFtZTsKKworICAgIHN0YXRpYyB2b2lkIF9TVExQX0ZVTkNUSU9OX1RIUk9XUyBfU1RMUF9DQUxMIF9NX3Rocm93X2JhZF9jYXN0KCk7CisKKyAgcHJpdmF0ZToKKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBfTG9jYWxlX2ltcGwmKTsKKworICBwdWJsaWM6CisgICAgY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgSW5pdCB7CisgICAgICBwdWJsaWM6CisgICAgICAgIEluaXQoKTsKKyAgICAgICAgfkluaXQoKTsKKyAgICAgIHByaXZhdGU6CisgICAgICAgIF9SZWZjb3VudF9CYXNlJiBfTV9jb3VudCgpIGNvbnN0OworICAgIH07CisKKyAgICBzdGF0aWMgdm9pZCBfU1RMUF9DQUxMIF9TX2luaXRpYWxpemUoKTsKKyAgICBzdGF0aWMgdm9pZCBfU1RMUF9DQUxMIF9TX3VuaW5pdGlhbGl6ZSgpOworCisgICAgc3RhdGljIHZvaWQgbWFrZV9jbGFzc2ljX2xvY2FsZSgpOworICAgIHN0YXRpYyB2b2lkIGZyZWVfY2xhc3NpY19sb2NhbGUoKTsKKworICAgIGZyaWVuZCBjbGFzcyBJbml0OworCisgIHB1YmxpYzoKKyAgICAvLyB2b2lkIHJlbW92ZShzaXplX3QgaW5kZXgpOworICAgIGxvY2FsZTo6ZmFjZXQqIGluc2VydChsb2NhbGU6OmZhY2V0KiwgY29uc3QgbG9jYWxlOjppZCYgbik7CisgICAgdm9pZCBpbnNlcnQoX0xvY2FsZV9pbXBsKiBmcm9tLCBjb25zdCBsb2NhbGU6OmlkJiBuKTsKKworICAgIC8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIGJ5bmFtZSBjb25zdHJ1Y3Rpb24gb2YgbG9jYWxlcy4KKyAgICBfTG9jYWxlX25hbWVfaGludCogaW5zZXJ0X2N0eXBlX2ZhY2V0cyhjb25zdCBjaGFyKiAmbmFtZSwgY2hhciAqYnVmLCBfTG9jYWxlX25hbWVfaGludCogaGludCk7CisgICAgX0xvY2FsZV9uYW1lX2hpbnQqIGluc2VydF9udW1lcmljX2ZhY2V0cyhjb25zdCBjaGFyKiAmbmFtZSwgY2hhciAqYnVmLCBfTG9jYWxlX25hbWVfaGludCogaGludCk7CisgICAgX0xvY2FsZV9uYW1lX2hpbnQqIGluc2VydF90aW1lX2ZhY2V0cyhjb25zdCBjaGFyKiAmbmFtZSwgY2hhciAqYnVmLCBfTG9jYWxlX25hbWVfaGludCogaGludCk7CisgICAgX0xvY2FsZV9uYW1lX2hpbnQqIGluc2VydF9jb2xsYXRlX2ZhY2V0cyhjb25zdCBjaGFyKiAmbmFtZSwgY2hhciAqYnVmLCBfTG9jYWxlX25hbWVfaGludCogaGludCk7CisgICAgX0xvY2FsZV9uYW1lX2hpbnQqIGluc2VydF9tb25ldGFyeV9mYWNldHMoY29uc3QgY2hhciogJm5hbWUsIGNoYXIgKmJ1ZiwgX0xvY2FsZV9uYW1lX2hpbnQqIGhpbnQpOworICAgIF9Mb2NhbGVfbmFtZV9oaW50KiBpbnNlcnRfbWVzc2FnZXNfZmFjZXRzKGNvbnN0IGNoYXIqICZuYW1lLCBjaGFyICpidWYsIF9Mb2NhbGVfbmFtZV9oaW50KiBoaW50KTsKKworICAgIGJvb2wgb3BlcmF0b3IgIT0gKGNvbnN0IGxvY2FsZSYgX19sb2MpIGNvbnN0IHsgcmV0dXJuIF9fbG9jLl9NX2ltcGwgIT0gdGhpczsgfQorCisgIHByaXZhdGU6CisgICAgdmVjdG9yPGxvY2FsZTo6ZmFjZXQqPiBmYWNldHNfdmVjOworCisgIHByaXZhdGU6CisgICAgZnJpZW5kIF9Mb2NhbGVfaW1wbCAqIF9TVExQX0NBTEwgX2NvcHlfTmFtZWxlc3NfTG9jYWxlX2ltcGwoIF9Mb2NhbGVfaW1wbCAqICk7CisgICAgZnJpZW5kIHZvaWQgX1NUTFBfQ0FMTCBfcmVsZWFzZV9Mb2NhbGVfaW1wbCggX0xvY2FsZV9pbXBsIComIGxvYyApOworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9NU1ZDNl9NRU1fVF9CVUdfV09SS0FST1VORCkgfHwgXAorICAgIGRlZmluZWQgKF9TVExQX1NJR05BTF9SVU5USU1FX0NPTVBBVElCSUxJVFkpIHx8IGRlZmluZWQgKF9TVExQX0NIRUNLX1JVTlRJTUVfQ09NUEFUSUJJTElUWSkKKyAgICBmcmllbmQgY2xhc3MgX1NUTFBfTk9fTUVNX1RfTkFNRShsb2MpOworI2Vsc2UKKyAgICBmcmllbmQgY2xhc3MgbG9jYWxlOworI2VuZGlmCit9OworCit2b2lkIF9TVExQX0NBTEwgX3JlbGVhc2VfTG9jYWxlX2ltcGwoIF9Mb2NhbGVfaW1wbCAqJiBsb2MgKTsKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYKKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3NyYy9sb2NrX2ZyZWVfc2xpc3QuaCBiL3NyYy9sb2NrX2ZyZWVfc2xpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yzc1M2QxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2xvY2tfZnJlZV9zbGlzdC5oCkBAIC0wLDAgKzEsMzA3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk3LTE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfTE9DS19GUkVFX1NMSVNUX0gKKyNkZWZpbmUgX1NUTFBfTE9DS19GUkVFX1NMSVNUX0gKKworI2lmIGRlZmluZWQoX1NUTFBfUFRIUkVBRFMpCisjICBpbmNsdWRlIDxwdGhyZWFkLmg+CisKKyMgIGlmIGRlZmluZWQgKF9fR05VQ19fKSAmJiBkZWZpbmVkIChfX2kzODZfXykKKworIyAgICBkZWZpbmUgX1NUTFBfSEFTX0FUT01JQ19GUkVFTElTVAorLyoqCisgKiBDbGFzcyB0aGF0IGltcGxlbWVudHMgYSBub24tYmxvY2tpbmcgYW5kIHRocmVhZC1zYWZlIGZyZWVsaXN0LgorICogSXQgaXMgdXNlZCBmb3IgdGhlIGxvY2stZnJlZSBub2RlIGFsbG9jYXRpb24gZW5naW5lLgorICoKKyAqIEBhdXRob3IgZmVsaXh3QGluaW4uY29tCisgKi8KK2NsYXNzIF9TVExQX2F0b21pY19mcmVlbGlzdCB7CitwdWJsaWM6CisgIC8qKgorICAgKiBUeXBlIHJlcHJlc2VudGluZyBpdGVtcyBvZiB0aGUgZnJlZWxpc3QKKyAgICovCisgIHN0cnVjdCBpdGVtIHsKKyAgICBpdGVtKiBfTV9uZXh0OworICB9OworCisgIF9TVExQX2F0b21pY19mcmVlbGlzdCgpIHsKKyAgICAvLyBTdGF0aWNhbGx5IGFzc2VydCBsYXlvdXQgb2YgbWVtYmVyIGlzIGFzIGV4cGVjdGVkIGJ5IGFzc2VtYmx5IGNvZGUKKyAgICBfU1RMUF9TVEFUSUNfQVNTRVJUKHNpemVvZihfTSkgPT0gOCkKKyAgICBfTS5fTV9kYXRhLl9NX3RvcCAgICAgICA9IDA7CisgICAgX00uX01fZGF0YS5fTV9zZXF1ZW5jZSAgPSAwOworICB9CisKKyAgLyoqCisgICAqIEF0b21pY2FsbHkgcHVzaGVzIHRoZSBzcGVjaWZpZWQgaXRlbSBvbnRvIHRoZSBmcmVlbGlzdC4KKyAgICoKKyAgICogQHBhcmFtIF9faXRlbSBbaW5dIEl0ZW0gdG8gYWRkIHRvIHRoZSBmcm9udCBvZiB0aGUgbGlzdAorICAgKi8KKyAgdm9pZCBwdXNoKGl0ZW0qIF9faXRlbSkgeworICAgIC8vIE5PVEU6IEdDQyB1c2VzIGVieCBhcyB0aGUgUElDIHJlZ2lzdGVyIGZvciBnbG9iYWxzIGluIHNoYXJlZCBsaWJyYXJpZXMuCisgICAgLy8gICAgICAgVGhlIEdDQyB2ZXJzaW9uIEknbSB1c2luZyAoMy40LjEpIHdvbid0IHRlbXBvcmFyaWx5IHNwaWxsIGl0IGlmIGl0J3MKKyAgICAvLyAgICAgICB1c2VkIGFzIGlucHV0LCBvdXRwdXQsIG9yIGNsb2JiZXIuICBJbnN0ZWFkLCBpdCBjb21wbGFpbnMgd2l0aCBhCisgICAgLy8gICAgICAgImNhbid0IGZpbmQgYSByZWdpc3RlciBpbiBjbGFzcyBgQlJFRycgd2hpbGUgcmVsb2FkaW5nIGBhc20nIiBlcnJvci4KKyAgICAvLyAgICAgICBUaGlzIGlzIHByb2JhYmx5IGEgY29tcGlsZXIgYnVnLCBidXQgYXMgdGhlIGNtcHhjaGc4YiBpbnN0cnVjdGlvbgorICAgIC8vICAgICAgIHJlcXVpcmVzIGVieCwgSSB3b3JrIGFyb3VuZCB0aGlzIGhlcmUgYnkgdXNpbmcgZWN4IGZvciB0aGUgJ19faXRlbScKKyAgICAvLyAgICAgICBpbnB1dCBhbmQgc3BpbGxpbmcgZWJ4IGludG8gZWRpLiAgVGhpcyBhbHNvIHByZWNsdWRlcyB1cyBmcm9tIHVzaW5nCisgICAgLy8gICAgICAgYSAibSIgb3BlcmFuZCBmb3IgdGhlIGNtcHhjaGc4YiBhcmd1bWVudCAoR0NDIG1pZ2h0IHRoaW5rIGl0IGNhbiBtYWtlCisgICAgLy8gICAgICAgaXQgcmVsYXRpdmUgdG8gZWJ4KS4gIEluc3RlYWQsIHdlJ3JlIHVzaW5nIGVzaSBmb3IgdGhlIGFkZHJlc3Mgb2YgX01fZGF0YS4KKyAgICAvLworICAgIGludCBfX3RtcDE7ICAgICAvLyBUaGVzZSBkdW1teSB2YXJpYWJsZXMgYXJlIHVzZWQgdG8gdGVsbCBHQ0MgdGhhdCB0aGUgZWF4LCBlY3gsCisgICAgaW50IF9fdG1wMjsgICAgIC8vIGFuZCBlZHggcmVnaXN0ZXJzIHdpbGwgbm90IGhhdmUgdGhlIHNhbWUgdmFsdWUgYXMgdGhlaXIgaW5wdXQuCisgICAgaW50IF9fdG1wMzsgICAgIC8vIFRoZSBvcHRpbWl6ZXIgd2lsbCByZW1vdmUgdGhlbSBhcyB0aGVpciB2YWx1ZXMgYXJlIG5vdCB1c2VkLgorICAgIF9fYXNtX18gX192b2xhdGlsZV9fCisgICAgICAoIiAgICAgICBtb3ZsICAgICAgICUlZWJ4LCAlJWVkaVxuXHQiCisgICAgICAgIiAgICAgICBtb3ZsICAgICAgICUlZWN4LCAlJWVieFxuXHQiCisgICAgICAgIkwxXyU9OiBtb3ZsICAgICAgICUlZWF4LCAoJSVlYngpXG5cdCIgICAgIC8vIF9faXRlbS5fTV9uZXh0ID0gX00uX01fZGF0YS5fTV90b3AKKyAgICAgICAiICAgICAgIGxlYWwgICAgICAgMSglJWVkeCksJSVlY3hcblx0IiAgICAgLy8gbmV3IHNlcXVlbmNlID0gX00uX01fZGF0YS5fTV9zZXF1ZW5jZSArIDEKKyAgICAgICAibG9jazsgIGNtcHhjaGc4YiAgKCUlZXNpKVxuXHQiCisgICAgICAgIiAgICAgICBqbmUgICAgICAgIEwxXyU9XG5cdCIgICAgICAgICAgICAgIC8vIEZhaWxlZCwgcmV0cnkhIChlZHg6ZWF4IG5vdyBjb250YWluIG1vc3QgcmVjZW50IF9NX3NlcXVlbmNlOl9NX3RvcCkKKyAgICAgICAiICAgICAgIG1vdmwgICAgICAgJSVlZGksICUlZWJ4IgorICAgICAgOiI9YSIgKF9fdG1wMSksICI9ZCIgKF9fdG1wMiksICI9YyIgKF9fdG1wMykKKyAgICAgIDoiYSIgKF9NLl9NX2RhdGEuX01fdG9wKSwgImQiIChfTS5fTV9kYXRhLl9NX3NlcXVlbmNlKSwgImMiIChfX2l0ZW0pLCAiUyIgKCZfTS5fTV9kYXRhKQorICAgICAgOiJlZGkiLCAibWVtb3J5IiwgImNjIik7CisgIH0KKworICAvKioKKyAgICogQXRvbWljYWxseSByZW1vdmVzIHRoZSB0b3Btb3N0IGl0ZW0gZnJvbSB0aGUgZnJlZWxpc3QgYW5kIHJldHVybnMgYQorICAgKiBwb2ludGVyIHRvIGl0LiAgUmV0dXJucyBOVUxMIGlmIHRoZSBsaXN0IGlzIGVtcHR5LgorICAgKgorICAgKiBAcmV0dXJuIEl0ZW0gdGhhdCB3YXMgcmVtb3ZlZCBmcm9tIGZyb250IG9mIGxpc3Q7IE5VTEwgaWYgbGlzdCBlbXB0eQorICAgKi8KKyAgaXRlbSogcG9wKCkgeworICAgIGl0ZW0qICAgX19yZXN1bHQ7CisgICAgaW50ICAgICBfX3RtcDsKKyAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXworICAgICAgKCIgICAgICAgbW92bCAgICAgICAlJWVieCwgJSVlZGlcblx0IgorICAgICAgICJMMV8lPTogdGVzdGwgICAgICAlJWVheCwgJSVlYXhcblx0IiAgICAgICAvLyBfTV90b3AgPT0gTlVMTD8KKyAgICAgICAiICAgICAgIGplICAgICAgICAgTDJfJT1cblx0IiAgICAgICAgICAgICAgLy8gSWYgeWVzLCB3ZSdyZSBkb25lCisgICAgICAgIiAgICAgICBtb3ZsICAgICAgICglJWVheCksICUlZWJ4XG5cdCIgICAgIC8vIG5ldyB0b3AgPSBfTS5fTV9kYXRhLl9NX3RvcC0+X01fbmV4dAorICAgICAgICIgICAgICAgbGVhbCAgICAgICAxKCUlZWR4KSwlJWVjeFxuXHQiICAgICAvLyBuZXcgc2VxdWVuY2UgPSBfTS5fTV9kYXRhLl9NX3NlcXVlbmNlICsgMQorICAgICAgICJsb2NrOyAgY21weGNoZzhiICAoJSVlc2kpXG5cdCIKKyAgICAgICAiICAgICAgIGpuZSAgICAgICAgTDFfJT1cblx0IiAgICAgICAgICAgICAgLy8gV2UgZmFpbGVkLCByZXRyeSEgKGVkeDplYXggbm93IGNvbnRhaW4gbW9zdCByZWNlbnQgX01fc2VxdWVuY2U6X01fdG9wKQorICAgICAgICJMMl8lPTogbW92bCAgICAgICAlJWVkaSwgJSVlYngiCisgICAgICA6Ij1hIiAoX19yZXN1bHQpLCAiPWQiIChfX3RtcCkKKyAgICAgIDoiYSIgKF9NLl9NX2RhdGEuX01fdG9wKSwgImQiIChfTS5fTV9kYXRhLl9NX3NlcXVlbmNlKSwgIlMiICgmX00uX01fZGF0YSkKKyAgICAgIDoiZWRpIiwgImVjeCIsICJtZW1vcnkiLCAiY2MiKTsKKyAgICByZXR1cm4gX19yZXN1bHQ7CisgIH0KKworICAvKioKKyAgICogQXRvbWljYWxseSBkZXRhY2hlcyBhbGwgaXRlbXMgZnJvbSB0aGUgbGlzdCBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlCisgICAqIHRvcG1vc3QgaXRlbS4gIFRoZSBpdGVtcyBhcmUgc3RpbGwgY2hhaW5lZCBhbmQgbWF5IGJlIHRyYXZlcnNlZCBzYWZlbHkgYXMKKyAgICogdGhleSdyZSBub3cgIm93bmVkIiBieSB0aGUgY2FsbGluZyB0aHJlYWQuCisgICAqCisgICAqIEByZXR1cm4gUG9pbnRlciB0byB0b3Btb3N0IGl0ZW0gaW4gdGhlIGxpc3Q7IE5VTEwgaWYgbGlzdCBlbXB0eQorICAgKi8KKyAgaXRlbSogY2xlYXIoKSB7CisgICAgaXRlbSogICBfX3Jlc3VsdDsKKyAgICBpbnQgICAgIF9fdG1wOworICAgIF9fYXNtX18gX192b2xhdGlsZV9fCisgICAgICAoIiAgICAgICBtb3ZsICAgICAgICUlZWJ4LCAlJWVkaVxuXHQiCisgICAgICAgIkwxXyU9OiB0ZXN0bCAgICAgICUlZWF4LCAlJWVheFxuXHQiICAgICAgIC8vIF9NX3RvcCA9PSBOVUxMPworICAgICAgICIgICAgICAgamUgICAgICAgICBMMl8lPVxuXHQiICAgICAgICAgICAgICAvLyBJZiB5ZXMsIHdlJ3JlIGRvbmUKKyAgICAgICAiICAgICAgIHhvcmwgICAgICAgJSVlYngsICUlZWJ4XG5cdCIgICAgICAgLy8gV2UncmUgYXR0ZW1wdGluZyB0byBzZXQgX01fdG9wIHRvIE5VTEwKKyAgICAgICAiICAgICAgIGxlYWwgICAgICAgMSglJWVkeCksJSVlY3hcblx0IiAgICAgLy8gbmV3IHNlcXVlbmNlID0gX00uX01fZGF0YS5fTV9zZXF1ZW5jZSArIDEKKyAgICAgICAibG9jazsgIGNtcHhjaGc4YiAgKCUlZXNpKVxuXHQiCisgICAgICAgIiAgICAgICBqbmUgICAgICAgIEwxXyU9XG5cdCIgICAgICAgICAgICAgIC8vIEZhaWxlZCwgcmV0cnkhIChlZHg6ZWF4IG5vdyBjb250YWluIG1vc3QgcmVjZW50IF9NX3NlcXVlbmNlOl9NX3RvcCkKKyAgICAgICAiTDJfJT06IG1vdmwgICAgICAgJSVlZGksICUlZWJ4IgorICAgICAgOiI9YSIgKF9fcmVzdWx0KSwgIj1kIiAoX190bXApCisgICAgICA6ImEiIChfTS5fTV9kYXRhLl9NX3RvcCksICJkIiAoX00uX01fZGF0YS5fTV9zZXF1ZW5jZSksICJTIiAoJl9NLl9NX2RhdGEpCisgICAgICA6ImVkaSIsICJlY3giLCAibWVtb3J5IiwgImNjIik7CisgICAgcmV0dXJuIF9fcmVzdWx0OworICB9CisKK3ByaXZhdGU6CisgICAgdW5pb24geworICAgICAgbG9uZyBsb25nICAgX01fYWxpZ247CisgICAgICBzdHJ1Y3QgeworICAgICAgICBpdGVtKiAgICAgICAgICAgX01fdG9wOyAgICAgICAgIC8vIFRvcG1vc3QgZWxlbWVudCBpbiB0aGUgZnJlZWxpc3QKKyAgICAgICAgdW5zaWduZWQgaW50ICAgIF9NX3NlcXVlbmNlOyAgICAvLyBTZXF1ZW5jZSBjb3VudGVyIHRvIHByZXZlbnQgIkFCQSBwcm9ibGVtIgorICAgICAgfSBfTV9kYXRhOworICAgIH0gX007CisKKyAgX1NUTFBfYXRvbWljX2ZyZWVsaXN0KGNvbnN0IF9TVExQX2F0b21pY19mcmVlbGlzdCYpOworICBfU1RMUF9hdG9taWNfZnJlZWxpc3QmIG9wZXJhdG9yPShjb25zdCBfU1RMUF9hdG9taWNfZnJlZWxpc3QmKTsKK307CisKKyMgIGVuZGlmIC8qIGlmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19pMzg2X18pICovCisKKyNlbGlmIGRlZmluZWQgKF9TVExQX1dJTjMyVEhSRUFEUykKKworIyAgaWYgIWRlZmluZWQgKF9XSU42NCkKKyMgICAgZGVmaW5lIF9TVExQX1VTRV9BU01fSU1QTEVNRU5UQVRJT04KKyMgIGVuZGlmCisKKy8vIEhlcmUgYXJlIHRoZSBjb21waWxlci9wbGF0Zm9ybSByZXF1aXJlbWVudHMgZm9yIHRoZSB0aHJlYWQgc2FmZSBhbmQKKy8vIGxvY2sgZnJlZSBzaW5nbHkgbGlua2VkIGxpc3QgaW1wbGVtZW50YXRpb246CisjICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfQVNNX0lNUExFTUVOVEFUSU9OKQorLy8gRm9yIHRoZSBhc20gdmVyc2lvbjoKKyMgICAgaWYgZGVmaW5lZCAoX1NUTFBfTVNWQykgJiYgZGVmaW5lZCAoX01fSVg4NikgJiYgKF9NX0lYODYgPj0gNTAwKQorIyAgICAgIGRlZmluZSBfU1RMUF9IQVNfQVRPTUlDX0ZSRUVMSVNUCisjICAgIGVuZGlmCisjICBlbHNlCisvLyBGb3IgdGhlIEFQSSBiYXNlZCB2ZXJzaW9uOgorIyAgICBpZiBkZWZpbmVkIChfU1RMUF9ORVdfUExBVEZPUk1fU0RLKSAmJiAoIWRlZmluZWQgKFdJTlZFUikgfHwgKFdJTlZFUiA+PSAweDA1MDEpKSAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICghZGVmaW5lZCAoX1dJTjMyX1dJTk5UKSB8fCAoX1dJTjMyX1dJTk5UID49IDB4MDUwMSkpCisjICAgICAgZGVmaW5lIF9TVExQX0hBU19BVE9NSUNfRlJFRUxJU1QKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisKKyMgIGlmIGRlZmluZWQgKF9TVExQX0hBU19BVE9NSUNfRlJFRUxJU1QpCisjICAgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9BU01fSU1QTEVNRU5UQVRJT04pCisjICAgICAgaWYgZGVmaW5lZCAoX1NUTFBfTVNWQykgJiYgKF9TVExQX01TVkMgPCAxMzAwKSB8fCBkZWZpbmVkIChfX0lDTCkKKyMgICAgICAgIHByYWdtYSB3YXJuaW5nIChwdXNoKQorIyAgICAgICAgcHJhZ21hIHdhcm5pbmcgKGRpc2FibGUgOiA0MDM1KSAvL2Z1bmN0aW9uIGhhcyBubyByZXR1cm4gdmFsdWUKKyMgICAgICBlbmRpZgorIyAgICBlbmRpZgorLyoqCisgKiBDbGFzcyB0aGF0IGltcGxlbWVudHMgYSBub24tYmxvY2tpbmcgYW5kIHRocmVhZC1zYWZlIGZyZWVsaXN0LgorICogSXQgaXMgdXNlZCBmb3IgdGhlIGxvY2stZnJlZSBub2RlIGFsbG9jYXRpb24gZW5naW5lLgorICoKKyAqIEBhdXRob3IgZmVsaXh3QGluaW4uY29tCisgKi8KK2NsYXNzIF9TVExQX2F0b21pY19mcmVlbGlzdCB7CitwdWJsaWM6CisgIC8qKgorICAgKiBUeXBlIHJlcHJlc2VudGluZyBpdGVtcyBvZiB0aGUgZnJlZWxpc3QKKyAgICovCisjICAgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9BU01fSU1QTEVNRU5UQVRJT04pCisgIHN0cnVjdCBpdGVtIHsKKyAgICAgIGl0ZW0qICAgX01fbmV4dDsKKyAgfTsKKyMgICAgZWxzZQorICB0eXBlZGVmIFNMSVNUX0VOVFJZIGl0ZW07CisjICAgIGVuZGlmCisKKyAgX1NUTFBfYXRvbWljX2ZyZWVsaXN0KCkgeworICAgIC8vIFN0YXRpY2FsbHkgYXNzZXJ0IGxheW91dCBvZiBtZW1iZXIgaXMgYXMgZXhwZWN0ZWQgYnkgYXNzZW1ibHkgY29kZQorIyAgICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfQVNNX0lNUExFTUVOVEFUSU9OKQorICAgIF9TVExQX1NUQVRJQ19BU1NFUlQoKHNpemVvZihpdGVtKSA9PSBzaXplb2YoaXRlbSopKSAmJiAoc2l6ZW9mKF9NKSA9PSA4KSkKKyAgICBfTS5fTV9kYXRhLl9NX3RvcCAgICAgICA9IDA7CisgICAgX00uX01fZGF0YS5fTV9zZXF1ZW5jZSAgPSAwOworIyAgICBlbHNlCisgICAgSW5pdGlhbGl6ZVNMaXN0SGVhZCgmX01faGVhZCk7CisjICAgIGVuZGlmCisgIH0KKworICAvKioKKyAgICogQXRvbWljYWxseSBwdXNoZXMgdGhlIHNwZWNpZmllZCBpdGVtIG9udG8gdGhlIGZyZWVsaXN0LgorICAgKgorICAgKiBAcGFyYW0gX19pdGVtIFtpbl0gSXRlbSB0byBhZGQgdG8gdGhlIGZyb250IG9mIHRoZSBsaXN0CisgICAqLworICB2b2lkIHB1c2goaXRlbSogX19pdGVtKSB7CisjICAgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9BU01fSU1QTEVNRU5UQVRJT04pCisgICAgX19hc20KKyAgICB7CisgICAgICAgIG1vdiAgICAgICAgICAgICBlc2ksIHRoaXMKKyAgICAgICAgbW92ICAgICAgICAgICAgIGVieCwgX19pdGVtCisgICAgICAgIG1vdiAgICAgICAgICAgICBlYXgsIFtlc2ldICAgICAgICAgICAgICAvLyBfTS5fTV9kYXRhLl9NX3RvcAorICAgICAgICBtb3YgICAgICAgICAgICAgZWR4LCBbZXNpKzRdICAgICAgICAgICAgLy8gX00uX01fZGF0YS5fTV9zZXF1ZW5jZQorICAgIEwxOiBtb3YgICAgICAgICAgICAgW2VieF0sIGVheCAgICAgICAgICAgICAgLy8gX19pdGVtLl9NX25leHQgPSBfTS5fTV9kYXRhLl9NX3RvcAorICAgICAgICBsZWEgICAgICAgICAgICAgZWN4LCBbZWR4KzFdICAgICAgICAgICAgLy8gbmV3IHNlcXVlbmNlID0gX00uX01fZGF0YS5fTV9zZXF1ZW5jZSArIDEKKyAgICAgICAgbG9jayBjbXB4Y2hnOGIgIHF3b3JkIHB0ciBbZXNpXQorICAgICAgICBqbmUgICAgICAgICAgICAgTDEgICAgICAgICAgICAgICAgICAgICAgLy8gRmFpbGVkLCByZXRyeSEgKGVkeDplYXggbm93IGNvbnRhaW4gbW9zdCByZWNlbnQgX01fc2VxdWVuY2U6X01fdG9wKQorICAgIH0KKyMgICAgZWxzZQorICAgIEludGVybG9ja2VkUHVzaEVudHJ5U0xpc3QoJl9NX2hlYWQsIF9faXRlbSk7CisjICAgIGVuZGlmCisgIH0KKworICAvKioKKyAgICogQXRvbWljYWxseSByZW1vdmVzIHRoZSB0b3Btb3N0IGl0ZW0gZnJvbSB0aGUgZnJlZWxpc3QgYW5kIHJldHVybnMgYQorICAgKiBwb2ludGVyIHRvIGl0LiAgUmV0dXJucyBOVUxMIGlmIHRoZSBsaXN0IGlzIGVtcHR5LgorICAgKgorICAgKiBAcmV0dXJuIEl0ZW0gdGhhdCB3YXMgcmVtb3ZlZCBmcm9tIGZyb250IG9mIGxpc3Q7IE5VTEwgaWYgbGlzdCBlbXB0eQorICAgKi8KKyAgaXRlbSogcG9wKCkgeworIyAgICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfQVNNX0lNUExFTUVOVEFUSU9OKQorICAgIF9fYXNtCisgICAgeworICAgICAgICBtb3YgICAgICAgICAgICAgZXNpLCB0aGlzCisgICAgICAgIG1vdiAgICAgICAgICAgICBlYXgsIFtlc2ldICAgICAgICAgICAgICAvLyBfTS5fTV9kYXRhLl9NX3RvcAorICAgICAgICBtb3YgICAgICAgICAgICAgZWR4LCBbZXNpKzRdICAgICAgICAgICAgLy8gX00uX01fZGF0YS5fTV9zZXF1ZW5jZQorICAgIEwxOiB0ZXN0ICAgICAgICAgICAgZWF4LCBlYXggICAgICAgICAgICAgICAgLy8gX01fdG9wID09IE5VTEw/CisgICAgICAgIGplICAgICAgICAgICAgICBMMiAgICAgICAgICAgICAgICAgICAgICAvLyBZZXMsIHdlJ3JlIGRvbmUKKyAgICAgICAgbW92ICAgICAgICAgICAgIGVieCwgW2VheF0gICAgICAgICAgICAgIC8vIG5ldyB0b3AgPSBfTS5fTV9kYXRhLl9NX3RvcC0+X01fbmV4dAorICAgICAgICBsZWEgICAgICAgICAgICAgZWN4LCBbZWR4KzFdICAgICAgICAgICAgLy8gbmV3IHNlcXVlbmNlID0gX00uX01fZGF0YS5fTV9zZXF1ZW5jZSArIDEKKyAgICAgICAgbG9jayBjbXB4Y2hnOGIgIHF3b3JkIHB0ciBbZXNpXQorICAgICAgICBqbmUgICAgICAgICAgICAgTDEgICAgICAgICAgICAgICAgICAgICAgLy8gRmFpbGVkLCByZXRyeSEgKGVkeDplYXggbm93IGNvbnRhaW4gbW9zdCByZWNlbnQgX01fc2VxdWVuY2U6X01fdG9wKQorICAgIEwyOgorICAgIH0KKyMgICAgZWxzZQorICAgIHJldHVybiBJbnRlcmxvY2tlZFBvcEVudHJ5U0xpc3QoJl9NX2hlYWQpOworIyAgICBlbmRpZgorICB9CisKKyAgLyoqCisgICAqIEF0b21pY2FsbHkgZGV0YWNoZXMgYWxsIGl0ZW1zIGZyb20gdGhlIGxpc3QgYW5kIHJldHVybnMgcG9pbnRlciB0byB0aGUKKyAgICogdG9wbW9zdC4gIFRoZSBpdGVtcyBhcmUgc3RpbGwgY2hhaW5lZCBhbmQgbWF5IGJlIHRyYXZlcnNlZCBzYWZlbHkgYXMKKyAgICogdGhleSdyZSBub3cgIm93bmVkIiBieSB0aGUgY2FsbGluZyB0aHJlYWQuCisgICAqCisgICAqIEByZXR1cm4gUG9pbnRlciB0byB0b3Btb3N0IGl0ZW0gaW4gdGhlIGxpc3Q7IE5VTEwgaWYgbGlzdCBlbXB0eQorICAgKi8KKyAgaXRlbSogY2xlYXIoKSB7CisjICAgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9BU01fSU1QTEVNRU5UQVRJT04pCisgICAgX19hc20KKyAgICB7CisgICAgICAgIG1vdiAgICAgICAgICAgICBlc2ksIHRoaXMKKyAgICAgICAgbW92ICAgICAgICAgICAgIGVheCwgW2VzaV0gICAgICAgICAgICAgIC8vIF9NLl9NX2RhdGEuX01fdG9wCisgICAgICAgIG1vdiAgICAgICAgICAgICBlZHgsIFtlc2krNF0gICAgICAgICAgICAvLyBfTS5fTV9kYXRhLl9NX3NlcXVlbmNlCisgICAgTDE6IHRlc3QgICAgICAgICAgICBlYXgsIGVheCAgICAgICAgICAgICAgICAvLyBfTV90b3AgPT0gTlVMTD8KKyAgICAgICAgamUgICAgICAgICAgICAgIEwyICAgICAgICAgICAgICAgICAgICAgIC8vIFllcywgd2UncmUgZG9uZQorICAgICAgICB4b3IgICAgICAgICAgICAgZWJ4LGVieCAgICAgICAgICAgICAgICAgLy8gV2UncmUgYXR0ZW1wdGluZyB0byBzZXQgX00uX01fZGF0YS5fTV90b3AgdG8gTlVMTAorICAgICAgICBsZWEgICAgICAgICAgICAgZWN4LCBbZWR4KzFdICAgICAgICAgICAgLy8gbmV3IHNlcXVlbmNlID0gX00uX01fZGF0YS5fTV9zZXF1ZW5jZSArIDEKKyAgICAgICAgbG9jayBjbXB4Y2hnOGIgIHF3b3JkIHB0ciBbZXNpXQorICAgICAgICBqbmUgICAgICAgICAgICAgTDEgICAgICAgICAgICAgICAgICAgICAgLy8gRmFpbGVkLCByZXRyeSEgKGVkeDplYXggbm93IGNvbnRhaW4gbW9zdCByZWNlbnQgX01fc2VxdWVuY2U6X01fdG9wKQorICAgIEwyOgorICAgIH0KKyMgICAgZWxzZQorICAgIHJldHVybiBJbnRlcmxvY2tlZEZsdXNoU0xpc3QoJl9NX2hlYWQpOworIyAgICBlbmRpZgorICB9CisKK3ByaXZhdGU6CisjICAgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9BU01fSU1QTEVNRU5UQVRJT04pCisgIHVuaW9uIHsKKyAgICBfX2ludDY0ICAgICBfTV9hbGlnbjsKKyAgICBzdHJ1Y3QgeworICAgICAgaXRlbSogICAgICAgICAgIF9NX3RvcDsgICAgICAgICAvLyBUb3Btb3N0IGVsZW1lbnQgaW4gdGhlIGZyZWVsaXN0CisgICAgICB1bnNpZ25lZCBpbnQgICAgX01fc2VxdWVuY2U7ICAgIC8vIFNlcXVlbmNlIGNvdW50ZXIgdG8gcHJldmVudCAiQUJBIHByb2JsZW0iCisgICAgfSBfTV9kYXRhOworICB9IF9NOworIyAgICBlbHNlCisgIFNMSVNUX0hFQURFUiBfTV9oZWFkOworIyAgICBlbmRpZgorCisgIF9TVExQX2F0b21pY19mcmVlbGlzdChjb25zdCBfU1RMUF9hdG9taWNfZnJlZWxpc3QmKTsKKyAgX1NUTFBfYXRvbWljX2ZyZWVsaXN0JiBvcGVyYXRvciA9IChjb25zdCBfU1RMUF9hdG9taWNfZnJlZWxpc3QmKTsKK307CisKKyMgICAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX0FTTV9JTVBMRU1FTlRBVElPTikKKyMgICAgICBpZiBkZWZpbmVkIChfU1RMUF9NU1ZDKSAmJiAoX1NUTFBfTVNWQyA8IDEzMDApIHx8IGRlZmluZWQgKF9fSUNMKQorIyAgICAgICAgcHJhZ21hIHdhcm5pbmcgKHBvcCkKKyMgICAgICBlbmRpZgorIyAgICBlbmRpZgorCisjICBlbmRpZiAvKiBfU1RMUF9IQVNfQVRPTUlDX0ZSRUVMSVNUICovCisKKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfTE9DS19GUkVFX1NMSVNUX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9tZXNzYWdlX2ZhY2V0cy5oIGIvc3JjL21lc3NhZ2VfZmFjZXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ2YjUyOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tZXNzYWdlX2ZhY2V0cy5oCkBAIC0wLDAgKzEsMTUyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworI2lmbmRlZiBNRVNTQUdFX0ZBQ0VUU19ICisjZGVmaW5lIE1FU1NBR0VfRkFDRVRTX0gKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxsb2NhbGU+CisjaW5jbHVkZSA8aGFzaF9tYXA+CisKKyNpbmNsdWRlICJjX2xvY2FsZS5oIgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKworLy8gQ2xhc3MgX0NhdGFsb2dfbG9jYWxlX21hcC4gIFRoZSByZWFzb24gZm9yIHRoaXMgaXMgdGhhdCwgaW50ZXJuYWxseSwKKy8vIGEgbWVzc2FnZSBzdHJpbmcgaXMgYWx3YXlzIGEgY2hhciouICBXZSBuZWVkIGEgY3R5cGUgZmFjZXQgdG8gY29udmVydAorLy8gYSBzdHJpbmcgdG8gYW5kIGZyb20gd2NoYXJfdCwgYW5kIHRoZSB1c2VyIGlzIHBlcm1pdHRlZCB0byBwcm92aWRlIHN1Y2gKKy8vIGEgZmFjZXQgd2hlbiBjYWxsaW5nIG9wZW4oKS4KKworc3RydWN0IF9DYXRhbG9nX2xvY2FsZV9tYXAgeworICBfQ2F0YWxvZ19sb2NhbGVfbWFwKCkgOiBNKDApIHt9CisgIH5fQ2F0YWxvZ19sb2NhbGVfbWFwKCkgeyBpZiAoTSkgZGVsZXRlIE07IH0KKworICB2b2lkIGluc2VydChubF9jYXRkX3R5cGUga2V5LCBjb25zdCBsb2NhbGUmIEwpOworICBsb2NhbGUgbG9va3VwKG5sX2NhdGRfdHlwZSBrZXkpIGNvbnN0OworICB2b2lkIGVyYXNlKG5sX2NhdGRfdHlwZSBrZXkpOworCisgIHR5cGVkZWYgaGFzaF9tYXA8bmxfY2F0ZF90eXBlLCBsb2NhbGUsIGhhc2g8bmxfY2F0ZF90eXBlPiwgZXF1YWxfdG88bmxfY2F0ZF90eXBlPiwgCisgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yPHBhaXI8X1NUTFBfQ09OU1QgbmxfY2F0ZF90eXBlLCBsb2NhbGU+ID4gPiBtYXBfdHlwZTsKKyAgbWFwX3R5cGUgKk07CisKK3ByaXZhdGU6ICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW52YWxpZGF0ZSBjb3B5IGNvbnN0cnVjdG9yIGFuZCBhc3NpZ25tZW50CisgIF9DYXRhbG9nX2xvY2FsZV9tYXAoY29uc3QgX0NhdGFsb2dfbG9jYWxlX21hcCYpOworICB2b2lkIG9wZXJhdG9yPShjb25zdCBfQ2F0YWxvZ19sb2NhbGVfbWFwJik7Cit9OworCisvKgorICogSW4gZ2xpYmMgbmxfY2F0ZCB0eXBlIGlzIHZvaWQgKiwgYnV0IG1lc3NhZ2VzX2Jhc2U6OmNhdGFsb2cgaXMgZGVmaW5lZCBhcyBpbnQKKyAqIGJ5IElTTy9JRUMgMTQ4ODI7IFRoZSBpbnQgbWF5IGJlIHRvbyBzaG9ydCB0byBzdG9yZSBwb2ludGVyIG9uIDY0LWJpdCBwbGF0Zm9ybXM7CisgKiBBbm90aGVyIHByb2JsZW0sIGlzIHRoYXQgZG9fb3BlbigpIG1heSByZXR1cm4gbmVnYXRpdmUgdmFsdWUgdG8gaW5kaWNhdGUgdGhhdCBubworICogY2F0YWxvZyBvcGVuLS0tdGhpcyBjYXNlIGNhbid0IGJlIHJlcHJlc2VudGVkIHdpdGggcG9pbnRlcnMuCisgKiBUaGUgY2xhc3MgX0NhdGFsb2dfbmxfY2F0ZF9tYXAgaW50ZW5kZWQgdG8gbWFrZSByZWxhdGlvbiBiZXR3ZWVuCisgKiBtZXNzYWdlc19iYXNlOjpjYXRhbG9nIGFuZCBubF9jYXRkIGhhbmRsZXIuCisgKgorICovCisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfR0xJQkMyX0xPQ0FMSVpBVElPTikKKyMgIGRlZmluZSBfU1RMUF9VU0VfTkxfQ0FURF9NQVBQSU5HCisjZWxzZQorLyogSWYgbm8gbWFwcGluZyBhIG1lc3NhZ2VfYmFzZTo6Y2F0YWxvZyBlbnRyeSwgaW50IHR5cGVkZWYgYWNjb3JkaW5nIEMrKyBTdGFuZGFyZCAyMi4yLjcuMSwKKyAqIGhhcyB0byBiZSBsYXJnZSBlbm91Z2ggdG8gY29udGFpbiBhIG5sX2NhdGRfdHlwZSB2YWx1ZS4KKyAqLworX1NUTFBfU1RBVElDX0FTU0VSVChzaXplb2YobmxfY2F0ZF90eXBlKSA8PSBzaXplb2YoaW50KSkKKyNlbmRpZgorCitjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBfQ2F0YWxvZ19ubF9jYXRkX21hcCB7CitwdWJsaWM6CisgIF9DYXRhbG9nX25sX2NhdGRfbWFwKCkKKyAge30KKyAgfl9DYXRhbG9nX25sX2NhdGRfbWFwKCkKKyAge30KKworICB0eXBlZGVmIGhhc2hfbWFwPG1lc3NhZ2VzX2Jhc2U6OmNhdGFsb2csIG5sX2NhdGRfdHlwZSwgaGFzaDxtZXNzYWdlc19iYXNlOjpjYXRhbG9nPiwgZXF1YWxfdG88bWVzc2FnZXNfYmFzZTo6Y2F0YWxvZz4sCisgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yPHBhaXI8X1NUTFBfQ09OU1QgbWVzc2FnZXNfYmFzZTo6Y2F0YWxvZywgbmxfY2F0ZF90eXBlPiA+ID4gbWFwX3R5cGU7CisgIHR5cGVkZWYgaGFzaF9tYXA8bmxfY2F0ZF90eXBlLCBtZXNzYWdlc19iYXNlOjpjYXRhbG9nLCBoYXNoPG5sX2NhdGRfdHlwZT4sIGVxdWFsX3RvPG5sX2NhdGRfdHlwZT4sCisgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yPHBhaXI8X1NUTFBfQ09OU1QgbmxfY2F0ZF90eXBlLCBtZXNzYWdlc19iYXNlOjpjYXRhbG9nPiA+ID4gcm1hcF90eXBlOworICAvLyB0eXBlZGVmIG1hcDxtZXNzYWdlc19iYXNlOjpjYXRhbG9nLG5sX2NhdGRfdHlwZT4gbWFwX3R5cGU7CisgIC8vIHR5cGVkZWYgbWFwPG5sX2NhdGRfdHlwZSxtZXNzYWdlc19iYXNlOjpjYXRhbG9nPiBybWFwX3R5cGU7CisKKyAgbWVzc2FnZXNfYmFzZTo6Y2F0YWxvZyBpbnNlcnQobmxfY2F0ZF90eXBlIGNhdCkKKyNpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX05MX0NBVERfTUFQUElORykKKyAgeyByZXR1cm4gKG1lc3NhZ2VzX2Jhc2U6OmNhdGFsb2cpY2F0OyB9CisjZWxzZQorICA7CisjZW5kaWYKKworICB2b2lkIGVyYXNlKG1lc3NhZ2VzX2Jhc2U6OmNhdGFsb2cpCisjaWYgIWRlZmluZWQgKF9TVExQX1VTRV9OTF9DQVREX01BUFBJTkcpCisgIHt9CisjZWxzZQorICA7CisjZW5kaWYKKworICBubF9jYXRkX3R5cGUgb3BlcmF0b3IgW10gKCBtZXNzYWdlc19iYXNlOjpjYXRhbG9nIGNhdCApCisjaWYgIWRlZmluZWQgKF9TVExQX1VTRV9OTF9DQVREX01BUFBJTkcpCisgIHsgcmV0dXJuIGNhdDsgfQorI2Vsc2UKKyAgeyByZXR1cm4gY2F0IDwgMCA/IDAgOiBNW2NhdF07IH0KKyNlbmRpZgorCitwcml2YXRlOgorICBfQ2F0YWxvZ19ubF9jYXRkX21hcChjb25zdCBfQ2F0YWxvZ19ubF9jYXRkX21hcCYpOworICBfQ2F0YWxvZ19ubF9jYXRkX21hcCYgb3BlcmF0b3IgPShjb25zdCBfQ2F0YWxvZ19ubF9jYXRkX21hcCYpOworCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX05MX0NBVERfTUFQUElORykKKyAgbWFwX3R5cGUgTTsKKyAgcm1hcF90eXBlIE1yOworICBzdGF0aWMgX1NUTFBfVk9MQVRJTEUgX19zdGxfYXRvbWljX3QgX2NvdW50OworI2VuZGlmCit9OworCitjbGFzcyBfTWVzc2FnZXMgeworcHVibGljOgorICB0eXBlZGVmIG1lc3NhZ2VzX2Jhc2U6OmNhdGFsb2cgY2F0YWxvZzsKKworICBfTWVzc2FnZXMoYm9vbCwgY29uc3QgY2hhciAqbmFtZSk7CisgIF9NZXNzYWdlcyhib29sLCBfTG9jYWxlX21lc3NhZ2VzKik7CisKKyAgY2F0YWxvZyBkb19vcGVuKGNvbnN0IHN0cmluZyYgX19mbiwgY29uc3QgbG9jYWxlJiBfX2xvYykgY29uc3Q7CisgIHN0cmluZyBkb19nZXQoY2F0YWxvZyBfX2MsIGludCBfX3NldCwgaW50IF9fbXNnaWQsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBfX2RmYXVsdCkgY29uc3Q7CisjaWYgIWRlZmluZWQgKF9TVExQX05PX1dDSEFSX1QpCisgIHdzdHJpbmcgZG9fZ2V0KGNhdGFsb2cgX19jLCBpbnQgX19zZXQsIGludCBfX21zZ2lkLAorICAgICAgICAgICAgICAgICBjb25zdCB3c3RyaW5nJiBfX2RmYXVsdCkgY29uc3Q7CisjZW5kaWYKKyAgdm9pZCBkb19jbG9zZShjYXRhbG9nIF9fYykgY29uc3Q7IAorICB+X01lc3NhZ2VzKCk7IAorCitwcml2YXRlOgorICBfTG9jYWxlX21lc3NhZ2VzKiBfTV9tZXNzYWdlX29iajsKKyAgX0NhdGFsb2dfbG9jYWxlX21hcCogX01fbWFwOworICBtdXRhYmxlIF9DYXRhbG9nX25sX2NhdGRfbWFwIF9NX2NhdDsKKworICAvL3ByaXZhdGUgZGVmaW5pdGlvbiB0byBhdm9pZCB3YXJuaW5nICh3aXRoIElDTCkKKyAgX01lc3NhZ2VzKGNvbnN0IF9NZXNzYWdlcyYpOworICBfTWVzc2FnZXMmIG9wZXJhdG9yPShjb25zdCBfTWVzc2FnZXMmKTsKK307CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNlbmRpZgorCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3JjL21lc3NhZ2VzLmNwcCBiL3NyYy9tZXNzYWdlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU0NjY5ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tZXNzYWdlcy5jcHAKQEAgLTAsMCArMSwyNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisjaW5jbHVkZSAic3RscG9ydF9wcmVmaXguaCIKKworI2luY2x1ZGUgPHR5cGVpbmZvPgorCisjaW5jbHVkZSAibWVzc2FnZV9mYWNldHMuaCIKKyNpbmNsdWRlICJhY3F1aXJlX3JlbGVhc2UuaCIKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordm9pZCBfQ2F0YWxvZ19sb2NhbGVfbWFwOjppbnNlcnQobmxfY2F0ZF90eXBlIGtleSwgY29uc3QgbG9jYWxlJiBMKSB7CisgIF9TVExQX1RSWSB7CisjaWYgIWRlZmluZWQgKF9TVExQX05PX1RZUEVJTkZPKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fUlRUSSkKKyAgICAvLyBEb24ndCBib3RoZXIgdG8gZG8gYW55dGhpbmcgdW5sZXNzIHdlJ3JlIHVzaW5nIGEgbm9uLWRlZmF1bHQgY3R5cGUgZmFjZXQKKyMgIGlmZGVmIF9TVExQX05PX1dDSEFSX1QKKyAgICB0eXBlZGVmIGNoYXIgX0NoYXI7CisjICBlbHNlCisgICAgdHlwZWRlZiB3Y2hhcl90IF9DaGFyOworIyAgZW5kaWYKKworICAgIHR5cGVkZWYgY3R5cGU8X0NoYXI+IHdjdHlwZTsKKyAgICB3Y3R5cGUgY29uc3QmIHdjdCA9IHVzZV9mYWNldDx3Y3R5cGU+KEwpOworICAgIGlmICh0eXBlaWQod2N0KSAhPSB0eXBlaWQod2N0eXBlKSkgeworI2VuZGlmCisgICAgICBpZiAoIU0pCisgICAgICAgIE0gPSBuZXcgbWFwX3R5cGU7CisKKyAgICAgIE0tPmluc2VydChtYXBfdHlwZTo6dmFsdWVfdHlwZShrZXksIEwpKTsKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fVFlQRUlORk8pICYmICFkZWZpbmVkIChfU1RMUF9OT19SVFRJKQorICAgIH0KKyNlbmRpZgorICB9CisgIF9TVExQX0NBVENIX0FMTCB7fQorfQorCit2b2lkIF9DYXRhbG9nX2xvY2FsZV9tYXA6OmVyYXNlKG5sX2NhdGRfdHlwZSBrZXkpIHsKKyAgaWYgKE0pCisgICAgTS0+ZXJhc2Uoa2V5KTsKK30KKworbG9jYWxlIF9DYXRhbG9nX2xvY2FsZV9tYXA6Omxvb2t1cChubF9jYXRkX3R5cGUga2V5KSBjb25zdCB7CisgIGlmIChNKSB7CisgICAgbWFwX3R5cGU6OmNvbnN0X2l0ZXJhdG9yIGkgPSBNLT5maW5kKGtleSk7CisgICAgcmV0dXJuIGkgIT0gTS0+ZW5kKCkgPyAoKmkpLnNlY29uZCA6IGxvY2FsZTo6Y2xhc3NpYygpOworICB9CisgIGVsc2UKKyAgICByZXR1cm4gbG9jYWxlOjpjbGFzc2ljKCk7Cit9CisKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9OTF9DQVREX01BUFBJTkcpCitfU1RMUF9WT0xBVElMRSBfX3N0bF9hdG9taWNfdCBfQ2F0YWxvZ19ubF9jYXRkX21hcDo6X2NvdW50ID0gMDsKKworbWVzc2FnZXNfYmFzZTo6Y2F0YWxvZyBfQ2F0YWxvZ19ubF9jYXRkX21hcDo6aW5zZXJ0KG5sX2NhdGRfdHlwZSBjYXQpIHsKKyAgbWVzc2FnZXNfYmFzZTo6Y2F0YWxvZyAmcmVzID0gTXJbY2F0XTsKKyAgaWYgKCByZXMgPT0gMCApIHsKKyNpZiBkZWZpbmVkIChfU1RMUF9BVE9NSUNfSU5DUkVNRU5UKQorICAgIHJlcyA9IF9fU1RBVElDX0NBU1QoaW50LCBfU1RMUF9BVE9NSUNfSU5DUkVNRU5UKCZfY291bnQpKTsKKyNlbHNlCisgICAgc3RhdGljIF9TVExQX1NUQVRJQ19NVVRFWCBfQ291bnRfbG9jayBfU1RMUF9NVVRFWF9JTklUSUFMSVpFUjsKKyAgICB7CisgICAgICBfU1RMUF9hdXRvX2xvY2sgc2VudHJ5KF9Db3VudF9sb2NrKTsKKyAgICAgIHJlcyA9IF9fU1RBVElDX0NBU1QoaW50LCArK19jb3VudCk7CisgICAgfQorI2VuZGlmCisgICAgTVtyZXNdID0gY2F0OworICB9CisgIHJldHVybiByZXM7Cit9CisKK3ZvaWQgX0NhdGFsb2dfbmxfY2F0ZF9tYXA6OmVyYXNlKG1lc3NhZ2VzX2Jhc2U6OmNhdGFsb2cgY2F0KSB7CisgIG1hcF90eXBlOjppdGVyYXRvciBtaXQoTS5maW5kKGNhdCkpOworICBpZiAobWl0ICE9IE0uZW5kKCkpIHsKKyAgICBNci5lcmFzZSgoKm1pdCkuc2Vjb25kKTsKKyAgICBNLmVyYXNlKG1pdCk7CisgIH0KK30KKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCitfTWVzc2FnZXM6Ol9NZXNzYWdlcyhib29sIGlzX3dpZGUsIGNvbnN0IGNoYXIgKm5hbWUpIDoKKyAgX01fbWVzc2FnZV9vYmooMCksIF9NX21hcCgwKSB7CisgIGlmICghbmFtZSkKKyAgICBsb2NhbGU6Ol9NX3Rocm93X29uX251bGxfbmFtZSgpOworCisgIGludCBfX2Vycl9jb2RlOworICBjaGFyIGJ1ZltfTG9jYWxlX01BWF9TSU1QTEVfTkFNRV07CisgIF9NX21lc3NhZ2Vfb2JqID0gX1NUTFBfUFJJViBfX2FjcXVpcmVfbWVzc2FnZXMobmFtZSwgYnVmLCAwLCAmX19lcnJfY29kZSk7CisgIGlmICghX01fbWVzc2FnZV9vYmopCisgICAgbG9jYWxlOjpfTV90aHJvd19vbl9jcmVhdGlvbl9mYWlsdXJlKF9fZXJyX2NvZGUsIG5hbWUsICJtZXNzYWdlcyIpOworCisgIGlmIChpc193aWRlKQorICAgIF9NX21hcCA9IG5ldyBfQ2F0YWxvZ19sb2NhbGVfbWFwOworfQorCitfTWVzc2FnZXM6Ol9NZXNzYWdlcyhib29sIGlzX3dpZGUsIF9Mb2NhbGVfbWVzc2FnZXMqIG1zZykgOgorICBfTV9tZXNzYWdlX29iaihtc2cpLCBfTV9tYXAoaXNfd2lkZSA/IG5ldyBfQ2F0YWxvZ19sb2NhbGVfbWFwKCkgOiAwKQore30KKworX01lc3NhZ2VzOjp+X01lc3NhZ2VzKCkgeworICBfX3JlbGVhc2VfbWVzc2FnZXMoX01fbWVzc2FnZV9vYmopOworICBkZWxldGUgX01fbWFwOworfQorCitfTWVzc2FnZXM6OmNhdGFsb2cgX01lc3NhZ2VzOjpkb19vcGVuKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsIGNvbnN0IGxvY2FsZSYgTCkgY29uc3QgeworICBubF9jYXRkX3R5cGUgcmVzdWx0ID0gX01fbWVzc2FnZV9vYmogPyBfTG9jYWxlX2NhdG9wZW4oX01fbWVzc2FnZV9vYmosIGZpbGVuYW1lLmNfc3RyKCkpCisgICAgOiAobmxfY2F0ZF90eXBlKSgtMSk7CisKKyAgaWYgKCByZXN1bHQgIT0gKG5sX2NhdGRfdHlwZSkoLTEpICkgeworICAgIGlmICggX01fbWFwICE9IDAgKSB7CisgICAgICBfTV9tYXAtPmluc2VydChyZXN1bHQsIEwpOworICAgIH0KKyAgICByZXR1cm4gX1NUTFBfTVVUQUJMRShfTWVzc2FnZXNfaW1wbCwgX01fY2F0KS5pbnNlcnQoIHJlc3VsdCApOworICB9CisKKyAgcmV0dXJuIC0xOworfQorCitzdHJpbmcgX01lc3NhZ2VzOjpkb19nZXQoY2F0YWxvZyBjYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNldCwgaW50IHBfaWQsIGNvbnN0IHN0cmluZyYgZGZhdWx0KSBjb25zdCB7CisgIHJldHVybiBfTV9tZXNzYWdlX29iaiAhPSAwICYmIGNhdCA+PSAwCisgICAgPyBzdHJpbmcoX0xvY2FsZV9jYXRnZXRzKF9NX21lc3NhZ2Vfb2JqLCBfU1RMUF9NVVRBQkxFKF9NZXNzYWdlc19pbXBsLCBfTV9jYXQpW2NhdF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCwgcF9pZCwgZGZhdWx0LmNfc3RyKCkpKQorICAgIDogZGZhdWx0OworfQorCisjaWYgIWRlZmluZWQgKF9TVExQX05PX1dDSEFSX1QpCisKK3dzdHJpbmcKK19NZXNzYWdlczo6ZG9fZ2V0KGNhdGFsb2cgdGhlY2F0LAorICAgICAgICAgICAgICAgICAgaW50IHNldCwgaW50IHBfaWQsIGNvbnN0IHdzdHJpbmcmIGRmYXVsdCkgY29uc3QgeworICB0eXBlZGVmIGN0eXBlPHdjaGFyX3Q+IHdjdHlwZTsKKyAgY29uc3Qgd2N0eXBlJiBjdCA9IHVzZV9mYWNldDx3Y3R5cGU+KF9NX21hcC0+bG9va3VwKF9TVExQX01VVEFCTEUoX01lc3NhZ2VzX2ltcGwsIF9NX2NhdClbdGhlY2F0XSkpOworCisgIGNvbnN0IGNoYXIqIHN0ciA9IF9Mb2NhbGVfY2F0Z2V0cyhfTV9tZXNzYWdlX29iaiwgX1NUTFBfTVVUQUJMRShfTWVzc2FnZXNfaW1wbCwgX01fY2F0KVt0aGVjYXRdLCBzZXQsIHBfaWQsICIiKTsKKworICAvLyBWZXJpZnkgdGhhdCB0aGUgbG9va3VwIGZhaWxlZDsgYW4gZW1wdHkgc3RyaW5nIG1pZ2h0IHJlcHJlc2VudCBzdWNjZXNzLgorICBpZiAoIXN0cikKKyAgICByZXR1cm4gZGZhdWx0OworICBlbHNlIGlmIChzdHJbMF0gPT0gJ1wwJykgeworICAgIGNvbnN0IGNoYXIqIHN0cjIgPSBfTG9jYWxlX2NhdGdldHMoX01fbWVzc2FnZV9vYmosIF9TVExQX01VVEFCTEUoX01lc3NhZ2VzX2ltcGwsIF9NX2NhdClbdGhlY2F0XSwgc2V0LCBwX2lkLCAiKiIpOworICAgIGlmICghc3RyMiB8fCAoKHN0cjJbMF0gPT0gJyonKSAmJiAoc3RyMlsxXSA9PSAnXDAnKSkpCisgICAgICByZXR1cm4gZGZhdWx0OworICB9CisKKyAgLy8gc3RyIGlzIGNvcnJlY3QuICBOb3cgd2UgbXVzdCB3aWRlbiBpdCB0byBnZXQgYSB3c3RyaW5nLgorICBzaXplX3QgbiA9IHN0cmxlbihzdHIpOworCisgIC8vIE5PVCBQT1JUQUJMRS4gIFdoYXQgd2UncmUgZG9pbmcgcmVsaWVzIG9uIGludGVybmFsIGRldGFpbHMgb2YgdGhlCisgIC8vIHN0cmluZyBpbXBsZW1lbnRhdGlvbi4gIChDb250aWd1aXR5IG9mIHN0cmluZyBlbGVtZW50cy4pCisgIHdzdHJpbmcgcmVzdWx0KG4sIHdjaGFyX3QoMCkpOworICBjdC53aWRlbihzdHIsIHN0ciArIG4sICYqcmVzdWx0LmJlZ2luKCkpOworICByZXR1cm4gcmVzdWx0OworfQorCisjZW5kaWYKKwordm9pZCBfTWVzc2FnZXM6OmRvX2Nsb3NlKGNhdGFsb2cgdGhlY2F0KSBjb25zdCB7CisgIGlmIChfTV9tZXNzYWdlX29iaikKKyAgICBfTG9jYWxlX2NhdGNsb3NlKF9NX21lc3NhZ2Vfb2JqLCBfU1RMUF9NVVRBQkxFKF9NZXNzYWdlc19pbXBsLCBfTV9jYXQpW3RoZWNhdF0pOworICBpZiAoX01fbWFwKSBfTV9tYXAtPmVyYXNlKF9TVExQX01VVEFCTEUoX01lc3NhZ2VzX2ltcGwsIF9NX2NhdClbdGhlY2F0XSk7CisgIF9TVExQX01VVEFCTEUoX01lc3NhZ2VzX2ltcGwsIF9NX2NhdCkuZXJhc2UoIHRoZWNhdCApOworfQorCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtZXNzYWdlczxjaGFyPgorbWVzc2FnZXM8Y2hhcj46Om1lc3NhZ2VzKHNpemVfdCByZWZzKQorICA6IGxvY2FsZTo6ZmFjZXQocmVmcykge30KKworbWVzc2FnZXNfYnluYW1lPGNoYXI+OjptZXNzYWdlc19ieW5hbWUoY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IHJlZnMpCisgIDogbWVzc2FnZXM8Y2hhcj4ocmVmcyksIF9NX2ltcGwobmV3IF9TVExQX1BSSVYgX01lc3NhZ2VzKGZhbHNlLCBuYW1lKSkge30KKworbWVzc2FnZXNfYnluYW1lPGNoYXI+OjptZXNzYWdlc19ieW5hbWUoX0xvY2FsZV9tZXNzYWdlcyogbXNnKQorICA6IG1lc3NhZ2VzPGNoYXI+KDApLCBfTV9pbXBsKG5ldyBfU1RMUF9QUklWIF9NZXNzYWdlcyhmYWxzZSwgbXNnKSkge30KKworbWVzc2FnZXNfYnluYW1lPGNoYXI+Ojp+bWVzc2FnZXNfYnluYW1lKCkKK3sgZGVsZXRlIF9NX2ltcGw7IH0KKworbWVzc2FnZXNfYnluYW1lPGNoYXI+OjpjYXRhbG9nCittZXNzYWdlc19ieW5hbWU8Y2hhcj46OmRvX29wZW4oY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwgY29uc3QgbG9jYWxlJiBsKSBjb25zdAoreyByZXR1cm4gX01faW1wbC0+ZG9fb3BlbihmaWxlbmFtZSwgbCk7IH0KKworc3RyaW5nCittZXNzYWdlc19ieW5hbWU8Y2hhcj46OmRvX2dldChjYXRhbG9nIGNhdCwgaW50IHNldCwgaW50IHBfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGRmYXVsdCkgY29uc3QKK3sgcmV0dXJuIF9NX2ltcGwtPmRvX2dldChjYXQsIHNldCwgcF9pZCwgZGZhdWx0KTsgfQorCit2b2lkIG1lc3NhZ2VzX2J5bmFtZTxjaGFyPjo6ZG9fY2xvc2UoY2F0YWxvZyBjYXQpIGNvbnN0Cit7IF9NX2ltcGwtPmRvX2Nsb3NlKGNhdCk7IH0KKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1lc3NhZ2VzPHdjaGFyX3Q+CisKK21lc3NhZ2VzPHdjaGFyX3Q+OjptZXNzYWdlcyhzaXplX3QgcmVmcykKKyAgOiBsb2NhbGU6OmZhY2V0KHJlZnMpIHt9CisKK21lc3NhZ2VzX2J5bmFtZTx3Y2hhcl90Pjo6bWVzc2FnZXNfYnluYW1lKGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCByZWZzKQorICA6IG1lc3NhZ2VzPHdjaGFyX3Q+KHJlZnMpLCBfTV9pbXBsKG5ldyBfU1RMUF9QUklWIF9NZXNzYWdlcyh0cnVlLCBuYW1lKSkge30KKworbWVzc2FnZXNfYnluYW1lPHdjaGFyX3Q+OjptZXNzYWdlc19ieW5hbWUoX0xvY2FsZV9tZXNzYWdlcyogbXNnKQorICA6IG1lc3NhZ2VzPHdjaGFyX3Q+KDApLCBfTV9pbXBsKG5ldyBfU1RMUF9QUklWIF9NZXNzYWdlcyh0cnVlLCBtc2cpKSB7fQorCittZXNzYWdlc19ieW5hbWU8d2NoYXJfdD46On5tZXNzYWdlc19ieW5hbWUoKQoreyBkZWxldGUgX01faW1wbDsgfQorCittZXNzYWdlc19ieW5hbWU8d2NoYXJfdD46OmNhdGFsb2cKK21lc3NhZ2VzX2J5bmFtZTx3Y2hhcl90Pjo6ZG9fb3Blbihjb25zdCBzdHJpbmcmIGZpbGVuYW1lLCBjb25zdCBsb2NhbGUmIEwpIGNvbnN0Cit7IHJldHVybiBfTV9pbXBsLT5kb19vcGVuKGZpbGVuYW1lLCBMKTsgfQorCit3c3RyaW5nCittZXNzYWdlc19ieW5hbWU8d2NoYXJfdD46OmRvX2dldChjYXRhbG9nIHRoZWNhdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXQsIGludCBwX2lkLCBjb25zdCB3c3RyaW5nJiBkZmF1bHQpIGNvbnN0Cit7IHJldHVybiBfTV9pbXBsLT5kb19nZXQodGhlY2F0LCBzZXQsIHBfaWQsIGRmYXVsdCk7IH0KKwordm9pZCBtZXNzYWdlc19ieW5hbWU8d2NoYXJfdD46OmRvX2Nsb3NlKGNhdGFsb2cgY2F0KSBjb25zdAoreyBfTV9pbXBsLT5kb19jbG9zZShjYXQpOyB9CisKKyNlbmRpZgorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zcmMvbW9uZXRhcnkuY3BwIGIvc3JjL21vbmV0YXJ5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWIyMTNhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21vbmV0YXJ5LmNwcApAQCAtMCwwICsxLDE1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKyNpbmNsdWRlICJzdGxwb3J0X3ByZWZpeC5oIgorCisjaW5jbHVkZSA8bG9jYWxlPgorI2luY2x1ZGUgPGlzdHJlYW0+CisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCitzdGF0aWMgdm9pZCBfSW5pdF9tb25ldGFyeV9mb3JtYXRzKG1vbmV5X2Jhc2U6OnBhdHRlcm4mIHBvc19mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbmV5X2Jhc2U6OnBhdHRlcm4mIG5lZ19mb3JtYXQpIHsKKyAgcG9zX2Zvcm1hdC5maWVsZFswXSA9IChjaGFyKSBtb25leV9iYXNlOjpzeW1ib2w7CisgIHBvc19mb3JtYXQuZmllbGRbMV0gPSAoY2hhcikgbW9uZXlfYmFzZTo6c2lnbjsKKyAgcG9zX2Zvcm1hdC5maWVsZFsyXSA9IChjaGFyKSBtb25leV9iYXNlOjpub25lOworICBwb3NfZm9ybWF0LmZpZWxkWzNdID0gKGNoYXIpIG1vbmV5X2Jhc2U6OnZhbHVlOworCisgIG5lZ19mb3JtYXQuZmllbGRbMF0gPSAoY2hhcikgbW9uZXlfYmFzZTo6c3ltYm9sOworICBuZWdfZm9ybWF0LmZpZWxkWzFdID0gKGNoYXIpIG1vbmV5X2Jhc2U6OnNpZ247CisgIG5lZ19mb3JtYXQuZmllbGRbMl0gPSAoY2hhcikgbW9uZXlfYmFzZTo6bm9uZTsKKyAgbmVnX2Zvcm1hdC5maWVsZFszXSA9IChjaGFyKSBtb25leV9iYXNlOjp2YWx1ZTsKK30KKworLy8gVGhpcyBpcyBiZWluZyB1c2VkIHRocm91Z2hvdXQgdGhlIGxpYnJhcnkKK3N0YXRpYyBjb25zdCBzdHJpbmcgX1NfZW1wdHlfc3RyaW5nOworI2lmbmRlZiBfU1RMUF9OT19XQ0hBUl9UCitzdGF0aWMgY29uc3Qgd3N0cmluZyBfU19lbXB0eV93c3RyaW5nOworI2VuZGlmCisKKy8vCisvLyBtb25leXB1bmN0PD4KKy8vCisKK21vbmV5cHVuY3Q8Y2hhciwgdHJ1ZT46Om1vbmV5cHVuY3Qoc2l6ZV90IF9fcmVmcykgOiBsb2NhbGU6OmZhY2V0KF9fcmVmcykKK3sgX0luaXRfbW9uZXRhcnlfZm9ybWF0cyhfTV9wb3NfZm9ybWF0LCBfTV9uZWdfZm9ybWF0KTsgfQorbW9uZXlwdW5jdDxjaGFyLCB0cnVlPjo6fm1vbmV5cHVuY3QoKSB7fQorCitjaGFyIG1vbmV5cHVuY3Q8Y2hhciwgdHJ1ZT46OmRvX2RlY2ltYWxfcG9pbnQoKSBjb25zdCB7cmV0dXJuICcgJzt9CitjaGFyIG1vbmV5cHVuY3Q8Y2hhciwgdHJ1ZT46OmRvX3Rob3VzYW5kc19zZXAoKSBjb25zdCB7cmV0dXJuICcgJzt9CitzdHJpbmcgbW9uZXlwdW5jdDxjaGFyLCB0cnVlPjo6ZG9fZ3JvdXBpbmcoKSBjb25zdCB7IHJldHVybiBfU19lbXB0eV9zdHJpbmc7IH0KK3N0cmluZyBtb25leXB1bmN0PGNoYXIsIHRydWU+Ojpkb19jdXJyX3N5bWJvbCgpIGNvbnN0IHsgcmV0dXJuIF9TX2VtcHR5X3N0cmluZzsgfQorc3RyaW5nIG1vbmV5cHVuY3Q8Y2hhciwgdHJ1ZT46OmRvX3Bvc2l0aXZlX3NpZ24oKSBjb25zdCB7IHJldHVybiBfU19lbXB0eV9zdHJpbmc7IH0KK3N0cmluZyBtb25leXB1bmN0PGNoYXIsIHRydWU+Ojpkb19uZWdhdGl2ZV9zaWduKCkgY29uc3QgeyByZXR1cm4gX1NfZW1wdHlfc3RyaW5nOyB9Cittb25leV9iYXNlOjpwYXR0ZXJuIG1vbmV5cHVuY3Q8Y2hhciwgdHJ1ZT46OmRvX3Bvc19mb3JtYXQoKSBjb25zdCAge3JldHVybiBfTV9wb3NfZm9ybWF0O30KK21vbmV5X2Jhc2U6OnBhdHRlcm4gbW9uZXlwdW5jdDxjaGFyLCB0cnVlPjo6ZG9fbmVnX2Zvcm1hdCgpIGNvbnN0IHtyZXR1cm4gX01fbmVnX2Zvcm1hdDt9CitpbnQgbW9uZXlwdW5jdDxjaGFyLCB0cnVlPjo6ZG9fZnJhY19kaWdpdHMoKSBjb25zdCB7cmV0dXJuIDA7fQorCittb25leXB1bmN0PGNoYXIsIGZhbHNlPjo6bW9uZXlwdW5jdChzaXplX3QgX19yZWZzKSA6IGxvY2FsZTo6ZmFjZXQoX19yZWZzKQoreyBfSW5pdF9tb25ldGFyeV9mb3JtYXRzKF9NX3Bvc19mb3JtYXQsIF9NX25lZ19mb3JtYXQpOyB9Cittb25leXB1bmN0PGNoYXIsIGZhbHNlPjo6fm1vbmV5cHVuY3QoKSB7fQorCitjaGFyIG1vbmV5cHVuY3Q8Y2hhciwgZmFsc2U+Ojpkb19kZWNpbWFsX3BvaW50KCkgY29uc3Qge3JldHVybiAnICc7fQorY2hhciBtb25leXB1bmN0PGNoYXIsIGZhbHNlPjo6ZG9fdGhvdXNhbmRzX3NlcCgpIGNvbnN0IHtyZXR1cm4gJyAnO30KKworc3RyaW5nIG1vbmV5cHVuY3Q8Y2hhciwgZmFsc2U+Ojpkb19ncm91cGluZygpIGNvbnN0IHsgcmV0dXJuIF9TX2VtcHR5X3N0cmluZzsgfQorc3RyaW5nIG1vbmV5cHVuY3Q8Y2hhciwgZmFsc2U+Ojpkb19jdXJyX3N5bWJvbCgpIGNvbnN0IHsgcmV0dXJuIF9TX2VtcHR5X3N0cmluZzsgfQorc3RyaW5nIG1vbmV5cHVuY3Q8Y2hhciwgZmFsc2U+Ojpkb19wb3NpdGl2ZV9zaWduKCkgY29uc3QgeyByZXR1cm4gX1NfZW1wdHlfc3RyaW5nOyB9CitzdHJpbmcgbW9uZXlwdW5jdDxjaGFyLCBmYWxzZT46OmRvX25lZ2F0aXZlX3NpZ24oKSBjb25zdCB7IHJldHVybiBfU19lbXB0eV9zdHJpbmc7IH0KK21vbmV5X2Jhc2U6OnBhdHRlcm4gbW9uZXlwdW5jdDxjaGFyLCBmYWxzZT46OmRvX3Bvc19mb3JtYXQoKSBjb25zdCB7cmV0dXJuIF9NX3Bvc19mb3JtYXQ7fQorbW9uZXlfYmFzZTo6cGF0dGVybiBtb25leXB1bmN0PGNoYXIsIGZhbHNlPjo6ZG9fbmVnX2Zvcm1hdCgpIGNvbnN0IHtyZXR1cm4gX01fbmVnX2Zvcm1hdDt9CitpbnQgbW9uZXlwdW5jdDxjaGFyLCBmYWxzZT46OmRvX2ZyYWNfZGlnaXRzKCkgY29uc3Qge3JldHVybiAwO30KKworI2lmbmRlZiBfU1RMUF9OT19XQ0hBUl9UCittb25leXB1bmN0PHdjaGFyX3QsIHRydWU+Ojptb25leXB1bmN0KHNpemVfdCBfX3JlZnMpIDogbG9jYWxlOjpmYWNldChfX3JlZnMpCit7IF9Jbml0X21vbmV0YXJ5X2Zvcm1hdHMoX01fcG9zX2Zvcm1hdCwgX01fbmVnX2Zvcm1hdCk7IH0KK21vbmV5cHVuY3Q8d2NoYXJfdCwgdHJ1ZT46On5tb25leXB1bmN0KCkge30KKword2NoYXJfdCBtb25leXB1bmN0PHdjaGFyX3QsIHRydWU+Ojpkb19kZWNpbWFsX3BvaW50KCkgY29uc3Qge3JldHVybiBMJyAnO30KK3djaGFyX3QgbW9uZXlwdW5jdDx3Y2hhcl90LCB0cnVlPjo6ZG9fdGhvdXNhbmRzX3NlcCgpIGNvbnN0IHtyZXR1cm4gTCcgJzt9CitzdHJpbmcgbW9uZXlwdW5jdDx3Y2hhcl90LCB0cnVlPjo6ZG9fZ3JvdXBpbmcoKSBjb25zdCB7cmV0dXJuIF9TX2VtcHR5X3N0cmluZzt9CisKK3dzdHJpbmcgbW9uZXlwdW5jdDx3Y2hhcl90LCB0cnVlPjo6ZG9fY3Vycl9zeW1ib2woKSBjb25zdAore3JldHVybiBfU19lbXB0eV93c3RyaW5nO30KK3dzdHJpbmcgbW9uZXlwdW5jdDx3Y2hhcl90LCB0cnVlPjo6ZG9fcG9zaXRpdmVfc2lnbigpIGNvbnN0Cit7cmV0dXJuIF9TX2VtcHR5X3dzdHJpbmc7fQord3N0cmluZyBtb25leXB1bmN0PHdjaGFyX3QsIHRydWU+Ojpkb19uZWdhdGl2ZV9zaWduKCkgY29uc3QKK3tyZXR1cm4gX1NfZW1wdHlfd3N0cmluZzt9CitpbnQgbW9uZXlwdW5jdDx3Y2hhcl90LCB0cnVlPjo6ZG9fZnJhY19kaWdpdHMoKSBjb25zdCB7cmV0dXJuIDA7fQorbW9uZXlfYmFzZTo6cGF0dGVybiBtb25leXB1bmN0PHdjaGFyX3QsIHRydWU+Ojpkb19wb3NfZm9ybWF0KCkgY29uc3QKK3tyZXR1cm4gX01fcG9zX2Zvcm1hdDt9Cittb25leV9iYXNlOjpwYXR0ZXJuIG1vbmV5cHVuY3Q8d2NoYXJfdCwgdHJ1ZT46OmRvX25lZ19mb3JtYXQoKSBjb25zdAore3JldHVybiBfTV9uZWdfZm9ybWF0O30KKworbW9uZXlwdW5jdDx3Y2hhcl90LCBmYWxzZT46Om1vbmV5cHVuY3Qoc2l6ZV90IF9fcmVmcykgOiBsb2NhbGU6OmZhY2V0KF9fcmVmcykKK3sgX0luaXRfbW9uZXRhcnlfZm9ybWF0cyhfTV9wb3NfZm9ybWF0LCBfTV9uZWdfZm9ybWF0KTsgfQorbW9uZXlwdW5jdDx3Y2hhcl90LCBmYWxzZT46On5tb25leXB1bmN0KCkge30KKword2NoYXJfdCBtb25leXB1bmN0PHdjaGFyX3QsIGZhbHNlPjo6ZG9fZGVjaW1hbF9wb2ludCgpIGNvbnN0IHtyZXR1cm4gTCcgJzt9Cit3Y2hhcl90IG1vbmV5cHVuY3Q8d2NoYXJfdCwgZmFsc2U+Ojpkb190aG91c2FuZHNfc2VwKCkgY29uc3Qge3JldHVybiBMJyAnO30KK3N0cmluZyBtb25leXB1bmN0PHdjaGFyX3QsIGZhbHNlPjo6ZG9fZ3JvdXBpbmcoKSBjb25zdCB7IHJldHVybiBfU19lbXB0eV9zdHJpbmc7fQord3N0cmluZyBtb25leXB1bmN0PHdjaGFyX3QsIGZhbHNlPjo6ZG9fY3Vycl9zeW1ib2woKSBjb25zdAore3JldHVybiBfU19lbXB0eV93c3RyaW5nO30KK3dzdHJpbmcgbW9uZXlwdW5jdDx3Y2hhcl90LCBmYWxzZT46OmRvX3Bvc2l0aXZlX3NpZ24oKSBjb25zdAore3JldHVybiBfU19lbXB0eV93c3RyaW5nO30KK3dzdHJpbmcgbW9uZXlwdW5jdDx3Y2hhcl90LCBmYWxzZT46OmRvX25lZ2F0aXZlX3NpZ24oKSBjb25zdAore3JldHVybiBfU19lbXB0eV93c3RyaW5nO30KK2ludCBtb25leXB1bmN0PHdjaGFyX3QsIGZhbHNlPjo6ZG9fZnJhY19kaWdpdHMoKSBjb25zdCB7cmV0dXJuIDA7fQorCittb25leV9iYXNlOjpwYXR0ZXJuIG1vbmV5cHVuY3Q8d2NoYXJfdCwgZmFsc2U+Ojpkb19wb3NfZm9ybWF0KCkgY29uc3QKK3tyZXR1cm4gX01fcG9zX2Zvcm1hdDt9Cittb25leV9iYXNlOjpwYXR0ZXJuIG1vbmV5cHVuY3Q8d2NoYXJfdCwgZmFsc2U+Ojpkb19uZWdfZm9ybWF0KCkgY29uc3QKK3tyZXR1cm4gX01fbmVnX2Zvcm1hdDt9CisKKyNlbmRpZiAvKiBXQ0hBUl9UICovCisKKy8vCisvLyBJbnN0YW50aWF0aW9ucworLy8KKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19GT1JDRV9JTlNUQU5USUFURSkKKwordGVtcGxhdGUgY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgbW9uZXlfZ2V0PGNoYXIsIGlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiA+OwordGVtcGxhdGUgY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgbW9uZXlfcHV0PGNoYXIsIG9zdHJlYW1idWZfaXRlcmF0b3I8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiA+OworLy8gdGVtcGxhdGUgY2xhc3MgbW9uZXlfcHV0PGNoYXIsIGNoYXIqPjsKKworIyAgaWZuZGVmIF9TVExQX05PX1dDSEFSX1QKK3RlbXBsYXRlIGNsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIG1vbmV5X2dldDx3Y2hhcl90LCBpc3RyZWFtYnVmX2l0ZXJhdG9yPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4gPjsKK3RlbXBsYXRlIGNsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIG1vbmV5X3B1dDx3Y2hhcl90LCBvc3RyZWFtYnVmX2l0ZXJhdG9yPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4gPjsKKy8vIHRlbXBsYXRlIGNsYXNzIG1vbmV5X3B1dDx3Y2hhcl90LCB3Y2hhcl90Kj47CisvLyB0ZW1wbGF0ZSBjbGFzcyBtb25leV9nZXQ8d2NoYXJfdCwgY29uc3Qgd2NoYXJfdCo+OworIyAgZW5kaWYKKworI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfU1RBVElDX0NPTlNUX0lOSVRfQlVHKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fU1RBVElDX0NPTlNUX0RFRklOSVRJT04pCitjb25zdCBib29sIG1vbmV5cHVuY3Q8Y2hhciwgdHJ1ZT46OmludGw7Citjb25zdCBib29sIG1vbmV5cHVuY3Q8Y2hhciwgZmFsc2U+OjppbnRsOworIyAgaWZuZGVmIF9TVExQX05PX1dDSEFSX1QKK2NvbnN0IGJvb2wgbW9uZXlwdW5jdDx3Y2hhcl90LCB0cnVlPjo6aW50bDsKK2NvbnN0IGJvb2wgbW9uZXlwdW5jdDx3Y2hhcl90LCBmYWxzZT46OmludGw7CisjICBlbmRpZgorI2VuZGlmCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3NyYy9udW1fZ2V0LmNwcCBiL3NyYy9udW1fZ2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTkwMWFjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL251bV9nZXQuY3BwCkBAIC0wLDAgKzEsMTIwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworI2luY2x1ZGUgInN0bHBvcnRfcHJlZml4LmgiCisKKyNpbmNsdWRlIDxsb2NhbGU+CisjaW5jbHVkZSA8aXN0cmVhbT4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCisvLyBfX3ZhbGlkX2dyb3VwaW5nIGNvbXBhcmVzIHR3byBzdHJpbmdzLCBvbmUgcmVwcmVzZW50aW5nIHRoZQorLy8gZ3JvdXAgc2l6ZXMgZW5jb3VudGVyZWQgd2hlbiByZWFkaW5nIGFuIGludGVnZXIsIGFuZCB0aGUgb3RoZXIKKy8vIHJlcHJlc2VudGluZyB0aGUgdmFsaWQgZ3JvdXAgc2l6ZXMgYXMgcmV0dXJuZWQgYnkgdGhlIG51bXB1bmN0CisvLyBncm91cGluZygpIG1lbWJlciBmdW5jdGlvbi4gIEJvdGggYXJlIGludGVycHJldGVkIHJpZ2h0LXRvLWxlZnQuCisvLyBUaGUgZ3JvdXBpbmcgc3RyaW5nIGlzIHRyZWF0ZWQgYXMgaWYgaXQgd2VyZSBleHRlbmRlZCBpbmRlZmluaXRlbHkKKy8vIHdpdGggaXRzIGxhc3QgdmFsdWUuICBGb3IgYSBncm91cGluZyB0byBiZSB2YWxpZCwgZWFjaCB0ZXJtIGluCisvLyB0aGUgZmlyc3Qgc3RyaW5nIG11c3QgYmUgZXF1YWwgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdGVybSBpbiB0aGUKKy8vIHNlY29uZCwgZXhjZXB0IGZvciB0aGUgbGFzdCwgd2hpY2ggbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwuCisKKy8vIGJvcmlzIDogdGhpcyB0YWtlcyByZXZlcnNlZCBmaXJzdCBzdHJpbmcgIQorYm9vbCAgX1NUTFBfQ0FMTAorX192YWxpZF9ncm91cGluZyhjb25zdCBjaGFyICogZmlyc3QxLCBjb25zdCBjaGFyICogbGFzdDEsCisgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBmaXJzdDIsIGNvbnN0IGNoYXIgKiBsYXN0MikgeworICBpZiAoZmlyc3QxID09IGxhc3QxIHx8IGZpcnN0MiA9PSBsYXN0MikgcmV0dXJuIHRydWU7CisKKyAgLS1sYXN0MTsgLS1sYXN0MjsKKworICB3aGlsZSAoZmlyc3QxICE9IGxhc3QxKSB7CisgICAgaWYgKCpsYXN0MSAhPSAqZmlyc3QyKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIC0tbGFzdDE7CisgICAgaWYgKGZpcnN0MiAhPSBsYXN0MikgKytmaXJzdDI7CisgIH0KKworICByZXR1cm4gKmxhc3QxIDw9ICpmaXJzdDI7Cit9CisKK19TVExQX0RFQ0xTUEVDIHVuc2lnbmVkIGNoYXIgX1NUTFBfQ0FMTCBfX2RpZ2l0X3ZhbF90YWJsZSh1bnNpZ25lZCBfX2luZGV4KSB7CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIF9fdmFsX3RhYmxlWzEyOF0gPSB7CisgICAgMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwKKyAgICAweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLAorICAgIDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsCisgICAgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwKKyAgICAweEZGLDEwLDExLDEyLDEzLDE0LDE1LDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLAorICAgIDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsCisgICAgMHhGRiwxMCwxMSwxMiwxMywxNCwxNSwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwKKyAgICAweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGCisgIH07CisKKyAgcmV0dXJuIF9fdmFsX3RhYmxlW19faW5kZXhdOworfQorCitfU1RMUF9ERUNMU1BFQyBjb25zdCBjaGFyKiBfU1RMUF9DQUxMIF9fbmFycm93X2F0b21zKCkKK3sgcmV0dXJuICIrLTB4WCI7IH0KKworLy8gaW5kZXggaXMgYWN0dWFsbHkgYSBjaGFyCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkKKworLy8gU2ltaWxhciwgZXhjZXB0IHJldHVybiB0aGUgY2hhcmFjdGVyIGl0c2VsZiBpbnN0ZWFkIG9mIHRoZSBudW1lcmljCisvLyB2YWx1ZS4gIFVzZWQgZm9yIGZsb2F0aW5nLXBvaW50IGlucHV0LgorYm9vbCBfU1RMUF9DQUxMIF9fZ2V0X2ZkaWdpdCh3Y2hhcl90JiBjLCBjb25zdCB3Y2hhcl90KiBkaWdpdHMpIHsKKyAgY29uc3Qgd2NoYXJfdCogcCA9IGZpbmQoZGlnaXRzLCBkaWdpdHMgKyAxMCwgYyk7CisgIGlmIChwICE9IGRpZ2l0cyArIDEwKSB7CisgICAgYyA9IChjaGFyKSgnMCcgKyAocCAtIGRpZ2l0cykpOworICAgIHJldHVybiB0cnVlOworICB9CisgIGVsc2UKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgX1NUTFBfQ0FMTCBfX2dldF9mZGlnaXRfb3Jfc2VwKHdjaGFyX3QmIGMsIHdjaGFyX3Qgc2VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCAqIGRpZ2l0cykgeworICBpZiAoYyA9PSBzZXApIHsKKyAgICBjID0gKGNoYXIpJywnOworICAgIHJldHVybiB0cnVlOworICB9CisgIGVsc2UKKyAgICByZXR1cm4gX19nZXRfZmRpZ2l0KGMsIGRpZ2l0cyk7Cit9CisKKyNlbmRpZgorCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKworI2lmICFkZWZpbmVkKF9TVExQX05PX0ZPUkNFX0lOU1RBTlRJQVRFKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGb3JjZSBpbnN0YW50aWF0aW9uIG9mIG51bV9nZXQ8PgordGVtcGxhdGUgY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+OworLy8gdGVtcGxhdGUgY2xhc3MgbnVtX2dldDxjaGFyLCBjb25zdCBjaGFyKj47Cit0ZW1wbGF0ZSBjbGFzcyBudW1fZ2V0PGNoYXIsIGlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiA+OworCisjICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkKK3RlbXBsYXRlIGNsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDICBpc3RyZWFtYnVmX2l0ZXJhdG9yPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID47Cit0ZW1wbGF0ZSBjbGFzcyBudW1fZ2V0PHdjaGFyX3QsIGlzdHJlYW1idWZfaXRlcmF0b3I8d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPiA+OworLy8gdGVtcGxhdGUgY2xhc3MgbnVtX2dldDx3Y2hhcl90LCBjb25zdCB3Y2hhcl90Kj47CisjICBlbmRpZgorI2VuZGlmCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3NyYy9udW1fZ2V0X2Zsb2F0LmNwcCBiL3NyYy9udW1fZ2V0X2Zsb2F0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2U5ZmVkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL251bV9nZXRfZmxvYXQuY3BwCkBAIC0wLDAgKzEsODg0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaW5jbHVkZSAic3RscG9ydF9wcmVmaXguaCIKKworI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxsb2NhbGU+CisjaW5jbHVkZSA8aXN0cmVhbT4KKworI2lmIChkZWZpbmVkIChfX0dOVUNfXykgJiYgIWRlZmluZWQgKF9fc3VuKSAmJiAhZGVmaW5lZCAoX19ocHV4KSkgfHwgXAorICAgIGRlZmluZWQgKF9fRE1DX18pCisjICBpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19saW51eF9fKSB8fCBkZWZpbmVkIChfX01JTkdXMzJfXykgfHwgZGVmaW5lZCAoX19DWUdXSU5fXykgfHwgXAorICAgIGRlZmluZWQgKF9fQk9STEFORENfXykgfHwgZGVmaW5lZCAoX19ETUNfXykgfHwgZGVmaW5lZCAoX19IUF9hQ0MpCisKKyMgIGlmIGRlZmluZWQgKF9fQk9STEFORENfXykKK3R5cGVkZWYgdW5zaWduZWQgaW50IHVpbnQzMl90OwordHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0IHVpbnQ2NF90OworIyAgZW5kaWYKKwordW5pb24gX2xsIHsKKyAgdWludDY0X3QgaTY0OworICBzdHJ1Y3QgeworIyAgaWYgZGVmaW5lZCAoX1NUTFBfQklHX0VORElBTikKKyAgICB1aW50MzJfdCBoaTsKKyAgICB1aW50MzJfdCBsbzsKKyMgIGVsaWYgZGVmaW5lZCAoX1NUTFBfTElUVExFX0VORElBTikKKyAgICB1aW50MzJfdCBsbzsKKyAgICB1aW50MzJfdCBoaTsKKyMgIGVsc2UKKyMgICAgZXJyb3IgVW5rbm93biBlbmRpYW5lc3MKKyMgIGVuZGlmCisgIH0gaTMyOworfTsKKworIyAgaWYgZGVmaW5lZCAoX19saW51eF9fKSAmJiAhZGVmaW5lZCAoQU5EUk9JRCkKKyMgICAgaW5jbHVkZSA8aWVlZTc1NC5oPgorIyAgZWxzZQordW5pb24gaWVlZTg1NF9sb25nX2RvdWJsZSB7CisgIGxvbmcgZG91YmxlIGQ7CisKKyAgLyogVGhpcyBpcyB0aGUgSUVFRSA4NTQgZG91YmxlLWV4dGVuZGVkLXByZWNpc2lvbiBmb3JtYXQuICAqLworICBzdHJ1Y3QgeworICAgIHVuc2lnbmVkIGludCBtYW50aXNzYTE6MzI7CisgICAgdW5zaWduZWQgaW50IG1hbnRpc3NhMDozMjsKKyAgICB1bnNpZ25lZCBpbnQgZXhwb25lbnQ6MTU7CisgICAgdW5zaWduZWQgaW50IG5lZ2F0aXZlOjE7CisgICAgdW5zaWduZWQgaW50IGVtcHR5OjE2OworICB9IGllZWU7Cit9OworCisjICAgIGRlZmluZSBJRUVFODU0X0xPTkdfRE9VQkxFX0JJQVMgMHgzZmZmCisjICBlbmRpZgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG51bV9nZXQKKworLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgX01fZG9fZ2V0X2Zsb2F0LgorCisjaWYgIWRlZmluZWQgKF9TVExQX05PX1dDSEFSX1QpCit2b2lkICBfU1RMUF9DQUxMCitfSW5pdGlhbGl6ZV9nZXRfZmxvYXQoIGNvbnN0IGN0eXBlPHdjaGFyX3Q+JiBjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgd2NoYXJfdCYgUGx1cywgd2NoYXJfdCYgTWludXMsCisgICAgICAgICAgICAgICAgICAgICAgIHdjaGFyX3QmIHBvd19lLCB3Y2hhcl90JiBwb3dfRSwKKyAgICAgICAgICAgICAgICAgICAgICAgd2NoYXJfdCogZGlnaXRzKSB7CisgIGNoYXIgbmRpZ2l0c1sxMV0gPSAiMDEyMzQ1Njc4OSI7CisgIFBsdXMgID0gY3Qud2lkZW4oJysnKTsKKyAgTWludXMgPSBjdC53aWRlbignLScpOworICBwb3dfZSA9IGN0LndpZGVuKCdlJyk7CisgIHBvd19FID0gY3Qud2lkZW4oJ0UnKTsKKyAgY3Qud2lkZW4obmRpZ2l0cyArIDAsIG5kaWdpdHMgKyAxMCwgZGlnaXRzKTsKK30KKyNlbmRpZiAvKiBXQ0hBUl9UICovCisKKy8qCisgKiBfX3N0cmluZ190b19kb3VibGUgaXMganVzdCBsaWZ0ZWQgZnJvbSBhdG9mLCB0aGUgZGlmZmVyZW5jZSBiZWluZworICogdGhhdCB3ZSBqdXN0IHVzZSAnLicgZm9yIHRoZSBkZWNpbWFsIHBvaW50LCByYXRoZXIgdGhhbiBsZXQgaXQKKyAqIGJlIHRha2VuIGZyb20gdGhlIGN1cnJlbnQgQyBsb2NhbGUsIHdoaWNoIG9mIGNvdXJzZSBpcyBub3QgYWNjZXNzaWJsZQorICogdG8gdXMuCisgKi8KKyNpZiBkZWZpbmVkIChfU1RMUF9NU1ZDKSB8fCBkZWZpbmVkIChfX0JPUkxBTkRDX18pIHx8IGRlZmluZWQgKF9fSUNMKQordHlwZWRlZiB1bnNpZ25lZCBsb25nIHVpbnQzMjsKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCB1aW50NjQ7CisjICBkZWZpbmUgVUxMKHgpIHgjI1VpNjQKKyNlbGlmIGRlZmluZWQgKF9fdW5peCkgfHwgZGVmaW5lZCAoX19NSU5HVzMyX18pIHx8IFwKKyAgICAgIChkZWZpbmVkIChfX0RNQ19fKSAmJiAoX19MT05HTE9ORykpIHx8IGRlZmluZWQgKF9fV0FUQ09NQ19fKSB8fCBcCisgICAgICBkZWZpbmVkIChBTkRST0lEKQordHlwZWRlZiB1aW50MzJfdCB1aW50MzI7Cit0eXBlZGVmIHVpbnQ2NF90IHVpbnQ2NDsKKyMgIGRlZmluZSBVTEwoeCkgeCMjVUxMCisjZWxzZQorIyAgZXJyb3IgVGhlcmUgc2hvdWxkIGJlIHNvbWUgdW5zaWduZWQgNjQtYml0IGludGVnZXIgb24gdGhlIHN5c3RlbSEKKyNlbmRpZgorCisvLyBNdWx0aXBsaWNhdGlvbiBvZiB0d28gNjQtYml0IGludGVnZXJzLCBnaXZpbmcgYSAxMjgtYml0IHJlc3VsdC4KKy8vIFRha2VuIGZyb20gQWxnb3JpdGhtIE0gaW4gS251dGggc2VjdGlvbiA0LjMuMSwgd2l0aCB0aGUgbG9vcAorLy8gaGFuZC11bnJvbGxlZC4KK3N0YXRpYyB2b2lkIF9TdGxfbXVsdDY0KGNvbnN0IHVpbnQ2NCB1LCBjb25zdCB1aW50NjQgdiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NCYgaGlnaCwgdWludDY0JiBsb3cpIHsKKyAgY29uc3QgdWludDY0IGxvd19tYXNrID0gVUxMKDB4ZmZmZmZmZmYpOworICBjb25zdCB1aW50NjQgdTAgPSB1ICYgbG93X21hc2s7CisgIGNvbnN0IHVpbnQ2NCB1MSA9IHUgPj4gMzI7CisgIGNvbnN0IHVpbnQ2NCB2MCA9IHYgJiBsb3dfbWFzazsKKyAgY29uc3QgdWludDY0IHYxID0gdiA+PiAzMjsKKworICB1aW50NjQgdCA9IHUwICogdjA7CisgIGxvdyA9IHQgJiBsb3dfbWFzazsKKworICB0ID0gdTEgKiB2MCArICh0ID4+IDMyKTsKKyAgdWludDY0IHcxID0gdCAmIGxvd19tYXNrOworICB1aW50NjQgdzIgPSB0ID4+IDMyOworCisgIHVpbnQ2NCB4ID0gdTAgKiB2MSArIHcxOworICBsb3cgKz0gKHggJiBsb3dfbWFzaykgPDwgMzI7CisgIGhpZ2ggPSB1MSAqIHYxICsgdzIgKyAoeCA+PiAzMik7Cit9CisKKyNpZiAhZGVmaW5lZCAoX19saW51eF9fKSB8fCBkZWZpbmVkIChBTkRST0lEKQorCisjICBkZWZpbmUgYml0MTEgVUxMKDB4N2ZmKQorIyAgZGVmaW5lIGV4cG9uZW50X21hc2sgKGJpdDExIDw8IDUyKQorCisjICBpZiAhZGVmaW5lZCAoX19HTlVDX18pIHx8IChfX0dOVUNfXyAhPSAzKSB8fCAoX19HTlVDX01JTk9SX18gIT0gNCkgfHwgXAorICAgICAgKCFkZWZpbmVkIChfX0NZR1dJTl9fKSAmJiAhZGVmaW5lZCAoX19NSU5HVzMyX18pKQorLy9HZW5lcmF0ZSBiYWQgY29kZSB3aGVuIGNvbXBpbGVkIHdpdGggLU8yIG9wdGlvbi4KK2lubGluZQorIyAgZW5kaWYKK3ZvaWQgX1N0bF9zZXRfZXhwb25lbnQodWludDY0ICZ2YWwsIHVpbnQ2NCBleHApCit7IHZhbCA9ICh2YWwgJiB+ZXhwb25lbnRfbWFzaykgfCAoKGV4cCAmIGJpdDExKSA8PCA1Mik7IH0KKworI2VuZGlmIC8vIF9fbGludXhfXworCisvKiBQb3dlciBvZiB0ZW4gZnJhY3Rpb25zIGZvciB0ZW5zY2FsZSovCisvKiBUaGUgY29uc3RhbnRzIGFyZSBmYWN0b3JlZCBzbyB0aGF0IGF0IG1vc3QgdHdvIGNvbnN0YW50cworICogYW5kIHR3byBtdWx0aXBsaWVzIGFyZSBuZWVkZWQuIEZ1cnRoZXJtb3JlLCBvbmUgb2YgdGhlIGNvbnN0YW50cworICogaXMgcmVwcmVzZW50ZWQgZXhhY3RseSAtIDEwKipuIHdoZXJlIDE8PSBuIDw9IDI3LgorICovCisKK3N0YXRpYyBjb25zdCB1aW50NjQgX1N0bF90ZW5wb3dbODBdID0geworVUxMKDB4YTAwMDAwMDAwMDAwMDAwMCksIC8qIF9TdGxfdGVucG93WzBdPSgxMCoqMSkvKDIqKjQpICovCitVTEwoMHhjODAwMDAwMDAwMDAwMDAwKSwgLyogX1N0bF90ZW5wb3dbMV09KDEwKioyKS8oMioqNykgKi8KK1VMTCgweGZhMDAwMDAwMDAwMDAwMDApLCAvKiBfU3RsX3RlbnBvd1syXT0oMTAqKjMpLygyKioxMCkgKi8KK1VMTCgweDljNDAwMDAwMDAwMDAwMDApLCAvKiBfU3RsX3RlbnBvd1szXT0oMTAqKjQpLygyKioxNCkgKi8KK1VMTCgweGMzNTAwMDAwMDAwMDAwMDApLCAvKiBfU3RsX3RlbnBvd1s0XT0oMTAqKjUpLygyKioxNykgKi8KK1VMTCgweGY0MjQwMDAwMDAwMDAwMDApLCAvKiBfU3RsX3RlbnBvd1s1XT0oMTAqKjYpLygyKioyMCkgKi8KK1VMTCgweDk4OTY4MDAwMDAwMDAwMDApLCAvKiBfU3RsX3RlbnBvd1s2XT0oMTAqKjcpLygyKioyNCkgKi8KK1VMTCgweGJlYmMyMDAwMDAwMDAwMDApLCAvKiBfU3RsX3RlbnBvd1s3XT0oMTAqKjgpLygyKioyNykgKi8KK1VMTCgweGVlNmIyODAwMDAwMDAwMDApLCAvKiBfU3RsX3RlbnBvd1s4XT0oMTAqKjkpLygyKiozMCkgKi8KK1VMTCgweDk1MDJmOTAwMDAwMDAwMDApLCAvKiBfU3RsX3RlbnBvd1s5XT0oMTAqKjEwKS8oMioqMzQpICovCitVTEwoMHhiYTQzYjc0MDAwMDAwMDAwKSwgLyogX1N0bF90ZW5wb3dbMTBdPSgxMCoqMTEpLygyKiozNykgKi8KK1VMTCgweGU4ZDRhNTEwMDAwMDAwMDApLCAvKiBfU3RsX3RlbnBvd1sxMV09KDEwKioxMikvKDIqKjQwKSAqLworVUxMKDB4OTE4NGU3MmEwMDAwMDAwMCksIC8qIF9TdGxfdGVucG93WzEyXT0oMTAqKjEzKS8oMioqNDQpICovCitVTEwoMHhiNWU2MjBmNDgwMDAwMDAwKSwgLyogX1N0bF90ZW5wb3dbMTNdPSgxMCoqMTQpLygyKio0NykgKi8KK1VMTCgweGUzNWZhOTMxYTAwMDAwMDApLCAvKiBfU3RsX3RlbnBvd1sxNF09KDEwKioxNSkvKDIqKjUwKSAqLworVUxMKDB4OGUxYmM5YmYwNDAwMDAwMCksIC8qIF9TdGxfdGVucG93WzE1XT0oMTAqKjE2KS8oMioqNTQpICovCitVTEwoMHhiMWEyYmMyZWM1MDAwMDAwKSwgLyogX1N0bF90ZW5wb3dbMTZdPSgxMCoqMTcpLygyKio1NykgKi8KK1VMTCgweGRlMGI2YjNhNzY0MDAwMDApLCAvKiBfU3RsX3RlbnBvd1sxN109KDEwKioxOCkvKDIqKjYwKSAqLworVUxMKDB4OGFjNzIzMDQ4OWU4MDAwMCksIC8qIF9TdGxfdGVucG93WzE4XT0oMTAqKjE5KS8oMioqNjQpICovCitVTEwoMHhhZDc4ZWJjNWFjNjIwMDAwKSwgLyogX1N0bF90ZW5wb3dbMTldPSgxMCoqMjApLygyKio2NykgKi8KK1VMTCgweGQ4ZDcyNmI3MTc3YTgwMDApLCAvKiBfU3RsX3RlbnBvd1syMF09KDEwKioyMSkvKDIqKjcwKSAqLworVUxMKDB4ODc4Njc4MzI2ZWFjOTAwMCksIC8qIF9TdGxfdGVucG93WzIxXT0oMTAqKjIyKS8oMioqNzQpICovCitVTEwoMHhhOTY4MTYzZjBhNTdiNDAwKSwgLyogX1N0bF90ZW5wb3dbMjJdPSgxMCoqMjMpLygyKio3NykgKi8KK1VMTCgweGQzYzIxYmNlY2NlZGExMDApLCAvKiBfU3RsX3RlbnBvd1syM109KDEwKioyNCkvKDIqKjgwKSAqLworVUxMKDB4ODQ1OTUxNjE0MDE0ODRhMCksIC8qIF9TdGxfdGVucG93WzI0XT0oMTAqKjI1KS8oMioqODQpICovCitVTEwoMHhhNTZmYTViOTkwMTlhNWM4KSwgLyogX1N0bF90ZW5wb3dbMjVdPSgxMCoqMjYpLygyKio4NykgKi8KK1VMTCgweGNlY2I4ZjI3ZjQyMDBmM2EpLCAvKiBfU3RsX3RlbnBvd1syNl09KDEwKioyNykvKDIqKjkwKSAqLworCitVTEwoMHhkMGNmNGI1MGNmZTIwNzY2KSwgLyogX1N0bF90ZW5wb3dbMjddPSgxMCoqNTUpLygyKioxODMpICovCitVTEwoMHhkMmQ4MGRiMDJhYWJkNjJjKSwgLyogX1N0bF90ZW5wb3dbMjhdPSgxMCoqODMpLygyKioyNzYpICovCitVTEwoMHhkNGU1ZTJjZGMxZDFlYTk2KSwgLyogX1N0bF90ZW5wb3dbMjldPSgxMCoqMTExKS8oMioqMzY5KSAqLworVUxMKDB4ZDZmOGQ3NTA5MjkyZDYwMyksIC8qIF9TdGxfdGVucG93WzMwXT0oMTAqKjEzOSkvKDIqKjQ2MikgKi8KK1VMTCgweGQ5MTBmN2ZmMjgwNjlkYTQpLCAvKiBfU3RsX3RlbnBvd1szMV09KDEwKioxNjcpLygyKio1NTUpICovCitVTEwoMHhkYjJlNTFiZmU5ZDA2OTZhKSwgLyogX1N0bF90ZW5wb3dbMzJdPSgxMCoqMTk1KS8oMioqNjQ4KSAqLworVUxMKDB4ZGQ1MGYxOTk2Yjk0NzUxOSksIC8qIF9TdGxfdGVucG93WzMzXT0oMTAqKjIyMykvKDIqKjc0MSkgKi8KK1VMTCgweGRmNzhlNGIyYmQzNDJjZjcpLCAvKiBfU3RsX3RlbnBvd1szNF09KDEwKioyNTEpLygyKio4MzQpICovCitVTEwoMHhlMWE2Mzg1M2JiZDI2NDUxKSwgLyogX1N0bF90ZW5wb3dbMzVdPSgxMCoqMjc5KS8oMioqOTI3KSAqLworVUxMKDB4ZTNkOGY5ZTU2M2ExOThlNSksIC8qIF9TdGxfdGVucG93WzM2XT0oMTAqKjMwNykvKDIqKjEwMjApICovCisKKy8vIC8qIF9TdGxfdGVucG93WzM2XT0oMTAqKjMzNSkvKDIqKikgKi8KKy8vIC8qIF9TdGxfdGVucG93WzM2XT0oMTAqKjMzNSkvKDIqKikgKi8KKworVUxMKDB4ZmQ4N2I1ZjI4MzAwY2EwZSksIC8qIF9TdGxfdGVucG93WzM3XT0oMTAqKi0yOCkvKDIqKi05MykgKi8KK1VMTCgweGZiMTU4NTkyYmUwNjhkMmYpLCAvKiBfU3RsX3RlbnBvd1szOF09KDEwKiotNTYpLygyKiotMTg2KSAqLworVUxMKDB4ZjhhOTVmY2Y4ODc0N2Q5NCksIC8qIF9TdGxfdGVucG93WzM5XT0oMTAqKi04NCkvKDIqKi0yNzkpICovCitVTEwoMHhmNjQzMzViY2YwNjVkMzdkKSwgLyogX1N0bF90ZW5wb3dbNDBdPSgxMCoqLTExMikvKDIqKi0zNzIpICovCitVTEwoMHhmM2UyZjg5M2RlYzNmMTI2KSwgLyogX1N0bF90ZW5wb3dbNDFdPSgxMCoqLTE0MCkvKDIqKi00NjUpICovCitVTEwoMHhmMTg4OTliMWJjM2Y4Y2EyKSwgLyogX1N0bF90ZW5wb3dbNDJdPSgxMCoqLTE2OCkvKDIqKi01NTgpICovCitVTEwoMHhlZjM0MGE5ODE3MmFhY2U1KSwgLyogX1N0bF90ZW5wb3dbNDNdPSgxMCoqLTE5NikvKDIqKi02NTEpICovCitVTEwoMHhlY2U1M2NlYzRhMzE0ZWJlKSwgLyogX1N0bF90ZW5wb3dbNDRdPSgxMCoqLTIyNCkvKDIqKi03NDQpICovCitVTEwoMHhlYTljMjI3NzIzZWU4YmNiKSwgLyogX1N0bF90ZW5wb3dbNDVdPSgxMCoqLTI1MikvKDIqKi04MzcpICAgICAqLworVUxMKDB4ZTg1OGFkMjQ4ZjVjMjJjYSksIC8qIF9TdGxfdGVucG93WzQ2XT0oMTAqKi0yODApLygyKiotOTMwKSAqLworVUxMKDB4ZTYxYWNmMDMzZDFhNDVkZiksIC8qIF9TdGxfdGVucG93WzQ3XT0oMTAqKi0zMDgpLygyKiotMTAyMykgICAgKi8KK1VMTCgweGUzZTI3YTQ0NGQ4ZDk4YjgpLCAvKiBfU3RsX3RlbnBvd1s0OF09KDEwKiotMzM2KS8oMioqLTExMTYpICovCitVTEwoMHhlMWFmYTEzYWZiZDE0ZDZlKSAgLyogX1N0bF90ZW5wb3dbNDldPSgxMCoqLTM2NCkvKDIqKi0xMjA5KSAqLworfTsKKworc3RhdGljIGNvbnN0IHNob3J0IF9TdGxfdHdvZXhwWzgwXSA9IHsKKzQsNywxMCwxNCwxNywyMCwyNCwyNywzMCwzNCwzNyw0MCw0NCw0Nyw1MCw1NCw1Nyw2MCw2NCw2Nyw3MCw3NCw3Nyw4MCw4NCw4Nyw5MCwKKzE4MywyNzYsMzY5LDQ2Miw1NTUsNjQ4LDc0MSw4MzQsOTI3LDEwMjAsCistOTMsLTE4NiwtMjc5LC0zNzIsLTQ2NSwtNTU4LC02NTEsLTc0NCwtODM3LC05MzAsLTEwMjMsLTExMTYsLTEyMDkKK307CisKKyNkZWZpbmUgIFRFTl8xICAwICAgICAgICAgICAvKiBvZmZzZXQgdG8gMTAgKiogICAxICovCisjZGVmaW5lICBURU5fMjcgICAyNiAgICAgICAgLyogb2Zmc2V0IHRvIDEwICoqICAyNyAqLworI2RlZmluZSAgVEVOX00yOCAgMzcgICAgICAgIC8qIG9mZnNldCB0byAxMCAqKiAtMjggKi8KKyNkZWZpbmUgIE5VTV9ISV9QIDExCisjZGVmaW5lICBOVU1fSElfTiAxMworCisjZGVmaW5lIF9TdGxfSElCSVRVTEwgKFVMTCgxKSA8PCA2MykKKworc3RhdGljIHZvaWQgX1N0bF9ub3JtX2FuZF9yb3VuZCh1aW50NjQmIHAsIGludCYgbm9ybSwgdWludDY0IHByb2RoaSwgdWludDY0IHByb2RsbykgeworICBub3JtID0gMDsKKyAgaWYgKChwcm9kaGkgJiBfU3RsX0hJQklUVUxMKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxlYWRpbmcgYml0IGlzIGEgemVybworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBtYXkgaGF2ZSB0byBub3JtYWxpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYgKChwcm9kaGkgPT0gfl9TdGxfSElCSVRVTEwpICYmCisgICAgICAgICgocHJvZGxvID4+IDYyKSA9PSAweDMpKSB7ICAvKiBub3JtYWxpemF0aW9uIGZvbGxvd2VkIGJ5IHJvdW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB3b3VsZCBjYXVzZSBjYXJyeSB0byBjcmVhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGV4dHJhIGJpdCwgc28gZG9uJ3Qgbm9ybWFsaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIHAgPSBfU3RsX0hJQklUVUxMOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBwID0gKHByb2RoaSA8PCAxKSB8IChwcm9kbG8gPj4gNjMpOyAvKiBub3JtYWxpemUgKi8KKyAgICBub3JtID0gMTsKKyAgICBwcm9kbG8gPDw9IDE7CisgIH0KKyAgZWxzZSB7CisgICAgcCA9IHByb2RoaTsKKyAgfQorCisgIGlmICgocHJvZGxvICYgX1N0bF9ISUJJVFVMTCkgIT0gMCkgeyAgICAgLyogZmlyc3QgZ3VhcmQgYml0IGEgb25lICovCisgICAgaWYgKCgocCAmIDB4MSkgIT0gMCkgfHwKKyAgICAgICAgcHJvZGxvICE9IF9TdGxfSElCSVRVTEwgKSB7ICAgIC8qIG5vdCBib3JkZXJsaW5lIGZvciByb3VuZCB0byBldmVuICovCisgICAgICAvKiByb3VuZCAqLworICAgICAgKytwOworICAgICAgaWYgKHAgPT0gMCkKKyAgICAgICAgKytwOworICAgIH0KKyAgfQorfQorCisvLyBDb252ZXJ0IGEgNjQtYml0YiBmcmFjdGlvbiAqIDEwXmV4cCB0byBhIDY0LWJpdCBmcmFjdGlvbiAqIDJeYmV4cC4KKy8vIHA6ICAgIDY0LWJpdCBmcmFjdGlvbgorLy8gZXhwOiAgYmFzZS0xMCBleHBvbmVudAorLy8gYmV4cDogYmFzZS0yIGV4cG9uZW50IChvdXRwdXQgcGFyYW1ldGVyKQorc3RhdGljIHZvaWQgX1N0bF90ZW5zY2FsZSh1aW50NjQmIHAsIGludCBleHAsIGludCYgYmV4cCkgeworICBiZXhwID0gMDsKKworICBpZiAoIGV4cCA9PSAwICkgeyAgICAgICAgICAgICAgLyogbm8gc2NhbGluZyBuZWVkZWQgKi8KKyAgICByZXR1cm47CisgIH0KKworICBpbnQgZXhwX2hpID0gMCwgZXhwX2xvID0gZXhwOyAvKiBleHAgPSBleHBfaGkqMzIgKyBleHBfbG8gKi8KKyAgaW50IHRsbyA9IFRFTl8xLCB0aGk7ICAgICAgICAgLyogb2Zmc2V0cyBpbiBwb3dlciBvZiB0ZW4gdGFibGUgKi8KKyAgaW50IG51bV9oaTsgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGhpZ2ggZXhwb25lbnQgcG93ZXJzICovCisKKyAgaWYgKGV4cCA+IDApIHsgICAgICAgICAgICAgICAgLyogc3BsaXQgZXhwb25lbnQgKi8KKyAgICBpZiAoZXhwX2xvID4gMjcpIHsKKyAgICAgIGV4cF9sbysrOworICAgICAgd2hpbGUgKGV4cF9sbyA+IDI3KSB7CisgICAgICAgIGV4cF9oaSsrOworICAgICAgICBleHBfbG8gLT0gMjg7CisgICAgICB9CisgICAgfQorICAgIHRoaSA9IFRFTl8yNzsKKyAgICBudW1faGkgPSBOVU1fSElfUDsKKyAgfSBlbHNlIHsgLy8gZXhwIDwgMAorICAgIHdoaWxlIChleHBfbG8gPCAwKSB7CisgICAgICBleHBfaGkrKzsKKyAgICAgIGV4cF9sbyArPSAyODsKKyAgICB9CisgICAgdGhpID0gVEVOX00yODsKKyAgICBudW1faGkgPSBOVU1fSElfTjsKKyAgfQorCisgIHVpbnQ2NCBwcm9kaGksIHByb2RsbzsgICAgICAgIC8qIDEyOGIgcHJvZHVjdCAqLworICBpbnQgbm9ybTsgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgYml0cyBvZiBub3JtYWxpemF0aW9uICovCisKKyAgaW50IGhpLCBsbzsgICAgICAgICAgICAgICAgICAgLyogb2Zmc2V0cyBpbiBwb3dlciBvZiB0ZW4gdGFibGUgKi8KKyAgd2hpbGUgKGV4cF9oaSkgeyAgICAgICAgICAgICAgLyogc2NhbGUgKi8KKyAgICBoaSA9IChtaW4pIChleHBfaGksIG51bV9oaSk7ICAgIC8qIG9ubHkgYSBmZXcgbGFyZ2UgcG93ZXJzIG9mIDEwICovCisgICAgZXhwX2hpIC09IGhpOyAgICAgICAgICAgICAgIC8qIGNvdWxkIGl0ZXJhdGUgaW4gZXh0cmVtZSBjYXNlICovCisgICAgaGkgKz0gdGhpLTE7CisgICAgX1N0bF9tdWx0NjQocCwgX1N0bF90ZW5wb3dbaGldLCBwcm9kaGksIHByb2Rsbyk7CisgICAgX1N0bF9ub3JtX2FuZF9yb3VuZChwLCBub3JtLCBwcm9kaGksIHByb2Rsbyk7CisgICAgYmV4cCArPSBfU3RsX3R3b2V4cFtoaV0gLSBub3JtOworICB9CisKKyAgaWYgKGV4cF9sbykgeworICAgIGxvID0gdGxvICsgZXhwX2xvIC0xOworICAgIF9TdGxfbXVsdDY0KHAsIF9TdGxfdGVucG93W2xvXSwgcHJvZGhpLCBwcm9kbG8pOworICAgIF9TdGxfbm9ybV9hbmRfcm91bmQocCwgbm9ybSwgcHJvZGhpLCBwcm9kbG8pOworICAgIGJleHAgKz0gX1N0bF90d29leHBbbG9dIC0gbm9ybTsKKyAgfQorCisgIHJldHVybjsKK30KKworLy8gRmlyc3QgYXJndW1lbnQgaXMgYSBidWZmZXIgb2YgdmFsdWVzIGZyb20gMCB0byA5LCBOT1QgYXNjaWkuCisvLyBTZWNvbmQgYXJndW1lbnQgaXMgbnVtYmVyIG9mIGRpZ2l0cyBpbiBidWZmZXIsIDEgPD0gZGlnaXRzIDw9IDE3LgorLy8gVGhpcmQgYXJndW1lbnQgaXMgYmFzZS0xMCBleHBvbmVudC4KKworLyogSUVFRSByZXByZXNlbnRhdGlvbiAqLworI2lmICFkZWZpbmVkIChfX2xpbnV4X18pIHx8IGRlZmluZWQgKEFORFJPSUQpCisKK3VuaW9uIF9Eb3VibGVfcmVwIHsKKyAgdWludDY0IGl2YWw7CisgIGRvdWJsZSB2YWw7Cit9OworCitzdGF0aWMgZG91YmxlIF9TdGxfYXRvZChjaGFyICpidWZmZXIsIHB0cmRpZmZfdCBuZGlnaXQsIGludCBkZXhwKSB7CisgIHR5cGVkZWYgbnVtZXJpY19saW1pdHM8ZG91YmxlPiBsaW1pdHM7CisgIF9Eb3VibGVfcmVwIGRyZXA7CisgIHVpbnQ2NCAmdmFsdWUgPSBkcmVwLml2YWw7ICAvKiBWYWx1ZSBkZXZlbG9wcyBhcyBmb2xsb3dzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAxKSBkZWNpbWFsIGRpZ2l0cyBhcyBhbiBpbnRlZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIDIpIGxlZnQgYWRqdXN0ZWQgZnJhY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogMykgcmlnaHQgYWRqdXN0ZWQgZnJhY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogNCkgZXhwb25lbnQgYW5kIGZyYWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIHVpbnQzMiBndWFyZDsgICAgICAgICAvKiBGaXJzdCBndWFyZCBiaXQgKi8KKyAgdWludDY0IHJlc3Q7ICAgICAgICAgIC8qIFJlbWFpbmluZyBndWFyZCBiaXRzICovCisKKyAgaW50IGJleHA7ICAgICAgICAgICAgIC8qIGJpbmFyeSBleHBvbmVudCAqLworICBpbnQgbnplcm87ICAgICAgICAgICAgLyogbnVtYmVyIG9mIG5vbi16ZXJvIGJpdHMgKi8KKyAgaW50IHNleHA7ICAgICAgICAgICAgIC8qIHNjYWxpbmcgZXhwb25lbnQgKi8KKworICBjaGFyICpidWZmZXJlbmQ7ICAgICAgICAgICAgICAvKiBwb2ludGVyIHRvIGNoYXIgYWZ0ZXIgbGFzdCBkaWdpdCAqLworCisgIC8qIENvbnZlcnQgdGhlIGRlY2ltYWwgZGlnaXRzIHRvIGEgYmluYXJ5IGludGVnZXIuICovCisgIGJ1ZmZlcmVuZCA9IGJ1ZmZlciArIG5kaWdpdDsKKyAgdmFsdWUgPSAwOworCisgIHdoaWxlIChidWZmZXIgPCBidWZmZXJlbmQpIHsKKyAgICB2YWx1ZSAqPSAxMDsKKyAgICB2YWx1ZSArPSAqYnVmZmVyKys7CisgIH0KKworICAvKiBDaGVjayBmb3IgemVybyBhbmQgdHJlYXQgaXQgYXMgYSBzcGVjaWFsIGNhc2UgKi8KKyAgaWYgKHZhbHVlID09IDApIHsKKyAgICByZXR1cm4gMC4wOworICB9CisKKyAgLyogTm9ybWFsaXplIHZhbHVlICovCisgIGJleHAgPSA2NDsgICAgICAgICAgICAgICAgICAgIC8qIGNvbnZlcnQgZnJvbSA2NGIgaW50IHRvIGZyYWN0aW9uICovCisKKyAgLyogQ291bnQgbnVtYmVyIG9mIG5vbi16ZXJvZXMgaW4gdmFsdWUgKi8KKyAgbnplcm8gPSAwOworICBpZiAoKHZhbHVlID4+IDMyKSAhPSAwKSB7IG56ZXJvICA9IDMyOyB9ICAgIC8vKlRZIDAzLzI1LzIwMDAgLSBhZGRlZCBleHBsaWNpdCBjb21wYXJpc29uIHRvIHplcm8gdG8gYXZvaWQgdWludDY0IHRvIGJvb2wgY29udmVyc2lvbiBvcGVyYXRvcgorICBpZiAoKHZhbHVlID4+ICgxNiArIG56ZXJvKSkgIT0gMCkgeyBuemVybyArPSAxNjsgfQorICBpZiAoKHZhbHVlID4+ICggOCArIG56ZXJvKSkgIT0gMCkgeyBuemVybyArPSAgODsgfQorICBpZiAoKHZhbHVlID4+ICggNCArIG56ZXJvKSkgIT0gMCkgeyBuemVybyArPSAgNDsgfQorICBpZiAoKHZhbHVlID4+ICggMiArIG56ZXJvKSkgIT0gMCkgeyBuemVybyArPSAgMjsgfQorICBpZiAoKHZhbHVlID4+ICggMSArIG56ZXJvKSkgIT0gMCkgeyBuemVybyArPSAgMTsgfQorICBpZiAoKHZhbHVlID4+ICggICAgIG56ZXJvKSkgIT0gMCkgeyBuemVybyArPSAgMTsgfQorCisgIC8qIE5vcm1hbGl6ZSAqLworICB2YWx1ZSA8PD0gLyoodWludDY0KSovICg2NCAtIG56ZXJvKTsgICAgLy8qVFkgMDMvMjUvMjAwMCAtIHJlbW92ZWQgZXh0cmFuZW91cyBjYXN0IHRvIHVpbnQ2NAorICBiZXhwIC09IDY0IC0gbnplcm87CisKKyAgLyogQXQgdGhpcyBwb2ludCB3ZSBoYXZlIGEgNjRiIGZyYWN0aW9uIGFuZCBhIGJpbmFyeSBleHBvbmVudAorICAgKiBidXQgaGF2ZSB5ZXQgdG8gaW5jb3Jwb3JhdGUgdGhlIGRlY2ltYWwgZXhwb25lbnQuCisgICAqLworCisgIC8qIG11bHRpcGx5IGJ5IDEwXmRleHAgKi8KKyAgX1N0bF90ZW5zY2FsZSh2YWx1ZSwgZGV4cCwgc2V4cCk7CisgIGJleHAgKz0gc2V4cDsKKworICBpZiAoYmV4cCA8PSAtMTAyMikgeyAgICAgICAgICAvKiBISSBkZW5vcm0gb3IgdW5kZXJmbG93ICovCisgICAgYmV4cCArPSAxMDIyOworICAgIGlmIChiZXhwIDwgLTUzKSB7ICAgICAgICAgIC8qIGd1YXJhbnRlZWQgdW5kZXJmbG93ICovCisgICAgICB2YWx1ZSA9IDA7CisgICAgfQorICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAvKiBkZW5vcm0gb3IgcG9zc2libGUgdW5kZXJmbG93ICovCisgICAgICBpbnQgbGVhZDAgPSAxMiAtIGJleHA7ICAgICAgICAgIC8qIDEyIHNpZ24gYW5kIGV4cG9uZW50IGJpdHMgKi8KKworICAgICAgLyogd2UgbXVzdCBzcGVjaWFsIGNhc2UgcmlnaHQgc2hpZnRzIG9mIG1vcmUgdGhhbiA2MyAqLworICAgICAgaWYgKGxlYWQwID4gNjQpIHsKKyAgICAgICAgcmVzdCA9IHZhbHVlOworICAgICAgICBndWFyZCA9IDA7CisgICAgICAgIHZhbHVlID0gMDsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGxlYWQwID09IDY0KSB7CisgICAgICAgIHJlc3QgPSB2YWx1ZSAmICgoVUxMKDEpPDwgNjMpLTEpOworICAgICAgICBndWFyZCA9ICh1aW50MzIpICgodmFsdWU+PiA2MykgJiAxICk7CisgICAgICAgIHZhbHVlID0gMDsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICByZXN0ID0gdmFsdWUgJiAoKChVTEwoMSkgPDwgbGVhZDApLTEpLTEpOworICAgICAgICBndWFyZCA9ICh1aW50MzIpICgoKHZhbHVlPj4gbGVhZDApLTEpICYgMSk7CisgICAgICAgIHZhbHVlID4+PSAvKih1aW50NjQpKi8gbGVhZDA7IC8qIGV4cG9uZW50IGlzIHplcm8gKi8KKyAgICAgIH0KKworICAgICAgLyogUm91bmQgKi8KKyAgICAgIGlmIChndWFyZCAmJiAoKHZhbHVlICYgMSkgfHwgcmVzdCkgKSB7CisgICAgICAgICsrdmFsdWU7CisgICAgICAgIGlmICh2YWx1ZSA9PSAoVUxMKDEpIDw8IChsaW1pdHM6OmRpZ2l0cyAtIDEpKSkgeyAvKiBjYXJyeSBjcmVhdGVkIG5vcm1hbCBudW1iZXIgKi8KKyAgICAgICAgICB2YWx1ZSA9IDA7CisgICAgICAgICAgX1N0bF9zZXRfZXhwb25lbnQodmFsdWUsIDEpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdCB6ZXJvIG9yIGRlbm9ybSAqLworICAgIC8qIFJvdW5kIHRvIDUzIGJpdHMgKi8KKyAgICByZXN0ID0gdmFsdWUgJiAoKDEgPDwgMTApIC0gMSk7CisgICAgdmFsdWUgPj49IDEwOworICAgIGd1YXJkID0gKHVpbnQzMikgdmFsdWUgJiAxOworICAgIHZhbHVlID4+PSAxOworCisgICAgLyogIHZhbHVlJjEgZ3VhcmQgICByZXN0ICAgIEFjdGlvbgorICAgICAqCisgICAgICogIGRjICAgICAgMCAgICAgICBkYyAgICAgIG5vbmUKKyAgICAgKiAgMSAgICAgICAxICAgICAgIGRjICAgICAgcm91bmQKKyAgICAgKiAgMCAgICAgICAxICAgICAgIDAgICAgICAgbm9uZQorICAgICAqICAwICAgICAgIDEgICAgICAgIT0wICAgICByb3VuZAorICAgICAqLworICAgIGlmIChndWFyZCkgeworICAgICAgaWYgKCgodmFsdWUmMSkhPTApIHx8IChyZXN0IT0wKSkgeworICAgICAgICArK3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJvdW5kICovCisgICAgICAgIGlmICgodmFsdWUgPj4gNTMpICE9IDApIHsgICAgICAgLyogY2FycnkgYWxsIHRoZSB3YXkgYWNyb3NzICovCisgICAgICAgICAgdmFsdWUgPj49IDE7ICAgICAgICAgIC8qIHJlbm9ybWFsaXplICovCisgICAgICAgICAgKytiZXhwOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIC8qCisgICAgICogQ2hlY2sgZm9yIG92ZXJmbG93CisgICAgICogSUVFRSBEb3VibGUgUHJlY2lzaW9uIEZvcm1hdAorICAgICAqIChGcm9tIFRhYmxlIDctOCBvZiBLYW5lIGFuZCBIZWlucmljaCkKKyAgICAgKgorICAgICAqIEZyYWN0aW9uIGJpdHMgICAgICAgICAgICAgICA1MgorICAgICAqIEVtYXggICAgICAgICAgICAgICAgICAgICArMTAyMworICAgICAqIEVtaW4gICAgICAgICAgICAgICAgICAgICAtMTAyMgorICAgICAqIEV4cG9uZW50IGJpYXMgICAgICAgICAgICArMTAyMworICAgICAqIEV4cG9uZW50IGJpdHMgICAgICAgICAgICAgICAxMQorICAgICAqIEludGVnZXIgYml0ICAgICAgICAgICAgIGhpZGRlbgorICAgICAqIFRvdGFsIHdpZHRoIGluIGJpdHMgICAgICAgICA2NAorICAgICAqLworCisgICAgaWYgKGJleHAgPiBsaW1pdHM6Om1heF9leHBvbmVudCkgeyAgICAgICAgICAvKiBvdmVyZmxvdyAqLworICAgICAgcmV0dXJuIGxpbWl0czo6aW5maW5pdHkoKTsKKyAgICB9CisgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIHZhbHVlIGlzIG5vcm1hbCAqLworICAgICAgdmFsdWUgJj0gfihVTEwoMSkgPDwgKGxpbWl0czo6ZGlnaXRzIC0gMSkpOyAgIC8qIGhpZGUgaGlkZGVuIGJpdCAqLworICAgICAgX1N0bF9zZXRfZXhwb25lbnQodmFsdWUsIGJleHAgKyAxMDIyKTsgLyogYWRkIGJpYXMgKi8KKyAgICB9CisgIH0KKworICBfU1RMUF9TVEFUSUNfQVNTRVJUKHNpemVvZih1aW50NjQpID49IHNpemVvZihkb3VibGUpKQorICByZXR1cm4gZHJlcC52YWw7Cit9CisKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19saW51eF9fKSB8fCBkZWZpbmVkIChfX01JTkdXMzJfXykgfHwgZGVmaW5lZCAoX19DWUdXSU5fXykgfHwgXAorICAgIGRlZmluZWQgKF9fQk9STEFORENfXykgfHwgZGVmaW5lZCAoX19ETUNfXykgfHwgZGVmaW5lZCAoX19IUF9hQ0MpCisKK3RlbXBsYXRlIDxjbGFzcyBELCBjbGFzcyBJRUVFLCBpbnQgTSwgaW50IEJJQVM+CitEIF9TdGxfYXRvZFQoY2hhciAqYnVmZmVyLCBwdHJkaWZmX3QgbmRpZ2l0LCBpbnQgZGV4cCkKK3sKKyAgdHlwZWRlZiBudW1lcmljX2xpbWl0czxEPiBsaW1pdHM7CisKKyAgLyogQ29udmVydCB0aGUgZGVjaW1hbCBkaWdpdHMgdG8gYSBiaW5hcnkgaW50ZWdlci4gKi8KKyAgY2hhciAqYnVmZmVyZW5kID0gYnVmZmVyICsgbmRpZ2l0OyAvKiBwb2ludGVyIHRvIGNoYXIgYWZ0ZXIgbGFzdCBkaWdpdCAqLworICBfbGwgdnY7CisgIHZ2Lmk2NCA9IDBMOworCisgIHdoaWxlICggYnVmZmVyIDwgYnVmZmVyZW5kICkgeworICAgIHZ2Lmk2NCAqPSAxMDsKKyAgICB2di5pNjQgKz0gKmJ1ZmZlcisrOworICB9CisKKyAgaWYgKCB2di5pNjQgPT0gVUxMKDApICkgeyAvKiBDaGVjayBmb3IgemVybyBhbmQgdHJlYXQgaXQgYXMgYSBzcGVjaWFsIGNhc2UgKi8KKyAgICByZXR1cm4gRCgwLjApOworICB9CisKKyAgLyogTm9ybWFsaXplIHZhbHVlICovCisKKyAgaW50IGJleHAgPSA2NDsgLyogY29udmVydCBmcm9tIDY0YiBpbnQgdG8gZnJhY3Rpb24gKi8KKworICAvKiBDb3VudCBudW1iZXIgb2Ygbm9uLXplcm9lcyBpbiB2YWx1ZSAqLworICBpbnQgbnplcm8gPSAwOworICBpZiAoKHZ2Lmk2NCA+PiAzMikgIT0gMCkgeyBuemVybyA9IDMyOyB9CisgIGlmICgodnYuaTY0ID4+ICgxNiArIG56ZXJvKSkgIT0gMCkgeyBuemVybyArPSAxNjsgfQorICBpZiAoKHZ2Lmk2NCA+PiAoIDggKyBuemVybykpICE9IDApIHsgbnplcm8gKz0gIDg7IH0KKyAgaWYgKCh2di5pNjQgPj4gKCA0ICsgbnplcm8pKSAhPSAwKSB7IG56ZXJvICs9ICA0OyB9CisgIGlmICgodnYuaTY0ID4+ICggMiArIG56ZXJvKSkgIT0gMCkgeyBuemVybyArPSAgMjsgfQorICBpZiAoKHZ2Lmk2NCA+PiAoIDEgKyBuemVybykpICE9IDApIHsgbnplcm8gKz0gIDE7IH0KKyAgaWYgKCh2di5pNjQgPj4gKCAgICAgbnplcm8pKSAhPSAwKSB7IG56ZXJvICs9ICAxOyB9CisKKyAgLyogTm9ybWFsaXplICovCisgIG56ZXJvID0gNjQgLSBuemVybzsKKyAgdnYuaTY0IDw8PSBuemVybzsgICAgLy8gKiBUWSAwMy8yNS8yMDAwIC0gcmVtb3ZlZCBleHRyYW5lb3VzIGNhc3QgdG8gdWludDY0CisgIGJleHAgLT0gbnplcm87CisKKyAgLyogQXQgdGhpcyBwb2ludCB3ZSBoYXZlIGEgNjRiIGZyYWN0aW9uIGFuZCBhIGJpbmFyeSBleHBvbmVudAorICAgKiBidXQgaGF2ZSB5ZXQgdG8gaW5jb3Jwb3JhdGUgdGhlIGRlY2ltYWwgZXhwb25lbnQuCisgICAqLworCisgIC8qIG11bHRpcGx5IGJ5IDEwXmRleHAgKi8KKyAgaW50IHNleHA7CisgIF9TdGxfdGVuc2NhbGUodnYuaTY0LCBkZXhwLCBzZXhwKTsKKyAgYmV4cCArPSBzZXhwOworCisgIGlmICggYmV4cCA+PSBsaW1pdHM6Om1pbl9leHBvbmVudCApIHsgLyogbm90IHplcm8gb3IgZGVub3JtICovCisgICAgaWYgKCBsaW1pdHM6OmRpZ2l0cyA8IDY0ICkgeworICAgICAgLyogUm91bmQgdG8gKDY0IC0gTSArIDEpIGJpdHMgKi8KKyAgICAgIHVpbnQ2NF90IHJlc3QgPSB2di5pNjQgJiAoKH5VTEwoMCkgLyBVTEwoMikpID4+IChsaW1pdHM6OmRpZ2l0cyAtIDEpKTsKKyAgICAgIHZ2Lmk2NCA+Pj0gTSAtIDI7CisgICAgICB1aW50MzJfdCBndWFyZCA9ICh1aW50MzIpIHZ2Lmk2NCAmIDE7CisgICAgICB2di5pNjQgPj49IDE7CisKKyAgICAgIC8qICB2YWx1ZSYxIGd1YXJkICAgcmVzdCAgICBBY3Rpb24KKyAgICAgICAqCisgICAgICAgKiAgZGMgICAgICAwICAgICAgIGRjICAgICAgbm9uZQorICAgICAgICogIDEgICAgICAgMSAgICAgICBkYyAgICAgIHJvdW5kCisgICAgICAgKiAgMCAgICAgICAxICAgICAgIDAgICAgICAgbm9uZQorICAgICAgICogIDAgICAgICAgMSAgICAgICAhPTAgICAgIHJvdW5kCisgICAgICAgKi8KKworICAgICAgaWYgKGd1YXJkKSB7CisgICAgICAgIGlmICggKCh2di5pNjQgJiAxKSAhPSAwKSB8fCAocmVzdCAhPSAwKSApIHsKKyAgICAgICAgICB2di5pNjQrKzsgICAgICAgLyogcm91bmQgKi8KKyAgICAgICAgICBpZiAoICh2di5pNjQgPj4gKGxpbWl0czo6ZGlnaXRzIDwgNjQgPyBsaW1pdHM6OmRpZ2l0cyA6IDApKSAhPSAwICkgeyAvKiBjYXJyeSBhbGwgdGhlIHdheSBhY3Jvc3MgKi8KKyAgICAgICAgICAgIHZ2Lmk2NCA+Pj0gMTsgLyogcmVub3JtYWxpemUgKi8KKyAgICAgICAgICAgICsrYmV4cDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdnYuaTY0ICY9IH4oVUxMKDEpIDw8IChsaW1pdHM6OmRpZ2l0cyAtIDEpKTsgLyogaGlkZSBoaWRkZW4gYml0ICovCisgICAgfQorICAgIC8qCisgICAgICogQ2hlY2sgZm9yIG92ZXJmbG93CisgICAgICogSUVFRSBEb3VibGUgUHJlY2lzaW9uIEZvcm1hdAorICAgICAqIChGcm9tIFRhYmxlIDctOCBvZiBLYW5lIGFuZCBIZWlucmljaCkKKyAgICAgKgorICAgICAqIEZyYWN0aW9uIGJpdHMgICAgICAgICAgICAgICA1MgorICAgICAqIEVtYXggICAgICAgICAgICAgICAgICAgICArMTAyMworICAgICAqIEVtaW4gICAgICAgICAgICAgICAgICAgICAtMTAyMgorICAgICAqIEV4cG9uZW50IGJpYXMgICAgICAgICAgICArMTAyMworICAgICAqIEV4cG9uZW50IGJpdHMgICAgICAgICAgICAgICAxMQorICAgICAqIEludGVnZXIgYml0ICAgICAgICAgICAgIGhpZGRlbgorICAgICAqIFRvdGFsIHdpZHRoIGluIGJpdHMgICAgICAgICA2NAorICAgICAqLworCisgICAgaWYgKGJleHAgPiBsaW1pdHM6Om1heF9leHBvbmVudCkgeyAvKiBvdmVyZmxvdyAqLworICAgICAgcmV0dXJuIGxpbWl0czo6aW5maW5pdHkoKTsKKyAgICB9CisKKyAgICAvKiB2YWx1ZSBpcyBub3JtYWwgKi8KKworICAgIElFRUUgdjsKKworICAgIHYuaWVlZS5tYW50aXNzYTAgPSB2di5pMzIuaGk7CisgICAgdi5pZWVlLm1hbnRpc3NhMSA9IHZ2LmkzMi5sbzsKKyAgICB2LmllZWUubmVnYXRpdmUgPSAwOworICAgIHYuaWVlZS5leHBvbmVudCA9IGJleHAgKyBCSUFTIC0gMTsKKworICAgIHJldHVybiB2LmQ7CisgIH0KKworICAvKiBISSBkZW5vcm0gb3IgdW5kZXJmbG93ICovCisgIGJleHAgKz0gQklBUyAtIDE7CisgIGlmIChiZXhwIDwgLWxpbWl0czo6ZGlnaXRzKSB7IC8qIGd1YXJhbnRlZWQgdW5kZXJmbG93ICovCisgICAgdnYuaTY0ID0gMDsKKyAgfSBlbHNlIHsgIC8qIGRlbm9ybSBvciBwb3NzaWJsZSB1bmRlcmZsb3cgKi8KKworICAgIC8qCisgICAgICogUHJvYmxlbSBwb2ludCBmb3IgbG9uZyBkb3VibGU6IGxvb2tzIGxpa2UgdGhpcyBjb2RlIHJlZmxlY3Qgc2hhcmVpbmcgb2YgbWFudGlzc2EKKyAgICAgKiBhbmQgZXhwb25lbnQgaW4gNjRiIGludDsgbm90IHNvIGZvciBsb25nIGRvdWJsZQorICAgICAqLworCisgICAgaW50IGxlYWQwID0gTSAtIGJleHA7IC8qIE0gPSAxMiBzaWduIGFuZCBleHBvbmVudCBiaXRzICovCisgICAgdWludDY0X3QgcmVzdDsKKyAgICB1aW50MzJfdCBndWFyZDsKKworICAgIC8qIHdlIG11c3Qgc3BlY2lhbCBjYXNlIHJpZ2h0IHNoaWZ0cyBvZiBtb3JlIHRoYW4gNjMgKi8KKworICAgIGlmIChsZWFkMCA+IDY0KSB7CisgICAgICByZXN0ID0gdnYuaTY0OworICAgICAgZ3VhcmQgPSAwOworICAgICAgdnYuaTY0ID0gMDsKKyAgICB9IGVsc2UgaWYgKGxlYWQwID09IDY0KSB7CisgICAgICByZXN0ID0gdnYuaTY0ICYgKChVTEwoMSkgPDwgNjMpLTEpOworICAgICAgZ3VhcmQgPSAodWludDMyKSAoKHZ2Lmk2NCA+PiA2MykgJiAxICk7CisgICAgICB2di5pNjQgPSAwOworICAgIH0gZWxzZSB7CisgICAgICByZXN0ID0gdnYuaTY0ICYgKCgoVUxMKDEpIDw8IGxlYWQwKS0xKS0xKTsKKyAgICAgIGd1YXJkID0gKHVpbnQzMikgKCgodnYuaTY0ID4+IGxlYWQwKS0xKSAmIDEpOworICAgICAgdnYuaTY0ID4+PSAvKih1aW50NjQpKi8gbGVhZDA7IC8qIGV4cG9uZW50IGlzIHplcm8gKi8KKyAgICB9CisKKyAgICAvKiBSb3VuZCAqLworICAgIGlmIChndWFyZCAmJiAoICh2di5pNjQgJiAxKSB8fCByZXN0KSkgeworICAgICAgdnYuaTY0Kys7CisgICAgICBpZiAodnYuaTY0ID09IChVTEwoMSkgPDwgKGxpbWl0czo6ZGlnaXRzIC0gMSkpKSB7IC8qIGNhcnJ5IGNyZWF0ZWQgbm9ybWFsIG51bWJlciAqLworICAgICAgICBJRUVFIHY7CisKKyAgICAgICAgdi5pZWVlLm1hbnRpc3NhMCA9IDA7CisgICAgICAgIHYuaWVlZS5tYW50aXNzYTEgPSAwOworICAgICAgICB2LmllZWUubmVnYXRpdmUgPSAwOworICAgICAgICB2LmllZWUuZXhwb25lbnQgPSAxOworICAgICAgICByZXR1cm4gdi5kOworICAgICAgfQorICAgIH0KKyAgfQorCisgIElFRUUgdjsKKworICB2LmllZWUubWFudGlzc2EwID0gdnYuaTMyLmhpOworICB2LmllZWUubWFudGlzc2ExID0gdnYuaTMyLmxvOworICB2LmllZWUubmVnYXRpdmUgPSAwOworICB2LmllZWUuZXhwb25lbnQgPSAwOworCisgIHJldHVybiB2LmQ7Cit9CisjZW5kaWYgLy8gX19saW51eF9fCisKKyNpZiAhZGVmaW5lZCAoX19saW51eF9fKSB8fCBkZWZpbmVkIChBTkRST0lEKQorc3RhdGljIGRvdWJsZSBfU3RsX3N0cmluZ190b19kb3VibGUoY29uc3QgY2hhciAqcykgeworICB0eXBlZGVmIG51bWVyaWNfbGltaXRzPGRvdWJsZT4gbGltaXRzOworICBjb25zdCBpbnQgbWF4X2RpZ2l0cyA9IGxpbWl0czo6ZGlnaXRzMTAgKyAyOworICB1bnNpZ25lZCBjOworICB1bnNpZ25lZCBOZWdhdGUsIGRlY2ltYWxfcG9pbnQ7CisgIGNoYXIgKmQ7CisgIGludCBleHA7CisgIGludCBkcGNoYXI7CisgIGNoYXIgZGlnaXRzW21heF9kaWdpdHNdOworCisgIGMgPSAqcysrOworCisgIC8qIHByb2Nlc3Mgc2lnbiAqLworICBOZWdhdGUgPSAwOworICBpZiAoYyA9PSAnKycpIHsKKyAgICBjID0gKnMrKzsKKyAgfSBlbHNlIGlmIChjID09ICctJykgeworICAgIE5lZ2F0ZSA9IDE7CisgICAgYyA9ICpzKys7CisgIH0KKworICBkID0gZGlnaXRzOworICBkcGNoYXIgPSAnLicgLSAnMCc7CisgIGRlY2ltYWxfcG9pbnQgPSAwOworICBleHAgPSAwOworCisgIGZvciAoOzspIHsKKyAgICBjIC09ICcwJzsKKyAgICBpZiAoYyA8IDEwKSB7CisgICAgICBpZiAoZCA9PSBkaWdpdHMgKyBtYXhfZGlnaXRzKSB7CisgICAgICAgIC8qIGlnbm9yZSBtb3JlIHRoYW4gbWF4X2RpZ2l0cyBkaWdpdHMsIGJ1dCBhZGp1c3QgZXhwb25lbnQgKi8KKyAgICAgICAgZXhwICs9IChkZWNpbWFsX3BvaW50IF4gMSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoYyA9PSAwICYmIGQgPT0gZGlnaXRzKSB7CisgICAgICAgICAgLyogaWdub3JlIGxlYWRpbmcgemVyb3MgKi8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAqZCsrID0gKGNoYXIpIGM7CisgICAgICAgIH0KKyAgICAgICAgZXhwIC09IGRlY2ltYWxfcG9pbnQ7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChjID09ICh1bnNpZ25lZCBpbnQpIGRwY2hhciAmJiAhZGVjaW1hbF9wb2ludCkgeyAvKiBJTlRFUk5BVElPTkFMICovCisgICAgICBkZWNpbWFsX3BvaW50ID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGMgPSAqcysrOworICB9CisKKyAgLyogc3RydG9kIGNhbnQgcmV0dXJuIHVudGlsIGl0IGZpbmRzIHRoZSBlbmQgb2YgdGhlIGV4cG9uZW50ICovCisgIGlmIChkID09IGRpZ2l0cykgeworICAgIHJldHVybiAwLjA7CisgIH0KKworICBpZiAoYyA9PSAnZScgLSAnMCcgfHwgYyA9PSAnRScgLSAnMCcpIHsKKyAgICByZWdpc3RlciB1bnNpZ25lZCBuZWdhdGVfZXhwID0gMDsKKyAgICByZWdpc3RlciBpbnQgZSA9IDA7CisgICAgYyA9ICpzKys7CisgICAgaWYgKGMgPT0gJysnIHx8IGMgPT0gJyAnKSB7CisgICAgICBjID0gKnMrKzsKKyAgICB9IGVsc2UgaWYgKGMgPT0gJy0nKSB7CisgICAgICBuZWdhdGVfZXhwID0gMTsKKyAgICAgIGMgPSAqcysrOworICAgIH0KKyAgICBpZiAoYyAtPSAnMCcsIGMgPCAxMCkgeworICAgICAgZG8geworICAgICAgICBlID0gZSAqIDEwICsgKGludCljOworICAgICAgICBjID0gKnMrKzsKKyAgICAgIH0gd2hpbGUgKGMgLT0gJzAnLCBjIDwgMTApOworCisgICAgICBpZiAobmVnYXRlX2V4cCkgeworICAgICAgICBlID0gLWU7CisgICAgICB9CisgICAgICBleHAgKz0gZTsKKyAgICB9CisgIH0KKworICBkb3VibGUgeDsKKyAgcHRyZGlmZl90IG4gPSBkIC0gZGlnaXRzOworICBpZiAoKGV4cCArIG4gLSAxKSA8IGxpbWl0czo6bWluX2V4cG9uZW50MTApIHsKKyAgICB4ID0gMDsKKyAgfQorICBlbHNlIGlmICgoZXhwICsgbiAtIDEpID4gbGltaXRzOjptYXhfZXhwb25lbnQxMCkgeworICAgIHggPSBsaW1pdHM6OmluZmluaXR5KCk7CisgIH0KKyAgZWxzZSB7CisgICAgLyogTGV0IF9TdGxfYXRvZCBkaWFnbm9zZSB1bmRlci0gYW5kIG92ZXItZmxvd3MuCisgICAgICogSWYgdGhlIGlucHV0IHdhcyA9PSAwLjAsIHdlIGhhdmUgYWxyZWFkeSByZXR1cm5lZCwKKyAgICAgKiBzbyByZXR2YWwgb2YgKy1JbmYgc2lnbmFscyBPVkVSRkxPVywgMC4wIFVOREVSRkxPVyAqLworICAgIHggPSBfU3RsX2F0b2QoZGlnaXRzLCBuLCBleHApOworICB9CisKKyAgaWYgKE5lZ2F0ZSkgeworICAgIHggPSAteDsKKyAgfQorCisgIHJldHVybiB4OworfQorCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fbGludXhfXykgfHwgZGVmaW5lZCAoX19NSU5HVzMyX18pIHx8IGRlZmluZWQgKF9fQ1lHV0lOX18pIHx8IFwKKyAgICBkZWZpbmVkIChfX0JPUkxBTkRDX18pIHx8IGRlZmluZWQgKF9fRE1DX18pIHx8IGRlZmluZWQgKF9fSFBfYUNDKQorCit0ZW1wbGF0ZSA8Y2xhc3MgRCwgY2xhc3MgSUVFRSwgaW50IE0sIGludCBCSUFTPgorRCBfU3RsX3N0cmluZ190b19kb3VibGVUKGNvbnN0IGNoYXIgKnMpCit7CisgIHR5cGVkZWYgbnVtZXJpY19saW1pdHM8RD4gbGltaXRzOworICBjb25zdCBpbnQgbWF4X2RpZ2l0cyA9IGxpbWl0czo6ZGlnaXRzMTA7IC8qICsgMiAxNyAqLzsKKyAgdW5zaWduZWQgYzsKKyAgdW5zaWduZWQgZGVjaW1hbF9wb2ludDsKKyAgY2hhciAqZDsKKyAgaW50IGV4cDsKKyAgRCB4OworICBpbnQgZHBjaGFyOworICBjaGFyIGRpZ2l0c1ttYXhfZGlnaXRzXTsKKworICBjID0gKnMrKzsKKworICAvKiBwcm9jZXNzIHNpZ24gKi8KKyAgYm9vbCBOZWdhdGUgPSBmYWxzZTsKKyAgaWYgKGMgPT0gJysnKSB7CisgICAgYyA9ICpzKys7CisgIH0gZWxzZSBpZiAoYyA9PSAnLScpIHsKKyAgICBOZWdhdGUgPSB0cnVlOworICAgIGMgPSAqcysrOworICB9CisKKyAgZCA9IGRpZ2l0czsKKyAgZHBjaGFyID0gJy4nIC0gJzAnOworICBkZWNpbWFsX3BvaW50ID0gMDsKKyAgZXhwID0gMDsKKworICBmb3IgKDs7KSB7CisgICAgYyAtPSAnMCc7CisgICAgaWYgKGMgPCAxMCkgeworICAgICAgaWYgKGQgPT0gZGlnaXRzICsgbWF4X2RpZ2l0cykgeworICAgICAgICAvKiBpZ25vcmUgbW9yZSB0aGFuIG1heF9kaWdpdHMgZGlnaXRzLCBidXQgYWRqdXN0IGV4cG9uZW50ICovCisgICAgICAgIGV4cCArPSAoZGVjaW1hbF9wb2ludCBeIDEpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGMgPT0gMCAmJiBkID09IGRpZ2l0cykgeworICAgICAgICAgIC8qIGlnbm9yZSBsZWFkaW5nIHplcm9zICovCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgKmQrKyA9IChjaGFyKSBjOworICAgICAgICB9CisgICAgICAgIGV4cCAtPSBkZWNpbWFsX3BvaW50OworICAgICAgfQorICAgIH0gZWxzZSBpZiAoYyA9PSAodW5zaWduZWQgaW50KSBkcGNoYXIgJiYgIWRlY2ltYWxfcG9pbnQpIHsgICAgLyogSU5URVJOQVRJT05BTCAqLworICAgICAgZGVjaW1hbF9wb2ludCA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjID0gKnMrKzsKKyAgfQorICAvKiBzdHJ0b2QgY2FudCByZXR1cm4gdW50aWwgaXQgZmluZHMgdGhlIGVuZCBvZiB0aGUgZXhwb25lbnQgKi8KKyAgaWYgKGQgPT0gZGlnaXRzKSB7CisgICAgcmV0dXJuIEQoMC4wKTsKKyAgfQorCisgIGlmIChjID09ICdlJy0nMCcgfHwgYyA9PSAnRSctJzAnKSB7CisgICAgYm9vbCBuZWdhdGVfZXhwID0gZmFsc2U7CisgICAgcmVnaXN0ZXIgaW50IGUgPSAwOworICAgIGMgPSAqcysrOworICAgIGlmIChjID09ICcrJyB8fCBjID09ICcgJykgeworICAgICAgYyA9ICpzKys7CisgICAgfSBlbHNlIGlmIChjID09ICctJykgeworICAgICAgbmVnYXRlX2V4cCA9IHRydWU7CisgICAgICBjID0gKnMrKzsKKyAgICB9CisgICAgaWYgKGMgLT0gJzAnLCBjIDwgMTApIHsKKyAgICAgIGRvIHsKKyAgICAgICAgZSA9IGUgKiAxMCArIChpbnQpYzsKKyAgICAgICAgYyA9ICpzKys7CisgICAgICB9IHdoaWxlIChjIC09ICcwJywgYyA8IDEwKTsKKworICAgICAgaWYgKG5lZ2F0ZV9leHApIHsKKyAgICAgICAgZSA9IC1lOworICAgICAgfQorICAgICAgZXhwICs9IGU7CisgICAgfQorICB9CisKKyAgcHRyZGlmZl90IG4gPSBkIC0gZGlnaXRzOworICBpZiAoKGV4cCArIG4gLSAxKSA8IGxpbWl0czo6bWluX2V4cG9uZW50MTApIHsKKyAgICByZXR1cm4gRCgwLjApOyAvLyArMC4wIGlzIHRoZSBzYW1lIGFzIC0wLjAKKyAgfSBlbHNlIGlmICgoZXhwICsgbiAtIDEpID4gbGltaXRzOjptYXhfZXhwb25lbnQxMCApIHsKKyAgICAvLyBub3QgZ29vZCwgYmVjYXVzZSBvZiB4ID0gLXggYmVsb3c7IHRoaXMgbWF5IGxlYWQgdG8gcG9ydGFiaWxpdHkgcHJvYmxlbXMKKyAgICB4ID0gbGltaXRzOjppbmZpbml0eSgpOworICB9IGVsc2UgeworICAgIC8qIGxldCBfU3RsX2F0b2QgZGlhZ25vc2UgdW5kZXItIGFuZCBvdmVyLWZsb3dzICovCisgICAgLyogaWYgdGhlIGlucHV0IHdhcyA9PSAwLjAsIHdlIGhhdmUgYWxyZWFkeSByZXR1cm5lZCwKKyAgICAgICBzbyByZXR2YWwgb2YgKy1JbmYgc2lnbmFscyBPVkVSRkxPVywgMC4wIFVOREVSRkxPVworICAgICovCisgICAgeCA9IF9TdGxfYXRvZFQ8RCxJRUVFLE0sQklBUz4oZGlnaXRzLCBuLCBleHApOworICB9CisKKyAgcmV0dXJuIE5lZ2F0ZSA/IC14IDogeDsKK30KKworI2VuZGlmIC8vIF9fbGludXhfXworCit2b2lkIF9TVExQX0NBTEwKK19fc3RyaW5nX3RvX2Zsb2F0KGNvbnN0IF9faW9zdHJpbmcmIHYsIGZsb2F0JiB2YWwpCit7CisjaWYgIWRlZmluZWQgKF9fbGludXhfXykgfHwgZGVmaW5lZCAoQU5EUk9JRCkKKyAgdmFsID0gKGZsb2F0KV9TdGxfc3RyaW5nX3RvX2RvdWJsZSh2LmNfc3RyKCkpOworI2Vsc2UKKyAgdmFsID0gKGZsb2F0KV9TdGxfc3RyaW5nX3RvX2RvdWJsZVQ8ZG91YmxlLGllZWU3NTRfZG91YmxlLDEyLElFRUU3NTRfRE9VQkxFX0JJQVM+KHYuY19zdHIoKSk7CisjZW5kaWYKK30KKwordm9pZCBfU1RMUF9DQUxMCitfX3N0cmluZ190b19mbG9hdChjb25zdCBfX2lvc3RyaW5nJiB2LCBkb3VibGUmIHZhbCkKK3sKKyNpZiAhZGVmaW5lZCAoX19saW51eF9fKSB8fCBkZWZpbmVkIChBTkRST0lEKQorICB2YWwgPSBfU3RsX3N0cmluZ190b19kb3VibGUodi5jX3N0cigpKTsKKyNlbHNlCisgIHZhbCA9IF9TdGxfc3RyaW5nX3RvX2RvdWJsZVQ8ZG91YmxlLGllZWU3NTRfZG91YmxlLDEyLElFRUU3NTRfRE9VQkxFX0JJQVM+KHYuY19zdHIoKSk7CisjZW5kaWYKK30KKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19MT05HX0RPVUJMRSkKK3ZvaWQgX1NUTFBfQ0FMTAorX19zdHJpbmdfdG9fZmxvYXQoY29uc3QgX19pb3N0cmluZyYgdiwgbG9uZyBkb3VibGUmIHZhbCkgeworI2lmICFkZWZpbmVkIChfX2xpbnV4X18pICYmICFkZWZpbmVkIChfX01JTkdXMzJfXykgJiYgIWRlZmluZWQgKF9fQ1lHV0lOX18pICYmIFwKKyAgICAhZGVmaW5lZCAoX19CT1JMQU5EQ19fKSAmJiAhZGVmaW5lZCAoX19ETUNfXykgJiYgIWRlZmluZWQgKF9fSFBfYUNDKQorICAvL1RoZSBmb2xsb3dpbmcgZnVuY3Rpb24gaXMgdmFsaWQgb25seSBpZiBsb25nIGRvdWJsZSBpcyBhbiBhbGlhcyBmb3IgZG91YmxlLgorICBfU1RMUF9TVEFUSUNfQVNTRVJUKCBzaXplb2YobG9uZyBkb3VibGUpIDw9IHNpemVvZihkb3VibGUpICkKKyAgdmFsID0gX1N0bF9zdHJpbmdfdG9fZG91YmxlKHYuY19zdHIoKSk7CisjZWxzZQorICB2YWwgPSBfU3RsX3N0cmluZ190b19kb3VibGVUPGxvbmcgZG91YmxlLGllZWU4NTRfbG9uZ19kb3VibGUsMTYsSUVFRTg1NF9MT05HX0RPVUJMRV9CSUFTPih2LmNfc3RyKCkpOworI2VuZGlmCit9CisjZW5kaWYKKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zcmMvbnVtX3B1dC5jcHAgYi9zcmMvbnVtX3B1dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEyMzU2MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9udW1fcHV0LmNwcApAQCAtMCwwICsxLDE4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2luY2x1ZGUgInN0bHBvcnRfcHJlZml4LmgiCisKKyNpbmNsdWRlIDxsb2NhbGU+CisjaW5jbHVkZSA8b3N0cmVhbT4KKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKKy8vIE5vdGUgdGhhdCBncm91cGluZ1swXSBpcyB0aGUgbnVtYmVyIG9mIGRpZ2l0cyBpbiB0aGUgKnJpZ2h0bW9zdCogZ3JvdXAuCisvLyBXZSBhc3N1bWUsIHdpdGhvdXQgY2hlY2tpbmcsIHRoYXQgKmxhc3QgaXMgbnVsbCBhbmQgdGhhdCB0aGVyZSBpcyBlbm91Z2gKKy8vIHNwYWNlIGluIHRoZSBidWZmZXIgdG8gZXh0ZW5kIHRoZSBudW1iZXIgcGFzdCBbZmlyc3QsIGxhc3QpLgordGVtcGxhdGUgPGNsYXNzIENoYXI+CitzdGF0aWMgcHRyZGlmZl90CitfX2luc2VydF9ncm91cGluZ19hdXgoQ2hhciogZmlyc3QsIENoYXIqIGxhc3QsIGNvbnN0IHN0cmluZyYgZ3JvdXBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgQ2hhciBzZXBhcmF0b3IsIENoYXIgUGx1cywgQ2hhciBNaW51cywKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgYmFzZWNoYXJzKSB7CisgIHR5cGVkZWYgc3RyaW5nOjpzaXplX3R5cGUgc3RyX3NpemU7CisKKyAgaWYgKGZpcnN0ID09IGxhc3QpCisgICAgcmV0dXJuIDA7CisKKyAgaW50IHNpZ24gPSAwOworCisgIGlmICgqZmlyc3QgPT0gUGx1cyB8fCAqZmlyc3QgPT0gTWludXMpIHsKKyAgICBzaWduID0gMTsKKyAgICArK2ZpcnN0OworICB9CisKKyAgZmlyc3QgKz0gYmFzZWNoYXJzOworICBDaGFyKiBjdXJfZ3JvdXAgPSBsYXN0OyAvLyBQb2ludHMgaW1tZWRpYXRlbHkgYmV5b25kIHRoZSByaWdodG1vc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlnaXQgb2YgdGhlIGN1cnJlbnQgZ3JvdXAuCisgIGludCBncm91cHNpemUgPSAwOyAvLyBTaXplIG9mIHRoZSBjdXJyZW50IGdyb3VwIChpZiBncm91cGluZy5zaXplKCkgPT0gMCwgc2l6ZQorICAgICAgICAgICAgICAgICAgICAgLy8gb2YgZ3JvdXAgdW5saW1pdGVkOiB3ZSBmb3JjZSBjb25kaXRpb24gKGdyb3Vwc2l6ZSA8PSAwKSkKKworICBmb3IgKCBzdHJfc2l6ZSBuID0gMDsgOyApIHsgLy8gSW5kZXggb2YgdGhlIGN1cnJlbnQgZ3JvdXAKKyAgICBpZiAoIG4gPCBncm91cGluZy5zaXplKCkgKSB7CisgICAgICBncm91cHNpemUgPSBfX1NUQVRJQ19DQVNUKGludCwgZ3JvdXBpbmdbbisrXSApOworICAgIH0KKworICAgIGlmICgoZ3JvdXBzaXplIDw9IDApIHx8IChncm91cHNpemUgPj0gY3VyX2dyb3VwIC0gZmlyc3QpIHx8IChncm91cHNpemUgPT0gQ0hBUl9NQVgpKSB7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyBJbnNlcnQgYSBzZXBhcmF0b3IgY2hhcmFjdGVyIGp1c3QgYmVmb3JlIHBvc2l0aW9uIGN1cl9ncm91cCAtIGdyb3Vwc2l6ZQorICAgIGN1cl9ncm91cCAtPSBncm91cHNpemU7CisgICAgKytsYXN0OworICAgIGNvcHlfYmFja3dhcmQoY3VyX2dyb3VwLCBsYXN0LCBsYXN0ICsgMSk7CisgICAgKmN1cl9ncm91cCA9IHNlcGFyYXRvcjsKKyAgfQorCisgIHJldHVybiAobGFzdCAtIGZpcnN0KSArIHNpZ24gKyBiYXNlY2hhcnM7Cit9CisKKy8vRHluYW1pYyBvdXRwdXQgYnVmZmVyIHZlcnNpb24uCit0ZW1wbGF0ZSA8Y2xhc3MgQ2hhciwgY2xhc3MgU3RyPgorc3RhdGljIHZvaWQKK19faW5zZXJ0X2dyb3VwaW5nX2F1eCggLyogX19iYXNpY19pb3N0cmluZzxDaGFyPiAqLyBTdHImIGlvc3RyLCBzaXplX3QgX19ncm91cF9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBncm91cGluZywKKyAgICAgICAgICAgICAgICAgICAgICBDaGFyIHNlcGFyYXRvciwgQ2hhciBQbHVzLCBDaGFyIE1pbnVzLAorICAgICAgICAgICAgICAgICAgICAgIGludCBiYXNlY2hhcnMpIHsKKyAgdHlwZWRlZiBzdHJpbmc6OnNpemVfdHlwZSBzdHJfc2l6ZTsKKworICBpZiAoaW9zdHIuc2l6ZSgpIDwgX19ncm91cF9wb3MpCisgICAgcmV0dXJuOworCisgIGludCBfX2ZpcnN0X3BvcyA9IDA7CisgIENoYXIgX19maXJzdCA9ICppb3N0ci5iZWdpbigpOworCisgIGlmIChfX2ZpcnN0ID09IFBsdXMgfHwgX19maXJzdCA9PSBNaW51cykgeworICAgICsrX19maXJzdF9wb3M7CisgIH0KKworICBfX2ZpcnN0X3BvcyArPSBiYXNlY2hhcnM7CisKKyAgdHlwZW5hbWUgU3RyOjppdGVyYXRvciBjdXJfZ3JvdXAoaW9zdHIuYmVnaW4oKSArIF9fZ3JvdXBfcG9zKTsgICAgLy8gUG9pbnRzIGltbWVkaWF0ZWx5IGJleW9uZCB0aGUgcmlnaHRtb3N0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpZ2l0IG9mIHRoZSBjdXJyZW50IGdyb3VwLgorICBpbnQgZ3JvdXBzaXplID0gMDsgLy8gU2l6ZSBvZiB0aGUgY3VycmVudCBncm91cCAoaWYgZ3JvdXBpbmcuc2l6ZSgpID09IDAsIHNpemUKKyAgICAgICAgICAgICAgICAgICAgIC8vIG9mIGdyb3VwIHVubGltaXRlZDogd2UgZm9yY2UgY29uZGl0aW9uIChncm91cHNpemUgPD0gMCkpCisKKyAgZm9yICggc3RyX3NpemUgbiA9IDA7IDsgKSB7IC8vIEluZGV4IG9mIHRoZSBjdXJyZW50IGdyb3VwCisgICAgaWYgKCBuIDwgZ3JvdXBpbmcuc2l6ZSgpICkgeworICAgICAgZ3JvdXBzaXplID0gX19TVEFUSUNfQ0FTVCggaW50LCBncm91cGluZ1tuKytdICk7CisgICAgfQorCisgICAgaWYgKCAoZ3JvdXBzaXplIDw9IDApIHx8IChncm91cHNpemUgPj0gKChjdXJfZ3JvdXAgLSBpb3N0ci5iZWdpbigpKSAtIF9fZmlyc3RfcG9zKSkgfHwKKyAgICAgICAgIChncm91cHNpemUgPT0gQ0hBUl9NQVgpKSB7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyBJbnNlcnQgYSBzZXBhcmF0b3IgY2hhcmFjdGVyIGp1c3QgYmVmb3JlIHBvc2l0aW9uIGN1cl9ncm91cCAtIGdyb3Vwc2l6ZQorICAgIGN1cl9ncm91cCAtPSBncm91cHNpemU7CisgICAgY3VyX2dyb3VwID0gaW9zdHIuaW5zZXJ0KGN1cl9ncm91cCwgc2VwYXJhdG9yKTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG51bV9wdXQKKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCitfU1RMUF9ERUNMU1BFQyBjb25zdCBjaGFyKiBfU1RMUF9DQUxMIF9faGV4X2NoYXJfdGFibGVfbG8oKQoreyByZXR1cm4gIjAxMjM0NTY3ODlhYmNkZWZ4IjsgfQorCitfU1RMUF9ERUNMU1BFQyBjb25zdCBjaGFyKiBfU1RMUF9DQUxMIF9faGV4X2NoYXJfdGFibGVfaGkoKQoreyByZXR1cm4gIjAxMjM0NTY3ODlBQkNERUZYIjsgfQorCitjaGFyKiBfU1RMUF9DQUxMCitfX3dyaXRlX2ludGVnZXIoY2hhciogYnVmLCBpb3NfYmFzZTo6Zm10ZmxhZ3MgZmxhZ3MsIGxvbmcgeCkgeworICBjaGFyIHRtcFs2NF07CisgIGNoYXIqIGJ1ZmVuZCA9IHRtcCs2NDsKKyAgY2hhciogYmVnID0gX193cml0ZV9pbnRlZ2VyX2JhY2t3YXJkKGJ1ZmVuZCwgZmxhZ3MsIHgpOworICByZXR1cm4gY29weShiZWcsIGJ1ZmVuZCwgYnVmKTsKK30KKworLy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitwdHJkaWZmX3QgX1NUTFBfQ0FMTAorX19pbnNlcnRfZ3JvdXBpbmcoY2hhciAqIGZpcnN0LCBjaGFyICogbGFzdCwgY29uc3Qgc3RyaW5nJiBncm91cGluZywKKyAgICAgICAgICAgICAgICAgIGNoYXIgc2VwYXJhdG9yLCBjaGFyIFBsdXMsIGNoYXIgTWludXMsIGludCBiYXNlY2hhcnMpIHsKKyAgcmV0dXJuIF9faW5zZXJ0X2dyb3VwaW5nX2F1eChmaXJzdCwgbGFzdCwgZ3JvdXBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VwYXJhdG9yLCBQbHVzLCBNaW51cywgYmFzZWNoYXJzKTsKK30KKwordm9pZCBfU1RMUF9DQUxMCitfX2luc2VydF9ncm91cGluZyhfX2lvc3RyaW5nICZzdHIsIHNpemVfdCBncm91cF9wb3MsIGNvbnN0IHN0cmluZyYgZ3JvdXBpbmcsCisgICAgICAgICAgICAgICAgICBjaGFyIHNlcGFyYXRvciwgY2hhciBQbHVzLCBjaGFyIE1pbnVzLCBpbnQgYmFzZWNoYXJzKSB7CisgIF9faW5zZXJ0X2dyb3VwaW5nX2F1eChzdHIsIGdyb3VwX3BvcywgZ3JvdXBpbmcsIHNlcGFyYXRvciwgUGx1cywgTWludXMsIGJhc2VjaGFycyk7Cit9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkKK3B0cmRpZmZfdCBfU1RMUF9DQUxMCitfX2luc2VydF9ncm91cGluZyh3Y2hhcl90KiBmaXJzdCwgd2NoYXJfdCogbGFzdCwgY29uc3Qgc3RyaW5nJiBncm91cGluZywKKyAgICAgICAgICAgICAgICAgIHdjaGFyX3Qgc2VwYXJhdG9yLCB3Y2hhcl90IFBsdXMsIHdjaGFyX3QgTWludXMsCisgICAgICAgICAgICAgICAgICBpbnQgYmFzZWNoYXJzKSB7CisgIHJldHVybiBfX2luc2VydF9ncm91cGluZ19hdXgoZmlyc3QsIGxhc3QsIGdyb3VwaW5nLCBzZXBhcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGx1cywgTWludXMsIGJhc2VjaGFycyk7Cit9CisKK3ZvaWQgX1NUTFBfQ0FMTAorX19pbnNlcnRfZ3JvdXBpbmcoX19pb3dzdHJpbmcgJnN0ciwgc2l6ZV90IGdyb3VwX3BvcywgY29uc3Qgc3RyaW5nJiBncm91cGluZywKKyAgICAgICAgICAgICAgICAgIHdjaGFyX3Qgc2VwYXJhdG9yLCB3Y2hhcl90IFBsdXMsIHdjaGFyX3QgTWludXMsCisgICAgICAgICAgICAgICAgICBpbnQgYmFzZWNoYXJzKSB7CisgIF9faW5zZXJ0X2dyb3VwaW5nX2F1eChzdHIsIGdyb3VwX3BvcywgZ3JvdXBpbmcsIHNlcGFyYXRvciwgUGx1cywgTWludXMsIGJhc2VjaGFycyk7Cit9CisjZW5kaWYKKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRm9yY2UgaW5zdGFudGlhdGlvbiBvZiBudW1fcHV0PD4KKyNpZiAhZGVmaW5lZChfU1RMUF9OT19GT1JDRV9JTlNUQU5USUFURSkKK3RlbXBsYXRlIGNsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIG9zdHJlYW1idWZfaXRlcmF0b3I8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPjsKKy8vIHRlbXBsYXRlIGNsYXNzIG51bV9wdXQ8Y2hhciwgY2hhcio+OwordGVtcGxhdGUgY2xhc3MgbnVtX3B1dDxjaGFyLCBvc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4gPjsKKyMgaWZuZGVmIF9TVExQX05PX1dDSEFSX1QKK3RlbXBsYXRlIGNsYXNzIG9zdHJlYW1idWZfaXRlcmF0b3I8d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPjsKK3RlbXBsYXRlIGNsYXNzIG51bV9wdXQ8d2NoYXJfdCwgb3N0cmVhbWJ1Zl9pdGVyYXRvcjx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+ID47CisvLyB0ZW1wbGF0ZSBjbGFzcyBudW1fcHV0PHdjaGFyX3QsIHdjaGFyX3QqPjsKKyMgZW5kaWYgLyogSU5TVEFOVElBVEVfV0lERV9TVFJFQU1TICovCisjZW5kaWYKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3JjL251bV9wdXRfZmxvYXQuY3BwIGIvc3JjL251bV9wdXRfZmxvYXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNWM0NDYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbnVtX3B1dF9mbG9hdC5jcHAKQEAgLTAsMCArMSw5MTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpbmNsdWRlICJzdGxwb3J0X3ByZWZpeC5oIgorCisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8aW9zPgorI2luY2x1ZGUgPGxvY2FsZT4KKworI2lmIGRlZmluZWQgKF9fREVDQ1hYKQorIyAgZGVmaW5lIE5ESUcgNDAwCisjZWxzZQorIyAgZGVmaW5lIE5ESUcgODIKKyNlbmRpZgorCisjZGVmaW5lIHRvZGlnaXQoeCkgKCh4KSsnMCcpCisKKyNpZiBkZWZpbmVkIChfU1RMUF9VTklYKQorCisjICBpZiBkZWZpbmVkIChfX3N1bikKKyMgICAgaW5jbHVkZSA8ZmxvYXRpbmdwb2ludC5oPgorIyAgZW5kaWYKKworIyAgaWYgZGVmaW5lZCAoX19zdW4pIHx8IGRlZmluZWQgKF9fZGlnaXRhbF9fKSB8fCBkZWZpbmVkIChfX3NnaSkgfHwgZGVmaW5lZCAoX1NUTFBfU0NPX09QRU5TRVJWRVIpIHx8IGRlZmluZWQgKF9fTkNSX1NWUikKKy8vIERFQywgU0dJICYgU29sYXJpcyBuZWVkIHRoaXMKKyMgICAgaW5jbHVkZSA8dmFsdWVzLmg+CisjICAgIGluY2x1ZGUgPG5hbi5oPgorIyAgZW5kaWYKKworIyAgaWYgZGVmaW5lZCAoX19RTlhOVE9fXykgfHwgKCBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fQVBQTEVfXykgKSB8fCBkZWZpbmVkKF9TVExQX1VTRV9VQ0xJQkMpIC8qIDAuOS4yNiAqLyB8fCBcCisgICAgICBkZWZpbmVkKF9fRnJlZUJTRF9fKQorIyAgICBkZWZpbmUgVVNFX1NQUklOVEZfSU5TVEVBRAorIyAgZW5kaWYKKworIyAgaWYgZGVmaW5lZCAoX0FJWCkgLy8gSkZBIDMtQXVnLTIwMDAKKyMgICAgaW5jbHVkZSA8bWF0aC5oPgorIyAgICBpbmNsdWRlIDxmbG9hdC5oPgorIyAgZW5kaWYKKworIyAgaW5jbHVkZSA8bWF0aC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxjc3RkaW8+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKworI2lmIGRlZmluZWQgKF9TVExQX01TVkNfTElCKSB8fCBkZWZpbmVkIChfX01JTkdXMzJfXykgfHwgZGVmaW5lZCAoX19CT1JMQU5EQ19fKSB8fCBkZWZpbmVkIChfX0RKR1BQKSB8fCBcCisgICAgZGVmaW5lZCAoX1NUTFBfU0NPX09QRU5TRVJWRVIpIHx8IGRlZmluZWQgKF9fTkNSX1NWUikKKyMgIGluY2x1ZGUgPGZsb2F0Lmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fTVJDX18pIHx8IGRlZmluZWQgKF9fU0NfXykgIHx8IGRlZmluZWQgKF9DUkFZKSAgLy8qVFkgMDIvMjQvMjAwMCAtIGFkZGVkIHN1cHBvcnQgZm9yIE1QVworIyAgaW5jbHVkZSA8ZnAuaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19DWUdXSU5fXykKKyMgIGluY2x1ZGUgPGllZWVmcC5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX01TTF9fKQorIyAgaW5jbHVkZSA8Y3N0ZGxpYj4gIC8vIGZvciBhdG9pCisjICBpbmNsdWRlIDxjc3RkaW8+ICAvLyBmb3Igc25wcmludGYKKyMgIGluY2x1ZGUgPGFsZ29yaXRobT4KKyMgIGluY2x1ZGUgPGNhc3NlcnQ+CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fSVNDUFBfXykKKyMgIGluY2x1ZGUgPGNmbG9hdD4KKyNlbmRpZgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaWYgZGVmaW5lZCAoX19ETUNfXykKKyMgIGRlZmluZSBzbnByaW50ZiBfc25wcmludGYKKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCisjaWYgZGVmaW5lZCAoX19NV0VSS1NfXykgfHwgZGVmaW5lZChfX0JFT1NfXykKKyMgIGRlZmluZSBVU0VfU1BSSU5URl9JTlNURUFECisjZW5kaWYKKwordGVtcGxhdGUgPGludCBOPgorc3RydWN0IF9EaWcKK3sKKyAgICBlbnVtIHsgZGlnID0gX0RpZzxOLzEwPjo6ZGlnICsgMSB9OworfTsKKworX1NUTFBfVEVNUExBVEVfTlVMTAorc3RydWN0IF9EaWc8MD4KK3sKKyAgICBlbnVtIHsgZGlnID0gMCB9OworfTsKKworI2lmZGVmIF9TVExQX05PX0xPTkdfRE9VQkxFCisjIGRlZmluZSBNQVhFRElHSVRTIGludChfRGlnPERCTF9NQVhfMTBfRVhQPjo6ZGlnKQorIyBkZWZpbmUgTUFYRlNJRyBEQkxfRElHCisjIGRlZmluZSBNQVhGQ1ZUIChEQkxfRElHICsgMSkKKyNlbHNlCisjIGRlZmluZSBNQVhFRElHSVRTIGludChfRGlnPExEQkxfTUFYXzEwX0VYUD46OmRpZykKKyMgZGVmaW5lIE1BWEZTSUcgTERCTF9ESUcKKyMgZGVmaW5lIE1BWEZDVlQgKExEQkxfRElHICsgMSkKKyNlbmRpZgorCisvLyBUZXN0cyBmb3IgaW5maW5pdHkgYW5kIE5hTiBkaWZmZXIgb24gZGlmZmVyZW50IE9Tcy4gIFdlIGVuY2Fwc3VsYXRlCisvLyB0aGVzZSBkaWZmZXJlbmNlcyBoZXJlLgorI2lmICFkZWZpbmVkIChVU0VfU1BSSU5URl9JTlNURUFEKQorIyAgaWYgZGVmaW5lZCAoX19ocHV4KSAmJiBkZWZpbmVkIChfX0dOVUNfXykKKyMgICAgZGVmaW5lIF9TVExQX1VTRV9TSUdOX0hFTFBFUgorIyAgZWxpZiBkZWZpbmVkIChfX0RKR1BQKSB8fCAoZGVmaW5lZCAoX1NUTFBfVVNFX0dMSUJDKSAmJiAhIGRlZmluZWQgKF9fTVNMX18pKSB8fCBcCisgICAgICBkZWZpbmVkIChfX0NZR1dJTl9fKSB8fCBcCisgICAgICBkZWZpbmVkIChfX0ZyZWVCU0RfXykgfHwgZGVmaW5lZCAoX19OZXRCU0RfXykgfHwgZGVmaW5lZCAoX19PcGVuQlNEX18pIHx8IFwKKyAgICAgIGRlZmluZWQgKF9fSFBfYUNDKQorc3RhdGljIGlubGluZSBib29sIF9TdGxfaXNfbmFuX29yX2luZihkb3VibGUgeCkKKyMgICAgaWYgZGVmaW5lZCAoaXNmaW5pdGUpCit7IHJldHVybiAhaXNmaW5pdGUoeCk7IH0KKyMgICAgZWxzZQoreyByZXR1cm4gIWZpbml0ZSh4KTsgfQorIyAgICBlbmRpZgorc3RhdGljIGlubGluZSBib29sIF9TdGxfaXNfbmVnX25hbihkb3VibGUgeCkgICAgeyByZXR1cm4gaXNuYW4oeCkgJiYgKCBjb3B5c2lnbigxLiwgeCkgPCAwICk7IH0KK3N0YXRpYyBpbmxpbmUgYm9vbCBfU3RsX2lzX2luZihkb3VibGUgeCkgICAgICAgIHsgcmV0dXJuIGlzaW5mKHgpOyB9CisvLyBpbmxpbmUgYm9vbCBfU3RsX2lzX25lZ19pbmYoZG91YmxlIHgpICAgIHsgcmV0dXJuIGlzaW5mKHgpIDwgMDsgfQorc3RhdGljIGlubGluZSBib29sIF9TdGxfaXNfbmVnX2luZihkb3VibGUgeCkgICAgeyByZXR1cm4gaXNpbmYoeCkgJiYgeCA8IDA7IH0KKyMgIGVsaWYgKGRlZmluZWQgKF9fdW5peCkgfHwgZGVmaW5lZCAoX191bml4X18pKSAmJiBcCisgICAgICAgICAhZGVmaW5lZCAoX19BUFBMRV9fKSAmJiAhZGVmaW5lZCAoX19ESkdQUCkgJiYgIWRlZmluZWQoX19vc2ZfXykgJiYgXAorICAgICAgICAgIWRlZmluZWQgKF9DUkFZKQorc3RhdGljIGlubGluZSBib29sIF9TdGxfaXNfbmFuX29yX2luZihkb3VibGUgeCkgeyByZXR1cm4gSXNOQU5vcklORih4KTsgfQorc3RhdGljIGlubGluZSBib29sIF9TdGxfaXNfaW5mKGRvdWJsZSB4KSAgICAgICAgeyByZXR1cm4gSXNOQU5vcklORih4KSAmJiBJc0lORih4KTsgfQorc3RhdGljIGlubGluZSBib29sIF9TdGxfaXNfbmVnX2luZihkb3VibGUgeCkgICAgeyByZXR1cm4gKElzSU5GKHgpKSAmJiAoeCA8IDAuMCk7IH0KK3N0YXRpYyBpbmxpbmUgYm9vbCBfU3RsX2lzX25lZ19uYW4oZG91YmxlIHgpICAgIHsgcmV0dXJuIElzTmVnTkFOKHgpOyB9CisjICBlbGlmIGRlZmluZWQgKF9TVExQX01TVkNfTElCKSB8fCBkZWZpbmVkIChfX01JTkdXMzJfXykgfHwgZGVmaW5lZCAoX19CT1JMQU5EQ19fKQorc3RhdGljIGlubGluZSBib29sIF9TdGxfaXNfbmFuX29yX2luZihkb3VibGUgeCkgeyByZXR1cm4gIV9maW5pdGUoeCk7IH0KKyMgICAgaWYgIWRlZmluZWQgKF9fQk9STEFORENfXykKK3N0YXRpYyBpbmxpbmUgYm9vbCBfU3RsX2lzX2luZihkb3VibGUgeCkgICAgICAgIHsKKyAgaW50IGZjbGFzcyA9IF9mcGNsYXNzKHgpOworICByZXR1cm4gZmNsYXNzID09IF9GUENMQVNTX05JTkYgfHwgZmNsYXNzID09IF9GUENMQVNTX1BJTkY7Cit9CitzdGF0aWMgaW5saW5lIGJvb2wgX1N0bF9pc19uZWdfaW5mKGRvdWJsZSB4KSAgICB7IHJldHVybiBfZnBjbGFzcyh4KSA9PSBfRlBDTEFTU19OSU5GOyB9CisjICAgIGVsc2UKK3N0YXRpYyBpbmxpbmUgYm9vbCBfU3RsX2lzX2luZihkb3VibGUgeCkgICAgICAgIHsgIHJldHVybiBfU3RsX2lzX25hbl9vcl9pbmYoeCkgJiYgIV9pc25hbih4KTt9CitzdGF0aWMgaW5saW5lIGJvb2wgX1N0bF9pc19uZWdfaW5mKGRvdWJsZSB4KSAgICB7ICByZXR1cm4gX1N0bF9pc19pbmYoeCkgJiYgeCA8IDAgOyB9CisjICAgIGVuZGlmCitzdGF0aWMgaW5saW5lIGJvb2wgX1N0bF9pc19uZWdfbmFuKGRvdWJsZSB4KSAgICB7IHJldHVybiBfaXNuYW4oeCkgJiYgX2NvcHlzaWduKDEuLCB4KSA8IDAgOyB9CisjICAgIGlmIGRlZmluZWQgKF9fQk9STEFORENfXykKK3N0YXRpYyBpbmxpbmUgYm9vbCBfU3RsX2lzX25hbl9vcl9pbmYobG9uZyBkb3VibGUgeCkgeyByZXR1cm4gIV9maW5pdGVsKHgpOyB9CitzdGF0aWMgaW5saW5lIGJvb2wgX1N0bF9pc19pbmYobG9uZyBkb3VibGUgeCkgICAgICAgIHsgIHJldHVybiBfU3RsX2lzX25hbl9vcl9pbmYoeCkgJiYgIV9pc25hbmwoeCk7fQorc3RhdGljIGlubGluZSBib29sIF9TdGxfaXNfbmVnX2luZihsb25nIGRvdWJsZSB4KSAgICB7ICByZXR1cm4gX1N0bF9pc19pbmYoeCkgJiYgeCA8IDAgOyB9CitzdGF0aWMgaW5saW5lIGJvb2wgX1N0bF9pc19uZWdfbmFuKGxvbmcgZG91YmxlIHgpICAgIHsgcmV0dXJuIF9pc25hbmwoeCkgJiYgX2NvcHlzaWdubCgxLmwsIHgpIDwgMCA7IH0KKyMgICAgZWxpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTE9OR19ET1VCTEUpCisvLyBTaW1wbHkgdGhlcmUgdG8gYXZvaWQgd2FybmluZyBsb25nIGRvdWJsZSAtPiBkb3VibGUgaW1wbGljaXQgY29udmVyc2lvbjoKK3N0YXRpYyBpbmxpbmUgYm9vbCBfU3RsX2lzX25hbl9vcl9pbmYobG9uZyBkb3VibGUgeCkgeyByZXR1cm4gX1N0bF9pc19uYW5fb3JfaW5mKF9fU1RBVElDX0NBU1QoZG91YmxlLCB4KSk7IH0KK3N0YXRpYyBpbmxpbmUgYm9vbCBfU3RsX2lzX2luZihsb25nIGRvdWJsZSB4KSAgICAgICAgeyAgcmV0dXJuIF9TdGxfaXNfaW5mKF9fU1RBVElDX0NBU1QoZG91YmxlLCB4KSk7fQorc3RhdGljIGlubGluZSBib29sIF9TdGxfaXNfbmVnX2luZihsb25nIGRvdWJsZSB4KSAgICB7ICByZXR1cm4gX1N0bF9pc19uZWdfaW5mKF9fU1RBVElDX0NBU1QoZG91YmxlLCB4KSk7IH0KK3N0YXRpYyBpbmxpbmUgYm9vbCBfU3RsX2lzX25lZ19uYW4obG9uZyBkb3VibGUgeCkgICAgeyByZXR1cm4gX1N0bF9pc19uZWdfbmFuKF9fU1RBVElDX0NBU1QoZG91YmxlLCB4KSk7IH0KKyMgICAgZW5kaWYKKyMgIGVsaWYgZGVmaW5lZCAoX19NUkNfXykgfHwgZGVmaW5lZCAoX19TQ19fKSB8fCBkZWZpbmVkIChfX0RNQ19fKQorc3RhdGljIGJvb2wgX1N0bF9pc19uYW5fb3JfaW5mKGRvdWJsZSB4KSB7IHJldHVybiBpc25hbih4KSB8fCAhaXNmaW5pdGUoeCk7IH0KK3N0YXRpYyBib29sIF9TdGxfaXNfaW5mKGRvdWJsZSB4KSAgICAgICAgeyByZXR1cm4gIWlzZmluaXRlKHgpOyB9CitzdGF0aWMgYm9vbCBfU3RsX2lzX25lZ19pbmYoZG91YmxlIHgpICAgIHsgcmV0dXJuICFpc2Zpbml0ZSh4KSAmJiBzaWduYml0KHgpOyB9CitzdGF0aWMgYm9vbCBfU3RsX2lzX25lZ19uYW4oZG91YmxlIHgpICAgIHsgcmV0dXJuIGlzbmFuKHgpICYmIHNpZ25iaXQoeCk7IH0KKyMgIGVsaWYgLyogZGVmaW5lZChfX0ZyZWVCU0RfXykgfHwgZGVmaW5lZChfX09wZW5CU0RfXykgfHwgKi8gKGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19BUFBMRV9fKSkKK3N0YXRpYyBpbmxpbmUgYm9vbCBfU3RsX2lzX25hbl9vcl9pbmYoZG91YmxlIHgpIHsgcmV0dXJuICFmaW5pdGUoeCk7IH0KK3N0YXRpYyBpbmxpbmUgYm9vbCBfU3RsX2lzX2luZihkb3VibGUgeCkgICAgICAgIHsgICByZXR1cm4gX1N0bF9pc19uYW5fb3JfaW5mKHgpICYmICEgaXNuYW4oeCk7IH0KK3N0YXRpYyBpbmxpbmUgYm9vbCBfU3RsX2lzX25lZ19pbmYoZG91YmxlIHgpICAgIHsgICByZXR1cm4gX1N0bF9pc19pbmYoeCkgJiYgeCA8IDAgOyB9CitzdGF0aWMgaW5saW5lIGJvb2wgX1N0bF9pc19uZWdfbmFuKGRvdWJsZSB4KSAgICB7IHJldHVybiBpc25hbih4KSAmJiBjb3B5c2lnbigxLiwgeCkgPCAwIDsgfQorIyAgZWxpZiBkZWZpbmVkKCBfQUlYICkgLy8gSkZBIDExLUF1Zy0yMDAwCitzdGF0aWMgYm9vbCBfU3RsX2lzX25hbl9vcl9pbmYoZG91YmxlIHgpIHsgcmV0dXJuIGlzbmFuKHgpIHx8ICFmaW5pdGUoeCk7IH0KK3N0YXRpYyBib29sIF9TdGxfaXNfaW5mKGRvdWJsZSB4KSAgICAgICAgeyByZXR1cm4gIWZpbml0ZSh4KTsgfQorLy8gYm9vbCBfU3RsX2lzX25lZ19pbmYoZG91YmxlIHgpICAgIHsgcmV0dXJuIF9jbGFzcyh4KSA9PSBGUF9NSU5VU19JTkY7IH0KK3N0YXRpYyBib29sIF9TdGxfaXNfbmVnX2luZihkb3VibGUgeCkgICAgeyByZXR1cm4gX1N0bF9pc19pbmYoeCkgJiYgKCBjb3B5c2lnbigxLiwgeCkgPCAwICk7ICB9CitzdGF0aWMgYm9vbCBfU3RsX2lzX25lZ19uYW4oZG91YmxlIHgpICAgIHsgcmV0dXJuIGlzbmFuKHgpICYmICggY29weXNpZ24oMS4sIHgpIDwgMCApOyAgfQorIyAgZWxpZiBkZWZpbmVkIChfX0lTQ1BQX18pCitzdGF0aWMgaW5saW5lIGJvb2wgX1N0bF9pc19uYW5fb3JfaW5mICAoZG91YmxlIHgpIHsgcmV0dXJuIF9mcF9pc0lORih4KSB8fCBfZnBfaXNOQU4oeCk7IH0KK3N0YXRpYyBpbmxpbmUgYm9vbCBfU3RsX2lzX2luZiAgICAgICAgIChkb3VibGUgeCkgeyByZXR1cm4gX2ZwX2lzSU5GKHgpOyB9CitzdGF0aWMgaW5saW5lIGJvb2wgX1N0bF9pc19uZWdfaW5mICAgICAoZG91YmxlIHgpIHsgcmV0dXJuIF9mcF9pc0lORih4KSAmJiB4IDwgMDsgfQorc3RhdGljIGlubGluZSBib29sIF9TdGxfaXNfbmVnX25hbiAgICAgKGRvdWJsZSB4KSB7IHJldHVybiBfZnBfaXNOQU4oeCkgJiYgeCA8IDA7IH0KKyMgIGVsaWYgZGVmaW5lZCAoX0NSQVkpCisjICAgIGlmIGRlZmluZWQgKF9DUkFZSUVFRSkKK3N0YXRpYyBpbmxpbmUgYm9vbCBfU3RsX2lzX25hbl9vcl9pbmYoZG91YmxlIHgpIHsgcmV0dXJuIGlzbmFuKHgpIHx8IGlzaW5mKHgpOyB9CitzdGF0aWMgaW5saW5lIGJvb2wgX1N0bF9pc19pbmYoZG91YmxlIHgpICAgICAgICB7IHJldHVybiBpc2luZih4KTsgfQorc3RhdGljIGlubGluZSBib29sIF9TdGxfaXNfbmVnX2luZihkb3VibGUgeCkgICAgeyByZXR1cm4gaXNpbmYoeCkgJiYgc2lnbmJpdCh4KTsgfQorc3RhdGljIGlubGluZSBib29sIF9TdGxfaXNfbmVnX25hbihkb3VibGUgeCkgICAgeyByZXR1cm4gaXNuYW4oeCkgJiYgc2lnbmJpdCh4KTsgfQorIyAgICBlbHNlCitzdGF0aWMgaW5saW5lIGJvb2wgX1N0bF9pc19uYW5fb3JfaW5mKGRvdWJsZSB4KSB7IHJldHVybiBmYWxzZTsgfQorc3RhdGljIGlubGluZSBib29sIF9TdGxfaXNfaW5mKGRvdWJsZSB4KSAgICAgICAgeyByZXR1cm4gZmFsc2U7IH0KK3N0YXRpYyBpbmxpbmUgYm9vbCBfU3RsX2lzX25lZ19pbmYoZG91YmxlIHgpICAgIHsgcmV0dXJuIGZhbHNlOyB9CitzdGF0aWMgaW5saW5lIGJvb2wgX1N0bF9pc19uZWdfbmFuKGRvdWJsZSB4KSAgICB7IHJldHVybiBmYWxzZTsgfQorIyAgICBlbmRpZgorIyAgZWxzZSAvLyBub3RoaW5nIGZyb20gYWJvdmUKKyMgICAgZGVmaW5lIFVTRV9TUFJJTlRGX0lOU1RFQUQKKyMgIGVuZGlmCisjZW5kaWYgLy8gIVVTRV9TUFJJTlRGX0lOU1RFQUQKKworI2lmICFkZWZpbmVkIChVU0VfU1BSSU5URl9JTlNURUFEKQorLy8gUmVlbnRyYW50IHZlcnNpb25zIG9mIGZsb2F0aW5nLXBvaW50IGNvbnZlcnNpb24gZnVuY3Rpb25zLiAgVGhlIGFyZ3VtZW50CisvLyBsaXN0cyBsb29rIHNsaWdodGx5IGRpZmZlcmVudCBvbiBkaWZmZXJlbnQgb3BlcmF0aW5nIHN5c3RlbXMsIHNvIHdlJ3JlCisvLyBlbmNhcHN1bGF0aW5nIHRoZSBkaWZmZXJlbmNlcyBoZXJlLgorCisjICBpZiBkZWZpbmVkIChfX0NZR1dJTl9fKSB8fCBkZWZpbmVkKF9fREpHUFApCitzdGF0aWMgaW5saW5lIGNoYXIqIF9TdGxfZWN2dFIoZG91YmxlIHgsIGludCBuLCBpbnQqIHB0LCBpbnQqIHNpZ24sIGNoYXIqIGJ1ZikKK3sgcmV0dXJuIGVjdnRidWYoeCwgbiwgcHQsIHNpZ24sIGJ1Zik7IH0KK3N0YXRpYyBpbmxpbmUgY2hhciogX1N0bF9mY3Z0Uihkb3VibGUgeCwgaW50IG4sIGludCogcHQsIGludCogc2lnbiwgY2hhciogYnVmKQoreyByZXR1cm4gZmN2dGJ1Zih4LCBuLCBwdCwgc2lnbiwgYnVmKTsgfQorIyAgICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTE9OR19ET1VCTEUpCisjICAgICAgaWYgZGVmaW5lZCAoX19DWUdXSU5fXykKKyMgICAgICAgIGRlZmluZSBfU1RMUF9FTVVMQVRFX0xPTkdfRE9VQkxFX0NWVAorIyAgICAgIGVsc2UKK3N0YXRpYyBpbmxpbmUgY2hhciogX1N0bF9lY3Z0Uihsb25nIGRvdWJsZSB4LCBpbnQgbiwgaW50KiBwdCwgaW50KiBzaWduLCBjaGFyKiBidWYpCit7IHJldHVybiBlY3Z0YnVmKHgsIG4sIHB0LCBzaWduLCBidWYpOyB9CitzdGF0aWMgaW5saW5lIGNoYXIqIF9TdGxfZmN2dFIobG9uZyBkb3VibGUgeCwgaW50IG4sIGludCogcHQsIGludCogc2lnbiwgY2hhciogYnVmKQoreyByZXR1cm4gZmN2dGJ1Zih4LCBuLCBwdCwgc2lnbiwgYnVmKTsgfQorIyAgICAgIGVuZGlmCisjICAgIGVuZGlmCisjICBlbGlmIGRlZmluZWQgKF9TVExQX1VTRV9HTElCQykKK3N0YXRpYyBpbmxpbmUgY2hhciogX1N0bF9lY3Z0Uihkb3VibGUgeCwgaW50IG4sIGludCogcHQsIGludCogc2lnbiwgY2hhciogYnVmLCBzaXplX3QgYnNpemUpCit7IHJldHVybiBlY3Z0X3IoeCwgbiwgcHQsIHNpZ24sIGJ1ZiwgYnNpemUpID09IDAgPyBidWYgOiAwOyB9CitzdGF0aWMgaW5saW5lIGNoYXIqIF9TdGxfZmN2dFIoZG91YmxlIHgsIGludCBuLCBpbnQqIHB0LCBpbnQqIHNpZ24sIGNoYXIqIGJ1Ziwgc2l6ZV90IGJzaXplKQoreyByZXR1cm4gZmN2dF9yKHgsIG4sIHB0LCBzaWduLCBidWYsIGJzaXplKSA9PSAwID8gYnVmIDogMDsgfQorIyAgICBpZm5kZWYgX1NUTFBfTk9fTE9OR19ET1VCTEUKK3N0YXRpYyBpbmxpbmUgY2hhciogX1N0bF9lY3Z0Uihsb25nIGRvdWJsZSB4LCBpbnQgbiwgaW50KiBwdCwgaW50KiBzaWduLCBjaGFyKiBidWYsIHNpemVfdCBic2l6ZSkKK3sgcmV0dXJuIHFlY3Z0X3IoeCwgbiwgcHQsIHNpZ24sIGJ1ZiwgYnNpemUpID09IDAgPyBidWYgOiAwOyB9CitzdGF0aWMgaW5saW5lIGNoYXIqIF9TdGxfZmN2dFIobG9uZyBkb3VibGUgeCwgaW50IG4sIGludCogcHQsIGludCogc2lnbiwgY2hhciogYnVmLCBzaXplX3QgYnNpemUpCit7IHJldHVybiBxZmN2dF9yKHgsIG4sIHB0LCBzaWduLCBidWYsIGJzaXplKSA9PSAwID8gYnVmIDogMDsgfQorIyAgICBlbmRpZgorIyAgICBkZWZpbmUgX1NUTFBfTkVFRF9DVlRfQlVGRkVSX1NJWkUKKyMgIGVsaWYgZGVmaW5lZCAoX19zdW4pCitzdGF0aWMgaW5saW5lIGNoYXIqIF9TdGxfZWN2dFIoZG91YmxlIHgsIGludCBuLCBpbnQqIHB0LCBpbnQqIHNpZ24sIGNoYXIqIGJ1ZikKK3sgcmV0dXJuIGVjb252ZXJ0KHgsIG4sIHB0LCBzaWduLCBidWYpOyB9CitzdGF0aWMgaW5saW5lIGNoYXIqIF9TdGxfZmN2dFIoZG91YmxlIHgsIGludCBuLCBpbnQqIHB0LCBpbnQqIHNpZ24sIGNoYXIqIGJ1ZikKK3sgcmV0dXJuIGZjb252ZXJ0KHgsIG4sIHB0LCBzaWduLCBidWYpOyB9CisjICAgIGlmbmRlZiBfU1RMUF9OT19MT05HX0RPVUJMRQorc3RhdGljIGlubGluZSBjaGFyKiBfU3RsX2VjdnRSKGxvbmcgZG91YmxlIHgsIGludCBuLCBpbnQqIHB0LCBpbnQqIHNpZ24sIGNoYXIqIGJ1ZikKK3sgcmV0dXJuIHFlY29udmVydCgmeCwgbiwgcHQsIHNpZ24sIGJ1Zik7IH0KK3N0YXRpYyBpbmxpbmUgY2hhciogX1N0bF9mY3Z0Uihsb25nIGRvdWJsZSB4LCBpbnQgbiwgaW50KiBwdCwgaW50KiBzaWduLCBjaGFyKiBidWYpCit7IHJldHVybiBxZmNvbnZlcnQoJngsIG4sIHB0LCBzaWduLCBidWYpOyB9CisjICAgIGVuZGlmCisjICBlbGlmIGRlZmluZWQgKF9fREVDQ1hYKQorc3RhdGljIGlubGluZSBjaGFyKiBfU3RsX2VjdnRSKGRvdWJsZSB4LCBpbnQgbiwgaW50KiBwdCwgaW50KiBzaWduLCBjaGFyKiBidWYsIHNpemVfdCBic2l6ZSkKK3sgcmV0dXJuIChlY3Z0X3IoeCwgbiwgcHQsIHNpZ24sIGJ1ZiwgYnNpemUpID09IDAgPyBidWYgOiAwKTsgfQorc3RhdGljIGlubGluZSBjaGFyKiBfU3RsX2ZjdnRSKGRvdWJsZSB4LCBpbnQgbiwgaW50KiBwdCwgaW50KiBzaWduLCBjaGFyKiBidWYsIHNpemVfdCBic2l6ZSkKK3sgcmV0dXJuIChmY3Z0X3IoeCwgbiwgcHQsIHNpZ24sIGJ1ZiwgYnNpemUpID09IDAgPyBidWYgOiAwKTsgfQorIyAgICBpZm5kZWYgX1NUTFBfTk9fTE9OR19ET1VCTEUKKy8vIGZicCA6IG5vICJsb25nIGRvdWJsZSIgY29udmVyc2lvbnMgIQorc3RhdGljIGlubGluZSBjaGFyKiBfU3RsX2VjdnRSKGxvbmcgZG91YmxlIHgsIGludCBuLCBpbnQqIHB0LCBpbnQqIHNpZ24sIGNoYXIqIGJ1Ziwgc2l6ZV90IGJzaXplKQoreyByZXR1cm4gKGVjdnRfcigoZG91YmxlKXgsIG4sIHB0LCBzaWduLCBidWYsIGJzaXplKSA9PSAwID8gYnVmIDogMCkgOyB9CitzdGF0aWMgaW5saW5lIGNoYXIqIF9TdGxfZmN2dFIobG9uZyBkb3VibGUgeCwgaW50IG4sIGludCogcHQsIGludCogc2lnbiwgY2hhciogYnVmLCBzaXplX3QgYnNpemUpCit7IHJldHVybiAoZmN2dF9yKChkb3VibGUpeCwgbiwgcHQsIHNpZ24sIGJ1ZiwgYnNpemUpID09IDAgPyBidWYgOiAwKTsgfQorIyAgICBlbmRpZgorIyAgICBkZWZpbmUgX1NUTFBfTkVFRF9DVlRfQlVGRkVSX1NJWkUKKyMgIGVsaWYgZGVmaW5lZCAoX19ocHV4KQorc3RhdGljIGlubGluZSBjaGFyKiBfU3RsX2VjdnRSKGRvdWJsZSB4LCBpbnQgbiwgaW50KiBwdCwgaW50KiBzaWduKQoreyByZXR1cm4gZWN2dCh4LCBuLCBwdCwgc2lnbik7IH0KK3N0YXRpYyBpbmxpbmUgY2hhciogX1N0bF9mY3Z0Uihkb3VibGUgeCwgaW50IG4sIGludCogcHQsIGludCogc2lnbikKK3sgcmV0dXJuIGZjdnQoeCwgbiwgcHQsIHNpZ24pOyB9CisjICAgIGlmICFkZWZpbmVkIChfU1RMUF9OT19MT05HX0RPVUJMRSkKK3N0YXRpYyBpbmxpbmUgY2hhciogX1N0bF9lY3Z0Uihsb25nIGRvdWJsZSB4LCBpbnQgbiwgaW50KiBwdCwgaW50KiBzaWduKQoreyByZXR1cm4gX2xkZWN2dCgqKGxvbmdfZG91YmxlKikmeCwgbiwgcHQsIHNpZ24pOyB9CitzdGF0aWMgaW5saW5lIGNoYXIqIF9TdGxfZmN2dFIobG9uZyBkb3VibGUgeCwgaW50IG4sIGludCogcHQsIGludCogc2lnbikKK3sgcmV0dXJuIF9sZGZjdnQoKihsb25nX2RvdWJsZSopJngsIG4sIHB0LCBzaWduKTsgfQorIyAgICBlbmRpZgorIyAgICBkZWZpbmUgX1NUTFBfQ1ZUX05FRURfU1lOQ0hST05JWkFUSU9OCisjICBlbGlmIGRlZmluZWQgKF9fdW5peCkgJiYgIWRlZmluZWQgKF9fQVBQTEVfXykgJiYgIWRlZmluZWQgKF9DUkFZKQorc3RhdGljIGlubGluZSBjaGFyKiBfU3RsX2VjdnRSKGRvdWJsZSB4LCBpbnQgbiwgaW50KiBwdCwgaW50KiBzaWduLCBjaGFyKiBidWYpCit7IHJldHVybiBlY3Z0X3IoeCwgbiwgcHQsIHNpZ24sIGJ1Zik7IH0KK3N0YXRpYyBpbmxpbmUgY2hhciogX1N0bF9mY3Z0Uihkb3VibGUgeCwgaW50IG4sIGludCogcHQsIGludCogc2lnbiwgY2hhciogYnVmKQoreyByZXR1cm4gZmN2dF9yKHgsIG4sIHB0LCBzaWduLCBidWYpOyB9CisjICAgIGlmICFkZWZpbmVkIChfU1RMUF9OT19MT05HX0RPVUJMRSkKK3N0YXRpYyBpbmxpbmUgY2hhciogX1N0bF9lY3Z0Uihsb25nIGRvdWJsZSB4LCBpbnQgbiwgaW50KiBwdCwgaW50KiBzaWduLCBjaGFyKiBidWYpCit7IHJldHVybiBxZWN2dF9yKHgsIG4sIHB0LCBzaWduLCBidWYpOyB9CitzdGF0aWMgaW5saW5lIGNoYXIqIF9TdGxfZmN2dFIobG9uZyBkb3VibGUgeCwgaW50IG4sIGludCogcHQsIGludCogc2lnbiwgY2hhciogYnVmKQoreyByZXR1cm4gcWZjdnRfcih4LCBuLCBwdCwgc2lnbiwgYnVmKTsgfQorIyAgICBlbmRpZgorIyAgZWxpZiBkZWZpbmVkIChfU1RMUF9NU1ZDX0xJQikgfHwgZGVmaW5lZCAoX19NSU5HVzMyX18pIHx8IGRlZmluZWQgKF9fQk9STEFORENfXykKKyMgICAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1NBRkVfU1RSSU5HX0ZVTkNUSU9OUykKKyMgICAgICBkZWZpbmUgX1NUTFBfQVBQRU5EKGEsIGIpIGEjI2IKKyMgICAgICBkZWZpbmUgX1NUTFBfQlVGX1BBUkFNUyAsIGNoYXIqIGJ1Ziwgc2l6ZV90IGJzaXplCisjICAgICAgZGVmaW5lIF9TVExQX1NFQ1VSRV9GVU4oRiwgWCwgTiwgUFQsIFNJR04pIF9TVExQX0FQUEVORChGLCBfcykoYnVmLCBic2l6ZSwgWCwgTiwgUFQsIFNJR04pOyByZXR1cm4gYnVmCisjICAgIGVsc2UKKyMgICAgICBkZWZpbmUgX1NUTFBfQlVGX1BBUkFNUworIyAgICAgIGRlZmluZSBfU1RMUF9TRUNVUkVfRlVOKEYsIFgsIE4sIFBULCBTSUdOKSByZXR1cm4gRihYLCBOLCBQVCwgU0lHTikKKyMgICAgICBkZWZpbmUgX1NUTFBfQ1ZUX05FRURfU1lOQ0hST05JWkFUSU9OCisjICAgIGVuZGlmCitzdGF0aWMgaW5saW5lIGNoYXIqIF9TdGxfZWN2dFIoZG91YmxlIHgsIGludCBuLCBpbnQqIHB0LCBpbnQqIHNpZ24gX1NUTFBfQlVGX1BBUkFNUykKK3sgX1NUTFBfU0VDVVJFX0ZVTihfZWN2dCwgeCwgbiwgcHQsIHNpZ24pOyB9CitzdGF0aWMgaW5saW5lIGNoYXIqIF9TdGxfZmN2dFIoZG91YmxlIHgsIGludCBuLCBpbnQqIHB0LCBpbnQqIHNpZ24gX1NUTFBfQlVGX1BBUkFNUykKK3sgX1NUTFBfU0VDVVJFX0ZVTihfZmN2dCwgeCwgbiwgcHQsIHNpZ24pOyB9CisjICAgIGlmICFkZWZpbmVkIChfU1RMUF9OT19MT05HX0RPVUJMRSkKKyMgICAgICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfU0FGRV9TVFJJTkdfRlVOQ1RJT05TKQorIyAgICAgICAgZGVmaW5lIF9TVExQX1BBUkFNUyAsIGJ1ZiwgYnNpemUKKyMgICAgICBlbHNlCisjICAgICAgICBkZWZpbmUgX1NUTFBfUEFSQU1TCisjICAgICAgZW5kaWYKK3N0YXRpYyBpbmxpbmUgY2hhciogX1N0bF9lY3Z0Uihsb25nIGRvdWJsZSB4LCBpbnQgbiwgaW50KiBwdCwgaW50KiBzaWduIF9TVExQX0JVRl9QQVJBTVMpCit7IHJldHVybiBfU3RsX2VjdnRSKF9fU1RBVElDX0NBU1QoZG91YmxlLCB4KSwgbiwgcHQsIHNpZ24gX1NUTFBfUEFSQU1TKTsgfQorc3RhdGljIGlubGluZSBjaGFyKiBfU3RsX2ZjdnRSKGxvbmcgZG91YmxlIHgsIGludCBuLCBpbnQqIHB0LCBpbnQqIHNpZ24gX1NUTFBfQlVGX1BBUkFNUykKK3sgcmV0dXJuIF9TdGxfZmN2dFIoX19TVEFUSUNfQ0FTVChkb3VibGUsIHgpLCBuLCBwdCwgc2lnbiBfU1RMUF9QQVJBTVMpOyB9CisjICAgICAgdW5kZWYgX1NUTFBfUEFSQU1TCisjICAgIGVuZGlmCisjICAgIHVuZGVmIF9TVExQX1NFQ1VSRV9GVU4KKyMgICAgdW5kZWYgX1NUTFBfQlVGX1BBUkFNUworIyAgICB1bmRlZiBfU1RMUF9BUFBFTkQKKyMgICAgaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKSAvKiB8fCBkZWZpbmVkIChfX0dOVUNfXykgTWluR1cgZG8gbm90IHN1cHBvcnQgJ0wnIG1vZGlmaWVyIHNvIGVtdWxhdGlvbiBkbyBub3Qgd29yayAqLworIyAgICAgIGRlZmluZSBfU1RMUF9FTVVMQVRFX0xPTkdfRE9VQkxFX0NWVAorIyAgICBlbmRpZgorIyAgZWxpZiBkZWZpbmVkIChfX0lTQ1BQX18pCitzdGF0aWMgaW5saW5lIGNoYXIqIF9TdGxfZWN2dFIoZG91YmxlIHgsIGludCBuLCBpbnQqIHB0LCBpbnQqIHNpZ24sIGNoYXIqIGJ1ZikKK3sgcmV0dXJuIF9mcF9lY3Z0KCB4LCBuLCBwdCwgc2lnbiwgYnVmKTsgfQorc3RhdGljIGlubGluZSBjaGFyKiBfU3RsX2ZjdnRSKGRvdWJsZSB4LCBpbnQgbiwgaW50KiBwdCwgaW50KiBzaWduLCBjaGFyKiBidWYpCit7IHJldHVybiBfZnBfZmN2dCh4LCBuLCBwdCwgc2lnbiwgYnVmKTsgfQorIyAgICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTE9OR19ET1VCTEUpCitzdGF0aWMgaW5saW5lIGNoYXIqIF9TdGxfZWN2dFIobG9uZyBkb3VibGUgeCwgaW50IG4sIGludCogcHQsIGludCogc2lnbiwgY2hhciogYnVmKQoreyByZXR1cm4gX2ZwX2VjdnQoIHgsIG4sIHB0LCBzaWduLCBidWYpOyB9CitzdGF0aWMgaW5saW5lIGNoYXIqIF9TdGxfZmN2dFIobG9uZyBkb3VibGUgeCwgaW50IG4sIGludCogcHQsIGludCogc2lnbiwgY2hhciogYnVmKQoreyByZXR1cm4gX2ZwX2ZjdnQoeCwgbiwgcHQsIHNpZ24sIGJ1Zik7IH0KKyMgICAgZW5kaWYKKyMgIGVsaWYgZGVmaW5lZCAoX0FJWCkgfHwgZGVmaW5lZCAoX19GcmVlQlNEX18pIHx8IGRlZmluZWQgKF9fTmV0QlNEX18pIHx8IGRlZmluZWQgKF9fT3BlbkJTRF9fKSB8fCBcCisgICAgICAgIGRlZmluZWQgKF9fTVJDX18pIHx8IGRlZmluZWQgKF9fU0NfXykgfHwgZGVmaW5lZCAoX0NSQVkpIHx8IFwKKyAgICAgICAgZGVmaW5lZCAoX1NUTFBfU0NPX09QRU5TRVJWRVIpIHx8IGRlZmluZWQgKF9fTkNSX1NWUikgfHwgXAorICAgICAgICBkZWZpbmVkIChfX0RNQ19fKQorc3RhdGljIGlubGluZSBjaGFyKiBfU3RsX2VjdnRSKGRvdWJsZSB4LCBpbnQgbiwgaW50KiBwdCwgaW50KiBzaWduKQoreyByZXR1cm4gZWN2dCh4LCBuLCBwdCwgc2lnbiApOyB9CitzdGF0aWMgaW5saW5lIGNoYXIqIF9TdGxfZmN2dFIoZG91YmxlIHgsIGludCBuLCBpbnQqIHB0LCBpbnQqIHNpZ24pCit7IHJldHVybiBmY3Z0KHgsIG4sIHB0LCBzaWduKTsgfQorIyAgICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTE9OR19ET1VCTEUpCitzdGF0aWMgaW5saW5lIGNoYXIqIF9TdGxfZWN2dFIobG9uZyBkb3VibGUgeCwgaW50IG4sIGludCogcHQsIGludCogc2lnbikKK3sgcmV0dXJuIGVjdnQoeCwgbiwgcHQsIHNpZ24gKTsgfQorc3RhdGljIGlubGluZSBjaGFyKiBfU3RsX2ZjdnRSKGxvbmcgZG91YmxlIHgsIGludCBuLCBpbnQqIHB0LCBpbnQqIHNpZ24pCit7IHJldHVybiBmY3Z0KHgsIG4sIHB0LCBzaWduKTsgfQorIyAgICBlbmRpZgorIyAgICBkZWZpbmUgX1NUTFBfQ1ZUX05FRURfU1lOQ0hST05JWkFUSU9OCisjICBlbHNlCisjICAgIGVycm9yIE1pc3NpbmcgX1N0bF9lY3Z0UiBhbmQgX1N0bF9mY3Z0UiBpbXBsZW1lbnRhdGlvbnMuCisjICBlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfQ1ZUX05FRURfU1lOQ0hST05JWkFUSU9OKQorLyogU1RMcG9ydCBzeW5jaHJvbml6ZSBhY2Nlc3MgdG8gKmN2dCBmdW5jdGlvbnMgYnV0IHRob3NlIG1ldGhvZHMgbWlnaHQKKyAqIGJlIGNhbGxlZCBmcm9tIG91dHNpZGUsIGluIHRoaXMgY2FzZSB3ZSB3aWxsIHN0aWxsIGhhdmUgYSByYWNlIGNvbmRpdGlvbi4gKi8KKyMgIGlmIGRlZmluZWQgKF9TVExQX1RIUkVBRFMpCitzdGF0aWMgX1NUTFBfU1RBVElDX01VVEVYJiBwdXRfZmxvYXRfbXV0ZXgoKSB7CisgIHN0YXRpYyBfU1RMUF9TVEFUSUNfTVVURVggX19wdXRfZmxvYXRfbXV0ZXggX1NUTFBfTVVURVhfSU5JVElBTElaRVI7CisgIHJldHVybiBfX3B1dF9mbG9hdF9tdXRleDsKK30KK3N0YXRpYyBpbmxpbmUgY2hhciogX1N0bF9lY3Z0Uihkb3VibGUgeCwgaW50IG4sIGludCogcHQsIGludCogc2lnbiwgY2hhciogYnVmKSB7CisgIF9TVExQX2F1dG9fbG9jayBsb2NrKHB1dF9mbG9hdF9tdXRleCgpKTsKKyAgc3RyY3B5KGJ1ZiwgX1N0bF9lY3Z0Uih4LCBuLCBwdCwgc2lnbikpOyByZXR1cm4gYnVmOworfQorc3RhdGljIGlubGluZSBjaGFyKiBfU3RsX2ZjdnRSKGRvdWJsZSB4LCBpbnQgbiwgaW50KiBwdCwgaW50KiBzaWduLCBjaGFyKiBidWYpIHsKKyAgX1NUTFBfYXV0b19sb2NrIGxvY2socHV0X2Zsb2F0X211dGV4KCkpOworICBzdHJjcHkoYnVmLCBfU3RsX2ZjdnRSKHgsIG4sIHB0LCBzaWduKSk7IHJldHVybiBidWY7Cit9CisjICAgIGlmICFkZWZpbmVkIChfU1RMUF9OT19MT05HX0RPVUJMRSkgJiYgIWRlZmluZWQgKF9TVExQX0VNVUxBVEVfTE9OR19ET1VCTEVfQ1ZUKQorc3RhdGljIGlubGluZSBjaGFyKiBfU3RsX2VjdnRSKGxvbmcgZG91YmxlIHgsIGludCBuLCBpbnQqIHB0LCBpbnQqIHNpZ24sIGNoYXIqIGJ1ZikgeworICBfU1RMUF9hdXRvX2xvY2sgbG9jayhwdXRfZmxvYXRfbXV0ZXgoKSk7CisgIHN0cmNweShidWYsIF9TdGxfZWN2dFIoeCwgbiwgcHQsIHNpZ24pKTsgcmV0dXJuIGJ1ZjsKK30KK3N0YXRpYyBpbmxpbmUgY2hhciogX1N0bF9mY3Z0Uihsb25nIGRvdWJsZSB4LCBpbnQgbiwgaW50KiBwdCwgaW50KiBzaWduLCBjaGFyKiBidWYpIHsKKyAgX1NUTFBfYXV0b19sb2NrIGxvY2socHV0X2Zsb2F0X211dGV4KCkpOworICBzdHJjcHkoYnVmLCBfU3RsX2ZjdnRSKHgsIG4sIHB0LCBzaWduKSk7IHJldHVybiBidWY7Cit9CisjICAgIGVuZGlmCisjICBlbHNlCitzdGF0aWMgaW5saW5lIGNoYXIqIF9TdGxfZWN2dFIoZG91YmxlIHgsIGludCBuLCBpbnQqIHB0LCBpbnQqIHNpZ24sIGNoYXIqKQoreyByZXR1cm4gX1N0bF9lY3Z0Uih4LCBuLCBwdCwgc2lnbik7IH0KK3N0YXRpYyBpbmxpbmUgY2hhciogX1N0bF9mY3Z0Uihkb3VibGUgeCwgaW50IG4sIGludCogcHQsIGludCogc2lnbiwgY2hhciopCit7IHJldHVybiBfU3RsX2ZjdnRSKHgsIG4sIHB0LCBzaWduKTsgfQorIyAgICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTE9OR19ET1VCTEUpICYmICFkZWZpbmVkIChfU1RMUF9FTVVMQVRFX0xPTkdfRE9VQkxFX0NWVCkKK3N0YXRpYyBpbmxpbmUgY2hhciogX1N0bF9lY3Z0Uihsb25nIGRvdWJsZSB4LCBpbnQgbiwgaW50KiBwdCwgaW50KiBzaWduLCBjaGFyKikKK3sgcmV0dXJuIF9TdGxfZWN2dFIoeCwgbiwgcHQsIHNpZ24pOyB9CitzdGF0aWMgaW5saW5lIGNoYXIqIF9TdGxfZmN2dFIobG9uZyBkb3VibGUgeCwgaW50IG4sIGludCogcHQsIGludCogc2lnbiwgY2hhciopCit7IHJldHVybiBfU3RsX2ZjdnRSKHgsIG4sIHB0LCBzaWduKTsgfQorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisjICBpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX1NBRkVfU1RSSU5HX0ZVTkNUSU9OUykgJiYgIWRlZmluZWQgKF9TVExQX05FRURfQ1ZUX0JVRkZFUl9TSVpFKQorIyAgICBkZWZpbmUgX1NUTFBfQ1ZUX0JVRkZFUihCKSBCCisjICBlbHNlCisjICAgIGRlZmluZSBfU1RMUF9DVlRfQlVGRkVSKEIpIF9TVExQX0FSUkFZX0FORF9TSVpFKEIpCisjICBlbmRpZgorCisjICBpZiBkZWZpbmVkIChfU1RMUF9FTVVMQVRFX0xPTkdfRE9VQkxFX0NWVCkKK3N0YXRpYyB2b2lkIF9fZmlsbF9mbXRidWYoY2hhciogZm10YnVmLCBpb3NfYmFzZTo6Zm10ZmxhZ3MgZmxhZ3MsIGNoYXIgbG9uZ19tb2RpZmllcik7CisKKy8vIEVtdWxhdGlvbiBvZiBlY3Z0L2ZjdnQgZnVuY3Rpb25zIHVzaW5nIHNwcmludGY6CitzdGF0aWMgY2hhciogX1N0bF9lY3Z0Uihsb25nIGRvdWJsZSB4LCBpbnQgbiwgaW50KiBwdCwgaW50KiBzaWduLCBjaGFyKiBidWYpIHsKKyAgLy8gSWYgbG9uZyBkb3VibGUgdmFsdWUgY2FuIGJlIHNhZmVseSBjb252ZXJ0ZWQgdG8gZG91YmxlIHdpdGhvdXQgbG9zaW5nIHByZWNpc2lvbgorICAvLyB3ZSB1c2UgdGhlIGVjdnQgZnVuY3Rpb24gZm9yIGRvdWJsZToKKyAgZG91YmxlIHkgPSBfX1NUQVRJQ19DQVNUKGRvdWJsZSwgeCk7IAorICBpZiAoeCA9PSB5KQorICAgIHJldHVybiBfU3RsX2VjdnRSKHksIG4sIHB0LCBzaWduLCBidWYpOworCisgIGNoYXIgZm10YnVmWzMyXTsKKyAgX19maWxsX2ZtdGJ1ZihmbXRidWYsIDAsICdMJyk7CisgIHNwcmludGYoYnVmLCBmbXRidWYsIG4sIHggPCAwLjBsID8gLXggOiB4KTsKKyAgLyogV2UgYXJlIHdhaXRpbmcgZm9yIHNvbWV0aGluZyBoYXZpbmcgdGhlIGZvcm0geC54eHhlK3l5eXkgKi8KKyAgKnB0ID0gMDsKKyAgKnNpZ24gPSAwOworICBpbnQgaSA9IC0xOworICBpbnQgb2Zmc2V0ID0gMDsKKyAgd2hpbGUgKGJ1ZlsrK2ldICE9IDAgJiYgbiAhPSAwKSB7CisgICAgaWYgKGJ1ZltpXSA+PSAnMCcgJiYgYnVmW2ldIDw9ICc5JykgeworICAgICAgLS1uOworICAgICAgaWYgKG9mZnNldCAhPSAwKQorICAgICAgICBidWZbaSAtIG9mZnNldF0gPSBidWZbaV07CisgICAgfQorICAgIGVsc2UgeworICAgICAgaWYgKG9mZnNldCAhPSAwKSBicmVhazsKKyAgICAgICsrb2Zmc2V0OworICAgICAgKnB0ID0gaTsKKyAgICB9CisgIH0KKyAgaWYgKG9mZnNldCAhPSAwKQorICAgIGJ1ZltpIC0gb2Zmc2V0XSA9IDA7CisgIC8vIEV4dHJhY3QgZXhwb25lbnQgcGFydCBpbiBwb2ludCBwb3NpdGlvbjoKKyAgaW50IGUgPSAwOworICB3aGlsZSAoYnVmWysraV0gIT0gMCkgeworICAgIGlmIChidWZbaV0gPj0gJzAnICYmIGJ1ZltpXSA8PSAnOScpIHsKKyAgICAgIGUgPSBlICogMTAgKyAoYnVmW2ldIC0gJzAnKTsKKyAgICB9CisgIH0KKyAgKnB0ICs9IGU7CisgIHJldHVybiBidWY7Cit9CisKK3N0YXRpYyBjaGFyKiBfU3RsX2ZjdnRSKGxvbmcgZG91YmxlIHgsIGludCBuLCBpbnQqIHB0LCBpbnQqIHNpZ24sIGNoYXIqIGJ1ZikgeworICAvLyBJZiBsb25nIGRvdWJsZSB2YWx1ZSBjYW4gYmUgc2FmZWx5IGNvbnZlcnRlZCB0byBkb3VibGUgd2l0aG91dCBsb3NpbmcgcHJlY2lzaW9uCisgIC8vIHdlIHVzZSB0aGUgZmN2dCBmdW5jdGlvbiBmb3IgZG91YmxlOgorICBkb3VibGUgeSA9IF9fU1RBVElDX0NBU1QoZG91YmxlLCB4KTsKKyAgaWYgKHggPT0geSkKKyAgICByZXR1cm4gX1N0bF9mY3Z0Uih5LCBuLCBwdCwgc2lnbiwgYnVmKTsKKworICBjaGFyIGZtdGJ1ZlszMl07CisgIF9fZmlsbF9mbXRidWYoZm10YnVmLCBpb3NfYmFzZTo6Zml4ZWQsICdMJyk7CisgIHNwcmludGYoYnVmLCBmbXRidWYsIG4sIHggPCAwLjBsID8gLXggOiB4KTsKKyAgKnB0ID0gMDsKKyAgKnNpZ24gPSAwOworICBpbnQgaSA9IC0xOworICBpbnQgb2Zmc2V0ID0gMDsKKyAgd2hpbGUgKGJ1ZlsrK2ldICE9IDAgJiYgKG9mZnNldCA9PSAwIHx8IG4gIT0gMCkpIHsKKyAgICBpZiAoYnVmW2ldID49ICcwJyAmJiBidWZbaV0gPD0gJzknKSB7CisgICAgICBpZiAob2Zmc2V0ICE9IDApIHsKKyAgICAgICAgLS1uOworICAgICAgICBidWZbaSAtIG9mZnNldF0gPSBidWZbaV07CisgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgKytvZmZzZXQ7CisgICAgICAqcHQgPSBpOworICAgIH0KKyAgfQorICBpZiAob2Zmc2V0ICE9IDApCisgICAgYnVmW2kgLSBvZmZzZXRdID0gMDsKKyAgZWxzZQorICAgICpwdCA9IGk7CisgIHJldHVybiBidWY7Cit9CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBudW1fcHV0CisKKy8vIF9fZm9ybWF0X2Zsb2F0IGZvcm1hdHMgYSBtYW50aXNzYSBhbmQgZXhwb25lbnQgYXMgcmV0dXJuZWQgYnkKKy8vIG9uZSBvZiB0aGUgY29udmVyc2lvbiBmdW5jdGlvbnMgKGVjdnRfciwgZmN2dF9yLCBxZWN2dF9yLCBxZmN2dF9yKQorLy8gYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgcHJlY2lzaW9uIGFuZCBmb3JtYXQgZmxhZ3MuICBUaGlzIGlzCisvLyBiYXNlZCBvbiBkb3BybnQgYnV0IGlzIG11Y2ggc2ltcGxlciBzaW5jZSBpdCBpcyBjb25jZXJuZWQgb25seQorLy8gd2l0aCBmbG9hdGluZyBwb2ludCBpbnB1dCBhbmQgZG9lcyBub3QgY29uc2lkZXIgYWxsIGZvcm1hdHMuICBJdAorLy8gYWxzbyBkb2VzIG5vdCBkZWFsIHdpdGggYmxhbmsgcGFkZGluZywgd2hpY2ggaXMgaGFuZGxlZCBieQorLy8gX19jb3B5X2Zsb2F0X2FuZF9maWxsLgorCitzdGF0aWMgc2l6ZV90IF9fZm9ybWF0X2Zsb2F0X3NjaWVudGlmaWMoIF9faW9zdHJpbmcmIGJ1ZiwgY29uc3QgY2hhciAqYnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWNwdCwgaW50IHNpZ24sIGJvb2wgaXNfemVybywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6OmZtdGZsYWdzIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJlY2lzaW9uKSB7CisgIC8vIHNpZ24gaWYgcmVxdWlyZWQKKyAgaWYgKHNpZ24pCisgICAgYnVmICs9ICctJzsKKyAgZWxzZSBpZiAoZmxhZ3MgJiBpb3NfYmFzZTo6c2hvd3BvcykKKyAgICBidWYgKz0gJysnOworCisgIC8vIGZpcnN0IGRpZ2l0IG9mIG1hbnRpc3NhCisgIGJ1ZiArPSAqYnArKzsKKworICAvLyBzdGFydCBvZiBncm91cGluZyBwb3NpdGlvbiwgZ3JvdXBpbmcgd29uJ3Qgb2NjdXIgaW4gc2NpZW50aWZpYyBub3RhdGlvbgorICAvLyBhcyBpdCBpcyBpbXBvc3NpYmxlIHRvIGhhdmUgc29tZXRoaW5nIGxpa2UgMTIzNC4wZTA0IGJ1dCB3ZSByZXR1cm4gYSBjb3JyZWN0CisgIC8vIGdyb3VwIHBvc2l0aW9uIGZvciBjb2hlcmVuY3kgd2l0aCBfX2Zvcm1hdF9mbG9hdF9maXhlZC4KKyAgc2l6ZV90IF9fZ3JvdXBfcG9zID0gYnVmLnNpemUoKTsKKworICAvLyBkZWNpbWFsIHBvaW50IGlmIHJlcXVpcmVkCisgIGlmIChwcmVjaXNpb24gIT0gMCB8fCBmbGFncyAmIGlvc19iYXNlOjpzaG93cG9pbnQpIHsKKyAgICBidWYgKz0gJy4nOworICB9CisKKyAgLy8gcmVzdCBvZiBtYW50aXNzYQorICB3aGlsZSAoKmJwICE9IDAgJiYgcHJlY2lzaW9uLS0pCisgICAgYnVmICs9ICpicCsrOworCisgIC8vIHRyYWlsaW5nIDAgaWYgbmVlZGVkCisgIGlmIChwcmVjaXNpb24gPiAwKQorICAgIGJ1Zi5hcHBlbmQocHJlY2lzaW9uLCAnMCcpOworCisgIC8vIGV4cG9uZW50IHNpemUgPSBudW1iZXIgb2YgZGlnaXRzICsgZXhwb25lbnQgc2lnbiArIGV4cG9uZW50IHN5bWJvbCArIHRyYWlsaW5nIHplcm8KKyAgY2hhciBleHBidWZbTUFYRURJR0lUUyArIDNdOworICAvL1dlIHN0YXJ0IGZpbGxpbmcgYXQgdGhlIGJ1ZmZlciBlbmQKKyAgY2hhciAqc3VmZml4ID0gZXhwYnVmICsgTUFYRURJR0lUUyArIDI7CisgICpzdWZmaXggPSAwOworICBpZiAoIWlzX3plcm8pIHsKKyAgICBpbnQgbm4gPSBkZWNwdCAtIDE7CisgICAgaWYgKG5uIDwgMCkKKyAgICAgIG5uID0gLW5uOworICAgIGZvciAoOyBubiA+IDk7IG5uIC89IDEwKQorICAgICAgKi0tc3VmZml4ID0gKGNoYXIpIHRvZGlnaXQobm4gJSAxMCk7CisgICAgKi0tc3VmZml4ID0gKGNoYXIpIHRvZGlnaXQobm4pOworICB9CisKKyAgLy8gcHJlcGVuZCBsZWFkaW5nIHplcm9zIHRvIGV4cG9uZW50CisgIC8vIEM4OSBTdGFuZGFyZCBzYXlzIHRoYXQgaXQgc2hvdWxkIGJlIGF0IGxlYXN0IDIgZGlnaXRzLCBDOTkgU3RhbmRhcmQgc2F5cyB0aGF0CisgIC8vIHdlIHN0b3AgcHJlcGVuZCB6ZXJvcyBpZiBtb3JlIHRoYW4gMyBkaWdpdHMuIFRvIHJlcGVjdCBib3RoIFNUTHBvcnQgcHJlcGVuZCB6ZXJvcworICAvLyB1bnRpbCBpdCBpcyAyIGRpZ2l0cy4KKyAgd2hpbGUgKHN1ZmZpeCA+ICZleHBidWZbTUFYRURJR0lUU10pCisgICAgKi0tc3VmZml4ID0gJzAnOworCisgIC8vIHB1dCBpbiB0aGUgZXhwb25lbnQgc2lnbgorICAqLS1zdWZmaXggPSAoY2hhcikgKChkZWNwdCA+IDAgfHwgaXNfemVybyApID8gJysnIDogJy0nKTsKKworICAvLyBwdXQgaW4gdGhlIGUKKyAgKi0tc3VmZml4ID0gZmxhZ3MgJiBpb3NfYmFzZTo6dXBwZXJjYXNlID8gJ0UnIDogJ2UnOworCisgIC8vIGNvcHkgdGhlIHN1ZmZpeAorICBidWYgKz0gc3VmZml4OworICByZXR1cm4gX19ncm91cF9wb3M7Cit9CisKK3N0YXRpYyBzaXplX3QgX19mb3JtYXRfZmxvYXRfZml4ZWQoIF9faW9zdHJpbmcgJmJ1ZiwgY29uc3QgY2hhciAqYnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVjcHQsIGludCBzaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6OmZtdGZsYWdzIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByZWNpc2lvbikgeworICBpZiAoIHNpZ24gJiYgKGRlY3B0ID4gLXByZWNpc2lvbikgJiYgKCpicCAhPSAwKSApCisgICAgYnVmICs9ICctJzsKKyAgZWxzZSBpZiAoIGZsYWdzICYgaW9zX2Jhc2U6OnNob3dwb3MgKQorICAgIGJ1ZiArPSAnKyc7CisKKyAgLy8gZGlnaXRzIGJlZm9yZSBkZWNpbWFsIHBvaW50CisgIGludCBubm4gPSBkZWNwdDsKKyAgZG8geworICAgIGJ1ZiArPSAobm5uIDw9IDAgfHwgKmJwID09IDApID8gJzAnIDogKmJwKys7CisgIH0gd2hpbGUgKCAtLW5ubiA+IDAgKTsKKworICAvLyBzdGFydCBvZiBncm91cGluZyBwb3NpdGlvbgorICBzaXplX3QgX19ncm91cF9wb3MgPSBidWYuc2l6ZSgpOworCisgIC8vIGRlY2ltYWwgcG9pbnQgaWYgbmVlZGVkCisgIGlmICggZmxhZ3MgJiBpb3NfYmFzZTo6c2hvd3BvaW50IHx8IHByZWNpc2lvbiA+IDAgKSB7CisgICAgYnVmICs9ICcuJzsKKyAgfQorCisgIC8vIGRpZ2l0cyBhZnRlciBkZWNpbWFsIHBvaW50IGlmIGFueQorICB3aGlsZSAoICpicCAhPSAwICYmIC0tcHJlY2lzaW9uID49IDAgKSB7CisgICAgYnVmICs9ICgrK2RlY3B0IDw9IDApID8gJzAnIDogKmJwKys7CisgIH0KKworICAvLyB0cmFpbGluZyB6ZXJvcyBpZiBuZWVkZWQKKyAgaWYgKHByZWNpc2lvbiA+IDApCisgICAgYnVmLmFwcGVuZChwcmVjaXNpb24sICcwJyk7CisKKyAgcmV0dXJuIF9fZ3JvdXBfcG9zOworfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1NJR05fSEVMUEVSKQordGVtcGxhdGU8Y2xhc3MgX0Zsb2F0VD4KK3N0cnVjdCBmbG9hdF9zaWduX2hlbHBlciB7CisgIGZsb2F0X3NpZ25faGVscGVyKF9GbG9hdFQgX194KQorICB7IF9NX251bWJlci5fbnVtID0gX194OyB9CisKKyAgYm9vbCBpc19uZWdhdGl2ZSgpIGNvbnN0IHsKKyAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCBzaWduX21hc2soMSA8PCAoc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSAqIENIQVJfQklUIC0gMSkpOworICAgIHJldHVybiAoZ2V0X3NpZ25fd29yZCgpICYgc2lnbl9tYXNrKSAhPSAwOworICB9Citwcml2YXRlOgorICB1bmlvbiB7CisgICAgdW5zaWduZWQgc2hvcnQgX1dvcmRzWzhdOworICAgIF9GbG9hdFQgX251bTsKKyAgfSBfTV9udW1iZXI7CisKKyAgdW5zaWduZWQgc2hvcnQgZ2V0X3dvcmRfaGlnaGVyKCkgY29uc3QgX1NUTFBfTk9USFJPVworICB7IHJldHVybiBfTV9udW1iZXIuX1dvcmRzWzBdOyB9CisgIHVuc2lnbmVkIHNob3J0IGdldF93b3JkX2xvd2VyKCkgY29uc3QgX1NUTFBfTk9USFJPVworICB7IHJldHVybiBfTV9udW1iZXIuX1dvcmRzWyhzaXplb2YoX0Zsb2F0VCkgPj0gMTIgPyAxMCA6IHNpemVvZihfRmxvYXRUKSkgLyBzaXplb2YodW5zaWduZWQgc2hvcnQpIC0gMV07IH0KKyAgdW5zaWduZWQgc2hvcnQgZ2V0X3NpZ25fd29yZCgpIGNvbnN0IF9TVExQX05PVEhST1cKKyMgIGlmIGRlZmluZWQgKF9TVExQX0JJR19FTkRJQU4pCisgIHsgcmV0dXJuIGdldF93b3JkX2hpZ2hlcigpOyB9CisjICBlbHNlIC8qIF9TVExQX0xJVFRMRV9FTkRJQU4gKi8KKyAgeyByZXR1cm4gZ2V0X3dvcmRfbG93ZXIoKTsgfQorIyAgZW5kaWYKK307CisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9GbG9hdFQ+CitzdGF0aWMgc2l6ZV90IF9fZm9ybWF0X25hbl9vcl9pbmYoX19pb3N0cmluZyYgYnVmLCBfRmxvYXRUIHgsIGlvc19iYXNlOjpmbXRmbGFncyBmbGFncykgeworICBzdGF0aWMgY29uc3QgY2hhciogaW5mWzJdID0geyAiaW5mIiwgIkluZiIgfTsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIG5hblsyXSA9IHsgIm5hbiIsICJOYU4iIH07CisgIGNvbnN0IGNoYXIqKiBpbmZfb3JfbmFuOworI2lmICFkZWZpbmVkIChfU1RMUF9VU0VfU0lHTl9IRUxQRVIpCisgIGlmIChfU3RsX2lzX2luZih4KSkgeyAgICAgICAgICAgIC8vIEluZmluaXR5CisgICAgaW5mX29yX25hbiA9IGluZjsKKyAgICBpZiAoX1N0bF9pc19uZWdfaW5mKHgpKQorICAgICAgYnVmICs9ICctJzsKKyAgICBlbHNlIGlmIChmbGFncyAmIGlvc19iYXNlOjpzaG93cG9zKQorICAgICAgYnVmICs9ICcrJzsKKyAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgLy8gTmFOCisgICAgaW5mX29yX25hbiA9IG5hbjsKKyAgICBpZiAoX1N0bF9pc19uZWdfbmFuKHgpKQorICAgICAgYnVmICs9ICctJzsKKyAgICBlbHNlIGlmIChmbGFncyAmIGlvc19iYXNlOjpzaG93cG9zKQorICAgICAgYnVmICs9ICcrJzsKKyAgfQorI2Vsc2UKKyAgdHlwZWRlZiBudW1lcmljX2xpbWl0czxfRmxvYXRUPiBsaW1pdHM7CisgIGlmICh4ID09IGxpbWl0czo6aW5maW5pdHkoKSB8fCB4ID09IC1saW1pdHM6OmluZmluaXR5KCkpIHsKKyAgICBpbmZfb3JfbmFuID0gaW5mOworICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgLy8gTmFOCisgICAgaW5mX29yX25hbiA9IG5hbjsKKyAgfQorICBmbG9hdF9zaWduX2hlbHBlcjxfRmxvYXRUPiBoZWxwZXIoeCk7CisgIGlmIChoZWxwZXIuaXNfbmVnYXRpdmUoKSkKKyAgICBidWYgKz0gJy0nOworICBlbHNlIGlmIChmbGFncyAmIGlvc19iYXNlOjpzaG93cG9zKQorICAgIGJ1ZiArPSAnKyc7CisjZW5kaWYKKyAgc2l6ZV90IHJldCA9IGJ1Zi5zaXplKCk7CisgIGJ1ZiArPSBpbmZfb3JfbmFuW2ZsYWdzICYgaW9zX2Jhc2U6OnVwcGVyY2FzZSA/IDEgOiAwXTsKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBzaXplX3QgX19mb3JtYXRfZmxvYXQoX19pb3N0cmluZyAmYnVmLCBjb25zdCBjaGFyICogYnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVjcHQsIGludCBzaWduLCBib29sIGlzX3plcm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6Zm10ZmxhZ3MgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJlY2lzaW9uKSB7CisgIHNpemVfdCBfX2dyb3VwX3BvcyA9IDA7CisgIHN3aXRjaCAoZmxhZ3MgJiBpb3NfYmFzZTo6ZmxvYXRmaWVsZCkgeworICAgIGNhc2UgaW9zX2Jhc2U6OnNjaWVudGlmaWM6CisgICAgICBfX2dyb3VwX3BvcyA9IF9fZm9ybWF0X2Zsb2F0X3NjaWVudGlmaWMoIGJ1ZiwgYnAsIGRlY3B0LCBzaWduLCBpc196ZXJvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgcHJlY2lzaW9uKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgaW9zX2Jhc2U6OmZpeGVkOgorICAgICAgX19ncm91cF9wb3MgPSBfX2Zvcm1hdF9mbG9hdF9maXhlZCggYnVmLCBicCwgZGVjcHQsIHNpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgcHJlY2lzaW9uKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6IC8vIGcgZm9ybWF0CisgICAgICAvLyBlc3RhYmxpc2ggZGVmYXVsdCBwcmVjaXNpb24KKyAgICAgIGlmIChmbGFncyAmIGlvc19iYXNlOjpzaG93cG9pbnQgfHwgcHJlY2lzaW9uID4gMCkgeworICAgICAgICBpZiAocHJlY2lzaW9uID09IDApIHByZWNpc2lvbiA9IDE7CisgICAgICB9IGVsc2UKKyAgICAgICAgcHJlY2lzaW9uID0gNjsKKworICAgICAgLy8gcmVzZXQgZXhwb25lbnQgaWYgdmFsdWUgaXMgemVybworICAgICAgaWYgKGlzX3plcm8pCisgICAgICAgIGRlY3B0ID0gMTsKKworICAgICAgaW50IGtrID0gcHJlY2lzaW9uOworICAgICAgaWYgKCEoZmxhZ3MgJiBpb3NfYmFzZTo6c2hvd3BvaW50KSkgeworICAgICAgICBzaXplX3QgbiA9IHN0cmxlbihicCk7CisgICAgICAgIGlmIChuIDwgKHNpemVfdClraykKKyAgICAgICAgICBrayA9IChpbnQpbjsKKyAgICAgICAgd2hpbGUgKGtrID49IDEgJiYgYnBba2stMV0gPT0gJzAnKQorICAgICAgICAgIC0ta2s7CisgICAgICB9CisKKyAgICAgIGlmIChkZWNwdCA8IC0zIHx8IGRlY3B0ID4gcHJlY2lzaW9uKSB7CisgICAgICAgIHByZWNpc2lvbiA9IGtrIC0gMTsKKyAgICAgICAgX19ncm91cF9wb3MgPSBfX2Zvcm1hdF9mbG9hdF9zY2llbnRpZmljKCBidWYsIGJwLCBkZWNwdCwgc2lnbiwgaXNfemVybywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgcHJlY2lzaW9uKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHByZWNpc2lvbiA9IGtrIC0gZGVjcHQ7CisgICAgICAgIF9fZ3JvdXBfcG9zID0gX19mb3JtYXRfZmxvYXRfZml4ZWQoIGJ1ZiwgYnAsIGRlY3B0LCBzaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgcHJlY2lzaW9uKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICB9IC8qIHN3aXRjaCAqLworICByZXR1cm4gX19ncm91cF9wb3M7Cit9CisKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoVVNFX1NQUklOVEZfSU5TVEVBRCkgfHwgZGVmaW5lZCAoX1NUTFBfRU1VTEFURV9MT05HX0RPVUJMRV9DVlQpCitzdHJ1Y3QgR3JvdXBQb3MgeworICBib29sIG9wZXJhdG9yICgpIChjaGFyIF9fYykgY29uc3QgeworICAgIHJldHVybiBfX2MgPT0gJy4nIHx8CisgICAgICAgICAgIF9fYyA9PSAnZScgfHwgX19jID09ICdFJzsKKyAgfQorfTsKKworLy8gQ3JlYXRlcyBhIGZvcm1hdCBzdHJpbmcgZm9yIHNwcmludGYoKQorc3RhdGljIHZvaWQgX19maWxsX2ZtdGJ1ZihjaGFyKiBmbXRidWYsIGlvc19iYXNlOjpmbXRmbGFncyBmbGFncywgY2hhciBsb25nX21vZGlmaWVyKSB7CisgIGZtdGJ1ZlswXSA9ICclJzsKKyAgaW50IGkgPSAxOworCisgIGlmIChmbGFncyAmIGlvc19iYXNlOjpzaG93cG9zKQorICAgIGZtdGJ1ZltpKytdID0gJysnOworCisgIGlmIChmbGFncyAmIGlvc19iYXNlOjpzaG93cG9pbnQpCisgICAgZm10YnVmW2krK10gPSAnIyc7CisKKyAgZm10YnVmW2krK10gPSAnLic7CisgIGZtdGJ1ZltpKytdID0gJyonOworCisgIGlmIChsb25nX21vZGlmaWVyKQorICAgIGZtdGJ1ZltpKytdID0gbG9uZ19tb2RpZmllcjsKKworICBzd2l0Y2ggKGZsYWdzICYgaW9zX2Jhc2U6OmZsb2F0ZmllbGQpCisgICAgeworICAgIGNhc2UgaW9zX2Jhc2U6OnNjaWVudGlmaWM6CisgICAgICBmbXRidWZbaSsrXSA9IChmbGFncyAmIGlvc19iYXNlOjp1cHBlcmNhc2UpID8gICdFJyA6ICdlJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgaW9zX2Jhc2U6OmZpeGVkOgorIyAgaWYgZGVmaW5lZCAoX19GcmVlQlNEX18pCisgICAgICBmbXRidWZbaSsrXSA9ICdmJzsKKyMgIGVsc2UKKyAgICAgIGZtdGJ1ZltpKytdID0gKGZsYWdzICYgaW9zX2Jhc2U6OnVwcGVyY2FzZSkgPyAnRicgOiAnZic7CisjICBlbmRpZgorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGZtdGJ1ZltpKytdID0gKGZsYWdzICYgaW9zX2Jhc2U6OnVwcGVyY2FzZSkgPyAgJ0cnIDogJ2cnOworICAgICAgYnJlYWs7CisgICAgfQorCisgIGZtdGJ1ZltpXSA9IDA7Cit9CisKKyNlbmRpZiAgLyogVVNFX1NQUklOVEZfSU5TVEVBRCAqLworCit0ZW1wbGF0ZSA8Y2xhc3MgX0Zsb2F0VD4KK3N0YXRpYyBzaXplX3QgIF9fd3JpdGVfZmxvYXRUKF9faW9zdHJpbmcgJmJ1ZiwgaW9zX2Jhc2U6OmZtdGZsYWdzIGZsYWdzLCBpbnQgcHJlY2lzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0Zsb2F0VCB4CisjaWYgZGVmaW5lZCAoVVNFX1NQUklOVEZfSU5TVEVBRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgY2hhciBtb2RpZmllcikgeworICAvKiBJbiB0aGVvcnksIGlmIHdlIHdhbnQgJ2FyYml0cmFyeScgcHJlY2lzaW9uLCB3ZSBzaG91bGQgdXNlICdhcmJpdHJhcnknCisgICAqIGJ1ZmZlciBzaXplIGJlbG93LCBidXQgcmVhbGx5IHdlIGxpbWl0ZWQgYnkgZXhwb25lbnQgcGFydCBpbiBkb3VibGUuCisgICAqICAgIC0gcHRyCisgICAqLworICB0eXBlZGVmIG51bWVyaWNfbGltaXRzPF9GbG9hdFQ+IGxpbWl0czsKKyAgY2hhciBzdGF0aWNfYnVmW2xpbWl0czo6bWF4X2V4cG9uZW50MTAgKyA2XTsgLy8gNjogLXh4eC55eXlFLXp6eiAoc2lnbiwgZG90LCBFLCBleHAgc2lnbiwgXDApCisgIGNoYXIgZm10YnVmWzMyXTsKKyAgX19maWxsX2ZtdGJ1ZihmbXRidWYsIGZsYWdzLCBtb2RpZmllcik7CisgIHNucHJpbnRmKF9TVExQX0FSUkFZX0FORF9TSVpFKHN0YXRpY19idWYpLCBmbXRidWYsIHByZWNpc2lvbiwgeCk7CisgIGJ1ZiA9IHN0YXRpY19idWY7CisgIHJldHVybiBmaW5kX2lmKGJ1Zi5iZWdpbigpLCBidWYuZW5kKCksIEdyb3VwUG9zKCkpIC0gYnVmLmJlZ2luKCk7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7CisgIHR5cGVkZWYgbnVtZXJpY19saW1pdHM8X0Zsb2F0VD4gbGltaXRzOworICAvL0lmIG51bWVyaWNfbGltaXRzIHN1cHBvcnQgaXMgY29ycmVjdCB3ZSB1c2UgdGhlIGV4cG9zZWQgdmFsdWVzIHRvIGRldGVjdCBOYU4gYW5kIGluZmluaXR5OgorICBpZiAobGltaXRzOjpoYXNfaW5maW5pdHkgJiYgbGltaXRzOjpoYXNfcXVpZXRfTmFOKSB7CisgICAgaWYgKCEoeCA9PSB4KSB8fCAvLyBOYU4gY2hlY2sKKyAgICAgICAgKHggPT0gbGltaXRzOjppbmZpbml0eSgpIHx8IHggPT0gLWxpbWl0czo6aW5maW5pdHkoKSkpIHsKKyAgICAgIHJldHVybiBfX2Zvcm1hdF9uYW5fb3JfaW5mKGJ1ZiwgeCwgZmxhZ3MpOworICAgIH0KKyAgfQorICAvLyBudW1lcmljX2xpbWl0cyBzdXBwb3J0IGlzIG5vdCBnb29kIGVub3VnaCwgd2UgcmVseSBvbiBwbGF0Zm9ybSBkZXBlbmRlbnQgZnVuY3Rpb24KKyAgLy8gX1N0bF9pc19uYW5fb3JfaW5mIHRoYXQgZG8gbm90IHN1cHBvcnQgbG9uZyBkb3VibGUuCisgIGVsc2UgaWYgKF9TdGxfaXNfbmFuX29yX2luZih4KSkgeworICAgIHJldHVybiBfX2Zvcm1hdF9uYW5fb3JfaW5mKGJ1ZiwgeCwgZmxhZ3MpOworICB9CisjICBpZiBkZWZpbmVkIChfX01JTkdXMzJfXykKKyAgLy9Gb3IgdGhlIG1vbWVudCBNaW5HVyBpcyBsaW1pdGVkIHRvIGRpc3BsYXkgYXQgbW9zdCBudW1lcmljX2xpbWl0czxkb3VibGU+OjptYXgoKQorICBpZiAoeCA+IG51bWVyaWNfbGltaXRzPGRvdWJsZT46Om1heCgpIHx8CisgICAgICB4IDwgLW51bWVyaWNfbGltaXRzPGRvdWJsZT46Om1heCgpKSB7CisgICAgcmV0dXJuIF9fZm9ybWF0X25hbl9vcl9pbmYoYnVmLCB4LCBmbGFncyk7CisgIH0KKyMgIGVuZGlmCisKKyAgLyogQnVmZmVyIHNpemUgaXMgbWF4IG51bWJlciBvZiBkaWdpdHMgd2hpY2ggaXMgdGhlIGFkZGl0aW9uIG9mOgorICAgKiAtIG1heF9leHBvbmVudDEwOiBtYXggbnVtYmVyIG9mIGRpZ2l0cyBpbiBmaXhlZCBtb2RlCisgICAqIC0gZGlnaXRzMTAgKyAyOiBtYXggbnVtYmVyIG9mIHNpZ25pZmljYW50IGRpZ2l0cworICAgKiAtIHRyYWlsaW5nICdcMCcKKyAgICovCisgIGNoYXIgY3Z0YnVmW2xpbWl0czo6bWF4X2V4cG9uZW50MTAgKyBsaW1pdHM6OmRpZ2l0czEwICsgMiArIDFdOworICBjaGFyICpicDsKKyAgaW50IGRlY3B0LCBzaWduOworCisgIHN3aXRjaCAoZmxhZ3MgJiBpb3NfYmFzZTo6ZmxvYXRmaWVsZCkgeworICBjYXNlIGlvc19iYXNlOjpmaXhlZDoKKyAgICB7CisgICAgICAvKiBIZXJlLCBudW1iZXIgb2YgZGlnaXRzIHJlcHJlc2VudHMgZGlnaXRzIF9hZnRlcl8gZGVjaW1hbCBwb2ludC4KKyAgICAgICAqIEluIG9yZGVyIHRvIGxpbWl0IHN0YXRpYyBidWZmZXIgc2l6ZSB3ZSBoYXZlIHRvIGdpdmUgMiBkaWZmZXJlbnQgdmFsdWVzIGRlcGVuZGluZyBvbiB4IHZhbHVlLiAKKyAgICAgICAqIEZvciBzbWFsbCB2YWx1ZXMgKGFicyh4KSA8IDEpIHdlIG5lZWQgYXMgbWFueSBkaWdpdHMgYXMgcmVxdWVzdGVkIGJ5IHByZWNpc2lvbiBsaW1pdGVkIGJ5IHRoZSBtYXhpbXVtIG51bWJlciBvZiBkaWdpdHMKKyAgICAgICAqIHdoaWNoIGlzIG1pbl9leHBvbmVudDEwICsgZGlnaXRzMTAgKyAyCisgICAgICAgKiBGb3IgYmlnZ2VyIHZhbHVlcyB3ZSB3b24ndCBoYXZlIG1vcmUgdGhhbiBsaW1pdHM6OmRpZ2l0czEwICsgMiBkaWdpdHMgYWZ0ZXIgZGVjaW1hbCBwb2ludC4gKi8KKyAgICAgIGludCBkaWdpdHMxMCA9ICh4ID4gLTEuMCAmJiB4IDwgMS4wID8gLWxpbWl0czo6bWluX2V4cG9uZW50MTAgKyBsaW1pdHM6OmRpZ2l0czEwICsgMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBsaW1pdHM6OmRpZ2l0czEwICsgMik7CisgICAgICBicCA9IF9TdGxfZmN2dFIoeCwgKG1pbikgKHByZWNpc2lvbiwgZGlnaXRzMTApLCAmZGVjcHQsICZzaWduLCBfU1RMUF9DVlRfQlVGRkVSKGN2dGJ1ZikgKTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgaW9zX2Jhc2U6OnNjaWVudGlmaWM6CisgIGRlZmF1bHQ6CisgICAgLyogSGVyZSwgbnVtYmVyIG9mIGRpZ2l0cyBpcyB0b3RhbCBudW1iZXIgb2YgZGlnaXRzIHdoaWNoIGlzIGxpbWl0ZWQgdG8gZGlnaXRzMTAgKyAyLiAqLworICAgIHsKKyAgICAgIGludCBkaWdpdHMxMCA9IGxpbWl0czo6ZGlnaXRzMTAgKyAyOworICAgICAgYnAgPSBfU3RsX2VjdnRSKHgsIChtaW4pIChwcmVjaXNpb24sIGRpZ2l0czEwKSwgJmRlY3B0LCAmc2lnbiwgX1NUTFBfQ1ZUX0JVRkZFUihjdnRidWYpICk7CisgICAgfQorICAgIGJyZWFrOworICB9CisgIHJldHVybiBfX2Zvcm1hdF9mbG9hdChidWYsIGJwLCBkZWNwdCwgc2lnbiwgeCA9PSAwLjAsIGZsYWdzLCBwcmVjaXNpb24pOworI2VuZGlmCit9CisKK3NpemVfdCAgX1NUTFBfQ0FMTAorX193cml0ZV9mbG9hdChfX2lvc3RyaW5nICZidWYsIGlvc19iYXNlOjpmbXRmbGFncyBmbGFncywgaW50IHByZWNpc2lvbiwKKyAgICAgICAgICAgICAgZG91YmxlIHgpIHsKKyAgcmV0dXJuIF9fd3JpdGVfZmxvYXRUKGJ1ZiwgZmxhZ3MsIHByZWNpc2lvbiwgeAorI2lmIGRlZmluZWQgKFVTRV9TUFJJTlRGX0lOU1RFQUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgMAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Cit9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTE9OR19ET1VCTEUpCitzaXplX3QgX1NUTFBfQ0FMTAorX193cml0ZV9mbG9hdChfX2lvc3RyaW5nICZidWYsIGlvc19iYXNlOjpmbXRmbGFncyBmbGFncywgaW50IHByZWNpc2lvbiwKKyAgICAgICAgICAgICAgbG9uZyBkb3VibGUgeCkgeworICByZXR1cm4gX193cml0ZV9mbG9hdFQoYnVmLCBmbGFncywgcHJlY2lzaW9uLCB4CisjaWYgZGVmaW5lZCAoVVNFX1NQUklOVEZfSU5TVEVBRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnTCcKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Cit9CisjZW5kaWYKKwordm9pZCBfU1RMUF9DQUxMIF9fZ2V0X2Zsb29yX2RpZ2l0cyhfX2lvc3RyaW5nICZvdXQsIF9TVExQX0xPTkdFU1RfRkxPQVRfVFlQRSBfX3gpIHsKKyAgdHlwZWRlZiBudW1lcmljX2xpbWl0czxfU1RMUF9MT05HRVNUX0ZMT0FUX1RZUEU+IGxpbWl0czsKKyNpZiBkZWZpbmVkIChVU0VfU1BSSU5URl9JTlNURUFEKQorICBjaGFyIGN2dGJ1ZltsaW1pdHM6Om1heF9leHBvbmVudDEwICsgNl07CisjICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTE9OR19ET1VCTEUpCisgIHNucHJpbnRmKF9TVExQX0FSUkFZX0FORF9TSVpFKGN2dGJ1ZiksICIlTGYiLCBfX3gpOyAvLyBjaGVjayBmb3IgMTIzNC41NiEKKyMgIGVsc2UKKyAgc25wcmludGYoX1NUTFBfQVJSQVlfQU5EX1NJWkUoY3Z0YnVmKSwgIiVmIiwgX194KTsgIC8vIGNoZWNrIGZvciAxMjM0LjU2IQorIyAgZW5kaWYKKyAgY2hhciAqcCA9IHN0cmNociggY3Z0YnVmLCAnLicgKTsKKyAgaWYgKCBwID09IDAgKSB7CisgICAgb3V0LmFwcGVuZCggY3Z0YnVmICk7CisgIH0gZWxzZSB7CisgICAgb3V0LmFwcGVuZCggY3Z0YnVmLCBwICk7CisgIH0KKyNlbHNlCisgIGNoYXIgY3Z0YnVmW2xpbWl0czo6bWF4X2V4cG9uZW50MTAgKyAxXTsKKyAgY2hhciAqIGJwOworICBpbnQgZGVjcHQsIHNpZ247CisgIGJwID0gX1N0bF9mY3Z0UihfX3gsIDAsICZkZWNwdCwgJnNpZ24sIF9TVExQX0NWVF9CVUZGRVIoY3Z0YnVmKSk7CisKKyAgaWYgKHNpZ24pIHsKKyAgICBvdXQgKz0gJy0nOworICB9CisgIG91dC5hcHBlbmQoYnAsIGJwICsgZGVjcHQpOworI2VuZGlmCit9CisKKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQordm9pZCBfU1RMUF9DQUxMIF9fY29udmVydF9mbG9hdF9idWZmZXIoIF9faW9zdHJpbmcgY29uc3QmIHN0ciwgX19pb3dzdHJpbmcgJm91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdHlwZTx3Y2hhcl90PiYgY3QsIHdjaGFyX3QgZG90LCBib29sIF9fY2hlY2tfZG90KSB7CisgIHN0cmluZzo6Y29uc3RfaXRlcmF0b3Igc3RyX2l0ZShzdHIuYmVnaW4oKSksIHN0cl9lbmQoc3RyLmVuZCgpKTsKKworICAvL0ZpcnN0IGxvb3AsIGNoZWNrIHRoZSBkb3QgY2hhcgorICBpZiAoX19jaGVja19kb3QpIHsKKyAgICB3aGlsZSAoc3RyX2l0ZSAhPSBzdHJfZW5kKSB7CisgICAgICBpZiAoKnN0cl9pdGUgIT0gJy4nKSB7CisgICAgICAgIG91dCArPSBjdC53aWRlbigqc3RyX2l0ZSsrKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCArPSBkb3Q7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoc3RyX2l0ZSAhPSBzdHJfZW5kKSB7CisgICAgICBvdXQgKz0gY3Qud2lkZW4oKnN0cl9pdGUpOworICAgIH0KKyAgfQorCisgIGlmIChzdHJfaXRlICE9IHN0cl9lbmQpIHsKKyAgICAvL1NlY29uZCBsb29wLCBkb3QgaGFzIGJlZW4gZm91bmQsIG5vIGNoZWNrIGFueW1vcmUKKyAgICB3aGlsZSAoKytzdHJfaXRlICE9IHN0cl9lbmQpIHsKKyAgICAgIG91dCArPSBjdC53aWRlbigqc3RyX2l0ZSk7CisgICAgfQorICB9Cit9CisKKyNlbmRpZgorCit2b2lkIF9TVExQX0NBTEwKK19fYWRqdXN0X2Zsb2F0X2J1ZmZlcihfX2lvc3RyaW5nICZzdHIsIGNoYXIgZG90KSB7CisgIGlmICgnLicgIT0gZG90KSB7CisgICAgc2l6ZV90IF9fZG90X3BvcyA9IHN0ci5maW5kKCcuJyk7CisgICAgaWYgKF9fZG90X3BvcyAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgIHN0cltfX2RvdF9wb3NdID0gZG90OworICAgIH0KKyAgfQorfQorCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKK19TVExQX0VORF9OQU1FU1BBQ0UKKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3NyYy9udW1wdW5jdC5jcHAgYi9zcmMvbnVtcHVuY3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiYWRjN2EKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbnVtcHVuY3QuY3BwCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisjaW5jbHVkZSAic3RscG9ydF9wcmVmaXguaCIKKworI2luY2x1ZGUgPGxvY2FsZT4KKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbnVtcHVuY3Q8Y2hhcj4KK2NoYXIgICBudW1wdW5jdDxjaGFyPjo6ZG9fZGVjaW1hbF9wb2ludCgpIGNvbnN0IHtyZXR1cm4gJy4nO30KK2NoYXIgICBudW1wdW5jdDxjaGFyPjo6ZG9fdGhvdXNhbmRzX3NlcCgpIGNvbnN0IHsgcmV0dXJuICcsJzsgfQorc3RyaW5nIG51bXB1bmN0PGNoYXI+Ojpkb19ncm91cGluZygpICBjb25zdCB7IHJldHVybiBzdHJpbmcoKTt9CitzdHJpbmcgbnVtcHVuY3Q8Y2hhcj46OmRvX3RydWVuYW1lKCkgIGNvbnN0IHsgcmV0dXJuICJ0cnVlIjt9CitzdHJpbmcgbnVtcHVuY3Q8Y2hhcj46OmRvX2ZhbHNlbmFtZSgpIGNvbnN0IHsgcmV0dXJuICJmYWxzZSI7IH0KK251bXB1bmN0PGNoYXI+Ojp+bnVtcHVuY3QoKSB7fQorCisjaWYgIWRlZmluZWQgKF9TVExQX05PX1dDSEFSX1QpCit3Y2hhcl90IG51bXB1bmN0PHdjaGFyX3Q+Ojpkb19kZWNpbWFsX3BvaW50KCkgY29uc3QgeyByZXR1cm4gTCcuJzsgfQord2NoYXJfdCBudW1wdW5jdDx3Y2hhcl90Pjo6ZG9fdGhvdXNhbmRzX3NlcCgpIGNvbnN0IHsgcmV0dXJuIEwnLCc7IH0KK3N0cmluZyBudW1wdW5jdDx3Y2hhcl90Pjo6ZG9fZ3JvdXBpbmcoKSAgIGNvbnN0IHsgcmV0dXJuIHN0cmluZygpOyB9Cit3c3RyaW5nIG51bXB1bmN0PHdjaGFyX3Q+Ojpkb190cnVlbmFtZSgpICBjb25zdCB7IHJldHVybiBMInRydWUiOyB9Cit3c3RyaW5nIG51bXB1bmN0PHdjaGFyX3Q+Ojpkb19mYWxzZW5hbWUoKSBjb25zdCB7IHJldHVybiBMImZhbHNlIjsgfQorbnVtcHVuY3Q8d2NoYXJfdD46On5udW1wdW5jdCgpIHt9CisjZW5kaWYKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3JjL29zdHJlYW0uY3BwIGIvc3JjL29zdHJlYW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ZDQ3MzcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvb3N0cmVhbS5jcHAKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKyNpbmNsdWRlICJzdGxwb3J0X3ByZWZpeC5oIgorCisjaW5jbHVkZSA8b3N0cmVhbT4KKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKKyNpZiAhZGVmaW5lZChfU1RMUF9OT19GT1JDRV9JTlNUQU5USUFURSkKKworLy8gaW5zdGFudGlhdGlvbnMKK3RlbXBsYXRlIGNsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIGJhc2ljX29zdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPjsKKworIyBpZiBkZWZpbmVkIChfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUKQordGVtcGxhdGUgIGNsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIF9Pc2VudHJ5PGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID47CisjIGVuZGlmCisKKyNpZm5kZWYgX1NUTFBfTk9fV0NIQVJfVAorCisjIGlmIGRlZmluZWQgKF9TVExQX1VTRV9URU1QTEFURV9FWFBPUlQpCit0ZW1wbGF0ZSBjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBfT3NlbnRyeTx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+OworIyBlbmRpZgordGVtcGxhdGUgY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgYmFzaWNfb3N0cmVhbTx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+OworI2VuZGlmCisKKyNlbmRpZgorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zcmMvc3BhcmNfYXRvbWljLnMgYi9zcmMvc3BhcmNfYXRvbWljLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdlNDFkNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zcGFyY19hdG9taWMucwpAQCAtMCwwICsxLDY4IEBACisgICAgICAgIC5zZWN0aW9uICAgICAgICAiLnRleHQiLCNhbGxvYywjZXhlY2luc3RyCisgICAgICAgICAgLmFsaWduIDgKKyAgICAgICAgICAuc2tpcCAxNgorCisKKyAgLyoKKyAgKiogIGludCBfU1RMUF9hdG9taWNfZXhjaGFuZ2UgKHZvaWQgKnB2YWx1ZSwgaW50IHZhbHVlKQorICAqLworCisgICAgICAgICAgLnR5cGUgICBfU1RMUF9hdG9taWNfZXhjaGFuZ2UsI2Z1bmN0aW9uCisgICAgICAgICAgLmdsb2JhbCBfU1RMUF9hdG9taWNfZXhjaGFuZ2UKKyAgICAgICAgICAuYWxpZ24gIDgKKworX1NUTFBfYXRvbWljX2V4Y2hhbmdlOgorMDoKKyAgICAgICAgICBsZCAgICAgIFslbzBdLCAlbzIgICAgICAgICAgICAgICEgU2V0IHRoZSBjdXJyZW50IHZhbHVlCisgICAgICAgICAgbW92ICAgICAlbzEsICVvMyAgICAgICAgICAgICAgICAhIFNldCB0aGUgbmV3IHZhbHVlCishICAgICAgICAgIHN3YXAgICAgIFslbzBdLCAlbzMgICAgICAgICAgICAgISBEbyB0aGUgY29tcGFyZSBhbmQgc3dhcAorICAgICAgICAgIGNhcyAgICAgWyVvMF0sICVvMiwgJW8zCisgICAgICAgICAgY21wICAgICAlbzIsICVvMyAgICAgICAgICAgICAgICAhIENoZWNrIHdoZXRoZXIgc3VjY2Vzc2Z1bAorICAgICAgICAgIGJuZSAgICAgMGIgICAgICAgICAgICAgICAgICAgICAgISBSZXRyeSB1cG9uIGZhaWx1cmUKKyAgICAgICAgICBzdGJhcgorICAgICAgICAgIG1vdiAgICAgJW8yLCAlbzAgICAgICAgICAgICAgICAgISBTZXQgdGhlIG5ldyB2YWx1ZQorICAgICAgICAgIHJldGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgISByZXR1cm4KKyAgICAgICAgICBub3AKKyAgICAgICAgICAuc2l6ZSAgIF9TVExQX2F0b21pY19leGNoYW5nZSwoLi1fU1RMUF9hdG9taWNfZXhjaGFuZ2UpCisKKyAgLyogaW50IF9TVExQX2F0b21pY19pbmNyZW1lbnQgKHZvaWQgKnB2YWx1ZSkgKi8KKworICAgICAgICAgIC50eXBlICAgX1NUTFBfYXRvbWljX2luY3JlbWVudCwjZnVuY3Rpb24KKyAgICAgICAgICAuZ2xvYmFsIF9TVExQX2F0b21pY19pbmNyZW1lbnQKKyAgICAgICAgICAuYWxpZ24gIDgKK19TVExQX2F0b21pY19pbmNyZW1lbnQ6CisxOgorICAgICAgICAgIGxkICAgICAgWyVvMF0sICVvMiAgICAgICAgICAgICAgISBzZXQgdGhlIGN1cnJlbnQKKyAgICAgICAgICBhZGQgICAgICAgICAgICAgJW8yLCAweDEsICVvMyAgICAgICAgICAgICAgICAgICAhIEluY3JlbWVudCBhbmQgc3RvcmUgY3VycmVudAorISAgICAgICAgICBzd2FwICAgICBbJW8wXSwgJW8zICAgICAgICAgISBEbyB0aGUgY29tcGFyZSBhbmQgc3dhcAorICAgICAgICAgIGNhcyAgICAgWyVvMF0sICVvMiwgJW8zCisgICAgICAgICAgY21wICAgICAlbzMsICVvMiAgICAgICAgICAgICAgICAhIENoZWNrIHdoZXRoZXIgc3VjY2Vzc2Z1bAorICAgICAgICAgIGJuZSAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgUmV0cnkgaWYgd2UgZmFpbGVkLgorICAgICAgICAgIG1lbWJhciAgI0xvYWRMb2FkIHwgI0xvYWRTdG9yZSAgISBFbnN1cmUgdGhlIGNhcyBmaW5pc2hlcyBiZWZvcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgcmV0dXJuaW5nCisgICAgICAgICAgbm9wCisgICAgICAgICAgcmV0bCAgICAgICAgICAgICAgICAgICAgICAgICAgICAhIHJldHVybgorICAgICAgICAgIG5vcAorCisgICAgICAgICAgLnNpemUgICBfU1RMUF9hdG9taWNfaW5jcmVtZW50LCguLV9TVExQX2F0b21pY19pbmNyZW1lbnQpCisKKworICAvKiBpbnQgX1NUTFBfYXRvbWljX2RlY3JlbWVudCAodm9pZCAqcHZhbHVlKSAqLworICAgICAgICAgIC50eXBlICAgX1NUTFBfYXRvbWljX2RlY3JlbWVudCwjZnVuY3Rpb24KKyAgICAgICAgICAuZ2xvYmFsIF9TVExQX2F0b21pY19kZWNyZW1lbnQKKyAgICAgICAgICAuYWxpZ24gIDgKKworX1NUTFBfYXRvbWljX2RlY3JlbWVudDoKKzI6CisgICAgICAgICAgbGQgICAgICBbJW8wXSwgJW8yICAgICAgICAgICAgICAhIHNldCB0aGUgY3VycmVudAorICAgICAgICAgIHN1YiAgICAgJW8yLCAweDEsICVvMyAgICAgICAgICAgICAgICAgICAhIGRlY3JlbWVudCBhbmQgc3RvcmUgY3VycmVudAorISAgICAgICAgICBzd2FwICAgIFslbzBdLCAlbzMgICAgICAgICAhIERvIHRoZSBjb21wYXJlIGFuZCBzd2FwCisgICAgICAgICAgY2FzICAgICBbJW8wXSwgJW8yLCAlbzMKKyAgICAgICAgICBjbXAgICAgICVvMywgJW8yICAgICAgICAgICAgICAgICEgQ2hlY2sgd2hldGhlciBzdWNjZXNzZnVsCisgICAgICAgICAgYm5lICAgICAyYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgISBSZXRyeSBpZiB3ZSBmYWlsZWQuCisgICAgICAgICAgbWVtYmFyICAjTG9hZExvYWQgfCAjTG9hZFN0b3JlICAhIEVuc3VyZSB0aGUgY2FzIGZpbmlzaGVzIGJlZm9yZQorICAgICAgICAgIG5vcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgISByZXR1cm5pbmcKKyAgICAgICAgICByZXRsICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgcmV0dXJuCisgICAgICAgICAgbm9wCisgICAgICAgICAgLnNpemUgICBfU1RMUF9hdG9taWNfZGVjcmVtZW50LCguLV9TVExQX2F0b21pY19kZWNyZW1lbnQpCmRpZmYgLS1naXQgYS9zcmMvc3BhcmNfYXRvbWljNjQucyBiL3NyYy9zcGFyY19hdG9taWM2NC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMmM0MmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3BhcmNfYXRvbWljNjQucwpAQCAtMCwwICsxLDY1IEBACisgICAgICAgIC5zZWN0aW9uICAgICAgICAiLnRleHQiLCNhbGxvYywjZXhlY2luc3RyCisgICAgICAgIC5hbGlnbiA4CisgICAgICAgIC5za2lwIDE2CisKKyEgIGludCBfU1RMUF9hdG9taWNfZXhjaGFuZ2UgKHZvaWQgKnB2YWx1ZSwgaW50IHZhbHVlKQorIQorCisgICAgICAgIC50eXBlICAgX1NUTFBfYXRvbWljX2V4Y2hhbmdlLCNmdW5jdGlvbgorICAgICAgICAuZ2xvYmFsIF9TVExQX2F0b21pY19leGNoYW5nZQorICAgICAgICAuYWxpZ24gIDgKKworX1NUTFBfYXRvbWljX2V4Y2hhbmdlOgorMToKKyAgbGR4ICAgICAgWyVvMF0sICVvMiAgICAgICAgICAgICAgISBTZXQgdGhlIGN1cnJlbnQgdmFsdWUKKyAgICAgICAgbW92ICAgICAgJW8xLCAlbzMgICAgICAgICAgICAgICAgISBTZXQgdGhlIG5ldyB2YWx1ZQorICAgICAgICBjYXN4ICAgICBbJW8wXSwgJW8yLCAlbzMgICAgICAgICAhIERvIHRoZSBjb21wYXJlIGFuZCBzd2FwCisgICAgICAgIGNtcCAgICAgICVvMiwgJW8zICAgICAgICAgICAgICAgICEgQ2hlY2sgd2hldGhlciBzdWNjZXNzZnVsCisgICAgICAgIGJuZSAgICAgIDFiICAgICAgICAgICAgICAgICAgISBSZXRyeSB1cG9uIGZhaWx1cmUKKyAgICAgICAgbWVtYmFyICAjTG9hZExvYWQgfCAjTG9hZFN0b3JlICAhIEVuc3VyZSB0aGUgY2FzIGZpbmlzaGVzIGJlZm9yZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgcmV0dXJuaW5nCisgICAgICAgIHJldGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgISByZXR1cm4KKyAgICAgICAgbW92ICAgICAlbzIsICVvMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgISBTZXQgdGhlIG5ldyB2YWx1ZQorICAgICAgICAuc2l6ZSAgIF9TVExQX2F0b21pY19leGNoYW5nZSwoLi1fU1RMUF9hdG9taWNfZXhjaGFuZ2UpCisKKworISBpbnQgX1NUTFBfYXRvbWljX2luY3JlbWVudCAodm9pZCAqcHZhbHVlKQorCisgICAgICAgIC50eXBlICAgX1NUTFBfYXRvbWljX2luY3JlbWVudCwjZnVuY3Rpb24KKyAgICAgICAgLmdsb2JhbCBfU1RMUF9hdG9taWNfaW5jcmVtZW50CisgICAgICAgIC5hbGlnbiAgOAorX1NUTFBfYXRvbWljX2luY3JlbWVudDoKKzA6CisgICAgICAgIGxkeCAgICAgIFslbzBdLCAlbzIgICAgICAgICAgICAgICEgc2V0IHRoZSBjdXJyZW50CisgICAgICAgIGFkZHggICAgICVvMiwgMHgxLCAlbzMgICAgICAgICAgICAgICAgICAgISBJbmNyZW1lbnQgYW5kIHN0b3JlIGN1cnJlbnQKKyAgICAgICAgY2FzeCAgICAgWyVvMF0sICVvMiwgJW8zICAgICAgICAgISBEbyB0aGUgY29tcGFyZSBhbmQgc3dhcAorICAgICAgICBjbXAgICAgICVvMywgJW8yICAgICAgICAgICAgICAgICEgQ2hlY2sgd2hldGhlciBzdWNjZXNzZnVsCisgICAgICAgIGJuZSAgICAgMGIKKyAgICAgICAgbWVtYmFyICAjTG9hZExvYWQgfCAjTG9hZFN0b3JlICAhIEVuc3VyZSB0aGUgY2FzIGZpbmlzaGVzIGJlZm9yZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgcmV0dXJuaW5nCisgICAgICAgIHJldGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgISByZXR1cm4KKyAgICAgICAgbW92ICAgICVvMSwgJW8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgISBTZXQgdGhlIHJldHVybiB2YWx1ZQorCisgICAgICAgIC5zaXplICAgX1NUTFBfYXRvbWljX2luY3JlbWVudCwoLi1fU1RMUF9hdG9taWNfaW5jcmVtZW50KQorCisKKyEgICAgICAgIC8qIGludCBfU1RMUF9hdG9taWNfZGVjcmVtZW50ICh2b2lkICpwdmFsdWUpICovCisgICAgICAgIC50eXBlICAgX1NUTFBfYXRvbWljX2RlY3JlbWVudCwjZnVuY3Rpb24KKyAgICAgICAgLmdsb2JhbCBfU1RMUF9hdG9taWNfZGVjcmVtZW50CisgICAgICAgIC5hbGlnbiAgOAorCitfU1RMUF9hdG9taWNfZGVjcmVtZW50OgorMDoKKyAgICAgICAgbGR4ICAgICAgWyVvMF0sICVvMiAgICAgICAgICAgICAgISBzZXQgdGhlIGN1cnJlbnQKKyAgICAgICAgc3VieCAgICAgICAgICAgICAlbzIsIDB4MSwgJW8zICAgICAgICAgICAgICAgICAgICEgZGVjcmVtZW50IGFuZCBzdG9yZSBjdXJyZW50CisgICAgICAgIGNhc3ggICAgIFslbzBdLCAlbzIsICVvMyAgICAgICAgICEgRG8gdGhlIGNvbXBhcmUgYW5kIHN3YXAKKyAgICAgICAgY21wICAgICAlbzMsICVvMiAgICAgICAgICAgICAgICAhIENoZWNrIHdoZXRoZXIgc3VjY2Vzc2Z1bAorICAgICAgICBibmUgICAgIDBiCisgICAgICAgIG1lbWJhciAgI0xvYWRMb2FkIHwgI0xvYWRTdG9yZSAgISBFbnN1cmUgdGhlIGNhcyBmaW5pc2hlcyBiZWZvcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhIHJldHVybmluZworICAgICAgICByZXRsICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgcmV0dXJuCisgIG5vcAorICAgICAgICAuc2l6ZSAgIF9TVExQX2F0b21pY19kZWNyZW1lbnQsKC4tX1NUTFBfYXRvbWljX2RlY3JlbWVudCkKKworCisKZGlmZiAtLWdpdCBhL3NyYy9zc3RyZWFtLmNwcCBiL3NyYy9zc3RyZWFtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDFkNjUyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3NzdHJlYW0uY3BwCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisjaW5jbHVkZSAic3RscG9ydF9wcmVmaXguaCIKKworI2luY2x1ZGUgPHNzdHJlYW0+CisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisjaWYgIWRlZmluZWQgKF9TVExQX05PX0ZPUkNFX0lOU1RBTlRJQVRFKQorCisvLyBGb3JjZSBpbnN0YW50aWF0aW9uIG9mIHN0cmluZ3N0cmVhbSBjbGFzc2VzLgordGVtcGxhdGUgY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgYmFzaWNfc3RyaW5nYnVmPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+LCBhbGxvY2F0b3I8Y2hhcj4gPjsKK3RlbXBsYXRlIGNsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIGJhc2ljX29zdHJpbmdzdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4sIGFsbG9jYXRvcjxjaGFyPiA+OwordGVtcGxhdGUgY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgYmFzaWNfaXN0cmluZ3N0cmVhbTxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiwgYWxsb2NhdG9yPGNoYXI+ID47Cit0ZW1wbGF0ZSBjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBiYXNpY19zdHJpbmdzdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4sIGFsbG9jYXRvcjxjaGFyPiA+OworCisjICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkKK3RlbXBsYXRlIGNsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIGJhc2ljX3N0cmluZ2J1Zjx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiwgYWxsb2NhdG9yPHdjaGFyX3Q+ID47Cit0ZW1wbGF0ZSBjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBiYXNpY19vc3RyaW5nc3RyZWFtPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+LCBhbGxvY2F0b3I8d2NoYXJfdD4gPjsKK3RlbXBsYXRlIGNsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIGJhc2ljX2lzdHJpbmdzdHJlYW08d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4sIGFsbG9jYXRvcjx3Y2hhcl90PiA+OwordGVtcGxhdGUgY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgYmFzaWNfc3RyaW5nc3RyZWFtPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+LCBhbGxvY2F0b3I8d2NoYXJfdD4gPjsKKyMgIGVuZGlmCisKKyNlbmRpZgorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zcmMvc3RkaW9fc3RyZWFtYnVmLmNwcCBiL3NyYy9zdGRpb19zdHJlYW1idWYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1YWFkNzkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RkaW9fc3RyZWFtYnVmLmNwcApAQCAtMCwwICsxLDIzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2luY2x1ZGUgInN0bHBvcnRfcHJlZml4LmgiCisjaW5jbHVkZSAic3RkaW9fc3RyZWFtYnVmLmgiCisKKyNpZmRlZiBfU1RMUF9VTklYCisjICBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyMgIGluY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8bGltaXRzPgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKworLy8gQ29tcGFyZSB3aXRoIHN0cmVhbW9mZiBkZWZpbml0aW9uIGluIHN0bC9jaGFyX3RyYWl0cy5oIQorCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX0RFRkFVTFRfRklMRV9PRkZTRVQpIHx8IFwKKyAgICAoIWRlZmluZWQoX0xBUkdFRklMRV9TT1VSQ0UpICYmICFkZWZpbmVkKF9MQVJHRUZJTEU2NF9TT1VSQ0UpKQorIyAgaWYgIWRlZmluZWQgKF9TVExQX01TVkMpIHx8IChfU1RMUF9NU1ZDIDwgMTQwMCkgfHwgZGVmaW5lZChfU1RMUF9XQ0UpCisjICAgIGRlZmluZSBGU0VFSyBmc2VlaworIyAgZWxzZQorIyAgICBkZWZpbmUgRlNFRUsgX2ZzZWVraTY0CisjICBlbmRpZgorIyAgZGVmaW5lIEZTRVRQT1MgIGZzZXRwb3MKKyMgIGRlZmluZSBGR0VUUE9TICBmZ2V0cG9zCisjICBkZWZpbmUgRlBPU19UICAgZnBvc190CisjZWxzZQorIyAgZGVmaW5lIEZTRUVLIGZzZWVrbzY0CisjICBkZWZpbmUgRlNFVFBPUyAgZnNldHBvczY0CisjICBkZWZpbmUgRkdFVFBPUyAgZmdldHBvczY0CisjICBkZWZpbmUgRlBPU19UICAgZnBvczY0X3QKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENsYXNzIHN0ZGlvX3N0cmVhbWJ1Zl9iYXNlCisKK3N0ZGlvX3N0cmVhbWJ1Zl9iYXNlOjpzdGRpb19zdHJlYW1idWZfYmFzZShGSUxFKiBmaWxlKQorICAgIDogLyogX1NUTFBfU1REOjpGSUxFX2Jhc2ljX3N0cmVhbWJ1ZihmaWxlLCAwKSwgKi8KKyAgICBfTV9maWxlKGZpbGUpCit7fQorCitzdGRpb19zdHJlYW1idWZfYmFzZTo6fnN0ZGlvX3N0cmVhbWJ1Zl9iYXNlKCkgeworICBfU1RMUF9WRU5ET1JfQ1NURDo6ZmZsdXNoKF9NX2ZpbGUpOworfQorCitfU1RMUF9TVEQ6OnN0cmVhbWJ1Ziogc3RkaW9fc3RyZWFtYnVmX2Jhc2U6OnNldGJ1ZihjaGFyKiBzLCBzdHJlYW1zaXplIG4pIHsKKyNpZmRlZiBfU1RMUF9XQ0UKKyAgLy8gbm8gYnVmZmVyaW5nIGluIHdpbmRvd3MgY2UgLk5FVAorI2Vsc2UKKyAgc2l6ZV90IF9fbl9zaXplX3QgPSAoc2l6ZW9mKHN0cmVhbXNpemUpID4gc2l6ZW9mKHNpemVfdCkpID8gX19TVEFUSUNfQ0FTVChzaXplX3QsIChtaW4pKF9fU1RBVElDX0NBU1Qoc3RyZWFtc2l6ZSwgKG51bWVyaWNfbGltaXRzPHNpemVfdD46Om1heCkoKSksIG4pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfX1NUQVRJQ19DQVNUKHNpemVfdCwgbik7CisgIF9TVExQX1ZFTkRPUl9DU1REOjpzZXR2YnVmKF9NX2ZpbGUsIHMsIChzID09IDAgJiYgbiA9PSAwKSA/IF9JT05CRiA6IF9JT0ZCRiwgX19uX3NpemVfdCk7CisjZW5kaWYKKyAgcmV0dXJuIHRoaXM7Cit9CisKK3N0ZGlvX3N0cmVhbWJ1Zl9iYXNlOjpwb3NfdHlwZQorc3RkaW9fc3RyZWFtYnVmX2Jhc2U6OnNlZWtvZmYob2ZmX3R5cGUgb2ZmLCBpb3NfYmFzZTo6c2Vla2RpciBkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6b3Blbm1vZGUgLyogbW9kZSAqLykgeworICBpbnQgd2hlbmNlOworICBzd2l0Y2ggKGRpcikgeworICBjYXNlIGlvc19iYXNlOjpiZWc6CisgICAgd2hlbmNlID0gU0VFS19TRVQ7CisgICAgYnJlYWs7CisgIGNhc2UgaW9zX2Jhc2U6OmN1cjoKKyAgICB3aGVuY2UgPSBTRUVLX0NVUjsKKyAgICBicmVhazsKKyAgY2FzZSBpb3NfYmFzZTo6ZW5kOgorICAgIHdoZW5jZSA9IFNFRUtfRU5EOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIHJldHVybiBwb3NfdHlwZSgtMSk7CisgIH0KKworICBpZiAob2ZmIDw9IG51bWVyaWNfbGltaXRzPG9mZl90eXBlPjo6bWF4KCkgJiYgRlNFRUsoX01fZmlsZSwgb2ZmLCB3aGVuY2UpID09IDApIHsKKyAgICBGUE9TX1QgcG9zOworICAgIEZHRVRQT1MoX01fZmlsZSwgJnBvcyk7CisgICAgLy8gYWRkZWQgMjEganVuZSAwMCBtZGIscmpmLHdqczogZ2xpYmMgMi4yIGNoYW5nZWQgZnBvc190IHRvIGJlIGEgc3RydWN0IGluc3RlYWQKKyAgICAvLyBvZiBhIHByaW1pdGl2ZSB0eXBlCisjaWYgKGRlZmluZWQgKF9fR0xJQkNfXykgJiYgKChfX0dMSUJDX18gPiAyKSB8fCAoKF9fR0xJQkNfXyA9PSAyKSAmJiAoX19HTElCQ19NSU5PUl9fID49IDIpKSkpCisgICAgcmV0dXJuIHBvc190eXBlKChzdHJlYW1vZmYpcG9zLl9fcG9zKTsKKyNlbGlmIGRlZmluZWQgKF9fSVNDUFBfXykgfHwgZGVmaW5lZCAoX19NVlNfXykgfHwgZGVmaW5lZCAoX19PUzQwMF9fKQorICAgIHJldHVybiBwb3NfdHlwZShwb3MuX19mcG9zX2VsZW1bIDAgXSk7CisjZWxpZiBkZWZpbmVkIChfX0VNWF9fKQorICAgIHJldHVybiBwb3NfdHlwZSgoc3RyZWFtb2ZmKXBvcy5fcG9zKTsKKyNlbHNlCisgICAgcmV0dXJuIHBvc190eXBlKHBvcyk7CisjZW5kaWYKKyAgfQorICBlbHNlCisgICAgcmV0dXJuIHBvc190eXBlKC0xKTsKK30KKworCitzdGRpb19zdHJlYW1idWZfYmFzZTo6cG9zX3R5cGUKK3N0ZGlvX3N0cmVhbWJ1Zl9iYXNlOjpzZWVrcG9zKHBvc190eXBlIHBvcywgaW9zX2Jhc2U6Om9wZW5tb2RlIC8qIG1vZGUgKi8pIHsKKyAgLy8gYWRkZWQgMjEganVuZSAwMCBtZGIscmpmLHdqczogZ2xpYmMgMi4yIGNoYW5nZWQgZnBvc190IHRvIGJlIGEgc3RydWN0IGluc3RlYWQKKyAgLy8gb2YgYSBwcmltaXRpdmUgdHlwZQorI2lmIChkZWZpbmVkKF9fR0xJQkNfXykgJiYgKCAoX19HTElCQ19fID4gMikgfHwgKCAoX19HTElCQ19fID09IDIpICYmIChfX0dMSUJDX01JTk9SX18gPj0gMikgKSApICkKKyAgRlBPU19UIHA7CisgIHAuX19wb3MgPSBwb3M7CisjICBpZmRlZiBfU1RMUF9VU0VfVUNMSUJDCisjICAgIGlmZGVmIF9fU1RESU9fTUJTVEFURQorICBtZW1zZXQoICYocC5fX21ic3RhdGUpLCAwLCBzaXplb2YocC5fX21ic3RhdGUpICk7CisjICAgIGVuZGlmCisjICAgIGlmZGVmIF9fU1RESU9fV0lERQorICBwLm1ibGVuX3BlbmRpbmcgPSAwOworIyAgICBlbmRpZgorIyAgZWxzZQorICBtZW1zZXQoICYocC5fX3N0YXRlKSwgMCwgc2l6ZW9mKHAuX19zdGF0ZSkgKTsKKyMgIGVuZGlmCisjZWxpZiBkZWZpbmVkIChfX01WU19fKSB8fCBkZWZpbmVkIChfX09TNDAwX18pCisgIEZQT1NfVCBwOworICBwLl9fZnBvc19lbGVtWzBdID0gcG9zOworI2VsaWYgZGVmaW5lZCAoX19FTVhfXykKKyAgRlBPU19UIHA7CisgIHAuX3BvcyA9IHBvczsKKyAgbWVtc2V0KCAmKHAuX21ic3RhdGUpLCAwLCBzaXplb2YocC5fbWJzdGF0ZSkgKTsKKyNlbHNlCisgIEZQT1NfVCBwKHBvcyk7CisjZW5kaWYKKworICByZXR1cm4gRlNFVFBPUyhfTV9maWxlLCAmcCkgPT0gMCA/IHBvcyA6IHBvc190eXBlKC0xKTsKK30KKworaW50IHN0ZGlvX3N0cmVhbWJ1Zl9iYXNlOjpzeW5jKCkgeworICByZXR1cm4gX1NUTFBfVkVORE9SX0NTVEQ6OmZmbHVzaChfTV9maWxlKSA9PSAwID8gMCA6IC0xOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENsYXNzIHN0ZGlvX2lzdHJlYW1idWYKKworc3RkaW9faXN0cmVhbWJ1Zjo6fnN0ZGlvX2lzdHJlYW1idWYoKSB7fQorCitzdHJlYW1zaXplIHN0ZGlvX2lzdHJlYW1idWY6OnNob3dtYW55YygpCit7IHJldHVybiAwOyB9CisKK3N0ZGlvX2lzdHJlYW1idWY6OmludF90eXBlIHN0ZGlvX2lzdHJlYW1idWY6OnVuZGVyZmxvdygpCit7CisjaWZkZWYgX1NUTFBfV0NFCisgIGludCBjID0gZmdldGMoX01fZmlsZSk7CisjZWxzZQorICBpbnQgYyA9IGdldGMoX01fZmlsZSk7CisjZW5kaWYKKyAgaWYgKGMgIT0gRU9GKSB7CisgICAgX1NUTFBfVkVORE9SX0NTVEQ6OnVuZ2V0YyhjLCBfTV9maWxlKTsKKyAgICByZXR1cm4gYzsKKyAgfQorICBlbHNlCisgICAgcmV0dXJuIHRyYWl0c190eXBlOjplb2YoKTsKK30KKworc3RkaW9faXN0cmVhbWJ1Zjo6aW50X3R5cGUgc3RkaW9faXN0cmVhbWJ1Zjo6dWZsb3coKSB7CisjaWZkZWYgX1NUTFBfV0NFCisgIGludCBjID0gZmdldGMoX01fZmlsZSk7CisjZWxzZQorICBpbnQgYyA9IGdldGMoX01fZmlsZSk7CisjZW5kaWYKKyAgcmV0dXJuIGMgIT0gRU9GID8gYyA6IHRyYWl0c190eXBlOjplb2YoKTsKK30KKworc3RkaW9faXN0cmVhbWJ1Zjo6aW50X3R5cGUgc3RkaW9faXN0cmVhbWJ1Zjo6cGJhY2tmYWlsKGludF90eXBlIGMpIHsKKyAgaWYgKGMgIT0gdHJhaXRzX3R5cGU6OmVvZigpKSB7CisgICAgaW50IHJlc3VsdCA9IF9TVExQX1ZFTkRPUl9DU1REOjp1bmdldGMoYywgX01fZmlsZSk7CisgICAgcmV0dXJuIHJlc3VsdCAhPSBFT0YgPyByZXN1bHQgOiB0cmFpdHNfdHlwZTo6ZW9mKCk7CisgIH0KKyAgZWxzZXsKKyAgICBpZiAodGhpcy0+ZWJhY2soKSA8IHRoaXMtPmdwdHIoKSkgeworICAgICAgdGhpcy0+Z2J1bXAoLTEpOworICAgICAgcmV0dXJuIHRyYWl0c190eXBlOjpub3RfZW9mKGMpOworICAgIH0KKyAgICBlbHNlCisgICAgICByZXR1cm4gdHJhaXRzX3R5cGU6OmVvZigpOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ2xhc3Mgc3RkaW9fb3N0cmVhbWJ1ZgorCitzdGRpb19vc3RyZWFtYnVmOjp+c3RkaW9fb3N0cmVhbWJ1ZigpIHt9CisKK3N0cmVhbXNpemUgc3RkaW9fb3N0cmVhbWJ1Zjo6c2hvd21hbnljKCkKK3sgcmV0dXJuIC0xOyB9CisKK3N0ZGlvX29zdHJlYW1idWY6OmludF90eXBlIHN0ZGlvX29zdHJlYW1idWY6Om92ZXJmbG93KGludF90eXBlIGMpIHsKKyAgLy8gV3JpdGUgdGhlIGV4aXN0aW5nIGJ1ZmZlciwgd2l0aG91dCB3cml0aW5nIGFueSBhZGRpdGlvbmFsIGNoYXJhY3Rlci4KKyAgaWYgKGMgPT0gdHJhaXRzX3R5cGU6OmVvZigpKSB7CisgICAgLy8gRG8gd2UgaGF2ZSBhIGJ1ZmZlciB0byB3cml0ZT8KKyAgICBwdHJkaWZmX3QgdW53cml0dGVuID0gdGhpcy0+cHB0cigpIC0gdGhpcy0+cGJhc2UoKTsKKyAgICBpZiAodW53cml0dGVuICE9IDApIHsKKyAgICAgIF9TVExQX1ZFTkRPUl9DU1REOjpmZmx1c2goX01fZmlsZSk7CisgICAgICAvLyBUZXN0IGlmIHRoZSB3cml0ZSBzdWNjZWVkZWQuCisgICAgICBpZiAodGhpcy0+cHB0cigpIC0gdGhpcy0+cGJhc2UoKSA8IHVud3JpdHRlbikKKyAgICAgICAgcmV0dXJuIHRyYWl0c190eXBlOjpub3RfZW9mKGMpOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gdHJhaXRzX3R5cGU6OmVvZigpOworICAgIH0KKworICAgIC8vIFdlIGFsd2F5cyBzdWNjZWVkIGlmIHdlIGRvbid0IGhhdmUgdG8gZG8gYW55dGhpbmcuCisgICAgZWxzZQorICAgICAgcmV0dXJuIHRyYWl0c190eXBlOjpub3RfZW9mKGMpOworICB9CisKKyAgLy8gV3JpdGUgdGhlIGNoYXJhY3RlciBjLCBhbmQgd2hhdGV2ZXIgZWxzZSBtaWdodCBiZSBpbiB0aGUgYnVmZmVyLgorICBlbHNlIHsKKyNpZmRlZiBfU1RMUF9XQ0UKKyAgICBpbnQgcmVzdWx0ID0gZnB1dGMoYywgX01fZmlsZSk7CisjZWxzZQorICAgIGludCByZXN1bHQgPSBwdXRjKGMsIF9NX2ZpbGUpOworI2VuZGlmCisgICAgcmV0dXJuIHJlc3VsdCAhPSBFT0YgPyByZXN1bHQgOiB0cmFpdHNfdHlwZTo6ZW9mKCk7CisgIH0KK30KKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CisKZGlmZiAtLWdpdCBhL3NyYy9zdGRpb19zdHJlYW1idWYuaCBiL3NyYy9zdGRpb19zdHJlYW1idWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzc0N2I1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3N0ZGlvX3N0cmVhbWJ1Zi5oCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisvLyBUaGlzIGhlYWRlciBkZWZpbmVzIHR3byBzdHJlYW1idWZzOgorLy8gc3RkaW9faXN0cmVhbWJ1ZiwgYSByZWFkLW9ubHkgc3RyZWFtYnVmIHN5bmNocm9uaXplZCB3aXRoIGEgQyBzdGRpbworLy8gRklMRSBvYmplY3QKKy8vIHN0ZGlvX29zdHJlYW1idWYsIGEgd3JpdGUtb25seSBzdHJlYW1idWYgc3luY2hyb25pemVkIHdpdGggYSBDIHN0ZGlvCisvLyBGSUxFIG9iamVjdC4KKy8vIE5vdGUgdGhhdCBuZWl0aGVyIHN0ZGlvX2lzdHJlYW1idWYgbm9yIHN0ZGlvX29zdHJlYW1idWYgaXMgYSB0ZW1wbGF0ZTsKKy8vIGJvdGggY2xhc3NlcyBhcmUgZGVyaXZlZCBmcm9tIGJhc2ljX3N0cmVhbWJ1ZjxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+LgorCisvLyBOb3RlOiB0aGUgaW1idWUoKSBtZW1iZXIgZnVuY3Rpb24gaXMgYSBuby1vcC4gIEluIHBhcnRpY3VsYXIsIHRoZXNlCisvLyBjbGFzc2VzIGFzc3VtZSB0aGF0IGNvZGVjdnQ8Y2hhciwgY2hhciwgbWJzdGF0ZV90PiBpcyBhbHdheXMgYW4gaWRlbnRpdHkKKy8vIHRyYW5zZm9ybWF0aW9uLiAgVGhpcyBpcyB0cnVlIG9mIHRoZSBkZWZhdWx0IGxvY2FsZSwgYW5kIG9mIGFsbCBsb2NhbGVzCisvLyBkZWZpbmVkIGZvciB0aGUgQyBJL08gbGlicmFyeS4gIElmIHlvdSBuZWVkIHRvIHVzZSBhIGxvY2FsZSB3aGVyZQorLy8gdGhlIGNvZGVjdnQ8Y2hhciwgY2hhciwgbWJzdGF0ZV90PiBmYWNldCBwZXJmb3JtcyBhIG5vbnRyaXZpYWwKKy8vIGNvbnZlcnNpb24sIHRoZW4geW91IHNob3VsZCB1c2UgYmFzaWNfZmlsZWJ1Zjw+IGluc3RlYWQgb2Ygc3RkaW9faXN0cmVhbWJ1ZgorLy8gb3Igc3RkaW9fb3N0cmVhbWJ1Zi4gIChJZiB5b3UgZG9uJ3QgdW5kZXJzdGFuZCB3aGF0IGFueSBvZiB0aGlzIG1lYW5zLAorLy8gdGhlbiBpdCdzIG5vdCBhIGZlYXR1cmUgeW91IG5lZWQgdG8gd29ycnkgYWJvdXQuICBMb2NhbGVzIHdoZXJlCisvLyBjb2RlY3Z0PGNoYXIsIGNoYXIsIG1ic3RhdGVfdD4gZG9lcyBzb21ldGhpbmcgbm9udHJpdmlhbCBhcmUgYSByYXJlCisvLyBjb3JuZXIgY2FzZS4pCisKKworI2lmbmRlZiBfU1RMUF9TVERJT19TVFJFQU1CVUYKKyNkZWZpbmUgX1NUTFBfU1RESU9fU1RSRUFNQlVGCisKKyNpbmNsdWRlIDxzdHJlYW1idWY+CisjaW5jbHVkZSA8Y3N0ZGlvPiAgICAgICAgICAgICAgLy8gRm9yIEZJTEUuCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCisvLyBCYXNlIGNsYXNzIGZvciBmZWF0dXJlcyBjb21tb24gdG8gc3RkaW9faXN0cmVhbWJ1ZiBhbmQgc3RkaW9fb3N0cmVhbWJ1ZgorY2xhc3Mgc3RkaW9fc3RyZWFtYnVmX2Jhc2UgOgorICBwdWJsaWMgYmFzaWNfc3RyZWFtYnVmPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4gLyogRklMRV9iYXNpY19zdHJlYW1idWYgKi8geworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25zdHJ1Y3RvciwgZGVzdHJ1Y3Rvci4KKyAgLy8gVGhlIGFyZ3VtZW50IG1heSBub3QgYmUgbnVsbC4gIEl0IG11c3QgYmUgYW4gb3BlbiBmaWxlIHBvaW50ZXIuCisgIHN0ZGlvX3N0cmVhbWJ1Zl9iYXNlKEZJTEUqKTsKKworICAvLyBUaGUgZGVzdHJ1Y3RvciBmbHVzaGVzIHRoZSBzdHJlYW0sIGJ1dCBkb2VzIG5vdCBjbG9zZSBpdC4KKyAgfnN0ZGlvX3N0cmVhbWJ1Zl9iYXNlKCk7CisKK3Byb3RlY3RlZDogICAgICAgICAgICAgICAgICAgICAgLy8gVmlydHVhbCBmdW5jdGlvbnMgZnJvbSBiYXNpY19zdHJlYW1idWYuCisgIHN0cmVhbWJ1Ziogc2V0YnVmKGNoYXIqLCBzdHJlYW1zaXplKTsKKworICBwb3NfdHlwZSBzZWVrb2ZmKG9mZl90eXBlLCBpb3NfYmFzZTo6c2Vla2RpciwKKyAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6b3Blbm1vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0KTsKKyAgcG9zX3R5cGUgc2Vla3Bvcyhwb3NfdHlwZSwKKyAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6b3Blbm1vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0KTsKKyAgaW50IHN5bmMoKTsKKworcHJvdGVjdGVkOgorICBGSUxFKiBfTV9maWxlOworfTsKKworY2xhc3Mgc3RkaW9faXN0cmVhbWJ1ZiA6IHB1YmxpYyBzdGRpb19zdHJlYW1idWZfYmFzZSB7CitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnN0cnVjdG9yLCBkZXN0cnVjdG9yLgorICBzdGRpb19pc3RyZWFtYnVmKEZJTEUqIF9fZikgOiBzdGRpb19zdHJlYW1idWZfYmFzZShfX2YpIHt9CisgIH5zdGRpb19pc3RyZWFtYnVmKCk7CisKK3Byb3RlY3RlZDogICAgICAgICAgICAgICAgICAgICAgLy8gVmlydHVhbCBmdW5jdGlvbnMgZnJvbSBiYXNpY19zdHJlYW1idWYuCisgIHN0cmVhbXNpemUgc2hvd21hbnljKCk7CisgIGludF90eXBlIHVuZGVyZmxvdygpOworICBpbnRfdHlwZSB1ZmxvdygpOworICB2aXJ0dWFsIGludF90eXBlIHBiYWNrZmFpbChpbnRfdHlwZSBjID0gdHJhaXRzX3R5cGU6OmVvZigpKTsKK307CisKK2NsYXNzIHN0ZGlvX29zdHJlYW1idWYgOiBwdWJsaWMgc3RkaW9fc3RyZWFtYnVmX2Jhc2UgeworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25zdHJ1Y3RvciwgZGVzdHJ1Y3Rvci4KKyAgc3RkaW9fb3N0cmVhbWJ1ZihGSUxFKiBfX2YpIDogc3RkaW9fc3RyZWFtYnVmX2Jhc2UoX19mKSB7fQorICB+c3RkaW9fb3N0cmVhbWJ1ZigpOworCitwcm90ZWN0ZWQ6ICAgICAgICAgICAgICAgICAgICAgIC8vIFZpcnR1YWwgZnVuY3Rpb25zIGZyb20gYmFzaWNfc3RyZWFtYnVmLgorICBzdHJlYW1zaXplIHNob3dtYW55YygpOworICBpbnRfdHlwZSBvdmVyZmxvdyhpbnRfdHlwZSBjID0gdHJhaXRzX3R5cGU6OmVvZigpKTsKK307CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLyogX1NUTFBfU1RESU9fU1RSRUFNQlVGICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zcmMvc3RscG9ydC5yYyBiL3NyYy9zdGxwb3J0LnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZGI0YTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RscG9ydC5yYwpAQCAtMCwwICsxLDk2IEBACisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyBWZXJzaW9uCisvLworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworI2luY2x1ZGUgPHN0bC9fc3RscG9ydF92ZXJzaW9uLmg+CisKKy8qIE9uIHNvbWUgZXZjMy9ldmM0IHRhcmdldHMgdGhlIHdpbmRvd3MuaCBkb2Vzbid0IGluY2x1ZGUgd2ludmVyLmggb3IgZG9lc24ndAorICogZGVmaW5lIG5lZWRlZCBmaWxlIHZlcnNpb24gZmxhZ3MsIHNvIHdlIHJlZGVmaW5lIHRoZW0gaGVyZS4KKyAqLworI2lmbmRlZiBWU19GRl9ERUJVRworIyAgZGVmaW5lIFZTX0ZGX0RFQlVHICAgIDB4MDAwMDAwMDFMCisjZW5kaWYKKworI2lmbmRlZiBWT1NfX1dJTkRPV1MzMgorIyAgZGVmaW5lIFZPU19fV0lORE9XUzMyIDB4MDAwMDAwMDRMCisjZW5kaWYKKworI2lmbmRlZiBWRlRfRExMCisjICBkZWZpbmUgVkZUX0RMTCAgICAgICAgMHgwMDAwMDAwMkwKKyNlbmRpZgorCisjaWZuZGVmIFZGVDJfVU5LTk9XTgorIyAgZGVmaW5lIFZGVDJfVU5LTk9XTiAgIDB4MDAwMDAwMDBMCisjZW5kaWYKKworI2RlZmluZSBTVFJJTkdJWkUoWCkgU1RSSU5HSVpFX0FVWChYKQorI2RlZmluZSBTVFJJTkdJWkVfQVVYKFgpICNYCisKKyNkZWZpbmUgVkVSU0lPTl9JRCBfU1RMUE9SVF9NQUpPUiwgX1NUTFBPUlRfTUlOT1IsIF9TVExQT1JUX1BBVENITEVWRUwsIDAKKyNpZiAhZGVmaW5lZCAoX19CT1JMQU5EQ19fKQorIyAgZGVmaW5lIFZFUlNJT05fU1RSIFNUUklOR0laRShfU1RMUE9SVF9NQUpPUi5fU1RMUE9SVF9NSU5PUi5fU1RMUE9SVF9QQVRDSExFVkVMKQorI2Vsc2UKKy8qIEJvcmxhbmQgcHJlY29tcGlsZXIgaGFwcGVuIHdlaXJkIGNoYXJhY3RlciB3aGVuIHRyeWluZyB0byB0cmFuc2Zvcm0gYQorICogbWFjcm8gY29udGFpbmluZyAwIGluIGEgY2hhcmFjdGVyIHN0cmluZyBzbyB3ZSB1c2UgYSB3b3JrYXJvdW5kIGZvciB0aGlzCisgKiB2YWx1ZS4gV2UgZG8gbm90IGNoZWNrIHRoZSBtYWpvciB2ZXJzaW9uIHRoYXQgd2lsbCBuZXZlciBiZSAwIGFnYWluLgorICovCisjICBpZiAoX1NUTFBPUlRfTUlOT1IgPT0gMCkKKyMgICAgZGVmaW5lIF9TVExQX01JTk9SICIwIgorIyAgZWxzZQorIyAgICBkZWZpbmUgX1NUTFBfTUlOT1IgU1RSSU5HSVpFKF9TVExQT1JUX01JTk9SKQorIyAgZW5kaWYKKyMgIGlmIChfU1RMUE9SVF9QQVRDSExFVkVMID09IDApCisjICAgIGRlZmluZSBfU1RMUF9QQVRDSCAiMCIKKyMgIGVsc2UKKyMgICAgZGVmaW5lIF9TVExQX1BBVENIIFNUUklOR0laRShfU1RMUE9SVF9QQVRDSExFVkVMKQorIyAgZW5kaWYKKyMgIGRlZmluZSBWRVJTSU9OX1NUUiBTVFJJTkdJWkUoX1NUTFBPUlRfTUFKT1IpICIuIiBfU1RMUF9NSU5PUiAiLiIgX1NUTFBfUEFUQ0ggIlwwIgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX0dOVUNfXykKKyMgIGRlZmluZSBMSUJfTU9USUYgImxpYnN0bHBvcnQiCisjZWxzZQorIyAgZGVmaW5lIExJQl9NT1RJRiAic3RscG9ydCIKKyNlbmRpZgorI2RlZmluZSBETExOQU1FIExJQl9NT1RJRiAiLiIgU1RSSU5HSVpFKF9TVExQT1JUX01BSk9SKSAiLiIgU1RSSU5HSVpFKF9TVExQT1JUX01JTk9SKSAiLmRsbFwwIgorI2RlZmluZSBETExOQU1FMihidWlsZHN0cikgTElCX01PVElGICIiIFNUUklOR0laRShidWlsZHN0cikgIi4iIFNUUklOR0laRShfU1RMUE9SVF9NQUpPUikgIi4iIFNUUklOR0laRShfU1RMUE9SVF9NSU5PUikgIi5kbGxcMCIKKworVlNfVkVSU0lPTl9JTkZPIFZFUlNJT05JTkZPCitGSUxFVkVSU0lPTiBWRVJTSU9OX0lECitQUk9EVUNUVkVSU0lPTiBWRVJTSU9OX0lECitGSUxFRkxBR1NNQVNLIDB4M2ZMCisKK0ZJTEVGTEFHUyBWU19GRl9ERUJVRworCitGSUxFT1MgVk9TX19XSU5ET1dTMzIKK0ZJTEVUWVBFIFZGVF9ETEwKK0ZJTEVTVUJUWVBFIFZGVDJfVU5LTk9XTgorQkVHSU4KKyAgQkxPQ0sgIlN0cmluZ0ZpbGVJbmZvIgorICBCRUdJTgorICAgIEJMT0NLICIwNDA5MDRCMCIKKyAgICBCRUdJTgorICAgICAgVkFMVUUgIkNvbXBhbnlOYW1lIiwgIlNUTHBvcnQgQ29uc3VsdGluZywgSW5jLlwwIgorICAgICAgVkFMVUUgIkZpbGVEZXNjcmlwdGlvbiIsICJTVExwb3J0XDAiCisgICAgICBWQUxVRSAiRmlsZVZlcnNpb24iLCBWRVJTSU9OX1NUUgorICAgICAgVkFMVUUgIkludGVybmFsTmFtZSIsICJTVExQT1JULkRMTFwwIgorICAgICAgVkFMVUUgIkxlZ2FsQ29weXJpZ2h0IiwgIkNvcHlyaWdodCAoQykgQm9yaXMgRm9taXRjaGV2XDAiCisjaWYgIWRlZmluZWQgKEJVSUxEKQorICAgICAgVkFMVUUgIk9yaWdpbmFsRmlsZW5hbWUiLCBETExOQU1FCisjZWxzZQorICAgICAgVkFMVUUgIk9yaWdpbmFsRmlsZW5hbWUiLCBETExOQU1FMihCVUlMRCkKKyNlbmRpZgorICAgICAgVkFMVUUgIlByb2R1Y3ROYW1lIiwgIlNUTHBvcnQgU3RhbmRhcmQgQU5TSSBDKysgTGlicmFyeVwwIgorICAgICAgVkFMVUUgIlByb2R1Y3RWZXJzaW9uIiwgVkVSU0lPTl9TVFIKKyNpZiBkZWZpbmVkIChCVUlMRF9JTkZPUykKKyAgICAgIFZBTFVFICJTcGVjaWFsQnVpbGQiLCBTVFJJTkdJWkUoQ09NUCkgIiAiIFNUUklOR0laRShCVUlMRF9JTkZPUykgIlwwIgorI2VuZGlmCisgICAgRU5ECisgIEVORAorICBCTE9DSyAiVmFyRmlsZUluZm8iCisgIEJFR0lOCisgICAgVkFMVUUgIlRyYW5zbGF0aW9uIiwgMHg0MDksIDEyMDAKKyAgRU5ECitFTkQKZGlmZiAtLWdpdCBhL3NyYy9zdGxwb3J0X3ByZWZpeC5oIGIvc3JjL3N0bHBvcnRfcHJlZml4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUwNmI3NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGxwb3J0X3ByZWZpeC5oCkBAIC0wLDAgKzEsNDMgQEAKKyNpZm5kZWYgU1RMUE9SVF9QUkVGSVhfSAorI2RlZmluZSBTVExQT1JUX1BSRUZJWF9ICisKKyNkZWZpbmUgX19CVUlMRElOR19TVExQT1JUIDEKKworI2lmIGRlZmluZWQgKF9XSU4zMikgfHwgZGVmaW5lZCAoV0lOMzIpCisjICBpZmRlZiBfX2NwbHVzcGx1cworIyAgICBkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgorIyAgICBkZWZpbmUgTk9TRVJWSUNFCisjICBlbmRpZgorI2VuZGlmCisKKyN1bmRlZiBfU1RMUF9OT19GT1JDRV9JTlNUQU5USUFURQorCisvKiBQbGVhc2UgYWRkIGV4dHJhIGNvbXBpbGF0aW9uIHN3aXRjaGVzIGZvciBwYXJ0aWN1bGFyIGNvbXBpbGVycyBoZXJlICovCisKKyNpZiBkZWZpbmVkIChfTVNDX1ZFUikgJiYgIWRlZmluZWQgKF9fQ09NT19fKSAmJiAhZGVmaW5lZCAoX19NV0VSS1NfXykKKyMgIGluY2x1ZGUgIndhcm5pbmdfZGlzYWJsZS5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGwvY29uZmlnL2ZlYXR1cmVzLmg+CisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUKSAmJiBkZWZpbmVkIChfU1RMUF9VU0VfREVDTFNQRUMpICYmICFkZWZpbmVkIChfU1RMUF9FWFBPU0VfR0xPQkFMU19JTVBMRU1FTlRBVElPTikKKyMgIGRlZmluZSBfU1RMUF9FWFBPU0VfR0xPQkFMU19JTVBMRU1FTlRBVElPTgorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworCisjICBpbmNsdWRlIDxjdGltZT4KKyMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9OQU1FU1BBQ0VTKSAmJiAhZGVmaW5lZCAoX1NUTFBfVkVORE9SX0dMT0JBTF9DU1REKQordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnRpbWVfdDsKKyMgIGVuZGlmCisKKyMgIGlmIGRlZmluZWQgKF9TVExQX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUikKKyMgICAgZGVmaW5lIF9TVExQX09QRVJBVE9SX1NQRUMgX1NUTFBfREVDTFNQRUMKKyMgIGVsc2UKKyMgICAgZGVmaW5lIF9TVExQX09QRVJBVE9SX1NQRUMgX1NUTFBfVEVNUExBVEVfTlVMTCBfU1RMUF9ERUNMU1BFQworIyAgZW5kaWYKKworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAvKiBQUkVGSVggKi8KKwpkaWZmIC0tZ2l0IGEvc3JjL3N0cmluZy5jcHAgYi9zcmMvc3RyaW5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2UyMTg3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3N0cmluZy5jcHAKQEAgLTAsMCArMSw5MyBAQAorI2luY2x1ZGUgInN0bHBvcnRfcHJlZml4LmgiCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisjaWYgZGVmaW5lZChfU1RMUF9VU0VfV0lERV9JTlRFUkZBQ0UpCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3dzdHJpbmcgX19BU0NJSVRvV2lkZShjb25zdCBjaGFyICphc2NpaSkgeworICAgIHNpemVfdCBzaXplID0gc3RybGVuKGFzY2lpKTsKKyAgICB3Y2hhcl90KiBidWZmID0gbmV3IHdjaGFyX3Rbc2l6ZSsxXTsKKyAgICBtYnN0b3djcyhidWZmLCBhc2NpaSwgc2l6ZSk7CisgICAgYnVmZltzaXplXSA9IDB4MDA7CisgICAgd3N0cmluZyByZXQoYnVmZik7CisgICAgZGVsZXRlW10gYnVmZjsKKyAgICByZXR1cm4gcmV0OworfQorc3RyaW5nIF9fV2lkZVRvQVNDSUkoY29uc3Qgd2NoYXJfdCAqd2lkZSkgeworICAgIHNpemVfdCBzaXplID0gd2NzbGVuKHdpZGUpOworICAgIGNoYXIqIGJ1ZmYgPSBuZXcgY2hhcltzaXplKzFdOworICAgIHdjc3RvbWJzKGJ1ZmYsIHdpZGUsIHNpemUpOworICAgIGJ1ZmZbc2l6ZV0gPSAwOworICAgIHN0cmluZyByZXQoYnVmZik7CisgICAgZGVsZXRlW10gYnVmZjsKKyAgICByZXR1cm4gcmV0OworfQorX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisjZW5kaWYKKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19GT1JDRV9JTlNUQU5USUFURSkKKwordGVtcGxhdGUgY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgYWxsb2NhdG9yPGNoYXI+OworCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIGNsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIF9TVExQX2FsbG9jX3Byb3h5PGNoYXIqLCBjaGFyLCBhbGxvY2F0b3I8Y2hhcj4gPjsKK3RlbXBsYXRlIGNsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIF9TdHJpbmdfYmFzZTxjaGFyLCBhbGxvY2F0b3I8Y2hhcj4gPjsKKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpICYmICFkZWZpbmVkIChfX1NVTlBST19DQykgJiYgIWRlZmluZWQgKF9TVExQX1VTRV9NU1ZDNl9NRU1fVF9CVUdfV09SS0FST1VORCkKKyMgICAgZGVmaW5lIGJhc2ljX3N0cmluZyBfU1RMUF9OT05fREJHX05BTUUoc3RyKQorCit0ZW1wbGF0ZSBjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBiYXNpY19zdHJpbmc8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4sIGFsbG9jYXRvcjxjaGFyPiA+OwordGVtcGxhdGUgY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgX19jb25zdHJ1Y3RfY2hlY2tlcjxiYXNpY19zdHJpbmc8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4sIGFsbG9jYXRvcjxjaGFyPiA+ID47CisKKyMgICAgdW5kZWYgYmFzaWNfc3RyaW5nCisjICBlbmRpZgorCisjICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfTVNWQzZfTUVNX1RfQlVHX1dPUktBUk9VTkQpCisjICAgIGRlZmluZSBiYXNpY19zdHJpbmcgX1NUTFBfTk9fTUVNX1RfTkFNRShzdHIpCisjICBlbHNlCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKyMgIGVuZGlmCisKK3RlbXBsYXRlIGNsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIGJhc2ljX3N0cmluZzxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiwgYWxsb2NhdG9yPGNoYXI+ID47CisKKyMgIGlmIGRlZmluZWQgKGJhc2ljX3N0cmluZykKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorIyAgICB1bmRlZiBiYXNpY19zdHJpbmcKKyMgIGVuZGlmCisKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQordGVtcGxhdGUgY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgYWxsb2NhdG9yPHdjaGFyX3Q+OworCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIGNsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIF9TdHJpbmdfYmFzZTx3Y2hhcl90LCBhbGxvY2F0b3I8d2NoYXJfdD4gPjsKKworIyAgICBpZiBkZWZpbmVkIChfU1RMUF9ERUJVRykgJiYgIWRlZmluZWQgKF9fU1VOUFJPX0NDKSAmJiAhZGVmaW5lZCAoX1NUTFBfVVNFX01TVkM2X01FTV9UX0JVR19XT1JLQVJPVU5EKQorIyAgICAgIGRlZmluZSBiYXNpY19zdHJpbmcgX1NUTFBfTk9OX0RCR19OQU1FKHN0cikKKwordGVtcGxhdGUgY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgYmFzaWNfc3RyaW5nPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+LCBhbGxvY2F0b3I8d2NoYXJfdD4gPjsKK3RlbXBsYXRlIGNsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIF9fY29uc3RydWN0X2NoZWNrZXI8YmFzaWNfc3RyaW5nPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+LCBhbGxvY2F0b3I8d2NoYXJfdD4gPiA+OworCisjICAgICAgdW5kZWYgYmFzaWNfc3RyaW5nCisjICAgIGVuZGlmCisKKyMgICAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX01TVkM2X01FTV9UX0JVR19XT1JLQVJPVU5EKQorIyAgICAgIGRlZmluZSBiYXNpY19zdHJpbmcgX1NUTFBfTk9fTUVNX1RfTkFNRShzdHIpCisjICAgIGVsc2UKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorIyAgICBlbmRpZgorCit0ZW1wbGF0ZSBjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBiYXNpY19zdHJpbmc8d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4sIGFsbG9jYXRvcjx3Y2hhcl90PiA+OworCisjICAgIGlmIGRlZmluZWQgKGJhc2ljX3N0cmluZykKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorIyAgICAgIHVuZGVmIGJhc2ljX3N0cmluZworIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCitfU1RMUF9FTkRfTkFNRVNQQUNFCmRpZmYgLS1naXQgYS9zcmMvc3Ryc3RyZWFtLmNwcCBiL3NyYy9zdHJzdHJlYW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MGUwMWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3Ryc3RyZWFtLmNwcApAQCAtMCwwICsxLDM5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworLy8gSW1wbGVtZW50YXRpb24gb2YgdGhlIGNsYXNzZXMgaW4gaGVhZGVyIDxzdHJzdHJlYW0+LgorLy8gV0FSTklORzogVGhlIGNsYXNzZXMgZGVmaW5lZCBpbiA8c3Ryc3RyZWFtPiBhcmUgREVQUkVDQVRFRC4gIFRoaXMKKy8vIGhlYWRlciBpcyBkZWZpbmVkIGluIHNlY3Rpb24gRC43LjEgb2YgdGhlIEMrKyBzdGFuZGFyZCwgYW5kIGl0CisvLyBNQVkgQkUgUkVNT1ZFRCBpbiBhIGZ1dHVyZSBzdGFuZGFyZCByZXZpc2lvbi4gIFlvdSBzaG91bGQgdXNlIHRoZQorLy8gaGVhZGVyIDxzc3RyZWFtPiBpbnN0ZWFkLgorCisjaW5jbHVkZSAic3RscG9ydF9wcmVmaXguaCIKKworI2luY2x1ZGUgPHN0cnN0cmVhbT4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8bGltaXRzPgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworLy8gc3Ryc3RyZWFtYnVmIGNvbnN0cnVjdG9yLCBkZXN0cnVjdG9yLgorc3Ryc3RyZWFtYnVmOjpzdHJzdHJlYW1idWYoc3RyZWFtc2l6ZSBpbml0aWFsX2NhcGFjaXR5KQorICAgOiBfTV9hbGxvY19mdW4oMCksIF9NX2ZyZWVfZnVuKDApLAorICAgICBfTV9keW5hbWljKHRydWUpLCBfTV9mcm96ZW4oZmFsc2UpLCBfTV9jb25zdGFudChmYWxzZSkgeworICBzaXplX3QgbiA9IChzaXplb2Yoc3RyZWFtc2l6ZSkgPiBzaXplb2Yoc2l6ZV90KSkgPyBfX1NUQVRJQ19DQVNUKHNpemVfdCwgKG1pbikoX19TVEFUSUNfQ0FTVChzdHJlYW1zaXplLCAobnVtZXJpY19saW1pdHM8c2l6ZV90Pjo6bWF4KSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXgpKGluaXRpYWxfY2FwYWNpdHksIHN0cmVhbXNpemUoMTYpKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF9fU1RBVElDX0NBU1Qoc2l6ZV90LCAobWF4KShpbml0aWFsX2NhcGFjaXR5LCBzdHJlYW1zaXplKDE2KSkpOworCisgIGNoYXIqIGJ1ZiA9IF9NX2FsbG9jKG4pOworICBpZiAoYnVmKSB7CisgICAgc2V0cChidWYsIGJ1ZiArIG4pOworICAgIHNldGcoYnVmLCBidWYsIGJ1Zik7CisgIH0KK30KKworc3Ryc3RyZWFtYnVmOjpzdHJzdHJlYW1idWYoX19hbGxvY19mbiBhbGxvY19mLCBfX2ZyZWVfZm4gZnJlZV9mKQorICA6IF9NX2FsbG9jX2Z1bihhbGxvY19mKSwgX01fZnJlZV9mdW4oZnJlZV9mKSwKKyAgICBfTV9keW5hbWljKHRydWUpLCBfTV9mcm96ZW4oZmFsc2UpLCBfTV9jb25zdGFudChmYWxzZSkgeworICBzaXplX3QgbiA9IDE2OworCisgIGNoYXIqIGJ1ZiA9IF9NX2FsbG9jKG4pOworICBpZiAoYnVmKSB7CisgICAgc2V0cChidWYsIGJ1ZiArIG4pOworICAgIHNldGcoYnVmLCBidWYsIGJ1Zik7CisgIH0KK30KKworc3Ryc3RyZWFtYnVmOjpzdHJzdHJlYW1idWYoY2hhciogZ2V0LCBzdHJlYW1zaXplIG4sIGNoYXIqIHB1dCkKKyAgOiBfTV9hbGxvY19mdW4oMCksIF9NX2ZyZWVfZnVuKDApLAorICAgIF9NX2R5bmFtaWMoZmFsc2UpLCBfTV9mcm96ZW4oZmFsc2UpLCBfTV9jb25zdGFudChmYWxzZSkgeworICBfTV9zZXR1cChnZXQsIHB1dCwgbik7Cit9CisKK3N0cnN0cmVhbWJ1Zjo6c3Ryc3RyZWFtYnVmKHNpZ25lZCBjaGFyKiBnZXQsIHN0cmVhbXNpemUgbiwgc2lnbmVkIGNoYXIqIHB1dCkKKyAgOiBfTV9hbGxvY19mdW4oMCksIF9NX2ZyZWVfZnVuKDApLAorICAgIF9NX2R5bmFtaWMoZmFsc2UpLCBfTV9mcm96ZW4oZmFsc2UpLCBfTV9jb25zdGFudChmYWxzZSkgeworICBfTV9zZXR1cChfX1JFSU5URVJQUkVUX0NBU1QoY2hhciosZ2V0KSwgX19SRUlOVEVSUFJFVF9DQVNUKGNoYXIqLHB1dCksIG4pOworfQorCitzdHJzdHJlYW1idWY6OnN0cnN0cmVhbWJ1Zih1bnNpZ25lZCBjaGFyKiBnZXQsIHN0cmVhbXNpemUgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIHB1dCkKKyAgOiBfTV9hbGxvY19mdW4oMCksIF9NX2ZyZWVfZnVuKDApLAorICAgIF9NX2R5bmFtaWMoZmFsc2UpLCBfTV9mcm96ZW4oZmFsc2UpLCBfTV9jb25zdGFudChmYWxzZSkgeworICBfTV9zZXR1cChfX1JFSU5URVJQUkVUX0NBU1QoY2hhciosZ2V0KSwgX19SRUlOVEVSUFJFVF9DQVNUKGNoYXIqLHB1dCksIG4pOworfQorCitzdHJzdHJlYW1idWY6OnN0cnN0cmVhbWJ1Zihjb25zdCBjaGFyKiBnZXQsIHN0cmVhbXNpemUgbikKKyAgOiBfTV9hbGxvY19mdW4oMCksIF9NX2ZyZWVfZnVuKDApLAorICAgIF9NX2R5bmFtaWMoZmFsc2UpLCBfTV9mcm96ZW4oZmFsc2UpLCBfTV9jb25zdGFudCh0cnVlKSB7CisgIF9NX3NldHVwKF9fQ09OU1RfQ0FTVChjaGFyKixnZXQpLCAwLCBuKTsKK30KKworc3Ryc3RyZWFtYnVmOjpzdHJzdHJlYW1idWYoY29uc3Qgc2lnbmVkIGNoYXIqIGdldCwgc3RyZWFtc2l6ZSBuKQorICA6IF9NX2FsbG9jX2Z1bigwKSwgX01fZnJlZV9mdW4oMCksCisgICAgX01fZHluYW1pYyhmYWxzZSksIF9NX2Zyb3plbihmYWxzZSksIF9NX2NvbnN0YW50KHRydWUpIHsKKyAgX01fc2V0dXAoX19SRUlOVEVSUFJFVF9DQVNUKGNoYXIqLCBfX0NPTlNUX0NBU1Qoc2lnbmVkIGNoYXIqLGdldCkpLCAwLCBuKTsKK30KKworc3Ryc3RyZWFtYnVmOjpzdHJzdHJlYW1idWYoY29uc3QgdW5zaWduZWQgY2hhciogZ2V0LCBzdHJlYW1zaXplIG4pCisgIDogX01fYWxsb2NfZnVuKDApLCBfTV9mcmVlX2Z1bigwKSwKKyAgICBfTV9keW5hbWljKGZhbHNlKSwgX01fZnJvemVuKGZhbHNlKSwgX01fY29uc3RhbnQodHJ1ZSkgeworICBfTV9zZXR1cChfX1JFSU5URVJQUkVUX0NBU1QoY2hhciosIF9fQ09OU1RfQ0FTVCh1bnNpZ25lZCBjaGFyKixnZXQpKSwgMCwgbik7Cit9CisKK3N0cnN0cmVhbWJ1Zjo6fnN0cnN0cmVhbWJ1ZigpIHsKKyAgaWYgKF9NX2R5bmFtaWMgJiYgIV9NX2Zyb3plbikKKyAgICBfTV9mcmVlKGViYWNrKCkpOworfQorCit2b2lkIHN0cnN0cmVhbWJ1Zjo6ZnJlZXplKGJvb2wgZnJvemVuZmxhZykgeworICBpZiAoX01fZHluYW1pYykKKyAgICBfTV9mcm96ZW4gPSBmcm96ZW5mbGFnOworfQorCitjaGFyKiBzdHJzdHJlYW1idWY6OnN0cigpIHsKKyAgZnJlZXplKHRydWUpOworICByZXR1cm4gZWJhY2soKTsKK30KKworaW50IHN0cnN0cmVhbWJ1Zjo6cGNvdW50KCkgY29uc3QgeworICByZXR1cm4gaW50KHBwdHIoKSA/IHBwdHIoKSAtIHBiYXNlKCkgOiAwKTsKK30KKworc3Ryc3RyZWFtYnVmOjppbnRfdHlwZSBzdHJzdHJlYW1idWY6Om92ZXJmbG93KGludF90eXBlIGMpIHsKKyAgaWYgKGMgPT0gdHJhaXRzX3R5cGU6OmVvZigpKQorICAgIHJldHVybiB0cmFpdHNfdHlwZTo6bm90X2VvZihjKTsKKworICAvLyBUcnkgdG8gZXhwYW5kIHRoZSBidWZmZXIuCisgIGlmIChwcHRyKCkgPT0gZXBwdHIoKSAmJiBfTV9keW5hbWljICYmICFfTV9mcm96ZW4gJiYgIV9NX2NvbnN0YW50KSB7CisgICAgcHRyZGlmZl90IG9sZF9zaXplID0gZXBwdHIoKSAtIHBiYXNlKCk7CisgICAgcHRyZGlmZl90IG5ld19zaXplID0gKG1heCkoMiAqIG9sZF9zaXplLCBwdHJkaWZmX3QoMSkpOworCisgICAgY2hhciogYnVmID0gX01fYWxsb2MobmV3X3NpemUpOworICAgIGlmIChidWYpIHsKKyAgICAgIG1lbWNweShidWYsIHBiYXNlKCksIG9sZF9zaXplKTsKKworICAgICAgY2hhciogb2xkX2J1ZmZlciA9IHBiYXNlKCk7CisgICAgICBib29sIHJlcG9zaXRpb25fZ2V0ID0gZmFsc2U7CisgICAgICBwdHJkaWZmX3Qgb2xkX2dldF9vZmZzZXQ7CisgICAgICBpZiAoZ3B0cigpICE9IDApIHsKKyAgICAgICAgcmVwb3NpdGlvbl9nZXQgPSB0cnVlOworICAgICAgICBvbGRfZ2V0X29mZnNldCA9IGdwdHIoKSAtIGViYWNrKCk7CisgICAgICB9CisKKyAgICAgIHNldHAoYnVmLCBidWYgKyBuZXdfc2l6ZSk7CisgICAgICBwYnVtcCgoaW50KW9sZF9zaXplKTsKKworICAgICAgaWYgKHJlcG9zaXRpb25fZ2V0KQorICAgICAgICBzZXRnKGJ1ZiwgYnVmICsgb2xkX2dldF9vZmZzZXQsIGJ1ZiArIChtYXgpKG9sZF9nZXRfb2Zmc2V0LCBvbGRfc2l6ZSkpOworCisgICAgICBfTV9mcmVlKG9sZF9idWZmZXIpOworICAgIH0KKyAgfQorCisgIGlmIChwcHRyKCkgIT0gZXBwdHIoKSkgeworICAgICpwcHRyKCkgPSB0cmFpdHNfdHlwZTo6dG9fY2hhcl90eXBlKGMpOworICAgIHBidW1wKDEpOworICAgIHJldHVybiBjOworICB9CisgIGVsc2UKKyAgICByZXR1cm4gdHJhaXRzX3R5cGU6OmVvZigpOworfQorCitzdHJzdHJlYW1idWY6OmludF90eXBlIHN0cnN0cmVhbWJ1Zjo6cGJhY2tmYWlsKGludF90eXBlIGMpIHsKKyAgaWYgKGdwdHIoKSAhPSBlYmFjaygpKSB7CisgICAgaWYgKGMgPT0gdHJhaXRzX3R5cGU6OmVvZigpKSB7CisgICAgICBnYnVtcCgtMSk7CisgICAgICByZXR1cm4gdHJhaXRzX3R5cGU6Om5vdF9lb2YoYyk7CisgICAgfQorICAgIGVsc2UgaWYgKGMgPT0gZ3B0cigpWy0xXSkgeworICAgICAgZ2J1bXAoLTEpOworICAgICAgcmV0dXJuIGM7CisgICAgfQorICAgIGVsc2UgaWYgKCFfTV9jb25zdGFudCkgeworICAgICAgZ2J1bXAoLTEpOworICAgICAgKmdwdHIoKSA9IHRyYWl0c190eXBlOjp0b19jaGFyX3R5cGUoYyk7CisgICAgICByZXR1cm4gYzsKKyAgICB9CisgIH0KKworICByZXR1cm4gdHJhaXRzX3R5cGU6OmVvZigpOworfQorCitzdHJzdHJlYW1idWY6OmludF90eXBlIHN0cnN0cmVhbWJ1Zjo6dW5kZXJmbG93KCkgeworICBpZiAoZ3B0cigpID09IGVncHRyKCkgJiYgcHB0cigpICYmIHBwdHIoKSA+IGVncHRyKCkpCisgICAgc2V0ZyhlYmFjaygpLCBncHRyKCksIHBwdHIoKSk7CisKKyAgaWYgKGdwdHIoKSAhPSBlZ3B0cigpKQorICAgIHJldHVybiAodW5zaWduZWQgY2hhcikgKmdwdHIoKTsKKyAgZWxzZQorICAgIHJldHVybiBfVHJhaXRzOjplb2YoKTsKK30KKworYmFzaWNfc3RyZWFtYnVmPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4qCitzdHJzdHJlYW1idWY6OnNldGJ1ZihjaGFyKiwgc3RyZWFtc2l6ZSkgeworICByZXR1cm4gdGhpczsKK30KKworc3Ryc3RyZWFtYnVmOjpwb3NfdHlwZQorc3Ryc3RyZWFtYnVmOjpzZWVrb2ZmKG9mZl90eXBlIG9mZiwKKyAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6c2Vla2RpciBkaXIsIGlvc19iYXNlOjpvcGVubW9kZSBtb2RlKSB7CisgIGJvb2wgZG9fZ2V0ID0gZmFsc2U7CisgIGJvb2wgZG9fcHV0ID0gZmFsc2U7CisKKyAgaWYgKChtb2RlICYgKGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpKSA9PQorICAgICAgICAgIChpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0KSAmJgorICAgICAgKGRpciA9PSBpb3NfYmFzZTo6YmVnIHx8IGRpciA9PSBpb3NfYmFzZTo6ZW5kKSkKKyAgICBkb19nZXQgPSBkb19wdXQgPSB0cnVlOworICBlbHNlIGlmIChtb2RlICYgaW9zX2Jhc2U6OmluKQorICAgIGRvX2dldCA9IHRydWU7CisgIGVsc2UgaWYgKG1vZGUgJiBpb3NfYmFzZTo6b3V0KQorICAgIGRvX3B1dCA9IHRydWU7CisKKyAgLy8gIWdwdHIoKSBpcyBoZXJlIGJlY2F1c2UsIGFjY29yZGluZyB0byBELjcuMSBwYXJhZ3JhcGggNCwgdGhlIHNlZWthYmxlCisgIC8vIGFyZWEgaXMgdW5kZWZpbmVkIGlmIHRoZXJlIGlzIG5vIGdldCBhcmVhLgorICBpZiAoKCFkb19nZXQgJiYgIWRvX3B1dCkgfHwgKGRvX3B1dCAmJiAhcHB0cigpKSB8fCAhZ3B0cigpKQorICAgIHJldHVybiBwb3NfdHlwZShvZmZfdHlwZSgtMSkpOworCisgIGNoYXIqIHNlZWtsb3cgID0gZWJhY2soKTsKKyAgY2hhciogc2Vla2hpZ2ggPSBlcHB0cigpID8gZXBwdHIoKSA6IGVncHRyKCk7CisKKyAgb2ZmX3R5cGUgbmV3b2ZmOworICBzd2l0Y2goZGlyKSB7CisgIGNhc2UgaW9zX2Jhc2U6OmJlZzoKKyAgICBuZXdvZmYgPSAwOworICAgIGJyZWFrOworICBjYXNlIGlvc19iYXNlOjplbmQ6CisgICAgbmV3b2ZmID0gc2Vla2hpZ2ggLSBzZWVrbG93OworICAgIGJyZWFrOworICBjYXNlIGlvc19iYXNlOjpjdXI6CisgICAgbmV3b2ZmID0gZG9fcHV0ID8gcHB0cigpIC0gc2Vla2xvdyA6IGdwdHIoKSAtIHNlZWtsb3c7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIHBvc190eXBlKG9mZl90eXBlKC0xKSk7CisgIH0KKworICBvZmYgKz0gbmV3b2ZmOworICBpZiAob2ZmIDwgMCB8fCBvZmYgPiBzZWVraGlnaCAtIHNlZWtsb3cpCisgICAgcmV0dXJuIHBvc190eXBlKG9mZl90eXBlKC0xKSk7CisKKyAgaWYgKGRvX3B1dCkgeworICAgIGlmIChzZWVrbG93ICsgX19TVEFUSUNfQ0FTVChwdHJkaWZmX3QsIG9mZikgPCBwYmFzZSgpKSB7CisgICAgICBzZXRwKHNlZWtsb3csIGVwcHRyKCkpOworICAgICAgcGJ1bXAoKGludClvZmYpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHNldHAocGJhc2UoKSwgZXBwdHIoKSk7CisgICAgICBwYnVtcCgoaW50KShvZmYgLSAocGJhc2UoKSAtIHNlZWtsb3cpKSk7CisgICAgfQorICB9CisgIGlmIChkb19nZXQpIHsKKyAgICBpZiAob2ZmIDw9IGVncHRyKCkgLSBzZWVrbG93KQorICAgICAgc2V0ZyhzZWVrbG93LCBzZWVrbG93ICsgX19TVEFUSUNfQ0FTVChwdHJkaWZmX3QsIG9mZiksIGVncHRyKCkpOworICAgIGVsc2UgaWYgKG9mZiA8PSBwcHRyKCkgLSBzZWVrbG93KQorICAgICAgc2V0ZyhzZWVrbG93LCBzZWVrbG93ICsgX19TVEFUSUNfQ0FTVChwdHJkaWZmX3QsIG9mZiksIHBwdHIoKSk7CisgICAgZWxzZQorICAgICAgc2V0ZyhzZWVrbG93LCBzZWVrbG93ICsgX19TVEFUSUNfQ0FTVChwdHJkaWZmX3QsIG9mZiksIGVwcHRyKCkpOworICB9CisKKyAgcmV0dXJuIHBvc190eXBlKG5ld29mZik7Cit9CisKK3N0cnN0cmVhbWJ1Zjo6cG9zX3R5cGUKK3N0cnN0cmVhbWJ1Zjo6c2Vla3Bvcyhwb3NfdHlwZSBwb3MsIGlvc19iYXNlOjpvcGVubW9kZSBtb2RlKSB7CisgIHJldHVybiBzZWVrb2ZmKHBvcyAtIHBvc190eXBlKG9mZl90eXBlKDApKSwgaW9zX2Jhc2U6OmJlZywgbW9kZSk7Cit9CisKKworY2hhciogc3Ryc3RyZWFtYnVmOjpfTV9hbGxvYyhzaXplX3QgbikgeworICBpZiAoX01fYWxsb2NfZnVuKQorICAgIHJldHVybiBfX1NUQVRJQ19DQVNUKGNoYXIqLF9NX2FsbG9jX2Z1bihuKSk7CisgIGVsc2UKKyAgICByZXR1cm4gbmV3IGNoYXJbbl07Cit9CisKK3ZvaWQgc3Ryc3RyZWFtYnVmOjpfTV9mcmVlKGNoYXIqIHApIHsKKyAgaWYgKHApIHsKKyAgICBpZiAoX01fZnJlZV9mdW4pCisgICAgICBfTV9mcmVlX2Z1bihwKTsKKyAgICBlbHNlCisgICAgICBkZWxldGVbXSBwOworICB9Cit9CisKK3ZvaWQgc3Ryc3RyZWFtYnVmOjpfTV9zZXR1cChjaGFyKiBnZXQsIGNoYXIqIHB1dCwgc3RyZWFtc2l6ZSBuKSB7CisgIGlmIChnZXQpIHsKKyAgICBzaXplX3QgTiA9IG4gPiAwID8gc2l6ZV90KG4pIDogbiA9PSAwID8gc3RybGVuKGdldCkgOiBzaXplX3QoSU5UX01BWCk7CisKKyAgICBpZiAocHV0KSB7CisgICAgICBzZXRnKGdldCwgZ2V0LCBnZXQgKyBOKTsKKyAgICAgIHNldHAocHV0LCBwdXQgKyBOKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBzZXRnKGdldCwgZ2V0LCBnZXQgKyBOKTsKKyAgICB9CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDbGFzcyBpc3Ryc3RyZWFtCisKK2lzdHJzdHJlYW06OmlzdHJzdHJlYW0oY2hhciogcykKKyAgOiBiYXNpY19pc3RyZWFtPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4oMCksIF9NX2J1ZihzLCAwKSB7CisgIHRoaXMtPmluaXQoJl9NX2J1Zik7Cit9CisKK2lzdHJzdHJlYW06OmlzdHJzdHJlYW0oY29uc3QgY2hhciogcykKKyAgOiBiYXNpY19pc3RyZWFtPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4oMCksIF9NX2J1ZihzLCAwKSB7CisgIHRoaXMtPmluaXQoJl9NX2J1Zik7Cit9CisKK2lzdHJzdHJlYW06OmlzdHJzdHJlYW0oY2hhciogcywgc3RyZWFtc2l6ZSBuKQorICA6IGJhc2ljX2lzdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPigwKSwgX01fYnVmKHMsIG4pIHsKKyAgdGhpcy0+aW5pdCgmX01fYnVmKTsKK30KKworaXN0cnN0cmVhbTo6aXN0cnN0cmVhbShjb25zdCBjaGFyKiBzLCBzdHJlYW1zaXplIG4pCisgIDogYmFzaWNfaXN0cmVhbTxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+KDApLCBfTV9idWYocywgbikgeworICB0aGlzLT5pbml0KCZfTV9idWYpOworfQorCitpc3Ryc3RyZWFtOjp+aXN0cnN0cmVhbSgpIHt9CisKK3N0cnN0cmVhbWJ1ZiogaXN0cnN0cmVhbTo6cmRidWYoKSBjb25zdCB7CisgIHJldHVybiBfX0NPTlNUX0NBU1Qoc3Ryc3RyZWFtYnVmKiwmX01fYnVmKTsKK30KKworY2hhciogaXN0cnN0cmVhbTo6c3RyKCkgeyByZXR1cm4gX01fYnVmLnN0cigpOyB9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ2xhc3Mgb3N0cnN0cmVhbQorCitvc3Ryc3RyZWFtOjpvc3Ryc3RyZWFtKCkKKyAgOiBiYXNpY19vc3RyZWFtPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4oMCksIF9NX2J1ZigpIHsKKyAgYmFzaWNfaW9zPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID46OmluaXQoJl9NX2J1Zik7Cit9CisKK29zdHJzdHJlYW06Om9zdHJzdHJlYW0oY2hhciogcywgaW50IG4sIGlvc19iYXNlOjpvcGVubW9kZSBtb2RlKQorICA6IGJhc2ljX29zdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPigwKSwKKyAgICBfTV9idWYocywgbiwgbW9kZSAmIGlvc19iYXNlOjphcHAgPyBzICsgc3RybGVuKHMpIDogcykgeworICBiYXNpY19pb3M8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPjo6aW5pdCgmX01fYnVmKTsKK30KKworb3N0cnN0cmVhbTo6fm9zdHJzdHJlYW0oKSB7fQorCitzdHJzdHJlYW1idWYqIG9zdHJzdHJlYW06OnJkYnVmKCkgY29uc3QgeworICByZXR1cm4gX19DT05TVF9DQVNUKHN0cnN0cmVhbWJ1ZiosJl9NX2J1Zik7Cit9CisKK3ZvaWQgb3N0cnN0cmVhbTo6ZnJlZXplKGJvb2wgZnJlZXplZmxhZykgeworICBfTV9idWYuZnJlZXplKGZyZWV6ZWZsYWcpOworfQorCitjaGFyKiBvc3Ryc3RyZWFtOjpzdHIoKSB7CisgIHJldHVybiBfTV9idWYuc3RyKCk7Cit9CisKK2ludCBvc3Ryc3RyZWFtOjpwY291bnQoKSBjb25zdCB7CisgIHJldHVybiBfTV9idWYucGNvdW50KCk7Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDbGFzcyBzdHJzdHJlYW0KKworc3Ryc3RyZWFtOjpzdHJzdHJlYW0oKQorICA6IGJhc2ljX2lvc3RyZWFtPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4oMCksIF9NX2J1ZigpIHsKKyAgYmFzaWNfaW9zPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID46OmluaXQoJl9NX2J1Zik7Cit9CisKK3N0cnN0cmVhbTo6c3Ryc3RyZWFtKGNoYXIqIHMsIGludCBuLCBpb3NfYmFzZTo6b3Blbm1vZGUgbW9kZSkKKyAgOiBiYXNpY19pb3N0cmVhbTxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+KDApLAorICAgIF9NX2J1ZihzLCBuLCBtb2RlICYgaW9zX2Jhc2U6OmFwcCA/IHMgKyBzdHJsZW4ocykgOiBzKSB7CisgIGJhc2ljX2lvczxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+Ojppbml0KCZfTV9idWYpOworfQorCitzdHJzdHJlYW06On5zdHJzdHJlYW0oKSB7fQorCitzdHJzdHJlYW1idWYqIHN0cnN0cmVhbTo6cmRidWYoKSBjb25zdCB7CisgIHJldHVybiBfX0NPTlNUX0NBU1Qoc3Ryc3RyZWFtYnVmKiwmX01fYnVmKTsKK30KKwordm9pZCBzdHJzdHJlYW06OmZyZWV6ZShib29sIGZyZWV6ZWZsYWcpIHsKKyAgX01fYnVmLmZyZWV6ZShmcmVlemVmbGFnKTsKK30KKworaW50IHN0cnN0cmVhbTo6cGNvdW50KCkgY29uc3QgeworICByZXR1cm4gX01fYnVmLnBjb3VudCgpOworfQorCitjaGFyKiBzdHJzdHJlYW06OnN0cigpIHsKKyAgcmV0dXJuIF9NX2J1Zi5zdHIoKTsKK30KKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3JjL3RpbWVfZmFjZXRzLmNwcCBiL3NyYy90aW1lX2ZhY2V0cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U5OGM3MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aW1lX2ZhY2V0cy5jcHAKQEAgLTAsMCArMSw1NjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpbmNsdWRlICJzdGxwb3J0X3ByZWZpeC5oIgorCisjaW5jbHVkZSA8Y3N0ZGlvPgorI2luY2x1ZGUgPGxvY2FsZT4KKyNpbmNsdWRlIDxpc3RyZWFtPgorCisjaW5jbHVkZSAiY19sb2NhbGUuaCIKKyNpbmNsdWRlICJhY3F1aXJlX3JlbGVhc2UuaCIKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKworLy8gZGVmYXVsdCAiQyIgdmFsdWVzIGZvciBtb250aCBhbmQgZGF5IG5hbWVzCisKK2NvbnN0IGNoYXIgZGVmYXVsdF9kYXluYW1lW11bMTRdID0geworICAiU3VuIiwgIk1vbiIsICJUdWUiLCAiV2VkIiwgIlRodSIsICJGcmkiLCAiU2F0IiwKKyAgIlN1bmRheSIsICJNb25kYXkiLCAiVHVlc2RheSIsICJXZWRuZXNkYXkiLCAiVGh1cnNkYXkiLAorICAiRnJpZGF5IiwgIlNhdHVyZGF5In07CisKK2NvbnN0IGNoYXIgZGVmYXVsdF9tb250aG5hbWVbXVsyNF0gPSB7CisgICJKYW4iLCAiRmViIiwgIk1hciIsICJBcHIiLCAiTWF5IiwgIkp1biIsCisgICJKdWwiLCAiQXVnIiwgIlNlcCIsICJPY3QiLCAiTm92IiwgIkRlYyIsCisgICJKYW51YXJ5IiwgIkZlYnJ1YXJ5IiwgIk1hcmNoIiwgIkFwcmlsIiwgIk1heSIsICJKdW5lIiwKKyAgIkp1bHkiLCAiQXVndXN0IiwgIlNlcHRlbWJlciIsICJPY3RvYmVyIiwgIk5vdmVtYmVyIiwgIkRlY2VtYmVyIn07CisKKyNpZm5kZWYgX1NUTFBfTk9fV0NIQVJfVAorY29uc3Qgd2NoYXJfdCBkZWZhdWx0X3dkYXluYW1lW11bMTRdID0geworICBMIlN1biIsIEwiTW9uIiwgTCJUdWUiLCBMIldlZCIsIEwiVGh1IiwgTCJGcmkiLCBMIlNhdCIsCisgIEwiU3VuZGF5IiwgTCJNb25kYXkiLCBMIlR1ZXNkYXkiLCBMIldlZG5lc2RheSIsIEwiVGh1cnNkYXkiLAorICBMIkZyaWRheSIsIEwiU2F0dXJkYXkifTsKKworY29uc3Qgd2NoYXJfdCBkZWZhdWx0X3dtb250aG5hbWVbXVsyNF0gPSB7CisgIEwiSmFuIiwgTCJGZWIiLCBMIk1hciIsIEwiQXByIiwgTCJNYXkiLCBMIkp1biIsCisgIEwiSnVsIiwgTCJBdWciLCBMIlNlcCIsIEwiT2N0IiwgTCJOb3YiLCBMIkRlYyIsCisgIEwiSmFudWFyeSIsIEwiRmVicnVhcnkiLCBMIk1hcmNoIiwgTCJBcHJpbCIsIEwiTWF5IiwgTCJKdW5lIiwKKyAgTCJKdWx5IiwgTCJBdWd1c3QiLCBMIlNlcHRlbWJlciIsIEwiT2N0b2JlciIsIEwiTm92ZW1iZXIiLCBMIkRlY2VtYmVyIn07CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fQk9STEFORENfXykKK19UaW1lX0luZm8gdGltZV9pbml0PGNoYXI+OjpfTV90aW1laW5mbzsKKyMgIGlmbmRlZiBfU1RMUF9OT19XQ0hBUl9UCitfV1RpbWVfSW5mbyB0aW1lX2luaXQ8d2NoYXJfdD46Ol9NX3RpbWVpbmZvOworIyAgZW5kaWYKKyNlbmRpZgorCisvLyBfSW5pdF90aW1lX2luZm86IGluaXRpYWxpemUgdGFibGUgd2l0aAorLy8gIkMiIHZhbHVlcyAobm90ZSB0aGVzZSBhcmUgbm90IGRlZmluZWQgaW4gdGhlIEMgc3RhbmRhcmQsIHNvIHRoaXMKKy8vIGlzIHNvbWV3aGF0IGFyYml0cmFyeSkuCisKK3N0YXRpYyB2b2lkIF9Jbml0X3RpbWVpbmZvX2Jhc2UoX1RpbWVfSW5mb19CYXNlJiB0YWJsZSkgeworICB0YWJsZS5fTV90aW1lX2Zvcm1hdCA9ICIlSDolTTolUyI7CisgIHRhYmxlLl9NX2RhdGVfZm9ybWF0ID0gIiVtLyVkLyV5IjsKKyAgdGFibGUuX01fZGF0ZV90aW1lX2Zvcm1hdCA9ICIlbS8lZC8leSI7Cit9CisKK3N0YXRpYyB2b2lkIF9Jbml0X3RpbWVpbmZvKF9UaW1lX0luZm8mIHRhYmxlKSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgMTQ7ICsraSkKKyAgICB0YWJsZS5fTV9kYXluYW1lW2ldID0gZGVmYXVsdF9kYXluYW1lW2ldOworICBmb3IgKGkgPSAwOyBpIDwgMjQ7ICsraSkKKyAgICB0YWJsZS5fTV9tb250aG5hbWVbaV0gPSBkZWZhdWx0X21vbnRobmFtZVtpXTsKKyAgdGFibGUuX01fYW1fcG1bMF0gPSAiQU0iOworICB0YWJsZS5fTV9hbV9wbVsxXSA9ICJQTSI7CisgIF9Jbml0X3RpbWVpbmZvX2Jhc2UodGFibGUpOworfQorCisjaWZuZGVmIF9TVExQX05PX1dDSEFSX1QKK3N0YXRpYyB2b2lkIF9Jbml0X3RpbWVpbmZvKF9XVGltZV9JbmZvJiB0YWJsZSkgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IDE0OyArK2kpCisgICAgdGFibGUuX01fZGF5bmFtZVtpXSA9IGRlZmF1bHRfd2RheW5hbWVbaV07CisgIGZvciAoaSA9IDA7IGkgPCAyNDsgKytpKQorICAgIHRhYmxlLl9NX21vbnRobmFtZVtpXSA9IGRlZmF1bHRfd21vbnRobmFtZVtpXTsKKyAgdGFibGUuX01fYW1fcG1bMF0gPSBMIkFNIjsKKyAgdGFibGUuX01fYW1fcG1bMV0gPSBMIlBNIjsKKyAgX0luaXRfdGltZWluZm9fYmFzZSh0YWJsZSk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgX0luaXRfdGltZWluZm9fYmFzZShfVGltZV9JbmZvX0Jhc2UmIHRhYmxlLCBfTG9jYWxlX3RpbWUgKiB0aW1lKSB7CisgIHRhYmxlLl9NX3RpbWVfZm9ybWF0ID0gX0xvY2FsZV90X2ZtdCh0aW1lKTsKKyAgaWYgKCB0YWJsZS5fTV90aW1lX2Zvcm1hdCA9PSAiJVQiICkgeworICAgIHRhYmxlLl9NX3RpbWVfZm9ybWF0ID0gIiVIOiVNOiVTIjsKKyAgfSBlbHNlIGlmICggdGFibGUuX01fdGltZV9mb3JtYXQgPT0gIiVyIiApIHsKKyAgICB0YWJsZS5fTV90aW1lX2Zvcm1hdCA9ICIlSTolTTolUyAlcCI7CisgIH0gZWxzZSBpZiAoIHRhYmxlLl9NX3RpbWVfZm9ybWF0ID09ICIlUiIgKSB7CisgICAgdGFibGUuX01fdGltZV9mb3JtYXQgPSAiJUg6JU0iOworICB9CisgIHRhYmxlLl9NX2RhdGVfZm9ybWF0ID0gX0xvY2FsZV9kX2ZtdCh0aW1lKTsKKyAgdGFibGUuX01fZGF0ZV90aW1lX2Zvcm1hdCA9IF9Mb2NhbGVfZF90X2ZtdCh0aW1lKTsKKyAgdGFibGUuX01fbG9uZ19kYXRlX2Zvcm1hdCA9IF9Mb2NhbGVfbG9uZ19kX2ZtdCh0aW1lKTsKKyAgdGFibGUuX01fbG9uZ19kYXRlX3RpbWVfZm9ybWF0ID0gX0xvY2FsZV9sb25nX2RfdF9mbXQodGltZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9Jbml0X3RpbWVpbmZvKF9UaW1lX0luZm8mIHRhYmxlLCBfTG9jYWxlX3RpbWUgKiB0aW1lKSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgNzsgKytpKQorICAgIHRhYmxlLl9NX2RheW5hbWVbaV0gPSBfTG9jYWxlX2FiYnJldl9kYXlvZndlZWsodGltZSwgaSk7CisgIGZvciAoaSA9IDA7IGkgPCA3OyArK2kpCisgICAgdGFibGUuX01fZGF5bmFtZVtpKzddID0gX0xvY2FsZV9mdWxsX2RheW9md2Vlayh0aW1lLCBpKTsKKyAgZm9yIChpID0gMDsgaSA8IDEyOyArK2kpCisgICAgdGFibGUuX01fbW9udGhuYW1lW2ldID0gX0xvY2FsZV9hYmJyZXZfbW9udGhuYW1lKHRpbWUsIGkpOworICBmb3IgKGkgPSAwOyBpIDwgMTI7ICsraSkKKyAgICB0YWJsZS5fTV9tb250aG5hbWVbaSsxMl0gPSBfTG9jYWxlX2Z1bGxfbW9udGhuYW1lKHRpbWUsIGkpOworICB0YWJsZS5fTV9hbV9wbVswXSA9IF9Mb2NhbGVfYW1fc3RyKHRpbWUpOworICB0YWJsZS5fTV9hbV9wbVsxXSA9IF9Mb2NhbGVfcG1fc3RyKHRpbWUpOworICBfSW5pdF90aW1laW5mb19iYXNlKHRhYmxlLCB0aW1lKTsKK30KKworI2lmbmRlZiBfU1RMUF9OT19XQ0hBUl9UCitzdGF0aWMgdm9pZCBfSW5pdF90aW1laW5mbyhfV1RpbWVfSW5mbyYgdGFibGUsIF9Mb2NhbGVfdGltZSAqIHRpbWUpIHsKKyAgd2NoYXJfdCBidWZbMTI4XTsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCA3OyArK2kpCisgICAgdGFibGUuX01fZGF5bmFtZVtpXSA9IF9XTG9jYWxlX2FiYnJldl9kYXlvZndlZWsodGltZSwgaSwgX1NUTFBfQVJSQVlfQU5EX1NJWkUoYnVmKSk7CisgIGZvciAoaSA9IDA7IGkgPCA3OyArK2kpCisgICAgdGFibGUuX01fZGF5bmFtZVtpKzddID0gX1dMb2NhbGVfZnVsbF9kYXlvZndlZWsodGltZSwgaSwgX1NUTFBfQVJSQVlfQU5EX1NJWkUoYnVmKSk7CisgIGZvciAoaSA9IDA7IGkgPCAxMjsgKytpKQorICAgIHRhYmxlLl9NX21vbnRobmFtZVtpXSA9IF9XTG9jYWxlX2FiYnJldl9tb250aG5hbWUodGltZSwgaSwgX1NUTFBfQVJSQVlfQU5EX1NJWkUoYnVmKSk7CisgIGZvciAoaSA9IDA7IGkgPCAxMjsgKytpKQorICAgIHRhYmxlLl9NX21vbnRobmFtZVtpKzEyXSA9IF9XTG9jYWxlX2Z1bGxfbW9udGhuYW1lKHRpbWUsIGksIF9TVExQX0FSUkFZX0FORF9TSVpFKGJ1ZikpOworICB0YWJsZS5fTV9hbV9wbVswXSA9IF9XTG9jYWxlX2FtX3N0cih0aW1lLCBfU1RMUF9BUlJBWV9BTkRfU0laRShidWYpKTsKKyAgdGFibGUuX01fYW1fcG1bMV0gPSBfV0xvY2FsZV9wbV9zdHIodGltZSwgX1NUTFBfQVJSQVlfQU5EX1NJWkUoYnVmKSk7CisgIF9Jbml0X3RpbWVpbmZvX2Jhc2UodGFibGUsIHRpbWUpOworfQorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2gsIGNsYXNzIF9UaW1lSW5mbz4KK3ZvaWQgX19zdWJmb3JtYXQoX1NUTFBfQkFTSUNfSU9TVFJJTkcoX0NoKSAmYnVmLCBjb25zdCBjdHlwZTxfQ2g+JiBjdCwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBmb3JtYXQsIGNvbnN0IF9UaW1lSW5mbyYgdGFibGUsIGNvbnN0IHRtKiB0KSB7CisgIGNvbnN0IGNoYXIgKiBjcCA9IGZvcm1hdC5kYXRhKCk7CisgIGNvbnN0IGNoYXIgKiBjcF9lbmQgPSBjcCArIGZvcm1hdC5zaXplKCk7CisgIHdoaWxlIChjcCAhPSBjcF9lbmQpIHsKKyAgICBpZiAoKmNwID09ICclJykgeworICAgICAgY2hhciBtb2QgPSAwOworICAgICAgKytjcDsKKyAgICAgIGlmICgqY3AgPT0gJyMnKSB7CisgICAgICAgIG1vZCA9ICpjcDsgKytjcDsKKyAgICAgIH0KKyAgICAgIF9fd3JpdGVfZm9ybWF0dGVkX3RpbWVUKGJ1ZiwgY3QsICpjcCsrLCBtb2QsIHRhYmxlLCB0KTsKKyAgICB9IGVsc2UKKyAgICAgIGJ1Zi5hcHBlbmQoMSwgKmNwKyspOworICB9Cit9CisKK3N0YXRpYyB2b2lkIF9fYXBwZW5kKF9faW9zdHJpbmcgJmJ1ZiwgY29uc3Qgc3RyaW5nJiBuYW1lKQoreyBidWYuYXBwZW5kKG5hbWUuZGF0YSgpLCBuYW1lLmRhdGEoKSArIG5hbWUuc2l6ZSgpKTsgfQorCitzdGF0aWMgdm9pZCBfX2FwcGVuZChfX2lvd3N0cmluZyAmYnVmLCBjb25zdCB3c3RyaW5nJiBuYW1lKQoreyBidWYuYXBwZW5kKG5hbWUuZGF0YSgpLCBuYW1lLmRhdGEoKSArIG5hbWUuc2l6ZSgpKTsgfQorCitzdGF0aWMgdm9pZCBfX2FwcGVuZChfX2lvc3RyaW5nICZidWYsIGNoYXIgKmZpcnN0LCBjaGFyICpsYXN0LCBjb25zdCBjdHlwZTxjaGFyPiYgLyogY3QgKi8pCit7IGJ1Zi5hcHBlbmQoZmlyc3QsIGxhc3QpOyB9CisKK3N0YXRpYyB2b2lkIF9fYXBwZW5kKF9faW93c3RyaW5nICZidWYsIGNoYXIgKmZpcnN0LCBjaGFyICpsYXN0LCBjb25zdCBjdHlwZTx3Y2hhcl90PiYgY3QpIHsKKyAgd2NoYXJfdCBfd2J1Zls2NF07CisgIGN0LndpZGVuKGZpcnN0LCBsYXN0LCBfd2J1Zik7CisgIGJ1Zi5hcHBlbmQoX3didWYsIF93YnVmICsgKGxhc3QgLSBmaXJzdCkpOworfQorCisjaWYgZGVmaW5lZCAoX19HTlVDX18pCisvKiBUaGUgbnVtYmVyIG9mIGRheXMgZnJvbSB0aGUgZmlyc3QgZGF5IG9mIHRoZSBmaXJzdCBJU08gd2VlayBvZiB0aGlzCisgICB5ZWFyIHRvIHRoZSB5ZWFyIGRheSBZREFZIHdpdGggd2VlayBkYXkgV0RBWS4gIElTTyB3ZWVrcyBzdGFydCBvbgorICAgTW9uZGF5OyB0aGUgZmlyc3QgSVNPIHdlZWsgaGFzIHRoZSB5ZWFyJ3MgZmlyc3QgVGh1cnNkYXkuICBZREFZIG1heQorICAgYmUgYXMgc21hbGwgYXMgWURBWV9NSU5JTVVNLiAgKi8KKyMgIGRlZmluZSBfX0lTT19XRUVLX1NUQVJUX1dEQVkgMSAvKiBNb25kYXkgKi8KKyMgIGRlZmluZSBfX0lTT19XRUVLMV9XREFZIDQgLyogVGh1cnNkYXkgKi8KKyMgIGRlZmluZSBfX1lEQVlfTUlOSU1VTSAoLTM2NikKKyMgIGRlZmluZSBfX1RNX1lFQVJfQkFTRSAxOTAwCitzdGF0aWMgaW50CitfX2lzb193ZWVrX2RheXMoaW50IHlkYXksIGludCB3ZGF5KSB7CisgIC8qIEFkZCBlbm91Z2ggdG8gdGhlIGZpcnN0IG9wZXJhbmQgb2YgJSB0byBtYWtlIGl0IG5vbm5lZ2F0aXZlLiAgKi8KKyAgaW50IGJpZ19lbm91Z2hfbXVsdGlwbGVfb2ZfNyA9ICgtX19ZREFZX01JTklNVU0gLyA3ICsgMikgKiA3OworICByZXR1cm4gKHlkYXkKKyAgICAgICAgICAtICh5ZGF5IC0gd2RheSArIF9fSVNPX1dFRUsxX1dEQVkgKyBiaWdfZW5vdWdoX211bHRpcGxlX29mXzcpICUgNworICAgICAgICAgICsgX19JU09fV0VFSzFfV0RBWSAtIF9fSVNPX1dFRUtfU1RBUlRfV0RBWSk7Cit9CisKKyMgIGRlZmluZSBfX2lzX2xlYXAoeWVhcilcCisgICgoeWVhcikgJSA0ID09IDAgJiYgKCh5ZWFyKSAlIDEwMCAhPSAwIHx8ICh5ZWFyKSAlIDQwMCA9PSAwKSkKKworI2VuZGlmCisKKyNkZWZpbmUgX19ob3VyMTIoaG91cikgXAorICAoKChob3VyKSAlIDEyID09IDApID8gKDEyKSA6IChob3VyKSAlIDEyKQorCisjaWYgIWRlZmluZWQgKF9TVExQX1VTRV9TQUZFX1NUUklOR19GVU5DVElPTlMpCisjICBkZWZpbmUgX1NUTFBfU1BSSU5URiBzcHJpbnRmCisjZWxzZQorIyAgZGVmaW5lIF9TVExQX1NQUklOVEYgc3ByaW50Zl9zCisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9DaCwgY2xhc3MgX1RpbWVJbmZvPgordm9pZCBfU1RMUF9DQUxMIF9fd3JpdGVfZm9ybWF0dGVkX3RpbWVUKF9TVExQX0JBU0lDX0lPU1RSSU5HKF9DaCkgJmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdHlwZTxfQ2g+JiBjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGZvcm1hdCwgY2hhciBtb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfVGltZUluZm8mIHRhYmxlLCBjb25zdCB0bSogdCkgeworICBjaGFyIF9idWZbNjRdOworICBjaGFyICpfYmVuZDsKKworICBzd2l0Y2ggKGZvcm1hdCkgeworICAgIGNhc2UgJ2EnOgorICAgICAgX19hcHBlbmQoYnVmLCB0YWJsZS5fTV9kYXluYW1lW3QtPnRtX3dkYXldKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnQSc6CisgICAgICBfX2FwcGVuZChidWYsIHRhYmxlLl9NX2RheW5hbWVbdC0+dG1fd2RheSArIDddKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnYic6CisgICAgICBfX2FwcGVuZChidWYsIHRhYmxlLl9NX21vbnRobmFtZVt0LT50bV9tb25dKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnQic6CisgICAgICBfX2FwcGVuZChidWYsIHRhYmxlLl9NX21vbnRobmFtZVt0LT50bV9tb24gKyAxMl0pOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdjJzoKKyAgICAgIF9fc3ViZm9ybWF0KGJ1ZiwgY3QsIChtb2RpZmllciAhPSAnIycpID8gdGFibGUuX01fZGF0ZV90aW1lX2Zvcm1hdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0YWJsZS5fTV9sb25nX2RhdGVfdGltZV9mb3JtYXQsIHRhYmxlLCB0KTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnZCc6CisgICAgICBfU1RMUF9TUFJJTlRGKF9idWYsIChtb2RpZmllciAhPSAnIycpID8gIiUuMmxkIiA6ICIlbGQiLCAobG9uZyl0LT50bV9tZGF5KTsKKyAgICAgIF9fYXBwZW5kKGJ1ZiwgX2J1ZiwgKChsb25nKXQtPnRtX21kYXkgPCAxMEwgJiYgbW9kaWZpZXIgPT0gJyMnKSA/IF9idWYgKyAxIDogX2J1ZiArIDIsIGN0KTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnZSc6CisgICAgICBfU1RMUF9TUFJJTlRGKF9idWYsICIlMmxkIiwgKGxvbmcpdC0+dG1fbWRheSk7CisgICAgICBfX2FwcGVuZChidWYsIF9idWYsIF9idWYgKyAyLCBjdCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ0gnOgorICAgICAgX1NUTFBfU1BSSU5URihfYnVmLCAobW9kaWZpZXIgIT0gJyMnKSA/ICIlLjJsZCIgOiAiJWxkIiwgKGxvbmcpdC0+dG1faG91cik7CisgICAgICBfX2FwcGVuZChidWYsIF9idWYsICgobG9uZyl0LT50bV9ob3VyIDwgMTBMICYmIG1vZGlmaWVyID09ICcjJykgPyBfYnVmICsgMSA6IF9idWYgKyAyLCBjdCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ0knOgorICAgICAgX1NUTFBfU1BSSU5URihfYnVmLCAobW9kaWZpZXIgIT0gJyMnKSA/ICIlLjJsZCIgOiAiJWxkIiwgKGxvbmcpX19ob3VyMTIodC0+dG1faG91cikpOworICAgICAgX19hcHBlbmQoYnVmLCBfYnVmLCAoKGxvbmcpX19ob3VyMTIodC0+dG1faG91cikgPCAxMEwgJiYgbW9kaWZpZXIgPT0gJyMnKSA/IF9idWYgKyAxIDogX2J1ZiArIDIsIGN0KTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnaic6CisgICAgICBfYmVuZCA9IF9fd3JpdGVfaW50ZWdlcihfYnVmLCAwLCAobG9uZykoKGxvbmcpdC0+dG1feWRheSArIDEpKTsKKyAgICAgIF9fYXBwZW5kKGJ1ZiwgX2J1ZiwgX2JlbmQsIGN0KTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnbSc6CisgICAgICBfU1RMUF9TUFJJTlRGKF9idWYsIChtb2RpZmllciAhPSAnIycpID8gIiUuMmxkIiA6ICIlbGQiLCAobG9uZyl0LT50bV9tb24gKyAxKTsKKyAgICAgIF9fYXBwZW5kKGJ1ZiwgX2J1ZiwgKChsb25nKSh0LT50bV9tb24gKyAxKSA8IDEwTCAmJiBtb2RpZmllciA9PSAnIycpID8gX2J1ZiArIDEgOiBfYnVmICsgMiwgY3QpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdNJzoKKyAgICAgIF9TVExQX1NQUklOVEYoX2J1ZiwgKG1vZGlmaWVyICE9ICcjJykgPyAiJS4ybGQiIDogIiVsZCIsIChsb25nKXQtPnRtX21pbik7CisgICAgICBfX2FwcGVuZChidWYsIF9idWYsICgobG9uZyl0LT50bV9taW4gPCAxMEwgJiYgbW9kaWZpZXIgPT0gJyMnKSA/IF9idWYgKyAxIDogX2J1ZiArIDIsIGN0KTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAncCc6CisgICAgICBfX2FwcGVuZChidWYsIHRhYmxlLl9NX2FtX3BtW3QtPnRtX2hvdXIgLyAxMl0pOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdTJzogLy8gcGFkIHdpdGggemVyb3MKKyAgICAgICBfU1RMUF9TUFJJTlRGKF9idWYsIChtb2RpZmllciAhPSAnIycpID8gIiUuMmxkIiA6ICIlbGQiLCAobG9uZyl0LT50bV9zZWMpOworICAgICAgIF9fYXBwZW5kKGJ1ZiwgX2J1ZiwgKChsb25nKXQtPnRtX3NlYyA8IDEwTCAmJiBtb2RpZmllciA9PSAnIycpID8gX2J1ZiArIDEgOiBfYnVmICsgMiwgY3QpOworICAgICAgIGJyZWFrOworCisgICAgY2FzZSAnVSc6CisgICAgICBfYmVuZCA9IF9fd3JpdGVfaW50ZWdlcihfYnVmLCAwLCBsb25nKCh0LT50bV95ZGF5IC0gdC0+dG1fd2RheSArIDcpIC8gNykpOworICAgICAgX19hcHBlbmQoYnVmLCBfYnVmLCBfYmVuZCwgY3QpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICd3JzoKKyAgICAgIF9iZW5kID0gX193cml0ZV9pbnRlZ2VyKF9idWYsIDAsIChsb25nKXQtPnRtX3dkYXkpOworICAgICAgX19hcHBlbmQoYnVmLCBfYnVmLCBfYmVuZCwgY3QpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdXJzoKKyAgICAgIF9iZW5kID0gX193cml0ZV9pbnRlZ2VyKF9idWYsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nKSh0LT50bV93ZGF5ID09IDAgPyAodC0+dG1feWRheSArIDEpIC8gNyA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodC0+dG1feWRheSArIDggLSB0LT50bV93ZGF5KSAvIDcpKTsKKyAgICAgIF9fYXBwZW5kKGJ1ZiwgX2J1ZiwgX2JlbmQsIGN0KTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSd4JzoKKyAgICAgIF9fc3ViZm9ybWF0KGJ1ZiwgY3QsIChtb2RpZmllciAhPSAnIycpID8gdGFibGUuX01fZGF0ZV9mb3JtYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdGFibGUuX01fbG9uZ19kYXRlX2Zvcm1hdCwgdGFibGUsIHQpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdYJzoKKyAgICAgIF9fc3ViZm9ybWF0KGJ1ZiwgY3QsIHRhYmxlLl9NX3RpbWVfZm9ybWF0LCB0YWJsZSwgdCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ3knOgorICAgICAgX2JlbmQgPSBfX3dyaXRlX2ludGVnZXIoX2J1ZiwgMCwgKGxvbmcpKChsb25nKSh0LT50bV95ZWFyICsgMTkwMCkgJSAxMDApKTsKKyAgICAgIF9fYXBwZW5kKGJ1ZiwgX2J1ZiwgX2JlbmQsIGN0KTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnWSc6CisgICAgICBfYmVuZCA9IF9fd3JpdGVfaW50ZWdlcihfYnVmLCAwLCAobG9uZykoKGxvbmcpdC0+dG1feWVhciArIDE5MDApKTsKKyAgICAgIF9fYXBwZW5kKGJ1ZiwgX2J1ZiwgX2JlbmQsIGN0KTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnJSc6CisgICAgICBidWYuYXBwZW5kKDEsIGN0LndpZGVuKCclJykpOworICAgICAgYnJlYWs7CisKKyNpZiBkZWZpbmVkIChfX0dOVUNfXykKKyAgICAgIC8vIGZicCA6IGF0IGxlYXN0IG9uIFNVTgorIyAgaWYgZGVmaW5lZCAoX1NUTFBfVU5JWCkgJiYgIWRlZmluZWQgKF9fbGludXhfXykKKyMgICAgZGVmaW5lIF9fVVNFX0JTRCAxCisjICBlbmRpZgorCisgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgKiAgICAgSkdTLCBoYW5kbGUgdmFyaW91cyBleHRlbnNpb25zICAgICAgICAqCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgY2FzZSAnaCc6IC8qIFBPU0lYLjIgZXh0ZW5zaW9uICovCisgICAgICAvLyBzYW1lIGFzICdiJywgYWJicmV2IG1vbnRoIG5hbWUKKyAgICAgIF9fYXBwZW5kKGJ1ZiwgdGFibGUuX01fbW9udGhuYW1lW3QtPnRtX21vbl0pOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnQyc6IC8qIFBPU0lYLjIgZXh0ZW5zaW9uICovCisgICAgICAvLyBzYW1lIGFzICdkJywgdGhlIGRheQorICAgICAgX1NUTFBfU1BSSU5URihfYnVmLCAiJTJsZCIsIChsb25nKXQtPnRtX21kYXkpOworICAgICAgX19hcHBlbmQoYnVmLCBfYnVmLCBfYnVmICsgMiwgY3QpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdEJzogLyogUE9TSVguMiBleHRlbnNpb24gKi8KKyAgICAgIC8vIHNhbWUgYXMgJ3gnCisgICAgICBfX3N1YmZvcm1hdChidWYsIGN0LCB0YWJsZS5fTV9kYXRlX2Zvcm1hdCwgdGFibGUsIHQpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdrJzogLyogR05VIGV4dGVuc2lvbiAqLworICAgICAgX1NUTFBfU1BSSU5URihfYnVmLCAiJTJsZCIsIChsb25nKXQtPnRtX2hvdXIpOworICAgICAgX19hcHBlbmQoYnVmLCBfYnVmLCBfYnVmICsgMiwgY3QpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdsJzogLyogR05VIGV4dGVuc2lvbiAqLworICAgICAgX1NUTFBfU1BSSU5URihfYnVmLCAiJTJsZCIsIChsb25nKXQtPnRtX2hvdXIgJSAxMik7CisgICAgICBfX2FwcGVuZChidWYsIF9idWYsIF9idWYgKyAyLCBjdCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ24nOiAvKiBQT1NJWC4yIGV4dGVuc2lvbiAqLworICAgICAgYnVmLmFwcGVuZCgxLCBjdC53aWRlbignXG4nKSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ1InOiAvKiBHTlUgZXh0ZW5zaW9uICovCisgICAgICBfX3N1YmZvcm1hdChidWYsIGN0LCAiJUg6JU0iLCB0YWJsZSwgdCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ3InOiAvKiBQT1NJWC4yIGV4dGVuc2lvbiAqLworICAgICAgX19zdWJmb3JtYXQoYnVmLCBjdCwgIiVJOiVNOiVTICVwIiwgdGFibGUsIHQpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdUJzogLyogUE9TSVguMiBleHRlbnNpb24uICAqLworICAgICAgX19zdWJmb3JtYXQoYnVmLCBjdCwgIiVIOiVNOiVTIiwgdGFibGUsIHQpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICd0JzogLyogUE9TSVguMiBleHRlbnNpb24uICAqLworICAgICAgYnVmLmFwcGVuZCgxLCBjdC53aWRlbignXHQnKSk7CisKKyAgICBjYXNlICd1JzogLyogUE9TSVguMiBleHRlbnNpb24uICAqLworICAgICAgX2JlbmQgPSBfX3dyaXRlX2ludGVnZXIoX2J1ZiwgMCwgbG9uZygodC0+dG1fd2RheSAtIDEgKyA3KSkgJSA3ICsgMSk7CisgICAgICBfX2FwcGVuZChidWYsIF9idWYsIF9iZW5kLCBjdCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ3MnOiB7CisgICAgICB0aW1lX3QgX190ID0gbWt0aW1lKF9fQ09OU1RfQ0FTVCh0bSosIHQpKTsKKyAgICAgIF9iZW5kID0gX193cml0ZV9pbnRlZ2VyKF9idWYsIDAsIChsb25nKV9fdCApOworICAgICAgX19hcHBlbmQoYnVmLCBfYnVmLCBfYmVuZCwgY3QpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgJ2cnOiAvKiBHTlUgZXh0ZW5zaW9uICovCisgICAgY2FzZSAnRyc6IHsKKyAgICAgIGludCB5ZWFyID0gdC0+dG1feWVhciArIF9fVE1fWUVBUl9CQVNFOworICAgICAgaW50IGRheXMgPSBfX2lzb193ZWVrX2RheXMgKHQtPnRtX3lkYXksIHQtPnRtX3dkYXkpOworICAgICAgaWYgKGRheXMgPCAwKSB7CisgICAgICAgIC8qIFRoaXMgSVNPIHdlZWsgYmVsb25ncyB0byB0aGUgcHJldmlvdXMgeWVhci4gICovCisgICAgICAgIHllYXItLTsKKyAgICAgICAgZGF5cyA9IF9faXNvX3dlZWtfZGF5cyAodC0+dG1feWRheSArICgzNjUgKyBfX2lzX2xlYXAgKHllYXIpKSwgdC0+dG1fd2RheSk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgaW50IGQgPSBfX2lzb193ZWVrX2RheXMgKHQtPnRtX3lkYXkgLSAoMzY1ICsgX19pc19sZWFwICh5ZWFyKSksIHQtPnRtX3dkYXkpOworICAgICAgICBpZiAoMCA8PSBkKSB7CisgICAgICAgICAgLyogVGhpcyBJU08gd2VlayBiZWxvbmdzIHRvIHRoZSBuZXh0IHllYXIuICAqLworICAgICAgICAgICsreWVhcjsKKyAgICAgICAgICBkYXlzID0gZDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgbG9uZyB2YWw7CisgICAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgICAgY2FzZSAnZyc6CisgICAgICAgIHZhbCA9IChsb25nKSh5ZWFyICUgMTAwICsgMTAwKSAlIDEwMDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdHJzoKKyAgICAgICAgdmFsID0gKGxvbmcpeWVhcjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB2YWwgPSAobG9uZylkYXlzIC8gNyArIDE7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgX2JlbmQgPSBfX3dyaXRlX2ludGVnZXIoX2J1ZiwgMCwgdmFsKTsKKyAgICAgIF9fYXBwZW5kKGJ1ZiwgX2J1ZiwgX2JlbmQsIGN0KTsKKyAgICAgIGJyZWFrOworICAgIH0KKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX0dMSUJDKQorICAgIGNhc2UgJ3onOiAgIC8qIEdOVSBleHRlbnNpb24uICAqLworICAgICAgaWYgKHQtPnRtX2lzZHN0IDwgMCkKKyAgICAgICAgYnJlYWs7CisgICAgICB7CisgICAgICAgIGludCBkaWZmOworIyAgICBpZiBkZWZpbmVkIChfX1VTRV9CU0QpIHx8IGRlZmluZWQgKF9fQkVPU19fKQorICAgICAgICBkaWZmID0gdC0+dG1fZ210b2ZmOworIyAgICBlbHNlCisgICAgICAgIGRpZmYgPSB0LT5fX3RtX2dtdG9mZjsKKyMgICAgZW5kaWYKKyAgICAgICAgaWYgKGRpZmYgPCAwKSB7CisgICAgICAgICAgYnVmLmFwcGVuZCgxLCBjdC53aWRlbignLScpKTsKKyAgICAgICAgICBkaWZmID0gLWRpZmY7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGJ1Zi5hcHBlbmQoMSwgY3Qud2lkZW4oJysnKSk7CisgICAgICAgIGRpZmYgLz0gNjA7CisgICAgICAgIF9TVExQX1NQUklOVEYoX2J1ZiwgIiUuNGQiLCAoZGlmZiAvIDYwKSAqIDEwMCArIGRpZmYgJSA2MCk7CisgICAgICAgIF9fYXBwZW5kKGJ1ZiwgX2J1ZiwgX2J1ZiArIDQsIGN0KTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisjICBlbmRpZiAvKiBfX0dMSUJDX18gKi8KKyNlbmRpZiAvKiBfX0dOVUNfXyAqLworCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3ZvaWQgX1NUTFBfQ0FMTCBfX3dyaXRlX2Zvcm1hdHRlZF90aW1lKF9faW9zdHJpbmcgJmJ1ZiwgY29uc3QgY3R5cGU8Y2hhcj4mIGN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBmb3JtYXQsIGNoYXIgbW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfVGltZV9JbmZvJiB0YWJsZSwgY29uc3QgdG0qIHQpCit7IF9fd3JpdGVfZm9ybWF0dGVkX3RpbWVUKGJ1ZiwgY3QsIGZvcm1hdCwgbW9kaWZpZXIsIHRhYmxlLCB0KTsgfQorCit2b2lkIF9TVExQX0NBTEwgX193cml0ZV9mb3JtYXR0ZWRfdGltZShfX2lvd3N0cmluZyAmYnVmLCBjb25zdCBjdHlwZTx3Y2hhcl90PiYgY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGZvcm1hdCwgY2hhciBtb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9XVGltZV9JbmZvJiB0YWJsZSwgY29uc3QgdG0qIHQpCit7IF9fd3JpdGVfZm9ybWF0dGVkX3RpbWVUKGJ1ZiwgY3QsIGZvcm1hdCwgbW9kaWZpZXIsIHRhYmxlLCB0KTsgfQorCitzdGF0aWMgdGltZV9iYXNlOjpkYXRlb3JkZXIgX19nZXRfZGF0ZV9vcmRlcihfTG9jYWxlX3RpbWUqIHRpbWUpIHsKKyAgY29uc3QgY2hhciAqIGZtdCA9IF9Mb2NhbGVfZF9mbXQodGltZSk7CisgIGNoYXIgZmlyc3QsIHNlY29uZCwgdGhpcmQ7CisKKyAgd2hpbGUgKCpmbXQgIT0gMCAmJiAqZm10ICE9ICclJykgKytmbXQ7CisgIGlmICgqZm10ID09IDApCisgICAgcmV0dXJuIHRpbWVfYmFzZTo6bm9fb3JkZXI7CisgIGZpcnN0ID0gKisrZm10OworICB3aGlsZSAoKmZtdCAhPSAwICYmICpmbXQgIT0gJyUnKSArK2ZtdDsKKyAgaWYgKCpmbXQgPT0gMCkKKyAgICByZXR1cm4gdGltZV9iYXNlOjpub19vcmRlcjsKKyAgc2Vjb25kID0gKisrZm10OworICB3aGlsZSAoKmZtdCAhPSAwICYmICpmbXQgIT0gJyUnKSArK2ZtdDsKKyAgaWYgKCpmbXQgPT0gMCkKKyAgICByZXR1cm4gdGltZV9iYXNlOjpub19vcmRlcjsKKyAgdGhpcmQgPSAqKytmbXQ7CisKKyAgc3dpdGNoIChmaXJzdCkgeworICAgIGNhc2UgJ2QnOgorICAgICAgcmV0dXJuIChzZWNvbmQgPT0gJ20nICYmIHRoaXJkID09ICd5JykgPyB0aW1lX2Jhc2U6OmRteQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0aW1lX2Jhc2U6Om5vX29yZGVyOworICAgIGNhc2UgJ20nOgorICAgICAgcmV0dXJuIChzZWNvbmQgPT0gJ2QnICYmIHRoaXJkID09ICd5JykgPyB0aW1lX2Jhc2U6Om1keQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0aW1lX2Jhc2U6Om5vX29yZGVyOworICAgIGNhc2UgJ3knOgorICAgICAgc3dpdGNoIChzZWNvbmQpIHsKKyAgICAgICAgY2FzZSAnZCc6CisgICAgICAgICAgcmV0dXJuIHRoaXJkID09ICdtJyA/IHRpbWVfYmFzZTo6eWRtIDogdGltZV9iYXNlOjpub19vcmRlcjsKKyAgICAgICAgY2FzZSAnbSc6CisgICAgICAgICAgcmV0dXJuIHRoaXJkID09ICdkJyA/IHRpbWVfYmFzZTo6eW1kIDogdGltZV9iYXNlOjpub19vcmRlcjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICByZXR1cm4gdGltZV9iYXNlOjpub19vcmRlcjsKKyAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIHRpbWVfYmFzZTo6bm9fb3JkZXI7CisgIH0KK30KKwordGltZV9pbml0PGNoYXI+Ojp0aW1lX2luaXQoKQorICA6IF9NX2RhdGVvcmRlcih0aW1lX2Jhc2U6Om5vX29yZGVyKQoreyBfSW5pdF90aW1laW5mbyhfTV90aW1laW5mbyk7IH0KKwordGltZV9pbml0PGNoYXI+Ojp0aW1lX2luaXQoY29uc3QgY2hhciogX19uYW1lKSB7CisgIGlmICghX19uYW1lKQorICAgIGxvY2FsZTo6X01fdGhyb3dfb25fbnVsbF9uYW1lKCk7CisKKyAgaW50IF9fZXJyX2NvZGU7CisgIGNoYXIgYnVmW19Mb2NhbGVfTUFYX1NJTVBMRV9OQU1FXTsKKyAgX0xvY2FsZV90aW1lICpfX3RpbWUgPSBfX2FjcXVpcmVfdGltZShfX25hbWUsIGJ1ZiwgMCwgJl9fZXJyX2NvZGUpOworICBpZiAoIV9fdGltZSkKKyAgICBsb2NhbGU6Ol9NX3Rocm93X29uX2NyZWF0aW9uX2ZhaWx1cmUoX19lcnJfY29kZSwgX19uYW1lLCAidGltZSIpOworCisgIF9Jbml0X3RpbWVpbmZvKHRoaXMtPl9NX3RpbWVpbmZvLCBfX3RpbWUpOworICBfTV9kYXRlb3JkZXIgPSBfX2dldF9kYXRlX29yZGVyKF9fdGltZSk7CisgIF9fcmVsZWFzZV90aW1lKF9fdGltZSk7Cit9CisKK3RpbWVfaW5pdDxjaGFyPjo6dGltZV9pbml0KF9Mb2NhbGVfdGltZSAqX190aW1lKSB7CisgIF9Jbml0X3RpbWVpbmZvKHRoaXMtPl9NX3RpbWVpbmZvLCBfX3RpbWUpOworICBfTV9kYXRlb3JkZXIgPSBfX2dldF9kYXRlX29yZGVyKF9fdGltZSk7Cit9CisKKyNpZm5kZWYgX1NUTFBfTk9fV0NIQVJfVAordGltZV9pbml0PHdjaGFyX3Q+Ojp0aW1lX2luaXQoKQorICA6IF9NX2RhdGVvcmRlcih0aW1lX2Jhc2U6Om5vX29yZGVyKQoreyBfSW5pdF90aW1laW5mbyhfTV90aW1laW5mbyk7IH0KKwordGltZV9pbml0PHdjaGFyX3Q+Ojp0aW1lX2luaXQoY29uc3QgY2hhciogX19uYW1lKSB7CisgIGlmICghX19uYW1lKQorICAgIGxvY2FsZTo6X01fdGhyb3dfb25fbnVsbF9uYW1lKCk7CisKKyAgaW50IF9fZXJyX2NvZGU7CisgIGNoYXIgYnVmW19Mb2NhbGVfTUFYX1NJTVBMRV9OQU1FXTsKKyAgX0xvY2FsZV90aW1lICpfX3RpbWUgPSBfX2FjcXVpcmVfdGltZShfX25hbWUsIGJ1ZiwgMCwgJl9fZXJyX2NvZGUpOworICBpZiAoIV9fdGltZSkKKyAgICBsb2NhbGU6Ol9NX3Rocm93X29uX2NyZWF0aW9uX2ZhaWx1cmUoX19lcnJfY29kZSwgX19uYW1lLCAidGltZSIpOworCisgIF9Jbml0X3RpbWVpbmZvKHRoaXMtPl9NX3RpbWVpbmZvLCBfX3RpbWUpOworICBfTV9kYXRlb3JkZXIgPSBfX2dldF9kYXRlX29yZGVyKF9fdGltZSk7CisgIF9fcmVsZWFzZV90aW1lKF9fdGltZSk7Cit9CisKK3RpbWVfaW5pdDx3Y2hhcl90Pjo6dGltZV9pbml0KF9Mb2NhbGVfdGltZSAqX190aW1lKSB7CisgIF9Jbml0X3RpbWVpbmZvKHRoaXMtPl9NX3RpbWVpbmZvLCBfX3RpbWUpOworICBfTV9kYXRlb3JkZXIgPSBfX2dldF9kYXRlX29yZGVyKF9fdGltZSk7Cit9CisjZW5kaWYKKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fRk9SQ0VfSU5TVEFOVElBVEUpCit0ZW1wbGF0ZSBjbGFzcyB0aW1lX2dldDxjaGFyLCBpc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4gPjsKK3RlbXBsYXRlIGNsYXNzIHRpbWVfcHV0PGNoYXIsIG9zdHJlYW1idWZfaXRlcmF0b3I8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiA+OworCisjICBpZm5kZWYgX1NUTFBfTk9fV0NIQVJfVAordGVtcGxhdGUgY2xhc3MgdGltZV9nZXQ8d2NoYXJfdCwgaXN0cmVhbWJ1Zl9pdGVyYXRvcjx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+ID47Cit0ZW1wbGF0ZSBjbGFzcyB0aW1lX3B1dDx3Y2hhcl90LCBvc3RyZWFtYnVmX2l0ZXJhdG9yPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4gPjsKKyMgIGVuZGlmCisKKyNlbmRpZgorCitfU1RMUF9FTkRfTkFNRVNQQUNFCmRpZmYgLS1naXQgYS9zcmMvd2FybmluZ19kaXNhYmxlLmggYi9zcmMvd2FybmluZ19kaXNhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YwYzFjOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy93YXJuaW5nX2Rpc2FibGUuaApAQCAtMCwwICsxLDYxIEBACisjaWYgIWRlZmluZWQgKF9fSUNMKQorLyogVGhpcyBoZWFkZXIgaXMgdXNlZCB0byB0dXJuIG9mZiB3YXJuaW5ncyBvZiBNaWNyb3NvZnQgY29tcGlsZXJzIGdlbmVyYXRlZC4KKyAqIHdoaWxlIGJ1aWxkaW5nIFNUTHBvcnQuCisgKiBGb3IgY29tcGlsaW5nIHVzZXIgY29kZSwgc2VlIHN0bHBvcnQvY29uZmlnL19tc3ZjX3dhcm5pbmdzX29mZi5oLgorICovCisKKyMgIGlmIChfTVNDX1ZFUiA8IDEzMDApIC8qIFZDNi9lVkM0ICovCisjICAgIHByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDA5NyApIC8qIHR5cGVkZWYtbmFtZSB1c2VkIGFzIGJhc2VkIGNsYXNzIG9mICguLi4pICovCisjICAgIHByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDI1MSApIC8qIERMTCBpbnRlcmZhY2UgbmVlZGVkICovCisjICAgIHByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDI4NCApIC8qIGZvciAtPiBvcGVyYXRvciAqLworIyAgICBwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQ1MDMgKSAvKiBkZWNvcmF0ZWQgbmFtZSBsZW5ndGggZXhjZWVkZWQsIG5hbWUgd2FzIHRydW5jYXRlZCAqLworIyAgICBwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQ1MTQgKSAvKiB1bnJlZmVyZW5jZWQgaW5saW5lIGZ1bmN0aW9uIGhhcyBiZWVuIHJlbW92ZWQgKi8KKyMgICAgcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0NjYwICkgLyogdGVtcGxhdGUtY2xhc3Mgc3BlY2lhbGl6YXRpb24gJy4uLicgaXMgYWxyZWFkeSBpbnN0YW50aWF0ZWQgKi8KKyMgICAgcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0NzAxICkgLyogbG9jYWwgdmFyaWFibGUgJ2Jhc2UnIG1heSBiZSB1c2VkIHdpdGhvdXQgaGF2aW5nIGJlZW4gaW5pdGlhbGl6ZWQgKi8KKyMgICAgcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0NzEwICkgLyogZnVuY3Rpb24gKC4uLikgbm90IGlubGluZWQgKi8KKyMgICAgcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0Nzg2ICkgLyogaWRlbnRpZmllciB0cnVuY2F0ZWQgdG8gMjU1IGNoYXJhY3RlcnMgKi8KKyMgIGVuZGlmCisKKyMgIGlmIChfTVNDX1ZFUiA8PSAxMzEwKQorIyAgICBwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQ1MTEgKSAvKiBjb3B5IGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBnZW5lcmF0ZWQgKi8KKyMgIGVuZGlmCisKKyMgIGlmIChfTVNDX1ZFUiA8IDEzMDApICYmIGRlZmluZWQgKFVOREVSX0NFKQorIyAgICBwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQyMDEgKSAvKiBub25zdGFuZGFyZCBleHRlbnNpb24gdXNlZCA6IG5hbWVsZXNzIHN0cnVjdC91bmlvbiAqLworIyAgICBwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQyMTQgKSAvKiBub25zdGFuZGFyZCBleHRlbnNpb24gdXNlZCA6IGJpdCBmaWVsZCB0eXBlcyBvdGhlciB0aGFuIGludCAqLworIyAgZW5kaWYKKworLyogU3VwcHJlc3Mgd2FybmluZ3MgZW1pdHRlZCBmcm9tIFdpbmRvd3MgQ0UgU0RLIGhlYWRlcnMuICovCisjICBpZiAoX01TQ19WRVIgPj0gMTQwMCkgJiYgZGVmaW5lZCAoVU5ERVJfQ0UpCisjICAgIHByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDExNSApICAvKiBOYW1lZCB0eXBlIGRlZmluaXRpb24gaW4gcGFyZW50aGVzZXMuICovCisjICAgIHByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDIwMSApICAvKiBOYW1lbGVzcyBzdHJ1Y3QvdW5pb24uICovCisjICAgIHByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDIxNCApICAvKiBCaXQgZmllbGQgdHlwZXMgb3RoZXIgdGhhbiBpbnQuICovCisjICAgIHByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDI5MCApICAvKiBDKysgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24gaWdub3JlZC4gKi8KKyMgICAgcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0NDMwICkgIC8qIE1pc3NpbmcgdHlwZSBzcGVjaWZpZXIsIGludCBhc3N1bWVkLiAqLworIyAgICBwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQ0MzEgKSAgLyogTWlzc2luZyB0eXBlIHNwZWNpZmllciwgaW50IGFzc3VtZWQuICovCisjICBlbmRpZgorCisjICBwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQwNzUgKSAvKiBpbml0aWFsaXplcnMgcHV0IGluIHVucmVjb2duaXplZCBpbml0aWFsaXphdGlvbiBhcmVhICovCisvKiBUaGlzIHdhcm5pbmcgaXMgZGlzYWJsZSBvbmx5IGZvciB0aGUgY19sb2NhbGVfd2luMzIuYyBmaWxlIGNvbXBpbGF0aW9uOiAgKi8KKyMgIHByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDEwMCApIC8qIHVucmVmZXJlbmNlZCBmb3JtYWwgcGFyYW1ldGVyICovCisjICBwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQxMjcgKSAvKiBjb25kaXRpb25hbCBleHByZXNzaW9uIGlzIGNvbnN0YW50ICovCisjICBwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQxNDYgKSAvKiB1bmFyeSBtaW51cyBhcHBsaWVkIHRvIHVuc2lnbmVkIHR5cGUgKi8KKyMgIHByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDI0NSApIC8qIGNvbnZlcnNpb24gZnJvbSAnZW51bSAnIHRvICd1bnNpZ25lZCBpbnQnLCBzaWduZWQvdW5zaWduZWQgbWlzbWF0Y2ggKi8KKyMgIHByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDI0NCApIC8qIGltcGxpY2l0IGNvbnZlcnNpb246IHBvc3NpYmxlIGxvc3Mgb2YgZGF0YSAqLworIyAgcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0NTEyICkgLyogYXNzaWdubWVudCBvcGVyYXRvciBjb3VsZCBub3QgYmUgZ2VuZXJhdGVkICovCisjICBwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQ1NzEgKSAvKiBjYXRjaCguLi4pIGJsb2NrcyBjb21waWxlZCB3aXRoIC9FSHMgZG8gbm90IGNhdGNoIG9yIHJlLXRocm93IFN0cnVjdHVyZWQgRXhjZXB0aW9ucyAqLworIyAgcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0NzAyICkgLyogdW5yZWFjaGFibGUgY29kZSAoYXBwZWFycyBpbiByZWxlYXNlIHdpdGggd2FybmluZyBsZXZlbDQpICovCisjZWxzZQorIyAgcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA2OSApICAgLyogaW50ZWdlciBjb252ZXJzaW9uIHJlc3VsdGVkIGluIHRydW5jYXRpb24gKi8KKyMgIHByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogMTc0ICkgIC8qIGV4cHJlc3Npb24gaGFzIG5vIGVmZmVjdCAqLworIyAgcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiAyNzkgKSAgLyogY29udHJvbGluZyBleHByZXNzaW9uIGlzIGNvbnN0YW50ICovCisjICBwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDM4MyApICAvKiByZWZlcmVuY2UgdG8gdGVtcG9yYXJ5IHVzZWQgKi8KKyMgIHByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDQ0ICkgIC8qIGRlc3RydWN0b3IgZm9yIGJhc2UgY2xhc3MgIi4uLiIgaXMgbm90IHZpcnR1YWwqLworIyAgcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA4MTAgKSAgLyogY29udmVyc2lvbiBmcm9tICJpbnQiIHRvICJjaGFyIiBtYXkgbG9zZSBzaWduaWZpY2FudCBiaXRzICovCisjICBwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDk4MSApICAvKiBvcGVyYW5kcyBhcmUgZXZhbHVhdGVkIGluIHVuc3BlY2lmaWVkIG9yZGVyICovCisjICBwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDE0MTggKSAvKiBleHRlcm5hbCBkZWZpbml0aW9uIHdpdGggbm8gcHJpb3IgZGVjbGFyYXRpb24gKi8KKyMgIHByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogMTQxOSApIC8qIGV4dGVybmFsIGRlY2xhcmF0aW9uIGluIHByaW1hcnkgc291cmNlIGZpbGUgKi8KKyMgIHByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogMTU3MiApIC8qIGZsb2F0aW5nLXBvaW50IGVxdWFsaXR5IGFuZCBpbmVxdWFsaXR5IGNvbXBhcmlzb25zIGFyZSB1bnJlbGlhYmxlICovCisjICBwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDE2ODIgKSAvKiBpbXBsaWNpdCBjb252ZXJzaW9uIG9mIGEgNjQtYml0IGludGVncmFsIHR5cGUgdG8gYSBzbWFsbGVyIGludGVncmFsIHR5cGUgKi8KKyMgIHByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogMTY4MyApIC8qIGV4cGxpY2l0IGNvbnZlcnNpb24gb2YgYSA2NC1iaXQgaW50ZWdyYWwgdHlwZSB0byBhIHNtYWxsZXIgaW50ZWdyYWwgdHlwZSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9zc3RyZWFtIGIvc3N0cmVhbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJiMzI1ZS4uMDAwMDAwMAotLS0gYS9zc3RyZWFtCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLS8vIFRoaXMgaGVhZGVyIGRlZmluZXMgY2xhc3NlcyBiYXNpY19zdHJpbmdidWYsIGJhc2ljX2lzdHJpbmdzdHJlYW0sCi0vLyBiYXNpY19vc3RyaW5nc3RyZWFtLCBhbmQgYmFzaWNfc3RyaW5nc3RyZWFtLiAgVGhlc2UgY2xhc3NlcwotLy8gcmVwcmVzZW50IHN0cmVhbXNidWZzIGFuZCBzdHJlYW1zIHdob3NlIHNvdXJjZXMgb3IgZGVzdGluYXRpb25zIGFyZQotLy8gQysrIHN0cmluZ3MuCi0KLSNpZm5kZWYgX1NUTFBfU1NUUkVBTQotI2RlZmluZSBfU1RMUF9TU1RSRUFNCi0KLSNpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAotIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHgxMDU5Ci0jICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgotI2VuZGlmCi0KLSNpZmRlZiBfU1RMUF9QUkFHTUFfT05DRQotIyAgcHJhZ21hIG9uY2UKLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RsL19pb3NlcnIuaD4KLQotI2luY2x1ZGUgPHN0bC9fc3N0cmVhbS5oPgotCi0jaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgxMDU5KQotIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KLSMgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKLSNlbmRpZgotCi0jZW5kaWYgLyogX1NUTFBfU1NUUkVBTSAqLwotCi0vLyBMb2NhbCBWYXJpYWJsZXM6Ci0vLyBtb2RlOkMrKwotLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RhY2sgYi9zdGFjawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE5MTA2Yi4uMDAwMDAwMAotLS0gYS9zdGFjaworKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk0Ci0gKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3Ci0gKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTcKLSAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0jaWZuZGVmIF9TVExQX1NUQUNLCi0jZGVmaW5lIF9TVExQX1NUQUNLCi0KLSNpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAotIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHg2MAotIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KLSNlbmRpZgotCi0jaWZkZWYgX1NUTFBfUFJBR01BX09OQ0UKLSMgIHByYWdtYSBvbmNlCi0jZW5kaWYKLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9TVEFDS19ICi0jICBpbmNsdWRlIDxzdGwvX3N0YWNrLmg+Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9TVExQX0lNUE9SVF9WRU5ET1JfU1REKQotIyAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfSEVBREVSKHN0YWNrKQotI2VuZGlmCi0KLSNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDYwKQotIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KLSMgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKLSNlbmRpZgotCi0jZW5kaWYgLyogX1NUTFBfU1RBQ0sgKi8KLQotLy8gTG9jYWwgVmFyaWFibGVzOgotLy8gbW9kZTpDKysKLS8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0ZGFyZy5oIGIvc3RkYXJnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NjA1Y2MuLjAwMDAwMDAKLS0tIGEvc3RkYXJnLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLQotLyogV29ya2Fyb3VuZCBmb3IgYSAibWlzYmVoYXZpb3VyIiB3aGVuIGNvbXBpbGluZyByZXNvdXJjZSBzY3JpcHRzIHVzaW5nCi0gKiBlTWJlZGRlZCBWaXN1YWwgQysrLiBUaGUgc3RhbmRhcmQgLnJjIGZpbGUgaW5jbHVkZXMgd2luZG93cyBoZWFkZXIgZmlsZXMsCi0gKiB3aGljaCBpbiB0dXJuIGluY2x1ZGUgc3RkYXJnLmgsIHdoaWNoIHJlc3VsdHMgaW4gd2FybmluZ3MgYW5kIGVycm9ycwotICovCi0jaWYgIWRlZmluZWQgKFJDX0lOVk9LRUQpCi0KLSMgIGlmICFkZWZpbmVkIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEKQotIyAgICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDI2MQotIyAgICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgotIyAgZWxpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDI2MSkgJiYgIWRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKLSMgICAgZGVmaW5lIF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRAotIyAgZW5kaWYKLQotIyAgaWYgZGVmaW5lZChfU1RMUF9XQ0VfRVZDMykKLXN0cnVjdCBfZXhjZXB0aW9uOwotIyAgZW5kaWYKLQotIyAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ19IRUFERVIoc3RkYXJnLmgpCi0KLSMgIGlmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MjYxKQotIyAgICBpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQotIyAgICAgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+Ci0jICAgICAgdW5kZWYgIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKLSMgICAgZWxzZQotIyAgICAgIHVuZGVmICBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKLSMgICAgZW5kaWYKLSMgIGVuZGlmCi0jZW5kaWYgLyogUkNfSU5WT0tFRCAqLwpkaWZmIC0tZ2l0IGEvc3RkZGVmLmggYi9zdGRkZWYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFjNDQ5Zi4uMDAwMDAwMAotLS0gYS9zdGRkZWYuaAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0jaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKLSMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MjYyCi0jICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgotI2VsaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgyNjIpICYmICEgZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQotIyAgZGVmaW5lIF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRAotI2VuZGlmCi0KLSMgIGlmIGRlZmluZWQgKF9NU0NfVkVSKSB8fCBkZWZpbmVkIChfX0RNQ19fKQotLyogTmF0aXZlIHN0ZGRlZi5oIGNvbnRhaW5zIGVycm5vIG1hY3JvIGRlZmluaXRpb24gbWFraW5nIGluY2x1c2lvbiBvZiBuYXRpdmUKLSAqIGVycm5vLmggaW4gU1RMcG9ydCBlcnJuby5oIGltcG9zc2libGUuIFdlIGFyZSB0aGVuIGZvcmNlZCB0byBpbmNsdWRlIGVycm5vLmgKLSAqIGZpcnN0LgotICovCi0jICAgIGluY2x1ZGUgImVycm5vLmgiCi0jICBlbmRpZgotCi0jICBpbmNsdWRlIF9TVExQX05BVElWRV9DX0hFQURFUihzdGRkZWYuaCkKLQotI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MjYyKQotIyAgaWYgISBkZWZpbmVkIChfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQpCi0jICAgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+Ci0jICAgIHVuZGVmICBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECi0jICBlbHNlCi0jICAgIHVuZGVmICBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKLSMgIGVuZGlmCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvc3RkZXhjZXB0IGIvc3RkZXhjZXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDAzMzFmLi4wMDAwMDAwCi0tLSBhL3N0ZGV4Y2VwdAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NwotICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLQotI2lmbmRlZiBfU1RMUF9TVERFWENFUFQKLQotI2lmICFkZWZpbmVkIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEKQotIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHg2MwotIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KLSNlbGlmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4NjMpICYmICEgZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQotIyAgZGVmaW5lIF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRAotIyAgZGVmaW5lIF9TVExQX1NUREVYQ0VQVAotI2VuZGlmCi0KLSNpZmRlZiBfU1RMUF9QUkFHTUFfT05DRQotIyAgcHJhZ21hIG9uY2UKLSNlbmRpZgotCi0jaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgIT0gMHg2MykgfHwgZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQotIyAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfSEVBREVSKHN0ZGV4Y2VwdCkKLSNlbHNlCi0jICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfU1RERVhDRVBUCi0jICAgIGluY2x1ZGUgPHN0bC9fc3RkZXhjZXB0Lmg+Ci0jICBlbmRpZgotI2VuZGlmCi0KLSNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDYzKQotIyAgaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKLSMgICAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KLSMgICAgdW5kZWYgIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKLSMgIGVsc2UKLSMgICAgdW5kZWYgIF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRAotIyAgZW5kaWYKLSNlbmRpZgotCi0jZW5kaWYgLyogX1NUTFBfU1RERVhDRVBUICovCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGRpby5oIGIvc3RkaW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjcxZjM3Yi4uMDAwMDAwMAotLS0gYS9zdGRpby5oCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogQm9yaXMgRm9taXRjaGV2Ci0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICovCi0KLS8qIFdvcmthcm91bmQgZm9yIGEgIm1pc2JlaGF2aW91ciIgd2hlbiBjb21waWxpbmcgcmVzb3VyY2Ugc2NyaXB0cyB1c2luZwotICogZU1iZWRkZWQgVmlzdWFsIEMrKy4gVGhlIHN0YW5kYXJkIC5yYyBmaWxlIGluY2x1ZGVzIHdpbmRvd3MgaGVhZGVyIGZpbGVzLAotICogd2hpY2ggaW4gdHVybiBpbmNsdWRlIHN0ZGFyZy5oLCB3aGljaCByZXN1bHRzIGluIHdhcm5pbmdzIGFuZCBlcnJvcnMKLSAqLwotI2lmICFkZWZpbmVkKFJDX0lOVk9LRUQpCi0KLSMgIGlmbmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECi0jICAgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MjY0Ci0jICAgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+Ci0jICBlbGlmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MjY0KSAmJiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQotIyAgICBkZWZpbmUgX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lECi0jICBlbmRpZgotCi0jICAgIGlmIGRlZmluZWQoX1NUTFBfV0NFX0VWQzMpCi1zdHJ1Y3QgX2V4Y2VwdGlvbjsKLSMgICAgZW5kaWYKLSMgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ19IRUFERVIoc3RkaW8uaCkKLQotIyAgICBpZiBkZWZpbmVkIChfX1NVTlBST19DQykgJiYgIWRlZmluZWQgKF9TVFJVQ1RfRklMRSkKLSMgICAgICBkZWZpbmUgX1NUUlVDVF9GSUxFCi0jICAgIGVuZGlmCi0KLSMgICAgaWYgKGRlZmluZWQgKF9fTVdFUktTX18pICYmICFkZWZpbmVkIChOX1BMQVRfTkxNKSkgIHx8IGRlZmluZWQgKF9fQk9STEFORENfXykKLSMgICAgICB1bmRlZiBzdGRpbgotIyAgICAgIHVuZGVmIHN0ZG91dAotIyAgICAgIHVuZGVmIHN0ZGVycgotIyAgICAgIGlmIGRlZmluZWQgKF9fTVdFUktTX18pCi0jICAgICAgZGVmaW5lIHN0ZGluICAgKCZfU1RMUF9WRU5ET1JfQ1NURDo6X19maWxlc1swXSkKLSMgICAgICBkZWZpbmUgc3Rkb3V0ICAoJl9TVExQX1ZFTkRPUl9DU1REOjpfX2ZpbGVzWzFdKQotIyAgICAgIGRlZmluZSBzdGRlcnIgICgmX1NUTFBfVkVORE9SX0NTVEQ6Ol9fZmlsZXNbMl0pCi0jICAgICAgZWxpZiBkZWZpbmVkIChfX0JPUkxBTkRDX18pCi0jICAgICAgICBkZWZpbmUgc3RkaW4gICAoJl9TVExQX1ZFTkRPUl9DU1REOjpfc3RyZWFtc1swXSkKLSMgICAgICAgIGRlZmluZSBzdGRvdXQgICgmX1NUTFBfVkVORE9SX0NTVEQ6Ol9zdHJlYW1zWzFdKQotIyAgICAgICAgZGVmaW5lIHN0ZGVyciAgKCZfU1RMUF9WRU5ET1JfQ1NURDo6X3N0cmVhbXNbMl0pCi0jICAgICAgZW5kaWYKLSMgICAgZW5kaWYKLQotIyAgaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgyNjQpCi0jICAgIGlmICFkZWZpbmVkIChfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQpCi0jICAgICAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KLSMgICAgICB1bmRlZiAgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAotIyAgICBlbHNlCi0jICAgICAgdW5kZWYgIF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRAotIyAgICBlbmRpZgotIyAgZW5kaWYKLQotI2VuZGlmIC8qIFJDX0lOVk9LRUQgKi8KZGlmZiAtLWdpdCBhL3N0ZGxpYi5oIGIvc3RkbGliLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNDE1ZWUuLjAwMDAwMDAKLS0tIGEvc3RkbGliLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLQotLyogV29ya2Fyb3VuZCBmb3IgYSAibWlzYmVoYXZpb3VyIiB3aGVuIGNvbXBpbGluZyByZXNvdXJjZSBzY3JpcHRzIHVzaW5nCi0gKiBlTWJlZGRlZCBWaXN1YWwgQysrLiBUaGUgc3RhbmRhcmQgLnJjIGZpbGUgaW5jbHVkZXMgd2luZG93cyBoZWFkZXIgZmlsZXMsCi0gKiB3aGljaCBpbiB0dXJuIGluY2x1ZGUgc3RkbGliLmgsIHdoaWNoIHJlc3VsdHMgaW4gd2FybmluZ3MgYW5kIGVycm9ycwotICovCi0jaWYgIWRlZmluZWQgKFJDX0lOVk9LRUQpCi0KLSMgIGlmICFkZWZpbmVkIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEKQotIyAgICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDI2NQotIyAgICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgotIyAgZWxpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDI2NSkgJiYgIWRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKLSMgICAgZGVmaW5lIF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRAotIyAgZW5kaWYKLQotIyAgaWYgZGVmaW5lZCAoX01TQ19WRVIpIHx8IChkZWZpbmVkIChfX0dOVUNfXykgJiYgZGVmaW5lZCAoX19NSU5HVzMyX18pKSB8fCBcCi0gICAgICBkZWZpbmVkIChfX0JPUkxBTkRDX18pIHx8IGRlZmluZWQgKF9fRE1DX18pIHx8IFwKLSAgICAgIChkZWZpbmVkIChfX0hQX2FDQykgJiYgZGVmaW5lZCAoX1JFRU5UUkFOVCkpCi0vKiBOYXRpdmUgc3RkbGliLmggY29udGFpbnMgZXJybm8gbWFjcm8gZGVmaW5pdGlvbiBtYWtpbmcgaW5jbHVzaW9uIG9mIG5hdGl2ZQotICogZXJybm8uaCBpbiBTVExwb3J0IGVycm5vLmggaW1wb3NzaWJsZS4gV2UgYXJlIHRoZW4gZm9yY2VkIHRvIGluY2x1ZGUgZXJybm8uaAotICogZmlyc3QuCi0gKi8KLSMgICAgaW5jbHVkZSAiZXJybm8uaCIKLSMgIGVuZGlmCi0KLS8qCi0gZm9yd2FyZC1kZWNsYXJhdGlvbiBmb3IgX2V4Y2VwdGlvbiBzdHJ1Y3Q7IHByZXZlbnRzIHdhcm5pbmcgbWVzc2FnZQotIC4uL2luY2x1ZGUvc3RkbGliLmgoODE3KSA6IHdhcm5pbmcgQzQxMTU6ICdfZXhjZXB0aW9uJyA6IG5hbWVkIHR5cGUgZGVmaW5pdGlvbiBpbiBwYXJlbnRoZXNlcwotKi8KLSMgIGlmIGRlZmluZWQoX1NUTFBfV0NFX0VWQzMpCi1zdHJ1Y3QgX2V4Y2VwdGlvbjsKLSMgIGVuZGlmCi0KLSMgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NfSEVBREVSKHN0ZGxpYi5oKQotCi0vKiBvbiBldmMzL2V2YzQgaW5jbHVkaW5nIHN0ZGxpYi5oIGFsc28gZGVmaW5lcyBzZXRqbXAgbWFjcm8gKi8KLSMgIGlmIGRlZmluZWQgKF9TVExQX1dDRSkKLSMgICAgZGVmaW5lIF9TVExQX05BVElWRV9TRVRKTVBfSF9JTkNMVURFRAotIyAgZW5kaWYKLQotIyAgaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgyNjUpCi0jICAgIGlmICEgZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQotIyAgICAgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+Ci0jICAgICAgdW5kZWYgIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKLSMgICAgZWxzZQotIyAgICAgIHVuZGVmICBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKLSMgICAgZW5kaWYKLSMgIGVuZGlmCi0KLSNlbmRpZiAvKiBSQ19JTlZPS0VEICovCi0KLS8qCi0gIExvY2FsIFZhcmlhYmxlczoKLSAgbW9kZTpDKysKLSAgRW5kOgotKi8KZGlmZiAtLWdpdCBhL3N0bC9fYWxnby5jIGIvc3RsL19hbGdvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NzQ1YmEuLjAwMDAwMDAKLS0tIGEvc3RsL19hbGdvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEyICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk0Ci0gKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3Ci0gKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTcKLSAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0jaWZuZGVmIF9TVExQX0FMR09fQwotI2RlZmluZSBfU1RMUF9BTEdPX0MKLQotI2lmICFkZWZpbmVkIChfU1RMUF9JTlRFUk5BTF9BTEdPX0gpCi0jICBpbmNsdWRlIDxzdGwvX2FsZ28uaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX1RFTVBCVUZfSAotIyAgaW5jbHVkZSA8c3RsL190ZW1wYnVmLmg+Ci0jZW5kaWYKLQotX1NUTFBfQkVHSU5fTkFNRVNQQUNFCi0KLV9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKLQotdGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlciwgY2xhc3MgX0Rpc3RhbmNlLCBjbGFzcyBfQ29tcGFyZT4KLXZvaWQgX19tZXJnZV93aXRob3V0X2J1ZmZlcihfQmlkaXJlY3Rpb25hbEl0ZXIgX19maXJzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIgX19taWRkbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRGlzdGFuY2UgX19sZW4xLCBfRGlzdGFuY2UgX19sZW4yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Db21wYXJlIF9fY29tcCk7Ci0KLQotdGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcjEsIGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcjIsCi0gICAgICAgICAgY2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyMywgY2xhc3MgX0NvbXBhcmU+Ci1fQmlkaXJlY3Rpb25hbEl0ZXIzIF9fbWVyZ2VfYmFja3dhcmQoX0JpZGlyZWN0aW9uYWxJdGVyMSBfX2ZpcnN0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIxIF9fbGFzdDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyMiBfX2ZpcnN0MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIyIF9fbGFzdDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyMyBfX3Jlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ29tcGFyZSBfX2NvbXApOwotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotI2lmICEoZGVmaW5lZCAoX19TVU5QUk9fQ0MpICYmIChfX1NVTlBST19DQyA8IDB4NDIwICkpCi1pbmxpbmUKLSNlbmRpZgotY29uc3QgX1RwJiBfX21lZGlhbihjb25zdCBfVHAmIF9fYSwgY29uc3QgX1RwJiBfX2IsIGNvbnN0IF9UcCYgX19jKSB7Ci0gIGlmIChfX2EgPCBfX2IpCi0gICAgaWYgKF9fYiA8IF9fYykKLSAgICAgIHJldHVybiBfX2I7Ci0gICAgZWxzZSBpZiAoX19hIDwgX19jKQotICAgICAgcmV0dXJuIF9fYzsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gX19hOwotICBlbHNlIGlmIChfX2EgPCBfX2MpCi0gICAgcmV0dXJuIF9fYTsKLSAgZWxzZSBpZiAoX19iIDwgX19jKQotICAgIHJldHVybiBfX2M7Ci0gIGVsc2UKLSAgICByZXR1cm4gX19iOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZT4KLSNpZiAhKGRlZmluZWQgKF9fU1VOUFJPX0NDKSAmJiAoX19TVU5QUk9fQ0MgPCAweDQyMCApKQotaW5saW5lCi0jZW5kaWYKLWNvbnN0IF9UcCYKLV9fbWVkaWFuKGNvbnN0IF9UcCYgX19hLCBjb25zdCBfVHAmIF9fYiwgY29uc3QgX1RwJiBfX2MsIF9Db21wYXJlIF9fY29tcCkgewotICBpZiAoX19jb21wKF9fYSwgX19iKSkgewotICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFfX2NvbXAoX19iLCBfX2EpLCBfU3RsTXNnX0lOVkFMSURfU1RSSUNUX1dFQUtfUFJFRElDQVRFKQotICAgIGlmIChfX2NvbXAoX19iLCBfX2MpKSB7Ci0gICAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghX19jb21wKF9fYywgX19iKSwgX1N0bE1zZ19JTlZBTElEX1NUUklDVF9XRUFLX1BSRURJQ0FURSkKLSAgICAgIHJldHVybiBfX2I7Ci0gICAgfQotICAgIGVsc2UgaWYgKF9fY29tcChfX2EsIF9fYykpIHsKLSAgICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFfX2NvbXAoX19jLCBfX2EpLCBfU3RsTXNnX0lOVkFMSURfU1RSSUNUX1dFQUtfUFJFRElDQVRFKQotICAgICAgcmV0dXJuIF9fYzsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIF9fYTsKLSAgfQotICBlbHNlIGlmIChfX2NvbXAoX19hLCBfX2MpKSB7Ci0gICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoIV9fY29tcChfX2MsIF9fYSksIF9TdGxNc2dfSU5WQUxJRF9TVFJJQ1RfV0VBS19QUkVESUNBVEUpCi0gICAgcmV0dXJuIF9fYTsKLSAgfQotICBlbHNlIGlmIChfX2NvbXAoX19iLCBfX2MpKSB7Ci0gICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoIV9fY29tcChfX2MsIF9fYiksIF9TdGxNc2dfSU5WQUxJRF9TVFJJQ1RfV0VBS19QUkVESUNBVEUpCi0gICAgcmV0dXJuIF9fYzsKLSAgfQotICBlbHNlCi0gICAgcmV0dXJuIF9fYjsKLX0KLQotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi0KLXRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIxLCBjbGFzcyBfRm9yd2FyZEl0ZXIyPgotX0ZvcndhcmRJdGVyMSBzZWFyY2goX0ZvcndhcmRJdGVyMSBfX2ZpcnN0MSwgX0ZvcndhcmRJdGVyMSBfX2xhc3QxLAotICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyMiBfX2ZpcnN0MiwgX0ZvcndhcmRJdGVyMiBfX2xhc3QyKSB7Ci0gIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0MSwgX19sYXN0MSkpCi0gIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0MiwgX19sYXN0MikpCi0gIC8vIFRlc3QgZm9yIGVtcHR5IHJhbmdlcwotICBpZiAoX19maXJzdDEgPT0gX19sYXN0MSB8fCBfX2ZpcnN0MiA9PSBfX2xhc3QyKQotICAgIHJldHVybiBfX2ZpcnN0MTsKLQotICAvLyBUZXN0IGZvciBhIHBhdHRlcm4gb2YgbGVuZ3RoIDEuCi0gIF9Gb3J3YXJkSXRlcjIgX19wMShfX2ZpcnN0Mik7Ci0KLSAgaWYgKCArK19fcDEgPT0gX19sYXN0MiApCi0gICAgcmV0dXJuIGZpbmQoX19maXJzdDEsIF9fbGFzdDEsICpfX2ZpcnN0Mik7Ci0KLSAgLy8gR2VuZXJhbCBjYXNlLgotCi0gIGZvciAoIDsgOyApIHsgLy8gX19maXJzdDEgIT0gX19sYXN0MSB3aWxsIGJlIGNoZWNrZWQgaW4gZmluZCBiZWxvdwotICAgIF9fZmlyc3QxID0gZmluZChfX2ZpcnN0MSwgX19sYXN0MSwgKl9fZmlyc3QyKTsKLSAgICBpZiAoX19maXJzdDEgPT0gX19sYXN0MSkKLSAgICAgIHJldHVybiBfX2xhc3QxOwotCi0gICAgX0ZvcndhcmRJdGVyMiBfX3AgPSBfX3AxOwotICAgIF9Gb3J3YXJkSXRlcjEgX19jdXJyZW50ID0gX19maXJzdDE7Ci0gICAgaWYgKCsrX19jdXJyZW50ID09IF9fbGFzdDEpCi0gICAgICByZXR1cm4gX19sYXN0MTsKLQotICAgIHdoaWxlICgqX19jdXJyZW50ID09ICpfX3ApIHsKLSAgICAgIGlmICgrK19fcCA9PSBfX2xhc3QyKQotICAgICAgICByZXR1cm4gX19maXJzdDE7Ci0gICAgICBpZiAoKytfX2N1cnJlbnQgPT0gX19sYXN0MSkKLSAgICAgICAgcmV0dXJuIF9fbGFzdDE7Ci0gICAgfQotCi0gICAgKytfX2ZpcnN0MTsKLSAgfQotICByZXR1cm4gX19maXJzdDE7Ci19Ci0KLV9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKLQotdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBjbGFzcyBfSW50ZWdlciwgY2xhc3MgX1RwLAotICAgICAgICAgIGNsYXNzIF9CaW5hcnlQcmVkLCBjbGFzcyBfRGlzdGFuY2U+Ci1fUmFuZG9tQWNjZXNzSXRlciBfX3NlYXJjaF9uKF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0ludGVnZXIgX19jb3VudCwgY29uc3QgX1RwJiBfX3ZhbCwgX0JpbmFyeVByZWQgX19wcmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRGlzdGFuY2UqLCBjb25zdCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyAmKQotewotICBfRGlzdGFuY2UgX190YWlsU2l6ZSA9IF9fbGFzdCAtIF9fZmlyc3Q7Ci0gIGNvbnN0IF9EaXN0YW5jZSBfX3BhdHRTaXplID0gX19jb3VudDsKLSAgY29uc3QgX0Rpc3RhbmNlIF9fc2tpcE9mZnNldCA9IF9fcGF0dFNpemUgLSAxOwotICBfUmFuZG9tQWNjZXNzSXRlciBfX2JhY2tUcmFjazsKLSAgX0Rpc3RhbmNlIF9fcmVtYWluZGVyLCBfX3ByZXZSZW1haW5kZXI7Ci0KLSAgZm9yICggX1JhbmRvbUFjY2Vzc0l0ZXIgX19sb29rQWhlYWQgPSBfX2ZpcnN0ICsgX19za2lwT2Zmc2V0OyBfX3RhaWxTaXplID49IF9fcGF0dFNpemU7IF9fbG9va0FoZWFkICs9IF9fcGF0dFNpemUgKSB7IC8vIHRoZSBtYWluIGxvb3AuLi4KLSAgICAvL19fbG9va0FoZWFkIGhlcmUgaXMgYWx3YXlzIHBvaW50aW5nIHRvIHRoZSBsYXN0IGVsZW1lbnQgb2YgbmV4dCBwb3NzaWJsZSBtYXRjaC4KLSAgICBfX3RhaWxTaXplIC09IF9fcGF0dFNpemU7Ci0KLSAgICB3aGlsZSAoICFfX3ByZWQoKl9fbG9va0FoZWFkLCBfX3ZhbCkgKSB7IC8vIHRoZSBza2lwIGxvb3AuLi4KLSAgICAgIGlmIChfX3RhaWxTaXplIDwgX19wYXR0U2l6ZSkKLSAgICAgICAgcmV0dXJuIF9fbGFzdDsKLQotICAgICAgX19sb29rQWhlYWQgKz0gX19wYXR0U2l6ZTsKLSAgICAgIF9fdGFpbFNpemUgLT0gX19wYXR0U2l6ZTsKLSAgICB9Ci0KLSAgICBpZiAoIF9fc2tpcE9mZnNldCA9PSAwICkgewotICAgICAgcmV0dXJuIChfX2xvb2tBaGVhZCAtIF9fc2tpcE9mZnNldCk7IC8vU3VjY2VzcwotICAgIH0KLQotICAgIF9fcmVtYWluZGVyID0gX19za2lwT2Zmc2V0OwotCi0gICAgZm9yIChfX2JhY2tUcmFjayA9IF9fbG9va0FoZWFkOyBfX3ByZWQoKi0tX19iYWNrVHJhY2ssIF9fdmFsKTsgKSB7Ci0gICAgICBpZiAoLS1fX3JlbWFpbmRlciA9PSAwKQotICAgICAgICByZXR1cm4gKF9fbG9va0FoZWFkIC0gX19za2lwT2Zmc2V0KTsgLy9TdWNjZXNzCi0gICAgfQotCi0gICAgaWYgKF9fcmVtYWluZGVyID4gX190YWlsU2l6ZSkKLSAgICAgIHJldHVybiBfX2xhc3Q7IC8vZmFpbHVyZQotCi0gICAgX19sb29rQWhlYWQgKz0gX19yZW1haW5kZXI7Ci0gICAgX190YWlsU2l6ZSAtPSBfX3JlbWFpbmRlcjsKLQotICAgIHdoaWxlICggX19wcmVkKCpfX2xvb2tBaGVhZCwgX192YWwpICkgewotICAgICAgX19wcmV2UmVtYWluZGVyID0gX19yZW1haW5kZXI7Ci0gICAgICBfX2JhY2tUcmFjayA9IF9fbG9va0FoZWFkOwotCi0gICAgICBkbyB7Ci0gICAgICAgIGlmICgtLV9fcmVtYWluZGVyID09IDApCi0gICAgICAgICAgcmV0dXJuIChfX2xvb2tBaGVhZCAtIF9fc2tpcE9mZnNldCk7IC8vU3VjY2VzcwotICAgICAgfSB3aGlsZSAoX19wcmVkKCotLV9fYmFja1RyYWNrLCBfX3ZhbCkpOwotCi0gICAgICAvL2FkanVzdCByZW1haW5kZXIgZm9yIG5leHQgY29tcGFyaXNvbgotICAgICAgX19yZW1haW5kZXIgKz0gX19wYXR0U2l6ZSAtIF9fcHJldlJlbWFpbmRlcjsKLQotICAgICAgaWYgKF9fcmVtYWluZGVyID4gX190YWlsU2l6ZSkKLSAgICAgICAgcmV0dXJuIF9fbGFzdDsgLy9mYWlsdXJlCi0KLSAgICAgIF9fbG9va0FoZWFkICs9IF9fcmVtYWluZGVyOwotICAgICAgX190YWlsU2l6ZSAtPSBfX3JlbWFpbmRlcjsKLSAgICB9Ci0KLSAgICAvL19fbG9va0FoZWFkIGhlcmUgaXMgYWx3YXlzIHBvaW50aW5nIHRvIHRoZSBlbGVtZW50IG9mIHRoZSBsYXN0IG1pc21hdGNoLgotICB9Ci0KLSAgcmV0dXJuIF9fbGFzdDsgLy9mYWlsdXJlCi19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9JbnRlZ2VyLCBjbGFzcyBfVHAsCi0gICAgICAgICAgY2xhc3MgX0Rpc3RhbmNlLCBjbGFzcyBfQmluYXJ5UHJlZD4KLV9Gb3J3YXJkSXRlciBfX3NlYXJjaF9uKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgX0ludGVnZXIgX19jb3VudCwgY29uc3QgX1RwJiBfX3ZhbCwgX0JpbmFyeVByZWQgX19wcmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgX0Rpc3RhbmNlKiwgY29uc3QgZm9yd2FyZF9pdGVyYXRvcl90YWcgJikgewotICBmb3IgKDsgKF9fZmlyc3QgIT0gX19sYXN0KSAmJiAhX19wcmVkKCpfX2ZpcnN0LCBfX3ZhbCk7ICsrX19maXJzdCkge30KLSAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0KSB7Ci0gICAgX0ludGVnZXIgX19uID0gX19jb3VudCAtIDE7Ci0gICAgX0ZvcndhcmRJdGVyIF9faSA9IF9fZmlyc3Q7Ci0gICAgKytfX2k7Ci0gICAgd2hpbGUgKF9faSAhPSBfX2xhc3QgJiYgX19uICE9IDAgJiYgX19wcmVkKCpfX2ksIF9fdmFsKSkgewotICAgICAgKytfX2k7Ci0gICAgICAtLV9fbjsKLSAgICB9Ci0gICAgaWYgKF9fbiA9PSAwKQotICAgICAgcmV0dXJuIF9fZmlyc3Q7Ci0gICAgZWxzZSBpZiAoX19pICE9IF9fbGFzdCkKLSAgICAgIGZvciAoX19maXJzdCA9ICsrX19pOyAoX19maXJzdCAhPSBfX2xhc3QpICYmICFfX3ByZWQoKl9fZmlyc3QsIF9fdmFsKTsgKytfX2ZpcnN0KSB7fQotICAgIGVsc2UKLSAgICAgIGJyZWFrOwotICB9Ci0gIHJldHVybiBfX2xhc3Q7Ci19Ci0KLV9TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQotCi0vLyBzZWFyY2hfbi4gIFNlYXJjaCBmb3IgX19jb3VudCBjb25zZWN1dGl2ZSBjb3BpZXMgb2YgX192YWwuCi10ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfSW50ZWdlciwgY2xhc3MgX1RwPgotX0ZvcndhcmRJdGVyIHNlYXJjaF9uKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgIF9JbnRlZ2VyIF9fY291bnQsIGNvbnN0IF9UcCYgX192YWwpIHsKLSAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCi0gIGlmIChfX2NvdW50IDw9IDApCi0gICAgcmV0dXJuIF9fZmlyc3Q7Ci0gIGlmIChfX2NvdW50ID09IDEpCi0gICAgLy9XZSB1c2UgZmluZCB3aGVuIF9fY291bnQgPT0gMSB0byB1c2UgcG90ZW50aWFsIGZpbmQgb3ZlcmxvYWQuCi0gICAgcmV0dXJuIGZpbmQoX19maXJzdCwgX19sYXN0LCBfX3ZhbCk7Ci0gIHJldHVybiBfU1RMUF9QUklWIF9fc2VhcmNoX24oX19maXJzdCwgX19sYXN0LCBfX2NvdW50LCBfX3ZhbCwgZXF1YWxfdG88X1RwPigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX0RJU1RBTkNFX1RZUEUoX19maXJzdCwgX0ZvcndhcmRJdGVyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9JVEVSQVRPUl9DQVRFR09SWShfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIpKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX0ludGVnZXIsIGNsYXNzIF9UcCwgY2xhc3MgX0JpbmFyeVByZWQ+Ci1fRm9yd2FyZEl0ZXIgc2VhcmNoX24oX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgX0ludGVnZXIgX19jb3VudCwgY29uc3QgX1RwJiBfX3ZhbCwKLSAgICAgICAgICAgICAgICAgICAgICBfQmluYXJ5UHJlZCBfX2JpbmFyeV9wcmVkKSB7Ci0gIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQotICBpZiAoX19jb3VudCA8PSAwKQotICAgIHJldHVybiBfX2ZpcnN0OwotICByZXR1cm4gX1NUTFBfUFJJViBfX3NlYXJjaF9uKF9fZmlyc3QsIF9fbGFzdCwgX19jb3VudCwgX192YWwsIF9fYmluYXJ5X3ByZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfRElTVEFOQ0VfVFlQRShfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9fZmlyc3QsIF9Gb3J3YXJkSXRlcikpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyMSwgY2xhc3MgX0ZvcndhcmRJdGVyMj4KLV9Gb3J3YXJkSXRlcjEKLWZpbmRfZW5kKF9Gb3J3YXJkSXRlcjEgX19maXJzdDEsIF9Gb3J3YXJkSXRlcjEgX19sYXN0MSwKLSAgICAgICAgIF9Gb3J3YXJkSXRlcjIgX19maXJzdDIsIF9Gb3J3YXJkSXRlcjIgX19sYXN0MikgewotICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdDEsIF9fbGFzdDEpKQotICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdDIsIF9fbGFzdDIpKQotICByZXR1cm4gX1NUTFBfUFJJViBfX2ZpbmRfZW5kKF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0MiwgX19sYXN0MiwKLSNpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9fZmlyc3QxLCBfRm9yd2FyZEl0ZXIxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9JVEVSQVRPUl9DQVRFR09SWShfX2ZpcnN0MiwgX0ZvcndhcmRJdGVyMiksCi0jZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcndhcmRfaXRlcmF0b3JfdGFnKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yd2FyZF9pdGVyYXRvcl90YWcoKSwKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX19lcXVhbF90byhfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QxLCBfRm9yd2FyZEl0ZXIxKSkKLSAgICApOwotfQotCi0vLyB1bmlxdWUgYW5kIHVuaXF1ZV9jb3B5Ci1fU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCi0KLXRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvciwgY2xhc3MgX091dHB1dEl0ZXJhdG9yLCBjbGFzcyBfQmluYXJ5UHJlZGljYXRlLAotICAgICAgICAgIGNsYXNzIF9UcD4KLV9TVExQX0lOTElORV9MT09QIF9PdXRwdXRJdGVyYXRvcgotX191bmlxdWVfY29weShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCi0gICAgICAgICAgICAgIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwKLSAgICAgICAgICAgICAgX0JpbmFyeVByZWRpY2F0ZSBfX2JpbmFyeV9wcmVkLCBfVHAqKSB7Ci0gIF9UcCBfX3ZhbCA9ICpfX2ZpcnN0OwotICAqX19yZXN1bHQgPSBfX3ZhbDsKLSAgd2hpbGUgKCsrX19maXJzdCAhPSBfX2xhc3QpCi0gICAgaWYgKCFfX2JpbmFyeV9wcmVkKF9fdmFsLCAqX19maXJzdCkpIHsKLSAgICAgIF9fdmFsID0gKl9fZmlyc3Q7Ci0gICAgICAqKytfX3Jlc3VsdCA9IF9fdmFsOwotICAgIH0KLSAgcmV0dXJuICsrX19yZXN1bHQ7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfT3V0cHV0SXRlciwgY2xhc3MgX0JpbmFyeVByZWRpY2F0ZT4KLWlubGluZSBfT3V0cHV0SXRlcgotX191bmlxdWVfY29weShfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LF9PdXRwdXRJdGVyIF9fcmVzdWx0LAotICAgICAgICAgICAgICBfQmluYXJ5UHJlZGljYXRlIF9fYmluYXJ5X3ByZWQsIGNvbnN0IG91dHB1dF9pdGVyYXRvcl90YWcgJikgewotICByZXR1cm4gX191bmlxdWVfY29weShfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0LCBfX2JpbmFyeV9wcmVkLCBfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsIF9JbnB1dEl0ZXIpKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX0JpbmFyeVByZWRpY2F0ZT4KLV9TVExQX0lOTElORV9MT09QIF9Gb3J3YXJkSXRlcgotX191bmlxdWVfY29weShfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LCBfRm9yd2FyZEl0ZXIgX19yZXN1bHQsCi0gICAgICAgICAgICAgIF9CaW5hcnlQcmVkaWNhdGUgX19iaW5hcnlfcHJlZCwgY29uc3QgZm9yd2FyZF9pdGVyYXRvcl90YWcgJikgewotICAqX19yZXN1bHQgPSAqX19maXJzdDsKLSAgd2hpbGUgKCsrX19maXJzdCAhPSBfX2xhc3QpCi0gICAgaWYgKCFfX2JpbmFyeV9wcmVkKCpfX3Jlc3VsdCwgKl9fZmlyc3QpKSAqKytfX3Jlc3VsdCA9ICpfX2ZpcnN0OwotICByZXR1cm4gKytfX3Jlc3VsdDsKLX0KLQotI2lmIGRlZmluZWQgKF9TVExQX05PTlRFTVBMX0JBU0VfTUFUQ0hfQlVHKQotdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yLCBjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCBjbGFzcyBfQmluYXJ5UHJlZGljYXRlPgotaW5saW5lIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IKLV9fdW5pcXVlX2NvcHkoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAotICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fcmVzdWx0LCBfQmluYXJ5UHJlZGljYXRlIF9fYmluYXJ5X3ByZWQsCi0gICAgICAgICAgICAgIGNvbnN0IGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnICYpIHsKLSAgcmV0dXJuIF9fdW5pcXVlX2NvcHkoX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCwgX19iaW5hcnlfcHJlZCwgZm9yd2FyZF9pdGVyYXRvcl90YWcoKSk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvciwgY2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBjbGFzcyBfQmluYXJ5UHJlZGljYXRlPgotaW5saW5lIF9SYW5kb21BY2Nlc3NJdGVyYXRvcgotX191bmlxdWVfY29weShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCi0gICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX3Jlc3VsdCwgX0JpbmFyeVByZWRpY2F0ZSBfX2JpbmFyeV9wcmVkLAotICAgICAgICAgICAgICBjb25zdCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyAmKSB7Ci0gIHJldHVybiBfX3VuaXF1ZV9jb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQsIF9fYmluYXJ5X3ByZWQsIGZvcndhcmRfaXRlcmF0b3JfdGFnKCkpOwotfQotI2VuZGlmIC8qIF9TVExQX05PTlRFTVBMX0JBU0VfTUFUQ0hfQlVHICovCi0KLV9TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX091dHB1dEl0ZXI+Ci1fT3V0cHV0SXRlcgotdW5pcXVlX2NvcHkoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwgX091dHB1dEl0ZXIgX19yZXN1bHQpIHsKLSAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCi0gIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkgcmV0dXJuIF9fcmVzdWx0OwotICByZXR1cm4gX1NUTFBfUFJJViBfX3VuaXF1ZV9jb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfX2VxdWFsX3RvKF9TVExQX1ZBTFVFX1RZUEUoX19maXJzdCwgX0lucHV0SXRlcikpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9fcmVzdWx0LCBfT3V0cHV0SXRlcikpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX091dHB1dEl0ZXIsIGNsYXNzIF9CaW5hcnlQcmVkaWNhdGU+Ci1fT3V0cHV0SXRlcgotdW5pcXVlX2NvcHkoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCxfT3V0cHV0SXRlciBfX3Jlc3VsdCwKLSAgICAgICAgICAgIF9CaW5hcnlQcmVkaWNhdGUgX19iaW5hcnlfcHJlZCkgewotICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKLSAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KSByZXR1cm4gX19yZXN1bHQ7Ci0gIHJldHVybiBfU1RMUF9QUklWIF9fdW5pcXVlX2NvcHkoX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCwgX19iaW5hcnlfcHJlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9JVEVSQVRPUl9DQVRFR09SWShfX3Jlc3VsdCwgX091dHB1dEl0ZXIpKTsKLX0KLQotLy8gcm90YXRlIGFuZCByb3RhdGVfY29weSwgYW5kIHRoZWlyIGF1eGlsaWFyeSBmdW5jdGlvbnMKLV9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKLQotdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX0Rpc3RhbmNlPgotX0ZvcndhcmRJdGVyIF9fcm90YXRlX2F1eChfRm9yd2FyZEl0ZXIgX19maXJzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyIF9fbWlkZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXIgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBfRGlzdGFuY2UqLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3J3YXJkX2l0ZXJhdG9yX3RhZyAmKSB7Ci0gIGlmIChfX2ZpcnN0ID09IF9fbWlkZGxlKQotICAgIHJldHVybiBfX2xhc3Q7Ci0gIGlmIChfX2xhc3QgID09IF9fbWlkZGxlKQotICAgIHJldHVybiBfX2ZpcnN0OwotCi0gIF9Gb3J3YXJkSXRlciBfX2ZpcnN0MiA9IF9fbWlkZGxlOwotICBkbyB7Ci0gICAgc3dhcCgqX19maXJzdCsrLCAqX19maXJzdDIrKyk7Ci0gICAgaWYgKF9fZmlyc3QgPT0gX19taWRkbGUpCi0gICAgICBfX21pZGRsZSA9IF9fZmlyc3QyOwotICB9IHdoaWxlIChfX2ZpcnN0MiAhPSBfX2xhc3QpOwotCi0gIF9Gb3J3YXJkSXRlciBfX25ld19taWRkbGUgPSBfX2ZpcnN0OwotCi0gIF9fZmlyc3QyID0gX19taWRkbGU7Ci0KLSAgd2hpbGUgKF9fZmlyc3QyICE9IF9fbGFzdCkgewotICAgIHN3YXAgKCpfX2ZpcnN0KyssICpfX2ZpcnN0MisrKTsKLSAgICBpZiAoX19maXJzdCA9PSBfX21pZGRsZSkKLSAgICAgIF9fbWlkZGxlID0gX19maXJzdDI7Ci0gICAgZWxzZSBpZiAoX19maXJzdDIgPT0gX19sYXN0KQotICAgICAgX19maXJzdDIgPSBfX21pZGRsZTsKLSAgfQotCi0gIHJldHVybiBfX25ld19taWRkbGU7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXIsIGNsYXNzIF9EaXN0YW5jZT4KLV9CaWRpcmVjdGlvbmFsSXRlciBfX3JvdGF0ZV9hdXgoX0JpZGlyZWN0aW9uYWxJdGVyIF9fZmlyc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlciBfX21pZGRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0Rpc3RhbmNlKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgJikgewotICBpZiAoX19maXJzdCA9PSBfX21pZGRsZSkKLSAgICByZXR1cm4gX19sYXN0OwotICBpZiAoX19sYXN0ICA9PSBfX21pZGRsZSkKLSAgICByZXR1cm4gX19maXJzdDsKLQotICBfX3JldmVyc2UoX19maXJzdCwgIF9fbWlkZGxlLCBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZygpKTsKLSAgX19yZXZlcnNlKF9fbWlkZGxlLCBfX2xhc3QsICAgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcoKSk7Ci0KLSAgd2hpbGUgKF9fZmlyc3QgIT0gX19taWRkbGUgJiYgX19taWRkbGUgIT0gX19sYXN0KQotICAgIHN3YXAgKCpfX2ZpcnN0KyssICotLV9fbGFzdCk7Ci0KLSAgaWYgKF9fZmlyc3QgPT0gX19taWRkbGUpIHsKLSAgICBfX3JldmVyc2UoX19taWRkbGUsIF9fbGFzdCwgICBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZygpKTsKLSAgICByZXR1cm4gX19sYXN0OwotICB9Ci0gIGVsc2UgewotICAgIF9fcmV2ZXJzZShfX2ZpcnN0LCAgX19taWRkbGUsIGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnKCkpOwotICAgIHJldHVybiBfX2ZpcnN0OwotICB9Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX0Rpc3RhbmNlLCBjbGFzcyBfVHA+Ci1fUmFuZG9tQWNjZXNzSXRlciBfX3JvdGF0ZV9hdXgoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX21pZGRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0Rpc3RhbmNlICosIF9UcCAqKSB7Ci0KLSAgX0Rpc3RhbmNlIF9fbiA9IF9fbGFzdCAgIC0gX19maXJzdDsKLSAgX0Rpc3RhbmNlIF9fayA9IF9fbWlkZGxlIC0gX19maXJzdDsKLSAgX0Rpc3RhbmNlIF9fbCA9IF9fbiAtIF9fazsKLSAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19yZXN1bHQgPSBfX2ZpcnN0ICsgKF9fbGFzdCAtIF9fbWlkZGxlKTsKLQotICBpZiAoX19rID09IDApICAvKiBfX2ZpcnN0ID09IG1pZGRsZSAqLwotICAgIHJldHVybiBfX2xhc3Q7Ci0KLSAgaWYgKF9fayA9PSBfX2wpIHsKLSAgICBzd2FwX3JhbmdlcyhfX2ZpcnN0LCBfX21pZGRsZSwgX19taWRkbGUpOwotICAgIHJldHVybiBfX3Jlc3VsdDsKLSAgfQotCi0gIF9EaXN0YW5jZSBfX2QgPSBfX2djZChfX24sIF9fayk7Ci0KLSAgZm9yIChfRGlzdGFuY2UgX19pID0gMDsgX19pIDwgX19kOyBfX2krKykgewotICAgIF9UcCBfX3RtcCA9ICpfX2ZpcnN0OwotICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fcCA9IF9fZmlyc3Q7Ci0KLSAgICBpZiAoX19rIDwgX19sKSB7Ci0gICAgICBmb3IgKF9EaXN0YW5jZSBfX2ogPSAwOyBfX2ogPCBfX2wvX19kOyBfX2orKykgewotICAgICAgICBpZiAoX19wID4gX19maXJzdCArIF9fbCkgewotICAgICAgICAgICpfX3AgPSAqKF9fcCAtIF9fbCk7Ci0gICAgICAgICAgX19wIC09IF9fbDsKLSAgICAgICAgfQotCi0gICAgICAgICpfX3AgPSAqKF9fcCArIF9fayk7Ci0gICAgICAgIF9fcCArPSBfX2s7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZWxzZSB7Ci0gICAgICBmb3IgKF9EaXN0YW5jZSBfX2ogPSAwOyBfX2ogPCBfX2svX19kIC0gMTsgX19qICsrKSB7Ci0gICAgICAgIGlmIChfX3AgPCBfX2xhc3QgLSBfX2spIHsKLSAgICAgICAgICAqX19wID0gKihfX3AgKyBfX2spOwotICAgICAgICAgIF9fcCArPSBfX2s7Ci0gICAgICAgIH0KLQotICAgICAgICAqX19wID0gKiAoX19wIC0gX19sKTsKLSAgICAgICAgX19wIC09IF9fbDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAqX19wID0gX190bXA7Ci0gICAgKytfX2ZpcnN0OwotICB9Ci0KLSAgcmV0dXJuIF9fcmVzdWx0OwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9EaXN0YW5jZT4KLWlubGluZSBfUmFuZG9tQWNjZXNzSXRlcgotX19yb3RhdGVfYXV4KF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyIF9fbWlkZGxlLCBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsCi0gICAgICAgICAgICAgX0Rpc3RhbmNlICogX19kaXMsIGNvbnN0IHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnICYpIHsKLSAgcmV0dXJuIF9fcm90YXRlX2F1eChfX2ZpcnN0LCBfX21pZGRsZSwgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgIF9fZGlzLCBfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyKSk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXI+Ci1fRm9yd2FyZEl0ZXIKLV9fcm90YXRlKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19taWRkbGUsIF9Gb3J3YXJkSXRlciBfX2xhc3QpIHsKLSAgX1NUTFBfREVCVUdfQ0hFQ0soX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX21pZGRsZSkpCi0gIF9TVExQX0RFQlVHX0NIRUNLKF9fY2hlY2tfcmFuZ2UoX19taWRkbGUsIF9fbGFzdCkpCi0gIHJldHVybiBfX3JvdGF0ZV9hdXgoX19maXJzdCwgX19taWRkbGUsIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9ESVNUQU5DRV9UWVBFKF9fZmlyc3QsIF9Gb3J3YXJkSXRlciksCi0gICAgICAgICAgICAgICAgICAgICAgX1NUTFBfSVRFUkFUT1JfQ0FURUdPUlkoX19maXJzdCwgX0ZvcndhcmRJdGVyKSk7Ci19Ci0KLV9TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyPgotdm9pZCByb3RhdGUoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX21pZGRsZSwgX0ZvcndhcmRJdGVyIF9fbGFzdCkgewotICBfU1RMUF9QUklWIF9fcm90YXRlKF9fZmlyc3QsIF9fbWlkZGxlLCBfX2xhc3QpOwotfQotCi0vLyBSZXR1cm4gYSByYW5kb20gbnVtYmVyIGluIHRoZSByYW5nZSBbMCwgX19uKS4gIFRoaXMgZnVuY3Rpb24gZW5jYXBzdWxhdGVzCi0vLyB3aGV0aGVyIHdlJ3JlIHVzaW5nIHJhbmQgKHBhcnQgb2YgdGhlIHN0YW5kYXJkIEMgbGlicmFyeSkgb3IgbHJhbmQ0OAotLy8gKG5vdCBzdGFuZGFyZCwgYnV0IGEgbXVjaCBiZXR0ZXIgY2hvaWNlIHdoZW5ldmVyIGl0J3MgYXZhaWxhYmxlKS4KLV9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKLQotdGVtcGxhdGUgPGNsYXNzIF9EaXN0YW5jZT4KLWlubGluZSBfRGlzdGFuY2UgX19yYW5kb21fbnVtYmVyKF9EaXN0YW5jZSBfX24pIHsKLSNpZmRlZiBfU1RMUF9OT19EUkFORDQ4Ci0gIHJldHVybiByYW5kKCkgJSBfX247Ci0jZWxzZQotICByZXR1cm4gbHJhbmQ0OCgpICUgX19uOwotI2VuZGlmCi19Ci0KLV9TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXI+Ci12b2lkIHJhbmRvbV9zaHVmZmxlKF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsCi0gICAgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCkgewotICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKLSAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KSByZXR1cm47Ci0gIGZvciAoX1JhbmRvbUFjY2Vzc0l0ZXIgX19pID0gX19maXJzdCArIDE7IF9faSAhPSBfX2xhc3Q7ICsrX19pKQotICAgIGl0ZXJfc3dhcChfX2ksIF9fZmlyc3QgKyBfU1RMUF9QUklWIF9fcmFuZG9tX251bWJlcigoX19pIC0gX19maXJzdCkgKyAxKSk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX1JhbmRvbU51bWJlckdlbmVyYXRvcj4KLXZvaWQgcmFuZG9tX3NodWZmbGUoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICBfUmFuZG9tTnVtYmVyR2VuZXJhdG9yICZfX3JhbmQpIHsKLSAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCi0gIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkgcmV0dXJuOwotICBmb3IgKF9SYW5kb21BY2Nlc3NJdGVyIF9faSA9IF9fZmlyc3QgKyAxOyBfX2kgIT0gX19sYXN0OyArK19faSkKLSAgICBpdGVyX3N3YXAoX19pLCBfX2ZpcnN0ICsgX19yYW5kKChfX2kgLSBfX2ZpcnN0KSArIDEpKTsKLX0KLQotI2lmICFkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQotLy8gcmFuZG9tX3NhbXBsZSBhbmQgcmFuZG9tX3NhbXBsZV9uIChleHRlbnNpb25zLCBub3QgcGFydCBvZiB0aGUgc3RhbmRhcmQpLgotdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX091dHB1dEl0ZXIsIGNsYXNzIF9EaXN0YW5jZT4KLV9PdXRwdXRJdGVyIHJhbmRvbV9zYW1wbGVfbihfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlciBfX291dF9pdGUsIGNvbnN0IF9EaXN0YW5jZSBfX24pIHsKLSAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCi0gIF9EaXN0YW5jZSBfX3JlbWFpbmluZyA9IGRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7Ci0gIF9EaXN0YW5jZSBfX20gPSAobWluKSAoX19uLCBfX3JlbWFpbmluZyk7Ci0KLSAgd2hpbGUgKF9fbSA+IDApIHsKLSAgICBpZiAoX1NUTFBfUFJJViBfX3JhbmRvbV9udW1iZXIoX19yZW1haW5pbmcpIDwgX19tKSB7Ci0gICAgICAqX19vdXRfaXRlID0gKl9fZmlyc3Q7Ci0gICAgICArK19fb3V0X2l0ZTsKLSAgICAgIC0tX19tOwotICAgIH0KLQotICAgIC0tX19yZW1haW5pbmc7Ci0gICAgKytfX2ZpcnN0OwotICB9Ci0gIHJldHVybiBfX291dF9pdGU7Ci19Ci0KLQotdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX091dHB1dEl0ZXIsIGNsYXNzIF9EaXN0YW5jZSwKLSAgICAgICAgICBjbGFzcyBfUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgotX091dHB1dEl0ZXIgcmFuZG9tX3NhbXBsZV9uKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyIF9fb3V0X2l0ZSwgY29uc3QgX0Rpc3RhbmNlIF9fbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3JhbmQpIHsKLSAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCi0gIF9EaXN0YW5jZSBfX3JlbWFpbmluZyA9IGRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7Ci0gIF9EaXN0YW5jZSBfX20gPSAobWluKSAoX19uLCBfX3JlbWFpbmluZyk7Ci0KLSAgd2hpbGUgKF9fbSA+IDApIHsKLSAgICBpZiAoX19yYW5kKF9fcmVtYWluaW5nKSA8IF9fbSkgewotICAgICAgKl9fb3V0X2l0ZSA9ICpfX2ZpcnN0OwotICAgICAgKytfX291dF9pdGU7Ci0gICAgICAtLV9fbTsKLSAgICB9Ci0KLSAgICAtLV9fcmVtYWluaW5nOwotICAgICsrX19maXJzdDsKLSAgfQotICByZXR1cm4gX19vdXRfaXRlOwotfQotCi1fU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCi0KLXRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX0Rpc3RhbmNlPgotX1JhbmRvbUFjY2Vzc0l0ZXIgX19yYW5kb21fc2FtcGxlKF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19vdXRfaXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9EaXN0YW5jZSBfX24pIHsKLSAgX0Rpc3RhbmNlIF9fbSA9IDA7Ci0gIF9EaXN0YW5jZSBfX3QgPSBfX247Ci0gIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3QgJiYgX19tIDwgX19uOyArK19fbSwgKytfX2ZpcnN0KQotICAgIF9fb3V0X2l0ZVtfX21dID0gKl9fZmlyc3Q7Ci0KLSAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0KSB7Ci0gICAgKytfX3Q7Ci0gICAgX0Rpc3RhbmNlIF9fTSA9IF9fcmFuZG9tX251bWJlcihfX3QpOwotICAgIGlmIChfX00gPCBfX24pCi0gICAgICBfX291dF9pdGVbX19NXSA9ICpfX2ZpcnN0OwotICAgICsrX19maXJzdDsKLSAgfQotCi0gIHJldHVybiBfX291dF9pdGUgKyBfX207Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwKLSAgICAgICAgICBjbGFzcyBfUmFuZG9tTnVtYmVyR2VuZXJhdG9yLCBjbGFzcyBfRGlzdGFuY2U+Ci1fUmFuZG9tQWNjZXNzSXRlciBfX3JhbmRvbV9zYW1wbGUoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX291dF9pdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JhbmRvbU51bWJlckdlbmVyYXRvciYgX19yYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9EaXN0YW5jZSBfX24pIHsKLSAgX0Rpc3RhbmNlIF9fbSA9IDA7Ci0gIF9EaXN0YW5jZSBfX3QgPSBfX247Ci0gIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3QgJiYgX19tIDwgX19uOyArK19fbSwgKytfX2ZpcnN0KQotICAgIF9fb3V0X2l0ZVtfX21dID0gKl9fZmlyc3Q7Ci0KLSAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0KSB7Ci0gICAgKytfX3Q7Ci0gICAgX0Rpc3RhbmNlIF9fTSA9IF9fcmFuZChfX3QpOwotICAgIGlmIChfX00gPCBfX24pCi0gICAgICBfX291dF9pdGVbX19NXSA9ICpfX2ZpcnN0OwotICAgICsrX19maXJzdDsKLSAgfQotCi0gIHJldHVybiBfX291dF9pdGUgKyBfX207Ci19Ci0KLV9TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXI+Ci1fUmFuZG9tQWNjZXNzSXRlcgotcmFuZG9tX3NhbXBsZShfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LAotICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX291dF9maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIgX19vdXRfbGFzdCkgewotICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKLSAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fb3V0X2ZpcnN0LCBfX291dF9sYXN0KSkKLSAgcmV0dXJuIF9TVExQX1BSSVYgX19yYW5kb21fc2FtcGxlKF9fZmlyc3QsIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fb3V0X2ZpcnN0LCBfX291dF9sYXN0IC0gX19vdXRfZmlyc3QpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9SYW5kb21OdW1iZXJHZW5lcmF0b3I+Ci1fUmFuZG9tQWNjZXNzSXRlcgotcmFuZG9tX3NhbXBsZShfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LAotICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX291dF9maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIgX19vdXRfbGFzdCwKLSAgICAgICAgICAgICAgX1JhbmRvbU51bWJlckdlbmVyYXRvciYgX19yYW5kKSB7Ci0gIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQotICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19vdXRfZmlyc3QsIF9fb3V0X2xhc3QpKQotICByZXR1cm4gX1NUTFBfUFJJViBfX3JhbmRvbV9zYW1wbGUoX19maXJzdCwgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19vdXRfZmlyc3QsIF9fcmFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fb3V0X2xhc3QgLSBfX291dF9maXJzdCk7Ci19Ci0KLSNlbmRpZiAvKiBfU1RMUF9OT19FWFRFTlNJT05TICovCi0KLS8vIHBhcnRpdGlvbiwgc3RhYmxlX3BhcnRpdGlvbiwgYW5kIHRoZWlyIGF1eGlsaWFyeSBmdW5jdGlvbnMKLV9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKLQotdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1ByZWRpY2F0ZT4KLV9TVExQX0lOTElORV9MT09QIF9Gb3J3YXJkSXRlciBfX3BhcnRpdGlvbihfRm9yd2FyZEl0ZXIgX19maXJzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXIgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QcmVkaWNhdGUgICBfX3ByZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9yd2FyZF9pdGVyYXRvcl90YWcgJikgewotICBpZiAoX19maXJzdCA9PSBfX2xhc3QpIHJldHVybiBfX2ZpcnN0OwotCi0gIHdoaWxlIChfX3ByZWQoKl9fZmlyc3QpKQotICAgIGlmICgrK19fZmlyc3QgPT0gX19sYXN0KSByZXR1cm4gX19maXJzdDsKLQotICBfRm9yd2FyZEl0ZXIgX19uZXh0ID0gX19maXJzdDsKLQotICB3aGlsZSAoKytfX25leHQgIT0gX19sYXN0KSB7Ci0gICAgaWYgKF9fcHJlZCgqX19uZXh0KSkgewotICAgICAgc3dhcCgqX19maXJzdCwgKl9fbmV4dCk7Ci0gICAgICArK19fZmlyc3Q7Ci0gICAgfQotICB9Ci0gIHJldHVybiBfX2ZpcnN0OwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyLCBjbGFzcyBfUHJlZGljYXRlPgotX1NUTFBfSU5MSU5FX0xPT1AgX0JpZGlyZWN0aW9uYWxJdGVyIF9fcGFydGl0aW9uKF9CaWRpcmVjdGlvbmFsSXRlciBfX2ZpcnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1ByZWRpY2F0ZSBfX3ByZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgJikgewotICBmb3IgKDs7KSB7Ci0gICAgZm9yICg7OykgewotICAgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQotICAgICAgICByZXR1cm4gX19maXJzdDsKLSAgICAgIGVsc2UgaWYgKF9fcHJlZCgqX19maXJzdCkpCi0gICAgICAgICsrX19maXJzdDsKLSAgICAgIGVsc2UKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIC0tX19sYXN0OwotICAgIGZvciAoOzspIHsKLSAgICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKLSAgICAgICAgcmV0dXJuIF9fZmlyc3Q7Ci0gICAgICBlbHNlIGlmICghX19wcmVkKCpfX2xhc3QpKQotICAgICAgICAtLV9fbGFzdDsKLSAgICAgIGVsc2UKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGl0ZXJfc3dhcChfX2ZpcnN0LCBfX2xhc3QpOwotICAgICsrX19maXJzdDsKLSAgfQotfQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfTk9OVEVNUExfQkFTRV9NQVRDSF9CVUcpCi10ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyLCBjbGFzcyBfUHJlZGljYXRlPgotaW5saW5lCi1fQmlkaXJlY3Rpb25hbEl0ZXIgX19wYXJ0aXRpb24oX0JpZGlyZWN0aW9uYWxJdGVyIF9fZmlyc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHJlZGljYXRlIF9fcHJlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyAmKSB7Ci0gIHJldHVybiBfX3BhcnRpdGlvbihfX2ZpcnN0LCBfX2xhc3QsIF9fcHJlZCwgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcoKSk7Ci19Ci0jZW5kaWYKLQotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi0KLXRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9QcmVkaWNhdGU+Ci1fRm9yd2FyZEl0ZXIgcGFydGl0aW9uKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LCBfUHJlZGljYXRlICAgX19wcmVkKSB7Ci0gIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQotICByZXR1cm4gX1NUTFBfUFJJViBfX3BhcnRpdGlvbihfX2ZpcnN0LCBfX2xhc3QsIF9fcHJlZCwgX1NUTFBfSVRFUkFUT1JfQ0FURUdPUlkoX19maXJzdCwgX0ZvcndhcmRJdGVyKSk7Ci19Ci0KLQotLyogX19wcmVkX29mX2ZpcnN0OiBmYWxzZSBpZiB3ZSBrbm93IHRoYXQgX19wcmVkKCpfX2ZpcnN0KSBpcyBmYWxzZSwKLSAqICAgICAgICAgICAgICAgICAgdHJ1ZSB3aGVuIHdlIGRvbid0IGtub3cgdGhlIHJlc3VsdCBvZiBfX3ByZWQoKl9fZmlyc3QpLgotICogX19ub3RfcHJlZF9vZl9iZWZvcmVfbGFzdDogdHJ1ZSBpZiB3ZSBrbm93IHRoYXQgX19wcmVkKCotLV9fbGFzdCkgaXMgdHJ1ZSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIHdoZW4gd2UgZG9uJ3Qga25vdyB0aGUgcmVzdWx0IG9mIF9fcHJlZCgqLS1fX2xhc3QpLgotICovCi1fU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCi0KLXRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9QcmVkaWNhdGUsIGNsYXNzIF9EaXN0YW5jZT4KLV9Gb3J3YXJkSXRlciBfX2lucGxhY2Vfc3RhYmxlX3BhcnRpdGlvbihfRm9yd2FyZEl0ZXIgX19maXJzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXIgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QcmVkaWNhdGUgX19wcmVkLCBfRGlzdGFuY2UgX19sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBfX3ByZWRfb2ZfZmlyc3QsIGJvb2wgX19wcmVkX29mX2JlZm9yZV9sYXN0KSB7Ci0gIGlmIChfX2xlbiA9PSAxKQotICAgIHJldHVybiAoX19wcmVkX29mX2ZpcnN0ICYmIChfX3ByZWRfb2ZfYmVmb3JlX2xhc3QgfHwgX19wcmVkKCpfX2ZpcnN0KSkpID8gX19sYXN0IDogX19maXJzdDsKLSAgX0ZvcndhcmRJdGVyIF9fbWlkZGxlID0gX19maXJzdDsKLSAgX0Rpc3RhbmNlIF9faGFsZl9sZW4gPSBfX2xlbiAvIDI7Ci0gIGFkdmFuY2UoX19taWRkbGUsIF9faGFsZl9sZW4pOwotICByZXR1cm4gX19yb3RhdGUoX19pbnBsYWNlX3N0YWJsZV9wYXJ0aXRpb24oX19maXJzdCwgX19taWRkbGUsIF9fcHJlZCwgX19oYWxmX2xlbiwgX19wcmVkX29mX2ZpcnN0LCBmYWxzZSksCi0gICAgICAgICAgICAgICAgICBfX21pZGRsZSwKLSAgICAgICAgICAgICAgICAgIF9faW5wbGFjZV9zdGFibGVfcGFydGl0aW9uKF9fbWlkZGxlLCBfX2xhc3QsIF9fcHJlZCwgX19sZW4gLSBfX2hhbGZfbGVuLCB0cnVlLCBfX3ByZWRfb2ZfYmVmb3JlX2xhc3QpKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1BvaW50ZXIsIGNsYXNzIF9QcmVkaWNhdGUsCi0gICAgICAgICAgY2xhc3MgX0Rpc3RhbmNlPgotX0ZvcndhcmRJdGVyIF9fc3RhYmxlX3BhcnRpdGlvbl9hZGFwdGl2ZShfRm9yd2FyZEl0ZXIgX19maXJzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1ByZWRpY2F0ZSBfX3ByZWQsIF9EaXN0YW5jZSBfX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1BvaW50ZXIgX19idWZmZXIsIF9EaXN0YW5jZSBfX2J1ZmZlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIF9fcHJlZF9vZl9maXJzdCwgYm9vbCBfX3ByZWRfb2ZfYmVmb3JlX2xhc3QpIHsKLSAgaWYgKF9fbGVuIDw9IF9fYnVmZmVyX3NpemUpIHsKLSAgICBfRm9yd2FyZEl0ZXIgX19yZXN1bHQxID0gX19maXJzdDsKLSAgICBfUG9pbnRlciBfX3Jlc3VsdDIgPSBfX2J1ZmZlcjsKLSAgICBpZiAoKF9fZmlyc3QgIT0gX19sYXN0KSAmJiAoIV9fcHJlZF9vZl9maXJzdCB8fCBfX3ByZWQoKl9fZmlyc3QpKSkgewotICAgICAgKl9fcmVzdWx0MiA9ICpfX2ZpcnN0OwotICAgICAgKytfX3Jlc3VsdDI7ICsrX19maXJzdDsgLS1fX2xlbjsKLSAgICB9Ci0gICAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0IDsgKytfX2ZpcnN0LCAtLV9fbGVuKSB7Ci0gICAgICBpZiAoKChfX2xlbiA9PSAxKSAmJiAoX19wcmVkX29mX2JlZm9yZV9sYXN0IHx8IF9fcHJlZCgqX19maXJzdCkpKSB8fAotICAgICAgICAgICgoX19sZW4gIT0gMSkgJiYgX19wcmVkKCpfX2ZpcnN0KSkpewotICAgICAgICAqX19yZXN1bHQxID0gKl9fZmlyc3Q7Ci0gICAgICAgICsrX19yZXN1bHQxOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgICpfX3Jlc3VsdDIgPSAqX19maXJzdDsKLSAgICAgICAgKytfX3Jlc3VsdDI7Ci0gICAgICB9Ci0gICAgfQotICAgIGNvcHkoX19idWZmZXIsIF9fcmVzdWx0MiwgX19yZXN1bHQxKTsKLSAgICByZXR1cm4gX19yZXN1bHQxOwotICB9Ci0gIGVsc2UgewotICAgIF9Gb3J3YXJkSXRlciBfX21pZGRsZSA9IF9fZmlyc3Q7Ci0gICAgX0Rpc3RhbmNlIF9faGFsZl9sZW4gPSBfX2xlbiAvIDI7Ci0gICAgYWR2YW5jZShfX21pZGRsZSwgX19oYWxmX2xlbik7Ci0gICAgcmV0dXJuIF9fcm90YXRlKF9fc3RhYmxlX3BhcnRpdGlvbl9hZGFwdGl2ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgX19maXJzdCwgX19taWRkbGUsIF9fcHJlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgX19oYWxmX2xlbiwgX19idWZmZXIsIF9fYnVmZmVyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIF9fcHJlZF9vZl9maXJzdCwgZmFsc2UpLAotICAgICAgICAgICAgICAgICAgICBfX21pZGRsZSwKLSAgICAgICAgICAgICAgICAgICAgX19zdGFibGVfcGFydGl0aW9uX2FkYXB0aXZlKAotICAgICAgICAgICAgICAgICAgICAgICAgICBfX21pZGRsZSwgX19sYXN0LCBfX3ByZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIF9fbGVuIC0gX19oYWxmX2xlbiwgX19idWZmZXIsIF9fYnVmZmVyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIF9fcHJlZF9vZl9iZWZvcmVfbGFzdCkpOwotICB9Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9QcmVkaWNhdGUsIGNsYXNzIF9UcCwgY2xhc3MgX0Rpc3RhbmNlPgotaW5saW5lIF9Gb3J3YXJkSXRlcgotX19zdGFibGVfcGFydGl0aW9uX2F1eF9hdXgoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBfUHJlZGljYXRlIF9fcHJlZCwgX1RwKiwgX0Rpc3RhbmNlKiwgYm9vbCBfX3ByZWRfb2ZfYmVmb3JlX2xhc3QgPSBmYWxzZSkgewotICBfVGVtcG9yYXJ5X2J1ZmZlcjxfRm9yd2FyZEl0ZXIsIF9UcD4gX19idWYoX19maXJzdCwgX19sYXN0KTsKLSAgX1NUTFBfTVBXRklYX1RSWSAgICAvLypUWSAwNi8wMS8yMDAwIC0gdGhleSBmb3JnZXQgdG8gY2FsbCBkdG9yIGZvciBfVGVtcG9yYXJ5X2J1ZmZlciBpZiBubyB0cnkvY2F0Y2ggYmxvY2sgaXMgcHJlc2VudAotICByZXR1cm4gKF9fYnVmLnNpemUoKSA+IDApID8KLSAgICBfX3N0YWJsZV9wYXJ0aXRpb25fYWRhcHRpdmUoX19maXJzdCwgX19sYXN0LCBfX3ByZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EaXN0YW5jZShfX2J1Zi5yZXF1ZXN0ZWRfc2l6ZSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19idWYuYmVnaW4oKSwgX19idWYuc2l6ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgX19wcmVkX29mX2JlZm9yZV9sYXN0KSAgOgotICAgIF9faW5wbGFjZV9zdGFibGVfcGFydGl0aW9uKF9fZmlyc3QsIF9fbGFzdCwgX19wcmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EaXN0YW5jZShfX2J1Zi5yZXF1ZXN0ZWRfc2l6ZSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgX19wcmVkX29mX2JlZm9yZV9sYXN0KTsKLSAgX1NUTFBfTVBXRklYX0NBVENIICAvLypUWSAwNi8wMS8yMDAwIC0gdGhleSBmb3JnZXQgdG8gY2FsbCBkdG9yIGZvciBfVGVtcG9yYXJ5X2J1ZmZlciBpZiBubyB0cnkvY2F0Y2ggYmxvY2sgaXMgcHJlc2VudAotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfUHJlZGljYXRlPgotX0ZvcndhcmRJdGVyCi1fX3N0YWJsZV9wYXJ0aXRpb25fYXV4KF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LCBfUHJlZGljYXRlIF9fcHJlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9yd2FyZF9pdGVyYXRvcl90YWcgJikgewotICByZXR1cm4gX19zdGFibGVfcGFydGl0aW9uX2F1eF9hdXgoX19maXJzdCwgX19sYXN0LCBfX3ByZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsIF9Gb3J3YXJkSXRlciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9ESVNUQU5DRV9UWVBFKF9fZmlyc3QsIF9Gb3J3YXJkSXRlcikpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0SXRlciwgY2xhc3MgX1ByZWRpY2F0ZT4KLV9CaWRpcmVjdEl0ZXIKLV9fc3RhYmxlX3BhcnRpdGlvbl9hdXgoX0JpZGlyZWN0SXRlciBfX2ZpcnN0LCBfQmlkaXJlY3RJdGVyIF9fbGFzdCwgX1ByZWRpY2F0ZSBfX3ByZWQsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnICYpIHsKLSAgZm9yICgtLV9fbGFzdDs7KSB7Ci0gICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQotICAgICAgcmV0dXJuIF9fZmlyc3Q7Ci0gICAgZWxzZSBpZiAoIV9fcHJlZCgqX19sYXN0KSkKLSAgICAgIC0tX19sYXN0OwotICAgIGVsc2UKLSAgICAgIGJyZWFrOwotICB9Ci0gICsrX19sYXN0OwotICAvL0hlcmUgd2Uga25vdyB0aGF0IF9fcHJlZCgqLS1fX2xhc3QpIGlzIHRydWUKLSAgcmV0dXJuIF9fc3RhYmxlX3BhcnRpdGlvbl9hdXhfYXV4KF9fZmlyc3QsIF9fbGFzdCwgX19wcmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfVkFMVUVfVFlQRShfX2ZpcnN0LCBfQmlkaXJlY3RJdGVyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX0RJU1RBTkNFX1RZUEUoX19maXJzdCwgX0JpZGlyZWN0SXRlciksIHRydWUpOwotfQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfTk9OVEVNUExfQkFTRV9NQVRDSF9CVUcpCi10ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0SXRlciwgY2xhc3MgX1ByZWRpY2F0ZT4KLV9CaWRpcmVjdEl0ZXIKLV9fc3RhYmxlX3BhcnRpdGlvbl9hdXgoX0JpZGlyZWN0SXRlciBfX2ZpcnN0LCBfQmlkaXJlY3RJdGVyIF9fbGFzdCwgX1ByZWRpY2F0ZSBfX3ByZWQsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnICYpIHsKLSAgcmV0dXJuIF9fc3RhYmxlX3BhcnRpdGlvbl9hdXgoX19maXJzdCwgX19sYXN0LCBfX3ByZWQsIGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnKCkpOwotfQotI2VuZGlmCi0KLV9TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfUHJlZGljYXRlPgotX0ZvcndhcmRJdGVyCi1zdGFibGVfcGFydGl0aW9uKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LCBfUHJlZGljYXRlIF9fcHJlZCkgewotICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKLSAgZm9yICg7OykgewotICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKLSAgICAgIHJldHVybiBfX2ZpcnN0OwotICAgIGVsc2UgaWYgKF9fcHJlZCgqX19maXJzdCkpCi0gICAgICArK19fZmlyc3Q7Ci0gICAgZWxzZQotICAgICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIF9TVExQX1BSSVYgX19zdGFibGVfcGFydGl0aW9uX2F1eChfX2ZpcnN0LCBfX2xhc3QsIF9fcHJlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9JVEVSQVRPUl9DQVRFR09SWShfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIpKTsKLX0KLQotX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmU+Ci1fUmFuZG9tQWNjZXNzSXRlciBfX3VuZ3VhcmRlZF9wYXJ0aXRpb24oX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1RwIF9fcGl2b3QsIF9Db21wYXJlIF9fY29tcCkgewotICBmb3IgKDs7KSB7Ci0gICAgd2hpbGUgKF9fY29tcCgqX19maXJzdCwgX19waXZvdCkpIHsKLSAgICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFfX2NvbXAoX19waXZvdCwgKl9fZmlyc3QpLCBfU3RsTXNnX0lOVkFMSURfU1RSSUNUX1dFQUtfUFJFRElDQVRFKQotICAgICAgKytfX2ZpcnN0OwotICAgIH0KLSAgICAtLV9fbGFzdDsKLSAgICB3aGlsZSAoX19jb21wKF9fcGl2b3QsICpfX2xhc3QpKSB7Ci0gICAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghX19jb21wKCpfX2xhc3QsIF9fcGl2b3QpLCBfU3RsTXNnX0lOVkFMSURfU1RSSUNUX1dFQUtfUFJFRElDQVRFKQotICAgICAgLS1fX2xhc3Q7Ci0gICAgfQotICAgIGlmICghKF9fZmlyc3QgPCBfX2xhc3QpKQotICAgICAgcmV0dXJuIF9fZmlyc3Q7Ci0gICAgaXRlcl9zd2FwKF9fZmlyc3QsIF9fbGFzdCk7Ci0gICAgKytfX2ZpcnN0OwotICB9Ci19Ci0KLS8vIHNvcnQoKSBhbmQgaXRzIGF1eGlsaWFyeSBmdW5jdGlvbnMuCi0jZGVmaW5lIF9fc3RsX3RocmVzaG9sZCAgMTYKLQotdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlPgotdm9pZCBfX3VuZ3VhcmRlZF9saW5lYXJfaW5zZXJ0KF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwgX1RwIF9fdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Db21wYXJlIF9fY29tcCkgewotICBfUmFuZG9tQWNjZXNzSXRlciBfX25leHQgPSBfX2xhc3Q7Ci0gIC0tX19uZXh0OwotICB3aGlsZSAoX19jb21wKF9fdmFsLCAqX19uZXh0KSkgewotICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFfX2NvbXAoKl9fbmV4dCwgX192YWwpLCBfU3RsTXNnX0lOVkFMSURfU1RSSUNUX1dFQUtfUFJFRElDQVRFKQotICAgICpfX2xhc3QgPSAqX19uZXh0OwotICAgIF9fbGFzdCA9IF9fbmV4dDsKLSAgICAtLV9fbmV4dDsKLSAgfQotICAqX19sYXN0ID0gX192YWw7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZT4KLWlubGluZSB2b2lkIF9fbGluZWFyX2luc2VydChfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwgX1RwIF9fdmFsLCBfQ29tcGFyZSBfX2NvbXApIHsKLSAgLy8qVFkgMTIvMjYvMTk5OCAtIGFkZGVkIF9fdmFsIGFzIGEgcGFyYW10ZXIKLSAgLy8gIF9UcCBfX3ZhbCA9ICpfX2xhc3Q7ICAgICAgICAvLypUWSAxMi8yNi8xOTk4IC0gX192YWwgc3VwcGxpZWQgYnkgY2FsbGVyCi0gIGlmIChfX2NvbXAoX192YWwsICpfX2ZpcnN0KSkgewotICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFfX2NvbXAoKl9fZmlyc3QsIF9fdmFsKSwgX1N0bE1zZ19JTlZBTElEX1NUUklDVF9XRUFLX1BSRURJQ0FURSkKLSAgICBjb3B5X2JhY2t3YXJkKF9fZmlyc3QsIF9fbGFzdCwgX19sYXN0ICsgMSk7Ci0gICAgKl9fZmlyc3QgPSBfX3ZhbDsKLSAgfQotICBlbHNlCi0gICAgX191bmd1YXJkZWRfbGluZWFyX2luc2VydChfX2xhc3QsIF9fdmFsLCBfX2NvbXApOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmU+Ci12b2lkIF9faW5zZXJ0aW9uX3NvcnQoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwKLSAgICAgICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgX1RwICosIF9Db21wYXJlIF9fY29tcCkgewotICBpZiAoX19maXJzdCA9PSBfX2xhc3QpIHJldHVybjsKLSAgZm9yIChfUmFuZG9tQWNjZXNzSXRlciBfX2kgPSBfX2ZpcnN0ICsgMTsgX19pICE9IF9fbGFzdDsgKytfX2kpCi0gICAgX19saW5lYXJfaW5zZXJ0PF9SYW5kb21BY2Nlc3NJdGVyLCBfVHAsIF9Db21wYXJlPihfX2ZpcnN0LCBfX2ksICpfX2ksIF9fY29tcCk7ICAvLypUWSAxMi8yNi8xOTk4IC0gc3VwcGx5ICpfX2kgYXMgX192YWwKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlPgotdm9pZCBfX3VuZ3VhcmRlZF9pbnNlcnRpb25fc29ydF9hdXgoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9UcCosIF9Db21wYXJlIF9fY29tcCkgewotICBmb3IgKF9SYW5kb21BY2Nlc3NJdGVyIF9faSA9IF9fZmlyc3Q7IF9faSAhPSBfX2xhc3Q7ICsrX19pKQotICAgIF9fdW5ndWFyZGVkX2xpbmVhcl9pbnNlcnQ8X1JhbmRvbUFjY2Vzc0l0ZXIsIF9UcCwgX0NvbXBhcmU+KF9faSwgKl9faSwgX19jb21wKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBjbGFzcyBfQ29tcGFyZT4KLWlubGluZSB2b2lkIF9fdW5ndWFyZGVkX2luc2VydGlvbl9zb3J0KF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ29tcGFyZSBfX2NvbXApIHsKLSAgX191bmd1YXJkZWRfaW5zZXJ0aW9uX3NvcnRfYXV4KF9fZmlyc3QsIF9fbGFzdCwgX1NUTFBfVkFMVUVfVFlQRShfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlciksIF9fY29tcCk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX0NvbXBhcmU+Ci12b2lkIF9fZmluYWxfaW5zZXJ0aW9uX3NvcnQoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsIF9Db21wYXJlIF9fY29tcCkgewotICBpZiAoX19sYXN0IC0gX19maXJzdCA+IF9fc3RsX3RocmVzaG9sZCkgewotICAgIF9faW5zZXJ0aW9uX3NvcnQoX19maXJzdCwgX19maXJzdCArIF9fc3RsX3RocmVzaG9sZCwgX1NUTFBfVkFMVUVfVFlQRShfX2ZpcnN0LF9SYW5kb21BY2Nlc3NJdGVyKSwgX19jb21wKTsKLSAgICBfX3VuZ3VhcmRlZF9pbnNlcnRpb25fc29ydChfX2ZpcnN0ICsgX19zdGxfdGhyZXNob2xkLCBfX2xhc3QsIF9fY29tcCk7Ci0gIH0KLSAgZWxzZQotICAgIF9faW5zZXJ0aW9uX3NvcnQoX19maXJzdCwgX19sYXN0LCBfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsX1JhbmRvbUFjY2Vzc0l0ZXIpLCBfX2NvbXApOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9UcCwgY2xhc3MgX1NpemUsIGNsYXNzIF9Db21wYXJlPgotdm9pZCBfX2ludHJvc29ydF9sb29wKF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsCi0gICAgICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0LCBfVHAqLAotICAgICAgICAgICAgICAgICAgICAgIF9TaXplIF9fZGVwdGhfbGltaXQsIF9Db21wYXJlIF9fY29tcCkgewotICB3aGlsZSAoX19sYXN0IC0gX19maXJzdCA+IF9fc3RsX3RocmVzaG9sZCkgewotICAgIGlmIChfX2RlcHRoX2xpbWl0ID09IDApIHsKLSAgICAgIHBhcnRpYWxfc29ydChfX2ZpcnN0LCBfX2xhc3QsIF9fbGFzdCwgX19jb21wKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgLS1fX2RlcHRoX2xpbWl0OwotICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fY3V0ID0KLSAgICAgIF9fdW5ndWFyZGVkX3BhcnRpdGlvbihfX2ZpcnN0LCBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX1RwKF9fbWVkaWFuKCpfX2ZpcnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKF9fZmlyc3QgKyAoX19sYXN0IC0gX19maXJzdCkvMiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooX19sYXN0IC0gMSksIF9fY29tcCkpLAotICAgICAgIF9fY29tcCk7Ci0gICAgX19pbnRyb3NvcnRfbG9vcChfX2N1dCwgX19sYXN0LCAoX1RwKikgMCwgX19kZXB0aF9saW1pdCwgX19jb21wKTsKLSAgICBfX2xhc3QgPSBfX2N1dDsKLSAgfQotfQotCi1fU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKLQotdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyPgotdm9pZCBzb3J0KF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCkgewotICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKLSAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KSB7Ci0gICAgX1NUTFBfUFJJViBfX2ludHJvc29ydF9sb29wKF9fZmlyc3QsIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfVkFMVUVfVFlQRShfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX19sZyhfX2xhc3QgLSBfX2ZpcnN0KSAqIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX19sZXNzKF9TVExQX1ZBTFVFX1RZUEUoX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIpKSk7Ci0gICAgX1NUTFBfUFJJViBfX2ZpbmFsX2luc2VydGlvbl9zb3J0KF9fZmlyc3QsIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfX2xlc3MoX1NUTFBfVkFMVUVfVFlQRShfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcikpKTsKLSAgfQotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9Db21wYXJlPgotdm9pZCBzb3J0KF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwgX0NvbXBhcmUgX19jb21wKSB7Ci0gIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQotICBpZiAoX19maXJzdCAhPSBfX2xhc3QpIHsKLSAgICBfU1RMUF9QUklWIF9faW50cm9zb3J0X2xvb3AoX19maXJzdCwgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfX2xnKF9fbGFzdCAtIF9fZmlyc3QpICogMiwgX19jb21wKTsKLSAgICBfU1RMUF9QUklWIF9fZmluYWxfaW5zZXJ0aW9uX3NvcnQoX19maXJzdCwgX19sYXN0LCBfX2NvbXApOwotICB9Ci19Ci0KLS8vIHN0YWJsZV9zb3J0KCkgYW5kIGl0cyBhdXhpbGlhcnkgZnVuY3Rpb25zLgotX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9Db21wYXJlPgotdm9pZCBfX2lucGxhY2Vfc3RhYmxlX3NvcnQoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwgX0NvbXBhcmUgX19jb21wKSB7Ci0gIGlmIChfX2xhc3QgLSBfX2ZpcnN0IDwgMTUpIHsKLSAgICBfX2luc2VydGlvbl9zb3J0KF9fZmlyc3QsIF9fbGFzdCwgX1NUTFBfVkFMVUVfVFlQRShfX2ZpcnN0LF9SYW5kb21BY2Nlc3NJdGVyKSwgX19jb21wKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19taWRkbGUgPSBfX2ZpcnN0ICsgKF9fbGFzdCAtIF9fZmlyc3QpIC8gMjsKLSAgX19pbnBsYWNlX3N0YWJsZV9zb3J0KF9fZmlyc3QsIF9fbWlkZGxlLCBfX2NvbXApOwotICBfX2lucGxhY2Vfc3RhYmxlX3NvcnQoX19taWRkbGUsIF9fbGFzdCwgX19jb21wKTsKLSAgX19tZXJnZV93aXRob3V0X2J1ZmZlcihfX2ZpcnN0LCBfX21pZGRsZSwgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgIF9fbWlkZGxlIC0gX19maXJzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBfX2xhc3QgLSBfX21pZGRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBfX2NvbXApOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIxLCBjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcjIsCi0gICAgICAgICAgY2xhc3MgX0Rpc3RhbmNlLCBjbGFzcyBfQ29tcGFyZT4KLXZvaWQgX19tZXJnZV9zb3J0X2xvb3AoX1JhbmRvbUFjY2Vzc0l0ZXIxIF9fZmlyc3QsCi0gICAgICAgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyMSBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyMiBfX3Jlc3VsdCwgX0Rpc3RhbmNlIF9fc3RlcF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICBfQ29tcGFyZSBfX2NvbXApIHsKLSAgX0Rpc3RhbmNlIF9fdHdvX3N0ZXAgPSAyICogX19zdGVwX3NpemU7Ci0KLSAgd2hpbGUgKF9fbGFzdCAtIF9fZmlyc3QgPj0gX190d29fc3RlcCkgewotICAgIF9fcmVzdWx0ID0gbWVyZ2UoX19maXJzdCwgX19maXJzdCArIF9fc3RlcF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgX19maXJzdCArIF9fc3RlcF9zaXplLCBfX2ZpcnN0ICsgX190d29fc3RlcCwKLSAgICAgICAgICAgICAgICAgICAgIF9fcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgX19jb21wKTsKLSAgICBfX2ZpcnN0ICs9IF9fdHdvX3N0ZXA7Ci0gIH0KLSAgX19zdGVwX3NpemUgPSAobWluKSAoX0Rpc3RhbmNlKF9fbGFzdCAtIF9fZmlyc3QpLCBfX3N0ZXBfc2l6ZSk7Ci0KLSAgbWVyZ2UoX19maXJzdCwgX19maXJzdCArIF9fc3RlcF9zaXplLAotICAgICAgICBfX2ZpcnN0ICsgX19zdGVwX3NpemUsIF9fbGFzdCwKLSAgICAgICAgX19yZXN1bHQsCi0gICAgICAgIF9fY29tcCk7Ci19Ci0KLWNvbnN0IGludCBfX3N0bF9jaHVua19zaXplID0gNzsKLQotdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBjbGFzcyBfRGlzdGFuY2UsIGNsYXNzIF9Db21wYXJlPgotdm9pZCBfX2NodW5rX2luc2VydGlvbl9zb3J0KF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EaXN0YW5jZSBfX2NodW5rX3NpemUsIF9Db21wYXJlIF9fY29tcCkgewotICB3aGlsZSAoX19sYXN0IC0gX19maXJzdCA+PSBfX2NodW5rX3NpemUpIHsKLSAgICBfX2luc2VydGlvbl9zb3J0KF9fZmlyc3QsIF9fZmlyc3QgKyBfX2NodW5rX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICBfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsX1JhbmRvbUFjY2Vzc0l0ZXIpLCBfX2NvbXApOwotICAgIF9fZmlyc3QgKz0gX19jaHVua19zaXplOwotICB9Ci0gIF9faW5zZXJ0aW9uX3NvcnQoX19maXJzdCwgX19sYXN0LCBfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsX1JhbmRvbUFjY2Vzc0l0ZXIpLCBfX2NvbXApOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9Qb2ludGVyLCBjbGFzcyBfRGlzdGFuY2UsCi0gICAgICAgICAgY2xhc3MgX0NvbXBhcmU+Ci12b2lkIF9fbWVyZ2Vfc29ydF93aXRoX2J1ZmZlcihfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0LCBfUG9pbnRlciBfX2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EaXN0YW5jZSosIF9Db21wYXJlIF9fY29tcCkgewotICBfRGlzdGFuY2UgX19sZW4gPSBfX2xhc3QgLSBfX2ZpcnN0OwotICBfUG9pbnRlciBfX2J1ZmZlcl9sYXN0ID0gX19idWZmZXIgKyBfX2xlbjsKLQotICBfRGlzdGFuY2UgX19zdGVwX3NpemUgPSBfX3N0bF9jaHVua19zaXplOwotICBfX2NodW5rX2luc2VydGlvbl9zb3J0KF9fZmlyc3QsIF9fbGFzdCwgX19zdGVwX3NpemUsIF9fY29tcCk7Ci0KLSAgd2hpbGUgKF9fc3RlcF9zaXplIDwgX19sZW4pIHsKLSAgICBfX21lcmdlX3NvcnRfbG9vcChfX2ZpcnN0LCBfX2xhc3QsIF9fYnVmZmVyLCBfX3N0ZXBfc2l6ZSwgX19jb21wKTsKLSAgICBfX3N0ZXBfc2l6ZSAqPSAyOwotICAgIF9fbWVyZ2Vfc29ydF9sb29wKF9fYnVmZmVyLCBfX2J1ZmZlcl9sYXN0LCBfX2ZpcnN0LCBfX3N0ZXBfc2l6ZSwgX19jb21wKTsKLSAgICBfX3N0ZXBfc2l6ZSAqPSAyOwotICB9Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXIxLCBjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXIyLAotICAgICAgICAgIGNsYXNzIF9EaXN0YW5jZT4KLV9CaWRpcmVjdGlvbmFsSXRlcjEgX19yb3RhdGVfYWRhcHRpdmUoX0JpZGlyZWN0aW9uYWxJdGVyMSBfX2ZpcnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIxIF9fbWlkZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIxIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0Rpc3RhbmNlIF9fbGVuMSwgX0Rpc3RhbmNlIF9fbGVuMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyMiBfX2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0Rpc3RhbmNlIF9fYnVmZmVyX3NpemUpIHsKLSAgaWYgKF9fbGVuMSA+IF9fbGVuMiAmJiBfX2xlbjIgPD0gX19idWZmZXJfc2l6ZSkgewotICAgIF9CaWRpcmVjdGlvbmFsSXRlcjIgX19idWZmZXJfZW5kID0gY29weShfX21pZGRsZSwgX19sYXN0LCBfX2J1ZmZlcik7Ci0gICAgY29weV9iYWNrd2FyZChfX2ZpcnN0LCBfX21pZGRsZSwgX19sYXN0KTsKLSAgICByZXR1cm4gY29weShfX2J1ZmZlciwgX19idWZmZXJfZW5kLCBfX2ZpcnN0KTsKLSAgfQotICBlbHNlIGlmIChfX2xlbjEgPD0gX19idWZmZXJfc2l6ZSkgewotICAgIF9CaWRpcmVjdGlvbmFsSXRlcjIgX19idWZmZXJfZW5kID0gY29weShfX2ZpcnN0LCBfX21pZGRsZSwgX19idWZmZXIpOwotICAgIGNvcHkoX19taWRkbGUsIF9fbGFzdCwgX19maXJzdCk7Ci0gICAgcmV0dXJuIGNvcHlfYmFja3dhcmQoX19idWZmZXIsIF9fYnVmZmVyX2VuZCwgX19sYXN0KTsKLSAgfQotICBlbHNlCi0gICAgcmV0dXJuIF9fcm90YXRlKF9fZmlyc3QsIF9fbWlkZGxlLCBfX2xhc3QpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyLCBjbGFzcyBfRGlzdGFuY2UsIGNsYXNzIF9Qb2ludGVyLAotICAgICAgICAgIGNsYXNzIF9Db21wYXJlPgotdm9pZCBfX21lcmdlX2FkYXB0aXZlKF9CaWRpcmVjdGlvbmFsSXRlciBfX2ZpcnN0LAotICAgICAgICAgICAgICAgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlciBfX21pZGRsZSwKLSAgICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgIF9EaXN0YW5jZSBfX2xlbjEsIF9EaXN0YW5jZSBfX2xlbjIsCi0gICAgICAgICAgICAgICAgICAgICAgX1BvaW50ZXIgX19idWZmZXIsIF9EaXN0YW5jZSBfX2J1ZmZlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgIF9Db21wYXJlIF9fY29tcCkgewotICBpZiAoX19sZW4xIDw9IF9fbGVuMiAmJiBfX2xlbjEgPD0gX19idWZmZXJfc2l6ZSkgewotICAgIF9Qb2ludGVyIF9fYnVmZmVyX2VuZCA9IGNvcHkoX19maXJzdCwgX19taWRkbGUsIF9fYnVmZmVyKTsKLSAgICBtZXJnZShfX2J1ZmZlciwgX19idWZmZXJfZW5kLCBfX21pZGRsZSwgX19sYXN0LCBfX2ZpcnN0LCBfX2NvbXApOwotICB9Ci0gIGVsc2UgaWYgKF9fbGVuMiA8PSBfX2J1ZmZlcl9zaXplKSB7Ci0gICAgX1BvaW50ZXIgX19idWZmZXJfZW5kID0gY29weShfX21pZGRsZSwgX19sYXN0LCBfX2J1ZmZlcik7Ci0gICAgX19tZXJnZV9iYWNrd2FyZChfX2ZpcnN0LCBfX21pZGRsZSwgX19idWZmZXIsIF9fYnVmZmVyX2VuZCwgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgX19jb21wKTsKLSAgfQotICBlbHNlIHsKLSAgICBfQmlkaXJlY3Rpb25hbEl0ZXIgX19maXJzdF9jdXQgPSBfX2ZpcnN0OwotICAgIF9CaWRpcmVjdGlvbmFsSXRlciBfX3NlY29uZF9jdXQgPSBfX21pZGRsZTsKLSAgICBfRGlzdGFuY2UgX19sZW4xMSA9IDA7Ci0gICAgX0Rpc3RhbmNlIF9fbGVuMjIgPSAwOwotICAgIGlmIChfX2xlbjEgPiBfX2xlbjIpIHsKLSAgICAgIF9fbGVuMTEgPSBfX2xlbjEgLyAyOwotICAgICAgYWR2YW5jZShfX2ZpcnN0X2N1dCwgX19sZW4xMSk7Ci0gICAgICBfX3NlY29uZF9jdXQgPSBsb3dlcl9ib3VuZChfX21pZGRsZSwgX19sYXN0LCAqX19maXJzdF9jdXQsIF9fY29tcCk7Ci0gICAgICBfX2xlbjIyICs9IGRpc3RhbmNlKF9fbWlkZGxlLCBfX3NlY29uZF9jdXQpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIF9fbGVuMjIgPSBfX2xlbjIgLyAyOwotICAgICAgYWR2YW5jZShfX3NlY29uZF9jdXQsIF9fbGVuMjIpOwotICAgICAgX19maXJzdF9jdXQgPSB1cHBlcl9ib3VuZChfX2ZpcnN0LCBfX21pZGRsZSwgKl9fc2Vjb25kX2N1dCwgX19jb21wKTsKLSAgICAgIF9fbGVuMTEgKz0gZGlzdGFuY2UoX19maXJzdCwgX19maXJzdF9jdXQpOwotICAgIH0KLSAgICBfQmlkaXJlY3Rpb25hbEl0ZXIgX19uZXdfbWlkZGxlID0KLSAgICAgIF9fcm90YXRlX2FkYXB0aXZlKF9fZmlyc3RfY3V0LCBfX21pZGRsZSwgX19zZWNvbmRfY3V0LCBfX2xlbjEgLSBfX2xlbjExLAotICAgICAgICAgICAgICAgICAgICAgICAgX19sZW4yMiwgX19idWZmZXIsIF9fYnVmZmVyX3NpemUpOwotICAgIF9fbWVyZ2VfYWRhcHRpdmUoX19maXJzdCwgX19maXJzdF9jdXQsIF9fbmV3X21pZGRsZSwgX19sZW4xMSwKLSAgICAgICAgICAgICAgICAgICAgIF9fbGVuMjIsIF9fYnVmZmVyLCBfX2J1ZmZlcl9zaXplLCBfX2NvbXApOwotICAgIF9fbWVyZ2VfYWRhcHRpdmUoX19uZXdfbWlkZGxlLCBfX3NlY29uZF9jdXQsIF9fbGFzdCwgX19sZW4xIC0gX19sZW4xMSwKLSAgICAgICAgICAgICAgICAgICAgIF9fbGVuMiAtIF9fbGVuMjIsIF9fYnVmZmVyLCBfX2J1ZmZlcl9zaXplLCBfX2NvbXApOwotICB9Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX1BvaW50ZXIsIGNsYXNzIF9EaXN0YW5jZSwKLSAgICAgICAgICBjbGFzcyBfQ29tcGFyZT4KLXZvaWQgX19zdGFibGVfc29ydF9hZGFwdGl2ZShfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwgX1BvaW50ZXIgX19idWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX0Rpc3RhbmNlIF9fYnVmZmVyX3NpemUsIF9Db21wYXJlIF9fY29tcCkgewotICBfRGlzdGFuY2UgX19sZW4gPSAoX19sYXN0IC0gX19maXJzdCArIDEpIC8gMjsKLSAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19taWRkbGUgPSBfX2ZpcnN0ICsgX19sZW47Ci0gIGlmIChfX2xlbiA+IF9fYnVmZmVyX3NpemUpIHsKLSAgICBfX3N0YWJsZV9zb3J0X2FkYXB0aXZlKF9fZmlyc3QsIF9fbWlkZGxlLCBfX2J1ZmZlciwgX19idWZmZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fY29tcCk7Ci0gICAgX19zdGFibGVfc29ydF9hZGFwdGl2ZShfX21pZGRsZSwgX19sYXN0LCBfX2J1ZmZlciwgX19idWZmZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fY29tcCk7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgX19tZXJnZV9zb3J0X3dpdGhfYnVmZmVyKF9fZmlyc3QsIF9fbWlkZGxlLCBfX2J1ZmZlciwgKF9EaXN0YW5jZSopMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2NvbXApOwotICAgIF9fbWVyZ2Vfc29ydF93aXRoX2J1ZmZlcihfX21pZGRsZSwgX19sYXN0LCBfX2J1ZmZlciwgKF9EaXN0YW5jZSopMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2NvbXApOwotICB9Ci0gIF9fbWVyZ2VfYWRhcHRpdmUoX19maXJzdCwgX19taWRkbGUsIF9fbGFzdCwgX0Rpc3RhbmNlKF9fbWlkZGxlIC0gX19maXJzdCksCi0gICAgICAgICAgICAgICAgICAgX0Rpc3RhbmNlKF9fbGFzdCAtIF9fbWlkZGxlKSwgX19idWZmZXIsIF9fYnVmZmVyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgX19jb21wKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBjbGFzcyBfVHAsIGNsYXNzIF9EaXN0YW5jZSwgY2xhc3MgX0NvbXBhcmU+Ci12b2lkIF9fc3RhYmxlX3NvcnRfYXV4KF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsCi0gICAgICAgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwgX1RwKiwgX0Rpc3RhbmNlKiwKLSAgICAgICAgICAgICAgICAgICAgICAgX0NvbXBhcmUgX19jb21wKSB7Ci0gIF9UZW1wb3JhcnlfYnVmZmVyPF9SYW5kb21BY2Nlc3NJdGVyLCBfVHA+IGJ1ZihfX2ZpcnN0LCBfX2xhc3QpOwotICBpZiAoYnVmLmJlZ2luKCkgPT0gMCkKLSAgICBfX2lucGxhY2Vfc3RhYmxlX3NvcnQoX19maXJzdCwgX19sYXN0LCBfX2NvbXApOwotICBlbHNlCi0gICAgX19zdGFibGVfc29ydF9hZGFwdGl2ZShfX2ZpcnN0LCBfX2xhc3QsIGJ1Zi5iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgX0Rpc3RhbmNlKGJ1Zi5zaXplKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgX19jb21wKTsKLX0KLQotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi0KLXRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcj4KLXZvaWQgc3RhYmxlX3NvcnQoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwKLSAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0KSB7Ci0gIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQotICBfU1RMUF9QUklWIF9fc3RhYmxlX3NvcnRfYXV4KF9fZmlyc3QsIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9ESVNUQU5DRV9UWVBFKF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fbGVzcyhfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyKSkpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9Db21wYXJlPgotdm9pZCBzdGFibGVfc29ydChfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LAotICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsIF9Db21wYXJlIF9fY29tcCkgewotICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKLSAgX1NUTFBfUFJJViBfX3N0YWJsZV9zb3J0X2F1eChfX2ZpcnN0LCBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfVkFMVUVfVFlQRShfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfRElTVEFOQ0VfVFlQRShfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19jb21wKTsKLX0KLQotLy8gcGFydGlhbF9zb3J0LCBwYXJ0aWFsX3NvcnRfY29weSwgYW5kIGF1eGlsaWFyeSBmdW5jdGlvbnMuCi1fU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCi0KLXRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZT4KLXZvaWQgX19wYXJ0aWFsX3NvcnQoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIgX19taWRkbGUsCi0gICAgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwgX1RwKiwgX0NvbXBhcmUgX19jb21wKSB7Ci0gIG1ha2VfaGVhcChfX2ZpcnN0LCBfX21pZGRsZSwgX19jb21wKTsKLSAgZm9yIChfUmFuZG9tQWNjZXNzSXRlciBfX2kgPSBfX21pZGRsZTsgX19pIDwgX19sYXN0OyArK19faSkgewotICAgIGlmIChfX2NvbXAoKl9faSwgKl9fZmlyc3QpKSB7Ci0gICAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghX19jb21wKCpfX2ZpcnN0LCAqX19pKSwgX1N0bE1zZ19JTlZBTElEX1NUUklDVF9XRUFLX1BSRURJQ0FURSkKLSAgICAgIF9fcG9wX2hlYXAoX19maXJzdCwgX19taWRkbGUsIF9faSwgX1RwKCpfX2kpLCBfX2NvbXAsCi0gICAgICAgICAgICAgICAgIF9TVExQX0RJU1RBTkNFX1RZUEUoX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIpKTsKLSAgICB9Ci0gIH0KLSAgc29ydF9oZWFwKF9fZmlyc3QsIF9fbWlkZGxlLCBfX2NvbXApOwotfQotCi1fU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKLQotdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyPgotdm9pZCBwYXJ0aWFsX3NvcnQoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCxfUmFuZG9tQWNjZXNzSXRlciBfX21pZGRsZSwKLSAgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCkgewotICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19taWRkbGUpKQotICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19taWRkbGUsIF9fbGFzdCkpCi0gIF9TVExQX1BSSVYgX19wYXJ0aWFsX3NvcnQoX19maXJzdCwgX19taWRkbGUsIF9fbGFzdCwgX1NUTFBfVkFMVUVfVFlQRShfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfX2xlc3MoX1NUTFBfVkFMVUVfVFlQRShfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcikpKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBjbGFzcyBfQ29tcGFyZT4KLXZvaWQgcGFydGlhbF9zb3J0KF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsX1JhbmRvbUFjY2Vzc0l0ZXIgX19taWRkbGUsCi0gICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsIF9Db21wYXJlIF9fY29tcCkgewotICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19taWRkbGUpKQotICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19taWRkbGUsIF9fbGFzdCkpCi0gIF9TVExQX1BSSVYgX19wYXJ0aWFsX3NvcnQoX19maXJzdCwgX19taWRkbGUsIF9fbGFzdCwgX1NUTFBfVkFMVUVfVFlQRShfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlciksIF9fY29tcCk7Ci19Ci0KLV9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKLQotdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBjbGFzcyBfQ29tcGFyZSwKLSAgICAgICAgICBjbGFzcyBfRGlzdGFuY2UsIGNsYXNzIF9UcD4KLV9SYW5kb21BY2Nlc3NJdGVyIF9fcGFydGlhbF9zb3J0X2NvcHkoX0lucHV0SXRlciBfX2ZpcnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19yZXN1bHRfZmlyc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fcmVzdWx0X2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Db21wYXJlIF9fY29tcCwgX0Rpc3RhbmNlKiwgX1RwKikgewotICBpZiAoX19yZXN1bHRfZmlyc3QgPT0gX19yZXN1bHRfbGFzdCkgcmV0dXJuIF9fcmVzdWx0X2xhc3Q7Ci0gIF9SYW5kb21BY2Nlc3NJdGVyIF9fcmVzdWx0X3JlYWxfbGFzdCA9IF9fcmVzdWx0X2ZpcnN0OwotICB3aGlsZShfX2ZpcnN0ICE9IF9fbGFzdCAmJiBfX3Jlc3VsdF9yZWFsX2xhc3QgIT0gX19yZXN1bHRfbGFzdCkgewotICAgICpfX3Jlc3VsdF9yZWFsX2xhc3QgPSAqX19maXJzdDsKLSAgICArK19fcmVzdWx0X3JlYWxfbGFzdDsKLSAgICArK19fZmlyc3Q7Ci0gIH0KLSAgbWFrZV9oZWFwKF9fcmVzdWx0X2ZpcnN0LCBfX3Jlc3VsdF9yZWFsX2xhc3QsIF9fY29tcCk7Ci0gIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkgewotICAgIGlmIChfX2NvbXAoKl9fZmlyc3QsICpfX3Jlc3VsdF9maXJzdCkpIHsKLSAgICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFfX2NvbXAoKl9fcmVzdWx0X2ZpcnN0LCAqX19maXJzdCksIF9TdGxNc2dfSU5WQUxJRF9TVFJJQ1RfV0VBS19QUkVESUNBVEUpCi0gICAgICBfX2FkanVzdF9oZWFwKF9fcmVzdWx0X2ZpcnN0LCBfRGlzdGFuY2UoMCksCi0gICAgICAgICAgICAgICAgICAgIF9EaXN0YW5jZShfX3Jlc3VsdF9yZWFsX2xhc3QgLSBfX3Jlc3VsdF9maXJzdCksCi0gICAgICAgICAgICAgICAgICAgIF9UcCgqX19maXJzdCksCi0gICAgICAgICAgICAgICAgICAgIF9fY29tcCk7Ci0gICAgfQotICAgICsrX19maXJzdDsKLSAgfQotICBzb3J0X2hlYXAoX19yZXN1bHRfZmlyc3QsIF9fcmVzdWx0X3JlYWxfbGFzdCwgX19jb21wKTsKLSAgcmV0dXJuIF9fcmVzdWx0X3JlYWxfbGFzdDsKLX0KLQotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi0KLXRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcj4KLV9SYW5kb21BY2Nlc3NJdGVyCi1wYXJ0aWFsX3NvcnRfY29weShfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LAotICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19yZXN1bHRfZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyIF9fcmVzdWx0X2xhc3QpIHsKLSAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCi0gIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX3Jlc3VsdF9maXJzdCwgX19yZXN1bHRfbGFzdCkpCi0gIHJldHVybiBfU1RMUF9QUklWIF9fcGFydGlhbF9zb3J0X2NvcHkoX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdF9maXJzdCwgX19yZXN1bHRfbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fbGVzcyhfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsIF9JbnB1dEl0ZXIpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9ESVNUQU5DRV9UWVBFKF9fcmVzdWx0X2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfVkFMVUVfVFlQRShfX2ZpcnN0LCBfSW5wdXRJdGVyKSk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX0NvbXBhcmU+Ci1fUmFuZG9tQWNjZXNzSXRlcgotcGFydGlhbF9zb3J0X2NvcHkoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fcmVzdWx0X2ZpcnN0LAotICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19yZXN1bHRfbGFzdCwgX0NvbXBhcmUgX19jb21wKSB7Ci0gIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQotICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19yZXN1bHRfZmlyc3QsIF9fcmVzdWx0X2xhc3QpKQotICByZXR1cm4gX1NUTFBfUFJJViBfX3BhcnRpYWxfc29ydF9jb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHRfZmlyc3QsIF9fcmVzdWx0X2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19jb21wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX0RJU1RBTkNFX1RZUEUoX19yZXN1bHRfZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsIF9JbnB1dEl0ZXIpKTsKLX0KLQotLy8gbnRoX2VsZW1lbnQoKSBhbmQgaXRzIGF1eGlsaWFyeSBmdW5jdGlvbnMuCi1fU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCi0KLXRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZT4KLXZvaWQgX19udGhfZWxlbWVudChfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlciBfX250aCwKLSAgICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsIF9UcCosIF9Db21wYXJlIF9fY29tcCkgewotICB3aGlsZSAoX19sYXN0IC0gX19maXJzdCA+IDMpIHsKLSAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2N1dCA9Ci0gICAgICBfX3VuZ3VhcmRlZF9wYXJ0aXRpb24oX19maXJzdCwgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9UcChfX21lZGlhbigqX19maXJzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihfX2ZpcnN0ICsgKF9fbGFzdCAtIF9fZmlyc3QpLzIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKF9fbGFzdCAtIDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2NvbXApKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2NvbXApOwotICAgIGlmIChfX2N1dCA8PSBfX250aCkKLSAgICAgIF9fZmlyc3QgPSBfX2N1dDsKLSAgICBlbHNlCi0gICAgICBfX2xhc3QgPSBfX2N1dDsKLSAgfQotICBfX2luc2VydGlvbl9zb3J0KF9fZmlyc3QsIF9fbGFzdCwgX1NUTFBfVkFMVUVfVFlQRShfX2ZpcnN0LF9SYW5kb21BY2Nlc3NJdGVyKSwgX19jb21wKTsKLX0KLQotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi0KLXRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcj4KLXZvaWQgbnRoX2VsZW1lbnQoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIgX19udGgsCi0gICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCkgewotICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19udGgpKQotICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19udGgsIF9fbGFzdCkpCi0gIF9TVExQX1BSSVYgX19udGhfZWxlbWVudChfX2ZpcnN0LCBfX250aCwgX19sYXN0LCBfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX19sZXNzKF9TVExQX1ZBTFVFX1RZUEUoX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIpKSk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX0NvbXBhcmU+Ci12b2lkIG50aF9lbGVtZW50KF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyIF9fbnRoLAotICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsIF9Db21wYXJlIF9fY29tcCkgewotICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19udGgpKQotICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19udGgsIF9fbGFzdCkpCi0gIF9TVExQX1BSSVYgX19udGhfZWxlbWVudChfX2ZpcnN0LCBfX250aCwgX19sYXN0LCBfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyKSwgX19jb21wKTsKLX0KLQotLy8gQmluYXJ5IHNlYXJjaCAobG93ZXJfYm91bmQsIHVwcGVyX2JvdW5kLCBlcXVhbF9yYW5nZSwgYmluYXJ5X3NlYXJjaCkuCi1fU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCi0KLXRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9UcCwKLSAgICAgICAgICBjbGFzcyBfQ29tcGFyZTEsIGNsYXNzIF9Db21wYXJlMiwgY2xhc3MgX0Rpc3RhbmNlPgotX0ZvcndhcmRJdGVyIF9fdXBwZXJfYm91bmQoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsIGNvbnN0IF9UcCYgX192YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBfQ29tcGFyZTEgX19jb21wMSwgX0NvbXBhcmUyIF9fY29tcDIsIF9EaXN0YW5jZSopIHsKLSAgX0Rpc3RhbmNlIF9fbGVuID0gZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KTsKLSAgX0Rpc3RhbmNlIF9faGFsZjsKLQotICB3aGlsZSAoX19sZW4gPiAwKSB7Ci0gICAgX19oYWxmID0gX19sZW4gPj4gMTsKLSAgICBfRm9yd2FyZEl0ZXIgX19taWRkbGUgPSBfX2ZpcnN0OwotICAgIGFkdmFuY2UoX19taWRkbGUsIF9faGFsZik7Ci0gICAgaWYgKF9fY29tcDIoX192YWwsICpfX21pZGRsZSkpIHsKLSAgICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFfX2NvbXAxKCpfX21pZGRsZSwgX192YWwpLCBfU3RsTXNnX0lOVkFMSURfU1RSSUNUX1dFQUtfUFJFRElDQVRFKQotICAgICAgX19sZW4gPSBfX2hhbGY7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgX19maXJzdCA9IF9fbWlkZGxlOwotICAgICAgKytfX2ZpcnN0OwotICAgICAgX19sZW4gPSBfX2xlbiAtIF9faGFsZiAtIDE7Ci0gICAgfQotICB9Ci0gIHJldHVybiBfX2ZpcnN0OwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfVHAsCi0gICAgICAgICAgY2xhc3MgX0NvbXBhcmUxLCBjbGFzcyBfQ29tcGFyZTIsIGNsYXNzIF9EaXN0YW5jZT4KLXBhaXI8X0ZvcndhcmRJdGVyLCBfRm9yd2FyZEl0ZXI+Ci1fX2VxdWFsX3JhbmdlKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LCBjb25zdCBfVHAmIF9fdmFsLAotICAgICAgICAgICAgICBfQ29tcGFyZTEgX19jb21wMSwgX0NvbXBhcmUyIF9fY29tcDIsIF9EaXN0YW5jZSogX19kaXN0KSB7Ci0gIF9EaXN0YW5jZSBfX2xlbiA9IGRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7Ci0gIF9EaXN0YW5jZSBfX2hhbGY7Ci0KLSAgd2hpbGUgKF9fbGVuID4gMCkgewotICAgIF9faGFsZiA9IF9fbGVuID4+IDE7Ci0gICAgX0ZvcndhcmRJdGVyIF9fbWlkZGxlID0gX19maXJzdDsKLSAgICBhZHZhbmNlKF9fbWlkZGxlLCBfX2hhbGYpOwotICAgIGlmIChfX2NvbXAxKCpfX21pZGRsZSwgX192YWwpKSB7Ci0gICAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghX19jb21wMihfX3ZhbCwgKl9fbWlkZGxlKSwgX1N0bE1zZ19JTlZBTElEX1NUUklDVF9XRUFLX1BSRURJQ0FURSkKLSAgICAgIF9fZmlyc3QgPSBfX21pZGRsZTsKLSAgICAgICsrX19maXJzdDsKLSAgICAgIF9fbGVuID0gX19sZW4gLSBfX2hhbGYgLSAxOwotICAgIH0KLSAgICBlbHNlIGlmIChfX2NvbXAyKF9fdmFsLCAqX19taWRkbGUpKSB7Ci0gICAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghX19jb21wMSgqX19taWRkbGUsIF9fdmFsKSwgX1N0bE1zZ19JTlZBTElEX1NUUklDVF9XRUFLX1BSRURJQ0FURSkKLSAgICAgIF9fbGVuID0gX19oYWxmOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIF9Gb3J3YXJkSXRlciBfX2xlZnQgPSBfX2xvd2VyX2JvdW5kKF9fZmlyc3QsIF9fbWlkZGxlLCBfX3ZhbCwgX19jb21wMSwgX19jb21wMiwgX19kaXN0KTsKLSAgICAgIC8vU21hbGwgb3B0aW06IElmIGxvd2VyX2JvdW5kIGhhdmVuJ3QgZm91bmQgYW4gZXF1aXZhbGVudCB2YWx1ZQotICAgICAgLy90aGVyZSBpcyBubyBuZWVkIHRvIGNhbGwgdXBwZXJfYm91bmQuCi0gICAgICBpZiAoX19jb21wMSgqX19sZWZ0LCBfX3ZhbCkpIHsKLSAgICAgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoIV9fY29tcDIoX192YWwsICpfX2xlZnQpLCBfU3RsTXNnX0lOVkFMSURfU1RSSUNUX1dFQUtfUFJFRElDQVRFKQotICAgICAgICByZXR1cm4gcGFpcjxfRm9yd2FyZEl0ZXIsIF9Gb3J3YXJkSXRlcj4oX19sZWZ0LCBfX2xlZnQpOwotICAgICAgfQotICAgICAgYWR2YW5jZShfX2ZpcnN0LCBfX2xlbik7Ci0gICAgICBfRm9yd2FyZEl0ZXIgX19yaWdodCA9IF9fdXBwZXJfYm91bmQoKytfX21pZGRsZSwgX19maXJzdCwgX192YWwsIF9fY29tcDEsIF9fY29tcDIsIF9fZGlzdCk7Ci0gICAgICByZXR1cm4gcGFpcjxfRm9yd2FyZEl0ZXIsIF9Gb3J3YXJkSXRlcj4oX19sZWZ0LCBfX3JpZ2h0KTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHBhaXI8X0ZvcndhcmRJdGVyLCBfRm9yd2FyZEl0ZXI+KF9fZmlyc3QsIF9fZmlyc3QpOwotfQotCi1fU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKLQotdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMiwgY2xhc3MgX091dHB1dEl0ZXI+Ci1fT3V0cHV0SXRlciBtZXJnZShfSW5wdXRJdGVyMSBfX2ZpcnN0MSwgX0lucHV0SXRlcjEgX19sYXN0MSwKLSAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyLCBfSW5wdXRJdGVyMiBfX2xhc3QyLAotICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXIgX19yZXN1bHQpIHsKLSAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QxLCBfX2xhc3QxKSkKLSAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QyLCBfX2xhc3QyKSkKLSAgd2hpbGUgKF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0MikgewotICAgIGlmICgqX19maXJzdDIgPCAqX19maXJzdDEpIHsKLSAgICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0MjsKLSAgICAgICsrX19maXJzdDI7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgKl9fcmVzdWx0ID0gKl9fZmlyc3QxOwotICAgICAgKytfX2ZpcnN0MTsKLSAgICB9Ci0gICAgKytfX3Jlc3VsdDsKLSAgfQotICByZXR1cm4gY29weShfX2ZpcnN0MiwgX19sYXN0MiwgY29weShfX2ZpcnN0MSwgX19sYXN0MSwgX19yZXN1bHQpKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMiwgY2xhc3MgX091dHB1dEl0ZXIsCi0gICAgICAgICAgY2xhc3MgX0NvbXBhcmU+Ci1fT3V0cHV0SXRlciBtZXJnZShfSW5wdXRJdGVyMSBfX2ZpcnN0MSwgX0lucHV0SXRlcjEgX19sYXN0MSwKLSAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyLCBfSW5wdXRJdGVyMiBfX2xhc3QyLAotICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXIgX19yZXN1bHQsIF9Db21wYXJlIF9fY29tcCkgewotICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdDEsIF9fbGFzdDEpKQotICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdDIsIF9fbGFzdDIpKQotICB3aGlsZSAoX19maXJzdDEgIT0gX19sYXN0MSAmJiBfX2ZpcnN0MiAhPSBfX2xhc3QyKSB7Ci0gICAgaWYgKF9fY29tcCgqX19maXJzdDIsICpfX2ZpcnN0MSkpIHsKLSAgICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFfX2NvbXAoKl9fZmlyc3QxLCAqX19maXJzdDIpLCBfU3RsTXNnX0lOVkFMSURfU1RSSUNUX1dFQUtfUFJFRElDQVRFKQotICAgICAgKl9fcmVzdWx0ID0gKl9fZmlyc3QyOwotICAgICAgKytfX2ZpcnN0MjsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAqX19yZXN1bHQgPSAqX19maXJzdDE7Ci0gICAgICArK19fZmlyc3QxOwotICAgIH0KLSAgICArK19fcmVzdWx0OwotICB9Ci0gIHJldHVybiBjb3B5KF9fZmlyc3QyLCBfX2xhc3QyLCBjb3B5KF9fZmlyc3QxLCBfX2xhc3QxLCBfX3Jlc3VsdCkpOwotfQotCi1fU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCi0KLXRlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXIsIGNsYXNzIF9EaXN0YW5jZSwgY2xhc3MgX0NvbXBhcmU+Ci12b2lkIF9fbWVyZ2Vfd2l0aG91dF9idWZmZXIoX0JpZGlyZWN0aW9uYWxJdGVyIF9fZmlyc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyIF9fbWlkZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX0Rpc3RhbmNlIF9fbGVuMSwgX0Rpc3RhbmNlIF9fbGVuMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ29tcGFyZSBfX2NvbXApIHsKLSAgaWYgKF9fbGVuMSA9PSAwIHx8IF9fbGVuMiA9PSAwKQotICAgIHJldHVybjsKLSAgaWYgKF9fbGVuMSArIF9fbGVuMiA9PSAyKSB7Ci0gICAgaWYgKF9fY29tcCgqX19taWRkbGUsICpfX2ZpcnN0KSkgewotICAgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoIV9fY29tcCgqX19maXJzdCwgKl9fbWlkZGxlKSwgX1N0bE1zZ19JTlZBTElEX1NUUklDVF9XRUFLX1BSRURJQ0FURSkKLSAgICAgIGl0ZXJfc3dhcChfX2ZpcnN0LCBfX21pZGRsZSk7Ci0gICAgfQotICAgIHJldHVybjsKLSAgfQotICBfQmlkaXJlY3Rpb25hbEl0ZXIgX19maXJzdF9jdXQgPSBfX2ZpcnN0OwotICBfQmlkaXJlY3Rpb25hbEl0ZXIgX19zZWNvbmRfY3V0ID0gX19taWRkbGU7Ci0gIF9EaXN0YW5jZSBfX2xlbjExID0gMDsKLSAgX0Rpc3RhbmNlIF9fbGVuMjIgPSAwOwotICBpZiAoX19sZW4xID4gX19sZW4yKSB7Ci0gICAgX19sZW4xMSA9IF9fbGVuMSAvIDI7Ci0gICAgYWR2YW5jZShfX2ZpcnN0X2N1dCwgX19sZW4xMSk7Ci0gICAgX19zZWNvbmRfY3V0ID0gbG93ZXJfYm91bmQoX19taWRkbGUsIF9fbGFzdCwgKl9fZmlyc3RfY3V0LCBfX2NvbXApOwotICAgIF9fbGVuMjIgKz0gZGlzdGFuY2UoX19taWRkbGUsIF9fc2Vjb25kX2N1dCk7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgX19sZW4yMiA9IF9fbGVuMiAvIDI7Ci0gICAgYWR2YW5jZShfX3NlY29uZF9jdXQsIF9fbGVuMjIpOwotICAgIF9fZmlyc3RfY3V0ID0gdXBwZXJfYm91bmQoX19maXJzdCwgX19taWRkbGUsICpfX3NlY29uZF9jdXQsIF9fY29tcCk7Ci0gICAgX19sZW4xMSArPWRpc3RhbmNlKF9fZmlyc3QsIF9fZmlyc3RfY3V0KTsKLSAgfQotICBfQmlkaXJlY3Rpb25hbEl0ZXIgX19uZXdfbWlkZGxlCi0gICAgPSBfX3JvdGF0ZShfX2ZpcnN0X2N1dCwgX19taWRkbGUsIF9fc2Vjb25kX2N1dCk7Ci0gIF9fbWVyZ2Vfd2l0aG91dF9idWZmZXIoX19maXJzdCwgX19maXJzdF9jdXQsIF9fbmV3X21pZGRsZSwgX19sZW4xMSwgX19sZW4yMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBfX2NvbXApOwotICBfX21lcmdlX3dpdGhvdXRfYnVmZmVyKF9fbmV3X21pZGRsZSwgX19zZWNvbmRfY3V0LCBfX2xhc3QsIF9fbGVuMSAtIF9fbGVuMTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgX19sZW4yIC0gX19sZW4yMiwgX19jb21wKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcjEsIGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcjIsCi0gICAgICAgICAgY2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyMywgY2xhc3MgX0NvbXBhcmU+Ci1fQmlkaXJlY3Rpb25hbEl0ZXIzIF9fbWVyZ2VfYmFja3dhcmQoX0JpZGlyZWN0aW9uYWxJdGVyMSBfX2ZpcnN0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIxIF9fbGFzdDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyMiBfX2ZpcnN0MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIyIF9fbGFzdDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyMyBfX3Jlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ29tcGFyZSBfX2NvbXApIHsKLSAgaWYgKF9fZmlyc3QxID09IF9fbGFzdDEpCi0gICAgcmV0dXJuIGNvcHlfYmFja3dhcmQoX19maXJzdDIsIF9fbGFzdDIsIF9fcmVzdWx0KTsKLSAgaWYgKF9fZmlyc3QyID09IF9fbGFzdDIpCi0gICAgcmV0dXJuIGNvcHlfYmFja3dhcmQoX19maXJzdDEsIF9fbGFzdDEsIF9fcmVzdWx0KTsKLSAgLS1fX2xhc3QxOwotICAtLV9fbGFzdDI7Ci0gIGZvciAoOzspIHsKLSAgICBpZiAoX19jb21wKCpfX2xhc3QyLCAqX19sYXN0MSkpIHsKLSAgICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFfX2NvbXAoKl9fbGFzdDEsICpfX2xhc3QyKSwgX1N0bE1zZ19JTlZBTElEX1NUUklDVF9XRUFLX1BSRURJQ0FURSkKLSAgICAgICotLV9fcmVzdWx0ID0gKl9fbGFzdDE7Ci0gICAgICBpZiAoX19maXJzdDEgPT0gX19sYXN0MSkKLSAgICAgICAgcmV0dXJuIGNvcHlfYmFja3dhcmQoX19maXJzdDIsICsrX19sYXN0MiwgX19yZXN1bHQpOwotICAgICAgLS1fX2xhc3QxOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICotLV9fcmVzdWx0ID0gKl9fbGFzdDI7Ci0gICAgICBpZiAoX19maXJzdDIgPT0gX19sYXN0MikKLSAgICAgICAgcmV0dXJuIGNvcHlfYmFja3dhcmQoX19maXJzdDEsICsrX19sYXN0MSwgX19yZXN1bHQpOwotICAgICAgLS1fX2xhc3QyOwotICAgIH0KLSAgfQotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyLCBjbGFzcyBfVHAsCi0gICAgICAgICAgY2xhc3MgX0Rpc3RhbmNlLCBjbGFzcyBfQ29tcGFyZT4KLWlubGluZSB2b2lkIF9faW5wbGFjZV9tZXJnZV9hdXgoX0JpZGlyZWN0aW9uYWxJdGVyIF9fZmlyc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlciBfX21pZGRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyIF9fbGFzdCwgX1RwKiwgX0Rpc3RhbmNlKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NvbXBhcmUgX19jb21wKSB7Ci0gIF9EaXN0YW5jZSBfX2xlbjEgPSBkaXN0YW5jZShfX2ZpcnN0LCBfX21pZGRsZSk7Ci0gIF9EaXN0YW5jZSBfX2xlbjIgPSBkaXN0YW5jZShfX21pZGRsZSwgX19sYXN0KTsKLQotICBfVGVtcG9yYXJ5X2J1ZmZlcjxfQmlkaXJlY3Rpb25hbEl0ZXIsIF9UcD4gX19idWYoX19maXJzdCwgX19sYXN0KTsKLSAgaWYgKF9fYnVmLmJlZ2luKCkgPT0gMCkKLSAgICBfX21lcmdlX3dpdGhvdXRfYnVmZmVyKF9fZmlyc3QsIF9fbWlkZGxlLCBfX2xhc3QsIF9fbGVuMSwgX19sZW4yLCBfX2NvbXApOwotICBlbHNlCi0gICAgX19tZXJnZV9hZGFwdGl2ZShfX2ZpcnN0LCBfX21pZGRsZSwgX19sYXN0LCBfX2xlbjEsIF9fbGVuMiwKLSAgICAgICAgICAgICAgICAgICAgIF9fYnVmLmJlZ2luKCksIF9EaXN0YW5jZShfX2J1Zi5zaXplKCkpLAotICAgICAgICAgICAgICAgICAgICAgX19jb21wKTsKLX0KLQotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi0KLXRlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXI+Ci12b2lkIGlucGxhY2VfbWVyZ2UoX0JpZGlyZWN0aW9uYWxJdGVyIF9fZmlyc3QsCi0gICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyIF9fbWlkZGxlLAotICAgICAgICAgICAgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlciBfX2xhc3QpIHsKLSAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbWlkZGxlKSkKLSAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fbWlkZGxlLCBfX2xhc3QpKQotICBpZiAoX19maXJzdCA9PSBfX21pZGRsZSB8fCBfX21pZGRsZSA9PSBfX2xhc3QpCi0gICAgcmV0dXJuOwotICBfU1RMUF9QUklWIF9faW5wbGFjZV9tZXJnZV9hdXgoX19maXJzdCwgX19taWRkbGUsIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1ZBTFVFX1RZUEUoX19maXJzdCwgX0JpZGlyZWN0aW9uYWxJdGVyKSwgX1NUTFBfRElTVEFOQ0VfVFlQRShfX2ZpcnN0LCBfQmlkaXJlY3Rpb25hbEl0ZXIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfX2xlc3MoX1NUTFBfVkFMVUVfVFlQRShfX2ZpcnN0LCBfQmlkaXJlY3Rpb25hbEl0ZXIpKSk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXIsIGNsYXNzIF9Db21wYXJlPgotdm9pZCBpbnBsYWNlX21lcmdlKF9CaWRpcmVjdGlvbmFsSXRlciBfX2ZpcnN0LAotICAgICAgICAgICAgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlciBfX21pZGRsZSwKLSAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIgX19sYXN0LCBfQ29tcGFyZSBfX2NvbXApIHsKLSAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbWlkZGxlKSkKLSAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fbWlkZGxlLCBfX2xhc3QpKQotICBpZiAoX19maXJzdCA9PSBfX21pZGRsZSB8fCBfX21pZGRsZSA9PSBfX2xhc3QpCi0gICAgcmV0dXJuOwotICBfU1RMUF9QUklWIF9faW5wbGFjZV9tZXJnZV9hdXgoX19maXJzdCwgX19taWRkbGUsIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1ZBTFVFX1RZUEUoX19maXJzdCwgX0JpZGlyZWN0aW9uYWxJdGVyKSwgX1NUTFBfRElTVEFOQ0VfVFlQRShfX2ZpcnN0LCBfQmlkaXJlY3Rpb25hbEl0ZXIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19jb21wKTsKLX0KLQotX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNsYXNzIF9JbnB1dEl0ZXIyLCBjbGFzcyBfQ29tcGFyZT4KLWJvb2wgX19pbmNsdWRlcyhfSW5wdXRJdGVyMSBfX2ZpcnN0MSwgX0lucHV0SXRlcjEgX19sYXN0MSwKLSAgICAgICAgICAgICAgICBfSW5wdXRJdGVyMiBfX2ZpcnN0MiwgX0lucHV0SXRlcjIgX19sYXN0MiwgX0NvbXBhcmUgX19jb21wKSB7Ci0gIF9TVExQX0RFQlVHX0NIRUNLKF9fY2hlY2tfcmFuZ2UoX19maXJzdDEsIF9fbGFzdDEpKQotICBfU1RMUF9ERUJVR19DSEVDSyhfX2NoZWNrX3JhbmdlKF9fZmlyc3QyLCBfX2xhc3QyKSkKLSAgd2hpbGUgKF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0MikKLSAgICBpZiAoX19jb21wKCpfX2ZpcnN0MiwgKl9fZmlyc3QxKSkgewotICAgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoIV9fY29tcCgqX19maXJzdDEsICpfX2ZpcnN0MiksIF9TdGxNc2dfSU5WQUxJRF9TVFJJQ1RfV0VBS19QUkVESUNBVEUpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGVsc2UgaWYgKF9fY29tcCgqX19maXJzdDEsICpfX2ZpcnN0MikpCi0gICAgICArK19fZmlyc3QxOwotICAgIGVsc2UKLSAgICAgICsrX19maXJzdDEsICsrX19maXJzdDI7Ci0KLSAgcmV0dXJuIF9fZmlyc3QyID09IF9fbGFzdDI7Ci19Ci0KLV9TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNsYXNzIF9JbnB1dEl0ZXIyLCBjbGFzcyBfQ29tcGFyZT4KLWJvb2wgaW5jbHVkZXMoX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIxIF9fbGFzdDEsCi0gICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyLCBfSW5wdXRJdGVyMiBfX2xhc3QyLCBfQ29tcGFyZSBfX2NvbXApIHsKLSAgcmV0dXJuIF9TVExQX1BSSVYgX19pbmNsdWRlcyhfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIsIF9fbGFzdDIsIF9fY29tcCk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0SXRlcjI+Ci1ib29sIGluY2x1ZGVzKF9JbnB1dEl0ZXIxIF9fZmlyc3QxLCBfSW5wdXRJdGVyMSBfX2xhc3QxLAotICAgICAgICAgICAgICBfSW5wdXRJdGVyMiBfX2ZpcnN0MiwgX0lucHV0SXRlcjIgX19sYXN0MikgewotICByZXR1cm4gX1NUTFBfUFJJViBfX2luY2x1ZGVzKF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0MiwgX19sYXN0MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fbGVzcyhfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QxLCBfSW5wdXRJdGVyMSkpKTsKLX0KLQotX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNsYXNzIF9JbnB1dEl0ZXIyLCBjbGFzcyBfT3V0cHV0SXRlciwKLSAgICAgICAgICBjbGFzcyBfQ29tcGFyZT4KLV9PdXRwdXRJdGVyIF9fc2V0X3VuaW9uKF9JbnB1dEl0ZXIxIF9fZmlyc3QxLCBfSW5wdXRJdGVyMSBfX2xhc3QxLAotICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIsIF9JbnB1dEl0ZXIyIF9fbGFzdDIsCi0gICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlciBfX3Jlc3VsdCwgX0NvbXBhcmUgX19jb21wKSB7Ci0gIF9TVExQX0RFQlVHX0NIRUNLKF9fY2hlY2tfcmFuZ2UoX19maXJzdDEsIF9fbGFzdDEpKQotICBfU1RMUF9ERUJVR19DSEVDSyhfX2NoZWNrX3JhbmdlKF9fZmlyc3QyLCBfX2xhc3QyKSkKLSAgd2hpbGUgKF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0MikgewotICAgIGlmIChfX2NvbXAoKl9fZmlyc3QxLCAqX19maXJzdDIpKSB7Ci0gICAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghX19jb21wKCpfX2ZpcnN0MiwgKl9fZmlyc3QxKSwgX1N0bE1zZ19JTlZBTElEX1NUUklDVF9XRUFLX1BSRURJQ0FURSkKLSAgICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0MTsKLSAgICAgICsrX19maXJzdDE7Ci0gICAgfQotICAgIGVsc2UgaWYgKF9fY29tcCgqX19maXJzdDIsICpfX2ZpcnN0MSkpIHsKLSAgICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFfX2NvbXAoKl9fZmlyc3QxLCAqX19maXJzdDIpLCBfU3RsTXNnX0lOVkFMSURfU1RSSUNUX1dFQUtfUFJFRElDQVRFKQotICAgICAgKl9fcmVzdWx0ID0gKl9fZmlyc3QyOwotICAgICAgKytfX2ZpcnN0MjsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAqX19yZXN1bHQgPSAqX19maXJzdDE7Ci0gICAgICArK19fZmlyc3QxOwotICAgICAgKytfX2ZpcnN0MjsKLSAgICB9Ci0gICAgKytfX3Jlc3VsdDsKLSAgfQotICByZXR1cm4gY29weShfX2ZpcnN0MiwgX19sYXN0MiwgY29weShfX2ZpcnN0MSwgX19sYXN0MSwgX19yZXN1bHQpKTsKLX0KLQotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi0KLXRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0SXRlcjIsIGNsYXNzIF9PdXRwdXRJdGVyPgotX091dHB1dEl0ZXIgc2V0X3VuaW9uKF9JbnB1dEl0ZXIxIF9fZmlyc3QxLCBfSW5wdXRJdGVyMSBfX2xhc3QxLAotICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyLCBfSW5wdXRJdGVyMiBfX2xhc3QyLAotICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0KSB7Ci0gIHJldHVybiBfU1RMUF9QUklWIF9fc2V0X3VuaW9uKF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0MiwgX19sYXN0MiwgX19yZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX19sZXNzKF9TVExQX1ZBTFVFX1RZUEUoX19maXJzdDEsIF9JbnB1dEl0ZXIxKSkpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNsYXNzIF9JbnB1dEl0ZXIyLCBjbGFzcyBfT3V0cHV0SXRlciwKLSAgICAgICAgICBjbGFzcyBfQ29tcGFyZT4KLV9PdXRwdXRJdGVyIHNldF91bmlvbihfSW5wdXRJdGVyMSBfX2ZpcnN0MSwgX0lucHV0SXRlcjEgX19sYXN0MSwKLSAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyMiBfX2ZpcnN0MiwgX0lucHV0SXRlcjIgX19sYXN0MiwKLSAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlciBfX3Jlc3VsdCwgX0NvbXBhcmUgX19jb21wKSB7Ci0gIHJldHVybiBfU1RMUF9QUklWIF9fc2V0X3VuaW9uKF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0MiwgX19sYXN0MiwgX19yZXN1bHQsIF9fY29tcCk7Ci19Ci0KLV9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKLQotdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMiwgY2xhc3MgX091dHB1dEl0ZXIsCi0gICAgICAgICAgY2xhc3MgX0NvbXBhcmU+Ci1fT3V0cHV0SXRlciBfX3NldF9pbnRlcnNlY3Rpb24oX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIxIF9fbGFzdDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIsIF9JbnB1dEl0ZXIyIF9fbGFzdDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXIgX19yZXN1bHQsIF9Db21wYXJlIF9fY29tcCkgewotICBfU1RMUF9ERUJVR19DSEVDSyhfX2NoZWNrX3JhbmdlKF9fZmlyc3QxLCBfX2xhc3QxKSkKLSAgX1NUTFBfREVCVUdfQ0hFQ0soX19jaGVja19yYW5nZShfX2ZpcnN0MiwgX19sYXN0MikpCi0gIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDIpCi0gICAgaWYgKF9fY29tcCgqX19maXJzdDEsICpfX2ZpcnN0MikpIHsKLSAgICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFfX2NvbXAoKl9fZmlyc3QyLCAqX19maXJzdDEpLCBfU3RsTXNnX0lOVkFMSURfU1RSSUNUX1dFQUtfUFJFRElDQVRFKQotICAgICAgKytfX2ZpcnN0MTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoX19jb21wKCpfX2ZpcnN0MiwgKl9fZmlyc3QxKSkKLSAgICAgICsrX19maXJzdDI7Ci0gICAgZWxzZSB7Ci0gICAgICAqX19yZXN1bHQgPSAqX19maXJzdDE7Ci0gICAgICArK19fZmlyc3QxOwotICAgICAgKytfX2ZpcnN0MjsKLSAgICAgICsrX19yZXN1bHQ7Ci0gICAgfQotICByZXR1cm4gX19yZXN1bHQ7Ci19Ci0KLV9TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNsYXNzIF9JbnB1dEl0ZXIyLCBjbGFzcyBfT3V0cHV0SXRlcj4KLV9PdXRwdXRJdGVyIHNldF9pbnRlcnNlY3Rpb24oX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIxIF9fbGFzdDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyLCBfSW5wdXRJdGVyMiBfX2xhc3QyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlciBfX3Jlc3VsdCkgewotICByZXR1cm4gX1NUTFBfUFJJViBfX3NldF9pbnRlcnNlY3Rpb24oX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLCBfX2xhc3QyLCBfX3Jlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX19sZXNzKF9TVExQX1ZBTFVFX1RZUEUoX19maXJzdDEsIF9JbnB1dEl0ZXIxKSkpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNsYXNzIF9JbnB1dEl0ZXIyLCBjbGFzcyBfT3V0cHV0SXRlciwKLSAgICAgICAgICBjbGFzcyBfQ29tcGFyZT4KLV9PdXRwdXRJdGVyIHNldF9pbnRlcnNlY3Rpb24oX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIxIF9fbGFzdDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyLCBfSW5wdXRJdGVyMiBfX2xhc3QyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlciBfX3Jlc3VsdCwgX0NvbXBhcmUgX19jb21wKSB7Ci0gIHJldHVybiBfU1RMUF9QUklWIF9fc2V0X2ludGVyc2VjdGlvbihfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIsIF9fbGFzdDIsIF9fcmVzdWx0LCBfX2NvbXApOwotfQotCi1fU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCi0KLXRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0SXRlcjIsIGNsYXNzIF9PdXRwdXRJdGVyLAotICAgICAgICAgIGNsYXNzIF9Db21wYXJlPgotX091dHB1dEl0ZXIgX19zZXRfZGlmZmVyZW5jZShfSW5wdXRJdGVyMSBfX2ZpcnN0MSwgX0lucHV0SXRlcjEgX19sYXN0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIsIF9JbnB1dEl0ZXIyIF9fbGFzdDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0LCBfQ29tcGFyZSBfX2NvbXApIHsKLSAgX1NUTFBfREVCVUdfQ0hFQ0soX19jaGVja19yYW5nZShfX2ZpcnN0MSwgX19sYXN0MSkpCi0gIF9TVExQX0RFQlVHX0NIRUNLKF9fY2hlY2tfcmFuZ2UoX19maXJzdDIsIF9fbGFzdDIpKQotICB3aGlsZSAoX19maXJzdDEgIT0gX19sYXN0MSAmJiBfX2ZpcnN0MiAhPSBfX2xhc3QyKQotICAgIGlmIChfX2NvbXAoKl9fZmlyc3QxLCAqX19maXJzdDIpKSB7Ci0gICAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghX19jb21wKCpfX2ZpcnN0MiwgKl9fZmlyc3QxKSwgX1N0bE1zZ19JTlZBTElEX1NUUklDVF9XRUFLX1BSRURJQ0FURSkKLSAgICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0MTsKLSAgICAgICsrX19maXJzdDE7Ci0gICAgICArK19fcmVzdWx0OwotICAgIH0KLSAgICBlbHNlIGlmIChfX2NvbXAoKl9fZmlyc3QyLCAqX19maXJzdDEpKQotICAgICAgKytfX2ZpcnN0MjsKLSAgICBlbHNlIHsKLSAgICAgICsrX19maXJzdDE7Ci0gICAgICArK19fZmlyc3QyOwotICAgIH0KLSAgcmV0dXJuIGNvcHkoX19maXJzdDEsIF9fbGFzdDEsIF9fcmVzdWx0KTsKLX0KLQotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi0KLXRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0SXRlcjIsIGNsYXNzIF9PdXRwdXRJdGVyPgotX091dHB1dEl0ZXIgc2V0X2RpZmZlcmVuY2UoX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIxIF9fbGFzdDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyMiBfX2ZpcnN0MiwgX0lucHV0SXRlcjIgX19sYXN0MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0KSB7Ci0gIHJldHVybiBfU1RMUF9QUklWIF9fc2V0X2RpZmZlcmVuY2UoX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLCBfX2xhc3QyLCBfX3Jlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fbGVzcyhfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QxLCBfSW5wdXRJdGVyMSkpKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMiwgY2xhc3MgX091dHB1dEl0ZXIsCi0gICAgICAgICAgY2xhc3MgX0NvbXBhcmU+Ci1fT3V0cHV0SXRlciBzZXRfZGlmZmVyZW5jZShfSW5wdXRJdGVyMSBfX2ZpcnN0MSwgX0lucHV0SXRlcjEgX19sYXN0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyLCBfSW5wdXRJdGVyMiBfX2xhc3QyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXIgX19yZXN1bHQsIF9Db21wYXJlIF9fY29tcCkgewotICByZXR1cm4gX1NUTFBfUFJJViBfX3NldF9kaWZmZXJlbmNlKF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0MiwgX19sYXN0MiwgX19yZXN1bHQsIF9fY29tcCk7Ci19Ci0KLV9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKLQotdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMiwgY2xhc3MgX091dHB1dEl0ZXIsIGNsYXNzIF9Db21wYXJlPgotX091dHB1dEl0ZXIKLV9fc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlKF9JbnB1dEl0ZXIxIF9fZmlyc3QxLCBfSW5wdXRJdGVyMSBfX2xhc3QxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIsIF9JbnB1dEl0ZXIyIF9fbGFzdDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlciBfX3Jlc3VsdCwgX0NvbXBhcmUgX19jb21wKSB7Ci0gIF9TVExQX0RFQlVHX0NIRUNLKF9fY2hlY2tfcmFuZ2UoX19maXJzdDEsIF9fbGFzdDEpKQotICBfU1RMUF9ERUJVR19DSEVDSyhfX2NoZWNrX3JhbmdlKF9fZmlyc3QyLCBfX2xhc3QyKSkKLSAgd2hpbGUgKF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0MikgewotICAgIGlmIChfX2NvbXAoKl9fZmlyc3QxLCAqX19maXJzdDIpKSB7Ci0gICAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghX19jb21wKCpfX2ZpcnN0MiwgKl9fZmlyc3QxKSwgX1N0bE1zZ19JTlZBTElEX1NUUklDVF9XRUFLX1BSRURJQ0FURSkKLSAgICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0MTsKLSAgICAgICsrX19maXJzdDE7Ci0gICAgICArK19fcmVzdWx0OwotICAgIH0KLSAgICBlbHNlIGlmIChfX2NvbXAoKl9fZmlyc3QyLCAqX19maXJzdDEpKSB7Ci0gICAgICAqX19yZXN1bHQgPSAqX19maXJzdDI7Ci0gICAgICArK19fZmlyc3QyOwotICAgICAgKytfX3Jlc3VsdDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICArK19fZmlyc3QxOwotICAgICAgKytfX2ZpcnN0MjsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGNvcHkoX19maXJzdDIsIF9fbGFzdDIsIGNvcHkoX19maXJzdDEsIF9fbGFzdDEsIF9fcmVzdWx0KSk7Ci19Ci0KLV9TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNsYXNzIF9JbnB1dEl0ZXIyLCBjbGFzcyBfT3V0cHV0SXRlcj4KLV9PdXRwdXRJdGVyCi1zZXRfc3ltbWV0cmljX2RpZmZlcmVuY2UoX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIxIF9fbGFzdDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIsIF9JbnB1dEl0ZXIyIF9fbGFzdDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXIgX19yZXN1bHQpIHsKLSAgcmV0dXJuIF9TVExQX1BSSVYgX19zZXRfc3ltbWV0cmljX2RpZmZlcmVuY2UoX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLCBfX2xhc3QyLCBfX3Jlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfX2xlc3MoX1NUTFBfVkFMVUVfVFlQRShfX2ZpcnN0MSwgX0lucHV0SXRlcjEpKSk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0SXRlcjIsIGNsYXNzIF9PdXRwdXRJdGVyLCBjbGFzcyBfQ29tcGFyZT4KLV9PdXRwdXRJdGVyCi1zZXRfc3ltbWV0cmljX2RpZmZlcmVuY2UoX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIxIF9fbGFzdDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIsIF9JbnB1dEl0ZXIyIF9fbGFzdDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXIgX19yZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgX0NvbXBhcmUgX19jb21wKSB7Ci0gIHJldHVybiBfU1RMUF9QUklWIF9fc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlKF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0MiwgX19sYXN0MiwgX19yZXN1bHQsIF9fY29tcCk7Ci19Ci0KLS8vIG1pbl9lbGVtZW50IGFuZCBtYXhfZWxlbWVudCwgd2l0aCBhbmQgd2l0aG91dCBhbiBleHBsaWNpdGx5IHN1cHBsaWVkCi0vLyBjb21wYXJpc29uIGZ1bmN0aW9uLgotCi10ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyPgotX0ZvcndhcmRJdGVyIG1heF9lbGVtZW50KF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0KSB7Ci0gIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQotICBpZiAoX19maXJzdCA9PSBfX2xhc3QpIHJldHVybiBfX2ZpcnN0OwotICBfRm9yd2FyZEl0ZXIgX19yZXN1bHQgPSBfX2ZpcnN0OwotICB3aGlsZSAoKytfX2ZpcnN0ICE9IF9fbGFzdCkKLSAgICBpZiAoKl9fcmVzdWx0IDwgKl9fZmlyc3QpCi0gICAgICBfX3Jlc3VsdCA9IF9fZmlyc3Q7Ci0gIHJldHVybiBfX3Jlc3VsdDsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX0NvbXBhcmU+Ci1fRm9yd2FyZEl0ZXIgbWF4X2VsZW1lbnQoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgX0NvbXBhcmUgX19jb21wKSB7Ci0gIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQotICBpZiAoX19maXJzdCA9PSBfX2xhc3QpIHJldHVybiBfX2ZpcnN0OwotICBfRm9yd2FyZEl0ZXIgX19yZXN1bHQgPSBfX2ZpcnN0OwotICB3aGlsZSAoKytfX2ZpcnN0ICE9IF9fbGFzdCkgewotICAgIGlmIChfX2NvbXAoKl9fcmVzdWx0LCAqX19maXJzdCkpIHsKLSAgICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFfX2NvbXAoKl9fZmlyc3QsICpfX3Jlc3VsdCksIF9TdGxNc2dfSU5WQUxJRF9TVFJJQ1RfV0VBS19QUkVESUNBVEUpCi0gICAgICBfX3Jlc3VsdCA9IF9fZmlyc3Q7Ci0gICAgfQotICB9Ci0gIHJldHVybiBfX3Jlc3VsdDsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcj4KLV9Gb3J3YXJkSXRlciBtaW5fZWxlbWVudChfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCkgewotICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKLSAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KSByZXR1cm4gX19maXJzdDsKLSAgX0ZvcndhcmRJdGVyIF9fcmVzdWx0ID0gX19maXJzdDsKLSAgd2hpbGUgKCsrX19maXJzdCAhPSBfX2xhc3QpCi0gICAgaWYgKCpfX2ZpcnN0IDwgKl9fcmVzdWx0KQotICAgICAgX19yZXN1bHQgPSBfX2ZpcnN0OwotICByZXR1cm4gX19yZXN1bHQ7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9Db21wYXJlPgotX0ZvcndhcmRJdGVyIG1pbl9lbGVtZW50KF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgIF9Db21wYXJlIF9fY29tcCkgewotICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKLSAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KSByZXR1cm4gX19maXJzdDsKLSAgX0ZvcndhcmRJdGVyIF9fcmVzdWx0ID0gX19maXJzdDsKLSAgd2hpbGUgKCsrX19maXJzdCAhPSBfX2xhc3QpIHsKLSAgICBpZiAoX19jb21wKCpfX2ZpcnN0LCAqX19yZXN1bHQpKSB7Ci0gICAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghX19jb21wKCpfX3Jlc3VsdCwgKl9fZmlyc3QpLCBfU3RsTXNnX0lOVkFMSURfU1RSSUNUX1dFQUtfUFJFRElDQVRFKQotICAgICAgX19yZXN1bHQgPSBfX2ZpcnN0OwotICAgIH0KLSAgfQotICByZXR1cm4gX19yZXN1bHQ7Ci19Ci0KLS8vIG5leHRfcGVybXV0YXRpb24gYW5kIHByZXZfcGVybXV0YXRpb24sIHdpdGggYW5kIHdpdGhvdXQgYW4gZXhwbGljaXRseQotLy8gc3VwcGxpZWQgY29tcGFyaXNvbiBmdW5jdGlvbi4KLV9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKLQotdGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlciwgY2xhc3MgX0NvbXBhcmU+Ci1ib29sIF9fbmV4dF9wZXJtdXRhdGlvbihfQmlkaXJlY3Rpb25hbEl0ZXIgX19maXJzdCwgX0JpZGlyZWN0aW9uYWxJdGVyIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9Db21wYXJlIF9fY29tcCkgewotICBfU1RMUF9ERUJVR19DSEVDSyhfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCi0gIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIF9CaWRpcmVjdGlvbmFsSXRlciBfX2kgPSBfX2ZpcnN0OwotICArK19faTsKLSAgaWYgKF9faSA9PSBfX2xhc3QpCi0gICAgcmV0dXJuIGZhbHNlOwotICBfX2kgPSBfX2xhc3Q7Ci0gIC0tX19pOwotCi0gIGZvcig7OykgewotICAgIF9CaWRpcmVjdGlvbmFsSXRlciBfX2lpID0gX19pOwotICAgIC0tX19pOwotICAgIGlmIChfX2NvbXAoKl9faSwgKl9faWkpKSB7Ci0gICAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghX19jb21wKCpfX2lpLCAqX19pKSwgX1N0bE1zZ19JTlZBTElEX1NUUklDVF9XRUFLX1BSRURJQ0FURSkKLSAgICAgIF9CaWRpcmVjdGlvbmFsSXRlciBfX2ogPSBfX2xhc3Q7Ci0gICAgICB3aGlsZSAoIV9fY29tcCgqX19pLCAqLS1fX2opKSB7fQotICAgICAgaXRlcl9zd2FwKF9faSwgX19qKTsKLSAgICAgIHJldmVyc2UoX19paSwgX19sYXN0KTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBpZiAoX19pID09IF9fZmlyc3QpIHsKLSAgICAgIHJldmVyc2UoX19maXJzdCwgX19sYXN0KTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLSNpZiBkZWZpbmVkIChfU1RMUF9ORUVEX1VOUkVBQ0hBQkxFX1JFVFVSTikKLSAgICByZXR1cm4gZmFsc2U7Ci0jZW5kaWYKLX0KLQotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi0KLXRlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXI+Ci1ib29sIG5leHRfcGVybXV0YXRpb24oX0JpZGlyZWN0aW9uYWxJdGVyIF9fZmlyc3QsIF9CaWRpcmVjdGlvbmFsSXRlciBfX2xhc3QpIHsKLSAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCi0gIHJldHVybiBfU1RMUF9QUklWIF9fbmV4dF9wZXJtdXRhdGlvbihfX2ZpcnN0LCBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fbGVzcyhfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsIF9CaWRpcmVjdGlvbmFsSXRlcikpKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlciwgY2xhc3MgX0NvbXBhcmU+Ci1ib29sIG5leHRfcGVybXV0YXRpb24oX0JpZGlyZWN0aW9uYWxJdGVyIF9fZmlyc3QsIF9CaWRpcmVjdGlvbmFsSXRlciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgX0NvbXBhcmUgX19jb21wKSB7Ci0gIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQotICByZXR1cm4gX1NUTFBfUFJJViBfX25leHRfcGVybXV0YXRpb24oX19maXJzdCwgX19sYXN0LCBfX2NvbXApOwotfQotCi1fU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCi0KLXRlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXIsIGNsYXNzIF9Db21wYXJlPgotYm9vbCBfX3ByZXZfcGVybXV0YXRpb24oX0JpZGlyZWN0aW9uYWxJdGVyIF9fZmlyc3QsIF9CaWRpcmVjdGlvbmFsSXRlciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBfQ29tcGFyZSBfX2NvbXApIHsKLSAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQotICAgIHJldHVybiBmYWxzZTsKLSAgX0JpZGlyZWN0aW9uYWxJdGVyIF9faSA9IF9fZmlyc3Q7Ci0gICsrX19pOwotICBpZiAoX19pID09IF9fbGFzdCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIF9faSA9IF9fbGFzdDsKLSAgLS1fX2k7Ci0KLSAgZm9yKDs7KSB7Ci0gICAgX0JpZGlyZWN0aW9uYWxJdGVyIF9faWkgPSBfX2k7Ci0gICAgLS1fX2k7Ci0gICAgaWYgKF9fY29tcCgqX19paSwgKl9faSkpIHsKLSAgICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFfX2NvbXAoKl9faSwgKl9faWkpLCBfU3RsTXNnX0lOVkFMSURfU1RSSUNUX1dFQUtfUFJFRElDQVRFKQotICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyIF9faiA9IF9fbGFzdDsKLSAgICAgIHdoaWxlICghX19jb21wKCotLV9faiwgKl9faSkpIHt9Ci0gICAgICBpdGVyX3N3YXAoX19pLCBfX2opOwotICAgICAgcmV2ZXJzZShfX2lpLCBfX2xhc3QpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGlmIChfX2kgPT0gX19maXJzdCkgewotICAgICAgcmV2ZXJzZShfX2ZpcnN0LCBfX2xhc3QpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotI2lmIGRlZmluZWQgKF9TVExQX05FRURfVU5SRUFDSEFCTEVfUkVUVVJOKQotICAgIHJldHVybiBmYWxzZTsKLSNlbmRpZgotfQotCi1fU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKLQotdGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcj4KLWJvb2wgcHJldl9wZXJtdXRhdGlvbihfQmlkaXJlY3Rpb25hbEl0ZXIgX19maXJzdCwgX0JpZGlyZWN0aW9uYWxJdGVyIF9fbGFzdCkgewotICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKLSAgcmV0dXJuIF9TVExQX1BSSVYgX19wcmV2X3Blcm11dGF0aW9uKF9fZmlyc3QsIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX19sZXNzKF9TVExQX1ZBTFVFX1RZUEUoX19maXJzdCwgX0JpZGlyZWN0aW9uYWxJdGVyKSkpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyLCBjbGFzcyBfQ29tcGFyZT4KLWJvb2wgcHJldl9wZXJtdXRhdGlvbihfQmlkaXJlY3Rpb25hbEl0ZXIgX19maXJzdCwgX0JpZGlyZWN0aW9uYWxJdGVyIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICBfQ29tcGFyZSBfX2NvbXApIHsKLSAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCi0gIHJldHVybiBfU1RMUF9QUklWIF9fcHJldl9wZXJtdXRhdGlvbihfX2ZpcnN0LCBfX2xhc3QsIF9fY29tcCk7Ci19Ci0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKLQotLy8gaXNfaGVhcCwgYSBwcmVkaWNhdGUgdGVzdGluZyB3aGV0aGVyIG9yIG5vdCBhIHJhbmdlIGlzCi0vLyBhIGhlYXAuICBUaGlzIGZ1bmN0aW9uIGlzIGFuIGV4dGVuc2lvbiwgbm90IHBhcnQgb2YgdGhlIEMrKwotLy8gc3RhbmRhcmQuCi1fU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCi0KLXRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX0Rpc3RhbmNlLCBjbGFzcyBfU3RyaWN0V2Vha09yZGVyaW5nPgotYm9vbCBfX2lzX2hlYXAoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwgX1N0cmljdFdlYWtPcmRlcmluZyBfX2NvbXAsCi0gICAgICAgICAgICAgICBfRGlzdGFuY2UgX19uKSB7Ci0gIF9EaXN0YW5jZSBfX3BhcmVudCA9IDA7Ci0gIGZvciAoX0Rpc3RhbmNlIF9fY2hpbGQgPSAxOyBfX2NoaWxkIDwgX19uOyArK19fY2hpbGQpIHsKLSAgICBpZiAoX19jb21wKF9fZmlyc3RbX19wYXJlbnRdLCBfX2ZpcnN0W19fY2hpbGRdKSkgewotICAgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoIV9fY29tcChfX2ZpcnN0W19fY2hpbGRdLCBfX2ZpcnN0W19fcGFyZW50XSksIF9TdGxNc2dfSU5WQUxJRF9TVFJJQ1RfV0VBS19QUkVESUNBVEUpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmICgoX19jaGlsZCAmIDEpID09IDApCi0gICAgICArK19fcGFyZW50OwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1fU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKLQotdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyPgotYm9vbCBpc19oZWFwKF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCkgewotICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKLSAgcmV0dXJuIF9TVExQX1BSSVYgX19pc19oZWFwKF9fZmlyc3QsIF9TVExQX1BSSVYgX19sZXNzKF9TVExQX1ZBTFVFX1RZUEUoX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIpKSwgX19sYXN0IC0gX19maXJzdCk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX1N0cmljdFdlYWtPcmRlcmluZz4KLWJvb2wgaXNfaGVhcChfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsCi0gICAgICAgICAgICAgX1N0cmljdFdlYWtPcmRlcmluZyBfX2NvbXApIHsKLSAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCi0gIHJldHVybiBfU1RMUF9QUklWIF9faXNfaGVhcChfX2ZpcnN0LCBfX2NvbXAsIF9fbGFzdCAtIF9fZmlyc3QpOwotfQotCi0KLV9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKLQotdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1N0cmljdFdlYWtPcmRlcmluZz4KLWJvb2wgX19pc19zb3J0ZWQoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgIF9TdHJpY3RXZWFrT3JkZXJpbmcgX19jb21wKSB7Ci0gIF9TVExQX0RFQlVHX0NIRUNLKF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKLSAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQotICAgIHJldHVybiB0cnVlOwotCi0gIF9Gb3J3YXJkSXRlciBfX25leHQgPSBfX2ZpcnN0OwotICBmb3IgKCsrX19uZXh0OyBfX25leHQgIT0gX19sYXN0OyBfX2ZpcnN0ID0gX19uZXh0LCArK19fbmV4dCkgewotICAgIGlmIChfX2NvbXAoKl9fbmV4dCwgKl9fZmlyc3QpKSB7Ci0gICAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghX19jb21wKCpfX2ZpcnN0LCAqX19uZXh0KSwgX1N0bE1zZ19JTlZBTElEX1NUUklDVF9XRUFLX1BSRURJQ0FURSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi0jZW5kaWYgLyogX1NUTFBfTk9fRVhURU5TSU9OUyAqLwotCi1fU1RMUF9FTkRfTkFNRVNQQUNFCi0KLSN1bmRlZiBfX3N0bF90aHJlc2hvbGQKLQotI2VuZGlmIC8qIF9TVExQX0FMR09fQyAqLwotLy8gTG9jYWwgVmFyaWFibGVzOgotLy8gbW9kZTpDKysKLS8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9fYWxnby5oIGIvc3RsL19hbGdvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NTEzZmMuLjAwMDAwMDAKLS0tIGEvc3RsL19hbGdvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NjAgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTQKLSAqIEhld2xldHQtUGFja2FyZCBDb21wYW55Ci0gKgotICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKLSAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NwotICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogQm9yaXMgRm9taXRjaGV2Ci0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICovCi0KLS8qIE5PVEU6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIFNUTCBoZWFkZXJzLgotICogICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4KLSAqLwotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0FMR09fSAotI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9BTEdPX0gKLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9BTEdPQkFTRV9ICi0jICBpbmNsdWRlIDxzdGwvX2FsZ29iYXNlLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9IRUFQX0gKLSMgIGluY2x1ZGUgPHN0bC9faGVhcC5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfSVRFUkFUT1JfSAotIyAgaW5jbHVkZSA8c3RsL19pdGVyYXRvci5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfRlVOQ1RJT05fQkFTRV9ICi0jICBpbmNsdWRlIDxzdGwvX2Z1bmN0aW9uX2Jhc2UuaD4KLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX19TVU5QUk9fQ0MpICYmICFkZWZpbmVkIChfU1RMUF9JTlRFUk5BTF9DU1RESU8pCi0vLyByZW1vdmUoKSBjb25mbGljdAotIyAgaW5jbHVkZSA8c3RsL19jc3RkaW8uaD4KLSNlbmRpZgotCi1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLQotLy8gZm9yX2VhY2guICBBcHBseSBhIGZ1bmN0aW9uIHRvIGV2ZXJ5IGVsZW1lbnQgb2YgYSByYW5nZS4KLXRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfRnVuY3Rpb24+Ci1fU1RMUF9JTkxJTkVfTE9PUCBfRnVuY3Rpb24KLWZvcl9lYWNoKF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsIF9GdW5jdGlvbiBfX2YpIHsKLSAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQotICAgIF9fZigqX19maXJzdCk7Ci0gIHJldHVybiBfX2Y7Ci19Ci0KLS8vIGNvdW50X2lmCi10ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX1ByZWRpY2F0ZT4KLV9TVExQX0lOTElORV9MT09QIF9TVExQX0RJRkZFUkVOQ0VfVFlQRShfSW5wdXRJdGVyKQotY291bnRfaWYoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwgX1ByZWRpY2F0ZSBfX3ByZWQpIHsKLSAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCi0gIF9TVExQX0RJRkZFUkVOQ0VfVFlQRShfSW5wdXRJdGVyKSBfX24gPSAwOwotICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpIHsKLSAgICBpZiAoX19wcmVkKCpfX2ZpcnN0KSkKLSAgICAgICsrX19uOwotICB9Ci0gIHJldHVybiBfX247Ci19Ci0KLS8vIGFkamFjZW50X2ZpbmQuCi0KLXRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9CaW5hcnlQcmVkaWNhdGU+Ci1fU1RMUF9JTkxJTkVfTE9PUCBfRm9yd2FyZEl0ZXIKLWFkamFjZW50X2ZpbmQoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsCi0gICAgICAgICAgICAgIF9CaW5hcnlQcmVkaWNhdGUgX19iaW5hcnlfcHJlZCkgewotICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKLSAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQotICAgIHJldHVybiBfX2xhc3Q7Ci0gIF9Gb3J3YXJkSXRlciBfX25leHQgPSBfX2ZpcnN0OwotICB3aGlsZSgrK19fbmV4dCAhPSBfX2xhc3QpIHsKLSAgICBpZiAoX19iaW5hcnlfcHJlZCgqX19maXJzdCwgKl9fbmV4dCkpCi0gICAgICByZXR1cm4gX19maXJzdDsKLSAgICBfX2ZpcnN0ID0gX19uZXh0OwotICB9Ci0gIHJldHVybiBfX2xhc3Q7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXI+Ci1fU1RMUF9JTkxJTkVfTE9PUCBfRm9yd2FyZEl0ZXIKLWFkamFjZW50X2ZpbmQoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QpIHsKLSAgcmV0dXJuIGFkamFjZW50X2ZpbmQoX19maXJzdCwgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fZXF1YWxfdG8oX1NUTFBfVkFMVUVfVFlQRShfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIpKSk7Ci19Ci0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fQU5BQ0hST05JU01TKQotdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9UcCwgY2xhc3MgX1NpemU+Ci1fU1RMUF9JTkxJTkVfTE9PUCB2b2lkCi1jb3VudChfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LCBjb25zdCBfVHAmIF9fdmFsLCBfU2l6ZSYgX19uKSB7Ci0gIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQotICAgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKLSAgICAgIGlmICgqX19maXJzdCA9PSBfX3ZhbCkKLSAgICAgICAgKytfX247Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfUHJlZGljYXRlLCBjbGFzcyBfU2l6ZT4KLV9TVExQX0lOTElORV9MT09QIHZvaWQKLWNvdW50X2lmKF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsIF9QcmVkaWNhdGUgX19wcmVkLCBfU2l6ZSYgX19uKSB7Ci0gIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQotICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCi0gICAgaWYgKF9fcHJlZCgqX19maXJzdCkpCi0gICAgICArK19fbjsKLX0KLSNlbmRpZgotCi10ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyMSwgY2xhc3MgX0ZvcndhcmRJdGVyMj4KLV9Gb3J3YXJkSXRlcjEgc2VhcmNoKF9Gb3J3YXJkSXRlcjEgX19maXJzdDEsIF9Gb3J3YXJkSXRlcjEgX19sYXN0MSwKLSAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlcjIgX19maXJzdDIsIF9Gb3J3YXJkSXRlcjIgX19sYXN0Mik7Ci0KLS8vIHNlYXJjaF9uLiAgU2VhcmNoIGZvciBfX2NvdW50IGNvbnNlY3V0aXZlIGNvcGllcyBvZiBfX3ZhbC4KLXRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9JbnRlZ2VyLCBjbGFzcyBfVHA+Ci1fRm9yd2FyZEl0ZXIgc2VhcmNoX24oX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgX0ludGVnZXIgX19jb3VudCwgY29uc3QgX1RwJiBfX3ZhbCk7Ci10ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfSW50ZWdlciwgY2xhc3MgX1RwLCBjbGFzcyBfQmluYXJ5UHJlZD4KLV9Gb3J3YXJkSXRlciBzZWFyY2hfbihfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICBfSW50ZWdlciBfX2NvdW50LCBjb25zdCBfVHAmIF9fdmFsLCBfQmluYXJ5UHJlZCBfX2JpbmFyeV9wcmVkKTsKLQotdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9Gb3J3YXJkSXRlcj4KLWlubGluZSBfSW5wdXRJdGVyIGZpbmRfZmlyc3Rfb2YoX0lucHV0SXRlciBfX2ZpcnN0MSwgX0lucHV0SXRlciBfX2xhc3QxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXIgX19maXJzdDIsIF9Gb3J3YXJkSXRlciBfX2xhc3QyKSB7Ci0gIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0MSwgX19sYXN0MSkpCi0gIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0MiwgX19sYXN0MikpCi0gIHJldHVybiBfU1RMUF9QUklWIF9fZmluZF9maXJzdF9vZihfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIsIF9fbGFzdDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fZXF1YWxfdG8oX1NUTFBfVkFMVUVfVFlQRShfX2ZpcnN0MSwgX0lucHV0SXRlcikpKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX0JpbmFyeVByZWRpY2F0ZT4KLWlubGluZSBfSW5wdXRJdGVyCi1maW5kX2ZpcnN0X29mKF9JbnB1dEl0ZXIgX19maXJzdDEsIF9JbnB1dEl0ZXIgX19sYXN0MSwKLSAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyIF9fZmlyc3QyLCBfRm9yd2FyZEl0ZXIgX19sYXN0MiwgX0JpbmFyeVByZWRpY2F0ZSBfX2NvbXApIHsKLSAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QxLCBfX2xhc3QxKSkKLSAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QyLCBfX2xhc3QyKSkKLSAgcmV0dXJuIF9TVExQX1BSSVYgX19maW5kX2ZpcnN0X29mKF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0MiwgX19sYXN0MiwgX19jb21wKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcjEsIGNsYXNzIF9Gb3J3YXJkSXRlcjI+Ci1fRm9yd2FyZEl0ZXIxCi1maW5kX2VuZChfRm9yd2FyZEl0ZXIxIF9fZmlyc3QxLCBfRm9yd2FyZEl0ZXIxIF9fbGFzdDEsCi0gICAgICAgICBfRm9yd2FyZEl0ZXIyIF9fZmlyc3QyLCBfRm9yd2FyZEl0ZXIyIF9fbGFzdDIpOwotCi0vLyBzd2FwX3JhbmdlcwotdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcjEsIGNsYXNzIF9Gb3J3YXJkSXRlcjI+Ci1fU1RMUF9JTkxJTkVfTE9PUCBfRm9yd2FyZEl0ZXIyCi1zd2FwX3JhbmdlcyhfRm9yd2FyZEl0ZXIxIF9fZmlyc3QxLCBfRm9yd2FyZEl0ZXIxIF9fbGFzdDEsIF9Gb3J3YXJkSXRlcjIgX19maXJzdDIpIHsKLSAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QxLCBfX2xhc3QxKSkKLSAgZm9yICggOyBfX2ZpcnN0MSAhPSBfX2xhc3QxOyArK19fZmlyc3QxLCArK19fZmlyc3QyKQotICAgIGl0ZXJfc3dhcChfX2ZpcnN0MSwgX19maXJzdDIpOwotICByZXR1cm4gX19maXJzdDI7Ci19Ci0KLS8vIHRyYW5zZm9ybQotdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9PdXRwdXRJdGVyLCBjbGFzcyBfVW5hcnlPcGVyYXRpb24+Ci1fU1RMUF9JTkxJTkVfTE9PUCBfT3V0cHV0SXRlcgotdHJhbnNmb3JtKF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsIF9PdXRwdXRJdGVyIF9fcmVzdWx0LCBfVW5hcnlPcGVyYXRpb24gX19vcHIpIHsKLSAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCi0gIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCwgKytfX3Jlc3VsdCkKLSAgICAqX19yZXN1bHQgPSBfX29wcigqX19maXJzdCk7Ci0gIHJldHVybiBfX3Jlc3VsdDsKLX0KLXRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0SXRlcjIsIGNsYXNzIF9PdXRwdXRJdGVyLCBjbGFzcyBfQmluYXJ5T3BlcmF0aW9uPgotX1NUTFBfSU5MSU5FX0xPT1AgX091dHB1dEl0ZXIKLXRyYW5zZm9ybShfSW5wdXRJdGVyMSBfX2ZpcnN0MSwgX0lucHV0SXRlcjEgX19sYXN0MSwKLSAgICAgICAgICBfSW5wdXRJdGVyMiBfX2ZpcnN0MiwgX091dHB1dEl0ZXIgX19yZXN1bHQsX0JpbmFyeU9wZXJhdGlvbiBfX2JpbmFyeV9vcCkgewotICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdDEsIF9fbGFzdDEpKQotICBmb3IgKCA7IF9fZmlyc3QxICE9IF9fbGFzdDE7ICsrX19maXJzdDEsICsrX19maXJzdDIsICsrX19yZXN1bHQpCi0gICAgKl9fcmVzdWx0ID0gX19iaW5hcnlfb3AoKl9fZmlyc3QxLCAqX19maXJzdDIpOwotICByZXR1cm4gX19yZXN1bHQ7Ci19Ci0KLS8vIHJlcGxhY2VfaWYsIHJlcGxhY2VfY29weSwgcmVwbGFjZV9jb3B5X2lmCi0KLXRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9QcmVkaWNhdGUsIGNsYXNzIF9UcD4KLV9TVExQX0lOTElORV9MT09QIHZvaWQKLXJlcGxhY2VfaWYoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsIF9QcmVkaWNhdGUgX19wcmVkLCBjb25zdCBfVHAmIF9fbmV3X3ZhbHVlKSB7Ci0gIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQotICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCi0gICAgaWYgKF9fcHJlZCgqX19maXJzdCkpCi0gICAgICAqX19maXJzdCA9IF9fbmV3X3ZhbHVlOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX091dHB1dEl0ZXIsIGNsYXNzIF9UcD4KLV9TVExQX0lOTElORV9MT09QICBfT3V0cHV0SXRlcgotcmVwbGFjZV9jb3B5KF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsX091dHB1dEl0ZXIgX19yZXN1bHQsCi0gICAgICAgICAgICAgY29uc3QgX1RwJiBfX29sZF92YWx1ZSwgY29uc3QgX1RwJiBfX25ld192YWx1ZSkgewotICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKLSAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0LCArK19fcmVzdWx0KQotICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0ID09IF9fb2xkX3ZhbHVlID8gX19uZXdfdmFsdWUgOiAqX19maXJzdDsKLSAgcmV0dXJuIF9fcmVzdWx0OwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yLCBjbGFzcyBfT3V0cHV0SXRlciwgY2xhc3MgX1ByZWRpY2F0ZSwgY2xhc3MgX1RwPgotX1NUTFBfSU5MSU5FX0xPT1AgX091dHB1dEl0ZXIKLXJlcGxhY2VfY29weV9pZihfSXRlcmF0b3IgX19maXJzdCwgX0l0ZXJhdG9yIF9fbGFzdCwKLSAgICAgICAgICAgICAgICBfT3V0cHV0SXRlciBfX3Jlc3VsdCwKLSAgICAgICAgICAgICAgICBfUHJlZGljYXRlIF9fcHJlZCwgY29uc3QgX1RwJiBfX25ld192YWx1ZSkgewotICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKLSAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0LCArK19fcmVzdWx0KQotICAgICpfX3Jlc3VsdCA9IF9fcHJlZCgqX19maXJzdCkgPyBfX25ld192YWx1ZSA6ICpfX2ZpcnN0OwotICByZXR1cm4gX19yZXN1bHQ7Ci19Ci0KLS8vIGdlbmVyYXRlIGFuZCBnZW5lcmF0ZV9uCi0KLXRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9HZW5lcmF0b3I+Ci1fU1RMUF9JTkxJTkVfTE9PUCB2b2lkCi1nZW5lcmF0ZShfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwgX0dlbmVyYXRvciBfX2dlbikgewotICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKLSAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQotICAgICpfX2ZpcnN0ID0gX19nZW4oKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9PdXRwdXRJdGVyLCBjbGFzcyBfU2l6ZSwgY2xhc3MgX0dlbmVyYXRvcj4KLV9TVExQX0lOTElORV9MT09QIHZvaWQKLWdlbmVyYXRlX24oX091dHB1dEl0ZXIgX19maXJzdCwgX1NpemUgX19uLCBfR2VuZXJhdG9yIF9fZ2VuKSB7Ci0gIGZvciAoIDsgX19uID4gMDsgLS1fX24sICsrX19maXJzdCkKLSAgICAqX19maXJzdCA9IF9fZ2VuKCk7Ci19Ci0KLS8vIHJlbW92ZSwgcmVtb3ZlX2lmLCByZW1vdmVfY29weSwgcmVtb3ZlX2NvcHlfaWYKLQotdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9PdXRwdXRJdGVyLCBjbGFzcyBfVHA+Ci1fU1RMUF9JTkxJTkVfTE9PUCBfT3V0cHV0SXRlcgotcmVtb3ZlX2NvcHkoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCxfT3V0cHV0SXRlciBfX3Jlc3VsdCwgY29uc3QgX1RwJiBfX3ZhbCkgewotICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKLSAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KSB7Ci0gICAgaWYgKCEoKl9fZmlyc3QgPT0gX192YWwpKSB7Ci0gICAgICAqX19yZXN1bHQgPSAqX19maXJzdDsKLSAgICAgICsrX19yZXN1bHQ7Ci0gICAgfQotICB9Ci0gIHJldHVybiBfX3Jlc3VsdDsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9PdXRwdXRJdGVyLCBjbGFzcyBfUHJlZGljYXRlPgotX1NUTFBfSU5MSU5FX0xPT1AgX091dHB1dEl0ZXIKLXJlbW92ZV9jb3B5X2lmKF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsIF9PdXRwdXRJdGVyIF9fcmVzdWx0LCBfUHJlZGljYXRlIF9fcHJlZCkgewotICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKLSAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KSB7Ci0gICAgaWYgKCFfX3ByZWQoKl9fZmlyc3QpKSB7Ci0gICAgICAqX19yZXN1bHQgPSAqX19maXJzdDsKLSAgICAgICsrX19yZXN1bHQ7Ci0gICAgfQotICB9Ci0gIHJldHVybiBfX3Jlc3VsdDsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1RwPgotX1NUTFBfSU5MSU5FX0xPT1AgX0ZvcndhcmRJdGVyCi1yZW1vdmUoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsIGNvbnN0IF9UcCYgX192YWwpIHsKLSAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCi0gIF9fZmlyc3QgPSBmaW5kKF9fZmlyc3QsIF9fbGFzdCwgX192YWwpOwotICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCi0gICAgcmV0dXJuIF9fZmlyc3Q7Ci0gIGVsc2UgewotICAgIF9Gb3J3YXJkSXRlciBfX25leHQgPSBfX2ZpcnN0OwotICAgIHJldHVybiByZW1vdmVfY29weSgrK19fbmV4dCwgX19sYXN0LCBfX2ZpcnN0LCBfX3ZhbCk7Ci0gIH0KLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1ByZWRpY2F0ZT4KLV9TVExQX0lOTElORV9MT09QIF9Gb3J3YXJkSXRlcgotcmVtb3ZlX2lmKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LCBfUHJlZGljYXRlIF9fcHJlZCkgewotICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKLSAgX19maXJzdCA9IGZpbmRfaWYoX19maXJzdCwgX19sYXN0LCBfX3ByZWQpOwotICBpZiAoIF9fZmlyc3QgPT0gX19sYXN0ICkKLSAgICByZXR1cm4gX19maXJzdDsKLSAgZWxzZSB7Ci0gICAgX0ZvcndhcmRJdGVyIF9fbmV4dCA9IF9fZmlyc3Q7Ci0gICAgcmV0dXJuIHJlbW92ZV9jb3B5X2lmKCsrX19uZXh0LCBfX2xhc3QsIF9fZmlyc3QsIF9fcHJlZCk7Ci0gIH0KLX0KLQotLy8gdW5pcXVlIGFuZCB1bmlxdWVfY29weQotdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9PdXRwdXRJdGVyPgotX091dHB1dEl0ZXIgdW5pcXVlX2NvcHkoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwgX091dHB1dEl0ZXIgX19yZXN1bHQpOwotCi10ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX091dHB1dEl0ZXIsIGNsYXNzIF9CaW5hcnlQcmVkaWNhdGU+Ci1fT3V0cHV0SXRlciB1bmlxdWVfY29weShfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LF9PdXRwdXRJdGVyIF9fcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgX0JpbmFyeVByZWRpY2F0ZSBfX2JpbmFyeV9wcmVkKTsKLQotdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcj4KLWlubGluZSBfRm9yd2FyZEl0ZXIgdW5pcXVlKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0KSB7Ci0gIF9fZmlyc3QgPSBhZGphY2VudF9maW5kKF9fZmlyc3QsIF9fbGFzdCk7Ci0gIHJldHVybiB1bmlxdWVfY29weShfX2ZpcnN0LCBfX2xhc3QsIF9fZmlyc3QpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfQmluYXJ5UHJlZGljYXRlPgotaW5saW5lIF9Gb3J3YXJkSXRlciB1bmlxdWUoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBfQmluYXJ5UHJlZGljYXRlIF9fYmluYXJ5X3ByZWQpIHsKLSAgX19maXJzdCA9IGFkamFjZW50X2ZpbmQoX19maXJzdCwgX19sYXN0LCBfX2JpbmFyeV9wcmVkKTsKLSAgcmV0dXJuIHVuaXF1ZV9jb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19maXJzdCwgX19iaW5hcnlfcHJlZCk7Ci19Ci0KLS8vIHJldmVyc2UgYW5kIHJldmVyc2VfY29weSwgYW5kIHRoZWlyIGF1eGlsaWFyeSBmdW5jdGlvbnMKLQotdGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcj4KLV9TVExQX0lOTElORV9MT09QIHZvaWQKLV9fcmV2ZXJzZShfQmlkaXJlY3Rpb25hbEl0ZXIgX19maXJzdCwgX0JpZGlyZWN0aW9uYWxJdGVyIF9fbGFzdCwgY29uc3QgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgJikgewotICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3QgJiYgX19maXJzdCAhPSAtLV9fbGFzdDsgKytfX2ZpcnN0KQotICAgIGl0ZXJfc3dhcChfX2ZpcnN0LF9fbGFzdCk7Ci19Ci0KLQotdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyPgotX1NUTFBfSU5MSU5FX0xPT1Agdm9pZAotX19yZXZlcnNlKF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwgY29uc3QgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgJikgewotICBmb3IgKDsgX19maXJzdCA8IF9fbGFzdDsgKytfX2ZpcnN0KQotICAgIGl0ZXJfc3dhcChfX2ZpcnN0LCAtLV9fbGFzdCk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXI+Ci1pbmxpbmUgdm9pZAotcmV2ZXJzZShfQmlkaXJlY3Rpb25hbEl0ZXIgX19maXJzdCwgX0JpZGlyZWN0aW9uYWxJdGVyIF9fbGFzdCkgewotICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKLSAgX19yZXZlcnNlKF9fZmlyc3QsIF9fbGFzdCwgX1NUTFBfSVRFUkFUT1JfQ0FURUdPUlkoX19maXJzdCwgX0JpZGlyZWN0aW9uYWxJdGVyKSk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXIsIGNsYXNzIF9PdXRwdXRJdGVyPgotX1NUTFBfSU5MSU5FX0xPT1AKLV9PdXRwdXRJdGVyIHJldmVyc2VfY29weShfQmlkaXJlY3Rpb25hbEl0ZXIgX19maXJzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0KSB7Ci0gIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQotICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QpIHsKLSAgICAtLV9fbGFzdDsKLSAgICAqX19yZXN1bHQgPSAqX19sYXN0OwotICAgICsrX19yZXN1bHQ7Ci0gIH0KLSAgcmV0dXJuIF9fcmVzdWx0OwotfQotCi1fU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCi0KLS8vIHJvdGF0ZSBhbmQgcm90YXRlX2NvcHksIGFuZCB0aGVpciBhdXhpbGlhcnkgZnVuY3Rpb25zCi10ZW1wbGF0ZSA8Y2xhc3MgX0V1Y2xpZGVhblJpbmdFbGVtZW50PgotX1NUTFBfSU5MSU5FX0xPT1AKLV9FdWNsaWRlYW5SaW5nRWxlbWVudCBfX2djZChfRXVjbGlkZWFuUmluZ0VsZW1lbnQgX19tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9FdWNsaWRlYW5SaW5nRWxlbWVudCBfX24pIHsKLSAgd2hpbGUgKF9fbiAhPSAwKSB7Ci0gICAgX0V1Y2xpZGVhblJpbmdFbGVtZW50IF9fdCA9IF9fbSAlIF9fbjsKLSAgICBfX20gPSBfX247Ci0gICAgX19uID0gX190OwotICB9Ci0gIHJldHVybiBfX207Ci19Ci0KLV9TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyPgotdm9pZCByb3RhdGUoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX21pZGRsZSwgX0ZvcndhcmRJdGVyIF9fbGFzdCk7Ci0KLXRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9PdXRwdXRJdGVyPgotaW5saW5lIF9PdXRwdXRJdGVyIHJvdGF0ZV9jb3B5KF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19taWRkbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyIF9fbGFzdCwgX091dHB1dEl0ZXIgX19yZXN1bHQpIHsKLSAgcmV0dXJuIGNvcHkoX19maXJzdCwgX19taWRkbGUsIGNvcHkoX19taWRkbGUsIF9fbGFzdCwgX19yZXN1bHQpKTsKLX0KLQotLy8gcmFuZG9tX3NodWZmbGUKLQotdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyPgotdm9pZCByYW5kb21fc2h1ZmZsZShfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QpOwotCi10ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9SYW5kb21OdW1iZXJHZW5lcmF0b3I+Ci12b2lkIHJhbmRvbV9zaHVmZmxlKF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgX1JhbmRvbU51bWJlckdlbmVyYXRvciYgX19yYW5kKTsKLQotI2lmICFkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQotLy8gcmFuZG9tX3NhbXBsZSBhbmQgcmFuZG9tX3NhbXBsZV9uIChleHRlbnNpb25zLCBub3QgcGFydCBvZiB0aGUgc3RhbmRhcmQpLgotCi10ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfT3V0cHV0SXRlciwgY2xhc3MgX0Rpc3RhbmNlPgotX091dHB1dEl0ZXIgcmFuZG9tX3NhbXBsZV9uKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyIF9fb3V0X2l0ZSwgY29uc3QgX0Rpc3RhbmNlIF9fbik7Ci0KLXRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9PdXRwdXRJdGVyLCBjbGFzcyBfRGlzdGFuY2UsCi0gICAgICAgICAgY2xhc3MgX1JhbmRvbU51bWJlckdlbmVyYXRvcj4KLV9PdXRwdXRJdGVyIHJhbmRvbV9zYW1wbGVfbihfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlciBfX291dF9pdGUsIGNvbnN0IF9EaXN0YW5jZSBfX24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JhbmRvbU51bWJlckdlbmVyYXRvciYgX19yYW5kKTsKLQotdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyPgotX1JhbmRvbUFjY2Vzc0l0ZXIKLXJhbmRvbV9zYW1wbGUoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKLSAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19vdXRfZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyIF9fb3V0X2xhc3QpOwotCi10ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsCi0gICAgICAgICAgY2xhc3MgX1JhbmRvbU51bWJlckdlbmVyYXRvcj4KLV9SYW5kb21BY2Nlc3NJdGVyCi1yYW5kb21fc2FtcGxlKF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCi0gICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fb3V0X2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlciBfX291dF9sYXN0LAotICAgICAgICAgICAgICBfUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3JhbmQpOwotCi0jZW5kaWYgLyogX1NUTFBfTk9fRVhURU5TSU9OUyAqLwotCi0vLyBwYXJ0aXRpb24sIHN0YWJsZV9wYXJ0aXRpb24sIGFuZCB0aGVpciBhdXhpbGlhcnkgZnVuY3Rpb25zCi0KLXRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9QcmVkaWNhdGU+Ci1fRm9yd2FyZEl0ZXIgcGFydGl0aW9uKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LCBfUHJlZGljYXRlICAgX19wcmVkKTsKLQotdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1ByZWRpY2F0ZT4KLV9Gb3J3YXJkSXRlcgotc3RhYmxlX3BhcnRpdGlvbihfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwgX1ByZWRpY2F0ZSBfX3ByZWQpOwotCi0vLyBzb3J0KCkgYW5kIGl0cyBhdXhpbGlhcnkgZnVuY3Rpb25zLgotX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1NpemU+Ci1pbmxpbmUgX1NpemUgX19sZyhfU2l6ZSBfX24pIHsKLSAgX1NpemUgX19rOwotICBmb3IgKF9fayA9IDA7IF9fbiAhPSAxOyBfX24gPj49IDEpICsrX19rOwotICByZXR1cm4gX19rOwotfQotCi1fU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKLQotdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyPgotdm9pZCBzb3J0KF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCk7Ci10ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9Db21wYXJlPgotdm9pZCBzb3J0KF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwgX0NvbXBhcmUgX19jb21wKTsKLQotLy8gc3RhYmxlX3NvcnQoKSBhbmQgaXRzIGF1eGlsaWFyeSBmdW5jdGlvbnMuCi10ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXI+Ci12b2lkIHN0YWJsZV9zb3J0KF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsCi0gICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCk7Ci0KLXRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX0NvbXBhcmU+Ci12b2lkIHN0YWJsZV9zb3J0KF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsCi0gICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwgX0NvbXBhcmUgX19jb21wKTsKLQotLy8gcGFydGlhbF9zb3J0LCBwYXJ0aWFsX3NvcnRfY29weSwgYW5kIGF1eGlsaWFyeSBmdW5jdGlvbnMuCi0KLXRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcj4KLXZvaWQgcGFydGlhbF9zb3J0KF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyIF9fbWlkZGxlLAotICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0KTsKLQotdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBjbGFzcyBfQ29tcGFyZT4KLXZvaWQgcGFydGlhbF9zb3J0KF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsX1JhbmRvbUFjY2Vzc0l0ZXIgX19taWRkbGUsCi0gICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsIF9Db21wYXJlIF9fY29tcCk7Ci0KLXRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcj4KLV9SYW5kb21BY2Nlc3NJdGVyCi1wYXJ0aWFsX3NvcnRfY29weShfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LAotICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19yZXN1bHRfZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyIF9fcmVzdWx0X2xhc3QpOwotCi10ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9Db21wYXJlPgotX1JhbmRvbUFjY2Vzc0l0ZXIKLXBhcnRpYWxfc29ydF9jb3B5KF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX3Jlc3VsdF9maXJzdCwKLSAgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fcmVzdWx0X2xhc3QsIF9Db21wYXJlIF9fY29tcCk7Ci0KLS8vIG50aF9lbGVtZW50KCkgYW5kIGl0cyBhdXhpbGlhcnkgZnVuY3Rpb25zLgotdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyPgotdm9pZCBudGhfZWxlbWVudChfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlciBfX250aCwKLSAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0KTsKLQotdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBjbGFzcyBfQ29tcGFyZT4KLXZvaWQgbnRoX2VsZW1lbnQoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIgX19udGgsCi0gICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwgX0NvbXBhcmUgX19jb21wKTsKLQotLy8gYXV4aWxpYXJ5IGNsYXNzIGZvciBsb3dlcl9ib3VuZCwgZXRjLgotX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+Ci1zdHJ1Y3QgX19sZXNzXzIgewotICBib29sIG9wZXJhdG9yKCkgKGNvbnN0IF9UMSYgX194LCBjb25zdCBfVDImIF9feSkgY29uc3QgeyByZXR1cm4gX194IDwgX195IDsgfQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgotX19sZXNzXzI8X1QxLF9UMj4gX19sZXNzMihfVDEqLCBfVDIqICkgeyByZXR1cm4gX19sZXNzXzI8X1QxLCBfVDI+KCk7IH0KLQotI2lmIGRlZmluZWQgKF9TVExQX0ZVTkNUSU9OX1BBUlRJQUxfT1JERVIpCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotbGVzczxfVHA+IF9fbGVzczIoX1RwKiwgX1RwKiApIHsgcmV0dXJuIGxlc3M8X1RwPigpOyB9Ci0jZW5kaWYKLQotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi0KLS8vIEJpbmFyeSBzZWFyY2ggKGxvd2VyX2JvdW5kLCB1cHBlcl9ib3VuZCwgZXF1YWxfcmFuZ2UsIGJpbmFyeV9zZWFyY2gpLgotdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1RwPgotaW5saW5lIF9Gb3J3YXJkSXRlciBsb3dlcl9ib3VuZChfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1RwJiBfX3ZhbCkgewotICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKLSAgcmV0dXJuIF9TVExQX1BSSVYgX19sb3dlcl9ib3VuZChfX2ZpcnN0LCBfX2xhc3QsIF9fdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX19sZXNzMihfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsIF9Gb3J3YXJkSXRlciksIChfVHAqKTApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX19sZXNzMigoX1RwKikwLCBfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsIF9Gb3J3YXJkSXRlcikpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX0RJU1RBTkNFX1RZUEUoX19maXJzdCwgX0ZvcndhcmRJdGVyKSk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmU+Ci1pbmxpbmUgX0ZvcndhcmRJdGVyIGxvd2VyX2JvdW5kKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfVHAmIF9fdmFsLCBfQ29tcGFyZSBfX2NvbXApIHsKLSAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCi0gIHJldHVybiBfU1RMUF9QUklWIF9fbG93ZXJfYm91bmQoX19maXJzdCwgX19sYXN0LCBfX3ZhbCwgX19jb21wLCBfX2NvbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfRElTVEFOQ0VfVFlQRShfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIpKTsKLX0KLQotX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlMSwgY2xhc3MgX0NvbXBhcmUyLCBjbGFzcyBfRGlzdGFuY2U+Ci1fRm9yd2FyZEl0ZXIgX191cHBlcl9ib3VuZChfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwgY29uc3QgX1RwJiBfX3ZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Db21wYXJlMSBfX2NvbXAxLCBfQ29tcGFyZTIgX19jb21wMiwgX0Rpc3RhbmNlKik7Ci0KLV9TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfVHA+Ci1pbmxpbmUgX0ZvcndhcmRJdGVyIHVwcGVyX2JvdW5kKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfVHAmIF9fdmFsKSB7Ci0gIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQotICByZXR1cm4gX1NUTFBfUFJJViBfX3VwcGVyX2JvdW5kKF9fZmlyc3QsIF9fbGFzdCwgX192YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfX2xlc3MyKF9TVExQX1ZBTFVFX1RZUEUoX19maXJzdCwgX0ZvcndhcmRJdGVyKSwgKF9UcCopMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfX2xlc3MyKChfVHAqKTAsIF9TVExQX1ZBTFVFX1RZUEUoX19maXJzdCwgX0ZvcndhcmRJdGVyKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfRElTVEFOQ0VfVFlQRShfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIpKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZT4KLWlubGluZSBfRm9yd2FyZEl0ZXIgdXBwZXJfYm91bmQoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9UcCYgX192YWwsIF9Db21wYXJlIF9fY29tcCkgewotICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKLSAgcmV0dXJuIF9TVExQX1BSSVYgX191cHBlcl9ib3VuZChfX2ZpcnN0LCBfX2xhc3QsIF9fdmFsLCBfX2NvbXAsIF9fY29tcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9ESVNUQU5DRV9UWVBFKF9fZmlyc3QsIF9Gb3J3YXJkSXRlcikpOwotfQotCi1fU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCi0KLXRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmUxLCBjbGFzcyBfQ29tcGFyZTIsIGNsYXNzIF9EaXN0YW5jZT4KLXBhaXI8X0ZvcndhcmRJdGVyLCBfRm9yd2FyZEl0ZXI+Ci1fX2VxdWFsX3JhbmdlKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LCBjb25zdCBfVHAmIF9fdmFsLAotICAgICAgICAgICAgICBfQ29tcGFyZTEgX19jb21wMSwgX0NvbXBhcmUyIF9fY29tcDIsIF9EaXN0YW5jZSopOwotCi1fU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKLQotdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1RwPgotaW5saW5lIHBhaXI8X0ZvcndhcmRJdGVyLCBfRm9yd2FyZEl0ZXI+Ci1lcXVhbF9yYW5nZShfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwgY29uc3QgX1RwJiBfX3ZhbCkgewotICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKLSAgcmV0dXJuIF9TVExQX1BSSVYgX19lcXVhbF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QsIF9fdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX19sZXNzMihfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsIF9Gb3J3YXJkSXRlciksIChfVHAqKTApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX19sZXNzMigoX1RwKikwLCBfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsIF9Gb3J3YXJkSXRlcikpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX0RJU1RBTkNFX1RZUEUoX19maXJzdCwgX0ZvcndhcmRJdGVyKSk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmU+Ci1pbmxpbmUgcGFpcjxfRm9yd2FyZEl0ZXIsIF9Gb3J3YXJkSXRlcj4KLWVxdWFsX3JhbmdlKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LCBjb25zdCBfVHAmIF9fdmFsLAotICAgICAgICAgICAgX0NvbXBhcmUgX19jb21wKSB7Ci0gIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQotICByZXR1cm4gX1NUTFBfUFJJViBfX2VxdWFsX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCwgX192YWwsIF9fY29tcCwgX19jb21wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX0RJU1RBTkNFX1RZUEUoX19maXJzdCwgX0ZvcndhcmRJdGVyKSk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9UcD4KLWlubGluZSBib29sIGJpbmFyeV9zZWFyY2goX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgX1RwJiBfX3ZhbCkgewotICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKLSAgX0ZvcndhcmRJdGVyIF9faSA9IF9TVExQX1BSSVYgX19sb3dlcl9ib3VuZChfX2ZpcnN0LCBfX2xhc3QsIF9fdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX19sZXNzMihfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsIF9Gb3J3YXJkSXRlciksIChfVHAqKTApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX19sZXNzMigoX1RwKikwLCBfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsIF9Gb3J3YXJkSXRlcikpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX0RJU1RBTkNFX1RZUEUoX19maXJzdCwgX0ZvcndhcmRJdGVyKSk7Ci0gIHJldHVybiBfX2kgIT0gX19sYXN0ICYmICEoX192YWwgPCAqX19pKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZT4KLWlubGluZSBib29sIGJpbmFyeV9zZWFyY2goX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9UcCYgX192YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIF9Db21wYXJlIF9fY29tcCkgewotICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKLSAgX0ZvcndhcmRJdGVyIF9faSA9IF9TVExQX1BSSVYgX19sb3dlcl9ib3VuZChfX2ZpcnN0LCBfX2xhc3QsIF9fdmFsLCBfX2NvbXAsIF9fY29tcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9ESVNUQU5DRV9UWVBFKF9fZmlyc3QsIF9Gb3J3YXJkSXRlcikpOwotICByZXR1cm4gX19pICE9IF9fbGFzdCAmJiAhX19jb21wKF9fdmFsLCAqX19pKTsKLX0KLQotLy8gbWVyZ2UsIHdpdGggYW5kIHdpdGhvdXQgYW4gZXhwbGljaXRseSBzdXBwbGllZCBjb21wYXJpc29uIGZ1bmN0aW9uLgotCi10ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNsYXNzIF9JbnB1dEl0ZXIyLCBjbGFzcyBfT3V0cHV0SXRlcj4KLV9PdXRwdXRJdGVyIG1lcmdlKF9JbnB1dEl0ZXIxIF9fZmlyc3QxLCBfSW5wdXRJdGVyMSBfX2xhc3QxLAotICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIsIF9JbnB1dEl0ZXIyIF9fbGFzdDIsCi0gICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlciBfX3Jlc3VsdCk7Ci0KLXRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0SXRlcjIsIGNsYXNzIF9PdXRwdXRJdGVyLAotICAgICAgICAgIGNsYXNzIF9Db21wYXJlPgotX091dHB1dEl0ZXIgbWVyZ2UoX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIxIF9fbGFzdDEsCi0gICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyMiBfX2ZpcnN0MiwgX0lucHV0SXRlcjIgX19sYXN0MiwKLSAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0LCBfQ29tcGFyZSBfX2NvbXApOwotCi0KLS8vIGlucGxhY2VfbWVyZ2UgYW5kIGl0cyBhdXhpbGlhcnkgZnVuY3Rpb25zLgotCi0KLXRlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXI+Ci12b2lkIGlucGxhY2VfbWVyZ2UoX0JpZGlyZWN0aW9uYWxJdGVyIF9fZmlyc3QsCi0gICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyIF9fbWlkZGxlLAotICAgICAgICAgICAgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlciBfX2xhc3QpIDsKLQotdGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlciwgY2xhc3MgX0NvbXBhcmU+Ci12b2lkIGlucGxhY2VfbWVyZ2UoX0JpZGlyZWN0aW9uYWxJdGVyIF9fZmlyc3QsCi0gICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyIF9fbWlkZGxlLAotICAgICAgICAgICAgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlciBfX2xhc3QsIF9Db21wYXJlIF9fY29tcCk7Ci0KLS8vIFNldCBhbGdvcml0aG1zOiBpbmNsdWRlcywgc2V0X3VuaW9uLCBzZXRfaW50ZXJzZWN0aW9uLCBzZXRfZGlmZmVyZW5jZSwKLS8vIHNldF9zeW1tZXRyaWNfZGlmZmVyZW5jZS4gIEFsbCBvZiB0aGVzZSBhbGdvcml0aG1zIGhhdmUgdGhlIHByZWNvbmRpdGlvbgotLy8gdGhhdCB0aGVpciBpbnB1dCByYW5nZXMgYXJlIHNvcnRlZCBhbmQgdGhlIHBvc3Rjb25kaXRpb24gdGhhdCB0aGVpciBvdXRwdXQKLS8vIHJhbmdlcyBhcmUgc29ydGVkLgotCi10ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNsYXNzIF9JbnB1dEl0ZXIyPgotYm9vbCBpbmNsdWRlcyhfSW5wdXRJdGVyMSBfX2ZpcnN0MSwgX0lucHV0SXRlcjEgX19sYXN0MSwKLSAgICAgICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIsIF9JbnB1dEl0ZXIyIF9fbGFzdDIpOwotCi10ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNsYXNzIF9JbnB1dEl0ZXIyLCBjbGFzcyBfQ29tcGFyZT4KLWJvb2wgaW5jbHVkZXMoX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIxIF9fbGFzdDEsCi0gICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyLCBfSW5wdXRJdGVyMiBfX2xhc3QyLCBfQ29tcGFyZSBfX2NvbXApOwotCi10ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNsYXNzIF9JbnB1dEl0ZXIyLCBjbGFzcyBfT3V0cHV0SXRlcj4KLV9PdXRwdXRJdGVyIHNldF91bmlvbihfSW5wdXRJdGVyMSBfX2ZpcnN0MSwgX0lucHV0SXRlcjEgX19sYXN0MSwKLSAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyMiBfX2ZpcnN0MiwgX0lucHV0SXRlcjIgX19sYXN0MiwKLSAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlciBfX3Jlc3VsdCk7Ci0KLXRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0SXRlcjIsIGNsYXNzIF9PdXRwdXRJdGVyLAotICAgICAgICAgIGNsYXNzIF9Db21wYXJlPgotX091dHB1dEl0ZXIgc2V0X3VuaW9uKF9JbnB1dEl0ZXIxIF9fZmlyc3QxLCBfSW5wdXRJdGVyMSBfX2xhc3QxLAotICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyLCBfSW5wdXRJdGVyMiBfX2xhc3QyLAotICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0LCBfQ29tcGFyZSBfX2NvbXApOwotCi10ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNsYXNzIF9JbnB1dEl0ZXIyLCBjbGFzcyBfT3V0cHV0SXRlcj4KLV9PdXRwdXRJdGVyIHNldF9pbnRlcnNlY3Rpb24oX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIxIF9fbGFzdDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyLCBfSW5wdXRJdGVyMiBfX2xhc3QyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlciBfX3Jlc3VsdCk7Ci0KLXRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0SXRlcjIsIGNsYXNzIF9PdXRwdXRJdGVyLAotICAgICAgICAgIGNsYXNzIF9Db21wYXJlPgotX091dHB1dEl0ZXIgc2V0X2ludGVyc2VjdGlvbihfSW5wdXRJdGVyMSBfX2ZpcnN0MSwgX0lucHV0SXRlcjEgX19sYXN0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIsIF9JbnB1dEl0ZXIyIF9fbGFzdDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0LCBfQ29tcGFyZSBfX2NvbXApOwotCi0KLQotdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMiwgY2xhc3MgX091dHB1dEl0ZXI+Ci1fT3V0cHV0SXRlciBzZXRfZGlmZmVyZW5jZShfSW5wdXRJdGVyMSBfX2ZpcnN0MSwgX0lucHV0SXRlcjEgX19sYXN0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyLCBfSW5wdXRJdGVyMiBfX2xhc3QyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXIgX19yZXN1bHQpOwotCi10ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNsYXNzIF9JbnB1dEl0ZXIyLCBjbGFzcyBfT3V0cHV0SXRlciwKLSAgICAgICAgICBjbGFzcyBfQ29tcGFyZT4KLV9PdXRwdXRJdGVyIHNldF9kaWZmZXJlbmNlKF9JbnB1dEl0ZXIxIF9fZmlyc3QxLCBfSW5wdXRJdGVyMSBfX2xhc3QxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIsIF9JbnB1dEl0ZXIyIF9fbGFzdDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlciBfX3Jlc3VsdCwgX0NvbXBhcmUgX19jb21wKTsKLQotdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMiwgY2xhc3MgX091dHB1dEl0ZXI+Ci1fT3V0cHV0SXRlcgotc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlKF9JbnB1dEl0ZXIxIF9fZmlyc3QxLCBfSW5wdXRJdGVyMSBfX2xhc3QxLAotICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyLCBfSW5wdXRJdGVyMiBfX2xhc3QyLAotICAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0KTsKLQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNsYXNzIF9JbnB1dEl0ZXIyLCBjbGFzcyBfT3V0cHV0SXRlciwKLSAgICAgICAgICBjbGFzcyBfQ29tcGFyZT4KLV9PdXRwdXRJdGVyCi1zZXRfc3ltbWV0cmljX2RpZmZlcmVuY2UoX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIxIF9fbGFzdDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIsIF9JbnB1dEl0ZXIyIF9fbGFzdDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXIgX19yZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgX0NvbXBhcmUgX19jb21wKTsKLQotCi0vLyBtaW5fZWxlbWVudCBhbmQgbWF4X2VsZW1lbnQsIHdpdGggYW5kIHdpdGhvdXQgYW4gZXhwbGljaXRseSBzdXBwbGllZAotLy8gY29tcGFyaXNvbiBmdW5jdGlvbi4KLQotdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcj4KLV9Gb3J3YXJkSXRlciBtYXhfZWxlbWVudChfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCk7Ci10ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfQ29tcGFyZT4KLV9Gb3J3YXJkSXRlciBtYXhfZWxlbWVudChfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ29tcGFyZSBfX2NvbXApOwotCi10ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyPgotX0ZvcndhcmRJdGVyIG1pbl9lbGVtZW50KF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0KTsKLQotdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX0NvbXBhcmU+Ci1fRm9yd2FyZEl0ZXIgbWluX2VsZW1lbnQoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NvbXBhcmUgX19jb21wKTsKLQotLy8gbmV4dF9wZXJtdXRhdGlvbiBhbmQgcHJldl9wZXJtdXRhdGlvbiwgd2l0aCBhbmQgd2l0aG91dCBhbiBleHBsaWNpdGx5Ci0vLyBzdXBwbGllZCBjb21wYXJpc29uIGZ1bmN0aW9uLgotCi10ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyPgotYm9vbCBuZXh0X3Blcm11dGF0aW9uKF9CaWRpcmVjdGlvbmFsSXRlciBfX2ZpcnN0LCBfQmlkaXJlY3Rpb25hbEl0ZXIgX19sYXN0KTsKLQotdGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlciwgY2xhc3MgX0NvbXBhcmU+Ci1ib29sIG5leHRfcGVybXV0YXRpb24oX0JpZGlyZWN0aW9uYWxJdGVyIF9fZmlyc3QsIF9CaWRpcmVjdGlvbmFsSXRlciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgX0NvbXBhcmUgX19jb21wKTsKLQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyPgotYm9vbCBwcmV2X3Blcm11dGF0aW9uKF9CaWRpcmVjdGlvbmFsSXRlciBfX2ZpcnN0LCBfQmlkaXJlY3Rpb25hbEl0ZXIgX19sYXN0KTsKLQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyLCBjbGFzcyBfQ29tcGFyZT4KLWJvb2wgcHJldl9wZXJtdXRhdGlvbihfQmlkaXJlY3Rpb25hbEl0ZXIgX19maXJzdCwgX0JpZGlyZWN0aW9uYWxJdGVyIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICBfQ29tcGFyZSBfX2NvbXApOwotCi0jaWYgIWRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpCi0vLyBpc19oZWFwLCBhIHByZWRpY2F0ZSB0ZXN0aW5nIHdoZXRoZXIgb3Igbm90IGEgcmFuZ2UgaXMKLS8vIGEgaGVhcC4gIFRoaXMgZnVuY3Rpb24gaXMgYW4gZXh0ZW5zaW9uLCBub3QgcGFydCBvZiB0aGUgQysrCi0vLyBzdGFuZGFyZC4KLQotdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyPgotYm9vbCBpc19oZWFwKF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCk7Ci0KLXRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX1N0cmljdFdlYWtPcmRlcmluZz4KLWJvb2wgaXNfaGVhcChfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsCi0gICAgICAgICAgICAgX1N0cmljdFdlYWtPcmRlcmluZyBfX2NvbXApOwotCi0vLyBpc19zb3J0ZWQsIGEgcHJlZGljYXRlZCB0ZXN0aW5nIHdoZXRoZXIgYSByYW5nZSBpcyBzb3J0ZWQgaW4KLS8vIG5vbmRlc2NlbmRpbmcgb3JkZXIuICBUaGlzIGlzIGFuIGV4dGVuc2lvbiwgbm90IHBhcnQgb2YgdGhlIEMrKwotLy8gc3RhbmRhcmQuCi1fU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCi0KLXRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9TdHJpY3RXZWFrT3JkZXJpbmc+Ci1ib29sIF9faXNfc29ydGVkKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LAotICAgICAgICAgICAgICAgICBfU3RyaWN0V2Vha09yZGVyaW5nIF9fY29tcCk7Ci0KLV9TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQotdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcj4KLWlubGluZSBib29sIGlzX3NvcnRlZChfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCkgewotICByZXR1cm4gX1NUTFBfUFJJViBfX2lzX3NvcnRlZChfX2ZpcnN0LCBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX19sZXNzKF9TVExQX1ZBTFVFX1RZUEUoX19maXJzdCwgX0ZvcndhcmRJdGVyKSkpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfU3RyaWN0V2Vha09yZGVyaW5nPgotaW5saW5lIGJvb2wgaXNfc29ydGVkKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgIF9TdHJpY3RXZWFrT3JkZXJpbmcgX19jb21wKSB7Ci0gIHJldHVybiBfU1RMUF9QUklWIF9faXNfc29ydGVkKF9fZmlyc3QsIF9fbGFzdCwgX19jb21wKTsKLX0KLSNlbmRpZgotCi1fU1RMUF9FTkRfTkFNRVNQQUNFCi0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfTElOS19USU1FX0lOU1RBTlRJQVRJT04pCi0jICBpbmNsdWRlIDxzdGwvX2FsZ28uYz4KLSNlbmRpZgotCi0jZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfQUxHT19IICovCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6Ci0KZGlmZiAtLWdpdCBhL3N0bC9fYWxnb2Jhc2UuYyBiL3N0bC9fYWxnb2Jhc2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGExZjY1Ny4uMDAwMDAwMAotLS0gYS9zdGwvX2FsZ29iYXNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MDMgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTQKLSAqIEhld2xldHQtUGFja2FyZCBDb21wYW55Ci0gKgotICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKLSAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NwotICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogQm9yaXMgRm9taXRjaGV2Ci0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICovCi0jaWZuZGVmIF9TVExQX0FMR09CQVNFX0MKLSNkZWZpbmUgX1NUTFBfQUxHT0JBU0VfQwotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0FMR09CQVNFX0gKLSMgIGluY2x1ZGUgPHN0bC9fYWxnb2Jhc2UuaD4KLSNlbmRpZgotCi1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLQotdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMj4KLWJvb2wgbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIxIF9fbGFzdDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyLCBfSW5wdXRJdGVyMiBfX2xhc3QyKSB7Ci0gIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0MSwgX19sYXN0MSkpCi0gIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0MiwgX19sYXN0MikpCi0gIGZvciAoIDsgX19maXJzdDEgIT0gX19sYXN0MSAmJiBfX2ZpcnN0MiAhPSBfX2xhc3QyCi0gICAgICAgIDsgKytfX2ZpcnN0MSwgKytfX2ZpcnN0MikgewotICAgIGlmICgqX19maXJzdDEgPCAqX19maXJzdDIpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBpZiAoKl9fZmlyc3QyIDwgKl9fZmlyc3QxKQotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiBfX2ZpcnN0MSA9PSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDI7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0SXRlcjIsIGNsYXNzIF9Db21wYXJlPgotYm9vbCBsZXhpY29ncmFwaGljYWxfY29tcGFyZShfSW5wdXRJdGVyMSBfX2ZpcnN0MSwgX0lucHV0SXRlcjEgX19sYXN0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIsIF9JbnB1dEl0ZXIyIF9fbGFzdDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Db21wYXJlIF9fY29tcCkgewotICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdDEsIF9fbGFzdDEpKQotICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdDIsIF9fbGFzdDIpKQotICBmb3IgKCA7IF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0MgotICAgICAgICA7ICsrX19maXJzdDEsICsrX19maXJzdDIpIHsKLSAgICBpZiAoX19jb21wKCpfX2ZpcnN0MSwgKl9fZmlyc3QyKSkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGlmIChfX2NvbXAoKl9fZmlyc3QyLCAqX19maXJzdDEpKQotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiBfX2ZpcnN0MSA9PSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDI7Ci19Ci0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKLV9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKLQotdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMj4KLWludCBfX2xleGljb2dyYXBoaWNhbF9jb21wYXJlXzN3YXkoX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIxIF9fbGFzdDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyLCBfSW5wdXRJdGVyMiBfX2xhc3QyKSB7Ci0gIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDIpIHsKLSAgICBpZiAoKl9fZmlyc3QxIDwgKl9fZmlyc3QyKSB7Ci0gICAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghKCpfX2ZpcnN0MiA8ICpfX2ZpcnN0MSksIF9TdGxNc2dfSU5WQUxJRF9TVFJJQ1RfV0VBS19QUkVESUNBVEUpCi0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGlmICgqX19maXJzdDIgPCAqX19maXJzdDEpCi0gICAgICByZXR1cm4gMTsKLSAgICArK19fZmlyc3QxOwotICAgICsrX19maXJzdDI7Ci0gIH0KLSAgaWYgKF9fZmlyc3QyID09IF9fbGFzdDIpIHsKLSAgICByZXR1cm4gIShfX2ZpcnN0MSA9PSBfX2xhc3QxKTsKLSAgfQotICBlbHNlIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLX0KLQotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi0KLXRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0SXRlcjI+Ci1pbnQgbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmVfM3dheShfSW5wdXRJdGVyMSBfX2ZpcnN0MSwgX0lucHV0SXRlcjEgX19sYXN0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyLCBfSW5wdXRJdGVyMiBfX2xhc3QyKSB7Ci0gIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0MSwgX19sYXN0MSkpCi0gIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0MiwgX19sYXN0MikpCi0gIHJldHVybiBfU1RMUF9QUklWIF9fbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmVfM3dheShfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIsIF9fbGFzdDIpOwotfQotI2VuZGlmCi0KLV9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKLQotdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBjbGFzcyBfVHA+Ci1fU1RMUF9JTkxJTkVfTE9PUCBfUmFuZG9tQWNjZXNzSXRlciBfX2ZpbmQoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9UcCYgX192YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgJikgewotICBfU1RMUF9ESUZGRVJFTkNFX1RZUEUoX1JhbmRvbUFjY2Vzc0l0ZXIpIF9fdHJpcF9jb3VudCA9IChfX2xhc3QgLSBfX2ZpcnN0KSA+PiAyOwotCi0gIGZvciAoIDsgX190cmlwX2NvdW50ID4gMCA7IC0tX190cmlwX2NvdW50KSB7Ci0gICAgaWYgKCpfX2ZpcnN0ID09IF9fdmFsKSByZXR1cm4gX19maXJzdDsKLSAgICArK19fZmlyc3Q7Ci0KLSAgICBpZiAoKl9fZmlyc3QgPT0gX192YWwpIHJldHVybiBfX2ZpcnN0OwotICAgICsrX19maXJzdDsKLQotICAgIGlmICgqX19maXJzdCA9PSBfX3ZhbCkgcmV0dXJuIF9fZmlyc3Q7Ci0gICAgKytfX2ZpcnN0OwotCi0gICAgaWYgKCpfX2ZpcnN0ID09IF9fdmFsKSByZXR1cm4gX19maXJzdDsKLSAgICArK19fZmlyc3Q7Ci0gIH0KLQotICBzd2l0Y2ggKF9fbGFzdCAtIF9fZmlyc3QpIHsKLSAgY2FzZSAzOgotICAgIGlmICgqX19maXJzdCA9PSBfX3ZhbCkgcmV0dXJuIF9fZmlyc3Q7Ci0gICAgKytfX2ZpcnN0OwotICBjYXNlIDI6Ci0gICAgaWYgKCpfX2ZpcnN0ID09IF9fdmFsKSByZXR1cm4gX19maXJzdDsKLSAgICArK19fZmlyc3Q7Ci0gIGNhc2UgMToKLSAgICBpZiAoKl9fZmlyc3QgPT0gX192YWwpIHJldHVybiBfX2ZpcnN0OwotICAgIC8vKytfX2ZpcnN0OwotICBjYXNlIDA6Ci0gIGRlZmF1bHQ6Ci0gICAgcmV0dXJuIF9fbGFzdDsKLSAgfQotfQotCi1pbmxpbmUgY2hhcioKLV9fZmluZChjaGFyKiBfX2ZpcnN0LCBjaGFyKiBfX2xhc3QsIGNoYXIgX192YWwsIGNvbnN0IHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnICYpIHsKLSAgdm9pZCAqcmVzID0gIG1lbWNocihfX2ZpcnN0LCBfX3ZhbCwgX19sYXN0IC0gX19maXJzdCk7Ci0gIHJldHVybiByZXMgIT0gMCA/IF9fU1RBVElDX0NBU1QoY2hhciosIHJlcykgOiBfX2xhc3Q7Ci19Ci1pbmxpbmUgY29uc3QgY2hhcioKLV9fZmluZChjb25zdCBjaGFyKiBfX2ZpcnN0LCBjb25zdCBjaGFyKiBfX2xhc3QsIGNoYXIgX192YWwsIGNvbnN0IHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnICYpIHsKLSAgY29uc3Qgdm9pZCAqcmVzID0gIG1lbWNocihfX2ZpcnN0LCBfX3ZhbCwgX19sYXN0IC0gX19maXJzdCk7Ci0gIHJldHVybiByZXMgIT0gMCA/IF9fU1RBVElDX0NBU1QoY29uc3QgY2hhciosIHJlcykgOiBfX2xhc3Q7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX1ByZWRpY2F0ZT4KLV9TVExQX0lOTElORV9MT09QIF9SYW5kb21BY2Nlc3NJdGVyIF9fZmluZF9pZihfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1ByZWRpY2F0ZSBfX3ByZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgJikgewotICBfU1RMUF9ESUZGRVJFTkNFX1RZUEUoX1JhbmRvbUFjY2Vzc0l0ZXIpIF9fdHJpcF9jb3VudCA9IChfX2xhc3QgLSBfX2ZpcnN0KSA+PiAyOwotCi0gIGZvciAoIDsgX190cmlwX2NvdW50ID4gMCA7IC0tX190cmlwX2NvdW50KSB7Ci0gICAgaWYgKF9fcHJlZCgqX19maXJzdCkpIHJldHVybiBfX2ZpcnN0OwotICAgICsrX19maXJzdDsKLQotICAgIGlmIChfX3ByZWQoKl9fZmlyc3QpKSByZXR1cm4gX19maXJzdDsKLSAgICArK19fZmlyc3Q7Ci0KLSAgICBpZiAoX19wcmVkKCpfX2ZpcnN0KSkgcmV0dXJuIF9fZmlyc3Q7Ci0gICAgKytfX2ZpcnN0OwotCi0gICAgaWYgKF9fcHJlZCgqX19maXJzdCkpIHJldHVybiBfX2ZpcnN0OwotICAgICsrX19maXJzdDsKLSAgfQotCi0gIHN3aXRjaChfX2xhc3QgLSBfX2ZpcnN0KSB7Ci0gIGNhc2UgMzoKLSAgICBpZiAoX19wcmVkKCpfX2ZpcnN0KSkgcmV0dXJuIF9fZmlyc3Q7Ci0gICAgKytfX2ZpcnN0OwotICBjYXNlIDI6Ci0gICAgaWYgKF9fcHJlZCgqX19maXJzdCkpIHJldHVybiBfX2ZpcnN0OwotICAgICsrX19maXJzdDsKLSAgY2FzZSAxOgotICAgIGlmIChfX3ByZWQoKl9fZmlyc3QpKSByZXR1cm4gX19maXJzdDsKLSAgICAgIC8vKytfX2ZpcnN0OwotICBjYXNlIDA6Ci0gIGRlZmF1bHQ6Ci0gICAgcmV0dXJuIF9fbGFzdDsKLSAgfQotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX1RwPgotX1NUTFBfSU5MSU5FX0xPT1AgX0lucHV0SXRlciBfX2ZpbmQoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9UcCYgX192YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnB1dF9pdGVyYXRvcl90YWcgJikgewotICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QgJiYgISgqX19maXJzdCA9PSBfX3ZhbCkpICsrX19maXJzdDsKLSAgcmV0dXJuIF9fZmlyc3Q7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfUHJlZGljYXRlPgotX1NUTFBfSU5MSU5FX0xPT1AgX0lucHV0SXRlciBfX2ZpbmRfaWYoX0lucHV0SXRlciBfX2ZpcnN0LCBfU1RMUF9NUFdfRVhUUkFfQ09OU1QgX0lucHV0SXRlciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHJlZGljYXRlIF9fcHJlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0X2l0ZXJhdG9yX3RhZyAmKSB7Ci0gIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCAmJiAhX19wcmVkKCpfX2ZpcnN0KSkKLSAgICArK19fZmlyc3Q7Ci0gIHJldHVybiBfX2ZpcnN0OwotfQotCi1fU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKLQotdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9QcmVkaWNhdGU+Ci1fSW5wdXRJdGVyIGZpbmRfaWYoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICBfUHJlZGljYXRlIF9fcHJlZCkgewotICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKLSAgcmV0dXJuIF9TVExQX1BSSVYgX19maW5kX2lmKF9fZmlyc3QsIF9fbGFzdCwgX19wcmVkLCBfU1RMUF9JVEVSQVRPUl9DQVRFR09SWShfX2ZpcnN0LCBfSW5wdXRJdGVyKSk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfVHA+Ci1fSW5wdXRJdGVyIGZpbmQoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwgY29uc3QgX1RwJiBfX3ZhbCkgewotICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKLSAgcmV0dXJuIF9TVExQX1BSSVYgX19maW5kKF9fZmlyc3QsIF9fbGFzdCwgX192YWwsIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9fZmlyc3QsIF9JbnB1dEl0ZXIpKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcjEsIGNsYXNzIF9Gb3J3YXJkSXRlcjIsIGNsYXNzIF9CaW5hcnlQcmVkPgotX0ZvcndhcmRJdGVyMSBzZWFyY2goX0ZvcndhcmRJdGVyMSBfX2ZpcnN0MSwgX0ZvcndhcmRJdGVyMSBfX2xhc3QxLAotICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyMiBfX2ZpcnN0MiwgX0ZvcndhcmRJdGVyMiBfX2xhc3QyLAotICAgICAgICAgICAgICAgICAgICAgX0JpbmFyeVByZWQgIF9fcHJlZCkgewotICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdDEsIF9fbGFzdDEpKQotICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdDIsIF9fbGFzdDIpKQotICAvLyBUZXN0IGZvciBlbXB0eSByYW5nZXMKLSAgaWYgKF9fZmlyc3QxID09IF9fbGFzdDEgfHwgX19maXJzdDIgPT0gX19sYXN0MikKLSAgICByZXR1cm4gX19maXJzdDE7Ci0KLSAgLy8gVGVzdCBmb3IgYSBwYXR0ZXJuIG9mIGxlbmd0aCAxLgotICBfRm9yd2FyZEl0ZXIyIF9fcDEoX19maXJzdDIpOwotCi0gIGlmICggKytfX3AxID09IF9fbGFzdDIgKSB7Ci0gICAgd2hpbGUgKF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgIV9fcHJlZCgqX19maXJzdDEsICpfX2ZpcnN0MikpIHsKLSAgICAgICsrX19maXJzdDE7Ci0gICAgfQotICAgIHJldHVybiBfX2ZpcnN0MTsKLSAgfQotCi0gIC8vIEdlbmVyYWwgY2FzZS4KLQotICBmb3IgKCA7IDsgKSB7IC8vIF9fZmlyc3QxICE9IF9fbGFzdDEgd2lsbCBiZSBjaGVja2VkIGJlbG93Ci0gICAgd2hpbGUgKF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgIV9fcHJlZCgqX19maXJzdDEsICpfX2ZpcnN0MikpIHsKLSAgICAgICsrX19maXJzdDE7Ci0gICAgfQotICAgIGlmIChfX2ZpcnN0MSA9PSBfX2xhc3QxKSB7Ci0gICAgICByZXR1cm4gX19sYXN0MTsKLSAgICB9Ci0gICAgX0ZvcndhcmRJdGVyMiBfX3AgPSBfX3AxOwotICAgIF9Gb3J3YXJkSXRlcjEgX19jdXJyZW50ID0gX19maXJzdDE7Ci0gICAgaWYgKCsrX19jdXJyZW50ID09IF9fbGFzdDEpIHJldHVybiBfX2xhc3QxOwotCi0gICAgd2hpbGUgKF9fcHJlZCgqX19jdXJyZW50LCAqX19wKSkgewotICAgICAgaWYgKCsrX19wID09IF9fbGFzdDIpCi0gICAgICAgIHJldHVybiBfX2ZpcnN0MTsKLSAgICAgIGlmICgrK19fY3VycmVudCA9PSBfX2xhc3QxKQotICAgICAgICByZXR1cm4gX19sYXN0MTsKLSAgICB9Ci0KLSAgICArK19fZmlyc3QxOwotICB9Ci0gIHJldHVybiBfX2ZpcnN0MTsKLX0KLQotX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQotCi0vLyBmaW5kX2ZpcnN0X29mLCB3aXRoIGFuZCB3aXRob3V0IGFuIGV4cGxpY2l0bHkgc3VwcGxpZWQgY29tcGFyaXNvbiBmdW5jdGlvbi4KLXRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9CaW5hcnlQcmVkaWNhdGU+Ci1fSW5wdXRJdGVyIF9fZmluZF9maXJzdF9vZihfSW5wdXRJdGVyIF9fZmlyc3QxLCBfSW5wdXRJdGVyIF9fbGFzdDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXIgX19maXJzdDIsIF9Gb3J3YXJkSXRlciBfX2xhc3QyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JpbmFyeVByZWRpY2F0ZSBfX2NvbXApIHsKLSAgZm9yICggOyBfX2ZpcnN0MSAhPSBfX2xhc3QxOyArK19fZmlyc3QxKSB7Ci0gICAgZm9yIChfRm9yd2FyZEl0ZXIgX19pdGVyID0gX19maXJzdDI7IF9faXRlciAhPSBfX2xhc3QyOyArK19faXRlcikgewotICAgICAgaWYgKF9fY29tcCgqX19maXJzdDEsICpfX2l0ZXIpKSB7Ci0gICAgICAgIHJldHVybiBfX2ZpcnN0MTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIF9fbGFzdDE7Ci19Ci0KLS8vIGZpbmRfZW5kLCB3aXRoIGFuZCB3aXRob3V0IGFuIGV4cGxpY2l0bHkgc3VwcGxpZWQgY29tcGFyaXNvbiBmdW5jdGlvbi4KLS8vIFNlYXJjaCBbZmlyc3QyLCBsYXN0MikgYXMgYSBzdWJzZXF1ZW5jZSBpbiBbZmlyc3QxLCBsYXN0MSksIGFuZCByZXR1cm4KLS8vIHRoZSAqbGFzdCogcG9zc2libGUgbWF0Y2guICBOb3RlIHRoYXQgZmluZF9lbmQgZm9yIGJpZGlyZWN0aW9uYWwgaXRlcmF0b3JzCi0vLyBpcyBtdWNoIGZhc3RlciB0aGFuIGZvciBmb3J3YXJkIGl0ZXJhdG9ycy4KLQotLy8gZmluZF9lbmQgZm9yIGZvcndhcmQgaXRlcmF0b3JzLgotdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcjEsIGNsYXNzIF9Gb3J3YXJkSXRlcjIsCi0gIGNsYXNzIF9CaW5hcnlQcmVkaWNhdGU+Ci1fRm9yd2FyZEl0ZXIxIF9fZmluZF9lbmQoX0ZvcndhcmRJdGVyMSBfX2ZpcnN0MSwgX0ZvcndhcmRJdGVyMSBfX2xhc3QxLAotICAgICAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlcjIgX19maXJzdDIsIF9Gb3J3YXJkSXRlcjIgX19sYXN0MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3J3YXJkX2l0ZXJhdG9yX3RhZyAmLCBjb25zdCBmb3J3YXJkX2l0ZXJhdG9yX3RhZyAmLAotICAgICAgICAgICAgICAgICAgICAgICAgIF9CaW5hcnlQcmVkaWNhdGUgX19jb21wKSB7Ci0gIGlmIChfX2ZpcnN0MiA9PSBfX2xhc3QyKQotICAgIHJldHVybiBfX2xhc3QxOwotICBlbHNlIHsKLSAgICBfRm9yd2FyZEl0ZXIxIF9fcmVzdWx0ID0gX19sYXN0MTsKLSAgICBmb3IgKDs7KSB7Ci0gICAgICBfRm9yd2FyZEl0ZXIxIF9fbmV3X3Jlc3VsdCA9IHNlYXJjaChfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIsIF9fbGFzdDIsIF9fY29tcCk7Ci0gICAgICBpZiAoX19uZXdfcmVzdWx0ID09IF9fbGFzdDEpCi0gICAgICAgIHJldHVybiBfX3Jlc3VsdDsKLSAgICAgIGVsc2UgewotICAgICAgICBfX3Jlc3VsdCA9IF9fbmV3X3Jlc3VsdDsKLSAgICAgICAgX19maXJzdDEgPSBfX25ld19yZXN1bHQ7Ci0gICAgICAgICsrX19maXJzdDE7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLV9TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQotCi0vLyBmaW5kX2VuZCBmb3IgYmlkaXJlY3Rpb25hbCBpdGVyYXRvcnMuICBSZXF1aXJlcyBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uLgotI2lmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pCi0KLSMgIGlmbmRlZiBfU1RMUF9JTlRFUk5BTF9JVEVSQVRPUl9ICi1fU1RMUF9FTkRfTkFNRVNQQUNFCi0jICAgIGluY2x1ZGUgPHN0bC9faXRlcmF0b3IuaD4KLV9TVExQX0JFR0lOX05BTUVTUEFDRQotIyAgZW5kaWYgLypfU1RMUF9JTlRFUk5BTF9JVEVSQVRPUl9IKi8KLQotX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyMSwgY2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyMiwKLSAgICAgICAgICBjbGFzcyBfQmluYXJ5UHJlZGljYXRlPgotX0JpZGlyZWN0aW9uYWxJdGVyMQotX19maW5kX2VuZChfQmlkaXJlY3Rpb25hbEl0ZXIxIF9fZmlyc3QxLCBfQmlkaXJlY3Rpb25hbEl0ZXIxIF9fbGFzdDEsCi0gICAgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlcjIgX19maXJzdDIsIF9CaWRpcmVjdGlvbmFsSXRlcjIgX19sYXN0MiwKLSAgICAgICAgICAgY29uc3QgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgJiwgY29uc3QgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgJiwKLSAgICAgICAgICAgX0JpbmFyeVByZWRpY2F0ZSBfX2NvbXApIHsKLSAgdHlwZWRlZiByZXZlcnNlX2l0ZXJhdG9yPF9CaWRpcmVjdGlvbmFsSXRlcjE+IF9SZXZJdGVyMTsKLSAgdHlwZWRlZiByZXZlcnNlX2l0ZXJhdG9yPF9CaWRpcmVjdGlvbmFsSXRlcjI+IF9SZXZJdGVyMjsKLQotICBfUmV2SXRlcjEgX19ybGFzdDEoX19maXJzdDEpOwotICBfUmV2SXRlcjIgX19ybGFzdDIoX19maXJzdDIpOwotICBfUmV2SXRlcjEgX19ycmVzdWx0ID0gc2VhcmNoKF9SZXZJdGVyMShfX2xhc3QxKSwgX19ybGFzdDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1Jldkl0ZXIyKF9fbGFzdDIpLCBfX3JsYXN0MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2NvbXApOwotCi0gIGlmIChfX3JyZXN1bHQgPT0gX19ybGFzdDEpCi0gICAgcmV0dXJuIF9fbGFzdDE7Ci0gIGVsc2UgewotICAgIF9CaWRpcmVjdGlvbmFsSXRlcjEgX19yZXN1bHQgPSBfX3JyZXN1bHQuYmFzZSgpOwotICAgIGFkdmFuY2UoX19yZXN1bHQsIC1kaXN0YW5jZShfX2ZpcnN0MiwgX19sYXN0MikpOwotICAgIHJldHVybiBfX3Jlc3VsdDsKLSAgfQotfQotCi1fU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKLSNlbmRpZiAvKiBfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OICovCi0KLXRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIxLCBjbGFzcyBfRm9yd2FyZEl0ZXIyLAotICAgICAgICAgIGNsYXNzIF9CaW5hcnlQcmVkaWNhdGU+Ci1fRm9yd2FyZEl0ZXIxCi1maW5kX2VuZChfRm9yd2FyZEl0ZXIxIF9fZmlyc3QxLCBfRm9yd2FyZEl0ZXIxIF9fbGFzdDEsCi0gICAgICAgICBfRm9yd2FyZEl0ZXIyIF9fZmlyc3QyLCBfRm9yd2FyZEl0ZXIyIF9fbGFzdDIsCi0gICAgICAgICBfQmluYXJ5UHJlZGljYXRlIF9fY29tcCkgewotICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdDEsIF9fbGFzdDEpKQotICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdDIsIF9fbGFzdDIpKQotICByZXR1cm4gX1NUTFBfUFJJViBfX2ZpbmRfZW5kKF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0MiwgX19sYXN0MiwKLSNpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9fZmlyc3QxLCBfRm9yd2FyZEl0ZXIxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9JVEVSQVRPUl9DQVRFR09SWShfX2ZpcnN0MiwgX0ZvcndhcmRJdGVyMiksCi0jZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcndhcmRfaXRlcmF0b3JfdGFnKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yd2FyZF9pdGVyYXRvcl90YWcoKSwKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fY29tcCk7Ci19Ci0KLV9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKLQotdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZTEsIGNsYXNzIF9Db21wYXJlMiwgY2xhc3MgX0Rpc3RhbmNlPgotX0ZvcndhcmRJdGVyIF9fbG93ZXJfYm91bmQoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsIGNvbnN0IF9UcCYgX192YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBfQ29tcGFyZTEgX19jb21wMSwgX0NvbXBhcmUyIF9fY29tcDIsIF9EaXN0YW5jZSopIHsKLSAgX0Rpc3RhbmNlIF9fbGVuID0gZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KTsKLSAgX0Rpc3RhbmNlIF9faGFsZjsKLSAgX0ZvcndhcmRJdGVyIF9fbWlkZGxlOwotCi0gIHdoaWxlIChfX2xlbiA+IDApIHsKLSAgICBfX2hhbGYgPSBfX2xlbiA+PiAxOwotICAgIF9fbWlkZGxlID0gX19maXJzdDsKLSAgICBhZHZhbmNlKF9fbWlkZGxlLCBfX2hhbGYpOwotICAgIGlmIChfX2NvbXAxKCpfX21pZGRsZSwgX192YWwpKSB7Ci0gICAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghX19jb21wMihfX3ZhbCwgKl9fbWlkZGxlKSwgX1N0bE1zZ19JTlZBTElEX1NUUklDVF9XRUFLX1BSRURJQ0FURSkKLSAgICAgIF9fZmlyc3QgPSBfX21pZGRsZTsKLSAgICAgICsrX19maXJzdDsKLSAgICAgIF9fbGVuID0gX19sZW4gLSBfX2hhbGYgLSAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgICBfX2xlbiA9IF9faGFsZjsKLSAgfQotICByZXR1cm4gX19maXJzdDsKLX0KLQotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi0KLV9TVExQX0VORF9OQU1FU1BBQ0UKLQotI2VuZGlmIC8qIF9TVExQX0FMR09CQVNFX0MgKi8KLQotLy8gTG9jYWwgVmFyaWFibGVzOgotLy8gbW9kZTpDKysKLS8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9fYWxnb2Jhc2UuaCBiL3N0bC9fYWxnb2Jhc2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg2NDIyMy4uMDAwMDAwMAotLS0gYS9zdGwvX2FsZ29iYXNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NzAgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTQKLSAqIEhld2xldHQtUGFja2FyZCBDb21wYW55Ci0gKgotICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKLSAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NwotICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogQm9yaXMgRm9taXRjaGV2Ci0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICovCi0KLS8qIE5PVEU6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIFNUTCBoZWFkZXJzLgotICogICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4KLSAqLwotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0FMR09CQVNFX0gKLSNkZWZpbmUgX1NUTFBfSU5URVJOQUxfQUxHT0JBU0VfSAotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NTVERERUYKLSMgIGluY2x1ZGUgPHN0bC9fY3N0ZGRlZi5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1NUUklORwotIyAgaW5jbHVkZSA8c3RsL19jc3RyaW5nLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBfU1RMUF9DTElNSVRTCi0jICBpbmNsdWRlIDxjbGltaXRzPgotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1NURExJQgotIyAgaW5jbHVkZSA8c3RsL19jc3RkbGliLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9QQUlSX0gKLSMgIGluY2x1ZGUgPHN0bC9fcGFpci5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfSVRFUkFUT1JfQkFTRV9ICi0jICBpbmNsdWRlIDxzdGwvX2l0ZXJhdG9yX2Jhc2UuaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX1RZUEVfVFJBSVRTX0gKLSMgIGluY2x1ZGUgPHN0bC90eXBlX3RyYWl0cy5oPgotI2VuZGlmCi0KLV9TVExQX0JFR0lOX05BTUVTUEFDRQotCi0jaWYgZGVmaW5lZChfU1RMUF9VU0VfUEFSVElBTF9TUEVDX1dPUktBUk9VTkQpICYmICFkZWZpbmVkKF9TVExQX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUikKLV9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgdm9pZCBfX3N3YXBfYXV4KF9UcCYgX19hLCBfVHAmIF9fYiwgY29uc3QgX190cnVlX3R5cGUmIC8qU3dhcEltcGxlbWVudGVkKi8pIHsKLSAgX19hLnN3YXAoX19iKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWlubGluZSB2b2lkIF9fc3dhcF9hdXgoX1RwJiBfX2EsIF9UcCYgX19iLCBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qU3dhcEltcGxlbWVudGVkKi8pIHsKLSAgX1RwIF9fdG1wID0gX19hOwotICBfX2EgPSBfX2I7Ci0gIF9fYiA9IF9fdG1wOwotfQotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi0jZW5kaWYgLyogX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EICovCi0KLS8vIHN3YXAgYW5kIGl0ZXJfc3dhcAotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWlubGluZSB2b2lkIHN3YXAoX1RwJiBfX2EsIF9UcCYgX19iKSB7Ci0jaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKSAmJiAhZGVmaW5lZCAoX1NUTFBfRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSKQotIyAgaWYgIWRlZmluZWQoX19CT1JMQU5EQ19fKQotICB0eXBlZGVmIHR5cGVuYW1lIF9Td2FwSW1wbGVtZW50ZWQ8X1RwPjo6X1JldCBfSW1wbGVtZW50ZWQ7Ci0jICBlbHNlCi0gIGVudW0geyBfSXMgPSBfU3dhcEltcGxlbWVudGVkPF9UcD46Ol9JcyB9OwotICB0eXBlZGVmIHR5cGVuYW1lIF9fYm9vbDJ0eXBlPF9Jcz46Ol9SZXQgX0ltcGxlbWVudGVkOwotIyAgZW5kaWYKLSAgX1NUTFBfUFJJViBfX3N3YXBfYXV4KF9fYSwgX19iLCBfSW1wbGVtZW50ZWQoKSk7Ci0jZWxzZQotICBfVHAgX190bXAgPSBfX2E7Ci0gIF9fYSA9IF9fYjsKLSAgX19iID0gX190bXA7Ci0jZW5kaWYgLyogX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EICovCi19Ci0KLV9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKLQotdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcjEsIGNsYXNzIF9Gb3J3YXJkSXRlcjIsIGNsYXNzIF9WYWx1ZT4KLWlubGluZSB2b2lkIF9faXRlcl9zd2FwX2F1eF9hdXgoX0ZvcndhcmRJdGVyMSYgX19pMSwgX0ZvcndhcmRJdGVyMiYgX19pMiwgX1ZhbHVlICopIHsKLSAgX1ZhbHVlIHRtcCA9ICpfX2kxOwotICAqX19pMSA9ICpfX2kyOwotICAqX19pMiA9IHRtcDsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcjEsIGNsYXNzIF9Gb3J3YXJkSXRlcjI+Ci1pbmxpbmUgdm9pZCBfX2l0ZXJfc3dhcF9hdXgoX0ZvcndhcmRJdGVyMSYgX19pMSwgX0ZvcndhcmRJdGVyMiYgX19pMiwgY29uc3QgX190cnVlX3R5cGUmIC8qT0tUb1N3YXAqLykgewotICBzd2FwKCpfX2kxLCAqX19pMik7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIxLCBjbGFzcyBfRm9yd2FyZEl0ZXIyPgotaW5saW5lIHZvaWQgX19pdGVyX3N3YXBfYXV4KF9Gb3J3YXJkSXRlcjEmIF9faTEsIF9Gb3J3YXJkSXRlcjImIF9faTIsIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypPS1RvU3dhcCovKSB7Ci0gIF9faXRlcl9zd2FwX2F1eF9hdXgoIF9faTEsIF9faTIsIF9TVExQX1ZBTFVFX1RZUEUoX19pMSxfRm9yd2FyZEl0ZXIxKSApOwotfQotCi1fU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKLQotdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcjEsIGNsYXNzIF9Gb3J3YXJkSXRlcjI+Ci1pbmxpbmUgdm9pZCBpdGVyX3N3YXAoX0ZvcndhcmRJdGVyMSBfX2kxLCBfRm9yd2FyZEl0ZXIyIF9faTIpIHsKLSAgLy8gc3dhcCgqX19pMSwgKl9faTIpOwotICBfU1RMUF9QUklWIF9faXRlcl9zd2FwX2F1eCggX19pMSwgX19pMiwgX0lzT0tUb1N3YXAoX1NUTFBfVkFMVUVfVFlQRShfX2kxLCBfRm9yd2FyZEl0ZXIxKSwgX1NUTFBfVkFMVUVfVFlQRShfX2kyLCBfRm9yd2FyZEl0ZXIyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX0lTX1JFRl9UWVBFX1JFQUxfUkVGKF9faTEsIF9Gb3J3YXJkSXRlcjEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfSVNfUkVGX1RZUEVfUkVBTF9SRUYoX19pMiwgX0ZvcndhcmRJdGVyMikpLl9BbnN3ZXIoKSk7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIG1pbiBhbmQgbWF4Ci0KLSNpZiAhZGVmaW5lZCAoX19CT1JMQU5EQ19fKSB8fCBkZWZpbmVkIChfU1RMUF9VU0VfT1dOX05BTUVTUEFDRSkKLSMgIGlmIChkZWZpbmVkIChfX0JPUkxBTkRDX18pICYmIChfX0JPUkxBTkRDX18gPCAweDU4MCkpICYmICFkZWZpbmVkIChfX1NURENfXykKLS8vSW4gbm90IEFOU0kgbW9kZSBCb3JsYW5kIGltcG9ydCBtaW4vbWF4IGluIGdsb2JhbCBuYW1lc3BhY2Ugd2hpY2ggY29uZmxpY3QKLS8vd2l0aCBTVExwb3J0IG1pbi9tYXggd2hlbiB1c2VyIGRvZXMgYSAndXNpbmcgbmFtZXNwYWNlIHN0ZCcgaW4gaXRzIGNvZGUKLS8vKHNlZSB0ZXN0L3VuaXQvYWxnX3Rlc3QuY3BwKS4gVG8gYXZvaWQgdGhpcyBjbGFzaCB3ZSBzaW1wbHkgaW1wb3J0IEJvcmxhbmQgbWluL21heAotLy9pbiBTVExwb3J0IG5hbWVzcGFjZS4KLXVzaW5nIF9TVExQX1ZFTkRPUl9TVEQ6Om1pbjsKLXVzaW5nIF9TVExQX1ZFTkRPUl9TVEQ6Om1heDsKLSMgIGVsc2UKLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgY29uc3QgX1RwJiAobWluKShjb25zdCBfVHAmIF9fYSwgY29uc3QgX1RwJiBfX2IpIHsgcmV0dXJuIF9fYiA8IF9fYSA/IF9fYiA6IF9fYTsgfQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWlubGluZSBjb25zdCBfVHAmIChtYXgpKGNvbnN0IF9UcCYgX19hLCBjb25zdCBfVHAmIF9fYikgeyAgcmV0dXJuICBfX2EgPCBfX2IgPyBfX2IgOiBfX2E7IH0KLSMgIGVuZGlmCi0jZW5kaWYKLQotIyBpZiBkZWZpbmVkIChfX0JPUkxBTkRDX18pICYmIGRlZmluZWQgKF9TVExQX1VTRV9PV05fTkFNRVNQQUNFKQotaW5saW5lIHVuc2lnbmVkIGxvbmcgKG1pbikgKHVuc2lnbmVkIGxvbmcgX19hLCB1bnNpZ25lZCBsb25nIF9fYikgeyByZXR1cm4gX19iIDwgX19hID8gX19iIDogX19hOyB9Ci1pbmxpbmUgdW5zaWduZWQgbG9uZyAobWF4KSAodW5zaWduZWQgbG9uZyBfX2EsIHVuc2lnbmVkIGxvbmcgX19iKSB7ICByZXR1cm4gIF9fYSA8IF9fYiA/IF9fYiA6IF9fYTsgfQotIyBlbmRpZgotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZT4KLWlubGluZSBjb25zdCBfVHAmIChtaW4pKGNvbnN0IF9UcCYgX19hLCBjb25zdCBfVHAmIF9fYiwgX0NvbXBhcmUgX19jb21wKSB7Ci0gIHJldHVybiBfX2NvbXAoX19iLCBfX2EpID8gX19iIDogX19hOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZT4KLWlubGluZSBjb25zdCBfVHAmIChtYXgpKGNvbnN0IF9UcCYgX19hLCBjb25zdCBfVHAmIF9fYiwgX0NvbXBhcmUgX19jb21wKSB7Ci0gIHJldHVybiBfX2NvbXAoX19hLCBfX2IpID8gX19iIDogX19hOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBjb3B5Ci0KLS8vIEFsbCBvZiB0aGVzZSBhdXhpbGlhcnkgZnVuY3Rpb25zIHNlcnZlIHR3byBwdXJwb3Nlcy4gICgxKSBSZXBsYWNlCi0vLyBjYWxscyB0byBjb3B5IHdpdGggbWVtbW92ZSB3aGVuZXZlciBwb3NzaWJsZS4gIChNZW1tb3ZlLCBub3QgbWVtY3B5LAotLy8gYmVjYXVzZSB0aGUgaW5wdXQgYW5kIG91dHB1dCByYW5nZXMgYXJlIHBlcm1pdHRlZCB0byBvdmVybGFwLikKLS8vICgyKSBJZiB3ZSdyZSB1c2luZyByYW5kb20gYWNjZXNzIGl0ZXJhdG9ycywgdGhlbiB3cml0ZSB0aGUgbG9vcCBhcwotLy8gYSBmb3IgbG9vcCB3aXRoIGFuIGV4cGxpY2l0IGNvdW50LgotCi1fU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCi0KLXRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfT3V0cHV0SXRlciwgY2xhc3MgX0Rpc3RhbmNlPgotaW5saW5lIF9PdXRwdXRJdGVyIF9fY29weShfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlciBfX3Jlc3VsdCwgY29uc3QgaW5wdXRfaXRlcmF0b3JfdGFnICYsIF9EaXN0YW5jZSopIHsKLSAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX3Jlc3VsdCwgKytfX2ZpcnN0KQotICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0OwotICByZXR1cm4gX19yZXN1bHQ7Ci19Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9OT05URU1QTF9CQVNFX01BVENIX0JVRykKLXRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfT3V0cHV0SXRlciwgY2xhc3MgX0Rpc3RhbmNlPgotaW5saW5lIF9PdXRwdXRJdGVyIF9fY29weShfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlciBfX3Jlc3VsdCwgY29uc3QgZm9yd2FyZF9pdGVyYXRvcl90YWcgJiwgX0Rpc3RhbmNlKiApIHsKLSAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX3Jlc3VsdCwgKytfX2ZpcnN0KQotICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0OwotICByZXR1cm4gX19yZXN1bHQ7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfT3V0cHV0SXRlciwgY2xhc3MgX0Rpc3RhbmNlPgotaW5saW5lIF9PdXRwdXRJdGVyIF9fY29weShfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlciBfX3Jlc3VsdCwgY29uc3QgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgJiwgX0Rpc3RhbmNlKiApIHsKLSAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX3Jlc3VsdCwgKytfX2ZpcnN0KQotICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0OwotICByZXR1cm4gX19yZXN1bHQ7Ci19Ci0jZW5kaWYKLQotdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBjbGFzcyBfT3V0cHV0SXRlciwgY2xhc3MgX0Rpc3RhbmNlPgotaW5saW5lIF9PdXRwdXRJdGVyCi1fX2NvcHkoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0LAotICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0LCBjb25zdCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyAmLCBfRGlzdGFuY2UqKSB7Ci0gIGZvciAoX0Rpc3RhbmNlIF9fbiA9IF9fbGFzdCAtIF9fZmlyc3Q7IF9fbiA+IDA7IC0tX19uKSB7Ci0gICAgKl9fcmVzdWx0ID0gKl9fZmlyc3Q7Ci0gICAgKytfX2ZpcnN0OwotICAgICsrX19yZXN1bHQ7Ci0gIH0KLSAgcmV0dXJuIF9fcmVzdWx0OwotfQotCi1pbmxpbmUgdm9pZCoKLV9fY29weV90cml2aWFsKGNvbnN0IHZvaWQqIF9fZmlyc3QsIGNvbnN0IHZvaWQqIF9fbGFzdCwgdm9pZCogX19yZXN1bHQpIHsKLSAgc2l6ZV90IF9fbiA9IChjb25zdCBjaGFyKilfX2xhc3QgLSAoY29uc3QgY2hhciopX19maXJzdDsKLSAgcmV0dXJuIF9fbiA/ICh2b2lkICopKChjaGFyKiltZW1tb3ZlKF9fcmVzdWx0LCBfX2ZpcnN0LCBfX24pICsgX19uKSA6IF9fcmVzdWx0OwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBjb3B5X2JhY2t3YXJkIGF1eGlsaWFyeSBmdW5jdGlvbnMKLQotdGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcjEsIGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcjIsCi0gICAgICAgICAgY2xhc3MgX0Rpc3RhbmNlPgotaW5saW5lIF9CaWRpcmVjdGlvbmFsSXRlcjIgX19jb3B5X2JhY2t3YXJkKF9CaWRpcmVjdGlvbmFsSXRlcjEgX19maXJzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIxIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIyIF9fcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnICYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0Rpc3RhbmNlKikgewotICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QpCi0gICAgKi0tX19yZXN1bHQgPSAqLS1fX2xhc3Q7Ci0gIHJldHVybiBfX3Jlc3VsdDsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXIsIGNsYXNzIF9EaXN0YW5jZT4KLWlubGluZSBfQmlkaXJlY3Rpb25hbEl0ZXIgX19jb3B5X2JhY2t3YXJkKF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIgX19yZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyAmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0Rpc3RhbmNlKikgewotICBmb3IgKF9EaXN0YW5jZSBfX24gPSBfX2xhc3QgLSBfX2ZpcnN0OyBfX24gPiAwOyAtLV9fbikKLSAgICAqLS1fX3Jlc3VsdCA9ICotLV9fbGFzdDsKLSAgcmV0dXJuIF9fcmVzdWx0OwotfQotCi1pbmxpbmUgdm9pZCoKLV9fY29weV90cml2aWFsX2JhY2t3YXJkKGNvbnN0IHZvaWQqIF9fZmlyc3QsIGNvbnN0IHZvaWQqIF9fbGFzdCwgdm9pZCogX19yZXN1bHQpIHsKLSAgY29uc3QgcHRyZGlmZl90IF9OdW0gPSAoY29uc3QgY2hhciopX19sYXN0IC0gKGNvbnN0IGNoYXIqKV9fZmlyc3Q7Ci0gIHJldHVybiAoX051bSA+IDApID8gbWVtbW92ZSgoY2hhciopX19yZXN1bHQgLSBfTnVtLCBfX2ZpcnN0LCBfTnVtKSA6IF9fcmVzdWx0IDsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9PdXRwdXRJdGVyPgotaW5saW5lIF9PdXRwdXRJdGVyIF9fY29weV9wdHJzKF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsIF9PdXRwdXRJdGVyIF9fcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypJc09LVG9NZW1DcHkqLykgewotICByZXR1cm4gX19jb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQsIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKCksIChwdHJkaWZmX3QqKTApOwotfQotdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9PdXRwdXRJdGVyPgotaW5saW5lIF9PdXRwdXRJdGVyIF9fY29weV9wdHJzKF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsIF9PdXRwdXRJdGVyIF9fcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKklzT0tUb01lbUNweSovKSB7Ci0gIC8vIHdlIGtub3cgdGhleSBhbGwgcG9pbnRlcnMsIHNvIHRoaXMgY2FzdCBpcyBPSwotICAvLyAgcmV0dXJuIChfT3V0cHV0SXRlcilfX2NvcHlfdHJpdmlhbCgmKCpfX2ZpcnN0KSwgJigqX19sYXN0KSwgJigqX19yZXN1bHQpKTsKLSAgcmV0dXJuIChfT3V0cHV0SXRlcilfX2NvcHlfdHJpdmlhbChfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0KTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9PdXRwdXRJdGVyPgotaW5saW5lIF9PdXRwdXRJdGVyIF9fY29weV9hdXgoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwgX091dHB1dEl0ZXIgX19yZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX3RydWVfdHlwZSYgLypCb3RoUHRyVHlwZSovKSB7Ci0gIHJldHVybiBfX2NvcHlfcHRycyhfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgX1VzZVRyaXZpYWxDb3B5KF9TVExQX1ZBTFVFX1RZUEUoX19maXJzdCwgX0lucHV0SXRlciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfVkFMVUVfVFlQRShfX3Jlc3VsdCwgX091dHB1dEl0ZXIpKS5fQW5zd2VyKCkpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX091dHB1dEl0ZXI+Ci1pbmxpbmUgX091dHB1dEl0ZXIgX19jb3B5X2F1eChfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LCBfT3V0cHV0SXRlciBfX3Jlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypCb3RoUHRyVHlwZSovKSB7Ci0gIHJldHVybiBfX2NvcHkoX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCwKLSAgICAgICAgICAgICAgICBfU1RMUF9JVEVSQVRPUl9DQVRFR09SWShfX2ZpcnN0LCBfSW5wdXRJdGVyKSwKLSAgICAgICAgICAgICAgICBfU1RMUF9ESVNUQU5DRV9UWVBFKF9fZmlyc3QsIF9JbnB1dEl0ZXIpKTsKLX0KLQotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi0KLXRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfT3V0cHV0SXRlcj4KLWlubGluZSBfT3V0cHV0SXRlciBjb3B5KF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsIF9PdXRwdXRJdGVyIF9fcmVzdWx0KSB7Ci0gIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQotICByZXR1cm4gX1NUTFBfUFJJViBfX2NvcHlfYXV4KF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQsIF9Cb3RoUHRyVHlwZTwgX0lucHV0SXRlciwgX091dHB1dEl0ZXI+OjpfQW5zd2VyKCkpOwotfQotCi1fU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCi0KLXRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfT3V0cHV0SXRlcj4KLWlubGluZSBfT3V0cHV0SXRlciBfX2NvcHlfYmFja3dhcmRfcHRycyhfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0LCBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qVHJpdmlhbEFzc2lnbm1lbnQqLykgewotICByZXR1cm4gX19jb3B5X2JhY2t3YXJkKF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQsIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9fZmlyc3QsIF9JbnB1dEl0ZXIpLCBfU1RMUF9ESVNUQU5DRV9UWVBFKF9fZmlyc3QsIF9JbnB1dEl0ZXIpKTsKLX0KLXRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfT3V0cHV0SXRlcj4KLWlubGluZSBfT3V0cHV0SXRlciBfX2NvcHlfYmFja3dhcmRfcHRycyhfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0LCBjb25zdCBfX3RydWVfdHlwZSYgLypUcml2aWFsQXNzaWdubWVudCovKSB7Ci0gIHJldHVybiAoX091dHB1dEl0ZXIpX19jb3B5X3RyaXZpYWxfYmFja3dhcmQoX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfT3V0cHV0SXRlcj4KLWlubGluZSBfT3V0cHV0SXRlciBfX2NvcHlfYmFja3dhcmRfYXV4KF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsIF9PdXRwdXRJdGVyIF9fcmVzdWx0LCBjb25zdCBfX2ZhbHNlX3R5cGUmKSB7Ci0gIHJldHVybiBfX2NvcHlfYmFja3dhcmQoX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCwgX1NUTFBfSVRFUkFUT1JfQ0FURUdPUlkoX19maXJzdCxfSW5wdXRJdGVyKSwgX1NUTFBfRElTVEFOQ0VfVFlQRShfX2ZpcnN0LCBfSW5wdXRJdGVyKSk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfT3V0cHV0SXRlcj4KLWlubGluZSBfT3V0cHV0SXRlciBfX2NvcHlfYmFja3dhcmRfYXV4KF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsIF9PdXRwdXRJdGVyIF9fcmVzdWx0LCBjb25zdCBfX3RydWVfdHlwZSYpIHsKLSAgcmV0dXJuIF9fY29weV9iYWNrd2FyZF9wdHJzKF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVXNlVHJpdmlhbENvcHkoX1NUTFBfVkFMVUVfVFlQRShfX2ZpcnN0LCBfSW5wdXRJdGVyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9WQUxVRV9UWVBFKF9fcmVzdWx0LCBfT3V0cHV0SXRlcikpLl9BbnN3ZXIoKSk7Ci19Ci0KLV9TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX091dHB1dEl0ZXI+Ci1pbmxpbmUgX091dHB1dEl0ZXIgY29weV9iYWNrd2FyZChfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LCBfT3V0cHV0SXRlciBfX3Jlc3VsdCkgewotICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKLSAgcmV0dXJuIF9TVExQX1BSSVYgX19jb3B5X2JhY2t3YXJkX2F1eChfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0LCBfQm90aFB0clR5cGU8IF9JbnB1dEl0ZXIsIF9PdXRwdXRJdGVyPjo6X0Fuc3dlcigpICk7Ci19Ci0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikgJiYgIWRlZmluZWQgKF9TVExQX1NJTVVMQVRFX1BBUlRJQUxfU1BFQ19GT1JfVFlQRV9UUkFJVFMpCi0jICBkZWZpbmUgX1NUTFBfREVDTEFSRV9DT1BZX1RSSVZJQUwoX1RwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLWlubGluZSBfVHAqIGNvcHkoY29uc3QgX1RwKiBfX2ZpcnN0LCBjb25zdCBfVHAqIF9fbGFzdCwgX1RwKiBfX3Jlc3VsdCkgICAgICAgICAgXAoteyByZXR1cm4gKF9UcCopX19jb3B5X3RyaXZpYWwoX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCk7IH0gICAgICAgICAgICAgICAgICAgICBcCi1pbmxpbmUgX1RwKiBjb3B5X2JhY2t3YXJkKGNvbnN0IF9UcCogX19maXJzdCwgY29uc3QgX1RwKiBfX2xhc3QsIF9UcCogX19yZXN1bHQpIFwKLXsgcmV0dXJuIChfVHAqKV9fY29weV90cml2aWFsX2JhY2t3YXJkKF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQpOyB9Ci0KLV9TVExQX0RFQ0xBUkVfQ09QWV9UUklWSUFMKGNoYXIpCi0jICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fU0lHTkVEX0JVSUxUSU5TKQotX1NUTFBfREVDTEFSRV9DT1BZX1RSSVZJQUwoc2lnbmVkIGNoYXIpCi0jICBlbmRpZgotX1NUTFBfREVDTEFSRV9DT1BZX1RSSVZJQUwodW5zaWduZWQgY2hhcikKLV9TVExQX0RFQ0xBUkVfQ09QWV9UUklWSUFMKHNob3J0KQotX1NUTFBfREVDTEFSRV9DT1BZX1RSSVZJQUwodW5zaWduZWQgc2hvcnQpCi1fU1RMUF9ERUNMQVJFX0NPUFlfVFJJVklBTChpbnQpCi1fU1RMUF9ERUNMQVJFX0NPUFlfVFJJVklBTCh1bnNpZ25lZCBpbnQpCi1fU1RMUF9ERUNMQVJFX0NPUFlfVFJJVklBTChsb25nKQotX1NUTFBfREVDTEFSRV9DT1BZX1RSSVZJQUwodW5zaWduZWQgbG9uZykKLSMgIGlmICFkZWZpbmVkKF9TVExQX05PX1dDSEFSX1QpICYmICFkZWZpbmVkIChfU1RMUF9XQ0hBUl9UX0lTX1VTSE9SVCkKLV9TVExQX0RFQ0xBUkVfQ09QWV9UUklWSUFMKHdjaGFyX3QpCi0jICBlbmRpZgotIyAgaWYgZGVmaW5lZCAoX1NUTFBfTE9OR19MT05HKQotX1NUTFBfREVDTEFSRV9DT1BZX1RSSVZJQUwoX1NUTFBfTE9OR19MT05HKQotX1NUTFBfREVDTEFSRV9DT1BZX1RSSVZJQUwodW5zaWduZWQgX1NUTFBfTE9OR19MT05HKQotIyAgZW5kaWYKLV9TVExQX0RFQ0xBUkVfQ09QWV9UUklWSUFMKGZsb2F0KQotX1NUTFBfREVDTEFSRV9DT1BZX1RSSVZJQUwoZG91YmxlKQotIyAgaWYgIWRlZmluZWQgKF9TVExQX05PX0xPTkdfRE9VQkxFKQotX1NUTFBfREVDTEFSRV9DT1BZX1RSSVZJQUwobG9uZyBkb3VibGUpCi0jICBlbmRpZgotIyAgdW5kZWYgX1NUTFBfREVDTEFSRV9DT1BZX1RSSVZJQUwKLSNlbmRpZiAvKiBfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OICovCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGNvcHlfbiAobm90IHBhcnQgb2YgdGhlIEMrKyBzdGFuZGFyZCkKLQotI2lmICFkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQotX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX1NpemUsIGNsYXNzIF9PdXRwdXRJdGVyPgotX1NUTFBfSU5MSU5FX0xPT1AgcGFpcjxfSW5wdXRJdGVyLCBfT3V0cHV0SXRlcj4KLV9fY29weV9uKF9JbnB1dEl0ZXIgX19maXJzdCwgX1NpemUgX19jb3VudCwKLSAgICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0LAotICAgICAgICAgY29uc3QgaW5wdXRfaXRlcmF0b3JfdGFnICYpIHsKLSAgZm9yICggOyBfX2NvdW50ID4gMDsgLS1fX2NvdW50KSB7Ci0gICAgKl9fcmVzdWx0ID0gKl9fZmlyc3Q7Ci0gICAgKytfX2ZpcnN0OwotICAgICsrX19yZXN1bHQ7Ci0gIH0KLSAgcmV0dXJuIHBhaXI8X0lucHV0SXRlciwgX091dHB1dEl0ZXI+KF9fZmlyc3QsIF9fcmVzdWx0KTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9SQUl0ZXIsIGNsYXNzIF9TaXplLCBjbGFzcyBfT3V0cHV0SXRlcj4KLWlubGluZSBwYWlyPF9SQUl0ZXIsIF9PdXRwdXRJdGVyPgotX19jb3B5X24oX1JBSXRlciBfX2ZpcnN0LCBfU2l6ZSBfX2NvdW50LAotICAgICAgICAgX091dHB1dEl0ZXIgX19yZXN1bHQsCi0gICAgICAgICBjb25zdCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyAmKSB7Ci0gIF9SQUl0ZXIgX19sYXN0ID0gX19maXJzdCArIF9fY291bnQ7Ci0gIHJldHVybiBwYWlyPF9SQUl0ZXIsIF9PdXRwdXRJdGVyPihfX2xhc3QsIGNvcHkoX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCkpOwotfQotCi1fU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKLQotdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9TaXplLCBjbGFzcyBfT3V0cHV0SXRlcj4KLWlubGluZSBwYWlyPF9JbnB1dEl0ZXIsIF9PdXRwdXRJdGVyPgotY29weV9uKF9JbnB1dEl0ZXIgX19maXJzdCwgX1NpemUgX19jb3VudCwgX091dHB1dEl0ZXIgX19yZXN1bHQpIHsKLSAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fZmlyc3QpCi0gIHJldHVybiBfU1RMUF9QUklWIF9fY29weV9uKF9fZmlyc3QsIF9fY291bnQsIF9fcmVzdWx0LCBfU1RMUF9JVEVSQVRPUl9DQVRFR09SWShfX2ZpcnN0LCBfSW5wdXRJdGVyKSk7Ci19Ci0jZW5kaWYKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gZmlsbCBhbmQgZmlsbF9uCi10ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfVHA+Ci1fU1RMUF9JTkxJTkVfTE9PUAotdm9pZCBmaWxsKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LCBjb25zdCBfVHAmIF9fdmFsKSB7Ci0gIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQotICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCi0gICAgKl9fZmlyc3QgPSBfX3ZhbDsKLX0KLQotX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQotCi10ZW1wbGF0ZSA8Y2xhc3MgX091dHB1dEl0ZXIsIGNsYXNzIF9TaXplLCBjbGFzcyBfVHA+Ci1fU1RMUF9JTkxJTkVfTE9PUAotX091dHB1dEl0ZXIgX19maWxsX24oX091dHB1dEl0ZXIgX19maXJzdCwgX1NpemUgX19uLCBjb25zdCBfVHAmIF9fdmFsKSB7Ci0gIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2ZpcnN0KQotICBmb3IgKCA7IF9fbiA+IDA7IC0tX19uLCArK19fZmlyc3QpCi0gICAgKl9fZmlyc3QgPSBfX3ZhbDsKLSAgcmV0dXJuIF9fZmlyc3Q7Ci19Ci0KLV9TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQotCi10ZW1wbGF0ZSA8Y2xhc3MgX091dHB1dEl0ZXIsIGNsYXNzIF9TaXplLCBjbGFzcyBfVHA+Ci1fU1RMUF9JTkxJTkVfTE9PUAotdm9pZCBmaWxsX24oX091dHB1dEl0ZXIgX19maXJzdCwgX1NpemUgX19uLCBjb25zdCBfVHAmIF9fdmFsKSB7Ci0gIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2ZpcnN0KQotICBfU1RMUF9QUklWIF9fZmlsbF9uKF9fZmlyc3QsIF9fbiwgX192YWwpOwotfQotCi0vLyBTcGVjaWFsaXphdGlvbjogZm9yIG9uZS1ieXRlIHR5cGVzIHdlIGNhbiB1c2UgbWVtc2V0LgotaW5saW5lIHZvaWQgZmlsbCh1bnNpZ25lZCBjaGFyKiBfX2ZpcnN0LCB1bnNpZ25lZCBjaGFyKiBfX2xhc3QsCi0gICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXImIF9fdmFsKSB7Ci0gIHVuc2lnbmVkIGNoYXIgX190bXAgPSBfX3ZhbDsKLSAgbWVtc2V0KF9fZmlyc3QsIF9fdG1wLCBfX2xhc3QgLSBfX2ZpcnN0KTsKLX0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fU0lHTkVEX0JVSUxUSU5TKQotaW5saW5lIHZvaWQgZmlsbChzaWduZWQgY2hhciogX19maXJzdCwgc2lnbmVkIGNoYXIqIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgY29uc3Qgc2lnbmVkIGNoYXImIF9fdmFsKSB7Ci0gIHNpZ25lZCBjaGFyIF9fdG1wID0gX192YWw7Ci0gIG1lbXNldChfX2ZpcnN0LCBfX1NUQVRJQ19DQVNUKHVuc2lnbmVkIGNoYXIsX190bXApLCBfX2xhc3QgLSBfX2ZpcnN0KTsKLX0KLSNlbmRpZgotaW5saW5lIHZvaWQgZmlsbChjaGFyKiBfX2ZpcnN0LCBjaGFyKiBfX2xhc3QsIGNvbnN0IGNoYXImIF9fdmFsKSB7Ci0gIGNoYXIgX190bXAgPSBfX3ZhbDsKLSAgbWVtc2V0KF9fZmlyc3QsIF9fU1RBVElDX0NBU1QodW5zaWduZWQgY2hhcixfX3RtcCksIF9fbGFzdCAtIF9fZmlyc3QpOwotfQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSKQotX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1NpemU+Ci1pbmxpbmUgdW5zaWduZWQgY2hhciogX19maWxsX24odW5zaWduZWQgY2hhciogX19maXJzdCwgX1NpemUgX19uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyJiBfX3ZhbCkgewotICBmaWxsKF9fZmlyc3QsIF9fZmlyc3QgKyBfX24sIF9fdmFsKTsKLSAgcmV0dXJuIF9fZmlyc3QgKyBfX247Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfU2l6ZT4KLWlubGluZSBzaWduZWQgY2hhciogX19maWxsX24oY2hhciogX19maXJzdCwgX1NpemUgX19uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2lnbmVkIGNoYXImIF9fdmFsKSB7Ci0gIGZpbGwoX19maXJzdCwgX19maXJzdCArIF9fbiwgX192YWwpOwotICByZXR1cm4gX19maXJzdCArIF9fbjsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9TaXplPgotaW5saW5lIGNoYXIqIF9fZmlsbF9uKGNoYXIqIF9fZmlyc3QsIF9TaXplIF9fbiwgY29uc3QgY2hhciYgX192YWwpIHsKLSAgZmlsbChfX2ZpcnN0LCBfX2ZpcnN0ICsgX19uLCBfX3ZhbCk7Ci0gIHJldHVybiBfX2ZpcnN0ICsgX19uOwotfQotCi1fU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKLSNlbmRpZiAvKiBfU1RMUF9GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIgKi8KLQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBlcXVhbCBhbmQgbWlzbWF0Y2gKLQotdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMj4KLV9TVExQX0lOTElORV9MT09QCi1wYWlyPF9JbnB1dEl0ZXIxLCBfSW5wdXRJdGVyMj4gbWlzbWF0Y2goX0lucHV0SXRlcjEgX19maXJzdDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjEgX19sYXN0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyMiBfX2ZpcnN0MikgewotICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19maXJzdDIpCi0gIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0MSwgX19sYXN0MSkpCi0gIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxICYmICpfX2ZpcnN0MSA9PSAqX19maXJzdDIpIHsKLSAgICArK19fZmlyc3QxOwotICAgICsrX19maXJzdDI7Ci0gIH0KLSAgcmV0dXJuIHBhaXI8X0lucHV0SXRlcjEsIF9JbnB1dEl0ZXIyPihfX2ZpcnN0MSwgX19maXJzdDIpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNsYXNzIF9JbnB1dEl0ZXIyLCBjbGFzcyBfQmluYXJ5UHJlZGljYXRlPgotX1NUTFBfSU5MSU5FX0xPT1AKLXBhaXI8X0lucHV0SXRlcjEsIF9JbnB1dEl0ZXIyPiBtaXNtYXRjaChfSW5wdXRJdGVyMSBfX2ZpcnN0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyMSBfX2xhc3QxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CaW5hcnlQcmVkaWNhdGUgX19iaW5hcnlfcHJlZCkgewotICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19maXJzdDIpCi0gIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0MSwgX19sYXN0MSkpCi0gIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxICYmIF9fYmluYXJ5X3ByZWQoKl9fZmlyc3QxLCAqX19maXJzdDIpKSB7Ci0gICAgKytfX2ZpcnN0MTsKLSAgICArK19fZmlyc3QyOwotICB9Ci0gIHJldHVybiBwYWlyPF9JbnB1dEl0ZXIxLCBfSW5wdXRJdGVyMj4oX19maXJzdDEsIF9fZmlyc3QyKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMj4KLV9TVExQX0lOTElORV9MT09QCi1ib29sIGVxdWFsKF9JbnB1dEl0ZXIxIF9fZmlyc3QxLCBfSW5wdXRJdGVyMSBfX2xhc3QxLAotICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIpIHsKLSAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fZmlyc3QxKSBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19sYXN0MSkgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2ZpcnN0MikKLSAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QxLCBfX2xhc3QxKSkKLSAgZm9yICggOyBfX2ZpcnN0MSAhPSBfX2xhc3QxOyArK19fZmlyc3QxLCArK19fZmlyc3QyKQotICAgIGlmICghKCpfX2ZpcnN0MSA9PSAqX19maXJzdDIpKQotICAgICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMiwgY2xhc3MgX0JpbmFyeVByZWRpY2F0ZT4KLV9TVExQX0lOTElORV9MT09QCi1ib29sIGVxdWFsKF9JbnB1dEl0ZXIxIF9fZmlyc3QxLCBfSW5wdXRJdGVyMSBfX2xhc3QxLAotICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIsIF9CaW5hcnlQcmVkaWNhdGUgX19iaW5hcnlfcHJlZCkgewotICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19maXJzdDIpCi0gIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0MSwgX19sYXN0MSkpCi0gIGZvciAoIDsgX19maXJzdDEgIT0gX19sYXN0MTsgKytfX2ZpcnN0MSwgKytfX2ZpcnN0MikKLSAgICBpZiAoIV9fYmluYXJ5X3ByZWQoKl9fZmlyc3QxLCAqX19maXJzdDIpKQotICAgICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUgYW5kIGxleGljb2dyYXBoaWNhbF9jb21wYXJlXzN3YXkuCi0vLyAodGhlIGxhdHRlciBpcyBub3QgcGFydCBvZiB0aGUgQysrIHN0YW5kYXJkLikKLQotdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMj4KLWJvb2wgbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIxIF9fbGFzdDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyLCBfSW5wdXRJdGVyMiBfX2xhc3QyKTsKLQotdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMiwgY2xhc3MgX0NvbXBhcmU+Ci1ib29sIGxleGljb2dyYXBoaWNhbF9jb21wYXJlKF9JbnB1dEl0ZXIxIF9fZmlyc3QxLCBfSW5wdXRJdGVyMSBfX2xhc3QxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyMiBfX2ZpcnN0MiwgX0lucHV0SXRlcjIgX19sYXN0MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NvbXBhcmUgX19jb21wKTsKLQotaW5saW5lIGJvb2wKLWxleGljb2dyYXBoaWNhbF9jb21wYXJlKGNvbnN0IHVuc2lnbmVkIGNoYXIqIF9fZmlyc3QxLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogX19sYXN0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIF9fZmlyc3QyLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogX19sYXN0MikgewotICBjb25zdCBzaXplX3QgX19sZW4xID0gX19sYXN0MSAtIF9fZmlyc3QxOwotICBjb25zdCBzaXplX3QgX19sZW4yID0gX19sYXN0MiAtIF9fZmlyc3QyOwotICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdDEsIF9fbGFzdDEpKQotICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdDIsIF9fbGFzdDIpKQotCi0gIGNvbnN0IGludCBfX3Jlc3VsdCA9IG1lbWNtcChfX2ZpcnN0MSwgX19maXJzdDIsIChtaW4pIChfX2xlbjEsIF9fbGVuMikpOwotICByZXR1cm4gX19yZXN1bHQgIT0gMCA/IChfX3Jlc3VsdCA8IDApIDogKF9fbGVuMSA8IF9fbGVuMik7Ci19Ci0KLQotI2lmICEoQ0hBUl9NQVggPT0gU0NIQVJfTUFYKQotaW5saW5lIGJvb2wgbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoY29uc3QgY2hhciogX19maXJzdDEsIGNvbnN0IGNoYXIqIF9fbGFzdDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBfX2ZpcnN0MiwgY29uc3QgY2hhciogX19sYXN0MikgewotICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdDEsIF9fbGFzdDEpKQotICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdDIsIF9fbGFzdDIpKQotCi0gIHJldHVybiBsZXhpY29ncmFwaGljYWxfY29tcGFyZSgoY29uc3QgdW5zaWduZWQgY2hhciopIF9fZmlyc3QxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVuc2lnbmVkIGNoYXIqKSBfX2xhc3QxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVuc2lnbmVkIGNoYXIqKSBfX2ZpcnN0MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1bnNpZ25lZCBjaGFyKikgX19sYXN0Mik7Ci19Ci0jZW5kaWYgLyogQ0hBUl9NQVggPT0gU0NIQVJfTUFYICovCi0KLV9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKLQotdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMj4KLWludCBfX2xleGljb2dyYXBoaWNhbF9jb21wYXJlXzN3YXkoX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIxIF9fbGFzdDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyLCBfSW5wdXRJdGVyMiBfX2xhc3QyKTsKLQotaW5saW5lIGludAotX19sZXhpY29ncmFwaGljYWxfY29tcGFyZV8zd2F5KGNvbnN0IHVuc2lnbmVkIGNoYXIqIF9fZmlyc3QxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIF9fbGFzdDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogX19maXJzdDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogX19sYXN0MikgewotICBjb25zdCBwdHJkaWZmX3QgX19sZW4xID0gX19sYXN0MSAtIF9fZmlyc3QxOwotICBjb25zdCBwdHJkaWZmX3QgX19sZW4yID0gX19sYXN0MiAtIF9fZmlyc3QyOwotICBjb25zdCBpbnQgX19yZXN1bHQgPSBtZW1jbXAoX19maXJzdDEsIF9fZmlyc3QyLCAobWluKSAoX19sZW4xLCBfX2xlbjIpKTsKLSAgcmV0dXJuIF9fcmVzdWx0ICE9IDAgPyBfX3Jlc3VsdAotICAgICAgICAgICAgICAgICAgICAgICA6IChfX2xlbjEgPT0gX19sZW4yID8gMCA6IChfX2xlbjEgPCBfX2xlbjIgPyAtMSA6IDEpKTsKLX0KLQotCi0jaWYgIShDSEFSX01BWCA9PSBTQ0hBUl9NQVgpCi1pbmxpbmUgaW50Ci1fX2xleGljb2dyYXBoaWNhbF9jb21wYXJlXzN3YXkoY29uc3QgY2hhciogX19maXJzdDEsIGNvbnN0IGNoYXIqIF9fbGFzdDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogX19maXJzdDIsIGNvbnN0IGNoYXIqIF9fbGFzdDIpIHsKLSAgcmV0dXJuIF9fbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmVfM3dheSgoY29uc3QgdW5zaWduZWQgY2hhciopIF9fZmlyc3QxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1bnNpZ25lZCBjaGFyKikgX19sYXN0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdW5zaWduZWQgY2hhciopIF9fZmlyc3QyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1bnNpZ25lZCBjaGFyKikgX19sYXN0Mik7Ci19Ci0jZW5kaWYKLQotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKLXRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0SXRlcjI+Ci1pbnQgbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmVfM3dheShfSW5wdXRJdGVyMSBfX2ZpcnN0MSwgX0lucHV0SXRlcjEgX19sYXN0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyLCBfSW5wdXRJdGVyMiBfX2xhc3QyKTsKLQotI2VuZGlmIC8qIEVYVEVOU0lPTlMgKi8KLQotLy8gY291bnQKLXRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfVHA+Ci1fU1RMUF9JTkxJTkVfTE9PUCBfU1RMUF9ESUZGRVJFTkNFX1RZUEUoX0lucHV0SXRlcikKLWNvdW50KF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsIGNvbnN0IF9UcCYgX192YWwpIHsKLSAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCi0gIF9TVExQX0RJRkZFUkVOQ0VfVFlQRShfSW5wdXRJdGVyKSBfX24gPSAwOwotICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCi0gICAgaWYgKCpfX2ZpcnN0ID09IF9fdmFsKQotICAgICAgKytfX247Ci0gIHJldHVybiBfX247Ci19Ci0KLS8vIGZpbmQgYW5kIGZpbmRfaWYuIE5vdGUgZmluZCBtYXkgYmUgZXhwcmVzc2VkIGluIHRlcm1zIG9mIGZpbmRfaWYgaWYgYXBwcm9wcmlhdGUgYmluZGVyIHdhcyBhdmFpbGFibGUuCi10ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX1RwPgotX0lucHV0SXRlciBmaW5kKF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsIGNvbnN0IF9UcCYgX192YWwpOwotCi10ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX1ByZWRpY2F0ZT4KLV9JbnB1dEl0ZXIgZmluZF9pZihfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LCBfUHJlZGljYXRlIF9fcHJlZCk7Ci0KLS8vIHNlYXJjaC4KLXRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIxLCBjbGFzcyBfRm9yd2FyZEl0ZXIyLCBjbGFzcyBfQmluYXJ5UHJlZD4KLV9Gb3J3YXJkSXRlcjEgc2VhcmNoKF9Gb3J3YXJkSXRlcjEgX19maXJzdDEsIF9Gb3J3YXJkSXRlcjEgX19sYXN0MSwKLSAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlcjIgX19maXJzdDIsIF9Gb3J3YXJkSXRlcjIgX19sYXN0MiwgX0JpbmFyeVByZWQgIF9fcHJlZGljYXRlKTsKLQotX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQotCi0vLyBmaW5kX2ZpcnN0X29mCi10ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfQmluYXJ5UHJlZGljYXRlPgotX0lucHV0SXRlciBfX2ZpbmRfZmlyc3Rfb2YoX0lucHV0SXRlciBfX2ZpcnN0MSwgX0lucHV0SXRlciBfX2xhc3QxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyIF9fZmlyc3QyLCBfRm9yd2FyZEl0ZXIgX19sYXN0MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CaW5hcnlQcmVkaWNhdGUgX19jb21wKTsKLQotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi0KLXRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIxLCBjbGFzcyBfRm9yd2FyZEl0ZXIyLAotICAgICAgICAgIGNsYXNzIF9CaW5hcnlQcmVkaWNhdGU+Ci1fRm9yd2FyZEl0ZXIxCi1maW5kX2VuZChfRm9yd2FyZEl0ZXIxIF9fZmlyc3QxLCBfRm9yd2FyZEl0ZXIxIF9fbGFzdDEsCi0gICAgICAgICBfRm9yd2FyZEl0ZXIyIF9fZmlyc3QyLCBfRm9yd2FyZEl0ZXIyIF9fbGFzdDIsCi0gICAgICAgICBfQmluYXJ5UHJlZGljYXRlIF9fY29tcCk7Ci0KLS8vIHJlcGxhY2UKLXRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9UcD4KLV9TVExQX0lOTElORV9MT09QIHZvaWQKLXJlcGxhY2UoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsCi0gICAgICAgIGNvbnN0IF9UcCYgX19vbGRfdmFsdWUsIGNvbnN0IF9UcCYgX19uZXdfdmFsdWUpIHsKLSAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCi0gIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKLSAgICBpZiAoKl9fZmlyc3QgPT0gX19vbGRfdmFsdWUpCi0gICAgICAqX19maXJzdCA9IF9fbmV3X3ZhbHVlOwotfQotCi1fU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCi0KLXRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmUxLCBjbGFzcyBfQ29tcGFyZTIsIGNsYXNzIF9EaXN0YW5jZT4KLV9Gb3J3YXJkSXRlciBfX2xvd2VyX2JvdW5kKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1RwJiBfX3ZhbCwgX0NvbXBhcmUxIF9fY29tcDEsIF9Db21wYXJlMiBfX2NvbXAyLCBfRGlzdGFuY2UqKTsKLQotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi0KLV9TVExQX0VORF9OQU1FU1BBQ0UKLQotI2lmICFkZWZpbmVkIChfU1RMUF9MSU5LX1RJTUVfSU5TVEFOVElBVElPTikKLSMgIGluY2x1ZGUgPHN0bC9fYWxnb2Jhc2UuYz4KLSNlbmRpZgotCi0jZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfQUxHT0JBU0VfSCAqLwotCi0vLyBMb2NhbCBWYXJpYWJsZXM6Ci0vLyBtb2RlOkMrKwotLy8gRW5kOgotCmRpZmYgLS1naXQgYS9zdGwvX2FsbG9jLmMgYi9zdGwvX2FsbG9jLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNjY1NmMuLjAwMDAwMDAKLS0tIGEvc3RsL19hbGxvYy5jCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NwotICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk3Ci0gKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5Ci0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLSNpZm5kZWYgX1NUTFBfQUxMT0NfQwotI2RlZmluZSBfU1RMUF9BTExPQ19DCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQUxMT0NfSAotIyAgaW5jbHVkZSA8c3RsL19hbGxvYy5oPgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfX1dBVENPTUNfXykKLSMgIHByYWdtYSB3YXJuaW5nIDEzIDkKLSMgIHByYWdtYSB3YXJuaW5nIDM2NyA5Ci0jICBwcmFnbWEgd2FybmluZyAzNjggOQotI2VuZGlmCi0KLV9TVExQX0JFR0lOX05BTUVTUEFDRQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jPgotdm9pZCAqIF9TVExQX0NBTEwgX19kZWJ1Z19hbGxvYzxfQWxsb2M+OjphbGxvY2F0ZShzaXplX3QgX19uKSB7Ci0gIHNpemVfdCBfX3RvdGFsX2V4dHJhID0gX19leHRyYV9iZWZvcmVfY2h1bmsoKSArIF9fZXh0cmFfYWZ0ZXJfY2h1bmsoKTsKLSAgc2l6ZV90IF9fcmVhbF9uID0gX19uICsgX190b3RhbF9leHRyYTsKLSAgaWYgKF9fcmVhbF9uIDwgX19uKSB7Ci0gICAgLy9JdCBtZWFucyB0aGF0IHdlIHJvbGxlZCBvbiBzaXplX3QsIF9fbiBtdXN0IGJlIHZlcnkgbGFyZ2UsIGxldHMgaG9wZQotICAgIC8vdGhhdCBhbGxvY2F0aW5nIGl0IHdpbGwgcmFpc2VkIGEgYmFkX2FsbG9jIGV4Y2VwdGlvbjoKLSAgICBfX3JlYWxfbiA9IF9fbiArIChfX3RvdGFsX2V4dHJhIC0gX19yZWFsX24gLSAxKTsKLSAgfQotICBfX2FsbG9jX2hlYWRlciAqX19yZXN1bHQgPSAoX19hbGxvY19oZWFkZXIgKilfX2FsbG9jYXRvcl90eXBlOjphbGxvY2F0ZShfX3JlYWxfbik7Ci0gIG1lbXNldCgoY2hhciopX19yZXN1bHQsIF9fc2hyZWRfYnl0ZSwgX19yZWFsX24gKiBzaXplb2YodmFsdWVfdHlwZSkpOwotICBfX3Jlc3VsdC0+X19tYWdpYyA9IF9fbWFnaWM7Ci0gIF9fcmVzdWx0LT5fX3R5cGVfc2l6ZSA9IHNpemVvZih2YWx1ZV90eXBlKTsKLSAgX19yZXN1bHQtPl9NX3NpemUgPSAoX1NUTFBfVUlOVDMyX1QpX19uOwotICByZXR1cm4gKChjaGFyKilfX3Jlc3VsdCkgKyAobG9uZylfX2V4dHJhX2JlZm9yZTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9BbGxvYz4KLXZvaWQgIF9TVExQX0NBTEwKLV9fZGVidWdfYWxsb2M8X0FsbG9jPjo6ZGVhbGxvY2F0ZSh2b2lkICpfX3AsIHNpemVfdCBfX24pIHsKLSAgX19hbGxvY19oZWFkZXIgKiBfX3JlYWxfcCA9IChfX2FsbG9jX2hlYWRlciopKChjaGFyICopX19wIC0obG9uZylfX2V4dHJhX2JlZm9yZSk7Ci0gIC8vIGNoZWNrIGludGVncml0eQotICBfU1RMUF9WRVJCT1NFX0FTU0VSVChfX3JlYWxfcC0+X19tYWdpYyAhPSBfX2RlbGV0ZWRfbWFnaWMsIF9TdGxNc2dfREJBX0RFTEVURURfVFdJQ0UpCi0gIF9TVExQX1ZFUkJPU0VfQVNTRVJUKF9fcmVhbF9wLT5fX21hZ2ljID09IF9fbWFnaWMsIF9TdGxNc2dfREJBX05FVkVSX0FMTE9DQVRFRCkKLSAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoX19yZWFsX3AtPl9fdHlwZV9zaXplID09IDEsX1N0bE1zZ19EQkFfVFlQRV9NSVNNQVRDSCkKLSAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoX19yZWFsX3AtPl9NX3NpemUgPT0gX19uLCBfU3RsTXNnX0RCQV9TSVpFX01JU01BVENIKQotICAvLyBjaGVjayBwYWRzIG9uIGJvdGggc2lkZXMKLSAgdW5zaWduZWQgY2hhciogX190bXA7Ci0gIGZvciAoX190bXAgPSAodW5zaWduZWQgY2hhciopKF9fcmVhbF9wICsgMSk7IF9fdG1wIDwgKHVuc2lnbmVkIGNoYXIqKV9fcDsgKytfX3RtcCkgewotICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCpfX3RtcCA9PSBfX3NocmVkX2J5dGUsIF9TdGxNc2dfREJBX1VOREVSUlVOKQotICB9Ci0KLSAgc2l6ZV90IF9fcmVhbF9uID0gX19uICsgX19leHRyYV9iZWZvcmVfY2h1bmsoKSArIF9fZXh0cmFfYWZ0ZXJfY2h1bmsoKTsKLQotICBmb3IgKF9fdG1wPSAoKHVuc2lnbmVkIGNoYXIqKV9fcCkgKyBfX24gKiBzaXplb2YodmFsdWVfdHlwZSk7Ci0gICAgICAgX190bXAgPCAoKHVuc2lnbmVkIGNoYXIqKV9fcmVhbF9wKSArIF9fcmVhbF9uIDsgKytfX3RtcCkgewotICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCpfX3RtcCA9PSBfX3NocmVkX2J5dGUsIF9TdGxNc2dfREJBX09WRVJSVU4pCi0gIH0KLQotICAvLyB0aGF0IG1heSBiZSB1bmZvcnR1bmF0ZSwganVzdCBpbiBjYXNlCi0gIF9fcmVhbF9wLT5fX21hZ2ljID0gX19kZWxldGVkX21hZ2ljOwotICBtZW1zZXQoKGNoYXIqKV9fcCwgX19zaHJlZF9ieXRlLCBfX24gKiBzaXplb2YodmFsdWVfdHlwZSkpOwotICBfX2FsbG9jYXRvcl90eXBlOjpkZWFsbG9jYXRlKF9fcmVhbF9wLCBfX3JlYWxfbik7Ci19Ci0KLV9TVExQX0VORF9OQU1FU1BBQ0UKLQotI2VuZGlmIC8qICBfU1RMUF9BTExPQ19DICovCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX2FsbG9jLmggYi9zdGwvX2FsbG9jLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4YTg3NWQuLjAwMDAwMDAKLS0tIGEvc3RsL19hbGxvYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjc1ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKLSAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NwotICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogQm9yaXMgRm9taXRjaGV2Ci0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICovCi0KLS8qIE5PVEU6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIFNUTCBoZWFkZXJzLgotICogICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4KLSAqLwotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0FMTE9DX0gKLSNkZWZpbmUgX1NUTFBfSU5URVJOQUxfQUxMT0NfSAotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NTVERERUYKLSMgIGluY2x1ZGUgPHN0bC9fY3N0ZGRlZi5oPgotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfREVCVUdfSCkgJiYgKGRlZmluZWQoX1NUTFBfREVCVUcpIHx8IGRlZmluZWQoX1NUTFBfQVNTRVJUSU9OUykgfHwgZGVmaW5lZChfU1RMUF9ERUJVR19BTExPQykpCi0jICBpbmNsdWRlIDxzdGwvZGVidWcvX2RlYnVnLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DU1RETElCCi0jICBpbmNsdWRlIDxzdGwvX2NzdGRsaWIuaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NTVFJJTkcKLSMgIGluY2x1ZGUgPHN0bC9fY3N0cmluZy5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQUxHT0JBU0VfSAotIyAgaW5jbHVkZSA8c3RsL19hbGdvYmFzZS5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX19USFJPV19CQURfQUxMT0MKLSMgIGlmICFkZWZpbmVkKF9TVExQX1VTRV9FWENFUFRJT05TKQotIyAgICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1NURElPCi0jICAgICAgaW5jbHVkZSA8c3RsL19jc3RkaW8uaD4KLSMgICAgZW5kaWYKLSMgICAgZGVmaW5lIF9fVEhST1dfQkFEX0FMTE9DIHB1dHMoIm91dCBvZiBtZW1vcnlcbiIpOyBleGl0KDEpCi0jICBlbHNlCi0jICAgIGRlZmluZSBfX1RIUk9XX0JBRF9BTExPQyB0aHJvdyBfU1RMUF9TVEQ6OmJhZF9hbGxvYygpCi0jICBlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfTkVXX0hFQURFUgotIyAgaW5jbHVkZSA8c3RsL19uZXcuaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NPTlNUUlVDVF9ICi0jICBpbmNsdWRlIDxzdGwvX2NvbnN0cnVjdC5oPgotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZCAoX19BTExPQykKLSMgIGRlZmluZSBfX0FMTE9DIF9fc2dpX2FsbG9jCi0jZW5kaWYKLQotX1NUTFBfQkVHSU5fTkFNRVNQQUNFCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUkFXX1NHSV9BTExPQ0FUT1JTKQotdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPiBzdHJ1Y3QgX19hbGxvY2F0b3I7Ci0jZW5kaWYKLQotLy8gTWFsbG9jLWJhc2VkIGFsbG9jYXRvci4gIFR5cGljYWxseSBzbG93ZXIgdGhhbiBkZWZhdWx0IGFsbG9jIGJlbG93LgotLy8gVHlwaWNhbGx5IHRocmVhZC1zYWZlIGFuZCBtb3JlIHN0b3JhZ2UgZWZmaWNpZW50LgotCi0jaWYgIWRlZmluZWQgKF9TVExQX1VTRV9OT19JT1NUUkVBTVMpCi10eXBlZGVmIHZvaWQgKCogX19vb21faGFuZGxlcl90eXBlKSgpOwotI2VuZGlmCi0KLWNsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIF9fbWFsbG9jX2FsbG9jIHsKLXB1YmxpYzoKLSAgLy8gdGhpcyBvbmUgaXMgbmVlZGVkIGZvciBwcm9wZXIgc2ltcGxlX2FsbG9jIHdyYXBwaW5nCi0gIHR5cGVkZWYgY2hhciB2YWx1ZV90eXBlOwotI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURV9DTEFTU0VTKSAmJiBkZWZpbmVkIChfU1RMUF9VU0VfUkFXX1NHSV9BTExPQ0FUT1JTKQotICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwMT4gc3RydWN0IHJlYmluZCB7Ci0gICAgdHlwZWRlZiBfX2FsbG9jYXRvcjxfVHAxLCBfX21hbGxvY19hbGxvYz4gb3RoZXI7Ci0gIH07Ci0jZW5kaWYKLSAgc3RhdGljIHZvaWQqIF9TVExQX0NBTEwgYWxsb2NhdGUoc2l6ZV90JiBfX24pCi0jaWYgIWRlZmluZWQgKF9TVExQX1VTRV9OT19JT1NUUkVBTVMpCi0gIDsKLSNlbHNlCi0gIHsKLSAgICB2b2lkICpfX3Jlc3VsdCA9IG1hbGxvYyhfX24pOwotIyAgaWYgZGVmaW5lZCAoX1NUTFBfTUFMTE9DX1VTQUJMRV9TSVpFKQotICAgIGlmIChfX3Jlc3VsdCAhPSAwKSB7Ci0gICAgICBfX24gPSBfU1RMUF9NQUxMT0NfVVNBQkxFX1NJWkUoX19yZXN1bHQpOwotICAgIH0KLSMgIGVuZGlmCi0gICAgaWYgKF9fcmVzdWx0ID09IDApIHsKLSAgICAgIF9fVEhST1dfQkFEX0FMTE9DOwotICAgIH0KLSAgICByZXR1cm4gX19yZXN1bHQ7Ci0gIH0KLSNlbmRpZgotCi0gIHN0YXRpYyB2b2lkIF9TVExQX0NBTEwgZGVhbGxvY2F0ZSh2b2lkKiBfX3AsIHNpemVfdCAvKiBfX24gKi8pIHsgZnJlZSgoY2hhciopX19wKTsgfQotI2lmICFkZWZpbmVkIChfU1RMUF9VU0VfTk9fSU9TVFJFQU1TKQotICBzdGF0aWMgX19vb21faGFuZGxlcl90eXBlIF9TVExQX0NBTEwgc2V0X21hbGxvY19oYW5kbGVyKF9fb29tX2hhbmRsZXJfdHlwZSBfX2YpOwotI2VuZGlmCi19OwotCi0vLyBOZXctYmFzZWQgYWxsb2NhdG9yLiAgVHlwaWNhbGx5IHNsb3dlciB0aGFuIGRlZmF1bHQgYWxsb2MgYmVsb3cuCi0vLyBUeXBpY2FsbHkgdGhyZWFkLXNhZmUgYW5kIG1vcmUgc3RvcmFnZSBlZmZpY2llbnQuCi1jbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBfX25ld19hbGxvYyB7Ci1wdWJsaWM6Ci0gIC8vIHRoaXMgb25lIGlzIG5lZWRlZCBmb3IgcHJvcGVyIHNpbXBsZV9hbGxvYyB3cmFwcGluZwotICB0eXBlZGVmIGNoYXIgdmFsdWVfdHlwZTsKLSNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVfQ0xBU1NFUykgJiYgZGVmaW5lZCAoX1NUTFBfVVNFX1JBV19TR0lfQUxMT0NBVE9SUykKLSAgdGVtcGxhdGUgPGNsYXNzIF9UcDE+IHN0cnVjdCByZWJpbmQgewotICAgIHR5cGVkZWYgX19hbGxvY2F0b3I8X1RwMSwgX19uZXdfYWxsb2MgPiBvdGhlcjsKLSAgfTsKLSNlbmRpZgotICBzdGF0aWMgdm9pZCogX1NUTFBfQ0FMTCBhbGxvY2F0ZShzaXplX3QgX19uKSB7IHJldHVybiBfX3N0bF9uZXcoX19uKTsgfQotICBzdGF0aWMgdm9pZCBfU1RMUF9DQUxMIGRlYWxsb2NhdGUodm9pZCogX19wLCBzaXplX3QpIHsgX19zdGxfZGVsZXRlKF9fcCk7IH0KLX07Ci0KLQotLy8gQWxsb2NhdG9yIGFkYXB0b3IgdG8gY2hlY2sgc2l6ZSBhcmd1bWVudHMgZm9yIGRlYnVnZ2luZy4KLS8vIFJlcG9ydHMgZXJyb3JzIHVzaW5nIGFzc2VydC4gIENoZWNraW5nIGNhbiBiZSBkaXNhYmxlZCB3aXRoCi0vLyBOREVCVUcsIGJ1dCBpdCdzIGZhciBiZXR0ZXIgdG8ganVzdCB1c2UgdGhlIHVuZGVybHlpbmcgYWxsb2NhdG9yCi0vLyBpbnN0ZWFkIHdoZW4gbm8gY2hlY2tpbmcgaXMgZGVzaXJlZC4KLS8vIFRoZXJlIGlzIHNvbWUgZXZpZGVuY2UgdGhhdCB0aGlzIGNhbiBjb25mdXNlIFB1cmlmeS4KLS8vIFRoaXMgYWRhcHRvciBjYW4gb25seSBiZSBhcHBsaWVkIHRvIHJhdyBhbGxvY2F0b3JzCi0KLXRlbXBsYXRlIDxjbGFzcyBfQWxsb2M+Ci1jbGFzcyBfX2RlYnVnX2FsbG9jIDogcHVibGljIF9BbGxvYyB7Ci1wdWJsaWM6Ci0gIHR5cGVkZWYgX0FsbG9jIF9fYWxsb2NhdG9yX3R5cGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7Ci1wcml2YXRlOgotICBzdHJ1Y3QgX19hbGxvY19oZWFkZXIgewotICAgIHNpemVfdCBfX21hZ2ljOiAxNjsKLSAgICBzaXplX3QgX190eXBlX3NpemU6MTY7Ci0gICAgX1NUTFBfVUlOVDMyX1QgX01fc2l6ZTsKLSAgfTsgLy8gdGhhdCBpcyA4IGJ5dGVzIGZvciBzdXJlCi0gIC8vIFN1bnBybyBDQyBoYXMgYnVnIG9uIGVudW1zLCBzbyBleHRyYV9iZWZvcmUvYWZ0ZXIgc2V0IGV4cGxpY2l0bHkKLSAgZW51bSB7IF9fcGFkID0gOCwgX19tYWdpYyA9IDB4ZGViYSwgX19kZWxldGVkX21hZ2ljID0gMHhkZWJkLAotICAgICAgICAgX19zaHJlZF9ieXRlID0gX1NUTFBfU0hSRURfQllURSB9OwotCi0gIGVudW0geyBfX2V4dHJhX2JlZm9yZSA9IDE2LCBfX2V4dHJhX2FmdGVyID0gOCB9OwotICAvLyBTaXplIG9mIHNwYWNlIHVzZWQgdG8gc3RvcmUgc2l6ZS4gIE5vdGUKLSAgLy8gdGhhdCB0aGlzIG11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvIHByZXNlcnZlCi0gIC8vIGFsaWdubWVudC4KLSAgc3RhdGljIHNpemVfdCBfU1RMUF9DQUxMIF9fZXh0cmFfYmVmb3JlX2NodW5rKCkgewotICAgIHJldHVybiAobG9uZylfX2V4dHJhX2JlZm9yZSAvIHNpemVvZih2YWx1ZV90eXBlKSArCi0gICAgICAoc2l6ZV90KSgobG9uZylfX2V4dHJhX2JlZm9yZSAlIHNpemVvZih2YWx1ZV90eXBlKSA+IDApOwotICB9Ci0gIHN0YXRpYyBzaXplX3QgX1NUTFBfQ0FMTCBfX2V4dHJhX2FmdGVyX2NodW5rKCkgewotICAgIHJldHVybiAobG9uZylfX2V4dHJhX2FmdGVyIC8gc2l6ZW9mKHZhbHVlX3R5cGUpICsKLSAgICAgIChzaXplX3QpKChsb25nKV9fZXh0cmFfYWZ0ZXIgJSBzaXplb2YodmFsdWVfdHlwZSkgPiAwKTsKLSAgfQotcHVibGljOgotI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURV9DTEFTU0VTKSAmJiBkZWZpbmVkIChfU1RMUF9VU0VfUkFXX1NHSV9BTExPQ0FUT1JTKQotICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwMT4gc3RydWN0IHJlYmluZCB7Ci0gICAgdHlwZWRlZiBfX2FsbG9jYXRvcjwgX1RwMSwgX19kZWJ1Z19hbGxvYzxfQWxsb2M+ID4gb3RoZXI7Ci0gIH07Ci0jZW5kaWYKLSAgX19kZWJ1Z19hbGxvYygpIHt9Ci0gIH5fX2RlYnVnX2FsbG9jKCkge30KLSAgc3RhdGljIHZvaWQqIF9TVExQX0NBTEwgYWxsb2NhdGUoc2l6ZV90KTsKLSAgc3RhdGljIHZvaWQgX1NUTFBfQ0FMTCBkZWFsbG9jYXRlKHZvaWQgKiwgc2l6ZV90KTsKLX07Ci0KLSMgIGlmIGRlZmluZWQgKF9fT1M0MDBfXykgfHwgZGVmaW5lZCAoX1dJTjY0KQotZW51bSB7X0FMSUdOID0gMTYsIF9BTElHTl9TSElGVCA9IDQsIF9NQVhfQllURVMgPSAyNTZ9OwotIyAgZWxzZQotZW51bSB7X0FMSUdOID0gOCwgX0FMSUdOX1NISUZUID0gMywgX01BWF9CWVRFUyA9IDEyOH07Ci0jICBlbmRpZiAvKiBfX09TNDAwX18gKi8KLQotI2lmICFkZWZpbmVkIChfU1RMUF9VU0VfTk9fSU9TVFJFQU1TKQotCi0jICBpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX1NJTVBMRV9OT0RFX0FMTE9DKQotLy8gRGVmYXVsdCBub2RlIGFsbG9jYXRvci4KLS8vIFdpdGggYSByZWFzb25hYmxlIGNvbXBpbGVyLCB0aGlzIHNob3VsZCBiZSByb3VnaGx5IGFzIGZhc3QgYXMgdGhlCi0vLyBvcmlnaW5hbCBTVEwgY2xhc3Mtc3BlY2lmaWMgYWxsb2NhdG9ycywgYnV0IHdpdGggbGVzcyBmcmFnbWVudGF0aW9uLgotLy8gRGVmaW5lIF9TVExQX1VTRV9TSU1QTEVfTk9ERV9BTExPQyB0byB1c2UgX19uZXdfYWxsb2MgaW5zdGVhZCwgd2hpY2gKLS8vIGNhbiBiZSBpbXBsZW1lbnRlZCB3aXRob3V0IG91dC1vZi1saW5lIGZ1bmN0aW9ucy4KLWNsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIF9fbm9kZV9hbGxvYyB7Ci0gIHN0YXRpYyB2b2lkICogX1NUTFBfQ0FMTCBfTV9hbGxvY2F0ZShzaXplX3QmIF9fbik7Ci0gIC8qIF9fcCBtYXkgbm90IGJlIDAgKi8KLSAgc3RhdGljIHZvaWQgX1NUTFBfQ0FMTCBfTV9kZWFsbG9jYXRlKHZvaWQgKl9fcCwgc2l6ZV90IF9fbik7Ci0KLXB1YmxpYzoKLSAgLy8gdGhpcyBvbmUgaXMgbmVlZGVkIGZvciBwcm9wZXIgc2ltcGxlX2FsbG9jIHdyYXBwaW5nCi0gIHR5cGVkZWYgY2hhciB2YWx1ZV90eXBlOwotIyAgaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFX0NMQVNTRVMpICYmIGRlZmluZWQgKF9TVExQX1VTRV9SQVdfU0dJX0FMTE9DQVRPUlMpCi0gIHRlbXBsYXRlIDxjbGFzcyBfVHAxPiBzdHJ1Y3QgcmViaW5kIHsKLSAgICB0eXBlZGVmIF9fYWxsb2NhdG9yPF9UcDEsIF9fbm9kZV9hbGxvYz4gb3RoZXI7Ci0gIH07Ci0jICBlbmRpZgotICAvKiBfX24gbXVzdCBiZSA+IDAgICAgICAqLwotICBzdGF0aWMgdm9pZCogX1NUTFBfQ0FMTCBhbGxvY2F0ZShzaXplX3QmIF9fbikKLSAgeyByZXR1cm4gKF9fbiA+IChzaXplX3QpX01BWF9CWVRFUykgPyBfX3N0bF9uZXcoX19uKSA6IF9NX2FsbG9jYXRlKF9fbik7IH0KLSAgLyogX19wIG1heSBub3QgYmUgMCAqLwotICBzdGF0aWMgdm9pZCBfU1RMUF9DQUxMIGRlYWxsb2NhdGUodm9pZCAqX19wLCBzaXplX3QgX19uKQotICB7IGlmIChfX24gPiAoc2l6ZV90KV9NQVhfQllURVMpIF9fc3RsX2RlbGV0ZShfX3ApOyBlbHNlIF9NX2RlYWxsb2NhdGUoX19wLCBfX24pOyB9Ci19OwotCi0jICAgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9URU1QTEFURV9FWFBPUlQpCi1fU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgX19kZWJ1Z19hbGxvYzxfX25vZGVfYWxsb2M+OwotIyAgICBlbmRpZgotCi0jICBlbHNlIC8qIF9TVExQX1VTRV9TSU1QTEVfTk9ERV9BTExPQyAqLwotLy8gVXNlIF9fbmV3X2FsbG9jIGluc3RlYWQgb2YgX19ub2RlX2FsbG9jLiBUaGlzIHByZXZlbnRzIHRoZSBuZWVkIGZvcgotLy8gb3V0LW9mLWxpbmUgX01fYWxsb2NhdGUgYW5kIF9NX2RlYWxsb2FjdGUgZnVuY3Rpb25zLgotdHlwZWRlZiBfX25ld19hbGxvYyBfX25vZGVfYWxsb2M7Ci0KLSMgIGVuZGlmIC8qIF9TVExQX1VTRV9TSU1QTEVfTk9ERV9BTExPQyAqLwotCi0jZW5kaWYgLyogX1NUTFBfVVNFX05PX0lPU1RSRUFNUyAqLwotCi0jaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCkKLV9TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBfX2RlYnVnX2FsbG9jPF9fbmV3X2FsbG9jPjsKLV9TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBfX2RlYnVnX2FsbG9jPF9fbWFsbG9jX2FsbG9jPjsKLSNlbmRpZgotCi0vKiBtYWNybyB0byBjb252ZXJ0IHRoZSBhbGxvY2F0b3IgZm9yIGluaXRpYWxpemF0aW9uCi0gKiBub3QgdXNpbmcgTUVNQkVSX1RFTVBMQVRFX0NMQVNTRVMgYXMgaXQgc2hvdWxkIHdvcmsgZ2l2ZW4gdGVtcGxhdGUgY29uc3RydWN0b3IgICovCi0jaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykgfHwgISBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQotLyogaWYgX1NUTFBfTk9fVEVNUExBVEVfQ09OVkVSU0lPTlMgaXMgc2V0LCB0aGUgbWVtYmVyIHRlbXBsYXRlIGNvbnN0cnVjdG9yIGlzCi0gKiBub3QgdXNlZCBpbXBsaWNpdGx5IHRvIGNvbnZlcnQgYWxsb2NhdG9yIHBhcmFtZXRlciwgc28gbGV0IHVzIGRvIGl0IGV4cGxpY2l0bHkgKi8KLSMgIGlmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURV9DTEFTU0VTKSAmJiBkZWZpbmVkIChfU1RMUF9OT19URU1QTEFURV9DT05WRVJTSU9OUykKLSMgICAgZGVmaW5lIF9TVExQX0NPTlZFUlRfQUxMT0NBVE9SKF9fYSwgX1RwKSBfX3N0bF9hbGxvY19jcmVhdGUoX19hLChfVHAqKTApCi0jICBlbHNlCi0jICAgIGRlZmluZSBfU1RMUF9DT05WRVJUX0FMTE9DQVRPUihfX2EsIF9UcCkgX19hCi0jICBlbmRpZgotLyogZWxzZSBjb252ZXJ0LCBidXQgb25seSBpZiBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIHdvcmtzLCBzaW5jZSBlbHNlCi0gKiBDb250YWluZXI6OmFsbG9jYXRvcl90eXBlIHdvbid0IGJlIGRpZmZlcmVudCAqLwotI2Vsc2UKLSMgIGRlZmluZSBfU1RMUF9DT05WRVJUX0FMTE9DQVRPUihfX2EsIF9UcCkgX19zdGxfYWxsb2NfY3JlYXRlKF9fYSwoX1RwKikwKQotI2VuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgfHwgIV9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04gKi8KLQotLy8gQW5vdGhlciBhbGxvY2F0b3IgYWRhcHRvcjogX0FsbG9jX3RyYWl0cy4gIFRoaXMgc2VydmVzIHR3bwotLy8gcHVycG9zZXMuICBGaXJzdCwgbWFrZSBpdCBwb3NzaWJsZSB0byB3cml0ZSBjb250YWluZXJzIHRoYXQgY2FuIHVzZQotLy8gZWl0aGVyIFNHSS1zdHlsZSBhbGxvY2F0b3JzIG9yIHN0YW5kYXJkLWNvbmZvcm1pbmcgYWxsb2NhdG9yLgotCi0vLyBUaGUgZnVsbHkgZ2VuZXJhbCB2ZXJzaW9uLgotdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KLXN0cnVjdCBfQWxsb2NfdHJhaXRzIHsKLSAgdHlwZWRlZiBfQWxsb2NhdG9yIF9PcmlnOwotI2lmICFkZWZpbmVkIChfU1RMUF9ET05UX1NVUFBPUlRfUkVCSU5EX01FTUJFUl9URU1QTEFURSkKLSAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2NhdG9yOjpfU1RMUF9URU1QTEFURSByZWJpbmQ8X1RwPiBfUmViaW5kX3R5cGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1JlYmluZF90eXBlOjpvdGhlciAgYWxsb2NhdG9yX3R5cGU7Ci0gIHN0YXRpYyBhbGxvY2F0b3JfdHlwZSBjcmVhdGVfYWxsb2NhdG9yKGNvbnN0IF9PcmlnJiBfX2EpCi0gIHsgcmV0dXJuIGFsbG9jYXRvcl90eXBlKF9TVExQX0NPTlZFUlRfQUxMT0NBVE9SKF9fYSwgX1RwKSk7IH0KLSNlbHNlCi0gIC8vIHRoaXMgaXMgbm90IGFjdHVhbGx5IHRydWUsIHVzZWQgb25seSB0byBwYXNzIHRoaXMgdHlwZSB0aHJvdWdoCi0gIC8vIHRvIGR5bmFtaWMgb3ZlcmxvYWQgc2VsZWN0aW9uIGluIF9TVExQX2FsbG9jX3Byb3h5IG1ldGhvZHMKLSAgdHlwZWRlZiBfQWxsb2NhdG9yIGFsbG9jYXRvcl90eXBlOwotI2VuZGlmIC8qICFfU1RMUF9ET05UX1NVUFBPUlRfUkVCSU5EX01FTUJFUl9URU1QTEFURSAqLwotfTsKLQotI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QRVJUSFJFQURfQUxMT0MpCi0KLV9TVExQX0VORF9OQU1FU1BBQ0UKLQotLy8gaW5jbHVkZSBhZGRpdGlvbmFsIGhlYWRlciBoZXJlCi0jICBpbmNsdWRlIDxzdGwvX3B0aHJlYWRfYWxsb2MuaD4KLQotX1NUTFBfQkVHSU5fTkFNRVNQQUNFCi0KLSMgIGlmIGRlZmluZWQgKF9TVExQX0RFQlVHX0FMTE9DKQotdHlwZWRlZiBfX2RlYnVnX2FsbG9jPF9fcHRocmVhZF9hbGxvYz4gX19zZ2lfYWxsb2M7Ci0jICBlbHNlCi10eXBlZGVmIF9fcHRocmVhZF9hbGxvYyBfX3NnaV9hbGxvYzsKLSMgIGVuZGlmIC8qIF9TVExQX0RFQlVHX0FMTE9DICovCi0KLXR5cGVkZWYgX19wdGhyZWFkX2FsbG9jIF9fc2luZ2xlX2NsaWVudF9hbGxvYzsKLXR5cGVkZWYgX19wdGhyZWFkX2FsbG9jIF9fbXVsdGl0aHJlYWRlZF9hbGxvYzsKLQotI2Vsc2UgLyogX1NUTFBfVVNFX1BFUlRIUkVBRF9BTExPQyAqLwotCi0jICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfTkVXQUxMT0MpCi0KLSMgICAgaWYgZGVmaW5lZCAoX1NUTFBfREVCVUdfQUxMT0MpCi10eXBlZGVmIF9fZGVidWdfYWxsb2M8X19uZXdfYWxsb2M+IF9fc2dpX2FsbG9jOwotIyAgICBlbHNlCi10eXBlZGVmIF9fbmV3X2FsbG9jIF9fc2dpX2FsbG9jOwotIyAgICBlbmRpZiAvKiBfU1RMUF9ERUJVR19BTExPQyAqLwotCi10eXBlZGVmIF9fbmV3X2FsbG9jIF9fc2luZ2xlX2NsaWVudF9hbGxvYzsKLXR5cGVkZWYgX19uZXdfYWxsb2MgX19tdWx0aXRocmVhZGVkX2FsbG9jOwotCi0jICBlbGlmIGRlZmluZWQgKF9TVExQX1VTRV9NQUxMT0MpCi0KLSMgICAgaWYgZGVmaW5lZCAoX1NUTFBfREVCVUdfQUxMT0MpCi10eXBlZGVmIF9fZGVidWdfYWxsb2M8X19tYWxsb2NfYWxsb2M+IF9fc2dpX2FsbG9jOwotIyAgICBlbHNlCi10eXBlZGVmIF9fbWFsbG9jX2FsbG9jIF9fc2dpX2FsbG9jOwotIyAgICBlbmRpZiAvKiBfU1RMUF9ERUJVR19BTExPQyAqLwotCi10eXBlZGVmIF9fbWFsbG9jX2FsbG9jIF9fc2luZ2xlX2NsaWVudF9hbGxvYzsKLXR5cGVkZWYgX19tYWxsb2NfYWxsb2MgX19tdWx0aXRocmVhZGVkX2FsbG9jOwotCi0jICBlbHNlCi0KLSMgICAgaWYgZGVmaW5lZCAoX1NUTFBfREVCVUdfQUxMT0MpCi10eXBlZGVmIF9fZGVidWdfYWxsb2M8X19ub2RlX2FsbG9jPiBfX3NnaV9hbGxvYzsKLSMgICAgZWxzZQotdHlwZWRlZiBfX25vZGVfYWxsb2MgX19zZ2lfYWxsb2M7Ci0jICAgIGVuZGlmCi0KLXR5cGVkZWYgX19ub2RlX2FsbG9jIF9fc2luZ2xlX2NsaWVudF9hbGxvYzsKLXR5cGVkZWYgX19ub2RlX2FsbG9jIF9fbXVsdGl0aHJlYWRlZF9hbGxvYzsKLQotIyAgZW5kaWYgLyogX1NUTFBfVVNFX05FV0FMTE9DICovCi0jZW5kaWYgLyogX1NUTFBfVVNFX1BFUlRIUkVBRF9BTExPQyAqLwotCi0vLyBUaGlzIGltcGxlbWVudHMgYWxsb2NhdG9ycyBhcyBzcGVjaWZpZWQgaW4gdGhlIEMrKyBzdGFuZGFyZC4KLS8vCi0vLyBOb3RlIHRoYXQgc3RhbmRhcmQtY29uZm9ybWluZyBhbGxvY2F0b3JzIHVzZSBtYW55IGxhbmd1YWdlIGZlYXR1cmVzCi0vLyB0aGF0IGFyZSBub3QgeWV0IHdpZGVseSBpbXBsZW1lbnRlZC4gIEluIHBhcnRpY3VsYXIsIHRoZXkgcmVseSBvbgotLy8gbWVtYmVyIHRlbXBsYXRlcywgcGFydGlhbCBzcGVjaWFsaXphdGlvbiwgcGFydGlhbCBvcmRlcmluZyBvZiBmdW5jdGlvbgotLy8gdGVtcGxhdGVzLCB0aGUgdHlwZW5hbWUga2V5d29yZCwgYW5kIHRoZSB1c2Ugb2YgdGhlIHRlbXBsYXRlIGtleXdvcmQKLS8vIHRvIHJlZmVyIHRvIGEgdGVtcGxhdGUgbWVtYmVyIG9mIGEgZGVwZW5kZW50IHR5cGUuCi0KLS8qCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotc3RydWN0IF9BbGxvY2F0b3JBdXggewotICB0eXBlZGVmIF9UcCogICAgICAgcG9pbnRlcjsKLSAgdHlwZWRlZiBjb25zdCBfVHAqIGNvbnN0X3BvaW50ZXI7Ci0gIHR5cGVkZWYgX1RwJiAgICAgICByZWZlcmVuY2U7Ci0gIHR5cGVkZWYgY29uc3QgX1RwJiBjb25zdF9yZWZlcmVuY2U7Ci0KLSAgcG9pbnRlciBhZGRyZXNzKHJlZmVyZW5jZSBfX3gpIGNvbnN0IHtyZXR1cm4gJl9feDt9Ci0gIGNvbnN0X3BvaW50ZXIgYWRkcmVzcyhjb25zdF9yZWZlcmVuY2UgX194KSBjb25zdCB7IHJldHVybiAmX194OyB9Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotc3RydWN0IF9BbGxvY2F0b3JBdXg8Y29uc3QgX1RwPiB7Ci0gIHR5cGVkZWYgX1RwKiAgICAgICBwb2ludGVyOwotICB0eXBlZGVmIGNvbnN0IF9UcCogY29uc3RfcG9pbnRlcjsKLSAgdHlwZWRlZiBfVHAmICAgICAgIHJlZmVyZW5jZTsKLSAgdHlwZWRlZiBjb25zdCBfVHAmIGNvbnN0X3JlZmVyZW5jZTsKLQotICBjb25zdF9wb2ludGVyIGFkZHJlc3MoY29uc3RfcmVmZXJlbmNlIF9feCkgY29uc3QgeyByZXR1cm4gJl9feDsgfQotfTsKLSovCi0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1jbGFzcyBhbGxvY2F0b3IgLy86IHB1YmxpYyBfQWxsb2NhdG9yQXV4PF9UcD4KLS8qIEEgc21hbGwgaGVscGVyIHN0cnVjdCB0byByZWNvZ25pemUgU1RMcG9ydCBhbGxvY2F0b3IgaW1wbGVtZW50YXRpb24KLSAqIGZyb20gYW55IHVzZXIgc3BlY2lhbGl6YXRpb24gb25lLgotICovCi0gICAgICAgICAgICAgICAgOiBwdWJsaWMgX19zdGxwb3J0X2NsYXNzPGFsbG9jYXRvcjxfVHA+ID4gewotcHVibGljOgotICB0eXBlZGVmIF9UcCAgICAgICAgdmFsdWVfdHlwZTsKLSAgdHlwZWRlZiBfVHAqICAgICAgIHBvaW50ZXI7Ci0gIHR5cGVkZWYgY29uc3QgX1RwKiBjb25zdF9wb2ludGVyOwotICB0eXBlZGVmIF9UcCYgICAgICAgcmVmZXJlbmNlOwotICB0eXBlZGVmIGNvbnN0IF9UcCYgY29uc3RfcmVmZXJlbmNlOwotICB0eXBlZGVmIHNpemVfdCAgICAgc2l6ZV90eXBlOwotICB0eXBlZGVmIHB0cmRpZmZfdCAgZGlmZmVyZW5jZV90eXBlOwotI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURV9DTEFTU0VTKQotICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwMT4gc3RydWN0IHJlYmluZCB7Ci0gICAgdHlwZWRlZiBhbGxvY2F0b3I8X1RwMT4gb3RoZXI7Ci0gIH07Ci0jZW5kaWYKLSAgYWxsb2NhdG9yKCkgX1NUTFBfTk9USFJPVyB7fQotI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCi0gIHRlbXBsYXRlIDxjbGFzcyBfVHAxPiBhbGxvY2F0b3IoY29uc3QgYWxsb2NhdG9yPF9UcDE+JikgX1NUTFBfTk9USFJPVyB7fQotI2VuZGlmCi0gIGFsbG9jYXRvcihjb25zdCBhbGxvY2F0b3I8X1RwPiYpIF9TVExQX05PVEhST1cge30KLSAgYWxsb2NhdG9yKF9fbW92ZV9zb3VyY2U8YWxsb2NhdG9yPF9UcD4gPiBzcmMpIF9TVExQX05PVEhST1cge30KLSAgfmFsbG9jYXRvcigpIF9TVExQX05PVEhST1cge30KLSAgcG9pbnRlciBhZGRyZXNzKHJlZmVyZW5jZSBfX3gpIGNvbnN0IHtyZXR1cm4gJl9feDt9Ci0gIGNvbnN0X3BvaW50ZXIgYWRkcmVzcyhjb25zdF9yZWZlcmVuY2UgX194KSBjb25zdCB7IHJldHVybiAmX194OyB9Ci0gIC8vIF9fbiBpcyBwZXJtaXR0ZWQgdG8gYmUgMC4gIFRoZSBDKysgc3RhbmRhcmQgc2F5cyBub3RoaW5nIGFib3V0IHdoYXQgdGhlIHJldHVybiB2YWx1ZSBpcyB3aGVuIF9fbiA9PSAwLgotICBfVHAqIGFsbG9jYXRlKHNpemVfdHlwZSBfX24sIGNvbnN0IHZvaWQqID0gMCkgewotICAgIGlmIChfX24gPiBtYXhfc2l6ZSgpKSB7Ci0gICAgICBfX1RIUk9XX0JBRF9BTExPQzsKLSAgICB9Ci0gICAgaWYgKF9fbiAhPSAwKSB7Ci0gICAgICBzaXplX3R5cGUgX19idWZfc2l6ZSA9IF9fbiAqIHNpemVvZih2YWx1ZV90eXBlKTsKLSAgICAgIF9UcCogX19yZXQgPSBfX1JFSU5URVJQUkVUX0NBU1QoX1RwKiwgX19zZ2lfYWxsb2M6OmFsbG9jYXRlKF9fYnVmX3NpemUpKTsKLSNpZiBkZWZpbmVkIChfU1RMUF9ERUJVR19VTklOSVRJQUxJWkVEKSAmJiAhZGVmaW5lZCAoX1NUTFBfREVCVUdfQUxMT0MpCi0gICAgICBpZiAoX19yZXQgIT0gMCkgewotICAgICAgICBtZW1zZXQoKGNoYXIqKV9fcmV0LCBfU1RMUF9TSFJFRF9CWVRFLCBfX2J1Zl9zaXplKTsKLSAgICAgIH0KLSNlbmRpZgotICAgICAgcmV0dXJuIF9fcmV0OwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZXR1cm4gMDsKLSAgfQotICAvLyBfX3AgaXMgcGVybWl0dGVkIHRvIGJlIGEgbnVsbCBwb2ludGVyLCBvbmx5IGlmIG49PTAuCi0gIHZvaWQgZGVhbGxvY2F0ZShwb2ludGVyIF9fcCwgc2l6ZV90eXBlIF9fbikgewotICAgIF9TVExQX0FTU0VSVCggKF9fcCA9PSAwKSA9PSAoX19uID09IDApICkKLSAgICBpZiAoX19wICE9IDApIHsKLSNpZiBkZWZpbmVkIChfU1RMUF9ERUJVR19VTklOSVRJQUxJWkVEKSAmJiAhZGVmaW5lZCAoX1NUTFBfREVCVUdfQUxMT0MpCi0gICAgICBtZW1zZXQoKGNoYXIqKV9fcCwgX1NUTFBfU0hSRURfQllURSwgX19uICogc2l6ZW9mKHZhbHVlX3R5cGUpKTsKLSNlbmRpZgotICAgICAgX19zZ2lfYWxsb2M6OmRlYWxsb2NhdGUoKHZvaWQqKV9fcCwgX19uICogc2l6ZW9mKHZhbHVlX3R5cGUpKTsKLSAgICB9Ci0gIH0KLSAgLy8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKLSAgdm9pZCBkZWFsbG9jYXRlKHBvaW50ZXIgX19wKSBjb25zdCB7ICBpZiAoX19wICE9IDApIF9fc2dpX2FsbG9jOjpkZWFsbG9jYXRlKCh2b2lkKilfX3AsIHNpemVvZih2YWx1ZV90eXBlKSk7IH0KLSAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgX1NUTFBfTk9USFJPVyAgeyByZXR1cm4gc2l6ZV90KC0xKSAvIHNpemVvZih2YWx1ZV90eXBlKTsgfQotICB2b2lkIGNvbnN0cnVjdChwb2ludGVyIF9fcCwgY29uc3RfcmVmZXJlbmNlIF9fdmFsKSB7IF9TVExQX1NURDo6X0NvcHlfQ29uc3RydWN0KF9fcCwgX192YWwpOyB9Ci0gIHZvaWQgZGVzdHJveShwb2ludGVyIF9fcCkgeyBfU1RMUF9TVEQ6Ol9EZXN0cm95KF9fcCk7IH0KLSNpZiBkZWZpbmVkKF9fTVJDX18pfHwoZGVmaW5lZChfX1NDX18pICYmICFkZWZpbmVkKF9fRE1DX18pKQotICB0ZW1wbGF0ZSA8Y2xhc3MgX1QyPiBib29sIG9wZXJhdG9yPT0oY29uc3QgYWxsb2NhdG9yPF9UMj4mKSBjb25zdCBfU1RMUF9OT1RIUk9XIHsgcmV0dXJuIHRydWU7IH0KLSAgdGVtcGxhdGUgPGNsYXNzIF9UMj4gYm9vbCBvcGVyYXRvciE9KGNvbnN0IGFsbG9jYXRvcjxfVDI+JikgY29uc3QgX1NUTFBfTk9USFJPVyB7IHJldHVybiBmYWxzZTsgfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUEFSVElBTF9TUEVDX1dPUktBUk9VTkQpICYmICFkZWZpbmVkIChfU1RMUF9GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIpCi0gIC8vVGhpcyBpcyBqdXN0IHRvIG1ha2Ugc3dhcCB3b3JrYXJvdW5kIGZvciBjb21waWxlciB3aXRob3V0IHRlbXBsYXRlIGZ1bmN0aW9uIHBhcnRpYWwKLSAgLy9oYXBweS4KLSAgdm9pZCBzd2FwKGFsbG9jYXRvcjxfVHA+Jikge30KLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKLSAgLyogU1RMcG9ydCBleHRlbnNpb24gZ2l2aW5nIHJvdW5kZWQgc2l6ZSBvZiBhbiBhbGxvY2F0ZWQgbWVtb3J5IGJ1ZmZlcgotICAgKiBUaGlzIG1ldGhvZCBkbyBub3QgaGF2ZSB0byBiZSBwYXJ0IG9mIGEgdXNlciBkZWZpbmVkIGFsbG9jYXRvciBpbXBsZW1lbnRhdGlvbgotICAgKiBhbmQgd29uJ3QgZXZlbiBiZSBjYWxsZWQgaWYgc3VjaCBhIGZ1bmN0aW9uIHdhcyBncmFudGVkLgotICAgKi8KLXByb3RlY3RlZDoKLSNlbmRpZgotICBfVHAqIGFsbG9jYXRlKHNpemVfdHlwZSBfX24sIHNpemVfdHlwZSYgX19hbGxvY2F0ZWRfbikgewotICAgIGlmIChfX24gPiBtYXhfc2l6ZSgpKSB7Ci0gICAgICBfX1RIUk9XX0JBRF9BTExPQzsKLSAgICB9Ci0KLSAgICBpZiAoX19uICE9IDApIHsKLSAgICAgIHNpemVfdHlwZSBfX2J1Zl9zaXplID0gX19uICogc2l6ZW9mKHZhbHVlX3R5cGUpOwotICAgICAgX1RwKiBfX3JldCA9IF9fUkVJTlRFUlBSRVRfQ0FTVChfVHAqLCBfX3NnaV9hbGxvYzo6YWxsb2NhdGUoX19idWZfc2l6ZSkpOwotI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHX1VOSU5JVElBTElaRUQpICYmICFkZWZpbmVkIChfU1RMUF9ERUJVR19BTExPQykKLSAgICAgIGlmIChfX3JldCAhPSAwKSB7Ci0gICAgICAgIG1lbXNldCgoY2hhciopX19yZXQsIF9TVExQX1NIUkVEX0JZVEUsIF9fYnVmX3NpemUpOwotICAgICAgfQotI2VuZGlmCi0gICAgICBfX2FsbG9jYXRlZF9uID0gX19idWZfc2l6ZSAvIHNpemVvZih2YWx1ZV90eXBlKTsKLSAgICAgIHJldHVybiBfX3JldDsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIDA7Ci0gIH0KLX07Ci0KLV9TVExQX1RFTVBMQVRFX05VTEwKLWNsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIGFsbG9jYXRvcjx2b2lkPiB7Ci1wdWJsaWM6Ci0gIHR5cGVkZWYgc2l6ZV90ICAgICAgc2l6ZV90eXBlOwotICB0eXBlZGVmIHB0cmRpZmZfdCAgIGRpZmZlcmVuY2VfdHlwZTsKLSAgdHlwZWRlZiB2b2lkKiAgICAgICBwb2ludGVyOwotICB0eXBlZGVmIGNvbnN0IHZvaWQqIGNvbnN0X3BvaW50ZXI7Ci0jaWYgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikKLSAgdHlwZWRlZiB2b2lkICAgICAgICB2YWx1ZV90eXBlOwotI2VuZGlmCi0jaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFX0NMQVNTRVMpCi0gIHRlbXBsYXRlIDxjbGFzcyBfVHAxPiBzdHJ1Y3QgcmViaW5kIHsKLSAgICB0eXBlZGVmIGFsbG9jYXRvcjxfVHAxPiBvdGhlcjsKLSAgfTsKLSNlbmRpZgotI2lmIGRlZmluZWQoX19NUkNfXyl8fChkZWZpbmVkKF9fU0NfXykmJiFkZWZpbmVkKF9fRE1DX18pKSAgLy8qdHkgMDMvMjQvMjAwMSAtIE1QVyBjb21waWxlcnMgZ2V0IGNvbmZ1c2VkIG9uIHRoZXNlIG9wZXJhdG9yIGRlZmluaXRpb25zCi0gIHRlbXBsYXRlIDxjbGFzcyBfVDI+IGJvb2wgb3BlcmF0b3I9PShjb25zdCBhbGxvY2F0b3I8X1QyPiYpIGNvbnN0IF9TVExQX05PVEhST1cgeyByZXR1cm4gdHJ1ZTsgfQotICB0ZW1wbGF0ZSA8Y2xhc3MgX1QyPiBib29sIG9wZXJhdG9yIT0oY29uc3QgYWxsb2NhdG9yPF9UMj4mKSBjb25zdCBfU1RMUF9OT1RIUk9XIHsgcmV0dXJuIGZhbHNlOyB9Ci0jZW5kaWYKLX07Ci0KLSNpZiAhKGRlZmluZWQoX19NUkNfXyl8fChkZWZpbmVkKF9fU0NfXykmJiFkZWZpbmVkKF9fRE1DX18pKSkgIC8vKnR5IDAzLzI0LzIwMDEgLSBNUFcgY29tcGlsZXJzIGdldCBjb25mdXNlZCBvbiB0aGVzZSBvcGVyYXRvciBkZWZpbml0aW9ucwotdGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyPiBpbmxpbmUgYm9vbCAgX1NUTFBfQ0FMTCBvcGVyYXRvcj09KGNvbnN0IGFsbG9jYXRvcjxfVDE+JiwgY29uc3QgYWxsb2NhdG9yPF9UMj4mKSBfU1RMUF9OT1RIUk9XIHsgcmV0dXJuIHRydWU7IH0KLXRlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4gaW5saW5lIGJvb2wgIF9TVExQX0NBTEwgb3BlcmF0b3IhPShjb25zdCBhbGxvY2F0b3I8X1QxPiYsIGNvbnN0IGFsbG9jYXRvcjxfVDI+JikgX1NUTFBfTk9USFJPVyB7IHJldHVybiBmYWxzZTsgfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUKQotX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIGFsbG9jYXRvcjxjaGFyPjsKLSMgIGlmIGRlZmluZWQgKF9TVExQX0hBU19XQ0hBUl9UKQotX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIGFsbG9jYXRvcjx3Y2hhcl90PjsKLSMgIGVuZGlmCi0jICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfUFRSX1NQRUNJQUxJWkFUSU9OUykKLV9TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBhbGxvY2F0b3I8dm9pZCo+OwotIyAgZW5kaWYKLSNlbmRpZgotCi1fU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCi0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1zdHJ1Y3QgX19hbGxvY190eXBlX3RyYWl0cyB7Ci0jaWYgIWRlZmluZWQgKF9fQk9STEFORENfXykKLSAgdHlwZWRlZiB0eXBlbmFtZSBfSXNTVExwb3J0Q2xhc3M8YWxsb2NhdG9yPF9UcD4gPjo6X1JldCBfU1RMcG9ydEFsbG9jOwotI2Vsc2UKLSAgZW51bSB7IF9JcyA9IF9Jc1NUTHBvcnRDbGFzczxhbGxvY2F0b3I8X1RwPiA+OjpfSXMgfTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jvb2wydHlwZTxfSXM+OjpfUmV0IF9TVExwb3J0QWxsb2M7Ci0jZW5kaWYKLSAgLy9UaGUgZGVmYXVsdCBhbGxvY2F0b3IgaW1wbGVtZW50YXRpb24gd2hpY2ggaXMgcmVjb2duaXplIHRoYW5rcyB0byB0aGUKLSAgLy9fX3N0bHBvcnRfY2xhc3MgaW5oZXJpdGFuY2UgaXMgYSBzdGF0ZWxlc3Mgb2JqZWN0IHNvOgotICB0eXBlZGVmIF9TVExwb3J0QWxsb2MgaGFzX3RyaXZpYWxfZGVmYXVsdF9jb25zdHJ1Y3RvcjsKLSAgdHlwZWRlZiBfU1RMcG9ydEFsbG9jIGhhc190cml2aWFsX2NvcHlfY29uc3RydWN0b3I7Ci0gIHR5cGVkZWYgX1NUTHBvcnRBbGxvYyBoYXNfdHJpdmlhbF9hc3NpZ25tZW50X29wZXJhdG9yOwotICB0eXBlZGVmIF9TVExwb3J0QWxsb2MgaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjsKLSAgdHlwZWRlZiBfU1RMcG9ydEFsbG9jIGlzX1BPRF90eXBlOwotfTsKLQotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLXN0cnVjdCBfX3R5cGVfdHJhaXRzPGFsbG9jYXRvcjxfVHA+ID4gOiBfU1RMUF9QUklWIF9fYWxsb2NfdHlwZV90cmFpdHM8X1RwPiB7fTsKLSNlbHNlCi1fU1RMUF9URU1QTEFURV9OVUxMCi1zdHJ1Y3QgX190eXBlX3RyYWl0czxhbGxvY2F0b3I8Y2hhcj4gPiA6IF9TVExQX1BSSVYgX19hbGxvY190eXBlX3RyYWl0czxjaGFyPiB7fTsKLSMgIGlmIGRlZmluZWQgKF9TVExQX0hBU19XQ0hBUl9UKQotX1NUTFBfVEVNUExBVEVfTlVMTAotc3RydWN0IF9fdHlwZV90cmFpdHM8YWxsb2NhdG9yPHdjaGFyX3Q+ID4gOiBfU1RMUF9QUklWIF9fYWxsb2NfdHlwZV90cmFpdHM8d2NoYXJfdD4ge307Ci0jICBlbmRpZgotIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BUUl9TUEVDSUFMSVpBVElPTlMpCi1fU1RMUF9URU1QTEFURV9OVUxMCi1zdHJ1Y3QgX190eXBlX3RyYWl0czxhbGxvY2F0b3I8dm9pZCo+ID4gOiBfU1RMUF9QUklWIF9fYWxsb2NfdHlwZV90cmFpdHM8dm9pZCo+IHt9OwotIyAgZW5kaWYKLSNlbmRpZgotCi0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfRk9SQ0VfQUxMT0NBVE9SUykKLSMgIGRlZmluZSBfU1RMUF9GT1JDRV9BTExPQ0FUT1JTKGEseSkKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikgJiYgIWRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURV9DTEFTU0VTKQotLy8gVGhlIHZlcnNpb24gZm9yIHRoZSBkZWZhdWx0IGFsbG9jYXRvciwgZm9yIHJhcmUgb2NjYXNpb24gd2hlbiB3ZSBoYXZlIHBhcnRpYWwgc3BlYyB3L28gbWVtYmVyIHRlbXBsYXRlIGNsYXNzZXMKLXRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9UcDE+Ci1zdHJ1Y3QgX0FsbG9jX3RyYWl0czxfVHAsIGFsbG9jYXRvcjxfVHAxPiA+IHsKLSAgdHlwZWRlZiBhbGxvY2F0b3I8X1RwMT4gX09yaWc7Ci0gIHR5cGVkZWYgYWxsb2NhdG9yPF9UcD4gYWxsb2NhdG9yX3R5cGU7Ci0gIHN0YXRpYyBhbGxvY2F0b3JfdHlwZSBjcmVhdGVfYWxsb2NhdG9yKGNvbnN0IGFsbG9jYXRvcjxfVHAxID4mIF9fYSkKLSAgeyByZXR1cm4gYWxsb2NhdG9yX3R5cGUoX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoX19hLCBfVHApKTsgfQotfTsKLSNlbmRpZiAvKiBfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OICovCi0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBQT1JUX1JFQklORF9NRU1CRVJfVEVNUExBVEUpICYmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Ci1pbmxpbmUgX1NUTFBfVFlQRU5BTUVfT05fUkVUVVJOX1RZUEUgX0FsbG9jX3RyYWl0czxfVHAsIF9BbGxvYz46OmFsbG9jYXRvcl90eXBlICBfU1RMUF9DQUxMCi1fX3N0bF9hbGxvY19jcmVhdGUoY29uc3QgX0FsbG9jJiBfX2EsIGNvbnN0IF9UcCopIHsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6Ol9TVExQX1RFTVBMQVRFIHJlYmluZDxfVHA+OjpvdGhlciBfUmVib3VuZF90eXBlOwotICByZXR1cm4gX1JlYm91bmRfdHlwZShfX2EpOwotfQotI2Vsc2UKLS8vIElmIGN1c3RvbSBhbGxvY2F0b3JzIGFyZSBiZWluZyB1c2VkIHdpdGhvdXQgbWVtYmVyIHRlbXBsYXRlIGNsYXNzZXMgc3VwcG9ydCA6Ci0vLyB1c2VyIChvbiBwdXJwb3NlKSBpcyBmb3JjZWQgdG8gZGVmaW5lIHJlYmluZC9nZXQgb3BlcmF0aW9ucyAhISEKLXRlbXBsYXRlIDxjbGFzcyBfVHAxLCBjbGFzcyBfVHAyPgotaW5saW5lIGFsbG9jYXRvcjxfVHAyPiYgX1NUTFBfQ0FMTAotX19zdGxfYWxsb2NfcmViaW5kKGFsbG9jYXRvcjxfVHAxPiYgX19hLCBjb25zdCBfVHAyKikgeyAgcmV0dXJuIChhbGxvY2F0b3I8X1RwMj4mKShfX2EpOyB9Ci10ZW1wbGF0ZSA8Y2xhc3MgX1RwMSwgY2xhc3MgX1RwMj4KLWlubGluZSBhbGxvY2F0b3I8X1RwMj4gX1NUTFBfQ0FMTAotX19zdGxfYWxsb2NfY3JlYXRlKGNvbnN0IGFsbG9jYXRvcjxfVHAxPiYsIGNvbnN0IF9UcDIqKSB7IHJldHVybiBhbGxvY2F0b3I8X1RwMj4oKTsgfQotI2VuZGlmIC8qIF9TVExQX0RPTlRfU1VQUE9SVF9SRUJJTkRfTUVNQkVSX1RFTVBMQVRFICovCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUkFXX1NHSV9BTExPQ0FUT1JTKQotLy8gbW92ZSBvYnNvbGV0ZSBzdHVmZiBvdXQgb2YgdGhlIHdheQotIyAgaW5jbHVkZSA8c3RsL19hbGxvY19vbGQuaD4KLSNlbmRpZgotCi1fU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCi0KLS8vIGluaGVyaXRhbmNlIGlzIGJlaW5nIHVzZWQgZm9yIEVCTyBvcHRpbWl6YXRpb24KLXRlbXBsYXRlIDxjbGFzcyBfVmFsdWUsIGNsYXNzIF9UcCwgY2xhc3MgX01heWJlUmVib3VuZEFsbG9jPgotY2xhc3MgX1NUTFBfYWxsb2NfcHJveHkgOiBwdWJsaWMgX01heWJlUmVib3VuZEFsbG9jIHsKLXByaXZhdGU6Ci0gIHR5cGVkZWYgX01heWJlUmVib3VuZEFsbG9jIF9CYXNlOwotICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpzaXplX3R5cGUgc2l6ZV90eXBlOwotICB0eXBlZGVmIF9TVExQX2FsbG9jX3Byb3h5PF9WYWx1ZSwgX1RwLCBfTWF5YmVSZWJvdW5kQWxsb2M+IF9TZWxmOwotcHVibGljOgotICBfVmFsdWUgX01fZGF0YTsKLQotICBfU1RMUF9hbGxvY19wcm94eSAoY29uc3QgX01heWJlUmVib3VuZEFsbG9jJiBfX2EsIF9WYWx1ZSBfX3ApIDoKLSAgICBfTWF5YmVSZWJvdW5kQWxsb2MoX19hKSwgX01fZGF0YShfX3ApIHt9Ci0KLSAgX1NUTFBfYWxsb2NfcHJveHkgKF9fbW92ZV9zb3VyY2U8X1NlbGY+IHNyYykgOgotICAgIF9NYXliZVJlYm91bmRBbGxvYyhfU1RMUF9QUklWIF9Bc01vdmVTb3VyY2U8X0Jhc2U+KHNyYy5nZXQoKSkpLAotICAgIF9NX2RhdGEoX1NUTFBfUFJJViBfQXNNb3ZlU291cmNlPF9WYWx1ZT4oc3JjLmdldCgpLl9NX2RhdGEpKSB7fQotCi1wcml2YXRlOgotICAvKiBGb2xsb3dpbmcgYXJlIGhlbHBlciBtZXRob2RzIHRvIGRldGVjdCBzdGF0ZWxlc3MgYWxsb2NhdG9ycyBhbmQgYXZvaWQKLSAgICogc3dhcCBpbiB0aGlzIGNhc2UuIEZvciBzb21lIGNvbXBpbGVycyAoVkM2KSBpdCBpcyBhIHdvcmthcm91bmQgZm9yIGEKLSAgICogY29tcGlsZXIgYnVnIGluIHRoZSBFbXB0eSBCYXNlIGNsYXNzIE9wdGltaXphdGlvbiBmZWF0dXJlLCBmb3Igb3RoZXJzCi0gICAqIGl0IGlzIGEgc21hbGwgb3B0aW1pemF0aW9uIG9yIG5vdGhpbmcgaWYgbm8gRUJPLiAqLwotICB2b2lkIF9NX3N3YXBfYWxsb2MoX1NlbGYmLCBjb25zdCBfX3RydWVfdHlwZSYgLypfSXNTdGF0ZWxlc3MqLykKLSAge30KLQotICB2b2lkIF9NX3N3YXBfYWxsb2MoX1NlbGYmIF9feCwgY29uc3QgX19mYWxzZV90eXBlJiAvKl9Jc1N0YXRlbGVzcyovKSB7Ci0gICAgX01heWJlUmVib3VuZEFsbG9jICZfX2Jhc2VfdGhpcyA9ICp0aGlzOwotICAgIF9NYXliZVJlYm91bmRBbGxvYyAmX19iYXNlX3ggPSBfX3g7Ci0gICAgX1NUTFBfU1REOjpzd2FwKF9fYmFzZV90aGlzLCBfX2Jhc2VfeCk7Ci0gIH0KLQotcHVibGljOgotICB2b2lkIF9NX3N3YXBfYWxsb2MoX1NlbGYmIF9feCkgewotI2lmICFkZWZpbmVkIChfX0JPUkxBTkRDX18pCi0gICAgdHlwZWRlZiB0eXBlbmFtZSBfSXNTdGF0ZWxlc3M8X01heWJlUmVib3VuZEFsbG9jPjo6X1JldCBfU3RhdGVsZXNzQWxsb2M7Ci0jZWxzZQotICAgIHR5cGVkZWYgdHlwZW5hbWUgX19ib29sMnR5cGU8X0lzU3RhdGVsZXNzPF9NYXliZVJlYm91bmRBbGxvYz46Ol9Jcz46Ol9SZXQgX1N0YXRlbGVzc0FsbG9jOwotI2VuZGlmCi0gICAgX01fc3dhcF9hbGxvYyhfX3gsIF9TdGF0ZWxlc3NBbGxvYygpKTsKLSAgfQotCi0gIC8qIFdlIG5lZWQgdG8gZGVmaW5lIHRoZSBmb2xsb3dpbmcgc3dhcCBpbXBsZW1lbnRhdGlvbiBmb3IgYWxsb2NhdG9yIHdpdGggc3RhdGUKLSAgICogYXMgdGhvc2UgYWxsb2NhdG9ycyBtaWdodCBoYXZlIGltcGxlbWVudCBhIHNwZWNpYWwgc3dhcCBmdW5jdGlvbiB0byBjb3JyZWN0bHkKLSAgICogbW92ZSBkYXRhcyBmcm9tIGFuIGluc3RhbmNlIHRvIHRoZSBvaGVyLCBfU1RMUF9hbGxvY19wcm94eSBzaG91bGQgbm90IGJyZWFrCi0gICAqIHRoaXMgbWVjYW5pc20uICovCi0gIHZvaWQgc3dhcChfU2VsZiYgX194KSB7Ci0gICAgX01fc3dhcF9hbGxvYyhfX3gpOwotICAgIF9TVExQX1NURDo6c3dhcChfTV9kYXRhLCBfX3guX01fZGF0YSk7Ci0gIH0KLQotICBfVHAqIGFsbG9jYXRlKHNpemVfdHlwZSBfX24sIHNpemVfdHlwZSYgX19hbGxvY2F0ZWRfbikgewotI2lmICFkZWZpbmVkIChfX0JPUkxBTkRDX18pCi0gICAgdHlwZWRlZiB0eXBlbmFtZSBfSXNTVExwb3J0Q2xhc3M8X01heWJlUmVib3VuZEFsbG9jPjo6X1JldCBfU1RMcG9ydEFsbG9jOwotI2Vsc2UKLSAgICB0eXBlZGVmIHR5cGVuYW1lIF9fYm9vbDJ0eXBlPF9Jc1NUTHBvcnRDbGFzczxfTWF5YmVSZWJvdW5kQWxsb2M+OjpfSXM+OjpfUmV0IF9TVExwb3J0QWxsb2M7Ci0jZW5kaWYKLSAgICByZXR1cm4gYWxsb2NhdGUoX19uLCBfX2FsbG9jYXRlZF9uLCBfU1RMcG9ydEFsbG9jKCkpOwotICB9Ci0KLSAgLy8gVW5pZmllZCBpbnRlcmZhY2UgdG8gcGVyZm9ybSBhbGxvY2F0ZSgpL2RlYWxsb2NhdGUoKSB3aXRoIGxpbWl0ZWQKLSAgLy8gbGFuZ3VhZ2Ugc3VwcG9ydAotI2lmIGRlZmluZWQgKF9TVExQX0RPTlRfU1VQUE9SVF9SRUJJTkRfTUVNQkVSX1RFTVBMQVRFKQotICAvLyBlbHNlIGl0IGlzIHJlYm91bmQgYWxyZWFkeSwgYW5kIGFsbG9jYXRlKCkgbWVtYmVyIGlzIGFjY2Vzc2libGUKLSAgX1RwKiBhbGxvY2F0ZShzaXplX3R5cGUgX19uKQotICB7IHJldHVybiBfX3N0bF9hbGxvY19yZWJpbmQoX19TVEFUSUNfQ0FTVChfQmFzZSYsICp0aGlzKSwgX19TVEFUSUNfQ0FTVChfVHAqLCAwKSkuYWxsb2NhdGUoX19uLCAwKTsgfQotICB2b2lkIGRlYWxsb2NhdGUoX1RwKiBfX3AsIHNpemVfdHlwZSBfX24pCi0gIHsgX19zdGxfYWxsb2NfcmViaW5kKF9fU1RBVElDX0NBU1QoX0Jhc2UmLCAqdGhpcyksIF9fU1RBVElDX0NBU1QoX1RwKiwgMCkpLmRlYWxsb2NhdGUoX19wLCBfX24pOyB9Ci1wcml2YXRlOgotICBfVHAqIGFsbG9jYXRlKHNpemVfdHlwZSBfX24sIHNpemVfdHlwZSYgX19hbGxvY2F0ZWRfbiwgY29uc3QgX190cnVlX3R5cGUmIC8qU1RMcG9ydCBhbGxvY2F0b3IqLykKLSAgeyByZXR1cm4gX19zdGxfYWxsb2NfcmViaW5kKF9fU1RBVElDX0NBU1QoX0Jhc2UmLCAqdGhpcyksIF9fU1RBVElDX0NBU1QoX1RwKiwgMCkpLmFsbG9jYXRlKF9fbiwgX19hbGxvY2F0ZWRfbik7IH0KLSNlbHNlCi0gIC8vRXhwb3NlIFN0YW5kYXJkIGFsbG9jYXRlIG92ZXJsb2FkICh1c2luZyBleHByZXNzaW9uIGRvIG5vdCB3b3JrIGZvciBzb21lIGNvbXBpbGVycyAoQm9ybGFuZCkpCi0gIF9UcCogYWxsb2NhdGUoc2l6ZV90eXBlIF9fbikKLSAgeyByZXR1cm4gX0Jhc2U6OmFsbG9jYXRlKF9fbik7IH0KLXByaXZhdGU6Ci0gIF9UcCogYWxsb2NhdGUoc2l6ZV90eXBlIF9fbiwgc2l6ZV90eXBlJiBfX2FsbG9jYXRlZF9uLCBjb25zdCBfX3RydWVfdHlwZSYgLypTVExwb3J0IGFsbG9jYXRvciovKQotICB7IHJldHVybiBfQmFzZTo6YWxsb2NhdGUoX19uLCBfX2FsbG9jYXRlZF9uKTsgfQotI2VuZGlmCi0KLSAgX1RwKiBhbGxvY2F0ZShzaXplX3R5cGUgX19uLCBzaXplX3R5cGUmIF9fYWxsb2NhdGVkX24sIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypTVExwb3J0IGFsbG9jYXRvciovKQotICB7IF9fYWxsb2NhdGVkX24gPSBfX247IHJldHVybiBhbGxvY2F0ZShfX24pOyB9Ci19OwotCi0jaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCkKLV9TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBfU1RMUF9hbGxvY19wcm94eTxjaGFyKiwgY2hhciwgYWxsb2NhdG9yPGNoYXI+ID47Ci0jICBpZiBkZWZpbmVkIChfU1RMUF9IQVNfV0NIQVJfVCkKLV9TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBfU1RMUF9hbGxvY19wcm94eTx3Y2hhcl90Kiwgd2NoYXJfdCwgYWxsb2NhdG9yPHdjaGFyX3Q+ID47Ci0jICBlbmRpZgotIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BUUl9TUEVDSUFMSVpBVElPTlMpCi1fU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgX1NUTFBfYWxsb2NfcHJveHk8dm9pZCoqLCB2b2lkKiwgYWxsb2NhdG9yPHZvaWQqPiA+OwotIyAgZW5kaWYKLSNlbmRpZgotCi1fU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKLV9TVExQX0VORF9OQU1FU1BBQ0UKLQotI2lmIGRlZmluZWQgKF9TVExQX0VYUE9TRV9HTE9CQUxTX0lNUExFTUVOVEFUSU9OKSAmJiAhZGVmaW5lZCAoX1NUTFBfTElOS19USU1FX0lOU1RBTlRJQVRJT04pCi0jICBpbmNsdWRlIDxzdGwvX2FsbG9jLmM+Ci0jZW5kaWYKLQotI2VuZGlmIC8qIF9TVExQX0lOVEVSTkFMX0FMTE9DX0ggKi8KLQotLy8gTG9jYWwgVmFyaWFibGVzOgotLy8gbW9kZTpDKysKLS8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9fYWxsb2Nfb2xkLmggYi9zdGwvX2FsbG9jX29sZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjI3MjQzLi4wMDAwMDAwCi0tLSBhL3N0bC9fYWxsb2Nfb2xkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyODcgKzAsMCBAQAotdGVtcGxhdGU8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Ci1jbGFzcyBfX3NpbXBsZV9hbGxvYyB7Ci0gIHR5cGVkZWYgX0FsbG9jIF9fYWxsb2NfdHlwZTsKLXB1YmxpYzoKLSAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnZhbHVlX3R5cGUgX19hbGxvY192YWx1ZV90eXBlOwotICB0eXBlZGVmIF9UcCB2YWx1ZV90eXBlOwotICBzdGF0aWMgc2l6ZV90ICBfU1RMUF9DQUxMIF9fY2h1bmsoc2l6ZV90IF9fbikgewotICAgIHJldHVybiAoc2l6ZW9mKF9fYWxsb2NfdmFsdWVfdHlwZSk9PXNpemVvZih2YWx1ZV90eXBlKSkgPyBfX24gOgotICAgICAgKChfX24qc2l6ZW9mKHZhbHVlX3R5cGUpK3NpemVvZihfX2FsbG9jX3ZhbHVlX3R5cGUpLTEpL3NpemVvZihfX2FsbG9jX3ZhbHVlX3R5cGUpKTsKLSAgfQotICBzdGF0aWMgX1RwKiAgX1NUTFBfQ0FMTCBhbGxvY2F0ZShzaXplX3QgX19uKSB7IHJldHVybiAwID09IF9fbiA/IDAgOiAoX1RwKikgX19hbGxvY190eXBlOjphbGxvY2F0ZShfX2NodW5rKF9fbikpOyB9Ci0gIHN0YXRpYyB2b2lkICBfU1RMUF9DQUxMIGRlYWxsb2NhdGUoX1RwICogX19wLCBzaXplX3QgX19uKSB7Ci0gICAgX19hbGxvY190eXBlOjpkZWFsbG9jYXRlKChfX2FsbG9jX3ZhbHVlX3R5cGUqKV9fcCwgX19jaHVuayhfX24pKTsgfQotfTsKLQotLy8gQWxsb2NhdG9yIGFkYXB0b3IgdG8gdHVybiBhbiBTR0ktc3R5bGUgYWxsb2NhdG9yIChlLmcuIGFsbG9jLCBtYWxsb2NfYWxsb2MpCi0vLyBpbnRvIGEgc3RhbmRhcmQtY29uZm9ybWluZyBhbGxvY2F0b3IuICAgTm90ZSB0aGF0IHRoaXMgYWRhcHRvciBkb2VzCi0vLyAqbm90KiBhc3N1bWUgdGhhdCBhbGwgb2JqZWN0cyBvZiB0aGUgdW5kZXJseWluZyBhbGxvYyBjbGFzcyBhcmUKLS8vIGlkZW50aWNhbCwgbm9yIGRvZXMgaXQgYXNzdW1lIHRoYXQgYWxsIG9mIHRoZSB1bmRlcmx5aW5nIGFsbG9jJ3MKLS8vIG1lbWJlciBmdW5jdGlvbnMgYXJlIHN0YXRpYyBtZW1iZXIgZnVuY3Rpb25zLiAgTm90ZSwgYWxzbywgdGhhdAotLy8gX19hbGxvY2F0b3I8X1RwLCBhbGxvYz4gaXMgZXNzZW50aWFsbHkgdGhlIHNhbWUgdGhpbmcgYXMgYWxsb2NhdG9yPF9UcD4uCi0KLXRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KLXN0cnVjdCBfX2FsbG9jYXRvciA6IHB1YmxpYyBfQWxsb2MgewotICB0eXBlZGVmIF9BbGxvYyBfX3VuZGVybHlpbmdfYWxsb2M7Ci0KLSAgdHlwZWRlZiBzaXplX3QgICAgc2l6ZV90eXBlOwotICB0eXBlZGVmIHB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7Ci0gIHR5cGVkZWYgX1RwKiAgICAgICBwb2ludGVyOwotICB0eXBlZGVmIGNvbnN0IF9UcCogY29uc3RfcG9pbnRlcjsKLSAgdHlwZWRlZiBfVHAmICAgICAgIHJlZmVyZW5jZTsKLSAgdHlwZWRlZiBjb25zdCBfVHAmIGNvbnN0X3JlZmVyZW5jZTsKLSAgdHlwZWRlZiBfVHAgICAgICAgIHZhbHVlX3R5cGU7Ci0KLSMgaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFX0NMQVNTRVMpCi0gIHRlbXBsYXRlIDxjbGFzcyBfVHAxPiBzdHJ1Y3QgcmViaW5kIHsKLSAgICB0eXBlZGVmIF9fYWxsb2NhdG9yPF9UcDEsIF9BbGxvYz4gb3RoZXI7Ci0gIH07Ci0jIGVuZGlmCi0gIF9fYWxsb2NhdG9yKCkgX1NUTFBfTk9USFJPVyB7fQotICBfX2FsbG9jYXRvcihjb25zdCBfQWxsb2MmICkgX1NUTFBfTk9USFJPVyB7fQotICBfX2FsbG9jYXRvcihjb25zdCBfX2FsbG9jYXRvcjxfVHAsIF9BbGxvYz4mIF9fYSkgX1NUTFBfTk9USFJPVwotICAgIDogX0FsbG9jKF9fYSkge30KLSMgaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykgJiYgZGVmaW5lZCAoX1NUTFBfRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSKQotICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwMT4KLSAgX19hbGxvY2F0b3IoY29uc3QgX19hbGxvY2F0b3I8X1RwMSwgX0FsbG9jPiYgX19hKSBfU1RMUF9OT1RIUk9XCi0gICAgOiBfQWxsb2MoX19hKSB7fQotIyBlbmRpZgotIyBpZmRlZiBfU1RMUF9UUklWSUFMX0RFU1RSVUNUT1JfQlVHCi0gIH5fX2FsbG9jYXRvcigpIF9TVExQX05PVEhST1cge30KLSMgZW5kaWYKLSAgcG9pbnRlciBhZGRyZXNzKHJlZmVyZW5jZSBfX3gpIGNvbnN0IHsgcmV0dXJuICZfX3g7IH0KLQotIyBpZiAhZGVmaW5lZCAoX19XQVRDT01fQ1BMVVNQTFVTX18pCi0gIGNvbnN0X3BvaW50ZXIgYWRkcmVzcyhjb25zdF9yZWZlcmVuY2UgX194KSBjb25zdCB7IHJldHVybiAmX194OyB9Ci0jIGVuZGlmCi0KLSAgLy8gX19uIGlzIHBlcm1pdHRlZCB0byBiZSAwLgotICBfVHAqIGFsbG9jYXRlKHNpemVfdHlwZSBfX24sIGNvbnN0IHZvaWQqID0gMCkgewotICAgIGlmIChfX24gPiBtYXhfc2l6ZSgpKQotICAgICAgX19USFJPV19CQURfQUxMT0M7Ci0gICAgcmV0dXJuIF9fbiAhPSAwCi0gICAgICAgID8gX19TVEFUSUNfQ0FTVChfVHAqLF9fdW5kZXJseWluZ19hbGxvYzo6YWxsb2NhdGUoX19uICogc2l6ZW9mKF9UcCkpKQotICAgICAgICA6IDA7Ci0gIH0KLQotICAvLyBfX3AgaXMgbm90IHBlcm1pdHRlZCB0byBiZSBhIG51bGwgcG9pbnRlci4KLSAgdm9pZCBkZWFsbG9jYXRlKHBvaW50ZXIgX19wLCBzaXplX3R5cGUgX19uKQotICAgIHsgaWYgKF9fcCkgX191bmRlcmx5aW5nX2FsbG9jOjpkZWFsbG9jYXRlKF9fcCwgX19uICogc2l6ZW9mKF9UcCkpOyB9Ci0KLSAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgX1NUTFBfTk9USFJPVwotICAgIHsgcmV0dXJuIHNpemVfdCgtMSkgLyBzaXplb2YoX1RwKTsgfQotCi0gIHZvaWQgY29uc3RydWN0KHBvaW50ZXIgX19wLCBjb25zdF9yZWZlcmVuY2UgX192YWwpIHsgX1NUTFBfU1REOjpfQ29weV9Db25zdHJ1Y3QoX19wLCBfX3ZhbCk7IH0KLSAgdm9pZCBkZXN0cm95KHBvaW50ZXIgX19wKSB7IF9TVExQX1NURDo6X0Rlc3Ryb3koX19wKTsgfQotCi0gIGNvbnN0IF9fdW5kZXJseWluZ19hbGxvYyYgX19nZXRfdW5kZXJseWluZ19hbGxvYygpIGNvbnN0IHsgcmV0dXJuICp0aGlzOyB9Ci19OwotCi0jaWZkZWYgX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTgotdGVtcGxhdGUgPGNsYXNzIF9BbGxvYz4KLWNsYXNzIF9fYWxsb2NhdG9yPHZvaWQsIF9BbGxvYz4gewotICB0eXBlZGVmIHNpemVfdCAgICAgIHNpemVfdHlwZTsKLSAgdHlwZWRlZiBwdHJkaWZmX3QgICBkaWZmZXJlbmNlX3R5cGU7Ci0gIHR5cGVkZWYgdm9pZCogICAgICAgcG9pbnRlcjsKLSAgdHlwZWRlZiBjb25zdCB2b2lkKiBjb25zdF9wb2ludGVyOwotICB0eXBlZGVmIHZvaWQgICAgICAgIHZhbHVlX3R5cGU7Ci0jaWZkZWYgX1NUTFBfTUVNQkVSX1RFTVBMQVRFX0NMQVNTRVMKLSAgdGVtcGxhdGUgPGNsYXNzIF9UcDE+IHN0cnVjdCByZWJpbmQgewotICAgIHR5cGVkZWYgX19hbGxvY2F0b3I8X1RwMSwgX0FsbG9jPiBvdGhlcjsKLSAgfTsKLSNlbmRpZgotfTsKLSNlbmRpZgotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Ci1pbmxpbmUgYm9vbCAgX1NUTFBfQ0FMTCBvcGVyYXRvcj09KGNvbnN0IF9fYWxsb2NhdG9yPF9UcCwgX0FsbG9jPiYgX19hMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19hbGxvY2F0b3I8X1RwLCBfQWxsb2M+JiBfX2EyKQotewotICByZXR1cm4gX19hMS5fX2dldF91bmRlcmx5aW5nX2FsbG9jKCkgPT0gX19hMi5fX2dldF91bmRlcmx5aW5nX2FsbG9jKCk7Ci19Ci0KLSNpZmRlZiBfU1RMUF9VU0VfU0VQQVJBVEVfUkVMT1BTX05BTUVTUEFDRQotdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgotaW5saW5lIGJvb2wgIF9TVExQX0NBTEwgb3BlcmF0b3IhPShjb25zdCBfX2FsbG9jYXRvcjxfVHAsIF9BbGxvYz4mIF9fYTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fYWxsb2NhdG9yPF9UcCwgX0FsbG9jPiYgX19hMikKLXsKLSAgcmV0dXJuIF9fYTEuX19nZXRfdW5kZXJseWluZ19hbGxvYygpICE9IF9fYTIuX19nZXRfdW5kZXJseWluZ19hbGxvYygpOwotfQotI2VuZGlmIC8qIF9TVExQX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUiAqLwotCi0KLS8vIENvbXBhcmlzb24gb3BlcmF0b3JzIGZvciBhbGwgb2YgdGhlIHByZWRpZmluZWQgU0dJLXN0eWxlIGFsbG9jYXRvcnMuCi0vLyBUaGlzIGVuc3VyZXMgdGhhdCBfX2FsbG9jYXRvcjxtYWxsb2NfYWxsb2M+IChmb3IgZXhhbXBsZSkgd2lsbAotLy8gd29yayBjb3JyZWN0bHkuCi0KLSNpZm5kZWYgX1NUTFBfTk9OX1RZUEVfVE1QTF9QQVJBTV9CVUcKLWlubGluZSBib29sICBfU1RMUF9DQUxMIG9wZXJhdG9yPT0oY29uc3QgX19tYWxsb2NfYWxsb2MmLCBjb25zdCBfX21hbGxvY19hbGxvYyYpCi17IHJldHVybiB0cnVlOyB9Ci0KLSMgIGlmZGVmIF9TVExQX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUgotaW5saW5lIGJvb2wgIF9TVExQX0NBTEwgb3BlcmF0b3IhPShjb25zdCBfX21hbGxvY19hbGxvYyYsIGNvbnN0IF9fbWFsbG9jX2FsbG9jJikKLXsgcmV0dXJuIGZhbHNlOyB9Ci0jICBlbmRpZgotCi1pbmxpbmUgYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yPT0oY29uc3QgX19uZXdfYWxsb2MmLCBjb25zdCBfX25ld19hbGxvYyYpIHsgcmV0dXJuIHRydWU7IH0KLQotIyAgaWZkZWYgX1NUTFBfVVNFX1NFUEFSQVRFX1JFTE9QU19OQU1FU1BBQ0UKLWlubGluZSBib29sIF9TVExQX0NBTEwgb3BlcmF0b3IhPShjb25zdCBfX25ld19hbGxvYyYsIGNvbnN0IF9fbmV3X2FsbG9jJikgeyByZXR1cm4gZmFsc2U7IH0KLSMgIGVuZGlmCi0KLSMgIGlmICFkZWZpbmVkIChfU1RMUF9VU0VfTk9fSU9TVFJFQU1TKQotaW5saW5lIGJvb2wgIF9TVExQX0NBTEwgb3BlcmF0b3I9PShjb25zdCBfX25vZGVfYWxsb2MmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX25vZGVfYWxsb2MmKQoteyByZXR1cm4gdHJ1ZTsgfQotCi0jICAgIGlmIGRlZmluZWQoIF9TVExQX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUiApCi0KLWlubGluZSBib29sICBfU1RMUF9DQUxMIG9wZXJhdG9yIT0oY29uc3QgX19ub2RlX2FsbG9jJiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19ub2RlX2FsbG9jJikKLXsgcmV0dXJuIGZhbHNlOyB9Ci0jICAgIGVuZGlmCi0jICBlbmRpZgotCi0jZW5kaWYgLyogX1NUTFBfTk9OX1RZUEVfVE1QTF9QQVJBTV9CVUcgKi8KLQotdGVtcGxhdGUgPGNsYXNzIF9BbGxvYz4KLWlubGluZSBib29sICBfU1RMUF9DQUxMIG9wZXJhdG9yPT0oY29uc3QgX19kZWJ1Z19hbGxvYzxfQWxsb2M+JiwgY29uc3QgX19kZWJ1Z19hbGxvYzxfQWxsb2M+JikgeyAgcmV0dXJuIHRydWU7IH0KLSMgaWZkZWYgX1NUTFBfVVNFX1NFUEFSQVRFX1JFTE9QU19OQU1FU1BBQ0UKLXRlbXBsYXRlIDxjbGFzcyBfQWxsb2M+Ci1pbmxpbmUgYm9vbCAgX1NUTFBfQ0FMTCBvcGVyYXRvciE9KGNvbnN0IF9fZGVidWdfYWxsb2M8X0FsbG9jPiYsIGNvbnN0IF9fZGVidWdfYWxsb2M8X0FsbG9jPiYpIHsgIHJldHVybiBmYWxzZTsgfQotIyBlbmRpZgotCi0jaWYgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikKLQotLy8gVmVyc2lvbnMgZm9yIHRoZSBwcmVkZWZpbmVkIFNHSS1zdHlsZSBhbGxvY2F0b3JzLgotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLXN0cnVjdCBfQWxsb2NfdHJhaXRzPF9UcCwgX19tYWxsb2NfYWxsb2M+IHsKLSAgdHlwZWRlZiBfX2FsbG9jYXRvcjxfVHAsIF9fbWFsbG9jX2FsbG9jPiBhbGxvY2F0b3JfdHlwZTsKLX07Ci0KLSMgIGlmICFkZWZpbmVkIChfU1RMUF9VU0VfTk9fSU9TVFJFQU1TKQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLXN0cnVjdCBfQWxsb2NfdHJhaXRzPF9UcCwgX19ub2RlX2FsbG9jPiB7Ci0gIHR5cGVkZWYgX19hbGxvY2F0b3I8X1RwLCBfX25vZGVfYWxsb2M+IGFsbG9jYXRvcl90eXBlOwotfTsKLSMgIGVuZGlmCi0KLXRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KLXN0cnVjdCBfQWxsb2NfdHJhaXRzPF9UcCwgX19kZWJ1Z19hbGxvYzxfQWxsb2M+ID4gewotICB0eXBlZGVmIF9fYWxsb2NhdG9yPF9UcCwgX19kZWJ1Z19hbGxvYzxfQWxsb2M+ID4gYWxsb2NhdG9yX3R5cGU7Ci19OwotCi0vLyBWZXJzaW9ucyBmb3IgdGhlIF9fYWxsb2NhdG9yIGFkYXB0b3IgdXNlZCB3aXRoIHRoZSBwcmVkZWZpbmVkCi0vLyBTR0ktc3R5bGUgYWxsb2NhdG9ycy4KLQotdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1RwMSwgY2xhc3MgX0FsbG9jPgotc3RydWN0IF9BbGxvY190cmFpdHM8X1RwLCBfX2FsbG9jYXRvcjxfVHAxLCBfQWxsb2MgPiA+IHsKLSAgdHlwZWRlZiBfX2FsbG9jYXRvcjxfVHAsIF9BbGxvYyA+IGFsbG9jYXRvcl90eXBlOwotfTsKLQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9ET05UX1NVUFBPUlRfUkVCSU5EX01FTUJFUl9URU1QTEFURSkKLQotLy8gVmVyc2lvbnMgZm9yIHRoZSBwcmVkZWZpbmVkIFNHSS1zdHlsZSBhbGxvY2F0b3JzLgotCi0KLSMgIGlmIGRlZmluZWQgKF9TVExQX05PTl9UWVBFX1RNUExfUEFSQU1fQlVHKQotCi10eXBlZGVmIF9fbWFsbG9jX2FsbG9jIF9fbWFsbG9jX2FsbG9jX2RmbDsKLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWlubGluZSBfX2FsbG9jYXRvcjxfVHAsIF9fbWFsbG9jX2FsbG9jX2RmbCA+JiBfU1RMUF9DQUxMCi1fX3N0bF9hbGxvY19yZWJpbmQoX19tYWxsb2NfYWxsb2NfZGZsJiBfX2EsIGNvbnN0IF9UcCopIHsKLSAgcmV0dXJuIChfX2FsbG9jYXRvcjxfVHAsIF9fbWFsbG9jX2FsbG9jX2RmbCA+JilfX2E7Ci19Ci0KLSMgICAgaWYgIWRlZmluZWQgKF9TVExQX1VTRV9OT19JT1NUUkVBTVMpCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotaW5saW5lIF9fYWxsb2NhdG9yPF9UcCwgX19ub2RlX2FsbG9jPiYgX1NUTFBfQ0FMTAotX19zdGxfYWxsb2NfcmViaW5kKF9fbm9kZV9hbGxvYyYgX19hLCBjb25zdCBfVHAqKSB7Ci0gIHJldHVybiAoX19hbGxvY2F0b3I8X1RwLCBfX25vZGVfYWxsb2M+JilfX2E7Ci19Ci0jICAgIGVuZGlmCi0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgX19hbGxvY2F0b3I8X1RwLCBfX21hbGxvY19hbGxvY19kZmwgPiBfU1RMUF9DQUxMCi1fX3N0bF9hbGxvY19jcmVhdGUoY29uc3QgX19tYWxsb2NfYWxsb2NfZGZsJiwgY29uc3QgX1RwKikgewotICByZXR1cm4gX19hbGxvY2F0b3I8X1RwLCBfX21hbGxvY19hbGxvY19kZmwgPiAoKTsKLX0KLQotIyAgICBpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX05PX0lPU1RSRUFNUykKLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgX19hbGxvY2F0b3I8X1RwLCBfX25vZGVfYWxsb2M+IF9TVExQX0NBTEwKLV9fc3RsX2FsbG9jX2NyZWF0ZShjb25zdCBfX25vZGVfYWxsb2MmLCBjb25zdCBfVHAqKSB7Ci0gIHJldHVybiBfX2FsbG9jYXRvcjxfVHAsIF9fbm9kZV9hbGxvYz4oKTsKLX0KLQotIyAgICBlbmRpZgotCi0jICBlbHNlCi0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgX19hbGxvY2F0b3I8X1RwLCBfX21hbGxvY19hbGxvYz4mIF9TVExQX0NBTEwKLV9fc3RsX2FsbG9jX3JlYmluZChfX21hbGxvY19hbGxvYyYgX19hLCBjb25zdCBfVHAqKSB7Ci0gIHJldHVybiAoX19hbGxvY2F0b3I8X1RwLCBfX21hbGxvY19hbGxvYz4mKV9fYTsKLX0KLQotIyAgICBpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX05PX0lPU1RSRUFNUykKLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgX19hbGxvY2F0b3I8X1RwLCBfX25vZGVfYWxsb2M+JiBfU1RMUF9DQUxMCi1fX3N0bF9hbGxvY19yZWJpbmQoX19ub2RlX2FsbG9jJiBfX2EsIGNvbnN0IF9UcCopIHsKLSAgcmV0dXJuIChfX2FsbG9jYXRvcjxfVHAsIF9fbm9kZV9hbGxvYz4mKV9fYTsKLX0KLSMgICAgZW5kaWYKLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWlubGluZSBfX2FsbG9jYXRvcjxfVHAsIF9fbWFsbG9jX2FsbG9jPiBfU1RMUF9DQUxMCi1fX3N0bF9hbGxvY19jcmVhdGUoY29uc3QgX19tYWxsb2NfYWxsb2MmLCBjb25zdCBfVHAqKSB7Ci0gIHJldHVybiBfX2FsbG9jYXRvcjxfVHAsIF9fbWFsbG9jX2FsbG9jPigpOwotfQotCi0jICAgIGlmICFkZWZpbmVkIChfU1RMUF9VU0VfTk9fSU9TVFJFQU1TKQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWlubGluZSBfX2FsbG9jYXRvcjxfVHAsIF9fbm9kZV9hbGxvYz4gX1NUTFBfQ0FMTAotX19zdGxfYWxsb2NfY3JlYXRlKGNvbnN0IF9fbm9kZV9hbGxvYyYsIGNvbnN0IF9UcCopIHsKLSAgcmV0dXJuIF9fYWxsb2NhdG9yPF9UcCwgX19ub2RlX2FsbG9jPigpOwotfQotIyAgICBlbmRpZgotCi0jICBlbmRpZgotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Ci1pbmxpbmUgX19hbGxvY2F0b3I8X1RwLCBfX2RlYnVnX2FsbG9jPF9BbGxvYz4gPiBfU1RMUF9DQUxMCi1fX3N0bF9hbGxvY19jcmVhdGUoY29uc3QgX19kZWJ1Z19hbGxvYzxfQWxsb2M+JiwgY29uc3QgX1RwKikgewotICByZXR1cm4gX19hbGxvY2F0b3I8X1RwLCBfX2RlYnVnX2FsbG9jPF9BbGxvYz4gPigpOwotfQotdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgotaW5saW5lIF9fYWxsb2NhdG9yPF9UcCwgX19kZWJ1Z19hbGxvYzxfQWxsb2M+ID4mIF9TVExQX0NBTEwKLV9fc3RsX2FsbG9jX3JlYmluZChfX2RlYnVnX2FsbG9jPF9BbGxvYz4mIF9fYSwgY29uc3QgX1RwKikgewotICByZXR1cm4gKF9fYWxsb2NhdG9yPF9UcCwgX19kZWJ1Z19hbGxvYzxfQWxsb2M+ID4mKV9fYTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWlubGluZSBfX2FsbG9jYXRvcjxfVHAsIF9fbmV3X2FsbG9jID4gX1NUTFBfQ0FMTAotX19zdGxfYWxsb2NfY3JlYXRlKGNvbnN0IF9fbmV3X2FsbG9jJiwgY29uc3QgX1RwKikgewotICByZXR1cm4gX19hbGxvY2F0b3I8X1RwLCBfX25ld19hbGxvYyA+KCk7Ci19Ci10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotaW5saW5lIF9fYWxsb2NhdG9yPF9UcCwgX19uZXdfYWxsb2MgPiYgIF9TVExQX0NBTEwKLV9fc3RsX2FsbG9jX3JlYmluZChfX25ld19hbGxvYyYgX19hLCBjb25zdCBfVHAqKSB7Ci0gIHJldHVybiAoX19hbGxvY2F0b3I8X1RwLCBfX25ld19hbGxvYyA+JilfX2E7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHAxLCBjbGFzcyBfQWxsb2MsIGNsYXNzIF9UcDI+Ci1pbmxpbmUgX19hbGxvY2F0b3I8X1RwMiwgX0FsbG9jPiYgX1NUTFBfQ0FMTAotX19zdGxfYWxsb2NfcmViaW5kKF9fYWxsb2NhdG9yPF9UcDEsIF9BbGxvYz4mIF9fYSwgY29uc3QgX1RwMiopIHsKLSAgcmV0dXJuIChfX2FsbG9jYXRvcjxfVHAyLCBfQWxsb2M+JilfX2E7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHAxLCBjbGFzcyBfQWxsb2MsIGNsYXNzIF9UcDI+Ci1pbmxpbmUgX19hbGxvY2F0b3I8X1RwMiwgX0FsbG9jPiBfU1RMUF9DQUxMCi1fX3N0bF9hbGxvY19jcmVhdGUoY29uc3QgX19hbGxvY2F0b3I8X1RwMSwgX0FsbG9jPiYsIGNvbnN0IF9UcDIqKSB7Ci0gIHJldHVybiBfX2FsbG9jYXRvcjxfVHAyLCBfQWxsb2M+KCk7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL3N0bC9fYXV0b19wdHIuaCBiL3N0bC9fYXV0b19wdHIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE1MTMwYS4uMDAwMDAwMAotLS0gYS9zdGwvX2F1dG9fcHRyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0xOTk5Ci0gKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0jaWZuZGVmIF9TVExQX0FVVE9fUFRSX0gKLSMgZGVmaW5lIF9TVExQX0FVVE9fUFRSX0gKLQotX1NUTFBfQkVHSU5fTkFNRVNQQUNFCi0vLyBpbXBsZW1lbnRhdGlvbiBwcmltaXRpdmUKLWNsYXNzIF9fcHRyX2Jhc2UgewotcHVibGljOgotICB2b2lkKiBfTV9wOwotICB2b2lkICBfX3NldChjb25zdCB2b2lkKiBwKSB7IF9NX3AgPSBfX0NPTlNUX0NBU1Qodm9pZCoscCk7IH0KLSAgdm9pZCAgX19zZXQodm9pZCogcCkgeyBfTV9wID0gcDsgfQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWNsYXNzIGF1dG9fcHRyX3JlZiB7Ci1wdWJsaWM6Ci0gIF9fcHRyX2Jhc2UmIF9NX3I7Ci0gIF9UcCogY29uc3QgX01fcDsKLQotICBhdXRvX3B0cl9yZWYoX19wdHJfYmFzZSYgX19yLCBfVHAqIF9fcCkgOiBfTV9yKF9fciksIF9NX3AoX19wKSB7ICB9Ci0KLSAgX1RwKiByZWxlYXNlKCkgY29uc3QgeyBfTV9yLl9fc2V0KCh2b2lkKikwKTsgcmV0dXJuIF9NX3A7IH0KLQotcHJpdmF0ZToKLSAgLy9leHBsaWNpdGVseSBkZWZpbmVkIGFzIHByaXZhdGUgdG8gYXZvaWQgd2FybmluZ3M6Ci0gIHR5cGVkZWYgYXV0b19wdHJfcmVmPF9UcD4gX1NlbGY7Ci0gIF9TZWxmJiBvcGVyYXRvciA9IChfU2VsZiBjb25zdCYpOwotfTsKLQotdGVtcGxhdGU8Y2xhc3MgX1RwPgotY2xhc3MgYXV0b19wdHIgOiAgcHVibGljIF9fcHRyX2Jhc2UgewotcHVibGljOgotICB0eXBlZGVmIF9UcCBlbGVtZW50X3R5cGU7Ci0gIHR5cGVkZWYgYXV0b19wdHI8X1RwPiBfU2VsZjsKLQotICBfVHAqIHJlbGVhc2UoKSBfU1RMUF9OT1RIUk9XIHsKLSAgICBfVHAqIF9fcHggPSB0aGlzLT5nZXQoKTsKLSAgICB0aGlzLT5fTV9wID0gMDsKLSAgICByZXR1cm4gX19weDsKLSAgfQotCi0gIHZvaWQgcmVzZXQoX1RwKiBfX3B4ID0gMCkgX1NUTFBfTk9USFJPVyB7Ci0gICAgX1RwKiBfX3B0ID0gdGhpcy0+Z2V0KCk7Ci0gICAgaWYgKF9fcHggIT0gX19wdCkKLSAgICAgIGRlbGV0ZSBfX3B0OwotICAgIHRoaXMtPl9fc2V0KF9fcHgpOwotICB9Ci0KLSAgX1RwKiBnZXQoKSBjb25zdCBfU1RMUF9OT1RIUk9XCi0gIHsgcmV0dXJuIF9fUkVJTlRFUlBSRVRfQ0FTVChfVHAqLF9fQ09OU1RfQ0FTVCh2b2lkKixfTV9wKSk7IH0KLQotI2lmICFkZWZpbmVkIChfU1RMUF9OT19BUlJPV19PUEVSQVRPUikKLSAgX1RwKiBvcGVyYXRvci0+KCkgY29uc3QgX1NUTFBfTk9USFJPVyB7Ci0gICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoZ2V0KCkhPTAsIF9TdGxNc2dfQVVUT19QVFJfTlVMTCkKLSAgICByZXR1cm4gZ2V0KCk7Ci0gIH0KLSNlbmRpZgotICBfVHAmIG9wZXJhdG9yKigpIGNvbnN0IF9TVExQX05PVEhST1cgewotICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKGdldCgpIT0gMCwgX1N0bE1zZ19BVVRPX1BUUl9OVUxMKQotICAgIHJldHVybiAqZ2V0KCk7Ci0gIH0KLQotICBleHBsaWNpdCBhdXRvX3B0cihfVHAqIF9fcHggPSAwKSBfU1RMUF9OT1RIUk9XIHsgdGhpcy0+X19zZXQoX19weCk7IH0KLQotI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCi0jICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fVEVNUExBVEVfQ09OVkVSU0lPTlMpCi0gIHRlbXBsYXRlPGNsYXNzIF9UcDE+IGF1dG9fcHRyKGF1dG9fcHRyPF9UcDE+JiBfX3IpIF9TVExQX05PVEhST1cgewotICAgIF9UcCogX19jb252ZXJzaW9uQ2hlY2sgPSBfX3IucmVsZWFzZSgpOwotICAgIHRoaXMtPl9fc2V0KF9fY29udmVyc2lvbkNoZWNrKTsKLSAgfQotIyAgZW5kaWYKLSAgdGVtcGxhdGU8Y2xhc3MgX1RwMT4gYXV0b19wdHI8X1RwPiYgb3BlcmF0b3I9KGF1dG9fcHRyPF9UcDE+JiBfX3IpIF9TVExQX05PVEhST1cgewotICAgIF9UcCogX19jb252ZXJzaW9uQ2hlY2sgPSBfX3IucmVsZWFzZSgpOwotICAgIHJlc2V0KF9fY29udmVyc2lvbkNoZWNrKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSNlbmRpZgotCi0gIGF1dG9fcHRyKF9TZWxmJiBfX3IpIF9TVExQX05PVEhST1cgeyB0aGlzLT5fX3NldChfX3IucmVsZWFzZSgpKTsgfQotCi0gIF9TZWxmJiBvcGVyYXRvcj0oX1NlbGYmIF9fcikgX1NUTFBfTk9USFJPVyB7Ci0gICAgcmVzZXQoX19yLnJlbGVhc2UoKSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgfmF1dG9fcHRyKCkgX1NUTFBfTk9USFJPVyB7IC8qIGJvcmlzIDogcmVzZXQoMCkgbWlnaHQgYmUgYmV0dGVyICovIGRlbGV0ZSB0aGlzLT5nZXQoKTsgfQotCi0gIGF1dG9fcHRyKGF1dG9fcHRyX3JlZjxfVHA+IF9fcikgX1NUTFBfTk9USFJPVwotICB7IHRoaXMtPl9fc2V0KF9fci5yZWxlYXNlKCkpOyB9Ci0KLSAgX1NlbGYmIG9wZXJhdG9yPShhdXRvX3B0cl9yZWY8X1RwPiBfX3IpIF9TVExQX05PVEhST1cgewotICAgIHJlc2V0KF9fci5yZWxlYXNlKCkpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0jaWYgZGVmaW5lZChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKSAmJiAhZGVmaW5lZChfU1RMUF9OT19URU1QTEFURV9DT05WRVJTSU9OUykKLSAgdGVtcGxhdGU8Y2xhc3MgX1RwMT4gb3BlcmF0b3IgYXV0b19wdHJfcmVmPF9UcDE+KCkgX1NUTFBfTk9USFJPVwotICB7IHJldHVybiBhdXRvX3B0cl9yZWY8X1RwMT4oKnRoaXMsIHRoaXMtPmdldCgpKTsgfQotICB0ZW1wbGF0ZTxjbGFzcyBfVHAxPiBvcGVyYXRvciBhdXRvX3B0cjxfVHAxPigpIF9TVExQX05PVEhST1cKLSAgeyByZXR1cm4gYXV0b19wdHI8X1RwMT4ocmVsZWFzZSgpKTsgfQotI2Vsc2UKLSAgb3BlcmF0b3IgYXV0b19wdHJfcmVmPF9UcD4oKSBfU1RMUF9OT1RIUk9XCi0gIHsgcmV0dXJuIGF1dG9fcHRyX3JlZjxfVHA+KCp0aGlzLCB0aGlzLT5nZXQoKSk7IH0KLSNlbmRpZgotfTsKLV9TVExQX0VORF9OQU1FU1BBQ0UKLQotI2VuZGlmIC8qIF9TVExQX0FVVE9fUFRSX0ggKi8KLQotLy8gTG9jYWwgVmFyaWFibGVzOgotLy8gbW9kZTpDKysKLS8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9fYnZlY3Rvci5oIGIvc3RsL19idmVjdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5NDNlZGEuLjAwMDAwMDAKLS0tIGEvc3RsL19idmVjdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MzcgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTQKLSAqIEhld2xldHQtUGFja2FyZCBDb21wYW55Ci0gKgotICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKLSAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NwotICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogQm9yaXMgRm9taXRjaGV2Ci0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICovCi0KLS8qIE5PVEU6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIFNUTCBoZWFkZXJzLgotICogICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4KLSAqLwotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0JWRUNUT1JfSAotI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9CVkVDVE9SX0gKLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9WRUNUT1JfSAotIyAgaW5jbHVkZSA8c3RsL192ZWN0b3IuaD4KLSNlbmRpZgotCi0jZGVmaW5lIF9TVExQX1dPUkRfQklUIChpbnQoQ0hBUl9CSVQqc2l6ZW9mKHVuc2lnbmVkIGludCkpKQotCi1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLV9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKLQotc3RydWN0IF9CaXRfcmVmZXJlbmNlIHsKLSAgdW5zaWduZWQgaW50KiBfTV9wOwotICB1bnNpZ25lZCBpbnQgX01fbWFzazsKLSAgX0JpdF9yZWZlcmVuY2UodW5zaWduZWQgaW50KiBfX3gsIHVuc2lnbmVkIGludCBfX3kpCi0gICAgOiBfTV9wKF9feCksIF9NX21hc2soX195KSB7fQotCi1wdWJsaWM6Ci0gIF9CaXRfcmVmZXJlbmNlKCkgOiBfTV9wKDApLCBfTV9tYXNrKDApIHt9Ci0KLSAgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsKLSAgICByZXR1cm4gISghKCpfTV9wICYgX01fbWFzaykpOwotICB9Ci0gIF9CaXRfcmVmZXJlbmNlJiBvcGVyYXRvciA9IChib29sIF9feCkgewotICAgIGlmIChfX3gpICAqX01fcCB8PSBfTV9tYXNrOwotICAgIGVsc2UgICAgICAqX01fcCAmPSB+X01fbWFzazsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgX0JpdF9yZWZlcmVuY2UmIG9wZXJhdG9yID0gKGNvbnN0IF9CaXRfcmVmZXJlbmNlJiBfX3gpIHsKLSAgICByZXR1cm4gKnRoaXMgPSBib29sKF9feCk7Ci0gIH0KLSAgYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgX0JpdF9yZWZlcmVuY2UmIF9feCkgY29uc3QgewotICAgIHJldHVybiBib29sKCp0aGlzKSA9PSBib29sKF9feCk7Ci0gIH0KLSAgYm9vbCBvcGVyYXRvciA8IChjb25zdCBfQml0X3JlZmVyZW5jZSYgX194KSBjb25zdCB7Ci0gICAgcmV0dXJuICFib29sKCp0aGlzKSAmJiBib29sKF9feCk7Ci0gIH0KLQotICBfQml0X3JlZmVyZW5jZSYgb3BlcmF0b3IgfD0gKGJvb2wgX194KSB7Ci0gICAgaWYgKF9feCkKLSAgICAgICpfTV9wIHw9IF9NX21hc2s7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIF9CaXRfcmVmZXJlbmNlJiBvcGVyYXRvciAmPSAoYm9vbCBfX3gpIHsKLSAgICBpZiAoIV9feCkKLSAgICAgICpfTV9wICY9IH5fTV9tYXNrOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotICB2b2lkIGZsaXAoKSB7ICpfTV9wIF49IF9NX21hc2s7IH0KLX07Ci0KLQotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi0KLWlubGluZSB2b2lkIHN3YXAoX1NUTFBfUFJJViBfQml0X3JlZmVyZW5jZSYgX194LCBfU1RMUF9QUklWIF9CaXRfcmVmZXJlbmNlJiBfX3kpIHsKLSAgYm9vbCBfX3RtcCA9IChib29sKV9feDsKLSAgX194ID0gX195OwotICBfX3kgPSBfX3RtcDsKLX0KLQotLy8gTWlnaHQgbm90IGJlIHZlcnkgdXNlZnVsIGJ1dCBjb3N0cyBub3RoaW5nIQotX1NUTFBfVEVNUExBVEVfTlVMTAotc3RydWN0IF9fdHlwZV90cmFpdHM8X1NUTFBfUFJJViBfQml0X3JlZmVyZW5jZT4gewotICB0eXBlZGVmIF9fZmFsc2VfdHlwZSAgICBoYXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yOwotICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgICBoYXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yOwotICB0eXBlZGVmIF9fZmFsc2VfdHlwZSAgICBoYXNfdHJpdmlhbF9hc3NpZ25tZW50X29wZXJhdG9yOwotICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgICBoYXNfdHJpdmlhbF9kZXN0cnVjdG9yOwotICB0eXBlZGVmIF9fZmFsc2VfdHlwZSAgICBpc19QT0RfdHlwZTsKLX07Ci0KLV9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKLQotc3RydWN0IF9CaXRfaXRlcmF0b3JfYmFzZSB7Ci0gIHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKLQotICB1bnNpZ25lZCBpbnQqIF9NX3A7Ci0gIHVuc2lnbmVkIGludCAgX01fb2Zmc2V0OwotCi0gIHZvaWQgX01fYnVtcF91cCgpIHsKLSAgICBpZiAoX01fb2Zmc2V0KysgPT0gX1NUTFBfV09SRF9CSVQgLSAxKSB7Ci0gICAgICBfTV9vZmZzZXQgPSAwOwotICAgICAgKytfTV9wOwotICAgIH0KLSAgfQotCi0gIHZvaWQgX01fYnVtcF9kb3duKCkgewotICAgIGlmIChfTV9vZmZzZXQtLSA9PSAwKSB7Ci0gICAgICBfTV9vZmZzZXQgPSBfU1RMUF9XT1JEX0JJVCAtIDE7Ci0gICAgICAtLV9NX3A7Ci0gICAgfQotICB9Ci0KLSAgX0JpdF9pdGVyYXRvcl9iYXNlKCkgOiBfTV9wKDApLCBfTV9vZmZzZXQoMCkge30KLSAgX0JpdF9pdGVyYXRvcl9iYXNlKHVuc2lnbmVkIGludCogX194LCB1bnNpZ25lZCBpbnQgX195KSA6IF9NX3AoX194KSwgX01fb2Zmc2V0KF9feSkge30KLS8vIHNlZSBjb21tZW50IGluIGRvYy9SRUFETUUuZXZjNCBhbmQgZG9jL1JFQURNRS5ldmM4Ci0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgX01TQ19WRVI8PTE0MDEgJiYgZGVmaW5lZChNSVBTKSAmJiBkZWZpbmVkKE5ERUJVRykKLSAgX0JpdF9pdGVyYXRvcl9iYXNlKCBjb25zdCBfQml0X2l0ZXJhdG9yX2Jhc2UmIF9feCkgOiBfTV9wKF9feC5fTV9wKSwgX01fb2Zmc2V0KF9feC5fTV9vZmZzZXQpIHt9Ci0jZW5kaWYKLSAgLy8gIF9CaXRfaXRlcmF0b3JfYmFzZSYgb3BlcmF0b3IgPSAoIGNvbnN0IF9CaXRfaXRlcmF0b3JfYmFzZSYgX194KSB7IF9NX3AgPSBfX3guX01fcCA7IF9NX29mZnNldCA9IF9feC5fTV9vZmZzZXQgOyByZXR1cm4gKnRoaXM7IH0KLQotICB2b2lkIF9NX2FkdmFuY2UgKGRpZmZlcmVuY2VfdHlwZSBfX2kpIHsKLSAgICBkaWZmZXJlbmNlX3R5cGUgX19uID0gX19pICsgX01fb2Zmc2V0OwotICAgIF9NX3AgKz0gX19uIC8gX1NUTFBfV09SRF9CSVQ7Ci0gICAgX19uID0gX19uICUgX1NUTFBfV09SRF9CSVQ7Ci0gICAgaWYgKF9fbiA8IDApIHsKLSAgICAgIF9NX29mZnNldCA9ICh1bnNpZ25lZCBpbnQpIF9fbiArIF9TVExQX1dPUkRfQklUOwotICAgICAgLS1fTV9wOwotICAgIH0gZWxzZQotICAgICAgX01fb2Zmc2V0ID0gKHVuc2lnbmVkIGludCkgX19uOwotICB9Ci0KLSAgZGlmZmVyZW5jZV90eXBlIF9NX3N1YnRyYWN0KGNvbnN0IF9CaXRfaXRlcmF0b3JfYmFzZSYgX194KSBjb25zdCB7Ci0gICAgcmV0dXJuIF9TVExQX1dPUkRfQklUICogKF9NX3AgLSBfX3guX01fcCkgKyBfTV9vZmZzZXQgLSBfX3guX01fb2Zmc2V0OwotICB9Ci19OwotCi1pbmxpbmUgYm9vbCAgX1NUTFBfQ0FMTCBvcGVyYXRvcj09KGNvbnN0IF9CaXRfaXRlcmF0b3JfYmFzZSYgX194LCBjb25zdCBfQml0X2l0ZXJhdG9yX2Jhc2UmIF9feSkgewotICByZXR1cm4gX195Ll9NX3AgPT0gX194Ll9NX3AgJiYgX195Ll9NX29mZnNldCA9PSBfX3guX01fb2Zmc2V0OwotfQotaW5saW5lIGJvb2wgIF9TVExQX0NBTEwgb3BlcmF0b3IhPShjb25zdCBfQml0X2l0ZXJhdG9yX2Jhc2UmIF9feCwgY29uc3QgX0JpdF9pdGVyYXRvcl9iYXNlJiBfX3kpIHsKLSAgcmV0dXJuIF9feS5fTV9wICE9IF9feC5fTV9wIHx8IF9feS5fTV9vZmZzZXQgIT0gX194Ll9NX29mZnNldDsKLX0KLQotaW5saW5lIGJvb2wgX1NUTFBfQ0FMTCBvcGVyYXRvcjwoY29uc3QgX0JpdF9pdGVyYXRvcl9iYXNlJiBfX3gsIGNvbnN0IF9CaXRfaXRlcmF0b3JfYmFzZSYgX195KSB7Ci0gIHJldHVybiBfX3guX01fcCA8IF9feS5fTV9wIHx8IChfX3guX01fcCA9PSBfX3kuX01fcCAmJiBfX3guX01fb2Zmc2V0IDwgX195Ll9NX29mZnNldCk7Ci19Ci0KLWlubGluZSBib29sIF9TVExQX0NBTEwgb3BlcmF0b3I+KGNvbnN0IF9CaXRfaXRlcmF0b3JfYmFzZSYgX194LCBjb25zdCBfQml0X2l0ZXJhdG9yX2Jhc2UmIF9feSkgIHsKLSAgcmV0dXJuIG9wZXJhdG9yIDwoX195ICwgX194KTsKLX0KLWlubGluZSBib29sIF9TVExQX0NBTEwgb3BlcmF0b3I8PShjb25zdCBfQml0X2l0ZXJhdG9yX2Jhc2UmIF9feCwgY29uc3QgX0JpdF9pdGVyYXRvcl9iYXNlJiBfX3kpIHsKLSAgcmV0dXJuICEoX195IDwgX194KTsKLX0KLWlubGluZSBib29sIF9TVExQX0NBTEwgb3BlcmF0b3I+PShjb25zdCBfQml0X2l0ZXJhdG9yX2Jhc2UmIF9feCwgY29uc3QgX0JpdF9pdGVyYXRvcl9iYXNlJiBfX3kpIHsKLSAgcmV0dXJuICEoX194IDwgX195KTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9SZWYsIGNsYXNzIF9QdHI+Ci1zdHJ1Y3QgX0JpdF9pdGVyIDogcHVibGljIF9CaXRfaXRlcmF0b3JfYmFzZSB7Ci0gIHR5cGVkZWYgX1JlZiAgcmVmZXJlbmNlOwotICB0eXBlZGVmIF9QdHIgIHBvaW50ZXI7Ci0gIHR5cGVkZWYgX0JpdF9pdGVyPF9SZWYsIF9QdHI+IF9TZWxmOwotICB0eXBlZGVmIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OwotICB0eXBlZGVmIGJvb2wgdmFsdWVfdHlwZTsKLSAgdHlwZWRlZiBwdHJkaWZmX3QgZGlmZmVyZW5jZV90eXBlOwotICB0eXBlZGVmIHNpemVfdCBzaXplX3R5cGU7Ci0KLSAgX0JpdF9pdGVyKHVuc2lnbmVkIGludCogX194LCB1bnNpZ25lZCBpbnQgX195KSA6IF9CaXRfaXRlcmF0b3JfYmFzZShfX3gsIF9feSkge30KLSAgX0JpdF9pdGVyKCkge30KLQotICBfQml0X2l0ZXIoY29uc3QgX0JpdF9pdGVyPF9CaXRfcmVmZXJlbmNlLCBfQml0X3JlZmVyZW5jZSo+JiBfX3gpOgotICAgIF9CaXRfaXRlcmF0b3JfYmFzZSgoY29uc3QgX0JpdF9pdGVyYXRvcl9iYXNlJilfX3gpIHt9Ci0KLSAgLy8gIF9TZWxmJiBvcGVyYXRvciA9IChjb25zdCBfQml0X2l0ZXI8X0JpdF9yZWZlcmVuY2UsIF9CaXRfcmVmZXJlbmNlKj4mIF9feCkKLSAgLy8gICB7IChfQml0X2l0ZXJhdG9yX2Jhc2UmKSp0aGlzID0gKGNvbnN0IF9CaXRfaXRlcmF0b3JfYmFzZSYpX194OyByZXR1cm4gKnRoaXM7IH0KLQotICByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3QgewotICAgIHJldHVybiBfQml0X3JlZmVyZW5jZShfTV9wLCAxVUwgPDwgX01fb2Zmc2V0KTsKLSAgfQotICBfU2VsZiYgb3BlcmF0b3IrKygpIHsKLSAgICBfTV9idW1wX3VwKCk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIF9TZWxmIG9wZXJhdG9yKysoaW50KSB7Ci0gICAgX1NlbGYgX190bXAgPSAqdGhpczsKLSAgICBfTV9idW1wX3VwKCk7Ci0gICAgcmV0dXJuIF9fdG1wOwotICB9Ci0gIF9TZWxmJiBvcGVyYXRvci0tKCkgewotICAgIF9NX2J1bXBfZG93bigpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotICBfU2VsZiBvcGVyYXRvci0tKGludCkgewotICAgIF9TZWxmIF9fdG1wID0gKnRoaXM7Ci0gICAgX01fYnVtcF9kb3duKCk7Ci0gICAgcmV0dXJuIF9fdG1wOwotICB9Ci0gIF9TZWxmJiBvcGVyYXRvcis9KGRpZmZlcmVuY2VfdHlwZSBfX2kpIHsKLSAgICBfTV9hZHZhbmNlKF9faSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIF9TZWxmJiBvcGVyYXRvci09KGRpZmZlcmVuY2VfdHlwZSBfX2kpIHsKLSAgICAqdGhpcyArPSAtX19pOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotICBfU2VsZiBvcGVyYXRvcisoZGlmZmVyZW5jZV90eXBlIF9faSkgY29uc3QgewotICAgIF9TZWxmIF9fdG1wID0gKnRoaXM7Ci0gICAgcmV0dXJuIF9fdG1wICs9IF9faTsKLSAgfQotICBfU2VsZiBvcGVyYXRvci0oZGlmZmVyZW5jZV90eXBlIF9faSkgY29uc3QgewotICAgIF9TZWxmIF9fdG1wID0gKnRoaXM7Ci0gICAgcmV0dXJuIF9fdG1wIC09IF9faTsKLSAgfQotICBkaWZmZXJlbmNlX3R5cGUgb3BlcmF0b3ItKGNvbnN0IF9TZWxmJiBfX3gpIGNvbnN0IHsKLSAgICByZXR1cm4gX01fc3VidHJhY3QoX194KTsKLSAgfQotICByZWZlcmVuY2Ugb3BlcmF0b3JbXShkaWZmZXJlbmNlX3R5cGUgX19pKSB7IHJldHVybiAqKCp0aGlzICsgX19pKTsgfQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIF9SZWYsIGNsYXNzIF9QdHI+Ci1pbmxpbmUgX0JpdF9pdGVyPF9SZWYsX1B0cj4gIF9TVExQX0NBTEwKLW9wZXJhdG9yKyhwdHJkaWZmX3QgX19uLCBjb25zdCBfQml0X2l0ZXI8X1JlZiwgX1B0cj4mIF9feCkgewotICAgcmV0dXJuIF9feCArIF9fbjsKLX0KLQotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQotdGVtcGxhdGUgPGNsYXNzIF9SZWYsIGNsYXNzIF9QdHI+Ci1zdHJ1Y3QgX190eXBlX3RyYWl0czwgX1NUTFBfUFJJViBfQml0X2l0ZXI8X1JlZiwgX1B0cj4gPiB7Ci0gIHR5cGVkZWYgX19mYWxzZV90eXBlICAgaGFzX3RyaXZpYWxfZGVmYXVsdF9jb25zdHJ1Y3RvcjsKLSAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yOwotICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3I7Ci0gIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjsKLSAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgICBpc19QT0RfdHlwZTsKLX07Ci0jZW5kaWYgLyogX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTiAqLwotCi0jaWYgZGVmaW5lZCAoX1NUTFBfVVNFX09MRF9IUF9JVEVSQVRPUl9RVUVSSUVTKQotaW5saW5lIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5KGNvbnN0IF9TVExQX1BSSVYgX0JpdF9pdGVyYXRvcl9iYXNlJikKLXsgcmV0dXJuIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKCk7IH0KLWlubGluZSBwdHJkaWZmX3QqIGRpc3RhbmNlX3R5cGUoY29uc3QgX1NUTFBfUFJJViBfQml0X2l0ZXJhdG9yX2Jhc2UmKQoteyByZXR1cm4gKHB0cmRpZmZfdCopMDsgfQotaW5saW5lIGJvb2wqIHZhbHVlX3R5cGUoY29uc3QgX1NUTFBfUFJJViBfQml0X2l0ZXI8X1NUTFBfUFJJViBfQml0X3JlZmVyZW5jZSwgX1NUTFBfUFJJViBfQml0X3JlZmVyZW5jZSo+JikKLXsgcmV0dXJuIChib29sKikwOyB9Ci1pbmxpbmUgYm9vbCogdmFsdWVfdHlwZShjb25zdCBfU1RMUF9QUklWIF9CaXRfaXRlcjxib29sLCBjb25zdCBib29sKj4mKQoteyByZXR1cm4gKGJvb2wqKTA7IH0KLSNlbmRpZgotCi1fU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCi0KLXR5cGVkZWYgX0JpdF9pdGVyPGJvb2wsIGNvbnN0IGJvb2wqPiBfQml0X2NvbnN0X2l0ZXJhdG9yOwotdHlwZWRlZiBfQml0X2l0ZXI8X0JpdF9yZWZlcmVuY2UsIF9CaXRfcmVmZXJlbmNlKj4gX0JpdF9pdGVyYXRvcjsKLQotLy8gQml0LXZlY3RvciBiYXNlIGNsYXNzLCB3aGljaCBlbmNhcHN1bGF0ZXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbgotLy8gIG9sZCBTR0ktc3R5bGUgYWxsb2NhdG9ycyBhbmQgc3RhbmRhcmQtY29uZm9ybWluZyBhbGxvY2F0b3JzLgotdGVtcGxhdGUgPGNsYXNzIF9BbGxvYz4KLWNsYXNzIF9CdmVjdG9yX2Jhc2UgewotICB0eXBlZGVmIF9CdmVjdG9yX2Jhc2U8X0FsbG9jPiBfU2VsZjsKLXB1YmxpYzoKLSAgX1NUTFBfRk9SQ0VfQUxMT0NBVE9SUyhib29sLCBfQWxsb2MpCi0gIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jX3RyYWl0czxib29sLCBfQWxsb2M+OjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKLSAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgX19jaHVua190eXBlOwotICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY190cmFpdHM8X19jaHVua190eXBlLAotICAgICAgICAgIF9BbGxvYz46OmFsbG9jYXRvcl90eXBlIF9fY2h1bmtfYWxsb2NhdG9yX3R5cGU7Ci0gIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdCB7Ci0gICAgcmV0dXJuIF9TVExQX0NPTlZFUlRfQUxMT0NBVE9SKChjb25zdCBfX2NodW5rX2FsbG9jYXRvcl90eXBlJilfTV9lbmRfb2Zfc3RvcmFnZSwgYm9vbCk7Ci0gIH0KLSAgc3RhdGljIGFsbG9jYXRvcl90eXBlIF9fZ2V0X2RmbF9hbGxvY2F0b3IoKSB7IHJldHVybiBhbGxvY2F0b3JfdHlwZSgpOyB9Ci0KLSAgX0J2ZWN0b3JfYmFzZShjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQotICAgIDogX01fc3RhcnQoKSwgX01fZmluaXNoKCksIF9NX2VuZF9vZl9zdG9yYWdlKF9TVExQX0NPTlZFUlRfQUxMT0NBVE9SKF9fYSwgX19jaHVua190eXBlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19jaHVua190eXBlKikwKQotICB7fQotICBfQnZlY3Rvcl9iYXNlKF9fbW92ZV9zb3VyY2U8X1NlbGY+IHNyYykKLSAgICA6IF9NX3N0YXJ0KHNyYy5nZXQoKS5fTV9zdGFydCksIF9NX2ZpbmlzaChzcmMuZ2V0KCkuX01fZmluaXNoKSwKLSAgICAgIF9NX2VuZF9vZl9zdG9yYWdlKHNyYy5nZXQoKS5fTV9lbmRfb2Zfc3RvcmFnZSkgewotICAgIC8vTWFrZSB0aGUgc291cmNlIGRlc3Ryb3lhYmxlCi0gICAgc3JjLmdldCgpLl9NX3N0YXJ0Ll9NX3AgPSAwOwotICB9Ci0KLSAgfl9CdmVjdG9yX2Jhc2UoKSB7Ci0gICAgX01fZGVhbGxvY2F0ZSgpOwotICB9Ci0KLXByb3RlY3RlZDoKLQotICB1bnNpZ25lZCBpbnQqIF9NX2JpdF9hbGxvYyhzaXplX3QgX19uKSB7Ci0gICAgcmV0dXJuIF9NX2VuZF9vZl9zdG9yYWdlLmFsbG9jYXRlKChfX24gKyBfU1RMUF9XT1JEX0JJVCAtIDEpL19TVExQX1dPUkRfQklUKTsKLSAgfQotICB2b2lkIF9NX2RlYWxsb2NhdGUoKSB7Ci0gICAgaWYgKF9NX3N0YXJ0Ll9NX3ApCi0gICAgICBfTV9lbmRfb2Zfc3RvcmFnZS5kZWFsbG9jYXRlKF9NX3N0YXJ0Ll9NX3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NX2VuZF9vZl9zdG9yYWdlLl9NX2RhdGEgLSBfTV9zdGFydC5fTV9wKTsKLSAgfQotCi0gIF9CaXRfaXRlcmF0b3IgX01fc3RhcnQ7Ci0gIF9CaXRfaXRlcmF0b3IgX01fZmluaXNoOwotICBfU1RMUF9hbGxvY19wcm94eTxfX2NodW5rX3R5cGUqLCBfX2NodW5rX3R5cGUsIF9fY2h1bmtfYWxsb2NhdG9yX3R5cGU+IF9NX2VuZF9vZl9zdG9yYWdlOwotfTsKLQotCi0vLyBUaGUgbmV4dCBmZXcgbGluZXMgYXJlIGNvbmZ1c2luZy4gIFdoYXQgd2UncmUgZG9pbmcgaXMgZGVjbGFyaW5nIGEKLS8vICBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIG9mIHZlY3RvcjxULCBBbGxvYz4gaWYgd2UgaGF2ZSB0aGUgbmVjZXNzYXJ5Ci0vLyAgY29tcGlsZXIgc3VwcG9ydC4gIE90aGVyd2lzZSwgd2UgZGVmaW5lIGEgY2xhc3MgYml0X3ZlY3RvciB3aGljaCB1c2VzCi0vLyAgdGhlIGRlZmF1bHQgYWxsb2NhdG9yLgotCi0jaWYgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikgJiYgIWRlZmluZWQgKF9TVExQX05PX0JPT0wpICYmICFkZWZpbmVkIChfX1NVTlBST19DQykKLSMgIGRlZmluZSBfU1RMUF9WRUNCT09MX1RFTVBMQVRFCi0jICBkZWZpbmUgX19CVkVDX1RNUExfSEVBREVSIHRlbXBsYXRlIDxjbGFzcyBfQWxsb2M+Ci0jZWxzZQotIyAgdW5kZWYgX1NUTFBfVkVDQk9PTF9URU1QTEFURQotIyAgaWZkZWYgX1NUTFBfTk9fQk9PTAotIyAgICBkZWZpbmUgX19CVkVDX1RNUExfSEVBREVSCi0jICBlbHNlCi0jICAgIGRlZmluZSBfX0JWRUNfVE1QTF9IRUFERVIgX1NUTFBfVEVNUExBVEVfTlVMTAotIyAgZW5kaWYKLSMgIGlmICEoZGVmaW5lZChfX01SQ19fKXx8KGRlZmluZWQoX19TQ19fKSYmIWRlZmluZWQoX19ETUNfXykpKSAgICAgIC8vKlRZIDEyLzE3LzIwMDAgLQotIyAgICBkZWZpbmUgX0FsbG9jIF9TVExQX0RFRkFVTFRfQUxMT0NBVE9SKGJvb2wpCi0jICBlbHNlCi0jICAgIGRlZmluZSBfQWxsb2MgYWxsb2NhdG9yPGJvb2w+Ci0jICBlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9ERUJVRykKLSMgIGRlZmluZSB2ZWN0b3IgX1NUTFBfTk9OX0RCR19OQU1FKHZlY3RvcikKLSNlbmRpZgotCi0jaWZkZWYgX1NUTFBfTk9fQk9PTAotIyAgZGVmaW5lIF9fQlZFQ1RPUl9RVUFMSUZJRUQgYml0X3ZlY3RvcgotIyAgZGVmaW5lIF9fQlZFQ1RPUiAgICAgICAgICAgYml0X3ZlY3RvcgotI2Vsc2UKLSMgIGlmZGVmIF9TVExQX1ZFQ0JPT0xfVEVNUExBVEUKLSMgICAgZGVmaW5lIF9fQlZFQ1RPUl9RVUFMSUZJRUQgdmVjdG9yPGJvb2wsIF9BbGxvYz4KLSMgIGVsc2UKLSMgICAgZGVmaW5lIF9fQlZFQ1RPUl9RVUFMSUZJRUQgdmVjdG9yPGJvb2wsIGFsbG9jYXRvcjxib29sPiA+Ci0jICBlbmRpZgotIyAgaWYgZGVmaW5lZCAoX1NUTFBfUEFSVElBTF9TUEVDX05FRURTX1RFTVBMQVRFX0FSR1MpCi0jICAgIGRlZmluZSBfX0JWRUNUT1IgX19CVkVDVE9SX1FVQUxJRklFRAotIyAgZWxzZQotIyAgICBkZWZpbmUgX19CVkVDVE9SIHZlY3RvcgotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQgKF9TVExQX0RFQlVHKSB8fCBkZWZpbmVkIChfU1RMUF9OT19CT09MKQotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi0jZW5kaWYKLQotX19CVkVDX1RNUExfSEVBREVSCi1jbGFzcyBfX0JWRUNUT1JfUVVBTElGSUVEIDogcHVibGljIF9TVExQX1BSSVYgX0J2ZWN0b3JfYmFzZTxfQWxsb2MgPgotI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QQVJUSUFMX1NQRUNfV09SS0FST1VORCkgJiYgIWRlZmluZWQgKF9TVExQX0RFQlVHKQotICAgICAgICAgICAgICAgICAgICAgICAgICAsIHB1YmxpYyBfX3N0bHBvcnRfY2xhc3M8IF9fQlZFQ1RPUl9RVUFMSUZJRUQgPgotI2VuZGlmCi17Ci0gIHR5cGVkZWYgX1NUTFBfUFJJViBfQnZlY3Rvcl9iYXNlPF9BbGxvYyA+IF9CYXNlOwotICB0eXBlZGVmIF9fQlZFQ1RPUl9RVUFMSUZJRUQgX1NlbGY7Ci1wdWJsaWM6Ci0gIHR5cGVkZWYgYm9vbCB2YWx1ZV90eXBlOwotICB0eXBlZGVmIHNpemVfdCBzaXplX3R5cGU7Ci0gIHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKLSAgdHlwZWRlZiBfU1RMUF9QUklWIF9CaXRfcmVmZXJlbmNlIHJlZmVyZW5jZTsKLSAgdHlwZWRlZiBib29sIGNvbnN0X3JlZmVyZW5jZTsKLSAgdHlwZWRlZiBfU1RMUF9QUklWIF9CaXRfcmVmZXJlbmNlKiBwb2ludGVyOwotICB0eXBlZGVmIGNvbnN0IGJvb2wqIGNvbnN0X3BvaW50ZXI7Ci0gIHR5cGVkZWYgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgX0l0ZXJhdG9yX2NhdGVnb3J5OwotCi0gIHR5cGVkZWYgX1NUTFBfUFJJViBfQml0X2l0ZXJhdG9yICAgICAgICAgIGl0ZXJhdG9yOwotICB0eXBlZGVmIF9TVExQX1BSSVYgX0JpdF9jb25zdF9pdGVyYXRvciAgICBjb25zdF9pdGVyYXRvcjsKLQotICBfU1RMUF9ERUNMQVJFX1JBTkRPTV9BQ0NFU1NfUkVWRVJTRV9JVEVSQVRPUlM7Ci0KLSNpZmRlZiBfU1RMUF9WRUNCT09MX1RFTVBMQVRFCi0gIHR5cGVkZWYgdHlwZW5hbWUgX1NUTFBfUFJJViBfQnZlY3Rvcl9iYXNlPF9BbGxvYyA+OjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfU1RMUF9QUklWIF9CdmVjdG9yX2Jhc2U8X0FsbG9jID46Ol9fY2h1bmtfdHlwZSBfX2NodW5rX3R5cGU7Ci0jZWxzZQotICB0eXBlZGVmIF9TVExQX1BSSVYgX0J2ZWN0b3JfYmFzZTxfQWxsb2MgPjo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7Ci0gIHR5cGVkZWYgX1NUTFBfUFJJViBfQnZlY3Rvcl9iYXNlPF9BbGxvYyA+OjpfX2NodW5rX3R5cGUgX19jaHVua190eXBlOwotI2VuZGlmCi0KLXByb3RlY3RlZDoKLQotICB2b2lkIF9NX2luaXRpYWxpemUoc2l6ZV90eXBlIF9fbikgewotICAgIHVuc2lnbmVkIGludCogX19xID0gdGhpcy0+X01fYml0X2FsbG9jKF9fbik7Ci0gICAgdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuX01fZGF0YSA9IF9fcSArIChfX24gKyBfU1RMUF9XT1JEX0JJVCAtIDEpL19TVExQX1dPUkRfQklUOwotICAgIHRoaXMtPl9NX3N0YXJ0ID0gaXRlcmF0b3IoX19xLCAwKTsKLSAgICB0aGlzLT5fTV9maW5pc2ggPSB0aGlzLT5fTV9zdGFydCArIGRpZmZlcmVuY2VfdHlwZShfX24pOwotICB9Ci0gIHZvaWQgX01faW5zZXJ0X2F1eChpdGVyYXRvciBfX3Bvc2l0aW9uLCBib29sIF9feCkgewotICAgIGlmICh0aGlzLT5fTV9maW5pc2guX01fcCAhPSB0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5fTV9kYXRhKSB7Ci0gICAgICBfU1RMUF9QUklWIF9fY29weV9iYWNrd2FyZChfX3Bvc2l0aW9uLCB0aGlzLT5fTV9maW5pc2gsIHRoaXMtPl9NX2ZpbmlzaCArIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZygpLCAoZGlmZmVyZW5jZV90eXBlKikwICk7Ci0gICAgICAqX19wb3NpdGlvbiA9IF9feDsKLSAgICAgICsrdGhpcy0+X01fZmluaXNoOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIHNpemVfdHlwZSBfX2xlbiA9IHNpemUoKSA/IDIgKiBzaXplKCkgOiBfU1RMUF9XT1JEX0JJVDsKLSAgICAgIHVuc2lnbmVkIGludCogX19xID0gdGhpcy0+X01fYml0X2FsbG9jKF9fbGVuKTsKLSAgICAgIGl0ZXJhdG9yIF9faSA9IGNvcHkoYmVnaW4oKSwgX19wb3NpdGlvbiwgaXRlcmF0b3IoX19xLCAwKSk7Ci0gICAgICAqX19pKysgPSBfX3g7Ci0gICAgICB0aGlzLT5fTV9maW5pc2ggPSBjb3B5KF9fcG9zaXRpb24sIGVuZCgpLCBfX2kpOwotICAgICAgdGhpcy0+X01fZGVhbGxvY2F0ZSgpOwotICAgICAgdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuX01fZGF0YSA9IF9fcSArIChfX2xlbiArIF9TVExQX1dPUkRfQklUIC0gMSkvX1NUTFBfV09SRF9CSVQ7Ci0gICAgICB0aGlzLT5fTV9zdGFydCA9IGl0ZXJhdG9yKF9fcSwgMCk7Ci0gICAgfQotICB9Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Ci0gIHZvaWQgX01faW5pdGlhbGl6ZV9yYW5nZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnB1dF9pdGVyYXRvcl90YWcgJikgewotICAgIHRoaXMtPl9NX3N0YXJ0ID0gaXRlcmF0b3IoKTsKLSAgICB0aGlzLT5fTV9maW5pc2ggPSBpdGVyYXRvcigpOwotICAgIHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLl9NX2RhdGEgPSAwOwotICAgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKLSAgICAgIHB1c2hfYmFjaygqX19maXJzdCk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KLSAgdm9pZCBfTV9pbml0aWFsaXplX3JhbmdlKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3J3YXJkX2l0ZXJhdG9yX3RhZyAmKSB7Ci0gICAgc2l6ZV90eXBlIF9fbiA9IGRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7Ci0gICAgX01faW5pdGlhbGl6ZShfX24pOwotICAgIGNvcHkoX19maXJzdCwgX19sYXN0LCB0aGlzLT5fTV9zdGFydCk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Ci0gIHZvaWQgX01faW5zZXJ0X3JhbmdlKGl0ZXJhdG9yIF9fcG9zLAotICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0X2l0ZXJhdG9yX3RhZyAmKSB7Ci0gICAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KSB7Ci0gICAgICBfX3BvcyA9IGluc2VydChfX3BvcywgKl9fZmlyc3QpOwotICAgICAgKytfX3BvczsKLSAgICB9Ci0gIH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KLSAgdm9pZCBfTV9pbnNlcnRfcmFuZ2UoaXRlcmF0b3IgX19wb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9yd2FyZF9pdGVyYXRvcl90YWcgJikgewotICAgIGlmIChfX2ZpcnN0ICE9IF9fbGFzdCkgewotICAgICAgc2l6ZV90eXBlIF9fbiA9IGRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7Ci0gICAgICBpZiAoY2FwYWNpdHkoKSAtIHNpemUoKSA+PSBfX24pIHsKLSAgICAgICAgX1NUTFBfUFJJViBfX2NvcHlfYmFja3dhcmQoX19wb3NpdGlvbiwgZW5kKCksIHRoaXMtPl9NX2ZpbmlzaCArIGRpZmZlcmVuY2VfdHlwZShfX24pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZygpLCAoZGlmZmVyZW5jZV90eXBlKikwICk7Ci0gICAgICAgIGNvcHkoX19maXJzdCwgX19sYXN0LCBfX3Bvc2l0aW9uKTsKLSAgICAgICAgdGhpcy0+X01fZmluaXNoICs9IGRpZmZlcmVuY2VfdHlwZShfX24pOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIHNpemVfdHlwZSBfX2xlbiA9IHNpemUoKSArIChtYXgpKHNpemUoKSwgX19uKTsKLSAgICAgICAgdW5zaWduZWQgaW50KiBfX3EgPSB0aGlzLT5fTV9iaXRfYWxsb2MoX19sZW4pOwotICAgICAgICBpdGVyYXRvciBfX2kgPSBjb3B5KGJlZ2luKCksIF9fcG9zaXRpb24sIGl0ZXJhdG9yKF9fcSwgMCkpOwotICAgICAgICBfX2kgPSBjb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19pKTsKLSAgICAgICAgdGhpcy0+X01fZmluaXNoID0gY29weShfX3Bvc2l0aW9uLCBlbmQoKSwgX19pKTsKLSAgICAgICAgdGhpcy0+X01fZGVhbGxvY2F0ZSgpOwotICAgICAgICB0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5fTV9kYXRhID0gX19xICsgKF9fbGVuICsgX1NUTFBfV09SRF9CSVQgLSAxKS9fU1RMUF9XT1JEX0JJVDsKLSAgICAgICAgdGhpcy0+X01fc3RhcnQgPSBpdGVyYXRvcihfX3EsIDApOwotICAgICAgfQotICAgIH0KLSAgfQotCi0jZW5kaWYgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLwotCi1wdWJsaWM6Ci0gIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gdGhpcy0+X01fc3RhcnQ7IH0KLSAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiB0aGlzLT5fTV9zdGFydDsgfQotICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiB0aGlzLT5fTV9maW5pc2g7IH0KLSAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gdGhpcy0+X01fZmluaXNoOyB9Ci0KLSAgcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQotICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0IHsKLSAgICByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7Ci0gIH0KLSAgcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQotICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7Ci0gIH0KLQotICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHNpemVfdHlwZShlbmQoKSAtIGJlZ2luKCkpOyB9Ci0gIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHNpemVfdHlwZSgtMSk7IH0KLSAgc2l6ZV90eXBlIGNhcGFjaXR5KCkgY29uc3QgewotICAgIHJldHVybiBzaXplX3R5cGUoY29uc3RfaXRlcmF0b3IodGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuX01fZGF0YSwgMCkgLSBiZWdpbigpKTsKLSAgfQotICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gYmVnaW4oKSA9PSBlbmQoKTsgfQotICByZWZlcmVuY2Ugb3BlcmF0b3JbXShzaXplX3R5cGUgX19uKQotICB7IHJldHVybiAqKGJlZ2luKCkgKyBkaWZmZXJlbmNlX3R5cGUoX19uKSk7IH0KLSAgY29uc3RfcmVmZXJlbmNlIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fbikgY29uc3QKLSAgeyByZXR1cm4gKihiZWdpbigpICsgZGlmZmVyZW5jZV90eXBlKF9fbikpOyB9Ci0KLSAgdm9pZCBfTV9yYW5nZV9jaGVjayhzaXplX3R5cGUgX19uKSBjb25zdCB7Ci0gICAgaWYgKF9fbiA+PSB0aGlzLT5zaXplKCkpCi0gICAgICBfX3N0bF90aHJvd19yYW5nZV9lcnJvcigidmVjdG9yPGJvb2w+Iik7Ci0gIH0KLQotICByZWZlcmVuY2UgYXQoc2l6ZV90eXBlIF9fbikKLSAgICB7IF9NX3JhbmdlX2NoZWNrKF9fbik7IHJldHVybiAoKnRoaXMpW19fbl07IH0KLSAgY29uc3RfcmVmZXJlbmNlIGF0KHNpemVfdHlwZSBfX24pIGNvbnN0Ci0gICAgeyBfTV9yYW5nZV9jaGVjayhfX24pOyByZXR1cm4gKCp0aGlzKVtfX25dOyB9Ci0KLSAgZXhwbGljaXQgX19CVkVDVE9SKGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQotICAgIDogX1NUTFBfUFJJViBfQnZlY3Rvcl9iYXNlPF9BbGxvYyA+KF9fYSkge30KLQotICBfX0JWRUNUT1Ioc2l6ZV90eXBlIF9fbiwgYm9vbCBfX3ZhbCwKLSAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQotICAgIDogX1NUTFBfUFJJViBfQnZlY3Rvcl9iYXNlPF9BbGxvYyA+KF9fYSkgewotICAgIF9NX2luaXRpYWxpemUoX19uKTsKLSAgICBmaWxsKHRoaXMtPl9NX3N0YXJ0Ll9NX3AsIChfX2NodW5rX3R5cGUqKSh0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5fTV9kYXRhKSwgX192YWwgPyB+MCA6IDApOwotICB9Ci0KLSAgZXhwbGljaXQgX19CVkVDVE9SKHNpemVfdHlwZSBfX24pCi0gICAgOiBfU1RMUF9QUklWIF9CdmVjdG9yX2Jhc2U8X0FsbG9jID4oYWxsb2NhdG9yX3R5cGUoKSkgewotICAgIF9NX2luaXRpYWxpemUoX19uKTsKLSAgICBmaWxsKHRoaXMtPl9NX3N0YXJ0Ll9NX3AsIChfX2NodW5rX3R5cGUqKSh0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5fTV9kYXRhKSwgMCk7Ci0gIH0KLQotICBfX0JWRUNUT1IoY29uc3QgX1NlbGYmIF9feCkKLSAgICA6IF9TVExQX1BSSVYgX0J2ZWN0b3JfYmFzZTxfQWxsb2MgPihfX3guZ2V0X2FsbG9jYXRvcigpKSB7Ci0gICAgX01faW5pdGlhbGl6ZShfX3guc2l6ZSgpKTsKLSAgICBjb3B5KF9feC5iZWdpbigpLCBfX3guZW5kKCksIHRoaXMtPl9NX3N0YXJ0KTsKLSAgfQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2VyPgotICB2b2lkIF9NX2luaXRpYWxpemVfZGlzcGF0Y2goX0ludGVnZXIgX19uLCBfSW50ZWdlciBfX3gsIGNvbnN0IF9fdHJ1ZV90eXBlJikgewotICAgIF9NX2luaXRpYWxpemUoX19uKTsKLSAgICBmaWxsKHRoaXMtPl9NX3N0YXJ0Ll9NX3AsIHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLl9NX2RhdGEsIF9feCA/IH4wIDogMCk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Ci0gIHZvaWQgX01faW5pdGlhbGl6ZV9kaXNwYXRjaChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2ZhbHNlX3R5cGUmKSB7Ci0gICAgX01faW5pdGlhbGl6ZV9yYW5nZShfX2ZpcnN0LCBfX2xhc3QsIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yKSk7Ci0gIH0KLSMgIGlmIGRlZmluZWQgKF9TVExQX05FRURTX0VYVFJBX1RFTVBMQVRFX0NPTlNUUlVDVE9SUykKLSAgLy8gQ2hlY2sgd2hldGhlciBpdCdzIGFuIGludGVncmFsIHR5cGUuICBJZiBzbywgaXQncyBub3QgYW4gaXRlcmF0b3IuCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KLSAgX19CVkVDVE9SKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKLSAgICA6IF9TVExQX1BSSVYgX0J2ZWN0b3JfYmFzZTxfQWxsb2MgPihhbGxvY2F0b3JfdHlwZSgpKSB7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBfSXNJbnRlZ3JhbDxfSW5wdXRJdGVyYXRvcj46Ol9SZXQgX0ludGVncmFsOwotICAgIF9NX2luaXRpYWxpemVfZGlzcGF0Y2goX19maXJzdCwgX19sYXN0LCBfSW50ZWdyYWwoKSk7Ci0gIH0KLSMgIGVuZGlmCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KLSAgX19CVkVDVE9SKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKLSAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgX1NUTFBfQUxMT0NBVE9SX1RZUEVfREZMKQotICAgIDogX1NUTFBfUFJJViBfQnZlY3Rvcl9iYXNlPF9BbGxvYyA+KF9fYSkgewotICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lzSW50ZWdyYWw8X0lucHV0SXRlcmF0b3I+OjpfUmV0IF9JbnRlZ3JhbDsKLSAgICBfTV9pbml0aWFsaXplX2Rpc3BhdGNoKF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOwotICB9Ci0jZWxzZSAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCi0gIF9fQlZFQ1RPUihjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QsCi0gICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKLSAgICA6IF9TVExQX1BSSVYgX0J2ZWN0b3JfYmFzZTxfQWxsb2MgPihfX2EpIHsKLSAgICBzaXplX3R5cGUgX19uID0gZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KTsKLSAgICBfTV9pbml0aWFsaXplKF9fbik7Ci0gICAgY29weShfX2ZpcnN0LCBfX2xhc3QsIHRoaXMtPl9NX3N0YXJ0KTsKLSAgfQotICBfX0JWRUNUT1IoY29uc3QgYm9vbCogX19maXJzdCwgY29uc3QgYm9vbCogX19sYXN0LAotICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCi0gICAgOiBfU1RMUF9QUklWIF9CdmVjdG9yX2Jhc2U8X0FsbG9jID4oX19hKSB7Ci0gICAgc2l6ZV90eXBlIF9fbiA9IGRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7Ci0gICAgX01faW5pdGlhbGl6ZShfX24pOwotICAgIGNvcHkoX19maXJzdCwgX19sYXN0LCB0aGlzLT5fTV9zdGFydCk7Ci0gIH0KLSNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCi0KLSAgX19CVkVDVE9SKF9fbW92ZV9zb3VyY2U8X1NlbGY+IHNyYykKLSAgICA6IF9TVExQX1BSSVYgX0J2ZWN0b3JfYmFzZTxfQWxsb2MgPihfX21vdmVfc291cmNlPF9CYXNlPihzcmMuZ2V0KCkpKSB7fQotCi0gIH5fX0JWRUNUT1IoKSB7fQotCi0gIF9fQlZFQ1RPUl9RVUFMSUZJRUQmIG9wZXJhdG9yPShjb25zdCBfX0JWRUNUT1JfUVVBTElGSUVEJiBfX3gpIHsKLSAgICBpZiAoJl9feCA9PSB0aGlzKSByZXR1cm4gKnRoaXM7Ci0gICAgaWYgKF9feC5zaXplKCkgPiBjYXBhY2l0eSgpKSB7Ci0gICAgICB0aGlzLT5fTV9kZWFsbG9jYXRlKCk7Ci0gICAgICBfTV9pbml0aWFsaXplKF9feC5zaXplKCkpOwotICAgIH0KLSAgICBjb3B5KF9feC5iZWdpbigpLCBfX3guZW5kKCksIGJlZ2luKCkpOwotICAgIHRoaXMtPl9NX2ZpbmlzaCA9IGJlZ2luKCkgKyBkaWZmZXJlbmNlX3R5cGUoX194LnNpemUoKSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgLy8gYXNzaWduKCksIGEgZ2VuZXJhbGl6ZWQgYXNzaWdubWVudCBtZW1iZXIgZnVuY3Rpb24uICBUd28KLSAgLy8gdmVyc2lvbnM6IG9uZSB0aGF0IHRha2VzIGEgY291bnQsIGFuZCBvbmUgdGhhdCB0YWtlcyBhIHJhbmdlLgotICAvLyBUaGUgcmFuZ2UgdmVyc2lvbiBpcyBhIG1lbWJlciB0ZW1wbGF0ZSwgc28gd2UgZGlzcGF0Y2ggb24gd2hldGhlcgotICAvLyBvciBub3QgdGhlIHR5cGUgaXMgYW4gaW50ZWdlci4KLQotICB2b2lkIF9NX2ZpbGxfYXNzaWduKHNpemVfdCBfX24sIGJvb2wgX194KSB7Ci0gICAgaWYgKF9fbiA+IHNpemUoKSkgewotICAgICAgZmlsbCh0aGlzLT5fTV9zdGFydC5fTV9wLCAoX19jaHVua190eXBlKikodGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuX01fZGF0YSksIF9feCA/IH4wIDogMCk7Ci0gICAgICBpbnNlcnQoZW5kKCksIF9fbiAtIHNpemUoKSwgX194KTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBlcmFzZShiZWdpbigpICsgX19uLCBlbmQoKSk7Ci0gICAgICBmaWxsKHRoaXMtPl9NX3N0YXJ0Ll9NX3AsIChfX2NodW5rX3R5cGUqKSh0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5fTV9kYXRhKSwgX194ID8gfjAgOiAwKTsKLSAgICB9Ci0gIH0KLSAgdm9pZCBhc3NpZ24oc2l6ZV90IF9fbiwgYm9vbCBfX3gpIHsgX01fZmlsbF9hc3NpZ24oX19uLCBfX3gpOyB9Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Ci0gIHZvaWQgYXNzaWduKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkgewotICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lzSW50ZWdyYWw8X0lucHV0SXRlcmF0b3I+OjpfUmV0IF9JbnRlZ3JhbDsKLSAgICBfTV9hc3NpZ25fZGlzcGF0Y2goX19maXJzdCwgX19sYXN0LCBfSW50ZWdyYWwoKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0ludGVnZXI+Ci0gIHZvaWQgX01fYXNzaWduX2Rpc3BhdGNoKF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX192YWwsIGNvbnN0IF9fdHJ1ZV90eXBlJikKLSAgICB7IF9NX2ZpbGxfYXNzaWduKChzaXplX3QpIF9fbiwgKGJvb2wpIF9fdmFsKTsgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgotICB2b2lkIF9NX2Fzc2lnbl9kaXNwYXRjaChfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LCBjb25zdCBfX2ZhbHNlX3R5cGUmKQotICAgIHsgX01fYXNzaWduX2F1eChfX2ZpcnN0LCBfX2xhc3QsIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9fZmlyc3QsIF9JbnB1dEl0ZXIpKTsgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KLSAgdm9pZCBfTV9hc3NpZ25fYXV4KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0X2l0ZXJhdG9yX3RhZyAmKSB7Ci0gICAgaXRlcmF0b3IgX19jdXIgPSBiZWdpbigpOwotICAgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3QgJiYgX19jdXIgIT0gZW5kKCk7ICsrX19jdXIsICsrX19maXJzdCkKLSAgICAgICpfX2N1ciA9ICpfX2ZpcnN0OwotICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKLSAgICAgIGVyYXNlKF9fY3VyLCBlbmQoKSk7Ci0gICAgZWxzZQotICAgICAgaW5zZXJ0KGVuZCgpLCBfX2ZpcnN0LCBfX2xhc3QpOwotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+Ci0gIHZvaWQgX01fYXNzaWduX2F1eChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9yd2FyZF9pdGVyYXRvcl90YWcgJikgewotICAgIHNpemVfdHlwZSBfX2xlbiA9IGRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7Ci0gICAgaWYgKF9fbGVuIDwgc2l6ZSgpKQotICAgICAgZXJhc2UoY29weShfX2ZpcnN0LCBfX2xhc3QsIGJlZ2luKCkpLCBlbmQoKSk7Ci0gICAgZWxzZSB7Ci0gICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbWlkID0gX19maXJzdDsKLSAgICAgIGFkdmFuY2UoX19taWQsIHNpemUoKSk7Ci0gICAgICBjb3B5KF9fZmlyc3QsIF9fbWlkLCBiZWdpbigpKTsKLSAgICAgIGluc2VydChlbmQoKSwgX19taWQsIF9fbGFzdCk7Ci0gICAgfQotICB9Ci0jZW5kaWYgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLwotCi0gIHZvaWQgcmVzZXJ2ZShzaXplX3R5cGUgX19uKSB7Ci0gICAgaWYgKGNhcGFjaXR5KCkgPCBfX24pIHsKLSAgICAgIGlmIChtYXhfc2l6ZSgpIDwgX19uKQotICAgICAgICBfX3N0bF90aHJvd19sZW5ndGhfZXJyb3IoInZlY3Rvcjxib29sPiIpOwotICAgICAgdW5zaWduZWQgaW50KiBfX3EgPSB0aGlzLT5fTV9iaXRfYWxsb2MoX19uKTsKLSAgICAgIF9TVExQX1BSSVYgX0JpdF9pdGVyYXRvciBfX3ooX19xLCAwKTsKLSAgICAgIHRoaXMtPl9NX2ZpbmlzaCA9IGNvcHkoYmVnaW4oKSwgZW5kKCksIF9feik7Ci0gICAgICB0aGlzLT5fTV9kZWFsbG9jYXRlKCk7Ci0gICAgICB0aGlzLT5fTV9zdGFydCA9IGl0ZXJhdG9yKF9fcSwgMCk7Ci0gICAgICB0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5fTV9kYXRhID0gX19xICsgKF9fbiArIF9TVExQX1dPUkRfQklUIC0gMSkvX1NUTFBfV09SRF9CSVQ7Ci0gICAgfQotICB9Ci0KLSAgcmVmZXJlbmNlIGZyb250KCkgeyByZXR1cm4gKmJlZ2luKCk7IH0KLSAgY29uc3RfcmVmZXJlbmNlIGZyb250KCkgY29uc3QgeyByZXR1cm4gKmJlZ2luKCk7IH0KLSAgcmVmZXJlbmNlIGJhY2soKSB7IHJldHVybiAqKGVuZCgpIC0gMSk7IH0KLSAgY29uc3RfcmVmZXJlbmNlIGJhY2soKSBjb25zdCB7IHJldHVybiAqKGVuZCgpIC0gMSk7IH0KLSAgdm9pZCBwdXNoX2JhY2soYm9vbCBfX3gpIHsKLSAgICBpZiAodGhpcy0+X01fZmluaXNoLl9NX3AgIT0gdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuX01fZGF0YSkgewotICAgICAgKih0aGlzLT5fTV9maW5pc2gpID0gX194OwotICAgICAgKyt0aGlzLT5fTV9maW5pc2g7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIF9NX2luc2VydF9hdXgoZW5kKCksIF9feCk7Ci0gIH0KLSAgdm9pZCBzd2FwKF9fQlZFQ1RPUl9RVUFMSUZJRUQmIF9feCkgewotICAgIF9TVExQX1NURDo6c3dhcCh0aGlzLT5fTV9zdGFydCwgX194Ll9NX3N0YXJ0KTsKLSAgICBfU1RMUF9TVEQ6OnN3YXAodGhpcy0+X01fZmluaXNoLCBfX3guX01fZmluaXNoKTsKLSAgICB0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5zd2FwKF9feC5fTV9lbmRfb2Zfc3RvcmFnZSk7Ci0gIH0KLSAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIGJvb2wgX194ID0gYm9vbCgpKSB7Ci0gICAgZGlmZmVyZW5jZV90eXBlIF9fbiA9IF9fcG9zaXRpb24gLSBiZWdpbigpOwotICAgIGlmICh0aGlzLT5fTV9maW5pc2guX01fcCAhPSB0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5fTV9kYXRhICYmIF9fcG9zaXRpb24gPT0gZW5kKCkpIHsKLSAgICAgICoodGhpcy0+X01fZmluaXNoKSA9IF9feDsKLSAgICAgICsrdGhpcy0+X01fZmluaXNoOwotICAgIH0KLSAgICBlbHNlCi0gICAgICBfTV9pbnNlcnRfYXV4KF9fcG9zaXRpb24sIF9feCk7Ci0gICAgcmV0dXJuIGJlZ2luKCkgKyBfX247Ci0gIH0KLQotI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCi0KLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2VyPgotICB2b2lkIF9NX2luc2VydF9kaXNwYXRjaChpdGVyYXRvciBfX3BvcywgX0ludGVnZXIgX19uLCBfSW50ZWdlciBfX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fdHJ1ZV90eXBlJikgewotICAgIF9NX2ZpbGxfaW5zZXJ0KF9fcG9zLCAoc2l6ZV90eXBlKSBfX24sIChib29sKSBfX3gpOwotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgotICB2b2lkIF9NX2luc2VydF9kaXNwYXRjaChpdGVyYXRvciBfX3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2ZhbHNlX3R5cGUmKSB7Ci0gICAgX01faW5zZXJ0X3JhbmdlKF9fcG9zLCBfX2ZpcnN0LCBfX2xhc3QsIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yKSk7Ci0gIH0KLQotICAvLyBDaGVjayB3aGV0aGVyIGl0J3MgYW4gaW50ZWdyYWwgdHlwZS4gIElmIHNvLCBpdCdzIG5vdCBhbiBpdGVyYXRvci4KLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgotICB2b2lkIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLAotICAgICAgICAgICAgICBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpIHsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0ludGVncmFsPF9JbnB1dEl0ZXJhdG9yPjo6X1JldCBfSW50ZWdyYWw7Ci0gICAgX01faW5zZXJ0X2Rpc3BhdGNoKF9fcG9zaXRpb24sIF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOwotICB9Ci0jZWxzZSAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCi0gIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sCi0gICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkgewotICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkgcmV0dXJuOwotICAgIHNpemVfdHlwZSBfX24gPSBkaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QpOwotICAgIGlmIChjYXBhY2l0eSgpIC0gc2l6ZSgpID49IF9fbikgewotICAgICAgX1NUTFBfUFJJViBfX2NvcHlfYmFja3dhcmQoX19wb3NpdGlvbiwgZW5kKCksIHRoaXMtPl9NX2ZpbmlzaCArIF9fbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKCksIChkaWZmZXJlbmNlX3R5cGUqKTAgKTsKLSAgICAgIGNvcHkoX19maXJzdCwgX19sYXN0LCBfX3Bvc2l0aW9uKTsKLSAgICAgIHRoaXMtPl9NX2ZpbmlzaCArPSBfX247Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgc2l6ZV90eXBlIF9fbGVuID0gc2l6ZSgpICsgKG1heCkoc2l6ZSgpLCBfX24pOwotICAgICAgdW5zaWduZWQgaW50KiBfX3EgPSB0aGlzLT5fTV9iaXRfYWxsb2MoX19sZW4pOwotICAgICAgaXRlcmF0b3IgX19pID0gY29weShiZWdpbigpLCBfX3Bvc2l0aW9uLCBpdGVyYXRvcihfX3EsIDApKTsKLSAgICAgIF9faSA9IGNvcHkoX19maXJzdCwgX19sYXN0LCBfX2kpOwotICAgICAgdGhpcy0+X01fZmluaXNoID0gY29weShfX3Bvc2l0aW9uLCBlbmQoKSwgX19pKTsKLSAgICAgIHRoaXMtPl9NX2RlYWxsb2NhdGUoKTsKLSAgICAgIHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLl9NX2RhdGEgPSBfX3EgKyAoX19sZW4gKyBfU1RMUF9XT1JEX0JJVCAtIDEpL19TVExQX1dPUkRfQklUOwotICAgICAgdGhpcy0+X01fc3RhcnQgPSBpdGVyYXRvcihfX3EsIDApOwotICAgIH0KLSAgfQotCi0gIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIGNvbnN0IGJvb2wqIF9fZmlyc3QsIGNvbnN0IGJvb2wqIF9fbGFzdCkgewotICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkgcmV0dXJuOwotICAgIHNpemVfdHlwZSBfX24gPSBkaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QpOwotICAgIGlmIChjYXBhY2l0eSgpIC0gc2l6ZSgpID49IF9fbikgewotICAgICAgX1NUTFBfUFJJViBfX2NvcHlfYmFja3dhcmQoX19wb3NpdGlvbiwgZW5kKCksIHRoaXMtPl9NX2ZpbmlzaCArIF9fbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKCksIChkaWZmZXJlbmNlX3R5cGUqKTAgKTsKLSAgICAgIGNvcHkoX19maXJzdCwgX19sYXN0LCBfX3Bvc2l0aW9uKTsKLSAgICAgIHRoaXMtPl9NX2ZpbmlzaCArPSBfX247Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgc2l6ZV90eXBlIF9fbGVuID0gc2l6ZSgpICsgKG1heCkoc2l6ZSgpLCBfX24pOwotICAgICAgdW5zaWduZWQgaW50KiBfX3EgPSB0aGlzLT5fTV9iaXRfYWxsb2MoX19sZW4pOwotICAgICAgaXRlcmF0b3IgX19pID0gY29weShiZWdpbigpLCBfX3Bvc2l0aW9uLCBpdGVyYXRvcihfX3EsIDApKTsKLSAgICAgIF9faSA9IGNvcHkoX19maXJzdCwgX19sYXN0LCBfX2kpOwotICAgICAgdGhpcy0+X01fZmluaXNoID0gY29weShfX3Bvc2l0aW9uLCBlbmQoKSwgX19pKTsKLSAgICAgIHRoaXMtPl9NX2RlYWxsb2NhdGUoKTsKLSAgICAgIHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLl9NX2RhdGEgPSBfX3EgKyAoX19sZW4gKyBfU1RMUF9XT1JEX0JJVCAtIDEpL19TVExQX1dPUkRfQklUOwotICAgICAgdGhpcy0+X01fc3RhcnQgPSBpdGVyYXRvcihfX3EsIDApOwotICAgIH0KLSAgfQotI2VuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KLQotICB2b2lkIF9NX2ZpbGxfaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIHNpemVfdHlwZSBfX24sIGJvb2wgX194KSB7Ci0gICAgaWYgKF9fbiA9PSAwKSByZXR1cm47Ci0gICAgaWYgKGNhcGFjaXR5KCkgLSBzaXplKCkgPj0gX19uKSB7Ci0gICAgICBfU1RMUF9QUklWIF9fY29weV9iYWNrd2FyZChfX3Bvc2l0aW9uLCBlbmQoKSwgdGhpcy0+X01fZmluaXNoICsgZGlmZmVyZW5jZV90eXBlKF9fbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZygpLCAoZGlmZmVyZW5jZV90eXBlKikwICk7Ci0gICAgICBmaWxsKF9fcG9zaXRpb24sIF9fcG9zaXRpb24gKyBkaWZmZXJlbmNlX3R5cGUoX19uKSwgX194KTsKLSAgICAgIHRoaXMtPl9NX2ZpbmlzaCArPSBkaWZmZXJlbmNlX3R5cGUoX19uKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBzaXplX3R5cGUgX19sZW4gPSBzaXplKCkgKyAobWF4KShzaXplKCksIF9fbik7Ci0gICAgICB1bnNpZ25lZCBpbnQqIF9fcSA9IHRoaXMtPl9NX2JpdF9hbGxvYyhfX2xlbik7Ci0gICAgICBpdGVyYXRvciBfX2kgPSBjb3B5KGJlZ2luKCksIF9fcG9zaXRpb24sIGl0ZXJhdG9yKF9fcSwgMCkpOwotICAgICAgZmlsbF9uKF9faSwgX19uLCBfX3gpOwotICAgICAgdGhpcy0+X01fZmluaXNoID0gY29weShfX3Bvc2l0aW9uLCBlbmQoKSwgX19pICsgZGlmZmVyZW5jZV90eXBlKF9fbikpOwotICAgICAgdGhpcy0+X01fZGVhbGxvY2F0ZSgpOwotICAgICAgdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuX01fZGF0YSA9IF9fcSArIChfX2xlbiArIF9TVExQX1dPUkRfQklUIC0gMSkvX1NUTFBfV09SRF9CSVQ7Ci0gICAgICB0aGlzLT5fTV9zdGFydCA9IGl0ZXJhdG9yKF9fcSwgMCk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgc2l6ZV90eXBlIF9fbiwgYm9vbCBfX3gpIHsKLSAgICBfTV9maWxsX2luc2VydChfX3Bvc2l0aW9uLCBfX24sIF9feCk7Ci0gIH0KLQotICB2b2lkIHBvcF9iYWNrKCkgewotICAgIC0tdGhpcy0+X01fZmluaXNoOwotICB9Ci0gIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24pIHsKLSAgICBpZiAoX19wb3NpdGlvbiArIDEgIT0gZW5kKCkpCi0gICAgICBjb3B5KF9fcG9zaXRpb24gKyAxLCBlbmQoKSwgX19wb3NpdGlvbik7Ci0gICAgICAtLXRoaXMtPl9NX2ZpbmlzaDsKLSAgICByZXR1cm4gX19wb3NpdGlvbjsKLSAgfQotICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpIHsKLSAgICB0aGlzLT5fTV9maW5pc2ggPSBjb3B5KF9fbGFzdCwgZW5kKCksIF9fZmlyc3QpOwotICAgIHJldHVybiBfX2ZpcnN0OwotICB9Ci0gIHZvaWQgcmVzaXplKHNpemVfdHlwZSBfX25ld19zaXplLCBib29sIF9feCA9IGJvb2woKSkgewotICAgIGlmIChfX25ld19zaXplIDwgc2l6ZSgpKQotICAgICAgZXJhc2UoYmVnaW4oKSArIGRpZmZlcmVuY2VfdHlwZShfX25ld19zaXplKSwgZW5kKCkpOwotICAgIGVsc2UKLSAgICAgIGluc2VydChlbmQoKSwgX19uZXdfc2l6ZSAtIHNpemUoKSwgX194KTsKLSAgfQotICB2b2lkIGZsaXAoKSB7Ci0gICAgZm9yICh1bnNpZ25lZCBpbnQqIF9fcCA9IHRoaXMtPl9NX3N0YXJ0Ll9NX3A7IF9fcCAhPSB0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5fTV9kYXRhOyArK19fcCkKLSAgICAgICpfX3AgPSB+Kl9fcDsKLSAgfQotCi0gIHZvaWQgY2xlYXIoKSB7IGVyYXNlKGJlZ2luKCksIGVuZCgpKTsgfQotfTsKLQotI2lmIGRlZmluZWQgIChfU1RMUF9OT19CT09MKSB8fCBkZWZpbmVkIChfX0hQX2FDQykgLy8gZml4ZWQgc29vbiAoMDMvMTcvMjAwMCkKLSMgIGRlZmluZSBfU1RMUF9URU1QTEFURV9IRUFERVIgX19CVkVDX1RNUExfSEVBREVSCi0jICBkZWZpbmUgX1NUTFBfVEVNUExBVEVfQ09OVEFJTkVSIF9fQlZFQ1RPUl9RVUFMSUZJRUQKLSMgIGluY2x1ZGUgPHN0bC9fcmVsb3BzX2NvbnQuaD4KLSMgIHVuZGVmIF9TVExQX1RFTVBMQVRFX0NPTlRBSU5FUgotIyAgdW5kZWYgX1NUTFBfVEVNUExBVEVfSEVBREVSCi0jZW5kaWYgLyogTk9fQk9PTCAqLwotCi0jaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpICYmICFkZWZpbmVkIChfU1RMUF9OT19CT09MKQotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi0jZW5kaWYKLQotX1NUTFBfRU5EX05BTUVTUEFDRQotCi0jdW5kZWYgdmVjdG9yCi0jdW5kZWYgX0FsbG9jCi0jdW5kZWYgX1NUTFBfVkVDQk9PTF9URU1QTEFURQotI3VuZGVmIF9fQlZFQ1RPUgotI3VuZGVmIF9fQlZFQ1RPUl9RVUFMSUZJRUQKLSN1bmRlZiBfX0JWRUNfVE1QTF9IRUFERVIKLQotI3VuZGVmIF9TVExQX1dPUkRfQklUCi0KLSNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9CVkVDVE9SX0ggKi8KLQotLy8gTG9jYWwgVmFyaWFibGVzOgotLy8gbW9kZTpDKysKLS8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9fY2N0eXBlLmggYi9zdGwvX2NjdHlwZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzVjOTM2Li4wMDAwMDAwCi0tLSBhL3N0bC9fY2N0eXBlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DQ1RZUEUKLSNkZWZpbmUgX1NUTFBfSU5URVJOQUxfQ0NUWVBFCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfTkVXX0NfSEVBREVSUykKLSMgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUihjY3R5cGUpCi0jZWxzZQotIyAgaW5jbHVkZSA8Y3R5cGUuaD4KLSNlbmRpZiAvKiBfU1RMUF9VU0VfTkVXX0NfSEVBREVSUyAqLwotCi0jaWYgISBkZWZpbmVkIChfU1RMUF9OT19DU1REX0ZVTkNUSU9OX0lNUE9SVFMpCi0jICBpZiBkZWZpbmVkICggX1NUTFBfSU1QT1JUX1ZFTkRPUl9DU1REICkKLV9TVExQX0JFR0lOX05BTUVTUEFDRQotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmlzYWxudW07Ci11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6aXNhbHBoYTsKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjppc2NudHJsOwotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmlzZGlnaXQ7Ci11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6aXNncmFwaDsKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjppc2xvd2VyOwotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmlzcHJpbnQ7Ci11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6aXNwdW5jdDsKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjppc3NwYWNlOwotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmlzdXBwZXI7Ci11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6aXN4ZGlnaXQ7Ci11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6dG9sb3dlcjsKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjp0b3VwcGVyOwotX1NUTFBfRU5EX05BTUVTUEFDRQotIyAgZW5kaWYgLyogX1NUTFBfSU1QT1JUX1ZFTkRPUl9DU1REKi8KLSNlbmRpZiAvKiBfU1RMUF9OT19DU1REX0ZVTkNUSU9OX0lNUE9SVFMgKi8KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zdGwvX2NoZWNrX2NvbmZpZy5oIGIvc3RsL19jaGVja19jb25maWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRhYjNjYS4uMDAwMDAwMAotLS0gYS9zdGwvX2NoZWNrX2NvbmZpZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLy8gVGhpcyBmaWxlIGlzIHJlc2VydmVkIHRvIHNpdGUgY29uZmlndXJhdGlvbiBwdXJwb3NlCi0vLyBhbmQgc2hvdWxkIE5FVkVSIGJlIG92ZXJyaWRkZW4gYnkgdXNlcgotCi0vKgotICogIENvbnNpc3RlbmN5IGNoZWNrIDogaWYgd2UgdXNlIFNHSSBpb3N0cmVhbXMsIHdlIGhhdmUgdG8gdXNlIGNvbnNpc3RlbnQKLSAqICB0aHJlYWQgbW9kZWwgKHNpbmdsZS10aHJlYWRlZCBvciBtdWx0aS10aHJlYWRlZCkgd2l0aCB0aGUgY29tcGlsZWQgbGlicmFyeQotICoKLSAqICBEZWZhdWx0IGlzIG11bHRpdGhyZWFkZWQgYnVpbGQuIElmIHlvdSB3YW50IHRvIGJ1aWxkIGFuZCB1c2Ugc2luZ2xlLXRocmVhZGVkCi0gKiAgU1RMcG9ydCwgcGxlYXNlIGNoYW5nZSBfU1RMUF9OT1RIUkVBRFMgY29uZmlndXJhdGlvbiBzZXR0aW5nIGFib3ZlIGFuZCByZWJ1aWxkIHRoZSBsaWJyYXJ5Ci0gKgotICovCi0KLSMgaWYgIWRlZmluZWQoX1NUTFBfVVNFX05PX0lPU1RSRUFNUykgJiYgIWRlZmluZWQoX1NUTFBfTk9fVEhSRUFEUykgJiYgIWRlZmluZWQoX1JFRU5UUkFOVCkKLQotIyAgaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgIWRlZmluZWQoX19NV0VSS1NfXykgJiYgIWRlZmluZWQgKF9fQ09NT19fKSAmJiAhZGVmaW5lZChfTVQpCi0jICAgZXJyb3IgIk9ubHkgbXVsdGktdGhyZWFkZWQgcnVudGltZSBsaWJyYXJ5IG1heSBiZSBsaW5rZWQgd2l0aCBTVExwb3J0ISIKLSMgIGVuZGlmCi0KLS8vIGJvcmlzIDogeW91IG1heSBjaGFuZ2UgdGhhdCB0byBidWlsZCBub24tdGhyZWFkc2FmZSBTVExwb3J0IGxpYnJhcnkKLSMgIGlmIGRlZmluZWQgKF9fQlVJTERJTkdfU1RMUE9SVCkgLyogfHwgZGVmaW5lZCAoX1NUTFBfREVCVUcpICovCi0jICAgZGVmaW5lIF9SRUVOVFJBTlQgMQotIyAgZW5kaWYKLQotIyBlbmRpZgpkaWZmIC0tZ2l0IGEvc3RsL19jbG9jYWxlLmggYi9zdGwvX2Nsb2NhbGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVjZGVlOC4uMDAwMDAwMAotLS0gYS9zdGwvX2Nsb2NhbGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NMT0NBTEUKLSNkZWZpbmUgX1NUTFBfSU5URVJOQUxfQ0xPQ0FMRQotCi0jaWYgIWRlZmluZWQgKF9TVExQX1dDRV9FVkMzKQotCi0jICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfTkVXX0NfSEVBREVSUykKLSMgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSEVBREVSKGNsb2NhbGUpCi0jICBlbHNlCi0jICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NfSEVBREVSKGxvY2FsZS5oKQotIyAgZW5kaWYKLQotIyAgaWYgZGVmaW5lZCAoX1NUTFBfSU1QT1JUX1ZFTkRPUl9DU1REKQotX1NUTFBfQkVHSU5fTkFNRVNQQUNFCi11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6bGNvbnY7Ci0jICAgIGlmICFkZWZpbmVkIChfU1RMUF9OT19DU1REX0ZVTkNUSU9OX0lNUE9SVFMpCi11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6bG9jYWxlY29udjsKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpzZXRsb2NhbGU7Ci0jICAgIGVuZGlmCi1fU1RMUF9FTkRfTkFNRVNQQUNFCi0jICBlbmRpZgotCi0jZW5kaWYgLyogIV9TVExQX1dDRV9FVkMzICovCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3RsL19jbWF0aC5oIGIvc3RsL19jbWF0aC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzE1ZjAwLi4wMDAwMDAwCi0tLSBhL3N0bC9fY21hdGguaAorKysgL2Rldi9udWxsCkBAIC0xLDU2MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DTUFUSAotI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9DTUFUSAotCi0vKiBnY2MgZG8gbm90IGxpa2Ugd2hlbiBhIHVzaW5nIGRpcmVjdGl2ZSBhcHBlYXIgYWZ0ZXIgYSBmdW5jdGlvbgotICogZGVjbGFyYXRpb24uIGNtYXRoIGhhdmUgYWJzIG92ZXJsb2FkcyBhbmQgY3N0ZGxpYiBhIHVzaW5nIGRpcmVjdGl2ZQotICogc28gY3N0ZGxpYiBoYXMgdG8gYmUgaW5jbHVkZWQgZmlyc3QuCi0gKi8KLSNpZiBkZWZpbmVkIChfX0dOVUNfXykgJiYgZGVmaW5lZCAoX1NUTFBfVVNFX05FV19DX0hFQURFUlMpCi0jICBpbmNsdWRlIF9TVExQX05BVElWRV9DUFBfQ19IRUFERVIoY3N0ZGxpYikKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX1NUTFBfVVNFX05FV19DX0hFQURFUlMpCi0jICBpZiBkZWZpbmVkIChfU1RMUF9IQVNfTk9fTkFNRVNQQUNFUykgJiYgIWRlZmluZWQgKGV4Y2VwdGlvbikKLSMgICAgZGVmaW5lIGV4Y2VwdGlvbiBfX21hdGhfZXhjZXB0aW9uCi0jICBlbmRpZgotIyAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSEVBREVSKGNtYXRoKQotIyAgaWYgZGVmaW5lZCAoX1NUTFBfSEFTX05PX05BTUVTUEFDRVMpCi0jICAgIHVuZGVmIGV4Y2VwdGlvbgotIyAgZW5kaWYKLSNlbHNlCi0jICBpbmNsdWRlIDxtYXRoLmg+Ci0jZW5kaWYKLQotI2lmIChkZWZpbmVkIChfX1NVTlBST19DQykgJiYgKF9fU1VOUFJPX0NDID4gMHg1MDApKSB8fCBcCi0gICAgICEoZGVmaW5lZCAoX19JQk1DUFBfXykgJiYgKF9fSUJNQ1BQX18gPj0gNTAwKSB8fCAhKGRlZmluZWQoX19IUF9hQ0MpICYmIChfX0hQX2FDQyA+PSAzMDAwMCkgKSkKLSMgIGlmbmRlZiBfU1RMUF9IQVNfTk9fTkFNRVNQQUNFUwotbmFtZXNwYWNlIHN0ZCB7Ci0jICBlbmRpZgotZXh0ZXJuICJDIiBkb3VibGUgaHlwb3QoZG91YmxlIHgsIGRvdWJsZSB5KTsKLSMgIGlmbmRlZiBfU1RMUF9IQVNfTk9fTkFNRVNQQUNFUwotfQotIyAgZW5kaWYKLQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfX3N1bikgJiYgZGVmaW5lZCAoX19HTlVDX18pCi1leHRlcm4gIkMiIHsKLSAgZmxvYXQgX19jb3NmKGZsb2F0IHYpOwotICBmbG9hdCBfX3NpbmYoZmxvYXQgdik7Ci0gIGZsb2F0IF9fYXRhbjJmKGZsb2F0LCBmbG9hdCk7Ci0gIGZsb2F0IF9fY29zaGYoZmxvYXQgdik7Ci0gIGZsb2F0IF9fc2luaGYoZmxvYXQgdik7Ci0gIGZsb2F0IF9fc3FydGYoZmxvYXQgdik7Ci0gIGZsb2F0IF9fZXhwZihmbG9hdCB2KTsKLSAgZmxvYXQgX19sb2dmKGZsb2F0IHYpOwotICBmbG9hdCBfX2xvZzEwZihmbG9hdCB2KTsKLQotICBsb25nIGRvdWJsZSBfX2Nvc2wobG9uZyBkb3VibGUgdik7Ci0gIGxvbmcgZG91YmxlIF9fc2lubChsb25nIGRvdWJsZSB2KTsKLSAgbG9uZyBkb3VibGUgX19hdGFuMmwobG9uZyBkb3VibGUsIGxvbmcgZG91YmxlKTsKLSAgbG9uZyBkb3VibGUgX19jb3NobChsb25nIGRvdWJsZSB2KTsKLSAgbG9uZyBkb3VibGUgX19zaW5obChsb25nIGRvdWJsZSB2KTsKLSAgbG9uZyBkb3VibGUgX19zcXJ0bChsb25nIGRvdWJsZSB2KTsKLSAgbG9uZyBkb3VibGUgX19leHBsKGxvbmcgZG91YmxlIHYpOwotICBsb25nIGRvdWJsZSBfX2xvZ2wobG9uZyBkb3VibGUgdik7Ci0gIGxvbmcgZG91YmxlIF9fbG9nMTBsKGxvbmcgZG91YmxlIHYpOwotfQotCi1leHRlcm4gIkMiIHsKLSAgaW5saW5lIGZsb2F0IGNvc2YoZmxvYXQgdikgeyByZXR1cm4gX19jb3NmKHYpOyB9Ci0gIGlubGluZSBmbG9hdCBzaW5mKGZsb2F0IHYpIHsgcmV0dXJuIF9fc2luZih2KTsgfQotICBpbmxpbmUgZmxvYXQgYXRhbjJmKGZsb2F0IHYxLCBmbG9hdCB2MikgeyByZXR1cm4gX19hdGFuMmYodjEsdjIpOyB9Ci0gIGlubGluZSBmbG9hdCBjb3NoZihmbG9hdCB2KSB7IHJldHVybiBfX2Nvc2hmKHYpOyB9Ci0gIGlubGluZSBmbG9hdCBzaW5oZihmbG9hdCB2KSB7IHJldHVybiBfX3NpbmhmKHYpOyB9Ci0gIGlubGluZSBmbG9hdCBzcXJ0ZihmbG9hdCB2KSB7IHJldHVybiBfX3NxcnRmKHYpOyB9Ci0gIGlubGluZSBmbG9hdCBleHBmKGZsb2F0IHYpIHsgcmV0dXJuIF9fZXhwZih2KTsgfQotICBpbmxpbmUgZmxvYXQgbG9nZihmbG9hdCB2KSB7IHJldHVybiBfX2xvZ2Yodik7IH0KLSAgaW5saW5lIGZsb2F0IGxvZzEwZihmbG9hdCB2KSB7IHJldHVybiBfX2xvZzEwZih2KTsgfQotCi0gIGlubGluZSBsb25nIGRvdWJsZSBjb3NsKGxvbmcgZG91YmxlIHYpIHsgcmV0dXJuIF9fY29zbCh2KTsgfQotICBpbmxpbmUgbG9uZyBkb3VibGUgc2lubChsb25nIGRvdWJsZSB2KSB7IHJldHVybiBfX3Npbmwodik7IH0KLSAgaW5saW5lIGxvbmcgZG91YmxlIGF0YW4ybChsb25nIGRvdWJsZSB2MSwgbG9uZyBkb3VibGUgdjIpIHsgcmV0dXJuIF9fYXRhbjJsKHYxLHYyKTsgfQotICBpbmxpbmUgbG9uZyBkb3VibGUgY29zaGwobG9uZyBkb3VibGUgdikgeyByZXR1cm4gX19jb3NobCh2KTsgfQotICBpbmxpbmUgbG9uZyBkb3VibGUgc2luaGwobG9uZyBkb3VibGUgdikgeyByZXR1cm4gX19zaW5obCh2KTsgfQotICBpbmxpbmUgbG9uZyBkb3VibGUgc3FydGwobG9uZyBkb3VibGUgdikgeyByZXR1cm4gX19zcXJ0bCh2KTsgfQotICBpbmxpbmUgbG9uZyBkb3VibGUgZXhwbChsb25nIGRvdWJsZSB2KSB7IHJldHVybiBfX2V4cGwodik7IH0KLSAgaW5saW5lIGxvbmcgZG91YmxlIGxvZ2wobG9uZyBkb3VibGUgdikgeyByZXR1cm4gX19sb2dsKHYpOyB9Ci0gIGlubGluZSBsb25nIGRvdWJsZSBsb2cxMGwobG9uZyBkb3VibGUgdikgeyByZXR1cm4gX19sb2cxMGwodik7IH0KLX0KLSNlbmRpZiAvLyBfX3N1biAmJiBfX0dOVUNfXwotCi0jaWYgZGVmaW5lZCAoX19zdW4pCi1leHRlcm4gIkMiIHsKLWV4dGVybiBmbG9hdCBfX2Fjb3NmKGZsb2F0KTsKLWV4dGVybiBmbG9hdCBfX2FzaW5mKGZsb2F0KTsKLWV4dGVybiBmbG9hdCBfX2F0YW5mKGZsb2F0KTsKLWV4dGVybiBmbG9hdCBfX2F0YW4yZihmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0IF9fY2VpbGYoZmxvYXQpOwotZXh0ZXJuIGZsb2F0IF9fY29zZihmbG9hdCk7Ci1leHRlcm4gZmxvYXQgX19jb3NoZihmbG9hdCk7Ci1leHRlcm4gZmxvYXQgX19leHBmKGZsb2F0KTsKLWV4dGVybiBmbG9hdCBfX2ZhYnNmKGZsb2F0KTsKLWV4dGVybiBmbG9hdCBfX2Zsb29yZihmbG9hdCk7Ci1leHRlcm4gZmxvYXQgX19mbW9kZihmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0IF9fZnJleHBmKGZsb2F0LCBpbnQgKik7Ci1leHRlcm4gZmxvYXQgX19sZGV4cGYoZmxvYXQsIGludCk7Ci1leHRlcm4gZmxvYXQgX19sb2dmKGZsb2F0KTsKLWV4dGVybiBmbG9hdCBfX2xvZzEwZihmbG9hdCk7Ci1leHRlcm4gZmxvYXQgX19tb2RmZihmbG9hdCwgZmxvYXQgKik7Ci1leHRlcm4gZmxvYXQgX19wb3dmKGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQgX19zaW5mKGZsb2F0KTsKLWV4dGVybiBmbG9hdCBfX3NpbmhmKGZsb2F0KTsKLWV4dGVybiBmbG9hdCBfX3NxcnRmKGZsb2F0KTsKLWV4dGVybiBmbG9hdCBfX3RhbmYoZmxvYXQpOwotZXh0ZXJuIGZsb2F0IF9fdGFuaGYoZmxvYXQpOwotCi1leHRlcm4gbG9uZyBkb3VibGUgX19hY29zbChsb25nIGRvdWJsZSk7Ci1leHRlcm4gbG9uZyBkb3VibGUgX19hc2lubChsb25nIGRvdWJsZSk7Ci1leHRlcm4gbG9uZyBkb3VibGUgX19hdGFubChsb25nIGRvdWJsZSk7Ci1leHRlcm4gbG9uZyBkb3VibGUgX19hdGFuMmwobG9uZyBkb3VibGUsIGxvbmcgZG91YmxlKTsKLWV4dGVybiBsb25nIGRvdWJsZSBfX2NlaWxsKGxvbmcgZG91YmxlKTsKLWV4dGVybiBsb25nIGRvdWJsZSBfX2Nvc2wobG9uZyBkb3VibGUpOwotZXh0ZXJuIGxvbmcgZG91YmxlIF9fY29zaGwobG9uZyBkb3VibGUpOwotZXh0ZXJuIGxvbmcgZG91YmxlIF9fZXhwbChsb25nIGRvdWJsZSk7Ci1leHRlcm4gbG9uZyBkb3VibGUgX19mYWJzbChsb25nIGRvdWJsZSk7Ci1leHRlcm4gbG9uZyBkb3VibGUgX19mbG9vcmwobG9uZyBkb3VibGUpOwotZXh0ZXJuIGxvbmcgZG91YmxlIF9fZm1vZGwobG9uZyBkb3VibGUsIGxvbmcgZG91YmxlKTsKLWV4dGVybiBsb25nIGRvdWJsZSBfX2ZyZXhwbChsb25nIGRvdWJsZSwgaW50ICopOwotZXh0ZXJuIGxvbmcgZG91YmxlIF9fbGRleHBsKGxvbmcgZG91YmxlLCBpbnQpOwotZXh0ZXJuIGxvbmcgZG91YmxlIF9fbG9nbChsb25nIGRvdWJsZSk7Ci1leHRlcm4gbG9uZyBkb3VibGUgX19sb2cxMGwobG9uZyBkb3VibGUpOwotZXh0ZXJuIGxvbmcgZG91YmxlIF9fbW9kZmwobG9uZyBkb3VibGUsIGxvbmcgZG91YmxlICopOwotZXh0ZXJuIGxvbmcgZG91YmxlIF9fcG93bChsb25nIGRvdWJsZSwgbG9uZyBkb3VibGUpOwotZXh0ZXJuIGxvbmcgZG91YmxlIF9fc2lubChsb25nIGRvdWJsZSk7Ci1leHRlcm4gbG9uZyBkb3VibGUgX19zaW5obChsb25nIGRvdWJsZSk7Ci1leHRlcm4gbG9uZyBkb3VibGUgX19zcXJ0bChsb25nIGRvdWJsZSk7Ci1leHRlcm4gbG9uZyBkb3VibGUgX190YW5sKGxvbmcgZG91YmxlKTsKLWV4dGVybiBsb25nIGRvdWJsZSBfX3RhbmhsKGxvbmcgZG91YmxlKTsKLX0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKQotIyAgZGVmaW5lIF9TVExQX0NNQVRIX0ZVTkNfTkFNRVNQQUNFIF9TVExQX1ZFTkRPUl9DU1RECi0jZWxzZQotIyAgZGVmaW5lIF9TVExQX0NNQVRIX0ZVTkNfTkFNRVNQQUNFCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkIChfX3N1bikgfHwgZGVmaW5lZCAoX19HTlVDX18pCi0jICBkZWZpbmUgX1NUTFBfTUFUSF9JTkxJTkUoZmxvYXRfdHlwZSwgZnVuYywgY2Z1bmMpIFwKLSAgICAgaW5saW5lIGZsb2F0X3R5cGUgZnVuYyAoZmxvYXRfdHlwZSB4KSB7IHJldHVybiBfU1RMUF9DTUFUSF9GVU5DX05BTUVTUEFDRTo6Y2Z1bmMoeCk7IH0KLSMgIGRlZmluZSBfU1RMUF9NQVRIX0lOTElORTIoZmxvYXRfdHlwZSwgdHlwZSwgZnVuYywgY2Z1bmMpIFwKLSAgICAgaW5saW5lIGZsb2F0X3R5cGUgZnVuYyAoZmxvYXRfdHlwZSB4LCB0eXBlIHkpIHsgcmV0dXJuIF9TVExQX0NNQVRIX0ZVTkNfTkFNRVNQQUNFOjpjZnVuYyh4LCB5KTsgfQotIyAgZGVmaW5lIF9TVExQX01BVEhfSU5MSU5FX0QoZmxvYXRfdHlwZSwgZnVuYywgY2Z1bmMpCi0jICBkZWZpbmUgX1NUTFBfTUFUSF9JTkxJTkUyX0QoZmxvYXRfdHlwZSwgdHlwZSwgZnVuYywgY2Z1bmMpCi0jZWxzZQotIyAgaWZkZWYgX19TVU5QUk9fQ0MKLSMgICAgZGVmaW5lIF9TVExQX01BVEhfSU5MSU5FKGZsb2F0X3R5cGUsIGZ1bmMsIGNmdW5jKSBcCi0gICAgICAgaW5saW5lIGZsb2F0X3R5cGUgZnVuYyAoZmxvYXRfdHlwZSB4KSB7IHJldHVybiBfU1RMUF9WRU5ET1JfQ1NURDo6X18jI2NmdW5jKHgpOyB9Ci0jICAgIGRlZmluZSBfU1RMUF9NQVRIX0lOTElORV9EKGZsb2F0X3R5cGUsIGZ1bmMsIGNmdW5jKSBcCi0gICAgICAgaW5saW5lIGZsb2F0X3R5cGUgZnVuYyAoZmxvYXRfdHlwZSB4KSB7IHJldHVybiBfU1RMUF9WRU5ET1JfQ1NURDo6Y2Z1bmMoeCk7IH0KLSMgICAgZGVmaW5lIF9TVExQX01BVEhfSU5MSU5FMihmbG9hdF90eXBlLCB0eXBlLCBmdW5jLCBjZnVuYykgXAotICAgICAgIGlubGluZSBmbG9hdF90eXBlIGZ1bmMgKGZsb2F0X3R5cGUgeCwgdHlwZSB5KSB7IHJldHVybiBfU1RMUF9WRU5ET1JfQ1NURDo6X18jI2NmdW5jKHgseSk7IH0KLSMgICAgZGVmaW5lIF9TVExQX01BVEhfSU5MSU5FMl9EKGZsb2F0X3R5cGUsIHR5cGUsIGZ1bmMsIGNmdW5jKSBcCi0gICAgICAgaW5saW5lIGZsb2F0X3R5cGUgZnVuYyAoZmxvYXRfdHlwZSB4LCB0eXBlIHkpIHsgcmV0dXJuIF9TVExQX1ZFTkRPUl9DU1REOjpjZnVuYyh4LHkpOyB9Ci0jICBlbHNlCi0jICAgIGVycm9yIFVua25vd24gY29tcGlsZXIgZm9yIHRoZSBTdW4gcGxhdGZvcm0KLSMgIGVuZGlmCi0jZW5kaWYKLQotLyoqIG1hY3JvcyB0byBkZWZpbmUgbWF0aCBmdW5jdGlvbnMKLVRoZXNlIG1hY3JvcyAoaGF2aW5nIGFuIFggc29tZXdoZXJlIGluIHRoZSBuYW1lKSBmb3J3YXJkIHRvIHRoZSBDIGxpYnJhcnkncwotZG91YmxlIGZ1bmN0aW9ucyBidXQgY2FzdCB0aGUgYXJndW1lbnRzIGFuZCByZXR1cm4gdmFsdWVzIHRvIHRoZSBnaXZlbiB0eXBlLiAqLwotCi0jZGVmaW5lIF9TVExQX01BVEhfSU5MSU5FWChfX3R5cGUsZnVuYyxjZnVuYykgXAotICBpbmxpbmUgX190eXBlIGZ1bmMgKF9fdHlwZSB4KSBcCi0gIHsgcmV0dXJuIF9fU1RBVElDX0NBU1QoX190eXBlLCBfU1RMUF9DTUFUSF9GVU5DX05BTUVTUEFDRTo6Y2Z1bmMoKGRvdWJsZSl4KSk7IH0KLSNkZWZpbmUgX1NUTFBfTUFUSF9JTkxJTkUyWChfX3R5cGUxLF9fdHlwZTIsZnVuYyxjZnVuYykgXAotICBpbmxpbmUgX190eXBlMSBmdW5jIChfX3R5cGUxIHgsIF9fdHlwZTIgeSkgXAotICB7IHJldHVybiBfX1NUQVRJQ19DQVNUKF9fdHlwZTEsIF9TVExQX0NNQVRIX0ZVTkNfTkFNRVNQQUNFOjpjZnVuYygoZG91YmxlKXgsIHkpKTsgfQotI2RlZmluZSBfU1RMUF9NQVRIX0lOTElORTJQWChfX3R5cGUsZnVuYyxjZnVuYykgXAotICBpbmxpbmUgX190eXBlIGZ1bmMgKF9fdHlwZSB4LCBfX3R5cGUgKnkpIHsgXAotICAgIGRvdWJsZSB0bXAxLCB0bXAyOyBcCi0gICAgdG1wMSA9IF9TVExQX0NNQVRIX0ZVTkNfTkFNRVNQQUNFOjpjZnVuYyhfX1NUQVRJQ19DQVNUKGRvdWJsZSwgeCksICZ0bXAyKTsgXAotICAgICp5ID0gX19TVEFUSUNfQ0FTVChfX3R5cGUsIHRtcDIpOyBcCi0gICAgcmV0dXJuIF9fU1RBVElDX0NBU1QoX190eXBlLCB0bXAxKTsgXAotICB9Ci0jZGVmaW5lIF9TVExQX01BVEhfSU5MSU5FMlhYKF9fdHlwZSxmdW5jLGNmdW5jKSBcCi0gIGlubGluZSBfX3R5cGUgZnVuYyAoX190eXBlIHgsIF9fdHlwZSB5KSBcCi0gIHsgcmV0dXJuIF9fU1RBVElDX0NBU1QoX190eXBlLCBfU1RMUF9DTUFUSF9GVU5DX05BTUVTUEFDRTo6Y2Z1bmMoKGRvdWJsZSl4LCAoZG91YmxlKXkpKTsgfQotCi0KLS8qKiByb3VnaCBjaGFyYWN0ZXJpemF0aW9uIG9mIGNvbXBpbGVyIGFuZCBuYXRpdmUgQyBsaWJyYXJ5Ci1Gb3IgdGhlIGNvbXBpbGVyLCBpdCBjYW4gZWl0aGVyIHN1cHBvcnQgbG9uZyBkb3VibGUgb3Igbm90LiBJZiBpdCBkb2Vzbid0LCB0aGUKLW1hY3JvIF9TVExQX05PX0xPTkdfRE9VQkxFIGlzIG5vdCBkZWZpbmVkIGFuZCB3ZSBkb24ndCBkZWZpbmUgYW55IGxvbmcgZG91YmxlCi1vdmVybG9hZHMuCi1Gb3IgdGhlIG5hdGl2ZSBDIGxpYnJhcnkgdGhlIHF1ZXN0aW9uIGlzIHdoZXRoZXIgaXQgaGFzIHZhcmlhbnRzIHdpdGggYW4gJ2YnCi1zdWZmaXggKGZvciBmbG9hdCBhcyBvcHBvc2VkIHRvIGRvdWJsZSkgb3IgYW4gJ2wnIHN1ZmZpeCAoZm9yIGxvbmcgZG91YmxlKS4gSWYKLXRoZSBmbG9hdCB2YXJpYW50cyBhcmUgbWlzc2luZywgX1NUTFBfTk9fVkVORE9SX01BVEhfRiBpcyBkZWZpbmVkLCB3aGVuIHRoZQotbG9uZyBkb3VibGUgdmFyaWFudHMgYXJlIG1pc3NpbmcsIF9TVExQX05PX1ZFTkRPUl9NQVRIX0wgaXMgZGVmaW5lZC4gT2YgY291cnNlCi10aGUgbGF0dGVyIGRvZXNuJ3QgbWFrZSBzZW5zZSBhbnl3YXkgd2hlbiB0aGUgY29tcGlsZXIgYWxyZWFkeSBoYXMgbm8gbG9uZwotZG91YmxlIHN1cHBvcnQuCi0KLVRob3NlIHR3byB0cmFpdHMgZGV0ZXJtaW5lIGEpIHdoaWNoIG92ZXJsb2FkcyBnZXQgZGVmaW5lZCBhbmQgYikgaG93IHRoZXkgYXJlCi1kZWZpbmVkLgotCi1NZWFuaW5nIG9mIHN1ZmZpeGVzOgotIiIgICA6IGZ1bmN0aW9uIHJldHVybmluZyBhbmQgdGFraW5nIGEgZmxvYXRfdHlwZQotIjIiICA6IGZ1bmN0aW9uIHJldHVybmluZyBhIGZsb2F0X3R5cGUgYW5kIHRha2luZyB0byBmbG9hdF90eXBlcwotIjJQIiA6IGZ1bmN0aW9uIHJldHVybmluZyBhIGZsb2F0X3R5cGUgYW5kIHRha2luZyBhIGZsb2F0X3R5cGUgYW5kIGEgZmxvYXRfdHlwZSoKLSIyUEkiOiBmdW5jdGlvbiByZXR1cm5pbmcgYSBmbG9hdF90eXBlIGFuZCB0YWtpbmcgYSBmbG9hdF90eXBlIGFuZCBhbiBpbnQqCi0iMkkiIDogZnVuY3Rpb24gcmV0dXJuaW5nIGEgZmxvYXRfdHlwZSBhbmQgdGFraW5nIGEgZmxvYXRfVHlwZSBhbmQgYW4gaW50Ci0qLwotCi0jaWYgIWRlZmluZWQgKF9TVExQX05PX0xPTkdfRE9VQkxFKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fVkVORE9SX01BVEhfTCkgJiYgIWRlZmluZWQgKF9TVExQX05PX1ZFTkRPUl9NQVRIX0YpCi0gICAvLyBsb25nIGRvdWJsZSBzdXBwb3J0IGFuZCBib3RoIGUuZy4gc2lubChsb25nIGRvdWJsZSkgYW5kIHNpbmYoZmxvYXQpCi0gICAvLyBUaGlzIGlzIHRoZSBkZWZhdWx0IGZvciBhIGNvcnJlY3QgYW5kIGNvbXBsZXRlIG5hdGl2ZSBsaWJyYXJ5LgotIyAgZGVmaW5lIF9TVExQX0RFRl9NQVRIX0lOTElORShmdW5jLGNmKSBcCi0gIF9TVExQX01BVEhfSU5MSU5FKGZsb2F0LGZ1bmMsY2YjI2YpIFwKLSAgX1NUTFBfTUFUSF9JTkxJTkVfRChkb3VibGUsZnVuYyxjZikgXAotICBfU1RMUF9NQVRIX0lOTElORShsb25nIGRvdWJsZSxmdW5jLGNmIyNsKQotIyAgZGVmaW5lIF9TVExQX0RFRl9NQVRIX0lOTElORTIoZnVuYyxjZikgXAotICBfU1RMUF9NQVRIX0lOTElORTIoZmxvYXQsZmxvYXQsZnVuYyxjZiMjZikgXAotICBfU1RMUF9NQVRIX0lOTElORTJfRChkb3VibGUsZG91YmxlLGZ1bmMsY2YpIFwKLSAgX1NUTFBfTUFUSF9JTkxJTkUyKGxvbmcgZG91YmxlLGxvbmcgZG91YmxlLGZ1bmMsY2YjI2wpCi0jICBkZWZpbmUgX1NUTFBfREVGX01BVEhfSU5MSU5FMlAoZnVuYyxjZikgXAotICBfU1RMUF9NQVRIX0lOTElORTIoZmxvYXQsZmxvYXQgKixmdW5jLGNmIyNmKSBcCi0gIF9TVExQX01BVEhfSU5MSU5FMl9EKGRvdWJsZSxkb3VibGUgKixmdW5jLGNmKSBcCi0gIF9TVExQX01BVEhfSU5MSU5FMihsb25nIGRvdWJsZSxsb25nIGRvdWJsZSAqLGZ1bmMsY2YjI2wpCi0jICBkZWZpbmUgX1NUTFBfREVGX01BVEhfSU5MSU5FMlBJKGZ1bmMsY2YpIFwKLSAgX1NUTFBfTUFUSF9JTkxJTkUyKGZsb2F0LGludCAqLGZ1bmMsY2YjI2YpIFwKLSAgX1NUTFBfTUFUSF9JTkxJTkUyX0QoZG91YmxlLGludCAqLGZ1bmMsY2YpIFwKLSAgX1NUTFBfTUFUSF9JTkxJTkUyKGxvbmcgZG91YmxlLGludCAqLGZ1bmMsY2YjI2wpCi0jICBkZWZpbmUgX1NUTFBfREVGX01BVEhfSU5MSU5FMkkoZnVuYyxjZikgXAotICBfU1RMUF9NQVRIX0lOTElORTIoZmxvYXQsaW50LGZ1bmMsY2YjI2YpIFwKLSAgX1NUTFBfTUFUSF9JTkxJTkUyX0QoZG91YmxlLGludCxmdW5jLGNmKSBcCi0gIF9TVExQX01BVEhfSU5MSU5FMihsb25nIGRvdWJsZSxpbnQsZnVuYyxjZiMjbCkKLSNlbHNlCi0jICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTE9OR19ET1VCTEUpCi0jICAgIGlmICFkZWZpbmVkIChfU1RMUF9OT19WRU5ET1JfTUFUSF9GKQotICAgICAgIC8vIGxvbmcgZG91YmxlIHN1cHBvcnQgYW5kIGUuZy4gc2luZihmbG9hdCkgYnV0IG5vdCBlLmcuIHNpbmwobG9uZyBkb3VibGUpCi0jICAgICAgZGVmaW5lIF9TVExQX0RFRl9NQVRIX0lOTElORShmdW5jLGNmKSBcCi0gICAgICBfU1RMUF9NQVRIX0lOTElORShmbG9hdCxmdW5jLGNmIyNmKSBcCi0gICAgICBfU1RMUF9NQVRIX0lOTElORVgobG9uZyBkb3VibGUsZnVuYyxjZikKLSMgICAgICBkZWZpbmUgX1NUTFBfREVGX01BVEhfSU5MSU5FMihmdW5jLGNmKSBcCi0gICAgICBfU1RMUF9NQVRIX0lOTElORTIoZmxvYXQsZmxvYXQsZnVuYyxjZiMjZikgXAotICAgICAgX1NUTFBfTUFUSF9JTkxJTkUyWFgobG9uZyBkb3VibGUsZnVuYyxjZikKLSMgICAgICBkZWZpbmUgX1NUTFBfREVGX01BVEhfSU5MSU5FMlAoZnVuYyxjZikgXAotICAgICAgX1NUTFBfTUFUSF9JTkxJTkUyKGZsb2F0LGZsb2F0ICosZnVuYyxjZiMjZikgXAotICAgICAgX1NUTFBfTUFUSF9JTkxJTkUyUFgobG9uZyBkb3VibGUsZnVuYyxjZikKLSMgICAgICBkZWZpbmUgX1NUTFBfREVGX01BVEhfSU5MSU5FMlBJKGZ1bmMsY2YpIFwKLSAgICAgIF9TVExQX01BVEhfSU5MSU5FMihmbG9hdCxpbnQgKixmdW5jLGNmIyNmKSBcCi0gICAgICBfU1RMUF9NQVRIX0lOTElORTJYKGxvbmcgZG91YmxlLGludCAqLGZ1bmMsY2YpCi0jICAgICAgZGVmaW5lIF9TVExQX0RFRl9NQVRIX0lOTElORTJJKGZ1bmMsY2YpIFwKLSAgICAgIF9TVExQX01BVEhfSU5MSU5FMihmbG9hdCxpbnQsZnVuYyxjZiMjZikgXAotICAgICAgX1NUTFBfTUFUSF9JTkxJTkUyWChsb25nIGRvdWJsZSxpbnQsZnVuYyxjZikKLSMgICAgZWxpZiAhZGVmaW5lZCAoX1NUTFBfTk9fVkVORE9SX01BVEhfTCkKLSAgICAgICAvLyBsb25nIGRvdWJsZSBzdXBwb3J0IGFuZCBlLmcuIHNpbmwobG9uZyBkb3VibGUpIGJ1dCBub3QgZS5nLiBzaW5mKGZsb2F0KQotIyAgICAgIGRlZmluZSBfU1RMUF9ERUZfTUFUSF9JTkxJTkUoZnVuYyxjZikgXAotICAgICAgX1NUTFBfTUFUSF9JTkxJTkVYKGZsb2F0LGZ1bmMsY2YpIFwKLSAgICAgIF9TVExQX01BVEhfSU5MSU5FKGxvbmcgZG91YmxlLGZ1bmMsY2YjI2wpCi0jICAgICAgZGVmaW5lIF9TVExQX0RFRl9NQVRIX0lOTElORTIoZnVuYyxjZikgXAotICAgICAgX1NUTFBfTUFUSF9JTkxJTkUyWFgoZmxvYXQsZnVuYyxjZikgXAotICAgICAgX1NUTFBfTUFUSF9JTkxJTkUyKGxvbmcgZG91YmxlLGxvbmcgZG91YmxlLGZ1bmMsY2YjI2wpCi0jICAgICAgZGVmaW5lIF9TVExQX0RFRl9NQVRIX0lOTElORTJQKGZ1bmMsY2YpIFwKLSAgICAgIF9TVExQX01BVEhfSU5MSU5FMlBYKGZsb2F0LGZ1bmMsY2YpIFwKLSAgICAgIF9TVExQX01BVEhfSU5MSU5FMihsb25nIGRvdWJsZSxsb25nIGRvdWJsZSAqLGZ1bmMsY2YjI2wpCi0jICAgICAgZGVmaW5lIF9TVExQX0RFRl9NQVRIX0lOTElORTJQSShmdW5jLGNmKSBcCi0gICAgICBfU1RMUF9NQVRIX0lOTElORTJYKGZsb2F0LGludCAqLGZ1bmMsY2YpIFwKLSAgICAgIF9TVExQX01BVEhfSU5MSU5FMihsb25nIGRvdWJsZSxpbnQgKixmdW5jLGNmIyNsKQotIyAgICAgIGRlZmluZSBfU1RMUF9ERUZfTUFUSF9JTkxJTkUySShmdW5jLGNmKSBcCi0gICAgICBfU1RMUF9NQVRIX0lOTElORTJYKGZsb2F0LGludCxmdW5jLGNmKSBcCi0gICAgICBfU1RMUF9NQVRIX0lOTElORTIobG9uZyBkb3VibGUsaW50LGZ1bmMsY2YjI2wpCi0jICAgIGVsc2UKLSMgICAgICBkZWZpbmUgX1NUTFBfREVGX01BVEhfSU5MSU5FKGZ1bmMsY2YpIFwKLSAgICAgIF9TVExQX01BVEhfSU5MSU5FWChmbG9hdCxmdW5jLGNmKSBcCi0gICAgICBfU1RMUF9NQVRIX0lOTElORVgobG9uZyBkb3VibGUsZnVuYyxjZikKLSMgICAgICBkZWZpbmUgX1NUTFBfREVGX01BVEhfSU5MSU5FMihmdW5jLGNmKSBcCi0gICAgICBfU1RMUF9NQVRIX0lOTElORTJYWChmbG9hdCxmdW5jLGNmKSBcCi0gICAgICBfU1RMUF9NQVRIX0lOTElORTJYWChsb25nIGRvdWJsZSxmdW5jLGNmKQotIyAgICAgIGRlZmluZSBfU1RMUF9ERUZfTUFUSF9JTkxJTkUyUChmdW5jLGNmKSBcCi0gICAgICBfU1RMUF9NQVRIX0lOTElORTJQWChmbG9hdCxmdW5jLGNmKSBcCi0gICAgICBfU1RMUF9NQVRIX0lOTElORTJQWChsb25nIGRvdWJsZSxmdW5jLGNmKQotIyAgICAgIGRlZmluZSBfU1RMUF9ERUZfTUFUSF9JTkxJTkUyUEkoZnVuYyxjZikgXAotICAgICAgX1NUTFBfTUFUSF9JTkxJTkUyWChmbG9hdCxpbnQgKixmdW5jLGNmKSBcCi0gICAgICBfU1RMUF9NQVRIX0lOTElORTJYKGxvbmcgZG91YmxlLGludCAqLGZ1bmMsY2YpCi0jICAgICAgZGVmaW5lIF9TVExQX0RFRl9NQVRIX0lOTElORTJJKGZ1bmMsY2YpIFwKLSAgICAgIF9TVExQX01BVEhfSU5MSU5FMlgoZmxvYXQsaW50LGZ1bmMsY2YpIFwKLSAgICAgIF9TVExQX01BVEhfSU5MSU5FMlgobG9uZyBkb3VibGUsaW50LGZ1bmMsY2YpCi0jICAgIGVuZGlmCi0jICBlbHNlCi0jICAgIGlmICFkZWZpbmVkIChfU1RMUF9OT19WRU5ET1JfTUFUSF9GKQotIyAgICAgIGRlZmluZSBfU1RMUF9ERUZfTUFUSF9JTkxJTkUoZnVuYyxjZikgXAotICAgICAgX1NUTFBfTUFUSF9JTkxJTkUoZmxvYXQsZnVuYyxjZiMjZikKLSMgICAgICBkZWZpbmUgX1NUTFBfREVGX01BVEhfSU5MSU5FMihmdW5jLGNmKSBcCi0gICAgICBfU1RMUF9NQVRIX0lOTElORTIoZmxvYXQsZmxvYXQsZnVuYyxjZiMjZikKLSMgICAgICBkZWZpbmUgX1NUTFBfREVGX01BVEhfSU5MSU5FMlAoZnVuYyxjZikgXAotICAgICAgX1NUTFBfTUFUSF9JTkxJTkUyKGZsb2F0LGZsb2F0ICosZnVuYyxjZiMjZikKLSMgICAgICBkZWZpbmUgX1NUTFBfREVGX01BVEhfSU5MSU5FMlBJKGZ1bmMsY2YpIFwKLSAgICAgIF9TVExQX01BVEhfSU5MSU5FMihmbG9hdCxpbnQgKixmdW5jLGNmIyNmKQotIyAgICAgIGRlZmluZSBfU1RMUF9ERUZfTUFUSF9JTkxJTkUySShmdW5jLGNmKSBcCi0gICAgICBfU1RMUF9NQVRIX0lOTElORTIoZmxvYXQsaW50LGZ1bmMsY2YjI2YpCi0jICAgIGVsc2UgLy8gX1NUTFBfTk9fVkVORE9SX01BVEhfRgotICAgICAgIC8vIG5laXRoZXIgbG9uZyBkb3VibGUgc3VwcG9ydCBub3IgZS5nLiBzaW5mKGZsb2F0KSBmdW5jdGlvbnMKLSMgICAgICBkZWZpbmUgX1NUTFBfREVGX01BVEhfSU5MSU5FKGZ1bmMsY2YpIFwKLSAgICAgIF9TVExQX01BVEhfSU5MSU5FWChmbG9hdCxmdW5jLGNmKQotIyAgICAgIGRlZmluZSBfU1RMUF9ERUZfTUFUSF9JTkxJTkUyKGZ1bmMsY2YpIFwKLSAgICAgIF9TVExQX01BVEhfSU5MSU5FMlhYKGZsb2F0LGZ1bmMsY2YpCi0jICAgICAgZGVmaW5lIF9TVExQX0RFRl9NQVRIX0lOTElORTJQKGZ1bmMsY2YpIFwKLSAgICAgIF9TVExQX01BVEhfSU5MSU5FMlBYKGZsb2F0LGZ1bmMsY2YpCi0jICAgICAgZGVmaW5lIF9TVExQX0RFRl9NQVRIX0lOTElORTJQSShmdW5jLGNmKSBcCi0gICAgICBfU1RMUF9NQVRIX0lOTElORTJYKGZsb2F0LGludCAqLGZ1bmMsY2YpCi0jICAgICAgZGVmaW5lIF9TVExQX0RFRl9NQVRIX0lOTElORTJJKGZ1bmMsY2YpIFwKLSAgICAgIF9TVExQX01BVEhfSU5MSU5FMlgoZmxvYXQsaW50LGZ1bmMsY2YpCi0jICAgIGVuZGlmIC8vIF9TVExQX05PX1ZFTkRPUl9NQVRIX0YKLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9TVExQX1dDRSkgfHwgXAotICAgKGRlZmluZWQoX1NUTFBfTVNWQykgJiYgKF9TVExQX01TVkMgPD0gMTMwMCkgJiYgZGVmaW5lZCAoX01TQ19FWFRFTlNJT05TKSAvKiAmJiAhZGVmaW5lZChfU1RMUF9XQ0VfTkVUKSAqLykKLS8qCi0gKiBkdW1zOiBWQzYgaGFzIGFsbCB0aGUgcmVxdWlyZWQgQysrIGZ1bmN0aW9ucyBidXQgb25seSBkZWZpbmUgdGhlbSBpZgotICogX01TQ19FWFRFTlNJT05TIGlzIG5vdCBkZWZpbmVkIChhIGJ1Zz8pLiBTVExwb3J0IGp1c3QgZG8gdGhlIHNhbWUKLSAqIHRoaW5nIGFsc28gd2hlbiBfTVNDX0VYVEVOU0lPTlMgaXMgZGVmaW5lZC4KLSAqIFRPRE86IGFib3ZlIGNoZWNrIChfU1RMUF9NU1ZDIDw9IDEzMDApIGFsc28gY2F0Y2hlcyBWQzcuMCwgaXMgdGhhdCBpbnRlbmRlZD8KLSAqLwotLy9XZSBoYXZlIHRvIHRlbGwgdGhlIGNvbXBpbGVycyB0aGF0IGFicywgYWNvcyAuLi4gbWF0aCBmdW5jdGlvbnMgYXJlIG5vdCBpbnRyaW5zaWMKLS8vb3RoZXJ3aXNlIHdlIGhhdmUgSW50ZXJuYWwgQ29tcGlsZXIgRXJyb3IgaW4gcmVsZWFzZSBtb2RlLi4uCi0jICBwcmFnbWEgd2FybmluZyhwdXNoKQotIyAgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTogNDE2MikgLy8gbm8gZnVuY3Rpb24gd2l0aCBDIGxpbmthZ2UgZm91bmQKLSMgIHByYWdtYSB3YXJuaW5nKGRpc2FibGU6IDQxNjMpIC8vIG5vdCBhdmFpbGFibGUgYXMgYW4gaW50cmluc2ljIGZ1bmN0aW9uCi0jICBwcmFnbWEgZnVuY3Rpb24gKGFicywgYWNvcywgYXNpbiwgYXRhbiwgYXRhbjIsIGNvcywgY29zaCwgZXhwLCBmYWJzLCBmbW9kLCBsb2csIGxvZzEwLCBzaW4sIHNpbmgsIHNxcnQsIHRhbiwgdGFuaCkKLSMgIGlmIGRlZmluZWQgKF9TVExQX1dDRSkKLSMgICAgcHJhZ21hIGZ1bmN0aW9uIChjZWlsLCBmbG9vcikKLSMgIGVuZGlmCi0jICBkZWZpbmUgX1NUTFBfUkVTVE9SRV9GVU5DVElPTl9JTlRSSU5TSUMKLSNlbmRpZiAvLyBfU1RMUF9NU1ZDICYmIF9TVExQX01TVkMgPD0gMTMwMCAmJiAhX1NUTFBfV0NFICYmIF9NU0NfRVhURU5TSU9OUwotCi0jaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKSAmJiBkZWZpbmVkIChfU1RMUF9VU0VfTkVXX0NfSEVBREVSUykKLS8qIEluIHRoaXMgY29uZmlnIEJvcmxhbmQgbmF0aXZlIGxpYiBvbmx5IGRlZmluZSBmdW5jdGlvbnMgaW4gc3RkIG5hbWVzcGFjZS4KLSAqIEluIG9yZGVyIHRvIGhhdmUgYWxsIG92ZXJsb2FkcyBpbiBTVExwb3J0IG5hbWVzcGFjZSB3ZSBuZWVkIHRvIGFkZCB0aGUKLSAqIGRvdWJsZSBvdmVybG9hZCBpbiBnbG9iYWwgbmFtZXNwYWNlLiBXZSBkbyBub3QgdXNlIGEgdXNpbmcgc3RhdGVtZW50IHRvIGF2b2lkCi0gKiBpbXBvcnQgb2YgaW52YWxpZCBvdmVybG9hZC4KLSAqLwotIyAgZGVmaW5lIF9TVExQX0RNQVRIX0lOTElORShmdW5jKSBfU1RMUF9NQVRIX0lOTElORShkb3VibGUsIGZ1bmMsIGZ1bmMpCi0jICBkZWZpbmUgX1NUTFBfRE1BVEhfSU5MSU5FMihmdW5jKSBfU1RMUF9NQVRIX0lOTElORTIoZG91YmxlLCBkb3VibGUsIGZ1bmMsIGZ1bmMpCi0KLV9TVExQX0RNQVRIX0lOTElORShhY29zKQotX1NUTFBfRE1BVEhfSU5MSU5FKGFzaW4pCi1fU1RMUF9ETUFUSF9JTkxJTkUoYXRhbikKLV9TVExQX0RNQVRIX0lOTElORTIoYXRhbjIpCi1fU1RMUF9ETUFUSF9JTkxJTkUoY2VpbCkKLV9TVExQX0RNQVRIX0lOTElORShjb3MpCi1fU1RMUF9ETUFUSF9JTkxJTkUoY29zaCkKLV9TVExQX0RNQVRIX0lOTElORShleHApCi1fU1RMUF9ETUFUSF9JTkxJTkUoZmFicykKLV9TVExQX0RNQVRIX0lOTElORShmbG9vcikKLV9TVExQX0RNQVRIX0lOTElORTIoZm1vZCkKLV9TVExQX01BVEhfSU5MSU5FMlgoZG91YmxlLCBpbnQqLCBmcmV4cCwgZnJleHApCi1fU1RMUF9NQVRIX0lOTElORTJYKGRvdWJsZSwgaW50LCBsZGV4cCwgbGRleHApCi1fU1RMUF9ETUFUSF9JTkxJTkUobG9nKQotX1NUTFBfRE1BVEhfSU5MSU5FKGxvZzEwKQotX1NUTFBfTUFUSF9JTkxJTkUyUFgoZG91YmxlLCBtb2RmLCBtb2RmKQotX1NUTFBfRE1BVEhfSU5MSU5FKHNpbikKLV9TVExQX0RNQVRIX0lOTElORShzaW5oKQotX1NUTFBfRE1BVEhfSU5MSU5FKHNxcnQpCi1fU1RMUF9ETUFUSF9JTkxJTkUodGFuKQotX1NUTFBfRE1BVEhfSU5MSU5FKHRhbmgpCi1fU1RMUF9ETUFUSF9JTkxJTkUyKHBvdykKLV9TVExQX0RNQVRIX0lOTElORTIoaHlwb3QpCi0KLSMgIHVuZGVmIF9TVExQX0RNQVRIX0lOTElORQotIyAgdW5kZWYgX1NUTFBfRE1BVEhfSU5MSU5FMgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfX0RNQ19fKQotIyAgaWYgZGVmaW5lZCAoZmFicykKLWlubGluZSBkb3VibGUgX19zdGxwX2ZhYnMoZG91YmxlIF9feCkgeyByZXR1cm4gZmFicyhfX3gpOyB9Ci0jICAgIHVuZGVmIGZhYnMKLWlubGluZSBkb3VibGUgZmFicyhkb3VibGUgX194KSB7IHJldHVybiBfX3N0bHBfZmFicyhfX3gpOyB9Ci0jICBlbmRpZgotIyAgaWYgZGVmaW5lZCAoY29zKQotaW5saW5lIGRvdWJsZSBfX3N0bHBfY29zKGRvdWJsZSBfX3gpIHsgcmV0dXJuIGNvcyhfX3gpOyB9Ci0jICAgIHVuZGVmIGNvcwotaW5saW5lIGRvdWJsZSBjb3MoZG91YmxlIF9feCkgeyByZXR1cm4gX19zdGxwX2NvcyhfX3gpOyB9Ci0jICBlbmRpZgotIyAgaWYgZGVmaW5lZCAoc2luKQotaW5saW5lIGRvdWJsZSBfX3N0bHBfc2luKGRvdWJsZSBfX3gpIHsgcmV0dXJuIHNpbihfX3gpOyB9Ci0jICAgIHVuZGVmIHNpbgotaW5saW5lIGRvdWJsZSBzaW4oZG91YmxlIF9feCkgeyByZXR1cm4gX19zdGxwX3NpbihfX3gpOyB9Ci0jICBlbmRpZgotIyAgaWYgZGVmaW5lZCAoc3FydCkKLWlubGluZSBkb3VibGUgX19zdGxwX3NxcnQoZG91YmxlIF9feCkgeyByZXR1cm4gc3FydChfX3gpOyB9Ci0jICAgIHVuZGVmIHNxcnQKLWlubGluZSBkb3VibGUgc3FydChkb3VibGUgX194KSB7IHJldHVybiBfX3N0bHBfc3FydChfX3gpOyB9Ci0jICBlbmRpZgotIyAgaWYgZGVmaW5lZCAobGRleHApCi1pbmxpbmUgZG91YmxlIF9fc3RscF9sZGV4cChkb3VibGUgX194LCBpbnQgX195KSB7IHJldHVybiBsZGV4cChfX3gsIF9feSk7IH0KLSMgICAgdW5kZWYgbGRleHAKLWlubGluZSBkb3VibGUgbGRleHAoZG91YmxlIF9feCwgaW50IF9feSkgeyByZXR1cm4gX19zdGxwX2xkZXhwKF9feCwgX195KTsgfQotIyAgZW5kaWYKLSNlbmRpZgotCi0vKiBNU1ZDIG5hdGl2ZSBsaWIgc3RhcnRpbmcgd2l0aCAuTmV0IDIwMDMgaGFzIGFscmVhZHkgYWxsIG1hdGggZnVuY3Rpb25zCi0gKiBpbiBnbG9iYWwgbmFtZXNwYWNlLgotICogSFAtVVggbmF0aXZlIGxpYiBoYXMgbWF0aCBmdW5jdGlvbnMgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuCi0gKi8KLSNpZiAoIWRlZmluZWQgKF9TVExQX01TVkNfTElCKSB8fCAoX1NUTFBfTVNWQ19MSUIgPCAxMzEwKSB8fCBkZWZpbmVkKFVOREVSX0NFKSkgJiYgXAotICAgICghZGVmaW5lZCAoX19IUF9hQ0MpIHx8IChfX0hQX2FDQyA8IDMwMDAwKSkKLWlubGluZSBkb3VibGUgYWJzKGRvdWJsZSBfX3gpCi17IHJldHVybiA6OmZhYnMoX194KTsgfQotIyAgaWYgIWRlZmluZWQgKF9fTVZTX18pCi1fU1RMUF9ERUZfTUFUSF9JTkxJTkUoYWJzLCBmYWJzKQotIyAgZWxzZSAvLyBfX01WU19fIGhhcyBuYXRpdmUgbG9uZyBkb3VibGUgYWJzPwotaW5saW5lIGZsb2F0IGFicyhmbG9hdCBfX3gpIHsgcmV0dXJuIDo6ZmFic2YoX194KTsgfQotIyAgZW5kaWYKLQotX1NUTFBfREVGX01BVEhfSU5MSU5FKGFjb3MsIGFjb3MpCi1fU1RMUF9ERUZfTUFUSF9JTkxJTkUoYXNpbiwgYXNpbikKLV9TVExQX0RFRl9NQVRIX0lOTElORShhdGFuLCBhdGFuKQotX1NUTFBfREVGX01BVEhfSU5MSU5FMihhdGFuMiwgYXRhbjIpCi1fU1RMUF9ERUZfTUFUSF9JTkxJTkUoY2VpbCwgY2VpbCkKLV9TVExQX0RFRl9NQVRIX0lOTElORShjb3MsIGNvcykKLV9TVExQX0RFRl9NQVRIX0lOTElORShjb3NoLCBjb3NoKQotX1NUTFBfREVGX01BVEhfSU5MSU5FKGV4cCwgZXhwKQotX1NUTFBfREVGX01BVEhfSU5MSU5FKGZhYnMsIGZhYnMpCi1fU1RMUF9ERUZfTUFUSF9JTkxJTkUoZmxvb3IsIGZsb29yKQotX1NUTFBfREVGX01BVEhfSU5MSU5FMihmbW9kLCBmbW9kKQotX1NUTFBfREVGX01BVEhfSU5MSU5FMlBJKGZyZXhwLCBmcmV4cCkKLV9TVExQX0RFRl9NQVRIX0lOTElORTJJKGxkZXhwLCBsZGV4cCkKLV9TVExQX0RFRl9NQVRIX0lOTElORShsb2csIGxvZykKLV9TVExQX0RFRl9NQVRIX0lOTElORShsb2cxMCwgbG9nMTApCi1fU1RMUF9ERUZfTUFUSF9JTkxJTkUyUChtb2RmLCBtb2RmKQotX1NUTFBfREVGX01BVEhfSU5MSU5FKHNpbiwgc2luKQotX1NUTFBfREVGX01BVEhfSU5MSU5FKHNpbmgsIHNpbmgpCi1fU1RMUF9ERUZfTUFUSF9JTkxJTkUoc3FydCwgc3FydCkKLV9TVExQX0RFRl9NQVRIX0lOTElORSh0YW4sIHRhbikKLV9TVExQX0RFRl9NQVRIX0lOTElORSh0YW5oLCB0YW5oKQotX1NUTFBfREVGX01BVEhfSU5MSU5FMihwb3csIHBvdykKLQotIyAgaWYgIWRlZmluZWQoX1NUTFBfTVNWQykgLyogfHwgKF9TVExQX01TVkMgPiAxMzAwKSAqLyB8fCBkZWZpbmVkKF9TVExQX1dDRSkgfHwgIWRlZmluZWQgKF9NU0NfRVhURU5TSU9OUykgLyogJiYgIWRlZmluZWQoX1NUTFBfV0NFX05FVCkgKi8KLSMgICAgaWZuZGVmIF9TVExQX05PX1ZFTkRPUl9NQVRIX0YKLSMgICAgICBpZm5kZWYgX19zdW4KLWlubGluZSBmbG9hdCBwb3coZmxvYXQgX194LCBpbnQgX195KSB7IHJldHVybiBfU1RMUF9DTUFUSF9GVU5DX05BTUVTUEFDRTo6cG93ZihfX3gsIF9fU1RBVElDX0NBU1QoZmxvYXQsX195KSk7IH0KLSMgICAgICBlbHNlCi1pbmxpbmUgZmxvYXQgcG93KGZsb2F0IF9feCwgaW50IF9feSkgeyByZXR1cm4gOjpfX3Bvd2YoX194LCBfX1NUQVRJQ19DQVNUKGZsb2F0LF9feSkpOyB9Ci0jICAgICAgZW5kaWYKLSMgICAgZWxzZQotaW5saW5lIGZsb2F0IHBvdyhmbG9hdCBfX3gsIGludCBfX3kpIHsgcmV0dXJuIF9fU1RBVElDX0NBU1QoZmxvYXQsIF9TVExQX0NNQVRIX0ZVTkNfTkFNRVNQQUNFOjpwb3coX194LCBfX1NUQVRJQ19DQVNUKGZsb2F0LF9feSkpKTsgfQotIyAgICBlbmRpZgotaW5saW5lIGRvdWJsZSBwb3coZG91YmxlIF9feCwgaW50IF9feSkgeyByZXR1cm4gX1NUTFBfQ01BVEhfRlVOQ19OQU1FU1BBQ0U6OnBvdyhfX3gsIF9fU1RBVElDX0NBU1QoZG91YmxlLF9feSkpOyB9Ci0jICAgIGlmICFkZWZpbmVkIChfU1RMUF9OT19MT05HX0RPVUJMRSkKLSMgICAgICBpZiAhZGVmaW5lZChfU1RMUF9OT19WRU5ET1JfTUFUSF9MKQotIyAgICAgICAgaWZuZGVmIF9fc3VuCi1pbmxpbmUgbG9uZyBkb3VibGUgcG93KGxvbmcgZG91YmxlIF9feCwgaW50IF9feSkgeyByZXR1cm4gX1NUTFBfQ01BVEhfRlVOQ19OQU1FU1BBQ0U6OnBvd2woX194LCBfX1NUQVRJQ19DQVNUKGxvbmcgZG91YmxlLF9feSkpOyB9Ci0jICAgICAgICBlbHNlCi0jICAgICAgICAgIGlmbmRlZiBfX1NVTlBST19DQwotaW5saW5lIGxvbmcgZG91YmxlIHBvdyhsb25nIGRvdWJsZSBfX3gsIGludCBfX3kpIHsgcmV0dXJuIDo6X19wb3dsKF9feCwgX19TVEFUSUNfQ0FTVChsb25nIGRvdWJsZSxfX3kpKTsgfQotIyAgICAgICAgICBlbHNlCi1pbmxpbmUgbG9uZyBkb3VibGUgcG93KGxvbmcgZG91YmxlIF9feCwgaW50IF9feSkgeyByZXR1cm4gX1NUTFBfVkVORE9SX0NTVEQ6Ol9fcG93bChfX3gsIF9fU1RBVElDX0NBU1QobG9uZyBkb3VibGUsX195KSk7IH0KLSMgICAgICAgICAgZW5kaWYKLSMgICAgICAgIGVuZGlmCi0jICAgICAgZWxzZQotaW5saW5lIGxvbmcgZG91YmxlIHBvdyhsb25nIGRvdWJsZSBfX3gsIGludCBfX3kpIHsgcmV0dXJuIF9fU1RBVElDX0NBU1QobG9uZyBkb3VibGUsIF9TVExQX0NNQVRIX0ZVTkNfTkFNRVNQQUNFOjpwb3coX194LCBfX1NUQVRJQ19DQVNUKGxvbmcgZG91YmxlLF9feSkpKTsgfQotIyAgICAgIGVuZGlmCi0jICAgIGVuZGlmCi0jICBlbHNlCi0vL1RoZSBNUyBuYXRpdmUgcG93IHZlcnNpb24gaGFzIGEgYnVnZ2VkIG92ZXJsb2FkIHNvIGl0IGlzIG5vdCBpbXBvcnRlZAotLy9pbiB0aGUgU1RMcG9ydCBuYW1lc3BhY2UuCi0vL0hlcmUgaXMgdGhlIGJ1Z2dlZCB2ZXJzaW9uOgotLy9pbmxpbmUgZG91YmxlIHBvdyhpbnQgX194LCBpbnQgX195KSAgICAgICAgICAgIHsgcmV0dXJuIChfUG93X2ludChfX3gsIF9feSkpOyB9Ci1pbmxpbmUgZG91YmxlICAgICAgcG93KGRvdWJsZSBfX3gsIGludCBfX3kpICAgICAgeyByZXR1cm4gKF9Qb3dfaW50KF9feCwgX195KSk7IH0KLWlubGluZSBmbG9hdCAgICAgICBwb3coZmxvYXQgX194LCBpbnQgX195KSAgICAgICB7IHJldHVybiAoX1Bvd19pbnQoX194LCBfX3kpKTsgfQotaW5saW5lIGxvbmcgZG91YmxlIHBvdyhsb25nIGRvdWJsZSBfX3gsIGludCBfX3kpIHsgcmV0dXJuIChfUG93X2ludChfX3gsIF9feSkpOyB9Ci0jICBlbmRpZgotI2VuZGlmCi0KLSNpZiAoZGVmaW5lZCAoX1NUTFBfTVNWQykgJiYgIWRlZmluZWQgKF9TVExQX1dDRSkpIHx8IGRlZmluZWQgKF9fSUNMKSB8fCBkZWZpbmVkIChfX3N1bikKLSMgIGlmIGRlZmluZWQgKF9TVExQX01TVkMpICYmIChfU1RMUF9NU1ZDID49IDE0MDApCi0jICAgIHByYWdtYSB3YXJuaW5nIChwdXNoKQotIyAgICBwcmFnbWEgd2FybmluZyAoZGlzYWJsZSA6IDQ5OTYpIC8vIGh5cG90IGlzIGRlcHJlY2F0ZWQuCi0jICBlbmRpZgotX1NUTFBfTUFUSF9JTkxJTkUyWFgoZmxvYXQsIGh5cG90LCBoeXBvdCkKLWlubGluZSBsb25nIGRvdWJsZSBoeXBvdChsb25nIGRvdWJsZSB4LCBsb25nIGRvdWJsZSB5KSB7IHJldHVybiBzcXJ0KHggKiB4ICsgeSAqIHkpOyB9Ci0jICBpZiBkZWZpbmVkIChfU1RMUF9NU1ZDKSAmJiAoX1NUTFBfTVNWQyA+PSAxNDAwKQotIyAgICBwcmFnbWEgd2FybmluZyAocG9wKQotIyAgZW5kaWYKLSNlbHNlCi0jICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfVUNMSUJDKQotaW5saW5lIGRvdWJsZSBoeXBvdChkb3VibGUgeCwgZG91YmxlIHkpIHsgcmV0dXJuIHNxcnQoeCAqIHggKyB5ICogeSk7IH0KLV9TVExQX0RFRl9NQVRIX0lOTElORTIoaHlwb3QsIGh5cG90KQotIyAgZWxpZiBkZWZpbmVkIChfU1RMUF9XQ0UpCi0gICAvKiBDRSBoYXMgYSBkb3VibGUgX2h5cG90KGRvdWJsZSxkb3VibGUpIHdoaWNoIHdlIHVzZSAqLwotaW5saW5lIGRvdWJsZSBoeXBvdChkb3VibGUgX194LCBkb3VibGUgX195KSB7IHJldHVybiBfaHlwb3QoX194LF9feSk7IH0KLV9TVExQX0RFRl9NQVRIX0lOTElORTIoaHlwb3QsIF9oeXBvdCkKLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9TVExQX1JFU1RPUkVfRlVOQ1RJT05fSU5UUklOU0lDKQotLy9yZXN0b3JhdGlvbiBvZiB0aGUgZGVmYXVsdCBpbnRyaW5zaWMgc3RhdHVzIG9mIHRob3NlIGZ1bmN0aW9uczoKLSMgIHByYWdtYSBpbnRyaW5zaWMgKGFicywgYWNvcywgYXNpbiwgYXRhbiwgYXRhbjIsIGNvcywgY29zaCwgZXhwLCBmYWJzLCBmbW9kLCBsb2csIGxvZzEwLCBzaW4sIHNpbmgsIHNxcnQsIHRhbiwgdGFuaCkKLSMgIGlmIGRlZmluZWQgKF9TVExQX1dDRSkKLSMgICAgcHJhZ21hIGludHJpbnNpYyAoY2VpbCwgZmxvb3IpCi0jICBlbmRpZgotIyAgcHJhZ21hIHdhcm5pbmcocG9wKQotIyAgdW5kZWYgX1NUTFBfUkVTVE9SRV9GVU5DVElPTl9JTlRSSU5TSUMKLSNlbmRpZiAvLyBfU1RMUF9NU1ZDICYmIF9TVExQX01TVkMgPD0gMTMwMCAmJiAhX1NUTFBfV0NFICYmIF9NU0NfRVhURU5TSU9OUwotCi0vKiBDKysgU3RhbmRhcmQgaXMgdW5jbGVhciBhYm91dCBzZXZlcmFsIGNhbGwgdG8gJ3VzaW5nIDo6ZnVuYycgaWYgbmV3IG92ZXJsb2FkcwotICogb2YgOjpmdW5jIGFwcGVhcnMgYmV0d2VlbiAyIHN1Y2Nlc3NpdmUgJ3VzaW5nJyBjYWxscy4gVG8gYXZvaWQgdGhpcyBwb3RlbnRpYWwKLSAqIHByb2JsZW0gd2UgcHJvdmlkZSBhbGwgYWJzIG92ZXJsb2FkIGJlZm9yZSB0aGUgJ3VzaW5nJyBjYWxsLgotICogQmV3YXJlOiBUaGlzIGhlYWRlciBpbmNsdXNpb24gaGFzIHRvIGJlIGFmdGVyIGFsbCBhYnMgb3ZlcmxvYWQgb2YgdGhpcyBmaWxlLgotICogICAgICAgICBUaGUgZmlyc3QgJ3VzaW5nIDo6YWJzJyBjYWxsIGlzIGdvaW5nIHRvIGJlIGluIHRoZSBvdGhlciBoZWFkZXIuCi0gKi8KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1NURExJQgotIyAgaW5jbHVkZSA8c3RsL19jc3RkbGliLmg+Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9TVExQX0lNUE9SVF9WRU5ET1JfQ1NURCkgJiYgIWRlZmluZWQgKF9TVExQX05PX0NTVERfRlVOQ1RJT05fSU1QT1JUUykKLV9TVExQX0JFR0lOX05BTUVTUEFDRQotdXNpbmcgOjphYnM7Ci11c2luZyA6OmFjb3M7Ci11c2luZyA6OmFzaW47Ci11c2luZyA6OmF0YW47Ci11c2luZyA6OmF0YW4yOwotdXNpbmcgOjpjZWlsOwotdXNpbmcgOjpjb3M7Ci11c2luZyA6OmNvc2g7Ci11c2luZyA6OmV4cDsKLXVzaW5nIDo6ZmFiczsKLXVzaW5nIDo6Zmxvb3I7Ci11c2luZyA6OmZtb2Q7Ci11c2luZyA6OmZyZXhwOwotdXNpbmcgOjpoeXBvdDsKLXVzaW5nIDo6bGRleHA7Ci11c2luZyA6OmxvZzsKLXVzaW5nIDo6bG9nMTA7Ci11c2luZyA6Om1vZGY7Ci11c2luZyA6OnBvdzsKLXVzaW5nIDo6c2luOwotdXNpbmcgOjpzaW5oOwotdXNpbmcgOjpzcXJ0OwotdXNpbmcgOjp0YW47Ci11c2luZyA6OnRhbmg7Ci1fU1RMUF9FTkRfTkFNRVNQQUNFCi0jICBpZiBkZWZpbmVkIChfX0JPUkxBTkRDX18pICYmIChfX0JPUkxBTkRDX18gPj0gMHg1NjApCi11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6X2VjdnQ7Ci11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6X2ZjdnQ7Ci0jICBlbmRpZgotI2VuZGlmCi0KLSNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9DTUFUSCAqLwotCi0vLyBMb2NhbCBWYXJpYWJsZXM6Ci0vLyBtb2RlOkMrKwotLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RsL19jb2RlY3Z0LmggYi9zdGwvX2NvZGVjdnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FlZTdmMy4uMDAwMDAwMAotLS0gYS9zdGwvX2NvZGVjdnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQyNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotLy8gV0FSTklORzogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgQysrCi0vLyBzdGFuZGFyZCBsaWJyYXJ5IGhlYWRlcnMuICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSB0aGlzIGhlYWRlcgotLy8gZmlsZSBkaXJlY3RseS4KLQotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NPREVDVlRfSAotI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9DT0RFQ1ZUX0gKLQotI2lmbmRlZiBfU1RMUF9DX0xPQ0FMRV9ICi0jICBpbmNsdWRlIDxzdGwvY19sb2NhbGUuaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0xPQ0FMRV9ICi0jICBpbmNsdWRlIDxzdGwvX2xvY2FsZS5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQUxHT0JBU0VfSAotIyAgaW5jbHVkZSA8c3RsL19hbGdvYmFzZS5oPgotI2VuZGlmCi0KLV9TVExQX0JFR0lOX05BTUVTUEFDRQotCi1jbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBjb2RlY3Z0X2Jhc2UgewotcHVibGljOgotICBlbnVtIHJlc3VsdCB7b2ssIHBhcnRpYWwsIGVycm9yLCBub2NvbnZ9OwotfTsKLQotdGVtcGxhdGUgPGNsYXNzIF9JbnRlcm5ULCBjbGFzcyBfRXh0ZXJuVCwgY2xhc3MgX1N0YXRlVD4KLWNsYXNzIGNvZGVjdnQgOiBwdWJsaWMgbG9jYWxlOjpmYWNldCwgcHVibGljIGNvZGVjdnRfYmFzZSB7Ci1wdWJsaWM6Ci0gIHR5cGVkZWYgX0ludGVyblQgaW50ZXJuX3R5cGU7Ci0gIHR5cGVkZWYgX0V4dGVyblQgZXh0ZXJuX3R5cGU7Ci0gIHR5cGVkZWYgX1N0YXRlVCBzdGF0ZV90eXBlOwotCi0jaWYgZGVmaW5lZCAoX1NUTFBfTVNWQykgJiYgKF9TVExQX01TVkMgPCAxMzAwKQotICAvKiBGb3IgdGhlIG1vbWVudCBWQzYgZG8gbm90IHN1cHBvcnQgdGhpcyBmYWNldCBkZWZhdWx0IGltcGxlbWVudGF0aW9uCi0gICAqIGJlY2F1c2Ugb2YgdGhlIHN0YXRpYyBsb2NhbGU6OmlkIGluc3RhbmNlLiBXaGVuIFZDNiBzZWUgdGhpcyBkZWZpbml0aW9uCi0gICAqIGl0IGdvZXMgY3Jhc3kgd2l0aCBsb2NhbGU6OmlkIHN0YXRpYyBpbnN0YW5jZXMgYW5kIGFsbCB0aGUgaGFzX2ZhY2V0IHRlc3RzCi0gICAqIHVuaXQgdGVzdHMgYXJlIGZhaWxpbmcuCi0gICAqLwotfTsKLSNlbHNlCi0gIGV4cGxpY2l0IGNvZGVjdnQoc2l6ZV90IF9fcmVmcyA9IDApIDogbG9jYWxlOjpmYWNldChfX3JlZnMpIHt9Ci0KLSAgcmVzdWx0IG91dChzdGF0ZV90eXBlJiAgICAgICAgICBfX3N0YXRlLAotICAgICAgICAgICAgIGNvbnN0IGludGVybl90eXBlKiAgIF9fZnJvbSwKLSAgICAgICAgICAgICBjb25zdCBpbnRlcm5fdHlwZSogICBfX2Zyb21fZW5kLAotICAgICAgICAgICAgIGNvbnN0IGludGVybl90eXBlKiYgIF9fZnJvbV9uZXh0LAotICAgICAgICAgICAgIGV4dGVybl90eXBlKiAgICAgICAgIF9fdG8sCi0gICAgICAgICAgICAgZXh0ZXJuX3R5cGUqICAgICAgICAgX190b19saW1pdCwKLSAgICAgICAgICAgICBleHRlcm5fdHlwZSomICAgICAgICBfX3RvX25leHQpIGNvbnN0IHsKLSAgICByZXR1cm4gZG9fb3V0KF9fc3RhdGUsCi0gICAgICAgICAgICAgICAgICBfX2Zyb20sIF9fZnJvbV9lbmQsIF9fZnJvbV9uZXh0LAotICAgICAgICAgICAgICAgICAgX190bywgICBfX3RvX2xpbWl0LCBfX3RvX25leHQpOwotICB9Ci0KLSAgcmVzdWx0IHVuc2hpZnQoc3RhdGVfdHlwZSYgICAgX19zdGF0ZSwKLSAgICAgICAgICAgICAgICAgZXh0ZXJuX3R5cGUqICAgX190bywKLSAgICAgICAgICAgICAgICAgZXh0ZXJuX3R5cGUqICAgX190b19saW1pdCwKLSAgICAgICAgICAgICAgICAgZXh0ZXJuX3R5cGUqJiAgX190b19uZXh0KSBjb25zdCB7Ci0gICAgcmV0dXJuIGRvX3Vuc2hpZnQoX19zdGF0ZSwgX190bywgX190b19saW1pdCwgX190b19uZXh0KTsKLSAgfQotCi0gIHJlc3VsdCBpbihzdGF0ZV90eXBlJiAgICAgICAgIF9fc3RhdGUsCi0gICAgICAgICAgICBjb25zdCBleHRlcm5fdHlwZSogIF9fZnJvbSwKLSAgICAgICAgICAgIGNvbnN0IGV4dGVybl90eXBlKiAgX19mcm9tX2VuZCwKLSAgICAgICAgICAgIGNvbnN0IGV4dGVybl90eXBlKiYgX19mcm9tX25leHQsCi0gICAgICAgICAgICBpbnRlcm5fdHlwZSogICAgICAgIF9fdG8sCi0gICAgICAgICAgICBpbnRlcm5fdHlwZSogICAgICAgIF9fdG9fbGltaXQsCi0gICAgICAgICAgICBpbnRlcm5fdHlwZSomICAgICAgIF9fdG9fbmV4dCkgY29uc3QgewotICAgIHJldHVybiBkb19pbihfX3N0YXRlLAotICAgICAgICAgICAgICAgICBfX2Zyb20sIF9fZnJvbV9lbmQsIF9fZnJvbV9uZXh0LAotICAgICAgICAgICAgICAgICBfX3RvLCAgX190b19saW1pdCwgX190b19uZXh0KTsKLSAgfQotCi0gIGludCBlbmNvZGluZygpIGNvbnN0IF9TVExQX05PVEhST1cgeyByZXR1cm4gZG9fZW5jb2RpbmcoKTsgfQotCi0gIGJvb2wgYWx3YXlzX25vY29udigpIGNvbnN0IF9TVExQX05PVEhST1cgeyByZXR1cm4gZG9fYWx3YXlzX25vY29udigpOyB9Ci0KLSAgaW50IGxlbmd0aChjb25zdCBzdGF0ZV90eXBlJiAgX19zdGF0ZSwKLSAgICAgICAgICAgICBjb25zdCBleHRlcm5fdHlwZSogX19mcm9tLAotICAgICAgICAgICAgIGNvbnN0IGV4dGVybl90eXBlKiBfX2VuZCwKLSAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgX19tYXgpIGNvbnN0IHsKLSAgICByZXR1cm4gZG9fbGVuZ3RoKF9fc3RhdGUsIF9fZnJvbSwgX19lbmQsIF9fbWF4KTsKLSAgfQotCi0gIGludCBtYXhfbGVuZ3RoKCkgY29uc3QgX1NUTFBfTk9USFJPVyB7IHJldHVybiBkb19tYXhfbGVuZ3RoKCk7IH0KLQotICBzdGF0aWMgX1NUTFBfU1RBVElDX01FTUJFUl9ERUNMU1BFQyBsb2NhbGU6OmlkIGlkOwotCi1wcm90ZWN0ZWQ6Ci0gIH5jb2RlY3Z0KCkge30KLQotICB2aXJ0dWFsIHJlc3VsdCBkb19vdXQoc3RhdGVfdHlwZSYsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnRlcm5fdHlwZSogIF9fZnJvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludGVybl90eXBlKiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludGVybl90eXBlKiYgX19mcm9tX25leHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5fdHlwZSogICAgICAgIF9fdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5fdHlwZSosCi0gICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5fdHlwZSomICAgICAgIF9fdG9fbmV4dCkgY29uc3QKLSAgeyBfX2Zyb21fbmV4dCA9IF9fZnJvbTsgX190b19uZXh0ICAgPSBfX3RvOyByZXR1cm4gbm9jb252OyB9Ci0KLSAgdmlydHVhbCByZXN1bHQgZG9faW4gKHN0YXRlX3R5cGUmLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXh0ZXJuX3R5cGUqICBfX2Zyb20sCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleHRlcm5fdHlwZSosCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleHRlcm5fdHlwZSomIF9fZnJvbV9uZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuX3R5cGUqICAgICAgICBfX3RvLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuX3R5cGUqLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuX3R5cGUqJiAgICAgICBfX3RvX25leHQpIGNvbnN0Ci0gIHsgX19mcm9tX25leHQgPSBfX2Zyb207IF9fdG9fbmV4dCA9IF9fdG87IHJldHVybiBub2NvbnY7IH0KLQotICB2aXJ0dWFsIHJlc3VsdCBkb191bnNoaWZ0KHN0YXRlX3R5cGUmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybl90eXBlKiBfX3RvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybl90eXBlKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5fdHlwZSomIF9fdG9fbmV4dCkgY29uc3QKLSAgeyBfX3RvX25leHQgPSBfX3RvOyByZXR1cm4gbm9jb252OyB9Ci0KLSAgdmlydHVhbCBpbnQgZG9fZW5jb2RpbmcoKSBjb25zdCBfU1RMUF9OT1RIUk9XCi0gIHsgcmV0dXJuIDE7IH0KLQotICB2aXJ0dWFsIGJvb2wgZG9fYWx3YXlzX25vY29udigpIGNvbnN0IF9TVExQX05PVEhST1cKLSAgeyByZXR1cm4gdHJ1ZTsgfQotCi0gIHZpcnR1YWwgaW50IGRvX2xlbmd0aChjb25zdCBzdGF0ZV90eXBlJiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4dGVybl90eXBlKiBfX2Zyb20sCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleHRlcm5fdHlwZSogX19lbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgX19tYXgpIGNvbnN0Ci0gIHsgcmV0dXJuIChpbnQpKG1pbikgKCBfX1NUQVRJQ19DQVNUKHNpemVfdCwgKF9fZW5kIC0gX19mcm9tKSksIF9fbWF4KTsgfQotCi0gIHZpcnR1YWwgaW50IGRvX21heF9sZW5ndGgoKSBjb25zdCBfU1RMUF9OT1RIUk9XCi0gIHsgcmV0dXJuIDE7IH0KLQotcHJpdmF0ZToKLSAgY29kZWN2dChjb25zdCBjb2RlY3Z0PGludGVybl90eXBlLCBleHRlcm5fdHlwZSwgc3RhdGVfdHlwZT4mKTsKLSAgY29kZWN2dDxpbnRlcm5fdHlwZSwgZXh0ZXJuX3R5cGUsIHN0YXRlX3R5cGU+JiBvcGVyYXRvciA9IChjb25zdCBjb2RlY3Z0PGludGVybl90eXBlLCBleHRlcm5fdHlwZSwgc3RhdGVfdHlwZT4mKTsKLX07Ci0KLSMgIGlmIGRlZmluZWQgKF9TVExQX0VYUE9TRV9TVFJFQU1fSU1QTEVNRU5UQVRJT04pICYmICFkZWZpbmVkIChfU1RMUF9MSU5LX1RJTUVfSU5TVEFOVElBVElPTikKLSMgICAgaWYgKF9TVExQX1NUQVRJQ19URU1QTEFURV9EQVRBID4gMCkKLSMgICAgICBpZiAhZGVmaW5lZCAoX19CT1JMQU5EQ19fKQotdGVtcGxhdGUgPGNsYXNzIF9JbnRlcm5ULCBjbGFzcyBfRXh0ZXJuVCwgY2xhc3MgX1N0YXRlVD4KLWxvY2FsZTo6aWQgY29kZWN2dDxfSW50ZXJuVCwgX0V4dGVyblQsIF9TdGF0ZVQ+OjppZDsKLSMgICAgICBlbmRpZgotIyAgICBlbmRpZgotIyAgZW5kaWYKLSNlbmRpZgotCi10ZW1wbGF0ZSA8Y2xhc3MgX0ludGVyblQsIGNsYXNzIF9FeHRlcm5ULCBjbGFzcyBfU3RhdGVUPgotY2xhc3MgY29kZWN2dF9ieW5hbWUgOiBwdWJsaWMgY29kZWN2dDxfSW50ZXJuVCwgX0V4dGVyblQsIF9TdGF0ZVQ+IHt9OwotCi1fU1RMUF9URU1QTEFURV9OVUxMCi1jbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBjb2RlY3Z0PGNoYXIsIGNoYXIsIG1ic3RhdGVfdD4KLSAgOiBwdWJsaWMgbG9jYWxlOjpmYWNldCwgcHVibGljIGNvZGVjdnRfYmFzZQotewotICBmcmllbmQgY2xhc3MgX0xvY2FsZV9pbXBsOwotCi1wdWJsaWM6Ci0gIHR5cGVkZWYgY2hhciAgICAgICBpbnRlcm5fdHlwZTsKLSAgdHlwZWRlZiBjaGFyICAgICAgIGV4dGVybl90eXBlOwotICB0eXBlZGVmIG1ic3RhdGVfdCAgc3RhdGVfdHlwZTsKLQotICBleHBsaWNpdCBjb2RlY3Z0KHNpemVfdCBfX3JlZnMgPSAwKSA6IGxvY2FsZTo6ZmFjZXQoX19yZWZzKSB7fQotCi0gIHJlc3VsdCBvdXQobWJzdGF0ZV90JiAgIF9fc3RhdGUsCi0gICAgICAgICAgICAgY29uc3QgY2hhciogIF9fZnJvbSwKLSAgICAgICAgICAgICBjb25zdCBjaGFyKiAgX19mcm9tX2VuZCwKLSAgICAgICAgICAgICBjb25zdCBjaGFyKiYgX19mcm9tX25leHQsCi0gICAgICAgICAgICAgY2hhciogICAgICAgIF9fdG8sCi0gICAgICAgICAgICAgY2hhciogICAgICAgIF9fdG9fbGltaXQsCi0gICAgICAgICAgICAgY2hhciomICAgICAgIF9fdG9fbmV4dCkgY29uc3QgewotICAgIHJldHVybiBkb19vdXQoX19zdGF0ZSwKLSAgICAgICAgICAgICAgICAgIF9fZnJvbSwgX19mcm9tX2VuZCwgX19mcm9tX25leHQsCi0gICAgICAgICAgICAgICAgICBfX3RvLCAgIF9fdG9fbGltaXQsIF9fdG9fbmV4dCk7Ci0gIH0KLQotICByZXN1bHQgdW5zaGlmdChtYnN0YXRlX3QmIF9fc3RhdGUsCi0gICAgICAgICAgICAgICAgIGNoYXIqIF9fdG8sIGNoYXIqIF9fdG9fbGltaXQsIGNoYXIqJiBfX3RvX25leHQpIGNvbnN0Ci0gICAgeyByZXR1cm4gZG9fdW5zaGlmdChfX3N0YXRlLCBfX3RvLCBfX3RvX2xpbWl0LCBfX3RvX25leHQpOyB9Ci0KLSAgcmVzdWx0IGluKHN0YXRlX3R5cGUmICAgX19zdGF0ZSwKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqICBfX2Zyb20sCi0gICAgICAgICAgICBjb25zdCBjaGFyKiAgX19mcm9tX2VuZCwKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqJiBfX2Zyb21fbmV4dCwKLSAgICAgICAgICAgIGNoYXIqICAgICAgICBfX3RvLAotICAgICAgICAgICAgY2hhciogICAgICAgIF9fdG9fbGltaXQsCi0gICAgICAgICAgICBjaGFyKiYgICAgICAgX190b19uZXh0KSBjb25zdCB7Ci0gICAgcmV0dXJuIGRvX2luKF9fc3RhdGUsCi0gICAgICAgICAgICAgICAgIF9fZnJvbSwgX19mcm9tX2VuZCwgX19mcm9tX25leHQsCi0gICAgICAgICAgICAgICAgIF9fdG8sICAgX190b19saW1pdCwgX190b19uZXh0KTsKLSAgfQotCi0gIGludCBlbmNvZGluZygpIGNvbnN0IF9TVExQX05PVEhST1cgeyByZXR1cm4gZG9fZW5jb2RpbmcoKTsgfQotCi0gIGJvb2wgYWx3YXlzX25vY29udigpIGNvbnN0IF9TVExQX05PVEhST1cgeyByZXR1cm4gZG9fYWx3YXlzX25vY29udigpOyB9Ci0KLSAgaW50IGxlbmd0aChjb25zdCBzdGF0ZV90eXBlJiBfX3N0YXRlLAotICAgICAgICAgICAgIGNvbnN0IGNoYXIqIF9fZnJvbSwgY29uc3QgY2hhciogX19lbmQsCi0gICAgICAgICAgICAgc2l6ZV90IF9fbWF4KSBjb25zdAotICAgIHsgcmV0dXJuIGRvX2xlbmd0aChfX3N0YXRlLCBfX2Zyb20sIF9fZW5kLCBfX21heCk7IH0KLQotICBpbnQgbWF4X2xlbmd0aCgpIGNvbnN0IF9TVExQX05PVEhST1cgeyByZXR1cm4gZG9fbWF4X2xlbmd0aCgpOyB9Ci0KLSAgc3RhdGljIF9TVExQX1NUQVRJQ19NRU1CRVJfREVDTFNQRUMgbG9jYWxlOjppZCBpZDsKLQotcHJvdGVjdGVkOgotICB+Y29kZWN2dCgpOwotCi0gIHZpcnR1YWwgcmVzdWx0IGRvX291dChtYnN0YXRlX3QmICAgLyogX19zdGF0ZSAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBfX2Zyb20sCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgLyogX19mcm9tX2VuZCAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqJiBfX2Zyb21fbmV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqICAgICAgICBfX3RvLAotICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogICAgICAgIC8qIF9fdG9fbGltaXQgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiYgICAgICAgX190b19uZXh0KSBjb25zdDsKLQotICB2aXJ0dWFsIHJlc3VsdCBkb19pbiAobWJzdGF0ZV90JiAgIC8qIF9fc3RhdGUgKi8gLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIF9fZnJvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAvKiBfX2Zyb21fZW5kICovLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciomIF9fZnJvbV9uZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogICAgICAgIF9fdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiAgICAgICAgLyogX190b19lbmQgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiYgICAgICAgX190b19uZXh0KSBjb25zdDsKLQotICB2aXJ0dWFsIHJlc3VsdCBkb191bnNoaWZ0KG1ic3RhdGVfdCYgLyogX19zdGF0ZSAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiAgICAgIF9fdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogICAgICAvKiBfX3RvX2xpbWl0ICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqJiAgICAgX190b19uZXh0KSBjb25zdDsKLQotICB2aXJ0dWFsIGludCBkb19lbmNvZGluZygpIGNvbnN0IF9TVExQX05PVEhST1c7Ci0gIHZpcnR1YWwgYm9vbCBkb19hbHdheXNfbm9jb252KCkgY29uc3QgX1NUTFBfTk9USFJPVzsKLSAgdmlydHVhbCBpbnQgZG9fbGVuZ3RoKGNvbnN0IG1ic3RhdGVfdCYgICAgICAgICBfX3N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgIGNoYXIqIF9fZnJvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICBjaGFyKiBfX2VuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBfX21heCkgY29uc3Q7Ci0gIHZpcnR1YWwgaW50IGRvX21heF9sZW5ndGgoKSBjb25zdCBfU1RMUF9OT1RIUk9XOwotcHJpdmF0ZToKLSAgY29kZWN2dChjb25zdCBjb2RlY3Z0PGNoYXIsIGNoYXIsIG1ic3RhdGVfdD4mKTsKLSAgY29kZWN2dDxjaGFyLCBjaGFyLCBtYnN0YXRlX3Q+JiBvcGVyYXRvciA9KGNvbnN0IGNvZGVjdnQ8Y2hhciwgY2hhciwgbWJzdGF0ZV90PiYpOwotfTsKLQotIyBpZm5kZWYgX1NUTFBfTk9fV0NIQVJfVAotCi1fU1RMUF9URU1QTEFURV9OVUxMCi1jbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBjb2RlY3Z0PHdjaGFyX3QsIGNoYXIsIG1ic3RhdGVfdD4KLSAgOiBwdWJsaWMgbG9jYWxlOjpmYWNldCwgcHVibGljIGNvZGVjdnRfYmFzZQotewotICBmcmllbmQgY2xhc3MgX0xvY2FsZV9pbXBsOwotcHVibGljOgotICB0eXBlZGVmIHdjaGFyX3QgICAgaW50ZXJuX3R5cGU7Ci0gIHR5cGVkZWYgY2hhciAgICAgICBleHRlcm5fdHlwZTsKLSAgdHlwZWRlZiBtYnN0YXRlX3QgIHN0YXRlX3R5cGU7Ci0KLSAgZXhwbGljaXQgY29kZWN2dChzaXplX3QgX19yZWZzID0gMCkgOiBsb2NhbGU6OmZhY2V0KF9fcmVmcykge30KLQotICByZXN1bHQgb3V0KG1ic3RhdGVfdCYgICAgICBfX3N0YXRlLAotICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqICBfX2Zyb20sCi0gICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogIF9fZnJvbV9lbmQsCi0gICAgICAgICAgICAgY29uc3Qgd2NoYXJfdComIF9fZnJvbV9uZXh0LAotICAgICAgICAgICAgIGNoYXIqICAgICAgICAgICBfX3RvLAotICAgICAgICAgICAgIGNoYXIqICAgICAgICAgICBfX3RvX2xpbWl0LAotICAgICAgICAgICAgIGNoYXIqJiAgICAgICAgICBfX3RvX25leHQpIGNvbnN0IHsKLSAgICByZXR1cm4gZG9fb3V0KF9fc3RhdGUsCi0gICAgICAgICAgICAgICAgICBfX2Zyb20sIF9fZnJvbV9lbmQsIF9fZnJvbV9uZXh0LAotICAgICAgICAgICAgICAgICAgX190bywgICBfX3RvX2xpbWl0LCBfX3RvX25leHQpOwotICB9Ci0KLSAgcmVzdWx0IHVuc2hpZnQobWJzdGF0ZV90JiBfX3N0YXRlLAotICAgICAgICAgICAgICAgICBjaGFyKiAgX190bywgY2hhciogIF9fdG9fbGltaXQsIGNoYXIqJiBfX3RvX25leHQpIGNvbnN0IHsKLSAgICByZXR1cm4gZG9fdW5zaGlmdChfX3N0YXRlLCBfX3RvLCBfX3RvX2xpbWl0LCBfX3RvX25leHQpOwotICB9Ci0KLSAgcmVzdWx0IGluKG1ic3RhdGVfdCYgICBfX3N0YXRlLAotICAgICAgICAgICAgY29uc3QgY2hhciogIF9fZnJvbSwKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqICBfX2Zyb21fZW5kLAotICAgICAgICAgICAgY29uc3QgY2hhciomIF9fZnJvbV9uZXh0LAotICAgICAgICAgICAgd2NoYXJfdCogICAgIF9fdG8sCi0gICAgICAgICAgICB3Y2hhcl90KiAgICAgX190b19saW1pdCwKLSAgICAgICAgICAgIHdjaGFyX3QqJiAgICBfX3RvX25leHQpIGNvbnN0IHsKLSAgICByZXR1cm4gZG9faW4oX19zdGF0ZSwKLSAgICAgICAgICAgICAgICAgX19mcm9tLCBfX2Zyb21fZW5kLCBfX2Zyb21fbmV4dCwKLSAgICAgICAgICAgICAgICAgX190bywgICBfX3RvX2xpbWl0LCBfX3RvX25leHQpOwotICB9Ci0KLSAgaW50IGVuY29kaW5nKCkgY29uc3QgX1NUTFBfTk9USFJPVyB7IHJldHVybiBkb19lbmNvZGluZygpOyB9Ci0KLSAgYm9vbCBhbHdheXNfbm9jb252KCkgY29uc3QgX1NUTFBfTk9USFJPVyB7IHJldHVybiBkb19hbHdheXNfbm9jb252KCk7IH0KLQotICBpbnQgbGVuZ3RoKGNvbnN0IG1ic3RhdGVfdCYgX19zdGF0ZSwKLSAgICAgICAgICAgICBjb25zdCBjaGFyKiBfX2Zyb20sIGNvbnN0IGNoYXIqIF9fZW5kLAotICAgICAgICAgICAgIHNpemVfdCBfX21heCkgY29uc3QKLSAgICB7IHJldHVybiBkb19sZW5ndGgoX19zdGF0ZSwgX19mcm9tLCBfX2VuZCwgX19tYXgpOyB9Ci0KLSAgaW50IG1heF9sZW5ndGgoKSBjb25zdCBfU1RMUF9OT1RIUk9XIHsgcmV0dXJuIGRvX21heF9sZW5ndGgoKTsgfQotCi0gIHN0YXRpYyBfU1RMUF9TVEFUSUNfTUVNQkVSX0RFQ0xTUEVDIGxvY2FsZTo6aWQgaWQ7Ci0KLXByb3RlY3RlZDoKLSAgfmNvZGVjdnQoKTsKLQotICB2aXJ0dWFsIHJlc3VsdCBkb19vdXQobWJzdGF0ZV90JiAgICAgICAgIF9fc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiAgX19mcm9tLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogIF9fZnJvbV9lbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiYgX19mcm9tX25leHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiAgICAgICAgX190bywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqICAgICAgICBfX3RvX2xpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgY2hhciomICAgICAgIF9fdG9fbmV4dCkgY29uc3Q7Ci0KLSAgdmlydHVhbCByZXN1bHQgZG9faW4gKG1ic3RhdGVfdCYgICAgICAgICBfX3N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIF9fZnJvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBfX2Zyb21fZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciomIF9fZnJvbV9uZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgd2NoYXJfdCogICAgICAgIF9fdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICB3Y2hhcl90KiAgICAgICAgX190b19saW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHdjaGFyX3QqJiAgICAgICBfX3RvX25leHQpIGNvbnN0OwotCi0gIHZpcnR1YWwgcmVzdWx0IGRvX3Vuc2hpZnQobWJzdGF0ZV90JiAgIF9fc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogIF9fdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogIF9fdG9fbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciomIF9fdG9fbmV4dCkgY29uc3Q7Ci0KLSAgdmlydHVhbCBpbnQgZG9fZW5jb2RpbmcoKSBjb25zdCBfU1RMUF9OT1RIUk9XOwotCi0gIHZpcnR1YWwgYm9vbCBkb19hbHdheXNfbm9jb252KCkgY29uc3QgX1NUTFBfTk9USFJPVzsKLQotICB2aXJ0dWFsIGludCBkb19sZW5ndGgoY29uc3QgbWJzdGF0ZV90JiBfX3N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgIGNoYXIqIF9fZnJvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICBjaGFyKiBfX2VuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBfX21heCkgY29uc3Q7Ci0KLSAgdmlydHVhbCBpbnQgZG9fbWF4X2xlbmd0aCgpIGNvbnN0IF9TVExQX05PVEhST1c7Ci0KLXByaXZhdGU6Ci0gIGNvZGVjdnQoY29uc3QgY29kZWN2dDx3Y2hhcl90LCBjaGFyLCBtYnN0YXRlX3Q+Jik7Ci0gIGNvZGVjdnQ8d2NoYXJfdCwgY2hhciwgbWJzdGF0ZV90PiYgb3BlcmF0b3IgPSAoY29uc3QgY29kZWN2dDx3Y2hhcl90LCBjaGFyLCBtYnN0YXRlX3Q+Jik7Ci19OwotCi0jIGVuZGlmCi0KLV9TVExQX1RFTVBMQVRFX05VTEwKLWNsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIGNvZGVjdnRfYnluYW1lPGNoYXIsIGNoYXIsIG1ic3RhdGVfdD4KLSAgOiBwdWJsaWMgY29kZWN2dDxjaGFyLCBjaGFyLCBtYnN0YXRlX3Q+IHsKLXB1YmxpYzoKLSAgZXhwbGljaXQgY29kZWN2dF9ieW5hbWUoY29uc3QgY2hhciogX19uYW1lLCBzaXplX3QgX19yZWZzID0gMCk7Ci0gIH5jb2RlY3Z0X2J5bmFtZSgpOwotcHJpdmF0ZToKLSAgY29kZWN2dF9ieW5hbWUoY29uc3QgY29kZWN2dF9ieW5hbWU8Y2hhciwgY2hhciwgbWJzdGF0ZV90PiYpOwotICBjb2RlY3Z0X2J5bmFtZTxjaGFyLCBjaGFyLCBtYnN0YXRlX3Q+JiBvcGVyYXRvciA9KGNvbnN0IGNvZGVjdnRfYnluYW1lPGNoYXIsIGNoYXIsIG1ic3RhdGVfdD4mKTsKLX07Ci0KLSMgaWZuZGVmIF9TVExQX05PX1dDSEFSX1QKLV9TVExQX1RFTVBMQVRFX05VTEwKLWNsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIGNvZGVjdnRfYnluYW1lPHdjaGFyX3QsIGNoYXIsIG1ic3RhdGVfdD4KLSAgOiBwdWJsaWMgY29kZWN2dDx3Y2hhcl90LCBjaGFyLCBtYnN0YXRlX3Q+Ci17Ci1wdWJsaWM6Ci0gIGV4cGxpY2l0IGNvZGVjdnRfYnluYW1lKGNvbnN0IGNoYXIgKiBfX25hbWUsIHNpemVfdCBfX3JlZnMgPSAwLCBfTG9jYWxlX25hbWVfaGludCogX19oaW50ID0gMCk7Ci0KLXByb3RlY3RlZDoKLSAgfmNvZGVjdnRfYnluYW1lKCk7Ci0KLSAgdmlydHVhbCByZXN1bHQgZG9fb3V0KG1ic3RhdGVfdCYgICAgICAgICBfX3N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogIF9fZnJvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqICBfX2Zyb21fZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdComIF9fZnJvbV9uZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogICAgICAgIF9fdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiAgICAgICAgX190b19saW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqJiAgICAgICBfX3RvX25leHQpIGNvbnN0OwotCi0gIHZpcnR1YWwgcmVzdWx0IGRvX2luIChtYnN0YXRlX3QmICAgICAgICAgX19zdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBfX2Zyb20sCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgX19mcm9tX2VuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqJiBfX2Zyb21fbmV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHdjaGFyX3QqICAgICAgICBfX3RvLAotICAgICAgICAgICAgICAgICAgICAgICAgd2NoYXJfdCogICAgICAgIF9fdG9fbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICB3Y2hhcl90KiYgICAgICAgX190b19uZXh0KSBjb25zdDsKLQotICB2aXJ0dWFsIHJlc3VsdCBkb191bnNoaWZ0KG1ic3RhdGVfdCYgICBfX3N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqICBfX3RvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqICBfX3RvX2xpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqJiBfX3RvX25leHQpIGNvbnN0OwotCi0gIHZpcnR1YWwgaW50IGRvX2VuY29kaW5nKCkgY29uc3QgX1NUTFBfTk9USFJPVzsKLQotICB2aXJ0dWFsIGJvb2wgZG9fYWx3YXlzX25vY29udigpIGNvbnN0IF9TVExQX05PVEhST1c7Ci0KLSAgdmlydHVhbCBpbnQgZG9fbGVuZ3RoKGNvbnN0IG1ic3RhdGVfdCYgICAgICAgICBfX3N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgIGNoYXIqIF9fZnJvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICBjaGFyKiBfX2VuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBfX21heCkgY29uc3Q7Ci0KLSAgdmlydHVhbCBpbnQgZG9fbWF4X2xlbmd0aCgpIGNvbnN0IF9TVExQX05PVEhST1c7Ci0KLXByaXZhdGU6Ci0gIF9Mb2NhbGVfY3R5cGUqIF9NX2N0eXBlOwotICBjb2RlY3Z0X2J5bmFtZShjb25zdCBjb2RlY3Z0X2J5bmFtZTx3Y2hhcl90LCBjaGFyLCBtYnN0YXRlX3Q+Jik7Ci0gIGNvZGVjdnRfYnluYW1lPHdjaGFyX3QsIGNoYXIsIG1ic3RhdGVfdD4mIG9wZXJhdG9yID0oY29uc3QgY29kZWN2dF9ieW5hbWU8d2NoYXJfdCwgY2hhciwgbWJzdGF0ZV90PiYpOwotfTsKLQotIyBlbmRpZgotCi1fU1RMUF9FTkRfTkFNRVNQQUNFCi0KLSNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9DT0RFQ1ZUX0ggKi8KLQotLy8gTG9jYWwgVmFyaWFibGVzOgotLy8gbW9kZTpDKysKLS8vIEVuZDoKLQpkaWZmIC0tZ2l0IGEvc3RsL19jb2xsYXRlLmggYi9zdGwvX2NvbGxhdGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNlOGY2Ny4uMDAwMDAwMAotLS0gYS9zdGwvX2NvbGxhdGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotLy8gV0FSTklORzogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgQysrCi0vLyBzdGFuZGFyZCBsaWJyYXJ5IGhlYWRlcnMuICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSB0aGlzIGhlYWRlcgotLy8gZmlsZSBkaXJlY3RseS4KLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DT0xMQVRFX0gKLSNkZWZpbmUgX1NUTFBfSU5URVJOQUxfQ09MTEFURV9ICi0KLSNpZm5kZWYgX1NUTFBfQ19MT0NBTEVfSAotIyBpbmNsdWRlIDxzdGwvY19sb2NhbGUuaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0xPQ0FMRV9ICi0jIGluY2x1ZGUgPHN0bC9fbG9jYWxlLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9TVFJJTkdfSAotIyBpbmNsdWRlIDxzdGwvX3N0cmluZy5oPgotI2VuZGlmCi0KLV9TVExQX0JFR0lOX05BTUVTUEFDRQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPiBjbGFzcyBjb2xsYXRlIHt9OwotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4gY2xhc3MgY29sbGF0ZV9ieW5hbWUge307Ci0KLV9TVExQX1RFTVBMQVRFX05VTEwKLWNsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIGNvbGxhdGU8Y2hhcj4gOiBwdWJsaWMgbG9jYWxlOjpmYWNldAotewotICBmcmllbmQgY2xhc3MgX0xvY2FsZV9pbXBsOwotCi1wdWJsaWM6Ci0gIHR5cGVkZWYgY2hhciAgIGNoYXJfdHlwZTsKLSAgdHlwZWRlZiBzdHJpbmcgc3RyaW5nX3R5cGU7Ci0KLSAgZXhwbGljaXQgY29sbGF0ZShzaXplX3QgX19yZWZzID0gMCkgOiBsb2NhbGU6OmZhY2V0KF9fcmVmcykge30KLQotICBpbnQgY29tcGFyZShjb25zdCBjaGFyKiBfX2xvdzEsIGNvbnN0IGNoYXIqIF9faGlnaDEsCi0gICAgICAgICAgICAgIGNvbnN0IGNoYXIqIF9fbG93MiwgY29uc3QgY2hhciogX19oaWdoMikgY29uc3QgewotICAgIHJldHVybiBkb19jb21wYXJlKCBfX2xvdzEsIF9faGlnaDEsIF9fbG93MiwgX19oaWdoMik7Ci0gIH0KLQotICBzdHJpbmdfdHlwZSB0cmFuc2Zvcm0oY29uc3QgY2hhciogX19sb3csIGNvbnN0IGNoYXIqIF9faGlnaCkgY29uc3QgewotICAgIHJldHVybiBkb190cmFuc2Zvcm0oX19sb3csIF9faGlnaCk7Ci0gIH0KLQotICBsb25nIGhhc2goY29uc3QgY2hhciogX19sb3csIGNvbnN0IGNoYXIqIF9faGlnaCkgY29uc3QKLSAgICB7IHJldHVybiBkb19oYXNoKF9fbG93LCBfX2hpZ2gpOyB9Ci0KLSAgc3RhdGljIF9TVExQX1NUQVRJQ19NRU1CRVJfREVDTFNQRUMgbG9jYWxlOjppZCBpZDsKLQotcHJvdGVjdGVkOgotICB+Y29sbGF0ZSgpOwotCi0gIHZpcnR1YWwgaW50IGRvX2NvbXBhcmUoY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKikgY29uc3Q7Ci0gIHZpcnR1YWwgc3RyaW5nX3R5cGUgZG9fdHJhbnNmb3JtKGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKikgY29uc3Q7Ci0gIHZpcnR1YWwgbG9uZyBkb19oYXNoKGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKikgY29uc3Q7Ci1wcml2YXRlOgotICBjb2xsYXRlKGNvbnN0IGNvbGxhdGU8Y2hhcj4mKTsKLSAgY29sbGF0ZTxjaGFyPiYgb3BlcmF0b3IgPShjb25zdCBjb2xsYXRlPGNoYXI+Jik7Ci19OwotCi0jIGlmbmRlZiBfU1RMUF9OT19XQ0hBUl9UCi0KLV9TVExQX1RFTVBMQVRFX05VTEwKLWNsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIGNvbGxhdGU8d2NoYXJfdD4gOiBwdWJsaWMgbG9jYWxlOjpmYWNldAotewotICBmcmllbmQgY2xhc3MgX0xvY2FsZV9pbXBsOwotCi1wdWJsaWM6Ci0gIHR5cGVkZWYgd2NoYXJfdCBjaGFyX3R5cGU7Ci0gIHR5cGVkZWYgd3N0cmluZyBzdHJpbmdfdHlwZTsKLQotICBleHBsaWNpdCBjb2xsYXRlKHNpemVfdCBfX3JlZnMgPSAwKSA6IGxvY2FsZTo6ZmFjZXQoX19yZWZzKSB7fQotCi0gIGludCBjb21wYXJlKGNvbnN0IHdjaGFyX3QqIF9fbG93MSwgY29uc3Qgd2NoYXJfdCogX19oaWdoMSwKLSAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogX19sb3cyLCBjb25zdCB3Y2hhcl90KiBfX2hpZ2gyKSBjb25zdCB7Ci0gICAgcmV0dXJuIGRvX2NvbXBhcmUoIF9fbG93MSwgX19oaWdoMSwgX19sb3cyLCBfX2hpZ2gyKTsKLSAgfQotCi0gIHN0cmluZ190eXBlIHRyYW5zZm9ybShjb25zdCB3Y2hhcl90KiBfX2xvdywgY29uc3Qgd2NoYXJfdCogX19oaWdoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGRvX3RyYW5zZm9ybShfX2xvdywgX19oaWdoKTsKLSAgfQotCi0gIGxvbmcgaGFzaChjb25zdCB3Y2hhcl90KiBfX2xvdywgY29uc3Qgd2NoYXJfdCogX19oaWdoKSBjb25zdAotICAgIHsgcmV0dXJuIGRvX2hhc2goX19sb3csIF9faGlnaCk7IH0KLQotICBzdGF0aWMgX1NUTFBfU1RBVElDX01FTUJFUl9ERUNMU1BFQyBsb2NhbGU6OmlkIGlkOwotCi1wcm90ZWN0ZWQ6Ci0gIH5jb2xsYXRlKCk7Ci0KLSAgdmlydHVhbCBpbnQgZG9fY29tcGFyZShjb25zdCB3Y2hhcl90KiwgY29uc3Qgd2NoYXJfdCosCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCosIGNvbnN0IHdjaGFyX3QqKSBjb25zdDsKLSAgdmlydHVhbCBzdHJpbmdfdHlwZSBkb190cmFuc2Zvcm0oY29uc3Qgd2NoYXJfdCosIGNvbnN0IHdjaGFyX3QqKSBjb25zdDsKLSAgdmlydHVhbCBsb25nIGRvX2hhc2goY29uc3Qgd2NoYXJfdCogX19sb3csIGNvbnN0IHdjaGFyX3QqIF9faGlnaCkgY29uc3Q7Ci1wcml2YXRlOgotICBjb2xsYXRlKGNvbnN0IGNvbGxhdGU8d2NoYXJfdD4mKTsKLSAgY29sbGF0ZTx3Y2hhcl90PiYgb3BlcmF0b3IgPSAoY29uc3QgY29sbGF0ZTx3Y2hhcl90PiYpOwotfTsKLQotIyBlbmRpZiAvKiBOT19XQ0hBUl9UICovCi0KLV9TVExQX1RFTVBMQVRFX05VTEwKLWNsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIGNvbGxhdGVfYnluYW1lPGNoYXI+OiBwdWJsaWMgY29sbGF0ZTxjaGFyPgotewotcHVibGljOgotICBleHBsaWNpdCBjb2xsYXRlX2J5bmFtZShjb25zdCBjaGFyKiBfX25hbWUsIHNpemVfdCBfX3JlZnMgPSAwLCBfTG9jYWxlX25hbWVfaGludCogX19oaW50ID0gMCk7Ci0KLXByb3RlY3RlZDoKLSAgfmNvbGxhdGVfYnluYW1lKCk7Ci0KLSAgdmlydHVhbCBpbnQgZG9fY29tcGFyZShjb25zdCBjaGFyKiwgY29uc3QgY2hhciosCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKSBjb25zdDsKLSAgdmlydHVhbCBzdHJpbmdfdHlwZSBkb190cmFuc2Zvcm0oY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKSBjb25zdDsKLQotcHJpdmF0ZToKLSAgX0xvY2FsZV9jb2xsYXRlKiBfTV9jb2xsYXRlOwotICBjb2xsYXRlX2J5bmFtZShjb25zdCBjb2xsYXRlX2J5bmFtZTxjaGFyPiYpOwotICBjb2xsYXRlX2J5bmFtZTxjaGFyPiYgb3BlcmF0b3IgPShjb25zdCBjb2xsYXRlX2J5bmFtZTxjaGFyPiYpOwotICBmcmllbmQgX0xvY2FsZV9uYW1lX2hpbnQqIF9Mb2NhbGVfZXh0cmFjdF9oaW50KGNvbGxhdGVfYnluYW1lPGNoYXI+Kik7Ci19OwotCi0jIGlmbmRlZiBfU1RMUF9OT19XQ0hBUl9UCi0KLV9TVExQX1RFTVBMQVRFX05VTEwKLWNsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIGNvbGxhdGVfYnluYW1lPHdjaGFyX3Q+OiBwdWJsaWMgY29sbGF0ZTx3Y2hhcl90PgotewotcHVibGljOgotICBleHBsaWNpdCBjb2xsYXRlX2J5bmFtZShjb25zdCBjaGFyICogX19uYW1lLCBzaXplX3QgX19yZWZzID0gMCwgX0xvY2FsZV9uYW1lX2hpbnQqIF9faGludCA9IDApOwotCi1wcm90ZWN0ZWQ6Ci0gIH5jb2xsYXRlX2J5bmFtZSgpOwotCi0gIHZpcnR1YWwgaW50IGRvX2NvbXBhcmUoY29uc3Qgd2NoYXJfdCosIGNvbnN0IHdjaGFyX3QqLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqLCBjb25zdCB3Y2hhcl90KikgY29uc3Q7Ci0gIHZpcnR1YWwgc3RyaW5nX3R5cGUgZG9fdHJhbnNmb3JtKGNvbnN0IHdjaGFyX3QqLCBjb25zdCB3Y2hhcl90KikgY29uc3Q7Ci0KLXByaXZhdGU6Ci0gIF9Mb2NhbGVfY29sbGF0ZSogX01fY29sbGF0ZTsKLSAgY29sbGF0ZV9ieW5hbWUoY29uc3QgY29sbGF0ZV9ieW5hbWU8d2NoYXJfdD4mKTsKLSAgY29sbGF0ZV9ieW5hbWU8d2NoYXJfdD4mIG9wZXJhdG9yID0oY29uc3QgY29sbGF0ZV9ieW5hbWU8d2NoYXJfdD4mKTsKLX07Ci0KLSMgZW5kaWYgLyogTk9fV0NIQVJfVCAqLwotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+Ci1ib29sCi1fX2xvY2FsZV9kb19vcGVyYXRvcl9jYWxsIChjb25zdCBsb2NhbGUmIF9fbG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX194LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX195KSB7Ci0gIGNvbGxhdGU8X0NoYXJUPiBjb25zdCYgX19jb2xsID0gdXNlX2ZhY2V0PGNvbGxhdGU8X0NoYXJUPiA+KF9fbG9jKTsKLSAgcmV0dXJuIF9fY29sbC5jb21wYXJlKF9feC5kYXRhKCksIF9feC5kYXRhKCkgKyBfX3guc2l6ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgX195LmRhdGEoKSwgX195LmRhdGEoKSArIF9feS5zaXplKCkpIDwgMDsKLX0KLQotX1NUTFBfRU5EX05BTUVTUEFDRQotCi0jZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfQ09MTEFURV9IICovCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX2NvbXBsZXguYyBiL3N0bC9fY29tcGxleC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTMyNjBiLi4wMDAwMDAwCi0tLSBhL3N0bC9fY29tcGxleC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogQm9yaXMgRm9taXRjaGV2Ci0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICovCi0jaWZuZGVmIF9TVExQX0NPTVBMRVhfQwotI2RlZmluZSBfU1RMUF9DT01QTEVYX0MKLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DT01QTEVYCi0jICBpbmNsdWRlIDxzdGwvX2NvbXBsZXguaD4KLSNlbmRpZgotCi0jaWYgIWRlZmluZWQgKF9TVExQX1VTRV9OT19JT1NUUkVBTVMpCi0jICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfSVNUUkVBTQotIyAgICBpbmNsdWRlIDxzdGwvX2lzdHJlYW0uaD4KLSMgIGVuZGlmCi0KLSMgIGlmbmRlZiBfU1RMUF9JTlRFUk5BTF9TU1RSRUFNCi0jICAgIGluY2x1ZGUgPHN0bC9fc3N0cmVhbS5oPgotIyAgZW5kaWYKLQotIyAgaWZuZGVmIF9TVExQX1NUUklOR19JT19ICi0jICAgIGluY2x1ZGUgPHN0bC9fc3RyaW5nX2lvLmg+Ci0jICBlbmRpZgotI2VuZGlmCi0KLV9TVExQX0JFR0lOX05BTUVTUEFDRQotCi0vLyBOb24taW5saW5lIG1lbWJlciBmdW5jdGlvbnMuCi0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci12b2lkIGNvbXBsZXg8X1RwPjo6X2Rpdihjb25zdCBfVHAmIF9fejFfciwgY29uc3QgX1RwJiBfX3oxX2ksCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfVHAmIF9fejJfciwgY29uc3QgX1RwJiBfX3oyX2ksCi0gICAgICAgICAgICAgICAgICAgICAgICBfVHAmIF9fcmVzX3IsIF9UcCYgX19yZXNfaSkgewotICBfVHAgX19hciA9IF9fejJfciA+PSAwID8gX196Ml9yIDogLV9fejJfcjsKLSAgX1RwIF9fYWkgPSBfX3oyX2kgPj0gMCA/IF9fejJfaSA6IC1fX3oyX2k7Ci0KLSAgaWYgKF9fYXIgPD0gX19haSkgewotICAgIF9UcCBfX3JhdGlvID0gX196Ml9yIC8gX196Ml9pOwotICAgIF9UcCBfX2Rlbm9tID0gX196Ml9pICogKDEgKyBfX3JhdGlvICogX19yYXRpbyk7Ci0gICAgX19yZXNfciA9IChfX3oxX3IgKiBfX3JhdGlvICsgX196MV9pKSAvIF9fZGVub207Ci0gICAgX19yZXNfaSA9IChfX3oxX2kgKiBfX3JhdGlvIC0gX196MV9yKSAvIF9fZGVub207Ci0gIH0KLSAgZWxzZSB7Ci0gICAgX1RwIF9fcmF0aW8gPSBfX3oyX2kgLyBfX3oyX3I7Ci0gICAgX1RwIF9fZGVub20gPSBfX3oyX3IgKiAoMSArIF9fcmF0aW8gKiBfX3JhdGlvKTsKLSAgICBfX3Jlc19yID0gKF9fejFfciArIF9fejFfaSAqIF9fcmF0aW8pIC8gX19kZW5vbTsKLSAgICBfX3Jlc19pID0gKF9fejFfaSAtIF9fejFfciAqIF9fcmF0aW8pIC8gX19kZW5vbTsKLSAgfQotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotdm9pZCBjb21wbGV4PF9UcD46Ol9kaXYoY29uc3QgX1RwJiBfX3oxX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfVHAmIF9fejJfciwgY29uc3QgX1RwJiBfX3oyX2ksCi0gICAgICAgICAgICAgICAgICAgICAgICBfVHAmIF9fcmVzX3IsIF9UcCYgX19yZXNfaSkgewotICBfVHAgX19hciA9IF9fejJfciA+PSAwID8gX196Ml9yIDogLV9fejJfcjsKLSAgX1RwIF9fYWkgPSBfX3oyX2kgPj0gMCA/IF9fejJfaSA6IC1fX3oyX2k7Ci0KLSAgaWYgKF9fYXIgPD0gX19haSkgewotICAgIF9UcCBfX3JhdGlvID0gX196Ml9yIC8gX196Ml9pOwotICAgIF9UcCBfX2Rlbm9tID0gX196Ml9pICogKDEgKyBfX3JhdGlvICogX19yYXRpbyk7Ci0gICAgX19yZXNfciA9IChfX3oxX3IgKiBfX3JhdGlvKSAvIF9fZGVub207Ci0gICAgX19yZXNfaSA9IC0gX196MV9yIC8gX19kZW5vbTsKLSAgfQotICBlbHNlIHsKLSAgICBfVHAgX19yYXRpbyA9IF9fejJfaSAvIF9fejJfcjsKLSAgICBfVHAgX19kZW5vbSA9IF9fejJfciAqICgxICsgX19yYXRpbyAqIF9fcmF0aW8pOwotICAgIF9fcmVzX3IgPSBfX3oxX3IgLyBfX2Rlbm9tOwotICAgIF9fcmVzX2kgPSAtIChfX3oxX3IgKiBfX3JhdGlvKSAvIF9fZGVub207Ci0gIH0KLX0KLQotLy8gSS9PLgotI2lmICFkZWZpbmVkIChfU1RMUF9VU0VfTk9fSU9TVFJFQU1TKQotCi0vLyBDb21wbGV4IG91dHB1dCwgaW4gdGhlIGZvcm0gKHJlLGltKS4gIFdlIHVzZSBhIHR3by1zdGVwIHByb2Nlc3MKLS8vIGludm9sdmluZyBzdHJpbmdzdHJlYW0gc28gdGhhdCB3ZSBnZXQgdGhlIHBhZGRpbmcgcmlnaHQuCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Ci1iYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9TVExQX0NBTEwKLW9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLCBjb25zdCBjb21wbGV4PF9UcD4mIF9feikgewotICBiYXNpY19vc3RyaW5nc3RyZWFtPF9DaGFyVCwgX1RyYWl0cywgYWxsb2NhdG9yPF9DaGFyVD4gPiBfX3RtcDsKLSAgX190bXAuZmxhZ3MoX19vcy5mbGFncygpKTsKLSAgX190bXAuaW1idWUoX19vcy5nZXRsb2MoKSk7Ci0gIF9fdG1wLnByZWNpc2lvbihfX29zLnByZWNpc2lvbigpKTsKLSAgX190bXAgPDwgJygnIDw8IF9fei5yZWFsKCkgPDwgJywnIDw8IF9fei5pbWFnKCkgPDwgJyknOwotICByZXR1cm4gX19vcyA8PCBfX3RtcC5zdHIoKTsKLX0KLQotLy8gQ29tcGxleCBpbnB1dCBmcm9tIGFyYml0cmFyeSBzdHJlYW1zLiAgTm90ZSB0aGF0IHJlc3VsdHMgaW4gc29tZQotLy8gbG9jYWxlcyBtYXkgYmUgY29uZnVzaW5nLCBzaW5jZSB0aGUgZGVjaW1hbCBjaGFyYWN0ZXIgdmFyaWVzIHdpdGgKLS8vIGxvY2FsZSBhbmQgdGhlIHNlcGFyYXRvciBiZXR3ZWVuIHJlYWwgYW5kIGltYWdpbmFyeSBwYXJ0cyBkb2VzIG5vdC4KLQotdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfU1RMUF9DQUxMCi1vcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywgY29tcGxleDxfVHA+JiBfX3opIHsKLSAgX1RwICBfX3JlID0gMDsKLSAgX1RwICBfX2ltID0gMDsKLQotICAvLyB0eXBlZGVmIGN0eXBlPF9DaGFyVD4gX0N0eXBlOwotICAvLyAgbG9jYWxlIF9fbG9jID0gX19pcy5nZXRsb2MoKTsKLSAgLy9jb25zdCBfQ3R5cGUmICBfX2NfdHlwZSAgPSB1c2VfZmFjZXQ8X0N0eXBlPihfX2xvYyk7Ci0gIGNvbnN0IGN0eXBlPF9DaGFyVD4mIF9fY190eXBlID0gKl9fU1RBVElDX0NBU1QoY29uc3QgY3R5cGU8X0NoYXJUPiosIF9faXMuX01fY3R5cGVfZmFjZXQoKSk7Ci0KLSAgY29uc3QgY2hhciBfX3B1bmN0WzRdID0gIigsKSI7Ci0gIF9DaGFyVCBfX3dwdW5jdFszXTsKLSAgX19jX3R5cGUud2lkZW4oX19wdW5jdCwgX19wdW5jdCArIDMsIF9fd3B1bmN0KTsKLQotICBfQ2hhclQgX19jOwotCi0gIF9faXMgPj4gX19jOwotICBpZiAoX1RyYWl0czo6ZXEoX19jLCBfX3dwdW5jdFswXSkpIHsgIC8vIExlZnQgcGFyZW4KLSAgICBfX2lzID4+IF9fcmUgPj4gX19jOwotICAgIGlmIChfVHJhaXRzOjplcShfX2MsIF9fd3B1bmN0WzFdKSkgIC8vIENvbW1hCi0gICAgICBfX2lzID4+IF9faW0gPj4gX19jOwotICAgIGlmICghX1RyYWl0czo6ZXEoX19jLCBfX3dwdW5jdFsyXSkpIC8vIFJpZ2h0IHBhcmVuCi0gICAgICBfX2lzLnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKLSAgfQotICBlbHNlIHsKLSAgICBfX2lzLnB1dGJhY2soX19jKTsKLSAgICBfX2lzID4+IF9fcmU7Ci0gIH0KLQotICBpZiAoX19pcykKLSAgICBfX3ogPSBjb21wbGV4PF9UcD4oX19yZSwgX19pbSk7Ci0gIHJldHVybiBfX2lzOwotfQotCi0jZW5kaWYgLyogX1NUTFBfVVNFX05PX0lPU1RSRUFNUyAqLwotCi1fU1RMUF9FTkRfTkFNRVNQQUNFCi0KLSNlbmRpZiAvKiBfU1RMUF9DT01QTEVYX0MgKi8KLQotLy8gTG9jYWwgVmFyaWFibGVzOgotLy8gbW9kZTpDKysKLS8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9fY29tcGxleC5oIGIvc3RsL19jb21wbGV4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMjA4MDUuLjAwMDAwMDAKLS0tIGEvc3RsL19jb21wbGV4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ09NUExFWAotI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9DT01QTEVYCi0KLS8vIFRoaXMgaGVhZGVyIGRlY2xhcmVzIHRoZSB0ZW1wbGF0ZSBjbGFzcyBjb21wbGV4LCBhcyBkZXNjcmliZWQgaW4KLS8vIGluIHRoZSBkcmFmdCBDKysgc3RhbmRhcmQuICBTaW5nbGUtcHJlY2lzaW9uIGNvbXBsZXggbnVtYmVycwotLy8gYXJlIGNvbXBsZXg8ZmxvYXQ+LCBkb3VibGUtcHJlY2lzaW9uIGFyZSBjb21wbGV4PGRvdWJsZT4sIGFuZAotLy8gcXVhZCBwcmVjaXNpb24gYXJlIGNvbXBsZXg8bG9uZyBkb3VibGU+LgotCi0vLyBOb3RlIHRoYXQgdGhlIHRlbXBsYXRlIGNsYXNzIGNvbXBsZXggaXMgZGVjbGFyZWQgd2l0aGluIG5hbWVzcGFjZQotLy8gc3RkLCBhcyBjYWxsZWQgZm9yIGJ5IHRoZSBkcmFmdCBDKysgc3RhbmRhcmQuCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ01BVEgKLSMgIGluY2x1ZGUgPHN0bC9fY21hdGguaD4KLSNlbmRpZgotCi1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLQotI2lmICFkZWZpbmVkIChfU1RMUF9OT19DT01QTEVYX1NQRUNJQUxJWkFUSU9OUykgICAgLy8qVFkgMDIvMjUvMjAwMCAtIGFkZGVkIGZvciBNUFcgY29tcGlsZXIgd29ya2Fyb3VuZAotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgY29tcGxleDsKLQotX1NUTFBfVEVNUExBVEVfTlVMTCBzdHJ1Y3QgY29tcGxleDxmbG9hdD47Ci1fU1RMUF9URU1QTEFURV9OVUxMIHN0cnVjdCBjb21wbGV4PGRvdWJsZT47Ci0jICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTE9OR19ET1VCTEUpCi1fU1RMUF9URU1QTEFURV9OVUxMIHN0cnVjdCBjb21wbGV4PGxvbmcgZG91YmxlPjsKLSMgIGVuZGlmCi0jZW5kaWYgLyogX1NUTFBfTk9fQ09NUExFWF9TUEVDSUFMSVpBVElPTlMgKi8KLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLXN0cnVjdCBjb21wbGV4IHsKLSAgdHlwZWRlZiBfVHAgdmFsdWVfdHlwZTsKLSAgdHlwZWRlZiBjb21wbGV4PF9UcD4gX1NlbGY7Ci0KLSAgLy8gQ29uc3RydWN0b3JzLCBkZXN0cnVjdG9yLCBhc3NpZ25tZW50IG9wZXJhdG9yLgotICBjb21wbGV4KCkgOiBfTV9yZSgwKSwgX01faW0oMCkge30KLSAgY29tcGxleChjb25zdCB2YWx1ZV90eXBlJiBfX3gpCi0gICAgOiBfTV9yZShfX3gpLCBfTV9pbSgwKSB7fQotICBjb21wbGV4KGNvbnN0IHZhbHVlX3R5cGUmIF9feCwgY29uc3QgdmFsdWVfdHlwZSYgX195KQotICAgIDogX01fcmUoX194KSwgX01faW0oX195KSB7fQotICBjb21wbGV4KGNvbnN0IF9TZWxmJiBfX3opCi0gICAgOiBfTV9yZShfX3ouX01fcmUpLCBfTV9pbShfX3ouX01faW0pIHt9Ci0KLSAgX1NlbGYmIG9wZXJhdG9yPShjb25zdCBfU2VsZiYgX196KSB7Ci0gICAgX01fcmUgPSBfX3ouX01fcmU7Ci0gICAgX01faW0gPSBfX3ouX01faW07Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKSAmJiAoZGVmaW5lZCAoX1NUTFBfRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSKSB8fCBkZWZpbmVkKF9TVExQX05PX0NPTVBMRVhfU1BFQ0lBTElaQVRJT05TKSkKLSAgdGVtcGxhdGUgPGNsYXNzIF9UcDI+Ci0gIGV4cGxpY2l0IGNvbXBsZXgoY29uc3QgY29tcGxleDxfVHAyPiYgX196KQotICAgIDogX01fcmUoX196Ll9NX3JlKSwgX01faW0oX196Ll9NX2ltKSB7fQotCi0gIHRlbXBsYXRlIDxjbGFzcyBfVHAyPgotICBfU2VsZiYgb3BlcmF0b3I9KGNvbnN0IGNvbXBsZXg8X1RwMj4mIF9feikgewotICAgIF9NX3JlID0gX196Ll9NX3JlOwotICAgIF9NX2ltID0gX196Ll9NX2ltOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotI2VuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KLQotICAvLyBFbGVtZW50IGFjY2Vzcy4KLSAgdmFsdWVfdHlwZSByZWFsKCkgY29uc3QgeyByZXR1cm4gX01fcmU7IH0KLSAgdmFsdWVfdHlwZSBpbWFnKCkgY29uc3QgeyByZXR1cm4gX01faW07IH0KLQotICAvLyBBcml0aG1ldGljIG9wPSBvcGVyYXRpb25zIGludm9sdmluZyBvbmUgcmVhbCBhcmd1bWVudC4KLQotICBfU2VsZiYgb3BlcmF0b3I9IChjb25zdCB2YWx1ZV90eXBlJiBfX3gpIHsKLSAgICBfTV9yZSA9IF9feDsKLSAgICBfTV9pbSA9IDA7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIF9TZWxmJiBvcGVyYXRvcis9IChjb25zdCB2YWx1ZV90eXBlJiBfX3gpIHsKLSAgICBfTV9yZSArPSBfX3g7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIF9TZWxmJiBvcGVyYXRvci09IChjb25zdCB2YWx1ZV90eXBlJiBfX3gpIHsKLSAgICBfTV9yZSAtPSBfX3g7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIF9TZWxmJiBvcGVyYXRvcio9IChjb25zdCB2YWx1ZV90eXBlJiBfX3gpIHsKLSAgICBfTV9yZSAqPSBfX3g7Ci0gICAgX01faW0gKj0gX194OwotICAgIHJldHVybiAqdGhpczsKLSAgfQotICBfU2VsZiYgb3BlcmF0b3IvPSAoY29uc3QgdmFsdWVfdHlwZSYgX194KSB7Ci0gICAgX01fcmUgLz0gX194OwotICAgIF9NX2ltIC89IF9feDsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICAvLyBBcml0aG1ldGljIG9wPSBvcGVyYXRpb25zIGludm9sdmluZyB0d28gY29tcGxleCBhcmd1bWVudHMuCi0KLSAgc3RhdGljIHZvaWQgIF9TVExQX0NBTEwgX2Rpdihjb25zdCB2YWx1ZV90eXBlJiBfX3oxX3IsIGNvbnN0IHZhbHVlX3R5cGUmIF9fejFfaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZV90eXBlJiBfX3oyX3IsIGNvbnN0IHZhbHVlX3R5cGUmIF9fejJfaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlJiBfX3Jlc19yLCB2YWx1ZV90eXBlJiBfX3Jlc19pKTsKLQotICBzdGF0aWMgdm9pZCBfU1RMUF9DQUxMIF9kaXYoY29uc3QgdmFsdWVfdHlwZSYgX196MV9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWVfdHlwZSYgX196Ml9yLCBjb25zdCB2YWx1ZV90eXBlJiBfX3oyX2ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlJiBfX3Jlc19yLCB2YWx1ZV90eXBlJiBfX3Jlc19pKTsKLQotI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpIC8vICYmIGRlZmluZWQgKF9TVExQX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUikKLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwMj4gX1NlbGYmIG9wZXJhdG9yKz0gKGNvbnN0IGNvbXBsZXg8X1RwMj4mIF9feikgewotICAgIF9NX3JlICs9IF9fei5fTV9yZTsKLSAgICBfTV9pbSArPSBfX3ouX01faW07Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIF9UcDI+IF9TZWxmJiBvcGVyYXRvci09IChjb25zdCBjb21wbGV4PF9UcDI+JiBfX3opIHsKLSAgICBfTV9yZSAtPSBfX3ouX01fcmU7Ci0gICAgX01faW0gLT0gX196Ll9NX2ltOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBfVHAyPiBfU2VsZiYgb3BlcmF0b3IqPSAoY29uc3QgY29tcGxleDxfVHAyPiYgX196KSB7Ci0gICAgdmFsdWVfdHlwZSBfX3IgPSBfTV9yZSAqIF9fei5fTV9yZSAtIF9NX2ltICogX196Ll9NX2ltOwotICAgIHZhbHVlX3R5cGUgX19pID0gX01fcmUgKiBfX3ouX01faW0gKyBfTV9pbSAqIF9fei5fTV9yZTsKLSAgICBfTV9yZSA9IF9fcjsKLSAgICBfTV9pbSA9IF9faTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwMj4gX1NlbGYmIG9wZXJhdG9yLz0gKGNvbnN0IGNvbXBsZXg8X1RwMj4mIF9feikgewotICAgIHZhbHVlX3R5cGUgX19yOwotICAgIHZhbHVlX3R5cGUgX19pOwotICAgIF9kaXYoX01fcmUsIF9NX2ltLCBfX3ouX01fcmUsIF9fei5fTV9pbSwgX19yLCBfX2kpOwotICAgIF9NX3JlID0gX19yOwotICAgIF9NX2ltID0gX19pOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotI2VuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KLQotICBfU2VsZiYgb3BlcmF0b3IrPSAoY29uc3QgX1NlbGYmIF9feikgewotICAgIF9NX3JlICs9IF9fei5fTV9yZTsKLSAgICBfTV9pbSArPSBfX3ouX01faW07Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgX1NlbGYmIG9wZXJhdG9yLT0gKGNvbnN0IF9TZWxmJiBfX3opIHsKLSAgICBfTV9yZSAtPSBfX3ouX01fcmU7Ci0gICAgX01faW0gLT0gX196Ll9NX2ltOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIF9TZWxmJiBvcGVyYXRvcio9IChjb25zdCBfU2VsZiYgX196KSB7Ci0gICAgdmFsdWVfdHlwZSBfX3IgPSBfTV9yZSAqIF9fei5fTV9yZSAtIF9NX2ltICogX196Ll9NX2ltOwotICAgIHZhbHVlX3R5cGUgX19pID0gX01fcmUgKiBfX3ouX01faW0gKyBfTV9pbSAqIF9fei5fTV9yZTsKLSAgICBfTV9yZSA9IF9fcjsKLSAgICBfTV9pbSA9IF9faTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBfU2VsZiYgb3BlcmF0b3IvPSAoY29uc3QgX1NlbGYmIF9feikgewotICAgIHZhbHVlX3R5cGUgX19yOwotICAgIHZhbHVlX3R5cGUgX19pOwotICAgIF9kaXYoX01fcmUsIF9NX2ltLCBfX3ouX01fcmUsIF9fei5fTV9pbSwgX19yLCBfX2kpOwotICAgIF9NX3JlID0gX19yOwotICAgIF9NX2ltID0gX19pOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIC8vIERhdGEgbWVtYmVycy4KLSAgdmFsdWVfdHlwZSBfTV9yZTsKLSAgdmFsdWVfdHlwZSBfTV9pbTsKLX07Ci0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fQ09NUExFWF9TUEVDSUFMSVpBVElPTlMpICAgIC8vKlRZIDAyLzI1LzIwMDAgLSBhZGRlZCBmb3IgTVBXIGNvbXBpbGVyIHdvcmthcm91bmQKLS8vIEV4cGxpY2l0IHNwZWNpYWxpemF0aW9ucyBmb3IgZmxvYXQsIGRvdWJsZSwgbG9uZyBkb3VibGUuICBUaGUgb25seQotLy8gcmVhc29uIGZvciB0aGVzZSBzcGVjaWFsaXphdGlvbnMgaXMgdG8gZW5hYmxlIGF1dG9tYXRpYyBjb252ZXJzaW9ucwotLy8gZnJvbSBjb21wbGV4PGZsb2F0PiB0byBjb21wbGV4PGRvdWJsZT4sIGFuZCBjb21wbGV4PGRvdWJsZT4gdG8KLS8vIGNvbXBsZXg8bG9uZyBkb3VibGU+LgotCi1fU1RMUF9URU1QTEFURV9OVUxMCi1zdHJ1Y3QgX1NUTFBfQ0xBU1NfREVDTFNQRUMgY29tcGxleDxmbG9hdD4gewotICB0eXBlZGVmIGZsb2F0IHZhbHVlX3R5cGU7Ci0gIHR5cGVkZWYgY29tcGxleDxmbG9hdD4gX1NlbGY7Ci0gIC8vIENvbnN0cnVjdG9ycywgZGVzdHJ1Y3RvciwgYXNzaWdubWVudCBvcGVyYXRvci4KLQotICBjb21wbGV4KHZhbHVlX3R5cGUgX194ID0gMC4wZiwgdmFsdWVfdHlwZSBfX3kgPSAwLjBmKQotICAgIDogX01fcmUoX194KSwgX01faW0oX195KSB7fQotCi0gIGNvbXBsZXgoY29uc3QgY29tcGxleDxmbG9hdD4mIF9feikgICAgOiBfTV9yZShfX3ouX01fcmUpLCBfTV9pbShfX3ouX01faW0pIHt9Ci0KLSAgaW5saW5lIGV4cGxpY2l0IGNvbXBsZXgoY29uc3QgY29tcGxleDxkb3VibGU+JiBfX3opOwotIyAgaWZuZGVmIF9TVExQX05PX0xPTkdfRE9VQkxFCi0gIGlubGluZSBleHBsaWNpdCBjb21wbGV4KGNvbnN0IGNvbXBsZXg8bG9uZyBkb3VibGU+JiBfX3opOwotIyAgZW5kaWYKLSAgLy8gRWxlbWVudCBhY2Nlc3MuCi0gIHZhbHVlX3R5cGUgcmVhbCgpIGNvbnN0IHsgcmV0dXJuIF9NX3JlOyB9Ci0gIHZhbHVlX3R5cGUgaW1hZygpIGNvbnN0IHsgcmV0dXJuIF9NX2ltOyB9Ci0KLSAgLy8gQXJpdGhtZXRpYyBvcD0gb3BlcmF0aW9ucyBpbnZvbHZpbmcgb25lIHJlYWwgYXJndW1lbnQuCi0KLSAgX1NlbGYmIG9wZXJhdG9yPSAodmFsdWVfdHlwZSBfX3gpIHsKLSAgICBfTV9yZSA9IF9feDsKLSAgICBfTV9pbSA9IDAuMGY7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIF9TZWxmJiBvcGVyYXRvcis9ICh2YWx1ZV90eXBlIF9feCkgewotICAgIF9NX3JlICs9IF9feDsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgX1NlbGYmIG9wZXJhdG9yLT0gKHZhbHVlX3R5cGUgX194KSB7Ci0gICAgX01fcmUgLT0gX194OwotICAgIHJldHVybiAqdGhpczsKLSAgfQotICBfU2VsZiYgb3BlcmF0b3IqPSAodmFsdWVfdHlwZSBfX3gpIHsKLSAgICBfTV9yZSAqPSBfX3g7Ci0gICAgX01faW0gKj0gX194OwotICAgIHJldHVybiAqdGhpczsKLSAgfQotICBfU2VsZiYgb3BlcmF0b3IvPSAodmFsdWVfdHlwZSBfX3gpIHsKLSAgICBfTV9yZSAvPSBfX3g7Ci0gICAgX01faW0gLz0gX194OwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIC8vIEFyaXRobWV0aWMgb3A9IG9wZXJhdGlvbnMgaW52b2x2aW5nIHR3byBjb21wbGV4IGFyZ3VtZW50cy4KLQotICBzdGF0aWMgdm9pZCBfU1RMUF9DQUxMIF9kaXYoY29uc3QgZmxvYXQmIF9fejFfciwgY29uc3QgZmxvYXQmIF9fejFfaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0JiBfX3oyX3IsIGNvbnN0IGZsb2F0JiBfX3oyX2ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCYgX19yZXNfciwgZmxvYXQmIF9fcmVzX2kpOwotCi0gIHN0YXRpYyB2b2lkIF9TVExQX0NBTEwgX2Rpdihjb25zdCBmbG9hdCYgX196MV9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQmIF9fejJfciwgY29uc3QgZmxvYXQmIF9fejJfaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0JiBfX3Jlc19yLCBmbG9hdCYgX19yZXNfaSk7Ci0KLSMgIGlmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCi0gIHRlbXBsYXRlIDxjbGFzcyBfVHAyPgotICBjb21wbGV4PGZsb2F0PiYgb3BlcmF0b3I9KGNvbnN0IGNvbXBsZXg8X1RwMj4mIF9feikgewotICAgIF9NX3JlID0gX196Ll9NX3JlOwotICAgIF9NX2ltID0gX196Ll9NX2ltOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBfVHAyPgotICBjb21wbGV4PGZsb2F0PiYgb3BlcmF0b3IrPSAoY29uc3QgY29tcGxleDxfVHAyPiYgX196KSB7Ci0gICAgX01fcmUgKz0gX196Ll9NX3JlOwotICAgIF9NX2ltICs9IF9fei5fTV9pbTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwMj4KLSAgY29tcGxleDxmbG9hdD4mIG9wZXJhdG9yLT0gKGNvbnN0IGNvbXBsZXg8X1RwMj4mIF9feikgewotICAgIF9NX3JlIC09IF9fei5fTV9yZTsKLSAgICBfTV9pbSAtPSBfX3ouX01faW07Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIF9UcDI+Ci0gIGNvbXBsZXg8ZmxvYXQ+JiBvcGVyYXRvcio9IChjb25zdCBjb21wbGV4PF9UcDI+JiBfX3opIHsKLSAgICBmbG9hdCBfX3IgPSBfTV9yZSAqIF9fei5fTV9yZSAtIF9NX2ltICogX196Ll9NX2ltOwotICAgIGZsb2F0IF9faSA9IF9NX3JlICogX196Ll9NX2ltICsgX01faW0gKiBfX3ouX01fcmU7Ci0gICAgX01fcmUgPSBfX3I7Ci0gICAgX01faW0gPSBfX2k7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIF9UcDI+Ci0gIGNvbXBsZXg8ZmxvYXQ+JiBvcGVyYXRvci89IChjb25zdCBjb21wbGV4PF9UcDI+JiBfX3opIHsKLSAgICBmbG9hdCBfX3I7Ci0gICAgZmxvYXQgX19pOwotICAgIF9kaXYoX01fcmUsIF9NX2ltLCBfX3ouX01fcmUsIF9fei5fTV9pbSwgX19yLCBfX2kpOwotICAgIF9NX3JlID0gX19yOwotICAgIF9NX2ltID0gX19pOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0jICBlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCi0KLSAgX1NlbGYmIG9wZXJhdG9yPShjb25zdCBfU2VsZiYgX196KSB7Ci0gICAgX01fcmUgPSBfX3ouX01fcmU7Ci0gICAgX01faW0gPSBfX3ouX01faW07Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgX1NlbGYmIG9wZXJhdG9yKz0gKGNvbnN0IF9TZWxmJiBfX3opIHsKLSAgICBfTV9yZSArPSBfX3ouX01fcmU7Ci0gICAgX01faW0gKz0gX196Ll9NX2ltOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIF9TZWxmJiBvcGVyYXRvci09IChjb25zdCBfU2VsZiYgX196KSB7Ci0gICAgX01fcmUgLT0gX196Ll9NX3JlOwotICAgIF9NX2ltIC09IF9fei5fTV9pbTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBfU2VsZiYgb3BlcmF0b3IqPSAoY29uc3QgX1NlbGYmIF9feikgewotICAgIHZhbHVlX3R5cGUgX19yID0gX01fcmUgKiBfX3ouX01fcmUgLSBfTV9pbSAqIF9fei5fTV9pbTsKLSAgICB2YWx1ZV90eXBlIF9faSA9IF9NX3JlICogX196Ll9NX2ltICsgX01faW0gKiBfX3ouX01fcmU7Ci0gICAgX01fcmUgPSBfX3I7Ci0gICAgX01faW0gPSBfX2k7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgX1NlbGYmIG9wZXJhdG9yLz0gKGNvbnN0IF9TZWxmJiBfX3opIHsKLSAgICB2YWx1ZV90eXBlIF9fcjsKLSAgICB2YWx1ZV90eXBlIF9faTsKLSAgICBfZGl2KF9NX3JlLCBfTV9pbSwgX196Ll9NX3JlLCBfX3ouX01faW0sIF9fciwgX19pKTsKLSAgICBfTV9yZSA9IF9fcjsKLSAgICBfTV9pbSA9IF9faTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICAvLyBEYXRhIG1lbWJlcnMuCi0gIHZhbHVlX3R5cGUgX01fcmU7Ci0gIHZhbHVlX3R5cGUgX01faW07Ci19OwotCi1fU1RMUF9URU1QTEFURV9OVUxMCi1zdHJ1Y3QgX1NUTFBfQ0xBU1NfREVDTFNQRUMgY29tcGxleDxkb3VibGU+IHsKLSAgdHlwZWRlZiBkb3VibGUgdmFsdWVfdHlwZTsKLSAgdHlwZWRlZiBjb21wbGV4PGRvdWJsZT4gX1NlbGY7Ci0KLSAgLy8gQ29uc3RydWN0b3JzLCBkZXN0cnVjdG9yLCBhc3NpZ25tZW50IG9wZXJhdG9yLgotCi0gIGNvbXBsZXgodmFsdWVfdHlwZSBfX3ggPSAwLjAsIHZhbHVlX3R5cGUgX195ID0gMC4wKQotICAgIDogX01fcmUoX194KSwgX01faW0oX195KSB7fQotCi0gIGNvbXBsZXgoY29uc3QgY29tcGxleDxkb3VibGU+JiBfX3opCi0gICAgOiBfTV9yZShfX3ouX01fcmUpLCBfTV9pbShfX3ouX01faW0pIHt9Ci0gIGlubGluZSBjb21wbGV4KGNvbnN0IGNvbXBsZXg8ZmxvYXQ+JiBfX3opOwotIyAgaWYgIWRlZmluZWQgKF9TVExQX05PX0xPTkdfRE9VQkxFKQotICBleHBsaWNpdCBpbmxpbmUgY29tcGxleChjb25zdCBjb21wbGV4PGxvbmcgZG91YmxlPiYgX196KTsKLSMgIGVuZGlmCi0gIC8vIEVsZW1lbnQgYWNjZXNzLgotICB2YWx1ZV90eXBlIHJlYWwoKSBjb25zdCB7IHJldHVybiBfTV9yZTsgfQotICB2YWx1ZV90eXBlIGltYWcoKSBjb25zdCB7IHJldHVybiBfTV9pbTsgfQotCi0gIC8vIEFyaXRobWV0aWMgb3A9IG9wZXJhdGlvbnMgaW52b2x2aW5nIG9uZSByZWFsIGFyZ3VtZW50LgotCi0gIF9TZWxmJiBvcGVyYXRvcj0gKHZhbHVlX3R5cGUgX194KSB7Ci0gICAgX01fcmUgPSBfX3g7Ci0gICAgX01faW0gPSAwLjA7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIF9TZWxmJiBvcGVyYXRvcis9ICh2YWx1ZV90eXBlIF9feCkgewotICAgIF9NX3JlICs9IF9feDsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgX1NlbGYmIG9wZXJhdG9yLT0gKHZhbHVlX3R5cGUgX194KSB7Ci0gICAgX01fcmUgLT0gX194OwotICAgIHJldHVybiAqdGhpczsKLSAgfQotICBfU2VsZiYgb3BlcmF0b3IqPSAodmFsdWVfdHlwZSBfX3gpIHsKLSAgICBfTV9yZSAqPSBfX3g7Ci0gICAgX01faW0gKj0gX194OwotICAgIHJldHVybiAqdGhpczsKLSAgfQotICBfU2VsZiYgb3BlcmF0b3IvPSAodmFsdWVfdHlwZSBfX3gpIHsKLSAgICBfTV9yZSAvPSBfX3g7Ci0gICAgX01faW0gLz0gX194OwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIC8vIEFyaXRobWV0aWMgb3A9IG9wZXJhdGlvbnMgaW52b2x2aW5nIHR3byBjb21wbGV4IGFyZ3VtZW50cy4KLQotICBzdGF0aWMgdm9pZCBfU1RMUF9DQUxMIF9kaXYoY29uc3QgZG91YmxlJiBfX3oxX3IsIGNvbnN0IGRvdWJsZSYgX196MV9pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlJiBfX3oyX3IsIGNvbnN0IGRvdWJsZSYgX196Ml9pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlJiBfX3Jlc19yLCBkb3VibGUmIF9fcmVzX2kpOwotICBzdGF0aWMgdm9pZCBfU1RMUF9DQUxMIF9kaXYoY29uc3QgZG91YmxlJiBfX3oxX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUmIF9fejJfciwgY29uc3QgZG91YmxlJiBfX3oyX2ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUmIF9fcmVzX3IsIGRvdWJsZSYgX19yZXNfaSk7Ci0KLSMgIGlmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpICYmIGRlZmluZWQgKF9TVExQX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUikKLSAgdGVtcGxhdGUgPGNsYXNzIF9UcDI+Ci0gIGNvbXBsZXg8ZG91YmxlPiYgb3BlcmF0b3I9KGNvbnN0IGNvbXBsZXg8X1RwMj4mIF9feikgewotICAgIF9NX3JlID0gX196Ll9NX3JlOwotICAgIF9NX2ltID0gX196Ll9NX2ltOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBfVHAyPgotICBjb21wbGV4PGRvdWJsZT4mIG9wZXJhdG9yKz0gKGNvbnN0IGNvbXBsZXg8X1RwMj4mIF9feikgewotICAgIF9NX3JlICs9IF9fei5fTV9yZTsKLSAgICBfTV9pbSArPSBfX3ouX01faW07Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIF9UcDI+Ci0gIGNvbXBsZXg8ZG91YmxlPiYgb3BlcmF0b3ItPSAoY29uc3QgY29tcGxleDxfVHAyPiYgX196KSB7Ci0gICAgX01fcmUgLT0gX196Ll9NX3JlOwotICAgIF9NX2ltIC09IF9fei5fTV9pbTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwMj4KLSAgY29tcGxleDxkb3VibGU+JiBvcGVyYXRvcio9IChjb25zdCBjb21wbGV4PF9UcDI+JiBfX3opIHsKLSAgICBkb3VibGUgX19yID0gX01fcmUgKiBfX3ouX01fcmUgLSBfTV9pbSAqIF9fei5fTV9pbTsKLSAgICBkb3VibGUgX19pID0gX01fcmUgKiBfX3ouX01faW0gKyBfTV9pbSAqIF9fei5fTV9yZTsKLSAgICBfTV9yZSA9IF9fcjsKLSAgICBfTV9pbSA9IF9faTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwMj4KLSAgY29tcGxleDxkb3VibGU+JiBvcGVyYXRvci89IChjb25zdCBjb21wbGV4PF9UcDI+JiBfX3opIHsKLSAgICBkb3VibGUgX19yOwotICAgIGRvdWJsZSBfX2k7Ci0gICAgX2RpdihfTV9yZSwgX01faW0sIF9fei5fTV9yZSwgX196Ll9NX2ltLCBfX3IsIF9faSk7Ci0gICAgX01fcmUgPSBfX3I7Ci0gICAgX01faW0gPSBfX2k7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSMgIGVuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KLQotICBfU2VsZiYgb3BlcmF0b3I9KGNvbnN0IF9TZWxmJiBfX3opIHsKLSAgICBfTV9yZSA9IF9fei5fTV9yZTsKLSAgICBfTV9pbSA9IF9fei5fTV9pbTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBfU2VsZiYgb3BlcmF0b3IrPSAoY29uc3QgX1NlbGYmIF9feikgewotICAgIF9NX3JlICs9IF9fei5fTV9yZTsKLSAgICBfTV9pbSArPSBfX3ouX01faW07Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgX1NlbGYmIG9wZXJhdG9yLT0gKGNvbnN0IF9TZWxmJiBfX3opIHsKLSAgICBfTV9yZSAtPSBfX3ouX01fcmU7Ci0gICAgX01faW0gLT0gX196Ll9NX2ltOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIF9TZWxmJiBvcGVyYXRvcio9IChjb25zdCBfU2VsZiYgX196KSB7Ci0gICAgdmFsdWVfdHlwZSBfX3IgPSBfTV9yZSAqIF9fei5fTV9yZSAtIF9NX2ltICogX196Ll9NX2ltOwotICAgIHZhbHVlX3R5cGUgX19pID0gX01fcmUgKiBfX3ouX01faW0gKyBfTV9pbSAqIF9fei5fTV9yZTsKLSAgICBfTV9yZSA9IF9fcjsKLSAgICBfTV9pbSA9IF9faTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBfU2VsZiYgb3BlcmF0b3IvPSAoY29uc3QgX1NlbGYmIF9feikgewotICAgIHZhbHVlX3R5cGUgX19yOwotICAgIHZhbHVlX3R5cGUgX19pOwotICAgIF9kaXYoX01fcmUsIF9NX2ltLCBfX3ouX01fcmUsIF9fei5fTV9pbSwgX19yLCBfX2kpOwotICAgIF9NX3JlID0gX19yOwotICAgIF9NX2ltID0gX19pOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIC8vIERhdGEgbWVtYmVycy4KLSAgdmFsdWVfdHlwZSBfTV9yZTsKLSAgdmFsdWVfdHlwZSBfTV9pbTsKLX07Ci0KLSMgIGlmICFkZWZpbmVkIChfU1RMUF9OT19MT05HX0RPVUJMRSkKLQotX1NUTFBfVEVNUExBVEVfTlVMTAotc3RydWN0IF9TVExQX0NMQVNTX0RFQ0xTUEVDIGNvbXBsZXg8bG9uZyBkb3VibGU+IHsKLSAgdHlwZWRlZiBsb25nIGRvdWJsZSB2YWx1ZV90eXBlOwotICB0eXBlZGVmIGNvbXBsZXg8bG9uZyBkb3VibGU+IF9TZWxmOwotCi0gIC8vIENvbnN0cnVjdG9ycywgZGVzdHJ1Y3RvciwgYXNzaWdubWVudCBvcGVyYXRvci4KLSAgY29tcGxleCh2YWx1ZV90eXBlIF9feCA9IDAuMGwsIHZhbHVlX3R5cGUgX195ID0gMC4wbCkKLSAgICA6IF9NX3JlKF9feCksIF9NX2ltKF9feSkge30KLQotICBjb21wbGV4KGNvbnN0IGNvbXBsZXg8bG9uZyBkb3VibGU+JiBfX3opCi0gICAgOiBfTV9yZShfX3ouX01fcmUpLCBfTV9pbShfX3ouX01faW0pIHt9Ci0gIGlubGluZSBjb21wbGV4KGNvbnN0IGNvbXBsZXg8ZmxvYXQ+JiBfX3opOwotICBpbmxpbmUgY29tcGxleChjb25zdCBjb21wbGV4PGRvdWJsZT4mIF9feik7Ci0KLSAgLy8gRWxlbWVudCBhY2Nlc3MuCi0gIHZhbHVlX3R5cGUgcmVhbCgpIGNvbnN0IHsgcmV0dXJuIF9NX3JlOyB9Ci0gIHZhbHVlX3R5cGUgaW1hZygpIGNvbnN0IHsgcmV0dXJuIF9NX2ltOyB9Ci0KLSAgLy8gQXJpdGhtZXRpYyBvcD0gb3BlcmF0aW9ucyBpbnZvbHZpbmcgb25lIHJlYWwgYXJndW1lbnQuCi0KLSAgX1NlbGYmIG9wZXJhdG9yPSAodmFsdWVfdHlwZSBfX3gpIHsKLSAgICBfTV9yZSA9IF9feDsKLSAgICBfTV9pbSA9IDAuMGw7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIF9TZWxmJiBvcGVyYXRvcis9ICh2YWx1ZV90eXBlIF9feCkgewotICAgIF9NX3JlICs9IF9feDsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgX1NlbGYmIG9wZXJhdG9yLT0gKHZhbHVlX3R5cGUgX194KSB7Ci0gICAgX01fcmUgLT0gX194OwotICAgIHJldHVybiAqdGhpczsKLSAgfQotICBfU2VsZiYgb3BlcmF0b3IqPSAodmFsdWVfdHlwZSBfX3gpIHsKLSAgICBfTV9yZSAqPSBfX3g7Ci0gICAgX01faW0gKj0gX194OwotICAgIHJldHVybiAqdGhpczsKLSAgfQotICBfU2VsZiYgb3BlcmF0b3IvPSAodmFsdWVfdHlwZSBfX3gpIHsKLSAgICBfTV9yZSAvPSBfX3g7Ci0gICAgX01faW0gLz0gX194OwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIC8vIEFyaXRobWV0aWMgb3A9IG9wZXJhdGlvbnMgaW52b2x2aW5nIHR3byBjb21wbGV4IGFyZ3VtZW50cy4KLQotICBzdGF0aWMgdm9pZCBfU1RMUF9DQUxMIF9kaXYoY29uc3QgbG9uZyBkb3VibGUmIF9fejFfciwgY29uc3QgbG9uZyBkb3VibGUmIF9fejFfaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvbmcgZG91YmxlJiBfX3oyX3IsIGNvbnN0IGxvbmcgZG91YmxlJiBfX3oyX2ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGRvdWJsZSYgX19yZXNfciwgbG9uZyBkb3VibGUmIF9fcmVzX2kpOwotCi0gIHN0YXRpYyB2b2lkIF9TVExQX0NBTEwgX2Rpdihjb25zdCBsb25nIGRvdWJsZSYgX196MV9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9uZyBkb3VibGUmIF9fejJfciwgY29uc3QgbG9uZyBkb3VibGUmIF9fejJfaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgZG91YmxlJiBfX3Jlc19yLCBsb25nIGRvdWJsZSYgX19yZXNfaSk7Ci0KLSMgICAgaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykgJiYgZGVmaW5lZCAoX1NUTFBfRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSKQotCi0gIHRlbXBsYXRlIDxjbGFzcyBfVHAyPgotICBjb21wbGV4PGxvbmcgZG91YmxlPiYgb3BlcmF0b3I9KGNvbnN0IGNvbXBsZXg8X1RwMj4mIF9feikgewotICAgIF9NX3JlID0gX196Ll9NX3JlOwotICAgIF9NX2ltID0gX196Ll9NX2ltOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBfVHAyPgotICBjb21wbGV4PGxvbmcgZG91YmxlPiYgb3BlcmF0b3IrPSAoY29uc3QgY29tcGxleDxfVHAyPiYgX196KSB7Ci0gICAgX01fcmUgKz0gX196Ll9NX3JlOwotICAgIF9NX2ltICs9IF9fei5fTV9pbTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwMj4KLSAgY29tcGxleDxsb25nIGRvdWJsZT4mIG9wZXJhdG9yLT0gKGNvbnN0IGNvbXBsZXg8X1RwMj4mIF9feikgewotICAgIF9NX3JlIC09IF9fei5fTV9yZTsKLSAgICBfTV9pbSAtPSBfX3ouX01faW07Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIF9UcDI+Ci0gIGNvbXBsZXg8bG9uZyBkb3VibGU+JiBvcGVyYXRvcio9IChjb25zdCBjb21wbGV4PF9UcDI+JiBfX3opIHsKLSAgICBsb25nIGRvdWJsZSBfX3IgPSBfTV9yZSAqIF9fei5fTV9yZSAtIF9NX2ltICogX196Ll9NX2ltOwotICAgIGxvbmcgZG91YmxlIF9faSA9IF9NX3JlICogX196Ll9NX2ltICsgX01faW0gKiBfX3ouX01fcmU7Ci0gICAgX01fcmUgPSBfX3I7Ci0gICAgX01faW0gPSBfX2k7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIF9UcDI+Ci0gIGNvbXBsZXg8bG9uZyBkb3VibGU+JiBvcGVyYXRvci89IChjb25zdCBjb21wbGV4PF9UcDI+JiBfX3opIHsKLSAgICBsb25nIGRvdWJsZSBfX3I7Ci0gICAgbG9uZyBkb3VibGUgX19pOwotICAgIF9kaXYoX01fcmUsIF9NX2ltLCBfX3ouX01fcmUsIF9fei5fTV9pbSwgX19yLCBfX2kpOwotICAgIF9NX3JlID0gX19yOwotICAgIF9NX2ltID0gX19pOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0jICAgIGVuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KLQotICBfU2VsZiYgb3BlcmF0b3I9KGNvbnN0IF9TZWxmJiBfX3opIHsKLSAgICBfTV9yZSA9IF9fei5fTV9yZTsKLSAgICBfTV9pbSA9IF9fei5fTV9pbTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBfU2VsZiYgb3BlcmF0b3IrPSAoY29uc3QgX1NlbGYmIF9feikgewotICAgIF9NX3JlICs9IF9fei5fTV9yZTsKLSAgICBfTV9pbSArPSBfX3ouX01faW07Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgX1NlbGYmIG9wZXJhdG9yLT0gKGNvbnN0IF9TZWxmJiBfX3opIHsKLSAgICBfTV9yZSAtPSBfX3ouX01fcmU7Ci0gICAgX01faW0gLT0gX196Ll9NX2ltOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIF9TZWxmJiBvcGVyYXRvcio9IChjb25zdCBfU2VsZiYgX196KSB7Ci0gICAgdmFsdWVfdHlwZSBfX3IgPSBfTV9yZSAqIF9fei5fTV9yZSAtIF9NX2ltICogX196Ll9NX2ltOwotICAgIHZhbHVlX3R5cGUgX19pID0gX01fcmUgKiBfX3ouX01faW0gKyBfTV9pbSAqIF9fei5fTV9yZTsKLSAgICBfTV9yZSA9IF9fcjsKLSAgICBfTV9pbSA9IF9faTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBfU2VsZiYgb3BlcmF0b3IvPSAoY29uc3QgX1NlbGYmIF9feikgewotICAgIHZhbHVlX3R5cGUgX19yOwotICAgIHZhbHVlX3R5cGUgX19pOwotICAgIF9kaXYoX01fcmUsIF9NX2ltLCBfX3ouX01fcmUsIF9fei5fTV9pbSwgX19yLCBfX2kpOwotICAgIF9NX3JlID0gX19yOwotICAgIF9NX2ltID0gX19pOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIC8vIERhdGEgbWVtYmVycy4KLSAgdmFsdWVfdHlwZSBfTV9yZTsKLSAgdmFsdWVfdHlwZSBfTV9pbTsKLX07Ci0KLSMgIGVuZGlmIC8qIF9TVExQX05PX0xPTkdfRE9VQkxFICovCi0KLS8vIENvbnZlcnRpbmcgY29uc3RydWN0b3JzIGZyb20gb25lIG9mIHRoZXNlIHRocmVlIHNwZWNpYWxpemVkIHR5cGVzCi0vLyB0byBhbm90aGVyLgotCi1pbmxpbmUgY29tcGxleDxmbG9hdD46OmNvbXBsZXgoY29uc3QgY29tcGxleDxkb3VibGU+JiBfX3opCi0gIDogX01fcmUoKGZsb2F0KV9fei5fTV9yZSksIF9NX2ltKChmbG9hdClfX3ouX01faW0pIHt9Ci1pbmxpbmUgY29tcGxleDxkb3VibGU+Ojpjb21wbGV4KGNvbnN0IGNvbXBsZXg8ZmxvYXQ+JiBfX3opCi0gIDogX01fcmUoX196Ll9NX3JlKSwgX01faW0oX196Ll9NX2ltKSB7fQotIyAgaWZuZGVmIF9TVExQX05PX0xPTkdfRE9VQkxFCi1pbmxpbmUgY29tcGxleDxmbG9hdD46OmNvbXBsZXgoY29uc3QgY29tcGxleDxsb25nIGRvdWJsZT4mIF9feikKLSAgOiBfTV9yZSgoZmxvYXQpX196Ll9NX3JlKSwgX01faW0oKGZsb2F0KV9fei5fTV9pbSkge30KLWlubGluZSBjb21wbGV4PGRvdWJsZT46OmNvbXBsZXgoY29uc3QgY29tcGxleDxsb25nIGRvdWJsZT4mIF9feikKLSAgOiBfTV9yZSgoZG91YmxlKV9fei5fTV9yZSksIF9NX2ltKChkb3VibGUpX196Ll9NX2ltKSB7fQotaW5saW5lIGNvbXBsZXg8bG9uZyBkb3VibGU+Ojpjb21wbGV4KGNvbnN0IGNvbXBsZXg8ZmxvYXQ+JiBfX3opCi0gIDogX01fcmUoX196Ll9NX3JlKSwgX01faW0oX196Ll9NX2ltKSB7fQotaW5saW5lIGNvbXBsZXg8bG9uZyBkb3VibGU+Ojpjb21wbGV4KGNvbnN0IGNvbXBsZXg8ZG91YmxlPiYgX196KQotICA6IF9NX3JlKF9fei5fTV9yZSksIF9NX2ltKF9fei5fTV9pbSkge30KLSMgIGVuZGlmCi0KLSNlbmRpZiAvKiBTUEVDSUFMSVpBVElPTlMgKi8KLQotLy8gVW5hcnkgbm9uLW1lbWJlciBhcml0aG1ldGljIG9wZXJhdG9ycy4KLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWlubGluZSBjb21wbGV4PF9UcD4gX1NUTFBfQ0FMTCBvcGVyYXRvcisoY29uc3QgY29tcGxleDxfVHA+JiBfX3opCi17IHJldHVybiBfX3o7IH0KLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWlubGluZSBjb21wbGV4PF9UcD4gX1NUTFBfQ0FMTCAgb3BlcmF0b3ItKGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KQoteyByZXR1cm4gY29tcGxleDxfVHA+KC1fX3ouX01fcmUsIC1fX3ouX01faW0pOyB9Ci0KLS8vIE5vbi1tZW1iZXIgYXJpdGhtZXRpYyBvcGVyYXRpb25zIGludm9sdmluZyBvbmUgcmVhbCBhcmd1bWVudC4KLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWlubGluZSBjb21wbGV4PF9UcD4gX1NUTFBfQ0FMTCBvcGVyYXRvcisoY29uc3QgX1RwJiBfX3gsIGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KQoteyByZXR1cm4gY29tcGxleDxfVHA+KF9feCArIF9fei5fTV9yZSwgX196Ll9NX2ltKTsgfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotaW5saW5lIGNvbXBsZXg8X1RwPiBfU1RMUF9DQUxMIG9wZXJhdG9yKyhjb25zdCBjb21wbGV4PF9UcD4mIF9feiwgY29uc3QgX1RwJiBfX3gpCi17IHJldHVybiBjb21wbGV4PF9UcD4oX196Ll9NX3JlICsgX194LCBfX3ouX01faW0pOyB9Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgY29tcGxleDxfVHA+IF9TVExQX0NBTEwgb3BlcmF0b3ItKGNvbnN0IF9UcCYgX194LCBjb25zdCBjb21wbGV4PF9UcD4mIF9feikKLXsgcmV0dXJuIGNvbXBsZXg8X1RwPihfX3ggLSBfX3ouX01fcmUsIC1fX3ouX01faW0pOyB9Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgY29tcGxleDxfVHA+IF9TVExQX0NBTEwgb3BlcmF0b3ItKGNvbnN0IGNvbXBsZXg8X1RwPiYgX196LCBjb25zdCBfVHAmIF9feCkKLXsgcmV0dXJuIGNvbXBsZXg8X1RwPihfX3ouX01fcmUgLSBfX3gsIF9fei5fTV9pbSk7IH0KLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWlubGluZSBjb21wbGV4PF9UcD4gX1NUTFBfQ0FMTCBvcGVyYXRvciooY29uc3QgX1RwJiBfX3gsIGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KQoteyByZXR1cm4gY29tcGxleDxfVHA+KF9feCAqIF9fei5fTV9yZSwgX194ICogX196Ll9NX2ltKTsgfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotaW5saW5lIGNvbXBsZXg8X1RwPiBfU1RMUF9DQUxMIG9wZXJhdG9yKihjb25zdCBjb21wbGV4PF9UcD4mIF9feiwgY29uc3QgX1RwJiBfX3gpCi17IHJldHVybiBjb21wbGV4PF9UcD4oX196Ll9NX3JlICogX194LCBfX3ouX01faW0gKiBfX3gpOyB9Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgY29tcGxleDxfVHA+IF9TVExQX0NBTEwgb3BlcmF0b3IvKGNvbnN0IF9UcCYgX194LCBjb25zdCBjb21wbGV4PF9UcD4mIF9feikgewotICBjb21wbGV4PF9UcD4gX19yZXN1bHQ7Ci0gIGNvbXBsZXg8X1RwPjo6X2RpdihfX3gsCi0gICAgICAgICAgICAgICAgICAgICBfX3ouX01fcmUsIF9fei5fTV9pbSwKLSAgICAgICAgICAgICAgICAgICAgIF9fcmVzdWx0Ll9NX3JlLCBfX3Jlc3VsdC5fTV9pbSk7Ci0gIHJldHVybiBfX3Jlc3VsdDsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWlubGluZSBjb21wbGV4PF9UcD4gX1NUTFBfQ0FMTCBvcGVyYXRvci8oY29uc3QgY29tcGxleDxfVHA+JiBfX3osIGNvbnN0IF9UcCYgX194KQoteyByZXR1cm4gY29tcGxleDxfVHA+KF9fei5fTV9yZSAvIF9feCwgX196Ll9NX2ltIC8gX194KTsgfQotCi0vLyBOb24tbWVtYmVyIGFyaXRobWV0aWMgb3BlcmF0aW9ucyBpbnZvbHZpbmcgdHdvIGNvbXBsZXggYXJndW1lbnRzCi0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgY29tcGxleDxfVHA+IF9TVExQX0NBTEwKLW9wZXJhdG9yKyhjb25zdCBjb21wbGV4PF9UcD4mIF9fejEsIGNvbnN0IGNvbXBsZXg8X1RwPiYgX196MikKLXsgcmV0dXJuIGNvbXBsZXg8X1RwPihfX3oxLl9NX3JlICsgX196Mi5fTV9yZSwgX196MS5fTV9pbSArIF9fejIuX01faW0pOyB9Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgY29tcGxleDxfVHA+IF9TVExQX0NBTEwKLW9wZXJhdG9yLShjb25zdCBjb21wbGV4PF9UcD4mIF9fejEsIGNvbnN0IGNvbXBsZXg8X1RwPiYgX196MikKLXsgcmV0dXJuIGNvbXBsZXg8X1RwPihfX3oxLl9NX3JlIC0gX196Mi5fTV9yZSwgX196MS5fTV9pbSAtIF9fejIuX01faW0pOyB9Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgY29tcGxleDxfVHA+IF9TVExQX0NBTEwKLW9wZXJhdG9yKihjb25zdCBjb21wbGV4PF9UcD4mIF9fejEsIGNvbnN0IGNvbXBsZXg8X1RwPiYgX196MikgewotICByZXR1cm4gY29tcGxleDxfVHA+KF9fejEuX01fcmUgKiBfX3oyLl9NX3JlIC0gX196MS5fTV9pbSAqIF9fejIuX01faW0sCi0gICAgICAgICAgICAgICAgICAgICAgX196MS5fTV9yZSAqIF9fejIuX01faW0gKyBfX3oxLl9NX2ltICogX196Mi5fTV9yZSk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgY29tcGxleDxfVHA+IF9TVExQX0NBTEwKLW9wZXJhdG9yLyhjb25zdCBjb21wbGV4PF9UcD4mIF9fejEsIGNvbnN0IGNvbXBsZXg8X1RwPiYgX196MikgewotICBjb21wbGV4PF9UcD4gX19yZXN1bHQ7Ci0gIGNvbXBsZXg8X1RwPjo6X2RpdihfX3oxLl9NX3JlLCBfX3oxLl9NX2ltLAotICAgICAgICAgICAgICAgICAgICAgX196Mi5fTV9yZSwgX196Mi5fTV9pbSwKLSAgICAgICAgICAgICAgICAgICAgIF9fcmVzdWx0Ll9NX3JlLCBfX3Jlc3VsdC5fTV9pbSk7Ci0gIHJldHVybiBfX3Jlc3VsdDsKLX0KLQotLy8gQ29tcGFyaXNvbiBvcGVyYXRvcnMuCi0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yPT0oY29uc3QgY29tcGxleDxfVHA+JiBfX3oxLCBjb25zdCBjb21wbGV4PF9UcD4mIF9fejIpCi17IHJldHVybiBfX3oxLl9NX3JlID09IF9fejIuX01fcmUgJiYgX196MS5fTV9pbSA9PSBfX3oyLl9NX2ltOyB9Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yPT0oY29uc3QgY29tcGxleDxfVHA+JiBfX3osIGNvbnN0IF9UcCYgX194KQoteyByZXR1cm4gX196Ll9NX3JlID09IF9feCAmJiBfX3ouX01faW0gPT0gMDsgfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotaW5saW5lIGJvb2wgX1NUTFBfQ0FMTCBvcGVyYXRvcj09KGNvbnN0IF9UcCYgX194LCBjb25zdCBjb21wbGV4PF9UcD4mIF9feikKLXsgcmV0dXJuIF9feCA9PSBfX3ouX01fcmUgJiYgMCA9PSBfX3ouX01faW07IH0KLQotLy8wNC8yNy8wNCBkdW1zOiByZW1vdmFsIG9mIHRoaXMgY2hlY2ssIGlmIGl0IGlzIHJlc3RhYmxpc2gKLS8vcGxlYXNlIGV4cGxhaW4gd2h5IHRoZSBvdGhlciBvcGVyYXRvcnMgYXJlIG5vdCBtYWNybyBndWFyZGVkCi0vLyNpZmRlZiBfU1RMUF9GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIKLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWlubGluZSBib29sIF9TVExQX0NBTEwgb3BlcmF0b3IhPShjb25zdCBjb21wbGV4PF9UcD4mIF9fejEsIGNvbnN0IGNvbXBsZXg8X1RwPiYgX196MikKLXsgcmV0dXJuIF9fejEuX01fcmUgIT0gX196Mi5fTV9yZSB8fCBfX3oxLl9NX2ltICE9IF9fejIuX01faW07IH0KLQotLy8jZW5kaWYgLyogX1NUTFBfRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSICovCi0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yIT0oY29uc3QgY29tcGxleDxfVHA+JiBfX3osIGNvbnN0IF9UcCYgX194KQoteyByZXR1cm4gX196Ll9NX3JlICE9IF9feCB8fCBfX3ouX01faW0gIT0gMDsgfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotaW5saW5lIGJvb2wgX1NUTFBfQ0FMTCBvcGVyYXRvciE9KGNvbnN0IF9UcCYgX194LCBjb25zdCBjb21wbGV4PF9UcD4mIF9feikKLXsgcmV0dXJuIF9feCAhPSBfX3ouX01fcmUgfHwgMCAhPSBfX3ouX01faW07IH0KLQotLy8gT3RoZXIgYmFzaWMgYXJpdGhtZXRpYyBvcGVyYXRpb25zCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotaW5saW5lIF9UcCBfU1RMUF9DQUxMIHJlYWwoY29uc3QgY29tcGxleDxfVHA+JiBfX3opCi17IHJldHVybiBfX3ouX01fcmU7IH0KLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWlubGluZSBfVHAgX1NUTFBfQ0FMTCBpbWFnKGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KQoteyByZXR1cm4gX196Ll9NX2ltOyB9Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1fVHAgX1NUTFBfQ0FMTCBhYnMoY29uc3QgY29tcGxleDxfVHA+JiBfX3opOwotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotX1RwIF9TVExQX0NBTEwgYXJnKGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KTsKLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWlubGluZSBfVHAgX1NUTFBfQ0FMTCBub3JtKGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KQoteyByZXR1cm4gX196Ll9NX3JlICogX196Ll9NX3JlICsgX196Ll9NX2ltICogX196Ll9NX2ltOyB9Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgY29tcGxleDxfVHA+IF9TVExQX0NBTEwgY29uaihjb25zdCBjb21wbGV4PF9UcD4mIF9feikKLXsgcmV0dXJuIGNvbXBsZXg8X1RwPihfX3ouX01fcmUsIC1fX3ouX01faW0pOyB9Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1jb21wbGV4PF9UcD4gX1NUTFBfQ0FMTCBwb2xhcihjb25zdCBfVHAmIF9fcmhvKQoteyByZXR1cm4gY29tcGxleDxfVHA+KF9fcmhvLCAwKTsgfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotY29tcGxleDxfVHA+IF9TVExQX0NBTEwgcG9sYXIoY29uc3QgX1RwJiBfX3JobywgY29uc3QgX1RwJiBfX3BoaSk7Ci0KLV9TVExQX1RFTVBMQVRFX05VTEwKLV9TVExQX0RFQ0xTUEVDIGZsb2F0IF9TVExQX0NBTEwgYWJzKGNvbnN0IGNvbXBsZXg8ZmxvYXQ+Jik7Ci1fU1RMUF9URU1QTEFURV9OVUxMCi1fU1RMUF9ERUNMU1BFQyBkb3VibGUgX1NUTFBfQ0FMTCBhYnMoY29uc3QgY29tcGxleDxkb3VibGU+Jik7Ci1fU1RMUF9URU1QTEFURV9OVUxMCi1fU1RMUF9ERUNMU1BFQyBmbG9hdCBfU1RMUF9DQUxMIGFyZyhjb25zdCBjb21wbGV4PGZsb2F0PiYpOwotX1NUTFBfVEVNUExBVEVfTlVMTAotX1NUTFBfREVDTFNQRUMgZG91YmxlIF9TVExQX0NBTEwgYXJnKGNvbnN0IGNvbXBsZXg8ZG91YmxlPiYpOwotX1NUTFBfVEVNUExBVEVfTlVMTAotX1NUTFBfREVDTFNQRUMgY29tcGxleDxmbG9hdD4gX1NUTFBfQ0FMTCBwb2xhcihjb25zdCBmbG9hdCYgX19yaG8sIGNvbnN0IGZsb2F0JiBfX3BoaSk7Ci1fU1RMUF9URU1QTEFURV9OVUxMCi1fU1RMUF9ERUNMU1BFQyBjb21wbGV4PGRvdWJsZT4gX1NUTFBfQ0FMTCBwb2xhcihjb25zdCBkb3VibGUmIF9fcmhvLCBjb25zdCBkb3VibGUmIF9fcGhpKTsKLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLV9UcCBfU1RMUF9DQUxMIGFicyhjb25zdCBjb21wbGV4PF9UcD4mIF9feikKLXsgcmV0dXJuIF9UcChhYnMoY29tcGxleDxkb3VibGU+KGRvdWJsZShfX3oucmVhbCgpKSwgZG91YmxlKF9fei5pbWFnKCkpKSkpOyB9Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1fVHAgX1NUTFBfQ0FMTCBhcmcoY29uc3QgY29tcGxleDxfVHA+JiBfX3opCi17IHJldHVybiBfVHAoYXJnKGNvbXBsZXg8ZG91YmxlPihkb3VibGUoX196LnJlYWwoKSksIGRvdWJsZShfX3ouaW1hZygpKSkpKTsgfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotY29tcGxleDxfVHA+IF9TVExQX0NBTEwgcG9sYXIoY29uc3QgX1RwJiBfX3JobywgY29uc3QgX1RwJiBfX3BoaSkgewotICBjb21wbGV4PGRvdWJsZT4gX190bXAgPSBwb2xhcihkb3VibGUoX19yaG8pLCBkb3VibGUoX19waGkpKTsKLSAgcmV0dXJuIGNvbXBsZXg8X1RwPihfVHAoX190bXAucmVhbCgpKSwgX1RwKF9fdG1wLmltYWcoKSkpOwotfQotCi0jaWYgIWRlZmluZWQgKF9TVExQX05PX0xPTkdfRE9VQkxFKQotX1NUTFBfVEVNUExBVEVfTlVMTAotX1NUTFBfREVDTFNQRUMgbG9uZyBkb3VibGUgX1NUTFBfQ0FMTCBhcmcoY29uc3QgY29tcGxleDxsb25nIGRvdWJsZT4mKTsKLV9TVExQX1RFTVBMQVRFX05VTEwKLV9TVExQX0RFQ0xTUEVDIGxvbmcgZG91YmxlIF9TVExQX0NBTEwgYWJzKGNvbnN0IGNvbXBsZXg8bG9uZyBkb3VibGU+Jik7Ci1fU1RMUF9URU1QTEFURV9OVUxMCi1fU1RMUF9ERUNMU1BFQyBjb21wbGV4PGxvbmcgZG91YmxlPiBfU1RMUF9DQUxMIHBvbGFyKGNvbnN0IGxvbmcgZG91YmxlJiwgY29uc3QgbG9uZyBkb3VibGUmKTsKLSNlbmRpZgotCi0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX05PX0lPU1RSRUFNUykKLQotX1NUTFBfRU5EX05BTUVTUEFDRQotCi0jICBpbmNsdWRlIDxpb3Nmd2Q+Ci0KLV9TVExQX0JFR0lOX05BTUVTUEFDRQotCi0vLyBDb21wbGV4IG91dHB1dCwgaW4gdGhlIGZvcm0gKHJlLGltKS4gIFdlIHVzZSBhIHR3by1zdGVwIHByb2Nlc3MKLS8vIGludm9sdmluZyBzdHJpbmdzdHJlYW0gc28gdGhhdCB3ZSBnZXQgdGhlIHBhZGRpbmcgcmlnaHQuCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Ci1iYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mICBfU1RMUF9DQUxMCi1vcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywgY29uc3QgY29tcGxleDxfVHA+JiBfX3opOwotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Ci1iYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9TVExQX0NBTEwKLW9wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLCBjb21wbGV4PF9UcD4mIF9feik7Ci0KLS8vIFNwZWNpYWxpemF0aW9ucyBmb3IgbmFycm93IGNoYXJhY3RlcnM7IGxldHMgdXMgYXZvaWQgd2lkZW4uCi0KLV9TVExQX09QRVJBVE9SX1RFTVBMQVRFCi1fU1RMUF9ERUNMU1BFQyBiYXNpY19pc3RyZWFtPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4mIF9TVExQX0NBTEwKLW9wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+JiBfX2lzLCBjb21wbGV4PGZsb2F0PiYgX196KTsKLQotX1NUTFBfT1BFUkFUT1JfVEVNUExBVEUKLV9TVExQX0RFQ0xTUEVDIGJhc2ljX2lzdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiYgX1NUTFBfQ0FMTAotb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4mIF9faXMsIGNvbXBsZXg8ZG91YmxlPiYgX196KTsKLQotX1NUTFBfT1BFUkFUT1JfVEVNUExBVEUKLV9TVExQX0RFQ0xTUEVDIGJhc2ljX29zdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiYgX1NUTFBfQ0FMTAotb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4mIF9faXMsIGNvbnN0IGNvbXBsZXg8ZmxvYXQ+JiBfX3opOwotCi1fU1RMUF9PUEVSQVRPUl9URU1QTEFURQotX1NUTFBfREVDTFNQRUMgYmFzaWNfb3N0cmVhbTxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+JiBfU1RMUF9DQUxMCi1vcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiYgX19pcywgY29uc3QgY29tcGxleDxkb3VibGU+JiBfX3opOwotCi0jICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTE9OR19ET1VCTEUpCi1fU1RMUF9PUEVSQVRPUl9URU1QTEFURQotX1NUTFBfREVDTFNQRUMgYmFzaWNfaXN0cmVhbTxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+JiBfU1RMUF9DQUxMCi1vcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiYgX19pcywgY29tcGxleDxsb25nIGRvdWJsZT4mIF9feik7Ci0KLV9TVExQX09QRVJBVE9SX1RFTVBMQVRFCi1fU1RMUF9ERUNMU1BFQyBiYXNpY19vc3RyZWFtPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4mIF9TVExQX0NBTEwKLW9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+JiBfX2lzLCBjb25zdCBjb21wbGV4PGxvbmcgZG91YmxlPiYgX196KTsKLQotIyAgZW5kaWYKLQotIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCkgJiYgISBkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQotCi1fU1RMUF9FWFBPUlRfVEVNUExBVEUgYmFzaWNfaXN0cmVhbTx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+JiBfU1RMUF9DQUxMCi1vcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPiYsIGNvbXBsZXg8ZG91YmxlPiYpOwotX1NUTFBfRVhQT1JUX1RFTVBMQVRFIGJhc2ljX29zdHJlYW08d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPiYgX1NUTFBfQ0FMTAotb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4mLCBjb25zdCBjb21wbGV4PGRvdWJsZT4mKTsKLV9TVExQX0VYUE9SVF9URU1QTEFURSBiYXNpY19pc3RyZWFtPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4mIF9TVExQX0NBTEwKLW9wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+JiwgY29tcGxleDxmbG9hdD4mKTsKLV9TVExQX0VYUE9SVF9URU1QTEFURSBiYXNpY19vc3RyZWFtPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4mIF9TVExQX0NBTEwKLW9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+JiwgY29uc3QgY29tcGxleDxmbG9hdD4mKTsKLQotIyAgICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTE9OR19ET1VCTEUpCi1fU1RMUF9FWFBPUlRfVEVNUExBVEUgYmFzaWNfaXN0cmVhbTx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+JiBfU1RMUF9DQUxMCi1vcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPiYsIGNvbXBsZXg8bG9uZyBkb3VibGU+Jik7Ci1fU1RMUF9FWFBPUlRfVEVNUExBVEUgYmFzaWNfb3N0cmVhbTx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+JiBfU1RMUF9DQUxMCi1vcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPiYsIGNvbnN0IGNvbXBsZXg8bG9uZyBkb3VibGU+Jik7Ci0jICAgIGVuZGlmCi0jICBlbmRpZgotI2VuZGlmCi0KLQotLy8gVHJhbnNjZW5kZW50YWwgZnVuY3Rpb25zLiAgVGhlc2UgYXJlIGRlZmluZWQgb25seSBmb3IgZmxvYXQsCi0vLyAgZG91YmxlLCBhbmQgbG9uZyBkb3VibGUuICAoU3FydCBpc24ndCB0cmFuc2NlbmRlbnRhbCwgb2YgY291cnNlLAotLy8gIGJ1dCBpdCdzIGluY2x1ZGVkIGluIHRoaXMgc2VjdGlvbiBhbnl3YXkuKQotCi1fU1RMUF9ERUNMU1BFQyBjb21wbGV4PGZsb2F0PiBfU1RMUF9DQUxMIHNxcnQoY29uc3QgY29tcGxleDxmbG9hdD4mKTsKLQotX1NUTFBfREVDTFNQRUMgY29tcGxleDxmbG9hdD4gX1NUTFBfQ0FMTCBleHAoY29uc3QgY29tcGxleDxmbG9hdD4mKTsKLV9TVExQX0RFQ0xTUEVDIGNvbXBsZXg8ZmxvYXQ+IF9TVExQX0NBTEwgIGxvZyhjb25zdCBjb21wbGV4PGZsb2F0PiYpOwotX1NUTFBfREVDTFNQRUMgY29tcGxleDxmbG9hdD4gX1NUTFBfQ0FMTCBsb2cxMChjb25zdCBjb21wbGV4PGZsb2F0PiYpOwotCi1fU1RMUF9ERUNMU1BFQyBjb21wbGV4PGZsb2F0PiBfU1RMUF9DQUxMIHBvdyhjb25zdCBjb21wbGV4PGZsb2F0PiYsIGludCk7Ci1fU1RMUF9ERUNMU1BFQyBjb21wbGV4PGZsb2F0PiBfU1RMUF9DQUxMIHBvdyhjb25zdCBjb21wbGV4PGZsb2F0PiYsIGNvbnN0IGZsb2F0Jik7Ci1fU1RMUF9ERUNMU1BFQyBjb21wbGV4PGZsb2F0PiBfU1RMUF9DQUxMIHBvdyhjb25zdCBmbG9hdCYsIGNvbnN0IGNvbXBsZXg8ZmxvYXQ+Jik7Ci1fU1RMUF9ERUNMU1BFQyBjb21wbGV4PGZsb2F0PiBfU1RMUF9DQUxMIHBvdyhjb25zdCBjb21wbGV4PGZsb2F0PiYsIGNvbnN0IGNvbXBsZXg8ZmxvYXQ+Jik7Ci0KLV9TVExQX0RFQ0xTUEVDIGNvbXBsZXg8ZmxvYXQ+IF9TVExQX0NBTEwgc2luKGNvbnN0IGNvbXBsZXg8ZmxvYXQ+Jik7Ci1fU1RMUF9ERUNMU1BFQyBjb21wbGV4PGZsb2F0PiBfU1RMUF9DQUxMIGNvcyhjb25zdCBjb21wbGV4PGZsb2F0PiYpOwotX1NUTFBfREVDTFNQRUMgY29tcGxleDxmbG9hdD4gX1NUTFBfQ0FMTCB0YW4oY29uc3QgY29tcGxleDxmbG9hdD4mKTsKLQotX1NUTFBfREVDTFNQRUMgY29tcGxleDxmbG9hdD4gX1NUTFBfQ0FMTCBzaW5oKGNvbnN0IGNvbXBsZXg8ZmxvYXQ+Jik7Ci1fU1RMUF9ERUNMU1BFQyBjb21wbGV4PGZsb2F0PiBfU1RMUF9DQUxMIGNvc2goY29uc3QgY29tcGxleDxmbG9hdD4mKTsKLV9TVExQX0RFQ0xTUEVDIGNvbXBsZXg8ZmxvYXQ+IF9TVExQX0NBTEwgdGFuaChjb25zdCBjb21wbGV4PGZsb2F0PiYpOwotCi1fU1RMUF9ERUNMU1BFQyBjb21wbGV4PGRvdWJsZT4gX1NUTFBfQ0FMTCBzcXJ0KGNvbnN0IGNvbXBsZXg8ZG91YmxlPiYpOwotCi1fU1RMUF9ERUNMU1BFQyBjb21wbGV4PGRvdWJsZT4gX1NUTFBfQ0FMTCBleHAoY29uc3QgY29tcGxleDxkb3VibGU+Jik7Ci1fU1RMUF9ERUNMU1BFQyBjb21wbGV4PGRvdWJsZT4gX1NUTFBfQ0FMTCBsb2coY29uc3QgY29tcGxleDxkb3VibGU+Jik7Ci1fU1RMUF9ERUNMU1BFQyBjb21wbGV4PGRvdWJsZT4gX1NUTFBfQ0FMTCBsb2cxMChjb25zdCBjb21wbGV4PGRvdWJsZT4mKTsKLQotX1NUTFBfREVDTFNQRUMgY29tcGxleDxkb3VibGU+IF9TVExQX0NBTEwgcG93KGNvbnN0IGNvbXBsZXg8ZG91YmxlPiYsIGludCk7Ci1fU1RMUF9ERUNMU1BFQyBjb21wbGV4PGRvdWJsZT4gX1NUTFBfQ0FMTCBwb3coY29uc3QgY29tcGxleDxkb3VibGU+JiwgY29uc3QgZG91YmxlJik7Ci1fU1RMUF9ERUNMU1BFQyBjb21wbGV4PGRvdWJsZT4gX1NUTFBfQ0FMTCBwb3coY29uc3QgZG91YmxlJiwgY29uc3QgY29tcGxleDxkb3VibGU+Jik7Ci1fU1RMUF9ERUNMU1BFQyBjb21wbGV4PGRvdWJsZT4gX1NUTFBfQ0FMTCBwb3coY29uc3QgY29tcGxleDxkb3VibGU+JiwgY29uc3QgY29tcGxleDxkb3VibGU+Jik7Ci0KLV9TVExQX0RFQ0xTUEVDIGNvbXBsZXg8ZG91YmxlPiBfU1RMUF9DQUxMIHNpbihjb25zdCBjb21wbGV4PGRvdWJsZT4mKTsKLV9TVExQX0RFQ0xTUEVDIGNvbXBsZXg8ZG91YmxlPiBfU1RMUF9DQUxMIGNvcyhjb25zdCBjb21wbGV4PGRvdWJsZT4mKTsKLV9TVExQX0RFQ0xTUEVDIGNvbXBsZXg8ZG91YmxlPiBfU1RMUF9DQUxMIHRhbihjb25zdCBjb21wbGV4PGRvdWJsZT4mKTsKLQotX1NUTFBfREVDTFNQRUMgY29tcGxleDxkb3VibGU+IF9TVExQX0NBTEwgc2luaChjb25zdCBjb21wbGV4PGRvdWJsZT4mKTsKLV9TVExQX0RFQ0xTUEVDIGNvbXBsZXg8ZG91YmxlPiBfU1RMUF9DQUxMIGNvc2goY29uc3QgY29tcGxleDxkb3VibGU+Jik7Ci1fU1RMUF9ERUNMU1BFQyBjb21wbGV4PGRvdWJsZT4gX1NUTFBfQ0FMTCB0YW5oKGNvbnN0IGNvbXBsZXg8ZG91YmxlPiYpOwotCi0jaWYgIWRlZmluZWQgKF9TVExQX05PX0xPTkdfRE9VQkxFKQotX1NUTFBfREVDTFNQRUMgY29tcGxleDxsb25nIGRvdWJsZT4gX1NUTFBfQ0FMTCBzcXJ0KGNvbnN0IGNvbXBsZXg8bG9uZyBkb3VibGU+Jik7Ci1fU1RMUF9ERUNMU1BFQyBjb21wbGV4PGxvbmcgZG91YmxlPiBfU1RMUF9DQUxMIGV4cChjb25zdCBjb21wbGV4PGxvbmcgZG91YmxlPiYpOwotX1NUTFBfREVDTFNQRUMgY29tcGxleDxsb25nIGRvdWJsZT4gX1NUTFBfQ0FMTCBsb2coY29uc3QgY29tcGxleDxsb25nIGRvdWJsZT4mKTsKLV9TVExQX0RFQ0xTUEVDIGNvbXBsZXg8bG9uZyBkb3VibGU+IF9TVExQX0NBTEwgbG9nMTAoY29uc3QgY29tcGxleDxsb25nIGRvdWJsZT4mKTsKLQotX1NUTFBfREVDTFNQRUMgY29tcGxleDxsb25nIGRvdWJsZT4gX1NUTFBfQ0FMTCBwb3coY29uc3QgY29tcGxleDxsb25nIGRvdWJsZT4mLCBpbnQpOwotX1NUTFBfREVDTFNQRUMgY29tcGxleDxsb25nIGRvdWJsZT4gX1NUTFBfQ0FMTCBwb3coY29uc3QgY29tcGxleDxsb25nIGRvdWJsZT4mLCBjb25zdCBsb25nIGRvdWJsZSYpOwotX1NUTFBfREVDTFNQRUMgY29tcGxleDxsb25nIGRvdWJsZT4gX1NUTFBfQ0FMTCBwb3coY29uc3QgbG9uZyBkb3VibGUmLCBjb25zdCBjb21wbGV4PGxvbmcgZG91YmxlPiYpOwotX1NUTFBfREVDTFNQRUMgY29tcGxleDxsb25nIGRvdWJsZT4gX1NUTFBfQ0FMTCBwb3coY29uc3QgY29tcGxleDxsb25nIGRvdWJsZT4mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcGxleDxsb25nIGRvdWJsZT4mKTsKLQotX1NUTFBfREVDTFNQRUMgY29tcGxleDxsb25nIGRvdWJsZT4gX1NUTFBfQ0FMTCBzaW4oY29uc3QgY29tcGxleDxsb25nIGRvdWJsZT4mKTsKLV9TVExQX0RFQ0xTUEVDIGNvbXBsZXg8bG9uZyBkb3VibGU+IF9TVExQX0NBTEwgY29zKGNvbnN0IGNvbXBsZXg8bG9uZyBkb3VibGU+Jik7Ci1fU1RMUF9ERUNMU1BFQyBjb21wbGV4PGxvbmcgZG91YmxlPiBfU1RMUF9DQUxMIHRhbihjb25zdCBjb21wbGV4PGxvbmcgZG91YmxlPiYpOwotCi1fU1RMUF9ERUNMU1BFQyBjb21wbGV4PGxvbmcgZG91YmxlPiBfU1RMUF9DQUxMIHNpbmgoY29uc3QgY29tcGxleDxsb25nIGRvdWJsZT4mKTsKLV9TVExQX0RFQ0xTUEVDIGNvbXBsZXg8bG9uZyBkb3VibGU+IF9TVExQX0NBTEwgY29zaChjb25zdCBjb21wbGV4PGxvbmcgZG91YmxlPiYpOwotX1NUTFBfREVDTFNQRUMgY29tcGxleDxsb25nIGRvdWJsZT4gX1NUTFBfQ0FMTCB0YW5oKGNvbnN0IGNvbXBsZXg8bG9uZyBkb3VibGU+Jik7Ci0jZW5kaWYKLQotX1NUTFBfRU5EX05BTUVTUEFDRQotCi0jaWZuZGVmIF9TVExQX0xJTktfVElNRV9JTlNUQU5USUFUSU9OCi0jICBpbmNsdWRlIDxzdGwvX2NvbXBsZXguYz4KLSNlbmRpZgotCi0jZW5kaWYKLQotLy8gTG9jYWwgVmFyaWFibGVzOgotLy8gbW9kZTpDKysKLS8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9fY29uZmlnX2NvbXBhdF9wb3N0LmggYi9zdGwvX2NvbmZpZ19jb21wYXRfcG9zdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzI2YWM1Li4wMDAwMDAwCi0tLSBhL3N0bC9fY29uZmlnX2NvbXBhdF9wb3N0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotI2lmIDEgLyogZGVmIF9TVExQXzNfQ09NUEFUSUJJTElUWSAqLwotCi0jIGRlZmluZSBfX1NHSV9TVExfUE9SVCAgX1NUTFBPUlRfVkVSU0lPTgotCi0jIGlmIGRlZmluZWQgKF9TVExQX0RFQlVHKSAmJiAhIGRlZmluZWQgKCBfX1NUTF9ERUJVRyApCi0jICBkZWZpbmUgX19TVExfREVCVUcgX1NUTFBfREVCVUcKLSMgZW5kaWYKLQotIyBpZiBkZWZpbmVkIChfU1RMUF9VU0VfTkFNRVNQQUNFUykKLSMgIHVuZGVmICBfX1NUTF9VU0VfTkFNRVNQQUNFUwotIyAgZGVmaW5lIF9fU1RMX1VTRV9OQU1FU1BBQ0VTIF9TVExQX1VTRV9OQU1FU1BBQ0VTCi0jIGVuZGlmCi0KLSMgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX0VYQ0VQVElPTlMpCi0jICB1bmRlZiAgX19TVExfVVNFX0VYQ0VQVElPTlMKLSMgIGRlZmluZSBfX1NUTF9VU0VfRVhDRVBUSU9OUyBfU1RMUF9VU0VfRVhDRVBUSU9OUwotIyBlbmRpZgotCi0jIGlmIGRlZmluZWQgKF9TVExQX0JFR0lOX05BTUVTUEFDRSkgJiYgISBkZWZpbmVkICggX19TVExfQkVHSU5fTkFNRVNQQUNFICkKLSMgIGRlZmluZSBfX1NUTF9CRUdJTl9OQU1FU1BBQ0UgX1NUTFBfQkVHSU5fTkFNRVNQQUNFCi0jICBkZWZpbmUgX19TVExfRU5EX05BTUVTUEFDRSBfU1RMUF9FTkRfTkFNRVNQQUNFCi0jICBkZWZpbmUgX19TVExfVkVORE9SX1NURCBfU1RMUF9WRU5ET1JfU1RECi0jICBkZWZpbmUgX19TVExfVkVORE9SX0NTVEQgX1NUTFBfVkVORE9SX0NTVEQKLSMgZW5kaWYKLSMgZW5kaWYKLQotLyoKLSMgaWYgZGVmaW5lZCAoX1NUTFBfWFhYKSAmJiAhIGRlZmluZWQgKCBfX1NUTF9YWFggKQotIyAgZGVmaW5lIF9fU1RMX1hYWCBfU1RMUF9YWFgKLSMgZW5kaWYKLSovCi0KLS8qIDUuMCAtPiA0LjYgY29tcGF0aWJpbGl0eSBzZWN0aW9uICovCi0jaWYgMSAvKiBkZWYgX1NUTFBfNDZfQ09NUEFUSUJJTElUWSAqLwotCi0jaWZuZGVmICBfU1RMUF9VU0lOR19OQU1FU1BBQ0VfQlVHCi0jIGRlZmluZSBfU1RMUF9VU0lOR19OQU1FU1BBQ0VfQlVHCi0jZW5kaWYKLQotLyogcHJvdmlkZSBhIHVuaWZvcm0gd2F5IHRvIGFjY2VzcyBmdWxsIGZ1bmNsaW9uYWxpdHkgKi8KLSMgZGVmaW5lIF9fc2xpc3RfXyAgICAgICAgIHNsaXN0Ci0jIGRlZmluZSBfX21hcF9fICAgICAgICAgICBtYXAKLSMgZGVmaW5lIF9fbXVsdGltYXBfXyAgICAgIG11bHRpbWFwCi0jIGRlZmluZSBfX3NldF9fICAgICAgICAgICBzZXQKLSMgZGVmaW5lIF9fbXVsdGlzZXRfXyAgICAgIG11bHRpc2V0Ci0jIGRlZmluZSBfX2xpc3RfXyAgICAgICAgICBsaXN0Ci0jIGRlZmluZSBfX2hhc2hfbWFwX18gICAgICBoYXNoX21hcAotIyBkZWZpbmUgX19oYXNoX211bHRpbWFwX18gaGFzaF9tdWx0aW1hcAotIyBkZWZpbmUgX19oYXNoX3NldF9fICAgICAgaGFzaF9zZXQKLSMgZGVmaW5lIF9faGFzaF9tdWx0aXNldF9fIGhhc2hfbXVsdGlzZXQKLSMgZGVmaW5lIF9fdmVjdG9yX18gICAgICAgIHZlY3RvcgotCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvc3RsL19jb25zdHJ1Y3QuaCBiL3N0bC9fY29uc3RydWN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MjhkOTIuLjAwMDAwMDAKLS0tIGEvc3RsL19jb25zdHJ1Y3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0NSArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NAotICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NwotICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk3Ci0gKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5Ci0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLQotLyogTk9URTogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgU1RMIGhlYWRlcnMuCi0gKiAgIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LgotICovCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ09OU1RSVUNUX0gKLSNkZWZpbmUgX1NUTFBfSU5URVJOQUxfQ09OU1RSVUNUX0gKLQotI2lmICFkZWZpbmVkIChfU1RMUF9ERUJVR19VTklOSVRJQUxJWkVEKSAmJiAhZGVmaW5lZCAoX1NUTFBfSU5URVJOQUxfQ1NUUklORykKLSMgIGluY2x1ZGUgPHN0bC9fY3N0cmluZy5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfTkVXCi0jICBpbmNsdWRlIDxzdGwvX25ldy5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfSVRFUkFUT1JfQkFTRV9ICi0jICBpbmNsdWRlIDxzdGwvX2l0ZXJhdG9yX2Jhc2UuaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX01PVkVfQ09OU1RSVUNUX0ZXS19ICi0jICBpbmNsdWRlIDxzdGwvX21vdmVfY29uc3RydWN0X2Z3ay5oPgotI2VuZGlmCi0KLV9TVExQX0JFR0lOX05BTUVTUEFDRQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotaW5saW5lIHZvaWQgX19kZXN0cm95X2F1eChfVHAqIF9fcG9pbnRlciwgY29uc3QgX19mYWxzZV90eXBlJiAvKl9Ucml2aWFsX2Rlc3RydWN0b3IqLykKLXsgX19wb2ludGVyLT5+X1RwKCk7IH0KLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWlubGluZSB2b2lkIF9fZGVzdHJveV9hdXgoX1RwKiwgY29uc3QgX190cnVlX3R5cGUmIC8qX1RyaXZpYWxfZGVzdHJ1Y3RvciovKSB7fQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotaW5saW5lIHZvaWQgX0Rlc3Ryb3koX1RwKiBfX3BvaW50ZXIpIHsKLSNpZiBkZWZpbmVkIChfU1RMUF9NU1ZDKSAmJiAoX1NUTFBfTVNWQyA8PSAxMDEwKQotICBfX3BvaW50ZXI7Ci0jZW5kaWYKLSAgdHlwZWRlZiB0eXBlbmFtZSBfX3R5cGVfdHJhaXRzPF9UcD46Omhhc190cml2aWFsX2Rlc3RydWN0b3IgX1RyaXZpYWxfZGVzdHJ1Y3RvcjsKLSAgX19kZXN0cm95X2F1eChfX3BvaW50ZXIsIF9Ucml2aWFsX2Rlc3RydWN0b3IoKSk7Ci0jaWYgZGVmaW5lZCAoX1NUTFBfREVCVUdfVU5JTklUSUFMSVpFRCkKLSAgbWVtc2V0KF9fUkVJTlRFUlBSRVRfQ0FTVChjaGFyKiwgX19wb2ludGVyKSwgX1NUTFBfU0hSRURfQllURSwgc2l6ZW9mKF9UcCkpOwotI2VuZGlmCi19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgdm9pZCBfRGVzdHJveV9Nb3ZlZChfVHAqIF9fcG9pbnRlcikgewotICB0eXBlZGVmIHR5cGVuYW1lIF9fbW92ZV90cmFpdHM8X1RwPjo6Y29tcGxldGUgX1RyaXZpYWxfZGVzdHJ1Y3RvcjsKLSAgX19kZXN0cm95X2F1eChfX3BvaW50ZXIsIF9Ucml2aWFsX2Rlc3RydWN0b3IoKSk7Ci0jaWYgZGVmaW5lZCAoX1NUTFBfREVCVUdfVU5JTklUSUFMSVpFRCkKLSAgbWVtc2V0KChjaGFyKilfX3BvaW50ZXIsIF9TVExQX1NIUkVEX0JZVEUsIHNpemVvZihfVHApKTsKLSNlbmRpZgotfQotCi0jaWYgZGVmaW5lZCAobmV3KQotIyAgZGVmaW5lIF9TVExQX05FV19SRURFRklORSBuZXcKLSMgIHVuZGVmIG5ldwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9ERUZfQ09OU1RfUExDVF9ORVdfQlVHKQotdGVtcGxhdGUgPGNsYXNzIF9UMT4KLWlubGluZSB2b2lkIF9Db25zdHJ1Y3RfYXV4IChfVDEqIF9fcCwgY29uc3QgX19mYWxzZV90eXBlJikgewotICBfU1RMUF9QTEFDRU1FTlRfTkVXIChfX3ApIF9UMSgpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1QxPgotaW5saW5lIHZvaWQgX0NvbnN0cnVjdF9hdXggKF9UMSogX19wLCBjb25zdCBfX3RydWVfdHlwZSYpIHsKLSAgX1NUTFBfUExBQ0VNRU5UX05FVyAoX19wKSBfVDEoMCk7Ci19Ci0jZW5kaWYgLyogX1NUTFBfREVGX0NPTlNUX1BMQ1RfTkVXX0JVRyAqLwotCi10ZW1wbGF0ZSA8Y2xhc3MgX1QxPgotaW5saW5lIHZvaWQgX0NvbnN0cnVjdChfVDEqIF9fcCkgewotI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHX1VOSU5JVElBTElaRUQpCi0gIG1lbXNldCgoY2hhciopX19wLCBfU1RMUF9TSFJFRF9CWVRFLCBzaXplb2YoX1QxKSk7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkIChfU1RMUF9ERUZfQ09OU1RfUExDVF9ORVdfQlVHKQotICBfQ29uc3RydWN0X2F1eCAoX19wLCBfSGFzRGVmYXVsdFplcm9WYWx1ZShfX3ApLl9BbnN3ZXIoKSApOwotI2Vsc2UKLSAgX1NUTFBfUExBQ0VNRU5UX05FVyAoX19wKSBfVDEoKTsKLSNlbmRpZiAvKiBfU1RMUF9ERUZfQ09OU1RfUExDVF9ORVdfQlVHICovCi19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgdm9pZCBfQ29weV9Db25zdHJ1Y3QoX1RwKiBfX3AsIGNvbnN0IF9UcCYgX192YWwpIHsKLSNpZiBkZWZpbmVkIChfU1RMUF9ERUJVR19VTklOSVRJQUxJWkVEKQotICBtZW1zZXQoKGNoYXIqKV9fcCwgX1NUTFBfU0hSRURfQllURSwgc2l6ZW9mKF9UcCkpOwotI2VuZGlmCi0gIF9TVExQX1BMQUNFTUVOVF9ORVcgKF9fcCkgX1RwKF9fdmFsKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgotaW5saW5lIHZvaWQgX1BhcmFtX0NvbnN0cnVjdChfVDEqIF9fcCwgY29uc3QgX1QyJiBfX3ZhbCkgewotI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHX1VOSU5JVElBTElaRUQpCi0gIG1lbXNldCgoY2hhciopX19wLCBfU1RMUF9TSFJFRF9CWVRFLCBzaXplb2YoX1QxKSk7Ci0jZW5kaWYKLSAgX1NUTFBfUExBQ0VNRU5UX05FVyAoX19wKSBfVDEoX192YWwpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+Ci1pbmxpbmUgdm9pZCBfTW92ZV9Db25zdHJ1Y3RfQXV4KF9UMSogX19wLCBfVDImIF9fdmFsLCBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qX0lzUE9EKi8pIHsKLSAgX1NUTFBfUExBQ0VNRU5UX05FVyAoX19wKSBfVDEoX1NUTFBfUFJJViBfQXNNb3ZlU291cmNlKF9fdmFsKSk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KLWlubGluZSB2b2lkIF9Nb3ZlX0NvbnN0cnVjdF9BdXgoX1QxKiBfX3AsIF9UMiYgX192YWwsIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKl9Jc1BPRCovKSB7Ci0gIF9TVExQX1BMQUNFTUVOVF9ORVcgKF9fcCkgX1QxKF9fdmFsKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgotaW5saW5lIHZvaWQgX01vdmVfQ29uc3RydWN0KF9UMSogX19wLCBfVDImIF9fdmFsKSB7Ci0jaWYgZGVmaW5lZCAoX1NUTFBfREVCVUdfVU5JTklUSUFMSVpFRCkKLSAgbWVtc2V0KChjaGFyKilfX3AsIF9TVExQX1NIUkVEX0JZVEUsIHNpemVvZihfVDEpKTsKLSNlbmRpZgotICBfTW92ZV9Db25zdHJ1Y3RfQXV4KF9fcCwgX192YWwsIF9Jc19QT0QoX19wKS5fQW5zd2VyKCkpOwotfQotCi0jaWYgZGVmaW5lZChfU1RMUF9ORVdfUkVERUZJTkUpCi0jICBpZiBkZWZpbmVkIChERUJVR19ORVcpCi0jICAgIGRlZmluZSBuZXcgREVCVUdfTkVXCi0jICBlbmRpZgotIyAgdW5kZWYgX1NUTFBfTkVXX1JFREVGSU5FCi0jZW5kaWYKLQotdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3IsIGNsYXNzIF9UcD4KLV9TVExQX0lOTElORV9MT09QIHZvaWQKLV9fZGVzdHJveV9yYW5nZV9hdXgoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwgX1RwKiwgY29uc3QgX19mYWxzZV90eXBlJiAvKl9Ucml2aWFsX2Rlc3RydWN0b3IqLykgewotICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpIHsKLSAgICBfX2Rlc3Ryb3lfYXV4KCYoKl9fZmlyc3QpLCBfX2ZhbHNlX3R5cGUoKSk7Ci0jaWYgZGVmaW5lZCAoX1NUTFBfREVCVUdfVU5JTklUSUFMSVpFRCkKLSAgICBtZW1zZXQoKGNoYXIqKSYoKl9fZmlyc3QpLCBfU1RMUF9TSFJFRF9CWVRFLCBzaXplb2YoX1RwKSk7Ci0jZW5kaWYKLSAgfQotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvciwgY2xhc3MgX1RwPgotI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHX1VOSU5JVElBTElaRUQpCi1fU1RMUF9JTkxJTkVfTE9PUCB2b2lkCi1fX2Rlc3Ryb3lfcmFuZ2VfYXV4KF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsIF9UcCosIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKl9Ucml2aWFsX2Rlc3RydWN0b3IqLykgewotICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCi0gICAgbWVtc2V0KChjaGFyKikmKCpfX2ZpcnN0KSwgX1NUTFBfU0hSRURfQllURSwgc2l6ZW9mKF9UcCkpOwotfQotI2Vsc2UKLWlubGluZSB2b2lkCi1fX2Rlc3Ryb3lfcmFuZ2VfYXV4KF9Gb3J3YXJkSXRlcmF0b3IsIF9Gb3J3YXJkSXRlcmF0b3IsIF9UcCosIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKl9Ucml2aWFsX2Rlc3RydWN0b3IqLykge30KLSNlbmRpZgotCi10ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvciwgY2xhc3MgX1RwPgotaW5saW5lIHZvaWQKLV9fZGVzdHJveV9yYW5nZShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LCBfVHAgKl9fcHRyKSB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX190eXBlX3RyYWl0czxfVHA+OjpoYXNfdHJpdmlhbF9kZXN0cnVjdG9yIF9Ucml2aWFsX2Rlc3RydWN0b3I7Ci0gIF9fZGVzdHJveV9yYW5nZV9hdXgoX19maXJzdCwgX19sYXN0LCBfX3B0ciwgX1RyaXZpYWxfZGVzdHJ1Y3RvcigpKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+Ci1pbmxpbmUgdm9pZCBfRGVzdHJveV9SYW5nZShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KSB7Ci0gIF9fZGVzdHJveV9yYW5nZShfX2ZpcnN0LCBfX2xhc3QsIF9TVExQX1ZBTFVFX1RZUEUoX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvcikpOwotfQotCi1pbmxpbmUgdm9pZCBfRGVzdHJveV9SYW5nZShjaGFyKiwgY2hhciopIHt9Ci0jaWYgZGVmaW5lZCAoX1NUTFBfSEFTX1dDSEFSX1QpIC8vIGR3YSA4LzE1Lzk3Ci1pbmxpbmUgdm9pZCBfRGVzdHJveV9SYW5nZSh3Y2hhcl90Kiwgd2NoYXJfdCopIHt9Ci1pbmxpbmUgdm9pZCBfRGVzdHJveV9SYW5nZShjb25zdCB3Y2hhcl90KiwgY29uc3Qgd2NoYXJfdCopIHt9Ci0jZW5kaWYKLQotdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3IsIGNsYXNzIF9UcD4KLWlubGluZSB2b2lkCi1fX2Rlc3Ryb3lfbXZfc3JjcyhfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LCBfVHAgKl9fcHRyKSB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX19tb3ZlX3RyYWl0czxfVHA+Ojpjb21wbGV0ZSBfQ29tcGxldGVNb3ZlOwotICBfX2Rlc3Ryb3lfcmFuZ2VfYXV4KF9fZmlyc3QsIF9fbGFzdCwgX19wdHIsIF9Db21wbGV0ZU1vdmUoKSk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgotaW5saW5lIHZvaWQgX0Rlc3Ryb3lfTW92ZWRfUmFuZ2UoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCkgewotICBfX2Rlc3Ryb3lfbXZfc3JjcyhfX2ZpcnN0LCBfX2xhc3QsIF9TVExQX1ZBTFVFX1RZUEUoX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvcikpOwotfQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfREVGX0NPTlNUX0RFRl9QQVJBTV9CVUcpCi0vLyBUaG9zZSBhZGFwdG9ycyBhcmUgaGVyZSB0byBmaXggY29tbW9uIGNvbXBpbGVyIGJ1ZyByZWdhcmRpbmcgYnVpbHRpbnM6Ci0vLyBleHByZXNzaW9ucyBsaWtlIGludCBrID0gaW50KCkgc2hvdWxkIGluaXRpYWxpemUgayB0byAwCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotaW5saW5lIF9UcCBfX2RlZmF1bHRfY29uc3RydWN0ZWRfYXV4KF9UcCosIGNvbnN0IF9fZmFsc2VfdHlwZSYpIHsKLSAgcmV0dXJuIF9UcCgpOwotfQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWlubGluZSBfVHAgX19kZWZhdWx0X2NvbnN0cnVjdGVkX2F1eChfVHAqLCBjb25zdCBfX3RydWVfdHlwZSYpIHsKLSAgcmV0dXJuIF9UcCgwKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWlubGluZSBfVHAgX19kZWZhdWx0X2NvbnN0cnVjdGVkKF9UcCogX19wKSB7Ci0gIHJldHVybiBfX2RlZmF1bHRfY29uc3RydWN0ZWRfYXV4KF9fcCwgX0hhc0RlZmF1bHRaZXJvVmFsdWUoX19wKS5fQW5zd2VyKCkpOwotfQotCi0jICBkZWZpbmUgX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRChfVFRwKSBfX2RlZmF1bHRfY29uc3RydWN0ZWQoKF9UVHAqKTApCi0jZWxzZQotIyAgZGVmaW5lIF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQoX1RUcCkgX1RUcCgpCi0jZW5kaWYgLyogX1NUTFBfREVGX0NPTlNUX0RFRl9QQVJBTV9CVUcgKi8KLQotCi0jaWYgIWRlZmluZWQgKF9TVExQX05PX0FOQUNIUk9OSVNNUykKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBPbGQgbmFtZXMgZnJvbSB0aGUgSFAgU1RMLgotCi10ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+Ci1pbmxpbmUgdm9pZCBjb25zdHJ1Y3QoX1QxKiBfX3AsIGNvbnN0IF9UMiYgX192YWwpIHtfUGFyYW1fQ29uc3RydWN0KF9fcCwgX192YWwpOyB9Ci10ZW1wbGF0ZSA8Y2xhc3MgX1QxPgotaW5saW5lIHZvaWQgY29uc3RydWN0KF9UMSogX19wKSB7IF9TVExQX1NURDo6X0NvbnN0cnVjdChfX3ApOyB9Ci10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotaW5saW5lIHZvaWQgZGVzdHJveShfVHAqIF9fcG9pbnRlcikgeyAgX1NUTFBfU1REOjpfRGVzdHJveShfX3BvaW50ZXIpOyB9Ci10ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KLWlubGluZSB2b2lkIGRlc3Ryb3koX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCkgeyBfU1RMUF9TVEQ6Ol9EZXN0cm95X1JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7IH0KLSNlbmRpZiAvKiBfU1RMUF9OT19BTkFDSFJPTklTTVMgKi8KLQotX1NUTFBfRU5EX05BTUVTUEFDRQotCi0jZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfQ09OU1RSVUNUX0ggKi8KLQotLy8gTG9jYWwgVmFyaWFibGVzOgotLy8gbW9kZTpDKysKLS8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9fY3NldGptcC5oIGIvc3RsL19jc2V0am1wLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiYjAwMTguLjAwMDAwMDAKLS0tIGEvc3RsL19jc2V0am1wLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DU0VUSk1QCi0jZGVmaW5lIF9TVExQX0lOVEVSTkFMX0NTRVRKTVAKLQotLy8gaWYgdGhlIG1hY3JvIGlzIG9uLCB0aGUgaGVhZGVyIGlzIGFscmVhZHkgdGhlcmUKLSNpZiAhZGVmaW5lZCAoc2V0am1wKQotIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX05FV19DX0hFQURFUlMpCi0jICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUihjc2V0am1wKQotIyAgZWxzZQotIyAgICBkZWZpbmUgX1NUTFBfTkFUSVZFX1NFVEpNUF9IX0lOQ0xVREVECi0jICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NfSEVBREVSKHNldGptcC5oKQotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX1NUTFBfSU1QT1JUX1ZFTkRPUl9DU1REKQotCi0jICBpZiBkZWZpbmVkIChfX0JPUkxBTkRDX18pICYmIGRlZmluZWQgKF9TVExQX1VTRV9ORVdfQ19IRUFERVJTKQotLyogRm9yIEJvcmxhbmQsIGV2ZW4gaWYgc3Rkam1wLmggaXMgaW5jbHVkZWQgc3ltYm9scyB3b24ndCBiZSBpbiBnbG9iYWwgbmFtZXNwYWNlCi0gKiBzbyB3ZSBuZWVkIHRvIHJlYWNoIHRoZW0gaW4gdmVuZG9yIG5hbWVzcGFjZToKLSAqLwotIyAgICB1bmRlZiBfU1RMUF9OQVRJVkVfU0VUSk1QX0hfSU5DTFVERUQKLSMgIGVuZGlmCi0KLV9TVExQX0JFR0lOX05BTUVTUEFDRQotIyAgaWYgIWRlZmluZWQgKF9TVExQX05BVElWRV9TRVRKTVBfSF9JTkNMVURFRCkKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpqbXBfYnVmOwotIyAgZWxzZQotLy8gaWYgc2V0am1wLmggd2FzIGluY2x1ZGVkIGZpcnN0LCB0aGlzIGlzIGluIGdsb2JhbCBuYW1lc3BhY2UsIG5vdCBpbgotLy8gdmVuZG9yJ3Mgc3RkLiAgLSAyMDA1LTA4LTA0LCBwdHIKLXVzaW5nIDo6am1wX2J1ZjsKLSMgIGVuZGlmCi0jICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fQ1NURF9GVU5DVElPTl9JTVBPUlRTKQotIyAgICBpZiAhZGVmaW5lZCAoc2V0am1wKQotIyAgICAgIGlmICFkZWZpbmVkIChfX01TTF9fKSB8fCAoKF9fTVNMX18gPiAweDcwMDEpICYmIChfX01TTF9fIDwgMHg4MDAwKSkKLSMgICAgICAgIGlmbmRlZiBfU1RMUF9OQVRJVkVfU0VUSk1QX0hfSU5DTFVERUQKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpzZXRqbXA7Ci0jICAgICAgICBlbHNlCi11c2luZyA6OnNldGptcDsKLSMgICAgICAgIGVuZGlmCi0jICAgICAgZW5kaWYKLSMgICAgZW5kaWYKLSMgICAgaWYgIWRlZmluZWQgKF9TVExQX05BVElWRV9TRVRKTVBfSF9JTkNMVURFRCkKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpsb25nam1wOwotIyAgICBlbHNlCi11c2luZyA6OmxvbmdqbXA7Ci0jICAgIGVuZGlmCi0jICBlbmRpZgotX1NUTFBfRU5EX05BTUVTUEFDRQotI2VuZGlmIC8qIF9TVExQX0lNUE9SVF9WRU5ET1JfQ1NURCAqLwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3N0bC9fY3NpZ25hbC5oIGIvc3RsL19jc2lnbmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxOWU5YzQuLjAwMDAwMDAKLS0tIGEvc3RsL19jc2lnbmFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DU0lHTkFMCi0jZGVmaW5lIF9TVExQX0lOVEVSTkFMX0NTSUdOQUwKLQotI2lmICFkZWZpbmVkIChfU1RMUF9XQ0UpCi0jICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfTkVXX0NfSEVBREVSUykKLSMgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSEVBREVSKGNzaWduYWwpCi0jICBlbHNlCi0jICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NfSEVBREVSKHNpZ25hbC5oKQotIyAgZW5kaWYKLQotIyAgaWYgZGVmaW5lZCAoX1NUTFBfSU1QT1JUX1ZFTkRPUl9DU1REKQotX1NUTFBfQkVHSU5fTkFNRVNQQUNFCi0jICAgIGlmICFkZWZpbmVkIChfU1RMUF9OT19DU1REX0ZVTkNUSU9OX0lNUE9SVFMpCi11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6c2lnbmFsOwotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnJhaXNlOwotIyAgICBlbmRpZiAvKiBfU1RMUF9OT19DU1REX0ZVTkNUSU9OX0lNUE9SVFMgKi8KLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpzaWdfYXRvbWljX3Q7Ci1fU1RMUF9FTkRfTkFNRVNQQUNFCi0jICBlbmRpZiAvKiBfU1RMUF9JTVBPUlRfVkVORE9SX0NTVEQgKi8KLSNlbmRpZgotCi0jZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfQ1NJR05BTCAqLwpkaWZmIC0tZ2l0IGEvc3RsL19jc3RkYXJnLmggYi9zdGwvX2NzdGRhcmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU1MWU2Mi4uMDAwMDAwMAotLS0gYS9zdGwvX2NzdGRhcmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICovCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1NUREFSRwotI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9DU1REQVJHCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfTkVXX0NfSEVBREVSUykKLSMgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUihjc3RkYXJnKQotI2Vsc2UKLSMgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NfSEVBREVSKHN0ZGFyZy5oKQotI2VuZGlmCi0KLSNpZmRlZiBfU1RMUF9JTVBPUlRfVkVORE9SX0NTVEQKLV9TVExQX0JFR0lOX05BTUVTUEFDRQotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnZhX2xpc3Q7Ci1fU1RMUF9FTkRfTkFNRVNQQUNFCi0jZW5kaWYgLyogX1NUTFBfSU1QT1JUX1ZFTkRPUl9DU1REICovCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3RsL19jc3RkZGVmLmggYi9zdGwvX2NzdGRkZWYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFjMWUyZC4uMDAwMDAwMAotLS0gYS9zdGwvX2NzdGRkZWYuaAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NTVERERUYKLSNkZWZpbmUgX1NUTFBfSU5URVJOQUxfQ1NURERFRgotCi0jICBpZiAoX19HTlVDX18gPj0gMykgJiYgZGVmaW5lZCAoX19DWUdXSU5fXykgLy8gdGhpcyB0b3RhbCBIQUNLIGlzIHRoZSBvbmx5IGV4cGVkaWVudCB3YXkgSSBjb3VsZCBjeWd3aW4gdG8gd29yayB3aXRoIEdDQyAzLjAKLSMgICAgZGVmaW5lIF9fbmVlZF93aW50X3QgLy8gbW9zdGx5IGJlY2F1c2Ugd2ludF90IGRpZG4ndCBzZWVtIHRvIGdldCBkZWZpbmVkIG90aGVyd2lzZSA6KAotIyAgICBkZWZpbmUgX19uZWVkX3djaGFyX3QKLSMgICAgZGVmaW5lIF9fbmVlZF9zaXplX3QKLSMgICAgZGVmaW5lIF9fbmVlZF9wdHJkaWZmX3QKLSMgICAgZGVmaW5lIF9fbmVlZF9OVUxMCi0jICBlbmRpZgotCi0jICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfTkVXX0NfSEVBREVSUykKLSMgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSEVBREVSKGNzdGRkZWYpCi0jICBlbHNlCi0jICAgIGluY2x1ZGUgPHN0ZGRlZi5oPgotIyAgZW5kaWYKLQotIyAgaWZkZWYgX1NUTFBfSU1QT1JUX1ZFTkRPUl9DU1RECi1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpwdHJkaWZmX3Q7Ci11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6c2l6ZV90OwotX1NUTFBfRU5EX05BTUVTUEFDRQotIyAgZW5kaWYgLyogX1NUTFBfSU1QT1JUX1ZFTkRPUl9DU1REICovCi0KLSNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9DU1REREVGICovCmRpZmYgLS1naXQgYS9zdGwvX2NzdGRpby5oIGIvc3RsL19jc3RkaW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRhZmIzNS4uMDAwMDAwMAotLS0gYS9zdGwvX2NzdGRpby5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NTVERJTwotI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9DU1RESU8KLQotI2lmIGRlZmluZWQgKF9fTHlueF9fKQotIyAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ19IRUFERVIoc3RkYXJnLmgpCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9TVExQX1VTRV9ORVdfQ19IRUFERVJTKQotIyAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSEVBREVSKGNzdGRpbykKLSNlbHNlCi0jICBpbmNsdWRlIF9TVExQX05BVElWRV9DX0hFQURFUihzdGRpby5oKQotI2VuZGlmCi0KLSNpZiAoZGVmaW5lZCAoX19NV0VSS1NfXykgJiYgIWRlZmluZWQgKE5fUExBVF9OTE0pKSAgfHwgZGVmaW5lZCAoX19CT1JMQU5EQ19fKQotIyAgdW5kZWYgc3RkaW4KLSMgIHVuZGVmIHN0ZG91dAotIyAgdW5kZWYgc3RkZXJyCi0jICBpZiBkZWZpbmVkIChfX01XRVJLU19fKQotIyAgZGVmaW5lIHN0ZGluICAgKCZfU1RMUF9WRU5ET1JfQ1NURDo6X19maWxlc1swXSkKLSMgIGRlZmluZSBzdGRvdXQgICgmX1NUTFBfVkVORE9SX0NTVEQ6Ol9fZmlsZXNbMV0pCi0jICBkZWZpbmUgc3RkZXJyICAoJl9TVExQX1ZFTkRPUl9DU1REOjpfX2ZpbGVzWzJdKQotIyAgZWxpZiBkZWZpbmVkIChfX0JPUkxBTkRDX18pCi0jICAgIGRlZmluZSBzdGRpbiAgICgmX1NUTFBfVkVORE9SX0NTVEQ6Ol9zdHJlYW1zWzBdKQotIyAgICBkZWZpbmUgc3Rkb3V0ICAoJl9TVExQX1ZFTkRPUl9DU1REOjpfc3RyZWFtc1sxXSkKLSMgICAgZGVmaW5lIHN0ZGVyciAgKCZfU1RMUF9WRU5ET1JfQ1NURDo6X3N0cmVhbXNbMl0pCi0jICBlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9NU1ZDX0xJQikgJiYgKF9TVExQX01TVkNfTElCIDwgMTQwMCkgfHwgZGVmaW5lZCAoX1NUTFBfVVNJTkdfUExBVEZPUk1fU0RLX0NPTVBJTEVSKQotaW5saW5lIGludCB2c25wcmludGYoY2hhciAqczEsIHNpemVfdCBuLCBjb25zdCBjaGFyICpzMiwgdmFfbGlzdCB2KQoteyByZXR1cm4gX1NUTFBfVkVORE9SX0NTVEQ6Ol92c25wcmludGYoczEsIG4sIHMyLCB2KTsgfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9JTVBPUlRfVkVORE9SX0NTVEQgKQotX1NUTFBfQkVHSU5fTkFNRVNQQUNFCi11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6RklMRTsKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpmcG9zX3Q7Ci11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6c2l6ZV90OwotCi0vLyB1bmRlZiBvYnNvbGV0ZSBtYWNyb3MKLSMgIHVuZGVmIHB1dGMKLSMgIHVuZGVmIGdldGMKLSMgIHVuZGVmIGdldGNoYXIKLSMgIHVuZGVmIHB1dGNoYXIKLSMgIHVuZGVmIGZlb2YKLSMgIHVuZGVmIGZlcnJvcgotCi0jICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fQ1NURF9GVU5DVElPTl9JTVBPUlRTKQotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmNsZWFyZXJyOwotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmZjbG9zZTsKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpmZW9mOwotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmZlcnJvcjsKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpmZmx1c2g7Ci11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6ZmdldGM7Ci11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6ZmdldHBvczsKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpmZ2V0czsKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpmb3BlbjsKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpmcHJpbnRmOwotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmZwdXRjOwotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmZwdXRzOwotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmZyZWFkOwotIyAgICBpZiAhZGVmaW5lZCAoX1dJTjMyX1dDRSkgfHwgKF9XSU4zMl9XQ0UgPCAweDUwMCkgLy8gQ0U1IHN0b3BwZWQgc3VwcGx5aW5nIHRoaXMKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpmcmVvcGVuOwotIyAgICBlbmRpZgotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmZzY2FuZjsKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpmc2VlazsKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpmc2V0cG9zOwotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmZ0ZWxsOwotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmZ3cml0ZTsKLQotIyAgICBpZiAgIShkZWZpbmVkIChfX0lCTUNQUF9fKSAmJiAoX19JQk1DUFBfXyA+PSA1MDApKQotIyAgICAgIGlmICFkZWZpbmVkIChfV0lOMzJfV0NFKSB8fCAoX1dJTjMyX1dDRSA8IDB4NTAwKSAvLyBDRTUgc3RvcHBlZCBzdXBwbHlpbmcgdGhpcyBleGNlcHQgYXMgbWFjcm9zLiBUT0RPOiB1c2UgaW5saW5lIGZ1bmN0aW9uIHRvIHJlZGlyZWN0IHRvIHRoZSBtYWNyb3M/Ci0gdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmdldGM7Ci0gdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnB1dGM7Ci0jICAgICAgZW5kaWYKLSB1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6Z2V0Y2hhcjsKLSB1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6cHV0Y2hhcjsKLSMgICAgZW5kaWYKLQotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmdldHM7Ci0jICAgIGlmICFkZWZpbmVkIChfV0lOMzJfV0NFKSB8fCAoX1dJTjMyX1dDRSA8IDB4NTAwKSAvLyBDRTUgc3RvcHBlZCBzdXBwbHlpbmcgdGhpcwotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnBlcnJvcjsKLSMgICAgZW5kaWYKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpwcmludGY7Ci11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6cHV0czsKLSMgICAgaWYgIWRlZmluZWQgKF9XSU4zMl9XQ0UpIHx8IChfV0lOMzJfV0NFIDwgMHg1MDApIC8vIENFNSBzdG9wcGVkIHN1cHBseWluZyB0aGlzCi11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6cmVtb3ZlOwotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnJlbmFtZTsKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpyZXdpbmQ7Ci11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6c2V0YnVmOwotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnRtcGZpbGU7Ci11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6dG1wbmFtOwotIyAgICBlbmRpZgotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnNjYW5mOwotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnNldHZidWY7Ci11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6c3ByaW50ZjsKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpzc2NhbmY7Ci11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6dW5nZXRjOwotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnZmcHJpbnRmOwotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnZwcmludGY7Ci11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6dnNwcmludGY7Ci0jICAgIGlmICgoZGVmaW5lZCAoX19NV0VSS1NfXykgJiYgIWRlZmluZWQgKE5fUExBVF9OTE0pKSB8fCAoZGVmaW5lZCAoX1NUTFBfTVNWQ19MSUIpICYmIChfU1RMUF9NU1ZDX0xJQiA8IDE0MDApKSB8fCBcCi0gICAgICAgIChkZWZpbmVkIChfX0JPUkxBTkRDX18pKSkKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjp2c25wcmludGY7Ci0jICAgIGVuZGlmCi0jICBlbmRpZiAvKiBfU1RMUF9OT19DU1REX0ZVTkNUSU9OX0lNUE9SVFMgKi8KLV9TVExQX0VORF9OQU1FU1BBQ0UKLSNlbmRpZiAvKiBfU1RMUF9JTVBPUlRfVkVORE9SX0NTVEQgKi8KLQotI2VuZGlmIC8qIF9TVExQX0lOVEVSTkFMX0NTVERJTyAqLwpkaWZmIC0tZ2l0IGEvc3RsL19jc3RkbGliLmggYi9zdGwvX2NzdGRsaWIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM1NDM3ZC4uMDAwMDAwMAotLS0gYS9zdGwvX2NzdGRsaWIuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DU1RETElCCi0jZGVmaW5lIF9TVExQX0lOVEVSTkFMX0NTVERMSUIKLQotI2lmIGRlZmluZWQgKF9TVExQX1VTRV9ORVdfQ19IRUFERVJTKQotIyAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSEVBREVSKGNzdGRsaWIpCi0jZWxzZQotIyAgaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9fQk9STEFORENfXykKLS8qIEJvcmxhbmQgcHJvY2Vzcy5oIGhlYWRlciBkbyBub3QgYnJpbmcgYW55dGhpbmcgaGVyZSBhbmQgaXMganVzdCBpbmNsdWRlZAotICogaW4gb3JkZXIgdG8gYXZvaWQgaW5jbHVzaW9uIGxhdGVyLiBUaGlzIGhlYWRlciBjYW5ub3QgYmUgaW5jbHVkZWQgbGF0ZXIKLSAqIGJlY2F1c2UgQm9ybGFuZCBjb21waWxlciBjb25zaWRlciB0aGF0IGZvciBpbnN0YW5jZSB0aGUgYWJvcnQgZnVuY3Rpb24KLSAqIGRlZmluZWQgYXMgZXh0ZXJuICJDIiBjYW5ub3QgYmUgb3ZlcmxvYWRlZCBhbmQgaXQgZmluZHMgMiAib3ZlcmxvYWRzIiwKLSAqIG9uY2UgaW4gbmF0aXZlIHN0ZCBuYW1lc3BhY2UgYW5kIHRoZSBvdGhlciBpbiBTVExwb3J0IG5hbWVzcGFjZS4uLgotICovCi0jICBpbmNsdWRlIDxwcm9jZXNzLmg+Ci0jZW5kaWYKLQotLyogb24gZXZjMy9ldmM0IGluY2x1ZGluZyBzdGRsaWIuaCBhbHNvIGRlZmluZXMgc2V0am1wIG1hY3JvICovCi0jaWYgZGVmaW5lZCAoX1NUTFBfV0NFKQotIyAgZGVmaW5lIF9TVExQX05BVElWRV9TRVRKTVBfSF9JTkNMVURFRAotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfX01TTF9fKSAmJiAoX19NU0xfXyA8PSAweDUwMDMpCi1uYW1lc3BhY2Ugc3RkIHsKLSAgdHlwZWRlZiA6OmRpdl90IGRpdl90OwotICB0eXBlZGVmIDo6bGRpdl90IGxkaXZfdDsKLSMgIGlmZGVmIF9fTVNMX0xPTkdMT05HX1NVUFBPUlRfXwotICB0eXBlZGVmIDo6bGxkaXZfdCBsbGRpdl90OwotIyAgZW5kaWYKLX0KLSNlbmRpZgotCi0jaWZkZWYgX1NUTFBfSU1QT1JUX1ZFTkRPUl9DU1RECi1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLSMgIGlmICFkZWZpbmVkIChBTkRST0lEKQotLy8gdGhlc2UgdHlwZXMgZG9uJ3QgZXhpc3Qgb24gQW5kcm9pZAotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmRpdl90OwotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmxkaXZfdDsKLSMgIGVuZGlmCi11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6c2l6ZV90OwotCi0jICBpZm5kZWYgX1NUTFBfTk9fQ1NURF9GVU5DVElPTl9JTVBPUlRTCi0jICAgIGlmbmRlZiBfU1RMUF9XQ0UKLS8vIHRoZXNlIGZ1bmN0aW9ucyBqdXN0IGRvbid0IGV4aXN0IG9uIFdpbmRvd3MgQ0UKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjphYm9ydDsKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpnZXRlbnY7Ci0jICAgICAgaWYgIWRlZmluZWQgKEFORFJPSUQpCi0vLyB0aGVzZSBmdW5jdGlvbnMgZG9uJ3QgZXhpc3Qgb24gQW5kcm9pZAotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6Om1ibGVuOwotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6Om1idG93YzsKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpzeXN0ZW07Ci11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6YnNlYXJjaDsKLSMgICAgICBlbmRpZgotIyAgICBlbmRpZgotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmF0ZXhpdDsKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpleGl0OwotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmNhbGxvYzsKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpmcmVlOwotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6Om1hbGxvYzsKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpyZWFsbG9jOwotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmF0b2Y7Ci11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6YXRvaTsKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjphdG9sOwotIyAgICBpZiAhZGVmaW5lZCAoQU5EUk9JRCkKLS8vIHRoaXMgZnVuY3Rpb24gZG9lc24ndCBleGlzdCBvbiBBbmRyb2lkCi11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6bWJzdG93Y3M7Ci0jICAgIGVuZGlmCi11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6c3RydG9kOwotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnN0cnRvbDsKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpzdHJ0b3VsOwotCi0jICAgIGlmICEoZGVmaW5lZCAoX1NUTFBfTk9fTkFUSVZFX1dJREVfU1RSRUFNUykgfHwgZGVmaW5lZCAoX1NUTFBfTk9fTUJTVEFURV9UKSkKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjp3Y3N0b21iczsKLSMgICAgICBpZm5kZWYgX1NUTFBfV0NFCi11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6d2N0b21iOwotIyAgICAgIGVuZGlmCi0jICAgIGVuZGlmCi11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6cXNvcnQ7Ci11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6bGFiczsKLSMgICAgaWYgIWRlZmluZWQgKEFORFJPSUQpCi0vLyB0aGlzIGZ1bmN0aW9uIGRvZXNuJ3QgZXhpc3Qgb24gQW5kcm9pZAotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmxkaXY7Ci0jICAgIGVuZGlmCi0jICAgIGlmIGRlZmluZWQgKF9TVExQX0xPTkdfTE9ORykgJiYgIWRlZmluZWQgKF9TVExQX05PX1ZFTkRPUl9TVERMSUJfTCkKLSMgICAgICBpZiAhZGVmaW5lZChfX3N1bikKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpsbGFiczsKLSMgICAgICAgIGlmICFkZWZpbmVkIChBTkRST0lEKQotLy8gdGhlc2UgdHlwZXMgZG9uJ3QgZXhpc3Qgb24gQW5kcm9pZAotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmxsZGl2X3Q7Ci11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6bGxkaXY7Ci0jICAgICAgICBlbmRpZgotIyAgICAgIGVsc2UKLXVzaW5nIDo6bGxhYnM7Ci11c2luZyA6OmxsZGl2X3Q7Ci11c2luZyA6OmxsZGl2OwotIyAgICAgIGVuZGlmCi0jICAgIGVuZGlmCi11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6cmFuZDsKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpzcmFuZDsKLSMgIGVuZGlmIC8qIF9TVExQX05PX0NTVERfRlVOQ1RJT05fSU1QT1JUUyAqLwotX1NUTFBfRU5EX05BTUVTUEFDRQotI2VuZGlmIC8qIF9TVExQX0lNUE9SVF9WRU5ET1JfQ1NURCAqLwotCi0jaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKSAmJiBkZWZpbmVkIChfU1RMUF9VU0VfTkVXX0NfSEVBREVSUykKLS8vSW4gdGhpcyBjb25maWcgYmNjIGRlZmluZSBldmVyeXRoaW5nIGluIHN0ZCBuYW1lc3BhY2UgYW5kIG5vdCBpbgotLy90aGUgZ2xvYmFsIG9uZS4KLWlubGluZSBpbnQgYWJzKGludCBfX3gpIHsgcmV0dXJuIF9TVExQX1ZFTkRPUl9DU1REOjphYnMoX194KTsgfQotaW5saW5lIF9TVExQX1ZFTkRPUl9DU1REOjpkaXZfdCBkaXYoaW50IF9feCwgaW50IF9feSkgeyByZXR1cm4gX1NUTFBfVkVORE9SX0NTVEQ6OmRpdihfX3gsIF9feSk7IH0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfTVNDX0VYVEVOU0lPTlMpICYmIGRlZmluZWQoX1NUTFBfTVNWQykgJiYgKF9TVExQX01TVkMgPD0gMTMwMCkKLSMgIGRlZmluZSBfU1RMUF9SRVNUT1JFX0ZVTkNUSU9OX0lOVFJJTlNJQwotIyAgcHJhZ21hIHdhcm5pbmcgKHB1c2gpCi0jICBwcmFnbWEgd2FybmluZyAoZGlzYWJsZTogNDE2MikKLSMgIHByYWdtYSBmdW5jdGlvbiAoYWJzKQotI2VuZGlmCi0KLS8vSFAtVVggbmF0aXZlIGxpYiBoYXMgYWJzKCkgYW5kIGRpdigpIGZ1bmN0aW9ucyBpbiBnbG9iYWwgbmFtZXNwYWNlCi0jaWYgIWRlZmluZWQgKF9fSFBfYUNDKSB8fCAoX19IUF9hQ0MgPCAzMDAwMCkKLQotLy9NU1ZDIHN0YXJ0aW5nIHdpdGggLk5ldCAyMDAzIGFscmVhZHkgZGVmaW5lIGFsbCBtYXRoIGZ1bmN0aW9ucyBpbiBnbG9iYWwgbmFtZXNwYWNlOgotIyAgaWYgIWRlZmluZWQgKF9TVExQX01TVkNfTElCKSB8fCAoX1NUTFBfTVNWQ19MSUIgPCAxMzEwKSB8fCBkZWZpbmVkKFVOREVSX0NFKQotaW5saW5lIGxvbmcgYWJzKGxvbmcgX194KSB7IHJldHVybiBfU1RMUF9WRU5ET1JfQ1NURDo6bGFicyhfX3gpOyB9Ci0jICBlbmRpZgotCi0vKiogVkMgc2luY2UgdmVyc2lvbiA4IGhhcyB0aGlzLCB0aGUgcGxhdGZvcm0gU0RLIGFuZCBDRSBTREtzIGhhbmdpbmcgYmVoaW5kLgotICogIEFuZHJvaWQgZG9lc24ndCBoYXZlIGxkaXZfdC4gKi8KLSMgIGlmICghZGVmaW5lZCAoX1NUTFBfTVNWQ19MSUIpIHx8IChfU1RMUF9NU1ZDX0xJQiA8IDE0MDApIHx8IGRlZmluZWQgKF9TVExQX1VTSU5HX1BMQVRGT1JNX1NES19DT01QSUxFUikgfHwgZGVmaW5lZChVTkRFUl9DRSkpICYmICFkZWZpbmVkIChBTkRST0lEKQotaW5saW5lIF9TVExQX1ZFTkRPUl9DU1REOjpsZGl2X3QgZGl2KGxvbmcgX194LCBsb25nIF9feSkgeyByZXR1cm4gX1NUTFBfVkVORE9SX0NTVEQ6OmxkaXYoX194LCBfX3kpOyB9Ci0jICBlbmRpZgotCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9TVExQX1JFU1RPUkVfRlVOQ1RJT05fSU5UUklOU0lDKQotIyAgcHJhZ21hIGludHJpbnNpYyAoYWJzKQotIyAgcHJhZ21hIHdhcm5pbmcgKHBvcCkKLSMgIHVuZGVmIF9TVExQX1JFU1RPUkVfRlVOQ1RJT05fSU5UUklOU0lDCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9TVExQX0xPTkdfTE9ORykKLSMgIGlmICFkZWZpbmVkIChfU1RMUF9OT19WRU5ET1JfU1RETElCX0wpCi0jICAgIGlmICFkZWZpbmVkIChfX3N1bikKLWlubGluZSBfU1RMUF9MT05HX0xPTkcgIGFicyhfU1RMUF9MT05HX0xPTkcgX194KSB7IHJldHVybiBfU1RMUF9WRU5ET1JfQ1NURDo6bGxhYnMoX194KTsgfQotIyAgICAgIGlmICFkZWZpbmVkIChBTkRST0lEKQotLy8gQW5kcm9pZCBkb2Vzbid0IGhhdmUgbGxkaXZfdC4KLWlubGluZSBsbGRpdl90IGRpdihfU1RMUF9MT05HX0xPTkcgX194LCBfU1RMUF9MT05HX0xPTkcgX195KSB7IHJldHVybiBfU1RMUF9WRU5ET1JfQ1NURDo6bGxkaXYoX194LCBfX3kpOyB9Ci0jICAgICAgZW5kaWYKLSMgICAgZWxzZQotaW5saW5lIF9TVExQX0xPTkdfTE9ORyAgYWJzKF9TVExQX0xPTkdfTE9ORyBfX3gpIHsgcmV0dXJuIDo6bGxhYnMoX194KTsgfQotaW5saW5lIGxsZGl2X3QgZGl2KF9TVExQX0xPTkdfTE9ORyBfX3gsIF9TVExQX0xPTkdfTE9ORyBfX3kpIHsgcmV0dXJuIDo6bGxkaXYoX194LCBfX3kpOyB9Ci0jICAgIGVuZGlmCi0jICBlbHNlCi1pbmxpbmUgX1NUTFBfTE9OR19MT05HICBhYnMoX1NUTFBfTE9OR19MT05HIF9feCkgeyByZXR1cm4gX194IDwgMCA/IC1fX3ggOiBfX3g7IH0KLSMgIGVuZGlmCi0jZW5kaWYKLQotLyogQysrIFN0YW5kYXJkIGlzIHVuY2xlYXIgYWJvdXQgc2V2ZXJhbCBjYWxsIHRvICd1c2luZyA6OmZ1bmMnIGlmIG5ldyBvdmVybG9hZHMKLSAqIG9mIDo6ZnVuYyBhcHBlYXJzIGJldHdlZW4gMiBzdWNjZXNzaXZlICd1c2luZycgY2FsbHMuIFRvIGF2b2lkIHRoaXMgcG90ZW50aWFsCi0gKiBwcm9ibGVtIHdlIHByb3ZpZGUgYWxsIGFicyBvdmVybG9hZCBiZWZvcmUgdGhlICd1c2luZycgY2FsbC4KLSAqIEJld2FyZTogVGhpcyBoZWFkZXIgaW5jbHVzaW9uIGhhcyB0byBiZSBhZnRlciBhbGwgYWJzIG92ZXJsb2FkIG9mIHRoaXMgZmlsZS4KLSAqICAgICAgICAgVGhlIGZpcnN0ICd1c2luZyA6OmFicycgY2FsbCBpcyBnb2luZyB0byBiZSBpbiB0aGUgb3RoZXIgaGVhZGVyLgotICovCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NNQVRICi0jICBpbmNsdWRlIDxzdGwvX2NtYXRoLmg+Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9TVExQX0lNUE9SVF9WRU5ET1JfQ1NURCkgJiYgIWRlZmluZWQgKF9TVExQX05PX0NTVERfRlVOQ1RJT05fSU1QT1JUUykKLS8vIGFkIGhvYywgZG9uJ3QgcmVwbGFjZSB3aXRoIF9TVExQX1ZFTkRPUl9DU1REOjphYnMgaGVyZSEgLSBwdHIgMjAwNS0wMy0wNQotX1NUTFBfQkVHSU5fTkFNRVNQQUNFCi11c2luZyA6OmFiczsKLSMgIGlmICFkZWZpbmVkIChBTkRST0lEKQotLy8gQW5kcm9pZCBkb2Vzbid0IGhhdmUgZGl2X3Qgb3IgbGRpdl90LgotIyAgICBpZiAhZGVmaW5lZCAoTl9QTEFUX05MTSkKLXVzaW5nIDo6ZGl2OwotIyAgICBlbHNlCi0vLyBEb24ndCB1c2UgZGl2IGZyb20gY2xpYiBvciBsaWJjIG9uIE5ldFdhcmUtLS1idWdneSEgLSBwdHIgMjAwNS0wNi0wNgotaW5saW5lIGRpdl90IGRpdihpbnQgX194LCBpbnQgX195KSB7IGRpdl90IGQ7IGQucXVvdCA9IF9feCAvIF9feTsgZC5yZW0gPSBfX3ggJSBfX3k7IHJldHVybiBkOyB9Ci1pbmxpbmUgbGRpdl90IGRpdihsb25nIF9feCwgbG9uZyBfX3kpIHsgbGRpdl90IGQ7IGQucXVvdCA9IF9feCAvIF9feTsgZC5yZW0gPSBfX3ggJSBfX3k7IHJldHVybiBkOyB9Ci0jICAgIGVuZGlmCi0jICBlbmRpZgotX1NUTFBfRU5EX05BTUVTUEFDRQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9DU1RETElCICovCmRpZmYgLS1naXQgYS9zdGwvX2NzdHJpbmcuaCBiL3N0bC9fY3N0cmluZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjM5YTdhLi4wMDAwMDAwCi0tLSBhL3N0bC9fY3N0cmluZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogQm9yaXMgRm9taXRjaGV2Ci0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICovCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1NUUklORwotI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9DU1RSSU5HCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfTkVXX0NfSEVBREVSUykKLSMgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUihjc3RyaW5nKQotI2Vsc2UKLSMgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NfSEVBREVSKHN0cmluZy5oKQotI2VuZGlmCi0KLSNpZmRlZiBfU1RMUF9JTVBPUlRfVkVORE9SX0NTVEQKLV9TVExQX0JFR0lOX05BTUVTUEFDRQotIyAgaW5jbHVkZSA8dXNpbmcvY3N0cmluZz4KLV9TVExQX0VORF9OQU1FU1BBQ0UKLSNlbmRpZiAvKiBfU1RMUF9JTVBPUlRfVkVORE9SX0NTVEQgKi8KLQotI2VuZGlmIC8qIF9TVExQX0lOVEVSTkFMX0NTVFJJTkcgKi8KZGlmZiAtLWdpdCBhL3N0bC9fY3RpbWUuaCBiL3N0bC9fY3RpbWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk5NWQ0Mi4uMDAwMDAwMAotLS0gYS9zdGwvX2N0aW1lLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DVElNRQotI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9DVElNRQotCi0jaWYgIWRlZmluZWQgKF9TVExQX1dDRV9FVkMzKQotCi0jICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfTkVXX0NfSEVBREVSUykKLSMgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSEVBREVSKGN0aW1lKQotIyAgZWxzZQotIyAgICBpbmNsdWRlIF9TVExQX05BVElWRV9DX0hFQURFUih0aW1lLmgpCi0jICBlbmRpZgotCi0jICBpZiBkZWZpbmVkIChfU1RMUF9JTVBPUlRfVkVORE9SX0NTVEQpCi1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpzaXplX3Q7Ci11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6Y2xvY2tfdDsKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjp0aW1lX3Q7Ci11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6dG07Ci0jICAgIGlmICFkZWZpbmVkIChfU1RMUF9OT19DU1REX0ZVTkNUSU9OX0lNUE9SVFMpCi11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6Y2xvY2s7Ci11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6YXNjdGltZTsKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpjdGltZTsKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpnbXRpbWU7Ci0KLSMgICAgICBpZiAhZGVmaW5lZCAoX1dJTjMyX1dDRSkgfHwgKF9XSU4zMl9XQ0UgPCAweDUwMCkgLy8gQ0U1IHN0b3BwZWQgc3VwcGx5aW5nIHRoaXMKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpkaWZmdGltZTsKLSMgICAgICBlbmRpZgotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6Om1rdGltZTsKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpsb2NhbHRpbWU7Ci11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6c3RyZnRpbWU7Ci11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6dGltZTsKLSMgICAgZW5kaWYgLyogX1NUTFBfTk9fQ1NURF9GVU5DVElPTl9JTVBPUlRTICovCi1fU1RMUF9FTkRfTkFNRVNQQUNFCi0jICBlbmRpZiAvKiBfU1RMUF9JTVBPUlRfVkVORE9SX0NTVEQgKi8KLQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9DVElNRSAqLwpkaWZmIC0tZ2l0IGEvc3RsL19jdHlwZS5oIGIvc3RsL19jdHlwZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTEwZjQ1Li4wMDAwMDAwCi0tLSBhL3N0bC9fY3R5cGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotLy8gV0FSTklORzogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgQysrCi0vLyBzdGFuZGFyZCBsaWJyYXJ5IGhlYWRlcnMuICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSB0aGlzIGhlYWRlcgotLy8gZmlsZSBkaXJlY3RseS4KLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DVFlQRV9ICi0jZGVmaW5lIF9TVExQX0lOVEVSTkFMX0NUWVBFX0gKLQotI2lmbmRlZiBfU1RMUF9DX0xPQ0FMRV9ICi0jICBpbmNsdWRlIDxzdGwvY19sb2NhbGUuaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0xPQ0FMRV9ICi0jICBpbmNsdWRlIDxzdGwvX2xvY2FsZS5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQUxHT0JBU0VfSAotIyAgaW5jbHVkZSA8c3RsL19hbGdvYmFzZS5oPgotI2VuZGlmCi0KLV9TVExQX0JFR0lOX05BTUVTUEFDRQotCi1jbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBjdHlwZV9iYXNlIHsKLXB1YmxpYzoKLSAgZW51bSBtYXNrIHsKLSAgICBzcGFjZSAgID0gX0xvY2FsZV9TUEFDRSwKLSAgICBwcmludCAgID0gX0xvY2FsZV9QUklOVCwKLSAgICBjbnRybCAgID0gX0xvY2FsZV9DTlRSTCwKLSAgICB1cHBlciAgID0gX0xvY2FsZV9VUFBFUiwKLSAgICBsb3dlciAgID0gX0xvY2FsZV9MT1dFUiwKLSAgICBhbHBoYSAgID0gX0xvY2FsZV9BTFBIQSwKLSAgICBkaWdpdCAgID0gX0xvY2FsZV9ESUdJVCwKLSAgICBwdW5jdCAgID0gX0xvY2FsZV9QVU5DVCwKLSAgICB4ZGlnaXQgID0gX0xvY2FsZV9YRElHSVQsCi0gICAgYWxudW0gICA9IGFscGhhIHwgZGlnaXQsCi0gICAgZ3JhcGggICA9IGFsbnVtIHwgcHVuY3QKLSAgfTsKLX07Ci0KLS8vIGN0eXBlPD4gdGVtcGxhdGUKLQotdGVtcGxhdGUgPGNsYXNzIGNoYXJUPiBjbGFzcyBjdHlwZSB7fTsKLXRlbXBsYXRlIDxjbGFzcyBjaGFyVD4gY2xhc3MgY3R5cGVfYnluYW1lIHt9OwotCi0vL2N0eXBlIHNwZWNpYWxpemF0aW9ucwotCi1fU1RMUF9URU1QTEFURV9OVUxMCi1jbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBjdHlwZTxjaGFyPiA6IHB1YmxpYyBsb2NhbGU6OmZhY2V0LCBwdWJsaWMgY3R5cGVfYmFzZSB7Ci0jaWZuZGVmIF9TVExQX05PX1dDSEFSX1QKLSMgIGlmZGVmIF9TVExQX01TVkMKLSAgICB0eXBlZGVmIGN0eXBlPHdjaGFyX3Q+IF9XY3R5cGU7Ci0gICAgZnJpZW5kIF9XY3R5cGU7Ci0jICBlbHNlCi0gICAgZnJpZW5kIGNsYXNzIGN0eXBlPHdjaGFyX3Q+OwotIyAgZW5kaWYKLSNlbmRpZgotICBmcmllbmQgY2xhc3MgX0xvY2FsZV9pbXBsOwotcHVibGljOgotCi0gIHR5cGVkZWYgY2hhciBjaGFyX3R5cGU7Ci0KLSAgZXhwbGljaXQgY3R5cGUoY29uc3QgbWFzayogX190YWIgPSAwLCBib29sIF9fZGVsID0gZmFsc2UsIHNpemVfdCBfX3JlZnMgPSAwKTsKLSAgYm9vbCBpcyhtYXNrIF9fbSwgY2hhciBfX2MpIGNvbnN0Ci0gIHsgcmV0dXJuICgoKihfTV9jdHlwZV90YWJsZSsodW5zaWduZWQgY2hhcilfX2MpKSAmIF9fbSkgIT0gMDsgfQotCi0gIGNvbnN0IGNoYXIqIGlzKGNvbnN0IGNoYXIqIF9fbG93LCBjb25zdCBjaGFyKiBfX2hpZ2gsIG1hc2sqIF9fdmVjKSBjb25zdCB7Ci0gICAgZm9yIChjb25zdCBjaGFyKiBfX3AgPSBfX2xvdztfX3AgIT0gX19oaWdoOyArK19fcCwgKytfX3ZlYykgewotICAgICAgKl9fdmVjID0gX01fY3R5cGVfdGFibGVbKHVuc2lnbmVkIGNoYXIpKl9fcF07Ci0gICAgfQotICAgIHJldHVybiBfX2hpZ2g7Ci0gIH0KLQotICBjb25zdCBjaGFyKiBzY2FuX2lzKG1hc2sgX19tLCBjb25zdCBjaGFyKiBfX2xvdywgY29uc3QgY2hhciogX19oaWdoKSBjb25zdDsKLSAgY29uc3QgY2hhciogc2Nhbl9ub3QobWFzayBfX20sIGNvbnN0IGNoYXIqIF9fbG93LCBjb25zdCBjaGFyKiBfX2hpZ2gpIGNvbnN0OwotCi0gIGNoYXIgICAgICAgICh0b3VwcGVyKShjaGFyIF9fYykgY29uc3QgeyByZXR1cm4gZG9fdG91cHBlcihfX2MpOyB9Ci0gIGNvbnN0IGNoYXIqICh0b3VwcGVyKShjaGFyKiBfX2xvdywgY29uc3QgY2hhciogX19oaWdoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGRvX3RvdXBwZXIoX19sb3csIF9faGlnaCk7Ci0gIH0KLQotICBjaGFyICAgICAgICAodG9sb3dlcikoY2hhciBfX2MpIGNvbnN0IHsgcmV0dXJuIGRvX3RvbG93ZXIoX19jKTsgfQotICBjb25zdCBjaGFyKiAodG9sb3dlcikoY2hhciogX19sb3csIGNvbnN0IGNoYXIqIF9faGlnaCkgY29uc3QgewotICAgIHJldHVybiBkb190b2xvd2VyKF9fbG93LCBfX2hpZ2gpOwotICB9Ci0KLSAgY2hhciAgICAgICAgd2lkZW4oY2hhciBfX2MpIGNvbnN0IHsgcmV0dXJuIGRvX3dpZGVuKF9fYyk7IH0KLSAgY29uc3QgY2hhciogd2lkZW4oY29uc3QgY2hhciogX19sb3csIGNvbnN0IGNoYXIqIF9faGlnaCwgY2hhciogX190bykgY29uc3QgewotICAgIHJldHVybiBkb193aWRlbihfX2xvdywgX19oaWdoLCBfX3RvKTsKLSAgfQotCi0gIGNoYXIgICAgICAgIG5hcnJvdyhjaGFyIF9fYywgY2hhciBfX2RmYXVsdCkgY29uc3QgewotICAgIHJldHVybiBkb19uYXJyb3coX19jLCBfX2RmYXVsdCk7Ci0gIH0KLSAgY29uc3QgY2hhciogbmFycm93KGNvbnN0IGNoYXIqIF9fbG93LCBjb25zdCBjaGFyKiBfX2hpZ2gsCi0gICAgICAgICAgICAgICAgICAgICBjaGFyIF9fZGZhdWx0LCBjaGFyKiBfX3RvKSBjb25zdCB7Ci0gICAgcmV0dXJuIGRvX25hcnJvdyhfX2xvdywgX19oaWdoLCBfX2RmYXVsdCwgX190byk7Ci0gIH0KLQotICBzdGF0aWMgX1NUTFBfU1RBVElDX01FTUJFUl9ERUNMU1BFQyBsb2NhbGU6OmlkIGlkOwotIyBpZiBkZWZpbmVkKF9TVExQX1NUQVRJQ19DT05TVF9JTklUX0JVRykKLSAgZW51bSBfX1RhYmxlU2l6ZSB7IHRhYmxlX3NpemUgPSAyNTYgfTsKLSMgZWxzZQotICBzdGF0aWMgY29uc3Qgc2l6ZV90IHRhYmxlX3NpemUgPSAyNTY7Ci0jIGVuZGlmCi0KLXByb3RlY3RlZDoKLSAgY29uc3QgbWFzayogdGFibGUoKSBjb25zdCBfU1RMUF9OT1RIUk9XIHsgcmV0dXJuIF9NX2N0eXBlX3RhYmxlOyB9Ci0gIHN0YXRpYyBjb25zdCBtYXNrKiBfU1RMUF9DQUxMIGNsYXNzaWNfdGFibGUoKSBfU1RMUF9OT1RIUk9XOwotCi0gIH5jdHlwZSgpOwotCi0gIHZpcnR1YWwgY2hhciAgICAgICAgZG9fdG91cHBlcihjaGFyIF9fYykgY29uc3Q7Ci0gIHZpcnR1YWwgY2hhciAgICAgICAgZG9fdG9sb3dlcihjaGFyIF9fYykgY29uc3Q7Ci0gIHZpcnR1YWwgY29uc3QgY2hhciogZG9fdG91cHBlcihjaGFyKiBfX2xvdywgY29uc3QgY2hhciogX19oaWdoKSBjb25zdDsKLSAgdmlydHVhbCBjb25zdCBjaGFyKiBkb190b2xvd2VyKGNoYXIqIF9fbG93LCBjb25zdCBjaGFyKiBfX2hpZ2gpIGNvbnN0OwotICB2aXJ0dWFsIGNoYXIgICAgICAgIGRvX3dpZGVuKGNoYXIgX19jKSBjb25zdDsKLSAgdmlydHVhbCBjb25zdCBjaGFyKiBkb193aWRlbihjb25zdCBjaGFyKiBfX2xvdywgY29uc3QgY2hhciogX19oaWdoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIF9fdG8pIGNvbnN0OwotICB2aXJ0dWFsIGNoYXIgICAgICAgIGRvX25hcnJvdyhjaGFyIF9fYywgY2hhciAvKiBkZmF1bHQgKi8gKSBjb25zdDsKLSAgdmlydHVhbCBjb25zdCBjaGFyKiBkb19uYXJyb3coY29uc3QgY2hhciogX19sb3csIGNvbnN0IGNoYXIqIF9faGlnaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAvKiBkZmF1bHQgKi8sIGNoYXIqIF9fdG8pIGNvbnN0OwotcHJpdmF0ZToKLSAgc3RydWN0IF9Jc19tYXNrIHsKLSAgICBtYXNrIF9fbTsKLSAgICBfSXNfbWFzayhtYXNrIF9feCk6IF9fbShfX3gpIHt9Ci0gICBib29sIG9wZXJhdG9yKCkoY2hhciBfX2MpIHtyZXR1cm4gKF9fbSAmICh1bnNpZ25lZCBjaGFyKSBfX2MpICE9IDA7fQotICB9OwotCi1wcm90ZWN0ZWQ6Ci0gIGNvbnN0IG1hc2sqIF9NX2N0eXBlX3RhYmxlOwotcHJpdmF0ZToKLSAgYm9vbCBfTV9kZWxldGU7Ci19OwotCi1fU1RMUF9URU1QTEFURV9OVUxMCi1jbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBjdHlwZV9ieW5hbWU8Y2hhcj46IHB1YmxpYyBjdHlwZTxjaGFyPiB7Ci1wdWJsaWM6Ci0gIGV4cGxpY2l0IGN0eXBlX2J5bmFtZShjb25zdCBjaGFyKiwgc2l6ZV90ID0gMCwgX0xvY2FsZV9uYW1lX2hpbnQqIF9faGludCA9IDApOwotICB+Y3R5cGVfYnluYW1lKCk7Ci0KLSAgdmlydHVhbCBjaGFyICAgICAgICBkb190b3VwcGVyKGNoYXIgX19jKSBjb25zdDsKLSAgdmlydHVhbCBjaGFyICAgICAgICBkb190b2xvd2VyKGNoYXIgX19jKSBjb25zdDsKLQotICB2aXJ0dWFsIGNvbnN0IGNoYXIqIGRvX3RvdXBwZXIoY2hhciosIGNvbnN0IGNoYXIqKSBjb25zdDsKLSAgdmlydHVhbCBjb25zdCBjaGFyKiBkb190b2xvd2VyKGNoYXIqLCBjb25zdCBjaGFyKikgY29uc3Q7Ci0KLXByaXZhdGU6Ci0gIG1hc2sgX01fYnluYW1lX3RhYmxlW3RhYmxlX3NpemVdOwotICBfTG9jYWxlX2N0eXBlKiBfTV9jdHlwZTsKLQotICAvL2V4cGxpY2l0ZWx5IGRlZmluZWQgYXMgcHJpdmF0ZSB0byBhdm9pZCB3YXJuaW5nczoKLSAgdHlwZWRlZiBjdHlwZV9ieW5hbWU8Y2hhcj4gX1NlbGY7Ci0gIGN0eXBlX2J5bmFtZShfU2VsZiBjb25zdCYpOwotICBfU2VsZiYgb3BlcmF0b3IgPSAoX1NlbGYgY29uc3QmKTsKLSAgZnJpZW5kIF9Mb2NhbGVfbmFtZV9oaW50KiBfTG9jYWxlX2V4dHJhY3RfaGludChjdHlwZV9ieW5hbWU8Y2hhcj4qKTsKLX07Ci0KLSMgIGlmbmRlZiBfU1RMUF9OT19XQ0hBUl9UCi1fU1RMUF9URU1QTEFURV9OVUxMCi1jbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBjdHlwZTx3Y2hhcl90PiA6IHB1YmxpYyBsb2NhbGU6OmZhY2V0LCBwdWJsaWMgY3R5cGVfYmFzZQotewotICBmcmllbmQgY2xhc3MgX0xvY2FsZV9pbXBsOwotcHVibGljOgotICB0eXBlZGVmIHdjaGFyX3QgY2hhcl90eXBlOwotCi0gIGV4cGxpY2l0IGN0eXBlKHNpemVfdCBfX3JlZnMgPSAwKSA6IGxvY2FsZTo6ZmFjZXQoX19yZWZzKSB7fQotCi0gIGJvb2wgaXMobWFzayBfX20sIHdjaGFyX3QgX19jKSBjb25zdAotICAgIHsgcmV0dXJuIGRvX2lzKF9fbSwgX19jKTsgfQotCi0gIGNvbnN0IHdjaGFyX3QqIGlzKGNvbnN0IHdjaGFyX3QqIF9fbG93LCBjb25zdCB3Y2hhcl90KiBfX2hpZ2gsCi0gICAgICAgICAgICAgICAgICAgIG1hc2sqIF9fdmVjKSBjb25zdAotICAgIHsgcmV0dXJuIGRvX2lzKF9fbG93LCBfX2hpZ2gsIF9fdmVjKTsgfQotCi0gIGNvbnN0IHdjaGFyX3QqIHNjYW5faXMobWFzayBfX20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogX19sb3csIGNvbnN0IHdjaGFyX3QqIF9faGlnaCkgY29uc3QKLSAgICB7IHJldHVybiBkb19zY2FuX2lzKF9fbSwgX19sb3csIF9faGlnaCk7IH0KLQotICBjb25zdCB3Y2hhcl90KiBzY2FuX25vdCAobWFzayBfX20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBfX2xvdywgY29uc3Qgd2NoYXJfdCogX19oaWdoKSBjb25zdAotICAgIHsgcmV0dXJuIGRvX3NjYW5fbm90KF9fbSwgX19sb3csIF9faGlnaCk7IH0KLQotICB3Y2hhcl90ICh0b3VwcGVyKSh3Y2hhcl90IF9fYykgY29uc3QgeyByZXR1cm4gZG9fdG91cHBlcihfX2MpOyB9Ci0gIGNvbnN0IHdjaGFyX3QqICh0b3VwcGVyKSh3Y2hhcl90KiBfX2xvdywgY29uc3Qgd2NoYXJfdCogX19oaWdoKSBjb25zdAotICAgIHsgcmV0dXJuIGRvX3RvdXBwZXIoX19sb3csIF9faGlnaCk7IH0KLQotICB3Y2hhcl90ICh0b2xvd2VyKSh3Y2hhcl90IF9fYykgY29uc3QgeyByZXR1cm4gZG9fdG9sb3dlcihfX2MpOyB9Ci0gIGNvbnN0IHdjaGFyX3QqICh0b2xvd2VyKSh3Y2hhcl90KiBfX2xvdywgY29uc3Qgd2NoYXJfdCogX19oaWdoKSBjb25zdAotICAgIHsgcmV0dXJuIGRvX3RvbG93ZXIoX19sb3csIF9faGlnaCk7IH0KLQotICB3Y2hhcl90IHdpZGVuKGNoYXIgX19jKSBjb25zdCB7IHJldHVybiBkb193aWRlbihfX2MpOyB9Ci0gIGNvbnN0IGNoYXIqIHdpZGVuKGNvbnN0IGNoYXIqIF9fbG93LCBjb25zdCBjaGFyKiBfX2hpZ2gsCi0gICAgICAgICAgICAgICAgICAgIHdjaGFyX3QqIF9fdG8pIGNvbnN0Ci0gICAgeyByZXR1cm4gZG9fd2lkZW4oX19sb3csIF9faGlnaCwgX190byk7IH0KLQotICBjaGFyIG5hcnJvdyh3Y2hhcl90IF9fYywgY2hhciBfX2RmYXVsdCkgY29uc3QKLSAgICB7IHJldHVybiBkb19uYXJyb3coX19jLCBfX2RmYXVsdCk7IH0KLSAgY29uc3Qgd2NoYXJfdCogbmFycm93KGNvbnN0IHdjaGFyX3QqIF9fbG93LCBjb25zdCB3Y2hhcl90KiBfX2hpZ2gsCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyIF9fZGZhdWx0LCBjaGFyKiBfX3RvKSBjb25zdAotICAgIHsgcmV0dXJuIGRvX25hcnJvdyhfX2xvdywgX19oaWdoLCBfX2RmYXVsdCwgX190byk7IH0KLQotICBzdGF0aWMgX1NUTFBfU1RBVElDX01FTUJFUl9ERUNMU1BFQyBsb2NhbGU6OmlkIGlkOwotCi1wcm90ZWN0ZWQ6Ci0gIH5jdHlwZSgpOwotCi0gIHZpcnR1YWwgYm9vbCAgICAgICAgICAgZG9faXMobWFzayBfX20sIHdjaGFyX3QgX19jKSBjb25zdDsKLSAgdmlydHVhbCBjb25zdCB3Y2hhcl90KiBkb19pcyhjb25zdCB3Y2hhcl90KiwgY29uc3Qgd2NoYXJfdCosIG1hc2sqKSBjb25zdDsKLSAgdmlydHVhbCBjb25zdCB3Y2hhcl90KiBkb19zY2FuX2lzKG1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiwgY29uc3Qgd2NoYXJfdCopIGNvbnN0OwotICB2aXJ0dWFsIGNvbnN0IHdjaGFyX3QqIGRvX3NjYW5fbm90KG1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCosIGNvbnN0IHdjaGFyX3QqKSBjb25zdDsKLSAgdmlydHVhbCB3Y2hhcl90IGRvX3RvdXBwZXIod2NoYXJfdCBfX2MpIGNvbnN0OwotICB2aXJ0dWFsIGNvbnN0IHdjaGFyX3QqIGRvX3RvdXBwZXIod2NoYXJfdCosIGNvbnN0IHdjaGFyX3QqKSBjb25zdDsKLSAgdmlydHVhbCB3Y2hhcl90IGRvX3RvbG93ZXIod2NoYXJfdCBjKSBjb25zdDsKLSAgdmlydHVhbCBjb25zdCB3Y2hhcl90KiBkb190b2xvd2VyKHdjaGFyX3QqLCBjb25zdCB3Y2hhcl90KikgY29uc3Q7Ci0gIHZpcnR1YWwgd2NoYXJfdCBkb193aWRlbihjaGFyIGMpIGNvbnN0OwotICB2aXJ0dWFsIGNvbnN0IGNoYXIqIGRvX3dpZGVuKGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgd2NoYXJfdCopIGNvbnN0OwotICB2aXJ0dWFsIGNoYXIgIGRvX25hcnJvdyh3Y2hhcl90IF9fYywgY2hhciBfX2RmYXVsdCkgY29uc3Q7Ci0gIHZpcnR1YWwgY29uc3Qgd2NoYXJfdCogZG9fbmFycm93KGNvbnN0IHdjaGFyX3QqLCBjb25zdCB3Y2hhcl90KiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciwgY2hhciopIGNvbnN0OwotfTsKLQotX1NUTFBfVEVNUExBVEVfTlVMTAotY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgY3R5cGVfYnluYW1lPHdjaGFyX3Q+OiBwdWJsaWMgY3R5cGU8d2NoYXJfdD4gewotcHVibGljOgotICBleHBsaWNpdCBjdHlwZV9ieW5hbWUoY29uc3QgY2hhciogX19uYW1lLCBzaXplX3QgX19yZWZzID0gMCwgX0xvY2FsZV9uYW1lX2hpbnQqIF9faGludCA9IDApOwotCi1wcm90ZWN0ZWQ6Ci0gIH5jdHlwZV9ieW5hbWUoKTsKLQotICB2aXJ0dWFsIGJvb2wgICAgICAgICAgIGRvX2lzKG1hc2sgX19tLCB3Y2hhcl90IF9fYykgY29uc3Q7Ci0gIHZpcnR1YWwgY29uc3Qgd2NoYXJfdCogZG9faXMoY29uc3Qgd2NoYXJfdCosIGNvbnN0IHdjaGFyX3QqLCBtYXNrKikgY29uc3Q7Ci0gIHZpcnR1YWwgY29uc3Qgd2NoYXJfdCogZG9fc2Nhbl9pcyhtYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCosIGNvbnN0IHdjaGFyX3QqKSBjb25zdDsKLSAgdmlydHVhbCBjb25zdCB3Y2hhcl90KiBkb19zY2FuX25vdChtYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqLCBjb25zdCB3Y2hhcl90KikgY29uc3Q7Ci0gIHZpcnR1YWwgd2NoYXJfdCBkb190b3VwcGVyKHdjaGFyX3QgX19jKSBjb25zdDsKLSAgdmlydHVhbCBjb25zdCB3Y2hhcl90KiBkb190b3VwcGVyKHdjaGFyX3QqLCBjb25zdCB3Y2hhcl90KikgY29uc3Q7Ci0gIHZpcnR1YWwgd2NoYXJfdCBkb190b2xvd2VyKHdjaGFyX3QgYykgY29uc3Q7Ci0gIHZpcnR1YWwgY29uc3Qgd2NoYXJfdCogZG9fdG9sb3dlcih3Y2hhcl90KiwgY29uc3Qgd2NoYXJfdCopIGNvbnN0OwotCi1wcml2YXRlOgotICBfTG9jYWxlX2N0eXBlKiBfTV9jdHlwZTsKLQotICAvL2V4cGxpY2l0ZWx5IGRlZmluZWQgYXMgcHJpdmF0ZSB0byBhdm9pZCB3YXJuaW5nczoKLSAgdHlwZWRlZiBjdHlwZV9ieW5hbWU8d2NoYXJfdD4gX1NlbGY7Ci0gIGN0eXBlX2J5bmFtZShfU2VsZiBjb25zdCYpOwotICBfU2VsZiYgb3BlcmF0b3IgPSAoX1NlbGYgY29uc3QmKTsKLX07Ci0KLSMgIGVuZGlmIC8qIFdDSEFSX1QgKi8KLQotX1NUTFBfRU5EX05BTUVTUEFDRQotCi0jZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfQ1RZUEVfSCAqLwotCi0vLyBMb2NhbCBWYXJpYWJsZXM6Ci0vLyBtb2RlOkMrKwotLy8gRW5kOgotCmRpZmYgLS1naXQgYS9zdGwvX2N3Y2hhci5oIGIvc3RsL19jd2NoYXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY4MzZhZC4uMDAwMDAwMAotLS0gYS9zdGwvX2N3Y2hhci5oCisrKyAvZGV2L251bGwKQEAgLTEsMzI0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NXQ0hBUgotI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9DV0NIQVIKLQotI2lmIGRlZmluZWQgKF9TVExQX1dDRV9FVkMzKQotIyAgaWZuZGVmIF9TVExQX0lOVEVSTkFMX01CU1RBVEVfVAotIyAgICBpbmNsdWRlIDxzdGwvX21ic3RhdGVfdC5oPgotIyAgZW5kaWYKLSNlbHNlCi0jICBpZiBkZWZpbmVkIChfX0dOVUNfXykKLSMgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSEVBREVSKGNzdGRkZWYpCi0jICBlbmRpZgotCi0jICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fQ1dDSEFSKSAmJiBkZWZpbmVkIChfU1RMUF9VU0VfTkVXX0NfSEVBREVSUykKLSMgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSEVBREVSKGN3Y2hhcikKLSMgICAgaWYgZGVmaW5lZCAoX19PcGVuQlNEX18pCi10eXBlZGVmIF9CU0RfV0lOVF9UXyB3aW50X3Q7Ci0jICAgIGVuZGlmIC8qIF9fT3BlbkJTRF9fICovCi0KLSMgIGVsaWYgZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkgfHwgZGVmaW5lZCAoX19NUkNfXykgfHwgKGRlZmluZWQgKF9fU0NfXykgJiYgIWRlZmluZWQgKF9fRE1DX18pKSB8fCBcCi0gICAgICAgKGRlZmluZWQgKF9fQk9STEFORENfXykgJiYgKF9fQk9STEFORENfXyA8IDB4NTgwKSkgfHwgXAotICAgICAgICBkZWZpbmVkIChfX09wZW5CU0RfXykgfHwgZGVmaW5lZCAoX19GcmVlQlNEX18pIHx8IFwKLSAgICAgICAoZGVmaW5lZCAoX19HTlVDX18pICYmIChkZWZpbmVkIChfX0FQUExFX18pIHx8IGRlZmluZWQgKCBfX0x5bnhfXyApKSkKLSMgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ19IRUFERVIoc3RkZGVmLmgpCi0jICAgIGlmIGRlZmluZWQgKF9fTHlueF9fKQotIyAgICAgIGlmbmRlZiBfV0lOVF9UCi10eXBlZGVmIGxvbmcgaW50IHdpbnRfdDsKLSMgICAgICAgIGRlZmluZSBfV0lOVF9UCi0jICAgICAgZW5kaWYgLyogX1dJTlRfVCAqLwotIyAgICBlbmRpZgotIyAgICBpZiBkZWZpbmVkKF9fT3BlbkJTRF9fKQotdHlwZWRlZiBfQlNEX1dJTlRfVF8gd2ludF90OwotIyAgICBlbmRpZiAvKiBfX09wZW5CU0RfXyAqLwotIyAgZWxpZiBkZWZpbmVkIChfX01XRVJLU19fKSAmJiBkZWZpbmVkIChOX1BMQVRfTkxNKQotIyAgICBpbmNsdWRlIDx3Y2hhci5oPgotIyAgZWxpZiAhZGVmaW5lZCAoQU5EUk9JRCkKLS8vIEFuZHJvaWQgZG9lc24ndCBoYXZlIGEgd29ya2luZyB3Y2hhci5oCi0jICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NfSEVBREVSKHdjaGFyLmgpCi0KLSMgICAgaWYgZGVmaW5lZCAoX19zdW4pICYmIChkZWZpbmVkIChfWE9QRU5fU09VUkNFKSB8fCAoX1hPUEVOX1ZFUlNJT04gLSAwID09IDQpKQotZXh0ZXJuIHdpbnRfdCAgIGJ0b3djKCk7Ci1leHRlcm4gaW50ICAgICAgZndwcmludGYoKTsKLWV4dGVybiBpbnQgICAgICBmd3NjYW5mKCk7Ci1leHRlcm4gaW50ICAgICAgZndpZGUoKTsKLWV4dGVybiBpbnQgICAgICBtYnNpbml0KCk7Ci1leHRlcm4gc2l6ZV90ICAgbWJybGVuKCk7Ci1leHRlcm4gc2l6ZV90ICAgbWJydG93YygpOwotZXh0ZXJuIHNpemVfdCAgIG1ic3J0b3djcygpOwotZXh0ZXJuIGludCAgICAgIHN3cHJpbnRmKCk7Ci1leHRlcm4gaW50ICAgICAgc3dzY2FuZigpOwotZXh0ZXJuIGludCAgICAgIHZmd3ByaW50ZigpOwotZXh0ZXJuIGludCAgICAgIHZ3cHJpbnRmKCk7Ci1leHRlcm4gaW50ICAgICAgdnN3cHJpbnRmKCk7Ci1leHRlcm4gc2l6ZV90ICAgd2NydG9tYigpOwotZXh0ZXJuIHNpemVfdCAgIHdjc3J0b21icygpOwotZXh0ZXJuIHdjaGFyX3QgICp3Y3NzdHIoKTsKLWV4dGVybiBpbnQgICAgICB3Y3RvYigpOwotZXh0ZXJuIHdjaGFyX3QgICp3bWVtY2hyKCk7Ci1leHRlcm4gaW50ICAgICAgd21lbWNtcCgpOwotZXh0ZXJuIHdjaGFyX3QgICp3bWVtY3B5KCk7Ci1leHRlcm4gd2NoYXJfdCAgKndtZW1tb3ZlKCk7Ci1leHRlcm4gd2NoYXJfdCAgKndtZW1zZXQoKTsKLWV4dGVybiBpbnQgICAgICB3cHJpbnRmKCk7Ci1leHRlcm4gaW50ICAgICAgd3NjYW5mKCk7Ci0jICAgIGVuZGlmCi0jICBlbmRpZgotCi0jICBpZiBkZWZpbmVkIChfX01TTF9fKSAmJiAoX19NU0xfXyA8PSAweDUxRkYpICAvKiBkd2EgMi8yOC85OSAtIG5vdCB5ZXQgaW1wbGVtZW50ZWQgYnkgTVNMICAqLwotIyAgICBkZWZpbmUgX1NUTFBfV0NIQVJfTVNMX0VYQ0xVREUgMQotbmFtZXNwYWNlIHN0ZCB7Ci0gIGV4dGVybiAiQyIgc2l6ZV90IHdjc2Z0aW1lKHdjaGFyX3QgKiBzdHIsIHNpemVfdCBtYXhfc2l6ZSwgY29uc3Qgd2NoYXJfdCAqIGZvcm1hdF9zdHIsIGNvbnN0IHN0cnVjdCB0bSAqIHRpbWVwdHIpOwotfQotIyAgICBkZWZpbmUgX1NUTFBfTk9fTUJTVEFURV9UIDEKLSMgIGVsaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKQotIyAgICBpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX05PX0lPU1RSRUFNUykKLSMgICAgICBkZWZpbmUgX1NUTFBfTk9fTkFUSVZFX01CU1RBVEVfVAotIyAgICBlbmRpZgotIyAgICBkZWZpbmUgX1NUTFBfV0NIQVJfQk9STEFORF9FWENMVURFIDEKLSMgIGVuZGlmCi0KLSMgIGlmbmRlZiBfU1RMUF9JTlRFUk5BTF9NQlNUQVRFX1QKLSMgICAgaW5jbHVkZSA8c3RsL19tYnN0YXRlX3QuaD4KLSMgIGVuZGlmCi0KLSMgIGlmICFkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQotIyAgICBpZm5kZWYgV0NIQVJfTUlOCi0jICAgICAgZGVmaW5lIFdDSEFSX01JTiAwCi0vKiBTVU5wcm8gaGFzIHNvbWUgYnVncyB3aXRoIGNhc3RzLiB3Y2hhcl90IGlzIHNpemUgb2YgaW50IHRoZXJlIGFueXdheS4gKi8KLSMgICAgICBpZiBkZWZpbmVkIChfX1NVTlBST19DQykgfHwgZGVmaW5lZCAoX19ESkdQUCkKLSMgICAgICAgIGRlZmluZSBXQ0hBUl9NQVggKH4wKQotIyAgICAgIGVsc2UKLSMgICAgICAgIGRlZmluZSBXQ0hBUl9NQVggKCh3Y2hhcl90KX4wKQotIyAgICAgIGVuZGlmCi0jICAgIGVuZGlmCi0jICAgIGlmIGRlZmluZWQgKF9fR05VQ19fKSAmJiBkZWZpbmVkIChfX2FscGhhX18pCi0vKiBEZWZpbml0aW9uIG9mIFdDSEFSX01JTiBhbmQgTUFYIGFyZSB3cm9uZyBmb3IgYWxwaGEgcGxhdGZvcm0KLSAqIGFzIGdjYyBjb25zaWRlciB3Y2hhcl90IGFzIGFuIHVuc2lnbmVkIHR5cGUuIFN0YXRpYyBhc3NlcnRpb24gYXJlCi0gKiBoZXJlIHRvIGNoZWNrIHRoYXQgYSBmdXR1cmUgYWxwaGEgU0RLIG9yIGEgZnV0dXJlIGdjYyB3b24ndCBjaGFuZ2UgdGhlCi0gKiBzaXR1YXRpb24gbWFraW5nIHRoaXMgd29ya2Fyb3VuZCB1c2VsZXNzLgotICovCi1fU1RMUF9TVEFUSUNfQVNTRVJUKCgod2NoYXJfdCktMSA+IDApICYmIChXQ0hBUl9NSU4gPCAwKSkKLSMgICAgICB1bmRlZiBXQ0hBUl9NSU4KLSMgICAgICBkZWZpbmUgV0NIQVJfTUlOIDAKLSMgICAgICB1bmRlZiBXQ0hBUl9NQVgKLSMgICAgICBkZWZpbmUgV0NIQVJfTUFYICgod2NoYXJfdCl+MCkKLSMgICAgZW5kaWYKLSMgICAgaWYgZGVmaW5lZChfX0hQX2FDQykgJiYgKF9fSFBfYUNDID49IDYwMDAwKQotLyogU3RhcnRpbmcgd2l0aCBCLjExLjMxLCBIUC1VWC9pYTY0IHByb3ZpZGVzIEM5OS1jb21wbGlhbnQgZGVmaW5pdGlvbnMKLSAqIG9mIFdDSEFSX01JTi9NQVggbWFjcm9zIHdpdGhvdXQgaGF2aW5nIHRvIGRlZmluZQotICogX0lOQ0xVREVfU1REQ19fU09VUkNFXzE5OTkwMSBtYWNybyAod2hpY2ggYUNDIGNvbXBpbGVyIGRvZXMgbm90Ci0gKiBwcmVkZWZpbmUpLiBMZXQgU1RMcG9ydCBwcm92aWRlIEIuMTEuMzEgZGVmaW5pdGlvbnMgb24gYW55IHZlcnNpb24gb2YKLSAqIEhQLVVYL2lhNjQuCi0gKi8KLSMgICAgICB1bmRlZiBXQ0hBUl9NSU4KLSMgICAgICBkZWZpbmUgV0NIQVJfTUlOIDAKLSMgICAgICB1bmRlZiBXQ0hBUl9NQVgKLSMgICAgICBkZWZpbmUgV0NIQVJfTUFYIFVJTlRfTUFYIAotIyAgICBlbmRpZgotIyAgZW5kaWYKLQotIyAgaWYgZGVmaW5lZCAoX1NUTFBfSU1QT1JUX1ZFTkRPUl9DU1REKQotCi0jICAgIGlmIGRlZmluZWQgKF9fU1VOUFJPX0NDKSAmJiAhZGVmaW5lZCAoX1NUTFBfSEFTX05PX05FV19DX0hFQURFUlMpCi11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6d2ludF90OwotIyAgICBlbmRpZgotCi1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLSMgICAgaWYgZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkKLXR5cGVkZWYgaW50IHdpbnRfdDsKLSMgICAgZWxzZQotLy8gZ2NjIDMuMCBoYXMgYSBnbGl0Y2ggOiB3aW50X3Qgb25seSBzdWNrZWQgaW50byB0aGUgZ2xvYmFsIG5hbWVzcGFjZSBpZiBfR0xJQkNQUF9VU0VfV0NIQVJfVCBpcyBkZWZpbmVkCi0vLyBfX01XRVJLU19fIGhhcyBkZWZpbml0aW9uIGluIHdjaGFyX3QuaCAoTVNMIEMrKyksIGJ1dCBvbmVzIGRpZmZlciBmcm9tIGRlZmluaXRpb24KLS8vIGluIHN0ZGlvLmg7IEkgcHJlZmVyIHNldHRpbmdzIGZyb20gbGFzdCBmaWxlLgotIyAgICAgIGlmIChkZWZpbmVkIChfX0dOVUNfXykgJiYgISBkZWZpbmVkIChfR0xJQkNQUF9VU0VfV0NIQVJfVCkpIC8vIHx8IChkZWZpbmVkKF9fTVdFUktTX18pICYmIGRlZmluZWQoTl9QTEFUX05MTSkpCi11c2luZyA6OndpbnRfdDsKLSMgICAgICBlbHNlCi11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6d2ludF90OwotIyAgICAgIGVuZGlmCi0jICAgIGVuZGlmCi0KLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpzaXplX3Q7Ci0KLSMgICAgaWYgIWRlZmluZWQgKF9TVExQX05PX05BVElWRV9NQlNUQVRFX1QpICYmICFkZWZpbmVkIChfU1RMUF9VU0VfT1dOX01CU1RBVEVfVCkKLXVzaW5nIF9TVExQX1ZFTkRPUl9NQl9OQU1FU1BBQ0U6Om1ic3RhdGVfdDsKLQotIyAgICAgIGlmICFkZWZpbmVkIChfU1RMUF9OT19DU1REX0ZVTkNUSU9OX0lNUE9SVFMpICYmICFkZWZpbmVkKF9TVExQX1dDSEFSX0JPUkxBTkRfRVhDTFVERSkgJiYgXAotICAgICAgICAgKCFkZWZpbmVkKF9fTVNMX18pIHx8IF9fTVNMX18gPiAweDYwMDEpCi0jICAgICAgICBpZiBkZWZpbmVkIChfX01JTkdXMzJfXykgJiYgKChfX01JTkdXMzJfTUFKT1JfVkVSU0lPTiA+IDMpIHx8ICgoX19NSU5HVzMyX01BSk9SX1ZFUlNJT04gPT0gMykgJiYgKF9fTUlOR1czMl9NSU5PUl9WRVJTSU9OID49IDgpKSkgfHwgXAotICAgICAgICAgICEoZGVmaW5lZCAoX19LQ0MpIHx8IGRlZmluZWQgKF9fR05VQ19fKSkgJiYgIWRlZmluZWQoX1NUTFBfV0NFX05FVCkgJiYgIShkZWZpbmVkKF9fTVdFUktTX18pICYmIGRlZmluZWQoTl9QTEFUX05MTSkpCi11c2luZyBfU1RMUF9WRU5ET1JfTUJfTkFNRVNQQUNFOjpidG93YzsKLSMgICAgICAgICAgaWYgKCFkZWZpbmVkKF9fTVNMX18pIHx8IF9fTVNMX18gPiAweDcwMDEpCi11c2luZyBfU1RMUF9WRU5ET1JfTUJfTkFNRVNQQUNFOjptYnNpbml0OwotIyAgICAgICAgICBlbmRpZgotIyAgICAgICAgZW5kaWYKLSMgICAgICAgIGlmIGRlZmluZWQgKF9fTUlOR1czMl9fKSAmJiAoKF9fTUlOR1czMl9NQUpPUl9WRVJTSU9OID4gMykgfHwgKChfX01JTkdXMzJfTUFKT1JfVkVSU0lPTiA9PSAzKSAmJiAoX19NSU5HVzMyX01JTk9SX1ZFUlNJT04gPj0gOCkpKSB8fCBcCi0gICAgICAgICAgICFkZWZpbmVkIChfX0dOVUNfXykgJiYgIWRlZmluZWQoX1NUTFBfV0NFX05FVCkgJiYgIShkZWZpbmVkKF9fTVdFUktTX18pICYmIGRlZmluZWQoTl9QTEFUX05MTSkpCi11c2luZyBfU1RMUF9WRU5ET1JfTUJfTkFNRVNQQUNFOjptYnJsZW47Ci11c2luZyBfU1RMUF9WRU5ET1JfTUJfTkFNRVNQQUNFOjptYnJ0b3djOwotdXNpbmcgX1NUTFBfVkVORE9SX01CX05BTUVTUEFDRTo6bWJzcnRvd2NzOwotdXNpbmcgX1NUTFBfVkVORE9SX01CX05BTUVTUEFDRTo6d2NydG9tYjsKLXVzaW5nIF9TVExQX1ZFTkRPUl9NQl9OQU1FU1BBQ0U6Ondjc3J0b21iczsKLSMgICAgICAgIGVuZGlmCi0jICAgICAgZW5kaWYgLyogQk9STEFORCAmJiAhX19NU0xfXyB8fCBfX01TTF9fID4gMHg2MDAxICovCi0KLSMgICAgZW5kaWYgLyogX1NUTFBfTk9fTkFUSVZFX01CU1RBVEVfVCAqLwotCi0jICAgIGlmICFkZWZpbmVkIChfU1RMUF9OT19OQVRJVkVfV0lERV9GVU5DVElPTlMpICYmICEgZGVmaW5lZCAoX1NUTFBfTk9fQ1NURF9GVU5DVElPTl9JTVBPUlRTKQotCi0jICAgICAgaWYgIWRlZmluZWQgKF9TVExQX1dDSEFSX0JPUkxBTkRfRVhDTFVERSkgJiYgISBkZWZpbmVkIChfU1RMUF9OT19DU1REX0ZVTkNUSU9OX0lNUE9SVFMpICYmICEoZGVmaW5lZChfX01XRVJLU19fKSAmJiBkZWZpbmVkKE5fUExBVF9OTE0pKQotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmZnZXR3YzsKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpmZ2V0d3M7Ci11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6ZnB1dHdjOwotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmZwdXR3czsKLSMgICAgICBlbmRpZgotCi0jICAgICAgaWYgIShkZWZpbmVkIChfU1RMUF9XQ0hBUl9TVU5QUk9fRVhDTFVERSkgfHwgZGVmaW5lZCAoX1NUTFBfV0NIQVJfQk9STEFORF9FWENMVURFKSB8fCBcCi0gICAgICAgICAgICBkZWZpbmVkKF9TVExQX1dDSEFSX0hQQUNDX0VYQ0xVREUpIHx8IChkZWZpbmVkKF9fTVdFUktTX18pICYmIGRlZmluZWQoTl9QTEFUX05MTSkpKQotIyAgICAgICAgaWYgIWRlZmluZWQgKF9fREVDQ1hYKQotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmZ3aWRlOwotIyAgICAgICAgZW5kaWYKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpmd3ByaW50ZjsKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpmd3NjYW5mOwotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmdldHdjaGFyOwotIyAgICAgIGVuZGlmCi0KLSMgICAgICBpZiAhZGVmaW5lZChfU1RMUF9XQ0hBUl9CT1JMQU5EX0VYQ0xVREUpICYmICEoZGVmaW5lZChfX01XRVJLU19fKSAmJiBkZWZpbmVkKE5fUExBVF9OTE0pKQotIyAgICAgICAgaWZuZGVmIF9TVExQX1dDRV9ORVQKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpnZXR3YzsKLSMgICAgICAgIGVuZGlmCi11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6dW5nZXR3YzsKLSMgICAgICAgIGlmbmRlZiBfU1RMUF9XQ0VfTkVUCi11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6cHV0d2M7Ci0jICAgICAgICBlbmRpZgotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnB1dHdjaGFyOwotIyAgICAgIGVuZGlmCi0KLSMgICAgICBpZiAhKGRlZmluZWQgKF9TVExQX1dDSEFSX1NVTlBST19FWENMVURFKSB8fCBkZWZpbmVkIChfU1RMUF9XQ0hBUl9CT1JMQU5EX0VYQ0xVREUpIHx8IFwKLSAgICAgICAgICAgIGRlZmluZWQgKF9TVExQX1dDSEFSX0hQQUNDX0VYQ0xVREUpIHx8IChkZWZpbmVkIChfX01XRVJLU19fKSAmJiBkZWZpbmVkIChOX1BMQVRfTkxNKSkpCi0jICAgICAgICBpZiBkZWZpbmVkIChfU1RMUF9NU1ZDX0xJQikgJiYgKF9TVExQX01TVkNfTElCIDw9IDEzMDApIHx8IFwKLSAgICAgICAgICAgIGRlZmluZWQgKF9fTUlOR1czMl9fKQotIyAgICAgICAgICB1bmRlZiBzd3ByaW50ZgotIyAgICAgICAgICBkZWZpbmUgc3dwcmludGYgX3Nud3ByaW50ZgotIyAgICAgICAgICB1bmRlZiB2c3dwcmludGYKLSMgICAgICAgICAgZGVmaW5lIHZzd3ByaW50ZiBfdnNud3ByaW50ZgotdXNpbmcgOjpzd3ByaW50ZjsKLXVzaW5nIDo6dnN3cHJpbnRmOwotIyAgICAgICAgZWxzZQotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnN3cHJpbnRmOwotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnZzd3ByaW50ZjsKLSMgICAgICAgIGVuZGlmCi11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6c3dzY2FuZjsKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjp2ZndwcmludGY7Ci11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6dndwcmludGY7Ci0KLSMgICAgICAgIGlmICghZGVmaW5lZChfX01TTF9fKSB8fCBfX01TTF9fID4gMHg3MDAxICkgJiYgIWRlZmluZWQoX1NUTFBfV0NFX05FVCkgJiYgXAotICAgICAgICAgICAgICFkZWZpbmVkKF9TVExQX1VTRV9VQ0xJQkMpIC8qIGF0IGxlYXN0IGluIHVDbGliYyAwLjkuMjYgKi8KLQotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6Ondjc2Z0aW1lOwotIyAgICAgICAgZW5kaWYKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjp3Y3N0b2s7Ci0KLSMgICAgICBlbmRpZgotCi0jICAgICAgaWYgIShkZWZpbmVkKF9fTVdFUktTX18pICYmIGRlZmluZWQoTl9QTEFUX05MTSkpCi0jICAgICAgICBpZiAhZGVmaW5lZCAoX1NUTFBfV0NFX05FVCkKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjp3Y3Njb2xsOwotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6Ondjc3hmcm07Ci0jICAgICAgICBlbmRpZgotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6Ondjc2NhdDsKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjp3Y3NyY2hyOwotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6Ondjc2NtcDsKLQotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6Ondjc2NweTsKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjp3Y3Njc3BuOwotCi11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6d2NzbGVuOwotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6Ondjc25jYXQ7Ci11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6d2NzbmNtcDsKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjp3Y3NuY3B5OwotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6Ondjc3Bicms7Ci11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6d2NzY2hyOwotCi11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6d2Nzc3BuOwotIyAgICAgIGVuZGlmCi0KLSMgICAgICBpZiAhZGVmaW5lZCAoX1NUTFBfV0NIQVJfQk9STEFORF9FWENMVURFKSAmJiAhKGRlZmluZWQoX19NV0VSS1NfXykgJiYgZGVmaW5lZChOX1BMQVRfTkxNKSkKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjp3Y3N0b2Q7Ci11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6d2NzdG9sOwotIyAgICAgIGVuZGlmCi0KLSMgICAgICBpZiAhKGRlZmluZWQgKF9TVExQX1dDSEFSX1NVTlBST19FWENMVURFKSB8fCBkZWZpbmVkIChfU1RMUF9XQ0hBUl9IUEFDQ19FWENMVURFKSB8fCBcCi0gICAgICAgICAgICAoZGVmaW5lZCAoX19NV0VSS1NfXykgJiYgZGVmaW5lZCAoTl9QTEFUX05MTSkpKQotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6Ondjc3N0cjsKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjp3bWVtY2hyOwotCi0jICAgICAgICBpZiAhZGVmaW5lZCAoX1NUTFBfV0NIQVJfQk9STEFORF9FWENMVURFKQotIyAgICAgICAgICAgIGlmICFkZWZpbmVkIChfU1RMUF9XQ0VfTkVUKQotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OndjdG9iOwotIyAgICAgICAgICAgIGVuZGlmCi0jICAgICAgICAgIGlmICFkZWZpbmVkIChfX0RNQ19fKQotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OndtZW1jbXA7Ci11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6d21lbW1vdmU7Ci0jICAgICAgICAgIGVuZGlmCi11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6d3ByaW50ZjsKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjp3c2NhbmY7Ci0jICAgICAgICBlbmRpZgotCi0jICAgICAgICBpZiBkZWZpbmVkIChfX0JPUkxBTkRDX18pCi1pbmxpbmUgd2NoYXJfdCogX1NUTFBfd21lbWNweSh3Y2hhcl90KiBfX3dkc3QsIGNvbnN0IHdjaGFyX3QqIF9fd3NyYywgc2l6ZV90IF9fbikKLXsgcmV0dXJuIF9fU1RBVElDX0NBU1Qod2NoYXJfdCosIF9TVExQX1ZFTkRPUl9DU1REOjp3bWVtY3B5KF9fd2RzdCwgX193c3JjLCBfX24pKTsgfQotaW5saW5lIHdjaGFyX3QqIF9TVExQX3dtZW1zZXQod2NoYXJfdCogX193ZHN0LCB3Y2hhcl90IF9fd2MsIHNpemVfdCBfX24pCi17IHJldHVybiBfX1NUQVRJQ19DQVNUKHdjaGFyX3QqLCBfU1RMUF9WRU5ET1JfQ1NURDo6bWVtc2V0KF9fd2RzdCwgX193YywgX19uKSk7IH0KLSMgICAgICAgICAgdW5kZWYgd21lbWNweQotIyAgICAgICAgICB1bmRlZiB3bWVtc2V0Ci1pbmxpbmUgd2NoYXJfdCogd21lbWNweSh3Y2hhcl90KiBfX3dkc3QsIGNvbnN0IHdjaGFyX3QqIF9fd3NyYywgc2l6ZV90IF9fbikKLXsgcmV0dXJuIF9TVExQX3dtZW1jcHkoX193ZHN0LCBfX3dzcmMsIF9fbik7IH0KLWlubGluZSB3Y2hhcl90KiB3bWVtc2V0KHdjaGFyX3QqIF9fd2RzdCwgd2NoYXJfdCBfX3djLCBzaXplX3QgX19uKQoteyByZXR1cm4gX1NUTFBfd21lbXNldChfX3dkc3QsIF9fd2MsIF9fbik7IH0KLSMgICAgICAgIGVsaWYgZGVmaW5lZCAoX19ETUNfXykKLWlubGluZSB3Y2hhcl90KiB3bWVtY3B5KHdjaGFyX3QqIF9fUkVTVFJJQ1QgX193ZHN0LCBjb25zdCB3Y2hhcl90KiBfX1JFU1RSSUNUIF9fd3NyYywgc2l6ZV90IF9fbikKLXsgcmV0dXJuIF9fU1RBVElDX0NBU1Qod2NoYXJfdCosIG1lbWNweShfX3dkc3QsIF9fd3NyYywgX19uICogc2l6ZW9mKHdjaGFyX3QpKSk7IH0KLWlubGluZSB3Y2hhcl90KiB3bWVtbW92ZSh3Y2hhcl90KiBfX1JFU1RSSUNUIF9fd2RzdCwgY29uc3Qgd2NoYXJfdCAqIF9fUkVTVFJJQ1QgX193Yywgc2l6ZV90IF9fbikKLXsgcmV0dXJuIF9fU1RBVElDX0NBU1Qod2NoYXJfdCosIG1lbW1vdmUoX193ZHN0LCBfX3djLCBfX24gKiBzaXplb2Yod2NoYXJfdCkpKTsgfQotaW5saW5lIHdjaGFyX3QqIHdtZW1zZXQod2NoYXJfdCogX193ZHN0LCB3Y2hhcl90IF9fd2MsIHNpemVfdCBfX24pCi17IGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgX19uOyBpKyspIF9fd2RzdFtpXSA9IF9fd2M7IHJldHVybiBfX3dkc3Q7IH0KLSMgICAgICAgIGVsc2UKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjp3bWVtY3B5OwotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OndtZW1zZXQ7Ci0jICAgICAgICBlbmRpZgotIyAgICAgIGVuZGlmCi0KLSMgICAgZWxpZiBkZWZpbmVkIChfX01XRVJLU19fKSAmJiBkZWZpbmVkIChOX1BMQVRfTkxNKSAvKiBfU1RMUF9OT19OQVRJVkVfV0lERV9GVU5DVElPTlMgKi8KLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjp3Y3NsZW47Ci11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6d2NzY21wOwotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6Ondjc2NweTsKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjp3Y3NzdHI7Ci11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6d2NzY2hyOwotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6Ondjc3JjaHI7Ci11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6d2NzcGJyazsKLSMgICAgZW5kaWYgLyogX1NUTFBfTk9fTkFUSVZFX1dJREVfRlVOQ1RJT05TICovCi1fU1RMUF9FTkRfTkFNRVNQQUNFCi0KLSMgIGVuZGlmIC8qIF9TVExQX0lNUE9SVF9WRU5ET1JfQ1NURCAqLwotCi0jICB1bmRlZiBfU1RMUF9XQ0hBUl9TVU5QUk9fRVhDTFVERQotIyAgdW5kZWYgX1NUTFBfV0NIQVJfTVNMX0VYQ0xVREUKLQotIyAgZW5kaWYgLyogIWRlZmluZWQoX1NUTFBfV0NFX0VWQzMpICovCi0KLSNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9DV0NIQVIgKi8KZGlmZiAtLWdpdCBhL3N0bC9fY3djdHlwZS5oIGIvc3RsL19jd2N0eXBlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyZGI3ZWYuLjAwMDAwMDAKLS0tIGEvc3RsL19jd2N0eXBlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DV0NUWVBFCi0jZGVmaW5lIF9TVExQX0lOVEVSTkFMX0NXQ1RZUEUKLQotI2lmIGRlZmluZWQgKF9fQk9STEFORENfXykgJiYgIWRlZmluZWQgKF9TVExQX0lOVEVSTkFMX0NDVFlQRSkKLSMgIGluY2x1ZGUgPHN0bC9fY2N0eXBlLmg+Ci0jZW5kaWYKLQotI2lmICFkZWZpbmVkIChfU1RMUF9XQ0VfRVZDMykKLSMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9ORVdfQ19IRUFERVJTKQotIyAgICBpZiAhZGVmaW5lZCAoTl9QTEFUX05MTSkKLSMgICAgICBpbmNsdWRlIF9TVExQX05BVElWRV9DUFBfQ19IRUFERVIoY3djdHlwZSkKLSMgICAgZWxzZQotICAgICAgIC8vIHNlZSBjb21tZW50cyBpbiBzdGxwb3J0L2N3Y2hhciBhYm91dCB3aW50X3Qgb24gTm92ZWxsCi0jICAgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSEVBREVSKHdjaGFyX3QuaCkKLSMgICAgICBpbmNsdWRlIF9TVExQX05BVElWRV9DX0hFQURFUihzdGRkZWYuaCkKLSMgICAgICBpbmNsdWRlIF9TVExQX05BVElWRV9DX0hFQURFUihzdGRpby5oKQotIyAgICBlbmRpZgotIyAgICBpZiBkZWZpbmVkIChfX01TTF9fKSAmJiAhZGVmaW5lZCAoTl9QTEFUX05MTSkKLW5hbWVzcGFjZSBzdGQgewotICB0eXBlZGVmIHdjaGFyX3Qgd2N0cmFuc190OwotICB3aW50X3QgdG93Y3RyYW5zKHdpbnRfdCBjLCB3Y3RyYW5zX3QgdmFsdWUpOwotICB3Y3RyYW5zX3Qgd2N0cmFucyhjb25zdCBjaGFyICpuYW1lKTsKLX0KLXVzaW5nIHN0ZDo6d2N0cmFuc190OwotdXNpbmcgc3RkOjp0b3djdHJhbnM7Ci11c2luZyBzdGQ6OndjdHJhbnM7Ci0jICAgIGVuZGlmCi0jICBlbHNlCi0jICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NfSEVBREVSKHdjdHlwZS5oKQotIyAgZW5kaWYKLQotIyAgaWYgZGVmaW5lZCAoX1NUTFBfSU1QT1JUX1ZFTkRPUl9DU1REKQotCi0jICAgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9HTElCQykgJiYgIShkZWZpbmVkIChfR0xJQkNQUF9VU0VfV0NIQVJfVCkgfHwgZGVmaW5lZCAoX0dMSUJDWFhfVVNFX1dDSEFSX1QpKSB8fCBcCi0gICAgICAgIGRlZmluZWQgKF9fc3VuKSB8fCBkZWZpbmVkIChfX0ZyZWVCU0RfXykgfHwgXAotICAgICAgICBkZWZpbmVkIChfX01JTkdXMzJfXykgJiYgKChfX01JTkdXMzJfTUFKT1JfVkVSU0lPTiA8IDMpIHx8IChfX01JTkdXMzJfTUFKT1JfVkVSU0lPTiA9PSAzKSAmJiAoX19NSU5HVzMyX01JTk9SX1ZFUlNJT04gPD0gMCkpCi0vL1dlIHRha2Ugd2lkZSBmdW5jdGlvbnMgZnJvbSBnbG9iYWwgbmFtZXNwYWNlOgotIyAgICAgIGRlZmluZSBfU1RMUF9WRU5ET1JfQ1NURF9XRlVOQwotIyAgICBlbHNlCi0jICAgICAgZGVmaW5lIF9TVExQX1ZFTkRPUl9DU1REX1dGVU5DIF9TVExQX1ZFTkRPUl9DU1RECi0jICAgIGVuZGlmCi0KLV9TVExQX0JFR0lOX05BTUVTUEFDRQotdXNpbmcgX1NUTFBfVkVORE9SX0NTVERfV0ZVTkM6OndjdHlwZV90OwotdXNpbmcgX1NUTFBfVkVORE9SX0NTVERfV0ZVTkM6OndpbnRfdDsKLSMgICAgaWYgIWRlZmluZWQgKF9TVExQX05PX0NTVERfRlVOQ1RJT05fSU1QT1JUUykKLSMgICAgICBpZiAhZGVmaW5lZCAoX19CT1JMQU5EQ19fKSAmJiAhZGVmaW5lZCAoX19NU0xfXykKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REX1dGVU5DOjp3Y3RyYW5zX3Q7Ci0jICAgICAgICBpZiAhZGVmaW5lZCAoX19ETUNfXykgJiYgKCFkZWZpbmVkKF9XSU4zMl9XQ0UpIHx8IF9XSU4zMl9XQ0U8MHg1MDApCi11c2luZyBfU1RMUF9WRU5ET1JfQ1NURF9XRlVOQzo6dG93Y3RyYW5zOwotdXNpbmcgX1NUTFBfVkVORE9SX0NTVERfV0ZVTkM6OndjdHJhbnM7Ci11c2luZyBfU1RMUF9WRU5ET1JfQ1NURF9XRlVOQzo6d2N0eXBlOwotIyAgICAgICAgZW5kaWYKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REX1dGVU5DOjppc3djdHlwZTsKLSMgICAgICBlbmRpZgotIyAgICAgIGlmICFkZWZpbmVkKE5fUExBVF9OTE0pCi11c2luZyBfU1RMUF9WRU5ET1JfQ1NURF9XRlVOQzo6aXN3YWxudW07Ci11c2luZyBfU1RMUF9WRU5ET1JfQ1NURF9XRlVOQzo6aXN3YWxwaGE7Ci11c2luZyBfU1RMUF9WRU5ET1JfQ1NURF9XRlVOQzo6aXN3Y250cmw7Ci0KLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REX1dGVU5DOjppc3dkaWdpdDsKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REX1dGVU5DOjppc3dncmFwaDsKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REX1dGVU5DOjppc3dsb3dlcjsKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REX1dGVU5DOjppc3dwcmludDsKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REX1dGVU5DOjppc3dwdW5jdDsKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REX1dGVU5DOjppc3dzcGFjZTsKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REX1dGVU5DOjppc3d1cHBlcjsKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REX1dGVU5DOjppc3d4ZGlnaXQ7Ci0KLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REX1dGVU5DOjp0b3dsb3dlcjsKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REX1dGVU5DOjp0b3d1cHBlcjsKLSMgICAgICBlbmRpZiAvKiAhTl9QTEFUX05MTSAqLwotIyAgICBlbmRpZiAvKiBfU1RMUF9OT19DU1REX0ZVTkNUSU9OX0lNUE9SVFMgKi8KLV9TVExQX0VORF9OQU1FU1BBQ0UKLSMgIGVuZGlmIC8qIF9TVExQX0lNUE9SVF9WRU5ET1JfQ1NURCAqLwotI2VuZGlmIC8qIF9TVExQX1dDRV9FVkMzICovCi0KLSNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9DV0NUWVBFICovCmRpZmYgLS1naXQgYS9zdGwvX2RlcXVlLmMgYi9zdGwvX2RlcXVlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyZDZmYzkuLjAwMDAwMDAKLS0tIGEvc3RsL19kZXF1ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsODE0ICswLDAgQEAKLS8qCi0gKgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NAotICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NwotICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk3Ci0gKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5Ci0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLSNpZm5kZWYgX1NUTFBfREVRVUVfQwotI2RlZmluZSBfU1RMUF9ERVFVRV9DCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfREVRVUVfSAotIyAgaW5jbHVkZSA8c3RsL19kZXF1ZS5oPgotI2VuZGlmCi0KLV9TVExQX0JFR0lOX05BTUVTUEFDRQotCi1fU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCi0KLS8vIE5vbi1pbmxpbmUgbWVtYmVyIGZ1bmN0aW9ucyBmcm9tIF9EZXF1ZV9iYXNlLgotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2MgPgotX0RlcXVlX2Jhc2U8X1RwLF9BbGxvYyA+Ojp+X0RlcXVlX2Jhc2UoKSB7Ci0gIGlmIChfTV9tYXAuX01fZGF0YSkgewotICAgIF9NX2Rlc3Ryb3lfbm9kZXMoX01fc3RhcnQuX01fbm9kZSwgdGhpcy0+X01fZmluaXNoLl9NX25vZGUgKyAxKTsKLSAgICBfTV9tYXAuZGVhbGxvY2F0ZShfTV9tYXAuX01fZGF0YSwgX01fbWFwX3NpemUuX01fZGF0YSk7Ci0gIH0KLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jID4KLXZvaWQgX0RlcXVlX2Jhc2U8X1RwLF9BbGxvYz46Ol9NX2luaXRpYWxpemVfbWFwKHNpemVfdCBfX251bV9lbGVtZW50cykgewotICBzaXplX3QgX19udW1fbm9kZXMgPSBfX251bV9lbGVtZW50cyAvIHRoaXMtPmJ1ZmZlcl9zaXplKCkgKyAxIDsKLQotICBfTV9tYXBfc2l6ZS5fTV9kYXRhID0gKG1heCkoKHNpemVfdCkgX1NfaW5pdGlhbF9tYXBfc2l6ZSwgX19udW1fbm9kZXMgKyAyKTsKLSAgX01fbWFwLl9NX2RhdGEgPSBfTV9tYXAuYWxsb2NhdGUoX01fbWFwX3NpemUuX01fZGF0YSk7Ci0KLSAgX1RwKiogX19uc3RhcnQgPSBfTV9tYXAuX01fZGF0YSArIChfTV9tYXBfc2l6ZS5fTV9kYXRhIC0gX19udW1fbm9kZXMpIC8gMjsKLSAgX1RwKiogX19uZmluaXNoID0gX19uc3RhcnQgKyBfX251bV9ub2RlczsKLQotICBfU1RMUF9UUlkgewotICAgIF9NX2NyZWF0ZV9ub2RlcyhfX25zdGFydCwgX19uZmluaXNoKTsKLSAgfQotICBfU1RMUF9VTldJTkQoKF9NX21hcC5kZWFsbG9jYXRlKF9NX21hcC5fTV9kYXRhLCBfTV9tYXBfc2l6ZS5fTV9kYXRhKSwKLSAgICAgICAgICAgICAgICBfTV9tYXAuX01fZGF0YSA9IDAsIF9NX21hcF9zaXplLl9NX2RhdGEgPSAwKSkKLSAgX01fc3RhcnQuX01fc2V0X25vZGUoX19uc3RhcnQpOwotICB0aGlzLT5fTV9maW5pc2guX01fc2V0X25vZGUoX19uZmluaXNoIC0gMSk7Ci0gIF9NX3N0YXJ0Ll9NX2N1ciA9IF9NX3N0YXJ0Ll9NX2ZpcnN0OwotICB0aGlzLT5fTV9maW5pc2guX01fY3VyID0gdGhpcy0+X01fZmluaXNoLl9NX2ZpcnN0ICsgX19udW1fZWxlbWVudHMgJSB0aGlzLT5idWZmZXJfc2l6ZSgpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2MgPgotdm9pZCBfRGVxdWVfYmFzZTxfVHAsX0FsbG9jPjo6X01fY3JlYXRlX25vZGVzKF9UcCoqIF9fbnN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9UcCoqIF9fbmZpbmlzaCkgewotICBfVHAqKiBfX2N1ciA9IF9fbnN0YXJ0OwotICBfU1RMUF9UUlkgewotICAgIGZvciAoOyBfX2N1ciA8IF9fbmZpbmlzaDsgKytfX2N1cikKLSAgICAgICpfX2N1ciA9IF9NX21hcF9zaXplLmFsbG9jYXRlKHRoaXMtPmJ1ZmZlcl9zaXplKCkpOwotICB9Ci0gIF9TVExQX1VOV0lORChfTV9kZXN0cm95X25vZGVzKF9fbnN0YXJ0LCBfX2N1cikpCi19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYyA+Ci12b2lkIF9EZXF1ZV9iYXNlPF9UcCxfQWxsb2M+OjpfTV9kZXN0cm95X25vZGVzKF9UcCoqIF9fbnN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVHAqKiBfX25maW5pc2gpIHsKLSAgZm9yIChfVHAqKiBfX24gPSBfX25zdGFydDsgX19uIDwgX19uZmluaXNoOyArK19fbikKLSAgICBfTV9tYXBfc2l6ZS5kZWFsbG9jYXRlKCpfX24sIHRoaXMtPmJ1ZmZlcl9zaXplKCkpOwotfQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BUUl9TUEVDSUFMSVpBVElPTlMpCi0jICBkZWZpbmUgZGVxdWUgX1NUTFBfUFRSX0lNUExfTkFNRShkZXF1ZSkKLSNlbGlmIGRlZmluZWQgKF9TVExQX0RFQlVHKQotIyAgZGVmaW5lIGRlcXVlIF9TVExQX05PTl9EQkdfTkFNRShkZXF1ZSkKLSNlbHNlCi1fU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX1NUTFBfTkVTVEVEX1RZUEVfUEFSQU1fQlVHKQotLy8gcXVhbGlmaWVkIHJlZmVyZW5jZXMKLSMgIGRlZmluZSBfX2l0ZXJhdG9yX18gICBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfTm9uY29uc3RfdHJhaXRzPF9UcD4gPgotIyAgZGVmaW5lIGNvbnN0X2l0ZXJhdG9yIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9Db25zdF90cmFpdHM8X1RwPiAgPgotIyAgZGVmaW5lIGl0ZXJhdG9yICAgICAgIF9faXRlcmF0b3JfXwotIyAgZGVmaW5lIHNpemVfdHlwZSAgICAgIHNpemVfdAotIyAgZGVmaW5lIHZhbHVlX3R5cGUgICAgIF9UcAotI2Vsc2UKLSMgIGRlZmluZSBfX2l0ZXJhdG9yX18gICBfU1RMUF9UWVBFTkFNRV9PTl9SRVRVUk5fVFlQRSBkZXF1ZTxfVHAsIF9BbGxvYz46Oml0ZXJhdG9yCi0jZW5kaWYKLQotdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jID4KLWRlcXVlPF9UcCwgX0FsbG9jID4mCi1kZXF1ZTxfVHAsIF9BbGxvYyA+OjpvcGVyYXRvcj0gKGNvbnN0IGRlcXVlPF9UcCwgX0FsbG9jID4mIF9feCkgewotICBjb25zdCBzaXplX3R5cGUgX19sZW4gPSBzaXplKCk7Ci0gIGlmICgmX194ICE9IHRoaXMpIHsKLSAgICBpZiAoX19sZW4gPj0gX194LnNpemUoKSkKLSAgICAgIGVyYXNlKGNvcHkoX194LmJlZ2luKCksIF9feC5lbmQoKSwgdGhpcy0+X01fc3RhcnQpLCB0aGlzLT5fTV9maW5pc2gpOwotICAgIGVsc2UgewotICAgICAgY29uc3RfaXRlcmF0b3IgX19taWQgPSBfX3guYmVnaW4oKSArIGRpZmZlcmVuY2VfdHlwZShfX2xlbik7Ci0gICAgICBjb3B5KF9feC5iZWdpbigpLCBfX21pZCwgdGhpcy0+X01fc3RhcnQpOwotICAgICAgaW5zZXJ0KHRoaXMtPl9NX2ZpbmlzaCwgX19taWQsIF9feC5lbmQoKSk7Ci0gICAgfQotICB9Ci0gIHJldHVybiAqdGhpczsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jID4KLXZvaWQgZGVxdWU8X1RwLCBfQWxsb2MgPjo6X01fZmlsbF9pbnNlcnQoaXRlcmF0b3IgX19wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkgewotICBpZiAoX19wb3MuX01fY3VyID09IHRoaXMtPl9NX3N0YXJ0Ll9NX2N1cikgewotICAgIGl0ZXJhdG9yIF9fbmV3X3N0YXJ0ID0gX01fcmVzZXJ2ZV9lbGVtZW50c19hdF9mcm9udChfX24pOwotICAgIF9TVExQX1RSWSB7Ci0gICAgICB1bmluaXRpYWxpemVkX2ZpbGwoX19uZXdfc3RhcnQsIHRoaXMtPl9NX3N0YXJ0LCBfX3gpOwotICAgIH0KLSAgICBfU1RMUF9VTldJTkQodGhpcy0+X01fZGVzdHJveV9ub2RlcyhfX25ld19zdGFydC5fTV9ub2RlLCB0aGlzLT5fTV9zdGFydC5fTV9ub2RlKSkKLSAgICB0aGlzLT5fTV9zdGFydCA9IF9fbmV3X3N0YXJ0OwotICB9Ci0gIGVsc2UgaWYgKF9fcG9zLl9NX2N1ciA9PSB0aGlzLT5fTV9maW5pc2guX01fY3VyKSB7Ci0gICAgaXRlcmF0b3IgX19uZXdfZmluaXNoID0gX01fcmVzZXJ2ZV9lbGVtZW50c19hdF9iYWNrKF9fbik7Ci0gICAgX1NUTFBfVFJZIHsKLSAgICAgIHVuaW5pdGlhbGl6ZWRfZmlsbCh0aGlzLT5fTV9maW5pc2gsIF9fbmV3X2ZpbmlzaCwgX194KTsKLSAgICB9Ci0gICAgX1NUTFBfVU5XSU5EKHRoaXMtPl9NX2Rlc3Ryb3lfbm9kZXModGhpcy0+X01fZmluaXNoLl9NX25vZGUrMSwgX19uZXdfZmluaXNoLl9NX25vZGUrMSkpCi0gICAgdGhpcy0+X01fZmluaXNoID0gX19uZXdfZmluaXNoOwotICB9Ci0gIGVsc2UKLSAgICBfTV9maWxsX2luc2VydF9hdXgoX19wb3MsIF9fbiwgX194LCBfTW92YWJsZSgpKTsKLX0KLQotI2lmICFkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2MgPgotdm9pZCBkZXF1ZTxfVHAsIF9BbGxvYz46Omluc2VydChpdGVyYXRvciBfX3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWVfdHlwZSogX19maXJzdCwgY29uc3QgdmFsdWVfdHlwZSogX19sYXN0KSB7Ci0gIHNpemVfdHlwZSBfX24gPSBfX2xhc3QgLSBfX2ZpcnN0OwotICBpZiAoX19wb3MuX01fY3VyID09IHRoaXMtPl9NX3N0YXJ0Ll9NX2N1cikgewotICAgIGl0ZXJhdG9yIF9fbmV3X3N0YXJ0ID0gX01fcmVzZXJ2ZV9lbGVtZW50c19hdF9mcm9udChfX24pOwotICAgIF9TVExQX1RSWSB7Ci0gICAgICBfU1RMUF9QUklWIF9fdWNvcHkoX19maXJzdCwgX19sYXN0LCBfX25ld19zdGFydCk7Ci0gICAgfQotICAgIF9TVExQX1VOV0lORCh0aGlzLT5fTV9kZXN0cm95X25vZGVzKF9fbmV3X3N0YXJ0Ll9NX25vZGUsIHRoaXMtPl9NX3N0YXJ0Ll9NX25vZGUpKQotICAgIHRoaXMtPl9NX3N0YXJ0ID0gX19uZXdfc3RhcnQ7Ci0gIH0KLSAgZWxzZSBpZiAoX19wb3MuX01fY3VyID09IHRoaXMtPl9NX2ZpbmlzaC5fTV9jdXIpIHsKLSAgICBpdGVyYXRvciBfX25ld19maW5pc2ggPSBfTV9yZXNlcnZlX2VsZW1lbnRzX2F0X2JhY2soX19uKTsKLSAgICBfU1RMUF9UUlkgewotICAgICAgX1NUTFBfUFJJViBfX3Vjb3B5KF9fZmlyc3QsIF9fbGFzdCwgdGhpcy0+X01fZmluaXNoKTsKLSAgICB9Ci0gICAgX1NUTFBfVU5XSU5EKHRoaXMtPl9NX2Rlc3Ryb3lfbm9kZXModGhpcy0+X01fZmluaXNoLl9NX25vZGUgKyAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbmV3X2ZpbmlzaC5fTV9ub2RlICsgMSkpCi0gICAgdGhpcy0+X01fZmluaXNoID0gX19uZXdfZmluaXNoOwotICB9Ci0gIGVsc2UKLSAgICBfTV9pbnNlcnRfcmFuZ2VfYXV4KF9fcG9zLCBfX2ZpcnN0LCBfX2xhc3QsIF9fbiwgX01vdmFibGUoKSk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYyA+Ci12b2lkIGRlcXVlPF9UcCxfQWxsb2M+OjppbnNlcnQoaXRlcmF0b3IgX19wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KSB7Ci0gIHNpemVfdHlwZSBfX24gPSBfX2xhc3QgLSBfX2ZpcnN0OwotICBpZiAoX19wb3MuX01fY3VyID09IHRoaXMtPl9NX3N0YXJ0Ll9NX2N1cikgewotICAgIGl0ZXJhdG9yIF9fbmV3X3N0YXJ0ID0gX01fcmVzZXJ2ZV9lbGVtZW50c19hdF9mcm9udChfX24pOwotICAgIF9TVExQX1RSWSB7Ci0gICAgICBfU1RMUF9QUklWIF9fdWNvcHkoX19maXJzdCwgX19sYXN0LCBfX25ld19zdGFydCk7Ci0gICAgfQotICAgIF9TVExQX1VOV0lORCh0aGlzLT5fTV9kZXN0cm95X25vZGVzKF9fbmV3X3N0YXJ0Ll9NX25vZGUsIHRoaXMtPl9NX3N0YXJ0Ll9NX25vZGUpKQotICAgIHRoaXMtPl9NX3N0YXJ0ID0gX19uZXdfc3RhcnQ7Ci0gIH0KLSAgZWxzZSBpZiAoX19wb3MuX01fY3VyID09IHRoaXMtPl9NX2ZpbmlzaC5fTV9jdXIpIHsKLSAgICBpdGVyYXRvciBfX25ld19maW5pc2ggPSBfTV9yZXNlcnZlX2VsZW1lbnRzX2F0X2JhY2soX19uKTsKLSAgICBfU1RMUF9UUlkgewotICAgICAgX1NUTFBfUFJJViBfX3Vjb3B5KF9fZmlyc3QsIF9fbGFzdCwgdGhpcy0+X01fZmluaXNoKTsKLSAgICB9Ci0gICAgX1NUTFBfVU5XSU5EKHRoaXMtPl9NX2Rlc3Ryb3lfbm9kZXModGhpcy0+X01fZmluaXNoLl9NX25vZGUgKyAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbmV3X2ZpbmlzaC5fTV9ub2RlICsgMSkpCi0gICAgdGhpcy0+X01fZmluaXNoID0gX19uZXdfZmluaXNoOwotICB9Ci0gIGVsc2UKLSAgICBfTV9pbnNlcnRfcmFuZ2VfYXV4KF9fcG9zLCBfX2ZpcnN0LCBfX2xhc3QsIF9fbiwgX01vdmFibGUoKSk7Ci19Ci0KLSNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCi0KLXRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYyA+Ci1fX2l0ZXJhdG9yX18gZGVxdWU8X1RwLF9BbGxvYz46Ol9NX2VyYXNlKGl0ZXJhdG9yIF9fcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX3RydWVfdHlwZSYgLypfTW92YWJsZSovKSB7Ci0gIGRpZmZlcmVuY2VfdHlwZSBfX2luZGV4ID0gX19wb3MgLSB0aGlzLT5fTV9zdGFydDsKLSAgaWYgKHNpemVfdHlwZShfX2luZGV4KSA8IHRoaXMtPnNpemUoKSA+PiAxKSB7Ci0gICAgLy9XZSBtb3ZlIHRoZSBzdGFydCBvZiB0aGUgZGVxdWUgb25lIHBvc2l0aW9uIHRvIHRoZSByaWdodAotICAgIC8vc3RhcnRpbmcgZnJvbSB0aGUgcmlnaHRtb3N0IGVsZW1lbnQgdG8gbW92ZS4KLSAgICBpdGVyYXRvciBfX3NyYyA9IF9fcG9zLCBfX2RzdCA9IF9fcG9zOwotICAgIF9TVExQX1NURDo6X0Rlc3Ryb3koJigqX19kc3QpKTsKLSAgICBpZiAoX19zcmMgIT0gdGhpcy0+X01fc3RhcnQpIHsKLSAgICAgIGZvciAoLS1fX3NyYzsgX19kc3QgIT0gdGhpcy0+X01fc3RhcnQ7IC0tX19zcmMsIC0tX19kc3QpIHsKLSAgICAgICAgX1NUTFBfU1REOjpfTW92ZV9Db25zdHJ1Y3QoJigqX19kc3QpLCAqX19zcmMpOwotICAgICAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95X01vdmVkKCYoKl9fc3JjKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIF9NX3BvcF9mcm9udF9hdXgoKTsKLSAgfQotICBlbHNlIHsKLSAgICBpdGVyYXRvciBfX3NyYyA9IF9fcG9zLCBfX2RzdCA9IF9fcG9zOwotICAgIF9TVExQX1NURDo6X0Rlc3Ryb3koJigqX19kc3QpKTsKLSAgICBmb3IgKCsrX19zcmM7IF9fc3JjICE9IHRoaXMtPl9NX2ZpbmlzaDsgKytfX3NyYywgKytfX2RzdCkgewotICAgICAgX1NUTFBfU1REOjpfTW92ZV9Db25zdHJ1Y3QoJigqX19kc3QpLCAqX19zcmMpOwotICAgICAgX1NUTFBfU1REOjpfRGVzdHJveV9Nb3ZlZCgmKCpfX3NyYykpOwotICAgIH0KLSAgICAvL0R1cGxpY2F0aW9uIG9mIHRoZSBwb3BfYmFjayBjb2RlIHdpdGhvdXQgdGhlIGRlc3Ryb3kgd2hpY2ggaGFzIGFscmVhZHkgYmVlbiBkb25lOgotICAgIGlmICh0aGlzLT5fTV9maW5pc2guX01fY3VyICE9IHRoaXMtPl9NX2ZpbmlzaC5fTV9maXJzdCkgewotICAgICAgLS10aGlzLT5fTV9maW5pc2guX01fY3VyOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIF9NX3BvcF9iYWNrX2F1eCgpOwotICAgIH0KLSAgfQotICByZXR1cm4gdGhpcy0+X01fc3RhcnQgKyBfX2luZGV4OwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2MgPgotX19pdGVyYXRvcl9fIGRlcXVlPF9UcCxfQWxsb2M+OjpfTV9lcmFzZShpdGVyYXRvciBfX3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19mYWxzZV90eXBlJiAvKl9Nb3ZhYmxlKi8pIHsKLSAgaXRlcmF0b3IgX19uZXh0ID0gX19wb3M7Ci0gICsrX19uZXh0OwotICBkaWZmZXJlbmNlX3R5cGUgX19pbmRleCA9IF9fcG9zIC0gdGhpcy0+X01fc3RhcnQ7Ci0gIGlmIChzaXplX3R5cGUoX19pbmRleCkgPCB0aGlzLT5zaXplKCkgPj4gMSkgewotICAgIGNvcHlfYmFja3dhcmQodGhpcy0+X01fc3RhcnQsIF9fcG9zLCBfX25leHQpOwotICAgIHBvcF9mcm9udCgpOwotICB9Ci0gIGVsc2UgewotICAgIGNvcHkoX19uZXh0LCB0aGlzLT5fTV9maW5pc2gsIF9fcG9zKTsKLSAgICBwb3BfYmFjaygpOwotICB9Ci0gIHJldHVybiB0aGlzLT5fTV9zdGFydCArIF9faW5kZXg7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYyA+Ci1fX2l0ZXJhdG9yX18gZGVxdWU8X1RwLF9BbGxvYz46Ol9NX2VyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX190cnVlX3R5cGUmIC8qX01vdmFibGUqLykgewotICBkaWZmZXJlbmNlX3R5cGUgX19uID0gX19sYXN0IC0gX19maXJzdDsKLSAgZGlmZmVyZW5jZV90eXBlIF9fZWxlbXNfYmVmb3JlID0gX19maXJzdCAtIHRoaXMtPl9NX3N0YXJ0OwotICBpZiAoX19lbGVtc19iZWZvcmUgPD0gZGlmZmVyZW5jZV90eXBlKHRoaXMtPnNpemUoKSAtIF9fbikgLyAyKSB7Ci0gICAgaXRlcmF0b3IgX19zcmMgPSBfX2ZpcnN0LCBfX2RzdCA9IF9fbGFzdDsKLSAgICBpZiAoX19zcmMgIT0gdGhpcy0+X01fc3RhcnQpIHsKLSAgICAgIGZvciAoLS1fX3NyYywgLS1fX2RzdDsgKF9fc3JjID49IHRoaXMtPl9NX3N0YXJ0KSAmJiAoX19kc3QgPj0gX19maXJzdCk7IC0tX19zcmMsIC0tX19kc3QpIHsKLSAgICAgICAgX1NUTFBfU1REOjpfRGVzdHJveSgmKCpfX2RzdCkpOwotICAgICAgICBfU1RMUF9TVEQ6Ol9Nb3ZlX0NvbnN0cnVjdCgmKCpfX2RzdCksICpfX3NyYyk7Ci0gICAgICB9Ci0gICAgICBpZiAoX19kc3QgPj0gX19maXJzdCkgewotICAgICAgICAvL1RoZXJlIGFyZSBtb3JlIGVsZW1lbnRzIHRvIGVyYXNlIHRoYW4gZWxlbWVudHMgdG8gbW92ZQotICAgICAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95X1JhbmdlKF9fZmlyc3QsICsrX19kc3QpOwotICAgICAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95X01vdmVkX1JhbmdlKHRoaXMtPl9NX3N0YXJ0LCBfX2ZpcnN0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICAvL1RoZXJlIGFyZSBtb3JlIGVsZW1lbnRzIHRvIG1vdmUgdGhhbiBlbGVtZW50cyB0byBlcmFzZQotICAgICAgICBmb3IgKDsgX19zcmMgPj0gdGhpcy0+X01fc3RhcnQ7IC0tX19zcmMsIC0tX19kc3QpIHsKLSAgICAgICAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95X01vdmVkKCYoKl9fZHN0KSk7Ci0gICAgICAgICAgX1NUTFBfU1REOjpfTW92ZV9Db25zdHJ1Y3QoJigqX19kc3QpLCAqX19zcmMpOwotICAgICAgICB9Ci0gICAgICAgIF9TVExQX1NURDo6X0Rlc3Ryb3lfTW92ZWRfUmFuZ2UodGhpcy0+X01fc3RhcnQsICsrX19kc3QpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIF9TVExQX1NURDo6X0Rlc3Ryb3lfUmFuZ2UodGhpcy0+X01fc3RhcnQsIF9fbGFzdCk7Ci0gICAgfQotICAgIGl0ZXJhdG9yIF9fbmV3X3N0YXJ0ID0gdGhpcy0+X01fc3RhcnQgKyBfX247Ci0gICAgdGhpcy0+X01fZGVzdHJveV9ub2Rlcyh0aGlzLT5fTV9zdGFydC5fTV9ub2RlLCBfX25ld19zdGFydC5fTV9ub2RlKTsKLSAgICB0aGlzLT5fTV9zdGFydCA9IF9fbmV3X3N0YXJ0OwotICB9Ci0gIGVsc2UgewotICAgIGlmIChfX2xhc3QgIT0gdGhpcy0+X01fZmluaXNoKSB7Ci0gICAgICBpdGVyYXRvciBfX3NyYyA9IF9fbGFzdCwgX19kc3QgPSBfX2ZpcnN0OwotICAgICAgZm9yICg7IChfX3NyYyAhPSB0aGlzLT5fTV9maW5pc2gpICYmIChfX2RzdCAhPSBfX2xhc3QpOyArK19fc3JjLCArK19fZHN0KSB7Ci0gICAgICAgIF9TVExQX1NURDo6X0Rlc3Ryb3koJigqX19kc3QpKTsKLSAgICAgICAgX1NUTFBfU1REOjpfTW92ZV9Db25zdHJ1Y3QoJigqX19kc3QpLCAqX19zcmMpOwotICAgICAgfQotICAgICAgaWYgKF9fZHN0ICE9IF9fbGFzdCkgewotICAgICAgICAvL1RoZXJlIGFyZSBtb3JlIGVsZW1lbnRzIHRvIGVyYXNlIHRoYW4gZWxlbWVudHMgdG8gbW92ZQotICAgICAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95X1JhbmdlKF9fZHN0LCBfX2xhc3QpOwotICAgICAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95X01vdmVkX1JhbmdlKF9fbGFzdCwgdGhpcy0+X01fZmluaXNoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICAvL1RoZXJlIGFyZSBtb3JlIGVsZW1lbnRzIHRvIG1vdmUgdGhhbiBlbGVtZW50cyB0byBlcmFzZQotICAgICAgICBmb3IgKDsgX19zcmMgIT0gdGhpcy0+X01fZmluaXNoOyArK19fc3JjLCArK19fZHN0KSB7Ci0gICAgICAgICAgX1NUTFBfU1REOjpfRGVzdHJveV9Nb3ZlZCgmKCpfX2RzdCkpOwotICAgICAgICAgIF9TVExQX1NURDo6X01vdmVfQ29uc3RydWN0KCYoKl9fZHN0KSwgKl9fc3JjKTsKLSAgICAgICAgfQotICAgICAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95X01vdmVkX1JhbmdlKF9fZHN0LCB0aGlzLT5fTV9maW5pc2gpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIF9TVExQX1NURDo6X0Rlc3Ryb3lfUmFuZ2UoX19maXJzdCwgdGhpcy0+X01fZmluaXNoKTsKLSAgICB9Ci0gICAgaXRlcmF0b3IgX19uZXdfZmluaXNoID0gdGhpcy0+X01fZmluaXNoIC0gX19uOwotICAgIHRoaXMtPl9NX2Rlc3Ryb3lfbm9kZXMoX19uZXdfZmluaXNoLl9NX25vZGUgKyAxLCB0aGlzLT5fTV9maW5pc2guX01fbm9kZSArIDEpOwotICAgIHRoaXMtPl9NX2ZpbmlzaCA9IF9fbmV3X2ZpbmlzaDsKLSAgfQotICByZXR1cm4gdGhpcy0+X01fc3RhcnQgKyBfX2VsZW1zX2JlZm9yZTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jID4KLV9faXRlcmF0b3JfXyBkZXF1ZTxfVHAsX0FsbG9jPjo6X01fZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qX01vdmFibGUqLykgewotICBkaWZmZXJlbmNlX3R5cGUgX19uID0gX19sYXN0IC0gX19maXJzdDsKLSAgZGlmZmVyZW5jZV90eXBlIF9fZWxlbXNfYmVmb3JlID0gX19maXJzdCAtIHRoaXMtPl9NX3N0YXJ0OwotICBpZiAoX19lbGVtc19iZWZvcmUgPD0gZGlmZmVyZW5jZV90eXBlKHRoaXMtPnNpemUoKSAtIF9fbikgLyAyKSB7Ci0gICAgY29weV9iYWNrd2FyZCh0aGlzLT5fTV9zdGFydCwgX19maXJzdCwgX19sYXN0KTsKLSAgICBpdGVyYXRvciBfX25ld19zdGFydCA9IHRoaXMtPl9NX3N0YXJ0ICsgX19uOwotICAgIF9TVExQX1NURDo6X0Rlc3Ryb3lfUmFuZ2UodGhpcy0+X01fc3RhcnQsIF9fbmV3X3N0YXJ0KTsKLSAgICB0aGlzLT5fTV9kZXN0cm95X25vZGVzKHRoaXMtPl9NX3N0YXJ0Ll9NX25vZGUsIF9fbmV3X3N0YXJ0Ll9NX25vZGUpOwotICAgIHRoaXMtPl9NX3N0YXJ0ID0gX19uZXdfc3RhcnQ7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgY29weShfX2xhc3QsIHRoaXMtPl9NX2ZpbmlzaCwgX19maXJzdCk7Ci0gICAgaXRlcmF0b3IgX19uZXdfZmluaXNoID0gdGhpcy0+X01fZmluaXNoIC0gX19uOwotICAgIF9TVExQX1NURDo6X0Rlc3Ryb3lfUmFuZ2UoX19uZXdfZmluaXNoLCB0aGlzLT5fTV9maW5pc2gpOwotICAgIHRoaXMtPl9NX2Rlc3Ryb3lfbm9kZXMoX19uZXdfZmluaXNoLl9NX25vZGUgKyAxLCB0aGlzLT5fTV9maW5pc2guX01fbm9kZSArIDEpOwotICAgIHRoaXMtPl9NX2ZpbmlzaCA9IF9fbmV3X2ZpbmlzaDsKLSAgfQotICByZXR1cm4gdGhpcy0+X01fc3RhcnQgKyBfX2VsZW1zX2JlZm9yZTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jID4KLXZvaWQgZGVxdWU8X1RwLF9BbGxvYz46OmNsZWFyKCkgewotICBmb3IgKF9NYXBfcG9pbnRlciBfX25vZGUgPSB0aGlzLT5fTV9zdGFydC5fTV9ub2RlICsgMTsKLSAgICAgICBfX25vZGUgPCB0aGlzLT5fTV9maW5pc2guX01fbm9kZTsKLSAgICAgICArK19fbm9kZSkgewotICAgIF9TVExQX1NURDo6X0Rlc3Ryb3lfUmFuZ2UoKl9fbm9kZSwgKl9fbm9kZSArIHRoaXMtPmJ1ZmZlcl9zaXplKCkpOwotICAgIHRoaXMtPl9NX21hcF9zaXplLmRlYWxsb2NhdGUoKl9fbm9kZSwgdGhpcy0+YnVmZmVyX3NpemUoKSk7Ci0gIH0KLQotICBpZiAodGhpcy0+X01fc3RhcnQuX01fbm9kZSAhPSB0aGlzLT5fTV9maW5pc2guX01fbm9kZSkgewotICAgIF9TVExQX1NURDo6X0Rlc3Ryb3lfUmFuZ2UodGhpcy0+X01fc3RhcnQuX01fY3VyLCB0aGlzLT5fTV9zdGFydC5fTV9sYXN0KTsKLSAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95X1JhbmdlKHRoaXMtPl9NX2ZpbmlzaC5fTV9maXJzdCwgdGhpcy0+X01fZmluaXNoLl9NX2N1cik7Ci0gICAgdGhpcy0+X01fbWFwX3NpemUuZGVhbGxvY2F0ZSh0aGlzLT5fTV9maW5pc2guX01fZmlyc3QsIHRoaXMtPmJ1ZmZlcl9zaXplKCkpOwotICB9Ci0gIGVsc2UKLSAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95X1JhbmdlKHRoaXMtPl9NX3N0YXJ0Ll9NX2N1ciwgdGhpcy0+X01fZmluaXNoLl9NX2N1cik7Ci0KLSAgdGhpcy0+X01fZmluaXNoID0gdGhpcy0+X01fc3RhcnQ7Ci19Ci0KLS8vIFByZWNvbmRpdGlvbjogdGhpcy0+X01fc3RhcnQgYW5kIHRoaXMtPl9NX2ZpbmlzaCBoYXZlIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCwKLS8vIGJ1dCBub25lIG9mIHRoZSBkZXF1ZSdzIGVsZW1lbnRzIGhhdmUgeWV0IGJlZW4gY29uc3RydWN0ZWQuCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2MgPgotdm9pZCBkZXF1ZTxfVHAsX0FsbG9jPjo6X01fZmlsbF9pbml0aWFsaXplKGNvbnN0IHZhbHVlX3R5cGUmIF9fdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypfVHJpdmlhbEluaXQqLykgewotICBfTWFwX3BvaW50ZXIgX19jdXIgPSB0aGlzLT5fTV9zdGFydC5fTV9ub2RlOwotICBfU1RMUF9UUlkgewotICAgIGZvciAoOyBfX2N1ciA8IHRoaXMtPl9NX2ZpbmlzaC5fTV9ub2RlOyArK19fY3VyKQotICAgICAgdW5pbml0aWFsaXplZF9maWxsKCpfX2N1ciwgKl9fY3VyICsgdGhpcy0+YnVmZmVyX3NpemUoKSwgX192YWwpOwotICAgIHVuaW5pdGlhbGl6ZWRfZmlsbCh0aGlzLT5fTV9maW5pc2guX01fZmlyc3QsIHRoaXMtPl9NX2ZpbmlzaC5fTV9jdXIsIF9fdmFsKTsKLSAgfQotICBfU1RMUF9VTldJTkQoX1NUTFBfU1REOjpfRGVzdHJveV9SYW5nZSh0aGlzLT5fTV9zdGFydCwgaXRlcmF0b3IoKl9fY3VyLCBfX2N1cikpKQotfQotCi0KLS8vIENhbGxlZCBvbmx5IGlmIHRoaXMtPl9NX2ZpbmlzaC5fTV9jdXIgPT0gdGhpcy0+X01fZmluaXNoLl9NX2xhc3QgLSAxLgotdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jID4KLXZvaWQgZGVxdWU8X1RwLF9BbGxvYz46Ol9NX3B1c2hfYmFja19hdXhfdihjb25zdCB2YWx1ZV90eXBlJiBfX3QpIHsKLSAgX01fcmVzZXJ2ZV9tYXBfYXRfYmFjaygpOwotICAqKHRoaXMtPl9NX2ZpbmlzaC5fTV9ub2RlICsgMSkgPSB0aGlzLT5fTV9tYXBfc2l6ZS5hbGxvY2F0ZSh0aGlzLT5idWZmZXJfc2l6ZSgpKTsKLSAgX1NUTFBfVFJZIHsKLSAgICBfQ29weV9Db25zdHJ1Y3QodGhpcy0+X01fZmluaXNoLl9NX2N1ciwgX190KTsKLSAgICB0aGlzLT5fTV9maW5pc2guX01fc2V0X25vZGUodGhpcy0+X01fZmluaXNoLl9NX25vZGUgKyAxKTsKLSAgICB0aGlzLT5fTV9maW5pc2guX01fY3VyID0gdGhpcy0+X01fZmluaXNoLl9NX2ZpcnN0OwotICB9Ci0gIF9TVExQX1VOV0lORCh0aGlzLT5fTV9tYXBfc2l6ZS5kZWFsbG9jYXRlKCoodGhpcy0+X01fZmluaXNoLl9NX25vZGUgKyAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+YnVmZmVyX3NpemUoKSkpCi19Ci0KLSNpZiBkZWZpbmVkKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pICYmICFkZWZpbmVkKF9TVExQX05PX0FOQUNIUk9OSVNNUykKLS8vIENhbGxlZCBvbmx5IGlmIHRoaXMtPl9NX2ZpbmlzaC5fTV9jdXIgPT0gdGhpcy0+X01fZmluaXNoLl9NX2xhc3QgLSAxLgotdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jID4KLXZvaWQgZGVxdWU8X1RwLF9BbGxvYz46Ol9NX3B1c2hfYmFja19hdXgoKSB7Ci0gIF9NX3Jlc2VydmVfbWFwX2F0X2JhY2soKTsKLSAgKih0aGlzLT5fTV9maW5pc2guX01fbm9kZSArIDEpID0gdGhpcy0+X01fbWFwX3NpemUuYWxsb2NhdGUodGhpcy0+YnVmZmVyX3NpemUoKSk7Ci0gIF9TVExQX1RSWSB7Ci0gICAgX1NUTFBfU1REOjpfQ29uc3RydWN0KHRoaXMtPl9NX2ZpbmlzaC5fTV9jdXIpOwotICAgIHRoaXMtPl9NX2ZpbmlzaC5fTV9zZXRfbm9kZSh0aGlzLT5fTV9maW5pc2guX01fbm9kZSArIDEpOwotICAgIHRoaXMtPl9NX2ZpbmlzaC5fTV9jdXIgPSB0aGlzLT5fTV9maW5pc2guX01fZmlyc3Q7Ci0gIH0KLSAgX1NUTFBfVU5XSU5EKHRoaXMtPl9NX21hcF9zaXplLmRlYWxsb2NhdGUoKih0aGlzLT5fTV9maW5pc2guX01fbm9kZSArIDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5idWZmZXJfc2l6ZSgpKSkKLX0KLSNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0gJiYgIV9TVExQX05PX0FOQUNIUk9OSVNNUyovCi0KLS8vIENhbGxlZCBvbmx5IGlmIHRoaXMtPl9NX3N0YXJ0Ll9NX2N1ciA9PSB0aGlzLT5fTV9zdGFydC5fTV9maXJzdC4KLXRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYyA+Ci12b2lkIGRlcXVlPF9UcCxfQWxsb2M+OjpfTV9wdXNoX2Zyb250X2F1eF92KGNvbnN0IHZhbHVlX3R5cGUmIF9fdCkgewotICBfTV9yZXNlcnZlX21hcF9hdF9mcm9udCgpOwotICAqKHRoaXMtPl9NX3N0YXJ0Ll9NX25vZGUgLSAxKSA9IHRoaXMtPl9NX21hcF9zaXplLmFsbG9jYXRlKHRoaXMtPmJ1ZmZlcl9zaXplKCkpOwotICBfU1RMUF9UUlkgewotICAgIHRoaXMtPl9NX3N0YXJ0Ll9NX3NldF9ub2RlKHRoaXMtPl9NX3N0YXJ0Ll9NX25vZGUgLSAxKTsKLSAgICB0aGlzLT5fTV9zdGFydC5fTV9jdXIgPSB0aGlzLT5fTV9zdGFydC5fTV9sYXN0IC0gMTsKLSAgICBfQ29weV9Db25zdHJ1Y3QodGhpcy0+X01fc3RhcnQuX01fY3VyLCBfX3QpOwotICB9Ci0gIF9TVExQX1VOV0lORCgoKyt0aGlzLT5fTV9zdGFydCwKLSAgICAgICAgICAgICAgICB0aGlzLT5fTV9tYXBfc2l6ZS5kZWFsbG9jYXRlKCoodGhpcy0+X01fc3RhcnQuX01fbm9kZSAtIDEpLCB0aGlzLT5idWZmZXJfc2l6ZSgpKSkpCi19Ci0KLQotI2lmIGRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pICYmICFkZWZpbmVkIChfU1RMUF9OT19BTkFDSFJPTklTTVMpCi0vLyBDYWxsZWQgb25seSBpZiB0aGlzLT5fTV9zdGFydC5fTV9jdXIgPT0gdGhpcy0+X01fc3RhcnQuX01fZmlyc3QuCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2MgPgotdm9pZCBkZXF1ZTxfVHAsX0FsbG9jPjo6X01fcHVzaF9mcm9udF9hdXgoKSB7Ci0gIF9NX3Jlc2VydmVfbWFwX2F0X2Zyb250KCk7Ci0gICoodGhpcy0+X01fc3RhcnQuX01fbm9kZSAtIDEpID0gdGhpcy0+X01fbWFwX3NpemUuYWxsb2NhdGUodGhpcy0+YnVmZmVyX3NpemUoKSk7Ci0gIF9TVExQX1RSWSB7Ci0gICAgdGhpcy0+X01fc3RhcnQuX01fc2V0X25vZGUodGhpcy0+X01fc3RhcnQuX01fbm9kZSAtIDEpOwotICAgIHRoaXMtPl9NX3N0YXJ0Ll9NX2N1ciA9IHRoaXMtPl9NX3N0YXJ0Ll9NX2xhc3QgLSAxOwotICAgIF9TVExQX1NURDo6X0NvbnN0cnVjdCh0aGlzLT5fTV9zdGFydC5fTV9jdXIpOwotICB9Ci0gIF9TVExQX1VOV0lORCgoKyt0aGlzLT5fTV9zdGFydCwgdGhpcy0+X01fbWFwX3NpemUuZGVhbGxvY2F0ZSgqKHRoaXMtPl9NX3N0YXJ0Ll9NX25vZGUgLSAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPmJ1ZmZlcl9zaXplKCkpKSkKLX0KLSNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0gJiYgIV9TVExQX05PX0FOQUNIUk9OSVNNUyovCi0KLS8vIENhbGxlZCBvbmx5IGlmIHRoaXMtPl9NX2ZpbmlzaC5fTV9jdXIgPT0gdGhpcy0+X01fZmluaXNoLl9NX2ZpcnN0LgotdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jID4KLXZvaWQgZGVxdWU8X1RwLF9BbGxvYz46Ol9NX3BvcF9iYWNrX2F1eCgpIHsKLSAgdGhpcy0+X01fbWFwX3NpemUuZGVhbGxvY2F0ZSh0aGlzLT5fTV9maW5pc2guX01fZmlyc3QsIHRoaXMtPmJ1ZmZlcl9zaXplKCkpOwotICB0aGlzLT5fTV9maW5pc2guX01fc2V0X25vZGUodGhpcy0+X01fZmluaXNoLl9NX25vZGUgLSAxKTsKLSAgdGhpcy0+X01fZmluaXNoLl9NX2N1ciA9IHRoaXMtPl9NX2ZpbmlzaC5fTV9sYXN0IC0gMTsKLX0KLQotLy8gTm90ZSB0aGF0IGlmIHRoZSBkZXF1ZSBoYXMgYXQgbGVhc3Qgb25lIGVsZW1lbnQgKGEgcHJlY29uZGl0aW9uIGZvciB0aGlzIG1lbWJlcgotLy8gZnVuY3Rpb24pLCBhbmQgaWYgdGhpcy0+X01fc3RhcnQuX01fY3VyID09IHRoaXMtPl9NX3N0YXJ0Ll9NX2xhc3QsIHRoZW4gdGhlIGRlcXVlCi0vLyBtdXN0IGhhdmUgYXQgbGVhc3QgdHdvIG5vZGVzLgotdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jID4KLXZvaWQgZGVxdWU8X1RwLF9BbGxvYz46Ol9NX3BvcF9mcm9udF9hdXgoKSB7Ci0gIGlmICh0aGlzLT5fTV9zdGFydC5fTV9jdXIgIT0gdGhpcy0+X01fc3RhcnQuX01fbGFzdCAtIDEpCi0gICAgKyt0aGlzLT5fTV9zdGFydC5fTV9jdXI7Ci0gIGVsc2UgewotICAgIHRoaXMtPl9NX21hcF9zaXplLmRlYWxsb2NhdGUodGhpcy0+X01fc3RhcnQuX01fZmlyc3QsIHRoaXMtPmJ1ZmZlcl9zaXplKCkpOwotICAgIHRoaXMtPl9NX3N0YXJ0Ll9NX3NldF9ub2RlKHRoaXMtPl9NX3N0YXJ0Ll9NX25vZGUgKyAxKTsKLSAgICB0aGlzLT5fTV9zdGFydC5fTV9jdXIgPSB0aGlzLT5fTV9zdGFydC5fTV9maXJzdDsKLSAgfQotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2MgPgotX19pdGVyYXRvcl9fIGRlcXVlPF9UcCxfQWxsb2M+OjpfTV9maWxsX2luc2VydF9hdXgoaXRlcmF0b3IgX19wb3MsIHNpemVfdHlwZSBfX24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZV90eXBlJiBfX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX3RydWVfdHlwZSYgLypfTW92YWJsZSovKSB7Ci0gIGNvbnN0IGRpZmZlcmVuY2VfdHlwZSBfX2VsZW1zX2JlZm9yZSA9IF9fcG9zIC0gdGhpcy0+X01fc3RhcnQ7Ci0gIHNpemVfdHlwZSBfX2xlbmd0aCA9IHRoaXMtPnNpemUoKTsKLSAgdmFsdWVfdHlwZSBfX3hfY29weSA9IF9feDsKLSAgaWYgKF9fZWxlbXNfYmVmb3JlIDw9IGRpZmZlcmVuY2VfdHlwZShfX2xlbmd0aCAvIDIpKSB7Ci0gICAgaXRlcmF0b3IgX19uZXdfc3RhcnQgPSBfTV9yZXNlcnZlX2VsZW1lbnRzX2F0X2Zyb250KF9fbik7Ci0gICAgX19wb3MgPSB0aGlzLT5fTV9zdGFydCArIF9fZWxlbXNfYmVmb3JlOwotICAgIF9TVExQX1RSWSB7Ci0gICAgICBpdGVyYXRvciBfX2RzdCA9IF9fbmV3X3N0YXJ0OwotICAgICAgaXRlcmF0b3IgX19zcmMgPSB0aGlzLT5fTV9zdGFydDsKLSAgICAgIGZvciAoOyBfX3NyYyAhPSBfX3BvczsgKytfX2RzdCwgKytfX3NyYykgewotICAgICAgICBfU1RMUF9TVEQ6Ol9Nb3ZlX0NvbnN0cnVjdCgmKCpfX2RzdCksICpfX3NyYyk7Ci0gICAgICAgIF9TVExQX1NURDo6X0Rlc3Ryb3lfTW92ZWQoJigqX19zcmMpKTsKLSAgICAgIH0KLSAgICAgIHRoaXMtPl9NX3N0YXJ0ID0gX19uZXdfc3RhcnQ7Ci0gICAgICB1bmluaXRpYWxpemVkX2ZpbGwoX19kc3QsIF9fc3JjLCBfX3hfY29weSk7Ci0gICAgICBfX3BvcyA9IF9fZHN0OwotICAgIH0KLSAgICBfU1RMUF9VTldJTkQodGhpcy0+X01fZGVzdHJveV9ub2RlcyhfX25ld19zdGFydC5fTV9ub2RlLCB0aGlzLT5fTV9zdGFydC5fTV9ub2RlKSkKLSAgfQotICBlbHNlIHsKLSAgICBpdGVyYXRvciBfX25ld19maW5pc2ggPSBfTV9yZXNlcnZlX2VsZW1lbnRzX2F0X2JhY2soX19uKTsKLSAgICBjb25zdCBkaWZmZXJlbmNlX3R5cGUgX19lbGVtc19hZnRlciA9IGRpZmZlcmVuY2VfdHlwZShfX2xlbmd0aCkgLSBfX2VsZW1zX2JlZm9yZTsKLSAgICBfX3BvcyA9IHRoaXMtPl9NX2ZpbmlzaCAtIF9fZWxlbXNfYWZ0ZXI7Ci0gICAgX1NUTFBfVFJZIHsKLSAgICAgIGl0ZXJhdG9yIF9fZHN0ID0gX19uZXdfZmluaXNoOwotICAgICAgaXRlcmF0b3IgX19zcmMgPSB0aGlzLT5fTV9maW5pc2g7Ci0gICAgICBmb3IgKC0tX19zcmMsIC0tX19kc3Q7IF9fc3JjID49IF9fcG9zOyAtLV9fc3JjLCAtLV9fZHN0KSB7Ci0gICAgICAgIF9TVExQX1NURDo6X01vdmVfQ29uc3RydWN0KCYoKl9fZHN0KSwgKl9fc3JjKTsKLSAgICAgICAgX1NUTFBfU1REOjpfRGVzdHJveV9Nb3ZlZCgmKCpfX3NyYykpOwotICAgICAgfQotICAgICAgdGhpcy0+X01fZmluaXNoID0gX19uZXdfZmluaXNoOwotICAgICAgdW5pbml0aWFsaXplZF9maWxsKF9fcG9zLCBfX3BvcyArIF9fbiwgX194X2NvcHkpOwotICAgIH0KLSAgICBfU1RMUF9VTldJTkQodGhpcy0+X01fZGVzdHJveV9ub2Rlcyh0aGlzLT5fTV9maW5pc2guX01fbm9kZSArIDEsIF9fbmV3X2ZpbmlzaC5fTV9ub2RlICsgMSkpCi0gIH0KLSAgcmV0dXJuIF9fcG9zOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2MgPgotX19pdGVyYXRvcl9fIGRlcXVlPF9UcCxfQWxsb2M+OjpfTV9maWxsX2luc2VydF9hdXgoaXRlcmF0b3IgX19wb3MsIHNpemVfdHlwZSBfX24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZV90eXBlJiBfX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qX01vdmFibGUqLykgewotICBjb25zdCBkaWZmZXJlbmNlX3R5cGUgX19lbGVtc19iZWZvcmUgPSBfX3BvcyAtIHRoaXMtPl9NX3N0YXJ0OwotICBzaXplX3R5cGUgX19sZW5ndGggPSB0aGlzLT5zaXplKCk7Ci0gIHZhbHVlX3R5cGUgX194X2NvcHkgPSBfX3g7Ci0gIGlmIChfX2VsZW1zX2JlZm9yZSA8PSBkaWZmZXJlbmNlX3R5cGUoX19sZW5ndGggLyAyKSkgewotICAgIGl0ZXJhdG9yIF9fbmV3X3N0YXJ0ID0gX01fcmVzZXJ2ZV9lbGVtZW50c19hdF9mcm9udChfX24pOwotICAgIGl0ZXJhdG9yIF9fb2xkX3N0YXJ0ID0gdGhpcy0+X01fc3RhcnQ7Ci0gICAgX19wb3MgPSB0aGlzLT5fTV9zdGFydCArIF9fZWxlbXNfYmVmb3JlOwotICAgIF9TVExQX1RSWSB7Ci0gICAgICBpZiAoX19lbGVtc19iZWZvcmUgPj0gZGlmZmVyZW5jZV90eXBlKF9fbikpIHsKLSAgICAgICAgaXRlcmF0b3IgX19zdGFydF9uID0gdGhpcy0+X01fc3RhcnQgKyBkaWZmZXJlbmNlX3R5cGUoX19uKTsKLSAgICAgICAgX1NUTFBfUFJJViBfX3Vjb3B5KHRoaXMtPl9NX3N0YXJ0LCBfX3N0YXJ0X24sIF9fbmV3X3N0YXJ0KTsKLSAgICAgICAgdGhpcy0+X01fc3RhcnQgPSBfX25ld19zdGFydDsKLSAgICAgICAgY29weShfX3N0YXJ0X24sIF9fcG9zLCBfX29sZF9zdGFydCk7Ci0gICAgICAgIGZpbGwoX19wb3MgLSBkaWZmZXJlbmNlX3R5cGUoX19uKSwgX19wb3MsIF9feF9jb3B5KTsKLSAgICAgICAgX19wb3MgLT0gZGlmZmVyZW5jZV90eXBlKF9fbik7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgX1NUTFBfUFJJViBfX3VuaW5pdGlhbGl6ZWRfY29weV9maWxsKHRoaXMtPl9NX3N0YXJ0LCBfX3BvcywgX19uZXdfc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5fTV9zdGFydCwgX194X2NvcHkpOwotICAgICAgICB0aGlzLT5fTV9zdGFydCA9IF9fbmV3X3N0YXJ0OwotICAgICAgICBmaWxsKF9fb2xkX3N0YXJ0LCBfX3BvcywgX194X2NvcHkpOwotICAgICAgfQotICAgIH0KLSAgICBfU1RMUF9VTldJTkQodGhpcy0+X01fZGVzdHJveV9ub2RlcyhfX25ld19zdGFydC5fTV9ub2RlLCB0aGlzLT5fTV9zdGFydC5fTV9ub2RlKSkKLSAgfQotICBlbHNlIHsKLSAgICBpdGVyYXRvciBfX25ld19maW5pc2ggPSBfTV9yZXNlcnZlX2VsZW1lbnRzX2F0X2JhY2soX19uKTsKLSAgICBpdGVyYXRvciBfX29sZF9maW5pc2ggPSB0aGlzLT5fTV9maW5pc2g7Ci0gICAgY29uc3QgZGlmZmVyZW5jZV90eXBlIF9fZWxlbXNfYWZ0ZXIgPQotICAgICAgZGlmZmVyZW5jZV90eXBlKF9fbGVuZ3RoKSAtIF9fZWxlbXNfYmVmb3JlOwotICAgIF9fcG9zID0gdGhpcy0+X01fZmluaXNoIC0gX19lbGVtc19hZnRlcjsKLSAgICBfU1RMUF9UUlkgewotICAgICAgaWYgKF9fZWxlbXNfYWZ0ZXIgPiBkaWZmZXJlbmNlX3R5cGUoX19uKSkgewotICAgICAgICBpdGVyYXRvciBfX2ZpbmlzaF9uID0gdGhpcy0+X01fZmluaXNoIC0gZGlmZmVyZW5jZV90eXBlKF9fbik7Ci0gICAgICAgIF9TVExQX1BSSVYgX191Y29weShfX2ZpbmlzaF9uLCB0aGlzLT5fTV9maW5pc2gsIHRoaXMtPl9NX2ZpbmlzaCk7Ci0gICAgICAgIHRoaXMtPl9NX2ZpbmlzaCA9IF9fbmV3X2ZpbmlzaDsKLSAgICAgICAgY29weV9iYWNrd2FyZChfX3BvcywgX19maW5pc2hfbiwgX19vbGRfZmluaXNoKTsKLSAgICAgICAgZmlsbChfX3BvcywgX19wb3MgKyBkaWZmZXJlbmNlX3R5cGUoX19uKSwgX194X2NvcHkpOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIF9TVExQX1BSSVYgX191bmluaXRpYWxpemVkX2ZpbGxfY29weSh0aGlzLT5fTV9maW5pc2gsIF9fcG9zICsgZGlmZmVyZW5jZV90eXBlKF9fbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3hfY29weSwgX19wb3MsIHRoaXMtPl9NX2ZpbmlzaCk7Ci0gICAgICAgIHRoaXMtPl9NX2ZpbmlzaCA9IF9fbmV3X2ZpbmlzaDsKLSAgICAgICAgZmlsbChfX3BvcywgX19vbGRfZmluaXNoLCBfX3hfY29weSk7Ci0gICAgICB9Ci0gICAgfQotICAgIF9TVExQX1VOV0lORCh0aGlzLT5fTV9kZXN0cm95X25vZGVzKHRoaXMtPl9NX2ZpbmlzaC5fTV9ub2RlICsgMSwgX19uZXdfZmluaXNoLl9NX25vZGUgKyAxKSkKLSAgfQotICByZXR1cm4gX19wb3M7Ci19Ci0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKLXRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYyA+Ci12b2lkIGRlcXVlPF9UcCxfQWxsb2M+OjpfTV9pbnNlcnRfcmFuZ2VfYXV4KGl0ZXJhdG9yIF9fcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZV90eXBlKiBfX2ZpcnN0LCBjb25zdCB2YWx1ZV90eXBlKiBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX24sIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKl9Nb3ZhYmxlKi8pIHsKLSAgY29uc3QgZGlmZmVyZW5jZV90eXBlIF9fZWxlbXNfYmVmb3JlID0gX19wb3MgLSB0aGlzLT5fTV9zdGFydDsKLSAgc2l6ZV90eXBlIF9fbGVuZ3RoID0gc2l6ZSgpOwotICBpZiAoX19lbGVtc19iZWZvcmUgPD0gZGlmZmVyZW5jZV90eXBlKF9fbGVuZ3RoIC8gMikpIHsKLSAgICBpdGVyYXRvciBfX25ld19zdGFydCA9IF9NX3Jlc2VydmVfZWxlbWVudHNfYXRfZnJvbnQoX19uKTsKLSAgICBfX3BvcyA9IHRoaXMtPl9NX3N0YXJ0ICsgX19lbGVtc19iZWZvcmU7Ci0gICAgX1NUTFBfVFJZIHsKLSAgICAgIGl0ZXJhdG9yIF9fZHN0ID0gX19uZXdfc3RhcnQ7Ci0gICAgICBpdGVyYXRvciBfX3NyYyA9IHRoaXMtPl9NX3N0YXJ0OwotICAgICAgZm9yICg7IF9fc3JjICE9IF9fcG9zOyArK19fZHN0LCArK19fc3JjKSB7Ci0gICAgICAgIF9TVExQX1NURDo6X01vdmVfQ29uc3RydWN0KCYoKl9fZHN0KSwgKl9fc3JjKTsKLSAgICAgICAgX1NUTFBfU1REOjpfRGVzdHJveV9Nb3ZlZCgmKCpfX3NyYykpOwotICAgICAgfQotICAgICAgdGhpcy0+X01fc3RhcnQgPSBfX25ld19zdGFydDsKLSAgICAgIF9TVExQX1BSSVYgX191Y29weShfX2ZpcnN0LCBfX2xhc3QsIF9fZHN0KTsKLSAgICB9Ci0gICAgX1NUTFBfVU5XSU5EKHRoaXMtPl9NX2Rlc3Ryb3lfbm9kZXMoX19uZXdfc3RhcnQuX01fbm9kZSwgdGhpcy0+X01fc3RhcnQuX01fbm9kZSkpCi0gIH0KLSAgZWxzZSB7Ci0gICAgaXRlcmF0b3IgX19uZXdfZmluaXNoID0gX01fcmVzZXJ2ZV9lbGVtZW50c19hdF9iYWNrKF9fbik7Ci0gICAgY29uc3QgZGlmZmVyZW5jZV90eXBlIF9fZWxlbXNfYWZ0ZXIgPSBkaWZmZXJlbmNlX3R5cGUoX19sZW5ndGgpIC0gX19lbGVtc19iZWZvcmU7Ci0gICAgX19wb3MgPSB0aGlzLT5fTV9maW5pc2ggLSBfX2VsZW1zX2FmdGVyOwotICAgIF9TVExQX1RSWSB7Ci0gICAgICBpdGVyYXRvciBfX2RzdCA9IF9fbmV3X2ZpbmlzaDsKLSAgICAgIGl0ZXJhdG9yIF9fc3JjID0gdGhpcy0+X01fZmluaXNoOwotICAgICAgZm9yICgtLV9fc3JjLCAtLV9fZHN0OyBfX3NyYyA+PSBfX3BvczsgLS1fX3NyYywgLS1fX2RzdCkgewotICAgICAgICBfU1RMUF9TVEQ6Ol9Nb3ZlX0NvbnN0cnVjdCgmKCpfX2RzdCksICpfX3NyYyk7Ci0gICAgICAgIF9TVExQX1NURDo6X0Rlc3Ryb3lfTW92ZWQoJigqX19zcmMpKTsKLSAgICAgIH0KLSAgICAgIHRoaXMtPl9NX2ZpbmlzaCA9IF9fbmV3X2ZpbmlzaDsKLSAgICAgIF9TVExQX1BSSVYgX191Y29weShfX2ZpcnN0LCBfX2xhc3QsIF9fcG9zKTsKLSAgICB9Ci0gICAgX1NUTFBfVU5XSU5EKHRoaXMtPl9NX2Rlc3Ryb3lfbm9kZXModGhpcy0+X01fZmluaXNoLl9NX25vZGUgKyAxLCBfX25ld19maW5pc2guX01fbm9kZSArIDEpKQotICB9Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYyA+Ci12b2lkIGRlcXVlPF9UcCxfQWxsb2M+OjpfTV9pbnNlcnRfcmFuZ2VfYXV4KGl0ZXJhdG9yIF9fcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZV90eXBlKiBfX2ZpcnN0LCBjb25zdCB2YWx1ZV90eXBlKiBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX24sIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypfTW92YWJsZSovKSB7Ci0gIGNvbnN0IGRpZmZlcmVuY2VfdHlwZSBfX2VsZW1zX2JlZm9yZSA9IF9fcG9zIC0gdGhpcy0+X01fc3RhcnQ7Ci0gIHNpemVfdHlwZSBfX2xlbmd0aCA9IHNpemUoKTsKLSAgaWYgKF9fZWxlbXNfYmVmb3JlIDw9IGRpZmZlcmVuY2VfdHlwZShfX2xlbmd0aCAvIDIpKSB7Ci0gICAgaXRlcmF0b3IgX19uZXdfc3RhcnQgPSBfTV9yZXNlcnZlX2VsZW1lbnRzX2F0X2Zyb250KF9fbik7Ci0gICAgaXRlcmF0b3IgX19vbGRfc3RhcnQgPSB0aGlzLT5fTV9zdGFydDsKLSAgICBfX3BvcyA9IHRoaXMtPl9NX3N0YXJ0ICsgX19lbGVtc19iZWZvcmU7Ci0gICAgX1NUTFBfVFJZIHsKLSAgICAgIGlmIChfX2VsZW1zX2JlZm9yZSA+PSBkaWZmZXJlbmNlX3R5cGUoX19uKSkgewotICAgICAgICBpdGVyYXRvciBfX3N0YXJ0X24gPSB0aGlzLT5fTV9zdGFydCArIGRpZmZlcmVuY2VfdHlwZShfX24pOwotICAgICAgICBfU1RMUF9QUklWIF9fdWNvcHkodGhpcy0+X01fc3RhcnQsIF9fc3RhcnRfbiwgX19uZXdfc3RhcnQpOwotICAgICAgICB0aGlzLT5fTV9zdGFydCA9IF9fbmV3X3N0YXJ0OwotICAgICAgICBjb3B5KF9fc3RhcnRfbiwgX19wb3MsIF9fb2xkX3N0YXJ0KTsKLSAgICAgICAgY29weShfX2ZpcnN0LCBfX2xhc3QsIF9fcG9zIC0gZGlmZmVyZW5jZV90eXBlKF9fbikpOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIGNvbnN0IHZhbHVlX3R5cGUqIF9fbWlkID0gX19maXJzdCArIChkaWZmZXJlbmNlX3R5cGUoX19uKSAtIF9fZWxlbXNfYmVmb3JlKTsKLSAgICAgICAgX191bmluaXRpYWxpemVkX2NvcHlfY29weSh0aGlzLT5fTV9zdGFydCwgX19wb3MsIF9fZmlyc3QsIF9fbWlkLCBfX25ld19zdGFydCk7Ci0gICAgICAgIHRoaXMtPl9NX3N0YXJ0ID0gX19uZXdfc3RhcnQ7Ci0gICAgICAgIGNvcHkoX19taWQsIF9fbGFzdCwgX19vbGRfc3RhcnQpOwotICAgICAgfQotICAgIH0KLSAgICBfU1RMUF9VTldJTkQodGhpcy0+X01fZGVzdHJveV9ub2RlcyhfX25ld19zdGFydC5fTV9ub2RlLCB0aGlzLT5fTV9zdGFydC5fTV9ub2RlKSkKLSAgfQotICBlbHNlIHsKLSAgICBpdGVyYXRvciBfX25ld19maW5pc2ggPSBfTV9yZXNlcnZlX2VsZW1lbnRzX2F0X2JhY2soX19uKTsKLSAgICBpdGVyYXRvciBfX29sZF9maW5pc2ggPSB0aGlzLT5fTV9maW5pc2g7Ci0gICAgY29uc3QgZGlmZmVyZW5jZV90eXBlIF9fZWxlbXNfYWZ0ZXIgPQotICAgICAgZGlmZmVyZW5jZV90eXBlKF9fbGVuZ3RoKSAtIF9fZWxlbXNfYmVmb3JlOwotICAgIF9fcG9zID0gdGhpcy0+X01fZmluaXNoIC0gX19lbGVtc19hZnRlcjsKLSAgICBfU1RMUF9UUlkgewotCi0gICAgICBpZiAoX19lbGVtc19hZnRlciA+IGRpZmZlcmVuY2VfdHlwZShfX24pKSB7Ci0gICAgICAgIGl0ZXJhdG9yIF9fZmluaXNoX24gPSB0aGlzLT5fTV9maW5pc2ggLSBkaWZmZXJlbmNlX3R5cGUoX19uKTsKLSAgICAgICAgX1NUTFBfUFJJViBfX3Vjb3B5KF9fZmluaXNoX24sIHRoaXMtPl9NX2ZpbmlzaCwgdGhpcy0+X01fZmluaXNoKTsKLSAgICAgICAgdGhpcy0+X01fZmluaXNoID0gX19uZXdfZmluaXNoOwotICAgICAgICBjb3B5X2JhY2t3YXJkKF9fcG9zLCBfX2ZpbmlzaF9uLCBfX29sZF9maW5pc2gpOwotICAgICAgICBjb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19wb3MpOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIGNvbnN0IHZhbHVlX3R5cGUqIF9fbWlkID0gX19maXJzdCArIF9fZWxlbXNfYWZ0ZXI7Ci0gICAgICAgIF9fdW5pbml0aWFsaXplZF9jb3B5X2NvcHkoX19taWQsIF9fbGFzdCwgX19wb3MsIHRoaXMtPl9NX2ZpbmlzaCwgdGhpcy0+X01fZmluaXNoKTsKLSAgICAgICAgdGhpcy0+X01fZmluaXNoID0gX19uZXdfZmluaXNoOwotICAgICAgICBjb3B5KF9fZmlyc3QsIF9fbWlkLCBfX3Bvcyk7Ci0gICAgICB9Ci0gICAgfQotICAgIF9TVExQX1VOV0lORCh0aGlzLT5fTV9kZXN0cm95X25vZGVzKHRoaXMtPl9NX2ZpbmlzaC5fTV9ub2RlICsgMSwgX19uZXdfZmluaXNoLl9NX25vZGUgKyAxKSkKLSAgfQotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2MgPgotdm9pZCBkZXF1ZTxfVHAsX0FsbG9jPjo6X01faW5zZXJ0X3JhbmdlX2F1eChpdGVyYXRvciBfX3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uLCBjb25zdCBfX3RydWVfdHlwZSYgLypfTW92YWJsZSovKSB7Ci0gIGNvbnN0IGRpZmZlcmVuY2VfdHlwZSBfX2VsZW1zX2JlZm9yZSA9IF9fcG9zIC0gdGhpcy0+X01fc3RhcnQ7Ci0gIHNpemVfdHlwZSBfX2xlbmd0aCA9IHNpemUoKTsKLSAgaWYgKF9fZWxlbXNfYmVmb3JlIDw9IGRpZmZlcmVuY2VfdHlwZShfX2xlbmd0aCAvIDIpKSB7Ci0gICAgaXRlcmF0b3IgX19uZXdfc3RhcnQgPSBfTV9yZXNlcnZlX2VsZW1lbnRzX2F0X2Zyb250KF9fbik7Ci0gICAgX19wb3MgPSB0aGlzLT5fTV9zdGFydCArIF9fZWxlbXNfYmVmb3JlOwotICAgIF9TVExQX1RSWSB7Ci0gICAgICBpdGVyYXRvciBfX2RzdCA9IF9fbmV3X3N0YXJ0OwotICAgICAgaXRlcmF0b3IgX19zcmMgPSB0aGlzLT5fTV9zdGFydDsKLSAgICAgIGZvciAoOyBfX3NyYyAhPSBfX3BvczsgKytfX2RzdCwgKytfX3NyYykgewotICAgICAgICBfU1RMUF9TVEQ6Ol9Nb3ZlX0NvbnN0cnVjdCgmKCpfX2RzdCksICpfX3NyYyk7Ci0gICAgICAgIF9TVExQX1NURDo6X0Rlc3Ryb3lfTW92ZWQoJigqX19zcmMpKTsKLSAgICAgIH0KLSAgICAgIHRoaXMtPl9NX3N0YXJ0ID0gX19uZXdfc3RhcnQ7Ci0gICAgICBfU1RMUF9QUklWIF9fdWNvcHkoX19maXJzdCwgX19sYXN0LCBfX2RzdCk7Ci0gICAgfQotICAgIF9TVExQX1VOV0lORCh0aGlzLT5fTV9kZXN0cm95X25vZGVzKF9fbmV3X3N0YXJ0Ll9NX25vZGUsIHRoaXMtPl9NX3N0YXJ0Ll9NX25vZGUpKQotICB9Ci0gIGVsc2UgewotICAgIGl0ZXJhdG9yIF9fbmV3X2ZpbmlzaCA9IF9NX3Jlc2VydmVfZWxlbWVudHNfYXRfYmFjayhfX24pOwotICAgIGNvbnN0IGRpZmZlcmVuY2VfdHlwZSBfX2VsZW1zX2FmdGVyID0gZGlmZmVyZW5jZV90eXBlKF9fbGVuZ3RoKSAtIF9fZWxlbXNfYmVmb3JlOwotICAgIF9fcG9zID0gdGhpcy0+X01fZmluaXNoIC0gX19lbGVtc19hZnRlcjsKLSAgICBfU1RMUF9UUlkgewotICAgICAgaXRlcmF0b3IgX19kc3QgPSBfX25ld19maW5pc2g7Ci0gICAgICBpdGVyYXRvciBfX3NyYyA9IHRoaXMtPl9NX2ZpbmlzaDsKLSAgICAgIGZvciAoLS1fX3NyYywgLS1fX2RzdDsgX19zcmMgPj0gX19wb3M7IC0tX19zcmMsIC0tX19kc3QpIHsKLSAgICAgICAgX1NUTFBfU1REOjpfTW92ZV9Db25zdHJ1Y3QoJigqX19kc3QpLCAqX19zcmMpOwotICAgICAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95X01vdmVkKCYoKl9fc3JjKSk7Ci0gICAgICB9Ci0gICAgICB0aGlzLT5fTV9maW5pc2ggPSBfX25ld19maW5pc2g7Ci0gICAgICBfU1RMUF9QUklWIF9fdWNvcHkoX19maXJzdCwgX19sYXN0LCBfX3Bvcyk7Ci0gICAgfQotICAgIF9TVExQX1VOV0lORCh0aGlzLT5fTV9kZXN0cm95X25vZGVzKHRoaXMtPl9NX2ZpbmlzaC5fTV9ub2RlICsgMSwgX19uZXdfZmluaXNoLl9NX25vZGUgKyAxKSkKLSAgfQotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2MgPgotdm9pZCBkZXF1ZTxfVHAsX0FsbG9jPjo6X01faW5zZXJ0X3JhbmdlX2F1eChpdGVyYXRvciBfX3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uLCBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qX01vdmFibGUqLykgewotICBjb25zdCBkaWZmZXJlbmNlX3R5cGUgX19lbGVtc19iZWZvcmUgPSBfX3BvcyAtIHRoaXMtPl9NX3N0YXJ0OwotICBzaXplX3R5cGUgX19sZW5ndGggPSBzaXplKCk7Ci0gIGlmIChfX2VsZW1zX2JlZm9yZSA8IGRpZmZlcmVuY2VfdHlwZShfX2xlbmd0aCAvIDIpKSB7Ci0gICAgaXRlcmF0b3IgX19uZXdfc3RhcnQgPSBfTV9yZXNlcnZlX2VsZW1lbnRzX2F0X2Zyb250KF9fbik7Ci0gICAgaXRlcmF0b3IgX19vbGRfc3RhcnQgPSB0aGlzLT5fTV9zdGFydDsKLSAgICBfX3BvcyA9IHRoaXMtPl9NX3N0YXJ0ICsgX19lbGVtc19iZWZvcmU7Ci0gICAgX1NUTFBfVFJZIHsKLSAgICAgIGlmIChfX2VsZW1zX2JlZm9yZSA+PSBkaWZmZXJlbmNlX3R5cGUoX19uKSkgewotICAgICAgICBpdGVyYXRvciBfX3N0YXJ0X24gPSB0aGlzLT5fTV9zdGFydCArIF9fbjsKLSAgICAgICAgX1NUTFBfUFJJViBfX3Vjb3B5KHRoaXMtPl9NX3N0YXJ0LCBfX3N0YXJ0X24sIF9fbmV3X3N0YXJ0KTsKLSAgICAgICAgdGhpcy0+X01fc3RhcnQgPSBfX25ld19zdGFydDsKLSAgICAgICAgY29weShfX3N0YXJ0X24sIF9fcG9zLCBfX29sZF9zdGFydCk7Ci0gICAgICAgIGNvcHkoX19maXJzdCwgX19sYXN0LCBfX3BvcyAtIGRpZmZlcmVuY2VfdHlwZShfX24pKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBjb25zdF9pdGVyYXRvciBfX21pZCA9IF9fZmlyc3QgKyAoX19uIC0gX19lbGVtc19iZWZvcmUpOwotICAgICAgICBfX3VuaW5pdGlhbGl6ZWRfY29weV9jb3B5KHRoaXMtPl9NX3N0YXJ0LCBfX3BvcywgX19maXJzdCwgX19taWQsIF9fbmV3X3N0YXJ0KTsKLSAgICAgICAgdGhpcy0+X01fc3RhcnQgPSBfX25ld19zdGFydDsKLSAgICAgICAgY29weShfX21pZCwgX19sYXN0LCBfX29sZF9zdGFydCk7Ci0gICAgICB9Ci0gICAgfQotICAgIF9TVExQX1VOV0lORCh0aGlzLT5fTV9kZXN0cm95X25vZGVzKF9fbmV3X3N0YXJ0Ll9NX25vZGUsIHRoaXMtPl9NX3N0YXJ0Ll9NX25vZGUpKQotICB9Ci0gIGVsc2UgewotICAgIGl0ZXJhdG9yIF9fbmV3X2ZpbmlzaCA9IF9NX3Jlc2VydmVfZWxlbWVudHNfYXRfYmFjayhfX24pOwotICAgIGl0ZXJhdG9yIF9fb2xkX2ZpbmlzaCA9IHRoaXMtPl9NX2ZpbmlzaDsKLSAgICBjb25zdCBkaWZmZXJlbmNlX3R5cGUgX19lbGVtc19hZnRlciA9IF9fbGVuZ3RoIC0gX19lbGVtc19iZWZvcmU7Ci0gICAgX19wb3MgPSB0aGlzLT5fTV9maW5pc2ggLSBfX2VsZW1zX2FmdGVyOwotICAgIF9TVExQX1RSWSB7Ci0gICAgICBpZiAoX19lbGVtc19hZnRlciA+IGRpZmZlcmVuY2VfdHlwZShfX24pKSB7Ci0gICAgICAgIGl0ZXJhdG9yIF9fZmluaXNoX24gPSB0aGlzLT5fTV9maW5pc2ggLSBkaWZmZXJlbmNlX3R5cGUoX19uKTsKLSAgICAgICAgX1NUTFBfUFJJViBfX3Vjb3B5KF9fZmluaXNoX24sIHRoaXMtPl9NX2ZpbmlzaCwgdGhpcy0+X01fZmluaXNoKTsKLSAgICAgICAgdGhpcy0+X01fZmluaXNoID0gX19uZXdfZmluaXNoOwotICAgICAgICBjb3B5X2JhY2t3YXJkKF9fcG9zLCBfX2ZpbmlzaF9uLCBfX29sZF9maW5pc2gpOwotICAgICAgICBjb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19wb3MpOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fbWlkID0gX19maXJzdCArIF9fZWxlbXNfYWZ0ZXI7Ci0gICAgICAgIF9fdW5pbml0aWFsaXplZF9jb3B5X2NvcHkoX19taWQsIF9fbGFzdCwgX19wb3MsIHRoaXMtPl9NX2ZpbmlzaCwgdGhpcy0+X01fZmluaXNoKTsKLSAgICAgICAgdGhpcy0+X01fZmluaXNoID0gX19uZXdfZmluaXNoOwotICAgICAgICBjb3B5KF9fZmlyc3QsIF9fbWlkLCBfX3Bvcyk7Ci0gICAgICB9Ci0gICAgfQotICAgIF9TVExQX1VOV0lORCh0aGlzLT5fTV9kZXN0cm95X25vZGVzKHRoaXMtPl9NX2ZpbmlzaC5fTV9ub2RlICsgMSwgX19uZXdfZmluaXNoLl9NX25vZGUgKyAxKSkKLSAgfQotfQotI2VuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KLQotdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jID4KLXZvaWQgZGVxdWU8X1RwLF9BbGxvYz46Ol9NX25ld19lbGVtZW50c19hdF9mcm9udChzaXplX3R5cGUgX19uZXdfZWxlbXMpIHsKLSAgc2l6ZV90eXBlIF9fbmV3X25vZGVzCi0gICAgICA9IChfX25ld19lbGVtcyArIHRoaXMtPmJ1ZmZlcl9zaXplKCkgLSAxKSAvIHRoaXMtPmJ1ZmZlcl9zaXplKCk7Ci0gIF9NX3Jlc2VydmVfbWFwX2F0X2Zyb250KF9fbmV3X25vZGVzKTsKLSAgc2l6ZV90eXBlIF9faSA9IDE7Ci0gIF9TVExQX1RSWSB7Ci0gICAgZm9yICg7IF9faSA8PSBfX25ld19ub2RlczsgKytfX2kpCi0gICAgICAqKHRoaXMtPl9NX3N0YXJ0Ll9NX25vZGUgLSBfX2kpID0gdGhpcy0+X01fbWFwX3NpemUuYWxsb2NhdGUodGhpcy0+YnVmZmVyX3NpemUoKSk7Ci0gIH0KLSAgX1NUTFBfVU5XSU5EKGZvciAoc2l6ZV90eXBlIF9faiA9IDE7IF9faiA8IF9faTsgKytfX2opCi0gICAgICAgICAgICAgICAgIHRoaXMtPl9NX21hcF9zaXplLmRlYWxsb2NhdGUoKih0aGlzLT5fTV9zdGFydC5fTV9ub2RlIC0gX19qKSwgdGhpcy0+YnVmZmVyX3NpemUoKSkpCi19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYyA+Ci12b2lkIGRlcXVlPF9UcCxfQWxsb2M+OjpfTV9uZXdfZWxlbWVudHNfYXRfYmFjayhzaXplX3R5cGUgX19uZXdfZWxlbXMpIHsKLSAgc2l6ZV90eXBlIF9fbmV3X25vZGVzCi0gICAgICA9IChfX25ld19lbGVtcyArIHRoaXMtPmJ1ZmZlcl9zaXplKCkgLSAxKSAvIHRoaXMtPmJ1ZmZlcl9zaXplKCk7Ci0gIF9NX3Jlc2VydmVfbWFwX2F0X2JhY2soX19uZXdfbm9kZXMpOwotICBzaXplX3R5cGUgX19pID0gMTsKLSAgX1NUTFBfVFJZIHsKLSAgICBmb3IgKDsgX19pIDw9IF9fbmV3X25vZGVzOyArK19faSkKLSAgICAgICoodGhpcy0+X01fZmluaXNoLl9NX25vZGUgKyBfX2kpID0gdGhpcy0+X01fbWFwX3NpemUuYWxsb2NhdGUodGhpcy0+YnVmZmVyX3NpemUoKSk7Ci0gIH0KLSAgX1NUTFBfVU5XSU5EKGZvciAoc2l6ZV90eXBlIF9faiA9IDE7IF9faiA8IF9faTsgKytfX2opCi0gICAgICAgICAgICAgICAgIHRoaXMtPl9NX21hcF9zaXplLmRlYWxsb2NhdGUoKih0aGlzLT5fTV9maW5pc2guX01fbm9kZSArIF9faiksIHRoaXMtPmJ1ZmZlcl9zaXplKCkpKQotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2MgPgotdm9pZCBkZXF1ZTxfVHAsX0FsbG9jPjo6X01fcmVhbGxvY2F0ZV9tYXAoc2l6ZV90eXBlIF9fbm9kZXNfdG9fYWRkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBfX2FkZF9hdF9mcm9udCkgewotICBzaXplX3R5cGUgX19vbGRfbnVtX25vZGVzID0gdGhpcy0+X01fZmluaXNoLl9NX25vZGUgLSB0aGlzLT5fTV9zdGFydC5fTV9ub2RlICsgMTsKLSAgc2l6ZV90eXBlIF9fbmV3X251bV9ub2RlcyA9IF9fb2xkX251bV9ub2RlcyArIF9fbm9kZXNfdG9fYWRkOwotCi0gIF9NYXBfcG9pbnRlciBfX25ld19uc3RhcnQ7Ci0gIGlmICh0aGlzLT5fTV9tYXBfc2l6ZS5fTV9kYXRhID4gMiAqIF9fbmV3X251bV9ub2RlcykgewotICAgIF9fbmV3X25zdGFydCA9IHRoaXMtPl9NX21hcC5fTV9kYXRhICsgKHRoaXMtPl9NX21hcF9zaXplLl9NX2RhdGEgLSBfX25ld19udW1fbm9kZXMpIC8gMgotICAgICAgICAgICAgICAgICAgICAgKyAoX19hZGRfYXRfZnJvbnQgPyBfX25vZGVzX3RvX2FkZCA6IDApOwotICAgIGlmIChfX25ld19uc3RhcnQgPCB0aGlzLT5fTV9zdGFydC5fTV9ub2RlKQotICAgICAgY29weSh0aGlzLT5fTV9zdGFydC5fTV9ub2RlLCB0aGlzLT5fTV9maW5pc2guX01fbm9kZSArIDEsIF9fbmV3X25zdGFydCk7Ci0gICAgZWxzZQotICAgICAgY29weV9iYWNrd2FyZCh0aGlzLT5fTV9zdGFydC5fTV9ub2RlLCB0aGlzLT5fTV9maW5pc2guX01fbm9kZSArIDEsCi0gICAgICAgICAgICAgICAgICAgIF9fbmV3X25zdGFydCArIF9fb2xkX251bV9ub2Rlcyk7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgc2l6ZV90eXBlIF9fbmV3X21hcF9zaXplID0KLSAgICAgIHRoaXMtPl9NX21hcF9zaXplLl9NX2RhdGEgKyAobWF4KSgoc2l6ZV90KXRoaXMtPl9NX21hcF9zaXplLl9NX2RhdGEsIF9fbm9kZXNfdG9fYWRkKSArIDI7Ci0KLSAgICBfTWFwX3BvaW50ZXIgX19uZXdfbWFwID0gdGhpcy0+X01fbWFwLmFsbG9jYXRlKF9fbmV3X21hcF9zaXplKTsKLSAgICBfX25ld19uc3RhcnQgPSBfX25ld19tYXAgKyAoX19uZXdfbWFwX3NpemUgLSBfX25ld19udW1fbm9kZXMpIC8gMgotICAgICAgICAgICAgICAgICAgICAgICAgICsgKF9fYWRkX2F0X2Zyb250ID8gX19ub2Rlc190b19hZGQgOiAwKTsKLSAgICBjb3B5KHRoaXMtPl9NX3N0YXJ0Ll9NX25vZGUsIHRoaXMtPl9NX2ZpbmlzaC5fTV9ub2RlICsgMSwgX19uZXdfbnN0YXJ0KTsKLSAgICB0aGlzLT5fTV9tYXAuZGVhbGxvY2F0ZSh0aGlzLT5fTV9tYXAuX01fZGF0YSwgdGhpcy0+X01fbWFwX3NpemUuX01fZGF0YSk7Ci0KLSAgICB0aGlzLT5fTV9tYXAuX01fZGF0YSA9IF9fbmV3X21hcDsKLSAgICB0aGlzLT5fTV9tYXBfc2l6ZS5fTV9kYXRhID0gX19uZXdfbWFwX3NpemU7Ci0gIH0KLQotICB0aGlzLT5fTV9zdGFydC5fTV9zZXRfbm9kZShfX25ld19uc3RhcnQpOwotICB0aGlzLT5fTV9maW5pc2guX01fc2V0X25vZGUoX19uZXdfbnN0YXJ0ICsgX19vbGRfbnVtX25vZGVzIC0gMSk7Ci19Ci0KLSNpZiBkZWZpbmVkIChkZXF1ZSkKLSMgIHVuZGVmIGRlcXVlCi1fU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKLSNlbmRpZgotCi1fU1RMUF9FTkRfTkFNRVNQQUNFCi0KLSN1bmRlZiBfX2l0ZXJhdG9yX18KLSN1bmRlZiBpdGVyYXRvcgotI3VuZGVmIGNvbnN0X2l0ZXJhdG9yCi0jdW5kZWYgc2l6ZV90eXBlCi0jdW5kZWYgdmFsdWVfdHlwZQotCi0jZW5kaWYgLyogIF9TVExQX0RFUVVFX0MgKi8KLQotLy8gTG9jYWwgVmFyaWFibGVzOgotLy8gbW9kZTpDKysKLS8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9fZGVxdWUuaCBiL3N0bC9fZGVxdWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI4YjkzOC4uMDAwMDAwMAotLS0gYS9zdGwvX2RlcXVlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDk3ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk0Ci0gKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3Ci0gKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTcKLSAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0vKiBOT1RFOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBTVEwgaGVhZGVycy4KLSAqICAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuCi0gKi8KLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9ERVFVRV9ICi0jZGVmaW5lIF9TVExQX0lOVEVSTkFMX0RFUVVFX0gKLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9BTEdPQkFTRV9ICi0jICBpbmNsdWRlIDxzdGwvX2FsZ29iYXNlLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9BTExPQ19ICi0jICBpbmNsdWRlIDxzdGwvX2FsbG9jLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9JVEVSQVRPUl9ICi0jICBpbmNsdWRlIDxzdGwvX2l0ZXJhdG9yLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9VTklOSVRJQUxJWkVEX0gKLSMgIGluY2x1ZGUgPHN0bC9fdW5pbml0aWFsaXplZC5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfUkFOR0VfRVJST1JTX0gKLSMgIGluY2x1ZGUgPHN0bC9fcmFuZ2VfZXJyb3JzLmg+Ci0jZW5kaWYKLQotLyogQ2xhc3MgaW52YXJpYW50czoKLSAqICBGb3IgYW55IG5vbnNpbmd1bGFyIGl0ZXJhdG9yIGk6Ci0gKiAgICBpLm5vZGUgaXMgdGhlIGFkZHJlc3Mgb2YgYW4gZWxlbWVudCBpbiB0aGUgbWFwIGFycmF5LiAgVGhlCi0gKiAgICAgIGNvbnRlbnRzIG9mIGkubm9kZSBpcyBhIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiBhIG5vZGUuCi0gKiAgICBpLmZpcnN0ID09ICooaS5ub2RlKQotICogICAgaS5sYXN0ICA9PSBpLmZpcnN0ICsgbm9kZV9zaXplCi0gKiAgICBpLmN1ciBpcyBhIHBvaW50ZXIgaW4gdGhlIHJhbmdlIFtpLmZpcnN0LCBpLmxhc3QpLiAgTk9URToKLSAqICAgICAgdGhlIGltcGxpY2F0aW9uIG9mIHRoaXMgaXMgdGhhdCBpLmN1ciBpcyBhbHdheXMgYSBkZXJlZmVyZW5jZWFibGUKLSAqICAgICAgcG9pbnRlciwgZXZlbiBpZiBpIGlzIGEgcGFzdC10aGUtZW5kIGl0ZXJhdG9yLgotICogIFN0YXJ0IGFuZCBGaW5pc2ggYXJlIGFsd2F5cyBub25zaW5ndWxhciBpdGVyYXRvcnMuICBOT1RFOiB0aGlzIG1lYW5zCi0gKiAgICB0aGF0IGFuIGVtcHR5IGRlcXVlIG11c3QgaGF2ZSBvbmUgbm9kZSwgYW5kIHRoYXQgYSBkZXF1ZQotICogICAgd2l0aCBOIGVsZW1lbnRzLCB3aGVyZSBOIGlzIHRoZSBidWZmZXIgc2l6ZSwgbXVzdCBoYXZlIHR3byBub2Rlcy4KLSAqICBGb3IgZXZlcnkgbm9kZSBvdGhlciB0aGFuIHN0YXJ0Lm5vZGUgYW5kIGZpbmlzaC5ub2RlLCBldmVyeSBlbGVtZW50Ci0gKiAgICBpbiB0aGUgbm9kZSBpcyBhbiBpbml0aWFsaXplZCBvYmplY3QuICBJZiBzdGFydC5ub2RlID09IGZpbmlzaC5ub2RlLAotICogICAgdGhlbiBbc3RhcnQuY3VyLCBmaW5pc2guY3VyKSBhcmUgaW5pdGlhbGl6ZWQgb2JqZWN0cywgYW5kCi0gKiAgICB0aGUgZWxlbWVudHMgb3V0c2lkZSB0aGF0IHJhbmdlIGFyZSB1bmluaXRpYWxpemVkIHN0b3JhZ2UuICBPdGhlcndpc2UsCi0gKiAgICBbc3RhcnQuY3VyLCBzdGFydC5sYXN0KSBhbmQgW2ZpbmlzaC5maXJzdCwgZmluaXNoLmN1cikgYXJlIGluaXRpYWxpemVkCi0gKiAgICBvYmplY3RzLCBhbmQgW3N0YXJ0LmZpcnN0LCBzdGFydC5jdXIpIGFuZCBbZmluaXNoLmN1ciwgZmluaXNoLmxhc3QpCi0gKiAgICBhcmUgdW5pbml0aWFsaXplZCBzdG9yYWdlLgotICogIFttYXAsIG1hcCArIG1hcF9zaXplKSBpcyBhIHZhbGlkLCBub24tZW1wdHkgcmFuZ2UuCi0gKiAgW3N0YXJ0Lm5vZGUsIGZpbmlzaC5ub2RlXSBpcyBhIHZhbGlkIHJhbmdlIGNvbnRhaW5lZCB3aXRoaW4KLSAqICAgIFttYXAsIG1hcCArIG1hcF9zaXplKS4KLSAqICBBIHBvaW50ZXIgaW4gdGhlIHJhbmdlIFttYXAsIG1hcCArIG1hcF9zaXplKSBwb2ludHMgdG8gYW4gYWxsb2NhdGVkIG5vZGUKLSAqICAgIGlmIGFuZCBvbmx5IGlmIHRoZSBwb2ludGVyIGlzIGluIHRoZSByYW5nZSBbc3RhcnQubm9kZSwgZmluaXNoLm5vZGVdLgotICovCi0KLV9TVExQX0JFR0lOX05BTUVTUEFDRQotCi1fU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCi0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1zdHJ1Y3QgX0RlcXVlX2l0ZXJhdG9yX2Jhc2UgewotCi0gIGVudW0gX0NvbnN0YW50cyB7Ci0gICAgX2Jsb2Nrc2l6ZSA9IF9NQVhfQllURVMsCi0gICAgX19idWZmZXJfc2l6ZSA9IChzaXplb2YoX1RwKSA8IChzaXplX3QpX2Jsb2Nrc2l6ZSA/Ci0gICAgICAgICAgICAgICAgICAoIChzaXplX3QpX2Jsb2Nrc2l6ZSAvIHNpemVvZihfVHApKSA6IHNpemVfdCgxKSkKLSAgfTsKLQotICB0eXBlZGVmIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OwotCi0gIHR5cGVkZWYgX1RwIHZhbHVlX3R5cGU7Ci0gIHR5cGVkZWYgc2l6ZV90IHNpemVfdHlwZTsKLSAgdHlwZWRlZiBwdHJkaWZmX3QgZGlmZmVyZW5jZV90eXBlOwotCi0gIHR5cGVkZWYgdmFsdWVfdHlwZSoqIF9NYXBfcG9pbnRlcjsKLQotICB0eXBlZGVmIF9EZXF1ZV9pdGVyYXRvcl9iYXNlPCBfVHAgPiBfU2VsZjsKLQotICB2YWx1ZV90eXBlKiBfTV9jdXI7Ci0gIHZhbHVlX3R5cGUqIF9NX2ZpcnN0OwotICB2YWx1ZV90eXBlKiBfTV9sYXN0OwotICBfTWFwX3BvaW50ZXIgX01fbm9kZTsKLQotICBfRGVxdWVfaXRlcmF0b3JfYmFzZSh2YWx1ZV90eXBlKiBfX3gsIF9NYXBfcG9pbnRlciBfX3kpCi0gICAgOiBfTV9jdXIoX194KSwgX01fZmlyc3QoKl9feSksCi0gICAgICBfTV9sYXN0KCpfX3kgKyBfX2J1ZmZlcl9zaXplKSwgX01fbm9kZShfX3kpIHt9Ci0KLSAgX0RlcXVlX2l0ZXJhdG9yX2Jhc2UoKSA6IF9NX2N1cigwKSwgX01fZmlyc3QoMCksIF9NX2xhc3QoMCksIF9NX25vZGUoMCkge30KLQotLy8gc2VlIGNvbW1lbnQgaW4gZG9jL1JFQURNRS5ldmM0IGFuZCBkb2MvUkVBRE1FLmV2YzgKLSNpZiBkZWZpbmVkIChfU1RMUF9NU1ZDKSAmJiAoX1NUTFBfTVNWQyA8PSAxNDAxKSAmJiBkZWZpbmVkIChNSVBTKSAmJiBkZWZpbmVkIChOREVCVUcpCi0gIF9EZXF1ZV9pdGVyYXRvcl9iYXNlKF9EZXF1ZV9pdGVyYXRvcl9iYXNlIGNvbnN0JiBfX290aGVyKQotICA6IF9NX2N1cihfX290aGVyLl9NX2N1ciksIF9NX2ZpcnN0KF9fb3RoZXIuX01fZmlyc3QpLAotICAgIF9NX2xhc3QoX19vdGhlci5fTV9sYXN0KSwgX01fbm9kZShfX290aGVyLl9NX25vZGUpIHt9Ci0jZW5kaWYKLQotICBkaWZmZXJlbmNlX3R5cGUgX01fc3VidHJhY3QoY29uc3QgX1NlbGYmIF9feCkgY29uc3QgewotICAgIHJldHVybiBkaWZmZXJlbmNlX3R5cGUoX19idWZmZXJfc2l6ZSkgKiAoX01fbm9kZSAtIF9feC5fTV9ub2RlIC0gMSkgKwotICAgICAgKF9NX2N1ciAtIF9NX2ZpcnN0KSArIChfX3guX01fbGFzdCAtIF9feC5fTV9jdXIpOwotICB9Ci0KLSAgdm9pZCBfTV9pbmNyZW1lbnQoKSB7Ci0gICAgaWYgKCsrX01fY3VyID09IF9NX2xhc3QpIHsKLSAgICAgIF9NX3NldF9ub2RlKF9NX25vZGUgKyAxKTsKLSAgICAgIF9NX2N1ciA9IF9NX2ZpcnN0OwotICAgIH0KLSAgfQotCi0gIHZvaWQgX01fZGVjcmVtZW50KCkgewotICAgIGlmIChfTV9jdXIgPT0gX01fZmlyc3QpIHsKLSAgICAgIF9NX3NldF9ub2RlKF9NX25vZGUgLSAxKTsKLSAgICAgIF9NX2N1ciA9IF9NX2xhc3Q7Ci0gICAgfQotICAgIC0tX01fY3VyOwotICB9Ci0KLSAgdm9pZCBfTV9hZHZhbmNlKGRpZmZlcmVuY2VfdHlwZSBfX24pIHsKLSAgICBkaWZmZXJlbmNlX3R5cGUgX19vZmZzZXQgPSBfX24gKyAoX01fY3VyIC0gX01fZmlyc3QpOwotICAgIGlmIChfX29mZnNldCA+PSAwICYmIF9fb2Zmc2V0IDwgZGlmZmVyZW5jZV90eXBlKF9fYnVmZmVyX3NpemUpKQotICAgICAgX01fY3VyICs9IF9fbjsKLSAgICBlbHNlIHsKLSAgICAgIGRpZmZlcmVuY2VfdHlwZSBfX25vZGVfb2Zmc2V0ID0KLSAgICAgICAgX19vZmZzZXQgPiAwID8gX19vZmZzZXQgLyBfX2J1ZmZlcl9zaXplCi0gICAgICAgICAgICAgICAgICAgOiAtZGlmZmVyZW5jZV90eXBlKCgtX19vZmZzZXQgLSAxKSAvIF9fYnVmZmVyX3NpemUpIC0gMTsKLSAgICAgIF9NX3NldF9ub2RlKF9NX25vZGUgKyBfX25vZGVfb2Zmc2V0KTsKLSAgICAgIF9NX2N1ciA9IF9NX2ZpcnN0ICsKLQotICAgICAgICAoX19vZmZzZXQgLSBfX25vZGVfb2Zmc2V0ICogZGlmZmVyZW5jZV90eXBlKF9fYnVmZmVyX3NpemUpKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIF9NX3NldF9ub2RlKF9NYXBfcG9pbnRlciBfX25ld19ub2RlKSB7Ci0gICAgX01fbGFzdCA9IChfTV9maXJzdCA9ICooX01fbm9kZSA9IF9fbmV3X25vZGUpKSArIGRpZmZlcmVuY2VfdHlwZShfX2J1ZmZlcl9zaXplKTsKLSAgfQotfTsKLQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVHJhaXRzPgotc3RydWN0IF9EZXF1ZV9pdGVyYXRvciA6IHB1YmxpYyBfRGVxdWVfaXRlcmF0b3JfYmFzZTwgX1RwPiB7Ci0gIHR5cGVkZWYgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7Ci0gIHR5cGVkZWYgX1RwIHZhbHVlX3R5cGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6cmVmZXJlbmNlICByZWZlcmVuY2U7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6cG9pbnRlciAgICBwb2ludGVyOwotICB0eXBlZGVmIHNpemVfdCBzaXplX3R5cGU7Ci0gIHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKLSAgdHlwZWRlZiB2YWx1ZV90eXBlKiogX01hcF9wb2ludGVyOwotCi0gIHR5cGVkZWYgX0RlcXVlX2l0ZXJhdG9yX2Jhc2U8IF9UcCA+IF9CYXNlOwotICB0eXBlZGVmIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcmFpdHM+IF9TZWxmOwotICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6Ol9Ob25Db25zdFRyYWl0cyAgICAgX05vbkNvbnN0VHJhaXRzOwotICB0eXBlZGVmIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9Ob25Db25zdFRyYWl0cz4gaXRlcmF0b3I7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6X0NvbnN0VHJhaXRzICAgICAgICBfQ29uc3RUcmFpdHM7Ci0gIHR5cGVkZWYgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX0NvbnN0VHJhaXRzPiAgICBjb25zdF9pdGVyYXRvcjsKLQotICBfRGVxdWVfaXRlcmF0b3IodmFsdWVfdHlwZSogX194LCBfTWFwX3BvaW50ZXIgX195KSA6Ci0gICAgX0RlcXVlX2l0ZXJhdG9yX2Jhc2U8dmFsdWVfdHlwZT4oX194LF9feSkge30KLQotICBfRGVxdWVfaXRlcmF0b3IoKSB7fQotICAvL2NvcHkgY29uc3RydWN0b3IgZm9yIGl0ZXJhdG9yIGFuZCBjb25zdHJ1Y3RvciBmcm9tIGl0ZXJhdG9yIGZvciBjb25zdF9pdGVyYXRvcgotICBfRGVxdWVfaXRlcmF0b3IoY29uc3QgaXRlcmF0b3ImIF9feCkgOgotICAgIF9EZXF1ZV9pdGVyYXRvcl9iYXNlPHZhbHVlX3R5cGU+KF9feCkge30KLQotICByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3QgewotICAgIHJldHVybiAqdGhpcy0+X01fY3VyOwotICB9Ci0KLSAgX1NUTFBfREVGSU5FX0FSUk9XX09QRVJBVE9SCi0KLSAgZGlmZmVyZW5jZV90eXBlIG9wZXJhdG9yLShjb25zdCBjb25zdF9pdGVyYXRvciYgX194KSBjb25zdCB7IHJldHVybiB0aGlzLT5fTV9zdWJ0cmFjdChfX3gpOyB9Ci0KLSAgX1NlbGYmIG9wZXJhdG9yKysoKSB7IHRoaXMtPl9NX2luY3JlbWVudCgpOyByZXR1cm4gKnRoaXM7IH0KLSAgX1NlbGYgb3BlcmF0b3IrKyhpbnQpICB7Ci0gICAgX1NlbGYgX190bXAgPSAqdGhpczsKLSAgICArKyp0aGlzOwotICAgIHJldHVybiBfX3RtcDsKLSAgfQotCi0gIF9TZWxmJiBvcGVyYXRvci0tKCkgeyB0aGlzLT5fTV9kZWNyZW1lbnQoKTsgcmV0dXJuICp0aGlzOyB9Ci0gIF9TZWxmIG9wZXJhdG9yLS0oaW50KSB7Ci0gICAgX1NlbGYgX190bXAgPSAqdGhpczsKLSAgICAtLSp0aGlzOwotICAgIHJldHVybiBfX3RtcDsKLSAgfQotCi0gIF9TZWxmJiBvcGVyYXRvcis9KGRpZmZlcmVuY2VfdHlwZSBfX24pIHsgdGhpcy0+X01fYWR2YW5jZShfX24pOyByZXR1cm4gKnRoaXM7IH0KLSAgX1NlbGYgb3BlcmF0b3IrKGRpZmZlcmVuY2VfdHlwZSBfX24pIGNvbnN0IHsKLSAgICBfU2VsZiBfX3RtcCA9ICp0aGlzOwotICAgIHJldHVybiBfX3RtcCArPSBfX247Ci0gIH0KLQotICBfU2VsZiYgb3BlcmF0b3ItPShkaWZmZXJlbmNlX3R5cGUgX19uKSB7IHJldHVybiAqdGhpcyArPSAtX19uOyB9Ci0gIF9TZWxmIG9wZXJhdG9yLShkaWZmZXJlbmNlX3R5cGUgX19uKSBjb25zdCB7Ci0gICAgX1NlbGYgX190bXAgPSAqdGhpczsKLSAgICByZXR1cm4gX190bXAgLT0gX19uOwotICB9Ci0KLSAgcmVmZXJlbmNlIG9wZXJhdG9yW10oZGlmZmVyZW5jZV90eXBlIF9fbikgY29uc3QgeyByZXR1cm4gKigqdGhpcyArIF9fbik7IH0KLX07Ci0KLQotdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1RyYWl0cz4KLWlubGluZSBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfVHJhaXRzPiBfU1RMUF9DQUxMCi1vcGVyYXRvcisocHRyZGlmZl90IF9fbiwgY29uc3QgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1RyYWl0cz4mIF9feCkKLXsgcmV0dXJuIF9feCArIF9fbjsgfQotCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfU0VQQVJBVEVfUkVMT1BTX05BTUVTUEFDRSkKLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgYm9vbCBfU1RMUF9DQUxMCi1vcGVyYXRvcj09KGNvbnN0IF9EZXF1ZV9pdGVyYXRvcl9iYXNlPF9UcCA+JiBfX3gsCi0gICAgICAgICAgIGNvbnN0IF9EZXF1ZV9pdGVyYXRvcl9iYXNlPF9UcCA+JiBfX3kpCi17IHJldHVybiBfX3guX01fY3VyID09IF9feS5fTV9jdXI7IH0KLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWlubGluZSBib29sIF9TVExQX0NBTEwKLW9wZXJhdG9yIDwgKGNvbnN0IF9EZXF1ZV9pdGVyYXRvcl9iYXNlPF9UcCA+JiBfX3gsCi0gICAgICAgICAgICBjb25zdCBfRGVxdWVfaXRlcmF0b3JfYmFzZTxfVHAgPiYgX195KSB7Ci0gIHJldHVybiAoX194Ll9NX25vZGUgPT0gX195Ll9NX25vZGUpID8KLSAgICAoX194Ll9NX2N1ciA8IF9feS5fTV9jdXIpIDogKF9feC5fTV9ub2RlIDwgX195Ll9NX25vZGUpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotaW5saW5lIGJvb2wgX1NUTFBfQ0FMTAotb3BlcmF0b3IhPShjb25zdCBfRGVxdWVfaXRlcmF0b3JfYmFzZTxfVHAgPiYgX194LAotICAgICAgICAgICBjb25zdCBfRGVxdWVfaXRlcmF0b3JfYmFzZTxfVHAgPiYgX195KQoteyByZXR1cm4gX194Ll9NX2N1ciAhPSBfX3kuX01fY3VyOyB9Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgYm9vbCBfU1RMUF9DQUxMCi1vcGVyYXRvcj4oY29uc3QgX0RlcXVlX2l0ZXJhdG9yX2Jhc2U8X1RwID4mIF9feCwKLSAgICAgICAgICBjb25zdCBfRGVxdWVfaXRlcmF0b3JfYmFzZTxfVHAgPiYgX195KQoteyByZXR1cm4gX195IDwgX194OyB9Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgYm9vbCAgX1NUTFBfQ0FMTCBvcGVyYXRvcj49KGNvbnN0IF9EZXF1ZV9pdGVyYXRvcl9iYXNlPF9UcCA+JiBfX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9EZXF1ZV9pdGVyYXRvcl9iYXNlPF9UcCA+JiBfX3kpCi17IHJldHVybiAhKF9feCA8IF9feSk7IH0KLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWlubGluZSBib29sICBfU1RMUF9DQUxMIG9wZXJhdG9yPD0oY29uc3QgX0RlcXVlX2l0ZXJhdG9yX2Jhc2U8X1RwID4mIF9feCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0RlcXVlX2l0ZXJhdG9yX2Jhc2U8X1RwID4mIF9feSkKLXsgcmV0dXJuICEoX195IDwgX194KTsgfQotCi0jZWxzZSAvKiBfU1RMUF9VU0VfU0VQQVJBVEVfUkVMT1BTX05BTUVTUEFDRSAqLwotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVHJhaXRzMSwgY2xhc3MgX1RyYWl0czI+Ci1pbmxpbmUgYm9vbCAgX1NUTFBfQ0FMTAotb3BlcmF0b3I9PShjb25zdCBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfVHJhaXRzMSA+JiBfX3gsCi0gICAgICAgICAgIGNvbnN0IF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcmFpdHMyID4mIF9feSkKLXsgcmV0dXJuIF9feC5fTV9jdXIgPT0gX195Ll9NX2N1cjsgfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVHJhaXRzMSwgY2xhc3MgX1RyYWl0czI+Ci1pbmxpbmUgYm9vbCBfU1RMUF9DQUxMCi1vcGVyYXRvciA8IChjb25zdCBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfVHJhaXRzMSA+JiBfX3gsCi0gICAgICAgICAgICBjb25zdCBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfVHJhaXRzMiA+JiBfX3kpIHsKLSAgcmV0dXJuIChfX3guX01fbm9kZSA9PSBfX3kuX01fbm9kZSkgPwotICAgIChfX3guX01fY3VyIDwgX195Ll9NX2N1cikgOiAoX194Ll9NX25vZGUgPCBfX3kuX01fbm9kZSk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgYm9vbCBfU1RMUF9DQUxMCi1vcGVyYXRvciE9KGNvbnN0IF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9Ob25jb25zdF90cmFpdHM8X1RwPiA+JiBfX3gsCi0gICAgICAgICAgIGNvbnN0IF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9Db25zdF90cmFpdHM8X1RwPiA+JiBfX3kpCi17IHJldHVybiBfX3guX01fY3VyICE9IF9feS5fTV9jdXI7IH0KLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWlubGluZSBib29sIF9TVExQX0NBTEwKLW9wZXJhdG9yPihjb25zdCBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfTm9uY29uc3RfdHJhaXRzPF9UcD4gPiYgX194LAotICAgICAgICAgIGNvbnN0IF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9Db25zdF90cmFpdHM8X1RwPiA+JiBfX3kpCi17IHJldHVybiBfX3kgPCBfX3g7IH0KLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWlubGluZSBib29sICBfU1RMUF9DQUxMCi1vcGVyYXRvcj49KGNvbnN0IF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9Ob25jb25zdF90cmFpdHM8X1RwPiA+JiBfX3gsCi0gICAgICAgICAgIGNvbnN0IF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9Db25zdF90cmFpdHM8X1RwPiA+JiBfX3kpCi17IHJldHVybiAhKF9feCA8IF9feSk7IH0KLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWlubGluZSBib29sIF9TVExQX0NBTEwKLW9wZXJhdG9yPD0oY29uc3QgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX05vbmNvbnN0X3RyYWl0czxfVHA+ID4mIF9feCwKLSAgICAgICAgICAgY29uc3QgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX0NvbnN0X3RyYWl0czxfVHA+ID4mIF9feSkKLXsgcmV0dXJuICEoX195IDwgX194KTsgfQotI2VuZGlmIC8qIF9TVExQX1VTRV9TRVBBUkFURV9SRUxPUFNfTkFNRVNQQUNFICovCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVHJhaXRzPgotc3RydWN0IF9fdHlwZV90cmFpdHM8X1NUTFBfUFJJViBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfVHJhaXRzPiA+IHsKLSAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgICBoYXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yOwotICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2NvcHlfY29uc3RydWN0b3I7Ci0gIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfYXNzaWdubWVudF9vcGVyYXRvcjsKLSAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9kZXN0cnVjdG9yOwotICB0eXBlZGVmIF9fZmFsc2VfdHlwZSAgIGlzX1BPRF90eXBlOwotfTsKLV9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKLSNlbmRpZiAvKiBfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OICovCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfT0xEX0hQX0lURVJBVE9SX1FVRVJJRVMpCi1fU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKLXRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9UcmFpdHM+IGlubGluZSBfVHAqICBfU1RMUF9DQUxMCi12YWx1ZV90eXBlKGNvbnN0IF9TVExQX1BSSVYgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1RyYWl0cyAgPiYpIHsgcmV0dXJuIChfVHAqKTA7IH0KLXRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9UcmFpdHM+IGlubGluZSByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyBfU1RMUF9DQUxMCi1pdGVyYXRvcl9jYXRlZ29yeShjb25zdCBfU1RMUF9QUklWIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcmFpdHMgID4mKSB7IHJldHVybiByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZygpOyB9Ci10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVHJhaXRzPiBpbmxpbmUgcHRyZGlmZl90KiBfU1RMUF9DQUxMCi1kaXN0YW5jZV90eXBlKGNvbnN0IF9TVExQX1BSSVYgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1RyYWl0cyAgPiYpIHsgcmV0dXJuIDA7IH0KLV9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKLSNlbmRpZgotCi0vKiBEZXF1ZSBiYXNlIGNsYXNzLiAgSXQgaGFzIHR3byBwdXJwb3Nlcy4gIEZpcnN0LCBpdHMgY29uc3RydWN0b3IKLSAqICBhbmQgZGVzdHJ1Y3RvciBhbGxvY2F0ZSAoYnV0IGRvbid0IGluaXRpYWxpemUpIHN0b3JhZ2UuICBUaGlzIG1ha2VzCi0gKiAgZXhjZXB0aW9uIHNhZmV0eSBlYXNpZXIuICBTZWNvbmQsIHRoZSBiYXNlIGNsYXNzIGVuY2Fwc3VsYXRlcyBhbGwgb2YKLSAqICB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBTR0ktc3R5bGUgYWxsb2NhdG9ycyBhbmQgc3RhbmRhcmQtY29uZm9ybWluZwotICogIGFsbG9jYXRvcnMuCi0gKi8KLQotdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgotY2xhc3MgX0RlcXVlX2Jhc2UgewotICB0eXBlZGVmIF9EZXF1ZV9iYXNlPF9UcCwgX0FsbG9jPiBfU2VsZjsKLXB1YmxpYzoKLSAgdHlwZWRlZiBfVHAgdmFsdWVfdHlwZTsKLSAgX1NUTFBfRk9SQ0VfQUxMT0NBVE9SUyhfVHAsIF9BbGxvYykKLSAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2NfdHJhaXRzPF9UcCxfQWxsb2M+OjphbGxvY2F0b3JfdHlwZSAgYWxsb2NhdG9yX3R5cGU7Ci0gIHR5cGVkZWYgX1NUTFBfYWxsb2NfcHJveHk8c2l6ZV90LCB2YWx1ZV90eXBlLCAgYWxsb2NhdG9yX3R5cGU+IF9BbGxvY19wcm94eTsKLQotICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY190cmFpdHM8X1RwKiwgX0FsbG9jPjo6YWxsb2NhdG9yX3R5cGUgX01hcF9hbGxvY190eXBlOwotICB0eXBlZGVmIF9TVExQX2FsbG9jX3Byb3h5PHZhbHVlX3R5cGUqKiwgdmFsdWVfdHlwZSosIF9NYXBfYWxsb2NfdHlwZT4gX01hcF9hbGxvY19wcm94eTsKLQotICB0eXBlZGVmIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9Ob25jb25zdF90cmFpdHM8X1RwPiA+IGl0ZXJhdG9yOwotICB0eXBlZGVmIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9Db25zdF90cmFpdHM8X1RwPiA+ICAgIGNvbnN0X2l0ZXJhdG9yOwotCi0gIHN0YXRpYyBzaXplX3QgX1NUTFBfQ0FMTCBidWZmZXJfc2l6ZSgpIHsgcmV0dXJuIChzaXplX3QpX0RlcXVlX2l0ZXJhdG9yX2Jhc2U8X1RwPjo6X19idWZmZXJfc2l6ZTsgfQotCi0gIF9EZXF1ZV9iYXNlKGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EsIHNpemVfdCBfX251bV9lbGVtZW50cykKLSAgICA6IF9NX3N0YXJ0KCksIF9NX2ZpbmlzaCgpLCBfTV9tYXAoX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoX19hLCBfVHAqKSwgMCksCi0gICAgICBfTV9tYXBfc2l6ZShfX2EsIChzaXplX3QpMCkKLSAgeyBfTV9pbml0aWFsaXplX21hcChfX251bV9lbGVtZW50cyk7IH0KLQotICBfRGVxdWVfYmFzZShjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQotICAgIDogX01fc3RhcnQoKSwgX01fZmluaXNoKCksIF9NX21hcChfU1RMUF9DT05WRVJUX0FMTE9DQVRPUihfX2EsIF9UcCopLCAwKSwKLSAgICAgIF9NX21hcF9zaXplKF9fYSwgKHNpemVfdCkwKSB7fQotCi0gIF9EZXF1ZV9iYXNlKF9fbW92ZV9zb3VyY2U8X1NlbGY+IHNyYykKLSAgICA6IF9NX3N0YXJ0KHNyYy5nZXQoKS5fTV9zdGFydCksIF9NX2ZpbmlzaChzcmMuZ2V0KCkuX01fZmluaXNoKSwKLSAgICAgIF9NX21hcChfX21vdmVfc291cmNlPF9NYXBfYWxsb2NfcHJveHk+KHNyYy5nZXQoKS5fTV9tYXApKSwKLSAgICAgIF9NX21hcF9zaXplKF9fbW92ZV9zb3VyY2U8X0FsbG9jX3Byb3h5PihzcmMuZ2V0KCkuX01fbWFwX3NpemUpKSB7Ci0gICAgc3JjLmdldCgpLl9NX21hcC5fTV9kYXRhID0gMDsKLSAgICBzcmMuZ2V0KCkuX01fbWFwX3NpemUuX01fZGF0YSA9IDA7Ci0gICAgc3JjLmdldCgpLl9NX2ZpbmlzaCA9IHNyYy5nZXQoKS5fTV9zdGFydDsKLSAgfQotCi0gIH5fRGVxdWVfYmFzZSgpOwotCi1wcm90ZWN0ZWQ6Ci0gIHZvaWQgX01faW5pdGlhbGl6ZV9tYXAoc2l6ZV90KTsKLSAgdm9pZCBfTV9jcmVhdGVfbm9kZXMoX1RwKiogX19uc3RhcnQsIF9UcCoqIF9fbmZpbmlzaCk7Ci0gIHZvaWQgX01fZGVzdHJveV9ub2RlcyhfVHAqKiBfX25zdGFydCwgX1RwKiogX19uZmluaXNoKTsKLSAgZW51bSB7IF9TX2luaXRpYWxfbWFwX3NpemUgPSA4IH07Ci0KLXByb3RlY3RlZDoKLSAgaXRlcmF0b3IgX01fc3RhcnQ7Ci0gIGl0ZXJhdG9yIF9NX2ZpbmlzaDsKLSAgX01hcF9hbGxvY19wcm94eSAgX01fbWFwOwotICBfQWxsb2NfcHJveHkgICAgICBfTV9tYXBfc2l6ZTsKLX07Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUFRSX1NQRUNJQUxJWkFUSU9OUykKLSMgIGRlZmluZSBkZXF1ZSBfU1RMUF9QVFJfSU1QTF9OQU1FKGRlcXVlKQotI2VsaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpCi0jICBkZWZpbmUgZGVxdWUgX1NUTFBfTk9OX0RCR19OQU1FKGRlcXVlKQotI2Vsc2UKLV9TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQotI2VuZGlmCi0KLXRlbXBsYXRlIDxjbGFzcyBfVHAsIF9TVExQX0RFRkFVTFRfQUxMT0NBVE9SX1NFTEVDVChfVHApID4KLWNsYXNzIGRlcXVlIDogcHJvdGVjdGVkIF9TVExQX1BSSVYgX0RlcXVlX2Jhc2U8X1RwLCBfQWxsb2M+Ci0jaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKSAmJiAhZGVmaW5lZCAoZGVxdWUpCi0gICAgICAgICAgICAsIHB1YmxpYyBfX3N0bHBvcnRfY2xhc3M8ZGVxdWU8X1RwLCBfQWxsb2M+ID4KLSNlbmRpZgotewotICB0eXBlZGVmIF9TVExQX1BSSVYgX0RlcXVlX2Jhc2U8X1RwLCBfQWxsb2M+IF9CYXNlOwotICB0eXBlZGVmIGRlcXVlPF9UcCwgX0FsbG9jPiBfU2VsZjsKLXB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gQmFzaWMgdHlwZXMKLSAgdHlwZWRlZiBfVHAgdmFsdWVfdHlwZTsKLSAgdHlwZWRlZiB2YWx1ZV90eXBlKiBwb2ludGVyOwotICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUqIGNvbnN0X3BvaW50ZXI7Ci0gIHR5cGVkZWYgdmFsdWVfdHlwZSYgcmVmZXJlbmNlOwotICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmIGNvbnN0X3JlZmVyZW5jZTsKLSAgdHlwZWRlZiBzaXplX3Qgc2l6ZV90eXBlOwotICB0eXBlZGVmIHB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7Ci0gIHR5cGVkZWYgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgX0l0ZXJhdG9yX2NhdGVnb3J5OwotICBfU1RMUF9GT1JDRV9BTExPQ0FUT1JTKF9UcCwgX0FsbG9jKQotICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKLQotcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJdGVyYXRvcnMKLSAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IgICAgICAgaXRlcmF0b3I7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOwotCi0gIF9TVExQX0RFQ0xBUkVfUkFORE9NX0FDQ0VTU19SRVZFUlNFX0lURVJBVE9SUzsKLQotcHJvdGVjdGVkOiAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbCB0eXBlZGVmcwotICB0eXBlZGVmIHBvaW50ZXIqIF9NYXBfcG9pbnRlcjsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfX3R5cGVfdHJhaXRzPF9UcD46Omhhc190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3IgX1RyaXZpYWxBc3M7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX190eXBlX3RyYWl0czxfVHA+OjpoYXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yIF9Ucml2aWFsQ3B5OwotICB0eXBlZGVmIHR5cGVuYW1lIF9Ucml2aWFsSW5pdDxfVHA+OjpfUmV0IF9Ucml2aWFsSW5pdDsKLSNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKLSAgdHlwZWRlZiB0eXBlbmFtZSBfX21vdmVfdHJhaXRzPF9UcD46OmltcGxlbWVudGVkIF9Nb3ZhYmxlOwotI2Vsc2UKLSAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgX01vdmFibGU7Ci0jZW5kaWYKLQotcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCYXNpYyBhY2Nlc3NvcnMKLSAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiB0aGlzLT5fTV9zdGFydDsgfQotICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiB0aGlzLT5fTV9maW5pc2g7IH0KLSAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBjb25zdF9pdGVyYXRvcih0aGlzLT5fTV9zdGFydCk7IH0KLSAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IodGhpcy0+X01fZmluaXNoKTsgfQotCi0gIHJldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcih0aGlzLT5fTV9maW5pc2gpOyB9Ci0gIHJldmVyc2VfaXRlcmF0b3IgcmVuZCgpIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IodGhpcy0+X01fc3RhcnQpOyB9Ci0gIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3QKLSAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKHRoaXMtPl9NX2ZpbmlzaCk7IH0KLSAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgY29uc3QKLSAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKHRoaXMtPl9NX3N0YXJ0KTsgfQotCi0gIHJlZmVyZW5jZSBvcGVyYXRvcltdKHNpemVfdHlwZSBfX24pCi0gICAgeyByZXR1cm4gdGhpcy0+X01fc3RhcnRbZGlmZmVyZW5jZV90eXBlKF9fbildOyB9Ci0gIGNvbnN0X3JlZmVyZW5jZSBvcGVyYXRvcltdKHNpemVfdHlwZSBfX24pIGNvbnN0Ci0gICAgeyByZXR1cm4gdGhpcy0+X01fc3RhcnRbZGlmZmVyZW5jZV90eXBlKF9fbildOyB9Ci0KLSAgdm9pZCBfTV9yYW5nZV9jaGVjayhzaXplX3R5cGUgX19uKSBjb25zdCB7Ci0gICAgaWYgKF9fbiA+PSB0aGlzLT5zaXplKCkpCi0gICAgICBfX3N0bF90aHJvd19vdXRfb2ZfcmFuZ2UoImRlcXVlIik7Ci0gIH0KLSAgcmVmZXJlbmNlIGF0KHNpemVfdHlwZSBfX24pCi0gICAgeyBfTV9yYW5nZV9jaGVjayhfX24pOyByZXR1cm4gKCp0aGlzKVtfX25dOyB9Ci0gIGNvbnN0X3JlZmVyZW5jZSBhdChzaXplX3R5cGUgX19uKSBjb25zdAotICAgIHsgX01fcmFuZ2VfY2hlY2soX19uKTsgcmV0dXJuICgqdGhpcylbX19uXTsgfQotCi0gIHJlZmVyZW5jZSBmcm9udCgpIHsgcmV0dXJuICp0aGlzLT5fTV9zdGFydDsgfQotICByZWZlcmVuY2UgYmFjaygpIHsKLSAgICBpdGVyYXRvciBfX3RtcCA9IHRoaXMtPl9NX2ZpbmlzaDsKLSAgICAtLV9fdG1wOwotICAgIHJldHVybiAqX190bXA7Ci0gIH0KLSAgY29uc3RfcmVmZXJlbmNlIGZyb250KCkgY29uc3QgeyByZXR1cm4gKnRoaXMtPl9NX3N0YXJ0OyB9Ci0gIGNvbnN0X3JlZmVyZW5jZSBiYWNrKCkgY29uc3QgewotICAgIGNvbnN0X2l0ZXJhdG9yIF9fdG1wID0gdGhpcy0+X01fZmluaXNoOwotICAgIC0tX190bXA7Ci0gICAgcmV0dXJuICpfX3RtcDsKLSAgfQotCi0gIHNpemVfdHlwZSBzaXplKCkgY29uc3QgeyByZXR1cm4gdGhpcy0+X01fZmluaXNoIC0gdGhpcy0+X01fc3RhcnQ7IH0KLSAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgeyByZXR1cm4gc2l6ZV90eXBlKC0xKTsgfQotICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gdGhpcy0+X01fZmluaXNoID09IHRoaXMtPl9NX3N0YXJ0OyB9Ci0gIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdCB7IHJldHVybiB0aGlzLT5fTV9tYXBfc2l6ZTsgfQotCi1wdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnN0cnVjdG9yLCBkZXN0cnVjdG9yLgotI2lmICFkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQotICBleHBsaWNpdCBkZXF1ZShjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKLSNlbHNlCi0gIGRlcXVlKCkKLSAgICA6IF9TVExQX1BSSVYgX0RlcXVlX2Jhc2U8X1RwLCBfQWxsb2M+KGFsbG9jYXRvcl90eXBlKCksIDApIHt9Ci0gIGRlcXVlKGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCi0jZW5kaWYKLSAgICA6IF9TVExQX1BSSVYgX0RlcXVlX2Jhc2U8X1RwLCBfQWxsb2M+KF9fYSwgMCkge30KLQotICBkZXF1ZShjb25zdCBfU2VsZiYgX194KQotICAgIDogX1NUTFBfUFJJViBfRGVxdWVfYmFzZTxfVHAsIF9BbGxvYz4oX194LmdldF9hbGxvY2F0b3IoKSwgX194LnNpemUoKSkKLSAgeyBfU1RMUF9QUklWIF9fdWNvcHkoX194LmJlZ2luKCksIF9feC5lbmQoKSwgdGhpcy0+X01fc3RhcnQpOyB9Ci0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKLXByaXZhdGU6Ci0gIHZvaWQgX01faW5pdGlhbGl6ZShzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ZhbCA9IF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQoX1RwKSkKLSAgeyBfTV9maWxsX2luaXRpYWxpemUoX192YWwsIF9Ucml2aWFsSW5pdCgpKTsgfQotcHVibGljOgotICBleHBsaWNpdCBkZXF1ZShzaXplX3R5cGUgX19uKQotICAgIDogX1NUTFBfUFJJViBfRGVxdWVfYmFzZTxfVHAsIF9BbGxvYz4oYWxsb2NhdG9yX3R5cGUoKSwgX19uKQotICB7IF9NX2luaXRpYWxpemUoX19uKTsgfQotICBkZXF1ZShzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ZhbCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCi0jZWxzZQotICBleHBsaWNpdCBkZXF1ZShzaXplX3R5cGUgX19uKQotICAgIDogX1NUTFBfUFJJViBfRGVxdWVfYmFzZTxfVHAsIF9BbGxvYz4oYWxsb2NhdG9yX3R5cGUoKSwgX19uKQotICB7IF9NX2ZpbGxfaW5pdGlhbGl6ZShfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKF9UcCksIF9Ucml2aWFsSW5pdCgpKTsgfQotICBkZXF1ZShzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ZhbCkKLSAgICA6IF9TVExQX1BSSVYgX0RlcXVlX2Jhc2U8X1RwLCBfQWxsb2M+KGFsbG9jYXRvcl90eXBlKCksIF9fbikKLSAgeyBfTV9maWxsX2luaXRpYWxpemUoX192YWwsIF9fZmFsc2VfdHlwZSgpKTsgfQotICBkZXF1ZShzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ZhbCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKLSNlbmRpZgotICAgIDogX1NUTFBfUFJJViBfRGVxdWVfYmFzZTxfVHAsIF9BbGxvYz4oX19hLCBfX24pCi0gIHsgX01fZmlsbF9pbml0aWFsaXplKF9fdmFsLCBfX2ZhbHNlX3R5cGUoKSk7IH0KLQotI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCi1wcm90ZWN0ZWQ6Ci0gIHRlbXBsYXRlIDxjbGFzcyBfSW50ZWdlcj4KLSAgdm9pZCBfTV9pbml0aWFsaXplX2Rpc3BhdGNoKF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX194LCBjb25zdCBfX3RydWVfdHlwZSYpIHsKLSAgICB0aGlzLT5fTV9pbml0aWFsaXplX21hcChfX24pOwotICAgIF9NX2ZpbGxfaW5pdGlhbGl6ZShfX3gsIF9fZmFsc2VfdHlwZSgpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgotICB2b2lkIF9NX2luaXRpYWxpemVfZGlzcGF0Y2goX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fZmFsc2VfdHlwZSYpIHsKLSAgICBfTV9yYW5nZV9pbml0aWFsaXplKF9fZmlyc3QsIF9fbGFzdCwgX1NUTFBfSVRFUkFUT1JfQ0FURUdPUlkoX19maXJzdCwgX0lucHV0SXRlcikpOwotICB9Ci0KLXB1YmxpYzoKLSAgLy8gQ2hlY2sgd2hldGhlciBpdCdzIGFuIGludGVncmFsIHR5cGUuICBJZiBzbywgaXQncyBub3QgYW4gaXRlcmF0b3IuCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KLSAgZGVxdWUoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAotICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hIF9TVExQX0FMTE9DQVRPUl9UWVBFX0RGTCkKLSAgICA6IF9TVExQX1BSSVYgX0RlcXVlX2Jhc2U8X1RwLCBfQWxsb2M+KF9fYSkgewotICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lzSW50ZWdyYWw8X0lucHV0SXRlcmF0b3I+OjpfUmV0IF9JbnRlZ3JhbDsKLSAgICBfTV9pbml0aWFsaXplX2Rpc3BhdGNoKF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOwotICB9Ci0KLSMgIGlmIGRlZmluZWQgKF9TVExQX05FRURTX0VYVFJBX1RFTVBMQVRFX0NPTlNUUlVDVE9SUykKLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgotICBkZXF1ZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCi0gICAgOiBfU1RMUF9QUklWIF9EZXF1ZV9iYXNlPF9UcCwgX0FsbG9jPihhbGxvY2F0b3JfdHlwZSgpKSB7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBfSXNJbnRlZ3JhbDxfSW5wdXRJdGVyYXRvcj46Ol9SZXQgX0ludGVncmFsOwotICAgIF9NX2luaXRpYWxpemVfZGlzcGF0Y2goX19maXJzdCwgX19sYXN0LCBfSW50ZWdyYWwoKSk7Ci0gIH0KLSMgIGVuZGlmCi0KLSNlbHNlCi0gIGRlcXVlKGNvbnN0IHZhbHVlX3R5cGUqIF9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbGFzdCwKLSAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkgKQotICAgIDogX1NUTFBfUFJJViBfRGVxdWVfYmFzZTxfVHAsIF9BbGxvYz4oX19hLCBfX2xhc3QgLSBfX2ZpcnN0KQotICB7IF9TVExQX1BSSVYgX191Y29weShfX2ZpcnN0LCBfX2xhc3QsIHRoaXMtPl9NX3N0YXJ0KTsgfQotCi0gIGRlcXVlKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCwKLSAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkgKQotICAgIDogX1NUTFBfUFJJViBfRGVxdWVfYmFzZTxfVHAsIF9BbGxvYz4oX19hLCBfX2xhc3QgLSBfX2ZpcnN0KQotICB7IF9TVExQX1BSSVYgX191Y29weShfX2ZpcnN0LCBfX2xhc3QsIHRoaXMtPl9NX3N0YXJ0KTsgfQotI2VuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KLQotICBkZXF1ZShfX21vdmVfc291cmNlPF9TZWxmPiBzcmMpCi0gICAgOiBfU1RMUF9QUklWIF9EZXF1ZV9iYXNlPF9UcCwgX0FsbG9jPihfX21vdmVfc291cmNlPF9CYXNlPihzcmMuZ2V0KCkpKQotICB7fQotCi0gIH5kZXF1ZSgpCi0gIHsgX1NUTFBfU1REOjpfRGVzdHJveV9SYW5nZSh0aGlzLT5fTV9zdGFydCwgdGhpcy0+X01fZmluaXNoKTsgfQotCi0gIF9TZWxmJiBvcGVyYXRvcj0gKGNvbnN0IF9TZWxmJiBfX3gpOwotCi0gIHZvaWQgc3dhcChfU2VsZiYgX194KSB7Ci0gICAgX1NUTFBfU1REOjpzd2FwKHRoaXMtPl9NX3N0YXJ0LCBfX3guX01fc3RhcnQpOwotICAgIF9TVExQX1NURDo6c3dhcCh0aGlzLT5fTV9maW5pc2gsIF9feC5fTV9maW5pc2gpOwotICAgIHRoaXMtPl9NX21hcC5zd2FwKF9feC5fTV9tYXApOwotICAgIHRoaXMtPl9NX21hcF9zaXplLnN3YXAoX194Ll9NX21hcF9zaXplKTsKLSAgfQotCi1wdWJsaWM6Ci0gIC8vIGFzc2lnbigpLCBhIGdlbmVyYWxpemVkIGFzc2lnbm1lbnQgbWVtYmVyIGZ1bmN0aW9uLiAgVHdvCi0gIC8vIHZlcnNpb25zOiBvbmUgdGhhdCB0YWtlcyBhIGNvdW50LCBhbmQgb25lIHRoYXQgdGFrZXMgYSByYW5nZS4KLSAgLy8gVGhlIHJhbmdlIHZlcnNpb24gaXMgYSBtZW1iZXIgdGVtcGxhdGUsIHNvIHdlIGRpc3BhdGNoIG9uIHdoZXRoZXIKLSAgLy8gb3Igbm90IHRoZSB0eXBlIGlzIGFuIGludGVnZXIuCi0KLSAgdm9pZCBfTV9maWxsX2Fzc2lnbihzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9fdmFsKSB7Ci0gICAgaWYgKF9fbiA+IHNpemUoKSkgewotICAgICAgX1NUTFBfU1REOjpmaWxsKGJlZ2luKCksIGVuZCgpLCBfX3ZhbCk7Ci0gICAgICBpbnNlcnQoZW5kKCksIF9fbiAtIHNpemUoKSwgX192YWwpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGVyYXNlKGJlZ2luKCkgKyBfX24sIGVuZCgpKTsKLSAgICAgIF9TVExQX1NURDo6ZmlsbChiZWdpbigpLCBlbmQoKSwgX192YWwpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgYXNzaWduKHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX192YWwpIHsKLSAgICBfTV9maWxsX2Fzc2lnbihfX24sIF9fdmFsKTsKLSAgfQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgotICB2b2lkIGFzc2lnbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpIHsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0ludGVncmFsPF9JbnB1dEl0ZXJhdG9yPjo6X1JldCBfSW50ZWdyYWw7Ci0gICAgX01fYXNzaWduX2Rpc3BhdGNoKF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOwotICB9Ci0KLXByaXZhdGU6ICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGVscGVyIGZ1bmN0aW9ucyBmb3IgYXNzaWduKCkKLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0ludGVnZXI+Ci0gIHZvaWQgX01fYXNzaWduX2Rpc3BhdGNoKF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX192YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKl9Jc0ludGVncmFsKi8pCi0gIHsgX01fZmlsbF9hc3NpZ24oKHNpemVfdHlwZSkgX19uLCAoX1RwKSBfX3ZhbCk7IH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Ci0gIHZvaWQgX01fYXNzaWduX2Rpc3BhdGNoKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19mYWxzZV90eXBlJiAvKl9Jc0ludGVncmFsKi8pIHsKLSAgICBfTV9hc3NpZ25fYXV4KF9fZmlyc3QsIF9fbGFzdCwgX1NUTFBfSVRFUkFUT1JfQ0FURUdPUlkoX19maXJzdCwgX0lucHV0SXRlcmF0b3IpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgotICB2b2lkIF9NX2Fzc2lnbl9hdXgoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwgY29uc3QgaW5wdXRfaXRlcmF0b3JfdGFnICYpIHsKLSAgICBpdGVyYXRvciBfX2N1ciA9IGJlZ2luKCk7Ci0gICAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdCAmJiBfX2N1ciAhPSBlbmQoKTsgKytfX2N1ciwgKytfX2ZpcnN0KQotICAgICAgKl9fY3VyID0gKl9fZmlyc3Q7Ci0gICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQotICAgICAgZXJhc2UoX19jdXIsIGVuZCgpKTsKLSAgICBlbHNlCi0gICAgICBpbnNlcnQoZW5kKCksIF9fZmlyc3QsIF9fbGFzdCk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KLSAgdm9pZCBfTV9hc3NpZ25fYXV4KF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3J3YXJkX2l0ZXJhdG9yX3RhZyAmKSB7Ci0jZWxzZQotICB2b2lkIGFzc2lnbihjb25zdCB2YWx1ZV90eXBlICpfX2ZpcnN0LCBjb25zdCB2YWx1ZV90eXBlICpfX2xhc3QpIHsKLSAgICBzaXplX3R5cGUgX19zaXplID0gc2l6ZSgpOwotICAgIHNpemVfdHlwZSBfX2xlbiA9IF9fbGFzdCAtIF9fZmlyc3Q7Ci0gICAgaWYgKF9fbGVuID4gX19zaXplKSB7Ci0gICAgICBjb25zdCB2YWx1ZV90eXBlICpfX21pZCA9IF9fZmlyc3QgKyBfX3NpemU7Ci0gICAgICBjb3B5KF9fZmlyc3QsIF9fbWlkLCBiZWdpbigpKTsKLSAgICAgIGluc2VydChlbmQoKSwgX19taWQsIF9fbGFzdCk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgZXJhc2UoY29weShfX2ZpcnN0LCBfX2xhc3QsIGJlZ2luKCkpLCBlbmQoKSk7Ci0gICAgfQotICB9Ci0gIHZvaWQgYXNzaWduKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkgewotICAgIHR5cGVkZWYgY29uc3RfaXRlcmF0b3IgX0ZvcndhcmRJdGVyYXRvcjsKLSNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCi0gICAgc2l6ZV90eXBlIF9fbGVuID0gZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KTsKLSAgICBpZiAoX19sZW4gPiBzaXplKCkpIHsKLSAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19taWQgPSBfX2ZpcnN0OwotICAgICAgYWR2YW5jZShfX21pZCwgc2l6ZSgpKTsKLSAgICAgIGNvcHkoX19maXJzdCwgX19taWQsIGJlZ2luKCkpOwotICAgICAgaW5zZXJ0KGVuZCgpLCBfX21pZCwgX19sYXN0KTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBlcmFzZShjb3B5KF9fZmlyc3QsIF9fbGFzdCwgYmVnaW4oKSksIGVuZCgpKTsKLSAgICB9Ci0gIH0KLQotCi1wdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHB1c2hfKiBhbmQgcG9wXyoKLQotI2lmICFkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fQU5BQ0hST05JU01TKQotICB2b2lkIHB1c2hfYmFjayhjb25zdCB2YWx1ZV90eXBlJiBfX3QgPSBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKF9UcCkpIHsKLSNlbHNlCi0gIHZvaWQgcHVzaF9iYWNrKGNvbnN0IHZhbHVlX3R5cGUmIF9fdCkgewotI2VuZGlmIC8qIV9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0gJiYgIV9TVExQX05PX0FOQUNIUk9OSVNNUyovCi0gICAgaWYgKHRoaXMtPl9NX2ZpbmlzaC5fTV9jdXIgIT0gdGhpcy0+X01fZmluaXNoLl9NX2xhc3QgLSAxKSB7Ci0gICAgICBfQ29weV9Db25zdHJ1Y3QodGhpcy0+X01fZmluaXNoLl9NX2N1ciwgX190KTsKLSAgICAgICsrdGhpcy0+X01fZmluaXNoLl9NX2N1cjsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgX01fcHVzaF9iYWNrX2F1eF92KF9fdCk7Ci0gIH0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkgJiYgIWRlZmluZWQgKF9TVExQX05PX0FOQUNIUk9OSVNNUykKLSAgdm9pZCBwdXNoX2Zyb250KGNvbnN0IHZhbHVlX3R5cGUmIF9fdCA9IF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQoX1RwKSkgICB7Ci0jZWxzZQotICB2b2lkIHB1c2hfZnJvbnQoY29uc3QgdmFsdWVfdHlwZSYgX190KSAgIHsKLSNlbmRpZiAvKiFfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNICYmICFfU1RMUF9OT19BTkFDSFJPTklTTVMqLwotICAgIGlmICh0aGlzLT5fTV9zdGFydC5fTV9jdXIgIT0gdGhpcy0+X01fc3RhcnQuX01fZmlyc3QpIHsKLSAgICAgIF9Db3B5X0NvbnN0cnVjdCh0aGlzLT5fTV9zdGFydC5fTV9jdXIgLSAxLCBfX3QpOwotICAgICAgLS10aGlzLT5fTV9zdGFydC5fTV9jdXI7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIF9NX3B1c2hfZnJvbnRfYXV4X3YoX190KTsKLSAgfQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkgJiYgIWRlZmluZWQgKF9TVExQX05PX0FOQUNIUk9OSVNNUykKLSAgdm9pZCBwdXNoX2JhY2soKSB7Ci0gICAgaWYgKHRoaXMtPl9NX2ZpbmlzaC5fTV9jdXIgIT0gdGhpcy0+X01fZmluaXNoLl9NX2xhc3QgLSAxKSB7Ci0gICAgICBfU1RMUF9TVEQ6Ol9Db25zdHJ1Y3QodGhpcy0+X01fZmluaXNoLl9NX2N1cik7Ci0gICAgICArK3RoaXMtPl9NX2ZpbmlzaC5fTV9jdXI7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIF9NX3B1c2hfYmFja19hdXgoKTsKLSAgfQotICB2b2lkIHB1c2hfZnJvbnQoKSB7Ci0gICAgaWYgKHRoaXMtPl9NX3N0YXJ0Ll9NX2N1ciAhPSB0aGlzLT5fTV9zdGFydC5fTV9maXJzdCkgewotICAgICAgX1NUTFBfU1REOjpfQ29uc3RydWN0KHRoaXMtPl9NX3N0YXJ0Ll9NX2N1ciAtIDEpOwotICAgICAgLS10aGlzLT5fTV9zdGFydC5fTV9jdXI7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIF9NX3B1c2hfZnJvbnRfYXV4KCk7Ci0gIH0KLSNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0gJiYgIV9TVExQX05PX0FOQUNIUk9OSVNNUyovCi0KLSAgdm9pZCBwb3BfYmFjaygpIHsKLSAgICBpZiAodGhpcy0+X01fZmluaXNoLl9NX2N1ciAhPSB0aGlzLT5fTV9maW5pc2guX01fZmlyc3QpIHsKLSAgICAgIC0tdGhpcy0+X01fZmluaXNoLl9NX2N1cjsKLSAgICAgIF9TVExQX1NURDo6X0Rlc3Ryb3kodGhpcy0+X01fZmluaXNoLl9NX2N1cik7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgX01fcG9wX2JhY2tfYXV4KCk7Ci0gICAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95KHRoaXMtPl9NX2ZpbmlzaC5fTV9jdXIpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgcG9wX2Zyb250KCkgewotICAgIF9TVExQX1NURDo6X0Rlc3Ryb3kodGhpcy0+X01fc3RhcnQuX01fY3VyKTsKLSAgICBfTV9wb3BfZnJvbnRfYXV4KCk7Ci0gIH0KLQotcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnNlcnQKLQotI2lmICFkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fQU5BQ0hST05JU01TKQotICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCA9IF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQoX1RwKSkgewotI2Vsc2UKLSAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpIHsKLSNlbmRpZiAvKiFfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNICYmICFfU1RMUF9OT19BTkFDSFJPTklTTVMqLwotICAgIGlmIChfX3Bvcy5fTV9jdXIgPT0gdGhpcy0+X01fc3RhcnQuX01fY3VyKSB7Ci0gICAgICBwdXNoX2Zyb250KF9feCk7Ci0gICAgICByZXR1cm4gdGhpcy0+X01fc3RhcnQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKF9fcG9zLl9NX2N1ciA9PSB0aGlzLT5fTV9maW5pc2guX01fY3VyKSB7Ci0gICAgICBwdXNoX2JhY2soX194KTsKLSAgICAgIGl0ZXJhdG9yIF9fdG1wID0gdGhpcy0+X01fZmluaXNoOwotICAgICAgLS1fX3RtcDsKLSAgICAgIHJldHVybiBfX3RtcDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICByZXR1cm4gX01fZmlsbF9pbnNlcnRfYXV4KF9fcG9zLCAxLCBfX3gsIF9Nb3ZhYmxlKCkpOwotICAgIH0KLSAgfQotCi0jaWYgZGVmaW5lZChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKSAmJiAhZGVmaW5lZChfU1RMUF9OT19BTkFDSFJPTklTTVMpCi0gIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBfX3BvcykKLSAgeyByZXR1cm4gaW5zZXJ0KF9fcG9zLCBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKF9UcCkpOyB9Ci0jZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNICYmICFfU1RMUF9OT19BTkFDSFJPTklTTVMqLwotCi0gIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCi0gIHsgX01fZmlsbF9pbnNlcnQoX19wb3MsIF9fbiwgX194KTsgfQotCi1wcm90ZWN0ZWQ6Ci0gIGl0ZXJhdG9yIF9NX2ZpbGxfaW5zZXJ0X2F1eChpdGVyYXRvciBfX3Bvcywgc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX194LCBjb25zdCBfX3RydWVfdHlwZSYgLypfTW92YWJsZSovKTsKLSAgaXRlcmF0b3IgX01fZmlsbF9pbnNlcnRfYXV4KGl0ZXJhdG9yIF9fcG9zLCBzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gsIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypfTW92YWJsZSovKTsKLQotICB2b2lkIF9NX2ZpbGxfaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpOwotCi0jaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2VyPgotICB2b2lkIF9NX2luc2VydF9kaXNwYXRjaChpdGVyYXRvciBfX3BvcywgX0ludGVnZXIgX19uLCBfSW50ZWdlciBfX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKl9Jc0ludGVncmFsKi8pIHsKLSAgICBfTV9maWxsX2luc2VydChfX3BvcywgKHNpemVfdHlwZSkgX19uLCAodmFsdWVfdHlwZSkgX194KTsKLSAgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KLSAgdm9pZCBfTV9pbnNlcnRfZGlzcGF0Y2goaXRlcmF0b3IgX19wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19mYWxzZV90eXBlJiAvKl9Jc0ludGVncmFsKi8pIHsKLSAgICBfTV9pbnNlcnQoX19wb3MsIF9fZmlyc3QsIF9fbGFzdCwgX1NUTFBfSVRFUkFUT1JfQ0FURUdPUlkoX19maXJzdCwgX0lucHV0SXRlcmF0b3IpKTsKLSAgfQotCi1wdWJsaWM6Ci0gIC8vIENoZWNrIHdoZXRoZXIgaXQncyBhbiBpbnRlZ3JhbCB0eXBlLiAgSWYgc28sIGl0J3Mgbm90IGFuIGl0ZXJhdG9yLgotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Ci0gIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpIHsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0ludGVncmFsPF9JbnB1dEl0ZXJhdG9yPjo6X1JldCBfSW50ZWdyYWw7Ci0gICAgX01faW5zZXJ0X2Rpc3BhdGNoKF9fcG9zLCBfX2ZpcnN0LCBfX2xhc3QsIF9JbnRlZ3JhbCgpKTsKLSAgfQotCi0jZWxzZSAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCi0gIHZvaWQgX01faW5zZXJ0X3JhbmdlX2F1eChpdGVyYXRvciBfX3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlX3R5cGUqIF9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX24sIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKl9Nb3ZhYmxlKi8pOwotICB2b2lkIF9NX2luc2VydF9yYW5nZV9hdXgoaXRlcmF0b3IgX19wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZV90eXBlKiBfX2ZpcnN0LCBjb25zdCB2YWx1ZV90eXBlKiBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uLCBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qX01vdmFibGUqLyk7Ci0gIHZvaWQgX01faW5zZXJ0X3JhbmdlX2F1eChpdGVyYXRvciBfX3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX24sIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKl9Nb3ZhYmxlKi8pOwotICB2b2lkIF9NX2luc2VydF9yYW5nZV9hdXgoaXRlcmF0b3IgX19wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uLCBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qX01vdmFibGUqLyk7Ci1wdWJsaWM6Ci0gIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLAotICAgICAgICAgICAgICBjb25zdCB2YWx1ZV90eXBlKiBfX2ZpcnN0LCBjb25zdCB2YWx1ZV90eXBlKiBfX2xhc3QpOwotICB2b2lkIGluc2VydChpdGVyYXRvciBfX3BvcywKLSAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KTsKLQotI2VuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KLQotcHVibGljOgotI2lmICFkZWZpbmVkKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCi0gIHZvaWQgcmVzaXplKHNpemVfdHlwZSBfX25ld19zaXplLAotICAgICAgICAgICAgICBjb25zdCB2YWx1ZV90eXBlJiBfX3ggPSBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKF9UcCkpIHsKLSNlbHNlCi0gIHZvaWQgcmVzaXplKHNpemVfdHlwZSBfX25ld19zaXplLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpIHsKLSNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0qLwotICAgIGNvbnN0IHNpemVfdHlwZSBfX2xlbiA9IHNpemUoKTsKLSAgICBpZiAoX19uZXdfc2l6ZSA8IF9fbGVuKQotICAgICAgZXJhc2UodGhpcy0+X01fc3RhcnQgKyBfX25ld19zaXplLCB0aGlzLT5fTV9maW5pc2gpOwotICAgIGVsc2UKLSAgICAgIGluc2VydCh0aGlzLT5fTV9maW5pc2gsIF9fbmV3X3NpemUgLSBfX2xlbiwgX194KTsKLSAgfQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKLSAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9fbmV3X3NpemUpCi0gIHsgcmVzaXplKF9fbmV3X3NpemUsIF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQoX1RwKSk7IH0KLSNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0qLwotCi1wcm90ZWN0ZWQ6Ci0gIGl0ZXJhdG9yIF9NX2VyYXNlKGl0ZXJhdG9yIF9fcG9zLCBjb25zdCBfX3RydWVfdHlwZSYgLypfTW92YWJsZSovKTsKLSAgaXRlcmF0b3IgX01fZXJhc2UoaXRlcmF0b3IgX19wb3MsIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypfTW92YWJsZSovKTsKLQotICBpdGVyYXRvciBfTV9lcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QsIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKl9Nb3ZhYmxlKi8pOwotICBpdGVyYXRvciBfTV9lcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QsIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypfTW92YWJsZSovKTsKLXB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXJhc2UKLSAgaXRlcmF0b3IgZXJhc2UoaXRlcmF0b3IgX19wb3MpIHsKLSAgICByZXR1cm4gX01fZXJhc2UoX19wb3MsIF9Nb3ZhYmxlKCkpOwotICB9Ci0gIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkgewotICAgIGlmIChfX2ZpcnN0ID09IHRoaXMtPl9NX3N0YXJ0ICYmIF9fbGFzdCA9PSB0aGlzLT5fTV9maW5pc2gpIHsKLSAgICAgIGNsZWFyKCk7Ci0gICAgICByZXR1cm4gdGhpcy0+X01fZmluaXNoOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKLSAgICAgICAgcmV0dXJuIF9fZmlyc3Q7Ci0gICAgICByZXR1cm4gX01fZXJhc2UoX19maXJzdCwgX19sYXN0LCBfTW92YWJsZSgpKTsKLSAgICB9Ci0gIH0KLSAgdm9pZCBjbGVhcigpOwotCi1wcm90ZWN0ZWQ6ICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWwgY29uc3RydWN0aW9uL2Rlc3RydWN0aW9uCi0KLSAgdm9pZCBfTV9maWxsX2luaXRpYWxpemUoY29uc3QgdmFsdWVfdHlwZSYgX192YWwsIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKl9Ucml2aWFsSW5pdCovKQotICB7fQotICB2b2lkIF9NX2ZpbGxfaW5pdGlhbGl6ZShjb25zdCB2YWx1ZV90eXBlJiBfX3ZhbCwgY29uc3QgX19mYWxzZV90eXBlJiAvKl9Ucml2aWFsSW5pdCovKTsKLQotI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KLSAgdm9pZCBfTV9yYW5nZV9pbml0aWFsaXplKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0X2l0ZXJhdG9yX3RhZyAmKSB7Ci0gICAgdGhpcy0+X01faW5pdGlhbGl6ZV9tYXAoMCk7Ci0gICAgX1NUTFBfVFJZIHsKLSAgICAgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKLSAgICAgICAgcHVzaF9iYWNrKCpfX2ZpcnN0KTsKLSAgICB9Ci0gICAgX1NUTFBfVU5XSU5EKGNsZWFyKCkpCi0gIH0KLSAgdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+Ci0gIHZvaWQgIF9NX3JhbmdlX2luaXRpYWxpemUoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3J3YXJkX2l0ZXJhdG9yX3RhZyAmKSAgewotICAgc2l6ZV90eXBlIF9fbiA9IGRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7Ci0gICB0aGlzLT5fTV9pbml0aWFsaXplX21hcChfX24pOwotICAgX01hcF9wb2ludGVyIF9fY3VyX25vZGUgPSB0aGlzLT5fTV9zdGFydC5fTV9ub2RlOwotICAgX1NUTFBfVFJZIHsKLSAgICBmb3IgKDsgX19jdXJfbm9kZSA8IHRoaXMtPl9NX2ZpbmlzaC5fTV9ub2RlOyArK19fY3VyX25vZGUpIHsKLSAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19taWQgPSBfX2ZpcnN0OwotICAgICAgYWR2YW5jZShfX21pZCwgdGhpcy0+YnVmZmVyX3NpemUoKSk7Ci0gICAgICB1bmluaXRpYWxpemVkX2NvcHkoX19maXJzdCwgX19taWQsICpfX2N1cl9ub2RlKTsKLSAgICAgIF9fZmlyc3QgPSBfX21pZDsKLSAgICB9Ci0gICAgdW5pbml0aWFsaXplZF9jb3B5KF9fZmlyc3QsIF9fbGFzdCwgdGhpcy0+X01fZmluaXNoLl9NX2ZpcnN0KTsKLSAgIH0KLSAgX1NUTFBfVU5XSU5EKF9TVExQX1NURDo6X0Rlc3Ryb3lfUmFuZ2UodGhpcy0+X01fc3RhcnQsIGl0ZXJhdG9yKCpfX2N1cl9ub2RlLCBfX2N1cl9ub2RlKSkpCi0gfQotI2VuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KLQotcHJvdGVjdGVkOiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsIHB1c2hfKiBhbmQgcG9wXyoKLQotICB2b2lkIF9NX3B1c2hfYmFja19hdXhfdihjb25zdCB2YWx1ZV90eXBlJik7Ci0gIHZvaWQgX01fcHVzaF9mcm9udF9hdXhfdihjb25zdCB2YWx1ZV90eXBlJik7Ci0jaWYgZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkgJiYgIWRlZmluZWQgKF9TVExQX05PX0FOQUNIUk9OSVNNUykKLSAgdm9pZCBfTV9wdXNoX2JhY2tfYXV4KCk7Ci0gIHZvaWQgX01fcHVzaF9mcm9udF9hdXgoKTsKLSNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0gIV9TVExQX05PX0FOQUNIUk9OSVNNUyovCi0gIHZvaWQgX01fcG9wX2JhY2tfYXV4KCk7Ci0gIHZvaWQgX01fcG9wX2Zyb250X2F1eCgpOwotCi1wcm90ZWN0ZWQ6ICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWwgaW5zZXJ0IGZ1bmN0aW9ucwotCi0jaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Ci0gIHZvaWQgX01faW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLAotICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsCi0gICAgICAgICAgICAgICAgX0lucHV0SXRlcmF0b3IgX19sYXN0LAotICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0X2l0ZXJhdG9yX3RhZyAmKSB7Ci0gICAgY29weShfX2ZpcnN0LCBfX2xhc3QsIGluc2VydGVyKCp0aGlzLCBfX3BvcykpOwotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+Ci0gIHZvaWQgIF9NX2luc2VydChpdGVyYXRvciBfX3BvcywKLSAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICBjb25zdCBmb3J3YXJkX2l0ZXJhdG9yX3RhZyAmKSB7Ci0gICAgc2l6ZV90eXBlIF9fbiA9IGRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7Ci0gICAgaWYgKF9fcG9zLl9NX2N1ciA9PSB0aGlzLT5fTV9zdGFydC5fTV9jdXIpIHsKLSAgICAgIGl0ZXJhdG9yIF9fbmV3X3N0YXJ0ID0gX01fcmVzZXJ2ZV9lbGVtZW50c19hdF9mcm9udChfX24pOwotICAgICAgX1NUTFBfVFJZIHsKLSAgICAgICAgdW5pbml0aWFsaXplZF9jb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19uZXdfc3RhcnQpOwotICAgICAgICB0aGlzLT5fTV9zdGFydCA9IF9fbmV3X3N0YXJ0OwotICAgICAgfQotICAgICAgX1NUTFBfVU5XSU5EKHRoaXMtPl9NX2Rlc3Ryb3lfbm9kZXMoX19uZXdfc3RhcnQuX01fbm9kZSwgdGhpcy0+X01fc3RhcnQuX01fbm9kZSkpCi0gICAgfQotICAgIGVsc2UgaWYgKF9fcG9zLl9NX2N1ciA9PSB0aGlzLT5fTV9maW5pc2guX01fY3VyKSB7Ci0gICAgICBpdGVyYXRvciBfX25ld19maW5pc2ggPSBfTV9yZXNlcnZlX2VsZW1lbnRzX2F0X2JhY2soX19uKTsKLSAgICAgIF9TVExQX1RSWSB7Ci0gICAgICAgIHVuaW5pdGlhbGl6ZWRfY29weShfX2ZpcnN0LCBfX2xhc3QsIHRoaXMtPl9NX2ZpbmlzaCk7Ci0gICAgICAgIHRoaXMtPl9NX2ZpbmlzaCA9IF9fbmV3X2ZpbmlzaDsKLSAgICAgIH0KLSAgICAgIF9TVExQX1VOV0lORCh0aGlzLT5fTV9kZXN0cm95X25vZGVzKHRoaXMtPl9NX2ZpbmlzaC5fTV9ub2RlICsgMSwgX19uZXdfZmluaXNoLl9NX25vZGUgKyAxKSkKLSAgICB9Ci0gICAgZWxzZQotICAgICAgX01faW5zZXJ0X3JhbmdlX2F1eChfX3BvcywgX19maXJzdCwgX19sYXN0LCBfX24sIF9Nb3ZhYmxlKCkpOwotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+Ci0gIHZvaWQgX01faW5zZXJ0X3JhbmdlX2F1eChpdGVyYXRvciBfX3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uLCBjb25zdCBfX3RydWVfdHlwZSYgLypfTW92YWJsZSovKSB7Ci0gICAgY29uc3QgZGlmZmVyZW5jZV90eXBlIF9fZWxlbXNiZWZvcmUgPSBfX3BvcyAtIHRoaXMtPl9NX3N0YXJ0OwotICAgIHNpemVfdHlwZSBfX2xlbmd0aCA9IHNpemUoKTsKLSAgICBpZiAoX19lbGVtc2JlZm9yZSA8PSBkaWZmZXJlbmNlX3R5cGUoX19sZW5ndGggLyAyKSkgewotICAgICAgaXRlcmF0b3IgX19uZXdfc3RhcnQgPSBfTV9yZXNlcnZlX2VsZW1lbnRzX2F0X2Zyb250KF9fbik7Ci0gICAgICBfX3BvcyA9IHRoaXMtPl9NX3N0YXJ0ICsgX19lbGVtc2JlZm9yZTsKLSAgICAgIF9TVExQX1RSWSB7Ci0gICAgICAgIGl0ZXJhdG9yIF9fZHN0ID0gX19uZXdfc3RhcnQ7Ci0gICAgICAgIGl0ZXJhdG9yIF9fc3JjID0gdGhpcy0+X01fc3RhcnQ7Ci0gICAgICAgIGZvciAoOyBfX3NyYyAhPSBfX3BvczsgKytfX2RzdCwgKytfX3NyYykgewotICAgICAgICAgIF9TVExQX1NURDo6X01vdmVfQ29uc3RydWN0KCYoKl9fZHN0KSwgKl9fc3JjKTsKLSAgICAgICAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95X01vdmVkKCYoKl9fc3JjKSk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy0+X01fc3RhcnQgPSBfX25ld19zdGFydDsKLSAgICAgICAgdW5pbml0aWFsaXplZF9jb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19kc3QpOwotICAgICAgfQotICAgICAgX1NUTFBfVU5XSU5EKHRoaXMtPl9NX2Rlc3Ryb3lfbm9kZXMoX19uZXdfc3RhcnQuX01fbm9kZSwgdGhpcy0+X01fc3RhcnQuX01fbm9kZSkpCi0gICAgfQotICAgIGVsc2UgewotICAgICAgaXRlcmF0b3IgX19uZXdfZmluaXNoID0gX01fcmVzZXJ2ZV9lbGVtZW50c19hdF9iYWNrKF9fbik7Ci0gICAgICBjb25zdCBkaWZmZXJlbmNlX3R5cGUgX19lbGVtc2FmdGVyID0gZGlmZmVyZW5jZV90eXBlKF9fbGVuZ3RoKSAtIF9fZWxlbXNiZWZvcmU7Ci0gICAgICBfX3BvcyA9IHRoaXMtPl9NX2ZpbmlzaCAtIF9fZWxlbXNhZnRlcjsKLSAgICAgIF9TVExQX1RSWSB7Ci0gICAgICAgIGl0ZXJhdG9yIF9fZHN0ID0gX19uZXdfZmluaXNoOwotICAgICAgICBpdGVyYXRvciBfX3NyYyA9IHRoaXMtPl9NX2ZpbmlzaDsKLSAgICAgICAgZm9yICgtLV9fc3JjLCAtLV9fZHN0OyBfX3NyYyA+PSBfX3BvczsgLS1fX3NyYywgLS1fX2RzdCkgewotICAgICAgICAgIF9TVExQX1NURDo6X01vdmVfQ29uc3RydWN0KCYoKl9fZHN0KSwgKl9fc3JjKTsKLSAgICAgICAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95X01vdmVkKCYoKl9fc3JjKSk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy0+X01fZmluaXNoID0gX19uZXdfZmluaXNoOwotICAgICAgICB1bmluaXRpYWxpemVkX2NvcHkoX19maXJzdCwgX19sYXN0LCBfX3Bvcyk7Ci0gICAgICB9Ci0gICAgICBfU1RMUF9VTldJTkQodGhpcy0+X01fZGVzdHJveV9ub2Rlcyh0aGlzLT5fTV9maW5pc2guX01fbm9kZSArIDEsIF9fbmV3X2ZpbmlzaC5fTV9ub2RlICsgMSkpCi0gICAgfQotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+Ci0gIHZvaWQgX01faW5zZXJ0X3JhbmdlX2F1eChpdGVyYXRvciBfX3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uLCBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qX01vdmFibGUqLykgewotICAgIGNvbnN0IGRpZmZlcmVuY2VfdHlwZSBfX2VsZW1zYmVmb3JlID0gX19wb3MgLSB0aGlzLT5fTV9zdGFydDsKLSAgICBzaXplX3R5cGUgX19sZW5ndGggPSBzaXplKCk7Ci0gICAgaWYgKF9fZWxlbXNiZWZvcmUgPD0gZGlmZmVyZW5jZV90eXBlKF9fbGVuZ3RoIC8gMikpIHsKLSAgICAgIGl0ZXJhdG9yIF9fbmV3X3N0YXJ0ID0gX01fcmVzZXJ2ZV9lbGVtZW50c19hdF9mcm9udChfX24pOwotICAgICAgaXRlcmF0b3IgX19vbGRfc3RhcnQgPSB0aGlzLT5fTV9zdGFydDsKLSAgICAgIF9fcG9zID0gdGhpcy0+X01fc3RhcnQgKyBfX2VsZW1zYmVmb3JlOwotICAgICAgX1NUTFBfVFJZIHsKLSAgICAgICAgaWYgKF9fZWxlbXNiZWZvcmUgPj0gZGlmZmVyZW5jZV90eXBlKF9fbikpIHsKLSAgICAgICAgICBpdGVyYXRvciBfX3N0YXJ0X24gPSB0aGlzLT5fTV9zdGFydCArIGRpZmZlcmVuY2VfdHlwZShfX24pOwotICAgICAgICAgIHVuaW5pdGlhbGl6ZWRfY29weSh0aGlzLT5fTV9zdGFydCwgX19zdGFydF9uLCBfX25ld19zdGFydCk7Ci0gICAgICAgICAgdGhpcy0+X01fc3RhcnQgPSBfX25ld19zdGFydDsKLSAgICAgICAgICBjb3B5KF9fc3RhcnRfbiwgX19wb3MsIF9fb2xkX3N0YXJ0KTsKLSAgICAgICAgICBjb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19wb3MgLSBkaWZmZXJlbmNlX3R5cGUoX19uKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX21pZCA9IF9fZmlyc3Q7Ci0gICAgICAgICAgYWR2YW5jZShfX21pZCwgZGlmZmVyZW5jZV90eXBlKF9fbikgLSBfX2VsZW1zYmVmb3JlKTsKLSAgICAgICAgICBfU1RMUF9QUklWIF9fdW5pbml0aWFsaXplZF9jb3B5X2NvcHkodGhpcy0+X01fc3RhcnQsIF9fcG9zLCBfX2ZpcnN0LCBfX21pZCwgX19uZXdfc3RhcnQpOwotICAgICAgICAgIHRoaXMtPl9NX3N0YXJ0ID0gX19uZXdfc3RhcnQ7Ci0gICAgICAgICAgY29weShfX21pZCwgX19sYXN0LCBfX29sZF9zdGFydCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIF9TVExQX1VOV0lORCh0aGlzLT5fTV9kZXN0cm95X25vZGVzKF9fbmV3X3N0YXJ0Ll9NX25vZGUsIHRoaXMtPl9NX3N0YXJ0Ll9NX25vZGUpKQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGl0ZXJhdG9yIF9fbmV3X2ZpbmlzaCA9IF9NX3Jlc2VydmVfZWxlbWVudHNfYXRfYmFjayhfX24pOwotICAgICAgaXRlcmF0b3IgX19vbGRfZmluaXNoID0gdGhpcy0+X01fZmluaXNoOwotICAgICAgY29uc3QgZGlmZmVyZW5jZV90eXBlIF9fZWxlbXNhZnRlciA9IGRpZmZlcmVuY2VfdHlwZShfX2xlbmd0aCkgLSBfX2VsZW1zYmVmb3JlOwotICAgICAgX19wb3MgPSB0aGlzLT5fTV9maW5pc2ggLSBfX2VsZW1zYWZ0ZXI7Ci0gICAgICBfU1RMUF9UUlkgewotICAgICAgICBpZiAoX19lbGVtc2FmdGVyID4gZGlmZmVyZW5jZV90eXBlKF9fbikpIHsKLSAgICAgICAgICBpdGVyYXRvciBfX2ZpbmlzaF9uID0gdGhpcy0+X01fZmluaXNoIC0gZGlmZmVyZW5jZV90eXBlKF9fbik7Ci0gICAgICAgICAgdW5pbml0aWFsaXplZF9jb3B5KF9fZmluaXNoX24sIHRoaXMtPl9NX2ZpbmlzaCwgdGhpcy0+X01fZmluaXNoKTsKLSAgICAgICAgICB0aGlzLT5fTV9maW5pc2ggPSBfX25ld19maW5pc2g7Ci0gICAgICAgICAgY29weV9iYWNrd2FyZChfX3BvcywgX19maW5pc2hfbiwgX19vbGRfZmluaXNoKTsKLSAgICAgICAgICBjb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19wb3MpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19taWQgPSBfX2ZpcnN0OwotICAgICAgICAgIGFkdmFuY2UoX19taWQsIF9fZWxlbXNhZnRlcik7Ci0gICAgICAgICAgX1NUTFBfUFJJViBfX3VuaW5pdGlhbGl6ZWRfY29weV9jb3B5KF9fbWlkLCBfX2xhc3QsIF9fcG9zLCB0aGlzLT5fTV9maW5pc2gsIHRoaXMtPl9NX2ZpbmlzaCk7Ci0gICAgICAgICAgdGhpcy0+X01fZmluaXNoID0gX19uZXdfZmluaXNoOwotICAgICAgICAgIGNvcHkoX19maXJzdCwgX19taWQsIF9fcG9zKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgX1NUTFBfVU5XSU5EKHRoaXMtPl9NX2Rlc3Ryb3lfbm9kZXModGhpcy0+X01fZmluaXNoLl9NX25vZGUgKyAxLCBfX25ld19maW5pc2guX01fbm9kZSArIDEpKQotICAgIH0KLSAgfQotI2VuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KLQotICBpdGVyYXRvciBfTV9yZXNlcnZlX2VsZW1lbnRzX2F0X2Zyb250KHNpemVfdHlwZSBfX24pIHsKLSAgICBzaXplX3R5cGUgX192YWNhbmNpZXMgPSB0aGlzLT5fTV9zdGFydC5fTV9jdXIgLSB0aGlzLT5fTV9zdGFydC5fTV9maXJzdDsKLSAgICBpZiAoX19uID4gX192YWNhbmNpZXMpCi0gICAgICBfTV9uZXdfZWxlbWVudHNfYXRfZnJvbnQoX19uIC0gX192YWNhbmNpZXMpOwotICAgIHJldHVybiB0aGlzLT5fTV9zdGFydCAtIGRpZmZlcmVuY2VfdHlwZShfX24pOwotICB9Ci0KLSAgaXRlcmF0b3IgX01fcmVzZXJ2ZV9lbGVtZW50c19hdF9iYWNrKHNpemVfdHlwZSBfX24pIHsKLSAgICBzaXplX3R5cGUgX192YWNhbmNpZXMgPSAodGhpcy0+X01fZmluaXNoLl9NX2xhc3QgLSB0aGlzLT5fTV9maW5pc2guX01fY3VyKSAtIDE7Ci0gICAgaWYgKF9fbiA+IF9fdmFjYW5jaWVzKQotICAgICAgX01fbmV3X2VsZW1lbnRzX2F0X2JhY2soX19uIC0gX192YWNhbmNpZXMpOwotICAgIHJldHVybiB0aGlzLT5fTV9maW5pc2ggKyBkaWZmZXJlbmNlX3R5cGUoX19uKTsKLSAgfQotCi0gIHZvaWQgX01fbmV3X2VsZW1lbnRzX2F0X2Zyb250KHNpemVfdHlwZSBfX25ld19lbGVtZW50cyk7Ci0gIHZvaWQgX01fbmV3X2VsZW1lbnRzX2F0X2JhY2soc2l6ZV90eXBlIF9fbmV3X2VsZW1lbnRzKTsKLQotcHJvdGVjdGVkOiAgICAgICAgICAgICAgICAgICAgICAvLyBBbGxvY2F0aW9uIG9mIF9NX21hcCBhbmQgbm9kZXMKLQotICAvLyBNYWtlcyBzdXJlIHRoZSBfTV9tYXAgaGFzIHNwYWNlIGZvciBuZXcgbm9kZXMuICBEb2VzIG5vdCBhY3R1YWxseQotICAvLyAgYWRkIHRoZSBub2Rlcy4gIENhbiBpbnZhbGlkYXRlIF9NX21hcCBwb2ludGVycy4gIChBbmQgY29uc2VxdWVudGx5LAotICAvLyAgZGVxdWUgaXRlcmF0b3JzLikKLQotICB2b2lkIF9NX3Jlc2VydmVfbWFwX2F0X2JhY2sgKHNpemVfdHlwZSBfX25vZGVzX3RvX2FkZCA9IDEpIHsKLSAgICBpZiAoX19ub2Rlc190b19hZGQgKyAxID4gdGhpcy0+X01fbWFwX3NpemUuX01fZGF0YSAtICh0aGlzLT5fTV9maW5pc2guX01fbm9kZSAtIHRoaXMtPl9NX21hcC5fTV9kYXRhKSkKLSAgICAgIF9NX3JlYWxsb2NhdGVfbWFwKF9fbm9kZXNfdG9fYWRkLCBmYWxzZSk7Ci0gIH0KLQotICB2b2lkIF9NX3Jlc2VydmVfbWFwX2F0X2Zyb250IChzaXplX3R5cGUgX19ub2Rlc190b19hZGQgPSAxKSB7Ci0gICAgaWYgKF9fbm9kZXNfdG9fYWRkID4gc2l6ZV90eXBlKHRoaXMtPl9NX3N0YXJ0Ll9NX25vZGUgLSB0aGlzLT5fTV9tYXAuX01fZGF0YSkpCi0gICAgICBfTV9yZWFsbG9jYXRlX21hcChfX25vZGVzX3RvX2FkZCwgdHJ1ZSk7Ci0gIH0KLQotICB2b2lkIF9NX3JlYWxsb2NhdGVfbWFwKHNpemVfdHlwZSBfX25vZGVzX3RvX2FkZCwgYm9vbCBfX2FkZF9hdF9mcm9udCk7Ci19OwotCi0jaWYgZGVmaW5lZCAoZGVxdWUpCi0jICB1bmRlZiBkZXF1ZQotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi0jZW5kaWYKLQotX1NUTFBfRU5EX05BTUVTUEFDRQotCi0jaWYgIWRlZmluZWQgKF9TVExQX0xJTktfVElNRV9JTlNUQU5USUFUSU9OKQotIyAgaW5jbHVkZSA8c3RsL19kZXF1ZS5jPgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUFRSX1NQRUNJQUxJWkFUSU9OUykKLSMgIGluY2x1ZGUgPHN0bC9wb2ludGVycy9fZGVxdWUuaD4KLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpCi0jICBpbmNsdWRlIDxzdGwvZGVidWcvX2RlcXVlLmg+Ci0jZW5kaWYKLQotX1NUTFBfQkVHSU5fTkFNRVNQQUNFCi0KLSNkZWZpbmUgX1NUTFBfVEVNUExBVEVfQ09OVEFJTkVSIGRlcXVlPF9UcCwgX0FsbG9jPgotI2RlZmluZSBfU1RMUF9URU1QTEFURV9IRUFERVIgICAgdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgotI2luY2x1ZGUgPHN0bC9fcmVsb3BzX2NvbnQuaD4KLSN1bmRlZiBfU1RMUF9URU1QTEFURV9DT05UQUlORVIKLSN1bmRlZiBfU1RMUF9URU1QTEFURV9IRUFERVIKLQotI2lmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Ci1zdHJ1Y3QgX19tb3ZlX3RyYWl0czxkZXF1ZTxfVHAsIF9BbGxvYz4gPiB7Ci0gIHR5cGVkZWYgX19zdGxwX21vdmFibGUgaW1wbGVtZW50ZWQ7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX19tb3ZlX3RyYWl0czxfQWxsb2M+Ojpjb21wbGV0ZSBjb21wbGV0ZTsKLX07Ci0jZW5kaWYgLyogX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTiAqLwotCi1fU1RMUF9FTkRfTkFNRVNQQUNFCi0KLSNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9ERVFVRV9IICovCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6Ci0KZGlmZiAtLWdpdCBhL3N0bC9fZXhjZXB0aW9uLmggYi9zdGwvX2V4Y2VwdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWZkYzRjLi4wMDAwMDAwCi0tLSBhL3N0bC9fZXhjZXB0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3Ci0gKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICovCi0KLS8vIFRoZSBoZWFkZXIgPGV4Y2VwdGlvbj4gY29udGFpbnMgbG93LWxldmVsIGZ1bmN0aW9ucyB0aGF0IGludGVyYWN0Ci0vLyB3aXRoIGEgY29tcGlsZXIncyBleGNlcHRpb24taGFuZGxpbmcgbWVjaGFuaXNtLiAgSXQgaXMgYXNzdW1lZCB0bwotLy8gYmUgc3VwcGxpZWQgd2l0aCB0aGUgY29tcGlsZXIsIHJhdGhlciB0aGFuIHdpdGggdGhlIGxpYnJhcnksIGJlY2F1c2UKLS8vIGl0IGlzIGluaGVyZW50bHkgdGllZCB2ZXJ5IGNsb3NlbHkgdG8gdGhlIGNvbXBpbGVyIGl0c2VsZi4KLQotLy8gT24gcGxhdGZvcm1zIHdoZXJlIDxleGNlcHRpb24+IGRvZXMgbm90IGV4aXN0LCB0aGlzIGhlYWRlciBkZWZpbmVzCi0vLyBhbiBleGNlcHRpb24gYmFzZSBjbGFzcy4gIFRoaXMgaXMgKm5vdCogYSBzdWJzdGl0dXRlIGZvciBldmVyeXRoaW5nCi0vLyBpbiA8ZXhjZXB0aW9uPiwgYnV0IGl0IHN1ZmZpY2VzIHRvIHN1cHBvcnQgYSBiYXJlIG1pbmltdW0gb2YgU1RMCi0vLyBmdW5jdGlvbmFsaXR5LgotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0VYQ0VQVElPTgotI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9FWENFUFRJT04KLQotI2lmICFkZWZpbmVkIChfU1RMUF9OT19FWENFUFRJT05fSEVBREVSKQotCi0jICBpZiBkZWZpbmVkICggX1VOQ0FVR0hUX0VYQ0VQVElPTiApCi0jICAgIHVuZGVmIF9TVExQX05PX1VOQ0FVR0hUX0VYQ0VQVF9TVVBQT1JUCi0jICBlbmRpZgotCi0jICBpZiBkZWZpbmVkIChfU1RMUF9CUk9LRU5fRVhDRVBUSU9OX0NMQVNTKQotIyAgICBkZWZpbmUgZXhjZXB0aW9uICAgICBfU1RMUF9OVUxMSUZJRURfQlJPS0VOX0VYQ0VQVElPTl9DTEFTUwotIyAgICBkZWZpbmUgYmFkX2V4Y2VwdGlvbiBfU1RMUF9OVUxMSUZJRURfQlJPS0VOX0JBRF9FWENFUFRJT05fQ0xBU1MKLSMgICAgaWYgZGVmaW5lZCAoX1NUTFBfTk9fTkVXX05FV19IRUFERVIpCi0jICAgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ1BQX1JVTlRJTUVfSEVBREVSKEV4Y2VwdGlvbi5oKQotIyAgICBlbHNlCi0jICAgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ1BQX1JVTlRJTUVfSEVBREVSKEV4Y2VwdGlvbikKLSMgICAgZW5kaWYKLSMgICAgdW5kZWYgZXhjZXB0aW9uCi0jICAgIHVuZGVmIGJhZF9leGNlcHRpb24KLSMgIGVsc2UKLSMgICAgaWYgZGVmaW5lZCAoX1NUTFBfTk9fTkVXX05FV19IRUFERVIpCi0jICAgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ1BQX1JVTlRJTUVfSEVBREVSKGV4Y2VwdGlvbi5oKQotIyAgICBlbHNlCi0jICAgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ1BQX1JVTlRJTUVfSEVBREVSKGV4Y2VwdGlvbikKLSMgICAgZW5kaWYKLSMgIGVuZGlmCi0KLSMgIGlmIGRlZmluZWQgKF9TVExQX0hBU19TUEVDSUZJQ19QUk9MT0dfRVBJTE9HKSAmJiAoZGVmaW5lZCAoX1NUTFBfTVNWQykgfHwgZGVmaW5lZCAoX19JQ0wpKQotLy8gZHdhIDAyLzA0LzAwIC0gaGVyZSBJJ20gYXNzdW1pbmcgdGhhdCBfX0lDTCB1c2VzIHRoZSBzYW1lIGxpYnJhcnkgaGVhZGVycyBhcyB2YzYuCi0vLyB0aGUgaGVhZGVyIDx5dmFscy5oPiB3aGljaCBzaGlwcyB3aXRoIHZjNiBhbmQgaXMgaW5jbHVkZWQgYnkgaXRzIG5hdGl2ZSA8ZXhjZXB0aW9uPgotLy8gYWN0dWFsbHkgdHVybnMgb24gd2FybmluZ3MsIHNvIHdlIGhhdmUgdG8gdHVybiB0aGVtIGJhY2sgb2ZmLgotIyAgICBpbmNsdWRlIDxzdGwvY29uZmlnL193YXJuaW5nc19vZmYuaD4KLSMgIGVuZGlmCi0KLSMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9PV05fTkFNRVNQQUNFKQotCi1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLSMgICAgaWYgIWRlZmluZWQgKF9TVExQX0JST0tFTl9FWENFUFRJT05fQ0xBU1MpCi0jICAgICAgaWYgIWRlZmluZWQgKF9TVExQX1VTSU5HX1BMQVRGT1JNX1NES19DT01QSUxFUikgfHwgIWRlZmluZWQgKF9XSU42NCkKLXVzaW5nIF9TVExQX1ZFTkRPUl9FWENFUFRfU1REOjpleGNlcHRpb247Ci0jICAgICAgZWxzZQotdXNpbmcgOjpleGNlcHRpb247Ci0jICAgICAgZW5kaWYKLXVzaW5nIF9TVExQX1ZFTkRPUl9FWENFUFRfU1REOjpiYWRfZXhjZXB0aW9uOwotIyAgICBlbmRpZgotCi0jICAgIGlmICFkZWZpbmVkIChfU1RMUF9OT19VU0lOR19GT1JfR0xPQkFMX0ZVTkNUSU9OUykKLS8vIGZicCA6IG1hbnkgcGxhdGZvcm1zIHByZXNlbnQgc3RyYW5nZSBtaXggb2YKLS8vIHRob3NlIGluIHZhcmlvdXMgbmFtZXNwYWNlcwotIyAgICAgIGlmICFkZWZpbmVkIChfU1RMUF9WRU5ET1JfVU5FWFBFQ1RFRF9TVEQpCi0jICAgICAgICBkZWZpbmUgX1NUTFBfVkVORE9SX1VORVhQRUNURURfU1REIF9TVExQX1ZFTkRPUl9FWENFUFRfU1RECi0jICAgICAgZWxzZQotLyogVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyBhcmUgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgYXMgX1NUTFBfVkVORE9SX1RFUk1JTkFURV9TVEQKLSAqIGFuZCBfU1RMUF9WRU5ET1JfVU5DQVVHSFRfRVhDRVBUSU9OX1NURCBoYXMgYmVlbiBpbnRyb2R1Y2UgYWZ0ZXIgX1NUTFBfVkVORE9SX1VORVhQRUNURURfU1RECi0gKiBhbmQgX1NUTFBfVkVORE9SX1VORVhQRUNURURfU1REIHdhcyB0aGUgbWFjcm8gdXNlZCBpbiB0aGVpciBwbGFjZSBiZWZvcmUgdGhhdCBpbnRyb2R1Y3Rpb24uCi0gKi8KLSMgICAgICAgIGlmICFkZWZpbmVkIChfU1RMUF9WRU5ET1JfVEVSTUlOQVRFX1NURCkKLSMgICAgICAgICAgZGVmaW5lIF9TVExQX1ZFTkRPUl9URVJNSU5BVEVfU1REIF9TVExQX1ZFTkRPUl9VTkVYUEVDVEVEX1NURAotIyAgICAgICAgZW5kaWYKLSMgICAgICAgIGlmICFkZWZpbmVkIChfU1RMUF9WRU5ET1JfVU5DQVVHSFRfRVhDRVBUSU9OX1NURCkKLSMgICAgICAgICAgZGVmaW5lIF9TVExQX1ZFTkRPUl9VTkNBVUdIVF9FWENFUFRJT05fU1REIF9TVExQX1ZFTkRPUl9VTkVYUEVDVEVEX1NURAotIyAgICAgICAgZW5kaWYKLSMgICAgICBlbmRpZgotIyAgICAgIGlmICFkZWZpbmVkIChfU1RMUF9WRU5ET1JfVEVSTUlOQVRFX1NURCkKLSMgICAgICAgIGRlZmluZSBfU1RMUF9WRU5ET1JfVEVSTUlOQVRFX1NURCBfU1RMUF9WRU5ET1JfRVhDRVBUX1NURAotIyAgICAgIGVuZGlmCi0jICAgICAgaWYgIWRlZmluZWQgKF9TVExQX1ZFTkRPUl9VTkNBVUdIVF9FWENFUFRJT05fU1REKQotIyAgICAgICAgZGVmaW5lIF9TVExQX1ZFTkRPUl9VTkNBVUdIVF9FWENFUFRJT05fU1REIF9TVExQX1ZFTkRPUl9FWENFUFRfU1RECi0jICAgICAgZW5kaWYKLSMgICAgICBpZiAhZGVmaW5lZCAoX1NUTFBfVkVORE9SX1RFUk1JTkFURV9TVEQpCi0jICAgICAgICBkZWZpbmUgX1NUTFBfVkVORE9SX1RFUk1JTkFURV9TVEQgX1NUTFBfVkVORE9SX0VYQ0VQVF9TVEQKLSMgICAgICBlbmRpZgotIyAgICAgIGlmICFkZWZpbmVkIChfU1RMUF9WRU5ET1JfVU5DQVVHSFRfRVhDRVBUSU9OX1NURCkKLSMgICAgICAgIGRlZmluZSBfU1RMUF9WRU5ET1JfVU5DQVVHSFRfRVhDRVBUSU9OX1NURCBfU1RMUF9WRU5ET1JfRVhDRVBUX1NURAotIyAgICAgIGVuZGlmCi0vLyB3ZWlyZCBlcnJvcnMKLSMgICAgICAgIGlmICFkZWZpbmVkIChfU1RMUF9OT19VTkVYUEVDVEVEX0VYQ0VQVF9TVVBQT1JUKQotIyAgICAgICAgICBpZiBkZWZpbmVkIChfX0lDTCkgJiYgKF9fSUNMID49IDkwMCkgJiYgKF9TVExQX01TVkNfTElCIDwgMTMwMCkKLS8vU2VlIGNvbmZpZy9faW50ZWwuaCBmb3IgcmVhc29uIGFib3V0IHRoaXMgd29ya2Fyb3VuZAotdXNpbmcgc3RkOjp1bmV4cGVjdGVkOwotIyAgICAgICAgICBlbHNlCi11c2luZyBfU1RMUF9WRU5ET1JfVU5FWFBFQ1RFRF9TVEQ6OnVuZXhwZWN0ZWQ7Ci0jICAgICAgICAgIGVuZGlmCi11c2luZyBfU1RMUF9WRU5ET1JfVU5FWFBFQ1RFRF9TVEQ6OnVuZXhwZWN0ZWRfaGFuZGxlcjsKLXVzaW5nIF9TVExQX1ZFTkRPUl9VTkVYUEVDVEVEX1NURDo6c2V0X3VuZXhwZWN0ZWQ7Ci0jICAgICAgICBlbmRpZgotdXNpbmcgX1NUTFBfVkVORE9SX1RFUk1JTkFURV9TVEQ6OnRlcm1pbmF0ZTsKLXVzaW5nIF9TVExQX1ZFTkRPUl9URVJNSU5BVEVfU1REOjp0ZXJtaW5hdGVfaGFuZGxlcjsKLXVzaW5nIF9TVExQX1ZFTkRPUl9URVJNSU5BVEVfU1REOjpzZXRfdGVybWluYXRlOwotCi0jICAgICAgaWYgIWRlZmluZWQgKF9TVExQX05PX1VOQ0FVR0hUX0VYQ0VQVF9TVVBQT1JUKQotdXNpbmcgX1NUTFBfVkVORE9SX1VOQ0FVR0hUX0VYQ0VQVElPTl9TVEQ6OnVuY2F1Z2h0X2V4Y2VwdGlvbjsKLSMgICAgICBlbmRpZgotIyAgICBlbmRpZiAvKiAhX1NUTFBfTk9fVVNJTkdfRk9SX0dMT0JBTF9GVU5DVElPTlMgKi8KLV9TVExQX0VORF9OQU1FU1BBQ0UKLSMgIGVuZGlmIC8qIF9TVExQX09XTl9OQU1FU1BBQ0UgKi8KLSNlbHNlIC8qIF9TVExQX05PX0VYQ0VQVElPTl9IRUFERVIgKi8KLQotLyogZmJwIDogYWJzZW5jZSBvZiA8ZXhjZXB0aW9uPiB1c3VhbGx5IG1lYW5zIHRoYXQgdGhvc2UKLSAqIGZ1bmN0aW9ucyBhcmUgbm90IGdvaW5nIHRvIGJlIGNhbGxlZCBieSBjb21waWxlci4KLSAqIFN0aWxsLCBkZWZpbmUgdGhlbSBmb3IgdGhlIHVzZXIuCi0gKiBkdW1zOiBQb2xpY3kgbW9kaWZpY2F0aW9uLCBpZiB0aGUgZnVuY3Rpb24gZG8gbm90IGJlaGF2ZSBsaWtlIHRoZSBTdGFuZGFyZAotICogICAgICAgZGVmaW5lZCBpdCB3ZSBkbyBub3QgZ3JhbnQgaXQgaW4gdGhlIFNUTHBvcnQgbmFtZXNwYWNlLiBXZSB3aWxsIGhhdmUKLSAqICAgICAgIGNvbXBpbGUgdGltZSBlcnJvciByYXRoZXIgdGhhbiBydW50aW1lIGVycm9yLgotICovCi0jaWYgMAotLyoKLXR5cGVkZWYgdm9pZCAoKnVuZXhwZWN0ZWRfaGFuZGxlcikoKTsKLXVuZXhwZWN0ZWRfaGFuZGxlciBzZXRfdW5leHBlY3RlZCh1bmV4cGVjdGVkX2hhbmRsZXIgZikgX1NUTFBfTk9USFJPV19JTkhFUkVOVExZOwotdm9pZCB1bmV4cGVjdGVkKCk7Ci0KLXR5cGVkZWYgdm9pZCAoKnRlcm1pbmF0ZV9oYW5kbGVyKSgpOwotdGVybWluYXRlX2hhbmRsZXIgc2V0X3Rlcm1pbmF0ZSh0ZXJtaW5hdGVfaGFuZGxlciBmKSBfU1RMUF9OT1RIUk9XX0lOSEVSRU5UTFk7Ci12b2lkIHRlcm1pbmF0ZSgpOwotCi1ib29sIHVuY2F1Z2h0X2V4Y2VwdGlvbigpOyAvLyBub3QgaW1wbGVtZW50ZWQgdW5kZXIgbXB3IGFzIG9mIEphbi8xOTk5Ci0qLwotI2VuZGlmCi0KLSNlbmRpZiAvKiBfU1RMUF9OT19FWENFUFRJT05fSEVBREVSICovCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9OT19FWENFUFRJT05fSEVBREVSKSB8fCBkZWZpbmVkIChfU1RMUF9CUk9LRU5fRVhDRVBUSU9OX0NMQVNTKQotX1NUTFBfQkVHSU5fTkFNRVNQQUNFCi0KLS8vIHNlY3Rpb24gMTguNi4xCi1jbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBleGNlcHRpb24gewotcHVibGljOgotIyAgaWYgIWRlZmluZWQoX1NUTFBfVVNFX05PX0lPU1RSRUFNUykgJiYgIWRlZmluZWQoX1NUTFBfSU5MSU5FX0VYQ0VQVElPTl9DTEFTUykKLSAgZXhjZXB0aW9uKCkgX1NUTFBfTk9USFJPVzsKLSAgdmlydHVhbCB+ZXhjZXB0aW9uKCkgX1NUTFBfTk9USFJPVzsKLSAgdmlydHVhbCBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3QgX1NUTFBfTk9USFJPVzsKLSMgIGVsc2UKLSAgZXhjZXB0aW9uKCkgX1NUTFBfTk9USFJPVyB7fQotICB2aXJ0dWFsIH5leGNlcHRpb24oKSBfU1RMUF9OT1RIUk9XIHt9Ci0gIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IF9TVExQX05PVEhST1cge3JldHVybiAiY2xhc3MgZXhjZXB0aW9uIjt9Ci0jICBlbmRpZgotfTsKLQotLy8gc2VjdGlvbiAxOC42LjIuMQotY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgYmFkX2V4Y2VwdGlvbiA6IHB1YmxpYyBleGNlcHRpb24gewotcHVibGljOgotIyAgaWYgIWRlZmluZWQoX1NUTFBfVVNFX05PX0lPU1RSRUFNUykgJiYgIWRlZmluZWQoX1NUTFBfSU5MSU5FX0VYQ0VQVElPTl9DTEFTUykKLSAgYmFkX2V4Y2VwdGlvbigpIF9TVExQX05PVEhST1c7Ci0gIH5iYWRfZXhjZXB0aW9uKCkgX1NUTFBfTk9USFJPVzsKLSAgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IF9TVExQX05PVEhST1c7Ci0jICBlbHNlCi0gIGJhZF9leGNlcHRpb24oKSBfU1RMUF9OT1RIUk9XIHt9Ci0gIH5iYWRfZXhjZXB0aW9uKCkgX1NUTFBfTk9USFJPVyB7fQotICBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3QgX1NUTFBfTk9USFJPVyB7cmV0dXJuICJjbGFzcyBiYWRfZXhjZXB0aW9uIjt9Ci0jICBlbmRpZgotfTsKLQotLy8gZm9yd2FyZCBkZWNsYXJhdGlvbgotY2xhc3MgX19OYW1lZF9leGNlcHRpb247Ci1fU1RMUF9FTkRfTkFNRVNQQUNFCi0jZW5kaWYKLQotI2VuZGlmIC8qIF9TVExQX0lOVEVSTkFMX0VYQ0VQVElPTiAqLwpkaWZmIC0tZ2l0IGEvc3RsL19mc3RyZWFtLmMgYi9zdGwvX2ZzdHJlYW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQxNjg1ZC4uMDAwMDAwMAotLS0gYS9zdGwvX2ZzdHJlYW0uYworKysgL2Rldi9udWxsCkBAIC0xLDczNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKLSAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogQm9yaXMgRm9taXRjaGV2Ci0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICovCi0jaWZuZGVmIF9TVExQX0ZTVFJFQU1fQwotI2RlZmluZSBfU1RMUF9GU1RSRUFNX0MKLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9GU1RSRUFNX0gKLSMgIGluY2x1ZGUgPHN0bC9fZnN0cmVhbS5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfTElNSVRTCi0jICBpbmNsdWRlIDxzdGwvX2xpbWl0cy5oPgotI2VuZGlmCi0KLV9TVExQX0JFR0lOX05BTUVTUEFDRQotCi0jIGlmIGRlZmluZWQgKCBfU1RMUF9ORVNURURfVFlQRV9QQVJBTV9CVUcgKQotLy8gbm8gd2NoYXJfdCBpcyBzdXBwb3J0ZWQgZm9yIHRoaXMgbW9kZQotIyBkZWZpbmUgX19CRl9pbnRfdHlwZV9fIGludAotIyBkZWZpbmUgX19CRl9wb3NfdHlwZV9fIHN0cmVhbXBvcwotIyBkZWZpbmUgX19CRl9vZmZfdHlwZV9fIHN0cmVhbW9mZgotIyBlbHNlCi0jIGRlZmluZSBfX0JGX2ludF90eXBlX18gX1NUTFBfVFlQRU5BTUVfT05fUkVUVVJOX1RZUEUgYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjppbnRfdHlwZQotIyBkZWZpbmUgX19CRl9wb3NfdHlwZV9fIF9TVExQX1RZUEVOQU1FX09OX1JFVFVSTl9UWVBFIGJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6cG9zX3R5cGUKLSMgZGVmaW5lIF9fQkZfb2ZmX3R5cGVfXyBfU1RMUF9UWVBFTkFNRV9PTl9SRVRVUk5fVFlQRSBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46Om9mZl90eXBlCi0jIGVuZGlmCi0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBQdWJsaWMgYmFzaWNfZmlsZWJ1Zjw+IG1lbWJlciBmdW5jdGlvbnMKLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KLWJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6YmFzaWNfZmlsZWJ1ZigpCi0gICAgIDogIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KCksIF9NX2Jhc2UoKSwKLSAgICBfTV9jb25zdGFudF93aWR0aChmYWxzZSksIF9NX2Fsd2F5c19ub2NvbnYoZmFsc2UpLAotICAgIF9NX2ludF9idWZfZHluYW1pYyhmYWxzZSksCi0gICAgX01faW5faW5wdXRfbW9kZShmYWxzZSksIF9NX2luX291dHB1dF9tb2RlKGZhbHNlKSwKLSAgICBfTV9pbl9lcnJvcl9tb2RlKGZhbHNlKSwgX01faW5fcHV0YmFja19tb2RlKGZhbHNlKSwKLSAgICBfTV9pbnRfYnVmKDApLCBfTV9pbnRfYnVmX0VPUygwKSwKLSAgICBfTV9leHRfYnVmKDApLCBfTV9leHRfYnVmX0VPUygwKSwKLSAgICBfTV9leHRfYnVmX2NvbnZlcnRlZCgwKSwgX01fZXh0X2J1Zl9lbmQoMCksCi0gICAgX01fc3RhdGUoX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRChfU3RhdGVfdHlwZSkpLAotICAgIF9NX2VuZF9zdGF0ZShfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKF9TdGF0ZV90eXBlKSksCi0gICAgX01fbW1hcF9iYXNlKDApLCBfTV9tbWFwX2xlbigwKSwKLSAgICBfTV9zYXZlZF9lYmFjaygwKSwgX01fc2F2ZWRfZ3B0cigwKSwgX01fc2F2ZWRfZWdwdHIoMCksCi0gICAgX01fY29kZWN2dCgwKSwKLSAgICBfTV93aWR0aCgxKSwgX01fbWF4X3dpZHRoKDEpCi17Ci0gIHRoaXMtPl9NX3NldHVwX2NvZGVjdnQobG9jYWxlKCksIGZhbHNlKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KLWJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6fmJhc2ljX2ZpbGVidWYoKSB7Ci0gIHRoaXMtPmNsb3NlKCk7Ci0gIF9NX2RlYWxsb2NhdGVfYnVmZmVycygpOwotfQotCi0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Ci1fU1RMUF9UWVBFTkFNRV9PTl9SRVRVUk5fVFlQRSBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46OmludF90eXBlCi1iYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46OnVuZGVyZmxvdygpIHsKLSAgcmV0dXJuIF9VbmRlcmZsb3c8X0NoYXJULCBfVHJhaXRzPjo6X01fZG9pdCh0aGlzKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KLWJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPioKLWJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6Y2xvc2UoKSB7Ci0gIGJvb2wgX19vayA9IHRoaXMtPmlzX29wZW4oKTsKLQotICBpZiAoX01faW5fb3V0cHV0X21vZGUpIHsKLSAgICBfX29rID0gX19vayAmJiAhX1RyYWl0czo6ZXFfaW50X3R5cGUodGhpcy0+b3ZlcmZsb3codHJhaXRzX3R5cGU6OmVvZigpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3R5cGU6OmVvZigpKTsKLSAgICBfX29rID09IF9fb2sgJiYgdGhpcy0+X01fdW5zaGlmdCgpOwotICB9Ci0gIGVsc2UgaWYgKF9NX2luX2lucHV0X21vZGUpCi0gICAgICB0aGlzLT5fTV9leGl0X2lucHV0X21vZGUoKTsKLQotICAvLyBOb3RlIG9yZGVyIG9mIGFyZ3VtZW50cy4gIFdlIGNsb3NlIHRoZSBmaWxlIGV2ZW4gaWYgX19vayBpcyBmYWxzZS4KLSAgX19vayA9IF9NX2Jhc2UuX01fY2xvc2UoKSAmJiBfX29rOwotCi0gIC8vIFJlc3RvcmUgdGhlIGluaXRpYWwgc3RhdGUsIGV4Y2VwdCB0aGF0IHdlIGRvbid0IGRlYWxsb2NhdGUgdGhlIGJ1ZmZlcgotICAvLyBvciBtZXNzIHdpdGggdGhlIGNhY2hlZCBjb2RlY3Z0IGluZm9ybWF0aW9uLgotICBfTV9zdGF0ZSA9IF9NX2VuZF9zdGF0ZSA9IF9TdGF0ZV90eXBlKCk7Ci0gIF9NX2V4dF9idWZfY29udmVydGVkID0gX01fZXh0X2J1Zl9lbmQgPSAwOwotCi0gIF9NX21tYXBfYmFzZSA9IDA7Ci0gIF9NX21tYXBfbGVuID0gMDsKLQotICB0aGlzLT5zZXRnKDAsIDAsIDApOwotICB0aGlzLT5zZXRwKDAsIDApOwotCi0gIF9NX3NhdmVkX2ViYWNrID0gX01fc2F2ZWRfZ3B0ciA9IF9NX3NhdmVkX2VncHRyID0gMDsKLQotICBfTV9pbl9pbnB1dF9tb2RlID0gX01faW5fb3V0cHV0X21vZGUgPSBfTV9pbl9lcnJvcl9tb2RlID0gX01faW5fcHV0YmFja19tb2RlCi0gICAgPSBmYWxzZTsKLQotICByZXR1cm4gX19vayA/IHRoaXMgOiAwOwotfQotCi0vLyBUaGlzIG1lbWJlciBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbmV2ZXIgd2UgZXhpdCBpbnB1dCBtb2RlLgotLy8gSXQgdW5tYXBzIHRoZSBtZW1vcnktbWFwcGVkIGZpbGUsIGlmIGFueSwgYW5kIHNldHMKLS8vIF9NX2luX2lucHV0X21vZGUgdG8gZmFsc2UuCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotdm9pZCBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46Ol9NX2V4aXRfaW5wdXRfbW9kZSgpIHsKLSAgIGlmIChfTV9tbWFwX2Jhc2UgIT0gMCkKLSAgICAgX01fYmFzZS5fTV91bm1hcChfTV9tbWFwX2Jhc2UsIF9NX21tYXBfbGVuKTsKLSAgIF9NX2luX2lucHV0X21vZGUgPSBmYWxzZTsKLSAgIF9NX21tYXBfYmFzZSA9IDA7Ci19Ci0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBiYXNpY19maWxlYnVmPD4gb3ZlcnJpZGRlbiBwcm90ZWN0ZWQgdmlydHVhbCBtZW1iZXIgZnVuY3Rpb25zCi0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Ci1zdHJlYW1zaXplIGJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6c2hvd21hbnljKCkgewotICAvLyBJcyB0aGVyZSBhbnkgcG9zc2liaWxpdHkgdGhhdCByZWFkcyBjYW4gc3VjY2VlZD8KLSAgaWYgKCF0aGlzLT5pc19vcGVuKCkgfHwgX01faW5fb3V0cHV0X21vZGUgfHwgX01faW5fZXJyb3JfbW9kZSkKLSAgICByZXR1cm4gLTE7Ci0gIGVsc2UgaWYgKF9NX2luX3B1dGJhY2tfbW9kZSkKLSAgICByZXR1cm4gdGhpcy0+ZWdwdHIoKSAtIHRoaXMtPmdwdHIoKTsKLSAgZWxzZSBpZiAoX01fY29uc3RhbnRfd2lkdGgpIHsKLSAgICBzdHJlYW1vZmYgX19wb3MgID0gX01fYmFzZS5fTV9zZWVrKDAsIGlvc19iYXNlOjpjdXIpOwotICAgIHN0cmVhbW9mZiBfX3NpemUgPSBfTV9iYXNlLl9NX2ZpbGVfc2l6ZSgpOwotICAgIHJldHVybiBfX3BvcyA+PSAwICYmIF9fc2l6ZSA+IF9fcG9zID8gX19zaXplIC0gX19wb3MgOiAwOwotICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLX0KLQotCi0vLyBNYWtlIGEgcHV0YmFjayBwb3NpdGlvbiBhdmFpbGFibGUsIGlmIG5lY2Vzc2FyeSwgYnkgc3dpdGNoaW5nIHRvIGEKLS8vIHNwZWNpYWwgaW50ZXJuYWwgYnVmZmVyIHVzZWQgb25seSBmb3IgcHV0YmFjay4gIFRoZSBidWZmZXIgaXMKLS8vIFtfTV9wYmFja19idWYsIF9NX3BiYWNrX2J1ZiArIF9TX3BiYWNrX2J1Zl9zaXplKSwgYnV0IHRoZSBiYXNlCi0vLyBjbGFzcyBvbmx5IHNlZXMgYSBwaWVjZSBvZiBpdCBhdCBhIHRpbWUuICAoV2Ugd2FudCB0byBtYWtlIHN1cmUKLS8vIHRoYXQgd2UgZG9uJ3QgdHJ5IHRvIHJlYWQgYSBjaGFyYWN0ZXIgdGhhdCBoYXNuJ3QgYmVlbiBpbml0aWFsaXplZC4pCi0vLyBUaGUgZW5kIG9mIHRoZSBwdXRiYWNrIGJ1ZmZlciBpcyBhbHdheXMgX01fcGJhY2tfYnVmICsgX1NfcGJhY2tfYnVmX3NpemUsCi0vLyBidXQgdGhlIGJlZ2lubmluZyBpcyB1c3VhbGx5IG5vdCBfTV9wYmFja19idWYuCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotX19CRl9pbnRfdHlwZV9fCi1iYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46OnBiYWNrZmFpbChpbnRfdHlwZSBfX2MpIHsKLSAgY29uc3QgaW50X3R5cGUgX19lb2YgPSB0cmFpdHNfdHlwZTo6ZW9mKCk7Ci0KLSAgLy8gSWYgd2UgYXJlbid0IGFscmVhZHkgaW4gaW5wdXQgbW9kZSwgcHVzaGJhY2sgaXMgaW1wb3NzaWJsZS4KLSAgaWYgKCFfTV9pbl9pbnB1dF9tb2RlKQotICAgIHJldHVybiBfX2VvZjsKLQotICAvLyBXZSBjYW4gdXNlIHRoZSBvcmRpbmFyeSBnZXQgYnVmZmVyIGlmIHRoZXJlJ3MgZW5vdWdoIHNwYWNlLCBhbmQKLSAgLy8gaWYgaXQncyBhIGJ1ZmZlciB0aGF0IHdlJ3JlIGFsbG93ZWQgdG8gd3JpdGUgdG8uCi0gIGlmICh0aGlzLT5ncHRyKCkgIT0gdGhpcy0+ZWJhY2soKSAmJgotICAgICAgKHRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX2MsIF9fZW9mKSB8fAotICAgICAgIHRyYWl0c190eXBlOjplcSh0cmFpdHNfdHlwZTo6dG9fY2hhcl90eXBlKF9fYyksIHRoaXMtPmdwdHIoKVstMV0pIHx8Ci0gICAgICAgIV9NX21tYXBfYmFzZSkpIHsKLSAgICB0aGlzLT5nYnVtcCgtMSk7Ci0gICAgaWYgKHRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX2MsIF9fZW9mKSB8fAotICAgICAgICB0cmFpdHNfdHlwZTo6ZXEodHJhaXRzX3R5cGU6OnRvX2NoYXJfdHlwZShfX2MpLCAqdGhpcy0+Z3B0cigpKSkKLSAgICAgIHJldHVybiB0cmFpdHNfdHlwZTo6dG9faW50X3R5cGUoKnRoaXMtPmdwdHIoKSk7Ci0gIH0KLSAgZWxzZSBpZiAoIXRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX2MsIF9fZW9mKSkgewotICAgIC8vIEFyZSB3ZSBpbiB0aGUgcHV0YmFjayBidWZmZXIgYWxyZWFkeT8KLSAgICBfQ2hhclQqIF9fcGJhY2tfZW5kID0gX01fcGJhY2tfYnVmICsgX19TVEFUSUNfQ0FTVChpbnQsX1NfcGJhY2tfYnVmX3NpemUpOwotICAgIGlmIChfTV9pbl9wdXRiYWNrX21vZGUpIHsKLSAgICAgIC8vIERvIHdlIGhhdmUgbW9yZSByb29tIGluIHRoZSBwdXRiYWNrIGJ1ZmZlcj8KLSAgICAgIGlmICh0aGlzLT5lYmFjaygpICE9IF9NX3BiYWNrX2J1ZikKLSAgICAgICAgdGhpcy0+c2V0Zyh0aGlzLT5lZ3B0cigpIC0gMSwgdGhpcy0+ZWdwdHIoKSAtIDEsIF9fcGJhY2tfZW5kKTsKLSAgICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIF9fZW9mOyAgICAgICAgICAgLy8gTm8gbW9yZSByb29tIGluIHRoZSBidWZmZXIsIHNvIGZhaWwuCi0gICAgfQotICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAvLyBXZSdyZSBub3QgeWV0IGluIHRoZSBwdXRiYWNrIGJ1ZmZlci4KLSAgICAgIF9NX3NhdmVkX2ViYWNrID0gdGhpcy0+ZWJhY2soKTsKLSAgICAgIF9NX3NhdmVkX2dwdHIgID0gdGhpcy0+Z3B0cigpOwotICAgICAgX01fc2F2ZWRfZWdwdHIgPSB0aGlzLT5lZ3B0cigpOwotICAgICAgdGhpcy0+c2V0ZyhfX3BiYWNrX2VuZCAtIDEsIF9fcGJhY2tfZW5kIC0gMSwgX19wYmFja19lbmQpOwotICAgICAgX01faW5fcHV0YmFja19tb2RlID0gdHJ1ZTsKLSAgICB9Ci0gIH0KLSAgZWxzZQotICAgIHJldHVybiBfX2VvZjsKLQotICAvLyBXZSBoYXZlIG1hZGUgYSBwdXRiYWNrIHBvc2l0aW9uIGF2YWlsYWJsZS4gIEFzc2lnbiB0byBpdCwgYW5kIHJldHVybi4KLSAgKnRoaXMtPmdwdHIoKSA9IHRyYWl0c190eXBlOjp0b19jaGFyX3R5cGUoX19jKTsKLSAgcmV0dXJuIF9fYzsKLX0KLQotLy8gVGhpcyBtZW1iZXIgZnVuY3Rpb24gZmx1c2hlcyB0aGUgcHV0IGFyZWEsIGFuZCBhbHNvIG91dHB1dHMgdGhlCi0vLyBjaGFyYWN0ZXIgX19jICh1bmxlc3MgX19jIGlzIGVvZikuICBJbnZhcmlhbnQ6IHdlIGFsd2F5cyBsZWF2ZSByb29tCi0vLyBpbiB0aGUgaW50ZXJuYWwgYnVmZmVyIGZvciBvbmUgY2hhcmFjdGVyIG1vcmUgdGhhbiB0aGUgYmFzZSBjbGFzcyBrbm93cwotLy8gYWJvdXQuICBXZSBzZWUgdGhlIGludGVybmFsIGJ1ZmZlciBhcyBbX01faW50X2J1ZiwgX01faW50X2J1Zl9FT1MpLCBidXQKLS8vIHRoZSBiYXNlIGNsYXNzIG9ubHkgc2VlcyBbX01faW50X2J1ZiwgX01faW50X2J1Zl9FT1MgLSAxKS4KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Ci1fX0JGX2ludF90eXBlX18KLWJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6b3ZlcmZsb3coaW50X3R5cGUgX19jKSB7Ci0gIC8vIFN3aXRjaCB0byBvdXRwdXQgbW9kZSwgaWYgbmVjZXNzYXJ5LgotICBpZiAoIV9NX2luX291dHB1dF9tb2RlKQotICAgIGlmICghX01fc3dpdGNoX3RvX291dHB1dF9tb2RlKCkpCi0gICAgICByZXR1cm4gdHJhaXRzX3R5cGU6OmVvZigpOwotCi0gIF9DaGFyVCogX19pYmVnaW4gPSB0aGlzLT5fTV9pbnRfYnVmOwotICBfQ2hhclQqIF9faWVuZCAgID0gdGhpcy0+cHB0cigpOwotICB0aGlzLT5zZXRwKF9NX2ludF9idWYsIF9NX2ludF9idWZfRU9TIC0gMSk7Ci0KLSAgLy8gUHV0IF9fYyBhdCB0aGUgZW5kIG9mIHRoZSBpbnRlcm5hbCBidWZmZXIuCi0gIGlmICghdHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9fYywgdHJhaXRzX3R5cGU6OmVvZigpKSkKLSAgICAqX19pZW5kKysgPSBfVHJhaXRzOjp0b19jaGFyX3R5cGUoX19jKTsKLQotICAvLyBGb3IgdmFyaWFibGUtd2lkdGggZW5jb2RpbmdzLCBvdXRwdXQgbWF5IHRha2UgbW9yZSB0aGFuIG9uZSBwYXNzLgotICB3aGlsZSAoX19pYmVnaW4gIT0gX19pZW5kKSB7Ci0gICAgY29uc3QgX0NoYXJUKiBfX2luZXh0ID0gX19pYmVnaW47Ci0gICAgY2hhciogX19lbmV4dCAgICAgICAgID0gX01fZXh0X2J1ZjsKLSAgICB0eXBlbmFtZSBfQ29kZWN2dDo6cmVzdWx0IF9fc3RhdHVzCi0gICAgICA9IF9NX2NvZGVjdnQtPm91dChfTV9zdGF0ZSwgX19pYmVnaW4sIF9faWVuZCwgX19pbmV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9NX2V4dF9idWYsIF9NX2V4dF9idWZfRU9TLCBfX2VuZXh0KTsKLSAgICBpZiAoX19zdGF0dXMgPT0gX0NvZGVjdnQ6Om5vY29udikgewotICAgICAgcmV0dXJuIF9Ob2NvbnZfb3V0cHV0PF9UcmFpdHM+OjpfTV9kb2l0KHRoaXMsIF9faWJlZ2luLCBfX2llbmQpCi0gICAgICAgID8gdHJhaXRzX3R5cGU6Om5vdF9lb2YoX19jKQotICAgICAgICA6IF9NX291dHB1dF9lcnJvcigpOwotICAgIH0KLQotICAgIC8vIEZvciBhIGNvbnN0YW50LXdpZHRoIGVuY29kaW5nIHdlIGtub3cgdGhhdCB0aGUgZXh0ZXJuYWwgYnVmZmVyCi0gICAgLy8gaXMgbGFyZ2UgZW5vdWdoLCBzbyBmYWlsdXJlIHRvIGNvbnN1bWUgdGhlIGVudGlyZSBpbnRlcm5hbCBidWZmZXIKLSAgICAvLyBvciB0byBwcm9kdWNlIHRoZSBjb3JyZWN0IG51bWJlciBvZiBleHRlcm5hbCBjaGFyYWN0ZXJzLCBpcyBhbiBlcnJvci4KLSAgICAvLyBGb3IgYSB2YXJpYWJsZS13aWR0aCBlbmNvZGluZywgaG93ZXZlciwgd2UgcmVxdWlyZSBvbmx5IHRoYXQgd2UKLSAgICAvLyBjb25zdW1lIGF0IGxlYXN0IG9uZSBpbnRlcm5hbCBjaGFyYWN0ZXIKLSAgICBlbHNlIGlmIChfX3N0YXR1cyAhPSBfQ29kZWN2dDo6ZXJyb3IgJiYKLSAgICAgICAgICAgICAoKChfX2luZXh0ID09IF9faWVuZCkgJiYKLSAgICAgICAgICAgICAgIChfX2VuZXh0IC0gX01fZXh0X2J1ZiA9PSBfTV93aWR0aCAqIChfX2llbmQgLSBfX2liZWdpbikpKSB8fAotICAgICAgICAgICAgICAoIV9NX2NvbnN0YW50X3dpZHRoICYmIF9faW5leHQgIT0gX19pYmVnaW4pKSkgewotICAgICAgICAvLyBXZSBzdWNjZXNzZnVsbHkgY29udmVydGVkIHBhcnQgb3IgYWxsIG9mIHRoZSBpbnRlcm5hbCBidWZmZXIuCi0gICAgICBwdHJkaWZmX3QgX19uID0gX19lbmV4dCAtIF9NX2V4dF9idWY7Ci0gICAgICBpZiAoX01fd3JpdGUoX01fZXh0X2J1ZiwgX19uKSkKLSAgICAgICAgX19pYmVnaW4gKz0gX19pbmV4dCAtIF9faWJlZ2luOwotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gX01fb3V0cHV0X2Vycm9yKCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJldHVybiBfTV9vdXRwdXRfZXJyb3IoKTsKLSAgfQotCi0gIHJldHVybiB0cmFpdHNfdHlwZTo6bm90X2VvZihfX2MpOwotfQotCi0vLyBUaGlzIG1lbWJlciBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IEkvTyBoYXMgYmVlbgotLy8gcGVyZm9ybWVkIG9uIHRoZSBzdHJlYW0sIG90aGVyd2lzZSBpdCBoYXMgbm8gZWZmZWN0LgotLy8KLS8vIF9fYnVmID09IDAgJiYgX19uID09IDAgbWVhbnMgdG8gbWFrZSB0aGlzIHN0cmVhbSB1bmJ1ZmZlcmVkLgotLy8gX19idWYgIT0gMCAmJiBfX24gPiAwIG1lYW5zIHRvIHVzZSBfX2J1ZiBhcyB0aGUgc3RyZWFtJ3MgaW50ZXJuYWwKLS8vIGJ1ZmZlciwgcmF0aGVyIHRoYW4gdGhlIGJ1ZmZlciB0aGF0IHdvdWxkIG90aGVyd2lzZSBiZSBhbGxvY2F0ZWQKLS8vIGF1dG9tYXRpY2FsbHkuICBfX2J1ZiBtdXN0IGJlIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBfQ2hhclQgd2hvc2UKLS8vIHNpemUgaXMgYXQgbGVhc3QgX19uLgotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KLWJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KgotYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjpzZXRidWYoX0NoYXJUKiBfX2J1Ziwgc3RyZWFtc2l6ZSBfX24pIHsKLSAgaWYgKCFfTV9pbl9pbnB1dF9tb2RlICYmISBfTV9pbl9vdXRwdXRfbW9kZSAmJiAhX01faW5fZXJyb3JfbW9kZSAmJgotICAgICAgX01faW50X2J1ZiA9PSAwKSB7Ci0gICAgaWYgKF9fYnVmID09IDAgJiYgX19uID09IDApCi0gICAgICBfTV9hbGxvY2F0ZV9idWZmZXJzKDAsIDEpOwotICAgIGVsc2UgaWYgKF9fYnVmICE9IDAgJiYgX19uID4gMCkKLSAgICAgIF9NX2FsbG9jYXRlX2J1ZmZlcnMoX19idWYsIF9fbik7Ci0gIH0KLSAgcmV0dXJuIHRoaXM7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Ci1fX0JGX3Bvc190eXBlX18KLWJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6c2Vla29mZihvZmZfdHlwZSBfX29mZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6c2Vla2RpciBfX3doZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6b3Blbm1vZGUgLyogZHVtbXkgKi8pIHsKLSAgaWYgKHRoaXMtPmlzX29wZW4oKSAmJgotICAgICAgKF9fb2ZmID09IDAgfHwgKF9NX2NvbnN0YW50X3dpZHRoICYmIHRoaXMtPl9NX2Jhc2UuX01faW5fYmluYXJ5X21vZGUoKSkpKSB7Ci0KLSAgICBpZiAoIV9NX3NlZWtfaW5pdChfX29mZiAhPSAwIHx8IF9fd2hlbmNlICE9IGlvc19iYXNlOjpjdXIpKQotICAgICAgcmV0dXJuIHBvc190eXBlKC0xKTsKLQotICAgIC8vIFNlZWsgdG8gYmVnaW5uaW5nIG9yIGVuZCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHdlJ3JlIGluIGlucHV0IG1vZGUuCi0gICAgaWYgKF9fd2hlbmNlID09IGlvc19iYXNlOjpiZWcgfHwgX193aGVuY2UgPT0gaW9zX2Jhc2U6OmVuZCkKLSAgICAgIHJldHVybiBfTV9zZWVrX3JldHVybihfTV9iYXNlLl9NX3NlZWsoX01fd2lkdGggKiBfX29mZiwgX193aGVuY2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TdGF0ZV90eXBlKCkpOwotCi0gICAgLy8gU2VlayByZWxhdGl2ZSB0byBjdXJyZW50IHBvc2l0aW9uLiBDb21wbGljYXRlZCBpZiB3ZSdyZSBpbiBpbnB1dCBtb2RlLgotICAgIGVsc2UgaWYgKF9fd2hlbmNlID09IGlvc19iYXNlOjpjdXIpIHsKLSAgICAgIGlmICghX01faW5faW5wdXRfbW9kZSkKLSAgICAgICAgcmV0dXJuIF9NX3NlZWtfcmV0dXJuKF9NX2Jhc2UuX01fc2VlayhfTV93aWR0aCAqIF9fb2ZmLCBfX3doZW5jZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU3RhdGVfdHlwZSgpKTsKLSAgICAgIGVsc2UgaWYgKF9NX21tYXBfYmFzZSAhPSAwKSB7Ci0gICAgICAgIC8vIF9fb2ZmIGlzIHJlbGF0aXZlIHRvIGdwdHIoKS4gIFdlIG5lZWQgdG8gZG8gYSBiaXQgb2YgYXJpdGhtZXRpYwotICAgICAgICAvLyB0byBnZXQgYW4gb2Zmc2V0IHJlbGF0aXZlIHRvIHRoZSBleHRlcm5hbCBmaWxlIHBvaW50ZXIuCi0gICAgICAgIHN0cmVhbW9mZiBfX2FkanVzdCA9IF9NX21tYXBfbGVuIC0gKHRoaXMtPmdwdHIoKSAtIChfQ2hhclQqKSBfTV9tbWFwX2Jhc2UpOwotCi0gICAgICAgIC8vIGlmIF9fb2ZmID09IDAsIHdlIGRvIG5vdCBuZWVkIHRvIGV4aXQgaW5wdXQgbW9kZSBhbmQgdG8gc2hpZnQgZmlsZSBwb2ludGVyCi0gICAgICAgIHJldHVybiBfX29mZiA9PSAwID8gcG9zX3R5cGUoX01fYmFzZS5fTV9zZWVrKDAsIGlvc19iYXNlOjpjdXIpIC0gX19hZGp1c3QpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDogX01fc2Vla19yZXR1cm4oX01fYmFzZS5fTV9zZWVrKF9fb2ZmIC0gX19hZGp1c3QsIGlvc19iYXNlOjpjdXIpLCBfU3RhdGVfdHlwZSgpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKF9NX2NvbnN0YW50X3dpZHRoKSB7IC8vIEdldCBvciBzZXQgdGhlIHBvc2l0aW9uLgotICAgICAgICBzdHJlYW1vZmYgX19pYWRqID0gX01fd2lkdGggKiAodGhpcy0+Z3B0cigpIC0gdGhpcy0+ZWJhY2soKSk7Ci0KLSAgICAgICAgLy8gQ29tcGVuc2F0ZSBmb3Igb2Zmc2V0IHJlbGF0aXZlIHRvIGdwdHIgdmVyc3VzIG9mZnNldCByZWxhdGl2ZQotICAgICAgICAvLyB0byBleHRlcm5hbCBwb2ludGVyLiAgRm9yIGEgdGV4dC1vcmllbnRlZCBzdHJlYW0sIHdoZXJlIHRoZQotICAgICAgICAvLyBjb21wZW5zYXRpb24gaXMgbW9yZSB0aGFuIGp1c3QgcG9pbnRlciBhcml0aG1ldGljLCB3ZSBtYXkgZ2V0Ci0gICAgICAgIC8vIGJ1dCBub3Qgc2V0IHRoZSBjdXJyZW50IHBvc2l0aW9uLgotCi0gICAgICAgIGlmIChfX2lhZGogPD0gX01fZXh0X2J1Zl9lbmQgLSBfTV9leHRfYnVmKSB7Ci0gICAgICAgICAgc3RyZWFtb2ZmIF9fZWFkaiA9ICBfTV9iYXNlLl9NX2dldF9vZmZzZXQoX01fZXh0X2J1ZiArIF9fU1RBVElDX0NBU1QocHRyZGlmZl90LCBfX2lhZGopLCBfTV9leHRfYnVmX2VuZCk7Ci0KLSAgICAgICAgICByZXR1cm4gX19vZmYgPT0gMCA/IHBvc190eXBlKF9NX2Jhc2UuX01fc2VlaygwLCBpb3NfYmFzZTo6Y3VyKSAtIF9fZWFkaikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF9NX3NlZWtfcmV0dXJuKF9NX2Jhc2UuX01fc2VlayhfX29mZiAtIF9fZWFkaiwgaW9zX2Jhc2U6OmN1ciksIF9TdGF0ZV90eXBlKCkpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBwb3NpdGlvbi4gIEVuY29kaW5nIGlzIHZhciB3aWR0aC4KLSAgICAgICAgLy8gR2V0IHBvc2l0aW9uIGluIGludGVybmFsIGJ1ZmZlci4KLSAgICAgICAgcHRyZGlmZl90IF9faXBvcyA9IHRoaXMtPmdwdHIoKSAtIHRoaXMtPmViYWNrKCk7Ci0KLSAgICAgICAgLy8gR2V0IGNvcnJlc3BvbmRpbmcgcG9zaXRpb24gaW4gZXh0ZXJuYWwgYnVmZmVyLgotICAgICAgICBfU3RhdGVfdHlwZSBfX3N0YXRlID0gX01fc3RhdGU7Ci0gICAgICAgIGludCBfX2Vwb3MgPSBfTV9jb2RlY3Z0LT5sZW5ndGgoX19zdGF0ZSwgX01fZXh0X2J1ZiwgX01fZXh0X2J1Zl9lbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19pcG9zKTsKLQotICAgICAgICBpZiAoX19lcG9zID49IDApIHsKLSAgICAgICAgICAvLyBTYW5pdHkgY2hlY2sgKGV4cGVuc2l2ZSk6IG1ha2Ugc3VyZSBfX2Vwb3MgaXMgdGhlIHJpZ2h0IGFuc3dlci4KLSAgICAgICAgICBfU3RhdGVfdHlwZSBfX3RtcF9zdGF0ZSA9IF9NX3N0YXRlOwotICAgICAgICAgIF9GaWxlYnVmX1RtcF9CdWY8X0NoYXJUPiBfX2J1ZihfX2lwb3MpOwotICAgICAgICAgIF9DaGFyVCogX19pYmVnaW4gPSBfX2J1Zi5fTV9wdHI7Ci0gICAgICAgICAgX0NoYXJUKiBfX2luZXh0ICA9IF9faWJlZ2luOwotCi0gICAgICAgICAgY29uc3QgY2hhciogX19kdW1teTsKLSAgICAgICAgICB0eXBlbmFtZSBfQ29kZWN2dDo6cmVzdWx0IF9fc3RhdHVzCi0gICAgICAgICAgICA9IF9NX2NvZGVjdnQtPmluKF9fdG1wX3N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTV9leHRfYnVmLCBfTV9leHRfYnVmICsgX19lcG9zLCBfX2R1bW15LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2liZWdpbiwgX19pYmVnaW4gKyBfX2lwb3MsIF9faW5leHQpOwotICAgICAgICAgIGlmIChfX3N0YXR1cyAhPSBfQ29kZWN2dDo6ZXJyb3IgJiYKLSAgICAgICAgICAgICAgKF9fc3RhdHVzID09IF9Db2RlY3Z0Ojpub2NvbnYgfHwKLSAgICAgICAgICAgICAgIChfX2luZXh0ID09IF9faWJlZ2luICsgX19pcG9zICYmCi0gICAgICAgICAgICAgICAgZXF1YWwodGhpcy0+ZWJhY2soKSwgdGhpcy0+Z3B0cigpLCBfX2liZWdpbiwgX1NUTFBfUFJJViBfRXFfdHJhaXRzPHRyYWl0c190eXBlPigpKSkpKSB7Ci0gICAgICAgICAgICAvLyBHZXQgdGhlIGN1cnJlbnQgcG9zaXRpb24gKGF0IHRoZSBlbmQgb2YgdGhlIGV4dGVybmFsIGJ1ZmZlciksCi0gICAgICAgICAgICAvLyB0aGVuIGFkanVzdCBpdC4gIEFnYWluLCBpdCBtaWdodCBiZSBhIHRleHQtb3JpZW50ZWQgc3RyZWFtLgotICAgICAgICAgICAgc3RyZWFtb2ZmIF9fY3VyID0gX01fYmFzZS5fTV9zZWVrKDAsIGlvc19iYXNlOjpjdXIpOwotICAgICAgICAgICAgc3RyZWFtb2ZmIF9fYWRqID0KLSAgICAgICAgICAgICAgX01fYmFzZS5fTV9nZXRfb2Zmc2V0KF9NX2V4dF9idWYsIF9NX2V4dF9idWYgKyBfX2Vwb3MpIC0KLSAgICAgICAgICAgICAgX01fYmFzZS5fTV9nZXRfb2Zmc2V0KF9NX2V4dF9idWYsIF9NX2V4dF9idWZfZW5kKTsKLSAgICAgICAgICAgIGlmIChfX2N1ciAhPSAtMSAmJiBfX2N1ciArIF9fYWRqID49IDApCi0gICAgICAgICAgICAgIHJldHVybiBfX29mZiA9PSAwID8gcG9zX3R5cGUoX19jdXIgKyBfX2FkaikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfTV9zZWVrX3JldHVybihfX2N1ciArIF9fYWRqLCBfX3N0YXRlKTsKLSAgICAgICAgICAgICAgLy9yZXR1cm4gX01fc2Vla19yZXR1cm4oX19jdXIgKyBfX2FkaiwgX19zdGF0ZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vIFdlIGZhaWxlZCB0aGUgc2FuaXR5IGNoZWNrIGhlcmUuCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gVW5yZWNvZ25pemVkIHZhbHVlIGZvciBfX3doZW5jZSBoZXJlLgotICB9Ci0KLSAgcmV0dXJuIHBvc190eXBlKC0xKTsKLX0KLQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotX19CRl9wb3NfdHlwZV9fCi1iYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46OnNlZWtwb3MocG9zX3R5cGUgX19wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Om9wZW5tb2RlIC8qIGR1bW15ICovKSB7Ci0gIGlmICh0aGlzLT5pc19vcGVuKCkpIHsKLSAgICBpZiAoIV9NX3NlZWtfaW5pdCh0cnVlKSkKLSAgICAgIHJldHVybiBwb3NfdHlwZSgtMSk7Ci0KLSAgICBzdHJlYW1vZmYgX19vZmYgPSBvZmZfdHlwZShfX3Bvcyk7Ci0gICAgaWYgKF9fb2ZmICE9IC0xICYmIF9NX2Jhc2UuX01fc2VlayhfX29mZiwgaW9zX2Jhc2U6OmJlZykgIT0gLTEpIHsKLSAgICAgIF9NX3N0YXRlID0gX19wb3Muc3RhdGUoKTsKLSAgICAgIHJldHVybiBfTV9zZWVrX3JldHVybihfX29mZiwgX19wb3Muc3RhdGUoKSk7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHBvc190eXBlKC0xKTsKLX0KLQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotaW50IGJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6c3luYygpIHsKLSAgaWYgKF9NX2luX291dHB1dF9tb2RlKQotICAgIHJldHVybiB0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUodGhpcy0+b3ZlcmZsb3codHJhaXRzX3R5cGU6OmVvZigpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190eXBlOjplb2YoKSkgPyAtMSA6IDA7Ci0gIHJldHVybiAwOwotfQotCi0KLS8vIENoYW5nZSB0aGUgZmlsZWJ1ZidzIGxvY2FsZS4gIFRoaXMgbWVtYmVyIGZ1bmN0aW9uIGhhcyBubyBlZmZlY3QKLS8vIHVubGVzcyBpdCBpcyBjYWxsZWQgYmVmb3JlIGFueSBJL08gaXMgcGVyZm9ybWVkIG9uIHRoZSBzdHJlYW0uCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotdm9pZCBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46OmltYnVlKGNvbnN0IGxvY2FsZSYgX19sb2MpIHsKLSAgaWYgKCFfTV9pbl9pbnB1dF9tb2RlICYmICFfTV9pbl9vdXRwdXRfbW9kZSAmJiAhX01faW5fZXJyb3JfbW9kZSkgewotICAgIHRoaXMtPl9NX3NldHVwX2NvZGVjdnQoX19sb2MpOwotICB9Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gYmFzaWNfZmlsZWJ1Zjw+IGhlbHBlciBmdW5jdGlvbnMuCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3Igc3dpdGNoaW5nIGJldHdlZW4gbW9kZXMuCi0KLS8vIFRoaXMgbWVtYmVyIGZ1bmN0aW9uIGlzIGNhbGxlZCBpZiB3ZSdyZSBwZXJmb3JtaW5nIHRoZSBmaXJzdCBJL08KLS8vIG9wZXJhdGlvbiBvbiBhIGZpbGVidWYsIG9yIGlmIHdlJ3JlIHBlcmZvcm1pbmcgYW4gaW5wdXQgb3BlcmF0aW9uCi0vLyBpbW1lZGlhdGVseSBhZnRlciBhIHNlZWsuCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotYm9vbCBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46Ol9NX3N3aXRjaF90b19pbnB1dF9tb2RlKCkgewotICBpZiAodGhpcy0+aXNfb3BlbigpICYmICgoKGludClfTV9iYXNlLl9fb19tb2RlKCkgJiAoaW50KWlvc19iYXNlOjppbikgIT0gMCkKLSAgICAgICYmIChfTV9pbl9vdXRwdXRfbW9kZSA9PSAwKSAmJiAoX01faW5fZXJyb3JfbW9kZSA9PSAwKSkgewotICAgIGlmICghX01faW50X2J1ZiAmJiAhX01fYWxsb2NhdGVfYnVmZmVycygpKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgX01fZXh0X2J1Zl9jb252ZXJ0ZWQgPSBfTV9leHRfYnVmOwotICAgIF9NX2V4dF9idWZfZW5kICAgICAgID0gX01fZXh0X2J1ZjsKLQotICAgIF9NX2VuZF9zdGF0ZSAgICA9IF9NX3N0YXRlOwotCi0gICAgX01faW5faW5wdXRfbW9kZSA9IHRydWU7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotLy8gVGhpcyBtZW1iZXIgZnVuY3Rpb24gaXMgY2FsbGVkIGlmIHdlJ3JlIHBlcmZvcm1pbmcgdGhlIGZpcnN0IEkvTwotLy8gb3BlcmF0aW9uIG9uIGEgZmlsZWJ1Ziwgb3IgaWYgd2UncmUgcGVyZm9ybWluZyBhbiBvdXRwdXQgb3BlcmF0aW9uCi0vLyBpbW1lZGlhdGVseSBhZnRlciBhIHNlZWsuCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotYm9vbCBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46Ol9NX3N3aXRjaF90b19vdXRwdXRfbW9kZSgpIHsKLSAgaWYgKHRoaXMtPmlzX29wZW4oKSAmJiAoX01fYmFzZS5fX29fbW9kZSgpICYgKGludClpb3NfYmFzZTo6b3V0KSAmJgotICAgICAgX01faW5faW5wdXRfbW9kZSA9PSAwICYmIF9NX2luX2Vycm9yX21vZGUgPT0gMCkgewotCi0gICAgaWYgKCFfTV9pbnRfYnVmICYmICFfTV9hbGxvY2F0ZV9idWZmZXJzKCkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyBJbiBhcHBlbmQgbW9kZSwgZXZlcnkgd3JpdGUgZG9lcyBhbiBpbXBsaWNpdCBzZWVrIHRvIHRoZSBlbmQKLSAgICAvLyBvZiB0aGUgZmlsZS4gIFdoZW5ldmVyIGxlYXZpbmcgb3V0cHV0IG1vZGUsIHRoZSBlbmQgb2YgZmlsZQotICAgIC8vIGdldCBwdXQgaW4gdGhlIGluaXRpYWwgc2hpZnQgc3RhdGUuCi0gICAgaWYgKF9NX2Jhc2UuX19vX21vZGUoKSAmIGlvc19iYXNlOjphcHApCi0gICAgICBfTV9zdGF0ZSA9IF9TdGF0ZV90eXBlKCk7Ci0KLSAgICB0aGlzLT5zZXRwKF9NX2ludF9idWYsIF9NX2ludF9idWZfRU9TIC0gMSk7Ci0gICAgX01faW5fb3V0cHV0X21vZGUgPSB0cnVlOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgaW5wdXQKLQotLy8gVGhpcyBtZW1iZXIgZnVuY3Rpb24gaXMgY2FsbGVkIGlmIHRoZXJlIGlzIGFuIGVycm9yIGR1cmluZyBpbnB1dC4KLS8vIEl0IHB1dHMgdGhlIGZpbGVidWYgaW4gZXJyb3IgbW9kZSwgY2xlYXIgdGhlIGdldCBhcmVhIGJ1ZmZlciwgYW5kCi0vLyByZXR1cm5zIGVvZi4KLS8vIHJldHVybnMgZW9mLiAgRXJyb3IgbW9kZSBpcyBzdGlja3k7IGl0IGlzIGNsZWFyZWQgb25seSBieSBjbG9zZSBvcgotLy8gc2Vlay4KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KLV9fQkZfaW50X3R5cGVfXwotYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjpfTV9pbnB1dF9lcnJvcigpIHsKLSAgIHRoaXMtPl9NX2V4aXRfaW5wdXRfbW9kZSgpOwotICBfTV9pbl9vdXRwdXRfbW9kZSA9IGZhbHNlOwotICBfTV9pbl9lcnJvcl9tb2RlID0gdHJ1ZTsKLSAgdGhpcy0+c2V0ZygwLCAwLCAwKTsKLSAgcmV0dXJuIHRyYWl0c190eXBlOjplb2YoKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KLV9fQkZfaW50X3R5cGVfXwotYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjpfTV91bmRlcmZsb3dfYXV4KCkgewotICAvLyBXZSBoYXZlIHRoZSBzdGF0ZSBhbmQgZmlsZSBwb3NpdGlvbiBmcm9tIHRoZSBlbmQgb2YgdGhlIGludGVybmFsCi0gIC8vIGJ1ZmZlci4gIFRoaXMgcm91bmQsIHRoZXkgYmVjb21lIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGludGVybmFsIGJ1ZmZlci4KLSAgX01fc3RhdGUgICAgPSBfTV9lbmRfc3RhdGU7Ci0KLSAgLy8gRmlsbCB0aGUgZXh0ZXJuYWwgYnVmZmVyLiAgU3RhcnQgd2l0aCBhbnkgbGVmdG92ZXIgY2hhcmFjdGVycyB0aGF0Ci0gIC8vIGRpZG4ndCBnZXQgY29udmVydGVkIGxhc3QgdGltZS4KLSAgaWYgKF9NX2V4dF9idWZfZW5kID4gX01fZXh0X2J1Zl9jb252ZXJ0ZWQpCi0KLSAgICBfTV9leHRfYnVmX2VuZCA9IGNvcHkoX01fZXh0X2J1Zl9jb252ZXJ0ZWQsIF9NX2V4dF9idWZfZW5kLCBfTV9leHRfYnVmKTsKLSAgICAvLyBib3JpcyA6IGNvcHlfYmFja3dhcmQgZGlkIG5vdCB3b3JrCi0gICAgLy9fTV9leHRfYnVmX2VuZCA9IGNvcHlfYmFja3dhcmQoX01fZXh0X2J1Zl9jb252ZXJ0ZWQsIF9NX2V4dF9idWZfZW5kLAotICAgIC8vX01fZXh0X2J1ZisgKF9NX2V4dF9idWZfZW5kIC0gX01fZXh0X2J1Zl9jb252ZXJ0ZWQpKTsKLSAgZWxzZQotICAgIF9NX2V4dF9idWZfZW5kID0gX01fZXh0X2J1ZjsKLQotICAvLyBOb3cgZmlsbCB0aGUgZXh0ZXJuYWwgYnVmZmVyIHdpdGggY2hhcmFjdGVycyBmcm9tIHRoZSBmaWxlLiAgVGhpcyBpcwotICAvLyBhIGxvb3AgYmVjYXVzZSBvY2Nhc2lvbmFsbHkgd2UgZG9uJ3QgZ2V0IGVub3VnaCBleHRlcm5hbCBjaGFyYWN0ZXJzCi0gIC8vIHRvIG1ha2UgcHJvZ3Jlc3MuCi0gIGZvciAoOzspIHsKLSAgICBwdHJkaWZmX3QgX19uID0gX01fYmFzZS5fTV9yZWFkKF9NX2V4dF9idWZfZW5kLCBfTV9leHRfYnVmX0VPUyAtIF9NX2V4dF9idWZfZW5kKTsKLQotICAgIC8vIERvbid0IGVudGVyIGVycm9yIG1vZGUgZm9yIGEgZmFpbGVkIHJlYWQuICBFcnJvciBtb2RlIGlzIHN0aWNreSwKLSAgICAvLyBhbmQgd2UgbWlnaHQgc3VjY2VlZCBpZiB3ZSB0cnkgYWdhaW4uCi0gICAgaWYgKF9fbiA8PSAwKQotICAgICAgcmV0dXJuIHRyYWl0c190eXBlOjplb2YoKTsKLQotICAgIC8vIENvbnZlcnQgdGhlIGV4dGVybmFsIGJ1ZmZlciB0byBpbnRlcm5hbCBjaGFyYWN0ZXJzLgotICAgIF9NX2V4dF9idWZfZW5kICs9IF9fbjsKLSAgICBjb25zdCBjaGFyKiAgIF9fZW5leHQ7Ci0gICAgX0NoYXJUKiBfX2luZXh0OwotCi0gICAgdHlwZW5hbWUgX0NvZGVjdnQ6OnJlc3VsdCBfX3N0YXR1cwotICAgICAgPSBfTV9jb2RlY3Z0LT5pbihfTV9lbmRfc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgIF9NX2V4dF9idWYsIF9NX2V4dF9idWZfZW5kLCBfX2VuZXh0LAotICAgICAgICAgICAgICAgICAgICAgICBfTV9pbnRfYnVmLCBfTV9pbnRfYnVmX0VPUywgX19pbmV4dCk7Ci0KLSAgICAvLyBFcnJvciBjb25kaXRpb25zOiAoMSkgUmV0dXJuIHZhbHVlIG9mIGVycm9yLiAgKDIpIFByb2R1Y2luZyBpbnRlcm5hbAotICAgIC8vIGNoYXJhY3RlcnMgd2l0aG91dCBjb25zdW1pbmcgZXh0ZXJuYWwgY2hhcmFjdGVycy4gICgzKSBJbiBmaXhlZC13aWR0aAotICAgIC8vIGVuY29kaW5ncywgcHJvZHVjaW5nIGFuIGludGVybmFsIHNlcXVlbmNlIHdob3NlIGxlbmd0aCBpcyBpbmNvbnNpc3RlbnQKLSAgICAvLyB3aXRoIHRoYXQgb2YgdGhlIGludGVybmFsIHNlcXVlbmNlLiAgKDQpIEZhaWx1cmUgdG8gcHJvZHVjZSBhbnkKLSAgICAvLyBjaGFyYWN0ZXJzIGlmIHdlIGhhdmUgZW5vdWdoIGNoYXJhY3RlcnMgaW4gdGhlIGV4dGVybmFsIGJ1ZmZlciwgd2hlcmUKLSAgICAvLyAiZW5vdWdoIiBtZWFucyB0aGUgbGFyZ2VzdCBwb3NzaWJsZSB3aWR0aCBvZiBhIHNpbmdsZSBjaGFyYWN0ZXIuCi0gICAgaWYgKF9fc3RhdHVzID09IF9Db2RlY3Z0Ojpub2NvbnYpCi0gICAgICByZXR1cm4gX05vY29udl9pbnB1dDxfVHJhaXRzPjo6X01fZG9pdCh0aGlzKTsKLSAgICBlbHNlIGlmIChfX3N0YXR1cyA9PSBfQ29kZWN2dDo6ZXJyb3IgfHwKLSAgICAgICAgICAgICAoX19pbmV4dCAhPSBfTV9pbnRfYnVmICYmIF9fZW5leHQgPT0gX01fZXh0X2J1ZikgfHwKLSAgICAgICAgICAgICAoX01fY29uc3RhbnRfd2lkdGggJiYKLSAgICAgICAgICAgICAgLy8gICAgICAgICBfX2luZXh0IC0gX01faW50X2J1ZiAhPSBfTV93aWR0aCAqIChfX2VuZXh0IC0gX01fZXh0X2J1ZikpIHx8Ci0gICAgICAgICAgICAgIChfX2luZXh0IC0gX01faW50X2J1ZikgKiAgX01fd2lkdGggIT0gKF9fZW5leHQgLSBfTV9leHRfYnVmKSkgfHwKLSAgICAgICAgICAgICAoX19pbmV4dCA9PSBfTV9pbnRfYnVmICYmIF9fZW5leHQgLSBfTV9leHRfYnVmID49IF9NX21heF93aWR0aCkpCi0gICAgICByZXR1cm4gX01faW5wdXRfZXJyb3IoKTsKLSAgICBlbHNlIGlmIChfX2luZXh0ICE9IF9NX2ludF9idWYpIHsKLSAgICAgIF9NX2V4dF9idWZfY29udmVydGVkID0gX01fZXh0X2J1ZiArIChfX2VuZXh0IC0gX01fZXh0X2J1Zik7Ci0gICAgICB0aGlzLT5zZXRnKF9NX2ludF9idWYsIF9NX2ludF9idWYsIF9faW5leHQpOwotICAgICAgcmV0dXJuIHRyYWl0c190eXBlOjp0b19pbnRfdHlwZSgqX01faW50X2J1Zik7Ci0gICAgfQotICAgIC8vIFdlIG5lZWQgdG8gZ28gYXJvdW5kIHRoZSBsb29wIGFnYWluIHRvIGdldCBtb3JlIGV4dGVybmFsIGNoYXJhY3RlcnMuCi0gIH0KLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBIZWxwZXIgZnVuY3Rpb25zIGZvciBvdXRwdXQKLQotLy8gVGhpcyBtZW1iZXIgZnVuY3Rpb24gaXMgY2FsbGVkIGlmIHRoZXJlIGlzIGFuIGVycm9yIGR1cmluZyBvdXRwdXQuCi0vLyBJdCBwdXRzIHRoZSBmaWxlYnVmIGluIGVycm9yIG1vZGUsIGNsZWFyIHRoZSBwdXQgYXJlYSBidWZmZXIsIGFuZAotLy8gcmV0dXJucyBlb2YuICBFcnJvciBtb2RlIGlzIHN0aWNreTsgaXQgaXMgY2xlYXJlZCBvbmx5IGJ5IGNsb3NlIG9yCi0vLyBzZWVrLgotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KLV9fQkZfaW50X3R5cGVfXwotYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjpfTV9vdXRwdXRfZXJyb3IoKSB7Ci0gIF9NX2luX291dHB1dF9tb2RlID0gZmFsc2U7Ci0gIF9NX2luX2lucHV0X21vZGUgPSBmYWxzZTsKLSAgX01faW5fZXJyb3JfbW9kZSA9IHRydWU7Ci0gIHRoaXMtPnNldHAoMCwgMCk7Ci0gIHJldHVybiB0cmFpdHNfdHlwZTo6ZW9mKCk7Ci19Ci0KLQotLy8gV3JpdGUgd2hhdGV2ZXIgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyBpcyBuZWNlc3NhcnkgdG8gZ2V0IGJhY2sgdG8KLS8vIHRoZSBpbml0aWFsIHNoaWZ0IHN0YXRlLiAgVGhpcyBmdW5jdGlvbiBvdmVyd3JpdGVzIHRoZSBleHRlcm5hbAotLy8gYnVmZmVyLCBjaGFuZ2VzIHRoZSBleHRlcm5hbCBmaWxlIHBvc2l0aW9uLCBhbmQgY2hhbmdlcyB0aGUgc3RhdGUuCi0vLyBQcmVjb25kaXRpb246IHRoZSBpbnRlcm5hbCBidWZmZXIgaXMgZW1wdHkuCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotYm9vbCBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46Ol9NX3Vuc2hpZnQoKSB7Ci0gIGlmIChfTV9pbl9vdXRwdXRfbW9kZSAmJiAhX01fY29uc3RhbnRfd2lkdGgpIHsKLSAgICB0eXBlbmFtZSBfQ29kZWN2dDo6cmVzdWx0IF9fc3RhdHVzOwotICAgIGRvIHsKLSAgICAgIGNoYXIqIF9fZW5leHQgPSBfTV9leHRfYnVmOwotICAgICAgX19zdGF0dXMgPSBfTV9jb2RlY3Z0LT51bnNoaWZ0KF9NX3N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NX2V4dF9idWYsIF9NX2V4dF9idWZfRU9TLCBfX2VuZXh0KTsKLSAgICAgIGlmIChfX3N0YXR1cyA9PSBfQ29kZWN2dDo6bm9jb252IHx8Ci0gICAgICAgICAgKF9fZW5leHQgPT0gX01fZXh0X2J1ZiAmJiBfX3N0YXR1cyA9PSBfQ29kZWN2dDo6b2spKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIGVsc2UgaWYgKF9fc3RhdHVzID09IF9Db2RlY3Z0OjplcnJvcikKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgZWxzZSBpZiAoIV9NX3dyaXRlKF9NX2V4dF9idWYsIF9fZW5leHQgLSBfTV9leHRfYnVmKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0gd2hpbGUgKF9fc3RhdHVzID09IF9Db2RlY3Z0OjpwYXJ0aWFsKTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgYnVmZmVyIGFsbG9jYXRpb24gYW5kIGRlYWxsb2NhdGlvbgotCi0vLyBUaGlzIG1lbWJlciBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB3ZSdyZSBpbml0aWFsaXppbmcgYSBmaWxlYnVmJ3MKLS8vIGludGVybmFsIGFuZCBleHRlcm5hbCBidWZmZXJzLiAgVGhlIGFyZ3VtZW50IGlzIHRoZSBzaXplIG9mIHRoZQotLy8gaW50ZXJuYWwgYnVmZmVyOyB0aGUgZXh0ZXJuYWwgYnVmZmVyIGlzIHNpemVkIHVzaW5nIHRoZSBjaGFyYWN0ZXIKLS8vIHdpZHRoIGluIHRoZSBjdXJyZW50IGVuY29kaW5nLiAgUHJlY29uZGl0aW9uczogdGhlIGJ1ZmZlcnMgYXJlIGN1cnJlbnRseQotLy8gbnVsbC4gIF9fbiA+PSAxLiAgX19idWYgaXMgZWl0aGVyIGEgbnVsbCBwb2ludGVyIG9yIGEgcG9pbnRlciB0byBhbgotLy8gYXJyYXkgc2hvdyBzaXplIGlzIGF0IGxlYXN0IF9fbi4KLQotLy8gV2UgbmVlZCBfX24gPj0gMSBmb3IgdHdvIGRpZmZlcmVudCByZWFzb25zLiAgRm9yIGlucHV0LCB0aGUgYmFzZQotLy8gY2xhc3MgYWx3YXlzIG5lZWRzIGEgYnVmZmVyIGJlY2F1c2Ugb2YgdGhlIHNlbWFudGljcyBvZiB1bmRlcmZsb3coKS4KLS8vIEZvciBvdXRwdXQsIHdlIHdhbnQgdG8gaGF2ZSBhbiBpbnRlcm5hbCBidWZmZXIgdGhhdCdzIGxhcmdlciBieSBvbmUKLS8vIGVsZW1lbnQgdGhhbiB0aGUgYnVmZmVyIHRoYXQgdGhlIGJhc2UgY2xhc3Mga25vd3MgYWJvdXQuICAoU2VlCi0vLyBiYXNpY19maWxlYnVmPD46Om92ZXJmbG93KCkgZm9yIHRoZSByZWFzb24uKQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KLWJvb2wgYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjpfTV9hbGxvY2F0ZV9idWZmZXJzKF9DaGFyVCogX19idWYsIHN0cmVhbXNpemUgX19uKSB7Ci0gIC8vVGhlIG1ham9yIGh5cG90aGVzaXMgaW4gdGhlIGZvbGxvd2luZyBpbXBsZW1lbnRhdGlvbiBpcyB0aGF0IHNpemVfdCBpcyB1bnNpZ25lZC4KLSAgLy9XZSBhbHNvIG5lZWQgc3RyZWFtc2l6ZSBieXRlIHJlcHJlc2VudGF0aW9uIHRvIGJlIGxhcmdlciBvciBlcXVhbCB0byB0aGUgaW50Ci0gIC8vcmVwcmVzZW50YXRpb24gdG8gY29ycmVjdGx5IHN0b3JlIHRoZSBlbmNvZGluZyBpbmZvcm1hdGlvbi4KLSAgX1NUTFBfU1RBVElDX0FTU0VSVCghbnVtZXJpY19saW1pdHM8c2l6ZV90Pjo6aXNfc2lnbmVkICYmCi0gICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cmVhbXNpemUpID49IHNpemVvZihpbnQpKQotCi0gIGlmIChfX2J1ZiA9PSAwKSB7Ci0gICAgc3RyZWFtc2l6ZSBfX2J1ZnNpemUgPSBfX24gKiBzaXplb2YoX0NoYXJUKTsKLSAgICAvL1dlIGZpcnN0IGNoZWNrIHRoYXQgdGhlIHN0cmVhbXNpemUgcmVwcmVzZW50YXRpb24gY2FuJ3Qgb3ZlcmZsb3cgYSBzaXplX3Qgb25lLgotICAgIC8vSWYgaXQgY2FuLCB3ZSBjaGVjayB0aGF0IF9fYnVmc2l6ZSBpcyBub3QgaGlnaGVyIHRoYW4gdGhlIHNpemVfdCBtYXggdmFsdWUuCi0gICAgaWYgKChzaXplb2Yoc3RyZWFtc2l6ZSkgPiBzaXplb2Yoc2l6ZV90KSkgJiYKLSAgICAgICAgKF9fYnVmc2l6ZSA+IF9fU1RBVElDX0NBU1Qoc3RyZWFtc2l6ZSwgKG51bWVyaWNfbGltaXRzPHNpemVfdD46Om1heCkoKSkpKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIF9NX2ludF9idWYgPSBfX1NUQVRJQ19DQVNUKF9DaGFyVCosIG1hbGxvYyhfX1NUQVRJQ19DQVNUKHNpemVfdCwgX19idWZzaXplKSkpOwotICAgIGlmICghX01faW50X2J1ZikKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBfTV9pbnRfYnVmX2R5bmFtaWMgPSB0cnVlOwotICB9Ci0gIGVsc2UgewotICAgIF9NX2ludF9idWYgPSBfX2J1ZjsKLSAgICBfTV9pbnRfYnVmX2R5bmFtaWMgPSBmYWxzZTsKLSAgfQotCi0gIHN0cmVhbXNpemUgX19lYnVmc2l6ID0gKG1heCkoX19uICogX19TVEFUSUNfQ0FTVChzdHJlYW1zaXplLCBfTV93aWR0aCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19TVEFUSUNfQ0FTVChzdHJlYW1zaXplLCBfTV9jb2RlY3Z0LT5tYXhfbGVuZ3RoKCkpKTsKLSAgX01fZXh0X2J1ZiA9IDA7Ci0gIGlmICgoc2l6ZW9mKHN0cmVhbXNpemUpIDwgc2l6ZW9mKHNpemVfdCkpIHx8Ci0gICAgICAoKHNpemVvZihzdHJlYW1zaXplKSA9PSBzaXplb2Yoc2l6ZV90KSkgJiYgbnVtZXJpY19saW1pdHM8c3RyZWFtc2l6ZT46OmlzX3NpZ25lZCkgfHwKLSAgICAgIChfX2VidWZzaXogPD0gX19TVEFUSUNfQ0FTVChzdHJlYW1zaXplLCAobnVtZXJpY19saW1pdHM8c2l6ZV90Pjo6bWF4KSgpKSkpIHsKLSAgICBfTV9leHRfYnVmID0gX19TVEFUSUNfQ0FTVChjaGFyKiwgbWFsbG9jKF9fU1RBVElDX0NBU1Qoc2l6ZV90LCBfX2VidWZzaXopKSk7Ci0gIH0KLQotICBpZiAoIV9NX2V4dF9idWYpIHsKLSAgICBfTV9kZWFsbG9jYXRlX2J1ZmZlcnMoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBfTV9pbnRfYnVmX0VPUyA9IF9NX2ludF9idWYgKyBfX1NUQVRJQ19DQVNUKHB0cmRpZmZfdCwgX19uKTsKLSAgX01fZXh0X2J1Zl9FT1MgPSBfTV9leHRfYnVmICsgX19TVEFUSUNfQ0FTVChwdHJkaWZmX3QsIF9fZWJ1ZnNpeik7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vLyBBYmJyZXZpYXRpb24gZm9yIHRoZSBtb3N0IGNvbW1vbiBjYXNlLgotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KLWJvb2wgYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjpfTV9hbGxvY2F0ZV9idWZmZXJzKCkgewotICAvLyBDaG9vc2UgYSBidWZmZXIgdGhhdCdzIGF0IGxlYXN0IDQwOTYgY2hhcmFjdGVycyBsb25nIGFuZCB0aGF0J3MgYQotICAvLyBtdWx0aXBsZSBvZiB0aGUgcGFnZSBzaXplLgotICBzdHJlYW1zaXplIF9fZGVmYXVsdF9idWZzaXogPQotICAgICgoX01fYmFzZS5fX3BhZ2Vfc2l6ZSgpICsgNDA5NVVMKSAvIF9NX2Jhc2UuX19wYWdlX3NpemUoKSkgKiBfTV9iYXNlLl9fcGFnZV9zaXplKCk7Ci0gIHJldHVybiBfTV9hbGxvY2F0ZV9idWZmZXJzKDAsIF9fZGVmYXVsdF9idWZzaXopOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotdm9pZCBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46Ol9NX2RlYWxsb2NhdGVfYnVmZmVycygpIHsKLSAgaWYgKF9NX2ludF9idWZfZHluYW1pYykKLSAgICBmcmVlKF9NX2ludF9idWYpOwotICBmcmVlKF9NX2V4dF9idWYpOwotICBfTV9pbnRfYnVmICAgICA9IDA7Ci0gIF9NX2ludF9idWZfRU9TID0gMDsKLSAgX01fZXh0X2J1ZiAgICAgPSAwOwotICBfTV9leHRfYnVmX0VPUyA9IDA7Ci19Ci0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBIZWxwZXIgZnVuY3Rpb3NuIGZvciBzZWVrIGFuZCBpbWJ1ZQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotYm9vbCBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46Ol9NX3NlZWtfaW5pdChib29sIF9fZG9fdW5zaGlmdCkgewotICAvLyBJZiB3ZSdyZSBpbiBlcnJvciBtb2RlLCBsZWF2ZSBpdC4KLSAgIF9NX2luX2Vycm9yX21vZGUgPSBmYWxzZTsKLQotICAvLyBGbHVzaCB0aGUgb3V0cHV0IGJ1ZmZlciBpZiB3ZSdyZSBpbiBvdXRwdXQgbW9kZSwgYW5kIChjb25kaXRpb25hbGx5KQotICAvLyBlbWl0IGFuIHVuc2hpZnQgc2VxdWVuY2UuCi0gIGlmIChfTV9pbl9vdXRwdXRfbW9kZSkgewotICAgIGJvb2wgX19vayA9ICF0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUodGhpcy0+b3ZlcmZsb3codHJhaXRzX3R5cGU6OmVvZigpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190eXBlOjplb2YoKSk7Ci0gICAgaWYgKF9fZG9fdW5zaGlmdCkKLSAgICAgIF9fb2sgPSBfX29rICYmIHRoaXMtPl9NX3Vuc2hpZnQoKTsKLSAgICBpZiAoIV9fb2spIHsKLSAgICAgIF9NX2luX291dHB1dF9tb2RlID0gZmFsc2U7Ci0gICAgICBfTV9pbl9lcnJvcl9tb2RlID0gdHJ1ZTsKLSAgICAgIHRoaXMtPnNldHAoMCwgMCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgLy8gRGlzY2FyZCBwdXRiYWNrIGNoYXJhY3RlcnMsIGlmIGFueS4KLSAgaWYgKF9NX2luX2lucHV0X21vZGUgJiYgX01faW5fcHV0YmFja19tb2RlKQotICAgIF9NX2V4aXRfcHV0YmFja19tb2RlKCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogQ2hhbmdlIHRoZSBmaWxlYnVmJ3MgbG9jYWxlLiAgVGhpcyBtZW1iZXIgZnVuY3Rpb24gaGFzIG5vIGVmZmVjdAotICogdW5sZXNzIGl0IGlzIGNhbGxlZCBiZWZvcmUgYW55IEkvTyBpcyBwZXJmb3JtZWQgb24gdGhlIHN0cmVhbS4KLSAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uIGNvbnN0cnVjdGlvbiBhbmQgb24gYW4gaW1idWUgY2FsbC4gSW4gdGhlCi0gKiBjYXNlIG9mIHRoZSBjb25zdHJ1Y3Rpb24gdGhlIGNvZGVjdnQgZmFjZXQgbWlnaHQgYmUgYSBjdXN0b20gb25lIGlmCi0gKiB0aGUgYmFzaWNfZmlsZWJ1ZiB1c2VyIGhhcyBpbnN0YW5jaWF0ZSBpdCB3aXRoIGEgY3VzdG9tIGNoYXJfdHJhaXRzLgotICogVGhlIHVzZXIgd2lsbCBoYXZlIHRvIGNhbGwgaW1idWUgYmVmb3JlIGFueSBJL08gb3BlcmF0aW9uLgotICovCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotdm9pZCBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46Ol9NX3NldHVwX2NvZGVjdnQoY29uc3QgbG9jYWxlJiBfX2xvYywgYm9vbCBfX29uX2ltYnVlKSB7Ci0gIGlmIChoYXNfZmFjZXQ8X0NvZGVjdnQ+KF9fbG9jKSkgewotICAgIF9NX2NvZGVjdnQgPSAmdXNlX2ZhY2V0PF9Db2RlY3Z0PihfX2xvYykgOwotICAgIGludCBfX2VuY29kaW5nICAgID0gX01fY29kZWN2dC0+ZW5jb2RpbmcoKTsKLQotICAgIF9NX3dpZHRoICAgICAgICAgID0gKG1heCkoX19lbmNvZGluZywgMSk7Ci0gICAgX01fbWF4X3dpZHRoICAgICAgPSBfTV9jb2RlY3Z0LT5tYXhfbGVuZ3RoKCk7Ci0gICAgX01fY29uc3RhbnRfd2lkdGggPSBfX2VuY29kaW5nID4gMDsKLSAgICBfTV9hbHdheXNfbm9jb252ICA9IF9NX2NvZGVjdnQtPmFsd2F5c19ub2NvbnYoKTsKLSAgfQotICBlbHNlIHsKLSAgICBfTV9jb2RlY3Z0ID0gMDsKLSAgICBfTV93aWR0aCA9IF9NX21heF93aWR0aCA9IDE7Ci0gICAgX01fY29uc3RhbnRfd2lkdGggPSBfTV9hbHdheXNfbm9jb252ICA9IGZhbHNlOwotICAgIGlmIChfX29uX2ltYnVlKSB7Ci0gICAgICAvL1RoaXMgY2FsbCB3aWxsIGdlbmVyYXRlIGFuIGV4Y2VwdGlvbiByZXBvcnRpbmcgdGhlIHByb2JsZW0uCi0gICAgICB1c2VfZmFjZXQ8X0NvZGVjdnQ+KF9fbG9jKTsKLSAgICB9Ci0gIH0KLX0KLQotX1NUTFBfRU5EX05BTUVTUEFDRQotCi0jIHVuZGVmIF9fQkZfaW50X3R5cGVfXwotIyB1bmRlZiBfX0JGX3Bvc190eXBlX18KLSMgdW5kZWYgX19CRl9vZmZfdHlwZV9fCi0KLSNlbmRpZiAvKiBfU1RMUF9GU1RSRUFNX0MgKi8KLQotLy8gTG9jYWwgVmFyaWFibGVzOgotLy8gbW9kZTpDKysKLS8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9fZnN0cmVhbS5oIGIvc3RsL19mc3RyZWFtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzYjY0M2MuLjAwMDAwMDAKLS0tIGEvc3RsL19mc3RyZWFtLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLS8vIFRoaXMgaGVhZGVyIGRlZmluZXMgY2xhc3NlcyBiYXNpY19maWxlYnVmLCBiYXNpY19pZnN0cmVhbSwKLS8vIGJhc2ljX29mc3RyZWFtLCBhbmQgYmFzaWNfZnN0cmVhbS4gIFRoZXNlIGNsYXNzZXMgcmVwcmVzZW50Ci0vLyBzdHJlYW1idWZzIGFuZCBzdHJlYW1zIHdob3NlIHNvdXJjZXMgb3IgZGVzdGluYXRpb25zIGFyZSBmaWxlcy4KLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9GU1RSRUFNX0gKLSNkZWZpbmUgX1NUTFBfSU5URVJOQUxfRlNUUkVBTV9ICi0KLSNpZiBkZWZpbmVkKF9fc2dpKSAmJiAhZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX1NUQU5EQVJEX0NfUExVU19QTFVTKQotIyAgZXJyb3IgVGhpcyBoZWFkZXIgZmlsZSByZXF1aXJlcyB0aGUgLUxBTkc6c3RkIG9wdGlvbgotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfU1RSRUFNQlVGCi0jICBpbmNsdWRlIDxzdGwvX3N0cmVhbWJ1Zi5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfSVNUUkVBTQotIyAgaW5jbHVkZSA8c3RsL19pc3RyZWFtLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DT0RFQ1ZUX0gKLSMgIGluY2x1ZGUgPHN0bC9fY29kZWN2dC5oPgotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX1VOSVhfSU8pICYmICFkZWZpbmVkKF9TVExQX1VTRV9XSU4zMl9JTykgJiYgXAotICAgICFkZWZpbmVkIChfU1RMUF9VU0VfVU5JWF9FTVVMQVRJT05fSU8pICYmICFkZWZpbmVkIChfU1RMUF9VU0VfU1RESU9fSU8pCi0KLSMgIGlmIGRlZmluZWQgKF9TVExQX1VOSVgpICB8fCBkZWZpbmVkIChfX0NZR1dJTl9fKSB8fCBkZWZpbmVkIChfX2FtaWdhb3NfXykgfHwgZGVmaW5lZCAoX19FTVhfXykKLS8vIG9wZW4vY2xvc2UvcmVhZC93cml0ZQotIyAgICBkZWZpbmUgX1NUTFBfVVNFX1VOSVhfSU8KLSMgIGVsaWYgZGVmaW5lZCAoX1NUTFBfV0lOMzIpCi0vLyBDcmVhdGVGaWxlL1JlYWRGaWxlL1dyaXRlRmlsZQotIyAgICBkZWZpbmUgX1NUTFBfVVNFX1dJTjMyX0lPCi0jICBlbGlmIGRlZmluZWQgKF9TVExQX1dJTjE2KSB8fCBkZWZpbmVkIChfU1RMUF9NQUMpCi0vLyBfb3Blbi9fcmVhZC9fd3JpdGUKLSMgICAgZGVmaW5lIF9TVExQX1VTRV9VTklYX0VNVUxBVElPTl9JTwotIyAgZWxzZQotLy8gZm9wZW4vZnJlYWQvZndyaXRlCi0jICAgIGRlZmluZSBfU1RMUF9VU0VfU1RESU9fSU8KLSMgIGVuZGlmIC8qIF9TVExQX1VOSVggKi8KLSNlbmRpZiAvKiBtb2RlIHNlbGVjdGlvbiAqLwotCi0jaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1dJTjMyX0lPKQotdHlwZWRlZiB2b2lkKiBfU1RMUF9mZDsKLSNlbGlmIGRlZmluZWQgKF9TVExQX1VTRV9VTklYX0VNVUxBVElPTl9JTykgfHwgZGVmaW5lZCAoX1NUTFBfVVNFX1NURElPX0lPKSB8fCBkZWZpbmVkIChfU1RMUF9VU0VfVU5JWF9JTykKLXR5cGVkZWYgaW50IF9TVExQX2ZkOwotI2Vsc2UKLSMgIGVycm9yICJDb25maWd1cmUgaS9vICEiCi0jZW5kaWYKLQotX1NUTFBfQkVHSU5fTkFNRVNQQUNFCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ2xhc3MgX0ZpbGVidWZfYmFzZSwgYSBwcml2YXRlIGJhc2UgY2xhc3MgdG8gZmFjdG9yIG91dCB0aGUgc3lzdGVtLQotLy8gZGVwZW5kZW50IGNvZGUgZnJvbSBiYXNpY19maWxlYnVmPD4uCi0KLWNsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIF9GaWxlYnVmX2Jhc2UgewotcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAvLyBPcGVuaW5nIGFuZCBjbG9zaW5nIGZpbGVzLgotICBfRmlsZWJ1Zl9iYXNlKCk7Ci0KLSAgYm9vbCBfTV9vcGVuKGNvbnN0IGNoYXIqLCBpb3NfYmFzZTo6b3Blbm1vZGUsIGxvbmcgX19wcm90ZWN0aW9uKTsKLSAgYm9vbCBfTV9vcGVuKGNvbnN0IGNoYXIqLCBpb3NfYmFzZTo6b3Blbm1vZGUpOwotICBib29sIF9NX29wZW4oaW50IF9faWQsIGlvc19iYXNlOjpvcGVubW9kZSA9IGlvc19iYXNlOjpfX2RlZmF1bHRfbW9kZSk7Ci0jaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1dJTjMyX0lPKQotICBib29sIF9NX29wZW4oX1NUTFBfZmQgX19pZCwgaW9zX2Jhc2U6Om9wZW5tb2RlID0gaW9zX2Jhc2U6Ol9fZGVmYXVsdF9tb2RlKTsKLSNlbmRpZiAvKiBfU1RMUF9VU0VfV0lOMzJfSU8gKi8KLSAgYm9vbCBfTV9jbG9zZSgpOwotCi1wdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgIC8vIExvdy1sZXZlbCBJL08sIGxpa2UgVW5peCByZWFkL3dyaXRlCi0gIHB0cmRpZmZfdCBfTV9yZWFkKGNoYXIqIF9fYnVmLCAgcHRyZGlmZl90IF9fbik7Ci0gIHN0cmVhbW9mZiBfTV9zZWVrKHN0cmVhbW9mZiBfX29mZnNldCwgaW9zX2Jhc2U6OnNlZWtkaXIgX19kaXIpOwotICBzdHJlYW1vZmYgX01fZmlsZV9zaXplKCk7Ci0gIGJvb2wgX01fd3JpdGUoY2hhciogX19idWYsICBwdHJkaWZmX3QgX19uKTsKLQotcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAvLyBNZW1vcnktbWFwcGVkIEkvTy4KLSAgdm9pZCogX01fbW1hcChzdHJlYW1vZmYgX19vZmZzZXQsIHN0cmVhbW9mZiBfX2xlbik7Ci0gIHZvaWQgX01fdW5tYXAodm9pZCogX19tbWFwX2Jhc2UsIHN0cmVhbW9mZiBfX2xlbik7Ci0KLXB1YmxpYzoKLSAgLy8gUmV0dXJucyBhIHZhbHVlIG4gc3VjaCB0aGF0LCBpZiBwb3MgaXMgdGhlIGZpbGUgcG9pbnRlciBhdCB0aGUKLSAgLy8gYmVnaW5uaW5nIG9mIHRoZSByYW5nZSBbZmlyc3QsIGxhc3QpLCBwb3MgKyBuIGlzIHRoZSBmaWxlIHBvaW50ZXIgYXQKLSAgLy8gdGhlIGVuZC4gIE9uIG1hbnkgb3BlcmF0aW5nIHN5c3RlbXMgbiA9PSBfX2xhc3QgLSBfX2ZpcnN0LgotICAvLyBJbiBVbml4LCB3cml0aW5nIG4gY2hhcmFjdGVycyBhbHdheXMgYnVtcHMgdGhlIGZpbGUgcG9zaXRpb24gYnkgbi4KLSAgLy8gSW4gV2luZG93cyB0ZXh0IG1vZGUsIGhvd2V2ZXIsIGl0IGJ1bXBzIHRoZSBmaWxlIHBvc2l0aW9uIGJ5IG4gKyBtLAotICAvLyB3aGVyZSBtIGlzIHRoZSBudW1iZXIgb2YgbmV3bGluZXMgaW4gdGhlIHJhbmdlLiAgVGhhdCdzIGJlY2F1c2UgYW4KLSAgLy8gaW50ZXJuYWwgXG4gY29ycmVzcG9uZHMgdG8gYW4gZXh0ZXJuYWwgdHdvLWNoYXJhY3RlciBzZXF1ZW5jZS4KLSAgc3RyZWFtb2ZmIF9NX2dldF9vZmZzZXQoY2hhciogX19maXJzdCwgY2hhciogX19sYXN0KSB7Ci0jaWYgZGVmaW5lZCAoX1NUTFBfVU5JWCkgfHwgZGVmaW5lZCAoX1NUTFBfTUFDKQotICAgIHJldHVybiBfX2xhc3QgLSBfX2ZpcnN0OwotI2Vsc2UgLy8gZGVmaW5lZCAoX1NUTFBfV0lOMzIpIHx8IGRlZmluZWQgKF9TVExQX1dJTjE2KSB8fCBkZWZpbmVkIChfU1RMUF9ET1MpIHx8IGRlZmluZWQoTl9QTEFUX05MTSkKLSAgICByZXR1cm4gKCAoX01fb3Blbm1vZGUgJiBpb3NfYmFzZTo6YmluYXJ5KSAhPSAwICkKLSAgICAgID8gKF9fbGFzdCAtIF9fZmlyc3QpCi0gICAgICA6IGNvdW50KF9fZmlyc3QsIF9fbGFzdCwgJ1xuJykgKyAoX19sYXN0IC0gX19maXJzdCk7Ci0jZW5kaWYKLSAgfQotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiB3ZSdyZSBpbiBiaW5hcnkgbW9kZSBvciBpZiB3ZSdyZSB1c2luZyBhbiBPUyBvciBmaWxlCi0gIC8vIHN5c3RlbSB3aGVyZSB0aGVyZSBpcyBubyBkaXN0aW5jdGlvbiBiZXR3ZWVuIHRleHQgYW5kIGJpbmFyeSBtb2RlLgotICBib29sIF9NX2luX2JpbmFyeV9tb2RlKCkgY29uc3QgewotI2lmIGRlZmluZWQgKF9TVExQX1VOSVgpIHx8IGRlZmluZWQgKF9TVExQX01BQykgIHx8IGRlZmluZWQoX19CRU9TX18pIHx8IGRlZmluZWQgKF9fYW1pZ2Fvc19fKQotICAgIHJldHVybiB0cnVlOwotI2VsaWYgZGVmaW5lZCAoX1NUTFBfV0lOMzIpIHx8IGRlZmluZWQgKF9TVExQX1dJTjE2KSB8fCBkZWZpbmVkIChfU1RMUF9ET1MpIHx8IGRlZmluZWQgKF9TVExQX1ZNKSB8fCBkZWZpbmVkIChfX0VNWF9fKSB8fCBkZWZpbmVkKE5fUExBVF9OTE0pCi0gICAgcmV0dXJuIChfTV9vcGVubW9kZSAmIGlvc19iYXNlOjpiaW5hcnkpICE9IDA7Ci0jZWxzZQotIyAgZXJyb3IgIlBvcnQhIgotI2VuZGlmCi0gIH0KLQotICBzdGF0aWMgdm9pZCBfU19pbml0aWFsaXplKCk7Ci0KLXByb3RlY3RlZDogICAgICAgICAgICAgICAgICAgICAgLy8gU3RhdGljIGRhdGEgbWVtYmVycy4KLSAgc3RhdGljIHNpemVfdCBfTV9wYWdlX3NpemU7Ci0KLXByb3RlY3RlZDogICAgICAgICAgICAgICAgICAgICAgLy8gRGF0YSBtZW1iZXJzLgotICBfU1RMUF9mZCBfTV9maWxlX2lkOwotI2lmIGRlZmluZWQgKF9TVExQX1VTRV9TVERJT19JTykKLSAgLy8gZm9yIHN0ZGlvLCB0aGUgd2hvbGUgRklMRSogaXMgYmVpbmcga2VwdCBoZXJlCi0gIEZJTEUqIF9NX2ZpbGU7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfV0lOMzJfSU8pCi0gIF9TVExQX2ZkIF9NX3ZpZXdfaWQ7Ci0jZW5kaWYKLQotICBpb3NfYmFzZTo6b3Blbm1vZGUgX01fb3Blbm1vZGUgICAgIDsKLSAgdW5zaWduZWQgY2hhciAgICAgIF9NX2lzX29wZW4gICAgICA7Ci0gIHVuc2lnbmVkIGNoYXIgICAgICBfTV9zaG91bGRfY2xvc2UgOwotICB1bnNpZ25lZCBjaGFyICAgICAgX01fcmVndWxhcl9maWxlIDsKLQotcHVibGljIDoKLSAgc3RhdGljIHNpemVfdCAgX1NUTFBfQ0FMTCBfX3BhZ2Vfc2l6ZSgpIHsgcmV0dXJuIF9NX3BhZ2Vfc2l6ZTsgfQotICBpbnQgIF9fb19tb2RlKCkgY29uc3QgeyByZXR1cm4gKGludClfTV9vcGVubW9kZTsgfQotICBib29sIF9faXNfb3BlbigpICAgICAgY29uc3QgeyByZXR1cm4gKF9NX2lzX29wZW4gIT0wICk7IH0KLSAgYm9vbCBfX3Nob3VsZF9jbG9zZSgpIGNvbnN0IHsgcmV0dXJuIChfTV9zaG91bGRfY2xvc2UgIT0gMCk7IH0KLSAgYm9vbCBfX3JlZ3VsYXJfZmlsZSgpIGNvbnN0IHsgcmV0dXJuIChfTV9yZWd1bGFyX2ZpbGUgIT0gMCk7IH0KLSAgX1NUTFBfZmQgX19nZXRfZmQoKSBjb25zdCB7IHJldHVybiBfTV9maWxlX2lkOyB9Ci19OwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENsYXNzIGJhc2ljX2ZpbGVidWY8Pi4KLQotLy8gRm9yd2FyZCBkZWNsYXJhdGlvbiBvZiB0d28gaGVscGVyIGNsYXNzZXMuCi10ZW1wbGF0ZSA8Y2xhc3MgX1RyYWl0cz4gY2xhc3MgX05vY29udl9pbnB1dDsKLV9TVExQX1RFTVBMQVRFX05VTEwKLWNsYXNzIF9Ob2NvbnZfaW5wdXQ8Y2hhcl90cmFpdHM8Y2hhcj4gPjsKLQotdGVtcGxhdGUgPGNsYXNzIF9UcmFpdHM+IGNsYXNzIF9Ob2NvbnZfb3V0cHV0OwotX1NUTFBfVEVNUExBVEVfTlVMTAotY2xhc3MgX05vY29udl9vdXRwdXQ8IGNoYXJfdHJhaXRzPGNoYXI+ID47Ci0KLS8vIFRoZXJlIGlzIGEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiB1bmRlcmZsb3csIGZvciBiYXNpY19maWxlYnVmPGNoYXI+LAotLy8gaW4gZnN0cmVhbS5jeHguCi0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Ci1jbGFzcyBfVW5kZXJmbG93OwotCi1fU1RMUF9URU1QTEFURV9OVUxMIGNsYXNzIF9VbmRlcmZsb3c8IGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID47Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Ci1jbGFzcyBiYXNpY19maWxlYnVmIDogcHVibGljIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+IHsKLXB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHlwZXMuCi0gIHR5cGVkZWYgX0NoYXJUICAgICAgICAgICAgICAgICAgICAgY2hhcl90eXBlOwotICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmludF90eXBlIGludF90eXBlOwotICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OnBvc190eXBlIHBvc190eXBlOwotICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6Om9mZl90eXBlIG9mZl90eXBlOwotICB0eXBlZGVmIF9UcmFpdHMgICAgICAgICAgICAgICAgICAgIHRyYWl0c190eXBlOwotCi0gIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6c3RhdGVfdHlwZSBfU3RhdGVfdHlwZTsKLSAgdHlwZWRlZiBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiBfQmFzZTsKLSAgdHlwZWRlZiBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz4gX1NlbGY7Ci0KLXB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29uc3RydWN0b3JzLCBkZXN0cnVjdG9yLgotICBiYXNpY19maWxlYnVmKCk7Ci0gIH5iYXNpY19maWxlYnVmKCk7Ci0KLXB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3BlbmluZyBhbmQgY2xvc2luZyBmaWxlcy4KLSAgYm9vbCBpc19vcGVuKCkgY29uc3QgeyByZXR1cm4gX01fYmFzZS5fX2lzX29wZW4oKTsgfQotCi0gIF9TZWxmKiBvcGVuKGNvbnN0IGNoYXIqIF9fcywgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbSkgewotICAgIHJldHVybiBfTV9iYXNlLl9NX29wZW4oX19zLCBfX20pID8gdGhpcyA6IDA7Ci0gIH0KLQotI2lmICFkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQotICAvLyBUaGVzZSB0d28gdmVyc2lvbiBvZiBvcGVuKCkgYW5kIGZpbGUgZGVzY3JpcHRvciBnZXR0ZXIgYXJlIGV4dGVuc2lvbnMuCi0gIF9TZWxmKiBvcGVuKGNvbnN0IGNoYXIqIF9fcywgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbSwKLSAgICAgICAgICAgICAgbG9uZyBfX3Byb3RlY3Rpb24pIHsKLSAgICByZXR1cm4gX01fYmFzZS5fTV9vcGVuKF9fcywgX19tLCBfX3Byb3RlY3Rpb24pID8gdGhpcyA6IDA7Ci0gIH0KLQotICBfU1RMUF9mZCBmZCgpIGNvbnN0IHsgcmV0dXJuIF9NX2Jhc2UuX19nZXRfZmQoKTsgfQotCi0gIF9TZWxmKiBvcGVuKGludCBfX2lkLCBpb3NfYmFzZTo6b3Blbm1vZGUgX0luaXRfbW9kZSA9IGlvc19iYXNlOjpfX2RlZmF1bHRfbW9kZSkgewotICAgIHJldHVybiB0aGlzLT5fTV9vcGVuKF9faWQsIF9Jbml0X21vZGUpOwotICB9Ci0KLSMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9XSU4zMl9JTykKLSAgX1NlbGYqIG9wZW4oX1NUTFBfZmQgX19pZCwgaW9zX2Jhc2U6Om9wZW5tb2RlIF9Jbml0X21vZGUgPSBpb3NfYmFzZTo6X19kZWZhdWx0X21vZGUpIHsKLSAgICByZXR1cm4gX01fYmFzZS5fTV9vcGVuKF9faWQsIF9Jbml0X21vZGUpID8gdGhpcyA6IDA7Ci0gIH0KLSMgIGVuZGlmIC8qIF9TVExQX1VTRV9XSU4zMl9JTyAqLwotCi0jZW5kaWYKLQotICBfU2VsZiogX01fb3BlbihpbnQgX19pZCwgaW9zX2Jhc2U6Om9wZW5tb2RlIF9Jbml0X21vZGUgPSBpb3NfYmFzZTo6X19kZWZhdWx0X21vZGUpIHsKLSAgICByZXR1cm4gX01fYmFzZS5fTV9vcGVuKF9faWQsIF9Jbml0X21vZGUpID8gdGhpcyA6IDA7Ci0gIH0KLQotICBfU2VsZiogY2xvc2UoKTsKLQotcHJvdGVjdGVkOiAgICAgICAgICAgICAgICAgICAgICAvLyBWaXJ0dWFsIGZ1bmN0aW9ucyBmcm9tIGJhc2ljX3N0cmVhbWJ1Zi4KLSAgdmlydHVhbCBzdHJlYW1zaXplIHNob3dtYW55YygpOwotICB2aXJ0dWFsIGludF90eXBlIHVuZGVyZmxvdygpOwotCi0gIHZpcnR1YWwgaW50X3R5cGUgcGJhY2tmYWlsKGludF90eXBlID0gdHJhaXRzX3R5cGU6OmVvZigpKTsKLSAgdmlydHVhbCBpbnRfdHlwZSBvdmVyZmxvdyhpbnRfdHlwZSA9IHRyYWl0c190eXBlOjplb2YoKSk7Ci0KLSAgdmlydHVhbCBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogc2V0YnVmKGNoYXJfdHlwZSosIHN0cmVhbXNpemUpOwotICB2aXJ0dWFsIHBvc190eXBlIHNlZWtvZmYob2ZmX3R5cGUsIGlvc19iYXNlOjpzZWVrZGlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Om9wZW5tb2RlID0gaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6Om91dCk7Ci0gIHZpcnR1YWwgcG9zX3R5cGUgc2Vla3Bvcyhwb3NfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjpvcGVubW9kZSA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpOwotCi0gIHZpcnR1YWwgaW50IHN5bmMoKTsKLSAgdmlydHVhbCB2b2lkIGltYnVlKGNvbnN0IGxvY2FsZSYpOwotCi1wcml2YXRlOiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhlbHBlciBmdW5jdGlvbnMuCi0KLSAgLy8gUHJlY29uZGl0aW9uOiB3ZSBhcmUgY3VycmVudGx5IGluIHB1dGJhY2sgaW5wdXQgbW9kZS4gIEVmZmVjdDoKLSAgLy8gc3dpdGNoZXMgYmFjayB0byBvcmRpbmFyeSBpbnB1dCBtb2RlLgotICB2b2lkIF9NX2V4aXRfcHV0YmFja19tb2RlKCkgewotICAgIHRoaXMtPnNldGcoX01fc2F2ZWRfZWJhY2ssIF9NX3NhdmVkX2dwdHIsIF9NX3NhdmVkX2VncHRyKTsKLSAgICBfTV9pbl9wdXRiYWNrX21vZGUgPSBmYWxzZTsKLSAgfQotICBib29sIF9NX3N3aXRjaF90b19pbnB1dF9tb2RlKCk7Ci0gIHZvaWQgX01fZXhpdF9pbnB1dF9tb2RlKCk7Ci0gIGJvb2wgX01fc3dpdGNoX3RvX291dHB1dF9tb2RlKCk7Ci0KLSAgaW50X3R5cGUgX01faW5wdXRfZXJyb3IoKTsKLSAgaW50X3R5cGUgX01fdW5kZXJmbG93X2F1eCgpOwotICAvLyAgZnJpZW5kIGNsYXNzIF9Ob2NvbnZfaW5wdXQ8X1RyYWl0cz47Ci0gIC8vICBmcmllbmQgY2xhc3MgX05vY29udl9vdXRwdXQ8X1RyYWl0cz47Ci0gIGZyaWVuZCBjbGFzcyBfVW5kZXJmbG93PF9DaGFyVCwgX1RyYWl0cz47Ci0KLSAgaW50X3R5cGUgX01fb3V0cHV0X2Vycm9yKCk7Ci0gIGJvb2wgX01fdW5zaGlmdCgpOwotCi0gIGJvb2wgX01fYWxsb2NhdGVfYnVmZmVycyhfQ2hhclQqIF9fYnVmLCBzdHJlYW1zaXplIF9fbik7Ci0gIGJvb2wgX01fYWxsb2NhdGVfYnVmZmVycygpOwotICB2b2lkIF9NX2RlYWxsb2NhdGVfYnVmZmVycygpOwotCi0gIHBvc190eXBlIF9NX3NlZWtfcmV0dXJuKG9mZl90eXBlIF9fb2ZmLCBfU3RhdGVfdHlwZSBfX3N0YXRlKSB7Ci0gICAgaWYgKF9fb2ZmICE9IC0xKSB7Ci0gICAgICBpZiAoX01faW5faW5wdXRfbW9kZSkKLSAgICAgICAgX01fZXhpdF9pbnB1dF9tb2RlKCk7Ci0gICAgICBfTV9pbl9pbnB1dF9tb2RlID0gZmFsc2U7Ci0gICAgICBfTV9pbl9vdXRwdXRfbW9kZSA9IGZhbHNlOwotICAgICAgX01faW5fcHV0YmFja19tb2RlID0gZmFsc2U7Ci0gICAgICBfTV9pbl9lcnJvcl9tb2RlID0gZmFsc2U7Ci0gICAgICB0aGlzLT5zZXRnKDAsIDAsIDApOwotICAgICAgdGhpcy0+c2V0cCgwLCAwKTsKLSAgICB9Ci0KLSAgICBwb3NfdHlwZSBfX3Jlc3VsdChfX29mZik7Ci0gICAgX19yZXN1bHQuc3RhdGUoX19zdGF0ZSk7Ci0gICAgcmV0dXJuIF9fcmVzdWx0OwotICB9Ci0KLSAgYm9vbCBfTV9zZWVrX2luaXQoYm9vbCBfX2RvX3Vuc2hpZnQpOwotCi0gIHZvaWQgX01fc2V0dXBfY29kZWN2dChjb25zdCBsb2NhbGUmLCBib29sIF9fb25faW1idWUgPSB0cnVlKTsKLQotcHJpdmF0ZTogICAgICAgICAgICAgICAgICAgICAgICAvLyBEYXRhIG1lbWJlcnMgdXNlZCBpbiBhbGwgbW9kZXMuCi0KLSAgX0ZpbGVidWZfYmFzZSBfTV9iYXNlOwotCi1wcml2YXRlOiAgICAgICAgICAgICAgICAgICAgICAgIC8vIExvY2FsZS1yZWxhdGVkIGluZm9ybWF0aW9uLgotCi0gIHVuc2lnbmVkIGNoYXIgX01fY29uc3RhbnRfd2lkdGg7Ci0gIHVuc2lnbmVkIGNoYXIgX01fYWx3YXlzX25vY29udjsKLQotICAvLyBwcml2YXRlOiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1vZGUgZmxhZ3MuCi0gIHVuc2lnbmVkIGNoYXIgX01faW50X2J1Zl9keW5hbWljOyAgLy8gVHJ1ZSBpZiBpbnRlcm5hbCBidWZmZXIgaXMgaGVhcCBhbGxvY2F0ZWQsCi0gIC8vIGZhbHNlIGlmIGl0IHdhcyBzdXBwbGllZCBieSB0aGUgdXNlci4KLSAgdW5zaWduZWQgY2hhciBfTV9pbl9pbnB1dF9tb2RlOwotICB1bnNpZ25lZCBjaGFyIF9NX2luX291dHB1dF9tb2RlOwotICB1bnNpZ25lZCBjaGFyIF9NX2luX2Vycm9yX21vZGU7Ci0gIHVuc2lnbmVkIGNoYXIgX01faW5fcHV0YmFja19tb2RlOwotCi0gIC8vIEludGVybmFsIGJ1ZmZlcjogY2hhcmFjdGVycyBzZWVuIGJ5IHRoZSBmaWxlYnVmJ3MgY2xpZW50cy4KLSAgX0NoYXJUKiBfTV9pbnRfYnVmOwotICBfQ2hhclQqIF9NX2ludF9idWZfRU9TOwotCi0gIC8vIEV4dGVybmFsIGJ1ZmZlcjogY2hhcmFjdGVycyBjb3JyZXNwb25kaW5nIHRvIHRoZSBleHRlcm5hbCBmaWxlLgotICBjaGFyKiBfTV9leHRfYnVmOwotICBjaGFyKiBfTV9leHRfYnVmX0VPUzsKLQotICAvLyBUaGUgcmFuZ2UgW19NX2V4dF9idWYsIF9NX2V4dF9idWZfY29udmVydGVkKSBjb250YWlucyB0aGUgZXh0ZXJuYWwKLSAgLy8gY2hhcmFjdGVycyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzZXF1ZW5jZSBpbiB0aGUgaW50ZXJuYWwgYnVmZmVyLiAgVGhlCi0gIC8vIHJhbmdlIFtfTV9leHRfYnVmX2NvbnZlcnRlZCwgX01fZXh0X2J1Zl9lbmQpIGNvbnRhaW5zIGNoYXJhY3RlcnMgdGhhdAotICAvLyBoYXZlIGJlZW4gcmVhZCBpbnRvIHRoZSBleHRlcm5hbCBidWZmZXIgYnV0IGhhdmUgbm90IGJlZW4gY29udmVydGVkCi0gIC8vIHRvIGFuIGludGVybmFsIHNlcXVlbmNlLgotICBjaGFyKiBfTV9leHRfYnVmX2NvbnZlcnRlZDsKLSAgY2hhciogX01fZXh0X2J1Zl9lbmQ7Ci0KLSAgLy8gU3RhdGUgY29ycmVzcG9uZGluZyB0byBiZWdpbm5pbmcgb2YgaW50ZXJuYWwgYnVmZmVyLgotICBfU3RhdGVfdHlwZSBfTV9zdGF0ZTsKLQotcHJpdmF0ZTogICAgICAgICAgICAgICAgICAgICAgICAvLyBEYXRhIG1lbWJlcnMgdXNlZCBvbmx5IGluIGlucHV0IG1vZGUuCi0KLSAgLy8gU2ltaWxhciB0byBfTV9zdGF0ZSBleGNlcHQgdGhhdCBpdCBjb3JyZXNwb25kcyB0bwotICAvLyB0aGUgZW5kIG9mIHRoZSBpbnRlcm5hbCBidWZmZXIgaW5zdGVhZCBvZiB0aGUgYmVnaW5uaW5nLgotICBfU3RhdGVfdHlwZSBfTV9lbmRfc3RhdGU7Ci0KLSAgLy8gVGhpcyBpcyBhIG51bGwgcG9pbnRlciB1bmxlc3Mgd2UgYXJlIGluIG1tYXAgaW5wdXQgbW9kZS4KLSAgdm9pZCogICAgIF9NX21tYXBfYmFzZTsKLSAgc3RyZWFtb2ZmIF9NX21tYXBfbGVuOwotCi1wcml2YXRlOiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERhdGEgbWVtYmVycyB1c2VkIG9ubHkgaW4gcHV0YmFjayBtb2RlLgotICBfQ2hhclQqIF9NX3NhdmVkX2ViYWNrOwotICBfQ2hhclQqIF9NX3NhdmVkX2dwdHI7Ci0gIF9DaGFyVCogX01fc2F2ZWRfZWdwdHI7Ci0KLSAgdHlwZWRlZiBjb2RlY3Z0PF9DaGFyVCwgY2hhciwgX1N0YXRlX3R5cGU+IF9Db2RlY3Z0OwotICBjb25zdCBfQ29kZWN2dCogX01fY29kZWN2dDsKLQotICBpbnQgX01fd2lkdGg7ICAgICAgICAgICAgICAgICAvLyBXaWR0aCBvZiB0aGUgZW5jb2RpbmcgKGlmIGNvbnN0YW50KSwgZWxzZSAxCi0gIGludCBfTV9tYXhfd2lkdGg7ICAgICAgICAgICAgIC8vIExhcmdlc3QgcG9zc2libGUgd2lkdGggb2Ygc2luZ2xlIGNoYXJhY3Rlci4KLQotCi0gIGVudW0geyBfU19wYmFja19idWZfc2l6ZSA9IDggfTsKLSAgX0NoYXJUIF9NX3BiYWNrX2J1ZltfU19wYmFja19idWZfc2l6ZV07Ci0KLSAgLy8gZm9yIF9Ob2NvbnZfb3V0cHV0Ci1wdWJsaWM6Ci0gIGJvb2wgX01fd3JpdGUoY2hhciogX19idWYsICBwdHJkaWZmX3QgX19uKSB7cmV0dXJuIF9NX2Jhc2UuX01fd3JpdGUoX19idWYsIF9fbik7IH0KLQotcHVibGljOgotICBpbnRfdHlwZQotICBfTV9kb19ub2NvbnZfaW5wdXQoKSB7Ci0gICAgX01fZXh0X2J1Zl9jb252ZXJ0ZWQgPSBfTV9leHRfYnVmX2VuZDsKLSAgICAvKiB0aGlzLT4gKi8gX0Jhc2U6OnNldGcoKGNoYXJfdHlwZSopX01fZXh0X2J1ZiwgKGNoYXJfdHlwZSopX01fZXh0X2J1ZiwgKGNoYXJfdHlwZSopX01fZXh0X2J1Zl9lbmQpOwotICAgIHJldHVybiB0cmFpdHNfdHlwZTo6dG9faW50X3R5cGUoKl9NX2V4dF9idWYpOwotICB9Ci19OwotCi0jaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCkKLV9TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBiYXNpY19maWxlYnVmPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID47Ci0jICBpZiAhIGRlZmluZWQgKF9TVExQX05PX1dDSEFSX1QpCi1fU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgYmFzaWNfZmlsZWJ1Zjx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+OwotIyAgZW5kaWYKLSNlbmRpZiAvKiBfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUICovCi0KLS8vIHB1YmxpYzoKLS8vIGhlbHBlciBjbGFzcy4KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+Ci1zdHJ1Y3QgX0ZpbGVidWZfVG1wX0J1ZiB7Ci0gIF9DaGFyVCogX01fcHRyOwotICBfRmlsZWJ1Zl9UbXBfQnVmKHB0cmRpZmZfdCBfX24pIDogX01fcHRyKDApIHsgX01fcHRyID0gbmV3IF9DaGFyVFtfX25dOyB9Ci0gIH5fRmlsZWJ1Zl9UbXBfQnVmKCkgeyBkZWxldGVbXSBfTV9wdHI7IH0KLX07Ci0KLQotLy8KLS8vIFRoaXMgY2xhc3MgaGFkIHRvIGJlIGRlc2lnbmVkIHZlcnkgY2FyZWZ1bGx5IHRvIHdvcmsKLS8vIHdpdGggVmlzdWFsIEMrKy4KLS8vCi10ZW1wbGF0ZSA8Y2xhc3MgX1RyYWl0cz4KLWNsYXNzIF9Ob2NvbnZfb3V0cHV0IHsKLXB1YmxpYzoKLSAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpjaGFyX3R5cGUgY2hhcl90eXBlOwotICBzdGF0aWMgYm9vbCAgX1NUTFBfQ0FMTCBfTV9kb2l0KGJhc2ljX2ZpbGVidWY8Y2hhcl90eXBlLCBfVHJhaXRzID4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZSosIGNoYXJfdHlwZSopCi0gIHsgcmV0dXJuIGZhbHNlOyB9Ci19OwotCi1fU1RMUF9URU1QTEFURV9OVUxMCi1jbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBfTm9jb252X291dHB1dDwgY2hhcl90cmFpdHM8Y2hhcj4gPiB7Ci1wdWJsaWM6Ci0gIHN0YXRpYyBib29sICBfU1RMUF9DQUxMCi0gIF9NX2RvaXQoYmFzaWNfZmlsZWJ1ZjxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+KiBfX2J1ZiwKLSAgICAgICAgICBjaGFyKiBfX2ZpcnN0LCBjaGFyKiBfX2xhc3QpIHsKLSAgICBwdHJkaWZmX3QgX19uID0gX19sYXN0IC0gX19maXJzdDsKLSAgICByZXR1cm4gKF9fYnVmLT5fTV93cml0ZShfX2ZpcnN0LCBfX24pKTsKLSAgfQotfTsKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBiYXNpY19maWxlYnVmPD4gaGVscGVyIGZ1bmN0aW9ucy4KLQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIHN3aXRjaGluZyBiZXR3ZWVuIG1vZGVzLgotCi0vLwotLy8gVGhpcyBjbGFzcyBoYWQgdG8gYmUgZGVzaWduZWQgdmVyeSBjYXJlZnVsbHkgdG8gd29yawotLy8gd2l0aCBWaXN1YWwgQysrLgotLy8KLXRlbXBsYXRlIDxjbGFzcyBfVHJhaXRzPgotY2xhc3MgX05vY29udl9pbnB1dCB7Ci1wdWJsaWM6Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6aW50X3R5cGUgaW50X3R5cGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6Y2hhcl90eXBlIGNoYXJfdHlwZTsKLQotICBzdGF0aWMgaW5saW5lIGludF90eXBlIF9TVExQX0NBTEwKLSAgX01fZG9pdChiYXNpY19maWxlYnVmPGNoYXJfdHlwZSwgX1RyYWl0cz4qKQotICB7IHJldHVybiBfVHJhaXRzOjplb2YoKTsgfQotfTsKLQotX1NUTFBfVEVNUExBVEVfTlVMTAotY2xhc3MgX05vY29udl9pbnB1dDxjaGFyX3RyYWl0czxjaGFyPiA+IHsKLXB1YmxpYzoKLSAgc3RhdGljIGlubGluZSBpbnQgX1NUTFBfQ0FMTAotICBfTV9kb2l0KGJhc2ljX2ZpbGVidWY8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiogX19idWYpIHsKLSAgICByZXR1cm4gX19idWYtPl9NX2RvX25vY29udl9pbnB1dCgpOwotICB9Ci19OwotCi0vLyB1bmRlcmZsb3coKSBtYXkgYmUgY2FsbGVkIGZvciBvbmUgb2YgdHdvIHJlYXNvbnMuICAoMSkgV2UndmUKLS8vIGJlZW4gZ29pbmcgdGhyb3VnaCB0aGUgc3BlY2lhbCBwdXRiYWNrIGJ1ZmZlciwgYW5kIHdlIG5lZWQgdG8gbW92ZSBiYWNrCi0vLyB0byB0aGUgcmVndWxhciBpbnRlcm5hbCBidWZmZXIuICAoMikgV2UndmUgZXhoYXVzdGVkIHRoZSBpbnRlcm5hbCBidWZmZXIsCi0vLyBhbmQgd2UgbmVlZCB0byByZXBsZW50aXNoIGl0LgotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KLWNsYXNzIF9VbmRlcmZsb3cgewotcHVibGljOgotICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmludF90eXBlIGludF90eXBlOwotICB0eXBlZGVmIF9UcmFpdHMgICAgICAgICAgICAgICAgICAgIHRyYWl0c190eXBlOwotCi0gIHN0YXRpYyBpbnRfdHlwZSBfU1RMUF9DQUxMIF9NX2RvaXQoYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX3RoaXMpOwotfTsKLQotCi0vLyBTcGVjaWFsaXphdGlvbiBvZiB1bmRlcmZsb3c6IGlmIHRoZSBjaGFyYWN0ZXIgdHlwZSBpcyBjaGFyLCBtYXliZQotLy8gd2UgY2FuIHVzZSBtbWFwIGluc3RlYWQgb2YgcmVhZC4KLV9TVExQX1RFTVBMQVRFX05VTEwKLWNsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIF9VbmRlcmZsb3c8IGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4gewotcHVibGljOgotICB0eXBlZGVmIGNoYXJfdHJhaXRzPGNoYXI+OjppbnRfdHlwZSBpbnRfdHlwZTsKLSAgdHlwZWRlZiBjaGFyX3RyYWl0czxjaGFyPiB0cmFpdHNfdHlwZTsKLSAgc3RhdGljICBpbnQgX1NUTFBfQ0FMTCBfTV9kb2l0KGJhc2ljX2ZpbGVidWY8Y2hhciwgdHJhaXRzX3R5cGUgPiogX190aGlzKTsKLX07Ci0KLS8vIFRoZXJlIGlzIGEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiB1bmRlcmZsb3csIGZvciBiYXNpY19maWxlYnVmPGNoYXI+LAotLy8gaW4gZnN0cmVhbS5jeHguCi0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Ci1fU1RMUF9UWVBFTkFNRV9PTl9SRVRVUk5fVFlQRSBfVW5kZXJmbG93PF9DaGFyVCwgX1RyYWl0cz46OmludF90eXBlIC8vIF9TVExQX0NBTEwKLSBfVW5kZXJmbG93PF9DaGFyVCwgX1RyYWl0cz46Ol9NX2RvaXQoYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX3RoaXMpIHsKLSAgaWYgKCFfX3RoaXMtPl9NX2luX2lucHV0X21vZGUpIHsKLSAgICBpZiAoIV9fdGhpcy0+X01fc3dpdGNoX3RvX2lucHV0X21vZGUoKSkKLSAgICAgIHJldHVybiB0cmFpdHNfdHlwZTo6ZW9mKCk7Ci0gIH0KLSAgZWxzZSBpZiAoX190aGlzLT5fTV9pbl9wdXRiYWNrX21vZGUpIHsKLSAgICBfX3RoaXMtPl9NX2V4aXRfcHV0YmFja19tb2RlKCk7Ci0gICAgaWYgKF9fdGhpcy0+Z3B0cigpICE9IF9fdGhpcy0+ZWdwdHIoKSkgewotICAgICAgaW50X3R5cGUgX19jID0gdHJhaXRzX3R5cGU6OnRvX2ludF90eXBlKCpfX3RoaXMtPmdwdHIoKSk7Ci0gICAgICByZXR1cm4gX19jOwotICAgIH0KLSAgfQotCi0gIHJldHVybiBfX3RoaXMtPl9NX3VuZGVyZmxvd19hdXgoKTsKLX0KLQotI2lmIGRlZmluZWQgKF9TVExQX1VTRV9URU1QTEFURV9FWFBPUlQpICYmICFkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQotX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIF9VbmRlcmZsb3c8d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPjsKLSNlbmRpZgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENsYXNzIGJhc2ljX2lmc3RyZWFtPD4KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KLWNsYXNzIGJhc2ljX2lmc3RyZWFtIDogcHVibGljIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiB7Ci1wdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR5cGVzCi0gIHR5cGVkZWYgX0NoYXJUICAgICAgICAgICAgICAgICAgICAgY2hhcl90eXBlOwotICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmludF90eXBlIGludF90eXBlOwotICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OnBvc190eXBlIHBvc190eXBlOwotICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6Om9mZl90eXBlIG9mZl90eXBlOwotICB0eXBlZGVmIF9UcmFpdHMgICAgICAgICAgICAgICAgICAgIHRyYWl0c190eXBlOwotCi0gIHR5cGVkZWYgYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz4gICAgICAgICAgICAgICAgX0Jhc2ljX2lvczsKLSAgdHlwZWRlZiBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gICAgICAgICAgICBfQmFzZTsKLSAgdHlwZWRlZiBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz4gICAgICAgICAgICBfQnVmOwotCi1wdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnN0cnVjdG9ycywgZGVzdHJ1Y3Rvci4KLQotICBiYXNpY19pZnN0cmVhbSgpIDoKLSAgICBiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPigpLCAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+KDApLCBfTV9idWYoKSB7Ci0gICAgICB0aGlzLT5pbml0KCZfTV9idWYpOwotICB9Ci0KLSAgZXhwbGljaXQgYmFzaWNfaWZzdHJlYW0oY29uc3QgY2hhciogX19zLCBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2QgPSBpb3NfYmFzZTo6aW4pIDoKLSAgICBiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPigpLCAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+KDApLAotICAgIF9NX2J1ZigpIHsKLSAgICAgIHRoaXMtPmluaXQoJl9NX2J1Zik7Ci0gICAgICBpZiAoIV9NX2J1Zi5vcGVuKF9fcywgX19tb2QgfCBpb3NfYmFzZTo6aW4pKQotICAgICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7Ci0gIH0KLQotI2lmICFkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQotICBleHBsaWNpdCBiYXNpY19pZnN0cmVhbShpbnQgX19pZCwgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kID0gaW9zX2Jhc2U6OmluKSA6Ci0gICAgYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz4oKSwgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPigwKSwgX01fYnVmKCkgewotICAgIHRoaXMtPmluaXQoJl9NX2J1Zik7Ci0gICAgaWYgKCFfTV9idWYub3BlbihfX2lkLCBfX21vZCB8IGlvc19iYXNlOjppbikpCi0gICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7Ci0gIH0KLSAgYmFzaWNfaWZzdHJlYW0oY29uc3QgY2hhciogX19zLCBpb3NfYmFzZTo6b3Blbm1vZGUgX19tLAotICAgICBsb25nIF9fcHJvdGVjdGlvbikgOgotICAgIGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+KCksICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4oMCksIF9NX2J1ZigpIHsKLSAgICB0aGlzLT5pbml0KCZfTV9idWYpOwotICAgIGlmICghX01fYnVmLm9wZW4oX19zLCBfX20gfCBpb3NfYmFzZTo6aW4sIF9fcHJvdGVjdGlvbikpCi0gICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7Ci0gIH0KLQotIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1dJTjMyX0lPKQotICBleHBsaWNpdCBiYXNpY19pZnN0cmVhbShfU1RMUF9mZCBfX2lkLCBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2QgPSBpb3NfYmFzZTo6aW4pIDoKLSAgICBiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPigpLCAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+KDApLCBfTV9idWYoKSB7Ci0gICAgdGhpcy0+aW5pdCgmX01fYnVmKTsKLSAgICBpZiAoIV9NX2J1Zi5vcGVuKF9faWQsIF9fbW9kIHwgaW9zX2Jhc2U6OmluKSkKLSAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKLSAgfQotIyAgZW5kaWYgLyogX1NUTFBfVVNFX1dJTjMyX0lPICovCi0jZW5kaWYKLQotICB+YmFzaWNfaWZzdHJlYW0oKSB7fQotCi1wdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpbGUgYW5kIGJ1ZmZlciBvcGVyYXRpb25zLgotICBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz4qIHJkYnVmKCkgY29uc3QKLSAgICB7IHJldHVybiBfX0NPTlNUX0NBU1QoX0J1ZiosJl9NX2J1Zik7IH0KLQotICBib29sIGlzX29wZW4oKSB7Ci0gICAgcmV0dXJuIHRoaXMtPnJkYnVmKCktPmlzX29wZW4oKTsKLSAgfQotCi0gIHZvaWQgb3Blbihjb25zdCBjaGFyKiBfX3MsIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZCA9IGlvc19iYXNlOjppbikgewotICAgIGlmICghdGhpcy0+cmRidWYoKS0+b3BlbihfX3MsIF9fbW9kIHwgaW9zX2Jhc2U6OmluKSkKLSAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKLSAgfQotCi0gIHZvaWQgY2xvc2UoKSB7Ci0gICAgaWYgKCF0aGlzLT5yZGJ1ZigpLT5jbG9zZSgpKQotICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOwotICB9Ci0KLXByaXZhdGU6Ci0gIGJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPiBfTV9idWY7Ci19OwotCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ2xhc3MgYmFzaWNfb2ZzdHJlYW08PgotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotY2xhc3MgYmFzaWNfb2ZzdHJlYW0gOiBwdWJsaWMgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+IHsKLXB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHlwZXMKLSAgdHlwZWRlZiBfQ2hhclQgICAgICAgICAgICAgICAgICAgICBjaGFyX3R5cGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6aW50X3R5cGUgaW50X3R5cGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6cG9zX3R5cGUgcG9zX3R5cGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6b2ZmX3R5cGUgb2ZmX3R5cGU7Ci0gIHR5cGVkZWYgX1RyYWl0cyAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3R5cGU7Ci0KLSAgdHlwZWRlZiBiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPiAgICAgICAgICAgICAgICBfQmFzaWNfaW9zOwotICB0eXBlZGVmIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgICAgICAgICAgIF9CYXNlOwotICB0eXBlZGVmIGJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPiAgICAgICAgICAgIF9CdWY7Ci0KLXB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29uc3RydWN0b3JzLCBkZXN0cnVjdG9yLgotICBiYXNpY19vZnN0cmVhbSgpIDoKLSAgICBiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPigpLAotICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPigwKSwgX01fYnVmKCkgewotICAgICAgdGhpcy0+aW5pdCgmX01fYnVmKTsKLSAgfQotICBleHBsaWNpdCBiYXNpY19vZnN0cmVhbShjb25zdCBjaGFyKiBfX3MsIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZCA9IGlvc19iYXNlOjpvdXQpCi0gICAgOiBiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPigpLCBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4oMCksIF9NX2J1ZigpIHsKLSAgICB0aGlzLT5pbml0KCZfTV9idWYpOwotICAgIGlmICghX01fYnVmLm9wZW4oX19zLCBfX21vZCB8IGlvc19iYXNlOjpvdXQpKQotICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOwotICB9Ci0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKLSAgZXhwbGljaXQgYmFzaWNfb2ZzdHJlYW0oaW50IF9faWQsIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZCA9IGlvc19iYXNlOjpvdXQpCi0gICAgOiBiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPigpLCBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4oMCksCi0gICAgX01fYnVmKCkgewotICAgdGhpcy0+aW5pdCgmX01fYnVmKTsKLSAgIGlmICghX01fYnVmLm9wZW4oX19pZCwgX19tb2QgfCBpb3NfYmFzZTo6b3V0KSkKLSAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOwotICB9Ci0gIGJhc2ljX29mc3RyZWFtKGNvbnN0IGNoYXIqIF9fcywgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbSwgbG9uZyBfX3Byb3RlY3Rpb24pIDoKLSAgICBiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPigpLCAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+KDApLCBfTV9idWYoKSB7Ci0gICAgdGhpcy0+aW5pdCgmX01fYnVmKTsKLSAgICBpZiAoIV9NX2J1Zi5vcGVuKF9fcywgX19tIHwgaW9zX2Jhc2U6Om91dCwgX19wcm90ZWN0aW9uKSkKLSAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKLSAgfQotIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1dJTjMyX0lPKQotICBleHBsaWNpdCBiYXNpY19vZnN0cmVhbShfU1RMUF9mZCBfX2lkLCBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2QgPSBpb3NfYmFzZTo6b3V0KQotICAgIDogYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz4oKSwgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+KDApLAotICAgIF9NX2J1ZigpIHsKLSAgIHRoaXMtPmluaXQoJl9NX2J1Zik7Ci0gICBpZiAoIV9NX2J1Zi5vcGVuKF9faWQsIF9fbW9kIHwgaW9zX2Jhc2U6Om91dCkpCi0gICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKLSAgfQotIyAgZW5kaWYgLyogX1NUTFBfVVNFX1dJTjMyX0lPICovCi0jZW5kaWYKLQotICB+YmFzaWNfb2ZzdHJlYW0oKSB7fQotCi1wdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpbGUgYW5kIGJ1ZmZlciBvcGVyYXRpb25zLgotICBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz4qIHJkYnVmKCkgY29uc3QKLSAgICB7IHJldHVybiBfX0NPTlNUX0NBU1QoX0J1ZiosJl9NX2J1Zik7IH0KLQotICBib29sIGlzX29wZW4oKSB7Ci0gICAgcmV0dXJuIHRoaXMtPnJkYnVmKCktPmlzX29wZW4oKTsKLSAgfQotCi0gIHZvaWQgb3Blbihjb25zdCBjaGFyKiBfX3MsIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZD0gaW9zX2Jhc2U6Om91dCkgewotICAgIGlmICghdGhpcy0+cmRidWYoKS0+b3BlbihfX3MsIF9fbW9kIHwgaW9zX2Jhc2U6Om91dCkpCi0gICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7Ci0gIH0KLQotICB2b2lkIGNsb3NlKCkgewotICAgIGlmICghdGhpcy0+cmRidWYoKS0+Y2xvc2UoKSkKLSAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKLSAgfQotCi1wcml2YXRlOgotICBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz4gX01fYnVmOwotfTsKLQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENsYXNzIGJhc2ljX2ZzdHJlYW08PgotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotY2xhc3MgYmFzaWNfZnN0cmVhbSA6IHB1YmxpYyBiYXNpY19pb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+IHsKLXB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHlwZXMKLSAgdHlwZWRlZiBfQ2hhclQgICAgICAgICAgICAgICAgICAgICBjaGFyX3R5cGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6aW50X3R5cGUgaW50X3R5cGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6cG9zX3R5cGUgcG9zX3R5cGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6b2ZmX3R5cGUgb2ZmX3R5cGU7Ci0gIHR5cGVkZWYgX1RyYWl0cyAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3R5cGU7Ci0KLSAgdHlwZWRlZiBiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPiAgICAgICAgICAgICAgICBfQmFzaWNfaW9zOwotICB0eXBlZGVmIGJhc2ljX2lvc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gICAgICAgICAgIF9CYXNlOwotICB0eXBlZGVmIGJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPiAgICAgICAgICAgIF9CdWY7Ci0KLXB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29uc3RydWN0b3JzLCBkZXN0cnVjdG9yLgotCi0gIGJhc2ljX2ZzdHJlYW0oKQotICAgIDogYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz4oKSwgYmFzaWNfaW9zdHJlYW08X0NoYXJULCBfVHJhaXRzPigwKSwgX01fYnVmKCkgewotICAgICAgdGhpcy0+aW5pdCgmX01fYnVmKTsKLSAgfQotCi0gIGV4cGxpY2l0IGJhc2ljX2ZzdHJlYW0oY29uc3QgY2hhciogX19zLAotICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZCA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpIDoKLSAgICBiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPigpLCBiYXNpY19pb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+KDApLCBfTV9idWYoKSB7Ci0gICAgICB0aGlzLT5pbml0KCZfTV9idWYpOwotICAgICAgaWYgKCFfTV9idWYub3BlbihfX3MsIF9fbW9kKSkKLSAgICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOwotICB9Ci0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKLSAgZXhwbGljaXQgYmFzaWNfZnN0cmVhbShpbnQgX19pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2QgPSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0KSA6Ci0gICAgYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz4oKSwgYmFzaWNfaW9zdHJlYW08X0NoYXJULCBfVHJhaXRzPigwKSwgX01fYnVmKCkgewotICAgIHRoaXMtPmluaXQoJl9NX2J1Zik7Ci0gICAgaWYgKCFfTV9idWYub3BlbihfX2lkLCBfX21vZCkpCi0gICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7Ci0gIH0KLSAgYmFzaWNfZnN0cmVhbShjb25zdCBjaGFyKiBfX3MsIGlvc19iYXNlOjpvcGVubW9kZSBfX20sIGxvbmcgX19wcm90ZWN0aW9uKSA6Ci0gICAgYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz4oKSwgIGJhc2ljX2lvc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4oMCksIF9NX2J1ZigpIHsKLSAgICB0aGlzLT5pbml0KCZfTV9idWYpOwotICAgIGlmICghX01fYnVmLm9wZW4oX19zLCBfX20sIF9fcHJvdGVjdGlvbikpCi0gICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7Ci0gIH0KLSMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9XSU4zMl9JTykKLSAgZXhwbGljaXQgYmFzaWNfZnN0cmVhbShfU1RMUF9mZCBfX2lkLAotICAgIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZCA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpIDoKLSAgICBiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPigpLCAgYmFzaWNfaW9zdHJlYW08X0NoYXJULCBfVHJhaXRzPigwKSwgX01fYnVmKCkgewotICAgIHRoaXMtPmluaXQoJl9NX2J1Zik7Ci0gICAgaWYgKCFfTV9idWYub3BlbihfX2lkLCBfX21vZCkpCi0gICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7Ci0gIH0KLSMgIGVuZGlmIC8qIF9TVExQX1VTRV9XSU4zMl9JTyAqLwotI2VuZGlmCi0gIH5iYXNpY19mc3RyZWFtKCkge30KLQotcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGaWxlIGFuZCBidWZmZXIgb3BlcmF0aW9ucy4KLQotICBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz4qIHJkYnVmKCkgY29uc3QKLSAgICB7IHJldHVybiBfX0NPTlNUX0NBU1QoX0J1ZiosJl9NX2J1Zik7IH0KLQotICBib29sIGlzX29wZW4oKSB7Ci0gICAgcmV0dXJuIHRoaXMtPnJkYnVmKCktPmlzX29wZW4oKTsKLSAgfQotCi0gIHZvaWQgb3Blbihjb25zdCBjaGFyKiBfX3MsCi0gICAgICBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2QgPQotICAgICAgaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6Om91dCkgewotICAgIGlmICghdGhpcy0+cmRidWYoKS0+b3BlbihfX3MsIF9fbW9kKSkKLSAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKLSAgfQotCi0gIHZvaWQgY2xvc2UoKSB7Ci0gICAgaWYgKCF0aGlzLT5yZGJ1ZigpLT5jbG9zZSgpKQotICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOwotICB9Ci0KLXByaXZhdGU6Ci0gIGJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPiBfTV9idWY7Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9NU1ZDKSAmJiAoX1NUTFBfTVNWQyA+PSAxMzAwICYmIF9TVExQX01TVkMgPD0gMTMxMCkKLSAgdHlwZWRlZiBiYXNpY19mc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gX1NlbGY7Ci0gIC8vZXhwbGljaXRlbHkgZGVmaW5lZCBhcyBwcml2YXRlIHRvIGF2b2lkIHdhcm5pbmdzOgotICBiYXNpY19mc3RyZWFtKF9TZWxmIGNvbnN0Jik7Ci0gIF9TZWxmJiBvcGVyYXRvciA9IChfU2VsZiBjb25zdCYpOwotI2VuZGlmCi19OwotCi1fU1RMUF9FTkRfTkFNRVNQQUNFCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9FWFBPU0VfU1RSRUFNX0lNUExFTUVOVEFUSU9OKSAmJiAhZGVmaW5lZCAoX1NUTFBfTElOS19USU1FX0lOU1RBTlRJQVRJT04pCi0jICBpbmNsdWRlIDxzdGwvX2ZzdHJlYW0uYz4KLSNlbmRpZgotCi1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLQotI2lmIGRlZmluZWQgKF9TVExQX1VTRV9URU1QTEFURV9FWFBPUlQpCi1fU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgYmFzaWNfaWZzdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPjsKLV9TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBiYXNpY19vZnN0cmVhbTxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+OwotX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIGJhc2ljX2ZzdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPjsKLSMgIGlmICEgZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkKLV9TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBiYXNpY19pZnN0cmVhbTx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+OwotX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIGJhc2ljX29mc3RyZWFtPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID47Ci1fU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgYmFzaWNfZnN0cmVhbTx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+OwotIyAgZW5kaWYKLSNlbmRpZiAvKiBfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUICovCi0KLV9TVExQX0VORF9OQU1FU1BBQ0UKLQotI2VuZGlmIC8qIF9TVExQX0ZTVFJFQU0gKi8KLQotCi0vLyBMb2NhbCBWYXJpYWJsZXM6Ci0vLyBtb2RlOkMrKwotLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RsL19mdW5jdGlvbi5oIGIvc3RsL19mdW5jdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWQ3ODg4Li4wMDAwMDAwCi0tLSBhL3N0bC9fZnVuY3Rpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDQyNyArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NAotICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTYtMTk5OAotICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk3Ci0gKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5Ci0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLQotLyogTk9URTogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgU1RMIGhlYWRlcnMuCi0gKiAgIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LgotICovCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfRlVOQ1RJT05fSAotI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9GVU5DVElPTl9ICi0KLSNpZm5kZWYgX1NUTFBfVFlQRV9UUkFJVFNfSAotIyAgaW5jbHVkZSA8c3RsL3R5cGVfdHJhaXRzLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9GVU5DVElPTl9CQVNFX0gKLSMgIGluY2x1ZGUgPHN0bC9fZnVuY3Rpb25fYmFzZS5oPgotI2VuZGlmCi0KLV9TVExQX0JFR0lOX05BTUVTUEFDRQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotc3RydWN0IG5vdF9lcXVhbF90byA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwLCBfVHAsIGJvb2w+IHsKLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QgeyByZXR1cm4gX194ICE9IF9feTsgfQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLXN0cnVjdCBncmVhdGVyIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAsIF9UcCwgYm9vbD4gewotICBib29sIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdCB7IHJldHVybiBfX3ggPiBfX3k7IH0KLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1zdHJ1Y3QgZ3JlYXRlcl9lcXVhbCA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwLCBfVHAsIGJvb2w+IHsKLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QgeyByZXR1cm4gX194ID49IF9feTsgfQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLXN0cnVjdCBsZXNzX2VxdWFsIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAsIF9UcCwgYm9vbD4gewotICBib29sIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdCB7IHJldHVybiBfX3ggPD0gX195OyB9Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotc3RydWN0IGRpdmlkZXMgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCwgX1RwLCBfVHA+IHsKLSAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdCB7IHJldHVybiBfX3ggLyBfX3k7IH0KLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1zdHJ1Y3QgbW9kdWx1cyA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwLCBfVHAsIF9UcD4gewotICBfVHAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0IHsgcmV0dXJuIF9feCAlIF9feTsgfQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLXN0cnVjdCBuZWdhdGUgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248X1RwLCBfVHA+IHsKLSAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gpIGNvbnN0IHsgcmV0dXJuIC1fX3g7IH0KLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1zdHJ1Y3QgbG9naWNhbF9hbmQgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCwgX1RwLCBib29sPiB7Ci0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0IHsgcmV0dXJuIF9feCAmJiBfX3k7IH0KLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1zdHJ1Y3QgbG9naWNhbF9vciA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwLCBfVHAsYm9vbD4gewotICBib29sIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdCB7IHJldHVybiBfX3ggfHwgX195OyB9Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotc3RydWN0IGxvZ2ljYWxfbm90IDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPF9UcCwgYm9vbD4gewotICBib29sIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gpIGNvbnN0IHsgcmV0dXJuICFfX3g7IH0KLX07Ci0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKLS8vIGlkZW50aXR5X2VsZW1lbnQgKG5vdCBwYXJ0IG9mIHRoZSBDKysgc3RhbmRhcmQpLgotdGVtcGxhdGUgPGNsYXNzIF9UcD4gaW5saW5lIF9UcCBpZGVudGl0eV9lbGVtZW50KHBsdXM8X1RwPikgeyAgcmV0dXJuIF9UcCgwKTsgfQotdGVtcGxhdGUgPGNsYXNzIF9UcD4gaW5saW5lIF9UcCBpZGVudGl0eV9lbGVtZW50KG11bHRpcGxpZXM8X1RwPikgeyByZXR1cm4gX1RwKDEpOyB9Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9TVExQX0JBU0VfVFlQRURFRl9CVUcpCi0vLyB0aGlzIHdvcmthcm91bmQgaXMgbmVlZGVkIGZvciBTdW5Qcm8gNC4wLjEKLS8vIHN1Z2dlc3RlZCBieSAiTWFydGluIEFiZXJuZXRoeSIgPGdtYUBwYXN0b24uY28udWs+OgotCi0vLyBXZSBoYXZlIHRvIGludHJvZHVjZSB0aGUgWFhhcnlfcHJlZGljYXRlX2F1eCBzdHJ1Y3R1cmVzIGluIG9yZGVyIHRvCi0vLyBhY2Nlc3MgdGhlIGFyZ3VtZW50IGFuZCByZXR1cm4gdHlwZXMgb2YgcHJlZGljYXRlIGZ1bmN0aW9ucyBzdXBwbGllZAotLy8gYXMgdHlwZSBwYXJhbWV0ZXJzLiBTVU4gQysrIDQuMC4xIGNvbXBpbGVyIGdpdmVzIGVycm9ycyBmb3IgdGVtcGxhdGUgdHlwZSBwYXJhbWV0ZXJzCi0vLyBvZiB0aGUgZm9ybSAnbmFtZTE6Om5hbWUyJywgd2hlcmUgbmFtZTEgaXMgaXRzZWxmIGEgdHlwZSBwYXJhbWV0ZXIuCi10ZW1wbGF0ZSA8Y2xhc3MgX1BhaXI+Ci1zdHJ1Y3QgX19wYWlyX2F1eCA6IHByaXZhdGUgX1BhaXIgewotICB0eXBlZGVmIHR5cGVuYW1lIF9QYWlyOjpmaXJzdF90eXBlIGZpcnN0X3R5cGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1BhaXI6OnNlY29uZF90eXBlIHNlY29uZF90eXBlOwotfTsKLQotdGVtcGxhdGUgPGNsYXNzIF9PcGVyYXRpb24+Ci1zdHJ1Y3QgX191bmFyeV9mdW5fYXV4IDogcHJpdmF0ZSBfT3BlcmF0aW9uIHsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfT3BlcmF0aW9uOjphcmd1bWVudF90eXBlIGFyZ3VtZW50X3R5cGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX09wZXJhdGlvbjo6cmVzdWx0X3R5cGUgcmVzdWx0X3R5cGU7Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgX09wZXJhdGlvbj4KLXN0cnVjdCBfX2JpbmFyeV9mdW5fYXV4ICA6IHByaXZhdGUgX09wZXJhdGlvbiB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX09wZXJhdGlvbjo6Zmlyc3RfYXJndW1lbnRfdHlwZSBmaXJzdF9hcmd1bWVudF90eXBlOwotICB0eXBlZGVmIHR5cGVuYW1lIF9PcGVyYXRpb246OnNlY29uZF9hcmd1bWVudF90eXBlIHNlY29uZF9hcmd1bWVudF90eXBlOwotICB0eXBlZGVmIHR5cGVuYW1lIF9PcGVyYXRpb246OnJlc3VsdF90eXBlIHJlc3VsdF90eXBlOwotfTsKLQotIyAgZGVmaW5lIF9fVU5BUllfQVJHKF9fT3BlcmF0aW9uLF9fdHlwZSkgIF9fdW5hcnlfZnVuX2F1eDxfX09wZXJhdGlvbj46Ol9fdHlwZQotIyAgZGVmaW5lIF9fQklOQVJZX0FSRyhfX09wZXJhdGlvbixfX3R5cGUpICBfX2JpbmFyeV9mdW5fYXV4PF9fT3BlcmF0aW9uPjo6X190eXBlCi0jICBkZWZpbmUgX19QQUlSX0FSRyhfX1BhaXIsX190eXBlKSAgX19wYWlyX2F1eDxfX1BhaXI+OjpfX3R5cGUKLSNlbHNlCi0jICBkZWZpbmUgX19VTkFSWV9BUkcoX19PcGVyYXRpb24sX190eXBlKSAgX19PcGVyYXRpb246Ol9fdHlwZQotIyAgZGVmaW5lIF9fQklOQVJZX0FSRyhfX09wZXJhdGlvbixfX3R5cGUpIF9fT3BlcmF0aW9uOjpfX3R5cGUKLSMgIGRlZmluZSBfX1BBSVJfQVJHKF9fUGFpcixfX3R5cGUpIF9fUGFpcjo6X190eXBlCi0jZW5kaWYKLQotdGVtcGxhdGUgPGNsYXNzIF9QcmVkaWNhdGU+Ci1jbGFzcyB1bmFyeV9uZWdhdGUKLSAgICA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjx0eXBlbmFtZSBfX1VOQVJZX0FSRyhfUHJlZGljYXRlLCBhcmd1bWVudF90eXBlKSwgYm9vbD4gewotICB0eXBlZGVmIHVuYXJ5X2Z1bmN0aW9uPHR5cGVuYW1lIF9fVU5BUllfQVJHKF9QcmVkaWNhdGUsIGFyZ3VtZW50X3R5cGUpLCBib29sPiBfQmFzZTsKLXB1YmxpYzoKLSAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6YXJndW1lbnRfdHlwZSBhcmd1bWVudF90eXBlOwotcHJpdmF0ZToKLSAgdHlwZWRlZiB0eXBlbmFtZSBfX2NhbGxfdHJhaXRzPGFyZ3VtZW50X3R5cGU+OjpwYXJhbV90eXBlIF9BcmdQYXJhbVR5cGU7Ci1wcm90ZWN0ZWQ6Ci0gIF9QcmVkaWNhdGUgX01fcHJlZDsKLXB1YmxpYzoKLSAgZXhwbGljaXQgdW5hcnlfbmVnYXRlKGNvbnN0IF9QcmVkaWNhdGUmIF9feCkgOiBfTV9wcmVkKF9feCkge30KLSAgYm9vbCBvcGVyYXRvcigpKF9BcmdQYXJhbVR5cGUgX194KSBjb25zdCB7Ci0gICAgcmV0dXJuICFfTV9wcmVkKF9feCk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBfUHJlZGljYXRlPgotaW5saW5lIHVuYXJ5X25lZ2F0ZTxfUHJlZGljYXRlPgotbm90MShjb25zdCBfUHJlZGljYXRlJiBfX3ByZWQpIHsKLSAgcmV0dXJuIHVuYXJ5X25lZ2F0ZTxfUHJlZGljYXRlPihfX3ByZWQpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1ByZWRpY2F0ZT4KLWNsYXNzIGJpbmFyeV9uZWdhdGUKLSAgICA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248dHlwZW5hbWUgX19CSU5BUllfQVJHKF9QcmVkaWNhdGUsIGZpcnN0X2FyZ3VtZW50X3R5cGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfX0JJTkFSWV9BUkcoX1ByZWRpY2F0ZSwgc2Vjb25kX2FyZ3VtZW50X3R5cGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sPiB7Ci0gIHR5cGVkZWYgYmluYXJ5X2Z1bmN0aW9uPHR5cGVuYW1lIF9fQklOQVJZX0FSRyhfUHJlZGljYXRlLCBmaXJzdF9hcmd1bWVudF90eXBlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX19CSU5BUllfQVJHKF9QcmVkaWNhdGUsIHNlY29uZF9hcmd1bWVudF90eXBlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbD4gX0Jhc2U7Ci1wdWJsaWM6Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmZpcnN0X2FyZ3VtZW50X3R5cGUgZmlyc3RfYXJndW1lbnRfdHlwZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6c2Vjb25kX2FyZ3VtZW50X3R5cGUgc2Vjb25kX2FyZ3VtZW50X3R5cGU7Ci1wcml2YXRlOgotICB0eXBlZGVmIHR5cGVuYW1lIF9fY2FsbF90cmFpdHM8Zmlyc3RfYXJndW1lbnRfdHlwZT46OnBhcmFtX3R5cGUgX0ZzdEFyZ1BhcmFtVHlwZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfX2NhbGxfdHJhaXRzPHNlY29uZF9hcmd1bWVudF90eXBlPjo6cGFyYW1fdHlwZSBfU25kQXJnUGFyYW1UeXBlOwotcHJvdGVjdGVkOgotICBfUHJlZGljYXRlIF9NX3ByZWQ7Ci1wdWJsaWM6Ci0gIGV4cGxpY2l0IGJpbmFyeV9uZWdhdGUoY29uc3QgX1ByZWRpY2F0ZSYgX194KSA6IF9NX3ByZWQoX194KSB7fQotICBib29sIG9wZXJhdG9yKCkoX0ZzdEFyZ1BhcmFtVHlwZSBfX3gsIF9TbmRBcmdQYXJhbVR5cGUgX195KSBjb25zdCB7Ci0gICAgcmV0dXJuICFfTV9wcmVkKF9feCwgX195KTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIF9QcmVkaWNhdGU+Ci1pbmxpbmUgYmluYXJ5X25lZ2F0ZTxfUHJlZGljYXRlPgotbm90Mihjb25zdCBfUHJlZGljYXRlJiBfX3ByZWQpIHsKLSAgcmV0dXJuIGJpbmFyeV9uZWdhdGU8X1ByZWRpY2F0ZT4oX19wcmVkKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9PcGVyYXRpb24+Ci1jbGFzcyBiaW5kZXIxc3QgOgotICAgIHB1YmxpYyB1bmFyeV9mdW5jdGlvbjx0eXBlbmFtZSBfX0JJTkFSWV9BUkcoX09wZXJhdGlvbiwgc2Vjb25kX2FyZ3VtZW50X3R5cGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfX0JJTkFSWV9BUkcoX09wZXJhdGlvbiwgcmVzdWx0X3R5cGUpID4gewotICB0eXBlZGVmIHVuYXJ5X2Z1bmN0aW9uPHR5cGVuYW1lIF9fQklOQVJZX0FSRyhfT3BlcmF0aW9uLCBzZWNvbmRfYXJndW1lbnRfdHlwZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX19CSU5BUllfQVJHKF9PcGVyYXRpb24sIHJlc3VsdF90eXBlKSA+IF9CYXNlOwotcHVibGljOgotICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjphcmd1bWVudF90eXBlIGFyZ3VtZW50X3R5cGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnJlc3VsdF90eXBlIHJlc3VsdF90eXBlOwotcHJpdmF0ZToKLSAgdHlwZWRlZiB0eXBlbmFtZSBfX2NhbGxfdHJhaXRzPGFyZ3VtZW50X3R5cGU+OjpwYXJhbV90eXBlIF9BcmdQYXJhbVR5cGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX19jYWxsX3RyYWl0czx0eXBlbmFtZSBfT3BlcmF0aW9uOjpmaXJzdF9hcmd1bWVudF90eXBlPjo6cGFyYW1fdHlwZSBfVmFsdWVQYXJhbVR5cGU7Ci1wcm90ZWN0ZWQ6Ci0gIC8vb3AgaXMgYSBTdGFuZGFyZCBuYW1lICgyMC4zLjYuMSksIGRvIG5vIG1ha2UgaXQgU1RMcG9ydCBuYW1pbmcgY29udmVudGlvbiBjb21wbGlhbnQuCi0gIF9PcGVyYXRpb24gb3A7Ci0gIHR5cGVuYW1lIF9PcGVyYXRpb246OmZpcnN0X2FyZ3VtZW50X3R5cGUgX01fdmFsdWU7Ci1wdWJsaWM6Ci0gIGJpbmRlcjFzdChjb25zdCBfT3BlcmF0aW9uJiBfX3gsIF9WYWx1ZVBhcmFtVHlwZSBfX3kpCi0gICAgICA6IG9wKF9feCksIF9NX3ZhbHVlKF9feSkge30KLQotICByZXN1bHRfdHlwZSBvcGVyYXRvcigpKF9BcmdQYXJhbVR5cGUgX194KSBjb25zdCB7Ci0gICAgcmV0dXJuIG9wKF9NX3ZhbHVlLCBfX3gpOwotICB9Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgX09wZXJhdGlvbiwgY2xhc3MgX1RwPgotaW5saW5lIGJpbmRlcjFzdDxfT3BlcmF0aW9uPgotYmluZDFzdChjb25zdCBfT3BlcmF0aW9uJiBfX2ZuLCBjb25zdCBfVHAmIF9feCkgewotICB0eXBlZGVmIHR5cGVuYW1lIF9PcGVyYXRpb246OmZpcnN0X2FyZ3VtZW50X3R5cGUgX0FyZzFfdHlwZTsKLSAgcmV0dXJuIGJpbmRlcjFzdDxfT3BlcmF0aW9uPihfX2ZuLCBfQXJnMV90eXBlKF9feCkpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX09wZXJhdGlvbj4KLWNsYXNzIGJpbmRlcjJuZAotICA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjx0eXBlbmFtZSBfX0JJTkFSWV9BUkcoX09wZXJhdGlvbiwgZmlyc3RfYXJndW1lbnRfdHlwZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9fQklOQVJZX0FSRyhfT3BlcmF0aW9uLCByZXN1bHRfdHlwZSk+IHsKLSAgdHlwZWRlZiB1bmFyeV9mdW5jdGlvbjx0eXBlbmFtZSBfX0JJTkFSWV9BUkcoX09wZXJhdGlvbiwgZmlyc3RfYXJndW1lbnRfdHlwZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX19CSU5BUllfQVJHKF9PcGVyYXRpb24sIHJlc3VsdF90eXBlKT4gX0Jhc2U7Ci1wdWJsaWM6Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmFyZ3VtZW50X3R5cGUgYXJndW1lbnRfdHlwZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6cmVzdWx0X3R5cGUgcmVzdWx0X3R5cGU7Ci1wcml2YXRlOgotICB0eXBlZGVmIHR5cGVuYW1lIF9fY2FsbF90cmFpdHM8YXJndW1lbnRfdHlwZT46OnBhcmFtX3R5cGUgX0FyZ1BhcmFtVHlwZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfX2NhbGxfdHJhaXRzPHR5cGVuYW1lIF9PcGVyYXRpb246OnNlY29uZF9hcmd1bWVudF90eXBlPjo6cGFyYW1fdHlwZSBfVmFsdWVQYXJhbVR5cGU7Ci1wcm90ZWN0ZWQ6Ci0gIC8vb3AgaXMgYSBTdGFuZGFyZCBuYW1lICgyMC4zLjYuMyksIGRvIG5vIG1ha2UgaXQgU1RMcG9ydCBuYW1pbmcgY29udmVudGlvbiBjb21wbGlhbnQuCi0gIF9PcGVyYXRpb24gb3A7Ci0gIHR5cGVuYW1lIF9PcGVyYXRpb246OnNlY29uZF9hcmd1bWVudF90eXBlIHZhbHVlOwotcHVibGljOgotICBiaW5kZXIybmQoY29uc3QgX09wZXJhdGlvbiYgX194LCBfVmFsdWVQYXJhbVR5cGUgX195KQotICAgICAgOiBvcChfX3gpLCB2YWx1ZShfX3kpIHt9Ci0KLSAgcmVzdWx0X3R5cGUgb3BlcmF0b3IoKShfQXJnUGFyYW1UeXBlIF9feCkgY29uc3QgewotICAgIHJldHVybiBvcChfX3gsIHZhbHVlKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIF9PcGVyYXRpb24sIGNsYXNzIF9UcD4KLWlubGluZSBiaW5kZXIybmQ8X09wZXJhdGlvbj4KLWJpbmQybmQoY29uc3QgX09wZXJhdGlvbiYgX19mbiwgY29uc3QgX1RwJiBfX3gpIHsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfT3BlcmF0aW9uOjpzZWNvbmRfYXJndW1lbnRfdHlwZSBfQXJnMl90eXBlOwotICByZXR1cm4gYmluZGVyMm5kPF9PcGVyYXRpb24+KF9fZm4sIF9BcmcyX3R5cGUoX194KSk7Ci19Ci0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKLS8vIHVuYXJ5X2NvbXBvc2UgYW5kIGJpbmFyeV9jb21wb3NlIChleHRlbnNpb25zLCBub3QgcGFydCBvZiB0aGUgc3RhbmRhcmQpLgotCi10ZW1wbGF0ZSA8Y2xhc3MgX09wZXJhdGlvbjEsIGNsYXNzIF9PcGVyYXRpb24yPgotY2xhc3MgdW5hcnlfY29tcG9zZSA6Ci0gIHB1YmxpYyB1bmFyeV9mdW5jdGlvbjx0eXBlbmFtZSBfX1VOQVJZX0FSRyhfT3BlcmF0aW9uMiwgYXJndW1lbnRfdHlwZSksCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfX1VOQVJZX0FSRyhfT3BlcmF0aW9uMSwgcmVzdWx0X3R5cGUpPiB7Ci0gIHR5cGVkZWYgdW5hcnlfZnVuY3Rpb248dHlwZW5hbWUgX19VTkFSWV9BUkcoX09wZXJhdGlvbjIsIGFyZ3VtZW50X3R5cGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9fVU5BUllfQVJHKF9PcGVyYXRpb24xLCByZXN1bHRfdHlwZSk+IF9CYXNlOwotcHVibGljOgotICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjphcmd1bWVudF90eXBlIGFyZ3VtZW50X3R5cGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnJlc3VsdF90eXBlIHJlc3VsdF90eXBlOwotcHJpdmF0ZToKLSAgdHlwZWRlZiB0eXBlbmFtZSBfX2NhbGxfdHJhaXRzPGFyZ3VtZW50X3R5cGU+OjpwYXJhbV90eXBlIF9BcmdQYXJhbVR5cGU7Ci1wcm90ZWN0ZWQ6Ci0gIF9PcGVyYXRpb24xIF9NX2ZuMTsKLSAgX09wZXJhdGlvbjIgX01fZm4yOwotcHVibGljOgotICB1bmFyeV9jb21wb3NlKGNvbnN0IF9PcGVyYXRpb24xJiBfX3gsIGNvbnN0IF9PcGVyYXRpb24yJiBfX3kpCi0gICAgOiBfTV9mbjEoX194KSwgX01fZm4yKF9feSkge30KLQotICByZXN1bHRfdHlwZSBvcGVyYXRvcigpKF9BcmdQYXJhbVR5cGUgX194KSBjb25zdCB7Ci0gICAgcmV0dXJuIF9NX2ZuMShfTV9mbjIoX194KSk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBfT3BlcmF0aW9uMSwgY2xhc3MgX09wZXJhdGlvbjI+Ci1pbmxpbmUgdW5hcnlfY29tcG9zZTxfT3BlcmF0aW9uMSxfT3BlcmF0aW9uMj4KLWNvbXBvc2UxKGNvbnN0IF9PcGVyYXRpb24xJiBfX2ZuMSwgY29uc3QgX09wZXJhdGlvbjImIF9fZm4yKSB7Ci0gIHJldHVybiB1bmFyeV9jb21wb3NlPF9PcGVyYXRpb24xLF9PcGVyYXRpb24yPihfX2ZuMSwgX19mbjIpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX09wZXJhdGlvbjEsIGNsYXNzIF9PcGVyYXRpb24yLCBjbGFzcyBfT3BlcmF0aW9uMz4KLWNsYXNzIGJpbmFyeV9jb21wb3NlIDoKLSAgICBwdWJsaWMgdW5hcnlfZnVuY3Rpb248dHlwZW5hbWUgX19VTkFSWV9BUkcoX09wZXJhdGlvbjIsIGFyZ3VtZW50X3R5cGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfX0JJTkFSWV9BUkcoX09wZXJhdGlvbjEsIHJlc3VsdF90eXBlKT4gewotICB0eXBlZGVmIHVuYXJ5X2Z1bmN0aW9uPHR5cGVuYW1lIF9fVU5BUllfQVJHKF9PcGVyYXRpb24yLCBhcmd1bWVudF90eXBlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfX0JJTkFSWV9BUkcoX09wZXJhdGlvbjEsIHJlc3VsdF90eXBlKT4gX0Jhc2U7Ci1wdWJsaWM6Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmFyZ3VtZW50X3R5cGUgYXJndW1lbnRfdHlwZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6cmVzdWx0X3R5cGUgcmVzdWx0X3R5cGU7Ci1wcml2YXRlOgotICB0eXBlZGVmIHR5cGVuYW1lIF9fY2FsbF90cmFpdHM8YXJndW1lbnRfdHlwZT46OnBhcmFtX3R5cGUgX0FyZ1BhcmFtVHlwZTsKLXByb3RlY3RlZDoKLSAgX09wZXJhdGlvbjEgX01fZm4xOwotICBfT3BlcmF0aW9uMiBfTV9mbjI7Ci0gIF9PcGVyYXRpb24zIF9NX2ZuMzsKLXB1YmxpYzoKLSAgYmluYXJ5X2NvbXBvc2UoY29uc3QgX09wZXJhdGlvbjEmIF9feCwgY29uc3QgX09wZXJhdGlvbjImIF9feSwKLSAgICAgICAgICAgICAgICAgY29uc3QgX09wZXJhdGlvbjMmIF9feikKLSAgICA6IF9NX2ZuMShfX3gpLCBfTV9mbjIoX195KSwgX01fZm4zKF9feikgeyB9Ci0KLSAgcmVzdWx0X3R5cGUgb3BlcmF0b3IoKShfQXJnUGFyYW1UeXBlIF9feCkgY29uc3QgewotICAgIHJldHVybiBfTV9mbjEoX01fZm4yKF9feCksIF9NX2ZuMyhfX3gpKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIF9PcGVyYXRpb24xLCBjbGFzcyBfT3BlcmF0aW9uMiwgY2xhc3MgX09wZXJhdGlvbjM+Ci1pbmxpbmUgYmluYXJ5X2NvbXBvc2U8X09wZXJhdGlvbjEsIF9PcGVyYXRpb24yLCBfT3BlcmF0aW9uMz4KLWNvbXBvc2UyKGNvbnN0IF9PcGVyYXRpb24xJiBfX2ZuMSwgY29uc3QgX09wZXJhdGlvbjImIF9fZm4yLAotICAgICAgICAgY29uc3QgX09wZXJhdGlvbjMmIF9fZm4zKSB7Ci0gIHJldHVybiBiaW5hcnlfY29tcG9zZTxfT3BlcmF0aW9uMSxfT3BlcmF0aW9uMixfT3BlcmF0aW9uMz4oX19mbjEsIF9fZm4yLCBfX2ZuMyk7Ci19Ci0KLS8vIGlkZW50aXR5IGlzIGFuIGV4dGVuc2lvbjogaXQgaXMgbm90IHBhcnQgb2YgdGhlIHN0YW5kYXJkLgotdGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IGlkZW50aXR5IDogcHVibGljIF9TVExQX1BSSVYgX0lkZW50aXR5PF9UcD4ge307Ci0vLyBzZWxlY3Qxc3QgYW5kIHNlbGVjdDJuZCBhcmUgZXh0ZW5zaW9uczogdGhleSBhcmUgbm90IHBhcnQgb2YgdGhlIHN0YW5kYXJkLgotdGVtcGxhdGUgPGNsYXNzIF9QYWlyPiBzdHJ1Y3Qgc2VsZWN0MXN0IDogcHVibGljIF9TVExQX1BSSVYgX1NlbGVjdDFzdDxfUGFpcj4ge307Ci10ZW1wbGF0ZSA8Y2xhc3MgX1BhaXI+IHN0cnVjdCBzZWxlY3QybmQgOiBwdWJsaWMgX1NUTFBfUFJJViBfU2VsZWN0Mm5kPF9QYWlyPiB7fTsKLQotdGVtcGxhdGUgPGNsYXNzIF9BcmcxLCBjbGFzcyBfQXJnMj4KLXN0cnVjdCBwcm9qZWN0MXN0IDogcHVibGljIF9TVExQX1BSSVYgX1Byb2plY3Qxc3Q8X0FyZzEsIF9BcmcyPiB7fTsKLQotdGVtcGxhdGUgPGNsYXNzIF9BcmcxLCBjbGFzcyBfQXJnMj4KLXN0cnVjdCBwcm9qZWN0Mm5kIDogcHVibGljIF9TVExQX1BSSVYgX1Byb2plY3QybmQ8X0FyZzEsIF9BcmcyPiB7fTsKLQotCi0vLyBjb25zdGFudF92b2lkX2Z1biwgY29uc3RhbnRfdW5hcnlfZnVuLCBhbmQgY29uc3RhbnRfYmluYXJ5X2Z1biBhcmUKLS8vIGV4dGVuc2lvbnM6IHRoZXkgYXJlIG5vdCBwYXJ0IG9mIHRoZSBzdGFuZGFyZC4gIChUaGUgc2FtZSwgb2YgY291cnNlLAotLy8gaXMgdHJ1ZSBvZiB0aGUgaGVscGVyIGZ1bmN0aW9ucyBjb25zdGFudDAsIGNvbnN0YW50MSwgYW5kIGNvbnN0YW50Mi4pCi0KLV9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKLQotdGVtcGxhdGUgPGNsYXNzIF9SZXN1bHQ+Ci1zdHJ1Y3QgX0NvbnN0YW50X3ZvaWRfZnVuIHsKLSAgdHlwZWRlZiBfUmVzdWx0IHJlc3VsdF90eXBlOwotICByZXN1bHRfdHlwZSBfTV92YWw7Ci0KLSAgX0NvbnN0YW50X3ZvaWRfZnVuKGNvbnN0IHJlc3VsdF90eXBlJiBfX3YpIDogX01fdmFsKF9fdikge30KLSAgY29uc3QgcmVzdWx0X3R5cGUmIG9wZXJhdG9yKCkoKSBjb25zdCB7IHJldHVybiBfTV92YWw7IH0KLX07Ci0KLV9TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1Jlc3VsdD4KLXN0cnVjdCBjb25zdGFudF92b2lkX2Z1biA6IHB1YmxpYyBfU1RMUF9QUklWIF9Db25zdGFudF92b2lkX2Z1bjxfUmVzdWx0PiB7Ci0gIGNvbnN0YW50X3ZvaWRfZnVuKGNvbnN0IF9SZXN1bHQmIF9fdikKLSAgICA6IF9TVExQX1BSSVYgX0NvbnN0YW50X3ZvaWRfZnVuPF9SZXN1bHQ+KF9fdikge30KLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBfUmVzdWx0LCBfU1RMUF9ERkxfVE1QTF9QQVJBTSggX0FyZ3VtZW50ICwgX1Jlc3VsdCkgPgotc3RydWN0IGNvbnN0YW50X3VuYXJ5X2Z1biA6IHB1YmxpYyBfU1RMUF9QUklWIF9Db25zdGFudF91bmFyeV9mdW48X1Jlc3VsdCwgX0FyZ3VtZW50PiB7Ci0gIGNvbnN0YW50X3VuYXJ5X2Z1bihjb25zdCBfUmVzdWx0JiBfX3YpCi0gICAgOiBfU1RMUF9QUklWIF9Db25zdGFudF91bmFyeV9mdW48X1Jlc3VsdCwgX0FyZ3VtZW50PihfX3YpIHt9Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgX1Jlc3VsdCwgX1NUTFBfREZMX1RNUExfUEFSQU0oIF9BcmcxICwgX1Jlc3VsdCksIF9TVExQX0RGTF9UTVBMX1BBUkFNKCBfQXJnMiAsIF9BcmcxKSA+Ci1zdHJ1Y3QgY29uc3RhbnRfYmluYXJ5X2Z1bgotICA6IHB1YmxpYyBfU1RMUF9QUklWIF9Db25zdGFudF9iaW5hcnlfZnVuPF9SZXN1bHQsIF9BcmcxLCBfQXJnMj4gewotICBjb25zdGFudF9iaW5hcnlfZnVuKGNvbnN0IF9SZXN1bHQmIF9fdikKLSAgICA6IF9TVExQX1BSSVYgX0NvbnN0YW50X2JpbmFyeV9mdW48X1Jlc3VsdCwgX0FyZzEsIF9BcmcyPihfX3YpIHt9Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgX1Jlc3VsdD4KLWlubGluZSBjb25zdGFudF92b2lkX2Z1bjxfUmVzdWx0PiBjb25zdGFudDAoY29uc3QgX1Jlc3VsdCYgX192YWwpIHsKLSAgcmV0dXJuIGNvbnN0YW50X3ZvaWRfZnVuPF9SZXN1bHQ+KF9fdmFsKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9SZXN1bHQ+Ci1pbmxpbmUgY29uc3RhbnRfdW5hcnlfZnVuPF9SZXN1bHQsX1Jlc3VsdD4gY29uc3RhbnQxKGNvbnN0IF9SZXN1bHQmIF9fdmFsKSB7Ci0gIHJldHVybiBjb25zdGFudF91bmFyeV9mdW48X1Jlc3VsdCxfUmVzdWx0PihfX3ZhbCk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfUmVzdWx0PgotaW5saW5lIGNvbnN0YW50X2JpbmFyeV9mdW48X1Jlc3VsdCxfUmVzdWx0LF9SZXN1bHQ+Ci1jb25zdGFudDIoY29uc3QgX1Jlc3VsdCYgX192YWwpIHsKLSAgcmV0dXJuIGNvbnN0YW50X2JpbmFyeV9mdW48X1Jlc3VsdCxfUmVzdWx0LF9SZXN1bHQ+KF9fdmFsKTsKLX0KLQotLy8gc3VidHJhY3RpdmVfcm5nIGlzIGFuIGV4dGVuc2lvbjogaXQgaXMgbm90IHBhcnQgb2YgdGhlIHN0YW5kYXJkLgotLy8gTm90ZTogdGhpcyBjb2RlIGFzc3VtZXMgdGhhdCBpbnQgaXMgMzIgYml0cy4KLWNsYXNzIHN1YnRyYWN0aXZlX3JuZyA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxfU1RMUF9VSU5UMzJfVCwgX1NUTFBfVUlOVDMyX1Q+IHsKLXByaXZhdGU6Ci0gIF9TVExQX1VJTlQzMl9UIF9NX3RhYmxlWzU1XTsKLSAgX1NUTFBfVUlOVDMyX1QgX01faW5kZXgxOwotICBfU1RMUF9VSU5UMzJfVCBfTV9pbmRleDI7Ci1wdWJsaWM6Ci0gIF9TVExQX1VJTlQzMl9UIG9wZXJhdG9yKCkoX1NUTFBfVUlOVDMyX1QgX19saW1pdCkgewotICAgIF9NX2luZGV4MSA9IChfTV9pbmRleDEgKyAxKSAlIDU1OwotICAgIF9NX2luZGV4MiA9IChfTV9pbmRleDIgKyAxKSAlIDU1OwotICAgIF9NX3RhYmxlW19NX2luZGV4MV0gPSBfTV90YWJsZVtfTV9pbmRleDFdIC0gX01fdGFibGVbX01faW5kZXgyXTsKLSAgICByZXR1cm4gX01fdGFibGVbX01faW5kZXgxXSAlIF9fbGltaXQ7Ci0gIH0KLQotICB2b2lkIF9NX2luaXRpYWxpemUoX1NUTFBfVUlOVDMyX1QgX19zZWVkKSB7Ci0gICAgX1NUTFBfVUlOVDMyX1QgX19rID0gMTsKLSAgICBfTV90YWJsZVs1NF0gPSBfX3NlZWQ7Ci0gICAgX1NUTFBfVUlOVDMyX1QgX19pOwotICAgIGZvciAoX19pID0gMDsgX19pIDwgNTQ7IF9faSsrKSB7Ci0gICAgICAgIF9TVExQX1VJTlQzMl9UIF9faWkgPSAoMjEgKiAoX19pICsgMSkgJSA1NSkgLSAxOwotICAgICAgICBfTV90YWJsZVtfX2lpXSA9IF9fazsKLSAgICAgICAgX19rID0gX19zZWVkIC0gX19rOwotICAgICAgICBfX3NlZWQgPSBfTV90YWJsZVtfX2lpXTsKLSAgICB9Ci0gICAgZm9yIChpbnQgX19sb29wID0gMDsgX19sb29wIDwgNDsgX19sb29wKyspIHsKLSAgICAgICAgZm9yIChfX2kgPSAwOyBfX2kgPCA1NTsgX19pKyspCi0gICAgICAgICAgICBfTV90YWJsZVtfX2ldID0gX01fdGFibGVbX19pXSAtIF9NX3RhYmxlWygxICsgX19pICsgMzApICUgNTVdOwotICAgIH0KLSAgICBfTV9pbmRleDEgPSAwOwotICAgIF9NX2luZGV4MiA9IDMxOwotICB9Ci0KLSAgc3VidHJhY3RpdmVfcm5nKHVuc2lnbmVkIGludCBfX3NlZWQpIHsgX01faW5pdGlhbGl6ZShfX3NlZWQpOyB9Ci0gIHN1YnRyYWN0aXZlX3JuZygpIHsgX01faW5pdGlhbGl6ZSgxNjE4MDMzOTh1bCk7IH0KLX07Ci0KLSNlbmRpZiAvKiBfU1RMUF9OT19FWFRFTlNJT05TICovCi0KLV9TVExQX0VORF9OQU1FU1BBQ0UKLQotI2luY2x1ZGUgPHN0bC9fZnVuY3Rpb25fYWRhcHRvcnMuaD4KLQotI2VuZGlmIC8qIF9TVExQX0lOVEVSTkFMX0ZVTkNUSU9OX0ggKi8KLQotLy8gTG9jYWwgVmFyaWFibGVzOgotLy8gbW9kZTpDKysKLS8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9fZnVuY3Rpb25fYWRhcHRvcnMuaCBiL3N0bC9fZnVuY3Rpb25fYWRhcHRvcnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWViODVlNy4uMDAwMDAwMAotLS0gYS9zdGwvX2Z1bmN0aW9uX2FkYXB0b3JzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MDIgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTQKLSAqIEhld2xldHQtUGFja2FyZCBDb21wYW55Ci0gKgotICogQ29weXJpZ2h0IChjKSAxOTk2LTE5OTgKLSAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NwotICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogQm9yaXMgRm9taXRjaGV2Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwCi0gKiBQYXZlbCBLdXpuZXRzb3YKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEKLSAqIE1lcmlkaWFuJzkzCi0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICovCi0KLS8qIE5PVEU6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIFNUTCBoZWFkZXJzLgotICogICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIG5vbyBtYWNybyBwcm90ZWN0aW9uIGFzIGl0IGlzIG1lYW50IHRvIGJlIGluY2x1ZGVkIHNldmVyYWwgdGltZXMKLS8vIGZyb20gb3RoZXIgaGVhZGVyLgotLy8gQWRhcHRvciBmdW5jdGlvbiBvYmplY3RzOiBwb2ludGVycyB0byBtZW1iZXIgZnVuY3Rpb25zLgotCi0vLyBUaGVyZSBhcmUgYSB0b3RhbCBvZiAxNiA9IDJeNCBmdW5jdGlvbiBvYmplY3RzIGluIHRoaXMgZmFtaWx5LgotLy8gICgxKSBNZW1iZXIgZnVuY3Rpb25zIHRha2luZyBubyBhcmd1bWVudHMgdnMgbWVtYmVyIGZ1bmN0aW9ucyB0YWtpbmcKLS8vICAgICAgIG9uZSBhcmd1bWVudC4KLS8vICAoMikgQ2FsbCB0aHJvdWdoIHBvaW50ZXIgdnMgY2FsbCB0aHJvdWdoIHJlZmVyZW5jZS4KLS8vICAoMykgTWVtYmVyIGZ1bmN0aW9uIHdpdGggdm9pZCByZXR1cm4gdHlwZSB2cyBtZW1iZXIgZnVuY3Rpb24gd2l0aAotLy8gICAgICBub24tdm9pZCByZXR1cm4gdHlwZS4KLS8vICAoNCkgQ29uc3QgdnMgbm9uLWNvbnN0IG1lbWJlciBmdW5jdGlvbi4KLQotLy8gTm90ZSB0aGF0IGNob2ljZSAoMykgaXMgbm90aGluZyBtb3JlIHRoYW4gYSB3b3JrYXJvdW5kOiBhY2NvcmRpbmcKLS8vICB0byB0aGUgZHJhZnQsIGNvbXBpbGVycyBzaG91bGQgaGFuZGxlIHZvaWQgYW5kIG5vbi12b2lkIHRoZSBzYW1lIHdheS4KLS8vICBUaGlzIGZlYXR1cmUgaXMgbm90IHlldCB3aWRlbHkgaW1wbGVtZW50ZWQsIHRob3VnaC4gIFlvdSBjYW4gb25seSB1c2UKLS8vICBtZW1iZXIgZnVuY3Rpb25zIHJldHVybmluZyB2b2lkIGlmIHlvdXIgY29tcGlsZXIgc3VwcG9ydHMgcGFydGlhbAotLy8gIHNwZWNpYWxpemF0aW9uLgotCi0vLyBBbGwgb2YgdGhpcyBjb21wbGV4aXR5IGlzIGluIHRoZSBmdW5jdGlvbiBvYmplY3RzIHRoZW1zZWx2ZXMuICBZb3UgY2FuCi0vLyAgaWdub3JlIGl0IGJ5IHVzaW5nIHRoZSBoZWxwZXIgZnVuY3Rpb24gbWVtX2Z1biBhbmQgbWVtX2Z1bl9yZWYsCi0vLyAgd2hpY2ggY3JlYXRlIHdoaWNoZXZlciB0eXBlIG9mIGFkYXB0b3IgaXMgYXBwcm9wcmlhdGUuCi0KLV9TVExQX0JFR0lOX05BTUVTUEFDRQotCi0vL1RoaXMgaW1wbGVtZW50YXRpb24gd2lsbCBvbmx5IGJlIHVzZWQgaWYgbmVlZGVkLCB0aGF0IGlzIHRvIHNheSB3aGVuIHRoZXJlIGlzIHRoZSByZXR1cm4gdm9pZCBidWcKLS8vYW5kIHdoZW4gdGhlcmUgaXMgbm8gcGFydGlhbCB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbgotI2lmIGRlZmluZWQoX1NUTFBfRE9OVF9SRVRVUk5fVk9JRCkgJiYgZGVmaW5lZCAoX1NUTFBfTk9fQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikgJiYgZGVmaW5lZChfU1RMUF9NRU1CRVJfVEVNUExBVEVfQ0xBU1NFUykKLQotdGVtcGxhdGU8Y2xhc3MgX1Jlc3VsdCwgY2xhc3MgX1RwPgotY2xhc3MgX01lbV9mdW4wX3B0ciA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxfVHAqLCBfUmVzdWx0PiB7Ci1wcm90ZWN0ZWQ6Ci0gIHR5cGVkZWYgX1Jlc3VsdCAoX1RwOjoqX19mdW5fdHlwZSkgKCk7Ci0gIGV4cGxpY2l0IF9NZW1fZnVuMF9wdHIoX19mdW5fdHlwZSBfX2YpIDogX01fZihfX2YpIHt9Ci0KLXB1YmxpYzoKLSAgX1Jlc3VsdCBvcGVyYXRvciAoKShfVHAqIF9fcCkgY29uc3QgeyByZXR1cm4gKF9fcC0+Kl9NX2YpKCk7IH0KLQotcHJpdmF0ZToKLSAgX19mdW5fdHlwZSBfTV9mOwotfTsKLQotdGVtcGxhdGU8Y2xhc3MgX1Jlc3VsdCwgY2xhc3MgX1RwLCBjbGFzcyBfQXJnPgotY2xhc3MgX01lbV9mdW4xX3B0ciA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwKixfQXJnLF9SZXN1bHQ+IHsKLXByb3RlY3RlZDoKLSAgdHlwZWRlZiBfUmVzdWx0IChfVHA6OipfX2Z1bl90eXBlKSAoX0FyZyk7Ci0gIGV4cGxpY2l0IF9NZW1fZnVuMV9wdHIoX19mdW5fdHlwZSBfX2YpIDogX01fZihfX2YpIHt9Ci0KLXB1YmxpYzoKLSAgX1Jlc3VsdCBvcGVyYXRvciAoKShfVHAqIF9fcCwgX0FyZyBfX3gpIGNvbnN0IHsgcmV0dXJuIChfX3AtPipfTV9mKShfX3gpOyB9Ci0KLXByaXZhdGU6Ci0gIF9fZnVuX3R5cGUgX01fZjsKLX07Ci0KLXRlbXBsYXRlPGNsYXNzIF9SZXN1bHQsIGNsYXNzIF9UcD4KLWNsYXNzIF9Db25zdF9tZW1fZnVuMF9wdHIgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248Y29uc3QgX1RwKixfUmVzdWx0PiB7Ci1wcm90ZWN0ZWQ6Ci0gIHR5cGVkZWYgX1Jlc3VsdCAoX1RwOjoqX19mdW5fdHlwZSkgKCkgY29uc3Q7Ci0gIGV4cGxpY2l0IF9Db25zdF9tZW1fZnVuMF9wdHIoX19mdW5fdHlwZSBfX2YpIDogX01fZihfX2YpIHt9Ci0KLXB1YmxpYzoKLSAgX1Jlc3VsdCBvcGVyYXRvciAoKShjb25zdCBfVHAqIF9fcCkgY29uc3QgeyByZXR1cm4gKF9fcC0+Kl9NX2YpKCk7IH0KLQotcHJpdmF0ZToKLSAgX19mdW5fdHlwZSBfTV9mOwotfTsKLQotdGVtcGxhdGU8Y2xhc3MgX1Jlc3VsdCwgY2xhc3MgX1RwLCBjbGFzcyBfQXJnPgotY2xhc3MgX0NvbnN0X21lbV9mdW4xX3B0ciA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248Y29uc3QgX1RwKixfQXJnLF9SZXN1bHQ+IHsKLXByb3RlY3RlZDoKLSAgdHlwZWRlZiBfUmVzdWx0IChfVHA6OipfX2Z1bl90eXBlKSAoX0FyZykgY29uc3Q7Ci0gIGV4cGxpY2l0IF9Db25zdF9tZW1fZnVuMV9wdHIoX19mdW5fdHlwZSBfX2YpIDogX01fZihfX2YpIHt9Ci0KLXB1YmxpYzoKLSAgX1Jlc3VsdCBvcGVyYXRvciAoKShjb25zdCBfVHAqIF9fcCwgX0FyZyBfX3gpIGNvbnN0IHsKLSAgICByZXR1cm4gKF9fcC0+Kl9NX2YpKF9feCk7IH0KLQotcHJpdmF0ZToKLSAgX19mdW5fdHlwZSBfTV9mOwotfTsKLQotdGVtcGxhdGU8Y2xhc3MgX1Jlc3VsdCwgY2xhc3MgX1RwPgotY2xhc3MgX01lbV9mdW4wX3JlZiA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxfVHAmLF9SZXN1bHQ+IHsKLXByb3RlY3RlZDoKLSAgdHlwZWRlZiBfUmVzdWx0IChfVHA6OipfX2Z1bl90eXBlKSAoKTsKLSAgZXhwbGljaXQgX01lbV9mdW4wX3JlZihfX2Z1bl90eXBlIF9fZikgOiBfTV9mKF9fZikge30KLQotcHVibGljOgotICBfUmVzdWx0IG9wZXJhdG9yICgpKF9UcCYgX19wKSBjb25zdCB7IHJldHVybiAoX19wLipfTV9mKSgpOyB9Ci0KLXByaXZhdGU6Ci0gIF9fZnVuX3R5cGUgX01fZjsKLX07Ci0KLXRlbXBsYXRlPGNsYXNzIF9SZXN1bHQsIGNsYXNzIF9UcCwgY2xhc3MgX0FyZz4KLWNsYXNzIF9NZW1fZnVuMV9yZWYgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCYsX0FyZyxfUmVzdWx0PiB7Ci1wcm90ZWN0ZWQ6Ci0gIHR5cGVkZWYgX1Jlc3VsdCAoX1RwOjoqX19mdW5fdHlwZSkgKF9BcmcpOwotICBleHBsaWNpdCBfTWVtX2Z1bjFfcmVmKF9fZnVuX3R5cGUgX19mKSA6IF9NX2YoX19mKSB7fQotCi1wdWJsaWM6Ci0gIF9SZXN1bHQgb3BlcmF0b3IgKCkoX1RwJiBfX3AsIF9BcmcgX194KSBjb25zdCB7IHJldHVybiAoX19wLipfTV9mKShfX3gpOyB9Ci0KLXByaXZhdGU6Ci0gIF9fZnVuX3R5cGUgX01fZjsKLX07Ci0KLXRlbXBsYXRlPGNsYXNzIF9SZXN1bHQsIGNsYXNzIF9UcD4KLWNsYXNzIF9Db25zdF9tZW1fZnVuMF9yZWYgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248Y29uc3QgX1RwJixfUmVzdWx0PiB7Ci1wcm90ZWN0ZWQ6Ci0gIHR5cGVkZWYgX1Jlc3VsdCAoX1RwOjoqX19mdW5fdHlwZSkgKCkgY29uc3Q7Ci0gIGV4cGxpY2l0IF9Db25zdF9tZW1fZnVuMF9yZWYoX19mdW5fdHlwZSBfX2YpIDogX01fZihfX2YpIHt9Ci0KLXB1YmxpYzoKLSAgX1Jlc3VsdCBvcGVyYXRvciAoKShjb25zdCBfVHAmIF9fcCkgY29uc3QgeyByZXR1cm4gKF9fcC4qX01fZikoKTsgfQotCi1wcml2YXRlOgotICBfX2Z1bl90eXBlIF9NX2Y7Ci19OwotCi10ZW1wbGF0ZTxjbGFzcyBfUmVzdWx0LCBjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+Ci1jbGFzcyBfQ29uc3RfbWVtX2Z1bjFfcmVmIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxjb25zdCBfVHAmLF9BcmcsX1Jlc3VsdD4gewotcHJvdGVjdGVkOgotICB0eXBlZGVmIF9SZXN1bHQgKF9UcDo6Kl9fZnVuX3R5cGUpIChfQXJnKSBjb25zdDsKLSAgZXhwbGljaXQgX0NvbnN0X21lbV9mdW4xX3JlZihfX2Z1bl90eXBlIF9fZikgOiBfTV9mKF9fZikge30KLQotcHVibGljOgotICBfUmVzdWx0IG9wZXJhdG9yICgpKGNvbnN0IF9UcCYgX19wLCBfQXJnIF9feCkgY29uc3QgeyByZXR1cm4gKF9fcC4qX01fZikoX194KTsgfQotCi1wcml2YXRlOgotICBfX2Z1bl90eXBlIF9NX2Y7Ci19OwotCi10ZW1wbGF0ZTxjbGFzcyBfUmVzdWx0Pgotc3RydWN0IF9NZW1fZnVuX3RyYWl0cyB7Ci0gIHRlbXBsYXRlPGNsYXNzIF9UcD4KLSAgc3RydWN0IF9BcmdzMCB7Ci0gICAgdHlwZWRlZiBfTWVtX2Z1bjBfcHRyPF9SZXN1bHQsX1RwPiAgICAgICAgICAgIF9QdHI7Ci0gICAgdHlwZWRlZiBfQ29uc3RfbWVtX2Z1bjBfcHRyPF9SZXN1bHQsX1RwPiAgICAgIF9QdHJfY29uc3Q7Ci0gICAgdHlwZWRlZiBfTWVtX2Z1bjBfcmVmPF9SZXN1bHQsX1RwPiAgICAgICAgICAgIF9SZWY7Ci0gICAgdHlwZWRlZiBfQ29uc3RfbWVtX2Z1bjBfcmVmPF9SZXN1bHQsX1RwPiAgICAgIF9SZWZfY29uc3Q7Ci0gIH07Ci0KLSAgdGVtcGxhdGU8Y2xhc3MgX1RwLCBjbGFzcyBfQXJnPgotICBzdHJ1Y3QgX0FyZ3MxIHsKLSAgICB0eXBlZGVmIF9NZW1fZnVuMV9wdHI8X1Jlc3VsdCxfVHAsX0FyZz4gICAgICAgX1B0cjsKLSAgICB0eXBlZGVmIF9Db25zdF9tZW1fZnVuMV9wdHI8X1Jlc3VsdCxfVHAsX0FyZz4gX1B0cl9jb25zdDsKLSAgICB0eXBlZGVmIF9NZW1fZnVuMV9yZWY8X1Jlc3VsdCxfVHAsX0FyZz4gICAgICAgX1JlZjsKLSAgICB0eXBlZGVmIF9Db25zdF9tZW1fZnVuMV9yZWY8X1Jlc3VsdCxfVHAsX0FyZz4gX1JlZl9jb25zdDsKLSAgfTsKLX07Ci0KLXRlbXBsYXRlPGNsYXNzIF9BcmcsIGNsYXNzIF9SZXN1bHQ+Ci1jbGFzcyBfUHRyX2Z1bjFfYmFzZSA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxfQXJnLCBfUmVzdWx0PiB7Ci1wcm90ZWN0ZWQ6Ci0gIHR5cGVkZWYgX1Jlc3VsdCAoKl9fZnVuX3R5cGUpIChfQXJnKTsKLSAgZXhwbGljaXQgX1B0cl9mdW4xX2Jhc2UoX19mdW5fdHlwZSBfX2YpIDogX01fZihfX2YpIHt9Ci0KLXB1YmxpYzoKLSAgX1Jlc3VsdCBvcGVyYXRvcigpKF9BcmcgX194KSBjb25zdCB7IHJldHVybiBfTV9mKF9feCk7IH0KLQotcHJpdmF0ZToKLSAgX19mdW5fdHlwZSBfTV9mOwotfTsKLQotdGVtcGxhdGUgPGNsYXNzIF9BcmcxLCBjbGFzcyBfQXJnMiwgY2xhc3MgX1Jlc3VsdD4KLWNsYXNzIF9QdHJfZnVuMl9iYXNlIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfQXJnMSxfQXJnMixfUmVzdWx0PiB7Ci1wcm90ZWN0ZWQ6Ci0gIHR5cGVkZWYgX1Jlc3VsdCAoKl9fZnVuX3R5cGUpIChfQXJnMSwgX0FyZzIpOwotICBleHBsaWNpdCBfUHRyX2Z1bjJfYmFzZShfX2Z1bl90eXBlIF9fZikgOiBfTV9mKF9fZikge30KLQotcHVibGljOgotICBfUmVzdWx0IG9wZXJhdG9yKCkoX0FyZzEgX194LCBfQXJnMiBfX3kpIGNvbnN0IHsgcmV0dXJuIF9NX2YoX194LCBfX3kpOyB9Ci0KLXByaXZhdGU6Ci0gIF9fZnVuX3R5cGUgX01fZjsKLX07Ci0KLXRlbXBsYXRlPGNsYXNzIF9SZXN1bHQ+Ci1zdHJ1Y3QgX1B0cl9mdW5fdHJhaXRzIHsKLSAgdGVtcGxhdGU8Y2xhc3MgX0FyZz4gc3RydWN0IF9BcmdzMSB7Ci0gICAgdHlwZWRlZiBfUHRyX2Z1bjFfYmFzZTxfQXJnLF9SZXN1bHQ+IF9GdW47Ci0gIH07Ci0KLSAgdGVtcGxhdGU8Y2xhc3MgX0FyZzEsIGNsYXNzIF9BcmcyPiBzdHJ1Y3QgX0FyZ3MyIHsKLSAgICB0eXBlZGVmIF9QdHJfZnVuMl9iYXNlPF9BcmcxLF9BcmcyLF9SZXN1bHQ+IF9GdW47Ci0gIH07Ci19OwotCi0vKlNwZWNpYWxpemF0aW9uIGZvciB2b2lkIHJldHVybiB0eXBlCi0qLwotdGVtcGxhdGU8Y2xhc3MgX1RwPgotY2xhc3MgX1ZvaWRfbWVtX2Z1bjBfcHRyIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPF9UcCosdm9pZD4gewotcHJvdGVjdGVkOgotICB0eXBlZGVmIHZvaWQgKF9UcDo6Kl9fZnVuX3R5cGUpICgpOwotICBleHBsaWNpdCBfVm9pZF9tZW1fZnVuMF9wdHIoX19mdW5fdHlwZSBfX2YpIDogX01fZihfX2YpIHt9Ci0KLXB1YmxpYzoKLSAgdm9pZCBvcGVyYXRvciAoKShfVHAqIF9fcCkgY29uc3QgeyAoX19wLT4qX01fZikoKTsgfQotCi1wcml2YXRlOgotICBfX2Z1bl90eXBlIF9NX2Y7Ci19OwotCi10ZW1wbGF0ZTxjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+Ci1jbGFzcyBfVm9pZF9tZW1fZnVuMV9wdHIgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCosX0FyZyx2b2lkPiB7Ci1wcm90ZWN0ZWQ6Ci0gIHR5cGVkZWYgdm9pZCAoX1RwOjoqX19mdW5fdHlwZSkgKF9BcmcpOwotICBleHBsaWNpdCBfVm9pZF9tZW1fZnVuMV9wdHIoX19mdW5fdHlwZSBfX2YpIDogX01fZihfX2YpIHt9Ci0KLXB1YmxpYzoKLSAgdm9pZCBvcGVyYXRvciAoKShfVHAqIF9fcCwgX0FyZyBfX3gpIGNvbnN0IHsgKF9fcC0+Kl9NX2YpKF9feCk7IH0KLQotcHJpdmF0ZToKLSAgX19mdW5fdHlwZSBfTV9mOwotfTsKLQotdGVtcGxhdGU8Y2xhc3MgX1RwPgotY2xhc3MgX1ZvaWRfY29uc3RfbWVtX2Z1bjBfcHRyIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPGNvbnN0IF9UcCosdm9pZD4gewotcHJvdGVjdGVkOgotICB0eXBlZGVmIHZvaWQgKF9UcDo6Kl9fZnVuX3R5cGUpICgpIGNvbnN0OwotICBleHBsaWNpdCBfVm9pZF9jb25zdF9tZW1fZnVuMF9wdHIoX19mdW5fdHlwZSBfX2YpIDogX01fZihfX2YpIHt9Ci0KLXB1YmxpYzoKLSAgdm9pZCBvcGVyYXRvciAoKShjb25zdCBfVHAqIF9fcCkgY29uc3QgeyAoX19wLT4qX01fZikoKTsgfQotCi1wcml2YXRlOgotICBfX2Z1bl90eXBlIF9NX2Y7Ci19OwotCi10ZW1wbGF0ZTxjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+Ci1jbGFzcyBfVm9pZF9jb25zdF9tZW1fZnVuMV9wdHIgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPGNvbnN0IF9UcCosX0FyZyx2b2lkPiB7Ci1wcm90ZWN0ZWQ6Ci0gIHR5cGVkZWYgdm9pZCAoX1RwOjoqX19mdW5fdHlwZSkgKF9BcmcpIGNvbnN0OwotICBleHBsaWNpdCBfVm9pZF9jb25zdF9tZW1fZnVuMV9wdHIoX19mdW5fdHlwZSBfX2YpIDogX01fZihfX2YpIHt9Ci0KLXB1YmxpYzoKLSAgdm9pZCBvcGVyYXRvciAoKShjb25zdCBfVHAqIF9fcCwgX0FyZyBfX3gpIGNvbnN0IHsgKF9fcC0+Kl9NX2YpKF9feCk7IH0KLQotcHJpdmF0ZToKLSAgX19mdW5fdHlwZSBfTV9mOwotfTsKLQotdGVtcGxhdGU8Y2xhc3MgX1RwPgotY2xhc3MgX1ZvaWRfbWVtX2Z1bjBfcmVmIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPF9UcCYsdm9pZD4gewotcHJvdGVjdGVkOgotICB0eXBlZGVmIHZvaWQgKF9UcDo6Kl9fZnVuX3R5cGUpICgpOwotICBleHBsaWNpdCBfVm9pZF9tZW1fZnVuMF9yZWYoX19mdW5fdHlwZSBfX2YpIDogX01fZihfX2YpIHt9Ci0KLXB1YmxpYzoKLSAgdm9pZCBvcGVyYXRvciAoKShfVHAmIF9fcCkgY29uc3QgeyAoX19wLipfTV9mKSgpOyB9Ci0KLXByaXZhdGU6Ci0gIF9fZnVuX3R5cGUgX01fZjsKLX07Ci0KLXRlbXBsYXRlPGNsYXNzIF9UcCwgY2xhc3MgX0FyZz4KLWNsYXNzIF9Wb2lkX21lbV9mdW4xX3JlZiA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwJixfQXJnLHZvaWQ+IHsKLXByb3RlY3RlZDoKLSAgdHlwZWRlZiB2b2lkIChfVHA6OipfX2Z1bl90eXBlKSAoX0FyZyk7Ci0gIGV4cGxpY2l0IF9Wb2lkX21lbV9mdW4xX3JlZihfX2Z1bl90eXBlIF9fZikgOiBfTV9mKF9fZikge30KLQotcHVibGljOgotICB2b2lkIG9wZXJhdG9yICgpKF9UcCYgX19wLCBfQXJnIF9feCkgY29uc3QgeyAoX19wLipfTV9mKShfX3gpOyB9Ci0KLXByaXZhdGU6Ci0gIF9fZnVuX3R5cGUgX01fZjsKLX07Ci0KLXRlbXBsYXRlPGNsYXNzIF9UcD4KLWNsYXNzIF9Wb2lkX2NvbnN0X21lbV9mdW4wX3JlZiA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxjb25zdCBfVHAmLHZvaWQ+IHsKLXByb3RlY3RlZDoKLSAgdHlwZWRlZiB2b2lkIChfVHA6OipfX2Z1bl90eXBlKSAoKSBjb25zdDsKLSAgZXhwbGljaXQgX1ZvaWRfY29uc3RfbWVtX2Z1bjBfcmVmKF9fZnVuX3R5cGUgX19mKSA6IF9NX2YoX19mKSB7fQotCi1wdWJsaWM6Ci0gIHZvaWQgb3BlcmF0b3IgKCkoY29uc3QgX1RwJiBfX3ApIGNvbnN0IHsgKF9fcC4qX01fZikoKTsgfQotCi1wcml2YXRlOgotICBfX2Z1bl90eXBlIF9NX2Y7Ci19OwotCi10ZW1wbGF0ZTxjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+Ci1jbGFzcyBfVm9pZF9jb25zdF9tZW1fZnVuMV9yZWYgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPGNvbnN0IF9UcCYsX0FyZyx2b2lkPiB7Ci1wcm90ZWN0ZWQ6Ci0gIHR5cGVkZWYgdm9pZCAoX1RwOjoqX19mdW5fdHlwZSkgKF9BcmcpIGNvbnN0OwotICBleHBsaWNpdCBfVm9pZF9jb25zdF9tZW1fZnVuMV9yZWYoX19mdW5fdHlwZSBfX2YpIDogX01fZihfX2YpIHt9Ci0KLXB1YmxpYzoKLSAgdm9pZCBvcGVyYXRvciAoKShjb25zdCBfVHAmIF9fcCwgX0FyZyBfX3gpIGNvbnN0IHsgKF9fcC4qX01fZikoX194KTsgfQotCi1wcml2YXRlOgotICBfX2Z1bl90eXBlIF9NX2Y7Ci19OwotCi1fU1RMUF9URU1QTEFURV9OVUxMCi1zdHJ1Y3QgX01lbV9mdW5fdHJhaXRzPHZvaWQ+IHsKLSAgdGVtcGxhdGU8Y2xhc3MgX1RwPiBzdHJ1Y3QgX0FyZ3MwIHsKLSAgICB0eXBlZGVmIF9Wb2lkX21lbV9mdW4wX3B0cjxfVHA+ICAgICAgICAgICAgIF9QdHI7Ci0gICAgdHlwZWRlZiBfVm9pZF9jb25zdF9tZW1fZnVuMF9wdHI8X1RwPiAgICAgICBfUHRyX2NvbnN0OwotICAgIHR5cGVkZWYgX1ZvaWRfbWVtX2Z1bjBfcmVmPF9UcD4gICAgICAgICAgICAgX1JlZjsKLSAgICB0eXBlZGVmIF9Wb2lkX2NvbnN0X21lbV9mdW4wX3JlZjxfVHA+ICAgICAgIF9SZWZfY29uc3Q7Ci0gIH07Ci0KLSAgdGVtcGxhdGU8Y2xhc3MgX1RwLCBjbGFzcyBfQXJnPiBzdHJ1Y3QgX0FyZ3MxIHsKLSAgICB0eXBlZGVmIF9Wb2lkX21lbV9mdW4xX3B0cjxfVHAsX0FyZz4gICAgICAgIF9QdHI7Ci0gICAgdHlwZWRlZiBfVm9pZF9jb25zdF9tZW1fZnVuMV9wdHI8X1RwLF9Bcmc+ICBfUHRyX2NvbnN0OwotICAgIHR5cGVkZWYgX1ZvaWRfbWVtX2Z1bjFfcmVmPF9UcCxfQXJnPiAgICAgICAgX1JlZjsKLSAgICB0eXBlZGVmIF9Wb2lkX2NvbnN0X21lbV9mdW4xX3JlZjxfVHAsX0FyZz4gIF9SZWZfY29uc3Q7Ci0gIH07Ci19OwotCi10ZW1wbGF0ZTxjbGFzcyBfQXJnPgotY2xhc3MgX1B0cl92b2lkX2Z1bjFfYmFzZSA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxfQXJnLCB2b2lkPiB7Ci1wcm90ZWN0ZWQ6Ci0gIHR5cGVkZWYgdm9pZCAoKl9fZnVuX3R5cGUpIChfQXJnKTsKLSAgZXhwbGljaXQgX1B0cl92b2lkX2Z1bjFfYmFzZShfX2Z1bl90eXBlIF9fZikgOiBfTV9mKF9fZikge30KLQotcHVibGljOgotICB2b2lkIG9wZXJhdG9yKCkoX0FyZyBfX3gpIGNvbnN0IHsgX01fZihfX3gpOyB9Ci0KLXByaXZhdGU6Ci0gIF9fZnVuX3R5cGUgX01fZjsKLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQXJnMSwgY2xhc3MgX0FyZzI+Ci1jbGFzcyBfUHRyX3ZvaWRfZnVuMl9iYXNlIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfQXJnMSxfQXJnMix2b2lkPiB7Ci1wcm90ZWN0ZWQ6Ci0gIHR5cGVkZWYgdm9pZCAoKl9fZnVuX3R5cGUpIChfQXJnMSwgX0FyZzIpOwotICBleHBsaWNpdCBfUHRyX3ZvaWRfZnVuMl9iYXNlKF9fZnVuX3R5cGUgX19mKSA6IF9NX2YoX19mKSB7fQotCi1wdWJsaWM6Ci0gIHZvaWQgb3BlcmF0b3IoKShfQXJnMSBfX3gsIF9BcmcyIF9feSkgY29uc3QgeyBfTV9mKF9feCwgX195KTsgfQotCi1wcml2YXRlOgotICBfX2Z1bl90eXBlIF9NX2Y7Ci19OwotCi1fU1RMUF9URU1QTEFURV9OVUxMCi1zdHJ1Y3QgX1B0cl9mdW5fdHJhaXRzPHZvaWQ+IHsKLSAgdGVtcGxhdGU8Y2xhc3MgX0FyZz4gc3RydWN0IF9BcmdzMSB7Ci0gICAgdHlwZWRlZiBfUHRyX3ZvaWRfZnVuMV9iYXNlPF9Bcmc+IF9GdW47Ci0gIH07Ci0KLSAgdGVtcGxhdGU8Y2xhc3MgX0FyZzEsIGNsYXNzIF9BcmcyPiBzdHJ1Y3QgX0FyZ3MyIHsKLSAgICB0eXBlZGVmIF9QdHJfdm9pZF9mdW4yX2Jhc2U8X0FyZzEsX0FyZzI+IF9GdW47Ci0gIH07Ci19OwotCi0vLyBwYXZlbDogbmVlZCBleHRyYSBsZXZlbCBvZiBpbmhlcml0YW5jZSBoZXJlIHNpbmNlIE1TVkMrKyBkb2VzIG5vdAotLy8gYWNjZXB0IHRyYWl0cy1iYXNlZCBmYWtlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gZm9yIHRlbXBsYXRlCi0vLyBhcmd1bWVudHMgb3RoZXIgdGhhbiBmaXJzdAotCi10ZW1wbGF0ZTxjbGFzcyBfUmVzdWx0LCBjbGFzcyBfQXJnPgotY2xhc3MgX1B0cl9mdW4xIDoKLSAgcHVibGljIF9QdHJfZnVuX3RyYWl0czxfUmVzdWx0Pjo6X1NUTFBfVEVNUExBVEUgX0FyZ3MxPF9Bcmc+OjpfRnVuIHsKLXByb3RlY3RlZDoKLSAgdHlwZWRlZiB0eXBlbmFtZSBfUHRyX2Z1bl90cmFpdHM8X1Jlc3VsdD46Ol9TVExQX1RFTVBMQVRFIF9BcmdzMTxfQXJnPjo6X0Z1biBfQmFzZTsKLSAgZXhwbGljaXQgX1B0cl9mdW4xKHR5cGVuYW1lIF9CYXNlOjpfX2Z1bl90eXBlIF9fZikgOiBfQmFzZShfX2YpIHt9Ci19OwotCi10ZW1wbGF0ZTxjbGFzcyBfUmVzdWx0LCBjbGFzcyBfQXJnMSwgY2xhc3MgX0FyZzI+Ci1jbGFzcyBfUHRyX2Z1bjIgOgotICBwdWJsaWMgX1B0cl9mdW5fdHJhaXRzPF9SZXN1bHQ+OjpfU1RMUF9URU1QTEFURSBfQXJnczI8X0FyZzEsX0FyZzI+OjpfRnVuIHsKLXByb3RlY3RlZDoKLSAgdHlwZWRlZiB0eXBlbmFtZSBfUHRyX2Z1bl90cmFpdHM8X1Jlc3VsdD46Ol9TVExQX1RFTVBMQVRFIF9BcmdzMjxfQXJnMSxfQXJnMj46Ol9GdW4gX0Jhc2U7Ci0gIGV4cGxpY2l0IF9QdHJfZnVuMih0eXBlbmFtZSBfQmFzZTo6X19mdW5fdHlwZSBfX2YpIDogX0Jhc2UoX19mKSB7fQotfTsKLQotCi0jZW5kaWYgLypfU1RMUF9ET05UX1JFVFVSTl9WT0lEICYmIF9TVExQX05PX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04gJiYgX1NUTFBfTUVNQkVSX1RFTVBMQVRFX0NMQVNTRVMqLwotCi0KLSNpZiAhZGVmaW5lZChfU1RMUF9ET05UX1JFVFVSTl9WT0lEKSB8fCAhZGVmaW5lZChfU1RMUF9OT19DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKSB8fCAhZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFX0NMQVNTRVMpCi0KLXRlbXBsYXRlIDxjbGFzcyBfUmV0LCBjbGFzcyBfVHA+Ci1jbGFzcyBtZW1fZnVuX3QgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248X1RwKixfUmV0PiB7Ci0gIHR5cGVkZWYgX1JldCAoX1RwOjoqX19mdW5fdHlwZSkodm9pZCk7Ci1wdWJsaWM6Ci0gIGV4cGxpY2l0IG1lbV9mdW5fdChfX2Z1bl90eXBlIF9fcGYpIDogX01fZihfX3BmKSB7fQotICBfUmV0IG9wZXJhdG9yKCkoX1RwKiBfX3ApIGNvbnN0IHsgcmV0dXJuIChfX3AtPipfTV9mKSgpOyB9Ci1wcml2YXRlOgotICBfX2Z1bl90eXBlIF9NX2Y7Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgX1JldCwgY2xhc3MgX1RwPgotY2xhc3MgY29uc3RfbWVtX2Z1bl90IDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPGNvbnN0IF9UcCosX1JldD4gewotICB0eXBlZGVmIF9SZXQgKF9UcDo6Kl9fZnVuX3R5cGUpKHZvaWQpIGNvbnN0OwotcHVibGljOgotICBleHBsaWNpdCBjb25zdF9tZW1fZnVuX3QoX19mdW5fdHlwZSBfX3BmKSA6IF9NX2YoX19wZikge30KLSAgX1JldCBvcGVyYXRvcigpKGNvbnN0IF9UcCogX19wKSBjb25zdCB7IHJldHVybiAoX19wLT4qX01fZikoKTsgfQotcHJpdmF0ZToKLSAgX19mdW5fdHlwZSBfTV9mOwotfTsKLQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1JldCwgY2xhc3MgX1RwPgotY2xhc3MgbWVtX2Z1bl9yZWZfdCA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxfVHAsX1JldD4gewotICB0eXBlZGVmIF9SZXQgKF9UcDo6Kl9fZnVuX3R5cGUpKHZvaWQpOwotcHVibGljOgotICBleHBsaWNpdCBtZW1fZnVuX3JlZl90KF9fZnVuX3R5cGUgX19wZikgOiBfTV9mKF9fcGYpIHt9Ci0gIF9SZXQgb3BlcmF0b3IoKShfVHAmIF9fcikgY29uc3QgeyByZXR1cm4gKF9fci4qX01fZikoKTsgfQotcHJpdmF0ZToKLSAgX19mdW5fdHlwZSBfTV9mOwotfTsKLQotdGVtcGxhdGUgPGNsYXNzIF9SZXQsIGNsYXNzIF9UcD4KLWNsYXNzIGNvbnN0X21lbV9mdW5fcmVmX3QgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248X1RwLF9SZXQ+IHsKLSAgdHlwZWRlZiBfUmV0IChfVHA6OipfX2Z1bl90eXBlKSh2b2lkKSBjb25zdDsKLXB1YmxpYzoKLSAgZXhwbGljaXQgY29uc3RfbWVtX2Z1bl9yZWZfdChfX2Z1bl90eXBlIF9fcGYpIDogX01fZihfX3BmKSB7fQotICBfUmV0IG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3IpIGNvbnN0IHsgcmV0dXJuIChfX3IuKl9NX2YpKCk7IH0KLXByaXZhdGU6Ci0gIF9fZnVuX3R5cGUgX01fZjsKLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBfUmV0LCBjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+Ci1jbGFzcyBtZW1fZnVuMV90IDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAqLF9BcmcsX1JldD4gewotICB0eXBlZGVmIF9SZXQgKF9UcDo6Kl9fZnVuX3R5cGUpKF9BcmcpOwotcHVibGljOgotICBleHBsaWNpdCBtZW1fZnVuMV90KF9fZnVuX3R5cGUgX19wZikgOiBfTV9mKF9fcGYpIHt9Ci0gIF9SZXQgb3BlcmF0b3IoKShfVHAqIF9fcCwgX0FyZyBfX3gpIGNvbnN0IHsgcmV0dXJuIChfX3AtPipfTV9mKShfX3gpOyB9Ci1wcml2YXRlOgotICBfX2Z1bl90eXBlIF9NX2Y7Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgX1JldCwgY2xhc3MgX1RwLCBjbGFzcyBfQXJnPgotY2xhc3MgY29uc3RfbWVtX2Z1bjFfdCA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248Y29uc3QgX1RwKixfQXJnLF9SZXQ+IHsKLSAgdHlwZWRlZiBfUmV0IChfVHA6OipfX2Z1bl90eXBlKShfQXJnKSBjb25zdDsKLXB1YmxpYzoKLSAgZXhwbGljaXQgY29uc3RfbWVtX2Z1bjFfdChfX2Z1bl90eXBlIF9fcGYpIDogX01fZihfX3BmKSB7fQotICBfUmV0IG9wZXJhdG9yKCkoY29uc3QgX1RwKiBfX3AsIF9BcmcgX194KSBjb25zdAotICAgIHsgcmV0dXJuIChfX3AtPipfTV9mKShfX3gpOyB9Ci1wcml2YXRlOgotICBfX2Z1bl90eXBlIF9NX2Y7Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgX1JldCwgY2xhc3MgX1RwLCBjbGFzcyBfQXJnPgotY2xhc3MgbWVtX2Z1bjFfcmVmX3QgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCxfQXJnLF9SZXQ+IHsKLSAgdHlwZWRlZiBfUmV0IChfVHA6OipfX2Z1bl90eXBlKShfQXJnKTsKLXB1YmxpYzoKLSAgZXhwbGljaXQgbWVtX2Z1bjFfcmVmX3QoX19mdW5fdHlwZSBfX3BmKSA6IF9NX2YoX19wZikge30KLSAgX1JldCBvcGVyYXRvcigpKF9UcCYgX19yLCBfQXJnIF9feCkgY29uc3QgeyByZXR1cm4gKF9fci4qX01fZikoX194KTsgfQotcHJpdmF0ZToKLSAgX19mdW5fdHlwZSBfTV9mOwotfTsKLQotdGVtcGxhdGUgPGNsYXNzIF9SZXQsIGNsYXNzIF9UcCwgY2xhc3MgX0FyZz4KLWNsYXNzIGNvbnN0X21lbV9mdW4xX3JlZl90IDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAsX0FyZyxfUmV0PiB7Ci0gIHR5cGVkZWYgX1JldCAoX1RwOjoqX19mdW5fdHlwZSkoX0FyZykgY29uc3Q7Ci1wdWJsaWM6Ci0gIGV4cGxpY2l0IGNvbnN0X21lbV9mdW4xX3JlZl90KF9fZnVuX3R5cGUgX19wZikgOiBfTV9mKF9fcGYpIHt9Ci0gIF9SZXQgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9fciwgX0FyZyBfX3gpIGNvbnN0IHsgcmV0dXJuIChfX3IuKl9NX2YpKF9feCk7IH0KLXByaXZhdGU6Ci0gIF9fZnVuX3R5cGUgX01fZjsKLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQXJnLCBjbGFzcyBfUmVzdWx0PgotY2xhc3MgcG9pbnRlcl90b191bmFyeV9mdW5jdGlvbiA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxfQXJnLCBfUmVzdWx0PiB7Ci1wcm90ZWN0ZWQ6Ci0gIF9SZXN1bHQgKCpfTV9wdHIpKF9BcmcpOwotcHVibGljOgotICBwb2ludGVyX3RvX3VuYXJ5X2Z1bmN0aW9uKCkge30KLSAgZXhwbGljaXQgcG9pbnRlcl90b191bmFyeV9mdW5jdGlvbihfUmVzdWx0ICgqX194KShfQXJnKSkgOiBfTV9wdHIoX194KSB7fQotICBfUmVzdWx0IG9wZXJhdG9yKCkoX0FyZyBfX3gpIGNvbnN0IHsgcmV0dXJuIF9NX3B0cihfX3gpOyB9Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgX0FyZzEsIGNsYXNzIF9BcmcyLCBjbGFzcyBfUmVzdWx0PgotY2xhc3MgcG9pbnRlcl90b19iaW5hcnlfZnVuY3Rpb24gOgotICBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9BcmcxLF9BcmcyLF9SZXN1bHQ+IHsKLXByb3RlY3RlZDoKLSAgICBfUmVzdWx0ICgqX01fcHRyKShfQXJnMSwgX0FyZzIpOwotcHVibGljOgotICAgIHBvaW50ZXJfdG9fYmluYXJ5X2Z1bmN0aW9uKCkge30KLSAgICBleHBsaWNpdCBwb2ludGVyX3RvX2JpbmFyeV9mdW5jdGlvbihfUmVzdWx0ICgqX194KShfQXJnMSwgX0FyZzIpKQotICAgICAgOiBfTV9wdHIoX194KSB7fQotICAgIF9SZXN1bHQgb3BlcmF0b3IoKShfQXJnMSBfX3gsIF9BcmcyIF9feSkgY29uc3QgewotICAgICAgcmV0dXJuIF9NX3B0cihfX3gsIF9feSk7Ci0gICAgfQotfTsKLQotCi0jaWYgZGVmaW5lZChfU1RMUF9ET05UX1JFVFVSTl9WT0lEKSAmJiAhZGVmaW5lZChfU1RMUF9OT19DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQotLy9QYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGZvciB0aGUgdm9pZCB0eXBlCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotY2xhc3MgbWVtX2Z1bl90PHZvaWQsIF9UcD4gOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248X1RwKix2b2lkPiB7Ci0gIHR5cGVkZWYgdm9pZCAoX1RwOjoqX19mdW5fdHlwZSkodm9pZCk7Ci1wdWJsaWM6Ci0gIGV4cGxpY2l0IG1lbV9mdW5fdCBfU1RMUF9QU1BFQzIodm9pZCxfVHApIChfX2Z1bl90eXBlIF9fcGYpIDogX01fZihfX3BmKSB7fQotICB2b2lkIG9wZXJhdG9yKCkoX1RwKiBfX3ApIGNvbnN0IHsgKF9fcC0+Kl9NX2YpKCk7IH0KLXByaXZhdGU6Ci0gIF9fZnVuX3R5cGUgX01fZjsKLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1jbGFzcyBjb25zdF9tZW1fZnVuX3Q8dm9pZCwgX1RwPiA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxjb25zdCBfVHAqLHZvaWQ+IHsKLSAgdHlwZWRlZiB2b2lkIChfVHA6OipfX2Z1bl90eXBlKSh2b2lkKSBjb25zdDsKLXB1YmxpYzoKLSAgZXhwbGljaXQgY29uc3RfbWVtX2Z1bl90IF9TVExQX1BTUEVDMih2b2lkLF9UcCkgKF9fZnVuX3R5cGUgX19wZikgOiBfTV9mKF9fcGYpIHt9Ci0gIHZvaWQgb3BlcmF0b3IoKShjb25zdCBfVHAqIF9fcCkgY29uc3QgeyAoX19wLT4qX01fZikoKTsgfQotcHJpdmF0ZToKLSAgX19mdW5fdHlwZSBfTV9mOwotfTsKLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWNsYXNzIG1lbV9mdW5fcmVmX3Q8dm9pZCwgX1RwPiA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxfVHAsdm9pZD4gewotICB0eXBlZGVmIHZvaWQgKF9UcDo6Kl9fZnVuX3R5cGUpKHZvaWQpOwotcHVibGljOgotICBleHBsaWNpdCBtZW1fZnVuX3JlZl90IF9TVExQX1BTUEVDMih2b2lkLF9UcCkgKF9fZnVuX3R5cGUgX19wZikgOiBfTV9mKF9fcGYpIHt9Ci0gIHZvaWQgb3BlcmF0b3IoKShfVHAmIF9fcikgY29uc3QgeyAoX19yLipfTV9mKSgpOyB9Ci1wcml2YXRlOgotICBfX2Z1bl90eXBlIF9NX2Y7Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotY2xhc3MgY29uc3RfbWVtX2Z1bl9yZWZfdDx2b2lkLCBfVHA+IDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPF9UcCx2b2lkPiB7Ci0gIHR5cGVkZWYgdm9pZCAoX1RwOjoqX19mdW5fdHlwZSkodm9pZCkgY29uc3Q7Ci1wdWJsaWM6Ci0gIGV4cGxpY2l0IGNvbnN0X21lbV9mdW5fcmVmX3QgX1NUTFBfUFNQRUMyKHZvaWQsX1RwKSAoX19mdW5fdHlwZSBfX3BmKSA6IF9NX2YoX19wZikge30KLSAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX19yKSBjb25zdCB7IChfX3IuKl9NX2YpKCk7IH0KLXByaXZhdGU6Ci0gIF9fZnVuX3R5cGUgX01fZjsKLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+Ci1jbGFzcyBtZW1fZnVuMV90PHZvaWQsIF9UcCwgX0FyZz4gOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCosX0FyZyx2b2lkPiB7Ci0gIHR5cGVkZWYgdm9pZCAoX1RwOjoqX19mdW5fdHlwZSkoX0FyZyk7Ci1wdWJsaWM6Ci0gIGV4cGxpY2l0IG1lbV9mdW4xX3QgX1NUTFBfUFNQRUMzKHZvaWQsX1RwLF9BcmcpIChfX2Z1bl90eXBlIF9fcGYpIDogX01fZihfX3BmKSB7fQotICB2b2lkIG9wZXJhdG9yKCkoX1RwKiBfX3AsIF9BcmcgX194KSBjb25zdCB7IChfX3AtPipfTV9mKShfX3gpOyB9Ci1wcml2YXRlOgotICBfX2Z1bl90eXBlIF9NX2Y7Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQXJnPgotY2xhc3MgY29uc3RfbWVtX2Z1bjFfdDx2b2lkLCBfVHAsIF9Bcmc+Ci0gIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxjb25zdCBfVHAqLF9Bcmcsdm9pZD4gewotICB0eXBlZGVmIHZvaWQgKF9UcDo6Kl9fZnVuX3R5cGUpKF9BcmcpIGNvbnN0OwotcHVibGljOgotICBleHBsaWNpdCBjb25zdF9tZW1fZnVuMV90IF9TVExQX1BTUEVDMyh2b2lkLF9UcCxfQXJnKSAoX19mdW5fdHlwZSBfX3BmKSA6IF9NX2YoX19wZikge30KLSAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IF9UcCogX19wLCBfQXJnIF9feCkgY29uc3QgeyAoX19wLT4qX01fZikoX194KTsgfQotcHJpdmF0ZToKLSAgX19mdW5fdHlwZSBfTV9mOwotfTsKLQotdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FyZz4KLWNsYXNzIG1lbV9mdW4xX3JlZl90PHZvaWQsIF9UcCwgX0FyZz4KLSAgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCxfQXJnLHZvaWQ+IHsKLSAgdHlwZWRlZiB2b2lkIChfVHA6OipfX2Z1bl90eXBlKShfQXJnKTsKLXB1YmxpYzoKLSAgZXhwbGljaXQgbWVtX2Z1bjFfcmVmX3QgX1NUTFBfUFNQRUMzKHZvaWQsX1RwLF9BcmcpIChfX2Z1bl90eXBlIF9fcGYpIDogX01fZihfX3BmKSB7fQotICB2b2lkIG9wZXJhdG9yKCkoX1RwJiBfX3IsIF9BcmcgX194KSBjb25zdCB7IChfX3IuKl9NX2YpKF9feCk7IH0KLXByaXZhdGU6Ci0gIF9fZnVuX3R5cGUgX01fZjsKLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+Ci1jbGFzcyBjb25zdF9tZW1fZnVuMV9yZWZfdDx2b2lkLCBfVHAsIF9Bcmc+Ci0gIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAsX0FyZyx2b2lkPiB7Ci0gIHR5cGVkZWYgdm9pZCAoX1RwOjoqX19mdW5fdHlwZSkoX0FyZykgY29uc3Q7Ci1wdWJsaWM6Ci0gIGV4cGxpY2l0IGNvbnN0X21lbV9mdW4xX3JlZl90IF9TVExQX1BTUEVDMyh2b2lkLF9UcCxfQXJnKSAoX19mdW5fdHlwZSBfX3BmKSA6IF9NX2YoX19wZikge30KLSAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX19yLCBfQXJnIF9feCkgY29uc3QgeyAoX19yLipfTV9mKShfX3gpOyB9Ci1wcml2YXRlOgotICBfX2Z1bl90eXBlIF9NX2Y7Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgX0FyZz4KLWNsYXNzIHBvaW50ZXJfdG9fdW5hcnlfZnVuY3Rpb248X0FyZywgdm9pZD4gOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248X0FyZywgdm9pZD4gewotICB0eXBlZGVmIHZvaWQgKCpfX2Z1bl90eXBlKShfQXJnKTsKLSAgX19mdW5fdHlwZSBfTV9wdHI7Ci1wdWJsaWM6Ci0gIHBvaW50ZXJfdG9fdW5hcnlfZnVuY3Rpb24oKSB7fQotICBleHBsaWNpdCBwb2ludGVyX3RvX3VuYXJ5X2Z1bmN0aW9uKF9fZnVuX3R5cGUgX194KSA6IF9NX3B0cihfX3gpIHt9Ci0gIHZvaWQgb3BlcmF0b3IoKShfQXJnIF9feCkgY29uc3QgeyBfTV9wdHIoX194KTsgfQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIF9BcmcxLCBjbGFzcyBfQXJnMj4KLWNsYXNzIHBvaW50ZXJfdG9fYmluYXJ5X2Z1bmN0aW9uPF9BcmcxLCBfQXJnMiwgdm9pZD4gOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9BcmcxLF9BcmcyLHZvaWQ+IHsKLSAgdHlwZWRlZiB2b2lkICgqX19mdW5fdHlwZSkoX0FyZzEsIF9BcmcyKTsKLSAgX19mdW5fdHlwZSBfTV9wdHI7Ci1wdWJsaWM6Ci0gIHBvaW50ZXJfdG9fYmluYXJ5X2Z1bmN0aW9uKCkge30KLSAgZXhwbGljaXQgcG9pbnRlcl90b19iaW5hcnlfZnVuY3Rpb24oX19mdW5fdHlwZSBfX3gpIDogX01fcHRyKF9feCkge30KLSAgdm9pZCBvcGVyYXRvcigpKF9BcmcxIF9feCwgX0FyZzIgX195KSBjb25zdCB7IF9NX3B0cihfX3gsIF9feSk7IH0KLX07Ci0KLSNlbmRpZiAvKl9TVExQX0RPTlRfUkVUVVJOX1ZPSUQgJiYgIV9TVExQX05PX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04qLwotCi0jZWxzZSAvKiFfU1RMUF9ET05UX1JFVFVSTl9WT0lEIHx8ICFfU1RMUF9OT19DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OIHx8ICFfU1RMUF9NRU1CRVJfVEVNUExBVEVfQ0xBU1NFUyovCi0KLS8vbWVtX2Z1bl90Ci10ZW1wbGF0ZSA8Y2xhc3MgX1Jlc3VsdCwgY2xhc3MgX1RwPgotY2xhc3MgbWVtX2Z1bl90IDoKLSAgcHVibGljIF9NZW1fZnVuX3RyYWl0czxfUmVzdWx0Pjo6X1NUTFBfVEVNUExBVEUgX0FyZ3MwPF9UcD46Ol9QdHIgewotICB0eXBlZGVmIHR5cGVuYW1lCi0gICAgX01lbV9mdW5fdHJhaXRzPF9SZXN1bHQ+OjpfU1RMUF9URU1QTEFURSBfQXJnczA8X1RwPjo6X1B0ciBfQmFzZTsKLXB1YmxpYzoKLSAgZXhwbGljaXQgbWVtX2Z1bl90KHR5cGVuYW1lIF9CYXNlOjpfX2Z1bl90eXBlIF9fZikgOiBfQmFzZShfX2YpIHt9Ci19OwotCi0vL2NvbnN0X21lbV9mdW5fdAotdGVtcGxhdGUgPGNsYXNzIF9SZXN1bHQsIGNsYXNzIF9UcD4KLWNsYXNzIGNvbnN0X21lbV9mdW5fdCA6Ci0gIHB1YmxpYyBfTWVtX2Z1bl90cmFpdHM8X1Jlc3VsdD46Ol9TVExQX1RFTVBMQVRFIF9BcmdzMDxfVHA+OjpfUHRyX2NvbnN0IHsKLSAgdHlwZWRlZiB0eXBlbmFtZQotICAgIF9NZW1fZnVuX3RyYWl0czxfUmVzdWx0Pjo6X1NUTFBfVEVNUExBVEUgX0FyZ3MwPF9UcD46Ol9QdHJfY29uc3QgX0Jhc2U7Ci1wdWJsaWM6Ci0gIGV4cGxpY2l0IGNvbnN0X21lbV9mdW5fdCh0eXBlbmFtZSBfQmFzZTo6X19mdW5fdHlwZSBfX2YpIDogX0Jhc2UoX19mKSB7fQotfTsKLQotLy9tZW1fZnVuX3JlZl90Ci10ZW1wbGF0ZSA8Y2xhc3MgX1Jlc3VsdCwgY2xhc3MgX1RwPgotY2xhc3MgbWVtX2Z1bl9yZWZfdCA6Ci0gIHB1YmxpYyBfTWVtX2Z1bl90cmFpdHM8X1Jlc3VsdD46Ol9TVExQX1RFTVBMQVRFIF9BcmdzMDxfVHA+OjpfUmVmIHsKLSAgdHlwZWRlZiB0eXBlbmFtZQotICAgIF9NZW1fZnVuX3RyYWl0czxfUmVzdWx0Pjo6X1NUTFBfVEVNUExBVEUgX0FyZ3MwPF9UcD46Ol9SZWYgX0Jhc2U7Ci1wdWJsaWM6Ci0gIGV4cGxpY2l0IG1lbV9mdW5fcmVmX3QodHlwZW5hbWUgX0Jhc2U6Ol9fZnVuX3R5cGUgX19mKSA6IF9CYXNlKF9fZikge30KLX07Ci0KLS8vY29uc3RfbWVtX2Z1bl9yZWZfdAotdGVtcGxhdGUgPGNsYXNzIF9SZXN1bHQsIGNsYXNzIF9UcD4KLWNsYXNzIGNvbnN0X21lbV9mdW5fcmVmX3QgOgotICBwdWJsaWMgX01lbV9mdW5fdHJhaXRzPF9SZXN1bHQ+OjpfU1RMUF9URU1QTEFURSBfQXJnczA8X1RwPjo6X1JlZl9jb25zdCB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUKLSAgICBfTWVtX2Z1bl90cmFpdHM8X1Jlc3VsdD46Ol9TVExQX1RFTVBMQVRFIF9BcmdzMDxfVHA+OjpfUmVmX2NvbnN0IF9CYXNlOwotcHVibGljOgotICBleHBsaWNpdCBjb25zdF9tZW1fZnVuX3JlZl90KHR5cGVuYW1lIF9CYXNlOjpfX2Z1bl90eXBlIF9fZikgOiBfQmFzZShfX2YpIHt9Ci19OwotCi0vL21lbV9mdW4xX3QKLXRlbXBsYXRlIDxjbGFzcyBfUmVzdWx0LCBjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+Ci1jbGFzcyBtZW1fZnVuMV90IDoKLSAgcHVibGljIF9NZW1fZnVuX3RyYWl0czxfUmVzdWx0Pjo6X1NUTFBfVEVNUExBVEUgX0FyZ3MxPF9UcCxfQXJnPjo6X1B0ciB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUKLSAgICBfTWVtX2Z1bl90cmFpdHM8X1Jlc3VsdD46Ol9TVExQX1RFTVBMQVRFIF9BcmdzMTxfVHAsX0FyZz46Ol9QdHIgX0Jhc2U7Ci1wdWJsaWM6Ci0gIGV4cGxpY2l0IG1lbV9mdW4xX3QodHlwZW5hbWUgX0Jhc2U6Ol9fZnVuX3R5cGUgX19mKSA6IF9CYXNlKF9fZikge30KLX07Ci0KLS8vY29uc3RfbWVtX2Z1bjFfdAotdGVtcGxhdGUgPGNsYXNzIF9SZXN1bHQsIGNsYXNzIF9UcCwgY2xhc3MgX0FyZz4KLWNsYXNzIGNvbnN0X21lbV9mdW4xX3QgOgotICBwdWJsaWMgX01lbV9mdW5fdHJhaXRzPF9SZXN1bHQ+OjpfU1RMUF9URU1QTEFURSBfQXJnczE8X1RwLF9Bcmc+OjpfUHRyX2NvbnN0IHsKLSAgdHlwZWRlZiB0eXBlbmFtZQotICAgIF9NZW1fZnVuX3RyYWl0czxfUmVzdWx0Pjo6X1NUTFBfVEVNUExBVEUgX0FyZ3MxPF9UcCxfQXJnPjo6X1B0cl9jb25zdCBfQmFzZTsKLXB1YmxpYzoKLSAgZXhwbGljaXQgY29uc3RfbWVtX2Z1bjFfdCh0eXBlbmFtZSBfQmFzZTo6X19mdW5fdHlwZSBfX2YpIDogX0Jhc2UoX19mKSB7fQotfTsKLQotLy9tZW1fZnVuMV9yZWZfdAotdGVtcGxhdGUgPGNsYXNzIF9SZXN1bHQsIGNsYXNzIF9UcCwgY2xhc3MgX0FyZz4KLWNsYXNzIG1lbV9mdW4xX3JlZl90IDoKLSAgcHVibGljIF9NZW1fZnVuX3RyYWl0czxfUmVzdWx0Pjo6X1NUTFBfVEVNUExBVEUgX0FyZ3MxPF9UcCxfQXJnPjo6X1JlZiB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUKLSAgICBfTWVtX2Z1bl90cmFpdHM8X1Jlc3VsdD46Ol9TVExQX1RFTVBMQVRFIF9BcmdzMTxfVHAsX0FyZz46Ol9SZWYgX0Jhc2U7Ci1wdWJsaWM6Ci0gIGV4cGxpY2l0IG1lbV9mdW4xX3JlZl90KHR5cGVuYW1lIF9CYXNlOjpfX2Z1bl90eXBlIF9fZikgOiBfQmFzZShfX2YpIHt9Ci19OwotCi0vL2NvbnN0X21lbV9mdW4xX3QKLXRlbXBsYXRlIDxjbGFzcyBfUmVzdWx0LCBjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+Ci1jbGFzcyBjb25zdF9tZW1fZnVuMV9yZWZfdCA6Ci0gIHB1YmxpYyBfTWVtX2Z1bl90cmFpdHM8X1Jlc3VsdD46Ol9TVExQX1RFTVBMQVRFIF9BcmdzMTxfVHAsX0FyZz46Ol9SZWZfY29uc3QgewotICB0eXBlZGVmIHR5cGVuYW1lCi0gICAgX01lbV9mdW5fdHJhaXRzPF9SZXN1bHQ+OjpfU1RMUF9URU1QTEFURSBfQXJnczE8X1RwLF9Bcmc+OjpfUmVmX2NvbnN0IF9CYXNlOwotcHVibGljOgotICBleHBsaWNpdCBjb25zdF9tZW1fZnVuMV9yZWZfdCh0eXBlbmFtZSBfQmFzZTo6X19mdW5fdHlwZSBfX2YpIDogX0Jhc2UoX19mKSB7fQotfTsKLQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0FyZywgY2xhc3MgX1Jlc3VsdD4KLWNsYXNzIHBvaW50ZXJfdG9fdW5hcnlfZnVuY3Rpb24gOgotcHVibGljIF9QdHJfZnVuMTxfUmVzdWx0LF9Bcmc+IHsKLSAgdHlwZWRlZiB0eXBlbmFtZQotICAgIF9QdHJfZnVuMTxfUmVzdWx0LF9Bcmc+OjpfX2Z1bl90eXBlIF9fZnVuX3R5cGU7Ci1wdWJsaWM6Ci0gIGV4cGxpY2l0IHBvaW50ZXJfdG9fdW5hcnlfZnVuY3Rpb24oX19mdW5fdHlwZSBfX2YpCi0gICAgOiBfUHRyX2Z1bjE8X1Jlc3VsdCxfQXJnPihfX2YpIHt9Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgX0FyZzEsIGNsYXNzIF9BcmcyLCBjbGFzcyBfUmVzdWx0PgotY2xhc3MgcG9pbnRlcl90b19iaW5hcnlfZnVuY3Rpb24gOgotcHVibGljIF9QdHJfZnVuMjxfUmVzdWx0LF9BcmcxLF9BcmcyPiB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUKLSAgICBfUHRyX2Z1bjI8X1Jlc3VsdCxfQXJnMSxfQXJnMj46Ol9fZnVuX3R5cGUgX19mdW5fdHlwZTsKLXB1YmxpYzoKLSAgZXhwbGljaXQgcG9pbnRlcl90b19iaW5hcnlfZnVuY3Rpb24oX19mdW5fdHlwZSBfX2YpCi0gICAgOiBfUHRyX2Z1bjI8X1Jlc3VsdCxfQXJnMSxfQXJnMj4oX19mKSB7fQotfTsKLQotI2VuZGlmIC8qIV9TVExQX0RPTlRfUkVUVVJOX1ZPSUQgfHwgIV9TVExQX05PX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04gfHwgIV9TVExQX01FTUJFUl9URU1QTEFURV9DTEFTU0VTKi8KLQotCi0jIGlmICFkZWZpbmVkIChfU1RMUF9NRU1CRVJfUE9JTlRFUl9QQVJBTV9CVUcpCi0vLyBNZW1fZnVuIGFkYXB0b3IgaGVscGVyIGZ1bmN0aW9ucy4gIFRoZXJlIGFyZSBvbmx5IHR3bzoKLS8vICBtZW1fZnVuIGFuZCBtZW1fZnVuX3JlZi4gIChtZW1fZnVuMSBhbmQgbWVtX2Z1bjFfcmVmCi0vLyAgYXJlIHByb3ZpZGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCBidXQgdGhleSBhcmUgbm8gbG9uZ2VyCi0vLyAgcGFydCBvZiB0aGUgQysrIHN0YW5kYXJkLikKLQotdGVtcGxhdGUgPGNsYXNzIF9SZXN1bHQsIGNsYXNzIF9UcD4KLWlubGluZSBtZW1fZnVuX3Q8X1Jlc3VsdCxfVHA+Ci1tZW1fZnVuKF9SZXN1bHQgKF9UcDo6Kl9fZikoKSkgeyByZXR1cm4gbWVtX2Z1bl90PF9SZXN1bHQsX1RwPihfX2YpOyB9Ci0KLXRlbXBsYXRlIDxjbGFzcyBfUmVzdWx0LCBjbGFzcyBfVHA+Ci1pbmxpbmUgY29uc3RfbWVtX2Z1bl90PF9SZXN1bHQsX1RwPgotbWVtX2Z1bihfUmVzdWx0IChfVHA6OipfX2YpKCkgY29uc3QpICB7IHJldHVybiBjb25zdF9tZW1fZnVuX3Q8X1Jlc3VsdCxfVHA+KF9fZik7IH0KLQotdGVtcGxhdGUgPGNsYXNzIF9SZXN1bHQsIGNsYXNzIF9UcD4KLWlubGluZSBtZW1fZnVuX3JlZl90PF9SZXN1bHQsX1RwPgotbWVtX2Z1bl9yZWYoX1Jlc3VsdCAoX1RwOjoqX19mKSgpKSAgeyByZXR1cm4gbWVtX2Z1bl9yZWZfdDxfUmVzdWx0LF9UcD4oX19mKTsgfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1Jlc3VsdCwgY2xhc3MgX1RwPgotaW5saW5lIGNvbnN0X21lbV9mdW5fcmVmX3Q8X1Jlc3VsdCxfVHA+Ci1tZW1fZnVuX3JlZihfUmVzdWx0IChfVHA6OipfX2YpKCkgY29uc3QpICB7IHJldHVybiBjb25zdF9tZW1fZnVuX3JlZl90PF9SZXN1bHQsX1RwPihfX2YpOyB9Ci0KLXRlbXBsYXRlIDxjbGFzcyBfUmVzdWx0LCBjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+Ci1pbmxpbmUgbWVtX2Z1bjFfdDxfUmVzdWx0LF9UcCxfQXJnPgotbWVtX2Z1bihfUmVzdWx0IChfVHA6OipfX2YpKF9BcmcpKSB7IHJldHVybiBtZW1fZnVuMV90PF9SZXN1bHQsX1RwLF9Bcmc+KF9fZik7IH0KLQotdGVtcGxhdGUgPGNsYXNzIF9SZXN1bHQsIGNsYXNzIF9UcCwgY2xhc3MgX0FyZz4KLWlubGluZSBjb25zdF9tZW1fZnVuMV90PF9SZXN1bHQsX1RwLF9Bcmc+Ci1tZW1fZnVuKF9SZXN1bHQgKF9UcDo6Kl9fZikoX0FyZykgY29uc3QpIHsgcmV0dXJuIGNvbnN0X21lbV9mdW4xX3Q8X1Jlc3VsdCxfVHAsX0FyZz4oX19mKTsgfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1Jlc3VsdCwgY2xhc3MgX1RwLCBjbGFzcyBfQXJnPgotaW5saW5lIG1lbV9mdW4xX3JlZl90PF9SZXN1bHQsX1RwLF9Bcmc+Ci1tZW1fZnVuX3JlZihfUmVzdWx0IChfVHA6OipfX2YpKF9BcmcpKSB7IHJldHVybiBtZW1fZnVuMV9yZWZfdDxfUmVzdWx0LF9UcCxfQXJnPihfX2YpOyB9Ci0KLXRlbXBsYXRlIDxjbGFzcyBfUmVzdWx0LCBjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+Ci1pbmxpbmUgY29uc3RfbWVtX2Z1bjFfcmVmX3Q8X1Jlc3VsdCxfVHAsX0FyZz4KLW1lbV9mdW5fcmVmKF9SZXN1bHQgKF9UcDo6Kl9fZikoX0FyZykgY29uc3QpIHsgcmV0dXJuIGNvbnN0X21lbV9mdW4xX3JlZl90PF9SZXN1bHQsX1RwLF9Bcmc+KF9fZik7IH0KLQotIyBpZiAhKGRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpIHx8IGRlZmluZWQgKF9TVExQX05PX0FOQUNIUk9OSVNNUykpCi0vLyAgbWVtX2Z1bjEgYW5kIG1lbV9mdW4xX3JlZiBhcmUgbm8gbG9uZ2VyIHBhcnQgb2YgdGhlIEMrKyBzdGFuZGFyZCwKLS8vICBidXQgdGhleSBhcmUgcHJvdmlkZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCi10ZW1wbGF0ZSA8Y2xhc3MgX1Jlc3VsdCwgY2xhc3MgX1RwLCBjbGFzcyBfQXJnPgotaW5saW5lIG1lbV9mdW4xX3Q8X1Jlc3VsdCxfVHAsX0FyZz4KLW1lbV9mdW4xKF9SZXN1bHQgKF9UcDo6Kl9fZikoX0FyZykpIHsgcmV0dXJuIG1lbV9mdW4xX3Q8X1Jlc3VsdCxfVHAsX0FyZz4oX19mKTsgfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1Jlc3VsdCwgY2xhc3MgX1RwLCBjbGFzcyBfQXJnPgotaW5saW5lIGNvbnN0X21lbV9mdW4xX3Q8X1Jlc3VsdCxfVHAsX0FyZz4KLW1lbV9mdW4xKF9SZXN1bHQgKF9UcDo6Kl9fZikoX0FyZykgY29uc3QpIHsgcmV0dXJuIGNvbnN0X21lbV9mdW4xX3Q8X1Jlc3VsdCxfVHAsX0FyZz4oX19mKTsgfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1Jlc3VsdCwgY2xhc3MgX1RwLCBjbGFzcyBfQXJnPgotaW5saW5lIG1lbV9mdW4xX3JlZl90PF9SZXN1bHQsX1RwLF9Bcmc+Ci1tZW1fZnVuMV9yZWYoX1Jlc3VsdCAoX1RwOjoqX19mKShfQXJnKSkgeyByZXR1cm4gbWVtX2Z1bjFfcmVmX3Q8X1Jlc3VsdCxfVHAsX0FyZz4oX19mKTsgfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1Jlc3VsdCwgY2xhc3MgX1RwLCBjbGFzcyBfQXJnPgotaW5saW5lIGNvbnN0X21lbV9mdW4xX3JlZl90PF9SZXN1bHQsX1RwLF9Bcmc+Ci1tZW1fZnVuMV9yZWYoX1Jlc3VsdCAoX1RwOjoqX19mKShfQXJnKSBjb25zdCkgeyByZXR1cm4gY29uc3RfbWVtX2Z1bjFfcmVmX3Q8X1Jlc3VsdCxfVHAsX0FyZz4oX19mKTsgfQotCi0jIGVuZGlmIC8qIF9TVExQX05PX0VYVEVOU0lPTlMgKi8KLQotIyBlbmRpZiAvKiBfU1RMUF9NRU1CRVJfUE9JTlRFUl9QQVJBTV9CVUcgKi8KLQotdGVtcGxhdGUgPGNsYXNzIF9BcmcsIGNsYXNzIF9SZXN1bHQ+Ci1pbmxpbmUgcG9pbnRlcl90b191bmFyeV9mdW5jdGlvbjxfQXJnLCBfUmVzdWx0PgotcHRyX2Z1bihfUmVzdWx0ICgqX19mKShfQXJnKSkKLXsgcmV0dXJuIHBvaW50ZXJfdG9fdW5hcnlfZnVuY3Rpb248X0FyZywgX1Jlc3VsdD4oX19mKTsgfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0FyZzEsIGNsYXNzIF9BcmcyLCBjbGFzcyBfUmVzdWx0PgotaW5saW5lIHBvaW50ZXJfdG9fYmluYXJ5X2Z1bmN0aW9uPF9BcmcxLF9BcmcyLF9SZXN1bHQ+Ci1wdHJfZnVuKF9SZXN1bHQgKCpfX2YpKF9BcmcxLCBfQXJnMikpCi17IHJldHVybiBwb2ludGVyX3RvX2JpbmFyeV9mdW5jdGlvbjxfQXJnMSxfQXJnMixfUmVzdWx0PihfX2YpOyB9Ci0KLV9TVExQX0VORF9OQU1FU1BBQ0UKZGlmZiAtLWdpdCBhL3N0bC9fZnVuY3Rpb25fYmFzZS5oIGIvc3RsL19mdW5jdGlvbl9iYXNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViYjliOTQuLjAwMDAwMDAKLS0tIGEvc3RsL19mdW5jdGlvbl9iYXNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTQKLSAqIEhld2xldHQtUGFja2FyZCBDb21wYW55Ci0gKgotICogQ29weXJpZ2h0IChjKSAxOTk2LTE5OTgKLSAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NwotICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogQm9yaXMgRm9taXRjaGV2Ci0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICovCi0KLS8qIE5PVEU6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIFNUTCBoZWFkZXJzLgotICogICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4KLSAqLwotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0ZVTkNUSU9OX0JBU0VfSAotI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9GVU5DVElPTl9CQVNFX0gKLQotI2lmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pICYmICFkZWZpbmVkIChfU1RMUF9UWVBFX1RSQUlUU19IKQotIyAgaW5jbHVkZSA8c3RsL3R5cGVfdHJhaXRzLmg+Ci0jZW5kaWYKLQotX1NUTFBfQkVHSU5fTkFNRVNQQUNFCi0KLXRlbXBsYXRlIDxjbGFzcyBfQXJnLCBjbGFzcyBfUmVzdWx0Pgotc3RydWN0IHVuYXJ5X2Z1bmN0aW9uIHsKLSAgdHlwZWRlZiBfQXJnIGFyZ3VtZW50X3R5cGU7Ci0gIHR5cGVkZWYgX1Jlc3VsdCByZXN1bHRfdHlwZTsKLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQXJnMSwgY2xhc3MgX0FyZzIsIGNsYXNzIF9SZXN1bHQ+Ci1zdHJ1Y3QgYmluYXJ5X2Z1bmN0aW9uIHsKLSAgdHlwZWRlZiBfQXJnMSBmaXJzdF9hcmd1bWVudF90eXBlOwotICB0eXBlZGVmIF9BcmcyIHNlY29uZF9hcmd1bWVudF90eXBlOwotICB0eXBlZGVmIF9SZXN1bHQgcmVzdWx0X3R5cGU7Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotc3RydWN0IGVxdWFsX3RvIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAsIF9UcCwgYm9vbD4gewotICBib29sIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdCB7IHJldHVybiBfX3ggPT0gX195OyB9Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotc3RydWN0IGxlc3MgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCxfVHAsYm9vbD4KLSNpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQotLyogbGVzcyBpcyB0aGUgZGVmYXVsdCB0ZW1wbGF0ZSBwYXJhbWV0ZXIgZm9yIG1hbnkgU1RMIGNvbnRhaW5lcnMsIHRvIGZ1bGx5IHVzZQotICogdGhlIG1vdmUgY29uc3RydWN0b3IgZmVhdHVyZSB3ZSBuZWVkIHRvIGtub3cgdGhhdCB0aGUgZGVmYXVsdCBsZXNzIGlzIGp1c3QgYQotICogZnVuY3Rvci4KLSAqLwotICAgICAgICAgICAgICAsIHB1YmxpYyBfX3N0bHBvcnRfY2xhc3M8bGVzczxfVHA+ID4KLSNlbmRpZgotewotICBib29sIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdCB7IHJldHVybiBfX3ggPCBfX3k7IH0KLQotI2lmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pICYmIGRlZmluZWQgKF9TVExQX1VTRV9QQVJUSUFMX1NQRUNfV09SS0FST1VORCkKLSAgLy9UaGlzIGlzIGZvciBhIHZlcnkgc3BlY2lhbCBjb21waWxlciBjb25maWc6IHBhcnRpYWwgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24KLSAgLy9idXQgbm8gdGVtcGxhdGUgZnVuY3Rpb24gcGFydGlhbCBvcmRlcmluZy4KLSAgdm9pZCBzd2FwKGxlc3M8X1RwPiYpIHt9Ci0jZW5kaWYKLX07Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLXN0cnVjdCBfX3R5cGVfdHJhaXRzPGxlc3M8X1RwPiA+IHsKLSNpZiAhZGVmaW5lZCAoX19CT1JMQU5EQ19fKQotICB0eXBlZGVmIHR5cGVuYW1lIF9Jc1NUTHBvcnRDbGFzczxsZXNzPF9UcD4gPjo6X1JldCBfU1RMcG9ydExlc3M7Ci0jZWxzZQotICBlbnVtIHsgX0lzID0gX0lzU1RMcG9ydENsYXNzPGxlc3M8X1RwPiA+OjpfSXMgfTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jvb2wydHlwZTxfSXM+OjpfUmV0IF9TVExwb3J0TGVzczsKLSNlbmRpZgotICB0eXBlZGVmIF9TVExwb3J0TGVzcyBoYXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yOwotICB0eXBlZGVmIF9TVExwb3J0TGVzcyBoYXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yOwotICB0eXBlZGVmIF9TVExwb3J0TGVzcyBoYXNfdHJpdmlhbF9hc3NpZ25tZW50X29wZXJhdG9yOwotICB0eXBlZGVmIF9TVExwb3J0TGVzcyBoYXNfdHJpdmlhbF9kZXN0cnVjdG9yOwotICB0eXBlZGVmIF9TVExwb3J0TGVzcyBpc19QT0RfdHlwZTsKLX07Ci0jZW5kaWYKLQotX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotbGVzczxfVHA+IF9fbGVzcyhfVHAqICkgeyByZXR1cm4gbGVzczxfVHA+KCk7IH0KLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWVxdWFsX3RvPF9UcD4gX19lcXVhbF90byhfVHAqICkgeyByZXR1cm4gZXF1YWxfdG88X1RwPigpOyB9Ci0KLV9TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotc3RydWN0IHBsdXMgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCwgX1RwLCBfVHA+IHsKLSAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdCB7IHJldHVybiBfX3ggKyBfX3k7IH0KLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1zdHJ1Y3QgbWludXMgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCwgX1RwLCBfVHA+IHsKLSAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdCB7IHJldHVybiBfX3ggLSBfX3k7IH0KLX07Ci0KLV9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLXBsdXM8X1RwPiBfX3BsdXMoX1RwKiApIHsgcmV0dXJuIHBsdXM8X1RwPigpOyB9Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1taW51czxfVHA+IF9fbWludXMoX1RwKiApIHsgcmV0dXJuIG1pbnVzPF9UcD4oKTsgfQotCi1fU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLXN0cnVjdCBtdWx0aXBsaWVzIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAsIF9UcCwgX1RwPiB7Ci0gIF9UcCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QgeyByZXR1cm4gX194ICogX195OyB9Ci19OwotCi1fU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCi0KLXRlbXBsYXRlIDxjbGFzcyBfUGFpcj4KLXN0cnVjdCBfU2VsZWN0MXN0IDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPF9QYWlyLCB0eXBlbmFtZSBfUGFpcjo6Zmlyc3RfdHlwZT4gewotICBjb25zdCB0eXBlbmFtZSBfUGFpcjo6Zmlyc3RfdHlwZSYgb3BlcmF0b3IoKShjb25zdCBfUGFpciYgX194KSBjb25zdCB7Ci0gICAgcmV0dXJuIF9feC5maXJzdDsKLSAgfQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIF9QYWlyPgotc3RydWN0IF9TZWxlY3QybmQgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248X1BhaXIsIHR5cGVuYW1lIF9QYWlyOjpzZWNvbmRfdHlwZT4gewotICBjb25zdCB0eXBlbmFtZSBfUGFpcjo6c2Vjb25kX3R5cGUmIG9wZXJhdG9yKCkoY29uc3QgX1BhaXImIF9feCkgY29uc3QgewotICAgIHJldHVybiBfX3guc2Vjb25kOwotICB9Ci19OwotCi0vLyBwcm9qZWN0MXN0IGFuZCBwcm9qZWN0Mm5kIGFyZSBleHRlbnNpb25zOiB0aGV5IGFyZSBub3QgcGFydCBvZiB0aGUgc3RhbmRhcmQKLXRlbXBsYXRlIDxjbGFzcyBfQXJnMSwgY2xhc3MgX0FyZzI+Ci1zdHJ1Y3QgX1Byb2plY3Qxc3QgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9BcmcxLCBfQXJnMiwgX0FyZzE+IHsKLSAgX0FyZzEgb3BlcmF0b3IoKShjb25zdCBfQXJnMSYgX194LCBjb25zdCBfQXJnMiYpIGNvbnN0IHsgcmV0dXJuIF9feDsgfQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIF9BcmcxLCBjbGFzcyBfQXJnMj4KLXN0cnVjdCBfUHJvamVjdDJuZCA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X0FyZzEsIF9BcmcyLCBfQXJnMj4gewotICBfQXJnMiBvcGVyYXRvcigpKGNvbnN0IF9BcmcxJiwgY29uc3QgX0FyZzImIF9feSkgY29uc3QgeyByZXR1cm4gX195OyB9Ci19OwotCi0jaWYgZGVmaW5lZCAoX1NUTFBfTVVMVElfQ09OU1RfVEVNUExBVEVfQVJHX0JVRykKLS8vIGZicCA6IHNvcnQgb2Ygc2VsZWN0MXN0IGp1c3QgZm9yIG1hcHMKLXRlbXBsYXRlIDxjbGFzcyBfUGFpciwgY2xhc3MgX1doYXRldmVyPgotLy8gSkRKIChDVyBQcm8xIGRvZXNuJ3QgbGlrZSBjb25zdCB3aGVuIGZpcnN0X3R5cGUgaXMgYWxzbyBjb25zdCkKLXN0cnVjdCBfX1NlbGVjdDFzdF9oaW50IDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPF9QYWlyLCBfV2hhdGV2ZXI+IHsKLSAgICBjb25zdCBfV2hhdGV2ZXImIG9wZXJhdG9yICgpIChjb25zdCBfUGFpciYgX194KSBjb25zdCB7IHJldHVybiBfX3guZmlyc3Q7IH0KLX07Ci0jICBkZWZpbmUgIF9TVExQX1NFTEVDVDFTVChfX3gsX195KSBfU1RMUF9QUklWIF9fU2VsZWN0MXN0X2hpbnQ8IF9feCwgX195ID4KLSNlbHNlCi0jICBkZWZpbmUgIF9TVExQX1NFTEVDVDFTVChfX3gsIF9feSkgX1NUTFBfUFJJViBfU2VsZWN0MXN0PCBfX3ggPgotI2VuZGlmCi0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1zdHJ1Y3QgX0lkZW50aXR5IDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPF9UcCxfVHA+IHsKLSAgY29uc3QgX1RwJiBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194KSBjb25zdCB7IHJldHVybiBfX3g7IH0KLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBfUmVzdWx0LCBjbGFzcyBfQXJndW1lbnQ+Ci1zdHJ1Y3QgX0NvbnN0YW50X3VuYXJ5X2Z1biB7Ci0gIHR5cGVkZWYgX0FyZ3VtZW50IGFyZ3VtZW50X3R5cGU7Ci0gIHR5cGVkZWYgIF9SZXN1bHQgIHJlc3VsdF90eXBlOwotICByZXN1bHRfdHlwZSBfTV92YWw7Ci0KLSAgX0NvbnN0YW50X3VuYXJ5X2Z1bihjb25zdCByZXN1bHRfdHlwZSYgX192KSA6IF9NX3ZhbChfX3YpIHt9Ci0gIGNvbnN0IHJlc3VsdF90eXBlJiBvcGVyYXRvcigpKGNvbnN0IF9Bcmd1bWVudCYpIGNvbnN0IHsgcmV0dXJuIF9NX3ZhbDsgfQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIF9SZXN1bHQsIGNsYXNzIF9BcmcxLCBjbGFzcyBfQXJnMj4KLXN0cnVjdCBfQ29uc3RhbnRfYmluYXJ5X2Z1biB7Ci0gIHR5cGVkZWYgIF9BcmcxICAgZmlyc3RfYXJndW1lbnRfdHlwZTsKLSAgdHlwZWRlZiAgX0FyZzIgICBzZWNvbmRfYXJndW1lbnRfdHlwZTsKLSAgdHlwZWRlZiAgX1Jlc3VsdCByZXN1bHRfdHlwZTsKLSAgX1Jlc3VsdCBfTV92YWw7Ci0KLSAgX0NvbnN0YW50X2JpbmFyeV9mdW4oY29uc3QgX1Jlc3VsdCYgX192KSA6IF9NX3ZhbChfX3YpIHt9Ci0gIGNvbnN0IHJlc3VsdF90eXBlJiBvcGVyYXRvcigpKGNvbnN0IF9BcmcxJiwgY29uc3QgX0FyZzImKSBjb25zdCB7Ci0gICAgcmV0dXJuIF9NX3ZhbDsKLSAgfQotfTsKLQotLy8gaWRlbnRpdHlfZWxlbWVudCAobm90IHBhcnQgb2YgdGhlIEMrKyBzdGFuZGFyZCkuCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBpbmxpbmUgX1RwIF9faWRlbnRpdHlfZWxlbWVudChwbHVzPF9UcD4pIHsgIHJldHVybiBfVHAoMCk7IH0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+IGlubGluZSBfVHAgX19pZGVudGl0eV9lbGVtZW50KG11bHRpcGxpZXM8X1RwPikgeyByZXR1cm4gX1RwKDEpOyB9Ci0KLV9TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQotCi1fU1RMUF9FTkRfTkFNRVNQQUNFCi0KLSNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9GVU5DVElPTl9CQVNFX0ggKi8KLQotLy8gTG9jYWwgVmFyaWFibGVzOgotLy8gbW9kZTpDKysKLS8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9faGFzaF9mdW4uaCBiL3N0bC9faGFzaF9mdW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA2OWZmMC4uMDAwMDAwMAotLS0gYS9zdGwvX2hhc2hfZnVuLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5Ni0xOTk4Ci0gKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKLSAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCi0gKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAotICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKLSAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KLSAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk0Ci0gKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQotICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKLSAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCi0gKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgotICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkgbWFrZXMgbm8KLSAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KLSAqCi0gKi8KLQotLyogTk9URTogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgU1RMIGhlYWRlcnMuCi0gKiAgIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LgotICovCi0KLSNpZm5kZWYgX1NUTFBfSEFTSF9GVU5fSAotI2RlZmluZSBfU1RMUF9IQVNIX0ZVTl9ICi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1NURERFRgotIyAgaW5jbHVkZSA8c3RsL19jc3RkZGVmLmg+Ci0jZW5kaWYKLQotX1NUTFBfQkVHSU5fTkFNRVNQQUNFCi0KLXRlbXBsYXRlIDxjbGFzcyBfS2V5PiBzdHJ1Y3QgaGFzaCB7IH07Ci0KLV9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKLQotaW5saW5lIHNpemVfdCBfX3N0bF9oYXNoX3N0cmluZyhjb25zdCBjaGFyKiBfX3MpIHsKLSAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKLSAgdW5zaWduZWQgbG9uZyBfX2ggPSAwOwotICBmb3IgKCA7ICpfX3M7ICsrX19zKQotICAgIF9faCA9IDUqX19oICsgKl9fczsKLQotICByZXR1cm4gc2l6ZV90KF9faCk7Ci19Ci0KLV9TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQotCi1fU1RMUF9URU1QTEFURV9OVUxMCi1zdHJ1Y3QgaGFzaDxjaGFyKj4gewotICBzaXplX3Qgb3BlcmF0b3IoKShjb25zdCBjaGFyKiBfX3MpIGNvbnN0IHsKLSAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKQotICAgIHJldHVybiBfU1RMUF9QUklWIF9fc3RsX2hhc2hfc3RyaW5nKF9fcyk7Ci0gIH0KLX07Ci0KLV9TVExQX1RFTVBMQVRFX05VTEwKLXN0cnVjdCBoYXNoPGNvbnN0IGNoYXIqPiB7Ci0gIHNpemVfdCBvcGVyYXRvcigpKGNvbnN0IGNoYXIqIF9fcykgY29uc3QgewotICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCi0gICAgcmV0dXJuIF9TVExQX1BSSVYgX19zdGxfaGFzaF9zdHJpbmcoX19zKTsKLSAgfQotfTsKLQotX1NUTFBfVEVNUExBVEVfTlVMTCBzdHJ1Y3QgaGFzaDxjaGFyPiB7Ci0gIHNpemVfdCBvcGVyYXRvcigpKGNoYXIgX194KSBjb25zdCB7IHJldHVybiBfX3g7IH0KLX07Ci1fU1RMUF9URU1QTEFURV9OVUxMIHN0cnVjdCBoYXNoPHVuc2lnbmVkIGNoYXI+IHsKLSAgc2l6ZV90IG9wZXJhdG9yKCkodW5zaWduZWQgY2hhciBfX3gpIGNvbnN0IHsgcmV0dXJuIF9feDsgfQotfTsKLSNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fU0lHTkVEX0JVSUxUSU5TKQotX1NUTFBfVEVNUExBVEVfTlVMTCBzdHJ1Y3QgaGFzaDxzaWduZWQgY2hhcj4gewotICBzaXplX3Qgb3BlcmF0b3IoKSh1bnNpZ25lZCBjaGFyIF9feCkgY29uc3QgeyByZXR1cm4gX194OyB9Ci19OwotI2VuZGlmCi1fU1RMUF9URU1QTEFURV9OVUxMIHN0cnVjdCBoYXNoPHNob3J0PiB7Ci0gIHNpemVfdCBvcGVyYXRvcigpKHNob3J0IF9feCkgY29uc3QgeyByZXR1cm4gX194OyB9Ci19OwotX1NUTFBfVEVNUExBVEVfTlVMTCBzdHJ1Y3QgaGFzaDx1bnNpZ25lZCBzaG9ydD4gewotICBzaXplX3Qgb3BlcmF0b3IoKSh1bnNpZ25lZCBzaG9ydCBfX3gpIGNvbnN0IHsgcmV0dXJuIF9feDsgfQotfTsKLV9TVExQX1RFTVBMQVRFX05VTEwgc3RydWN0IGhhc2g8aW50PiB7Ci0gIHNpemVfdCBvcGVyYXRvcigpKGludCBfX3gpIGNvbnN0IHsgcmV0dXJuIF9feDsgfQotfTsKLQotI2lmIGRlZmluZWQgKF9XSU42NCkgfHwgIWRlZmluZWQgKF9TVExQX01TVkMpIHx8IChfU1RMUF9NU1ZDIDwgMTMwMCkKLV9TVExQX1RFTVBMQVRFX05VTEwgc3RydWN0IGhhc2g8dW5zaWduZWQgaW50PiB7Ci0gIHNpemVfdCBvcGVyYXRvcigpKHVuc2lnbmVkIGludCBfX3gpIGNvbnN0IHsgcmV0dXJuIF9feDsgfQotfTsKLSNlbHNlCi0vKiBNU1ZDIC5OZXQgc2luY2UgMjAwMiBoYXMgYSA2NCBiaXRzIHBvcnRhYmlsaXR5IHdhcm5pbmcgZmVhdHVyZS4gdHlwZWRlZgotICogbGlrZSBzaXplX3QgYXJlIHRhZ2dlZCBhcyBwb3RlbnRpYWwgNjQgYml0cyB2YXJpYWJsZXMgbWFraW5nIHRoZW0gZGlmZmVyZW50IGZyb20KLSAqIHVuc2lnbmVkIGludC4gVG8gYXZvaWQgdGhlIHdhcm5pbmcgd2hlbiBhIGhhc2ggY29udGFpbmVyIGlzIGluc3RhbmNpYXRlZCB3aXRoCi0gKiB0aGUgc2l6ZV90IGtleSB3ZSBwcmVmZXIgdG8gZ3JhbnQgdGhlIHNpemVfdCBzcGVjaWFsaXphdGlvbiByYXRoZXIgdGhhbiB0aGUKLSAqIHVuc2lnbmVkIGludCBvbmUuCi0gKi8KLV9TVExQX1RFTVBMQVRFX05VTEwgc3RydWN0IGhhc2g8c2l6ZV90PiB7Ci0gIHNpemVfdCBvcGVyYXRvcigpKHNpemVfdCBfX3gpIGNvbnN0IHsgcmV0dXJuIF9feDsgfQotfTsKLSNlbmRpZgotCi1fU1RMUF9URU1QTEFURV9OVUxMIHN0cnVjdCBoYXNoPGxvbmc+IHsKLSAgc2l6ZV90IG9wZXJhdG9yKCkobG9uZyBfX3gpIGNvbnN0IHsgcmV0dXJuIF9feDsgfQotfTsKLV9TVExQX1RFTVBMQVRFX05VTEwgc3RydWN0IGhhc2g8dW5zaWduZWQgbG9uZz4gewotICBzaXplX3Qgb3BlcmF0b3IoKSh1bnNpZ25lZCBsb25nIF9feCkgY29uc3QgeyByZXR1cm4gX194OyB9Ci19OwotCi0jaWYgZGVmaW5lZCAoX1NUTFBfTE9OR19MT05HKQotX1NUTFBfVEVNUExBVEVfTlVMTCBzdHJ1Y3QgaGFzaDxfU1RMUF9MT05HX0xPTkc+IHsKLSAgc2l6ZV90IG9wZXJhdG9yKCkoX1NUTFBfTE9OR19MT05HIHgpIGNvbnN0IHsgcmV0dXJuIChzaXplX3QpeDsgfQotfTsKLV9TVExQX1RFTVBMQVRFX05VTEwgc3RydWN0IGhhc2g8dW5zaWduZWQgX1NUTFBfTE9OR19MT05HPiB7Ci0gIHNpemVfdCBvcGVyYXRvcigpKHVuc2lnbmVkIF9TVExQX0xPTkdfTE9ORyB4KSBjb25zdCB7IHJldHVybiAoc2l6ZV90KXg7IH0KLX07Ci0jZW5kaWYKLQotX1NUTFBfVEVNUExBVEVfTlVMTAotc3RydWN0IGhhc2g8dm9pZCAqPgotewotICAgIHVuaW9uIF9fdnAgewotICAgICAgICBzaXplX3QgczsKLSAgICAgICAgdm9pZCAgKnA7Ci0gICAgfTsKLQotICAgIHNpemVfdCBvcGVyYXRvcigpKHZvaWQgKl9feCkgY29uc3QKLSAgICAgIHsKLSAgICAgICAgX192cCB2cDsKLSAgICAgICAgdnAucCA9IF9feDsKLSAgICAgICAgcmV0dXJuIHZwLnM7Ci0gICAgICB9Ci19OwotCi1fU1RMUF9FTkRfTkFNRVNQQUNFCi0KLSNlbmRpZiAvKiBfU1RMUF9IQVNIX0ZVTl9IICovCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX2hhc2hfbWFwLmggYi9zdGwvX2hhc2hfbWFwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjY2YzZTUuLjAwMDAwMDAKLS0tIGEvc3RsL19oYXNoX21hcC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTAwICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk0Ci0gKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3Ci0gKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTcKLSAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0vKiBOT1RFOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBTVEwgaGVhZGVycy4KLSAqICAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuCi0gKi8KLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9IQVNIX01BUF9ICi0jZGVmaW5lIF9TVExQX0lOVEVSTkFMX0hBU0hfTUFQX0gKLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9IQVNIVEFCTEVfSAotIyAgaW5jbHVkZSA8c3RsL19oYXNodGFibGUuaD4KLSNlbmRpZgotCi1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLQotLy9TcGVjaWZpYyBpdGVyYXRvciB0cmFpdHMgY3JlYXRpb24KLV9TVExQX0NSRUFURV9IQVNIX0lURVJBVE9SX1RSQUlUUyhIYXNoTWFwVHJhaXRzVCwgdHJhaXRzKQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBfU1RMUF9ERkxfVE1QTF9QQVJBTShfSGFzaEZjbixoYXNoPF9LZXk+KSwKLSAgICAgICAgICBfU1RMUF9ERkxfVE1QTF9QQVJBTShfRXF1YWxLZXksZXF1YWxfdG88X0tleT4pLAotICAgICAgICAgIF9TVExQX0RFRkFVTFRfUEFJUl9BTExPQ0FUT1JfU0VMRUNUKGNvbnN0IF9LZXksIF9UcCkgPgotY2xhc3MgaGFzaF9tYXAKLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUEFSVElBTF9TUEVDX1dPUktBUk9VTkQpCi0gICAgICAgICAgICAgICA6IHB1YmxpYyBfX3N0bHBvcnRfY2xhc3M8aGFzaF9tYXA8X0tleSwgX1RwLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+ID4KLSNlbmRpZgotewotcHJpdmF0ZToKLSAgdHlwZWRlZiBoYXNoX21hcDxfS2V5LCBfVHAsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4gX1NlbGY7Ci1wdWJsaWM6Ci0gIHR5cGVkZWYgX0tleSBrZXlfdHlwZTsKLSAgdHlwZWRlZiBfVHAgZGF0YV90eXBlOwotICB0eXBlZGVmIF9UcCBtYXBwZWRfdHlwZTsKLSNpZiAhZGVmaW5lZCAoX19ETUNfXykKLSAgdHlwZWRlZiBwYWlyPGNvbnN0IGtleV90eXBlLCBkYXRhX3R5cGU+IHZhbHVlX3R5cGU7Ci0jZWxzZQotICAvKiBETUMgZ29lcyB0b28gZmFyIGluIHRlbXBsYXRlIGluc3RhbmNpYXRpb24gYW5kIHRyaWVzIHRvIGZ1bGx5IGluc3RhbmNpYXRlCi0gICAqIHNsaXN0PHBhaXI8Y29uc3QgaW50LCBzdHJpbmc+ID4gZm9yIGluc3RhbmNlLiBUaGUgZ2VuZXJhdGlvbiBvZiBhc3NpZ25tZW50Ci0gICAqIG9wZXJhdG9yIGZhaWxzIG9mIGNvdXJzZSBzbyB3ZSBhcmUgZm9yY2UgdG8gdXNlIG11dGFibGUga2V5IGZvciB0aGlzIGNvbXBpbGVyLgotICAgKi8KLSAgdHlwZWRlZiBwYWlyPGtleV90eXBlLCBkYXRhX3R5cGU+IHZhbHVlX3R5cGU7Ci0jZW5kaWYKLXByaXZhdGU6Ci0gIC8vU3BlY2lmaWMgaXRlcmF0b3IgdHJhaXRzIGNyZWF0aW9uCi0gIHR5cGVkZWYgX1NUTFBfUFJJViBfSGFzaE1hcFRyYWl0c1Q8dmFsdWVfdHlwZT4gX0hhc2hNYXBUcmFpdHM7Ci0KLXB1YmxpYzoKLSAgdHlwZWRlZiBoYXNodGFibGU8dmFsdWVfdHlwZSwga2V5X3R5cGUsIF9IYXNoRmNuLCBfSGFzaE1hcFRyYWl0cywKLSAgICAgICAgICAgICAgICAgICAgX1NUTFBfU0VMRUNUMVNUKHZhbHVlX3R5cGUsIF9LZXkpLCBfRXF1YWxLZXksIF9BbGxvYyA+IF9IdDsKLQotICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6aGFzaGVyIGhhc2hlcjsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmtleV9lcXVhbCBrZXlfZXF1YWw7Ci0KLSAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OnNpemVfdHlwZSBzaXplX3R5cGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOwotICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6cG9pbnRlciBwb2ludGVyOwotICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6Y29uc3RfcG9pbnRlciBjb25zdF9wb2ludGVyOwotICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6cmVmZXJlbmNlIHJlZmVyZW5jZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9yZWZlcmVuY2U7Ci0KLSAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6Oml0ZXJhdG9yIGl0ZXJhdG9yOwotICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7Ci0KLSAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmFsbG9jYXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOwotCi0gIGhhc2hlciBoYXNoX2Z1bmN0KCkgY29uc3QgeyByZXR1cm4gX01faHQuaGFzaF9mdW5jdCgpOyB9Ci0gIGtleV9lcXVhbCBrZXlfZXEoKSBjb25zdCB7IHJldHVybiBfTV9odC5rZXlfZXEoKTsgfQotICBhbGxvY2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9yKCkgY29uc3QgeyByZXR1cm4gX01faHQuZ2V0X2FsbG9jYXRvcigpOyB9Ci0KLXByaXZhdGU6Ci0gIF9IdCBfTV9odDsKLSAgX1NUTFBfS0VZX1RZUEVfRk9SX0NPTlRfRVhUKGtleV90eXBlKQotcHVibGljOgotICBoYXNoX21hcCgpIDogX01faHQoMTAwLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpIHt9Ci0gIGV4cGxpY2l0IGhhc2hfbWFwKHNpemVfdHlwZSBfX24pCi0gICAgOiBfTV9odChfX24sIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkge30KLSAgaGFzaF9tYXAoc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmKQotICAgIDogX01faHQoX19uLCBfX2hmLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkge30KLSAgaGFzaF9tYXAoc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLAotICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKLSAgICA6IF9NX2h0KF9fbiwgX19oZiwgX19lcWwsIF9fYSkge30KLQotICBoYXNoX21hcChfX21vdmVfc291cmNlPF9TZWxmPiBzcmMpCi0gICAgOiBfTV9odChfX21vdmVfc291cmNlPF9IdD4oc3JjLmdldCgpLl9NX2h0KSkgewotICB9Ci0KLSNpZmRlZiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KLSAgaGFzaF9tYXAoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wpCi0gICAgOiBfTV9odCgxMDAsIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKLSAgICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9Ci0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KLSAgaGFzaF9tYXAoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsIHNpemVfdHlwZSBfX24pCi0gICAgOiBfTV9odChfX24sIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKLSAgICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9Ci0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KLSAgaGFzaF9tYXAoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsIHNpemVfdHlwZSBfX24sCi0gICAgICAgICAgIGNvbnN0IGhhc2hlciYgX19oZikKLSAgICA6IF9NX2h0KF9fbiwgX19oZiwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCi0gICAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQotIyBpZmRlZiBfU1RMUF9ORUVEU19FWFRSQV9URU1QTEFURV9DT05TVFJVQ1RPUlMKLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgotICBoYXNoX21hcChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbiwKLSAgICAgICAgICAgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsKQotICAgIDogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgYWxsb2NhdG9yX3R5cGUoKSkKLSAgICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9Ci0jIGVuZGlmCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KLSAgaGFzaF9tYXAoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsIHNpemVfdHlwZSBfX24sCi0gICAgICAgICAgIGNvbnN0IGhhc2hlciYgX19oZiwgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCwKLSAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSBfU1RMUF9BTExPQ0FUT1JfVFlQRV9ERkwpCi0gICAgOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBfX2EpCi0gICAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQotCi0jZWxzZQotICBoYXNoX21hcChjb25zdCB2YWx1ZV90eXBlKiBfX2YsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbCkKLSAgICA6IF9NX2h0KDEwMCwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQotICAgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7IH0KLSAgaGFzaF9tYXAoY29uc3QgdmFsdWVfdHlwZSogX19mLCBjb25zdCB2YWx1ZV90eXBlKiBfX2wsIHNpemVfdHlwZSBfX24pCi0gICAgOiBfTV9odChfX24sIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKLSAgICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9Ci0gIGhhc2hfbWFwKGNvbnN0IHZhbHVlX3R5cGUqIF9fZiwgY29uc3QgdmFsdWVfdHlwZSogX19sLCBzaXplX3R5cGUgX19uLAotICAgICAgICAgICBjb25zdCBoYXNoZXImIF9faGYpCi0gICAgOiBfTV9odChfX24sIF9faGYsIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQotICAgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7IH0KLSAgaGFzaF9tYXAoY29uc3QgdmFsdWVfdHlwZSogX19mLCBjb25zdCB2YWx1ZV90eXBlKiBfX2wsIHNpemVfdHlwZSBfX24sCi0gICAgICAgICAgIGNvbnN0IGhhc2hlciYgX19oZiwgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCwKLSAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCi0gICAgOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBfX2EpCi0gICAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQotCi0gIGhhc2hfbWFwKGNvbnN0X2l0ZXJhdG9yIF9fZiwgY29uc3RfaXRlcmF0b3IgX19sKQotICAgIDogX01faHQoMTAwLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCi0gICAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQotICBoYXNoX21hcChjb25zdF9pdGVyYXRvciBfX2YsIGNvbnN0X2l0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbikKLSAgICA6IF9NX2h0KF9fbiwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQotICAgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7IH0KLSAgaGFzaF9tYXAoY29uc3RfaXRlcmF0b3IgX19mLCBjb25zdF9pdGVyYXRvciBfX2wsIHNpemVfdHlwZSBfX24sCi0gICAgICAgICAgIGNvbnN0IGhhc2hlciYgX19oZikKLSAgICA6IF9NX2h0KF9fbiwgX19oZiwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCi0gICAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQotICBoYXNoX21hcChjb25zdF9pdGVyYXRvciBfX2YsIGNvbnN0X2l0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbiwKLSAgICAgICAgICAgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLAotICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKLSAgICA6IF9NX2h0KF9fbiwgX19oZiwgX19lcWwsIF9fYSkKLSAgICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9Ci0jZW5kaWYgLypfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCi0KLXB1YmxpYzoKLSAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCB7IHJldHVybiBfTV9odC5zaXplKCk7IH0KLSAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgeyByZXR1cm4gX01faHQubWF4X3NpemUoKTsgfQotICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gX01faHQuZW1wdHkoKTsgfQotICB2b2lkIHN3YXAoX1NlbGYmIF9faHMpIHsgX01faHQuc3dhcChfX2hzLl9NX2h0KTsgfQotICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIF9NX2h0LmJlZ2luKCk7IH0KLSAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gX01faHQuZW5kKCk7IH0KLSAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBfTV9odC5iZWdpbigpOyB9Ci0gIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmVuZCgpOyB9Ci0KLXB1YmxpYzoKLSAgcGFpcjxpdGVyYXRvcixib29sPiBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCi0gIHsgcmV0dXJuIF9NX2h0Lmluc2VydF91bmlxdWUoX19vYmopOyB9Ci0jaWZkZWYgX1NUTFBfTUVNQkVSX1RFTVBMQVRFUwotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Ci0gIHZvaWQgaW5zZXJ0KF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sKQotICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLF9fbCk7IH0KLSNlbHNlCi0gIHZvaWQgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUqIF9fZiwgY29uc3QgdmFsdWVfdHlwZSogX19sKQotICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLF9fbCk7IH0KLSAgdm9pZCBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19mLCBjb25zdF9pdGVyYXRvciBfX2wpCi0gIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7IH0KLSNlbmRpZiAvKl9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KLSAgcGFpcjxpdGVyYXRvcixib29sPiBpbnNlcnRfbm9yZXNpemUoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCi0gIHsgcmV0dXJuIF9NX2h0Lmluc2VydF91bmlxdWVfbm9yZXNpemUoX19vYmopOyB9Ci0KLSAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0gIGl0ZXJhdG9yIGZpbmQoY29uc3QgX0tUJiBfX2tleSkgeyByZXR1cm4gX01faHQuZmluZChfX2tleSk7IH0KLSAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0gIGNvbnN0X2l0ZXJhdG9yIGZpbmQoY29uc3QgX0tUJiBfX2tleSkgY29uc3QgeyByZXR1cm4gX01faHQuZmluZChfX2tleSk7IH0KLQotICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKLSAgX1RwJiBvcGVyYXRvcltdKGNvbnN0IF9LVCYgX19rZXkpIHsKLSAgICBpdGVyYXRvciBfX2l0ID0gX01faHQuZmluZChfX2tleSk7Ci0gICAgcmV0dXJuIChfX2l0ID09IF9NX2h0LmVuZCgpID8KLSAgICAgIF9NX2h0Ll9NX2luc2VydCh2YWx1ZV90eXBlKF9fa2V5LCBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKF9UcCkpKS5zZWNvbmQgOgotICAgICAgKCpfX2l0KS5zZWNvbmQgKTsKLSAgfQotCi0gIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAotICBzaXplX3R5cGUgY291bnQoY29uc3QgX0tUJiBfX2tleSkgY29uc3QgeyByZXR1cm4gX01faHQuY291bnQoX19rZXkpOyB9Ci0KLSAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0gIHBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPiBlcXVhbF9yYW5nZShjb25zdCBfS1QmIF9fa2V5KQotICB7IHJldHVybiBfTV9odC5lcXVhbF9yYW5nZShfX2tleSk7IH0KLSAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0gIHBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPiBlcXVhbF9yYW5nZShjb25zdCBfS1QmIF9fa2V5KSBjb25zdAotICB7IHJldHVybiBfTV9odC5lcXVhbF9yYW5nZShfX2tleSk7IH0KLQotICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKLSAgc2l6ZV90eXBlIGVyYXNlKGNvbnN0IF9LVCYgX19rZXkpIHtyZXR1cm4gX01faHQuZXJhc2UoX19rZXkpOyB9Ci0gIHZvaWQgZXJhc2UoaXRlcmF0b3IgX19pdCkgeyBfTV9odC5lcmFzZShfX2l0KTsgfQotICB2b2lkIGVyYXNlKGl0ZXJhdG9yIF9fZiwgaXRlcmF0b3IgX19sKSB7IF9NX2h0LmVyYXNlKF9fZiwgX19sKTsgfQotICB2b2lkIGNsZWFyKCkgeyBfTV9odC5jbGVhcigpOyB9Ci0KLSAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9faGludCkgeyBfTV9odC5yZXNpemUoX19oaW50KTsgfQotICBzaXplX3R5cGUgYnVja2V0X2NvdW50KCkgY29uc3QgeyByZXR1cm4gX01faHQuYnVja2V0X2NvdW50KCk7IH0KLSAgc2l6ZV90eXBlIG1heF9idWNrZXRfY291bnQoKSBjb25zdCB7IHJldHVybiBfTV9odC5tYXhfYnVja2V0X2NvdW50KCk7IH0KLSAgc2l6ZV90eXBlIGVsZW1zX2luX2J1Y2tldChzaXplX3R5cGUgX19uKSBjb25zdAotICB7IHJldHVybiBfTV9odC5lbGVtc19pbl9idWNrZXQoX19uKTsgfQotfTsKLQotLy9TcGVjaWZpYyBpdGVyYXRvciB0cmFpdHMgY3JlYXRpb24KLV9TVExQX0NSRUFURV9IQVNIX0lURVJBVE9SX1RSQUlUUyhIYXNoTXVsdGltYXBUcmFpdHNULCB0cmFpdHMpCi0KLXRlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIF9TVExQX0RGTF9UTVBMX1BBUkFNKF9IYXNoRmNuLGhhc2g8X0tleT4pLAotICAgICAgICAgIF9TVExQX0RGTF9UTVBMX1BBUkFNKF9FcXVhbEtleSxlcXVhbF90bzxfS2V5PiksCi0gICAgICAgICAgX1NUTFBfREVGQVVMVF9QQUlSX0FMTE9DQVRPUl9TRUxFQ1QoY29uc3QgX0tleSwgX1RwKSA+Ci1jbGFzcyBoYXNoX211bHRpbWFwCi0jaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKQotICAgICAgICAgICAgICAgICAgICA6IHB1YmxpYyBfX3N0bHBvcnRfY2xhc3M8aGFzaF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4gPgotI2VuZGlmCi17Ci1wcml2YXRlOgotICB0eXBlZGVmIGhhc2hfbXVsdGltYXA8X0tleSwgX1RwLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+IF9TZWxmOwotcHVibGljOgotICB0eXBlZGVmIF9LZXkga2V5X3R5cGU7Ci0gIHR5cGVkZWYgX1RwIGRhdGFfdHlwZTsKLSAgdHlwZWRlZiBfVHAgbWFwcGVkX3R5cGU7Ci0jaWYgIWRlZmluZWQgKF9fRE1DX18pCi0gIHR5cGVkZWYgcGFpcjxjb25zdCBrZXlfdHlwZSwgZGF0YV90eXBlPiB2YWx1ZV90eXBlOwotI2Vsc2UKLSAgdHlwZWRlZiBwYWlyPGtleV90eXBlLCBkYXRhX3R5cGU+IHZhbHVlX3R5cGU7Ci0jZW5kaWYKLXByaXZhdGU6Ci0gIC8vU3BlY2lmaWMgaXRlcmF0b3IgdHJhaXRzIGNyZWF0aW9uCi0gIHR5cGVkZWYgX1NUTFBfUFJJViBfSGFzaE11bHRpbWFwVHJhaXRzVDx2YWx1ZV90eXBlPiBfSGFzaE11bHRpbWFwVHJhaXRzOwotCi1wdWJsaWM6Ci0gIHR5cGVkZWYgaGFzaHRhYmxlPHZhbHVlX3R5cGUsIGtleV90eXBlLCBfSGFzaEZjbiwgX0hhc2hNdWx0aW1hcFRyYWl0cywKLSAgICAgICAgICAgICAgICAgICAgX1NUTFBfU0VMRUNUMVNUKHZhbHVlX3R5cGUsICBfS2V5KSwgX0VxdWFsS2V5LCBfQWxsb2MgPiBfSHQ7Ci0KLSAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6Omhhc2hlciBoYXNoZXI7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjprZXlfZXF1YWwga2V5X2VxdWFsOwotCi0gIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpzaXplX3R5cGUgc2l6ZV90eXBlOwotICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OnBvaW50ZXIgcG9pbnRlcjsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmNvbnN0X3BvaW50ZXIgY29uc3RfcG9pbnRlcjsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OnJlZmVyZW5jZSByZWZlcmVuY2U7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlOwotCi0gIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjppdGVyYXRvciBpdGVyYXRvcjsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOwotCi0gIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKLQotICBoYXNoZXIgaGFzaF9mdW5jdCgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0Lmhhc2hfZnVuY3QoKTsgfQotICBrZXlfZXF1YWwga2V5X2VxKCkgY29uc3QgeyByZXR1cm4gX01faHQua2V5X2VxKCk7IH0KLSAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmdldF9hbGxvY2F0b3IoKTsgfQotCi1wcml2YXRlOgotICBfSHQgX01faHQ7Ci0gIF9TVExQX0tFWV9UWVBFX0ZPUl9DT05UX0VYVChrZXlfdHlwZSkKLXB1YmxpYzoKLSAgaGFzaF9tdWx0aW1hcCgpIDogX01faHQoMTAwLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpIHt9Ci0gIGV4cGxpY2l0IGhhc2hfbXVsdGltYXAoc2l6ZV90eXBlIF9fbikKLSAgICA6IF9NX2h0KF9fbiwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKSB7fQotICBoYXNoX211bHRpbWFwKHNpemVfdHlwZSBfX24sIGNvbnN0IGhhc2hlciYgX19oZikKLSAgICA6IF9NX2h0KF9fbiwgX19oZiwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpIHt9Ci0gIGhhc2hfbXVsdGltYXAoc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLAotICAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQotICAgIDogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgX19hKSB7fQotCi0gIGhhc2hfbXVsdGltYXAoX19tb3ZlX3NvdXJjZTxfU2VsZj4gc3JjKQotICAgIDogX01faHQoX19tb3ZlX3NvdXJjZTxfSHQ+KHNyYy5nZXQoKS5fTV9odCkpIHsKLSAgfQotCi0jaWZkZWYgX1NUTFBfTUVNQkVSX1RFTVBMQVRFUwotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Ci0gIGhhc2hfbXVsdGltYXAoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wpCi0gICAgOiBfTV9odCgxMDAsIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKLSAgICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsIF9fbCk7IH0KLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgotICBoYXNoX211bHRpbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLCBzaXplX3R5cGUgX19uKQotICAgIDogX01faHQoX19uLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCi0gICAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLCBfX2wpOyB9Ci0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KLSAgaGFzaF9tdWx0aW1hcChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbiwKLSAgICAgICAgICAgICAgICBjb25zdCBoYXNoZXImIF9faGYpCi0gICAgOiBfTV9odChfX24sIF9faGYsIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQotICAgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZiwgX19sKTsgfQotIyAgaWZkZWYgX1NUTFBfTkVFRFNfRVhUUkFfVEVNUExBVEVfQ09OU1RSVUNUT1JTCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KLSAgaGFzaF9tdWx0aW1hcChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbiwKLSAgICAgICAgICAgICAgICBjb25zdCBoYXNoZXImIF9faGYsIGNvbnN0IGtleV9lcXVhbCYgX19lcWwpCi0gICAgOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBhbGxvY2F0b3JfdHlwZSgpKQotICAgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZiwgX19sKTsgfQotIyAgZW5kaWYKLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgotICBoYXNoX211bHRpbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLCBzaXplX3R5cGUgX19uLAotICAgICAgICAgICAgICAgIGNvbnN0IGhhc2hlciYgX19oZiwgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCwKLSAgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hIF9TVExQX0FMTE9DQVRPUl9UWVBFX0RGTCkKLSAgICA6IF9NX2h0KF9fbiwgX19oZiwgX19lcWwsIF9fYSkKLSAgICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsIF9fbCk7IH0KLQotI2Vsc2UKLSAgaGFzaF9tdWx0aW1hcChjb25zdCB2YWx1ZV90eXBlKiBfX2YsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbCkKLSAgICA6IF9NX2h0KDEwMCwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQotICAgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZiwgX19sKTsgfQotICBoYXNoX211bHRpbWFwKGNvbnN0IHZhbHVlX3R5cGUqIF9fZiwgY29uc3QgdmFsdWVfdHlwZSogX19sLCBzaXplX3R5cGUgX19uKQotICAgIDogX01faHQoX19uLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCi0gICAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLCBfX2wpOyB9Ci0gIGhhc2hfbXVsdGltYXAoY29uc3QgdmFsdWVfdHlwZSogX19mLCBjb25zdCB2YWx1ZV90eXBlKiBfX2wsIHNpemVfdHlwZSBfX24sCi0gICAgICAgICAgICAgICAgY29uc3QgaGFzaGVyJiBfX2hmKQotICAgIDogX01faHQoX19uLCBfX2hmLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKLSAgICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsIF9fbCk7IH0KLSAgaGFzaF9tdWx0aW1hcChjb25zdCB2YWx1ZV90eXBlKiBfX2YsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbCwgc2l6ZV90eXBlIF9fbiwKLSAgICAgICAgICAgICAgICBjb25zdCBoYXNoZXImIF9faGYsIGNvbnN0IGtleV9lcXVhbCYgX19lcWwsCi0gICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCi0gICAgOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBfX2EpCi0gICAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLCBfX2wpOyB9Ci0KLSAgaGFzaF9tdWx0aW1hcChjb25zdF9pdGVyYXRvciBfX2YsIGNvbnN0X2l0ZXJhdG9yIF9fbCkKLSAgICA6IF9NX2h0KDEwMCwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQotICAgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZiwgX19sKTsgfQotICBoYXNoX211bHRpbWFwKGNvbnN0X2l0ZXJhdG9yIF9fZiwgY29uc3RfaXRlcmF0b3IgX19sLCBzaXplX3R5cGUgX19uKQotICAgIDogX01faHQoX19uLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCi0gICAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLCBfX2wpOyB9Ci0gIGhhc2hfbXVsdGltYXAoY29uc3RfaXRlcmF0b3IgX19mLCBjb25zdF9pdGVyYXRvciBfX2wsIHNpemVfdHlwZSBfX24sCi0gICAgICAgICAgICAgICAgY29uc3QgaGFzaGVyJiBfX2hmKQotICAgIDogX01faHQoX19uLCBfX2hmLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKLSAgICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsIF9fbCk7IH0KLSAgaGFzaF9tdWx0aW1hcChjb25zdF9pdGVyYXRvciBfX2YsIGNvbnN0X2l0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbiwKLSAgICAgICAgICAgICAgICBjb25zdCBoYXNoZXImIF9faGYsIGNvbnN0IGtleV9lcXVhbCYgX19lcWwsCi0gICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCi0gICAgOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBfX2EpCi0gICAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLCBfX2wpOyB9Ci0jZW5kaWYgLypfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCi0KLXB1YmxpYzoKLSAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCB7IHJldHVybiBfTV9odC5zaXplKCk7IH0KLSAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgeyByZXR1cm4gX01faHQubWF4X3NpemUoKTsgfQotICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gX01faHQuZW1wdHkoKTsgfQotICB2b2lkIHN3YXAoX1NlbGYmIF9faHMpIHsgX01faHQuc3dhcChfX2hzLl9NX2h0KTsgfQotCi0gIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gX01faHQuYmVnaW4oKTsgfQotICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBfTV9odC5lbmQoKTsgfQotICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmJlZ2luKCk7IH0KLSAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gX01faHQuZW5kKCk7IH0KLQotcHVibGljOgotICBpdGVyYXRvciBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCi0gICAgeyByZXR1cm4gX01faHQuaW5zZXJ0X2VxdWFsKF9fb2JqKTsgfQotI2lmZGVmIF9TVExQX01FTUJFUl9URU1QTEFURVMKLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgotICB2b2lkIGluc2VydChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCkKLSAgICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsX19sKTsgfQotI2Vsc2UKLSAgdm9pZCBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSogX19mLCBjb25zdCB2YWx1ZV90eXBlKiBfX2wpIHsKLSAgICBfTV9odC5pbnNlcnRfZXF1YWwoX19mLF9fbCk7Ci0gIH0KLSAgdm9pZCBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19mLCBjb25zdF9pdGVyYXRvciBfX2wpCi0gICAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLCBfX2wpOyB9Ci0jZW5kaWYgLypfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCi0gIGl0ZXJhdG9yIGluc2VydF9ub3Jlc2l6ZShjb25zdCB2YWx1ZV90eXBlJiBfX29iaikKLSAgICB7IHJldHVybiBfTV9odC5pbnNlcnRfZXF1YWxfbm9yZXNpemUoX19vYmopOyB9Ci0KLSAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0gIGl0ZXJhdG9yIGZpbmQoY29uc3QgX0tUJiBfX2tleSkgeyByZXR1cm4gX01faHQuZmluZChfX2tleSk7IH0KLSAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0gIGNvbnN0X2l0ZXJhdG9yIGZpbmQoY29uc3QgX0tUJiBfX2tleSkgY29uc3QgeyByZXR1cm4gX01faHQuZmluZChfX2tleSk7IH0KLQotICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKLSAgc2l6ZV90eXBlIGNvdW50KGNvbnN0IF9LVCYgX19rZXkpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmNvdW50KF9fa2V5KTsgfQotCi0gIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAotICBwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4KLSAgZXF1YWxfcmFuZ2UoY29uc3QgX0tUJiBfX2tleSkgeyByZXR1cm4gX01faHQuZXF1YWxfcmFuZ2UoX19rZXkpOyB9Ci0gIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAotICBwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4KLSAgZXF1YWxfcmFuZ2UoY29uc3QgX0tUJiBfX2tleSkgY29uc3QgeyByZXR1cm4gX01faHQuZXF1YWxfcmFuZ2UoX19rZXkpOyB9Ci0KLSAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0gIHNpemVfdHlwZSBlcmFzZShjb25zdCBfS1QmIF9fa2V5KSB7cmV0dXJuIF9NX2h0LmVyYXNlKF9fa2V5KTsgfQotICB2b2lkIGVyYXNlKGl0ZXJhdG9yIF9faXQpIHsgX01faHQuZXJhc2UoX19pdCk7IH0KLSAgdm9pZCBlcmFzZShpdGVyYXRvciBfX2YsIGl0ZXJhdG9yIF9fbCkgeyBfTV9odC5lcmFzZShfX2YsIF9fbCk7IH0KLSAgdm9pZCBjbGVhcigpIHsgX01faHQuY2xlYXIoKTsgfQotCi1wdWJsaWM6Ci0gIHZvaWQgcmVzaXplKHNpemVfdHlwZSBfX2hpbnQpIHsgX01faHQucmVzaXplKF9faGludCk7IH0KLSAgc2l6ZV90eXBlIGJ1Y2tldF9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmJ1Y2tldF9jb3VudCgpOyB9Ci0gIHNpemVfdHlwZSBtYXhfYnVja2V0X2NvdW50KCkgY29uc3QgeyByZXR1cm4gX01faHQubWF4X2J1Y2tldF9jb3VudCgpOyB9Ci0gIHNpemVfdHlwZSBlbGVtc19pbl9idWNrZXQoc2l6ZV90eXBlIF9fbikgY29uc3QKLSAgeyByZXR1cm4gX01faHQuZWxlbXNfaW5fYnVja2V0KF9fbik7IH0KLX07Ci0KLSNkZWZpbmUgX1NUTFBfVEVNUExBVEVfSEVBREVSIHRlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoRmNuLCBjbGFzcyBfRXFsS2V5LCBjbGFzcyBfQWxsb2M+Ci0jZGVmaW5lIF9TVExQX1RFTVBMQVRFX0NPTlRBSU5FUiBoYXNoX21hcDxfS2V5LF9UcCxfSGFzaEZjbixfRXFsS2V5LF9BbGxvYz4KLSNpbmNsdWRlIDxzdGwvX3JlbG9wc19oYXNoX2NvbnQuaD4KLSN1bmRlZiBfU1RMUF9URU1QTEFURV9DT05UQUlORVIKLSNkZWZpbmUgX1NUTFBfVEVNUExBVEVfQ09OVEFJTkVSIGhhc2hfbXVsdGltYXA8X0tleSxfVHAsX0hhc2hGY24sX0VxbEtleSxfQWxsb2M+Ci0jaW5jbHVkZSA8c3RsL19yZWxvcHNfaGFzaF9jb250Lmg+Ci0jdW5kZWYgX1NUTFBfVEVNUExBVEVfQ09OVEFJTkVSCi0jdW5kZWYgX1NUTFBfVEVNUExBVEVfSEVBREVSCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQotdGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2hGbiwgIGNsYXNzIF9FcUtleSwgY2xhc3MgX0FsbG9jPgotc3RydWN0IF9fbW92ZV90cmFpdHM8aGFzaF9tYXA8X0tleSwgX1RwLCBfSGFzaEZuLCBfRXFLZXksIF9BbGxvYz4gPiA6Ci0gIF9TVExQX1BSSVYgX19tb3ZlX3RyYWl0c19oZWxwPHR5cGVuYW1lIGhhc2hfbWFwPF9LZXksIF9UcCwgX0hhc2hGbiwgX0VxS2V5LCBfQWxsb2M+OjpfSHQ+Ci17fTsKLQotdGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2hGbiwgIGNsYXNzIF9FcUtleSwgY2xhc3MgX0FsbG9jPgotc3RydWN0IF9fbW92ZV90cmFpdHM8aGFzaF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoRm4sIF9FcUtleSwgX0FsbG9jPiA+IDoKLSAgX1NUTFBfUFJJViBfX21vdmVfdHJhaXRzX2hlbHA8dHlwZW5hbWUgaGFzaF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoRm4sIF9FcUtleSwgX0FsbG9jPjo6X0h0Pgote307Ci0KLS8vIFNwZWNpYWxpemF0aW9uIG9mIGluc2VydF9pdGVyYXRvciBzbyB0aGF0IGl0IHdpbGwgd29yayBmb3IgaGFzaF9tYXAKLS8vIGFuZCBoYXNoX211bHRpbWFwLgotdGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2hGbiwgIGNsYXNzIF9FcUtleSwgY2xhc3MgX0FsbG9jPgotY2xhc3MgaW5zZXJ0X2l0ZXJhdG9yPGhhc2hfbWFwPF9LZXksIF9UcCwgX0hhc2hGbiwgX0VxS2V5LCBfQWxsb2M+ID4gewotcHJvdGVjdGVkOgotICB0eXBlZGVmIGhhc2hfbWFwPF9LZXksIF9UcCwgX0hhc2hGbiwgX0VxS2V5LCBfQWxsb2M+IF9Db250YWluZXI7Ci0gIF9Db250YWluZXIqIGNvbnRhaW5lcjsKLXB1YmxpYzoKLSAgdHlwZWRlZiBfQ29udGFpbmVyICAgICAgICAgIGNvbnRhaW5lcl90eXBlOwotICB0eXBlZGVmIG91dHB1dF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7Ci0gIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOwotICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOwotICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgcG9pbnRlcjsKLSAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKLQotICBpbnNlcnRfaXRlcmF0b3IoX0NvbnRhaW5lciYgX194KSA6IGNvbnRhaW5lcigmX194KSB7fQotICBpbnNlcnRfaXRlcmF0b3IoX0NvbnRhaW5lciYgX194LCB0eXBlbmFtZSBfQ29udGFpbmVyOjppdGVyYXRvcikKLSAgICA6IGNvbnRhaW5lcigmX194KSB7fQotICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mCi0gIG9wZXJhdG9yPShjb25zdCB0eXBlbmFtZSBfQ29udGFpbmVyOjp2YWx1ZV90eXBlJiBfX3ZhbCkgewotICAgIGNvbnRhaW5lci0+aW5zZXJ0KF9fdmFsKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JiBvcGVyYXRvciooKSB7IHJldHVybiAqdGhpczsgfQotICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mIG9wZXJhdG9yKysoKSB7IHJldHVybiAqdGhpczsgfQotICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mIG9wZXJhdG9yKysoaW50KSB7IHJldHVybiAqdGhpczsgfQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2hGbiwgIGNsYXNzIF9FcUtleSwgY2xhc3MgX0FsbG9jPgotY2xhc3MgaW5zZXJ0X2l0ZXJhdG9yPGhhc2hfbXVsdGltYXA8X0tleSwgX1RwLCBfSGFzaEZuLCBfRXFLZXksIF9BbGxvYz4gPiB7Ci1wcm90ZWN0ZWQ6Ci0gIHR5cGVkZWYgaGFzaF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoRm4sIF9FcUtleSwgX0FsbG9jPiBfQ29udGFpbmVyOwotICBfQ29udGFpbmVyKiBjb250YWluZXI7Ci0gIHR5cGVuYW1lIF9Db250YWluZXI6Oml0ZXJhdG9yIGl0ZXI7Ci1wdWJsaWM6Ci0gIHR5cGVkZWYgX0NvbnRhaW5lciAgICAgICAgICBjb250YWluZXJfdHlwZTsKLSAgdHlwZWRlZiBvdXRwdXRfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OwotICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKLSAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKLSAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHBvaW50ZXI7Ci0gIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICByZWZlcmVuY2U7Ci0KLSAgaW5zZXJ0X2l0ZXJhdG9yKF9Db250YWluZXImIF9feCkgOiBjb250YWluZXIoJl9feCkge30KLSAgaW5zZXJ0X2l0ZXJhdG9yKF9Db250YWluZXImIF9feCwgdHlwZW5hbWUgX0NvbnRhaW5lcjo6aXRlcmF0b3IpCi0gICAgOiBjb250YWluZXIoJl9feCkge30KLSAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JgotICBvcGVyYXRvcj0oY29uc3QgdHlwZW5hbWUgX0NvbnRhaW5lcjo6dmFsdWVfdHlwZSYgX192YWwpIHsKLSAgICBjb250YWluZXItPmluc2VydChfX3ZhbCk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYgb3BlcmF0b3IqKCkgeyByZXR1cm4gKnRoaXM7IH0KLSAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JiBvcGVyYXRvcisrKCkgeyByZXR1cm4gKnRoaXM7IH0KLSAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JiBvcGVyYXRvcisrKGludCkgeyByZXR1cm4gKnRoaXM7IH0KLX07Ci0jZW5kaWYgLyogX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTiAqLwotCi1fU1RMUF9FTkRfTkFNRVNQQUNFCi0KLSNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9IQVNIX01BUF9IICovCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX2hhc2hfc2V0LmggYi9zdGwvX2hhc2hfc2V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MDBkYzEuLjAwMDAwMDAKLS0tIGEvc3RsL19oYXNoX3NldC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDgzICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk0Ci0gKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3Ci0gKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTcKLSAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0vKiBOT1RFOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBTVEwgaGVhZGVycy4KLSAqICAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuCi0gKi8KLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9IQVNIX1NFVF9ICi0jZGVmaW5lIF9TVExQX0lOVEVSTkFMX0hBU0hfU0VUX0gKLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9IQVNIVEFCTEVfSAotIyAgaW5jbHVkZSA8c3RsL19oYXNodGFibGUuaD4KLSNlbmRpZgotCi1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLQotLy9TcGVjaWZpYyBpdGVyYXRvciB0cmFpdHMgY3JlYXRpb24KLV9TVExQX0NSRUFURV9IQVNIX0lURVJBVE9SX1RSQUlUUyhIYXNoU2V0VHJhaXRzVCwgQ29uc3RfdHJhaXRzKQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlLCBfU1RMUF9ERkxfVE1QTF9QQVJBTShfSGFzaEZjbixoYXNoPF9WYWx1ZT4pLAotICAgICAgICAgIF9TVExQX0RGTF9UTVBMX1BBUkFNKF9FcXVhbEtleSxlcXVhbF90bzxfVmFsdWU+KSwKLSAgICAgICAgICBfU1RMUF9ERUZBVUxUX0FMTE9DQVRPUl9TRUxFQ1QoX1ZhbHVlKSA+Ci1jbGFzcyBoYXNoX3NldAotI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QQVJUSUFMX1NQRUNfV09SS0FST1VORCkKLSAgICAgICAgICAgICAgIDogcHVibGljIF9fc3RscG9ydF9jbGFzczxoYXNoX3NldDxfVmFsdWUsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4gPgotI2VuZGlmCi17Ci0gIHR5cGVkZWYgaGFzaF9zZXQ8X1ZhbHVlLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+IF9TZWxmOwotICAvL1NwZWNpZmljIGl0ZXJhdG9yIHRyYWl0cyBjcmVhdGlvbgotICB0eXBlZGVmIF9TVExQX1BSSVYgX0hhc2hTZXRUcmFpdHNUPF9WYWx1ZT4gX0hhc2hTZXRUcmFpdHM7Ci1wdWJsaWM6Ci0gIHR5cGVkZWYgaGFzaHRhYmxlPF9WYWx1ZSwgX1ZhbHVlLCBfSGFzaEZjbiwKLSAgICAgICAgICAgICAgICAgICAgX0hhc2hTZXRUcmFpdHMsIF9TVExQX1BSSVYgX0lkZW50aXR5PF9WYWx1ZT4sIF9FcXVhbEtleSwgX0FsbG9jPiBfSHQ7Ci1wdWJsaWM6Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjprZXlfdHlwZSBrZXlfdHlwZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6Omhhc2hlciBoYXNoZXI7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjprZXlfZXF1YWwga2V5X2VxdWFsOwotCi0gIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpzaXplX3R5cGUgc2l6ZV90eXBlOwotICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OnBvaW50ZXIgICAgICAgICBwb2ludGVyOwotICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6Y29uc3RfcG9pbnRlciAgIGNvbnN0X3BvaW50ZXI7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpyZWZlcmVuY2UgICAgICAgcmVmZXJlbmNlOwotICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZTsKLQotICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6aXRlcmF0b3IgaXRlcmF0b3I7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKLQotICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7Ci0KLSAgaGFzaGVyIGhhc2hfZnVuY3QoKSBjb25zdCB7IHJldHVybiBfTV9odC5oYXNoX2Z1bmN0KCk7IH0KLSAga2V5X2VxdWFsIGtleV9lcSgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmtleV9lcSgpOyB9Ci0gIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdCB7IHJldHVybiBfTV9odC5nZXRfYWxsb2NhdG9yKCk7IH0KLQotcHJpdmF0ZToKLSAgX0h0IF9NX2h0OwotICBfU1RMUF9LRVlfVFlQRV9GT1JfQ09OVF9FWFQoa2V5X3R5cGUpCi0KLXB1YmxpYzoKLSAgaGFzaF9zZXQoKQotICAgIDogX01faHQoMTAwLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpIHt9Ci0gIGV4cGxpY2l0IGhhc2hfc2V0KHNpemVfdHlwZSBfX24pCi0gICAgOiBfTV9odChfX24sIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkge30KLSAgaGFzaF9zZXQoc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmKQotICAgIDogX01faHQoX19uLCBfX2hmLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkge30KLSNpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKLSAgaGFzaF9zZXQoc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLAotICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKLSNlbHNlCi0gIGhhc2hfc2V0KHNpemVfdHlwZSBfX24sIGNvbnN0IGhhc2hlciYgX19oZiwgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCkKLSAgICA6IF9NX2h0KF9fbiwgX19oZiwgX19lcWwsIGFsbG9jYXRvcl90eXBlKCkpIHt9Ci0gIGhhc2hfc2V0KHNpemVfdHlwZSBfX24sIGNvbnN0IGhhc2hlciYgX19oZiwgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCwKLSAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKLSNlbmRpZgotICAgIDogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgX19hKSB7fQotCi0gIGhhc2hfc2V0KF9fbW92ZV9zb3VyY2U8X1NlbGY+IHNyYykKLSAgICA6IF9NX2h0KF9fbW92ZV9zb3VyY2U8X0h0PihzcmMuZ2V0KCkuX01faHQpKSB7fQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgotICBoYXNoX3NldChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCkKLSAgICA6IF9NX2h0KDEwMCwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQotICAgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7IH0KLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgotICBoYXNoX3NldChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbikKLSAgICA6IF9NX2h0KF9fbiwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQotICAgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7IH0KLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgotICBoYXNoX3NldChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbiwKLSAgICAgICAgICAgY29uc3QgaGFzaGVyJiBfX2hmKQotICAgIDogX01faHQoX19uLCBfX2hmLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKLSAgICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9Ci0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KLSAgaGFzaF9zZXQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsIHNpemVfdHlwZSBfX24sCi0gICAgICAgICAgIGNvbnN0IGhhc2hlciYgX19oZiwgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCwKLSAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSBfU1RMUF9BTExPQ0FUT1JfVFlQRV9ERkwpCi0gICAgOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBfX2EpCi0gICAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQotIyAgaWYgZGVmaW5lZCAoX1NUTFBfTkVFRFNfRVhUUkFfVEVNUExBVEVfQ09OU1RSVUNUT1JTKQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Ci0gIGhhc2hfc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLCBzaXplX3R5cGUgX19uLAotICAgICAgICAgICBjb25zdCBoYXNoZXImIF9faGYsIGNvbnN0IGtleV9lcXVhbCYgX19lcWwpCi0gICAgOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBhbGxvY2F0b3JfdHlwZSgpKQotICAgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7IH0KLSMgIGVuZGlmCi0jZWxzZQotICBoYXNoX3NldChjb25zdCB2YWx1ZV90eXBlKiBfX2YsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbCkKLSAgICA6IF9NX2h0KDEwMCwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQotICAgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7IH0KLSAgaGFzaF9zZXQoY29uc3QgdmFsdWVfdHlwZSogX19mLCBjb25zdCB2YWx1ZV90eXBlKiBfX2wsIHNpemVfdHlwZSBfX24pCi0gICAgOiBfTV9odChfX24sIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKLSAgICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9Ci0gIGhhc2hfc2V0KGNvbnN0IHZhbHVlX3R5cGUqIF9fZiwgY29uc3QgdmFsdWVfdHlwZSogX19sLCBzaXplX3R5cGUgX19uLAotICAgICAgICAgICBjb25zdCBoYXNoZXImIF9faGYpCi0gICAgOiBfTV9odChfX24sIF9faGYsIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQotICAgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7IH0KLSAgaGFzaF9zZXQoY29uc3QgdmFsdWVfdHlwZSogX19mLCBjb25zdCB2YWx1ZV90eXBlKiBfX2wsIHNpemVfdHlwZSBfX24sCi0gICAgICAgICAgIGNvbnN0IGhhc2hlciYgX19oZiwgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCwKLSAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCi0gICAgOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBfX2EpCi0gICAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQotCi0gIGhhc2hfc2V0KGNvbnN0X2l0ZXJhdG9yIF9fZiwgY29uc3RfaXRlcmF0b3IgX19sKQotICAgIDogX01faHQoMTAwLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCi0gICAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQotICBoYXNoX3NldChjb25zdF9pdGVyYXRvciBfX2YsIGNvbnN0X2l0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbikKLSAgICA6IF9NX2h0KF9fbiwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQotICAgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7IH0KLSAgaGFzaF9zZXQoY29uc3RfaXRlcmF0b3IgX19mLCBjb25zdF9pdGVyYXRvciBfX2wsIHNpemVfdHlwZSBfX24sCi0gICAgICAgICAgIGNvbnN0IGhhc2hlciYgX19oZikKLSAgICA6IF9NX2h0KF9fbiwgX19oZiwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCi0gICAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQotICBoYXNoX3NldChjb25zdF9pdGVyYXRvciBfX2YsIGNvbnN0X2l0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbiwKLSAgICAgICAgICAgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLAotICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKLSAgICA6IF9NX2h0KF9fbiwgX19oZiwgX19lcWwsIF9fYSkKLSAgICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9Ci0jZW5kaWYgLypfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCi0KLXB1YmxpYzoKLSAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCB7IHJldHVybiBfTV9odC5zaXplKCk7IH0KLSAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgeyByZXR1cm4gX01faHQubWF4X3NpemUoKTsgfQotICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gX01faHQuZW1wdHkoKTsgfQotICB2b2lkIHN3YXAoX1NlbGYmIF9faHMpIHsgX01faHQuc3dhcChfX2hzLl9NX2h0KTsgfQotCi0gIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gX01faHQuYmVnaW4oKTsgfQotICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBfTV9odC5lbmQoKTsgfQotICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmJlZ2luKCk7IH0KLSAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gX01faHQuZW5kKCk7IH0KLQotcHVibGljOgotICBwYWlyPGl0ZXJhdG9yLCBib29sPiBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCi0gIHsgcmV0dXJuIF9NX2h0Lmluc2VydF91bmlxdWUoX19vYmopOyB9Ci0jaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgotICB2b2lkIGluc2VydChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCkKLSNlbHNlCi0gIHZvaWQgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fZiwgY29uc3RfaXRlcmF0b3IgX19sKQotICB7X01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7IH0KLSAgdm9pZCBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSogX19mLCBjb25zdCB2YWx1ZV90eXBlKiBfX2wpCi0jZW5kaWYKLSAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZixfX2wpOyB9Ci0KLSAgcGFpcjxpdGVyYXRvciwgYm9vbD4gaW5zZXJ0X25vcmVzaXplKGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKQotICB7IHJldHVybiBfTV9odC5pbnNlcnRfdW5pcXVlX25vcmVzaXplKF9fb2JqKTsgfQotCi0gIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAotICBpdGVyYXRvciBmaW5kKGNvbnN0IF9LVCYgX19rZXkpIHsgcmV0dXJuIF9NX2h0LmZpbmQoX19rZXkpOyB9Ci0gIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAotICBjb25zdF9pdGVyYXRvciBmaW5kKGNvbnN0IF9LVCYgX19rZXkpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmZpbmQoX19rZXkpOyB9Ci0KLSAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0gIHNpemVfdHlwZSBjb3VudChjb25zdCBfS1QmIF9fa2V5KSBjb25zdCB7IHJldHVybiBfTV9odC5jb3VudChfX2tleSk7IH0KLQotICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKLSAgcGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+IGVxdWFsX3JhbmdlKGNvbnN0IF9LVCYgX19rZXkpCi0gIHsgcmV0dXJuIF9NX2h0LmVxdWFsX3JhbmdlKF9fa2V5KTsgfQotICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKLSAgcGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+IGVxdWFsX3JhbmdlKGNvbnN0IF9LVCYgX19rZXkpIGNvbnN0Ci0gIHsgcmV0dXJuIF9NX2h0LmVxdWFsX3JhbmdlKF9fa2V5KTsgfQotCi0gIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAotICBzaXplX3R5cGUgZXJhc2UoY29uc3QgX0tUJiBfX2tleSkge3JldHVybiBfTV9odC5lcmFzZShfX2tleSk7IH0KLSAgdm9pZCBlcmFzZShpdGVyYXRvciBfX2l0KSB7IF9NX2h0LmVyYXNlKF9faXQpOyB9Ci0gIHZvaWQgZXJhc2UoaXRlcmF0b3IgX19mLCBpdGVyYXRvciBfX2wpIHsgX01faHQuZXJhc2UoX19mLCBfX2wpOyB9Ci0gIHZvaWQgY2xlYXIoKSB7IF9NX2h0LmNsZWFyKCk7IH0KLQotcHVibGljOgotICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgX19oaW50KSB7IF9NX2h0LnJlc2l6ZShfX2hpbnQpOyB9Ci0gIHNpemVfdHlwZSBidWNrZXRfY291bnQoKSBjb25zdCB7IHJldHVybiBfTV9odC5idWNrZXRfY291bnQoKTsgfQotICBzaXplX3R5cGUgbWF4X2J1Y2tldF9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0Lm1heF9idWNrZXRfY291bnQoKTsgfQotICBzaXplX3R5cGUgZWxlbXNfaW5fYnVja2V0KHNpemVfdHlwZSBfX24pIGNvbnN0Ci0gIHsgcmV0dXJuIF9NX2h0LmVsZW1zX2luX2J1Y2tldChfX24pOyB9Ci19OwotCi0vL1NwZWNpZmljIGl0ZXJhdG9yIHRyYWl0cyBjcmVhdGlvbgotX1NUTFBfQ1JFQVRFX0hBU0hfSVRFUkFUT1JfVFJBSVRTKEhhc2hNdWx0aXNldFRyYWl0c1QsIENvbnN0X3RyYWl0cykKLQotdGVtcGxhdGUgPGNsYXNzIF9WYWx1ZSwgX1NUTFBfREZMX1RNUExfUEFSQU0oX0hhc2hGY24saGFzaDxfVmFsdWU+KSwKLSAgICAgICAgICBfU1RMUF9ERkxfVE1QTF9QQVJBTShfRXF1YWxLZXksZXF1YWxfdG88X1ZhbHVlPiksCi0gICAgICAgICAgX1NUTFBfREVGQVVMVF9BTExPQ0FUT1JfU0VMRUNUKF9WYWx1ZSkgPgotY2xhc3MgaGFzaF9tdWx0aXNldAotI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QQVJUSUFMX1NQRUNfV09SS0FST1VORCkKLSAgICAgICAgICAgICAgICAgICAgOiBwdWJsaWMgX19zdGxwb3J0X2NsYXNzPGhhc2hfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+ID4KLSNlbmRpZgotewotICB0eXBlZGVmIGhhc2hfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+IF9TZWxmOwotICAvL1NwZWNpZmljIGl0ZXJhdG9yIHRyYWl0cyBjcmVhdGlvbgotICB0eXBlZGVmIF9TVExQX1BSSVYgX0hhc2hNdWx0aXNldFRyYWl0c1Q8X1ZhbHVlPiBfSGFzaE11bHRpc2V0VHJhaXRzOwotcHVibGljOgotICB0eXBlZGVmIGhhc2h0YWJsZTxfVmFsdWUsIF9WYWx1ZSwgX0hhc2hGY24sCi0gICAgICAgICAgICAgICAgICAgIF9IYXNoTXVsdGlzZXRUcmFpdHMsIF9TVExQX1BSSVYgX0lkZW50aXR5PF9WYWx1ZT4sIF9FcXVhbEtleSwgX0FsbG9jPiBfSHQ7Ci0KLSAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmtleV90eXBlIGtleV90eXBlOwotICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOwotICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6aGFzaGVyIGhhc2hlcjsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmtleV9lcXVhbCBrZXlfZXF1YWw7Ci0KLSAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OnNpemVfdHlwZSBzaXplX3R5cGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOwotICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6cG9pbnRlciAgICAgICBwb2ludGVyOwotICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6Y29uc3RfcG9pbnRlciBjb25zdF9wb2ludGVyOwotICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6cmVmZXJlbmNlIHJlZmVyZW5jZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9yZWZlcmVuY2U7Ci0KLSAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6Oml0ZXJhdG9yIGl0ZXJhdG9yOwotICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7Ci0KLSAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmFsbG9jYXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOwotCi0gIGhhc2hlciBoYXNoX2Z1bmN0KCkgY29uc3QgeyByZXR1cm4gX01faHQuaGFzaF9mdW5jdCgpOyB9Ci0gIGtleV9lcXVhbCBrZXlfZXEoKSBjb25zdCB7IHJldHVybiBfTV9odC5rZXlfZXEoKTsgfQotICBhbGxvY2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9yKCkgY29uc3QgeyByZXR1cm4gX01faHQuZ2V0X2FsbG9jYXRvcigpOyB9Ci0KLXByaXZhdGU6Ci0gIF9IdCBfTV9odDsKLSAgX1NUTFBfS0VZX1RZUEVfRk9SX0NPTlRfRVhUKGtleV90eXBlKQotCi1wdWJsaWM6Ci0gIGhhc2hfbXVsdGlzZXQoKQotICAgIDogX01faHQoMTAwLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpIHt9Ci0gIGV4cGxpY2l0IGhhc2hfbXVsdGlzZXQoc2l6ZV90eXBlIF9fbikKLSAgICA6IF9NX2h0KF9fbiwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKSB7fQotICBoYXNoX211bHRpc2V0KHNpemVfdHlwZSBfX24sIGNvbnN0IGhhc2hlciYgX19oZikKLSAgICA6IF9NX2h0KF9fbiwgX19oZiwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpIHt9Ci0gIGhhc2hfbXVsdGlzZXQoc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsKQotICAgIDogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgYWxsb2NhdG9yX3R5cGUoKSkge30KLSAgaGFzaF9tdWx0aXNldChzaXplX3R5cGUgX19uLCBjb25zdCBoYXNoZXImIF9faGYsIGNvbnN0IGtleV9lcXVhbCYgX19lcWwsCi0gICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKLSAgICA6IF9NX2h0KF9fbiwgX19oZiwgX19lcWwsIF9fYSkge30KLQotICBoYXNoX211bHRpc2V0KF9fbW92ZV9zb3VyY2U8X1NlbGY+IHNyYykKLSAgICA6IF9NX2h0KF9fbW92ZV9zb3VyY2U8X0h0PihzcmMuZ2V0KCkuX01faHQpKSB7fQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgotICBoYXNoX211bHRpc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sKQotICAgIDogX01faHQoMTAwLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCi0gICAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLCBfX2wpOyB9Ci0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KLSAgaGFzaF9tdWx0aXNldChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbikKLSAgICA6IF9NX2h0KF9fbiwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQotICAgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZiwgX19sKTsgfQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Ci0gIGhhc2hfbXVsdGlzZXQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsIHNpemVfdHlwZSBfX24sCi0gICAgICAgICAgICAgICAgY29uc3QgaGFzaGVyJiBfX2hmKQotICAgIDogX01faHQoX19uLCBfX2hmLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKLSAgICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsIF9fbCk7IH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Ci0gIGhhc2hfbXVsdGlzZXQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsIHNpemVfdHlwZSBfX24sCi0gICAgICAgICAgICAgICAgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLAotICAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgX1NUTFBfQUxMT0NBVE9SX1RZUEVfREZMKQotICAgIDogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgX19hKQotICAgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZiwgX19sKTsgfQotIyAgaWYgZGVmaW5lZCAoX1NUTFBfTkVFRFNfRVhUUkFfVEVNUExBVEVfQ09OU1RSVUNUT1JTKQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Ci0gIGhhc2hfbXVsdGlzZXQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsIHNpemVfdHlwZSBfX24sCi0gICAgICAgICAgICAgICAgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsKQotICAgIDogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgYWxsb2NhdG9yX3R5cGUoKSkKLSAgICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsIF9fbCk7IH0KLSMgIGVuZGlmCi0jZWxzZQotICBoYXNoX211bHRpc2V0KGNvbnN0IHZhbHVlX3R5cGUqIF9fZiwgY29uc3QgdmFsdWVfdHlwZSogX19sKQotICAgIDogX01faHQoMTAwLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCi0gICAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLCBfX2wpOyB9Ci0gIGhhc2hfbXVsdGlzZXQoY29uc3QgdmFsdWVfdHlwZSogX19mLCBjb25zdCB2YWx1ZV90eXBlKiBfX2wsIHNpemVfdHlwZSBfX24pCi0gICAgOiBfTV9odChfX24sIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKLSAgICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsIF9fbCk7IH0KLSAgaGFzaF9tdWx0aXNldChjb25zdCB2YWx1ZV90eXBlKiBfX2YsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbCwgc2l6ZV90eXBlIF9fbiwKLSAgICAgICAgICAgICAgICBjb25zdCBoYXNoZXImIF9faGYpCi0gICAgOiBfTV9odChfX24sIF9faGYsIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQotICAgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZiwgX19sKTsgfQotICBoYXNoX211bHRpc2V0KGNvbnN0IHZhbHVlX3R5cGUqIF9fZiwgY29uc3QgdmFsdWVfdHlwZSogX19sLCBzaXplX3R5cGUgX19uLAotICAgICAgICAgICAgICAgIGNvbnN0IGhhc2hlciYgX19oZiwgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCwKLSAgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKLSAgICA6IF9NX2h0KF9fbiwgX19oZiwgX19lcWwsIF9fYSkKLSAgICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsIF9fbCk7IH0KLQotICBoYXNoX211bHRpc2V0KGNvbnN0X2l0ZXJhdG9yIF9fZiwgY29uc3RfaXRlcmF0b3IgX19sKQotICAgIDogX01faHQoMTAwLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCi0gICAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLCBfX2wpOyB9Ci0gIGhhc2hfbXVsdGlzZXQoY29uc3RfaXRlcmF0b3IgX19mLCBjb25zdF9pdGVyYXRvciBfX2wsIHNpemVfdHlwZSBfX24pCi0gICAgOiBfTV9odChfX24sIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKLSAgICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsIF9fbCk7IH0KLSAgaGFzaF9tdWx0aXNldChjb25zdF9pdGVyYXRvciBfX2YsIGNvbnN0X2l0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbiwKLSAgICAgICAgICAgICAgICBjb25zdCBoYXNoZXImIF9faGYpCi0gICAgOiBfTV9odChfX24sIF9faGYsIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQotICAgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZiwgX19sKTsgfQotICBoYXNoX211bHRpc2V0KGNvbnN0X2l0ZXJhdG9yIF9fZiwgY29uc3RfaXRlcmF0b3IgX19sLCBzaXplX3R5cGUgX19uLAotICAgICAgICAgICAgICAgIGNvbnN0IGhhc2hlciYgX19oZiwgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCwKLSAgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKLSAgICA6IF9NX2h0KF9fbiwgX19oZiwgX19lcWwsIF9fYSkKLSAgICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsIF9fbCk7IH0KLSNlbmRpZiAvKl9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KLQotcHVibGljOgotICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LnNpemUoKTsgfQotICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCB7IHJldHVybiBfTV9odC5tYXhfc2l6ZSgpOyB9Ci0gIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBfTV9odC5lbXB0eSgpOyB9Ci0gIHZvaWQgc3dhcChfU2VsZiYgaHMpIHsgX01faHQuc3dhcChocy5fTV9odCk7IH0KLQotICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIF9NX2h0LmJlZ2luKCk7IH0KLSAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gX01faHQuZW5kKCk7IH0KLSAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBfTV9odC5iZWdpbigpOyB9Ci0gIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmVuZCgpOyB9Ci0KLXB1YmxpYzoKLSAgaXRlcmF0b3IgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKSB7IHJldHVybiBfTV9odC5pbnNlcnRfZXF1YWwoX19vYmopOyB9Ci0jaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgotICB2b2lkIGluc2VydChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCkKLSAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLF9fbCk7IH0KLSNlbHNlCi0gIHZvaWQgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUqIF9fZiwgY29uc3QgdmFsdWVfdHlwZSogX19sKQotICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsX19sKTsgfQotICB2b2lkIGluc2VydChjb25zdF9pdGVyYXRvciBfX2YsIGNvbnN0X2l0ZXJhdG9yIF9fbCkKLSAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLCBfX2wpOyB9Ci0jZW5kaWYgLypfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCi0gIGl0ZXJhdG9yIGluc2VydF9ub3Jlc2l6ZShjb25zdCB2YWx1ZV90eXBlJiBfX29iaikKLSAgeyByZXR1cm4gX01faHQuaW5zZXJ0X2VxdWFsX25vcmVzaXplKF9fb2JqKTsgfQotCi0gIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAotICBpdGVyYXRvciBmaW5kKGNvbnN0IF9LVCYgX19rZXkpIHsgcmV0dXJuIF9NX2h0LmZpbmQoX19rZXkpOyB9Ci0KLSAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0gIGNvbnN0X2l0ZXJhdG9yIGZpbmQoY29uc3QgX0tUJiBfX2tleSkgY29uc3QgeyByZXR1cm4gX01faHQuZmluZChfX2tleSk7IH0KLQotICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKLSAgc2l6ZV90eXBlIGNvdW50KGNvbnN0IF9LVCYgX19rZXkpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmNvdW50KF9fa2V5KTsgfQotCi0gIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAotICBwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4gZXF1YWxfcmFuZ2UoY29uc3QgX0tUJiBfX2tleSkKLSAgeyByZXR1cm4gX01faHQuZXF1YWxfcmFuZ2UoX19rZXkpOyB9Ci0gIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAotICBwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4gZXF1YWxfcmFuZ2UoY29uc3QgX0tUJiBfX2tleSkgY29uc3QKLSAgeyByZXR1cm4gX01faHQuZXF1YWxfcmFuZ2UoX19rZXkpOyB9Ci0KLSAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0gIHNpemVfdHlwZSBlcmFzZShjb25zdCBfS1QmIF9fa2V5KSB7cmV0dXJuIF9NX2h0LmVyYXNlKF9fa2V5KTsgfQotICB2b2lkIGVyYXNlKGl0ZXJhdG9yIF9faXQpIHsgX01faHQuZXJhc2UoX19pdCk7IH0KLSAgdm9pZCBlcmFzZShpdGVyYXRvciBfX2YsIGl0ZXJhdG9yIF9fbCkgeyBfTV9odC5lcmFzZShfX2YsIF9fbCk7IH0KLSAgdm9pZCBjbGVhcigpIHsgX01faHQuY2xlYXIoKTsgfQotCi1wdWJsaWM6Ci0gIHZvaWQgcmVzaXplKHNpemVfdHlwZSBfX2hpbnQpIHsgX01faHQucmVzaXplKF9faGludCk7IH0KLSAgc2l6ZV90eXBlIGJ1Y2tldF9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmJ1Y2tldF9jb3VudCgpOyB9Ci0gIHNpemVfdHlwZSBtYXhfYnVja2V0X2NvdW50KCkgY29uc3QgeyByZXR1cm4gX01faHQubWF4X2J1Y2tldF9jb3VudCgpOyB9Ci0gIHNpemVfdHlwZSBlbGVtc19pbl9idWNrZXQoc2l6ZV90eXBlIF9fbikgY29uc3QKLSAgeyByZXR1cm4gX01faHQuZWxlbXNfaW5fYnVja2V0KF9fbik7IH0KLX07Ci0KLSNkZWZpbmUgX1NUTFBfVEVNUExBVEVfSEVBREVSIHRlbXBsYXRlIDxjbGFzcyBfVmFsdWUsIGNsYXNzIF9IYXNoRmNuLCBjbGFzcyBfRXF1YWxLZXksIGNsYXNzIF9BbGxvYz4KLSNkZWZpbmUgX1NUTFBfVEVNUExBVEVfQ09OVEFJTkVSIGhhc2hfc2V0PF9WYWx1ZSxfSGFzaEZjbixfRXF1YWxLZXksX0FsbG9jPgotCi0jaW5jbHVkZSA8c3RsL19yZWxvcHNfaGFzaF9jb250Lmg+Ci0KLSN1bmRlZiBfU1RMUF9URU1QTEFURV9DT05UQUlORVIKLSNkZWZpbmUgX1NUTFBfVEVNUExBVEVfQ09OVEFJTkVSIGhhc2hfbXVsdGlzZXQ8X1ZhbHVlLF9IYXNoRmNuLF9FcXVhbEtleSxfQWxsb2M+Ci0jaW5jbHVkZSA8c3RsL19yZWxvcHNfaGFzaF9jb250Lmg+Ci0KLSN1bmRlZiBfU1RMUF9URU1QTEFURV9DT05UQUlORVIKLSN1bmRlZiBfU1RMUF9URU1QTEFURV9IRUFERVIKLQotLy8gU3BlY2lhbGl6YXRpb24gb2YgaW5zZXJ0X2l0ZXJhdG9yIHNvIHRoYXQgaXQgd2lsbCB3b3JrIGZvciBoYXNoX3NldAotLy8gYW5kIGhhc2hfbXVsdGlzZXQuCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQotdGVtcGxhdGUgPGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0hhc2hGY24sIGNsYXNzIF9FcXVhbEtleSwgY2xhc3MgX0FsbG9jPgotc3RydWN0IF9fbW92ZV90cmFpdHM8aGFzaF9zZXQ8X1ZhbHVlLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+ID4gOgotICBfU1RMUF9QUklWIF9fbW92ZV90cmFpdHNfYXV4PHR5cGVuYW1lIGhhc2hfc2V0PF9WYWx1ZSwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPjo6X0h0Pgote307Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVmFsdWUsIGNsYXNzIF9IYXNoRmNuLCBjbGFzcyBfRXF1YWxLZXksIGNsYXNzIF9BbGxvYz4KLXN0cnVjdCBfX21vdmVfdHJhaXRzPGhhc2hfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+ID4gOgotICBfU1RMUF9QUklWIF9fbW92ZV90cmFpdHNfYXV4PHR5cGVuYW1lIGhhc2hfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+OjpfSHQ+Ci17fTsKLQotdGVtcGxhdGUgPGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0hhc2hGY24sIGNsYXNzIF9FcXVhbEtleSwgY2xhc3MgX0FsbG9jPgotY2xhc3MgaW5zZXJ0X2l0ZXJhdG9yPGhhc2hfc2V0PF9WYWx1ZSwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPiA+IHsKLXByb3RlY3RlZDoKLSAgdHlwZWRlZiBoYXNoX3NldDxfVmFsdWUsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4gX0NvbnRhaW5lcjsKLSAgX0NvbnRhaW5lciogY29udGFpbmVyOwotcHVibGljOgotICB0eXBlZGVmIF9Db250YWluZXIgICAgICAgICAgY29udGFpbmVyX3R5cGU7Ci0gIHR5cGVkZWYgb3V0cHV0X2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKLSAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7Ci0gIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7Ci0gIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICBwb2ludGVyOwotICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgcmVmZXJlbmNlOwotCi0gIGluc2VydF9pdGVyYXRvcihfQ29udGFpbmVyJiBfX3gpIDogY29udGFpbmVyKCZfX3gpIHt9Ci0gIGluc2VydF9pdGVyYXRvcihfQ29udGFpbmVyJiBfX3gsIHR5cGVuYW1lIF9Db250YWluZXI6Oml0ZXJhdG9yKQotICAgIDogY29udGFpbmVyKCZfX3gpIHt9Ci0gIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYKLSAgb3BlcmF0b3I9KGNvbnN0IHR5cGVuYW1lIF9Db250YWluZXI6OnZhbHVlX3R5cGUmIF9fdmFsKSB7Ci0gICAgY29udGFpbmVyLT5pbnNlcnQoX192YWwpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mIG9wZXJhdG9yKigpIHsgcmV0dXJuICp0aGlzOyB9Ci0gIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYgb3BlcmF0b3IrKygpIHsgcmV0dXJuICp0aGlzOyB9Ci0gIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYgb3BlcmF0b3IrKyhpbnQpIHsgcmV0dXJuICp0aGlzOyB9Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaEZjbiwgY2xhc3MgX0VxdWFsS2V5LCBjbGFzcyBfQWxsb2M+Ci1jbGFzcyBpbnNlcnRfaXRlcmF0b3I8aGFzaF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4gPiB7Ci1wcm90ZWN0ZWQ6Ci0gIHR5cGVkZWYgaGFzaF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4gX0NvbnRhaW5lcjsKLSAgX0NvbnRhaW5lciogY29udGFpbmVyOwotICB0eXBlbmFtZSBfQ29udGFpbmVyOjppdGVyYXRvciBpdGVyOwotcHVibGljOgotICB0eXBlZGVmIF9Db250YWluZXIgICAgICAgICAgY29udGFpbmVyX3R5cGU7Ci0gIHR5cGVkZWYgb3V0cHV0X2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKLSAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7Ci0gIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7Ci0gIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICBwb2ludGVyOwotICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgcmVmZXJlbmNlOwotCi0gIGluc2VydF9pdGVyYXRvcihfQ29udGFpbmVyJiBfX3gpIDogY29udGFpbmVyKCZfX3gpIHt9Ci0gIGluc2VydF9pdGVyYXRvcihfQ29udGFpbmVyJiBfX3gsIHR5cGVuYW1lIF9Db250YWluZXI6Oml0ZXJhdG9yKQotICAgIDogY29udGFpbmVyKCZfX3gpIHt9Ci0gIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYKLSAgb3BlcmF0b3I9KGNvbnN0IHR5cGVuYW1lIF9Db250YWluZXI6OnZhbHVlX3R5cGUmIF9fdmFsKSB7Ci0gICAgY29udGFpbmVyLT5pbnNlcnQoX192YWwpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mIG9wZXJhdG9yKigpIHsgcmV0dXJuICp0aGlzOyB9Ci0gIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYgb3BlcmF0b3IrKygpIHsgcmV0dXJuICp0aGlzOyB9Ci0gIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYgb3BlcmF0b3IrKyhpbnQpIHsgcmV0dXJuICp0aGlzOyB9Ci19OwotI2VuZGlmIC8qIF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04gKi8KLQotX1NUTFBfRU5EX05BTUVTUEFDRQotCi0jZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfSEFTSF9TRVRfSCAqLwotCi0vLyBMb2NhbCBWYXJpYWJsZXM6Ci0vLyBtb2RlOkMrKwotLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RsL19oYXNodGFibGUuYyBiL3N0bC9faGFzaHRhYmxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ZGFmYTIuLjAwMDAwMDAKLS0tIGEvc3RsL19oYXNodGFibGUuYworKysgL2Rldi9udWxsCkBAIC0xLDQ3OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk0Ci0gKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3Ci0gKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTcKLSAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotI2lmbmRlZiBfU1RMUF9IQVNIVEFCTEVfQwotI2RlZmluZSBfU1RMUF9IQVNIVEFCTEVfQwotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0hBU0hUQUJMRV9ICi0jICBpbmNsdWRlIDxzdGwvX2hhc2h0YWJsZS5oPgotI2VuZGlmCi0KLV9TVExQX0JFR0lOX05BTUVTUEFDRQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfRVhQT1NFX0dMT0JBTFNfSU1QTEVNRU5UQVRJT04pCi0KLV9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKLQotIyAgZGVmaW5lIF9fUFJJTUVfTElTVF9CT0RZIHsgXAotICA3dWwsICAgICAgICAgIDIzdWwsIFwKLSAgNTN1bCwgICAgICAgICA5N3VsLCAgICAgICAgIDE5M3VsLCAgICAgICAzODl1bCwgICAgICAgNzY5dWwsICAgICAgXAotICAxNTQzdWwsICAgICAgIDMwNzl1bCwgICAgICAgNjE1MXVsLCAgICAgIDEyMjg5dWwsICAgICAyNDU5M3VsLCAgICBcCi0gIDQ5MTU3dWwsICAgICAgOTgzMTd1bCwgICAgICAxOTY2MTN1bCwgICAgMzkzMjQxdWwsICAgIDc4NjQzM3VsLCAgIFwKLSAgMTU3Mjg2OXVsLCAgICAzMTQ1NzM5dWwsICAgIDYyOTE0Njl1bCwgICAxMjU4MjkxN3VsLCAgMjUxNjU4NDN1bCwgXAotICA1MDMzMTY1M3VsLCAgIDEwMDY2MzMxOXVsLCAgMjAxMzI2NjExdWwsIDQwMjY1MzE4OXVsLCA4MDUzMDY0NTd1bCxcCi0gIDE2MTA2MTI3NDF1bCwgMzIyMTIyNTQ3M3VsLCA0Mjk0OTY3MjkxdWwgIFwKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9EdW1teT4KLXNpemVfdCBfU1RMUF9DQUxMCi1fU3RsX3ByaW1lPF9EdW1teT46Ol9TX21heF9uYl9idWNrZXRzKCkgewotICBjb25zdCBzaXplX3QgX2xpc3RbXSA9IF9fUFJJTUVfTElTVF9CT0RZOwotIyAgaWZuZGVmIF9fTVdFUktTX18KLSAgcmV0dXJuIF9saXN0WyhzaXplb2YoX2xpc3QpL3NpemVvZihfbGlzdFswXSkpIC0gMV07Ci0jICBlbHNlCi0gIHJldHVybiBfbGlzdFszMC9zaXplb2Yoc2l6ZV90KSAtIDFdOyAvLyBzdHVwaWQgTVdFUktTIQotIyAgZW5kaWYKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9EdW1teT4KLXNpemVfdCBfU1RMUF9DQUxMCi1fU3RsX3ByaW1lPF9EdW1teT46Ol9TX25leHRfc2l6ZShzaXplX3QgX19uKSB7Ci0gIHN0YXRpYyBjb25zdCBzaXplX3QgX2xpc3RbXSA9IF9fUFJJTUVfTElTVF9CT0RZOwotICBjb25zdCBzaXplX3QqIF9fZmlyc3QgPSBfbGlzdDsKLSMgIGlmbmRlZiBfX01XRVJLU19fCi0gIGNvbnN0IHNpemVfdCogX19sYXN0ID0gIF9saXN0ICsgKHNpemVvZihfbGlzdCkvc2l6ZW9mKF9saXN0WzBdKSk7Ci0jICBlbHNlCi0gIGNvbnN0IHNpemVfdCogX19sYXN0ID0gIF9saXN0ICsgKDMwL3NpemVvZihzaXplX3QpKTsgLy8gc3R1cGlkIE1XRVJLUwotIyAgZW5kaWYKLSAgY29uc3Qgc2l6ZV90KiBwb3MgPSBfX2xvd2VyX2JvdW5kKF9fZmlyc3QsIF9fbGFzdCwgX19uLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbGVzcygoc2l6ZV90KikwKSwgX19sZXNzKChzaXplX3QqKTApLCAocHRyZGlmZl90KikwKTsKLSAgcmV0dXJuIChwb3MgPT0gX19sYXN0ID8gKihfX2xhc3QgLSAxKSA6ICpwb3MpOwotfQotCi0jICB1bmRlZiBfX1BSSU1FX0xJU1RfQk9EWQotCi1fU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKLQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9ERUJVRykKLSMgIGRlZmluZSBoYXNodGFibGUgX1NUTFBfTk9OX0RCR19OQU1FKGhhc2h0YWJsZSkKLV9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKLSNlbmRpZgotCi0vLyBmYnA6IHRoZXNlIGRlZmluZXMgYXJlIGZvciBvdXRsaW5lIG1ldGhvZHMgZGVmaW5pdGlvbnMuCi0vLyBuZWVkZWQgdG8gZGVmaW5pdGlvbnMgdG8gYmUgcG9ydGFibGUuIFNob3VsZCBub3QgYmUgdXNlZCBpbiBtZXRob2QgYm9kaWVzLgotCi0jaWYgZGVmaW5lZCAoIF9TVExQX05FU1RFRF9UWVBFX1BBUkFNX0JVRyApCi0jICBkZWZpbmUgX19zaXplX3R5cGVfXyAgICAgICBzaXplX3QKLSMgIGRlZmluZSBzaXplX3R5cGUgICAgICAgICAgIHNpemVfdAotIyAgZGVmaW5lIHZhbHVlX3R5cGUgICAgICAgICAgX1ZhbAotIyAgZGVmaW5lIGtleV90eXBlICAgICAgICAgICAgX0tleQotIyAgZGVmaW5lIF9fcmVmZXJlbmNlX18gICAgICAgX1ZhbCYKLQotIyAgZGVmaW5lIF9faXRlcmF0b3JfXyAgICAgICAgX0h0X2l0ZXJhdG9yPF9WYWwsIF9TVExQX0hFQURFUl9UWVBFTkFNRSBfVHJhaXRzOjpfTm9uQ29uc3RUcmFpdHMsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfS2V5LCBfSEYsIF9FeEssIF9FcUssIF9BbGw+Ci0jICBkZWZpbmUgX19jb25zdF9pdGVyYXRvcl9fICBfSHRfaXRlcmF0b3I8X1ZhbCwgX1NUTFBfSEVBREVSX1RZUEVOQU1FIF9UcmFpdHM6Ol9Db25zdFRyYWl0cywgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9LZXksIF9IRiwgX0V4SywgX0VxSywgX0FsbD4KLSNlbHNlCi0jICBkZWZpbmUgX19zaXplX3R5cGVfXyAgICAgICBfU1RMUF9UWVBFTkFNRV9PTl9SRVRVUk5fVFlQRSBoYXNodGFibGU8X1ZhbCwgX0tleSwgX0hGLCBfVHJhaXRzLCBfRXhLLCBfRXFLLCBfQWxsPjo6c2l6ZV90eXBlCi0jICBkZWZpbmUgX19yZWZlcmVuY2VfXyAgICAgICBfU1RMUF9UWVBFTkFNRV9PTl9SRVRVUk5fVFlQRSAgaGFzaHRhYmxlPF9WYWwsIF9LZXksIF9IRiwgX1RyYWl0cywgX0V4SywgX0VxSywgX0FsbD46OnJlZmVyZW5jZQotIyAgZGVmaW5lIF9faXRlcmF0b3JfXyAgICAgICAgX1NUTFBfVFlQRU5BTUVfT05fUkVUVVJOX1RZUEUgaGFzaHRhYmxlPF9WYWwsIF9LZXksIF9IRiwgX1RyYWl0cywgX0V4SywgX0VxSywgX0FsbD46Oml0ZXJhdG9yCi0jICBkZWZpbmUgX19jb25zdF9pdGVyYXRvcl9fICBfU1RMUF9UWVBFTkFNRV9PTl9SRVRVUk5fVFlQRSBoYXNodGFibGU8X1ZhbCwgX0tleSwgX0hGLCBfVHJhaXRzLCBfRXhLLCBfRXFLLCBfQWxsPjo6Y29uc3RfaXRlcmF0b3IKLSNlbmRpZgotCi0vKgotICogVGhpcyBtZXRob2QgaXMgdG9vIGRpZmZpY3VsdCB0byBpbXBsZW1lbnQgZm9yIGhhc2h0YWJsZSB0aGF0IGRvIG5vdAotICogcmVxdWlyZSBhIHNvcnRlZCBvcGVyYXRpb24gb24gdGhlIHN0b3JlZCB0eXBlLgotdGVtcGxhdGUgPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwKLSAgICAgICAgICBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfRXhLLCBjbGFzcyBfRXFLLCBjbGFzcyBfQWxsPgotYm9vbCBoYXNodGFibGU8X1ZhbCxfS2V5LF9IRixfVHJhaXRzLF9FeEssX0VxSyxfQWxsPjo6X01fZXF1YWwoCi0gICAgICAgICAgICAgIGNvbnN0IGhhc2h0YWJsZTxfVmFsLF9LZXksX0hGLF9UcmFpdHMsX0V4SyxfRXFLLF9BbGw+JiBfX2h0MSwKLSAgICAgICAgICAgICAgY29uc3QgaGFzaHRhYmxlPF9WYWwsX0tleSxfSEYsX1RyYWl0cyxfRXhLLF9FcUssX0FsbD4mIF9faHQyKSB7Ci0gIHJldHVybiBfX2h0MS5fTV9idWNrZXRzID09IF9faHQyLl9NX2J1Y2tldHMgJiYKLSAgICAgICAgIF9faHQxLl9NX2VsZW1zID09IF9faHQyLl9NX2VsZW1zOwotfQotKi8KLQotLyogUmV0dXJucyB0aGUgaXRlcmF0b3IgYmVmb3JlIHRoZSBmaXJzdCBpdGVyYXRvciBvZiB0aGUgYnVja2V0IF9fbiBhbmQgc2V0Ci0gKiBfX24gdG8gdGhlIGZpcnN0IHByZXZpb3VzIGJ1Y2tldCBoYXZpbmcgdGhlIHNhbWUgZmlyc3QgaXRlcmF0b3IgYXMgYnVja2V0Ci0gKiBfX24uCi0gKi8KLXRlbXBsYXRlIDxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSEYsCi0gICAgICAgICAgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0V4SywgY2xhc3MgX0VxSywgY2xhc3MgX0FsbD4KLV9faXRlcmF0b3JfXwotaGFzaHRhYmxlPF9WYWwsX0tleSxfSEYsX1RyYWl0cyxfRXhLLF9FcUssX0FsbD4KLSAgOjpfTV9iZWZvcmVfYmVnaW4oc2l6ZV90eXBlICZfX24pIGNvbnN0IHsKLSAgcmV0dXJuIF9TX2JlZm9yZV9iZWdpbihfTV9lbGVtcywgX01fYnVja2V0cywgX19uKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwKLSAgICAgICAgICBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfRXhLLCBjbGFzcyBfRXFLLCBjbGFzcyBfQWxsPgotX19pdGVyYXRvcl9fCi1oYXNodGFibGU8X1ZhbCxfS2V5LF9IRixfVHJhaXRzLF9FeEssX0VxSyxfQWxsPgotICA6Ol9TX2JlZm9yZV9iZWdpbihjb25zdCBfRWxlbXNDb250JiBfX2VsZW1zLCBjb25zdCBfQnVja2V0VmVjdG9yJiBfX2J1Y2tldHMsCi0gICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSAmX19uKSB7Ci0gIF9FbGVtc0NvbnQgJl9fbXV0YWJsZV9lbGVtcyA9IF9fQ09OU1RfQ0FTVChfRWxlbXNDb250JiwgX19lbGVtcyk7Ci0gIHR5cGVuYW1lIF9CdWNrZXRWZWN0b3I6OmNvbnN0X2l0ZXJhdG9yIF9fYnBvcyhfX2J1Y2tldHMuYmVnaW4oKSArIF9fbik7Ci0KLSAgX0VsZW1zSXRlIF9fcG9zKCpfX2Jwb3MpOwotICBpZiAoX19wb3MgPT0gX19tdXRhYmxlX2VsZW1zLmJlZ2luKCkpIHsKLSAgICBfX24gPSAwOwotICAgIHJldHVybiBfX211dGFibGVfZWxlbXMuYmVmb3JlX2JlZ2luKCk7Ci0gIH0KLQotICB0eXBlbmFtZSBfQnVja2V0VmVjdG9yOjpjb25zdF9pdGVyYXRvciBfX2JjdXIoX19icG9zKTsKLSAgX0J1Y2tldFR5cGUgKl9fcG9zX25vZGUgPSBfX3Bvcy5fTV9ub2RlOwotICBmb3IgKC0tX19iY3VyOyBfX3Bvc19ub2RlID09ICpfX2JjdXI7IC0tX19iY3VyKTsKLQotICBfX24gPSBfX2JjdXIgLSBfX2J1Y2tldHMuYmVnaW4oKSArIDE7Ci0gIF9FbGVtc0l0ZSBfX2N1cigqX19iY3VyKTsKLSAgX0VsZW1zSXRlIF9fcHJldiA9IF9fY3VyKys7Ci0gIGZvciAoOyBfX2N1ciAhPSBfX3BvczsgKytfX3ByZXYsICsrX19jdXIpOwotICByZXR1cm4gX19wcmV2OwotfQotCi0KLXRlbXBsYXRlIDxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSEYsCi0gICAgICAgICAgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0V4SywgY2xhc3MgX0VxSywgY2xhc3MgX0FsbD4KLV9faXRlcmF0b3JfXwotaGFzaHRhYmxlPF9WYWwsX0tleSxfSEYsX1RyYWl0cyxfRXhLLF9FcUssX0FsbD4KLSAgOjpfTV9pbnNlcnRfbm9yZXNpemUoc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX19vYmopIHsKLSAgLy9XZSBhbHdheXMgaW5zZXJ0IHRoaXMgZWxlbWVudCBhcyAxc3QgaW4gdGhlIGJ1Y2tldCB0byBub3QgYnJlYWsKLSAgLy90aGUgZWxlbWVudHMgb3JkZXIgYXMgZXF1YWwgZWxlbWVudHMgbXVzdCBiZSBrZXB0IG5leHQgdG8gZWFjaCBvdGhlci4KLSAgc2l6ZV90eXBlIF9fcHJldiA9IF9fbjsKLSAgX0VsZW1zSXRlIF9fcG9zID0gX01fYmVmb3JlX2JlZ2luKF9fcHJldikuX01faXRlOwotCi0gIGZpbGwoX01fYnVja2V0cy5iZWdpbigpICsgX19wcmV2LCBfTV9idWNrZXRzLmJlZ2luKCkgKyBfX24gKyAxLAotICAgICAgIF9NX2VsZW1zLmluc2VydF9hZnRlcihfX3BvcywgX19vYmopLl9NX25vZGUpOwotICArK19NX251bV9lbGVtZW50czsKLSAgcmV0dXJuIGl0ZXJhdG9yKF9FbGVtc0l0ZShfTV9idWNrZXRzW19fbl0pKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwKLSAgICAgICAgICBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfRXhLLCBjbGFzcyBfRXFLLCBjbGFzcyBfQWxsPgotcGFpcjxfX2l0ZXJhdG9yX18sIGJvb2w+Ci1oYXNodGFibGU8X1ZhbCxfS2V5LF9IRixfVHJhaXRzLF9FeEssX0VxSyxfQWxsPgotICA6Omluc2VydF91bmlxdWVfbm9yZXNpemUoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopIHsKLSAgY29uc3Qgc2l6ZV90eXBlIF9fbiA9IF9NX2JrdF9udW0oX19vYmopOwotICBfRWxlbXNJdGUgX19jdXIoX01fYnVja2V0c1tfX25dKTsKLSAgX0VsZW1zSXRlIF9fbGFzdChfTV9idWNrZXRzW19fbiArIDFdKTsKLQotICBpZiAoX19jdXIgIT0gX19sYXN0KSB7Ci0gICAgZm9yICg7IF9fY3VyICE9IF9fbGFzdDsgKytfX2N1cikgewotICAgICAgaWYgKF9NX2VxdWFscyhfTV9nZXRfa2V5KCpfX2N1ciksIF9NX2dldF9rZXkoX19vYmopKSkgewotICAgICAgICAvL1dlIGNoZWNrIHRoYXQgZXF1aXZhbGVudCBrZXlzIGhhdmUgZXF1YWxzIGhhc2ggY29kZSBhcyBvdGhlcndpc2UsIG9uIHJlc2l6ZSwKLSAgICAgICAgLy9lcXVpdmFsZW50IHZhbHVlIG1pZ2h0IG5vdCBiZSBpbiB0aGUgc2FtZSBidWNrZXQKLSAgICAgICAgX1NUTFBfQVNTRVJUKF9NX2hhc2goX01fZ2V0X2tleSgqX19jdXIpKSA9PSBfTV9oYXNoKF9NX2dldF9rZXkoX19vYmopKSkKLSAgICAgICAgcmV0dXJuIHBhaXI8aXRlcmF0b3IsIGJvb2w+KGl0ZXJhdG9yKF9fY3VyKSwgZmFsc2UpOwotICAgICAgfQotICAgIH0KLSAgICAvKiBIZXJlIHdlIGRvIG5vdCByZWx5IG9uIHRoZSBfTV9pbnNlcnRfbm9yZXNpemUgbWV0aG9kIGFzIHdlIGtub3cKLSAgICAgKiB0aGF0IHdlIGNhbm5vdCBicmVhayBlbGVtZW50IG9yZGVycywgZWxlbWVudHMgYXJlIHVuaXF1ZSwgYW5kCi0gICAgICogaW5zZXJ0aW9uIGFmdGVyIHRoZSBmaXJzdCBidWNrZXQgZWxlbWVudCBpcyBmYXN0ZXIgdGhhbiB3aGF0IGlzCi0gICAgICogZG9uZSBpbiBfTV9pbnNlcnRfbm9yZXNpemUuCi0gICAgICovCi0gICAgX19jdXIgPSBfTV9lbGVtcy5pbnNlcnRfYWZ0ZXIoX0VsZW1zSXRlKF9NX2J1Y2tldHNbX19uXSksIF9fb2JqKTsKLSAgICArK19NX251bV9lbGVtZW50czsKLSAgICByZXR1cm4gcGFpcjxpdGVyYXRvciwgYm9vbD4oaXRlcmF0b3IoX19jdXIpLCB0cnVlKTsKLSAgfQotCi0gIHJldHVybiBwYWlyPGl0ZXJhdG9yLCBib29sPihfTV9pbnNlcnRfbm9yZXNpemUoX19uLCBfX29iaiksIHRydWUpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hGLAotICAgICAgICAgIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9FeEssIGNsYXNzIF9FcUssIGNsYXNzIF9BbGw+Ci1fX2l0ZXJhdG9yX18KLWhhc2h0YWJsZTxfVmFsLF9LZXksX0hGLF9UcmFpdHMsX0V4SyxfRXFLLF9BbGw+Ci0gIDo6aW5zZXJ0X2VxdWFsX25vcmVzaXplKGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKSB7Ci0gIGNvbnN0IHNpemVfdHlwZSBfX24gPSBfTV9ia3RfbnVtKF9fb2JqKTsKLSAgewotICAgIF9FbGVtc0l0ZSBfX2N1cihfTV9idWNrZXRzW19fbl0pOwotICAgIF9FbGVtc0l0ZSBfX2xhc3QoX01fYnVja2V0c1tfX24gKyAxXSk7Ci0KLSAgICBmb3IgKDsgX19jdXIgIT0gX19sYXN0OyArK19fY3VyKSB7Ci0gICAgICBpZiAoX01fZXF1YWxzKF9NX2dldF9rZXkoKl9fY3VyKSwgX01fZ2V0X2tleShfX29iaikpKSB7Ci0gICAgICAgIC8vV2UgY2hlY2sgdGhhdCBlcXVpdmFsZW50IGtleXMgaGF2ZSBlcXVhbHMgaGFzaCBjb2RlIGFzIG90aGVyd2lzZSwgb24gcmVzaXplLAotICAgICAgICAvL2VxdWl2YWxlbnQgdmFsdWUgbWlnaHQgbm90IGJlIGluIHRoZSBzYW1lIGJ1Y2tldAotICAgICAgICBfU1RMUF9BU1NFUlQoX01faGFzaChfTV9nZXRfa2V5KCpfX2N1cikpID09IF9NX2hhc2goX01fZ2V0X2tleShfX29iaikpKQotICAgICAgICArK19NX251bV9lbGVtZW50czsKLSAgICAgICAgcmV0dXJuIF9NX2VsZW1zLmluc2VydF9hZnRlcihfX2N1ciwgX19vYmopOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHJldHVybiBfTV9pbnNlcnRfbm9yZXNpemUoX19uLCBfX29iaik7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSEYsCi0gICAgICAgICAgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0V4SywgY2xhc3MgX0VxSywgY2xhc3MgX0FsbD4KLV9fcmVmZXJlbmNlX18KLWhhc2h0YWJsZTxfVmFsLF9LZXksX0hGLF9UcmFpdHMsX0V4SyxfRXFLLF9BbGw+Ci0gIDo6X01faW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKSB7Ci0gIHJlc2l6ZShfTV9udW1fZWxlbWVudHMgKyAxKTsKLSAgcmV0dXJuICppbnNlcnRfdW5pcXVlX25vcmVzaXplKF9fb2JqKS5maXJzdDsKLX0KLQotLyoKLXRlbXBsYXRlIDxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSEYsCi0gICAgICAgICAgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0V4SywgY2xhc3MgX0VxSywgY2xhc3MgX0FsbD4KLV9fcmVmZXJlbmNlX18KLWhhc2h0YWJsZTxfVmFsLF9LZXksX0hGLF9UcmFpdHMsX0V4SyxfRXFLLF9BbGw+Ci0gIDo6ZmluZF9vcl9pbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopIHsKLSAgX05vZGUqIF9fZmlyc3QgPSBfTV9maW5kKF9NX2dldF9rZXkoX19vYmopKTsKLSAgaWYgKF9fZmlyc3QpCi0gICAgcmV0dXJuIF9fZmlyc3QtPl9NX3ZhbDsKLSAgZWxzZQotICAgIHJldHVybiBfTV9pbnNlcnQoX19vYmopOwotfQotKi8KLQotdGVtcGxhdGUgPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwKLSAgICAgICAgICBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfRXhLLCBjbGFzcyBfRXFLLCBjbGFzcyBfQWxsPgotX19zaXplX3R5cGVfXwotaGFzaHRhYmxlPF9WYWwsX0tleSxfSEYsX1RyYWl0cyxfRXhLLF9FcUssX0FsbD4KLSAgOjplcmFzZShjb25zdCBrZXlfdHlwZSYgX19rZXkpIHsKLSAgY29uc3Qgc2l6ZV90eXBlIF9fbiA9IF9NX2JrdF9udW1fa2V5KF9fa2V5KTsKLQotICBfRWxlbXNJdGUgX19jdXIoX01fYnVja2V0c1tfX25dKTsKLSAgX0VsZW1zSXRlIF9fbGFzdChfTV9idWNrZXRzW19fbiArIDFdKTsKLSAgaWYgKF9fY3VyID09IF9fbGFzdCkKLSAgICByZXR1cm4gMDsKLQotICBzaXplX3R5cGUgX19lcmFzZWQgPSAwOwotICBpZiAoX01fZXF1YWxzKF9NX2dldF9rZXkoKl9fY3VyKSwgX19rZXkpKSB7Ci0gICAgLy9XZSBsb29rIGZvciB0aGUgcG9zIGJlZm9yZSBfX2N1cjoKLSAgICBzaXplX3R5cGUgX19wcmV2X2IgPSBfX247Ci0gICAgX0VsZW1zSXRlIF9fcHJldiA9IF9NX2JlZm9yZV9iZWdpbihfX3ByZXZfYikuX01faXRlOwotICAgIGRvIHsKLSAgICAgIF9fY3VyID0gX01fZWxlbXMuZXJhc2VfYWZ0ZXIoX19wcmV2KTsKLSAgICAgICsrX19lcmFzZWQ7Ci0gICAgfSB3aGlsZSAoKF9fY3VyICE9IF9fbGFzdCkgJiYgX01fZXF1YWxzKF9NX2dldF9rZXkoKl9fY3VyKSwgX19rZXkpKTsKLSAgICBmaWxsKF9NX2J1Y2tldHMuYmVnaW4oKSArIF9fcHJldl9iLCBfTV9idWNrZXRzLmJlZ2luKCkgKyBfX24gKyAxLCBfX2N1ci5fTV9ub2RlKTsKLSAgfQotICBlbHNlIHsKLSAgICBfRWxlbXNJdGUgX19wcmV2ID0gX19jdXIrKzsKLSAgICBmb3IgKDsgX19jdXIgIT0gX19sYXN0OyArK19fcHJldiwgKytfX2N1cikgewotICAgICAgaWYgKF9NX2VxdWFscyhfTV9nZXRfa2V5KCpfX2N1ciksIF9fa2V5KSkgewotICAgICAgICBkbyB7Ci0gICAgICAgICAgX19jdXIgPSBfTV9lbGVtcy5lcmFzZV9hZnRlcihfX3ByZXYpOwotICAgICAgICAgICsrX19lcmFzZWQ7Ci0gICAgICAgIH0gd2hpbGUgKChfX2N1ciAhPSBfX2xhc3QpICYmIF9NX2VxdWFscyhfTV9nZXRfa2V5KCpfX2N1ciksIF9fa2V5KSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIF9NX251bV9lbGVtZW50cyAtPSBfX2VyYXNlZDsKLSAgcmV0dXJuIF9fZXJhc2VkOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hGLAotICAgICAgICAgIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9FeEssIGNsYXNzIF9FcUssIGNsYXNzIF9BbGw+Ci12b2lkIGhhc2h0YWJsZTxfVmFsLF9LZXksX0hGLF9UcmFpdHMsX0V4SyxfRXFLLF9BbGw+Ci0gIDo6ZXJhc2UoY29uc3RfaXRlcmF0b3IgX19pdCkgewotICBjb25zdCBzaXplX3R5cGUgX19uID0gX01fYmt0X251bSgqX19pdCk7Ci0gIF9FbGVtc0l0ZSBfX2N1cihfTV9idWNrZXRzW19fbl0pOwotCi0gIGlmIChfX2N1ciA9PSBfX2l0Ll9NX2l0ZSkgewotICAgIHNpemVfdHlwZSBfX3ByZXZfYiA9IF9fbjsKLSAgICBfRWxlbXNJdGUgX19wcmV2ID0gX01fYmVmb3JlX2JlZ2luKF9fcHJldl9iKS5fTV9pdGU7Ci0gICAgZmlsbChfTV9idWNrZXRzLmJlZ2luKCkgKyBfX3ByZXZfYiwgX01fYnVja2V0cy5iZWdpbigpICsgX19uICsgMSwKLSAgICAgICAgIF9NX2VsZW1zLmVyYXNlX2FmdGVyKF9fcHJldikuX01fbm9kZSk7Ci0gICAgLS1fTV9udW1fZWxlbWVudHM7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgX0VsZW1zSXRlIF9fcHJldiA9IF9fY3VyKys7Ci0gICAgX0VsZW1zSXRlIF9fbGFzdChfTV9idWNrZXRzW19fbiArIDFdKTsKLSAgICBmb3IgKDsgX19jdXIgIT0gX19sYXN0OyArK19fcHJldiwgKytfX2N1cikgewotICAgICAgaWYgKF9fY3VyID09IF9faXQuX01faXRlKSB7Ci0gICAgICAgIF9NX2VsZW1zLmVyYXNlX2FmdGVyKF9fcHJldik7Ci0gICAgICAgIC0tX01fbnVtX2VsZW1lbnRzOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwKLSAgICAgICAgICBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfRXhLLCBjbGFzcyBfRXFLLCBjbGFzcyBfQWxsPgotdm9pZCBoYXNodGFibGU8X1ZhbCxfS2V5LF9IRixfVHJhaXRzLF9FeEssX0VxSyxfQWxsPgotICA6OmVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkgewotICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCi0gICAgcmV0dXJuOwotICBzaXplX3R5cGUgX19mX2J1Y2tldCA9IF9NX2JrdF9udW0oKl9fZmlyc3QpOwotICBzaXplX3R5cGUgX19sX2J1Y2tldCA9IF9fbGFzdCAhPSBlbmQoKSA/IF9NX2JrdF9udW0oKl9fbGFzdCkgOiAoX01fYnVja2V0cy5zaXplKCkgLSAxKTsKLQotICBfRWxlbXNJdGUgX19jdXIoX01fYnVja2V0c1tfX2ZfYnVja2V0XSk7Ci0gIF9FbGVtc0l0ZSBfX3ByZXY7Ci0gIGlmIChfX2N1ciA9PSBfX2ZpcnN0Ll9NX2l0ZSkgewotICAgIF9fcHJldiA9IF9NX2JlZm9yZV9iZWdpbihfX2ZfYnVja2V0KS5fTV9pdGU7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgX0VsZW1zSXRlIF9fbGFzdChfTV9idWNrZXRzWysrX19mX2J1Y2tldF0pOwotICAgIF9fcHJldiA9IF9fY3VyKys7Ci0gICAgZm9yICg7IChfX2N1ciAhPSBfX2xhc3QpICYmIChfX2N1ciAhPSBfX2ZpcnN0Ll9NX2l0ZSk7ICsrX19wcmV2LCArK19fY3VyKTsKLSAgfQotICAvL1dlIGRvIG5vdCB1c2UgdGhlIHNsaXN0OjplcmFzZV9hZnRlciBtZXRob2QgdGFraW5nIGEgcmFuZ2UgdG8gY291bnQgdGhlCi0gIC8vbnVtYmVyIG9mIGVyYXNlZCBlbGVtZW50czoKLSAgd2hpbGUgKF9fY3VyICE9IF9fbGFzdC5fTV9pdGUpIHsKLSAgICBfX2N1ciA9IF9NX2VsZW1zLmVyYXNlX2FmdGVyKF9fcHJldik7Ci0gICAgLS1fTV9udW1fZWxlbWVudHM7Ci0gIH0KLSAgZmlsbChfTV9idWNrZXRzLmJlZ2luKCkgKyBfX2ZfYnVja2V0LCBfTV9idWNrZXRzLmJlZ2luKCkgKyBfX2xfYnVja2V0ICsgMSwgX19jdXIuX01fbm9kZSk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSEYsCi0gICAgICAgICAgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0V4SywgY2xhc3MgX0VxSywgY2xhc3MgX0FsbD4KLXZvaWQgaGFzaHRhYmxlPF9WYWwsX0tleSxfSEYsX1RyYWl0cyxfRXhLLF9FcUssX0FsbD4KLSAgOjpyZWhhc2goc2l6ZV90eXBlIF9fbnVtX2J1Y2tldHNfaGludCkgewotICBpZiAoKGJ1Y2tldF9jb3VudCgpID49IF9fbnVtX2J1Y2tldHNfaGludCkgJiYKLSAgICAgIChtYXhfbG9hZF9mYWN0b3IoKSA+IGxvYWRfZmFjdG9yKCkpKQotICAgIHJldHVybjsKLQotICAvL0hlcmUgaWYgbWF4X2xvYWRfZmFjdG9yIGlzIGxvd2VyIHRoYW4gMS4wIHRoZSByZXN1bHRpbmcgdmFsdWUgbWlnaHQgbm90IGJlIHJlcHJlc2VudGFibGUKLSAgLy9hcyBhIHNpemVfdHlwZS4gVGhlIHJlc3VsdCBjb25jZXJuaW5nIHRoZSByZXNwZWN0IG9mIHRoZSBtYXhfbG9hZF9mYWN0b3Igd2lsbCB0aGVuIGJlCi0gIC8vdW5kZWZpbmVkLgotICBfX251bV9idWNrZXRzX2hpbnQgPSAobWF4KSAoX19udW1fYnVja2V0c19oaW50LCAoc2l6ZV90eXBlKSgoZmxvYXQpc2l6ZSgpIC8gbWF4X2xvYWRfZmFjdG9yKCkpKTsKLSAgc2l6ZV90eXBlIF9fbnVtX2J1Y2tldHMgPSBfU1RMUF9QUklWIF9TdGxfcHJpbWVfdHlwZTo6X1NfbmV4dF9zaXplKF9fbnVtX2J1Y2tldHNfaGludCk7Ci0gIF9NX3JlaGFzaChfX251bV9idWNrZXRzKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwKLSAgICAgICAgICBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfRXhLLCBjbGFzcyBfRXFLLCBjbGFzcyBfQWxsPgotdm9pZCBoYXNodGFibGU8X1ZhbCxfS2V5LF9IRixfVHJhaXRzLF9FeEssX0VxSyxfQWxsPgotICA6OnJlc2l6ZShzaXplX3R5cGUgX19udW1fZWxlbWVudHNfaGludCkgewotICBpZiAoKChmbG9hdClfX251bV9lbGVtZW50c19oaW50IC8gKGZsb2F0KWJ1Y2tldF9jb3VudCgpIDw9IG1heF9sb2FkX2ZhY3RvcigpKSAmJgotICAgICAgKG1heF9sb2FkX2ZhY3RvcigpID49IGxvYWRfZmFjdG9yKCkpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc2l6ZV90eXBlIF9fbnVtX2J1Y2tldHNfaGludCA9IChzaXplX3R5cGUpKChmbG9hdCkobWF4KSAoX19udW1fZWxlbWVudHNfaGludCwgc2l6ZSgpKSAvIG1heF9sb2FkX2ZhY3RvcigpKTsKLSAgc2l6ZV90eXBlIF9fbnVtX2J1Y2tldHMgPSBfU1RMUF9QUklWIF9TdGxfcHJpbWVfdHlwZTo6X1NfbmV4dF9zaXplKF9fbnVtX2J1Y2tldHNfaGludCk7Ci0jaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpCi0gIF9NX2NoZWNrKCk7Ci0jZW5kaWYKLSAgX01fcmVoYXNoKF9fbnVtX2J1Y2tldHMpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hGLAotICAgICAgICAgIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9FeEssIGNsYXNzIF9FcUssIGNsYXNzIF9BbGw+Ci12b2lkIGhhc2h0YWJsZTxfVmFsLF9LZXksX0hGLF9UcmFpdHMsX0V4SyxfRXFLLF9BbGw+Ci0gIDo6X01fcmVoYXNoKHNpemVfdHlwZSBfX251bV9idWNrZXRzKSB7Ci0gIF9FbGVtc0NvbnQgX190bXBfZWxlbXMoX01fZWxlbXMuZ2V0X2FsbG9jYXRvcigpKTsKLSAgX0J1Y2tldFZlY3RvciBfX3RtcChfX251bV9idWNrZXRzICsgMSwgX19TVEFUSUNfQ0FTVChfQnVja2V0VHlwZSosIDApLCBfTV9idWNrZXRzLmdldF9hbGxvY2F0b3IoKSk7Ci0gIF9FbGVtc0l0ZSBfX2N1ciwgX19sYXN0KF9NX2VsZW1zLmVuZCgpKTsKLSAgd2hpbGUgKCFfTV9lbGVtcy5lbXB0eSgpKSB7Ci0gICAgX19jdXIgPSBfTV9lbGVtcy5iZWdpbigpOwotICAgIHNpemVfdHlwZSBfX25ld19idWNrZXQgPSBfTV9ia3RfbnVtKCpfX2N1ciwgX19udW1fYnVja2V0cyk7Ci0gICAgX0VsZW1zSXRlIF9faXRlKF9fY3VyKSwgX19iZWZvcmVfaXRlKF9fY3VyKTsKLSAgICBmb3IgKCsrX19pdGU7Ci0gICAgICAgICBfX2l0ZSAhPSBfX2xhc3QgJiYgX01fZXF1YWxzKF9NX2dldF9rZXkoKl9fY3VyKSwgX01fZ2V0X2tleSgqX19pdGUpKTsKLSAgICAgICAgICsrX19pdGUsICsrX19iZWZvcmVfaXRlKTsKLSAgICBzaXplX3R5cGUgX19wcmV2X2J1Y2tldCA9IF9fbmV3X2J1Y2tldDsKLSAgICBfRWxlbXNJdGUgIF9fcHJldiA9IF9TX2JlZm9yZV9iZWdpbihfX3RtcF9lbGVtcywgX190bXAsIF9fcHJldl9idWNrZXQpLl9NX2l0ZTsKLSAgICBfX3RtcF9lbGVtcy5zcGxpY2VfYWZ0ZXIoX19wcmV2LCBfTV9lbGVtcywgX01fZWxlbXMuYmVmb3JlX2JlZ2luKCksIF9fYmVmb3JlX2l0ZSk7Ci0gICAgZmlsbChfX3RtcC5iZWdpbigpICsgX19wcmV2X2J1Y2tldCwgX190bXAuYmVnaW4oKSArIF9fbmV3X2J1Y2tldCArIDEsIF9fY3VyLl9NX25vZGUpOwotICB9Ci0gIF9NX2VsZW1zLnN3YXAoX190bXBfZWxlbXMpOwotICBfTV9idWNrZXRzLnN3YXAoX190bXApOwotfQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpCi10ZW1wbGF0ZSA8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hGLAotICAgICAgICAgIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9FeEssIGNsYXNzIF9FcUssIGNsYXNzIF9BbGw+Ci12b2lkIGhhc2h0YWJsZTxfVmFsLF9LZXksX0hGLF9UcmFpdHMsX0V4SyxfRXFLLF9BbGw+OjpfTV9jaGVjaygpIGNvbnN0IHsKLSAgLy9XZSBjaGVjayB0aGF0IGhhc2ggY29kZSBvZiBzdG9yZWQga2V5cyBoYXZlbid0IGNoYW5nZSBhbmQgYWxzbyB0aGF0IGVxdWl2YWxlbnQKLSAgLy9yZWxhdGlvbiBoYXNuJ3QgYmVlbiBtb2RpZmllZAotICBzaXplX3QgX19udW1fYnVja2V0cyA9IGJ1Y2tldF9jb3VudCgpOwotICBmb3IgKHNpemVfdCBfX2IgPSAwOyBfX2IgPCBfX251bV9idWNrZXRzOyArK19fYikgewotICAgIF9FbGVtc0l0ZSBfX2N1cihfTV9idWNrZXRzW19fYl0pLCBfX2xhc3QoX01fYnVja2V0c1tfX2IgKyAxXSk7Ci0gICAgX0VsZW1zSXRlIF9fZnN0KF9fY3VyKSwgX19zbmQoX19jdXIpOwotICAgIGZvciAoOyBfX2N1ciAhPSBfX2xhc3Q7ICsrX19jdXIpIHsKLSAgICAgIF9TVExQX0FTU0VSVCggX01fYmt0X251bSgqX19jdXIsIF9fbnVtX2J1Y2tldHMpID09IF9fYiApCi0gICAgICBfU1RMUF9BU1NFUlQoICFfTV9lcXVhbHMoX01fZ2V0X2tleSgqX19mc3QpLCBfTV9nZXRfa2V5KCpfX2N1cikpIHx8IF9NX2VxdWFscyhfTV9nZXRfa2V5KCpfX3NuZCksIF9NX2dldF9rZXkoKl9fY3VyKSkgKQotICAgICAgaWYgKF9fZnN0ICE9IF9fc25kKQotICAgICAgICArK19fZnN0OwotICAgICAgaWYgKF9fc25kICE9IF9fY3VyKQotICAgICAgICArK19fc25kOwotICAgIH0KLSAgfQotfQotI2VuZGlmCi0KLXRlbXBsYXRlIDxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSEYsCi0gICAgICAgICAgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0V4SywgY2xhc3MgX0VxSywgY2xhc3MgX0FsbD4KLXZvaWQgaGFzaHRhYmxlPF9WYWwsX0tleSxfSEYsX1RyYWl0cyxfRXhLLF9FcUssX0FsbD46OmNsZWFyKCkgewotICBfTV9lbGVtcy5jbGVhcigpOwotICBfTV9idWNrZXRzLmFzc2lnbihfTV9idWNrZXRzLnNpemUoKSwgX19TVEFUSUNfQ0FTVChfQnVja2V0VHlwZSosIDApKTsKLSAgX01fbnVtX2VsZW1lbnRzID0gMDsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwKLSAgICAgICAgICBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfRXhLLCBjbGFzcyBfRXFLLCBjbGFzcyBfQWxsPgotdm9pZCBoYXNodGFibGU8X1ZhbCxfS2V5LF9IRixfVHJhaXRzLF9FeEssX0VxSyxfQWxsPgotICA6Ol9NX2NvcHlfZnJvbShjb25zdCBoYXNodGFibGU8X1ZhbCxfS2V5LF9IRixfVHJhaXRzLF9FeEssX0VxSyxfQWxsPiYgX19odCkgewotICBfTV9lbGVtcy5jbGVhcigpOwotICBfTV9lbGVtcy5pbnNlcnQoX01fZWxlbXMuZW5kKCksIF9faHQuX01fZWxlbXMuYmVnaW4oKSwgX19odC5fTV9lbGVtcy5lbmQoKSk7Ci0gIF9NX2J1Y2tldHMucmVzaXplKF9faHQuX01fYnVja2V0cy5zaXplKCkpOwotICBfRWxlbXNDb25zdEl0ZSBfX3NyYyhfX2h0Ll9NX2VsZW1zLmJlZ2luKCkpLCBfX3NyY19lbmQoX19odC5fTV9lbGVtcy5lbmQoKSk7Ci0gIF9FbGVtc0l0ZSBfX2RzdChfTV9lbGVtcy5iZWdpbigpKTsKLSAgdHlwZW5hbWUgX0J1Y2tldFZlY3Rvcjo6Y29uc3RfaXRlcmF0b3IgX19zcmNfYihfX2h0Ll9NX2J1Y2tldHMuYmVnaW4oKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fc3JjX2VuZF9iKF9faHQuX01fYnVja2V0cy5lbmQoKSk7Ci0gIHR5cGVuYW1lIF9CdWNrZXRWZWN0b3I6Oml0ZXJhdG9yIF9fZHN0X2IoX01fYnVja2V0cy5iZWdpbigpKSwgX19kc3RfZW5kX2IoX01fYnVja2V0cy5lbmQoKSk7Ci0gIGZvciAoOyBfX3NyYyAhPSBfX3NyY19lbmQ7ICsrX19zcmMsICsrX19kc3QpIHsKLSAgICBmb3IgKDsgX19zcmNfYiAhPSBfX3NyY19lbmRfYjsgKytfX3NyY19iLCArK19fZHN0X2IpIHsKLSAgICAgIGlmICgqX19zcmNfYiA9PSBfX3NyYy5fTV9ub2RlKSB7Ci0gICAgICAgICpfX2RzdF9iID0gX19kc3QuX01fbm9kZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIGZpbGwoX19kc3RfYiwgX19kc3RfZW5kX2IsIF9fU1RBVElDX0NBU1QoX0J1Y2tldFR5cGUqLCAwKSk7Ci0gIF9NX251bV9lbGVtZW50cyA9IF9faHQuX01fbnVtX2VsZW1lbnRzOwotICBfTV9tYXhfbG9hZF9mYWN0b3IgPSBfX2h0Ll9NX21heF9sb2FkX2ZhY3RvcjsKLX0KLQotI3VuZGVmIF9faXRlcmF0b3JfXwotI3VuZGVmIGNvbnN0X2l0ZXJhdG9yCi0jdW5kZWYgX19zaXplX3R5cGVfXwotI3VuZGVmIF9fcmVmZXJlbmNlX18KLSN1bmRlZiBzaXplX3R5cGUKLSN1bmRlZiB2YWx1ZV90eXBlCi0jdW5kZWYga2V5X3R5cGUKLSN1bmRlZiBfX3N0bF9udW1fcHJpbWVzCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9ERUJVRykKLSMgIHVuZGVmIGhhc2h0YWJsZQotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi0jZW5kaWYKLQotX1NUTFBfRU5EX05BTUVTUEFDRQotCi0jZW5kaWYgLyogIF9TVExQX0hBU0hUQUJMRV9DICovCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX2hhc2h0YWJsZS5oIGIvc3RsL19oYXNodGFibGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY1MzkzMS4uMDAwMDAwMAotLS0gYS9zdGwvX2hhc2h0YWJsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjgyICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk0Ci0gKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3Ci0gKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTcKLSAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0vKiBOT1RFOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBTVEwgaGVhZGVycy4KLSAqICAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuCi0gKi8KLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9IQVNIVEFCTEVfSAotI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9IQVNIVEFCTEVfSAotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX1ZFQ1RPUl9ICi0jICBpbmNsdWRlIDxzdGwvX3ZlY3Rvci5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfU0xJU1RfSAotIyAgaW5jbHVkZSA8c3RsL19zbGlzdC5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfSVRFUkFUT1JfSAotIyAgaW5jbHVkZSA8c3RsL19pdGVyYXRvci5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfRlVOQ1RJT05fQkFTRV9ICi0jICBpbmNsdWRlIDxzdGwvX2Z1bmN0aW9uX2Jhc2UuaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0FMR09CQVNFX0gKLSMgIGluY2x1ZGUgPHN0bC9fYWxnb2Jhc2UuaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX0hBU0hfRlVOX0gKLSMgIGluY2x1ZGUgPHN0bC9faGFzaF9mdW4uaD4KLSNlbmRpZgotCi0vKgotICogSGFzaHRhYmxlIGNsYXNzLCB1c2VkIHRvIGltcGxlbWVudCB0aGUgaGFzaGVkIGFzc29jaWF0aXZlIGNvbnRhaW5lcnMKLSAqIGhhc2hfc2V0LCBoYXNoX21hcCwgaGFzaF9tdWx0aXNldCwgaGFzaF9tdWx0aW1hcCwKLSAqIHVub3JkZXJlZF9zZXQsIHVub3JkZXJlZF9tYXAsIHVub3JkZXJlZF9tdWx0aXNldCwgdW5vcmRlcmVkX211bHRpbWFwLgotICovCi0KLV9TVExQX0JFR0lOX05BTUVTUEFDRQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCkKLS8vRXhwb3J0IG9mIHRoZSBjbGFzc2VzIHVzZWQgdG8gcmVwcmVzZW50IGJ1Y2tldHMgaW4gdGhlIGhhc2h0YWJsZSBpbXBsZW1lbnRhdGlvbi4KLSMgIGlmICFkZWZpbmVkIChfU1RMUF9VU0VfUFRSX1NQRUNJQUxJWkFUSU9OUykKLS8vSWYgcG9pbnRlciBzcGVjaWFsaXphdGlvbiBpcyBlbmFibGVkIHZlY3RvcjxfU2xpc3Rfbm9kZV9iYXNlKj4gd2lsbCB1c2UgdGhlIHZvaWQqCi0vL3N0b3JhZ2UgdHlwZSBmb3Igd2hpY2ggaW50ZXJuYWwgY2xhc3NlcyBoYXZlIGFscmVhZHkgYmVlbiBleHBvcnRlZC4KLV9TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBhbGxvY2F0b3I8X1NUTFBfUFJJViBfU2xpc3Rfbm9kZV9iYXNlKj47Ci0KLV9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKLV9TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBfU1RMUF9hbGxvY19wcm94eTxfU2xpc3Rfbm9kZV9iYXNlKiosIF9TbGlzdF9ub2RlX2Jhc2UqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRvcjxfU2xpc3Rfbm9kZV9iYXNlKj4gPjsKLV9TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBfVmVjdG9yX2Jhc2U8X1NsaXN0X25vZGVfYmFzZSosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRvcjxfU2xpc3Rfbm9kZV9iYXNlKj4gPjsKLV9TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQotIyAgZW5kaWYKLQotIyAgaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpCi1fU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCi0jICAgIGRlZmluZSBfU1RMUF9OT05fREJHX1ZFQ1RPUiBfU1RMUF9OT05fREJHX05BTUUodmVjdG9yKQotX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIF9fY29uc3RydWN0X2NoZWNrZXI8X1NUTFBfTk9OX0RCR19WRUNUT1I8X1NsaXN0X25vZGVfYmFzZSosIGFsbG9jYXRvcjxfU2xpc3Rfbm9kZV9iYXNlKj4gPiA+OwotX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIF9TVExQX05PTl9EQkdfVkVDVE9SPF9TbGlzdF9ub2RlX2Jhc2UqLCBhbGxvY2F0b3I8X1NsaXN0X25vZGVfYmFzZSo+ID47Ci0jICAgIHVuZGVmIF9TVExQX05PTl9EQkdfVkVDVE9SCi1fU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKLSMgIGVuZGlmCi0KLV9TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyB2ZWN0b3I8X1NUTFBfUFJJViBfU2xpc3Rfbm9kZV9iYXNlKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yPF9TVExQX1BSSVYgX1NsaXN0X25vZGVfYmFzZSo+ID47Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHKQotIyAgZGVmaW5lIGhhc2h0YWJsZSBfU1RMUF9OT05fREJHX05BTUUoaGFzaHRhYmxlKQotX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQotI2VuZGlmCi0KLS8vIHNvbWUgY29tcGlsZXJzIHJlcXVpcmUgdGhlIG5hbWVzIG9mIHRlbXBsYXRlIHBhcmFtZXRlcnMgdG8gYmUgdGhlIHNhbWUKLXRlbXBsYXRlIDxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSEYsCi0gICAgICAgICAgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0V4SywgY2xhc3MgX0VxSywgY2xhc3MgX0FsbD4KLWNsYXNzIGhhc2h0YWJsZTsKLQotI2lmICFkZWZpbmVkIChfU1RMUF9ERUJVRykKLV9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKLSNlbmRpZgotCi10ZW1wbGF0ZSA8Y2xhc3MgX0Jhc2VJdGUsIGNsYXNzIF9UcmFpdHM+Ci1zdHJ1Y3QgX0h0X2l0ZXJhdG9yIHsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpfQ29uc3RUcmFpdHMgX0NvbnN0VHJhaXRzOwotICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6Ol9Ob25Db25zdFRyYWl0cyBfTm9uQ29uc3RUcmFpdHM7Ci0KLSAgdHlwZWRlZiBfSHRfaXRlcmF0b3I8X0Jhc2VJdGUsX1RyYWl0cz4gX1NlbGY7Ci0KLSAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6cG9pbnRlciBwb2ludGVyOwotICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OnJlZmVyZW5jZSByZWZlcmVuY2U7Ci0gIHR5cGVkZWYgZm9yd2FyZF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7Ci0gIHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKLSAgdHlwZWRlZiBzaXplX3Qgc2l6ZV90eXBlOwotCi0gIHR5cGVkZWYgX0h0X2l0ZXJhdG9yPF9CYXNlSXRlLCBfTm9uQ29uc3RUcmFpdHM+IGl0ZXJhdG9yOwotICB0eXBlZGVmIF9IdF9pdGVyYXRvcjxfQmFzZUl0ZSwgX0NvbnN0VHJhaXRzPiBjb25zdF9pdGVyYXRvcjsKLQotICBfSHRfaXRlcmF0b3IoKSB7fQotICAvL2NvcHkgY29uc3RydWN0b3IgZm9yIGl0ZXJhdG9yIGFuZCBjb25zdHJ1Y3RvciBmcm9tIGl0ZXJhdG9yIGZvciBjb25zdF9pdGVyYXRvcgotICBfSHRfaXRlcmF0b3IoY29uc3QgaXRlcmF0b3ImIF9faXQpIDogX01faXRlKF9faXQuX01faXRlKSB7fQotICBfSHRfaXRlcmF0b3IoX0Jhc2VJdGUgX19pdCkgOiBfTV9pdGUoX19pdCkge30KLQotICByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3QgewotICAgIHJldHVybiAqX01faXRlOwotICB9Ci0gIF9TVExQX0RFRklORV9BUlJPV19PUEVSQVRPUgotCi0gIF9TZWxmJiBvcGVyYXRvcisrKCkgewotICAgICsrX01faXRlOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotICBfU2VsZiBvcGVyYXRvcisrKGludCkgewotICAgIF9TZWxmIF9fdG1wID0gKnRoaXM7Ci0gICAgKysqdGhpczsKLSAgICByZXR1cm4gX190bXA7Ci0gIH0KLQotICBib29sIG9wZXJhdG9yID09IChjb25zdF9pdGVyYXRvciBfX3JocykgY29uc3QgewotICAgIHJldHVybiBfTV9pdGUgPT0gX19yaHMuX01faXRlOwotICB9Ci0gIGJvb2wgb3BlcmF0b3IgIT0gKGNvbnN0X2l0ZXJhdG9yIF9fcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuIF9NX2l0ZSAhPSBfX3Jocy5fTV9pdGU7Ci0gIH0KLQotICBfQmFzZUl0ZSBfTV9pdGU7Ci19OwotCi1fU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKLQotI2lmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pCi10ZW1wbGF0ZSA8Y2xhc3MgX0Jhc2VJdGUsIGNsYXNzIF9UcmFpdHM+Ci1zdHJ1Y3QgX190eXBlX3RyYWl0czxfU1RMUF9QUklWIF9IdF9pdGVyYXRvcjxfQmFzZUl0ZSwgX1RyYWl0cz4gPiB7Ci0gIHR5cGVkZWYgX19mYWxzZV90eXBlICAgaGFzX3RyaXZpYWxfZGVmYXVsdF9jb25zdHJ1Y3RvcjsKLSAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yOwotICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3I7Ci0gIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjsKLSAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgICBpc19QT0RfdHlwZTsKLX07Ci0jZW5kaWYgLyogX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTiAqLwotCi0jaWYgZGVmaW5lZCAoX1NUTFBfVVNFX09MRF9IUF9JVEVSQVRPUl9RVUVSSUVTKQotdGVtcGxhdGUgPGNsYXNzIF9CYXNlSXRlLCBjbGFzcyBfVHJhaXRzPgotaW5saW5lCi0jICBpZiBkZWZpbmVkIChfU1RMUF9ORVNURURfVFlQRV9QQVJBTV9CVUcpCi1fU1RMUF9UWVBFTkFNRV9PTl9SRVRVUk5fVFlQRSBfVHJhaXRzOjp2YWx1ZV90eXBlICoKLSMgIGVsc2UKLV9TVExQX1RZUEVOQU1FX09OX1JFVFVSTl9UWVBFIF9TVExQX1BSSVYgX0h0X2l0ZXJhdG9yPF9CYXNlSXRlLF9UcmFpdHM+Ojp2YWx1ZV90eXBlICoKLSMgIGVuZGlmCi12YWx1ZV90eXBlKGNvbnN0IF9TVExQX1BSSVYgX0h0X2l0ZXJhdG9yPF9CYXNlSXRlLF9UcmFpdHM+JikgewotICB0eXBlZGVmIHR5cGVuYW1lIF9TVExQX1BSSVYgX0h0X2l0ZXJhdG9yPF9CYXNlSXRlLF9UcmFpdHM+Ojp2YWx1ZV90eXBlIF9WYWw7Ci0gIHJldHVybiAoX1ZhbCopIDA7Ci19Ci10ZW1wbGF0ZSA8Y2xhc3MgX0Jhc2VJdGUsIGNsYXNzIF9UcmFpdHM+Ci1pbmxpbmUgZm9yd2FyZF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnkoY29uc3QgX1NUTFBfUFJJViBfSHRfaXRlcmF0b3I8X0Jhc2VJdGUsX1RyYWl0cz4mKQoteyByZXR1cm4gZm9yd2FyZF9pdGVyYXRvcl90YWcoKTsgfQotdGVtcGxhdGUgPGNsYXNzIF9CYXNlSXRlLCBjbGFzcyBfVHJhaXRzPgotaW5saW5lIHB0cmRpZmZfdCogZGlzdGFuY2VfdHlwZShjb25zdCBfU1RMUF9QUklWIF9IdF9pdGVyYXRvcjxfQmFzZUl0ZSxfVHJhaXRzPiYpCi17IHJldHVybiAocHRyZGlmZl90KikgMDsgfQotI2VuZGlmCi0KLV9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKLQotdGVtcGxhdGUgPGNsYXNzIF9EdW1teT4KLWNsYXNzIF9TdGxfcHJpbWUgewotcHVibGljOgotICAvL1JldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ1Y2tldHMgaGFuZGxlZCBieSB0aGUgaGFzaHRhYmxlIGltcGxlbWVudGF0aW9uCi0gIHN0YXRpYyBzaXplX3QgX1NUTFBfQ0FMTCBfU19tYXhfbmJfYnVja2V0cygpOwotCi0gIC8vUmV0dXJucyB0aGUgYnVja2V0IHNpemUgbmV4dCB0byBhIHJlcXVpcmVkIHNpemUKLSAgc3RhdGljIHNpemVfdCBfU1RMUF9DQUxMIF9TX25leHRfc2l6ZShzaXplX3QpOwotfTsKLQotI2lmIGRlZmluZWQgKF9TVExQX1VTRV9URU1QTEFURV9FWFBPUlQpCi1fU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgX1N0bF9wcmltZTxib29sPjsKLSNlbmRpZgotCi10eXBlZGVmIF9TdGxfcHJpbWU8Ym9vbD4gX1N0bF9wcmltZV90eXBlOwotCi0jaWYgIWRlZmluZWQgKF9TVExQX0RFQlVHKQotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi0jZW5kaWYKLQotLyoKLSAqIEhhc2h0YWJsZXMgaGFuZGxlIGFsbG9jYXRvcnMgYSBiaXQgZGlmZmVyZW50bHkgdGhhbiBvdGhlciBjb250YWluZXJzCi0gKiBkby4gSWYgd2UncmUgdXNpbmcgc3RhbmRhcmQtY29uZm9ybWluZyBhbGxvY2F0b3JzLCB0aGVuIGEgaGFzaHRhYmxlCi0gKiB1bmNvbmRpdGlvbmFsbHkgaGFzIGEgbWVtYmVyIHZhcmlhYmxlIHRvIGhvbGQgaXRzIGFsbG9jYXRvciwgZXZlbiBpZgotICogaXQgc28gaGFwcGVucyB0aGF0IGFsbCBpbnN0YW5jZXMgb2YgdGhlIGFsbG9jYXRvciB0eXBlIGFyZSBpZGVudGljYWwuCi0gKiBUaGlzIGlzIGJlY2F1c2UsIGZvciBoYXNodGFibGVzLCB0aGlzIGV4dHJhIHN0b3JhZ2UgaXMgbmVnbGlnaWJsZS4KLSAqIEFkZGl0aW9uYWxseSwgYSBiYXNlIGNsYXNzIHdvdWxkbid0IHNlcnZlIGFueSBvdGhlciBwdXJwb3NlczsgaXQKLSAqIHdvdWxkbid0LCBmb3IgZXhhbXBsZSwgc2ltcGxpZnkgdGhlIGV4Y2VwdGlvbi1oYW5kbGluZyBjb2RlLgotICovCi10ZW1wbGF0ZSA8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hGLAotICAgICAgICAgIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9FeEssIGNsYXNzIF9FcUssIGNsYXNzIF9BbGw+Ci1jbGFzcyBoYXNodGFibGUgewotICB0eXBlZGVmIGhhc2h0YWJsZTxfVmFsLCBfS2V5LCBfSEYsIF9UcmFpdHMsIF9FeEssIF9FcUssIF9BbGw+IF9TZWxmOwotICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6Ol9Ob25Db25zdFRyYWl0cyBfTm9uQ29uc3RUcmFpdHM7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6X0NvbnN0VHJhaXRzIF9Db25zdFRyYWl0czsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpfTm9uQ29uc3RMb2NhbFRyYWl0cyBfTm9uQ29uc3RMb2NhbFRyYWl0czsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpfQ29uc3RMb2NhbFRyYWl0cyBfQ29uc3RMb2NhbFRyYWl0czsKLQotcHVibGljOgotICB0eXBlZGVmIF9LZXkga2V5X3R5cGU7Ci0gIHR5cGVkZWYgX1ZhbCB2YWx1ZV90eXBlOwotICB0eXBlZGVmIF9IRiBoYXNoZXI7Ci0gIHR5cGVkZWYgX0VxSyBrZXlfZXF1YWw7Ci0KLSAgdHlwZWRlZiBzaXplX3QgICAgICAgICAgICBzaXplX3R5cGU7Ci0gIHR5cGVkZWYgcHRyZGlmZl90ICAgICAgICAgZGlmZmVyZW5jZV90eXBlOwotICB0eXBlZGVmIHR5cGVuYW1lIF9Ob25Db25zdFRyYWl0czo6cG9pbnRlciBwb2ludGVyOwotICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUqIGNvbnN0X3BvaW50ZXI7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX05vbkNvbnN0VHJhaXRzOjpyZWZlcmVuY2UgcmVmZXJlbmNlOwotICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmIGNvbnN0X3JlZmVyZW5jZTsKLSAgdHlwZWRlZiBmb3J3YXJkX2l0ZXJhdG9yX3RhZyBfSXRlcmF0b3JfY2F0ZWdvcnk7Ci0KLSAgaGFzaGVyIGhhc2hfZnVuY3QoKSBjb25zdCB7IHJldHVybiBfTV9oYXNoOyB9Ci0gIGtleV9lcXVhbCBrZXlfZXEoKSBjb25zdCB7IHJldHVybiBfTV9lcXVhbHM7IH0KLQotcHJpdmF0ZToKLSAgX1NUTFBfRk9SQ0VfQUxMT0NBVE9SUyhfVmFsLCBfQWxsKQotI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHKQotICB0eXBlZGVmIF9TVExQX1BSSVYgX1NUTFBfTk9OX0RCR19OQU1FKHNsaXN0KTx2YWx1ZV90eXBlLCBfQWxsPiBfRWxlbXNDb250OwotI2Vsc2UKLSAgdHlwZWRlZiBzbGlzdDx2YWx1ZV90eXBlLCBfQWxsPiBfRWxlbXNDb250OwotI2VuZGlmCi0gIHR5cGVkZWYgdHlwZW5hbWUgX0VsZW1zQ29udDo6aXRlcmF0b3IgX0VsZW1zSXRlOwotICB0eXBlZGVmIHR5cGVuYW1lIF9FbGVtc0NvbnQ6OmNvbnN0X2l0ZXJhdG9yIF9FbGVtc0NvbnN0SXRlOwotICB0eXBlZGVmIF9TVExQX1BSSVYgX1NsaXN0X25vZGVfYmFzZSBfQnVja2V0VHlwZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2NfdHJhaXRzPF9CdWNrZXRUeXBlKiwgX0FsbD46OmFsbG9jYXRvcl90eXBlIF9NX2J1Y2tldF9hbGxvY2F0b3JfdHlwZTsKLSAgLyoKLSAgICogV2UgYXJlIGdvaW5nIHRvIHVzZSB2ZWN0b3Igb2YgX1NsaXN0X25vZGVfYmFzZSBwb2ludGVycyBmb3IgMiByZWFzb25zOgotICAgKiAgLSBsaW1pdCBjb2RlIGJsb2F0LCBhbGwgaGFzaHRhYmxlIGluc3RhbmNpYXRpb24gdXNlIHRoZSBzYW1lIGJ1Y2tldHMgcmVwcmVzZW50YXRpb24uCi0gICAqICAtIGF2b2lkIF9TVExQX0RFQlVHIHBlcmZvcm1hbmNlIHRyb3VibGU6IHdpdGggYSB2ZWN0b3Igb2YgaXRlcmF0b3Igb24gc2xpc3QgdGhlIHJlc2l6ZQotICAgKiAgICBtZXRob2Qgd291bGQgYmUgdG9vIHNsb3cgYmVjYXVzZSB0aGUgc2xpc3Q6OnNwbGljZV9hZnRlciBtZXRob2QgYmVjb21lIGxpbmVhciBvbgotICAgKiAgICB0aGUgbnVtYmVyIG9mIGl0ZXJhdG9ycyBpbiB0aGUgYnVja2V0cyByYXRoZXIgdGhhbiBjb25zdGFudCBpbiB0aW1lIGFzIHRoZSBpdGVyYXRvcgotICAgKiAgICBoYXMgdG8gYmUgbW92ZSBmcm9tIGEgc2xpc3QgdG8gdGhlIG90aGVyLgotICAgKi8KLSNpZiBkZWZpbmVkIChfU1RMUF9ERUJVRykKLSAgdHlwZWRlZiBfU1RMUF9QUklWIF9TVExQX05PTl9EQkdfTkFNRSh2ZWN0b3IpPF9CdWNrZXRUeXBlKiwgX01fYnVja2V0X2FsbG9jYXRvcl90eXBlPiBfQnVja2V0VmVjdG9yOwotI2Vsc2UKLSAgdHlwZWRlZiB2ZWN0b3I8X0J1Y2tldFR5cGUqLCBfTV9idWNrZXRfYWxsb2NhdG9yX3R5cGU+IF9CdWNrZXRWZWN0b3I7Ci0jZW5kaWYKLQotICBoYXNoZXIgICAgICAgICAgICAgICAgX01faGFzaDsKLSAga2V5X2VxdWFsICAgICAgICAgICAgIF9NX2VxdWFsczsKLSAgX0V4SyAgICAgICAgICAgICAgICAgIF9NX2dldF9rZXk7Ci0gIF9FbGVtc0NvbnQgICAgICAgICAgICBfTV9lbGVtczsKLSAgX0J1Y2tldFZlY3RvciAgICAgICAgIF9NX2J1Y2tldHM7Ci0gIHNpemVfdHlwZSAgICAgICAgICAgICBfTV9udW1fZWxlbWVudHM7Ci0gIGZsb2F0ICAgICAgICAgICAgICAgICBfTV9tYXhfbG9hZF9mYWN0b3I7Ci0gIF9TVExQX0tFWV9UWVBFX0ZPUl9DT05UX0VYVChrZXlfdHlwZSkKLQotcHVibGljOgotICB0eXBlZGVmIF9TVExQX1BSSVYgX0h0X2l0ZXJhdG9yPF9FbGVtc0l0ZSwgX05vbkNvbnN0VHJhaXRzPiBpdGVyYXRvcjsKLSAgdHlwZWRlZiBfU1RMUF9QUklWIF9IdF9pdGVyYXRvcjxfRWxlbXNJdGUsIF9Db25zdFRyYWl0cz4gY29uc3RfaXRlcmF0b3I7Ci0gIC8vVE9ETzogQXZvaWRzIHRoaXMgZGVidWcgY2hlY2sgYW5kIG1ha2UgdGhlIGxvY2FsX2l0ZXJhdG9yIGRpZmZlcmVudCBmcm9tCi0gIC8vaXRlcmF0b3IgaW4gZGVidWcgbW9kZSB0b28uCi0jaWYgIWRlZmluZWQgKF9TVExQX0RFQlVHKQotICB0eXBlZGVmIF9TVExQX1BSSVYgX0h0X2l0ZXJhdG9yPF9FbGVtc0l0ZSwgX05vbkNvbnN0TG9jYWxUcmFpdHM+IGxvY2FsX2l0ZXJhdG9yOwotICB0eXBlZGVmIF9TVExQX1BSSVYgX0h0X2l0ZXJhdG9yPF9FbGVtc0l0ZSwgX0NvbnN0TG9jYWxUcmFpdHM+IGNvbnN0X2xvY2FsX2l0ZXJhdG9yOwotI2Vsc2UKLSAgdHlwZWRlZiBpdGVyYXRvciAgICAgICBsb2NhbF9pdGVyYXRvcjsKLSAgdHlwZWRlZiBjb25zdF9pdGVyYXRvciBjb25zdF9sb2NhbF9pdGVyYXRvcjsKLSNlbmRpZgotCi0gIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jX3RyYWl0czxfVmFsLCBfQWxsPjo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7Ci0gIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdCB7IHJldHVybiBfTV9lbGVtcy5nZXRfYWxsb2NhdG9yKCk7IH0KLQotI2lmICFkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQotICBoYXNodGFibGUoc2l6ZV90eXBlIF9fbiwKLSAgICAgICAgICAgIGNvbnN0IF9IRiYgIF9faGYsCi0gICAgICAgICAgICBjb25zdCBfRXFLJiBfX2VxbCwKLSAgICAgICAgICAgIGNvbnN0IF9FeEsmIF9fZXh0LAotICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCi0jZWxzZQotICBoYXNodGFibGUoc2l6ZV90eXBlIF9fbiwKLSAgICAgICAgICAgIGNvbnN0IF9IRiYgIF9faGYsCi0gICAgICAgICAgICBjb25zdCBfRXFLJiBfX2VxbCwKLSAgICAgICAgICAgIGNvbnN0IF9FeEsmIF9fZXh0KQotICAgIDogX01faGFzaChfX2hmKSwKLSAgICAgIF9NX2VxdWFscyhfX2VxbCksCi0gICAgICBfTV9nZXRfa2V5KF9fZXh0KSwKLSAgICAgIF9NX2VsZW1zKGFsbG9jYXRvcl90eXBlKCkpLAotICAgICAgX01fYnVja2V0cyhfU1RMUF9DT05WRVJUX0FMTE9DQVRPUihfX2EsIF9CdWNrZXRUeXBlKikpLAotICAgICAgX01fbnVtX2VsZW1lbnRzKDApLAotICAgICAgX01fbWF4X2xvYWRfZmFjdG9yKDEuMGYpCi0gIHsgX01faW5pdGlhbGl6ZV9idWNrZXRzKF9fbik7IH0KLQotICBoYXNodGFibGUoc2l6ZV90eXBlIF9fbiwKLSAgICAgICAgICAgIGNvbnN0IF9IRiYgIF9faGYsCi0gICAgICAgICAgICBjb25zdCBfRXFLJiBfX2VxbCwKLSAgICAgICAgICAgIGNvbnN0IF9FeEsmIF9fZXh0LAotICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKLSNlbmRpZgotICAgIDogX01faGFzaChfX2hmKSwKLSAgICAgIF9NX2VxdWFscyhfX2VxbCksCi0gICAgICBfTV9nZXRfa2V5KF9fZXh0KSwKLSAgICAgIF9NX2VsZW1zKF9fYSksCi0gICAgICBfTV9idWNrZXRzKF9TVExQX0NPTlZFUlRfQUxMT0NBVE9SKF9fYSwgX0J1Y2tldFR5cGUqKSksCi0gICAgICBfTV9udW1fZWxlbWVudHMoMCksCi0gICAgICBfTV9tYXhfbG9hZF9mYWN0b3IoMS4wZikKLSAgeyBfTV9pbml0aWFsaXplX2J1Y2tldHMoX19uKTsgfQotCi0jaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCi0gIGhhc2h0YWJsZShzaXplX3R5cGUgX19uLAotICAgICAgICAgICAgY29uc3QgX0hGJiAgICBfX2hmLAotICAgICAgICAgICAgY29uc3QgX0VxSyYgICBfX2VxbCwKLSAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQotI2Vsc2UKLSAgaGFzaHRhYmxlKHNpemVfdHlwZSBfX24sCi0gICAgICAgICAgICBjb25zdCBfSEYmICAgIF9faGYsCi0gICAgICAgICAgICBjb25zdCBfRXFLJiAgIF9fZXFsKQotICAgIDogX01faGFzaChfX2hmKSwKLSAgICAgIF9NX2VxdWFscyhfX2VxbCksCi0gICAgICBfTV9nZXRfa2V5KF9FeEsoKSksCi0gICAgICBfTV9lbGVtcyhhbGxvY2F0b3JfdHlwZSgpKSwKLSAgICAgIF9NX2J1Y2tldHMoX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoX19hLCBfQnVja2V0VHlwZSopKSwKLSAgICAgIF9NX251bV9lbGVtZW50cygwKSwKLSAgICAgIF9NX21heF9sb2FkX2ZhY3RvcigxLjBmKQotICB7IF9NX2luaXRpYWxpemVfYnVja2V0cyhfX24pOyB9Ci0KLSAgaGFzaHRhYmxlKHNpemVfdHlwZSBfX24sCi0gICAgICAgICAgICBjb25zdCBfSEYmICAgIF9faGYsCi0gICAgICAgICAgICBjb25zdCBfRXFLJiAgIF9fZXFsLAotICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKLSNlbmRpZgotICAgIDogX01faGFzaChfX2hmKSwKLSAgICAgIF9NX2VxdWFscyhfX2VxbCksCi0gICAgICBfTV9nZXRfa2V5KF9FeEsoKSksCi0gICAgICBfTV9lbGVtcyhfX2EpLAotICAgICAgX01fYnVja2V0cyhfU1RMUF9DT05WRVJUX0FMTE9DQVRPUihfX2EsIF9CdWNrZXRUeXBlKikpLAotICAgICAgX01fbnVtX2VsZW1lbnRzKDApLAotICAgICAgX01fbWF4X2xvYWRfZmFjdG9yKDEuMGYpCi0gIHsgX01faW5pdGlhbGl6ZV9idWNrZXRzKF9fbik7IH0KLQotICBoYXNodGFibGUoY29uc3QgX1NlbGYmIF9faHQpCi0gICAgOiBfTV9oYXNoKF9faHQuX01faGFzaCksCi0gICAgICBfTV9lcXVhbHMoX19odC5fTV9lcXVhbHMpLAotICAgICAgX01fZ2V0X2tleShfX2h0Ll9NX2dldF9rZXkpLAotICAgICAgX01fZWxlbXMoX19odC5nZXRfYWxsb2NhdG9yKCkpLAotICAgICAgX01fYnVja2V0cyhfU1RMUF9DT05WRVJUX0FMTE9DQVRPUihfX2h0LmdldF9hbGxvY2F0b3IoKSwgX0J1Y2tldFR5cGUqKSksCi0gICAgICBfTV9udW1fZWxlbWVudHMoMCksCi0gICAgICBfTV9tYXhfbG9hZF9mYWN0b3IoMS4wZikKLSAgeyBfTV9jb3B5X2Zyb20oX19odCk7IH0KLQotICBoYXNodGFibGUoX19tb3ZlX3NvdXJjZTxfU2VsZj4gc3JjKQotICAgIDogX01faGFzaChfU1RMUF9QUklWIF9Bc01vdmVTb3VyY2Uoc3JjLmdldCgpLl9NX2hhc2gpKSwKLSAgICAgIF9NX2VxdWFscyhfU1RMUF9QUklWIF9Bc01vdmVTb3VyY2Uoc3JjLmdldCgpLl9NX2VxdWFscykpLAotICAgICAgX01fZ2V0X2tleShfU1RMUF9QUklWIF9Bc01vdmVTb3VyY2Uoc3JjLmdldCgpLl9NX2dldF9rZXkpKSwKLSAgICAgIF9NX2VsZW1zKF9fbW92ZV9zb3VyY2U8X0VsZW1zQ29udD4oc3JjLmdldCgpLl9NX2VsZW1zKSksCi0gICAgICBfTV9idWNrZXRzKF9fbW92ZV9zb3VyY2U8X0J1Y2tldFZlY3Rvcj4oc3JjLmdldCgpLl9NX2J1Y2tldHMpKSwKLSAgICAgIF9NX251bV9lbGVtZW50cyhzcmMuZ2V0KCkuX01fbnVtX2VsZW1lbnRzKSwKLSAgICAgIF9NX21heF9sb2FkX2ZhY3RvcihzcmMuZ2V0KCkuX01fbWF4X2xvYWRfZmFjdG9yKSB7fQotCi0gIF9TZWxmJiBvcGVyYXRvcj0gKGNvbnN0IF9TZWxmJiBfX2h0KSB7Ci0gICAgaWYgKCZfX2h0ICE9IHRoaXMpIHsKLSAgICAgIGNsZWFyKCk7Ci0gICAgICBfTV9oYXNoID0gX19odC5fTV9oYXNoOwotICAgICAgX01fZXF1YWxzID0gX19odC5fTV9lcXVhbHM7Ci0gICAgICBfTV9nZXRfa2V5ID0gX19odC5fTV9nZXRfa2V5OwotICAgICAgX01fY29weV9mcm9tKF9faHQpOwotICAgIH0KLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICB+aGFzaHRhYmxlKCkgeyBjbGVhcigpOyB9Ci0KLSAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCB7IHJldHVybiBfTV9udW1fZWxlbWVudHM7IH0KLSAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgeyByZXR1cm4gc2l6ZV90eXBlKC0xKTsgfQotICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gc2l6ZSgpID09IDA7IH0KLQotICB2b2lkIHN3YXAoX1NlbGYmIF9faHQpIHsKLSAgICBfU1RMUF9TVEQ6OnN3YXAoX01faGFzaCwgX19odC5fTV9oYXNoKTsKLSAgICBfU1RMUF9TVEQ6OnN3YXAoX01fZXF1YWxzLCBfX2h0Ll9NX2VxdWFscyk7Ci0gICAgX1NUTFBfU1REOjpzd2FwKF9NX2dldF9rZXksIF9faHQuX01fZ2V0X2tleSk7Ci0gICAgX01fZWxlbXMuc3dhcChfX2h0Ll9NX2VsZW1zKTsKLSAgICBfTV9idWNrZXRzLnN3YXAoX19odC5fTV9idWNrZXRzKTsKLSAgICBfU1RMUF9TVEQ6OnN3YXAoX01fbnVtX2VsZW1lbnRzLCBfX2h0Ll9NX251bV9lbGVtZW50cyk7Ci0gICAgX1NUTFBfU1REOjpzd2FwKF9NX21heF9sb2FkX2ZhY3RvciwgX19odC5fTV9tYXhfbG9hZF9mYWN0b3IpOwotICB9Ci0KLSAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBfTV9lbGVtcy5iZWdpbigpOyB9Ci0gIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIF9NX2VsZW1zLmVuZCgpOyB9Ci0gIGxvY2FsX2l0ZXJhdG9yIGJlZ2luKHNpemVfdHlwZSBfX24pIHsgcmV0dXJuIF9FbGVtc0l0ZShfTV9idWNrZXRzW19fbl0pOyB9Ci0gIGxvY2FsX2l0ZXJhdG9yIGVuZChzaXplX3R5cGUgX19uKSB7IHJldHVybiBfRWxlbXNJdGUoX01fYnVja2V0c1tfX24gKyAxXSk7IH0KLQotICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIF9fQ09OU1RfQ0FTVChfRWxlbXNDb250JiwgX01fZWxlbXMpLmJlZ2luKCk7IH0KLSAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gX19DT05TVF9DQVNUKF9FbGVtc0NvbnQmLCBfTV9lbGVtcykuZW5kKCk7IH0KLSAgY29uc3RfbG9jYWxfaXRlcmF0b3IgYmVnaW4oc2l6ZV90eXBlIF9fbikgY29uc3QgeyByZXR1cm4gX0VsZW1zSXRlKF9NX2J1Y2tldHNbX19uXSk7IH0KLSAgY29uc3RfbG9jYWxfaXRlcmF0b3IgZW5kKHNpemVfdHlwZSBfX24pIGNvbnN0IHsgcmV0dXJuIF9FbGVtc0l0ZShfTV9idWNrZXRzW19fbiArIDFdKTsgfQotCi0gIC8vc3RhdGljIGJvb2wgX1NUTFBfQ0FMTCBfTV9lcXVhbCAoY29uc3QgX1NlbGYmLCBjb25zdCBfU2VsZiYpOwotCi1wdWJsaWM6Ci0gIC8vVGhlIG51bWJlciBvZiBidWNrZXRzIGlzIHNpemUoKSAtIDEgYmVjYXVzZSB0aGUgbGFzdCBidWNrZXQgYWx3YXlzIGNvbnRhaW5zCi0gIC8vX01fZWxlbXMuZW5kKCkgdG8gbWFrZSBhbGdvIGVhc2llciB0byBpbXBsZW1lbnQuCi0gIHNpemVfdHlwZSBidWNrZXRfY291bnQoKSBjb25zdCB7IHJldHVybiBfTV9idWNrZXRzLnNpemUoKSAtIDE7IH0KLSAgc2l6ZV90eXBlIG1heF9idWNrZXRfY291bnQoKSBjb25zdCB7IHJldHVybiBfU1RMUF9QUklWIF9TdGxfcHJpbWVfdHlwZTo6X1NfbWF4X25iX2J1Y2tldHMoKTsgfQotICBzaXplX3R5cGUgZWxlbXNfaW5fYnVja2V0KHNpemVfdHlwZSBfX2J1Y2tldCkgY29uc3QKLSAgeyByZXR1cm4gZGlzdGFuY2UoX0VsZW1zSXRlKF9NX2J1Y2tldHNbX19idWNrZXRdKSwgX0VsZW1zSXRlKF9NX2J1Y2tldHNbX19idWNrZXQgKyAxXSkpOyB9Ci0KLSAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0gIHNpemVfdHlwZSBidWNrZXQoY29uc3QgX0tUJiBfX2spIGNvbnN0IHsgcmV0dXJuIF9NX2JrdF9udW1fa2V5KF9fayk7IH0KLQotICAvLyBoYXNoIHBvbGljeQotICBmbG9hdCBsb2FkX2ZhY3RvcigpIGNvbnN0IHsgcmV0dXJuIChmbG9hdClzaXplKCkgLyAoZmxvYXQpYnVja2V0X2NvdW50KCk7IH0KLSAgZmxvYXQgbWF4X2xvYWRfZmFjdG9yKCkgY29uc3QgeyByZXR1cm4gX01fbWF4X2xvYWRfZmFjdG9yOyB9Ci0gIHZvaWQgbWF4X2xvYWRfZmFjdG9yKGZsb2F0IF9feikgeyBfTV9tYXhfbG9hZF9mYWN0b3IgPSBfX3o7fQotCi0gIHBhaXI8aXRlcmF0b3IsIGJvb2w+IGluc2VydF91bmlxdWUoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopIHsKLSAgICByZXNpemUoX01fbnVtX2VsZW1lbnRzICsgMSk7Ci0gICAgcmV0dXJuIGluc2VydF91bmlxdWVfbm9yZXNpemUoX19vYmopOwotICB9Ci0KLSAgaXRlcmF0b3IgaW5zZXJ0X2VxdWFsKGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKSB7Ci0gICAgcmVzaXplKF9NX251bV9lbGVtZW50cyArIDEpOwotICAgIHJldHVybiBpbnNlcnRfZXF1YWxfbm9yZXNpemUoX19vYmopOwotICB9Ci0KLXByb3RlY3RlZDoKLSAgaXRlcmF0b3IgX01faW5zZXJ0X25vcmVzaXplKHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKTsKLXB1YmxpYzoKLSAgcGFpcjxpdGVyYXRvciwgYm9vbD4gaW5zZXJ0X3VuaXF1ZV9ub3Jlc2l6ZShjb25zdCB2YWx1ZV90eXBlJiBfX29iaik7Ci0gIGl0ZXJhdG9yIGluc2VydF9lcXVhbF9ub3Jlc2l6ZShjb25zdCB2YWx1ZV90eXBlJiBfX29iaik7Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Ci0gIHZvaWQgaW5zZXJ0X3VuaXF1ZShfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCkKLSAgeyBpbnNlcnRfdW5pcXVlKF9fZiwgX19sLCBfU1RMUF9JVEVSQVRPUl9DQVRFR09SWShfX2YsIF9JbnB1dEl0ZXJhdG9yKSk7IH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Ci0gIHZvaWQgaW5zZXJ0X2VxdWFsKF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sKQotICB7IGluc2VydF9lcXVhbChfX2YsIF9fbCwgX1NUTFBfSVRFUkFUT1JfQ0FURUdPUlkoX19mLCBfSW5wdXRJdGVyYXRvcikpOyB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgotICB2b2lkIGluc2VydF91bmlxdWUoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnB1dF9pdGVyYXRvcl90YWcgJikgewotICAgIGZvciAoIDsgX19mICE9IF9fbDsgKytfX2YpCi0gICAgICBpbnNlcnRfdW5pcXVlKCpfX2YpOwotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgotICB2b2lkIGluc2VydF9lcXVhbChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5wdXRfaXRlcmF0b3JfdGFnICYpIHsKLSAgICBmb3IgKCA7IF9fZiAhPSBfX2w7ICsrX19mKQotICAgICAgaW5zZXJ0X2VxdWFsKCpfX2YpOwotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+Ci0gIHZvaWQgaW5zZXJ0X3VuaXF1ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX2wsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3J3YXJkX2l0ZXJhdG9yX3RhZyAmKSB7Ci0gICAgc2l6ZV90eXBlIF9fbiA9IGRpc3RhbmNlKF9fZiwgX19sKTsKLSAgICByZXNpemUoX01fbnVtX2VsZW1lbnRzICsgX19uKTsKLSAgICBmb3IgKCA7IF9fbiA+IDA7IC0tX19uLCArK19fZikKLSAgICAgIGluc2VydF91bmlxdWVfbm9yZXNpemUoKl9fZik7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KLSAgdm9pZCBpbnNlcnRfZXF1YWwoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX19sLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3J3YXJkX2l0ZXJhdG9yX3RhZyAmKSB7Ci0gICAgc2l6ZV90eXBlIF9fbiA9IGRpc3RhbmNlKF9fZiwgX19sKTsKLSAgICByZXNpemUoX01fbnVtX2VsZW1lbnRzICsgX19uKTsKLSAgICBmb3IgKCA7IF9fbiA+IDA7IC0tX19uLCArK19fZikKLSAgICAgIGluc2VydF9lcXVhbF9ub3Jlc2l6ZSgqX19mKTsKLSAgfQotCi0jZWxzZSAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCi0gIHZvaWQgaW5zZXJ0X3VuaXF1ZShjb25zdCB2YWx1ZV90eXBlKiBfX2YsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbCkgewotICAgIHNpemVfdHlwZSBfX24gPSBfX2wgLSBfX2Y7Ci0gICAgcmVzaXplKF9NX251bV9lbGVtZW50cyArIF9fbik7Ci0gICAgZm9yICggOyBfX24gPiAwOyAtLV9fbiwgKytfX2YpCi0gICAgICBpbnNlcnRfdW5pcXVlX25vcmVzaXplKCpfX2YpOwotICB9Ci0KLSAgdm9pZCBpbnNlcnRfZXF1YWwoY29uc3QgdmFsdWVfdHlwZSogX19mLCBjb25zdCB2YWx1ZV90eXBlKiBfX2wpIHsKLSAgICBzaXplX3R5cGUgX19uID0gX19sIC0gX19mOwotICAgIHJlc2l6ZShfTV9udW1fZWxlbWVudHMgKyBfX24pOwotICAgIGZvciAoIDsgX19uID4gMDsgLS1fX24sICsrX19mKQotICAgICAgaW5zZXJ0X2VxdWFsX25vcmVzaXplKCpfX2YpOwotICB9Ci0KLSAgdm9pZCBpbnNlcnRfdW5pcXVlKGNvbnN0X2l0ZXJhdG9yIF9fZiwgY29uc3RfaXRlcmF0b3IgX19sKSB7Ci0gICAgc2l6ZV90eXBlIF9fbiA9IGRpc3RhbmNlKF9fZiwgX19sKTsKLSAgICByZXNpemUoX01fbnVtX2VsZW1lbnRzICsgX19uKTsKLSAgICBmb3IgKCA7IF9fbiA+IDA7IC0tX19uLCArK19fZikKLSAgICAgIGluc2VydF91bmlxdWVfbm9yZXNpemUoKl9fZik7Ci0gIH0KLQotICB2b2lkIGluc2VydF9lcXVhbChjb25zdF9pdGVyYXRvciBfX2YsIGNvbnN0X2l0ZXJhdG9yIF9fbCkgewotICAgIHNpemVfdHlwZSBfX24gPSBkaXN0YW5jZShfX2YsIF9fbCk7Ci0gICAgcmVzaXplKF9NX251bV9lbGVtZW50cyArIF9fbik7Ci0gICAgZm9yICggOyBfX24gPiAwOyAtLV9fbiwgKytfX2YpCi0gICAgICBpbnNlcnRfZXF1YWxfbm9yZXNpemUoKl9fZik7Ci0gIH0KLSNlbmRpZiAvKl9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KLQotICAvL3JlZmVyZW5jZSBmaW5kX29yX2luc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX29iaik7Ci0KLXByaXZhdGU6Ci0gIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAotICBfRWxlbXNJdGUgX01fZmluZChjb25zdCBfS1QmIF9fa2V5KSBjb25zdCB7Ci0gICAgc2l6ZV90eXBlIF9fbiA9IF9NX2JrdF9udW1fa2V5KF9fa2V5KTsKLSAgICBfRWxlbXNJdGUgX19maXJzdChfTV9idWNrZXRzW19fbl0pOwotICAgIF9FbGVtc0l0ZSBfX2xhc3QoX01fYnVja2V0c1tfX24gKyAxXSk7Ci0gICAgZm9yICggOyAoX19maXJzdCAhPSBfX2xhc3QpICYmICFfTV9lcXVhbHMoX01fZ2V0X2tleSgqX19maXJzdCksIF9fa2V5KTsgKytfX2ZpcnN0KTsKLSAgICBpZiAoX19maXJzdCAhPSBfX2xhc3QpCi0gICAgICByZXR1cm4gX19maXJzdDsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gX19DT05TVF9DQVNUKF9FbGVtc0NvbnQmLCBfTV9lbGVtcykuZW5kKCk7Ci0gIH0KLQotcHVibGljOgotICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKLSAgaXRlcmF0b3IgZmluZChjb25zdCBfS1QmIF9fa2V5KSB7IHJldHVybiBfTV9maW5kKF9fa2V5KTsgfQotICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKLSAgY29uc3RfaXRlcmF0b3IgZmluZChjb25zdCBfS1QmIF9fa2V5KSBjb25zdCB7IHJldHVybiBfTV9maW5kKF9fa2V5KTsgfQotCi0gIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAotICBzaXplX3R5cGUgY291bnQoY29uc3QgX0tUJiBfX2tleSkgY29uc3QgewotICAgIGNvbnN0IHNpemVfdHlwZSBfX24gPSBfTV9ia3RfbnVtX2tleShfX2tleSk7Ci0KLSAgICBfRWxlbXNJdGUgX19jdXIoX01fYnVja2V0c1tfX25dKTsKLSAgICBfRWxlbXNJdGUgX19sYXN0KF9NX2J1Y2tldHNbX19uICsgMV0pOwotICAgIGZvciAoOyBfX2N1ciAhPSBfX2xhc3Q7ICsrX19jdXIpIHsKLSAgICAgIGlmIChfTV9lcXVhbHMoX01fZ2V0X2tleSgqX19jdXIpLCBfX2tleSkpIHsKLSAgICAgICAgc2l6ZV90eXBlIF9fcmVzdWx0ID0gMTsKLSAgICAgICAgZm9yICgrK19fY3VyOwotICAgICAgICAgICAgIF9fY3VyICE9IF9fbGFzdCAmJiBfTV9lcXVhbHMoX01fZ2V0X2tleSgqX19jdXIpLCBfX2tleSk7Ci0gICAgICAgICAgICAgKytfX3Jlc3VsdCwgKytfX2N1cik7Ci0gICAgICAgIHJldHVybiBfX3Jlc3VsdDsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKLSAgcGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+IGVxdWFsX3JhbmdlKGNvbnN0IF9LVCYgX19rZXkpIHsKLSAgICB0eXBlZGVmIHBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPiBfUGlpOwotICAgIGNvbnN0IHNpemVfdHlwZSBfX24gPSBfTV9ia3RfbnVtX2tleShfX2tleSk7Ci0KLSAgICBmb3IgKF9FbGVtc0l0ZSBfX2ZpcnN0KF9NX2J1Y2tldHNbX19uXSksIF9fbGFzdChfTV9idWNrZXRzW19fbiArIDFdKTsKLSAgICAgICAgIF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpIHsKLSAgICAgIGlmIChfTV9lcXVhbHMoX01fZ2V0X2tleSgqX19maXJzdCksIF9fa2V5KSkgewotICAgICAgICBfRWxlbXNJdGUgX19jdXIoX19maXJzdCk7Ci0gICAgICAgIGZvciAoKytfX2N1cjsgKF9fY3VyICE9IF9fbGFzdCkgJiYgX01fZXF1YWxzKF9NX2dldF9rZXkoKl9fY3VyKSwgX19rZXkpOyArK19fY3VyKTsKLSAgICAgICAgcmV0dXJuIF9QaWkoX19maXJzdCwgX19jdXIpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gX1BpaShlbmQoKSwgZW5kKCkpOwotICB9Ci0KLSAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0gIHBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPiBlcXVhbF9yYW5nZShjb25zdCBfS1QmIF9fa2V5KSBjb25zdCB7Ci0gICAgdHlwZWRlZiBwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4gX1BpaTsKLSAgICBjb25zdCBzaXplX3R5cGUgX19uID0gX01fYmt0X251bV9rZXkoX19rZXkpOwotCi0gICAgZm9yIChfRWxlbXNJdGUgX19maXJzdChfTV9idWNrZXRzW19fbl0pLCBfX2xhc3QoX01fYnVja2V0c1tfX24gKyAxXSk7Ci0gICAgICAgICBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KSB7Ci0gICAgICBpZiAoX01fZXF1YWxzKF9NX2dldF9rZXkoKl9fZmlyc3QpLCBfX2tleSkpIHsKLSAgICAgICAgX0VsZW1zSXRlIF9fY3VyKF9fZmlyc3QpOwotICAgICAgICBmb3IgKCsrX19jdXI7IChfX2N1ciAhPSBfX2xhc3QpICYmIF9NX2VxdWFscyhfTV9nZXRfa2V5KCpfX2N1ciksIF9fa2V5KTsgKytfX2N1cik7Ci0gICAgICAgIHJldHVybiBfUGlpKF9fZmlyc3QsIF9fY3VyKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIF9QaWkoZW5kKCksIGVuZCgpKTsKLSAgfQotCi0gIHNpemVfdHlwZSBlcmFzZShjb25zdCBrZXlfdHlwZSYgX19rZXkpOwotICB2b2lkIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9faXQpOwotICB2b2lkIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCk7Ci0KLXByaXZhdGU6Ci0gIHZvaWQgX01fcmVoYXNoKHNpemVfdHlwZSBfX251bV9idWNrZXRzKTsKLSNpZiBkZWZpbmVkIChfU1RMUF9ERUJVRykKLSAgdm9pZCBfTV9jaGVjaygpIGNvbnN0OwotI2VuZGlmCi0KLXB1YmxpYzoKLSAgdm9pZCByZWhhc2goc2l6ZV90eXBlIF9fbnVtX2J1Y2tldHNfaGludCk7Ci0gIHZvaWQgcmVzaXplKHNpemVfdHlwZSBfX251bV9lbGVtZW50c19oaW50KTsKLSAgdm9pZCBjbGVhcigpOwotCi0gIC8vIHRoaXMgaXMgZm9yIGhhc2hfbWFwOjpvcGVyYXRvcltdCi0gIHJlZmVyZW5jZSBfTV9pbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopOwotCi1wcml2YXRlOgotICAvL19fbiBpcyBzZXQgdG8gdGhlIGZpcnN0IGJ1Y2tldCB0aGF0IGhhcyB0byBiZSBtb2RpZmllZCBpZiBhbnkKLSAgLy9lcmFzZS9pbnNlcnQgb3BlcmF0aW9uIGlzIGRvbmUgYWZ0ZXIgdGhlIHJldHVybmVkIGl0ZXJhdG9yLgotICBpdGVyYXRvciBfTV9iZWZvcmVfYmVnaW4oc2l6ZV90eXBlICZfX24pIGNvbnN0OwotCi0gIHN0YXRpYyBpdGVyYXRvciBfU19iZWZvcmVfYmVnaW4oY29uc3QgX0VsZW1zQ29udCYgX19lbGVtcywgY29uc3QgX0J1Y2tldFZlY3RvciYgX19idWNrZXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSAmX19uKTsKLQotICB2b2lkIF9NX2luaXRpYWxpemVfYnVja2V0cyhzaXplX3R5cGUgX19uKSB7Ci0gICAgY29uc3Qgc2l6ZV90eXBlIF9fbl9idWNrZXRzID0gX1NUTFBfUFJJViBfU3RsX3ByaW1lX3R5cGU6Ol9TX25leHRfc2l6ZShfX24pICsgMTsKLSAgICBfTV9idWNrZXRzLnJlc2VydmUoX19uX2J1Y2tldHMpOwotICAgIF9NX2J1Y2tldHMuYXNzaWduKF9fbl9idWNrZXRzLCBfX1NUQVRJQ19DQVNUKF9CdWNrZXRUeXBlKiwgMCkpOwotICB9Ci0KLSAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0gIHNpemVfdHlwZSBfTV9ia3RfbnVtX2tleShjb25zdCBfS1QmIF9fa2V5KSBjb25zdAotICB7IHJldHVybiBfTV9ia3RfbnVtX2tleShfX2tleSwgYnVja2V0X2NvdW50KCkpOyB9Ci0KLSAgc2l6ZV90eXBlIF9NX2JrdF9udW0oY29uc3QgdmFsdWVfdHlwZSYgX19vYmopIGNvbnN0Ci0gIHsgcmV0dXJuIF9NX2JrdF9udW1fa2V5KF9NX2dldF9rZXkoX19vYmopKTsgfQotCi0gIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAotICBzaXplX3R5cGUgX01fYmt0X251bV9rZXkoY29uc3QgX0tUJiBfX2tleSwgc2l6ZV90eXBlIF9fbikgY29uc3QKLSAgeyByZXR1cm4gX01faGFzaChfX2tleSkgJSBfX247IH0KLQotICBzaXplX3R5cGUgX01fYmt0X251bShjb25zdCB2YWx1ZV90eXBlJiBfX29iaiwgc2l6ZV90IF9fbikgY29uc3QKLSAgeyByZXR1cm4gX01fYmt0X251bV9rZXkoX01fZ2V0X2tleShfX29iaiksIF9fbik7IH0KLQotICB2b2lkIF9NX2NvcHlfZnJvbShjb25zdCBfU2VsZiYgX19odCk7Ci19OwotCi0jaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpCi0jICB1bmRlZiBoYXNodGFibGUKLV9TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQotI2VuZGlmCi0KLV9TVExQX0VORF9OQU1FU1BBQ0UKLQotI2lmICFkZWZpbmVkIChfU1RMUF9MSU5LX1RJTUVfSU5TVEFOVElBVElPTikKLSMgIGluY2x1ZGUgPHN0bC9faGFzaHRhYmxlLmM+Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHKQotIyAgaW5jbHVkZSA8c3RsL2RlYnVnL19oYXNodGFibGUuaD4KLSNlbmRpZgotCi1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLQotI2RlZmluZSBfU1RMUF9URU1QTEFURV9IRUFERVIgdGVtcGxhdGUgPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0V4SywgY2xhc3MgX0VxSywgY2xhc3MgX0FsbD4KLSNkZWZpbmUgX1NUTFBfVEVNUExBVEVfQ09OVEFJTkVSIGhhc2h0YWJsZTxfVmFsLF9LZXksX0hGLF9UcmFpdHMsX0V4SyxfRXFLLF9BbGw+Ci0jaW5jbHVkZSA8c3RsL19yZWxvcHNfaGFzaF9jb250Lmg+Ci0jdW5kZWYgX1NUTFBfVEVNUExBVEVfQ09OVEFJTkVSCi0jdW5kZWYgX1NUTFBfVEVNUExBVEVfSEVBREVSCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQotdGVtcGxhdGUgPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0V4SywgY2xhc3MgX0VxSywgY2xhc3MgX0FsbD4KLXN0cnVjdCBfX21vdmVfdHJhaXRzPGhhc2h0YWJsZTxfVmFsLCBfS2V5LCBfSEYsIF9UcmFpdHMsIF9FeEssIF9FcUssIF9BbGw+ID4gewotICAvL0hhc2h0YWJsZXMgYXJlIG1vdmFibGU6Ci0gIHR5cGVkZWYgX19zdGxwX21vdmFibGUgaW1wbGVtZW50ZWQ7Ci0KLSAgLy9Db21wbGV0ZW5lc3MgZGVwZW5kcyBvbiBtYW55IHRlbXBsYXRlIHBhcmFtZXRlcnMsIGZvciB0aGUgbW9tZW50IHdlIGNvbnNpZGVyIGl0IG5vdCBjb21wbGV0ZToKLSAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgY29tcGxldGU7Ci19OwotI2VuZGlmCi0KLV9TVExQX0VORF9OQU1FU1BBQ0UKLQotI2VuZGlmIC8qIF9TVExQX0lOVEVSTkFMX0hBU0hUQUJMRV9IICovCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX2lvcy5jIGIvc3RsL19pb3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTllNDc3Yi4uMDAwMDAwMAotLS0gYS9zdGwvX2lvcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogQm9yaXMgRm9taXRjaGV2Ci0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICovCi0jaWZuZGVmIF9TVExQX0lPU19DCi0jZGVmaW5lIF9TVExQX0lPU19DCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfSU9TX0gKLSMgaW5jbHVkZSA8c3RsL19pb3MuaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX1NUUkVBTUJVRgotIyBpbmNsdWRlIDxzdGwvX3N0cmVhbWJ1Zi5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfTlVNUFVOQ1RfSAotIyBpbmNsdWRlIDxzdGwvX251bXB1bmN0Lmg+Ci0jZW5kaWYKLQotX1NUTFBfQkVHSU5fTkFNRVNQQUNFCi0KLS8vIGJhc2ljX2lvczw+J3Mgbm9uLWlubGluZSBtZW1iZXIgZnVuY3Rpb25zCi0KLS8vIFB1YmxpYyBjb25zdHJ1Y3RvciwgdGFraW5nIGEgc3RyZWFtYnVmLgotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KLWJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+Ci0gIDo6YmFzaWNfaW9zKGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX3N0cmVhbWJ1ZikKLSAgICA6IGlvc19iYXNlKCksCi0gICAgICBfTV9maWxsKF9TVExQX05VTExfQ0hBUl9JTklUKF9DaGFyVCkpLCBfTV9zdHJlYW1idWYoMCksIF9NX3RpZWRfb3N0cmVhbSgwKSB7Ci0gIGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+Ojppbml0KF9fc3RyZWFtYnVmKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KLWJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KgotYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz46OnJkYnVmKGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX2J1ZikgewotICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX190bXAgPSBfTV9zdHJlYW1idWY7Ci0gIF9NX3N0cmVhbWJ1ZiA9IF9fYnVmOwotICB0aGlzLT5jbGVhcigpOwotICByZXR1cm4gX190bXA7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Ci1iYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPiYKLWJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+Ojpjb3B5Zm10KGNvbnN0IGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+JiBfX3gpIHsKLSAgX01faW52b2tlX2NhbGxiYWNrcyhlcmFzZV9ldmVudCk7Ci0gIF9NX2NvcHlfc3RhdGUoX194KTsgICAgICAgICAgIC8vIEluaGVyaXRlZCBmcm9tIGlvc19iYXNlLgotICBfTV9maWxsID0gX194Ll9NX2ZpbGw7Ci0gIF9NX3RpZWRfb3N0cmVhbSA9IF9feC5fTV90aWVkX29zdHJlYW07Ci0gIF9NX2ludm9rZV9jYWxsYmFja3MoY29weWZtdF9ldmVudCk7Ci0gIHRoaXMtPl9NX3NldF9leGNlcHRpb25fbWFzayhfX3guZXhjZXB0aW9ucygpKTsKLSAgcmV0dXJuICp0aGlzOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotbG9jYWxlIGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+OjppbWJ1ZShjb25zdCBsb2NhbGUmIF9fbG9jKSB7Ci0gIGxvY2FsZSBfX3RtcCA9IGlvc19iYXNlOjppbWJ1ZShfX2xvYyk7Ci0gIF9TVExQX1RSWSB7Ci0gICAgaWYgKF9NX3N0cmVhbWJ1ZikKLSAgICAgIF9NX3N0cmVhbWJ1Zi0+cHViaW1idWUoX19sb2MpOwotCi0gICAgLy8gbm8gdGhyb3dpbmcgaGVyZQotICAgIHRoaXMtPl9NX2NhY2hlZF9jdHlwZSA9IF9fbG9jLl9NX2dldF9mYWNldChjdHlwZTxjaGFyX3R5cGU+OjppZCk7Ci0gICAgdGhpcy0+X01fY2FjaGVkX251bXB1bmN0ID0gX19sb2MuX01fZ2V0X2ZhY2V0KG51bXB1bmN0PGNoYXJfdHlwZT46OmlkKTsKLSAgICB0aGlzLT5fTV9jYWNoZWRfZ3JvdXBpbmcgPSAoKG51bXB1bmN0PGNoYXJfdHlwZT4qKV9NX2NhY2hlZF9udW1wdW5jdCktPmdyb3VwaW5nKCk7Ci0gIH0KLSAgX1NUTFBfQ0FUQ0hfQUxMIHsKLSAgICBfX3RtcCA9IGlvc19iYXNlOjppbWJ1ZShfX3RtcCk7Ci0gICAgX01faGFuZGxlX2V4Y2VwdGlvbihpb3NfYmFzZTo6ZmFpbGJpdCk7Ci0gIH0KLSAgcmV0dXJuIF9fdG1wOwotfQotCi0vLyBQcm90ZWN0ZWQgY29uc3RydWN0b3IgYW5kIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucy4gVGhlIGRlZmF1bHQKLS8vIGNvbnN0cnVjdG9yIGNyZWF0ZXMgYW4gdW5pbml0aWFsaXplZCBiYXNpY19pb3MsIGFuZCBpbml0KCkgaW5pdGlhbGl6ZXMKLS8vIGFsbCBvZiB0aGUgbWVtYmVycyB0byB0aGUgdmFsdWVzIGluIFRhYmxlIDg5IG9mIHRoZSBDKysgc3RhbmRhcmQuCi0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Ci1iYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPjo6YmFzaWNfaW9zKCkKLSAgOiBpb3NfYmFzZSgpLAotICAgIF9NX2ZpbGwoX1NUTFBfTlVMTF9DSEFSX0lOSVQoX0NoYXJUKSksIF9NX3N0cmVhbWJ1ZigwKSwgX01fdGllZF9vc3RyZWFtKDApCi17fQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotdm9pZAotYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz46OmluaXQoYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fc2IpCi17Ci0gIHRoaXMtPnJkYnVmKF9fc2IpOwotICB0aGlzLT5pbWJ1ZShsb2NhbGUoKSk7Ci0gIHRoaXMtPnRpZSgwKTsKLSAgdGhpcy0+X01fc2V0X2V4Y2VwdGlvbl9tYXNrKGlvc19iYXNlOjpnb29kYml0KTsKLSAgdGhpcy0+X01fY2xlYXJfbm90aHJvdyhfX3NiICE9IDAgPyBpb3NfYmFzZTo6Z29vZGJpdCA6IGlvc19iYXNlOjpiYWRiaXQpOwotICBpb3NfYmFzZTo6ZmxhZ3MoaW9zX2Jhc2U6OnNraXB3cyB8IGlvc19iYXNlOjpkZWMpOwotICBpb3NfYmFzZTo6d2lkdGgoMCk7Ci0gIGlvc19iYXNlOjpwcmVjaXNpb24oNik7Ci0gIHRoaXMtPmZpbGwod2lkZW4oJyAnKSk7Ci0gIC8vIFdlIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgYW55IG9mIHRoZSB0aHJlZSBhcnJheXM6IHRoZXkgYXJlCi0gIC8vIGluaXRpYWxpemVkIGNvcnJlY3RseSBpbiBpb3NfYmFzZSdzIGNvbnN0cnVjdG9yLgotfQotCi0vLyBUaGlzIGlzIG5ldmVyIGNhbGxlZCBleGNlcHQgZnJvbSB3aXRoaW4gYSBjYXRjaCBjbGF1c2UuCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotdm9pZCBiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPjo6X01faGFuZGxlX2V4Y2VwdGlvbihpb3NfYmFzZTo6aW9zdGF0ZSBfX2ZsYWcpCi17Ci0gIHRoaXMtPl9NX3NldHN0YXRlX25vdGhyb3coX19mbGFnKTsKLSAgaWYgKHRoaXMtPl9NX2dldF9leGNlcHRpb25fbWFzaygpICYgX19mbGFnKQotICAgIF9TVExQX1JFVEhST1c7Ci19Ci0KLV9TVExQX0VORF9OQU1FU1BBQ0UKLQotI2VuZGlmIC8qIF9TVExQX0lPU19DICovCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX2lvcy5oIGIvc3RsL19pb3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU2ZGEyZC4uMDAwMDAwMAotLS0gYS9zdGwvX2lvcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogQm9yaXMgRm9taXRjaGV2Ci0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICovCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0lPU19ICi0jZGVmaW5lIF9TVExQX0lOVEVSTkFMX0lPU19ICi0KLQotI2lmbmRlZiBfU1RMUF9JT1NfQkFTRV9ICi0jIGluY2x1ZGUgPHN0bC9faW9zX2Jhc2UuaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NUWVBFX0gKLSMgaW5jbHVkZSA8c3RsL19jdHlwZS5oPgotI2VuZGlmCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX05VTVBVTkNUX0gKLSMgaW5jbHVkZSA8c3RsL19udW1wdW5jdC5oPgotI2VuZGlmCi0KLV9TVExQX0JFR0lOX05BTUVTUEFDRQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIENsYXNzIGJhc2ljX2lvcywgYSBzdWJjbGFzcyBvZiBpb3NfYmFzZS4gIFRoZSBvbmx5IGltcG9ydGFudCBkaWZmZXJlbmNlCi0vLyBiZXR3ZWVuIHRoZSB0d28gaXMgdGhhdCBiYXNpY19pb3MgaXMgYSBjbGFzcyB0ZW1wbGF0ZSwgcGFyYW1ldGVyaXplZAotLy8gYnkgdGhlIGNoYXJhY3RlciB0eXBlLiAgaW9zX2Jhc2UgZXhpc3RzIHRvIGZhY3RvciBvdXQgYWxsIG9mIHRoZQotLy8gY29tbW9uIHByb3BlcnRpZXMgdGhhdCBkb24ndCBkZXBlbmQgb24gdGhlIGNoYXJhY3RlciB0eXBlLgotCi0vLyBUaGUgc2Vjb25kIHRlbXBsYXRlIHBhcmFtZXRlciwgX1RyYWl0cywgZGVmYXVsdHMgdG8gY2hhcl90cmFpdHM8X0NoYXJUPi4KLS8vIFRoZSBkZWZhdWx0IGlzIGRlY2xhcmVkIGluIGhlYWRlciA8aW9zZndkPiwgYW5kIGl0IGlzbid0IGRlY2xhcmVkIGhlcmUKLS8vIGJlY2F1c2UgQysrIGxhbmd1YWdlIHJ1bGVzIGRvIG5vdCBhbGxvdyBpdCB0byBiZSBkZWNsYXJlZCB0d2ljZS4KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KLWNsYXNzIGJhc2ljX2lvcyA6IHB1YmxpYyBpb3NfYmFzZSB7Ci0gIGZyaWVuZCBjbGFzcyBpb3NfYmFzZTsKLXB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3lub255bXMgZm9yIHR5cGVzLgotICB0eXBlZGVmIF9DaGFyVCAgICAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjppbnRfdHlwZSBpbnRfdHlwZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpwb3NfdHlwZSBwb3NfdHlwZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpvZmZfdHlwZSBvZmZfdHlwZTsKLSAgdHlwZWRlZiBfVHJhaXRzICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdHlwZTsKLQotcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25zdHJ1Y3RvciwgZGVzdHJ1Y3Rvci4KLSAgZXhwbGljaXQgYmFzaWNfaW9zKGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX3N0cmVhbWJ1Zik7Ci0gIHZpcnR1YWwgfmJhc2ljX2lvcygpIHt9Ci0KLXB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWVtYmVycyBmcm9tIGNsYXVzZSAyNy40LjQuMgotICBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4qIHRpZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gX01fdGllZF9vc3RyZWFtOwotICB9Ci0gIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPioKLSAgdGllKGJhc2ljX29zdHJlYW08Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4qIF9fbmV3X3RpZWRfb3N0cmVhbSkgewotICAgIGJhc2ljX29zdHJlYW08Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4qIF9fdG1wID0gX01fdGllZF9vc3RyZWFtOwotICAgIF9NX3RpZWRfb3N0cmVhbSA9IF9fbmV3X3RpZWRfb3N0cmVhbTsKLSAgICByZXR1cm4gX190bXA7Ci0gIH0KLQotICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogcmRidWYoKSBjb25zdAotICAgIHsgcmV0dXJuIF9NX3N0cmVhbWJ1ZjsgfQotCi0gIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KgotICByZGJ1ZihiYXNpY19zdHJlYW1idWY8Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4qKTsKLQotICAvLyBDb3BpZXMgX194J3Mgc3RhdGUgdG8gKnRoaXMuCi0gIGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+JiBjb3B5Zm10KGNvbnN0IGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+JiBfX3gpOwotCi0gIGNoYXJfdHlwZSBmaWxsKCkgY29uc3QgeyByZXR1cm4gX01fZmlsbDsgfQotICBjaGFyX3R5cGUgZmlsbChjaGFyX3R5cGUgX19maWxsKSB7Ci0gICAgY2hhcl90eXBlIF9fdG1wKF9NX2ZpbGwpOwotICAgIF9NX2ZpbGwgPSBfX2ZpbGw7Ci0gICAgcmV0dXJuIF9fdG1wOwotICB9Ci0KLXB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWVtYmVycyBmcm9tIDI3LjQuNC4zLiAgVGhlc2UgZm91ciBmdW5jdGlvbnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FuIGFsbW9zdCBiZSBkZWZpbmVkIGluIGlvc19iYXNlLgotCi0gIHZvaWQgY2xlYXIoaW9zdGF0ZSBfX3N0YXRlID0gZ29vZGJpdCkgewotICAgIF9NX2NsZWFyX25vdGhyb3codGhpcy0+cmRidWYoKSA/IF9fc3RhdGUgOiBpb3N0YXRlKF9fc3RhdGV8aW9zX2Jhc2U6OmJhZGJpdCkpOwotICAgIF9NX2NoZWNrX2V4Y2VwdGlvbl9tYXNrKCk7Ci0gIH0KLSAgdm9pZCBzZXRzdGF0ZShpb3N0YXRlIF9fc3RhdGUpIHsgdGhpcy0+Y2xlYXIocmRzdGF0ZSgpIHwgX19zdGF0ZSk7IH0KLQotICBpb3N0YXRlIGV4Y2VwdGlvbnMoKSBjb25zdCB7IHJldHVybiB0aGlzLT5fTV9nZXRfZXhjZXB0aW9uX21hc2soKTsgfQotICB2b2lkIGV4Y2VwdGlvbnMoaW9zdGF0ZSBfX21hc2spIHsKLSAgICB0aGlzLT5fTV9zZXRfZXhjZXB0aW9uX21hc2soX19tYXNrKTsKLSAgICB0aGlzLT5jbGVhcih0aGlzLT5yZHN0YXRlKCkpOwotICB9Ci0KLXB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gTG9jYWxlLXJlbGF0ZWQgbWVtYmVyIGZ1bmN0aW9ucy4KLSAgbG9jYWxlIGltYnVlKGNvbnN0IGxvY2FsZSYpOwotCi0gIGlubGluZSBjaGFyIG5hcnJvdyhfQ2hhclQsIGNoYXIpIGNvbnN0IDsKLSAgaW5saW5lIF9DaGFyVCB3aWRlbihjaGFyKSBjb25zdDsKLQotICAvLyBIZWxwZXIgZnVuY3Rpb24gdGhhdCBtYWtlcyB0ZXN0aW5nIGZvciBFT0YgbW9yZSBjb252ZW5pZW50LgotICBzdGF0aWMgYm9vbCBfU1RMUF9DQUxMIF9TX2VvZihpbnRfdHlwZSBfX2MpIHsKLSAgICBjb25zdCBpbnRfdHlwZSBfX2VvZiA9IF9UcmFpdHM6OmVvZigpOwotICAgIHJldHVybiBfVHJhaXRzOjplcV9pbnRfdHlwZShfX2MsIF9fZW9mKTsKLSAgfQotCi1wcm90ZWN0ZWQ6Ci0gIGJhc2ljX2lvcygpOwotCi0gIHZvaWQgaW5pdChiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19zdHJlYW1idWYpOwotCi1wdWJsaWM6Ci0KLSAgLy8gSGVscGVyIGZ1bmN0aW9uIHVzZWQgaW4gaXN0cmVhbSBhbmQgb3N0cmVhbS4gIEl0IGlzIGNhbGxlZCBvbmx5IGZyb20KLSAgLy8gYSBjYXRjaCBjbGF1c2UuCi0gIHZvaWQgX01faGFuZGxlX2V4Y2VwdGlvbihpb3NfYmFzZTo6aW9zdGF0ZSBfX2ZsYWcpOwotCi1wcml2YXRlOiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERhdGEgbWVtYmVycwotICBjaGFyX3R5cGUgX01fZmlsbDsgICAgICAgICAgICAvLyBUaGUgZmlsbCBjaGFyYWN0ZXIsIHVzZWQgZm9yIHBhZGRpbmcuCi0KLSAgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9NX3N0cmVhbWJ1ZjsKLSAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+KiAgIF9NX3RpZWRfb3N0cmVhbTsKLQotfTsKLQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotaW5saW5lIGNoYXIKLWJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+OjpuYXJyb3coX0NoYXJUIF9fYywgY2hhciBfX2RlZmF1bHQpIGNvbnN0Ci17IHJldHVybiBfX1NUQVRJQ19DQVNUKGNvbnN0IGN0eXBlPF9DaGFyVD4qLCB0aGlzLT5fTV9jdHlwZV9mYWNldCgpKS0+bmFycm93KF9fYywgX19kZWZhdWx0KTsgfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotaW5saW5lIF9DaGFyVAotYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz46OndpZGVuKGNoYXIgX19jKSBjb25zdAoteyByZXR1cm4gX19TVEFUSUNfQ0FTVChjb25zdCBjdHlwZTxfQ2hhclQ+KiwgdGhpcy0+X01fY3R5cGVfZmFjZXQoKSktPndpZGVuKF9fYyk7IH0KLQotIyBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTUVUSE9EX1NQRUNJQUxJWkFUSU9OKQotX1NUTFBfVEVNUExBVEVfTlVMTAotaW5saW5lIGNoYXIKLWJhc2ljX2lvczxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+OjpuYXJyb3coY2hhciBfX2MsIGNoYXIpIGNvbnN0Ci17Ci0gIHJldHVybiBfX2M7Ci19Ci0KLV9TVExQX1RFTVBMQVRFX05VTEwKLWlubGluZSBjaGFyCi1iYXNpY19pb3M8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPjo6d2lkZW4oY2hhciBfX2MpIGNvbnN0Ci17Ci0gIHJldHVybiBfX2M7Ci19Ci0jIGVuZGlmIC8qIF9TVExQX05PX01FVEhPRF9TUEVDSUFMSVpBVElPTiAqLwotCi0jIGlmIGRlZmluZWQgKF9TVExQX1VTRV9URU1QTEFURV9FWFBPUlQpCi1fU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgYmFzaWNfaW9zPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID47Ci0jICBpZiAhIGRlZmluZWQgKF9TVExQX05PX1dDSEFSX1QpCi1fU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgYmFzaWNfaW9zPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID47Ci0jICBlbmRpZgotIyBlbmRpZiAvKiBfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUICovCi0KLV9TVExQX0VORF9OQU1FU1BBQ0UKLQotI2lmIGRlZmluZWQgKF9TVExQX0VYUE9TRV9TVFJFQU1fSU1QTEVNRU5UQVRJT04pICYmICFkZWZpbmVkIChfU1RMUF9MSU5LX1RJTUVfSU5TVEFOVElBVElPTikKLSMgIGluY2x1ZGUgPHN0bC9faW9zLmM+Ci0jZW5kaWYKLQotI2VuZGlmIC8qIF9TVExQX0lPUyAqLwotCi0vLyBMb2NhbCBWYXJpYWJsZXM6Ci0vLyBtb2RlOkMrKwotLy8gRW5kOgotCmRpZmYgLS1naXQgYS9zdGwvX2lvc19iYXNlLmggYi9zdGwvX2lvc19iYXNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MDYwNmEuLjAwMDAwMDAKLS0tIGEvc3RsL19pb3NfYmFzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzY4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogQm9yaXMgRm9taXRjaGV2Ci0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICovCi0jaWZuZGVmIF9TVExQX0lPU19CQVNFX0gKLSNkZWZpbmUgX1NUTFBfSU9TX0JBU0VfSAotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX1NUREVYQ0VQVF9CQVNFCi0jICBpbmNsdWRlIDxzdGwvX3N0ZGV4Y2VwdF9iYXNlLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBfU1RMUF9VVElMSVRZCi0jICBpbmNsdWRlIDx1dGlsaXR5PgotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfTE9DQUxFX0gKLSMgIGluY2x1ZGUgPHN0bC9fbG9jYWxlLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9TVFJJTkdfSAotIyAgaW5jbHVkZSA8c3RsL19zdHJpbmcuaD4KLSNlbmRpZgotCi1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBDbGFzcyBpb3NfYmFzZS4gIFRoaXMgaXMgdGhlIGJhc2UgY2xhc3Mgb2YgdGhlIGlvcyBoaWVyYXJjaHksIHdoaWNoCi0vLyBpbmNsdWRlcyBiYXNpY19pc3RyZWFtIGFuZCBiYXNpY19vc3RyZWFtLiAgQ2xhc3NlcyBpbiB0aGUgaW9zCi0vLyBoaWVyYXJjaHkgYXJlIGFjdHVhbGx5IHF1aXRlIHNpbXBsZTogdGhleSBhcmUganVzdCBnbG9yaWZpZWQKLS8vIHdyYXBwZXIgY2xhc3Nlcy4gIFRoZXkgZGVsZWdhdGUgYnVmZmVyaW5nIGFuZCBwaHlzaWNhbCBjaGFyYWN0ZXIKLS8vIG1hbmlwdWxhdGlvbiB0byB0aGUgc3RyZWFtYnVmIGNsYXNzZXMsIGFuZCB0aGV5IGRlbGVnYXRlIG1vc3QKLS8vIGZvcm1hdHRpbmcgdGFza3MgdG8gYSBsb2NhbGUuCi0KLWNsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIGlvc19iYXNlIHsKLXB1YmxpYzoKLQotICBjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBmYWlsdXJlIDogcHVibGljIF9fTmFtZWRfZXhjZXB0aW9uIHsKLSAgcHVibGljOgotICAgIGV4cGxpY2l0IGZhaWx1cmUoY29uc3Qgc3RyaW5nJik7Ci0gICAgdmlydHVhbCB+ZmFpbHVyZSgpIF9TVExQX05PVEhST1dfSU5IRVJFTlRMWTsKLSAgfTsKLQotICB0eXBlZGVmIGludCBmbXRmbGFnczsKLSAgdHlwZWRlZiBpbnQgaW9zdGF0ZTsKLSAgdHlwZWRlZiBpbnQgb3Blbm1vZGU7Ci0gIHR5cGVkZWYgaW50IHNlZWtkaXI7Ci0KLSMgaWZuZGVmIF9TVExQX05PX0FOQUNIUk9OSVNNUwotICB0eXBlZGVmIGZtdGZsYWdzIGZtdF9mbGFnczsKLSMgZW5kaWYKLQotICAvLyBGb3JtYXR0aW5nIGZsYWdzLgotI2lmIGRlZmluZWQgKF9TVExQX1NUQVRJQ19DT05TVF9JTklUX0JVRykKLSAgZW51bSAgewotI2Vsc2UKLSAgLy8gYm9yaXMgOiB0eXBlIGZvciBhbGwgdGhvc2UgY29uc3RhbnRzIGlzIGludAotICBzdGF0aWMgY29uc3QgaW50Ci0jZW5kaWYKLSAgICBsZWZ0ICAgICAgID0gMHgwMDAxLAotICAgIHJpZ2h0ICAgICAgPSAweDAwMDIsCi0gICAgaW50ZXJuYWwgICA9IDB4MDAwNCwKLSAgICBkZWMgICAgICAgID0gMHgwMDA4LAotICAgIGhleCAgICAgICAgPSAweDAwMTAsCi0gICAgb2N0ICAgICAgICA9IDB4MDAyMCwKLSAgICBmaXhlZCAgICAgID0gMHgwMDQwLAotICAgIHNjaWVudGlmaWMgPSAweDAwODAsCi0gICAgYm9vbGFscGhhICA9IDB4MDEwMCwKLSAgICBzaG93YmFzZSAgID0gMHgwMjAwLAotICAgIHNob3dwb2ludCAgPSAweDA0MDAsCi0gICAgc2hvd3BvcyAgICA9IDB4MDgwMCwKLSAgICBza2lwd3MgICAgID0gMHgxMDAwLAotICAgIHVuaXRidWYgICAgPSAweDIwMDAsCi0gICAgdXBwZXJjYXNlICA9IDB4NDAwMCwKLSAgICBhZGp1c3RmaWVsZCA9IGxlZnQgfCByaWdodCB8IGludGVybmFsLAotICAgIGJhc2VmaWVsZCAgID0gZGVjIHwgaGV4IHwgb2N0LAotICAgIGZsb2F0ZmllbGQgID0gc2NpZW50aWZpYyB8IGZpeGVkLAotCi0gICAgLy8gU3RhdGUgZmxhZ3MuCi0gICAgZ29vZGJpdCA9IDB4MDAsCi0gICAgYmFkYml0ICA9IDB4MDEsCi0gICAgZW9mYml0ICA9IDB4MDIsCi0gICAgZmFpbGJpdCA9IDB4MDQsCi0KLSAgICAvLyBPcGVubW9kZSBmbGFncy4KLSAgICBfX2RlZmF1bHRfbW9kZSA9IDB4MCwgLyogaW1wbGVtZW50YXRpb24gZGV0YWlsICovCi0gICAgYXBwICAgID0gMHgwMSwKLSAgICBhdGUgICAgPSAweDAyLAotICAgIGJpbmFyeSA9IDB4MDQsCi0gICAgaW4gICAgID0gMHgwOCwKLSAgICBvdXQgICAgPSAweDEwLAotICAgIHRydW5jICA9IDB4MjAsCi0KLSAgICAvLyBTZWVrZGlyIGZsYWdzCi0KLSAgICBiZWcgPSAweDAxLAotICAgIGN1ciA9IDB4MDIsCi0gICAgZW5kID0gMHgwNAotIyBpZmRlZiBfU1RMUF9TVEFUSUNfQ09OU1RfSU5JVF9CVUcKLSAgfQotIyBlbmRpZgotICA7Ci0KLXB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmxhZy1tYW5pcHVsYXRpb24gZnVuY3Rpb25zLgotICBmbXRmbGFncyBmbGFncygpIGNvbnN0IHsgcmV0dXJuIF9NX2ZtdGZsYWdzOyB9Ci0gIGZtdGZsYWdzIGZsYWdzKGZtdGZsYWdzIF9fZmxhZ3MpIHsKLSAgICBmbXRmbGFncyBfX3RtcCA9IF9NX2ZtdGZsYWdzOwotICAgIF9NX2ZtdGZsYWdzID0gX19mbGFnczsKLSAgICByZXR1cm4gX190bXA7Ci0gIH0KLQotICBmbXRmbGFncyBzZXRmKGZtdGZsYWdzIF9fZmxhZykgewotICAgIGZtdGZsYWdzIF9fdG1wID0gX01fZm10ZmxhZ3M7Ci0gICAgX01fZm10ZmxhZ3MgfD0gX19mbGFnOwotICAgIHJldHVybiBfX3RtcDsKLSAgfQotICBmbXRmbGFncyBzZXRmKGZtdGZsYWdzIF9fZmxhZywgZm10ZmxhZ3MgX19tYXNrKSB7Ci0gICAgZm10ZmxhZ3MgX190bXAgPSBfTV9mbXRmbGFnczsKLSAgICBfTV9mbXRmbGFncyAmPSB+X19tYXNrOwotICAgIF9NX2ZtdGZsYWdzIHw9IF9fZmxhZyAmIF9fbWFzazsKLSAgICByZXR1cm4gX190bXA7Ci0gIH0KLSAgdm9pZCB1bnNldGYoZm10ZmxhZ3MgX19tYXNrKSB7IF9NX2ZtdGZsYWdzICY9IH5fX21hc2s7IH0KLQotICBzdHJlYW1zaXplIHByZWNpc2lvbigpIGNvbnN0IHsgcmV0dXJuIF9NX3ByZWNpc2lvbjsgfQotICBzdHJlYW1zaXplIHByZWNpc2lvbihzdHJlYW1zaXplIF9fbmV3cHJlY2lzaW9uKSB7Ci0gICAgc3RyZWFtc2l6ZSBfX3RtcCA9IF9NX3ByZWNpc2lvbjsKLSAgICBfTV9wcmVjaXNpb24gPSBfX25ld3ByZWNpc2lvbjsKLSAgICByZXR1cm4gX190bXA7Ci0gIH0KLQotICBzdHJlYW1zaXplIHdpZHRoKCkgY29uc3QgeyByZXR1cm4gX01fd2lkdGg7IH0KLSAgc3RyZWFtc2l6ZSB3aWR0aChzdHJlYW1zaXplIF9fbmV3d2lkdGgpIHsKLSAgICBzdHJlYW1zaXplIF9fdG1wID0gX01fd2lkdGg7Ci0gICAgX01fd2lkdGggPSBfX25ld3dpZHRoOwotICAgIHJldHVybiBfX3RtcDsKLSAgfQotCi1wdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExvY2FsZXMKLSAgbG9jYWxlIGltYnVlKGNvbnN0IGxvY2FsZSYpOwotICBsb2NhbGUgZ2V0bG9jKCkgY29uc3QgeyByZXR1cm4gX01fbG9jYWxlOyB9Ci0KLXB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXV4aWxpYXJ5IHN0b3JhZ2UuCi0gIHN0YXRpYyBpbnQgX1NUTFBfQ0FMTCB4YWxsb2MoKTsKLSAgbG9uZyYgIGl3b3JkKGludCBfX2luZGV4KTsKLSAgdm9pZComIHB3b3JkKGludCBfX2luZGV4KTsKLQotcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEZXN0cnVjdG9yLgotICB2aXJ0dWFsIH5pb3NfYmFzZSgpOwotCi1wdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhbGxiYWNrcy4KLSAgZW51bSBldmVudCB7IGVyYXNlX2V2ZW50LCBpbWJ1ZV9ldmVudCwgY29weWZtdF9ldmVudCB9OwotICB0eXBlZGVmIHZvaWQgKCpldmVudF9jYWxsYmFjaykoZXZlbnQsIGlvc19iYXNlJiwgaW50IF9faW5kZXgpOwotICB2b2lkIHJlZ2lzdGVyX2NhbGxiYWNrKGV2ZW50X2NhbGxiYWNrIF9fZm4sIGludCBfX2luZGV4KTsKLQotcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIG1lbWJlciBmdW5jdGlvbiBhZmZlY3RzIG9ubHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGVpZ2h0IHByZWRlZmluZWQgaW9zIG9iamVjdHM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNpbiwgY291dCwgZXRjLgotICBzdGF0aWMgYm9vbCBfU1RMUF9DQUxMIHN5bmNfd2l0aF9zdGRpbyhib29sIF9fc3luYyA9IHRydWUpOwotCi1wdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBDKysgc3RhbmRhcmQgcmVxdWlyZXMgb25seSB0aGF0IHRoZXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lbWJlciBmdW5jdGlvbnMgYmUgZGVmaW5lZCBpbiBiYXNpY19pb3MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGRlZmluZSB0aGVtIGluIHRoZSBub24tdGVtcGxhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFzZSBjbGFzcyB0byBhdm9pZCBjb2RlIGR1cGxpY2F0aW9uLgotICBvcGVyYXRvciB2b2lkKigpIGNvbnN0IHsgcmV0dXJuICFmYWlsKCkgPyAodm9pZCopIF9fQ09OU1RfQ0FTVChpb3NfYmFzZSosdGhpcykgOiAodm9pZCopIDA7IH0KLSAgYm9vbCBvcGVyYXRvciEoKSBjb25zdCB7IHJldHVybiBmYWlsKCk7IH0KLQotICBpb3N0YXRlIHJkc3RhdGUoKSBjb25zdCB7IHJldHVybiBfTV9pb3N0YXRlOyB9Ci0KLSAgYm9vbCBnb29kKCkgY29uc3QgeyByZXR1cm4gX01faW9zdGF0ZSA9PSAwOyB9Ci0gIGJvb2wgZW9mKCkgY29uc3QgeyByZXR1cm4gKF9NX2lvc3RhdGUgJiBlb2ZiaXQpICE9IDA7IH0KLSAgYm9vbCBmYWlsKCkgY29uc3QgeyByZXR1cm4gKF9NX2lvc3RhdGUgJiAoZmFpbGJpdCB8IGJhZGJpdCkpICE9IDA7IH0KLSAgYm9vbCBiYWQoKSBjb25zdCB7IHJldHVybiAoX01faW9zdGF0ZSAmIGJhZGJpdCkgIT0gMDsgfQotCi1wcm90ZWN0ZWQ6ICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBmdW5jdGlvbmFsIHByb3RlY3RlZCBpbnRlcmZhY2UuCi0KLSAgLy8gQ29waWVzIHRoZSBzdGF0ZSBvZiBfX3ggdG8gKnRoaXMuICBUaGlzIG1lbWJlciBmdW5jdGlvbiBtYWtlcyBpdAotICAvLyBwb3NzaWJsZSB0byBpbXBsZW1lbnQgYmFzaWNfaW9zOjpjb3B5Zm10IHdpdGhvdXQgaGF2aW5nIHRvIGV4cG9zZQotICAvLyBpb3NfYmFzZSdzIHByaXZhdGUgZGF0YSBtZW1iZXJzLiAgRG9lcyBub3QgY29weSBfTV9leGNlcHRpb25fbWFzawotICAvLyBvciBfTV9pb3N0YXRlLgotICB2b2lkIF9NX2NvcHlfc3RhdGUoY29uc3QgaW9zX2Jhc2UmIF9feCk7Ci0KLSAgdm9pZCBfTV9zZXRzdGF0ZV9ub3Rocm93KGlvc3RhdGUgX19zdGF0ZSkgeyBfTV9pb3N0YXRlIHw9IF9fc3RhdGU7IH0KLSAgdm9pZCBfTV9jbGVhcl9ub3Rocm93KGlvc3RhdGUgX19zdGF0ZSkgeyBfTV9pb3N0YXRlID0gX19zdGF0ZTsgfQotICBpb3N0YXRlIF9NX2dldF9leGNlcHRpb25fbWFzaygpIGNvbnN0IHsgcmV0dXJuIF9NX2V4Y2VwdGlvbl9tYXNrOyB9Ci0gIHZvaWQgX01fc2V0X2V4Y2VwdGlvbl9tYXNrKGlvc3RhdGUgX19tYXNrKSB7IF9NX2V4Y2VwdGlvbl9tYXNrID0gX19tYXNrOyB9Ci0gIHZvaWQgX01fY2hlY2tfZXhjZXB0aW9uX21hc2soKSB7Ci0gICAgaWYgKF9NX2lvc3RhdGUgJiBfTV9leGNlcHRpb25fbWFzaykKLSAgICAgIF9NX3Rocm93X2ZhaWx1cmUoKTsKLSAgfQotCi0gIHZvaWQgX01faW52b2tlX2NhbGxiYWNrcyhldmVudCk7Ci0gIHZvaWQgX1NUTFBfRlVOQ1RJT05fVEhST1dTIF9NX3Rocm93X2ZhaWx1cmUoKTsKLQotICBpb3NfYmFzZSgpOyAgICAgICAgICAgICAgICAgICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCi1wcm90ZWN0ZWQ6ICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5pdGlhbGl6YXRpb24gb2YgdGhlIEkvTyBzeXN0ZW0KLSAgc3RhdGljIHZvaWQgX1NUTFBfQ0FMTCBfU19pbml0aWFsaXplKCk7Ci0gIHN0YXRpYyB2b2lkIF9TVExQX0NBTEwgX1NfdW5pbml0aWFsaXplKCk7Ci0gIHN0YXRpYyBib29sIF9TX3dhc19zeW5jZWQ7Ci0KLXByaXZhdGU6ICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW52YWxpZGF0ZSB0aGUgY29weSBjb25zdHJ1Y3RvciBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXNzaWdubWVudCBvcGVyYXRvci4KLSAgaW9zX2Jhc2UoY29uc3QgaW9zX2Jhc2UmKTsKLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgaW9zX2Jhc2UmKTsKLQotcHJpdmF0ZTogICAgICAgICAgICAgICAgICAgICAgICAvLyBEYXRhIG1lbWJlcnMuCi0KLSAgZm10ZmxhZ3MgX01fZm10ZmxhZ3M7ICAgICAgICAgLy8gRmxhZ3MKLSAgaW9zdGF0ZSBfTV9pb3N0YXRlOwotICBvcGVubW9kZSBfTV9vcGVubW9kZTsKLSAgc2Vla2RpciBfTV9zZWVrZGlyOwotICBpb3N0YXRlIF9NX2V4Y2VwdGlvbl9tYXNrOwotCi0gIHN0cmVhbXNpemUgX01fcHJlY2lzaW9uOwotICBzdHJlYW1zaXplIF9NX3dpZHRoOwotCi0gIGxvY2FsZSBfTV9sb2NhbGU7Ci0KLSAgcGFpcjxldmVudF9jYWxsYmFjaywgaW50PiogX01fY2FsbGJhY2tzOwotICBzaXplX3QgX01fbnVtX2NhbGxiYWNrczsgICAgICAvLyBTaXplIG9mIHRoZSBjYWxsYmFjayBhcnJheS4KLSAgc2l6ZV90IF9NX2NhbGxiYWNrX2luZGV4OyAgICAgLy8gSW5kZXggb2YgdGhlIG5leHQgYXZhaWxhYmxlIGNhbGxiYWNrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbml0aWFsbHkgemVyby4KLQotICBsb25nKiBfTV9pd29yZHM7ICAgICAgICAgICAgICAvLyBBdXhpbGlhcnkgc3RvcmFnZS4gIFRoZSBjb3VudCBpcyB6ZXJvCi0gIHNpemVfdCBfTV9udW1faXdvcmRzOyAgICAgICAgIC8vIGlmIGFuZCBvbmx5IGlmIHRoZSBwb2ludGVyIGlzIG51bGwuCi0KLSAgdm9pZCoqIF9NX3B3b3JkczsKLSAgc2l6ZV90IF9NX251bV9wd29yZHM7Ci0KLXByb3RlY3RlZDoKLSAgLy8gQ2FjaGVkIGNvcGllcyBvZiB0aGUgY3VyZW50IGxvY2FsZSdzIGZhY2V0cy4gIFNldCBieSBpbml0KCkgYW5kIGltYnVlKCkuCi0gIGxvY2FsZTo6ZmFjZXQqIF9NX2NhY2hlZF9jdHlwZTsKLSAgbG9jYWxlOjpmYWNldCogX01fY2FjaGVkX251bXB1bmN0OwotICBzdHJpbmcgICAgICAgICBfTV9jYWNoZWRfZ3JvdXBpbmc7Ci1wdWJsaWM6Ci0gIC8vIEVxdWl2YWxlbnQgdG8gJnVzZV9mYWNldDwgRmFjZXQgPihnZXRsb2MoKSksIGJ1dCBmYXN0ZXIuCi0gIGNvbnN0IGxvY2FsZTo6ZmFjZXQqIF9NX2N0eXBlX2ZhY2V0KCkgY29uc3QgeyByZXR1cm4gX01fY2FjaGVkX2N0eXBlOyB9Ci0gIGNvbnN0IGxvY2FsZTo6ZmFjZXQqIF9NX251bXB1bmN0X2ZhY2V0KCkgY29uc3QgeyByZXR1cm4gX01fY2FjaGVkX251bXB1bmN0OyB9Ci0gIGNvbnN0IHN0cmluZyYgIF9NX2dyb3VwaW5nKCkgY29uc3QgeyByZXR1cm4gX01fY2FjaGVkX2dyb3VwaW5nOyB9Ci1wdWJsaWM6Ci0KLSAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyBOZXN0ZWQgaW5pdGlhbGl6ZXIgY2xhc3MuICBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbCwgYnV0IGl0J3MKLSAgLy8gcHJlc2NyaWJlZCBieSB0aGUgc3RhbmRhcmQuICBUaGUgc3RhdGljIGluaXRpYWxpemVyIG9iamVjdCAob24KLSAgLy8gaW1wbGVtZW50YXRpb25zIHdoZXJlIHN1Y2ggYSB0aGluZyBpcyByZXF1aXJlZCkgaXMgZGVjbGFyZWQgaW4KLSAgLy8gPGlvc3RyZWFtPgotCi0gIGNsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIEluaXQKLSAgewotICAgIHB1YmxpYzoKLSAgICAgIEluaXQoKTsKLSAgICAgIH5Jbml0KCk7Ci0gICAgcHJpdmF0ZToKLSAgICAgIHN0YXRpYyBsb25nIF9TX2NvdW50OwotICAgICAgZnJpZW5kIGNsYXNzIGlvc19iYXNlOwotICB9OwotCi0gIGZyaWVuZCBjbGFzcyBJbml0OwotCi1wdWJsaWM6Ci0jIGlmbmRlZiBfU1RMUF9OT19BTkFDSFJPTklTTVMKLSAgLy8gIDMxLjYgIE9sZCBpb3N0cmVhbXMgbWVtYmVycyAgICAgICAgICAgICAgICAgICAgICAgICBbZGVwci5pb3MubWVtYmVyc10KLSAgdHlwZWRlZiBpb3N0YXRlICBpb19zdGF0ZTsKLSAgdHlwZWRlZiBvcGVubW9kZSBvcGVuX21vZGU7Ci0gIHR5cGVkZWYgc2Vla2RpciAgc2Vla19kaXI7Ci0gIHR5cGVkZWYgX1NUTFBfU1REOjpzdHJlYW1vZmYgIHN0cmVhbW9mZjsKLSAgdHlwZWRlZiBfU1RMUF9TVEQ6OnN0cmVhbXBvcyAgc3RyZWFtcG9zOwotIyBlbmRpZgotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gaW9zX2Jhc2UgbWFuaXB1bGF0b3IgZnVuY3Rpb25zLCBmcm9tIHNlY3Rpb24gMjcuNC41IG9mIHRoZSBDKysgc3RhbmRhcmQuCi0vLyBBbGwgb2YgdGhlbSBhcmUgdHJpdmlhbCBvbmUtbGluZSB3cmFwcGVyIGZ1bmN0aW9ucy4KLQotLy8gZm10ZmxhZyBtYW5pcHVsYXRvcnMsIHNlY3Rpb24gMjcuNC41LjEKLWlubGluZSBpb3NfYmFzZSYgX1NUTFBfQ0FMTCBib29sYWxwaGEoaW9zX2Jhc2UmIF9fcykKLSAgeyBfX3Muc2V0Zihpb3NfYmFzZTo6Ym9vbGFscGhhKTsgcmV0dXJuIF9fczt9Ci0KLWlubGluZSBpb3NfYmFzZSYgX1NUTFBfQ0FMTCBub2Jvb2xhbHBoYShpb3NfYmFzZSYgX19zKQotICB7IF9fcy51bnNldGYoaW9zX2Jhc2U6OmJvb2xhbHBoYSk7IHJldHVybiBfX3M7fQotCi1pbmxpbmUgaW9zX2Jhc2UmIF9TVExQX0NBTEwgc2hvd2Jhc2UoaW9zX2Jhc2UmIF9fcykKLSAgeyBfX3Muc2V0Zihpb3NfYmFzZTo6c2hvd2Jhc2UpOyByZXR1cm4gX19zO30KLQotaW5saW5lIGlvc19iYXNlJiBfU1RMUF9DQUxMIG5vc2hvd2Jhc2UoaW9zX2Jhc2UmIF9fcykKLSAgeyBfX3MudW5zZXRmKGlvc19iYXNlOjpzaG93YmFzZSk7IHJldHVybiBfX3M7fQotCi1pbmxpbmUgaW9zX2Jhc2UmIF9TVExQX0NBTEwgc2hvd3BvaW50KGlvc19iYXNlJiBfX3MpCi0gIHsgX19zLnNldGYoaW9zX2Jhc2U6OnNob3dwb2ludCk7IHJldHVybiBfX3M7fQotCi1pbmxpbmUgaW9zX2Jhc2UmIF9TVExQX0NBTEwgbm9zaG93cG9pbnQoaW9zX2Jhc2UmIF9fcykKLSAgeyBfX3MudW5zZXRmKGlvc19iYXNlOjpzaG93cG9pbnQpOyByZXR1cm4gX19zO30KLQotaW5saW5lIGlvc19iYXNlJiBfU1RMUF9DQUxMIHNob3dwb3MoaW9zX2Jhc2UmIF9fcykKLSAgeyBfX3Muc2V0Zihpb3NfYmFzZTo6c2hvd3Bvcyk7IHJldHVybiBfX3M7fQotCi1pbmxpbmUgaW9zX2Jhc2UmIF9TVExQX0NBTEwgbm9zaG93cG9zKGlvc19iYXNlJiBfX3MpCi0gIHsgX19zLnVuc2V0Zihpb3NfYmFzZTo6c2hvd3Bvcyk7IHJldHVybiBfX3M7fQotCi1pbmxpbmUgaW9zX2Jhc2UmIF9TVExQX0NBTEwgc2tpcHdzKGlvc19iYXNlJiBfX3MpCi0gIHsgX19zLnNldGYoaW9zX2Jhc2U6OnNraXB3cyk7IHJldHVybiBfX3M7fQotCi1pbmxpbmUgaW9zX2Jhc2UmIF9TVExQX0NBTEwgbm9za2lwd3MoaW9zX2Jhc2UmIF9fcykKLSAgeyBfX3MudW5zZXRmKGlvc19iYXNlOjpza2lwd3MpOyByZXR1cm4gX19zO30KLQotaW5saW5lIGlvc19iYXNlJiBfU1RMUF9DQUxMIHVwcGVyY2FzZShpb3NfYmFzZSYgX19zKQotICB7IF9fcy5zZXRmKGlvc19iYXNlOjp1cHBlcmNhc2UpOyByZXR1cm4gX19zO30KLQotaW5saW5lIGlvc19iYXNlJiBfU1RMUF9DQUxMIG5vdXBwZXJjYXNlKGlvc19iYXNlJiBfX3MpCi0gIHsgX19zLnVuc2V0Zihpb3NfYmFzZTo6dXBwZXJjYXNlKTsgcmV0dXJuIF9fczt9Ci0KLWlubGluZSBpb3NfYmFzZSYgX1NUTFBfQ0FMTCB1bml0YnVmKGlvc19iYXNlJiBfX3MpCi0gIHsgX19zLnNldGYoaW9zX2Jhc2U6OnVuaXRidWYpOyByZXR1cm4gX19zO30KLQotaW5saW5lIGlvc19iYXNlJiBfU1RMUF9DQUxMIG5vdW5pdGJ1Zihpb3NfYmFzZSYgX19zKQotICB7IF9fcy51bnNldGYoaW9zX2Jhc2U6OnVuaXRidWYpOyByZXR1cm4gX19zO30KLQotCi0vLyBhZGp1c3RmaWVsZCBtYW5pcHVsYXRvcnMsIHNlY3Rpb24gMjcuNC41LjIKLWlubGluZSBpb3NfYmFzZSYgX1NUTFBfQ0FMTCBpbnRlcm5hbChpb3NfYmFzZSYgX19zKQotICB7IF9fcy5zZXRmKGlvc19iYXNlOjppbnRlcm5hbCwgaW9zX2Jhc2U6OmFkanVzdGZpZWxkKTsgcmV0dXJuIF9fczsgfQotCi1pbmxpbmUgaW9zX2Jhc2UmIF9TVExQX0NBTEwgbGVmdChpb3NfYmFzZSYgX19zKQotICB7IF9fcy5zZXRmKGlvc19iYXNlOjpsZWZ0LCBpb3NfYmFzZTo6YWRqdXN0ZmllbGQpOyByZXR1cm4gX19zOyB9Ci0KLWlubGluZSBpb3NfYmFzZSYgX1NUTFBfQ0FMTCByaWdodChpb3NfYmFzZSYgX19zKQotICB7IF9fcy5zZXRmKGlvc19iYXNlOjpyaWdodCwgaW9zX2Jhc2U6OmFkanVzdGZpZWxkKTsgcmV0dXJuIF9fczsgfQotCi0vLyBiYXNlZmllbGQgbWFuaXB1bGF0b3JzLCBzZWN0aW9uIDI3LjQuNS4zCi1pbmxpbmUgaW9zX2Jhc2UmIF9TVExQX0NBTEwgZGVjKGlvc19iYXNlJiBfX3MpCi0gIHsgX19zLnNldGYoaW9zX2Jhc2U6OmRlYywgaW9zX2Jhc2U6OmJhc2VmaWVsZCk7IHJldHVybiBfX3M7IH0KLQotaW5saW5lIGlvc19iYXNlJiBfU1RMUF9DQUxMIGhleChpb3NfYmFzZSYgX19zKQotICB7IF9fcy5zZXRmKGlvc19iYXNlOjpoZXgsIGlvc19iYXNlOjpiYXNlZmllbGQpOyByZXR1cm4gX19zOyB9Ci0KLWlubGluZSBpb3NfYmFzZSYgX1NUTFBfQ0FMTCBvY3QoaW9zX2Jhc2UmIF9fcykKLSAgeyBfX3Muc2V0Zihpb3NfYmFzZTo6b2N0LCBpb3NfYmFzZTo6YmFzZWZpZWxkKTsgcmV0dXJuIF9fczsgfQotCi0KLS8vIGZsb2F0ZmllbGQgbWFuaXB1bGF0b3JzLCBzZWN0aW9uIDI3LjQuNS4zCi1pbmxpbmUgaW9zX2Jhc2UmIF9TVExQX0NBTEwgZml4ZWQoaW9zX2Jhc2UmIF9fcykKLSAgeyBfX3Muc2V0Zihpb3NfYmFzZTo6Zml4ZWQsIGlvc19iYXNlOjpmbG9hdGZpZWxkKTsgcmV0dXJuIF9fczsgfQotCi1pbmxpbmUgaW9zX2Jhc2UmIF9TVExQX0NBTEwgc2NpZW50aWZpYyhpb3NfYmFzZSYgX19zKQotICB7IF9fcy5zZXRmKGlvc19iYXNlOjpzY2llbnRpZmljLCBpb3NfYmFzZTo6ZmxvYXRmaWVsZCk7IHJldHVybiBfX3M7IH0KLQotX1NUTFBfRU5EX05BTUVTUEFDRQotCi0jZW5kaWYgLyogX1NUTFBfSU9TX0JBU0UgKi8KLQotLy8gTG9jYWwgVmFyaWFibGVzOgotLy8gbW9kZTpDKysKLS8vIEVuZDoKLQpkaWZmIC0tZ2l0IGEvc3RsL19pb3Nmd2QuaCBiL3N0bC9faW9zZndkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0YzY0MzAuLjAwMDAwMDAKLS0tIGEvc3RsL19pb3Nmd2QuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0lPU0ZXRAotI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9JT1NGV0QKLQotI2lmIGRlZmluZWQgKF9fc2dpKSAmJiAhZGVmaW5lZCAoX19HTlVDX18pICYmICFkZWZpbmVkIChfU1RBTkRBUkRfQ19QTFVTX1BMVVMpCi0jICBlcnJvciBUaGlzIGhlYWRlciBmaWxlIHJlcXVpcmVzIHRoZSAtTEFORzpzdGQgb3B0aW9uCi0jZW5kaWYKLQotLy8gVGhpcyBmaWxlIHByb3ZpZGVzIGZvcndhcmQgZGVjbGFyYXRpb25zIG9mIHRoZSBtb3N0IGltcG9ydGFudCBJL08KLS8vIGNsYXNzZXMuICBOb3RlIHRoYXQgYWxtb3N0IGFsbCBvZiB0aG9zZSBjbGFzc2VzIGFyZSBjbGFzcyB0ZW1wbGF0ZXMsCi0vLyB3aXRoIGRlZmF1bHQgdGVtcGxhdGUgYXJndW1lbnRzLiAgQWNjb3JkaW5nIHRvIHRoZSBDKysgc3RhbmRhcmQsCi0vLyBpZiBhIGNsYXNzIHRlbXBsYXRlIGlzIGRlY2xhcmVkIG1vcmUgdGhhbiBvbmNlIGluIHRoZSBzYW1lIHNjb3BlCi0vLyB0aGVuIG9ubHkgb25lIG9mIHRob3NlIGRlY2xhcmF0aW9ucyBtYXkgaGF2ZSBkZWZhdWx0IGFyZ3VtZW50cy4KLQotLy8gPGlvc2Z3ZD4gY29udGFpbnMgdGhlIHNhbWUgZGVjbGFyYXRpb25zIGFzIG90aGVyIGhlYWRlcnMsIGFuZCBpbmNsdWRpbmcKLS8vIGJvdGggPGlvc2Z3ZD4gYW5kIChzYXkpIDxpb3N0cmVhbT4gaXMgcGVybWl0dGVkLiAgVGhpcyBtZWFucyB0aGF0IG9ubHkKLS8vIG9uZSBoZWFkZXIgbWF5IGNvbnRhaW4gdGhvc2UgZGVmYXVsdCB0ZW1wbGF0ZSBhcmd1bWVudHMuCi0KLS8vIEluIHRoaXMgaW1wbGVtZW50YXRpb24sIHRoZSBkZWNsYXJhdGlvbnMgaW4gPGlvc2Z3ZD4gY29udGFpbiBkZWZhdWx0Ci0vLyB0ZW1wbGF0ZSBhcmd1bWVudHMuICBBbGwgb2YgdGhlIG90aGVyIEkvTyBoZWFkZXJzIGluY2x1ZGUgPGlvc2Z3ZD4uCi0KLSNpZm5kZWYgX1NUTFBfQ0hBUl9UUkFJVFNfSAotIyAgaW5jbHVkZSA8c3RsL2NoYXJfdHJhaXRzLmg+Ci0jZW5kaWYKLQotX1NUTFBfQkVHSU5fTkFNRVNQQUNFCi0KLWNsYXNzIGlvc19iYXNlOwotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBfU1RMUF9ERkxfVE1QTF9QQVJBTShfVHJhaXRzICwgY2hhcl90cmFpdHM8X0NoYXJUPikgPgotY2xhc3MgYmFzaWNfaW9zOwotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBfU1RMUF9ERkxfVE1QTF9QQVJBTShfVHJhaXRzICwgY2hhcl90cmFpdHM8X0NoYXJUPikgPgotY2xhc3MgYmFzaWNfc3RyZWFtYnVmOwotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBfU1RMUF9ERkxfVE1QTF9QQVJBTShfVHJhaXRzICwgY2hhcl90cmFpdHM8X0NoYXJUPikgPgotY2xhc3MgYmFzaWNfaXN0cmVhbTsKLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgX1NUTFBfREZMX1RNUExfUEFSQU0oX1RyYWl0cyAsIGNoYXJfdHJhaXRzPF9DaGFyVD4pID4KLWNsYXNzIGJhc2ljX29zdHJlYW07Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIF9TVExQX0RGTF9UTVBMX1BBUkFNKF9UcmFpdHMgLCBjaGFyX3RyYWl0czxfQ2hhclQ+KSA+Ci1jbGFzcyBiYXNpY19pb3N0cmVhbTsKLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgX1NUTFBfREZMX1RNUExfUEFSQU0oIF9UcmFpdHMgLCBjaGFyX3RyYWl0czxfQ2hhclQ+KSwKLSAgICAgICAgICBfU1RMUF9ERkxfVE1QTF9QQVJBTShfQWxsb2NhdG9yICwgYWxsb2NhdG9yPF9DaGFyVD4pID4KLWNsYXNzIGJhc2ljX3N0cmluZ2J1ZjsKLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgX1NUTFBfREZMX1RNUExfUEFSQU0oX1RyYWl0cyAsIGNoYXJfdHJhaXRzPF9DaGFyVD4pLAotICAgICAgICAgIF9TVExQX0RGTF9UTVBMX1BBUkFNKF9BbGxvY2F0b3IgLCBhbGxvY2F0b3I8X0NoYXJUPikgPgotY2xhc3MgYmFzaWNfaXN0cmluZ3N0cmVhbTsKLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgX1NUTFBfREZMX1RNUExfUEFSQU0oX1RyYWl0cyAsIGNoYXJfdHJhaXRzPF9DaGFyVD4pLAotICAgICAgICAgIF9TVExQX0RGTF9UTVBMX1BBUkFNKF9BbGxvY2F0b3IgLCBhbGxvY2F0b3I8X0NoYXJUPikgPgotY2xhc3MgYmFzaWNfb3N0cmluZ3N0cmVhbTsKLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgX1NUTFBfREZMX1RNUExfUEFSQU0oX1RyYWl0cyAsIGNoYXJfdHJhaXRzPF9DaGFyVD4pLAotICAgICAgICAgIF9TVExQX0RGTF9UTVBMX1BBUkFNKF9BbGxvY2F0b3IgLCBhbGxvY2F0b3I8X0NoYXJUPikgPgotY2xhc3MgYmFzaWNfc3RyaW5nc3RyZWFtOwotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBfU1RMUF9ERkxfVE1QTF9QQVJBTShfVHJhaXRzICwgY2hhcl90cmFpdHM8X0NoYXJUPikgPgotY2xhc3MgYmFzaWNfZmlsZWJ1ZjsKLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgX1NUTFBfREZMX1RNUExfUEFSQU0oX1RyYWl0cyAsIGNoYXJfdHJhaXRzPF9DaGFyVD4pID4KLWNsYXNzIGJhc2ljX2lmc3RyZWFtOwotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBfU1RMUF9ERkxfVE1QTF9QQVJBTShfVHJhaXRzICwgY2hhcl90cmFpdHM8X0NoYXJUPikgPgotY2xhc3MgYmFzaWNfb2ZzdHJlYW07Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIF9TVExQX0RGTF9UTVBMX1BBUkFNKF9UcmFpdHMgLCBjaGFyX3RyYWl0czxfQ2hhclQ+KSA+Ci1jbGFzcyBiYXNpY19mc3RyZWFtOwotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBfU1RMUF9ERkxfVE1QTF9QQVJBTShfVHJhaXRzICwgY2hhcl90cmFpdHM8X0NoYXJUPikgPgotY2xhc3MgaXN0cmVhbWJ1Zl9pdGVyYXRvcjsKLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgX1NUTFBfREZMX1RNUExfUEFSQU0oX1RyYWl0cyAsIGNoYXJfdHJhaXRzPF9DaGFyVD4pID4KLWNsYXNzIG9zdHJlYW1idWZfaXRlcmF0b3I7Ci0KLXR5cGVkZWYgYmFzaWNfaW9zPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4gICAgaW9zOwotCi0jaWYgIWRlZmluZWQgKF9TVExQX05PX1dDSEFSX1QpCi10eXBlZGVmIGJhc2ljX2lvczx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+IHdpb3M7Ci0jZW5kaWYKLQotLy8gRm9yd2FyZCBkZWNsYXJhdGlvbiBvZiBjbGFzcyBsb2NhbGUsIGFuZCBvZiB0aGUgbW9zdCBpbXBvcnRhbnQgZmFjZXRzLgotY2xhc3MgbG9jYWxlOwotI2lmIGRlZmluZWQgKF9TVExQX05PX0VYUExJQ0lUX0ZVTkNUSU9OX1RNUExfQVJHUykKLXRlbXBsYXRlIDxjbGFzcyBfRmFjZXQ+Ci1zdHJ1Y3QgX1VzZV9mYWNldCB7Ci0gIGNvbnN0IGxvY2FsZSYgX19sb2M7Ci0gIF9Vc2VfZmFjZXQoY29uc3QgbG9jYWxlJiBfX3BfbG9jKSA6IF9fbG9jKF9fcF9sb2MpIHt9Ci0gIGlubGluZSBjb25zdCBfRmFjZXQmIG9wZXJhdG9yICooKSBjb25zdDsKLX07Ci0jICBkZWZpbmUgdXNlX2ZhY2V0ICpfVXNlX2ZhY2V0Ci0jZWxzZQotdGVtcGxhdGUgPGNsYXNzIF9GYWNldD4gaW5saW5lIGNvbnN0IF9GYWNldCYgdXNlX2ZhY2V0KGNvbnN0IGxvY2FsZSYpOwotI2VuZGlmCi0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+IGNsYXNzIGN0eXBlOwotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4gY2xhc3MgY3R5cGVfYnluYW1lOwotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4gY2xhc3MgY29sbGF0ZTsKLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+IGNsYXNzIGNvbGxhdGVfYnluYW1lOwotCi1fU1RMUF9URU1QTEFURV9OVUxMIGNsYXNzIGN0eXBlPGNoYXI+OwotX1NUTFBfVEVNUExBVEVfTlVMTCBjbGFzcyBjdHlwZV9ieW5hbWU8Y2hhcj47Ci1fU1RMUF9URU1QTEFURV9OVUxMIGNsYXNzIGNvbGxhdGU8Y2hhcj47Ci1fU1RMUF9URU1QTEFURV9OVUxMIGNsYXNzIGNvbGxhdGVfYnluYW1lPGNoYXI+OwotCi0jaWYgIWRlZmluZWQgKF9TVExQX05PX1dDSEFSX1QpCi1fU1RMUF9URU1QTEFURV9OVUxMIGNsYXNzIGN0eXBlPHdjaGFyX3Q+OwotX1NUTFBfVEVNUExBVEVfTlVMTCBjbGFzcyBjdHlwZV9ieW5hbWU8d2NoYXJfdD47Ci1fU1RMUF9URU1QTEFURV9OVUxMIGNsYXNzIGNvbGxhdGU8d2NoYXJfdD47Ci1fU1RMUF9URU1QTEFURV9OVUxMIGNsYXNzIGNvbGxhdGVfYnluYW1lPHdjaGFyX3Q+OwotI2VuZGlmCi0KLSNpZiAhKGRlZmluZWQgKF9fU1VOUFJPX0NDKSAmJiBfX1NVTlBST19DQyA8IDB4NTAwICkKLS8vIFR5cGVkZWZzIGZvciBvcmRpbmFyeSAobmFycm93LWNoYXJhY3Rlcikgc3RyZWFtcy4KLS8vX1NUTFBfVEVNUExBVEVfTlVMTCBjbGFzcyBiYXNpY19zdHJlYW1idWY8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPjsKLSNlbmRpZgotCi10eXBlZGVmIGJhc2ljX2lzdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiAgaXN0cmVhbTsKLXR5cGVkZWYgYmFzaWNfb3N0cmVhbTxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+ICBvc3RyZWFtOwotdHlwZWRlZiBiYXNpY19pb3N0cmVhbTxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+IGlvc3RyZWFtOwotdHlwZWRlZiBiYXNpY19zdHJlYW1idWY8Y2hhcixjaGFyX3RyYWl0czxjaGFyPiA+IHN0cmVhbWJ1ZjsKLQotdHlwZWRlZiBiYXNpY19zdHJpbmdidWY8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4sIGFsbG9jYXRvcjxjaGFyPiA+ICAgICBzdHJpbmdidWY7Ci10eXBlZGVmIGJhc2ljX2lzdHJpbmdzdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4sIGFsbG9jYXRvcjxjaGFyPiA+IGlzdHJpbmdzdHJlYW07Ci10eXBlZGVmIGJhc2ljX29zdHJpbmdzdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4sIGFsbG9jYXRvcjxjaGFyPiA+IG9zdHJpbmdzdHJlYW07Ci10eXBlZGVmIGJhc2ljX3N0cmluZ3N0cmVhbTxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiwgYWxsb2NhdG9yPGNoYXI+ID4gIHN0cmluZ3N0cmVhbTsKLQotdHlwZWRlZiBiYXNpY19maWxlYnVmPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4gIGZpbGVidWY7Ci10eXBlZGVmIGJhc2ljX2lmc3RyZWFtPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4gaWZzdHJlYW07Ci10eXBlZGVmIGJhc2ljX29mc3RyZWFtPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4gb2ZzdHJlYW07Ci10eXBlZGVmIGJhc2ljX2ZzdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiAgZnN0cmVhbTsKLQotI2lmICFkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQotLy8gVHlwZWRlZnMgZm9yIHdpZGUtY2hhcmFjdGVyIHN0cmVhbXMuCi10eXBlZGVmIGJhc2ljX3N0cmVhbWJ1Zjx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+IHdzdHJlYW1idWY7Ci10eXBlZGVmIGJhc2ljX2lzdHJlYW08d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPiAgIHdpc3RyZWFtOwotdHlwZWRlZiBiYXNpY19vc3RyZWFtPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4gICB3b3N0cmVhbTsKLXR5cGVkZWYgYmFzaWNfaW9zdHJlYW08d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPiAgd2lvc3RyZWFtOwotCi10eXBlZGVmIGJhc2ljX3N0cmluZ2J1Zjx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiwgYWxsb2NhdG9yPHdjaGFyX3Q+ID4gICAgIHdzdHJpbmdidWY7Ci10eXBlZGVmIGJhc2ljX2lzdHJpbmdzdHJlYW08d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4sIGFsbG9jYXRvcjx3Y2hhcl90PiA+IHdpc3RyaW5nc3RyZWFtOwotdHlwZWRlZiBiYXNpY19vc3RyaW5nc3RyZWFtPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+LCBhbGxvY2F0b3I8d2NoYXJfdD4gPiB3b3N0cmluZ3N0cmVhbTsKLXR5cGVkZWYgYmFzaWNfc3RyaW5nc3RyZWFtPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+LCBhbGxvY2F0b3I8d2NoYXJfdD4gPiAgd3N0cmluZ3N0cmVhbTsKLQotdHlwZWRlZiBiYXNpY19maWxlYnVmPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4gIHdmaWxlYnVmOwotdHlwZWRlZiBiYXNpY19pZnN0cmVhbTx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+IHdpZnN0cmVhbTsKLXR5cGVkZWYgYmFzaWNfb2ZzdHJlYW08d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPiB3b2ZzdHJlYW07Ci10eXBlZGVmIGJhc2ljX2ZzdHJlYW08d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPiAgd2ZzdHJlYW07Ci0jZW5kaWYKLQotX1NUTFBfRU5EX05BTUVTUEFDRQotCi0jZW5kaWYKLQotLy8gTG9jYWwgVmFyaWFibGVzOgotLy8gbW9kZTpDKysKLS8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9faXN0cmVhbS5jIGIvc3RsL19pc3RyZWFtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MmNhYjEuLjAwMDAwMDAKLS0tIGEvc3RsL19pc3RyZWFtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDI5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogQm9yaXMgRm9taXRjaGV2Ci0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICovCi0jaWZuZGVmIF9TVExQX0lTVFJFQU1fQwotI2RlZmluZSBfU1RMUF9JU1RSRUFNX0MKLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9JU1RSRUFNCi0jICBpbmNsdWRlIDxzdGwvX2lzdHJlYW0uaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0xJTUlUUwotIyAgaW5jbHVkZSA8c3RsL19saW1pdHMuaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX05VTV9HRVRfSAotIyAgaW5jbHVkZSA8c3RsL19udW1fZ2V0Lmg+Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKCBfU1RMUF9ORVNURURfVFlQRV9QQVJBTV9CVUcgKQotLy8gbm8gd2NoYXJfdCBpcyBzdXBwb3J0ZWQgZm9yIHRoaXMgbW9kZQotIyAgZGVmaW5lIF9fQklTX2ludF90eXBlX18gaW50Ci0jICBkZWZpbmUgX19CSVNfcG9zX3R5cGVfXyBzdHJlYW1wb3MKLSMgIGRlZmluZSBfX0JJU19vZmZfdHlwZV9fIHN0cmVhbW9mZgotI2Vsc2UKLSMgIGRlZmluZSBfX0JJU19pbnRfdHlwZV9fIF9TVExQX1RZUEVOQU1FX09OX1JFVFVSTl9UWVBFIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6aW50X3R5cGUKLSMgIGRlZmluZSBfX0JJU19wb3NfdHlwZV9fIF9TVExQX1RZUEVOQU1FX09OX1JFVFVSTl9UWVBFIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6cG9zX3R5cGUKLSMgIGRlZmluZSBfX0JJU19vZmZfdHlwZV9fIF9TVExQX1RZUEVOQU1FX09OX1JFVFVSTl9UWVBFIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6b2ZmX3R5cGUKLSNlbmRpZgotCi1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBGdW5jdGlvbiBvYmplY3Qgc3RydWN0cyB1c2VkIGJ5IHNvbWUgbWVtYmVyIGZ1bmN0aW9ucy4KLQotX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RyYWl0cz4KLXN0cnVjdCBfSXNfbm90X3dzcGFjZSB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6Y2hhcl90eXBlIGFyZ3VtZW50X3R5cGU7Ci0gIHR5cGVkZWYgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdF90eXBlOwotCi0gIGNvbnN0IGN0eXBlPGFyZ3VtZW50X3R5cGU+KiBfTV9jdHlwZTsKLQotICBfSXNfbm90X3dzcGFjZShjb25zdCBjdHlwZTxhcmd1bWVudF90eXBlPiogX19jX3R5cGUpIDogX01fY3R5cGUoX19jX3R5cGUpIHt9Ci0gIGJvb2wgb3BlcmF0b3IoKShhcmd1bWVudF90eXBlIF9fYykgY29uc3QKLSAgICB7IHJldHVybiAhX01fY3R5cGUtPmlzKGN0eXBlX2Jhc2U6OnNwYWNlLCBfX2MpOyB9Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RyYWl0cz4KLXN0cnVjdCBfSXNfd3NwYWNlX251bGwgewotICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmNoYXJfdHlwZSBhcmd1bWVudF90eXBlOwotICB0eXBlZGVmIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfdHlwZTsKLQotICBjb25zdCBjdHlwZTxhcmd1bWVudF90eXBlPiogX01fY3R5cGU7Ci0KLSAgX0lzX3dzcGFjZV9udWxsKGNvbnN0IGN0eXBlPGFyZ3VtZW50X3R5cGU+KiBfX2NfdHlwZSkgOiBfTV9jdHlwZShfX2NfdHlwZSkge30KLSAgYm9vbCBvcGVyYXRvcigpKGFyZ3VtZW50X3R5cGUgX19jKSBjb25zdCB7Ci0gICAgcmV0dXJuIF9UcmFpdHM6OmVxKF9fYywgYXJndW1lbnRfdHlwZSgpKSB8fAotICAgICAgICAgICBfTV9jdHlwZS0+aXMoY3R5cGVfYmFzZTo6c3BhY2UsIF9fYyk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHJhaXRzPgotc3RydWN0IF9TY2FuX2Zvcl93c3BhY2UgewotICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmNoYXJfdHlwZSAgY2hhcl90eXBlOwotICB0eXBlZGVmIGNoYXJfdHlwZSogICAgICAgICAgICAgICAgICAgZmlyc3RfYXJndW1lbnRfdHlwZTsKLSAgdHlwZWRlZiBjaGFyX3R5cGUqICAgICAgICAgICAgICAgICAgIHNlY29uZF9hcmd1bWVudF90eXBlOwotICB0eXBlZGVmIGNoYXJfdHlwZSogICAgICAgICAgICAgICAgICAgcmVzdWx0X3R5cGU7Ci0KLSAgY29uc3QgY3R5cGU8Y2hhcl90eXBlPiogX01fY3R5cGU7Ci0KLSAgX1NjYW5fZm9yX3dzcGFjZShjb25zdCBjdHlwZTxjaGFyX3R5cGU+KiBfX2N0eXBlKSA6IF9NX2N0eXBlKF9fY3R5cGUpIHt9Ci0gIGNvbnN0IGNoYXJfdHlwZSoKLSAgb3BlcmF0b3IoKShjb25zdCBjaGFyX3R5cGUqIF9fZmlyc3QsIGNvbnN0IGNoYXJfdHlwZSogX19sYXN0KSBjb25zdCB7Ci0gICAgcmV0dXJuIF9NX2N0eXBlLT5zY2FuX2lzKGN0eXBlX2Jhc2U6OnNwYWNlLCBfX2ZpcnN0LCBfX2xhc3QpOwotICB9Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RyYWl0cz4KLXN0cnVjdCBfU2Nhbl93c3BhY2VfbnVsbCB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6Y2hhcl90eXBlICBjaGFyX3R5cGU7Ci0gIHR5cGVkZWYgY2hhcl90eXBlKiAgICAgICAgICAgICAgICAgICBmaXJzdF9hcmd1bWVudF90eXBlOwotICB0eXBlZGVmIGNoYXJfdHlwZSogICAgICAgICAgICAgICAgICAgc2Vjb25kX2FyZ3VtZW50X3R5cGU7Ci0gIHR5cGVkZWYgY2hhcl90eXBlKiAgICAgICAgICAgICAgICAgICByZXN1bHRfdHlwZTsKLQotICBjb25zdCBjdHlwZTxjaGFyX3R5cGU+KiBfTV9jdHlwZTsKLQotICBfU2Nhbl93c3BhY2VfbnVsbChjb25zdCBjdHlwZTxjaGFyX3R5cGU+KiBfX2NfdHlwZSkgOiBfTV9jdHlwZShfX2NfdHlwZSkge30KLSAgY29uc3QgY2hhcl90eXBlKgotICBvcGVyYXRvcigpKGNvbnN0IGNoYXJfdHlwZSogX19maXJzdCwgY29uc3QgY2hhcl90eXBlKiBfX2xhc3QpIGNvbnN0IHsKLSAgICBfX2xhc3QgPSBmaW5kX2lmKF9fZmlyc3QsIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgIF9FcV9jaGFyX2JvdW5kPF9UcmFpdHM+KGNoYXJfdHlwZSgpKSk7Ci0gICAgcmV0dXJuIF9NX2N0eXBlLT5zY2FuX2lzKGN0eXBlX2Jhc2U6OnNwYWNlLCBfX2ZpcnN0LCBfX2xhc3QpOwotICB9Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RyYWl0cz4KLXN0cnVjdCBfU2Nhbl9mb3Jfbm90X3dzcGFjZSB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6Y2hhcl90eXBlICBjaGFyX3R5cGU7Ci0gIHR5cGVkZWYgY2hhcl90eXBlKiAgICAgICAgICAgICAgICAgICBmaXJzdF9hcmd1bWVudF90eXBlOwotICB0eXBlZGVmIGNoYXJfdHlwZSogICAgICAgICAgICAgICAgICAgc2Vjb25kX2FyZ3VtZW50X3R5cGU7Ci0gIHR5cGVkZWYgY2hhcl90eXBlKiAgICAgICAgICAgICAgICAgICByZXN1bHRfdHlwZTsKLQotICBjb25zdCBjdHlwZTxjaGFyX3R5cGU+KiBfTV9jdHlwZTsKLQotICBfU2Nhbl9mb3Jfbm90X3dzcGFjZShjb25zdCBjdHlwZTxjaGFyX3R5cGU+KiBfX2NfdHlwZSkgOiBfTV9jdHlwZShfX2NfdHlwZSkge30KLSAgY29uc3QgY2hhcl90eXBlKgotICBvcGVyYXRvcigpKGNvbnN0IGNoYXJfdHlwZSogX19maXJzdCwgY29uc3QgY2hhcl90eXBlKiBfX2xhc3QpIGNvbnN0IHsKLSAgICByZXR1cm4gX01fY3R5cGUtPnNjYW5fbm90KGN0eXBlX2Jhc2U6OnNwYWNlLCBfX2ZpcnN0LCBfX2xhc3QpOwotICB9Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RyYWl0cz4KLXN0cnVjdCBfU2Nhbl9mb3JfY2hhcl92YWwgewotICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmNoYXJfdHlwZSBjaGFyX3R5cGU7Ci0gIHR5cGVkZWYgY2hhcl90eXBlKiAgICAgICAgICAgICAgICAgIGZpcnN0X2FyZ3VtZW50X3R5cGU7Ci0gIHR5cGVkZWYgY2hhcl90eXBlKiAgICAgICAgICAgICAgICAgIHNlY29uZF9hcmd1bWVudF90eXBlOwotICB0eXBlZGVmIGNoYXJfdHlwZSogICAgICAgICAgICAgICAgICByZXN1bHRfdHlwZTsKLQotICBjaGFyX3R5cGUgX01fdmFsOwotCi0gIF9TY2FuX2Zvcl9jaGFyX3ZhbChjaGFyX3R5cGUgX192YWwpIDogX01fdmFsKF9fdmFsKSB7fQotCi0gIGNvbnN0IGNoYXJfdHlwZSoKLSAgb3BlcmF0b3IoKShjb25zdCBjaGFyX3R5cGUqIF9fZmlyc3QsIGNvbnN0IGNoYXJfdHlwZSogX19sYXN0KSBjb25zdCB7Ci0gICAgcmV0dXJuIGZpbmRfaWYoX19maXJzdCwgX19sYXN0LCBfRXFfY2hhcl9ib3VuZDxfVHJhaXRzPihfTV92YWwpKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIF9UcmFpdHM+Ci1zdHJ1Y3QgX1NjYW5fZm9yX2ludF92YWwgewotICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmNoYXJfdHlwZSBjaGFyX3R5cGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6aW50X3R5cGUgIGludF90eXBlOwotICB0eXBlZGVmIGNoYXJfdHlwZSogICAgICAgICAgICAgICAgICBmaXJzdF9hcmd1bWVudF90eXBlOwotICB0eXBlZGVmIGNoYXJfdHlwZSogICAgICAgICAgICAgICAgICBzZWNvbmRfYXJndW1lbnRfdHlwZTsKLSAgdHlwZWRlZiBjaGFyX3R5cGUqICAgICAgICAgICAgICAgICAgcmVzdWx0X3R5cGU7Ci0KLSAgaW50X3R5cGUgX01fdmFsOwotCi0gIF9TY2FuX2Zvcl9pbnRfdmFsKGludF90eXBlIF9fdmFsKSA6IF9NX3ZhbChfX3ZhbCkge30KLQotICBjb25zdCBjaGFyX3R5cGUqCi0gIG9wZXJhdG9yKCkoY29uc3QgY2hhcl90eXBlKiBfX2ZpcnN0LCBjb25zdCBjaGFyX3R5cGUqIF9fbGFzdCkgY29uc3QgewotICAgIHJldHVybiBmaW5kX2lmKF9fZmlyc3QsIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICBfRXFfaW50X2JvdW5kPF9UcmFpdHM+KF9NX3ZhbCkpOwotICB9Ci19OwotCi0vLyBIZWxwZXIgZnVuY3Rpb246IHRyeSB0byBwdXNoIGJhY2sgYSBjaGFyYWN0ZXIgdG8gYSBzdHJlYW1idWYsCi0vLyByZXR1cm4gdHJ1ZSBpZiB0aGUgcHVzaGJhY2sgc3VjY2VlZGVkLiAgRG9lcyBub3QgdGhyb3cuCi0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Ci1ib29sIF9TVExQX0NBTEwKLV9fcHVzaGJhY2soYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fYnVmLCBfQ2hhclQgX19jKSB7Ci0gIGJvb2wgcmV0OwotICBfU1RMUF9UUlkgewotICAgIGNvbnN0IHR5cGVuYW1lIF9UcmFpdHM6OmludF90eXBlIF9fZW9mID0gX1RyYWl0czo6ZW9mKCk7Ci0gICAgcmV0ID0gIV9UcmFpdHM6OmVxX2ludF90eXBlKF9fYnVmLT5zcHV0YmFja2MoX19jKSwgX19lb2YpOwotICB9Ci0gIF9TVExQX0NBVENIX0FMTCB7Ci0gICAgcmV0ID0gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHJldDsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBEZWZpbml0aW9ucyBvZiBiYXNpY19pc3RyZWFtPD4ncyBub25pbmxpbmUgbWVtYmVyIGZ1bmN0aW9ucy4KLQotLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBmb3JtYXR0ZWQgaW5wdXQgb2YgbnVtYmVycy4KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9OdW1iZXI+Ci1pb3NfYmFzZTo6aW9zdGF0ZSBfU1RMUF9DQUxMCi1fX2dldF9udW0oYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX3RoYXQsIF9OdW1iZXImIF9fdmFsKSB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpzZW50cnkgX1NlbnRyeTsKLSAgaW9zX2Jhc2U6Omlvc3RhdGUgX19lcnIgPSAwOwotICBfU2VudHJ5IF9fc2VudHJ5KCBfX3RoYXQgKTsgICAgIC8vIFNraXAgd2hpdGVzcGFjZS4KLSAgaWYgKF9fc2VudHJ5KSB7Ci0gICAgdHlwZWRlZiBudW1fZ2V0PF9DaGFyVCwgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQsIF9UcmFpdHM+ID4gX051bV9nZXQ7Ci0gICAgX1NUTFBfVFJZIHsKLSAgICAgICgoY29uc3QgX051bV9nZXQmKXVzZV9mYWNldDxfTnVtX2dldD4oX190aGF0LmdldGxvYygpKSkuZ2V0KGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJULCBfVHJhaXRzPihfX3RoYXQucmRidWYoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBfX3RoYXQsIF9fZXJyLCBfX3ZhbCk7Ci0gICAgfQotICAgIF9TVExQX0NBVENIX0FMTCB7Ci0gICAgICBfX3RoYXQuX01faGFuZGxlX2V4Y2VwdGlvbihpb3NfYmFzZTo6YmFkYml0KTsKLSAgICB9Ci0gICAgaWYgKF9fZXJyKSBfX3RoYXQuc2V0c3RhdGUoX19lcnIpOwotICB9Ci0gIHJldHVybiBfX2VycjsKLX0KLQotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Ci1iYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6b3BlcmF0b3I+PiAoc2hvcnQmIF9fdmFsKSB7Ci0gIGxvbmcgX19sdmFsOwotICBfU1RMUF9QUklWIF9fZ2V0X251bSgqdGhpcywgX19sdmFsKTsKLSAgaWYgKCB0aGlzLT5mYWlsKCkgKSB7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIHNob3J0IF9fdG1wID0gX19TVEFUSUNfQ0FTVChzaG9ydCwgX19sdmFsKTsKLSAgdW5zaWduZWQgc2hvcnQgX191dmFsID0gX19TVEFUSUNfQ0FTVCh1bnNpZ25lZCBzaG9ydCwgX19sdmFsKTsKLSAgLy8gY2hlY2sgaWYgd2UgbG9zZSBkaWdpdHMKLSAgLy8gICAgaWYgKChfX3ZhbCAhPSBfX2x2YWwpICYmICgodW5zaWduZWQgc2hvcnQpX192YWwgIT0gX19sdmFsKSkKLSAgaWYgKChfX3RtcCAhPSBfX2x2YWwpICYmICgobG9uZylfX3V2YWwgIT0gX19sdmFsKSkKLSAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7Ci0gIGVsc2UKLSAgICBfX3ZhbCA9IF9fdG1wOwotICByZXR1cm4gKnRoaXM7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Ci1iYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6b3BlcmF0b3I+PiAoaW50JiBfX3ZhbCkgewotICBsb25nIF9fbHZhbDsKLSAgX1NUTFBfUFJJViBfX2dldF9udW0oKnRoaXMsIF9fbHZhbCk7Ci0gIGlmICggdGhpcy0+ZmFpbCgpICkgewotICAgIHJldHVybiAqdGhpczsKLSAgfQotICBpbnQgX190bXAgPSBfX2x2YWw7Ci0gIHVuc2lnbmVkIGludCBfX3V2YWwgPSBfX2x2YWw7Ci0gIC8vIGNoZWNrIGlmIHdlIGxvc2UgZGlnaXRzCi0gIC8vICAgIGlmICgoX192YWwgIT0gX19sdmFsKSAmJiAoKHVuc2lnbmVkIGludClfX3ZhbCAhPSBfX2x2YWwpKQotICBpZiAoKF9fdG1wICE9IF9fbHZhbCkgJiYgKChsb25nKV9fdXZhbCAhPSBfX2x2YWwpKQotICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKLSAgZWxzZQotICAgIF9fdmFsID0gX190bXA7Ci0gIHJldHVybiAqdGhpczsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KLWJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpvcGVyYXRvcj4+ICh1bnNpZ25lZCBzaG9ydCYgX192YWwpIHsKLSAgX1NUTFBfUFJJViBfX2dldF9udW0oKnRoaXMsIF9fdmFsKTsKLSAgcmV0dXJuICp0aGlzOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Om9wZXJhdG9yPj4gKHVuc2lnbmVkIGludCYgX192YWwpIHsKLSAgX1NUTFBfUFJJViBfX2dldF9udW0oKnRoaXMsIF9fdmFsKTsKLSAgcmV0dXJuICp0aGlzOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Om9wZXJhdG9yPj4gKGxvbmcmIF9fdmFsKSB7Ci0gIF9TVExQX1BSSVYgX19nZXRfbnVtKCp0aGlzLCBfX3ZhbCk7Ci0gIHJldHVybiAqdGhpczsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KLWJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpvcGVyYXRvcj4+ICh1bnNpZ25lZCBsb25nJiBfX3ZhbCkgewotICBfU1RMUF9QUklWIF9fZ2V0X251bSgqdGhpcywgX192YWwpOwotICByZXR1cm4gKnRoaXM7Ci19Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9MT05HX0xPTkcpCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Om9wZXJhdG9yPj4gKF9TVExQX0xPTkdfTE9ORyYgX192YWwpIHsKLSAgX1NUTFBfUFJJViBfX2dldF9udW0oKnRoaXMsIF9fdmFsKTsKLSAgcmV0dXJuICp0aGlzOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Om9wZXJhdG9yPj4gKHVuc2lnbmVkIF9TVExQX0xPTkdfTE9ORyYgX192YWwpIHsKLSAgX1NUTFBfUFJJViBfX2dldF9udW0oKnRoaXMsIF9fdmFsKTsKLSAgcmV0dXJuICp0aGlzOwotfQotI2VuZGlmCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Om9wZXJhdG9yPj4gKGZsb2F0JiBfX3ZhbCkgewotICBfU1RMUF9QUklWIF9fZ2V0X251bSgqdGhpcywgX192YWwpOwotICByZXR1cm4gKnRoaXM7Ci19Ci10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Om9wZXJhdG9yPj4gKGRvdWJsZSYgX192YWwpIHsKLSAgX1NUTFBfUFJJViBfX2dldF9udW0oKnRoaXMsIF9fdmFsKTsKLSAgcmV0dXJuICp0aGlzOwotfQotI2lmICFkZWZpbmVkIChfU1RMUF9OT19MT05HX0RPVUJMRSkKLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Ci1iYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6b3BlcmF0b3I+PiAobG9uZyBkb3VibGUmIF9fdmFsKSB7Ci0gIF9TVExQX1BSSVYgX19nZXRfbnVtKCp0aGlzLCBfX3ZhbCk7Ci0gIHJldHVybiAqdGhpczsKLX0KLSNlbmRpZgotI2lmICFkZWZpbmVkIChfU1RMUF9OT19CT09MKQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KLWJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpvcGVyYXRvcj4+IChib29sJiBfX3ZhbCkgewotICBfU1RMUF9QUklWIF9fZ2V0X251bSgqdGhpcywgX192YWwpOwotICByZXR1cm4gKnRoaXM7Ci19Ci0jZW5kaWYKLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KLWJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpvcGVyYXRvcj4+ICh2b2lkKiYgX192YWwpIHsKLSAgX1NUTFBfUFJJViBfX2dldF9udW0oKnRoaXMsIF9fdmFsKTsKLSAgcmV0dXJuICp0aGlzOwotfQotCi0vLyBVbmZvcm1hdHRlZCBpbnB1dAotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotX19CSVNfaW50X3R5cGVfXwotYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpwZWVrKCkgewotICB0eXBlbmFtZSBfVHJhaXRzOjppbnRfdHlwZSBfX3RtcCA9IF9UcmFpdHM6OmVvZigpOwotCi0gIHRoaXMtPl9NX2djb3VudCA9IDA7Ci0gIHNlbnRyeSBfX3NlbnRyeSgqdGhpcywgX05vX1NraXBfV1MoKSk7Ci0KLSAgaWYgKF9fc2VudHJ5KSB7Ci0gICAgX1NUTFBfVFJZIHsKLSAgICAgIF9fdG1wID0gdGhpcy0+cmRidWYoKS0+c2dldGMoKTsKLSAgICB9Ci0gICAgX1NUTFBfQ0FUQ0hfQUxMIHsKLSAgICAgIHRoaXMtPl9NX2hhbmRsZV9leGNlcHRpb24oaW9zX2Jhc2U6OmJhZGJpdCk7Ci0gICAgfQotICAgIGlmICh0aGlzLT5fU19lb2YoX190bXApKQotICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmVvZmJpdCk7Ci0gIH0KLQotICByZXR1cm4gX190bXA7Ci19Ci0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KLV9fQklTX2ludF90eXBlX18KLWJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6Z2V0KCkgewotICB0eXBlbmFtZSBfVHJhaXRzOjppbnRfdHlwZSBfX3RtcCA9IF9UcmFpdHM6OmVvZigpOwotICBzZW50cnkgX19zZW50cnkoKnRoaXMsIF9Ob19Ta2lwX1dTKCkpOwotICB0aGlzLT5fTV9nY291bnQgPSAwOwotCi0gIGlmIChfX3NlbnRyeSkgewotICAgIF9TVExQX1RSWSB7Ci0gICAgICBfX3RtcCA9IHRoaXMtPnJkYnVmKCktPnNidW1wYygpOwotICAgIH0KLSAgICBfU1RMUF9DQVRDSF9BTEwgewotICAgICAgdGhpcy0+X01faGFuZGxlX2V4Y2VwdGlvbihpb3NfYmFzZTo6YmFkYml0KTsKLSAgICB9Ci0KLSAgICBpZiAoIXRoaXMtPl9TX2VvZihfX3RtcCkpCi0gICAgICB0aGlzLT5fTV9nY291bnQgPSAxOwotICB9Ci0KLSAgaWYgKF9NX2djb3VudCA9PSAwKQotICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjplb2ZiaXQgfCBpb3NfYmFzZTo6ZmFpbGJpdCk7Ci0KLSAgcmV0dXJuIF9fdG1wOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgotYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpnZXQoX0NoYXJUJiBfX2MpIHsKLSAgc2VudHJ5IF9fc2VudHJ5KCp0aGlzLCBfTm9fU2tpcF9XUygpKTsKLSAgdGhpcy0+X01fZ2NvdW50ID0gMDsKLQotICBpZiAoX19zZW50cnkpIHsKLSAgICB0eXBlbmFtZSBfVHJhaXRzOjppbnRfdHlwZSBfX3RtcCA9IF9UcmFpdHM6OmVvZigpOwotICAgIF9TVExQX1RSWSB7Ci0gICAgICBfX3RtcCA9IHRoaXMtPnJkYnVmKCktPnNidW1wYygpOwotICAgIH0KLSAgICBfU1RMUF9DQVRDSF9BTEwgewotICAgICAgdGhpcy0+X01faGFuZGxlX2V4Y2VwdGlvbihpb3NfYmFzZTo6YmFkYml0KTsKLSAgICB9Ci0KLSAgICBpZiAoIXRoaXMtPl9TX2VvZihfX3RtcCkpIHsKLSAgICAgIHRoaXMtPl9NX2djb3VudCA9IDE7Ci0gICAgICBfX2MgPSBfVHJhaXRzOjp0b19jaGFyX3R5cGUoX190bXApOwotICAgIH0KLSAgfQotCi0gIGlmICh0aGlzLT5fTV9nY291bnQgPT0gMCkKLSAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZW9mYml0IHwgaW9zX2Jhc2U6OmZhaWxiaXQpOwotCi0gIHJldHVybiAqdGhpczsKLX0KLQotCi0vLyBSZWFkIGNoYXJhY3RlcnMgYW5kIGRpc2NhcmQgdGhlbS4gIFRoZSBzdGFuZGFyZCBzcGVjaWZpZXMgYSBzaW5nbGUKLS8vIGZ1bmN0aW9uIHdpdGggdHdvIGFyZ3VtZW50cywgZWFjaCB3aXRoIGEgZGVmYXVsdC4gIFdlIGluc3RlYWQgdXNlCi0vLyB0aHJlZSBvdmVybG9kZWQgZnVuY3Rpb25zLCBiZWNhdXNlIGl0J3MgcG9zc2libGUgdG8gaW1wbGVtZW50IHRoZQotLy8gZmlyc3QgdHdvIG1vcmUgZWZmaWNpZW50bHkgdGhhbiB0aGUgZnVsbHkgZ2VuZXJhbCB0aGlyZCB2ZXJzaW9uLgotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KLWJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjppZ25vcmUoKSB7Ci0gIHNlbnRyeSBfX3NlbnRyeSgqdGhpcywgX05vX1NraXBfV1MoKSk7Ci0gIHRoaXMtPl9NX2djb3VudCA9IDA7Ci0KLSAgaWYgKF9fc2VudHJ5KSB7Ci0gICAgaW50X3R5cGUgX19jOwotICAgIF9TVExQX1RSWSB7Ci0gICAgICBfX2MgPSB0aGlzLT5yZGJ1ZigpLT5zYnVtcGMoKTsKLSAgICB9Ci0gICAgX1NUTFBfQ0FUQ0hfQUxMIHsKLSAgICAgIHRoaXMtPl9NX2hhbmRsZV9leGNlcHRpb24oaW9zX2Jhc2U6OmJhZGJpdCk7Ci0gICAgICByZXR1cm4gKnRoaXM7Ci0gICAgfQotCi0gICAgaWYgKCF0aGlzLT5fU19lb2YoX19jKSkKLSAgICAgIHRoaXMtPl9NX2djb3VudCA9IDE7Ci0gICAgZWxzZQotICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmVvZmJpdCk7Ci0gIH0KLQotICByZXR1cm4gKnRoaXM7Ci19Ci0KLS8vIFB1dGJhY2sKLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KLWJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKLWJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6cHV0YmFjayhfQ2hhclQgX19jKSB7Ci0gIHRoaXMtPl9NX2djb3VudCA9IDA7Ci0gIHNlbnRyeSBfX3NlbnRyeSgqdGhpcywgX05vX1NraXBfV1MoKSk7Ci0KLSAgaWYgKF9fc2VudHJ5KSB7Ci0gICAgdHlwZW5hbWUgX1RyYWl0czo6aW50X3R5cGUgX190bXAgPSBfVHJhaXRzOjplb2YoKTsKLSAgICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19idWYgPSB0aGlzLT5yZGJ1ZigpOwotLy8gICAgaWYgKCFfX2J1ZiB8fCB0aGlzLT5fU19lb2YoX19idWYtPnNwdXRiYWNrYyhfX2MpKSkKLSAgICBpZiAoX19idWYpIHsKLSAgICAgIF9TVExQX1RSWSB7Ci0gICAgICAgIF9fdG1wID0gX19idWYtPnNwdXRiYWNrYyhfX2MpOwotICAgICAgfQotICAgICAgX1NUTFBfQ0FUQ0hfQUxMIHsKLSAgICAgICAgdGhpcy0+X01faGFuZGxlX2V4Y2VwdGlvbihpb3NfYmFzZTo6YmFkYml0KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHRoaXMtPl9TX2VvZihfX3RtcCkpCi0gICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKLSAgfQotICBlbHNlCi0gICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOwotCi0gIHJldHVybiAqdGhpczsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KLWJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Ojp1bmdldCgpIHsKLSAgdGhpcy0+X01fZ2NvdW50ID0gMDsKLQotICBzZW50cnkgX19zZW50cnkoKnRoaXMsIF9Ob19Ta2lwX1dTKCkpOwotCi0gIGlmIChfX3NlbnRyeSkgewotICAgIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX2J1ZiA9IHRoaXMtPnJkYnVmKCk7Ci0gICAgLy8gICAgIGlmICghX19idWYgfHwgX1RyYWl0czo6ZXFfaW50X3R5cGUoX19idWYtPnN1bmdldGMoKSwgX1RyYWl0czo6ZW9mKCkpKQotICAgIGlmIChfX2J1ZikgewotICAgICAgX1NUTFBfVFJZIHsKLSAgICAgICAgaWYgKHRoaXMtPl9TX2VvZihfX2J1Zi0+c3VuZ2V0YygpKSkKLSAgICAgICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKLSAgICAgIH0KLSAgICAgIF9TVExQX0NBVENIX0FMTCB7Ci0gICAgICAgIHRoaXMtPl9NX2hhbmRsZV9leGNlcHRpb24oaW9zX2Jhc2U6OmJhZGJpdCk7Ci0gICAgICB9Ci0gICAgfSBlbHNlCi0gICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKLSAgfQotICBlbHNlCi0gICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOwotCi0gIHJldHVybiAqdGhpczsKLX0KLQotLy8gUG9zaXRpb25pbmcgYW5kIGJ1ZmZlciBjb250cm9sLgotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotaW50IGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6c3luYygpIHsKLSAgc2VudHJ5IF9fc2VudHJ5KCp0aGlzLCBfTm9fU2tpcF9XUygpKTsKLQotICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19idWYgPSB0aGlzLT5yZGJ1ZigpOwotICBpZiAoX19idWYpIHsKLSAgICBpZiAoX19idWYtPnB1YnN5bmMoKSA9PSAtMSkgewotICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJldHVybiAwOwotICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gLTE7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Ci1fX0JJU19wb3NfdHlwZV9fCi1iYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OnRlbGxnKCkgewotICBzZW50cnkgX19zZW50cnkoKnRoaXMsIF9Ob19Ta2lwX1dTKCkpOwotCi0gIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX2J1ZiA9IHRoaXMtPnJkYnVmKCk7Ci0gIHJldHVybiAoX19idWYgJiYgIXRoaXMtPmZhaWwoKSkgPyBfX2J1Zi0+cHVic2Vla29mZigwLCBpb3NfYmFzZTo6Y3VyLCBpb3NfYmFzZTo6aW4pCi0gICAgOiBwb3NfdHlwZSgtMSk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Ci1iYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCi1iYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OnNlZWtnKHBvc190eXBlIF9fcG9zKSB7Ci0gIHNlbnRyeSBfX3NlbnRyeSgqdGhpcywgX05vX1NraXBfV1MoKSk7Ci0KLSAgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fYnVmID0gdGhpcy0+cmRidWYoKTsKLSAgaWYgKCF0aGlzLT5mYWlsKCkgJiYgX19idWYpIHsKLSAgICBpZiAoX19idWYtPnB1YnNlZWtwb3MoX19wb3MpID09IHBvc190eXBlKC0xKSkgewotICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOwotICAgIH0KLSAgfQotICByZXR1cm4gKnRoaXM7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Ci1iYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCi1iYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OnNlZWtnKG9mZl90eXBlIF9fb2ZmLCBpb3NfYmFzZTo6c2Vla2RpciBfX2RpcikgewotICBzZW50cnkgX19zZW50cnkoKnRoaXMsIF9Ob19Ta2lwX1dTKCkpOwotCi0gIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX2J1ZiA9IHRoaXMtPnJkYnVmKCk7Ci0gIGlmICghdGhpcy0+ZmFpbCgpICYmIF9fYnVmKQotICAgIF9fYnVmLT5wdWJzZWVrb2ZmKF9fb2ZmLCBfX2Rpcik7Ci0gIHJldHVybiAqdGhpczsKLX0KLQotLy8gRm9ybWF0dGVkIGlucHV0IG9mIGNoYXJhY3RlcnMgYW5kIGNoYXJhY3RlciBhcnJheXMuCi0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Ci12b2lkIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6X01fZm9ybWF0dGVkX2dldChfQ2hhclQmIF9fYykgewotLy8gIHR5cGVuYW1lIF9UcmFpdHM6OmludF90eXBlIF9fdG1wID0gX1RyYWl0czo6ZW9mKCk7Ci0KLSAgc2VudHJ5IF9fc2VudHJ5KCp0aGlzKTsgLy8gU2tpcCB3aGl0ZXNwYWNlLgotCi0gIGlmIChfX3NlbnRyeSkgewotICAgIHR5cGVuYW1lIF9UcmFpdHM6OmludF90eXBlIF9fdG1wOy8vID0gX1RyYWl0czo6ZW9mKCk7Ci0KLSAgICBfU1RMUF9UUlkgewotICAgICAgX190bXAgPSB0aGlzLT5yZGJ1ZigpLT5zYnVtcGMoKTsKLSAgICB9Ci0gICAgX1NUTFBfQ0FUQ0hfQUxMIHsKLSAgICAgIHRoaXMtPl9NX2hhbmRsZV9leGNlcHRpb24oaW9zX2Jhc2U6OmJhZGJpdCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKCF0aGlzLT5fU19lb2YoX190bXApKQotICAgICAgX19jID0gX1RyYWl0czo6dG9fY2hhcl90eXBlKF9fdG1wKTsKLSAgICBlbHNlCi0gICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZW9mYml0IHwgaW9zX2Jhc2U6OmZhaWxiaXQpOwotICB9Ci19Ci0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGlzdHJlYW0ncyBoZWxwZXIgZnVuY3Rpb25zLgotCi0vLyBBIGdlbmVyaWMgZnVuY3Rpb24gZm9yIHVuYnVmZmVyZWQgaW5wdXQuICBXZSBzdG9wIHdoZW4gd2UgcmVhY2ggRU9GLAotLy8gb3Igd2hlbiB3ZSBoYXZlIGV4dHJhY3RlZCBfTnVtIGNoYXJhY3RlcnMsIG9yIHdoZW4gdGhlIGZ1bmN0aW9uIG9iamVjdAotLy8gX19pc19kZWxpbSByZXR1cm4gdHJ1ZS4gIEluIHRoZSBsYXN0IGNhc2UsIGl0IGV4dHJhY3RzIHRoZSBjaGFyYWN0ZXIKLS8vIGZvciB3aGljaCBfX2lzX2RlbGltIGlzIHRydWUsIGlmIGFuZCBvbmx5IGlmIF9fZXh0cmFjdF9kZWxpbSBpcyB0cnVlLgotLy8gSXQgYXBwZW5kcyBhIG51bGwgY2hhcmFjdGVyIHRvIHRoZSBlbmQgb2YgdGhlIHN0cmluZzsgdGhpcyBtZWFucyB0aGF0Ci0vLyBpdCBtYXkgc3RvcmUgdXAgdG8gX051bSArIDEgY2hhcmFjdGVycy4KLS8vCi0vLyBfX2lzX2dldGxpbmUgZ292ZXJucyB0d28gY29ybmVyIGNhc2VzOiByZWFkaW5nIF9OdW0gY2hhcmFjdGVycyB3aXRob3V0Ci0vLyBlbmNvdW50ZXJpbmcgZGVsaW0gb3IgZW9mIChpbiB3aGljaCBjYXNlIGZhaWxiaXQgaXMgc2V0IGlmIF9faXNfZ2V0bGluZQotLy8gaXMgdHJ1ZSk7IGFuZCByZWFkaW5nIF9OdW0gY2hhcmFjdGVycyB3aGVyZSB0aGUgX051bSsxJ3N0IGNoYXJhY3RlciBpcwotLy8gZW9mIChpbiB3aGljaCBjYXNlIGVvZmJpdCBpcyBzZXQgaWYgX19pc19nZXRsaW5lIGlzIHRydWUpLgotLy8KLS8vIEl0IGlzIGFzc3VtZWQgdGhhdCBfX2lzX2RlbGltIG5ldmVyIHRocm93cy4KLS8vCi0vLyBSZXR1cm4gdmFsdWUgaXMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGV4dHJhY3RlZCwgaW5jbHVkaW5nIHRoZQotLy8gZGVsaW1pdGVyIGlmIGl0IGlzIGV4dHJhY3RlZC4gIE5vdGUgdGhhdCB0aGUgbnVtYmVyIG9mIGNoYXJhY2F0ZXJzCi0vLyBleHRyYWN0ZWQgaXNuJ3QgbmVjZXNzYXJpbHkgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBzdG9yZWQuCi0KLV9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKLQotdGVtcGxhdGUgPCBjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9Jc19EZWxpbT4KLXN0cmVhbXNpemUgX1NUTFBfQ0FMTAotX19yZWFkX3VuYnVmZmVyZWQoYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+KiBfX3RoYXQsIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX2J1ZiwKLSAgICAgICAgICAgICAgICAgIHN0cmVhbXNpemUgX051bSwgX0NoYXJUKiBfX3MsCi0gICAgICAgICAgICAgICAgICBfSXNfRGVsaW0gX19pc19kZWxpbSwKLSAgICAgICAgICAgICAgICAgIGJvb2wgX19leHRyYWN0X2RlbGltLCBib29sIF9fYXBwZW5kX251bGwsCi0gICAgICAgICAgICAgICAgICBib29sIF9faXNfZ2V0bGluZSkgewotICBzdHJlYW1zaXplIF9fbiA9IDA7Ci0gIGlvc19iYXNlOjppb3N0YXRlIF9fc3RhdHVzID0gMDsKLQotICB0eXBlZGVmIHR5cGVuYW1lIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6aW50X3R5cGUgaW50X3R5cGU7Ci0gIC8vIFRoZSBvcGVyYXRpb25zIHRoYXQgY2FuIHBvdGVudGlhbGx5IHRocm93IGFyZSBzYnVtcGMsIHNuZXh0YywgYW5kIHNnZXRjLgotICBfU1RMUF9UUlkgewotICAgIGZvciAoOzspIHsKLSAgICAgIGludF90eXBlIF9fYyA9IF9fYnVmLT5zYnVtcGMoKTsgLy8gc3NjaHdhcnoKLQotICAgICAgaWYgKF9fdGhhdC0+X1NfZW9mKF9fYykpIHsKLSAgICAgICAgaWYgKF9fbiA8IF9OdW0gfHwgX19pc19nZXRsaW5lKQotICAgICAgICAgIF9fc3RhdHVzIHw9IGlvc19iYXNlOjplb2ZiaXQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoX19pc19kZWxpbShfVHJhaXRzOjp0b19jaGFyX3R5cGUoX19jKSkpIHsKLSAgICAgICAgaWYgKF9fZXh0cmFjdF9kZWxpbSkgeyAvLyBFeHRyYWN0IGFuZCBkaXNjYXJkIGN1cnJlbnQgY2hhcmFjdGVyLgotICAgICAgICAgICsrX19uOwotICAgICAgICB9IGVsc2UgaWYgKCAhX19wdXNoYmFjayhfX2J1ZiwgX1RyYWl0czo6dG9fY2hhcl90eXBlKF9fYykpICkgeyAvLyBsZWF2ZSBkZWxpbWl0ZXIKLSAgICAgICAgICBfX3N0YXR1cyB8PSBpb3NfYmFzZTo6ZmFpbGJpdDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGVsc2UgeyAvLyByZWd1bGFyIGNoYXJhY3RlcgotICAgICAgICAqX19zKysgPSBfVHJhaXRzOjp0b19jaGFyX3R5cGUoX19jKTsKLSAgICAgICAgKytfX247Ci0gICAgICB9Ci0KLSAgICAgIGlmIChfX24gPT0gX051bSkgewotICAgICAgICBpZiAoX19pc19nZXRsaW5lKSAvLyBkaWRuJ3QgZmluZCBkZWxpbWl0ZXIgYXMgb25lIG9mIHRoZSBfTnVtIGNoYXJzCi0gICAgICAgICAgX19zdGF0dXMgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotICBfU1RMUF9DQVRDSF9BTEwgewotICAgIF9fdGhhdC0+X01faGFuZGxlX2V4Y2VwdGlvbihpb3NfYmFzZTo6YmFkYml0KTsKLSAgICAqX19zID0gX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRChfQ2hhclQpOwotICAgIHJldHVybiBfX247Ci0gIH0KLQotICBpZiAoX19hcHBlbmRfbnVsbCkKLSAgICAqX19zID0gIF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQoX0NoYXJUKTsKLSAgaWYgKF9fc3RhdHVzKQotICAgIF9fdGhhdC0+c2V0c3RhdGUoX19zdGF0dXMpOyAgICAvLyBUaGlzIG1pZ2h0IHRocm93LgotICByZXR1cm4gX19uOwotfQotCi0vLyBNdWNoIGxpa2UgX19yZWFkX3VuYnVmZmVyZWQsIGJ1dCB3aXRoIG9uZSBhZGRpdGlvbmFsIGZ1bmN0aW9uIG9iamVjdDoKLS8vIF9fc2Nhbl9kZWxpbShmaXJzdCwgbGFzdCkgcmV0dXJucyB0aGUgZmlyc3QgcG9pbnRlciBwIGluIFtmaXJzdCwgbGFzdCkKLS8vIHN1Y2ggdGhhdCBfX2lzX2RlbGltKHApIGlzIHRydWUuCi0KLXRlbXBsYXRlIDwgY2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfSXNfRGVsaW0sIGNsYXNzIF9TY2FuX0RlbGltPgotc3RyZWFtc2l6ZSBfU1RMUF9DQUxMCi1fX3JlYWRfYnVmZmVyZWQoYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+KiBfX3RoYXQsIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX2J1ZiwKLSAgICAgICAgICAgICAgICAgc3RyZWFtc2l6ZSBfTnVtLCBfQ2hhclQqIF9fcywKLSAgICAgICAgICAgICAgICAgX0lzX0RlbGltIF9faXNfZGVsaW0sIF9TY2FuX0RlbGltIF9fc2Nhbl9kZWxpbSwKLSAgICAgICAgICAgICAgICAgYm9vbCBfX2V4dHJhY3RfZGVsaW0sIGJvb2wgX19hcHBlbmRfbnVsbCwKLSAgICAgICAgICAgICAgICAgYm9vbCBfX2lzX2dldGxpbmUpIHsKLSAgc3RyZWFtc2l6ZSBfX24gPSAwOwotICBpb3NfYmFzZTo6aW9zdGF0ZSBfX3N0YXR1cyA9IDA7Ci0gIGJvb2wgX19kb25lICAgID0gZmFsc2U7Ci0KLSAgX1NUTFBfVFJZIHsKLSAgICB3aGlsZSAoX19idWYtPl9NX2VncHRyKCkgIT0gX19idWYtPl9NX2dwdHIoKSAmJiAhX19kb25lKSB7Ci0gICAgICBjb25zdCBfQ2hhclQqIF9fZmlyc3QgPSBfX2J1Zi0+X01fZ3B0cigpOwotICAgICAgY29uc3QgX0NoYXJUKiBfX2xhc3QgID0gX19idWYtPl9NX2VncHRyKCk7Ci0gICAgICAvL2Nhc3RpbmcgbnVtZXJpY19saW1pdHM8cHRyZGlmZl90Pjo6bWF4IHRvIHN0cmVhbXNpemUgb25seSB3b3JrcyBpcyBwdHJkaWZmX3QgaXMgc2lnbmVkIG9yIHN0cmVhbXNpemUgcmVwcmVzZW50YXRpb24KLSAgICAgIC8vaXMgbGFyZ2VyIHRoYW4gcHRyZGlmZl90IG9uZS4KLSAgICAgIF9TVExQX1NUQVRJQ19BU1NFUlQoKChzaXplb2Yoc3RyZWFtc2l6ZSkgPiBzaXplb2YocHRyZGlmZl90KSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplb2Yoc3RyZWFtc2l6ZSkgPT0gc2l6ZW9mKHB0cmRpZmZfdCkpKSAmJiBudW1lcmljX2xpbWl0czxwdHJkaWZmX3Q+Ojppc19zaWduZWQpCi0gICAgICBwdHJkaWZmX3QgX19yZXF1ZXN0ID0gX19TVEFUSUNfQ0FTVChwdHJkaWZmX3QsIChtaW4pIChfX1NUQVRJQ19DQVNUKHN0cmVhbXNpemUsIChudW1lcmljX2xpbWl0czxwdHJkaWZmX3Q+OjptYXgpKCkpLCBfTnVtIC0gX19uKSk7Ci0KLSAgICAgIGNvbnN0IF9DaGFyVCogX19wICA9IF9fc2Nhbl9kZWxpbShfX2ZpcnN0LCBfX2xhc3QpOwotICAgICAgcHRyZGlmZl90IF9fY2h1bmsgPSAobWluKSAocHRyZGlmZl90KF9fcCAtIF9fZmlyc3QpLCBfX3JlcXVlc3QpOwotICAgICAgX1RyYWl0czo6Y29weShfX3MsIF9fZmlyc3QsIF9fY2h1bmspOwotICAgICAgX19zICs9IF9fY2h1bms7Ci0gICAgICBfX24gKz0gX19jaHVuazsKLSAgICAgIF9fYnVmLT5fTV9nYnVtcCgoaW50KV9fY2h1bmspOwotCi0gICAgICAvLyBXZSB0ZXJtaW5hdGVkIGJ5IGZpbmRpbmcgZGVsaW0uCi0gICAgICBpZiAoX19wICE9IF9fbGFzdCAmJiBfX3AgLSBfX2ZpcnN0IDw9IF9fcmVxdWVzdCkgewotICAgICAgICBpZiAoX19leHRyYWN0X2RlbGltKSB7Ci0gICAgICAgICAgX19uICs9IDE7Ci0gICAgICAgICAgX19idWYtPl9NX2didW1wKDEpOwotICAgICAgICB9Ci0gICAgICAgIF9fZG9uZSA9IHRydWU7Ci0gICAgICB9Ci0KLSAgICAgIC8vIFdlIHRlcm1pbmF0ZWQgYnkgcmVhZGluZyBhbGwgdGhlIGNoYXJhY3RlcnMgd2Ugd2VyZSBhc2tlZCBmb3IuCi0gICAgICBlbHNlIGlmIChfX24gPT0gX051bSkgewotCi0gICAgICAgIC8vIEZpbmQgb3V0IGlmIHdlIGhhdmUgcmVhY2hlZCBlb2YuICBUaGlzIG1hdHRlcnMgZm9yIGdldGxpbmUuCi0gICAgICAgIGlmIChfX2lzX2dldGxpbmUpIHsKLSAgICAgICAgICBpZiAoX19jaHVuayA9PSBfX2xhc3QgLSBfX2ZpcnN0KSB7Ci0gICAgICAgICAgICBpZiAoX190aGF0LT5fU19lb2YoX19idWYtPnNnZXRjKCkpKQotICAgICAgICAgICAgICBfX3N0YXR1cyB8PSBpb3NfYmFzZTo6ZW9mYml0OwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBfX3N0YXR1cyB8PSBpb3NfYmFzZTo6ZmFpbGJpdDsKLSAgICAgICAgfQotICAgICAgICBfX2RvbmUgICA9IHRydWU7Ci0gICAgICB9Ci0KLSAgICAgIC8vIFRoZSBidWZmZXIgY29udGFpbmVkIGZld2VyIHRoYW4gX051bSAtIF9fbiBjaGFyYWN0ZXJzLiAgRWl0aGVyIHdlJ3JlCi0gICAgICAvLyBhdCBlb2YsIG9yIHdlIHNob3VsZCByZWZpbGwgdGhlIGJ1ZmZlciBhbmQgdHJ5IGFnYWluLgotICAgICAgZWxzZSB7Ci0gICAgICAgIGlmIChfX3RoYXQtPl9TX2VvZihfX2J1Zi0+c2dldGMoKSkpIHsKLSAgICAgICAgICBfX3N0YXR1cyB8PSBpb3NfYmFzZTo6ZW9mYml0OwotICAgICAgICAgIF9fZG9uZSA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IC8vIENsb3NlIHRoZSB3aGlsZSBsb29wLgotICB9Ci0gIF9TVExQX0NBVENIX0FMTCB7Ci0gICAgX190aGF0LT5fTV9oYW5kbGVfZXhjZXB0aW9uKGlvc19iYXNlOjpiYWRiaXQpOwotICAgIF9fZG9uZSA9IHRydWU7Ci0gIH0KLQotICBpZiAoX19kb25lKSB7Ci0gICAgaWYgKF9fYXBwZW5kX251bGwpCi0gICAgICAgICpfX3MgPSAgX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRChfQ2hhclQpOwotICAgIGlmIChfX3N0YXR1cyAhPSAwKQotICAgICAgX190aGF0LT5zZXRzdGF0ZShfX3N0YXR1cyk7ICAgLy8gVGhpcyBtaWdodCB0aHJvdy4KLSAgICByZXR1cm4gX19uOwotICB9Ci0KLSAgLy8gSWYgZXhlY3V0aW9uIGhhcyByZWFjaGVkIHRoaXMgcG9pbnQsIHRoZW4gd2UgaGF2ZSBhbiBlbXB0eSBidWZmZXIgYnV0Ci0gIC8vIHdlIGhhdmUgbm90IHJlYWNoZWQgZW9mLiAgV2hhdCB0aGF0IG1lYW5zIGlzIHRoYXQgdGhlIHN0cmVhbWJ1ZiBoYXMKLSAgLy8gZGVjaWRlZCB0byBzd2l0Y2ggZnJvbSBidWZmZXJlZCB0byB1bmJ1ZmZlcmVkIGlucHV0LiAgV2Ugc3dpdGNoIHRvCi0gIC8vIHRvIF9fcmVhZF91bmJ1ZmZlcmVkLgotCi0gIHJldHVybiBfX24gKyBfX3JlYWRfdW5idWZmZXJlZChfX3RoYXQsICBfX2J1ZiwgX051bSAtIF9fbiwgX19zLCBfX2lzX2RlbGltLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19leHRyYWN0X2RlbGltLF9fYXBwZW5kX251bGwsX19pc19nZXRsaW5lKTsKLX0KLQotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Ci1iYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCi1iYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OmdldChfQ2hhclQqIF9fcywgc3RyZWFtc2l6ZSBfX24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ2hhclQgX19kZWxpbSkgewotICBzZW50cnkgX19zZW50cnkoKnRoaXMsIF9Ob19Ta2lwX1dTKCkpOwotICB0aGlzLT5fTV9nY291bnQgPSAwOwotCi0gIGlmIChfX3NlbnRyeSkgewotICAgIGlmIChfX24gPiAwKSB7Ci0gICAgICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19idWYgPSB0aGlzLT5yZGJ1ZigpOwotCi0gICAgICBpZiAoX19idWYtPmVncHRyKCkgIT0gX19idWYtPmdwdHIoKSkKLSAgICAgICAgdGhpcy0+X01fZ2NvdW50ID0KLSAgICAgICAgICBfU1RMUF9QUklWIF9fcmVhZF9idWZmZXJlZCh0aGlzLCAgX19idWYsIF9fbiAtIDEsIF9fcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9FcV9jaGFyX2JvdW5kPF9UcmFpdHM+KF9fZGVsaW0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX1NjYW5fZm9yX2NoYXJfdmFsPF9UcmFpdHM+KF9fZGVsaW0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCB0cnVlLCBmYWxzZSk7Ci0gICAgICBlbHNlCi0gICAgICAgIHRoaXMtPl9NX2djb3VudCA9Ci0gICAgICAgICAgX1NUTFBfUFJJViBfX3JlYWRfdW5idWZmZXJlZCh0aGlzLCAgX19idWYsIF9fbiAtIDEsIF9fcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX0VxX2NoYXJfYm91bmQ8X1RyYWl0cz4oX19kZWxpbSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgdHJ1ZSwgZmFsc2UpOwotICAgIH0KLSAgfQotCi0gIGlmICh0aGlzLT5fTV9nY291bnQgPT0gMCkKLSAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7Ci0KLSAgcmV0dXJuICp0aGlzOwotfQotCi0vLyBHZXRsaW5lIGlzIGVzc2VudGlhbGx5IGlkZW50aWNhbCB0byBnZXQsIGV4Y2VwdCB0aGF0IGl0IGV4dHJhY3RzCi0vLyB0aGUgZGVsaW1pdGVyLgotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KLWJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKLWJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6Z2V0bGluZShfQ2hhclQqIF9fcywgc3RyZWFtc2l6ZSBfX24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NoYXJUIF9fZGVsaW0pIHsKLSAgc2VudHJ5IF9fc2VudHJ5KCp0aGlzLCBfTm9fU2tpcF9XUygpKTsKLSAgdGhpcy0+X01fZ2NvdW50ID0gMDsKLQotICBpZiAoX19zZW50cnkpIHsKLSAgICBpZiAoX19uID4gMCkgewotICAgICAgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fYnVmID0gdGhpcy0+cmRidWYoKTsKLSAgICAgIHRoaXMtPl9NX2djb3VudCA9IF9fYnVmLT5lZ3B0cigpICE9IF9fYnVmLT5ncHRyKCkKLSAgICAgICAgPyBfU1RMUF9QUklWIF9fcmVhZF9idWZmZXJlZCh0aGlzLCAgX19idWYsIF9fbiAtIDEsIF9fcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9FcV9jaGFyX2JvdW5kPF9UcmFpdHM+KF9fZGVsaW0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX1NjYW5fZm9yX2NoYXJfdmFsPF9UcmFpdHM+KF9fZGVsaW0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIHRydWUsIHRydWUpCi0gICAgICAgIDogX1NUTFBfUFJJViBfX3JlYWRfdW5idWZmZXJlZCh0aGlzLCAgX19idWYsIF9fbiAtIDEsIF9fcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX0VxX2NoYXJfYm91bmQ8X1RyYWl0cz4oX19kZWxpbSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCB0cnVlLCB0cnVlKTsKLSAgICB9Ci0gIH0KLQotICBpZiAodGhpcy0+X01fZ2NvdW50ID09IDApCi0gICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOwotCi0gIHJldHVybiAqdGhpczsKLX0KLQotLy8gUmVhZCBuIGNoYXJhY3RlcnMuICBXZSBkb24ndCBsb29rIGZvciBhbnkgZGVsaW1pdGVyLCBhbmQgd2UgZG9uJ3QKLS8vIHB1dCBpbiBhIHRlcm1pbmF0aW5nIG51bGwgY2hhcmFjdGVyLgotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KLWJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKLWJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6cmVhZChjaGFyX3R5cGUqIF9fcywgc3RyZWFtc2l6ZSBfX24pIHsKLSAgc2VudHJ5IF9fc2VudHJ5KCp0aGlzLCBfTm9fU2tpcF9XUygpKTsKLSAgdGhpcy0+X01fZ2NvdW50ID0gMDsKLQotICBpZiAoX19zZW50cnkgJiYgIXRoaXMtPmVvZigpKSB7Ci0gICAgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qX19idWYgPSB0aGlzLT5yZGJ1ZigpOwotICAgIGlmIChfX2J1Zi0+Z3B0cigpICE9IF9fYnVmLT5lZ3B0cigpKQotICAgICAgX01fZ2NvdW50Ci0gICAgICAgID0gX1NUTFBfUFJJViBfX3JlYWRfYnVmZmVyZWQodGhpcywgIF9fYnVmLCBfX24sIF9fcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9Db25zdGFudF91bmFyeV9mdW48Ym9vbCwgaW50X3R5cGU+KGZhbHNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9Qcm9qZWN0Mm5kPGNvbnN0IF9DaGFyVCosIGNvbnN0IF9DaGFyVCo+KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0gICAgZWxzZQotICAgICAgX01fZ2NvdW50Ci0gICAgICAgID0gX1NUTFBfUFJJViBfX3JlYWRfdW5idWZmZXJlZCh0aGlzLCAgX19idWYsIF9fbiwgX19zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfQ29uc3RhbnRfdW5hcnlfZnVuPGJvb2wsIGludF90eXBlPihmYWxzZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLSAgfQotICBlbHNlCi0gICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOwotCi0gIGlmICh0aGlzLT5lb2YoKSkKLSAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZW9mYml0IHwgaW9zX2Jhc2U6OmZhaWxiaXQpOwotCi0gIHJldHVybiAqdGhpczsKLX0KLQotCi0vLyBSZWFkIG4gb3IgZmV3ZXIgY2hhcmFjdGVycy4gIFdlIGRvbid0IGxvb2sgZm9yIGFueSBkZWxpbWl0ZXIsIGFuZAotLy8gd2UgZG9uJ3QgcHV0IGluIGEgdGVybWluYXRpbmcgbnVsbCBjaGFyYWN0ZXIuCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotc3RyZWFtc2l6ZQotYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpyZWFkc29tZShjaGFyX3R5cGUqIF9fcywgc3RyZWFtc2l6ZSBfX25tYXgpIHsKLSAgc2VudHJ5IF9fc2VudHJ5KCp0aGlzLCBfTm9fU2tpcF9XUygpKTsKLSAgdGhpcy0+X01fZ2NvdW50ID0gMDsKLQotICBpZiAoX19zZW50cnkgJiYgIXRoaXMtPmVvZigpICYmIF9fbm1heCA+PSAwKSB7Ci0KLSAgICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19idWYgPSB0aGlzLT5yZGJ1ZigpOwotICAgIHN0cmVhbXNpemUgX19hdmFpbCA9IF9fYnVmLT5pbl9hdmFpbCgpOwotCi0gICAgLy8gZmJwIDogaXNuJ3QgZnVsbC1ibG93biBzZXRzdGF0ZSByZXF1aXJlZCBoZXJlID8KLSAgICBpZiAoX19hdmFpbCA9PSAtMSkKLSAgICAgIHRoaXMtPl9NX3NldHN0YXRlX25vdGhyb3coaW9zX2Jhc2U6OmVvZmJpdCk7Ci0KLSAgICBlbHNlIGlmIChfX2F2YWlsICE9IDApIHsKLQotICAgICAgaWYgKF9fYnVmLT5ncHRyKCkgIT0gX19idWYtPmVncHRyKCkpCi0gICAgICAgIF9NX2djb3VudAotICAgICAgICAgID0gX1NUTFBfUFJJViBfX3JlYWRfYnVmZmVyZWQodGhpcywgIF9fYnVmLCAobWluKSAoX19hdmFpbCwgX19ubWF4KSwgX19zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfQ29uc3RhbnRfdW5hcnlfZnVuPGJvb2wsIGludF90eXBlPihmYWxzZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9Qcm9qZWN0Mm5kPGNvbnN0IF9DaGFyVCosIGNvbnN0IF9DaGFyVCo+KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLSAgICAgIGVsc2UKLSAgICAgICAgX01fZ2NvdW50Ci0gICAgICAgICAgPSBfU1RMUF9QUklWIF9fcmVhZF91bmJ1ZmZlcmVkKHRoaXMsICBfX2J1ZiwgKG1pbikgKF9fYXZhaWwsIF9fbm1heCksIF9fcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfQ29uc3RhbnRfdW5hcnlfZnVuPGJvb2wsIGludF90eXBlPihmYWxzZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotICAgIH0KLSAgfQotICBlbHNlIHsKLSAgICAvLyBmYnAgOiBjaGFuZ2VkIHNvIHRoYXQgZmFpbGJpdCBpcyBzZXQgb25seSB0aGVyZSwgdG8gcGFzcyBEaWV0bWFyJ3MgdGVzdAotICAgIGlmICh0aGlzLT5lb2YoKSkKLSAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjplb2ZiaXQgfCBpb3NfYmFzZTo6ZmFpbGJpdCk7Ci0gICAgZWxzZQotICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOwotICB9Ci0KLSAgLy8gIGlmICh0aGlzLT5lb2YoKSkKLSAgLy8gICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmVvZmJpdCB8IGlvc19iYXNlOjpmYWlsYml0KTsKLQotICByZXR1cm4gX01fZ2NvdW50OwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotdm9pZCBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Ol9NX2Zvcm1hdHRlZF9nZXQoX0NoYXJUKiBfX3MpIHsKLSAgc2VudHJ5IF9fc2VudHJ5KCp0aGlzKTsgLy8gU2tpcCB3aGl0ZXNwYWNlLgotCi0gIGlmIChfX3NlbnRyeSkgewotICAgIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX2J1ZiA9IHRoaXMtPnJkYnVmKCk7Ci0gICAgc3RyZWFtc2l6ZSBfX25tYXggPSB0aGlzLT53aWR0aCgpID4gMAotICAgICAgPyB0aGlzLT53aWR0aCgpIC0gMQotICAgICAgOiAoKG51bWVyaWNfbGltaXRzPHN0cmVhbXNpemU+OjptYXgpKCkgLyBzaXplb2YoX0NoYXJUKSkgLSAxOwotCi0gICAgc3RyZWFtc2l6ZSBfX24gPSBfX2J1Zi0+Z3B0cigpICE9IF9fYnVmLT5lZ3B0cigpCi0gICAgICA/IF9TVExQX1BSSVYgX19yZWFkX2J1ZmZlcmVkKHRoaXMsICBfX2J1ZiwgX19ubWF4LCBfX3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX0lzX3dzcGFjZV9udWxsPF9UcmFpdHM+KF9fU1RBVElDX0NBU1QoY29uc3QgY3R5cGU8X0NoYXJUPiosIHRoaXMtPl9NX2N0eXBlX2ZhY2V0KCkpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfU2Nhbl93c3BhY2VfbnVsbDxfVHJhaXRzPihfX1NUQVRJQ19DQVNUKGNvbnN0IGN0eXBlPF9DaGFyVD4qLCB0aGlzLT5fTV9jdHlwZV9mYWNldCgpKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCB0cnVlLCBmYWxzZSkKLSAgICAgIDogX1NUTFBfUFJJViBfX3JlYWRfdW5idWZmZXJlZCh0aGlzLCAgX19idWYsIF9fbm1heCwgX19zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX0lzX3dzcGFjZV9udWxsPF9UcmFpdHM+KF9fU1RBVElDX0NBU1QoY29uc3QgY3R5cGU8X0NoYXJUPiosIHRoaXMtPl9NX2N0eXBlX2ZhY2V0KCkpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgdHJ1ZSwgZmFsc2UpOwotICAgIGlmIChfX24gPT0gMCkKLSAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKLSAgfQotICB0aGlzLT53aWR0aCgwKTsKLX0KLQotLy8gQSBnZW5lcmljIHVuYnVmZmVyZWQgZnVuY3Rpb24gZm9yIGlnbm9yaW5nIGNoYXJhY3RlcnMuICBXZSBzdG9wCi0vLyB3aGVuIHdlIHJlYWNoIEVPRiwgb3Igd2hlbiB0aGUgZnVuY3Rpb24gb2JqZWN0IF9faXNfZGVsaW0gcmV0dXJucwotLy8gdHJ1ZS4gIEluIHRoZSBsYXN0IGNhc2UsIGl0IGV4dHJhY3RzIHRoZSBjaGFyYWN0ZXIgZm9yIHdoaWNoCi0vLyBfX2lzX2RlbGltIGlzIHRydWUsIGlmIGFuZCBvbmx5IGlmIF9fZXh0cmFjdF9kZWxpbSBpcyB0cnVlLgotCi10ZW1wbGF0ZSA8IGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0lzX0RlbGltPgotdm9pZCBfU1RMUF9DQUxMCi1fTV9pZ25vcmVfdW5idWZmZXJlZChiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4qIF9fdGhhdCwKLSAgICAgICAgICAgICAgICAgICAgIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgIF9Jc19EZWxpbSBfX2lzX2RlbGltLAotICAgICAgICAgICAgICAgICAgICAgYm9vbCBfX2V4dHJhY3RfZGVsaW0sIGJvb2wgX19zZXRfZmFpbGJpdCkgewotICBib29sIF9fZG9uZSA9IGZhbHNlOwotICBpb3NfYmFzZTo6aW9zdGF0ZSBfX3N0YXR1cyA9IDA7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjppbnRfdHlwZSBpbnRfdHlwZTsKLQotICBfU1RMUF9UUlkgewotICAgIHdoaWxlICghX19kb25lKSB7Ci0gICAgICBpbnRfdHlwZSBfX2MgPSBfX2J1Zi0+c2J1bXBjKCk7Ci0KLSAgICAgIGlmIChfX3RoYXQtPl9TX2VvZihfX2MpKSB7Ci0gICAgICAgIF9fZG9uZSA9IHRydWU7Ci0gICAgICAgIF9fc3RhdHVzIHw9IF9fc2V0X2ZhaWxiaXQgPyBpb3NfYmFzZTo6ZW9mYml0IHwgaW9zX2Jhc2U6OmZhaWxiaXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGlvc19iYXNlOjplb2ZiaXQ7Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UgaWYgKF9faXNfZGVsaW0oX1RyYWl0czo6dG9fY2hhcl90eXBlKF9fYykpKSB7Ci0gICAgICAgIF9fZG9uZSA9IHRydWU7Ci0gICAgICAgIGlmICghX19leHRyYWN0X2RlbGltKQotICAgICAgICAgIGlmIChfX3RoYXQtPl9TX2VvZihfX2J1Zi0+c3B1dGJhY2tjKF9UcmFpdHM6OnRvX2NoYXJfdHlwZShfX2MpKSkpCi0gICAgICAgICAgICBfX3N0YXR1cyB8PSBpb3NfYmFzZTo6ZmFpbGJpdDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgX1NUTFBfQ0FUQ0hfQUxMIHsKLSAgICBfX3RoYXQtPl9NX2hhbmRsZV9leGNlcHRpb24oaW9zX2Jhc2U6OmJhZGJpdCk7Ci0gIH0KLQotICBfX3RoYXQtPnNldHN0YXRlKF9fc3RhdHVzKTsKLX0KLQotLy8gQSBnZW5lcmljIGJ1ZmZlcmVkIGZ1bmN0aW9uIGZvciBpZ25vcmluZyBjaGFyYWN0ZXJzLiAgTXVjaCBsaWtlCi0vLyBfTV9pZ25vcmVfdW5idWZmZXJlZCwgYnV0IHdpdGggb25lIGFkZGl0aW9uYWwgZnVuY3Rpb24gb2JqZWN0OgotLy8gX19zY2FuX2RlbGltKGZpcnN0LCBsYXN0KSByZXR1cm5zIHRoZSBmaXJzdCBwb2ludGVyIHAgaW4gW2ZpcnN0LAotLy8gbGFzdCkgc3VjaCB0aGF0IF9faXNfZGVsaW0ocCkgaXMgdHJ1ZS4KLQotdGVtcGxhdGUgPCBjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9Jc19EZWxpbSwgY2xhc3MgX1NjYW5fRGVsaW0+Ci12b2lkIF9TVExQX0NBTEwKLV9NX2lnbm9yZV9idWZmZXJlZChiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4qIF9fdGhhdCwKLSAgICAgICAgICAgICAgICAgICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19idWYsCi0gICAgICAgICAgICAgICAgICAgX0lzX0RlbGltIF9faXNfZGVsaW0sIF9TY2FuX0RlbGltIF9fc2Nhbl9kZWxpbSwKLSAgICAgICAgICAgICAgICAgICBib29sIF9fZXh0cmFjdF9kZWxpbSwgYm9vbCBfX3NldF9mYWlsYml0KSB7Ci0gIGJvb2wgX19hdF9lb2YgICAgICA9IGZhbHNlOwotICBib29sIF9fZm91bmRfZGVsaW0gPSBmYWxzZTsKLQotICBfU1RMUF9UUlkgewotICAgIHdoaWxlIChfX2J1Zi0+X01fZWdwdHIoKSAhPSBfX2J1Zi0+X01fZ3B0cigpICYmICFfX2F0X2VvZiAmJiAhX19mb3VuZF9kZWxpbSkgewotICAgICAgY29uc3QgX0NoYXJUKiBfX3AgPSBfX3NjYW5fZGVsaW0oX19idWYtPl9NX2dwdHIoKSwgX19idWYtPl9NX2VncHRyKCkpOwotICAgICAgX19idWYtPl9NX2didW1wKChpbnQpKF9fcCAtIF9fYnVmLT5fTV9ncHRyKCkpKTsKLQotICAgICAgaWYgKF9fcCAhPSBfX2J1Zi0+X01fZWdwdHIoKSkgeyAvLyBXZSBmb3VuZCBkZWxpbSwgc28gd2UncmUgZG9uZS4KLSAgICAgICAgaWYgKF9fZXh0cmFjdF9kZWxpbSkKLSAgICAgICAgICBfX2J1Zi0+X01fZ2J1bXAoMSk7Ci0gICAgICAgIF9fZm91bmRfZGVsaW0gPSB0cnVlOwotICAgICAgfQotCi0gICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIGRlbGltLiAgVHJ5IHRvIHJlZmlsIHRoZSBidWZmZXIuCi0gICAgICAgIF9fYXRfZW9mID0gX190aGF0LT5fU19lb2YoX19idWYtPnNnZXRjKCkpOwotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDbG9zZSB0aGUgd2hpbGUgbG9vcC4KLSAgfQotICBfU1RMUF9DQVRDSF9BTEwgewotICAgIF9fdGhhdC0+X01faGFuZGxlX2V4Y2VwdGlvbihpb3NfYmFzZTo6YmFkYml0KTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoX19hdF9lb2YpIHsKLSAgICBfX3RoYXQtPnNldHN0YXRlKF9fc2V0X2ZhaWxiaXQgPyBpb3NfYmFzZTo6ZW9mYml0IHwgaW9zX2Jhc2U6OmZhaWxiaXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBpb3NfYmFzZTo6ZW9mYml0KTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKF9fZm91bmRfZGVsaW0pCi0gICAgcmV0dXJuOwotCi0gIC8vIElmIGV4ZWN1dGlvbiBoYXMgcmVhY2hlZCB0aGlzIHBvaW50LCB0aGVuIHdlIGhhdmUgYW4gZW1wdHkgYnVmZmVyIGJ1dAotICAvLyB3ZSBoYXZlIG5vdCByZWFjaGVkIGVvZi4gIFdoYXQgdGhhdCBtZWFucyBpcyB0aGF0IHRoZSBzdHJlYW1idWYgaGFzCi0gIC8vIGRlY2lkZWQgdG8gc3dpdGNoIGZyb20gYSBidWZmZXJlZCB0byBhbiB1bmJ1ZmZlcmVkIG1vZGUuICBXZSBzd2l0Y2gKLSAgLy8gdG8gX01faWdub3JlX3VuYnVmZmVyZWQuCi0gIF9NX2lnbm9yZV91bmJ1ZmZlcmVkKF9fdGhhdCwgIF9fYnVmLCBfX2lzX2RlbGltLCBfX2V4dHJhY3RfZGVsaW0sIF9fc2V0X2ZhaWxiaXQpOwotfQotCi0vLyBPdmVybG9hZGVkIHZlcnNpb25zIG9mIF9NX2lnbm9yZV91bmJ1ZmZlcmVkIGFuZCBfTV9pZ25vcmVfdW5idWZmZXJlZAotLy8gd2l0aCBhbiBleHBsaWNpdCBjb3VudCBfTnVtLiAgUmV0dXJuIHZhbHVlIGlzIHRoZSBudW1iZXIgb2YKLS8vIGNoYXJhY3RlcnMgZXh0cmFjdGVkLgotLy8KLS8vIFRoZSBmdW5jdGlvbiBvYmplY3QgX19tYXhfY2hhcnMgdGFrZXMgdHdvIGFyZ3VtZW50cywgX051bSBhbmQgX19uCi0vLyAodGhlIGxhdHRlciBiZWluZyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd2UgaGF2ZSBhbHJlYWR5IHJlYWQpLAotLy8gYW5kIHJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcmVhZCBmcm9tIHRoZSBidWZmZXIuCi0vLyBXZSBwYXJhbWV0ZXJpemUgX01faWdub3JlX2J1ZmZlcmVkIHNvIHRoYXQgd2UgY2FuIHVzZSBpdCBmb3IgYm90aAotLy8gYm91bmRlZCBhbmQgdW5ib3VuZGVkIGlucHV0OyBmb3IgdGhlIGZvcm1lciB0aGUgZnVuY3Rpb24gb2JqZWN0IHNob3VsZAotLy8gYmUgbWludXM8PiwgYW5kIGZvciB0aGUgbGF0dGVyIGl0IHNob3VsZCByZXR1cm4gYSBjb25zdGFudCBtYXhpbXVtIHZhbHVlLgotCi10ZW1wbGF0ZSA8IGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX01heF9DaGFycywgY2xhc3MgX0lzX0RlbGltPgotc3RyZWFtc2l6ZSBfU1RMUF9DQUxMCi1fTV9pZ25vcmVfdW5idWZmZXJlZChiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4qIF9fdGhhdCwKLSAgICAgICAgICAgICAgICAgICAgIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgIHN0cmVhbXNpemUgX051bSwgX01heF9DaGFycyBfX21heF9jaGFycywKLSAgICAgICAgICAgICAgICAgICAgIF9Jc19EZWxpbSBfX2lzX2RlbGltLAotICAgICAgICAgICAgICAgICAgICAgYm9vbCBfX2V4dHJhY3RfZGVsaW0sIGJvb2wgX19zZXRfZmFpbGJpdCkgewotICBzdHJlYW1zaXplIF9fbiA9IDA7Ci0gIGlvc19iYXNlOjppb3N0YXRlIF9fc3RhdHVzID0gMDsKLSAgdHlwZWRlZiB0eXBlbmFtZSBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OmludF90eXBlIGludF90eXBlOwotCi0gIF9TVExQX1RSWSB7Ci0gICAgd2hpbGUgKF9fbWF4X2NoYXJzKF9OdW0sIF9fbikgPiAwKSB7Ci0gICAgICBpbnRfdHlwZSBfX2MgPSBfX2J1Zi0+c2J1bXBjKCk7Ci0KLSAgICAgIGlmIChfX3RoYXQtPl9TX2VvZihfX2MpKSB7Ci0gICAgICAgIF9fc3RhdHVzIHw9IF9fc2V0X2ZhaWxiaXQgPyBpb3NfYmFzZTo6ZW9mYml0IHwgaW9zX2Jhc2U6OmZhaWxiaXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGlvc19iYXNlOjplb2ZiaXQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBlbHNlIGlmIChfX2lzX2RlbGltKF9UcmFpdHM6OnRvX2NoYXJfdHlwZShfX2MpKSkgewotICAgICAgICBpZiAoX19leHRyYWN0X2RlbGltKQotICAgICAgICAgICsrX19uOwotICAgICAgICBlbHNlIGlmIChfX3RoYXQtPl9TX2VvZihfX2J1Zi0+c3B1dGJhY2tjKF9UcmFpdHM6OnRvX2NoYXJfdHlwZShfX2MpKSkpCi0gICAgICAgICAgX19zdGF0dXMgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7Ci0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAvLyBmYnAgOiBhZGRlZCBjb3VudGVyIGluY3JlbWVudCB0byBwYXNzIERpZXRtYXIncyB0ZXN0Ci0gICAgICArK19fbjsKLSAgICB9Ci0gIH0KLSAgX1NUTFBfQ0FUQ0hfQUxMIHsKLSAgICBfX3RoYXQtPl9NX2hhbmRsZV9leGNlcHRpb24oaW9zX2Jhc2U6OmJhZGJpdCk7Ci0gIH0KLQotICBpZiAoX19zdGF0dXMpCi0gICAgX190aGF0LT5zZXRzdGF0ZShfX3N0YXR1cyk7ICAgLy8gVGhpcyBtaWdodCB0aHJvdy4KLSAgcmV0dXJuIF9fbjsKLX0KLQotdGVtcGxhdGUgPCBjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9NYXhfQ2hhcnMsIGNsYXNzIF9Jc19EZWxpbSwgY2xhc3MgX1NjYW5fRGVsaW0+Ci1zdHJlYW1zaXplIF9TVExQX0NBTEwKLV9NX2lnbm9yZV9idWZmZXJlZChiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4qIF9fdGhhdCwKLSAgICAgICAgICAgICAgICAgICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19idWYsCi0gICAgICAgICAgICAgICAgICAgc3RyZWFtc2l6ZSBfTnVtLAotICAgICAgICAgICAgICAgICAgIF9NYXhfQ2hhcnMgX19tYXhfY2hhcnMsCi0gICAgICAgICAgICAgICAgICAgX0lzX0RlbGltIF9faXNfZGVsaW0sIF9TY2FuX0RlbGltIF9fc2Nhbl9kZWxpbSwKLSAgICAgICAgICAgICAgICAgICBib29sIF9fZXh0cmFjdF9kZWxpbSwgYm9vbCBfX3NldF9mYWlsYml0KSB7Ci0gIHN0cmVhbXNpemUgX19uID0gMDsKLSAgYm9vbCBfX2F0X2VvZiA9IGZhbHNlOwotICBib29sIF9fZG9uZSAgID0gZmFsc2U7Ci0KLSAgX1NUTFBfVFJZIHsKLSAgICB3aGlsZSAoX19idWYtPl9NX2VncHRyKCkgIT0gX19idWYtPl9NX2dwdHIoKSAmJiAhX19kb25lKSB7Ci0gICAgICBwdHJkaWZmX3QgX19hdmFpbCA9IF9fYnVmLT5fTV9lZ3B0cigpIC0gX19idWYtPl9NX2dwdHIoKTsKLSAgICAgIHN0cmVhbXNpemUgX19tID0gX19tYXhfY2hhcnMoX051bSwgX19uKTsKLQotICAgICAgaWYgKF9fYXZhaWwgPj0gX19tKSB7ICAgICAgIC8vIFdlIGhhdmUgbW9yZSBjaGFyYWN0ZXJzIHRoYW4gd2UgbmVlZC4KLSAgICAgICAgY29uc3QgX0NoYXJUKiBfX2xhc3QgPSBfX2J1Zi0+X01fZ3B0cigpICsgX19TVEFUSUNfQ0FTVChwdHJkaWZmX3QsIF9fbSk7Ci0gICAgICAgIGNvbnN0IF9DaGFyVCogX19wID0gX19zY2FuX2RlbGltKF9fYnVmLT5fTV9ncHRyKCksIF9fbGFzdCk7Ci0gICAgICAgIHB0cmRpZmZfdCBfX2NodW5rID0gX19wIC0gX19idWYtPl9NX2dwdHIoKTsKLSAgICAgICAgX19uICs9IF9fY2h1bms7Ci0gICAgICAgIF9fYnVmLT5fTV9nYnVtcCgoaW50KV9fY2h1bmspOwotCi0gICAgICAgIGlmIChfX2V4dHJhY3RfZGVsaW0gJiYgX19wICE9IF9fbGFzdCkgewotICAgICAgICAgIF9fbiArPSAxOwotICAgICAgICAgIF9fYnVmLT5fTV9nYnVtcCgxKTsKLSAgICAgICAgfQotCi0gICAgICAgIF9fZG9uZSA9IHRydWU7Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UgewotICAgICAgICBjb25zdCBfQ2hhclQqIF9fcCA9IF9fc2Nhbl9kZWxpbShfX2J1Zi0+X01fZ3B0cigpLCBfX2J1Zi0+X01fZWdwdHIoKSk7Ci0gICAgICAgIHB0cmRpZmZfdCBfX2NodW5rID0gX19wIC0gX19idWYtPl9NX2dwdHIoKTsKLSAgICAgICAgX19uICs9IF9fY2h1bms7Ci0gICAgICAgIF9fYnVmLT5fTV9nYnVtcCgoaW50KV9fY2h1bmspOwotCi0gICAgICAgIGlmIChfX3AgIT0gX19idWYtPl9NX2VncHRyKCkpIHsgLy8gV2UgZm91bmQgZGVsaW0uCi0gICAgICAgICAgaWYgKF9fZXh0cmFjdF9kZWxpbSkgewotICAgICAgICAgICAgX19uICs9IDE7Ci0gICAgICAgICAgICBfX2J1Zi0+X01fZ2J1bXAoMSk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgX19kb25lID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFdlIGRpZG4ndCBmaW5kIGRlbGltLiAgVHJ5IHRvIHJlZmlsbCB0aGUgYnVmZmVyLgotICAgICAgICBlbHNlIGlmIChfX3RoYXQtPl9TX2VvZihfX2J1Zi0+c2dldGMoKSkpIHsKLSAgICAgICAgICBfX2RvbmUgICA9IHRydWU7Ci0gICAgICAgICAgX19hdF9lb2YgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSAvLyBDbG9zZSB0aGUgd2hpbGUgbG9vcC4KLSAgfQotICBfU1RMUF9DQVRDSF9BTEwgewotICAgIF9fdGhhdC0+X01faGFuZGxlX2V4Y2VwdGlvbihpb3NfYmFzZTo6YmFkYml0KTsKLSAgICByZXR1cm4gX19uOwotICB9Ci0KLSAgaWYgKF9fYXRfZW9mKQotICAgIF9fdGhhdC0+c2V0c3RhdGUoX19zZXRfZmFpbGJpdCA/IGlvc19iYXNlOjplb2ZiaXQgfCBpb3NfYmFzZTo6ZmFpbGJpdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGlvc19iYXNlOjplb2ZiaXQpOwotCi0gIGlmIChfX2RvbmUpCi0gICAgcmV0dXJuIF9fbjsKLQotICAvLyBJZiBleGVjdXRpb24gaGFzIHJlYWNoZWQgdGhpcyBwb2ludCwgdGhlbiB3ZSBoYXZlIGFuIGVtcHR5IGJ1ZmZlciBidXQKLSAgLy8gd2UgaGF2ZSBub3QgcmVhY2hlZCBlb2YuICBXaGF0IHRoYXQgbWVhbnMgaXMgdGhhdCB0aGUgc3RyZWFtYnVmIGhhcwotICAvLyBkZWNpZGVkIHRvIHN3aXRjaCBmcm9tIGJ1ZmZlcmVkIHRvIHVuYnVmZmVyZWQgaW5wdXQuICBXZSBzd2l0Y2ggdG8KLSAgLy8gdG8gX01faWdub3JlX3VuYnVmZmVyZWQuCi0KLSAgcmV0dXJuIF9fbiArIF9NX2lnbm9yZV91bmJ1ZmZlcmVkKF9fdGhhdCwgIF9fYnVmLCBfTnVtLCBfX21heF9jaGFycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faXNfZGVsaW0sIF9fZXh0cmFjdF9kZWxpbSwgX19zZXRfZmFpbGJpdCk7Ci19Ci0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KLWJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKLWJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6aWdub3JlKHN0cmVhbXNpemUgX19uKSB7Ci0gIHNlbnRyeSBfX3NlbnRyeSgqdGhpcywgX05vX1NraXBfV1MoKSk7Ci0gIHRoaXMtPl9NX2djb3VudCA9IDA7Ci0KLSAgaWYgKF9fc2VudHJ5KSB7Ci0gICAgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fYnVmID0gdGhpcy0+cmRidWYoKTsKLSAgICB0eXBlZGVmIF9TVExQX1BSSVYgX0NvbnN0YW50X3VuYXJ5X2Z1bjxib29sLCBpbnRfdHlwZT4gX0NvbnN0X2Jvb2w7Ci0gICAgdHlwZWRlZiBfU1RMUF9QUklWIF9Db25zdGFudF9iaW5hcnlfZnVuPHN0cmVhbXNpemUsIHN0cmVhbXNpemUsIHN0cmVhbXNpemU+IF9Db25zdF9zdHJlYW1zaXplOwotICAgIGNvbnN0IHN0cmVhbXNpemUgX19tYXhzcyA9IChudW1lcmljX2xpbWl0czxzdHJlYW1zaXplPjo6bWF4KSgpOwotCi0gICAgaWYgKF9fbiA9PSAobnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KSgpKSB7Ci0gICAgICBpZiAoX19idWYtPmdwdHIoKSAhPSBfX2J1Zi0+ZWdwdHIoKSkKLSAgICAgICAgX01fZ2NvdW50ID0gX01faWdub3JlX2J1ZmZlcmVkKHRoaXMsICBfX2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbWF4c3MsIF9Db25zdF9zdHJlYW1zaXplKF9fbWF4c3MpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NvbnN0X2Jvb2woZmFsc2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfUHJvamVjdDJuZDxjb25zdCBfQ2hhclQqLCBjb25zdCBfQ2hhclQqPigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlKTsKLSAgICAgIGVsc2UKLSAgICAgICAgX01fZ2NvdW50ID0gX01faWdub3JlX3VuYnVmZmVyZWQodGhpcywgIF9fYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX21heHNzLCBfQ29uc3Rfc3RyZWFtc2l6ZShfX21heHNzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NvbnN0X2Jvb2woZmFsc2UpLCBmYWxzZSwgZmFsc2UpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGlmIChfX2J1Zi0+Z3B0cigpICE9IF9fYnVmLT5lZ3B0cigpKQotICAgICAgICBfTV9nY291bnQgPSBfTV9pZ25vcmVfYnVmZmVyZWQodGhpcywgIF9fYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19uLCBtaW51czxzdHJlYW1zaXplPigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NvbnN0X2Jvb2woZmFsc2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfUHJvamVjdDJuZDxjb25zdCBfQ2hhclQqLCBjb25zdCBfQ2hhclQqPigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlKTsKLSAgICAgIGVsc2UKLSAgICAgICAgX01fZ2NvdW50ID0gX01faWdub3JlX3VuYnVmZmVyZWQodGhpcywgIF9fYnVmLCBfX24sIG1pbnVzPHN0cmVhbXNpemU+KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Db25zdF9ib29sKGZhbHNlKSwgZmFsc2UsIGZhbHNlKTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gKnRoaXM7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Ci1iYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCi1iYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Omlnbm9yZShzdHJlYW1zaXplIF9fbiwgaW50X3R5cGUgX19kZWxpbSkgewotICBzZW50cnkgX19zZW50cnkoKnRoaXMsIF9Ob19Ta2lwX1dTKCkpOwotICB0aGlzLT5fTV9nY291bnQgPSAwOwotCi0gIGlmIChfX3NlbnRyeSkgewotICAgIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX2J1ZiA9IHRoaXMtPnJkYnVmKCk7Ci0gICAgdHlwZWRlZiBfU1RMUF9QUklWIF9Db25zdGFudF91bmFyeV9mdW48Ym9vbCwgaW50X3R5cGU+IF9Db25zdF9ib29sOwotICAgIHR5cGVkZWYgX1NUTFBfUFJJViBfQ29uc3RhbnRfYmluYXJ5X2Z1bjxzdHJlYW1zaXplLCBzdHJlYW1zaXplLCBzdHJlYW1zaXplPgotICAgICAgX0NvbnN0X3N0cmVhbXNpemU7Ci0gICAgY29uc3Qgc3RyZWFtc2l6ZSBfX21heHNzID0gKG51bWVyaWNfbGltaXRzPHN0cmVhbXNpemU+OjptYXgpKCk7Ci0KLSAgICBpZiAoX19uID09IChudW1lcmljX2xpbWl0czxpbnQ+OjptYXgpKCkpIHsKLSAgICAgIGlmIChfX2J1Zi0+Z3B0cigpICE9IF9fYnVmLT5lZ3B0cigpKQotICAgICAgICBfTV9nY291bnQgPSBfTV9pZ25vcmVfYnVmZmVyZWQodGhpcywgIF9fYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tYXhzcywgX0NvbnN0X3N0cmVhbXNpemUoX19tYXhzcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9FcV9pbnRfYm91bmQ8X1RyYWl0cz4oX19kZWxpbSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9TY2FuX2Zvcl9pbnRfdmFsPF9UcmFpdHM+KF9fZGVsaW0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgZmFsc2UpOwotICAgICAgZWxzZQotICAgICAgICBfTV9nY291bnQgPSBfTV9pZ25vcmVfdW5idWZmZXJlZCh0aGlzLCAgX19idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbWF4c3MsIF9Db25zdF9zdHJlYW1zaXplKF9fbWF4c3MpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9FcV9pbnRfYm91bmQ8X1RyYWl0cz4oX19kZWxpbSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIGZhbHNlKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBpZiAoX19idWYtPmdwdHIoKSAhPSBfX2J1Zi0+ZWdwdHIoKSkKLSAgICAgICAgX01fZ2NvdW50ID0gX01faWdub3JlX2J1ZmZlcmVkKHRoaXMsICBfX2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbiwgbWludXM8c3RyZWFtc2l6ZT4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX0VxX2ludF9ib3VuZDxfVHJhaXRzPihfX2RlbGltKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX1NjYW5fZm9yX2ludF92YWw8X1RyYWl0cz4oX19kZWxpbSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCBmYWxzZSk7Ci0gICAgICBlbHNlCi0gICAgICAgIF9NX2djb3VudCA9IF9NX2lnbm9yZV91bmJ1ZmZlcmVkKHRoaXMsICBfX2J1ZiwgX19uLCBtaW51czxzdHJlYW1zaXplPigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9FcV9pbnRfYm91bmQ8X1RyYWl0cz4oX19kZWxpbSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIGZhbHNlKTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gKnRoaXM7Ci19Ci0KLS8vIFRoaXMgbWVtYmVyIGZ1bmN0aW9uIGRvZXMgbm90IGNvbnN0cnVjdCBhIHNlbnRyeSBvYmplY3QsIGJlY2F1c2UKLS8vIGl0IGlzIGNhbGxlZCBmcm9tIHNlbnRyeSdzIGNvbnN0cnVjdG9yLgotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KLXZvaWQgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpfTV9za2lwX3doaXRlc3BhY2UoYm9vbCBfX3NldF9mYWlsYml0KSB7Ci0gIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX2J1ZiA9IHRoaXMtPnJkYnVmKCk7Ci0gIGlmICghX19idWYpCi0gICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7Ci0gIGVsc2UgaWYgKF9fYnVmLT5ncHRyKCkgIT0gX19idWYtPmVncHRyKCkpCi0gICAgX01faWdub3JlX2J1ZmZlcmVkKHRoaXMsICBfX2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfSXNfbm90X3dzcGFjZTxfVHJhaXRzPihfX1NUQVRJQ19DQVNUKGNvbnN0IGN0eXBlPF9DaGFyVD4qLCB0aGlzLT5fTV9jdHlwZV9mYWNldCgpKSksCi0gICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX1NjYW5fZm9yX25vdF93c3BhY2U8X1RyYWl0cz4oX19TVEFUSUNfQ0FTVChjb25zdCBjdHlwZTxfQ2hhclQ+KiwgdGhpcy0+X01fY3R5cGVfZmFjZXQoKSkpLAotICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgX19zZXRfZmFpbGJpdCk7Ci0gIGVsc2UKLSAgICBfTV9pZ25vcmVfdW5idWZmZXJlZCh0aGlzLCAgX19idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfSXNfbm90X3dzcGFjZTxfVHJhaXRzPihfX1NUQVRJQ19DQVNUKGNvbnN0IGN0eXBlPF9DaGFyVD4qLCB0aGlzLT5fTV9jdHlwZV9mYWNldCgpKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIF9fc2V0X2ZhaWxiaXQpOwotfQotCi0KLS8vIFRoaXMgaXMgYSB2ZXJ5IHNpbXBsZSBsb29wIHRoYXQgcmVhZHMgY2hhcmFjdGVycyBmcm9tIF9fc3JjIGFuZCBwdXRzCi0vLyB0aGVtIGludG8gX19kZXN0LiAgSXQgbG9va3MgY29tcGxpY2F0ZWQgYmVjYXVzZSBvZiB0aGUgKHN0YW5kYXJkLQotLy8gbWFuZGF0ZWQpIGV4Y2VwdGlvbiBoYW5kbGluZyBwb2xpY3kuCi0vLwotLy8gV2Ugc3RvcCB3aGVuIHdlIGdldCBhbiBleGNlcHRpb24sIHdoZW4gd2UgZmFpbCB0byBpbnNlcnQgaW50byB0aGUKLS8vIG91dHB1dCBzdHJlYW1idWYsIG9yIHdoZW4gX19pc19kZWxpbSBpcyB0cnVlLgotCi1fU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCi0KLXRlbXBsYXRlIDwgY2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfSXNfRGVsaW0+Ci1zdHJlYW1zaXplIF9TVExQX0NBTEwKLV9fY29weV91bmJ1ZmZlcmVkKGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiogX190aGF0LCBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19zcmMsCi0gICAgICAgICAgICAgICAgICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19kZXN0LAotICAgICAgICAgICAgICAgICAgX0lzX0RlbGltIF9faXNfZGVsaW0sCi0gICAgICAgICAgICAgICAgICBib29sIF9fZXh0cmFjdF9kZWxpbSwgYm9vbCBfX3JldGhyb3cpIHsKLSAgc3RyZWFtc2l6ZSBfX2V4dHJhY3RlZCA9IDA7Ci0gIGlvc19iYXNlOjppb3N0YXRlIF9fc3RhdHVzID0gMDsKLSAgdHlwZWRlZiB0eXBlbmFtZSBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OmludF90eXBlIGludF90eXBlOwotICBpbnRfdHlwZSBfX2M7Ci0KLSAgX1NUTFBfVFJZIHsKLSAgICBmb3IgKDs7KSB7Ci0gICAgICAvLyBHZXQgYSBjaGFyYWN0ZXIuIElmIHRoZXJlJ3MgYW4gZXhjZXB0aW9uLCBjYXRjaCBhbmQgKG1heWJlKSByZXRocm93IGl0LgotICAgICAgX19jID0gX19zcmMtPnNidW1wYygpOwotCi0gICAgICAvLyBJZiB3ZSBmYWlsZWQgdG8gZ2V0IGEgY2hhcmFjdGVyLCB0aGVuIHF1aXQuCi0gICAgICBpZiAoX190aGF0LT5fU19lb2YoX19jKSkgewotICAgICAgICBfX3N0YXR1cyB8PSBpb3NfYmFzZTo6ZW9mYml0OwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIC8vIElmIGl0J3MgdGhlIGRlbGltaXRlciwgdGhlbiBxdWl0LgotICAgICAgZWxzZSBpZiAoX19pc19kZWxpbShfVHJhaXRzOjp0b19jaGFyX3R5cGUoX19jKSkpIHsKLSAgICAgICAgaWYgKCFfX2V4dHJhY3RfZGVsaW0gJiYgIV9fcHVzaGJhY2soX19zcmMsIF9UcmFpdHM6OnRvX2NoYXJfdHlwZShfX2MpKSkKLSAgICAgICAgICBfX3N0YXR1cyB8PSBpb3NfYmFzZTo6ZmFpbGJpdDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgLy8gVHJ5IHRvIHB1dCB0aGUgY2hhcmFjdGVyIGluIHRoZSBvdXRwdXQgc3RyZWFtYnVmLgotICAgICAgICBib29sIF9fZmFpbGVkID0gZmFsc2U7Ci0gICAgICAgIF9TVExQX1RSWSB7Ci0gICAgICAgICAgaWYgKCFfX3RoYXQtPl9TX2VvZihfX2Rlc3QtPnNwdXRjKF9UcmFpdHM6OnRvX2NoYXJfdHlwZShfX2MpKSkpCi0gICAgICAgICAgICArK19fZXh0cmFjdGVkOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIF9fZmFpbGVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBfU1RMUF9DQVRDSF9BTEwgewotICAgICAgICAgIF9fZmFpbGVkID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIHdlIGZhaWxlZCB0byBwdXQgdGhlIGNoYXJhY3RlciBpbiB0aGUgb3V0cHV0IHN0cmVhbWJ1ZiwgdGhlbgotICAgICAgICAvLyB0cnkgdG8gcHVzaCBpdCBiYWNrIHRvIHRoZSBpbnB1dCBzdHJlYW1idWYuCi0gICAgICAgIGlmIChfX2ZhaWxlZCAmJiAhX19wdXNoYmFjayhfX3NyYywgX1RyYWl0czo6dG9fY2hhcl90eXBlKF9fYykpKQotICAgICAgICAgIF9fc3RhdHVzIHw9IGlvc19iYXNlOjpmYWlsYml0OwotCi0gICAgICAgIC8vIGZicCA6IGF2b2lkaW5nIGluZmluaXRlIGxvb3AgaW4gaW8tMjctNi0xLTItMy5leHAKLSAgICAgICAgaWYgKF9fZmFpbGVkKQotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgfSAvKiBmb3IgKDs7KSAqLwotCi0gIH0KLSAgLy8gZmJwIDogdGhpcyB0cnkvY2F0Y2ggbW92ZWQgaGVyZSBpbiByZWFzb25hYmxlIGFzc3VtcHRpb24KLSAgLy8gX19pc19kZWxpbSBuZXZlciB0aHJvdyAoX19wdXNoYmFjayBpcyBndWFyYW50ZWVkIG5vdCB0bykKLSAgX1NUTFBfQ0FUQ0hfQUxMIHsKLSAgICAvLyBTZWUgMjcuNi4xLjIuMywgcGFyYWdyYXBoIDEzLgotICAgIGlmIChfX3JldGhyb3cgJiYgX19leHRyYWN0ZWQgPT0gMCkKLSAgICAgIF9fdGhhdC0+X01faGFuZGxlX2V4Y2VwdGlvbihpb3NfYmFzZTo6ZmFpbGJpdCk7Ci0gIH0KLSAgX190aGF0LT5zZXRzdGF0ZShfX3N0YXR1cyk7Ci0gIHJldHVybiBfX2V4dHJhY3RlZDsKLX0KLQotLy8gQnVmZmVyZWQgY29weWluZyBmcm9tIG9uZSBzdHJlYW1idWYgdG8gYW5vdGhlci4gIFdlIGNvcHkgdGhlIGNoYXJhY3RlcnMKLS8vIGluIGNodW5rcywgcmF0aGVyIHRoYW4gb25lIGF0IGEgdGltZS4gIFdlIHN0aWxsIGhhdmUgdG8gd29ycnkgYWJvdXQgYWxsCi0vLyBvZiB0aGUgZXJyb3IgY29uZGl0aW9ucyB3ZSBjaGVja2VkIGluIF9fY29weV91bmJ1ZmZlcmVkLCBwbHVzIG9uZSBtb3JlOgotLy8gdGhlIHN0cmVhbWJ1ZiBtaWdodCBkZWNpZGUgdG8gc3dpdGNoIGZyb20gYSBidWZmZXJlZCB0byBhbiB1bmJ1ZmZlcmVkIG1vZGUuCi0KLXRlbXBsYXRlIDwgY2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfSXNfRGVsaW0sIGNsYXNzIF9TY2FuX0RlbGltPgotc3RyZWFtc2l6ZSBfU1RMUF9DQUxMCi1fX2NvcHlfYnVmZmVyZWQoYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+KiBfX3RoYXQsIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX3NyYywKLSAgICAgICAgICAgICAgICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19kZXN0LAotICAgICAgICAgICAgICAgIF9TY2FuX0RlbGltIF9fc2Nhbl9kZWxpbSwgX0lzX0RlbGltIF9faXNfZGVsaW0sCi0gICAgICAgICAgICAgICAgYm9vbCBfX2V4dHJhY3RfZGVsaW0sIGJvb2wgX19yZXRocm93KSB7Ci0gIHN0cmVhbXNpemUgX19leHRyYWN0ZWQgPSAwOwotICBpb3NfYmFzZTo6aW9zdGF0ZSBfX3N0YXR1cyA9IDA7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjppbnRfdHlwZSBpbnRfdHlwZTsKLSAgLy9Cb3JsYW5kIGNvbXBpbGVyIGdlbmVyYXRlcyBhIHdhcm5pbmcgaWYgYXNzaWdubWVudCBiZWNhdXNlIHZhbHVlIGlzIG5ldmVyIHVzZWQ6Ci0gIGludF90eXBlIF9fYyAvKj0gX1RyYWl0czo6ZW9mKCkqLzsKLSAgX0NoYXJUKiBfX2ZpcnN0ID0gX19zcmMtPl9NX2dwdHIoKTsKLSAgcHRyZGlmZl90IF9fYXZhaWwgPSBfX3NyYy0+X01fZWdwdHIoKSAtIF9fZmlyc3Q7Ci0gIC8vIGZicCA6IGludHJvZHVjZWQgdG8gbW92ZSBjYXRjaC90cnkgYmxvY2tzIG91dCBvZiB0aGUgbG9vcAotICBib29sIF9fZG9faGFuZGxlX2V4Y2VwdGlvbnMgPSBmYWxzZTsKLQotICBfU1RMUF9UUlkgewotICAgIGZvciAoOzspIHsKLSAgICAgIGNvbnN0IF9DaGFyVCogX19sYXN0ID0gX19zY2FuX2RlbGltKF9fZmlyc3QsIF9fc3JjLT5fTV9lZ3B0cigpKTsKLQotICAgICAgLy8gVHJ5IHRvIGNvcHkgdGhlIGVudGlyZSBpbnB1dCBidWZmZXIgdG8gdGhlIG91dHB1dCBidWZmZXIuCi0gICAgICBzdHJlYW1zaXplIF9fbiA9IF9fZGVzdC0+c3B1dG4oX19maXJzdCwgX19leHRyYWN0X2RlbGltICYmIF9fbGFzdCAhPSBfX3NyYy0+X01fZWdwdHIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKF9fbGFzdCAtIF9fZmlyc3QpICsgMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKF9fbGFzdCAtIF9fZmlyc3QpKTsKLSAgICAgIF9fc3JjLT5fTV9nYnVtcCgoaW50KV9fbik7Ci0gICAgICBfX2V4dHJhY3RlZCArPSBfX247Ci0KLSAgICAgIC8vIGZyb20gdGhpcyBvbiwgY2F0Y2goKSB3aWxsIGNhbGwgX01faGFuZGxlX2V4Y2VwdGlvbnMoKQotICAgICAgX19kb19oYW5kbGVfZXhjZXB0aW9ucyA9IHRydWU7Ci0KLSAgICAgIGlmIChfX24gPCBfX2F2YWlsKSAgICAgICAgICAvLyBXZSBmb3VuZCB0aGUgZGVsaW1pdGVyLCBvciBlbHNlIGZhaWxlZCB0bwotICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgc29tZSBjaGFyYWN0ZXJzLgotCi0gICAgICBfX2MgPSBfX3NyYy0+c2dldGMoKTsKLQotICAgICAgLy8gVGhyZWUgcG9zc2liaWxpdGllczogd2Ugc3VjY2VlZGVkIGluIHJlZmlsbGluZyB0aGUgYnVmZmVyLCBvcgotICAgICAgLy8gd2UgZ290IEVPRiwgb3IgdGhlIHN0cmVhbWJ1ZiBoYXMgc3dpdGNoZWQgdG8gdW5idWZmZXJlZCBtb2RlLgotICAgICAgX19maXJzdCA9IF9fc3JjLT5fTV9ncHRyKCk7Ci0gICAgICBfX2F2YWlsID0gX19zcmMtPl9NX2VncHRyKCkgLSBfX2ZpcnN0OwotCi0gICAgICBpZiAoX19hdmFpbCA+IDApCi0gICAgICAgIHt9ICAvLyBkd2EgMS8xNi8wMCAtLSBzdXBwcmVzcyBhIE1ldHJvd2Vya3Mgd2FybmluZwotICAgICAgZWxzZSBpZiAoX190aGF0LT5fU19lb2YoX19jKSkgewotICAgICAgICBfX3N0YXR1cyB8PSBpb3NfYmFzZTo6ZW9mYml0OwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICByZXR1cm4gX19leHRyYWN0ZWQgKyBfX2NvcHlfdW5idWZmZXJlZChfX3RoYXQsICBfX3NyYywgX19kZXN0LCBfX2lzX2RlbGltLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19leHRyYWN0X2RlbGltLCBfX3JldGhyb3cpOwotICAgICAgfQotCi0gICAgICBfX2RvX2hhbmRsZV9leGNlcHRpb25zID0gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgX1NUTFBfQ0FUQ0hfQUxMIHsKLSAgICAvLyBTZWUgMjcuNi4xLjIuMywgcGFyYWdyYXBoIDEzLgotICAgIGlmIChfX3JldGhyb3cgJiYgX19kb19oYW5kbGVfZXhjZXB0aW9ucyAmJiAgX19leHRyYWN0ZWQgPT0gMCkKLSAgICAgIF9fdGhhdC0+X01faGFuZGxlX2V4Y2VwdGlvbihpb3NfYmFzZTo6ZmFpbGJpdCk7Ci0gIH0KLQotICBpZiAoX19zdGF0dXMpCi0gICAgX190aGF0LT5zZXRzdGF0ZShfX3N0YXR1cyk7ICAgLy8gVGhpcyBtaWdodCB0aHJvdy4KLSAgcmV0dXJuIF9fZXh0cmFjdGVkOwotfQotCi1fU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KLWJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKLWJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPgotICA6OmdldChiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiYgX19kZXN0LCBfQ2hhclQgX19kZWxpbSkgewotICBzZW50cnkgX19zZW50cnkoKnRoaXMsIF9Ob19Ta2lwX1dTKCkpOwotICB0aGlzLT5fTV9nY291bnQgPSAwOwotCi0gIGlmIChfX3NlbnRyeSkgewotICAgIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX3NyYyA9IHRoaXMtPnJkYnVmKCk7Ci0KLSAgICBpZiAoX19zcmMpCi0gICAgICB0aGlzLT5fTV9nY291bnQgPSBfX3NyYy0+ZWdwdHIoKSAhPSBfX3NyYy0+Z3B0cigpCi0gICAgICAgID8gX1NUTFBfUFJJViBfX2NvcHlfYnVmZmVyZWQodGhpcywgIF9fc3JjLCAmX19kZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX1NjYW5fZm9yX2NoYXJfdmFsPF9UcmFpdHM+KF9fZGVsaW0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX0VxX2NoYXJfYm91bmQ8X1RyYWl0cz4oX19kZWxpbSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlKQotICAgICAgICA6IF9TVExQX1BSSVYgX19jb3B5X3VuYnVmZmVyZWQodGhpcywgIF9fc3JjLCAmX19kZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfRXFfY2hhcl9ib3VuZDxfVHJhaXRzPihfX2RlbGltKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSk7Ci0gIH0KLQotICBpZiAodGhpcy0+X01fZ2NvdW50ID09IDApCi0gICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOwotCi0gIHJldHVybiAqdGhpczsKLX0KLQotLy8gQ29weWluZyBjaGFyYWN0ZXJzIGludG8gYSBzdHJlYW1idWYuCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgotYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Ci0gIDo6b3BlcmF0b3I+PihiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19kZXN0KSB7Ci0gIHN0cmVhbXNpemUgX19uID0gMDsKLSAgdHlwZWRlZiB0eXBlbmFtZSBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OnNlbnRyeSBfU2VudHJ5OwotICBfU2VudHJ5IF9fc2VudHJ5KCp0aGlzKTsKLSAgaWYgKF9fc2VudHJ5KSB7Ci0gICAgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fc3JjID0gdGhpcy0+cmRidWYoKTsKLSAgICBpZiAoX19zcmMgJiYgX19kZXN0KQotICAgICAgX19uID0gX19zcmMtPmVncHRyKCkgIT0gX19zcmMtPmdwdHIoKQotICAgICAgICA/IF9TVExQX1BSSVYgX19jb3B5X2J1ZmZlcmVkKHRoaXMsICBfX3NyYywgX19kZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX1Byb2plY3QybmQ8Y29uc3QgX0NoYXJUKiwgY29uc3QgX0NoYXJUKj4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9Db25zdGFudF91bmFyeV9mdW48Ym9vbCwgaW50X3R5cGU+KGZhbHNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgdHJ1ZSkKLSAgICAgICAgOiBfU1RMUF9QUklWIF9fY29weV91bmJ1ZmZlcmVkKHRoaXMsICBfX3NyYywgX19kZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfQ29uc3RhbnRfdW5hcnlfZnVuPGJvb2wsIGludF90eXBlPihmYWxzZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgdHJ1ZSk7Ci0gIH0KLQotICBpZiAoX19uID09IDApCi0gICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOwotCi0gIHJldHVybiAqdGhpczsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gYmFzaWNfaW9zdHJlYW08PiBjbGFzcwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotYmFzaWNfaW9zdHJlYW08X0NoYXJULCBfVHJhaXRzPgotICA6OmJhc2ljX2lvc3RyZWFtKGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX2J1ZikKLSAgICA6IGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+KCksCi0gICAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4oX19idWYpLAotICAgICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+KF9fYnVmKSB7Ci0gIHRoaXMtPmluaXQoX19idWYpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotYmFzaWNfaW9zdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6fmJhc2ljX2lvc3RyZWFtKCkKLXt9Ci0KLV9TVExQX0VORF9OQU1FU1BBQ0UKLQotI3VuZGVmIF9fQklTX2ludF90eXBlX18KLSN1bmRlZiBfX0JJU19wb3NfdHlwZV9fCi0jdW5kZWYgX19CSVNfb2ZmX3R5cGVfXwotCi0jZW5kaWYgLyogX1NUTFBfSVNUUkVBTV9DICovCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX2lzdHJlYW0uaCBiL3N0bC9faXN0cmVhbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjkyY2NlLi4wMDAwMDAwCi0tLSBhL3N0bC9faXN0cmVhbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzYyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogQm9yaXMgRm9taXRjaGV2Ci0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICovCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0lTVFJFQU0KLSNkZWZpbmUgX1NUTFBfSU5URVJOQUxfSVNUUkVBTQotCi0vLyB0aGlzIGJsb2NrIGlzIGluY2x1ZGVkIGJ5IF9vc3RyZWFtLmgsIHdlIGluY2x1ZGUgaXQgaGVyZSB0byBsb3dlciAjaW5jbHVkZSBsZXZlbAotI2lmIGRlZmluZWQgKF9TVExQX0hBU19XQ0hBUl9UKSAmJiAhZGVmaW5lZCAoX1NUTFBfSU5URVJOQUxfQ1dDSEFSKQotIyAgaW5jbHVkZSA8c3RsL19jd2NoYXIuaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0lPU19ICi0jICBpbmNsdWRlIDxzdGwvX2lvcy5oPiAgICAgICAgICAgICAgICAgIC8vIEZvciBiYXNpY19pb3M8Pi4gIEluY2x1ZGVzIDxpb3Nmd2Q+LgotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfT1NUUkVBTV9ICi0jICBpbmNsdWRlIDxzdGwvX29zdHJlYW0uaD4gICAgICAgICAgICAgIC8vIE5lZWRlZCBhcyBhIGJhc2UgY2xhc3Mgb2YgYmFzaWNfaW9zdHJlYW0uCi0jZW5kaWYKLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9JU1RSRUFNQlVGX0lURVJBVE9SX0gKLSMgIGluY2x1ZGUgPHN0bC9faXN0cmVhbWJ1Zl9pdGVyYXRvci5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGwvX2N0cmFpdHNfZm5zLmg+ICAgIC8vIEhlbHBlciBmdW5jdGlvbnMgdGhhdCBhbGxvdyBjaGFyIHRyYWl0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBiZSB1c2VkIGFzIGZ1bmN0aW9uIG9iamVjdHMuCi1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLQotI2lmIGRlZmluZWQgKF9TVExQX1VTRV9URU1QTEFURV9FWFBPUlQpCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotY2xhc3MgX0lzZW50cnk7Ci0jZW5kaWYKLQotc3RydWN0IF9Ob19Ta2lwX1dTIHt9OyAgICAgICAgLy8gRHVtbXkgY2xhc3MgdXNlZCBieSBzZW50cnkuCi0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Ci1ib29sIF9NX2luaXRfc2tpcChiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXN0cik7Ci10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotYm9vbCBfTV9pbml0X25vc2tpcChiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXN0cik7Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ2xhc3MgYmFzaWNfaXN0cmVhbSwgYSBjbGFzcyB0aGF0IHBlcmZvcm1zIGZvcm1hdHRlZCBpbnB1dCB0aHJvdWdoCi0vLyBhIHN0cmVhbSBidWZmZXIuCi0KLS8vIFRoZSBzZWNvbmQgdGVtcGxhdGUgcGFyYW1ldGVyLCBfVHJhaXRzLCBkZWZhdWx0cyB0byBjaGFyX3RyYWl0czxfQ2hhclQ+LgotLy8gVGhlIGRlZmF1bHQgaXMgZGVjbGFyZWQgaW4gaGVhZGVyIDxpb3Nmd2Q+LCBhbmQgaXQgaXNuJ3QgZGVjbGFyZWQgaGVyZQotLy8gYmVjYXVzZSBDKysgbGFuZ3VhZ2UgcnVsZXMgZG8gbm90IGFsbG93IGl0IHRvIGJlIGRlY2xhcmVkIHR3aWNlLgotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotY2xhc3MgYmFzaWNfaXN0cmVhbSA6IHZpcnR1YWwgcHVibGljIGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+IHsKLSAgdHlwZWRlZiBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gX1NlbGY7Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9NU1ZDKSAmJiAoX1NUTFBfTVNWQyA+PSAxMzAwICYmIF9TVExQX01TVkMgPD0gMTMxMCkKLSAgLy9leHBsaWNpdGVseSBkZWZpbmVkIGFzIHByaXZhdGUgdG8gYXZvaWQgd2FybmluZ3M6Ci0gIGJhc2ljX2lzdHJlYW0oX1NlbGYgY29uc3QmKTsKLSAgX1NlbGYmIG9wZXJhdG9yID0gKF9TZWxmIGNvbnN0Jik7Ci0jZW5kaWYKLQotcHVibGljOgotICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR5cGVzCi0gIHR5cGVkZWYgX0NoYXJUICAgICAgICAgICAgICAgICAgICAgY2hhcl90eXBlOwotICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmludF90eXBlIGludF90eXBlOwotICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OnBvc190eXBlIHBvc190eXBlOwotICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6Om9mZl90eXBlIG9mZl90eXBlOwotICB0eXBlZGVmIF9UcmFpdHMgICAgICAgICAgICAgICAgICAgIHRyYWl0c190eXBlOwotICB0eXBlZGVmIGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+ICAgICBfQmFzaWNfaW9zOwotCi0gIHR5cGVkZWYgYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz4mIChfU1RMUF9DQUxMICpfX2lvc19mbikoYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz4mKTsKLSAgdHlwZWRlZiBpb3NfYmFzZSYgKF9TVExQX0NBTEwgKl9faW9zX2Jhc2VfZm4pKGlvc19iYXNlJik7Ci0gIHR5cGVkZWYgX1NlbGYmIChfU1RMUF9DQUxMICpfX2lzdHJlYW1fZm4pKF9TZWxmJik7Ci0KLXB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IuCi0gIGV4cGxpY2l0IGJhc2ljX2lzdHJlYW0oYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fYnVmKSA6Ci0gICAgYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz4oKSwgX01fZ2NvdW50KDApIHsKLSAgICB0aGlzLT5pbml0KF9fYnVmKTsKLSAgfQotICB+YmFzaWNfaXN0cmVhbSgpIHt9OwotCi1wdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5lc3RlZCBzZW50cnkgY2xhc3MuCi0KLXB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gSG9va3MgZm9yIG1hbmlwdWxhdG9ycy4gIFRoZSBhcmd1bWVudHMgYXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZ1bmN0aW9uIHBvaW50ZXJzLgotICBfU2VsZiYgb3BlcmF0b3I+PiAoX19pc3RyZWFtX2ZuIF9fZikgeyByZXR1cm4gX19mKCp0aGlzKTsgfQotICBfU2VsZiYgb3BlcmF0b3I+PiAoX19pb3NfZm4gX19mKSB7ICBfX2YoKnRoaXMpOyByZXR1cm4gKnRoaXM7IH0KLSAgX1NlbGYmIG9wZXJhdG9yPj4gKF9faW9zX2Jhc2VfZm4gX19mKSB7IF9fZigqdGhpcyk7IHJldHVybiAqdGhpczsgfQotCi1wdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvcm1hdHRlZCBpbnB1dCBvZiBudW1iZXJzLgotICBfU2VsZiYgb3BlcmF0b3I+PiAoc2hvcnQmIF9fdmFsKTsKLSAgX1NlbGYmIG9wZXJhdG9yPj4gKGludCYgX192YWwpOwotICBfU2VsZiYgb3BlcmF0b3I+PiAodW5zaWduZWQgc2hvcnQmIF9fdmFsKTsKLSAgX1NlbGYmIG9wZXJhdG9yPj4gKHVuc2lnbmVkIGludCYgX192YWwpOwotICBfU2VsZiYgb3BlcmF0b3I+PiAobG9uZyYgX192YWwpOwotICBfU2VsZiYgb3BlcmF0b3I+PiAodW5zaWduZWQgbG9uZyYgX192YWwpOwotI2lmZGVmIF9TVExQX0xPTkdfTE9ORwotICBfU2VsZiYgb3BlcmF0b3I+PiAoX1NUTFBfTE9OR19MT05HJiBfX3ZhbCk7Ci0gIF9TZWxmJiBvcGVyYXRvcj4+ICh1bnNpZ25lZCBfU1RMUF9MT05HX0xPTkcmIF9fdmFsKTsKLSNlbmRpZgotICBfU2VsZiYgb3BlcmF0b3I+PiAoZmxvYXQmIF9fdmFsKTsKLSAgX1NlbGYmIG9wZXJhdG9yPj4gKGRvdWJsZSYgX192YWwpOwotIyBpZm5kZWYgX1NUTFBfTk9fTE9OR19ET1VCTEUKLSAgX1NlbGYmIG9wZXJhdG9yPj4gKGxvbmcgZG91YmxlJiBfX3ZhbCk7Ci0jIGVuZGlmCi0jIGlmbmRlZiBfU1RMUF9OT19CT09MCi0gIF9TZWxmJiBvcGVyYXRvcj4+IChib29sJiBfX3ZhbCk7Ci0jIGVuZGlmCi0gIF9TZWxmJiBvcGVyYXRvcj4+ICh2b2lkKiYgX192YWwpOwotCi1wdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvcHlpbmcgY2hhcmFjdGVycyBpbnRvIGEgc3RyZWFtYnVmLgotICBfU2VsZiYgb3BlcmF0b3I+PihiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiopOwotCi1wdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVuZm9ybWF0dGVkIGlucHV0LgotICBzdHJlYW1zaXplIGdjb3VudCgpIGNvbnN0IHsgcmV0dXJuIF9NX2djb3VudDsgfQotICBpbnRfdHlwZSBwZWVrKCk7Ci0KLXB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0KCkgZm9yIHNpbmdsZSBjaGFyYWN0ZXJzCi0gIGludF90eXBlIGdldCgpOwotICBfU2VsZiYgZ2V0KGNoYXJfdHlwZSYgX19jKTsKLQotcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQoKSBmb3IgY2hhcmFjdGVyIGFycmF5cy4KLSAgX1NlbGYmIGdldChjaGFyX3R5cGUqIF9fcywgc3RyZWFtc2l6ZSBfX24sIGNoYXJfdHlwZSBfX2RlbGltKTsKLSAgX1NlbGYmIGdldChjaGFyX3R5cGUqIF9fcywgc3RyZWFtc2l6ZSBfX24pCi0gICAgeyByZXR1cm4gZ2V0KF9fcywgX19uLCB0aGlzLT53aWRlbignXG4nKSk7IH0KLQotcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQoKSBmb3Igc3RyZWFtYnVmcwotICBfU2VsZiYgZ2V0KGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+JiBfX2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZSBfX2RlbGltKTsKLSAgX1NlbGYmIGdldChiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiYgX19idWYpCi0gICAgeyByZXR1cm4gZ2V0KF9fYnVmLCB0aGlzLT53aWRlbignXG4nKSk7IH0KLQotcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXRsaW5lKCkKLSAgX1NlbGYmIGdldGxpbmUoY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uLCBjaGFyX3R5cGUgZGVsaW0pOwotICBfU2VsZiYgZ2V0bGluZShjaGFyX3R5cGUqIF9fcywgc3RyZWFtc2l6ZSBfX24pCi0gICAgeyByZXR1cm4gZ2V0bGluZShfX3MsIF9fbiwgdGhpcy0+d2lkZW4oJ1xuJykpOyB9Ci0KLXB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVhZCgpLCByZWFkc29tZSgpLCBpZ25vcmUoKQotICBfU2VsZiYgaWdub3JlKCk7Ci0gIF9TZWxmJiBpZ25vcmUoc3RyZWFtc2l6ZSBfX24pOwotI2lmIChkZWZpbmVkIChfU1RMUF9NU1ZDKSAmJiBfU1RMUF9NU1ZDIDwgMTIwMCkKLSAgaW5saW5lCi0jZW5kaWYKLSAgX1NlbGYmIGlnbm9yZShzdHJlYW1zaXplIF9fbiwgaW50X3R5cGUgX19kZWxpbSk7Ci0KLSAgX1NlbGYmIHJlYWQoY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uKTsKLSAgc3RyZWFtc2l6ZSByZWFkc29tZShjaGFyX3R5cGUqIF9fcywgc3RyZWFtc2l6ZSBfX24pOwotCi1wdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHB1dGJhY2sKLSAgX1NlbGYmIHB1dGJhY2soY2hhcl90eXBlIF9fYyk7Ci0gIF9TZWxmJiB1bmdldCgpOwotCi1wdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBvc2l0aW9uaW5nIGFuZCBidWZmZXIgY29udHJvbC4KLSAgaW50IHN5bmMoKTsKLQotICBwb3NfdHlwZSB0ZWxsZygpOwotICBfU2VsZiYgc2Vla2cocG9zX3R5cGUgX19wb3MpOwotICBfU2VsZiYgc2Vla2cob2ZmX3R5cGUsIGlvc19iYXNlOjpzZWVrZGlyKTsKLQotcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIZWxwZXIgZnVuY3Rpb25zIGZvciBub24tbWVtYmVyIGV4dHJhY3RvcnMuCi0gIHZvaWQgX01fZm9ybWF0dGVkX2dldChfQ2hhclQmIF9fYyk7Ci0gIHZvaWQgX01fZm9ybWF0dGVkX2dldChfQ2hhclQqIF9fcyk7Ci0gIHZvaWQgX01fc2tpcF93aGl0ZXNwYWNlKGJvb2wgX19zZXRfZmFpbGJpdCk7Ci0KLXByaXZhdGU6ICAgICAgICAgICAgICAgICAgICAgICAgLy8gTnVtYmVyIG9mIGNoYXJhY3RlcnMgZXh0cmFjdGVkIGJ5IHRoZQotICBzdHJlYW1zaXplIF9NX2djb3VudDsgICAgICAgICAvLyBtb3N0IHJlY2VudCB1bmZvcm1hdHRlZCBpbnB1dCBmdW5jdGlvbi4KLQotcHVibGljOgotCi0jaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCkKLSAgLy8gSWYgd2UgYXJlIHVzaW5nIERMTCBzcGVjcywgd2UgaGF2ZSBub3QgdG8gdXNlIGlubmVyIGNsYXNzZXMKLSAgLy8gZW5kIGNsYXNzIGRlY2xhcmF0aW9uIGhlcmUKLSAgdHlwZWRlZiBfSXNlbnRyeTxfQ2hhclQsIF9UcmFpdHM+ICAgICAgc2VudHJ5OwotfTsKLSMgIGRlZmluZSBzZW50cnkgX0lzZW50cnkKLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Ci1jbGFzcyBfSXNlbnRyeSB7Ci0gIHR5cGVkZWYgX0lzZW50cnk8X0NoYXJULCBfVHJhaXRzPiBfU2VsZjsKLSMgZWxzZQotICBjbGFzcyBzZW50cnkgewotICAgIHR5cGVkZWYgc2VudHJ5IF9TZWxmOwotI2VuZGlmCi0KLSAgcHJpdmF0ZToKLSAgICBjb25zdCBib29sIF9NX29rOwotICAgIC8vICAgIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfTV9idWY7Ci0KLSAgcHVibGljOgotICAgIHR5cGVkZWYgX1RyYWl0cyB0cmFpdHNfdHlwZTsKLQotICAgIGV4cGxpY2l0IHNlbnRyeShiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXN0ciwKLSAgICAgICAgICAgICAgICAgICAgYm9vbCBfX25vc2tpcHdzID0gZmFsc2UpIDoKLSAgICAgIF9NX29rKChfX25vc2tpcHdzIHx8ICEoX19pc3RyLmZsYWdzKCkgJiBpb3NfYmFzZTo6c2tpcHdzKSkgPyBfTV9pbml0X25vc2tpcChfX2lzdHIpIDogX01faW5pdF9za2lwKF9faXN0cikgKQotICAgICAgLyogLCBfTV9idWYoX19pc3RyLnJkYnVmKCkpICovCi0gICAgICB7fQotCi0gICAgLy8gQ2FsbGluZyB0aGlzIGNvbnN0cnVjdG9yIGlzIHRoZSBzYW1lIGFzIGNhbGxpbmcgdGhlIHByZXZpb3VzIG9uZSB3aXRoCi0gICAgLy8gX19ub3NraXB3cyA9IHRydWUsIGV4Y2VwdCB0aGF0IGl0IGRvZXNuJ3QgcmVxdWlyZSBhIHJ1bnRpbWUgdGVzdC4KLSAgICBzZW50cnkoYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzdHIsIF9Ob19Ta2lwX1dTKSA6IC8qIF9NX2J1ZihfX2lzdHIucmRidWYoKSksICovCi0gICAgICBfTV9vayhfTV9pbml0X25vc2tpcChfX2lzdHIpKSB7fQotCi0gICAgfnNlbnRyeSgpIHt9Ci0KLSAgICBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gX01fb2s7IH0KLQotICBwcml2YXRlOiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERpc2FibGUgYXNzaWdubWVudCBhbmQgY29weSBjb25zdHJ1Y3Rvci4KLSAgICAvL0ltcGxlbWVudGF0aW9uIGlzIGhlcmUgb25seSB0byBhdm9pZCB3YXJuaW5nIHdpdGggc29tZSBjb21waWxlcnMuCi0gICAgc2VudHJ5KGNvbnN0IF9TZWxmJikgOiBfTV9vayhmYWxzZSkge30KLSAgICBfU2VsZiYgb3BlcmF0b3I9KGNvbnN0IF9TZWxmJikgeyByZXR1cm4gKnRoaXM7IH0KLSAgfTsKLQotIyBpZiBkZWZpbmVkIChfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUKQotIyAgdW5kZWYgc2VudHJ5Ci0jIGVsc2UKLSAgLy8gY2xvc2UgYmFzaWNfaXN0cmVhbSBjbGFzcyBkZWZpbml0aW9uIGhlcmUKLX07Ci0jIGVuZGlmCi0KLSMgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCkKLV9TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBfSXNlbnRyeTxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+OwotX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIGJhc2ljX2lzdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPjsKLSMgIGlmICEgZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkKLV9TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBfSXNlbnRyeTx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+OwotX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIGJhc2ljX2lzdHJlYW08d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPjsKLSMgIGVuZGlmCi0jIGVuZGlmIC8qIF9TVExQX1VTRV9URU1QTEFURV9FWFBPUlQgKi8KLQotLy8gTm9uLW1lbWJlciBjaGFyYWN0ZXIgYW5kIHN0cmluZyBleHRyYWN0b3IgZnVuY3Rpb25zLgotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KLWlubGluZSBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9TVExQX0NBTEwKLW9wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2luX3N0ciwgX0NoYXJUJiBfX2MpIHsKLSAgX19pbl9zdHIuX01fZm9ybWF0dGVkX2dldChfX2MpOwotICByZXR1cm4gX19pbl9zdHI7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHJhaXRzPgotaW5saW5lIGJhc2ljX2lzdHJlYW08Y2hhciwgX1RyYWl0cz4mIF9TVExQX0NBTEwKLW9wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxjaGFyLCBfVHJhaXRzPiYgX19pbl9zdHIsIHVuc2lnbmVkIGNoYXImIF9fYykgewotICBfX2luX3N0ci5fTV9mb3JtYXR0ZWRfZ2V0KF9fUkVJTlRFUlBSRVRfQ0FTVChjaGFyJixfX2MpKTsKLSAgcmV0dXJuIF9faW5fc3RyOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RyYWl0cz4KLWlubGluZSBiYXNpY19pc3RyZWFtPGNoYXIsIF9UcmFpdHM+JiBfU1RMUF9DQUxMCi1vcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08Y2hhciwgX1RyYWl0cz4mIF9faW5fc3RyLCBzaWduZWQgY2hhciYgX19jKSB7Ci0gIF9faW5fc3RyLl9NX2Zvcm1hdHRlZF9nZXQoX19SRUlOVEVSUFJFVF9DQVNUKGNoYXImLF9fYykpOwotICByZXR1cm4gX19pbl9zdHI7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Ci1pbmxpbmUgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfU1RMUF9DQUxMCi1vcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pbl9zdHIsIF9DaGFyVCogX19zKSB7Ci0gIF9faW5fc3RyLl9NX2Zvcm1hdHRlZF9nZXQoX19zKTsKLSAgcmV0dXJuIF9faW5fc3RyOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RyYWl0cz4KLWlubGluZSBiYXNpY19pc3RyZWFtPGNoYXIsIF9UcmFpdHM+JiBfU1RMUF9DQUxMCi1vcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08Y2hhciwgX1RyYWl0cz4mIF9faW5fc3RyLCB1bnNpZ25lZCBjaGFyKiBfX3MpIHsKLSAgX19pbl9zdHIuX01fZm9ybWF0dGVkX2dldChfX1JFSU5URVJQUkVUX0NBU1QoY2hhciosX19zKSk7Ci0gIHJldHVybiBfX2luX3N0cjsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9UcmFpdHM+Ci1pbmxpbmUgYmFzaWNfaXN0cmVhbTxjaGFyLCBfVHJhaXRzPiYgX1NUTFBfQ0FMTAotb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPGNoYXIsIF9UcmFpdHM+JiBfX2luX3N0ciwgc2lnbmVkIGNoYXIqIF9fcykgewotICBfX2luX3N0ci5fTV9mb3JtYXR0ZWRfZ2V0KF9fUkVJTlRFUlBSRVRfQ0FTVChjaGFyKixfX3MpKTsKLSAgcmV0dXJuIF9faW5fc3RyOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGlzdHJlYW0gbWFuaXB1bGF0b3IuCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfU1RMUF9DQUxMCi13cyhiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXN0cikgewotICBpZiAoIV9faXN0ci5lb2YoKSkgewotICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpzZW50cnkgICAgICBfU2VudHJ5OwotICAgIF9TZW50cnkgX19zZW50cnkoX19pc3RyLCBfTm9fU2tpcF9XUygpKTsgLy8gRG9uJ3Qgc2tpcCB3aGl0ZXNwYWNlLgotICAgIGlmIChfX3NlbnRyeSkKLSAgICAgIF9faXN0ci5fTV9za2lwX3doaXRlc3BhY2UoZmFsc2UpOwotICB9Ci0gIHJldHVybiBfX2lzdHI7Ci19Ci0KLS8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIGlzdHJlYW08Pjo6c2VudHJ5IGNvbnN0cnVjdG9yLgotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KLWlubGluZSBib29sIF9NX2luaXRfc2tpcChiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXN0cikgewotICBpZiAoX19pc3RyLmdvb2QoKSkgewotICAgIGlmIChfX2lzdHIudGllKCkpCi0gICAgICBfX2lzdHIudGllKCktPmZsdXNoKCk7Ci0KLSAgICBfX2lzdHIuX01fc2tpcF93aGl0ZXNwYWNlKHRydWUpOwotICB9Ci0KLSAgaWYgKCFfX2lzdHIuZ29vZCgpKSB7Ci0gICAgX19pc3RyLnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0gZWxzZQotICAgIHJldHVybiB0cnVlOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotaW5saW5lIGJvb2wgX01faW5pdF9ub3NraXAoYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzdHIpIHsKLSAgaWYgKF9faXN0ci5nb29kKCkpIHsKLSAgICBpZiAoX19pc3RyLnRpZSgpKQotICAgICAgX19pc3RyLnRpZSgpLT5mbHVzaCgpOwotCi0gICAgaWYgKCFfX2lzdHIucmRidWYoKSkKLSAgICAgIF9faXN0ci5zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKLSAgfQotICBlbHNlCi0gICAgX19pc3RyLnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKLSAgcmV0dXJuIF9faXN0ci5nb29kKCk7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ2xhc3MgaW9zdHJlYW0uCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotY2xhc3MgYmFzaWNfaW9zdHJlYW0KLSAgOiBwdWJsaWMgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+LAotICAgIHB1YmxpYyBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4KLXsKLXB1YmxpYzoKLSAgdHlwZWRlZiBiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPiBfQmFzaWNfaW9zOwotCi0gIGV4cGxpY2l0IGJhc2ljX2lvc3RyZWFtKGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX2J1Zik7Ci0gIHZpcnR1YWwgfmJhc2ljX2lvc3RyZWFtKCk7Ci19OwotCi0jIGlmIGRlZmluZWQgKF9TVExQX1VTRV9URU1QTEFURV9FWFBPUlQpCi1fU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgYmFzaWNfaW9zdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPjsKLQotIyAgaWYgISBkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQotX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIGJhc2ljX2lvc3RyZWFtPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID47Ci0jICBlbmRpZgotIyBlbmRpZiAvKiBfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUICovCi0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Ci1iYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX1NUTFBfQ0FMTCBfTV9nZXRfaXN0cmVhbWJ1ZihiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXN0cikKLXsgcmV0dXJuIF9faXN0ci5yZGJ1ZigpOyB9Ci0KLV9TVExQX0VORF9OQU1FU1BBQ0UKLQotI2lmIGRlZmluZWQgKF9TVExQX0VYUE9TRV9TVFJFQU1fSU1QTEVNRU5UQVRJT04pICYmICFkZWZpbmVkIChfU1RMUF9MSU5LX1RJTUVfSU5TVEFOVElBVElPTikKLSMgIGluY2x1ZGUgPHN0bC9faXN0cmVhbS5jPgotI2VuZGlmCi0KLSNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9JU1RSRUFNICovCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX2lzdHJlYW1idWZfaXRlcmF0b3IuaCBiL3N0bC9faXN0cmVhbWJ1Zl9pdGVyYXRvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTU3OGViLi4wMDAwMDAwCi0tLSBhL3N0bC9faXN0cmVhbWJ1Zl9pdGVyYXRvci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogQm9yaXMgRm9taXRjaGV2Ci0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICovCi0vLyBXQVJOSU5HOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBDKysKLS8vIHN0YW5kYXJkIGxpYnJhcnkgaGVhZGVycy4gIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIHRoaXMgaGVhZGVyCi0vLyBmaWxlIGRpcmVjdGx5LgotCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfSVNUUkVBTUJVRl9JVEVSQVRPUl9ICi0jZGVmaW5lIF9TVExQX0lOVEVSTkFMX0lTVFJFQU1CVUZfSVRFUkFUT1JfSAotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0lURVJBVE9SX0JBU0VfSAotIyBpbmNsdWRlIDxzdGwvX2l0ZXJhdG9yX2Jhc2UuaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX1NUUkVBTUJVRgotIyBpbmNsdWRlIDxzdGwvX3N0cmVhbWJ1Zi5oPgotI2VuZGlmCi0KLV9TVExQX0JFR0lOX05BTUVTUEFDRQotCi0vLyBkZWZpbmVkIGluIF9pc3RyZWFtLmgKLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Ci1leHRlcm4gYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9TVExQX0NBTEwgX01fZ2V0X2lzdHJlYW1idWYoYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiApIDsKLQotLy8gV2UgZG8gbm90IHJlYWQgYW55IGNoYXJhY3RlcnMgdW50aWwgb3BlcmF0b3IqIGlzIGNhbGxlZC4gb3BlcmF0b3IqIGNhbGxzIHNnZXRjCi0vLyB1bmxlc3MgdGhlIGl0ZXJhdG9yIGlzIHVuY2hhbmdlZCBmcm9tIHRoZSBsYXN0IGNhbGwgaW4gd2hpY2ggY2FzZSBhIGNhY2hlZCB2YWx1ZSBpcwotLy8gdXNlZC4gQ2FsbHMgdG8gb3BlcmF0b3IrKyB1c2Ugc2J1bXBjLgotCi10ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Ci1jbGFzcyBpc3RyZWFtYnVmX2l0ZXJhdG9yIDoKLSAgcHVibGljIGl0ZXJhdG9yPGlucHV0X2l0ZXJhdG9yX3RhZywgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzOjpvZmZfdHlwZSwgX0NoYXJUKiwgX0NoYXJUJj4KLXsKLXB1YmxpYzoKLSAgdHlwZWRlZiBfQ2hhclQgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX3R5cGU7Ci0gIHR5cGVkZWYgX1RyYWl0cyAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3R5cGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6aW50X3R5cGUgICAgICAgaW50X3R5cGU7Ci0gIHR5cGVkZWYgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4gc3RyZWFtYnVmX3R5cGU7Ci0gIHR5cGVkZWYgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICAgaXN0cmVhbV90eXBlOwotCi0gIHR5cGVkZWYgaW5wdXRfaXRlcmF0b3JfdGFnICAgICAgICAgICAgICAgaXRlcmF0b3JfY2F0ZWdvcnk7Ci0gIHR5cGVkZWYgX0NoYXJUICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpvZmZfdHlwZSAgICAgICBkaWZmZXJlbmNlX3R5cGU7Ci0gIHR5cGVkZWYgY29uc3QgX0NoYXJUKiAgICAgICAgICAgICAgICAgICAgcG9pbnRlcjsKLSAgdHlwZWRlZiBjb25zdCBfQ2hhclQmICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2U7Ci0KLXB1YmxpYzoKLSAgaXN0cmVhbWJ1Zl9pdGVyYXRvcihzdHJlYW1idWZfdHlwZSogX19wID0gMCkgeyB0aGlzLT5fTV9pbml0KF9fcCk7IH0KLSAgLy8gIGlzdHJlYW1idWZfaXRlcmF0b3IoYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzKSB7IHRoaXMtPl9NX2luaXQoX01fZ2V0X2lzdHJlYW1idWYoX19pcykpOyB9Ci0gIGlubGluZSBpc3RyZWFtYnVmX2l0ZXJhdG9yKGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcyk7Ci0KLSAgY2hhcl90eXBlIG9wZXJhdG9yKigpIGNvbnN0IHsgdGhpcy0+X01fZ2V0YygpOyByZXR1cm4gX01fYzsgfQotICBpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVCwgX1RyYWl0cz4mIG9wZXJhdG9yKysoKQotICAgICAgewotICAgICAgICBfTV9idWYtPnNidW1wYygpOwotICAgICAgICBfTV9oYXZlX2MgPSBmYWxzZTsKLSAgICAgICAgcmV0dXJuICp0aGlzOwotICAgICAgfQotICBpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVCwgX1RyYWl0cz4gIG9wZXJhdG9yKysoaW50KTsKLQotICBib29sIGVxdWFsKGNvbnN0IGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJULCBfVHJhaXRzPiYgX19pKSBjb25zdCB7Ci0gICAgaWYgKHRoaXMtPl9NX2J1ZikKLSAgICAgIHRoaXMtPl9NX2dldGMoKTsKLSAgICBpZiAoX19pLl9NX2J1ZikKLSAgICAgIF9faS5fTV9nZXRjKCk7Ci0gICAgcmV0dXJuIHRoaXMtPl9NX2VvZiA9PSBfX2kuX01fZW9mOwotICB9Ci0KLXByaXZhdGU6Ci0gIHZvaWQgX01faW5pdChzdHJlYW1idWZfdHlwZSogX19wKSB7Ci0gICAgX01fYnVmID0gX19wOwotICAgIF9NX2VvZiA9IChfX3AgPT0gMCk7Ci0gICAgX01faGF2ZV9jID0gZmFsc2U7Ci0gIH0KLQotICB2b2lkIF9NX2dldGMoKSBjb25zdCB7Ci0gICAgaWYgKF9NX2hhdmVfYykKLSAgICAgIHJldHVybjsKLSAgICBpbnRfdHlwZSBfX2MgPSBfTV9idWYtPnNnZXRjKCk7Ci0jIGlmICFkZWZpbmVkIChfU1RMUF9ORUVEX01VVEFCTEUpIC8qICYmICEgZGVmaW5lZCAoX19TVU5QUk9fQ0MpICovCi0gICAgX01fYyA9IHRyYWl0c190eXBlOjp0b19jaGFyX3R5cGUoX19jKTsKLSAgICBfTV9lb2YgPSB0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19jLCB0cmFpdHNfdHlwZTo6ZW9mKCkpOwotICAgIF9NX2hhdmVfYyA9IHRydWU7Ci0jIGVsc2UKLSAgICB0eXBlZGVmIGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJULF9UcmFpdHM+IF9TZWxmOwotICAgIF9TZWxmKiBfX3RoYXQgPSBfX0NPTlNUX0NBU1QoX1NlbGYqLCB0aGlzKTsKLSAgICBfX3RoYXQtPl9NX2MgPSBfX1NUQVRJQ19DQVNUKF9DaGFyVCwgdHJhaXRzX3R5cGU6OnRvX2NoYXJfdHlwZShfX2MpKTsKLSAgICBfX3RoYXQtPl9NX2VvZiA9IHRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX2MsIHRyYWl0c190eXBlOjplb2YoKSk7Ci0gICAgX190aGF0LT5fTV9oYXZlX2MgPSB0cnVlOwotIyBlbmRpZgotICB9Ci0KLXByaXZhdGU6Ci0gIHN0cmVhbWJ1Zl90eXBlKiBfTV9idWY7Ci0gIG11dGFibGUgX0NoYXJUIF9NX2M7Ci0gIG11dGFibGUgYm9vbCBfTV9lb2Y7Ci0gIG11dGFibGUgYm9vbCBfTV9oYXZlX2M7Ci19OwotCi10ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Ci1pbmxpbmUgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQsIF9UcmFpdHM+Ojppc3RyZWFtYnVmX2l0ZXJhdG9yKGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcykKLXsgdGhpcy0+X01faW5pdChfTV9nZXRfaXN0cmVhbWJ1ZihfX2lzKSk7IH0KLQotdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotaW5saW5lIGJvb2wgX1NUTFBfQ0FMTCBvcGVyYXRvcj09KGNvbnN0IGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJULCBfVHJhaXRzPiYgX194LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJULCBfVHJhaXRzPiYgX195KSB7Ci0gIHJldHVybiBfX3guZXF1YWwoX195KTsKLX0KLQotI2lmZGVmIF9TVExQX1VTRV9TRVBBUkFURV9SRUxPUFNfTkFNRVNQQUNFCi0KLXRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KLWlubGluZSBib29sIF9TVExQX0NBTEwgb3BlcmF0b3IhPShjb25zdCBpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVCwgX1RyYWl0cz4mIF9feCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVCwgX1RyYWl0cz4mIF9feSkgewotICByZXR1cm4gIV9feC5lcXVhbChfX3kpOwotfQotCi0jZW5kaWYgLyogX1NUTFBfVVNFX1NFUEFSQVRFX1JFTE9QU19OQU1FU1BBQ0UgKi8KLQotIyBpZiBkZWZpbmVkIChfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUKQotX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIGlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPjsKLSMgIGlmIGRlZmluZWQgKElOU1RBTlRJQVRFX1dJREVfU1RSRUFNUykKLV9TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBpc3RyZWFtYnVmX2l0ZXJhdG9yPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID47Ci0jICBlbmRpZgotIyBlbmRpZiAvKiBfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUICovCi0KLSMgaWZkZWYgX1NUTFBfVVNFX09MRF9IUF9JVEVSQVRPUl9RVUVSSUVTCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotaW5saW5lIGlucHV0X2l0ZXJhdG9yX3RhZyBfU1RMUF9DQUxMIGl0ZXJhdG9yX2NhdGVnb3J5KGNvbnN0IGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJULCBfVHJhaXRzPiYpIHsgcmV0dXJuIGlucHV0X2l0ZXJhdG9yX3RhZygpOyB9Ci10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotaW5saW5lIHN0cmVhbW9mZiogX1NUTFBfQ0FMTAotZGlzdGFuY2VfdHlwZShjb25zdCBpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVCwgX1RyYWl0cz4mKSB7IHJldHVybiAoc3RyZWFtb2ZmKikwOyB9Ci10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotaW5saW5lIF9DaGFyVCogX1NUTFBfQ0FMTCB2YWx1ZV90eXBlKGNvbnN0IGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJULCBfVHJhaXRzPiYpIHsgcmV0dXJuIChfQ2hhclQqKTA7IH0KLSMgZW5kaWYKLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KLWlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJULCBfVHJhaXRzPgotaXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQsIF9UcmFpdHM+OjpvcGVyYXRvcisrKGludCkgewotICBfTV9nZXRjKCk7IC8vIF9fdG1wIHNob3VsZCBhdm9pZCBhbnkgZnV0dXJlIGFjdGlvbnMgdW5kZXIKLSAgLy8gdW5kZXJsaW5lZCBidWZmZXItLS1kdXJpbmcgY2FsbCBvZiBvcGVyYXRvciAqKCkKLSAgLy8gKGR1ZSB0byBidWZmZXIgZm9yICp0aGlzIGFuZCBfX3RtcCBhcmUgdGhlIHNhbWUpLgotICBpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVCwgX1RyYWl0cz4gX190bXAgPSAqdGhpczsKLSAgX01fYnVmLT5zYnVtcGMoKTsKLSAgX01faGF2ZV9jID0gZmFsc2U7Ci0gIHJldHVybiBfX3RtcDsKLX0KLQotX1NUTFBfRU5EX05BTUVTUEFDRQotCi0jZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfSVNUUkVBTUJVRl9JVEVSQVRPUl9IICovCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6Ci0KZGlmZiAtLWdpdCBhL3N0bC9faXRlcmF0b3IuaCBiL3N0bC9faXRlcmF0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQyM2ZhYS4uMDAwMDAwMAotLS0gYS9zdGwvX2l0ZXJhdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTQKLSAqIEhld2xldHQtUGFja2FyZCBDb21wYW55Ci0gKgotICogQ29weXJpZ2h0IChjKSAxOTk2LTE5OTgKLSAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NwotICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogQm9yaXMgRm9taXRjaGV2Ci0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICovCi0KLS8qIE5PVEU6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIFNUTCBoZWFkZXJzLgotICogICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4KLSAqLwotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0lURVJBVE9SX0gKLSNkZWZpbmUgX1NUTFBfSU5URVJOQUxfSVRFUkFUT1JfSAotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0lURVJBVE9SX0JBU0VfSAotIyAgaW5jbHVkZSA8c3RsL19pdGVyYXRvcl9iYXNlLmg+Ci0jZW5kaWYKLQotX1NUTFBfQkVHSU5fTkFNRVNQQUNFCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQotLy8gVGhpcyBpcyB0aGUgbmV3IHZlcnNpb24gb2YgcmV2ZXJzZV9pdGVyYXRvciwgYXMgZGVmaW5lZCBpbiB0aGUKLS8vICBkcmFmdCBDKysgc3RhbmRhcmQuICBJdCByZWxpZXMgb24gdGhlIGl0ZXJhdG9yX3RyYWl0cyB0ZW1wbGF0ZSwKLS8vICB3aGljaCBpbiB0dXJuIHJlbGllcyBvbiBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uLiAgVGhlIGNsYXNzCi0vLyAgcmV2ZXJzZV9iaWRpcmVjdGlvbmFsX2l0ZXJhdG9yIGlzIG5vIGxvbmdlciBwYXJ0IG9mIHRoZSBkcmFmdAotLy8gIHN0YW5kYXJkLCBidXQgaXQgaXMgcmV0YWluZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCi0KLXRlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+Ci1jbGFzcyByZXZlcnNlX2l0ZXJhdG9yIDoKLSAgcHVibGljIGl0ZXJhdG9yPHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSXRlcmF0b3I+OjppdGVyYXRvcl9jYXRlZ29yeSwKLSAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSXRlcmF0b3I+Ojp2YWx1ZV90eXBlLAotICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZSwKLSAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSXRlcmF0b3I+Ojpwb2ludGVyLAotICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcj46OnJlZmVyZW5jZT4gewotcHJvdGVjdGVkOgotICBfSXRlcmF0b3IgY3VycmVudDsKLSAgdHlwZWRlZiByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4gX1NlbGY7Ci1wdWJsaWM6Ci0gIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcj46Oml0ZXJhdG9yX2NhdGVnb3J5ICBpdGVyYXRvcl9jYXRlZ29yeTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0l0ZXJhdG9yPjo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOwotICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOwotICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSXRlcmF0b3I+Ojpwb2ludGVyIHBvaW50ZXI7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcj46OnJlZmVyZW5jZSByZWZlcmVuY2U7Ci0gIHR5cGVkZWYgX0l0ZXJhdG9yIGl0ZXJhdG9yX3R5cGU7Ci1wdWJsaWM6Ci0gIHJldmVyc2VfaXRlcmF0b3IoKSB7fQotICBleHBsaWNpdCByZXZlcnNlX2l0ZXJhdG9yKGl0ZXJhdG9yX3R5cGUgX194KSA6IGN1cnJlbnQoX194KSB7fQotICByZXZlcnNlX2l0ZXJhdG9yKGNvbnN0IF9TZWxmJiBfX3gpIDogY3VycmVudChfX3guY3VycmVudCkge30KLSAgX1NlbGYmIG9wZXJhdG9yID0gKGNvbnN0IF9TZWxmJiBfX3gpIHsgY3VycmVudCA9IF9feC5iYXNlKCk7IHJldHVybiAqdGhpczsgfQotIyAgaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKLSAgdGVtcGxhdGUgPGNsYXNzIF9JdGVyPgotICByZXZlcnNlX2l0ZXJhdG9yKGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X0l0ZXI+JiBfX3gpIDogY3VycmVudChfX3guYmFzZSgpKSB7fQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXI+Ci0gIF9TZWxmJiBvcGVyYXRvciA9IChjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyPiYgX194KSB7IGN1cnJlbnQgPSBfX3guYmFzZSgpOyByZXR1cm4gKnRoaXM7IH0KLSMgIGVuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KLQotICBpdGVyYXRvcl90eXBlIGJhc2UoKSBjb25zdCB7IHJldHVybiBjdXJyZW50OyB9Ci0gIHJlZmVyZW5jZSBvcGVyYXRvciooKSBjb25zdCB7Ci0gICAgX0l0ZXJhdG9yIF9fdG1wID0gY3VycmVudDsKLSAgICByZXR1cm4gKi0tX190bXA7Ci0gIH0KLSAgX1NUTFBfREVGSU5FX0FSUk9XX09QRVJBVE9SCi0gIF9TZWxmJiBvcGVyYXRvcisrKCkgewotICAgIC0tY3VycmVudDsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgX1NlbGYgb3BlcmF0b3IrKyhpbnQpIHsKLSAgICBfU2VsZiBfX3RtcCA9ICp0aGlzOwotICAgIC0tY3VycmVudDsKLSAgICByZXR1cm4gX190bXA7Ci0gIH0KLSAgX1NlbGYmIG9wZXJhdG9yLS0oKSB7Ci0gICAgKytjdXJyZW50OwotICAgIHJldHVybiAqdGhpczsKLSAgfQotICBfU2VsZiBvcGVyYXRvci0tKGludCkgewotICAgIF9TZWxmIF9fdG1wID0gKnRoaXM7Ci0gICAgKytjdXJyZW50OwotICAgIHJldHVybiBfX3RtcDsKLSAgfQotCi0gIF9TZWxmIG9wZXJhdG9yKyhkaWZmZXJlbmNlX3R5cGUgX19uKSBjb25zdCB7IHJldHVybiBfU2VsZihjdXJyZW50IC0gX19uKTsgfQotICBfU2VsZiYgb3BlcmF0b3IrPShkaWZmZXJlbmNlX3R5cGUgX19uKSB7Ci0gICAgY3VycmVudCAtPSBfX247Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIF9TZWxmIG9wZXJhdG9yLShkaWZmZXJlbmNlX3R5cGUgX19uKSBjb25zdCB7IHJldHVybiBfU2VsZihjdXJyZW50ICsgX19uKTsgfQotICBfU2VsZiYgb3BlcmF0b3ItPShkaWZmZXJlbmNlX3R5cGUgX19uKSB7Ci0gICAgY3VycmVudCArPSBfX247Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIHJlZmVyZW5jZSBvcGVyYXRvcltdKGRpZmZlcmVuY2VfdHlwZSBfX24pIGNvbnN0IHsgcmV0dXJuICooKnRoaXMgKyBfX24pOyB9Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgotaW5saW5lIGJvb2wgIF9TVExQX0NBTEwgb3BlcmF0b3I9PShjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4mIF9feCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3kpCi17IHJldHVybiBfX3guYmFzZSgpID09IF9feS5iYXNlKCk7IH0KLQotdGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KLWlubGluZSBib29sIF9TVExQX0NBTEwgb3BlcmF0b3I8KGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X0l0ZXJhdG9yPiYgX194LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3kpCi17IHJldHVybiBfX3kuYmFzZSgpIDwgX194LmJhc2UoKTsgfQotCi0jICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfU0VQQVJBVEVfUkVMT1BTX05BTUVTUEFDRSkKLXRlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+Ci1pbmxpbmUgYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yIT0oY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3kpCi17IHJldHVybiAhKF9feCA9PSBfX3kpOyB9Ci0KLXRlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+Ci1pbmxpbmUgYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yPihjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4mIF9feCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X0l0ZXJhdG9yPiYgX195KQoteyByZXR1cm4gX195IDwgX194OyB9Ci0KLXRlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+Ci1pbmxpbmUgYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yPD0oY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3kpCi17IHJldHVybiAhKF9feSA8IF9feCk7IH0KLQotdGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KLWlubGluZSBib29sIF9TVExQX0NBTEwgb3BlcmF0b3I+PShjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4mIF9feCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4mIF9feSkKLXsgcmV0dXJuICEoX194IDwgX195KTsgfQotIyAgZW5kaWYgLyogX1NUTFBfVVNFX1NFUEFSQVRFX1JFTE9QU19OQU1FU1BBQ0UgKi8KLQotdGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KLSMgIGlmIGRlZmluZWQgKF9fU1VOUFJPX0NDKQotaW5saW5lIHB0cmRpZmZfdCBfU1RMUF9DQUxMCi0jICBlbHNlCi1pbmxpbmUgdHlwZW5hbWUgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUgX1NUTFBfQ0FMTAotIyAgZW5kaWYKLW9wZXJhdG9yLShjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4mIF9feCwKLSAgICAgICAgICBjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4mIF9feSkKLXsgcmV0dXJuIF9feS5iYXNlKCkgLSBfX3guYmFzZSgpOyB9Ci0KLXRlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3IsIGNsYXNzIF9EaWZmZXJlbmNlVHlwZT4KLWlubGluZSByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4gIF9TVExQX0NBTEwKLW9wZXJhdG9yKyhfRGlmZmVyZW5jZVR5cGUgbixjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4mIHgpCi17IHJldHVybiB4Lm9wZXJhdG9yKyhuKTsgfQotI2VuZGlmCi0KLXRlbXBsYXRlIDxjbGFzcyBfQ29udGFpbmVyPgotY2xhc3MgYmFja19pbnNlcnRfaXRlcmF0b3IKLSAgOiBwdWJsaWMgaXRlcmF0b3I8b3V0cHV0X2l0ZXJhdG9yX3RhZywgdm9pZCwgdm9pZCwgdm9pZCwgdm9pZD4gewotICB0eXBlZGVmIGJhY2tfaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+IF9TZWxmOwotcHJvdGVjdGVkOgotICAvL2MgaXMgYSBTdGFuZGFyZCBuYW1lICgyNC40LjIuMSksIGRvIG5vIG1ha2UgaXQgU1RMcG9ydCBuYW1pbmcgY29udmVudGlvbiBjb21wbGlhbnQuCi0gIF9Db250YWluZXIgKmNvbnRhaW5lcjsKLXB1YmxpYzoKLSAgdHlwZWRlZiBfQ29udGFpbmVyICAgICAgICAgIGNvbnRhaW5lcl90eXBlOwotICB0eXBlZGVmIG91dHB1dF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7Ci0KLSAgZXhwbGljaXQgYmFja19pbnNlcnRfaXRlcmF0b3IoX0NvbnRhaW5lciYgX194KSA6IGNvbnRhaW5lcigmX194KSB7fQotCi0gIF9TZWxmJiBvcGVyYXRvcj0oY29uc3QgX1NlbGYmIF9fb3RoZXIpIHsKLSAgICBjb250YWluZXIgPSBfX290aGVyLmNvbnRhaW5lcjsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgX1NlbGYmIG9wZXJhdG9yPShjb25zdCB0eXBlbmFtZSBfQ29udGFpbmVyOjp2YWx1ZV90eXBlJiBfX3ZhbCkgewotICAgIGNvbnRhaW5lci0+cHVzaF9iYWNrKF9fdmFsKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgX1NlbGYmIG9wZXJhdG9yKigpIHsgcmV0dXJuICp0aGlzOyB9Ci0gIF9TZWxmJiBvcGVyYXRvcisrKCkgeyByZXR1cm4gKnRoaXM7IH0KLSAgX1NlbGYgIG9wZXJhdG9yKysoaW50KSB7IHJldHVybiAqdGhpczsgfQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIF9Db250YWluZXI+Ci1pbmxpbmUgYmFja19pbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4gIF9TVExQX0NBTEwgYmFja19pbnNlcnRlcihfQ29udGFpbmVyJiBfX3gpCi17IHJldHVybiBiYWNrX2luc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPihfX3gpOyB9Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ29udGFpbmVyPgotY2xhc3MgZnJvbnRfaW5zZXJ0X2l0ZXJhdG9yCi0gIDogcHVibGljIGl0ZXJhdG9yPG91dHB1dF9pdGVyYXRvcl90YWcsIHZvaWQsIHZvaWQsIHZvaWQsIHZvaWQ+IHsKLSAgdHlwZWRlZiBmcm9udF9pbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4gX1NlbGY7Ci1wcm90ZWN0ZWQ6Ci0gIC8vYyBpcyBhIFN0YW5kYXJkIG5hbWUgKDI0LjQuMi4zKSwgZG8gbm8gbWFrZSBpdCBTVExwb3J0IG5hbWluZyBjb252ZW50aW9uIGNvbXBsaWFudC4KLSAgX0NvbnRhaW5lciAqY29udGFpbmVyOwotcHVibGljOgotICB0eXBlZGVmIF9Db250YWluZXIgICAgICAgICAgY29udGFpbmVyX3R5cGU7Ci0gIHR5cGVkZWYgb3V0cHV0X2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKLSAgZXhwbGljaXQgZnJvbnRfaW5zZXJ0X2l0ZXJhdG9yKF9Db250YWluZXImIF9feCkgOiBjb250YWluZXIoJl9feCkge30KLQotICBfU2VsZiYgb3BlcmF0b3I9KGNvbnN0IF9TZWxmJiBfX290aGVyKSB7Ci0gICAgY29udGFpbmVyID0gX19vdGhlci5jb250YWluZXI7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIF9TZWxmJiBvcGVyYXRvcj0oY29uc3QgdHlwZW5hbWUgX0NvbnRhaW5lcjo6dmFsdWVfdHlwZSYgX192YWwpIHsKLSAgICBjb250YWluZXItPnB1c2hfZnJvbnQoX192YWwpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotICBfU2VsZiYgb3BlcmF0b3IqKCkgeyByZXR1cm4gKnRoaXM7IH0KLSAgX1NlbGYmIG9wZXJhdG9yKysoKSB7IHJldHVybiAqdGhpczsgfQotICBfU2VsZiAgb3BlcmF0b3IrKyhpbnQpIHsgcmV0dXJuICp0aGlzOyB9Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NvbnRhaW5lcj4KLWlubGluZSBmcm9udF9pbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4gIF9TVExQX0NBTEwgZnJvbnRfaW5zZXJ0ZXIoX0NvbnRhaW5lciYgX194KQoteyByZXR1cm4gZnJvbnRfaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+KF9feCk7IH0KLQotdGVtcGxhdGUgPGNsYXNzIF9Db250YWluZXI+Ci1jbGFzcyBpbnNlcnRfaXRlcmF0b3IKLSAgOiBwdWJsaWMgaXRlcmF0b3I8b3V0cHV0X2l0ZXJhdG9yX3RhZywgdm9pZCwgdm9pZCwgdm9pZCwgdm9pZD4gewotICB0eXBlZGVmIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiBfU2VsZjsKLXByb3RlY3RlZDoKLSAgLy9jb250YWluZXIgaXMgYSBTdGFuZGFyZCBuYW1lICgyNC40LjIuNSksIGRvIG5vIG1ha2UgaXQgU1RMcG9ydCBuYW1pbmcgY29udmVudGlvbiBjb21wbGlhbnQuCi0gIF9Db250YWluZXIgKmNvbnRhaW5lcjsKLSAgdHlwZW5hbWUgX0NvbnRhaW5lcjo6aXRlcmF0b3IgX01faXRlcjsKLXB1YmxpYzoKLSAgdHlwZWRlZiBfQ29udGFpbmVyICAgICAgICAgIGNvbnRhaW5lcl90eXBlOwotICB0eXBlZGVmIG91dHB1dF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7Ci0gIGluc2VydF9pdGVyYXRvcihfQ29udGFpbmVyJiBfX3gsIHR5cGVuYW1lIF9Db250YWluZXI6Oml0ZXJhdG9yIF9faSkKLSAgICA6IGNvbnRhaW5lcigmX194KSwgX01faXRlcihfX2kpIHt9Ci0KLSAgX1NlbGYmIG9wZXJhdG9yPShfU2VsZiBjb25zdCYgX19vdGhlcikgewotICAgIGNvbnRhaW5lciA9IF9fb3RoZXIuY29udGFpbmVyOwotICAgIF9NX2l0ZXIgPSBfX290aGVyLl9NX2l0ZXI7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIF9TZWxmJiBvcGVyYXRvcj0oY29uc3QgdHlwZW5hbWUgX0NvbnRhaW5lcjo6dmFsdWVfdHlwZSYgX192YWwpIHsKLSAgICBfTV9pdGVyID0gY29udGFpbmVyLT5pbnNlcnQoX01faXRlciwgX192YWwpOwotICAgICsrX01faXRlcjsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgX1NlbGYmIG9wZXJhdG9yKigpIHsgcmV0dXJuICp0aGlzOyB9Ci0gIF9TZWxmJiBvcGVyYXRvcisrKCkgeyByZXR1cm4gKnRoaXM7IH0KLSAgX1NlbGYmIG9wZXJhdG9yKysoaW50KSB7IHJldHVybiAqdGhpczsgfQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIF9Db250YWluZXIsIGNsYXNzIF9JdGVyYXRvcj4KLWlubGluZSBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4gIF9TVExQX0NBTEwKLWluc2VydGVyKF9Db250YWluZXImIF9feCwgX0l0ZXJhdG9yIF9faSkgewotICB0eXBlZGVmIHR5cGVuYW1lIF9Db250YWluZXI6Oml0ZXJhdG9yIF9faXRlcjsKLSAgcmV0dXJuIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPihfX3gsIF9faXRlcihfX2kpKTsKLX0KLQotX1NUTFBfRU5EX05BTUVTUEFDRQotCi0jaWYgISBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKSB8fCBkZWZpbmVkIChfU1RMUF9VU0VfT0xEX0hQX0lURVJBVE9SX1FVRVJJRVMpCi0jICBpbmNsdWRlIDxzdGwvX2l0ZXJhdG9yX29sZC5oPgotI2VuZGlmCi0KLSNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9JVEVSQVRPUl9IICovCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX2l0ZXJhdG9yX2Jhc2UuaCBiL3N0bC9faXRlcmF0b3JfYmFzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWZlNDkyLi4wMDAwMDAwCi0tLSBhL3N0bC9faXRlcmF0b3JfYmFzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQxICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk0Ci0gKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ni0xOTk4Ci0gKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTcKLSAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0vKiBOT1RFOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBTVEwgaGVhZGVycy4KLSAqICAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuCi0gKi8KLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9JVEVSQVRPUl9CQVNFX0gKLSNkZWZpbmUgX1NUTFBfSU5URVJOQUxfSVRFUkFUT1JfQkFTRV9ICi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1NURERFRgotIyAgaW5jbHVkZSA8c3RsL19jc3RkZGVmLmg+Ci0jZW5kaWYKLQotLy8jIGlmIGRlZmluZWQgIChfU1RMUF9JTVBPUlRfVkVORE9SX0NTVEQpICYmICEgZGVmaW5lZCAoX1NUTFBfVkVORE9SX0dMT0JBTF9DU1REKQotLy9fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLS8vdXNpbmcgbmFtZXNwYWNlIF9TVExQX1ZFTkRPUl9DU1REOwotLy9fU1RMUF9FTkRfTkFNRVNQQUNFCi0vLyNlbmRpZiAvKiBfU1RMUF9JTVBPUlRfVkVORE9SX0NTVEQgKi8KLQotI2lmICFkZWZpbmVkKF9TVExQX1VTRV9PTERfSFBfSVRFUkFUT1JfUVVFUklFUykgJiYgIWRlZmluZWQoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikKLSMgIGlmbmRlZiBfU1RMUF9UWVBFX1RSQUlUU19ICi0jICAgIGluY2x1ZGUgPHN0bC90eXBlX3RyYWl0cy5oPgotIyAgZW5kaWYKLSNlbmRpZgotCi1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLQotc3RydWN0IGlucHV0X2l0ZXJhdG9yX3RhZyB7fTsKLXN0cnVjdCBvdXRwdXRfaXRlcmF0b3JfdGFnIHt9Owotc3RydWN0IGZvcndhcmRfaXRlcmF0b3JfdGFnIDogcHVibGljIGlucHV0X2l0ZXJhdG9yX3RhZyB7fTsKLXN0cnVjdCBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZyA6IHB1YmxpYyBmb3J3YXJkX2l0ZXJhdG9yX3RhZyB7fTsKLXN0cnVjdCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyA6IHB1YmxpYyBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZyB7fTsKLQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NhdGVnb3J5LCBjbGFzcyBfVHAsIF9TVExQX0RGTF9UTVBMX1BBUkFNKF9EaXN0YW5jZSxwdHJkaWZmX3QpLAotICAgICAgICAgIF9TVExQX0RGTF9UTVBMX1BBUkFNKF9Qb2ludGVyLF9UcCopLCBfU1RMUF9ERkxfVE1QTF9QQVJBTShfUmVmZXJlbmNlLF9UcCYpID4KLXN0cnVjdCBpdGVyYXRvciB7Ci0gIHR5cGVkZWYgX0NhdGVnb3J5ICBpdGVyYXRvcl9jYXRlZ29yeTsKLSAgdHlwZWRlZiBfVHAgICAgICAgIHZhbHVlX3R5cGU7Ci0gIHR5cGVkZWYgX0Rpc3RhbmNlICBkaWZmZXJlbmNlX3R5cGU7Ci0gIHR5cGVkZWYgX1BvaW50ZXIgICBwb2ludGVyOwotICB0eXBlZGVmIF9SZWZlcmVuY2UgcmVmZXJlbmNlOwotfTsKLV9TVExQX1RFTVBMQVRFX05VTEwKLXN0cnVjdCBpdGVyYXRvcjxvdXRwdXRfaXRlcmF0b3JfdGFnLCB2b2lkLCB2b2lkLCB2b2lkLCB2b2lkPiB7Ci0gIHR5cGVkZWYgb3V0cHV0X2l0ZXJhdG9yX3RhZyAgaXRlcmF0b3JfY2F0ZWdvcnk7Ci0jaWZkZWYgX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTgotICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKLSAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKLSAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHBvaW50ZXI7Ci0gIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICByZWZlcmVuY2U7Ci0jZW5kaWYKLX07Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfT0xEX0hQX0lURVJBVE9SX1FVRVJJRVMpCi0jICBkZWZpbmUgX1NUTFBfSVRFUkFUT1JfQ0FURUdPUlkoX0l0LCBfVHApIGl0ZXJhdG9yX2NhdGVnb3J5KF9JdCkKLSMgIGRlZmluZSBfU1RMUF9ESVNUQU5DRV9UWVBFKF9JdCwgX1RwKSAgICAgZGlzdGFuY2VfdHlwZShfSXQpCi0jICBkZWZpbmUgX1NUTFBfVkFMVUVfVFlQRShfSXQsIF9UcCkgICAgICAgIHZhbHVlX3R5cGUoX0l0KQotLy9PbGQgSFAgaXRlcmF0b3IgcXVlcmllcyBkbyBub3QgZ2l2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaXRlcmF0b3IKLS8vYXNzb2NpYXRlZCByZWZlcmVuY2UgdHlwZSBzbyB3ZSBjb25zaWRlciB0aGF0IGl0IGlzIG5vdCBhIHJlYWwgcmVmZXJlbmNlLgotIyAgZGVmaW5lIF9TVExQX0lTX1JFRl9UWVBFX1JFQUxfUkVGKF9JdCwgX1RwKSBfX2ZhbHNlX3R5cGUoKQotI2Vsc2UKLSMgIGlmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pCi0jICAgIGRlZmluZSBfU1RMUF9WQUxVRV9UWVBFKF9JdCwgX1RwKSAgICAgICAgKHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czwgX1RwID46OnZhbHVlX3R5cGUqKTAKLSMgICAgZGVmaW5lIF9TVExQX0RJU1RBTkNFX1RZUEUoX0l0LCBfVHApICAgICAodHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPCBfVHAgPjo6ZGlmZmVyZW5jZV90eXBlKikwCi0jICAgIGlmIGRlZmluZWQgKF9fQk9STEFORENfXykgfHwgZGVmaW5lZCAoX19TVU5QUk9fQ0MpIHx8ICggZGVmaW5lZCAoX19NV0VSS1NfXykgJiYgKF9fTVdFUktTX18gPD0gMHgyMzAzKSkgfHwgKCBkZWZpbmVkIChfX3NnaSkgJiYgZGVmaW5lZCAoX0NPTVBJTEVSX1ZFUlNJT04pKSB8fCBkZWZpbmVkIChfX0RNQ19fKQotIyAgICAgIGRlZmluZSBfU1RMUF9JVEVSQVRPUl9DQVRFR09SWShfSXQsIF9UcCkgaXRlcmF0b3JfdHJhaXRzPCBfVHAgPjo6aXRlcmF0b3JfY2F0ZWdvcnkoKQotIyAgICBlbHNlCi0jICAgICAgZGVmaW5lIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9JdCwgX1RwKSB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8IF9UcCA+OjppdGVyYXRvcl9jYXRlZ29yeSgpCi0jICAgIGVuZGlmCi0jICAgIGRlZmluZSBfU1RMUF9JU19SRUZfVFlQRV9SRUFMX1JFRihfSXQsIF9UcCkgX0lzUmVmVHlwZTwgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPCBfVHAgPjo6cmVmZXJlbmNlID46Ol9SZXQoKQotIyAgZWxzZQotIyAgICBkZWZpbmUgX1NUTFBfSVRFUkFUT1JfQ0FURUdPUlkoX0l0LCBfVHApICAgX19pdGVyYXRvcl9jYXRlZ29yeShfSXQsIF9Jc1B0clR5cGU8X1RwPjo6X1JldCgpKQotIyAgICBkZWZpbmUgX1NUTFBfRElTVEFOQ0VfVFlQRShfSXQsIF9UcCkgICAgICAgKHB0cmRpZmZfdCopMAotIyAgICBkZWZpbmUgX1NUTFBfVkFMVUVfVFlQRShfSXQsIF9UcCkgICAgICAgICAgX192YWx1ZV90eXBlKF9JdCwgX0lzUHRyVHlwZTxfVHA+OjpfUmV0KCkgKQotIyAgICBkZWZpbmUgX1NUTFBfSVNfUkVGX1RZUEVfUkVBTF9SRUYoX0l0LCBfVHApIF9fZmFsc2VfdHlwZSgpCi0jICBlbmRpZgotI2VuZGlmCi0KLXRlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+Ci1zdHJ1Y3QgaXRlcmF0b3JfdHJhaXRzIHsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfSXRlcmF0b3I6Oml0ZXJhdG9yX2NhdGVnb3J5IGl0ZXJhdG9yX2NhdGVnb3J5OwotICB0eXBlZGVmIHR5cGVuYW1lIF9JdGVyYXRvcjo6dmFsdWVfdHlwZSAgICAgICAgdmFsdWVfdHlwZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfSXRlcmF0b3I6OmRpZmZlcmVuY2VfdHlwZSAgIGRpZmZlcmVuY2VfdHlwZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfSXRlcmF0b3I6OnBvaW50ZXIgICAgICAgICAgIHBvaW50ZXI7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0l0ZXJhdG9yOjpyZWZlcmVuY2UgICAgICAgICByZWZlcmVuY2U7Ci19OwotCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKSAmJiAhIGRlZmluZWQgKF9fU1VOUFJPX0NDKQotIyAgZGVmaW5lIF9TVExQX0RJRkZFUkVOQ0VfVFlQRShfSXRlcmF0b3IpIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUKLSNlbHNlCi0jICBkZWZpbmUgX1NUTFBfRElGRkVSRU5DRV9UWVBFKF9JdGVyYXRvcikgcHRyZGlmZl90Ci0jZW5kaWYKLQotI2lmZGVmIF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04KLQotLy8gZmJwIDogdGhpcyBvcmRlciBrZWVwcyBnY2MgaGFwcHkKLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1zdHJ1Y3QgaXRlcmF0b3JfdHJhaXRzPGNvbnN0IF9UcCo+IHsKLSAgdHlwZWRlZiByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyAgaXRlcmF0b3JfY2F0ZWdvcnk7Ci0gIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7Ci0gIHR5cGVkZWYgcHRyZGlmZl90ICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKLSAgdHlwZWRlZiBjb25zdCBfVHAqICAgICAgICAgICAgICAgICAgcG9pbnRlcjsKLSAgdHlwZWRlZiBjb25zdCBfVHAmICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOwotfTsKLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLXN0cnVjdCBpdGVyYXRvcl90cmFpdHM8X1RwKj4gewotICB0eXBlZGVmIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnICBpdGVyYXRvcl9jYXRlZ29yeTsKLSAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKLSAgdHlwZWRlZiBwdHJkaWZmX3QgICAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOwotICB0eXBlZGVmIF9UcCogICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyOwotICB0eXBlZGVmIF9UcCYgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2U7Ci19OwotCi0jICBpZiBkZWZpbmVkIChfX0JPUkxBTkRDX18pCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotc3RydWN0IGl0ZXJhdG9yX3RyYWl0czxfVHAqIGNvbnN0PiB7Ci0gIHR5cGVkZWYgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgIGl0ZXJhdG9yX2NhdGVnb3J5OwotICB0eXBlZGVmIF9UcCAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOwotICB0eXBlZGVmIHB0cmRpZmZfdCAgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7Ci0gIHR5cGVkZWYgY29uc3QgX1RwKiAgICAgICAgICAgICAgICAgIHBvaW50ZXI7Ci0gIHR5cGVkZWYgY29uc3QgX1RwJiAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKLX07Ci0jICBlbmRpZgotCi0jZW5kaWYgLyogX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTiAqLwotCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKSB8fCBcCi0gICAoZGVmaW5lZCAoX1NUTFBfU0lNVUxBVEVfUEFSVElBTF9TUEVDX0ZPUl9UWVBFX1RSQUlUUykgJiYgISBkZWZpbmVkIChfU1RMUF9OT19BUlJPV19PUEVSQVRPUikpCi0jICBkZWZpbmUgX1NUTFBfUE9JTlRFUlNfU1BFQ0lBTElaRSggX1RwUCApCi0jICBkZWZpbmUgX1NUTFBfREVGSU5FX0FSUk9XX09QRVJBVE9SICBwb2ludGVyIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiAmKG9wZXJhdG9yKigpKTsgfQotI2Vsc2UKLSMgIGluY2x1ZGUgPHN0bC9fcHRyc19zcGVjaWFsaXplLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBfU1RMUF9VU0VfT0xEX0hQX0lURVJBVE9SX1FVRVJJRVMKLS8vIFRoZSBvdmVybG9hZGVkIGZ1bmN0aW9ucyBpdGVyYXRvcl9jYXRlZ29yeSwgZGlzdGFuY2VfdHlwZSwgYW5kCi0vLyB2YWx1ZV90eXBlIGFyZSBub3QgcGFydCBvZiB0aGUgQysrIHN0YW5kYXJkLiAgKFRoZXkgaGF2ZSBiZWVuCi0vLyByZXBsYWNlZCBieSBzdHJ1Y3QgaXRlcmF0b3JfdHJhaXRzLikgIFRoZXkgYXJlIGluY2x1ZGVkIGZvcgotLy8gYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBIUCBTVEwuCi0vLyBXZSBpbnRyb2R1Y2UgaW50ZXJuYWwgbmFtZXMgZm9yIHRoZXNlIGZ1bmN0aW9ucy4KLQotIyAgaWZkZWYgX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTgotCi10ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXI+Ci1pbmxpbmUgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JdGVyPjo6aXRlcmF0b3JfY2F0ZWdvcnkgX19pdGVyYXRvcl9jYXRlZ29yeShjb25zdCBfSXRlciYpIHsKLSAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0l0ZXI+OjppdGVyYXRvcl9jYXRlZ29yeSBfQ2F0ZWdvcnk7Ci0gIHJldHVybiBfQ2F0ZWdvcnkoKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9JdGVyPgotaW5saW5lIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSXRlcj46OmRpZmZlcmVuY2VfdHlwZSogX19kaXN0YW5jZV90eXBlKGNvbnN0IF9JdGVyJikgewotICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSXRlcj46OmRpZmZlcmVuY2VfdHlwZSBfZGlmZl90eXBlOwotICByZXR1cm4gX19TVEFUSUNfQ0FTVChfZGlmZl90eXBlKiwwKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9JdGVyPgotaW5saW5lIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSXRlcj46OnZhbHVlX3R5cGUqIF9fdmFsdWVfdHlwZShjb25zdCBfSXRlciYpIHsKLSAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0l0ZXI+Ojp2YWx1ZV90eXBlIF92YWx1ZV90eXBlOwotICByZXR1cm4gX19TVEFUSUNfQ0FTVChfdmFsdWVfdHlwZSosMCk7Ci19Ci0KLSMgIGVsc2UgLyogX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTiAqLwotCi10ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXI+Ci1pbmxpbmUgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcKLV9faXRlcmF0b3JfY2F0ZWdvcnkoY29uc3QgX0l0ZXImLCBjb25zdCBfX3RydWVfdHlwZSYpIHsKLSAgcmV0dXJuIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKCk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfSXRlcj4KLWlubGluZSBfU1RMUF9UWVBFTkFNRV9PTl9SRVRVUk5fVFlQRSBpdGVyYXRvcl90cmFpdHM8X0l0ZXI+OjppdGVyYXRvcl9jYXRlZ29yeQotX19pdGVyYXRvcl9jYXRlZ29yeShjb25zdCBfSXRlciYsIGNvbnN0IF9fZmFsc2VfdHlwZSYpIHsKLSAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0l0ZXI+OjppdGVyYXRvcl9jYXRlZ29yeSBfQ2F0ZWdvcnk7Ci0gIHJldHVybiBfQ2F0ZWdvcnkoKTsKLX0KLQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXI+Ci1pbmxpbmUgcHRyZGlmZl90KiBfU1RMUF9DQUxMIF9fZGlzdGFuY2VfdHlwZShjb25zdCBfSXRlciYpIHsgcmV0dXJuIF9fU1RBVElDX0NBU1QocHRyZGlmZl90KiwgMCk7IH0KLQotdGVtcGxhdGUgPGNsYXNzIF9JdGVyPgotaW5saW5lIF9TVExQX1RZUEVOQU1FX09OX1JFVFVSTl9UWVBFIGl0ZXJhdG9yX3RyYWl0czxfSXRlcj46OnZhbHVlX3R5cGUqCi1fX3ZhbHVlX3R5cGUoY29uc3QgX0l0ZXImLCBjb25zdCBfX2ZhbHNlX3R5cGUmKSB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JdGVyPjo6dmFsdWVfdHlwZSBfdmFsdWVfdHlwZTsKLSAgcmV0dXJuIF9fU1RBVElDX0NBU1QoX3ZhbHVlX3R5cGUqLDApOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotaW5saW5lIF9UcCoKLV9fdmFsdWVfdHlwZShjb25zdCBfVHAqLCBjb25zdCBfX3RydWVfdHlwZSYpIHsKLSAgcmV0dXJuIF9fU1RBVElDX0NBU1QoX1RwKiwgMCk7Ci19Ci0KLSMgIGVuZGlmIC8qIF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04gKi8KLQotI2Vsc2UgLyogX1NUTFBfVVNFX09MRF9IUF9JVEVSQVRPUl9RVUVSSUVTICovCi10ZW1wbGF0ZSA8Y2xhc3MgX0NhdGVnb3J5LCBjbGFzcyBfVHAsIGNsYXNzIF9EaXN0YW5jZSwgY2xhc3MgX1BvaW50ZXIsIGNsYXNzIF9SZWZlcmVuY2U+Ci1pbmxpbmUgX0NhdGVnb3J5IF9TVExQX0NBTEwgaXRlcmF0b3JfY2F0ZWdvcnkoY29uc3QgaXRlcmF0b3I8X0NhdGVnb3J5LF9UcCxfRGlzdGFuY2UsX1BvaW50ZXIsX1JlZmVyZW5jZT4mKSB7IHJldHVybiBfQ2F0ZWdvcnkoKTsgfQotdGVtcGxhdGUgPGNsYXNzIF9DYXRlZ29yeSwgY2xhc3MgX1RwLCBjbGFzcyBfRGlzdGFuY2UsIGNsYXNzIF9Qb2ludGVyLCBjbGFzcyBfUmVmZXJlbmNlPgotaW5saW5lIF9UcCogX1NUTFBfQ0FMTCB2YWx1ZV90eXBlKGNvbnN0IGl0ZXJhdG9yPF9DYXRlZ29yeSxfVHAsX0Rpc3RhbmNlLF9Qb2ludGVyLF9SZWZlcmVuY2U+JikgeyByZXR1cm4gX19TVEFUSUNfQ0FTVChfVHAqLCAwKTsgfQotdGVtcGxhdGUgPGNsYXNzIF9DYXRlZ29yeSwgY2xhc3MgX1RwLCBjbGFzcyBfRGlzdGFuY2UsIGNsYXNzIF9Qb2ludGVyLCBjbGFzcyBfUmVmZXJlbmNlPgotaW5saW5lIF9EaXN0YW5jZSogX1NUTFBfQ0FMTCBkaXN0YW5jZV90eXBlKGNvbnN0IGl0ZXJhdG9yPF9DYXRlZ29yeSxfVHAsX0Rpc3RhbmNlLF9Qb2ludGVyLF9SZWZlcmVuY2U+JikgeyByZXR1cm4gX19TVEFUSUNfQ0FTVChfRGlzdGFuY2UqLCAwKTsgfQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWlubGluZSByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyBfU1RMUF9DQUxMIGl0ZXJhdG9yX2NhdGVnb3J5KGNvbnN0IF9UcCopIHsgcmV0dXJuIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKCk7IH0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgX1RwKiBfU1RMUF9DQUxMIHZhbHVlX3R5cGUoY29uc3QgX1RwKikgeyByZXR1cm4gX19TVEFUSUNfQ0FTVChfVHAqLCAwKTsgfQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWlubGluZSBwdHJkaWZmX3QqIF9TVExQX0NBTEwgZGlzdGFuY2VfdHlwZShjb25zdCBfVHAqKSB7IHJldHVybiBfX1NUQVRJQ19DQVNUKHB0cmRpZmZfdCosIDApOyB9Ci0jZW5kaWYgLyogX1NUTFBfVVNFX09MRF9IUF9JVEVSQVRPUl9RVUVSSUVTICovCi0KLSMgaWYgISBkZWZpbmVkIChfU1RMUF9OT19BTkFDSFJPTklTTVMpCi0vLyBUaGUgYmFzZSBjbGFzc2VzIGlucHV0X2l0ZXJhdG9yLCBvdXRwdXRfaXRlcmF0b3IsIGZvcndhcmRfaXRlcmF0b3IsCi0vLyBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yLCBhbmQgcmFuZG9tX2FjY2Vzc19pdGVyYXRvciBhcmUgbm90IHBhcnQgb2YKLS8vIHRoZSBDKysgc3RhbmRhcmQuICAoVGhleSBoYXZlIGJlZW4gcmVwbGFjZWQgYnkgc3RydWN0IGl0ZXJhdG9yLikKLS8vIFRoZXkgYXJlIGluY2x1ZGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggdGhlIEhQIFNUTC4KLXRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9EaXN0YW5jZT4gc3RydWN0IGlucHV0X2l0ZXJhdG9yIDoKLSAgcHVibGljIGl0ZXJhdG9yIDxpbnB1dF9pdGVyYXRvcl90YWcsIF9UcCwgX0Rpc3RhbmNlLCBfVHAqLCBfVHAmPiB7fTsKLXN0cnVjdCBvdXRwdXRfaXRlcmF0b3IgOiBwdWJsaWMgaXRlcmF0b3IgPG91dHB1dF9pdGVyYXRvcl90YWcsIHZvaWQsIHZvaWQsIHZvaWQsIHZvaWQ+IHt9OwotdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0Rpc3RhbmNlPiBzdHJ1Y3QgZm9yd2FyZF9pdGVyYXRvciA6Ci0gIHB1YmxpYyBpdGVyYXRvcjxmb3J3YXJkX2l0ZXJhdG9yX3RhZywgX1RwLCBfRGlzdGFuY2UsIF9UcCosIF9UcCY+IHt9OwotdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0Rpc3RhbmNlPiBzdHJ1Y3QgYmlkaXJlY3Rpb25hbF9pdGVyYXRvciA6Ci0gIHB1YmxpYyBpdGVyYXRvcjxiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZywgX1RwLCBfRGlzdGFuY2UsIF9UcCosIF9UcCY+IHt9OwotdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0Rpc3RhbmNlPiBzdHJ1Y3QgcmFuZG9tX2FjY2Vzc19pdGVyYXRvciA6Ci0gIHB1YmxpYyBpdGVyYXRvcjxyYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywgX1RwLCBfRGlzdGFuY2UsIF9UcCosIF9UcCY+IHt9OwotCi0jIGlmIGRlZmluZWQgKF9TVExQX0JBU0VfTUFUQ0hfQlVHKSAmJiBkZWZpbmVkIChfU1RMUF9VU0VfT0xEX0hQX0lURVJBVE9SX1FVRVJJRVMpCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfRGlzdGFuY2U+Ci1pbmxpbmUgaW5wdXRfaXRlcmF0b3JfdGFnIF9TVExQX0NBTEwKLWl0ZXJhdG9yX2NhdGVnb3J5KGNvbnN0IGlucHV0X2l0ZXJhdG9yPF9UcCwgX0Rpc3RhbmNlPiYpIHsgcmV0dXJuIGlucHV0X2l0ZXJhdG9yX3RhZygpOyB9Ci1pbmxpbmUgb3V0cHV0X2l0ZXJhdG9yX3RhZyBfU1RMUF9DQUxMCi1pdGVyYXRvcl9jYXRlZ29yeShjb25zdCBvdXRwdXRfaXRlcmF0b3ImKSB7IHJldHVybiBvdXRwdXRfaXRlcmF0b3JfdGFnKCk7IH0KLXRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9EaXN0YW5jZT4KLWlubGluZSBmb3J3YXJkX2l0ZXJhdG9yX3RhZyBfU1RMUF9DQUxMCi1pdGVyYXRvcl9jYXRlZ29yeShjb25zdCBmb3J3YXJkX2l0ZXJhdG9yPF9UcCwgX0Rpc3RhbmNlPiYpIHsgcmV0dXJuIGZvcndhcmRfaXRlcmF0b3JfdGFnKCk7IH0KLXRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9EaXN0YW5jZT4KLWlubGluZSBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZyBfU1RMUF9DQUxMCi1pdGVyYXRvcl9jYXRlZ29yeShjb25zdCBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yPF9UcCwgX0Rpc3RhbmNlPiYpIHsgcmV0dXJuIGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnKCk7IH0KLXRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9EaXN0YW5jZT4KLWlubGluZSByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyBfU1RMUF9DQUxMCi1pdGVyYXRvcl9jYXRlZ29yeShjb25zdCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yPF9UcCwgX0Rpc3RhbmNlPiYpIHsgcmV0dXJuIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKCk7IH0KLXRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9EaXN0YW5jZT4KLWlubGluZSBfVHAqICBfU1RMUF9DQUxMIHZhbHVlX3R5cGUoY29uc3QgaW5wdXRfaXRlcmF0b3I8X1RwLCBfRGlzdGFuY2U+JikgeyByZXR1cm4gX19TVEFUSUNfQ0FTVChfVHAqLCAwKTsgfQotdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0Rpc3RhbmNlPgotaW5saW5lIF9UcCogX1NUTFBfQ0FMTCB2YWx1ZV90eXBlKGNvbnN0IGZvcndhcmRfaXRlcmF0b3I8X1RwLCBfRGlzdGFuY2U+JikgeyByZXR1cm4gX19TVEFUSUNfQ0FTVChfVHAqLCAwKTsgfQotdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0Rpc3RhbmNlPgotaW5saW5lIF9UcCogX1NUTFBfQ0FMTCB2YWx1ZV90eXBlKGNvbnN0IGJpZGlyZWN0aW9uYWxfaXRlcmF0b3I8X1RwLCBfRGlzdGFuY2U+JikgeyByZXR1cm4gX19TVEFUSUNfQ0FTVChfVHAqLCAwKTsgfQotdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0Rpc3RhbmNlPgotaW5saW5lIF9UcCogX1NUTFBfQ0FMTCB2YWx1ZV90eXBlKGNvbnN0IHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3I8X1RwLCBfRGlzdGFuY2U+JikgeyByZXR1cm4gX19TVEFUSUNfQ0FTVChfVHAqLCAwKTsgfQotdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0Rpc3RhbmNlPgotaW5saW5lIF9EaXN0YW5jZSogX1NUTFBfQ0FMTCBkaXN0YW5jZV90eXBlKGNvbnN0IGlucHV0X2l0ZXJhdG9yPF9UcCwgX0Rpc3RhbmNlPiYpIHsgcmV0dXJuIF9fU1RBVElDX0NBU1QoX0Rpc3RhbmNlKiwgMCk7IH0KLXRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9EaXN0YW5jZT4KLWlubGluZSBfRGlzdGFuY2UqIF9TVExQX0NBTEwgZGlzdGFuY2VfdHlwZShjb25zdCBmb3J3YXJkX2l0ZXJhdG9yPF9UcCwgX0Rpc3RhbmNlPiYpIHsgcmV0dXJuIF9fU1RBVElDX0NBU1QoX0Rpc3RhbmNlKiwgMCk7IH0KLXRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9EaXN0YW5jZT4KLWlubGluZSBfRGlzdGFuY2UqIF9TVExQX0NBTEwgZGlzdGFuY2VfdHlwZShjb25zdCBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yPF9UcCwgX0Rpc3RhbmNlPiYpIHsgcmV0dXJuIF9fU1RBVElDX0NBU1QoX0Rpc3RhbmNlKiwgMCk7fQotdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0Rpc3RhbmNlPgotaW5saW5lIF9EaXN0YW5jZSogX1NUTFBfQ0FMTCBkaXN0YW5jZV90eXBlKGNvbnN0IHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3I8X1RwLCBfRGlzdGFuY2U+JikgeyByZXR1cm4gX19TVEFUSUNfQ0FTVChfRGlzdGFuY2UqLCAwKTsgfQotIyBlbmRpZiAvKiBCQVNFX01BVENIICovCi0KLSNlbmRpZiAvKiBfU1RMUF9OT19BTkFDSFJPTklTTVMgKi8KLQotdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yLCBjbGFzcyBfRGlzdGFuY2U+Ci1pbmxpbmUgdm9pZCBfU1RMUF9DQUxMIF9fZGlzdGFuY2UoY29uc3QgX0lucHV0SXRlcmF0b3ImIF9fZmlyc3QsIGNvbnN0IF9JbnB1dEl0ZXJhdG9yJiBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0Rpc3RhbmNlJiBfX24sIGNvbnN0IGlucHV0X2l0ZXJhdG9yX3RhZyAmKSB7Ci0gIF9JbnB1dEl0ZXJhdG9yIF9faXQoX19maXJzdCk7Ci0gIHdoaWxlIChfX2l0ICE9IF9fbGFzdCkgeyArK19faXQ7ICsrX19uOyB9Ci19Ci0KLQotIyBpZiBkZWZpbmVkIChfU1RMUF9OT05URU1QTF9CQVNFX01BVENIX0JVRykKLXRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yLCBjbGFzcyBfRGlzdGFuY2U+Ci1pbmxpbmUgdm9pZCBfU1RMUF9DQUxMIF9fZGlzdGFuY2UoY29uc3QgX0ZvcndhcmRJdGVyYXRvciYgX19maXJzdCwgY29uc3QgX0ZvcndhcmRJdGVyYXRvciYgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EaXN0YW5jZSYgX19uLCBjb25zdCBmb3J3YXJkX2l0ZXJhdG9yX3RhZyAmKSB7Ci0gIF9Gb3J3YXJkSXRlcmF0b3IgX19pdChfX2ZpcnN0KTsKLSAgd2hpbGUgKF9faXQgIT0gX19sYXN0KSB7ICsrX19maXJzdDsgKytfX247IH0KLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IsIGNsYXNzIF9EaXN0YW5jZT4KLV9TVExQX0lOTElORV9MT09QIHZvaWQgX1NUTFBfQ0FMTCBfX2Rpc3RhbmNlKGNvbnN0IF9CaWRpcmVjdGlvbmFsSXRlcmF0b3ImIF9fZmlyc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yJiBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRGlzdGFuY2UmIF9fbiwgY29uc3QgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgJikgewotICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9faXQoX19maXJzdCk7Ci0gIHdoaWxlIChfX2l0ICE9IF9fbGFzdCkgeyArK19faXQ7ICsrX19uOyB9Ci19Ci0jIGVuZGlmCi0KLXRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIGNsYXNzIF9EaXN0YW5jZT4KLWlubGluZSB2b2lkIF9TVExQX0NBTEwgX19kaXN0YW5jZShjb25zdCBfUmFuZG9tQWNjZXNzSXRlcmF0b3ImIF9fZmlyc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yJiBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0Rpc3RhbmNlJiBfX24sIGNvbnN0IHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnICYpIHsKLSAgX19uICs9IF9fbGFzdCAtIF9fZmlyc3Q7Ci19Ci0KLSNpZm5kZWYgX1NUTFBfTk9fQU5BQ0hST05JU01TCi10ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3IsIGNsYXNzIF9EaXN0YW5jZT4KLWlubGluZSB2b2lkIF9TVExQX0NBTEwgZGlzdGFuY2UoY29uc3QgX0lucHV0SXRlcmF0b3ImIF9fZmlyc3QsCi0gICAgICAgIGNvbnN0IF9JbnB1dEl0ZXJhdG9yJiBfX2xhc3QsIF9EaXN0YW5jZSYgX19uKSB7Ci0gIF9fZGlzdGFuY2UoX19maXJzdCwgX19sYXN0LCBfX24sIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yKSk7Ci19Ci0jZW5kaWYKLQotdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgotaW5saW5lIF9TVExQX0RJRkZFUkVOQ0VfVFlQRShfSW5wdXRJdGVyYXRvcikgX1NUTFBfQ0FMTAotX19kaXN0YW5jZShjb25zdCBfSW5wdXRJdGVyYXRvciYgX19maXJzdCwgY29uc3QgX0lucHV0SXRlcmF0b3ImIF9fbGFzdCwgY29uc3QgaW5wdXRfaXRlcmF0b3JfdGFnICYpIHsKLSAgX1NUTFBfRElGRkVSRU5DRV9UWVBFKF9JbnB1dEl0ZXJhdG9yKSBfX24gPSAwOwotICBfSW5wdXRJdGVyYXRvciBfX2l0KF9fZmlyc3QpOwotICB3aGlsZSAoX19pdCAhPSBfX2xhc3QpIHsKLSAgICArK19faXQ7ICsrX19uOwotICB9Ci0gIHJldHVybiBfX247Ci19Ci0KLSMgaWYgZGVmaW5lZCAoX1NUTFBfTk9OVEVNUExfQkFTRV9NQVRDSF9CVUcpCi10ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KLWlubGluZSBfU1RMUF9ESUZGRVJFTkNFX1RZUEUoX0ZvcndhcmRJdGVyYXRvcikgX1NUTFBfQ0FMTAotX19kaXN0YW5jZShjb25zdCBfRm9yd2FyZEl0ZXJhdG9yJiBfX2ZpcnN0LCBjb25zdCBfRm9yd2FyZEl0ZXJhdG9yJiBfX2xhc3QsCi0gICAgICAgICAgIGNvbnN0IGZvcndhcmRfaXRlcmF0b3JfdGFnICYpCi17Ci0gIF9TVExQX0RJRkZFUkVOQ0VfVFlQRShfRm9yd2FyZEl0ZXJhdG9yKSBfX24gPSAwOwotICBfRm9yd2FyZEl0ZXJhdG9yIF9faXQoX19maXJzdCk7Ci0gIHdoaWxlIChfX2l0ICE9IF9fbGFzdCkgewotICAgICsrX19pdDsgKytfX247Ci0gIH0KLSAgcmV0dXJuIF9fbjsKLQotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcj4KLV9TVExQX0lOTElORV9MT09QIF9TVExQX0RJRkZFUkVOQ0VfVFlQRShfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yKSBfU1RMUF9DQUxMCi1fX2Rpc3RhbmNlKGNvbnN0IF9CaWRpcmVjdGlvbmFsSXRlcmF0b3ImIF9fZmlyc3QsCi0gICAgICAgICAgIGNvbnN0IF9CaWRpcmVjdGlvbmFsSXRlcmF0b3ImIF9fbGFzdCwKLSAgICAgICAgICAgY29uc3QgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgJikgewotICBfU1RMUF9ESUZGRVJFTkNFX1RZUEUoX0JpZGlyZWN0aW9uYWxJdGVyYXRvcikgX19uID0gMDsKLSAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2l0KF9fZmlyc3QpOwotICB3aGlsZSAoX19pdCAhPSBfX2xhc3QpIHsKLSAgICArK19faXQ7ICsrX19uOwotICB9Ci0gIHJldHVybiBfX247Ci19Ci0jIGVuZGlmCi0KLXRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+Ci1pbmxpbmUgX1NUTFBfRElGRkVSRU5DRV9UWVBFKF9SYW5kb21BY2Nlc3NJdGVyYXRvcikgX1NUTFBfQ0FMTAotX19kaXN0YW5jZShjb25zdCBfUmFuZG9tQWNjZXNzSXRlcmF0b3ImIF9fZmlyc3QsIGNvbnN0IF9SYW5kb21BY2Nlc3NJdGVyYXRvciYgX19sYXN0LAotICAgICAgICAgICBjb25zdCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyAmKSB7Ci0gIHJldHVybiBfX2xhc3QgLSBfX2ZpcnN0OwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Ci1pbmxpbmUgX1NUTFBfRElGRkVSRU5DRV9UWVBFKF9JbnB1dEl0ZXJhdG9yKSBfU1RMUF9DQUxMCi1kaXN0YW5jZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpIHsKLSAgcmV0dXJuIF9fZGlzdGFuY2UoX19maXJzdCwgX19sYXN0LCBfU1RMUF9JVEVSQVRPUl9DQVRFR09SWShfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvcikpOwotfQotCi0vLyBmYnA6IHRob3NlIGFyZSBiZWluZyB1c2VkIGZvciBpdGVyYXRvci9jb25zdF9pdGVyYXRvciBkZWZpbml0aW9ucyBldmVyeXdoZXJlCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotc3RydWN0IF9Ob25jb25zdF90cmFpdHM7Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1zdHJ1Y3QgX0NvbnN0X3RyYWl0cyB7Ci0gIHR5cGVkZWYgX1RwIHZhbHVlX3R5cGU7Ci0gIHR5cGVkZWYgY29uc3QgX1RwJiAgcmVmZXJlbmNlOwotICB0eXBlZGVmIGNvbnN0IF9UcCogIHBvaW50ZXI7Ci0gIHR5cGVkZWYgX0NvbnN0X3RyYWl0czxfVHA+IF9Db25zdFRyYWl0czsKLSAgdHlwZWRlZiBfTm9uY29uc3RfdHJhaXRzPF9UcD4gX05vbkNvbnN0VHJhaXRzOwotfTsKLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLXN0cnVjdCBfTm9uY29uc3RfdHJhaXRzIHsKLSAgdHlwZWRlZiBfVHAgdmFsdWVfdHlwZTsKLSAgdHlwZWRlZiBfVHAmIHJlZmVyZW5jZTsKLSAgdHlwZWRlZiBfVHAqIHBvaW50ZXI7Ci0gIHR5cGVkZWYgX0NvbnN0X3RyYWl0czxfVHA+IF9Db25zdFRyYWl0czsKLSAgdHlwZWRlZiBfTm9uY29uc3RfdHJhaXRzPF9UcD4gX05vbkNvbnN0VHJhaXRzOwotfTsKLQotLyoKLSAqIGR1bXM6IEEgc3BlY2lhbCBpdGVyYXRvci9jb25zdF9pdGVyYXRvciB0cmFpdHMgZm9yIHNldCBhbmQgbXVsdGlzZXQgZm9yIHdoaWNoIGV2ZW4KLSAqIHRoZSBpdGVyYXRvciBpcyBub3QgbXV0YWJsZQotICovCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotc3RydWN0IF9Ob25jb25zdF9Db25zdF90cmFpdHM7Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1zdHJ1Y3QgX0NvbnN0X0NvbnN0X3RyYWl0cyB7Ci0gIHR5cGVkZWYgX1RwIHZhbHVlX3R5cGU7Ci0gIHR5cGVkZWYgY29uc3QgX1RwJiAgcmVmZXJlbmNlOwotICB0eXBlZGVmIGNvbnN0IF9UcCogIHBvaW50ZXI7Ci0gIHR5cGVkZWYgX0NvbnN0X0NvbnN0X3RyYWl0czxfVHA+IF9Db25zdFRyYWl0czsKLSAgdHlwZWRlZiBfTm9uY29uc3RfQ29uc3RfdHJhaXRzPF9UcD4gX05vbkNvbnN0VHJhaXRzOwotfTsKLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLXN0cnVjdCBfTm9uY29uc3RfQ29uc3RfdHJhaXRzIHsKLSAgdHlwZWRlZiBfVHAgdmFsdWVfdHlwZTsKLSAgdHlwZWRlZiBjb25zdCBfVHAmIHJlZmVyZW5jZTsKLSAgdHlwZWRlZiBjb25zdCBfVHAqIHBvaW50ZXI7Ci0gIHR5cGVkZWYgX0NvbnN0X0NvbnN0X3RyYWl0czxfVHA+IF9Db25zdFRyYWl0czsKLSAgdHlwZWRlZiBfTm9uY29uc3RfQ29uc3RfdHJhaXRzPF9UcD4gX05vbkNvbnN0VHJhaXRzOwotfTsKLQotLyoKLSAqIEEgbWFjcm8gdG8gZ2VuZXJhdGUgYSBuZXcgaXRlcmF0b3IgdHJhaXRzIGZyb20gb25lIG9mIHRoZQotICogcHJldmlvdXMgb25lLiBDaGFuZ2luZyB0aGUgaXRlcmF0b3IgdHJhaXRzIHR5cGUgbWFrZSBpdGVyYXRvcnMKLSAqIGZyb20gZGlmZmVyZW50IGNvbnRhaW5lcnMgbm90IGNvbXBhcmFibGUuCi0gKi8KLSNkZWZpbmUgX1NUTFBfQ1JFQVRFX0lURVJBVE9SX1RSQUlUU19CQVNFKE1vdGlmLCBUcmFpdHMpICAgICAgICBcCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotc3RydWN0IF8jI01vdGlmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXRlbXBsYXRlIDxjbGFzcyBfVHA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi1zdHJ1Y3QgX0NvbnN0IyNNb3RpZiA6IHB1YmxpYyBfU1RMUF9TVEQ6Ol9Db25zdF8jI1RyYWl0czxfVHA+IHsgIFwKLSAgdHlwZWRlZiBfQ29uc3QjI01vdGlmPF9UcD4gX0NvbnN0VHJhaXRzOyAgICAgICAgICAgICAgICAgICAgICBcCi0gIHR5cGVkZWYgXyMjTW90aWY8X1RwPiBfTm9uQ29uc3RUcmFpdHM7ICAgICAgICAgICAgICAgICAgICAgICAgXAotfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXRlbXBsYXRlIDxjbGFzcyBfVHA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi1zdHJ1Y3QgXyMjTW90aWYgOiBwdWJsaWMgX1NUTFBfU1REOjpfTm9uY29uc3RfIyNUcmFpdHM8X1RwPiB7ICAgIFwKLSAgdHlwZWRlZiBfQ29uc3QjI01vdGlmPF9UcD4gX0NvbnN0VHJhaXRzOyAgICAgICAgICAgICAgICAgICAgICBcCi0gIHR5cGVkZWYgXyMjTW90aWY8X1RwPiBfTm9uQ29uc3RUcmFpdHM7ICAgICAgICAgICAgICAgICAgICAgICAgXAotfTsKLQotI2RlZmluZSBfU1RMUF9DUkVBVEVfSVRFUkFUT1JfVFJBSVRTKE1vdGlmLCBUcmFpdHMpICAgICAgICAgICAgIFwKLV9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi1fU1RMUF9DUkVBVEVfSVRFUkFUT1JfVFJBSVRTX0JBU0UoTW90aWYsIFRyYWl0cykgICAgICAgICAgICAgICAgXAotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi0KLSNkZWZpbmUgX1NUTFBfQ1JFQVRFX0hBU0hfSVRFUkFUT1JfVFJBSVRTKE1vdGlmLCBUcmFpdHMpICAgICAgICBcCi1fU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotX1NUTFBfQ1JFQVRFX0lURVJBVE9SX1RSQUlUU19CQVNFKE5vbkxvY2FsIyNNb3RpZiwgVHJhaXRzKSAgICAgIFwKLV9TVExQX0NSRUFURV9JVEVSQVRPUl9UUkFJVFNfQkFTRShMb2NhbCMjTW90aWYsIFRyYWl0cykgICAgICAgICBcCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotc3RydWN0IF8jI01vdGlmIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdHlwZWRlZiBfQ29uc3ROb25Mb2NhbCMjTW90aWY8X1RwPiBfQ29uc3RUcmFpdHM7ICAgICAgICAgICAgICBcCi0gIHR5cGVkZWYgX05vbkxvY2FsIyNNb3RpZjxfVHA+IF9Ob25Db25zdFRyYWl0czsgICAgICAgICAgICAgICAgXAotICB0eXBlZGVmIF9Db25zdExvY2FsIyNNb3RpZjxfVHA+IF9Db25zdExvY2FsVHJhaXRzOyAgICAgICAgICAgIFwKLSAgdHlwZWRlZiBfTG9jYWwjI01vdGlmPF9UcD4gX05vbkNvbnN0TG9jYWxUcmFpdHM7ICAgICAgICAgICAgICBcCi19OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi0KLS8qCi0jICBpZiBkZWZpbmVkIChfU1RMUF9CQVNFX1RZUEVERUZfQlVHKQotLy8gdGhpcyB3b3JrYXJvdW5kIGlzIG5lZWRlZCBmb3IgU3VuUHJvIDQuMC4xCi10ZW1wbGF0ZSA8Y2xhc3MgX1RyYWl0cz4KLXN0cnVjdCBfX2Nuc3RfdHJhaXRzX2F1eCA6IHByaXZhdGUgX1RyYWl0cyB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOwotfTsKLSMgIGRlZmluZSBfX1RSQUlUU19WQUxVRV9UWVBFKF9UcmFpdHMpIF9fY25zdF90cmFpdHNfYXV4PF9UcmFpdHM+Ojp2YWx1ZV90eXBlCi0jICBlbHNlCi0jICBkZWZpbmUgX19UUkFJVFNfVkFMVUVfVFlQRShfVHJhaXRzKSBfVHJhaXRzOjp2YWx1ZV90eXBlCi0jICBlbmRpZgotKi8KLQotI2lmIGRlZmluZWQgKF9TVExQX01TVkMpCi0vLyBNU1ZDIHNwZWNpZmljCi10ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3IsIGNsYXNzIF9EaXN0PgotaW5saW5lIHZvaWQgIF9TVExQX0NBTEwgX0Rpc3RhbmNlKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcmF0b3IgX19sYXN0LCBfRGlzdCYgX19uKSB7Ci0gIF9fZGlzdGFuY2UoX19maXJzdCwgX19sYXN0LCBfX24sIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yKSk7Ci19Ci0jZW5kaWYKLQotdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9EaXN0YW5jZT4KLV9TVExQX0lOTElORV9MT09QIHZvaWQgIF9TVExQX0NBTEwKLV9fYWR2YW5jZShfSW5wdXRJdGVyJiBfX2ksIF9EaXN0YW5jZSBfX24sIGNvbnN0IGlucHV0X2l0ZXJhdG9yX3RhZyAmKSB7Ci0gIHdoaWxlIChfX24tLSkgKytfX2k7Ci19Ci0KLS8vIGZicCA6IGFkZGVkIG91dHB1dCBpdGVyYXRvciB0YWcgdmFyaWFudAotdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9EaXN0YW5jZT4KLV9TVExQX0lOTElORV9MT09QIHZvaWQgIF9TVExQX0NBTEwKLV9fYWR2YW5jZShfSW5wdXRJdGVyJiBfX2ksIF9EaXN0YW5jZSBfX24sIGNvbnN0IG91dHB1dF9pdGVyYXRvcl90YWcgJikgewotICB3aGlsZSAoX19uLS0pICsrX19pOwotfQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfTk9OVEVNUExfQkFTRV9NQVRDSF9CVUcpCi10ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvciwgY2xhc3MgX0Rpc3RhbmNlPgotX1NUTFBfSU5MSU5FX0xPT1Agdm9pZCBfU1RMUF9DQUxMCi1fX2FkdmFuY2UoX0ZvcndhcmRJdGVyYXRvciYgaSwgX0Rpc3RhbmNlIG4sIGNvbnN0IGZvcndhcmRfaXRlcmF0b3JfdGFnICYpIHsKLSAgd2hpbGUgKG4tLSkgKytpOwotfQotI2VuZGlmCi0KLXRlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCBjbGFzcyBfRGlzdGFuY2U+Ci1fU1RMUF9JTkxJTkVfTE9PUCB2b2lkIF9TVExQX0NBTEwKLV9fYWR2YW5jZShfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yJiBfX2ksIF9EaXN0YW5jZSBfX24sCi0gICAgICAgICAgY29uc3QgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgJikgewotICBpZiAoX19uID4gMCkKLSAgICB3aGlsZSAoX19uLS0pICsrX19pOwotICBlbHNlCi0gICAgd2hpbGUgKF9fbisrKSAtLV9faTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgY2xhc3MgX0Rpc3RhbmNlPgotaW5saW5lIHZvaWQgX1NUTFBfQ0FMTAotX19hZHZhbmNlKF9SYW5kb21BY2Nlc3NJdGVyYXRvciYgX19pLCBfRGlzdGFuY2UgX19uLAotICAgICAgICAgIGNvbnN0IHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnICYpIHsKLSAgX19pICs9IF9fbjsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yLCBjbGFzcyBfRGlzdGFuY2U+Ci1pbmxpbmUgdm9pZCBfU1RMUF9DQUxMIGFkdmFuY2UoX0lucHV0SXRlcmF0b3ImIF9faSwgX0Rpc3RhbmNlIF9fbikgewotICBfX2FkdmFuY2UoX19pLCBfX24sIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9faSwgX0lucHV0SXRlcmF0b3IpKTsKLX0KLQotX1NUTFBfRU5EX05BTUVTUEFDRQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpICYmICFkZWZpbmVkIChfU1RMUF9ERUJVR19IKQotIyAgaW5jbHVkZSA8c3RsL2RlYnVnL19kZWJ1Zy5oPgotI2VuZGlmCi0KLSNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9JVEVSQVRPUl9CQVNFX0ggKi8KLQotCi0vLyBMb2NhbCBWYXJpYWJsZXM6Ci0vLyBtb2RlOkMrKwotLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RsL19pdGVyYXRvcl9vbGQuaCBiL3N0bC9faXRlcmF0b3Jfb2xkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMGExMWYuLjAwMDAwMDAKLS0tIGEvc3RsL19pdGVyYXRvcl9vbGQuaAorKysgL2Rldi9udWxsCkBAIC0xLDM1MSArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NAotICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTYtMTk5OAotICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk3Ci0gKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5Ci0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLQotLyogTk9URTogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgU1RMIGhlYWRlcnMuCi0gKiAgIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LgotICovCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfSVRFUkFUT1JfT0xEX0gKLSNkZWZpbmUgX1NUTFBfSU5URVJOQUxfSVRFUkFUT1JfT0xEX0gKLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9JVEVSQVRPUl9CQVNFX0gKLSMgaW5jbHVkZSA8c3RsL19pdGVyYXRvcl9iYXNlLmg+Ci0jZW5kaWYKLQotX1NUTFBfQkVHSU5fTkFNRVNQQUNFCi0KLSMgaWZkZWYgX1NUTFBfVVNFX09MRF9IUF9JVEVSQVRPUl9RVUVSSUVTCi0KLXRlbXBsYXRlIDxjbGFzcyBfQ29udGFpbmVyPgotaW5saW5lIG91dHB1dF9pdGVyYXRvcl90YWcgX1NUTFBfQ0FMTAotaXRlcmF0b3JfY2F0ZWdvcnkoY29uc3QgYmFja19pbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mKSB7IHJldHVybiBvdXRwdXRfaXRlcmF0b3JfdGFnKCk7IH0KLXRlbXBsYXRlIDxjbGFzcyBfQ29udGFpbmVyPgotaW5saW5lIG91dHB1dF9pdGVyYXRvcl90YWcgX1NUTFBfQ0FMTAotaXRlcmF0b3JfY2F0ZWdvcnkoY29uc3QgZnJvbnRfaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JikgeyByZXR1cm4gb3V0cHV0X2l0ZXJhdG9yX3RhZygpOyB9Ci10ZW1wbGF0ZSA8Y2xhc3MgX0NvbnRhaW5lcj4KLWlubGluZSBvdXRwdXRfaXRlcmF0b3JfdGFnIF9TVExQX0NBTEwKLWl0ZXJhdG9yX2NhdGVnb3J5KGNvbnN0IGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYpIHsgcmV0dXJuIG91dHB1dF9pdGVyYXRvcl90YWcoKTsgfQotCi0jIGVuZGlmCi0KLSMgaWYgZGVmaW5lZCAoX1NUTFBfTVNWQzUwX0NPTVBBVElCSUxJVFkpCi0jIGRlZmluZSBfX1JlZmVyZW5jZSBfUmVmZXJlbmNlLCBjbGFzcyBfUG9pbnRlcgotIyBkZWZpbmUgUmVmZXJlbmNlX18gX1JlZmVyZW5jZSwgX1BvaW50ZXIKLXRlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCBjbGFzcyBfVHAsCi0gICAgX1NUTFBfREZMX1RNUExfUEFSQU0oX1JlZmVyZW5jZSwgX1RwJiApLAotICAgIF9TVExQX0RGTF9UTVBMX1BBUkFNKF9Qb2ludGVyLCBfVHAqKSwKLSAgICBfU1RMUF9ERkxfVFlQRV9QQVJBTShfRGlzdGFuY2UsIHB0cmRpZmZfdCk+Ci0jIGVsc2UKLSMgZGVmaW5lIF9fUmVmZXJlbmNlIF9SZWZlcmVuY2UKLSMgZGVmaW5lIFJlZmVyZW5jZV9fIF9SZWZlcmVuY2UKLXRlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCBjbGFzcyBfVHAsIF9TVExQX0RGTF9UTVBMX1BBUkFNKF9SZWZlcmVuY2UsIF9UcCYgKSwKLSAgICBfU1RMUF9ERkxfVFlQRV9QQVJBTShfRGlzdGFuY2UsIHB0cmRpZmZfdCk+Ci0jIGVuZGlmCi1jbGFzcyByZXZlcnNlX2JpZGlyZWN0aW9uYWxfaXRlcmF0b3IgewotICB0eXBlZGVmIHJldmVyc2VfYmlkaXJlY3Rpb25hbF9pdGVyYXRvcjxfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCBfVHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZmVyZW5jZV9fLCBfRGlzdGFuY2U+IF9TZWxmOwotICAvLyAgZnJpZW5kIGlubGluZSBib29sIG9wZXJhdG9yPT0gX1NUTFBfTlVMTF9UTVBMX0FSR1MgKGNvbnN0IF9TZWxmJiB4LCBjb25zdCBfU2VsZiYgeSk7Ci1wcm90ZWN0ZWQ6Ci0gIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgY3VycmVudDsKLXB1YmxpYzoKLSAgdHlwZWRlZiBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKLSAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOwotICB0eXBlZGVmIF9EaXN0YW5jZSAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKLSMgaWYgZGVmaW5lZCAoX1NUTFBfTVNWQzUwX0NPTVBBVElCSUxJVFkpCi0gIHR5cGVkZWYgX1BvaW50ZXIgICAgICAgICAgICAgICAgICAgcG9pbnRlcjsKLSMgZWxzZQotICB0eXBlZGVmIF9UcCogICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXI7Ci0jIGVuZGlmCi0gIHR5cGVkZWYgX1JlZmVyZW5jZSAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOwotCi0gIHJldmVyc2VfYmlkaXJlY3Rpb25hbF9pdGVyYXRvcigpIHt9Ci0gIGV4cGxpY2l0IHJldmVyc2VfYmlkaXJlY3Rpb25hbF9pdGVyYXRvcihfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9feCkKLSAgICA6IGN1cnJlbnQoX194KSB7fQotICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIGJhc2UoKSBjb25zdCB7IHJldHVybiBjdXJyZW50OyB9Ci0gIF9SZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3QgewotICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX190bXAgPSBjdXJyZW50OwotICAgIHJldHVybiAqKC0tX190bXApOwotICB9Ci0jIGlmICEoZGVmaW5lZCBfU1RMUF9OT19BUlJPV19PUEVSQVRPUikKLSAgX1NUTFBfREVGSU5FX0FSUk9XX09QRVJBVE9SCi0jIGVuZGlmCi0gIF9TZWxmJiBvcGVyYXRvcisrKCkgewotICAgIC0tY3VycmVudDsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgX1NlbGYgb3BlcmF0b3IrKyhpbnQpIHsKLSAgICBfU2VsZiBfX3RtcCA9ICp0aGlzOwotICAgIC0tY3VycmVudDsKLSAgICByZXR1cm4gX190bXA7Ci0gIH0KLSAgX1NlbGYmIG9wZXJhdG9yLS0oKSB7Ci0gICAgKytjdXJyZW50OwotICAgIHJldHVybiAqdGhpczsKLSAgfQotICBfU2VsZiBvcGVyYXRvci0tKGludCkgewotICAgIF9TZWxmIF9fdG1wID0gKnRoaXM7Ci0gICAgKytjdXJyZW50OwotICAgIHJldHVybiBfX3RtcDsKLSAgfQotfTsKLQotIyBpZmRlZiBfU1RMUF9VU0VfT0xEX0hQX0lURVJBVE9SX1FVRVJJRVMKLXRlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCBjbGFzcyBfVHAsIGNsYXNzIF9fUmVmZXJlbmNlLAotICAgICAgICAgIGNsYXNzIF9EaXN0YW5jZT4KLWlubGluZSBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZyBfU1RMUF9DQUxMCi1pdGVyYXRvcl9jYXRlZ29yeShjb25zdCByZXZlcnNlX2JpZGlyZWN0aW9uYWxfaXRlcmF0b3I8X0JpZGlyZWN0aW9uYWxJdGVyYXRvciwgX1RwLCBSZWZlcmVuY2VfXywgX0Rpc3RhbmNlPiYpCi17IHJldHVybiBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZygpOyB9Ci10ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciwgY2xhc3MgX1RwLCBjbGFzcyBfX1JlZmVyZW5jZSwKLSAgY2xhc3MgX0Rpc3RhbmNlPgotaW5saW5lIF9UcCogX1NUTFBfQ0FMTAotdmFsdWVfdHlwZShjb25zdCByZXZlcnNlX2JpZGlyZWN0aW9uYWxfaXRlcmF0b3I8X0JpZGlyZWN0aW9uYWxJdGVyYXRvciwgX1RwLCBSZWZlcmVuY2VfXywgX0Rpc3RhbmNlPiYpCi17IHJldHVybiAoX1RwKikgMDsgfQotdGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IsIGNsYXNzIF9UcCwgY2xhc3MgX19SZWZlcmVuY2UsCi0gICAgICAgICAgY2xhc3MgX0Rpc3RhbmNlPgotaW5saW5lIF9EaXN0YW5jZSogX1NUTFBfQ0FMTAotZGlzdGFuY2VfdHlwZShjb25zdCByZXZlcnNlX2JpZGlyZWN0aW9uYWxfaXRlcmF0b3I8X0JpZGlyZWN0aW9uYWxJdGVyYXRvciwgX1RwLCBSZWZlcmVuY2VfXywgX0Rpc3RhbmNlPiYpCi17IHJldHVybiAoX0Rpc3RhbmNlKikgMDsgfQotI2VuZGlmCi0KLXRlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCBjbGFzcyBfVHAsIGNsYXNzIF9fUmVmZXJlbmNlLAotICAgICAgICAgIGNsYXNzIF9EaXN0YW5jZT4KLWlubGluZSBib29sICBfU1RMUF9DQUxMIG9wZXJhdG9yPT0oCi0gICAgY29uc3QgcmV2ZXJzZV9iaWRpcmVjdGlvbmFsX2l0ZXJhdG9yPF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IsIF9UcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmZXJlbmNlX18sIF9EaXN0YW5jZT4mIF9feCwKLSAgICBjb25zdCByZXZlcnNlX2JpZGlyZWN0aW9uYWxfaXRlcmF0b3I8X0JpZGlyZWN0aW9uYWxJdGVyYXRvciwgX1RwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZlcmVuY2VfXywgX0Rpc3RhbmNlPiYgX195KQotewotICByZXR1cm4gX194LmJhc2UoKSA9PSBfX3kuYmFzZSgpOwotfQotCi0jaWZkZWYgX1NUTFBfVVNFX1NFUEFSQVRFX1JFTE9QU19OQU1FU1BBQ0UKLQotdGVtcGxhdGUgPGNsYXNzIF9CaUl0ZXIsIGNsYXNzIF9UcCwgY2xhc3MgX19SZWZlcmVuY2UsIGNsYXNzIF9EaXN0YW5jZT4KLWlubGluZSBib29sICBfU1RMUF9DQUxMIG9wZXJhdG9yIT0oCi0gICAgY29uc3QgcmV2ZXJzZV9iaWRpcmVjdGlvbmFsX2l0ZXJhdG9yPF9CaUl0ZXIsIF9UcCwgUmVmZXJlbmNlX18sIF9EaXN0YW5jZT4mIF9feCwKLSAgICBjb25zdCByZXZlcnNlX2JpZGlyZWN0aW9uYWxfaXRlcmF0b3I8X0JpSXRlciwgX1RwLCBSZWZlcmVuY2VfXywgX0Rpc3RhbmNlPiYgX195KQotewotICByZXR1cm4gIShfX3ggPT0gX195KTsKLX0KLQotI2VuZGlmIC8qIF9TVExQX1VTRV9TRVBBUkFURV9SRUxPUFNfTkFNRVNQQUNFICovCi0KLSNpZiAhIGRlZmluZWQgKCBfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OICkKLQotLy8gVGhpcyBpcyB0aGUgb2xkIHZlcnNpb24gb2YgcmV2ZXJzZV9pdGVyYXRvciwgYXMgZm91bmQgaW4gdGhlIG9yaWdpbmFsCi0vLyAgSFAgU1RMLiAgSXQgZG9lcyBub3QgdXNlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24uCi0KLXRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsCi0jIGlmIGRlZmluZWQgKF9fTVNMX18pICYmIChfX01TTF9fID49IDB4MjQwNSkgXAotICB8fCBkZWZpbmVkKF9fTVJDX18pIHx8IChkZWZpbmVkKF9fU0NfXykgJiYgIWRlZmluZWQoX19ETUNfXykpICAgIC8vKnR5IDAzLzIyLzIwMDEgLSBnaXZlIHRoZSBkZWZhdWx0IHRvIHRoZSBzZWNvbnQgcGFyYW0gdW5kZXIgTVBXLgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSSBiZWxpZXZlIGdpdmluZyB0aGUgZGVmYXVsdCB3aWxsIGNhdXNlIGFueSBoYXJtIGV2ZW4gdGhvdWdoIHRoZSAybmQgdHlwZSBwYXJhbWV0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0aWxsIGhhdmUgdG8gYmUgcHJvdmlkZWQgZm9yIFQqIHR5cGUgaXRlcmF0b3JzLgotICBfU1RMUF9ERkxfVE1QTF9QQVJBTShfVHAsaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OnZhbHVlX3R5cGUpLAotIyBlbHNlCi0gIGNsYXNzIF9UcCwKLSNlbmRpZgotIF9TVExQX0RGTF9UTVBMX1BBUkFNKF9SZWZlcmVuY2UsX1RwJiksCi0jIGlmIGRlZmluZWQgKF9TVExQX01TVkM1MF9DT01QQVRJQklMSVRZKQotICAgICAgICBfU1RMUF9ERkxfVE1QTF9QQVJBTShfUG9pbnRlciwgX1RwKiksCi0jIGVuZGlmCi0gICAgICAgIF9TVExQX0RGTF9UWVBFX1BBUkFNKF9EaXN0YW5jZSxwdHJkaWZmX3QpPgotY2xhc3MgcmV2ZXJzZV9pdGVyYXRvciB7Ci0gIHR5cGVkZWYgcmV2ZXJzZV9pdGVyYXRvcjxfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIF9UcCwgUmVmZXJlbmNlX18sIF9EaXN0YW5jZT4KLSAgICAgICAgICBfU2VsZjsKLXByb3RlY3RlZDoKLSAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fY3VycmVudDsKLXB1YmxpYzoKLSAgdHlwZWRlZiByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKLSAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOwotICB0eXBlZGVmIF9EaXN0YW5jZSAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKLSMgaWYgZGVmaW5lZCAoX1NUTFBfTVNWQzUwX0NPTVBBVElCSUxJVFkpCi0gIHR5cGVkZWYgX1BvaW50ZXIgICAgICAgICAgICAgICAgICAgcG9pbnRlcjsKLSMgZWxzZQotICB0eXBlZGVmIF9UcCogICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXI7Ci0jIGVuZGlmCi0gIHR5cGVkZWYgX1JlZmVyZW5jZSAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOwotCi0gIHJldmVyc2VfaXRlcmF0b3IoKSB7fQotICByZXZlcnNlX2l0ZXJhdG9yKGNvbnN0IF9TZWxmJiBfX3gpIDogX19jdXJyZW50KF9feC5iYXNlKCkpIHt9Ci0gIGV4cGxpY2l0IHJldmVyc2VfaXRlcmF0b3IoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9feCkgOiBfX2N1cnJlbnQoX194KSB7fQotICBfU2VsZiYgb3BlcmF0b3I9KGNvbnN0IF9TZWxmJiBfX3gpIHtfX2N1cnJlbnQgPSBfX3guYmFzZSgpOyByZXR1cm4gKnRoaXM7IH0KLQotICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgYmFzZSgpIGNvbnN0IHsgcmV0dXJuIF9fY3VycmVudDsgfQotICBfUmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICooX19jdXJyZW50IC0gKGRpZmZlcmVuY2VfdHlwZSkxKTsgfQotCi0jIGlmICEoZGVmaW5lZCBfU1RMUF9OT19BUlJPV19PUEVSQVRPUikKLSAgX1NUTFBfREVGSU5FX0FSUk9XX09QRVJBVE9SCi0jIGVuZGlmCi0KLSAgX1NlbGYmIG9wZXJhdG9yKysoKSB7Ci0gICAgLS1fX2N1cnJlbnQ7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIF9TZWxmIG9wZXJhdG9yKysoaW50KSB7Ci0gICAgX1NlbGYgX190bXAgPSAqdGhpczsKLSAgICAtLV9fY3VycmVudDsKLSAgICByZXR1cm4gX190bXA7Ci0gIH0KLSAgX1NlbGYmIG9wZXJhdG9yLS0oKSB7Ci0gICAgKytfX2N1cnJlbnQ7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIF9TZWxmIG9wZXJhdG9yLS0oaW50KSB7Ci0gICAgX1NlbGYgX190bXAgPSAqdGhpczsKLSAgICArK19fY3VycmVudDsKLSAgICByZXR1cm4gX190bXA7Ci0gIH0KLSAgX1NlbGYgb3BlcmF0b3IrKF9EaXN0YW5jZSBfX24pIGNvbnN0IHsKLSAgICByZXR1cm4gX1NlbGYoX19jdXJyZW50IC0gX19uKTsKLSAgfQotICBfU2VsZiYgb3BlcmF0b3IrPShfRGlzdGFuY2UgX19uKSB7Ci0gICAgX19jdXJyZW50IC09IF9fbjsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgX1NlbGYgb3BlcmF0b3ItKF9EaXN0YW5jZSBfX24pIGNvbnN0IHsKLSAgICByZXR1cm4gX1NlbGYoX19jdXJyZW50ICsgX19uKTsKLSAgfQotICBfU2VsZiYgb3BlcmF0b3ItPShfRGlzdGFuY2UgX19uKSB7Ci0gICAgX19jdXJyZW50ICs9IF9fbjsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgX1JlZmVyZW5jZSBvcGVyYXRvcltdKF9EaXN0YW5jZSBfX24pIGNvbnN0IHsgcmV0dXJuICooKnRoaXMgKyBfX24pOyB9Ci19OwotCi0jIGlmZGVmIF9TVExQX1VTRV9PTERfSFBfSVRFUkFUT1JfUVVFUklFUwotdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgY2xhc3MgX1RwLAotICAgICAgICAgIGNsYXNzIF9fUmVmZXJlbmNlLCBjbGFzcyBfRGlzdGFuY2U+Ci1pbmxpbmUgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgX1NUTFBfQ0FMTAotaXRlcmF0b3JfY2F0ZWdvcnkoY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIF9UcCwgUmVmZXJlbmNlX18sIF9EaXN0YW5jZT4mKQoteyByZXR1cm4gcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcoKTsgfQotdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgY2xhc3MgX1RwLAotICBjbGFzcyBfX1JlZmVyZW5jZSwgY2xhc3MgX0Rpc3RhbmNlPgotaW5saW5lIF9UcCogIF9TVExQX0NBTEwgdmFsdWVfdHlwZShjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgX1RwLCBSZWZlcmVuY2VfXywgX0Rpc3RhbmNlPiYpCi17IHJldHVybiAoX1RwKikgMDsgfQotdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgY2xhc3MgX1RwLAotICAgICAgICAgIGNsYXNzIF9fUmVmZXJlbmNlLCBjbGFzcyBfRGlzdGFuY2U+Ci1pbmxpbmUgX0Rpc3RhbmNlKiAgX1NUTFBfQ0FMTAotZGlzdGFuY2VfdHlwZShjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgX1RwLCBSZWZlcmVuY2VfXywgX0Rpc3RhbmNlPiYpCi17IHJldHVybiAoX0Rpc3RhbmNlKikgMDsgfQotI2VuZGlmCi0KLXRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIGNsYXNzIF9UcCwKLSAgICAgICAgICBjbGFzcyBfX1JlZmVyZW5jZSwgY2xhc3MgX0Rpc3RhbmNlPgotaW5saW5lIGJvb2wgIF9TVExQX0NBTEwKLW9wZXJhdG9yPT0oY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIF9UcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZlcmVuY2VfXywgX0Rpc3RhbmNlPiYgX194LAotICAgICAgICAgICBjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgX1RwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZmVyZW5jZV9fLCBfRGlzdGFuY2U+JiBfX3kpCi17Ci0gIHJldHVybiBfX3guYmFzZSgpID09IF9feS5iYXNlKCk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIGNsYXNzIF9UcCwKLSAgICAgICAgICBjbGFzcyBfX1JlZmVyZW5jZSwgY2xhc3MgX0Rpc3RhbmNlPgotaW5saW5lIGJvb2wgX1NUTFBfQ0FMTAotb3BlcmF0b3I8KGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBfVHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZlcmVuY2VfXywgX0Rpc3RhbmNlPiYgX194LAotICAgICAgICAgIGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBfVHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZlcmVuY2VfXywgX0Rpc3RhbmNlPiYgX195KQotewotICByZXR1cm4gX195LmJhc2UoKSA8IF9feC5iYXNlKCk7Ci19Ci0KLSNpZmRlZiBfU1RMUF9VU0VfU0VQQVJBVEVfUkVMT1BTX05BTUVTUEFDRQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBjbGFzcyBfVHAsCi0gICAgICAgICAgY2xhc3MgX19SZWZlcmVuY2UsIGNsYXNzIF9EaXN0YW5jZT4KLWlubGluZSBib29sIF9TVExQX0NBTEwKLW9wZXJhdG9yIT0oY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIF9UcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZlcmVuY2VfXywgX0Rpc3RhbmNlPiYgX194LAotICAgICAgICAgICBjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgX1RwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZmVyZW5jZV9fLCBfRGlzdGFuY2U+JiBfX3kpIHsKLSAgcmV0dXJuICEoX194ID09IF9feSk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIGNsYXNzIF9UcCwKLSAgICAgICAgICBjbGFzcyBfX1JlZmVyZW5jZSwgY2xhc3MgX0Rpc3RhbmNlPgotaW5saW5lIGJvb2wgX1NUTFBfQ0FMTAotb3BlcmF0b3I+KGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBfVHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZlcmVuY2VfXywgX0Rpc3RhbmNlPiYgX194LAotICAgICAgICAgIGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBfVHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZlcmVuY2VfXywgX0Rpc3RhbmNlPiYgX195KSB7Ci0gIHJldHVybiBfX3kgPCBfX3g7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIGNsYXNzIF9UcCwKLSAgICAgICAgICBjbGFzcyBfX1JlZmVyZW5jZSwgY2xhc3MgX0Rpc3RhbmNlPgotaW5saW5lIGJvb2wgX1NUTFBfQ0FMTAotb3BlcmF0b3I8PShjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgX1RwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZmVyZW5jZV9fLCBfRGlzdGFuY2U+JiBfX3gsCi0gICAgICAgICAgIGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBfVHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmZXJlbmNlX18sIF9EaXN0YW5jZT4mIF9feSkgewotICByZXR1cm4gIShfX3kgPCBfX3gpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBjbGFzcyBfVHAsCi0gICAgICAgICAgY2xhc3MgX19SZWZlcmVuY2UsIGNsYXNzIF9EaXN0YW5jZT4KLWlubGluZSBib29sIF9TVExQX0NBTEwKLW9wZXJhdG9yPj0oY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIF9UcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZlcmVuY2VfXywgX0Rpc3RhbmNlPiYgX194LAotICAgICAgICAgICBjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgX1RwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZmVyZW5jZV9fLCBfRGlzdGFuY2U+JiBfX3kpIHsKLSAgcmV0dXJuICEoX194IDwgX195KTsKLX0KLQotI2VuZGlmIC8qIF9TVExQX1VTRV9TRVBBUkFURV9SRUxPUFNfTkFNRVNQQUNFICovCi0KLXRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIGNsYXNzIF9UcCwKLSAgICAgICAgICBjbGFzcyBfX1JlZmVyZW5jZSwgY2xhc3MgX0Rpc3RhbmNlPgotaW5saW5lIF9EaXN0YW5jZSAgX1NUTFBfQ0FMTAotb3BlcmF0b3ItKGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBfVHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZlcmVuY2VfXywgX0Rpc3RhbmNlPiYgX194LAotICAgICAgICAgIGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBfVHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZlcmVuY2VfXywgX0Rpc3RhbmNlPiYgX195KQotewotICByZXR1cm4gX195LmJhc2UoKSAtIF9feC5iYXNlKCk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIGNsYXNzIF9UcCwKLSAgICAgICAgICBjbGFzcyBfX1JlZmVyZW5jZSwgY2xhc3MgX0Rpc3RhbmNlPgotaW5saW5lIHJldmVyc2VfaXRlcmF0b3I8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBfVHAsCi0gICAgICAgICAgICAgICAgICAgICAgICBSZWZlcmVuY2VfXywgX0Rpc3RhbmNlPiAgX1NUTFBfQ0FMTAotb3BlcmF0b3IrKF9EaXN0YW5jZSBfX24sCi0gICAgICAgICAgY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIF9UcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZmVyZW5jZV9fLCBfRGlzdGFuY2U+JiBfX3gpCi17Ci0gIHJldHVybiByZXZlcnNlX2l0ZXJhdG9yPF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgX1RwLAotICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZlcmVuY2VfXywgX0Rpc3RhbmNlPihfX3guYmFzZSgpIC0gX19uKTsKLX0KLQotI2VuZGlmIC8qICEgZGVmaW5lZCAoIF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04gKSAqLwotCi1fU1RMUF9FTkRfTkFNRVNQQUNFCi0KLSNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9JVEVSQVRPUl9IICovCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX2xpbWl0cy5jIGIvc3RsL19saW1pdHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU2NDg5Yi4uMDAwMDAwMAotLS0gYS9zdGwvX2xpbWl0cy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzE1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsMTk5OQotICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLQotI2lmbmRlZiBfU1RMUF9MSU1JVFNfQwotI2RlZmluZSBfU1RMUF9MSU1JVFNfQwotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0xJTUlUUwotIyAgaW5jbHVkZSA8c3RsL19saW1pdHMuaD4KLSNlbmRpZgotCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vICBudW1lcmljX2xpbWl0cyBzdGF0aWMgbWVtYmVycwotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLV9TVExQX0JFR0lOX05BTUVTUEFDRQotCi1fU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCi0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfU1RBVElDX0NPTlNUX0lOSVRfQlVHKQotCi0jICBkZWZpbmUgX19kZWNsYXJlX251bWVyaWNfYmFzZV9tZW1iZXIoX190eXBlLCBfX21lbSwgX0luaXQpIFwKLXRlbXBsYXRlIDxjbGFzcyBfX251bWJlcj4gXAotICBjb25zdCBfX3R5cGUgX051bWVyaWNfbGltaXRzX2Jhc2U8X19udW1iZXI+OjogX19tZW0KLQotX19kZWNsYXJlX251bWVyaWNfYmFzZV9tZW1iZXIoYm9vbCwgaXNfc3BlY2lhbGl6ZWQsIGZhbHNlKTsKLV9fZGVjbGFyZV9udW1lcmljX2Jhc2VfbWVtYmVyKGludCwgZGlnaXRzLCAwKTsKLV9fZGVjbGFyZV9udW1lcmljX2Jhc2VfbWVtYmVyKGludCwgZGlnaXRzMTAsIDApOwotX19kZWNsYXJlX251bWVyaWNfYmFzZV9tZW1iZXIoYm9vbCwgaXNfc2lnbmVkLCBmYWxzZSk7Ci1fX2RlY2xhcmVfbnVtZXJpY19iYXNlX21lbWJlcihib29sLCBpc19pbnRlZ2VyLCBmYWxzZSk7Ci1fX2RlY2xhcmVfbnVtZXJpY19iYXNlX21lbWJlcihib29sLCBpc19leGFjdCwgZmFsc2UpOwotX19kZWNsYXJlX251bWVyaWNfYmFzZV9tZW1iZXIoaW50LCByYWRpeCwgMCk7Ci1fX2RlY2xhcmVfbnVtZXJpY19iYXNlX21lbWJlcihpbnQsIG1pbl9leHBvbmVudCwgMCk7Ci1fX2RlY2xhcmVfbnVtZXJpY19iYXNlX21lbWJlcihpbnQsIG1heF9leHBvbmVudCwgMCk7Ci1fX2RlY2xhcmVfbnVtZXJpY19iYXNlX21lbWJlcihpbnQsIG1pbl9leHBvbmVudDEwLCAwKTsKLV9fZGVjbGFyZV9udW1lcmljX2Jhc2VfbWVtYmVyKGludCwgbWF4X2V4cG9uZW50MTAsIDApOwotX19kZWNsYXJlX251bWVyaWNfYmFzZV9tZW1iZXIoYm9vbCwgaGFzX2luZmluaXR5LCBmYWxzZSk7Ci1fX2RlY2xhcmVfbnVtZXJpY19iYXNlX21lbWJlcihib29sLCBoYXNfcXVpZXRfTmFOLCBmYWxzZSk7Ci1fX2RlY2xhcmVfbnVtZXJpY19iYXNlX21lbWJlcihib29sLCBoYXNfc2lnbmFsaW5nX05hTiwgZmFsc2UpOwotX19kZWNsYXJlX251bWVyaWNfYmFzZV9tZW1iZXIoZmxvYXRfZGVub3JtX3N0eWxlLCBoYXNfZGVub3JtLCBkZW5vcm1fYWJzZW50KTsKLV9fZGVjbGFyZV9udW1lcmljX2Jhc2VfbWVtYmVyKGJvb2wsIGhhc19kZW5vcm1fbG9zcywgZmFsc2UpOwotX19kZWNsYXJlX251bWVyaWNfYmFzZV9tZW1iZXIoYm9vbCwgaXNfaWVjNTU5LCBmYWxzZSk7Ci1fX2RlY2xhcmVfbnVtZXJpY19iYXNlX21lbWJlcihib29sLCBpc19ib3VuZGVkLCBmYWxzZSk7Ci1fX2RlY2xhcmVfbnVtZXJpY19iYXNlX21lbWJlcihib29sLCBpc19tb2R1bG8sIGZhbHNlKTsKLV9fZGVjbGFyZV9udW1lcmljX2Jhc2VfbWVtYmVyKGJvb2wsIHRyYXBzLCBmYWxzZSk7Ci1fX2RlY2xhcmVfbnVtZXJpY19iYXNlX21lbWJlcihib29sLCB0aW55bmVzc19iZWZvcmUsIGZhbHNlKTsKLV9fZGVjbGFyZV9udW1lcmljX2Jhc2VfbWVtYmVyKGZsb2F0X3JvdW5kX3N0eWxlLCByb3VuZF9zdHlsZSwgcm91bmRfdG93YXJkX3plcm8pOwotCi0jICB1bmRlZiBfX2RlY2xhcmVfbnVtZXJpY19iYXNlX21lbWJlcgotCi0jICBkZWZpbmUgX19kZWNsYXJlX2ludGVnZXJfbGltaXRzX21lbWJlcihfX3R5cGUsIF9fbWVtLCBfSW5pdCkgXAotdGVtcGxhdGUgPGNsYXNzIF9JbnQsIF9TVExQX0xJTUlUU19NSU5fVFlQRSBfX2ltaW4sIF9TVExQX0xJTUlUU19NQVhfVFlQRSBfX2ltYXgsIGludCBfX2lkaWdpdHMsIGJvb2wgX19pc21vZD4gXAotICBjb25zdCBfX3R5cGUgX0ludGVnZXJfbGltaXRzPF9JbnQsIF9faW1pbiwgX19pbWF4LCBfX2lkaWdpdHMsIF9faXNtb2Q+OjogX19tZW0KLQotX19kZWNsYXJlX2ludGVnZXJfbGltaXRzX21lbWJlcihib29sLCBpc19zcGVjaWFsaXplZCwgdHJ1ZSk7Ci1fX2RlY2xhcmVfaW50ZWdlcl9saW1pdHNfbWVtYmVyKGludCwgZGlnaXRzLCAoX19pZGlnaXRzIDwgMCkgPyBcCi0gICAgICAgICAgKChpbnQpKChzaXplb2YoX0ludCkgKiAoQ0hBUl9CSVQpKSkgLSAoKF9faW1pbiA9PSAwKSA/IDAgOiAxKSkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKF9faWRpZ2l0cykgKTsKLV9fZGVjbGFyZV9pbnRlZ2VyX2xpbWl0c19tZW1iZXIoaW50LCBkaWdpdHMxMCwgKGludCkoMzAxVUwgKiBkaWdpdHMpIC8xMDAwKTsKLV9fZGVjbGFyZV9pbnRlZ2VyX2xpbWl0c19tZW1iZXIoYm9vbCwgaXNfc2lnbmVkLCBfX2ltaW4gIT0gMCk7Ci1fX2RlY2xhcmVfaW50ZWdlcl9saW1pdHNfbWVtYmVyKGJvb2wsIGlzX2ludGVnZXIsIHRydWUpOwotX19kZWNsYXJlX2ludGVnZXJfbGltaXRzX21lbWJlcihib29sLCBpc19leGFjdCwgdHJ1ZSk7Ci1fX2RlY2xhcmVfaW50ZWdlcl9saW1pdHNfbWVtYmVyKGludCwgcmFkaXgsIDIpOwotX19kZWNsYXJlX2ludGVnZXJfbGltaXRzX21lbWJlcihib29sLCBpc19ib3VuZGVkLCB0cnVlKTsKLV9fZGVjbGFyZV9pbnRlZ2VyX2xpbWl0c19tZW1iZXIoYm9vbCwgaXNfbW9kdWxvLCB0cnVlKTsKLSMgIHVuZGVmIF9fZGVjbGFyZV9pbnRlZ2VyX2xpbWl0c19tZW1iZXIKLQotIyAgZGVmaW5lIF9fZGVjbGFyZV9mbG9hdF9saW1pdHNfbWVtYmVyKF9fdHlwZSwgX19tZW0sIF9Jbml0KSBcCi10ZW1wbGF0ZSA8Y2xhc3MgX19udW1iZXIsICBcCi0gICAgICAgICBpbnQgX19EaWdpdHMsIGludCBfX0RpZ2l0czEwLCAgICBcCi0gICAgICAgICBpbnQgX19NaW5FeHAsIGludCBfX01heEV4cCwgICAgICBcCi0gICAgICAgICBpbnQgX19NaW5FeHAxMCwgaW50IF9fTWF4RXhwMTAsICBcCi0gICAgICAgICBib29sIF9fSXNJRUM1NTksIFwKLSAgICAgICAgIGZsb2F0X3JvdW5kX3N0eWxlIF9fUm91bmRTdHlsZT4gXAotY29uc3QgX190eXBlIF9GbG9hdGluZ19saW1pdHM8IF9fbnVtYmVyLCBfX0RpZ2l0cywgX19EaWdpdHMxMCwgICAgXAotICAgICAgICAgX19NaW5FeHAsIF9fTWF4RXhwLCBfX01pbkV4cDEwLCBfX01heEV4cDEwLCAgXAotICAgICAgICAgX19Jc0lFQzU1OSwgX19Sb3VuZFN0eWxlPjo6XAotICAgICAgICAgX19tZW0KLQotX19kZWNsYXJlX2Zsb2F0X2xpbWl0c19tZW1iZXIoYm9vbCwgaXNfc3BlY2lhbGl6ZWQsIHRydWUpOwotX19kZWNsYXJlX2Zsb2F0X2xpbWl0c19tZW1iZXIoaW50LCBkaWdpdHMsIF9fRGlnaXRzKTsKLV9fZGVjbGFyZV9mbG9hdF9saW1pdHNfbWVtYmVyKGludCwgZGlnaXRzMTAsIF9fRGlnaXRzMTApOwotX19kZWNsYXJlX2Zsb2F0X2xpbWl0c19tZW1iZXIoYm9vbCwgaXNfc2lnbmVkLCB0cnVlKTsKLV9fZGVjbGFyZV9mbG9hdF9saW1pdHNfbWVtYmVyKGludCwgcmFkaXgsIEZMVF9SQURJWCk7Ci1fX2RlY2xhcmVfZmxvYXRfbGltaXRzX21lbWJlcihpbnQsIG1pbl9leHBvbmVudCwgX19NaW5FeHApOwotX19kZWNsYXJlX2Zsb2F0X2xpbWl0c19tZW1iZXIoaW50LCBtYXhfZXhwb25lbnQsIF9fTWF4RXhwKTsKLV9fZGVjbGFyZV9mbG9hdF9saW1pdHNfbWVtYmVyKGludCwgbWluX2V4cG9uZW50MTAsIF9fTWluRXhwMTApOwotX19kZWNsYXJlX2Zsb2F0X2xpbWl0c19tZW1iZXIoaW50LCBtYXhfZXhwb25lbnQxMCwgX19NYXhFeHAxMCk7Ci1fX2RlY2xhcmVfZmxvYXRfbGltaXRzX21lbWJlcihib29sLCBoYXNfaW5maW5pdHksIHRydWUpOwotX19kZWNsYXJlX2Zsb2F0X2xpbWl0c19tZW1iZXIoYm9vbCwgaGFzX3F1aWV0X05hTiwgdHJ1ZSk7Ci1fX2RlY2xhcmVfZmxvYXRfbGltaXRzX21lbWJlcihib29sLCBoYXNfc2lnbmFsaW5nX05hTiwgdHJ1ZSk7Ci1fX2RlY2xhcmVfZmxvYXRfbGltaXRzX21lbWJlcihmbG9hdF9kZW5vcm1fc3R5bGUsIGhhc19kZW5vcm0sIGRlbm9ybV9pbmRldGVybWluYXRlKTsKLV9fZGVjbGFyZV9mbG9hdF9saW1pdHNfbWVtYmVyKGJvb2wsIGhhc19kZW5vcm1fbG9zcywgZmFsc2UpOwotX19kZWNsYXJlX2Zsb2F0X2xpbWl0c19tZW1iZXIoYm9vbCwgaXNfaWVjNTU5LCBfX0lzSUVDNTU5KTsKLV9fZGVjbGFyZV9mbG9hdF9saW1pdHNfbWVtYmVyKGJvb2wsIGlzX2JvdW5kZWQsIHRydWUpOwotX19kZWNsYXJlX2Zsb2F0X2xpbWl0c19tZW1iZXIoYm9vbCwgdHJhcHMsIHRydWUpOwotX19kZWNsYXJlX2Zsb2F0X2xpbWl0c19tZW1iZXIoYm9vbCwgdGlueW5lc3NfYmVmb3JlLCBmYWxzZSk7Ci1fX2RlY2xhcmVfZmxvYXRfbGltaXRzX21lbWJlcihmbG9hdF9yb3VuZF9zdHlsZSwgcm91bmRfc3R5bGUsIF9fUm91bmRTdHlsZSk7Ci0jICB1bmRlZiBfX2RlY2xhcmVfZmxvYXRfbGltaXRzX21lbWJlcgotCi0jZW5kaWYgLyogX1NUTFBfU1RBVElDX0NPTlNUX0lOSVRfQlVHICovCi0KLQotI2lmIGRlZmluZWQgKF9TVExQX0VYUE9TRV9HTE9CQUxTX0lNUExFTUVOVEFUSU9OKQotCi0jICBpZiBkZWZpbmVkIChfU1RMUF9CSUdfRU5ESUFOKQotIyAgICBpZiBkZWZpbmVkIChfX09TNDAwX18pCi0jICAgICAgZGVmaW5lIF9TVExQX0ZMT0FUX0lORl9SRVAgeyAweDdmODAsIDAgfQotIyAgICAgIGRlZmluZSBfU1RMUF9GTE9BVF9RTkFOX1JFUCB7IDB4ZmZjMCwgMCB9Ci0jICAgICAgZGVmaW5lIF9TVExQX0ZMT0FUX1NOQU5fUkVQIHsgMHhmZjgwLCAwIH0KLSMgICAgICBkZWZpbmUgX1NUTFBfRE9VQkxFX0lORl9SRVAgeyAweDdmZjAsIDAsIDAsIDAgfQotIyAgICAgIGRlZmluZSBfU1RMUF9ET1VCTEVfUU5BTl9SRVAgeyAweGZmZjgsIDAsIDAsIDAgfQotIyAgICAgIGRlZmluZSBfU1RMUF9ET1VCTEVfU05BTl9SRVAgeyAweGZmZjAsIDAsIDAsIDAgfQotIyAgICAgIGRlZmluZSBfU1RMUF9MRE9VQkxFX0lORl9SRVAgeyAweDdmZjAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfQotIyAgICAgIGRlZmluZSBfU1RMUF9MRE9VQkxFX1FOQU5fUkVQIHsgMHhmZmY4LCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0KLSMgICAgICBkZWZpbmUgX1NUTFBfTERPVUJMRV9TTkFOX1JFUCB7IDB4ZmZmMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9Ci0jICAgIGVsc2UgLyogX19PUzQwMF9fICovCi0jICAgICAgZGVmaW5lIF9TVExQX0ZMT0FUX0lORl9SRVAgICB7IDB4N2Y4MCwgMCB9Ci0jICAgICAgZGVmaW5lIF9TVExQX0ZMT0FUX1FOQU5fUkVQICB7IDB4N2ZjMSwgMCB9Ci0jICAgICAgZGVmaW5lIF9TVExQX0ZMT0FUX1NOQU5fUkVQICB7IDB4N2Y4MSwgMCB9Ci0jICAgICAgZGVmaW5lIF9TVExQX0RPVUJMRV9JTkZfUkVQICB7IDB4N2ZmMCwgMCwgMCwgMCB9Ci0jICAgICAgZGVmaW5lIF9TVExQX0RPVUJMRV9RTkFOX1JFUCB7IDB4N2ZmOSwgMCwgMCwgMCB9Ci0jICAgICAgZGVmaW5lIF9TVExQX0RPVUJMRV9TTkFOX1JFUCB7IDB4N2ZmMSwgMCwgMCwgMCB9Ci0jICAgICAgZGVmaW5lIF9TVExQX0xET1VCTEVfSU5GX1JFUCB7IDB4N2ZmMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9Ci0jICAgICAgZGVmaW5lIF9TVExQX0xET1VCTEVfUU5BTl9SRVAgeyAweDdmZjEsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfQotIyAgICAgIGRlZmluZSBfU1RMUF9MRE9VQkxFX1NOQU5fUkVQIHsgMHg3ZmY5LCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0KLSMgICAgZW5kaWYgLyogX19PUzQwMF9fICovCi0KLSMgIGVsaWYgZGVmaW5lZCAoX1NUTFBfTElUVExFX0VORElBTikKLQotIyAgICBpZiAwIC8qIGRlZmluZWQoX1NUTFBfTVNWQykgfHwgZGVmaW5lZChfX2xpbnV4X18pICovCi0vLyBzb21lIElBLTMyIHBsYXRmb3JtID8/Ci0vKgotIyAgICAgIGRlZmluZSBfU1RMUF9GTE9BVF9JTkZfUkVQIHsgMCwgMHg3ZjgwIH0KLSMgICAgICBkZWZpbmUgX1NUTFBfRkxPQVRfUU5BTl9SRVAgeyAwLCAweGZmYzAgfQotIyAgICAgIGRlZmluZSBfU1RMUF9GTE9BVF9TTkFOX1JFUCB7IDAsIDB4ZmY4MCB9Ci0KLSMgICAgICBkZWZpbmUgX1NUTFBfRE9VQkxFX0lORl9SRVAgeyAwLCAwLCAwLCAweDdmZjAgfQotIyAgICAgIGRlZmluZSBfU1RMUF9ET1VCTEVfUU5BTl9SRVAgeyAwLCAwLCAwLCAweGZmZjggfQotIyAgICAgIGRlZmluZSBfU1RMUF9ET1VCTEVfU05BTl9SRVAgeyAwLCAwLCAwLCAweGZmZjAgfQotIyAgICAgIGRlZmluZSBfU1RMUF9MRE9VQkxFX0lORl9SRVAgeyAwLCAwLCAwLCAweDdGRjAsIDAgfSAvLyA/Pz8/Ci0jICAgICAgZGVmaW5lIF9TVExQX0xET1VCTEVfUU5BTl9SRVAgeyAwLCAwLCAwLCAweEZGRjgsIDAgfSAvLyA/Pz8/Ci0jICAgICAgZGVmaW5lIF9TVExQX0xET1VCTEVfU05BTl9SRVAgeyAwLCAwLCAwLCAweEZGRjAsIDAgfSAvLyA/Pz8/Ci0qLwotIyAgICBlbGlmIGRlZmluZWQoX19ERUNDWFgpCi0KLSMgICAgICBkZWZpbmUgX1NUTFBfRkxPQVRfSU5GX1JFUCB7IDAsIDB4N2Y4MCB9Ci0jICAgICAgZGVmaW5lIF9TVExQX0ZMT0FUX1FOQU5fUkVQIHsgMCwgMHhmZmMwIH0KLSMgICAgICBkZWZpbmUgX1NUTFBfRkxPQVRfU05BTl9SRVAgeyAweDU1NTUsIDB4N2Y4NSB9Ci0KLSMgICAgICBkZWZpbmUgX1NUTFBfRE9VQkxFX0lORl9SRVAgeyAwLCAwLCAwLCAweDdmZjAgfQotIyAgICAgIGRlZmluZSBfU1RMUF9ET1VCTEVfUU5BTl9SRVAgeyAwLCAwLCAwLCAweGZmZjggfQotIyAgICAgIGRlZmluZSBfU1RMUF9ET1VCTEVfU05BTl9SRVAgeyAweDU1NTUsIDB4NTU1NSwgMHg1NTU1LCAweDdmZjUgfQotCi0jICAgICAgZGVmaW5lIF9TVExQX0xET1VCTEVfSU5GX1JFUCB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB4N2ZmZiB9Ci0jICAgICAgZGVmaW5lIF9TVExQX0xET1VCTEVfUU5BTl9SRVAgeyAwLCAwLCAwLCAwLCAwLCAwLCAweDgwMDAsIDB4ZmZmZiB9Ci0jICAgICAgZGVmaW5lIF9TVExQX0xET1VCTEVfU05BTl9SRVAgeyAweDU1NTUsIDB4NTU1NSwgMHg1NTU1LCAweDU1NTUsIDB4NTU1NSwgMHg1NTU1LCAweDU1NTUsIDB4N2ZmZn0KLSMgICAgZWxzZQotIyAgICAgIGRlZmluZSBfU1RMUF9GTE9BVF9JTkZfUkVQIHsgMCwgMHg3ZjgwIH0KLSMgICAgICBkZWZpbmUgX1NUTFBfRkxPQVRfUU5BTl9SRVAgeyAwLCAweDdmYzAgfQotIyAgICAgIGRlZmluZSBfU1RMUF9GTE9BVF9TTkFOX1JFUCB7IDAsIDB4N2ZhMCB9Ci0jICAgICAgZGVmaW5lIF9TVExQX0RPVUJMRV9JTkZfUkVQIHsgMCwgMCwgMCwgMHg3ZmYwIH0KLSMgICAgICBkZWZpbmUgX1NUTFBfRE9VQkxFX1FOQU5fUkVQIHsgMCwgMCwgMCwgMHg3ZmY4IH0KLSMgICAgICBkZWZpbmUgX1NUTFBfRE9VQkxFX1NOQU5fUkVQIHsgMCwgMCwgMCwgMHg3ZmY0IH0KLSMgICAgICBpZiBkZWZpbmVkIChfU1RMUF9NU1ZDKSB8fCBkZWZpbmVkIChfX0lDTCkKLSMgICAgICAgIGRlZmluZSBfU1RMUF9MRE9VQkxFX0lORl9SRVAgeyAwLCAwLCAwLCAweDdGRjAsIDAgfQotIyAgICAgICAgZGVmaW5lIF9TVExQX0xET1VCTEVfUU5BTl9SRVAgeyAwLCAwLCAwLCAweEZGRjgsIDAgfQotIyAgICAgICAgZGVmaW5lIF9TVExQX0xET1VCTEVfU05BTl9SRVAgeyAwLCAwLCAwLCAweEZGRjgsIDAgfQotIyAgICAgIGVsaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKQotIyAgICAgICAgZGVmaW5lIF9TVExQX0xET1VCTEVfSU5GX1JFUCB7IDAsIDAsIDAsIDB4ODAwMCwgMHg3ZmZmIH0KLSMgICAgICAgIGRlZmluZSBfU1RMUF9MRE9VQkxFX1FOQU5fUkVQIHsgMCwgMCwgMCwgMHhjMDAwLCAweDdmZmYgfQotIyAgICAgICAgZGVmaW5lIF9TVExQX0xET1VCTEVfU05BTl9SRVAgeyAwLCAwLCAwLCAweGEwMDAsIDB4N2ZmZiB9Ci0jICAgICAgZWxzZQotIyAgICAgICAgZGVmaW5lIF9TVExQX0xET1VCTEVfSU5GX1JFUCB7IDAsIDAsIDAsIDB4ODAwMCwgMHg3ZmZmLCAwIH0KLSMgICAgICAgIGRlZmluZSBfU1RMUF9MRE9VQkxFX1FOQU5fUkVQIHsgMCwgMCwgMCwgMHhhMDAwLCAweDdmZmYsIDAgfQotIyAgICAgICAgZGVmaW5lIF9TVExQX0xET1VCTEVfU05BTl9SRVAgeyAwLCAwLCAwLCAweGMwMDAsIDB4N2ZmZiwgMCB9Ci0jICAgICAgZW5kaWYKLSMgICAgZW5kaWYKLSMgIGVsc2UKLS8qIFRoaXMgaXMgYW4gYXJjaGl0ZWN0dXJlIHdlIGRvbid0IGtub3cgaG93IHRvIGhhbmRsZS4gUmV0dXJuIHNvbWUKLW9idmlvdXNseSB3cm9uZyB2YWx1ZXMuICovCi0jICAgIGRlZmluZSBfU1RMUF9GTE9BVF9JTkZfUkVQIHsgMCwgMCB9Ci0jICAgIGRlZmluZSBfU1RMUF9GTE9BVF9RTkFOX1JFUCB7IDAsIDAgfQotIyAgICBkZWZpbmUgX1NUTFBfRkxPQVRfU05BTl9SRVAgeyAwLCAwIH0KLSMgICAgZGVmaW5lIF9TVExQX0RPVUJMRV9JTkZfUkVQIHsgMCwgMCB9Ci0jICAgIGRlZmluZSBfU1RMUF9ET1VCTEVfUU5BTl9SRVAgeyAwLCAwIH0KLSMgICAgZGVmaW5lIF9TVExQX0RPVUJMRV9TTkFOX1JFUCB7IDAsIDAgfQotIyAgICBkZWZpbmUgX1NUTFBfTERPVUJMRV9JTkZfUkVQIHsgMCB9Ci0jICAgIGRlZmluZSBfU1RMUF9MRE9VQkxFX1FOQU5fUkVQIHsgMCB9Ci0jICAgIGRlZmluZSBfU1RMUF9MRE9VQkxFX1NOQU5fUkVQIHsgMCB9Ci0KLSMgIGVuZGlmCi0KLSMgIGlmIDAKLS8qCi0jICAgIGlmIGRlZmluZWQoX1NUTFBfQklHX0VORElBTikKLQotIyAgICBlbGlmIGRlZmluZWQgKF9TVExQX0xJVFRMRV9FTkRJQU4pCi0jICAgIGVsc2UKLQotLy9UaGlzIGlzIGFuIGFyY2hpdGVjdHVyZSB3ZSBkb24ndCBrbm93IGhvdyB0byBoYW5kbGUuICBSZXR1cm4gc29tZQotLy9vYnZpb3VzbHkgd3JvbmcgdmFsdWVzLgotIyAgICAgIGRlZmluZSBfU1RMUF9GTE9BVF9JTkZfUkVQICB7IDAsIDAgfQotIyAgICAgIGRlZmluZSBfU1RMUF9GTE9BVF9RTkFOX1JFUCB7IDAsIDAgfQotIyAgICAgIGRlZmluZSBfU1RMUF9GTE9BVF9TTkFOX1JFUCB7IDAsIDAgfQotIyAgICAgIGRlZmluZSBfU1RMUF9ET1VCTEVfSU5GX1JFUCAgeyAwLCAwIH0KLSMgICAgICBkZWZpbmUgX1NUTFBfRE9VQkxFX1FOQU5fUkVQIHsgMCwgMCB9Ci0jICAgICAgZGVmaW5lIF9TVExQX0RPVUJMRV9TTkFOX1JFUCB7IDAsIDAgfQotIyAgICAgIGRlZmluZSBfU1RMUF9MRE9VQkxFX0lORl9SRVAgIHsgMCB9Ci0jICAgICAgZGVmaW5lIF9TVExQX0xET1VCTEVfUU5BTl9SRVAgeyAwIH0KLSMgICAgICBkZWZpbmUgX1NUTFBfTERPVUJMRV9TTkFOX1JFUCB7IDAgfQotIyAgICBlbmRpZgotKi8KLSMgIGVuZGlmCi0KLXVuaW9uIF9GX3JlcCB7Ci0gIHVuc2lnbmVkIHNob3J0IHJlcFsyXTsKLSAgZmxvYXQgdmFsOwotfTsKLXVuaW9uIF9EX3JlcCB7Ci0gIHVuc2lnbmVkIHNob3J0IHJlcFs0XTsKLSAgZG91YmxlIHZhbDsKLX07Ci0KLSMgIGlmbmRlZiBfU1RMUF9OT19MT05HX0RPVUJMRQotdW5pb24gX0xEX3JlcCB7Ci0gIHVuc2lnbmVkIHNob3J0IHJlcFs4XTsKLSAgbG9uZyBkb3VibGUgdmFsOwotfTsKLSMgIGVuZGlmCi0KLXRlbXBsYXRlIDxjbGFzcyBfX2R1bW15PgotZmxvYXQgX1NUTFBfQ0FMTCBfTGltRzxfX2R1bW15Pjo6Z2V0X0ZfaW5mKCkgewotICBfRl9yZXAgX0ZfaW5mID0ge19TVExQX0ZMT0FUX0lORl9SRVB9OwotICByZXR1cm4gX0ZfaW5mLnZhbDsKLX0KLXRlbXBsYXRlIDxjbGFzcyBfX2R1bW15PgotZmxvYXQgX1NUTFBfQ0FMTCBfTGltRzxfX2R1bW15Pjo6Z2V0X0ZfcU5hTigpIHsKLSAgX0ZfcmVwIF9GX3FOYU4gPSB7X1NUTFBfRkxPQVRfUU5BTl9SRVB9OwotICByZXR1cm4gX0ZfcU5hTi52YWw7Ci19Ci10ZW1wbGF0ZSA8Y2xhc3MgX19kdW1teT4KLWZsb2F0IF9TVExQX0NBTEwgX0xpbUc8X19kdW1teT46OmdldF9GX3NOYU4oKSB7Ci0gIF9GX3JlcCBfRl9zTmFOID0ge19TVExQX0ZMT0FUX1NOQU5fUkVQfTsKLSAgcmV0dXJuIF9GX3NOYU4udmFsOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX19kdW1teT4KLWRvdWJsZSBfU1RMUF9DQUxMIF9MaW1HPF9fZHVtbXk+OjpnZXRfRF9pbmYoKSB7Ci0gIF9EX3JlcCBfRF9pbmYgPSB7X1NUTFBfRE9VQkxFX0lORl9SRVB9OwotICByZXR1cm4gX0RfaW5mLnZhbDsKLX0KLXRlbXBsYXRlIDxjbGFzcyBfX2R1bW15PgotZG91YmxlIF9TVExQX0NBTEwgX0xpbUc8X19kdW1teT46OmdldF9EX3FOYU4oKSB7Ci0gIF9EX3JlcCBfRF9xTmFOID0ge19TVExQX0RPVUJMRV9RTkFOX1JFUH07Ci0gIHJldHVybiBfRF9xTmFOLnZhbDsKLX0KLXRlbXBsYXRlIDxjbGFzcyBfX2R1bW15PgotZG91YmxlIF9TVExQX0NBTEwgX0xpbUc8X19kdW1teT46OmdldF9EX3NOYU4oKSB7Ci0gIF9EX3JlcCBfRF9zTmFOID0ge19TVExQX0RPVUJMRV9TTkFOX1JFUH07Ci0gIHJldHVybiBfRF9zTmFOLnZhbDsKLX0KLQotIyAgaWYgIWRlZmluZWQgKF9TVExQX05PX0xPTkdfRE9VQkxFKQotdGVtcGxhdGUgPGNsYXNzIF9fZHVtbXk+Ci1sb25nIGRvdWJsZSBfU1RMUF9DQUxMIF9MaW1HPF9fZHVtbXk+OjpnZXRfTERfaW5mKCkgewotICBfTERfcmVwIF9MRF9pbmYgPSB7X1NUTFBfTERPVUJMRV9JTkZfUkVQfTsKLSAgcmV0dXJuIF9MRF9pbmYudmFsOwotfQotdGVtcGxhdGUgPGNsYXNzIF9fZHVtbXk+Ci1sb25nIGRvdWJsZSBfU1RMUF9DQUxMIF9MaW1HPF9fZHVtbXk+OjpnZXRfTERfcU5hTigpIHsKLSAgX0xEX3JlcCBfTERfcU5hTiA9IHtfU1RMUF9MRE9VQkxFX1FOQU5fUkVQfTsKLSAgcmV0dXJuIF9MRF9xTmFOLnZhbDsKLX0KLXRlbXBsYXRlIDxjbGFzcyBfX2R1bW15PgotbG9uZyBkb3VibGUgX1NUTFBfQ0FMTCBfTGltRzxfX2R1bW15Pjo6Z2V0X0xEX3NOYU4oKSB7Ci0gIF9MRF9yZXAgX0xEX3NOYU4gPSB7X1NUTFBfTERPVUJMRV9TTkFOX1JFUH07Ci0gIHJldHVybiBfTERfc05hTi52YWw7Ci19Ci0jICBlbmRpZiAvKiBfU1RMUF9OT19MT05HX0RPVUJMRSAqLwotCi0jZW5kaWYgLyogX1NUTFBfRVhQT1NFX0dMT0JBTFNfSU1QTEVNRU5UQVRJT04gKi8KLQotI3VuZGVmIF9TVExQX0xJTUlUU19NSU5fVFlQRQotI3VuZGVmIF9TVExQX0xJTUlUU19NQVhfVFlQRQotCi0jdW5kZWYgX1NUTFBfRkxPQVRfSU5GX1JFUAotI3VuZGVmIF9TVExQX0ZMT0FUX1FOQU5fUkVQCi0jdW5kZWYgX1NUTFBfRkxPQVRfU05BTl9SRVAKLSN1bmRlZiBfU1RMUF9ET1VCTEVfSU5GX1JFUAotI3VuZGVmIF9TVExQX0RPVUJMRV9RTkFOX1JFUAotI3VuZGVmIF9TVExQX0RPVUJMRV9TTkFOX1JFUAotI3VuZGVmIF9TVExQX0xET1VCTEVfSU5GX1JFUAotI3VuZGVmIF9TVExQX0xET1VCTEVfUU5BTl9SRVAKLSN1bmRlZiBfU1RMUF9MRE9VQkxFX1NOQU5fUkVQCi0KLV9TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQotCi1fU1RMUF9FTkRfTkFNRVNQQUNFCi0KLSNlbmRpZiAvKiBfU1RMUF9MSU1JVFNfQ19JTkNMVURFRCAqLwpkaWZmIC0tZ2l0IGEvc3RsL19saW1pdHMuaCBiL3N0bC9fbGltaXRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNDIwMmQuLjAwMDAwMDAKLS0tIGEvc3RsL19saW1pdHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDUzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk3Ci0gKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0vKiBOT1RFOiBUaGlzIG1heSBiZSBub3QgcG9ydGFibGUgY29kZS4gUGFydHMgb2YgbnVtZXJpY19saW1pdHM8PiBhcmUKLSAqIGluaGVyZW50bHkgbWFjaGluZS1kZXBlbmRlbnQuICBBdCBwcmVzZW50IHRoaXMgZmlsZSBpcyBzdWl0YWJsZQotICogZm9yIHRoZSBNSVBTLCBTUEFSQywgQWxwaGEgYW5kIGlhMzIgYXJjaGl0ZWN0dXJlcy4KLSAqLwotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0xJTUlUUwotI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9MSU1JVFMKLQotI2lmbmRlZiBfU1RMUF9DTElNSVRTCi0jICBpbmNsdWRlIDxjbGltaXRzPgotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfQ0ZMT0FUCi0jICBpbmNsdWRlIDxjZmxvYXQ+Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9TVExQX0hBU19XQ0hBUl9UKSAmJiAhZGVmaW5lZCAoX1NUTFBfSU5URVJOQUxfQ1dDSEFSKQotIyAgaW5jbHVkZSA8c3RsL19jd2NoYXIuaD4KLSNlbmRpZgotCi1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLQotZW51bSBmbG9hdF9yb3VuZF9zdHlsZSB7Ci0gIHJvdW5kX2luZGV0ZXJtaW5hdGUgICAgICAgPSAtMSwKLSAgcm91bmRfdG93YXJkX3plcm8gICAgICAgICA9ICAwLAotICByb3VuZF90b19uZWFyZXN0ICAgICAgICAgID0gIDEsCi0gIHJvdW5kX3Rvd2FyZF9pbmZpbml0eSAgICAgPSAgMiwKLSAgcm91bmRfdG93YXJkX25lZ19pbmZpbml0eSA9ICAzCi19OwotCi1lbnVtIGZsb2F0X2Rlbm9ybV9zdHlsZSB7Ci0gIGRlbm9ybV9pbmRldGVybWluYXRlID0gLTEsCi0gIGRlbm9ybV9hYnNlbnQgICAgICAgID0gIDAsCi0gIGRlbm9ybV9wcmVzZW50ICAgICAgID0gIDEKLX07Ci0KLV9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKLQotLy8gQmFzZSBjbGFzcyBmb3IgYWxsIHNwZWNpYWxpemF0aW9ucyBvZiBudW1lcmljX2xpbWl0cy4KLXRlbXBsYXRlIDxjbGFzcyBfX251bWJlcj4KLWNsYXNzIF9OdW1lcmljX2xpbWl0c19iYXNlIHsKLXB1YmxpYzoKLQotICBzdGF0aWMgX19udW1iZXIgKF9TVExQX0NBTEwgbWluKSgpIF9TVExQX05PVEhST1cgeyByZXR1cm4gX19udW1iZXIoKTsgfQotICBzdGF0aWMgX19udW1iZXIgKF9TVExQX0NBTEwgbWF4KSgpIF9TVExQX05PVEhST1cgeyByZXR1cm4gX19udW1iZXIoKTsgfQotCi0jaWYgZGVmaW5lZCAoIF9TVExQX1NUQVRJQ19DT05TVF9JTklUX0JVRykKLSAgZW51bSB7Ci0jZWxzZQotICBzdGF0aWMgY29uc3QgaW50Ci0jZW5kaWYKLQotICBkaWdpdHMgPSAwLAotICBkaWdpdHMxMCA9IDAsCi0gIHJhZGl4ID0gMCwKLSAgbWluX2V4cG9uZW50ID0gMCwKLSAgbWluX2V4cG9uZW50MTAgPSAwLAotICBtYXhfZXhwb25lbnQgPSAwLAotICBtYXhfZXhwb25lbnQxMCA9IDAKLQotI2lmIGRlZmluZWQgKCBfU1RMUF9TVEFUSUNfQ09OU1RfSU5JVF9CVUcpCi0gICwKLSAgaGFzX2Rlbm9ybSA9IGRlbm9ybV9hYnNlbnQsCi0gIHJvdW5kX3N0eWxlID0gcm91bmRfdG93YXJkX3plcm8sCi0jZWxzZQotICA7Ci0gIHN0YXRpYyBjb25zdCBmbG9hdF9kZW5vcm1fc3R5bGUgaGFzX2Rlbm9ybSA9ICBkZW5vcm1fYWJzZW50OwotICBzdGF0aWMgY29uc3QgZmxvYXRfcm91bmRfc3R5bGUgcm91bmRfc3R5bGUgPSByb3VuZF90b3dhcmRfemVybzsKLSAgc3RhdGljIGNvbnN0IGJvb2wKLSNlbmRpZgotCi0gICAgaXNfc3BlY2lhbGl6ZWQgPSBmYWxzZSwKLSAgICBpc19zaWduZWQgID0gZmFsc2UsCi0gICAgaXNfaW50ZWdlciA9IGZhbHNlLAotICAgIGlzX2V4YWN0ID0gZmFsc2UsCi0gICAgaGFzX2luZmluaXR5ID0gZmFsc2UsCi0gICAgaGFzX3F1aWV0X05hTiA9IGZhbHNlLAotICAgIGhhc19zaWduYWxpbmdfTmFOID0gZmFsc2UsCi0gICAgaGFzX2Rlbm9ybV9sb3NzID0gZmFsc2UsCi0gICAgaXNfaWVjNTU5ID0gZmFsc2UsCi0gICAgaXNfYm91bmRlZCA9IGZhbHNlLAotICAgIGlzX21vZHVsbyA9IGZhbHNlLAotICAgIHRyYXBzID0gZmFsc2UsCi0gICAgdGlueW5lc3NfYmVmb3JlID0gZmFsc2UKLSNpZiBkZWZpbmVkICggX1NUTFBfU1RBVElDX0NPTlNUX0lOSVRfQlVHKQotICB9Ci0jZW5kaWYKLSAgOwotCi0gIHN0YXRpYyBfX251bWJlciBfU1RMUF9DQUxMIGVwc2lsb24oKSBfU1RMUF9OT1RIUk9XICAgICB7IHJldHVybiBfX251bWJlcigpOyB9Ci0gIHN0YXRpYyBfX251bWJlciBfU1RMUF9DQUxMIHJvdW5kX2Vycm9yKCkgX1NUTFBfTk9USFJPVyB7IHJldHVybiBfX251bWJlcigpOyB9Ci0KLSAgc3RhdGljIF9fbnVtYmVyIF9TVExQX0NBTEwgaW5maW5pdHkoKSBfU1RMUF9OT1RIUk9XICAgICAgeyByZXR1cm4gX19udW1iZXIoKTsgfQotICBzdGF0aWMgX19udW1iZXIgX1NUTFBfQ0FMTCBxdWlldF9OYU4oKSBfU1RMUF9OT1RIUk9XICAgICB7IHJldHVybiBfX251bWJlcigpOyB9Ci0gIHN0YXRpYyBfX251bWJlciBfU1RMUF9DQUxMIHNpZ25hbGluZ19OYU4oKSBfU1RMUF9OT1RIUk9XIHsgcmV0dXJuIF9fbnVtYmVyKCk7IH0KLSAgc3RhdGljIF9fbnVtYmVyIF9TVExQX0NBTEwgZGVub3JtX21pbigpIF9TVExQX05PVEhST1cgICAgeyByZXR1cm4gX19udW1iZXIoKTsgfQotfTsKLQotLy8gQmFzZSBjbGFzcyBmb3IgaW50ZWdlcnMuCi0KLSNpZmRlZiBfU1RMUF9MSU1JVEVEX0RFRkFVTFRfVEVNUExBVEVTCi0jICBpZmRlZiBfU1RMUF9MT05HX0xPTkcKLSMgICAgZGVmaW5lIF9TVExQX0xJTUlUU19NSU5fVFlQRSBfU1RMUF9MT05HX0xPTkcKLSMgICAgZGVmaW5lIF9TVExQX0xJTUlUU19NQVhfVFlQRSB1bnNpZ25lZCBfU1RMUF9MT05HX0xPTkcKLSMgIGVsc2UKLSMgICAgZGVmaW5lIF9TVExQX0xJTUlUU19NSU5fVFlQRSBsb25nCi0jICAgIGRlZmluZSBfU1RMUF9MSU1JVFNfTUFYX1RZUEUgdW5zaWduZWQgbG9uZwotIyAgZW5kaWYKLSNlbHNlCi0jICBkZWZpbmUgX1NUTFBfTElNSVRTX01JTl9UWVBFIF9JbnQKLSMgIGRlZmluZSBfU1RMUF9MSU1JVFNfTUFYX1RZUEUgX0ludAotI2VuZGlmIC8qIF9TVExQX0xJTUlURURfREVGQVVMVF9URU1QTEFURVMgKi8KLQotdGVtcGxhdGUgPGNsYXNzIF9JbnQsCi0gICAgICAgICAgX1NUTFBfTElNSVRTX01JTl9UWVBFIF9faW1pbiwKLSAgICAgICAgICBfU1RMUF9MSU1JVFNfTUFYX1RZUEUgX19pbWF4LAotICAgICAgICAgIGludCBfX2lkaWdpdHMsIGJvb2wgX19pc21vZD4KLWNsYXNzIF9JbnRlZ2VyX2xpbWl0cyA6IHB1YmxpYyBfTnVtZXJpY19saW1pdHNfYmFzZTxfSW50PiB7Ci1wdWJsaWM6Ci0KLSAgc3RhdGljIF9JbnQgKF9TVExQX0NBTEwgbWluKSAoKSBfU1RMUF9OT1RIUk9XIHsgcmV0dXJuIChfSW50KV9faW1pbjsgfQotICBzdGF0aWMgX0ludCAoX1NUTFBfQ0FMTCBtYXgpICgpIF9TVExQX05PVEhST1cgeyByZXR1cm4gKF9JbnQpX19pbWF4OyB9Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9TVEFUSUNfQ09OU1RfSU5JVF9CVUcpCi0gIGVudW0gewotI2Vsc2UKLSAgc3RhdGljIGNvbnN0IGludAotI2VuZGlmCi0gIGRpZ2l0cyA9IChfX2lkaWdpdHMgPCAwKSA/Ci0gICgoaW50KSgoc2l6ZW9mKF9JbnQpICogKENIQVJfQklUKSkpIC0gKChfX2ltaW4gPT0gMCkgPyAwIDogMSkpCi0gIDogKF9faWRpZ2l0cyksCi0gIGRpZ2l0czEwID0gKGRpZ2l0cyAqIDMwMVVMKSAvIDEwMDAsCi0gIHJhZGl4ID0gMgotI2lmICFkZWZpbmVkIChfU1RMUF9TVEFUSUNfQ09OU1RfSU5JVF9CVUcpCi0gIDsKLSAgc3RhdGljIGNvbnN0IGJvb2wKLSNlbHNlCi0gICwKLSNlbmRpZgotICBpc19zcGVjaWFsaXplZCA9IHRydWUsCi0gIGlzX3NpZ25lZCA9IChfX2ltaW4gIT0gMCksCi0gIGlzX2ludGVnZXIgPSB0cnVlLAotICBpc19leGFjdCA9IHRydWUsCi0gIGlzX2JvdW5kZWQgPSB0cnVlLAotICBpc19tb2R1bG8gPSBfX2lzbW9kCi0jaWYgZGVmaW5lZCAoIF9TVExQX1NUQVRJQ19DT05TVF9JTklUX0JVRykKLSAgfQotI2VuZGlmCi0gIDsKLX07Ci0KLS8vIEJhc2UgY2xhc3MgZm9yIGZsb2F0aW5nLXBvaW50IG51bWJlcnMuCi10ZW1wbGF0ZSA8Y2xhc3MgX19udW1iZXIsCi0gICAgICAgICBpbnQgX19EaWdpdHMsIGludCBfX0RpZ2l0czEwLAotICAgICAgICAgaW50IF9fTWluRXhwLCBpbnQgX19NYXhFeHAsCi0gICAgICAgICBpbnQgX19NaW5FeHAxMCwgaW50IF9fTWF4RXhwMTAsCi0gICAgICAgICBib29sIF9fSXNJRUM1NTksCi0gICAgICAgICBmbG9hdF9yb3VuZF9zdHlsZSBfX1JvdW5kU3R5bGU+Ci1jbGFzcyBfRmxvYXRpbmdfbGltaXRzIDogcHVibGljIF9OdW1lcmljX2xpbWl0c19iYXNlPF9fbnVtYmVyPiB7Ci1wdWJsaWM6Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9TVEFUSUNfQ09OU1RfSU5JVF9CVUcpCi0gIGVudW0gewotI2Vsc2UKLSAgc3RhdGljIGNvbnN0IGludAotI2VuZGlmCi0KLSAgZGlnaXRzID0gX19EaWdpdHMsCi0gIGRpZ2l0czEwID0gX19EaWdpdHMxMCwKLQotICByYWRpeCA9ICggIEZMVF9SQURJWCAvKiAyICovICksCi0gIG1pbl9leHBvbmVudCA9IF9fTWluRXhwLAotICBtYXhfZXhwb25lbnQgPSBfX01heEV4cCwKLSAgbWluX2V4cG9uZW50MTAgPSBfX01pbkV4cDEwLAotICBtYXhfZXhwb25lbnQxMCA9IF9fTWF4RXhwMTAKLQotI2lmIGRlZmluZWQgKF9TVExQX1NUQVRJQ19DT05TVF9JTklUX0JVRykKLSAgLAotICBoYXNfZGVub3JtID0gZGVub3JtX2luZGV0ZXJtaW5hdGUsCi0gIHJvdW5kX3N0eWxlID0gX19Sb3VuZFN0eWxlLAotI2Vsc2UKLSAgOwotICBzdGF0aWMgY29uc3QgZmxvYXRfZGVub3JtX3N0eWxlIGhhc19kZW5vcm0gPSBkZW5vcm1faW5kZXRlcm1pbmF0ZTsKLSAgc3RhdGljIGNvbnN0IGZsb2F0X3JvdW5kX3N0eWxlIHJvdW5kX3N0eWxlID0gX19Sb3VuZFN0eWxlOwotICBzdGF0aWMgY29uc3QgYm9vbAotI2VuZGlmCi0KLSAgaXNfc3BlY2lhbGl6ZWQgPSB0cnVlLAotICBpc19zaWduZWQgPSB0cnVlLAotCi0gIC8vSUVDIDU1OSBzcGVjaWZ5IHRoZSBmbG9hdGluZyBwb2ludCByZXByZXNlbnRhdGlvbiBvZgotICAvL2luZmluaXR5LCBxdWlldCBhbmQgc2lnbmFsaW5nIE5vdCBhIE51bWJlci4gTm90IHN1cHBvcnRpbmcKLSAgLy9pdCBpcyBjb25zaWRlciBhcyBub3QgYmVpbmcgYWJsZSB0byBncmFudCB0aG9zZSB2YWx1ZXMuCi0jaWYgKGRlZmluZWQgKF9TVExQX01TVkMpICYmIChfU1RMUF9NU1ZDIDwgMTMwMCkpCi0gIC8vTVNWQyA2IGRvIG5vdCBmdWxseSBzdXBwb3J0IElFQyA1OTkgYnV0IGdyYW50IGEgZ29vZCBpbmZpbml0eSB2YWx1ZS4KLSAgaGFzX2luZmluaXR5ICAgICAgPSB0cnVlLAotI2Vsc2UKLSAgaGFzX2luZmluaXR5ICAgICAgPSBfX0lzSUVDNTU5LAotI2VuZGlmCi0gIGhhc19xdWlldF9OYU4gICAgID0gX19Jc0lFQzU1OSwKLSAgaGFzX3NpZ25hbGluZ19OYU4gPSBfX0lzSUVDNTU5LAotCi0gIGhhc19kZW5vcm1fbG9zcyAgID0gIGZhbHNlLAotICBpc19pZWM1NTkgICAgICA9ICBfX0lzSUVDNTU5LAotICBpc19ib3VuZGVkICAgICA9ICB0cnVlLAotICB0cmFwcyAgICAgICAgICA9ICB0cnVlLAotICB0aW55bmVzc19iZWZvcmU9ICBmYWxzZQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfU1RBVElDX0NPTlNUX0lOSVRfQlVHKQotICB9Ci0jZW5kaWYKLSAgOwotfTsKLQotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi0KLS8vIENsYXNzIG51bWVyaWNfbGltaXRzCi0KLS8vIFRoZSB1bnNwZWNpYWxpemVkIGNsYXNzLgotCi10ZW1wbGF0ZTxjbGFzcyBfVHA+Ci1jbGFzcyBudW1lcmljX2xpbWl0cyA6IHB1YmxpYyBfU1RMUF9QUklWIF9OdW1lcmljX2xpbWl0c19iYXNlPF9UcD4ge307Ci0KLS8vIFNwZWNpYWxpemF0aW9ucyBmb3IgYWxsIGJ1aWx0LWluIGludGVncmFsIHR5cGVzLgotCi0jaWYgIWRlZmluZWQgKF9TVExQX05PX0JPT0wpCi1fU1RMUF9URU1QTEFURV9OVUxMCi1jbGFzcyBudW1lcmljX2xpbWl0czxib29sPgotICA6IHB1YmxpYyBfU1RMUF9QUklWIF9JbnRlZ2VyX2xpbWl0czxib29sLCBmYWxzZSwgdHJ1ZSwgMSwgZmFsc2U+Ci17fTsKLSNlbmRpZiAvKiBfU1RMUF9OT19CT09MICovCi0KLV9TVExQX1RFTVBMQVRFX05VTEwKLWNsYXNzIG51bWVyaWNfbGltaXRzPGNoYXI+Ci0gIDogcHVibGljIF9TVExQX1BSSVYgX0ludGVnZXJfbGltaXRzPGNoYXIsIENIQVJfTUlOLCBDSEFSX01BWCwgLTEsIHRydWU+Ci17fTsKLQotI2lmICFkZWZpbmVkIChfU1RMUF9OT19TSUdORURfQlVJTFRJTlMpCi1fU1RMUF9URU1QTEFURV9OVUxMCi1jbGFzcyBudW1lcmljX2xpbWl0czxzaWduZWQgY2hhcj4KLSAgOiBwdWJsaWMgX1NUTFBfUFJJViBfSW50ZWdlcl9saW1pdHM8c2lnbmVkIGNoYXIsIFNDSEFSX01JTiwgU0NIQVJfTUFYLCAtMSwgdHJ1ZT4KLXt9OwotI2VuZGlmCi0KLV9TVExQX1RFTVBMQVRFX05VTEwKLWNsYXNzIG51bWVyaWNfbGltaXRzPHVuc2lnbmVkIGNoYXI+Ci0gIDogcHVibGljIF9TVExQX1BSSVYgX0ludGVnZXJfbGltaXRzPHVuc2lnbmVkIGNoYXIsIDAsIFVDSEFSX01BWCwgLTEsIHRydWU+Ci17fTsKLQotI2lmICEoZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkgfHwgZGVmaW5lZCAoX1NUTFBfV0NIQVJfVF9JU19VU0hPUlQpKQotCi1fU1RMUF9URU1QTEFURV9OVUxMCi1jbGFzcyBudW1lcmljX2xpbWl0czx3Y2hhcl90PgotICA6IHB1YmxpYyBfU1RMUF9QUklWIF9JbnRlZ2VyX2xpbWl0czx3Y2hhcl90LCBXQ0hBUl9NSU4sIFdDSEFSX01BWCwgLTEsIHRydWU+Ci17fTsKLQotI2VuZGlmCi0KLV9TVExQX1RFTVBMQVRFX05VTEwKLWNsYXNzIG51bWVyaWNfbGltaXRzPHNob3J0PgotICA6IHB1YmxpYyBfU1RMUF9QUklWIF9JbnRlZ2VyX2xpbWl0czxzaG9ydCwgU0hSVF9NSU4sIFNIUlRfTUFYLCAtMSwgdHJ1ZT4KLXt9OwotCi1fU1RMUF9URU1QTEFURV9OVUxMCi1jbGFzcyBudW1lcmljX2xpbWl0czx1bnNpZ25lZCBzaG9ydD4KLSAgOiBwdWJsaWMgX1NUTFBfUFJJViBfSW50ZWdlcl9saW1pdHM8dW5zaWduZWQgc2hvcnQsIDAsIFVTSFJUX01BWCwgLTEsIHRydWU+Ci17fTsKLQotI2lmIGRlZmluZWQgKF9feGxDX18pICYmIChfX3hsQ19fID09IDB4NTAwKQotIyAgdW5kZWYgSU5UX01JTgotIyAgZGVmaW5lIElOVF9NSU4gLTIxNDc0ODM2NDgKLSNlbmRpZgotCi1fU1RMUF9URU1QTEFURV9OVUxMCi1jbGFzcyBudW1lcmljX2xpbWl0czxpbnQ+Ci0gIDogcHVibGljIF9TVExQX1BSSVYgX0ludGVnZXJfbGltaXRzPGludCwgSU5UX01JTiwgSU5UX01BWCwgLTEsIHRydWU+Ci17fTsKLQotX1NUTFBfVEVNUExBVEVfTlVMTAotY2xhc3MgbnVtZXJpY19saW1pdHM8dW5zaWduZWQgaW50PgotICA6IHB1YmxpYyBfU1RMUF9QUklWIF9JbnRlZ2VyX2xpbWl0czx1bnNpZ25lZCBpbnQsIDAsIFVJTlRfTUFYLCAtMSwgdHJ1ZT4KLXt9OwotCi1fU1RMUF9URU1QTEFURV9OVUxMCi1jbGFzcyBudW1lcmljX2xpbWl0czxsb25nPgotICA6IHB1YmxpYyBfU1RMUF9QUklWIF9JbnRlZ2VyX2xpbWl0czxsb25nLCBMT05HX01JTiwgTE9OR19NQVgsIC0xLCB0cnVlPgote307Ci0KLV9TVExQX1RFTVBMQVRFX05VTEwKLWNsYXNzIG51bWVyaWNfbGltaXRzPHVuc2lnbmVkIGxvbmc+Ci0gIDogcHVibGljIF9TVExQX1BSSVYgX0ludGVnZXJfbGltaXRzPHVuc2lnbmVkIGxvbmcsIDAsIFVMT05HX01BWCwgLTEsIHRydWU+Ci17fTsKLQotI2lmIGRlZmluZWQgKF9TVExQX0xPTkdfTE9ORykKLQotIyAgaWYgZGVmaW5lZCAoX1NUTFBfTVNWQykgfHwgZGVmaW5lZCAoX19CT1JMQU5EQ19fKQotIyAgICBkZWZpbmUgTE9OR0xPTkdfTUFYICAgICAweDdmZmZmZmZmZmZmZmZmZmZpNjQKLSMgICAgZGVmaW5lIExPTkdMT05HX01JTiAgICAgKC1MT05HTE9OR19NQVgtMWk2NCkKLSMgICAgZGVmaW5lIFVMT05HTE9OR19NQVggICAgMHhmZmZmZmZmZmZmZmZmZmZmVWk2NAotIyAgZWxzZQotIyAgICBpZm5kZWYgTE9OR0xPTkdfTUFYCi0jICAgICAgZGVmaW5lIExPTkdMT05HX01BWCAgIDB4N2ZmZmZmZmZmZmZmZmZmZkxMCi0jICAgIGVuZGlmCi0jICAgIGlmbmRlZiBMT05HTE9OR19NSU4KLSMgICAgICBkZWZpbmUgTE9OR0xPTkdfTUlOICAgKC1MT05HTE9OR19NQVgtMUxMKQotIyAgICBlbmRpZgotIyAgICBpZm5kZWYgVUxPTkdMT05HX01BWAotIyAgICAgIGRlZmluZSBVTE9OR0xPTkdfTUFYICAweGZmZmZmZmZmZmZmZmZmZmZVTEwKLSMgICAgZW5kaWYKLSMgIGVuZGlmCi0KLSMgIGlmICFkZWZpbmVkKF9fR05VQ19fKSB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA8PSA5NikKLQotX1NUTFBfVEVNUExBVEVfTlVMTAotY2xhc3MgbnVtZXJpY19saW1pdHM8X1NUTFBfTE9OR19MT05HPgotICA6IHB1YmxpYyBfU1RMUF9QUklWIF9JbnRlZ2VyX2xpbWl0czxfU1RMUF9MT05HX0xPTkcsIExPTkdMT05HX01JTiwgTE9OR0xPTkdfTUFYLCAtMSwgdHJ1ZT4KLXt9OwotCi1fU1RMUF9URU1QTEFURV9OVUxMCi1jbGFzcyBudW1lcmljX2xpbWl0czx1bnNpZ25lZCBfU1RMUF9MT05HX0xPTkc+Ci0gIDogcHVibGljIF9TVExQX1BSSVYgX0ludGVnZXJfbGltaXRzPHVuc2lnbmVkIF9TVExQX0xPTkdfTE9ORywgMCwgVUxPTkdMT05HX01BWCwgLTEsIHRydWU+Ci17fTsKLSMgIGVsc2UgLyogZ2NjIDIuOTcgKGFmdGVyIDIwMDAtMTEtMDEpLCAyLjk4LCAzLjAgKi8KLS8qCi0gbmV3ZXN0IGdjYyBoYXMgbmV3IG1hbmdsaW5nIHNjaGVtZSwgdGhhdCBoYXMgcHJvYmxlbQotIHdpdGggZ2VuZXJhdGluZyBuYW1lIFtpbnN0YW50aWF0ZWRdIG9mIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGxpa2UKLSBfSW50ZWdlcl9saW1pdHM8X1NUTFBfTE9OR19MT05HLCBMT05HTE9OR19NSU4sIExPTkdMT05HX01BWCwgLTEsIHRydWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfn5+fn5+fn5+fn5+ICB+fn5+fn5+fn5+fn4KLSBCZWxvdyBpcyBjb2RlIHRoYXQgc29sdmUgdGhpcyBwcm9ibGVtLgotICAgLSBwdHIKLSAqLwotX1NUTFBfVEVNUExBVEVfTlVMTAotY2xhc3MgbnVtZXJpY19saW1pdHM8X1NUTFBfTE9OR19MT05HPgotICA6IHB1YmxpYyBfU1RMUF9QUklWIF9OdW1lcmljX2xpbWl0c19iYXNlPF9TVExQX0xPTkdfTE9ORz4gewotcHVibGljOgotCi0gIHN0YXRpYyBfU1RMUF9MT05HX0xPTkcgKF9TVExQX0NBTEwgbWluKSAoKSBfU1RMUF9OT1RIUk9XIHsgcmV0dXJuIExPTkdMT05HX01JTjsgfQotICBzdGF0aWMgX1NUTFBfTE9OR19MT05HIChfU1RMUF9DQUxMIG1heCkgKCkgX1NUTFBfTk9USFJPVyB7IHJldHVybiBMT05HTE9OR19NQVg7IH0KLQotIyAgICBpZiBkZWZpbmVkICggX1NUTFBfU1RBVElDX0NPTlNUX0lOSVRfQlVHKQotICBlbnVtIHsKLSMgICAgZWxzZQotICBzdGF0aWMgY29uc3QgaW50Ci0jICAgIGVuZGlmCi0gIGRpZ2l0cyA9ICgoaW50KSgoc2l6ZW9mKF9TVExQX0xPTkdfTE9ORykgKiAoQ0hBUl9CSVQpKSkgLSAxKSwKLSAgZGlnaXRzMTAgPSAoZGlnaXRzICogMzAxVUwpIC8gMTAwMCwKLSAgcmFkaXggPSAyCi0jICAgIGlmICEgZGVmaW5lZCAoX1NUTFBfU1RBVElDX0NPTlNUX0lOSVRfQlVHKQotICA7Ci0gIHN0YXRpYyBjb25zdCBib29sCi0jICAgIGVsc2UKLSAgLAotIyAgICBlbmRpZgotICBpc19zcGVjaWFsaXplZCA9IHRydWUsCi0gIGlzX3NpZ25lZCA9IHRydWUsCi0gIGlzX2ludGVnZXIgPSB0cnVlLAotICBpc19leGFjdCA9IHRydWUsCi0gIGlzX2JvdW5kZWQgPSB0cnVlLAotICBpc19tb2R1bG8gPSB0cnVlCi0jICAgIGlmIGRlZmluZWQgKF9TVExQX1NUQVRJQ19DT05TVF9JTklUX0JVRykKLSAgfQotIyAgICBlbmRpZgotICA7Ci19OwotCi1fU1RMUF9URU1QTEFURV9OVUxMCi1jbGFzcyBudW1lcmljX2xpbWl0czx1bnNpZ25lZCBfU1RMUF9MT05HX0xPTkc+Ci0gIDogcHVibGljIF9TVExQX1BSSVYgX051bWVyaWNfbGltaXRzX2Jhc2U8dW5zaWduZWQgX1NUTFBfTE9OR19MT05HPiB7Ci1wdWJsaWM6Ci0KLSAgc3RhdGljIHVuc2lnbmVkIF9TVExQX0xPTkdfTE9ORyAoX1NUTFBfQ0FMTCBtaW4pICgpIF9TVExQX05PVEhST1cgeyByZXR1cm4gMFVMTDsgfQotICBzdGF0aWMgdW5zaWduZWQgX1NUTFBfTE9OR19MT05HIChfU1RMUF9DQUxMIG1heCkgKCkgX1NUTFBfTk9USFJPVyB7IHJldHVybiBVTE9OR0xPTkdfTUFYOyB9Ci0KLSMgICAgaWYgZGVmaW5lZCAoX1NUTFBfU1RBVElDX0NPTlNUX0lOSVRfQlVHKQotICBlbnVtIHsKLSMgICAgZWxzZQotICBzdGF0aWMgY29uc3QgaW50Ci0jICAgIGVuZGlmCi0gIGRpZ2l0cyA9ICgoaW50KSgoc2l6ZW9mKHVuc2lnbmVkIF9TVExQX0xPTkdfTE9ORykgKiAoQ0hBUl9CSVQpKSkpLAotICBkaWdpdHMxMCA9IChkaWdpdHMgKiAzMDFVTCkgLyAxMDAwLAotICByYWRpeCA9IDIKLSMgICAgaWYgISBkZWZpbmVkIChfU1RMUF9TVEFUSUNfQ09OU1RfSU5JVF9CVUcpCi0gIDsKLSAgc3RhdGljIGNvbnN0IGJvb2wKLSMgICAgZWxzZQotICAsCi0jICAgIGVuZGlmCi0gIGlzX3NwZWNpYWxpemVkID0gdHJ1ZSwKLSAgaXNfc2lnbmVkID0gZmFsc2UsCi0gIGlzX2ludGVnZXIgPSB0cnVlLAotICBpc19leGFjdCA9IHRydWUsCi0gIGlzX2JvdW5kZWQgPSB0cnVlLAotICBpc19tb2R1bG8gPSB0cnVlCi0jICAgIGlmIGRlZmluZWQgKCBfU1RMUF9TVEFUSUNfQ09OU1RfSU5JVF9CVUcpCi0gIH0KLSMgICAgZW5kaWYKLSAgOwotfTsKLQotIyAgZW5kaWYgLyogX19HTlVDX18gPiAyMDAwLTExLTAxICovCi0KLSNlbmRpZiAvKiBfU1RMUF9MT05HX0xPTkcgKi8KLQotX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQotCi0vLyBTcGVjaWFsaXphdGlvbnMgZm9yIGFsbCBidWlsdC1pbiBmbG9hdGluZy1wb2ludCB0eXBlcy4KLXRlbXBsYXRlIDxjbGFzcyBfX2R1bW15PgotY2xhc3MgX0xpbUcgewotcHVibGljOgotICBzdGF0aWMgZmxvYXQgX1NUTFBfQ0FMTCBnZXRfRl9pbmYoKTsKLSAgc3RhdGljIGZsb2F0IF9TVExQX0NBTEwgZ2V0X0ZfcU5hTigpOwotICBzdGF0aWMgZmxvYXQgX1NUTFBfQ0FMTCBnZXRfRl9zTmFOKCk7Ci0gIHN0YXRpYyBkb3VibGUgX1NUTFBfQ0FMTCBnZXRfRF9pbmYoKTsKLSAgc3RhdGljIGRvdWJsZSBfU1RMUF9DQUxMIGdldF9EX3FOYU4oKTsKLSAgc3RhdGljIGRvdWJsZSBfU1RMUF9DQUxMIGdldF9EX3NOYU4oKTsKLQotI2lmICFkZWZpbmVkIChfU1RMUF9OT19MT05HX0RPVUJMRSkKLSAgc3RhdGljIGxvbmcgZG91YmxlIF9TVExQX0NBTEwgZ2V0X0xEX2luZigpOwotICBzdGF0aWMgbG9uZyBkb3VibGUgX1NUTFBfQ0FMTCBnZXRfTERfcU5hTigpOwotICBzdGF0aWMgbG9uZyBkb3VibGUgX1NUTFBfQ0FMTCBnZXRfTERfc05hTigpOwotI2VuZGlmCi19OwotCi0jaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCkKLV9TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBfTGltRzxib29sPjsKLSNlbmRpZgotCi1fU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKLQotX1NUTFBfVEVNUExBVEVfTlVMTAotY2xhc3MgbnVtZXJpY19saW1pdHM8ZmxvYXQ+Ci0gIDogcHVibGljIF9TVExQX1BSSVYgX0Zsb2F0aW5nX2xpbWl0czxmbG9hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTFRfTUFOVF9ESUcsICAgLy8gQmluYXJ5IGRpZ2l0cyBvZiBwcmVjaXNpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTFRfRElHLCAgICAgICAgLy8gRGVjaW1hbCBkaWdpdHMgb2YgcHJlY2lzaW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkxUX01JTl9FWFAsICAgIC8vIE1pbmltdW0gZXhwb25lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTFRfTUFYX0VYUCwgICAgLy8gTWF4aW11bSBleHBvbmVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMVF9NSU5fMTBfRVhQLCAvLyBNaW5pbXVtIGJhc2UgMTAgZXhwb25lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTFRfTUFYXzEwX0VYUCwgLy8gTWF4aW11bSBiYXNlIDEwIGV4cG9uZW50Ci0jaWYgZGVmaW5lZCAoX1NUTFBfTk9fSUVDNTU5X1NVUFBPUlQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsICAgICAgICAgIC8vIGRvIG5vdCBjb25mb3JtIHRvIGllYzU1OQotI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCAgICAgICAgICAgLy8gY29uZm9ybXMgdG8gaWVjNTU5Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3VuZF90b19uZWFyZXN0PiB7Ci1wdWJsaWM6Ci0gIHN0YXRpYyBmbG9hdCAoX1NUTFBfQ0FMTCBtaW4pICgpIF9TVExQX05PVEhST1cgeyByZXR1cm4gRkxUX01JTjsgfQotICBzdGF0aWMgZmxvYXQgX1NUTFBfQ0FMTCBkZW5vcm1fbWluKCkgX1NUTFBfTk9USFJPVyB7IHJldHVybiBGTFRfTUlOOyB9Ci0gIHN0YXRpYyBmbG9hdCAoX1NUTFBfQ0FMTCBtYXgpICgpIF9TVExQX05PVEhST1cgeyBfU1RMUF9VU0lOR19WRU5ET1JfQ1NURCByZXR1cm4gRkxUX01BWDsgfQotICBzdGF0aWMgZmxvYXQgX1NUTFBfQ0FMTCBlcHNpbG9uKCkgX1NUTFBfTk9USFJPVyB7IHJldHVybiBGTFRfRVBTSUxPTjsgfQotICBzdGF0aWMgZmxvYXQgX1NUTFBfQ0FMTCByb3VuZF9lcnJvcigpIF9TVExQX05PVEhST1cgeyByZXR1cm4gMC41ZjsgfSAvLyBVbml0czogdWxwcy4KLSAgc3RhdGljICBmbG9hdCBfU1RMUF9DQUxMIGluZmluaXR5KCkgX1NUTFBfTk9USFJPVyB7IHJldHVybiBfU1RMUF9QUklWIF9MaW1HPGJvb2w+OjpnZXRfRl9pbmYoKTsgfQotICBzdGF0aWMgIGZsb2F0IF9TVExQX0NBTEwgcXVpZXRfTmFOKCkgX1NUTFBfTk9USFJPVyB7IHJldHVybiBfU1RMUF9QUklWIF9MaW1HPGJvb2w+OjpnZXRfRl9xTmFOKCk7IH0KLSAgc3RhdGljICBmbG9hdCBfU1RMUF9DQUxMIHNpZ25hbGluZ19OYU4oKSBfU1RMUF9OT1RIUk9XIHsgcmV0dXJuIF9TVExQX1BSSVYgX0xpbUc8Ym9vbD46OmdldF9GX3NOYU4oKTsgfQotfTsKLQotX1NUTFBfVEVNUExBVEVfTlVMTAotY2xhc3MgbnVtZXJpY19saW1pdHM8ZG91YmxlPgotICA6IHB1YmxpYyBfU1RMUF9QUklWIF9GbG9hdGluZ19saW1pdHM8ZG91YmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCTF9NQU5UX0RJRywgICAvLyBCaW5hcnkgZGlnaXRzIG9mIHByZWNpc2lvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCTF9ESUcsICAgICAgICAvLyBEZWNpbWFsIGRpZ2l0cyBvZiBwcmVjaXNpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkxfTUlOX0VYUCwgICAgLy8gTWluaW11bSBleHBvbmVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCTF9NQVhfRVhQLCAgICAvLyBNYXhpbXVtIGV4cG9uZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJMX01JTl8xMF9FWFAsIC8vIE1pbmltdW0gYmFzZSAxMCBleHBvbmVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCTF9NQVhfMTBfRVhQLCAvLyBNYXhpbXVtIGJhc2UgMTAgZXhwb25lbnQKLSNpZiBkZWZpbmVkIChfU1RMUF9OT19JRUM1NTlfU1VQUE9SVCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgICAgICAgICAgLy8gZG8gbm90IGNvbmZvcm0gdG8gaWVjNTU5Ci0jZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsICAgICAgICAgICAvLyBjb25mb3JtcyB0byBpZWM1NTkKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdW5kX3RvX25lYXJlc3Q+IHsKLXB1YmxpYzoKLSAgc3RhdGljIGRvdWJsZSAoX1NUTFBfQ0FMTCBtaW4pKCkgX1NUTFBfTk9USFJPVyB7IHJldHVybiBEQkxfTUlOOyB9Ci0gIHN0YXRpYyBkb3VibGUgX1NUTFBfQ0FMTCBkZW5vcm1fbWluKCkgX1NUTFBfTk9USFJPVyB7IHJldHVybiBEQkxfTUlOOyB9Ci0gIHN0YXRpYyBkb3VibGUgKF9TVExQX0NBTEwgbWF4KSgpIF9TVExQX05PVEhST1cgeyBfU1RMUF9VU0lOR19WRU5ET1JfQ1NURCByZXR1cm4gREJMX01BWDsgfQotICBzdGF0aWMgZG91YmxlIF9TVExQX0NBTEwgZXBzaWxvbigpIF9TVExQX05PVEhST1cgeyByZXR1cm4gREJMX0VQU0lMT047IH0KLSAgc3RhdGljIGRvdWJsZSBfU1RMUF9DQUxMIHJvdW5kX2Vycm9yKCkgX1NUTFBfTk9USFJPVyB7IHJldHVybiAwLjU7IH0gLy8gVW5pdHM6IHVscHMuCi0gIHN0YXRpYyAgZG91YmxlIF9TVExQX0NBTEwgaW5maW5pdHkoKSBfU1RMUF9OT1RIUk9XIHsgcmV0dXJuIF9TVExQX1BSSVYgX0xpbUc8Ym9vbD46OmdldF9EX2luZigpOyB9Ci0gIHN0YXRpYyAgZG91YmxlIF9TVExQX0NBTEwgcXVpZXRfTmFOKCkgX1NUTFBfTk9USFJPVyB7IHJldHVybiBfU1RMUF9QUklWIF9MaW1HPGJvb2w+OjpnZXRfRF9xTmFOKCk7IH0KLSAgc3RhdGljICBkb3VibGUgX1NUTFBfQ0FMTCBzaWduYWxpbmdfTmFOKCkgX1NUTFBfTk9USFJPVyB7IHJldHVybiBfU1RMUF9QUklWIF9MaW1HPGJvb2w+OjpnZXRfRF9zTmFOKCk7IH0KLX07Ci0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTE9OR19ET1VCTEUpCi0KLV9TVExQX1RFTVBMQVRFX05VTEwKLWNsYXNzIG51bWVyaWNfbGltaXRzPGxvbmcgZG91YmxlPgotICA6IHB1YmxpYyBfU1RMUF9QUklWIF9GbG9hdGluZ19saW1pdHM8bG9uZyBkb3VibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTERCTF9NQU5UX0RJRywgIC8vIEJpbmFyeSBkaWdpdHMgb2YgcHJlY2lzaW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTERCTF9ESUcsICAgICAgIC8vIERlY2ltYWwgZGlnaXRzIG9mIHByZWNpc2lvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQkxfTUlOX0VYUCwgICAvLyBNaW5pbXVtIGV4cG9uZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTERCTF9NQVhfRVhQLCAgIC8vIE1heGltdW0gZXhwb25lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMREJMX01JTl8xMF9FWFAsLy8gTWluaW11bSBiYXNlIDEwIGV4cG9uZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTERCTF9NQVhfMTBfRVhQLC8vIE1heGltdW0gYmFzZSAxMCBleHBvbmVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCAgICAgICAgICAvLyBkbyBub3QgY29uZm9ybSB0byBpZWM1NTkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3VuZF90b19uZWFyZXN0PiB7Ci1wdWJsaWM6Ci0gIHN0YXRpYyBsb25nIGRvdWJsZSAoX1NUTFBfQ0FMTCBtaW4pICgpIF9TVExQX05PVEhST1cgeyBfU1RMUF9VU0lOR19WRU5ET1JfQ1NURCByZXR1cm4gTERCTF9NSU47IH0KLSAgc3RhdGljIGxvbmcgZG91YmxlIF9TVExQX0NBTEwgZGVub3JtX21pbigpIF9TVExQX05PVEhST1cgeyBfU1RMUF9VU0lOR19WRU5ET1JfQ1NURCByZXR1cm4gTERCTF9NSU47IH0KLSAgc3RhdGljIGxvbmcgZG91YmxlIChfU1RMUF9DQUxMIG1heCkgKCkgX1NUTFBfTk9USFJPVyB7IF9TVExQX1VTSU5HX1ZFTkRPUl9DU1REIHJldHVybiBMREJMX01BWDsgfQotICBzdGF0aWMgbG9uZyBkb3VibGUgX1NUTFBfQ0FMTCBlcHNpbG9uKCkgX1NUTFBfTk9USFJPVyB7IHJldHVybiBMREJMX0VQU0lMT047IH0KLSAgc3RhdGljIGxvbmcgZG91YmxlIF9TVExQX0NBTEwgcm91bmRfZXJyb3IoKSBfU1RMUF9OT1RIUk9XIHsgcmV0dXJuIDQ7IH0gLy8gVW5pdHM6IHVscHMuCi0gIHN0YXRpYyBsb25nIGRvdWJsZSBfU1RMUF9DQUxMIGluZmluaXR5KCkgX1NUTFBfTk9USFJPVyB7IHJldHVybiBfU1RMUF9QUklWIF9MaW1HPGJvb2w+OjpnZXRfTERfaW5mKCk7IH0KLSAgc3RhdGljIGxvbmcgZG91YmxlIF9TVExQX0NBTEwgcXVpZXRfTmFOKCkgX1NUTFBfTk9USFJPVyB7IHJldHVybiBfU1RMUF9QUklWIF9MaW1HPGJvb2w+OjpnZXRfTERfcU5hTigpOyB9Ci0gIHN0YXRpYyBsb25nIGRvdWJsZSBfU1RMUF9DQUxMIHNpZ25hbGluZ19OYU4oKSBfU1RMUF9OT1RIUk9XIHsgcmV0dXJuIF9TVExQX1BSSVYgX0xpbUc8Ym9vbD46OmdldF9MRF9zTmFOKCk7IH0KLX07Ci0KLSNlbmRpZgotCi0vLyBXZSB3cml0ZSBzcGVjaWFsIHZhbHVlcyAoSW5mIGFuZCBOYU4pIGFzIGJpdCBwYXR0ZXJucyBhbmQKLS8vIGNhc3QgdGhlIHRoZSBhcHByb3ByaWF0ZSBmbG9hdGluZy1wb2ludCB0eXBlcy4KLV9TVExQX0VORF9OQU1FU1BBQ0UKLQotI2lmICFkZWZpbmVkIChfU1RMUF9MSU5LX1RJTUVfSU5TVEFOVElBVElPTikKLSMgIGluY2x1ZGUgPHN0bC9fbGltaXRzLmM+Ci0jZW5kaWYKLQotI2VuZGlmCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX2xpc3QuYyBiL3N0bC9fbGlzdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTM3NmMyLi4wMDAwMDAwCi0tLSBhL3N0bC9fbGlzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQ2ICswLDAgQEAKLS8qCi0gKgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NAotICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NwotICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk3Ci0gKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5Ci0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLSNpZm5kZWYgX1NUTFBfTElTVF9DCi0jZGVmaW5lIF9TVExQX0xJU1RfQwotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0xJU1RfSAotIyAgaW5jbHVkZSA8c3RsL19saXN0Lmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBfU1RMUF9DQVJSQVlfSAotIyAgaW5jbHVkZSA8c3RsL19jYXJyYXkuaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX1JBTkdFX0VSUk9SU19ICi0jICBpbmNsdWRlIDxzdGwvX3JhbmdlX2Vycm9ycy5oPgotI2VuZGlmCi0KLV9TVExQX0JFR0lOX05BTUVTUEFDRQotCi1fU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9FWFBPU0VfR0xPQkFMU19JTVBMRU1FTlRBVElPTikKLXRlbXBsYXRlIDxjbGFzcyBfRHVtbXk+Ci12b2lkIF9TVExQX0NBTEwKLV9MaXN0X2dsb2JhbDxfRHVtbXk+OjpfVHJhbnNmZXIoX0xpc3Rfbm9kZV9iYXNlKiBfX3Bvc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTGlzdF9ub2RlX2Jhc2UqIF9fZmlyc3QsIF9MaXN0X25vZGVfYmFzZSogX19sYXN0KSB7Ci0gIGlmIChfX3Bvc2l0aW9uICE9IF9fbGFzdCkgewotICAgIC8vIFJlbW92ZSBbZmlyc3QsIGxhc3QpIGZyb20gaXRzIG9sZCBwb3NpdGlvbi4KLSAgICBfX2xhc3QtPl9NX3ByZXYtPl9NX25leHQgICAgID0gX19wb3NpdGlvbjsKLSAgICBfX2ZpcnN0LT5fTV9wcmV2LT5fTV9uZXh0ICAgID0gX19sYXN0OwotICAgIF9fcG9zaXRpb24tPl9NX3ByZXYtPl9NX25leHQgPSBfX2ZpcnN0OwotCi0gICAgLy8gU3BsaWNlIFtmaXJzdCwgbGFzdCkgaW50byBpdHMgbmV3IHBvc2l0aW9uLgotICAgIF9Ob2RlX2Jhc2UqIF9fdG1wID0gX19wb3NpdGlvbi0+X01fcHJldjsKLSAgICBfX3Bvc2l0aW9uLT5fTV9wcmV2ID0gX19sYXN0LT5fTV9wcmV2OwotICAgIF9fbGFzdC0+X01fcHJldiAgICAgPSBfX2ZpcnN0LT5fTV9wcmV2OwotICAgIF9fZmlyc3QtPl9NX3ByZXYgICAgPSBfX3RtcDsKLSAgfQotfQotI2VuZGlmIC8qIF9TVExQX0VYUE9TRV9HTE9CQUxTX0lNUExFTUVOVEFUSU9OICovCi0KLXRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KLXZvaWQgX0xpc3RfYmFzZTxfVHAsX0FsbG9jPjo6Y2xlYXIoKSB7Ci0gIF9Ob2RlKiBfX2N1ciA9IF9fU1RBVElDX0NBU1QoX05vZGUqLCBfTV9ub2RlLl9NX2RhdGEuX01fbmV4dCk7Ci0gIHdoaWxlIChfX2N1ciAhPSAmKF9NX25vZGUuX01fZGF0YSkpIHsKLSAgICBfTm9kZSogX190bXAgPSBfX2N1cjsKLSAgICBfX2N1ciA9IF9fU1RBVElDX0NBU1QoX05vZGUqLCBfX2N1ci0+X01fbmV4dCk7Ci0gICAgX1NUTFBfU1REOjpfRGVzdHJveSgmX190bXAtPl9NX2RhdGEpOwotICAgIHRoaXMtPl9NX25vZGUuZGVhbGxvY2F0ZShfX3RtcCwgMSk7Ci0gIH0KLSAgX01fbm9kZS5fTV9kYXRhLl9NX25leHQgPSAmX01fbm9kZS5fTV9kYXRhOwotICBfTV9ub2RlLl9NX2RhdGEuX01fcHJldiA9ICZfTV9ub2RlLl9NX2RhdGE7Ci19Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9ORVNURURfVFlQRV9QQVJBTV9CVUcpCi0jICBkZWZpbmUgc2l6ZV90eXBlIHNpemVfdAotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUFRSX1NQRUNJQUxJWkFUSU9OUykKLSMgIGRlZmluZSBsaXN0IF9TVExQX1BUUl9JTVBMX05BTUUobGlzdCkKLSNlbGlmIGRlZmluZWQgKF9TVExQX0RFQlVHKQotIyAgZGVmaW5lIGxpc3QgX1NUTFBfTk9OX0RCR19OQU1FKGxpc3QpCi0jZWxzZQotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi0jZW5kaWYKLQotdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgotdm9pZCBsaXN0PF9UcCwgX0FsbG9jPjo6cmVzaXplKHNpemVfdHlwZSBfX25ld19zaXplLCBjb25zdCBfVHAmIF9feCkgewotICBpdGVyYXRvciBfX2kgPSBiZWdpbigpOwotICBzaXplX3R5cGUgX19sZW4gPSAwOwotICBmb3IgKCA7IF9faSAhPSBlbmQoKSAmJiBfX2xlbiA8IF9fbmV3X3NpemU7ICsrX19pLCArK19fbGVuKTsKLQotICBpZiAoX19sZW4gPT0gX19uZXdfc2l6ZSkKLSAgICBlcmFzZShfX2ksIGVuZCgpKTsKLSAgZWxzZSAvLyBfX2kgPT0gZW5kKCkKLSAgICBpbnNlcnQoZW5kKCksIF9fbmV3X3NpemUgLSBfX2xlbiwgX194KTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgotbGlzdDxfVHAsIF9BbGxvYz4mIGxpc3Q8X1RwLCBfQWxsb2M+OjpvcGVyYXRvcj0oY29uc3QgbGlzdDxfVHAsIF9BbGxvYz4mIF9feCkgewotICBpZiAodGhpcyAhPSAmX194KSB7Ci0gICAgaXRlcmF0b3IgX19maXJzdDEgPSBiZWdpbigpOwotICAgIGl0ZXJhdG9yIF9fbGFzdDEgPSBlbmQoKTsKLSAgICBjb25zdF9pdGVyYXRvciBfX2ZpcnN0MiA9IF9feC5iZWdpbigpOwotICAgIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdDIgPSBfX3guZW5kKCk7Ci0gICAgd2hpbGUgKF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0MikKLSAgICAgICpfX2ZpcnN0MSsrID0gKl9fZmlyc3QyKys7Ci0gICAgaWYgKF9fZmlyc3QyID09IF9fbGFzdDIpCi0gICAgICBlcmFzZShfX2ZpcnN0MSwgX19sYXN0MSk7Ci0gICAgZWxzZQotICAgICAgaW5zZXJ0KF9fbGFzdDEsIF9fZmlyc3QyLCBfX2xhc3QyKTsKLSAgfQotICByZXR1cm4gKnRoaXM7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KLXZvaWQgbGlzdDxfVHAsIF9BbGxvYz46Ol9NX2ZpbGxfYXNzaWduKHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX192YWwpIHsKLSAgaXRlcmF0b3IgX19pID0gYmVnaW4oKTsKLSAgZm9yICggOyBfX2kgIT0gZW5kKCkgJiYgX19uID4gMDsgKytfX2ksIC0tX19uKQotICAgICpfX2kgPSBfX3ZhbDsKLSAgaWYgKF9fbiA+IDApCi0gICAgaW5zZXJ0KGVuZCgpLCBfX24sIF9fdmFsKTsKLSAgZWxzZQotICAgIGVyYXNlKF9faSwgZW5kKCkpOwotfQotCi0jaWYgIWRlZmluZWQgKGxpc3QpCi1fU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCi0jZW5kaWYKLQotdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jLCBjbGFzcyBfUHJlZGljYXRlPgotdm9pZCBfU19yZW1vdmVfaWYobGlzdDxfVHAsIF9BbGxvYz4mIF9fdGhhdCwgX1ByZWRpY2F0ZSBfX3ByZWQpICB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgbGlzdDxfVHAsIF9BbGxvYz46Oml0ZXJhdG9yIF9MaXRlcmF0b3I7Ci0gIF9MaXRlcmF0b3IgX19maXJzdCA9IF9fdGhhdC5iZWdpbigpOwotICBfTGl0ZXJhdG9yIF9fbGFzdCA9IF9fdGhhdC5lbmQoKTsKLSAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0KSB7Ci0gICAgX0xpdGVyYXRvciBfX25leHQgPSBfX2ZpcnN0OwotICAgICsrX19uZXh0OwotICAgIGlmIChfX3ByZWQoKl9fZmlyc3QpKSBfX3RoYXQuZXJhc2UoX19maXJzdCk7Ci0gICAgX19maXJzdCA9IF9fbmV4dDsKLSAgfQotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2MsIGNsYXNzIF9CaW5hcnlQcmVkaWNhdGU+Ci12b2lkIF9TX3VuaXF1ZShsaXN0PF9UcCwgX0FsbG9jPiYgX190aGF0LCBfQmluYXJ5UHJlZGljYXRlIF9fYmluYXJ5X3ByZWQpIHsKLSAgdHlwZWRlZiB0eXBlbmFtZSBsaXN0PF9UcCwgX0FsbG9jPjo6aXRlcmF0b3IgX0xpdGVyYXRvcjsKLSAgX0xpdGVyYXRvciBfX2ZpcnN0ID0gX190aGF0LmJlZ2luKCk7Ci0gIF9MaXRlcmF0b3IgX19sYXN0ID0gX190aGF0LmVuZCgpOwotICBpZiAoX19maXJzdCA9PSBfX2xhc3QpIHJldHVybjsKLSAgX0xpdGVyYXRvciBfX25leHQgPSBfX2ZpcnN0OwotICB3aGlsZSAoKytfX25leHQgIT0gX19sYXN0KSB7Ci0gICAgaWYgKF9fYmluYXJ5X3ByZWQoKl9fZmlyc3QsICpfX25leHQpKQotICAgICAgX190aGF0LmVyYXNlKF9fbmV4dCk7Ci0gICAgZWxzZQotICAgICAgX19maXJzdCA9IF9fbmV4dDsKLSAgICBfX25leHQgPSBfX2ZpcnN0OwotICB9Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYywgY2xhc3MgX1N0cmljdFdlYWtPcmRlcmluZz4KLXZvaWQgX1NfbWVyZ2UobGlzdDxfVHAsIF9BbGxvYz4mIF9fdGhhdCwgbGlzdDxfVHAsIF9BbGxvYz4mIF9feCwKLSAgICAgICAgICAgICAgX1N0cmljdFdlYWtPcmRlcmluZyBfX2NvbXApIHsKLSAgdHlwZWRlZiB0eXBlbmFtZSBsaXN0PF9UcCwgX0FsbG9jPjo6aXRlcmF0b3IgX0xpdGVyYXRvcjsKLSAgX0xpdGVyYXRvciBfX2ZpcnN0MSA9IF9fdGhhdC5iZWdpbigpOwotICBfTGl0ZXJhdG9yIF9fbGFzdDEgPSBfX3RoYXQuZW5kKCk7Ci0gIF9MaXRlcmF0b3IgX19maXJzdDIgPSBfX3guYmVnaW4oKTsKLSAgX0xpdGVyYXRvciBfX2xhc3QyID0gX194LmVuZCgpOwotICBpZiAoX190aGF0LmdldF9hbGxvY2F0b3IoKSA9PSBfX3guZ2V0X2FsbG9jYXRvcigpKSB7Ci0gICAgd2hpbGUgKF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0MikgewotICAgICAgaWYgKF9fY29tcCgqX19maXJzdDIsICpfX2ZpcnN0MSkpIHsKLSAgICAgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoIV9fY29tcCgqX19maXJzdDEsICpfX2ZpcnN0MiksIF9TdGxNc2dfSU5WQUxJRF9TVFJJQ1RfV0VBS19QUkVESUNBVEUpCi0gICAgICAgIF9MaXRlcmF0b3IgX19uZXh0ID0gX19maXJzdDI7Ci0gICAgICAgIF9MaXN0X2dsb2JhbF9pbnN0OjpfVHJhbnNmZXIoX19maXJzdDEuX01fbm9kZSwgX19maXJzdDIuX01fbm9kZSwgKCsrX19uZXh0KS5fTV9ub2RlKTsKLSAgICAgICAgX19maXJzdDIgPSBfX25leHQ7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgICsrX19maXJzdDE7Ci0gICAgfQotICAgIGlmIChfX2ZpcnN0MiAhPSBfX2xhc3QyKQotICAgICAgX0xpc3RfZ2xvYmFsX2luc3Q6Ol9UcmFuc2ZlcihfX2xhc3QxLl9NX25vZGUsIF9fZmlyc3QyLl9NX25vZGUsIF9fbGFzdDIuX01fbm9kZSk7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgd2hpbGUgKF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0MikgewotICAgICAgaWYgKF9fY29tcCgqX19maXJzdDIsICpfX2ZpcnN0MSkpIHsKLSAgICAgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoIV9fY29tcCgqX19maXJzdDEsICpfX2ZpcnN0MiksIF9TdGxNc2dfSU5WQUxJRF9TVFJJQ1RfV0VBS19QUkVESUNBVEUpCi0gICAgICAgIF9fZmlyc3QxID0gX190aGF0Lmluc2VydChfX2ZpcnN0MSwgKl9fZmlyc3QyKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgKytfX2ZpcnN0MTsKLSAgICB9Ci0gICAgaWYgKF9fZmlyc3QyICE9IF9fbGFzdDIpIHsKLSAgICAgIF9fdGhhdC5pbnNlcnQoX19maXJzdDEsIF9fZmlyc3QyLCBfX2xhc3QyKTsKLSAgICB9Ci0gICAgX194LmNsZWFyKCk7Ci0gIH0KLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jLCBjbGFzcyBfU3RyaWN0V2Vha09yZGVyaW5nPgotdm9pZCBfU19zb3J0KGxpc3Q8X1RwLCBfQWxsb2M+JiBfX3RoYXQsIF9TdHJpY3RXZWFrT3JkZXJpbmcgX19jb21wKSB7Ci0gIC8vIERvIG5vdGhpbmcgaWYgdGhlIGxpc3QgaGFzIGxlbmd0aCAwIG9yIDEuCi0gIGlmIChfX3RoYXQuX01fbm9kZS5fTV9kYXRhLl9NX25leHQgPT0gJl9fdGhhdC5fTV9ub2RlLl9NX2RhdGEgfHwKLSAgICAgIF9fdGhhdC5fTV9ub2RlLl9NX2RhdGEuX01fbmV4dC0+X01fbmV4dCA9PSAmX190aGF0Ll9NX25vZGUuX01fZGF0YSkKLSAgICByZXR1cm47Ci0KLSAgbGlzdDxfVHAsIF9BbGxvYz4gX19jYXJyeShfX3RoYXQuZ2V0X2FsbG9jYXRvcigpKTsKLSAgY29uc3QgaW50IE5CID0gNjQ7Ci0gIF9TVExQX1BSSVYgX0NBcnJheTxsaXN0PF9UcCwgX0FsbG9jPiwgTkI+IF9fY291bnRlcihfX2NhcnJ5KTsKLSAgaW50IF9fZmlsbCA9IDA7Ci0gIHdoaWxlICghX190aGF0LmVtcHR5KCkpIHsKLSAgICBfX2NhcnJ5LnNwbGljZShfX2NhcnJ5LmJlZ2luKCksIF9fdGhhdCwgX190aGF0LmJlZ2luKCkpOwotICAgIGludCBfX2kgPSAwOwotICAgIHdoaWxlIChfX2kgPCBfX2ZpbGwgJiYgIV9fY291bnRlcltfX2ldLmVtcHR5KCkpIHsKLSAgICAgIF9TX21lcmdlKF9fY291bnRlcltfX2ldLCBfX2NhcnJ5LCBfX2NvbXApOwotICAgICAgX19jYXJyeS5zd2FwKF9fY291bnRlcltfX2krK10pOwotICAgIH0KLSAgICBfX2NhcnJ5LnN3YXAoX19jb3VudGVyW19faV0pOwotICAgIGlmIChfX2kgPT0gX19maWxsKSB7Ci0gICAgICArK19fZmlsbDsKLSAgICAgIGlmIChfX2ZpbGwgPj0gTkIpIHsKLSAgICAgICAgLy9Mb29rcyBsaWtlIHRoZSBsaXN0IGhhcyB0b28gbWFueSBlbGVtZW50cyB0byBiZSBzb3J0ZWQgd2l0aCB0aGlzIGFsZ29yaXRobToKLSAgICAgICAgX19zdGxfdGhyb3dfb3ZlcmZsb3dfZXJyb3IoImxpc3Q6OnNvcnQiKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmb3IgKGludCBfX2kgPSAxOyBfX2kgPCBfX2ZpbGw7ICsrX19pKQotICAgIF9TX21lcmdlKF9fY291bnRlcltfX2ldLCBfX2NvdW50ZXJbX19pIC0gMV0sIF9fY29tcCk7Ci0gIF9fdGhhdC5zd2FwKF9fY291bnRlcltfX2ZpbGwgLSAxXSk7Ci19Ci0KLSNpZiBkZWZpbmVkIChsaXN0KQotIyAgdW5kZWYgbGlzdAotI2VuZGlmCi0KLV9TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQotCi1fU1RMUF9FTkRfTkFNRVNQQUNFCi0KLSNlbmRpZiAvKiAgX1NUTFBfTElTVF9DICovCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX2xpc3QuaCBiL3N0bC9fbGlzdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2ZiOWJhLi4wMDAwMDAwCi0tLSBhL3N0bC9fbGlzdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzMyICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk0Ci0gKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3Ci0gKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTcKLSAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0vKiBOT1RFOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBTVEwgaGVhZGVycy4KLSAqICAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuCi0gKi8KLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9MSVNUX0lNUExfSAotI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9MSVNUX0lNUExfSAotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0FMR09CQVNFX0gKLSMgIGluY2x1ZGUgPHN0bC9fYWxnb2Jhc2UuaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0FMTE9DX0gKLSMgIGluY2x1ZGUgPHN0bC9fYWxsb2MuaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0lURVJBVE9SX0gKLSMgIGluY2x1ZGUgPHN0bC9faXRlcmF0b3IuaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NPTlNUUlVDVF9ICi0jICBpbmNsdWRlIDxzdGwvX2NvbnN0cnVjdC5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfRlVOQ1RJT05fQkFTRV9ICi0jICBpbmNsdWRlIDxzdGwvX2Z1bmN0aW9uX2Jhc2UuaD4KLSNlbmRpZgotCi1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLQotX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQotCi1zdHJ1Y3QgX0xpc3Rfbm9kZV9iYXNlIHsKLSAgX0xpc3Rfbm9kZV9iYXNlKiBfTV9uZXh0OwotICBfTGlzdF9ub2RlX2Jhc2UqIF9NX3ByZXY7Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgX0R1bW15PgotY2xhc3MgX0xpc3RfZ2xvYmFsIHsKLXB1YmxpYzoKLSAgdHlwZWRlZiBfTGlzdF9ub2RlX2Jhc2UgX05vZGVfYmFzZTsKLSAgc3RhdGljIHZvaWQgIF9TVExQX0NBTEwgX1RyYW5zZmVyKF9Ob2RlX2Jhc2UqIF9fcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX05vZGVfYmFzZSogX19maXJzdCwgX05vZGVfYmFzZSogX19sYXN0KTsKLX07Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUKQotX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIF9MaXN0X2dsb2JhbDxib29sPjsKLSNlbmRpZgotdHlwZWRlZiBfTGlzdF9nbG9iYWw8Ym9vbD4gX0xpc3RfZ2xvYmFsX2luc3Q7Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1jbGFzcyBfTGlzdF9ub2RlIDogcHVibGljIF9MaXN0X25vZGVfYmFzZSB7Ci1wdWJsaWM6Ci0gIF9UcCBfTV9kYXRhOwotICBfX1RSSVZJQUxfU1RVRkYoX0xpc3Rfbm9kZSkKLX07Ci0KLXN0cnVjdCBfTGlzdF9pdGVyYXRvcl9iYXNlIHsKLSAgdHlwZWRlZiBzaXplX3QgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGU7Ci0gIHR5cGVkZWYgcHRyZGlmZl90ICAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOwotICB0eXBlZGVmIGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OwotCi0gIF9MaXN0X25vZGVfYmFzZSogX01fbm9kZTsKLQotICBfTGlzdF9pdGVyYXRvcl9iYXNlKF9MaXN0X25vZGVfYmFzZSogX194KSA6IF9NX25vZGUoX194KSB7fQotCi0gIHZvaWQgX01faW5jcigpIHsgX01fbm9kZSA9IF9NX25vZGUtPl9NX25leHQ7IH0KLSAgdm9pZCBfTV9kZWNyKCkgeyBfTV9ub2RlID0gX01fbm9kZS0+X01fcHJldjsgfQotfTsKLQotCi10ZW1wbGF0ZTxjbGFzcyBfVHAsIGNsYXNzIF9UcmFpdHM+Ci1zdHJ1Y3QgX0xpc3RfaXRlcmF0b3IgOiBwdWJsaWMgX0xpc3RfaXRlcmF0b3JfYmFzZSB7Ci0gIHR5cGVkZWYgX1RwIHZhbHVlX3R5cGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6cG9pbnRlciAgICBwb2ludGVyOwotICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OnJlZmVyZW5jZSAgcmVmZXJlbmNlOwotCi0gIHR5cGVkZWYgX0xpc3RfaXRlcmF0b3I8X1RwLCBfVHJhaXRzPiAgICAgICAgIF9TZWxmOwotICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6Ol9Ob25Db25zdFRyYWl0cyAgICBfTm9uQ29uc3RUcmFpdHM7Ci0gIHR5cGVkZWYgX0xpc3RfaXRlcmF0b3I8X1RwLCBfTm9uQ29uc3RUcmFpdHM+IGl0ZXJhdG9yOwotICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6Ol9Db25zdFRyYWl0cyAgICAgICBfQ29uc3RUcmFpdHM7Ci0gIHR5cGVkZWYgX0xpc3RfaXRlcmF0b3I8X1RwLCBfQ29uc3RUcmFpdHM+ICAgIGNvbnN0X2l0ZXJhdG9yOwotCi0gIHR5cGVkZWYgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7Ci0gIHR5cGVkZWYgX0xpc3Rfbm9kZTxfVHA+IF9Ob2RlOwotICB0eXBlZGVmIHNpemVfdCBzaXplX3R5cGU7Ci0gIHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKLQotICBleHBsaWNpdCBfTGlzdF9pdGVyYXRvcihfTGlzdF9ub2RlX2Jhc2UqIF9feCkgOiBfTGlzdF9pdGVyYXRvcl9iYXNlKF9feCkge30KLSAgX0xpc3RfaXRlcmF0b3IoKSA6IF9MaXN0X2l0ZXJhdG9yX2Jhc2UoMCkge30KLSAgLy9jb3B5IGNvbnN0cnVjdG9yIGZvciBpdGVyYXRvciBhbmQgY29uc3RydWN0b3IgZnJvbSBpdGVyYXRvciBmb3IgY29uc3RfaXRlcmF0b3IKLSAgX0xpc3RfaXRlcmF0b3IoY29uc3QgaXRlcmF0b3ImIF9feCkgOiAgX0xpc3RfaXRlcmF0b3JfYmFzZShfX3guX01fbm9kZSkge30KLQotICByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gX19TVEFUSUNfQ0FTVChfTm9kZSosIHRoaXMtPl9NX25vZGUpLT5fTV9kYXRhOyB9Ci0KLSAgX1NUTFBfREVGSU5FX0FSUk9XX09QRVJBVE9SCi0KLSAgX1NlbGYmIG9wZXJhdG9yKysoKSB7Ci0gICAgdGhpcy0+X01faW5jcigpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotICBfU2VsZiBvcGVyYXRvcisrKGludCkgewotICAgIF9TZWxmIF9fdG1wID0gKnRoaXM7Ci0gICAgdGhpcy0+X01faW5jcigpOwotICAgIHJldHVybiBfX3RtcDsKLSAgfQotICBfU2VsZiYgb3BlcmF0b3ItLSgpIHsKLSAgICB0aGlzLT5fTV9kZWNyKCk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIF9TZWxmIG9wZXJhdG9yLS0oaW50KSB7Ci0gICAgX1NlbGYgX190bXAgPSAqdGhpczsKLSAgICB0aGlzLT5fTV9kZWNyKCk7Ci0gICAgcmV0dXJuIF9fdG1wOwotICB9Ci0gIGJvb2wgb3BlcmF0b3I9PShjb25zdF9pdGVyYXRvciBfX3kgKSBjb25zdCB7Ci0gICAgcmV0dXJuIHRoaXMtPl9NX25vZGUgPT0gX195Ll9NX25vZGU7Ci0gIH0KLSAgYm9vbCBvcGVyYXRvciE9KGNvbnN0X2l0ZXJhdG9yIF9feSApIGNvbnN0IHsKLSAgICByZXR1cm4gdGhpcy0+X01fbm9kZSAhPSBfX3kuX01fbm9kZTsKLSAgfQotfTsKLQotI2lmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pCi1fU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKLXRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9UcmFpdHM+Ci1zdHJ1Y3QgX190eXBlX3RyYWl0czxfU1RMUF9QUklWIF9MaXN0X2l0ZXJhdG9yPF9UcCwgX1RyYWl0cz4gPiB7Ci0gIHR5cGVkZWYgX19mYWxzZV90eXBlICAgaGFzX3RyaXZpYWxfZGVmYXVsdF9jb25zdHJ1Y3RvcjsKLSAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yOwotICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3I7Ci0gIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjsKLSAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgICBpc19QT0RfdHlwZTsKLX07Ci1fU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCi0jZW5kaWYgLyogX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTiAqLwotCi0jaWYgZGVmaW5lZCAoX1NUTFBfVVNFX09MRF9IUF9JVEVSQVRPUl9RVUVSSUVTKQotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVHJhaXRzPgotaW5saW5lIF9UcCogdmFsdWVfdHlwZShjb25zdCBfU1RMUF9QUklWIF9MaXN0X2l0ZXJhdG9yPF9UcCwgX1RyYWl0cz4mKSB7IHJldHVybiAwOyB9Ci1pbmxpbmUgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnkoY29uc3QgX1NUTFBfUFJJViBfTGlzdF9pdGVyYXRvcl9iYXNlJikgeyByZXR1cm4gYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcoKTt9Ci1pbmxpbmUgcHRyZGlmZl90KiBkaXN0YW5jZV90eXBlKGNvbnN0IF9TVExQX1BSSVYgX0xpc3RfaXRlcmF0b3JfYmFzZSYpIHsgcmV0dXJuIDA7IH0KLV9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKLSNlbmRpZgotCi0vLyBCYXNlIGNsYXNzIHRoYXQgZW5jYXBzdWxhdGVzIGRldGFpbHMgb2YgYWxsb2NhdG9ycyBhbmQgaGVscHMKLS8vIHRvIHNpbXBsaWZ5IEVICi0KLXRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KLWNsYXNzIF9MaXN0X2Jhc2UgewotcHJvdGVjdGVkOgotICBfU1RMUF9GT1JDRV9BTExPQ0FUT1JTKF9UcCwgX0FsbG9jKQotICB0eXBlZGVmIF9MaXN0X25vZGVfYmFzZSBfTm9kZV9iYXNlOwotICB0eXBlZGVmIF9MaXN0X25vZGU8X1RwPiBfTm9kZTsKLSAgdHlwZWRlZiBfTGlzdF9iYXNlPF9UcCwgX0FsbG9jPiBfU2VsZjsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2NfdHJhaXRzPF9Ob2RlLCBfQWxsb2M+OjphbGxvY2F0b3JfdHlwZSBfTm9kZV9hbGxvY2F0b3JfdHlwZTsKLXB1YmxpYzoKLSAgdHlwZWRlZiBfU1RMUF9hbGxvY19wcm94eTxfTm9kZV9iYXNlLCBfTm9kZSwgX05vZGVfYWxsb2NhdG9yX3R5cGU+IF9BbGxvY1Byb3h5OwotICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY190cmFpdHM8X1RwLCBfQWxsb2M+OjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKLQotICBhbGxvY2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9yKCkgY29uc3QKLSAgeyByZXR1cm4gX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoKGNvbnN0IF9Ob2RlX2FsbG9jYXRvcl90eXBlJilfTV9ub2RlLCBfVHApOyB9Ci0KLSAgX0xpc3RfYmFzZShjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKSA6IF9NX25vZGUoX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoX19hLCBfTm9kZSksIF9Ob2RlX2Jhc2UoKSkKLSAgeyBfTV9lbXB0eV9pbml0aWFsaXplKCk7IH0KLSAgX0xpc3RfYmFzZShfX21vdmVfc291cmNlPF9TZWxmPiBzcmMpIDoKLSAgICBfTV9ub2RlKF9fbW92ZV9zb3VyY2U8X0FsbG9jUHJveHk+KHNyYy5nZXQoKS5fTV9ub2RlKSkgewotICAgIGlmIChzcmMuZ2V0KCkuZW1wdHkoKSkKLSAgICAgIC8vV2UgZm9yY2UgdGhpcyB0byBlbXB0eS4KLSAgICAgIF9NX2VtcHR5X2luaXRpYWxpemUoKTsKLSAgICBlbHNlIHsKLSAgICAgIHNyYy5nZXQoKS5fTV9lbXB0eV9pbml0aWFsaXplKCk7Ci0gICAgICBfTV9ub2RlLl9NX2RhdGEuX01fcHJldi0+X01fbmV4dCA9IF9NX25vZGUuX01fZGF0YS5fTV9uZXh0LT5fTV9wcmV2ID0gJl9NX25vZGUuX01fZGF0YTsKLSAgICB9Ci0gIH0KLQotICB+X0xpc3RfYmFzZSgpCi0gIHsgY2xlYXIoKTsgfQotCi0gIHZvaWQgY2xlYXIoKTsKLSAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIF9NX25vZGUuX01fZGF0YS5fTV9uZXh0ID09ICZfTV9ub2RlLl9NX2RhdGE7IH0KLQotICB2b2lkIF9NX2VtcHR5X2luaXRpYWxpemUoKSB7Ci0gICAgX01fbm9kZS5fTV9kYXRhLl9NX25leHQgPSAmX01fbm9kZS5fTV9kYXRhOwotICAgIF9NX25vZGUuX01fZGF0YS5fTV9wcmV2ID0gX01fbm9kZS5fTV9kYXRhLl9NX25leHQ7Ci0gIH0KLQotcHVibGljOgotICBfQWxsb2NQcm94eSBfTV9ub2RlOwotfTsKLQotI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QVFJfU1BFQ0lBTElaQVRJT05TKQotIyAgZGVmaW5lIGxpc3QgX1NUTFBfUFRSX0lNUExfTkFNRShsaXN0KQotI2VsaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpCi0jICBkZWZpbmUgbGlzdCBfU1RMUF9OT05fREJHX05BTUUobGlzdCkKLSNlbHNlCi1fU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKLSNlbmRpZgotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBfU1RMUF9ERUZBVUxUX0FMTE9DQVRPUl9TRUxFQ1QoX1RwKSA+Ci1jbGFzcyBsaXN0OwotCi0jaWYgIWRlZmluZWQgKGxpc3QpCi1fU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCi0jZW5kaWYKLQotLy8gaGVscGVyIGZ1bmN0aW9ucyB0byByZWR1Y2UgY29kZSBkdXBsaWNhdGlvbgotdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jLCBjbGFzcyBfUHJlZGljYXRlPgotdm9pZCBfU19yZW1vdmVfaWYobGlzdDxfVHAsIF9BbGxvYz4mIF9fdGhhdCwgX1ByZWRpY2F0ZSBfX3ByZWQpOwotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2MsIGNsYXNzIF9CaW5hcnlQcmVkaWNhdGU+Ci12b2lkIF9TX3VuaXF1ZShsaXN0PF9UcCwgX0FsbG9jPiYgX190aGF0LCBfQmluYXJ5UHJlZGljYXRlIF9fYmluYXJ5X3ByZWQpOwotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2MsIGNsYXNzIF9TdHJpY3RXZWFrT3JkZXJpbmc+Ci12b2lkIF9TX21lcmdlKGxpc3Q8X1RwLCBfQWxsb2M+JiBfX3RoYXQsIGxpc3Q8X1RwLCBfQWxsb2M+JiBfX3gsCi0gICAgICAgICAgICAgIF9TdHJpY3RXZWFrT3JkZXJpbmcgX19jb21wKTsKLQotdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jLCBjbGFzcyBfU3RyaWN0V2Vha09yZGVyaW5nPgotdm9pZCBfU19zb3J0KGxpc3Q8X1RwLCBfQWxsb2M+JiBfX3RoYXQsIF9TdHJpY3RXZWFrT3JkZXJpbmcgX19jb21wKTsKLQotI2lmICFkZWZpbmVkIChsaXN0KQotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi0jZW5kaWYKLQotdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgotY2xhc3MgbGlzdCA6IHB1YmxpYyBfU1RMUF9QUklWIF9MaXN0X2Jhc2U8X1RwLCBfQWxsb2M+Ci0jaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKSAmJiAhZGVmaW5lZCAobGlzdCkKLSAgICAgICAgICAgLCBwdWJsaWMgX19zdGxwb3J0X2NsYXNzPGxpc3Q8X1RwLCBfQWxsb2M+ID4KLSNlbmRpZgotewotICB0eXBlZGVmIF9TVExQX1BSSVYgX0xpc3RfYmFzZTxfVHAsIF9BbGxvYz4gX0Jhc2U7Ci0gIHR5cGVkZWYgbGlzdDxfVHAsIF9BbGxvYz4gX1NlbGY7Ci0gIHR5cGVkZWYgX1NUTFBfUFJJViBfTGlzdF9ub2RlPF9UcD4gX05vZGU7Ci0gIHR5cGVkZWYgX1NUTFBfUFJJViBfTGlzdF9ub2RlX2Jhc2UgX05vZGVfYmFzZTsKLXB1YmxpYzoKLSAgdHlwZWRlZiBfVHAgdmFsdWVfdHlwZTsKLSAgdHlwZWRlZiB2YWx1ZV90eXBlKiBwb2ludGVyOwotICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUqIGNvbnN0X3BvaW50ZXI7Ci0gIHR5cGVkZWYgdmFsdWVfdHlwZSYgcmVmZXJlbmNlOwotICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmIGNvbnN0X3JlZmVyZW5jZTsKLSAgdHlwZWRlZiBzaXplX3Qgc2l6ZV90eXBlOwotICB0eXBlZGVmIHB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7Ci0gIF9TVExQX0ZPUkNFX0FMTE9DQVRPUlMoX1RwLCBfQWxsb2MpCi0gIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmFsbG9jYXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOwotICB0eXBlZGVmIGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnIF9JdGVyYXRvcl9jYXRlZ29yeTsKLQotcHVibGljOgotICB0eXBlZGVmIF9TVExQX1BSSVYgX0xpc3RfaXRlcmF0b3I8X1RwLCBfTm9uY29uc3RfdHJhaXRzPF9UcD4gPiBpdGVyYXRvcjsKLSAgdHlwZWRlZiBfU1RMUF9QUklWIF9MaXN0X2l0ZXJhdG9yPF9UcCwgX0NvbnN0X3RyYWl0czxfVHA+ID4gICAgY29uc3RfaXRlcmF0b3I7Ci0gIF9TVExQX0RFQ0xBUkVfQklESVJFQ1RJT05BTF9SRVZFUlNFX0lURVJBVE9SUzsKLQotcHJvdGVjdGVkOgotI2lmICFkZWZpbmVkKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCi0gIF9Ob2RlX2Jhc2UqIF9NX2NyZWF0ZV9ub2RlKGNvbnN0X3JlZmVyZW5jZSBfX3ggPSB2YWx1ZV90eXBlKCkpIHsKLSNlbHNlCi0gIF9Ob2RlX2Jhc2UqIF9NX2NyZWF0ZV9ub2RlKGNvbnN0X3JlZmVyZW5jZSBfX3gpIHsKLSNlbmRpZiAvKiFfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKi8KLSAgICBfTm9kZSogX19wID0gdGhpcy0+X01fbm9kZS5hbGxvY2F0ZSgxKTsKLSAgICBfU1RMUF9UUlkgewotICAgICAgX0NvcHlfQ29uc3RydWN0KCZfX3AtPl9NX2RhdGEsIF9feCk7Ci0gICAgfQotICAgIF9TVExQX1VOV0lORCh0aGlzLT5fTV9ub2RlLmRlYWxsb2NhdGUoX19wLCAxKSkKLSAgICByZXR1cm4gX19wOwotICB9Ci0KLSNpZiBkZWZpbmVkKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCi0gIF9Ob2RlX2Jhc2UqIF9NX2NyZWF0ZV9ub2RlKCkgewotICAgIF9Ob2RlKiBfX3AgPSB0aGlzLT5fTV9ub2RlLmFsbG9jYXRlKDEpOwotICAgIF9TVExQX1RSWSB7Ci0gICAgICBfU1RMUF9TVEQ6Ol9Db25zdHJ1Y3QoJl9fcC0+X01fZGF0YSk7Ci0gICAgfQotICAgIF9TVExQX1VOV0lORCh0aGlzLT5fTV9ub2RlLmRlYWxsb2NhdGUoX19wLCAxKSkKLSAgICByZXR1cm4gX19wOwotICB9Ci0jZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKi8KLQotcHVibGljOgotI2lmICFkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQotICBleHBsaWNpdCBsaXN0KHNpemVfdHlwZSBfX24sIGNvbnN0X3JlZmVyZW5jZSBfX3ZhbCA9IF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQodmFsdWVfdHlwZSksCi0gICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCi0jZWxzZQotICBleHBsaWNpdCBsaXN0KHNpemVfdHlwZSBfX24pCi0gICAgOiBfU1RMUF9QUklWIF9MaXN0X2Jhc2U8X1RwLCBfQWxsb2M+KGFsbG9jYXRvcl90eXBlKCkpCi0gICAgeyB0aGlzLT5pbnNlcnQoYmVnaW4oKSwgX19uLCBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKHZhbHVlX3R5cGUpKTsgfQotICBsaXN0KHNpemVfdHlwZSBfX24sIGNvbnN0X3JlZmVyZW5jZSBfX3ZhbCkKLSAgICA6IF9TVExQX1BSSVYgX0xpc3RfYmFzZTxfVHAsIF9BbGxvYz4oYWxsb2NhdG9yX3R5cGUoKSkKLSAgICB7IHRoaXMtPmluc2VydChiZWdpbigpLCBfX24sIF9fdmFsKTsgfQotICBsaXN0KHNpemVfdHlwZSBfX24sIGNvbnN0X3JlZmVyZW5jZSBfX3ZhbCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKLSNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0qLwotICAgIDogX1NUTFBfUFJJViBfTGlzdF9iYXNlPF9UcCwgX0FsbG9jPihfX2EpCi0gICAgeyB0aGlzLT5pbnNlcnQoYmVnaW4oKSwgX19uLCBfX3ZhbCk7IH0KLQotI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCi0gIC8vIFdlIGRvbid0IG5lZWQgYW55IGRpc3BhdGNoaW5nIHRyaWNrcyBoZXJlLCBiZWNhdXNlIGluc2VydCBkb2VzIGFsbCBvZgotICAvLyB0aGF0IGFueXdheS4KLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgotICBsaXN0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKLSAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hIF9TVExQX0FMTE9DQVRPUl9UWVBFX0RGTCkKLSAgICA6IF9TVExQX1BSSVYgX0xpc3RfYmFzZTxfVHAsIF9BbGxvYz4oX19hKQotICB7IF9NX2luc2VydChiZWdpbigpLCBfX2ZpcnN0LCBfX2xhc3QpOyB9Ci0KLSMgIGlmIGRlZmluZWQgKF9TVExQX05FRURTX0VYVFJBX1RFTVBMQVRFX0NPTlNUUlVDVE9SUykKLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgotICBsaXN0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKLSAgICA6IF9TVExQX1BSSVYgX0xpc3RfYmFzZTxfVHAsIF9BbGxvYz4oYWxsb2NhdG9yX3R5cGUoKSkKLSAgeyBfTV9pbnNlcnQoYmVnaW4oKSwgX19maXJzdCwgX19sYXN0KTsgfQotIyAgZW5kaWYKLSNlbHNlIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KLSAgbGlzdChjb25zdCB2YWx1ZV90eXBlKiBfX2ZpcnN0LCBjb25zdCB2YWx1ZV90eXBlKiBfX2xhc3QsCi0gICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCi0gICAgOiBfU1RMUF9QUklWIF9MaXN0X2Jhc2U8X1RwLCBfQWxsb2M+KF9fYSkKLSAgICB7IF9NX2luc2VydChiZWdpbigpLCBfX2ZpcnN0LCBfX2xhc3QpOyB9Ci0gIGxpc3QoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0LAotICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQotICAgIDogX1NUTFBfUFJJViBfTGlzdF9iYXNlPF9UcCwgX0FsbG9jPihfX2EpCi0gICAgeyBfTV9pbnNlcnQoYmVnaW4oKSwgX19maXJzdCwgX19sYXN0KTsgfQotI2VuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KLQotI2lmICFkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQotICBleHBsaWNpdCBsaXN0KGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQotI2Vsc2UKLSAgbGlzdCgpCi0gICAgOiBfU1RMUF9QUklWIF9MaXN0X2Jhc2U8X1RwLCBfQWxsb2M+KGFsbG9jYXRvcl90eXBlKCkpIHt9Ci0gIGxpc3QoY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKLSNlbmRpZgotICAgIDogX1NUTFBfUFJJViBfTGlzdF9iYXNlPF9UcCwgX0FsbG9jPihfX2EpIHt9Ci0KLSAgbGlzdChjb25zdCBfU2VsZiYgX194KSA6IF9TVExQX1BSSVYgX0xpc3RfYmFzZTxfVHAsIF9BbGxvYz4oX194LmdldF9hbGxvY2F0b3IoKSkKLSAgeyBfTV9pbnNlcnQoYmVnaW4oKSwgX194LmJlZ2luKCksIF9feC5lbmQoKSk7IH0KLQotICBsaXN0KF9fbW92ZV9zb3VyY2U8X1NlbGY+IHNyYykKLSAgICA6IF9TVExQX1BSSVYgX0xpc3RfYmFzZTxfVHAsIF9BbGxvYz4oX19tb3ZlX3NvdXJjZTxfQmFzZT4oc3JjLmdldCgpKSkge30KLQotICB+bGlzdCgpIHt9Ci0KLSAgX1NlbGYmIG9wZXJhdG9yID0gKGNvbnN0IF9TZWxmJiBfX3gpOwotCi0gIGl0ZXJhdG9yIGJlZ2luKCkgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gaXRlcmF0b3IodGhpcy0+X01fbm9kZS5fTV9kYXRhLl9NX25leHQpOyB9Ci0gIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgICAgICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IodGhpcy0+X01fbm9kZS5fTV9kYXRhLl9NX25leHQpOyB9Ci0KLSAgaXRlcmF0b3IgZW5kKCkgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBpdGVyYXRvcigmdGhpcy0+X01fbm9kZS5fTV9kYXRhKTsgfQotICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCAgICAgICAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9fQ09OU1RfQ0FTVChfTm9kZV9iYXNlKiwgJnRoaXMtPl9NX25vZGUuX01fZGF0YSkpOyB9Ci0KLSAgcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSAgICAgICAgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQotICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9Ci0KLSAgcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgICAgICAgICAgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9Ci0gIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0ICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQotCi0gIHNpemVfdHlwZSBzaXplKCkgY29uc3QgewotICAgIHNpemVfdHlwZSBfX3Jlc3VsdCA9IGRpc3RhbmNlKGJlZ2luKCksIGVuZCgpKTsKLSAgICByZXR1cm4gX19yZXN1bHQ7Ci0gIH0KLSAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgeyByZXR1cm4gc2l6ZV90eXBlKC0xKTsgfQotCi0gIHJlZmVyZW5jZSBmcm9udCgpICAgICAgICAgICAgIHsgcmV0dXJuICpiZWdpbigpOyB9Ci0gIGNvbnN0X3JlZmVyZW5jZSBmcm9udCgpIGNvbnN0IHsgcmV0dXJuICpiZWdpbigpOyB9Ci0gIHJlZmVyZW5jZSBiYWNrKCkgICAgICAgICAgICAgIHsgcmV0dXJuICooLS1lbmQoKSk7IH0KLSAgY29uc3RfcmVmZXJlbmNlIGJhY2soKSBjb25zdCAgeyByZXR1cm4gKigtLWVuZCgpKTsgfQotCi1wcml2YXRlOgotICB2b2lkIF9NX3N3YXBfYXV4KF9TZWxmJiBfX3gpIHsKLSAgICBfX3guX01fbm9kZS5fTV9zd2FwX2FsbG9jKHRoaXMtPl9NX25vZGUpOwotICAgIF9feC5fTV9ub2RlLl9NX2RhdGEuX01fbmV4dCA9IHRoaXMtPl9NX25vZGUuX01fZGF0YS5fTV9uZXh0OwotICAgIF9feC5fTV9ub2RlLl9NX2RhdGEuX01fbmV4dC0+X01fcHJldiA9ICZfX3guX01fbm9kZS5fTV9kYXRhOwotICAgIF9feC5fTV9ub2RlLl9NX2RhdGEuX01fcHJldiA9IHRoaXMtPl9NX25vZGUuX01fZGF0YS5fTV9wcmV2OwotICAgIF9feC5fTV9ub2RlLl9NX2RhdGEuX01fcHJldi0+X01fbmV4dCA9ICZfX3guX01fbm9kZS5fTV9kYXRhOwotICAgIHRoaXMtPl9NX2VtcHR5X2luaXRpYWxpemUoKTsKLSAgfQotCi1wdWJsaWM6Ci0gIHZvaWQgc3dhcChfU2VsZiYgX194KSB7Ci0gICAgaWYgKF9feC5lbXB0eSgpKSB7Ci0gICAgICBpZiAodGhpcy0+ZW1wdHkoKSkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICB0aGlzLT5fTV9zd2FwX2F1eChfX3gpOwotICAgIH0gZWxzZSBpZiAodGhpcy0+ZW1wdHkoKSkgewotICAgICAgX194Ll9NX3N3YXBfYXV4KCp0aGlzKTsKLSAgICB9IGVsc2UgewotICAgICAgdGhpcy0+X01fbm9kZS5zd2FwKF9feC5fTV9ub2RlKTsKLSAgICAgIF9TVExQX1NURDo6c3dhcCh0aGlzLT5fTV9ub2RlLl9NX2RhdGEuX01fcHJldi0+X01fbmV4dCwgX194Ll9NX25vZGUuX01fZGF0YS5fTV9wcmV2LT5fTV9uZXh0KTsKLSAgICAgIF9TVExQX1NURDo6c3dhcCh0aGlzLT5fTV9ub2RlLl9NX2RhdGEuX01fbmV4dC0+X01fcHJldiwgX194Ll9NX25vZGUuX01fZGF0YS5fTV9uZXh0LT5fTV9wcmV2KTsKLSAgICB9Ci0gIH0KLQotI2lmICFkZWZpbmVkKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pICYmICFkZWZpbmVkKF9TVExQX05PX0FOQUNIUk9OSVNNUykKLSAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBjb25zdF9yZWZlcmVuY2UgX194ID0gdmFsdWVfdHlwZSgpKSB7Ci0jZWxzZQotICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIGNvbnN0X3JlZmVyZW5jZSBfX3gpIHsKLSNlbmRpZiAvKiFfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNICYmICFfU1RMUF9OT19BTkFDSFJPTklTTVMqLwotICAgIF9Ob2RlX2Jhc2UqIF9fdG1wID0gX01fY3JlYXRlX25vZGUoX194KTsKLSAgICBfTm9kZV9iYXNlKiBfX24gPSBfX3Bvcy5fTV9ub2RlOwotICAgIF9Ob2RlX2Jhc2UqIF9fcCA9IF9fbi0+X01fcHJldjsKLSAgICBfX3RtcC0+X01fbmV4dCA9IF9fbjsKLSAgICBfX3RtcC0+X01fcHJldiA9IF9fcDsKLSAgICBfX3AtPl9NX25leHQgPSBfX3RtcDsKLSAgICBfX24tPl9NX3ByZXYgPSBfX3RtcDsKLSAgICByZXR1cm4gaXRlcmF0b3IoX190bXApOwotICB9Ci0KLXByaXZhdGU6Ci0jaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgotICB2b2lkIF9NX2luc2VydChpdGVyYXRvciBfX3BvcywgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KSB7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBfSXNJbnRlZ3JhbDxfSW5wdXRJdGVyYXRvcj46Ol9SZXQgX0ludGVncmFsOwotICAgIF9NX2luc2VydF9kaXNwYXRjaChfX3BvcywgX19maXJzdCwgX19sYXN0LCBfSW50ZWdyYWwoKSk7Ci0gIH0KLQotICAvLyBDaGVjayB3aGV0aGVyIGl0J3MgYW4gaW50ZWdyYWwgdHlwZS4gIElmIHNvLCBpdCdzIG5vdCBhbiBpdGVyYXRvci4KLSAgdGVtcGxhdGU8Y2xhc3MgX0ludGVnZXI+Ci0gIHZvaWQgX01faW5zZXJ0X2Rpc3BhdGNoKGl0ZXJhdG9yIF9fcG9zLCBfSW50ZWdlciBfX24sIF9JbnRlZ2VyIF9feCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX190cnVlX3R5cGUmIC8qX0lzSW50ZWdyYWwqLykgewotICAgIF9NX2ZpbGxfaW5zZXJ0KF9fcG9zLCBfX24sIF9feCk7Ci0gIH0KLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXI+Ci0gIHZvaWQgX01faW5zZXJ0X2Rpc3BhdGNoKGl0ZXJhdG9yIF9fcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qX0lzSW50ZWdyYWwqLykgewotI2Vsc2UgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLwotICB2b2lkIF9NX2luc2VydChpdGVyYXRvciBfX3BvcywgY29uc3QgdmFsdWVfdHlwZSogX19maXJzdCwgY29uc3QgdmFsdWVfdHlwZSogX19sYXN0KSB7Ci0gICAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCi0gICAgICBpbnNlcnQoX19wb3MsICpfX2ZpcnN0KTsKLSAgfQotICB2b2lkIF9NX2luc2VydChpdGVyYXRvciBfX3BvcywgY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KSB7Ci0jZW5kaWYgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLwotICAgIC8vV2UgdXNlIGEgdGVtcG9yYXJ5IGxpc3QgdG8gYXZvaWQgdGhlIGF1dG8gcmVmZXJlbmNlIHRyb3VibGVzIChpbmZpbml0ZSBsb29wKQotICAgIGZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQotICAgICAgaW5zZXJ0KF9fcG9zLCAqX19maXJzdCk7Ci0gIH0KLQotcHVibGljOgotI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KLSAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkgewotICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lzSW50ZWdyYWw8X0lucHV0SXRlcmF0b3I+OjpfUmV0IF9JbnRlZ3JhbDsKLSAgICBfTV9zcGxpY2VfaW5zZXJ0X2Rpc3BhdGNoKF9fcG9zLCBfX2ZpcnN0LCBfX2xhc3QsIF9JbnRlZ3JhbCgpKTsKLSAgfQotCi1wcml2YXRlOgotICAvLyBDaGVjayB3aGV0aGVyIGl0J3MgYW4gaW50ZWdyYWwgdHlwZS4gIElmIHNvLCBpdCdzIG5vdCBhbiBpdGVyYXRvci4KLSAgdGVtcGxhdGU8Y2xhc3MgX0ludGVnZXI+Ci0gIHZvaWQgX01fc3BsaWNlX2luc2VydF9kaXNwYXRjaChpdGVyYXRvciBfX3BvcywgX0ludGVnZXIgX19uLCBfSW50ZWdlciBfX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKl9Jc0ludGVncmFsKi8pIHsKLSAgICBfTV9maWxsX2luc2VydChfX3BvcywgX19uLCBfX3gpOwotICB9Ci0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgotICB2b2lkIF9NX3NwbGljZV9pbnNlcnRfZGlzcGF0Y2goaXRlcmF0b3IgX19wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypfSXNJbnRlZ3JhbCovKSB7Ci0jZWxzZSAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCi0gIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBjb25zdCB2YWx1ZV90eXBlKiBfX2ZpcnN0LCBjb25zdCB2YWx1ZV90eXBlKiBfX2xhc3QpIHsKLSAgICBfU2VsZiBfX3RtcChfX2ZpcnN0LCBfX2xhc3QsIHRoaXMtPmdldF9hbGxvY2F0b3IoKSk7Ci0gICAgc3BsaWNlKF9fcG9zLCBfX3RtcCk7Ci0gIH0KLSAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkgewotI2VuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KLSAgICAvL1dlIHVzZSBhIHRlbXBvcmFyeSBsaXN0IHRvIGF2b2lkIHRoZSBhdXRvIHJlZmVyZW5jZSB0cm91YmxlcyAoaW5maW5pdGUgbG9vcCkKLSAgICBfU2VsZiBfX3RtcChfX2ZpcnN0LCBfX2xhc3QsIHRoaXMtPmdldF9hbGxvY2F0b3IoKSk7Ci0gICAgc3BsaWNlKF9fcG9zLCBfX3RtcCk7Ci0gIH0KLQotcHVibGljOgotICB2b2lkIGluc2VydChpdGVyYXRvciBfX3Bvcywgc2l6ZV90eXBlIF9fbiwgY29uc3RfcmVmZXJlbmNlIF9feCkKLSAgeyBfTV9maWxsX2luc2VydChfX3BvcywgX19uLCBfX3gpOyB9Ci0KLXByaXZhdGU6Ci0gIHZvaWQgX01fZmlsbF9pbnNlcnQoaXRlcmF0b3IgX19wb3MsIHNpemVfdHlwZSBfX24sIGNvbnN0X3JlZmVyZW5jZSBfX3gpIHsKLSAgICBmb3IgKCA7IF9fbiA+IDA7IC0tX19uKQotICAgICAgaW5zZXJ0KF9fcG9zLCBfX3gpOwotICB9Ci0KLXB1YmxpYzoKLSAgdm9pZCBwdXNoX2Zyb250KGNvbnN0X3JlZmVyZW5jZSBfX3gpIHsgaW5zZXJ0KGJlZ2luKCksIF9feCk7IH0KLSAgdm9pZCBwdXNoX2JhY2sgKGNvbnN0X3JlZmVyZW5jZSBfX3gpIHsgaW5zZXJ0KGVuZCgpLCBfX3gpOyB9Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fQU5BQ0hST05JU01TKQotICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgX19wb3MpCi0gIHsgcmV0dXJuIGluc2VydChfX3BvcywgX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRCh2YWx1ZV90eXBlKSk7IH0KLSAgdm9pZCBwdXNoX2Zyb250KCkge2luc2VydChiZWdpbigpKTt9Ci0gIHZvaWQgcHVzaF9iYWNrKCkge2luc2VydChlbmQoKSk7fQotIyBlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0gJiYgIV9TVExQX05PX0FOQUNIUk9OSVNNUyovCi0KLSAgaXRlcmF0b3IgZXJhc2UoaXRlcmF0b3IgX19wb3MpIHsKLSAgICBfTm9kZV9iYXNlKiBfX25leHRfbm9kZSA9IF9fcG9zLl9NX25vZGUtPl9NX25leHQ7Ci0gICAgX05vZGVfYmFzZSogX19wcmV2X25vZGUgPSBfX3Bvcy5fTV9ub2RlLT5fTV9wcmV2OwotICAgIF9Ob2RlKiBfX24gPSBfX1NUQVRJQ19DQVNUKF9Ob2RlKiwgX19wb3MuX01fbm9kZSk7Ci0gICAgX19wcmV2X25vZGUtPl9NX25leHQgPSBfX25leHRfbm9kZTsKLSAgICBfX25leHRfbm9kZS0+X01fcHJldiA9IF9fcHJldl9ub2RlOwotICAgIF9TVExQX1NURDo6X0Rlc3Ryb3koJl9fbi0+X01fZGF0YSk7Ci0gICAgdGhpcy0+X01fbm9kZS5kZWFsbG9jYXRlKF9fbiwgMSk7Ci0gICAgcmV0dXJuIGl0ZXJhdG9yKF9fbmV4dF9ub2RlKTsKLSAgfQotCi0gIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkgewotICAgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkKLSAgICAgIGVyYXNlKF9fZmlyc3QrKyk7Ci0gICAgcmV0dXJuIF9fbGFzdDsKLSAgfQotCi0jaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCi0gIHZvaWQgcmVzaXplKHNpemVfdHlwZSBfX25ld19zaXplLCBjb25zdF9yZWZlcmVuY2UgX194ID0gdmFsdWVfdHlwZSgpKTsKLSNlbHNlCi0gIHZvaWQgcmVzaXplKHNpemVfdHlwZSBfX25ld19zaXplLCBjb25zdF9yZWZlcmVuY2UgX194KTsKLSAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9fbmV3X3NpemUpCi0gIHsgdGhpcy0+cmVzaXplKF9fbmV3X3NpemUsIF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQodmFsdWVfdHlwZSkpOyB9Ci0jZW5kaWYgLyohX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCi0KLSAgdm9pZCBwb3BfZnJvbnQoKSB7IGVyYXNlKGJlZ2luKCkpOyB9Ci0gIHZvaWQgcG9wX2JhY2soKSB7Ci0gICAgaXRlcmF0b3IgX190bXAgPSBlbmQoKTsKLSAgICBlcmFzZSgtLV9fdG1wKTsKLSAgfQotCi1wdWJsaWM6Ci0gIC8vIGFzc2lnbigpLCBhIGdlbmVyYWxpemVkIGFzc2lnbm1lbnQgbWVtYmVyIGZ1bmN0aW9uLiAgVHdvCi0gIC8vIHZlcnNpb25zOiBvbmUgdGhhdCB0YWtlcyBhIGNvdW50LCBhbmQgb25lIHRoYXQgdGFrZXMgYSByYW5nZS4KLSAgLy8gVGhlIHJhbmdlIHZlcnNpb24gaXMgYSBtZW1iZXIgdGVtcGxhdGUsIHNvIHdlIGRpc3BhdGNoIG9uIHdoZXRoZXIKLSAgLy8gb3Igbm90IHRoZSB0eXBlIGlzIGFuIGludGVnZXIuCi0KLSAgdm9pZCBhc3NpZ24oc2l6ZV90eXBlIF9fbiwgY29uc3RfcmVmZXJlbmNlIF9fdmFsKSB7IF9NX2ZpbGxfYXNzaWduKF9fbiwgX192YWwpOyB9Ci0KLSAgdm9pZCBfTV9maWxsX2Fzc2lnbihzaXplX3R5cGUgX19uLCBjb25zdF9yZWZlcmVuY2UgX192YWwpOwotCi0jaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgotICB2b2lkIGFzc2lnbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpIHsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0ludGVncmFsPF9JbnB1dEl0ZXJhdG9yPjo6X1JldCBfSW50ZWdyYWw7Ci0gICAgX01fYXNzaWduX2Rpc3BhdGNoKF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOwotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2VyPgotICB2b2lkIF9NX2Fzc2lnbl9kaXNwYXRjaChfSW50ZWdlciBfX24sIF9JbnRlZ2VyIF9fdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX3RydWVfdHlwZSYgLypfSXNJbnRlZ3JhbCovKSB7Ci0gICAgX01fZmlsbF9hc3NpZ24oX19uLCBfX3ZhbCk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Ci0gIHZvaWQgX01fYXNzaWduX2Rpc3BhdGNoKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QyLCBfSW5wdXRJdGVyYXRvciBfX2xhc3QyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qX0lzSW50ZWdyYWwqLykgewotI2Vsc2UKLSAgdm9pZCBhc3NpZ24oY29uc3QgdmFsdWVfdHlwZSAqX19maXJzdDIsIGNvbnN0IHZhbHVlX3R5cGUgKl9fbGFzdDIpIHsKLSAgICBpdGVyYXRvciBfX2ZpcnN0MSA9IGJlZ2luKCk7Ci0gICAgaXRlcmF0b3IgX19sYXN0MSA9IGVuZCgpOwotICAgIGZvciAoIDsgX19maXJzdDEgIT0gX19sYXN0MSAmJiBfX2ZpcnN0MiAhPSBfX2xhc3QyOyArK19fZmlyc3QxLCArK19fZmlyc3QyKQotICAgICAgKl9fZmlyc3QxID0gKl9fZmlyc3QyOwotICAgIGlmIChfX2ZpcnN0MiA9PSBfX2xhc3QyKQotICAgICAgZXJhc2UoX19maXJzdDEsIF9fbGFzdDEpOwotICAgIGVsc2UKLSAgICAgIGluc2VydChfX2xhc3QxLCBfX2ZpcnN0MiwgX19sYXN0Mik7Ci0gIH0KLSAgdm9pZCBhc3NpZ24oY29uc3RfaXRlcmF0b3IgX19maXJzdDIsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdDIpIHsKLSNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCi0gICAgaXRlcmF0b3IgX19maXJzdDEgPSBiZWdpbigpOwotICAgIGl0ZXJhdG9yIF9fbGFzdDEgPSBlbmQoKTsKLSAgICBmb3IgKCA7IF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0MjsgKytfX2ZpcnN0MSwgKytfX2ZpcnN0MikKLSAgICAgICpfX2ZpcnN0MSA9ICpfX2ZpcnN0MjsKLSAgICBpZiAoX19maXJzdDIgPT0gX19sYXN0MikKLSAgICAgIGVyYXNlKF9fZmlyc3QxLCBfX2xhc3QxKTsKLSAgICBlbHNlCi0gICAgICBpbnNlcnQoX19sYXN0MSwgX19maXJzdDIsIF9fbGFzdDIpOwotICB9Ci0KLXB1YmxpYzoKLSAgdm9pZCBzcGxpY2UoaXRlcmF0b3IgX19wb3MsIF9TZWxmJiBfX3gpIHsKLSAgICBpZiAoIV9feC5lbXB0eSgpKSB7Ci0gICAgICBpZiAodGhpcy0+Z2V0X2FsbG9jYXRvcigpID09IF9feC5nZXRfYWxsb2NhdG9yKCkpIHsKLSAgICAgICAgX1NUTFBfUFJJViBfTGlzdF9nbG9iYWxfaW5zdDo6X1RyYW5zZmVyKF9fcG9zLl9NX25vZGUsIF9feC5iZWdpbigpLl9NX25vZGUsIF9feC5lbmQoKS5fTV9ub2RlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBpbnNlcnQoX19wb3MsIF9feC5iZWdpbigpLCBfX3guZW5kKCkpOwotICAgICAgICBfX3guY2xlYXIoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgdm9pZCBzcGxpY2UoaXRlcmF0b3IgX19wb3MsIF9TZWxmJiBfX3gsIGl0ZXJhdG9yIF9faSkgewotICAgIGl0ZXJhdG9yIF9faiA9IF9faTsKLSAgICArK19fajsKLSAgICBpZiAoX19wb3MgPT0gX19pIHx8IF9fcG9zID09IF9faikgcmV0dXJuOwotICAgIGlmICh0aGlzLT5nZXRfYWxsb2NhdG9yKCkgPT0gX194LmdldF9hbGxvY2F0b3IoKSkgewotICAgICAgX1NUTFBfUFJJViBfTGlzdF9nbG9iYWxfaW5zdDo6X1RyYW5zZmVyKF9fcG9zLl9NX25vZGUsIF9faS5fTV9ub2RlLCBfX2ouX01fbm9kZSk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgaW5zZXJ0KF9fcG9zLCAqX19pKTsKLSAgICAgIF9feC5lcmFzZShfX2kpOwotICAgIH0KLSAgfQotICB2b2lkIHNwbGljZShpdGVyYXRvciBfX3BvcywgX1NlbGYmIF9feCwgaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KSB7Ci0gICAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KSB7Ci0gICAgICBpZiAodGhpcy0+Z2V0X2FsbG9jYXRvcigpID09IF9feC5nZXRfYWxsb2NhdG9yKCkpIHsKLSAgICAgICAgX1NUTFBfUFJJViBfTGlzdF9nbG9iYWxfaW5zdDo6X1RyYW5zZmVyKF9fcG9zLl9NX25vZGUsIF9fZmlyc3QuX01fbm9kZSwgX19sYXN0Ll9NX25vZGUpOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIGluc2VydChfX3BvcywgX19maXJzdCwgX19sYXN0KTsKLSAgICAgICAgX194LmVyYXNlKF9fZmlyc3QsIF9fbGFzdCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgdm9pZCByZW1vdmUoY29uc3RfcmVmZXJlbmNlIF9fdmFsKSB7Ci0gICAgaXRlcmF0b3IgX19maXJzdCA9IGJlZ2luKCk7Ci0gICAgaXRlcmF0b3IgX19sYXN0ID0gZW5kKCk7Ci0gICAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0KSB7Ci0gICAgICBpdGVyYXRvciBfX25leHQgPSBfX2ZpcnN0OwotICAgICAgKytfX25leHQ7Ci0gICAgICBpZiAoX192YWwgPT0gKl9fZmlyc3QpIGVyYXNlKF9fZmlyc3QpOwotICAgICAgX19maXJzdCA9IF9fbmV4dDsKLSAgICB9Ci0gIH0KLQotICB2b2lkIHVuaXF1ZSgpCi0gIHsgX1NUTFBfUFJJViBfU191bmlxdWUoKnRoaXMsIGVxdWFsX3RvPHZhbHVlX3R5cGU+KCkpOyB9Ci0KLSAgdm9pZCBtZXJnZShfU2VsZiYgX194KQotICB7IF9TVExQX1BSSVYgX1NfbWVyZ2UoKnRoaXMsIF9feCwgbGVzczx2YWx1ZV90eXBlPigpKTsgfQotCi0gIHZvaWQgcmV2ZXJzZSgpIHsKLSAgICBfTm9kZV9iYXNlKiBfX3AgPSAmdGhpcy0+X01fbm9kZS5fTV9kYXRhOwotICAgIF9Ob2RlX2Jhc2UqIF9fdG1wID0gX19wOwotICAgIGRvIHsKLSAgICAgIF9TVExQX1NURDo6c3dhcChfX3RtcC0+X01fbmV4dCwgX190bXAtPl9NX3ByZXYpOwotICAgICAgX190bXAgPSBfX3RtcC0+X01fcHJldjsgICAgIC8vIE9sZCBuZXh0IG5vZGUgaXMgbm93IHByZXYuCi0gICAgfSB3aGlsZSAoX190bXAgIT0gX19wKTsKLSAgfQotCi0gIHZvaWQgc29ydCgpCi0gIHsgX1NUTFBfUFJJViBfU19zb3J0KCp0aGlzLCBsZXNzPHZhbHVlX3R5cGU+KCkpOyB9Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQotICB0ZW1wbGF0ZSA8Y2xhc3MgX1ByZWRpY2F0ZT4KLSAgdm9pZCByZW1vdmVfaWYoX1ByZWRpY2F0ZSBfX3ByZWQpCi0gIHsgX1NUTFBfUFJJViBfU19yZW1vdmVfaWYoKnRoaXMsIF9fcHJlZCk7IH0KLSAgdGVtcGxhdGUgPGNsYXNzIF9CaW5hcnlQcmVkaWNhdGU+Ci0gIHZvaWQgdW5pcXVlKF9CaW5hcnlQcmVkaWNhdGUgX19iaW5hcnlfcHJlZCkKLSAgeyBfU1RMUF9QUklWIF9TX3VuaXF1ZSgqdGhpcywgX19iaW5hcnlfcHJlZCk7IH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX1N0cmljdFdlYWtPcmRlcmluZz4KLSAgdm9pZCBtZXJnZShfU2VsZiYgX194LAotICAgICAgICAgICAgIF9TdHJpY3RXZWFrT3JkZXJpbmcgX19jb21wKSB7Ci0gICAgX1NUTFBfUFJJViBfU19tZXJnZSgqdGhpcywgX194LCBfX2NvbXApOwotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIF9TdHJpY3RXZWFrT3JkZXJpbmc+Ci0gIHZvaWQgc29ydChfU3RyaWN0V2Vha09yZGVyaW5nIF9fY29tcCkKLSAgeyBfU1RMUF9QUklWIF9TX3NvcnQoKnRoaXMsIF9fY29tcCk7IH0KLSNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCi19OwotCi0jaWYgZGVmaW5lZCAobGlzdCkKLSMgIHVuZGVmIGxpc3QKLV9TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQotI2VuZGlmCi0KLV9TVExQX0VORF9OQU1FU1BBQ0UKLQotI2lmICFkZWZpbmVkIChfU1RMUF9MSU5LX1RJTUVfSU5TVEFOVElBVElPTikKLSMgIGluY2x1ZGUgPHN0bC9fbGlzdC5jPgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUFRSX1NQRUNJQUxJWkFUSU9OUykKLSMgIGluY2x1ZGUgPHN0bC9wb2ludGVycy9fbGlzdC5oPgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9ERUJVRykKLSMgIGluY2x1ZGUgPHN0bC9kZWJ1Zy9fbGlzdC5oPgotI2VuZGlmCi0KLV9TVExQX0JFR0lOX05BTUVTUEFDRQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Ci1fU1RMUF9JTkxJTkVfTE9PUCBib29sICBfU1RMUF9DQUxMCi1vcGVyYXRvcj09KGNvbnN0IGxpc3Q8X1RwLF9BbGxvYz4mIF9feCwgY29uc3QgbGlzdDxfVHAsX0FsbG9jPiYgX195KSB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgbGlzdDxfVHAsX0FsbG9jPjo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7Ci0gIGNvbnN0X2l0ZXJhdG9yIF9fZW5kMSA9IF9feC5lbmQoKTsKLSAgY29uc3RfaXRlcmF0b3IgX19lbmQyID0gX195LmVuZCgpOwotCi0gIGNvbnN0X2l0ZXJhdG9yIF9faTEgPSBfX3guYmVnaW4oKTsKLSAgY29uc3RfaXRlcmF0b3IgX19pMiA9IF9feS5iZWdpbigpOwotICB3aGlsZSAoX19pMSAhPSBfX2VuZDEgJiYgX19pMiAhPSBfX2VuZDIgJiYgKl9faTEgPT0gKl9faTIpIHsKLSAgICArK19faTE7Ci0gICAgKytfX2kyOwotICB9Ci0gIHJldHVybiBfX2kxID09IF9fZW5kMSAmJiBfX2kyID09IF9fZW5kMjsKLX0KLQotI2RlZmluZSBfU1RMUF9FUVVBTF9PUEVSQVRPUl9TUEVDSUFMSVpFRAotI2RlZmluZSBfU1RMUF9URU1QTEFURV9IRUFERVIgICAgdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgotI2RlZmluZSBfU1RMUF9URU1QTEFURV9DT05UQUlORVIgbGlzdDxfVHAsIF9BbGxvYz4KLSNpbmNsdWRlIDxzdGwvX3JlbG9wc19jb250Lmg+Ci0jdW5kZWYgX1NUTFBfVEVNUExBVEVfQ09OVEFJTkVSCi0jdW5kZWYgX1NUTFBfVEVNUExBVEVfSEVBREVSCi0jdW5kZWYgX1NUTFBfRVFVQUxfT1BFUkFUT1JfU1BFQ0lBTElaRUQKLQotI2lmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Ci1zdHJ1Y3QgX19tb3ZlX3RyYWl0czxsaXN0PF9UcCwgX0FsbG9jPiA+IHsKLSAgdHlwZWRlZiBfX3N0bHBfbW92YWJsZSBpbXBsZW1lbnRlZDsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfX21vdmVfdHJhaXRzPF9BbGxvYz46OmNvbXBsZXRlIGNvbXBsZXRlOwotfTsKLSNlbmRpZiAvKiBfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OICovCi0KLV9TVExQX0VORF9OQU1FU1BBQ0UKLQotI2VuZGlmIC8qIF9TVExQX0lOVEVSTkFMX0xJU1RfSU1QTF9IICovCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX2xvY2FsZS5oIGIvc3RsL19sb2NhbGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU0ZmE0My4uMDAwMDAwMAotLS0gYS9zdGwvX2xvY2FsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzI1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogQm9yaXMgRm9taXRjaGV2Ci0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICovCi0vLyBXQVJOSU5HOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBDKysKLS8vIHN0YW5kYXJkIGxpYnJhcnkgaGVhZGVycy4gIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIHRoaXMgaGVhZGVyCi0vLyBmaWxlIGRpcmVjdGx5LgotCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfTE9DQUxFX0gKLSNkZWZpbmUgX1NUTFBfSU5URVJOQUxfTE9DQUxFX0gKLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DU1RETElCCi0jICBpbmNsdWRlIDxzdGwvX2NzdGRsaWIuaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NXQ0hBUgotIyAgaW5jbHVkZSA8c3RsL19jd2NoYXIuaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX1RIUkVBRFNfSAotIyAgaW5jbHVkZSA8c3RsL190aHJlYWRzLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBfU1RMUF9TVFJJTkdfRldEX0gKLSMgIGluY2x1ZGUgPHN0bC9fc3RyaW5nX2Z3ZC5oPgotI2VuZGlmCi0KLV9TVExQX0JFR0lOX05BTUVTUEFDRQotCi1jbGFzcyBfTG9jYWxlX2ltcGw7ICAgICAgICAvLyBGb3J3YXJkIGRlY2xhcmF0aW9uIG9mIG9wYXF1ZSB0eXBlLgotY2xhc3MgaW9zX2Jhc2U7Ci1jbGFzcyBsb2NhbGU7Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KLWJvb2wgX19sb2NhbGVfZG9fb3BlcmF0b3JfY2FsbCAoY29uc3QgbG9jYWxlJiBfX2xvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX194LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX3kpOwotCi1fU1RMUF9ERUNMU1BFQyBfTG9jYWxlX2ltcGwgKiBfU1RMUF9DQUxMIF9nZXRfTG9jYWxlX2ltcGwoIF9Mb2NhbGVfaW1wbCAqbG9jaW1wbCApOwotX1NUTFBfREVDTFNQRUMgX0xvY2FsZV9pbXBsICogX1NUTFBfQ0FMTCBfY29weV9OYW1lbGVzc19Mb2NhbGVfaW1wbCggX0xvY2FsZV9pbXBsICpsb2NpbXBsICk7Ci0KLXRlbXBsYXRlIDxjbGFzcyBfRmFjZXQ+Ci1ib29sIF9IYXNGYWNldChjb25zdCBsb2NhbGUmIF9fbG9jLCBjb25zdCBfRmFjZXQqIF9fZmFjZXQpIF9TVExQX05PVEhST1c7Ci0KLXRlbXBsYXRlIDxjbGFzcyBfRmFjZXQ+Ci1fRmFjZXQqIF9Vc2VGYWNldChjb25zdCBsb2NhbGUmIF9fbG9jLCBjb25zdCBfRmFjZXQqIF9fZmFjZXQpOwotCi0jaWYgZGVmaW5lZCAoX1NUTFBfVVNFX01TVkM2X01FTV9UX0JVR19XT1JLQVJPVU5EKQotIyAgZGVmaW5lIGxvY2FsZSBfU1RMUF9OT19NRU1fVF9OQU1FKGxvYykKLSNlbmRpZgotCi1jbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBsb2NhbGUgewotcHVibGljOgotICAvLyB0eXBlczoKLSAgY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgZmFjZXQgOiBwcm90ZWN0ZWQgX1JlZmNvdW50X0Jhc2UgewotICBwcm90ZWN0ZWQ6Ci0gICAgLyogSGVyZSB3ZSBmaWx0ZXIgX19pbml0X2NvdW50IHVzZXIgdmFsdWUgdG8gMCBvciAxIGJlY2F1c2UgX19pbml0X2NvdW50IGlzIGEKLSAgICAgKiBzaXplX3QgaW5zdGFuY2UgYW5kIF9SZWZjb3VudF9CYXNlIHVzZSBfX3N0bF9hdG9taWNfdCBpbnN0YW5jZXMgdGhhdCBtaWdodAotICAgICAqIGhhdmUgbG93ZXIgc2l6ZW9mIGFuZCBnZW5lcmF0ZSByb2xsIGlzc3Vlcy4gMSBpcyBlbm91Z2ggdG8ga2VlcCB0aGUgZmFjZXQKLSAgICAgKiBhbGl2ZSB3aGVuIHJlcXVpcmVkLgotICAgICAqLwotICAgIGV4cGxpY2l0IGZhY2V0KHNpemVfdCBfX2luaXRfY291bnQgPSAwKSA6IF9SZWZjb3VudF9CYXNlKCBfX2luaXRfY291bnQgPT0gMCA/IDAgOiAxICkge30KLSAgICB2aXJ0dWFsIH5mYWNldCgpOwotICAgIGZyaWVuZCBjbGFzcyBsb2NhbGU7Ci0gICAgZnJpZW5kIGNsYXNzIF9Mb2NhbGVfaW1wbDsKLSAgICBmcmllbmQgZmFjZXQgKiBfU1RMUF9DQUxMIF9nZXRfZmFjZXQoIGZhY2V0ICogKTsKLSAgICBmcmllbmQgdm9pZCBfU1RMUF9DQUxMIF9yZWxlYXNlX2ZhY2V0KCBmYWNldCAqJiApOwotCi0gIHByaXZhdGU6ICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW52YWxpZGF0ZSBhc3NpZ25tZW50IGFuZCBjb3B5aW5nLgotICAgIGZhY2V0KGNvbnN0IGZhY2V0JiApIC8qIDogX1JlZmNvdW50X0Jhc2UoMSkge30gKi87Ci0gICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgZmFjZXQmKTsKLSAgfTsKLQotI2lmIGRlZmluZWQgKF9fTVZTX18pIHx8IGRlZmluZWQgKF9fT1M0MDBfXykKLSAgc3RydWN0Ci0jZWxzZQotICBjbGFzcwotI2VuZGlmCi0gIF9TVExQX0NMQVNTX0RFQ0xTUEVDIGlkIHsKLSAgICBmcmllbmQgY2xhc3MgbG9jYWxlOwotICAgIGZyaWVuZCBjbGFzcyBfTG9jYWxlX2ltcGw7Ci0gIHB1YmxpYzoKLSAgICBzaXplX3QgX01faW5kZXg7Ci0gICAgc3RhdGljIHNpemVfdCBfU19tYXg7Ci0gIH07Ci0KLSAgdHlwZWRlZiBpbnQgY2F0ZWdvcnk7Ci0jaWYgZGVmaW5lZCAoX1NUTFBfU1RBVElDX0NPTlNUX0lOSVRfQlVHKQotICBlbnVtIF9DYXRlZ29yeSB7Ci0jZWxzZQotICBzdGF0aWMgY29uc3QgY2F0ZWdvcnkKLSNlbmRpZgotICAgIG5vbmUgICAgICA9IDB4MDAwLAotICAgIGNvbGxhdGUgICA9IDB4MDEwLAotICAgIGN0eXBlICAgICA9IDB4MDIwLAotICAgIG1vbmV0YXJ5ICA9IDB4MDQwLAotICAgIG51bWVyaWMgICA9IDB4MTAwLAotICAgIHRpbWUgICAgICA9IDB4MjAwLAotICAgIG1lc3NhZ2VzICA9IDB4NDAwLAotICAgIGFsbCAgICAgICA9IGNvbGxhdGUgfCBjdHlwZSB8IG1vbmV0YXJ5IHwgbnVtZXJpYyB8IHRpbWUgfCBtZXNzYWdlcwotI2lmIGRlZmluZWQgKF9TVExQX1NUQVRJQ19DT05TVF9JTklUX0JVRykKLSAgfQotI2VuZGlmCi0gIDsKLQotICAvLyBjb25zdHJ1Y3QvY29weS9kZXN0cm95OgotICBsb2NhbGUoKSBfU1RMUF9OT1RIUk9XOwotICBsb2NhbGUoY29uc3QgbG9jYWxlJikgX1NUTFBfTk9USFJPVzsKLSAgZXhwbGljaXQgbG9jYWxlKGNvbnN0IGNoYXIgKik7Ci0gIGxvY2FsZShjb25zdCBsb2NhbGUmLCBjb25zdCBjaGFyKiwgY2F0ZWdvcnkpOwotCi0jaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykgJiYgIWRlZmluZWQgKF9TVExQX1VTRV9NU1ZDNl9NRU1fVF9CVUdfV09SS0FST1VORCkKLSAgdGVtcGxhdGUgPGNsYXNzIF9GYWNldD4KLSAgbG9jYWxlKGNvbnN0IGxvY2FsZSYgX19sb2MsIF9GYWNldCogX19mKSB7Ci0gICAgaWYgKCBfX2YgIT0gMCApIHsKLSAgICAgIHRoaXMtPl9NX2ltcGwgPSBfZ2V0X0xvY2FsZV9pbXBsKCBfY29weV9OYW1lbGVzc19Mb2NhbGVfaW1wbCggX19sb2MuX01faW1wbCApICk7Ci0gICAgICB0aGlzLT5fTV9pbnNlcnQoX19mLCBfRmFjZXQ6OmlkKTsKLSAgICB9IGVsc2UgewotICAgICAgdGhpcy0+X01faW1wbCA9IF9nZXRfTG9jYWxlX2ltcGwoIF9fbG9jLl9NX2ltcGwgKTsKLSAgICB9Ci0gIH0KLSNlbmRpZiAvLyBfU1RMUF9NRU1CRVJfVEVNUExBVEVTCi0KLXByb3RlY3RlZDoKLSAgLy8gdGhvc2UgYXJlIGZvciBpbnRlcm5hbCB1c2UKLSAgbG9jYWxlKF9Mb2NhbGVfaW1wbCopOwotCi1wdWJsaWM6Ci0KLSAgbG9jYWxlKGNvbnN0IGxvY2FsZSYsIGNvbnN0IGxvY2FsZSYsIGNhdGVnb3J5KTsKLSAgY29uc3QgbG9jYWxlJiBvcGVyYXRvcj0oY29uc3QgbG9jYWxlJikgX1NUTFBfTk9USFJPVzsKLQotI2lmIGRlZmluZWQgKF9TVExQX1VTRV9NU1ZDNl9NRU1fVF9CVUdfV09SS0FST1VORCkKLSAgdmlydHVhbAotI2VuZGlmCi0gICB+bG9jYWxlKCkgX1NUTFBfTk9USFJPVzsKLQotI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpICYmICFkZWZpbmVkIChfU1RMUF9OT19FWFBMSUNJVF9GVU5DVElPTl9UTVBMX0FSR1MpICYmIFwKLSAgICFkZWZpbmVkKF9TVExQX1VTRV9NU1ZDNl9NRU1fVF9CVUdfV09SS0FST1VORCkKLSAgdGVtcGxhdGUgPGNsYXNzIF9GYWNldD4KLSAgbG9jYWxlIGNvbWJpbmUoY29uc3QgbG9jYWxlJiBfX2xvYykgY29uc3QgewotICAgIF9GYWNldCAqX19mYWNldCA9IDA7Ci0gICAgaWYgKCFfSGFzRmFjZXQoX19sb2MsIF9fZmFjZXQpKQotICAgICAgX01fdGhyb3dfcnVudGltZV9lcnJvcigpOwotCi0gICAgcmV0dXJuIGxvY2FsZSgqdGhpcywgX1VzZUZhY2V0KF9fbG9jLCBfX2ZhY2V0KSk7Ci0gIH0KLSNlbmRpZiAvLyBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICYmICFfU1RMUF9OT19FWFBMSUNJVF9GVU5DVElPTl9UTVBMX0FSR1MKLQotICAvLyBsb2NhbGUgb3BlcmF0aW9uczoKLSAgc3RyaW5nIG5hbWUoKSBjb25zdDsKLQotICBib29sIG9wZXJhdG9yPT0oY29uc3QgbG9jYWxlJikgY29uc3Q7Ci0gIGJvb2wgb3BlcmF0b3IhPShjb25zdCBsb2NhbGUmKSBjb25zdDsKLQotI2lmICFkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKSB8fCBkZWZpbmVkIChfU1RMUF9JTkxJTkVfTUVNQkVSX1RFTVBMQVRFUykgfHwgKGRlZmluZWQoX19NV0VSS1NfXykgJiYgX19NV0VSS1NfXyA8PSAweDIzMDEpCi0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBzdHJpbmcmIF9feCwgY29uc3Qgc3RyaW5nJiBfX3kpIGNvbnN0OwotIyAgaWZuZGVmIF9TVExQX05PX1dDSEFSX1QKLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IHdzdHJpbmcmIF9feCwgY29uc3Qgd3N0cmluZyYgX195KSBjb25zdDsKLSMgIGVuZGlmCi0jZWxpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX01TVkM2X01FTV9UX0JVR19XT1JLQVJPVU5EKQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+Ci0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX3gsCi0gICAgICAgICAgICAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX3kpIGNvbnN0Ci0gIHsgcmV0dXJuIF9fbG9jYWxlX2RvX29wZXJhdG9yX2NhbGwoKnRoaXMsIF9feCwgX195KTsgfQotI2VuZGlmCi0KLSAgLy8gZ2xvYmFsIGxvY2FsZSBvYmplY3RzOgotICBzdGF0aWMgbG9jYWxlIF9TVExQX0NBTEwgZ2xvYmFsKGNvbnN0IGxvY2FsZSYpOwotICBzdGF0aWMgY29uc3QgbG9jYWxlJiBfU1RMUF9DQUxMIGNsYXNzaWMoKTsKLQotLy9wcm90ZWN0ZWQ6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIGxvY2FsZSBnbG9iYWxzLgotICBmYWNldCogX01fZ2V0X2ZhY2V0KGNvbnN0IGlkJikgY29uc3Q7Ci0gIC8vIHNhbWUsIGJ1dCB0aHJvd3MKLSAgZmFjZXQqIF9NX3VzZV9mYWNldChjb25zdCBpZCYpIGNvbnN0OwotICBzdGF0aWMgdm9pZCBfU1RMUF9GVU5DVElPTl9USFJPV1MgX1NUTFBfQ0FMTCBfTV90aHJvd19ydW50aW1lX2Vycm9yKGNvbnN0IGNoYXIqID0gMCk7Ci0KLXByb3RlY3RlZDogICAgICAgICAgICAgICAgICAgICAgICAvLyBNb3JlIGhlbHBlciBmdW5jdGlvbnMuCi0gIHZvaWQgX01faW5zZXJ0KGZhY2V0KiBfX2YsIGlkJiBfX2lkKTsKLQotICAvLyBmcmllbmRzOgotICBmcmllbmQgY2xhc3MgX0xvY2FsZV9pbXBsOwotICBmcmllbmQgY2xhc3MgaW9zX2Jhc2U7Ci0KLXByb3RlY3RlZDogICAgICAgICAgICAgICAgICAgICAgICAvLyBEYXRhIG1lbWJlcnMKLSAgX0xvY2FsZV9pbXBsKiBfTV9pbXBsOwotICBfTG9jYWxlX2ltcGwqIF9NX2dldF9pbXBsKCkgY29uc3QgeyByZXR1cm4gX01faW1wbDsgfQotfTsKLQotI2lmIGRlZmluZWQgKF9TVExQX1VTRV9NU1ZDNl9NRU1fVF9CVUdfV09SS0FST1VORCkKLSMgIHVuZGVmIGxvY2FsZQotIyAgZGVmaW5lIF9Mb2NhbGUgX1NUTFBfTk9fTUVNX1RfTkFNRShsb2MpCi0KLWNsYXNzIGxvY2FsZSA6IHB1YmxpYyBfTG9jYWxlIHsKLXB1YmxpYzoKLQotICAvLyBjb25zdHJ1Y3QvY29weS9kZXN0cm95OgotICBsb2NhbGUoKSBfU1RMUF9OT1RIUk9XIHt9Ci0gIGxvY2FsZShjb25zdCBsb2NhbGUmIF9fbG9jKSBfU1RMUF9OT1RIUk9XIDogX0xvY2FsZShfX2xvYykge30KLSAgZXhwbGljaXQgbG9jYWxlKGNvbnN0IGNoYXIgKl9fc3RyKSA6IF9Mb2NhbGUoX19zdHIpIHt9Ci0gIGxvY2FsZShjb25zdCBsb2NhbGUmIF9fbG9jLCBjb25zdCBjaGFyKiBfX3N0ciwgY2F0ZWdvcnkgX19jYXQpCi0gICAgOiBfTG9jYWxlKF9fbG9jLCBfX3N0ciwgX19jYXQpIHt9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIF9GYWNldD4KLSAgbG9jYWxlKGNvbnN0IGxvY2FsZSYgX19sb2MsIF9GYWNldCogX19mKSB7Ci0gICAgaWYgKCBfX2YgIT0gMCApIHsKLSAgICAgIHRoaXMtPl9NX2ltcGwgPSBfZ2V0X0xvY2FsZV9pbXBsKCBfY29weV9OYW1lbGVzc19Mb2NhbGVfaW1wbCggX19sb2MuX01faW1wbCApICk7Ci0gICAgICB0aGlzLT5fTV9pbnNlcnQoX19mLCBfRmFjZXQ6OmlkKTsKLSAgICB9IGVsc2UgewotICAgICAgdGhpcy0+X01faW1wbCA9IF9nZXRfTG9jYWxlX2ltcGwoIF9fbG9jLl9NX2ltcGwgKTsKLSAgICB9Ci0gIH0KLQotcHJpdmF0ZToKLSAgLy8gdGhvc2UgYXJlIGZvciBpbnRlcm5hbCB1c2UKLSAgbG9jYWxlKF9Mb2NhbGVfaW1wbCogX19pbXBsKSA6IF9Mb2NhbGUoX19pbXBsKSB7fQotICBsb2NhbGUoY29uc3QgX0xvY2FsZSYgX19sb2MpIDogX0xvY2FsZShfX2xvYykge30KLQotcHVibGljOgotCi0gIGxvY2FsZShjb25zdCBsb2NhbGUmIF9fbG9jMSwgY29uc3QgbG9jYWxlJiBfX2xvYzIsIGNhdGVnb3J5IF9fY2F0KQotICAgIDogX0xvY2FsZShfX2xvYzEsIF9fbG9jMiwgX19jYXQpIHt9Ci0KLSAgY29uc3QgbG9jYWxlJiBvcGVyYXRvcj0oY29uc3QgbG9jYWxlJiBfX2xvYykgX1NUTFBfTk9USFJPVyB7Ci0gICAgX0xvY2FsZTo6b3BlcmF0b3I9KF9fbG9jKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZhY2V0PgotICBsb2NhbGUgY29tYmluZShjb25zdCBsb2NhbGUmIF9fbG9jKSBjb25zdCB7Ci0gICAgX0ZhY2V0ICpfX2ZhY2V0ID0gMDsKLSAgICBpZiAoIV9IYXNGYWNldChfX2xvYywgX19mYWNldCkpCi0gICAgICBfTV90aHJvd19ydW50aW1lX2Vycm9yKCk7Ci0KLSAgICByZXR1cm4gbG9jYWxlKCp0aGlzLCBfVXNlRmFjZXQoX19sb2MsIF9fZmFjZXQpKTsKLSAgfQotCi0gIC8vIGxvY2FsZSBvcGVyYXRpb25zOgotICBib29sIG9wZXJhdG9yPT0oY29uc3QgbG9jYWxlJiBfX2xvYykgY29uc3QgeyByZXR1cm4gX0xvY2FsZTo6b3BlcmF0b3I9PShfX2xvYyk7IH0KLSAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGxvY2FsZSYgX19sb2MpIGNvbnN0IHsgcmV0dXJuIF9Mb2NhbGU6Om9wZXJhdG9yIT0oX19sb2MpOyB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgotICBib29sIG9wZXJhdG9yKCkoY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX194LAotICAgICAgICAgICAgICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX195KSBjb25zdAotICB7IHJldHVybiBfX2xvY2FsZV9kb19vcGVyYXRvcl9jYWxsKCp0aGlzLCBfX3gsIF9feSk7IH0KLQotICAvLyBnbG9iYWwgbG9jYWxlIG9iamVjdHM6Ci0gIHN0YXRpYyBsb2NhbGUgX1NUTFBfQ0FMTCBnbG9iYWwoY29uc3QgbG9jYWxlJiBfX2xvYykgewotICAgIHJldHVybiBfTG9jYWxlOjpnbG9iYWwoX19sb2MpOwotICB9Ci0gIHN0YXRpYyBjb25zdCBsb2NhbGUmIF9TVExQX0NBTEwgY2xhc3NpYygpIHsKLSAgICByZXR1cm4gX19TVEFUSUNfQ0FTVChjb25zdCBsb2NhbGUmLCBfTG9jYWxlOjpjbGFzc2ljKCkpOwotICB9Ci0KLSAgLy8gZnJpZW5kczoKLSAgZnJpZW5kIGNsYXNzIF9Mb2NhbGVfaW1wbDsKLSAgZnJpZW5kIGNsYXNzIGlvc19iYXNlOwotfTsKLQotI2VuZGlmIC8qIF9TVExQX1VTRV9NU1ZDNl9NRU1fVF9CVUdfV09SS0FST1VORCAqLwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGxvY2FsZSBnbG9iYWxzCi0KLSNpZmRlZiBfU1RMUF9OT19FWFBMSUNJVF9GVU5DVElPTl9UTVBMX0FSR1MKLXRlbXBsYXRlIDxjbGFzcyBfRmFjZXQ+Ci1pbmxpbmUgY29uc3QgX0ZhY2V0JgotX1VzZV9mYWNldDxfRmFjZXQ+OjpvcGVyYXRvciAqKCkgY29uc3QKLSNlbHNlCi10ZW1wbGF0ZSA8Y2xhc3MgX0ZhY2V0PiBpbmxpbmUgY29uc3QgX0ZhY2V0JiB1c2VfZmFjZXQoY29uc3QgbG9jYWxlJiBfX2xvYykKLSNlbmRpZgotewotICBfRmFjZXQgKl9fZmFjZXQgPSAwOwotICByZXR1cm4gKl9Vc2VGYWNldChfX2xvYywgX19mYWNldCk7Ci19Ci0KLQotI2lmZGVmIF9TVExQX05PX0VYUExJQ0lUX0ZVTkNUSU9OX1RNUExfQVJHUwotdGVtcGxhdGUgPGNsYXNzIF9GYWNldD4KLXN0cnVjdCBoYXNfZmFjZXQgewotICBjb25zdCBsb2NhbGUmIF9fbG9jOwotICBoYXNfZmFjZXQoY29uc3QgbG9jYWxlJiBfX3BfbG9jKSA6IF9fbG9jKF9fcF9sb2MpIHt9Ci0gIG9wZXJhdG9yIGJvb2woKSBjb25zdCBfU1RMUF9OT1RIUk9XCi0jZWxzZQotdGVtcGxhdGUgPGNsYXNzIF9GYWNldD4gaW5saW5lIGJvb2wgaGFzX2ZhY2V0KGNvbnN0IGxvY2FsZSYgX19sb2MpIF9TVExQX05PVEhST1cKLSNlbmRpZgotewotICBfRmFjZXQgKl9fZmFjZXQgPSAwOwotICByZXR1cm4gX0hhc0ZhY2V0KF9fbG9jLCBfX2ZhY2V0KTsKLX0KLQotI2lmZGVmIF9TVExQX05PX0VYUExJQ0lUX0ZVTkNUSU9OX1RNUExfQVJHUwotfTsgLy8gY2xvc2UgY2xhc3MgZGVmaW5pdGlvbgotI2VuZGlmCi0KLXRlbXBsYXRlIDxjbGFzcyBfRmFjZXQ+Ci1ib29sIF9IYXNGYWNldChjb25zdCBsb2NhbGUmIF9fbG9jLCBjb25zdCBfRmFjZXQqIF9fZmFjZXQpIF9TVExQX05PVEhST1cKLXsgcmV0dXJuIChfX2xvYy5fTV9nZXRfZmFjZXQoX0ZhY2V0OjppZCkgIT0gMCk7IH0KLQotdGVtcGxhdGUgPGNsYXNzIF9GYWNldD4KLV9GYWNldCogX1VzZUZhY2V0KGNvbnN0IGxvY2FsZSYgX19sb2MsIGNvbnN0IF9GYWNldCogX19mYWNldCkKLXsgcmV0dXJuIF9fU1RBVElDX0NBU1QoX0ZhY2V0KiwgX19sb2MuX01fdXNlX2ZhY2V0KF9GYWNldDo6aWQpKTsgfQotCi1fU1RMUF9FTkRfTkFNRVNQQUNFCi0KLSNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9MT0NBTEVfSCAqLwotCi0vLyBMb2NhbCBWYXJpYWJsZXM6Ci0vLyBtb2RlOkMrKwotLy8gRW5kOgotCmRpZmYgLS1naXQgYS9zdGwvX21hcC5oIGIvc3RsL19tYXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVkMmUzZi4uMDAwMDAwMAotLS0gYS9zdGwvX21hcC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDI1ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk0Ci0gKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3Ci0gKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTcKLSAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0vKiBOT1RFOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBTVEwgaGVhZGVycy4KLSAqICAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuCi0gKi8KLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9NQVBfSAotI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9NQVBfSAotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX1RSRUVfSAotIyAgaW5jbHVkZSA8c3RsL190cmVlLmg+Ci0jZW5kaWYKLQotX1NUTFBfQkVHSU5fTkFNRVNQQUNFCi0KLS8vU3BlY2lmaWMgaXRlcmF0b3IgdHJhaXRzIGNyZWF0aW9uCi1fU1RMUF9DUkVBVEVfSVRFUkFUT1JfVFJBSVRTKE1hcFRyYWl0c1QsIHRyYWl0cykKLQotdGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgX1NUTFBfREZMX1RNUExfUEFSQU0oX0NvbXBhcmUsIGxlc3M8X0tleT4gKSwKLSAgICAgICAgICBfU1RMUF9ERUZBVUxUX1BBSVJfQUxMT0NBVE9SX1NFTEVDVChjb25zdCBfS2V5LCBfVHApID4KLWNsYXNzIG1hcAotI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QQVJUSUFMX1NQRUNfV09SS0FST1VORCkKLSAgICAgICAgICA6IHB1YmxpYyBfX3N0bHBvcnRfY2xhc3M8bWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvYz4gPgotI2VuZGlmCi17Ci0gIHR5cGVkZWYgbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvYz4gX1NlbGY7Ci1wdWJsaWM6Ci0KLS8vIHR5cGVkZWZzOgotCi0gIHR5cGVkZWYgX0tleSAgICAgICAgICAgICAgICAgIGtleV90eXBlOwotICB0eXBlZGVmIF9UcCAgICAgICAgICAgICAgICAgICBkYXRhX3R5cGU7Ci0gIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAgICAgIG1hcHBlZF90eXBlOwotICB0eXBlZGVmIHBhaXI8Y29uc3QgX0tleSwgX1RwPiB2YWx1ZV90eXBlOwotICB0eXBlZGVmIF9Db21wYXJlICAgICAgICAgICAgICBrZXlfY29tcGFyZTsKLQotICBjbGFzcyB2YWx1ZV9jb21wYXJlCi0gICAgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPHZhbHVlX3R5cGUsIHZhbHVlX3R5cGUsIGJvb2w+IHsKLSAgZnJpZW5kIGNsYXNzIG1hcDxfS2V5LF9UcCxfQ29tcGFyZSxfQWxsb2M+OwotICBwcm90ZWN0ZWQgOgotICAgIC8vYyBpcyBhIFN0YW5kYXJkIG5hbWUgKDIzLjMuMSksIGRvIG5vIG1ha2UgaXQgU1RMcG9ydCBuYW1pbmcgY29udmVudGlvbiBjb21wbGlhbnQuCi0gICAgX0NvbXBhcmUgY29tcDsKLSAgICB2YWx1ZV9jb21wYXJlKF9Db21wYXJlIF9fYykgOiBjb21wKF9fYykge30KLSAgcHVibGljOgotICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCB2YWx1ZV90eXBlJiBfX3gsIGNvbnN0IHZhbHVlX3R5cGUmIF9feSkgY29uc3QKLSAgICB7IHJldHVybiBjb21wKF9feC5maXJzdCwgX195LmZpcnN0KTsgfQotICB9OwotCi1wcm90ZWN0ZWQ6Ci0gIHR5cGVkZWYgX1NUTFBfUFJJViBfTWFwVHJhaXRzVDx2YWx1ZV90eXBlPiBfTWFwVHJhaXRzOwotCi1wdWJsaWM6Ci0gIC8vRm9sbG93aW5nIHR5cGVkZWYgaGF2ZSB0byBiZSBwdWJsaWMgZm9yIF9fbW92ZV90cmFpdHMgc3BlY2lhbGl6YXRpb24uCi0gIHR5cGVkZWYgX1NUTFBfUFJJViBfUmJfdHJlZTxrZXlfdHlwZSwga2V5X2NvbXBhcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlLCBfU1RMUF9TRUxFQ1QxU1QodmFsdWVfdHlwZSwgX0tleSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTWFwVHJhaXRzLCBfQWxsb2M+IF9SZXBfdHlwZTsKLQotICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6cG9pbnRlciBwb2ludGVyOwotICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6Y29uc3RfcG9pbnRlciBjb25zdF9wb2ludGVyOwotICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6cmVmZXJlbmNlIHJlZmVyZW5jZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9yZWZlcmVuY2U7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjppdGVyYXRvciBpdGVyYXRvcjsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOwotICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6cmV2ZXJzZV9pdGVyYXRvciByZXZlcnNlX2l0ZXJhdG9yOwotICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOwotICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6c2l6ZV90eXBlIHNpemVfdHlwZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKLQotcHJpdmF0ZToKLSAgX1JlcF90eXBlIF9NX3Q7ICAvLyByZWQtYmxhY2sgdHJlZSByZXByZXNlbnRpbmcgbWFwCi0gIF9TVExQX0tFWV9UWVBFX0ZPUl9DT05UX0VYVChrZXlfdHlwZSkKLQotcHVibGljOgotICAvLyBhbGxvY2F0aW9uL2RlYWxsb2NhdGlvbgotICBtYXAoKSA6IF9NX3QoX0NvbXBhcmUoKSwgYWxsb2NhdG9yX3R5cGUoKSkge30KLSNpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKLSAgZXhwbGljaXQgbWFwKGNvbnN0IF9Db21wYXJlJiBfX2NvbXAsCi0gICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKLSNlbHNlCi0gIGV4cGxpY2l0IG1hcChjb25zdCBfQ29tcGFyZSYgX19jb21wKQotICAgIDogX01fdChfX2NvbXAsIGFsbG9jYXRvcl90eXBlKCkpIHt9Ci0gIGV4cGxpY2l0IG1hcChjb25zdCBfQ29tcGFyZSYgX19jb21wLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQotI2VuZGlmCi0gICAgOiBfTV90KF9fY29tcCwgX19hKSB7fQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgotICBtYXAoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQotICAgIDogX01fdChfQ29tcGFyZSgpLCBhbGxvY2F0b3JfdHlwZSgpKQotICAgIHsgX01fdC5pbnNlcnRfdW5pcXVlKF9fZmlyc3QsIF9fbGFzdCk7IH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Ci0gIG1hcChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsIGNvbnN0IF9Db21wYXJlJiBfX2NvbXAsCi0gICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hIF9TVExQX0FMTE9DQVRPUl9UWVBFX0RGTCkKLSAgICA6IF9NX3QoX19jb21wLCBfX2EpIHsgX01fdC5pbnNlcnRfdW5pcXVlKF9fZmlyc3QsIF9fbGFzdCk7IH0KLQotIyAgaWYgZGVmaW5lZCAoX1NUTFBfTkVFRFNfRVhUUkFfVEVNUExBVEVfQ09OU1RSVUNUT1JTKQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Ci0gIG1hcChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsIGNvbnN0IF9Db21wYXJlJiBfX2NvbXApCi0gICAgOiBfTV90KF9fY29tcCwgYWxsb2NhdG9yX3R5cGUoKSkgeyBfTV90Lmluc2VydF91bmlxdWUoX19maXJzdCwgX19sYXN0KTsgfQotIyAgZW5kaWYKLQotI2Vsc2UKLSAgbWFwKGNvbnN0IHZhbHVlX3R5cGUqIF9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbGFzdCkKLSAgICA6IF9NX3QoX0NvbXBhcmUoKSwgYWxsb2NhdG9yX3R5cGUoKSkKLSAgICB7IF9NX3QuaW5zZXJ0X3VuaXF1ZShfX2ZpcnN0LCBfX2xhc3QpOyB9Ci0KLSAgbWFwKGNvbnN0IHZhbHVlX3R5cGUqIF9fZmlyc3QsCi0gICAgICBjb25zdCB2YWx1ZV90eXBlKiBfX2xhc3QsIGNvbnN0IF9Db21wYXJlJiBfX2NvbXAsCi0gICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKLSAgICA6IF9NX3QoX19jb21wLCBfX2EpIHsgX01fdC5pbnNlcnRfdW5pcXVlKF9fZmlyc3QsIF9fbGFzdCk7IH0KLQotICBtYXAoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KQotICAgIDogX01fdChfQ29tcGFyZSgpLCBhbGxvY2F0b3JfdHlwZSgpKQotICAgIHsgX01fdC5pbnNlcnRfdW5pcXVlKF9fZmlyc3QsIF9fbGFzdCk7IH0KLQotICBtYXAoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0LCBjb25zdCBfQ29tcGFyZSYgX19jb21wLAotICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCi0gICAgOiBfTV90KF9fY29tcCwgX19hKSB7IF9NX3QuaW5zZXJ0X3VuaXF1ZShfX2ZpcnN0LCBfX2xhc3QpOyB9Ci0jZW5kaWYgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLwotCi0gIG1hcChjb25zdCBfU2VsZiYgX194KSA6IF9NX3QoX194Ll9NX3QpIHt9Ci0KLSAgbWFwKF9fbW92ZV9zb3VyY2U8X1NlbGY+IHNyYykKLSAgICA6IF9NX3QoX19tb3ZlX3NvdXJjZTxfUmVwX3R5cGU+KHNyYy5nZXQoKS5fTV90KSkge30KLQotICBfU2VsZiYgb3BlcmF0b3I9KGNvbnN0IF9TZWxmJiBfX3gpIHsKLSAgICBfTV90ID0gX194Ll9NX3Q7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgLy8gYWNjZXNzb3JzOgotICBrZXlfY29tcGFyZSBrZXlfY29tcCgpIGNvbnN0IHsgcmV0dXJuIF9NX3Qua2V5X2NvbXAoKTsgfQotICB2YWx1ZV9jb21wYXJlIHZhbHVlX2NvbXAoKSBjb25zdCB7IHJldHVybiB2YWx1ZV9jb21wYXJlKF9NX3Qua2V5X2NvbXAoKSk7IH0KLSAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IHsgcmV0dXJuIF9NX3QuZ2V0X2FsbG9jYXRvcigpOyB9Ci0KLSAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBfTV90LmJlZ2luKCk7IH0KLSAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBfTV90LmJlZ2luKCk7IH0KLSAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gX01fdC5lbmQoKTsgfQotICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBfTV90LmVuZCgpOyB9Ci0gIHJldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgeyByZXR1cm4gX01fdC5yYmVnaW4oKTsgfQotICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0IHsgcmV0dXJuIF9NX3QucmJlZ2luKCk7IH0KLSAgcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgeyByZXR1cm4gX01fdC5yZW5kKCk7IH0KLSAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgY29uc3QgeyByZXR1cm4gX01fdC5yZW5kKCk7IH0KLSAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIF9NX3QuZW1wdHkoKTsgfQotICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX3Quc2l6ZSgpOyB9Ci0gIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX3QubWF4X3NpemUoKTsgfQotICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKLSAgX1RwJiBvcGVyYXRvcltdKGNvbnN0IF9LVCYgX19rKSB7Ci0gICAgaXRlcmF0b3IgX19pID0gbG93ZXJfYm91bmQoX19rKTsKLSAgICAvLyBfX2ktPmZpcnN0IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVpdmFsZW50IHRvIF9fay4KLSAgICBpZiAoX19pID09IGVuZCgpIHx8IGtleV9jb21wKCkoX19rLCAoKl9faSkuZmlyc3QpKQotICAgICAgX19pID0gaW5zZXJ0KF9faSwgdmFsdWVfdHlwZShfX2ssIF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQoX1RwKSkpOwotICAgIHJldHVybiAoKl9faSkuc2Vjb25kOwotICB9Ci0gIHZvaWQgc3dhcChfU2VsZiYgX194KSB7IF9NX3Quc3dhcChfX3guX01fdCk7IH0KLQotICAvLyBpbnNlcnQvZXJhc2UKLSAgcGFpcjxpdGVyYXRvcixib29sPiBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX194KQotICB7IHJldHVybiBfTV90Lmluc2VydF91bmlxdWUoX194KTsgfQotICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKLSAgeyByZXR1cm4gX01fdC5pbnNlcnRfdW5pcXVlKF9fcG9zLCBfX3gpOyB9Ci0jaWZkZWYgX1NUTFBfTUVNQkVSX1RFTVBMQVRFUwotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Ci0gIHZvaWQgaW5zZXJ0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKLSAgeyBfTV90Lmluc2VydF91bmlxdWUoX19maXJzdCwgX19sYXN0KTsgfQotI2Vsc2UKLSAgdm9pZCBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSogX19maXJzdCwgY29uc3QgdmFsdWVfdHlwZSogX19sYXN0KQotICB7IF9NX3QuaW5zZXJ0X3VuaXF1ZShfX2ZpcnN0LCBfX2xhc3QpOyB9Ci0gIHZvaWQgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKLSAgeyBfTV90Lmluc2VydF91bmlxdWUoX19maXJzdCwgX19sYXN0KTsgfQotI2VuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KLQotICB2b2lkIGVyYXNlKGl0ZXJhdG9yIF9fcG9zKSB7IF9NX3QuZXJhc2UoX19wb3MpOyB9Ci0gIHNpemVfdHlwZSBlcmFzZShjb25zdCBrZXlfdHlwZSYgX194KSB7IHJldHVybiBfTV90LmVyYXNlX3VuaXF1ZShfX3gpOyB9Ci0gIHZvaWQgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KSB7IF9NX3QuZXJhc2UoX19maXJzdCwgX19sYXN0KTsgfQotICB2b2lkIGNsZWFyKCkgeyBfTV90LmNsZWFyKCk7IH0KLQotICAvLyBtYXAgb3BlcmF0aW9uczoKLSAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0gIGl0ZXJhdG9yIGZpbmQoY29uc3QgX0tUJiBfX3gpIHsgcmV0dXJuIF9NX3QuZmluZChfX3gpOyB9Ci0gIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAotICBjb25zdF9pdGVyYXRvciBmaW5kKGNvbnN0IF9LVCYgX194KSBjb25zdCB7IHJldHVybiBfTV90LmZpbmQoX194KTsgfQotICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKLSAgc2l6ZV90eXBlIGNvdW50KGNvbnN0IF9LVCYgX194KSBjb25zdCB7IHJldHVybiBfTV90LmZpbmQoX194KSA9PSBfTV90LmVuZCgpID8gMCA6IDE7IH0KLSAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0gIGl0ZXJhdG9yIGxvd2VyX2JvdW5kKGNvbnN0IF9LVCYgX194KSB7IHJldHVybiBfTV90Lmxvd2VyX2JvdW5kKF9feCk7IH0KLSAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0gIGNvbnN0X2l0ZXJhdG9yIGxvd2VyX2JvdW5kKGNvbnN0IF9LVCYgX194KSBjb25zdCB7IHJldHVybiBfTV90Lmxvd2VyX2JvdW5kKF9feCk7IH0KLSAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0gIGl0ZXJhdG9yIHVwcGVyX2JvdW5kKGNvbnN0IF9LVCYgX194KSB7IHJldHVybiBfTV90LnVwcGVyX2JvdW5kKF9feCk7IH0KLSAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0gIGNvbnN0X2l0ZXJhdG9yIHVwcGVyX2JvdW5kKGNvbnN0IF9LVCYgX194KSBjb25zdCB7IHJldHVybiBfTV90LnVwcGVyX2JvdW5kKF9feCk7IH0KLQotICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKLSAgcGFpcjxpdGVyYXRvcixpdGVyYXRvcj4gZXF1YWxfcmFuZ2UoY29uc3QgX0tUJiBfX3gpCi0gIHsgcmV0dXJuIF9NX3QuZXF1YWxfcmFuZ2VfdW5pcXVlKF9feCk7IH0KLSAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0gIHBhaXI8Y29uc3RfaXRlcmF0b3IsY29uc3RfaXRlcmF0b3I+IGVxdWFsX3JhbmdlKGNvbnN0IF9LVCYgX194KSBjb25zdAotICB7IHJldHVybiBfTV90LmVxdWFsX3JhbmdlX3VuaXF1ZShfX3gpOyB9Ci19OwotCi0vL1NwZWNpZmljIGl0ZXJhdG9yIHRyYWl0cyBjcmVhdGlvbgotX1NUTFBfQ1JFQVRFX0lURVJBVE9SX1RSQUlUUyhNdWx0aW1hcFRyYWl0c1QsIHRyYWl0cykKLQotdGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgX1NUTFBfREZMX1RNUExfUEFSQU0oX0NvbXBhcmUsIGxlc3M8X0tleT4gKSwKLSAgICAgICAgICBfU1RMUF9ERUZBVUxUX1BBSVJfQUxMT0NBVE9SX1NFTEVDVChjb25zdCBfS2V5LCBfVHApID4KLWNsYXNzIG11bHRpbWFwCi0jaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKQotICAgICAgICAgICAgICAgOiBwdWJsaWMgX19zdGxwb3J0X2NsYXNzPG11bHRpbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvYz4gPgotI2VuZGlmCi17Ci0gIHR5cGVkZWYgbXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jPiBfU2VsZjsKLXB1YmxpYzoKLQotLy8gdHlwZWRlZnM6Ci0KLSAgdHlwZWRlZiBfS2V5ICAgICAgICAgICAgICAgICAga2V5X3R5cGU7Ci0gIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAgICAgIGRhdGFfdHlwZTsKLSAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICAgICAgbWFwcGVkX3R5cGU7Ci0gIHR5cGVkZWYgcGFpcjxjb25zdCBfS2V5LCBfVHA+IHZhbHVlX3R5cGU7Ci0gIHR5cGVkZWYgX0NvbXBhcmUgICAgICAgICAgICAgIGtleV9jb21wYXJlOwotCi0gIGNsYXNzIHZhbHVlX2NvbXBhcmUgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPHZhbHVlX3R5cGUsIHZhbHVlX3R5cGUsIGJvb2w+IHsKLSAgICBmcmllbmQgY2xhc3MgbXVsdGltYXA8X0tleSxfVHAsX0NvbXBhcmUsX0FsbG9jPjsKLSAgcHJvdGVjdGVkOgotICAgIC8vY29tcCBpcyBhIFN0YW5kYXJkIG5hbWUgKDIzLjMuMiksIGRvIG5vIG1ha2UgaXQgU1RMcG9ydCBuYW1pbmcgY29udmVudGlvbiBjb21wbGlhbnQuCi0gICAgX0NvbXBhcmUgY29tcDsKLSAgICB2YWx1ZV9jb21wYXJlKF9Db21wYXJlIF9fYykgOiBjb21wKF9fYykge30KLSAgcHVibGljOgotICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCB2YWx1ZV90eXBlJiBfX3gsIGNvbnN0IHZhbHVlX3R5cGUmIF9feSkgY29uc3QKLSAgICB7IHJldHVybiBjb21wKF9feC5maXJzdCwgX195LmZpcnN0KTsgfQotICB9OwotCi1wcm90ZWN0ZWQ6Ci0gIC8vU3BlY2lmaWMgaXRlcmF0b3IgdHJhaXRzIGNyZWF0aW9uCi0gIHR5cGVkZWYgX1NUTFBfUFJJViBfTXVsdGltYXBUcmFpdHNUPHZhbHVlX3R5cGU+IF9NdWx0aW1hcFRyYWl0czsKLQotcHVibGljOgotICAvL0ZvbGxvd2luZyB0eXBlZGVmIGhhdmUgdG8gYmUgcHVibGljIGZvciBfX21vdmVfdHJhaXRzIHNwZWNpYWxpemF0aW9uLgotICB0eXBlZGVmIF9TVExQX1BSSVYgX1JiX3RyZWU8a2V5X3R5cGUsIGtleV9jb21wYXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZSwgX1NUTFBfU0VMRUNUMVNUKHZhbHVlX3R5cGUsIF9LZXkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX011bHRpbWFwVHJhaXRzLCBfQWxsb2M+IF9SZXBfdHlwZTsKLQotICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6cG9pbnRlciBwb2ludGVyOwotICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6Y29uc3RfcG9pbnRlciBjb25zdF9wb2ludGVyOwotICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6cmVmZXJlbmNlIHJlZmVyZW5jZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9yZWZlcmVuY2U7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjppdGVyYXRvciBpdGVyYXRvcjsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOwotICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6cmV2ZXJzZV9pdGVyYXRvciByZXZlcnNlX2l0ZXJhdG9yOwotICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOwotICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6c2l6ZV90eXBlIHNpemVfdHlwZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKLQotcHJpdmF0ZToKLSAgX1JlcF90eXBlIF9NX3Q7ICAvLyByZWQtYmxhY2sgdHJlZSByZXByZXNlbnRpbmcgbXVsdGltYXAKLSAgX1NUTFBfS0VZX1RZUEVfRk9SX0NPTlRfRVhUKGtleV90eXBlKQotCi1wdWJsaWM6Ci0gIC8vIGFsbG9jYXRpb24vZGVhbGxvY2F0aW9uCi0gIG11bHRpbWFwKCkgOiBfTV90KF9Db21wYXJlKCksIGFsbG9jYXRvcl90eXBlKCkpIHsgfQotICBleHBsaWNpdCBtdWx0aW1hcChjb25zdCBfQ29tcGFyZSYgX19jb21wLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKLSAgICA6IF9NX3QoX19jb21wLCBfX2EpIHsgfQotCi0jaWZkZWYgX1NUTFBfTUVNQkVSX1RFTVBMQVRFUwotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Ci0gIG11bHRpbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKLSAgICA6IF9NX3QoX0NvbXBhcmUoKSwgYWxsb2NhdG9yX3R5cGUoKSkKLSAgICB7IF9NX3QuaW5zZXJ0X2VxdWFsKF9fZmlyc3QsIF9fbGFzdCk7IH0KLSMgaWZkZWYgX1NUTFBfTkVFRFNfRVhUUkFfVEVNUExBVEVfQ09OU1RSVUNUT1JTCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KLSAgbXVsdGltYXAoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAotICAgICAgICAgICBjb25zdCBfQ29tcGFyZSYgX19jb21wKQotICAgIDogX01fdChfX2NvbXAsIGFsbG9jYXRvcl90eXBlKCkpIHsgX01fdC5pbnNlcnRfZXF1YWwoX19maXJzdCwgX19sYXN0KTsgfQotIyAgZW5kaWYKLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgotICBtdWx0aW1hcChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCi0gICAgICAgICAgIGNvbnN0IF9Db21wYXJlJiBfX2NvbXAsCi0gICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgX1NUTFBfQUxMT0NBVE9SX1RZUEVfREZMKQotICAgIDogX01fdChfX2NvbXAsIF9fYSkgeyBfTV90Lmluc2VydF9lcXVhbChfX2ZpcnN0LCBfX2xhc3QpOyB9Ci0jZWxzZQotICBtdWx0aW1hcChjb25zdCB2YWx1ZV90eXBlKiBfX2ZpcnN0LCBjb25zdCB2YWx1ZV90eXBlKiBfX2xhc3QpCi0gICAgOiBfTV90KF9Db21wYXJlKCksIGFsbG9jYXRvcl90eXBlKCkpCi0gICAgeyBfTV90Lmluc2VydF9lcXVhbChfX2ZpcnN0LCBfX2xhc3QpOyB9Ci0gIG11bHRpbWFwKGNvbnN0IHZhbHVlX3R5cGUqIF9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbGFzdCwKLSAgICAgICAgICAgY29uc3QgX0NvbXBhcmUmIF9fY29tcCwKLSAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCi0gICAgOiBfTV90KF9fY29tcCwgX19hKSB7IF9NX3QuaW5zZXJ0X2VxdWFsKF9fZmlyc3QsIF9fbGFzdCk7IH0KLQotICBtdWx0aW1hcChjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpCi0gICAgOiBfTV90KF9Db21wYXJlKCksIGFsbG9jYXRvcl90eXBlKCkpCi0gICAgeyBfTV90Lmluc2VydF9lcXVhbChfX2ZpcnN0LCBfX2xhc3QpOyB9Ci0gIG11bHRpbWFwKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCwKLSAgICAgICAgICAgY29uc3QgX0NvbXBhcmUmIF9fY29tcCwKLSAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCi0gICAgOiBfTV90KF9fY29tcCwgX19hKSB7IF9NX3QuaW5zZXJ0X2VxdWFsKF9fZmlyc3QsIF9fbGFzdCk7IH0KLSNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCi0KLSAgbXVsdGltYXAoY29uc3QgX1NlbGYmIF9feCkgOiBfTV90KF9feC5fTV90KSB7fQotCi0gIG11bHRpbWFwKF9fbW92ZV9zb3VyY2U8X1NlbGY+IHNyYykKLSAgICA6IF9NX3QoX19tb3ZlX3NvdXJjZTxfUmVwX3R5cGU+KHNyYy5nZXQoKS5fTV90KSkge30KLQotICBfU2VsZiYgb3BlcmF0b3I9KGNvbnN0IF9TZWxmJiBfX3gpIHsKLSAgICBfTV90ID0gX194Ll9NX3Q7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgLy8gYWNjZXNzb3JzOgotCi0gIGtleV9jb21wYXJlIGtleV9jb21wKCkgY29uc3QgeyByZXR1cm4gX01fdC5rZXlfY29tcCgpOyB9Ci0gIHZhbHVlX2NvbXBhcmUgdmFsdWVfY29tcCgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlX2NvbXBhcmUoX01fdC5rZXlfY29tcCgpKTsgfQotICBhbGxvY2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9yKCkgY29uc3QgeyByZXR1cm4gX01fdC5nZXRfYWxsb2NhdG9yKCk7IH0KLQotICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIF9NX3QuYmVnaW4oKTsgfQotICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIF9NX3QuYmVnaW4oKTsgfQotICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBfTV90LmVuZCgpOyB9Ci0gIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIF9NX3QuZW5kKCk7IH0KLSAgcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSB7IHJldHVybiBfTV90LnJiZWdpbigpOyB9Ci0gIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3QgeyByZXR1cm4gX01fdC5yYmVnaW4oKTsgfQotICByZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSB7IHJldHVybiBfTV90LnJlbmQoKTsgfQotICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSBjb25zdCB7IHJldHVybiBfTV90LnJlbmQoKTsgfQotICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gX01fdC5lbXB0eSgpOyB9Ci0gIHNpemVfdHlwZSBzaXplKCkgY29uc3QgeyByZXR1cm4gX01fdC5zaXplKCk7IH0KLSAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgeyByZXR1cm4gX01fdC5tYXhfc2l6ZSgpOyB9Ci0gIHZvaWQgc3dhcChfU2VsZiYgX194KSB7IF9NX3Quc3dhcChfX3guX01fdCk7IH0KLQotICAvLyBpbnNlcnQvZXJhc2UKLSAgaXRlcmF0b3IgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9feCkgeyByZXR1cm4gX01fdC5pbnNlcnRfZXF1YWwoX194KTsgfQotICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkgeyByZXR1cm4gX01fdC5pbnNlcnRfZXF1YWwoX19wb3MsIF9feCk7IH0KLSNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Ci0gIHZvaWQgaW5zZXJ0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKLSAgeyBfTV90Lmluc2VydF9lcXVhbChfX2ZpcnN0LCBfX2xhc3QpOyB9Ci0jZWxzZQotICB2b2lkIGluc2VydChjb25zdCB2YWx1ZV90eXBlKiBfX2ZpcnN0LCBjb25zdCB2YWx1ZV90eXBlKiBfX2xhc3QpCi0gIHsgX01fdC5pbnNlcnRfZXF1YWwoX19maXJzdCwgX19sYXN0KTsgfQotICB2b2lkIGluc2VydChjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpCi0gIHsgX01fdC5pbnNlcnRfZXF1YWwoX19maXJzdCwgX19sYXN0KTsgfQotI2VuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KLSAgdm9pZCBlcmFzZShpdGVyYXRvciBfX3BvcykgeyBfTV90LmVyYXNlKF9fcG9zKTsgfQotICBzaXplX3R5cGUgZXJhc2UoY29uc3Qga2V5X3R5cGUmIF9feCkgeyByZXR1cm4gX01fdC5lcmFzZShfX3gpOyB9Ci0gIHZvaWQgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KSB7IF9NX3QuZXJhc2UoX19maXJzdCwgX19sYXN0KTsgfQotICB2b2lkIGNsZWFyKCkgeyBfTV90LmNsZWFyKCk7IH0KLQotICAvLyBtdWx0aW1hcCBvcGVyYXRpb25zOgotCi0gIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAotICBpdGVyYXRvciBmaW5kKGNvbnN0IF9LVCYgX194KSB7IHJldHVybiBfTV90LmZpbmQoX194KTsgfQotICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKLSAgY29uc3RfaXRlcmF0b3IgZmluZChjb25zdCBfS1QmIF9feCkgY29uc3QgeyByZXR1cm4gX01fdC5maW5kKF9feCk7IH0KLSAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0gIHNpemVfdHlwZSBjb3VudChjb25zdCBfS1QmIF9feCkgY29uc3QgeyByZXR1cm4gX01fdC5jb3VudChfX3gpOyB9Ci0gIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAotICBpdGVyYXRvciBsb3dlcl9ib3VuZChjb25zdCBfS1QmIF9feCkgeyByZXR1cm4gX01fdC5sb3dlcl9ib3VuZChfX3gpOyB9Ci0gIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAotICBjb25zdF9pdGVyYXRvciBsb3dlcl9ib3VuZChjb25zdCBfS1QmIF9feCkgY29uc3QgeyByZXR1cm4gX01fdC5sb3dlcl9ib3VuZChfX3gpOyB9Ci0gIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAotICBpdGVyYXRvciB1cHBlcl9ib3VuZChjb25zdCBfS1QmIF9feCkgeyByZXR1cm4gX01fdC51cHBlcl9ib3VuZChfX3gpOyB9Ci0gIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAotICBjb25zdF9pdGVyYXRvciB1cHBlcl9ib3VuZChjb25zdCBfS1QmIF9feCkgY29uc3QgeyByZXR1cm4gX01fdC51cHBlcl9ib3VuZChfX3gpOyB9Ci0gIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAotICBwYWlyPGl0ZXJhdG9yLGl0ZXJhdG9yPiBlcXVhbF9yYW5nZShjb25zdCBfS1QmIF9feCkKLSAgeyByZXR1cm4gX01fdC5lcXVhbF9yYW5nZShfX3gpOyB9Ci0gIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAotICBwYWlyPGNvbnN0X2l0ZXJhdG9yLGNvbnN0X2l0ZXJhdG9yPiBlcXVhbF9yYW5nZShjb25zdCBfS1QmIF9feCkgY29uc3QKLSAgeyByZXR1cm4gX01fdC5lcXVhbF9yYW5nZShfX3gpOyB9Ci19OwotCi0jZGVmaW5lIF9TVExQX1RFTVBMQVRFX0hFQURFUiB0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX0FsbG9jPgotI2RlZmluZSBfU1RMUF9URU1QTEFURV9DT05UQUlORVIgbWFwPF9LZXksX1RwLF9Db21wYXJlLF9BbGxvYz4KLSNpbmNsdWRlIDxzdGwvX3JlbG9wc19jb250Lmg+Ci0jdW5kZWYgIF9TVExQX1RFTVBMQVRFX0NPTlRBSU5FUgotI2RlZmluZSBfU1RMUF9URU1QTEFURV9DT05UQUlORVIgbXVsdGltYXA8X0tleSxfVHAsX0NvbXBhcmUsX0FsbG9jPgotI2luY2x1ZGUgPHN0bC9fcmVsb3BzX2NvbnQuaD4KLSN1bmRlZiAgX1NUTFBfVEVNUExBVEVfQ09OVEFJTkVSCi0jdW5kZWYgIF9TVExQX1RFTVBMQVRFX0hFQURFUgotCi0jaWYgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikKLXRlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2M+Ci1zdHJ1Y3QgX19tb3ZlX3RyYWl0czxtYXA8X0tleSxfVHAsX0NvbXBhcmUsX0FsbG9jPiA+IDoKLSAgX1NUTFBfUFJJViBfX21vdmVfdHJhaXRzX2F1eDx0eXBlbmFtZSBtYXA8X0tleSxfVHAsX0NvbXBhcmUsX0FsbG9jPjo6X1JlcF90eXBlPgote307Ci0KLXRlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2M+Ci1zdHJ1Y3QgX19tb3ZlX3RyYWl0czxtdWx0aW1hcDxfS2V5LF9UcCxfQ29tcGFyZSxfQWxsb2M+ID4gOgotICBfU1RMUF9QUklWIF9fbW92ZV90cmFpdHNfYXV4PHR5cGVuYW1lIG11bHRpbWFwPF9LZXksX1RwLF9Db21wYXJlLF9BbGxvYz46Ol9SZXBfdHlwZT4KLXt9OwotI2VuZGlmCi0KLV9TVExQX0VORF9OQU1FU1BBQ0UKLQotI2VuZGlmIC8qIF9TVExQX0lOVEVSTkFMX01BUF9IICovCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6Ci0KZGlmZiAtLWdpdCBhL3N0bC9fbWJzdGF0ZV90LmggYi9zdGwvX21ic3RhdGVfdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWE5MzZmLi4wMDAwMDAwCi0tLSBhL3N0bC9fbWJzdGF0ZV90LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9NQlNUQVRFX1QKLSNkZWZpbmUgX1NUTFBfSU5URVJOQUxfTUJTVEFURV9UCi0KLSNpZiAoZGVmaW5lZCAoX19PcGVuQlNEX18pIHx8IGRlZmluZWQgKF9fRnJlZUJTRF9fKSkgJiYgZGVmaW5lZCAoX19HTlVDX18pICYmICFkZWZpbmVkIChfR0xJQkNQUF9IQVZFX01CU1RBVEVfVCkKLSMgIGRlZmluZSBfX21ic3RhdGVfdF9kZWZpbmVkIC8qIG1ic3RhdGVfdCBkZWZpbmVkIGluIG5hdGl2ZSA8Y3djaGFyPiwgc28gbm90IGRlZmluZWQgaW4gQyEgKi8KLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX1NUTFBfTk9fTkFUSVZFX01CU1RBVEVfVCkgJiYgIWRlZmluZWQgKF9TVExQX05PX01CU1RBVEVfVCkgJiYgIWRlZmluZWQgKF9NQlNUQVRFX1QpICYmICFkZWZpbmVkIChfX21ic3RhdGVfdF9kZWZpbmVkKQotIyAgZGVmaW5lIF9TVExQX1VTRV9PV05fTUJTVEFURV9UCi0jICBkZWZpbmUgX01CU1RBVEVfVAotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfT1dOX01CU1RBVEVfVCkKLXR5cGVkZWYgaW50IG1ic3RhdGVfdDsKLQotIyAgaWYgZGVmaW5lZCAoX19jcGx1c3BsdXMpCi1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLXVzaW5nIDo6bWJzdGF0ZV90OwotX1NUTFBfRU5EX05BTUVTUEFDRQotIyAgZW5kaWYKLQotI2VuZGlmIC8qIF9TVExQX1VTRV9PV05fTUJTVEFURV9UICovCi0KLSNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9NQlNUQVRFX1QgKi8KZGlmZiAtLWdpdCBhL3N0bC9fbWVzc2FnZXNfZmFjZXRzLmggYi9zdGwvX21lc3NhZ2VzX2ZhY2V0cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjRmODY5Li4wMDAwMDAwCi0tLSBhL3N0bC9fbWVzc2FnZXNfZmFjZXRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLQotLy8gV0FSTklORzogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgQysrCi0vLyBzdGFuZGFyZCBsaWJyYXJ5IGhlYWRlcnMuICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSB0aGlzIGhlYWRlcgotLy8gZmlsZSBkaXJlY3RseS4KLQotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX01FU1NBR0VTX0gKLSNkZWZpbmUgX1NUTFBfSU5URVJOQUxfTUVTU0FHRVNfSAotCi0jaWZuZGVmIF9TVExQX0lPU19CQVNFX0gKLSMgIGluY2x1ZGUgPHN0bC9faW9zX2Jhc2UuaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX0NfTE9DQUxFX0gKLSMgIGluY2x1ZGUgPHN0bC9jX2xvY2FsZS5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfU1RSSU5HX0gKLSMgIGluY2x1ZGUgPHN0bC9fc3RyaW5nLmg+Ci0jZW5kaWYKLQotX1NUTFBfQkVHSU5fTkFNRVNQQUNFCi0KLS8vIG1lc3NhZ2VzIGZhY2V0cwotCi1jbGFzcyBtZXNzYWdlc19iYXNlIHsKLSAgcHVibGljOgotICAgIHR5cGVkZWYgaW50IGNhdGFsb2c7Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPiBjbGFzcyBtZXNzYWdlcyB7fTsKLQotX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQotY2xhc3MgX01lc3NhZ2VzOwotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi0KLV9TVExQX1RFTVBMQVRFX05VTEwKLWNsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIG1lc3NhZ2VzPGNoYXI+IDogcHVibGljIGxvY2FsZTo6ZmFjZXQsIHB1YmxpYyBtZXNzYWdlc19iYXNlIHsKLSAgZnJpZW5kIGNsYXNzIF9Mb2NhbGVfaW1wbDsKLXB1YmxpYzoKLSAgdHlwZWRlZiBtZXNzYWdlc19iYXNlOjpjYXRhbG9nIGNhdGFsb2c7Ci0gIHR5cGVkZWYgY2hhciAgICAgICAgICAgICAgICAgICBjaGFyX3R5cGU7Ci0gIHR5cGVkZWYgc3RyaW5nICAgIHN0cmluZ190eXBlOwotCi0gIGV4cGxpY2l0IG1lc3NhZ2VzKHNpemVfdCBfX3JlZnMgPSAwKTsKLQotICBjYXRhbG9nIG9wZW4oY29uc3Qgc3RyaW5nJiBfX2ZuLCBjb25zdCBsb2NhbGUmIF9fbG9jKSBjb25zdAotICB7IHJldHVybiBkb19vcGVuKF9fZm4sIF9fbG9jKTsgfQotICBzdHJpbmdfdHlwZSBnZXQoY2F0YWxvZyBfX2MsIGludCBfX3NldCwgaW50IF9fbXNnaWQsCi0gICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmdfdHlwZSYgX19kZmF1bHQpIGNvbnN0Ci0gIHsgcmV0dXJuIGRvX2dldChfX2MsIF9fc2V0LCBfX21zZ2lkLCBfX2RmYXVsdCk7IH0KLSAgaW5saW5lIHZvaWQgY2xvc2UoY2F0YWxvZyBfX2MpIGNvbnN0Ci0gIHsgZG9fY2xvc2UoX19jKTsgfQotCi0gIHN0YXRpYyBfU1RMUF9TVEFUSUNfTUVNQkVSX0RFQ0xTUEVDIGxvY2FsZTo6aWQgaWQ7Ci0KLXByaXZhdGU6Ci0gIG1lc3NhZ2VzKF9TVExQX1BSSVYgX01lc3NhZ2VzKik7Ci0KLXByb3RlY3RlZDoKLSAgbWVzc2FnZXMoc2l6ZV90LCBfTG9jYWxlX21lc3NhZ2VzKik7Ci0gIH5tZXNzYWdlcygpOwotCi0gIHZpcnR1YWwgY2F0YWxvZyAgICAgZG9fb3Blbihjb25zdCBzdHJpbmcmIF9fZm4sIGNvbnN0IGxvY2FsZSYgX19sb2MpIGNvbnN0OwotICB2aXJ0dWFsIHN0cmluZ190eXBlIGRvX2dldChjYXRhbG9nIF9fYywgaW50IF9fc2V0LCBpbnQgX19tc2dpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nX3R5cGUmIF9fZGZhdWx0KSBjb25zdDsKLSAgdmlydHVhbCB2b2lkICAgICAgICBkb19jbG9zZShjYXRhbG9nIF9fYykgY29uc3Q7Ci0KLSAgdm9pZCBfTV9pbml0aWFsaXplKGNvbnN0IGNoYXIqIF9fbmFtZSk7Ci0KLXByaXZhdGU6Ci0gIF9TVExQX1BSSVYgX01lc3NhZ2VzKiBfTV9pbXBsOwotfTsKLQotI2lmICFkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQotCi1fU1RMUF9URU1QTEFURV9OVUxMCi1jbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBtZXNzYWdlczx3Y2hhcl90PiA6IHB1YmxpYyBsb2NhbGU6OmZhY2V0LCBwdWJsaWMgbWVzc2FnZXNfYmFzZSB7Ci0gIGZyaWVuZCBjbGFzcyBfTG9jYWxlX2ltcGw7Ci1wdWJsaWM6Ci0gIHR5cGVkZWYgbWVzc2FnZXNfYmFzZTo6Y2F0YWxvZyBjYXRhbG9nOwotICB0eXBlZGVmIHdjaGFyX3QgICAgICAgICAgICAgICAgY2hhcl90eXBlOwotICB0eXBlZGVmIHdzdHJpbmcgIHN0cmluZ190eXBlOwotCi0gIGV4cGxpY2l0IG1lc3NhZ2VzKHNpemVfdCBfX3JlZnMgPSAwKTsKLQotICBpbmxpbmUgY2F0YWxvZyBvcGVuKGNvbnN0IHN0cmluZyYgX19mbiwgY29uc3QgbG9jYWxlJiBfX2xvYykgY29uc3QKLSAgICB7IHJldHVybiBkb19vcGVuKF9fZm4sIF9fbG9jKTsgfQotICBpbmxpbmUgc3RyaW5nX3R5cGUgZ2V0KGNhdGFsb2cgX19jLCBpbnQgX19zZXQsIGludCBfX21zZ2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZ190eXBlJiBfX2RmYXVsdCkgY29uc3QKLSAgICB7IHJldHVybiBkb19nZXQoX19jLCBfX3NldCwgX19tc2dpZCwgX19kZmF1bHQpOyB9Ci0gIGlubGluZSB2b2lkIGNsb3NlKGNhdGFsb2cgX19jKSBjb25zdAotICAgIHsgZG9fY2xvc2UoX19jKTsgfQotCi0gIHN0YXRpYyBfU1RMUF9TVEFUSUNfTUVNQkVSX0RFQ0xTUEVDIGxvY2FsZTo6aWQgaWQ7Ci0KLXByaXZhdGU6Ci0gIG1lc3NhZ2VzKF9TVExQX1BSSVYgX01lc3NhZ2VzKik7Ci0KLXByb3RlY3RlZDoKLSAgbWVzc2FnZXMoc2l6ZV90LCBfTG9jYWxlX21lc3NhZ2VzKik7Ci0gIH5tZXNzYWdlcygpOwotCi0gIHZpcnR1YWwgY2F0YWxvZyAgICAgZG9fb3Blbihjb25zdCBzdHJpbmcmIF9fZm4sIGNvbnN0IGxvY2FsZSYgX19sb2MpIGNvbnN0OwotICB2aXJ0dWFsIHN0cmluZ190eXBlIGRvX2dldChjYXRhbG9nIF9fYywgaW50IF9fc2V0LCBpbnQgX19tc2dpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nX3R5cGUmIF9fZGZhdWx0KSBjb25zdDsKLSAgdmlydHVhbCB2b2lkICAgICAgICBkb19jbG9zZShjYXRhbG9nIF9fYykgY29uc3Q7Ci0KLSAgdm9pZCBfTV9pbml0aWFsaXplKGNvbnN0IGNoYXIqIF9fbmFtZSk7Ci0KLXByaXZhdGU6Ci0gIF9TVExQX1BSSVYgX01lc3NhZ2VzKiBfTV9pbXBsOwotfTsKLQotI2VuZGlmCi0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+IGNsYXNzIG1lc3NhZ2VzX2J5bmFtZSB7fTsKLQotX1NUTFBfVEVNUExBVEVfTlVMTAotY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgbWVzc2FnZXNfYnluYW1lPGNoYXI+IDogcHVibGljIG1lc3NhZ2VzPGNoYXI+IHsKLXB1YmxpYzoKLSAgdHlwZWRlZiBtZXNzYWdlc19iYXNlOjpjYXRhbG9nIGNhdGFsb2c7Ci0gIHR5cGVkZWYgc3RyaW5nICAgICBzdHJpbmdfdHlwZTsKLQotICBleHBsaWNpdCBtZXNzYWdlc19ieW5hbWUoY29uc3QgY2hhciogX19uYW1lLCBzaXplX3QgX19yZWZzID0gMCwgX0xvY2FsZV9uYW1lX2hpbnQqIF9faGludCA9IDApOwotCi1wcm90ZWN0ZWQ6Ci0gIH5tZXNzYWdlc19ieW5hbWUoKTsKLQotcHJpdmF0ZToKLSAgdHlwZWRlZiBtZXNzYWdlc19ieW5hbWU8Y2hhcj4gX1NlbGY7Ci0gIC8vZXhwbGljaXRlbHkgZGVmaW5lZCBhcyBwcml2YXRlIHRvIGF2b2lkIHdhcm5pbmdzOgotICBtZXNzYWdlc19ieW5hbWUoX1NlbGYgY29uc3QmKTsKLSAgX1NlbGYmIG9wZXJhdG9yID0gKF9TZWxmIGNvbnN0Jik7Ci19OwotCi0jaWYgIWRlZmluZWQgKF9TVExQX05PX1dDSEFSX1QpCi1fU1RMUF9URU1QTEFURV9OVUxMCi1jbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBtZXNzYWdlc19ieW5hbWU8d2NoYXJfdD4gOiBwdWJsaWMgbWVzc2FnZXM8d2NoYXJfdD4gewotcHVibGljOgotICB0eXBlZGVmIG1lc3NhZ2VzX2Jhc2U6OmNhdGFsb2cgY2F0YWxvZzsKLSAgdHlwZWRlZiB3c3RyaW5nICAgICAgICAgICAgICAgIHN0cmluZ190eXBlOwotCi0gIGV4cGxpY2l0IG1lc3NhZ2VzX2J5bmFtZShjb25zdCBjaGFyKiBfX25hbWUsIHNpemVfdCBfX3JlZnMgPSAwLCBfTG9jYWxlX25hbWVfaGludCogX19oaW50ID0gMCk7Ci0KLXByb3RlY3RlZDoKLSAgfm1lc3NhZ2VzX2J5bmFtZSgpOwotCi1wcml2YXRlOgotICB0eXBlZGVmIG1lc3NhZ2VzX2J5bmFtZTx3Y2hhcl90PiBfU2VsZjsKLSAgLy9leHBsaWNpdGVseSBkZWZpbmVkIGFzIHByaXZhdGUgdG8gYXZvaWQgd2FybmluZ3M6Ci0gIG1lc3NhZ2VzX2J5bmFtZShfU2VsZiBjb25zdCYpOwotICBfU2VsZiYgb3BlcmF0b3IgPSAoX1NlbGYgY29uc3QmKTsKLX07Ci0jZW5kaWYgLyogV0NIQVJfVCAqLwotCi1fU1RMUF9FTkRfTkFNRVNQQUNFCi0KLSNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9NRVNTQUdFU19IICovCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6Ci0KZGlmZiAtLWdpdCBhL3N0bC9fbW9uZXRhcnkuYyBiL3N0bC9fbW9uZXRhcnkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgwMTEyOC4uMDAwMDAwMAotLS0gYS9zdGwvX21vbmV0YXJ5LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLSNpZm5kZWYgX1NUTFBfTU9ORVRBUllfQwotI2RlZmluZSBfU1RMUF9NT05FVEFSWV9DCi0KLSMgaWZuZGVmIF9TVExQX0lOVEVSTkFMX01PTkVUQVJZX0gKLSMgIGluY2x1ZGUgPHN0bC9fbW9uZXRhcnkuaD4KLSMgZW5kaWYKLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9JT1NfSAotIyBpbmNsdWRlIDxzdGwvX2lvcy5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfTlVNX1BVVF9ICi0jIGluY2x1ZGUgPHN0bC9fbnVtX3B1dC5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfTlVNX0dFVF9ICi0jIGluY2x1ZGUgPHN0bC9fbnVtX2dldC5oPgotI2VuZGlmCi0KLV9TVExQX0JFR0lOX05BTUVTUEFDRQotCi0jaWYgKF9TVExQX1NUQVRJQ19URU1QTEFURV9EQVRBID4gMCkKLQotIyAgaWYgIWRlZmluZWQgKF9fQk9STEFORENfXykKLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgotbG9jYWxlOjppZCBtb25leV9nZXQ8X0NoYXJULCBfSW5wdXRJdGVyYXRvcj46OmlkOwotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfT3V0cHV0SXRlcmF0b3I+Ci1sb2NhbGU6OmlkIG1vbmV5X3B1dDxfQ2hhclQsIF9PdXRwdXRJdGVyYXRvcj46OmlkOwotIyAgZW5kaWYKLQotIyAgaWYgKGRlZmluZWQgKF9fQ1lHV0lOX18pIHx8IGRlZmluZWQgKF9fTUlOR1czMl9fKSkgJiYgXAotICAgICAgIGRlZmluZWQgKF9TVExQX1VTRV9EWU5BTUlDX0xJQikgJiYgIWRlZmluZWQgKF9fQlVJTERJTkdfU1RMUE9SVCkKLS8qCi0gKiBVbmRlciBjeWd3aW4sIHdoZW4gU1RMcG9ydCBpcyB1c2VkIGFzIGEgc2hhcmVkIGxpYnJhcnksIHRoZSBpZCBuZWVkcwotICogdG8gYmUgc3BlY2lmaWVkIGFzIGltcG9ydGVkIG90aGVyd2lzZSB0aGV5IHdpbGwgYmUgZHVwbGljYXRlZCBpbiB0aGUKLSAqIGNhbGxpbmcgZXhlY3V0YWJsZS4KLSAqLwotdGVtcGxhdGUgPD4KLV9TVExQX0RFQ0xTUEVDIGxvY2FsZTo6aWQgbW9uZXlfZ2V0PGNoYXIsIGlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiA+OjppZDsKLS8qCi10ZW1wbGF0ZSA8PgotX1NUTFBfREVDTFNQRUMgbG9jYWxlOjppZCBtb25leV9nZXQ8Y2hhciwgY29uc3QgY2hhcio+OjppZDsKLSovCi0KLXRlbXBsYXRlIDw+Ci1fU1RMUF9ERUNMU1BFQyBsb2NhbGU6OmlkIG1vbmV5X3B1dDxjaGFyLCBvc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4gPjo6aWQ7Ci10ZW1wbGF0ZSA8PgotX1NUTFBfREVDTFNQRUMgbG9jYWxlOjppZCBtb25leV9wdXQ8Y2hhciwgY2hhcio+OjppZDsKLQotIyAgICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkKLXRlbXBsYXRlIDw+Ci1fU1RMUF9ERUNMU1BFQyBsb2NhbGU6OmlkIG1vbmV5X2dldDx3Y2hhcl90LCBpc3RyZWFtYnVmX2l0ZXJhdG9yPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4gPjo6aWQ7Ci10ZW1wbGF0ZSA8PgotX1NUTFBfREVDTFNQRUMgbG9jYWxlOjppZCBtb25leV9nZXQ8d2NoYXJfdCwgY29uc3Qgd2NoYXJfdCo+OjppZDsKLQotdGVtcGxhdGUgPD4KLV9TVExQX0RFQ0xTUEVDIGxvY2FsZTo6aWQgbW9uZXlfcHV0PHdjaGFyX3QsIG9zdHJlYW1idWZfaXRlcmF0b3I8d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPiA+OjppZDsKLXRlbXBsYXRlIDw+Ci1fU1RMUF9ERUNMU1BFQyBsb2NhbGU6OmlkIG1vbmV5X3B1dDx3Y2hhcl90LCB3Y2hhcl90Kj46OmlkOwotIyAgICBlbmRpZgotCi0jICBlbmRpZgotCi0jZWxzZSAvKiAoIF9TVExQX1NUQVRJQ19URU1QTEFURV9EQVRBID4gMCApICovCi0KLS8vdHlwZWRlZiBtb25leV9nZXQ8Y2hhciwgY29uc3QgY2hhcio+IG1vbmV5X2dldF9jaGFyOwotLy90eXBlZGVmIG1vbmV5X3B1dDxjaGFyLCBjaGFyKj4gbW9uZXlfcHV0X2NoYXI7Ci10eXBlZGVmIG1vbmV5X2dldDxjaGFyLCBpc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4gPiBtb25leV9nZXRfY2hhcl8yOwotdHlwZWRlZiBtb25leV9wdXQ8Y2hhciwgb3N0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+ID4gbW9uZXlfcHV0X2NoYXJfMjsKLQotLy9fX0RFQ0xBUkVfSU5TVEFOQ0UobG9jYWxlOjppZCwgbW9uZXlfZ2V0X2NoYXI6OmlkLCApOwotLy9fX0RFQ0xBUkVfSU5TVEFOQ0UobG9jYWxlOjppZCwgbW9uZXlfcHV0X2NoYXI6OmlkLCApOwotX19ERUNMQVJFX0lOU1RBTkNFKGxvY2FsZTo6aWQsIG1vbmV5X2dldF9jaGFyXzI6OmlkLCApOwotX19ERUNMQVJFX0lOU1RBTkNFKGxvY2FsZTo6aWQsIG1vbmV5X3B1dF9jaGFyXzI6OmlkLCApOwotCi0jICBpZm5kZWYgX1NUTFBfTk9fV0NIQVJfVAotCi0vL3R5cGVkZWYgbW9uZXlfZ2V0PHdjaGFyX3QsIGNvbnN0IHdjaGFyX3QqPiBtb25leV9nZXRfd2NoYXJfdDsKLS8vdHlwZWRlZiBtb25leV9nZXQ8d2NoYXJfdCwgaXN0cmVhbWJ1Zl9pdGVyYXRvcjx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+ID4gbW9uZXlfZ2V0X3djaGFyX3RfMjsKLXR5cGVkZWYgbW9uZXlfcHV0PHdjaGFyX3QsIHdjaGFyX3QqPiBtb25leV9wdXRfd2NoYXJfdDsKLXR5cGVkZWYgbW9uZXlfcHV0PHdjaGFyX3QsIG9zdHJlYW1idWZfaXRlcmF0b3I8d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPiA+IG1vbmV5X3B1dF93Y2hhcl90XzI7Ci0KLS8vX19ERUNMQVJFX0lOU1RBTkNFKGxvY2FsZTo6aWQsIG1vbmV5X2dldF93Y2hhcl90OjppZCwgKTsKLS8vX19ERUNMQVJFX0lOU1RBTkNFKGxvY2FsZTo6aWQsIG1vbmV5X3B1dF93Y2hhcl90OjppZCwgKTsKLV9fREVDTEFSRV9JTlNUQU5DRShsb2NhbGU6OmlkLCBtb25leV9nZXRfd2NoYXJfdF8yOjppZCwgKTsKLV9fREVDTEFSRV9JTlNUQU5DRShsb2NhbGU6OmlkLCBtb25leV9wdXRfd2NoYXJfdF8yOjppZCwgKTsKLQotIyAgZW5kaWYKLSNlbmRpZiAvKiAoIF9TVExQX1NUQVRJQ19URU1QTEFURV9EQVRBID4gMCApICovCi0KLS8vIG1vbmV5X2dldCBmYWNldHMKLQotX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQotCi0vLyBoZWxwZXIgZnVuY3Rpb25zIGZvciBkb19nZXQKLXRlbXBsYXRlIDxjbGFzcyBfSW5JdDEsIGNsYXNzIF9Jbkl0Mj4KLXBhaXI8X0luSXQxLCBib29sPiBfX2dldF9zdHJpbmcoIF9Jbkl0MSBfX2ZpcnN0LCBfSW5JdDEgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0luSXQyIF9fc3RyX2ZpcnN0LCBfSW5JdDIgX19zdHJfbGFzdCkgewotICB3aGlsZSAoIF9fZmlyc3QgIT0gX19sYXN0ICYmIF9fc3RyX2ZpcnN0ICE9IF9fc3RyX2xhc3QgJiYgKl9fZmlyc3QgPT0gKl9fc3RyX2ZpcnN0ICkgewotICAgICsrX19maXJzdDsKLSAgICArK19fc3RyX2ZpcnN0OwotICB9Ci0gIHJldHVybiBtYWtlX3BhaXIoX19maXJzdCwgX19zdHJfZmlyc3QgPT0gX19zdHJfbGFzdCk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfSW5JdCwgY2xhc3MgX091SXQsIGNsYXNzIF9DaGFyVD4KLWJvb2wKLV9fZ2V0X21vbmV0YXJ5X3ZhbHVlKF9Jbkl0JiBfX2ZpcnN0LCBfSW5JdCBfX2xhc3QsIF9PdUl0IF9fb3V0X2l0ZSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN0eXBlPF9DaGFyVD4mIF9jX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICBfQ2hhclQgX19wb2ludCwgaW50IF9fZnJhY19kaWdpdHMsIF9DaGFyVCBfX3NlcCwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgX19ncm91cGluZywgYm9vbCAmX19zeW50YXhfb2spIHsKLSAgaWYgKF9fZmlyc3QgPT0gX19sYXN0IHx8ICFfY190eXBlLmlzKGN0eXBlX2Jhc2U6OmRpZ2l0LCAqX19maXJzdCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGNoYXIgX19ncm91cF9zaXplc1sxMjhdOwotICBjaGFyKiBfX2dyb3VwX3NpemVzX2VuZCA9IF9fZ3JvdXBpbmcuZW1wdHkoKT8gMCA6IF9fZ3JvdXBfc2l6ZXM7Ci0gIGNoYXIgICBfX2N1cnJlbnRfZ3JvdXBfc2l6ZSA9IDA7Ci0KLSAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0KSB7Ci0gICAgaWYgKF9jX3R5cGUuaXMoY3R5cGVfYmFzZTo6ZGlnaXQsICpfX2ZpcnN0KSkgewotICAgICAgKytfX2N1cnJlbnRfZ3JvdXBfc2l6ZTsKLSAgICAgICpfX291dF9pdGUrKyA9ICpfX2ZpcnN0Kys7Ci0gICAgfQotICAgIGVsc2UgaWYgKF9fZ3JvdXBfc2l6ZXNfZW5kKSB7Ci0gICAgICBpZiAoKl9fZmlyc3QgPT0gX19zZXApIHsKLSAgICAgICAgKl9fZ3JvdXBfc2l6ZXNfZW5kKysgPSBfX2N1cnJlbnRfZ3JvdXBfc2l6ZTsKLSAgICAgICAgX19jdXJyZW50X2dyb3VwX3NpemUgPSAwOwotICAgICAgICArK19fZmlyc3Q7Ci0gICAgICB9Ci0gICAgICBlbHNlIGJyZWFrOwotICAgIH0KLSAgICBlbHNlCi0gICAgICBicmVhazsKLSAgfQotCi0gIGlmIChfX2dyb3VwaW5nLmVtcHR5KCkpCi0gICAgX19zeW50YXhfb2sgPSB0cnVlOwotICBlbHNlIHsKLSAgICBpZiAoX19ncm91cF9zaXplc19lbmQgIT0gX19ncm91cF9zaXplcykKLSAgICAgICpfX2dyb3VwX3NpemVzX2VuZCsrID0gX19jdXJyZW50X2dyb3VwX3NpemU7Ci0KLSAgICBfX3N5bnRheF9vayA9IF9fdmFsaWRfZ3JvdXBpbmcoX19ncm91cF9zaXplcywgX19ncm91cF9zaXplc19lbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZ3JvdXBpbmcuZGF0YSgpLCBfX2dyb3VwaW5nLmRhdGEoKSsgX19ncm91cGluZy5zaXplKCkpOwotCi0gICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0IHx8ICpfX2ZpcnN0ICE9IF9fcG9pbnQpIHsKLSAgICAgIGZvciAoaW50IF9fZGlnaXRzID0gMDsgX19kaWdpdHMgIT0gX19mcmFjX2RpZ2l0czsgKytfX2RpZ2l0cykKLSAgICAgICAgKl9fb3V0X2l0ZSsrID0gX0NoYXJUKCcwJyk7Ci0gICAgICByZXR1cm4gdHJ1ZTsgLy8gT0sgbm90IHRvIGhhdmUgZGVjaW1hbCBwb2ludAotICAgIH0KLSAgfQotCi0gICsrX19maXJzdDsKLQotICBpbnQgX19kaWdpdHMgPSAwOwotCi0gIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCAmJiBfY190eXBlLmlzKGN0eXBlX2Jhc2U6OmRpZ2l0LCAqX19maXJzdCkpIHsKLSAgICAgICpfX291dF9pdGUrKyA9ICpfX2ZpcnN0Kys7Ci0gICAgICsrX19kaWdpdHM7Ci0gIH0KLQotICBfX3N5bnRheF9vayA9IF9fc3ludGF4X29rICYmIChfX2RpZ2l0cyA9PSBfX2ZyYWNfZGlnaXRzKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfU3RyVHlwZT4KLV9JbnB1dEl0ZXIgX19tb25leV9kb19nZXQoX0lucHV0SXRlciBfX3MsIF9JbnB1dEl0ZXIgX19lbmQsIGJvb2wgIF9faW50bCwKLSAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlJiAgX19zdHIsIGlvc19iYXNlOjppb3N0YXRlJiAgX19lcnIsCi0gICAgICAgICAgICAgICAgICAgICBfU3RyVHlwZSYgX19kaWdpdHMsIGJvb2wgJl9faXNfcG9zaXRpdmUsIF9DaGFyVCogLypfX2R1bW15Ki8pIHsKLSAgaWYgKF9fcyA9PSBfX2VuZCkgewotICAgIF9fZXJyIHw9IGlvc19iYXNlOjplb2ZiaXQ7Ci0gICAgcmV0dXJuIF9fczsKLSAgfQotCi0gIHR5cGVkZWYgX0NoYXJUIGNoYXJfdHlwZTsKLSAgdHlwZWRlZiBfU3RyVHlwZSBzdHJpbmdfdHlwZTsKLSAgdHlwZWRlZiBfSW5wdXRJdGVyIGl0ZXJfdHlwZTsKLSAgdHlwZWRlZiBtb25leXB1bmN0PGNoYXJfdHlwZSwgZmFsc2U+IF9QdW5jdDsKLSAgdHlwZWRlZiBtb25leXB1bmN0PGNoYXJfdHlwZSwgdHJ1ZT4gIF9QdW5jdF9pbnRsOwotICB0eXBlZGVmIGN0eXBlPGNoYXJfdHlwZT4gICAgICAgICAgICAgX0N0eXBlOwotCi0gIGxvY2FsZSBfX2xvYyA9IF9fc3RyLmdldGxvYygpOwotICBjb25zdCBfUHVuY3QmICAgICAgX19wdW5jdCAgICAgID0gdXNlX2ZhY2V0PF9QdW5jdD4oX19sb2MpIDsKLSAgY29uc3QgX1B1bmN0X2ludGwmIF9fcHVuY3RfaW50bCA9IHVzZV9mYWNldDxfUHVuY3RfaW50bD4oX19sb2MpIDsKLSAgY29uc3QgX0N0eXBlJiAgICAgIF9fY190eXBlICAgICA9IHVzZV9mYWNldDxfQ3R5cGU+KF9fbG9jKSA7Ci0KLSAgbW9uZXlfYmFzZTo6cGF0dGVybiBfX2Zvcm1hdCA9IF9faW50bCA/IF9fcHVuY3RfaW50bC5uZWdfZm9ybWF0KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF9fcHVuY3QubmVnX2Zvcm1hdCgpOwotICBzdHJpbmdfdHlwZSBfX25zID0gX19pbnRsID8gX19wdW5jdF9pbnRsLm5lZ2F0aXZlX3NpZ24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX19wdW5jdC5uZWdhdGl2ZV9zaWduKCk7Ci0gIHN0cmluZ190eXBlIF9fcHMgPSBfX2ludGwgPyBfX3B1bmN0X2ludGwucG9zaXRpdmVfc2lnbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfX3B1bmN0LnBvc2l0aXZlX3NpZ24oKTsKLSAgaW50IF9faTsKLSAgYm9vbCBfX3N5bWJvbF9yZXF1aXJlZCA9IChfX3N0ci5mbGFncygpICYgaW9zX2Jhc2U6OnNob3diYXNlKSAhPSAwOwotICBzdHJpbmdfdHlwZSBfX2J1ZjsKLSAgYmFja19pbnNlcnRfaXRlcmF0b3I8c3RyaW5nX3R5cGU+IF9fb3V0X2l0ZShfX2J1Zik7Ci0KLSAgZm9yIChfX2kgPSAwOyBfX2kgPCA0OyArK19faSkgewotICAgIHN3aXRjaCAoX19mb3JtYXQuZmllbGRbX19pXSkgewotICAgIGNhc2UgbW9uZXlfYmFzZTo6bm9uZToKLSAgICAgIGlmIChfX2kgPT0gMykgewotICAgICAgICBpZiAoX19jX3R5cGUuaXMoY3R5cGVfYmFzZTo6c3BhY2UsICpfX3MpKSB7Ci0gICAgICAgICAgX19lcnIgPSBpb3NfYmFzZTo6ZmFpbGJpdDsKLSAgICAgICAgICByZXR1cm4gX19zOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgd2hpbGUgKF9fcyAhPSBfX2VuZCAmJiBfX2NfdHlwZS5pcyhjdHlwZV9iYXNlOjpzcGFjZSwgKl9fcykpCi0gICAgICAgICsrX19zOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBtb25leV9iYXNlOjpzcGFjZToKLSAgICAgIGlmICghX19jX3R5cGUuaXMoY3R5cGVfYmFzZTo6c3BhY2UsICpfX3MpKSB7Ci0gICAgICAgIF9fZXJyID0gaW9zX2Jhc2U6OmZhaWxiaXQ7Ci0gICAgICAgIHJldHVybiBfX3M7Ci0gICAgICB9Ci0gICAgICArK19fczsKLSAgICAgIHdoaWxlIChfX3MgIT0gX19lbmQgJiYgX19jX3R5cGUuaXMoY3R5cGVfYmFzZTo6c3BhY2UsICpfX3MpKQotICAgICAgICArK19fczsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbW9uZXlfYmFzZTo6c3ltYm9sOiB7Ci0gICAgICBzdHJpbmdfdHlwZSBfX2N1cnMgPSBfX2ludGwgPyBfX3B1bmN0X2ludGwuY3Vycl9zeW1ib2woKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX19wdW5jdC5jdXJyX3N5bWJvbCgpOwotICAgICAgcGFpcjxpdGVyX3R5cGUsIGJvb2w+Ci0gICAgICBfX3Jlc3VsdCAgPSBfX2dldF9zdHJpbmcoX19zLCBfX2VuZCwgX19jdXJzLmJlZ2luKCksIF9fY3Vycy5lbmQoKSk7Ci0gICAgICBpZiAoIV9fcmVzdWx0LnNlY29uZCAmJiBfX3N5bWJvbF9yZXF1aXJlZCkKLSAgICAgICAgX19lcnIgPSBpb3NfYmFzZTo6ZmFpbGJpdDsKLSAgICAgIF9fcyA9IF9fcmVzdWx0LmZpcnN0OwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgbW9uZXlfYmFzZTo6c2lnbjogewotICAgICAgaWYgKF9fcyA9PSBfX2VuZCkgewotICAgICAgICBpZiAoX19wcy5lbXB0eSgpKQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBpZiAoX19ucy5lbXB0eSgpKSB7Ci0gICAgICAgICAgX19pc19wb3NpdGl2ZSA9IGZhbHNlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIF9fZXJyID0gaW9zX2Jhc2U6OmZhaWxiaXQ7Ci0gICAgICAgIHJldHVybiBfX3M7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgaWYgKF9fcHMuZW1wdHkoKSkgewotICAgICAgICAgIGlmIChfX25zLmVtcHR5KCkpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBpZiAoKl9fcyA9PSBfX25zWzBdKSB7Ci0gICAgICAgICAgICArK19fczsKLSAgICAgICAgICAgIF9faXNfcG9zaXRpdmUgPSBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgaWYgKCpfX3MgPT0gX19wc1swXSkgewotICAgICAgICAgICAgKytfX3M7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKF9fbnMuZW1wdHkoKSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGlmICgqX19zID09IF9fbnNbMF0pIHsKLSAgICAgICAgICAgICsrX19zOwotICAgICAgICAgICAgX19pc19wb3NpdGl2ZSA9IGZhbHNlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIF9fZXJyID0gaW9zX2Jhc2U6OmZhaWxiaXQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBfX3M7Ci0gICAgfQotICAgIGNhc2UgbW9uZXlfYmFzZTo6dmFsdWU6IHsKLSAgICAgIGNoYXJfdHlwZSBfX3BvaW50ID0gX19pbnRsID8gX19wdW5jdF9pbnRsLmRlY2ltYWxfcG9pbnQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfX3B1bmN0LmRlY2ltYWxfcG9pbnQoKTsKLSAgICAgIGludCBfX2ZyYWNfZGlnaXRzID0gX19pbnRsID8gX19wdW5jdF9pbnRsLmZyYWNfZGlnaXRzKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX19wdW5jdC5mcmFjX2RpZ2l0cygpOwotICAgICAgc3RyaW5nIF9fZ3JvdXBpbmcgPSBfX2ludGwgPyBfX3B1bmN0X2ludGwuZ3JvdXBpbmcoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfX3B1bmN0Lmdyb3VwaW5nKCk7Ci0gICAgICBib29sIF9fc3ludGF4X29rID0gdHJ1ZTsKLQotICAgICAgYm9vbCBfX3Jlc3VsdDsKLQotICAgICAgY2hhcl90eXBlIF9fc2VwID0gX19ncm91cGluZy5lbXB0eSgpID8gY2hhcl90eXBlKCkgOgotICAgICAgX19pbnRsID8gX19wdW5jdF9pbnRsLnRob3VzYW5kc19zZXAoKSA6IF9fcHVuY3QudGhvdXNhbmRzX3NlcCgpOwotCi0gICAgICBfX3Jlc3VsdCA9IF9fZ2V0X21vbmV0YXJ5X3ZhbHVlKF9fcywgX19lbmQsIF9fb3V0X2l0ZSwgX19jX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcG9pbnQsIF9fZnJhY19kaWdpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fc2VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2dyb3VwaW5nLCBfX3N5bnRheF9vayk7Ci0KLSAgICAgIGlmICghX19zeW50YXhfb2spCi0gICAgICAgIF9fZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OwotICAgICAgaWYgKCFfX3Jlc3VsdCkgewotICAgICAgICBfX2VyciA9IGlvc19iYXNlOjpmYWlsYml0OwotICAgICAgICByZXR1cm4gX19zOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2xvc2UgbW9uZXlfYmFzZTo6dmFsdWUgY2FzZQotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDbG9zZSBzd2l0Y2ggc3RhdGVtZW50Ci0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsb3NlIGZvciBsb29wCi0KLSAgaWYgKF9faXNfcG9zaXRpdmUpIHsKLSAgICBpZiAoX19wcy5zaXplKCkgPiAxKSB7Ci0gICAgICBwYWlyPF9JbnB1dEl0ZXIsIGJvb2w+Ci0gICAgICAgIF9fcmVzdWx0ID0gX19nZXRfc3RyaW5nKF9fcywgX19lbmQsIF9fcHMuYmVnaW4oKSArIDEsIF9fcHMuZW5kKCkpOwotICAgICAgX19zID0gX19yZXN1bHQuZmlyc3Q7Ci0gICAgICBpZiAoIV9fcmVzdWx0LnNlY29uZCkKLSAgICAgICAgX19lcnIgfD0gaW9zOjpmYWlsYml0OwotICAgIH0KLSAgICBpZiAoIShfX2VyciAmIGlvc19iYXNlOjpmYWlsYml0KSkKLSAgICAgIF9fZGlnaXRzID0gX19idWY7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgaWYgKF9fbnMuc2l6ZSgpID4gMSkgewotICAgICAgcGFpcjxfSW5wdXRJdGVyLCBib29sPgotICAgICAgICBfX3Jlc3VsdCA9IF9fZ2V0X3N0cmluZyhfX3MsIF9fZW5kLCBfX25zLmJlZ2luKCkgKyAxLCBfX25zLmVuZCgpKTsKLSAgICAgIF9fcyA9IF9fcmVzdWx0LmZpcnN0OwotICAgICAgaWYgKCFfX3Jlc3VsdC5zZWNvbmQpCi0gICAgICAgIF9fZXJyIHw9IGlvczo6ZmFpbGJpdDsKLSAgICB9Ci0gICAgaWYgKCEoX19lcnIgJiBpb3M6OmZhaWxiaXQpKSB7Ci0gICAgICBfX2RpZ2l0cyA9IF9fY190eXBlLndpZGVuKCctJyk7Ci0gICAgICBfX2RpZ2l0cyArPSBfX2J1ZjsKLSAgICB9Ci0gIH0KLSAgaWYgKF9fcyA9PSBfX2VuZCkKLSAgICBfX2VyciB8PSBpb3M6OmVvZmJpdDsKLQotICByZXR1cm4gX19zOwotfQotCi1fU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKLQotLy89PT09PSBtZXRob2RzID09PT09PQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0lucHV0SXRlcj4KLV9JbnB1dEl0ZXIKLW1vbmV5X2dldDxfQ2hhclQsIF9JbnB1dEl0ZXI+Ojpkb19nZXQoX0lucHV0SXRlciBfX3MsIF9JbnB1dEl0ZXIgIF9fZW5kLCBib29sICBfX2ludGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlJiAgX19zdHIsIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfTE9OR0VTVF9GTE9BVF9UWVBFJiBfX3VuaXRzKSBjb25zdCB7Ci0gIHN0cmluZ190eXBlIF9fYnVmOwotICBib29sIF9faXNfcG9zaXRpdmUgPSB0cnVlOwotICBfX3MgPSBfU1RMUF9QUklWIF9fbW9uZXlfZG9fZ2V0KF9fcywgX19lbmQsIF9faW50bCwgX19zdHIsIF9fZXJyLCBfX2J1ZiwgX19pc19wb3NpdGl2ZSwgKF9DaGFyVCopMCk7Ci0KLSAgaWYgKF9fZXJyID09IGlvc19iYXNlOjpnb29kYml0IHx8IF9fZXJyID09IGlvc19iYXNlOjplb2ZiaXQpIHsKLSAgICB0eXBlbmFtZSBzdHJpbmdfdHlwZTo6aXRlcmF0b3IgX19iID0gX19idWYuYmVnaW4oKSwgX19lID0gX19idWYuZW5kKCk7Ci0KLSAgICBpZiAoIV9faXNfcG9zaXRpdmUpICsrX19iOwotICAgIC8vIENhbid0IHVzZSBhdG9sZCwgc2luY2UgaXQgbWlnaHQgYmUgd2NoYXJfdC4gRG9uJ3QgZ2V0IGNvbmZ1c2VkIGJ5IG5hbWUgYmVsb3cgOgotICAgIC8vIGl0J3MgcGVyZmVjdGx5IGNhcGFibGUgb2YgcmVhZGluZyBsb25nIGRvdWJsZS4KLSAgICBfU1RMUF9QUklWIF9fZ2V0X2RlY2ltYWxfaW50ZWdlcihfX2IsIF9fZSwgX191bml0cywgKF9DaGFyVCopMCk7Ci0KLSAgICBpZiAoIV9faXNfcG9zaXRpdmUpIHsKLSAgICAgIF9fdW5pdHMgPSAtX191bml0czsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gX19zOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfSW5wdXRJdGVyPgotX0lucHV0SXRlcgotbW9uZXlfZ2V0PF9DaGFyVCwgX0lucHV0SXRlcj46OmRvX2dldChpdGVyX3R5cGUgX19zLCBpdGVyX3R5cGUgIF9fZW5kLCBib29sICBfX2ludGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlJiAgX19zdHIsIGlvc19iYXNlOjppb3N0YXRlJiAgX19lcnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ190eXBlJiBfX2RpZ2l0cykgY29uc3QgewotICBib29sIF9faXNfcG9zaXRpdmUgPSB0cnVlOwotICByZXR1cm4gX1NUTFBfUFJJViBfX21vbmV5X2RvX2dldChfX3MsIF9fZW5kLCBfX2ludGwsIF9fc3RyLCBfX2VyciwgX19kaWdpdHMsIF9faXNfcG9zaXRpdmUsIChfQ2hhclQqKTApOwotfQotCi0vLyBtb25leV9wdXQgZmFjZXRzCi0KLV9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX091dHB1dEl0ZXIsIGNsYXNzIF9TdHJfVHlwZSwgY2xhc3MgX1N0cj4KLV9PdXRwdXRJdGVyIF9fbW9uZXlfZG9fcHV0KF9PdXRwdXRJdGVyIF9fcywgYm9vbCAgX19pbnRsLCBpb3NfYmFzZSYgIF9fc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NoYXJUIF9fZmlsbCwgY29uc3QgX1N0ciYgX19kaWdpdHMsIGJvb2wgX19jaGVja19kaWdpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBfU3RyX1R5cGUgKiAvKl9fZHVtbXkqLykgewotICB0eXBlZGVmIF9DaGFyVCBjaGFyX3R5cGU7Ci0gIHR5cGVkZWYgX1N0cl9UeXBlIHN0cmluZ190eXBlOwotICB0eXBlZGVmIGN0eXBlPGNoYXJfdHlwZT4gICAgICAgICAgICAgX0N0eXBlOwotICB0eXBlZGVmIG1vbmV5cHVuY3Q8Y2hhcl90eXBlLCBmYWxzZT4gX1B1bmN0OwotICB0eXBlZGVmIG1vbmV5cHVuY3Q8Y2hhcl90eXBlLCB0cnVlPiAgX1B1bmN0X2ludGw7Ci0KLSAgbG9jYWxlIF9fbG9jID0gX19zdHIuZ2V0bG9jKCk7Ci0gIGNvbnN0IF9DdHlwZSYgICAgICBfX2NfdHlwZSAgICAgPSB1c2VfZmFjZXQ8X0N0eXBlPihfX2xvYykgOwotICBjb25zdCBfUHVuY3QmICAgICAgX19wdW5jdCAgICAgID0gdXNlX2ZhY2V0PF9QdW5jdD4oX19sb2MpIDsKLSAgY29uc3QgX1B1bmN0X2ludGwmIF9fcHVuY3RfaW50bCA9IHVzZV9mYWNldDxfUHVuY3RfaW50bD4oX19sb2MpIDsKLQotICAvLyBzb21lIHNwZWNpYWwgY2hhcmFjdGVycwotICBjaGFyX3R5cGUgX19taW51cyA9IF9fY190eXBlLndpZGVuKCctJyk7Ci0gIGNoYXJfdHlwZSBfX3BsdXMgID0gX19jX3R5cGUud2lkZW4oJysnKTsKLSAgY2hhcl90eXBlIF9fc3BhY2UgPSBfX2NfdHlwZS53aWRlbignICcpOwotICBjaGFyX3R5cGUgX196ZXJvICA9IF9fY190eXBlLndpZGVuKCcwJyk7Ci0gIGNoYXJfdHlwZSBfX3BvaW50ID0gX19pbnRsID8gX19wdW5jdF9pbnRsLmRlY2ltYWxfcG9pbnQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF9fcHVuY3QuZGVjaW1hbF9wb2ludCgpOwotCi0gIGNoYXJfdHlwZSBfX3NlcCA9IF9faW50bCA/IF9fcHVuY3RfaW50bC50aG91c2FuZHNfc2VwKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX19wdW5jdC50aG91c2FuZHNfc2VwKCk7Ci0KLSAgc3RyaW5nIF9fZ3JvdXBpbmcgPSBfX2ludGwgPyBfX3B1bmN0X2ludGwuZ3JvdXBpbmcoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF9fcHVuY3QuZ3JvdXBpbmcoKTsKLQotICBpbnQgX19mcmFjX2RpZ2l0cyAgICAgID0gX19pbnRsID8gX19wdW5jdF9pbnRsLmZyYWNfZGlnaXRzKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF9fcHVuY3QuZnJhY19kaWdpdHMoKTsKLQotICBzdHJpbmdfdHlwZSBfX2N1cnJfc3ltID0gX19pbnRsID8gX19wdW5jdF9pbnRsLmN1cnJfc3ltYm9sKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF9fcHVuY3QuY3Vycl9zeW1ib2woKTsKLQotICAvLyBpZiB0aGVyZSBhcmUgbm8gZGlnaXRzIHdlIGFyZSBnb2luZyB0byByZXR1cm4gX19zLiAgSWYgdGhlcmUKLSAgLy8gYXJlIGRpZ2l0cywgYnV0IG5vdCBlbm91Z2ggdG8gZmlsbCB0aGUgZnJhY19kaWdpdHMsIHdlIGFyZQotICAvLyBnb2luZyB0byBhZGQgemVyb3MuICBJIGRvbid0IGtub3cgd2hldGhlciB0aGlzIGlzIHJpZ2h0IG9yCi0gIC8vIG5vdC4KLSAgaWYgKF9fZGlnaXRzLmVtcHR5KCkpCi0gICAgcmV0dXJuIF9fczsKLQotICB0eXBlbmFtZSBzdHJpbmdfdHlwZTo6Y29uc3RfaXRlcmF0b3IgX19kaWdpdHNfZmlyc3QgPSBfX2RpZ2l0cy5iZWdpbigpOwotICB0eXBlbmFtZSBzdHJpbmdfdHlwZTo6Y29uc3RfaXRlcmF0b3IgX19kaWdpdHNfbGFzdCAgPSBfX2RpZ2l0cy5lbmQoKTsKLQotICBib29sIF9faXNfbmVnYXRpdmUgPSAqX19kaWdpdHNfZmlyc3QgPT0gX19taW51czsKLSAgaWYgKF9faXNfbmVnYXRpdmUpCi0gICAgKytfX2RpZ2l0c19maXJzdDsKLQotI2lmICFkZWZpbmVkIChfX0JPUkxBTkRDX18pCi0gIHN0cmluZ190eXBlIF9fc2lnbiA9IF9faW50bCA/IF9faXNfbmVnYXRpdmUgPyBfX3B1bmN0X2ludGwubmVnYXRpdmVfc2lnbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfX3B1bmN0X2ludGwucG9zaXRpdmVfc2lnbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF9faXNfbmVnYXRpdmUgPyBfX3B1bmN0Lm5lZ2F0aXZlX3NpZ24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX19wdW5jdC5wb3NpdGl2ZV9zaWduKCk7Ci0jZWxzZQotICBzdHJpbmdfdHlwZSBfX3NpZ247Ci0gIGlmIChfX2ludGwpIHsKLSAgICBpZiAoX19pc19uZWdhdGl2ZSkKLSAgICAgIF9fc2lnbiA9IF9fcHVuY3RfaW50bC5uZWdhdGl2ZV9zaWduKCk7Ci0gICAgZWxzZQotICAgICAgX19zaWduID0gX19wdW5jdF9pbnRsLnBvc2l0aXZlX3NpZ24oKTsKLSAgfQotICBlbHNlIHsKLSAgICBpZiAoX19pc19uZWdhdGl2ZSkKLSAgICAgIF9fc2lnbiA9IF9fcHVuY3QubmVnYXRpdmVfc2lnbigpOwotICAgIGVsc2UKLSAgICAgIF9fc2lnbiA9IF9fcHVuY3QucG9zaXRpdmVfc2lnbigpOwotICB9Ci0jZW5kaWYKLQotICBpZiAoX19jaGVja19kaWdpdHMpIHsKLSAgICB0eXBlbmFtZSBzdHJpbmdfdHlwZTo6Y29uc3RfaXRlcmF0b3IgX19jcCA9IF9fZGlnaXRzX2ZpcnN0OwotICAgIHdoaWxlIChfX2NwICE9IF9fZGlnaXRzX2xhc3QgJiYgX19jX3R5cGUuaXMoY3R5cGVfYmFzZTo6ZGlnaXQsICpfX2NwKSkKLSAgICAgICsrX19jcDsKLSAgICBpZiAoX19jcCA9PSBfX2RpZ2l0c19maXJzdCkKLSAgICAgIHJldHVybiBfX3M7Ci0gICAgX19kaWdpdHNfbGFzdCA9IF9fY3A7Ci0gIH0KLQotICAvLyBJZiBncm91cGluZyBpcyByZXF1aXJlZCwgd2UgbWFrZSBhIGNvcHkgb2YgX19kaWdpdHMgYW5kCi0gIC8vIGluc2VydCB0aGUgZ3JvdXBpbmcuCi0gIF9TVExQX0JBU0lDX0lPU1RSSU5HKGNoYXJfdHlwZSkgX19uZXdfZGlnaXRzOwotICBpZiAoIV9fZ3JvdXBpbmcuZW1wdHkoKSkgewotICAgIF9fbmV3X2RpZ2l0cy5hc3NpZ24oX19kaWdpdHNfZmlyc3QsIF9fZGlnaXRzX2xhc3QpOwotICAgIF9faW5zZXJ0X2dyb3VwaW5nKF9fbmV3X2RpZ2l0cywKLSAgICAgICAgICAgICAgICAgICAgICBfX25ld19kaWdpdHMuc2l6ZSgpIC0gX19mcmFjX2RpZ2l0cywKLSAgICAgICAgICAgICAgICAgICAgICBfX2dyb3VwaW5nLAotICAgICAgICAgICAgICAgICAgICAgIF9fc2VwLCBfX3BsdXMsIF9fbWludXMsIDApOwotICAgIF9fZGlnaXRzX2ZpcnN0ID0gX19uZXdfZGlnaXRzLmJlZ2luKCk7IC8vIDw8LS0KLSAgICBfX2RpZ2l0c19sYXN0ICA9IF9fbmV3X2RpZ2l0cy5lbmQoKTsgICAvLyA8PC0tCi0gIH0KLQotICAvLyBEZXRlcm1pbmUgdGhlIGFtb3VudCBvZiBwYWRkaW5nIHJlcXVpcmVkLCBpZiBhbnkuCi0gIHN0cmVhbXNpemUgX193aWR0aCA9IF9fc3RyLndpZHRoKCk7Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9ERUJVRykgJiYgKGRlZmluZWQoX19IUF9hQ0MpICYmIChfX0hQX2FDQyA8PSAxKSkKLSAgc2l6ZV90IF9fdmFsdWVfbGVuZ3RoID0gb3BlcmF0b3IgLShfX2RpZ2l0c19sYXN0LCBfX2RpZ2l0c19maXJzdCk7Ci0jZWxzZQotICBzaXplX3QgX192YWx1ZV9sZW5ndGggPSBfX2RpZ2l0c19sYXN0IC0gX19kaWdpdHNfZmlyc3Q7Ci0jZW5kaWYKLQotICBzaXplX3QgX19sZW5ndGggPSBfX3ZhbHVlX2xlbmd0aCArIF9fc2lnbi5zaXplKCk7Ci0KLSAgaWYgKF9fZnJhY19kaWdpdHMgIT0gMCkKLSAgICArK19fbGVuZ3RoOwotCi0gIGJvb2wgX19nZW5lcmF0ZV9jdXJyID0gKF9fc3RyLmZsYWdzKCkgJiBpb3NfYmFzZTo6c2hvd2Jhc2UpICE9MDsKLSAgaWYgKF9fZ2VuZXJhdGVfY3VycikKLSAgICBfX2xlbmd0aCArPSBfX2N1cnJfc3ltLnNpemUoKTsKLSAgbW9uZXlfYmFzZTo6cGF0dGVybiBfX2Zvcm1hdCA9IF9faW50bCA/IChfX2lzX25lZ2F0aXZlID8gX19wdW5jdF9pbnRsLm5lZ19mb3JtYXQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfX3B1bmN0X2ludGwucG9zX2Zvcm1hdCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKF9faXNfbmVnYXRpdmUgPyBfX3B1bmN0Lm5lZ19mb3JtYXQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfX3B1bmN0LnBvc19mb3JtYXQoKSk7Ci0gIHsKLSAgICAvL0ZvciB0aGUgbW9tZW50IHRoZSBmb2xsb3dpbmcgaXMgY29tbWVudGVkIGZvciBkZWNvZGluZyByZWFzb24uCi0gICAgLy9ObyByZWFzb24gdG8gYWRkIGEgc3BhY2UgbGFzdCBpZiB0aGUgbW9uZXkgc3ltYm9sIGRvIG5vdCBoYXZlIHRvIGJlIGRpc3BsYXkKLSAgICAvL2lmIChfX2Zvcm1hdC5maWVsZFszXSA9PSAoY2hhcikgbW9uZXlfYmFzZTo6c3ltYm9sICYmICFfX2dlbmVyYXRlX2N1cnIpIHsKLSAgICAvLyAgaWYgKF9fZm9ybWF0LmZpZWxkWzJdID09IChjaGFyKSBtb25leV9iYXNlOjpzcGFjZSkgewotICAgIC8vICAgIF9fZm9ybWF0LmZpZWxkWzJdID0gKGNoYXIpIG1vbmV5X2Jhc2U6Om5vbmU7Ci0gICAgLy8gIH0KLSAgICAvL30KLSAgICAvL3NwYWNlIGNhbiBvbmx5IGJlIHNlY29uZCBvciB0aGlyZCBhbmQgb25seSBvbmNlICgyMi4yLjYuMy0xKToKLSAgICBpZiAoKF9fZm9ybWF0LmZpZWxkWzFdID09IChjaGFyKSBtb25leV9iYXNlOjpzcGFjZSkgfHwKLSAgICAgICAgKF9fZm9ybWF0LmZpZWxkWzJdID09IChjaGFyKSBtb25leV9iYXNlOjpzcGFjZSkpCi0gICAgICArK19fbGVuZ3RoOwotICB9Ci0KLSAgY29uc3QgYm9vbCBfX25lZWRfZmlsbCA9ICgoKHNpemVvZihzdHJlYW1zaXplKSA+IHNpemVvZihzaXplX3QpKSAmJiAoX19TVEFUSUNfQ0FTVChzdHJlYW1zaXplLCBfX2xlbmd0aCkgPCBfX3dpZHRoKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHNpemVvZihzdHJlYW1zaXplKSA8PSBzaXplb2Yoc2l6ZV90KSkgJiYgKF9fbGVuZ3RoIDwgX19TVEFUSUNfQ0FTVChzaXplX3QsIF9fd2lkdGgpKSkpOwotICBzdHJlYW1zaXplIF9fZmlsbF9hbXQgPSBfX25lZWRfZmlsbCA/IF9fd2lkdGggLSBfX2xlbmd0aCA6IDA7Ci0KLSAgaW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmlsbF9wb3MgPSBfX3N0ci5mbGFncygpICYgaW9zX2Jhc2U6OmFkanVzdGZpZWxkOwotCi0gIGlmIChfX2ZpbGxfYW10ICE9IDAgJiYKLSAgICAgICEoX19maWxsX3BvcyAmIChpb3NfYmFzZTo6bGVmdCB8IGlvc19iYXNlOjppbnRlcm5hbCkpKQotICAgIF9fcyA9IF9fZmlsbF9uKF9fcywgX19maWxsX2FtdCwgX19maWxsKTsKLQotICBmb3IgKGludCBfX2kgPSAwOyBfX2kgPCA0OyArK19faSkgewotICAgIGNoYXIgX19mZmllbGQgPSBfX2Zvcm1hdC5maWVsZFtfX2ldOwotICAgIHN3aXRjaCAoX19mZmllbGQpIHsKLSAgICAgIGNhc2UgbW9uZXlfYmFzZTo6bm9uZToKLSAgICAgICAgaWYgKF9fZmlsbF9hbXQgIT0gMCAmJiBfX2ZpbGxfcG9zID09IGlvc19iYXNlOjppbnRlcm5hbCkKLSAgICAgICAgICBfX3MgPSBfX2ZpbGxfbihfX3MsIF9fZmlsbF9hbXQsIF9fZmlsbCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBtb25leV9iYXNlOjpzcGFjZToKLSAgICAgICAgKl9fcysrID0gX19zcGFjZTsKLSAgICAgICAgaWYgKF9fZmlsbF9hbXQgIT0gMCAmJiBfX2ZpbGxfcG9zID09IGlvc19iYXNlOjppbnRlcm5hbCkKLSAgICAgICAgICBfX3MgPSBfX2ZpbGxfbihfX3MsIF9fZmlsbF9hbXQsIF9fZmlsbCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBtb25leV9iYXNlOjpzeW1ib2w6Ci0gICAgICAgIGlmIChfX2dlbmVyYXRlX2N1cnIpCi0gICAgICAgICAgX19zID0gY29weShfX2N1cnJfc3ltLmJlZ2luKCksIF9fY3Vycl9zeW0uZW5kKCksIF9fcyk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBtb25leV9iYXNlOjpzaWduOgotICAgICAgICBpZiAoIV9fc2lnbi5lbXB0eSgpKQotICAgICAgICAgICpfX3MrKyA9IF9fc2lnblswXTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIG1vbmV5X2Jhc2U6OnZhbHVlOgotICAgICAgICBpZiAoX19mcmFjX2RpZ2l0cyA9PSAwKSB7Ci0gICAgICAgICAgX19zID0gY29weShfX2RpZ2l0c19maXJzdCwgX19kaWdpdHNfbGFzdCwgX19zKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAoKGludClfX3ZhbHVlX2xlbmd0aCA8PSBfX2ZyYWNfZGlnaXRzKSB7Ci0gICAgICAgICAgICAvLyBpZiB3ZSBzZWUgJzknIGhlcmUsIHdlIHNob3VsZCBvdXQgMC4wOQotICAgICAgICAgICAgKl9fcysrID0gX196ZXJvOyAgLy8gaW50ZWdlciBwYXJ0IGlzIHplcm8KLSAgICAgICAgICAgICpfX3MrKyA9IF9fcG9pbnQ7IC8vIGRlY2ltYWwgcG9pbnQKLSAgICAgICAgICAgIF9fcyA9ICBfX2ZpbGxfbihfX3MsIF9fZnJhY19kaWdpdHMgLSBfX3ZhbHVlX2xlbmd0aCwgX196ZXJvKTsgLy8gemVyb3MKLSAgICAgICAgICAgIF9fcyA9IGNvcHkoX19kaWdpdHNfZmlyc3QsIF9fZGlnaXRzX2xhc3QsIF9fcyk7IC8vIGRpZ2l0cwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBfX3MgPSBjb3B5KF9fZGlnaXRzX2ZpcnN0LCBfX2RpZ2l0c19sYXN0IC0gX19mcmFjX2RpZ2l0cywgX19zKTsKLSAgICAgICAgICAgIGlmIChfX2ZyYWNfZGlnaXRzICE9IDApIHsKLSAgICAgICAgICAgICAgKl9fcysrID0gX19wb2ludDsKLSAgICAgICAgICAgICAgX19zID0gY29weShfX2RpZ2l0c19sYXN0IC0gX19mcmFjX2RpZ2l0cywgX19kaWdpdHNfbGFzdCwgX19zKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgfSAvL0Nsb3NlIGZvciBzd2l0Y2gKLSAgfSAvLyBDbG9zZSBmb3IgbG9vcAotCi0gIC8vIE91cHV0IHJlc3Qgb2Ygc2lnbiBpZiBuZWNlc3NhcnkuCi0gIGlmIChfX3NpZ24uc2l6ZSgpID4gMSkKLSAgICBfX3MgPSBjb3B5KF9fc2lnbi5iZWdpbigpICsgMSwgX19zaWduLmVuZCgpLCBfX3MpOwotICBpZiAoX19maWxsX2FtdCAhPSAwICYmCi0gICAgICAhKF9fZmlsbF9wb3MgJiAoaW9zX2Jhc2U6OnJpZ2h0IHwgaW9zX2Jhc2U6OmludGVybmFsKSkpCi0gICAgX19zID0gX19maWxsX24oX19zLCBfX2ZpbGxfYW10LCBfX2ZpbGwpOwotCi0gIHJldHVybiBfX3M7Ci19Ci0KLV9TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfT3V0cHV0SXRlcj4KLV9PdXRwdXRJdGVyCi1tb25leV9wdXQ8X0NoYXJULCBfT3V0cHV0SXRlcj4KLSA6OmRvX3B1dChfT3V0cHV0SXRlciBfX3MsIGJvb2wgX19pbnRsLCBpb3NfYmFzZSYgX19zdHIsCi0gICAgICAgICAgY2hhcl90eXBlIF9fZmlsbCwgX1NUTFBfTE9OR0VTVF9GTE9BVF9UWVBFIF9fdW5pdHMpIGNvbnN0IHsKLSAgX1NUTFBfQkFTSUNfSU9TVFJJTkcoY2hhcl90eXBlKSBfX2RpZ2l0czsKLSAgX1NUTFBfUFJJViBfX2dldF9tb25leV9kaWdpdHMoX19kaWdpdHMsIF9fc3RyLCBfX3VuaXRzKTsKLSAgcmV0dXJuIF9TVExQX1BSSVYgX19tb25leV9kb19wdXQoX19zLCBfX2ludGwsIF9fc3RyLCBfX2ZpbGwsIF9fZGlnaXRzLCBmYWxzZSwgX19TVEFUSUNfQ0FTVChzdHJpbmdfdHlwZSosIDApKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX091dHB1dEl0ZXI+Ci1fT3V0cHV0SXRlcgotbW9uZXlfcHV0PF9DaGFyVCwgX091dHB1dEl0ZXI+Ci0gOjpkb19wdXQoX091dHB1dEl0ZXIgX19zLCBib29sIF9faW50bCwgaW9zX2Jhc2UmIF9fc3RyLAotICAgICAgICAgIGNoYXJfdHlwZSBfX2ZpbGwsIGNvbnN0IHN0cmluZ190eXBlJiBfX2RpZ2l0cykgY29uc3QgewotICByZXR1cm4gX1NUTFBfUFJJViBfX21vbmV5X2RvX3B1dChfX3MsIF9faW50bCwgX19zdHIsIF9fZmlsbCwgX19kaWdpdHMsIHRydWUsIF9fU1RBVElDX0NBU1Qoc3RyaW5nX3R5cGUqLCAwKSk7Ci19Ci0KLV9TVExQX0VORF9OQU1FU1BBQ0UKLQotI2VuZGlmIC8qIF9TVExQX01PTkVUQVJZX0MgKi8KLQotLy8gTG9jYWwgVmFyaWFibGVzOgotLy8gbW9kZTpDKysKLS8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9fbW9uZXRhcnkuaCBiL3N0bC9fbW9uZXRhcnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA2ZjJlOC4uMDAwMDAwMAotLS0gYS9zdGwvX21vbmV0YXJ5LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLS8vIFdBUk5JTkc6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIEMrKwotLy8gc3RhbmRhcmQgbGlicmFyeSBoZWFkZXJzLiAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgdGhpcyBoZWFkZXIKLS8vIGZpbGUgZGlyZWN0bHkuCi0KLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9NT05FVEFSWV9ICi0jZGVmaW5lIF9TVExQX0lOVEVSTkFMX01PTkVUQVJZX0gKLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DVFlQRV9ICi0jICBpbmNsdWRlIDxzdGwvX2N0eXBlLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9PU1RSRUFNQlVGX0lURVJBVE9SX0gKLSMgIGluY2x1ZGUgPHN0bC9fb3N0cmVhbWJ1Zl9pdGVyYXRvci5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfSVNUUkVBTUJVRl9JVEVSQVRPUl9ICi0jICBpbmNsdWRlIDxzdGwvX2lzdHJlYW1idWZfaXRlcmF0b3IuaD4KLSNlbmRpZgotCi1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLQotY2xhc3MgbW9uZXlfYmFzZSB7Ci1wdWJsaWM6Ci0gIGVudW0gcGFydCB7bm9uZSwgc3BhY2UsIHN5bWJvbCwgc2lnbiwgdmFsdWV9OwotICBzdHJ1Y3QgcGF0dGVybiB7Ci0gICAgY2hhciBmaWVsZFs0XTsKLSAgfTsKLX07Ci0KLS8vIG1vbmV5cHVuY3QgZmFjZXRzOiBmb3J3YXJkIGRlY2xhcmF0aW9uCi10ZW1wbGF0ZSA8Y2xhc3MgX2NoYXJULCBfU1RMUF9ERkxfTk9OX1RZUEVfUEFSQU0oYm9vbCwgX0ludGVybmF0aW9uYWwsIGZhbHNlKSA+IGNsYXNzIG1vbmV5cHVuY3Qge307Ci0KLS8vIG1vbmV5X2dldCBmYWNldHMKLQotI2lmIGRlZmluZWQgKF9TVExQX0xJTUlURURfREVGQVVMVF9URU1QTEFURVMpCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfSW5wdXRJdGVyPgotI2Vsc2UKLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9JbnB1dEl0ZXIgPSBpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVCwgY2hhcl90cmFpdHM8X0NoYXJUPiA+ID4KLSNlbmRpZgotY2xhc3MgbW9uZXlfZ2V0IDogcHVibGljIGxvY2FsZTo6ZmFjZXQgewotICBmcmllbmQgY2xhc3MgX0xvY2FsZV9pbXBsOwotCi1wdWJsaWM6Ci0gIHR5cGVkZWYgX0NoYXJUICAgICAgICAgICAgICAgY2hhcl90eXBlOwotICB0eXBlZGVmIF9JbnB1dEl0ZXIgICAgICAgICAgIGl0ZXJfdHlwZTsKLSAgdHlwZWRlZiBiYXNpY19zdHJpbmc8X0NoYXJULCBjaGFyX3RyYWl0czxfQ2hhclQ+LCBhbGxvY2F0b3I8X0NoYXJUPiA+IHN0cmluZ190eXBlOwotCi0gIG1vbmV5X2dldChzaXplX3QgX19yZWZzID0gMCkgOiBsb2NhbGU6OmZhY2V0KF9fcmVmcykge30KLSAgaXRlcl90eXBlIGdldChpdGVyX3R5cGUgX19zLCBpdGVyX3R5cGUgIF9fZW5kLCBib29sIF9faW50bCwKLSAgICAgICAgICAgICAgICBpb3NfYmFzZSYgIF9fc3RyLCBpb3NfYmFzZTo6aW9zdGF0ZSYgIF9fZXJyLAotICAgICAgICAgICAgICAgIF9TVExQX0xPTkdFU1RfRkxPQVRfVFlQRSYgX191bml0cykgY29uc3QKLSAgICB7IHJldHVybiBkb19nZXQoX19zLCAgX19lbmQsIF9faW50bCwgIF9fc3RyLCAgX19lcnIsIF9fdW5pdHMpOyB9Ci0gIGl0ZXJfdHlwZSBnZXQoaXRlcl90eXBlIF9fcywgaXRlcl90eXBlICBfX2VuZCwgYm9vbCBfX2ludGwsCi0gICAgICAgICAgICAgICAgaW9zX2Jhc2UmICBfX3N0ciwgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLAotICAgICAgICAgICAgICAgIHN0cmluZ190eXBlJiBfX2RpZ2l0cykgY29uc3QKLSAgICB7IHJldHVybiBkb19nZXQoX19zLCAgX19lbmQsIF9faW50bCwgIF9fc3RyLCAgX19lcnIsIF9fZGlnaXRzKTsgfQotCi0gIHN0YXRpYyBfU1RMUF9TVEFUSUNfTUVNQkVSX0RFQ0xTUEVDIGxvY2FsZTo6aWQgaWQ7Ci0KLXByb3RlY3RlZDoKLSAgfm1vbmV5X2dldCgpIHt9Ci0gIHZpcnR1YWwgaXRlcl90eXBlIGRvX2dldChpdGVyX3R5cGUgX19zLCBpdGVyX3R5cGUgIF9fZW5kLCBib29sICBfX2ludGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZSYgIF9fc3RyLCBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9MT05HRVNUX0ZMT0FUX1RZUEUmIF9fdW5pdHMpIGNvbnN0OwotICB2aXJ0dWFsIGl0ZXJfdHlwZSBkb19nZXQoaXRlcl90eXBlIF9fcywgaXRlcl90eXBlIF9fZW5kLCBib29sIF9faW50bCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlJiAgX19zdHIsIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ190eXBlJiBfX2RpZ2l0cykgY29uc3Q7Ci19OwotCi0KLS8vIG1vbmV5cHVuY3QgZmFjZXRzOiBkZWZpbml0aW9uIG9mIHNwZWNpYWxpemF0aW9ucwotCi1fU1RMUF9URU1QTEFURV9OVUxMCi1jbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBtb25leXB1bmN0PGNoYXIsIHRydWU+IDogcHVibGljIGxvY2FsZTo6ZmFjZXQsIHB1YmxpYyBtb25leV9iYXNlIHsKLQotcHVibGljOgotICB0eXBlZGVmIGNoYXIgICAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKLSAgdHlwZWRlZiBzdHJpbmcgICAgICAgICAgICAgICBzdHJpbmdfdHlwZTsKLSAgZXhwbGljaXQgbW9uZXlwdW5jdCBfU1RMUF9QU1BFQzIoY2hhciwgdHJ1ZSkgKHNpemVfdCBfX3JlZnMgPSAwKTsKLQotICBjaGFyICAgICAgICBkZWNpbWFsX3BvaW50KCkgY29uc3QgeyByZXR1cm4gZG9fZGVjaW1hbF9wb2ludCgpOyB9Ci0gIGNoYXIgICAgICAgIHRob3VzYW5kc19zZXAoKSBjb25zdCB7IHJldHVybiBkb190aG91c2FuZHNfc2VwKCk7IH0KLSAgc3RyaW5nICAgICAgZ3JvdXBpbmcoKSAgICAgIGNvbnN0IHsgcmV0dXJuIGRvX2dyb3VwaW5nKCk7IH0KLSAgc3RyaW5nX3R5cGUgY3Vycl9zeW1ib2woKSAgIGNvbnN0IHsgcmV0dXJuIGRvX2N1cnJfc3ltYm9sKCk7IH0KLSAgc3RyaW5nX3R5cGUgcG9zaXRpdmVfc2lnbigpIGNvbnN0IHsgcmV0dXJuIGRvX3Bvc2l0aXZlX3NpZ24oKTsgfQotICBzdHJpbmdfdHlwZSBuZWdhdGl2ZV9zaWduKCkgY29uc3QgeyByZXR1cm4gZG9fbmVnYXRpdmVfc2lnbigpOyB9Ci0gIGludCAgICAgICAgIGZyYWNfZGlnaXRzKCkgICBjb25zdCB7IHJldHVybiBkb19mcmFjX2RpZ2l0cygpOyB9Ci0gIHBhdHRlcm4gICAgIHBvc19mb3JtYXQoKSAgICBjb25zdCB7IHJldHVybiBkb19wb3NfZm9ybWF0KCk7IH0KLSAgcGF0dGVybiAgICAgbmVnX2Zvcm1hdCgpICAgIGNvbnN0IHsgcmV0dXJuIGRvX25lZ19mb3JtYXQoKTsgfQotCi0gIHN0YXRpYyBfU1RMUF9TVEFUSUNfTUVNQkVSX0RFQ0xTUEVDIGxvY2FsZTo6aWQgaWQ7Ci0jIGlmIGRlZmluZWQgKF9TVExQX1NUQVRJQ19DT05TVF9JTklUX0JVRykKLSAgZW51bSBfSW50bFZhbCB7IGludGwgPSAxIH0gOwotIyBlbHNlCi0gIHN0YXRpYyBjb25zdCBib29sIGludGwgPSB0cnVlOwotIyBlbmRpZgotCi1wcm90ZWN0ZWQ6Ci0gIHBhdHRlcm4gX01fcG9zX2Zvcm1hdDsKLSAgcGF0dGVybiBfTV9uZWdfZm9ybWF0OwotCi0gIH5tb25leXB1bmN0IF9TVExQX1BTUEVDMihjaGFyLCB0cnVlKSAoKTsKLQotICB2aXJ0dWFsIGNoYXIgICAgICAgIGRvX2RlY2ltYWxfcG9pbnQoKSBjb25zdDsKLSAgdmlydHVhbCBjaGFyICAgICAgICBkb190aG91c2FuZHNfc2VwKCkgY29uc3Q7Ci0gIHZpcnR1YWwgc3RyaW5nICAgICAgZG9fZ3JvdXBpbmcoKSAgICAgIGNvbnN0OwotCi0gIHZpcnR1YWwgc3RyaW5nICAgICAgZG9fY3Vycl9zeW1ib2woKSAgIGNvbnN0OwotCi0gIHZpcnR1YWwgc3RyaW5nICAgICAgZG9fcG9zaXRpdmVfc2lnbigpIGNvbnN0OwotICB2aXJ0dWFsIHN0cmluZyAgICAgIGRvX25lZ2F0aXZlX3NpZ24oKSBjb25zdDsKLSAgdmlydHVhbCBpbnQgICAgICAgICBkb19mcmFjX2RpZ2l0cygpICAgY29uc3Q7Ci0gIHZpcnR1YWwgcGF0dGVybiAgICAgZG9fcG9zX2Zvcm1hdCgpICAgIGNvbnN0OwotICB2aXJ0dWFsIHBhdHRlcm4gICAgIGRvX25lZ19mb3JtYXQoKSAgICBjb25zdDsKLQotICBmcmllbmQgY2xhc3MgX0xvY2FsZV9pbXBsOwotfTsKLQotX1NUTFBfVEVNUExBVEVfTlVMTAotY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgbW9uZXlwdW5jdDxjaGFyLCBmYWxzZT4gOiBwdWJsaWMgbG9jYWxlOjpmYWNldCwgcHVibGljIG1vbmV5X2Jhc2UKLXsKLXB1YmxpYzoKLSAgdHlwZWRlZiBjaGFyICAgICAgICAgICAgICAgICBjaGFyX3R5cGU7Ci0gIHR5cGVkZWYgc3RyaW5nICAgICAgICAgICAgICAgc3RyaW5nX3R5cGU7Ci0KLSAgZXhwbGljaXQgbW9uZXlwdW5jdCBfU1RMUF9QU1BFQzIoY2hhciwgZmFsc2UpIChzaXplX3QgX19yZWZzID0gMCk7Ci0KLSAgY2hhciAgICAgICAgZGVjaW1hbF9wb2ludCgpIGNvbnN0IHsgcmV0dXJuIGRvX2RlY2ltYWxfcG9pbnQoKTsgfQotICBjaGFyICAgICAgICB0aG91c2FuZHNfc2VwKCkgY29uc3QgeyByZXR1cm4gZG9fdGhvdXNhbmRzX3NlcCgpOyB9Ci0gIHN0cmluZyAgICAgIGdyb3VwaW5nKCkgICAgICBjb25zdCB7IHJldHVybiBkb19ncm91cGluZygpOyB9Ci0gIHN0cmluZ190eXBlIGN1cnJfc3ltYm9sKCkgICBjb25zdCB7IHJldHVybiBkb19jdXJyX3N5bWJvbCgpOyB9Ci0gIHN0cmluZ190eXBlIHBvc2l0aXZlX3NpZ24oKSBjb25zdCB7IHJldHVybiBkb19wb3NpdGl2ZV9zaWduKCk7IH0KLSAgc3RyaW5nX3R5cGUgbmVnYXRpdmVfc2lnbigpIGNvbnN0IHsgcmV0dXJuIGRvX25lZ2F0aXZlX3NpZ24oKTsgfQotICBpbnQgICAgICAgICBmcmFjX2RpZ2l0cygpICAgY29uc3QgeyByZXR1cm4gZG9fZnJhY19kaWdpdHMoKTsgfQotICBwYXR0ZXJuICAgICBwb3NfZm9ybWF0KCkgICAgY29uc3QgeyByZXR1cm4gZG9fcG9zX2Zvcm1hdCgpOyB9Ci0gIHBhdHRlcm4gICAgIG5lZ19mb3JtYXQoKSAgICBjb25zdCB7IHJldHVybiBkb19uZWdfZm9ybWF0KCk7IH0KLQotICBzdGF0aWMgX1NUTFBfU1RBVElDX01FTUJFUl9ERUNMU1BFQyBsb2NhbGU6OmlkIGlkOwotIyBpZiBkZWZpbmVkIChfU1RMUF9TVEFUSUNfQ09OU1RfSU5JVF9CVUcpCi0gIGVudW0gX0ludGxWYWwgeyBpbnRsID0gMCB9IDsKLSMgZWxzZQotICBzdGF0aWMgY29uc3QgYm9vbCBpbnRsID0gZmFsc2U7Ci0jIGVuZGlmCi0KLXByb3RlY3RlZDoKLSAgcGF0dGVybiBfTV9wb3NfZm9ybWF0OwotICBwYXR0ZXJuIF9NX25lZ19mb3JtYXQ7Ci0KLSAgfm1vbmV5cHVuY3QgX1NUTFBfUFNQRUMyKGNoYXIsIGZhbHNlKSAoKTsKLQotICB2aXJ0dWFsIGNoYXIgICAgICAgIGRvX2RlY2ltYWxfcG9pbnQoKSBjb25zdDsKLSAgdmlydHVhbCBjaGFyICAgICAgICBkb190aG91c2FuZHNfc2VwKCkgY29uc3Q7Ci0gIHZpcnR1YWwgc3RyaW5nICAgICAgZG9fZ3JvdXBpbmcoKSAgICAgIGNvbnN0OwotCi0gIHZpcnR1YWwgc3RyaW5nICAgICAgZG9fY3Vycl9zeW1ib2woKSAgIGNvbnN0OwotCi0gIHZpcnR1YWwgc3RyaW5nICAgICAgZG9fcG9zaXRpdmVfc2lnbigpIGNvbnN0OwotICB2aXJ0dWFsIHN0cmluZyAgICAgIGRvX25lZ2F0aXZlX3NpZ24oKSBjb25zdDsKLSAgdmlydHVhbCBpbnQgICAgICAgICBkb19mcmFjX2RpZ2l0cygpICAgY29uc3Q7Ci0gIHZpcnR1YWwgcGF0dGVybiAgICAgZG9fcG9zX2Zvcm1hdCgpICAgIGNvbnN0OwotICB2aXJ0dWFsIHBhdHRlcm4gICAgIGRvX25lZ19mb3JtYXQoKSAgICBjb25zdDsKLQotICBmcmllbmQgY2xhc3MgX0xvY2FsZV9pbXBsOwotfTsKLQotCi0jIGlmbmRlZiBfU1RMUF9OT19XQ0hBUl9UCi0KLV9TVExQX1RFTVBMQVRFX05VTEwKLWNsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIG1vbmV5cHVuY3Q8d2NoYXJfdCwgdHJ1ZT4gOiBwdWJsaWMgbG9jYWxlOjpmYWNldCwgcHVibGljIG1vbmV5X2Jhc2UKLXsKLSAgZnJpZW5kIGNsYXNzIF9Mb2NhbGVfaW1wbDsKLXB1YmxpYzoKLSAgdHlwZWRlZiB3Y2hhcl90ICAgICAgICAgICAgICAgICBjaGFyX3R5cGU7Ci0gIHR5cGVkZWYgd3N0cmluZyAgICAgICAgICAgICAgICAgc3RyaW5nX3R5cGU7Ci0gIGV4cGxpY2l0IG1vbmV5cHVuY3QgX1NUTFBfUFNQRUMyKHdjaGFyX3QsIHRydWUpIChzaXplX3QgX19yZWZzID0gMCk7Ci0gIHdjaGFyX3QgICAgIGRlY2ltYWxfcG9pbnQoKSBjb25zdCB7IHJldHVybiBkb19kZWNpbWFsX3BvaW50KCk7IH0KLSAgd2NoYXJfdCAgICAgdGhvdXNhbmRzX3NlcCgpIGNvbnN0IHsgcmV0dXJuIGRvX3Rob3VzYW5kc19zZXAoKTsgfQotICBzdHJpbmcgICAgICBncm91cGluZygpICAgICAgY29uc3QgeyByZXR1cm4gZG9fZ3JvdXBpbmcoKTsgfQotICBzdHJpbmdfdHlwZSBjdXJyX3N5bWJvbCgpICAgY29uc3QgeyByZXR1cm4gZG9fY3Vycl9zeW1ib2woKTsgfQotICBzdHJpbmdfdHlwZSBwb3NpdGl2ZV9zaWduKCkgY29uc3QgeyByZXR1cm4gZG9fcG9zaXRpdmVfc2lnbigpOyB9Ci0gIHN0cmluZ190eXBlIG5lZ2F0aXZlX3NpZ24oKSBjb25zdCB7IHJldHVybiBkb19uZWdhdGl2ZV9zaWduKCk7IH0KLSAgaW50ICAgICAgICAgZnJhY19kaWdpdHMoKSAgIGNvbnN0IHsgcmV0dXJuIGRvX2ZyYWNfZGlnaXRzKCk7IH0KLSAgcGF0dGVybiAgICAgcG9zX2Zvcm1hdCgpICAgIGNvbnN0IHsgcmV0dXJuIGRvX3Bvc19mb3JtYXQoKTsgfQotICBwYXR0ZXJuICAgICBuZWdfZm9ybWF0KCkgICAgY29uc3QgeyByZXR1cm4gZG9fbmVnX2Zvcm1hdCgpOyB9Ci0KLSAgc3RhdGljIF9TVExQX1NUQVRJQ19NRU1CRVJfREVDTFNQRUMgbG9jYWxlOjppZCBpZDsKLSMgaWYgZGVmaW5lZCAoX1NUTFBfU1RBVElDX0NPTlNUX0lOSVRfQlVHKQotICBlbnVtIF9JbnRsVmFsIHsgaW50bCA9IDEgfSA7Ci0jIGVsc2UKLSAgc3RhdGljIGNvbnN0IGJvb2wgaW50bCA9IHRydWU7Ci0jIGVuZGlmCi0KLXByb3RlY3RlZDoKLSAgcGF0dGVybiBfTV9wb3NfZm9ybWF0OwotICBwYXR0ZXJuIF9NX25lZ19mb3JtYXQ7Ci0KLSAgfm1vbmV5cHVuY3QgX1NUTFBfUFNQRUMyKHdjaGFyX3QsIHRydWUpICgpOwotCi0gIHZpcnR1YWwgd2NoYXJfdCAgICAgZG9fZGVjaW1hbF9wb2ludCgpIGNvbnN0OwotICB2aXJ0dWFsIHdjaGFyX3QgICAgIGRvX3Rob3VzYW5kc19zZXAoKSBjb25zdDsKLSAgdmlydHVhbCBzdHJpbmcgICAgICBkb19ncm91cGluZygpICAgICAgY29uc3Q7Ci0KLSAgdmlydHVhbCBzdHJpbmdfdHlwZSBkb19jdXJyX3N5bWJvbCgpICAgY29uc3Q7Ci0KLSAgdmlydHVhbCBzdHJpbmdfdHlwZSBkb19wb3NpdGl2ZV9zaWduKCkgY29uc3Q7Ci0gIHZpcnR1YWwgc3RyaW5nX3R5cGUgZG9fbmVnYXRpdmVfc2lnbigpIGNvbnN0OwotICB2aXJ0dWFsIGludCAgICAgICAgIGRvX2ZyYWNfZGlnaXRzKCkgICBjb25zdDsKLSAgdmlydHVhbCBwYXR0ZXJuICAgICBkb19wb3NfZm9ybWF0KCkgICAgY29uc3Q7Ci0gIHZpcnR1YWwgcGF0dGVybiAgICAgZG9fbmVnX2Zvcm1hdCgpICAgIGNvbnN0OwotfTsKLQotCi1fU1RMUF9URU1QTEFURV9OVUxMCi1jbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBtb25leXB1bmN0PHdjaGFyX3QsIGZhbHNlPiA6IHB1YmxpYyBsb2NhbGU6OmZhY2V0LCBwdWJsaWMgbW9uZXlfYmFzZQotewotICBmcmllbmQgY2xhc3MgX0xvY2FsZV9pbXBsOwotcHVibGljOgotICB0eXBlZGVmIHdjaGFyX3QgICAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKLSAgdHlwZWRlZiB3c3RyaW5nICAgICAgICAgICAgICAgICBzdHJpbmdfdHlwZTsKLSAgZXhwbGljaXQgbW9uZXlwdW5jdCBfU1RMUF9QU1BFQzIod2NoYXJfdCwgZmFsc2UpIChzaXplX3QgX19yZWZzID0gMCk7Ci0gIHdjaGFyX3QgICAgIGRlY2ltYWxfcG9pbnQoKSBjb25zdCB7IHJldHVybiBkb19kZWNpbWFsX3BvaW50KCk7IH0KLSAgd2NoYXJfdCAgICAgdGhvdXNhbmRzX3NlcCgpIGNvbnN0IHsgcmV0dXJuIGRvX3Rob3VzYW5kc19zZXAoKTsgfQotICBzdHJpbmcgICAgICBncm91cGluZygpICAgICAgY29uc3QgeyByZXR1cm4gZG9fZ3JvdXBpbmcoKTsgfQotICBzdHJpbmdfdHlwZSBjdXJyX3N5bWJvbCgpICAgY29uc3QgeyByZXR1cm4gZG9fY3Vycl9zeW1ib2woKTsgfQotICBzdHJpbmdfdHlwZSBwb3NpdGl2ZV9zaWduKCkgY29uc3QgeyByZXR1cm4gZG9fcG9zaXRpdmVfc2lnbigpOyB9Ci0gIHN0cmluZ190eXBlIG5lZ2F0aXZlX3NpZ24oKSBjb25zdCB7IHJldHVybiBkb19uZWdhdGl2ZV9zaWduKCk7IH0KLSAgaW50ICAgICAgICAgZnJhY19kaWdpdHMoKSAgIGNvbnN0IHsgcmV0dXJuIGRvX2ZyYWNfZGlnaXRzKCk7IH0KLSAgcGF0dGVybiAgICAgcG9zX2Zvcm1hdCgpICAgIGNvbnN0IHsgcmV0dXJuIGRvX3Bvc19mb3JtYXQoKTsgfQotICBwYXR0ZXJuICAgICBuZWdfZm9ybWF0KCkgICAgY29uc3QgeyByZXR1cm4gZG9fbmVnX2Zvcm1hdCgpOyB9Ci0KLSAgc3RhdGljIF9TVExQX1NUQVRJQ19NRU1CRVJfREVDTFNQRUMgbG9jYWxlOjppZCBpZDsKLSMgaWYgZGVmaW5lZCAoX1NUTFBfU1RBVElDX0NPTlNUX0lOSVRfQlVHKQotICBlbnVtIF9JbnRsVmFsIHsgaW50bCA9IDAgfSA7Ci0jIGVsc2UKLSAgc3RhdGljIGNvbnN0IGJvb2wgaW50bCA9IGZhbHNlOwotIyBlbmRpZgotCi1wcm90ZWN0ZWQ6Ci0gIHBhdHRlcm4gX01fcG9zX2Zvcm1hdDsKLSAgcGF0dGVybiBfTV9uZWdfZm9ybWF0OwotCi0gIH5tb25leXB1bmN0IF9TVExQX1BTUEVDMih3Y2hhcl90LCBmYWxzZSkgKCk7Ci0KLSAgdmlydHVhbCB3Y2hhcl90ICAgICBkb19kZWNpbWFsX3BvaW50KCkgY29uc3Q7Ci0gIHZpcnR1YWwgd2NoYXJfdCAgICAgZG9fdGhvdXNhbmRzX3NlcCgpIGNvbnN0OwotICB2aXJ0dWFsIHN0cmluZyAgICAgIGRvX2dyb3VwaW5nKCkgICAgICBjb25zdDsKLQotICB2aXJ0dWFsIHN0cmluZ190eXBlIGRvX2N1cnJfc3ltYm9sKCkgICBjb25zdDsKLQotICB2aXJ0dWFsIHN0cmluZ190eXBlIGRvX3Bvc2l0aXZlX3NpZ24oKSBjb25zdDsKLSAgdmlydHVhbCBzdHJpbmdfdHlwZSBkb19uZWdhdGl2ZV9zaWduKCkgY29uc3Q7Ci0gIHZpcnR1YWwgaW50ICAgICAgICAgZG9fZnJhY19kaWdpdHMoKSAgIGNvbnN0OwotICB2aXJ0dWFsIHBhdHRlcm4gICAgIGRvX3Bvc19mb3JtYXQoKSAgICBjb25zdDsKLSAgdmlydHVhbCBwYXR0ZXJuICAgICBkb19uZWdfZm9ybWF0KCkgICAgY29uc3Q7Ci19OwotCi0jIGVuZGlmCi0KLXRlbXBsYXRlIDxjbGFzcyBfY2hhclQsIF9TVExQX0RGTF9OT05fVFlQRV9QQVJBTShib29sICwgX0ludGVybmF0aW9uYWwgLCBmYWxzZSkgPiBjbGFzcyBtb25leXB1bmN0X2J5bmFtZSB7fTsKLQotX1NUTFBfVEVNUExBVEVfTlVMTAotY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgbW9uZXlwdW5jdF9ieW5hbWU8Y2hhciwgdHJ1ZT4gOiBwdWJsaWMgbW9uZXlwdW5jdDxjaGFyLCB0cnVlPiB7Ci1wdWJsaWM6Ci0gIHR5cGVkZWYgbW9uZXlfYmFzZTo6cGF0dGVybiAgIHBhdHRlcm47Ci0gIHR5cGVkZWYgY2hhciAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKLSAgdHlwZWRlZiBzdHJpbmcgICAgICAgICAgICAgICAgc3RyaW5nX3R5cGU7Ci0KLSAgZXhwbGljaXQgbW9uZXlwdW5jdF9ieW5hbWUgX1NUTFBfUFNQRUMyKGNoYXIsIHRydWUpIChjb25zdCBjaGFyICogX19uYW1lLCBzaXplX3QgX19yZWZzID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTG9jYWxlX25hbWVfaGludCogX19oaW50ID0gMCk7Ci0KLXByb3RlY3RlZDoKLSAgX0xvY2FsZV9tb25ldGFyeSogX01fbW9uZXRhcnk7Ci0gIH5tb25leXB1bmN0X2J5bmFtZSBfU1RMUF9QU1BFQzIoY2hhciwgdHJ1ZSkgKCk7Ci0gIHZpcnR1YWwgY2hhciAgICAgICAgZG9fZGVjaW1hbF9wb2ludCgpIGNvbnN0OwotICB2aXJ0dWFsIGNoYXIgICAgICAgIGRvX3Rob3VzYW5kc19zZXAoKSBjb25zdDsKLSAgdmlydHVhbCBzdHJpbmcgICAgICBkb19ncm91cGluZygpICAgICAgY29uc3Q7Ci0KLSAgdmlydHVhbCBzdHJpbmdfdHlwZSBkb19jdXJyX3N5bWJvbCgpICAgY29uc3Q7Ci0KLSAgdmlydHVhbCBzdHJpbmdfdHlwZSBkb19wb3NpdGl2ZV9zaWduKCkgY29uc3Q7Ci0gIHZpcnR1YWwgc3RyaW5nX3R5cGUgZG9fbmVnYXRpdmVfc2lnbigpIGNvbnN0OwotICB2aXJ0dWFsIGludCAgICAgICAgIGRvX2ZyYWNfZGlnaXRzKCkgICBjb25zdDsKLQotcHJpdmF0ZToKLSAgdHlwZWRlZiBtb25leXB1bmN0X2J5bmFtZTxjaGFyLCB0cnVlPiBfU2VsZjsKLSAgLy9leHBsaWNpdGVseSBkZWZpbmVkIGFzIHByaXZhdGUgdG8gYXZvaWQgd2FybmluZ3M6Ci0gIG1vbmV5cHVuY3RfYnluYW1lKF9TZWxmIGNvbnN0Jik7Ci0gIF9TZWxmJiBvcGVyYXRvciA9IChfU2VsZiBjb25zdCYpOwotfTsKLQotX1NUTFBfVEVNUExBVEVfTlVMTAotY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgbW9uZXlwdW5jdF9ieW5hbWU8Y2hhciwgZmFsc2U+IDogcHVibGljIG1vbmV5cHVuY3Q8Y2hhciwgZmFsc2U+Ci17Ci1wdWJsaWM6Ci0gIHR5cGVkZWYgbW9uZXlfYmFzZTo6cGF0dGVybiAgIHBhdHRlcm47Ci0gIHR5cGVkZWYgY2hhciAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKLSAgdHlwZWRlZiBzdHJpbmcgICAgICAgICAgICAgICAgc3RyaW5nX3R5cGU7Ci0KLSAgZXhwbGljaXQgbW9uZXlwdW5jdF9ieW5hbWUgX1NUTFBfUFNQRUMyKGNoYXIsIGZhbHNlKSAoY29uc3QgY2hhciAqIF9fbmFtZSwgc2l6ZV90IF9fcmVmcyA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Mb2NhbGVfbmFtZV9oaW50KiBfX2hpbnQgPSAwKTsKLQotcHJvdGVjdGVkOgotICBfTG9jYWxlX21vbmV0YXJ5KiBfTV9tb25ldGFyeTsKLSAgfm1vbmV5cHVuY3RfYnluYW1lIF9TVExQX1BTUEVDMihjaGFyLCBmYWxzZSkgKCk7Ci0gIHZpcnR1YWwgY2hhciAgICAgICAgZG9fZGVjaW1hbF9wb2ludCgpIGNvbnN0OwotICB2aXJ0dWFsIGNoYXIgICAgICAgIGRvX3Rob3VzYW5kc19zZXAoKSBjb25zdDsKLSAgdmlydHVhbCBzdHJpbmcgICAgICBkb19ncm91cGluZygpICAgICAgY29uc3Q7Ci0KLSAgdmlydHVhbCBzdHJpbmdfdHlwZSBkb19jdXJyX3N5bWJvbCgpICAgY29uc3Q7Ci0KLSAgdmlydHVhbCBzdHJpbmdfdHlwZSBkb19wb3NpdGl2ZV9zaWduKCkgY29uc3Q7Ci0gIHZpcnR1YWwgc3RyaW5nX3R5cGUgZG9fbmVnYXRpdmVfc2lnbigpIGNvbnN0OwotICB2aXJ0dWFsIGludCAgICAgICAgIGRvX2ZyYWNfZGlnaXRzKCkgICBjb25zdDsKLQotcHJpdmF0ZToKLSAgdHlwZWRlZiBtb25leXB1bmN0X2J5bmFtZTxjaGFyLCBmYWxzZT4gX1NlbGY7Ci0gIC8vZXhwbGljaXRlbHkgZGVmaW5lZCBhcyBwcml2YXRlIHRvIGF2b2lkIHdhcm5pbmdzOgotICBtb25leXB1bmN0X2J5bmFtZShfU2VsZiBjb25zdCYpOwotICBfU2VsZiYgb3BlcmF0b3IgPSAoX1NlbGYgY29uc3QmKTsKLSAgZnJpZW5kIF9Mb2NhbGVfbmFtZV9oaW50KiBfTG9jYWxlX2V4dHJhY3RfaGludChtb25leXB1bmN0X2J5bmFtZTxjaGFyLCBmYWxzZT4qKTsKLX07Ci0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkKLV9TVExQX1RFTVBMQVRFX05VTEwKLWNsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIG1vbmV5cHVuY3RfYnluYW1lPHdjaGFyX3QsIHRydWU+IDogcHVibGljIG1vbmV5cHVuY3Q8d2NoYXJfdCwgdHJ1ZT4KLXsKLXB1YmxpYzoKLSAgdHlwZWRlZiBtb25leV9iYXNlOjpwYXR0ZXJuICAgcGF0dGVybjsKLSAgdHlwZWRlZiB3Y2hhcl90ICAgICAgICAgICAgICAgY2hhcl90eXBlOwotICB0eXBlZGVmIHdzdHJpbmcgICAgICAgICAgICAgICBzdHJpbmdfdHlwZTsKLQotICBleHBsaWNpdCBtb25leXB1bmN0X2J5bmFtZSBfU1RMUF9QU1BFQzIod2NoYXJfdCwgdHJ1ZSkgKGNvbnN0IGNoYXIgKiBfX25hbWUsIHNpemVfdCBfX3JlZnMgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Mb2NhbGVfbmFtZV9oaW50KiBfX2hpbnQgPSAwKTsKLQotcHJvdGVjdGVkOgotICBfTG9jYWxlX21vbmV0YXJ5KiBfTV9tb25ldGFyeTsKLSAgfm1vbmV5cHVuY3RfYnluYW1lIF9TVExQX1BTUEVDMih3Y2hhcl90LCB0cnVlKSAoKTsKLSAgdmlydHVhbCB3Y2hhcl90ICAgICBkb19kZWNpbWFsX3BvaW50KCkgY29uc3Q7Ci0gIHZpcnR1YWwgd2NoYXJfdCAgICAgZG9fdGhvdXNhbmRzX3NlcCgpIGNvbnN0OwotICB2aXJ0dWFsIHN0cmluZyAgICAgIGRvX2dyb3VwaW5nKCkgICAgICBjb25zdDsKLQotICB2aXJ0dWFsIHN0cmluZ190eXBlIGRvX2N1cnJfc3ltYm9sKCkgICBjb25zdDsKLQotICB2aXJ0dWFsIHN0cmluZ190eXBlIGRvX3Bvc2l0aXZlX3NpZ24oKSBjb25zdDsKLSAgdmlydHVhbCBzdHJpbmdfdHlwZSBkb19uZWdhdGl2ZV9zaWduKCkgY29uc3Q7Ci0gIHZpcnR1YWwgaW50ICAgICAgICAgZG9fZnJhY19kaWdpdHMoKSAgIGNvbnN0OwotCi1wcml2YXRlOgotICB0eXBlZGVmIG1vbmV5cHVuY3RfYnluYW1lPHdjaGFyX3QsIHRydWU+IF9TZWxmOwotICAvL2V4cGxpY2l0ZWx5IGRlZmluZWQgYXMgcHJpdmF0ZSB0byBhdm9pZCB3YXJuaW5nczoKLSAgbW9uZXlwdW5jdF9ieW5hbWUoX1NlbGYgY29uc3QmKTsKLSAgX1NlbGYmIG9wZXJhdG9yID0gKF9TZWxmIGNvbnN0Jik7Ci19OwotCi1fU1RMUF9URU1QTEFURV9OVUxMCi1jbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBtb25leXB1bmN0X2J5bmFtZTx3Y2hhcl90LCBmYWxzZT4gOiBwdWJsaWMgbW9uZXlwdW5jdDx3Y2hhcl90LCBmYWxzZT4KLXsKLXB1YmxpYzoKLSAgdHlwZWRlZiBtb25leV9iYXNlOjpwYXR0ZXJuICAgcGF0dGVybjsKLSAgdHlwZWRlZiB3Y2hhcl90ICAgICAgICAgICAgICAgY2hhcl90eXBlOwotICB0eXBlZGVmIHdzdHJpbmcgICAgICAgICAgICAgICBzdHJpbmdfdHlwZTsKLQotICBleHBsaWNpdCBtb25leXB1bmN0X2J5bmFtZSBfU1RMUF9QU1BFQzIod2NoYXJfdCwgZmFsc2UpIChjb25zdCBjaGFyICogX19uYW1lLCBzaXplX3QgX19yZWZzID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0xvY2FsZV9uYW1lX2hpbnQqIF9faGludCA9IDApOwotCi1wcm90ZWN0ZWQ6Ci0gIF9Mb2NhbGVfbW9uZXRhcnkqIF9NX21vbmV0YXJ5OwotICB+bW9uZXlwdW5jdF9ieW5hbWUgX1NUTFBfUFNQRUMyKHdjaGFyX3QsIGZhbHNlKSAoKTsKLSAgdmlydHVhbCB3Y2hhcl90ICAgICBkb19kZWNpbWFsX3BvaW50KCkgY29uc3Q7Ci0gIHZpcnR1YWwgd2NoYXJfdCAgICAgZG9fdGhvdXNhbmRzX3NlcCgpIGNvbnN0OwotICB2aXJ0dWFsIHN0cmluZyAgICAgIGRvX2dyb3VwaW5nKCkgICAgICBjb25zdDsKLQotICB2aXJ0dWFsIHN0cmluZ190eXBlIGRvX2N1cnJfc3ltYm9sKCkgICBjb25zdDsKLQotICB2aXJ0dWFsIHN0cmluZ190eXBlIGRvX3Bvc2l0aXZlX3NpZ24oKSBjb25zdDsKLSAgdmlydHVhbCBzdHJpbmdfdHlwZSBkb19uZWdhdGl2ZV9zaWduKCkgY29uc3Q7Ci0gIHZpcnR1YWwgaW50ICAgICAgICAgZG9fZnJhY19kaWdpdHMoKSAgIGNvbnN0OwotCi1wcml2YXRlOgotICB0eXBlZGVmIG1vbmV5cHVuY3RfYnluYW1lPHdjaGFyX3QsIGZhbHNlPiBfU2VsZjsKLSAgLy9leHBsaWNpdGVseSBkZWZpbmVkIGFzIHByaXZhdGUgdG8gYXZvaWQgd2FybmluZ3M6Ci0gIG1vbmV5cHVuY3RfYnluYW1lKF9TZWxmIGNvbnN0Jik7Ci0gIF9TZWxmJiBvcGVyYXRvciA9IChfU2VsZiBjb25zdCYpOwotfTsKLSNlbmRpZgotCi0vLz09PT09IG1ldGhvZHMgPT09PT09Ci0KLQotLy8gbW9uZXlfcHV0IGZhY2V0cwotCi0jaWYgZGVmaW5lZCAoX1NUTFBfTElNSVRFRF9ERUZBVUxUX1RFTVBMQVRFUykKLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9PdXRwdXRJdGVyPgotI2Vsc2UKLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9PdXRwdXRJdGVyID0gb3N0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQsIGNoYXJfdHJhaXRzPF9DaGFyVD4gPiA+Ci0jZW5kaWYKLWNsYXNzIG1vbmV5X3B1dCA6IHB1YmxpYyBsb2NhbGU6OmZhY2V0IHsKLSAgZnJpZW5kIGNsYXNzIF9Mb2NhbGVfaW1wbDsKLQotcHVibGljOgotICB0eXBlZGVmIF9DaGFyVCAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKLSAgdHlwZWRlZiBfT3V0cHV0SXRlciAgICAgICAgICBpdGVyX3R5cGU7Ci0gIHR5cGVkZWYgYmFzaWNfc3RyaW5nPF9DaGFyVCwgY2hhcl90cmFpdHM8X0NoYXJUPiwgYWxsb2NhdG9yPF9DaGFyVD4gPiBzdHJpbmdfdHlwZTsKLQotICBtb25leV9wdXQoc2l6ZV90IF9fcmVmcyA9IDApIDogbG9jYWxlOjpmYWNldChfX3JlZnMpIHt9Ci0gIGl0ZXJfdHlwZSBwdXQoaXRlcl90eXBlIF9fcywgYm9vbCBfX2ludGwsIGlvc19iYXNlJiBfX3N0ciwKLSAgICAgICAgICAgICAgICBjaGFyX3R5cGUgIF9fZmlsbCwgX1NUTFBfTE9OR0VTVF9GTE9BVF9UWVBFIF9fdW5pdHMpIGNvbnN0Ci0gICAgeyByZXR1cm4gZG9fcHV0KF9fcywgX19pbnRsLCBfX3N0ciwgX19maWxsLCBfX3VuaXRzKTsgfQotICBpdGVyX3R5cGUgcHV0KGl0ZXJfdHlwZSBfX3MsIGJvb2wgX19pbnRsLCBpb3NfYmFzZSYgX19zdHIsCi0gICAgICAgICAgICAgICAgY2hhcl90eXBlICBfX2ZpbGwsCi0gICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nX3R5cGUmIF9fZGlnaXRzKSBjb25zdAotICAgIHsgcmV0dXJuIGRvX3B1dChfX3MsIF9faW50bCwgX19zdHIsIF9fZmlsbCwgX19kaWdpdHMpOyB9Ci0KLSAgc3RhdGljIF9TVExQX1NUQVRJQ19NRU1CRVJfREVDTFNQRUMgbG9jYWxlOjppZCBpZDsKLQotcHJvdGVjdGVkOgotICB+bW9uZXlfcHV0KCkge30KLSAgdmlydHVhbCBpdGVyX3R5cGUgZG9fcHV0KGl0ZXJfdHlwZSBfX3MsIGJvb2wgIF9faW50bCwgaW9zX2Jhc2UmICBfX3N0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZSBfX2ZpbGwsIF9TVExQX0xPTkdFU1RfRkxPQVRfVFlQRSBfX3VuaXRzKSBjb25zdDsKLSAgdmlydHVhbCBpdGVyX3R5cGUgZG9fcHV0KGl0ZXJfdHlwZSBfX3MsIGJvb2wgIF9faW50bCwgaW9zX2Jhc2UmICBfX3N0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZSBfX2ZpbGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmdfdHlwZSYgX19kaWdpdHMpIGNvbnN0OwotfTsKLQotIyBpZiBkZWZpbmVkIChfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUKQotX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIG1vbmV5X2dldDxjaGFyLCBpc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4gPjsKLV9TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBtb25leV9wdXQ8Y2hhciwgb3N0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+ID47Ci0vL19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBtb25leV9nZXQ8Y2hhciwgY29uc3QgY2hhciogPjsKLS8vX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIG1vbmV5X3B1dDxjaGFyLCBjaGFyKiA+OwotIyAgaWYgISBkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQotX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIG1vbmV5X2dldDx3Y2hhcl90LCBpc3RyZWFtYnVmX2l0ZXJhdG9yPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4gPjsKLV9TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBtb25leV9wdXQ8d2NoYXJfdCwgb3N0cmVhbWJ1Zl9pdGVyYXRvcjx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+ID47Ci0vLyBfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgbW9uZXlfZ2V0PHdjaGFyX3QsIGNvbnN0IHdjaGFyX3QqID47Ci0vLyBfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgbW9uZXlfcHV0PHdjaGFyX3QsIHdjaGFyX3QqID47Ci0jICBlbmRpZgotIyBlbmRpZiAvKiBfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUICovCi0KLV9TVExQX0VORF9OQU1FU1BBQ0UKLQotI2lmIGRlZmluZWQgKF9TVExQX0VYUE9TRV9TVFJFQU1fSU1QTEVNRU5UQVRJT04pICYmICFkZWZpbmVkIChfU1RMUF9MSU5LX1RJTUVfSU5TVEFOVElBVElPTikKLSMgIGluY2x1ZGUgPHN0bC9fbW9uZXRhcnkuYz4KLSNlbmRpZgotCi0jZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfTU9ORVRBUllfSCAqLwotCi0vLyBMb2NhbCBWYXJpYWJsZXM6Ci0vLyBtb2RlOkMrKwotLy8gRW5kOgotCi0KZGlmZiAtLWdpdCBhL3N0bC9fbW92ZV9jb25zdHJ1Y3RfZndrLmggYi9zdGwvX21vdmVfY29uc3RydWN0X2Z3ay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjY1YTlkLi4wMDAwMDAwCi0tLSBhL3N0bC9fbW92ZV9jb25zdHJ1Y3RfZndrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMKLSAqIEZyYW7nb2lzIER1bW9udAotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0jaWZuZGVmIF9TVExQX01PVkVfQ09OU1RSVUNUX0ZXS19ICi0jZGVmaW5lIF9TVExQX01PVkVfQ09OU1RSVUNUX0ZXS19ICi0KLSNpZm5kZWYgX1NUTFBfVFlQRV9UUkFJVFNfSAotIyAgaW5jbHVkZSA8c3RsL3R5cGVfdHJhaXRzLmg+Ci0jZW5kaWYKLQotX1NUTFBfQkVHSU5fTkFNRVNQQUNFCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNb3ZlIGNvbnN0cnVjdG9yIGZyYW1ld29yawotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKlBhcnRpYWwgbW92ZToKLSAqVGhlIHNvdXJjZSBIQVMgdG8gYmUgYSB2YWxpZCBpbnN0YW5jZSBhZnRlciB0aGUgbW92ZSEKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWNsYXNzIF9fbW92ZV9zb3VyY2UgewotcHVibGljOgotICBleHBsaWNpdCBfX21vdmVfc291cmNlIChfVHAgJl9zcmMpIDogX01fZGF0YShfc3JjKQotICB7fQotCi0gIF9UcCYgZ2V0KCkgY29uc3QKLSAgeyByZXR1cm4gX01fZGF0YTsgfQotcHJpdmF0ZToKLSAgX1RwICZfTV9kYXRhOwotCi0gIC8vV2UgZXhwbGljaXRlbHkgZm9yYmlkIGFzc2lnbm1lbnQgdG8gYXZvaWQgd2FybmluZzoKLSAgdHlwZWRlZiBfX21vdmVfc291cmNlPF9UcD4gX1NlbGY7Ci0gIF9TZWxmJiBvcGVyYXRvciA9IChfU2VsZiBjb25zdCYpOwotfTsKLQotLy9DbGFzcyB1c2VkIHRvIHNpZ25hbCBtb3ZlIGNvbnN0cnVjdG9yIHN1cHBvcnQsIGltcGxlbWVudGF0aW9uIGFuZCB0eXBlLgotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLXN0cnVjdCBfX21vdmVfdHJhaXRzIHsKLSAgLyoKLSAgICogaW1wbGVtZW50ZWQgdGVsbHMgaWYgYSB0aGUgc3BlY2lhbCBtb3ZlIGNvbnN0cnVjdG9yIGhhcyB0byBiZSBjYWxsZWQgb3IgdGhlIGNsYXNzaWMKLSAgICogY29weSBjb25zdHJ1Y3RvciBpcyBqdXN0IGZpbmUuIE1vc3Qgb2YgdGhlIHRpbWUgdGhlIGNvcHkgY29uc3RydWN0b3IgaXMgZmluZSBvbmx5Ci0gICAqIGlmIHRoZSBmb2xsb3dpbmcgaW5mbyBpcyB0cnVlLgotICAgKi8KLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUEFSVElBTF9TUEVDX1dPUktBUk9VTkQpICYmIFwKLSAgICFkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKSAmJiBcCi0gICAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKLSAgdHlwZWRlZiB0eXBlbmFtZSBfSXNTVExwb3J0Q2xhc3M8X1RwPjo6X1JldCBpbXBsZW1lbnRlZDsKLSNlbHNlCi0gIHR5cGVkZWYgX19mYWxzZV90eXBlIGltcGxlbWVudGVkOwotI2VuZGlmCi0gIC8qCi0gICAqIGNvbXBsZXRlIHRlbGxzIGlmIHRoZSBtb3ZlIGlzIGNvbXBsZXRlIG9yIHBhcnRpYWwsIHRoYXQgaXMgdG8gc2F5LCBkb2VzIHRoZSBzb3VyY2UKLSAgICogbmVlZHMgdG8gYmUgZGVzdHJveWVkIG9uY2UgaXQgaGFzIGJlZW4gbW92ZWQuCi0gICAqLwotICB0eXBlZGVmIHR5cGVuYW1lIF9fdHlwZV90cmFpdHM8X1RwPjo6aGFzX3RyaXZpYWxfZGVzdHJ1Y3RvciBjb21wbGV0ZTsKLX07Ci0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKLXR5cGVkZWYgX190cnVlX3R5cGUgX19zdGxwX21vdmFibGU7Ci0jZWxzZQotdHlwZWRlZiBfX2ZhbHNlX3R5cGUgX19zdGxwX21vdmFibGU7Ci0jZW5kaWYKLQotX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQotCi0vKgotICogVGhpcyBzdHJ1Y3Qgc2hvdWxkIG5ldmVyIGJlIHVzZWQgaWYgdGhlIHVzZXIgaGFzIG5vdCBleHBsaWNpdGVseSBzdGlwdWxhdGVkCi0gKiB0aGF0IGl0cyBjbGFzcyBzdXBwb3J0IHRoZSBmdWxsIG1vdmUgY29uY2VwdC4gVG8gY2hlY2sgdGhhdCB0aGUgcmV0dXJuIHR5cGUKLSAqIGluIHN1Y2ggYSBjYXNlIHdpbGwgYmUgX19pbnZhbGlkX3NvdXJjZTxfVHA+IHRvIGdlbmVyYXRlIGEgY29tcGlsZSBlcnJvcgotICogcmV2ZWFsaW5nIHRoZSBjb25maWd1cmF0aW9uIHByb2JsZW0uCi0gKi8KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1zdHJ1Y3QgX01vdmVTb3VyY2VUcmFpdHMgewotICB0eXBlZGVmIHR5cGVuYW1lIF9fbW92ZV90cmFpdHM8X1RwPjo6aW1wbGVtZW50ZWQgX012SW1wUmV0OwotI2lmIGRlZmluZWQgKF9fQk9STEFORENfXykKLSAgdHlwZWRlZiB0eXBlbmFtZSBfX3NlbGVjdFQ8X012SW1wUmV0LAotI2Vsc2UKLSAgZW51bSB7X012SW1wID0gX190eXBlMmJvb2w8X012SW1wUmV0Pjo6X1JldH07Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX19zZWxlY3Q8X012SW1wLAotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tb3ZlX3NvdXJjZTxfVHA+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9UcCBjb25zdCY+OjpfUmV0IF9UeXBlOwotfTsKLQotLy9UaGUgaGVscGVyIGZ1bmN0aW9uCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotaW5saW5lIF9TVExQX1RZUEVOQU1FX09OX1JFVFVSTl9UWVBFIF9Nb3ZlU291cmNlVHJhaXRzPF9UcD46Ol9UeXBlCi1fQXNNb3ZlU291cmNlIChfVHAgJnNyYykgewotICB0eXBlZGVmIHR5cGVuYW1lIF9Nb3ZlU291cmNlVHJhaXRzPF9UcD46Ol9UeXBlIF9TcmNUeXBlOwotICByZXR1cm4gX1NyY1R5cGUoc3JjKTsKLX0KLQotLy9IZWxwZXIgc3RydWN0cyB1c2VkIGZvciBtYW55IGNsYXNzLgotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLXN0cnVjdCBfX21vdmVfdHJhaXRzX2F1eCB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX19tb3ZlX3RyYWl0czxfVHA+OjppbXBsZW1lbnRlZCBpbXBsZW1lbnRlZDsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfX21vdmVfdHJhaXRzPF9UcD46OmNvbXBsZXRlIGNvbXBsZXRlOwotfTsKLQotdGVtcGxhdGUgPGNsYXNzIF9UcDEsIGNsYXNzIF9UcDI+Ci1zdHJ1Y3QgX19tb3ZlX3RyYWl0c19hdXgyIHsKLSAgdHlwZWRlZiBfX21vdmVfdHJhaXRzPF9UcDE+IF9Nb3ZlVHJhaXRzMTsKLSAgdHlwZWRlZiBfX21vdmVfdHJhaXRzPF9UcDI+IF9Nb3ZlVHJhaXRzMjsKLQotICB0eXBlZGVmIHR5cGVuYW1lIF9Mb3IyPHR5cGVuYW1lIF9Nb3ZlVHJhaXRzMTo6aW1wbGVtZW50ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX01vdmVUcmFpdHMyOjppbXBsZW1lbnRlZD46Ol9SZXQgaW1wbGVtZW50ZWQ7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0xhbmQyPHR5cGVuYW1lIF9Nb3ZlVHJhaXRzMTo6Y29tcGxldGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9Nb3ZlVHJhaXRzMjo6Y29tcGxldGU+OjpfUmV0IGNvbXBsZXRlOwotfTsKLQotLyoKLSAqIE1vc3Qgb2YgdGhlIHRpbWUgYSBjbGFzcyBpbXBsZW1lbnQgYSBtb3ZlIGNvbnN0cnVjdG9yIGJ1dCBpdHMgdXNlIGRlcGVuZHMKLSAqIG9uIGEgdGhpcmQgcGFydHksIHRoaXMgaXMgd2hhdCB0aGUgZm9sbG93aW5nIHN0cnVjdCBhcmUgZm9yLgotICovCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotc3RydWN0IF9fbW92ZV90cmFpdHNfaGVscCB7Ci0gIHR5cGVkZWYgX190cnVlX3R5cGUgaW1wbGVtZW50ZWQ7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX19tb3ZlX3RyYWl0czxfVHA+Ojpjb21wbGV0ZSBjb21wbGV0ZTsKLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHAxLCBjbGFzcyBfVHAyPgotc3RydWN0IF9fbW92ZV90cmFpdHNfaGVscDEgewotICB0eXBlZGVmIF9fbW92ZV90cmFpdHM8X1RwMT4gX01vdmVUcmFpdHMxOwotICB0eXBlZGVmIF9fbW92ZV90cmFpdHM8X1RwMj4gX01vdmVUcmFpdHMyOwotCi0gIHR5cGVkZWYgdHlwZW5hbWUgX0xvcjI8dHlwZW5hbWUgX01vdmVUcmFpdHMxOjppbXBsZW1lbnRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfTW92ZVRyYWl0czI6OmltcGxlbWVudGVkPjo6X1JldCBpbXBsZW1lbnRlZDsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfTGFuZDI8dHlwZW5hbWUgX01vdmVUcmFpdHMxOjpjb21wbGV0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX01vdmVUcmFpdHMyOjpjb21wbGV0ZT46Ol9SZXQgY29tcGxldGU7Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwMSwgY2xhc3MgX1RwMj4KLXN0cnVjdCBfX21vdmVfdHJhaXRzX2hlbHAyIHsKLSAgdHlwZWRlZiBfX21vdmVfdHJhaXRzPF9UcDE+IF9Nb3ZlVHJhaXRzMTsKLSAgdHlwZWRlZiBfX21vdmVfdHJhaXRzPF9UcDI+IF9Nb3ZlVHJhaXRzMjsKLQotICB0eXBlZGVmIF9fc3RscF9tb3ZhYmxlIGltcGxlbWVudGVkOwotICB0eXBlZGVmIHR5cGVuYW1lIF9MYW5kMjx0eXBlbmFtZSBfTW92ZVRyYWl0czE6OmNvbXBsZXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfTW92ZVRyYWl0czI6OmNvbXBsZXRlPjo6X1JldCBjb21wbGV0ZTsKLX07Ci0KLV9TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQotCi1fU1RMUF9FTkRfTkFNRVNQQUNFCi0KLSNlbmRpZiAvKiBfU1RMUF9NT1ZFX0NPTlNUUlVDVF9GV0tfSCAqLwpkaWZmIC0tZ2l0IGEvc3RsL19uZXcuaCBiL3N0bC9fbmV3LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhYmM1ZmEuLjAwMDAwMDAKLS0tIGEvc3RsL19uZXcuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9ORVcKLSNkZWZpbmUgX1NUTFBfSU5URVJOQUxfTkVXCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1NURERFRgotLy8gc2l6ZV90Ci0jICBpbmNsdWRlIDxzdGwvX2NzdGRkZWYuaD4KLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKSAmJiAoX19CT1JMQU5EQ19fIDwgMHg1ODApCi0vLyBuZXcuaCB1c2VzIDo6bWFsbG9jIDsoCi0jICBpbmNsdWRlIF9TVExQX05BVElWRV9DUFBfQ19IRUFERVIoY3N0ZGxpYikKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjptYWxsb2M7Ci0jZW5kaWYKLQotI2lmICFkZWZpbmVkIChfU1RMUF9OT19ORVdfTkVXX0hFQURFUikKLSMgIGlmIGRlZmluZWQgKF9TVExQX0JST0tFTl9CQURfQUxMT0NfQ0xBU1MpCi0jICAgIGRlZmluZSBiYWRfYWxsb2MgX1NUTFBfTlVMTElGSUVEX0JST0tFTl9CQURfQUxMT0NfQ0xBU1MKLSMgICAgZGVmaW5lIG5vdGhyb3dfdCBfU1RMUF9OVUxMSUZJRURfQlJPS0VOX0JBRF9OT1RIUk9XX1RfQ0xBU1MKLSMgICAgZGVmaW5lIG5vdGhyb3cgX1NUTFBfTlVMTElGSUVEX0JST0tFTl9CQURfTk9USFJPVwotIyAgZW5kaWYKLQotLy8gZU1iZWRkZWQgVmlzdWFsIEMrKyAuTkVUIHVuZm9ydHVuYXRlbHkgdXNlcyBfSU5DX05FVyBmb3IgYm90aCA8bmV3Lmg+IGFuZCA8bmV3PgotLy8gd2UgdW5kZWZpbmUgdGhlIHN5bWJvbCB0byBnZXQgdGhlIHN0dWZmIGluIHRoZSBTREsncyA8bmV3PgotIyAgaWYgZGVmaW5lZCAoX1NUTFBfV0NFX05FVCkgJiYgZGVmaW5lZCAoX0lOQ19ORVcpCi0jICAgIHVuZGVmIF9JTkNfTkVXCi0jICBlbmRpZgotCi0jICBpZiBkZWZpbmVkIChuZXcpCi0vKiBTVExwb3J0IGNhbm5vdCByZXBsYWNlIG5hdGl2ZSBTdGQgbGlicmFyeSBuZXcgaGVhZGVyIGlmIG5ldyBpcyBhIG1hY3JvLAotICogcGxlYXNlIGRlZmluZSBuZXcgbWFjcm8gYWZ0ZXIgPG5ldz4gaGVhZGVyIGluY2x1c2lvbi4KLSAqLwotIyAgICBlcnJvciBDYW5ub3QgaW5jbHVkZSBuYXRpdmUgbmV3IGhlYWRlciBhcyBuZXcgaXMgYSBtYWNyby4KLSMgIGVuZGlmCi0KLSMgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9SVU5USU1FX0hFQURFUihuZXcpCi0KLSMgIGlmIGRlZmluZWQgKF9TVExQX0JST0tFTl9CQURfQUxMT0NfQ0xBU1MpCi0jICAgIHVuZGVmIGJhZF9hbGxvYwotIyAgICB1bmRlZiBub3Rocm93X3QKLSMgICAgdW5kZWYgbm90aHJvdwotIyAgICB1bmRlZiBfU1RMUF9OVUxMSUZJRURfQlJPS0VOX0JBRF9BTExPQ19DTEFTUwotIyAgICB1bmRlZiBfU1RMUF9OVUxMSUZJRURfQlJPS0VOX0JBRF9OT1RIUk9XX1RfQ0xBU1MKLSMgICAgdW5kZWYgX1NUTFBfTlVMTElGSUVEX0JST0tFTl9CQURfTk9USFJPVwotIyAgZW5kaWYKLSNlbHNlCi0jICBpbmNsdWRlIDxuZXcuaD4KLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX1NUTFBfTk9fQkFEX0FMTE9DKSAmJiAhZGVmaW5lZCAoX1NUTFBfTkVXX0RPTlRfVEhST1dfQkFEX0FMTE9DKQotIyAgZGVmaW5lIF9TVExQX05FV19ET05UX1RIUk9XX0JBRF9BTExPQyAxCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9TVExQX1VTRV9FWENFUFRJT05TKSAmJiBkZWZpbmVkIChfU1RMUF9ORVdfRE9OVF9USFJPV19CQURfQUxMT0MpCi0KLSMgIGlmbmRlZiBfU1RMUF9JTlRFUk5BTF9FWENFUFRJT04KLSMgICAgaW5jbHVkZSA8c3RsL19leGNlcHRpb24uaD4KLSMgIGVuZGlmCi0KLV9TVExQX0JFR0lOX05BTUVTUEFDRQotCi0jICBpZiBkZWZpbmVkIChfU1RMUF9OT19CQURfQUxMT0MpCi1zdHJ1Y3Qgbm90aHJvd190IHt9OwotIyAgICBkZWZpbmUgbm90aHJvdyBub3Rocm93X3QoKQotIyAgZW5kaWYKLQotLyoKLSAqIFNUTHBvcnQgb3duIGJhZF9hbGxvYyBleGNlcHRpb24gdG8gYmUgdXNlZCBpZiB0aGUgbmF0aXZlIEMrKyBsaWJyYXJ5Ci0gKiBkbyBub3QgZGVmaW5lIGl0IG9yIHdoZW4gdGhlIG5ldyBvcGVyYXRvciBkbyBub3QgdGhyb3cgaXQgdG8gYXZvaWQKLSAqIGEgdXNlbGVzcyBsaWJyYXJ5IGRlcGVuZGVuY3kuCi0gKi8KLWNsYXNzIGJhZF9hbGxvYyA6IHB1YmxpYyBleGNlcHRpb24gewotcHVibGljOgotICBiYWRfYWxsb2MgKCkgX1NUTFBfTk9USFJPV19JTkhFUkVOVExZIHsgfQotICBiYWRfYWxsb2MoY29uc3QgYmFkX2FsbG9jJikgX1NUTFBfTk9USFJPV19JTkhFUkVOVExZIHsgfQotICBiYWRfYWxsb2MmIG9wZXJhdG9yPShjb25zdCBiYWRfYWxsb2MmKSBfU1RMUF9OT1RIUk9XX0lOSEVSRU5UTFkge3JldHVybiAqdGhpczt9Ci0gIH5iYWRfYWxsb2MgKCkgX1NUTFBfTk9USFJPV19JTkhFUkVOVExZIHsgfQotICBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3QgX1NUTFBfTk9USFJPV19JTkhFUkVOVExZIHsgcmV0dXJuICJiYWQgYWxsb2MiOyB9Ci19OwotCi1fU1RMUF9FTkRfTkFNRVNQQUNFCi0KLSNlbmRpZiAvKiBfU1RMUF9VU0VfRVhDRVBUSU9OUyAmJiAoX1NUTFBfTk9fQkFEX0FMTE9DIHx8IF9TVExQX05FV19ET05UX1RIUk9XX0JBRF9BTExPQykgKi8KLQotI2lmIGRlZmluZWQgKF9TVExQX1JUVElfQlVHKQotX1NUTFBfQkVHSU5fTkFNRVNQQUNFCi0KLWlubGluZSB2b2lkKiBfU1RMUF9DQUxMIF9fc3RsX25ldyhzaXplX3QgX19uKQoteyByZXR1cm4gOjptYWxsb2MoX19uKTsgfQotCi1pbmxpbmUgdm9pZCBfU1RMUF9DQUxMIF9fc3RsX2RlbGV0ZSh2b2lkKiBfX3ApCi17IDo6ZnJlZShfX3ApOyB9Ci1fU1RMUF9FTkRfTkFNRVNQQUNFCi0KLSNlbHNlIC8qIF9TVExQX1JUVElfQlVHICovCi0KLSMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9PV05fTkFNRVNQQUNFKQotCi1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLQotIyAgICBpZiAhZGVmaW5lZCAoX1NUTFBfTkVXX0RPTlRfVEhST1dfQkFEX0FMTE9DKQotdXNpbmcgX1NUTFBfVkVORE9SX0VYQ0VQVF9TVEQ6OmJhZF9hbGxvYzsKLSMgICAgZW5kaWYKLQotIyAgICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fQkFEX0FMTE9DKQotdXNpbmcgX1NUTFBfVkVORE9SX0VYQ0VQVF9TVEQ6Om5vdGhyb3dfdDsKLXVzaW5nIF9TVExQX1ZFTkRPUl9FWENFUFRfU1REOjpub3Rocm93OwotIyAgICAgIGlmIGRlZmluZWQgKF9TVExQX0dMT0JBTF9ORVdfSEFORExFUikKLXVzaW5nIDo6bmV3X2hhbmRsZXI7Ci11c2luZyA6OnNldF9uZXdfaGFuZGxlcjsKLSMgICAgICBlbHNlCi11c2luZyBfU1RMUF9WRU5ET1JfRVhDRVBUX1NURDo6bmV3X2hhbmRsZXI7Ci11c2luZyBfU1RMUF9WRU5ET1JfRVhDRVBUX1NURDo6c2V0X25ld19oYW5kbGVyOwotIyAgICAgIGVuZGlmCi0jICAgIGVuZGlmIC8qICFfU1RMUF9OT19CQURfQUxMT0MgKi8KLQotX1NUTFBfRU5EX05BTUVTUEFDRQotIyAgZW5kaWYgLyogX1NUTFBfVVNFX09XTl9OQU1FU1BBQ0UgKi8KLQotIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX0VYQ0VQVElPTlMpICYmIFwKLSAgICAgKGRlZmluZWQgKF9TVExQX05PX05FV19ORVdfSEVBREVSKSB8fCBkZWZpbmVkIChfU1RMUF9ORVdfRE9OVF9USFJPV19CQURfQUxMT0MpKQotIyAgICBkZWZpbmUgX1NUTFBfQ0hFQ0tfTlVMTF9BTExPQyhfX3gpIHZvaWQqIF9feSA9IF9feDsgaWYgKF9feSA9PSAwKSB7IF9TVExQX1RIUk9XKF9TVExQX1NURDo6YmFkX2FsbG9jKCkpOyB9IHJldHVybiBfX3kKLSMgIGVsc2UKLSMgICAgZGVmaW5lIF9TVExQX0NIRUNLX05VTExfQUxMT0MoX194KSByZXR1cm4gX194Ci0jICBlbmRpZgotCi1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLQotIyAgaWYgKChkZWZpbmVkIChfX0lCTUNQUF9fKSB8fCBkZWZpbmVkIChfX09TNDAwX18pIHx8IGRlZmluZWQgKF9feGxDX18pIHx8IGRlZmluZWQgKHFUaWR5SGVhcCkpICYmIGRlZmluZWQgKF9fREVCVUdfQUxMT0NfXykpCi1pbmxpbmUgdm9pZCogX1NUTFBfQ0FMTCBfX3N0bF9uZXcoc2l6ZV90IF9fbikgICB7IF9TVExQX0NIRUNLX05VTExfQUxMT0MoOjpvcGVyYXRvciBfU1RMUF9ORVcoX19uLCBfX0ZJTEVfXywgX19MSU5FX18pKTsgfQotaW5saW5lIHZvaWQgIF9TVExQX0NBTEwgX19zdGxfZGVsZXRlKHZvaWQqIF9fcCkgeyA6Om9wZXJhdG9yIGRlbGV0ZShfX3AsIF9fRklMRV9fLCBfX0xJTkVfXyk7IH0KLSMgIGVsc2UKLWlubGluZSB2b2lkKiBfU1RMUF9DQUxMIF9fc3RsX25ldyhzaXplX3QgX19uKSAgIHsgX1NUTFBfQ0hFQ0tfTlVMTF9BTExPQyg6Om9wZXJhdG9yIF9TVExQX05FVyhfX24pKTsgfQotaW5saW5lIHZvaWQgIF9TVExQX0NBTEwgX19zdGxfZGVsZXRlKHZvaWQqIF9fcCkgeyA6Om9wZXJhdG9yIGRlbGV0ZShfX3ApOyB9Ci0jICBlbmRpZgotX1NUTFBfRU5EX05BTUVTUEFDRQotCi0jZW5kaWYgLyogX1NUTFBfUlRUSV9CVUcgKi8KLQotI2VuZGlmIC8qIF9TVExQX0lOVEVSTkFMX05FVyAqLwotCi0KLS8qCi0gKiBMb2NhbCBWYXJpYWJsZXM6Ci0gKiBtb2RlOkMrKwotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9zdGwvX251bGxfc3RyZWFtLmggYi9zdGwvX251bGxfc3RyZWFtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjZGI3YTIuLjAwMDAwMDAKLS0tIGEvc3RsL19udWxsX3N0cmVhbS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMAotICogQm9yaXMgRm9taXRjaGV2Ci0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICovCi0KLSNpZm5kZWYgX1NUTFBfTlVMTF9TVFJFQU1fSAotIyBkZWZpbmUgX1NUTFBfTlVMTF9TVFJFQU1fSAotCi1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLQotc3RydWN0IF9fbnVsbF9zdHJlYW0KLXsKLSAgICB2b2lkIGZsdXNoKCkgeyB9Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotX19udWxsX3N0cmVhbSYgb3BlcmF0b3IgPDwoX19udWxsX3N0cmVhbSYgX194LCBjb25zdCBfVHAmICkKLXsKLSAgICByZXR1cm4gX194OwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotX19udWxsX3N0cmVhbSYgb3BlcmF0b3IgPj4oY29uc3QgX1RwJiwgX19udWxsX3N0cmVhbSYgX194ICkKLXsKLSAgICByZXR1cm4gX194OwotfQotCi1leHRlcm4gX19udWxsX3N0cmVhbSBjaW4sIGNvdXQsIGNlcnIsIGVuZGwsIHdzLCBoZXgsIGRlYzsKLQotX1NUTFBfRU5EX05BTUVTUEFDRQotCi0jIGVuZGlmCmRpZmYgLS1naXQgYS9zdGwvX251bV9nZXQuYyBiL3N0bC9fbnVtX2dldC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTEyOTkzLi4wMDAwMDAwCi0tLSBhL3N0bC9fbnVtX2dldC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjc5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogQm9yaXMgRm9taXRjaGV2Ci0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICovCi0jaWZuZGVmIF9TVExQX05VTV9HRVRfQwotI2RlZmluZSBfU1RMUF9OVU1fR0VUX0MKLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9OVU1fR0VUX0gKLSMgIGluY2x1ZGUgPHN0bC9fbnVtX2dldC5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfTElNSVRTCi0jICBpbmNsdWRlIDxzdGwvX2xpbWl0cy5oPgotI2VuZGlmCi0KLV9TVExQX0JFR0lOX05BTUVTUEFDRQotCi1fU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCi0KLV9TVExQX0RFQ0xTUEVDIHVuc2lnbmVkIGNoYXIgX1NUTFBfQ0FMTCBfX2RpZ2l0X3ZhbF90YWJsZSh1bnNpZ25lZCk7Ci1fU1RMUF9ERUNMU1BFQyBjb25zdCBjaGFyKiBfU1RMUF9DQUxMIF9fbmFycm93X2F0b21zKCk7Ci0KLXRlbXBsYXRlIDwgY2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX0ludGVnZXIsIGNsYXNzIF9DaGFyVD4KLV9JbnB1dEl0ZXIgX1NUTFBfQ0FMTAotX19kb19nZXRfaW50ZWdlcihfSW5wdXRJdGVyJiwgX0lucHV0SXRlciYsIGlvc19iYXNlJiwgaW9zX2Jhc2U6Omlvc3RhdGUmLCBfSW50ZWdlciYsIF9DaGFyVCopOwotCi0vLyBfX2RvX2dldF9pbnRlZ2VyIGFuZCBpdHMgaGVscGVyIGZ1bmN0aW9ucy4KLQotaW5saW5lIGJvb2wgX1NUTFBfQ0FMTCBfX2dldF9mZGlnaXQoY2hhciBfX2MsIGNvbnN0IGNoYXIqKQoteyByZXR1cm4gX19jID49ICcwJyAmJiBfX2MgPD0gJzknOyB9Ci0KLWlubGluZSBib29sIF9TVExQX0NBTEwgX19nZXRfZmRpZ2l0X29yX3NlcChjaGFyJiBfX2MsIGNoYXIgX19zZXAsIGNvbnN0IGNoYXIgKl9fZGlnaXRzKSB7Ci0gIGlmIChfX2MgPT0gX19zZXApIHsKLSAgICBfX2MgPSAnLCcgOwotICAgIHJldHVybiB0cnVlIDsKLSAgfQotICBlbHNlCi0gICAgcmV0dXJuICBfX2dldF9mZGlnaXQoX19jLCBfX2RpZ2l0cyk7Ci19Ci0KLWlubGluZSBpbnQgX1NUTFBfQ0FMTAotX19nZXRfZGlnaXRfZnJvbV90YWJsZSh1bnNpZ25lZCBfX2luZGV4KQoteyByZXR1cm4gKF9faW5kZXggPiAxMjcgPyAweEZGIDogX19kaWdpdF92YWxfdGFibGUoX19pbmRleCkpOyB9Ci0KLXRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfQ2hhclQ+Ci1pbnQKLV9fZ2V0X2Jhc2Vfb3JfemVybyhfSW5wdXRJdGVyJiBfX2luX2l0ZSwgX0lucHV0SXRlciYgX19lbmQsIGlvc19iYXNlJiBfX3N0ciwgX0NoYXJUKikgewotICBfQ2hhclQgX19hdG9tc1s1XTsKLSAgY29uc3QgY3R5cGU8X0NoYXJUPiYgX19jX3R5cGUgPSAqX19TVEFUSUNfQ0FTVChjb25zdCBjdHlwZTxfQ2hhclQ+KiwgX19zdHIuX01fY3R5cGVfZmFjZXQoKSk7Ci0KLSAgX19jX3R5cGUud2lkZW4oX19uYXJyb3dfYXRvbXMoKSwgX19uYXJyb3dfYXRvbXMoKSArIDUsIF9fYXRvbXMpOwotCi0gIGJvb2wgX19uZWdhdGl2ZSA9IGZhbHNlOwotICBfQ2hhclQgX19jID0gKl9faW5faXRlOwotCi0gIGlmIChfX2MgPT0gX19hdG9tc1sxXSAvKiBfX3htaW51c19jaGFyICovICkgewotICAgIF9fbmVnYXRpdmUgPSB0cnVlOwotICAgICsrX19pbl9pdGU7Ci0gIH0KLSAgZWxzZSBpZiAoX19jID09IF9fYXRvbXNbMF0gLyogX194cGx1c19jaGFyICovICkKLSAgICArK19faW5faXRlOwotCi0gIGludCBfX2Jhc2U7Ci0gIGludCBfX3ZhbGlkX3plcm8gPSAwOwotCi0gIGlvc19iYXNlOjpmbXRmbGFncyBfX2Jhc2VmaWVsZCA9IF9fc3RyLmZsYWdzKCkgJiBpb3NfYmFzZTo6YmFzZWZpZWxkOwotCi0gIHN3aXRjaCAoX19iYXNlZmllbGQpIHsKLSAgY2FzZSBpb3NfYmFzZTo6b2N0OgotICAgIF9fYmFzZSA9IDg7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgaW9zX2Jhc2U6OmRlYzoKLSAgICBfX2Jhc2UgPSAxMDsKLSAgICBicmVhazsKLSAgY2FzZSBpb3NfYmFzZTo6aGV4OgotICAgIF9fYmFzZSA9IDE2OwotICAgIGlmIChfX2luX2l0ZSAhPSBfX2VuZCAmJiAqX19pbl9pdGUgPT0gX19hdG9tc1syXSAvKiBfX3plcm9fY2hhciAqLyApIHsKLSAgICAgICsrX19pbl9pdGU7Ci0gICAgICBpZiAoX19pbl9pdGUgIT0gX19lbmQgJiYKLSAgICAgICAgICAoKl9faW5faXRlID09IF9fYXRvbXNbM10gLyogX194X2NoYXIgKi8gfHwgKl9faW5faXRlID09IF9fYXRvbXNbNF0gLyogX19YX2NoYXIgKi8gKSkKLSAgICAgICAgKytfX2luX2l0ZTsKLSAgICAgIGVsc2UKLSAgICAgICAgX192YWxpZF96ZXJvID0gMTsgLy8gVGhhdCB6ZXJvIGlzIHZhbGlkIGJ5IGl0c2VsZi4KLSAgICB9Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgaWYgKF9faW5faXRlICE9IF9fZW5kICYmICpfX2luX2l0ZSA9PSBfX2F0b21zWzJdIC8qIF9femVyb19jaGFyICovICkgewotICAgICAgKytfX2luX2l0ZTsKLSAgICAgIGlmIChfX2luX2l0ZSAhPSBfX2VuZCAmJgotICAgICAgICAgICgqX19pbl9pdGUgPT0gX19hdG9tc1szXSAvKiBfX3hfY2hhciAqLyB8fCAqX19pbl9pdGUgPT0gX19hdG9tc1s0XSAvKiBfX1hfY2hhciAqLyApKSB7Ci0gICAgICAgICsrX19pbl9pdGU7Ci0gICAgICAgIF9fYmFzZSA9IDE2OwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgX19iYXNlID0gODsKLSAgICAgICAgICBfX3ZhbGlkX3plcm8gPSAxOyAvLyBUaGF0IHplcm8gaXMgc3RpbGwgdmFsaWQgYnkgaXRzZWxmLgotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIF9fYmFzZSA9IDEwOwotICAgIGJyZWFrOwotICB9Ci0gIHJldHVybiAoX19iYXNlIDw8IDIpIHwgKChpbnQpX19uZWdhdGl2ZSA8PCAxKSB8IF9fdmFsaWRfemVybzsKLX0KLQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX0ludGVnZXIsIGNsYXNzIF9DaGFyVD4KLWJvb2wgX1NUTFBfQ0FMTAotX19nZXRfaW50ZWdlcihfSW5wdXRJdGVyJiBfX2ZpcnN0LCBfSW5wdXRJdGVyJiBfX2xhc3QsCi0gICAgICAgICAgICAgIGludCBfX2Jhc2UsIF9JbnRlZ2VyJiBfX3ZhbCwKLSAgICAgICAgICAgICAgaW50IF9fZ290LCBib29sIF9faXNfbmVnYXRpdmUsIF9DaGFyVCBfX3NlcGFyYXRvciwgY29uc3Qgc3RyaW5nJiBfX2dyb3VwaW5nLCBjb25zdCBfX3RydWVfdHlwZSYgLypfSXNTaWduZWQqLykgewotICBib29sIF9fb3ZmbG93ID0gZmFsc2U7Ci0gIF9JbnRlZ2VyIF9fcmVzdWx0ID0gMDsKLSAgYm9vbCBfX2lzX2dyb3VwID0gIV9fZ3JvdXBpbmcuZW1wdHkoKTsKLSAgY2hhciBfX2dyb3VwX3NpemVzWzY0XTsKLSAgY2hhciBfX2N1cnJlbnRfZ3JvdXBfc2l6ZSA9IDA7Ci0gIGNoYXIqIF9fZ3JvdXBfc2l6ZXNfZW5kID0gX19ncm91cF9zaXplczsKLQotICBfSW50ZWdlciBfX292ZXJfYmFzZSA9IChudW1lcmljX2xpbWl0czxfSW50ZWdlcj46Om1pbikoKSAvIF9fU1RBVElDX0NBU1QoX0ludGVnZXIsIF9fYmFzZSk7Ci0KLSAgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3QgOyArK19fZmlyc3QpIHsKLQotICAgICBjb25zdCBfQ2hhclQgX19jID0gKl9fZmlyc3Q7Ci0KLSAgICAgaWYgKF9faXNfZ3JvdXAgJiYgX19jID09IF9fc2VwYXJhdG9yKSB7Ci0gICAgICAgKl9fZ3JvdXBfc2l6ZXNfZW5kKysgPSBfX2N1cnJlbnRfZ3JvdXBfc2l6ZTsKLSAgICAgICBfX2N1cnJlbnRfZ3JvdXBfc2l6ZSA9IDA7Ci0gICAgICAgY29udGludWU7Ci0gICAgIH0KLQotICAgICBpbnQgX19uID0gX19nZXRfZGlnaXRfZnJvbV90YWJsZShfX2MpOwotCi0gICAgIGlmIChfX24gPj0gX19iYXNlKQotICAgICAgIGJyZWFrOwotCi0gICAgICsrX19nb3Q7Ci0gICAgICsrX19jdXJyZW50X2dyb3VwX3NpemU7Ci0KLSAgICAgaWYgKF9fcmVzdWx0IDwgX19vdmVyX2Jhc2UpCi0gICAgICAgX19vdmZsb3cgPSB0cnVlOyAgLy8gZG9uJ3QgbmVlZCB0byBrZWVwIGFjY3VtdWxhdGluZwotICAgICBlbHNlIHsKLSAgICAgICBfSW50ZWdlciBfX25leHQgPSBfX1NUQVRJQ19DQVNUKF9JbnRlZ2VyLCBfX2Jhc2UgKiBfX3Jlc3VsdCAtIF9fbik7Ci0gICAgICAgaWYgKF9fcmVzdWx0ICE9IDApCi0gICAgICAgICBfX292ZmxvdyA9IF9fb3ZmbG93IHx8IF9fbmV4dCA+PSBfX3Jlc3VsdDsKLSAgICAgICBfX3Jlc3VsdCA9IF9fbmV4dDsKLSAgICAgfQotICAgfQotCi0gICBpZiAoX19pc19ncm91cCAmJiBfX2dyb3VwX3NpemVzX2VuZCAhPSBfX2dyb3VwX3NpemVzKSB7Ci0gICAgICpfX2dyb3VwX3NpemVzX2VuZCsrID0gX19jdXJyZW50X2dyb3VwX3NpemU7Ci0gICB9Ci0KLSAgIC8vIGZicCA6IGFkZGVkIHRvIG5vdCBtb2RpZnkgdmFsdWUgaWYgbm90aGluZyB3YXMgcmVhZAotICAgaWYgKF9fZ290ID4gMCkgewotICAgICAgIF9fdmFsID0gX19vdmZsb3cgPyBfX2lzX25lZ2F0aXZlID8gKG51bWVyaWNfbGltaXRzPF9JbnRlZ2VyPjo6bWluKSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAobnVtZXJpY19saW1pdHM8X0ludGVnZXI+OjptYXgpKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIDogX19pc19uZWdhdGl2ZSA/IF9fcmVzdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfX1NUQVRJQ19DQVNUKF9JbnRlZ2VyLCAtX19yZXN1bHQpOwotICAgfQotICAvLyBvdmVyZmxvdyBpcyBiZWluZyB0cmVhdGVkIGFzIGZhaWx1cmUKLSAgcmV0dXJuICgoX19nb3QgPiAwKSAmJiAhX19vdmZsb3cpICYmCi0gICAgICAgICAgKF9faXNfZ3JvdXAgPT0gMCB8fAotICAgICAgICAgICBfX3ZhbGlkX2dyb3VwaW5nKF9fZ3JvdXBfc2l6ZXMsIF9fZ3JvdXBfc2l6ZXNfZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZ3JvdXBpbmcuZGF0YSgpLCBfX2dyb3VwaW5nLmRhdGEoKSsgX19ncm91cGluZy5zaXplKCkpKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9JbnRlZ2VyLCBjbGFzcyBfQ2hhclQ+Ci1ib29sIF9TVExQX0NBTEwKLV9fZ2V0X2ludGVnZXIoX0lucHV0SXRlciYgX19maXJzdCwgX0lucHV0SXRlciYgX19sYXN0LAotICAgICAgICAgICAgICBpbnQgX19iYXNlLCBfSW50ZWdlciYgX192YWwsCi0gICAgICAgICAgICAgIGludCBfX2dvdCwgYm9vbCBfX2lzX25lZ2F0aXZlLCBfQ2hhclQgX19zZXBhcmF0b3IsIGNvbnN0IHN0cmluZyYgX19ncm91cGluZywgY29uc3QgX19mYWxzZV90eXBlJiAvKl9Jc1NpZ25lZCovKSB7Ci0gIGJvb2wgX19vdmZsb3cgPSBmYWxzZTsKLSAgX0ludGVnZXIgX19yZXN1bHQgPSAwOwotICBib29sIF9faXNfZ3JvdXAgPSAhX19ncm91cGluZy5lbXB0eSgpOwotICBjaGFyIF9fZ3JvdXBfc2l6ZXNbNjRdOwotICBjaGFyIF9fY3VycmVudF9ncm91cF9zaXplID0gMDsKLSAgY2hhciogX19ncm91cF9zaXplc19lbmQgPSBfX2dyb3VwX3NpemVzOwotCi0gIF9JbnRlZ2VyICBfX292ZXJfYmFzZSA9IChudW1lcmljX2xpbWl0czxfSW50ZWdlcj46Om1heCkoKSAvIF9fU1RBVElDX0NBU1QoX0ludGVnZXIsIF9fYmFzZSk7Ci0KLSAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdCA7ICsrX19maXJzdCkgewotCi0gICAgY29uc3QgX0NoYXJUIF9fYyA9ICpfX2ZpcnN0OwotCi0gICAgaWYgKF9faXNfZ3JvdXAgJiYgX19jID09IF9fc2VwYXJhdG9yKSB7Ci0gICAgICAqX19ncm91cF9zaXplc19lbmQrKyA9IF9fY3VycmVudF9ncm91cF9zaXplOwotICAgICAgX19jdXJyZW50X2dyb3VwX3NpemUgPSAwOwotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgaW50IF9fbiA9IF9fZ2V0X2RpZ2l0X2Zyb21fdGFibGUoX19jKTsKLQotICAgIGlmIChfX24gPj0gX19iYXNlKQotICAgICAgYnJlYWs7Ci0KLSAgICArK19fZ290OwotICAgICsrX19jdXJyZW50X2dyb3VwX3NpemU7Ci0KLSAgICBpZiAoX19yZXN1bHQgPiBfX292ZXJfYmFzZSkKLSAgICAgIF9fb3ZmbG93ID0gdHJ1ZTsgIC8vZG9uJ3QgbmVlZCB0byBrZWVwIGFjY3VtdWxhdGluZwotICAgIGVsc2UgewotICAgICAgX0ludGVnZXIgX19uZXh0ID0gX19TVEFUSUNfQ0FTVChfSW50ZWdlciwgX19iYXNlICogX19yZXN1bHQgKyBfX24pOwotICAgICAgaWYgKF9fcmVzdWx0ICE9IDApCi0gICAgICAgIF9fb3ZmbG93ID0gX19vdmZsb3cgfHwgX19uZXh0IDw9IF9fcmVzdWx0OwotICAgICAgICBfX3Jlc3VsdCA9IF9fbmV4dDsKLSAgICAgIH0KLSAgfQotCi0gIGlmIChfX2lzX2dyb3VwICYmIF9fZ3JvdXBfc2l6ZXNfZW5kICE9IF9fZ3JvdXBfc2l6ZXMpIHsKLSAgICAgICpfX2dyb3VwX3NpemVzX2VuZCsrID0gX19jdXJyZW50X2dyb3VwX3NpemU7Ci0gIH0KLQotICAvLyBmYnAgOiBhZGRlZCB0byBub3QgbW9kaWZ5IHZhbHVlIGlmIG5vdGhpbmcgd2FzIHJlYWQKLSAgaWYgKF9fZ290ID4gMCkgewotICAgICAgX192YWwgPSBfX292ZmxvdyA/IChudW1lcmljX2xpbWl0czxfSW50ZWdlcj46Om1heCkoKQotICAgICAgICAgICAgICAgICAgICAgICA6IChfX2lzX25lZ2F0aXZlID8gX19TVEFUSUNfQ0FTVChfSW50ZWdlciwgLV9fcmVzdWx0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX19yZXN1bHQpOwotICB9Ci0KLSAgLy8gb3ZlcmZsb3cgaXMgYmVpbmcgdHJlYXRlZCBhcyBmYWlsdXJlCi0gIHJldHVybiAoKF9fZ290ID4gMCkgJiYgIV9fb3ZmbG93KSAmJgotICAgICAgICAgIChfX2lzX2dyb3VwID09IDAgfHwKLSAgICAgICAgICAgX192YWxpZF9ncm91cGluZyhfX2dyb3VwX3NpemVzLCBfX2dyb3VwX3NpemVzX2VuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2dyb3VwaW5nLmRhdGEoKSwgX19ncm91cGluZy5kYXRhKCkrIF9fZ3JvdXBpbmcuc2l6ZSgpKSk7Ci19Ci0KLQotdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9JbnRlZ2VyLCBjbGFzcyBfQ2hhclQ+Ci1ib29sIF9TVExQX0NBTEwKLV9fZ2V0X2RlY2ltYWxfaW50ZWdlcihfSW5wdXRJdGVyJiBfX2ZpcnN0LCBfSW5wdXRJdGVyJiBfX2xhc3QsIF9JbnRlZ2VyJiBfX3ZhbCwgX0NoYXJUKiAvKmR1bW15Ki8pIHsKLSAgc3RyaW5nIF9fZ3JwOwotICAvL0hlcmUgdGhlcmUgaXMgbm8gZ3JvdXBpbmcgc28gc2VwYXJhdG9yIGlzIG5vdCBpbXBvcnRhbnQsIHdlIGp1c3QgcGFzcyB0aGUgZGVmYXVsdCBjaGFyYXRlci4KLSAgcmV0dXJuIF9fZ2V0X2ludGVnZXIoX19maXJzdCwgX19sYXN0LCAxMCwgX192YWwsIDAsIGZhbHNlLCBfQ2hhclQoKSAvKnNlcGFyYXRvciovLCBfX2dycCwgX19mYWxzZV90eXBlKCkpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX0ludGVnZXIsIGNsYXNzIF9DaGFyVD4KLV9JbnB1dEl0ZXIgX1NUTFBfQ0FMTAotX19kb19nZXRfaW50ZWdlcihfSW5wdXRJdGVyJiBfX2luX2l0ZSwgX0lucHV0SXRlciYgX19lbmQsIGlvc19iYXNlJiBfX3N0ciwKLSAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCBfSW50ZWdlciYgX192YWwsIF9DaGFyVCogX19wYykgewotI2lmIGRlZmluZWQgKF9fSFBfYUNDKSAmJiAoX19IUF9hQ0MgPT0gMSkKLSAgYm9vbCBfSXNTaWduZWQgPSAhKChfSW50ZWdlcikoLTEpID4gMCk7Ci0jZWxzZQotICB0eXBlZGVmIHR5cGVuYW1lIF9fYm9vbDJ0eXBlPG51bWVyaWNfbGltaXRzPF9JbnRlZ2VyPjo6aXNfc2lnbmVkPjo6X1JldCBfSXNTaWduZWQ7Ci0jZW5kaWYKLQotICBjb25zdCBudW1wdW5jdDxfQ2hhclQ+JiBfX251bXB1bmN0ID0gKl9fU1RBVElDX0NBU1QoY29uc3QgbnVtcHVuY3Q8X0NoYXJUPiosIF9fc3RyLl9NX251bXB1bmN0X2ZhY2V0KCkpOwotICBjb25zdCBzdHJpbmcmIF9fZ3JvdXBpbmcgPSBfX3N0ci5fTV9ncm91cGluZygpOyAvLyBjYWNoZWQgY29weQotCi0gIGNvbnN0IGludCBfX2Jhc2Vfb3JfemVybyA9IF9fZ2V0X2Jhc2Vfb3JfemVybyhfX2luX2l0ZSwgX19lbmQsIF9fc3RyLCBfX3BjKTsKLSAgaW50ICBfX2dvdCA9IF9fYmFzZV9vcl96ZXJvICYgMTsKLQotICBib29sIF9fcmVzdWx0OwotCi0gIGlmIChfX2luX2l0ZSA9PSBfX2VuZCkgeyAgICAgIC8vIFdlIG1heSBoYXZlIGFscmVhZHkgcmVhZCBhIDAuICBJZiBzbywKLQotICAgIGlmIChfX2dvdCA+IDApIHsgICAgICAgLy8gdGhlIHJlc3VsdCBpcyAwIGV2ZW4gaWYgd2UncmUgYXQgZW9mLgotICAgICAgX192YWwgPSAwOwotICAgICAgX19yZXN1bHQgPSB0cnVlOwotICAgIH0KLSAgICBlbHNlCi0gICAgICBfX3Jlc3VsdCA9IGZhbHNlOwotICB9Ci0gIGVsc2UgewotICAgIGNvbnN0IGJvb2wgX19uZWdhdGl2ZSA9IChfX2Jhc2Vfb3JfemVybyAmIDIpICE9IDA7Ci0gICAgY29uc3QgaW50IF9fYmFzZSA9IF9fYmFzZV9vcl96ZXJvID4+IDI7Ci0KLSNpZiBkZWZpbmVkIChfX0hQX2FDQykgJiYgKF9fSFBfYUNDID09IDEpCi0gICAgaWYgKF9Jc1NpZ25lZCkKLSAgICAgIF9fcmVzdWx0ID0gX19nZXRfaW50ZWdlcihfX2luX2l0ZSwgX19lbmQsIF9fYmFzZSwgIF9fdmFsLCBfX2dvdCwgX19uZWdhdGl2ZSwgX19udW1wdW5jdC50aG91c2FuZHNfc2VwKCksIF9fZ3JvdXBpbmcsIF9fdHJ1ZV90eXBlKCkgKTsKLSAgICBlbHNlCi0gICAgICBfX3Jlc3VsdCA9IF9fZ2V0X2ludGVnZXIoX19pbl9pdGUsIF9fZW5kLCBfX2Jhc2UsICBfX3ZhbCwgX19nb3QsIF9fbmVnYXRpdmUsIF9fbnVtcHVuY3QudGhvdXNhbmRzX3NlcCgpLCBfX2dyb3VwaW5nLCBfX2ZhbHNlX3R5cGUoKSApOwotI2Vsc2UKLSAgICBfX3Jlc3VsdCA9IF9fZ2V0X2ludGVnZXIoX19pbl9pdGUsIF9fZW5kLCBfX2Jhc2UsICBfX3ZhbCwgX19nb3QsIF9fbmVnYXRpdmUsIF9fbnVtcHVuY3QudGhvdXNhbmRzX3NlcCgpLCBfX2dyb3VwaW5nLCBfSXNTaWduZWQoKSk7Ci0jIGVuZGlmCi0gIH0KLQotICBfX2VyciA9IF9fU1RBVElDX0NBU1QoaW9zX2Jhc2U6Omlvc3RhdGUsIF9fcmVzdWx0ID8gaW9zX2Jhc2U6Omdvb2RiaXQgOiBpb3NfYmFzZTo6ZmFpbGJpdCk7Ci0KLSAgaWYgKF9faW5faXRlID09IF9fZW5kKQotICAgIF9fZXJyIHw9IGlvc19iYXNlOjplb2ZiaXQ7Ci0gIHJldHVybiBfX2luX2l0ZTsKLX0KLQotLy8gX19yZWFkX2Zsb2F0IGFuZCBpdHMgaGVscGVyIGZ1bmN0aW9ucy4KLXRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfQ2hhclQ+Ci1fSW5wdXRJdGVyICBfU1RMUF9DQUxMCi1fX2NvcHlfc2lnbihfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LCBfX2lvc3RyaW5nJiBfX3YsCi0gICAgICAgICAgICBfQ2hhclQgX194cGx1cywgX0NoYXJUIF9feG1pbnVzKSB7Ci0gIGlmIChfX2ZpcnN0ICE9IF9fbGFzdCkgewotICAgIF9DaGFyVCBfX2MgPSAqX19maXJzdDsKLSAgICBpZiAoX19jID09IF9feHBsdXMpCi0gICAgICArK19fZmlyc3Q7Ci0gICAgZWxzZSBpZiAoX19jID09IF9feG1pbnVzKSB7Ci0gICAgICBfX3YucHVzaF9iYWNrKCctJyk7Ci0gICAgICArK19fZmlyc3Q7Ci0gICAgfQotICB9Ci0gIHJldHVybiBfX2ZpcnN0OwotfQotCi0KLXRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfQ2hhclQ+Ci1ib29sIF9TVExQX0NBTEwKLV9fY29weV9kaWdpdHMoX0lucHV0SXRlciYgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCi0gICAgICAgICAgICAgIF9faW9zdHJpbmcmIF9fdiwgY29uc3QgX0NoYXJUKiBfX2RpZ2l0cykgewotICBib29sIF9fb2sgPSBmYWxzZTsKLQotICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpIHsKLSAgICBfQ2hhclQgX19jID0gKl9fZmlyc3Q7Ci0gICAgaWYgKF9fZ2V0X2ZkaWdpdChfX2MsIF9fZGlnaXRzKSkgewotICAgICAgX192LnB1c2hfYmFjaygoY2hhcilfX2MpOwotICAgICAgX19vayA9IHRydWU7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIGJyZWFrOwotICB9Ci0gIHJldHVybiBfX29rOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX0NoYXJUPgotYm9vbCBfU1RMUF9DQUxMCi1fX2NvcHlfZ3JvdXBlZF9kaWdpdHMoX0lucHV0SXRlciYgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgX19pb3N0cmluZyYgX192LCBjb25zdCBfQ2hhclQgKiBfX2RpZ2l0cywKLSAgICAgICAgICAgICAgICAgICAgICBfQ2hhclQgX19zZXAsIGNvbnN0IHN0cmluZyYgX19ncm91cGluZywKLSAgICAgICAgICAgICAgICAgICAgICBib29sJiBfX2dyb3VwaW5nX29rKSB7Ci0gIGJvb2wgX19vayA9IGZhbHNlOwotICBjaGFyIF9fZ3JvdXBfc2l6ZXNbNjRdOwotICBjaGFyKl9fZ3JvdXBfc2l6ZXNfZW5kID0gX19ncm91cF9zaXplczsKLSAgY2hhciBfX2N1cnJlbnRfZ3JvdXBfc2l6ZSA9IDA7Ci0KLSAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KSB7Ci0gICAgX0NoYXJUIF9fYyA9ICpfX2ZpcnN0OwotICAgIGJvb2wgX190bXAgPSBfX2dldF9mZGlnaXRfb3Jfc2VwKF9fYywgX19zZXAsIF9fZGlnaXRzKTsKLSAgICBpZiAoX190bXApIHsKLSAgICAgIGlmIChfX2MgPT0gJywnKSB7Ci0gICAgICAgICpfX2dyb3VwX3NpemVzX2VuZCsrID0gX19jdXJyZW50X2dyb3VwX3NpemU7Ci0gICAgICAgIF9fY3VycmVudF9ncm91cF9zaXplID0gMDsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBfX29rID0gdHJ1ZTsKLSAgICAgICAgX192LnB1c2hfYmFjaygoY2hhcilfX2MpOwotICAgICAgICArK19fY3VycmVudF9ncm91cF9zaXplOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgICBicmVhazsKLSAgfQotCi0gIGlmIChfX2dyb3VwX3NpemVzX2VuZCAhPSBfX2dyb3VwX3NpemVzKQotICAgICpfX2dyb3VwX3NpemVzX2VuZCsrID0gX19jdXJyZW50X2dyb3VwX3NpemU7Ci0gIF9fZ3JvdXBpbmdfb2sgPSBfX3ZhbGlkX2dyb3VwaW5nKF9fZ3JvdXBfc2l6ZXMsIF9fZ3JvdXBfc2l6ZXNfZW5kLCBfX2dyb3VwaW5nLmRhdGEoKSwgX19ncm91cGluZy5kYXRhKCkgKyBfX2dyb3VwaW5nLnNpemUoKSk7Ci0gIHJldHVybiBfX29rOwotfQotCi0KLXRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfQ2hhclQ+Ci1ib29sIF9TVExQX0NBTEwKLV9fcmVhZF9mbG9hdChfX2lvc3RyaW5nJiBfX2J1ZiwgX0lucHV0SXRlciYgX19pbl9pdGUsIF9JbnB1dEl0ZXImIF9fZW5kLCBpb3NfYmFzZSYgX19zLCBfQ2hhclQqKSB7Ci0gIC8vIENyZWF0ZSBhIHN0cmluZywgY29weWluZyBjaGFyYWN0ZXJzIG9mIHRoZSBmb3JtCi0gIC8vIFsrLV0/IFswLTldKiAuPyBbMC05XSogKFtlRV0gWystXT8gWzAtOV0rKT8KLQotICBib29sIF9fZGlnaXRzX2JlZm9yZV9kb3QgLyogPSBmYWxzZSAqLzsKLSAgYm9vbCBfX2RpZ2l0c19hZnRlcl9kb3QgPSBmYWxzZTsKLSAgYm9vbCBfX29rOwotCi0gIGJvb2wgICBfX2dyb3VwaW5nX29rID0gdHJ1ZTsKLQotICBjb25zdCBjdHlwZTxfQ2hhclQ+JiBfX2N0ID0gKl9fU1RBVElDX0NBU1QoY29uc3QgY3R5cGU8X0NoYXJUPiosIF9fcy5fTV9jdHlwZV9mYWNldCgpKTsKLSAgY29uc3QgbnVtcHVuY3Q8X0NoYXJUPiYgX19udW1wdW5jdCA9ICpfX1NUQVRJQ19DQVNUKGNvbnN0IG51bXB1bmN0PF9DaGFyVD4qLCBfX3MuX01fbnVtcHVuY3RfZmFjZXQoKSk7Ci0gIGNvbnN0IHN0cmluZyYgX19ncm91cGluZyA9IF9fcy5fTV9ncm91cGluZygpOyAvLyBjYWNoZWQgY29weQotCi0gIF9DaGFyVCBfX2RvdCA9IF9fbnVtcHVuY3QuZGVjaW1hbF9wb2ludCgpOwotICBfQ2hhclQgX19zZXAgPSBfX251bXB1bmN0LnRob3VzYW5kc19zZXAoKTsKLQotICBfQ2hhclQgX19kaWdpdHNbMTBdOwotICBfQ2hhclQgX194cGx1czsKLSAgX0NoYXJUIF9feG1pbnVzOwotCi0gIF9DaGFyVCBfX3Bvd19lOwotICBfQ2hhclQgX19wb3dfRTsKLQotICBfSW5pdGlhbGl6ZV9nZXRfZmxvYXQoX19jdCwgX194cGx1cywgX194bWludXMsIF9fcG93X2UsIF9fcG93X0UsIF9fZGlnaXRzKTsKLQotICAvLyBHZXQgYW4gb3B0aW9uYWwgc2lnbgotICBfX2luX2l0ZSA9IF9fY29weV9zaWduKF9faW5faXRlLCBfX2VuZCwgX19idWYsIF9feHBsdXMsIF9feG1pbnVzKTsKLQotICAvLyBHZXQgYW4gb3B0aW9uYWwgc3RyaW5nIG9mIGRpZ2l0cy4KLSAgaWYgKCFfX2dyb3VwaW5nLmVtcHR5KCkpCi0gICAgX19kaWdpdHNfYmVmb3JlX2RvdCA9IF9fY29weV9ncm91cGVkX2RpZ2l0cyhfX2luX2l0ZSwgX19lbmQsIF9fYnVmLCBfX2RpZ2l0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fc2VwLCBfX2dyb3VwaW5nLCBfX2dyb3VwaW5nX29rKTsKLSAgZWxzZQotICAgIF9fZGlnaXRzX2JlZm9yZV9kb3QgPSBfX2NvcHlfZGlnaXRzKF9faW5faXRlLCBfX2VuZCwgX19idWYsIF9fZGlnaXRzKTsKLQotICAvLyBHZXQgYW4gb3B0aW9uYWwgZGVjaW1hbCBwb2ludCwgYW5kIGFuIG9wdGlvbmFsIHN0cmluZyBvZiBkaWdpdHMuCi0gIGlmIChfX2luX2l0ZSAhPSBfX2VuZCAmJiAqX19pbl9pdGUgPT0gX19kb3QpIHsKLSAgICBfX2J1Zi5wdXNoX2JhY2soJy4nKTsKLSAgICArK19faW5faXRlOwotICAgIF9fZGlnaXRzX2FmdGVyX2RvdCA9IF9fY29weV9kaWdpdHMoX19pbl9pdGUsIF9fZW5kLCBfX2J1ZiwgX19kaWdpdHMpOwotICB9Ci0KLSAgLy8gVGhlcmUgaGF2ZSB0byBiZSBzb21lIGRpZ2l0cywgc29tZXdoZXJlLgotICBfX29rID0gX19kaWdpdHNfYmVmb3JlX2RvdCB8fCBfX2RpZ2l0c19hZnRlcl9kb3Q7Ci0KLSAgLy8gR2V0IGFuIG9wdGlvbmFsIGV4cG9uZW50LgotICBpZiAoX19vayAmJiBfX2luX2l0ZSAhPSBfX2VuZCAmJiAoKl9faW5faXRlID09IF9fcG93X2UgfHwgKl9faW5faXRlID09IF9fcG93X0UpKSB7Ci0gICAgX19idWYucHVzaF9iYWNrKCdlJyk7Ci0gICAgKytfX2luX2l0ZTsKLSAgICBfX2luX2l0ZSA9IF9fY29weV9zaWduKF9faW5faXRlLCBfX2VuZCwgX19idWYsIF9feHBsdXMsIF9feG1pbnVzKTsKLSAgICBfX29rID0gX19jb3B5X2RpZ2l0cyhfX2luX2l0ZSwgX19lbmQsIF9fYnVmLCBfX2RpZ2l0cyk7Ci0gICAgLy8gSWYgd2UgaGF2ZSBhbiBleHBvbmVudCB0aGVuIHRoZSBzaWduCi0gICAgLy8gaXMgb3B0aW9uYWwgYnV0IHRoZSBkaWdpdHMgYXJlbid0LgotICB9Ci0KLSAgcmV0dXJuIF9fb2s7Ci19Ci0KLV9TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQotCi0vLwotLy8gbnVtX2dldDw+LCBudW1fcHV0PD4KLS8vCi0KLSNpZiAoIF9TVExQX1NUQVRJQ19URU1QTEFURV9EQVRBID4gMCApCi0jICBpZiAhZGVmaW5lZCAoX19CT1JMQU5EQ19fKQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0lucHV0SXRlcmF0b3I+Ci1sb2NhbGU6OmlkIG51bV9nZXQ8X0NoYXJULCBfSW5wdXRJdGVyYXRvcj46OmlkOwotIyAgZW5kaWYKLQotIyAgaWYgKGRlZmluZWQgKF9fQ1lHV0lOX18pIHx8IGRlZmluZWQgKF9fTUlOR1czMl9fKSkgJiYgXAotICAgICAgIGRlZmluZWQgKF9TVExQX1VTRV9EWU5BTUlDX0xJQikgJiYgIWRlZmluZWQgKF9fQlVJTERJTkdfU1RMUE9SVCkKLS8qCi0gKiBVbmRlciBjeWd3aW4sIHdoZW4gU1RMcG9ydCBpcyB1c2VkIGFzIGEgc2hhcmVkIGxpYnJhcnksIHRoZSBpZCBuZWVkcwotICogdG8gYmUgc3BlY2lmaWVkIGFzIGltcG9ydGVkIG90aGVyd2lzZSB0aGV5IHdpbGwgYmUgZHVwbGljYXRlZCBpbiB0aGUKLSAqIGNhbGxpbmcgZXhlY3V0YWJsZS4KLSAqLwotdGVtcGxhdGUgPD4KLV9TVExQX0RFQ0xTUEVDIGxvY2FsZTo6aWQgbnVtX2dldDxjaGFyLCBpc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4gPjo6aWQ7Ci0vKgotdGVtcGxhdGUgPD4KLV9TVExQX0RFQ0xTUEVDIGxvY2FsZTo6aWQgbnVtX2dldDxjaGFyLCBjb25zdCBjaGFyKj46OmlkOwotKi8KLQotIyAgICBpZiAhZGVmaW5lZCAoU1RMUF9OT19XQ0hBUl9UKQotdGVtcGxhdGUgPD4KLV9TVExQX0RFQ0xTUEVDIGxvY2FsZTo6aWQgbnVtX2dldDx3Y2hhcl90LCBpc3RyZWFtYnVmX2l0ZXJhdG9yPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4gPjo6aWQ7Ci0vKgotdGVtcGxhdGUgPD4KLV9TVExQX0RFQ0xTUEVDIGxvY2FsZTo6aWQgbnVtX2dldDx3Y2hhcl90LCBjb25zdCB3Y2hhcl90Kj46OmlkOwotKi8KLSMgICAgZW5kaWYKLQotIyAgZW5kaWYgLyogX19DWUdXSU5fXyAmJiBfU1RMUF9VU0VfRFlOQU1JQ19MSUIgKi8KLQotI2Vsc2UgLyogKCBfU1RMUF9TVEFUSUNfVEVNUExBVEVfREFUQSA+IDAgKSAqLwotCi0vL3R5cGVkZWYgbnVtX2dldDxjaGFyLCBjb25zdCBjaGFyKj4gbnVtX2dldF9jaGFyOwotdHlwZWRlZiBudW1fZ2V0PGNoYXIsIGlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiA+IG51bV9nZXRfY2hhcl8yOwotCi0vL19fREVDTEFSRV9JTlNUQU5DRShsb2NhbGU6OmlkLCBudW1fZ2V0X2NoYXI6OmlkLCApOwotX19ERUNMQVJFX0lOU1RBTkNFKGxvY2FsZTo6aWQsIG51bV9nZXRfY2hhcl8yOjppZCwgKTsKLQotIyAgaWYgIWRlZmluZWQgKF9TVExQX05PX1dDSEFSX1QpCi0KLS8vdHlwZWRlZiBudW1fZ2V0PHdjaGFyX3QsIGNvbnN0IHdjaGFyX3QqPiBudW1fZ2V0X3djaGFyX3Q7Ci10eXBlZGVmIG51bV9nZXQ8d2NoYXJfdCwgaXN0cmVhbWJ1Zl9pdGVyYXRvcjx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+ID4gbnVtX2dldF93Y2hhcl90XzI7Ci0KLS8vX19ERUNMQVJFX0lOU1RBTkNFKGxvY2FsZTo6aWQsIG51bV9nZXRfd2NoYXJfdDo6aWQsICk7Ci1fX0RFQ0xBUkVfSU5TVEFOQ0UobG9jYWxlOjppZCwgbnVtX2dldF93Y2hhcl90XzI6OmlkLCApOwotCi0jICBlbmRpZgotCi0jZW5kaWYgLyogKCBfU1RMUF9TVEFUSUNfVEVNUExBVEVfREFUQSA+IDAgKSAqLwotCi0jaWYgIWRlZmluZWQgKF9TVExQX05PX0JPT0wpCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfSW5wdXRJdGVyPgotX0lucHV0SXRlcgotbnVtX2dldDxfQ2hhclQsIF9JbnB1dEl0ZXI+Ojpkb19nZXQoX0lucHV0SXRlciBfX2luX2l0ZSwgX0lucHV0SXRlciBfX2VuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlJiBfX3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIGJvb2wmIF9feCkgY29uc3QgewotICBpZiAoX19zLmZsYWdzKCkgJiBpb3NfYmFzZTo6Ym9vbGFscGhhKSB7Ci0gICAgbG9jYWxlIF9fbG9jID0gX19zLmdldGxvYygpOwotICAgIGNvbnN0IF9OdW1wdW5jdCYgX19ucCA9ICpfX1NUQVRJQ19DQVNUKGNvbnN0IF9OdW1wdW5jdCosIF9fcy5fTV9udW1wdW5jdF9mYWNldCgpKTsKLSAgICAvLyAgICBjb25zdCBudW1wdW5jdDxfQ2hhclQ+JiBfX25wID0gdXNlX2ZhY2V0PG51bXB1bmN0PF9DaGFyVD4gPihfX2xvYykgOwotLy8gICAgY29uc3QgY3R5cGU8X0NoYXJUPiYgX19jdCA9ICAgIHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4oX19sb2MpIDsKLQotICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQ+IF9fdHJ1ZW5hbWUgID0gX19ucC50cnVlbmFtZSgpOwotICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQ+IF9fZmFsc2VuYW1lID0gX19ucC5mYWxzZW5hbWUoKTsKLSAgICBib29sIF9fdHJ1ZV9vayAgPSB0cnVlOwotICAgIGJvb2wgX19mYWxzZV9vayA9IHRydWU7Ci0KLSAgICBzaXplX3QgX19uID0gMDsKLSAgICBmb3IgKCA7IF9faW5faXRlICE9IF9fZW5kOyArK19faW5faXRlKSB7Ci0gICAgICBfQ2hhclQgX19jID0gKl9faW5faXRlOwotICAgICAgX190cnVlX29rICA9IF9fdHJ1ZV9vayAgJiYgKF9fYyA9PSBfX3RydWVuYW1lW19fbl0pOwotICAgICAgX19mYWxzZV9vayA9IF9fZmFsc2Vfb2sgJiYgKF9fYyA9PSBfX2ZhbHNlbmFtZVtfX25dKTsKLSAgICAgICsrX19uOwotCi0gICAgICBpZiAoKCFfX3RydWVfb2sgJiYgIV9fZmFsc2Vfb2spIHx8Ci0gICAgICAgICAgKF9fdHJ1ZV9vayAgJiYgX19uID49IF9fdHJ1ZW5hbWUuc2l6ZSgpKSB8fAotICAgICAgICAgIChfX2ZhbHNlX29rICYmIF9fbiA+PSBfX2ZhbHNlbmFtZS5zaXplKCkpKSB7Ci0gICAgICAgICsrX19pbl9pdGU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoX190cnVlX29rICAmJiBfX24gPCBfX3RydWVuYW1lLnNpemUoKSkgIF9fdHJ1ZV9vayAgPSBmYWxzZTsKLSAgICBpZiAoX19mYWxzZV9vayAmJiBfX24gPCBfX2ZhbHNlbmFtZS5zaXplKCkpIF9fZmFsc2Vfb2sgPSBmYWxzZTsKLQotICAgIGlmIChfX3RydWVfb2sgfHwgX19mYWxzZV9vaykgewotICAgICAgX19lcnIgPSBpb3NfYmFzZTo6Z29vZGJpdDsKLSAgICAgIF9feCA9IF9fdHJ1ZV9vazsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgX19lcnIgPSBpb3NfYmFzZTo6ZmFpbGJpdDsKLQotICAgIGlmIChfX2luX2l0ZSA9PSBfX2VuZCkKLSAgICAgIF9fZXJyIHw9IGlvc19iYXNlOjplb2ZiaXQ7Ci0KLSAgICByZXR1cm4gX19pbl9pdGU7Ci0gIH0KLQotICBlbHNlIHsKLSAgICBsb25nIF9fbHg7Ci0gICAgX0lucHV0SXRlciBfX3RtcCA9IHRoaXMtPmRvX2dldChfX2luX2l0ZSwgX19lbmQsIF9fcywgX19lcnIsIF9fbHgpOwotICAgIGlmICghKF9fZXJyICYgaW9zX2Jhc2U6OmZhaWxiaXQpKSB7Ci0gICAgICBpZiAoX19seCA9PSAwKQotICAgICAgICBfX3ggPSBmYWxzZTsKLSAgICAgIGVsc2UgaWYgKF9fbHggPT0gMSkKLSAgICAgICAgX194ID0gdHJ1ZTsKLSAgICAgIGVsc2UKLSAgICAgICAgX19lcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7Ci0gICAgfQotICAgIHJldHVybiBfX3RtcDsKLSAgfQotfQotCi0jZW5kaWYgLyogX1NUTFBfTk9fQk9PTCAqLwotCi0jaWYgZGVmaW5lZCAoX1NUTFBfRklYX0xJQlJBUllfSVNTVUVTKQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0lucHV0SXRlcj4KLV9JbnB1dEl0ZXIKLW51bV9nZXQ8X0NoYXJULCBfSW5wdXRJdGVyPjo6ZG9fZ2V0KF9JbnB1dEl0ZXIgX19pbl9pdGUsIF9JbnB1dEl0ZXIgX19lbmQsIGlvc19iYXNlJiBfX3N0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2Vyciwgc2hvcnQmIF9fdmFsKSBjb25zdAoteyByZXR1cm4gX1NUTFBfUFJJViBfX2RvX2dldF9pbnRlZ2VyKF9faW5faXRlLCBfX2VuZCwgX19zdHIsIF9fZXJyLCBfX3ZhbCwgKF9DaGFyVCopMCApOyB9Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9JbnB1dEl0ZXI+Ci1fSW5wdXRJdGVyCi1udW1fZ2V0PF9DaGFyVCwgX0lucHV0SXRlcj46OmRvX2dldChfSW5wdXRJdGVyIF9faW5faXRlLCBfSW5wdXRJdGVyIF9fZW5kLCBpb3NfYmFzZSYgX19zdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIGludCYgX192YWwpIGNvbnN0Ci17IHJldHVybiBfU1RMUF9QUklWIF9fZG9fZ2V0X2ludGVnZXIoX19pbl9pdGUsIF9fZW5kLCBfX3N0ciwgX19lcnIsIF9fdmFsLCAoX0NoYXJUKikwICk7IH0KLQotI2VuZGlmCi0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9JbnB1dEl0ZXI+Ci1fSW5wdXRJdGVyCi1udW1fZ2V0PF9DaGFyVCwgX0lucHV0SXRlcj46OmRvX2dldChfSW5wdXRJdGVyIF9faW5faXRlLCBfSW5wdXRJdGVyIF9fZW5kLCBpb3NfYmFzZSYgX19zdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIGxvbmcmIF9fdmFsKSBjb25zdAoteyByZXR1cm4gX1NUTFBfUFJJViBfX2RvX2dldF9pbnRlZ2VyKF9faW5faXRlLCBfX2VuZCwgX19zdHIsIF9fZXJyLCBfX3ZhbCwgKF9DaGFyVCopMCApOyB9Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9JbnB1dEl0ZXI+Ci1fSW5wdXRJdGVyCi1udW1fZ2V0PF9DaGFyVCwgX0lucHV0SXRlcj46OmRvX2dldChfSW5wdXRJdGVyIF9faW5faXRlLCBfSW5wdXRJdGVyIF9fZW5kLCBpb3NfYmFzZSYgX19zdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCYgX192YWwpIGNvbnN0Ci17IHJldHVybiBfU1RMUF9QUklWIF9fZG9fZ2V0X2ludGVnZXIoX19pbl9pdGUsIF9fZW5kLCBfX3N0ciwgX19lcnIsIF9fdmFsLCAoX0NoYXJUKikwICk7IH0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0lucHV0SXRlcj4KLV9JbnB1dEl0ZXIKLW51bV9nZXQ8X0NoYXJULCBfSW5wdXRJdGVyPjo6ZG9fZ2V0KF9JbnB1dEl0ZXIgX19pbl9pdGUsIF9JbnB1dEl0ZXIgX19lbmQsIGlvc19iYXNlJiBfX3N0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCYgX192YWwpIGNvbnN0Ci17IHJldHVybiBfU1RMUF9QUklWIF9fZG9fZ2V0X2ludGVnZXIoX19pbl9pdGUsIF9fZW5kLCBfX3N0ciwgX19lcnIsIF9fdmFsLCAoX0NoYXJUKikwICk7IH0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0lucHV0SXRlcj4KLV9JbnB1dEl0ZXIKLW51bV9nZXQ8X0NoYXJULCBfSW5wdXRJdGVyPjo6ZG9fZ2V0KF9JbnB1dEl0ZXIgX19pbl9pdGUsIF9JbnB1dEl0ZXIgX19lbmQsIGlvc19iYXNlJiBfX3N0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcmIF9fdmFsKSBjb25zdAoteyByZXR1cm4gX1NUTFBfUFJJViBfX2RvX2dldF9pbnRlZ2VyKF9faW5faXRlLCBfX2VuZCwgX19zdHIsIF9fZXJyLCBfX3ZhbCwgKF9DaGFyVCopMCApOyB9Ci0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0lucHV0SXRlcj4KLV9JbnB1dEl0ZXIKLW51bV9nZXQ8X0NoYXJULCBfSW5wdXRJdGVyPjo6ZG9fZ2V0KF9JbnB1dEl0ZXIgX19pbl9pdGUsIF9JbnB1dEl0ZXIgX19lbmQsIGlvc19iYXNlJiBfX3N0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0JiBfX3ZhbCkgY29uc3QgewotICBfU1RMUF9QUklWIF9faW9zdHJpbmcgX19idWYgOwotICBib29sIF9fb2sgPSBfU1RMUF9QUklWIF9fcmVhZF9mbG9hdChfX2J1ZiwgX19pbl9pdGUsIF9fZW5kLCBfX3N0ciwgKF9DaGFyVCopMCApOwotICBfU1RMUF9QUklWIF9fc3RyaW5nX3RvX2Zsb2F0KF9fYnVmLCBfX3ZhbCk7Ci0gIF9fZXJyID0gX19TVEFUSUNfQ0FTVChpb3NfYmFzZTo6aW9zdGF0ZSwgX19vayA/IGlvc19iYXNlOjpnb29kYml0IDogaW9zX2Jhc2U6OmZhaWxiaXQpOwotICBpZiAoX19pbl9pdGUgPT0gX19lbmQpCi0gICAgX19lcnIgfD0gaW9zX2Jhc2U6OmVvZmJpdDsKLSAgcmV0dXJuIF9faW5faXRlOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfSW5wdXRJdGVyPgotX0lucHV0SXRlcgotbnVtX2dldDxfQ2hhclQsIF9JbnB1dEl0ZXI+Ojpkb19nZXQoX0lucHV0SXRlciBfX2luX2l0ZSwgX0lucHV0SXRlciBfX2VuZCwgaW9zX2Jhc2UmIF9fc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlJiBfX3ZhbCkgY29uc3QgewotICBfU1RMUF9QUklWIF9faW9zdHJpbmcgX19idWYgOwotICBib29sIF9fb2sgPSBfU1RMUF9QUklWIF9fcmVhZF9mbG9hdChfX2J1ZiwgX19pbl9pdGUsIF9fZW5kLCBfX3N0ciwgKF9DaGFyVCopMCApOwotICBfU1RMUF9QUklWIF9fc3RyaW5nX3RvX2Zsb2F0KF9fYnVmLCBfX3ZhbCk7Ci0gIF9fZXJyID0gX19TVEFUSUNfQ0FTVChpb3NfYmFzZTo6aW9zdGF0ZSwgX19vayA/IGlvc19iYXNlOjpnb29kYml0IDogaW9zX2Jhc2U6OmZhaWxiaXQpOwotICBpZiAoX19pbl9pdGUgPT0gX19lbmQpCi0gICAgX19lcnIgfD0gaW9zX2Jhc2U6OmVvZmJpdDsKLSAgcmV0dXJuIF9faW5faXRlOwotfQotCi0jaWYgIWRlZmluZWQgKF9TVExQX05PX0xPTkdfRE9VQkxFKQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0lucHV0SXRlcj4KLV9JbnB1dEl0ZXIKLW51bV9nZXQ8X0NoYXJULCBfSW5wdXRJdGVyPjo6ZG9fZ2V0KF9JbnB1dEl0ZXIgX19pbl9pdGUsIF9JbnB1dEl0ZXIgX19lbmQsIGlvc19iYXNlJiBfX3N0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgZG91YmxlJiBfX3ZhbCkgY29uc3QgewotICBfU1RMUF9QUklWIF9faW9zdHJpbmcgX19idWYgOwotICBib29sIF9fb2sgPSBfU1RMUF9QUklWIF9fcmVhZF9mbG9hdChfX2J1ZiwgX19pbl9pdGUsIF9fZW5kLCBfX3N0ciwgKF9DaGFyVCopMCApOwotICBfU1RMUF9QUklWIF9fc3RyaW5nX3RvX2Zsb2F0KF9fYnVmLCBfX3ZhbCk7Ci0gIF9fZXJyID0gX19TVEFUSUNfQ0FTVChpb3NfYmFzZTo6aW9zdGF0ZSwgX19vayA/IGlvc19iYXNlOjpnb29kYml0IDogaW9zX2Jhc2U6OmZhaWxiaXQpOwotICBpZiAoX19pbl9pdGUgPT0gX19lbmQpCi0gICAgX19lcnIgfD0gaW9zX2Jhc2U6OmVvZmJpdDsKLSAgcmV0dXJuIF9faW5faXRlOwotfQotI2VuZGlmIC8qIF9TVExQX05PX0xPTkdfRE9VQkxFICovCi0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9JbnB1dEl0ZXI+Ci1fSW5wdXRJdGVyCi1udW1fZ2V0PF9DaGFyVCwgX0lucHV0SXRlcj46OmRvX2dldChfSW5wdXRJdGVyIF9faW5faXRlLCBfSW5wdXRJdGVyIF9fZW5kLCBpb3NfYmFzZSYgX19zdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiYgX19wKSBjb25zdCB7Ci0jaWYgZGVmaW5lZCAoX1NUTFBfTE9OR19MT05HKSAmJiAhZGVmaW5lZCAoX19NUkNfXykgICAgLy8qdHkgMTIvMDcvMjAwMSAtIE1yQ3BwIGNhbiBub3QgY2FzdCBmcm9tIGxvbmcgbG9uZyB0byB2b2lkKgotICB1bnNpZ25lZCBfU1RMUF9MT05HX0xPTkcgX192YWw7Ci0jZWxzZQotICB1bnNpZ25lZCBsb25nIF9fdmFsOwotI2VuZGlmCi0gICAgaXRlcl90eXBlIF9fdG1wID0gX1NUTFBfUFJJViBfX2RvX2dldF9pbnRlZ2VyKF9faW5faXRlLCBfX2VuZCwgX19zdHIsIF9fZXJyLCBfX3ZhbCwgKF9DaGFyVCopMCApOwotICAgIGlmICghKF9fZXJyICYgaW9zX2Jhc2U6OmZhaWxiaXQpKQotICAgICAgX19wID0gX19SRUlOVEVSUFJFVF9DQVNUKHZvaWQqLF9fdmFsKTsKLSAgICByZXR1cm4gX190bXA7Ci0gIH0KLQotI2lmIGRlZmluZWQgKF9TVExQX0xPTkdfTE9ORykKLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9JbnB1dEl0ZXI+Ci1fSW5wdXRJdGVyCi1udW1fZ2V0PF9DaGFyVCwgX0lucHV0SXRlcj46OmRvX2dldChfSW5wdXRJdGVyIF9faW5faXRlLCBfSW5wdXRJdGVyIF9fZW5kLCBpb3NfYmFzZSYgX19zdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9MT05HX0xPTkcmIF9fdmFsKSBjb25zdCB7Ci0gIHJldHVybiBfU1RMUF9QUklWIF9fZG9fZ2V0X2ludGVnZXIoX19pbl9pdGUsIF9fZW5kLCBfX3N0ciwgX19lcnIsIF9fdmFsLCAoX0NoYXJUKikwICk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9JbnB1dEl0ZXI+Ci1fSW5wdXRJdGVyCi1udW1fZ2V0PF9DaGFyVCwgX0lucHV0SXRlcj46OmRvX2dldChfSW5wdXRJdGVyIF9faW5faXRlLCBfSW5wdXRJdGVyIF9fZW5kLCBpb3NfYmFzZSYgX19zdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBfU1RMUF9MT05HX0xPTkcmIF9fdmFsKSBjb25zdCB7Ci0gIHJldHVybiBfU1RMUF9QUklWIF9fZG9fZ2V0X2ludGVnZXIoX19pbl9pdGUsIF9fZW5kLCBfX3N0ciwgX19lcnIsIF9fdmFsLCAoX0NoYXJUKikwICk7Ci19Ci0jZW5kaWYgLyogX1NUTFBfTE9OR19MT05HICovCi0KLV9TVExQX0VORF9OQU1FU1BBQ0UKLQotI2VuZGlmIC8qIF9TVExQX05VTUVSSUNfRkFDRVRTX0MgKi8KLQotLy8gTG9jYWwgVmFyaWFibGVzOgotLy8gbW9kZTpDKysKLS8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9fbnVtX2dldC5oIGIvc3RsL19udW1fZ2V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3NjRlZWEuLjAwMDAwMDAKLS0tIGEvc3RsL19udW1fZ2V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLS8vIFdBUk5JTkc6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIEMrKwotLy8gc3RhbmRhcmQgbGlicmFyeSBoZWFkZXJzLiAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgdGhpcyBoZWFkZXIKLS8vIGZpbGUgZGlyZWN0bHkuCi0KLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9OVU1fR0VUX0gKLSNkZWZpbmUgX1NUTFBfSU5URVJOQUxfTlVNX0dFVF9ICi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfSVNUUkVBTUJVRl9JVEVSQVRPUl9ICi0jICBpbmNsdWRlIDxzdGwvX2lzdHJlYW1idWZfaXRlcmF0b3IuaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX0NfTE9DQUxFX0gKLSMgIGluY2x1ZGUgPHN0bC9jX2xvY2FsZS5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfTlVNUFVOQ1RfSAotIyAgaW5jbHVkZSA8c3RsL19udW1wdW5jdC5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1RZUEVfSAotIyAgaW5jbHVkZSA8c3RsL19jdHlwZS5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfSU9TVFJFQU1fU1RSSU5HX0gKLSMgIGluY2x1ZGUgPHN0bC9faW9zdHJlYW1fc3RyaW5nLmg+Ci0jZW5kaWYKLQotX1NUTFBfQkVHSU5fTkFNRVNQQUNFCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gbnVtX2dldCBmYWNldHMKLQotI2lmIGRlZmluZWQgKF9TVExQX0xJTUlURURfREVGQVVMVF9URU1QTEFURVMpCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfSW5wdXRJdGVyPgotI2Vsc2UKLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9JbnB1dEl0ZXIgPSBpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVCwgY2hhcl90cmFpdHM8X0NoYXJUPiA+ID4KLSNlbmRpZgotY2xhc3MgbnVtX2dldDogcHVibGljIGxvY2FsZTo6ZmFjZXQgewotICBmcmllbmQgY2xhc3MgX0xvY2FsZV9pbXBsOwotcHVibGljOgotICB0eXBlZGVmIF9DaGFyVCAgICAgY2hhcl90eXBlOwotICB0eXBlZGVmIF9JbnB1dEl0ZXIgaXRlcl90eXBlOwotCi0gIGV4cGxpY2l0IG51bV9nZXQoc2l6ZV90IF9fcmVmcyA9IDApOiBsb2NhbGU6OmZhY2V0KF9fcmVmcykge30KLQotI2lmICFkZWZpbmVkIChfU1RMUF9OT19CT09MKQotICBfSW5wdXRJdGVyIGdldChfSW5wdXRJdGVyIF9faWksIF9JbnB1dEl0ZXIgX19lbmQsIGlvc19iYXNlJiBfX3N0ciwKLSAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCBib29sJiBfX3ZhbCkgY29uc3QKLSAgeyByZXR1cm4gZG9fZ2V0KF9faWksIF9fZW5kLCBfX3N0ciwgX19lcnIsIF9fdmFsKTsgfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9GSVhfTElCUkFSWV9JU1NVRVMpCi0gIF9JbnB1dEl0ZXIgZ2V0KF9JbnB1dEl0ZXIgX19paSwgX0lucHV0SXRlciBfX2VuZCwgaW9zX2Jhc2UmIF9fc3RyLAotICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIHNob3J0JiBfX3ZhbCkgY29uc3QKLSAgeyByZXR1cm4gZG9fZ2V0KF9faWksIF9fZW5kLCBfX3N0ciwgX19lcnIsIF9fdmFsKTsgfQotCi0gIF9JbnB1dEl0ZXIgZ2V0KF9JbnB1dEl0ZXIgX19paSwgX0lucHV0SXRlciBfX2VuZCwgaW9zX2Jhc2UmIF9fc3RyLAotICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIGludCYgX192YWwpIGNvbnN0Ci0gIHsgcmV0dXJuIGRvX2dldChfX2lpLCBfX2VuZCwgX19zdHIsIF9fZXJyLCBfX3ZhbCk7IH0KLSNlbmRpZgotCi0gIF9JbnB1dEl0ZXIgZ2V0KF9JbnB1dEl0ZXIgX19paSwgX0lucHV0SXRlciBfX2VuZCwgaW9zX2Jhc2UmIF9fc3RyLAotICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIGxvbmcmIF9fdmFsKSBjb25zdAotICB7IHJldHVybiBkb19nZXQoX19paSwgX19lbmQsIF9fc3RyLCBfX2VyciwgX192YWwpOyB9Ci0KLSAgX0lucHV0SXRlciBnZXQoX0lucHV0SXRlciBfX2lpLCBfSW5wdXRJdGVyIF9fZW5kLCBpb3NfYmFzZSYgX19zdHIsCi0gICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgdW5zaWduZWQgc2hvcnQmIF9fdmFsKSBjb25zdAotICB7IHJldHVybiBkb19nZXQoX19paSwgX19lbmQsIF9fc3RyLCBfX2VyciwgX192YWwpOyB9Ci0KLSAgX0lucHV0SXRlciBnZXQoX0lucHV0SXRlciBfX2lpLCBfSW5wdXRJdGVyIF9fZW5kLCBpb3NfYmFzZSYgX19zdHIsCi0gICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgdW5zaWduZWQgaW50JiBfX3ZhbCkgY29uc3QKLSAgeyByZXR1cm4gZG9fZ2V0KF9faWksIF9fZW5kLCBfX3N0ciwgX19lcnIsIF9fdmFsKTsgfQotCi0gIF9JbnB1dEl0ZXIgZ2V0KF9JbnB1dEl0ZXIgX19paSwgX0lucHV0SXRlciBfX2VuZCwgaW9zX2Jhc2UmIF9fc3RyLAotICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIHVuc2lnbmVkIGxvbmcmIF9fdmFsKSBjb25zdAotICB7IHJldHVybiBkb19nZXQoX19paSwgX19lbmQsIF9fc3RyLCBfX2VyciwgX192YWwpOyB9Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9MT05HX0xPTkcpCi0gIF9JbnB1dEl0ZXIgZ2V0KF9JbnB1dEl0ZXIgX19paSwgX0lucHV0SXRlciBfX2VuZCwgaW9zX2Jhc2UmIF9fc3RyLAotICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIF9TVExQX0xPTkdfTE9ORyYgX192YWwpIGNvbnN0Ci0gIHsgcmV0dXJuIGRvX2dldChfX2lpLCBfX2VuZCwgX19zdHIsIF9fZXJyLCBfX3ZhbCk7IH0KLQotICBfSW5wdXRJdGVyIGdldChfSW5wdXRJdGVyIF9faWksIF9JbnB1dEl0ZXIgX19lbmQsIGlvc19iYXNlJiBfX3N0ciwKLSAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCB1bnNpZ25lZCBfU1RMUF9MT05HX0xPTkcmIF9fdmFsKSBjb25zdAotICB7IHJldHVybiBkb19nZXQoX19paSwgX19lbmQsIF9fc3RyLCBfX2VyciwgX192YWwpOyB9Ci0jZW5kaWYgLyogX1NUTFBfTE9OR19MT05HICovCi0KLSAgX0lucHV0SXRlciBnZXQoX0lucHV0SXRlciBfX2lpLCBfSW5wdXRJdGVyIF9fZW5kLCBpb3NfYmFzZSYgX19zdHIsCi0gICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgZmxvYXQmIF9fdmFsKSBjb25zdAotICB7IHJldHVybiBkb19nZXQoX19paSwgX19lbmQsIF9fc3RyLCBfX2VyciwgX192YWwpOyB9Ci0KLSAgX0lucHV0SXRlciBnZXQoX0lucHV0SXRlciBfX2lpLCBfSW5wdXRJdGVyIF9fZW5kLCBpb3NfYmFzZSYgX19zdHIsCi0gICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgZG91YmxlJiBfX3ZhbCkgY29uc3QKLSAgeyByZXR1cm4gZG9fZ2V0KF9faWksIF9fZW5kLCBfX3N0ciwgX19lcnIsIF9fdmFsKTsgfQotCi0jaWYgIWRlZmluZWQgKF9TVExQX05PX0xPTkdfRE9VQkxFKQotICBfSW5wdXRJdGVyIGdldChfSW5wdXRJdGVyIF9faWksIF9JbnB1dEl0ZXIgX19lbmQsIGlvc19iYXNlJiBfX3N0ciwKLSAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCBsb25nIGRvdWJsZSYgX192YWwpIGNvbnN0Ci0gIHsgcmV0dXJuIGRvX2dldChfX2lpLCBfX2VuZCwgX19zdHIsIF9fZXJyLCBfX3ZhbCk7IH0KLSMgZW5kaWYKLQotICBfSW5wdXRJdGVyIGdldChfSW5wdXRJdGVyIF9faWksIF9JbnB1dEl0ZXIgX19lbmQsIGlvc19iYXNlJiBfX3N0ciwKLSAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCB2b2lkKiYgX192YWwpIGNvbnN0Ci0gIHsgcmV0dXJuIGRvX2dldChfX2lpLCBfX2VuZCwgX19zdHIsIF9fZXJyLCBfX3ZhbCk7IH0KLQotICBzdGF0aWMgX1NUTFBfU1RBVElDX01FTUJFUl9ERUNMU1BFQyBsb2NhbGU6OmlkIGlkOwotCi1wcm90ZWN0ZWQ6Ci0gIH5udW1fZ2V0KCkge30KLQotICB0eXBlZGVmIHN0cmluZyAgICAgICAgICAgICAgIHN0cmluZ190eXBlOwotICB0eXBlZGVmIGN0eXBlPF9DaGFyVD4gICAgICAgIF9DdHlwZTsKLSAgdHlwZWRlZiBudW1wdW5jdDxfQ2hhclQ+ICAgICBfTnVtcHVuY3Q7Ci0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fQk9PTCkKLSAgdmlydHVhbCBfSW5wdXRJdGVyIGRvX2dldChfSW5wdXRJdGVyIF9faWksIF9JbnB1dEl0ZXIgX19lbmQsIGlvc19iYXNlJiBfX3N0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIGJvb2wmIF9fdmFsKSBjb25zdDsKLSNlbmRpZgotCi0gIHZpcnR1YWwgX0lucHV0SXRlciBkb19nZXQoX0lucHV0SXRlciBfX2lpLCBfSW5wdXRJdGVyIF9fZW5kLCBpb3NfYmFzZSYgX19zdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCBsb25nJiBfX3ZhbCkgY29uc3Q7Ci0gIHZpcnR1YWwgX0lucHV0SXRlciBkb19nZXQoX0lucHV0SXRlciBfX2lpLCBfSW5wdXRJdGVyIF9fZW5kLCBpb3NfYmFzZSYgX19zdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCB1bnNpZ25lZCBzaG9ydCYgX192YWwpIGNvbnN0OwotICB2aXJ0dWFsIF9JbnB1dEl0ZXIgZG9fZ2V0KF9JbnB1dEl0ZXIgX19paSwgX0lucHV0SXRlciBfX2VuZCwgaW9zX2Jhc2UmIF9fc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgdW5zaWduZWQgaW50JiBfX3ZhbCkgY29uc3Q7Ci0gIHZpcnR1YWwgX0lucHV0SXRlciBkb19nZXQoX0lucHV0SXRlciBfX2lpLCBfSW5wdXRJdGVyIF9fZW5kLCBpb3NfYmFzZSYgX19zdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCB1bnNpZ25lZCBsb25nJiBfX3ZhbCkgY29uc3Q7Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9GSVhfTElCUkFSWV9JU1NVRVMpCi0gIC8vIGlzc3VlIDExOCA6IHRob3NlIGFyZSBhY3R1YWxseSBub3Qgc3VwcG9zZWQgdG8gYmUgaGVyZQotICB2aXJ0dWFsIF9JbnB1dEl0ZXIgZG9fZ2V0KF9JbnB1dEl0ZXIgX19paSwgX0lucHV0SXRlciBfX2VuZCwgaW9zX2Jhc2UmIF9fc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2Vyciwgc2hvcnQmIF9fdmFsKSBjb25zdDsKLSAgdmlydHVhbCBfSW5wdXRJdGVyIGRvX2dldChfSW5wdXRJdGVyIF9faWksIF9JbnB1dEl0ZXIgX19lbmQsIGlvc19iYXNlJiBfX3N0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIGludCYgX192YWwpIGNvbnN0OwotI2VuZGlmCi0KLSAgdmlydHVhbCBfSW5wdXRJdGVyIGRvX2dldChfSW5wdXRJdGVyIF9faWksIF9JbnB1dEl0ZXIgX19lbmQsIGlvc19iYXNlJiBfX3N0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIGZsb2F0JiBfX3ZhbCkgY29uc3Q7Ci0gIHZpcnR1YWwgX0lucHV0SXRlciBkb19nZXQoX0lucHV0SXRlciBfX2lpLCBfSW5wdXRJdGVyIF9fZW5kLCBpb3NfYmFzZSYgX19zdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCBkb3VibGUmIF9fdmFsKSBjb25zdDsKLSAgdmlydHVhbCBfSW5wdXRJdGVyIGRvX2dldChfSW5wdXRJdGVyIF9faWksIF9JbnB1dEl0ZXIgX19lbmQsIGlvc19iYXNlJiBfX3N0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIHZvaWQqJiBfX3ApIGNvbnN0OwotCi0jaWYgIWRlZmluZWQgKF9TVExQX05PX0xPTkdfRE9VQkxFKQotICB2aXJ0dWFsIF9JbnB1dEl0ZXIgZG9fZ2V0KF9JbnB1dEl0ZXIgX19paSwgX0lucHV0SXRlciBfX2VuZCwgaW9zX2Jhc2UmIF9fc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgbG9uZyBkb3VibGUmIF9fdmFsKSBjb25zdDsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX1NUTFBfTE9OR19MT05HKQotICB2aXJ0dWFsIF9JbnB1dEl0ZXIgZG9fZ2V0KF9JbnB1dEl0ZXIgX19paSwgX0lucHV0SXRlciBfX2VuZCwgaW9zX2Jhc2UmIF9fc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgX1NUTFBfTE9OR19MT05HJiBfX3ZhbCkgY29uc3Q7Ci0gIHZpcnR1YWwgX0lucHV0SXRlciBkb19nZXQoX0lucHV0SXRlciBfX2lpLCBfSW5wdXRJdGVyIF9fZW5kLCBpb3NfYmFzZSYgX19zdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCB1bnNpZ25lZCBfU1RMUF9MT05HX0xPTkcmIF9fdmFsKSBjb25zdDsKLSNlbmRpZgotCi19OwotCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUKQotX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIG51bV9nZXQ8Y2hhciwgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+ID47Ci0vLyBfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgbnVtX2dldDxjaGFyLCBjb25zdCBjaGFyKj47Ci0jICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkKLV9TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBudW1fZ2V0PHdjaGFyX3QsIGlzdHJlYW1idWZfaXRlcmF0b3I8d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPiA+OwotLy8gX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIG51bV9nZXQ8d2NoYXJfdCwgY29uc3Qgd2NoYXJfdCo+OwotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX1NUTFBfRVhQT1NFX1NUUkVBTV9JTVBMRU1FTlRBVElPTikKLQotX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQotCi1fU1RMUF9ERUNMU1BFQyBib29sIF9TVExQX0NBTEwgX192YWxpZF9ncm91cGluZyhjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7Ci0KLXRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfSW50ZWdlciwgY2xhc3MgX0NoYXJUPgotYm9vbCBfU1RMUF9DQUxMCi1fX2dldF9kZWNpbWFsX2ludGVnZXIoX0lucHV0SXRlciYgX19maXJzdCwgX0lucHV0SXRlciYgX19sYXN0LCBfSW50ZWdlciYgX192YWwsIF9DaGFyVCopOwotCi0jICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkKLWJvb2wgX1NUTFBfREVDTFNQRUMgX1NUTFBfQ0FMTCBfX2dldF9mZGlnaXQod2NoYXJfdCYsIGNvbnN0IHdjaGFyX3QqKTsKLWJvb2wgX1NUTFBfREVDTFNQRUMgX1NUTFBfQ0FMTCBfX2dldF9mZGlnaXRfb3Jfc2VwKHdjaGFyX3QmLCB3Y2hhcl90LCBjb25zdCB3Y2hhcl90Kik7Ci0jICBlbmRpZgotCi1pbmxpbmUgdm9pZCAgX1NUTFBfQ0FMTAotX0luaXRpYWxpemVfZ2V0X2Zsb2F0KGNvbnN0IGN0eXBlPGNoYXI+JiwKLSAgICAgICAgICAgICAgICAgICAgICAgY2hhciYgUGx1cywgY2hhciYgTWludXMsCi0gICAgICAgICAgICAgICAgICAgICAgIGNoYXImIHBvd19lLCBjaGFyJiBwb3dfRSwKLSAgICAgICAgICAgICAgICAgICAgICAgY2hhciopIHsKLSAgUGx1cyA9ICcrJzsKLSAgTWludXMgPSAnLSc7Ci0gIHBvd19lID0gJ2UnOwotICBwb3dfRSA9ICdFJzsKLX0KLQotIyAgaWYgIWRlZmluZWQgKF9TVExQX05PX1dDSEFSX1QpCi12b2lkIF9TVExQX0RFQ0xTUEVDIF9TVExQX0NBTEwgX0luaXRpYWxpemVfZ2V0X2Zsb2F0KGNvbnN0IGN0eXBlPHdjaGFyX3Q+JiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2NoYXJfdCYsIHdjaGFyX3QmLCB3Y2hhcl90Jiwgd2NoYXJfdCYsIHdjaGFyX3QqKTsKLSMgIGVuZGlmCi12b2lkIF9TVExQX0RFQ0xTUEVDIF9TVExQX0NBTEwgX19zdHJpbmdfdG9fZmxvYXQoY29uc3QgX19pb3N0cmluZyYsIGZsb2F0Jik7Ci12b2lkIF9TVExQX0RFQ0xTUEVDIF9TVExQX0NBTEwgX19zdHJpbmdfdG9fZmxvYXQoY29uc3QgX19pb3N0cmluZyYsIGRvdWJsZSYpOwotIyAgaWYgIWRlZmluZWQgKF9TVExQX05PX0xPTkdfRE9VQkxFKQotdm9pZCBfU1RMUF9ERUNMU1BFQyBfU1RMUF9DQUxMIF9fc3RyaW5nX3RvX2Zsb2F0KGNvbnN0IF9faW9zdHJpbmcmLCBsb25nIGRvdWJsZSYpOwotIyAgZW5kaWYKLQotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi0KLSNlbmRpZiAvKiBfU1RMUF9FWFBPU0VfU1RSRUFNX0lNUExFTUVOVEFUSU9OICovCi0KLV9TVExQX0VORF9OQU1FU1BBQ0UKLQotI2lmIGRlZmluZWQgKF9TVExQX0VYUE9TRV9TVFJFQU1fSU1QTEVNRU5UQVRJT04pICYmICFkZWZpbmVkIChfU1RMUF9MSU5LX1RJTUVfSU5TVEFOVElBVElPTikKLSMgIGluY2x1ZGUgPHN0bC9fbnVtX2dldC5jPgotI2VuZGlmCi0KLSNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9OVU1fR0VUX0ggKi8KLQotLy8gTG9jYWwgVmFyaWFibGVzOgotLy8gbW9kZTpDKysKLS8vIEVuZDoKLQpkaWZmIC0tZ2l0IGEvc3RsL19udW1fcHV0LmMgYi9zdGwvX251bV9wdXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJjN2MzYi4uMDAwMDAwMAotLS0gYS9zdGwvX251bV9wdXQuYworKysgL2Rldi9udWxsCkBAIC0xLDU1MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotI2lmbmRlZiBfU1RMUF9OVU1fUFVUX0MKLSNkZWZpbmUgX1NUTFBfTlVNX1BVVF9DCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfTlVNX1BVVF9ICi0jICBpbmNsdWRlIDxzdGwvX251bV9wdXQuaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0xJTUlUUwotIyAgaW5jbHVkZSA8c3RsL19saW1pdHMuaD4KLSNlbmRpZgotCi1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLQotX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQotCi0vLyBfX2RvX3B1dF9mbG9hdCBhbmQgaXRzIGhlbHBlciBmdW5jdGlvbnMuICBTdHJhdGVneTogd3JpdGUgdGhlIG91dHB1dAotLy8gdG8gYSBidWZmZXIgb2YgY2hhciwgdHJhbnNmb3JtIHRoZSBidWZmZXIgdG8gX0NoYXJULCBhbmQgdGhlbiBjb3B5Ci0vLyBpdCB0byB0aGUgb3V0cHV0LgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIG51bV9wdXQgZmFjZXQKLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX091dHB1dEl0ZXI+Ci1fT3V0cHV0SXRlciAgX1NUTFBfQ0FMTAotX19jb3B5X2Zsb2F0X2FuZF9maWxsKGNvbnN0IF9DaGFyVCogX19maXJzdCwgY29uc3QgX0NoYXJUKiBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXIgX19vaSwKLSAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncywKLSAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1zaXplIF9fd2lkdGgsIF9DaGFyVCBfX2ZpbGwsCi0gICAgICAgICAgICAgICAgICAgICAgX0NoYXJUIF9feHBsdXMsIF9DaGFyVCBfX3htaW51cykgewotICBpZiAoX193aWR0aCA8PSBfX2xhc3QgLSBfX2ZpcnN0KQotICAgIHJldHVybiBjb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19vaSk7Ci0gIGVsc2UgewotICAgIHN0cmVhbXNpemUgX19wYWQgPSBfX3dpZHRoIC0gKF9fbGFzdCAtIF9fZmlyc3QpOwotICAgIGlvc19iYXNlOjpmbXRmbGFncyBfX2RpciA9IF9fZmxhZ3MgJiBpb3NfYmFzZTo6YWRqdXN0ZmllbGQ7Ci0KLSAgICBpZiAoX19kaXIgPT0gaW9zX2Jhc2U6OmxlZnQpIHsKLSAgICAgIF9fb2kgPSBjb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19vaSk7Ci0gICAgICByZXR1cm4gX19maWxsX24oX19vaSwgX19wYWQsIF9fZmlsbCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKF9fZGlyID09IGlvc19iYXNlOjppbnRlcm5hbCAmJiBfX2ZpcnN0ICE9IF9fbGFzdCAmJgotICAgICAgICAgICAgICgqX19maXJzdCA9PSBfX3hwbHVzIHx8ICpfX2ZpcnN0ID09IF9feG1pbnVzKSkgewotICAgICAgKl9fb2krKyA9ICpfX2ZpcnN0Kys7Ci0gICAgICBfX29pID0gX19maWxsX24oX19vaSwgX19wYWQsIF9fZmlsbCk7Ci0gICAgICByZXR1cm4gY29weShfX2ZpcnN0LCBfX2xhc3QsIF9fb2kpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIF9fb2kgPSBfX2ZpbGxfbihfX29pLCBfX3BhZCwgX19maWxsKTsKLSAgICAgIHJldHVybiBjb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19vaSk7Ci0gICAgfQotICB9Ci19Ci0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkKLS8vIEhlbHBlciByb3V0aW5lIGZvciB3Y2hhcl90Ci10ZW1wbGF0ZSA8Y2xhc3MgX091dHB1dEl0ZXI+Ci1fT3V0cHV0SXRlciAgX1NUTFBfQ0FMTAotX19wdXRfZmxvYXQoX19pb3N0cmluZyAmX19zdHIsIF9PdXRwdXRJdGVyIF9fb2ksCi0gICAgICAgICAgICBpb3NfYmFzZSYgX19mLCB3Y2hhcl90IF9fZmlsbCwKLSAgICAgICAgICAgIHdjaGFyX3QgX19kZWNpbWFsX3BvaW50LCB3Y2hhcl90IF9fc2VwLAotICAgICAgICAgICAgc2l6ZV90IF9fZ3JvdXBfcG9zLCBjb25zdCBzdHJpbmcmIF9fZ3JvdXBpbmcpIHsKLSAgY29uc3QgY3R5cGU8d2NoYXJfdD4mIF9fY3QgPSAqX19TVEFUSUNfQ0FTVChjb25zdCBjdHlwZTx3Y2hhcl90PiosIF9fZi5fTV9jdHlwZV9mYWNldCgpKTsKLQotICBfX2lvd3N0cmluZyBfX3didWY7Ci0gIF9fY29udmVydF9mbG9hdF9idWZmZXIoX19zdHIsIF9fd2J1ZiwgX19jdCwgX19kZWNpbWFsX3BvaW50KTsKLQotICBpZiAoIV9fZ3JvdXBpbmcuZW1wdHkoKSkgewotICAgIF9faW5zZXJ0X2dyb3VwaW5nKF9fd2J1ZiwgX19ncm91cF9wb3MsIF9fZ3JvdXBpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgX19zZXAsIF9fY3Qud2lkZW4oJysnKSwgX19jdC53aWRlbignLScpLCAwKTsKLSAgfQotCi0gIHJldHVybiBfX2NvcHlfZmxvYXRfYW5kX2ZpbGwoX19DT05TVF9DQVNUKHdjaGFyX3QqLCBfX3didWYuZGF0YSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0NPTlNUX0NBU1Qod2NoYXJfdCosIF9fd2J1Zi5kYXRhKCkpICsgX193YnVmLnNpemUoKSwgX19vaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2YuZmxhZ3MoKSwgX19mLndpZHRoKDApLCBfX2ZpbGwsIF9fY3Qud2lkZW4oJysnKSwgX19jdC53aWRlbignLScpKTsKLX0KLSNlbmRpZiAvKiBXQ0hBUl9UICovCi0KLS8vIEhlbHBlciByb3V0aW5lIGZvciBjaGFyCi10ZW1wbGF0ZSA8Y2xhc3MgX091dHB1dEl0ZXI+Ci1fT3V0cHV0SXRlciAgX1NUTFBfQ0FMTAotX19wdXRfZmxvYXQoX19pb3N0cmluZyAmX19zdHIsIF9PdXRwdXRJdGVyIF9fb2ksCi0gICAgICAgICAgICBpb3NfYmFzZSYgX19mLCBjaGFyIF9fZmlsbCwKLSAgICAgICAgICAgIGNoYXIgX19kZWNpbWFsX3BvaW50LCBjaGFyIF9fc2VwLAotICAgICAgICAgICAgc2l6ZV90IF9fZ3JvdXBfcG9zLCBjb25zdCBzdHJpbmcmIF9fZ3JvdXBpbmcpIHsKLSAgaWYgKChfX2dyb3VwX3BvcyA8IF9fc3RyLnNpemUoKSkgJiYgKF9fc3RyW19fZ3JvdXBfcG9zXSA9PSAnLicpKSB7Ci0gICAgX19zdHJbX19ncm91cF9wb3NdID0gX19kZWNpbWFsX3BvaW50OwotICB9Ci0KLSAgaWYgKCFfX2dyb3VwaW5nLmVtcHR5KCkpIHsKLSAgICBfX2luc2VydF9ncm91cGluZyhfX3N0ciwgX19ncm91cF9wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgX19ncm91cGluZywgX19zZXAsICcrJywgJy0nLCAwKTsKLSAgfQotCi0gIHJldHVybiBfX2NvcHlfZmxvYXRfYW5kX2ZpbGwoX19DT05TVF9DQVNUKGNoYXIqLCBfX3N0ci5kYXRhKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fQ09OU1RfQ0FTVChjaGFyKiwgX19zdHIuZGF0YSgpKSArIF9fc3RyLnNpemUoKSwgX19vaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2YuZmxhZ3MoKSwgX19mLndpZHRoKDApLCBfX2ZpbGwsICcrJywgJy0nKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX091dHB1dEl0ZXIsIGNsYXNzIF9GbG9hdD4KLV9PdXRwdXRJdGVyIF9TVExQX0NBTEwKLV9fZG9fcHV0X2Zsb2F0KF9PdXRwdXRJdGVyIF9fcywgaW9zX2Jhc2UmIF9fZiwKLSAgICAgICAgICAgICAgICBfQ2hhclQgX19maWxsLCBfRmxvYXQgX194KSB7Ci0gIF9faW9zdHJpbmcgX19idWY7Ci0KLSAgc2l6ZV90IF9fZ3JvdXBfcG9zID0gX193cml0ZV9mbG9hdChfX2J1ZiwgX19mLmZsYWdzKCksIChpbnQpX19mLnByZWNpc2lvbigpLCBfX3gpOwotCi0gIGNvbnN0IG51bXB1bmN0PF9DaGFyVD4mIF9fbnAgPSAqX19TVEFUSUNfQ0FTVChjb25zdCBudW1wdW5jdDxfQ2hhclQ+KiwgX19mLl9NX251bXB1bmN0X2ZhY2V0KCkpOwotCi0gIHJldHVybiBfX3B1dF9mbG9hdChfX2J1ZiwgX19zLCBfX2YsIF9fZmlsbCwKLSAgICAgICAgICAgICAgICAgICAgIF9fbnAuZGVjaW1hbF9wb2ludCgpLCBfX25wLnRob3VzYW5kc19zZXAoKSwKLSAgICAgICAgICAgICAgICAgICAgIF9fZ3JvdXBfcG9zLCBfX2YuX01fZ3JvdXBpbmcoKSk7Ci19Ci0KLWlubGluZSB2b2lkIF9fZ2V0X21vbmV5X2RpZ2l0c19hdXggKF9faW9zdHJpbmcgJl9fYnVmLCBpb3NfYmFzZSAmLCBfU1RMUF9MT05HRVNUX0ZMT0FUX1RZUEUgX194KQoteyBfX2dldF9mbG9vcl9kaWdpdHMoX19idWYsIF9feCk7IH0KLQotI2lmICFkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQotaW5saW5lIHZvaWQgX19nZXRfbW9uZXlfZGlnaXRzX2F1eCAoX19pb3dzdHJpbmcgJl9fd2J1ZiwgaW9zX2Jhc2UgJl9fZiwgX1NUTFBfTE9OR0VTVF9GTE9BVF9UWVBFIF9feCkgewotICBfX2lvc3RyaW5nIF9fYnVmOwotICBfX2dldF9mbG9vcl9kaWdpdHMoX19idWYsIF9feCk7Ci0KLSAgY29uc3QgY3R5cGU8d2NoYXJfdD4mIF9fY3QgPSAqX19TVEFUSUNfQ0FTVChjb25zdCBjdHlwZTx3Y2hhcl90PiosIF9fZi5fTV9jdHlwZV9mYWNldCgpKTsKLSAgX19jb252ZXJ0X2Zsb2F0X2J1ZmZlcihfX2J1ZiwgX193YnVmLCBfX2N0LCB3Y2hhcl90KDApLCBmYWxzZSk7Ci19Ci0jZW5kaWYKLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KLXZvaWQgX1NUTFBfQ0FMTCBfX2dldF9tb25leV9kaWdpdHMoX1NUTFBfQkFTSUNfSU9TVFJJTkcoX0NoYXJUKSAmX19idWYsIGlvc19iYXNlJiBfX2YsIF9TVExQX0xPTkdFU1RfRkxPQVRfVFlQRSBfX3gpCi17IF9fZ2V0X21vbmV5X2RpZ2l0c19hdXgoX19idWYsIF9fZiwgX194KTsgfQotCi0vLyBfTV9kb19wdXRfaW50ZWdlciBhbmQgaXRzIGhlbHBlciBmdW5jdGlvbnMuCi0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9PdXRwdXRJdGVyPgotX091dHB1dEl0ZXIgX1NUTFBfQ0FMTAotX19jb3B5X2ludGVnZXJfYW5kX2ZpbGwoY29uc3QgX0NoYXJUKiBfX2J1ZiwgcHRyZGlmZl90IF9fbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXIgX19vaSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjpmbXRmbGFncyBfX2ZsZywgc3RyZWFtc2l6ZSBfX3dpZCwgX0NoYXJUIF9fZmlsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9DaGFyVCBfX3hwbHVzLCBfQ2hhclQgX194bWludXMpIHsKLSAgaWYgKF9fbGVuID49IF9fd2lkKQotICAgIHJldHVybiBjb3B5KF9fYnVmLCBfX2J1ZiArIF9fbGVuLCBfX29pKTsKLSAgZWxzZSB7Ci0gICAgLy9jYXN0aW5nIG51bWVyaWNfbGltaXRzPHB0cmRpZmZfdD46Om1heCB0byBzdHJlYW1zaXplIG9ubHkgd29ya3MgaXMgcHRyZGlmZl90IGlzIHNpZ25lZCBvciBzdHJlYW1zaXplIHJlcHJlc2VudGF0aW9uCi0gICAgLy9pcyBsYXJnZXIgdGhhbiBwdHJkaWZmX3Qgb25lLgotICAgIF9TVExQX1NUQVRJQ19BU1NFUlQoKChzaXplb2Yoc3RyZWFtc2l6ZSkgPiBzaXplb2YocHRyZGlmZl90KSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZW9mKHN0cmVhbXNpemUpID09IHNpemVvZihwdHJkaWZmX3QpKSkgJiYgbnVtZXJpY19saW1pdHM8cHRyZGlmZl90Pjo6aXNfc2lnbmVkKQotICAgIHB0cmRpZmZfdCBfX3BhZCA9IF9fU1RBVElDX0NBU1QocHRyZGlmZl90LCAobWluKSAoX19TVEFUSUNfQ0FTVChzdHJlYW1zaXplLCAobnVtZXJpY19saW1pdHM8cHRyZGlmZl90Pjo6bWF4KSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fU1RBVElDX0NBU1Qoc3RyZWFtc2l6ZSwgX193aWQgLSBfX2xlbikpKTsKLSAgICBpb3NfYmFzZTo6Zm10ZmxhZ3MgX19kaXIgPSBfX2ZsZyAmIGlvc19iYXNlOjphZGp1c3RmaWVsZDsKLQotICAgIGlmIChfX2RpciA9PSBpb3NfYmFzZTo6bGVmdCkgewotICAgICAgX19vaSA9IGNvcHkoX19idWYsIF9fYnVmICsgX19sZW4sIF9fb2kpOwotICAgICAgcmV0dXJuIF9fZmlsbF9uKF9fb2ksIF9fcGFkLCBfX2ZpbGwpOwotICAgIH0KLSAgICBlbHNlIGlmIChfX2RpciA9PSBpb3NfYmFzZTo6aW50ZXJuYWwgJiYgX19sZW4gIT0gMCAmJgotICAgICAgICAgICAgIChfX2J1ZlswXSA9PSBfX3hwbHVzIHx8IF9fYnVmWzBdID09IF9feG1pbnVzKSkgewotICAgICAgKl9fb2krKyA9IF9fYnVmWzBdOwotICAgICAgX19vaSA9IF9fZmlsbF9uKF9fb2ksIF9fcGFkLCBfX2ZpbGwpOwotICAgICAgcmV0dXJuIGNvcHkoX19idWYgKyAxLCBfX2J1ZiArIF9fbGVuLCBfX29pKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoX19kaXIgPT0gaW9zX2Jhc2U6OmludGVybmFsICYmIF9fbGVuID49IDIgICYmCi0gICAgICAgICAgICAgKF9fZmxnICYgaW9zX2Jhc2U6OnNob3diYXNlKSAmJgotICAgICAgICAgICAgIChfX2ZsZyAmIGlvc19iYXNlOjpiYXNlZmllbGQpID09IGlvc19iYXNlOjpoZXgpIHsKLSAgICAgICpfX29pKysgPSBfX2J1ZlswXTsKLSAgICAgICpfX29pKysgPSBfX2J1ZlsxXTsKLSAgICAgIF9fb2kgPSBfX2ZpbGxfbihfX29pLCBfX3BhZCwgX19maWxsKTsKLSAgICAgIHJldHVybiBjb3B5KF9fYnVmICsgMiwgX19idWYgKyBfX2xlbiwgX19vaSk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgX19vaSA9IF9fZmlsbF9uKF9fb2ksIF9fcGFkLCBfX2ZpbGwpOwotICAgICAgcmV0dXJuIGNvcHkoX19idWYsIF9fYnVmICsgX19sZW4sIF9fb2kpOwotICAgIH0KLSAgfQotfQotCi0jaWYgIWRlZmluZWQgKF9TVExQX05PX1dDSEFSX1QpCi0vLyBIZWxwZXIgZnVuY3Rpb24gZm9yIHdjaGFyX3QKLXRlbXBsYXRlIDxjbGFzcyBfT3V0cHV0SXRlcj4KLV9PdXRwdXRJdGVyIF9TVExQX0NBTEwKLV9fcHV0X2ludGVnZXIoY2hhciogX19idWYsIGNoYXIqIF9faWVuZCwgX091dHB1dEl0ZXIgX19zLAotICAgICAgICAgICAgICBpb3NfYmFzZSYgX19mLAotICAgICAgICAgICAgICBpb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncywgd2NoYXJfdCBfX2ZpbGwpIHsKLSAgbG9jYWxlIF9fbG9jID0gX19mLmdldGxvYygpOwotICAvLyAgY29uc3QgY3R5cGU8d2NoYXJfdD4mIF9fY3QgPSB1c2VfZmFjZXQ8Y3R5cGU8d2NoYXJfdD4gPihfX2xvYyk7Ci0gIGNvbnN0IGN0eXBlPHdjaGFyX3Q+JiBfX2N0ID0gKl9fU1RBVElDX0NBU1QoY29uc3QgY3R5cGU8d2NoYXJfdD4qLCBfX2YuX01fY3R5cGVfZmFjZXQoKSk7Ci0KLSAgd2NoYXJfdCBfX3hwbHVzICA9IF9fY3Qud2lkZW4oJysnKTsKLSAgd2NoYXJfdCBfX3htaW51cyA9IF9fY3Qud2lkZW4oJy0nKTsKLQotICB3Y2hhcl90IF9fd2J1Zls2NF07Ci0gIF9fY3Qud2lkZW4oX19idWYsIF9faWVuZCwgX193YnVmKTsKLSAgcHRyZGlmZl90IF9fbGVuID0gX19pZW5kIC0gX19idWY7Ci0gIHdjaGFyX3QqIF9fZWVuZCA9IF9fd2J1ZiArIF9fbGVuOwotCi0gIC8vICBjb25zdCBudW1wdW5jdDx3Y2hhcl90PiYgX19ucCA9IHVzZV9mYWNldDxudW1wdW5jdDx3Y2hhcl90PiA+KF9fbG9jKTsKLSAgLy8gIGNvbnN0IHN0cmluZyYgX19ncm91cGluZyA9IF9fbnAuZ3JvdXBpbmcoKTsKLQotICBjb25zdCBudW1wdW5jdDx3Y2hhcl90PiYgX19ucCA9ICpfX1NUQVRJQ19DQVNUKGNvbnN0IG51bXB1bmN0PHdjaGFyX3Q+KiwgX19mLl9NX251bXB1bmN0X2ZhY2V0KCkpOwotICBjb25zdCBzdHJpbmcmIF9fZ3JvdXBpbmcgPSBfX2YuX01fZ3JvdXBpbmcoKTsKLQotICBpZiAoIV9fZ3JvdXBpbmcuZW1wdHkoKSkgewotICAgIGludCBfX2Jhc2VjaGFyczsKLSAgICBpZiAoX19mbGFncyAmIGlvc19iYXNlOjpzaG93YmFzZSkKLSAgICAgIHN3aXRjaCAoX19mbGFncyAmIGlvc19iYXNlOjpiYXNlZmllbGQpIHsKLSAgICAgICAgY2FzZSBpb3NfYmFzZTo6aGV4OiBfX2Jhc2VjaGFycyA9IDI7IGJyZWFrOwotICAgICAgICBjYXNlIGlvc19iYXNlOjpvY3Q6IF9fYmFzZWNoYXJzID0gMTsgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IF9fYmFzZWNoYXJzID0gMDsKLSAgICAgIH0KLSAgICBlbHNlCi0gICAgICBfX2Jhc2VjaGFycyA9IDA7Ci0KLSAgICBfX2xlbiA9IF9faW5zZXJ0X2dyb3VwaW5nKF9fd2J1ZiwgX19lZW5kLCBfX2dyb3VwaW5nLCBfX25wLnRob3VzYW5kc19zZXAoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9feHBsdXMsIF9feG1pbnVzLCBfX2Jhc2VjaGFycyk7Ci0gIH0KLQotICByZXR1cm4gX19jb3B5X2ludGVnZXJfYW5kX2ZpbGwoKHdjaGFyX3QqKV9fd2J1ZiwgX19sZW4sIF9fcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZmxhZ3MsIF9fZi53aWR0aCgwKSwgX19maWxsLCBfX3hwbHVzLCBfX3htaW51cyk7Ci19Ci0jZW5kaWYKLQotLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBjaGFyCi10ZW1wbGF0ZSA8Y2xhc3MgX091dHB1dEl0ZXI+Ci1fT3V0cHV0SXRlciBfU1RMUF9DQUxMCi1fX3B1dF9pbnRlZ2VyKGNoYXIqIF9fYnVmLCBjaGFyKiBfX2llbmQsIF9PdXRwdXRJdGVyIF9fcywKLSAgICAgICAgICAgICAgaW9zX2Jhc2UmIF9fZiwgaW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MsIGNoYXIgX19maWxsKSB7Ci0gIGNoYXIgX19ncnBidWZbNjRdOwotICBwdHJkaWZmX3QgX19sZW4gPSBfX2llbmQgLSBfX2J1ZjsKLQotICAvLyAgY29uc3QgbnVtcHVuY3Q8Y2hhcj4mIF9fbnAgPSB1c2VfZmFjZXQ8bnVtcHVuY3Q8Y2hhcj4gPihfX2YuZ2V0bG9jKCkpOwotICAvLyAgY29uc3Qgc3RyaW5nJiBfX2dyb3VwaW5nID0gX19ucC5ncm91cGluZygpOwotCi0gIGNvbnN0IG51bXB1bmN0PGNoYXI+JiBfX25wID0gKl9fU1RBVElDX0NBU1QoY29uc3QgbnVtcHVuY3Q8Y2hhcj4qLCBfX2YuX01fbnVtcHVuY3RfZmFjZXQoKSk7Ci0gIGNvbnN0IHN0cmluZyYgX19ncm91cGluZyA9IF9fZi5fTV9ncm91cGluZygpOwotCi0gIGlmICghX19ncm91cGluZy5lbXB0eSgpKSB7Ci0gICAgaW50IF9fYmFzZWNoYXJzOwotICAgIGlmIChfX2ZsYWdzICYgaW9zX2Jhc2U6OnNob3diYXNlKQotICAgICAgc3dpdGNoIChfX2ZsYWdzICYgaW9zX2Jhc2U6OmJhc2VmaWVsZCkgewotICAgICAgICBjYXNlIGlvc19iYXNlOjpoZXg6IF9fYmFzZWNoYXJzID0gMjsgYnJlYWs7Ci0gICAgICAgIGNhc2UgaW9zX2Jhc2U6Om9jdDogX19iYXNlY2hhcnMgPSAxOyBicmVhazsKLSAgICAgICAgZGVmYXVsdDogX19iYXNlY2hhcnMgPSAwOwotICAgICAgfQotICAgIGVsc2UKLSAgICAgIF9fYmFzZWNoYXJzID0gMDsKLQotICAgICAvLyBtYWtlIHN1cmUgdGhlcmUgaXMgcm9vbSBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIKLSAgICAgLy8gd2UgcGFzcyB0byBfX2luc2VydF9ncm91cGluZwotICAgIGNvcHkoX19idWYsIF9faWVuZCwgKGNoYXIgKikgX19ncnBidWYpOwotICAgIF9fYnVmID0gX19ncnBidWY7Ci0gICAgX19pZW5kID0gX19ncnBidWYgKyBfX2xlbjsKLSAgICBfX2xlbiA9IF9faW5zZXJ0X2dyb3VwaW5nKF9fYnVmLCBfX2llbmQsIF9fZ3JvdXBpbmcsIF9fbnAudGhvdXNhbmRzX3NlcCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJysnLCAnLScsIF9fYmFzZWNoYXJzKTsKLSAgfQotCi0gIHJldHVybiBfX2NvcHlfaW50ZWdlcl9hbmRfZmlsbChfX2J1ZiwgX19sZW4sIF9fcywgX19mbGFncywgX19mLndpZHRoKDApLCBfX2ZpbGwsICcrJywgJy0nKTsKLX0KLQotI2lmIGRlZmluZWQgKF9TVExQX0xPTkdfTE9ORykKLXR5cGVkZWYgX1NUTFBfTE9OR19MT05HIF9fbWF4X2ludF90OwotdHlwZWRlZiB1bnNpZ25lZCBfU1RMUF9MT05HX0xPTkcgX191bWF4X2ludF90OwotI2Vsc2UKLXR5cGVkZWYgbG9uZyBfX21heF9pbnRfdDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBfX3VtYXhfaW50X3Q7Ci0jZW5kaWYKLQotX1NUTFBfREVDTFNQRUMgY29uc3QgY2hhciogX1NUTFBfQ0FMTCBfX2hleF9jaGFyX3RhYmxlX2xvKCk7Ci1fU1RMUF9ERUNMU1BFQyBjb25zdCBjaGFyKiBfU1RMUF9DQUxMIF9faGV4X2NoYXJfdGFibGVfaGkoKTsKLQotdGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2VyPgotaW5saW5lIGNoYXIqIF9TVExQX0NBTEwKLV9fd3JpdGVfZGVjaW1hbF9iYWNrd2FyZChjaGFyKiBfX3B0ciwgX0ludGVnZXIgX194LCBpb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncywgY29uc3QgX190cnVlX3R5cGUmIC8qIGlzX3NpZ25lZCAqLykgewotICBjb25zdCBib29sIF9fbmVnYXRpdmUgPSBfX3ggPCAwIDsKLSAgX19tYXhfaW50X3QgX190ZW1wID0gX194OwotICBfX3VtYXhfaW50X3QgX191dGVtcCA9IF9fbmVnYXRpdmU/LV9fdGVtcDpfX3RlbXA7Ci0KLSAgZm9yICg7IF9fdXRlbXAgIT0gMDsgX191dGVtcCAvPSAxMCkKLSAgICAqLS1fX3B0ciA9IChjaGFyKSgoaW50KShfX3V0ZW1wICUgMTApICsgJzAnKTsKLSAgLy8gcHV0IHNpZ24gaWYgbmVlZGVkIG9yIHJlcXVlc3RlZAotICBpZiAoX19uZWdhdGl2ZSkKLSAgICAqLS1fX3B0ciA9ICctJzsKLSAgZWxzZSBpZiAoX19mbGFncyAmIGlvc19iYXNlOjpzaG93cG9zKQotICAgICotLV9fcHRyID0gJysnOwotICByZXR1cm4gX19wdHI7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfSW50ZWdlcj4KLWlubGluZSBjaGFyKiBfU1RMUF9DQUxMCi1fX3dyaXRlX2RlY2ltYWxfYmFja3dhcmQoY2hhciogX19wdHIsIF9JbnRlZ2VyIF9feCwgaW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MsIGNvbnN0IF9fZmFsc2VfdHlwZSYgLyogaXNfc2lnbmVkICovKSB7Ci0gIGZvciAoOyBfX3ggIT0gMDsgX194IC89IDEwKQotICAgICotLV9fcHRyID0gKGNoYXIpKChpbnQpKF9feCAlIDEwKSArICcwJyk7Ci0gIC8vIHB1dCBzaWduIGlmIHJlcXVlc3RlZAotICBpZiAoX19mbGFncyAmIGlvc19iYXNlOjpzaG93cG9zKQotICAgICotLV9fcHRyID0gJysnOwotICByZXR1cm4gX19wdHI7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfSW50ZWdlcj4KLWNoYXIqIF9TVExQX0NBTEwKLV9fd3JpdGVfaW50ZWdlcl9iYWNrd2FyZChjaGFyKiBfX2J1ZiwgaW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MsIF9JbnRlZ2VyIF9feCkgewotICBjaGFyKiBfX3B0ciA9IF9fYnVmOwotCi0gIGlmIChfX3ggPT0gMCkgewotICAgICotLV9fcHRyID0gJzAnOwotICAgIGlmICgoX19mbGFncyAmIGlvc19iYXNlOjpzaG93cG9zKSAmJiAoKF9fZmxhZ3MgJiAoaW9zX2Jhc2U6Om9jdCB8IGlvc19iYXNlOjpoZXgpKSA9PSAwKSkKLSAgICAgICotLV9fcHRyID0gJysnOwotICAgIC8vIG9jdCBvciBoZXggYmFzZSBzaGFsbCBub3QgYmUgYWRkZWQgdG8gdGhlIDAgdmFsdWUgKHNlZSAnIycgZmxhZyBpbiBDIGZvcm1hdGluZyBzdHJpbmdzKQotICB9Ci0gIGVsc2UgewotICAgIHN3aXRjaCAoX19mbGFncyAmIGlvc19iYXNlOjpiYXNlZmllbGQpIHsKLSAgICAgIGNhc2UgaW9zX2Jhc2U6Om9jdDoKLSAgICAgICAgewotICAgICAgICAgIF9fdW1heF9pbnRfdCBfX3RlbXAgPSBfX3g7Ci0gICAgICAgICAgLy8gaWYgdGhlIHNpemUgb2YgaW50ZWdlciBpcyBsZXNzIHRoYW4gOCwgY2xlYXIgdXBwZXIgcGFydAotICAgICAgICAgIGlmICggc2l6ZW9mKF9feCkgPCA4ICAmJiBzaXplb2YoX191bWF4X2ludF90KSA+PSA4ICkKLSAgICAgICAgICAgIF9fdGVtcCAmPSAweEZGRkZGRkZGOwotCi0gICAgICAgICAgZm9yICg7IF9fdGVtcCAhPSAwOyBfX3RlbXAgPj49MykKLSAgICAgICAgICAgICotLV9fcHRyID0gKGNoYXIpKCgoKHVuc2lnbmVkKV9fdGVtcCkmIDB4NykgKyAnMCcpOwotCi0gICAgICAgICAgLy8gcHV0IGxlYWRpbmcgJzAnIGlmIHNob3diYXNlIGlzIHNldAotICAgICAgICAgIGlmIChfX2ZsYWdzICYgaW9zX2Jhc2U6OnNob3diYXNlKQotICAgICAgICAgICAgKi0tX19wdHIgPSAnMCc7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGlvc19iYXNlOjpoZXg6Ci0gICAgICAgIHsKLSAgICAgICAgICBjb25zdCBjaGFyKiBfX3RhYmxlX3B0ciA9IChfX2ZsYWdzICYgaW9zX2Jhc2U6OnVwcGVyY2FzZSkgPwotICAgICAgICAgICAgX19oZXhfY2hhcl90YWJsZV9oaSgpIDogX19oZXhfY2hhcl90YWJsZV9sbygpOwotICAgICAgICAgIF9fdW1heF9pbnRfdCBfX3RlbXAgPSBfX3g7Ci0gICAgICAgICAgLy8gaWYgdGhlIHNpemUgb2YgaW50ZWdlciBpcyBsZXNzIHRoYW4gOCwgY2xlYXIgdXBwZXIgcGFydAotICAgICAgICAgIGlmICggc2l6ZW9mKF9feCkgPCA4ICAmJiBzaXplb2YoX191bWF4X2ludF90KSA+PSA4ICkKLSAgICAgICAgICAgIF9fdGVtcCAmPSAweEZGRkZGRkZGOwotCi0gICAgICAgICAgZm9yICg7IF9fdGVtcCAhPSAwOyBfX3RlbXAgPj49NCkKLSAgICAgICAgICAgICotLV9fcHRyID0gX190YWJsZV9wdHJbKCh1bnNpZ25lZClfX3RlbXAgJiAweEYpXTsKLQotICAgICAgICAgIGlmIChfX2ZsYWdzICYgaW9zX2Jhc2U6OnNob3diYXNlKSB7Ci0gICAgICAgICAgICAqLS1fX3B0ciA9IF9fdGFibGVfcHRyWzE2XTsKLSAgICAgICAgICAgICotLV9fcHRyID0gJzAnOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIC8vY2FzZSBpb3NfYmFzZTo6ZGVjOgotICAgICAgZGVmYXVsdDoKLSAgICAgICAgewotI2lmIGRlZmluZWQoX19IUF9hQ0MpICYmIChfX0hQX2FDQyA9PSAxKQotICAgICAgICAgIGJvb2wgX0lzU2lnbmVkID0gISgoX0ludGVnZXIpLTEgPiAwKTsKLSAgICAgICAgICBpZiAoX0lzU2lnbmVkKQotICAgICAgICAgICAgX19wdHIgPSBfX3dyaXRlX2RlY2ltYWxfYmFja3dhcmQoX19wdHIsIF9feCwgX19mbGFncywgX190cnVlX3R5cGUoKSApOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIF9fcHRyID0gX193cml0ZV9kZWNpbWFsX2JhY2t3YXJkKF9fcHRyLCBfX3gsIF9fZmxhZ3MsIF9fZmFsc2VfdHlwZSgpICk7Ci0jZWxzZQotICAgICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19ib29sMnR5cGU8bnVtZXJpY19saW1pdHM8X0ludGVnZXI+Ojppc19zaWduZWQ+OjpfUmV0IF9Jc1NpZ25lZDsKLSAgICAgICAgICBfX3B0ciA9IF9fd3JpdGVfZGVjaW1hbF9iYWNrd2FyZChfX3B0ciwgX194LCBfX2ZsYWdzLCBfSXNTaWduZWQoKSk7Ci0jZW5kaWYKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICAvLyByZXR1cm4gcG9pbnRlciB0byBiZWdpbm5pbmcgb2YgdGhlIHN0cmluZwotICByZXR1cm4gX19wdHI7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9PdXRwdXRJdGVyLCBjbGFzcyBfSW50ZWdlcj4KLV9PdXRwdXRJdGVyIF9TVExQX0NBTEwKLV9fZG9fcHV0X2ludGVnZXIoX091dHB1dEl0ZXIgX19zLCBpb3NfYmFzZSYgX19mLCBfQ2hhclQgX19maWxsLCBfSW50ZWdlciBfX3gpIHsKLSAgLy8gYnVmZmVyIHNpemUgPSBudW1iZXIgb2YgYnl0ZXMgKiBudW1iZXIgb2YgZGlnaXQgbmVjZXNzYXJ5IGluIHRoZSBzbWFsbGVzdCBTdGFuZGFyZCBiYXNlIChiYXNlIDgsIDMgZGlnaXRzL2J5dGUpCi0gIC8vICAgICAgICAgICAgICAgcGx1cyB0aGUgbG9uZ2VzdCBiYXNlIHJlcHJlc2VudGF0aW9uICcweCcKLSAgLy8gRG8gbm90IHVzZSBfX2J1Zl9zaXplIHRvIGRlZmluZSBfX2J1ZiBzdGF0aWMgYnVmZmVyLCBzb21lIGNvbXBpbGVycyAoSFAgYUNDKSBkbyBub3QgYWNjZXB0IGNvbnN0IHZhcmlhYmxlIGFzCi0gIC8vIHRoZSBzcGVjaWZpY2F0aW9uIG9mIGEgc3RhdGljIGJ1ZmZlciBzaXplLgotICBjaGFyIF9fYnVmW3NpemVvZihfSW50ZWdlcikgKiAzICsgMl07Ci0gIGNvbnN0IHB0cmRpZmZfdCBfX2J1Zl9zaXplID0gc2l6ZW9mKF9fYnVmKSAvIHNpemVvZihjaGFyKTsKLSAgaW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX2YuZmxhZ3MoKTsKLSAgY2hhciogX19pYmVnID0gX193cml0ZV9pbnRlZ2VyX2JhY2t3YXJkKChjaGFyKilfX2J1ZitfX2J1Zl9zaXplLCBfX2ZsYWdzLCBfX3gpOwotICByZXR1cm4gX19wdXRfaW50ZWdlcihfX2liZWcsIChjaGFyKilfX2J1ZitfX2J1Zl9zaXplLCBfX3MsIF9fZiwgX19mbGFncywgX19maWxsKTsKLX0KLQotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi0KLS8vCi0vLyBudW1fcHV0PD4KLS8vCi0KLSNpZiAoX1NUTFBfU1RBVElDX1RFTVBMQVRFX0RBVEEgPiAwKQotCi0jICBpZiAhZGVmaW5lZCAoX19CT1JMQU5EQ19fKQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX091dHB1dEl0ZXJhdG9yPgotbG9jYWxlOjppZCBudW1fcHV0PF9DaGFyVCwgX091dHB1dEl0ZXJhdG9yPjo6aWQ7Ci0jICBlbmRpZgotCi0jICBpZiAoZGVmaW5lZCAoX19DWUdXSU5fXykgfHwgZGVmaW5lZCAoX19NSU5HVzMyX18pKSAmJiBcCi0gICAgICAgZGVmaW5lZCAoX1NUTFBfVVNFX0RZTkFNSUNfTElCKSAmJiAhZGVmaW5lZCAoX19CVUlMRElOR19TVExQT1JUKQotLyoKLSAqIFVuZGVyIGN5Z3dpbiwgd2hlbiBTVExwb3J0IGlzIHVzZWQgYXMgYSBzaGFyZWQgbGlicmFyeSwgdGhlIGlkIG5lZWRzCi0gKiB0byBiZSBzcGVjaWZpZWQgYXMgaW1wb3J0ZWQgb3RoZXJ3aXNlIHRoZXkgd2lsbCBiZSBkdXBsaWNhdGVkIGluIHRoZQotICogY2FsbGluZyBleGVjdXRhYmxlLgotICovCi10ZW1wbGF0ZSA8PgotX1NUTFBfREVDTFNQRUMgbG9jYWxlOjppZCBudW1fcHV0PGNoYXIsIG9zdHJlYW1idWZfaXRlcmF0b3I8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiA+OjppZDsKLS8qCi10ZW1wbGF0ZSA8PgotX1NUTFBfREVDTFNQRUMgbG9jYWxlOjppZCBudW1fcHV0PGNoYXIsIGNoYXIqPjo6aWQ7Ci0qLwotCi0jICAgIGlmICFkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQotdGVtcGxhdGUgPD4KLV9TVExQX0RFQ0xTUEVDIGxvY2FsZTo6aWQgbnVtX3B1dDx3Y2hhcl90LCBvc3RyZWFtYnVmX2l0ZXJhdG9yPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4gPjo6aWQ7Ci0vKgotdGVtcGxhdGUgPD4KLV9TVExQX0RFQ0xTUEVDIGxvY2FsZTo6aWQgbnVtX3B1dDx3Y2hhcl90LCB3Y2hhcl90Kj46OmlkOwotKi8KLSMgICAgZW5kaWYKLQotIyAgZW5kaWYgLyogX19DWUdXSU5fXyAmJiBfU1RMUF9VU0VfRFlOQU1JQ19MSUIgKi8KLQotI2Vsc2UgLyogKCBfU1RMUF9TVEFUSUNfVEVNUExBVEVfREFUQSA+IDAgKSAqLwotCi0vL3R5cGVkZWYgbnVtX3B1dDxjaGFyLCBjaGFyKj4gbnVtX3B1dF9jaGFyOwotdHlwZWRlZiBudW1fcHV0PGNoYXIsIG9zdHJlYW1idWZfaXRlcmF0b3I8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiA+IG51bV9wdXRfY2hhcl8yOwotCi0vL19fREVDTEFSRV9JTlNUQU5DRShsb2NhbGU6OmlkLCBudW1fcHV0X2NoYXI6OmlkLCApOwotX19ERUNMQVJFX0lOU1RBTkNFKGxvY2FsZTo6aWQsIG51bV9wdXRfY2hhcl8yOjppZCwgKTsKLQotIyAgaWYgIWRlZmluZWQgKF9TVExQX05PX1dDSEFSX1QpCi0KLS8vdHlwZWRlZiBudW1fcHV0PHdjaGFyX3QsIHdjaGFyX3QqPiBudW1fcHV0X3djaGFyX3Q7Ci10eXBlZGVmIG51bV9wdXQ8d2NoYXJfdCwgb3N0cmVhbWJ1Zl9pdGVyYXRvcjx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+ID4gbnVtX3B1dF93Y2hhcl90XzI7Ci0KLS8vX19ERUNMQVJFX0lOU1RBTkNFKGxvY2FsZTo6aWQsIG51bV9wdXRfd2NoYXJfdDo6aWQsICk7Ci1fX0RFQ0xBUkVfSU5TVEFOQ0UobG9jYWxlOjppZCwgbnVtX3B1dF93Y2hhcl90XzI6OmlkLCApOwotCi0jICBlbmRpZgotCi0jZW5kaWYgLyogKCBfU1RMUF9TVEFUSUNfVEVNUExBVEVfREFUQSA+IDAgKSAqLwotCi0vLyBpc3N1ZSAxMTgKLQotI2lmICFkZWZpbmVkIChfU1RMUF9OT19CT09MKQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX091dHB1dEl0ZXI+Ci1fT3V0cHV0SXRlcgotbnVtX3B1dDxfQ2hhclQsIF9PdXRwdXRJdGVyPjo6ZG9fcHV0KF9PdXRwdXRJdGVyIF9fcywgaW9zX2Jhc2UmIF9fZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX3R5cGUgX19maWxsLCAgYm9vbCBfX3ZhbCkgY29uc3QgewotICBpZiAoIShfX2YuZmxhZ3MoKSAmIGlvc19iYXNlOjpib29sYWxwaGEpKQotICAgIHJldHVybiB0aGlzLT5kb19wdXQoX19zLCBfX2YsIF9fZmlsbCwgX19TVEFUSUNfQ0FTVChsb25nLF9fdmFsKSk7Ci0KLSAgbG9jYWxlIF9fbG9jID0gX19mLmdldGxvYygpOwotICAvLyAgdHlwZWRlZiBudW1wdW5jdDxfQ2hhclQ+IF9QdW5jdDsKLSAgLy8gIGNvbnN0IF9QdW5jdCYgX19ucCA9IHVzZV9mYWNldDxfUHVuY3Q+KF9fbG9jKTsKLQotICBjb25zdCBudW1wdW5jdDxfQ2hhclQ+JiBfX25wID0gKl9fU1RBVElDX0NBU1QoY29uc3QgbnVtcHVuY3Q8X0NoYXJUPiosIF9fZi5fTV9udW1wdW5jdF9mYWNldCgpKTsKLQotICBiYXNpY19zdHJpbmc8X0NoYXJUPiBfX3N0ciA9IF9fdmFsID8gX19ucC50cnVlbmFtZSgpIDogX19ucC5mYWxzZW5hbWUoKTsKLQotICAvLyBSZXVzZSBfX2NvcHlfaW50ZWdlcl9hbmRfZmlsbC4gIFNpbmNlIGludGVybmFsIHBhZGRpbmcgbWFrZXMgbm8KLSAgLy8gc2Vuc2UgZm9yIGJvb2wsIHRob3VnaCwgbWFrZSBzdXJlIHdlIHVzZSBzb21ldGhpbmcgZWxzZSBpbnN0ZWFkLgotICAvLyBUaGUgbGFzdCB0d28gYXJndW1lbnQgdG8gX19jb3B5X2ludGVnZXJfYW5kX2ZpbGwgYXJlIGR1bW1pZXMuCi0gIGlvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19mLmZsYWdzKCk7Ci0gIGlmICgoX19mbGFncyAmIGlvc19iYXNlOjphZGp1c3RmaWVsZCkgPT0gaW9zX2Jhc2U6OmludGVybmFsKQotICAgIF9fZmxhZ3MgPSAoX19mbGFncyAmIH5pb3NfYmFzZTo6YWRqdXN0ZmllbGQpIHwgaW9zX2Jhc2U6OnJpZ2h0OwotCi0gIHJldHVybiBfU1RMUF9QUklWIF9fY29weV9pbnRlZ2VyX2FuZF9maWxsKF9fc3RyLmNfc3RyKCksIF9fc3RyLnNpemUoKSwgX19zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ZsYWdzLCBfX2Yud2lkdGgoMCksIF9fZmlsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9DaGFyVCkgMCwgKF9DaGFyVCkgMCk7Ci19Ci0KLSNlbmRpZgotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfT3V0cHV0SXRlcj4KLV9PdXRwdXRJdGVyCi1udW1fcHV0PF9DaGFyVCwgX091dHB1dEl0ZXI+Ojpkb19wdXQoX091dHB1dEl0ZXIgX19zLCBpb3NfYmFzZSYgX19mLCBfQ2hhclQgX19maWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgX192YWwpIGNvbnN0Ci17IHJldHVybiBfU1RMUF9QUklWIF9fZG9fcHV0X2ludGVnZXIoX19zLCBfX2YsIF9fZmlsbCwgX192YWwpOyB9Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9PdXRwdXRJdGVyPgotX091dHB1dEl0ZXIKLW51bV9wdXQ8X0NoYXJULCBfT3V0cHV0SXRlcj46OmRvX3B1dChfT3V0cHV0SXRlciBfX3MsIGlvc19iYXNlJiBfX2YsIF9DaGFyVCBfX2ZpbGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBfX3ZhbCkgY29uc3QKLXsgcmV0dXJuIF9TVExQX1BSSVYgX19kb19wdXRfaW50ZWdlcihfX3MsIF9fZiwgX19maWxsLCBfX3ZhbCk7IH0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX091dHB1dEl0ZXI+Ci1fT3V0cHV0SXRlcgotbnVtX3B1dDxfQ2hhclQsIF9PdXRwdXRJdGVyPjo6ZG9fcHV0KF9PdXRwdXRJdGVyIF9fcywgaW9zX2Jhc2UmIF9fZiwgX0NoYXJUIF9fZmlsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgX192YWwpIGNvbnN0Ci17IHJldHVybiBfU1RMUF9QUklWIF9fZG9fcHV0X2Zsb2F0KF9fcywgX19mLCBfX2ZpbGwsIF9fdmFsKTsgfQotCi0jaWYgIWRlZmluZWQgKF9TVExQX05PX0xPTkdfRE9VQkxFKQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX091dHB1dEl0ZXI+Ci1fT3V0cHV0SXRlcgotbnVtX3B1dDxfQ2hhclQsIF9PdXRwdXRJdGVyPjo6ZG9fcHV0KF9PdXRwdXRJdGVyIF9fcywgaW9zX2Jhc2UmIF9fZiwgX0NoYXJUIF9fZmlsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGRvdWJsZSBfX3ZhbCkgY29uc3QKLXsgcmV0dXJuIF9TVExQX1BSSVYgX19kb19wdXRfZmxvYXQoX19zLCBfX2YsIF9fZmlsbCwgX192YWwpOyB9Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9TVExQX0xPTkdfTE9ORykKLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9PdXRwdXRJdGVyPgotX091dHB1dEl0ZXIKLW51bV9wdXQ8X0NoYXJULCBfT3V0cHV0SXRlcj46OmRvX3B1dChfT3V0cHV0SXRlciBfX3MsIGlvc19iYXNlJiBfX2YsIF9DaGFyVCBfX2ZpbGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfTE9OR19MT05HIF9fdmFsKSBjb25zdAoteyByZXR1cm4gX1NUTFBfUFJJViBfX2RvX3B1dF9pbnRlZ2VyKF9fcywgX19mLCBfX2ZpbGwsIF9fdmFsKTsgfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfT3V0cHV0SXRlcj4KLV9PdXRwdXRJdGVyCi1udW1fcHV0PF9DaGFyVCwgX091dHB1dEl0ZXI+Ojpkb19wdXQoX091dHB1dEl0ZXIgX19zLCBpb3NfYmFzZSYgX19mLCBfQ2hhclQgX19maWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIF9TVExQX0xPTkdfTE9ORyBfX3ZhbCkgY29uc3QKLXsgcmV0dXJuIF9TVExQX1BSSVYgX19kb19wdXRfaW50ZWdlcihfX3MsIF9fZiwgX19maWxsLCBfX3ZhbCk7IH0KLSNlbmRpZiAvKiBfU1RMUF9MT05HX0xPTkcgKi8KLQotCi0vLyBsaWIuZmFjZXQubnVtLnB1dC52aXJ0dWFscyAiMTIgRm9yIGNvbnZlcnNpb24gZnJvbSB2b2lkKiB0aGUgc3BlY2lmaWVyIGlzICVwLiIKLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9PdXRwdXRJdGVyPgotX091dHB1dEl0ZXIKLW51bV9wdXQ8X0NoYXJULCBfT3V0cHV0SXRlcj46OmRvX3B1dChfT3V0cHV0SXRlciBfX3MsIGlvc19iYXNlJiBfX2YsIF9DaGFyVCAvKl9fZmlsbCovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIF9fdmFsKSBjb25zdCB7Ci0gIGNvbnN0IGN0eXBlPF9DaGFyVD4mIF9fY190eXBlID0gKl9fU1RBVElDX0NBU1QoY29uc3QgY3R5cGU8X0NoYXJUPiosIF9fZi5fTV9jdHlwZV9mYWNldCgpKTsKLSAgaW9zX2Jhc2U6OmZtdGZsYWdzIF9fc2F2ZV9mbGFncyA9IF9fZi5mbGFncygpOwotCi0gIF9fZi5zZXRmKGlvc19iYXNlOjpoZXgsIGlvc19iYXNlOjpiYXNlZmllbGQpOwotICBfX2Yuc2V0Zihpb3NfYmFzZTo6c2hvd2Jhc2UpOwotICBfX2Yuc2V0Zihpb3NfYmFzZTo6aW50ZXJuYWwsIGlvc19iYXNlOjphZGp1c3RmaWVsZCk7Ci0gIF9fZi53aWR0aCgoc2l6ZW9mKHZvaWQqKSAqIDIpICsgMik7IC8vIGRpZ2l0cyBpbiBwb2ludGVyIHR5cGUgcGx1cyAnMHgnIHByZWZpeAotIyBpZiBkZWZpbmVkKF9TVExQX0xPTkdfTE9ORykgJiYgIWRlZmluZWQoX19NUkNfXykgLy8qdHkgMTEvMjQvMjAwMSAtIE1yQ3BwIGNhbiBub3QgY2FzdCBmcm9tIHZvaWQqIHRvIGxvbmcgbG9uZwotICBfT3V0cHV0SXRlciByZXN1bHQgPSB0aGlzLT5kb19wdXQoX19zLCBfX2YsIF9fY190eXBlLndpZGVuKCcwJyksIF9fUkVJTlRFUlBSRVRfQ0FTVCh1bnNpZ25lZCBfU1RMUF9MT05HX0xPTkcsX192YWwpKTsKLSMgZWxzZQotICBfT3V0cHV0SXRlciByZXN1bHQgPSB0aGlzLT5kb19wdXQoX19zLCBfX2YsIF9fY190eXBlLndpZGVuKCcwJyksIF9fUkVJTlRFUlBSRVRfQ0FTVCh1bnNpZ25lZCBsb25nLF9fdmFsKSk7Ci0jIGVuZGlmCi0gIF9fZi5mbGFncyhfX3NhdmVfZmxhZ3MpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi1fU1RMUF9FTkRfTkFNRVNQQUNFCi0KLSNlbmRpZiAvKiBfU1RMUF9OVU1fUFVUX0MgKi8KLQotLy8gTG9jYWwgVmFyaWFibGVzOgotLy8gbW9kZTpDKysKLS8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9fbnVtX3B1dC5oIGIvc3RsL19udW1fcHV0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3N2NkOTMuLjAwMDAwMDAKLS0tIGEvc3RsL19udW1fcHV0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLS8vIFdBUk5JTkc6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIEMrKwotLy8gc3RhbmRhcmQgbGlicmFyeSBoZWFkZXJzLiAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgdGhpcyBoZWFkZXIKLS8vIGZpbGUgZGlyZWN0bHkuCi0KLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9OVU1fUFVUX0gKLSNkZWZpbmUgX1NUTFBfSU5URVJOQUxfTlVNX1BVVF9ICi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfTlVNUFVOQ1RfSAotIyBpbmNsdWRlIDxzdGwvX251bXB1bmN0Lmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DVFlQRV9ICi0jIGluY2x1ZGUgPHN0bC9fY3R5cGUuaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX09TVFJFQU1CVUZfSVRFUkFUT1JfSAotIyBpbmNsdWRlIDxzdGwvX29zdHJlYW1idWZfaXRlcmF0b3IuaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0lPU1RSRUFNX1NUUklOR19ICi0jIGluY2x1ZGUgPHN0bC9faW9zdHJlYW1fc3RyaW5nLmg+Ci0jZW5kaWYKLQotX1NUTFBfQkVHSU5fTkFNRVNQQUNFCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gbnVtX3B1dCBmYWNldAotCi0jaWYgZGVmaW5lZCAoX1NUTFBfTElNSVRFRF9ERUZBVUxUX1RFTVBMQVRFUykKLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9PdXRwdXRJdGVyPgotI2Vsc2UKLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9PdXRwdXRJdGVyID0gb3N0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQsIGNoYXJfdHJhaXRzPF9DaGFyVD4gPiA+Ci0jZW5kaWYKLWNsYXNzIG51bV9wdXQ6IHB1YmxpYyBsb2NhbGU6OmZhY2V0IHsKLSAgZnJpZW5kIGNsYXNzIF9Mb2NhbGVfaW1wbDsKLXB1YmxpYzoKLSAgdHlwZWRlZiBfQ2hhclQgICAgICBjaGFyX3R5cGU7Ci0gIHR5cGVkZWYgX091dHB1dEl0ZXIgaXRlcl90eXBlOwotCi0gIGV4cGxpY2l0IG51bV9wdXQoc2l6ZV90IF9fcmVmcyA9IDApIDogbG9jYWxlOjpmYWNldChfX3JlZnMpIHt9Ci0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fQk9PTCkKLSAgaXRlcl90eXBlIHB1dChpdGVyX3R5cGUgX19zLCBpb3NfYmFzZSYgX19mLCBjaGFyX3R5cGUgX19maWxsLAotICAgICAgICAgICAgICAgIGJvb2wgX192YWwpIGNvbnN0IHsKLSAgICByZXR1cm4gZG9fcHV0KF9fcywgX19mLCBfX2ZpbGwsIF9fdmFsKTsKLSAgfQotI2VuZGlmCi0gIGl0ZXJfdHlwZSBwdXQoaXRlcl90eXBlIF9fcywgaW9zX2Jhc2UmIF9fZiwgY2hhcl90eXBlIF9fZmlsbCwKLSAgICAgICAgICAgICAgIGxvbmcgX192YWwpIGNvbnN0IHsKLSAgICByZXR1cm4gZG9fcHV0KF9fcywgX19mLCBfX2ZpbGwsIF9fdmFsKTsKLSAgfQotCi0gIGl0ZXJfdHlwZSBwdXQoaXRlcl90eXBlIF9fcywgaW9zX2Jhc2UmIF9fZiwgY2hhcl90eXBlIF9fZmlsbCwKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIF9fdmFsKSBjb25zdCB7Ci0gICAgcmV0dXJuIGRvX3B1dChfX3MsIF9fZiwgX19maWxsLCBfX3ZhbCk7Ci0gIH0KLQotI2lmIGRlZmluZWQgKF9TVExQX0xPTkdfTE9ORykKLSAgaXRlcl90eXBlIHB1dChpdGVyX3R5cGUgX19zLCBpb3NfYmFzZSYgX19mLCBjaGFyX3R5cGUgX19maWxsLAotICAgICAgICAgICAgICAgIF9TVExQX0xPTkdfTE9ORyBfX3ZhbCkgY29uc3QgewotICAgIHJldHVybiBkb19wdXQoX19zLCBfX2YsIF9fZmlsbCwgX192YWwpOwotICB9Ci0KLSAgaXRlcl90eXBlIHB1dChpdGVyX3R5cGUgX19zLCBpb3NfYmFzZSYgX19mLCBjaGFyX3R5cGUgX19maWxsLAotICAgICAgICAgICAgICAgIHVuc2lnbmVkIF9TVExQX0xPTkdfTE9ORyBfX3ZhbCkgY29uc3QgewotICAgIHJldHVybiBkb19wdXQoX19zLCBfX2YsIF9fZmlsbCwgX192YWwpOwotICB9Ci0jZW5kaWYKLQotICBpdGVyX3R5cGUgcHV0KGl0ZXJfdHlwZSBfX3MsIGlvc19iYXNlJiBfX2YsIGNoYXJfdHlwZSBfX2ZpbGwsCi0gICAgICAgICAgICAgICAgZG91YmxlIF9fdmFsKSBjb25zdCB7Ci0gICAgcmV0dXJuIGRvX3B1dChfX3MsIF9fZiwgX19maWxsLCAoZG91YmxlKV9fdmFsKTsKLSAgfQotCi0jaWYgIWRlZmluZWQgKF9TVExQX05PX0xPTkdfRE9VQkxFKQotICBpdGVyX3R5cGUgcHV0KGl0ZXJfdHlwZSBfX3MsIGlvc19iYXNlJiBfX2YsIGNoYXJfdHlwZSBfX2ZpbGwsCi0gICAgICAgICAgICAgICAgbG9uZyBkb3VibGUgX192YWwpIGNvbnN0IHsKLSAgICByZXR1cm4gZG9fcHV0KF9fcywgX19mLCBfX2ZpbGwsIF9fdmFsKTsKLSAgfQotI2VuZGlmCi0KLSAgaXRlcl90eXBlIHB1dChpdGVyX3R5cGUgX19zLCBpb3NfYmFzZSYgX19mLCBjaGFyX3R5cGUgX19maWxsLAotICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKiBfX3ZhbCkgY29uc3QgewotICAgIHJldHVybiBkb19wdXQoX19zLCBfX2YsIF9fZmlsbCwgX192YWwpOwotICB9Ci0KLSAgc3RhdGljIF9TVExQX1NUQVRJQ19NRU1CRVJfREVDTFNQRUMgbG9jYWxlOjppZCBpZDsKLQotcHJvdGVjdGVkOgotICB+bnVtX3B1dCgpIHt9Ci0jaWYgIWRlZmluZWQgKF9TVExQX05PX0JPT0wpCi0gIHZpcnR1YWwgX091dHB1dEl0ZXIgZG9fcHV0KF9PdXRwdXRJdGVyIF9fcywgaW9zX2Jhc2UmIF9fZiwgX0NoYXJUIF9fZmlsbCwgYm9vbCBfX3ZhbCkgY29uc3Q7Ci0jZW5kaWYKLSAgdmlydHVhbCBfT3V0cHV0SXRlciBkb19wdXQoX091dHB1dEl0ZXIgX19zLCBpb3NfYmFzZSYgX19mLCBfQ2hhclQgX19maWxsLCBsb25nIF9fdmFsKSBjb25zdDsKLSAgdmlydHVhbCBfT3V0cHV0SXRlciBkb19wdXQoX091dHB1dEl0ZXIgX19zLCBpb3NfYmFzZSYgX19mLCBfQ2hhclQgX19maWxsLCB1bnNpZ25lZCBsb25nIF9fdmFsKSBjb25zdDsKLSAgdmlydHVhbCBfT3V0cHV0SXRlciBkb19wdXQoX091dHB1dEl0ZXIgX19zLCBpb3NfYmFzZSYgX19mLCBfQ2hhclQgX19maWxsLCBkb3VibGUgX192YWwpIGNvbnN0OwotI2lmICFkZWZpbmVkIChfU1RMUF9OT19MT05HX0RPVUJMRSkKLSAgdmlydHVhbCBfT3V0cHV0SXRlciBkb19wdXQoX091dHB1dEl0ZXIgX19zLCBpb3NfYmFzZSYgX19mLCBfQ2hhclQgX19maWxsLCBsb25nIGRvdWJsZSBfX3ZhbCkgY29uc3Q7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9TVExQX0xPTkdfTE9ORykKLSAgdmlydHVhbCBfT3V0cHV0SXRlciBkb19wdXQoX091dHB1dEl0ZXIgX19zLCBpb3NfYmFzZSYgX19mLCBfQ2hhclQgX19maWxsLCBfU1RMUF9MT05HX0xPTkcgX192YWwpIGNvbnN0OwotICB2aXJ0dWFsIF9PdXRwdXRJdGVyIGRvX3B1dChfT3V0cHV0SXRlciBfX3MsIGlvc19iYXNlJiBfX2YsIF9DaGFyVCBfX2ZpbGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBfU1RMUF9MT05HX0xPTkcgX192YWwpIGNvbnN0IDsKLSNlbmRpZgotICB2aXJ0dWFsIF9PdXRwdXRJdGVyIGRvX3B1dChfT3V0cHV0SXRlciBfX3MsIGlvc19iYXNlJiBfX2YsIF9DaGFyVCBfX2ZpbGwsIGNvbnN0IHZvaWQqIF9fdmFsKSBjb25zdDsKLX07Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUKQotX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIG51bV9wdXQ8Y2hhciwgb3N0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+ID47Ci0vLyBfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgbnVtX3B1dDxjaGFyLCBjaGFyKj47Ci0jICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkKLV9TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBudW1fcHV0PHdjaGFyX3QsIG9zdHJlYW1idWZfaXRlcmF0b3I8d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPiA+OwotLy8gX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIG51bV9wdXQ8d2NoYXJfdCwgd2NoYXJfdCo+OwotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX1NUTFBfRVhQT1NFX1NUUkVBTV9JTVBMRU1FTlRBVElPTikKLQotX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0ludGVnZXI+Ci1jaGFyKiBfU1RMUF9DQUxMCi1fX3dyaXRlX2ludGVnZXJfYmFja3dhcmQoY2hhciogX19idWYsIGlvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzLCBfSW50ZWdlciBfX3gpOwotCi0vKgotICogUmV0dXJucyB0aGUgcG9zaXRpb24gb24gdGhlIHJpZ2h0IG9mIHRoZSBkaWdpdHMgdGhhdCBoYXMgdG8gYmUgY29uc2lkZXJlZAotICogZm9yIHRoZSBhcHBsaWNhdGlvbiBvZiB0aGUgZ3JvdXBpbmcgcG9saWN5LgotICovCi1leHRlcm4gc2l6ZV90IF9TVExQX0NBTEwgX193cml0ZV9mbG9hdChfX2lvc3RyaW5nJiwgaW9zX2Jhc2U6OmZtdGZsYWdzLCBpbnQsIGRvdWJsZSk7Ci0jICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTE9OR19ET1VCTEUpCi1leHRlcm4gc2l6ZV90IF9TVExQX0NBTEwgX193cml0ZV9mbG9hdChfX2lvc3RyaW5nJiwgaW9zX2Jhc2U6OmZtdGZsYWdzLCBpbnQsIGxvbmcgZG91YmxlKTsKLSMgIGVuZGlmCi0KLS8qCi0gKiBHZXRzIHRoZSBkaWdpdHMgb2YgdGhlIGludGVnZXIgcGFydC4KLSAqLwotdm9pZCBfU1RMUF9DQUxMIF9fZ2V0X2Zsb29yX2RpZ2l0cyhfX2lvc3RyaW5nJiwgX1NUTFBfTE9OR0VTVF9GTE9BVF9UWVBFKTsKLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KLXZvaWQgX1NUTFBfQ0FMTCBfX2dldF9tb25leV9kaWdpdHMoX1NUTFBfQkFTSUNfSU9TVFJJTkcoX0NoYXJUKSYsIGlvc19iYXNlJiwgX1NUTFBfTE9OR0VTVF9GTE9BVF9UWVBFKTsKLQotIyAgaWYgIWRlZmluZWQgKF9TVExQX05PX1dDSEFSX1QpCi1leHRlcm4gdm9pZCBfU1RMUF9DQUxMIF9fY29udmVydF9mbG9hdF9idWZmZXIoX19pb3N0cmluZyBjb25zdCYsIF9faW93c3RyaW5nJiwgY29uc3QgY3R5cGU8d2NoYXJfdD4mLCB3Y2hhcl90LCBib29sID0gdHJ1ZSk7Ci0jICBlbmRpZgotZXh0ZXJuIHZvaWQgX1NUTFBfQ0FMTCBfX2FkanVzdF9mbG9hdF9idWZmZXIoX19pb3N0cmluZyYsIGNoYXIpOwotCi1leHRlcm4gY2hhciogX1NUTFBfQ0FMTAotX193cml0ZV9pbnRlZ2VyKGNoYXIqIGJ1ZiwgaW9zX2Jhc2U6OmZtdGZsYWdzIGZsYWdzLCBsb25nIHgpOwotCi1leHRlcm4gcHRyZGlmZl90IF9TVExQX0NBTEwgX19pbnNlcnRfZ3JvdXBpbmcoY2hhciogZmlyc3QsIGNoYXIqIGxhc3QsIGNvbnN0IHN0cmluZyYsIGNoYXIsIGNoYXIsIGNoYXIsIGludCk7Ci1leHRlcm4gdm9pZCBfU1RMUF9DQUxMIF9faW5zZXJ0X2dyb3VwaW5nKF9faW9zdHJpbmcmLCBzaXplX3QsIGNvbnN0IHN0cmluZyYsIGNoYXIsIGNoYXIsIGNoYXIsIGludCk7Ci0jICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkKLWV4dGVybiBwdHJkaWZmX3QgX1NUTFBfQ0FMTCBfX2luc2VydF9ncm91cGluZyh3Y2hhcl90Kiwgd2NoYXJfdCosIGNvbnN0IHN0cmluZyYsIHdjaGFyX3QsIHdjaGFyX3QsIHdjaGFyX3QsIGludCk7Ci1leHRlcm4gdm9pZCBfU1RMUF9DQUxMIF9faW5zZXJ0X2dyb3VwaW5nKF9faW93c3RyaW5nJiwgc2l6ZV90LCBjb25zdCBzdHJpbmcmLCB3Y2hhcl90LCB3Y2hhcl90LCB3Y2hhcl90LCBpbnQpOwotIyAgZW5kaWYKLQotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi0KLSNlbmRpZiAvKiBfU1RMUF9FWFBPU0VfU1RSRUFNX0lNUExFTUVOVEFUSU9OICovCi0KLV9TVExQX0VORF9OQU1FU1BBQ0UKLQotI2lmIGRlZmluZWQgKF9TVExQX0VYUE9TRV9TVFJFQU1fSU1QTEVNRU5UQVRJT04pICYmICFkZWZpbmVkIChfU1RMUF9MSU5LX1RJTUVfSU5TVEFOVElBVElPTikKLSMgIGluY2x1ZGUgPHN0bC9fbnVtX3B1dC5jPgotI2VuZGlmCi0KLSNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9OVU1FUklDX0ZBQ0VUU19IICovCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX251bXB1bmN0LmggYi9zdGwvX251bXB1bmN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNGQ5NzkuLjAwMDAwMDAKLS0tIGEvc3RsL19udW1wdW5jdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogQm9yaXMgRm9taXRjaGV2Ci0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICovCi0vLyBXQVJOSU5HOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBDKysKLS8vIHN0YW5kYXJkIGxpYnJhcnkgaGVhZGVycy4gIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIHRoaXMgaGVhZGVyCi0vLyBmaWxlIGRpcmVjdGx5LgotCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfTlVNUFVOQ1RfSAotI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9OVU1QVU5DVF9ICi0KLSNpZm5kZWYgX1NUTFBfSU9TX0JBU0VfSAotIyBpbmNsdWRlIDxzdGwvX2lvc19iYXNlLmg+Ci0jZW5kaWYKLQotIyBpZm5kZWYgX1NUTFBfQ19MT0NBTEVfSAotIyAgaW5jbHVkZSA8c3RsL2NfbG9jYWxlLmg+Ci0jIGVuZGlmCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfU1RSSU5HX0gKLSMgaW5jbHVkZSA8c3RsL19zdHJpbmcuaD4KLSNlbmRpZgotCi1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBudW1wdW5jdCBmYWNldHMKLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4gY2xhc3MgbnVtcHVuY3Qge307Ci10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPiBjbGFzcyBudW1wdW5jdF9ieW5hbWUge307Ci10ZW1wbGF0ZSA8Y2xhc3MgX0NoLCBjbGFzcyBfSW5JdD4gY2xhc3MgbnVtX2dldDsKLQotX1NUTFBfVEVNUExBVEVfTlVMTAotY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgbnVtcHVuY3Q8Y2hhcj4gOiBwdWJsaWMgbG9jYWxlOjpmYWNldAotewotICBmcmllbmQgY2xhc3MgX0xvY2FsZV9pbXBsOwotCi0jaWZuZGVmIF9TVExQX05PX0ZSSUVORF9URU1QTEFURVMKLSAgdGVtcGxhdGUgPGNsYXNzIF9DaCwgY2xhc3MgX0luSXQ+IGZyaWVuZCBjbGFzcyBudW1fZ2V0OwotI2VuZGlmCi1wdWJsaWM6Ci0gIHR5cGVkZWYgY2hhciAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKLSAgdHlwZWRlZiBzdHJpbmcgICAgICAgICAgICAgc3RyaW5nX3R5cGU7Ci0KLSAgZXhwbGljaXQgbnVtcHVuY3Qoc2l6ZV90IF9fcmVmcyA9IDApCi0gICAgOiBsb2NhbGU6OmZhY2V0KF9fcmVmcyksIF9NX3RydWVuYW1lKCJ0cnVlIiksIF9NX2ZhbHNlbmFtZSgiZmFsc2UiKSB7fQotCi0gIGNoYXIgZGVjaW1hbF9wb2ludCgpIGNvbnN0IHsgcmV0dXJuIGRvX2RlY2ltYWxfcG9pbnQoKTsgfQotICBjaGFyIHRob3VzYW5kc19zZXAoKSBjb25zdCB7IHJldHVybiBkb190aG91c2FuZHNfc2VwKCk7IH0KLSAgc3RyaW5nIGdyb3VwaW5nKCkgY29uc3QgeyByZXR1cm4gZG9fZ3JvdXBpbmcoKTsgfQotICBzdHJpbmcgdHJ1ZW5hbWUoKSBjb25zdCB7IHJldHVybiBkb190cnVlbmFtZSgpOyB9Ci0gIHN0cmluZyBmYWxzZW5hbWUoKSBjb25zdCB7IHJldHVybiBkb19mYWxzZW5hbWUoKTsgfQotCi0gIHN0YXRpYyBfU1RMUF9TVEFUSUNfTUVNQkVSX0RFQ0xTUEVDIGxvY2FsZTo6aWQgaWQ7Ci0KLSNpZm5kZWYgX1NUTFBfTk9fRlJJRU5EX1RFTVBMQVRFUwotcHJvdGVjdGVkOgotI2VuZGlmCi0gIH5udW1wdW5jdCgpOwotCi0gIHN0cmluZyAgX01fdHJ1ZW5hbWU7Ci0gIHN0cmluZyAgX01fZmFsc2VuYW1lOwotICBzdHJpbmcgIF9NX2dyb3VwaW5nOwotCi0gIHZpcnR1YWwgY2hhciBkb19kZWNpbWFsX3BvaW50KCkgY29uc3Q7Ci0gIHZpcnR1YWwgY2hhciBkb190aG91c2FuZHNfc2VwKCkgY29uc3Q7Ci0gIHZpcnR1YWwgc3RyaW5nIGRvX2dyb3VwaW5nKCkgY29uc3Q7Ci0gIHZpcnR1YWwgc3RyaW5nIGRvX3RydWVuYW1lKCkgY29uc3Q7Ci0gIHZpcnR1YWwgc3RyaW5nIGRvX2ZhbHNlbmFtZSgpICBjb25zdDsKLX07Ci0KLSMgaWYgISBkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQotCi1fU1RMUF9URU1QTEFURV9OVUxMCi1jbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBudW1wdW5jdDx3Y2hhcl90PiA6IHB1YmxpYyBsb2NhbGU6OmZhY2V0Ci17Ci0gIGZyaWVuZCBjbGFzcyBfTG9jYWxlX2ltcGw7Ci1wdWJsaWM6Ci0gIHR5cGVkZWYgd2NoYXJfdCAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKLSAgdHlwZWRlZiB3c3RyaW5nICAgICAgICAgICAgICAgc3RyaW5nX3R5cGU7Ci0KLSAgZXhwbGljaXQgbnVtcHVuY3Qoc2l6ZV90IF9fcmVmcyA9IDApCi0gICAgOiBsb2NhbGU6OmZhY2V0KF9fcmVmcyksIF9NX3RydWVuYW1lKEwidHJ1ZSIpLCBfTV9mYWxzZW5hbWUoTCJmYWxzZSIpIHt9Ci0KLSAgd2NoYXJfdCBkZWNpbWFsX3BvaW50KCkgY29uc3QgeyByZXR1cm4gZG9fZGVjaW1hbF9wb2ludCgpOyB9Ci0gIHdjaGFyX3QgdGhvdXNhbmRzX3NlcCgpIGNvbnN0IHsgcmV0dXJuIGRvX3Rob3VzYW5kc19zZXAoKTsgfQotICBzdHJpbmcgZ3JvdXBpbmcoKSBjb25zdCB7IHJldHVybiBkb19ncm91cGluZygpOyB9Ci0gIHdzdHJpbmcgdHJ1ZW5hbWUoKSBjb25zdCB7IHJldHVybiBkb190cnVlbmFtZSgpOyB9Ci0gIHdzdHJpbmcgZmFsc2VuYW1lKCkgY29uc3QgeyByZXR1cm4gZG9fZmFsc2VuYW1lKCk7IH0KLQotICBzdGF0aWMgX1NUTFBfU1RBVElDX01FTUJFUl9ERUNMU1BFQyBsb2NhbGU6OmlkIGlkOwotCi1wcm90ZWN0ZWQ6Ci0gIHdzdHJpbmcgX01fdHJ1ZW5hbWU7Ci0gIHdzdHJpbmcgX01fZmFsc2VuYW1lOwotICBzdHJpbmcgX01fZ3JvdXBpbmc7Ci0KLSAgfm51bXB1bmN0KCk7Ci0KLSAgdmlydHVhbCB3Y2hhcl90IGRvX2RlY2ltYWxfcG9pbnQoKSBjb25zdDsKLSAgdmlydHVhbCB3Y2hhcl90IGRvX3Rob3VzYW5kc19zZXAoKSBjb25zdDsKLSAgdmlydHVhbCBzdHJpbmcgZG9fZ3JvdXBpbmcoKSBjb25zdDsKLSAgdmlydHVhbCB3c3RyaW5nIGRvX3RydWVuYW1lKCkgY29uc3Q7Ci0gIHZpcnR1YWwgd3N0cmluZyBkb19mYWxzZW5hbWUoKSAgY29uc3Q7Ci19OwotCi0jIGVuZGlmIC8qIFdDSEFSX1QgKi8KLQotX1NUTFBfVEVNUExBVEVfTlVMTAotY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgbnVtcHVuY3RfYnluYW1lPGNoYXI+IDogcHVibGljIG51bXB1bmN0PGNoYXI+IHsKLXB1YmxpYzoKLSAgdHlwZWRlZiBjaGFyICAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKLSAgdHlwZWRlZiBzdHJpbmcgICAgICAgICAgICAgIHN0cmluZ190eXBlOwotCi0gIGV4cGxpY2l0IG51bXB1bmN0X2J5bmFtZShjb25zdCBjaGFyKiBfX25hbWUsIHNpemVfdCBfX3JlZnMgPSAwLCBfTG9jYWxlX25hbWVfaGludCogX19oaW50ID0gMCk7Ci0KLXByb3RlY3RlZDoKLQotICB+bnVtcHVuY3RfYnluYW1lKCk7Ci0KLSAgdmlydHVhbCBjaGFyICAgZG9fZGVjaW1hbF9wb2ludCgpIGNvbnN0OwotICB2aXJ0dWFsIGNoYXIgICBkb190aG91c2FuZHNfc2VwKCkgY29uc3Q7Ci0gIHZpcnR1YWwgc3RyaW5nIGRvX2dyb3VwaW5nKCkgICAgICBjb25zdDsKLQotcHJpdmF0ZToKLSAgX0xvY2FsZV9udW1lcmljKiBfTV9udW1lcmljOwotCi0gIC8vZXhwbGljaXRlbHkgZGVmaW5lZCBhcyBwcml2YXRlIHRvIGF2b2lkIHdhcm5pbmdzOgotICB0eXBlZGVmIG51bXB1bmN0X2J5bmFtZTxjaGFyPiBfU2VsZjsKLSAgbnVtcHVuY3RfYnluYW1lKF9TZWxmIGNvbnN0Jik7Ci0gIF9TZWxmJiBvcGVyYXRvciA9IChfU2VsZiBjb25zdCYpOwotICBmcmllbmQgX0xvY2FsZV9uYW1lX2hpbnQqIF9Mb2NhbGVfZXh0cmFjdF9oaW50KG51bXB1bmN0X2J5bmFtZTxjaGFyPiopOwotfTsKLQotIyBpZm5kZWYgX1NUTFBfTk9fV0NIQVJfVAotX1NUTFBfVEVNUExBVEVfTlVMTAotY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgbnVtcHVuY3RfYnluYW1lPHdjaGFyX3Q+OiBwdWJsaWMgbnVtcHVuY3Q8d2NoYXJfdD4gewotcHVibGljOgotICB0eXBlZGVmIHdjaGFyX3QgICAgICAgICAgICAgICBjaGFyX3R5cGU7Ci0gIHR5cGVkZWYgd3N0cmluZyAgICAgICAgICAgICAgIHN0cmluZ190eXBlOwotCi0gIGV4cGxpY2l0IG51bXB1bmN0X2J5bmFtZShjb25zdCBjaGFyKiBfX25hbWUsIHNpemVfdCBfX3JlZnMgPSAwLCBfTG9jYWxlX25hbWVfaGludCogX19oaW50ID0gMCk7Ci0KLXByb3RlY3RlZDoKLQotICB+bnVtcHVuY3RfYnluYW1lKCk7Ci0KLSAgdmlydHVhbCB3Y2hhcl90ICAgZG9fZGVjaW1hbF9wb2ludCgpIGNvbnN0OwotICB2aXJ0dWFsIHdjaGFyX3QgICBkb190aG91c2FuZHNfc2VwKCkgY29uc3Q7Ci0gIHZpcnR1YWwgc3RyaW5nIGRvX2dyb3VwaW5nKCkgY29uc3Q7Ci0KLXByaXZhdGU6Ci0gIF9Mb2NhbGVfbnVtZXJpYyogX01fbnVtZXJpYzsKLQotICAvL2V4cGxpY2l0ZWx5IGRlZmluZWQgYXMgcHJpdmF0ZSB0byBhdm9pZCB3YXJuaW5nczoKLSAgdHlwZWRlZiBudW1wdW5jdF9ieW5hbWU8d2NoYXJfdD4gX1NlbGY7Ci0gIG51bXB1bmN0X2J5bmFtZShfU2VsZiBjb25zdCYpOwotICBfU2VsZiYgb3BlcmF0b3IgPSAoX1NlbGYgY29uc3QmKTsKLX07Ci0KLSMgZW5kaWYgLyogV0NIQVJfVCAqLwotCi1fU1RMUF9FTkRfTkFNRVNQQUNFCi0KLSNlbmRpZiAvKiBfU1RMUF9OVU1QVU5DVF9IICovCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6Ci0KZGlmZiAtLWdpdCBhL3N0bC9fb3N0cmVhbS5jIGIvc3RsL19vc3RyZWFtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiYWY0YWIuLjAwMDAwMDAKLS0tIGEvc3RsL19vc3RyZWFtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLSNpZm5kZWYgX1NUTFBfT1NUUkVBTV9DCi0jZGVmaW5lIF9TVExQX09TVFJFQU1fQwotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX09TVFJFQU1fSAotIyAgaW5jbHVkZSA8c3RsL19vc3RyZWFtLmg+Ci0jZW5kaWYKLQotI2lmICFkZWZpbmVkIChfU1RMUF9JTlRFUk5BTF9OVU1fUFVUX0gpCi0jICBpbmNsdWRlIDxzdGwvX251bV9wdXQuaD4gICAgICAgICAgICAvLyBGb3IgYmFzaWNfc3RyZWFtYnVmIGFuZCBpdGVyYXRvcnMKLSNlbmRpZgotCi1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBEZWZpbml0aW9ucyBvZiBub24taW5saW5lIG1lbWJlciBmdW5jdGlvbnMuCi0KLS8vIENvbnN0cnVjdG9yLCBkZXN0cnVjdG9yCi0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Ci1iYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OmJhc2ljX29zdHJlYW0oYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fYnVmKQotICAgIDogYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz4oKSB7Ci0gIHRoaXMtPmluaXQoX19idWYpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Ojp+YmFzaWNfb3N0cmVhbSgpCi17fQotCi0vLyBPdXRwdXQgZGlyZWN0bHkgZnJvbSBhIHN0cmVhbWJ1Zi4KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Ci1iYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCi1iYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Om9wZXJhdG9yPDwoYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fZnJvbSkgewotICBzZW50cnkgX19zZW50cnkoKnRoaXMpOwotICBpZiAoX19zZW50cnkpIHsKLSAgICBpZiAoX19mcm9tKSB7Ci0gICAgICBib29sIF9fYW55X2luc2VydGVkID0gX19mcm9tLT5ncHRyKCkgIT0gX19mcm9tLT5lZ3B0cigpCi0gICAgICAgID8gdGhpcy0+X01fY29weV9idWZmZXJlZChfX2Zyb20sIHRoaXMtPnJkYnVmKCkpCi0gICAgICAgIDogdGhpcy0+X01fY29weV91bmJ1ZmZlcmVkKF9fZnJvbSwgdGhpcy0+cmRidWYoKSk7Ci0gICAgICBpZiAoIV9fYW55X2luc2VydGVkKQotICAgICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOwotICB9Ci0KLSAgcmV0dXJuICp0aGlzOwotfQotCi0vLyBIZWxwZXIgZnVuY3Rpb25zIGZvciB0aGUgc3RyZWFtYnVmIHZlcnNpb24gb2Ygb3BlcmF0b3I8PC4gIFRoZQotLy8gZXhjZXB0aW9uLWhhbmRsaW5nIGNvZGUgaXMgY29tcGxpY2F0ZWQgYmVjYXVzZSBleGNlcHRpb25zIHRocm93bgotLy8gd2hpbGUgZXh0cmFjdGluZyBjaGFyYWN0ZXJzIGFyZSB0cmVhdGVkIGRpZmZlcmVudGx5IHRoYW4gZXhjZXB0aW9ucwotLy8gdGhyb3duIHdoaWxlIGluc2VydGluZyBjaGFyYWN0ZXJzLgotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotYm9vbCBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4KLSAgOjpfTV9jb3B5X2J1ZmZlcmVkKGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX2Zyb20sCi0gICAgICAgICAgICAgICAgICAgICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX190bykgewotICBib29sIF9fYW55X2luc2VydGVkID0gZmFsc2U7Ci0KLSAgd2hpbGUgKF9fZnJvbS0+ZWdwdHIoKSAhPSBfX2Zyb20tPmdwdHIoKSkgewotICAgIGNvbnN0IHB0cmRpZmZfdCBfX2F2YWlsID0gX19mcm9tLT5lZ3B0cigpIC0gX19mcm9tLT5ncHRyKCk7Ci0KLSAgICBzdHJlYW1zaXplIF9fbndyaXR0ZW47Ci0gICAgX1NUTFBfVFJZIHsKLSAgICAgIF9fbndyaXR0ZW4gPSBfX3RvLT5zcHV0bihfX2Zyb20tPmdwdHIoKSwgX19hdmFpbCk7Ci0gICAgICBfX2Zyb20tPmdidW1wKChpbnQpX19ud3JpdHRlbik7Ci0gICAgfQotICAgIF9TVExQX0NBVENIX0FMTCB7Ci0gICAgICB0aGlzLT5fTV9oYW5kbGVfZXhjZXB0aW9uKGlvc19iYXNlOjpiYWRiaXQpOwotICAgICAgcmV0dXJuIF9fYW55X2luc2VydGVkOwotICAgIH0KLQotICAgIGlmIChfX253cml0dGVuID09IF9fYXZhaWwpIHsKLSAgICAgIF9TVExQX1RSWSB7Ci0gICAgICAgIGlmICh0aGlzLT5fU19lb2YoX19mcm9tLT5zZ2V0YygpKSkKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIF9fYW55X2luc2VydGVkID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIF9TVExQX0NBVENIX0FMTCB7Ci0gICAgICAgIHRoaXMtPl9NX2hhbmRsZV9leGNlcHRpb24oaW9zX2Jhc2U6OmZhaWxiaXQpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKF9fbndyaXR0ZW4gIT0gMCkKLSAgICAgIHJldHVybiB0cnVlOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBfX2FueV9pbnNlcnRlZDsKLSAgfQotCi0gIC8vIE5vIGNoYXJhY3RlcnMgYXJlIGluIHRoZSBidWZmZXIsIGJ1dCB3ZSBhcmVuJ3QgYXQgRU9GLiAgU3dpdGNoIHRvCi0gIC8vIHVuYnVmZmVyZWQgbW9kZS4KLSAgcmV0dXJuIF9fYW55X2luc2VydGVkIHx8IHRoaXMtPl9NX2NvcHlfdW5idWZmZXJlZChfX2Zyb20sIF9fdG8pOwotfQotCi0vKgotICogSGVscGVyIHN0cnVjdCAoZ3VhcmQpIHRvIHB1dCBiYWNrIGEgY2hhcmFjdGVyIGluIGEgc3RyZWFtYnVmCi0gKiB3aGVuZXZlciBhbiBleGNlcHRpb24gb3IgYW4gZW9mIG9jY3VyLgotICovCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotc3RydWN0IF9TUHV0QmFja0MgewotICB0eXBlZGVmIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+IF9TdHJlYW1CdWY7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1N0cmVhbUJ1Zjo6aW50X3R5cGUgaW50X3R5cGU7Ci0gIF9TUHV0QmFja0MoX1N0cmVhbUJ1ZiAqcGZyb20pCi0gICAgOiBfX3Bmcm9tKHBmcm9tKSwgX19jKDApLCBfX2RvX2d1YXJkKGZhbHNlKSB7fQotICB+X1NQdXRCYWNrQygpIHsKLSAgICBpZiAoX19kb19ndWFyZCkgewotICAgICAgX19wZnJvbS0+c3B1dGJhY2tjKF9UcmFpdHM6OnRvX2NoYXJfdHlwZShfX2MpKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIGd1YXJkKGludF90eXBlIGMpIHsKLSAgICBfX2MgPSBjOwotICAgIF9fZG9fZ3VhcmQgPSB0cnVlOwotICB9Ci0gIHZvaWQgcmVsZWFzZSgpIHsKLSAgICBfX2RvX2d1YXJkID0gZmFsc2U7Ci0gIH0KLQotcHJpdmF0ZToKLSAgX1N0cmVhbUJ1ZiAqX19wZnJvbTsKLSAgaW50X3R5cGUgX19jOwotICBib29sIF9fZG9fZ3VhcmQ7Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotYm9vbCBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4KLSAgOjpfTV9jb3B5X3VuYnVmZmVyZWQoYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fZnJvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fdG8pIHsKLSAgdHlwZWRlZiBfU1B1dEJhY2tDPF9DaGFyVCwgX1RyYWl0cz4gX1NQdXRCYWNrQ0d1YXJkOwotICBib29sIF9fYW55X2luc2VydGVkID0gZmFsc2U7Ci0gIGludF90eXBlIF9fYzsKLQotICBfU1RMUF9UUlkgewotICAgIF9TUHV0QmFja0NHdWFyZCBfX2NndWFyZChfX2Zyb20pOwotICAgIGZvciAoOzspIHsKLSAgICAgIF9TVExQX1RSWSB7Ci0gICAgICAgIF9fYyA9IF9fZnJvbS0+c2J1bXBjKCk7Ci0gICAgICB9Ci0gICAgICBfU1RMUF9DQVRDSF9BTEwgewotICAgICAgICB0aGlzLT5fTV9oYW5kbGVfZXhjZXB0aW9uKGlvc19iYXNlOjpmYWlsYml0KTsKLSAgICAgICAgcmV0dXJuIF9fYW55X2luc2VydGVkOwotICAgICAgfQotCi0gICAgICBpZiAoIHRoaXMtPl9TX2VvZihfX2MpICkKLSAgICAgICAgcmV0dXJuIF9fYW55X2luc2VydGVkOwotCi0gICAgICBfX2NndWFyZC5ndWFyZChfX2MpOwotICAgICAgaWYgKCB0aGlzLT5fU19lb2YoIF9fdG8tPnNwdXRjKF9UcmFpdHM6OnRvX2NoYXJfdHlwZShfX2MpKSApICkgewotICAgICAgICByZXR1cm4gX19hbnlfaW5zZXJ0ZWQ7Ci0gICAgICB9Ci0KLSAgICAgIF9fY2d1YXJkLnJlbGVhc2UoKTsKLSAgICAgIF9fYW55X2luc2VydGVkID0gdHJ1ZTsKLSAgICB9Ci0gIH0KLSAgX1NUTFBfQ0FUQ0hfQUxMIHsKLSAgICB0aGlzLT5fTV9oYW5kbGVfZXhjZXB0aW9uKGlvc19iYXNlOjpiYWRiaXQpOwotICAgIHJldHVybiBfX2FueV9pbnNlcnRlZDsKLSAgfQotfQotCi1fU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCi0KLS8vIEhlbHBlciBmdW5jdGlvbiBmb3IgbnVtZXJpYyBvdXRwdXQuCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfTnVtYmVyPgotYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiAgX1NUTFBfQ0FMTAotX19wdXRfbnVtKGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywgX051bWJlciBfX3gpIHsKLSAgdHlwZWRlZiB0eXBlbmFtZSBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OnNlbnRyeSBfU2VudHJ5OwotICBfU2VudHJ5IF9fc2VudHJ5KF9fb3MpOwotICBib29sIF9fZmFpbGVkID0gdHJ1ZTsKLQotICBpZiAoX19zZW50cnkpIHsKLSAgICBfU1RMUF9UUlkgewotICAgICAgdHlwZWRlZiBudW1fcHV0PF9DaGFyVCwgb3N0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQsIF9UcmFpdHM+ID4gX051bVB1dDsKLSAgICAgIF9fZmFpbGVkID0gKHVzZV9mYWNldDxfTnVtUHV0PihfX29zLmdldGxvYygpKSkucHV0KG9zdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJULCBfVHJhaXRzPihfX29zLnJkYnVmKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19vcywgX19vcy5maWxsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3gpLmZhaWxlZCgpOwotICAgIH0KLSAgICBfU1RMUF9DQVRDSF9BTEwgewotICAgICAgX19vcy5fTV9oYW5kbGVfZXhjZXB0aW9uKGlvc19iYXNlOjpiYWRiaXQpOwotICAgIH0KLSAgfQotICBpZiAoX19mYWlsZWQpCi0gICAgX19vcy5zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKLSAgcmV0dXJuIF9fb3M7Ci19Ci0KLV9TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQotCi0vKgotICogSW4gdGhlIGZvbGxvd2luZyBvcGVyYXRvcnMgd2UgdHJ5IHRvIGxpbWl0IGNvZGUgYmxvYXQgYnkgbGltaXRpbmcgdGhlCi0gKiBudW1iZXIgb2YgX19wdXRfbnVtIGluc3RhbmNpYXRpb25zLgotICovCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Om9wZXJhdG9yPDwoc2hvcnQgX194KSB7Ci0gIF9TVExQX1NUQVRJQ19BU1NFUlQoIHNpemVvZihzaG9ydCkgPD0gc2l6ZW9mKGxvbmcpICkKLSAgbG9uZyBfX3RtcCA9ICgodGhpcy0+ZmxhZ3MoKSAmIF9CYXNpY19pb3M6OmJhc2VmaWVsZCkgIT0gaW9zX2Jhc2U6OmRlYykgPwotICAgICAgICAgICAgICAgICAgX19TVEFUSUNfQ0FTVChsb25nLCBfX1NUQVRJQ19DQVNUKHVuc2lnbmVkIHNob3J0LCBfX3gpKTogX194OwotICByZXR1cm4gX1NUTFBfUFJJViBfX3B1dF9udW0oKnRoaXMsIF9fdG1wKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KLWJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpvcGVyYXRvcjw8KHVuc2lnbmVkIHNob3J0IF9feCkgewotICBfU1RMUF9TVEFUSUNfQVNTRVJUKCBzaXplb2YodW5zaWduZWQgc2hvcnQpIDw9IHNpemVvZih1bnNpZ25lZCBsb25nKSApCi0gIHJldHVybiBfU1RMUF9QUklWIF9fcHV0X251bSgqdGhpcywgX19TVEFUSUNfQ0FTVCh1bnNpZ25lZCBsb25nLF9feCkpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Om9wZXJhdG9yPDwoaW50IF9feCkgewotICBfU1RMUF9TVEFUSUNfQVNTRVJUKCBzaXplb2YoaW50KSA8PSBzaXplb2YobG9uZykgKQotICBsb25nIF9fdG1wID0gKCh0aGlzLT5mbGFncygpICYgX0Jhc2ljX2lvczo6YmFzZWZpZWxkKSAhPSBpb3NfYmFzZTo6ZGVjKSA/Ci0gICAgICAgICAgICAgICAgICBfX1NUQVRJQ19DQVNUKGxvbmcsIF9fU1RBVElDX0NBU1QodW5zaWduZWQgaW50LCBfX3gpKTogX194OwotICByZXR1cm4gX1NUTFBfUFJJViBfX3B1dF9udW0oKnRoaXMsIF9fdG1wKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KLSNpZiBkZWZpbmVkIChfV0lONjQpIHx8ICFkZWZpbmVkIChfU1RMUF9NU1ZDKSB8fCAoX1NUTFBfTVNWQyA8IDEzMDApCi1iYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6b3BlcmF0b3I8PCh1bnNpZ25lZCBpbnQgX194KSB7Ci0gIF9TVExQX1NUQVRJQ19BU1NFUlQoIHNpemVvZih1bnNpZ25lZCBpbnQpIDw9IHNpemVvZih1bnNpZ25lZCBsb25nKSApCi0jZWxzZQotLyogV2UgZGVmaW5lIHRoaXMgb3BlcmF0b3Igd2l0aCBzaXplX3QgcmF0aGVyIHRoYW4gdW5zaWduZWQgaW50IHRvIGF2b2lkCi0gKiA2NCBiaXRzIHdhcm5pbmcuCi0gKi8KLWJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpvcGVyYXRvcjw8KHNpemVfdCBfX3gpIHsKLSAgX1NUTFBfU1RBVElDX0FTU0VSVCggc2l6ZW9mKHNpemVfdCkgPD0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICkKLSNlbmRpZgotICByZXR1cm4gX1NUTFBfUFJJViBfX3B1dF9udW0oKnRoaXMsICBfX1NUQVRJQ19DQVNUKHVuc2lnbmVkIGxvbmcsX194KSk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Ci1iYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6b3BlcmF0b3I8PChsb25nIF9feCkKLXsgcmV0dXJuIF9TVExQX1BSSVYgX19wdXRfbnVtKCp0aGlzLCAgX194KTsgfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Om9wZXJhdG9yPDwodW5zaWduZWQgbG9uZyBfX3gpCi17IHJldHVybiBfU1RMUF9QUklWIF9fcHV0X251bSgqdGhpcywgIF9feCk7IH0KLQotI2lmZGVmIF9TVExQX0xPTkdfTE9ORwotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KLWJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpvcGVyYXRvcjw8IChfU1RMUF9MT05HX0xPTkcgX194KQoteyByZXR1cm4gX1NUTFBfUFJJViBfX3B1dF9udW0oKnRoaXMsICBfX3gpOyB9Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Ci1iYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6b3BlcmF0b3I8PCAodW5zaWduZWQgX1NUTFBfTE9OR19MT05HIF9feCkKLXsgcmV0dXJuIF9TVExQX1BSSVYgX19wdXRfbnVtKCp0aGlzLCAgX194KTsgfQotI2VuZGlmCi0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Ci1iYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6b3BlcmF0b3I8PChmbG9hdCBfX3gpCi17IHJldHVybiBfU1RMUF9QUklWIF9fcHV0X251bSgqdGhpcywgIF9fU1RBVElDX0NBU1QoZG91YmxlLF9feCkpOyB9Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Ci1iYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6b3BlcmF0b3I8PChkb3VibGUgX194KQoteyByZXR1cm4gX1NUTFBfUFJJViBfX3B1dF9udW0oKnRoaXMsICBfX3gpOyB9Ci0KLSNpZm5kZWYgX1NUTFBfTk9fTE9OR19ET1VCTEUKLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Ci1iYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6b3BlcmF0b3I8PChsb25nIGRvdWJsZSBfX3gpCi17IHJldHVybiBfU1RMUF9QUklWIF9fcHV0X251bSgqdGhpcywgIF9feCk7IH0KLSNlbmRpZgotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Om9wZXJhdG9yPDwoY29uc3Qgdm9pZCogX194KQoteyByZXR1cm4gX1NUTFBfUFJJViBfX3B1dF9udW0oKnRoaXMsICBfX3gpOyB9Ci0KLSNpZm5kZWYgX1NUTFBfTk9fQk9PTAotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KLWJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpvcGVyYXRvcjw8KGJvb2wgX194KQoteyByZXR1cm4gX1NUTFBfUFJJViBfX3B1dF9udW0oKnRoaXMsICBfX3gpOyB9Ci0jZW5kaWYKLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KLXZvaWQgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpfTV9wdXRfY2hhcihfQ2hhclQgX19jKSB7Ci0gIHNlbnRyeSBfX3NlbnRyeSgqdGhpcyk7Ci0gIGlmIChfX3NlbnRyeSkgewotICAgIGJvb2wgX19mYWlsZWQgPSB0cnVlOwotICAgIF9TVExQX1RSWSB7Ci0gICAgICBzdHJlYW1zaXplIF9fbnBhZCA9IHRoaXMtPndpZHRoKCkgPiAwID8gdGhpcy0+d2lkdGgoKSAtIDEgOiAwOwotICAgICAgLy8gICAgICBpZiAoX19ucGFkIDw9IDEpCi0gICAgICBpZiAoX19ucGFkID09IDApCi0gICAgICAgIF9fZmFpbGVkID0gdGhpcy0+X1NfZW9mKHRoaXMtPnJkYnVmKCktPnNwdXRjKF9fYykpOwotICAgICAgZWxzZSBpZiAoKHRoaXMtPmZsYWdzKCkgJiBpb3NfYmFzZTo6YWRqdXN0ZmllbGQpID09IGlvc19iYXNlOjpsZWZ0KSB7Ci0gICAgICAgIF9fZmFpbGVkID0gdGhpcy0+X1NfZW9mKHRoaXMtPnJkYnVmKCktPnNwdXRjKF9fYykpOwotICAgICAgICBfX2ZhaWxlZCA9IF9fZmFpbGVkIHx8Ci0gICAgICAgICAgICAgICAgICAgdGhpcy0+cmRidWYoKS0+X01fc3B1dG5jKHRoaXMtPmZpbGwoKSwgX19ucGFkKSAhPSBfX25wYWQ7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgX19mYWlsZWQgPSB0aGlzLT5yZGJ1ZigpLT5fTV9zcHV0bmModGhpcy0+ZmlsbCgpLCBfX25wYWQpICE9IF9fbnBhZDsKLSAgICAgICAgX19mYWlsZWQgPSBfX2ZhaWxlZCB8fCB0aGlzLT5fU19lb2YodGhpcy0+cmRidWYoKS0+c3B1dGMoX19jKSk7Ci0gICAgICB9Ci0KLSAgICAgIHRoaXMtPndpZHRoKDApOwotICAgIH0KLSAgICBfU1RMUF9DQVRDSF9BTEwgewotICAgICAgdGhpcy0+X01faGFuZGxlX2V4Y2VwdGlvbihpb3NfYmFzZTo6YmFkYml0KTsKLSAgICB9Ci0KLSAgICBpZiAoX19mYWlsZWQpCi0gICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKLSAgfQotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotdm9pZCBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Ol9NX3B1dF9ub3dpZGVuKGNvbnN0IF9DaGFyVCogX19zKSB7Ci0gIHNlbnRyeSBfX3NlbnRyeSgqdGhpcyk7Ci0gIGlmIChfX3NlbnRyeSkgewotICAgIGJvb2wgX19mYWlsZWQgPSB0cnVlOwotICAgIHN0cmVhbXNpemUgX19uID0gX1RyYWl0czo6bGVuZ3RoKF9fcyk7Ci0gICAgc3RyZWFtc2l6ZSBfX25wYWQgPSB0aGlzLT53aWR0aCgpID4gX19uID8gdGhpcy0+d2lkdGgoKSAtIF9fbiA6IDA7Ci0KLSAgICBfU1RMUF9UUlkgewotICAgICAgaWYgKF9fbnBhZCA9PSAwKQotICAgICAgICBfX2ZhaWxlZCA9IHRoaXMtPnJkYnVmKCktPnNwdXRuKF9fcywgX19uKSAhPSBfX247Ci0gICAgICBlbHNlIGlmICgodGhpcy0+ZmxhZ3MoKSAmIGlvc19iYXNlOjphZGp1c3RmaWVsZCkgPT0gaW9zX2Jhc2U6OmxlZnQpIHsKLSAgICAgICAgX19mYWlsZWQgPSB0aGlzLT5yZGJ1ZigpLT5zcHV0bihfX3MsIF9fbikgIT0gX19uOwotICAgICAgICBfX2ZhaWxlZCA9IF9fZmFpbGVkIHx8Ci0gICAgICAgICAgICAgICAgICAgdGhpcy0+cmRidWYoKS0+X01fc3B1dG5jKHRoaXMtPmZpbGwoKSwgX19ucGFkKSAhPSBfX25wYWQ7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgX19mYWlsZWQgPSB0aGlzLT5yZGJ1ZigpLT5fTV9zcHV0bmModGhpcy0+ZmlsbCgpLCBfX25wYWQpICE9IF9fbnBhZDsKLSAgICAgICAgX19mYWlsZWQgPSBfX2ZhaWxlZCB8fCB0aGlzLT5yZGJ1ZigpLT5zcHV0bihfX3MsIF9fbikgIT0gX19uOwotICAgICAgfQotCi0gICAgICB0aGlzLT53aWR0aCgwKTsKLSAgICB9Ci0gICAgX1NUTFBfQ0FUQ0hfQUxMIHsKLSAgICAgIHRoaXMtPl9NX2hhbmRsZV9leGNlcHRpb24oaW9zX2Jhc2U6OmJhZGJpdCk7Ci0gICAgfQotCi0gICAgaWYgKF9fZmFpbGVkKQotICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOwotICB9Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Ci12b2lkIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6X01fcHV0X3dpZGVuKGNvbnN0IGNoYXIqIF9fcykgewotICBzZW50cnkgX19zZW50cnkoKnRoaXMpOwotICBpZiAoX19zZW50cnkpIHsKLSAgICBib29sIF9fZmFpbGVkID0gdHJ1ZTsKLSAgICBzdHJlYW1zaXplIF9fbiA9IGNoYXJfdHJhaXRzPGNoYXI+OjpsZW5ndGgoX19zKTsKLSAgICBzdHJlYW1zaXplIF9fbnBhZCA9IHRoaXMtPndpZHRoKCkgPiBfX24gPyB0aGlzLT53aWR0aCgpIC0gX19uIDogMDsKLQotICAgIF9TVExQX1RSWSB7Ci0gICAgICBpZiAoX19ucGFkID09IDApCi0gICAgICAgIF9fZmFpbGVkID0gIXRoaXMtPl9NX3B1dF93aWRlbl9hdXgoX19zLCBfX24pOwotICAgICAgZWxzZSBpZiAoKHRoaXMtPmZsYWdzKCkgJiBpb3NfYmFzZTo6YWRqdXN0ZmllbGQpID09IGlvc19iYXNlOjpsZWZ0KSB7Ci0gICAgICAgIF9fZmFpbGVkID0gIXRoaXMtPl9NX3B1dF93aWRlbl9hdXgoX19zLCBfX24pOwotICAgICAgICBfX2ZhaWxlZCA9IF9fZmFpbGVkIHx8Ci0gICAgICAgICAgICAgICAgICAgdGhpcy0+cmRidWYoKS0+X01fc3B1dG5jKHRoaXMtPmZpbGwoKSwgX19ucGFkKSAhPSBfX25wYWQ7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgX19mYWlsZWQgPSB0aGlzLT5yZGJ1ZigpLT5fTV9zcHV0bmModGhpcy0+ZmlsbCgpLCBfX25wYWQpICE9IF9fbnBhZDsKLSAgICAgICAgX19mYWlsZWQgPSBfX2ZhaWxlZCB8fCAhdGhpcy0+X01fcHV0X3dpZGVuX2F1eChfX3MsIF9fbik7Ci0gICAgICB9Ci0KLSAgICAgIHRoaXMtPndpZHRoKDApOwotICAgIH0KLSAgICBfU1RMUF9DQVRDSF9BTEwgewotICAgICAgdGhpcy0+X01faGFuZGxlX2V4Y2VwdGlvbihpb3NfYmFzZTo6YmFkYml0KTsKLSAgICB9Ci0KLSAgICBpZiAoX19mYWlsZWQpCi0gICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7Ci0gIH0KLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KLWJvb2wgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpfTV9wdXRfd2lkZW5fYXV4KGNvbnN0IGNoYXIqIF9fcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbXNpemUgX19uKSB7Ci0gIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX2J1ZiA9IHRoaXMtPnJkYnVmKCk7Ci0KLSAgZm9yICggOyBfX24gPiAwIDsgLS1fX24pCi0gICAgaWYgKHRoaXMtPl9TX2VvZihfX2J1Zi0+c3B1dGModGhpcy0+d2lkZW4oKl9fcysrKSkpKQotICAgICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gVW5mb3JtYXR0ZWQgb3V0cHV0IG9mIGEgc2luZ2xlIGNoYXJhY3Rlci4KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Ci1iYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCi1iYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OnB1dChjaGFyX3R5cGUgX19jKSB7Ci0gIHNlbnRyeSBfX3NlbnRyeSgqdGhpcyk7Ci0gIGJvb2wgX19mYWlsZWQgPSB0cnVlOwotCi0gIGlmIChfX3NlbnRyeSkgewotICAgIF9TVExQX1RSWSB7Ci0gICAgICBfX2ZhaWxlZCA9IHRoaXMtPl9TX2VvZih0aGlzLT5yZGJ1ZigpLT5zcHV0YyhfX2MpKTsKLSAgICB9Ci0gICAgX1NUTFBfQ0FUQ0hfQUxMIHsKLSAgICAgIHRoaXMtPl9NX2hhbmRsZV9leGNlcHRpb24oaW9zX2Jhc2U6OmJhZGJpdCk7Ci0gICAgfQotICB9Ci0KLSAgaWYgKF9fZmFpbGVkKQotICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOwotCi0gIHJldHVybiAqdGhpczsKLX0KLQotLy8gVW5mb3JtYXR0ZWQgb3V0cHV0IG9mIGEgc2luZ2xlIGNoYXJhY3Rlci4KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Ci1iYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCi1iYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OndyaXRlKGNvbnN0IGNoYXJfdHlwZSogX19zLCBzdHJlYW1zaXplIF9fbikgewotICBzZW50cnkgX19zZW50cnkoKnRoaXMpOwotICBib29sIF9fZmFpbGVkID0gdHJ1ZTsKLQotICBpZiAoX19zZW50cnkpIHsKLSAgICBfU1RMUF9UUlkgewotICAgICAgX19mYWlsZWQgPSB0aGlzLT5yZGJ1ZigpLT5zcHV0bihfX3MsIF9fbikgIT0gX19uOwotICAgIH0KLSAgICBfU1RMUF9DQVRDSF9BTEwgewotICAgICAgdGhpcy0+X01faGFuZGxlX2V4Y2VwdGlvbihpb3NfYmFzZTo6YmFkYml0KTsKLSAgICB9Ci0gIH0KLQotICBpZiAoX19mYWlsZWQpCi0gICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7Ci0KLSAgcmV0dXJuICp0aGlzOwotfQotCi1fU1RMUF9FTkRfTkFNRVNQQUNFCi0KLSNlbmRpZiAvKiBfU1RMUF9PU1RSRUFNX0MgKi8KLQotLy8gTG9jYWwgVmFyaWFibGVzOgotLy8gbW9kZTpDKysKLS8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9fb3N0cmVhbS5oIGIvc3RsL19vc3RyZWFtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNGMzNjQuLjAwMDAwMDAKLS0tIGEvc3RsL19vc3RyZWFtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzODcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLQotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX09TVFJFQU1fSAotI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9PU1RSRUFNX0gKLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9JT1NfSAotIyAgaW5jbHVkZSA8c3RsL19pb3MuaD4gICAgICAgICAgICAgICAgICAvLyBGb3IgYmFzaWNfaW9zPD4uICBJbmNsdWRlcyA8aW9zZndkPi4KLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX09TVFJFQU1CVUZfSVRFUkFUT1JfSAotIyAgaW5jbHVkZSA8c3RsL19vc3RyZWFtYnVmX2l0ZXJhdG9yLmg+Ci0jZW5kaWYKLQotI2lmICFkZWZpbmVkIChfU1RMUF9OT19VTkNBVUdIVF9FWENFUFRfU1VQUE9SVCkgJiYgIWRlZmluZWQgKF9TVExQX0lOVEVSTkFMX0VYQ0VQVElPTikKLSMgIGluY2x1ZGUgPHN0bC9fZXhjZXB0aW9uLmg+Ci0jZW5kaWYKLQotX1NUTFBfQkVHSU5fTkFNRVNQQUNFCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUKQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KLWNsYXNzIF9Pc2VudHJ5OwotI2VuZGlmCi0KLV9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KLWJvb2wgX19pbml0X2Jvc3RyKGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19zdHIpOwotCi1fU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBjbGFzcyBiYXNpY19vc3RyZWFtPD4KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KLWNsYXNzIGJhc2ljX29zdHJlYW0gOiB2aXJ0dWFsIHB1YmxpYyBiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPiB7Ci0gIHR5cGVkZWYgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+IF9TZWxmOwotCi0jaWYgZGVmaW5lZCAoX1NUTFBfTVNWQykgJiYgKF9TVExQX01TVkMgPj0gMTMwMCAmJiBfU1RMUF9NU1ZDIDw9IDEzMTApCi0gIC8vZXhwbGljaXRlbHkgZGVmaW5lZCBhcyBwcml2YXRlIHRvIGF2b2lkIHdhcm5pbmdzOgotICBiYXNpY19vc3RyZWFtKF9TZWxmIGNvbnN0Jik7Ci0gIF9TZWxmJiBvcGVyYXRvciA9IChfU2VsZiBjb25zdCYpOwotI2VuZGlmCi0KLXB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHlwZXMKLSAgdHlwZWRlZiBfQ2hhclQgICAgICAgICAgICAgICAgICAgICBjaGFyX3R5cGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6aW50X3R5cGUgaW50X3R5cGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6cG9zX3R5cGUgcG9zX3R5cGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6b2ZmX3R5cGUgb2ZmX3R5cGU7Ci0gIHR5cGVkZWYgX1RyYWl0cyAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3R5cGU7Ci0gIHR5cGVkZWYgYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz4gX0Jhc2ljX2lvczsKLQotcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3Rvci4KLSAgZXhwbGljaXQgYmFzaWNfb3N0cmVhbShiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19idWYpOwotICB+YmFzaWNfb3N0cmVhbSgpOwotCi1wdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhvb2tzIGZvciBtYW5pcHVsYXRvcnMuCi0gIHR5cGVkZWYgYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz4mIChfU1RMUF9DQUxMICpfX2lvc19mbikoYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz4mKTsKLSAgdHlwZWRlZiBpb3NfYmFzZSYgKF9TVExQX0NBTEwgKl9faW9zX2Jhc2VfZm4pKGlvc19iYXNlJik7Ci0gIHR5cGVkZWYgX1NlbGYmIChfU1RMUF9DQUxMICpfX29zdHJlYW1fZm4pKF9TZWxmJik7Ci0gIF9TZWxmJiBvcGVyYXRvcjw8IChfX29zdHJlYW1fZm4gX19mKSB7IHJldHVybiBfX2YoKnRoaXMpOyB9Ci0gIF9TZWxmICYgb3BlcmF0b3I8PCAoX19pb3NfYmFzZV9mbiBfX2YpIHsgX19mKCp0aGlzKTsgcmV0dXJuICp0aGlzOyB9Ci0gIF9TZWxmJiBvcGVyYXRvcjw8IChfX2lvc19mbiBfX2ZmKSB7IF9fZmYoKnRoaXMpOyByZXR1cm4gKnRoaXM7IH0KLQotcHJpdmF0ZToKLSAgYm9vbCBfTV9jb3B5X2J1ZmZlcmVkKGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX2Zyb20sCi0gICAgICAgICAgICAgICAgICAgICAgICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX190byk7Ci0gIGJvb2wgX01fY29weV91bmJ1ZmZlcmVkKGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX2Zyb20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX3RvKTsKLQotcHVibGljOgotICB2b2lkIF9NX3B1dF9jaGFyKF9DaGFyVCBfX2MpOwotCi0gIHZvaWQgX01fcHV0X25vd2lkZW4oY29uc3QgX0NoYXJUKiBfX3MpOwotICB2b2lkIF9NX3B1dF93aWRlbihjb25zdCBjaGFyKiBfX3MpOwotICBib29sIF9NX3B1dF93aWRlbl9hdXgoY29uc3QgY2hhciogX19zLCBzdHJlYW1zaXplIF9fbik7Ci0KLXB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gVW5mb3JtYXR0ZWQgb3V0cHV0LgotICBfU2VsZiYgcHV0KGNoYXJfdHlwZSBfX2MpOwotICBfU2VsZiYgd3JpdGUoY29uc3QgY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uKTsKLQotcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3JtYXR0ZWQgb3V0cHV0LgotICAvLyBGb3JtYXR0ZWQgb3V0cHV0IGZyb20gYSBzdHJlYW1idWYuCi0gIF9TZWxmJiBvcGVyYXRvcjw8KGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX2J1Zik7Ci0jIGlmbmRlZiBfU1RMUF9OT19GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIKLSAgLy8gdGhpcyBpcyBuZWVkZWQgZm9yIGNvbXBpbGluZyB3aXRoIG9wdGlvbiBjaGFyID0gdW5zaWduZWQKLSAgX1NlbGYmIG9wZXJhdG9yPDwodW5zaWduZWQgY2hhciBfX3gpIHsgX01fcHV0X2NoYXIoX194KTsgcmV0dXJuICp0aGlzOyB9Ci0jIGVuZGlmCi0gIF9TZWxmJiBvcGVyYXRvcjw8KHNob3J0IF9feCk7Ci0gIF9TZWxmJiBvcGVyYXRvcjw8KHVuc2lnbmVkIHNob3J0IF9feCk7Ci0gIF9TZWxmJiBvcGVyYXRvcjw8KGludCBfX3gpOwotI2lmIGRlZmluZWQgKF9XSU42NCkgfHwgIWRlZmluZWQgKF9TVExQX01TVkMpIHx8IChfU1RMUF9NU1ZDIDwgMTMwMCkKLSAgX1NlbGYmIG9wZXJhdG9yPDwodW5zaWduZWQgaW50IF9feCk7Ci0jZWxzZQotLyogV2UgZGVmaW5lIHRoaXMgb3BlcmF0b3Igd2l0aCBzaXplX3QgcmF0aGVyIHRoYW4gdW5zaWduZWQgaW50IHRvIGF2b2lkCi0gKiA2NCBiaXRzIHdhcm5pbmcuCi0gKi8KLSAgX1NlbGYmIG9wZXJhdG9yPDwoc2l6ZV90IF9feCk7Ci0jZW5kaWYKLSAgX1NlbGYmIG9wZXJhdG9yPDwobG9uZyBfX3gpOwotICBfU2VsZiYgb3BlcmF0b3I8PCh1bnNpZ25lZCBsb25nIF9feCk7Ci0jaWZkZWYgX1NUTFBfTE9OR19MT05HCi0gIF9TZWxmJiBvcGVyYXRvcjw8IChfU1RMUF9MT05HX0xPTkcgX194KTsKLSAgX1NlbGYmIG9wZXJhdG9yPDwgKHVuc2lnbmVkIF9TVExQX0xPTkdfTE9ORyBfX3gpOwotI2VuZGlmCi0gIF9TZWxmJiBvcGVyYXRvcjw8KGZsb2F0IF9feCk7Ci0gIF9TZWxmJiBvcGVyYXRvcjw8KGRvdWJsZSBfX3gpOwotIyBpZm5kZWYgX1NUTFBfTk9fTE9OR19ET1VCTEUKLSAgX1NlbGYmIG9wZXJhdG9yPDwobG9uZyBkb3VibGUgX194KTsKLSMgZW5kaWYKLSAgX1NlbGYmIG9wZXJhdG9yPDwoY29uc3Qgdm9pZCogX194KTsKLSMgaWZuZGVmIF9TVExQX05PX0JPT0wKLSAgX1NlbGYmIG9wZXJhdG9yPDwoYm9vbCBfX3gpOwotIyBlbmRpZgotCi1wdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJ1ZmZlciBwb3NpdGlvbmluZyBhbmQgbWFuaXB1bGF0aW9uLgotICBfU2VsZiYgZmx1c2goKSB7Ci0gICAgaWYgKHRoaXMtPnJkYnVmKCkpCi0gICAgICBpZiAodGhpcy0+cmRidWYoKS0+cHVic3luYygpID09IC0xKQotICAgICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBwb3NfdHlwZSB0ZWxscCgpIHsKLSAgICByZXR1cm4gdGhpcy0+cmRidWYoKSAmJiAhdGhpcy0+ZmFpbCgpCi0gICAgICA/IHRoaXMtPnJkYnVmKCktPnB1YnNlZWtvZmYoMCwgaW9zX2Jhc2U6OmN1ciwgaW9zX2Jhc2U6Om91dCkKLSAgICAgIDogcG9zX3R5cGUoLTEpOwotICB9Ci0KLSAgX1NlbGYmIHNlZWtwKHBvc190eXBlIF9fcG9zKSB7Ci0gICAgaWYgKHRoaXMtPnJkYnVmKCkgJiYgIXRoaXMtPmZhaWwoKSkgewotICAgICAgaWYgKHRoaXMtPnJkYnVmKCktPnB1YnNlZWtwb3MoX19wb3MpID09IHBvc190eXBlKC0xKSkgewotICAgICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIF9TZWxmJiBzZWVrcChvZmZfdHlwZSBfX29mZiwgaW9zX2Jhc2U6OnNlZWtkaXIgX19kaXIpIHsKLSAgICBpZiAodGhpcy0+cmRidWYoKSAmJiAhdGhpcy0+ZmFpbCgpKQotICAgICAgdGhpcy0+cmRidWYoKS0+cHVic2Vla29mZihfX29mZiwgX19kaXIpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCkKLSAgLy8gSWYgd2UgYXJlIHVzaW5nIERMTCBzcGVjcywgd2UgaGF2ZSBub3QgdG8gdXNlIGlubmVyIGNsYXNzZXMKLSAgLy8gZW5kIGNsYXNzIGRlY2xhcmF0aW9uIGhlcmUKLSAgdHlwZWRlZiBfT3NlbnRyeTxfQ2hhclQsIF9UcmFpdHM+ICBzZW50cnk7Ci19OwotIyAgZGVmaW5lIHNlbnRyeSBfT3NlbnRyeQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotICBjbGFzcyBfT3NlbnRyeSB7Ci0gICAgdHlwZWRlZiBfT3NlbnRyeTxfQ2hhclQsIF9UcmFpdHM+IF9TZWxmOwotI2Vsc2UKLSAgICBjbGFzcyBzZW50cnkgewotICAgICAgdHlwZWRlZiBzZW50cnkgX1NlbGY7Ci0jZW5kaWYKLSAgICBwcml2YXRlOgotICAgICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfTV9zdHI7Ci0gICAgICAvLyAgICAgIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfTV9idWY7Ci0gICAgICBib29sIF9NX29rOwotICAgIHB1YmxpYzoKLSAgICAgIGV4cGxpY2l0IHNlbnRyeShiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fc3RyKQotICAgICAgICA6IF9NX3N0cihfX3N0ciksIC8qIF9NX2J1ZihfX3N0ci5yZGJ1ZigpKSwgKi8gX01fb2soX1NUTFBfUFJJViBfX2luaXRfYm9zdHIoX19zdHIpKQotICAgICAge30KLQotICAgICAgfnNlbnRyeSgpIHsKLSAgICAgICAgaWYgKF9NX3N0ci5mbGFncygpICYgaW9zX2Jhc2U6OnVuaXRidWYpCi0jaWYgIWRlZmluZWQgKF9TVExQX05PX1VOQ0FVR0hUX0VYQ0VQVF9TVVBQT1JUKQotICAgICAgICAgIGlmICghdW5jYXVnaHRfZXhjZXB0aW9uKCkpCi0jZW5kaWYKLSAgICAgICAgICAgIF9NX3N0ci5mbHVzaCgpOwotICAgICAgfQotCi0gICAgICBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gX01fb2s7IH0KLSAgICBwcml2YXRlOiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERpc2FibGUgYXNzaWdubWVudCBhbmQgY29weSBjb25zdHJ1Y3Rvci4KLSAgICAgIC8vSW1wbGVtZW50YXRpb24gaXMgaGVyZSBvbmx5IHRvIGF2b2lkIHdhcm5pbmcgd2l0aCBzb21lIGNvbXBpbGVycy4KLSAgICAgIHNlbnRyeShjb25zdCBfU2VsZiYgX19zKSA6IF9NX3N0cihfX3MuX01fc3RyKSB7fQotICAgICAgX1NlbGYmIG9wZXJhdG9yPShjb25zdCBfU2VsZiYpIHsgcmV0dXJuICp0aGlzOyB9Ci0gICAgfTsKLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUKQotIyAgdW5kZWYgc2VudHJ5Ci0jZWxzZQotICAvLyBjbG9zZSBiYXNpY19vc3RyZWFtIGNsYXNzIGRlZmluaXRpb24gaGVyZQotfTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCkKLV9TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBiYXNpY19vc3RyZWFtPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID47Ci1fU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgX09zZW50cnk8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPjsKLSMgIGlmICFkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQotX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIGJhc2ljX29zdHJlYW08d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPjsKLV9TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBfT3NlbnRyeTx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+OwotIyAgZW5kaWYKLSNlbmRpZiAvKiBfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUICovCi0KLV9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKLQotLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgaXN0cmVhbTw+OjpzZW50cnkgY29uc3RydWN0b3IuCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotYm9vbCBfX2luaXRfYm9zdHIoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX3N0cikgewotICBpZiAoX19zdHIuZ29vZCgpKSB7Ci0gICAgLy8gYm9yaXMgOiBjaGVjayBpZiB0aGlzIGlzIG5lZWRlZCAhCi0gICAgaWYgKCFfX3N0ci5yZGJ1ZigpKQotICAgICAgX19zdHIuc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7Ci0gICAgaWYgKF9fc3RyLnRpZSgpKQotICAgICAgX19zdHIudGllKCktPmZsdXNoKCk7Ci0gICAgcmV0dXJuIF9fc3RyLmdvb2QoKTsKLSAgfQotICBlbHNlCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotaW5saW5lIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfU1RMUF9DQUxMCi1fX2dldF9vc3RyZWFtYnVmKGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19TdCkKLXsgcmV0dXJuIF9fU3QucmRidWYoKTsgfQotCi1fU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKLQotLy8gTm9uLW1lbWJlciBmdW5jdGlvbnMuCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotaW5saW5lIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX1NUTFBfQ0FMTAotb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsIF9DaGFyVCBfX2MpewotICBfX29zLl9NX3B1dF9jaGFyKF9fYyk7Ci0gIHJldHVybiBfX29zOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotaW5saW5lIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX1NUTFBfQ0FMTAotb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsIGNvbnN0IF9DaGFyVCogX19zKSB7Ci0gIF9fb3MuX01fcHV0X25vd2lkZW4oX19zKTsKLSAgcmV0dXJuIF9fb3M7Ci19Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9OT19GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIpCi0vLyBzb21lIHNwZWNpYWxpemF0aW9ucwotCi1pbmxpbmUgYmFzaWNfb3N0cmVhbTxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+JiBfU1RMUF9DQUxMCi1vcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiYgX19vcywgY2hhciBfX2MpIHsKLSAgX19vcy5fTV9wdXRfY2hhcihfX2MpOwotICByZXR1cm4gX19vczsKLX0KLQotaW5saW5lIGJhc2ljX29zdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiYgX1NUTFBfQ0FMTAotb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4mIF9fb3MsIHNpZ25lZCBjaGFyIF9fYykgewotICBfX29zLl9NX3B1dF9jaGFyKF9fYyk7Ci0gIHJldHVybiBfX29zOwotfQotCi1pbmxpbmUgYmFzaWNfb3N0cmVhbTxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+JiBfU1RMUF9DQUxMCi1vcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiYgX19vcywgdW5zaWduZWQgY2hhciBfX2MpIHsKLSAgX19vcy5fTV9wdXRfY2hhcihfX2MpOwotICByZXR1cm4gX19vczsKLX0KLQotaW5saW5lIGJhc2ljX29zdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiYgX1NUTFBfQ0FMTAotb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4mIF9fb3MsIGNvbnN0IGNoYXIqIF9fcykgewotICBfX29zLl9NX3B1dF9ub3dpZGVuKF9fcyk7Ci0gIHJldHVybiBfX29zOwotfQotCi1pbmxpbmUgYmFzaWNfb3N0cmVhbTxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+JiBfU1RMUF9DQUxMCi1vcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiYgX19vcywgY29uc3Qgc2lnbmVkIGNoYXIqIF9fcykgewotICBfX29zLl9NX3B1dF9ub3dpZGVuKF9fUkVJTlRFUlBSRVRfQ0FTVChjb25zdCBjaGFyKixfX3MpKTsKLSAgcmV0dXJuIF9fb3M7Ci19Ci0KLWlubGluZSBiYXNpY19vc3RyZWFtPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4mCi1vcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiYgX19vcywgY29uc3QgdW5zaWduZWQgY2hhciogX19zKSB7Ci0gIF9fb3MuX01fcHV0X25vd2lkZW4oX19SRUlOVEVSUFJFVF9DQVNUKGNvbnN0IGNoYXIqLF9fcykpOwotICByZXR1cm4gX19vczsKLX0KLQotI2Vsc2UKLQotLy8gYWxzbyBmb3IgY29tcGlsZXJzIHdobyBtaWdodCB1c2UgdGhhdAotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KLWlubGluZSBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9TVExQX0NBTEwKLW9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLCBjaGFyIF9fYykgewotICBfX29zLl9NX3B1dF9jaGFyKF9fb3Mud2lkZW4oX19jKSk7Ci0gIHJldHVybiBfX29zOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RyYWl0cz4KLWlubGluZSBiYXNpY19vc3RyZWFtPGNoYXIsIF9UcmFpdHM+JiBfU1RMUF9DQUxMCi1vcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08Y2hhciwgX1RyYWl0cz4mIF9fb3MsIGNoYXIgX19jKSB7Ci0gIF9fb3MuX01fcHV0X2NoYXIoX19jKTsKLSAgcmV0dXJuIF9fb3M7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHJhaXRzPgotaW5saW5lIGJhc2ljX29zdHJlYW08Y2hhciwgX1RyYWl0cz4mIF9TVExQX0NBTEwKLW9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxjaGFyLCBfVHJhaXRzPiYgX19vcywgc2lnbmVkIGNoYXIgX19jKSB7Ci0gIF9fb3MuX01fcHV0X2NoYXIoX19jKTsKLSAgcmV0dXJuIF9fb3M7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHJhaXRzPgotaW5saW5lIGJhc2ljX29zdHJlYW08Y2hhciwgX1RyYWl0cz4mIF9TVExQX0NBTEwKLW9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxjaGFyLCBfVHJhaXRzPiYgX19vcywgdW5zaWduZWQgY2hhciBfX2MpIHsKLSAgX19vcy5fTV9wdXRfY2hhcihfX2MpOwotICByZXR1cm4gX19vczsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KLWlubGluZSBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9TVExQX0NBTEwKLW9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLCBjb25zdCBjaGFyKiBfX3MpIHsKLSAgX19vcy5fTV9wdXRfd2lkZW4oX19zKTsKLSAgcmV0dXJuIF9fb3M7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHJhaXRzPgotaW5saW5lIGJhc2ljX29zdHJlYW08Y2hhciwgX1RyYWl0cz4mIF9TVExQX0NBTEwKLW9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxjaGFyLCBfVHJhaXRzPiYgX19vcywgY29uc3QgY2hhciogX19zKSB7Ci0gIF9fb3MuX01fcHV0X25vd2lkZW4oX19zKTsKLSAgcmV0dXJuIF9fb3M7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHJhaXRzPgotaW5saW5lIGJhc2ljX29zdHJlYW08Y2hhciwgX1RyYWl0cz4mIF9TVExQX0NBTEwKLW9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxjaGFyLCBfVHJhaXRzPiYgX19vcywgY29uc3Qgc2lnbmVkIGNoYXIqIF9fcykgewotICBfX29zLl9NX3B1dF9ub3dpZGVuKF9fUkVJTlRFUlBSRVRfQ0FTVChjb25zdCBjaGFyKixfX3MpKTsKLSAgcmV0dXJuIF9fb3M7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHJhaXRzPgotaW5saW5lIGJhc2ljX29zdHJlYW08Y2hhciwgX1RyYWl0cz4mCi1vcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08Y2hhciwgX1RyYWl0cz4mIF9fb3MsIGNvbnN0IHVuc2lnbmVkIGNoYXIqIF9fcykgewotICBfX29zLl9NX3B1dF9ub3dpZGVuKF9fUkVJTlRFUlBSRVRfQ0FTVChjb25zdCBjaGFyKixfX3MpKTsKLSAgcmV0dXJuIF9fb3M7Ci19Ci0jZW5kaWYgLyogX1NUTFBfTk9fRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSICovCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gYmFzaWNfb3N0cmVhbSBtYW5pcHVsYXRvcnMuCi0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Ci1pbmxpbmUgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfU1RMUF9DQUxMCi1lbmRsKGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcykgewotICBfX29zLnB1dChfX29zLndpZGVuKCdcbicpKTsKLSAgX19vcy5mbHVzaCgpOwotICByZXR1cm4gX19vczsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KLWlubGluZSBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9TVExQX0NBTEwKLWVuZHMoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zKSB7Ci0gIF9fb3MucHV0KF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQoX0NoYXJUKSk7Ci0gIHJldHVybiBfX29zOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotaW5saW5lIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX1NUTFBfQ0FMTAotZmx1c2goYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zKSB7Ci0gIF9fb3MuZmx1c2goKTsKLSAgcmV0dXJuIF9fb3M7Ci19Ci0KLV9TVExQX0VORF9OQU1FU1BBQ0UKLQotI2lmIGRlZmluZWQgKF9TVExQX0VYUE9TRV9TVFJFQU1fSU1QTEVNRU5UQVRJT04pICYmICFkZWZpbmVkIChfU1RMUF9MSU5LX1RJTUVfSU5TVEFOVElBVElPTikKLSMgIGluY2x1ZGUgPHN0bC9fb3N0cmVhbS5jPgotI2VuZGlmCi0KLSNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9PU1RSRUFNX0ggKi8KLQotLy8gTG9jYWwgVmFyaWFibGVzOgotLy8gbW9kZTpDKysKLS8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9fcGFpci5oIGIvc3RsL19wYWlyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MzFmZTAuLjAwMDAwMDAKLS0tIGEvc3RsL19wYWlyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTQKLSAqIEhld2xldHQtUGFja2FyZCBDb21wYW55Ci0gKgotICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKLSAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NwotICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogQm9yaXMgRm9taXRjaGV2Ci0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICovCi0KLQotLyogTk9URTogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgU1RMIGhlYWRlcnMuCi0gKiAgIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LgotICovCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfUEFJUl9ICi0jZGVmaW5lIF9TVExQX0lOVEVSTkFMX1BBSVJfSAotCi0jaWYgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikKLSMgIGluY2x1ZGUgPHN0bC90eXBlX3RyYWl0cy5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfTU9WRV9DT05TVFJVQ1RfRldLX0gKLSMgIGluY2x1ZGUgPHN0bC9fbW92ZV9jb25zdHJ1Y3RfZndrLmg+Ci0jZW5kaWYKLQotX1NUTFBfQkVHSU5fTkFNRVNQQUNFCi0KLXRlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KLXN0cnVjdCBwYWlyIHsKLSAgdHlwZWRlZiBfVDEgZmlyc3RfdHlwZTsKLSAgdHlwZWRlZiBfVDIgc2Vjb25kX3R5cGU7Ci0KLSAgX1QxIGZpcnN0OwotICBfVDIgc2Vjb25kOwotI2lmIGRlZmluZWQgKF9TVExQX0NPTlNUX0NPTlNUUlVDVE9SX0JVRykKLSAgcGFpcigpIHt9Ci0jZWxzZQotICBwYWlyKCkgOiBmaXJzdChfVDEoKSksIHNlY29uZChfVDIoKSkge30KLSNlbmRpZgotICBwYWlyKGNvbnN0IF9UMSYgX19hLCBjb25zdCBfVDImIF9fYikgOiBmaXJzdChfX2EpLCBzZWNvbmQoX19iKSB7fQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykgJiYgIShkZWZpbmVkIChfU1RMUF9NU1ZDKSAmJiAoX1NUTFBfTVNWQyA8IDEyMDApKQotICB0ZW1wbGF0ZSA8Y2xhc3MgX1UxLCBjbGFzcyBfVTI+Ci0gIHBhaXIoY29uc3QgcGFpcjxfVTEsIF9VMj4mIF9fcCkgOiBmaXJzdChfX3AuZmlyc3QpLCBzZWNvbmQoX19wLnNlY29uZCkge30KLQotICBwYWlyKGNvbnN0IHBhaXI8X1QxLF9UMj4mIF9fbykgOiBmaXJzdChfX28uZmlyc3QpLCBzZWNvbmQoX19vLnNlY29uZCkge30KLSNlbmRpZgotCi0gIHBhaXIoX19tb3ZlX3NvdXJjZTxwYWlyPF9UMSwgX1QyPiA+IHNyYykgOiBmaXJzdChfU1RMUF9QUklWIF9Bc01vdmVTb3VyY2Uoc3JjLmdldCgpLmZpcnN0KSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmQoX1NUTFBfUFJJViBfQXNNb3ZlU291cmNlKHNyYy5nZXQoKS5zZWNvbmQpKQotICB7fQotCi0gIF9fVFJJVklBTF9ERVNUUlVDVE9SKHBhaXIpCi19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+Ci1pbmxpbmUgYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yPT0oY29uc3QgcGFpcjxfVDEsIF9UMj4mIF9feCwgY29uc3QgcGFpcjxfVDEsIF9UMj4mIF9feSkKLXsgcmV0dXJuIF9feC5maXJzdCA9PSBfX3kuZmlyc3QgJiYgX194LnNlY29uZCA9PSBfX3kuc2Vjb25kOyB9Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KLWlubGluZSBib29sIF9TVExQX0NBTEwgb3BlcmF0b3I8KGNvbnN0IHBhaXI8X1QxLCBfVDI+JiBfX3gsIGNvbnN0IHBhaXI8X1QxLCBfVDI+JiBfX3kpIHsKLSAgcmV0dXJuIF9feC5maXJzdCA8IF9feS5maXJzdCB8fAotICAgICAgICAgKCEoX195LmZpcnN0IDwgX194LmZpcnN0KSAmJiBfX3guc2Vjb25kIDwgX195LnNlY29uZCk7Ci19Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfU0VQQVJBVEVfUkVMT1BTX05BTUVTUEFDRSkKLXRlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KLWlubGluZSBib29sIF9TVExQX0NBTEwgb3BlcmF0b3IhPShjb25zdCBwYWlyPF9UMSwgX1QyPiYgX194LCBjb25zdCBwYWlyPF9UMSwgX1QyPiYgX195KQoteyByZXR1cm4gIShfX3ggPT0gX195KTsgfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+Ci1pbmxpbmUgYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yPihjb25zdCBwYWlyPF9UMSwgX1QyPiYgX194LCBjb25zdCBwYWlyPF9UMSwgX1QyPiYgX195KQoteyByZXR1cm4gX195IDwgX194OyB9Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KLWlubGluZSBib29sIF9TVExQX0NBTEwgb3BlcmF0b3I8PShjb25zdCBwYWlyPF9UMSwgX1QyPiYgX194LCBjb25zdCBwYWlyPF9UMSwgX1QyPiYgX195KQoteyByZXR1cm4gIShfX3kgPCBfX3gpOyB9Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KLWlubGluZSBib29sIF9TVExQX0NBTEwgb3BlcmF0b3I+PShjb25zdCBwYWlyPF9UMSwgX1QyPiYgX194LCBjb25zdCBwYWlyPF9UMSwgX1QyPiYgX195KQoteyByZXR1cm4gIShfX3ggPCBfX3kpOyB9Ci0jZW5kaWYgLyogX1NUTFBfVVNFX1NFUEFSQVRFX1JFTE9QU19OQU1FU1BBQ0UgKi8KLQotI2lmIGRlZmluZWQgKF9TVExQX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUikgJiYgIWRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpCi10ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDIsIGludCBfU3o+Ci1pbmxpbmUgcGFpcjxfVDEsIF9UMiBjb25zdCo+IG1ha2VfcGFpcihfVDEgY29uc3QmIF9feCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9UMiBjb25zdCAoJl9feSlbX1N6XSkKLXsgcmV0dXJuIHBhaXI8X1QxLCBfVDIgY29uc3QqPihfX3gsIHN0YXRpY19jYXN0PF9UMiBjb25zdCo+KF9feSkpOyB9Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMiwgaW50IF9Tej4KLWlubGluZSBwYWlyPF9UMSBjb25zdCosIF9UMj4gbWFrZV9wYWlyKF9UMSBjb25zdCAoJl9feClbX1N6XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9UMiBjb25zdCYgX195KQoteyByZXR1cm4gcGFpcjxfVDEgY29uc3QqLCBfVDI+KHN0YXRpY19jYXN0PF9UMSBjb25zdCo+KF9feCksIF9feSk7IH0KLQotdGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyLCBpbnQgX1N6MSwgaW50IF9TejI+Ci1pbmxpbmUgcGFpcjxfVDEgY29uc3QqLCBfVDIgY29uc3QqPiBtYWtlX3BhaXIoX1QxIGNvbnN0ICgmX194KVtfU3oxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVDIgY29uc3QgKCZfX3kpW19TejJdKSB7Ci0gIHJldHVybiBwYWlyPF9UMSBjb25zdCosIF9UMiBjb25zdCo+KHN0YXRpY19jYXN0PF9UMSBjb25zdCo+KF9feCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PF9UMiBjb25zdCo+KF9feSkpOwotfQotI2VuZGlmCi0KLXRlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KLWlubGluZSBwYWlyPF9UMSwgX1QyPiBfU1RMUF9DQUxMIG1ha2VfcGFpcihfVDEgX194LCBfVDIgX195KQoteyByZXR1cm4gcGFpcjxfVDEsIF9UMj4oX194LCBfX3kpOyB9Ci0KLV9TVExQX0VORF9OQU1FU1BBQ0UKLQotI2lmIGRlZmluZWQgKF9TVExQX1VTRV9OQU1FU1BBQ0VTKSB8fCAhZGVmaW5lZCAoX1NUTFBfVVNFX1NFUEFSQVRFX1JFTE9QU19OQU1FU1BBQ0UpCi1fU1RMUF9CRUdJTl9SRUxPUFNfTkFNRVNQQUNFCi0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yIT0oY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KQoteyByZXR1cm4gIShfX3ggPT0gX195KTsgfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotaW5saW5lIGJvb2wgX1NUTFBfQ0FMTCBvcGVyYXRvcj4oY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KQoteyByZXR1cm4gX195IDwgX194OyB9Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yPD0oY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KQoteyByZXR1cm4gIShfX3kgPCBfX3gpOyB9Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgYm9vbCBfU1RMUF9DQUxMICBvcGVyYXRvcj49KGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkKLXsgcmV0dXJuICEoX194IDwgX195KTsgfQotCi1fU1RMUF9FTkRfUkVMT1BTX05BTUVTUEFDRQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQotX1NUTFBfQkVHSU5fTkFNRVNQQUNFCi0KLXRlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KLXN0cnVjdCBfX3R5cGVfdHJhaXRzPHBhaXI8X1QxLCBfVDI+ID4gewotICB0eXBlZGVmIF9fdHlwZV90cmFpdHM8X1QxPiBfVDFUcmFpdHM7Ci0gIHR5cGVkZWYgX190eXBlX3RyYWl0czxfVDI+IF9UMlRyYWl0czsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfTGFuZDI8dHlwZW5hbWUgX1QxVHJhaXRzOjpoYXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfVDJUcmFpdHM6Omhhc190cml2aWFsX2RlZmF1bHRfY29uc3RydWN0b3I+OjpfUmV0IGhhc190cml2aWFsX2RlZmF1bHRfY29uc3RydWN0b3I7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0xhbmQyPHR5cGVuYW1lIF9UMVRyYWl0czo6aGFzX3RyaXZpYWxfY29weV9jb25zdHJ1Y3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX1QyVHJhaXRzOjpoYXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yPjo6X1JldCBoYXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yOwotICB0eXBlZGVmIHR5cGVuYW1lIF9MYW5kMjx0eXBlbmFtZSBfVDFUcmFpdHM6Omhhc190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9UMlRyYWl0czo6aGFzX3RyaXZpYWxfYXNzaWdubWVudF9vcGVyYXRvcj46Ol9SZXQgaGFzX3RyaXZpYWxfYXNzaWdubWVudF9vcGVyYXRvcjsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfTGFuZDI8dHlwZW5hbWUgX1QxVHJhaXRzOjpoYXNfdHJpdmlhbF9kZXN0cnVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfVDJUcmFpdHM6Omhhc190cml2aWFsX2Rlc3RydWN0b3I+OjpfUmV0IGhhc190cml2aWFsX2Rlc3RydWN0b3I7Ci0gIHR5cGVkZWYgX19mYWxzZV90eXBlIGlzX1BPRF90eXBlOwotCi0jaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKSAmJiAoX19CT1JMQU5EQ19fIDwgMHg1NjApCi0gIC8vIGRpc2FibGUgaW5jb3JyZWN0ICJkZXBlbmRlbnQgdHlwZSBxdWFsaWZpZXIiIGVycm9yCi0gIHR5cGVkZWYgX19mYWxzZV90eXBlIGltcGxlbWVudGVkOwotI2VuZGlmCi19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+Ci1zdHJ1Y3QgX19tb3ZlX3RyYWl0czxwYWlyPF9UMSwgX1QyPiA+Ci0gIDogX1NUTFBfUFJJViBfX21vdmVfdHJhaXRzX2hlbHAxPF9UMSwgX1QyPiB7fTsKLQotX1NUTFBfRU5EX05BTUVTUEFDRQotI2VuZGlmIC8qIF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04gKi8KLQotI2VuZGlmIC8qIF9TVExQX0lOVEVSTkFMX1BBSVJfSCAqLwotCi0vLyBMb2NhbCBWYXJpYWJsZXM6Ci0vLyBtb2RlOkMrKwotLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RsL19wdGhyZWFkX2FsbG9jLmggYi9zdGwvX3B0aHJlYWRfYWxsb2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgyNjE4NS4uMDAwMDAwMAotLS0gYS9zdGwvX3B0aHJlYWRfYWxsb2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ3MiArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NAotICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NwotICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk3Ci0gKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5Ci0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLQotI2lmbmRlZiBfU1RMUF9QVEhSRUFEX0FMTE9DX0gKLSNkZWZpbmUgX1NUTFBfUFRIUkVBRF9BTExPQ19ICi0KLS8qCi0gKiBQdGhyZWFkLXNwZWNpZmljIG5vZGUgYWxsb2NhdG9yLgotICogVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSBkZWZhdWx0IGFsbG9jYXRvciwgZXhjZXB0IHRoYXQgZnJlZS1saXN0Ci0gKiBpbmZvcm1hdGlvbiBpcyBrZXB0IHNlcGFyYXRlbHkgZm9yIGVhY2ggdGhyZWFkLCBhdm9pZGluZyBsb2NraW5nLgotICogVGhpcyBzaG91bGQgYmUgcmVhc29uYWJseSBmYXN0IGV2ZW4gaW4gdGhlIHByZXNlbmNlIG9mIHRocmVhZHMuCi0gKiBUaGUgZG93biBzaWRlIGlzIHRoYXQgc3RvcmFnZSBtYXkgbm90IGJlIHdlbGwtdXRpbGl6ZWQuCi0gKiBJdCBpcyBub3QgYW4gZXJyb3IgdG8gYWxsb2NhdGUgbWVtb3J5IGluIHRocmVhZCBBIGFuZCBkZWFsbG9jYXRlCi0gKiBpdCBpbiB0aHJlYWQgQi4gIEJ1dCB0aGlzIGVmZmVjdGl2ZWx5IHRyYW5zZmVycyBvd25lcnNoaXAgb2YgdGhlIG1lbW9yeSwKLSAqIHNvIHRoYXQgaXQgY2FuIG9ubHkgYmUgcmVhbGxvY2F0ZWQgYnkgdGhyZWFkIEIuICBUaHVzIHRoaXMgY2FuIGVmZmVjdGl2ZWx5Ci0gKiByZXN1bHQgaW4gYSBzdG9yYWdlIGxlYWsgaWYgaXQncyBkb25lIG9uIGEgcmVndWxhciBiYXNpcy4KLSAqIEl0IGNhbiBhbHNvIHJlc3VsdCBpbiBmcmVxdWVudCBzaGFyaW5nIG9mCi0gKiBjYWNoZSBsaW5lcyBhbW9uZyBwcm9jZXNzb3JzLCB3aXRoIHBvdGVudGlhbGx5IHNlcmlvdXMgcGVyZm9ybWFuY2UKLSAqIGNvbnNlcXVlbmNlcy4KLSAqLwotCi0jaWYgIWRlZmluZWQgKF9TVExQX1BUSFJFQURTKQotIyAgZXJyb3IgUE9TSVggc3BlY2lmaWMgYWxsb2NhdG9yIGltcGxlbWVudGF0aW9uLiBZb3VyIHN5c3RlbSBkbyBub3Qgc2VlbXMgdG8gXAotaGF2ZSB0aGlzIGludGVyZmFjZSBzbyBwbGVhc2UgY29tbWVudCB0aGUgX1NUTFBfVVNFX1BFUlRIUkVBRF9BTExPQyBtYWNybyBcCi1vciByZXBvcnQgdG8gdGhlIFNUTHBvcnQgZm9ydW0uCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9TVExQX1VTRV9OT19JT1NUUkVBTVMpCi0jICBlcnJvciBZb3UgY2Fubm90IHVzZSBwZXIgdGhyZWFkIGFsbG9jYXRvciBpbXBsZW1lbnRhdGlvbiB3aXRob3V0IGJ1aWxkaW5nIFwKLVNUTHBvcnQgbGlicmFyaWVzLgotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQUxMT0NfSAotIyAgaW5jbHVkZSA8c3RsL19hbGxvYy5oPgotI2VuZGlmCi0KLV9TVExQX0JFR0lOX05BTUVTUEFDRQotCi1fU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCi0KLXN0cnVjdCBfUHRocmVhZF9hbGxvY19wZXJfdGhyZWFkX3N0YXRlOwotCi0vLyBQdGhyZWFkLXNwZWNpZmljIGFsbG9jYXRvci4KLWNsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIF9QdGhyZWFkX2FsbG9jIHsKLXB1YmxpYzogLy8gYnV0IG9ubHkgZm9yIGludGVybmFsIHVzZToKLSAgdHlwZWRlZiBfUHRocmVhZF9hbGxvY19wZXJfdGhyZWFkX3N0YXRlIF9fc3RhdGVfdHlwZTsKLSAgdHlwZWRlZiBjaGFyIHZhbHVlX3R5cGU7Ci0KLXB1YmxpYzoKLSAgLy8gUmV0dXJuIGEgcmVjeWNsZWQgb3IgbmV3IHBlciB0aHJlYWQgc3RhdGUuCi0gIHN0YXRpYyBfX3N0YXRlX3R5cGUgKiBfU1RMUF9DQUxMIF9TX2dldF9wZXJfdGhyZWFkX3N0YXRlKCk7Ci0KLSAgLyogbiBtdXN0IGJlID4gMCAgICAgICovCi0gIHN0YXRpYyB2b2lkICogX1NUTFBfQ0FMTCBhbGxvY2F0ZShzaXplX3QmIF9fbik7Ci0KLSAgLyogcCBtYXkgbm90IGJlIDAgKi8KLSAgc3RhdGljIHZvaWQgX1NUTFBfQ0FMTCBkZWFsbG9jYXRlKHZvaWQgKl9fcCwgc2l6ZV90IF9fbik7Ci0KLSAgLy8gYm9yaXMgOiB2ZXJzaW9ucyBmb3IgcGVyX3RocmVhZF9hbGxvY2F0b3IKLSAgLyogbiBtdXN0IGJlID4gMCAgICAgICovCi0gIHN0YXRpYyB2b2lkICogX1NUTFBfQ0FMTCBhbGxvY2F0ZShzaXplX3QmIF9fbiwgX19zdGF0ZV90eXBlKiBfX2EpOwotCi0gIC8qIHAgbWF5IG5vdCBiZSAwICovCi0gIHN0YXRpYyB2b2lkIF9TVExQX0NBTEwgZGVhbGxvY2F0ZSh2b2lkICpfX3AsIHNpemVfdCBfX24sIF9fc3RhdGVfdHlwZSogX19hKTsKLQotICBzdGF0aWMgdm9pZCAqIF9TVExQX0NBTEwgcmVhbGxvY2F0ZSh2b2lkICpfX3AsIHNpemVfdCBfX29sZF9zeiwgc2l6ZV90JiBfX25ld19zeik7Ci19OwotCi1fU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKLQotdHlwZWRlZiBfU1RMUF9QUklWIF9QdGhyZWFkX2FsbG9jIF9fcHRocmVhZF9hbGxvYzsKLXR5cGVkZWYgX19wdGhyZWFkX2FsbG9jIHB0aHJlYWRfYWxsb2M7Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1jbGFzcyBwdGhyZWFkX2FsbG9jYXRvciA6IHB1YmxpYyBfX3N0bHBvcnRfY2xhc3M8cHRocmVhZF9hbGxvY2F0b3I8X1RwPiA+IHsKLSAgdHlwZWRlZiBwdGhyZWFkX2FsbG9jIF9TX0FsbG9jOyAgICAgICAgICAvLyBUaGUgdW5kZXJseWluZyBhbGxvY2F0b3IuCi1wdWJsaWM6Ci0gIHR5cGVkZWYgc2l6ZV90ICAgICBzaXplX3R5cGU7Ci0gIHR5cGVkZWYgcHRyZGlmZl90ICBkaWZmZXJlbmNlX3R5cGU7Ci0gIHR5cGVkZWYgX1RwKiAgICAgICBwb2ludGVyOwotICB0eXBlZGVmIGNvbnN0IF9UcCogY29uc3RfcG9pbnRlcjsKLSAgdHlwZWRlZiBfVHAmICAgICAgIHJlZmVyZW5jZTsKLSAgdHlwZWRlZiBjb25zdCBfVHAmIGNvbnN0X3JlZmVyZW5jZTsKLSAgdHlwZWRlZiBfVHAgICAgICAgIHZhbHVlX3R5cGU7Ci0KLSNpZmRlZiBfU1RMUF9NRU1CRVJfVEVNUExBVEVfQ0xBU1NFUwotICB0ZW1wbGF0ZSA8Y2xhc3MgX05ld1R5cGU+IHN0cnVjdCByZWJpbmQgewotICAgIHR5cGVkZWYgcHRocmVhZF9hbGxvY2F0b3I8X05ld1R5cGU+IG90aGVyOwotICB9OwotI2VuZGlmCi0KLSAgcHRocmVhZF9hbGxvY2F0b3IoKSBfU1RMUF9OT1RIUk9XIHt9Ci0gIHB0aHJlYWRfYWxsb2NhdG9yKGNvbnN0IHB0aHJlYWRfYWxsb2NhdG9yPF9UcD4mIGEpIF9TVExQX05PVEhST1cge30KLQotI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpIC8qICYmIGRlZmluZWQgKF9TVExQX0ZVTkNUSU9OX1BBUlRJQUxfT1JERVIpICovCi0gIHRlbXBsYXRlIDxjbGFzcyBfT3RoZXJUeXBlPiBwdGhyZWFkX2FsbG9jYXRvcihjb25zdCBwdGhyZWFkX2FsbG9jYXRvcjxfT3RoZXJUeXBlPiYpCi0gICAgX1NUTFBfTk9USFJPVyB7fQotI2VuZGlmCi0KLSAgfnB0aHJlYWRfYWxsb2NhdG9yKCkgX1NUTFBfTk9USFJPVyB7fQotCi0gIHBvaW50ZXIgYWRkcmVzcyhyZWZlcmVuY2UgX194KSBjb25zdCB7IHJldHVybiAmX194OyB9Ci0gIGNvbnN0X3BvaW50ZXIgYWRkcmVzcyhjb25zdF9yZWZlcmVuY2UgX194KSBjb25zdCB7IHJldHVybiAmX194OyB9Ci0KLSAgLy8gX19uIGlzIHBlcm1pdHRlZCB0byBiZSAwLiAgVGhlIEMrKyBzdGFuZGFyZCBzYXlzIG5vdGhpbmcgYWJvdXQgd2hhdAotICAvLyB0aGUgcmV0dXJuIHZhbHVlIGlzIHdoZW4gX19uID09IDAuCi0gIF9UcCogYWxsb2NhdGUoc2l6ZV90eXBlIF9fbiwgY29uc3Qgdm9pZCogPSAwKSB7Ci0gICAgaWYgKF9fbiA+IG1heF9zaXplKCkpIHsKLSAgICAgIF9fVEhST1dfQkFEX0FMTE9DOwotICAgIH0KLSAgICBpZiAoX19uICE9IDApIHsKLSAgICAgIHNpemVfdHlwZSBfX2J1Zl9zaXplID0gX19uICogc2l6ZW9mKHZhbHVlX3R5cGUpOwotICAgICAgX1RwKiBfX3JldCA9IF9fUkVJTlRFUlBSRVRfQ0FTVCh2YWx1ZV90eXBlKiwgX1NfQWxsb2M6OmFsbG9jYXRlKF9fYnVmX3NpemUpKTsKLSNpZiBkZWZpbmVkIChfU1RMUF9ERUJVR19VTklOSVRJQUxJWkVEKSAmJiAhZGVmaW5lZCAoX1NUTFBfREVCVUdfQUxMT0MpCi0gICAgICBpZiAoX19yZXQgIT0gMCkgewotICAgICAgICBtZW1zZXQoKGNoYXIqKV9fcmV0LCBfU1RMUF9TSFJFRF9CWVRFLCBfX2J1Zl9zaXplKTsKLSAgICAgIH0KLSNlbmRpZgotICAgICAgcmV0dXJuIF9fcmV0OwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZXR1cm4gMDsKLSAgfQotCi0gIHZvaWQgZGVhbGxvY2F0ZShwb2ludGVyIF9fcCwgc2l6ZV90eXBlIF9fbikgewotICAgIF9TVExQX0FTU0VSVCggKF9fcCA9PSAwKSA9PSAoX19uID09IDApICkKLSAgICBpZiAoX19wICE9IDApIHsKLSNpZiBkZWZpbmVkIChfU1RMUF9ERUJVR19VTklOSVRJQUxJWkVEKSAmJiAhZGVmaW5lZCAoX1NUTFBfREVCVUdfQUxMT0MpCi0gICAgICBtZW1zZXQoKGNoYXIqKV9fcCwgX1NUTFBfU0hSRURfQllURSwgX19uICogc2l6ZW9mKHZhbHVlX3R5cGUpKTsKLSNlbmRpZgotICAgICAgX1NfQWxsb2M6OmRlYWxsb2NhdGUoX19wLCBfX24gKiBzaXplb2YodmFsdWVfdHlwZSkpOwotICAgIH0KLSAgfQotCi0gIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IF9TVExQX05PVEhST1cKLSAgeyByZXR1cm4gc2l6ZV90KC0xKSAvIHNpemVvZihfVHApOyB9Ci0KLSAgdm9pZCBjb25zdHJ1Y3QocG9pbnRlciBfX3AsIGNvbnN0IF9UcCYgX192YWwpIHsgX1NUTFBfUExBQ0VNRU5UX05FVyAoX19wKSBfVHAoX192YWwpOyB9Ci0gIHZvaWQgZGVzdHJveShwb2ludGVyIF9wKSB7IF9wLT5+X1RwKCk7IH0KLQotI2lmIGRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpCi0gIC8qIFNUTHBvcnQgZXh0ZW5zaW9uIGdpdmluZyByb3VuZGVkIHNpemUgb2YgYW4gYWxsb2NhdGVkIG1lbW9yeSBidWZmZXIKLSAgICogVGhpcyBtZXRob2QgZG8gbm90IGhhdmUgdG8gYmUgcGFydCBvZiBhIHVzZXIgZGVmaW5lZCBhbGxvY2F0b3IgaW1wbGVtZW50YXRpb24KLSAgICogYW5kIHdvbid0IGV2ZW4gYmUgY2FsbGVkIGlmIHN1Y2ggYSBmdW5jdGlvbiB3YXMgZ3JhbnRlZC4KLSAgICovCi1wcm90ZWN0ZWQ6Ci0jZW5kaWYKLSAgX1RwKiBhbGxvY2F0ZShzaXplX3R5cGUgX19uLCBzaXplX3R5cGUmIF9fYWxsb2NhdGVkX24pIHsKLSAgICBpZiAoX19uID4gbWF4X3NpemUoKSkgewotICAgICAgX19USFJPV19CQURfQUxMT0M7Ci0gICAgfQotICAgIGlmIChfX24gIT0gMCkgewotICAgICAgc2l6ZV90eXBlIF9fYnVmX3NpemUgPSBfX24gKiBzaXplb2YodmFsdWVfdHlwZSk7Ci0gICAgICBfVHAqIF9fcmV0ID0gX19SRUlOVEVSUFJFVF9DQVNUKHZhbHVlX3R5cGUqLCBfU19BbGxvYzo6YWxsb2NhdGUoX19idWZfc2l6ZSkpOwotI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHX1VOSU5JVElBTElaRUQpICYmICFkZWZpbmVkIChfU1RMUF9ERUJVR19BTExPQykKLSAgICAgIGlmIChfX3JldCAhPSAwKSB7Ci0gICAgICAgIG1lbXNldCgoY2hhciopX19yZXQsIF9TVExQX1NIUkVEX0JZVEUsIF9fYnVmX3NpemUpOwotICAgICAgfQotI2VuZGlmCi0gICAgICBfX2FsbG9jYXRlZF9uID0gX19idWZfc2l6ZSAvIHNpemVvZih2YWx1ZV90eXBlKTsKLSAgICAgIHJldHVybiBfX3JldDsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIDA7Ci0gIH0KLX07Ci0KLV9TVExQX1RFTVBMQVRFX05VTEwKLWNsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIHB0aHJlYWRfYWxsb2NhdG9yPHZvaWQ+IHsKLXB1YmxpYzoKLSAgdHlwZWRlZiBzaXplX3QgICAgICBzaXplX3R5cGU7Ci0gIHR5cGVkZWYgcHRyZGlmZl90ICAgZGlmZmVyZW5jZV90eXBlOwotICB0eXBlZGVmIHZvaWQqICAgICAgIHBvaW50ZXI7Ci0gIHR5cGVkZWYgY29uc3Qgdm9pZCogY29uc3RfcG9pbnRlcjsKLSAgdHlwZWRlZiB2b2lkICAgICAgICB2YWx1ZV90eXBlOwotI2lmZGVmIF9TVExQX01FTUJFUl9URU1QTEFURV9DTEFTU0VTCi0gIHRlbXBsYXRlIDxjbGFzcyBfTmV3VHlwZT4gc3RydWN0IHJlYmluZCB7Ci0gICAgdHlwZWRlZiBwdGhyZWFkX2FsbG9jYXRvcjxfTmV3VHlwZT4gb3RoZXI7Ci0gIH07Ci0jZW5kaWYKLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KLWlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgcHRocmVhZF9hbGxvY2F0b3I8X1QxPiYsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHB0aHJlYWRfYWxsb2NhdG9yPF9UMj4mIGEyKQoteyByZXR1cm4gdHJ1ZTsgfQotCi0jaWZkZWYgX1NUTFBfRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSCi10ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+Ci1pbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IHB0aHJlYWRfYWxsb2NhdG9yPF9UMT4mLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwdGhyZWFkX2FsbG9jYXRvcjxfVDI+JikKLXsgcmV0dXJuIGZhbHNlOyB9Ci0jZW5kaWYKLQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikKLQotIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1JBV19TR0lfQUxMT0NBVE9SUykKLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1zdHJ1Y3QgX0FsbG9jX3RyYWl0czxfVHAsIF9QdGhyZWFkX2FsbG9jPgoteyB0eXBlZGVmIF9fYWxsb2NhdG9yPF9UcCwgX1B0aHJlYWRfYWxsb2M+IGFsbG9jYXRvcl90eXBlOyB9OwotIyAgZW5kaWYKLQotdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0F0eXBlPgotc3RydWN0IF9BbGxvY190cmFpdHM8X1RwLCBwdGhyZWFkX2FsbG9jYXRvcjxfQXR5cGU+ID4KLXsgdHlwZWRlZiBwdGhyZWFkX2FsbG9jYXRvcjxfVHA+IGFsbG9jYXRvcl90eXBlOyB9OwotCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9TVExQX0RPTlRfU1VQUE9SVF9SRUJJTkRfTUVNQkVSX1RFTVBMQVRFKQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwMSwgY2xhc3MgX1RwMj4KLWlubGluZSBwdGhyZWFkX2FsbG9jYXRvcjxfVHAyPiYKLV9fc3RsX2FsbG9jX3JlYmluZChwdGhyZWFkX2FsbG9jYXRvcjxfVHAxPiYgX194LCBjb25zdCBfVHAyKikKLXsgcmV0dXJuIChwdGhyZWFkX2FsbG9jYXRvcjxfVHAyPiYpX194OyB9Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHAxLCBjbGFzcyBfVHAyPgotaW5saW5lIHB0aHJlYWRfYWxsb2NhdG9yPF9UcDI+Ci1fX3N0bF9hbGxvY19jcmVhdGUocHRocmVhZF9hbGxvY2F0b3I8X1RwMT4mLCBjb25zdCBfVHAyKikKLXsgcmV0dXJuIHB0aHJlYWRfYWxsb2NhdG9yPF9UcDI+KCk7IH0KLQotI2VuZGlmCi0KLV9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLXN0cnVjdCBfX3B0aHJlYWRfYWxsb2NfdHlwZV90cmFpdHMgewotICB0eXBlZGVmIHR5cGVuYW1lIF9Jc1NUTHBvcnRDbGFzczxwdGhyZWFkX2FsbG9jYXRvcjxfVHA+ID46Ol9SZXQgX1NUTHBvcnRBbGxvYzsKLSAgLy9UaGUgZGVmYXVsdCBhbGxvY2F0b3IgaW1wbGVtZW50YXRpb24gd2hpY2ggaXMgcmVjb2duaXplIHRoYW5rcyB0byB0aGUKLSAgLy9fX3N0bHBvcnRfY2xhc3MgaW5oZXJpdGFuY2UgaXMgYSBzdGF0ZWxlc3Mgb2JqZWN0IHNvOgotICB0eXBlZGVmIF9TVExwb3J0QWxsb2MgaGFzX3RyaXZpYWxfZGVmYXVsdF9jb25zdHJ1Y3RvcjsKLSAgdHlwZWRlZiBfU1RMcG9ydEFsbG9jIGhhc190cml2aWFsX2NvcHlfY29uc3RydWN0b3I7Ci0gIHR5cGVkZWYgX1NUTHBvcnRBbGxvYyBoYXNfdHJpdmlhbF9hc3NpZ25tZW50X29wZXJhdG9yOwotICB0eXBlZGVmIF9TVExwb3J0QWxsb2MgaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjsKLSAgdHlwZWRlZiBfU1RMcG9ydEFsbG9jIGlzX1BPRF90eXBlOwotfTsKLQotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLXN0cnVjdCBfX3R5cGVfdHJhaXRzPHB0aHJlYWRfYWxsb2NhdG9yPF9UcD4gPiA6IF9TVExQX1BSSVYgX19wdGhyZWFkX2FsbG9jX3R5cGVfdHJhaXRzPF9UcD4ge307Ci0jZWxzZQotX1NUTFBfVEVNUExBVEVfTlVMTAotc3RydWN0IF9fdHlwZV90cmFpdHM8cHRocmVhZF9hbGxvY2F0b3I8Y2hhcj4gPiA6IF9TVExQX1BSSVYgX19wdGhyZWFkX2FsbG9jX3R5cGVfdHJhaXRzPGNoYXI+IHt9OwotIyAgaWYgZGVmaW5lZCAoX1NUTFBfSEFTX1dDSEFSX1QpCi1fU1RMUF9URU1QTEFURV9OVUxMCi1zdHJ1Y3QgX190eXBlX3RyYWl0czxwdGhyZWFkX2FsbG9jYXRvcjx3Y2hhcl90PiA+IDogX1NUTFBfUFJJViBfX3B0aHJlYWRfYWxsb2NfdHlwZV90cmFpdHM8d2NoYXJfdD4ge307Ci0jICBlbmRpZgotIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BUUl9TUEVDSUFMSVpBVElPTlMpCi1fU1RMUF9URU1QTEFURV9OVUxMCi1zdHJ1Y3QgX190eXBlX3RyYWl0czxwdGhyZWFkX2FsbG9jYXRvcjx2b2lkKj4gPiA6IF9TVExQX1BSSVYgX19wdGhyZWFkX2FsbG9jX3R5cGVfdHJhaXRzPHZvaWQqPiB7fTsKLSMgIGVuZGlmCi0jZW5kaWYKLQotLy8KLS8vIHBlcl90aHJlYWRfYWxsb2NhdG9yPD4gOiB0aGlzIGFsbG9jYXRvciBhbHdheXMgcmV0dXJuIG1lbW9yeSB0byB0aGUgc2FtZSB0aHJlYWQKLS8vIGl0IHdhcyBhbGxvY2F0ZWQgZnJvbS4KLS8vCi0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1jbGFzcyBwZXJfdGhyZWFkX2FsbG9jYXRvciB7Ci0gIHR5cGVkZWYgcHRocmVhZF9hbGxvYyBfU19BbGxvYzsgICAgICAgICAgLy8gVGhlIHVuZGVybHlpbmcgYWxsb2NhdG9yLgotICB0eXBlZGVmIHB0aHJlYWRfYWxsb2M6Ol9fc3RhdGVfdHlwZSBfX3N0YXRlX3R5cGU7Ci1wdWJsaWM6Ci0gIHR5cGVkZWYgc2l6ZV90ICAgICBzaXplX3R5cGU7Ci0gIHR5cGVkZWYgcHRyZGlmZl90ICBkaWZmZXJlbmNlX3R5cGU7Ci0gIHR5cGVkZWYgX1RwKiAgICAgICBwb2ludGVyOwotICB0eXBlZGVmIGNvbnN0IF9UcCogY29uc3RfcG9pbnRlcjsKLSAgdHlwZWRlZiBfVHAmICAgICAgIHJlZmVyZW5jZTsKLSAgdHlwZWRlZiBjb25zdCBfVHAmIGNvbnN0X3JlZmVyZW5jZTsKLSAgdHlwZWRlZiBfVHAgICAgICAgIHZhbHVlX3R5cGU7Ci0KLSNpZmRlZiBfU1RMUF9NRU1CRVJfVEVNUExBVEVfQ0xBU1NFUwotICB0ZW1wbGF0ZSA8Y2xhc3MgX05ld1R5cGU+IHN0cnVjdCByZWJpbmQgewotICAgIHR5cGVkZWYgcGVyX3RocmVhZF9hbGxvY2F0b3I8X05ld1R5cGU+IG90aGVyOwotICB9OwotI2VuZGlmCi0KLSAgcGVyX3RocmVhZF9hbGxvY2F0b3IoKSBfU1RMUF9OT1RIUk9XIHsKLSAgICBfTV9zdGF0ZSA9IF9TX0FsbG9jOjpfU19nZXRfcGVyX3RocmVhZF9zdGF0ZSgpOwotICB9Ci0gIHBlcl90aHJlYWRfYWxsb2NhdG9yKGNvbnN0IHBlcl90aHJlYWRfYWxsb2NhdG9yPF9UcD4mIF9fYSkgX1NUTFBfTk9USFJPVyA6IF9NX3N0YXRlKF9fYS5fTV9zdGF0ZSl7fQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykgLyogJiYgZGVmaW5lZCAoX1NUTFBfRlVOQ1RJT05fUEFSVElBTF9PUkRFUikgKi8KLSAgdGVtcGxhdGUgPGNsYXNzIF9PdGhlclR5cGU+IHBlcl90aHJlYWRfYWxsb2NhdG9yKGNvbnN0IHBlcl90aHJlYWRfYWxsb2NhdG9yPF9PdGhlclR5cGU+JiBfX2EpCi0gICAgX1NUTFBfTk9USFJPVyA6IF9NX3N0YXRlKF9fYS5fTV9zdGF0ZSkge30KLSNlbmRpZgotCi0gIH5wZXJfdGhyZWFkX2FsbG9jYXRvcigpIF9TVExQX05PVEhST1cge30KLQotICBwb2ludGVyIGFkZHJlc3MocmVmZXJlbmNlIF9feCkgY29uc3QgeyByZXR1cm4gJl9feDsgfQotICBjb25zdF9wb2ludGVyIGFkZHJlc3MoY29uc3RfcmVmZXJlbmNlIF9feCkgY29uc3QgeyByZXR1cm4gJl9feDsgfQotCi0gIC8vIF9fbiBpcyBwZXJtaXR0ZWQgdG8gYmUgMC4gIFRoZSBDKysgc3RhbmRhcmQgc2F5cyBub3RoaW5nIGFib3V0IHdoYXQKLSAgLy8gdGhlIHJldHVybiB2YWx1ZSBpcyB3aGVuIF9fbiA9PSAwLgotICBfVHAqIGFsbG9jYXRlKHNpemVfdHlwZSBfX24sIGNvbnN0IHZvaWQqID0gMCkgewotICAgIGlmIChfX24gPiBtYXhfc2l6ZSgpKSB7Ci0gICAgICBfX1RIUk9XX0JBRF9BTExPQzsKLSAgICB9Ci0gICAgaWYgKF9fbiAhPSAwKSB7Ci0gICAgICBzaXplX3R5cGUgX19idWZfc2l6ZSA9IF9fbiAqIHNpemVvZih2YWx1ZV90eXBlKTsKLSAgICAgIF9UcCogX19yZXQgPSBfX1JFSU5URVJQUkVUX0NBU1QoX1RwKiwgX1NfQWxsb2M6OmFsbG9jYXRlKF9fYnVmX3NpemUsIF9NX3N0YXRlKSk7Ci0jaWYgZGVmaW5lZCAoX1NUTFBfREVCVUdfVU5JTklUSUFMSVpFRCkgJiYgIWRlZmluZWQgKF9TVExQX0RFQlVHX0FMTE9DKQotICAgICAgaWYgKF9fcmV0ICE9IDApIHsKLSAgICAgICAgbWVtc2V0KChjaGFyKilfX3JldCwgX1NUTFBfU0hSRURfQllURSwgX19idWZfc2l6ZSk7Ci0gICAgICB9Ci0jZW5kaWYKLSAgICAgIHJldHVybiBfX3JldDsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIDA7Ci0gIH0KLQotICB2b2lkIGRlYWxsb2NhdGUocG9pbnRlciBfX3AsIHNpemVfdHlwZSBfX24pIHsKLSAgICBfU1RMUF9BU1NFUlQoIChfX3AgPT0gMCkgPT0gKF9fbiA9PSAwKSApCi0gICAgaWYgKF9fcCAhPSAwKSB7Ci0jaWYgZGVmaW5lZCAoX1NUTFBfREVCVUdfVU5JTklUSUFMSVpFRCkgJiYgIWRlZmluZWQgKF9TVExQX0RFQlVHX0FMTE9DKQotICAgICAgbWVtc2V0KChjaGFyKilfX3AsIF9TVExQX1NIUkVEX0JZVEUsIF9fbiAqIHNpemVvZih2YWx1ZV90eXBlKSk7Ci0jZW5kaWYKLSAgICAgIF9TX0FsbG9jOjpkZWFsbG9jYXRlKF9fcCwgX19uICogc2l6ZW9mKHZhbHVlX3R5cGUpLCBfTV9zdGF0ZSk7Ci0gICAgfQotICB9Ci0KLSAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgX1NUTFBfTk9USFJPVwotICB7IHJldHVybiBzaXplX3QoLTEpIC8gc2l6ZW9mKF9UcCk7IH0KLQotICB2b2lkIGNvbnN0cnVjdChwb2ludGVyIF9fcCwgY29uc3QgX1RwJiBfX3ZhbCkgeyBfU1RMUF9QTEFDRU1FTlRfTkVXIChfX3ApIF9UcChfX3ZhbCk7IH0KLSAgdm9pZCBkZXN0cm95KHBvaW50ZXIgX3ApIHsgX3AtPn5fVHAoKTsgfQotCi0gIC8vIHN0YXRlIGlzIGJlaW5nIGtlcHQgaGVyZQotICBfX3N0YXRlX3R5cGUqIF9NX3N0YXRlOwotCi0jaWYgZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKLSAgLyogU1RMcG9ydCBleHRlbnNpb24gZ2l2aW5nIHJvdW5kZWQgc2l6ZSBvZiBhbiBhbGxvY2F0ZWQgbWVtb3J5IGJ1ZmZlcgotICAgKiBUaGlzIG1ldGhvZCBkbyBub3QgaGF2ZSB0byBiZSBwYXJ0IG9mIGEgdXNlciBkZWZpbmVkIGFsbG9jYXRvciBpbXBsZW1lbnRhdGlvbgotICAgKiBhbmQgd29uJ3QgZXZlbiBiZSBjYWxsZWQgaWYgc3VjaCBhIGZ1bmN0aW9uIHdhcyBncmFudGVkLgotICAgKi8KLXByb3RlY3RlZDoKLSNlbmRpZgotICBfVHAqIGFsbG9jYXRlKHNpemVfdHlwZSBfX24sIHNpemVfdHlwZSYgX19hbGxvY2F0ZWRfbikgewotICAgIGlmIChfX24gPiBtYXhfc2l6ZSgpKSB7Ci0gICAgICBfX1RIUk9XX0JBRF9BTExPQzsKLSAgICB9Ci0gICAgaWYgKF9fbiAhPSAwKSB7Ci0gICAgICBzaXplX3R5cGUgX19idWZfc2l6ZSA9IF9fbiAqIHNpemVvZih2YWx1ZV90eXBlKTsKLSAgICAgIF9UcCogX19yZXQgPSBfX1JFSU5URVJQUkVUX0NBU1QodmFsdWVfdHlwZSosIF9TX0FsbG9jOjphbGxvY2F0ZShfX2J1Zl9zaXplLCBfTV9zdGF0ZSkpOwotI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHX1VOSU5JVElBTElaRUQpICYmICFkZWZpbmVkIChfU1RMUF9ERUJVR19BTExPQykKLSAgICAgIGlmIChfX3JldCAhPSAwKSB7Ci0gICAgICAgIG1lbXNldCgoY2hhciopX19yZXQsIF9TVExQX1NIUkVEX0JZVEUsIF9fYnVmX3NpemUpOwotICAgICAgfQotI2VuZGlmCi0gICAgICBfX2FsbG9jYXRlZF9uID0gX19idWZfc2l6ZSAvIHNpemVvZih2YWx1ZV90eXBlKTsKLSAgICAgIHJldHVybiBfX3JldDsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIDA7Ci0gIH0KLX07Ci0KLV9TVExQX1RFTVBMQVRFX05VTEwKLWNsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIHBlcl90aHJlYWRfYWxsb2NhdG9yPHZvaWQ+IHsKLXB1YmxpYzoKLSAgdHlwZWRlZiBzaXplX3QgICAgICBzaXplX3R5cGU7Ci0gIHR5cGVkZWYgcHRyZGlmZl90ICAgZGlmZmVyZW5jZV90eXBlOwotICB0eXBlZGVmIHZvaWQqICAgICAgIHBvaW50ZXI7Ci0gIHR5cGVkZWYgY29uc3Qgdm9pZCogY29uc3RfcG9pbnRlcjsKLSAgdHlwZWRlZiB2b2lkICAgICAgICB2YWx1ZV90eXBlOwotI2lmZGVmIF9TVExQX01FTUJFUl9URU1QTEFURV9DTEFTU0VTCi0gIHRlbXBsYXRlIDxjbGFzcyBfTmV3VHlwZT4gc3RydWN0IHJlYmluZCB7Ci0gICAgdHlwZWRlZiBwZXJfdGhyZWFkX2FsbG9jYXRvcjxfTmV3VHlwZT4gb3RoZXI7Ci0gIH07Ci0jZW5kaWYKLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KLWlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgcGVyX3RocmVhZF9hbGxvY2F0b3I8X1QxPiYgX19hMSwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGVyX3RocmVhZF9hbGxvY2F0b3I8X1QyPiYgX19hMikKLXsgcmV0dXJuIF9fYTEuX01fc3RhdGUgPT0gX19hMi5fTV9zdGF0ZTsgfQotCi0jaWZkZWYgX1NUTFBfRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSCi10ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+Ci1pbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IHBlcl90aHJlYWRfYWxsb2NhdG9yPF9UMT4mIF9fYTEsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBlcl90aHJlYWRfYWxsb2NhdG9yPF9UMj4mIF9fYTIpCi17IHJldHVybiBfX2ExLl9NX3N0YXRlICE9IF9fYTIuX01fc3RhdGU7IH0KLSNlbmRpZgotCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQXR5cGU+Ci1zdHJ1Y3QgX0FsbG9jX3RyYWl0czxfVHAsIHBlcl90aHJlYWRfYWxsb2NhdG9yPF9BdHlwZT4gPgoteyB0eXBlZGVmIHBlcl90aHJlYWRfYWxsb2NhdG9yPF9UcD4gYWxsb2NhdG9yX3R5cGU7IH07Ci0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBQT1JUX1JFQklORF9NRU1CRVJfVEVNUExBVEUpCi0KLXRlbXBsYXRlIDxjbGFzcyBfVHAxLCBjbGFzcyBfVHAyPgotaW5saW5lIHBlcl90aHJlYWRfYWxsb2NhdG9yPF9UcDI+JgotX19zdGxfYWxsb2NfcmViaW5kKHBlcl90aHJlYWRfYWxsb2NhdG9yPF9UcDE+JiBfX3gsIGNvbnN0IF9UcDIqKQoteyByZXR1cm4gKHBlcl90aHJlYWRfYWxsb2NhdG9yPF9UcDI+JilfX3g7IH0KLQotdGVtcGxhdGUgPGNsYXNzIF9UcDEsIGNsYXNzIF9UcDI+Ci1pbmxpbmUgcGVyX3RocmVhZF9hbGxvY2F0b3I8X1RwMj4KLV9fc3RsX2FsbG9jX2NyZWF0ZShwZXJfdGhyZWFkX2FsbG9jYXRvcjxfVHAxPiYsIGNvbnN0IF9UcDIqKQoteyByZXR1cm4gcGVyX3RocmVhZF9hbGxvY2F0b3I8X1RwMj4oKTsgfQotCi0jZW5kaWYgLyogX1NUTFBfRE9OVF9TVVBQT1JUX1JFQklORF9NRU1CRVJfVEVNUExBVEUgKi8KLQotX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotc3RydWN0IF9fcGVydGhyZWFkX2FsbG9jX3R5cGVfdHJhaXRzIHsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfSXNTVExwb3J0Q2xhc3M8cGVyX3RocmVhZF9hbGxvY2F0b3I8X1RwPiA+OjpfUmV0IF9TVExwb3J0QWxsb2M7Ci0gIC8vVGhlIGRlZmF1bHQgYWxsb2NhdG9yIGltcGxlbWVudGF0aW9uIHdoaWNoIGlzIHJlY29nbml6ZSB0aGFua3MgdG8gdGhlCi0gIC8vX19zdGxwb3J0X2NsYXNzIGluaGVyaXRhbmNlIGlzIGEgc3RhdGVsZXNzIG9iamVjdCBzbzoKLSAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgaGFzX3RyaXZpYWxfZGVmYXVsdF9jb25zdHJ1Y3RvcjsKLSAgdHlwZWRlZiBfU1RMcG9ydEFsbG9jIGhhc190cml2aWFsX2NvcHlfY29uc3RydWN0b3I7Ci0gIHR5cGVkZWYgX1NUTHBvcnRBbGxvYyBoYXNfdHJpdmlhbF9hc3NpZ25tZW50X29wZXJhdG9yOwotICB0eXBlZGVmIF9TVExwb3J0QWxsb2MgaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjsKLSAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgaXNfUE9EX3R5cGU7Ci19OwotCi1fU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKLQotI2lmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotc3RydWN0IF9fdHlwZV90cmFpdHM8cGVyX3RocmVhZF9hbGxvY2F0b3I8X1RwPiA+IDogX1NUTFBfUFJJViBfX3BlcnRocmVhZF9hbGxvY190eXBlX3RyYWl0czxfVHA+IHt9OwotI2Vsc2UKLV9TVExQX1RFTVBMQVRFX05VTEwKLXN0cnVjdCBfX3R5cGVfdHJhaXRzPHBlcl90aHJlYWRfYWxsb2NhdG9yPGNoYXI+ID4gOiBfU1RMUF9QUklWIF9fcGVydGhyZWFkX2FsbG9jX3R5cGVfdHJhaXRzPGNoYXI+IHt9OwotIyAgaWYgZGVmaW5lZCAoX1NUTFBfSEFTX1dDSEFSX1QpCi1fU1RMUF9URU1QTEFURV9OVUxMCi1zdHJ1Y3QgX190eXBlX3RyYWl0czxwZXJfdGhyZWFkX2FsbG9jYXRvcjx3Y2hhcl90PiA+IDogX1NUTFBfUFJJViBfX3BlcnRocmVhZF9hbGxvY190eXBlX3RyYWl0czx3Y2hhcl90PiB7fTsKLSMgIGVuZGlmCi0jICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfUFRSX1NQRUNJQUxJWkFUSU9OUykKLV9TVExQX1RFTVBMQVRFX05VTEwKLXN0cnVjdCBfX3R5cGVfdHJhaXRzPHBlcl90aHJlYWRfYWxsb2NhdG9yPHZvaWQqPiA+IDogX1NUTFBfUFJJViBfX3BlcnRocmVhZF9hbGxvY190eXBlX3RyYWl0czx2b2lkKj4ge307Ci0jICBlbmRpZgotI2VuZGlmCi0KLQotX1NUTFBfRU5EX05BTUVTUEFDRQotCi0jZW5kaWYgLyogX1NUTFBfUFRIUkVBRF9BTExPQyAqLwotCi0vLyBMb2NhbCBWYXJpYWJsZXM6Ci0vLyBtb2RlOkMrKwotLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RsL19wdHJzX3NwZWNpYWxpemUuaCBiL3N0bC9fcHRyc19zcGVjaWFsaXplLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMzQwZGIuLjAwMDAwMDAKLS0tIGEvc3RsL19wdHJzX3NwZWNpYWxpemUuaAorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLSNpZm5kZWYgX1NUTFBfUFRSU19TUEVDSUFMSVpFX0gKLSNkZWZpbmUgX1NUTFBfUFRSU19TUEVDSUFMSVpFX0gKLQotI2lmbmRlZiBfU1RMUF9UWVBFX1RSQUlUU19ICi0jICBpbmNsdWRlIDxzdGwvdHlwZV90cmFpdHMuaD4KLSNlbmRpZgotCi0vLyB0aGUgZm9sbG93aW5nIGlzIGEgd29ya2Fyb3VuZCBmb3IgYXJyb3cgb3BlcmF0b3IgcHJvYmxlbXMKLSNpZiBkZWZpbmVkICAoIF9TVExQX05PX0FSUk9XX09QRVJBVE9SICkKLS8vIFVzZXIgd2FudHMgdG8gZGlzYWJsZSBwcm94eSAtPiBvcGVyYXRvcnMKLSMgIGRlZmluZSBfU1RMUF9ERUZJTkVfQVJST1dfT1BFUkFUT1IKLSMgIGRlZmluZSBfU1RMUF9BUlJPV19TUEVDSUFMSVpFX1dJVEhfUFRSUyhfVHApCi0jZWxzZQotLy8gQ29tcGlsZXIgY2FuIGhhbmRsZSBnZW5lcmljIC0+IG9wZXJhdG9yLgotIyAgZGVmaW5lIF9TVExQX0FSUk9XX1NQRUNJQUxJWkVfV0lUSF9QVFJTKF9UcCkKLSMgIGlmIGRlZmluZWQgKF9fQk9STEFORENfXykKLSMgICAgZGVmaW5lIF9TVExQX0RFRklORV9BUlJPV19PUEVSQVRPUiAgcG9pbnRlciBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gJigqKCp0aGlzKSk7IH0KLSMgIGVsaWYgZGVmaW5lZChfX1dBVENPTUNfXykKLSMgICAgZGVmaW5lIF9TVExQX0RFRklORV9BUlJPV19PUEVSQVRPUiBwb2ludGVyIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJlZmVyZW5jZSB4ID0gb3BlcmF0b3IqKCk7IHJldHVybiAmeDsgfQotIyAgZWxzZQotIyAgICBkZWZpbmUgX1NUTFBfREVGSU5FX0FSUk9XX09QRVJBVE9SICBwb2ludGVyIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiAmKG9wZXJhdG9yKigpKTsgfQotIyAgZW5kaWYKLSNlbmRpZiAvKiBfU1RMUF9OT19BUlJPV19PUEVSQVRPUiAqLwotCi0vLyBJbXBvcnRhbnQgcG9pbnRlcnMgc3BlY2lhbGl6YXRpb25zCi0KLSNpZmRlZiBfU1RMUF9TSU1VTEFURV9QQVJUSUFMX1NQRUNfRk9SX1RZUEVfVFJBSVRTCi0jICBkZWZpbmUgX1NUTFBfVFlQRV9UUkFJVFNfUE9EX1NQRUNJQUxJWkVfVihfVHlwZSkKLSMgIGRlZmluZSBfU1RMUF9UWVBFX1RSQUlUU19QT0RfU1BFQ0lBTElaRShfVHlwZSkKLSNlbHNlCi0jICBkZWZpbmUgX1NUTFBfVFlQRV9UUkFJVFNfUE9EX1NQRUNJQUxJWkUoX1R5cGUpIF9TVExQX1RFTVBMQVRFX05VTEwgc3RydWN0IF9fdHlwZV90cmFpdHM8X1R5cGU+IDogX190eXBlX3RyYWl0c19hdXg8MT4ge307Ci0jICBkZWZpbmUgX1NUTFBfVFlQRV9UUkFJVFNfUE9EX1NQRUNJQUxJWkVfVihfVHlwZSkgXAotX1NUTFBfVFlQRV9UUkFJVFNfUE9EX1NQRUNJQUxJWkUoX1R5cGUqKSBcCi1fU1RMUF9UWVBFX1RSQUlUU19QT0RfU1BFQ0lBTElaRShjb25zdCBfVHlwZSopIFwKLV9TVExQX1RZUEVfVFJBSVRTX1BPRF9TUEVDSUFMSVpFKF9UeXBlKiopIFwKLV9TVExQX1RZUEVfVFJBSVRTX1BPRF9TUEVDSUFMSVpFKF9UeXBlKiBjb25zdCAqKSBcCi1fU1RMUF9UWVBFX1RSQUlUU19QT0RfU1BFQ0lBTElaRShjb25zdCBfVHlwZSoqKSBcCi1fU1RMUF9UWVBFX1RSQUlUU19QT0RfU1BFQ0lBTElaRShfVHlwZSoqKikgXAotX1NUTFBfVFlQRV9UUkFJVFNfUE9EX1NQRUNJQUxJWkUoY29uc3QgX1R5cGUqKiopCi0jZW5kaWYKLQotIyBkZWZpbmUgX1NUTFBfUE9JTlRFUlNfU1BFQ0lBTElaRShfVHlwZSkgX1NUTFBfVFlQRV9UUkFJVFNfUE9EX1NQRUNJQUxJWkVfVihfVHlwZSkgX1NUTFBfQVJST1dfU1BFQ0lBTElaRV9XSVRIX1BUUlMoX1R5cGUpCi0KLV9TVExQX0JFR0lOX05BTUVTUEFDRQotCi0jICBpZiAhZGVmaW5lZCAoIF9TVExQX05PX0JPT0wgKQotX1NUTFBfUE9JTlRFUlNfU1BFQ0lBTElaRSggYm9vbCApCi0jICBlbmRpZgotX1NUTFBfVFlQRV9UUkFJVFNfUE9EX1NQRUNJQUxJWkVfVih2b2lkKQotIyBpZm5kZWYgX1NUTFBfTk9fU0lHTkVEX0JVSUxUSU5TCi0gIF9TVExQX1BPSU5URVJTX1NQRUNJQUxJWkUoIHNpZ25lZCBjaGFyICkKLSMgZW5kaWYKLSAgX1NUTFBfUE9JTlRFUlNfU1BFQ0lBTElaRSggY2hhciApCi0gIF9TVExQX1BPSU5URVJTX1NQRUNJQUxJWkUoIHVuc2lnbmVkIGNoYXIgKQotICBfU1RMUF9QT0lOVEVSU19TUEVDSUFMSVpFKCBzaG9ydCApCi0gIF9TVExQX1BPSU5URVJTX1NQRUNJQUxJWkUoIHVuc2lnbmVkIHNob3J0ICkKLSAgX1NUTFBfUE9JTlRFUlNfU1BFQ0lBTElaRSggaW50ICkKLSAgX1NUTFBfUE9JTlRFUlNfU1BFQ0lBTElaRSggdW5zaWduZWQgaW50ICkKLSAgX1NUTFBfUE9JTlRFUlNfU1BFQ0lBTElaRSggbG9uZyApCi0gIF9TVExQX1BPSU5URVJTX1NQRUNJQUxJWkUoIHVuc2lnbmVkIGxvbmcgKQotICBfU1RMUF9QT0lOVEVSU19TUEVDSUFMSVpFKCBmbG9hdCApCi0gIF9TVExQX1BPSU5URVJTX1NQRUNJQUxJWkUoIGRvdWJsZSApCi0jICBpZiAhZGVmaW5lZCAoIF9TVExQX05PX0xPTkdfRE9VQkxFICkKLSAgX1NUTFBfUE9JTlRFUlNfU1BFQ0lBTElaRSggbG9uZyBkb3VibGUgKQotIyAgZW5kaWYKLSMgIGlmIGRlZmluZWQgKCBfU1RMUF9MT05HX0xPTkcpCi0gIF9TVExQX1BPSU5URVJTX1NQRUNJQUxJWkUoIF9TVExQX0xPTkdfTE9ORyApCi0gIF9TVExQX1BPSU5URVJTX1NQRUNJQUxJWkUoIHVuc2lnbmVkIF9TVExQX0xPTkdfTE9ORyApCi0jICBlbmRpZgotI2lmIGRlZmluZWQgKCBfU1RMUF9IQVNfV0NIQVJfVCApICYmICEgZGVmaW5lZCAoX1NUTFBfV0NIQVJfVF9JU19VU0hPUlQpCi0gIF9TVExQX1BPSU5URVJTX1NQRUNJQUxJWkUoIHdjaGFyX3QgKQotIyAgZW5kaWYKLQotX1NUTFBfRU5EX05BTUVTUEFDRQotCi0jIHVuZGVmIF9TVExQX0FSUk9XX1NQRUNJQUxJWkUKLSMgdW5kZWYgX1NUTFBfQVJST1dfU1BFQ0lBTElaRV9XSVRIX1BUUlMKLSMgdW5kZWYgX1NUTFBfVFlQRV9UUkFJVFNfUE9EX1NQRUNJQUxJWkVfVgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3N0bC9fcXVldWUuaCBiL3N0bC9fcXVldWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkyMDYxNS4uMDAwMDAwMAotLS0gYS9zdGwvX3F1ZXVlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTQKLSAqIEhld2xldHQtUGFja2FyZCBDb21wYW55Ci0gKgotICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKLSAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NwotICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogQm9yaXMgRm9taXRjaGV2Ci0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICovCi0KLS8qIE5PVEU6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIFNUTCBoZWFkZXJzLgotICogICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4KLSAqLwotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX1FVRVVFX0gKLSNkZWZpbmUgX1NUTFBfSU5URVJOQUxfUVVFVUVfSAotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0RFUVVFX0gKLSMgIGluY2x1ZGUgPHN0bC9fZGVxdWUuaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX1ZFQ1RPUl9ICi0jIGluY2x1ZGUgPHN0bC9fdmVjdG9yLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9IRUFQX0gKLSMgIGluY2x1ZGUgPHN0bC9faGVhcC5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfRlVOQ1RJT05fQkFTRV9ICi0jICBpbmNsdWRlIDxzdGwvX2Z1bmN0aW9uX2Jhc2UuaD4KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfX1NDX18pICYmICFkZWZpbmVkKF9fRE1DX18pICAgIC8vKnR5IDEyLzA3LzIwMDEgLSBzaW5jZSAiY29tcCIgaXMgYSBidWlsdC1pbiB0eXBlIGFuZCByZXNlcnZlZCB1bmRlciBTQ3BwCi0jICBkZWZpbmUgY29tcCBfQ29tcAotI2VuZGlmCi0KLV9TVExQX0JFR0lOX05BTUVTUEFDRQotCi0jIGlmICEgZGVmaW5lZCAoIF9TVExQX0xJTUlURURfREVGQVVMVF9URU1QTEFURVMgKQotdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1NlcXVlbmNlID0gZGVxdWU8X1RwPiA+Ci0jIGVsaWYgZGVmaW5lZCAoIF9TVExQX01JTklNVU1fREVGQVVMVF9URU1QTEFURV9QQVJBTVMgKQotIyAgZGVmaW5lIF9TVExQX1FVRVVFX0FSR1MgX1RwCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotIyBlbHNlCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfU2VxdWVuY2U+Ci0jIGVuZGlmCi1jbGFzcyBxdWV1ZQotI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QQVJUSUFMX1NQRUNfV09SS0FST1VORCkKLSMgIGlmIGRlZmluZWQgKF9TVExQX1FVRVVFX0FSR1MpCi0gICAgICAgICAgICA6IHB1YmxpYyBfX3N0bHBvcnRfY2xhc3M8cXVldWU8X1RwPiA+Ci0jICBlbHNlCi0gICAgICAgICAgICA6IHB1YmxpYyBfX3N0bHBvcnRfY2xhc3M8cXVldWU8X1RwLCBfU2VxdWVuY2U+ID4KLSMgIGVuZGlmCi0jZW5kaWYKLXsKLSMgaWYgZGVmaW5lZCAoIF9TVExQX1FVRVVFX0FSR1MgKQotICB0eXBlZGVmIGRlcXVlPF9UcD4gX1NlcXVlbmNlOwotICB0eXBlZGVmIHF1ZXVlPF9UcD4gX1NlbGY7Ci0jIGVsc2UKLSAgdHlwZWRlZiBxdWV1ZTxfVHAsIF9TZXF1ZW5jZT4gX1NlbGY7Ci0jIGVuZGlmCi1wdWJsaWM6Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1NlcXVlbmNlOjp2YWx1ZV90eXBlICAgICAgdmFsdWVfdHlwZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfU2VxdWVuY2U6OnNpemVfdHlwZSAgICAgICBzaXplX3R5cGU7Ci0gIHR5cGVkZWYgICAgICAgICAgX1NlcXVlbmNlICAgICAgICAgICAgICAgICAgY29udGFpbmVyX3R5cGU7Ci0KLSAgdHlwZWRlZiB0eXBlbmFtZSBfU2VxdWVuY2U6OnJlZmVyZW5jZSAgICAgICByZWZlcmVuY2U7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1NlcXVlbmNlOjpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlOwotCi1wcm90ZWN0ZWQ6Ci0gIC8vYyBpcyBhIFN0YW5kYXJkIG5hbWUgKDIzLjIuMy4xKSwgZG8gbm8gbWFrZSBpdCBTVExwb3J0IG5hbWluZyBjb252ZW50aW9uIGNvbXBsaWFudC4KLSAgX1NlcXVlbmNlIGM7Ci1wdWJsaWM6Ci0gIHF1ZXVlKCkgOiBjKCkge30KLSAgZXhwbGljaXQgcXVldWUoY29uc3QgX1NlcXVlbmNlJiBfX2MpIDogYyhfX2MpIHt9Ci0KLSAgcXVldWUoX19tb3ZlX3NvdXJjZTxfU2VsZj4gc3JjKQotICAgIDogYyhfU1RMUF9QUklWIF9Bc01vdmVTb3VyY2Uoc3JjLmdldCgpLmMpKSB7fQotCi0gIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBjLmVtcHR5KCk7IH0KLSAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCB7IHJldHVybiBjLnNpemUoKTsgfQotICByZWZlcmVuY2UgZnJvbnQoKSB7IHJldHVybiBjLmZyb250KCk7IH0KLSAgY29uc3RfcmVmZXJlbmNlIGZyb250KCkgY29uc3QgeyByZXR1cm4gYy5mcm9udCgpOyB9Ci0gIHJlZmVyZW5jZSBiYWNrKCkgeyByZXR1cm4gYy5iYWNrKCk7IH0KLSAgY29uc3RfcmVmZXJlbmNlIGJhY2soKSBjb25zdCB7IHJldHVybiBjLmJhY2soKTsgfQotICB2b2lkIHB1c2goY29uc3QgdmFsdWVfdHlwZSYgX194KSB7IGMucHVzaF9iYWNrKF9feCk7IH0KLSAgdm9pZCBwb3AoKSB7IGMucG9wX2Zyb250KCk7IH0KLSAgY29uc3QgX1NlcXVlbmNlJiBfR2V0X3MoKSBjb25zdCB7IHJldHVybiBjOyB9Ci19OwotCi0jaWZuZGVmIF9TVExQX1FVRVVFX0FSR1MKLSMgIGRlZmluZSBfU1RMUF9RVUVVRV9BUkdTIF9UcCwgX1NlcXVlbmNlCi0jICBkZWZpbmUgX1NUTFBfUVVFVUVfSEVBREVSX0FSR1MgY2xhc3MgX1RwLCBjbGFzcyBfU2VxdWVuY2UKLSNlbHNlCi0jICBkZWZpbmUgX1NUTFBfUVVFVUVfSEVBREVSX0FSR1MgY2xhc3MgX1RwCi0jZW5kaWYKLQotdGVtcGxhdGUgPCBfU1RMUF9RVUVVRV9IRUFERVJfQVJHUyA+Ci1pbmxpbmUgYm9vbCBfU1RMUF9DQUxMCi1vcGVyYXRvcj09KGNvbnN0IHF1ZXVlPF9TVExQX1FVRVVFX0FSR1MgPiYgX194LCBjb25zdCBxdWV1ZTxfU1RMUF9RVUVVRV9BUkdTID4mIF9feSkgewotICByZXR1cm4gX194Ll9HZXRfcygpID09IF9feS5fR2V0X3MoKTsKLX0KLQotdGVtcGxhdGUgPCBfU1RMUF9RVUVVRV9IRUFERVJfQVJHUyA+Ci1pbmxpbmUgYm9vbCBfU1RMUF9DQUxMCi1vcGVyYXRvcjwoY29uc3QgcXVldWU8X1NUTFBfUVVFVUVfQVJHUyA+JiBfX3gsIGNvbnN0IHF1ZXVlPF9TVExQX1FVRVVFX0FSR1MgPiYgX195KSB7Ci0gIHJldHVybiBfX3guX0dldF9zKCkgPCBfX3kuX0dldF9zKCk7Ci19Ci0KLV9TVExQX1JFTE9QU19PUEVSQVRPUlMoIHRlbXBsYXRlIDwgX1NUTFBfUVVFVUVfSEVBREVSX0FSR1MgPiwgcXVldWU8X1NUTFBfUVVFVUVfQVJHUyA+ICkKLQotIyBpZiAhKGRlZmluZWQgKCBfU1RMUF9MSU1JVEVEX0RFRkFVTFRfVEVNUExBVEVTICkgfHwgZGVmaW5lZCAoIF9TVExQX1RFTVBMQVRFX1BBUkFNX1NVQlRZUEVfQlVHICkpCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfU2VxdWVuY2UgPSB2ZWN0b3I8X1RwPiwKLSAgICAgICAgICBjbGFzcyBfQ29tcGFyZSA9IGxlc3M8X1NUTFBfSEVBREVSX1RZUEVOQU1FIF9TZXF1ZW5jZTo6dmFsdWVfdHlwZT4gPgotIyBlbGlmIGRlZmluZWQgKCBfU1RMUF9NSU5JTVVNX0RFRkFVTFRfVEVNUExBVEVfUEFSQU1TICkKLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci0jIGVsc2UKLXRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9TZXF1ZW5jZSwgY2xhc3MgX0NvbXBhcmU+Ci0jIGVuZGlmCi1jbGFzcyBwcmlvcml0eV9xdWV1ZQotI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QQVJUSUFMX1NQRUNfV09SS0FST1VORCkKLSMgIGlmIGRlZmluZWQgKF9TVExQX01JTklNVU1fREVGQVVMVF9URU1QTEFURV9QQVJBTVMpCi0gICAgICAgICAgICA6IHB1YmxpYyBfX3N0bHBvcnRfY2xhc3M8cHJpb3JpdHlfcXVldWU8X1RwPiA+Ci0jICBlbHNlCi0gICAgICAgICAgICA6IHB1YmxpYyBfX3N0bHBvcnRfY2xhc3M8cHJpb3JpdHlfcXVldWU8X1RwLCBfU2VxdWVuY2U+ID4KLSMgIGVuZGlmCi0jZW5kaWYKLXsKLSMgaWZkZWYgX1NUTFBfTUlOSU1VTV9ERUZBVUxUX1RFTVBMQVRFX1BBUkFNUwotICB0eXBlZGVmIHZlY3RvcjxfVHA+IF9TZXF1ZW5jZTsKLSAgdHlwZWRlZiBsZXNzPCB0eXBlbmFtZSB2ZWN0b3I8X1RwPjo6dmFsdWVfdHlwZT4gX0NvbXBhcmU7Ci0gIHR5cGVkZWYgcHJpb3JpdHlfcXVldWU8X1RwPiBfU2VsZjsKLSMgZWxzZQotICB0eXBlZGVmIHByaW9yaXR5X3F1ZXVlPF9UcCwgX1NlcXVlbmNlLCBfQ29tcGFyZT4gX1NlbGY7Ci0jIGVuZGlmCi1wdWJsaWM6Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1NlcXVlbmNlOjp2YWx1ZV90eXBlICAgICAgdmFsdWVfdHlwZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfU2VxdWVuY2U6OnNpemVfdHlwZSAgICAgICBzaXplX3R5cGU7Ci0gIHR5cGVkZWYgICAgICAgICAgX1NlcXVlbmNlICAgICAgICAgICAgICAgICAgY29udGFpbmVyX3R5cGU7Ci0KLSAgdHlwZWRlZiB0eXBlbmFtZSBfU2VxdWVuY2U6OnJlZmVyZW5jZSAgICAgICByZWZlcmVuY2U7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1NlcXVlbmNlOjpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlOwotcHJvdGVjdGVkOgotICAvL2MgaXMgYSBTdGFuZGFyZCBuYW1lICgyMy4yLjMuMiksIGRvIG5vIG1ha2UgaXQgU1RMcG9ydCBuYW1pbmcgY29udmVudGlvbiBjb21wbGlhbnQuCi0gIF9TZXF1ZW5jZSBjOwotICBfQ29tcGFyZSBjb21wOwotcHVibGljOgotICBwcmlvcml0eV9xdWV1ZSgpIDogYygpIHt9Ci0gIGV4cGxpY2l0IHByaW9yaXR5X3F1ZXVlKGNvbnN0IF9Db21wYXJlJiBfX3gpIDogIGMoKSwgY29tcChfX3gpIHt9Ci0gIHByaW9yaXR5X3F1ZXVlKGNvbnN0IF9Db21wYXJlJiBfX3gsIGNvbnN0IF9TZXF1ZW5jZSYgX19zKQotICAgIDogYyhfX3MpLCBjb21wKF9feCkKLSAgICB7IG1ha2VfaGVhcChjLmJlZ2luKCksIGMuZW5kKCksIGNvbXApOyB9Ci0KLSAgcHJpb3JpdHlfcXVldWUoX19tb3ZlX3NvdXJjZTxfU2VsZj4gc3JjKQotICAgIDogYyhfU1RMUF9QUklWIF9Bc01vdmVTb3VyY2Uoc3JjLmdldCgpLmMpKSwKLSAgICAgIGNvbXAoX1NUTFBfUFJJViBfQXNNb3ZlU291cmNlKHNyYy5nZXQoKS5jb21wKSkge30KLQotI2lmZGVmIF9TVExQX01FTUJFUl9URU1QTEFURVMKLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgotICBwcmlvcml0eV9xdWV1ZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCi0gICAgOiBjKF9fZmlyc3QsIF9fbGFzdCkgeyBtYWtlX2hlYXAoYy5iZWdpbigpLCBjLmVuZCgpLCBjb21wKTsgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KLSAgcHJpb3JpdHlfcXVldWUoX0lucHV0SXRlcmF0b3IgX19maXJzdCwKLSAgICAgICAgICAgICAgICAgX0lucHV0SXRlcmF0b3IgX19sYXN0LCBjb25zdCBfQ29tcGFyZSYgX194KQotICAgIDogYyhfX2ZpcnN0LCBfX2xhc3QpLCBjb21wKF9feCkKLSAgICB7IG1ha2VfaGVhcChjLmJlZ2luKCksIGMuZW5kKCksIGNvbXApOyB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgotICBwcmlvcml0eV9xdWV1ZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgIGNvbnN0IF9Db21wYXJlJiBfX3gsIGNvbnN0IF9TZXF1ZW5jZSYgX19zKQotICA6IGMoX19zKSwgY29tcChfX3gpCi0gIHsKLSAgICBjLmluc2VydChjLmVuZCgpLCBfX2ZpcnN0LCBfX2xhc3QpOwotICAgIG1ha2VfaGVhcChjLmJlZ2luKCksIGMuZW5kKCksIGNvbXApOwotICB9Ci0KLSNlbHNlIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KLSAgcHJpb3JpdHlfcXVldWUoY29uc3QgdmFsdWVfdHlwZSogX19maXJzdCwgY29uc3QgdmFsdWVfdHlwZSogX19sYXN0KQotICAgIDogYyhfX2ZpcnN0LCBfX2xhc3QpIHsgbWFrZV9oZWFwKGMuYmVnaW4oKSwgYy5lbmQoKSwgY29tcCk7IH0KLQotICBwcmlvcml0eV9xdWV1ZShjb25zdCB2YWx1ZV90eXBlKiBfX2ZpcnN0LCBjb25zdCB2YWx1ZV90eXBlKiBfX2xhc3QsCi0gICAgICAgICAgICAgICAgIGNvbnN0IF9Db21wYXJlJiBfX3gpCi0gICAgOiBjKF9fZmlyc3QsIF9fbGFzdCksIGNvbXAoX194KQotICAgIHsgbWFrZV9oZWFwKGMuYmVnaW4oKSwgYy5lbmQoKSwgY29tcCk7IH0KLQotICBwcmlvcml0eV9xdWV1ZShjb25zdCB2YWx1ZV90eXBlKiBfX2ZpcnN0LCBjb25zdCB2YWx1ZV90eXBlKiBfX2xhc3QsCi0gICAgICAgICAgICAgICAgIGNvbnN0IF9Db21wYXJlJiBfX3gsIGNvbnN0IF9TZXF1ZW5jZSYgX19jKQotICAgIDogYyhfX2MpLCBjb21wKF9feCkKLSAgewotICAgIGMuaW5zZXJ0KGMuZW5kKCksIF9fZmlyc3QsIF9fbGFzdCk7Ci0gICAgbWFrZV9oZWFwKGMuYmVnaW4oKSwgYy5lbmQoKSwgY29tcCk7Ci0gIH0KLSNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCi0KLSAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIGMuZW1wdHkoKTsgfQotICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGMuc2l6ZSgpOyB9Ci0gIGNvbnN0X3JlZmVyZW5jZSB0b3AoKSBjb25zdCB7IHJldHVybiBjLmZyb250KCk7IH0KLSAgdm9pZCBwdXNoKGNvbnN0IHZhbHVlX3R5cGUmIF9feCkgewotICAgIF9TVExQX1RSWSB7Ci0gICAgICBjLnB1c2hfYmFjayhfX3gpOwotICAgICAgcHVzaF9oZWFwKGMuYmVnaW4oKSwgYy5lbmQoKSwgY29tcCk7Ci0gICAgfQotICAgIF9TVExQX1VOV0lORChjLmNsZWFyKCkpCi0gIH0KLSAgdm9pZCBwb3AoKSB7Ci0gICAgX1NUTFBfVFJZIHsKLSAgICAgIHBvcF9oZWFwKGMuYmVnaW4oKSwgYy5lbmQoKSwgY29tcCk7Ci0gICAgICBjLnBvcF9iYWNrKCk7Ci0gICAgfQotICAgIF9TVExQX1VOV0lORChjLmNsZWFyKCkpCi0gIH0KLX07Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQotdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1NlcXVlbmNlPgotc3RydWN0IF9fbW92ZV90cmFpdHM8cXVldWU8X1RwLCBfU2VxdWVuY2U+ID4gOgotICBfU1RMUF9QUklWIF9fbW92ZV90cmFpdHNfYXV4PF9TZXF1ZW5jZT4KLXt9OwotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfU2VxdWVuY2UsIGNsYXNzIF9Db21wYXJlPgotc3RydWN0IF9fbW92ZV90cmFpdHM8cHJpb3JpdHlfcXVldWU8X1RwLCBfU2VxdWVuY2UsIF9Db21wYXJlPiA+IDoKLSAgX1NUTFBfUFJJViBfX21vdmVfdHJhaXRzX2F1eDI8X1NlcXVlbmNlLCBfQ29tcGFyZT4KLXt9OwotI2VuZGlmIC8qIF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04gKi8KLQotX1NUTFBfRU5EX05BTUVTUEFDRQotCi0jdW5kZWYgX1NUTFBfUVVFVUVfQVJHUwotI3VuZGVmIF9TVExQX1FVRVVFX0hFQURFUl9BUkdTCi0jdW5kZWYgY29tcAotCi0jZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfUVVFVUVfSCAqLwotCi0vLyBMb2NhbCBWYXJpYWJsZXM6Ci0vLyBtb2RlOkMrKwotLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RsL19yYW5nZV9lcnJvcnMuaCBiL3N0bC9fcmFuZ2VfZXJyb3JzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4M2QyNjUuLjAwMDAwMDAKLS0tIGEvc3RsL19yYW5nZV9lcnJvcnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBTaWxpY29uIEdyYXBoaWNzCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCi0gKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAotICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKLSAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCi0gKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCi0gKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0gKgotICovCi0KLSNpZm5kZWYgX1NUTFBfUkFOR0VfRVJST1JTX0gKLSNkZWZpbmUgX1NUTFBfUkFOR0VfRVJST1JTX0gKLQotLy8gQSBmZXcgcGxhY2VzIGluIHRoZSBTVEwgdGhyb3cgcmFuZ2UgZXJyb3JzLCB1c2luZyBzdGFuZGFyZCBleGNlcHRpb24KLS8vIGNsYXNzZXMgZGVmaW5lZCBpbiA8c3RkZXhjZXB0Pi4gIFRoaXMgaGVhZGVyIGZpbGUgcHJvdmlkZXMgZnVuY3Rpb25zCi0vLyB0byB0aHJvdyB0aG9zZSBleGNlcHRpb24gb2JqZWN0cy4KLQotLy8gX1NUTFBfRE9OVF9USFJPV19SQU5HRV9FUlJPUlMgaXMgYSBob29rIHNvIHRoYXQgdXNlcnMgY2FuIGRpc2FibGUKLS8vIHRoaXMgZXhjZXB0aW9uIHRocm93aW5nLgotI2lmIGRlZmluZWQgKF9TVExQX0NBTl9USFJPV19SQU5HRV9FUlJPUlMpICYmIGRlZmluZWQgKF9TVExQX1VTRV9FWENFUFRJT05TKSAmJiBcCi0gICAhZGVmaW5lZCAoX1NUTFBfRE9OVF9USFJPV19SQU5HRV9FUlJPUlMpCi0jICBkZWZpbmUgX1NUTFBfVEhST1dfUkFOR0VfRVJST1JTCi0jZW5kaWYKLQotLy8gRm9yIHRoZSBTVExwb3J0IGlvc3RyZWFtcywgb25seSBkZWNsYXJhdGlvbiBoZXJlLCBkZWZpbml0aW9uIGlzIGluIHRoZSBsaWIKLSNpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX05PX0lPU1RSRUFNUykgJiYgXAotICAgICFkZWZpbmVkIChfU1RMUF9VU0VfTk9fRVhURVJOX1JBTkdFX0VSUk9SUykgJiYgXAotICAgICFkZWZpbmVkIChfU1RMUF9FWFRFUk5fUkFOR0VfRVJST1JTKQotIyAgZGVmaW5lIF9TVExQX0VYVEVSTl9SQU5HRV9FUlJPUlMKLSNlbmRpZgotCi1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLXZvaWQgX1NUTFBfRlVOQ1RJT05fVEhST1dTIF9TVExQX0RFQ0xTUEVDIF9TVExQX0NBTEwgX19zdGxfdGhyb3dfcnVudGltZV9lcnJvcihjb25zdCBjaGFyKiBfX21zZyk7Ci12b2lkIF9TVExQX0ZVTkNUSU9OX1RIUk9XUyBfU1RMUF9ERUNMU1BFQyBfU1RMUF9DQUxMIF9fc3RsX3Rocm93X3JhbmdlX2Vycm9yKGNvbnN0IGNoYXIqIF9fbXNnKTsKLXZvaWQgX1NUTFBfRlVOQ1RJT05fVEhST1dTIF9TVExQX0RFQ0xTUEVDIF9TVExQX0NBTEwgX19zdGxfdGhyb3dfb3V0X29mX3JhbmdlKGNvbnN0IGNoYXIqIF9fbXNnKTsKLXZvaWQgX1NUTFBfRlVOQ1RJT05fVEhST1dTIF9TVExQX0RFQ0xTUEVDIF9TVExQX0NBTEwgX19zdGxfdGhyb3dfbGVuZ3RoX2Vycm9yKGNvbnN0IGNoYXIqIF9fbXNnKTsKLXZvaWQgX1NUTFBfRlVOQ1RJT05fVEhST1dTIF9TVExQX0RFQ0xTUEVDIF9TVExQX0NBTEwgX19zdGxfdGhyb3dfaW52YWxpZF9hcmd1bWVudChjb25zdCBjaGFyKiBfX21zZyk7Ci12b2lkIF9TVExQX0ZVTkNUSU9OX1RIUk9XUyBfU1RMUF9ERUNMU1BFQyBfU1RMUF9DQUxMIF9fc3RsX3Rocm93X292ZXJmbG93X2Vycm9yKGNvbnN0IGNoYXIqIF9fbXNnKTsKLV9TVExQX0VORF9OQU1FU1BBQ0UKLQotI2lmICFkZWZpbmVkIChfU1RMUF9FWFRFUk5fUkFOR0VfRVJST1JTKQotCi0jICBpZiBkZWZpbmVkKF9TVExQX1RIUk9XX1JBTkdFX0VSUk9SUykKLSMgICAgaWZuZGVmIF9TVExQX0lOVEVSTkFMX1NUREVYQ0VQVAotIyAgICAgIGluY2x1ZGUgPHN0bC9fc3RkZXhjZXB0Lmg+Ci0jICAgIGVuZGlmCi0jICAgIGlmbmRlZiBfU1RMUF9TVFJJTkcKLSMgICAgICBpbmNsdWRlIDxzdHJpbmc+Ci0jICAgIGVuZGlmCi0jICAgIGRlZmluZSBfU1RMUF9USFJPV19NU0coZXgsbXNnKSAgdGhyb3cgZXgoc3RyaW5nKG1zZykpCi0jICBlbHNlCi0jICAgIGlmIGRlZmluZWQgKF9TVExQX1JUVElfQlVHKQotIyAgICAgIGRlZmluZSBfU1RMUF9USFJPV19NU0coZXgsbXNnKSAgVGVybWluYXRlUHJvY2VzcyhHZXRDdXJyZW50UHJvY2VzcygpLCAwKQotIyAgICBlbHNlCi0jICAgICAgaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NTVERMSUIKLSMgICAgICAgIGluY2x1ZGUgPHN0bC9fY3N0ZGxpYi5oPgotIyAgICAgIGVuZGlmCi0jICAgICAgaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NTVERJTwotIyAgICAgICAgaW5jbHVkZSA8c3RsL19jc3RkaW8uaD4KLSMgICAgICBlbmRpZgotIyAgICAgIGRlZmluZSBfU1RMUF9USFJPV19NU0coZXgsbXNnKSAgcHV0cyhtc2cpLF9TVExQX0FCT1JUKCkKLSMgICAgZW5kaWYKLSMgIGVuZGlmCi0KLS8vIEZvciBtb2RlIHdpdGhvdXQgbGlicmFyeSBhbmQgdGhyb3dpbmcgcmFuZ2UgZXJyb3JzLCBpbmNsdWRlIHRoZQotLy8gc3RkZXhjZXB0IGhlYWRlciBhbmQgdGhyb3cgdGhlIGFwcHJvcHJpYXRlIGV4Y2VwdGlvbnMgZGlyZWN0bHkuCi0KLV9TVExQX0JFR0lOX05BTUVTUEFDRQotCi1pbmxpbmUgdm9pZCBfU1RMUF9ERUNMU1BFQyBfU1RMUF9DQUxMIF9fc3RsX3Rocm93X3J1bnRpbWVfZXJyb3IoY29uc3QgY2hhciogX19tc2cpCi17IF9TVExQX1RIUk9XX01TRyhydW50aW1lX2Vycm9yLCBfX21zZyk7IH0KLQotaW5saW5lIHZvaWQgX1NUTFBfREVDTFNQRUMgX1NUTFBfQ0FMTCBfX3N0bF90aHJvd19yYW5nZV9lcnJvcihjb25zdCBjaGFyKiBfX21zZykKLXsgX1NUTFBfVEhST1dfTVNHKHJhbmdlX2Vycm9yLCBfX21zZyk7IH0KLQotaW5saW5lIHZvaWQgX1NUTFBfREVDTFNQRUMgX1NUTFBfQ0FMTCBfX3N0bF90aHJvd19vdXRfb2ZfcmFuZ2UoY29uc3QgY2hhciogX19tc2cpCi17IF9TVExQX1RIUk9XX01TRyhvdXRfb2ZfcmFuZ2UsIF9fbXNnKTsgfQotCi1pbmxpbmUgdm9pZCBfU1RMUF9ERUNMU1BFQyBfU1RMUF9DQUxMIF9fc3RsX3Rocm93X2xlbmd0aF9lcnJvcihjb25zdCBjaGFyKiBfX21zZykKLXsgX1NUTFBfVEhST1dfTVNHKGxlbmd0aF9lcnJvciwgX19tc2cpOyB9Ci0KLWlubGluZSB2b2lkIF9TVExQX0RFQ0xTUEVDIF9TVExQX0NBTEwgX19zdGxfdGhyb3dfaW52YWxpZF9hcmd1bWVudChjb25zdCBjaGFyKiBfX21zZykKLXsgX1NUTFBfVEhST1dfTVNHKGludmFsaWRfYXJndW1lbnQsIF9fbXNnKTsgfQotCi1pbmxpbmUgdm9pZCBfU1RMUF9ERUNMU1BFQyBfU1RMUF9DQUxMIF9fc3RsX3Rocm93X292ZXJmbG93X2Vycm9yKGNvbnN0IGNoYXIqIF9fbXNnKQoteyBfU1RMUF9USFJPV19NU0cob3ZlcmZsb3dfZXJyb3IsIF9fbXNnKTsgfQotCi1fU1RMUF9FTkRfTkFNRVNQQUNFCi0KLSMgIHVuZGVmIF9TVExQX1RIUk9XX01TRwotCi0jZW5kaWYgLyogRVhURVJOX1JBTkdFX0VSUk9SUyAqLwotCi0jZW5kaWYgLyogX1NUTFBfUkFOR0VfRVJST1JTX0ggKi8KLQotLy8gTG9jYWwgVmFyaWFibGVzOgotLy8gbW9kZTpDKysKLS8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9fcm9wZS5jIGIvc3RsL19yb3BlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxYThmZGEuLjAwMDAwMDAKLS0tIGEvc3RsL19yb3BlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NwotICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLQotLyogTk9URTogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgU1RMIGhlYWRlcnMuCi0gKiAgIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LgotICovCi0KLS8vIFNldCBidWZfc3RhcnQsIGJ1Zl9lbmQsIGFuZCBidWZfcHRyIGFwcHJvcHJpYXRlbHksIGZpbGxpbmcgdG1wX2J1ZgotLy8gaWYgbmVjZXNzYXJ5LiAgQXNzdW1lcyBwYXRoX2VuZFtsZWFmX2luZGV4XSBhbmQgbGVhZl9wb3MgYXJlIGNvcnJlY3QuCi0vLyBSZXN1bHRzIGluIGEgdmFsaWQgYnVmX3B0ciBpZiB0aGUgaXRlcmF0b3IgY2FuIGJlIGxlZ2l0aW1hdGVseQotLy8gZGVyZWZlcmVuY2VkLgotI2lmbmRlZiBfU1RMUF9ST1BFSU1QTF9ICi0jZGVmaW5lIF9TVExQX1JPUEVJTVBMX0gKLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9ST1BFX0gKLSMgIGluY2x1ZGUgPHN0bC9fcm9wZS5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1NURElPCi0jICBpbmNsdWRlIDxzdGwvX2NzdGRpby5oPgotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX05PX0lPU1RSRUFNUykKLSMgIGlmbmRlZiBfU1RMUF9JT1NUUkVBTQotIyAgICBpbmNsdWRlIDxpb3N0cmVhbT4KLSMgIGVuZGlmCi0jZW5kaWYKLQotI2luY2x1ZGUgPHN0bC9fcmFuZ2VfZXJyb3JzLmg+Ci0KLV9TVExQX0JFR0lOX05BTUVTUEFDRQotCi0jIGlmIGRlZmluZWQgKCBfU1RMUF9ORVNURURfVFlQRV9QQVJBTV9CVUcgKQotIyBkZWZpbmUgX19hbGxvY2F0b3JfXyBfQWxsb2MKLSMgZWxzZQotIyBkZWZpbmUgX19hbGxvY2F0b3JfXyBhbGxvY2F0b3JfdHlwZQotIyBlbmRpZgotCi10ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KLV9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPjo6X1JvcGVfaXRlcmF0b3Iocm9wZTxfQ2hhclQsX0FsbG9jPiogX19yLCBzaXplX3QgX19wb3MpCi0gIDogX1JvcGVfaXRlcmF0b3JfYmFzZTxfQ2hhclQsX0FsbG9jPihfX3ItPl9NX3RyZWVfcHRyLl9NX2RhdGEsIF9fcG9zKSwKLSAgX01fcm9vdF9yb3BlKF9fcikgeyBfUm9wZVJlcDo6X1NfcmVmKHRoaXMtPl9NX3Jvb3QpOyB9Ci0KLXRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgotX1JvcGVfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+OjpfUm9wZV9pdGVyYXRvcihyb3BlPF9DaGFyVCxfQWxsb2M+JiBfX3IsIHNpemVfdCBfX3Bvcyk6Ci0gIF9Sb3BlX2l0ZXJhdG9yX2Jhc2U8X0NoYXJULF9BbGxvYz4oX19yLl9NX3RyZWVfcHRyLl9NX2RhdGEsIF9fcG9zKSwKLSAgX01fcm9vdF9yb3BlKCZfX3IpIHsKLSNpZiAhZGVmaW5lZCAoX19ETUNfXykKLSAgX1JvcGVSZXA6Ol9TX3JlZih0aGlzLT5fTV9yb290KTsgaWYgKCEoX19yLmVtcHR5KCkpKV9TX3NldGNhY2hlKCp0aGlzKTsKLSNlbHNlCi0gIF9Sb3BlX2l0ZXJhdG9yX2Jhc2U8X0NoYXJULCBfQWxsb2M+KiBfX3ggPSB0aGlzOwotICBfUm9wZVJlcDo6X1NfcmVmKHRoaXMtPl9NX3Jvb3QpOyBpZiAoIShfX3IuZW1wdHkoKSkpX1Nfc2V0Y2FjaGUoKl9feCk7Ci0jZW5kaWYKLX0KLQotdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+Ci12b2lkIF9Sb3BlX1JvcGVSZXA8X0NoYXJULCBfQWxsb2M+OjpfTV9mcmVlX2Nfc3RyaW5nKCkgewotICBfQ2hhclQqIF9fY3N0ciA9IF9NX2Nfc3RyaW5nOwotICBpZiAoMCAhPSBfX2NzdHIpIHsKLSAgICBzaXplX3QgX3Bfc2l6ZSA9IF9NX3NpemUuX01fZGF0YSArIDE7Ci0gICAgX1NUTFBfU1REOjpfRGVzdHJveV9SYW5nZShfX2NzdHIsIF9fY3N0ciArIF9wX3NpemUpOwotICAgIF9NX3NpemUuZGVhbGxvY2F0ZShfX2NzdHIsIF9wX3NpemUpOwotICB9Ci19Ci0KLS8vIFNldCBidWZfc3RhcnQsIGJ1Zl9lbmQsIGFuZCBidWZfcHRyIGFwcHJvcHJpYXRlbHksIGZpbGxpbmcgdG1wX2J1ZgotLy8gaWYgbmVjZXNzYXJ5LiAgQXNzdW1lcyBfTV9wYXRoX2VuZFtsZWFmX2luZGV4XSBhbmQgbGVhZl9wb3MgYXJlIGNvcnJlY3QuCi0vLyBSZXN1bHRzIGluIGEgdmFsaWQgYnVmX3B0ciBpZiB0aGUgaXRlcmF0b3IgY2FuIGJlIGxlZ2l0aW1hdGVseQotLy8gZGVyZWZlcmVuY2VkLgotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgotdm9pZCBfUm9wZV9pdGVyYXRvcl9iYXNlPF9DaGFyVCxfQWxsb2M+OjpfU19zZXRidWYoCi0gIF9Sb3BlX2l0ZXJhdG9yX2Jhc2U8X0NoYXJULF9BbGxvYz4mIF9feCkgewotICBjb25zdCBfUm9wZVJlcCogX19sZWFmID0gX194Ll9NX3BhdGhfZW5kLl9NX2RhdGFbX194Ll9NX2xlYWZfaW5kZXhdOwotICBzaXplX3QgX19sZWFmX3BvcyA9IF9feC5fTV9sZWFmX3BvczsKLSAgc2l6ZV90IF9fcG9zID0gX194Ll9NX2N1cnJlbnRfcG9zOwotCi0gIHN3aXRjaChfX2xlYWYtPl9NX3RhZykgewotICBjYXNlIF9Sb3BlUmVwOjpfU19sZWFmOgotICAgIHR5cGVkZWYgX1JvcGVfUm9wZUxlYWY8X0NoYXJULCBfQWxsb2M+IF9Sb3BlTGVhZjsKLSAgICBfX3guX01fYnVmX3N0YXJ0ID0gX19TVEFUSUNfQ0FTVChjb25zdCBfUm9wZUxlYWYqLCBfX2xlYWYpLT5fTV9kYXRhOwotICAgIF9feC5fTV9idWZfcHRyID0gX194Ll9NX2J1Zl9zdGFydCArIChfX3BvcyAtIF9fbGVhZl9wb3MpOwotICAgIF9feC5fTV9idWZfZW5kID0gX194Ll9NX2J1Zl9zdGFydCArIF9fbGVhZi0+X01fc2l6ZS5fTV9kYXRhOwotICAgIGJyZWFrOwotICBjYXNlIF9Sb3BlUmVwOjpfU19mdW5jdGlvbjoKLSAgY2FzZSBfUm9wZVJlcDo6X1Nfc3Vic3RyaW5nZm46Ci0gICAgewotICAgICAgc2l6ZV90IF9fbGVuID0gX1NfaXRlcmF0b3JfYnVmX2xlbjsKLSAgICAgIHNpemVfdCBfX2J1Zl9zdGFydF9wb3MgPSBfX2xlYWZfcG9zOwotICAgICAgc2l6ZV90IF9fbGVhZl9lbmQgPSBfX2xlYWZfcG9zICsgX19sZWFmLT5fTV9zaXplLl9NX2RhdGE7Ci0gICAgICB0eXBlZGVmIF9Sb3BlX1JvcGVGdW5jdGlvbjxfQ2hhclQsIF9BbGxvYz4gX1JvcGVGdW5jdGlvbjsKLSAgICAgIGNoYXJfcHJvZHVjZXI8X0NoYXJUPiogX19mbiA9IF9fU1RBVElDX0NBU1QoY29uc3QgX1JvcGVGdW5jdGlvbiosIF9fbGVhZiktPl9NX2ZuOwotCi0gICAgICBpZiAoX19idWZfc3RhcnRfcG9zICsgX19sZW4gPD0gX19wb3MpIHsKLSAgICAgICAgX19idWZfc3RhcnRfcG9zID0gX19wb3MgLSBfX2xlbi80OwotICAgICAgICBpZiAoX19idWZfc3RhcnRfcG9zICsgX19sZW4gPiBfX2xlYWZfZW5kKSB7Ci0gICAgICAgICAgX19idWZfc3RhcnRfcG9zID0gX19sZWFmX2VuZCAtIF9fbGVuOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoX19idWZfc3RhcnRfcG9zICsgX19sZW4gPiBfX2xlYWZfZW5kKSB7Ci0gICAgICAgIF9fbGVuID0gX19sZWFmX2VuZCAtIF9fYnVmX3N0YXJ0X3BvczsKLSAgICAgIH0KLSAgICAgICgqX19mbikoX19idWZfc3RhcnRfcG9zIC0gX19sZWFmX3BvcywgX19sZW4sIF9feC5fTV90bXBfYnVmLl9NX2RhdGEpOwotICAgICAgX194Ll9NX2J1Zl9wdHIgPSBfX3guX01fdG1wX2J1Zi5fTV9kYXRhICsgKF9fcG9zIC0gX19idWZfc3RhcnRfcG9zKTsKLSAgICAgIF9feC5fTV9idWZfc3RhcnQgPSBfX3guX01fdG1wX2J1Zi5fTV9kYXRhOwotICAgICAgX194Ll9NX2J1Zl9lbmQgPSBfX3guX01fdG1wX2J1Zi5fTV9kYXRhICsgX19sZW47Ci0gICAgfQotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgICAgX1NUTFBfQVNTRVJUKDApCi0gICAgICA7Ci0gIH0KLX0KLQotLy8gU2V0IHBhdGggYW5kIGJ1ZmZlciBpbnNpZGUgYSByb3BlIGl0ZXJhdG9yLiAgV2UgYXNzdW1lIHRoYXQKLS8vIHBvcyBhbmQgcm9vdCBhcmUgYWxyZWFkeSBzZXQuCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+Ci12b2lkIF9Sb3BlX2l0ZXJhdG9yX2Jhc2U8X0NoYXJULF9BbGxvYz46Ol9TX3NldGNhY2hlKAotICBfUm9wZV9pdGVyYXRvcl9iYXNlPF9DaGFyVCxfQWxsb2M+JiBfX3gpIHsKLSAgY29uc3QgX1JvcGVSZXAqIF9fcGF0aFtfUm9wZVJlcDo6X1NfbWF4X3JvcGVfZGVwdGgrMV07Ci0gIGNvbnN0IF9Sb3BlUmVwKiBfX2N1cnJfcm9wZTsKLSAgaW50IF9fY3Vycl9kZXB0aCA9IC0xOyAgLyogaW5kZXggaW50byBwYXRoICAgICovCi0gIHNpemVfdCBfX2N1cnJfc3RhcnRfcG9zID0gMDsKLSAgc2l6ZV90IF9fcG9zID0gX194Ll9NX2N1cnJlbnRfcG9zOwotICB1bnNpZ25lZCBjaGFyIF9fZGlybnMgPSAwOyAvLyBCaXQgdmVjdG9yIG1hcmtpbmcgcmlnaHQgdHVybnMgaW4gdGhlIHBhdGgKLQotICBfU1RMUF9BU1NFUlQoX19wb3MgPD0gX194Ll9NX3Jvb3QtPl9NX3NpemUuX01fZGF0YSkKLSAgaWYgKF9fcG9zID49IF9feC5fTV9yb290LT5fTV9zaXplLl9NX2RhdGEpIHsKLSAgICBfX3guX01fYnVmX3B0ciA9IDA7Ci0gICAgcmV0dXJuOwotICB9Ci0gIF9fY3Vycl9yb3BlID0gX194Ll9NX3Jvb3Q7Ci0gIGlmICgwICE9IF9fY3Vycl9yb3BlLT5fTV9jX3N0cmluZykgewotICAgIC8qIFRyZWF0IHRoZSByb290IGFzIGEgbGVhZi4gKi8KLSAgICBfX3guX01fYnVmX3N0YXJ0ID0gX19jdXJyX3JvcGUtPl9NX2Nfc3RyaW5nOwotICAgIF9feC5fTV9idWZfZW5kID0gX19jdXJyX3JvcGUtPl9NX2Nfc3RyaW5nICsgX19jdXJyX3JvcGUtPl9NX3NpemUuX01fZGF0YTsKLSAgICBfX3guX01fYnVmX3B0ciA9IF9fY3Vycl9yb3BlLT5fTV9jX3N0cmluZyArIF9fcG9zOwotICAgIF9feC5fTV9wYXRoX2VuZC5fTV9kYXRhWzBdID0gX19jdXJyX3JvcGU7Ci0gICAgX194Ll9NX2xlYWZfaW5kZXggPSAwOwotICAgIF9feC5fTV9sZWFmX3BvcyA9IDA7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGZvcig7OykgewotICAgICsrX19jdXJyX2RlcHRoOwotICAgIF9TVExQX0FTU0VSVChfX2N1cnJfZGVwdGggPD0gX1JvcGVSZXA6Ol9TX21heF9yb3BlX2RlcHRoKQotICAgIF9fcGF0aFtfX2N1cnJfZGVwdGhdID0gX19jdXJyX3JvcGU7Ci0gICAgc3dpdGNoKF9fY3Vycl9yb3BlLT5fTV90YWcpIHsKLSAgICBjYXNlIF9Sb3BlUmVwOjpfU19sZWFmOgotICAgIGNhc2UgX1JvcGVSZXA6Ol9TX2Z1bmN0aW9uOgotICAgIGNhc2UgX1JvcGVSZXA6Ol9TX3N1YnN0cmluZ2ZuOgotICAgICAgX194Ll9NX2xlYWZfcG9zID0gX19jdXJyX3N0YXJ0X3BvczsKLSAgICAgIGdvdG8gZG9uZTsKLSAgICBjYXNlIF9Sb3BlUmVwOjpfU19jb25jYXQ6Ci0gICAgICB7Ci0gICAgICAgIGNvbnN0IF9Sb3BlQ29uY2F0KiBfX2MgPSBfX1NUQVRJQ19DQVNUKGNvbnN0IF9Sb3BlQ29uY2F0KiwgX19jdXJyX3JvcGUpOwotICAgICAgICBfUm9wZVJlcCogX19sZWZ0ID0gX19jLT5fTV9sZWZ0OwotICAgICAgICBzaXplX3QgX19sZWZ0X2xlbiA9IF9fbGVmdC0+X01fc2l6ZS5fTV9kYXRhOwotCi0gICAgICAgIF9fZGlybnMgPDw9IDE7Ci0gICAgICAgIGlmIChfX3BvcyA+PSBfX2N1cnJfc3RhcnRfcG9zICsgX19sZWZ0X2xlbikgewotICAgICAgICAgIF9fZGlybnMgfD0gMTsKLSAgICAgICAgICBfX2N1cnJfcm9wZSA9IF9fYy0+X01fcmlnaHQ7Ci0gICAgICAgICAgX19jdXJyX3N0YXJ0X3BvcyArPSBfX2xlZnRfbGVuOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIF9fY3Vycl9yb3BlID0gX19sZWZ0OwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLWRvbmU6Ci0gICAgLy8gQ29weSBsYXN0IHNlY3Rpb24gb2YgcGF0aCBpbnRvIF9NX3BhdGhfZW5kLgotICB7Ci0gICAgaW50IF9faSA9IC0xOwotICAgIGludCBfX2ogPSBfX2N1cnJfZGVwdGggKyAxIC0gX1NfcGF0aF9jYWNoZV9sZW47Ci0KLSAgICBpZiAoX19qIDwgMCkgX19qID0gMDsKLSAgICB3aGlsZSAoX19qIDw9IF9fY3Vycl9kZXB0aCkgewotICAgICAgX194Ll9NX3BhdGhfZW5kLl9NX2RhdGFbKytfX2ldID0gX19wYXRoW19faisrXTsKLSAgICB9Ci0gICAgX194Ll9NX2xlYWZfaW5kZXggPSBfX2k7Ci0gIH0KLSAgX194Ll9NX3BhdGhfZGlyZWN0aW9ucyA9IF9fZGlybnM7Ci0gIF9TX3NldGJ1ZihfX3gpOwotfQotCi0vLyBTcGVjaWFsaXplZCB2ZXJzaW9uIG9mIHRoZSBhYm92ZS4gIEFzc3VtZXMgdGhhdAotLy8gdGhlIHBhdGggY2FjaGUgaXMgdmFsaWQgZm9yIHRoZSBwcmV2aW91cyBwb3NpdGlvbi4KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KLXZvaWQgX1JvcGVfaXRlcmF0b3JfYmFzZTxfQ2hhclQsX0FsbG9jPjo6X1Nfc2V0Y2FjaGVfZm9yX2luY3IoCi1fUm9wZV9pdGVyYXRvcl9iYXNlPF9DaGFyVCxfQWxsb2M+JiBfX3gpIHsKLSAgaW50IF9fY3VycmVudF9pbmRleCA9IF9feC5fTV9sZWFmX2luZGV4OwotICBjb25zdCBfUm9wZVJlcCogX19jdXJyZW50X25vZGUgPSBfX3guX01fcGF0aF9lbmQuX01fZGF0YVtfX2N1cnJlbnRfaW5kZXhdOwotICBzaXplX3QgX19sZW4gPSBfX2N1cnJlbnRfbm9kZS0+X01fc2l6ZS5fTV9kYXRhOwotICBzaXplX3QgX19ub2RlX3N0YXJ0X3BvcyA9IF9feC5fTV9sZWFmX3BvczsKLSAgdW5zaWduZWQgY2hhciBfX2Rpcm5zID0gX194Ll9NX3BhdGhfZGlyZWN0aW9uczsKLSAgY29uc3QgX1JvcGVDb25jYXQqIF9fYzsKLQotICBfU1RMUF9BU1NFUlQoX194Ll9NX2N1cnJlbnRfcG9zIDw9IF9feC5fTV9yb290LT5fTV9zaXplLl9NX2RhdGEpCi0gIGlmIChfX3guX01fY3VycmVudF9wb3MgLSBfX25vZGVfc3RhcnRfcG9zIDwgX19sZW4pIHsKLSAgICAvKiBNb3JlIHN0dWZmIGluIHRoaXMgbGVhZiwgd2UganVzdCBkaWRuJ3QgY2FjaGUgaXQuICovCi0gICAgX1Nfc2V0YnVmKF9feCk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIF9TVExQX0FTU0VSVChfX25vZGVfc3RhcnRfcG9zICsgX19sZW4gPT0gX194Ll9NX2N1cnJlbnRfcG9zKQotICAgIC8vICBub2RlX3N0YXJ0X3BvcyBpcyBzdGFydGluZyBwb3NpdGlvbiBvZiBsYXN0X25vZGUuCi0gIHdoaWxlICgtLV9fY3VycmVudF9pbmRleCA+PSAwKSB7Ci0gICAgaWYgKCEoX19kaXJucyAmIDEpIC8qIFBhdGggdHVybmVkIGxlZnQgKi8pCi0gICAgICBicmVhazsKLSAgICBfX2N1cnJlbnRfbm9kZSA9IF9feC5fTV9wYXRoX2VuZC5fTV9kYXRhW19fY3VycmVudF9pbmRleF07Ci0gICAgX19jID0gX19TVEFUSUNfQ0FTVChjb25zdCBfUm9wZUNvbmNhdCosIF9fY3VycmVudF9ub2RlKTsKLSAgICAvLyBPdGhlcndpc2Ugd2Ugd2VyZSBpbiB0aGUgcmlnaHQgY2hpbGQuICBUaHVzIHdlIHNob3VsZCBwb3AKLSAgICAvLyB0aGUgY29uY2F0ZW5hdGlvbiBub2RlLgotICAgIF9fbm9kZV9zdGFydF9wb3MgLT0gX19jLT5fTV9sZWZ0LT5fTV9zaXplLl9NX2RhdGE7Ci0gICAgX19kaXJucyA+Pj0gMTsKLSAgfQotICBpZiAoX19jdXJyZW50X2luZGV4IDwgMCkgewotICAgIC8vIFdlIHVuZGVyZmxvd2VkIHRoZSBjYWNoZS4gUHVudC4KLSAgICBfU19zZXRjYWNoZShfX3gpOwotICAgIHJldHVybjsKLSAgfQotICBfX2N1cnJlbnRfbm9kZSA9IF9feC5fTV9wYXRoX2VuZC5fTV9kYXRhW19fY3VycmVudF9pbmRleF07Ci0gIF9fYyA9IF9fU1RBVElDX0NBU1QoY29uc3QgX1JvcGVDb25jYXQqLCBfX2N1cnJlbnRfbm9kZSk7Ci0gIC8vIGN1cnJlbnRfbm9kZSBpcyBhIGNvbmNhdGVuYXRpb24gbm9kZS4gIFdlIGFyZSBwb3NpdGlvbmVkIG9uIHRoZSBmaXJzdAotICAvLyBjaGFyYWN0ZXIgaW4gaXRzIHJpZ2h0IGNoaWxkLgotICAvLyBub2RlX3N0YXJ0X3BvcyBpcyBzdGFydGluZyBwb3NpdGlvbiBvZiBjdXJyZW50X25vZGUuCi0gIF9fbm9kZV9zdGFydF9wb3MgKz0gX19jLT5fTV9sZWZ0LT5fTV9zaXplLl9NX2RhdGE7Ci0gIF9fY3VycmVudF9ub2RlID0gX19jLT5fTV9yaWdodDsKLSAgX194Ll9NX3BhdGhfZW5kLl9NX2RhdGFbKytfX2N1cnJlbnRfaW5kZXhdID0gX19jdXJyZW50X25vZGU7Ci0gIF9fZGlybnMgfD0gMTsKLSAgd2hpbGUgKF9Sb3BlUmVwOjpfU19jb25jYXQgPT0gX19jdXJyZW50X25vZGUtPl9NX3RhZykgewotICAgICsrX19jdXJyZW50X2luZGV4OwotICAgIGlmIChfU19wYXRoX2NhY2hlX2xlbiA9PSBfX2N1cnJlbnRfaW5kZXgpIHsKLSAgICAgIGludCBfX2k7Ci0gICAgICBmb3IgKF9faSA9IDA7IF9faSA8IF9TX3BhdGhfY2FjaGVfbGVuLTE7ICsrX19pKSB7Ci0gICAgICAgIF9feC5fTV9wYXRoX2VuZC5fTV9kYXRhW19faV0gPSBfX3guX01fcGF0aF9lbmQuX01fZGF0YVtfX2krMV07Ci0gICAgICB9Ci0gICAgICAtLV9fY3VycmVudF9pbmRleDsKLSAgICB9Ci0gICAgX19jdXJyZW50X25vZGUgPSBfX1NUQVRJQ19DQVNUKGNvbnN0IF9Sb3BlQ29uY2F0KiwgX19jdXJyZW50X25vZGUpLT5fTV9sZWZ0OwotICAgIF9feC5fTV9wYXRoX2VuZC5fTV9kYXRhW19fY3VycmVudF9pbmRleF0gPSBfX2N1cnJlbnRfbm9kZTsKLSAgICBfX2Rpcm5zIDw8PSAxOwotICAgIC8vIG5vZGVfc3RhcnRfcG9zIGlzIHVuY2hhbmdlZC4KLSAgfQotICBfX3guX01fbGVhZl9pbmRleCA9IF9fY3VycmVudF9pbmRleDsKLSAgX194Ll9NX2xlYWZfcG9zID0gX19ub2RlX3N0YXJ0X3BvczsKLSAgX194Ll9NX3BhdGhfZGlyZWN0aW9ucyA9IF9fZGlybnM7Ci0gIF9TX3NldGJ1ZihfX3gpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+Ci12b2lkIF9Sb3BlX2l0ZXJhdG9yX2Jhc2U8X0NoYXJULF9BbGxvYz46Ol9NX2luY3Ioc2l6ZV90IF9fbikgewotICBfTV9jdXJyZW50X3BvcyArPSBfX247Ci0gIGlmICgwICE9IF9NX2J1Zl9wdHIpIHsKLSAgICBzaXplX3QgX19jaGFyc19sZWZ0ID0gX01fYnVmX2VuZCAtIF9NX2J1Zl9wdHI7Ci0gICAgaWYgKF9fY2hhcnNfbGVmdCA+IF9fbikgewotICAgICAgX01fYnVmX3B0ciArPSBfX247Ci0gICAgfSBlbHNlIGlmIChfX2NoYXJzX2xlZnQgPT0gX19uKSB7Ci0gICAgICBfTV9idWZfcHRyICs9IF9fbjsKLSAgICAgIF9TX3NldGNhY2hlX2Zvcl9pbmNyKCp0aGlzKTsKLSAgICB9IGVsc2UgewotICAgICAgX01fYnVmX3B0ciA9IDA7Ci0gICAgfQotICB9Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KLXZvaWQgX1JvcGVfaXRlcmF0b3JfYmFzZTxfQ2hhclQsX0FsbG9jPjo6X01fZGVjcihzaXplX3QgX19uKSB7Ci0gIGlmICgwICE9IF9NX2J1Zl9wdHIpIHsKLSAgICBzaXplX3QgX19jaGFyc19sZWZ0ID0gX01fYnVmX3B0ciAtIF9NX2J1Zl9zdGFydDsKLSAgICBpZiAoX19jaGFyc19sZWZ0ID49IF9fbikgewotICAgICAgX01fYnVmX3B0ciAtPSBfX247Ci0gICAgfSBlbHNlIHsKLSAgICAgIF9NX2J1Zl9wdHIgPSAwOwotICAgIH0KLSAgfQotICBfTV9jdXJyZW50X3BvcyAtPSBfX247Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KLXZvaWQgX1JvcGVfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz46Ol9NX2NoZWNrKCkgewotICBpZiAoX01fcm9vdF9yb3BlLT5fTV90cmVlX3B0ci5fTV9kYXRhICE9IHRoaXMtPl9NX3Jvb3QpIHsKLSAgICAvLyBfUm9wZSB3YXMgbW9kaWZpZWQuICBHZXQgdGhpbmdzIGZpeGVkIHVwLgotICAgIF9Sb3BlUmVwOjpfU191bnJlZih0aGlzLT5fTV9yb290KTsKLSAgICB0aGlzLT5fTV9yb290ID0gX01fcm9vdF9yb3BlLT5fTV90cmVlX3B0ci5fTV9kYXRhOwotICAgIF9Sb3BlUmVwOjpfU19yZWYodGhpcy0+X01fcm9vdCk7Ci0gICAgdGhpcy0+X01fYnVmX3B0ciA9IDA7Ci0gIH0KLX0KLQotLy8gIFRoZXJlIGFyZSBzZXZlcmFsIHJlYXNvbnMgZm9yIG5vdCBkb2luZyB0aGlzIHdpdGggdmlydHVhbCBkZXN0cnVjdG9ycwotLy8gIGFuZCBhIGNsYXNzIHNwZWNpZmljIGRlbGV0ZSBvcGVyYXRvcjoKLS8vICAtIEEgY2xhc3Mgc3BlY2lmaWMgZGVsZXRlIG9wZXJhdG9yIGNhbid0IGVhc2lseSBnZXQgYWNjZXNzIHRvCi0vLyAgICBhbGxvY2F0b3IgaW5zdGFuY2VzIGlmIHdlIG5lZWQgdGhlbS4KLS8vICAtIEFueSB2aXJ0dWFsIGZ1bmN0aW9uIHdvdWxkIG5lZWQgYSA0IG9yIGJ5dGUgdnRhYmxlIHBvaW50ZXI7Ci0vLyAgICB0aGlzIG9ubHkgcmVxdWlyZXMgYSBvbmUgYnl0ZSB0YWcgcGVyIG9iamVjdC4KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KLXZvaWQgX1JvcGVfUm9wZVJlcDxfQ2hhclQsX0FsbG9jPjo6X01fZnJlZV90cmVlKCkgewotICBzd2l0Y2ggKF9NX3RhZykgewotICBjYXNlIF9TX2xlYWY6Ci0gICAgewotICAgICAgdHlwZWRlZiBfUm9wZV9Sb3BlTGVhZjxfQ2hhclQsIF9BbGxvYz4gX1JvcGVMZWFmOwotICAgICAgX1JvcGVMZWFmKiBfX2wgPSBfX1NUQVRJQ19DQVNUKF9Sb3BlTGVhZiosIHRoaXMpOwotICAgICAgX1NUTFBfU1REOjpfRGVzdHJveShfX2wpOyAvLyAtPl9Sb3BlX1JvcGVMZWFmPF9DaGFyVCxfQWxsb2M+Ojp+X1JvcGVfUm9wZUxlYWYoKTsKLSAgICAgIF9TVExQX0NSRUFURV9BTExPQ0FUT1IoYWxsb2NhdG9yX3R5cGUsKGNvbnN0IGFsbG9jYXRvcl90eXBlJilfTV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUm9wZUxlYWYpLmRlYWxsb2NhdGUoX19sLCAxKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgY2FzZSBfU19jb25jYXQ6Ci0gICAgewotICAgICAgdHlwZWRlZiBfUm9wZV9Sb3BlQ29uY2F0ZW5hdGlvbjxfQ2hhclQsIF9BbGxvYz4gX1JvcGVDb25jYXRlbmF0aW9uOwotICAgICAgX1JvcGVDb25jYXRlbmF0aW9uKiBfX2MgID0gX19TVEFUSUNfQ0FTVChfUm9wZUNvbmNhdGVuYXRpb24qLCB0aGlzKTsKLSAgICAgIF9TVExQX1NURDo6X0Rlc3Ryb3koX19jKTsKLSAgICAgIF9TVExQX0NSRUFURV9BTExPQ0FUT1IoYWxsb2NhdG9yX3R5cGUsKGNvbnN0IGFsbG9jYXRvcl90eXBlJilfTV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUm9wZUNvbmNhdGVuYXRpb24pLmRlYWxsb2NhdGUoX19jLCAxKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgY2FzZSBfU19mdW5jdGlvbjoKLSAgICB7Ci0gICAgICB0eXBlZGVmIF9Sb3BlX1JvcGVGdW5jdGlvbjxfQ2hhclQsIF9BbGxvYz4gX1JvcGVGdW5jdGlvbjsKLSAgICAgIF9Sb3BlRnVuY3Rpb24qIF9fZiA9IF9fU1RBVElDX0NBU1QoX1JvcGVGdW5jdGlvbiosIHRoaXMpOwotICAgICAgX1NUTFBfU1REOjpfRGVzdHJveShfX2YpOwotICAgICAgX1NUTFBfQ1JFQVRFX0FMTE9DQVRPUihhbGxvY2F0b3JfdHlwZSwgKGNvbnN0IGFsbG9jYXRvcl90eXBlJilfTV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUm9wZUZ1bmN0aW9uKS5kZWFsbG9jYXRlKF9fZiwgMSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIGNhc2UgX1Nfc3Vic3RyaW5nZm46Ci0gICAgewotICAgICAgdHlwZWRlZiBfUm9wZV9Sb3BlU3Vic3RyaW5nPF9DaGFyVCwgX0FsbG9jPiBfUm9wZVN1YnN0cmluZzsKLSAgICAgIF9Sb3BlU3Vic3RyaW5nKiBfX3JzcyA9IF9fU1RBVElDX0NBU1QoX1JvcGVTdWJzdHJpbmcqLCB0aGlzKTsKLSAgICAgIF9TVExQX1NURDo6X0Rlc3Ryb3koX19yc3MpOwotICAgICAgX1NUTFBfQ1JFQVRFX0FMTE9DQVRPUihhbGxvY2F0b3JfdHlwZSwgKGNvbnN0IGFsbG9jYXRvcl90eXBlJilfTV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUm9wZVN1YnN0cmluZykuZGVhbGxvY2F0ZShfX3JzcywgMSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLX0KLQotIyBpZiBkZWZpbmVkICggX1NUTFBfTkVTVEVEX1RZUEVfUEFSQU1fQlVHICkKLSMgICBkZWZpbmUgX19Sb3BlTGVhZl9fIF9Sb3BlX1JvcGVMZWFmPF9DaGFyVCxfQWxsb2M+Ci0jICAgZGVmaW5lIF9fUm9wZVJlcF9fIF9Sb3BlX1JvcGVSZXA8X0NoYXJULF9BbGxvYz4KLSMgICBkZWZpbmUgX1JvcGVMZWFmIF9Sb3BlX1JvcGVMZWFmPF9DaGFyVCxfQWxsb2M+Ci0jICAgZGVmaW5lIF9Sb3BlUmVwIF9Sb3BlX1JvcGVSZXA8X0NoYXJULF9BbGxvYz4KLSMgICBkZWZpbmUgc2l6ZV90eXBlIHNpemVfdAotIyBlbHNlCi0jICAgZGVmaW5lIF9fUm9wZUxlYWZfXyBfU1RMUF9UWVBFTkFNRV9PTl9SRVRVUk5fVFlQRSByb3BlPF9DaGFyVCxfQWxsb2M+OjpfUm9wZUxlYWYKLSMgICBkZWZpbmUgX19Sb3BlUmVwX18gX1NUTFBfVFlQRU5BTUVfT05fUkVUVVJOX1RZUEUgcm9wZTxfQ2hhclQsX0FsbG9jPjo6X1JvcGVSZXAKLSMgZW5kaWYKLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgotdm9pZCByb3BlPF9DaGFyVCwgX0FsbG9jPjo6X01fdGhyb3dfb3V0X29mX3JhbmdlKCkgY29uc3QgewotICBfX3N0bF90aHJvd19vdXRfb2ZfcmFuZ2UoInJvcGUiKTsKLX0KLQotLy8gQ29uY2F0ZW5hdGUgYSBDIHN0cmluZyBvbnRvIGEgbGVhZiByb3BlIGJ5IGNvcHlpbmcgdGhlIHJvcGUgZGF0YS4KLS8vIFVzZWQgZm9yIHNob3J0IHJvcGVzLgotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgotX19Sb3BlTGVhZl9fKgotcm9wZTxfQ2hhclQsX0FsbG9jPjo6X1NfbGVhZl9jb25jYXRfY2hhcl9pdGVyICgKLSAgX1JvcGVMZWFmKiBfX3IsIGNvbnN0IF9DaGFyVCogX19pdGVyLCBzaXplX3QgX19sZW4pIHsKLSAgc2l6ZV90IF9fb2xkX2xlbiA9IF9fci0+X01fc2l6ZS5fTV9kYXRhOwotICBfQ2hhclQqIF9fbmV3X2RhdGEgPSBfX3ItPl9NX3NpemUuYWxsb2NhdGUoX1Nfcm91bmRlZF91cF9zaXplKF9fb2xkX2xlbiArIF9fbGVuKSk7Ci0gIF9Sb3BlTGVhZiogX19yZXN1bHQ7Ci0KLSAgX1NUTFBfUFJJViBfX3Vjb3B5X24oX19yLT5fTV9kYXRhLCBfX29sZF9sZW4sIF9fbmV3X2RhdGEpOwotICBfU1RMUF9QUklWIF9fdWNvcHlfbihfX2l0ZXIsIF9fbGVuLCBfX25ld19kYXRhICsgX19vbGRfbGVuKTsKLSAgX1NfY29uc3RydWN0X251bGwoX19uZXdfZGF0YSArIF9fb2xkX2xlbiArIF9fbGVuKTsKLSAgX1NUTFBfVFJZIHsKLSAgICBfX3Jlc3VsdCA9IF9TX25ld19Sb3BlTGVhZihfX25ld19kYXRhLCBfX29sZF9sZW4gKyBfX2xlbiwgX19yLT5nZXRfYWxsb2NhdG9yKCkpOwotICB9Ci0gIF9TVExQX1VOV0lORChfUm9wZVJlcDo6X1NfZnJlZV9zdHJpbmcoX19uZXdfZGF0YSwgX19vbGRfbGVuICsgX19sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19yLT5nZXRfYWxsb2NhdG9yKCkpKQotICByZXR1cm4gX19yZXN1bHQ7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KLXZvaWQgX1Rlcm1pbmF0ZV9Sb3BlTGVhZihfUm9wZV9Sb3BlTGVhZjxfQ2hhclQsX0FsbG9jPiAqX19yLAotICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBfX3NpemUsIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKmJhc2ljIGNoYXIgdHlwZSovKSB7Ci0gIF9TX2NvbnN0cnVjdF9udWxsKF9fci0+X01fZGF0YSArIF9fc2l6ZSk7Ci0gIF9TVExQX0FTU0VSVChfX3ItPl9NX2Nfc3RyaW5nID09IF9fci0+X01fZGF0YSkKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgotdm9pZCBfVGVybWluYXRlX1JvcGVMZWFmKF9Sb3BlX1JvcGVMZWFmPF9DaGFyVCxfQWxsb2M+ICpfX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90LCBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qYmFzaWMgY2hhciB0eXBlKi8pIHsKLSAgaWYgKF9fci0+X01fY19zdHJpbmcgIT0gX19yLT5fTV9kYXRhICYmIDAgIT0gX19yLT5fTV9jX3N0cmluZykgewotICAgIF9fci0+X01fZnJlZV9jX3N0cmluZygpOwotICAgIF9fci0+X01fY19zdHJpbmcgPSAwOwotICB9Ci19Ci0KLS8vIEFzIGFib3ZlLCBidXQgaXQncyBPSyB0byBjbG9iYmVyIG9yaWdpbmFsIGlmIHJlZmNvdW50IGlzIDEKLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KLV9fUm9wZUxlYWZfXyoKLXJvcGU8X0NoYXJULF9BbGxvYz46Ol9TX2Rlc3RyX2xlYWZfY29uY2F0X2NoYXJfaXRlciAoX1JvcGVMZWFmKiBfX3IsIGNvbnN0IF9DaGFyVCogX19pdGVyLCBzaXplX3QgX19sZW4pIHsKLSAgLy9fU1RMUF9BU1NFUlQoX19yLT5fTV9yZWZfY291bnQgPj0gMSkKLSAgaWYgKCAvKiBfX3ItPl9NX3JlZl9jb3VudCA+IDEgKi8gIF9fci0+X01faW5jcigpID4gMiApIHsgLy8gLSBwdHIKLSAgICBfX3ItPl9NX2RlY3IoKTsgLy8gLSBwdHIKLSAgICByZXR1cm4gX1NfbGVhZl9jb25jYXRfY2hhcl9pdGVyKF9fciwgX19pdGVyLCBfX2xlbik7Ci0gIH0KLSAgX19yLT5fTV9kZWNyKCk7IC8vIC0gcHRyLCBfX3ItPl9NX3JlZl9jb3VudCA9PSAxIG9yIDAKLSAgc2l6ZV90IF9fb2xkX2xlbiA9IF9fci0+X01fc2l6ZS5fTV9kYXRhOwotICBpZiAoX1Nfcm91bmRlZF91cF9zaXplKF9fb2xkX2xlbikgPT0gX1Nfcm91bmRlZF91cF9zaXplKF9fb2xkX2xlbiArIF9fbGVuKSkgewotICAgIC8vIFRoZSBzcGFjZSBoYXMgYmVlbiBwYXJ0aWFsbHkgaW5pdGlhbGl6ZWQgZm9yIHRoZSBzdGFuZGFyZAotICAgIC8vIGNoYXJhY3RlciB0eXBlcy4gIEJ1dCB0aGF0IGRvZXNuJ3QgbWF0dGVyIGZvciB0aG9zZSB0eXBlcy4KLSAgICBfU1RMUF9QUklWIF9fdWNvcHlfbihfX2l0ZXIsIF9fbGVuLCBfX3ItPl9NX2RhdGEgKyBfX29sZF9sZW4pOwotICAgIF9UZXJtaW5hdGVfUm9wZUxlYWYoX19yLCBfX29sZF9sZW4gKyBfX2xlbiwgX0lzQmFzaWNDaGFyVHlwZSgpKTsKLSAgICBfX3ItPl9NX3NpemUuX01fZGF0YSA9IF9fb2xkX2xlbiArIF9fbGVuOwotICAgIC8vIF9TVExQX0FTU0VSVChfX3ItPl9NX3JlZl9jb3VudCA9PSAxKQotICAgIC8vIF9fci0+X01fcmVmX2NvdW50ID0gMjsKLSAgICBfX3ItPl9NX2luY3IoKTsgLy8gaS5lLiAgX19yLT5fTV9yZWZfY291bnQgPSAyCi0gICAgcmV0dXJuIF9fcjsKLSAgfSBlbHNlIHsKLSAgICBfUm9wZUxlYWYqIF9fcmVzdWx0ID0gX1NfbGVhZl9jb25jYXRfY2hhcl9pdGVyKF9fciwgX19pdGVyLCBfX2xlbik7Ci0gICAgLy9fU1RMUF9BU1NFUlQoX19yZXN1bHQtPl9NX3JlZl9jb3VudCA9PSAxKQotICAgIHJldHVybiBfX3Jlc3VsdDsKLSAgfQotfQotCi0vLyBBc3N1bWVzIGxlZnQgYW5kIHJpZ2h0IGFyZSBub3QgMC4KLS8vIERvZXMgbm90IGluY3JlbWVudCAobm9yIGRlY3JlbWVudCBvbiBleGNlcHRpb24pIGNoaWxkIHJlZmVyZW5jZSBjb3VudHMuCi0vLyBSZXN1bHQgaGFzIHJlZiBjb3VudCAxLgotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgotX19Sb3BlUmVwX18qCi1yb3BlPF9DaGFyVCxfQWxsb2M+OjpfU190cmVlX2NvbmNhdCAoX1JvcGVSZXAqIF9fbGVmdCwgX1JvcGVSZXAqIF9fcmlnaHQpIHsKLSAgX1JvcGVDb25jYXRlbmF0aW9uKiBfX3Jlc3VsdCA9Ci0gICAgX1NfbmV3X1JvcGVDb25jYXRlbmF0aW9uKF9fbGVmdCwgX19yaWdodCwgX19sZWZ0LT5nZXRfYWxsb2NhdG9yKCkpOwotICBzaXplX3QgX19kZXB0aCA9IF9fcmVzdWx0LT5fTV9kZXB0aDsKLQotICBfU1RMUF9BU1NFUlQoX19sZWZ0LT5nZXRfYWxsb2NhdG9yKCkgPT0gX19yaWdodC0+Z2V0X2FsbG9jYXRvcigpKQotICBpZiAoX19kZXB0aCA+IDIwICYmIChfX3Jlc3VsdC0+X01fc2l6ZS5fTV9kYXRhIDwgMTAwMCB8fAotICAgICAgX19kZXB0aCA+IF9Sb3BlUmVwOjpfU19tYXhfcm9wZV9kZXB0aCkpIHsKLSAgICBfUm9wZVJlcCogX19iYWxhbmNlZDsKLQotICAgIF9TVExQX1RSWSB7Ci0gICAgICBfX2JhbGFuY2VkID0gX1NfYmFsYW5jZShfX3Jlc3VsdCk7Ci0gICAgIC8vIF9TVExQX0FTU0VSVChfX3Jlc3VsdCA9PSBfX2JhbGFuY2VkIHx8Ci0gICAgIC8vICAgICAgICAgICAgICAxID09IF9fcmVzdWx0LT5fTV9yZWZfY291bnQgJiYKLSAgICAgLy8gICAgICAgICAgICAgIDEgPT0gX19iYWxhbmNlZC0+X01fcmVmX2NvdW50KQotICAgICAgX19yZXN1bHQtPl9NX3VucmVmX25vbm5pbCgpOwotICAgIH0KLSAgICBfU1RMUF9VTldJTkQoKF9TVExQX0NSRUFURV9BTExPQ0FUT1IoYWxsb2NhdG9yX3R5cGUsKGFsbG9jYXRvcl90eXBlJilfX2xlZnQtPl9NX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Sb3BlQ29uY2F0ZW5hdGlvbikuZGVhbGxvY2F0ZShfX3Jlc3VsdCwxKSkpCi0gICAgLy8gSW4gY2FzZSBvZiBleGNlcHRpb24sIHdlIG5lZWQgdG8gZGVhbGxvY2F0ZQotICAgIC8vIG90aGVyd2lzZSBkYW5nbGluZyByZXN1bHQgbm9kZS4gIEJ1dCBjYWxsZXIKLSAgICAvLyBzdGlsbCBvd25zIGl0cyBjaGlsZHJlbi4gIFRodXMgdW5yZWYgaXMKLSAgICAvLyBpbmFwcHJvcHJpYXRlLgotICAgIHJldHVybiBfX2JhbGFuY2VkOwotICB9IGVsc2UgewotICAgIHJldHVybiBfX3Jlc3VsdDsKLSAgfQotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+Ci1fX1JvcGVSZXBfXyoKLXJvcGU8X0NoYXJULF9BbGxvYz46Ol9TX2NvbmNhdF9jaGFyX2l0ZXIgKF9Sb3BlUmVwKiBfX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfQ2hhclQqX19zLCBzaXplX3QgX19zbGVuKSB7Ci0gIF9Sb3BlUmVwKiBfX3Jlc3VsdDsKLSAgaWYgKDAgPT0gX19zbGVuKSB7Ci0gICAgX1NfcmVmKF9fcik7Ci0gICAgcmV0dXJuIF9fcjsKLSAgfQotICBpZiAoMCA9PSBfX3IpCi0gICAgcmV0dXJuIF9TX1JvcGVMZWFmX2Zyb21fdW5vd25lZF9jaGFyX3B0cihfX3MsIF9fc2xlbiwgX19yLT5nZXRfYWxsb2NhdG9yKCkpOwotICBpZiAoX1JvcGVSZXA6Ol9TX2xlYWYgPT0gX19yLT5fTV90YWcgJiYKLSAgICAgIF9fci0+X01fc2l6ZS5fTV9kYXRhICsgX19zbGVuIDw9IF9TX2NvcHlfbWF4KSB7Ci0gICAgX19yZXN1bHQgPSBfU19sZWFmX2NvbmNhdF9jaGFyX2l0ZXIoKF9Sb3BlTGVhZiopX19yLCBfX3MsIF9fc2xlbik7Ci0gICAgLy8gX1NUTFBfQVNTRVJUKDEgPT0gX19yZXN1bHQtPl9NX3JlZl9jb3VudCkKLSAgICByZXR1cm4gX19yZXN1bHQ7Ci0gIH0KLSAgaWYgKF9Sb3BlUmVwOjpfU19jb25jYXQgPT0gX19yLT5fTV90YWcgJiYKLSAgICAgIF9Sb3BlUmVwOjpfU19sZWFmID09ICgoX1JvcGVDb25jYXRlbmF0aW9uKilfX3IpLT5fTV9yaWdodC0+X01fdGFnKSB7Ci0gICAgX1JvcGVMZWFmKiBfX3JpZ2h0ID0gKF9Sb3BlTGVhZiogKSgoKF9Sb3BlQ29uY2F0ZW5hdGlvbiogKV9fciktPl9NX3JpZ2h0KTsKLSAgICBpZiAoX19yaWdodC0+X01fc2l6ZS5fTV9kYXRhICsgX19zbGVuIDw9IF9TX2NvcHlfbWF4KSB7Ci0gICAgICBfUm9wZVJlcCogX19sZWZ0ID0gKChfUm9wZUNvbmNhdGVuYXRpb24qKV9fciktPl9NX2xlZnQ7Ci0gICAgICBfUm9wZVJlcCogX19ucmlnaHQgPSBfU19sZWFmX2NvbmNhdF9jaGFyX2l0ZXIoKF9Sb3BlTGVhZiopX19yaWdodCwgX19zLCBfX3NsZW4pOwotICAgICAgX19sZWZ0LT5fTV9yZWZfbm9ubmlsKCk7Ci0gICAgICBfU1RMUF9UUlkgewotICAgICAgICBfX3Jlc3VsdCA9IF9TX3RyZWVfY29uY2F0KF9fbGVmdCwgX19ucmlnaHQpOwotICAgICAgfQotICAgICAgX1NUTFBfVU5XSU5EKF9TX3VucmVmKF9fbGVmdCk7IF9TX3VucmVmKF9fbnJpZ2h0KSkKLSAgICAgIC8vIF9TVExQX0FTU0VSVCgxID09IF9fcmVzdWx0LT5fTV9yZWZfY291bnQpCi0gICAgICByZXR1cm4gX19yZXN1bHQ7Ci0gICAgfQotICB9Ci0gIF9Sb3BlUmVwKiBfX25yaWdodCA9Ci0gICAgX1NfUm9wZUxlYWZfZnJvbV91bm93bmVkX2NoYXJfcHRyKF9fcywgX19zbGVuLCBfX3ItPmdldF9hbGxvY2F0b3IoKSk7Ci0gIF9TVExQX1RSWSB7Ci0gICAgX19yLT5fTV9yZWZfbm9ubmlsKCk7Ci0gICAgX19yZXN1bHQgPSBfU190cmVlX2NvbmNhdChfX3IsIF9fbnJpZ2h0KTsKLSAgfQotICBfU1RMUF9VTldJTkQoX1NfdW5yZWYoX19yKTsgX1NfdW5yZWYoX19ucmlnaHQpKQotICAvLyBfU1RMUF9BU1NFUlQoMSA9PSBfX3Jlc3VsdC0+X01fcmVmX2NvdW50KQotICByZXR1cm4gX19yZXN1bHQ7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KLV9fUm9wZVJlcF9fKgotcm9wZTxfQ2hhclQsX0FsbG9jPjo6X1NfZGVzdHJfY29uY2F0X2NoYXJfaXRlcigKLSAgX1JvcGVSZXAqIF9fciwgY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdCBfX3NsZW4pIHsKLSAgX1JvcGVSZXAqIF9fcmVzdWx0OwotICBpZiAoMCA9PSBfX3IpCi0gICAgcmV0dXJuIF9TX1JvcGVMZWFmX2Zyb21fdW5vd25lZF9jaGFyX3B0cihfX3MsIF9fc2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fci0+Z2V0X2FsbG9jYXRvcigpKTsKLSAgLy8gc2l6ZV90IF9fY291bnQgPSBfX3ItPl9NX3JlZl9jb3VudDsKLSAgc2l6ZV90IF9fb3JpZ19zaXplID0gX19yLT5fTV9zaXplLl9NX2RhdGE7Ci0gIC8vIF9TVExQX0FTU0VSVChfX2NvdW50ID49IDEpCi0gIGlmICggLyogX19jb3VudCA+IDEgKi8gX19yLT5fTV9pbmNyKCkgPiAyICkgewotICAgIF9fci0+X01fZGVjcigpOwotICAgIHJldHVybiBfU19jb25jYXRfY2hhcl9pdGVyKF9fciwgX19zLCBfX3NsZW4pOwotICB9Ci0gIGlmICgwID09IF9fc2xlbikgewotICAgIHJldHVybiBfX3I7Ci0gIH0KLSAgX19yLT5fTV9kZWNyKCk7Ci0gIGlmIChfX29yaWdfc2l6ZSArIF9fc2xlbiA8PSBfU19jb3B5X21heCAmJiBfUm9wZVJlcDo6X1NfbGVhZiA9PSBfX3ItPl9NX3RhZykgewotICAgIHJldHVybiBfU19kZXN0cl9sZWFmX2NvbmNhdF9jaGFyX2l0ZXIoKF9Sb3BlTGVhZiopX19yLCBfX3MsIF9fc2xlbik7Ci0gIH0KLSAgaWYgKF9Sb3BlUmVwOjpfU19jb25jYXQgPT0gX19yLT5fTV90YWcpIHsKLSAgICBfUm9wZUxlYWYqIF9fcmlnaHQgPSBfX1NUQVRJQ19DQVNUKF9Sb3BlTGVhZiosIF9fU1RBVElDX0NBU1QoX1JvcGVDb25jYXRlbmF0aW9uKiwgX19yKS0+X01fcmlnaHQpOwotICAgIGlmIChfUm9wZVJlcDo6X1NfbGVhZiA9PSBfX3JpZ2h0LT5fTV90YWcgJiYKLSAgICAgICAgX19yaWdodC0+X01fc2l6ZS5fTV9kYXRhICsgX19zbGVuIDw9IF9TX2NvcHlfbWF4KSB7Ci0gICAgICBfUm9wZVJlcCogX19uZXdfcmlnaHQgPSBfU19kZXN0cl9sZWFmX2NvbmNhdF9jaGFyX2l0ZXIoX19yaWdodCwgX19zLCBfX3NsZW4pOwotICAgICAgaWYgKF9fcmlnaHQgPT0gX19uZXdfcmlnaHQpIHsKLSAgICAgICAgLy8gX1NUTFBfQVNTRVJUKF9fbmV3X3JpZ2h0LT5fTV9yZWZfY291bnQgPT0gMikKLSAgICAgICAgLy8gX19uZXdfcmlnaHQtPl9NX3JlZl9jb3VudCA9IDE7Ci0gICAgICAgIF9fbmV3X3JpZ2h0LT5fTV9kZWNyKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvLyBfU1RMUF9BU1NFUlQoX19uZXdfcmlnaHQtPl9NX3JlZl9jb3VudCA+PSAxKQotICAgICAgICBfX3JpZ2h0LT5fTV91bnJlZl9ub25uaWwoKTsKLSAgICAgIH0KLSAgICAgIC8vIF9TVExQX0FTU0VSVChfX3ItPl9NX3JlZl9jb3VudCA9PSAxKQotICAgICAgLy8gX19yLT5fTV9yZWZfY291bnQgPSAyOyAgICAvLyBPbmUgbW9yZSB0aGFuIGJlZm9yZS4KLSAgICAgIF9fci0+X01faW5jcigpOwotICAgICAgX19TVEFUSUNfQ0FTVChfUm9wZUNvbmNhdGVuYXRpb24qLCBfX3IpLT5fTV9yaWdodCA9IF9fbmV3X3JpZ2h0OwotICAgICAgLy8gRS5NdXNzZXIgOiBtb3ZlZCBiZWxvdwotICAgICAgLy8gICAgX19yLT5fTV9zaXplLl9NX2RhdGEgPSBfX29yaWdfc2l6ZSArIF9fc2xlbjsKLSAgICAgIGlmICgwICE9IF9fci0+X01fY19zdHJpbmcpIHsKLSAgICAgICAgX19yLT5fTV9mcmVlX2Nfc3RyaW5nKCk7Ci0gICAgICAgIF9fci0+X01fY19zdHJpbmcgPSAwOwotICAgICAgfQotICAgICAgX19yLT5fTV9zaXplLl9NX2RhdGEgPSBfX29yaWdfc2l6ZSArIF9fc2xlbjsKLSAgICAgIHJldHVybiBfX3I7Ci0gICAgfQotICB9Ci0gIF9Sb3BlUmVwKiBfX3JpZ2h0ID0KLSAgICBfU19Sb3BlTGVhZl9mcm9tX3Vub3duZWRfY2hhcl9wdHIoX19zLCBfX3NsZW4sIF9fci0+Z2V0X2FsbG9jYXRvcigpKTsKLSAgX19yLT5fTV9yZWZfbm9ubmlsKCk7Ci0gIF9TVExQX1RSWSB7Ci0gICAgX19yZXN1bHQgPSBfU190cmVlX2NvbmNhdChfX3IsIF9fcmlnaHQpOwotICB9Ci0gIF9TVExQX1VOV0lORChfU191bnJlZihfX3IpOyBfU191bnJlZihfX3JpZ2h0KSkKLSAgICAvLyBfU1RMUF9BU1NFUlQoMSA9PSBfX3Jlc3VsdC0+X01fcmVmX2NvdW50KQotICByZXR1cm4gX19yZXN1bHQ7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KLV9fUm9wZVJlcF9fKgotcm9wZTxfQ2hhclQsX0FsbG9jPjo6X1NfY29uY2F0X3JlcChfUm9wZVJlcCogX19sZWZ0LCBfUm9wZVJlcCogX19yaWdodCkgewotICBpZiAoMCA9PSBfX2xlZnQpIHsKLSAgICBfU19yZWYoX19yaWdodCk7Ci0gICAgcmV0dXJuIF9fcmlnaHQ7Ci0gIH0KLSAgaWYgKDAgPT0gX19yaWdodCkgewotICAgIF9fbGVmdC0+X01fcmVmX25vbm5pbCgpOwotICAgIHJldHVybiBfX2xlZnQ7Ci0gIH0KLSAgaWYgKF9Sb3BlUmVwOjpfU19sZWFmID09IF9fcmlnaHQtPl9NX3RhZykgewotICAgIGlmIChfUm9wZVJlcDo6X1NfbGVhZiA9PSBfX2xlZnQtPl9NX3RhZykgewotICAgICAgaWYgKF9fcmlnaHQtPl9NX3NpemUuX01fZGF0YSArIF9fbGVmdC0+X01fc2l6ZS5fTV9kYXRhIDw9IF9TX2NvcHlfbWF4KSB7Ci0gICAgICAgIHJldHVybiBfU19sZWFmX2NvbmNhdF9jaGFyX2l0ZXIoX19TVEFUSUNfQ0FTVChfUm9wZUxlYWYqLCBfX2xlZnQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fU1RBVElDX0NBU1QoX1JvcGVMZWFmKiwgX19yaWdodCktPl9NX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19yaWdodC0+X01fc2l6ZS5fTV9kYXRhKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKF9Sb3BlUmVwOjpfU19jb25jYXQgPT0gX19sZWZ0LT5fTV90YWcgJiYKLSAgICAgICAgICAgICAgIF9Sb3BlUmVwOjpfU19sZWFmID09IF9fU1RBVElDX0NBU1QoX1JvcGVDb25jYXRlbmF0aW9uKiwgX19sZWZ0KS0+X01fcmlnaHQtPl9NX3RhZykgewotICAgICAgX1JvcGVMZWFmKiBfX2xlZnRyaWdodCA9Ci0gICAgICAgIF9fU1RBVElDX0NBU1QoX1JvcGVMZWFmKiwgX19TVEFUSUNfQ0FTVChfUm9wZUNvbmNhdGVuYXRpb24qLCBfX2xlZnQpLT5fTV9yaWdodCk7Ci0gICAgICBpZiAoX19sZWZ0cmlnaHQtPl9NX3NpemUuX01fZGF0YSArIF9fcmlnaHQtPl9NX3NpemUuX01fZGF0YSA8PSBfU19jb3B5X21heCkgewotICAgICAgICBfUm9wZVJlcCogX19sZWZ0bGVmdCA9IF9fU1RBVElDX0NBU1QoX1JvcGVDb25jYXRlbmF0aW9uKiwgX19sZWZ0KS0+X01fbGVmdDsKLSAgICAgICAgX1JvcGVSZXAqIF9fcmVzdCA9IF9TX2xlYWZfY29uY2F0X2NoYXJfaXRlcihfX2xlZnRyaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX1NUQVRJQ19DQVNUKF9Sb3BlTGVhZiosIF9fcmlnaHQpLT5fTV9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcmlnaHQtPl9NX3NpemUuX01fZGF0YSk7Ci0gICAgICAgIF9fbGVmdGxlZnQtPl9NX3JlZl9ub25uaWwoKTsKLSAgICAgICAgX1NUTFBfVFJZIHsKLSAgICAgICAgICByZXR1cm4gX1NfdHJlZV9jb25jYXQoX19sZWZ0bGVmdCwgX19yZXN0KTsKLSAgICAgICAgfQotICAgICAgICBfU1RMUF9VTldJTkQoX1NfdW5yZWYoX19sZWZ0bGVmdCk7IF9TX3VucmVmKF9fcmVzdCkpCi0gICAgICB9Ci0gICAgfQotICB9Ci0gIF9fbGVmdC0+X01fcmVmX25vbm5pbCgpOwotICBfX3JpZ2h0LT5fTV9yZWZfbm9ubmlsKCk7Ci0gIF9TVExQX1RSWSB7Ci0gICAgcmV0dXJuIF9TX3RyZWVfY29uY2F0KF9fbGVmdCwgX19yaWdodCk7Ci0gIH0KLSAgX1NUTFBfVU5XSU5EKF9TX3VucmVmKF9fbGVmdCk7IF9TX3VucmVmKF9fcmlnaHQpKQotICBfU1RMUF9SRVRfQUZURVJfVEhST1coMCkKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgotX19Sb3BlUmVwX18qCi1yb3BlPF9DaGFyVCxfQWxsb2M+OjpfU19zdWJzdHJpbmcoX1JvcGVSZXAqIF9fYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgX19zdGFydCwgc2l6ZV90IF9fZW5kcDEpIHsKLSAgaWYgKDAgPT0gX19iYXNlKSByZXR1cm4gMDsKLSAgc2l6ZV90IF9fbGVuID0gX19iYXNlLT5fTV9zaXplLl9NX2RhdGE7Ci0gIHNpemVfdCBfX2Fkal9lbmRwMTsKLSAgY29uc3Qgc2l6ZV90IF9fbGF6eV90aHJlc2hvbGQgPSAxMjg7Ci0KLSAgaWYgKF9fZW5kcDEgPj0gX19sZW4pIHsKLSAgICBpZiAoMCA9PSBfX3N0YXJ0KSB7Ci0gICAgICBfX2Jhc2UtPl9NX3JlZl9ub25uaWwoKTsKLSAgICAgIHJldHVybiBfX2Jhc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIF9fYWRqX2VuZHAxID0gX19sZW47Ci0gICAgfQotICB9IGVsc2UgewotICAgIF9fYWRqX2VuZHAxID0gX19lbmRwMTsKLSAgfQotICBzd2l0Y2goX19iYXNlLT5fTV90YWcpIHsKLSAgY2FzZSBfUm9wZVJlcDo6X1NfY29uY2F0OgotICB7Ci0gICAgX1JvcGVDb25jYXRlbmF0aW9uKiBfX2MgPSBfX1NUQVRJQ19DQVNUKF9Sb3BlQ29uY2F0ZW5hdGlvbiosIF9fYmFzZSk7Ci0gICAgX1JvcGVSZXAqIF9fbGVmdCA9IF9fYy0+X01fbGVmdDsKLSAgICBfUm9wZVJlcCogX19yaWdodCA9IF9fYy0+X01fcmlnaHQ7Ci0gICAgc2l6ZV90IF9fbGVmdF9sZW4gPSBfX2xlZnQtPl9NX3NpemUuX01fZGF0YTsKLSAgICBfUm9wZVJlcCogX19yZXN1bHQ7Ci0KLSAgICBpZiAoX19hZGpfZW5kcDEgPD0gX19sZWZ0X2xlbikgewotICAgICAgcmV0dXJuIF9TX3N1YnN0cmluZyhfX2xlZnQsIF9fc3RhcnQsIF9fZW5kcDEpOwotICAgIH0gZWxzZSBpZiAoX19zdGFydCA+PSBfX2xlZnRfbGVuKSB7Ci0gICAgICByZXR1cm4gX1Nfc3Vic3RyaW5nKF9fcmlnaHQsIF9fc3RhcnQgLSBfX2xlZnRfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Fkal9lbmRwMSAtIF9fbGVmdF9sZW4pOwotICAgIH0KLSAgICBfU2VsZl9kZXN0cnVjdF9wdHIgX19sZWZ0X3Jlc3VsdChfU19zdWJzdHJpbmcoX19sZWZ0LCBfX3N0YXJ0LCBfX2xlZnRfbGVuKSk7Ci0gICAgX1NlbGZfZGVzdHJ1Y3RfcHRyIF9fcmlnaHRfcmVzdWx0KF9TX3N1YnN0cmluZyhfX3JpZ2h0LCAwLCBfX2VuZHAxIC0gX19sZWZ0X2xlbikpOwotICAgIF9TVExQX01QV0ZJWF9UUlkgICAgLy8qVFkgMDYvMDEvMjAwMCAtIG1wdyBmb3JnZXRzIHRvIGNhbGwgZHRvciBvbiBfX2xlZnRfcmVzdWx0IGFuZCBfX3JpZ2h0X3Jlc3VsdCB3aXRob3V0IHRoaXMgdHJ5IGJsb2NrCi0gICAgX19yZXN1bHQgPSBfU19jb25jYXRfcmVwKF9fbGVmdF9yZXN1bHQsIF9fcmlnaHRfcmVzdWx0KTsKLSAgICAvLyBfU1RMUF9BU1NFUlQoMSA9PSBfX3Jlc3VsdC0+X01fcmVmX2NvdW50KQotICAgIHJldHVybiBfX3Jlc3VsdDsKLSAgICBfU1RMUF9NUFdGSVhfQ0FUQ0ggICAgLy8qVFkgMDYvMDEvMjAwMCAtCi0gIH0KLSAgY2FzZSBfUm9wZVJlcDo6X1NfbGVhZjoKLSAgewotICAgIF9Sb3BlTGVhZiogX19sID0gX19TVEFUSUNfQ0FTVChfUm9wZUxlYWYqLCBfX2Jhc2UpOwotICAgIF9Sb3BlTGVhZiogX19yZXN1bHQ7Ci0gICAgc2l6ZV90IF9fcmVzdWx0X2xlbjsKLSAgICBpZiAoX19zdGFydCA+PSBfX2Fkal9lbmRwMSkgcmV0dXJuIDA7Ci0gICAgX19yZXN1bHRfbGVuID0gX19hZGpfZW5kcDEgLSBfX3N0YXJ0OwotICAgIGlmIChfX3Jlc3VsdF9sZW4gPiBfX2xhenlfdGhyZXNob2xkKSBnb3RvIGxhenk7Ci0gICAgY29uc3QgX0NoYXJUKiBfX3NlY3Rpb24gPSBfX2wtPl9NX2RhdGEgKyBfX3N0YXJ0OwotICAgIC8vIFdlIHNob3VsZCBzb21ldGltZXMgY3JlYXRlIHN1YnN0cmluZyBub2RlIGluc3RlYWQuCi0gICAgX19yZXN1bHQgPSBfU19Sb3BlTGVhZl9mcm9tX3Vub3duZWRfY2hhcl9wdHIoX19zZWN0aW9uLCBfX3Jlc3VsdF9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19iYXNlLT5nZXRfYWxsb2NhdG9yKCkpOwotICAgIHJldHVybiBfX3Jlc3VsdDsKLSAgfQotICBjYXNlIF9Sb3BlUmVwOjpfU19zdWJzdHJpbmdmbjoKLSAgLy8gQXZvaWQgaW50cm9kdWNpbmcgbXVsdGlwbGUgbGF5ZXJzIG9mIHN1YnN0cmluZyBub2Rlcy4KLSAgewotICAgIF9Sb3BlU3Vic3RyaW5nKiBfX29sZCA9IF9fU1RBVElDX0NBU1QoX1JvcGVTdWJzdHJpbmcqLCBfX2Jhc2UpOwotICAgIHNpemVfdCBfX3Jlc3VsdF9sZW47Ci0gICAgaWYgKF9fc3RhcnQgPj0gX19hZGpfZW5kcDEpIHJldHVybiAwOwotICAgIF9fcmVzdWx0X2xlbiA9IF9fYWRqX2VuZHAxIC0gX19zdGFydDsKLSAgICBpZiAoX19yZXN1bHRfbGVuID4gX19sYXp5X3RocmVzaG9sZCkgewotICAgICAgX1JvcGVTdWJzdHJpbmcqIF9fcmVzdWx0ID0gX1NfbmV3X1JvcGVTdWJzdHJpbmcoX19vbGQtPl9NX2Jhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3N0YXJ0ICsgX19vbGQtPl9NX3N0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19hZGpfZW5kcDEgLSBfX3N0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19iYXNlLT5nZXRfYWxsb2NhdG9yKCkpOwotICAgICAgcmV0dXJuIF9fcmVzdWx0OwotICAgIH0gLy8gKioqIGVsc2UgZmFsbCB0aHJvdWdoOiAqKioKLSAgfQotICBjYXNlIF9Sb3BlUmVwOjpfU19mdW5jdGlvbjoKLSAgewotICAgIF9Sb3BlRnVuY3Rpb24qIF9fZiA9IF9fU1RBVElDX0NBU1QoX1JvcGVGdW5jdGlvbiosIF9fYmFzZSk7Ci0gICAgaWYgKF9fc3RhcnQgPj0gX19hZGpfZW5kcDEpIHJldHVybiAwOwotICAgIHNpemVfdCBfX3Jlc3VsdF9sZW4gPSBfX2Fkal9lbmRwMSAtIF9fc3RhcnQ7Ci0KLSAgICBpZiAoX19yZXN1bHRfbGVuID4gX19sYXp5X3RocmVzaG9sZCkgZ290byBsYXp5OwotICAgIF9DaGFyVCogX19zZWN0aW9uID0gX19iYXNlLT5fTV9zaXplLmFsbG9jYXRlKF9TX3JvdW5kZWRfdXBfc2l6ZShfX3Jlc3VsdF9sZW4pKTsKLSAgICBfU1RMUF9UUlkgewotICAgICAgKCooX19mLT5fTV9mbikpKF9fc3RhcnQsIF9fcmVzdWx0X2xlbiwgX19zZWN0aW9uKTsKLSAgICB9Ci0gICAgX1NUTFBfVU5XSU5EKF9Sb3BlUmVwOjpfU19mcmVlX3N0cmluZyhfX3NlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3Jlc3VsdF9sZW4sIF9fYmFzZS0+Z2V0X2FsbG9jYXRvcigpKSkKLSAgICBfU19jb25zdHJ1Y3RfbnVsbChfX3NlY3Rpb24gKyBfX3Jlc3VsdF9sZW4pOwotICAgIHJldHVybiBfU19uZXdfUm9wZUxlYWYoX19zZWN0aW9uLCBfX3Jlc3VsdF9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Jhc2UtPmdldF9hbGxvY2F0b3IoKSk7Ci0gIH0KLSAgfQotICAvKk5PVFJFQUNIRUQqLwotICBfU1RMUF9BU1NFUlQoZmFsc2UpCi0gIGxhenk6Ci0gIHsKLSAgICAvLyBDcmVhdGUgc3Vic3RyaW5nIG5vZGUuCi0gICAgcmV0dXJuIF9TX25ld19Sb3BlU3Vic3RyaW5nKF9fYmFzZSwgX19zdGFydCwgX19hZGpfZW5kcDEgLSBfX3N0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Jhc2UtPmdldF9hbGxvY2F0b3IoKSk7Ci0gIH0KLX0KLQotdGVtcGxhdGU8Y2xhc3MgX0NoYXJUPgotY2xhc3MgX1JvcGVfZmxhdHRlbl9jaGFyX2NvbnN1bWVyIDogcHVibGljIF9Sb3BlX2NoYXJfY29uc3VtZXI8X0NoYXJUPiB7Ci1wcml2YXRlOgotICBfQ2hhclQqIF9NX2J1Zl9wdHI7Ci1wdWJsaWM6Ci0gIF9Sb3BlX2ZsYXR0ZW5fY2hhcl9jb25zdW1lcihfQ2hhclQqIF9fYnVmZmVyKSB7Ci0gICAgX01fYnVmX3B0ciA9IF9fYnVmZmVyOwotICB9Ci0gIH5fUm9wZV9mbGF0dGVuX2NoYXJfY29uc3VtZXIoKSB7fQotICBib29sIG9wZXJhdG9yKCkgKGNvbnN0IF9DaGFyVCogX19sZWFmLCBzaXplX3QgX19uKSB7Ci0gICAgX1NUTFBfUFJJViBfX3Vjb3B5X24oX19sZWFmLCBfX24sIF9NX2J1Zl9wdHIpOwotICAgIF9NX2J1Zl9wdHIgKz0gX19uOwotICAgIHJldHVybiB0cnVlOwotICB9Ci19OwotCi10ZW1wbGF0ZTxjbGFzcyBfQ2hhclQ+Ci1jbGFzcyBfUm9wZV9maW5kX2NoYXJfY2hhcl9jb25zdW1lciA6IHB1YmxpYyBfUm9wZV9jaGFyX2NvbnN1bWVyPF9DaGFyVD4gewotcHJpdmF0ZToKLSAgX0NoYXJUIF9NX3BhdHRlcm47Ci1wdWJsaWM6Ci0gIHNpemVfdCBfTV9jb3VudDsgIC8vIE51bWJlciBvZiBub25tYXRjaGluZyBjaGFyYWN0ZXJzCi0gIF9Sb3BlX2ZpbmRfY2hhcl9jaGFyX2NvbnN1bWVyKF9DaGFyVCBfX3ApCi0gICAgOiBfTV9wYXR0ZXJuKF9fcCksIF9NX2NvdW50KDApIHt9Ci0gIH5fUm9wZV9maW5kX2NoYXJfY2hhcl9jb25zdW1lcigpIHt9Ci0gIGJvb2wgb3BlcmF0b3IoKSAoY29uc3QgX0NoYXJUKiBfX2xlYWYsIHNpemVfdCBfX24pIHsKLSAgICBzaXplX3QgX19pOwotICAgIGZvciAoX19pID0gMDsgX19pIDwgX19uOyArK19faSkgewotICAgICAgaWYgKF9fbGVhZltfX2ldID09IF9NX3BhdHRlcm4pIHsKLSAgICAgICAgX01fY291bnQgKz0gX19pOyByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotICAgIF9NX2NvdW50ICs9IF9fbjsgcmV0dXJuIHRydWU7Ci0gIH0KLX07Ci0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX05PX0lPU1RSRUFNUykKLXRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KLS8vIEhlcmUgX0NoYXJUIGlzIGJvdGggdGhlIHN0cmVhbSBhbmQgcm9wZSBjaGFyYWN0ZXIgdHlwZS4KLWNsYXNzIF9Sb3BlX2luc2VydF9jaGFyX2NvbnN1bWVyIDogcHVibGljIF9Sb3BlX2NoYXJfY29uc3VtZXI8X0NoYXJUPiB7Ci1wcml2YXRlOgotICB0eXBlZGVmIGJhc2ljX29zdHJlYW08X0NoYXJULF9UcmFpdHM+IF9JbnNlcnRfb3N0cmVhbTsKLSAgdHlwZWRlZiBfUm9wZV9pbnNlcnRfY2hhcl9jb25zdW1lcjxfQ2hhclQsX1RyYWl0cz4gX1NlbGY7Ci0gIF9JbnNlcnRfb3N0cmVhbSYgX01fbzsKLQotICAvL2V4cGxpY2l0ZWx5IGRlZmluZWQgYXMgcHJpdmF0ZSB0byBhdm9pZCB3YXJuaW5nczoKLSAgX1NlbGYmIG9wZXJhdG9yID0gKF9TZWxmIGNvbnN0Jik7Ci1wdWJsaWM6Ci0gIF9Sb3BlX2luc2VydF9jaGFyX2NvbnN1bWVyKF9JbnNlcnRfb3N0cmVhbSYgX193cml0ZXIpCi0gICAgOiBfTV9vKF9fd3JpdGVyKSB7fQotIyAgaWYgZGVmaW5lZChfX01SQ19fKSB8fCAoZGVmaW5lZChfX1NDX18pICYmICFkZWZpbmVkKF9fRE1DX18pKSAgLy8qVFkgMDUvMjMvMjAwMCAtIGFkZGVkIHN1cHBvcnQgZm9yIG1wdyBjb21waWxlcidzIHRyaWdnZXIgZnVuY3Rpb24gYXBwcm9hY2ggdG8gZ2VuZXJhdGUgdnRhYmxlCi0gIH5fUm9wZV9pbnNlcnRfY2hhcl9jb25zdW1lcigpOyAgICAvLypUWSAwNS8yMy8yMDAwIC0KLSMgIGVsc2UgICAgLy8qVFkgMDUvMjMvMjAwMCAtCi0gIH5fUm9wZV9pbnNlcnRfY2hhcl9jb25zdW1lcigpIHt9Ci0jICBlbmRpZiAgICAvLypUWSAwNS8yMy8yMDAwIC0KLSAgLy8gQ2FsbGVyIGlzIHByZXN1bWVkIHRvIG93biB0aGUgb3N0cmVhbQotICBib29sIG9wZXJhdG9yKCkgKGNvbnN0IF9DaGFyVCogX19sZWFmLCBzaXplX3QgX19uKTsKLSAgLy8gUmV0dXJucyB0cnVlIHRvIGNvbnRpbnVlIHRyYXZlcnNhbC4KLX07Ci0KLSMgIGlmIGRlZmluZWQgKF9fTVJDX18pIHx8IChkZWZpbmVkIChfX1NDX18pICYmICFkZWZpbmVkIChfX0RNQ19fKSkgICAgLy8qVFkgMDUvMjMvMjAwMCAtIGFkZGVkIHN1cHBvcnQgZm9yIG1wdyBjb21waWxlcidzIHRyaWdnZXIgZnVuY3Rpb24gYXBwcm9hY2ggdG8gZ2VuZXJhdGUgdnRhYmxlCi10ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Ci1fUm9wZV9pbnNlcnRfY2hhcl9jb25zdW1lcjxfQ2hhclQsIF9UcmFpdHM+OjogIH5fUm9wZV9pbnNlcnRfY2hhcl9jb25zdW1lcigpIHt9Ci0jICBlbmRpZiAgICAvLypUWSAwNS8yMy8yMDAwIC0KLQotdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotYm9vbCBfUm9wZV9pbnNlcnRfY2hhcl9jb25zdW1lcjxfQ2hhclQsIF9UcmFpdHM+OjpvcGVyYXRvcigpCi0gIChjb25zdCBfQ2hhclQqIF9fbGVhZiwgc2l6ZV90IF9fbikgewotICBzaXplX3QgX19pOwotICAvLyAgV2UgYXNzdW1lIHRoYXQgZm9ybWF0dGluZyBpcyBzZXQgdXAgY29ycmVjdGx5IGZvciBlYWNoIGVsZW1lbnQuCi0gIGZvciAoX19pID0gMDsgX19pIDwgX19uOyArK19faSkgX01fby5wdXQoX19sZWFmW19faV0pOwotICByZXR1cm4gdHJ1ZTsKLX0KLSNlbmRpZiAvKiAhX1NUTFBfVVNFX05PX0lPU1RSRUFNUyAqLwotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2MsIGNsYXNzIF9DaGFyQ29uc3VtZXI+Ci1ib29sIF9TX2FwcGx5X3RvX3BpZWNlcyhfQ2hhckNvbnN1bWVyJiBfX2MsCi0gICAgICAgICAgICAgICAgICAgICAgICBfUm9wZV9Sb3BlUmVwPF9DaGFyVCwgX0FsbG9jPiAqIF9fciwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBfX2JlZ2luLCBzaXplX3QgX19lbmQpIHsKLSAgdHlwZWRlZiBfUm9wZV9Sb3BlUmVwPF9DaGFyVCwgX0FsbG9jPiBfUm9wZVJlcDsKLSAgdHlwZWRlZiBfUm9wZV9Sb3BlQ29uY2F0ZW5hdGlvbjxfQ2hhclQsX0FsbG9jPiBfUm9wZUNvbmNhdGVuYXRpb247Ci0gIHR5cGVkZWYgX1JvcGVfUm9wZUxlYWY8X0NoYXJULF9BbGxvYz4gX1JvcGVMZWFmOwotICB0eXBlZGVmIF9Sb3BlX1JvcGVGdW5jdGlvbjxfQ2hhclQsX0FsbG9jPiBfUm9wZUZ1bmN0aW9uOwotCi0gIGlmICgwID09IF9fcikgcmV0dXJuIHRydWU7Ci0gIHN3aXRjaChfX3ItPl9NX3RhZykgewotICBjYXNlIF9Sb3BlUmVwOjpfU19jb25jYXQ6Ci0gIHsKLSAgICBfUm9wZUNvbmNhdGVuYXRpb24qIF9fY29uYyA9IF9fU1RBVElDX0NBU1QoX1JvcGVDb25jYXRlbmF0aW9uKiwgX19yKTsKLSAgICBfUm9wZVJlcCogX19sZWZ0ID0gIF9fY29uYy0+X01fbGVmdDsKLSAgICBzaXplX3QgX19sZWZ0X2xlbiA9IF9fbGVmdC0+X01fc2l6ZS5fTV9kYXRhOwotICAgIGlmIChfX2JlZ2luIDwgX19sZWZ0X2xlbikgewotICAgICAgc2l6ZV90IF9fbGVmdF9lbmQgPSAobWluKSAoX19sZWZ0X2xlbiwgX19lbmQpOwotICAgICAgaWYgKCFfU19hcHBseV90b19waWVjZXMoX19jLCBfX2xlZnQsIF9fYmVnaW4sIF9fbGVmdF9lbmQpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmIChfX2VuZCA+IF9fbGVmdF9sZW4pIHsKLSAgICAgIF9Sb3BlUmVwKiBfX3JpZ2h0ID0gIF9fY29uYy0+X01fcmlnaHQ7Ci0gICAgICBzaXplX3QgX19yaWdodF9zdGFydCA9IChtYXgpKF9fbGVmdF9sZW4sIF9fYmVnaW4pOwotICAgICAgaWYgKCFfU19hcHBseV90b19waWVjZXMoX19jLCBfX3JpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19yaWdodF9zdGFydCAtIF9fbGVmdF9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2VuZCAtIF9fbGVmdF9sZW4pKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci0gIGNhc2UgX1JvcGVSZXA6Ol9TX2xlYWY6Ci0gIHsKLSAgICBfUm9wZUxlYWYqIF9fbCA9IF9fU1RBVElDX0NBU1QoX1JvcGVMZWFmKiwgX19yKTsKLSAgICByZXR1cm4gX19jKF9fbC0+X01fZGF0YSArIF9fYmVnaW4sIF9fZW5kIC0gX19iZWdpbik7Ci0gIH0KLSAgY2FzZSBfUm9wZVJlcDo6X1NfZnVuY3Rpb246Ci0gIGNhc2UgX1JvcGVSZXA6Ol9TX3N1YnN0cmluZ2ZuOgotICB7Ci0gICAgX1JvcGVGdW5jdGlvbiogX19mID0gX19TVEFUSUNfQ0FTVChfUm9wZUZ1bmN0aW9uKiwgX19yKTsKLSAgICBzaXplX3QgX19sZW4gPSBfX2VuZCAtIF9fYmVnaW47Ci0gICAgYm9vbCBfX3Jlc3VsdDsKLSAgICBfQ2hhclQqIF9fYnVmZmVyID0gX19yLT5nZXRfYWxsb2NhdG9yKCkuYWxsb2NhdGUoX19sZW4pOwotICAgIF9TVExQX1RSWSB7Ci0gICAgICAoKihfX2YtPl9NX2ZuKSkoX19iZWdpbiwgX19sZW4sIF9fYnVmZmVyKTsKLSAgICAgIF9fcmVzdWx0ID0gX19jKF9fYnVmZmVyLCBfX2xlbik7Ci0gICAgICBfX3ItPmdldF9hbGxvY2F0b3IoKS5kZWFsbG9jYXRlKF9fYnVmZmVyLCBfX2xlbik7Ci0gICAgfQotICAgIF9TVExQX1VOV0lORCgoX19yLT5nZXRfYWxsb2NhdG9yKCkuZGVhbGxvY2F0ZShfX2J1ZmZlciwgX19sZW4pKSkKLSAgICByZXR1cm4gX19yZXN1bHQ7Ci0gIH0KLSAgZGVmYXVsdDoKLSAgICBfU1RMUF9BU1NFUlQoZmFsc2UpCi0gICAgLypOT1RSRUFDSEVEKi8KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLQotI2lmICFkZWZpbmVkIChfU1RMUF9VU0VfTk9fSU9TVFJFQU1TKQotdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotaW5saW5lIHZvaWQgX1JvcGVfZmlsbChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fbywgc3RyZWFtc2l6ZSBfX24pIHsKLSAgY2hhciBfX2YgPSBfX28uZmlsbCgpOwotICBmb3IgKHN0cmVhbXNpemUgX19pID0gMDsgX19pIDwgX19uOyArK19faSkgX19vLnB1dChfX2YpOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KLWJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX1NfaW9fZ2V0KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm9wZTxfQ2hhclQsIF9BbGxvYz4mIF9fciwgY29uc3QgX190cnVlX3R5cGUmIC8qX0lzQmFzaWNDaGFyVHlwZSovKSB7Ci0gIHN0cmVhbXNpemUgX193ID0gX19vLndpZHRoKCk7Ci0gIGNvbnN0IGJvb2wgX19sZWZ0ID0gKF9fby5mbGFncygpICYgaW9zOjpsZWZ0KSAhPSAwOwotICBzaXplX3QgX19yb3BlX2xlbiA9IF9fci5zaXplKCk7Ci0gIF9Sb3BlX2luc2VydF9jaGFyX2NvbnN1bWVyPF9DaGFyVCwgX1RyYWl0cz4gX19jKF9fbyk7Ci0KLSAgY29uc3QgYm9vbCBfX25lZWRfcGFkID0gKCgoc2l6ZW9mKHN0cmVhbXNpemUpID4gc2l6ZW9mKHNpemVfdCkpICYmIChfX1NUQVRJQ19DQVNUKHN0cmVhbXNpemUsIF9fcm9wZV9sZW4pIDwgX193KSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICgoc2l6ZW9mKHN0cmVhbXNpemUpIDw9IHNpemVvZihzaXplX3QpKSAmJiAoX19yb3BlX2xlbiA8IF9fU1RBVElDX0NBU1Qoc2l6ZV90LCBfX3cpKSkpOwotICBzdHJlYW1zaXplIF9fcGFkX2xlbiA9IF9fbmVlZF9wYWQgPyBfX3cgLSBfX3JvcGVfbGVuIDogMDsKLQotICBpZiAoIV9fbGVmdCAmJiBfX3BhZF9sZW4gPiAwKSB7Ci0gICAgX1JvcGVfZmlsbChfX28sIF9fcGFkX2xlbik7Ci0gIH0KLSAgX19yLmFwcGx5X3RvX3BpZWNlcygwLCBfX3JvcGVfbGVuLCBfX2MpOwotICBpZiAoX19sZWZ0ICYmIF9fcGFkX2xlbiA+IDApIHsKLSAgICBfUm9wZV9maWxsKF9fbywgX19wYWRfbGVuKTsKLSAgfQotICByZXR1cm4gX19vOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KLWJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX1NfaW9fZ2V0KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByb3BlPF9DaGFyVCwgX0FsbG9jPiYgX19yLCBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qX0lzQmFzaWNDaGFyVHlwZSovKSB7Ci0gIHN0cmVhbXNpemUgX193ID0gX19vLndpZHRoKCk7Ci0gIHNpemVfdCBfX3JvcGVfbGVuID0gX19yLnNpemUoKTsKLSAgX1JvcGVfaW5zZXJ0X2NoYXJfY29uc3VtZXI8X0NoYXJULCBfVHJhaXRzPiBfX2MoX19vKTsKLQotICBfX28ud2lkdGgoX193IC9fX3JvcGVfbGVuKTsKLSAgX1NUTFBfVFJZIHsKLSAgICBfX3IuYXBwbHlfdG9fcGllY2VzKDAsIF9fcm9wZV9sZW4sIF9fYyk7Ci0gICAgX19vLndpZHRoKF9fdyk7Ci0gIH0KLSAgX1NUTFBfVU5XSU5EKF9fby53aWR0aChfX3cpKQotICByZXR1cm4gX19vOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KLWJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByb3BlPF9DaGFyVCwgX0FsbG9jPiYgX19yKSB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0lzSW50ZWdyYWw8X0NoYXJUPjo6X1JldCBfQ2hhcl9Jc19JbnRlZ3JhbDsKLSAgcmV0dXJuIF9TX2lvX2dldChfX28sIF9fciwgX0NoYXJfSXNfSW50ZWdyYWwoKSk7Ci19Ci0jZW5kaWYgLyogTk9fSU9TVFJFQU1TICovCi0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KLV9DaGFyVCogcm9wZTxfQ2hhclQsX0FsbG9jPjo6X1NfZmxhdHRlbihfUm9wZVJlcCogX19yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBfX3N0YXJ0LCBzaXplX3QgX19sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NoYXJUKiBfX2J1ZmZlcikgewotICBfUm9wZV9mbGF0dGVuX2NoYXJfY29uc3VtZXI8X0NoYXJUPiBfX2MoX19idWZmZXIpOwotICBfU19hcHBseV90b19waWVjZXMoX19jLCBfX3IsIF9fc3RhcnQsIF9fc3RhcnQgKyBfX2xlbik7Ci0gIHJldHVybihfX2J1ZmZlciArIF9fbGVuKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgotc2l6ZV90IHJvcGU8X0NoYXJULF9BbGxvYz46OmZpbmQoX0NoYXJUIF9fcGF0dGVybiwgc2l6ZV90IF9fc3RhcnQpIGNvbnN0IHsKLSAgX1JvcGVfZmluZF9jaGFyX2NoYXJfY29uc3VtZXI8X0NoYXJUPiBfX2MoX19wYXR0ZXJuKTsKLSAgX1NfYXBwbHlfdG9fcGllY2VzKF9fYywgX01fdHJlZV9wdHIuX01fZGF0YSwgX19zdGFydCwgc2l6ZSgpKTsKLSAgc2l6ZV90eXBlIF9fcmVzdWx0X3BvcyA9IF9fc3RhcnQgKyBfX2MuX01fY291bnQ7Ci0jaWZuZGVmIF9TVExQX09MRF9ST1BFX1NFTUFOVElDUwotICBpZiAoX19yZXN1bHRfcG9zID09IHNpemUoKSkgX19yZXN1bHRfcG9zID0gbnBvczsKLSNlbmRpZgotICByZXR1cm4gX19yZXN1bHRfcG9zOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+Ci1fQ2hhclQqCi1yb3BlPF9DaGFyVCxfQWxsb2M+OjpfU19mbGF0dGVuKF9Sb3BlX1JvcGVSZXA8X0NoYXJULCBfQWxsb2M+KiBfX3IsIF9DaGFyVCogX19idWZmZXIpIHsKLSAgaWYgKDAgPT0gX19yKSByZXR1cm4gX19idWZmZXI7Ci0gIHN3aXRjaChfX3ItPl9NX3RhZykgewotICBjYXNlIF9Sb3BlUmVwOjpfU19jb25jYXQ6Ci0gIHsKLSAgICBfUm9wZUNvbmNhdGVuYXRpb24qIF9fYyA9IF9fU1RBVElDX0NBU1QoX1JvcGVDb25jYXRlbmF0aW9uKiwgX19yKTsKLSAgICBfUm9wZVJlcCogX19sZWZ0ID0gX19jLT5fTV9sZWZ0OwotICAgIF9Sb3BlUmVwKiBfX3JpZ2h0ID0gX19jLT5fTV9yaWdodDsKLSAgICBfQ2hhclQqIF9fcmVzdCA9IF9TX2ZsYXR0ZW4oX19sZWZ0LCBfX2J1ZmZlcik7Ci0gICAgcmV0dXJuIF9TX2ZsYXR0ZW4oX19yaWdodCwgX19yZXN0KTsKLSAgfQotICBjYXNlIF9Sb3BlUmVwOjpfU19sZWFmOgotICB7Ci0gICAgX1JvcGVMZWFmKiBfX2wgPSBfX1NUQVRJQ19DQVNUKF9Sb3BlTGVhZiosIF9fcik7Ci0gICAgcmV0dXJuIF9TVExQX1BSSVYgX191Y29weV9uKF9fbC0+X01fZGF0YSwgX19sLT5fTV9zaXplLl9NX2RhdGEsIF9fYnVmZmVyKS5zZWNvbmQ7Ci0gIH0KLSAgY2FzZSBfUm9wZVJlcDo6X1NfZnVuY3Rpb246Ci0gIGNhc2UgX1JvcGVSZXA6Ol9TX3N1YnN0cmluZ2ZuOgotICAvLyBXZSBkb250IHlldCBkbyBhbnl0aGluZyB3aXRoIHN1YnN0cmluZyBub2Rlcy4KLSAgLy8gVGhpcyBuZWVkcyB0byBiZSBmaXhlZCBiZWZvcmUgcm9wZWZpbGVzIHdpbGwgd29yayB3ZWxsLgotICB7Ci0gICAgX1JvcGVGdW5jdGlvbiogX19mID0gX19TVEFUSUNfQ0FTVChfUm9wZUZ1bmN0aW9uKiwgX19yKTsKLSAgICAoKihfX2YtPl9NX2ZuKSkoMCwgX19mLT5fTV9zaXplLl9NX2RhdGEsIF9fYnVmZmVyKTsKLSAgICByZXR1cm4gX19idWZmZXIgKyBfX2YtPl9NX3NpemUuX01fZGF0YTsKLSAgfQotICBkZWZhdWx0OgotICAgIF9TVExQX0FTU0VSVChmYWxzZSkKLSAgICAvKk5PVFJFQUNIRUQqLwotICAgIHJldHVybiAwOwotICB9Ci19Ci0KLSNpZmRlZiBfU1RMUF9ERUJVRwotLy8gVGhpcyBuZWVkcyB3b3JrIGZvciBfQ2hhclQgIT0gY2hhcgotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgotdm9pZCByb3BlPF9DaGFyVCxfQWxsb2M+OjpfU19kdW1wKF9Sb3BlUmVwKiBfX3IsIGludCBfX2luZGVudCkgewotICBmb3IgKGludCBfX2kgPSAwOyBfX2kgPCBfX2luZGVudDsgKytfX2kpIHB1dGNoYXIoJyAnKTsKLSAgaWYgKDAgPT0gX19yKSB7Ci0gICAgcHJpbnRmKCJOVUxMXG4iKTsgcmV0dXJuOwotICB9Ci0gIGlmIChfUm9wZVJlcDo6X1NfY29uY2F0ID09IF9fci0+X01fdGFnKSB7Ci0gICAgX1JvcGVDb25jYXRlbmF0aW9uKiBfX2MgPSBfX1NUQVRJQ19DQVNUKF9Sb3BlQ29uY2F0ZW5hdGlvbiosIF9fcik7Ci0gICAgX1JvcGVSZXAqIF9fbGVmdCA9IF9fYy0+X01fbGVmdDsKLSAgICBfUm9wZVJlcCogX19yaWdodCA9IF9fYy0+X01fcmlnaHQ7Ci0gICAgcHJpbnRmKCJDb25jYXRlbmF0aW9uICVwIChyYyA9ICVsZCwgZGVwdGggPSAlZCwgbGVuID0gJWxkLCAlcyBiYWxhbmNlZClcbiIsCi0gICAgICBfX3IsIF9fci0+X01fcmVmX2NvdW50LCBfX3ItPl9NX2RlcHRoLCBfX3ItPl9NX3NpemUuX01fZGF0YSwKLSAgICAgIF9fci0+X01faXNfYmFsYW5jZWQ/ICIiIDogIm5vdCIpOwotICAgIF9TX2R1bXAoX19sZWZ0LCBfX2luZGVudCArIDIpOwotICAgIF9TX2R1bXAoX19yaWdodCwgX19pbmRlbnQgKyAyKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgZWxzZSB7Ci0gICAgY29uc3QgY2hhciogX19raW5kOwotCi0gICAgc3dpdGNoIChfX3ItPl9NX3RhZykgewotICAgICAgY2FzZSBfUm9wZVJlcDo6X1NfbGVhZjoKLSAgICAgICAgX19raW5kID0gIkxlYWYiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgX1JvcGVSZXA6Ol9TX2Z1bmN0aW9uOgotICAgICAgICBfX2tpbmQgPSAiRnVuY3Rpb24iOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgX1JvcGVSZXA6Ol9TX3N1YnN0cmluZ2ZuOgotICAgICAgICBfX2tpbmQgPSAiRnVuY3Rpb24gcmVwcmVzZW50aW5nIHN1YnN0cmluZyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgX19raW5kID0gIihjb3JydXB0ZWQga2luZCBmaWVsZCEpIjsKLSAgICB9Ci0gICAgcHJpbnRmKCIlcyAlcCAocmMgPSAlbGQsIGRlcHRoID0gJWQsIGxlbiA9ICVsZCkgIiwKLSAgICAgX19raW5kLCBfX3IsIF9fci0+X01fcmVmX2NvdW50LCBfX3ItPl9NX2RlcHRoLCBfX3ItPl9NX3NpemUuX01fZGF0YSk7Ci0gICAgaWYgKHNpemVvZihfQ2hhclQpID09IDEpIHsKLSAgICAgIGNvbnN0IGludCBfX21heF9sZW4gPSA0MDsKLSAgICAgIF9TZWxmX2Rlc3RydWN0X3B0ciBfX3ByZWZpeChfU19zdWJzdHJpbmcoX19yLCAwLCBfX21heF9sZW4pKTsKLSAgICAgIF9DaGFyVCBfX2J1ZmZlcltfX21heF9sZW4gKyAxXTsKLSAgICAgIGJvb2wgX190b29fYmlnID0gX19yLT5fTV9zaXplLl9NX2RhdGEgPiBfX3ByZWZpeC0+X01fc2l6ZS5fTV9kYXRhOwotCi0gICAgICBfU19mbGF0dGVuKF9fcHJlZml4LCBfX2J1ZmZlcik7Ci0gICAgICBfX2J1ZmZlcltfX3ByZWZpeC0+X01fc2l6ZS5fTV9kYXRhXSA9IF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQoX0NoYXJUKTsKLSAgICAgIHByaW50ZigiJXMlc1xuIiwgKGNoYXIqKV9fYnVmZmVyLCBfX3Rvb19iaWc/ICIuLi5cbiIgOiAiXG4iKTsKLSAgICB9IGVsc2UgewotICAgICAgcHJpbnRmKCJcbiIpOwotICAgIH0KLSAgfQotfQotI2VuZGlmIC8qIF9TVExQX0RFQlVHICovCi0KLSMgZGVmaW5lIF9fUk9QRV9UQUJMRV9CT0RZICA9IHsgXAotLyogMCAqLzEsIC8qIDEgKi8yLCAvKiAyICovMywgLyogMyAqLzUsIC8qIDQgKi84LCAvKiA1ICovMTMsIC8qIDYgKi8yMSwgICAgICAgICBcCi0vKiA3ICovMzQsIC8qIDggKi81NSwgLyogOSAqLzg5LCAvKiAxMCAqLzE0NCwgLyogMTEgKi8yMzMsIC8qIDEyICovMzc3LCAgICAgICAgIFwKLS8qIDEzICovNjEwLCAvKiAxNCAqLzk4NywgLyogMTUgKi8xNTk3LCAvKiAxNiAqLzI1ODQsIC8qIDE3ICovNDE4MSwgICAgICAgICAgICAgXAotLyogMTggKi82NzY1dWwsIC8qIDE5ICovMTA5NDZ1bCwgLyogMjAgKi8xNzcxMXVsLCAvKiAyMSAqLzI4NjU3dWwsIC8qIDIyICovNDYzNjh1bCwgICBcCi0vKiAyMyAqLzc1MDI1dWwsIC8qIDI0ICovMTIxMzkzdWwsIC8qIDI1ICovMTk2NDE4dWwsIC8qIDI2ICovMzE3ODExdWwsICAgICAgICAgICAgICAgIFwKLS8qIDI3ICovNTE0MjI5dWwsIC8qIDI4ICovODMyMDQwdWwsIC8qIDI5ICovMTM0NjI2OXVsLCAvKiAzMCAqLzIxNzgzMDl1bCwgICAgICAgICAgICAgXAotLyogMzEgKi8zNTI0NTc4dWwsIC8qIDMyICovNTcwMjg4N3VsLCAvKiAzMyAqLzkyMjc0NjV1bCwgLyogMzQgKi8xNDkzMDM1MnVsLCAgICAgICAgICBcCi0vKiAzNSAqLzI0MTU3ODE3dWwsIC8qIDM2ICovMzkwODgxNjl1bCwgLyogMzcgKi82MzI0NTk4NnVsLCAvKiAzOCAqLzEwMjMzNDE1NXVsLCAgICAgIFwKLS8qIDM5ICovMTY1NTgwMTQxdWwsIC8qIDQwICovMjY3OTE0Mjk2dWwsIC8qIDQxICovNDMzNDk0NDM3dWwsICAgICAgICAgICAgICAgICAgICAgICAgXAotLyogNDIgKi83MDE0MDg3MzN1bCwgLyogNDMgKi8xMTM0OTAzMTcwdWwsIC8qIDQ0ICovMTgzNjMxMTkwM3VsLCAgICAgICAgICAgICAgICAgICAgICBcCi0vKiA0NSAqLzI5NzEyMTUwNzN1bCB9Ci0KLSMgaWYgKCBfU1RMUF9TVEFUSUNfVEVNUExBVEVfREFUQSA+IDAgKQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgotY29uc3QgdW5zaWduZWQgbG9uZwotcm9wZTxfQ2hhclQsX0FsbG9jPjo6X1NfbWluX2xlbltfX1JPUEVfREVQVEhfU0laRV0gX19ST1BFX1RBQkxFX0JPRFk7Ci0jIGVsc2UKLV9fREVDTEFSRV9JTlNUQU5DRShjb25zdCB1bnNpZ25lZCBsb25nLAotICAgICAgICAgICAgICAgICAgIGNyb3BlOjpfU19taW5fbGVuW19fUk9QRV9ERVBUSF9TSVpFXSwKLSAgICAgICAgICAgICAgICAgICBfX1JPUEVfVEFCTEVfQk9EWSk7Ci0jICBpZm5kZWYgX1NUTFBfTk9fV0NIQVJfVAotX19ERUNMQVJFX0lOU1RBTkNFKGNvbnN0IHVuc2lnbmVkIGxvbmcsCi0gICAgICAgICAgICAgICAgICAgd3JvcGU6Ol9TX21pbl9sZW5bX19ST1BFX0RFUFRIX1NJWkVdLAotICAgICAgICAgICAgICAgICAgIF9fUk9QRV9UQUJMRV9CT0RZKTsKLSMgIGVuZGlmCi0jIGVuZGlmCi0jIHVuZGVmIF9fUk9QRV9ERVBUSF9TSVpFCi0jIHVuZGVmIF9fUk9QRV9NQVhfREVQVEgKLSMgdW5kZWYgX19ST1BFX1RBQkxFX0JPRFkKLQotLy8gVGhlc2UgYXJlIEZpYm9uYWNjaSBudW1iZXJzIDwgMioqMzIuCi0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KLV9fUm9wZVJlcF9fKiByb3BlPF9DaGFyVCxfQWxsb2M+OjpfU19iYWxhbmNlKF9Sb3BlUmVwKiBfX3IpIHsKLSAgX1JvcGVSZXAqIF9fZm9yZXN0W19Sb3BlUmVwOjpfU19tYXhfcm9wZV9kZXB0aCArIDFdID0gezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsMCwwLDAsMCwwfTsKLSAgX1JvcGVSZXAqIF9fcmVzdWx0ID0gMDsKLSAgaW50IF9faTsKLSAgLy8gSW52YXJpYW50OgotICAvLyBUaGUgY29uY2F0ZW5hdGlvbiBvZiBmb3Jlc3QgaW4gZGVzY2VuZGluZyBvcmRlciBpcyBlcXVhbCB0byBfX3IuCi0gIC8vIF9fZm9yZXN0W19faV0uX01fc2l6ZS5fTV9kYXRhID49IF9TX21pbl9sZW5bX19pXQotICAvLyBfX2ZvcmVzdFtfX2ldLl9NX2RlcHRoID0gX19pCi0gIC8vIFJlZmVyZW5jZXMgZnJvbSBmb3Jlc3QgYXJlIGluY2x1ZGVkIGluIHJlZmNvdW50LgotCi0gIF9TVExQX1RSWSB7Ci0gICAgX1NfYWRkX3RvX2ZvcmVzdChfX3IsIF9fZm9yZXN0KTsKLSAgICBmb3IgKF9faSA9IDA7IF9faSA8PSBfUm9wZVJlcDo6X1NfbWF4X3JvcGVfZGVwdGg7ICsrX19pKQotICAgICAgaWYgKDAgIT0gX19mb3Jlc3RbX19pXSkgewotICAgICAgICBfU2VsZl9kZXN0cnVjdF9wdHIgX19vbGQoX19yZXN1bHQpOwotICAgICAgICBfX3Jlc3VsdCA9IF9TX2NvbmNhdF9yZXAoX19mb3Jlc3RbX19pXSwgX19yZXN1bHQpOwotICAgICAgICBfX2ZvcmVzdFtfX2ldLT5fTV91bnJlZl9ub25uaWwoKTsKLSMgaWZkZWYgX1NUTFBfVVNFX0VYQ0VQVElPTlMKLSAgICAgICAgX19mb3Jlc3RbX19pXSA9IDA7Ci0jIGVuZGlmCi0gICAgICB9Ci0gICAgfQotICAgIF9TVExQX1VOV0lORChmb3IoX19pID0gMDsgX19pIDw9IF9Sb3BlUmVwOjpfU19tYXhfcm9wZV9kZXB0aDsgKytfX2kpCi0gICAgX1NfdW5yZWYoX19mb3Jlc3RbX19pXSkpCi0gICAgaWYgKF9fcmVzdWx0LT5fTV9kZXB0aCA+IF9Sb3BlUmVwOjpfU19tYXhfcm9wZV9kZXB0aCkgewotICAgICAgX19zdGxfdGhyb3dfcmFuZ2VfZXJyb3IoInJvcGUgdG9vIGxvbmciKTsKLSAgICB9Ci0gICAgcmV0dXJuKF9fcmVzdWx0KTsKLX0KLQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+Ci12b2lkCi1yb3BlPF9DaGFyVCxfQWxsb2M+OjpfU19hZGRfdG9fZm9yZXN0KF9Sb3BlUmVwKiBfX3IsIF9Sb3BlUmVwKiogX19mb3Jlc3QpCi17Ci0gICAgaWYgKF9fciAtPiBfTV9pc19iYWxhbmNlZCkgewotICAgICAgX1NfYWRkX2xlYWZfdG9fZm9yZXN0KF9fciwgX19mb3Jlc3QpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBfU1RMUF9BU1NFUlQoX19yLT5fTV90YWcgPT0gX1JvcGVSZXA6Ol9TX2NvbmNhdCkKLSAgICB7Ci0gICAgICBfUm9wZUNvbmNhdGVuYXRpb24qIF9fYyA9IChfUm9wZUNvbmNhdGVuYXRpb24qKV9fcjsKLQotICAgICAgX1NfYWRkX3RvX2ZvcmVzdChfX2MtPl9NX2xlZnQsIF9fZm9yZXN0KTsKLSAgICAgIF9TX2FkZF90b19mb3Jlc3QoX19jLT5fTV9yaWdodCwgX19mb3Jlc3QpOwotICAgIH0KLX0KLQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+Ci12b2lkCi1yb3BlPF9DaGFyVCxfQWxsb2M+OjpfU19hZGRfbGVhZl90b19mb3Jlc3QoX1JvcGVSZXAqIF9fciwgX1JvcGVSZXAqKiBfX2ZvcmVzdCkKLXsKLSAgICBfUm9wZVJlcCogX19pbnNlcnRlZTsgICAgICAgLy8gaW5jbHVkZWQgaW4gcmVmY291bnQKLSAgICBfUm9wZVJlcCogX190b29fdGlueSA9IDA7ICAgICAgLy8gaW5jbHVkZWQgaW4gcmVmY291bnQKLSAgICBpbnQgX19pOyAgICAgICAgICAvLyBmb3Jlc3RbMC4uX19pLTFdIGlzIGVtcHR5Ci0gICAgc2l6ZV90IF9fcyA9IF9fci0+X01fc2l6ZS5fTV9kYXRhOwotCi0gICAgZm9yIChfX2kgPSAwOyBfX3MgPj0gX1NfbWluX2xlbltfX2krMV0vKiBub3QgdGhpcyBidWNrZXQgKi87ICsrX19pKSB7Ci0gIGlmICgwICE9IF9fZm9yZXN0W19faV0pIHsKLSAgICAgICAgX1NlbGZfZGVzdHJ1Y3RfcHRyIF9fb2xkKF9fdG9vX3RpbnkpOwotICAgICAgX190b29fdGlueSA9IF9TX2NvbmNhdF9hbmRfc2V0X2JhbGFuY2VkKF9fZm9yZXN0W19faV0sIF9fdG9vX3RpbnkpOwotICAgICAgX19mb3Jlc3RbX19pXS0+X01fdW5yZWZfbm9ubmlsKCk7Ci0gICAgICBfX2ZvcmVzdFtfX2ldID0gMDsKLSAgfQotICAgIH0KLSAgICB7Ci0gICAgX1NlbGZfZGVzdHJ1Y3RfcHRyIF9fb2xkKF9fdG9vX3RpbnkpOwotICBfX2luc2VydGVlID0gX1NfY29uY2F0X2FuZF9zZXRfYmFsYW5jZWQoX190b29fdGlueSwgX19yKTsKLSAgICB9Ci0gICAgLy8gVG9vX3RpbnkgZGVhZCwgYW5kIG5vIGxvbmdlciBpbmNsdWRlZCBpbiByZWZjb3VudC4KLSAgICAvLyBJbnNlcnRlZSBpcyBsaXZlIGFuZCBpbmNsdWRlZC4KLSAgICBfU1RMUF9BU1NFUlQoX1NfaXNfYWxtb3N0X2JhbGFuY2VkKF9faW5zZXJ0ZWUpKQotICAgIF9TVExQX0FTU0VSVChfX2luc2VydGVlLT5fTV9kZXB0aCA8PSBfX3ItPl9NX2RlcHRoICsgMSkKLSAgICBmb3IgKDs7ICsrX19pKSB7Ci0gICAgICBpZiAoMCAhPSBfX2ZvcmVzdFtfX2ldKSB7Ci0gICAgICAgIF9TZWxmX2Rlc3RydWN0X3B0ciBfX29sZChfX2luc2VydGVlKTsKLSAgICAgIF9faW5zZXJ0ZWUgPSBfU19jb25jYXRfYW5kX3NldF9iYWxhbmNlZChfX2ZvcmVzdFtfX2ldLCBfX2luc2VydGVlKTsKLSAgICAgIF9fZm9yZXN0W19faV0tPl9NX3VucmVmX25vbm5pbCgpOwotICAgICAgX19mb3Jlc3RbX19pXSA9IDA7Ci0gICAgICBfU1RMUF9BU1NFUlQoX1NfaXNfYWxtb3N0X2JhbGFuY2VkKF9faW5zZXJ0ZWUpKQotICB9Ci0gIF9TVExQX0FTU0VSVChfU19taW5fbGVuW19faV0gPD0gX19pbnNlcnRlZS0+X01fc2l6ZS5fTV9kYXRhKQotICBfU1RMUF9BU1NFUlQoX19mb3Jlc3RbX19pXSA9PSAwKQotICBpZiAoX19pID09IF9Sb3BlUmVwOjpfU19tYXhfcm9wZV9kZXB0aCB8fAotICAgICAgICBfX2luc2VydGVlLT5fTV9zaXplLl9NX2RhdGEgPCBfU19taW5fbGVuW19faSsxXSkgewotICAgICAgX19mb3Jlc3RbX19pXSA9IF9faW5zZXJ0ZWU7Ci0gICAgICAvLyByZWZjb3VudCBpcyBPSyBzaW5jZSBfX2luc2VydGVlIGlzIG5vdyBkZWFkLgotICAgICAgcmV0dXJuOwotICB9Ci0gICAgfQotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+Ci1fQ2hhclQKLXJvcGU8X0NoYXJULF9BbGxvYz46Ol9TX2ZldGNoKF9Sb3BlUmVwKiBfX3IsIHNpemVfdHlwZSBfX2kpCi17Ci0gICAgX0NoYXJUKiBfX2NzdHIgPSBfX3ItPl9NX2Nfc3RyaW5nOwotCi0gICAgX1NUTFBfQVNTRVJUKF9faSA8IF9fci0+X01fc2l6ZS5fTV9kYXRhKQotICAgIGlmICgwICE9IF9fY3N0cikgcmV0dXJuIF9fY3N0cltfX2ldOwotICAgIGZvcig7OykgewotICAgICAgc3dpdGNoKF9fci0+X01fdGFnKSB7Ci0gIGNhc2UgX1JvcGVSZXA6Ol9TX2NvbmNhdDoKLSAgICAgIHsKLSAgICBfUm9wZUNvbmNhdGVuYXRpb24qIF9fYyA9IChfUm9wZUNvbmNhdGVuYXRpb24qKV9fcjsKLSAgICBfUm9wZVJlcCogX19sZWZ0ID0gX19jLT5fTV9sZWZ0OwotICAgIHNpemVfdCBfX2xlZnRfbGVuID0gX19sZWZ0LT5fTV9zaXplLl9NX2RhdGE7Ci0KLSAgICBpZiAoX19pID49IF9fbGVmdF9sZW4pIHsKLSAgICAgICAgX19pIC09IF9fbGVmdF9sZW47Ci0gICAgICAgIF9fciA9IF9fYy0+X01fcmlnaHQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgX19yID0gX19sZWZ0OwotICAgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICBjYXNlIF9Sb3BlUmVwOjpfU19sZWFmOgotICAgICAgewotICAgIF9Sb3BlTGVhZiogX19sID0gKF9Sb3BlTGVhZiopX19yOwotICAgIHJldHVybiBfX2wtPl9NX2RhdGFbX19pXTsKLSAgICAgIH0KLSAgY2FzZSBfUm9wZVJlcDo6X1NfZnVuY3Rpb246Ci0gIGNhc2UgX1JvcGVSZXA6Ol9TX3N1YnN0cmluZ2ZuOgotICAgICAgewotICAgIF9Sb3BlRnVuY3Rpb24qIF9fZiA9IChfUm9wZUZ1bmN0aW9uKilfX3I7Ci0gICAgX0NoYXJUIF9fcmVzdWx0OwotCi0gICAgKCooX19mLT5fTV9mbikpKF9faSwgMSwgJl9fcmVzdWx0KTsKLSAgICByZXR1cm4gX19yZXN1bHQ7Ci0gICAgICB9Ci0gICAgICB9Ci0gICAgfQotI2lmIGRlZmluZWQoX1NUTFBfTkVFRF9VTlJFQUNIQUJMRV9SRVRVUk4pCi0gICAgcmV0dXJuIDA7Ci0jZW5kaWYKLX0KLQotLy8gUmV0dXJuIGEgdW5pcXVlbHkgcmVmZXJlbmNlZCBjaGFyYWN0ZXIgc2xvdCBmb3IgdGhlIGdpdmVuCi0vLyBwb3NpdGlvbiwgb3IgMCBpZiB0aGF0J3Mgbm90IHBvc3NpYmxlLgotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgotX0NoYXJUKgotcm9wZTxfQ2hhclQsX0FsbG9jPjo6X1NfZmV0Y2hfcHRyKF9Sb3BlUmVwKiBfX3IsIHNpemVfdHlwZSBfX2kpCi17Ci0gICAgX1JvcGVSZXAqIF9fY2xyc3RhY2tbX1JvcGVSZXA6Ol9TX21heF9yb3BlX2RlcHRoXTsKLSAgICBzaXplX3QgX19jc3B0ciA9IDA7Ci0KLSAgICBmb3IoOzspIHsKLSAgICAgIC8vIGlmIChfX3ItPl9NX3JlZl9jb3VudCA+IDEpIHJldHVybiAwOwotICAgICAgaWYgKCBfX3ItPl9NX2luY3IoKSA+IDIgKSB7Ci0gICAgICAgIF9fci0+X01fZGVjcigpOwotICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0KLSAgICAgIHN3aXRjaChfX3ItPl9NX3RhZykgewotICBjYXNlIF9Sb3BlUmVwOjpfU19jb25jYXQ6Ci0gICAgICB7Ci0gICAgX1JvcGVDb25jYXRlbmF0aW9uKiBfX2MgPSAoX1JvcGVDb25jYXRlbmF0aW9uKilfX3I7Ci0gICAgX1JvcGVSZXAqIF9fbGVmdCA9IF9fYy0+X01fbGVmdDsKLSAgICBzaXplX3QgX19sZWZ0X2xlbiA9IF9fbGVmdC0+X01fc2l6ZS5fTV9kYXRhOwotCi0gICAgaWYgKF9fYy0+X01fY19zdHJpbmcgIT0gMCkgX19jbHJzdGFja1tfX2NzcHRyKytdID0gX19jOwotICAgIGlmIChfX2kgPj0gX19sZWZ0X2xlbikgewotICAgICAgICBfX2kgLT0gX19sZWZ0X2xlbjsKLSAgICAgICAgX19yID0gX19jLT5fTV9yaWdodDsKLSAgICB9IGVsc2UgewotICAgICAgICBfX3IgPSBfX2xlZnQ7Ci0gICAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0gIGNhc2UgX1JvcGVSZXA6Ol9TX2xlYWY6Ci0gICAgICB7Ci0gICAgX1JvcGVMZWFmKiBfX2wgPSAoX1JvcGVMZWFmKilfX3I7Ci0gICAgaWYgKF9fbC0+X01fY19zdHJpbmcgIT0gX19sLT5fTV9kYXRhICYmIF9fbC0+X01fY19zdHJpbmcgIT0gMCkKLSAgICAgICAgX19jbHJzdGFja1tfX2NzcHRyKytdID0gX19sOwotICAgIHdoaWxlIChfX2NzcHRyID4gMCkgewotICAgICAgICAtLSBfX2NzcHRyOwotICAgICAgICBfUm9wZVJlcCogX19kID0gX19jbHJzdGFja1tfX2NzcHRyXTsKLSAgICAgICAgX19kLT5fTV9mcmVlX2Nfc3RyaW5nKCk7Ci0gICAgICAgIF9fZC0+X01fY19zdHJpbmcgPSAwOwotICAgIH0KLSAgICByZXR1cm4gX19sLT5fTV9kYXRhICsgX19pOwotICAgICAgfQotICBjYXNlIF9Sb3BlUmVwOjpfU19mdW5jdGlvbjoKLSAgY2FzZSBfUm9wZVJlcDo6X1Nfc3Vic3RyaW5nZm46Ci0gICAgICByZXR1cm4gMDsKLSAgICAgIH0KLSAgICB9Ci0jaWYgZGVmaW5lZChfU1RMUF9ORUVEX1VOUkVBQ0hBQkxFX1JFVFVSTikKLSAgICByZXR1cm4gMDsKLSNlbmRpZgotCi19Ci0KLS8vIFRoZSBmb2xsb3dpbmcgY291bGQgYmUgaW1wbGVtZW50ZWQgdHJpdmlhbGx5IHVzaW5nCi0vLyBsZXhpY29ncmFwaGljYWxfY29tcGFyZV8zd2F5LgotLy8gV2UgZG8gYSBsaXR0bGUgbW9yZSB3b3JrIHRvIGF2b2lkIGRlYWxpbmcgd2l0aCByb3BlIGl0ZXJhdG9ycyBmb3IKLS8vIGZsYXQgc3RyaW5ncy4KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KLWludAotcm9wZTxfQ2hhclQsX0FsbG9jPjo6X1NfY29tcGFyZSAoY29uc3QgX1JvcGVSZXAqIF9fbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9Sb3BlUmVwKiBfX3JpZ2h0KSB7Ci0gIHNpemVfdCBfX2xlZnRfbGVuOwotICBzaXplX3QgX19yaWdodF9sZW47Ci0KLSAgaWYgKDAgPT0gX19yaWdodCkgcmV0dXJuIDAgIT0gX19sZWZ0OwotICBpZiAoMCA9PSBfX2xlZnQpIHJldHVybiAtMTsKLSAgX19sZWZ0X2xlbiA9IF9fbGVmdC0+X01fc2l6ZS5fTV9kYXRhOwotICBfX3JpZ2h0X2xlbiA9IF9fcmlnaHQtPl9NX3NpemUuX01fZGF0YTsKLSAgaWYgKF9Sb3BlUmVwOjpfU19sZWFmID09IF9fbGVmdC0+X01fdGFnKSB7Ci0gICAgY29uc3QgX1JvcGVMZWFmKiBfX2wgPSBfX1NUQVRJQ19DQVNUKGNvbnN0IF9Sb3BlTGVhZiosIF9fbGVmdCk7Ci0gICAgaWYgKF9Sb3BlUmVwOjpfU19sZWFmID09IF9fcmlnaHQtPl9NX3RhZykgewotICAgICAgY29uc3QgX1JvcGVMZWFmKiBfX3IgPSBfX1NUQVRJQ19DQVNUKGNvbnN0IF9Sb3BlTGVhZiosIF9fcmlnaHQpOwotICAgICAgcmV0dXJuIF9TVExQX1BSSVYgX19sZXhpY29ncmFwaGljYWxfY29tcGFyZV8zd2F5KF9fbC0+X01fZGF0YSwgX19sLT5fTV9kYXRhICsgX19sZWZ0X2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3ItPl9NX2RhdGEsIF9fci0+X01fZGF0YSArIF9fcmlnaHRfbGVuKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBjb25zdF9pdGVyYXRvciBfX3JzdGFydChfX3JpZ2h0LCAwKTsKLSAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fcmVuZChfX3JpZ2h0LCBfX3JpZ2h0X2xlbik7Ci0gICAgICByZXR1cm4gX1NUTFBfUFJJViBfX2xleGljb2dyYXBoaWNhbF9jb21wYXJlXzN3YXkoX19sLT5fTV9kYXRhLCBfX2wtPl9NX2RhdGEgKyBfX2xlZnRfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcnN0YXJ0LCBfX3JlbmQpOwotICAgIH0KLSAgfQotICBlbHNlIHsKLSAgICBjb25zdF9pdGVyYXRvciBfX2xzdGFydChfX2xlZnQsIDApOwotICAgIGNvbnN0X2l0ZXJhdG9yIF9fbGVuZChfX2xlZnQsIF9fbGVmdF9sZW4pOwotICAgIGlmIChfUm9wZVJlcDo6X1NfbGVhZiA9PSBfX3JpZ2h0LT5fTV90YWcpIHsKLSAgICAgIGNvbnN0IF9Sb3BlTGVhZiogX19yID0gX19TVEFUSUNfQ0FTVChjb25zdCBfUm9wZUxlYWYqLCBfX3JpZ2h0KTsKLSAgICAgIHJldHVybiBfU1RMUF9QUklWIF9fbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmVfM3dheShfX2xzdGFydCwgX19sZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fci0+X01fZGF0YSwgX19yLT5fTV9kYXRhICsgX19yaWdodF9sZW4pOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fcnN0YXJ0KF9fcmlnaHQsIDApOwotICAgICAgY29uc3RfaXRlcmF0b3IgX19yZW5kKF9fcmlnaHQsIF9fcmlnaHRfbGVuKTsKLSAgICAgIHJldHVybiBfU1RMUF9QUklWIF9fbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmVfM3dheShfX2xzdGFydCwgX19sZW5kLCBfX3JzdGFydCwgX19yZW5kKTsKLSAgICB9Ci0gIH0KLX0KLQotLy8gQXNzaWdubWVudCB0byByZWZlcmVuY2UgcHJveGllcy4KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KLV9Sb3BlX2NoYXJfcmVmX3Byb3h5PF9DaGFyVCwgX0FsbG9jPiYKLV9Sb3BlX2NoYXJfcmVmX3Byb3h5PF9DaGFyVCwgX0FsbG9jPjo6b3BlcmF0b3I9IChfQ2hhclQgX19jKSB7Ci0gICAgX1JvcGVSZXAqIF9fb2xkID0gX01fcm9vdC0+X01fdHJlZV9wdHIuX01fZGF0YTsKLSAgLy8gRmlyc3QgY2hlY2sgZm9yIHRoZSBjYXNlIGluIHdoaWNoIGV2ZXJ5dGhpbmcgaXMgdW5pcXVlbHkKLSAgLy8gcmVmZXJlbmNlZC4gIEluIHRoYXQgY2FzZSB3ZSBjYW4gZG8gdGhpcyBkZXN0cnVjdGl2ZWx5LgotICBfQ2hhclQqIF9fcHRyID0gX015X3JvcGU6Ol9TX2ZldGNoX3B0cihfX29sZCwgX01fcG9zKTsKLSAgaWYgKDAgIT0gX19wdHIpIHsKLSAgICAgICpfX3B0ciA9IF9fYzsKLSAgICAgIHJldHVybiAqdGhpczsKLSAgfQotICAgIF9TZWxmX2Rlc3RydWN0X3B0ciBfX2xlZnQoCi0gICAgICBfTXlfcm9wZTo6X1Nfc3Vic3RyaW5nKF9fb2xkLCAwLCBfTV9wb3MpKTsKLSAgICBfU2VsZl9kZXN0cnVjdF9wdHIgX19yaWdodCgKLSAgICAgIF9NeV9yb3BlOjpfU19zdWJzdHJpbmcoX19vbGQsIF9NX3BvcysxLCBfX29sZC0+X01fc2l6ZS5fTV9kYXRhKSk7Ci0gICAgX1NlbGZfZGVzdHJ1Y3RfcHRyIF9fcmVzdWx0X2xlZnQoCi0gICAgICBfTXlfcm9wZTo6X1NfZGVzdHJfY29uY2F0X2NoYXJfaXRlcihfX2xlZnQsICZfX2MsIDEpKTsKLQotICAgIC8vIF9TVExQX0FTU0VSVChfX2xlZnQgPT0gX19yZXN1bHRfbGVmdCB8fCAxID09IF9fcmVzdWx0X2xlZnQtPl9NX3JlZl9jb3VudCkKLSAgICBfUm9wZVJlcCogX19yZXN1bHQgPQotICAgICAgX015X3JvcGU6Ol9TX2NvbmNhdF9yZXAoX19yZXN1bHRfbGVmdCwgX19yaWdodCk7Ci0gICAgLy8gX1NUTFBfQVNTRVJUKDEgPD0gX19yZXN1bHQtPl9NX3JlZl9jb3VudCkKLSAgICBfUm9wZVJlcDo6X1NfdW5yZWYoX19vbGQpOwotICAgIF9NX3Jvb3QtPl9NX3RyZWVfcHRyLl9NX2RhdGEgPSBfX3Jlc3VsdDsKLSAgICByZXR1cm4gKnRoaXM7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KLV9Sb3BlX2NoYXJfcHRyX3Byb3h5PF9DaGFyVCwgX0FsbG9jPgotX1JvcGVfY2hhcl9yZWZfcHJveHk8X0NoYXJULCBfQWxsb2M+OjpvcGVyYXRvciYgKCkgY29uc3QgewotICAgIHJldHVybiBfUm9wZV9jaGFyX3B0cl9wcm94eTxfQ2hhclQsIF9BbGxvYz4oKnRoaXMpOwotfQotCi0jIGlmICggX1NUTFBfU1RBVElDX1RFTVBMQVRFX0RBVEEgPiAwICkKLXRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgotX0NoYXJUIHJvcGU8X0NoYXJULF9BbGxvYz46Ol9TX2VtcHR5X2Nfc3RyWzFdID0geyBfQ2hhclQoKSB9OwotIyBlbHNlCi1fX0RFQ0xBUkVfSU5TVEFOQ0UoY2hhciwgY3JvcGU6Ol9TX2VtcHR5X2Nfc3RyWzFdLCA9ezB9KTsKLSMgaWZkZWYgX1NUTFBfSEFTX1dDSEFSX1QKLV9fREVDTEFSRV9JTlNUQU5DRSh3Y2hhcl90LCB3cm9wZTo6X1NfZW1wdHlfY19zdHJbMV0sID17MH0pOwotIyBlbmRpZiAvKiBfU1RMUF9IQVNfV0NIQVJfVCAqLwotIyBlbmRpZiAvKiBfU1RMUF9TVEFUSUNfVEVNUExBVEVfREFUQSAqLwotLy8gIyBlbmRpZgotCi0jaWYgIWRlZmluZWQgKF9TVExQX1NUQVRJQ19DT05TVF9JTklUX0JVRykKLSMgIGlmICFkZWZpbmVkIChfX0dOVUNfXykgfHwgKF9fR05VQ19fICE9IDIpIHx8IChfX0dOVUNfTUlOT1JfXyAhPSA5NikKLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KLWNvbnN0IHNpemVfdCByb3BlPF9DaGFyVCwgX0FsbG9jPjo6bnBvczsKLSMgIGVuZGlmCi0jZW5kaWYKLQotdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+Ci1jb25zdCBfQ2hhclQqIHJvcGU8X0NoYXJULF9BbGxvYz46OmNfc3RyKCkgY29uc3QgewotICBpZiAoMCA9PSBfTV90cmVlX3B0ci5fTV9kYXRhKSB7Ci0gICAgLy8gUG9zc2libHkgcmVkdW5kYW50LCBidXQgcHJvYmFibHkgZmFzdC4KLSAgICBfU19lbXB0eV9jX3N0clswXSA9IF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQoX0NoYXJUKTsKLSAgICByZXR1cm4gX1NfZW1wdHlfY19zdHI7Ci0gIH0KLSAgX0NoYXJUKiBfX29sZF9jX3N0cmluZyA9IF9NX3RyZWVfcHRyLl9NX2RhdGEtPl9NX2Nfc3RyaW5nOwotICBpZiAoMCAhPSBfX29sZF9jX3N0cmluZykgcmV0dXJuIF9fb2xkX2Nfc3RyaW5nOwotICBzaXplX3QgX19zID0gc2l6ZSgpOwotICBfQ2hhclQqIF9fcmVzdWx0ID0gX1NUTFBfQ1JFQVRFX0FMTE9DQVRPUihhbGxvY2F0b3JfdHlwZSwoY29uc3QgYWxsb2NhdG9yX3R5cGUmKV9NX3RyZWVfcHRyLCBfQ2hhclQpLmFsbG9jYXRlKF9fcyArIDEpOwotICBfU19mbGF0dGVuKF9NX3RyZWVfcHRyLl9NX2RhdGEsIF9fcmVzdWx0KTsKLSAgX1NfY29uc3RydWN0X251bGwoX19yZXN1bHQgKyBfX3MpOwotICBfX29sZF9jX3N0cmluZyA9IF9fU1RBVElDX0NBU1QoX0NoYXJUKiwgX0F0b21pY19zd2FwX3B0cihfX1JFSU5URVJQUkVUX0NBU1Qodm9pZCogX1NUTFBfVk9MQVRJTEUqLCAmKF9NX3RyZWVfcHRyLl9NX2RhdGEtPl9NX2Nfc3RyaW5nKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcmVzdWx0KSk7Ci0gIGlmICgwICE9IF9fb2xkX2Nfc3RyaW5nKSB7Ci0gICAgLy8gSXQgbXVzdCBoYXZlIGJlZW4gYWRkZWQgaW4gdGhlIGludGVyaW0uICBIZW5jZSBpdCBoYWQgdG8gaGF2ZSBiZWVuCi0gICAgLy8gc2VwYXJhdGVseSBhbGxvY2F0ZWQuICBEZWFsbG9jYXRlIHRoZSBvbGQgY29weSwgc2luY2Ugd2UganVzdAotICAgIC8vIHJlcGxhY2VkIGl0LgotICAgIF9TVExQX1NURDo6X0Rlc3Ryb3lfUmFuZ2UoX19vbGRfY19zdHJpbmcsIF9fb2xkX2Nfc3RyaW5nICsgX19zICsgMSk7Ci0gICAgX1NUTFBfQ1JFQVRFX0FMTE9DQVRPUihhbGxvY2F0b3JfdHlwZSwoY29uc3QgYWxsb2NhdG9yX3R5cGUmKV9NX3RyZWVfcHRyLCBfQ2hhclQpLmRlYWxsb2NhdGUoX19vbGRfY19zdHJpbmcsIF9fcyArIDEpOwotICB9Ci0gIHJldHVybiBfX3Jlc3VsdDsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+Ci1jb25zdCBfQ2hhclQqIHJvcGU8X0NoYXJULF9BbGxvYz46OnJlcGxhY2Vfd2l0aF9jX3N0cigpIHsKLSAgaWYgKDAgPT0gX01fdHJlZV9wdHIuX01fZGF0YSkgewotICAgIF9TX2VtcHR5X2Nfc3RyWzBdID0gX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRChfQ2hhclQpOwotICAgIHJldHVybiBfU19lbXB0eV9jX3N0cjsKLSAgfQotICBfQ2hhclQqIF9fb2xkX2Nfc3RyaW5nID0gX01fdHJlZV9wdHIuX01fZGF0YS0+X01fY19zdHJpbmc7Ci0gIGlmIChfUm9wZVJlcDo6X1NfbGVhZiA9PSBfTV90cmVlX3B0ci5fTV9kYXRhLT5fTV90YWcgJiYgMCAhPSBfX29sZF9jX3N0cmluZykgewotICAgIHJldHVybiBfX29sZF9jX3N0cmluZzsKLSAgfQotICBzaXplX3QgX19zID0gc2l6ZSgpOwotICBfQ2hhclQqIF9fcmVzdWx0ID0gX01fdHJlZV9wdHIuYWxsb2NhdGUoX1Nfcm91bmRlZF91cF9zaXplKF9fcykpOwotICBfU19mbGF0dGVuKF9NX3RyZWVfcHRyLl9NX2RhdGEsIF9fcmVzdWx0KTsKLSAgX1NfY29uc3RydWN0X251bGwoX19yZXN1bHQgKyBfX3MpOwotICBfTV90cmVlX3B0ci5fTV9kYXRhLT5fTV91bnJlZl9ub25uaWwoKTsKLSAgX01fdHJlZV9wdHIuX01fZGF0YSA9IF9TX25ld19Sb3BlTGVhZihfX3Jlc3VsdCwgX19zLCBfTV90cmVlX3B0cik7Ci0gIHJldHVybiBfX3Jlc3VsdDsKLX0KLQotLy8gQWxnb3JpdGhtIHNwZWNpYWxpemF0aW9ucy4gIE1vcmUgc2hvdWxkIGJlIGFkZGVkLgotCi0jaWYgKCFkZWZpbmVkIChfU1RMUF9NU1ZDKSB8fCAoX1NUTFBfTVNWQyA+PSAxMzEwKSkgJiYgXAotICAgICghZGVmaW5lZCAoX19ETUNfXykgfHwgZGVmaW5lZCAoX19QVVRfU1RBVElDX0RBVEFfTUVNQkVSU19IRVJFKSkKLS8vIEkgY291bGRuJ3QgZ2V0IHRoaXMgdG8gd29yayB3aXRoIFZDKysKLXRlbXBsYXRlPGNsYXNzIF9DaGFyVCxjbGFzcyBfQWxsb2M+Ci12b2lkIF9Sb3BlX3JvdGF0ZShfUm9wZV9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPiBfX2ZpcnN0LAotICAgICAgICAgICAgICAgICAgX1JvcGVfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4gX19taWRkbGUsCi0gICAgICAgICAgICAgICAgICBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPiBfX2xhc3QpIHsKLSAgX1NUTFBfQVNTRVJUKF9fZmlyc3QuY29udGFpbmVyKCkgPT0gX19taWRkbGUuY29udGFpbmVyKCkgJiYKLSAgICAgICAgICAgICAgIF9fbWlkZGxlLmNvbnRhaW5lcigpID09IF9fbGFzdC5jb250YWluZXIoKSkKLSAgcm9wZTxfQ2hhclQsX0FsbG9jPiYgX19yKF9fZmlyc3QuY29udGFpbmVyKCkpOwotICByb3BlPF9DaGFyVCxfQWxsb2M+IF9fcHJlZml4ID0gX19yLnN1YnN0cigwLCBfX2ZpcnN0LmluZGV4KCkpOwotICByb3BlPF9DaGFyVCxfQWxsb2M+IF9fc3VmZml4ID0KLSAgICBfX3Iuc3Vic3RyKF9fbGFzdC5pbmRleCgpLCBfX3Iuc2l6ZSgpIC0gX19sYXN0LmluZGV4KCkpOwotICByb3BlPF9DaGFyVCxfQWxsb2M+IF9fcGFydDEgPQotICAgIF9fci5zdWJzdHIoX19taWRkbGUuaW5kZXgoKSwgX19sYXN0LmluZGV4KCkgLSBfX21pZGRsZS5pbmRleCgpKTsKLSAgcm9wZTxfQ2hhclQsX0FsbG9jPiBfX3BhcnQyID0KLSAgICBfX3Iuc3Vic3RyKF9fZmlyc3QuaW5kZXgoKSwgX19taWRkbGUuaW5kZXgoKSAtIF9fZmlyc3QuaW5kZXgoKSk7Ci0gIF9fciA9IF9fcHJlZml4OwotICBfX3IgKz0gX19wYXJ0MTsKLSAgX19yICs9IF9fcGFydDI7Ci0gIF9fciArPSBfX3N1ZmZpeDsKLX0KLQotCi0jIGlmIDAKLS8vIFByb2JhYmx5IG5vdCB1c2VmdWwgZm9yIHNldmVyYWwgcmVhc29uczoKLS8vIC0gZm9yIFNHSXMgNy4xIGNvbXBpbGVyIGFuZCBwcm9iYWJseSBzb21lIG90aGVycywKLS8vICAgdGhpcyBmb3JjZXMgbG90cyBvZiByb3BlPHdjaGFyX3QsIC4uLj4gaW5zdGFudGlhdGlvbnMsIGNyZWF0aW5nIGEKLS8vICAgY29kZSBibG9hdCBhbmQgY29tcGlsZSB0aW1lIHByb2JsZW0uICAoRml4ZWQgaW4gNy4yLikKLS8vIC0gd2NoYXJfdCBpcyA0IGJ5dGVzIHdpZGUgb24gbW9zdCBVTklYIHBsYXRmb3JtcywgbWFraW5nIGl0IHVuYXR0cmFjdGl2ZQotLy8gICBmb3IgdW5pY29kZSBzdHJpbmdzLiAgVW5zaWduZWQgc2hvcnQgbWF5IGJlIGEgYmV0dGVyIGNoYXJhY3RlcgotLy8gICB0eXBlLgotaW5saW5lIHZvaWQgcm90YXRlKAotICAgIF9Sb3BlX2l0ZXJhdG9yPHdjaGFyX3QsX1NUTFBfREVGQVVMVF9BTExPQ0FUT1IoY2hhcikgPiBfX2ZpcnN0LAotICAgICAgICAgICAgICAgIF9Sb3BlX2l0ZXJhdG9yPHdjaGFyX3QsX1NUTFBfREVGQVVMVF9BTExPQ0FUT1IoY2hhcikgPiBfX21pZGRsZSwKLSAgICAgICAgICAgICAgICBfUm9wZV9pdGVyYXRvcjx3Y2hhcl90LF9TVExQX0RFRkFVTFRfQUxMT0NBVE9SKGNoYXIpID4gX19sYXN0KSB7Ci0gICAgX1JvcGVfcm90YXRlKF9fZmlyc3QsIF9fbWlkZGxlLCBfX2xhc3QpOwotfQotIyBlbmRpZgotI2VuZGlmIC8qIF9TVExQX01TVkMgKi8KLQotIyAgIHVuZGVmIF9fUm9wZUxlYWZfXwotIyAgIHVuZGVmIF9fUm9wZVJlcF9fCi0jICAgdW5kZWYgX19Sb3BlTGVhZgotIyAgIHVuZGVmIF9fUm9wZVJlcAotIyAgIHVuZGVmIHNpemVfdHlwZQotCi1fU1RMUF9FTkRfTkFNRVNQQUNFCi0KLSMgZW5kaWYgLyogUk9QRUlNUExfSCAqLwotCi0vLyBMb2NhbCBWYXJpYWJsZXM6Ci0vLyBtb2RlOkMrKwotLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RsL19yb3BlLmggYi9zdGwvX3JvcGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJmYzg0ZS4uMDAwMDAwMAotLS0gYS9zdGwvX3JvcGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzNzQgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NwotICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk3Ci0gKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5Ci0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLQotLyogTk9URTogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgU1RMIGhlYWRlcnMuCi0gKiAgIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LgotICovCi0KLS8vIHJvcGU8X0NoYXJULF9BbGxvYz4gaXMgYSBzZXF1ZW5jZSBvZiBfQ2hhclQuCi0vLyBSb3BlcyBhcHBlYXIgdG8gYmUgbXV0YWJsZSwgYnV0IHVwZGF0ZSBvcGVyYXRpb25zCi0vLyByZWFsbHkgY29weSBlbm91Z2ggb2YgdGhlIGRhdGEgc3RydWN0dXJlIHRvIGxlYXZlIHRoZSBvcmlnaW5hbAotLy8gdmFsaWQuICBUaHVzIHJvcGVzIGNhbiBiZSBsb2dpY2FsbHkgY29waWVkIGJ5IGp1c3QgY29weWluZwotLy8gYSBwb2ludGVyIHZhbHVlLgotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX1JPUEVfSAotI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9ST1BFX0gKLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9BTEdPQkFTRV9ICi0jICBpbmNsdWRlIDxzdGwvX2FsZ29iYXNlLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBfU1RMUF9JT1NGV0QKLSMgIGluY2x1ZGUgPGlvc2Z3ZD4KLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0FMTE9DX0gKLSMgIGluY2x1ZGUgPHN0bC9fYWxsb2MuaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0lURVJBVE9SX0gKLSMgIGluY2x1ZGUgPHN0bC9faXRlcmF0b3IuaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0FMR09fSAotIyAgaW5jbHVkZSA8c3RsL19hbGdvLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9GVU5DVElPTl9CQVNFX0gKLSMgIGluY2x1ZGUgPHN0bC9fZnVuY3Rpb25fYmFzZS5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfTlVNRVJJQ19ICi0jICBpbmNsdWRlIDxzdGwvX251bWVyaWMuaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0hBU0hfRlVOX0gKLSMgIGluY2x1ZGUgPHN0bC9faGFzaF9mdW4uaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX0NIQVJfVFJBSVRTX0gKLSMgIGluY2x1ZGUgPHN0bC9jaGFyX3RyYWl0cy5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfVEhSRUFEU19ICi0jICBpbmNsdWRlIDxzdGwvX3RocmVhZHMuaD4KLSNlbmRpZgotCi0jaWZkZWYgX1NUTFBfU0dJX1RIUkVBRFMKLSMgIGluY2x1ZGUgPG11dGV4Lmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBfU1RMUF9ET05UX1NVUFBPUlRfUkVCSU5EX01FTUJFUl9URU1QTEFURQotIyAgZGVmaW5lIF9TVExQX0NSRUFURV9BTExPQ0FUT1IoX19hdHlwZSxfX2EsIF9UcCkgKF9BbGxvY190cmFpdHM8X1RwLF9fYXR5cGU+OjpjcmVhdGVfYWxsb2NhdG9yKF9fYSkpCi0jZWxpZiBkZWZpbmVkKF9fTVJDX18pfHxkZWZpbmVkKF9fU0NfXykKLSMgIGRlZmluZSBfU1RMUF9DUkVBVEVfQUxMT0NBVE9SKF9fYXR5cGUsX19hLCBfVHApIF9fc3RsX2FsbG9jX2NyZWF0ZTxfVHAsX19hdHlwZT4oX19hLChfVHAqKTApCi0jZWxzZQotIyAgZGVmaW5lIF9TVExQX0NSRUFURV9BTExPQ0FUT1IoX19hdHlwZSxfX2EsIF9UcCkgX19zdGxfYWxsb2NfY3JlYXRlKF9fYSwoX1RwKikwKQotI2VuZGlmCi0KLV9TVExQX0JFR0lOX05BTUVTUEFDRQotCi0vLyBGaXJzdCBhIGxvdCBvZiBmb3J3YXJkIGRlY2xhcmF0aW9ucy4gIFRoZSBzdGFuZGFyZCBzZWVtcyB0byByZXF1aXJlCi0vLyBtdWNoIHN0cmljdGVyICJkZWNsYXJhdGlvbiBiZWZvcmUgdXNlIiB0aGFuIG1hbnkgb2YgdGhlIGltcGxlbWVudGF0aW9ucwotLy8gdGhhdCBwcmVjZWRlZCBpdC4KLXRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgX1NUTFBfREVGQVVMVF9BTExPQ0FUT1JfU0VMRUNUKF9DaGFyVCkgPiBjbGFzcyByb3BlOwotdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+IHN0cnVjdCBfUm9wZV9Sb3BlQ29uY2F0ZW5hdGlvbjsKLXRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPiBzdHJ1Y3QgX1JvcGVfUm9wZVJlcDsKLXRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPiBzdHJ1Y3QgX1JvcGVfUm9wZUxlYWY7Ci10ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4gc3RydWN0IF9Sb3BlX1JvcGVGdW5jdGlvbjsKLXRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPiBzdHJ1Y3QgX1JvcGVfUm9wZVN1YnN0cmluZzsKLXRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPiBjbGFzcyBfUm9wZV9pdGVyYXRvcjsKLXRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPiBjbGFzcyBfUm9wZV9jb25zdF9pdGVyYXRvcjsKLXRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPiBjbGFzcyBfUm9wZV9jaGFyX3JlZl9wcm94eTsKLXRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPiBjbGFzcyBfUm9wZV9jaGFyX3B0cl9wcm94eTsKLQotX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQotCi0vLyBTb21lIGhlbHBlcnMsIHNvIHdlIGNhbiB1c2UgdGhlIHBvd2VyIGFsZ29yaXRobSBvbiByb3Blcy4KLS8vIFNlZSBiZWxvdyBmb3Igd2h5IHRoaXMgaXNuJ3QgbG9jYWwgdG8gdGhlIGltcGxlbWVudGF0aW9uLgotCi0vLyBUaGlzIHVzZXMgYSBub25zdGFuZGFyZCByZWZjb3VudCBjb252ZW50aW9uLgotLy8gVGhlIHJlc3VsdCBoYXMgcmVmY291bnQgMC4KLXRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgotc3RydWN0IF9Sb3BlX0NvbmNhdF9mbgotICA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248cm9wZTxfQ2hhclQsX0FsbG9jPiwgcm9wZTxfQ2hhclQsX0FsbG9jPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvcGU8X0NoYXJULF9BbGxvYz4gPiB7Ci0gIHJvcGU8X0NoYXJULF9BbGxvYz4gb3BlcmF0b3IoKSAoY29uc3Qgcm9wZTxfQ2hhclQsX0FsbG9jPiYgX194LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvcGU8X0NoYXJULF9BbGxvYz4mIF9feSkgewotICAgIHJldHVybiBfX3ggKyBfX3k7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KLWlubGluZQotcm9wZTxfQ2hhclQsX0FsbG9jPgotX19pZGVudGl0eV9lbGVtZW50KF9Sb3BlX0NvbmNhdF9mbjxfQ2hhclQsIF9BbGxvYz4pCi17IHJldHVybiByb3BlPF9DaGFyVCxfQWxsb2M+KCk7IH0KLQotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi0KLS8vIFN0b3JlIGFuIGVvcwotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KLWlubGluZSB2b2lkIF9TX2NvbnN0cnVjdF9udWxsX2F1eChfQ2hhclQgKl9fcCwgY29uc3QgX190cnVlX3R5cGUmKQoteyAqX19wID0gMDsgfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgotaW5saW5lIHZvaWQgX1NfY29uc3RydWN0X251bGxfYXV4KF9DaGFyVCAqX19wLCBjb25zdCBfX2ZhbHNlX3R5cGUmKQoteyBfU1RMUF9TVEQ6Ol9Db25zdHJ1Y3QoX19wKTsgfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgotaW5saW5lIHZvaWQgX1NfY29uc3RydWN0X251bGwoX0NoYXJUICpfX3ApIHsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfSXNJbnRlZ3JhbDxfQ2hhclQ+OjpfUmV0IF9DaGFyX0lzX0ludGVncmFsOwotICBfU19jb25zdHJ1Y3RfbnVsbF9hdXgoX19wLCBfQ2hhcl9Jc19JbnRlZ3JhbCgpKTsKLX0KLQotLy8gY2hhcl9wcm9kdWNlcnMgYXJlIGxvZ2ljYWxseSBmdW5jdGlvbnMgdGhhdCBnZW5lcmF0ZSBhIHNlY3Rpb24gb2YKLS8vIGEgc3RyaW5nLiAgVGhlc2UgY2FuIGJlIGNvbnZlcnRlZCB0byByb3Blcy4gIFRoZSByZXN1bHRpbmcgcm9wZQotLy8gaW52b2tlcyB0aGUgY2hhcl9wcm9kdWNlciBvbiBkZW1hbmQuICBUaGlzIGFsbG93cywgZm9yIGV4YW1wbGUsCi0vLyBmaWxlcyB0byBiZSB2aWV3ZWQgYXMgcm9wZXMgd2l0aG91dCByZWFkaW5nIHRoZSBlbnRpcmUgZmlsZS4KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+Ci1jbGFzcyBjaGFyX3Byb2R1Y2VyIHsKLXB1YmxpYzoKLSAgdmlydHVhbCB+Y2hhcl9wcm9kdWNlcigpIHt9Ci0gIHZpcnR1YWwgdm9pZCBvcGVyYXRvcigpKHNpemVfdCBfX3N0YXJ0X3Bvcywgc2l6ZV90IF9fbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICBfQ2hhclQqIF9fYnVmZmVyKSA9IDA7Ci0gIC8vIEJ1ZmZlciBzaG91bGQgcmVhbGx5IGJlIGFuIGFyYml0cmFyeSBvdXRwdXQgaXRlcmF0b3IuCi0gIC8vIFRoYXQgd2F5IHdlIGNvdWxkIGZsYXR0ZW4gZGlyZWN0bHkgaW50byBhbiBvc3RyZWFtLCBldGMuCi0gIC8vIFRoaXMgaXMgdGhvcm91Z2hseSBpbXBvc3NpYmxlLCBzaW5jZSBpdGVyYXRvciB0eXBlcyBkb24ndAotICAvLyBoYXZlIHJ1bnRpbWUgZGVzY3JpcHRpb25zLgotfTsKLQotLy8gU2VxdWVuY2UgYnVmZmVyczoKLS8vCi0vLyBTZXF1ZW5jZSBtdXN0IHByb3ZpZGUgYW4gYXBwZW5kIG9wZXJhdGlvbiB0aGF0IGFwcGVuZHMgYW4KLS8vIGFycmF5IHRvIHRoZSBzZXF1ZW5jZS4gIFNlcXVlbmNlIGJ1ZmZlcnMgYXJlIHVzZWZ1bCBvbmx5IGlmCi0vLyBhcHBlbmRpbmcgYW4gZW50aXJlIGFycmF5IGlzIGNoZWFwZXIgdGhhbiBhcHBlbmRpbmcgZWxlbWVudCBieSBlbGVtZW50LgotLy8gVGhpcyBpcyB0cnVlIGZvciBtYW55IHN0cmluZyByZXByZXNlbnRhdGlvbnMuCi0vLyBUaGlzIHNob3VsZCAgcGVyaGFwcyBpbmhlcml0IGZyb20gb3N0cmVhbTxzZXF1ZW5jZTo6dmFsdWVfdHlwZT4KLS8vIGFuZCBiZSBpbXBsZW1lbnRlZCBjb3JyZXNwb25kaW5nbHksIHNvIHRoYXQgdGhleSBjYW4gYmUgdXNlZAotLy8gZm9yIGZvcm1hdHRlZC4gIEZvciB0aGUgc2FrZSBvZiBwb3J0YWJpbGl0eSwgd2UgZG9uJ3QgZG8gdGhpcyB5ZXQuCi0vLwotLy8gRm9yIG5vdywgc2VxdWVuY2UgYnVmZmVycyBiZWhhdmUgYXMgb3V0cHV0IGl0ZXJhdG9ycy4gIEJ1dCB0aGV5IGFsc28KLS8vIGJlaGF2ZSBhIGxpdHRsZSBsaWtlIGJhc2ljX29zdHJpbmdzdHJlYW08c2VxdWVuY2U6OnZhbHVlX3R5cGU+IGFuZCBhCi0vLyBsaXR0bGUgbGlrZSBjb250YWluZXJzLgotCi10ZW1wbGF0ZTxjbGFzcyBfU2VxdWVuY2UKLSMgaWYgIShkZWZpbmVkIChfU1RMUF9OT05fVFlQRV9UTVBMX1BBUkFNX0JVRykgfHwgXAotICAgICAgIGRlZmluZWQgKCBfU1RMUF9OT19ERUZBVUxUX05PTl9UWVBFX1BBUkFNICkpCi0gICAgICAgICAsIHNpemVfdCBfQnVmX3N6ID0gMTAwCi0jICAgaWYgZGVmaW5lZChfX3NnaSkgJiYgIWRlZmluZWQoX19HTlVDX18pCi0jICAgZGVmaW5lIF9fVFlQRURFRl9XT1JLQVJPVU5ECi0gICAgICAgICAsY2xhc3MgX1YgPSB0eXBlbmFtZSBfU2VxdWVuY2U6OnZhbHVlX3R5cGUKLSMgICBlbmRpZiAvKiBfX3NnaSAqLwotIyBlbmRpZiAvKiBfU1RMUF9OT05fVFlQRV9UTVBMX1BBUkFNX0JVRyAqLwotICAgICAgICAgPgotLy8gVGhlIDNyZCBwYXJhbWV0ZXIgd29ya3MgYXJvdW5kIGEgY29tbW9uIGNvbXBpbGVyIGJ1Zy4KLWNsYXNzIHNlcXVlbmNlX2J1ZmZlciA6IHB1YmxpYyBpdGVyYXRvciA8b3V0cHV0X2l0ZXJhdG9yX3RhZywgdm9pZCwgdm9pZCwgdm9pZCwgdm9pZD4gewotcHVibGljOgotIyBpZm5kZWYgX19UWVBFREVGX1dPUktBUk9VTkQKLSAgdHlwZWRlZiB0eXBlbmFtZSBfU2VxdWVuY2U6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKLSAgdHlwZWRlZiBzZXF1ZW5jZV9idWZmZXI8X1NlcXVlbmNlCi0jIGlmICEoZGVmaW5lZCAoX1NUTFBfTk9OX1RZUEVfVE1QTF9QQVJBTV9CVUcpIHx8IFwKLSAgICAgICBkZWZpbmVkICggX1NUTFBfTk9fREVGQVVMVF9OT05fVFlQRV9QQVJBTSApKQotICAsIF9CdWZfc3oKLSAgPiBfU2VsZjsKLSMgZWxzZSAvKiBfU1RMUF9OT05fVFlQRV9UTVBMX1BBUkFNX0JVRyAqLwotICA+IF9TZWxmOwotICBlbnVtIHsgX0J1Zl9zeiA9IDEwMH07Ci0jIGVuZGlmIC8qIF9TVExQX05PTl9UWVBFX1RNUExfUEFSQU1fQlVHICovCi0gIC8vICMgZW5kaWYKLSMgZWxzZSAvKiBfX1RZUEVERUZfV09SS0FST1VORCAqLwotICB0eXBlZGVmIF9WIHZhbHVlX3R5cGU7Ci0gIHR5cGVkZWYgc2VxdWVuY2VfYnVmZmVyPF9TZXF1ZW5jZSwgX0J1Zl9zeiwgX1Y+IF9TZWxmOwotIyBlbmRpZiAvKiBfX1RZUEVERUZfV09SS0FST1VORCAqLwotcHJvdGVjdGVkOgotICBfU2VxdWVuY2UqIF9NX3ByZWZpeDsKLSAgdmFsdWVfdHlwZSBfTV9idWZmZXJbX0J1Zl9zel07Ci0gIHNpemVfdCAgICAgX01fYnVmX2NvdW50OwotcHVibGljOgotICB2b2lkIGZsdXNoKCkgewotICAgIF9NX3ByZWZpeC0+YXBwZW5kKF9NX2J1ZmZlciwgX01fYnVmZmVyICsgX01fYnVmX2NvdW50KTsKLSAgICBfTV9idWZfY291bnQgPSAwOwotICB9Ci0gIH5zZXF1ZW5jZV9idWZmZXIoKSB7IGZsdXNoKCk7IH0KLSAgc2VxdWVuY2VfYnVmZmVyKCkgOiBfTV9wcmVmaXgoMCksIF9NX2J1Zl9jb3VudCgwKSB7fQotICBzZXF1ZW5jZV9idWZmZXIoY29uc3QgX1NlbGYmIF9feCkgewotICAgIF9NX3ByZWZpeCA9IF9feC5fTV9wcmVmaXg7Ci0gICAgX01fYnVmX2NvdW50ID0gX194Ll9NX2J1Zl9jb3VudDsKLSAgICBjb3B5KF9feC5fTV9idWZmZXIsIF9feC5fTV9idWZmZXIgKyBfX3guX01fYnVmX2NvdW50LCBfTV9idWZmZXIpOwotICB9Ci0gIHNlcXVlbmNlX2J1ZmZlcihfU2VsZiYgX194KSB7Ci0gICAgX194LmZsdXNoKCk7Ci0gICAgX01fcHJlZml4ID0gX194Ll9NX3ByZWZpeDsKLSAgICBfTV9idWZfY291bnQgPSAwOwotICB9Ci0gIHNlcXVlbmNlX2J1ZmZlcihfU2VxdWVuY2UmIF9fcykgOiBfTV9wcmVmaXgoJl9fcyksIF9NX2J1Zl9jb3VudCgwKSB7fQotICBfU2VsZiYgb3BlcmF0b3I9IChfU2VsZiYgX194KSB7Ci0gICAgX194LmZsdXNoKCk7Ci0gICAgX01fcHJlZml4ID0gX194Ll9NX3ByZWZpeDsKLSAgICBfTV9idWZfY291bnQgPSAwOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotICBfU2VsZiYgb3BlcmF0b3I9IChjb25zdCBfU2VsZiYgX194KSB7Ci0gICAgX01fcHJlZml4ID0gX194Ll9NX3ByZWZpeDsKLSAgICBfTV9idWZfY291bnQgPSBfX3guX01fYnVmX2NvdW50OwotICAgIGNvcHkoX194Ll9NX2J1ZmZlciwgX194Ll9NX2J1ZmZlciArIF9feC5fTV9idWZfY291bnQsIF9NX2J1ZmZlcik7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIHZvaWQgcHVzaF9iYWNrKHZhbHVlX3R5cGUgX194KSB7Ci0gICAgaWYgKF9NX2J1Zl9jb3VudCA8IF9CdWZfc3opIHsKLSAgICAgIF9NX2J1ZmZlcltfTV9idWZfY291bnRdID0gX194OwotICAgICAgKytfTV9idWZfY291bnQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZsdXNoKCk7Ci0gICAgICBfTV9idWZmZXJbMF0gPSBfX3g7Ci0gICAgICBfTV9idWZfY291bnQgPSAxOwotICAgIH0KLSAgfQotICB2b2lkIGFwcGVuZChjb25zdCB2YWx1ZV90eXBlICpfX3MsIHNpemVfdCBfX2xlbikgewotICAgIGlmIChfX2xlbiArIF9NX2J1Zl9jb3VudCA8PSBfQnVmX3N6KSB7Ci0gICAgICBzaXplX3QgX19pID0gX01fYnVmX2NvdW50OwotICAgICAgc2l6ZV90IF9faiA9IDA7Ci0gICAgICBmb3IgKDsgX19qIDwgX19sZW47IF9faSsrLCBfX2orKykgewotICAgICAgICBfTV9idWZmZXJbX19pXSA9IF9fc1tfX2pdOwotICAgICAgfQotICAgICAgX01fYnVmX2NvdW50ICs9IF9fbGVuOwotICAgIH0gZWxzZSBpZiAoMCA9PSBfTV9idWZfY291bnQpIHsKLSAgICAgIF9NX3ByZWZpeC0+YXBwZW5kKF9fcywgX19zICsgX19sZW4pOwotICAgIH0gZWxzZSB7Ci0gICAgICBmbHVzaCgpOwotICAgICAgYXBwZW5kKF9fcywgX19sZW4pOwotICAgIH0KLSAgfQotICBfU2VsZiYgd3JpdGUoY29uc3QgdmFsdWVfdHlwZSAqX19zLCBzaXplX3QgX19sZW4pIHsKLSAgICBhcHBlbmQoX19zLCBfX2xlbik7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIF9TZWxmJiBwdXQodmFsdWVfdHlwZSBfX3gpIHsKLSAgICBwdXNoX2JhY2soX194KTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgX1NlbGYmIG9wZXJhdG9yPShjb25zdCB2YWx1ZV90eXBlJiBfX3JocykgewotICAgIHB1c2hfYmFjayhfX3Jocyk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIF9TZWxmJiBvcGVyYXRvciooKSB7IHJldHVybiAqdGhpczsgfQotICBfU2VsZiYgb3BlcmF0b3IrKygpIHsgcmV0dXJuICp0aGlzOyB9Ci0gIF9TZWxmJiBvcGVyYXRvcisrKGludCkgeyByZXR1cm4gKnRoaXM7IH0KLX07Ci0KLS8vIFRoZSBmb2xsb3dpbmcgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgcHJpdmF0ZSwgYXQgbGVhc3QgZm9yIG5vdy4KLXRlbXBsYXRlPGNsYXNzIF9DaGFyVD4KLWNsYXNzIF9Sb3BlX2NoYXJfY29uc3VtZXIgewotI2lmICFkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQotcHVibGljOgotICAvL1dpdGhvdXQgbWVtYmVyIHRlbXBsYXRlcyB3ZSBoYXZlIHRvIHVzZSBydW4tdGltZSBwYXJhbWV0ZXJpemF0aW9uLgotICAvLyBUaGUgc3ltbWV0cnkgd2l0aCBjaGFyX3Byb2R1Y2VyIGlzIGFjY2lkZW50YWwgYW5kIHRlbXBvcmFyeS4KLSAgdmlydHVhbCB+X1JvcGVfY2hhcl9jb25zdW1lcigpIHt9Ci0gIHZpcnR1YWwgYm9vbCBvcGVyYXRvcigpKGNvbnN0IF9DaGFyVCogX19idWZmZXIsIHNpemVfdCBfX2xlbikgPSAwOwotI2VuZGlmCi19OwotCi0vLwotLy8gV2hhdCBmb2xsb3dzIHNob3VsZCByZWFsbHkgYmUgbG9jYWwgdG8gcm9wZS4gIFVuZm9ydHVuYXRlbHksCi0vLyB0aGF0IGRvZXNuJ3Qgd29yaywgc2luY2UgaXQgbWFrZXMgaXQgaW1wb3NzaWJsZSB0byBkZWZpbmUgZ2VuZXJpYwotLy8gZXF1YWxpdHkgb24gcm9wZSBpdGVyYXRvcnMuICBBY2NvcmRpbmcgdG8gdGhlIGRyYWZ0IHN0YW5kYXJkLCB0aGUKLS8vIHRlbXBsYXRlIHBhcmFtZXRlcnMgZm9yIHN1Y2ggYW4gZXF1YWxpdHkgb3BlcmF0b3IgY2Fubm90IGJlIGluZmVycmVkCi0vLyBmcm9tIHRoZSBvY2N1cmVuY2Ugb2YgYSBtZW1iZXIgY2xhc3MgYXMgYSBwYXJhbWV0ZXIuCi0vLyAoU0dJIGNvbXBpbGVycyBpbiBmYWN0IGFsbG93IHRoaXMsIGJ1dCB0aGUgX19yZXN1bHQgd291bGRuJ3QgYmUKLS8vIHBvcnRhYmxlLikKLS8vIFNpbWlsYXJseSwgc29tZSBvZiB0aGUgc3RhdGljIG1lbWJlciBmdW5jdGlvbnMgYXJlIG1lbWJlciBmdW5jdGlvbnMKLS8vIG9ubHkgdG8gYXZvaWQgcG9sbHV0aW5nIHRoZSBnbG9iYWwgbmFtZXNwYWNlLCBhbmQgdG8gY2lyY3VtdmVudAotLy8gcmVzdHJpY3Rpb25zIG9uIHR5cGUgaW5mZXJlbmNlIGZvciB0ZW1wbGF0ZSBmdW5jdGlvbnMuCi0vLwotCi0vLwotLy8gVGhlIGludGVybmFsIGRhdGEgc3RydWN0dXJlIGZvciByZXByZXNlbnRpbmcgYSByb3BlLiAgVGhpcyBpcwotLy8gcHJpdmF0ZSB0byB0aGUgaW1wbGVtZW50YXRpb24uICBBIHJvcGUgaXMgcmVhbGx5IGp1c3QgYSBwb2ludGVyCi0vLyB0byBvbmUgb2YgdGhlc2UuCi0vLwotLy8gQSBmZXcgYmFzaWMgZnVuY3Rpb25zIGZvciBtYW5pcHVsYXRpbmcgdGhpcyBkYXRhIHN0cnVjdHVyZQotLy8gYXJlIG1lbWJlcnMgb2YgX1JvcGVSZXAuICBNb3N0IG9mIHRoZSBtb3JlIGNvbXBsZXggYWxnb3JpdGhtcwotLy8gYXJlIGltcGxlbWVudGVkIGFzIHJvcGUgbWVtYmVycy4KLS8vCi0vLyBTb21lIG9mIHRoZSBzdGF0aWMgbWVtYmVyIGZ1bmN0aW9ucyBvZiBfUm9wZVJlcCBoYXZlIGlkZW50aWNhbGx5Ci0vLyBuYW1lZCBmdW5jdGlvbnMgaW4gcm9wZSB0aGF0IHNpbXBseSBpbnZva2UgdGhlIF9Sb3BlUmVwIHZlcnNpb25zLgotLy8KLQotdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+Ci1zdHJ1Y3QgX1JvcGVfUm9wZVJlcAotICA6IHB1YmxpYyBfUmVmY291bnRfQmFzZQotewotICB0eXBlZGVmIF9Sb3BlX1JvcGVSZXA8X0NoYXJULCBfQWxsb2M+IF9TZWxmOwotcHVibGljOgotICAvLwotICAvLyBHQUI6IDExLzA5LzA1Ci0gIC8vCi0gIC8vICJfX1JPUEVfREVQVEhfU0laRSIgaXMgc2V0IHRvIG9uZSBtb3JlIHRoZW4gdGhlICJfX1JPUEVfTUFYX0RFUFRIIi4KLSAgLy8gVGhpcyB3YXMgb3JpZ2luYWxseSBqdXN0IGFuIGFkZGl0aW9uIG9mICJfX1JPUEVfTUFYX0RFUFRIICsgMSIKLSAgLy8gYnV0IHRoaXMgYWRkaXRpb24gY2F1c2VzIHRoZSBzdW5wcm8gY29tcGlsZXIgdG8gY29tcGxhaW4gYWJvdXQKLSAgLy8gbXVsdGlwbGUgZGVjbGFyYXRpb25zIGR1cmluZyB0aGUgaW5pdGlhbGl6YXRpb24gb2YgIl9TX21pbl9sZW4iLgotICAvLyBDaGFuZ2VkIHRvIGJlIGEgZml4ZWQgdmFsdWUgYW5kIHRoZSBzdW5wcm8gY29tcGlsZXIgYXBwZWFycyB0bwotICAvLyBiZSBoYXBweT8/PwotICAvLwotIyAgZGVmaW5lIF9fUk9QRV9NQVhfREVQVEggIDQ1Ci0jICBkZWZpbmUgX19ST1BFX0RFUFRIX1NJWkUgNDYgLy8gX19ST1BFX01BWF9ERVBUSCArIDEKLSAgZW51bSB7IF9TX21heF9yb3BlX2RlcHRoID0gX19ST1BFX01BWF9ERVBUSCB9OwotICBlbnVtIF9UYWcge19TX2xlYWYsIF9TX2NvbmNhdCwgX1Nfc3Vic3RyaW5nZm4sIF9TX2Z1bmN0aW9ufTsKLSAgLy8gQXBwYXJlbnRseSBuZWVkZWQgYnkgVkMrKwotICAvLyBUaGUgZGF0YSBmaWVsZHMgb2YgbGVhdmVzIGFyZSBhbGxvY2F0ZWQgd2l0aCBzb21lCi0gIC8vIGV4dHJhIHNwYWNlLCB0byBhY2NvbW9kYXRlIGZ1dHVyZSBncm93dGggYW5kIGZvciBiYXNpYwotICAvLyBjaGFyYWN0ZXIgdHlwZXMsIHRvIGhvbGQgYSB0cmFpbGluZyBlb3MgY2hhcmFjdGVyLgotICBlbnVtIHsgX1NfYWxsb2NfZ3JhbnVsYXJpdHkgPSA4IH07Ci0KLSAgX1RhZyBfTV90YWc6ODsKLSAgYm9vbCBfTV9pc19iYWxhbmNlZDo4OwotCi0gIF9TVExQX0ZPUkNFX0FMTE9DQVRPUlMoX0NoYXJULCBfQWxsb2MpCi0gIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jX3RyYWl0czxfQ2hhclQsX0FsbG9jPjo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7Ci0KLSAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IHsgcmV0dXJuIGFsbG9jYXRvcl90eXBlKF9NX3NpemUpOyAgfQotCi0gIHVuc2lnbmVkIGNoYXIgX01fZGVwdGg7Ci0gIF9DaGFyVCogX1NUTFBfVk9MQVRJTEUgX01fY19zdHJpbmc7Ci0gIF9TVExQX1BSSVYgX1NUTFBfYWxsb2NfcHJveHk8c2l6ZV90LCBfQ2hhclQsIGFsbG9jYXRvcl90eXBlPiBfTV9zaXplOwotCi0jIGlmZGVmIF9TVExQX05PX0FSUk9XX09QRVJBVE9SCi0gIF9Sb3BlX1JvcGVSZXAoKSA6IF9SZWZjb3VudF9CYXNlKDEpLCBfTV9zaXplKGFsbG9jYXRvcl90eXBlKCksIDApIHt9Ci0jIGVuZGlmCi0KLSAgLyogRmxhdHRlbmVkIHZlcnNpb24gb2Ygc3RyaW5nLCBpZiBuZWVkZWQuICAqLwotICAvKiB0eXBpY2FsbHkgMC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIElmIGl0J3Mgbm90IDAsIHRoZW4gdGhlIG1lbW9yeSBpcyBvd25lZCAgKi8KLSAgLyogYnkgdGhpcyBub2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJbiB0aGUgY2FzZSBvZiBhIGxlYWYsIHRoaXMgbWF5IHBvaW50IHRvICovCi0gIC8qIHRoZSBzYW1lIG1lbW9yeSBhcyB0aGUgZGF0YSBmaWVsZC4gICAgICAgKi8KLSAgX1JvcGVfUm9wZVJlcChfVGFnIF9fdCwgdW5zaWduZWQgY2hhciBfX2QsIGJvb2wgX19iLCBzaXplX3QgX3Bfc2l6ZSwKLSAgICAgICAgICAgICAgICBhbGxvY2F0b3JfdHlwZSBfX2EpIDoKLSAgICBfUmVmY291bnRfQmFzZSgxKSwKLSAgICBfTV90YWcoX190KSwgX01faXNfYmFsYW5jZWQoX19iKSwgX01fZGVwdGgoX19kKSwgX01fY19zdHJpbmcoMCksIF9NX3NpemUoX19hLCBfcF9zaXplKQotICB7IH0KLQotICB0eXBlZGVmIHR5cGVuYW1lIF9BcmVTYW1lVW5DVlR5cGVzPF9DaGFyVCwgY2hhcj46Ol9SZXQgX0lzQ2hhcjsKLSMgaWZkZWYgX1NUTFBfSEFTX1dDSEFSX1QKLSAgdHlwZWRlZiB0eXBlbmFtZSBfQXJlU2FtZVVuQ1ZUeXBlczxfQ2hhclQsIHdjaGFyX3Q+OjpfUmV0IF9Jc1dDaGFyVDsKLSMgZWxzZQotICB0eXBlZGVmIF9fZmFsc2VfdHlwZSBfSXNXQ2hhclQ7Ci0jIGVuZGlmCi0KLSAgdHlwZWRlZiB0eXBlbmFtZSBfTG9yMjxfSXNDaGFyLCBfSXNXQ2hhclQ+OjpfUmV0IF9Jc0Jhc2ljQ2hhclR5cGU7Ci0KLSNpZiAwCi0gIC8qIFBsZWFzZSB0ZWxsIHdoeSB0aGlzIGNvZGUgaXMgbmVjZXNzYXJ5IGlmIHlvdSB1bmNvbW1lbnQgaXQuCi0gICAqIFByb2JsZW0gd2l0aCBpdCBpcyB0aGF0IHJvcGUgaW1wbGVtZW50YXRpb24gZXhwZWN0IHRoYXQgX1Nfcm91bmRlZF91cF9zaXplKG4pCi0gICAqIHJldHVybnMgYSBzaXplID4gbiBpbiBvcmRlciB0byBzdG9yZSB0aGUgdGVybWluYXRpbmcgbnVsbCBjaGFyYXRlci4gV2hlbgotICAgKiBpbnN0YW5jaWF0aW9uIHR5cGUgaXMgbm90IGEgY2hhciBvciB3Y2hhcl90IHRoaXMgaXMgbm90IGd1YXJhbnR5IHJlc3VsdGluZyBpbgotICAgKiBtZW1vcnkgb3ZlcnJ1bi4KLSAgICovCi0gIHN0YXRpYyBzaXplX3QgX1Nfcm91bmRlZF91cF9zaXplX2F1eChzaXplX3QgX19uLCBfX3RydWVfdHlwZSBjb25zdCYgLypfSXNCYXNpY0NoYXJUeXBlKi8pIHsKLSAgICAvLyBBbGxvdyBzbG9wIGZvciBpbi1wbGFjZSBleHBhbnNpb24uCi0gICAgcmV0dXJuIChfX24gKyBfU19hbGxvY19ncmFudWxhcml0eSkgJiB+KF9TX2FsbG9jX2dyYW51bGFyaXR5IC0gMSk7Ci0gIH0KLQotICBzdGF0aWMgc2l6ZV90IF9TX3JvdW5kZWRfdXBfc2l6ZV9hdXgoc2l6ZV90IF9fbiwgX19mYWxzZV90eXBlIGNvbnN0JiAvKl9Jc0Jhc2ljQ2hhclR5cGUqLykgewotICAgIC8vIEFsbG93IHNsb3AgZm9yIGluLXBsYWNlIGV4cGFuc2lvbi4KLSAgICByZXR1cm4gKF9fbiArIF9TX2FsbG9jX2dyYW51bGFyaXR5IC0gMSkgJiB+KF9TX2FsbG9jX2dyYW51bGFyaXR5IC0gMSk7Ci0gIH0KLSNlbmRpZgotICAvLyBmYnAgOiBtb3ZlZCBmcm9tIFJvcGVMZWFmCi0gIHN0YXRpYyBzaXplX3QgX1Nfcm91bmRlZF91cF9zaXplKHNpemVfdCBfX24pCi0gIC8veyByZXR1cm4gX1Nfcm91bmRlZF91cF9zaXplX2F1eChfX24sIF9Jc0Jhc2ljQ2hhclR5cGUoKSk7IH0KLSAgeyByZXR1cm4gKF9fbiArIF9TX2FsbG9jX2dyYW51bGFyaXR5KSAmIH4oX1NfYWxsb2NfZ3JhbnVsYXJpdHkgLSAxKTsgfQotCi0gIHN0YXRpYyB2b2lkIF9TX2ZyZWVfc3RyaW5nKCBfQ2hhclQqIF9fcywgc2l6ZV90IF9fbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JfdHlwZSBfX2EpIHsKLSAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95X1JhbmdlKF9fcywgX19zICsgX19sZW4pOwotICAgIC8vICBUaGlzIGhhcyB0byBiZSBhIHN0YXRpYyBtZW1iZXIsIHNvIHRoaXMgZ2V0cyBhIGJpdCBtZXNzeQotIyAgIGlmbmRlZiBfU1RMUF9ET05UX1NVUFBPUlRfUkVCSU5EX01FTUJFUl9URU1QTEFURQotICAgIF9fYS5kZWFsbG9jYXRlKF9fcywgX1Nfcm91bmRlZF91cF9zaXplKF9fbGVuKSk7ICAgIC8vKnR5IDAzLzI0LzIwMDEgLSByZXN0b3JlZCBub3QgdG8gdXNlIF9fc3RsX2FsbG9jX3JlYmluZCgpIHNpbmNlIGl0IGlzIG5vdCBkZWZpbmVkIHVuZGVyIF9TVExQX01FTUJFUl9URU1QTEFURV9DTEFTU0VTCi0jICAgZWxzZQotICAgIF9fc3RsX2FsbG9jX3JlYmluZCAoX19hLCAoX0NoYXJUKikwKS5kZWFsbG9jYXRlKF9fcywgX1Nfcm91bmRlZF91cF9zaXplKF9fbGVuKSk7Ci0jICAgZW5kaWYKLSAgfQotCi0gIC8vIERlYWxsb2NhdGUgZGF0YSBzZWN0aW9uIG9mIGEgbGVhZi4KLSAgLy8gVGhpcyBzaG91bGRuJ3QgYmUgYSBtZW1iZXIgZnVuY3Rpb24uCi0gIC8vIEJ1dCBpdHMgaGFyZCB0byBkbyBhbnl0aGluZyBlbHNlIGF0IHRoZQotICAvLyBtb21lbnQsIGJlY2F1c2UgaXQncyB0ZW1wbGF0aXplZCB3LnIudC4KLSAgLy8gYW4gYWxsb2NhdG9yLgotICAvLyBEb2VzIG5vdGhpbmcgaWYgX19HQyBpcyBkZWZpbmVkLgotICB2b2lkIF9NX2ZyZWVfY19zdHJpbmcoKTsKLSAgdm9pZCBfTV9mcmVlX3RyZWUoKTsKLSAgLy8gRGVhbGxvY2F0ZSB0LiBBc3N1bWVzIHQgaXMgbm90IDAuCi0gIHZvaWQgX01fdW5yZWZfbm9ubmlsKCkgewotICAgIGlmIChfTV9kZWNyKCkgPT0gMCkgX01fZnJlZV90cmVlKCk7Ci0gIH0KLSAgdm9pZCBfTV9yZWZfbm9ubmlsKCkgewotICAgIF9NX2luY3IoKTsKLSAgfQotICBzdGF0aWMgdm9pZCBfU191bnJlZihfU2VsZiogX190KSB7Ci0gICAgaWYgKDAgIT0gX190KSB7Ci0gICAgICBfX3QtPl9NX3VucmVmX25vbm5pbCgpOwotICAgIH0KLSAgfQotICBzdGF0aWMgdm9pZCBfU19yZWYoX1NlbGYqIF9fdCkgewotICAgIGlmICgwICE9IF9fdCkgX190LT5fTV9pbmNyKCk7Ci0gIH0KLSAgLy9zdGF0aWMgdm9pZCBfU19mcmVlX2lmX3VucmVmKF9TZWxmKiBfX3QpIHsKLSAgLy8gIGlmICgwICE9IF9fdCAmJiAwID09IF9fdC0+X01fcmVmX2NvdW50KSBfX3QtPl9NX2ZyZWVfdHJlZSgpOwotICAvL30KLX07Ci0KLXRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgotc3RydWN0IF9Sb3BlX1JvcGVMZWFmIDogcHVibGljIF9Sb3BlX1JvcGVSZXA8X0NoYXJULF9BbGxvYz4gewotcHVibGljOgotICBfQ2hhclQqIF9NX2RhdGE7IC8qIE5vdCBuZWNlc3NhcmlseSAwIHRlcm1pbmF0ZWQuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBhbGxvY2F0ZWQgc2l6ZSBpcyAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIF9TX3JvdW5kZWRfdXBfc2l6ZShzaXplKSwgZXhjZXB0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluIHRoZSBHQyBjYXNlLCBpbiB3aGljaCBpdCAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvZXNuJ3QgbWF0dGVyLiAgICAgICAgICAgICAgICovCi1wcml2YXRlOgotICB0eXBlZGVmIF9Sb3BlX1JvcGVSZXA8X0NoYXJULF9BbGxvYz4gX1JvcGVSZXA7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1JvcGVSZXA6Ol9Jc0Jhc2ljQ2hhclR5cGUgX0lzQmFzaWNDaGFyVHlwZTsKLSAgdm9pZCBfTV9pbml0KF9fdHJ1ZV90eXBlIGNvbnN0JiAvKl9Jc0Jhc2ljQ2hhclR5cGUqLykgewotICAgIHRoaXMtPl9NX2Nfc3RyaW5nID0gX01fZGF0YTsKLSAgfQotICB2b2lkIF9NX2luaXQoX19mYWxzZV90eXBlIGNvbnN0JiAvKl9Jc0Jhc2ljQ2hhclR5cGUqLykge30KLQotcHVibGljOgotICBfU1RMUF9GT1JDRV9BTExPQ0FUT1JTKF9DaGFyVCwgX0FsbG9jKQotICB0eXBlZGVmIHR5cGVuYW1lIF9Sb3BlUmVwOjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKLQotICBfUm9wZV9Sb3BlTGVhZiggX0NoYXJUKiBfX2QsIHNpemVfdCBfcF9zaXplLCBhbGxvY2F0b3JfdHlwZSBfX2EpCi0gICAgOiBfUm9wZV9Sb3BlUmVwPF9DaGFyVCxfQWxsb2M+KF9Sb3BlUmVwOjpfU19sZWFmLCAwLCB0cnVlLCBfcF9zaXplLCBfX2EpLAotICAgICAgX01fZGF0YShfX2QpIHsKLSAgICBfU1RMUF9BU1NFUlQoX3Bfc2l6ZSA+IDApCi0gICAgX01faW5pdChfSXNCYXNpY0NoYXJUeXBlKCkpOwotICB9Ci0KLSMgaWZkZWYgX1NUTFBfTk9fQVJST1dfT1BFUkFUT1IKLSAgX1JvcGVfUm9wZUxlYWYoKSB7fQotICBfUm9wZV9Sb3BlTGVhZihjb25zdCBfUm9wZV9Sb3BlTGVhZjxfQ2hhclQsIF9BbGxvYz4mICkge30KLSMgZW5kaWYKLQotLy8gVGhlIGNvbnN0cnVjdG9yIGFzc3VtZXMgdGhhdCBkIGhhcyBiZWVuIGFsbG9jYXRlZCB3aXRoCi0gIC8vIHRoZSBwcm9wZXIgYWxsb2NhdG9yIGFuZCB0aGUgcHJvcGVybHkgcGFkZGVkIHNpemUuCi0gIC8vIEluIGNvbnRyYXN0LCB0aGUgZGVzdHJ1Y3RvciBkZWFsbG9jYXRlcyB0aGUgZGF0YToKLSAgfl9Sb3BlX1JvcGVMZWFmKCkgewotICAgIGlmIChfTV9kYXRhICE9IHRoaXMtPl9NX2Nfc3RyaW5nKSB7Ci0gICAgICB0aGlzLT5fTV9mcmVlX2Nfc3RyaW5nKCk7Ci0gICAgfQotICAgIF9Sb3BlUmVwOjpfU19mcmVlX3N0cmluZyhfTV9kYXRhLCB0aGlzLT5fTV9zaXplLl9NX2RhdGEsIHRoaXMtPmdldF9hbGxvY2F0b3IoKSk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgotc3RydWN0IF9Sb3BlX1JvcGVDb25jYXRlbmF0aW9uIDogcHVibGljIF9Sb3BlX1JvcGVSZXA8X0NoYXJULCBfQWxsb2M+IHsKLXByaXZhdGU6Ci0gIHR5cGVkZWYgX1JvcGVfUm9wZVJlcDxfQ2hhclQsX0FsbG9jPiBfUm9wZVJlcDsKLQotcHVibGljOgotICBfUm9wZVJlcCogX01fbGVmdDsKLSAgX1JvcGVSZXAqIF9NX3JpZ2h0OwotICBfU1RMUF9GT1JDRV9BTExPQ0FUT1JTKF9DaGFyVCwgX0FsbG9jKQotICB0eXBlZGVmIHR5cGVuYW1lIF9Sb3BlUmVwOjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKLSAgX1JvcGVfUm9wZUNvbmNhdGVuYXRpb24oX1JvcGVSZXAqIF9fbCwgX1JvcGVSZXAqIF9fciwgYWxsb2NhdG9yX3R5cGUgX19hKQotICAgIDogX1JvcGVfUm9wZVJlcDxfQ2hhclQsX0FsbG9jPihfUm9wZVJlcDo6X1NfY29uY2F0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWF4KShfX2wtPl9NX2RlcHRoLCBfX3ItPl9NX2RlcHRoKSArIDEsIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2wtPl9NX3NpemUuX01fZGF0YSArIF9fci0+X01fc2l6ZS5fTV9kYXRhLCBfX2EpLCBfTV9sZWZ0KF9fbCksIF9NX3JpZ2h0KF9fcikKLSAge30KLSMgaWZkZWYgX1NUTFBfTk9fQVJST1dfT1BFUkFUT1IKLSAgX1JvcGVfUm9wZUNvbmNhdGVuYXRpb24oKSB7fQotICBfUm9wZV9Sb3BlQ29uY2F0ZW5hdGlvbihjb25zdCBfUm9wZV9Sb3BlQ29uY2F0ZW5hdGlvbjxfQ2hhclQsIF9BbGxvYz4mKSB7fQotIyBlbmRpZgotCi0gIH5fUm9wZV9Sb3BlQ29uY2F0ZW5hdGlvbigpIHsKLSAgICB0aGlzLT5fTV9mcmVlX2Nfc3RyaW5nKCk7Ci0gICAgX01fbGVmdC0+X01fdW5yZWZfbm9ubmlsKCk7Ci0gICAgX01fcmlnaHQtPl9NX3VucmVmX25vbm5pbCgpOwotICB9Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+Ci1zdHJ1Y3QgX1JvcGVfUm9wZUZ1bmN0aW9uIDogcHVibGljIF9Sb3BlX1JvcGVSZXA8X0NoYXJULCBfQWxsb2M+IHsKLXByaXZhdGU6Ci0gIHR5cGVkZWYgX1JvcGVfUm9wZVJlcDxfQ2hhclQsX0FsbG9jPiBfUm9wZVJlcDsKLXB1YmxpYzoKLSAgY2hhcl9wcm9kdWNlcjxfQ2hhclQ+KiBfTV9mbjsKLSAgLyoKLSAgICogQ2hhcl9wcm9kdWNlciBpcyBvd25lZCBieSB0aGUKLSAgICogcm9wZSBhbmQgc2hvdWxkIGJlIGV4cGxpY2l0bHkKLSAgICogZGVsZXRlZCB3aGVuIHRoZSByb3BlIGJlY29tZXMKLSAgICogaW5hY2Nlc3NpYmxlLgotICAgKi8KLSAgYm9vbCBfTV9kZWxldGVfd2hlbl9kb25lOwotICBfU1RMUF9GT1JDRV9BTExPQ0FUT1JTKF9DaGFyVCwgX0FsbG9jKQotICB0eXBlZGVmIHR5cGVuYW1lIF9Sb3BlX1JvcGVSZXA8X0NoYXJULF9BbGxvYz46OmFsbG9jYXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOwotIyBpZmRlZiBfU1RMUF9OT19BUlJPV19PUEVSQVRPUgotICBfUm9wZV9Sb3BlRnVuY3Rpb24oKSB7fQotICBfUm9wZV9Sb3BlRnVuY3Rpb24oY29uc3QgX1JvcGVfUm9wZUZ1bmN0aW9uPF9DaGFyVCwgX0FsbG9jPiYgKSB7fQotIyBlbmRpZgotCi0gIF9Sb3BlX1JvcGVGdW5jdGlvbihjaGFyX3Byb2R1Y2VyPF9DaGFyVD4qIF9fZiwgc2l6ZV90IF9wX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICBib29sIF9fZCwgYWxsb2NhdG9yX3R5cGUgX19hKQotICAgIDogX1JvcGVfUm9wZVJlcDxfQ2hhclQsX0FsbG9jPihfUm9wZVJlcDo6X1NfZnVuY3Rpb24sIDAsIHRydWUsIF9wX3NpemUsIF9fYSksIF9NX2ZuKF9fZikKLSAgICAsIF9NX2RlbGV0ZV93aGVuX2RvbmUoX19kKQotICB7IF9TVExQX0FTU0VSVChfcF9zaXplID4gMCkgfQotCi0gIH5fUm9wZV9Sb3BlRnVuY3Rpb24oKSB7Ci0gICAgdGhpcy0+X01fZnJlZV9jX3N0cmluZygpOwotICAgIGlmIChfTV9kZWxldGVfd2hlbl9kb25lKSB7Ci0gICAgICBkZWxldGUgX01fZm47Ci0gICAgfQotICB9Ci19OwotCi0vKgotICogU3Vic3RyaW5nIHJlc3VsdHMgYXJlIHVzdWFsbHkgcmVwcmVzZW50ZWQgdXNpbmcganVzdAotICogY29uY2F0ZW5hdGlvbiBub2Rlcy4gIEJ1dCBpbiB0aGUgY2FzZSBvZiB2ZXJ5IGxvbmcgZmxhdCByb3BlcwotICogb3Igcm9wZXMgd2l0aCBhIGZ1bmN0aW9uYWwgcmVwcmVzZW50YXRpb24gdGhhdCBpc24ndCBwcmFjdGljYWwuCi0gKiBJbiB0aGF0IGNhc2UsIHdlIHJlcHJlc2VudCB0aGUgX19yZXN1bHQgYXMgYSBzcGVjaWFsIGNhc2Ugb2YKLSAqIFJvcGVGdW5jdGlvbiwgd2hvc2UgY2hhcl9wcm9kdWNlciBwb2ludHMgYmFjayB0byB0aGUgcm9wZSBpdHNlbGYuCi0gKiBJbiBhbGwgY2FzZXMgZXhjZXB0IHJlcGVhdGVkIHN1YnN0cmluZyBvcGVyYXRpb25zIGFuZAotICogZGVhbGxvY2F0aW9uLCB3ZSB0cmVhdCB0aGUgX19yZXN1bHQgYXMgYSBSb3BlRnVuY3Rpb24uCi0gKi8KLXRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgotc3RydWN0IF9Sb3BlX1JvcGVTdWJzdHJpbmcgOiBwdWJsaWMgY2hhcl9wcm9kdWNlcjxfQ2hhclQ+LCBwdWJsaWMgX1JvcGVfUm9wZUZ1bmN0aW9uPF9DaGFyVCxfQWxsb2M+IHsKLXB1YmxpYzoKLSAgLy8gWFhYIHRoaXMgd2hvbGUgY2xhc3Mgc2hvdWxkIGJlIHJld3JpdHRlbi4KLSAgdHlwZWRlZiBfUm9wZV9Sb3BlUmVwPF9DaGFyVCxfQWxsb2M+IF9Sb3BlUmVwOwotICBfUm9wZVJlcCAqX01fYmFzZTsgICAgICAvLyBub3QgMAotICBzaXplX3QgX01fc3RhcnQ7Ci0gIC8qIHZpcnR1YWwgKi8gdm9pZCBvcGVyYXRvcigpKHNpemVfdCBfX3N0YXJ0X3Bvcywgc2l6ZV90IF9fcmVxX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NoYXJUKiBfX2J1ZmZlcikgewotICAgIHR5cGVkZWYgX1JvcGVfUm9wZUZ1bmN0aW9uPF9DaGFyVCxfQWxsb2M+IF9Sb3BlRnVuY3Rpb247Ci0gICAgdHlwZWRlZiBfUm9wZV9Sb3BlTGVhZjxfQ2hhclQsX0FsbG9jPiBfUm9wZUxlYWY7Ci0gICAgc3dpdGNoIChfTV9iYXNlLT5fTV90YWcpIHsKLSAgICBjYXNlIF9Sb3BlUmVwOjpfU19mdW5jdGlvbjoKLSAgICBjYXNlIF9Sb3BlUmVwOjpfU19zdWJzdHJpbmdmbjoKLSAgICAgIHsKLSAgICAgICAgY2hhcl9wcm9kdWNlcjxfQ2hhclQ+KiBfX2ZuID0KLSAgICAgICAgICBfX1NUQVRJQ19DQVNUKF9Sb3BlRnVuY3Rpb24qLCBfTV9iYXNlKS0+X01fZm47Ci0gICAgICAgIF9TVExQX0FTU0VSVChfX3N0YXJ0X3BvcyArIF9fcmVxX2xlbiA8PSB0aGlzLT5fTV9zaXplLl9NX2RhdGEpCi0gICAgICAgIF9TVExQX0FTU0VSVChfTV9zdGFydCArIHRoaXMtPl9NX3NpemUuX01fZGF0YSA8PSBfTV9iYXNlLT5fTV9zaXplLl9NX2RhdGEpCi0gICAgICAgICgqX19mbikoX19zdGFydF9wb3MgKyBfTV9zdGFydCwgX19yZXFfbGVuLCBfX2J1ZmZlcik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIF9Sb3BlUmVwOjpfU19sZWFmOgotICAgICAgewotICAgICAgICBfQ2hhclQqIF9fcyA9Ci0gICAgICAgICAgX19TVEFUSUNfQ0FTVChfUm9wZUxlYWYqLCBfTV9iYXNlKS0+X01fZGF0YTsKLSAgICAgICAgX1NUTFBfUFJJViBfX3Vjb3B5X24oX19zICsgX19zdGFydF9wb3MgKyBfTV9zdGFydCwgX19yZXFfbGVuLCBfX2J1ZmZlcik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgX1NUTFBfQVNTRVJUKGZhbHNlKQotICAgICAgICA7Ci0gICAgfQotICB9Ci0KLSAgX1NUTFBfRk9SQ0VfQUxMT0NBVE9SUyhfQ2hhclQsIF9BbGxvYykKLSAgdHlwZWRlZiB0eXBlbmFtZSBfUm9wZVJlcDo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7Ci0KLSAgX1JvcGVfUm9wZVN1YnN0cmluZyhfUm9wZVJlcCogX19iLCBzaXplX3QgX19zLCBzaXplX3QgX19sLCBhbGxvY2F0b3JfdHlwZSBfX2EpCi0gICAgOiBfUm9wZV9Sb3BlRnVuY3Rpb248X0NoYXJULF9BbGxvYz4odGhpcywgX19sLCBmYWxzZSwgX19hKSwKLSAgICAgIF9NX2Jhc2UoX19iKSwgX01fc3RhcnQoX19zKSB7Ci0gICAgX1NUTFBfQVNTRVJUKF9fbCA+IDApCi0gICAgX1NUTFBfQVNTRVJUKF9fcyArIF9fbCA8PSBfX2ItPl9NX3NpemUuX01fZGF0YSkKLSAgICBfTV9iYXNlLT5fTV9yZWZfbm9ubmlsKCk7Ci0gICAgdGhpcy0+X01fdGFnID0gX1JvcGVSZXA6Ol9TX3N1YnN0cmluZ2ZuOwotICB9Ci0gIHZpcnR1YWwgfl9Sb3BlX1JvcGVTdWJzdHJpbmcoKQotICB7IF9NX2Jhc2UtPl9NX3VucmVmX25vbm5pbCgpOyB9Ci19OwotCi0vKgotICogU2VsZi1kZXN0cnVjdGluZyBwb2ludGVycyB0byBSb3BlX3JlcC4KLSAqIFRoZXNlIGFyZSBub3QgY29udmVudGlvbmFsIHNtYXJ0IHBvaW50ZXJzLiAgVGhlaXIKLSAqIG9ubHkgcHVycG9zZSBpbiBsaWZlIGlzIHRvIGVuc3VyZSB0aGF0IHVucmVmIGlzIGNhbGxlZAotICogb24gdGhlIHBvaW50ZXIgZWl0aGVyIGF0IG5vcm1hbCBleGl0IG9yIGlmIGFuIGV4Y2VwdGlvbgotICogaXMgcmFpc2VkLiAgSXQgaXMgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvCi0gKiBhZGp1c3QgcmVmZXJlbmNlIGNvdW50cyB3aGVuIHRoZXNlIHBvaW50ZXJzIGFyZSBpbml0aWFsaXplZAotICogb3IgYXNzaWduZWQgdG8uICAoVGhpcyBjb252ZW50aW9uIHNpZ25pZmljYW50bHkgcmVkdWNlcwotICogdGhlIG51bWJlciBvZiBwb3RlbnRpYWxseSBleHBlbnNpdmUgcmVmZXJlbmNlIGNvdW50Ci0gKiB1cGRhdGVzLikKLSAqLwotdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+Ci1zdHJ1Y3QgX1JvcGVfc2VsZl9kZXN0cnVjdF9wdHIgewotICBfUm9wZV9Sb3BlUmVwPF9DaGFyVCxfQWxsb2M+KiBfTV9wdHI7Ci0gIH5fUm9wZV9zZWxmX2Rlc3RydWN0X3B0cigpCi0gIHsgX1JvcGVfUm9wZVJlcDxfQ2hhclQsX0FsbG9jPjo6X1NfdW5yZWYoX01fcHRyKTsgfQotIyAgIGlmZGVmIF9TVExQX1VTRV9FWENFUFRJT05TCi0gIF9Sb3BlX3NlbGZfZGVzdHJ1Y3RfcHRyKCkgOiBfTV9wdHIoMCkge30KLSMgICBlbHNlCi0gIF9Sb3BlX3NlbGZfZGVzdHJ1Y3RfcHRyKCkge30KLSMgICBlbmRpZgotICBfUm9wZV9zZWxmX2Rlc3RydWN0X3B0cihfUm9wZV9Sb3BlUmVwPF9DaGFyVCxfQWxsb2M+KiBfX3ApIDogX01fcHRyKF9fcCkge30KLSAgX1JvcGVfUm9wZVJlcDxfQ2hhclQsX0FsbG9jPiYgb3BlcmF0b3IqKCkgeyByZXR1cm4gKl9NX3B0cjsgfQotICBfUm9wZV9Sb3BlUmVwPF9DaGFyVCxfQWxsb2M+KiBvcGVyYXRvci0+KCkgeyByZXR1cm4gX01fcHRyOyB9Ci0gIG9wZXJhdG9yIF9Sb3BlX1JvcGVSZXA8X0NoYXJULF9BbGxvYz4qKCkgeyByZXR1cm4gX01fcHRyOyB9Ci0gIF9Sb3BlX3NlbGZfZGVzdHJ1Y3RfcHRyPF9DaGFyVCwgX0FsbG9jPiYKLSAgb3BlcmF0b3I9IChfUm9wZV9Sb3BlUmVwPF9DaGFyVCxfQWxsb2M+KiBfX3gpCi0gIHsgX01fcHRyID0gX194OyByZXR1cm4gKnRoaXM7IH0KLX07Ci0KLS8qCi0gKiBEZXJlZmVyZW5jaW5nIGEgbm9uY29uc3QgaXRlcmF0b3IgaGFzIHRvIHJldHVybiBzb21ldGhpbmcKLSAqIHRoYXQgYmVoYXZlcyBhbG1vc3QgbGlrZSBhIHJlZmVyZW5jZS4gIEl0J3Mgbm90IHBvc3NpYmxlIHRvCi0gKiByZXR1cm4gYW4gYWN0dWFsIHJlZmVyZW5jZSBzaW5jZSBhc3NpZ25tZW50IHJlcXVpcmVzIGV4dHJhCi0gKiB3b3JrLiAgQW5kIHdlIHdvdWxkIGdldCBpbnRvIHRoZSBzYW1lIHByb2JsZW1zIGFzIHdpdGggdGhlCi0gKiBDRDIgdmVyc2lvbiBvZiBiYXNpY19zdHJpbmcuCi0gKi8KLXRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgotY2xhc3MgX1JvcGVfY2hhcl9yZWZfcHJveHkgewotICB0eXBlZGVmIF9Sb3BlX2NoYXJfcmVmX3Byb3h5PF9DaGFyVCwgX0FsbG9jPiBfU2VsZjsKLSAgZnJpZW5kIGNsYXNzIHJvcGU8X0NoYXJULF9BbGxvYz47Ci0gIGZyaWVuZCBjbGFzcyBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPjsKLSAgZnJpZW5kIGNsYXNzIF9Sb3BlX2NoYXJfcHRyX3Byb3h5PF9DaGFyVCxfQWxsb2M+OwotICB0eXBlZGVmIF9Sb3BlX3NlbGZfZGVzdHJ1Y3RfcHRyPF9DaGFyVCxfQWxsb2M+IF9TZWxmX2Rlc3RydWN0X3B0cjsKLSAgdHlwZWRlZiBfUm9wZV9Sb3BlUmVwPF9DaGFyVCxfQWxsb2M+IF9Sb3BlUmVwOwotICB0eXBlZGVmIHJvcGU8X0NoYXJULF9BbGxvYz4gX015X3JvcGU7Ci0gIHNpemVfdCBfTV9wb3M7Ci0gIF9DaGFyVCBfTV9jdXJyZW50OwotICBib29sIF9NX2N1cnJlbnRfdmFsaWQ7Ci0gIF9NeV9yb3BlKiBfTV9yb290OyAgICAgLy8gVGhlIHdob2xlIHJvcGUuCi1wdWJsaWM6Ci0gIF9Sb3BlX2NoYXJfcmVmX3Byb3h5KF9NeV9yb3BlKiBfX3IsIHNpemVfdCBfX3ApIDoKLSAgICBfTV9wb3MoX19wKSwgX01fY3VycmVudF92YWxpZChmYWxzZSksIF9NX3Jvb3QoX19yKSB7fQotICBfUm9wZV9jaGFyX3JlZl9wcm94eShjb25zdCBfU2VsZiYgX194KSA6Ci0gICAgX01fcG9zKF9feC5fTV9wb3MpLCBfTV9jdXJyZW50X3ZhbGlkKGZhbHNlKSwgX01fcm9vdChfX3guX01fcm9vdCkge30KLSAgLy8gRG9uJ3QgcHJlc2VydmUgY2FjaGUgaWYgdGhlIHJlZmVyZW5jZSBjYW4gb3V0bGl2ZSB0aGUKLSAgLy8gZXhwcmVzc2lvbi4gIFdlIGNsYWltIHRoYXQncyBub3QgcG9zc2libGUgd2l0aG91dCBjYWxsaW5nCi0gIC8vIGEgY29weSBjb25zdHJ1Y3RvciBvciBnZW5lcmF0aW5nIHJlZmVyZW5jZSB0byBhIHByb3h5Ci0gIC8vIHJlZmVyZW5jZS4gIFdlIGRlY2xhcmUgdGhlIGxhdHRlciB0byBoYXZlIHVuZGVmaW5lZCBzZW1hbnRpY3MuCi0gIF9Sb3BlX2NoYXJfcmVmX3Byb3h5KF9NeV9yb3BlKiBfX3IsIHNpemVfdCBfX3AsIF9DaGFyVCBfX2MpCi0gICAgOiBfTV9wb3MoX19wKSwgX01fY3VycmVudChfX2MpLCBfTV9jdXJyZW50X3ZhbGlkKHRydWUpLCBfTV9yb290KF9fcikge30KLSAgaW5saW5lIG9wZXJhdG9yIF9DaGFyVCAoKSBjb25zdDsKLSAgX1NlbGYmIG9wZXJhdG9yPSAoX0NoYXJUIF9fYyk7Ci0gIF9Sb3BlX2NoYXJfcHRyX3Byb3h5PF9DaGFyVCwgX0FsbG9jPiBvcGVyYXRvciYgKCkgY29uc3Q7Ci0gIF9TZWxmJiBvcGVyYXRvcj0gKGNvbnN0IF9TZWxmJiBfX2MpIHsKLSAgICByZXR1cm4gb3BlcmF0b3I9KChfQ2hhclQpX19jKTsKLSAgfQotfTsKLQotI2lmZGVmIF9TVExQX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUgotdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfX0FsbG9jPgotaW5saW5lIHZvaWQgc3dhcChfUm9wZV9jaGFyX3JlZl9wcm94eSA8X0NoYXJULCBfX0FsbG9jID4gX19hLAotICAgICAgICAgICAgICAgICBfUm9wZV9jaGFyX3JlZl9wcm94eSA8X0NoYXJULCBfX0FsbG9jID4gX19iKSB7Ci0gIF9DaGFyVCBfX3RtcCA9IF9fYTsKLSAgX19hID0gX19iOwotICBfX2IgPSBfX3RtcDsKLX0KLSNlbHNlCi0vLyBUaGVyZSBpcyBubyByZWFsbHkgYWNjZXB0YWJsZSB3YXkgdG8gaGFuZGxlIHRoaXMuICBUaGUgZGVmYXVsdAotLy8gZGVmaW5pdGlvbiBvZiBzd2FwIGRvZXNuJ3Qgd29yayBmb3IgcHJveHkgcmVmZXJlbmNlcy4KLS8vIEl0IGNhbid0IHJlYWxseSBiZSBtYWRlIHRvIHdvcmssIGV2ZW4gd2l0aCB1Z2x5IGhhY2tzLCBzaW5jZQotLy8gdGhlIG9ubHkgdW51c3VhbCBvcGVyYXRpb24gaXQgdXNlcyBpcyB0aGUgY29weSBjb25zdHJ1Y3Rvciwgd2hpY2gKLS8vIGlzIG5lZWRlZCBmb3Igb3RoZXIgcHVycG9zZXMuICBXZSBwcm92aWRlIGEgbWFjcm8gZm9yCi0vLyBmdWxsIHNwZWNpYWxpemF0aW9ucywgYW5kIGluc3RhbnRpYXRlIHRoZSBtb3N0IGNvbW1vbiBjYXNlLgotIyBkZWZpbmUgX1JPUEVfU1dBUF9TUEVDSUFMSVpBVElPTihfQ2hhclQsIF9fQWxsb2MpIFwKLSAgICBpbmxpbmUgdm9pZCBzd2FwKF9Sb3BlX2NoYXJfcmVmX3Byb3h5IDxfQ2hhclQsIF9fQWxsb2MgPiBfX2EsIFwKLSAgICAgICAgICAgICAgICAgICAgIF9Sb3BlX2NoYXJfcmVmX3Byb3h5IDxfQ2hhclQsIF9fQWxsb2MgPiBfX2IpIHsgXAotICAgICAgICBfQ2hhclQgX190bXAgPSBfX2E7IFwKLSAgICAgICAgX19hID0gX19iOyBcCi0gICAgICAgIF9fYiA9IF9fdG1wOyBcCi0gICAgfQotCi1fUk9QRV9TV0FQX1NQRUNJQUxJWkFUSU9OKGNoYXIsX1NUTFBfREVGQVVMVF9BTExPQ0FUT1IoY2hhcikgKQotCi0jIGlmbmRlZiBfU1RMUF9OT19XQ0hBUl9UCi1fUk9QRV9TV0FQX1NQRUNJQUxJWkFUSU9OKHdjaGFyX3QsX1NUTFBfREVGQVVMVF9BTExPQ0FUT1Iod2NoYXJfdCkgKQotIyBlbmRpZgotCi0jZW5kaWYgLyogIV9TVExQX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUiAqLwotCi10ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KLWNsYXNzIF9Sb3BlX2NoYXJfcHRyX3Byb3h5IHsKLSAgLy8gWFhYIHRoaXMgY2xhc3Mgc2hvdWxkIGJlIHJld3JpdHRlbi4KLXB1YmxpYzoKLSAgdHlwZWRlZiBfUm9wZV9jaGFyX3B0cl9wcm94eTxfQ2hhclQsIF9BbGxvYz4gX1NlbGY7Ci0gIGZyaWVuZCBjbGFzcyBfUm9wZV9jaGFyX3JlZl9wcm94eTxfQ2hhclQsX0FsbG9jPjsKLSAgc2l6ZV90IF9NX3BvczsKLSAgcm9wZTxfQ2hhclQsX0FsbG9jPiogX01fcm9vdDsgICAgIC8vIFRoZSB3aG9sZSByb3BlLgotCi0gIF9Sb3BlX2NoYXJfcHRyX3Byb3h5KGNvbnN0IF9Sb3BlX2NoYXJfcmVmX3Byb3h5PF9DaGFyVCxfQWxsb2M+JiBfX3gpCi0gICAgOiBfTV9wb3MoX194Ll9NX3BvcyksIF9NX3Jvb3QoX194Ll9NX3Jvb3QpIHt9Ci0gIF9Sb3BlX2NoYXJfcHRyX3Byb3h5KGNvbnN0IF9TZWxmJiBfX3gpCi0gICAgOiBfTV9wb3MoX194Ll9NX3BvcyksIF9NX3Jvb3QoX194Ll9NX3Jvb3QpIHt9Ci0gIF9Sb3BlX2NoYXJfcHRyX3Byb3h5KCkge30KLSAgX1JvcGVfY2hhcl9wdHJfcHJveHkoX0NoYXJUKiBfX3gpIDogX01fcG9zKDApLCBfTV9yb290KDApIHsKLSAgICBfU1RMUF9BU1NFUlQoMCA9PSBfX3gpCi0gIH0KLSAgX1NlbGYmIG9wZXJhdG9yPSAoY29uc3QgX1NlbGYmIF9feCkgewotICAgIF9NX3BvcyA9IF9feC5fTV9wb3M7Ci0gICAgX01fcm9vdCA9IF9feC5fTV9yb290OwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIF9Sb3BlX2NoYXJfcmVmX3Byb3h5PF9DaGFyVCxfQWxsb2M+IG9wZXJhdG9yKigpIGNvbnN0IHsKLSAgICByZXR1cm4gX1JvcGVfY2hhcl9yZWZfcHJveHk8X0NoYXJULF9BbGxvYz4oX01fcm9vdCwgX01fcG9zKTsKLSAgfQotfTsKLQotCi0vKgotICogUm9wZSBpdGVyYXRvcnM6Ci0gKiBVbmxpa2UgaW4gdGhlIEMgdmVyc2lvbiwgd2UgY2FjaGUgb25seSBwYXJ0IG9mIHRoZSBzdGFjawotICogZm9yIHJvcGUgaXRlcmF0b3JzLCBzaW5jZSB0aGV5IG11c3QgYmUgZWZmaWNpZW50bHkgY29weWFibGUuCi0gKiBXaGVuIHdlIHJ1biBvdXQgb2YgY2FjaGUsIHdlIGhhdmUgdG8gcmVjb25zdHJ1Y3QgdGhlIGl0ZXJhdG9yCi0gKiB2YWx1ZS4KLSAqIFBvaW50ZXJzIGZyb20gaXRlcmF0b3JzIGFyZSBub3QgaW5jbHVkZWQgaW4gcmVmZXJlbmNlIGNvdW50cy4KLSAqIEl0ZXJhdG9ycyBhcmUgYXNzdW1lZCB0byBiZSB0aHJlYWQgcHJpdmF0ZS4gIFJvcGVzIGNhbgotICogYmUgc2hhcmVkLgotICovCi10ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KLWNsYXNzIF9Sb3BlX2l0ZXJhdG9yX2Jhc2UKLS8qICAgOiBwdWJsaWMgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcjxfQ2hhclQsIHB0cmRpZmZfdD4gICovCi17Ci0gIGZyaWVuZCBjbGFzcyByb3BlPF9DaGFyVCxfQWxsb2M+OwotICB0eXBlZGVmIF9Sb3BlX2l0ZXJhdG9yX2Jhc2U8X0NoYXJULCBfQWxsb2M+IF9TZWxmOwotICB0eXBlZGVmIF9Sb3BlX1JvcGVDb25jYXRlbmF0aW9uPF9DaGFyVCxfQWxsb2M+IF9Sb3BlQ29uY2F0OwotcHVibGljOgotICB0eXBlZGVmIF9Sb3BlX1JvcGVSZXA8X0NoYXJULF9BbGxvYz4gX1JvcGVSZXA7Ci0KLSAgZW51bSB7IF9TX3BhdGhfY2FjaGVfbGVuID0gNCB9OyAvLyBNdXN0IGJlIDw9IDkgYmVjYXVzZSBvZiBfTV9wYXRoX2RpcmVjdGlvbi4KLSAgZW51bSB7IF9TX2l0ZXJhdG9yX2J1Zl9sZW4gPSAxNSB9OwotICBzaXplX3QgX01fY3VycmVudF9wb3M7Ci0gIC8vIFRoZSB3aG9sZSByb3BlLgotICBfUm9wZVJlcCogX01fcm9vdDsKLSAgLy8gU3RhcnRpbmcgcG9zaXRpb24gZm9yIGN1cnJlbnQgbGVhZgotICBzaXplX3QgX01fbGVhZl9wb3M7Ci0gIC8vIEJ1ZmZlciBwb3NzaWJseSBjb250YWluaW5nIGN1cnJlbnQgY2hhci4KLSAgX0NoYXJUKiBfTV9idWZfc3RhcnQ7Ci0gIC8vIFBvaW50ZXIgdG8gY3VycmVudCBjaGFyIGluIGJ1ZmZlciwgIT0gMCA9PT4gYnVmZmVyIHZhbGlkLgotICBfQ2hhclQqIF9NX2J1Zl9wdHI7Ci0gIC8vIE9uZSBwYXN0IF9fbGFzdCB2YWxpZCBjaGFyIGluIGJ1ZmZlci4KLSAgX0NoYXJUKiBfTV9idWZfZW5kOwotCi0gIC8vIFdoYXQgZm9sbG93cyBpcyB0aGUgcGF0aCBjYWNoZS4gIFdlIGdvIG91dCBvZiBvdXIKLSAgLy8gd2F5IHRvIG1ha2UgdGhpcyBjb21wYWN0LgotICAvLyBQYXRoX2VuZCBjb250YWlucyB0aGUgYm90dG9tIHNlY3Rpb24gb2YgdGhlIHBhdGggZnJvbQotICAvLyB0aGUgcm9vdCB0byB0aGUgY3VycmVudCBsZWFmLgotICBzdHJ1Y3QgewotIyAgaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKSAmJiAoX19CT1JMQU5EQ19fIDwgMHg1NjApCi0gICAgX1JvcGVSZXAgY29uc3QqX01fZGF0YVs0XTsKLSMgIGVsc2UKLSAgICBfUm9wZVJlcCBjb25zdCpfTV9kYXRhW19TX3BhdGhfY2FjaGVfbGVuXTsKLSMgIGVuZGlmCi0gIH0gX01fcGF0aF9lbmQ7Ci0gIC8vIExhc3QgdmFsaWQgX19wb3MgaW4gcGF0aF9lbmQ7Ci0gIC8vIF9NX3BhdGhfZW5kWzBdIC4uLiBfTV9wYXRoX2VuZFtfTV9sZWFmX2luZGV4LTFdCi0gIC8vIHBvaW50IHRvIGNvbmNhdGVuYXRpb24gbm9kZXMuCi0gIGludCBfTV9sZWFmX2luZGV4OwotICAvLyAoX01fcGF0aF9kaXJlY3Rpb25zID4+IF9faSkgJiAxIGlzIDEKLSAgLy8gaWYgd2UgZ290IGZyb20gX01fcGF0aF9lbmRbbGVhZl9pbmRleCAtIF9faSAtIDFdCi0gIC8vIHRvIF9NX3BhdGhfZW5kW2xlYWZfaW5kZXggLSBfX2ldIGJ5IGdvaW5nIHRvIHRoZQotICAvLyBfX3JpZ2h0LiBBc3N1bWVzIHBhdGhfY2FjaGVfbGVuIDw9IDkuCi0gIHVuc2lnbmVkIGNoYXIgX01fcGF0aF9kaXJlY3Rpb25zOwotICAvLyBTaG9ydCBidWZmZXIgZm9yIHN1cnJvdW5kaW5nIGNoYXJzLgotICAvLyBUaGlzIGlzIHVzZWZ1bCBwcmltYXJpbHkgZm9yCi0gIC8vIFJvcGVGdW5jdGlvbnMuICBXZSBwdXQgdGhlIGJ1ZmZlcgotICAvLyBoZXJlIHRvIGF2b2lkIGxvY2tpbmcgaW4gdGhlCi0gIC8vIG11bHRpdGhyZWFkZWQgY2FzZS4KLSAgLy8gVGhlIGNhY2hlZCBwYXRoIGlzIGdlbmVyYWxseSBhc3N1bWVkIHRvIGJlIHZhbGlkCi0gIC8vIG9ubHkgaWYgdGhlIGJ1ZmZlciBpcyB2YWxpZC4KLSAgc3RydWN0IHsKLSMgIGlmIGRlZmluZWQgKF9fQk9STEFORENfXykgJiYgKF9fQk9STEFORENfXyA8IDB4NTYwKQotICAgIF9DaGFyVCBfTV9kYXRhWzE1XTsKLSMgIGVsc2UKLSAgICBfQ2hhclQgX01fZGF0YVtfU19pdGVyYXRvcl9idWZfbGVuXTsKLSMgIGVuZGlmCi0gIH0gX01fdG1wX2J1ZjsKLQotICAvLyBTZXQgYnVmZmVyIGNvbnRlbnRzIGdpdmVuIHBhdGggY2FjaGUuCi0gIHN0YXRpYyB2b2lkIF9TX3NldGJ1ZihfUm9wZV9pdGVyYXRvcl9iYXNlPF9DaGFyVCwgX0FsbG9jPiYgX194KTsKLSAgLy8gU2V0IGJ1ZmZlciBjb250ZW50cyBhbmQgcGF0aCBjYWNoZS4KLSAgc3RhdGljIHZvaWQgX1Nfc2V0Y2FjaGUoX1JvcGVfaXRlcmF0b3JfYmFzZTxfQ2hhclQsIF9BbGxvYz4mIF9feCk7Ci0gIC8vIEFzIGFib3ZlLCBidXQgYXNzdW1lcyBwYXRoIGNhY2hlIGlzIHZhbGlkIGZvciBwcmV2aW91cyBwb3NuLgotICBzdGF0aWMgdm9pZCBfU19zZXRjYWNoZV9mb3JfaW5jcihfUm9wZV9pdGVyYXRvcl9iYXNlPF9DaGFyVCwgX0FsbG9jPiYgX194KTsKLSAgX1JvcGVfaXRlcmF0b3JfYmFzZSgpIHt9Ci0gIF9Sb3BlX2l0ZXJhdG9yX2Jhc2UoX1JvcGVSZXAqIF9fcm9vdCwgc2l6ZV90IF9fcG9zKQotICAgIDogX01fY3VycmVudF9wb3MoX19wb3MpLF9NX3Jvb3QoX19yb290KSwgIF9NX2J1Zl9wdHIoMCkge30KLSAgdm9pZCBfTV9pbmNyKHNpemVfdCBfX24pOwotICB2b2lkIF9NX2RlY3Ioc2l6ZV90IF9fbik7Ci1wdWJsaWM6Ci0gIHNpemVfdCBpbmRleCgpIGNvbnN0IHsgcmV0dXJuIF9NX2N1cnJlbnRfcG9zOyB9Ci1wcml2YXRlOgotICB2b2lkIF9NX2NvcHlfYnVmKGNvbnN0IF9TZWxmJiBfX3gpIHsKLSAgICBfTV90bXBfYnVmID0gX194Ll9NX3RtcF9idWY7Ci0gICAgaWYgKF9feC5fTV9idWZfc3RhcnQgPT0gX194Ll9NX3RtcF9idWYuX01fZGF0YSkgewotICAgICAgX01fYnVmX3N0YXJ0ID0gX01fdG1wX2J1Zi5fTV9kYXRhOwotICAgICAgX01fYnVmX2VuZCA9IF9NX2J1Zl9zdGFydCArIChfX3guX01fYnVmX2VuZCAtIF9feC5fTV9idWZfc3RhcnQpOwotICAgICAgX01fYnVmX3B0ciA9IF9NX2J1Zl9zdGFydCArIChfX3guX01fYnVmX3B0ciAtIF9feC5fTV9idWZfc3RhcnQpOwotICAgIH0gZWxzZSB7Ci0gICAgICBfTV9idWZfZW5kID0gX194Ll9NX2J1Zl9lbmQ7Ci0gICAgfQotICB9Ci0KLXB1YmxpYzoKLSAgX1JvcGVfaXRlcmF0b3JfYmFzZShjb25zdCBfU2VsZiYgX194KSA6IAotICAgICAgX01fY3VycmVudF9wb3MoX194Ll9NX2N1cnJlbnRfcG9zKSwKLSAgICAgIF9NX3Jvb3QoX194Ll9NX3Jvb3QpLAotICAgICAgX01fbGVhZl9wb3MoIF9feC5fTV9sZWFmX3BvcyApLAotICAgICAgX01fYnVmX3N0YXJ0KF9feC5fTV9idWZfc3RhcnQpLAotICAgICAgX01fYnVmX3B0cihfX3guX01fYnVmX3B0ciksCi0gICAgICBfTV9wYXRoX2VuZChfX3guX01fcGF0aF9lbmQpLAotICAgICAgX01fbGVhZl9pbmRleChfX3guX01fbGVhZl9pbmRleCksCi0gICAgICBfTV9wYXRoX2RpcmVjdGlvbnMoX194Ll9NX3BhdGhfZGlyZWN0aW9ucykKLSAgICAgIHsKLSAgICAgICAgaWYgKDAgIT0gX194Ll9NX2J1Zl9wdHIpIHsKLSAgICAgICAgICBfTV9jb3B5X2J1ZihfX3gpOwotICAgICAgICB9Ci0gICAgICB9Ci0gIF9TZWxmJiBvcGVyYXRvciA9IChjb25zdCBfU2VsZiYgX194KQotICAgICAgewotICAgICAgICBfTV9jdXJyZW50X3BvcyA9IF9feC5fTV9jdXJyZW50X3BvczsKLSAgICAgICAgX01fcm9vdCA9IF9feC5fTV9yb290OwotICAgICAgICBfTV9idWZfc3RhcnQgPSBfX3guX01fYnVmX3N0YXJ0OwotICAgICAgICBfTV9idWZfcHRyID0gX194Ll9NX2J1Zl9wdHI7Ci0gICAgICAgIF9NX3BhdGhfZW5kID0gX194Ll9NX3BhdGhfZW5kOwotICAgICAgICBfTV9sZWFmX2luZGV4ID0gX194Ll9NX2xlYWZfaW5kZXg7Ci0gICAgICAgIF9NX3BhdGhfZGlyZWN0aW9ucyA9IF9feC5fTV9wYXRoX2RpcmVjdGlvbnM7Ci0gICAgICAgIF9NX2xlYWZfcG9zID0gX194Ll9NX2xlYWZfcG9zOwotICAgICAgICBpZiAoMCAhPSBfX3guX01fYnVmX3B0cikgewotICAgICAgICAgIF9NX2NvcHlfYnVmKF9feCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICp0aGlzOwotICAgICAgfQotfTsKLQotdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+IGNsYXNzIF9Sb3BlX2l0ZXJhdG9yOwotCi10ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KLWNsYXNzIF9Sb3BlX2NvbnN0X2l0ZXJhdG9yIDogcHVibGljIF9Sb3BlX2l0ZXJhdG9yX2Jhc2U8X0NoYXJULF9BbGxvYz4gewotICBmcmllbmQgY2xhc3Mgcm9wZTxfQ2hhclQsX0FsbG9jPjsKLSAgdHlwZWRlZiAgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+IF9TZWxmOwotICB0eXBlZGVmIF9Sb3BlX2l0ZXJhdG9yX2Jhc2U8X0NoYXJULF9BbGxvYz4gX0Jhc2U7Ci0gIC8vICBwcm90ZWN0ZWQ6Ci1wdWJsaWM6Ci0jICAgaWZuZGVmIF9TVExQX0hBU19OT19OQU1FU1BBQ0VTCi0gIHR5cGVkZWYgX1JvcGVfUm9wZVJlcDxfQ2hhclQsX0FsbG9jPiBfUm9wZVJlcDsKLSAgLy8gVGhlIG9uZSBmcm9tIHRoZSBiYXNlIGNsYXNzIG1heSBub3QgYmUgZGlyZWN0bHkgdmlzaWJsZS4KLSMgICBlbmRpZgotICBfUm9wZV9jb25zdF9pdGVyYXRvcihjb25zdCBfUm9wZVJlcCogX19yb290LCBzaXplX3QgX19wb3MpOgotICAgIF9Sb3BlX2l0ZXJhdG9yX2Jhc2U8X0NoYXJULF9BbGxvYz4oX19DT05TVF9DQVNUKF9Sb3BlUmVwKixfX3Jvb3QpLCBfX3BvcykKLSAgICAvLyBPbmx5IG5vbmNvbnN0IGl0ZXJhdG9ycyBtb2RpZnkgcm9vdCByZWYgY291bnQKLSAge30KLXB1YmxpYzoKLSAgdHlwZWRlZiBfQ2hhclQgcmVmZXJlbmNlOyAgIC8vIFJlYWxseSBhIHZhbHVlLiAgUmV0dXJuaW5nIGEgcmVmZXJlbmNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXb3VsZCBiZSBhIG1lc3MsIHNpbmNlIGl0IHdvdWxkIGhhdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGJlIGluY2x1ZGVkIGluIHJlZmNvdW50LgotICB0eXBlZGVmIGNvbnN0IF9DaGFyVCogcG9pbnRlcjsKLSAgdHlwZWRlZiBfQ2hhclQgdmFsdWVfdHlwZTsKLSAgdHlwZWRlZiBwdHJkaWZmX3QgZGlmZmVyZW5jZV90eXBlOwotICB0eXBlZGVmIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OwotCi1wdWJsaWM6Ci0gIF9Sb3BlX2NvbnN0X2l0ZXJhdG9yKCkge30KLSAgX1JvcGVfY29uc3RfaXRlcmF0b3IoY29uc3QgX1NlbGYmIF9feCkgOgotICAgIF9Sb3BlX2l0ZXJhdG9yX2Jhc2U8X0NoYXJULF9BbGxvYz4oX194KSB7IH0KLSAgX1JvcGVfY29uc3RfaXRlcmF0b3IoY29uc3QgX1JvcGVfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4mIF9feCk6Ci0gICAgX1JvcGVfaXRlcmF0b3JfYmFzZTxfQ2hhclQsX0FsbG9jPihfX3gpIHt9Ci0gIF9Sb3BlX2NvbnN0X2l0ZXJhdG9yKGNvbnN0IHJvcGU8X0NoYXJULF9BbGxvYz4mIF9fciwgc2l6ZV90IF9fcG9zKSA6Ci0gICAgX1JvcGVfaXRlcmF0b3JfYmFzZTxfQ2hhclQsX0FsbG9jPihfX3IuX01fdHJlZV9wdHIuX01fZGF0YSwgX19wb3MpIHt9Ci0gIF9TZWxmJiBvcGVyYXRvcj0gKGNvbnN0IF9TZWxmJiBfX3gpIHsKLSAgICBfQmFzZTo6b3BlcmF0b3I9KF9feCk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIHJlZmVyZW5jZSBvcGVyYXRvciooKSB7Ci0gICAgaWYgKDAgPT0gdGhpcy0+X01fYnVmX3B0cikKLSNpZiAhZGVmaW5lZCAoX19ETUNfXykKLSAgICAgIF9TX3NldGNhY2hlKCp0aGlzKTsKLSNlbHNlCi0gICAgeyBfUm9wZV9pdGVyYXRvcl9iYXNlPF9DaGFyVCwgX0FsbG9jPiogX194ID0gdGhpczsgX1Nfc2V0Y2FjaGUoKl9feCk7IH0KLSNlbmRpZgotICAgIHJldHVybiAqKHRoaXMtPl9NX2J1Zl9wdHIpOwotICB9Ci0gIF9TZWxmJiBvcGVyYXRvcisrKCkgewotICAgIF9DaGFyVCogX19uZXh0OwotICAgIGlmICgwICE9IHRoaXMtPl9NX2J1Zl9wdHIgJiYgKF9fbmV4dCA9IHRoaXMtPl9NX2J1Zl9wdHIgKyAxKSA8IHRoaXMtPl9NX2J1Zl9lbmQpIHsKLSAgICAgIHRoaXMtPl9NX2J1Zl9wdHIgPSBfX25leHQ7Ci0gICAgICArK3RoaXMtPl9NX2N1cnJlbnRfcG9zOwotICAgIH0gZWxzZSB7Ci0gICAgICB0aGlzLT5fTV9pbmNyKDEpOwotICAgIH0KLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgX1NlbGYmIG9wZXJhdG9yKz0ocHRyZGlmZl90IF9fbikgewotICAgIGlmIChfX24gPj0gMCkgewotICAgICAgdGhpcy0+X01faW5jcihfX24pOwotICAgIH0gZWxzZSB7Ci0gICAgICB0aGlzLT5fTV9kZWNyKC1fX24pOwotICAgIH0KLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgX1NlbGYmIG9wZXJhdG9yLS0oKSB7Ci0gICAgdGhpcy0+X01fZGVjcigxKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgX1NlbGYmIG9wZXJhdG9yLT0ocHRyZGlmZl90IF9fbikgewotICAgIGlmIChfX24gPj0gMCkgewotICAgICAgdGhpcy0+X01fZGVjcihfX24pOwotICAgIH0gZWxzZSB7Ci0gICAgICB0aGlzLT5fTV9pbmNyKC1fX24pOwotICAgIH0KLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgX1NlbGYgb3BlcmF0b3IrKyhpbnQpIHsKLSAgICBzaXplX3QgX19vbGRfcG9zID0gdGhpcy0+X01fY3VycmVudF9wb3M7Ci0gICAgdGhpcy0+X01faW5jcigxKTsKLSAgICByZXR1cm4gX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4odGhpcy0+X01fcm9vdCwgX19vbGRfcG9zKTsKLSAgICAvLyBUaGlzIG1ha2VzIGEgc3Vic2VxdWVudCBkZXJlZmVyZW5jZSBleHBlbnNpdmUuCi0gICAgLy8gUGVyaGFwcyB3ZSBzaG91bGQgaW5zdGVhZCBjb3B5IHRoZSBpdGVyYXRvcgotICAgIC8vIGlmIGl0IGhhcyBhIHZhbGlkIGNhY2hlPwotICB9Ci0gIF9TZWxmIG9wZXJhdG9yLS0oaW50KSB7Ci0gICAgc2l6ZV90IF9fb2xkX3BvcyA9IHRoaXMtPl9NX2N1cnJlbnRfcG9zOwotICAgIHRoaXMtPl9NX2RlY3IoMSk7Ci0gICAgcmV0dXJuIF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+KHRoaXMtPl9NX3Jvb3QsIF9fb2xkX3Bvcyk7Ci0gIH0KLSAgaW5saW5lIHJlZmVyZW5jZSBvcGVyYXRvcltdKHNpemVfdCBfX24pOwotfTsKLQotdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+Ci1jbGFzcyBfUm9wZV9pdGVyYXRvciA6IHB1YmxpYyBfUm9wZV9pdGVyYXRvcl9iYXNlPF9DaGFyVCxfQWxsb2M+IHsKLSAgZnJpZW5kIGNsYXNzIHJvcGU8X0NoYXJULF9BbGxvYz47Ci0gIHR5cGVkZWYgX1JvcGVfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+IF9TZWxmOwotICB0eXBlZGVmIF9Sb3BlX2l0ZXJhdG9yX2Jhc2U8X0NoYXJULF9BbGxvYz4gX0Jhc2U7Ci0gIHR5cGVkZWYgX1JvcGVfUm9wZVJlcDxfQ2hhclQsX0FsbG9jPiBfUm9wZVJlcDsKLQotcHVibGljOgotICByb3BlPF9DaGFyVCxfQWxsb2M+KiBfTV9yb290X3JvcGU7Ci0gIC8vIHJvb3QgaXMgdHJlYXRlZCBhcyBhIGNhY2hlZCB2ZXJzaW9uIG9mIHRoaXMsCi0gIC8vIGFuZCBpcyB1c2VkIHRvIGRldGVjdCBjaGFuZ2VzIHRvIHRoZSB1bmRlcmx5aW5nCi0gIC8vIHJvcGUuCi0gIC8vIFJvb3QgaXMgaW5jbHVkZWQgaW4gdGhlIHJlZmVyZW5jZSBjb3VudC4KLSAgLy8gVGhpcyBpcyBuZWNlc3Nhcnkgc28gdGhhdCB3ZSBjYW4gZGV0ZWN0IGNoYW5nZXMgcmVsaWFibHkuCi0gIC8vIFVuZm9ydHVuYXRlbHksIGl0IHJlcXVpcmVzIGNhcmVmdWwgYm9va2tlZXBpbmcgZm9yIHRoZQotICAvLyBub25HQyBjYXNlLgotICBfUm9wZV9pdGVyYXRvcihyb3BlPF9DaGFyVCxfQWxsb2M+KiBfX3IsIHNpemVfdCBfX3Bvcyk7Ci0KLSAgdm9pZCBfTV9jaGVjaygpOwotcHVibGljOgotICB0eXBlZGVmIF9Sb3BlX2NoYXJfcmVmX3Byb3h5PF9DaGFyVCxfQWxsb2M+ICByZWZlcmVuY2U7Ci0gIHR5cGVkZWYgX1JvcGVfY2hhcl9yZWZfcHJveHk8X0NoYXJULF9BbGxvYz4qIHBvaW50ZXI7Ci0gIHR5cGVkZWYgX0NoYXJUIHZhbHVlX3R5cGU7Ci0gIHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKLSAgdHlwZWRlZiByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKLXB1YmxpYzoKLSAgfl9Sb3BlX2l0ZXJhdG9yKCkgeyAgLy8qVFkgNS82LzAwIC0gYWRkZWQgZHRvciB0byBiYWxhbmNlIHJlZmVyZW5jZSBjb3VudAotICAgIF9Sb3BlUmVwOjpfU191bnJlZih0aGlzLT5fTV9yb290KTsKLSAgfQotCi0gIHJvcGU8X0NoYXJULF9BbGxvYz4mIGNvbnRhaW5lcigpIHsgcmV0dXJuICpfTV9yb290X3JvcGU7IH0KLSAgX1JvcGVfaXRlcmF0b3IoKSB7Ci0gICAgdGhpcy0+X01fcm9vdCA9IDA7ICAvLyBOZWVkZWQgZm9yIHJlZmVyZW5jZSBjb3VudGluZy4KLSAgfQotICBfUm9wZV9pdGVyYXRvcihjb25zdCAgX1NlbGYmIF9feCkgOgotICAgIF9Sb3BlX2l0ZXJhdG9yX2Jhc2U8X0NoYXJULF9BbGxvYz4oX194KSB7Ci0gICAgX01fcm9vdF9yb3BlID0gX194Ll9NX3Jvb3Rfcm9wZTsKLSAgICBfUm9wZVJlcDo6X1NfcmVmKHRoaXMtPl9NX3Jvb3QpOwotICB9Ci0gIF9Sb3BlX2l0ZXJhdG9yKHJvcGU8X0NoYXJULF9BbGxvYz4mIF9fciwgc2l6ZV90IF9fcG9zKTsKLSAgX1NlbGYmIG9wZXJhdG9yPSAoY29uc3QgIF9TZWxmJiBfX3gpIHsKLSAgICBfUm9wZVJlcCogX19vbGQgPSB0aGlzLT5fTV9yb290OwotICAgIF9Sb3BlUmVwOjpfU19yZWYoX194Ll9NX3Jvb3QpOwotICAgIF9CYXNlOjpvcGVyYXRvcj0oX194KTsKLSAgICBfTV9yb290X3JvcGUgPSBfX3guX01fcm9vdF9yb3BlOwotICAgIF9Sb3BlUmVwOjpfU191bnJlZihfX29sZCk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIHJlZmVyZW5jZSBvcGVyYXRvciooKSB7Ci0gICAgX01fY2hlY2soKTsKLSAgICBpZiAoMCA9PSB0aGlzLT5fTV9idWZfcHRyKSB7Ci0gICAgICByZXR1cm4gcmVmZXJlbmNlKF9NX3Jvb3Rfcm9wZSwgdGhpcy0+X01fY3VycmVudF9wb3MpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gcmVmZXJlbmNlKF9NX3Jvb3Rfcm9wZSwgdGhpcy0+X01fY3VycmVudF9wb3MsICoodGhpcy0+X01fYnVmX3B0cikpOwotICAgIH0KLSAgfQotICBfU2VsZiYgb3BlcmF0b3IrKygpIHsKLSAgICB0aGlzLT5fTV9pbmNyKDEpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotICBfU2VsZiYgb3BlcmF0b3IrPShwdHJkaWZmX3QgX19uKSB7Ci0gICAgaWYgKF9fbiA+PSAwKSB7Ci0gICAgICB0aGlzLT5fTV9pbmNyKF9fbik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRoaXMtPl9NX2RlY3IoLV9fbik7Ci0gICAgfQotICAgIHJldHVybiAqdGhpczsKLSAgfQotICBfU2VsZiYgb3BlcmF0b3ItLSgpIHsKLSAgICB0aGlzLT5fTV9kZWNyKDEpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotICBfU2VsZiYgb3BlcmF0b3ItPShwdHJkaWZmX3QgX19uKSB7Ci0gICAgaWYgKF9fbiA+PSAwKSB7Ci0gICAgICB0aGlzLT5fTV9kZWNyKF9fbik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRoaXMtPl9NX2luY3IoLV9fbik7Ci0gICAgfQotICAgIHJldHVybiAqdGhpczsKLSAgfQotICBfU2VsZiBvcGVyYXRvcisrKGludCkgewotICAgIHNpemVfdCBfX29sZF9wb3MgPSB0aGlzLT5fTV9jdXJyZW50X3BvczsKLSAgICB0aGlzLT5fTV9pbmNyKDEpOwotICAgIHJldHVybiBfU2VsZihfTV9yb290X3JvcGUsIF9fb2xkX3Bvcyk7Ci0gIH0KLSAgX1NlbGYgb3BlcmF0b3ItLShpbnQpIHsKLSAgICBzaXplX3QgX19vbGRfcG9zID0gdGhpcy0+X01fY3VycmVudF9wb3M7Ci0gICAgdGhpcy0+X01fZGVjcigxKTsKLSAgICByZXR1cm4gX1NlbGYoX01fcm9vdF9yb3BlLCBfX29sZF9wb3MpOwotICB9Ci0gIHJlZmVyZW5jZSBvcGVyYXRvcltdKHB0cmRpZmZfdCBfX24pIHsKLSAgICByZXR1cm4gcmVmZXJlbmNlKF9NX3Jvb3Rfcm9wZSwgdGhpcy0+X01fY3VycmVudF9wb3MgKyBfX24pOwotICB9Ci19OwotCi0jIGlmZGVmIF9TVExQX1VTRV9PTERfSFBfSVRFUkFUT1JfUVVFUklFUwotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgotaW5saW5lIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnCi1pdGVyYXRvcl9jYXRlZ29yeShjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPiYpIHsgIHJldHVybiByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZygpO30KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KLWlubGluZSBfQ2hhclQqIHZhbHVlX3R5cGUoY29uc3QgX1JvcGVfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4mKSB7IHJldHVybiAwOyB9Ci10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+Ci1pbmxpbmUgcHRyZGlmZl90KiBkaXN0YW5jZV90eXBlKGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+JikgeyByZXR1cm4gMDsgfQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgotaW5saW5lIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnCi1pdGVyYXRvcl9jYXRlZ29yeShjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPiYpIHsgcmV0dXJuIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKCk7IH0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KLWlubGluZSBfQ2hhclQqIHZhbHVlX3R5cGUoY29uc3QgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4mKSB7IHJldHVybiAwOyB9Ci10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+Ci1pbmxpbmUgcHRyZGlmZl90KiBkaXN0YW5jZV90eXBlKGNvbnN0IF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+JikgeyByZXR1cm4gMDsgfQotI2VuZGlmIC8qIF9TVExQX1VTRV9PTERfSFBfSVRFUkFUT1JfUVVFUklFUyAqLwotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2MsIGNsYXNzIF9DaGFyQ29uc3VtZXI+Ci1ib29sIF9TX2FwcGx5X3RvX3BpZWNlcyhfQ2hhckNvbnN1bWVyJiBfX2MsCi0gICAgICAgICAgICAgICAgICAgICAgICBfUm9wZV9Sb3BlUmVwPF9DaGFyVCwgX0FsbG9jPiAqX19yLAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IF9fYmVnaW4sIHNpemVfdCBfX2VuZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWdpbiBhbmQgZW5kIGFyZSBhc3N1bWVkIHRvIGJlIGluIHJhbmdlLgotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+Ci1jbGFzcyByb3BlCi0jaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKQotICAgICAgICAgICA6IHB1YmxpYyBfX3N0bHBvcnRfY2xhc3M8cm9wZTxfQ2hhclQsIF9BbGxvYz4gPgotI2VuZGlmCi17Ci0gIHR5cGVkZWYgcm9wZTxfQ2hhclQsX0FsbG9jPiBfU2VsZjsKLXB1YmxpYzoKLSAgdHlwZWRlZiBfQ2hhclQgdmFsdWVfdHlwZTsKLSAgdHlwZWRlZiBwdHJkaWZmX3QgZGlmZmVyZW5jZV90eXBlOwotICB0eXBlZGVmIHNpemVfdCBzaXplX3R5cGU7Ci0gIHR5cGVkZWYgX0NoYXJUIGNvbnN0X3JlZmVyZW5jZTsKLSAgdHlwZWRlZiBjb25zdCBfQ2hhclQqIGNvbnN0X3BvaW50ZXI7Ci0gIHR5cGVkZWYgX1JvcGVfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4gaXRlcmF0b3I7Ci0gIHR5cGVkZWYgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4gY29uc3RfaXRlcmF0b3I7Ci0gIHR5cGVkZWYgX1JvcGVfY2hhcl9yZWZfcHJveHk8X0NoYXJULF9BbGxvYz4gcmVmZXJlbmNlOwotICB0eXBlZGVmIF9Sb3BlX2NoYXJfcHRyX3Byb3h5PF9DaGFyVCxfQWxsb2M+IHBvaW50ZXI7Ci0KLSAgZnJpZW5kIGNsYXNzIF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+OwotICBmcmllbmQgY2xhc3MgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz47Ci0gIGZyaWVuZCBzdHJ1Y3QgX1JvcGVfUm9wZVJlcDxfQ2hhclQsX0FsbG9jPjsKLSAgZnJpZW5kIGNsYXNzIF9Sb3BlX2l0ZXJhdG9yX2Jhc2U8X0NoYXJULF9BbGxvYz47Ci0gIGZyaWVuZCBjbGFzcyBfUm9wZV9jaGFyX3B0cl9wcm94eTxfQ2hhclQsX0FsbG9jPjsKLSAgZnJpZW5kIGNsYXNzIF9Sb3BlX2NoYXJfcmVmX3Byb3h5PF9DaGFyVCxfQWxsb2M+OwotICBmcmllbmQgc3RydWN0IF9Sb3BlX1JvcGVTdWJzdHJpbmc8X0NoYXJULF9BbGxvYz47Ci0KLSAgX1NUTFBfREVDTEFSRV9SQU5ET01fQUNDRVNTX1JFVkVSU0VfSVRFUkFUT1JTOwotCi1wcm90ZWN0ZWQ6Ci0gIHR5cGVkZWYgX0NoYXJUKiBfQ3N0cnB0cjsKLQotICBzdGF0aWMgX0NoYXJUIF9TX2VtcHR5X2Nfc3RyWzFdOwotCi0gIGVudW0geyBfU19jb3B5X21heCA9IDIzIH07Ci0gIC8vIEZvciBzdHJpbmdzIHNob3J0ZXIgdGhhbiBfU19jb3B5X21heCwgd2UgY29weSB0bwotICAvLyBjb25jYXRlbmF0ZS4KLQotICB0eXBlZGVmIF9Sb3BlX1JvcGVSZXA8X0NoYXJULCBfQWxsb2M+IF9Sb3BlUmVwOwotICB0eXBlZGVmIHR5cGVuYW1lIF9Sb3BlUmVwOjpfSXNCYXNpY0NoYXJUeXBlIF9Jc0Jhc2ljQ2hhclR5cGU7Ci0KLXB1YmxpYzoKLSAgX1NUTFBfRk9SQ0VfQUxMT0NBVE9SUyhfQ2hhclQsIF9BbGxvYykKLSAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2NfdHJhaXRzPF9DaGFyVCxfQWxsb2M+OjphbGxvY2F0b3JfdHlwZSAgYWxsb2NhdG9yX3R5cGU7Ci0KLXB1YmxpYzoKLSAgLy8gVGhlIG9ubHkgZGF0YSBtZW1iZXIgb2YgYSByb3BlOgotICBfU1RMUF9QUklWIF9TVExQX2FsbG9jX3Byb3h5PF9Sb3BlUmVwKiwgX0NoYXJULCBhbGxvY2F0b3JfdHlwZT4gX01fdHJlZV9wdHI7Ci0KLXB1YmxpYzoKLSAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IHsgcmV0dXJuIGFsbG9jYXRvcl90eXBlKF9NX3RyZWVfcHRyKTsgfQotCi1wdWJsaWM6Ci0gIHR5cGVkZWYgX1JvcGVfUm9wZUNvbmNhdGVuYXRpb248X0NoYXJULF9BbGxvYz4gX1JvcGVDb25jYXRlbmF0aW9uOwotICB0eXBlZGVmIF9Sb3BlX1JvcGVMZWFmPF9DaGFyVCxfQWxsb2M+IF9Sb3BlTGVhZjsKLSAgdHlwZWRlZiBfUm9wZV9Sb3BlRnVuY3Rpb248X0NoYXJULF9BbGxvYz4gX1JvcGVGdW5jdGlvbjsKLSAgdHlwZWRlZiBfUm9wZV9Sb3BlU3Vic3RyaW5nPF9DaGFyVCxfQWxsb2M+IF9Sb3BlU3Vic3RyaW5nOwotCi0gIC8vIFJldHJpZXZlIGEgY2hhcmFjdGVyIGF0IHRoZSBpbmRpY2F0ZWQgcG9zaXRpb24uCi0gIHN0YXRpYyBfQ2hhclQgX1NfZmV0Y2goX1JvcGVSZXAqIF9fciwgc2l6ZV90eXBlIF9fcG9zKTsKLQotICAvLyBPYnRhaW4gYSBwb2ludGVyIHRvIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIGluZGljYXRlZCBwb3NpdGlvbi4KLSAgLy8gVGhlIHBvaW50ZXIgY2FuIGJlIHVzZWQgdG8gY2hhbmdlIHRoZSBjaGFyYWN0ZXIuCi0gIC8vIElmIHN1Y2ggYSBwb2ludGVyIGNhbm5vdCBiZSBwcm9kdWNlZCwgYXMgaXMgZnJlcXVlbnRseSB0aGUKLSAgLy8gY2FzZSwgMCBpcyByZXR1cm5lZCBpbnN0ZWFkLgotICAvLyAoUmV0dXJucyBub256ZXJvIG9ubHkgaWYgYWxsIG5vZGVzIGluIHRoZSBwYXRoIGhhdmUgYSByZWZjb3VudAotICAvLyBvZiAxLikKLSAgc3RhdGljIF9DaGFyVCogX1NfZmV0Y2hfcHRyKF9Sb3BlUmVwKiBfX3IsIHNpemVfdHlwZSBfX3Bvcyk7Ci0KLSAgc3RhdGljIHZvaWQgX1NfdW5yZWYoX1JvcGVSZXAqIF9fdCkgewotICAgIF9Sb3BlUmVwOjpfU191bnJlZihfX3QpOwotICB9Ci0gIHN0YXRpYyB2b2lkIF9TX3JlZihfUm9wZVJlcCogX190KSB7Ci0gICAgX1JvcGVSZXA6Ol9TX3JlZihfX3QpOwotICB9Ci0KLSAgdHlwZWRlZiBfUm9wZV9zZWxmX2Rlc3RydWN0X3B0cjxfQ2hhclQsX0FsbG9jPiBfU2VsZl9kZXN0cnVjdF9wdHI7Ci0KLSAgLy8gX1Jlc3VsdCBpcyBjb3VudGVkIGluIHJlZmNvdW50LgotICBzdGF0aWMgX1JvcGVSZXAqIF9TX3N1YnN0cmluZyhfUm9wZVJlcCogX19iYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgX19zdGFydCwgc2l6ZV90IF9fZW5kcDEpOwotCi0gIHN0YXRpYyBfUm9wZVJlcCogX1NfY29uY2F0X2NoYXJfaXRlcihfUm9wZVJlcCogX19yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0NoYXJUKiBfX2l0ZXIsIHNpemVfdCBfX3NsZW4pOwotICAvLyBDb25jYXRlbmF0ZSByb3BlIGFuZCBjaGFyIHB0ciwgY29weWluZyBfX3MuCi0gIC8vIFNob3VsZCByZWFsbHkgdGFrZSBhbiBhcmJpdHJhcnkgaXRlcmF0b3IuCi0gIC8vIFJlc3VsdCBpcyBjb3VudGVkIGluIHJlZmNvdW50LgotICBzdGF0aWMgX1JvcGVSZXAqIF9TX2Rlc3RyX2NvbmNhdF9jaGFyX2l0ZXIoX1JvcGVSZXAqIF9fciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9DaGFyVCogX19pdGVyLCBzaXplX3QgX19zbGVuKTsKLSAgICAvLyBBcyBhYm92ZSwgYnV0IG9uZSByZWZlcmVuY2UgdG8gX19yIGlzIGFib3V0IHRvIGJlCi0gICAgLy8gZGVzdHJveWVkLiAgVGh1cyB0aGUgcGllY2VzIG1heSBiZSByZWN5Y2xlZCBpZiBhbGwKLSAgICAvLyByZWxldmVudCByZWZlcmVuY2UgY291bnRzIGFyZSAxLgotCi0gIC8vIEdlbmVyYWwgY29uY2F0ZW5hdGlvbiBvbiBfUm9wZVJlcC4gIF9SZXN1bHQKLSAgLy8gaGFzIHJlZmNvdW50IG9mIDEuICBBZGp1c3RzIGFyZ3VtZW50IHJlZmNvdW50cy4KLSAgc3RhdGljIF9Sb3BlUmVwKiBfU19jb25jYXRfcmVwKF9Sb3BlUmVwKiBfX2xlZnQsIF9Sb3BlUmVwKiBfX3JpZ2h0KTsKLQotcHVibGljOgotI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCi0gIHRlbXBsYXRlIDxjbGFzcyBfQ2hhckNvbnN1bWVyPgotI2Vsc2UKLSAgdHlwZWRlZiBfUm9wZV9jaGFyX2NvbnN1bWVyPF9DaGFyVD4gX0NoYXJDb25zdW1lcjsKLSNlbmRpZgotICB2b2lkIGFwcGx5X3RvX3BpZWNlcyhzaXplX3QgX19iZWdpbiwgc2l6ZV90IF9fZW5kLAotICAgICAgICAgICAgICAgICAgICAgICBfQ2hhckNvbnN1bWVyJiBfX2MpIGNvbnN0Ci0gIHsgX1NfYXBwbHlfdG9fcGllY2VzKF9fYywgX01fdHJlZV9wdHIuX01fZGF0YSwgX19iZWdpbiwgX19lbmQpOyB9Ci0KLXByb3RlY3RlZDoKLQotICBzdGF0aWMgc2l6ZV90IF9TX3JvdW5kZWRfdXBfc2l6ZShzaXplX3QgX19uKQotICB7IHJldHVybiBfUm9wZVJlcDo6X1Nfcm91bmRlZF91cF9zaXplKF9fbik7IH0KLQotICAvLyBBbGxvY2F0ZSBhbmQgY29uc3RydWN0IGEgUm9wZUxlYWYgdXNpbmcgdGhlIHN1cHBsaWVkIGFsbG9jYXRvcgotICAvLyBUYWtlcyBvd25lcnNoaXAgb2YgcyBpbnN0ZWFkIG9mIGNvcHlpbmcuCi0gIHN0YXRpYyBfUm9wZUxlYWYqIF9TX25ld19Sb3BlTGVhZihfQ2hhclQgKl9fcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBfcF9zaXplLCBhbGxvY2F0b3JfdHlwZSBfX2EpIHsKLSAgICBfUm9wZUxlYWYqIF9fc3BhY2UgPSBfU1RMUF9DUkVBVEVfQUxMT0NBVE9SKGFsbG9jYXRvcl90eXBlLCBfX2EsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUm9wZUxlYWYpLmFsbG9jYXRlKDEpOwotICAgIF9TVExQX1RSWSB7Ci0gICAgICBfU1RMUF9QTEFDRU1FTlRfTkVXKF9fc3BhY2UpIF9Sb3BlTGVhZihfX3MsIF9wX3NpemUsIF9fYSk7Ci0gICAgfQotICAgX1NUTFBfVU5XSU5EKF9TVExQX0NSRUFURV9BTExPQ0FUT1IoYWxsb2NhdG9yX3R5cGUsX19hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JvcGVMZWFmKS5kZWFsbG9jYXRlKF9fc3BhY2UsIDEpKQotICAgIHJldHVybiBfX3NwYWNlOwotICB9Ci0KLSAgc3RhdGljIF9Sb3BlQ29uY2F0ZW5hdGlvbiogX1NfbmV3X1JvcGVDb25jYXRlbmF0aW9uKF9Sb3BlUmVwKiBfX2xlZnQsIF9Sb3BlUmVwKiBfX3JpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yX3R5cGUgX19hKSB7Ci0gICBfUm9wZUNvbmNhdGVuYXRpb24qIF9fc3BhY2UgPSBfU1RMUF9DUkVBVEVfQUxMT0NBVE9SKGFsbG9jYXRvcl90eXBlLCBfX2EsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Sb3BlQ29uY2F0ZW5hdGlvbikuYWxsb2NhdGUoMSk7Ci0gICAgcmV0dXJuIF9TVExQX1BMQUNFTUVOVF9ORVcoX19zcGFjZSkgX1JvcGVDb25jYXRlbmF0aW9uKF9fbGVmdCwgX19yaWdodCwgX19hKTsKLSAgfQotCi0gIHN0YXRpYyBfUm9wZUZ1bmN0aW9uKiBfU19uZXdfUm9wZUZ1bmN0aW9uKGNoYXJfcHJvZHVjZXI8X0NoYXJUPiogX19mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgX3Bfc2l6ZSwgYm9vbCBfX2QsIGFsbG9jYXRvcl90eXBlIF9fYSkgewotICAgX1JvcGVGdW5jdGlvbiogX19zcGFjZSA9IF9TVExQX0NSRUFURV9BTExPQ0FUT1IoYWxsb2NhdG9yX3R5cGUsIF9fYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Sb3BlRnVuY3Rpb24pLmFsbG9jYXRlKDEpOwotICAgIHJldHVybiBfU1RMUF9QTEFDRU1FTlRfTkVXKF9fc3BhY2UpIF9Sb3BlRnVuY3Rpb24oX19mLCBfcF9zaXplLCBfX2QsIF9fYSk7Ci0gIH0KLQotICBzdGF0aWMgX1JvcGVTdWJzdHJpbmcqIF9TX25ld19Sb3BlU3Vic3RyaW5nKF9Sb3BlX1JvcGVSZXA8X0NoYXJULF9BbGxvYz4qIF9fYiwgc2l6ZV90IF9fcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgX19sLCBhbGxvY2F0b3JfdHlwZSBfX2EpIHsKLSAgIF9Sb3BlU3Vic3RyaW5nKiBfX3NwYWNlID0gX1NUTFBfQ1JFQVRFX0FMTE9DQVRPUihhbGxvY2F0b3JfdHlwZSwgX19hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Sb3BlU3Vic3RyaW5nKS5hbGxvY2F0ZSgxKTsKLSAgICByZXR1cm4gX1NUTFBfUExBQ0VNRU5UX05FVyhfX3NwYWNlKSBfUm9wZVN1YnN0cmluZyhfX2IsIF9fcywgX19sLCBfX2EpOwotICB9Ci0KLSAgc3RhdGljCi0gIF9Sb3BlTGVhZiogX1NfUm9wZUxlYWZfZnJvbV91bm93bmVkX2NoYXJfcHRyKGNvbnN0IF9DaGFyVCAqX19zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgX3Bfc2l6ZSwgYWxsb2NhdG9yX3R5cGUgX19hKSB7Ci0gICAgaWYgKDAgPT0gX3Bfc2l6ZSkgcmV0dXJuIDA7Ci0KLSAgIF9DaGFyVCogX19idWYgPSBfU1RMUF9DUkVBVEVfQUxMT0NBVE9SKGFsbG9jYXRvcl90eXBlLF9fYSwgX0NoYXJUKS5hbGxvY2F0ZShfU19yb3VuZGVkX3VwX3NpemUoX3Bfc2l6ZSkpOwotCi0gICAgX1NUTFBfUFJJViBfX3Vjb3B5X24oX19zLCBfcF9zaXplLCBfX2J1Zik7Ci0gICAgX1NfY29uc3RydWN0X251bGwoX19idWYgKyBfcF9zaXplKTsKLQotICAgIF9TVExQX1RSWSB7Ci0gICAgICByZXR1cm4gX1NfbmV3X1JvcGVMZWFmKF9fYnVmLCBfcF9zaXplLCBfX2EpOwotICAgIH0KLSAgICBfU1RMUF9VTldJTkQoX1JvcGVSZXA6Ol9TX2ZyZWVfc3RyaW5nKF9fYnVmLCBfcF9zaXplLCBfX2EpKQotICAgIF9TVExQX1JFVF9BRlRFUl9USFJPVygwKQotICB9Ci0KLQotICAvLyBDb25jYXRlbmF0aW9uIG9mIG5vbmVtcHR5IHN0cmluZ3MuCi0gIC8vIEFsd2F5cyBidWlsZHMgYSBjb25jYXRlbmF0aW9uIG5vZGUuCi0gIC8vIFJlYmFsYW5jZXMgaWYgdGhlIHJlc3VsdCBpcyB0b28gZGVlcC4KLSAgLy8gUmVzdWx0IGhhcyByZWZjb3VudCAxLgotICAvLyBEb2VzIG5vdCBpbmNyZW1lbnQgbGVmdCBhbmQgcmlnaHQgcmVmIGNvdW50cyBldmVuIHRob3VnaAotICAvLyB0aGV5IGFyZSByZWZlcmVuY2VkLgotICBzdGF0aWMgX1JvcGVSZXAqCi0gIF9TX3RyZWVfY29uY2F0KF9Sb3BlUmVwKiBfX2xlZnQsIF9Sb3BlUmVwKiBfX3JpZ2h0KTsKLQotICAvLyBDb25jYXRlbmF0aW9uIGhlbHBlciBmdW5jdGlvbnMKLSAgc3RhdGljIF9Sb3BlTGVhZioKLSAgX1NfbGVhZl9jb25jYXRfY2hhcl9pdGVyKF9Sb3BlTGVhZiogX19yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0NoYXJUKiBfX2l0ZXIsIHNpemVfdCBfX3NsZW4pOwotICAvLyBDb25jYXRlbmF0ZSBieSBjb3B5aW5nIGxlYWYuCi0gIC8vIHNob3VsZCB0YWtlIGFuIGFyYml0cmFyeSBpdGVyYXRvcgotICAvLyByZXN1bHQgaGFzIHJlZmNvdW50IDEuCi0gIHN0YXRpYyBfUm9wZUxlYWYqIF9TX2Rlc3RyX2xlYWZfY29uY2F0X2NoYXJfaXRlcgotICAoX1JvcGVMZWFmKiBfX3IsIGNvbnN0IF9DaGFyVCogX19pdGVyLCBzaXplX3QgX19zbGVuKTsKLSAgLy8gQSB2ZXJzaW9uIHRoYXQgcG90ZW50aWFsbHkgY2xvYmJlcnMgX19yIGlmIF9fci0+X01fcmVmX2NvdW50ID09IDEuCi0KLQotICAvLyBBIGhlbHBlciBmdW5jdGlvbiBmb3IgZXhwb25lbnRpYXRpbmcgc3RyaW5ncy4KLSAgLy8gVGhpcyB1c2VzIGEgbm9uc3RhbmRhcmQgcmVmY291bnQgY29udmVudGlvbi4KLSAgLy8gVGhlIHJlc3VsdCBoYXMgcmVmY291bnQgMC4KLSAgdHlwZWRlZiBfU1RMUF9QUklWIF9Sb3BlX0NvbmNhdF9mbjxfQ2hhclQsX0FsbG9jPiBfQ29uY2F0X2ZuOwotI2lmICFkZWZpbmVkIChfX0dOVUNfXykgfHwgKF9fR05VQ19fIDwgMykKLSAgZnJpZW5kIF9Db25jYXRfZm47Ci0jZWxzZQotICBmcmllbmQgc3RydWN0IF9TVExQX1BSSVYgX1JvcGVfQ29uY2F0X2ZuPF9DaGFyVCxfQWxsb2M+OwotI2VuZGlmCi0KLXB1YmxpYzoKLSAgc3RhdGljIHNpemVfdCBfU19jaGFyX3B0cl9sZW4oY29uc3QgX0NoYXJUKiBfX3MpIHsKLSAgICByZXR1cm4gY2hhcl90cmFpdHM8X0NoYXJUPjo6bGVuZ3RoKF9fcyk7Ci0gIH0KLQotcHVibGljOiAvKiBmb3Igb3BlcmF0b3JzICovCi0gIHJvcGUoX1JvcGVSZXAqIF9fdCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCi0gICAgOiBfTV90cmVlX3B0cihfX2EsIF9fdCkgeyB9Ci1wcml2YXRlOgotICAvLyBDb3B5IF9fciB0byB0aGUgX0NoYXJUIGJ1ZmZlci4KLSAgLy8gUmV0dXJucyBfX2J1ZmZlciArIF9fci0+X01fc2l6ZS5fTV9kYXRhLgotICAvLyBBc3N1bWVzIHRoYXQgYnVmZmVyIGlzIHVuaW5pdGlhbGl6ZWQuCi0gIHN0YXRpYyBfQ2hhclQqIF9TX2ZsYXR0ZW4oX1JvcGVSZXAqIF9fciwgX0NoYXJUKiBfX2J1ZmZlcik7Ci0KLSAgLy8gQWdhaW4sIHdpdGggZXhwbGljaXQgc3RhcnRpbmcgcG9zaXRpb24gYW5kIGxlbmd0aC4KLSAgLy8gQXNzdW1lcyB0aGF0IGJ1ZmZlciBpcyB1bmluaXRpYWxpemVkLgotICBzdGF0aWMgX0NoYXJUKiBfU19mbGF0dGVuKF9Sb3BlUmVwKiBfX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IF9fc3RhcnQsIHNpemVfdCBfX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ2hhclQqIF9fYnVmZmVyKTsKLQotICAvLyBmYnAgOiBIUCBhQ0MgcHJvaGliaXRzIGFjY2VzcyB0byBwcm90ZWN0ZWQgbWluX2xlbiBmcm9tIHdpdGhpbiBzdGF0aWMgbWV0aG9kcyAoID8/ICkKLXB1YmxpYzoKLSAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgX1NfbWluX2xlbltfX1JPUEVfREVQVEhfU0laRV07Ci1wcm90ZWN0ZWQ6Ci0gIHN0YXRpYyBib29sIF9TX2lzX2JhbGFuY2VkKF9Sb3BlUmVwKiBfX3IpCi0gIHsgcmV0dXJuIChfX3ItPl9NX3NpemUuX01fZGF0YSA+PSBfU19taW5fbGVuW19fci0+X01fZGVwdGhdKTsgfQotCi0gIHN0YXRpYyBib29sIF9TX2lzX2FsbW9zdF9iYWxhbmNlZChfUm9wZVJlcCogX19yKSB7Ci0gICAgcmV0dXJuIChfX3ItPl9NX2RlcHRoID09IDAgfHwKLSAgICAgICAgICAgIF9fci0+X01fc2l6ZS5fTV9kYXRhID49IF9TX21pbl9sZW5bX19yLT5fTV9kZXB0aCAtIDFdKTsKLSAgfQotCi0gIHN0YXRpYyBib29sIF9TX2lzX3JvdWdobHlfYmFsYW5jZWQoX1JvcGVSZXAqIF9fcikgewotICAgIHJldHVybiAoX19yLT5fTV9kZXB0aCA8PSAxIHx8Ci0gICAgICAgICAgICBfX3ItPl9NX3NpemUuX01fZGF0YSA+PSBfU19taW5fbGVuW19fci0+X01fZGVwdGggLSAyXSk7Ci0gIH0KLQotICAvLyBBc3N1bWVzIHRoZSByZXN1bHQgaXMgbm90IGVtcHR5LgotICBzdGF0aWMgX1JvcGVSZXAqIF9TX2NvbmNhdF9hbmRfc2V0X2JhbGFuY2VkKF9Sb3BlUmVwKiBfX2xlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JvcGVSZXAqIF9fcmlnaHQpIHsKLSAgICBfUm9wZVJlcCogX19yZXN1bHQgPSBfU19jb25jYXRfcmVwKF9fbGVmdCwgX19yaWdodCk7Ci0gICAgaWYgKF9TX2lzX2JhbGFuY2VkKF9fcmVzdWx0KSkgX19yZXN1bHQtPl9NX2lzX2JhbGFuY2VkID0gdHJ1ZTsKLSAgICByZXR1cm4gX19yZXN1bHQ7Ci0gIH0KLQotICAvLyBUaGUgYmFzaWMgcmViYWxhbmNpbmcgb3BlcmF0aW9uLiAgTG9naWNhbGx5IGNvcGllcyB0aGUKLSAgLy8gcm9wZS4gIFRoZSByZXN1bHQgaGFzIHJlZmNvdW50IG9mIDEuICBUaGUgY2xpZW50IHdpbGwKLSAgLy8gdXN1YWxseSBkZWNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiBfX3IuCi0gIC8vIFRoZSByZXN1bHQgaXMgd2l0aGluIGhlaWdodCAyIG9mIGJhbGFuY2VkIGJ5IHRoZSBhYm92ZQotICAvLyBkZWZpbml0aW9uLgotICBzdGF0aWMgX1JvcGVSZXAqIF9TX2JhbGFuY2UoX1JvcGVSZXAqIF9fcik7Ci0KLSAgLy8gQWRkIGFsbCB1bmJhbGFuY2VkIHN1YnRyZWVzIHRvIHRoZSBmb3Jlc3Qgb2YgYmFsYW5jZWVkIHRyZWVzLgotICAvLyBVc2VkIG9ubHkgYnkgYmFsYW5jZS4KLSAgc3RhdGljIHZvaWQgX1NfYWRkX3RvX2ZvcmVzdChfUm9wZVJlcCpfX3IsIF9Sb3BlUmVwKiogX19mb3Jlc3QpOwotCi0gIC8vIEFkZCBfX3IgdG8gZm9yZXN0LCBhc3N1bWluZyBfX3IgaXMgYWxyZWFkeSBiYWxhbmNlZC4KLSAgc3RhdGljIHZvaWQgX1NfYWRkX2xlYWZfdG9fZm9yZXN0KF9Sb3BlUmVwKiBfX3IsIF9Sb3BlUmVwKiogX19mb3Jlc3QpOwotCi0jaWZkZWYgX1NUTFBfREVCVUcKLSAgLy8gUHJpbnQgdG8gc3Rkb3V0LCBleHBvc2luZyBzdHJ1Y3R1cmUKLSAgc3RhdGljIHZvaWQgX1NfZHVtcChfUm9wZVJlcCogX19yLCBpbnQgX19pbmRlbnQgPSAwKTsKLSNlbmRpZgotCi0gIC8vIFJldHVybiAtMSwgMCwgb3IgMSBpZiBfX3ggPCBfX3ksIF9feCA9PSBfX3ksIG9yIF9feCA+IF9feSByZXNwLgotICBzdGF0aWMgaW50IF9TX2NvbXBhcmUoY29uc3QgX1JvcGVSZXAqIF9feCwgY29uc3QgX1JvcGVSZXAqIF9feSk7Ci0KLSAgdm9pZCBfU1RMUF9GVU5DVElPTl9USFJPV1MgX01fdGhyb3dfb3V0X29mX3JhbmdlKCkgY29uc3Q7Ci0KLSAgdm9pZCBfTV9yZXNldChfUm9wZVJlcCogX19yKSB7Ci0gICAgLy9pZiAoX19yICE9IF9NX3RyZWVfcHRyLl9NX2RhdGEpIHsKLSAgICAgIF9TX3VucmVmKF9NX3RyZWVfcHRyLl9NX2RhdGEpOwotICAgICAgX01fdHJlZV9wdHIuX01fZGF0YSA9IF9fcjsKLSAgICAvL30KLSAgfQotCi1wdWJsaWM6Ci0gIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiAwID09IF9NX3RyZWVfcHRyLl9NX2RhdGE7IH0KLQotICAvLyBDb21wYXJpc29uIG1lbWJlciBmdW5jdGlvbi4gIFRoaXMgaXMgcHVibGljIG9ubHkgZm9yIHRob3NlCi0gIC8vIGNsaWVudHMgdGhhdCBuZWVkIGEgdGVybmFyeSBjb21wYXJpc29uLiAgT3RoZXJzCi0gIC8vIHNob3VsZCB1c2UgdGhlIGNvbXBhcmlzb24gb3BlcmF0b3JzIGJlbG93LgotICBpbnQgY29tcGFyZShjb25zdCBfU2VsZiYgX195KSBjb25zdCB7Ci0gICAgcmV0dXJuIF9TX2NvbXBhcmUoX01fdHJlZV9wdHIuX01fZGF0YSwgX195Ll9NX3RyZWVfcHRyLl9NX2RhdGEpOwotICB9Ci0KLSAgcm9wZShjb25zdCBfQ2hhclQqIF9fcywgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCi0gICAgOiBfTV90cmVlX3B0cihfX2EsIF9TX1JvcGVMZWFmX2Zyb21fdW5vd25lZF9jaGFyX3B0cihfX3MsIF9TX2NoYXJfcHRyX2xlbihfX3MpLF9fYSkpCi0gIHt9Ci0KLSAgcm9wZShjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90IF9fbGVuLAotICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQotICAgIDogX01fdHJlZV9wdHIoX19hLCAoX1NfUm9wZUxlYWZfZnJvbV91bm93bmVkX2NoYXJfcHRyKF9fcywgX19sZW4sIF9fYSkpKQotICB7fQotCi0gIC8vIFNob3VsZCBwZXJoYXBzIGJlIHRlbXBsYXRpemVkIHdpdGggcmVzcGVjdCB0byB0aGUgaXRlcmF0b3IgdHlwZQotICAvLyBhbmQgdXNlIFNlcXVlbmNlX2J1ZmZlci4gIChJdCBzaG91bGQgcGVyaGFwcyB1c2Ugc2VxdWVuY2VfYnVmZmVyCi0gIC8vIGV2ZW4gbm93LikKLSAgcm9wZShjb25zdCBfQ2hhclQgKl9fcywgY29uc3QgX0NoYXJUICpfX2UsCi0gICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCi0gICAgOiBfTV90cmVlX3B0cihfX2EsIF9TX1JvcGVMZWFmX2Zyb21fdW5vd25lZF9jaGFyX3B0cihfX3MsIF9fZSAtIF9fcywgX19hKSkKLSAge30KLQotICByb3BlKGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiBfX3MsIGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiBfX2UsCi0gICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCi0gICAgOiBfTV90cmVlX3B0cihfX2EsIF9TX3N1YnN0cmluZyhfX3MuX01fcm9vdCwgX19zLl9NX2N1cnJlbnRfcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19lLl9NX2N1cnJlbnRfcG9zKSkKLSAge30KLQotICByb3BlKGNvbnN0IGl0ZXJhdG9yJiBfX3MsIGNvbnN0IGl0ZXJhdG9yJiBfX2UsCi0gICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCi0gICAgOiBfTV90cmVlX3B0cihfX2EsIF9TX3N1YnN0cmluZyhfX3MuX01fcm9vdCwgX19zLl9NX2N1cnJlbnRfcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19lLl9NX2N1cnJlbnRfcG9zKSkKLSAge30KLQotICByb3BlKF9DaGFyVCBfX2MsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQotICAgIDogX01fdHJlZV9wdHIoX19hLCAoX1JvcGVSZXAqKTApIHsKLSAgICBfQ2hhclQqIF9fYnVmID0gX01fdHJlZV9wdHIuYWxsb2NhdGUoX1Nfcm91bmRlZF91cF9zaXplKDEpKTsKLQotICAgIF9Db3B5X0NvbnN0cnVjdChfX2J1ZiwgX19jKTsKLSAgICBfU19jb25zdHJ1Y3RfbnVsbChfX2J1ZiArIDEpOwotCi0gICAgX1NUTFBfVFJZIHsKLSAgICAgIF9NX3RyZWVfcHRyLl9NX2RhdGEgPSBfU19uZXdfUm9wZUxlYWYoX19idWYsIDEsIF9fYSk7Ci0gICAgfQotICAgIF9TVExQX1VOV0lORChfUm9wZVJlcDo6X1NfZnJlZV9zdHJpbmcoX19idWYsIDEsIF9fYSkpCi0gIH0KLQotICByb3BlKHNpemVfdCBfX24sIF9DaGFyVCBfX2MsCi0gICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpOgotICAgIF9NX3RyZWVfcHRyKF9fYSwgKF9Sb3BlUmVwKikwKSB7Ci0gICAgaWYgKDAgPT0gX19uKQotICAgICAgcmV0dXJuOwotCi0gICAgcm9wZTxfQ2hhclQsX0FsbG9jPiBfX3Jlc3VsdDsKLSMgZGVmaW5lICBfX2V4cG9uZW50aWF0ZV90aHJlc2hvbGQgc2l6ZV90KDMyKQotICAgIF9Sb3BlUmVwKiBfX3JlbWFpbmRlcjsKLSAgICByb3BlPF9DaGFyVCxfQWxsb2M+IF9fcmVtYWluZGVyX3JvcGU7Ci0KLSAgICAvLyBnY2MtMi43LjIgYnVncwotICAgIHR5cGVkZWYgX1NUTFBfUFJJViBfUm9wZV9Db25jYXRfZm48X0NoYXJULF9BbGxvYz4gX0NvbmNhdF9mbjsKLQotICAgIHNpemVfdCBfX2V4cG9uZW50ID0gX19uIC8gX19leHBvbmVudGlhdGVfdGhyZXNob2xkOwotICAgIHNpemVfdCBfX3Jlc3QgPSBfX24gJSBfX2V4cG9uZW50aWF0ZV90aHJlc2hvbGQ7Ci0gICAgaWYgKDAgPT0gX19yZXN0KSB7Ci0gICAgICBfX3JlbWFpbmRlciA9IDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgIF9DaGFyVCogX19yZXN0X2J1ZmZlciA9IF9NX3RyZWVfcHRyLmFsbG9jYXRlKF9TX3JvdW5kZWRfdXBfc2l6ZShfX3Jlc3QpKTsKLSAgICAgIHVuaW5pdGlhbGl6ZWRfZmlsbF9uKF9fcmVzdF9idWZmZXIsIF9fcmVzdCwgX19jKTsKLSAgICAgIF9TX2NvbnN0cnVjdF9udWxsKF9fcmVzdF9idWZmZXIgKyBfX3Jlc3QpOwotICAgICAgX1NUTFBfVFJZIHsKLSAgICAgICAgX19yZW1haW5kZXIgPSBfU19uZXdfUm9wZUxlYWYoX19yZXN0X2J1ZmZlciwgX19yZXN0LCBfX2EpOwotICAgICAgfQotICAgICAgX1NUTFBfVU5XSU5EKF9Sb3BlUmVwOjpfU19mcmVlX3N0cmluZyhfX3Jlc3RfYnVmZmVyLCBfX3Jlc3QsIF9fYSkpCi0gICAgfQotICAgIF9fcmVtYWluZGVyX3JvcGUuX01fdHJlZV9wdHIuX01fZGF0YSA9IF9fcmVtYWluZGVyOwotICAgIGlmIChfX2V4cG9uZW50ICE9IDApIHsKLSAgICAgIF9DaGFyVCogX19iYXNlX2J1ZmZlciA9IF9NX3RyZWVfcHRyLmFsbG9jYXRlKF9TX3JvdW5kZWRfdXBfc2l6ZShfX2V4cG9uZW50aWF0ZV90aHJlc2hvbGQpKTsKLSAgICAgIF9Sb3BlTGVhZiogX19iYXNlX2xlYWY7Ci0gICAgICByb3BlPF9DaGFyVCxfQWxsb2M+IF9fYmFzZV9yb3BlOwotICAgICAgdW5pbml0aWFsaXplZF9maWxsX24oX19iYXNlX2J1ZmZlciwgX19leHBvbmVudGlhdGVfdGhyZXNob2xkLCBfX2MpOwotICAgICAgX1NfY29uc3RydWN0X251bGwoX19iYXNlX2J1ZmZlciArIF9fZXhwb25lbnRpYXRlX3RocmVzaG9sZCk7Ci0gICAgICBfU1RMUF9UUlkgewotICAgICAgICBfX2Jhc2VfbGVhZiA9IF9TX25ld19Sb3BlTGVhZihfX2Jhc2VfYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2V4cG9uZW50aWF0ZV90aHJlc2hvbGQsIF9fYSk7Ci0gICAgICB9Ci0gICAgICBfU1RMUF9VTldJTkQoX1JvcGVSZXA6Ol9TX2ZyZWVfc3RyaW5nKF9fYmFzZV9idWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZXhwb25lbnRpYXRlX3RocmVzaG9sZCwgX19hKSkKLSAgICAgIF9fYmFzZV9yb3BlLl9NX3RyZWVfcHRyLl9NX2RhdGEgPSBfX2Jhc2VfbGVhZjsKLSAgICAgIGlmICgxID09IF9fZXhwb25lbnQpIHsKLSAgICAgICAgX19yZXN1bHQgPSBfX2Jhc2Vfcm9wZTsKLSAgICAgICAgLy8gT25lIGVhY2ggZm9yIGJhc2Vfcm9wZSBhbmQgX19yZXN1bHQKLSAgICAgICAgLy9fU1RMUF9BU1NFUlQoMiA9PSBfX3Jlc3VsdC5fTV90cmVlX3B0ci5fTV9kYXRhLT5fTV9yZWZfY291bnQpCi0gICAgICB9IGVsc2UgewotICAgICAgICBfX3Jlc3VsdCA9IF9TVExQX1BSSVYgX19wb3dlcihfX2Jhc2Vfcm9wZSwgX19leHBvbmVudCwgX0NvbmNhdF9mbigpKTsKLSAgICAgIH0KLSAgICAgIGlmICgwICE9IF9fcmVtYWluZGVyKSB7Ci0gICAgICAgIF9fcmVzdWx0ICs9IF9fcmVtYWluZGVyX3JvcGU7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIF9fcmVzdWx0ID0gX19yZW1haW5kZXJfcm9wZTsKLSAgICB9Ci0gICAgX01fdHJlZV9wdHIuX01fZGF0YSA9IF9fcmVzdWx0Ll9NX3RyZWVfcHRyLl9NX2RhdGE7Ci0gICAgX01fdHJlZV9wdHIuX01fZGF0YS0+X01fcmVmX25vbm5pbCgpOwotIyB1bmRlZiBfX2V4cG9uZW50aWF0ZV90aHJlc2hvbGQKLSAgfQotCi0gIHJvcGUoY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCi0gICAgOiBfTV90cmVlX3B0cihfX2EsIChfUm9wZVJlcCopMCkge30KLQotICAvLyBDb25zdHJ1Y3QgYSByb3BlIGZyb20gYSBmdW5jdGlvbiB0aGF0IGNhbiBjb21wdXRlIGl0cyBtZW1iZXJzCi0gIHJvcGUoY2hhcl9wcm9kdWNlcjxfQ2hhclQ+ICpfX2ZuLCBzaXplX3QgX19sZW4sIGJvb2wgX19kZWxldGVfZm4sCi0gICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCi0gICAgOiBfTV90cmVlX3B0cihfX2EsIChfUm9wZVJlcCopMCkgewotICAgIF9NX3RyZWVfcHRyLl9NX2RhdGEgPSAoMCA9PSBfX2xlbikgPwotICAgICAgMCA6IF9TX25ld19Sb3BlRnVuY3Rpb24oX19mbiwgX19sZW4sIF9fZGVsZXRlX2ZuLCBfX2EpOwotICB9Ci0KLSAgcm9wZShjb25zdCBfU2VsZiYgX194KQotICAgIDogX01fdHJlZV9wdHIoX194Ll9NX3RyZWVfcHRyLCBfX3guX01fdHJlZV9wdHIuX01fZGF0YSkgewotICAgIF9TX3JlZihfTV90cmVlX3B0ci5fTV9kYXRhKTsKLSAgfQotCi0gIHJvcGUoX19tb3ZlX3NvdXJjZTxfU2VsZj4gX19zcmMpCi0gICAgOiBfTV90cmVlX3B0cihfX3NyYy5nZXQoKS5fTV90cmVlX3B0ciwgX19zcmMuZ2V0KCkuX01fdHJlZV9wdHIuX01fZGF0YSkgewotICAgIF9fc3JjLmdldCgpLl9NX3RyZWVfcHRyLl9NX2RhdGEgPSAwOwotICB9Ci0KLSAgfnJvcGUoKSB7Ci0gICAgX1NfdW5yZWYoX01fdHJlZV9wdHIuX01fZGF0YSk7Ci0gIH0KLQotICBfU2VsZiYgb3BlcmF0b3I9KGNvbnN0IF9TZWxmJiBfX3gpIHsKLSAgICBfU1RMUF9BU1NFUlQoZ2V0X2FsbG9jYXRvcigpID09IF9feC5nZXRfYWxsb2NhdG9yKCkpCi0gICAgX1NfcmVmKF9feC5fTV90cmVlX3B0ci5fTV9kYXRhKTsKLSAgICBfTV9yZXNldChfX3guX01fdHJlZV9wdHIuX01fZGF0YSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgdm9pZCBjbGVhcigpIHsKLSAgICBfU191bnJlZihfTV90cmVlX3B0ci5fTV9kYXRhKTsKLSAgICBfTV90cmVlX3B0ci5fTV9kYXRhID0gMDsKLSAgfQotICB2b2lkIHB1c2hfYmFjayhfQ2hhclQgX194KSB7Ci0gICAgX01fcmVzZXQoX1NfZGVzdHJfY29uY2F0X2NoYXJfaXRlcihfTV90cmVlX3B0ci5fTV9kYXRhLCAmX194LCAxKSk7Ci0gIH0KLQotICB2b2lkIHBvcF9iYWNrKCkgewotICAgIF9Sb3BlUmVwKiBfX29sZCA9IF9NX3RyZWVfcHRyLl9NX2RhdGE7Ci0gICAgX01fdHJlZV9wdHIuX01fZGF0YSA9Ci0gICAgICBfU19zdWJzdHJpbmcoX01fdHJlZV9wdHIuX01fZGF0YSwgMCwgX01fdHJlZV9wdHIuX01fZGF0YS0+X01fc2l6ZS5fTV9kYXRhIC0gMSk7Ci0gICAgX1NfdW5yZWYoX19vbGQpOwotICB9Ci0KLSAgX0NoYXJUIGJhY2soKSBjb25zdCB7Ci0gICAgcmV0dXJuIF9TX2ZldGNoKF9NX3RyZWVfcHRyLl9NX2RhdGEsIF9NX3RyZWVfcHRyLl9NX2RhdGEtPl9NX3NpemUuX01fZGF0YSAtIDEpOwotICB9Ci0KLSAgdm9pZCBwdXNoX2Zyb250KF9DaGFyVCBfX3gpIHsKLSAgICBfUm9wZVJlcCogX19vbGQgPSBfTV90cmVlX3B0ci5fTV9kYXRhOwotICAgIF9Sb3BlUmVwKiBfX2xlZnQgPQotICAgICAgX1NfUm9wZUxlYWZfZnJvbV91bm93bmVkX2NoYXJfcHRyKCZfX3gsIDEsIF9NX3RyZWVfcHRyKTsKLSAgICBfU1RMUF9UUlkgewotICAgICAgX01fdHJlZV9wdHIuX01fZGF0YSA9IF9TX2NvbmNhdF9yZXAoX19sZWZ0LCBfTV90cmVlX3B0ci5fTV9kYXRhKTsKLSAgICAgIF9TX3VucmVmKF9fb2xkKTsKLSAgICAgIF9TX3VucmVmKF9fbGVmdCk7Ci0gICAgfQotICAgIF9TVExQX1VOV0lORChfU191bnJlZihfX2xlZnQpKQotICB9Ci0KLSAgdm9pZCBwb3BfZnJvbnQoKSB7Ci0gICAgX1JvcGVSZXAqIF9fb2xkID0gX01fdHJlZV9wdHIuX01fZGF0YTsKLSAgICBfTV90cmVlX3B0ci5fTV9kYXRhID0gX1Nfc3Vic3RyaW5nKF9NX3RyZWVfcHRyLl9NX2RhdGEsIDEsIF9NX3RyZWVfcHRyLl9NX2RhdGEtPl9NX3NpemUuX01fZGF0YSk7Ci0gICAgX1NfdW5yZWYoX19vbGQpOwotICB9Ci0KLSAgX0NoYXJUIGZyb250KCkgY29uc3QgewotICAgIHJldHVybiBfU19mZXRjaChfTV90cmVlX3B0ci5fTV9kYXRhLCAwKTsKLSAgfQotCi0gIHZvaWQgYmFsYW5jZSgpIHsKLSAgICBfUm9wZVJlcCogX19vbGQgPSBfTV90cmVlX3B0ci5fTV9kYXRhOwotICAgIF9NX3RyZWVfcHRyLl9NX2RhdGEgPSBfU19iYWxhbmNlKF9NX3RyZWVfcHRyLl9NX2RhdGEpOwotICAgIF9TX3VucmVmKF9fb2xkKTsKLSAgfQotCi0gIHZvaWQgY29weShfQ2hhclQqIF9fYnVmZmVyKSBjb25zdCB7Ci0gICAgX1NUTFBfU1REOjpfRGVzdHJveV9SYW5nZShfX2J1ZmZlciwgX19idWZmZXIgKyBzaXplKCkpOwotICAgIF9TX2ZsYXR0ZW4oX01fdHJlZV9wdHIuX01fZGF0YSwgX19idWZmZXIpOwotICB9Ci0KLSAgLyoKLSAgICogVGhpcyBpcyB0aGUgY29weSBmdW5jdGlvbiBmcm9tIHRoZSBzdGFuZGFyZCwgYnV0Ci0gICAqIHdpdGggdGhlIGFyZ3VtZW50cyByZW9yZGVyZWQgdG8gbWFrZSBpdCBjb25zaXN0ZW50IHdpdGggdGhlCi0gICAqIHJlc3Qgb2YgdGhlIGludGVyZmFjZS4KLSAgICogTm90ZSB0aGF0IHRoaXMgZ3VhcmFudGVlZCBub3QgdG8gY29tcGlsZSBpZiB0aGUgZHJhZnQgc3RhbmRhcmQKLSAgICogb3JkZXIgaXMgYXNzdW1lZC4KLSAgICovCi0gIHNpemVfdHlwZSBjb3B5KHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbiwgX0NoYXJUKiBfX2J1ZmZlcikgY29uc3QgewotICAgIHNpemVfdCBfcF9zaXplID0gc2l6ZSgpOwotICAgIHNpemVfdCBfX2xlbiA9IChfX3BvcyArIF9fbiA+IF9wX3NpemU/IF9wX3NpemUgLSBfX3BvcyA6IF9fbik7Ci0KLSAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95X1JhbmdlKF9fYnVmZmVyLCBfX2J1ZmZlciArIF9fbGVuKTsKLSAgICBfU19mbGF0dGVuKF9NX3RyZWVfcHRyLl9NX2RhdGEsIF9fcG9zLCBfX2xlbiwgX19idWZmZXIpOwotICAgIHJldHVybiBfX2xlbjsKLSAgfQotCi0jIGlmZGVmIF9TVExQX0RFQlVHCi0gIC8vIFByaW50IHRvIHN0ZG91dCwgZXhwb3Npbmcgc3RydWN0dXJlLiAgTWF5IGJlIHVzZWZ1bCBmb3IKLSAgLy8gcGVyZm9ybWFuY2UgZGVidWdnaW5nLgotICB2b2lkIGR1bXAoKSB7Ci0gICAgX1NfZHVtcChfTV90cmVlX3B0ci5fTV9kYXRhKTsKLSAgfQotIyBlbmRpZgotCi0gIC8vIENvbnZlcnQgdG8gMCB0ZXJtaW5hdGVkIHN0cmluZyBpbiBuZXcgYWxsb2NhdGVkIG1lbW9yeS4KLSAgLy8gRW1iZWRkZWQgMHMgaW4gdGhlIGlucHV0IGRvIG5vdCB0ZXJtaW5hdGUgdGhlIGNvcHkuCi0gIGNvbnN0IF9DaGFyVCogY19zdHIoKSBjb25zdDsKLQotICAvLyBBcyBhYm92ZSwgYnV0IGFsc28gdXNlIHRoZSBmbGF0dGVuZWQgcmVwcmVzZW50YXRpb24gYXMgdGhlCi0gIC8vIHRoZSBuZXcgcm9wZSByZXByZXNlbnRhdGlvbi4KLSAgY29uc3QgX0NoYXJUKiByZXBsYWNlX3dpdGhfY19zdHIoKTsKLQotICAvLyBSZWNsYWltIG1lbW9yeSBmb3IgdGhlIGNfc3RyIGdlbmVyYXRlZCBmbGF0dGVuZWQgc3RyaW5nLgotICAvLyBJbnRlbnRpb25hbGx5IHVuZG9jdW1lbnRlZCwgc2luY2UgaXQncyBoYXJkIHRvIHNheSB3aGVuIHRoaXMKLSAgLy8gaXMgc2FmZSBmb3IgbXVsdGlwbGUgdGhyZWFkcy4KLSAgdm9pZCBkZWxldGVfY19zdHIgKCkgewotICAgIGlmICgwID09IF9NX3RyZWVfcHRyLl9NX2RhdGEpIHJldHVybjsKLSAgICBpZiAoX1JvcGVSZXA6Ol9TX2xlYWYgPT0gX01fdHJlZV9wdHIuX01fZGF0YS0+X01fdGFnICYmCi0gICAgICAgICgoX1JvcGVMZWFmKilfTV90cmVlX3B0ci5fTV9kYXRhKS0+X01fZGF0YSA9PQotICAgICAgICBfTV90cmVlX3B0ci5fTV9kYXRhLT5fTV9jX3N0cmluZykgewotICAgICAgLy8gUmVwcmVzZW50YXRpb24gc2hhcmVkCi0gICAgICByZXR1cm47Ci0gICAgfQotICAgIF9NX3RyZWVfcHRyLl9NX2RhdGEtPl9NX2ZyZWVfY19zdHJpbmcoKTsKLSAgICBfTV90cmVlX3B0ci5fTV9kYXRhLT5fTV9jX3N0cmluZyA9IDA7Ci0gIH0KLQotICBfQ2hhclQgb3BlcmF0b3JbXSAoc2l6ZV90eXBlIF9fcG9zKSBjb25zdCB7Ci0gICAgcmV0dXJuIF9TX2ZldGNoKF9NX3RyZWVfcHRyLl9NX2RhdGEsIF9fcG9zKTsKLSAgfQotCi0gIF9DaGFyVCBhdChzaXplX3R5cGUgX19wb3MpIGNvbnN0IHsKLSAgICBpZiAoX19wb3MgPj0gc2l6ZSgpKSBfTV90aHJvd19vdXRfb2ZfcmFuZ2UoKTsKLSAgICByZXR1cm4gKCp0aGlzKVtfX3Bvc107Ci0gIH0KLQotICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsKLSAgICByZXR1cm4oY29uc3RfaXRlcmF0b3IoX01fdHJlZV9wdHIuX01fZGF0YSwgMCkpOwotICB9Ci0KLSAgLy8gQW4gZWFzeSB3YXkgdG8gZ2V0IGEgY29uc3QgaXRlcmF0b3IgZnJvbSBhIG5vbi1jb25zdCBjb250YWluZXIuCi0gIGNvbnN0X2l0ZXJhdG9yIGNvbnN0X2JlZ2luKCkgY29uc3QgewotICAgIHJldHVybihjb25zdF9pdGVyYXRvcihfTV90cmVlX3B0ci5fTV9kYXRhLCAwKSk7Ci0gIH0KLQotICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7Ci0gICAgcmV0dXJuKGNvbnN0X2l0ZXJhdG9yKF9NX3RyZWVfcHRyLl9NX2RhdGEsIHNpemUoKSkpOwotICB9Ci0KLSAgY29uc3RfaXRlcmF0b3IgY29uc3RfZW5kKCkgY29uc3QgewotICAgIHJldHVybihjb25zdF9pdGVyYXRvcihfTV90cmVlX3B0ci5fTV9kYXRhLCBzaXplKCkpKTsKLSAgfQotCi0gIHNpemVfdHlwZSBzaXplKCkgY29uc3QgewotICAgIHJldHVybigwID09IF9NX3RyZWVfcHRyLl9NX2RhdGE/IDAgOiBfTV90cmVlX3B0ci5fTV9kYXRhLT5fTV9zaXplLl9NX2RhdGEpOwotICB9Ci0KLSAgc2l6ZV90eXBlIGxlbmd0aCgpIGNvbnN0IHsKLSAgICByZXR1cm4gc2l6ZSgpOwotICB9Ci0KLSAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgewotICAgIHJldHVybiBfU19taW5fbGVuW19fUk9QRV9NQVhfREVQVEgtMV0gLSAxOwotICAgIC8vICBHdWFyYW50ZWVzIHRoYXQgdGhlIHJlc3VsdCBjYW4gYmUgc3VmZmljaWVudGx5Ci0gICAgLy8gIGJhbGFuY2VkLiAgTG9uZ2VyIHJvcGVzIHdpbGwgcHJvYmFibHkgc3RpbGwgd29yaywKLSAgICAvLyAgYnV0IGl0J3MgaGFyZGVyIHRvIG1ha2UgZ3VhcmFudGVlcy4KLSAgfQotCi0gIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3QgewotICAgIHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsKLSAgfQotCi0gIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgY29uc3RfcmJlZ2luKCkgY29uc3QgewotICAgIHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsKLSAgfQotCi0gIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsKLSAgfQotCi0gIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgY29uc3RfcmVuZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsKLSAgfQotICAvLyBUaGUgc3ltbWV0cmljIGNhc2VzIGFyZSBpbnRlbnRpb25hbGx5IG9taXR0ZWQsIHNpbmNlIHRoZXkncmUgcHJlc3VtZWQKLSAgLy8gdG8gYmUgbGVzcyBjb21tb24sIGFuZCB3ZSBkb24ndCBoYW5kbGUgdGhlbSBhcyB3ZWxsLgotCi0gIC8vIFRoZSBmb2xsb3dpbmcgc2hvdWxkIHJlYWxseSBiZSB0ZW1wbGF0aXplZC4KLSAgLy8gVGhlIGZpcnN0IGFyZ3VtZW50IHNob3VsZCBiZSBhbiBpbnB1dCBpdGVyYXRvciBvcgotICAvLyBmb3J3YXJkIGl0ZXJhdG9yIHdpdGggdmFsdWVfdHlwZSBfQ2hhclQuCi0gIF9TZWxmJiBhcHBlbmQoY29uc3QgX0NoYXJUKiBfX2l0ZXIsIHNpemVfdCBfX24pIHsKLSAgICBfTV9yZXNldChfU19kZXN0cl9jb25jYXRfY2hhcl9pdGVyKF9NX3RyZWVfcHRyLl9NX2RhdGEsIF9faXRlciwgX19uKSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgX1NlbGYmIGFwcGVuZChjb25zdCBfQ2hhclQqIF9fY19zdHJpbmcpIHsKLSAgICBzaXplX3QgX19sZW4gPSBfU19jaGFyX3B0cl9sZW4oX19jX3N0cmluZyk7Ci0gICAgYXBwZW5kKF9fY19zdHJpbmcsIF9fbGVuKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBfU2VsZiYgYXBwZW5kKGNvbnN0IF9DaGFyVCogX19zLCBjb25zdCBfQ2hhclQqIF9fZSkgewotICAgIF9NX3Jlc2V0KF9TX2Rlc3RyX2NvbmNhdF9jaGFyX2l0ZXIoX01fdHJlZV9wdHIuX01fZGF0YSwgX19zLCBfX2UgLSBfX3MpKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBfU2VsZiYgYXBwZW5kKGNvbnN0X2l0ZXJhdG9yIF9fcywgY29uc3RfaXRlcmF0b3IgX19lKSB7Ci0gICAgX1NUTFBfQVNTRVJUKF9fcy5fTV9yb290ID09IF9fZS5fTV9yb290KQotICAgIF9TVExQX0FTU0VSVChnZXRfYWxsb2NhdG9yKCkgPT0gX19zLl9NX3Jvb3QtPmdldF9hbGxvY2F0b3IoKSkKLSAgICBfU2VsZl9kZXN0cnVjdF9wdHIgX19hcHBlbmRlZShfU19zdWJzdHJpbmcoX19zLl9NX3Jvb3QsIF9fcy5fTV9jdXJyZW50X3BvcywgX19lLl9NX2N1cnJlbnRfcG9zKSk7Ci0gICAgX01fcmVzZXQoX1NfY29uY2F0X3JlcChfTV90cmVlX3B0ci5fTV9kYXRhLCAoX1JvcGVSZXAqKV9fYXBwZW5kZWUpKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBfU2VsZiYgYXBwZW5kKF9DaGFyVCBfX2MpIHsKLSAgICBfTV9yZXNldChfU19kZXN0cl9jb25jYXRfY2hhcl9pdGVyKF9NX3RyZWVfcHRyLl9NX2RhdGEsICZfX2MsIDEpKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBfU2VsZiYgYXBwZW5kKCkgeyByZXR1cm4gYXBwZW5kKF9DaGFyVCgpKTsgfSAgLy8gWFhYIHdoeT8KLQotICBfU2VsZiYgYXBwZW5kKGNvbnN0IF9TZWxmJiBfX3kpIHsKLSAgICBfU1RMUF9BU1NFUlQoX195LmdldF9hbGxvY2F0b3IoKSA9PSBnZXRfYWxsb2NhdG9yKCkpCi0gICAgX01fcmVzZXQoX1NfY29uY2F0X3JlcChfTV90cmVlX3B0ci5fTV9kYXRhLCBfX3kuX01fdHJlZV9wdHIuX01fZGF0YSkpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIF9TZWxmJiBhcHBlbmQoc2l6ZV90IF9fbiwgX0NoYXJUIF9fYykgewotICAgIHJvcGU8X0NoYXJULF9BbGxvYz4gX19sYXN0KF9fbiwgX19jKTsKLSAgICByZXR1cm4gYXBwZW5kKF9fbGFzdCk7Ci0gIH0KLQotICB2b2lkIHN3YXAoX1NlbGYmIF9fYikgewotICAgIF9NX3RyZWVfcHRyLnN3YXAoX19iLl9NX3RyZWVfcHRyKTsKLSAgfQotCi1wcm90ZWN0ZWQ6Ci0gIC8vIFJlc3VsdCBpcyBpbmNsdWRlZCBpbiByZWZjb3VudC4KLSAgc3RhdGljIF9Sb3BlUmVwKiByZXBsYWNlKF9Sb3BlUmVwKiBfX29sZCwgc2l6ZV90IF9fcG9zMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBfX3BvczIsIF9Sb3BlUmVwKiBfX3IpIHsKLSAgICBpZiAoMCA9PSBfX29sZCkgeyBfU19yZWYoX19yKTsgcmV0dXJuIF9fcjsgfQotICAgIF9TZWxmX2Rlc3RydWN0X3B0ciBfX2xlZnQoX1Nfc3Vic3RyaW5nKF9fb2xkLCAwLCBfX3BvczEpKTsKLSAgICBfU2VsZl9kZXN0cnVjdF9wdHIgX19yaWdodChfU19zdWJzdHJpbmcoX19vbGQsIF9fcG9zMiwgX19vbGQtPl9NX3NpemUuX01fZGF0YSkpOwotICAgIF9TVExQX01QV0ZJWF9UUlkgIC8vKlRZIDA2LzAxLzIwMDAgLQotICAgIF9Sb3BlUmVwKiBfX3Jlc3VsdDsKLQotICAgIGlmICgwID09IF9fcikgewotICAgICAgX19yZXN1bHQgPSBfU19jb25jYXRfcmVwKF9fbGVmdCwgX19yaWdodCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIF9TVExQX0FTU0VSVChfX29sZC0+Z2V0X2FsbG9jYXRvcigpID09IF9fci0+Z2V0X2FsbG9jYXRvcigpKQotICAgICAgX1NlbGZfZGVzdHJ1Y3RfcHRyIF9fbGVmdF9yZXN1bHQoX1NfY29uY2F0X3JlcChfX2xlZnQsIF9fcikpOwotICAgICAgX19yZXN1bHQgPSBfU19jb25jYXRfcmVwKF9fbGVmdF9yZXN1bHQsIF9fcmlnaHQpOwotICAgIH0KLSAgICByZXR1cm4gX19yZXN1bHQ7Ci0gICAgX1NUTFBfTVBXRklYX0NBVENIICAvLypUWSAwNi8wMS8yMDAwIC0KLSAgfQotCi1wdWJsaWM6Ci0gIHZvaWQgaW5zZXJ0KHNpemVfdCBfX3AsIGNvbnN0IF9TZWxmJiBfX3IpIHsKLSAgICBpZiAoX19wID4gc2l6ZSgpKSBfTV90aHJvd19vdXRfb2ZfcmFuZ2UoKTsKLSAgICBfU1RMUF9BU1NFUlQoZ2V0X2FsbG9jYXRvcigpID09IF9fci5nZXRfYWxsb2NhdG9yKCkpCi0gICAgX01fcmVzZXQocmVwbGFjZShfTV90cmVlX3B0ci5fTV9kYXRhLCBfX3AsIF9fcCwgX19yLl9NX3RyZWVfcHRyLl9NX2RhdGEpKTsKLSAgfQotCi0gIHZvaWQgaW5zZXJ0KHNpemVfdCBfX3AsIHNpemVfdCBfX24sIF9DaGFyVCBfX2MpIHsKLSAgICByb3BlPF9DaGFyVCxfQWxsb2M+IF9fcihfX24sX19jKTsKLSAgICBpbnNlcnQoX19wLCBfX3IpOwotICB9Ci0KLSAgdm9pZCBpbnNlcnQoc2l6ZV90IF9fcCwgY29uc3QgX0NoYXJUKiBfX2ksIHNpemVfdCBfX24pIHsKLSAgICBpZiAoX19wID4gc2l6ZSgpKSBfTV90aHJvd19vdXRfb2ZfcmFuZ2UoKTsKLSAgICBfU2VsZl9kZXN0cnVjdF9wdHIgX19sZWZ0KF9TX3N1YnN0cmluZyhfTV90cmVlX3B0ci5fTV9kYXRhLCAwLCBfX3ApKTsKLSAgICBfU2VsZl9kZXN0cnVjdF9wdHIgX19yaWdodChfU19zdWJzdHJpbmcoX01fdHJlZV9wdHIuX01fZGF0YSwgX19wLCBzaXplKCkpKTsKLSAgICBfU2VsZl9kZXN0cnVjdF9wdHIgX19sZWZ0X3Jlc3VsdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU19jb25jYXRfY2hhcl9pdGVyKF9fbGVmdCwgX19pLCBfX24pKTsKLSAgICAvLyBfU18gZGVzdHJfY29uY2F0X2NoYXJfaXRlciBzaG91bGQgYmUgc2FmZSBoZXJlLgotICAgIC8vIEJ1dCBhcyBpdCBzdGFuZHMgaXQncyBwcm9iYWJseSBub3QgYSB3aW4sIHNpbmNlIF9fbGVmdAotICAgIC8vIGlzIGxpa2VseSB0byBoYXZlIGFkZGl0aW9uYWwgcmVmZXJlbmNlcy4KLSAgICBfTV9yZXNldChfU19jb25jYXRfcmVwKF9fbGVmdF9yZXN1bHQsIF9fcmlnaHQpKTsKLSAgfQotCi0gIHZvaWQgaW5zZXJ0KHNpemVfdCBfX3AsIGNvbnN0IF9DaGFyVCogX19jX3N0cmluZykgewotICAgIGluc2VydChfX3AsIF9fY19zdHJpbmcsIF9TX2NoYXJfcHRyX2xlbihfX2Nfc3RyaW5nKSk7Ci0gIH0KLQotICB2b2lkIGluc2VydChzaXplX3QgX19wLCBfQ2hhclQgX19jKSB7Ci0gICAgaW5zZXJ0KF9fcCwgJl9fYywgMSk7Ci0gIH0KLQotICB2b2lkIGluc2VydChzaXplX3QgX19wKSB7Ci0gICAgX0NoYXJUIF9fYyA9IF9DaGFyVCgpOwotICAgIGluc2VydChfX3AsICZfX2MsIDEpOwotICB9Ci0KLSAgdm9pZCBpbnNlcnQoc2l6ZV90IF9fcCwgY29uc3QgX0NoYXJUKiBfX2ksIGNvbnN0IF9DaGFyVCogX19qKSB7Ci0gICAgX1NlbGYgX19yKF9faSwgX19qKTsKLSAgICBpbnNlcnQoX19wLCBfX3IpOwotICB9Ci0KLSAgdm9pZCBpbnNlcnQoc2l6ZV90IF9fcCwgY29uc3QgY29uc3RfaXRlcmF0b3ImIF9faSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29uc3RfaXRlcmF0b3ImIF9faikgewotICAgIF9TZWxmIF9fcihfX2ksIF9faik7Ci0gICAgaW5zZXJ0KF9fcCwgX19yKTsKLSAgfQotCi0gIHZvaWQgaW5zZXJ0KHNpemVfdCBfX3AsIGNvbnN0IGl0ZXJhdG9yJiBfX2ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZXJhdG9yJiBfX2opIHsKLSAgICBfU2VsZiBfX3IoX19pLCBfX2opOwotICAgIGluc2VydChfX3AsIF9fcik7Ci0gIH0KLQotICAvLyAocG9zaXRpb24sIGxlbmd0aCkgdmVyc2lvbnMgb2YgcmVwbGFjZSBvcGVyYXRpb25zOgotICB2b2lkIHJlcGxhY2Uoc2l6ZV90IF9fcCwgc2l6ZV90IF9fbiwgY29uc3QgX1NlbGYmIF9fcikgewotICAgIGlmIChfX3AgPiBzaXplKCkpIF9NX3Rocm93X291dF9vZl9yYW5nZSgpOwotICAgIF9NX3Jlc2V0KHJlcGxhY2UoX01fdHJlZV9wdHIuX01fZGF0YSwgX19wLCBfX3AgKyBfX24sIF9fci5fTV90cmVlX3B0ci5fTV9kYXRhKSk7Ci0gIH0KLQotICB2b2lkIHJlcGxhY2Uoc2l6ZV90IF9fcCwgc2l6ZV90IF9fbiwKLSAgICAgICAgICAgICAgIGNvbnN0IF9DaGFyVCogX19pLCBzaXplX3QgX19pX2xlbikgewotICAgIF9TZWxmIF9fcihfX2ksIF9faV9sZW4pOwotICAgIHJlcGxhY2UoX19wLCBfX24sIF9fcik7Ci0gIH0KLQotICB2b2lkIHJlcGxhY2Uoc2l6ZV90IF9fcCwgc2l6ZV90IF9fbiwgX0NoYXJUIF9fYykgewotICAgIF9TZWxmIF9fcihfX2MpOwotICAgIHJlcGxhY2UoX19wLCBfX24sIF9fcik7Ci0gIH0KLQotICB2b2lkIHJlcGxhY2Uoc2l6ZV90IF9fcCwgc2l6ZV90IF9fbiwgY29uc3QgX0NoYXJUKiBfX2Nfc3RyaW5nKSB7Ci0gICAgX1NlbGYgX19yKF9fY19zdHJpbmcpOwotICAgIHJlcGxhY2UoX19wLCBfX24sIF9fcik7Ci0gIH0KLQotICB2b2lkIHJlcGxhY2Uoc2l6ZV90IF9fcCwgc2l6ZV90IF9fbiwKLSAgICAgICAgICAgICAgIGNvbnN0IF9DaGFyVCogX19pLCBjb25zdCBfQ2hhclQqIF9faikgewotICAgIF9TZWxmIF9fcihfX2ksIF9faik7Ci0gICAgcmVwbGFjZShfX3AsIF9fbiwgX19yKTsKLSAgfQotCi0gIHZvaWQgcmVwbGFjZShzaXplX3QgX19wLCBzaXplX3QgX19uLAotICAgICAgICAgICAgICAgY29uc3QgY29uc3RfaXRlcmF0b3ImIF9faSwgY29uc3QgY29uc3RfaXRlcmF0b3ImIF9faikgewotICAgIF9TZWxmIF9fcihfX2ksIF9faik7Ci0gICAgcmVwbGFjZShfX3AsIF9fbiwgX19yKTsKLSAgfQotCi0gIHZvaWQgcmVwbGFjZShzaXplX3QgX19wLCBzaXplX3QgX19uLAotICAgICAgICAgICAgICAgY29uc3QgaXRlcmF0b3ImIF9faSwgY29uc3QgaXRlcmF0b3ImIF9faikgewotICAgIF9TZWxmIF9fcihfX2ksIF9faik7Ci0gICAgcmVwbGFjZShfX3AsIF9fbiwgX19yKTsKLSAgfQotCi0gIC8vIFNpbmdsZSBjaGFyYWN0ZXIgdmFyaWFudHM6Ci0gIHZvaWQgcmVwbGFjZShzaXplX3QgX19wLCBfQ2hhclQgX19jKSB7Ci0gICAgaWYgKF9fcCA+IHNpemUoKSkgX01fdGhyb3dfb3V0X29mX3JhbmdlKCk7Ci0gICAgaXRlcmF0b3IgX19pKHRoaXMsIF9fcCk7Ci0gICAgKl9faSA9IF9fYzsKLSAgfQotCi0gIHZvaWQgcmVwbGFjZShzaXplX3QgX19wLCBjb25zdCBfU2VsZiYgX19yKSB7Ci0gICAgcmVwbGFjZShfX3AsIDEsIF9fcik7Ci0gIH0KLQotICB2b2lkIHJlcGxhY2Uoc2l6ZV90IF9fcCwgY29uc3QgX0NoYXJUKiBfX2ksIHNpemVfdCBfX2lfbGVuKSB7Ci0gICAgcmVwbGFjZShfX3AsIDEsIF9faSwgX19pX2xlbik7Ci0gIH0KLQotICB2b2lkIHJlcGxhY2Uoc2l6ZV90IF9fcCwgY29uc3QgX0NoYXJUKiBfX2Nfc3RyaW5nKSB7Ci0gICAgcmVwbGFjZShfX3AsIDEsIF9fY19zdHJpbmcpOwotICB9Ci0KLSAgdm9pZCByZXBsYWNlKHNpemVfdCBfX3AsIGNvbnN0IF9DaGFyVCogX19pLCBjb25zdCBfQ2hhclQqIF9faikgewotICAgIHJlcGxhY2UoX19wLCAxLCBfX2ksIF9faik7Ci0gIH0KLQotICB2b2lkIHJlcGxhY2Uoc2l6ZV90IF9fcCwgY29uc3QgY29uc3RfaXRlcmF0b3ImIF9faSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiBfX2opIHsKLSAgICByZXBsYWNlKF9fcCwgMSwgX19pLCBfX2opOwotICB9Ci0KLSAgdm9pZCByZXBsYWNlKHNpemVfdCBfX3AsIGNvbnN0IGl0ZXJhdG9yJiBfX2ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVyYXRvciYgX19qKSB7Ci0gICAgcmVwbGFjZShfX3AsIDEsIF9faSwgX19qKTsKLSAgfQotCi0gIC8vIEVyYXNlLCAocG9zaXRpb24sIHNpemUpIHZhcmlhbnQuCi0gIHZvaWQgZXJhc2Uoc2l6ZV90IF9fcCwgc2l6ZV90IF9fbikgewotICAgIGlmIChfX3AgPiBzaXplKCkpIF9NX3Rocm93X291dF9vZl9yYW5nZSgpOwotICAgIF9NX3Jlc2V0KHJlcGxhY2UoX01fdHJlZV9wdHIuX01fZGF0YSwgX19wLCBfX3AgKyBfX24sIDApKTsKLSAgfQotCi0gIC8vIEVyYXNlLCBzaW5nbGUgY2hhcmFjdGVyCi0gIHZvaWQgZXJhc2Uoc2l6ZV90IF9fcCkgewotICAgIGVyYXNlKF9fcCwgX19wICsgMSk7Ci0gIH0KLQotICAvLyBJbnNlcnQsIGl0ZXJhdG9yIHZhcmlhbnRzLgotICBpdGVyYXRvciBpbnNlcnQoY29uc3QgaXRlcmF0b3ImIF9fcCwgY29uc3QgX1NlbGYmIF9fcikKLSAgeyBpbnNlcnQoX19wLmluZGV4KCksIF9fcik7IHJldHVybiBfX3A7IH0KLSAgaXRlcmF0b3IgaW5zZXJ0KGNvbnN0IGl0ZXJhdG9yJiBfX3AsIHNpemVfdCBfX24sIF9DaGFyVCBfX2MpCi0gIHsgaW5zZXJ0KF9fcC5pbmRleCgpLCBfX24sIF9fYyk7IHJldHVybiBfX3A7IH0KLSAgaXRlcmF0b3IgaW5zZXJ0KGNvbnN0IGl0ZXJhdG9yJiBfX3AsIF9DaGFyVCBfX2MpCi0gIHsgaW5zZXJ0KF9fcC5pbmRleCgpLCBfX2MpOyByZXR1cm4gX19wOyB9Ci0gIGl0ZXJhdG9yIGluc2VydChjb25zdCBpdGVyYXRvciYgX19wICkKLSAgeyBpbnNlcnQoX19wLmluZGV4KCkpOyByZXR1cm4gX19wOyB9Ci0gIGl0ZXJhdG9yIGluc2VydChjb25zdCBpdGVyYXRvciYgX19wLCBjb25zdCBfQ2hhclQqIGNfc3RyaW5nKQotICB7IGluc2VydChfX3AuaW5kZXgoKSwgY19zdHJpbmcpOyByZXR1cm4gX19wOyB9Ci0gIGl0ZXJhdG9yIGluc2VydChjb25zdCBpdGVyYXRvciYgX19wLCBjb25zdCBfQ2hhclQqIF9faSwgc2l6ZV90IF9fbikKLSAgeyBpbnNlcnQoX19wLmluZGV4KCksIF9faSwgX19uKTsgcmV0dXJuIF9fcDsgfQotICBpdGVyYXRvciBpbnNlcnQoY29uc3QgaXRlcmF0b3ImIF9fcCwgY29uc3QgX0NoYXJUKiBfX2ksCi0gICAgICAgICAgICAgICAgICBjb25zdCBfQ2hhclQqIF9faikKLSAgeyBpbnNlcnQoX19wLmluZGV4KCksIF9faSwgX19qKTsgIHJldHVybiBfX3A7IH0KLSAgaXRlcmF0b3IgaW5zZXJ0KGNvbnN0IGl0ZXJhdG9yJiBfX3AsCi0gICAgICAgICAgICAgICAgICBjb25zdCBjb25zdF9pdGVyYXRvciYgX19pLCBjb25zdCBjb25zdF9pdGVyYXRvciYgX19qKQotICB7IGluc2VydChfX3AuaW5kZXgoKSwgX19pLCBfX2opOyByZXR1cm4gX19wOyB9Ci0gIGl0ZXJhdG9yIGluc2VydChjb25zdCBpdGVyYXRvciYgX19wLAotICAgICAgICAgICAgICAgICAgY29uc3QgaXRlcmF0b3ImIF9faSwgY29uc3QgaXRlcmF0b3ImIF9faikKLSAgeyBpbnNlcnQoX19wLmluZGV4KCksIF9faSwgX19qKTsgcmV0dXJuIF9fcDsgfQotCi0gIC8vIFJlcGxhY2UsIHJhbmdlIHZhcmlhbnRzLgotICB2b2lkIHJlcGxhY2UoY29uc3QgaXRlcmF0b3ImIF9fcCwgY29uc3QgaXRlcmF0b3ImIF9fcSwKLSAgICAgICAgICAgICAgIGNvbnN0IF9TZWxmJiBfX3IpCi0gIHsgcmVwbGFjZShfX3AuaW5kZXgoKSwgX19xLmluZGV4KCkgLSBfX3AuaW5kZXgoKSwgX19yKTsgfQotICB2b2lkIHJlcGxhY2UoY29uc3QgaXRlcmF0b3ImIF9fcCwgY29uc3QgaXRlcmF0b3ImIF9fcSwgX0NoYXJUIF9fYykKLSAgeyByZXBsYWNlKF9fcC5pbmRleCgpLCBfX3EuaW5kZXgoKSAtIF9fcC5pbmRleCgpLCBfX2MpOyB9Ci0gIHZvaWQgcmVwbGFjZShjb25zdCBpdGVyYXRvciYgX19wLCBjb25zdCBpdGVyYXRvciYgX19xLAotICAgICAgICAgICAgICAgY29uc3QgX0NoYXJUKiBfX2Nfc3RyaW5nKQotICB7IHJlcGxhY2UoX19wLmluZGV4KCksIF9fcS5pbmRleCgpIC0gX19wLmluZGV4KCksIF9fY19zdHJpbmcpOyB9Ci0gIHZvaWQgcmVwbGFjZShjb25zdCBpdGVyYXRvciYgX19wLCBjb25zdCBpdGVyYXRvciYgX19xLAotICAgICAgICAgICAgICAgY29uc3QgX0NoYXJUKiBfX2ksIHNpemVfdCBfX24pCi0gIHsgcmVwbGFjZShfX3AuaW5kZXgoKSwgX19xLmluZGV4KCkgLSBfX3AuaW5kZXgoKSwgX19pLCBfX24pOyB9Ci0gIHZvaWQgcmVwbGFjZShjb25zdCBpdGVyYXRvciYgX19wLCBjb25zdCBpdGVyYXRvciYgX19xLAotICAgICAgICAgICAgICAgY29uc3QgX0NoYXJUKiBfX2ksIGNvbnN0IF9DaGFyVCogX19qKQotICB7IHJlcGxhY2UoX19wLmluZGV4KCksIF9fcS5pbmRleCgpIC0gX19wLmluZGV4KCksIF9faSwgX19qKTsgfQotICB2b2lkIHJlcGxhY2UoY29uc3QgaXRlcmF0b3ImIF9fcCwgY29uc3QgaXRlcmF0b3ImIF9fcSwKLSAgICAgICAgICAgICAgIGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiBfX2ksIGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiBfX2opCi0gIHsgcmVwbGFjZShfX3AuaW5kZXgoKSwgX19xLmluZGV4KCkgLSBfX3AuaW5kZXgoKSwgX19pLCBfX2opOyB9Ci0gIHZvaWQgcmVwbGFjZShjb25zdCBpdGVyYXRvciYgX19wLCBjb25zdCBpdGVyYXRvciYgX19xLAotICAgICAgICAgICAgICAgY29uc3QgaXRlcmF0b3ImIF9faSwgY29uc3QgaXRlcmF0b3ImIF9faikKLSAgeyByZXBsYWNlKF9fcC5pbmRleCgpLCBfX3EuaW5kZXgoKSAtIF9fcC5pbmRleCgpLCBfX2ksIF9faik7IH0KLQotICAvLyBSZXBsYWNlLCBpdGVyYXRvciB2YXJpYW50cy4KLSAgdm9pZCByZXBsYWNlKGNvbnN0IGl0ZXJhdG9yJiBfX3AsIGNvbnN0IF9TZWxmJiBfX3IpCi0gIHsgcmVwbGFjZShfX3AuaW5kZXgoKSwgX19yKTsgfQotICB2b2lkIHJlcGxhY2UoY29uc3QgaXRlcmF0b3ImIF9fcCwgX0NoYXJUIF9fYykKLSAgeyByZXBsYWNlKF9fcC5pbmRleCgpLCBfX2MpOyB9Ci0gIHZvaWQgcmVwbGFjZShjb25zdCBpdGVyYXRvciYgX19wLCBjb25zdCBfQ2hhclQqIF9fY19zdHJpbmcpCi0gIHsgcmVwbGFjZShfX3AuaW5kZXgoKSwgX19jX3N0cmluZyk7IH0KLSAgdm9pZCByZXBsYWNlKGNvbnN0IGl0ZXJhdG9yJiBfX3AsIGNvbnN0IF9DaGFyVCogX19pLCBzaXplX3QgX19uKQotICB7IHJlcGxhY2UoX19wLmluZGV4KCksIF9faSwgX19uKTsgfQotICB2b2lkIHJlcGxhY2UoY29uc3QgaXRlcmF0b3ImIF9fcCwgY29uc3QgX0NoYXJUKiBfX2ksIGNvbnN0IF9DaGFyVCogX19qKQotICB7IHJlcGxhY2UoX19wLmluZGV4KCksIF9faSwgX19qKTsgfQotICB2b2lkIHJlcGxhY2UoY29uc3QgaXRlcmF0b3ImIF9fcCwgY29uc3RfaXRlcmF0b3IgX19pLAotICAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3IgX19qKQotICB7IHJlcGxhY2UoX19wLmluZGV4KCksIF9faSwgX19qKTsgfQotICB2b2lkIHJlcGxhY2UoY29uc3QgaXRlcmF0b3ImIF9fcCwgaXRlcmF0b3IgX19pLCBpdGVyYXRvciBfX2opCi0gIHsgcmVwbGFjZShfX3AuaW5kZXgoKSwgX19pLCBfX2opOyB9Ci0KLSAgLy8gSXRlcmF0b3IgYW5kIHJhbmdlIHZhcmlhbnRzIG9mIGVyYXNlCi0gIGl0ZXJhdG9yIGVyYXNlKGNvbnN0IGl0ZXJhdG9yJiBfX3AsIGNvbnN0IGl0ZXJhdG9yJiBfX3EpIHsKLSAgICBzaXplX3QgX19wX2luZGV4ID0gX19wLmluZGV4KCk7Ci0gICAgZXJhc2UoX19wX2luZGV4LCBfX3EuaW5kZXgoKSAtIF9fcF9pbmRleCk7Ci0gICAgcmV0dXJuIGl0ZXJhdG9yKHRoaXMsIF9fcF9pbmRleCk7Ci0gIH0KLSAgaXRlcmF0b3IgZXJhc2UoY29uc3QgaXRlcmF0b3ImIF9fcCkgewotICAgIHNpemVfdCBfX3BfaW5kZXggPSBfX3AuaW5kZXgoKTsKLSAgICBlcmFzZShfX3BfaW5kZXgsIDEpOwotICAgIHJldHVybiBpdGVyYXRvcih0aGlzLCBfX3BfaW5kZXgpOwotICB9Ci0KLSAgX1NlbGYgc3Vic3RyKHNpemVfdCBfX3N0YXJ0LCBzaXplX3QgX19sZW4gPSAxKSBjb25zdCB7Ci0gICAgaWYgKF9fc3RhcnQgPiBzaXplKCkpIF9NX3Rocm93X291dF9vZl9yYW5nZSgpOwotICAgIHJldHVybiByb3BlPF9DaGFyVCxfQWxsb2M+KF9TX3N1YnN0cmluZyhfTV90cmVlX3B0ci5fTV9kYXRhLCBfX3N0YXJ0LCBfX3N0YXJ0ICsgX19sZW4pKTsKLSAgfQotCi0gIF9TZWxmIHN1YnN0cihpdGVyYXRvciBfX3N0YXJ0LCBpdGVyYXRvciBfX2VuZCkgY29uc3QgewotICAgIHJldHVybiByb3BlPF9DaGFyVCxfQWxsb2M+KF9TX3N1YnN0cmluZyhfTV90cmVlX3B0ci5fTV9kYXRhLCBfX3N0YXJ0LmluZGV4KCksIF9fZW5kLmluZGV4KCkpKTsKLSAgfQotCi0gIF9TZWxmIHN1YnN0cihpdGVyYXRvciBfX3N0YXJ0KSBjb25zdCB7Ci0gICAgc2l6ZV90IF9fcG9zID0gX19zdGFydC5pbmRleCgpOwotICAgIHJldHVybiByb3BlPF9DaGFyVCxfQWxsb2M+KF9TX3N1YnN0cmluZyhfTV90cmVlX3B0ci5fTV9kYXRhLCBfX3BvcywgX19wb3MgKyAxKSk7Ci0gIH0KLQotICBfU2VsZiBzdWJzdHIoY29uc3RfaXRlcmF0b3IgX19zdGFydCwgY29uc3RfaXRlcmF0b3IgX19lbmQpIGNvbnN0IHsKLSAgICAvLyBUaGlzIG1pZ2h0IGV2ZW50dWFsbHkgdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIGNhY2hlIGluIHRoZQotICAgIC8vIGl0ZXJhdG9yLgotICAgIHJldHVybiByb3BlPF9DaGFyVCxfQWxsb2M+KF9TX3N1YnN0cmluZyhfTV90cmVlX3B0ci5fTV9kYXRhLCBfX3N0YXJ0LmluZGV4KCksIF9fZW5kLmluZGV4KCkpKTsKLSAgfQotCi0gIHJvcGU8X0NoYXJULF9BbGxvYz4gc3Vic3RyKGNvbnN0X2l0ZXJhdG9yIF9fc3RhcnQpIHsKLSAgICBzaXplX3QgX19wb3MgPSBfX3N0YXJ0LmluZGV4KCk7Ci0gICAgcmV0dXJuIHJvcGU8X0NoYXJULF9BbGxvYz4oX1Nfc3Vic3RyaW5nKF9NX3RyZWVfcHRyLl9NX2RhdGEsIF9fcG9zLCBfX3BvcyArIDEpKTsKLSAgfQotCi0jaW5jbHVkZSA8c3RsL19zdHJpbmdfbnBvcy5oPgotCi0gIHNpemVfdHlwZSBmaW5kKGNvbnN0IF9TZWxmJiBfX3MsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0IHsKLSAgICBpZiAoX19wb3MgPj0gc2l6ZSgpKQotIyBpZm5kZWYgX1NUTFBfT0xEX1JPUEVfU0VNQU5USUNTCi0gICAgICByZXR1cm4gbnBvczsKLSMgZWxzZQotICAgICAgcmV0dXJuIHNpemUoKTsKLSMgZW5kaWYKLQotICAgIHNpemVfdHlwZSBfX3Jlc3VsdF9wb3M7Ci0gICAgY29uc3RfaXRlcmF0b3IgX19yZXN1bHQgPSBzZWFyY2goY29uc3RfYmVnaW4oKSArIChwdHJkaWZmX3QpX19wb3MsIGNvbnN0X2VuZCgpLCBfX3MuYmVnaW4oKSwgX19zLmVuZCgpICk7Ci0gICAgX19yZXN1bHRfcG9zID0gX19yZXN1bHQuaW5kZXgoKTsKLSMgaWZuZGVmIF9TVExQX09MRF9ST1BFX1NFTUFOVElDUwotICAgIGlmIChfX3Jlc3VsdF9wb3MgPT0gc2l6ZSgpKSBfX3Jlc3VsdF9wb3MgPSBucG9zOwotIyBlbmRpZgotICAgIHJldHVybiBfX3Jlc3VsdF9wb3M7Ci0gIH0KLSAgc2l6ZV90eXBlIGZpbmQoX0NoYXJUIF9fYywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3Q7Ci0gIHNpemVfdHlwZSBmaW5kKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdCB7Ci0gICAgc2l6ZV90eXBlIF9fcmVzdWx0X3BvczsKLSAgICBjb25zdF9pdGVyYXRvciBfX3Jlc3VsdCA9IHNlYXJjaChjb25zdF9iZWdpbigpICsgKHB0cmRpZmZfdClfX3BvcywgY29uc3RfZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19zLCBfX3MgKyBfU19jaGFyX3B0cl9sZW4oX19zKSk7Ci0gICAgX19yZXN1bHRfcG9zID0gX19yZXN1bHQuaW5kZXgoKTsKLSMgaWZuZGVmIF9TVExQX09MRF9ST1BFX1NFTUFOVElDUwotICAgIGlmIChfX3Jlc3VsdF9wb3MgPT0gc2l6ZSgpKSBfX3Jlc3VsdF9wb3MgPSBucG9zOwotIyBlbmRpZgotICAgIHJldHVybiBfX3Jlc3VsdF9wb3M7Ci0gIH0KLQotICBpdGVyYXRvciBtdXRhYmxlX2JlZ2luKCkgewotICAgIHJldHVybihpdGVyYXRvcih0aGlzLCAwKSk7Ci0gIH0KLQotICBpdGVyYXRvciBtdXRhYmxlX2VuZCgpIHsKLSAgICByZXR1cm4oaXRlcmF0b3IodGhpcywgc2l6ZSgpKSk7Ci0gIH0KLQotICByZXZlcnNlX2l0ZXJhdG9yIG11dGFibGVfcmJlZ2luKCkgewotICAgIHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKG11dGFibGVfZW5kKCkpOwotICB9Ci0KLSAgcmV2ZXJzZV9pdGVyYXRvciBtdXRhYmxlX3JlbmQoKSB7Ci0gICAgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IobXV0YWJsZV9iZWdpbigpKTsKLSAgfQotCi0gIHJlZmVyZW5jZSBtdXRhYmxlX3JlZmVyZW5jZV9hdChzaXplX3R5cGUgX19wb3MpIHsKLSAgICByZXR1cm4gcmVmZXJlbmNlKHRoaXMsIF9fcG9zKTsKLSAgfQotCi0jIGlmZGVmIF9fU1REX1NUVUZGCi0gIHJlZmVyZW5jZSBvcGVyYXRvcltdIChzaXplX3R5cGUgX19wb3MpIHsKLSAgICByZXR1cm4gcmVmZXJlbmNlKHRoaXMsIF9fcG9zKTsKLSAgfQotCi0gIHJlZmVyZW5jZSBhdChzaXplX3R5cGUgX19wb3MpIHsKLSAgICBpZiAoX19wb3MgPj0gc2l6ZSgpKSBfTV90aHJvd19vdXRfb2ZfcmFuZ2UoKTsKLSAgICByZXR1cm4gKCp0aGlzKVtfX3Bvc107Ci0gIH0KLQotICB2b2lkIHJlc2l6ZShzaXplX3R5cGUsIF9DaGFyVCkge30KLSAgdm9pZCByZXNpemUoc2l6ZV90eXBlKSB7fQotICB2b2lkIHJlc2VydmUoc2l6ZV90eXBlID0gMCkge30KLSAgc2l6ZV90eXBlIGNhcGFjaXR5KCkgY29uc3QgewotICAgIHJldHVybiBtYXhfc2l6ZSgpOwotICB9Ci0KLSAgLy8gU3R1ZmYgYmVsb3cgdGhpcyBsaW5lIGlzIGRhbmdlcm91cyBiZWNhdXNlIGl0J3MgZXJyb3IgcHJvbmUuCi0gIC8vIEkgd291bGQgcmVhbGx5IGxpa2UgdG8gZ2V0IHJpZCBvZiBpdC4KLSAgLy8gY29weSBmdW5jdGlvbiB3aXRoIGZ1bm55IGFyZyBvcmRlcmluZy4KLSAgc2l6ZV90eXBlIGNvcHkoX0NoYXJUKiBfX2J1ZmZlciwgc2l6ZV90eXBlIF9fbiwKLSAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QgewotICAgIHJldHVybiBjb3B5KF9fcG9zLCBfX24sIF9fYnVmZmVyKTsKLSAgfQotCi0gIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIG11dGFibGVfZW5kKCk7IH0KLQotICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIG11dGFibGVfYmVnaW4oKTsgfQotCi0gIHJldmVyc2VfaXRlcmF0b3IgcmVuZCgpIHsgcmV0dXJuIG11dGFibGVfcmVuZCgpOyB9Ci0KLSAgcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSB7IHJldHVybiBtdXRhYmxlX3JiZWdpbigpOyB9Ci0KLSMgZWxzZQotCi0gIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIGNvbnN0X2VuZCgpOyB9Ci0KLSAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBjb25zdF9iZWdpbigpOyB9Ci0KLSAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgeyByZXR1cm4gY29uc3RfcmVuZCgpOyB9Ci0KLSAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSB7IHJldHVybiBjb25zdF9yYmVnaW4oKTsgfQotCi0jIGVuZGlmCi19OyAvL2NsYXNzIHJvcGUKLQotI2lmICFkZWZpbmVkIChfU1RMUF9TVEFUSUNfQ09OU1RfSU5JVF9CVUcpCi0jICBpZiBkZWZpbmVkIChfX0dOVUNfXykgJiYgKF9fR05VQ19fID09IDIpICYmIChfX0dOVUNfTUlOT1JfXyA9PSA5NikKLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KLWNvbnN0IHNpemVfdCByb3BlPF9DaGFyVCwgX0FsbG9jPjo6bnBvcyA9IH4oc2l6ZV90KSAwOwotIyAgZW5kaWYKLSNlbmRpZgotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+Ci1pbmxpbmUgX0NoYXJUCi1fUm9wZV9jb25zdF9pdGVyYXRvcjwgX0NoYXJULCBfQWxsb2M+OjpvcGVyYXRvcltdKHNpemVfdCBfX24pCi17IHJldHVybiByb3BlPF9DaGFyVCxfQWxsb2M+OjpfU19mZXRjaCh0aGlzLT5fTV9yb290LCB0aGlzLT5fTV9jdXJyZW50X3BvcyArIF9fbik7IH0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgotaW5saW5lIGJvb2wgb3BlcmF0b3I9PSAoY29uc3QgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4mIF9feCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+JiBfX3kpIHsKLSAgcmV0dXJuIChfX3guX01fY3VycmVudF9wb3MgPT0gX195Ll9NX2N1cnJlbnRfcG9zICYmCi0gICAgICAgICAgX194Ll9NX3Jvb3QgPT0gX195Ll9NX3Jvb3QpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+Ci1pbmxpbmUgYm9vbCBvcGVyYXRvcjwgKGNvbnN0IF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+JiBfX3gsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+JiBfX3kpCi17IHJldHVybiAoX194Ll9NX2N1cnJlbnRfcG9zIDwgX195Ll9NX2N1cnJlbnRfcG9zKTsgfQotCi0jaWZkZWYgX1NUTFBfVVNFX1NFUEFSQVRFX1JFTE9QU19OQU1FU1BBQ0UKLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgotaW5saW5lIGJvb2wgb3BlcmF0b3IhPSAoY29uc3QgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4mIF9feCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+JiBfX3kpCi17IHJldHVybiAhKF9feCA9PSBfX3kpOyB9Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KLWlubGluZSBib29sIG9wZXJhdG9yPiAoY29uc3QgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4mIF9feCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4mIF9feSkKLXsgcmV0dXJuIF9feSA8IF9feDsgfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+Ci1pbmxpbmUgYm9vbCBvcGVyYXRvcjw9IChjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPiYgX194LAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4mIF9feSkKLXsgcmV0dXJuICEoX195IDwgX194KTsgfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+Ci1pbmxpbmUgYm9vbCBvcGVyYXRvcj49IChjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPiYgX194LAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4mIF9feSkKLXsgcmV0dXJuICEoX194IDwgX195KTsgfQotCi0jZW5kaWYgLyogX1NUTFBfVVNFX1NFUEFSQVRFX1JFTE9QU19OQU1FU1BBQ0UgKi8KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgotaW5saW5lIHB0cmRpZmZfdCBvcGVyYXRvci0oY29uc3QgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4mIF9feCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+JiBfX3kpCi17IHJldHVybiAocHRyZGlmZl90KV9feC5fTV9jdXJyZW50X3BvcyAtIChwdHJkaWZmX3QpX195Ll9NX2N1cnJlbnRfcG9zOyB9Ci0KLSNpZiAhZGVmaW5lZCggX19NV0VSS1NfXyApIHx8IF9fTVdFUktTX18gPj0gMHgyMDAwICAvLyBkd2EgOC8yMS85NyAgLSAiYW1iaWd1b3VzIGFjY2VzcyB0byBvdmVybG9hZGVkIGZ1bmN0aW9uIiBidWcuCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+Ci1pbmxpbmUgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4KLW9wZXJhdG9yLShjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPiYgX194LCBwdHJkaWZmX3QgX19uKQoteyByZXR1cm4gX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4oX194Ll9NX3Jvb3QsIF9feC5fTV9jdXJyZW50X3BvcyAtIF9fbik7IH0KLSMgZW5kaWYKLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgotaW5saW5lIF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+Ci1vcGVyYXRvcisoY29uc3QgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4mIF9feCwgcHRyZGlmZl90IF9fbikKLXsgcmV0dXJuIF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+KF9feC5fTV9yb290LCBfX3guX01fY3VycmVudF9wb3MgKyBfX24pOyB9Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KLWlubGluZSBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPgotb3BlcmF0b3IrKHB0cmRpZmZfdCBfX24sIGNvbnN0IF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+JiBfX3gpCi17IHJldHVybiBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPihfX3guX01fcm9vdCwgX194Ll9NX2N1cnJlbnRfcG9zICsgX19uKTsgfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+Ci1pbmxpbmUgYm9vbCBvcGVyYXRvcj09IChjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPiYgX194LAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1JvcGVfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4mIF9feSkgewotICByZXR1cm4gKF9feC5fTV9jdXJyZW50X3BvcyA9PSBfX3kuX01fY3VycmVudF9wb3MgJiYKLSAgICAgICAgICBfX3guX01fcm9vdF9yb3BlID09IF9feS5fTV9yb290X3JvcGUpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+Ci1pbmxpbmUgYm9vbCBvcGVyYXRvcjwgKGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+JiBfX3gsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+JiBfX3kpCi17IHJldHVybiAoX194Ll9NX2N1cnJlbnRfcG9zIDwgX195Ll9NX2N1cnJlbnRfcG9zKTsgfQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1NFUEFSQVRFX1JFTE9QU19OQU1FU1BBQ0UpCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+Ci1pbmxpbmUgYm9vbCBvcGVyYXRvciE9IChjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPiYgX194LAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1JvcGVfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4mIF9feSkKLXsgcmV0dXJuICEoX194ID09IF9feSk7IH0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgotaW5saW5lIGJvb2wgb3BlcmF0b3I+IChjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPiYgX194LAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPiYgX195KQoteyByZXR1cm4gX195IDwgX194OyB9Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KLWlubGluZSBib29sIG9wZXJhdG9yPD0gKGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+JiBfX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPiYgX195KQoteyByZXR1cm4gIShfX3kgPCBfX3gpOyB9Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KLWlubGluZSBib29sIG9wZXJhdG9yPj0gKGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+JiBfX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPiYgX195KQoteyByZXR1cm4gIShfX3ggPCBfX3kpOyB9Ci0jZW5kaWYgLyogX1NUTFBfVVNFX1NFUEFSQVRFX1JFTE9QU19OQU1FU1BBQ0UgKi8KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgotaW5saW5lIHB0cmRpZmZfdCBvcGVyYXRvci0oY29uc3QgX1JvcGVfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4mIF9feCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+JiBfX3kpCi17IHJldHVybiAocHRyZGlmZl90KV9feC5fTV9jdXJyZW50X3BvcyAtIChwdHJkaWZmX3QpX195Ll9NX2N1cnJlbnRfcG9zOyB9Ci0KLSNpZiAhZGVmaW5lZCggX19NV0VSS1NfXyApIHx8IF9fTVdFUktTX18gPj0gMHgyMDAwICAvLyBkd2EgOC8yMS85NyAgLSAiYW1iaWd1b3VzIGFjY2VzcyB0byBvdmVybG9hZGVkIGZ1bmN0aW9uIiBidWcuCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+Ci1pbmxpbmUgX1JvcGVfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4KLW9wZXJhdG9yLShjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPiYgX194LAotICAgICAgICAgIHB0cmRpZmZfdCBfX24pIHsKLSAgcmV0dXJuIF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+KF9feC5fTV9yb290X3JvcGUsIF9feC5fTV9jdXJyZW50X3BvcyAtIF9fbik7Ci19Ci0jIGVuZGlmCi0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KLWlubGluZSBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPgotb3BlcmF0b3IrKGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+JiBfX3gsCi0gICAgICAgICAgcHRyZGlmZl90IF9fbikgewotICByZXR1cm4gX1JvcGVfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4oX194Ll9NX3Jvb3Rfcm9wZSwgX194Ll9NX2N1cnJlbnRfcG9zICsgX19uKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgotaW5saW5lIF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+Ci1vcGVyYXRvcisocHRyZGlmZl90IF9fbiwgY29uc3QgX1JvcGVfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4mIF9feCkgewotICByZXR1cm4gX1JvcGVfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4oX194Ll9NX3Jvb3Rfcm9wZSwgX194Ll9NX2N1cnJlbnRfcG9zICsgX19uKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgotaW5saW5lIHJvcGU8X0NoYXJULF9BbGxvYz4KLW9wZXJhdG9yKyAoY29uc3Qgcm9wZTxfQ2hhclQsX0FsbG9jPiYgX19sZWZ0LAotICAgICAgICAgICBjb25zdCByb3BlPF9DaGFyVCxfQWxsb2M+JiBfX3JpZ2h0KSB7Ci0gIF9TVExQX0FTU0VSVChfX2xlZnQuZ2V0X2FsbG9jYXRvcigpID09IF9fcmlnaHQuZ2V0X2FsbG9jYXRvcigpKQotICByZXR1cm4gcm9wZTxfQ2hhclQsX0FsbG9jPihyb3BlPF9DaGFyVCxfQWxsb2M+OjpfU19jb25jYXRfcmVwKF9fbGVmdC5fTV90cmVlX3B0ci5fTV9kYXRhLCBfX3JpZ2h0Ll9NX3RyZWVfcHRyLl9NX2RhdGEpKTsKLSAgLy8gSW5saW5pbmcgdGhpcyBzaG91bGQgbWFrZSBpdCBwb3NzaWJsZSB0byBrZWVwIF9fbGVmdCBhbmQgX19yaWdodCBpbiByZWdpc3RlcnMuCi19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KLWlubGluZSByb3BlPF9DaGFyVCxfQWxsb2M+Jgotb3BlcmF0b3IrPSAocm9wZTxfQ2hhclQsX0FsbG9jPiYgX19sZWZ0LAotICAgICAgICAgICAgY29uc3Qgcm9wZTxfQ2hhclQsX0FsbG9jPiYgX19yaWdodCkgewotICBfX2xlZnQuYXBwZW5kKF9fcmlnaHQpOwotICByZXR1cm4gX19sZWZ0OwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+Ci1pbmxpbmUgcm9wZTxfQ2hhclQsX0FsbG9jPgotb3BlcmF0b3IrIChjb25zdCByb3BlPF9DaGFyVCxfQWxsb2M+JiBfX2xlZnQsCi0gICAgICAgICAgIGNvbnN0IF9DaGFyVCogX19yaWdodCkgewotICBzaXplX3QgX19ybGVuID0gcm9wZTxfQ2hhclQsX0FsbG9jPjo6X1NfY2hhcl9wdHJfbGVuKF9fcmlnaHQpOwotICByZXR1cm4gcm9wZTxfQ2hhclQsX0FsbG9jPihyb3BlPF9DaGFyVCxfQWxsb2M+OjpfU19jb25jYXRfY2hhcl9pdGVyKF9fbGVmdC5fTV90cmVlX3B0ci5fTV9kYXRhLCBfX3JpZ2h0LCBfX3JsZW4pKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgotaW5saW5lIHJvcGU8X0NoYXJULF9BbGxvYz4mCi1vcGVyYXRvcis9IChyb3BlPF9DaGFyVCxfQWxsb2M+JiBfX2xlZnQsCi0gICAgICAgICAgICBjb25zdCBfQ2hhclQqIF9fcmlnaHQpIHsKLSAgX19sZWZ0LmFwcGVuZChfX3JpZ2h0KTsKLSAgcmV0dXJuIF9fbGVmdDsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgotaW5saW5lIHJvcGU8X0NoYXJULF9BbGxvYz4KLW9wZXJhdG9yKyAoY29uc3Qgcm9wZTxfQ2hhclQsX0FsbG9jPiYgX19sZWZ0LCBfQ2hhclQgX19yaWdodCkgewotICByZXR1cm4gcm9wZTxfQ2hhclQsX0FsbG9jPihyb3BlPF9DaGFyVCxfQWxsb2M+OjpfU19jb25jYXRfY2hhcl9pdGVyKF9fbGVmdC5fTV90cmVlX3B0ci5fTV9kYXRhLCAmX19yaWdodCwgMSkpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+Ci1pbmxpbmUgcm9wZTxfQ2hhclQsX0FsbG9jPiYKLW9wZXJhdG9yKz0gKHJvcGU8X0NoYXJULF9BbGxvYz4mIF9fbGVmdCwgX0NoYXJUIF9fcmlnaHQpIHsKLSAgX19sZWZ0LmFwcGVuZChfX3JpZ2h0KTsKLSAgcmV0dXJuIF9fbGVmdDsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgotaW5saW5lIGJvb2wKLW9wZXJhdG9yPCAoY29uc3Qgcm9wZTxfQ2hhclQsX0FsbG9jPiYgX19sZWZ0LAotICAgICAgICAgICBjb25zdCByb3BlPF9DaGFyVCxfQWxsb2M+JiBfX3JpZ2h0KSB7Ci0gIHJldHVybiBfX2xlZnQuY29tcGFyZShfX3JpZ2h0KSA8IDA7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KLWlubGluZSBib29sCi1vcGVyYXRvcj09IChjb25zdCByb3BlPF9DaGFyVCxfQWxsb2M+JiBfX2xlZnQsCi0gICAgICAgICAgICBjb25zdCByb3BlPF9DaGFyVCxfQWxsb2M+JiBfX3JpZ2h0KSB7Ci0gIHJldHVybiBfX2xlZnQuY29tcGFyZShfX3JpZ2h0KSA9PSAwOwotfQotCi0jaWZkZWYgX1NUTFBfVVNFX1NFUEFSQVRFX1JFTE9QU19OQU1FU1BBQ0UKLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgotaW5saW5lIGJvb2wKLW9wZXJhdG9yIT0gKGNvbnN0IHJvcGU8X0NoYXJULF9BbGxvYz4mIF9feCwgY29uc3Qgcm9wZTxfQ2hhclQsX0FsbG9jPiYgX195KSB7Ci0gIHJldHVybiAhKF9feCA9PSBfX3kpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+Ci1pbmxpbmUgYm9vbAotb3BlcmF0b3I+IChjb25zdCByb3BlPF9DaGFyVCxfQWxsb2M+JiBfX3gsIGNvbnN0IHJvcGU8X0NoYXJULF9BbGxvYz4mIF9feSkgewotICByZXR1cm4gX195IDwgX194OwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+Ci1pbmxpbmUgYm9vbAotb3BlcmF0b3I8PSAoY29uc3Qgcm9wZTxfQ2hhclQsX0FsbG9jPiYgX194LCBjb25zdCByb3BlPF9DaGFyVCxfQWxsb2M+JiBfX3kpIHsKLSAgcmV0dXJuICEoX195IDwgX194KTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgotaW5saW5lIGJvb2wKLW9wZXJhdG9yPj0gKGNvbnN0IHJvcGU8X0NoYXJULF9BbGxvYz4mIF9feCwgY29uc3Qgcm9wZTxfQ2hhclQsX0FsbG9jPiYgX195KSB7Ci0gIHJldHVybiAhKF9feCA8IF9feSk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KLWlubGluZSBib29sIG9wZXJhdG9yIT0gKGNvbnN0IF9Sb3BlX2NoYXJfcHRyX3Byb3h5PF9DaGFyVCxfQWxsb2M+JiBfX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfUm9wZV9jaGFyX3B0cl9wcm94eTxfQ2hhclQsX0FsbG9jPiYgX195KSB7Ci0gIHJldHVybiAhKF9feCA9PSBfX3kpOwotfQotCi0jZW5kaWYgLyogX1NUTFBfVVNFX1NFUEFSQVRFX1JFTE9QU19OQU1FU1BBQ0UgKi8KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgotaW5saW5lIGJvb2wgb3BlcmF0b3I9PSAoY29uc3QgX1JvcGVfY2hhcl9wdHJfcHJveHk8X0NoYXJULF9BbGxvYz4mIF9feCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9Sb3BlX2NoYXJfcHRyX3Byb3h5PF9DaGFyVCxfQWxsb2M+JiBfX3kpIHsKLSAgcmV0dXJuIChfX3guX01fcG9zID09IF9feS5fTV9wb3MgJiYgX194Ll9NX3Jvb3QgPT0gX195Ll9NX3Jvb3QpOwotfQotCi0jaWYgIWRlZmluZWQgKF9TVExQX1VTRV9OT19JT1NUUkVBTVMpCi10ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KLWJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgb3BlcmF0b3I8PCAoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX28sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvcGU8X0NoYXJULCBfQWxsb2M+JiBfX3IpOwotI2VuZGlmCi0KLXR5cGVkZWYgcm9wZTxjaGFyLCBfU1RMUF9ERUZBVUxUX0FMTE9DQVRPUihjaGFyKSA+IGNyb3BlOwotI2lmIGRlZmluZWQgKF9TVExQX0hBU19XQ0hBUl9UKQotdHlwZWRlZiByb3BlPHdjaGFyX3QsIF9TVExQX0RFRkFVTFRfQUxMT0NBVE9SKHdjaGFyX3QpID4gd3JvcGU7Ci0jZW5kaWYKLQotaW5saW5lIGNyb3BlOjpyZWZlcmVuY2UgX19tdXRhYmxlX3JlZmVyZW5jZV9hdChjcm9wZSYgX19jLCBzaXplX3QgX19pKQoteyByZXR1cm4gX19jLm11dGFibGVfcmVmZXJlbmNlX2F0KF9faSk7IH0KLQotI2lmIGRlZmluZWQgKF9TVExQX0hBU19XQ0hBUl9UKQotaW5saW5lIHdyb3BlOjpyZWZlcmVuY2UgX19tdXRhYmxlX3JlZmVyZW5jZV9hdCh3cm9wZSYgX19jLCBzaXplX3QgX19pKQoteyByZXR1cm4gX19jLm11dGFibGVfcmVmZXJlbmNlX2F0KF9faSk7IH0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX1NUTFBfRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSKQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgotaW5saW5lIHZvaWQgc3dhcChyb3BlPF9DaGFyVCxfQWxsb2M+JiBfX3gsIHJvcGU8X0NoYXJULF9BbGxvYz4mIF9feSkKLXsgX194LnN3YXAoX195KTsgfQotI2Vsc2UKLQotaW5saW5lIHZvaWQgc3dhcChjcm9wZSYgX194LCBjcm9wZSYgX195KSB7IF9feC5zd2FwKF9feSk7IH0KLSMgaWZkZWYgX1NUTFBfSEFTX1dDSEFSX1QgIC8vIGR3YSA4LzIxLzk3Ci1pbmxpbmUgdm9pZCBzd2FwKHdyb3BlJiBfX3gsIHdyb3BlJiBfX3kpIHsgX194LnN3YXAoX195KTsgfQotIyBlbmRpZgotCi0jZW5kaWYgLyogX1NUTFBfRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSICovCi0KLQotLy8gSGFzaCBmdW5jdGlvbnMgc2hvdWxkIHByb2JhYmx5IGJlIHJldmlzaXRlZCBsYXRlcjoKLV9TVExQX1RFTVBMQVRFX05VTEwgc3RydWN0IGhhc2g8Y3JvcGU+IHsKLSAgc2l6ZV90IG9wZXJhdG9yKCkoY29uc3QgY3JvcGUmIF9fc3RyKSBjb25zdCB7Ci0gICAgc2l6ZV90IF9wX3NpemUgPSBfX3N0ci5zaXplKCk7Ci0KLSAgICBpZiAoMCA9PSBfcF9zaXplKSByZXR1cm4gMDsKLSAgICByZXR1cm4gMTMqX19zdHJbMF0gKyA1Kl9fc3RyW19wX3NpemUgLSAxXSArIF9wX3NpemU7Ci0gIH0KLX07Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9IQVNfV0NIQVJfVCkgIC8vIGR3YSA4LzIxLzk3Ci1fU1RMUF9URU1QTEFURV9OVUxMIHN0cnVjdCBoYXNoPHdyb3BlPiB7Ci0gIHNpemVfdCBvcGVyYXRvcigpKGNvbnN0IHdyb3BlJiBfX3N0cikgY29uc3QgewotICAgIHNpemVfdCBfcF9zaXplID0gX19zdHIuc2l6ZSgpOwotCi0gICAgaWYgKDAgPT0gX3Bfc2l6ZSkgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIDEzKl9fc3RyWzBdICsgNSpfX3N0cltfcF9zaXplIC0gMV0gKyBfcF9zaXplOwotICB9Ci19OwotI2VuZGlmCi0KLSNpZiAoIWRlZmluZWQgKF9TVExQX01TVkMpIHx8IChfU1RMUF9NU1ZDID49IDEzMTApKQotLy8gSSBjb3VsZG4ndCBnZXQgdGhpcyB0byB3b3JrIHdpdGggVkMrKwotdGVtcGxhdGU8Y2xhc3MgX0NoYXJULGNsYXNzIF9BbGxvYz4KLSMgIGlmIGRlZmluZWQgKF9fRE1DX18pICYmICFkZWZpbmVkIChfX1BVVF9TVEFUSUNfREFUQV9NRU1CRVJTX0hFUkUpCi1leHRlcm4KLSMgIGVuZGlmCi12b2lkIF9Sb3BlX3JvdGF0ZShfUm9wZV9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4gX19maXJzdCwKLSAgICAgICAgICAgICAgICAgIF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiBfX21pZGRsZSwKLSAgICAgICAgICAgICAgICAgIF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiBfX2xhc3QpOwotCi1pbmxpbmUgdm9pZCByb3RhdGUoX1JvcGVfaXRlcmF0b3I8Y2hhciwgX1NUTFBfREVGQVVMVF9BTExPQ0FUT1IoY2hhcikgPiBfX2ZpcnN0LAotICAgICAgICAgICAgICAgICAgIF9Sb3BlX2l0ZXJhdG9yPGNoYXIsIF9TVExQX0RFRkFVTFRfQUxMT0NBVE9SKGNoYXIpID4gX19taWRkbGUsCi0gICAgICAgICAgICAgICAgICAgX1JvcGVfaXRlcmF0b3I8Y2hhciwgX1NUTFBfREVGQVVMVF9BTExPQ0FUT1IoY2hhcikgPiBfX2xhc3QpCi17IF9Sb3BlX3JvdGF0ZShfX2ZpcnN0LCBfX21pZGRsZSwgX19sYXN0KTsgfQotI2VuZGlmCi0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KLWlubGluZSBfUm9wZV9jaGFyX3JlZl9wcm94eTxfQ2hhclQsIF9BbGxvYz46Om9wZXJhdG9yIF9DaGFyVCAoKSBjb25zdCB7Ci0gIGlmIChfTV9jdXJyZW50X3ZhbGlkKSB7Ci0gICAgcmV0dXJuIF9NX2N1cnJlbnQ7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIF9NeV9yb3BlOjpfU19mZXRjaChfTV9yb290LT5fTV90cmVlX3B0ci5fTV9kYXRhLCBfTV9wb3MpOwotICB9Ci19Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgotc3RydWN0IF9fbW92ZV90cmFpdHM8cm9wZTxfQ2hhclQsIF9BbGxvYz4gPiB7Ci0gIHR5cGVkZWYgX19zdGxwX21vdmFibGUgaW1wbGVtZW50ZWQ7Ci0gIC8vQ29tcGxldG5lc3MgZGVwZW5kcyBvbiB0aGUgYWxsb2NhdG9yOgotICB0eXBlZGVmIHR5cGVuYW1lIF9fbW92ZV90cmFpdHM8X0FsbG9jPjo6Y29tcGxldGUgY29tcGxldGU7Ci19OwotI2VuZGlmCi0KLV9TVExQX0VORF9OQU1FU1BBQ0UKLQotI2lmICFkZWZpbmVkIChfU1RMUF9MSU5LX1RJTUVfSU5TVEFOVElBVElPTikKLSMgIGluY2x1ZGUgPHN0bC9fcm9wZS5jPgotI2VuZGlmCi0KLSNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9ST1BFX0ggKi8KLQotLy8gTG9jYWwgVmFyaWFibGVzOgotLy8gbW9kZTpDKysKLS8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9fc2V0LmggYi9zdGwvX3NldC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjUzYjQ2Li4wMDAwMDAwCi0tLSBhL3N0bC9fc2V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MDIgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTQKLSAqIEhld2xldHQtUGFja2FyZCBDb21wYW55Ci0gKgotICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKLSAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NwotICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogQm9yaXMgRm9taXRjaGV2Ci0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICovCi0KLS8qIE5PVEU6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIFNUTCBoZWFkZXJzLgotICogICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4KLSAqLwotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX1NFVF9ICi0jZGVmaW5lIF9TVExQX0lOVEVSTkFMX1NFVF9ICi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfVFJFRV9ICi0jICBpbmNsdWRlIDxzdGwvX3RyZWUuaD4KLSNlbmRpZgotCi0jaWYgIWRlZmluZWQgKF9TVExQX1VTRV9QVFJfU1BFQ0lBTElaQVRJT05TKQotCi1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLQotLy9TcGVjaWZpYyBpdGVyYXRvciB0cmFpdHMgY3JlYXRpb24KLV9TVExQX0NSRUFURV9JVEVSQVRPUl9UUkFJVFMoU2V0VHJhaXRzVCwgQ29uc3RfdHJhaXRzKQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgX1NUTFBfREZMX1RNUExfUEFSQU0oX0NvbXBhcmUsIGxlc3M8X0tleT4pLAotICAgICAgICAgICAgICAgICAgICAgX1NUTFBfREVGQVVMVF9BTExPQ0FUT1JfU0VMRUNUKF9LZXkpID4KLWNsYXNzIHNldAotI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QQVJUSUFMX1NQRUNfV09SS0FST1VORCkKLSAgICAgICAgICA6IHB1YmxpYyBfX3N0bHBvcnRfY2xhc3M8c2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2M+ID4KLSNlbmRpZgotewotICB0eXBlZGVmIHNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jPiBfU2VsZjsKLXB1YmxpYzoKLS8vIHR5cGVkZWZzOgotICB0eXBlZGVmIF9LZXkgICAgIGtleV90eXBlOwotICB0eXBlZGVmIF9LZXkgICAgIHZhbHVlX3R5cGU7Ci0gIHR5cGVkZWYgX0NvbXBhcmUga2V5X2NvbXBhcmU7Ci0gIHR5cGVkZWYgX0NvbXBhcmUgdmFsdWVfY29tcGFyZTsKLQotcHJpdmF0ZToKLSAgLy9TcGVjaWZpYyBpdGVyYXRvciB0cmFpdHMgY3JlYXRpb24KLSAgdHlwZWRlZiBfU1RMUF9QUklWIF9TZXRUcmFpdHNUPHZhbHVlX3R5cGU+IF9TZXRUcmFpdHM7Ci0KLXB1YmxpYzoKLSAgLy9Gb2xsb3dpbmcgdHlwZWRlZiBoYXZlIHRvIGJlIHB1YmxpYyBmb3IgX19tb3ZlX3RyYWl0cyBzcGVjaWFsaXphdGlvbi4KLSAgdHlwZWRlZiBfU1RMUF9QUklWIF9SYl90cmVlPGtleV90eXBlLCBrZXlfY29tcGFyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGUsIF9TVExQX1BSSVYgX0lkZW50aXR5PHZhbHVlX3R5cGU+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NldFRyYWl0cywgX0FsbG9jPiBfUmVwX3R5cGU7Ci0KLSAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OnBvaW50ZXIgcG9pbnRlcjsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OmNvbnN0X3BvaW50ZXIgY29uc3RfcG9pbnRlcjsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OnJlZmVyZW5jZSByZWZlcmVuY2U7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlOwotICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6aXRlcmF0b3IgaXRlcmF0b3I7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OnJldmVyc2VfaXRlcmF0b3IgcmV2ZXJzZV9pdGVyYXRvcjsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OnNpemVfdHlwZSBzaXplX3R5cGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOwotICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7Ci0KLXByaXZhdGU6Ci0gIF9SZXBfdHlwZSBfTV90OyAgLy8gcmVkLWJsYWNrIHRyZWUgcmVwcmVzZW50aW5nIHNldAotICBfU1RMUF9LRVlfVFlQRV9GT1JfQ09OVF9FWFQoa2V5X3R5cGUpCi0KLXB1YmxpYzoKLQotICAvLyBhbGxvY2F0aW9uL2RlYWxsb2NhdGlvbgotI2lmICFkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQotICBleHBsaWNpdCBzZXQoY29uc3QgX0NvbXBhcmUmIF9fY29tcCA9IF9Db21wYXJlKCksCi0gICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKLSNlbHNlCi0gIHNldCgpCi0gICAgOiBfTV90KF9Db21wYXJlKCksIGFsbG9jYXRvcl90eXBlKCkpIHt9Ci0gIGV4cGxpY2l0IHNldChjb25zdCBfQ29tcGFyZSYgX19jb21wKQotICAgIDogX01fdChfX2NvbXAsIGFsbG9jYXRvcl90eXBlKCkpIHt9Ci0gIHNldChjb25zdCBfQ29tcGFyZSYgX19jb21wLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQotI2VuZGlmCi0gICAgOiBfTV90KF9fY29tcCwgX19hKSB7fQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgotICBzZXQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQotICAgIDogX01fdChfQ29tcGFyZSgpLCBhbGxvY2F0b3JfdHlwZSgpKQotICAgIHsgX01fdC5pbnNlcnRfdW5pcXVlKF9fZmlyc3QsIF9fbGFzdCk7IH0KLQotIyAgaWYgZGVmaW5lZCAoX1NUTFBfTkVFRFNfRVhUUkFfVEVNUExBVEVfQ09OU1RSVUNUT1JTKQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Ci0gIHNldChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsIGNvbnN0IF9Db21wYXJlJiBfX2NvbXApCi0gICAgOiBfTV90KF9fY29tcCwgYWxsb2NhdG9yX3R5cGUoKSkgeyBfTV90Lmluc2VydF91bmlxdWUoX19maXJzdCwgX19sYXN0KTsgfQotIyAgZW5kaWYKLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgotICBzZXQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LCBjb25zdCBfQ29tcGFyZSYgX19jb21wLAotICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSBfU1RMUF9BTExPQ0FUT1JfVFlQRV9ERkwpCi0gICAgOiBfTV90KF9fY29tcCwgX19hKSB7IF9NX3QuaW5zZXJ0X3VuaXF1ZShfX2ZpcnN0LCBfX2xhc3QpOyB9Ci0jZWxzZQotICBzZXQoY29uc3QgdmFsdWVfdHlwZSogX19maXJzdCwgY29uc3QgdmFsdWVfdHlwZSogX19sYXN0KQotICAgIDogX01fdChfQ29tcGFyZSgpLCBhbGxvY2F0b3JfdHlwZSgpKQotICAgIHsgX01fdC5pbnNlcnRfdW5pcXVlKF9fZmlyc3QsIF9fbGFzdCk7IH0KLQotICBzZXQoY29uc3QgdmFsdWVfdHlwZSogX19maXJzdCwKLSAgICAgIGNvbnN0IHZhbHVlX3R5cGUqIF9fbGFzdCwgY29uc3QgX0NvbXBhcmUmIF9fY29tcCwKLSAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQotICAgIDogX01fdChfX2NvbXAsIF9fYSkgeyBfTV90Lmluc2VydF91bmlxdWUoX19maXJzdCwgX19sYXN0KTsgfQotCi0gIHNldChjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpCi0gICAgOiBfTV90KF9Db21wYXJlKCksIGFsbG9jYXRvcl90eXBlKCkpCi0gICAgeyBfTV90Lmluc2VydF91bmlxdWUoX19maXJzdCwgX19sYXN0KTsgfQotCi0gIHNldChjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QsIGNvbnN0IF9Db21wYXJlJiBfX2NvbXAsCi0gICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKLSAgICA6IF9NX3QoX19jb21wLCBfX2EpIHsgX01fdC5pbnNlcnRfdW5pcXVlKF9fZmlyc3QsIF9fbGFzdCk7IH0KLSNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCi0KLSAgc2V0KGNvbnN0IF9TZWxmJiBfX3gpIDogX01fdChfX3guX01fdCkge30KLQotICBzZXQoX19tb3ZlX3NvdXJjZTxfU2VsZj4gc3JjKQotICAgIDogX01fdChfX21vdmVfc291cmNlPF9SZXBfdHlwZT4oc3JjLmdldCgpLl9NX3QpKSB7fQotCi0gIF9TZWxmJiBvcGVyYXRvcj0oY29uc3QgX1NlbGYmIF9feCkgewotICAgIF9NX3QgPSBfX3guX01fdDsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICAvLyBhY2Nlc3NvcnM6Ci0gIGtleV9jb21wYXJlIGtleV9jb21wKCkgY29uc3QgeyByZXR1cm4gX01fdC5rZXlfY29tcCgpOyB9Ci0gIHZhbHVlX2NvbXBhcmUgdmFsdWVfY29tcCgpIGNvbnN0IHsgcmV0dXJuIF9NX3Qua2V5X2NvbXAoKTsgfQotICBhbGxvY2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9yKCkgY29uc3QgeyByZXR1cm4gX01fdC5nZXRfYWxsb2NhdG9yKCk7IH0KLQotICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIF9NX3QuYmVnaW4oKTsgfQotICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBfTV90LmVuZCgpOyB9Ci0gIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gX01fdC5iZWdpbigpOyB9Ci0gIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIF9NX3QuZW5kKCk7IH0KLSAgcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSB7IHJldHVybiBfTV90LnJiZWdpbigpOyB9Ci0gIHJldmVyc2VfaXRlcmF0b3IgcmVuZCgpIHsgcmV0dXJuIF9NX3QucmVuZCgpOyB9Ci0gIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3QgeyByZXR1cm4gX01fdC5yYmVnaW4oKTsgfQotICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSBjb25zdCB7IHJldHVybiBfTV90LnJlbmQoKTsgfQotICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gX01fdC5lbXB0eSgpOyB9Ci0gIHNpemVfdHlwZSBzaXplKCkgY29uc3QgeyByZXR1cm4gX01fdC5zaXplKCk7IH0KLSAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgeyByZXR1cm4gX01fdC5tYXhfc2l6ZSgpOyB9Ci0gIHZvaWQgc3dhcChfU2VsZiYgX194KSB7IF9NX3Quc3dhcChfX3guX01fdCk7IH0KLQotICAvLyBpbnNlcnQvZXJhc2UKLSAgcGFpcjxpdGVyYXRvcixib29sPiBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX194KQotICB7IHJldHVybiBfTV90Lmluc2VydF91bmlxdWUoX194KTsgfQotICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKLSAgeyByZXR1cm4gX01fdC5pbnNlcnRfdW5pcXVlKCBfX3BvcyAsIF9feCk7IH0KLSNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Ci0gIHZvaWQgaW5zZXJ0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKLSAgeyBfTV90Lmluc2VydF91bmlxdWUoX19maXJzdCwgX19sYXN0KTsgfQotI2Vsc2UKLSAgdm9pZCBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KQotICB7IF9NX3QuaW5zZXJ0X3VuaXF1ZShfX2ZpcnN0LCBfX2xhc3QpOyB9Ci0gIHZvaWQgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUqIF9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbGFzdCkKLSAgeyBfTV90Lmluc2VydF91bmlxdWUoX19maXJzdCwgX19sYXN0KTsgfQotI2VuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KLSAgdm9pZCBlcmFzZShpdGVyYXRvciBfX3BvcykgeyBfTV90LmVyYXNlKCBfX3BvcyApOyB9Ci0gIHNpemVfdHlwZSBlcmFzZShjb25zdCBrZXlfdHlwZSYgX194KSB7IHJldHVybiBfTV90LmVyYXNlX3VuaXF1ZShfX3gpOyB9Ci0gIHZvaWQgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KSB7IF9NX3QuZXJhc2UoX19maXJzdCwgX19sYXN0ICk7IH0KLSAgdm9pZCBjbGVhcigpIHsgX01fdC5jbGVhcigpOyB9Ci0KLSAgLy8gc2V0IG9wZXJhdGlvbnM6Ci0gIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAotICBjb25zdF9pdGVyYXRvciBmaW5kKGNvbnN0IF9LVCYgX194KSBjb25zdCB7IHJldHVybiBfTV90LmZpbmQoX194KTsgfQotICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKLSAgaXRlcmF0b3IgZmluZChjb25zdCBfS1QmIF9feCkgeyByZXR1cm4gX01fdC5maW5kKF9feCk7IH0KLSAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0gIHNpemVfdHlwZSBjb3VudChjb25zdCBfS1QmIF9feCkgY29uc3QKLSAgeyByZXR1cm4gX01fdC5maW5kKF9feCkgPT0gX01fdC5lbmQoKSA/IDAgOiAxIDsgfQotICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKLSAgaXRlcmF0b3IgbG93ZXJfYm91bmQoY29uc3QgX0tUJiBfX3gpIHsgcmV0dXJuIF9NX3QubG93ZXJfYm91bmQoX194KTsgfQotICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKLSAgY29uc3RfaXRlcmF0b3IgbG93ZXJfYm91bmQoY29uc3QgX0tUJiBfX3gpIGNvbnN0IHsgcmV0dXJuIF9NX3QubG93ZXJfYm91bmQoX194KTsgfQotICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKLSAgaXRlcmF0b3IgdXBwZXJfYm91bmQoY29uc3QgX0tUJiBfX3gpIHsgcmV0dXJuIF9NX3QudXBwZXJfYm91bmQoX194KTsgfQotICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKLSAgY29uc3RfaXRlcmF0b3IgdXBwZXJfYm91bmQoY29uc3QgX0tUJiBfX3gpIGNvbnN0IHsgcmV0dXJuIF9NX3QudXBwZXJfYm91bmQoX194KTsgfQotICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKLSAgcGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+IGVxdWFsX3JhbmdlKGNvbnN0IF9LVCYgX194KQotICB7IHJldHVybiBfTV90LmVxdWFsX3JhbmdlX3VuaXF1ZShfX3gpOyB9Ci0gIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAotICBwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4gZXF1YWxfcmFuZ2UoY29uc3QgX0tUJiBfX3gpIGNvbnN0Ci0gIHsgcmV0dXJuIF9NX3QuZXF1YWxfcmFuZ2VfdW5pcXVlKF9feCk7IH0KLX07Ci0KLS8vU3BlY2lmaWMgaXRlcmF0b3IgdHJhaXRzIGNyZWF0aW9uCi1fU1RMUF9DUkVBVEVfSVRFUkFUT1JfVFJBSVRTKE11bHRpc2V0VHJhaXRzVCwgQ29uc3RfdHJhaXRzKQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgX1NUTFBfREZMX1RNUExfUEFSQU0oX0NvbXBhcmUsIGxlc3M8X0tleT4pLAotICAgICAgICAgIF9TVExQX0RFRkFVTFRfQUxMT0NBVE9SX1NFTEVDVChfS2V5KSA+Ci1jbGFzcyBtdWx0aXNldAotI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QQVJUSUFMX1NQRUNfV09SS0FST1VORCkKLSAgICAgICAgICAgICAgIDogcHVibGljIF9fc3RscG9ydF9jbGFzczxtdWx0aXNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jPiA+Ci0jZW5kaWYKLXsKLSAgdHlwZWRlZiBtdWx0aXNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jPiBfU2VsZjsKLXB1YmxpYzoKLSAgLy8gdHlwZWRlZnM6Ci0KLSAgdHlwZWRlZiBfS2V5ICAgICBrZXlfdHlwZTsKLSAgdHlwZWRlZiBfS2V5ICAgICB2YWx1ZV90eXBlOwotICB0eXBlZGVmIF9Db21wYXJlIGtleV9jb21wYXJlOwotICB0eXBlZGVmIF9Db21wYXJlIHZhbHVlX2NvbXBhcmU7Ci0KLXByaXZhdGU6Ci0gIC8vU3BlY2lmaWMgaXRlcmF0b3IgdHJhaXRzIGNyZWF0aW9uCi0gIHR5cGVkZWYgX1NUTFBfUFJJViBfTXVsdGlzZXRUcmFpdHNUPHZhbHVlX3R5cGU+IF9NdWx0aXNldFRyYWl0czsKLQotcHVibGljOgotICAvL0ZvbGxvd2luZyB0eXBlZGVmIGhhdmUgdG8gYmUgcHVibGljIGZvciBfX21vdmVfdHJhaXRzIHNwZWNpYWxpemF0aW9uLgotICB0eXBlZGVmIF9TVExQX1BSSVYgX1JiX3RyZWU8a2V5X3R5cGUsIGtleV9jb21wYXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZSwgX1NUTFBfUFJJViBfSWRlbnRpdHk8dmFsdWVfdHlwZT4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTXVsdGlzZXRUcmFpdHMsIF9BbGxvYz4gX1JlcF90eXBlOwotCi0gIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpwb2ludGVyIHBvaW50ZXI7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpjb25zdF9wb2ludGVyIGNvbnN0X3BvaW50ZXI7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpyZWZlcmVuY2UgcmVmZXJlbmNlOwotICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6Oml0ZXJhdG9yIGl0ZXJhdG9yOwotICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpyZXZlcnNlX2l0ZXJhdG9yIHJldmVyc2VfaXRlcmF0b3I7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpzaXplX3R5cGUgc2l6ZV90eXBlOwotICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OmFsbG9jYXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOwotCi1wcml2YXRlOgotICBfUmVwX3R5cGUgX01fdDsgIC8vIHJlZC1ibGFjayB0cmVlIHJlcHJlc2VudGluZyBtdWx0aXNldAotICBfU1RMUF9LRVlfVFlQRV9GT1JfQ09OVF9FWFQoa2V5X3R5cGUpCi0KLXB1YmxpYzoKLSNpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKLSAgZXhwbGljaXQgbXVsdGlzZXQoY29uc3QgX0NvbXBhcmUmIF9fY29tcCA9IF9Db21wYXJlKCksCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQotI2Vsc2UKLSAgbXVsdGlzZXQoKQotICAgIDogX01fdChfQ29tcGFyZSgpLCBhbGxvY2F0b3JfdHlwZSgpKSB7fQotICBleHBsaWNpdCBtdWx0aXNldChjb25zdCBfQ29tcGFyZSYgX19jb21wKQotICAgIDogX01fdChfX2NvbXAsIGFsbG9jYXRvcl90eXBlKCkpIHt9Ci0gIG11bHRpc2V0KGNvbnN0IF9Db21wYXJlJiBfX2NvbXAsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCi0jZW5kaWYKLSAgICA6IF9NX3QoX19jb21wLCBfX2EpIHt9Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Ci0gIG11bHRpc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKLSAgICA6IF9NX3QoX0NvbXBhcmUoKSwgYWxsb2NhdG9yX3R5cGUoKSkKLSAgICB7IF9NX3QuaW5zZXJ0X2VxdWFsKF9fZmlyc3QsIF9fbGFzdCk7IH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Ci0gIG11bHRpc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKLSAgICAgICAgICAgY29uc3QgX0NvbXBhcmUmIF9fY29tcCwKLSAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSBfU1RMUF9BTExPQ0FUT1JfVFlQRV9ERkwpCi0gICAgOiBfTV90KF9fY29tcCwgX19hKSB7IF9NX3QuaW5zZXJ0X2VxdWFsKF9fZmlyc3QsIF9fbGFzdCk7IH0KLSMgIGlmIGRlZmluZWQgKF9TVExQX05FRURTX0VYVFJBX1RFTVBMQVRFX0NPTlNUUlVDVE9SUykKLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgotICBtdWx0aXNldChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCi0gICAgICAgICAgIGNvbnN0IF9Db21wYXJlJiBfX2NvbXApCi0gICAgOiBfTV90KF9fY29tcCwgYWxsb2NhdG9yX3R5cGUoKSkgeyBfTV90Lmluc2VydF9lcXVhbChfX2ZpcnN0LCBfX2xhc3QpOyB9Ci0jICBlbmRpZgotI2Vsc2UKLSAgbXVsdGlzZXQoY29uc3QgdmFsdWVfdHlwZSogX19maXJzdCwgY29uc3QgdmFsdWVfdHlwZSogX19sYXN0KQotICAgIDogX01fdChfQ29tcGFyZSgpLCBhbGxvY2F0b3JfdHlwZSgpKQotICAgIHsgX01fdC5pbnNlcnRfZXF1YWwoX19maXJzdCwgX19sYXN0KTsgfQotCi0gIG11bHRpc2V0KGNvbnN0IHZhbHVlX3R5cGUqIF9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbGFzdCwKLSAgICAgICAgICAgY29uc3QgX0NvbXBhcmUmIF9fY29tcCwKLSAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCi0gICAgOiBfTV90KF9fY29tcCwgX19hKSB7IF9NX3QuaW5zZXJ0X2VxdWFsKF9fZmlyc3QsIF9fbGFzdCk7IH0KLQotICBtdWx0aXNldChjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpCi0gICAgOiBfTV90KF9Db21wYXJlKCksIGFsbG9jYXRvcl90eXBlKCkpCi0gICAgeyBfTV90Lmluc2VydF9lcXVhbChfX2ZpcnN0LCBfX2xhc3QpOyB9Ci0KLSAgbXVsdGlzZXQoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0LAotICAgICAgICAgICBjb25zdCBfQ29tcGFyZSYgX19jb21wLAotICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKLSAgICA6IF9NX3QoX19jb21wLCBfX2EpIHsgX01fdC5pbnNlcnRfZXF1YWwoX19maXJzdCwgX19sYXN0KTsgfQotI2VuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KLQotICBtdWx0aXNldChjb25zdCBfU2VsZiYgX194KSA6IF9NX3QoX194Ll9NX3QpIHt9Ci0gIF9TZWxmJiBvcGVyYXRvcj0oY29uc3QgX1NlbGYmIF9feCkgewotICAgIF9NX3QgPSBfX3guX01fdDsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBtdWx0aXNldChfX21vdmVfc291cmNlPF9TZWxmPiBzcmMpCi0gICAgOiBfTV90KF9fbW92ZV9zb3VyY2U8X1JlcF90eXBlPihzcmMuZ2V0KCkuX01fdCkpIHt9Ci0KLSAgLy8gYWNjZXNzb3JzOgotICBrZXlfY29tcGFyZSBrZXlfY29tcCgpIGNvbnN0IHsgcmV0dXJuIF9NX3Qua2V5X2NvbXAoKTsgfQotICB2YWx1ZV9jb21wYXJlIHZhbHVlX2NvbXAoKSBjb25zdCB7IHJldHVybiBfTV90LmtleV9jb21wKCk7IH0KLSAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IHsgcmV0dXJuIF9NX3QuZ2V0X2FsbG9jYXRvcigpOyB9Ci0KLSAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBfTV90LmJlZ2luKCk7IH0KLSAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gX01fdC5lbmQoKTsgfQotICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIF9NX3QuYmVnaW4oKTsgfQotICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBfTV90LmVuZCgpOyB9Ci0gIHJldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgeyByZXR1cm4gX01fdC5yYmVnaW4oKTsgfQotICByZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSB7IHJldHVybiBfTV90LnJlbmQoKTsgfQotICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0IHsgcmV0dXJuIF9NX3QucmJlZ2luKCk7IH0KLSAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgY29uc3QgeyByZXR1cm4gX01fdC5yZW5kKCk7IH0KLSAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIF9NX3QuZW1wdHkoKTsgfQotICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX3Quc2l6ZSgpOyB9Ci0gIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX3QubWF4X3NpemUoKTsgfQotICB2b2lkIHN3YXAoX1NlbGYmIF9feCkgeyBfTV90LnN3YXAoX194Ll9NX3QpOyB9Ci0KLSAgLy8gaW5zZXJ0L2VyYXNlCi0gIGl0ZXJhdG9yIGluc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX3gpCi0gIHsgcmV0dXJuIF9NX3QuaW5zZXJ0X2VxdWFsKF9feCk7IH0KLSAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCi0gIHsgcmV0dXJuIF9NX3QuaW5zZXJ0X2VxdWFsKF9fcG9zLCBfX3gpOyB9Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Ci0gIHZvaWQgaW5zZXJ0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKLSAgeyBfTV90Lmluc2VydF9lcXVhbChfX2ZpcnN0LCBfX2xhc3QpOyB9Ci0jZWxzZQotICB2b2lkIGluc2VydChjb25zdCB2YWx1ZV90eXBlKiBfX2ZpcnN0LCBjb25zdCB2YWx1ZV90eXBlKiBfX2xhc3QpCi0gIHsgX01fdC5pbnNlcnRfZXF1YWwoX19maXJzdCwgX19sYXN0KTsgfQotICB2b2lkIGluc2VydChjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpCi0gIHsgX01fdC5pbnNlcnRfZXF1YWwoX19maXJzdCwgX19sYXN0KTsgfQotI2VuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KLSAgdm9pZCBlcmFzZShpdGVyYXRvciBfX3BvcykgeyBfTV90LmVyYXNlKCBfX3BvcyApOyB9Ci0gIHNpemVfdHlwZSBlcmFzZShjb25zdCBrZXlfdHlwZSYgX194KSB7IHJldHVybiBfTV90LmVyYXNlKF9feCk7IH0KLSAgdm9pZCBlcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpIHsgX01fdC5lcmFzZSggX19maXJzdCwgX19sYXN0ICk7IH0KLSAgdm9pZCBjbGVhcigpIHsgX01fdC5jbGVhcigpOyB9Ci0KLSAgLy8gbXVsdGlzZXQgb3BlcmF0aW9uczoKLSAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0gIGl0ZXJhdG9yIGZpbmQoY29uc3QgX0tUJiBfX3gpIHsgcmV0dXJuIF9NX3QuZmluZChfX3gpOyB9Ci0gIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAotICBjb25zdF9pdGVyYXRvciBmaW5kKGNvbnN0IF9LVCYgX194KSBjb25zdCB7IHJldHVybiBfTV90LmZpbmQoX194KTsgfQotICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKLSAgc2l6ZV90eXBlIGNvdW50KGNvbnN0IF9LVCYgX194KSBjb25zdCB7IHJldHVybiBfTV90LmNvdW50KF9feCk7IH0KLSAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0gIGl0ZXJhdG9yIGxvd2VyX2JvdW5kKGNvbnN0IF9LVCYgX194KSB7IHJldHVybiBfTV90Lmxvd2VyX2JvdW5kKF9feCk7IH0KLSAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0gIGNvbnN0X2l0ZXJhdG9yIGxvd2VyX2JvdW5kKGNvbnN0IF9LVCYgX194KSBjb25zdCB7IHJldHVybiBfTV90Lmxvd2VyX2JvdW5kKF9feCk7IH0KLSAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0gIGl0ZXJhdG9yIHVwcGVyX2JvdW5kKGNvbnN0IF9LVCYgX194KSB7IHJldHVybiBfTV90LnVwcGVyX2JvdW5kKF9feCk7IH0KLSAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0gIGNvbnN0X2l0ZXJhdG9yIHVwcGVyX2JvdW5kKGNvbnN0IF9LVCYgX194KSBjb25zdCB7IHJldHVybiBfTV90LnVwcGVyX2JvdW5kKF9feCk7IH0KLSAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0gIHBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPiBlcXVhbF9yYW5nZShjb25zdCBfS1QmIF9feCkgeyByZXR1cm4gX01fdC5lcXVhbF9yYW5nZShfX3gpOyB9Ci0gIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAotICBwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4gZXF1YWxfcmFuZ2UoY29uc3QgX0tUJiBfX3gpIGNvbnN0IHsgcmV0dXJuIF9NX3QuZXF1YWxfcmFuZ2UoX194KTsgfQotfTsKLQotI2Vsc2UKLSMgIGluY2x1ZGUgPHN0bC9wb2ludGVycy9fc2V0Lmg+Ci1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLSNlbmRpZiAvKiBfU1RMUF9VU0VfUFRSX1NQRUNJQUxJWkFUSU9OUyAqLwotCi0jZGVmaW5lIF9TVExQX1RFTVBMQVRFX0hFQURFUiB0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvYz4KLSNkZWZpbmUgX1NUTFBfVEVNUExBVEVfQ09OVEFJTkVSIHNldDxfS2V5LF9Db21wYXJlLF9BbGxvYz4KLSNpbmNsdWRlIDxzdGwvX3JlbG9wc19jb250Lmg+Ci0jdW5kZWYgIF9TVExQX1RFTVBMQVRFX0NPTlRBSU5FUgotI2RlZmluZSBfU1RMUF9URU1QTEFURV9DT05UQUlORVIgbXVsdGlzZXQ8X0tleSxfQ29tcGFyZSxfQWxsb2M+Ci0jaW5jbHVkZSA8c3RsL19yZWxvcHNfY29udC5oPgotI3VuZGVmICBfU1RMUF9URU1QTEFURV9DT05UQUlORVIKLSN1bmRlZiAgX1NUTFBfVEVNUExBVEVfSEVBREVSCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQotdGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2M+Ci1zdHJ1Y3QgX19tb3ZlX3RyYWl0czxzZXQ8X0tleSxfQ29tcGFyZSxfQWxsb2M+ID4gOgotICBfU1RMUF9QUklWIF9fbW92ZV90cmFpdHNfYXV4PHR5cGVuYW1lIHNldDxfS2V5LF9Db21wYXJlLF9BbGxvYz46Ol9SZXBfdHlwZT4KLXt9OwotCi10ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvYz4KLXN0cnVjdCBfX21vdmVfdHJhaXRzPG11bHRpc2V0PF9LZXksX0NvbXBhcmUsX0FsbG9jPiA+IDoKLSAgX1NUTFBfUFJJViBfX21vdmVfdHJhaXRzX2F1eDx0eXBlbmFtZSBtdWx0aXNldDxfS2V5LF9Db21wYXJlLF9BbGxvYz46Ol9SZXBfdHlwZT4KLXt9OwotI2VuZGlmIC8qIF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04gKi8KLQotX1NUTFBfRU5EX05BTUVTUEFDRQotCi0jZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfU0VUX0ggKi8KLQotLy8gTG9jYWwgVmFyaWFibGVzOgotLy8gbW9kZTpDKysKLS8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9fc2xpc3QuaCBiL3N0bC9fc2xpc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBkOTQxYS4uMDAwMDAwMAotLS0gYS9zdGwvX3NsaXN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MDYgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NwotICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk3Ci0gKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5Ci0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLQotLyogTk9URTogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgU1RMIGhlYWRlcnMuCi0gKiAgIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LgotICovCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfU0xJU1RfSAotI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9TTElTVF9ICi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQUxHT0JBU0VfSAotIyAgaW5jbHVkZSA8c3RsL19hbGdvYmFzZS5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQUxMT0NfSAotIyAgaW5jbHVkZSA8c3RsL19hbGxvYy5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfSVRFUkFUT1JfSAotIyAgaW5jbHVkZSA8c3RsL19pdGVyYXRvci5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ09OU1RSVUNUX0gKLSMgIGluY2x1ZGUgPHN0bC9fY29uc3RydWN0Lmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9GVU5DVElPTl9CQVNFX0gKLSMgIGluY2x1ZGUgPHN0bC9fZnVuY3Rpb25fYmFzZS5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfU0xJU1RfQkFTRV9ICi0jICBpbmNsdWRlIDxzdGwvX3NsaXN0X2Jhc2UuaD4KLSNlbmRpZgotCi1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLQotX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotY2xhc3MgX1NsaXN0X25vZGUgOiBwdWJsaWMgX1NsaXN0X25vZGVfYmFzZSB7Ci1wdWJsaWM6Ci0gIF9UcCBfTV9kYXRhOwotICBfX1RSSVZJQUxfU1RVRkYoX1NsaXN0X25vZGUpCi19OwotCi1zdHJ1Y3QgX1NsaXN0X2l0ZXJhdG9yX2Jhc2UgewotICB0eXBlZGVmIHNpemVfdCAgICAgICAgICAgICAgIHNpemVfdHlwZTsKLSAgdHlwZWRlZiBwdHJkaWZmX3QgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7Ci0gIHR5cGVkZWYgZm9yd2FyZF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7Ci0KLSAgX1NsaXN0X25vZGVfYmFzZSAqX01fbm9kZTsKLQotICBfU2xpc3RfaXRlcmF0b3JfYmFzZShfU2xpc3Rfbm9kZV9iYXNlICpfX3gpIDogX01fbm9kZShfX3gpIHt9Ci0KLSAgdm9pZCBfTV9pbmNyKCkgewotICAgIF9NX25vZGUgPSBfTV9ub2RlLT5fTV9uZXh0OwotICB9Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVHJhaXRzPgotY2xhc3MgX1NsaXN0X2l0ZXJhdG9yIDogcHVibGljIF9TbGlzdF9pdGVyYXRvcl9iYXNlIHsKLXB1YmxpYzoKLSAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6cG9pbnRlciAgICBwb2ludGVyOwotICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OnJlZmVyZW5jZSAgcmVmZXJlbmNlOwotICB0eXBlZGVmIGZvcndhcmRfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OwotICB0eXBlZGVmIHNpemVfdCBzaXplX3R5cGU7Ci0gIHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKLQotICB0eXBlZGVmIF9TbGlzdF9pdGVyYXRvcjxfVHAsIF9UcmFpdHM+ICAgICAgICAgX1NlbGY7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6X05vbkNvbnN0VHJhaXRzICAgICBfTm9uQ29uc3RUcmFpdHM7Ci0gIHR5cGVkZWYgX1NsaXN0X2l0ZXJhdG9yPF9UcCwgX05vbkNvbnN0VHJhaXRzPiBpdGVyYXRvcjsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpfQ29uc3RUcmFpdHMgICAgICAgIF9Db25zdFRyYWl0czsKLSAgdHlwZWRlZiBfU2xpc3RfaXRlcmF0b3I8X1RwLCBfQ29uc3RUcmFpdHM+ICAgIGNvbnN0X2l0ZXJhdG9yOwotCi0gIHR5cGVkZWYgX1NsaXN0X25vZGU8dmFsdWVfdHlwZT4gX05vZGU7Ci0KLSAgZXhwbGljaXQgX1NsaXN0X2l0ZXJhdG9yKF9TbGlzdF9ub2RlX2Jhc2UgKl9feCkgOiBfU2xpc3RfaXRlcmF0b3JfYmFzZShfX3gpIHt9Ci0gIF9TbGlzdF9pdGVyYXRvcigpIDogX1NsaXN0X2l0ZXJhdG9yX2Jhc2UoMCkge30KLSAgLy9jb3B5IGNvbnN0cnVjdG9yIGZvciBpdGVyYXRvciBhbmQgY29uc3RydWN0b3IgZnJvbSBpdGVyYXRvciBmb3IgY29uc3RfaXRlcmF0b3IKLSAgX1NsaXN0X2l0ZXJhdG9yKGNvbnN0IGl0ZXJhdG9yJiBfX3gpIDogX1NsaXN0X2l0ZXJhdG9yX2Jhc2UoX194Ll9NX25vZGUpIHt9Ci0KLSAgcmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIF9fU1RBVElDX0NBU1QoX05vZGUqLCB0aGlzLT5fTV9ub2RlKS0+X01fZGF0YTsgfQotCi0gIF9TVExQX0RFRklORV9BUlJPV19PUEVSQVRPUgotCi0gIF9TZWxmJiBvcGVyYXRvcisrKCkgewotICAgIF9NX2luY3IoKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgX1NlbGYgb3BlcmF0b3IrKyhpbnQpIHsKLSAgICBfU2VsZiBfX3RtcCA9ICp0aGlzOwotICAgIF9NX2luY3IoKTsKLSAgICByZXR1cm4gX190bXA7Ci0gIH0KLQotICBib29sIG9wZXJhdG9yPT0oY29uc3RfaXRlcmF0b3IgX195ICkgY29uc3QgewotICAgIHJldHVybiB0aGlzLT5fTV9ub2RlID09IF9feS5fTV9ub2RlOwotICB9Ci0gIGJvb2wgb3BlcmF0b3IhPShjb25zdF9pdGVyYXRvciBfX3kgKSBjb25zdCB7Ci0gICAgcmV0dXJuIHRoaXMtPl9NX25vZGUgIT0gX195Ll9NX25vZGU7Ci0gIH0KLX07Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVHJhaXRzPgotc3RydWN0IF9fdHlwZV90cmFpdHM8X1NUTFBfUFJJViBfU2xpc3RfaXRlcmF0b3I8X1RwLCBfVHJhaXRzPiA+IHsKLSAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgICBoYXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yOwotICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2NvcHlfY29uc3RydWN0b3I7Ci0gIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfYXNzaWdubWVudF9vcGVyYXRvcjsKLSAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9kZXN0cnVjdG9yOwotICB0eXBlZGVmIF9fZmFsc2VfdHlwZSAgIGlzX1BPRF90eXBlOwotfTsKLV9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKLSNlbmRpZiAvKiBfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OICovCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfT0xEX0hQX0lURVJBVE9SX1FVRVJJRVMpCi1fU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKLXRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9UcmFpdHM+Ci1pbmxpbmUgX1RwKiBfU1RMUF9DQUxMIHZhbHVlX3R5cGUoY29uc3QgX1NUTFBfUFJJViBfU2xpc3RfaXRlcmF0b3I8X1RwLCBfVHJhaXRzPiYpIHsgcmV0dXJuIF9fU1RBVElDX0NBU1QoX1RwKiwgMCk7IH0KLWlubGluZSBwdHJkaWZmX3QqIF9TVExQX0NBTEwgZGlzdGFuY2VfdHlwZShjb25zdCBfU1RMUF9QUklWIF9TbGlzdF9pdGVyYXRvcl9iYXNlJikgeyByZXR1cm4gMDsgfQotaW5saW5lIGZvcndhcmRfaXRlcmF0b3JfdGFnIF9TVExQX0NBTEwgaXRlcmF0b3JfY2F0ZWdvcnkoY29uc3QgX1NUTFBfUFJJViBfU2xpc3RfaXRlcmF0b3JfYmFzZSYpIHsgcmV0dXJuIGZvcndhcmRfaXRlcmF0b3JfdGFnKCk7IH0KLV9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKLSNlbmRpZiAvKiBPTERfUVVFUklFUyAqLwotCi0vLyBCYXNlIGNsYXNzIHRoYXQgZW5jYXBzdWxhdGVzIGRldGFpbHMgb2YgYWxsb2NhdG9ycyBhbmQgc2ltcGxpZmllcyBFSAotdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgotY2xhc3MgX1NsaXN0X2Jhc2UgewotcHJvdGVjdGVkOgotICB0eXBlZGVmIF9TbGlzdF9ub2RlPF9UcD4gX05vZGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jX3RyYWl0czxfTm9kZSxfQWxsb2M+OjphbGxvY2F0b3JfdHlwZSBfTV9ub2RlX2FsbG9jYXRvcl90eXBlOwotICB0eXBlZGVmIF9TbGlzdF9iYXNlPF9UcCwgX0FsbG9jPiBfU2VsZjsKLQotcHVibGljOgotICB0eXBlZGVmIF9TVExQX2FsbG9jX3Byb3h5PF9TbGlzdF9ub2RlX2Jhc2UsIF9Ob2RlLCBfTV9ub2RlX2FsbG9jYXRvcl90eXBlPiBfQWxsb2NQcm94eTsKLQotICBfU1RMUF9GT1JDRV9BTExPQ0FUT1JTKF9UcCwgX0FsbG9jKQotICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY190cmFpdHM8X1RwLF9BbGxvYz46OmFsbG9jYXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOwotCi0gIF9TbGlzdF9iYXNlKGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpIDoKLSAgICBfTV9oZWFkKF9TVExQX0NPTlZFUlRfQUxMT0NBVE9SKF9fYSwgX05vZGUpLCBfU2xpc3Rfbm9kZV9iYXNlKCkgKSB7Ci0gICAgX01faGVhZC5fTV9kYXRhLl9NX25leHQgPSAwOwotICB9Ci0gIF9TbGlzdF9iYXNlKF9fbW92ZV9zb3VyY2U8X1NlbGY+IHNyYykgOgotICAgIF9NX2hlYWQoX19tb3ZlX3NvdXJjZTxfQWxsb2NQcm94eT4oc3JjLmdldCgpLl9NX2hlYWQpKSB7Ci0gICAgICBzcmMuZ2V0KCkuX01faGVhZC5fTV9kYXRhLl9NX25leHQgPSAwOwotICB9Ci0gIH5fU2xpc3RfYmFzZSgpIHsgX01fZXJhc2VfYWZ0ZXIoJl9NX2hlYWQuX01fZGF0YSwgMCk7IH0KLQotcHJvdGVjdGVkOgotICBfU2xpc3Rfbm9kZV9iYXNlKiBfTV9lcmFzZV9hZnRlcihfU2xpc3Rfbm9kZV9iYXNlKiBfX3BvcykgewotICAgIF9Ob2RlKiBfX25leHQgPSBfX1NUQVRJQ19DQVNUKF9Ob2RlKiwgX19wb3MtPl9NX25leHQpOwotICAgIF9TbGlzdF9ub2RlX2Jhc2UqIF9fbmV4dF9uZXh0ID0gX19uZXh0LT5fTV9uZXh0OwotICAgIF9fcG9zLT5fTV9uZXh0ID0gX19uZXh0X25leHQ7Ci0gICAgX1NUTFBfU1REOjpfRGVzdHJveSgmX19uZXh0LT5fTV9kYXRhKTsKLSAgICBfTV9oZWFkLmRlYWxsb2NhdGUoX19uZXh0LDEpOwotICAgIHJldHVybiBfX25leHRfbmV4dDsKLSAgfQotICBfU2xpc3Rfbm9kZV9iYXNlKiBfTV9lcmFzZV9hZnRlcihfU2xpc3Rfbm9kZV9iYXNlKiwgX1NsaXN0X25vZGVfYmFzZSopOwotCi1wdWJsaWM6Ci0gIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdAotICB7IHJldHVybiBfU1RMUF9DT05WRVJUX0FMTE9DQVRPUigoY29uc3QgX01fbm9kZV9hbGxvY2F0b3JfdHlwZSYpX01faGVhZCwgX1RwKTsgfQotICBfQWxsb2NQcm94eSBfTV9oZWFkOwotfTsKLQotI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QVFJfU1BFQ0lBTElaQVRJT05TKQotIyAgZGVmaW5lIHNsaXN0IF9TVExQX1BUUl9JTVBMX05BTUUoc2xpc3QpCi0jZWxpZiBkZWZpbmVkIChfU1RMUF9ERUJVRykKLSMgIGRlZmluZSBzbGlzdCBfU1RMUF9OT05fREJHX05BTUUoc2xpc3QpCi0jZWxzZQotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi0jZW5kaWYKLQotdGVtcGxhdGUgPGNsYXNzIF9UcCwgX1NUTFBfREVGQVVMVF9BTExPQ0FUT1JfU0VMRUNUKF9UcCkgPgotY2xhc3Mgc2xpc3Q7Ci0KLSNpZiAhZGVmaW5lZCAoc2xpc3QpCi1fU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCi0jZW5kaWYKLQotLy8gaGVscGVyIGZ1bmN0aW9ucyB0byByZWR1Y2UgY29kZSBkdXBsaWNhdGlvbgotdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jLCBjbGFzcyBfQmluYXJ5UHJlZGljYXRlPgotdm9pZCBfU2xpc3RfdW5pcXVlKHNsaXN0PF9UcCwgX0FsbG9jPiYgX190aGF0LCBfQmluYXJ5UHJlZGljYXRlIF9fYmluYXJ5X3ByZWQpOwotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2MsIGNsYXNzIF9TdHJpY3RXZWFrT3JkZXJpbmc+Ci12b2lkIF9TbGlzdF9tZXJnZShzbGlzdDxfVHAsIF9BbGxvYz4mIF9fdGhhdCwgc2xpc3Q8X1RwLCBfQWxsb2M+JiBfX3gsCi0gICAgICAgICAgICAgICAgICBfU3RyaWN0V2Vha09yZGVyaW5nIF9fY29tcCk7Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYywgY2xhc3MgX1N0cmljdFdlYWtPcmRlcmluZz4KLXZvaWQgX1NsaXN0X3NvcnQoc2xpc3Q8X1RwLCBfQWxsb2M+JiBfX3RoYXQsIF9TdHJpY3RXZWFrT3JkZXJpbmcgX19jb21wKTsKLQotI2lmICFkZWZpbmVkIChzbGlzdCkKLV9TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQotI2VuZGlmCi0KLXRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KLWNsYXNzIHNsaXN0IDogcHJvdGVjdGVkIF9TVExQX1BSSVYgX1NsaXN0X2Jhc2U8X1RwLF9BbGxvYz4KLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUEFSVElBTF9TUEVDX1dPUktBUk9VTkQpICYmICFkZWZpbmVkIChzbGlzdCkKLSAgICAgICAgICAgICwgcHVibGljIF9fc3RscG9ydF9jbGFzczxzbGlzdDxfVHAsIF9BbGxvYz4gPgotI2VuZGlmCi17Ci1wcml2YXRlOgotICB0eXBlZGVmIF9TVExQX1BSSVYgX1NsaXN0X2Jhc2U8X1RwLF9BbGxvYz4gX0Jhc2U7Ci0gIHR5cGVkZWYgc2xpc3Q8X1RwLF9BbGxvYz4gX1NlbGY7Ci1wdWJsaWM6Ci0gIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7Ci0KLSAgdHlwZWRlZiB2YWx1ZV90eXBlKiAgICAgICBwb2ludGVyOwotICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUqIGNvbnN0X3BvaW50ZXI7Ci0gIHR5cGVkZWYgdmFsdWVfdHlwZSYgICAgICAgcmVmZXJlbmNlOwotICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmIGNvbnN0X3JlZmVyZW5jZTsKLSAgdHlwZWRlZiBzaXplX3QgICAgICAgICAgICBzaXplX3R5cGU7Ci0gIHR5cGVkZWYgcHRyZGlmZl90ICAgICAgICAgZGlmZmVyZW5jZV90eXBlOwotICB0eXBlZGVmIGZvcndhcmRfaXRlcmF0b3JfdGFnIF9JdGVyYXRvcl9jYXRlZ29yeTsKLQotICB0eXBlZGVmIF9TVExQX1BSSVYgX1NsaXN0X2l0ZXJhdG9yPF9UcCwgX05vbmNvbnN0X3RyYWl0czxfVHA+ID4gaXRlcmF0b3I7Ci0gIHR5cGVkZWYgX1NUTFBfUFJJViBfU2xpc3RfaXRlcmF0b3I8X1RwLCBfQ29uc3RfdHJhaXRzPF9UcD4gPiAgICBjb25zdF9pdGVyYXRvcjsKLQotICBfU1RMUF9GT1JDRV9BTExPQ0FUT1JTKF9UcCwgX0FsbG9jKQotICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKLQotcHJpdmF0ZToKLSAgdHlwZWRlZiBfU1RMUF9QUklWIF9TbGlzdF9ub2RlPF9UcD4gX05vZGU7Ci0gIHR5cGVkZWYgX1NUTFBfUFJJViBfU2xpc3Rfbm9kZV9iYXNlIF9Ob2RlX2Jhc2U7Ci0KLSNpZiAhZGVmaW5lZChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQotICBfTm9kZSogX01fY3JlYXRlX25vZGUoY29uc3QgdmFsdWVfdHlwZSYgX194ID0gX1RwKCkpIHsKLSNlbHNlCi0gIF9Ob2RlKiBfTV9jcmVhdGVfbm9kZShjb25zdCB2YWx1ZV90eXBlJiBfX3gpIHsKLSNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0qLwotICAgIF9Ob2RlKiBfX25vZGUgPSB0aGlzLT5fTV9oZWFkLmFsbG9jYXRlKDEpOwotICAgIF9TVExQX1RSWSB7Ci0gICAgICBfQ29weV9Db25zdHJ1Y3QoJl9fbm9kZS0+X01fZGF0YSwgX194KTsKLSAgICAgIF9fbm9kZS0+X01fbmV4dCA9IDA7Ci0gICAgfQotICAgIF9TVExQX1VOV0lORCh0aGlzLT5fTV9oZWFkLmRlYWxsb2NhdGUoX19ub2RlLCAxKSkKLSAgICByZXR1cm4gX19ub2RlOwotICB9Ci0KLSNpZiBkZWZpbmVkKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCi0gIF9Ob2RlKiBfTV9jcmVhdGVfbm9kZSgpIHsKLSAgICBfTm9kZSogX19ub2RlID0gdGhpcy0+X01faGVhZC5hbGxvY2F0ZSgxKTsKLSAgICBfU1RMUF9UUlkgewotICAgICAgX1NUTFBfU1REOjpfQ29uc3RydWN0KCZfX25vZGUtPl9NX2RhdGEpOwotICAgICAgX19ub2RlLT5fTV9uZXh0ID0gMDsKLSAgICB9Ci0gICAgX1NUTFBfVU5XSU5EKHRoaXMtPl9NX2hlYWQuZGVhbGxvY2F0ZShfX25vZGUsIDEpKQotICAgIHJldHVybiBfX25vZGU7Ci0gIH0KLSNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0qLwotCi1wdWJsaWM6Ci0KLSAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IHsgcmV0dXJuIF9CYXNlOjpnZXRfYWxsb2NhdG9yKCk7IH0KLQotI2lmICFkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQotICBleHBsaWNpdCBzbGlzdChjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKLSNlbHNlCi0gIHNsaXN0KCkKLSAgICA6IF9TVExQX1BSSVYgX1NsaXN0X2Jhc2U8X1RwLF9BbGxvYz4oYWxsb2NhdG9yX3R5cGUoKSkge30KLSAgc2xpc3QoY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKLSNlbmRpZgotICAgIDogX1NUTFBfUFJJViBfU2xpc3RfYmFzZTxfVHAsX0FsbG9jPihfX2EpIHt9Ci0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKLSAgZXhwbGljaXQgc2xpc3Qoc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX194ID0gX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRChfVHApLAotICAgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gIGFsbG9jYXRvcl90eXBlKCkpCi0jZWxzZQotICBleHBsaWNpdCBzbGlzdChzaXplX3R5cGUgX19uKQotICAgIDogX1NUTFBfUFJJViBfU2xpc3RfYmFzZTxfVHAsX0FsbG9jPihhbGxvY2F0b3JfdHlwZSgpKQotICAgIHsgX01faW5zZXJ0X2FmdGVyX2ZpbGwoJnRoaXMtPl9NX2hlYWQuX01fZGF0YSwgX19uLCBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKF9UcCkpOyB9Ci0gIHNsaXN0KHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKLSAgICA6IF9TVExQX1BSSVYgX1NsaXN0X2Jhc2U8X1RwLF9BbGxvYz4oYWxsb2NhdG9yX3R5cGUoKSkKLSAgICB7IF9NX2luc2VydF9hZnRlcl9maWxsKCZ0aGlzLT5fTV9oZWFkLl9NX2RhdGEsIF9fbiwgX194KTsgfQotICBzbGlzdChzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCi0jZW5kaWYKLSAgICA6IF9TVExQX1BSSVYgX1NsaXN0X2Jhc2U8X1RwLF9BbGxvYz4oX19hKQotICAgIHsgX01faW5zZXJ0X2FmdGVyX2ZpbGwoJnRoaXMtPl9NX2hlYWQuX01fZGF0YSwgX19uLCBfX3gpOyB9Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQotICAvLyBXZSBkb24ndCBuZWVkIGFueSBkaXNwYXRjaGluZyB0cmlja3MgaGVyZSwgYmVjYXVzZSBfTV9pbnNlcnRfYWZ0ZXJfcmFuZ2UKLSAgLy8gYWxyZWFkeSBkb2VzIHRoZW0uCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KLSAgc2xpc3QoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAotICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hIF9TVExQX0FMTE9DQVRPUl9UWVBFX0RGTCkKLSAgICA6IF9TVExQX1BSSVYgX1NsaXN0X2Jhc2U8X1RwLF9BbGxvYz4oX19hKQotICAgIHsgX01faW5zZXJ0X2FmdGVyX3JhbmdlKCZ0aGlzLT5fTV9oZWFkLl9NX2RhdGEsIF9fZmlyc3QsIF9fbGFzdCk7IH0KLSMgIGlmIGRlZmluZWQgKF9TVExQX05FRURTX0VYVFJBX1RFTVBMQVRFX0NPTlNUUlVDVE9SUykKLSAgLy8gVkMrKyBuZWVkcyB0aGlzIGNyYXp5bmVzcwotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Ci0gIHNsaXN0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKLSAgICA6IF9TVExQX1BSSVYgX1NsaXN0X2Jhc2U8X1RwLF9BbGxvYz4oYWxsb2NhdG9yX3R5cGUoKSkKLSAgICB7IF9NX2luc2VydF9hZnRlcl9yYW5nZSgmdGhpcy0+X01faGVhZC5fTV9kYXRhLCBfX2ZpcnN0LCBfX2xhc3QpOyB9Ci0jIGVuZGlmCi0jZWxzZSAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCi0gIHNsaXN0KGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCwKLSAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9ICBhbGxvY2F0b3JfdHlwZSgpICkKLSAgICA6IF9TVExQX1BSSVYgX1NsaXN0X2Jhc2U8X1RwLF9BbGxvYz4oX19hKQotICAgIHsgX01faW5zZXJ0X2FmdGVyX3JhbmdlKCZ0aGlzLT5fTV9oZWFkLl9NX2RhdGEsIF9fZmlyc3QsIF9fbGFzdCk7IH0KLSAgc2xpc3QoY29uc3QgdmFsdWVfdHlwZSogX19maXJzdCwgY29uc3QgdmFsdWVfdHlwZSogX19sYXN0LAotICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gIGFsbG9jYXRvcl90eXBlKCkpCi0gICAgOiBfU1RMUF9QUklWIF9TbGlzdF9iYXNlPF9UcCxfQWxsb2M+KF9fYSkKLSAgICB7IF9NX2luc2VydF9hZnRlcl9yYW5nZSgmdGhpcy0+X01faGVhZC5fTV9kYXRhLCBfX2ZpcnN0LCBfX2xhc3QpOyB9Ci0jZW5kaWYgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLwotCi0gIHNsaXN0KGNvbnN0IF9TZWxmJiBfX3gpCi0gICAgOiBfU1RMUF9QUklWIF9TbGlzdF9iYXNlPF9UcCxfQWxsb2M+KF9feC5nZXRfYWxsb2NhdG9yKCkpCi0gICAgeyBfTV9pbnNlcnRfYWZ0ZXJfcmFuZ2UoJnRoaXMtPl9NX2hlYWQuX01fZGF0YSwgX194LmJlZ2luKCksIF9feC5lbmQoKSk7IH0KLQotICBzbGlzdChfX21vdmVfc291cmNlPF9TZWxmPiBzcmMpCi0gICAgOiBfU1RMUF9QUklWIF9TbGlzdF9iYXNlPF9UcCwgX0FsbG9jPihfX21vdmVfc291cmNlPF9CYXNlPihzcmMuZ2V0KCkpKSB7fQotCi0gIF9TZWxmJiBvcGVyYXRvcj0gKGNvbnN0IF9TZWxmJiBfX3gpOwotCi0gIH5zbGlzdCgpIHt9Ci0KLXB1YmxpYzoKLSAgLy8gYXNzaWduKCksIGEgZ2VuZXJhbGl6ZWQgYXNzaWdubWVudCBtZW1iZXIgZnVuY3Rpb24uICBUd28KLSAgLy8gdmVyc2lvbnM6IG9uZSB0aGF0IHRha2VzIGEgY291bnQsIGFuZCBvbmUgdGhhdCB0YWtlcyBhIHJhbmdlLgotICAvLyBUaGUgcmFuZ2UgdmVyc2lvbiBpcyBhIG1lbWJlciB0ZW1wbGF0ZSwgc28gd2UgZGlzcGF0Y2ggb24gd2hldGhlcgotICAvLyBvciBub3QgdGhlIHR5cGUgaXMgYW4gaW50ZWdlci4KLQotICB2b2lkIGFzc2lnbihzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9fdmFsKSB7IF9NX2ZpbGxfYXNzaWduKF9fbiwgX192YWwpOyB9Ci0KLXByaXZhdGU6Ci0gIHZvaWQgX01fZmlsbF9hc3NpZ24oc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3ZhbCk7Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQotcHVibGljOgotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Ci0gIHZvaWQgYXNzaWduKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkgewotICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lzSW50ZWdyYWw8X0lucHV0SXRlcmF0b3I+OjpfUmV0IF9JbnRlZ3JhbDsKLSAgICBfTV9hc3NpZ25fZGlzcGF0Y2goX19maXJzdCwgX19sYXN0LCBfSW50ZWdyYWwoKSk7Ci0gIH0KLQotcHJpdmF0ZToKLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2VyPgotICB2b2lkIF9NX2Fzc2lnbl9kaXNwYXRjaChfSW50ZWdlciBfX24sIF9JbnRlZ2VyIF9fdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX3RydWVfdHlwZSYgLypfSXNJbnRlZ3JhbCovKSB7Ci0gICAgX01fZmlsbF9hc3NpZ24oKHNpemVfdHlwZSkgX19uLCAoX1RwKSBfX3ZhbCk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcj4KLSAgdm9pZCBfTV9hc3NpZ25fZGlzcGF0Y2goX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19mYWxzZV90eXBlJiAvKl9Jc0ludGVncmFsKi8pIHsKLSNlbHNlCi1wdWJsaWM6Ci0gIHZvaWQgYXNzaWduKGNvbnN0X3BvaW50ZXIgX19maXJzdCwgY29uc3RfcG9pbnRlciBfX2xhc3QpIHsKLSAgICBfTm9kZV9iYXNlKiBfX3ByZXYgPSAmdGhpcy0+X01faGVhZC5fTV9kYXRhOwotICAgIF9Ob2RlX2Jhc2UqIF9fbm9kZSA9IHRoaXMtPl9NX2hlYWQuX01fZGF0YS5fTV9uZXh0OwotICAgIHdoaWxlIChfX25vZGUgIT0gMCAmJiBfX2ZpcnN0ICE9IF9fbGFzdCkgewotICAgICAgX19TVEFUSUNfQ0FTVChfTm9kZSosIF9fbm9kZSktPl9NX2RhdGEgPSAqX19maXJzdDsKLSAgICAgIF9fcHJldiA9IF9fbm9kZTsKLSAgICAgIF9fbm9kZSA9IF9fbm9kZS0+X01fbmV4dDsKLSAgICAgICsrX19maXJzdDsKLSAgICB9Ci0gICAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KQotICAgICAgX01faW5zZXJ0X2FmdGVyX3JhbmdlKF9fcHJldiwgX19maXJzdCwgX19sYXN0KTsKLSAgICBlbHNlCi0gICAgICB0aGlzLT5fTV9lcmFzZV9hZnRlcihfX3ByZXYsIDApOwotICB9Ci0gIHZvaWQgYXNzaWduKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkgewotI2VuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KLSAgICBfTm9kZV9iYXNlKiBfX3ByZXYgPSAmdGhpcy0+X01faGVhZC5fTV9kYXRhOwotICAgIF9Ob2RlX2Jhc2UqIF9fbm9kZSA9IHRoaXMtPl9NX2hlYWQuX01fZGF0YS5fTV9uZXh0OwotICAgIHdoaWxlIChfX25vZGUgIT0gMCAmJiBfX2ZpcnN0ICE9IF9fbGFzdCkgewotICAgICAgX19TVEFUSUNfQ0FTVChfTm9kZSosIF9fbm9kZSktPl9NX2RhdGEgPSAqX19maXJzdDsKLSAgICAgIF9fcHJldiA9IF9fbm9kZTsKLSAgICAgIF9fbm9kZSA9IF9fbm9kZS0+X01fbmV4dDsKLSAgICAgICsrX19maXJzdDsKLSAgICB9Ci0gICAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KQotICAgICAgX01faW5zZXJ0X2FmdGVyX3JhbmdlKF9fcHJldiwgX19maXJzdCwgX19sYXN0KTsKLSAgICBlbHNlCi0gICAgICB0aGlzLT5fTV9lcmFzZV9hZnRlcihfX3ByZXYsIDApOwotICB9Ci0KLXB1YmxpYzoKLQotICAvLyBFeHBlcmltZW50YWwgbmV3IGZlYXR1cmU6IGJlZm9yZV9iZWdpbigpIHJldHVybnMgYQotICAvLyBub24tZGVyZWZlcmVuY2VhYmxlIGl0ZXJhdG9yIHRoYXQsIHdoZW4gaW5jcmVtZW50ZWQsIHlpZWxkcwotICAvLyBiZWdpbigpLiAgVGhpcyBpdGVyYXRvciBtYXkgYmUgdXNlZCBhcyB0aGUgYXJndW1lbnQgdG8KLSAgLy8gaW5zZXJ0X2FmdGVyLCBlcmFzZV9hZnRlciwgZXRjLiAgTm90ZSB0aGF0IGV2ZW4gZm9yIGFuIGVtcHR5Ci0gIC8vIHNsaXN0LCBiZWZvcmVfYmVnaW4oKSBpcyBub3QgdGhlIHNhbWUgaXRlcmF0b3IgYXMgZW5kKCkuICBJdAotICAvLyBpcyBhbHdheXMgbmVjZXNzYXJ5IHRvIGluY3JlbWVudCBiZWZvcmVfYmVnaW4oKSBhdCBsZWFzdCBvbmNlIHRvCi0gIC8vIG9idGFpbiBlbmQoKS4KLSAgaXRlcmF0b3IgYmVmb3JlX2JlZ2luKCkgeyByZXR1cm4gaXRlcmF0b3IoJnRoaXMtPl9NX2hlYWQuX01fZGF0YSk7IH0KLSAgY29uc3RfaXRlcmF0b3IgYmVmb3JlX2JlZ2luKCkgY29uc3QKLSAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfX0NPTlNUX0NBU1QoX05vZGVfYmFzZSosICZ0aGlzLT5fTV9oZWFkLl9NX2RhdGEpKTsgfQotCi0gIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gaXRlcmF0b3IodGhpcy0+X01faGVhZC5fTV9kYXRhLl9NX25leHQpOyB9Ci0gIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QKLSAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcih0aGlzLT5fTV9oZWFkLl9NX2RhdGEuX01fbmV4dCk7fQotCi0gIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIGl0ZXJhdG9yKCk7IH0KLSAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoKTsgfQotCi0gIHNpemVfdHlwZSBzaXplKCkgY29uc3QKLSAgeyByZXR1cm4gX1NUTFBfUFJJViBfU2xfZ2xvYmFsX2luc3Q6OnNpemUodGhpcy0+X01faGVhZC5fTV9kYXRhLl9NX25leHQpOyB9Ci0KLSAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgeyByZXR1cm4gc2l6ZV90eXBlKC0xKTsgfQotCi0gIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiB0aGlzLT5fTV9oZWFkLl9NX2RhdGEuX01fbmV4dCA9PSAwOyB9Ci0KLSAgdm9pZCBzd2FwKF9TZWxmJiBfX3gpIHsKLSAgICB0aGlzLT5fTV9oZWFkLnN3YXAoX194Ll9NX2hlYWQpOwotICB9Ci0KLXB1YmxpYzoKLSAgcmVmZXJlbmNlIGZyb250KCkgICAgICAgICAgICAgeyByZXR1cm4gKmJlZ2luKCk7IH0KLSAgY29uc3RfcmVmZXJlbmNlIGZyb250KCkgY29uc3QgeyByZXR1cm4gKmJlZ2luKCk7IH0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkgJiYgIWRlZmluZWQgKF9TVExQX05PX0FOQUNIUk9OSVNNUykKLSAgdm9pZCBwdXNoX2Zyb250KGNvbnN0IHZhbHVlX3R5cGUmIF9feCA9IF9UcCgpKSAgIHsKLSNlbHNlCi0gIHZvaWQgcHVzaF9mcm9udChjb25zdCB2YWx1ZV90eXBlJiBfX3gpICAgewotI2VuZGlmIC8qIV9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0gJiYgIV9TVExQX05PX0FOQUNIUk9OSVNNUyovCi0gICAgX1NUTFBfUFJJViBfX3NsaXN0X21ha2VfbGluaygmdGhpcy0+X01faGVhZC5fTV9kYXRhLCBfTV9jcmVhdGVfbm9kZShfX3gpKTsKLSAgfQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkgJiYgIWRlZmluZWQgKF9TVExQX05PX0FOQUNIUk9OSVNNUykKLSAgdm9pZCBwdXNoX2Zyb250KCkgeyBfU1RMUF9QUklWIF9fc2xpc3RfbWFrZV9saW5rKCZ0aGlzLT5fTV9oZWFkLl9NX2RhdGEsIF9NX2NyZWF0ZV9ub2RlKCkpO30KLSNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0gJiYgIV9TVExQX05PX0FOQUNIUk9OSVNNUyovCi0KLSAgdm9pZCBwb3BfZnJvbnQoKSB7Ci0gICAgX05vZGUqIF9fbm9kZSA9IF9fU1RBVElDX0NBU1QoX05vZGUqLCB0aGlzLT5fTV9oZWFkLl9NX2RhdGEuX01fbmV4dCk7Ci0gICAgdGhpcy0+X01faGVhZC5fTV9kYXRhLl9NX25leHQgPSBfX25vZGUtPl9NX25leHQ7Ci0gICAgX1NUTFBfU1REOjpfRGVzdHJveSgmX19ub2RlLT5fTV9kYXRhKTsKLSAgICB0aGlzLT5fTV9oZWFkLmRlYWxsb2NhdGUoX19ub2RlLCAxKTsKLSAgfQotCi0gIGl0ZXJhdG9yIHByZXZpb3VzKGNvbnN0X2l0ZXJhdG9yIF9fcG9zKSB7Ci0gICAgcmV0dXJuIGl0ZXJhdG9yKF9TVExQX1BSSVYgX1NsX2dsb2JhbF9pbnN0OjpfX3ByZXZpb3VzKCZ0aGlzLT5fTV9oZWFkLl9NX2RhdGEsIF9fcG9zLl9NX25vZGUpKTsKLSAgfQotICBjb25zdF9pdGVyYXRvciBwcmV2aW91cyhjb25zdF9pdGVyYXRvciBfX3BvcykgY29uc3QgewotICAgIHJldHVybiBjb25zdF9pdGVyYXRvcihfX0NPTlNUX0NBU1QoX05vZGVfYmFzZSosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9TbF9nbG9iYWxfaW5zdDo6X19wcmV2aW91cygmdGhpcy0+X01faGVhZC5fTV9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcG9zLl9NX25vZGUpKSk7Ci0gIH0KLQotcHJpdmF0ZToKLSNpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKLSAgX05vZGUqIF9NX2luc2VydF9hZnRlcihfTm9kZV9iYXNlKiBfX3BvcywgY29uc3QgdmFsdWVfdHlwZSYgX194ID0gX1RwKCkpIHsKLSNlbHNlCi0gIF9Ob2RlKiBfTV9pbnNlcnRfYWZ0ZXIoX05vZGVfYmFzZSogX19wb3MsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkgewotI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCi0gICAgcmV0dXJuIF9fU1RBVElDX0NBU1QoX05vZGUqLCBfU1RMUF9QUklWIF9fc2xpc3RfbWFrZV9saW5rKF9fcG9zLCBfTV9jcmVhdGVfbm9kZShfX3gpKSk7Ci0gIH0KLQotI2lmIGRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCi0gIF9Ob2RlKiBfTV9pbnNlcnRfYWZ0ZXIoX05vZGVfYmFzZSogX19wb3MpIHsKLSAgICByZXR1cm4gX19TVEFUSUNfQ0FTVChfTm9kZSosIF9TVExQX1BSSVYgX19zbGlzdF9tYWtlX2xpbmsoX19wb3MsIF9NX2NyZWF0ZV9ub2RlKCkpKTsKLSAgfQotI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCi0KLSAgdm9pZCBfTV9pbnNlcnRfYWZ0ZXJfZmlsbChfTm9kZV9iYXNlKiBfX3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpIHsKLSAgICBmb3IgKHNpemVfdHlwZSBfX2kgPSAwOyBfX2kgPCBfX247ICsrX19pKQotICAgICAgX19wb3MgPSBfU1RMUF9QUklWIF9fc2xpc3RfbWFrZV9saW5rKF9fcG9zLCBfTV9jcmVhdGVfbm9kZShfX3gpKTsKLSAgfQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKLSAgLy8gQ2hlY2sgd2hldGhlciBpdCdzIGFuIGludGVncmFsIHR5cGUuICBJZiBzbywgaXQncyBub3QgYW4gaXRlcmF0b3IuCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5JdGVyPgotICB2b2lkIF9NX2luc2VydF9hZnRlcl9yYW5nZShfTm9kZV9iYXNlKiBfX3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0luSXRlciBfX2ZpcnN0LCBfSW5JdGVyIF9fbGFzdCkgewotICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lzSW50ZWdyYWw8X0luSXRlcj46Ol9SZXQgX0ludGVncmFsOwotICAgIF9NX2luc2VydF9hZnRlcl9yYW5nZShfX3BvcywgX19maXJzdCwgX19sYXN0LCBfSW50ZWdyYWwoKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0ludGVnZXI+Ci0gIHZvaWQgX01faW5zZXJ0X2FmdGVyX3JhbmdlKF9Ob2RlX2Jhc2UqIF9fcG9zLCBfSW50ZWdlciBfX24sIF9JbnRlZ2VyIF9feCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX190cnVlX3R5cGUmKSB7Ci0gICAgX01faW5zZXJ0X2FmdGVyX2ZpbGwoX19wb3MsIF9fbiwgX194KTsKLSAgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5JdGVyPgotICB2b2lkIF9NX2luc2VydF9hZnRlcl9yYW5nZShfTm9kZV9iYXNlKiBfX3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0luSXRlciBfX2ZpcnN0LCBfSW5JdGVyIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19mYWxzZV90eXBlJikgewotI2Vsc2UgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLwotICB2b2lkIF9NX2luc2VydF9hZnRlcl9yYW5nZShfTm9kZV9iYXNlKiBfX3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWVfdHlwZSogX19maXJzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWVfdHlwZSogX19sYXN0KSB7Ci0gICAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0KSB7Ci0gICAgICBfX3BvcyA9IF9TVExQX1BSSVYgX19zbGlzdF9tYWtlX2xpbmsoX19wb3MsIF9NX2NyZWF0ZV9ub2RlKCpfX2ZpcnN0KSk7Ci0gICAgICArK19fZmlyc3Q7Ci0gICAgfQotICB9Ci0gIHZvaWQgX01faW5zZXJ0X2FmdGVyX3JhbmdlKF9Ob2RlX2Jhc2UqIF9fcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpIHsKLSNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCi0gICAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0KSB7Ci0gICAgICBfX3BvcyA9IF9TVExQX1BSSVYgX19zbGlzdF9tYWtlX2xpbmsoX19wb3MsIF9NX2NyZWF0ZV9ub2RlKCpfX2ZpcnN0KSk7Ci0gICAgICArK19fZmlyc3Q7Ci0gICAgfQotICB9Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQotICAvLyBDaGVjayB3aGV0aGVyIGl0J3MgYW4gaW50ZWdyYWwgdHlwZS4gIElmIHNvLCBpdCdzIG5vdCBhbiBpdGVyYXRvci4KLSAgdGVtcGxhdGUgPGNsYXNzIF9Jbkl0ZXI+Ci0gIHZvaWQgX01fc3BsaWNlX2FmdGVyX3JhbmdlKF9Ob2RlX2Jhc2UqIF9fcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5JdGVyIF9fZmlyc3QsIF9Jbkl0ZXIgX19sYXN0KSB7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBfSXNJbnRlZ3JhbDxfSW5JdGVyPjo6X1JldCBfSW50ZWdyYWw7Ci0gICAgX01fc3BsaWNlX2FmdGVyX3JhbmdlKF9fcG9zLCBfX2ZpcnN0LCBfX2xhc3QsIF9JbnRlZ3JhbCgpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW50ZWdlcj4KLSAgdm9pZCBfTV9zcGxpY2VfYWZ0ZXJfcmFuZ2UoX05vZGVfYmFzZSogX19wb3MsIF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX194LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX3RydWVfdHlwZSYpIHsKLSAgICBfTV9pbnNlcnRfYWZ0ZXJfZmlsbChfX3BvcywgX19uLCBfX3gpOwotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIF9Jbkl0ZXI+Ci0gIHZvaWQgX01fc3BsaWNlX2FmdGVyX3JhbmdlKF9Ob2RlX2Jhc2UqIF9fcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5JdGVyIF9fZmlyc3QsIF9Jbkl0ZXIgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2ZhbHNlX3R5cGUmKSB7Ci0jZWxzZSAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCi0gIHZvaWQgX01fc3BsaWNlX2FmdGVyX3JhbmdlKF9Ob2RlX2Jhc2UqIF9fcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZV90eXBlKiBfX2ZpcnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZV90eXBlKiBfX2xhc3QpIHsKLSAgICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QpIHsKLSAgICAgIF9fcG9zID0gX1NUTFBfUFJJViBfX3NsaXN0X21ha2VfbGluayhfX3BvcywgX01fY3JlYXRlX25vZGUoKl9fZmlyc3QpKTsKLSAgICAgICsrX19maXJzdDsKLSAgICB9Ci0gIH0KLSAgdm9pZCBfTV9zcGxpY2VfYWZ0ZXJfcmFuZ2UoX05vZGVfYmFzZSogX19wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkgewotI2VuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KLSAgICAvL1dlIHVzZSBhIHRlbXBvcmFyeSBzbGlzdCB0byBhdm9pZCB0aGUgYXV0byByZWZlcmVuY2UgdHJvdWJsZXMgKGluZmluaXRlIGxvb3ApCi0gICAgX1NlbGYgX190bXAoX19maXJzdCwgX19sYXN0LCB0aGlzLT5nZXRfYWxsb2NhdG9yKCkpOwotICAgIHNwbGljZV9hZnRlcihpdGVyYXRvcihfX3BvcyksIF9fdG1wKTsKLSAgfQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKLSAgLy8gQ2hlY2sgd2hldGhlciBpdCdzIGFuIGludGVncmFsIHR5cGUuICBJZiBzbywgaXQncyBub3QgYW4gaXRlcmF0b3IuCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5JdGVyPgotICB2b2lkIF9NX3NwbGljZV9yYW5nZShfTm9kZV9iYXNlKiBfX3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgX0luSXRlciBfX2ZpcnN0LCBfSW5JdGVyIF9fbGFzdCkgewotICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lzSW50ZWdyYWw8X0luSXRlcj46Ol9SZXQgX0ludGVncmFsOwotICAgIF9NX3NwbGljZV9yYW5nZShfX3BvcywgX19maXJzdCwgX19sYXN0LCBfSW50ZWdyYWwoKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0ludGVnZXI+Ci0gIHZvaWQgX01fc3BsaWNlX3JhbmdlKF9Ob2RlX2Jhc2UqIF9fcG9zLCBfSW50ZWdlciBfX24sIF9JbnRlZ2VyIF9feCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX190cnVlX3R5cGUmKSB7Ci0gICAgX01faW5zZXJ0X2FmdGVyX2ZpbGwoX1NUTFBfUFJJViBfU2xfZ2xvYmFsX2luc3Q6Ol9fcHJldmlvdXMoJnRoaXMtPl9NX2hlYWQuX01fZGF0YSwgX19wb3MpLAotICAgICAgICAgICAgICAgICAgICAgICAgIF9fbiwgX194KTsKLSAgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5JdGVyPgotICB2b2lkIF9NX3NwbGljZV9yYW5nZShfTm9kZV9iYXNlKiBfX3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgX0luSXRlciBfX2ZpcnN0LCBfSW5JdGVyIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19mYWxzZV90eXBlJikgewotI2Vsc2UgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLwotICB2b2lkIF9NX3NwbGljZV9yYW5nZShfTm9kZV9iYXNlKiBfX3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWVfdHlwZSogX19maXJzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWVfdHlwZSogX19sYXN0KSB7Ci0gICAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0KSB7Ci0gICAgICBfX3BvcyA9IF9TVExQX1BSSVYgX19zbGlzdF9tYWtlX2xpbmsoX19wb3MsIF9NX2NyZWF0ZV9ub2RlKCpfX2ZpcnN0KSk7Ci0gICAgICArK19fZmlyc3Q7Ci0gICAgfQotICB9Ci0gIHZvaWQgX01fc3BsaWNlX3JhbmdlKF9Ob2RlX2Jhc2UqIF9fcG9zLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpIHsKLSNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCi0gICAgLy9XZSB1c2UgYSB0ZW1wb3Jhcnkgc2xpc3QgdG8gYXZvaWQgdGhlIGF1dG8gcmVmZXJlbmNlIHRyb3VibGVzIChpbmZpbml0ZSBsb29wKQotICAgIF9TZWxmIF9fdG1wKF9fZmlyc3QsIF9fbGFzdCwgdGhpcy0+Z2V0X2FsbG9jYXRvcigpKTsKLSAgICBzcGxpY2UoaXRlcmF0b3IoX19wb3MpLCBfX3RtcCk7Ci0gIH0KLQotcHVibGljOgotCi0jaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCi0gIGl0ZXJhdG9yIGluc2VydF9hZnRlcihpdGVyYXRvciBfX3BvcywgY29uc3QgdmFsdWVfdHlwZSYgX194ID0gX1RwKCkpIHsKLSNlbHNlCi0gIGl0ZXJhdG9yIGluc2VydF9hZnRlcihpdGVyYXRvciBfX3BvcywgY29uc3QgdmFsdWVfdHlwZSYgX194KSB7Ci0jZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKi8KLSAgICByZXR1cm4gaXRlcmF0b3IoX01faW5zZXJ0X2FmdGVyKF9fcG9zLl9NX25vZGUsIF9feCkpOwotICB9Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQotICBpdGVyYXRvciBpbnNlcnRfYWZ0ZXIoaXRlcmF0b3IgX19wb3MpIHsKLSAgICByZXR1cm4gaW5zZXJ0X2FmdGVyKF9fcG9zLCBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKF9UcCkpOwotICB9Ci0jZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKi8KLQotICB2b2lkIGluc2VydF9hZnRlcihpdGVyYXRvciBfX3Bvcywgc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX194KSB7Ci0gICAgX01faW5zZXJ0X2FmdGVyX2ZpbGwoX19wb3MuX01fbm9kZSwgX19uLCBfX3gpOwotICB9Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQotICAvLyBXZSBkb24ndCBuZWVkIGFueSBkaXNwYXRjaGluZyB0cmlja3MgaGVyZSwgYmVjYXVzZSBfTV9pbnNlcnRfYWZ0ZXJfcmFuZ2UKLSAgLy8gYWxyZWFkeSBkb2VzIHRoZW0uCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5JdGVyPgotICB2b2lkIGluc2VydF9hZnRlcihpdGVyYXRvciBfX3BvcywgX0luSXRlciBfX2ZpcnN0LCBfSW5JdGVyIF9fbGFzdCkgewotI2Vsc2UgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLwotICB2b2lkIGluc2VydF9hZnRlcihpdGVyYXRvciBfX3BvcywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWVfdHlwZSogX19maXJzdCwgY29uc3QgdmFsdWVfdHlwZSogX19sYXN0KSB7Ci0gICAgX01faW5zZXJ0X2FmdGVyX3JhbmdlKF9fcG9zLl9NX25vZGUsIF9fZmlyc3QsIF9fbGFzdCk7Ci0gIH0KLSAgdm9pZCBpbnNlcnRfYWZ0ZXIoaXRlcmF0b3IgX19wb3MsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkgewotI2VuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KLSAgICBfTV9zcGxpY2VfYWZ0ZXJfcmFuZ2UoX19wb3MuX01fbm9kZSwgX19maXJzdCwgX19sYXN0KTsKLSAgfQotCi0jaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCi0gIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBfX3BvcywgY29uc3QgdmFsdWVfdHlwZSYgX194ID0gX1RwKCkpIHsKLSNlbHNlCi0gIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBfX3BvcywgY29uc3QgdmFsdWVfdHlwZSYgX194KSB7Ci0jZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKi8KLSAgICByZXR1cm4gaXRlcmF0b3IoX01faW5zZXJ0X2FmdGVyKF9TVExQX1BSSVYgX1NsX2dsb2JhbF9pbnN0OjpfX3ByZXZpb3VzKCZ0aGlzLT5fTV9oZWFkLl9NX2RhdGEsIF9fcG9zLl9NX25vZGUpLAotICAgICAgICAgICAgICAgICAgICBfX3gpKTsKLSAgfQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKLSAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zKSB7Ci0gICAgcmV0dXJuIGl0ZXJhdG9yKF9NX2luc2VydF9hZnRlcihfU1RMUF9QUklWIF9TbF9nbG9iYWxfaW5zdDo6X19wcmV2aW91cygmdGhpcy0+X01faGVhZC5fTV9kYXRhLCBfX3Bvcy5fTV9ub2RlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQoX1RwKSkpOwotICB9Ci0jZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKi8KLQotICB2b2lkIGluc2VydChpdGVyYXRvciBfX3Bvcywgc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX194KSB7Ci0gICAgX01faW5zZXJ0X2FmdGVyX2ZpbGwoX1NUTFBfUFJJViBfU2xfZ2xvYmFsX2luc3Q6Ol9fcHJldmlvdXMoJnRoaXMtPl9NX2hlYWQuX01fZGF0YSwgX19wb3MuX01fbm9kZSksIF9fbiwgX194KTsKLSAgfQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKLSAgLy8gV2UgZG9uJ3QgbmVlZCBhbnkgZGlzcGF0Y2hpbmcgdHJpY2tzIGhlcmUsIGJlY2F1c2UgX01faW5zZXJ0X2FmdGVyX3JhbmdlCi0gIC8vIGFscmVhZHkgZG9lcyB0aGVtLgotICB0ZW1wbGF0ZSA8Y2xhc3MgX0luSXRlcj4KLSAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIF9Jbkl0ZXIgX19maXJzdCwgX0luSXRlciBfX2xhc3QpIHsKLSNlbHNlIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KLSAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIGNvbnN0IHZhbHVlX3R5cGUqIF9fZmlyc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZV90eXBlKiBfX2xhc3QpIHsKLSAgICBfTV9pbnNlcnRfYWZ0ZXJfcmFuZ2UoX1NUTFBfUFJJViBfU2xfZ2xvYmFsX2luc3Q6Ol9fcHJldmlvdXMoJnRoaXMtPl9NX2hlYWQuX01fZGF0YSwgX19wb3MuX01fbm9kZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIF9fZmlyc3QsIF9fbGFzdCk7Ci0gIH0KLSAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkgewotI2VuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KLSAgICBfTV9zcGxpY2VfcmFuZ2UoX19wb3MuX01fbm9kZSwgX19maXJzdCwgX19sYXN0KTsKLSAgfQotCi1wdWJsaWM6Ci0gIGl0ZXJhdG9yIGVyYXNlX2FmdGVyKGl0ZXJhdG9yIF9fcG9zKQotICB7IHJldHVybiBpdGVyYXRvcih0aGlzLT5fTV9lcmFzZV9hZnRlcihfX3Bvcy5fTV9ub2RlKSk7IH0KLSAgaXRlcmF0b3IgZXJhc2VfYWZ0ZXIoaXRlcmF0b3IgX19iZWZvcmVfZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkKLSAgeyByZXR1cm4gaXRlcmF0b3IodGhpcy0+X01fZXJhc2VfYWZ0ZXIoX19iZWZvcmVfZmlyc3QuX01fbm9kZSwgX19sYXN0Ll9NX25vZGUpKTsgfQotCi0gIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIF9fcG9zKQotICB7IHJldHVybiBpdGVyYXRvcih0aGlzLT5fTV9lcmFzZV9hZnRlcihfU1RMUF9QUklWIF9TbF9nbG9iYWxfaW5zdDo6X19wcmV2aW91cygmdGhpcy0+X01faGVhZC5fTV9kYXRhLCBfX3Bvcy5fTV9ub2RlKSkpOyB9Ci0gIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkKLSAgeyByZXR1cm4gaXRlcmF0b3IodGhpcy0+X01fZXJhc2VfYWZ0ZXIoX1NUTFBfUFJJViBfU2xfZ2xvYmFsX2luc3Q6Ol9fcHJldmlvdXMoJnRoaXMtPl9NX2hlYWQuX01fZGF0YSwgX19maXJzdC5fTV9ub2RlKSwgX19sYXN0Ll9NX25vZGUpKTsgfQotCi0jaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCi0gIHZvaWQgcmVzaXplKHNpemVfdHlwZSBuZXdfc2l6ZSwgY29uc3QgdmFsdWVfdHlwZSYgX194ID0gX1RwKCkpOwotI2Vsc2UKLSAgdm9pZCByZXNpemUoc2l6ZV90eXBlIG5ld19zaXplLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpOwotI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQotICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgbmV3X3NpemUpIHsgcmVzaXplKG5ld19zaXplLCBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKF9UcCkpOyB9Ci0jZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKi8KLQotICB2b2lkIGNsZWFyKCkKLSAgeyB0aGlzLT5fTV9lcmFzZV9hZnRlcigmdGhpcy0+X01faGVhZC5fTV9kYXRhLCAwKTsgfQotCi1wdWJsaWM6Ci0gIC8vIE1vdmVzIHRoZSByYW5nZSBbX19iZWZvcmVfZmlyc3QgKyAxLCBfX2JlZm9yZV9sYXN0ICsgMSkgdG8gKnRoaXMsCi0gIC8vICBpbnNlcnRpbmcgaXQgaW1tZWRpYXRlbHkgYWZ0ZXIgX19wb3MuICBUaGlzIGlzIGNvbnN0YW50IHRpbWUuCi0gIHZvaWQgc3BsaWNlX2FmdGVyKGl0ZXJhdG9yIF9fcG9zLCBfU2VsZiYgX194LAotICAgICAgICAgICAgICAgICAgICBpdGVyYXRvciBfX2JlZm9yZV9maXJzdCwgaXRlcmF0b3IgX19iZWZvcmVfbGFzdCkgewotICAgIGlmIChfX2JlZm9yZV9maXJzdCAhPSBfX2JlZm9yZV9sYXN0KSB7Ci0gICAgICBpZiAodGhpcy0+Z2V0X2FsbG9jYXRvcigpID09IF9feC5nZXRfYWxsb2NhdG9yKCkpIHsKLSAgICAgICAgX1NUTFBfUFJJViBfU2xfZ2xvYmFsX2luc3Q6Ol9fc3BsaWNlX2FmdGVyKF9fcG9zLl9NX25vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2JlZm9yZV9maXJzdC5fTV9ub2RlLCBfX2JlZm9yZV9sYXN0Ll9NX25vZGUpOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIHRoaXMtPmluc2VydF9hZnRlcihfX3BvcywgaXRlcmF0b3IoX19iZWZvcmVfZmlyc3QuX01fbm9kZS0+X01fbmV4dCksIGl0ZXJhdG9yKF9fYmVmb3JlX2xhc3QuX01fbm9kZS0+X01fbmV4dCkpOwotICAgICAgICBfX3guZXJhc2VfYWZ0ZXIoX19iZWZvcmVfZmlyc3QsICsrX19iZWZvcmVfbGFzdCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLy8gTW92ZXMgdGhlIGVsZW1lbnQgdGhhdCBmb2xsb3dzIF9fcHJldiB0byAqdGhpcywgaW5zZXJ0aW5nIGl0IGltbWVkaWF0ZWx5Ci0gIC8vICBhZnRlciBfX3Bvcy4gIFRoaXMgaXMgY29uc3RhbnQgdGltZS4KLSAgdm9pZCBzcGxpY2VfYWZ0ZXIoaXRlcmF0b3IgX19wb3MsIF9TZWxmJiBfX3gsIGl0ZXJhdG9yIF9fcHJldikgewotICAgIGlmICh0aGlzLT5nZXRfYWxsb2NhdG9yKCkgPT0gX194LmdldF9hbGxvY2F0b3IoKSkgewotICAgICAgX1NUTFBfUFJJViBfU2xfZ2xvYmFsX2luc3Q6Ol9fc3BsaWNlX2FmdGVyKF9fcG9zLl9NX25vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19wcmV2Ll9NX25vZGUsIF9fcHJldi5fTV9ub2RlLT5fTV9uZXh0KTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICB0aGlzLT5pbnNlcnRfYWZ0ZXIoX19wb3MsIF9fU1RBVElDX0NBU1QoX05vZGUqLCBfX3ByZXYuX01fbm9kZS0+X01fbmV4dCktPl9NX2RhdGEpOwotICAgICAgX194LmVyYXNlX2FmdGVyKF9fcHJldik7Ci0gICAgfQotICB9Ci0KLSAgLy8gUmVtb3ZlcyBhbGwgb2YgdGhlIGVsZW1lbnRzIGZyb20gdGhlIGxpc3QgX194IHRvICp0aGlzLCBpbnNlcnRpbmcKLSAgLy8gdGhlbSBpbW1lZGlhdGVseSBhZnRlciBfX3Bvcy4gIF9feCBtdXN0IG5vdCBiZSAqdGhpcy4gIENvbXBsZXhpdHk6Ci0gIC8vIGxpbmVhciBpbiBfX3guc2l6ZSgpLgotICB2b2lkIHNwbGljZV9hZnRlcihpdGVyYXRvciBfX3BvcywgX1NlbGYmIF9feCkgewotICAgIGlmICh0aGlzLT5nZXRfYWxsb2NhdG9yKCkgPT0gX194LmdldF9hbGxvY2F0b3IoKSkKLSAgICAgIF9TVExQX1BSSVYgX1NsX2dsb2JhbF9pbnN0OjpfX3NwbGljZV9hZnRlcihfX3Bvcy5fTV9ub2RlLCAmX194Ll9NX2hlYWQuX01fZGF0YSk7Ci0gICAgZWxzZSB7Ci0gICAgICB0aGlzLT5pbnNlcnRfYWZ0ZXIoX19wb3MsIF9feC5iZWdpbigpLCBfX3guZW5kKCkpOwotICAgICAgX194LmNsZWFyKCk7Ci0gICAgfQotICB9Ci0KLSAgLy8gTGluZWFyIGluIGRpc3RhbmNlKGJlZ2luKCksIF9fcG9zKSwgYW5kIGxpbmVhciBpbiBfX3guc2l6ZSgpLgotICB2b2lkIHNwbGljZShpdGVyYXRvciBfX3BvcywgX1NlbGYmIF9feCkgewotICAgIGlmIChfX3guX01faGVhZC5fTV9kYXRhLl9NX25leHQpIHsKLSAgICAgIGlmICh0aGlzLT5nZXRfYWxsb2NhdG9yKCkgPT0gX194LmdldF9hbGxvY2F0b3IoKSkgewotICAgICAgICBfU1RMUF9QUklWIF9TbF9nbG9iYWxfaW5zdDo6X19zcGxpY2VfYWZ0ZXIoX1NUTFBfUFJJViBfU2xfZ2xvYmFsX2luc3Q6Ol9fcHJldmlvdXMoJnRoaXMtPl9NX2hlYWQuX01fZGF0YSwgX19wb3MuX01fbm9kZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmX194Ll9NX2hlYWQuX01fZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX1NsX2dsb2JhbF9pbnN0OjpfX3ByZXZpb3VzKCZfX3guX01faGVhZC5fTV9kYXRhLCAwKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgaW5zZXJ0KF9fcG9zLCBfX3guYmVnaW4oKSwgX194LmVuZCgpKTsKLSAgICAgICAgX194LmNsZWFyKCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLy8gTGluZWFyIGluIGRpc3RhbmNlKGJlZ2luKCksIF9fcG9zKSwgYW5kIGluIGRpc3RhbmNlKF9feC5iZWdpbigpLCBfX2kpLgotICB2b2lkIHNwbGljZShpdGVyYXRvciBfX3BvcywgX1NlbGYmIF9feCwgaXRlcmF0b3IgX19pKSB7Ci0gICAgaWYgKHRoaXMtPmdldF9hbGxvY2F0b3IoKSA9PSBfX3guZ2V0X2FsbG9jYXRvcigpKSB7Ci0gICAgICBfU1RMUF9QUklWIF9TbF9nbG9iYWxfaW5zdDo6X19zcGxpY2VfYWZ0ZXIoX1NUTFBfUFJJViBfU2xfZ2xvYmFsX2luc3Q6Ol9fcHJldmlvdXMoJnRoaXMtPl9NX2hlYWQuX01fZGF0YSwgX19wb3MuX01fbm9kZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfU2xfZ2xvYmFsX2luc3Q6Ol9fcHJldmlvdXMoJl9feC5fTV9oZWFkLl9NX2RhdGEsIF9faS5fTV9ub2RlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2kuX01fbm9kZSk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgaW5zZXJ0KF9fcG9zLCAqX19pKTsKLSAgICAgIF9feC5lcmFzZShfX2kpOwotICAgIH0KLSAgfQotCi0gIC8vIExpbmVhciBpbiBkaXN0YW5jZShiZWdpbigpLCBfX3BvcyksIGluIGRpc3RhbmNlKF9feC5iZWdpbigpLCBfX2ZpcnN0KSwKLSAgLy8gYW5kIGluIGRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCkuCi0gIHZvaWQgc3BsaWNlKGl0ZXJhdG9yIF9fcG9zLCBfU2VsZiYgX194LCBpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpIHsKLSAgICBpZiAoX19maXJzdCAhPSBfX2xhc3QpIHsKLSAgICAgIGlmICh0aGlzLT5nZXRfYWxsb2NhdG9yKCkgPT0gX194LmdldF9hbGxvY2F0b3IoKSkgewotICAgICAgICBfU1RMUF9QUklWIF9TbF9nbG9iYWxfaW5zdDo6X19zcGxpY2VfYWZ0ZXIoX1NUTFBfUFJJViBfU2xfZ2xvYmFsX2luc3Q6Ol9fcHJldmlvdXMoJnRoaXMtPl9NX2hlYWQuX01fZGF0YSwgX19wb3MuX01fbm9kZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9TbF9nbG9iYWxfaW5zdDo6X19wcmV2aW91cygmX194Ll9NX2hlYWQuX01fZGF0YSwgX19maXJzdC5fTV9ub2RlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX1NsX2dsb2JhbF9pbnN0OjpfX3ByZXZpb3VzKF9fZmlyc3QuX01fbm9kZSwgX19sYXN0Ll9NX25vZGUpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBpbnNlcnQoX19wb3MsIF9fZmlyc3QsIF9fbGFzdCk7Ci0gICAgICAgIF9feC5lcmFzZShfX2ZpcnN0LCBfX2xhc3QpOwotICAgICAgfQotICAgIH0KLSAgfQotCi1wdWJsaWM6Ci0gIHZvaWQgcmV2ZXJzZSgpIHsKLSAgICBpZiAodGhpcy0+X01faGVhZC5fTV9kYXRhLl9NX25leHQpCi0gICAgICB0aGlzLT5fTV9oZWFkLl9NX2RhdGEuX01fbmV4dCA9IF9TVExQX1BSSVYgX1NsX2dsb2JhbF9pbnN0OjpfX3JldmVyc2UodGhpcy0+X01faGVhZC5fTV9kYXRhLl9NX25leHQpOwotICB9Ci0KLSAgdm9pZCByZW1vdmUoY29uc3QgX1RwJiBfX3ZhbCk7Ci0KLSAgdm9pZCB1bmlxdWUoKSB7IF9TVExQX1BSSVYgX1NsaXN0X3VuaXF1ZSgqdGhpcywgZXF1YWxfdG88dmFsdWVfdHlwZT4oKSk7IH0KLSAgdm9pZCBtZXJnZShfU2VsZiYgX194KSB7IF9TVExQX1BSSVYgX1NsaXN0X21lcmdlKCp0aGlzLCBfX3gsIGxlc3M8dmFsdWVfdHlwZT4oKSk7IH0KLSAgdm9pZCBzb3J0KCkgeyBfU1RMUF9QUklWIF9TbGlzdF9zb3J0KCp0aGlzLCBsZXNzPHZhbHVlX3R5cGU+KCkpOyB9Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQotICB0ZW1wbGF0ZSA8Y2xhc3MgX1ByZWRpY2F0ZT4KLSAgdm9pZCByZW1vdmVfaWYoX1ByZWRpY2F0ZSBfX3ByZWQpIHsKLSAgICBfTm9kZV9iYXNlKiBfX2N1ciA9ICZ0aGlzLT5fTV9oZWFkLl9NX2RhdGE7Ci0gICAgd2hpbGUgKF9fY3VyLT5fTV9uZXh0KSB7Ci0gICAgICBpZiAoX19wcmVkKF9fU1RBVElDX0NBU1QoX05vZGUqLCBfX2N1ci0+X01fbmV4dCktPl9NX2RhdGEpKQotICAgICAgICB0aGlzLT5fTV9lcmFzZV9hZnRlcihfX2N1cik7Ci0gICAgICBlbHNlCi0gICAgICAgIF9fY3VyID0gX19jdXItPl9NX25leHQ7Ci0gICAgfQotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIF9CaW5hcnlQcmVkaWNhdGU+Ci0gIHZvaWQgdW5pcXVlKF9CaW5hcnlQcmVkaWNhdGUgX19wcmVkKQotICB7IF9TVExQX1BSSVYgX1NsaXN0X3VuaXF1ZSgqdGhpcywgX19wcmVkKTsgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBfU3RyaWN0V2Vha09yZGVyaW5nPgotICB2b2lkIG1lcmdlKF9TZWxmJiBfX3gsIF9TdHJpY3RXZWFrT3JkZXJpbmcgX19jb21wKQotICB7IF9TVExQX1BSSVYgX1NsaXN0X21lcmdlKCp0aGlzLCBfX3gsIF9fY29tcCk7IH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX1N0cmljdFdlYWtPcmRlcmluZz4KLSAgdm9pZCBzb3J0KF9TdHJpY3RXZWFrT3JkZXJpbmcgX19jb21wKQotICB7IF9TVExQX1BSSVYgX1NsaXN0X3NvcnQoKnRoaXMsIF9fY29tcCk7IH0KLSNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCi19OwotCi0jaWYgZGVmaW5lZCAoc2xpc3QpCi0jICB1bmRlZiBzbGlzdAotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi0jZW5kaWYKLQotX1NUTFBfRU5EX05BTUVTUEFDRQotCi0jaWYgIWRlZmluZWQgKF9TVExQX0xJTktfVElNRV9JTlNUQU5USUFUSU9OKQotIyAgaW5jbHVkZSA8c3RsL19zbGlzdC5jPgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUFRSX1NQRUNJQUxJWkFUSU9OUykKLSMgIGluY2x1ZGUgPHN0bC9wb2ludGVycy9fc2xpc3QuaD4KLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpCi0jICBpbmNsdWRlIDxzdGwvZGVidWcvX3NsaXN0Lmg+Ci0jZW5kaWYKLQotX1NUTFBfQkVHSU5fTkFNRVNQQUNFCi0KLXRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KLWlubGluZSBib29sICBfU1RMUF9DQUxMCi1vcGVyYXRvciA9PSAoY29uc3Qgc2xpc3Q8X1RwLF9BbGxvYz4mIF9TTDEsIGNvbnN0IHNsaXN0PF9UcCxfQWxsb2M+JiBfU0wyKSB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgc2xpc3Q8X1RwLF9BbGxvYz46OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOwotICBjb25zdF9pdGVyYXRvciBfX2VuZDEgPSBfU0wxLmVuZCgpOwotICBjb25zdF9pdGVyYXRvciBfX2VuZDIgPSBfU0wyLmVuZCgpOwotCi0gIGNvbnN0X2l0ZXJhdG9yIF9faTEgPSBfU0wxLmJlZ2luKCk7Ci0gIGNvbnN0X2l0ZXJhdG9yIF9faTIgPSBfU0wyLmJlZ2luKCk7Ci0gIHdoaWxlIChfX2kxICE9IF9fZW5kMSAmJiBfX2kyICE9IF9fZW5kMiAmJiAqX19pMSA9PSAqX19pMikgewotICAgICsrX19pMTsKLSAgICArK19faTI7Ci0gIH0KLSAgcmV0dXJuIF9faTEgPT0gX19lbmQxICYmIF9faTIgPT0gX19lbmQyOwotfQotCi0jZGVmaW5lIF9TVExQX0VRVUFMX09QRVJBVE9SX1NQRUNJQUxJWkVECi0jZGVmaW5lIF9TVExQX1RFTVBMQVRFX0hFQURFUiAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Ci0jZGVmaW5lIF9TVExQX1RFTVBMQVRFX0NPTlRBSU5FUiBzbGlzdDxfVHAsIF9BbGxvYz4KLSNpbmNsdWRlIDxzdGwvX3JlbG9wc19jb250Lmg+Ci0jdW5kZWYgX1NUTFBfVEVNUExBVEVfQ09OVEFJTkVSCi0jdW5kZWYgX1NUTFBfVEVNUExBVEVfSEVBREVSCi0jdW5kZWYgX1NUTFBfRVFVQUxfT1BFUkFUT1JfU1BFQ0lBTElaRUQKLQotI2lmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Ci1zdHJ1Y3QgX19tb3ZlX3RyYWl0czxzbGlzdDxfVHAsIF9BbGxvYz4gPiB7Ci0gIHR5cGVkZWYgX19zdGxwX21vdmFibGUgaW1wbGVtZW50ZWQ7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX19tb3ZlX3RyYWl0czxfQWxsb2M+Ojpjb21wbGV0ZSBjb21wbGV0ZTsKLX07Ci0KLS8vIFNwZWNpYWxpemF0aW9uIG9mIGluc2VydF9pdGVyYXRvciBzbyB0aGF0IGluc2VydGlvbnMgd2lsbCBiZSBjb25zdGFudAotLy8gdGltZSByYXRoZXIgdGhhbiBsaW5lYXIgdGltZS4KLXRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KLWNsYXNzIGluc2VydF9pdGVyYXRvcjxzbGlzdDxfVHAsIF9BbGxvYz4gPiB7Ci1wcm90ZWN0ZWQ6Ci0gIHR5cGVkZWYgc2xpc3Q8X1RwLCBfQWxsb2M+IF9Db250YWluZXI7Ci0gIF9Db250YWluZXIqIF9NX2NvbnRhaW5lcjsKLSAgdHlwZW5hbWUgX0NvbnRhaW5lcjo6aXRlcmF0b3IgX01faXRlcjsKLXB1YmxpYzoKLSAgdHlwZWRlZiBfQ29udGFpbmVyICAgICAgICAgIGNvbnRhaW5lcl90eXBlOwotICB0eXBlZGVmIG91dHB1dF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7Ci0gIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOwotICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOwotICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgcG9pbnRlcjsKLSAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKLQotICBpbnNlcnRfaXRlcmF0b3IoX0NvbnRhaW5lciYgX194LCB0eXBlbmFtZSBfQ29udGFpbmVyOjppdGVyYXRvciBfX2kpCi0gICAgOiBfTV9jb250YWluZXIoJl9feCkgewotICAgIGlmIChfX2kgPT0gX194LmJlZ2luKCkpCi0gICAgICBfTV9pdGVyID0gX194LmJlZm9yZV9iZWdpbigpOwotICAgIGVsc2UKLSAgICAgIF9NX2l0ZXIgPSBfX3gucHJldmlvdXMoX19pKTsKLSAgfQotCi0gIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYKLSAgb3BlcmF0b3IgPSAoY29uc3QgdHlwZW5hbWUgX0NvbnRhaW5lcjo6dmFsdWVfdHlwZSYgX192YWwpIHsKLSAgICBfTV9pdGVyID0gX01fY29udGFpbmVyLT5pbnNlcnRfYWZ0ZXIoX01faXRlciwgX192YWwpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYgb3BlcmF0b3IqKCkgeyByZXR1cm4gKnRoaXM7IH0KLSAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JiBvcGVyYXRvcisrKCkgeyByZXR1cm4gKnRoaXM7IH0KLSAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JiBvcGVyYXRvcisrKGludCkgeyByZXR1cm4gKnRoaXM7IH0KLX07Ci0jZW5kaWYgLyogX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTiAqLwotCi1fU1RMUF9FTkRfTkFNRVNQQUNFCi0KLSNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9TTElTVF9IICovCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX3NwYXJjX2F0b21pYy5oIGIvc3RsL19zcGFyY19hdG9taWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBkMTBmMy4uMDAwMDAwMAotLS0gYS9zdGwvX3NwYXJjX2F0b21pYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotCi0vLyBDdXJyZW50bHksIFNVTiBDQyByZXF1aXJlcyBvYmplY3QgZmlsZQotCi0jaWYgZGVmaW5lZCAoX19HTlVDX18pCi0KLS8qCi0qKiAgaW50IF9TVExQX2F0b21pY19leGNoYW5nZSAoX19zdGxfYXRvbWljX3QgKnB2YWx1ZSwgX19zdGxfYXRvbWljX3QgdmFsdWUpCi0qLwotCi0jIGlmIGRlZmluZWQoX19zcGFyY192OV9fKSB8fCBkZWZpbmVkIChfX3NwYXJjdjkpIAotCi0jICBpZmRlZiBfX2FyY2g2NF9fCi0KLSMgICBkZWZpbmUgX1NUTFBfRVhDSF9BU00gIGFzbSB2b2xhdGlsZSAoImNhc3ggWyUzXSwgJTQsICUwIDsgIG1lbWJhciAgI0xvYWRMb2FkIHwgI0xvYWRTdG9yZSAiIDogXAotICAgICAgICAgICAgICAgICAgICI9ciIgKF9MX3ZhbHVlMiksICI9bSIgKCpfTF9wdmFsdWUxKSA6IFwKLSAgICAgICAgICAgICAgICAgICAibSIgKCpfTF9wdmFsdWUxKSwgInIiIChfTF9wdmFsdWUxKSwgInIiIChfTF92YWx1ZTEpLCAiMCIgKF9MX3ZhbHVlMikgKQotCi0jICBlbHNlIC8qIF9fYXJjaDY0X18gKi8KLQotIyAgIGRlZmluZSBfU1RMUF9FWENIX0FTTSAgYXNtIHZvbGF0aWxlICgiY2FzIFslM10sICU0LCAlMCIgOiBcCi0gICAgICAgICAgICAgICAgICAgIj1yIiAoX0xfdmFsdWUyKSwgIj1tIiAoKl9MX3B2YWx1ZTEpIDogXAotICAgICAgICAgICAgICAgICAgICJtIiAoKl9MX3B2YWx1ZTEpLCAiciIgKF9MX3B2YWx1ZTEpLCAiciIgKF9MX3ZhbHVlMSksICIwIiAoX0xfdmFsdWUyKSApCi0jICBlbmRpZgotCi0jIGVsc2UgLyogX19zcGFyY192OV9fICovCi0KLSMgIGRlZmluZSBfU1RMUF9FWENIX0FTTSBhc20gdm9sYXRpbGUgKCJzd2FwIFslM10sICUwICIgOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPXIiIChfTF92YWx1ZTIpLCAiPW0iICgqX0xfcHZhbHVlMSkgOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibSIgKCpfTF9wdmFsdWUxKSwgInIiIChfTF9wdmFsdWUxKSwgICIwIiAoX0xfdmFsdWUyKSApCi0jIGVuZGlmCi0KLQotIyAgZGVmaW5lIF9TVExQX0FUT01JQ19FWENIQU5HRShfX3B2YWx1ZTEsIF9fdmFsdWUyKSBcCi0gKHsgIHJlZ2lzdGVyIHZvbGF0aWxlIF9fc3RsX2F0b21pY190ICpfTF9wdmFsdWUxID0gX19wdmFsdWUxOyBcCi0gICAgIHJlZ2lzdGVyIF9fc3RsX2F0b21pY190IF9MX3ZhbHVlMSwgX0xfdmFsdWUyID0gIF9fdmFsdWUyIDsgXAotICAgICBkbyB7IF9MX3ZhbHVlMSA9ICpfTF9wdmFsdWUxOyBfU1RMUF9FWENIX0FTTTsgfSB3aGlsZSAoIF9MX3ZhbHVlMSAhPSBfTF92YWx1ZTIgKSA7IFwKLSAgICAgX0xfdmFsdWUxOyB9KQotCi0jICBkZWZpbmUgX1NUTFBfQVRPTUlDX0lOQ1JFTUVOVChfX3B2YWx1ZTEpIFwKLSAoeyAgcmVnaXN0ZXIgdm9sYXRpbGUgX19zdGxfYXRvbWljX3QgKl9MX3B2YWx1ZTEgPSBfX3B2YWx1ZTE7IFwKLSAgICByZWdpc3RlciBfX3N0bF9hdG9taWNfdCBfTF92YWx1ZTEsIF9MX3ZhbHVlMjsgXAotICAgIGRvIHsgX0xfdmFsdWUxID0gKl9MX3B2YWx1ZTE7ICBfTF92YWx1ZTIgPSBfTF92YWx1ZTErMTsgX1NUTFBfRVhDSF9BU007IH0gd2hpbGUgKCBfTF92YWx1ZTEgIT0gX0xfdmFsdWUyICkgOyBcCi0gICAgKF9MX3ZhbHVlMiArIDEpOyB9KQotCi0jICBkZWZpbmUgX1NUTFBfQVRPTUlDX0RFQ1JFTUVOVChfX3B2YWx1ZTEpIFwKLSAoeyAgcmVnaXN0ZXIgdm9sYXRpbGUgX19zdGxfYXRvbWljX3QgKl9MX3B2YWx1ZTEgPSBfX3B2YWx1ZTE7IFwKLSAgICByZWdpc3RlciBfX3N0bF9hdG9taWNfdCBfTF92YWx1ZTEsIF9MX3ZhbHVlMjsgXAotICAgIGRvIHsgX0xfdmFsdWUxID0gKl9MX3B2YWx1ZTE7ICBfTF92YWx1ZTIgPSBfTF92YWx1ZTEtMTsgX1NUTFBfRVhDSF9BU007IH0gd2hpbGUgKCBfTF92YWx1ZTEgIT0gX0xfdmFsdWUyICkgOyBcCi0gICAgKF9MX3ZhbHVlMiAtIDEpOyB9KQotCi0jIGVsaWYgISBkZWZpbmVkIChfU1RMUF9OT19FWFRFUk5fSU5MSU5FKQotCi1leHRlcm4gIkMiIF9fc3RsX2F0b21pY190IF9TVExQX2F0b21pY19leGNoYW5nZShfX3N0bF9hdG9taWNfdCAqIF9feCwgX19zdGxfYXRvbWljX3QgX192KTsKLWV4dGVybiAiQyIgdm9pZCBfU1RMUF9hdG9taWNfZGVjcmVtZW50KF9fc3RsX2F0b21pY190KiBpKTsKLWV4dGVybiAiQyIgdm9pZCBfU1RMUF9hdG9taWNfaW5jcmVtZW50KF9fc3RsX2F0b21pY190KiBpKTsKLQotIyAgZGVmaW5lIF9TVExQX0FUT01JQ19JTkNSRU1FTlQoX194KSAgICAgICAgICAgX1NUTFBfYXRvbWljX2luY3JlbWVudCgoX19zdGxfYXRvbWljX3QqKV9feCkKLSMgIGRlZmluZSBfU1RMUF9BVE9NSUNfREVDUkVNRU5UKF9feCkgICAgICAgICAgIF9TVExQX2F0b21pY19kZWNyZW1lbnQoKF9fc3RsX2F0b21pY190KilfX3gpCi0jICBkZWZpbmUgX1NUTFBfQVRPTUlDX0VYQ0hBTkdFKF9feCwgX195KSAgICAgICBfU1RMUF9hdG9taWNfZXhjaGFuZ2UoKF9fc3RsX2F0b21pY190KilfX3gsIChfX3N0bF9hdG9taWNfdClfX3kpCi0KLSMgZW5kaWYKLQpkaWZmIC0tZ2l0IGEvc3RsL19zc3RyZWFtLmMgYi9zdGwvX3NzdHJlYW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JmNDM5Zi4uMDAwMDAwMAotLS0gYS9zdGwvX3NzdHJlYW0uYworKysgL2Rldi9udWxsCkBAIC0xLDUzNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0jaWZuZGVmIF9TVExQX1NTVFJFQU1fQwotI2RlZmluZSBfU1RMUF9TU1RSRUFNX0MKLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9TU1RSRUFNCi0jICBpbmNsdWRlIDxzdGwvX3NzdHJlYW0uaD4KLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoIF9TVExQX05FU1RFRF9UWVBFX1BBUkFNX0JVRyApCi0vLyBubyB3aW50X3QgaXMgc3VwcG9ydGVkIGZvciB0aGlzIG1vZGUKLSMgIGRlZmluZSBfX0JTQl9pbnRfdHlwZV9fIGludAotIyAgZGVmaW5lIF9fQlNCX3Bvc190eXBlX18gc3RyZWFtcG9zCi0jZWxzZQotIyAgZGVmaW5lIF9fQlNCX2ludF90eXBlX18gX1NUTFBfVFlQRU5BTUVfT05fUkVUVVJOX1RZUEUgYmFzaWNfc3RyaW5nYnVmPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6aW50X3R5cGUKLSMgIGRlZmluZSBfX0JTQl9wb3NfdHlwZV9fIF9TVExQX1RZUEVOQU1FX09OX1JFVFVSTl9UWVBFIGJhc2ljX3N0cmluZ2J1ZjxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OnBvc190eXBlCi0jZW5kaWYKLQotX1NUTFBfQkVHSU5fTkFNRVNQQUNFCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTm9uLWlubGluZSBzdHJpbmdidWYgbWVtYmVyIGZ1bmN0aW9ucy4KLQotLy8gQ29uc3RydWN0b3JzLiAgTm90ZSB0aGF0IHRoZSBiYXNlIGNsYXNzIGNvbnN0cnVjdG9yIHNldHMgYWxsIG9mIHRoZQotLy8gZ2V0IGFuZCBhcmVhIHBvaW50ZXJzIHRvIG51bGwuCi0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KLWJhc2ljX3N0cmluZ2J1ZjxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4KLSAgOjpiYXNpY19zdHJpbmdidWYoaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSkKLSAgICA6IGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KCksIF9NX21vZGUoX19tb2RlKSwgX01fc3RyKCkKLXt9Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KLWJhc2ljX3N0cmluZ2J1ZjxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4KLSAgOjpiYXNpY19zdHJpbmdidWYoY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19zLCBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlKQotICAgIDogYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4oKSwgX01fbW9kZShfX21vZGUpLCBfTV9zdHIoX19zKQotewotICBfTV9zZXRfcHRycygpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+Ci1iYXNpY19zdHJpbmdidWY8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+Ojp+YmFzaWNfc3RyaW5nYnVmKCkKLXt9Ci0KLS8vIFNldCB0aGUgdW5kZXJseWluZyBzdHJpbmcgdG8gYSBuZXcgdmFsdWUuCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+Ci12b2lkCi1iYXNpY19zdHJpbmdidWY8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjpzdHIoY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19zKQotewotICBfTV9zdHIgPSBfX3M7Ci0gIF9NX3NldF9wdHJzKCk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KLXZvaWQKLWJhc2ljX3N0cmluZ2J1ZjxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46Ol9NX3NldF9wdHJzKCkgewotICBfQ2hhclQqIF9fZGF0YV9wdHIgPSBfX0NPTlNUX0NBU1QoX0NoYXJUKixfTV9zdHIuZGF0YSgpKTsKLSAgX0NoYXJUKiBfX2RhdGFfZW5kID0gX19kYXRhX3B0ciArIF9NX3N0ci5zaXplKCk7Ci0gIC8vIFRoZSBpbml0aWFsIHJlYWQgcG9zaXRpb24gaXMgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyaW5nLgotICBpZiAoX01fbW9kZSAmIGlvc19iYXNlOjppbikgewotICAgIGlmIChfTV9tb2RlICYgaW9zX2Jhc2U6OmF0ZSkKLSAgICAgIHRoaXMtPnNldGcoX19kYXRhX3B0ciwgX19kYXRhX2VuZCwgX19kYXRhX2VuZCk7Ci0gICAgZWxzZQotICAgICAgdGhpcy0+c2V0ZyhfX2RhdGFfcHRyLCBfX2RhdGFfcHRyLCBfX2RhdGFfZW5kKTsKLSAgfQotCi0gIC8vIFRoZSBpbml0aWFsIHdyaXRlIHBvc2l0aW9uIGlzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmluZy4KLSAgaWYgKF9NX21vZGUgJiBpb3NfYmFzZTo6b3V0KSB7Ci0gICAgaWYgKF9NX21vZGUgJiAoaW9zX2Jhc2U6OmFwcCB8IGlvc19iYXNlOjphdGUpKQotICAgICAgdGhpcy0+c2V0cChfX2RhdGFfZW5kLCBfX2RhdGFfZW5kKTsKLSAgICBlbHNlCi0gICAgICB0aGlzLT5zZXRwKF9fZGF0YV9wdHIsIF9fZGF0YV9lbmQpOwotICB9Ci19Ci0KLS8vIFByZWNvbmRpdGlvbjogZ3B0cigpID49IGVncHRyKCkuICBSZXR1cm5zIGEgY2hhcmFjdGVyLCBpZiBvbmUgaXMgYXZhaWxhYmxlLgotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgotX19CU0JfaW50X3R5cGVfXwotYmFzaWNfc3RyaW5nYnVmPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6dW5kZXJmbG93KCkgewotICByZXR1cm4gdGhpcy0+Z3B0cigpICE9IHRoaXMtPmVncHRyKCkKLSAgICA/IF9UcmFpdHM6OnRvX2ludF90eXBlKCp0aGlzLT5ncHRyKCkpCi0gICAgOiBfVHJhaXRzOjplb2YoKTsKLX0KLQotLy8gUHJlY29uZGl0aW9uOiBncHRyKCkgPj0gZWdwdHIoKS4KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KLV9fQlNCX2ludF90eXBlX18KLWJhc2ljX3N0cmluZ2J1ZjxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OnVmbG93KCkgewotICBpZiAodGhpcy0+Z3B0cigpICE9IHRoaXMtPmVncHRyKCkpIHsKLSAgICBpbnRfdHlwZSBfX2MgPSBfVHJhaXRzOjp0b19pbnRfdHlwZSgqdGhpcy0+Z3B0cigpKTsKLSAgICB0aGlzLT5nYnVtcCgxKTsKLSAgICByZXR1cm4gX19jOwotICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gX1RyYWl0czo6ZW9mKCk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KLV9fQlNCX2ludF90eXBlX18KLWJhc2ljX3N0cmluZ2J1ZjxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OnBiYWNrZmFpbChpbnRfdHlwZSBfX2MpIHsKLSAgaWYgKHRoaXMtPmdwdHIoKSAhPSB0aGlzLT5lYmFjaygpKSB7Ci0gICAgaWYgKCFfVHJhaXRzOjplcV9pbnRfdHlwZShfX2MsIF9UcmFpdHM6OmVvZigpKSkgewotICAgICAgaWYgKF9UcmFpdHM6OmVxKF9UcmFpdHM6OnRvX2NoYXJfdHlwZShfX2MpLCB0aGlzLT5ncHRyKClbLTFdKSkgewotICAgICAgICB0aGlzLT5nYnVtcCgtMSk7Ci0gICAgICAgIHJldHVybiBfX2M7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChfTV9tb2RlICYgaW9zX2Jhc2U6Om91dCkgewotICAgICAgICB0aGlzLT5nYnVtcCgtMSk7Ci0gICAgICAgICp0aGlzLT5ncHRyKCkgPSBfVHJhaXRzOjp0b19jaGFyX3R5cGUoX19jKTsKLSAgICAgICAgcmV0dXJuIF9fYzsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIF9UcmFpdHM6OmVvZigpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIHRoaXMtPmdidW1wKC0xKTsKLSAgICAgIHJldHVybiBfVHJhaXRzOjpub3RfZW9mKF9fYyk7Ci0gICAgfQotICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gX1RyYWl0czo6ZW9mKCk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KLV9fQlNCX2ludF90eXBlX18KLWJhc2ljX3N0cmluZ2J1ZjxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46Om92ZXJmbG93KGludF90eXBlIF9fYykgewotICAvLyBmYnAgOiByZXZlcnNlIG9yZGVyIG9mICJpZnMiIHRvIHBhc3MgRGlldG1hcidzIHRlc3QuCi0gIC8vIEFwcGFyZW50bHksIHN0YW5kYXJkIGFsbG93cyBvdmVyZmxvdyB3aXRoIGVvZiBldmVuIGZvciByZWFkLW9ubHkgc3RyZWFtcy4KLSAgaWYgKCFfVHJhaXRzOjplcV9pbnRfdHlwZShfX2MsIF9UcmFpdHM6OmVvZigpKSkgewotICAgIGlmIChfTV9tb2RlICYgaW9zX2Jhc2U6Om91dCkgewotICAgICAgaWYgKCEoX01fbW9kZSAmIGlvc19iYXNlOjppbikpIHsKLSAgICAgICAgLy8gSXQncyBhIHdyaXRlLW9ubHkgc3RyZWFtYnVmLCBzbyB3ZSBjYW4gdXNlIHNwZWNpYWwgYXBwZW5kIGJ1ZmZlci4KLSAgICAgICAgaWYgKHRoaXMtPnBwdHIoKSA9PSB0aGlzLT5lcHB0cigpKQotICAgICAgICAgIHRoaXMtPl9NX2FwcGVuZF9idWZmZXIoKTsKLQotICAgICAgICBpZiAodGhpcy0+cHB0cigpICE9IHRoaXMtPmVwcHRyKCkpIHsKLSAgICAgICAgICAqdGhpcy0+cHB0cigpID0gX1RyYWl0czo6dG9fY2hhcl90eXBlKF9fYyk7Ci0gICAgICAgICAgdGhpcy0+cGJ1bXAoMSk7Ci0gICAgICAgICAgcmV0dXJuIF9fYzsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgcmV0dXJuIF9UcmFpdHM6OmVvZigpOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIC8vIFdlJ3JlIG5vdCB1c2luZyBhIHNwZWNpYWwgYXBwZW5kIGJ1ZmZlciwganVzdCB0aGUgc3RyaW5nIGl0c2VsZi4KLSAgICAgICAgaWYgKHRoaXMtPnBwdHIoKSA9PSB0aGlzLT5lcHB0cigpKSB7Ci0gICAgICAgICAgcHRyZGlmZl90IF9fb2Zmc2V0ID0gdGhpcy0+Z3B0cigpIC0gdGhpcy0+ZWJhY2soKTsKLSAgICAgICAgICBfTV9zdHIucHVzaF9iYWNrKF9UcmFpdHM6OnRvX2NoYXJfdHlwZShfX2MpKTsKLQotICAgICAgICAgIF9DaGFyVCogX19kYXRhX3B0ciA9IF9fQ09OU1RfQ0FTVChfQ2hhclQqLF9NX3N0ci5kYXRhKCkpOwotICAgICAgICAgIHNpemVfdCBfX2RhdGFfc2l6ZSA9IF9NX3N0ci5zaXplKCk7Ci0KLSAgICAgICAgICB0aGlzLT5zZXRnKF9fZGF0YV9wdHIsIF9fZGF0YV9wdHIgKyBfX29mZnNldCwgX19kYXRhX3B0citfX2RhdGFfc2l6ZSk7Ci0gICAgICAgICAgdGhpcy0+c2V0cChfX2RhdGFfcHRyLCBfX2RhdGFfcHRyICsgX19kYXRhX3NpemUpOwotICAgICAgICAgIHRoaXMtPnBidW1wKChpbnQpX19kYXRhX3NpemUpOwotICAgICAgICAgIHJldHVybiBfX2M7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgKnRoaXMtPnBwdHIoKSA9IF9UcmFpdHM6OnRvX2NoYXJfdHlwZShfX2MpOwotICAgICAgICAgIHRoaXMtPnBidW1wKDEpOwotICAgICAgICAgIHJldHVybiBfX2M7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3ZlcmZsb3cgYWx3YXlzIGZhaWxzIGlmIGl0J3MgcmVhZC1vbmx5Ci0gICAgICByZXR1cm4gX1RyYWl0czo6ZW9mKCk7Ci0gIH0KLSAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgIC8vIF9fYyBpcyBFT0YsIHNvIHdlIGRvbid0IGhhdmUgdG8gZG8gYW55dGhpbmcKLSAgICByZXR1cm4gX1RyYWl0czo6bm90X2VvZihfX2MpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+Ci1zdHJlYW1zaXplCi1iYXNpY19zdHJpbmdidWY8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+Ojp4c3B1dG4oY29uc3QgY2hhcl90eXBlKiBfX3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtc2l6ZSBfX24pIHsKLSAgc3RyZWFtc2l6ZSBfX253cml0dGVuID0gMDsKLQotICBpZiAoKF9NX21vZGUgJiBpb3NfYmFzZTo6b3V0KSAmJiBfX24gPiAwKSB7Ci0gICAgLy8gSWYgdGhlIHB1dCBwb2ludGVyIGlzIHNvbWV3aGVyZSBpbiB0aGUgbWlkZGxlIG9mIHRoZSBzdHJpbmcsCi0gICAgLy8gdGhlbiBvdmVyd3JpdGUgaW5zdGVhZCBvZiBhcHBlbmQuCi0gICAgaWYgKHRoaXMtPnBiYXNlKCkgPT0gX01fc3RyLmRhdGEoKSApIHsKLSAgICAgIHB0cmRpZmZfdCBfX2F2YWlsID0gX01fc3RyLmRhdGEoKSArIF9NX3N0ci5zaXplKCkgLSB0aGlzLT5wcHRyKCk7Ci0gICAgICBpZiAoX19hdmFpbCA+IF9fbikgewotICAgICAgICBfVHJhaXRzOjpjb3B5KHRoaXMtPnBwdHIoKSwgX19zLCBfX1NUQVRJQ19DQVNUKHNpemVfdCwgX19uKSk7Ci0gICAgICAgIHRoaXMtPnBidW1wKChpbnQpX19uKTsKLSAgICAgICAgcmV0dXJuIF9fbjsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBfVHJhaXRzOjpjb3B5KHRoaXMtPnBwdHIoKSwgX19zLCBfX2F2YWlsKTsKLSAgICAgICAgX19ud3JpdHRlbiArPSBfX2F2YWlsOwotICAgICAgICBfX24gLT0gX19hdmFpbDsKLSAgICAgICAgX19zICs9IF9fYXZhaWw7Ci0gICAgICAgIHRoaXMtPnNldHAoX01fQnVmLCBfTV9CdWYgKyBfX1NUQVRJQ19DQVNUKGludCxfU19CdWZTaXopKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBBdCB0aGlzIHBvaW50IHdlIGtub3cgd2UncmUgYXBwZW5kaW5nLgotICAgIGlmIChfTV9tb2RlICYgaW9zX2Jhc2U6OmluKSB7Ci0gICAgICBwdHJkaWZmX3QgX19nZXRfb2Zmc2V0ID0gdGhpcy0+Z3B0cigpIC0gdGhpcy0+ZWJhY2soKTsKLSAgICAgIF9NX3N0ci5hcHBlbmQoX19zLCBfX3MgKyBfX1NUQVRJQ19DQVNUKHB0cmRpZmZfdCwgX19uKSk7Ci0KLSAgICAgIF9DaGFyVCogX19kYXRhX3B0ciA9IF9fQ09OU1RfQ0FTVChfQ2hhclQqLCBfTV9zdHIuZGF0YSgpKTsKLSAgICAgIHNpemVfdCBfX2RhdGFfc2l6ZSA9IF9NX3N0ci5zaXplKCk7Ci0KLSAgICAgIHRoaXMtPnNldGcoX19kYXRhX3B0ciwgX19kYXRhX3B0ciArIF9fZ2V0X29mZnNldCwgX19kYXRhX3B0ciArIF9fZGF0YV9zaXplKTsKLSAgICAgIHRoaXMtPnNldHAoX19kYXRhX3B0ciwgX19kYXRhX3B0ciArIF9fZGF0YV9zaXplKTsKLSAgICAgIHRoaXMtPnBidW1wKChpbnQpX19kYXRhX3NpemUpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIF9NX2FwcGVuZF9idWZmZXIoKTsKLSAgICAgIF9NX3N0ci5hcHBlbmQoX19zLCBfX3MgKyBfX1NUQVRJQ19DQVNUKHB0cmRpZmZfdCwgX19uKSk7Ci0gICAgfQotCi0gICAgX19ud3JpdHRlbiArPSBfX247Ci0gIH0KLQotICByZXR1cm4gX19ud3JpdHRlbjsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgotc3RyZWFtc2l6ZQotYmFzaWNfc3RyaW5nYnVmPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6X01feHNwdXRuYyhjaGFyX3R5cGUgX19jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1zaXplIF9fbikgewotICBzdHJlYW1zaXplIF9fbndyaXR0ZW4gPSAwOwotCi0gIGlmICgoX01fbW9kZSAmIGlvc19iYXNlOjpvdXQpICYmIF9fbiA+IDApIHsKLSAgICAvLyBJZiB0aGUgcHV0IHBvaW50ZXIgaXMgc29tZXdoZXJlIGluIHRoZSBtaWRkbGUgb2YgdGhlIHN0cmluZywKLSAgICAvLyB0aGVuIG92ZXJ3cml0ZSBpbnN0ZWFkIG9mIGFwcGVuZC4KLSAgICBpZiAodGhpcy0+cGJhc2UoKSA9PSBfTV9zdHIuZGF0YSgpKSB7Ci0gICAgICBwdHJkaWZmX3QgX19hdmFpbCA9IF9NX3N0ci5kYXRhKCkgKyBfTV9zdHIuc2l6ZSgpIC0gdGhpcy0+cHB0cigpOwotICAgICAgaWYgKF9fYXZhaWwgPiBfX24pIHsKLSAgICAgICAgX1RyYWl0czo6YXNzaWduKHRoaXMtPnBwdHIoKSwgX19TVEFUSUNfQ0FTVChzaXplX3QsIF9fbiksIF9fYyk7Ci0gICAgICAgIHRoaXMtPnBidW1wKF9fU1RBVElDX0NBU1QoaW50LCBfX24pKTsKLSAgICAgICAgcmV0dXJuIF9fbjsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBfVHJhaXRzOjphc3NpZ24odGhpcy0+cHB0cigpLCBfX2F2YWlsLCBfX2MpOwotICAgICAgICBfX253cml0dGVuICs9IF9fYXZhaWw7Ci0gICAgICAgIF9fbiAtPSBfX2F2YWlsOwotICAgICAgICB0aGlzLT5zZXRwKF9NX0J1ZiwgX01fQnVmICsgX19TVEFUSUNfQ0FTVChpbnQsX1NfQnVmU2l6KSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gQXQgdGhpcyBwb2ludCB3ZSBrbm93IHdlJ3JlIGFwcGVuZGluZy4KLSAgICBzaXplX3QgX19hcHBfc2l6ZSA9IHNpemVvZihzdHJlYW1zaXplKSA+IHNpemVvZihzaXplX3QpID8gX19TVEFUSUNfQ0FTVChzaXplX3QsIChtaW4pKF9fbiwgX19TVEFUSUNfQ0FTVChzdHJlYW1zaXplLCBfTV9zdHIubWF4X3NpemUoKSkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfX1NUQVRJQ19DQVNUKHNpemVfdCwgX19uKTsKLSAgICBpZiAodGhpcy0+X01fbW9kZSAmIGlvc19iYXNlOjppbikgewotICAgICAgcHRyZGlmZl90IF9fZ2V0X29mZnNldCA9IHRoaXMtPmdwdHIoKSAtIHRoaXMtPmViYWNrKCk7Ci0gICAgICBfTV9zdHIuYXBwZW5kKF9fYXBwX3NpemUsIF9fYyk7Ci0KLSAgICAgIF9DaGFyVCogX19kYXRhX3B0ciA9IF9fQ09OU1RfQ0FTVChfQ2hhclQqLF9NX3N0ci5kYXRhKCkpOwotICAgICAgc2l6ZV90IF9fZGF0YV9zaXplID0gX01fc3RyLnNpemUoKTsKLQotICAgICAgdGhpcy0+c2V0ZyhfX2RhdGFfcHRyLCBfX2RhdGFfcHRyICsgX19nZXRfb2Zmc2V0LCBfX2RhdGFfcHRyICsgX19kYXRhX3NpemUpOwotICAgICAgdGhpcy0+c2V0cChfX2RhdGFfcHRyLCBfX2RhdGFfcHRyICsgX19kYXRhX3NpemUpOwotICAgICAgdGhpcy0+cGJ1bXAoKGludClfX2RhdGFfc2l6ZSk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgX01fYXBwZW5kX2J1ZmZlcigpOwotICAgICAgX01fc3RyLmFwcGVuZChfX2FwcF9zaXplLCBfX2MpOwotICAgIH0KLQotICAgIF9fbndyaXR0ZW4gKz0gX19hcHBfc2l6ZTsKLSAgfQotCi0gIHJldHVybiBfX253cml0dGVuOwotfQotCi0vLyBBY2NvcmRpbmcgdG8gdGhlIEMrKyBzdGFuZGFyZCB0aGUgZWZmZWN0cyBvZiBzZXRidWYgYXJlIGltcGxlbWVudGF0aW9uCi0vLyBkZWZpbmVkLCBleGNlcHQgdGhhdCBzZXRidWYoMCwgMCkgaGFzIG5vIGVmZmVjdC4gIEluIHRoaXMgaW1wbGVtZW50YXRpb24sCi0vLyBzZXRidWYoPGFueXRoaW5nPiwgbiksIGZvciBuID4gMCwgY2FsbHMgcmVzZXJ2ZShuKSBvbiB0aGUgdW5kZXJseWluZwotLy8gc3RyaW5nLgotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgotYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qCi1iYXNpY19zdHJpbmdidWY8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjpzZXRidWYoX0NoYXJUKiwgc3RyZWFtc2l6ZSBfX24pIHsKLSAgaWYgKF9fbiA+IDApIHsKLSAgICBib29sIF9fZG9fZ2V0X2FyZWEgPSBmYWxzZTsKLSAgICBib29sIF9fZG9fcHV0X2FyZWEgPSBmYWxzZTsKLSAgICBwdHJkaWZmX3QgX19vZmZnID0gMDsKLSAgICBwdHJkaWZmX3QgX19vZmZwID0gMDsKLQotICAgIGlmICh0aGlzLT5wYmFzZSgpID09IF9NX3N0ci5kYXRhKCkpIHsKLSAgICAgIF9fZG9fcHV0X2FyZWEgPSB0cnVlOwotICAgICAgX19vZmZwID0gdGhpcy0+cHB0cigpIC0gdGhpcy0+cGJhc2UoKTsKLSAgICB9Ci0KLSAgICBpZiAodGhpcy0+ZWJhY2soKSA9PSBfTV9zdHIuZGF0YSgpKSB7Ci0gICAgICBfX2RvX2dldF9hcmVhID0gdHJ1ZTsKLSAgICAgIF9fb2ZmZyA9IHRoaXMtPmdwdHIoKSAtIHRoaXMtPmViYWNrKCk7Ci0gICAgfQotCi0gICAgaWYgKChfTV9tb2RlICYgaW9zX2Jhc2U6Om91dCkgJiYgIShfTV9tb2RlICYgaW9zX2Jhc2U6OmluKSkKLSAgICAgIF9NX2FwcGVuZF9idWZmZXIoKTsKLQotICAgIF9NX3N0ci5yZXNlcnZlKHNpemVvZihzdHJlYW1zaXplKSA+IHNpemVvZihzaXplX3QpID8gX19TVEFUSUNfQ0FTVChzaXplX3QsIChtaW4pKF9fbiwgX19TVEFUSUNfQ0FTVChzdHJlYW1zaXplLCBfTV9zdHIubWF4X3NpemUoKSkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX19TVEFUSUNfQ0FTVChzaXplX3QsIF9fbikpOwotCi0gICAgX0NoYXJUKiBfX2RhdGFfcHRyID0gX19DT05TVF9DQVNUKF9DaGFyVCosIF9NX3N0ci5kYXRhKCkpOwotICAgIHNpemVfdCBfX2RhdGFfc2l6ZSA9IF9NX3N0ci5zaXplKCk7Ci0KLSAgICBpZiAoX19kb19nZXRfYXJlYSkgewotICAgICAgdGhpcy0+c2V0ZyhfX2RhdGFfcHRyLCBfX2RhdGFfcHRyICsgX19vZmZnLCBfX2RhdGFfcHRyICsgX19kYXRhX3NpemUpOwotICAgIH0KLQotICAgIGlmIChfX2RvX3B1dF9hcmVhKSB7Ci0gICAgICB0aGlzLT5zZXRwKF9fZGF0YV9wdHIsIF9fZGF0YV9wdHIgKyBfX2RhdGFfc2l6ZSk7Ci0gICAgICB0aGlzLT5wYnVtcCgoaW50KV9fb2ZmcCk7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHRoaXM7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KLV9fQlNCX3Bvc190eXBlX18KLWJhc2ljX3N0cmluZ2J1ZjxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4KLSAgOjpzZWVrb2ZmKG9mZl90eXBlIF9fb2ZmLAotICAgICAgICAgICAgaW9zX2Jhc2U6OnNlZWtkaXIgX19kaXIsCi0gICAgICAgICAgICBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlKSB7Ci0gIF9fbW9kZSAmPSBfTV9tb2RlOwotCi0gIGJvb2wgX19pbW9kZSAgPSAoX19tb2RlICYgaW9zX2Jhc2U6OmluKSAhPSAwOwotICBib29sIF9fb21vZGUgPSAoX19tb2RlICYgaW9zX2Jhc2U6Om91dCkgIT0gMDsKLQotICBpZiAoICEoX19pbW9kZSB8fCBfX29tb2RlKSApCi0gICAgcmV0dXJuIHBvc190eXBlKG9mZl90eXBlKC0xKSk7Ci0KLSAgaWYgKCAoX19pbW9kZSAmJiAodGhpcy0+Z3B0cigpID09IDApKSB8fCAoX19vbW9kZSAmJiAodGhpcy0+cHB0cigpID09IDApKSApCi0gICAgcmV0dXJuIHBvc190eXBlKG9mZl90eXBlKC0xKSk7Ci0KLSAgaWYgKChfTV9tb2RlICYgaW9zX2Jhc2U6Om91dCkgJiYgIShfTV9tb2RlICYgaW9zX2Jhc2U6OmluKSkKLSAgICBfTV9hcHBlbmRfYnVmZmVyKCk7Ci0KLSAgc3RyZWFtb2ZmIF9fbmV3b2ZmOwotICBzd2l0Y2goX19kaXIpIHsKLSAgY2FzZSBpb3NfYmFzZTo6YmVnOgotICAgIF9fbmV3b2ZmID0gMDsKLSAgICBicmVhazsKLSAgY2FzZSBpb3NfYmFzZTo6ZW5kOgotICAgIF9fbmV3b2ZmID0gX01fc3RyLnNpemUoKTsKLSAgICBicmVhazsKLSAgY2FzZSBpb3NfYmFzZTo6Y3VyOgotICAgIF9fbmV3b2ZmID0gX19pbW9kZSA/IHRoaXMtPmdwdHIoKSAtIHRoaXMtPmViYWNrKCkgOiB0aGlzLT5wcHRyKCkgLSB0aGlzLT5wYmFzZSgpOwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIHJldHVybiBwb3NfdHlwZShvZmZfdHlwZSgtMSkpOwotICB9Ci0KLSAgX19vZmYgKz0gX19uZXdvZmY7Ci0KLSAgaWYgKF9faW1vZGUpIHsKLSAgICBwdHJkaWZmX3QgX19uID0gdGhpcy0+ZWdwdHIoKSAtIHRoaXMtPmViYWNrKCk7Ci0KLSAgICBpZiAoX19vZmYgPCAwIHx8IF9fb2ZmID4gX19uKQotICAgICAgcmV0dXJuIHBvc190eXBlKG9mZl90eXBlKC0xKSk7Ci0gICAgdGhpcy0+c2V0Zyh0aGlzLT5lYmFjaygpLCB0aGlzLT5lYmFjaygpICsgX19TVEFUSUNfQ0FTVChwdHJkaWZmX3QsIF9fb2ZmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPmViYWNrKCkgKyBfX1NUQVRJQ19DQVNUKHB0cmRpZmZfdCwgX19uKSk7Ci0gIH0KLQotICBpZiAoX19vbW9kZSkgewotICAgIHB0cmRpZmZfdCBfX24gPSB0aGlzLT5lcHB0cigpIC0gdGhpcy0+cGJhc2UoKTsKLQotICAgIGlmIChfX29mZiA8IDAgfHwgX19vZmYgPiBfX24pCi0gICAgICByZXR1cm4gcG9zX3R5cGUob2ZmX3R5cGUoLTEpKTsKLSAgICB0aGlzLT5zZXRwKHRoaXMtPnBiYXNlKCksIHRoaXMtPnBiYXNlKCkgKyBfX24pOwotICAgIHRoaXMtPnBidW1wKChpbnQpX19vZmYpOwotICB9Ci0KLSAgcmV0dXJuIHBvc190eXBlKF9fb2ZmKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgotX19CU0JfcG9zX3R5cGVfXwotYmFzaWNfc3RyaW5nYnVmPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPgotICA6OnNlZWtwb3MocG9zX3R5cGUgX19wb3MsIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUpIHsKLSAgX19tb2RlICY9IF9NX21vZGU7Ci0KLSAgYm9vbCBfX2ltb2RlICA9IChfX21vZGUgJiBpb3NfYmFzZTo6aW4pICE9IDA7Ci0gIGJvb2wgX19vbW9kZSA9IChfX21vZGUgJiBpb3NfYmFzZTo6b3V0KSAhPSAwOwotCi0gIGlmICggIShfX2ltb2RlIHx8IF9fb21vZGUpICkKLSAgICByZXR1cm4gcG9zX3R5cGUob2ZmX3R5cGUoLTEpKTsKLQotICBpZiAoIChfX2ltb2RlICYmICh0aGlzLT5ncHRyKCkgPT0gMCkpIHx8IChfX29tb2RlICYmICh0aGlzLT5wcHRyKCkgPT0gMCkpICkKLSAgICByZXR1cm4gcG9zX3R5cGUob2ZmX3R5cGUoLTEpKTsKLQotICBjb25zdCBvZmZfdHlwZSBfX24gPSBfX3BvcyAtIHBvc190eXBlKG9mZl90eXBlKDApKTsKLSAgaWYgKChfTV9tb2RlICYgaW9zX2Jhc2U6Om91dCkgJiYgIShfTV9tb2RlICYgaW9zX2Jhc2U6OmluKSkKLSAgICBfTV9hcHBlbmRfYnVmZmVyKCk7Ci0KLSAgaWYgKF9faW1vZGUpIHsKLSAgICBpZiAoX19uIDwgMCB8fCBfX24gPiB0aGlzLT5lZ3B0cigpIC0gdGhpcy0+ZWJhY2soKSkKLSAgICAgIHJldHVybiBwb3NfdHlwZShvZmZfdHlwZSgtMSkpOwotICAgIHRoaXMtPnNldGcodGhpcy0+ZWJhY2soKSwgdGhpcy0+ZWJhY2soKSArIF9fU1RBVElDX0NBU1QocHRyZGlmZl90LCBfX24pLCB0aGlzLT5lZ3B0cigpKTsKLSAgfQotCi0gIGlmIChfX29tb2RlKSB7Ci0gICAgaWYgKF9fbiA8IDAgfHwgc2l6ZV90KF9fbikgPiBfTV9zdHIuc2l6ZSgpKQotICAgICAgcmV0dXJuIHBvc190eXBlKG9mZl90eXBlKC0xKSk7Ci0KLSAgICBfQ2hhclQqIF9fZGF0YV9wdHIgPSBfX0NPTlNUX0NBU1QoX0NoYXJUKixfTV9zdHIuZGF0YSgpKTsKLSAgICBzaXplX3QgX19kYXRhX3NpemUgPSBfTV9zdHIuc2l6ZSgpOwotCi0gICAgdGhpcy0+c2V0cChfX2RhdGFfcHRyLCBfX2RhdGFfcHRyK19fZGF0YV9zaXplKTsKLSAgICB0aGlzLT5wYnVtcCgoaW50KV9fbik7Ci0gIH0KLQotICByZXR1cm4gX19wb3M7Ci19Ci0KLS8vIFRoaXMgaXMgZGVjbGFyZWQgYXMgYSBjb25zdCBtZW1iZXIgZnVuY3Rpb24gYmVjYXVzZSBpdCBpcwotLy8gY2FsbGVkIGJ5IGJhc2ljX3N0cmluZ2J1Zjw+OjpzdHIoKS4gIFByZWNvbmRpdGlvbjogdGhpcyBpcyBhCi0vLyB3cml0ZS1vbmx5IHN0cmluZ2J1Zi4gIFdlIGNhbid0IHVzZSBhbiBvdXRwdXQgYnVmZmVyIGZvciByZWFkLQotLy8gd3JpdGUgc3RyaW5nYnVmcy4gIFBvc3Rjb25kaXRpb246IHBwdHIgaXMgcmVzZXQgdG8gdGhlIGJlZ2lubmluZwotLy8gb2YgdGhlIGJ1ZmZlci4KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KLXZvaWQgYmFzaWNfc3RyaW5nYnVmPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6X01fYXBwZW5kX2J1ZmZlcigpIGNvbnN0IHsKLSAgLy8gRG8gd2UgaGF2ZSBhIGJ1ZmZlciB0byBhcHBlbmQ/Ci0gIGlmICh0aGlzLT5wYmFzZSgpID09IHRoaXMtPl9NX0J1ZiAmJiB0aGlzLT5wcHRyKCkgIT0gdGhpcy0+X01fQnVmKSB7Ci0gICAgYmFzaWNfc3RyaW5nYnVmPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiogX190aGlzID0gX19DT05TVF9DQVNUKF9TZWxmKix0aGlzKTsKLSAgICBfX3RoaXMtPl9NX3N0ci5hcHBlbmQoKGNvbnN0IF9DaGFyVCopdGhpcy0+cGJhc2UoKSwgKGNvbnN0IF9DaGFyVCopdGhpcy0+cHB0cigpKTsKLSNpZm5kZWYgX19NV0VSS1NfXwotICAgIF9fdGhpcy0+c2V0cChfX0NPTlNUX0NBU1QoX0NoYXJUKixfTV9CdWYpLAotICAgICAgICAgICAgICAgICBfX0NPTlNUX0NBU1QoX0NoYXJUKixfTV9CdWYgKyBfX1NUQVRJQ19DQVNUKGludCxfU19CdWZTaXopKSk7Ci0jZWxzZSAvLyBDb2RlV2FycmlvciB0cmVhdCBjb25zdCBjaGFyICogYW5kIGNvbnN0IGNoYXIgWzhdIGFzIGRpZmZlcmVudCB0eXBlcwotICAgIF9fdGhpcy0+c2V0cCgoX0NoYXJUKilfTV9CdWYsCi0gICAgICAgICAgICAgICAgIChfQ2hhclQqKShfTV9CdWYgKyBfX1NUQVRJQ19DQVNUKGludCxfU19CdWZTaXopKSk7Ci0jZW5kaWYKLSAgfQotCi0gIC8vIEhhdmUgd2UgcnVuIG9mZiB0aGUgZW5kIG9mIHRoZSBzdHJpbmc/Ci0gIGVsc2UgaWYgKHRoaXMtPnBwdHIoKSA9PSB0aGlzLT5lcHB0cigpKSB7Ci0gICAgYmFzaWNfc3RyaW5nYnVmPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiogX190aGlzID0gX19DT05TVF9DQVNUKF9TZWxmKix0aGlzKTsKLSNpZm5kZWYgX19NV0VSS1NfXwotICAgIF9fdGhpcy0+c2V0cChfX0NPTlNUX0NBU1QoX0NoYXJUKixfTV9CdWYpLAotICAgICAgICAgICAgICAgICBfX0NPTlNUX0NBU1QoX0NoYXJUKixfTV9CdWYgKyBfX1NUQVRJQ19DQVNUKGludCxfU19CdWZTaXopKSk7Ci0jZWxzZSAvLyBDb2RlV2FycmlvciB0cmVhdCBjb25zdCBjaGFyICogYW5kIGNvbnN0IGNoYXIgWzhdIGFzIGRpZmZlcmVudCB0eXBlcwotICAgIF9fdGhpcy0+c2V0cCgoX0NoYXJUKilfTV9CdWYsCi0gICAgICAgICAgICAgICAgIChfQ2hhclQqKShfTV9CdWYgKyBfX1NUQVRJQ19DQVNUKGludCxfU19CdWZTaXopKSk7Ci0jZW5kaWYKLSAgfQotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIE5vbi1pbmxpbmUgaXN0cmluZ3N0cmVhbSBtZW1iZXIgZnVuY3Rpb25zLgotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+Ci1iYXNpY19pc3RyaW5nc3RyZWFtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPgotICA6OmJhc2ljX2lzdHJpbmdzdHJlYW0oaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSkKLSAgICA6IGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPigwKSwKLSAgICAgIF9NX2J1ZihfX21vZGUgfCBpb3NfYmFzZTo6aW4pIHsKLSAgdGhpcy0+aW5pdCgmX01fYnVmKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgotYmFzaWNfaXN0cmluZ3N0cmVhbTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4KLSAgOjpiYXNpY19pc3RyaW5nc3RyZWFtKGNvbnN0IF9TdHJpbmcmIF9fc3RyLGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUpCi0gICAgOiBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4oMCksCi0gICAgICBfTV9idWYoX19zdHIsIF9fbW9kZSB8IGlvc19iYXNlOjppbikgewotICB0aGlzLT5pbml0KCZfTV9idWYpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+Ci1iYXNpY19pc3RyaW5nc3RyZWFtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6fmJhc2ljX2lzdHJpbmdzdHJlYW0oKQote30KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBOb24taW5saW5lIG9zdHJpbmdzdHJlYW0gbWVtYmVyIGZ1bmN0aW9ucy4KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgotYmFzaWNfb3N0cmluZ3N0cmVhbTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4KLSAgOjpiYXNpY19vc3RyaW5nc3RyZWFtKGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUpCi0gICAgOiBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4oMCksCi0gICAgICBfTV9idWYoX19tb2RlIHwgaW9zX2Jhc2U6Om91dCkgewotICB0aGlzLT5pbml0KCZfTV9idWYpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+Ci1iYXNpY19vc3RyaW5nc3RyZWFtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPgotICA6OmJhc2ljX29zdHJpbmdzdHJlYW0oY29uc3QgX1N0cmluZyYgX19zdHIsIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUpCi0gICAgOiBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4oMCksCi0gICAgICBfTV9idWYoX19zdHIsIF9fbW9kZSB8IGlvc19iYXNlOjpvdXQpIHsKLSAgdGhpcy0+aW5pdCgmX01fYnVmKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgotYmFzaWNfb3N0cmluZ3N0cmVhbTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46On5iYXNpY19vc3RyaW5nc3RyZWFtKCkKLXt9Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTm9uLWlubGluZSBzdHJpbmdzdHJlYW0gbWVtYmVyIGZ1bmN0aW9ucy4KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgotYmFzaWNfc3RyaW5nc3RyZWFtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPgotICA6OmJhc2ljX3N0cmluZ3N0cmVhbShpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlKQotICAgIDogYmFzaWNfaW9zdHJlYW08X0NoYXJULCBfVHJhaXRzPigwKSwgX01fYnVmKF9fbW9kZSkgewotICAgdGhpcy0+aW5pdCgmX01fYnVmKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgotYmFzaWNfc3RyaW5nc3RyZWFtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPgotICA6OmJhc2ljX3N0cmluZ3N0cmVhbShjb25zdCBfU3RyaW5nJiBfX3N0ciwgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSkKLSAgICA6IGJhc2ljX2lvc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4oMCksIF9NX2J1ZihfX3N0ciwgX19tb2RlKSB7Ci0gIHRoaXMtPmluaXQoJl9NX2J1Zik7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KLWJhc2ljX3N0cmluZ3N0cmVhbTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46On5iYXNpY19zdHJpbmdzdHJlYW0oKQote30KLQotX1NUTFBfRU5EX05BTUVTUEFDRQotCi0jIHVuZGVmIF9fQlNCX2ludF90eXBlX18KLSMgdW5kZWYgX19CU0JfcG9zX3R5cGVfXwotCi0jZW5kaWYgLyogX1NUTFBfU1NUUkVBTV9DICovCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX3NzdHJlYW0uaCBiL3N0bC9fc3N0cmVhbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjM5NjQ4Li4wMDAwMDAwCi0tLSBhL3N0bC9fc3N0cmVhbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjY5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogQm9yaXMgRm9taXRjaGV2Ci0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICovCi0KLQotLy8gVGhpcyBoZWFkZXIgZGVmaW5lcyBjbGFzc2VzIGJhc2ljX3N0cmluZ2J1ZiwgYmFzaWNfaXN0cmluZ3N0cmVhbSwKLS8vIGJhc2ljX29zdHJpbmdzdHJlYW0sIGFuZCBiYXNpY19zdHJpbmdzdHJlYW0uICBUaGVzZSBjbGFzc2VzCi0vLyByZXByZXNlbnQgc3RyZWFtc2J1ZnMgYW5kIHN0cmVhbXMgd2hvc2Ugc291cmNlcyBvciBkZXN0aW5hdGlvbnMgYXJlCi0vLyBDKysgc3RyaW5ncy4KLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9TU1RSRUFNCi0jZGVmaW5lIF9TVExQX0lOVEVSTkFMX1NTVFJFQU0KLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9TVFJFQU1CVUYKLSMgIGluY2x1ZGUgPHN0bC9fc3RyZWFtYnVmLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9JU1RSRUFNCi0jICBpbmNsdWRlIDxzdGwvX2lzdHJlYW0uaD4gLy8gSW5jbHVkZXMgPG9zdHJlYW0+LCA8aW9zPiwgPGlvc2Z3ZD4KLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX1NUUklOR19ICi0jICBpbmNsdWRlIDxzdGwvX3N0cmluZy5oPgotI2VuZGlmCi0KLV9TVExQX0JFR0lOX05BTUVTUEFDRQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFRoaXMgdmVyc2lvbiBvZiBiYXNpY19zdHJpbmdidWYgcmVsaWVzIG9uIHRoZSBpbnRlcm5hbCBkZXRhaWxzIG9mCi0vLyBiYXNpY19zdHJpbmcuICBJdCByZWxpZXMgb24gdGhlIGZhY3QgdGhhdCwgaW4gdGhpcyBpbXBsZW1lbnRhdGlvbiwKLS8vIGJhc2ljX3N0cmluZydzIGl0ZXJhdG9ycyBhcmUgcG9pbnRlcnMuICBJdCBhbHNvIGFzc3VtZXMgKGFzIGFsbG93ZWQKLS8vIGJ5IHRoZSBzdGFuZGFyZCkgdGhhdCBfQ2hhclQgaXMgYSBQT0QgdHlwZS4KLQotLy8gV2UgaGF2ZSBhIHZlcnkgc21hbGwgYnVmZmVyIGZvciB0aGUgcHV0IGFyZWEsIGp1c3Qgc28gdGhhdCB3ZSBkb24ndAotLy8gaGF2ZSB0byB1c2UgYXBwZW5kKCkgZm9yIGV2ZXJ5IHNwdXRjLiAgQ29uY2VwdHVhbGx5LCB0aGUgYnVmZmVyCi0vLyBpbW1lZGlhdGVseSBmb2xsb3dzIHRoZSBlbmQgb2YgdGhlIHVuZGVybHlpbmcgc3RyaW5nLiAgV2UgdXNlIHRoaXMKLS8vIGJ1ZmZlciB3aGVuIGFwcGVuZGluZyB0byB3cml0ZS1vbmx5IHN0cmVhbWJ1ZnMsIGJ1dCB3ZSBkb24ndCB1c2UgaXQKLS8vIGZvciByZWFkLXdyaXRlIHN0cmVhbWJ1ZnMuCi0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KLWNsYXNzIGJhc2ljX3N0cmluZ2J1ZiA6IHB1YmxpYyBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiB7Ci1wdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR5cGVkZWZzLgotICB0eXBlZGVmIF9DaGFyVCAgICAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjppbnRfdHlwZSBpbnRfdHlwZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpwb3NfdHlwZSBwb3NfdHlwZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpvZmZfdHlwZSBvZmZfdHlwZTsKLSAgdHlwZWRlZiBfVHJhaXRzICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdHlwZTsKLQotICB0eXBlZGVmIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+ICAgICAgICAgIF9CYXNlOwotICB0eXBlZGVmIGJhc2ljX3N0cmluZ2J1ZjxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4gIF9TZWxmOwotICB0eXBlZGVmIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4gICAgIF9TdHJpbmc7Ci0KLXB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29uc3RydWN0b3JzLCBkZXN0cnVjdG9yLgotICBleHBsaWNpdCBiYXNpY19zdHJpbmdidWYoaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpOwotICBleHBsaWNpdCBiYXNpY19zdHJpbmdidWYoY29uc3QgX1N0cmluZyYgX19zLCBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6Om91dCk7Ci0gIHZpcnR1YWwgfmJhc2ljX3N0cmluZ2J1ZigpOwotCi1wdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCBvciBzZXQgdGhlIHN0cmluZy4KLSAgX1N0cmluZyBzdHIoKSBjb25zdCB7IF9NX2FwcGVuZF9idWZmZXIoKTsgcmV0dXJuIF9NX3N0cjsgfQotICB2b2lkIHN0cihjb25zdCBfU3RyaW5nJiBfX3MpOwotCi1wcm90ZWN0ZWQ6ICAgICAgICAgICAgICAgICAgICAgIC8vIE92ZXJyaWRkZW4gdmlydHVhbCBtZW1iZXIgZnVuY3Rpb25zLgotICB2aXJ0dWFsIGludF90eXBlIHVuZGVyZmxvdygpOwotICB2aXJ0dWFsIGludF90eXBlIHVmbG93KCk7Ci0gIHZpcnR1YWwgaW50X3R5cGUgcGJhY2tmYWlsKGludF90eXBlIF9fYyk7Ci0gIHZpcnR1YWwgaW50X3R5cGUgb3ZlcmZsb3coaW50X3R5cGUgX19jKTsKLSAgaW50X3R5cGUgcGJhY2tmYWlsKCkge3JldHVybiBwYmFja2ZhaWwoX1RyYWl0czo6ZW9mKCkpO30KLSAgaW50X3R5cGUgb3ZlcmZsb3coKSB7cmV0dXJuIG92ZXJmbG93KF9UcmFpdHM6OmVvZigpKTt9Ci0KLSAgdmlydHVhbCBzdHJlYW1zaXplIHhzcHV0bihjb25zdCBjaGFyX3R5cGUqIF9fcywgc3RyZWFtc2l6ZSBfX24pOwotICB2aXJ0dWFsIHN0cmVhbXNpemUgX01feHNwdXRuYyhjaGFyX3R5cGUgX19jLCBzdHJlYW1zaXplIF9fbik7Ci0KLSAgdmlydHVhbCBfQmFzZSogc2V0YnVmKF9DaGFyVCogX19idWYsIHN0cmVhbXNpemUgX19uKTsKLSAgdmlydHVhbCBwb3NfdHlwZSBzZWVrb2ZmKG9mZl90eXBlIF9fb2ZmLCBpb3NfYmFzZTo6c2Vla2RpciBfX2RpciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0KTsKLSAgdmlydHVhbCBwb3NfdHlwZSBzZWVrcG9zKHBvc190eXBlIF9fcG9zLCBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6Om91dCk7Ci0KLXByaXZhdGU6ICAgICAgICAgICAgICAgICAgICAgICAgLy8gSGVscGVyIGZ1bmN0aW9ucy4KLSAgLy8gQXBwZW5kIHRoZSBpbnRlcm5hbCBidWZmZXIgdG8gdGhlIHN0cmluZyBpZiBuZWNlc3NhcnkuCi0gIHZvaWQgX01fYXBwZW5kX2J1ZmZlcigpIGNvbnN0OwotICB2b2lkIF9NX3NldF9wdHJzKCk7Ci0KLXByaXZhdGU6Ci0gIGlvc19iYXNlOjpvcGVubW9kZSBfTV9tb2RlOwotICBtdXRhYmxlIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4gX01fc3RyOwotCi0gIGVudW0gX0p1c3ROYW1lIHsgX1NfQnVmU2l6ID0gOCB9OwotICBfQ2hhclQgX01fQnVmWyA4IC8qIF9TX0J1ZlNpeiAqL107Ci19OwotCi0jaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCkKLV9TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBiYXNpY19zdHJpbmdidWY8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4sIGFsbG9jYXRvcjxjaGFyPiA+OwotIyAgaWYgIWRlZmluZWQgKF9TVExQX05PX1dDSEFSX1QpCi1fU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgYmFzaWNfc3RyaW5nYnVmPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+LCBhbGxvY2F0b3I8d2NoYXJfdD4gID47Ci0jICBlbmRpZgotI2VuZGlmIC8qIF9TVExQX1VTRV9URU1QTEFURV9FWFBPUlQgKi8KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDbGFzcyBiYXNpY19pc3RyaW5nc3RyZWFtLCBhbiBpbnB1dCBzdHJlYW0gdGhhdCB1c2VzIGEgc3RyaW5nYnVmLgotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+Ci1jbGFzcyBiYXNpY19pc3RyaW5nc3RyZWFtIDogcHVibGljIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiB7Ci1wdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR5cGVkZWZzCi0gIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6Y2hhcl90eXBlICAgY2hhcl90eXBlOwotICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmludF90eXBlICAgIGludF90eXBlOwotICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OnBvc190eXBlICAgIHBvc190eXBlOwotICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6Om9mZl90eXBlICAgIG9mZl90eXBlOwotICB0eXBlZGVmIF9UcmFpdHMgdHJhaXRzX3R5cGU7Ci0KLSAgdHlwZWRlZiBiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPiAgICAgICAgICAgICAgICBfQmFzaWNfaW9zOwotICB0eXBlZGVmIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgICAgICAgICAgIF9CYXNlOwotICB0eXBlZGVmIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4gICAgIF9TdHJpbmc7Ci0gIHR5cGVkZWYgYmFzaWNfc3RyaW5nYnVmPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiAgX0J1ZjsKLQotcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25zdHJ1Y3RvcnMsIGRlc3RydWN0b3IuCi0gIGJhc2ljX2lzdHJpbmdzdHJlYW0oaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSA9IGlvc19iYXNlOjppbik7Ci0gIGJhc2ljX2lzdHJpbmdzdHJlYW0oY29uc3QgX1N0cmluZyYgX19zdHIsCi0gICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSA9IGlvc19iYXNlOjppbik7Ci0gIH5iYXNpY19pc3RyaW5nc3RyZWFtKCk7Ci0KLXB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWVtYmVyIGZ1bmN0aW9ucwotCi0gIGJhc2ljX3N0cmluZ2J1ZjxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4qIHJkYnVmKCkgY29uc3QKLSAgICB7IHJldHVybiBfX0NPTlNUX0NBU1QoX0J1ZiosJl9NX2J1Zik7IH0KLQotICBfU3RyaW5nIHN0cigpIGNvbnN0IHsgcmV0dXJuIF9NX2J1Zi5zdHIoKTsgfQotICB2b2lkIHN0cihjb25zdCBfU3RyaW5nJiBfX3MpIHsgX01fYnVmLnN0cihfX3MpOyB9Ci0KLXByaXZhdGU6Ci0gIGJhc2ljX3N0cmluZ2J1ZjxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4gX01fYnVmOwotCi0jaWYgZGVmaW5lZCAoX1NUTFBfTVNWQykgJiYgKF9TVExQX01TVkMgPj0gMTMwMCAmJiBfU1RMUF9NU1ZDIDw9IDEzMTApCi0gIHR5cGVkZWYgYmFzaWNfaXN0cmluZ3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+IF9TZWxmOwotICAvL2V4cGxpY2l0ZWx5IGRlZmluZWQgYXMgcHJpdmF0ZSB0byBhdm9pZCB3YXJuaW5nczoKLSAgYmFzaWNfaXN0cmluZ3N0cmVhbShfU2VsZiBjb25zdCYpOwotICBfU2VsZiYgb3BlcmF0b3IgPSAoX1NlbGYgY29uc3QmKTsKLSNlbmRpZgotfTsKLQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENsYXNzIGJhc2ljX29zdHJpbmdzdHJlYW0sIGFuIG91dHB1dCBzdHJlYW0gdGhhdCB1c2VzIGEgc3RyaW5nYnVmLgotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+Ci1jbGFzcyBiYXNpY19vc3RyaW5nc3RyZWFtIDogcHVibGljIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiB7Ci1wdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR5cGVkZWZzCi0gIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6Y2hhcl90eXBlICAgY2hhcl90eXBlOwotICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmludF90eXBlICAgIGludF90eXBlOwotICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OnBvc190eXBlICAgIHBvc190eXBlOwotICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6Om9mZl90eXBlICAgIG9mZl90eXBlOwotICB0eXBlZGVmIF9UcmFpdHMgdHJhaXRzX3R5cGU7Ci0KLSAgdHlwZWRlZiBiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPiAgICAgICAgICAgICAgICBfQmFzaWNfaW9zOwotICB0eXBlZGVmIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgICAgICAgICAgIF9CYXNlOwotICB0eXBlZGVmIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4gICAgIF9TdHJpbmc7Ci0gIHR5cGVkZWYgYmFzaWNfc3RyaW5nYnVmPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiAgX0J1ZjsKLQotcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25zdHJ1Y3RvcnMsIGRlc3RydWN0b3IuCi0gIGJhc2ljX29zdHJpbmdzdHJlYW0oaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSA9IGlvc19iYXNlOjpvdXQpOwotICBiYXNpY19vc3RyaW5nc3RyZWFtKGNvbnN0IF9TdHJpbmcmIF9fc3RyLAotICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUgPSBpb3NfYmFzZTo6b3V0KTsKLSAgfmJhc2ljX29zdHJpbmdzdHJlYW0oKTsKLQotcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNZW1iZXIgZnVuY3Rpb25zLgotCi0gIGJhc2ljX3N0cmluZ2J1ZjxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4qIHJkYnVmKCkgY29uc3QKLSAgICB7IHJldHVybiBfX0NPTlNUX0NBU1QoX0J1ZiosJl9NX2J1Zik7IH0KLQotICBfU3RyaW5nIHN0cigpIGNvbnN0IHsgcmV0dXJuIF9NX2J1Zi5zdHIoKTsgfQotICAgIHZvaWQgc3RyKGNvbnN0IF9TdHJpbmcmIF9fcykgeyBfTV9idWYuc3RyKF9fcyk7IH0gLy8gZHdhIDAyLzA3LzAwIC0gQlVHIFNUT01QRVIgREFWRQotCi0KLXByaXZhdGU6Ci0gIGJhc2ljX3N0cmluZ2J1ZjxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4gX01fYnVmOwotCi0jaWYgZGVmaW5lZCAoX1NUTFBfTVNWQykgJiYgKF9TVExQX01TVkMgPj0gMTMwMCAmJiBfU1RMUF9NU1ZDIDw9IDEzMTApCi0gIHR5cGVkZWYgYmFzaWNfb3N0cmluZ3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+IF9TZWxmOwotICAvL2V4cGxpY2l0ZWx5IGRlZmluZWQgYXMgcHJpdmF0ZSB0byBhdm9pZCB3YXJuaW5nczoKLSAgYmFzaWNfb3N0cmluZ3N0cmVhbShfU2VsZiBjb25zdCYpOwotICBfU2VsZiYgb3BlcmF0b3IgPSAoX1NlbGYgY29uc3QmKTsKLSNlbmRpZgotfTsKLQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENsYXNzIGJhc2ljX3N0cmluZ3N0cmVhbSwgYSBiaWRpcmVjdGlvbmFsIHN0cmVhbSB0aGF0IHVzZXMgYSBzdHJpbmdidWYuCi0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KLWNsYXNzIGJhc2ljX3N0cmluZ3N0cmVhbSA6IHB1YmxpYyBiYXNpY19pb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+IHsKLXB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHlwZWRlZnMKLSAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpjaGFyX3R5cGUgY2hhcl90eXBlOwotICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmludF90eXBlICBpbnRfdHlwZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpwb3NfdHlwZSAgcG9zX3R5cGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6b2ZmX3R5cGUgIG9mZl90eXBlOwotICB0eXBlZGVmIF9UcmFpdHMgIHRyYWl0c190eXBlOwotCi0gIHR5cGVkZWYgYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz4gICAgICAgICAgICAgICAgIF9CYXNpY19pb3M7Ci0gIHR5cGVkZWYgYmFzaWNfaW9zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgICAgICAgICAgIF9CYXNlOwotICB0eXBlZGVmIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4gICAgICBfU3RyaW5nOwotICB0eXBlZGVmIGJhc2ljX3N0cmluZ2J1ZjxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4gIF9CdWY7Ci0KLSAgdHlwZWRlZiBpb3NfYmFzZTo6b3Blbm1vZGUgb3Blbm1vZGU7Ci0KLXB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29uc3RydWN0b3JzLCBkZXN0cnVjdG9yLgotICBiYXNpY19zdHJpbmdzdHJlYW0ob3Blbm1vZGUgX19tb2QgPSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0KTsKLSAgYmFzaWNfc3RyaW5nc3RyZWFtKGNvbnN0IF9TdHJpbmcmIF9fc3RyLAotICAgICAgICAgICAgICAgICAgICAgb3Blbm1vZGUgX19tb2QgPSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0KTsKLSAgfmJhc2ljX3N0cmluZ3N0cmVhbSgpOwotCi1wdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1lbWJlciBmdW5jdGlvbnMuCi0KLSAgYmFzaWNfc3RyaW5nYnVmPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiogcmRidWYoKSBjb25zdAotICAgIHsgcmV0dXJuIF9fQ09OU1RfQ0FTVChfQnVmKiwmX01fYnVmKTsgfQotCi0gIF9TdHJpbmcgc3RyKCkgY29uc3QgeyByZXR1cm4gX01fYnVmLnN0cigpOyB9Ci0gICAgdm9pZCBzdHIoY29uc3QgX1N0cmluZyYgX19zKSB7IF9NX2J1Zi5zdHIoX19zKTsgfQotCi1wcml2YXRlOgotICBiYXNpY19zdHJpbmdidWY8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+IF9NX2J1ZjsKLQotI2lmIGRlZmluZWQgKF9TVExQX01TVkMpICYmIChfU1RMUF9NU1ZDID49IDEzMDAgJiYgX1NUTFBfTVNWQyA8PSAxMzEwKQotICB0eXBlZGVmIGJhc2ljX3N0cmluZ3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+IF9TZWxmOwotICAvL2V4cGxpY2l0ZWx5IGRlZmluZWQgYXMgcHJpdmF0ZSB0byBhdm9pZCB3YXJuaW5nczoKLSAgYmFzaWNfc3RyaW5nc3RyZWFtKF9TZWxmIGNvbnN0Jik7Ci0gIF9TZWxmJiBvcGVyYXRvciA9IChfU2VsZiBjb25zdCYpOwotI2VuZGlmCi19OwotCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUKQotX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIGJhc2ljX2lzdHJpbmdzdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4sIGFsbG9jYXRvcjxjaGFyPiA+OwotX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIGJhc2ljX29zdHJpbmdzdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4sIGFsbG9jYXRvcjxjaGFyPiA+OwotX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIGJhc2ljX3N0cmluZ3N0cmVhbTxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiwgYWxsb2NhdG9yPGNoYXI+ID47Ci0jICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkKLV9TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBiYXNpY19pc3RyaW5nc3RyZWFtPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+LCBhbGxvY2F0b3I8d2NoYXJfdD4gID47Ci1fU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgYmFzaWNfb3N0cmluZ3N0cmVhbTx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiwgYWxsb2NhdG9yPHdjaGFyX3Q+ICA+OwotX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIGJhc2ljX3N0cmluZ3N0cmVhbTx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiwgYWxsb2NhdG9yPHdjaGFyX3Q+ICA+OwotIyAgZW5kaWYKLSNlbmRpZiAvKiBfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUICovCi0KLV9TVExQX0VORF9OQU1FU1BBQ0UKLQotI2lmIGRlZmluZWQgKF9TVExQX0VYUE9TRV9TVFJFQU1fSU1QTEVNRU5UQVRJT04pICYmICFkZWZpbmVkIChfU1RMUF9MSU5LX1RJTUVfSU5TVEFOVElBVElPTikKLSMgIGluY2x1ZGUgPHN0bC9fc3N0cmVhbS5jPgotI2VuZGlmCi0KLSNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9TU1RSRUFNICovCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX3N0YWNrLmggYi9zdGwvX3N0YWNrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhYTQ2OGQuLjAwMDAwMDAKLS0tIGEvc3RsL19zdGFjay5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk0Ci0gKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3Ci0gKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTcKLSAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0vKiBOT1RFOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBTVEwgaGVhZGVycy4KLSAqICAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuCi0gKi8KLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9TVEFDS19ICi0jZGVmaW5lIF9TVExQX0lOVEVSTkFMX1NUQUNLX0gKLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9ERVFVRV9ICi0jICBpbmNsdWRlIDxzdGwvX2RlcXVlLmg+Ci0jZW5kaWYKLQotX1NUTFBfQkVHSU5fTkFNRVNQQUNFCi0KLSNpZiAhZGVmaW5lZCAoIF9TVExQX0xJTUlURURfREVGQVVMVF9URU1QTEFURVMgKQotdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1NlcXVlbmNlID0gZGVxdWU8X1RwPiA+Ci0jZWxpZiBkZWZpbmVkICggX1NUTFBfTUlOSU1VTV9ERUZBVUxUX1RFTVBMQVRFX1BBUkFNUyApCi0jICBkZWZpbmUgX1NUTFBfU1RBQ0tfQVJHUyBfVHAKLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci0jZWxzZQotdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1NlcXVlbmNlPgotI2VuZGlmCi1jbGFzcyBzdGFjawotI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QQVJUSUFMX1NQRUNfV09SS0FST1VORCkKLSMgIGlmIGRlZmluZWQgKF9TVExQX1NUQUNLX0FSR1MpCi0gICAgICAgICAgICA6IHB1YmxpYyBfX3N0bHBvcnRfY2xhc3M8c3RhY2s8X1RwPiA+Ci0jICBlbHNlCi0gICAgICAgICAgICA6IHB1YmxpYyBfX3N0bHBvcnRfY2xhc3M8c3RhY2s8X1RwLCBfU2VxdWVuY2U+ID4KLSMgIGVuZGlmCi0jZW5kaWYKLXsKLSNpZmRlZiBfU1RMUF9TVEFDS19BUkdTCi0gIHR5cGVkZWYgZGVxdWU8X1RwPiBfU2VxdWVuY2U7Ci0gIHR5cGVkZWYgc3RhY2s8X1RwPiBfU2VsZjsKLSNlbHNlCi0gIHR5cGVkZWYgc3RhY2s8X1RwLCBfU2VxdWVuY2U+IF9TZWxmOwotI2VuZGlmCi0KLXB1YmxpYzoKLSAgdHlwZWRlZiB0eXBlbmFtZSBfU2VxdWVuY2U6OnZhbHVlX3R5cGUgICAgICB2YWx1ZV90eXBlOwotICB0eXBlZGVmIHR5cGVuYW1lIF9TZXF1ZW5jZTo6c2l6ZV90eXBlICAgICAgIHNpemVfdHlwZTsKLSAgdHlwZWRlZiAgICAgICAgICBfU2VxdWVuY2UgICAgICAgICAgICAgICAgICBjb250YWluZXJfdHlwZTsKLQotICB0eXBlZGVmIHR5cGVuYW1lIF9TZXF1ZW5jZTo6cmVmZXJlbmNlICAgICAgIHJlZmVyZW5jZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfU2VxdWVuY2U6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9yZWZlcmVuY2U7Ci1wcm90ZWN0ZWQ6Ci0gIC8vYyBpcyBhIFN0YW5kYXJkIG5hbWUgKDIzLjIuMy4zKSwgZG8gbm8gbWFrZSBpdCBTVExwb3J0IG5hbWluZyBjb252ZW50aW9uIGNvbXBsaWFudC4KLSAgX1NlcXVlbmNlIGM7Ci1wdWJsaWM6Ci0gIHN0YWNrKCkgOiBjKCkge30KLSAgZXhwbGljaXQgc3RhY2soY29uc3QgX1NlcXVlbmNlJiBfX3MpIDogYyhfX3MpIHt9Ci0KLSAgc3RhY2soX19tb3ZlX3NvdXJjZTxfU2VsZj4gc3JjKQotICAgIDogYyhfU1RMUF9QUklWIF9Bc01vdmVTb3VyY2Uoc3JjLmdldCgpLmMpKSB7fQotCi0gIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBjLmVtcHR5KCk7IH0KLSAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCB7IHJldHVybiBjLnNpemUoKTsgfQotICByZWZlcmVuY2UgdG9wKCkgeyByZXR1cm4gYy5iYWNrKCk7IH0KLSAgY29uc3RfcmVmZXJlbmNlIHRvcCgpIGNvbnN0IHsgcmV0dXJuIGMuYmFjaygpOyB9Ci0gIHZvaWQgcHVzaChjb25zdCB2YWx1ZV90eXBlJiBfX3gpIHsgYy5wdXNoX2JhY2soX194KTsgfQotICB2b2lkIHBvcCgpIHsgYy5wb3BfYmFjaygpOyB9Ci0gIGNvbnN0IF9TZXF1ZW5jZSYgX0dldF9zKCkgY29uc3QgeyByZXR1cm4gYzsgfQotfTsKLQotI2lmbmRlZiBfU1RMUF9TVEFDS19BUkdTCi0jICBkZWZpbmUgX1NUTFBfU1RBQ0tfQVJHUyBfVHAsIF9TZXF1ZW5jZQotIyAgZGVmaW5lIF9TVExQX1NUQUNLX0hFQURFUl9BUkdTIGNsYXNzIF9UcCwgY2xhc3MgX1NlcXVlbmNlCi0jZWxzZQotIyAgZGVmaW5lIF9TVExQX1NUQUNLX0hFQURFUl9BUkdTIGNsYXNzIF9UcAotI2VuZGlmCi0KLXRlbXBsYXRlIDwgX1NUTFBfU1RBQ0tfSEVBREVSX0FSR1MgPgotaW5saW5lIGJvb2wgX1NUTFBfQ0FMTCAgb3BlcmF0b3I9PShjb25zdCBzdGFjazwgX1NUTFBfU1RBQ0tfQVJHUyA+JiBfX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YWNrPCBfU1RMUF9TVEFDS19BUkdTID4mIF9feSkKLXsgcmV0dXJuIF9feC5fR2V0X3MoKSA9PSBfX3kuX0dldF9zKCk7IH0KLQotdGVtcGxhdGUgPCBfU1RMUF9TVEFDS19IRUFERVJfQVJHUyA+Ci1pbmxpbmUgYm9vbCBfU1RMUF9DQUxMICBvcGVyYXRvcjwoY29uc3Qgc3RhY2s8IF9TVExQX1NUQUNLX0FSR1MgPiYgX194LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YWNrPCBfU1RMUF9TVEFDS19BUkdTID4mIF9feSkKLXsgcmV0dXJuIF9feC5fR2V0X3MoKSA8IF9feS5fR2V0X3MoKTsgfQotCi1fU1RMUF9SRUxPUFNfT1BFUkFUT1JTKHRlbXBsYXRlIDwgX1NUTFBfU1RBQ0tfSEVBREVSX0FSR1MgPiwgc3RhY2s8IF9TVExQX1NUQUNLX0FSR1MgPikKLQotI3VuZGVmIF9TVExQX1NUQUNLX0FSR1MKLSN1bmRlZiBfU1RMUF9TVEFDS19IRUFERVJfQVJHUwotCi0jaWYgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikKLXRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9TZXF1ZW5jZT4KLXN0cnVjdCBfX21vdmVfdHJhaXRzPHN0YWNrPF9UcCwgX1NlcXVlbmNlPiA+IDoKLSAgX1NUTFBfUFJJViBfX21vdmVfdHJhaXRzX2F1eDxfU2VxdWVuY2U+Ci17fTsKLSNlbmRpZgotCi1fU1RMUF9FTkRfTkFNRVNQQUNFCi0KLSNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9TVEFDS19IICovCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX3N0ZGV4Y2VwdF9iYXNlLmggYi9zdGwvX3N0ZGV4Y2VwdF9iYXNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiY2Q4NDkuLjAwMDAwMDAKLS0tIGEvc3RsL19zdGRleGNlcHRfYmFzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NwotICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9TVERFWENFUFRfQkFTRQotI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9TVERFWENFUFRfQkFTRQotCi0jaWYgIWRlZmluZWQgKF9TVExQX1VTRV9OQVRJVkVfU1RERVhDRVBUKSB8fCBkZWZpbmVkIChfU1RMUF9VU0VfT1dOX05BTUVTUEFDRSkKLQotIyAgaWZuZGVmIF9TVExQX0lOVEVSTkFMX0VYQ0VQVElPTgotIyAgICBpbmNsdWRlIDxzdGwvX2V4Y2VwdGlvbi5oPgotIyAgZW5kaWYKLQotIyAgaWYgZGVmaW5lZChfU1RMUF9VU0VfRVhDRVBUSU9OUykgfHwgXAotICAgICEoZGVmaW5lZChfTUlQU19TSU0pICYmIGRlZmluZWQoX0FCSU8zMikgJiYgKF9NSVBTX1NJTSA9PSBfQUJJTzMyKSkKLQotIyAgICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1NUUklORwotIyAgICAgIGluY2x1ZGUgPHN0bC9fY3N0cmluZy5oPgotIyAgICBlbmRpZgotCi0jICAgIGlmbmRlZiBfU1RMUF9TVFJJTkdfRldEX0gKLSMgICAgICBpbmNsdWRlIDxzdGwvX3N0cmluZ19md2QuaD4KLSMgICAgZW5kaWYKLQotIyAgICBpZm5kZWYgX1NUTFBfVVNFX05PX0lPU1RSRUFNUwotIyAgICAgIGRlZmluZSBfU1RMUF9PV05fU1RERVhDRVBUIDEKLSMgICAgZW5kaWYKLQotX1NUTFBfQkVHSU5fTkFNRVNQQUNFCi0KLS8qIFdlIGRpc2FibGUgdGhlIDQyNzUgd2FybmluZyBmb3IKLSAqICAtIFdpbkNFIHdoZXJlIHRoZXJlIGFyZSBvbmx5IHN0YXRpYyB2ZXJzaW9uIG9mIHRoZSBuYXRpdmUgQysrIHJ1bnRpbWUuCi0gKiAgLSBUaGUgTVNWQyBjb21waWxlcnMgd2hlbiB0aGUgU1RMcG9ydCB1c2VyIHdhbnRzIHRvIG1ha2UgYW4gU1RMcG9ydCBkbGwgbGlua2VkIHRvCi0gKiAgICB0aGUgc3RhdGljIEMrKyBuYXRpdmUgcnVudGltZS4gSW4gdGhpcyBjYXNlIHRoZSBzdGQ6OmV4Y2VwdGlvbiBiYXNlIGNsYXNzIGlzIG5vIG1vcmUKLSAqICAgIGV4cG9ydGVkIGZyb20gbmF0aXZlIGRsbCBidXQgaXMgdXNlZCBhcyBhIGJhc2UgY2xhc3MgZm9yIHRoZSBleHBvcnRlZCBfX05hbWVkX2V4Y2VwdGlvbgotICogICAgY2xhc3MuCi0gKi8KLSMgICAgaWYgZGVmaW5lZCAoX1NUTFBfV0NFX05FVCkgfHwgXAotICAgICAgICBkZWZpbmVkIChfU1RMUF9VU0VfRFlOQU1JQ19MSUIpICYmIGRlZmluZWQgKF9TVExQX1VTSU5HX0NST1NTX05BVElWRV9SVU5USU1FX0xJQikKLSMgICAgICBkZWZpbmUgX1NUTFBfRE9fV0FSTklOR19QT1AKLSMgICAgICBwcmFnbWEgd2FybmluZyAocHVzaCkKLSMgICAgICBwcmFnbWEgd2FybmluZyAoZGlzYWJsZTogNDI3NSkgLy8gTm9uIGRsbCBpbnRlcmZhY2UgY2xhc3MgJ2V4Y2VwdGlvbicgdXNlZCBhcyBiYXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBkbGwtaW50ZXJmYWNlIGNsYXNzICdfX05hbWVkX2V4Y2VwdGlvbicKLSMgICAgZW5kaWYKLQotIyAgICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhDRVBUSU9OX0hFQURFUikKLSMgICAgICBpZiAhZGVmaW5lZCAoX1NUTFBfRVhDRVBUSU9OX0JBU0UpICYmICFkZWZpbmVkIChfU1RMUF9CUk9LRU5fRVhDRVBUSU9OX0NMQVNTKSAmJiBcCi0gICAgICAgICAgIGRlZmluZWQgKF9TVExQX1VTRV9OQU1FU1BBQ0VTKSAmJiAgZGVmaW5lZCAoX1NUTFBfVVNFX09XTl9OQU1FU1BBQ0UpCi11c2luZyBfU1RMUF9WRU5ET1JfRVhDRVBUX1NURDo6ZXhjZXB0aW9uOwotIyAgICAgIGVuZGlmCi0jICAgIGVuZGlmCi0jICAgIGRlZmluZSBfU1RMUF9FWENFUFRJT05fQkFTRSBleGNlcHRpb24KLQotY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgX19OYW1lZF9leGNlcHRpb24gOiBwdWJsaWMgX1NUTFBfRVhDRVBUSU9OX0JBU0UgewotcHVibGljOgotICBfX05hbWVkX2V4Y2VwdGlvbihjb25zdCBzdHJpbmcmIF9fc3RyKQotIyAgICBpZm5kZWYgX1NUTFBfVVNFX05PX0lPU1RSRUFNUwotICAgIDsKLSAgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IF9TVExQX05PVEhST1dfSU5IRVJFTlRMWTsKLSAgfl9fTmFtZWRfZXhjZXB0aW9uKCkgX1NUTFBfTk9USFJPV19JTkhFUkVOVExZOwotIyAgICBlbHNlCi0gIHsKLSMgICAgICBpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX1NBRkVfU1RSSU5HX0ZVTkNUSU9OUykKLSAgICBzdHJuY3B5KF9NX25hbWUsIF9TVExQX1BSSVYgX19nZXRfY19zdHJpbmcoX19zdHIpLCBfU19idWZzaXplKTsKLSAgICBfTV9uYW1lW19TX2J1ZnNpemUgLSAxXSA9ICdcMCc7Ci0jICAgICAgZWxzZQotICAgIHN0cm5jcHlfcyhfU1RMUF9BUlJBWV9BTkRfU0laRShfTV9uYW1lKSwgX1NUTFBfUFJJViBfX2dldF9jX3N0cmluZyhfX3N0ciksIF9UUlVOQ0FURSk7Ci0jICAgICAgZW5kaWYKLSAgfQotICBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3QgX1NUTFBfTk9USFJPV19JTkhFUkVOVExZIHsgcmV0dXJuIF9NX25hbWU7IH0KLSMgICAgZW5kaWYKLQotcHJpdmF0ZToKLSAgZW51bSB7IF9TX2J1ZnNpemUgPSAyNTYgfTsKLSAgY2hhciBfTV9uYW1lW19TX2J1ZnNpemVdOwotfTsKLQotIyAgICBpZiBkZWZpbmVkIChfU1RMUF9ET19XQVJOSU5HX1BPUCkKLSMgICAgICBwcmFnbWEgd2FybmluZyAocG9wKQotIyAgICAgIHVuZGVmIF9TVExQX0RPX1dBUk5JTkdfUE9QCi0jICAgIGVuZGlmCi0KLV9TVExQX0VORF9OQU1FU1BBQ0UKLQotIyAgZW5kaWYgLyogTm90IG8zMiwgYW5kIG5vIGV4Y2VwdGlvbnMgKi8KLSNlbmRpZiAvKiBfU1RMUF9TVERFWENFUFRfU0VFTiAqLwotCi0jZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfU1RERVhDRVBUX0JBU0UgKi8KZGlmZiAtLWdpdCBhL3N0bC9fc3RscG9ydF92ZXJzaW9uLmggYi9zdGwvX3N0bHBvcnRfdmVyc2lvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjgwNTViLi4wMDAwMDAwCi0tLSBhL3N0bC9fc3RscG9ydF92ZXJzaW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0gLyoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUKLSAqIEZyYW5jb2lzIER1bW9udAotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0jaWZuZGVmIF9TVExQX1NUTFBPUlRfVkVSU0lPTl9ICi0jZGVmaW5lIF9TVExQX1NUTFBPUlRfVkVSU0lPTl9ICi0KLS8qIFRoZSBsYXN0IFNHSSBTVEwgcmVsZWFzZSB3ZSBtZXJnZWQgd2l0aCAqLwotI2RlZmluZSBfX1NHSV9TVEwgMHgzMzAKLQotLyogU1RMcG9ydCB2ZXJzaW9uICovCi0jZGVmaW5lIF9TVExQT1JUX01BSk9SIDUKLSNkZWZpbmUgX1NUTFBPUlRfTUlOT1IgMQotI2RlZmluZSBfU1RMUE9SVF9QQVRDSExFVkVMIDQKLQotI2RlZmluZSBfU1RMUE9SVF9WRVJTSU9OIDB4NTE0Ci0KLSNlbmRpZiAvKiBfU1RMUF9TVExQT1JUX1ZFUlNJT05fSCAqLwpkaWZmIC0tZ2l0IGEvc3RsL19zdHJlYW1faXRlcmF0b3IuaCBiL3N0bC9fc3RyZWFtX2l0ZXJhdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMWZmM2YuLjAwMDAwMDAKLS0tIGEvc3RsL19zdHJlYW1faXRlcmF0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NAotICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTYtMTk5OAotICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk3Ci0gKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5Ci0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLQotLyogTk9URTogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgU1RMIGhlYWRlcnMuCi0gKiAgIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LgotICovCi0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfSU5URVJOQUxfU1RSRUFNX0lURVJBVE9SX0gpICYmICFkZWZpbmVkIChfU1RMUF9VU0VfTk9fSU9TVFJFQU1TKQotI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9TVFJFQU1fSVRFUkFUT1JfSAotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0lURVJBVE9SX0JBU0VfSAotIyAgaW5jbHVkZSA8c3RsL19pdGVyYXRvcl9iYXNlLmg+Ci0jZW5kaWYKLQotLy8gc3RyZWFtYnVmX2l0ZXJhdG9ycyBwcmVkZWNsYXJhdGlvbnMgbXVzdCBhcHBlYXIgZmlyc3QKLSNpZm5kZWYgX1NUTFBfSU9TRldECi0jICBpbmNsdWRlIDxpb3Nmd2Q+Ci0jZW5kaWYKLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9BTEdPQkFTRV9ICi0jICBpbmNsdWRlIDxzdGwvX2FsZ29iYXNlLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9PU1RSRUFNQlVGX0lURVJBVE9SX0gKLSMgIGluY2x1ZGUgPHN0bC9fb3N0cmVhbWJ1Zl9pdGVyYXRvci5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfSVNUUkVBTUJVRl9JVEVSQVRPUl9ICi0jICBpbmNsdWRlIDxzdGwvX2lzdHJlYW1idWZfaXRlcmF0b3IuaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0lTVFJFQU0KLSMgIGluY2x1ZGUgPHN0bC9faXN0cmVhbS5oPgotI2VuZGlmCi0KLS8vIGlzdHJlYW1faXRlcmF0b3IgYW5kIG9zdHJlYW1faXRlcmF0b3IgbG9vayB2ZXJ5IGRpZmZlcmVudCBpZiB3ZSdyZQotLy8gdXNpbmcgbmV3LCB0ZW1wbGF0aXplZCBpb3N0cmVhbXMgdGhhbiBpZiB3ZSdyZSB1c2luZyB0aGUgb2xkIGNmcm9udAotLy8gdmVyc2lvbi4KLQotX1NUTFBfQkVHSU5fTkFNRVNQQUNFCi0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfTElNSVRFRF9ERUZBVUxUX1RFTVBMQVRFUykKLSMgIGRlZmluZSBfX0lTSV9UTVBMX0hFQURFUl9BUkdVTUVOVFMgY2xhc3MgX1RwLCBjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9EaXN0Ci0jICBkZWZpbmUgX19JU0lfVE1QTF9BUkdVTUVOVFMgX1RwLCBfQ2hhclQsIF9UcmFpdHMsIF9EaXN0Ci10ZW1wbGF0ZSA8Y2xhc3MgX1RwLAotICAgICAgICAgIGNsYXNzIF9DaGFyVCA9IF9TVExQX0RFRkFVTFRDSEFSLCBjbGFzcyBfVHJhaXRzID0gY2hhcl90cmFpdHM8X0NoYXJUPiwKLSAgICAgICAgICBjbGFzcyBfRGlzdCA9IHB0cmRpZmZfdD4KLWNsYXNzIGlzdHJlYW1faXRlcmF0b3IgOiBwdWJsaWMgaXRlcmF0b3I8aW5wdXRfaXRlcmF0b3JfdGFnLCBfVHAgLCBfRGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1RwKiwgY29uc3QgX1RwJiA+IHsKLSNlbHNlCi0jICBpZiBkZWZpbmVkIChfU1RMUF9NSU5JTVVNX0RFRkFVTFRfVEVNUExBVEVfUEFSQU1TKSAmJiAhZGVmaW5lZCAoX1NUTFBfREVGQVVMVF9UWVBFX1BBUkFNKQotIyAgICBkZWZpbmUgX19JU0lfVE1QTF9IRUFERVJfQVJHVU1FTlRTIGNsYXNzIF9UcAotIyAgICBkZWZpbmUgX19JU0lfVE1QTF9BUkdVTUVOVFMgICAgICAgIF9UcAotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWNsYXNzIGlzdHJlYW1faXRlcmF0b3IgOiBwdWJsaWMgaXRlcmF0b3I8aW5wdXRfaXRlcmF0b3JfdGFnLCBfVHAgLCBwdHJkaWZmX3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9UcCosIGNvbnN0IF9UcCYgPiB7Ci0jICBlbHNlCi0jICAgIGRlZmluZSBfX0lTSV9UTVBMX0hFQURFUl9BUkdVTUVOVFMgY2xhc3MgX1RwLCBjbGFzcyBfRGlzdAotIyAgICBkZWZpbmUgX19JU0lfVE1QTF9BUkdVTUVOVFMgICAgICAgIF9UcCwgX0Rpc3QKLXRlbXBsYXRlIDxjbGFzcyBfVHAsIF9TVExQX0RGTF9UWVBFX1BBUkFNKF9EaXN0LCBwdHJkaWZmX3QpPgotY2xhc3MgaXN0cmVhbV9pdGVyYXRvciA6IHB1YmxpYyBpdGVyYXRvcjxpbnB1dF9pdGVyYXRvcl90YWcsIF9UcCwgX0Rpc3QgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfVHAqLCBjb25zdCBfVHAmID4gewotIyAgZW5kaWYgLyogX1NUTFBfTUlOSU1VTV9ERUZBVUxUX1RFTVBMQVRFX1BBUkFNUyAqLwotI2VuZGlmIC8qIF9TVExQX0xJTUlURURfREVGQVVMVF9URU1QTEFURVMgKi8KLQotI2lmIGRlZmluZWQgKF9TVExQX0xJTUlURURfREVGQVVMVF9URU1QTEFURVMpCi0gIHR5cGVkZWYgY2hhciBfQ2hhclQ7Ci0gIHR5cGVkZWYgY2hhcl90cmFpdHM8Y2hhcj4gX1RyYWl0czsKLSMgIGlmIGRlZmluZWQgKF9TVExQX01JTklNVU1fREVGQVVMVF9URU1QTEFURV9QQVJBTVMpICYmICFkZWZpbmVkIChfU1RMUF9ERUZBVUxUX1RZUEVfUEFSQU0pCi0gIHR5cGVkZWYgcHRyZGlmZl90IF9EaXN0OwotIyAgZW5kaWYKLSNlbmRpZgotCi0gIHR5cGVkZWYgaXN0cmVhbV9pdGVyYXRvcjwgX19JU0lfVE1QTF9BUkdVTUVOVFMgPiBfU2VsZjsKLXB1YmxpYzoKLSAgdHlwZWRlZiBfQ2hhclQgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl90eXBlOwotICB0eXBlZGVmIF9UcmFpdHMgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdHlwZTsKLSAgdHlwZWRlZiBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gaXN0cmVhbV90eXBlOwotCi0gIHR5cGVkZWYgaW5wdXRfaXRlcmF0b3JfdGFnICAgICAgICAgICAgIGl0ZXJhdG9yX2NhdGVnb3J5OwotICB0eXBlZGVmIF9UcCAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOwotICB0eXBlZGVmIF9EaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7Ci0gIHR5cGVkZWYgY29uc3QgX1RwKiAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXI7Ci0gIHR5cGVkZWYgY29uc3QgX1RwJiAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKLQotICBpc3RyZWFtX2l0ZXJhdG9yKCkgOiBfTV9zdHJlYW0oMCksIF9NX29rKGZhbHNlKSwgX01fcmVhZF9kb25lKHRydWUpIHt9Ci0gIGlzdHJlYW1faXRlcmF0b3IoaXN0cmVhbV90eXBlJiBfX3MpIDogX01fc3RyZWFtKCZfX3MpLCBfTV9vayhmYWxzZSksIF9NX3JlYWRfZG9uZShmYWxzZSkge30KLQotICByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3QgewotICAgIGlmICghX01fcmVhZF9kb25lKSB7Ci0gICAgICBfTV9yZWFkKCk7Ci0gICAgfQotICAgIHJldHVybiBfTV92YWx1ZTsKLSAgfQotCi0gIF9TVExQX0RFRklORV9BUlJPV19PUEVSQVRPUgotCi0gIF9TZWxmJiBvcGVyYXRvcisrKCkgewotICAgIF9NX3JlYWQoKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgX1NlbGYgb3BlcmF0b3IrKyhpbnQpICB7Ci0gICAgX1NlbGYgX190bXAgPSAqdGhpczsKLSAgICBfTV9yZWFkKCk7Ci0gICAgcmV0dXJuIF9fdG1wOwotICB9Ci0KLSAgYm9vbCBfTV9lcXVhbChjb25zdCBfU2VsZiYgX194KSBjb25zdCB7Ci0gICAgaWYgKCFfTV9yZWFkX2RvbmUpIHsKLSAgICAgIF9NX3JlYWQoKTsKLSAgICB9Ci0gICAgaWYgKCFfX3guX01fcmVhZF9kb25lKSB7Ci0gICAgICBfX3guX01fcmVhZCgpOwotICAgIH0KLSAgICByZXR1cm4gKF9NX29rID09IF9feC5fTV9vaykgJiYgKCFfTV9vayB8fCBfTV9zdHJlYW0gPT0gX194Ll9NX3N0cmVhbSk7Ci0gIH0KLQotcHJpdmF0ZToKLSAgaXN0cmVhbV90eXBlKiBfTV9zdHJlYW07Ci0gIG11dGFibGUgX1RwIF9NX3ZhbHVlOwotICBtdXRhYmxlIGJvb2wgX01fb2s7Ci0gIG11dGFibGUgYm9vbCBfTV9yZWFkX2RvbmU7Ci0KLSAgdm9pZCBfTV9yZWFkKCkgY29uc3QgewotICAgIF9NX29rID0gKChfTV9zdHJlYW0gIT0gMCkgJiYgIV9NX3N0cmVhbS0+ZmFpbCgpKTsKLSAgICBpZiAoX01fb2spIHsKLSAgICAgICpfTV9zdHJlYW0gPj4gX01fdmFsdWU7Ci0gICAgICBfTV9vayA9ICFfTV9zdHJlYW0tPmZhaWwoKTsKLSAgICB9Ci0gICAgX01fcmVhZF9kb25lID0gdHJ1ZTsKLSAgfQotfTsKLQotI2lmICFkZWZpbmVkIChfU1RMUF9MSU1JVEVEX0RFRkFVTFRfVEVNUExBVEVTKQotdGVtcGxhdGUgPGNsYXNzIF9UcFAsCi0gICAgICAgICAgY2xhc3MgX0NoYXJUID0gX1NUTFBfREVGQVVMVENIQVIsIGNsYXNzIF9UcmFpdHMgPSBjaGFyX3RyYWl0czxfQ2hhclQ+ID4KLSNlbHNlCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwUD4KLSNlbmRpZgotY2xhc3Mgb3N0cmVhbV9pdGVyYXRvcjogcHVibGljIGl0ZXJhdG9yPG91dHB1dF9pdGVyYXRvcl90YWcsIHZvaWQsIHZvaWQsIHZvaWQsIHZvaWQ+IHsKLSNpZiBkZWZpbmVkIChfU1RMUF9MSU1JVEVEX0RFRkFVTFRfVEVNUExBVEVTKQotICB0eXBlZGVmIGNoYXIgX0NoYXJUOwotICB0eXBlZGVmIGNoYXJfdHJhaXRzPGNoYXI+IF9UcmFpdHM7Ci0gIHR5cGVkZWYgb3N0cmVhbV9pdGVyYXRvcjxfVHBQPiBfU2VsZjsKLSNlbHNlCi0gIHR5cGVkZWYgb3N0cmVhbV9pdGVyYXRvcjxfVHBQLCBfQ2hhclQsIF9UcmFpdHM+IF9TZWxmOwotI2VuZGlmCi1wdWJsaWM6Ci0gIHR5cGVkZWYgX0NoYXJUICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKLSAgdHlwZWRlZiBfVHJhaXRzICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3R5cGU7Ci0gIHR5cGVkZWYgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+IG9zdHJlYW1fdHlwZTsKLQotICB0eXBlZGVmIG91dHB1dF9pdGVyYXRvcl90YWcgICAgICAgICAgICBpdGVyYXRvcl9jYXRlZ29yeTsKLQotICBvc3RyZWFtX2l0ZXJhdG9yKG9zdHJlYW1fdHlwZSYgX19zKSA6IF9NX3N0cmVhbSgmX19zKSwgX01fc3RyaW5nKDApIHt9Ci0gIG9zdHJlYW1faXRlcmF0b3Iob3N0cmVhbV90eXBlJiBfX3MsIGNvbnN0IF9DaGFyVCogX19jKQotICAgIDogX01fc3RyZWFtKCZfX3MpLCBfTV9zdHJpbmcoX19jKSAge30KLSAgX1NlbGYmIG9wZXJhdG9yPShjb25zdCBfVHBQJiBfX3ZhbCkgewotICAgICpfTV9zdHJlYW0gPDwgX192YWw7Ci0gICAgaWYgKF9NX3N0cmluZykgKl9NX3N0cmVhbSA8PCBfTV9zdHJpbmc7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIF9TZWxmJiBvcGVyYXRvciooKSB7IHJldHVybiAqdGhpczsgfQotICBfU2VsZiYgb3BlcmF0b3IrKygpIHsgcmV0dXJuICp0aGlzOyB9Ci0gIF9TZWxmJiBvcGVyYXRvcisrKGludCkgeyByZXR1cm4gKnRoaXM7IH0KLXByaXZhdGU6Ci0gIG9zdHJlYW1fdHlwZSogX01fc3RyZWFtOwotICBjb25zdCBfQ2hhclQqIF9NX3N0cmluZzsKLX07Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfT0xEX0hQX0lURVJBVE9SX1FVRVJJRVMpCi0jICBpZiBkZWZpbmVkIChfU1RMUF9MSU1JVEVEX0RFRkFVTFRfVEVNUExBVEVTKQotdGVtcGxhdGUgPGNsYXNzIF9UcFA+Ci1pbmxpbmUgb3V0cHV0X2l0ZXJhdG9yX3RhZyBfU1RMUF9DQUxMCi1pdGVyYXRvcl9jYXRlZ29yeShjb25zdCBvc3RyZWFtX2l0ZXJhdG9yPF9UcFA+JikgeyByZXR1cm4gb3V0cHV0X2l0ZXJhdG9yX3RhZygpOyB9Ci0jICBlbHNlCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwUCwgY2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgotaW5saW5lIG91dHB1dF9pdGVyYXRvcl90YWcgX1NUTFBfQ0FMTAotaXRlcmF0b3JfY2F0ZWdvcnkoY29uc3Qgb3N0cmVhbV9pdGVyYXRvcjxfVHBQLCBfQ2hhclQsIF9UcmFpdHM+JikgeyByZXR1cm4gb3V0cHV0X2l0ZXJhdG9yX3RhZygpOyB9Ci0jICBlbmRpZgotI2VuZGlmCi0KLV9TVExQX0VORF9OQU1FU1BBQ0UKLQotLy8gZm9ybS1pbmRlcGVuZGVudCBkZWZpbmlvdGlvbiBvZiBzdHJlYW0gaXRlcmF0b3JzCi1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLQotdGVtcGxhdGUgPCBfX0lTSV9UTVBMX0hFQURFUl9BUkdVTUVOVFMgPgotaW5saW5lIGJvb2wgX1NUTFBfQ0FMTAotb3BlcmF0b3I9PShjb25zdCBpc3RyZWFtX2l0ZXJhdG9yPCBfX0lTSV9UTVBMX0FSR1VNRU5UUyA+JiBfX3gsCi0gICAgICAgICAgIGNvbnN0IGlzdHJlYW1faXRlcmF0b3I8IF9fSVNJX1RNUExfQVJHVU1FTlRTID4mIF9feSkKLXsgcmV0dXJuIF9feC5fTV9lcXVhbChfX3kpOyB9Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfU0VQQVJBVEVfUkVMT1BTX05BTUVTUEFDRSkKLXRlbXBsYXRlIDwgX19JU0lfVE1QTF9IRUFERVJfQVJHVU1FTlRTID4KLWlubGluZSBib29sIF9TVExQX0NBTEwKLW9wZXJhdG9yIT0oY29uc3QgaXN0cmVhbV9pdGVyYXRvcjwgX19JU0lfVE1QTF9BUkdVTUVOVFMgPiYgX194LAotICAgICAgICAgICBjb25zdCBpc3RyZWFtX2l0ZXJhdG9yPCBfX0lTSV9UTVBMX0FSR1VNRU5UUyA+JiBfX3kpCi17IHJldHVybiAhX194Ll9NX2VxdWFsKF9feSk7IH0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX1NUTFBfVVNFX09MRF9IUF9JVEVSQVRPUl9RVUVSSUVTKQotdGVtcGxhdGUgPCBfX0lTSV9UTVBMX0hFQURFUl9BUkdVTUVOVFMgPgotaW5saW5lIGlucHV0X2l0ZXJhdG9yX3RhZyBfU1RMUF9DQUxMCi1pdGVyYXRvcl9jYXRlZ29yeShjb25zdCBpc3RyZWFtX2l0ZXJhdG9yPCBfX0lTSV9UTVBMX0FSR1VNRU5UUyA+JikKLXsgcmV0dXJuIGlucHV0X2l0ZXJhdG9yX3RhZygpOyB9Ci10ZW1wbGF0ZSA8IF9fSVNJX1RNUExfSEVBREVSX0FSR1VNRU5UUyA+Ci1pbmxpbmUgX1RwKiBfU1RMUF9DQUxMCi12YWx1ZV90eXBlKGNvbnN0IGlzdHJlYW1faXRlcmF0b3I8IF9fSVNJX1RNUExfQVJHVU1FTlRTID4mKSB7IHJldHVybiAoX1RwKikgMDsgfQotCi0jICBpZiBkZWZpbmVkIChfU1RMUF9NSU5JTVVNX0RFRkFVTFRfVEVNUExBVEVfUEFSQU1TKSAmJiAhZGVmaW5lZCAoX1NUTFBfREVGQVVMVF9UWVBFX1BBUkFNKQotdGVtcGxhdGUgPCBfX0lTSV9UTVBMX0hFQURFUl9BUkdVTUVOVFMgPgotaW5saW5lIHB0cmRpZmZfdCogX1NUTFBfQ0FMTAotZGlzdGFuY2VfdHlwZShjb25zdCBpc3RyZWFtX2l0ZXJhdG9yPCBfX0lTSV9UTVBMX0FSR1VNRU5UUyA+JikgeyByZXR1cm4gKHB0cmRpZmZfdCopMDsgfQotIyAgZWxzZQotdGVtcGxhdGUgPCBfX0lTSV9UTVBMX0hFQURFUl9BUkdVTUVOVFMgPgotaW5saW5lIF9EaXN0KiBfU1RMUF9DQUxMCi1kaXN0YW5jZV90eXBlKGNvbnN0IGlzdHJlYW1faXRlcmF0b3I8IF9fSVNJX1RNUExfQVJHVU1FTlRTID4mKSB7IHJldHVybiAoX0Rpc3QqKTA7IH0KLSMgIGVuZGlmIC8qIF9TVExQX01JTklNVU1fREVGQVVMVF9URU1QTEFURV9QQVJBTVMgKi8KLSNlbmRpZgotCi1fU1RMUF9FTkRfTkFNRVNQQUNFCi0KLSN1bmRlZiBfX0lTSV9UTVBMX0hFQURFUl9BUkdVTUVOVFMKLSN1bmRlZiBfX0lTSV9UTVBMX0FSR1VNRU5UUwotCi0jZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfU1RSRUFNX0lURVJBVE9SX0ggKi8KLQotLy8gTG9jYWwgVmFyaWFibGVzOgotLy8gbW9kZTpDKysKLS8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9fc3RyZWFtYnVmLmggYi9zdGwvX3N0cmVhbWJ1Zi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmRmMGE3Li4wMDAwMDAwCi0tLSBhL3N0bC9fc3RyZWFtYnVmLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfU1RSRUFNQlVGCi0jZGVmaW5lIF9TVExQX0lOVEVSTkFMX1NUUkVBTUJVRgotCi0jaWZuZGVmIF9TVExQX0lPU19CQVNFX0gKLSMgIGluY2x1ZGUgPHN0bC9faW9zX2Jhc2UuaD4gICAgICAvLyBOZWVkZWQgZm9yIGlvc19iYXNlIGJpdGZpZWxkIG1lbWJlcnMuCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPGlvc19iYXNlPiBpbmNsdWRlcyA8aW9zZndkPi4KLQotX1NUTFBfQkVHSU5fTkFNRVNQQUNFCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ2xhc3MgYmFzaWNfc3RyZWFtYnVmPD4sIHRoZSBiYXNlIGNsYXNzIG9mIHRoZSBzdHJlYW1idWYgaGllcmFyY2h5LgotCi0vLyBBIGJhc2ljX3N0cmVhbWJ1Zjw+IG1hbmFnZXMgYW4gaW5wdXQgKGdldCkgYXJlYSBhbmQgYW4gb3V0cHV0IChwdXQpCi0vLyBhcmVhLiAgRWFjaCBpcyBkZXNjcmliZWQgYnkgdGhyZWUgcG9pbnRlcnM6IGEgYmVnaW5uaW5nLCBhbiBlbmQsIGFuZCBhCi0vLyBjdXJyZW50IHBvc2l0aW9uLiAgYmFzaWNfc3RyZWFtYnVmPD4gY29udGFpbnMgc29tZSB2ZXJ5IHNpbXBsZSBtZW1iZXIKLS8vIGZ1bmN0aW9ucyB0aGF0IG1hbmlwdWxhdGUgdGhvc2Ugc2l4IHBvaW50ZXJzLCBidXQgYWxtb3N0IGFsbCBvZiB0aGUgcmVhbAotLy8gZnVuY3Rpb25hbGl0eSBnZXRzIGRlbGVnYXRlZCB0byBwcm90ZWN0ZWQgdmlydHVhbCBtZW1iZXIgZnVuY3Rpb25zLgotLy8gQWxsIG9mIHRoZSBwdWJsaWMgbWVtYmVyIGZ1bmN0aW9ucyBhcmUgaW5saW5lLCBhbmQgbW9zdCBvZiB0aGUgcHJvdGVjdGVkCi0vLyBtZW1iZXIgZnVuY3Rpb25zIGFyZSB2aXJ0dWFsLgotCi0vLyBBbHRob3VnaCBiYXNpY19zdHJlYW1idWY8PiBpcyBub3QgYWJzdHJhY3QsIGl0IGlzIHVzZWZ1bCBvbmx5IGFzIGEgYmFzZQotLy8gY2xhc3MuICBJdHMgdmlydHVhbCBtZW1iZXIgZnVuY3Rpb25zIGhhdmUgZGVmYXVsdCBkZWZpbml0aW9ucyBzdWNoIHRoYXQKLS8vIHJlYWRpbmcgZnJvbSBhIGJhc2ljX3N0cmVhbWJ1Zjw+IHdpbGwgYWx3YXlzIHlpZWxkIEVPRiwgYW5kIHdyaXRpbmcgdG8gYQotLy8gYmFzaWNfc3RyZWFtYnVmPD4gd2lsbCBhbHdheXMgZmFpbC4KLQotLy8gVGhlIHNlY29uZCB0ZW1wbGF0ZSBwYXJhbWV0ZXIsIF9UcmFpdHMsIGRlZmF1bHRzIHRvIGNoYXJfdHJhaXRzPF9DaGFyVD4uCi0vLyBUaGUgZGVmYXVsdCBpcyBkZWNsYXJlZCBpbiBoZWFkZXIgPGlvc2Z3ZD4sIGFuZCBpdCBpc24ndCBkZWNsYXJlZCBoZXJlCi0vLyBiZWNhdXNlIEMrKyBsYW5ndWFnZSBydWxlcyBkbyBub3QgYWxsb3cgaXQgdG8gYmUgZGVjbGFyZWQgdHdpY2UuCi0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Ci1jbGFzcyBiYXNpY19zdHJlYW1idWYgewotICBmcmllbmQgY2xhc3MgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OwotICBmcmllbmQgY2xhc3MgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OwotCi1wdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR5cGVkZWZzLgotICB0eXBlZGVmIF9DaGFyVCAgICAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjppbnRfdHlwZSBpbnRfdHlwZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpwb3NfdHlwZSBwb3NfdHlwZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpvZmZfdHlwZSBvZmZfdHlwZTsKLSAgdHlwZWRlZiBfVHJhaXRzICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdHlwZTsKLQotcHJpdmF0ZTogICAgICAgICAgICAgICAgICAgICAgICAvLyBEYXRhIG1lbWJlcnMuCi0KLSAgY2hhcl90eXBlKiBfTV9nYmVnaW47ICAgICAgICAgLy8gQmVnaW5uaW5nIG9mIGdldCBhcmVhCi0gIGNoYXJfdHlwZSogX01fZ25leHQ7ICAgICAgICAgIC8vIEN1cnJlbnQgcG9zaXRpb24gd2l0aGluIHRoZSBnZXQgYXJlYQotICBjaGFyX3R5cGUqIF9NX2dlbmQ7ICAgICAgICAgICAvLyBFbmQgb2YgZ2V0IGFyZWEKLQotICBjaGFyX3R5cGUqIF9NX3BiZWdpbjsgICAgICAgICAvLyBCZWdpbm5pbmcgb2YgcHV0IGFyZWEKLSAgY2hhcl90eXBlKiBfTV9wbmV4dDsgICAgICAgICAgLy8gQ3VycmVudCBwb3NpdGlvbiB3aXRoaW4gdGhlIHB1dCBhcmVhCi0gIGNoYXJfdHlwZSogX01fcGVuZDsgICAgICAgICAgIC8vIEVuZCBvZiBwdXQgYXJlYQotCi0gIGxvY2FsZSBfTV9sb2NhbGU7ICAgICAgICAgICAgIC8vIFRoZSBzdHJlYW1idWYncyBsb2NhbGUgb2JqZWN0Ci0KLS8vcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFeHRlbnNpb246IGxvY2tpbmcsIGZvciB0aHJlYWQgc2FmZXR5LgotLy8gIF9TVExQX211dGV4IF9NX2xvY2s7Ci0KLXB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVzdHJ1Y3Rvci4KLSAgdmlydHVhbCB+YmFzaWNfc3RyZWFtYnVmKCk7Ci0KLXByb3RlY3RlZDogICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGRlZmF1bHQgY29uc3RydWN0b3IuCi0gIGJhc2ljX3N0cmVhbWJ1ZigpCi0jaWYgZGVmaW5lZCAoX1NUTFBfTVNWQykgJiYgKF9TVExQX01TVkMgPCAxMzAwKSAmJiBkZWZpbmVkIChfU1RMUF9VU0VfU1RBVElDX0xJQikKLSAgICAvL1dlIG1ha2UgaXQgaW5saW5lIHRvIGF2b2lkIHVucmVzb2x2ZWQgc3ltYm9sLgotICAgIDogX01fZ2JlZ2luKDApLCBfTV9nbmV4dCgwKSwgX01fZ2VuZCgwKSwKLSAgICAgIF9NX3BiZWdpbigwKSwgX01fcG5leHQoMCksIF9NX3BlbmQoMCksCi0gICAgICBfTV9sb2NhbGUoKQotICB7fQotI2Vsc2UKLSAgOwotI2VuZGlmCi0KLXByb3RlY3RlZDogICAgICAgICAgICAgICAgICAgICAgLy8gUHJvdGVjdGVkIGludGVyZmFjZSB0byB0aGUgZ2V0IGFyZWEuCi0gIGNoYXJfdHlwZSogZWJhY2soKSBjb25zdCB7IHJldHVybiBfTV9nYmVnaW47IH0gLy8gQmVnaW5uaW5nCi0gIGNoYXJfdHlwZSogZ3B0cigpICBjb25zdCB7IHJldHVybiBfTV9nbmV4dDsgfSAgLy8gQ3VycmVudCBwb3NpdGlvbgotICBjaGFyX3R5cGUqIGVncHRyKCkgY29uc3QgeyByZXR1cm4gX01fZ2VuZDsgfSAgIC8vIEVuZAotCi0gIHZvaWQgZ2J1bXAoaW50IF9fbikgeyBfTV9nbmV4dCArPSBfX247IH0KLSAgdm9pZCBzZXRnKGNoYXJfdHlwZSogX19nYmVnaW4sIGNoYXJfdHlwZSogX19nbmV4dCwgY2hhcl90eXBlKiBfX2dlbmQpIHsKLSAgICBfTV9nYmVnaW4gPSBfX2diZWdpbjsKLSAgICBfTV9nbmV4dCAgPSBfX2duZXh0OwotICAgIF9NX2dlbmQgICA9IF9fZ2VuZDsKLSAgfQotCi1wdWJsaWM6Ci0gIC8vIEFuIGFsdGVybmF0ZSBwdWJsaWMgaW50ZXJmYWNlIHRvIHRoZSBhYm92ZSBmdW5jdGlvbnMKLSAgLy8gd2hpY2ggYWxsb3dzIHVzIHRvIGF2b2lkIHVzaW5nIHRlbXBsYXRlZCBmcmllbmRzIHdoaWNoCi0gIC8vIGFyZSBub3Qgc3VwcG9ydGVkIG9uIHNvbWUgY29tcGlsZXJzLgotICBjaGFyX3R5cGUqIF9NX2ViYWNrKCkgY29uc3QgeyByZXR1cm4gZWJhY2soKTsgfQotICBjaGFyX3R5cGUqIF9NX2dwdHIoKSAgY29uc3QgeyByZXR1cm4gZ3B0cigpOyB9Ci0gIGNoYXJfdHlwZSogX01fZWdwdHIoKSBjb25zdCB7IHJldHVybiBlZ3B0cigpOyB9Ci0gIHZvaWQgX01fZ2J1bXAoaW50IF9fbikgICAgICB7IGdidW1wKF9fbik7IH0KLSAgdm9pZCBfTV9zZXRnKGNoYXJfdHlwZSogX19nYmVnaW4sIGNoYXJfdHlwZSogX19nbmV4dCwgY2hhcl90eXBlKiBfX2dlbmQpCi0gIHsgdGhpcy0+c2V0ZyhfX2diZWdpbiwgX19nbmV4dCwgX19nZW5kKTsgfQotCi1wcm90ZWN0ZWQ6ICAgICAgICAgICAgICAgICAgICAgIC8vIFByb3RlY3RlZCBpbnRlcmZhY2UgdG8gdGhlIHB1dCBhcmVhCi0KLSAgY2hhcl90eXBlKiBwYmFzZSgpIGNvbnN0IHsgcmV0dXJuIF9NX3BiZWdpbjsgfSAvLyBCZWdpbm5pbmcKLSAgY2hhcl90eXBlKiBwcHRyKCkgIGNvbnN0IHsgcmV0dXJuIF9NX3BuZXh0OyB9ICAvLyBDdXJyZW50IHBvc2l0aW9uCi0gIGNoYXJfdHlwZSogZXBwdHIoKSBjb25zdCB7IHJldHVybiBfTV9wZW5kOyB9ICAgLy8gRW5kCi0KLSAgdm9pZCBwYnVtcChpbnQgX19uKSB7IF9NX3BuZXh0ICs9IF9fbjsgfQotICB2b2lkIHNldHAoY2hhcl90eXBlKiBfX3BiZWdpbiwgY2hhcl90eXBlKiBfX3BlbmQpIHsKLSAgICBfTV9wYmVnaW4gPSBfX3BiZWdpbjsKLSAgICBfTV9wbmV4dCAgPSBfX3BiZWdpbjsKLSAgICBfTV9wZW5kICAgPSBfX3BlbmQ7Ci0gIH0KLQotcHJvdGVjdGVkOiAgICAgICAgICAgICAgICAgICAgICAvLyBWaXJ0dWFsIGJ1ZmZlciBtYW5hZ2VtZW50IGZ1bmN0aW9ucy4KLQotICB2aXJ0dWFsIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBzZXRidWYoY2hhcl90eXBlKiwgc3RyZWFtc2l6ZSk7Ci0KLSAgLy8gQWx0ZXJzIHRoZSBzdHJlYW0gcG9zaXRpb24sIHVzaW5nIGFuIGludGVnZXIgb2Zmc2V0LiAgSW4gdGhpcwotICAvLyBjbGFzcyBzZWVrb2ZmIGRvZXMgbm90aGluZzsgc3ViY2xhc3NlcyBhcmUgZXhwZWN0ZWQgdG8gb3ZlcnJpZGUgaXQuCi0gIHZpcnR1YWwgcG9zX3R5cGUgc2Vla29mZihvZmZfdHlwZSwgaW9zX2Jhc2U6OnNlZWtkaXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6b3Blbm1vZGUgPSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0KTsKLQotICAvLyBBbHRlcnMgdGhlIHN0cmVhbSBwb3NpdGlvbiwgdXNpbmcgYSBwcmV2aW91c2x5IG9idGFpbmVkIHN0cmVhbXBvcy4gIEluCi0gIC8vIHRoaXMgY2xhc3Mgc2Vla3BvcyBkb2VzIG5vdGhpbmc7IHN1YmNsYXNzZXMgYXJlIGV4cGVjdGVkIHRvIG92ZXJyaWRlIGl0LgotICB2aXJ0dWFsIHBvc190eXBlCi0gIHNlZWtwb3MocG9zX3R5cGUsIGlvc19iYXNlOjpvcGVubW9kZSA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpOwotCi0gIC8vIFN5bmNocm9uaXplcyAoaS5lLiBmbHVzaGVzKSB0aGUgYnVmZmVyLiAgQWxsIHN1YmNsYXNzZXMgYXJlIGV4cGVjdGVkIHRvCi0gIC8vIG92ZXJyaWRlIHRoaXMgdmlydHVhbCBtZW1iZXIgZnVuY3Rpb24uCi0gIHZpcnR1YWwgaW50IHN5bmMoKTsKLQotCi1wdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJ1ZmZlciBtYW5hZ2VtZW50LgotICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogcHVic2V0YnVmKGNoYXJfdHlwZSogX19zLCBzdHJlYW1zaXplIF9fbikKLSAgeyByZXR1cm4gdGhpcy0+c2V0YnVmKF9fcywgX19uKTsgfQotCi0gIHBvc190eXBlIHB1YnNlZWtvZmYob2ZmX3R5cGUgX19vZmZzZXQsIGlvc19iYXNlOjpzZWVrZGlyIF9fd2F5LAotICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZCA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpCi0gIHsgcmV0dXJuIHRoaXMtPnNlZWtvZmYoX19vZmZzZXQsIF9fd2F5LCBfX21vZCk7IH0KLQotICBwb3NfdHlwZSBwdWJzZWVrcG9zKHBvc190eXBlIF9fc3AsCi0gICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kID0gaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6Om91dCkKLSAgeyByZXR1cm4gdGhpcy0+c2Vla3BvcyhfX3NwLCBfX21vZCk7IH0KLQotICBpbnQgcHVic3luYygpIHsgcmV0dXJuIHRoaXMtPnN5bmMoKTsgfQotCi1wcm90ZWN0ZWQ6ICAgICAgICAgICAgICAgICAgICAgIC8vIFZpcnR1YWwgZ2V0IGFyZWEgZnVuY3Rpb25zLCBhcyBkZWZpbmVkIGluCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDE3LjUuMi40LjMgYW5kIDE3LjUuMi40LjQgb2YgdGhlIHN0YW5kYXJkLgotICAvLyBSZXR1cm5zIGEgbG93ZXIgYm91bmQgb24gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgd2UgY2FuIHJlYWQsCi0gIC8vIHdpdGggdW5kZXJmbG93LCBiZWZvcmUgcmVhY2hpbmcgZW5kIG9mIGZpbGUuICAoLTEgaXMgYSBzcGVjaWFsIHZhbHVlOgotICAvLyBpdCBtZWFucyB0aGF0IHVuZGVyZmxvdyB3aWxsIGZhaWwuKSAgTW9zdCBzdWJjbGFzc2VzIHNob3VsZCBwcm9iYWJseQotICAvLyBvdmVycmlkZSB0aGlzIHZpcnR1YWwgbWVtYmVyIGZ1bmN0aW9uLgotICB2aXJ0dWFsIHN0cmVhbXNpemUgc2hvd21hbnljKCk7Ci0KLSAgLy8gUmVhZHMgdXAgdG8gX19uIGNoYXJhY3RlcnMuICBSZXR1cm4gdmFsdWUgaXMgdGhlIG51bWJlciBvZgotICAvLyBjaGFyYWN0ZXJzIHJlYWQuCi0gIHZpcnR1YWwgc3RyZWFtc2l6ZSB4c2dldG4oY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uKTsKLQotICAvLyBDYWxsZWQgd2hlbiB0aGVyZSBpcyBubyByZWFkIHBvc2l0aW9uLCBpLmUuIHdoZW4gZ3B0cigpIGlzIG51bGwKLSAgLy8gb3Igd2hlbiBncHRyKCkgPj0gZWdwdHIoKS4gIFN1YmNsYXNzZXMgYXJlIGV4cGVjdGVkIHRvIG92ZXJyaWRlCi0gIC8vIHRoaXMgdmlydHVhbCBtZW1iZXIgZnVuY3Rpb24uCi0gIHZpcnR1YWwgaW50X3R5cGUgdW5kZXJmbG93KCk7Ci0KLSAgLy8gU2ltaWxhciB0byB1bmRlcmZsb3coKSwgYnV0IHVzZWQgZm9yIHVuYnVmZmVyZWQgaW5wdXQuICBNb3N0Ci0gIC8vIHN1YmNsYXNzZXMgc2hvdWxkIHByb2JhYmx5IG92ZXJyaWRlIHRoaXMgdmlydHVhbCBtZW1iZXIgZnVuY3Rpb24uCi0gIHZpcnR1YWwgaW50X3R5cGUgdWZsb3coKTsKLQotICAvLyBDYWxsZWQgd2hlbiB0aGVyZSBpcyBubyBwdXRiYWNrIHBvc2l0aW9uLCBpLmUuIHdoZW4gZ3B0cigpIGlzIG51bGwKLSAgLy8gb3Igd2hlbiBncHRyKCkgPT0gZWJhY2soKS4gIEFsbCBzdWJjbGFzc2VzIGFyZSBleHBlY3RlZCB0byBvdmVycmlkZQotICAvLyB0aGlzIHZpcnR1YWwgbWVtYmVyIGZ1bmN0aW9uLgotICB2aXJ0dWFsIGludF90eXBlIHBiYWNrZmFpbChpbnRfdHlwZSA9IHRyYWl0c190eXBlOjplb2YoKSk7Ci0KLXByb3RlY3RlZDogICAgICAgICAgICAgICAgICAgICAgLy8gVmlydHVhbCBwdXQgYXJlYSBmdW5jdGlvbnMsIGFzIGRlZmluZWQgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMjcuNS4yLjQuNSBvZiB0aGUgc3RhbmRhcmQuCi0KLSAgLy8gV3JpdGVzIHVwIHRvIF9fbiBjaGFyYWN0ZXJzLiAgUmV0dXJuIHZhbHVlIGlzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycwotICAvLyB3cml0dGVuLgotICB2aXJ0dWFsIHN0cmVhbXNpemUgeHNwdXRuKGNvbnN0IGNoYXJfdHlwZSogX19zLCBzdHJlYW1zaXplIF9fbik7Ci0KLSAgLy8gRXh0ZW5zaW9uOiB3cml0ZXMgdXAgdG8gX19uIGNvcGllcyBvZiBfX2MuICBSZXR1cm4gdmFsdWUgaXMgdGhlIG51bWJlcgotICAvLyBvZiBjaGFyYWN0ZXJzIHdyaXR0ZW4uCi0gIHZpcnR1YWwgc3RyZWFtc2l6ZSBfTV94c3B1dG5jKGNoYXJfdHlwZSBfX2MsIHN0cmVhbXNpemUgX19uKTsKLQotICAvLyBDYWxsZWQgd2hlbiB0aGVyZSBpcyBubyB3cml0ZSBwb3NpdGlvbi4gIEFsbCBzdWJjbGFzc2VzIGFyZSBleHBlY3RlZCB0bwotICAvLyBvdmVycmlkZSB0aGlzIHZpcnR1YWwgbWVtYmVyIGZ1bmN0aW9uLgotICB2aXJ0dWFsIGludF90eXBlIG92ZXJmbG93KGludF90eXBlID0gdHJhaXRzX3R5cGU6OmVvZigpKTsKLQotcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQdWJsaWMgbWVtYmVycyBmb3Igd3JpdGluZyBjaGFyYWN0ZXJzLgotICAvLyBXcml0ZSBhIHNpbmdsZSBjaGFyYWN0ZXIuCi0gIGludF90eXBlIHNwdXRjKGNoYXJfdHlwZSBfX2MpIHsKLSAgICByZXR1cm4gKChfTV9wbmV4dCA8IF9NX3BlbmQpID8gX1RyYWl0czo6dG9faW50X3R5cGUoKl9NX3BuZXh0KysgPSBfX2MpCi0gICAgICA6IHRoaXMtPm92ZXJmbG93KF9UcmFpdHM6OnRvX2ludF90eXBlKF9fYykpKTsKLSAgfQotCi0gIC8vIFdyaXRlIF9fbiBjaGFyYWN0ZXJzLgotICBzdHJlYW1zaXplIHNwdXRuKGNvbnN0IGNoYXJfdHlwZSogX19zLCBzdHJlYW1zaXplIF9fbikKLSAgeyByZXR1cm4gdGhpcy0+eHNwdXRuKF9fcywgX19uKTsgfQotCi0gIC8vIEV4dGVuc2lvbjogd3JpdGUgX19uIGNvcGllcyBvZiBfX2MuCi0gIHN0cmVhbXNpemUgX01fc3B1dG5jKGNoYXJfdHlwZSBfX2MsIHN0cmVhbXNpemUgX19uKQotICB7IHJldHVybiB0aGlzLT5fTV94c3B1dG5jKF9fYywgX19uKTsgfQotCi1wcml2YXRlOiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhlbHBlciBmdW5jdGlvbnMuCi0gIGludF90eXBlIF9NX3NuZXh0Y19hdXgoKTsKLQotcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQdWJsaWMgbWVtYmVycyBmb3IgcmVhZGluZyBjaGFyYWN0ZXJzLgotICBzdHJlYW1zaXplIGluX2F2YWlsKCkgewotICAgIHJldHVybiAoX01fZ25leHQgPCBfTV9nZW5kKSA/IChfTV9nZW5kIC0gX01fZ25leHQpIDogdGhpcy0+c2hvd21hbnljKCk7Ci0gIH0KLQotICAvLyBBZHZhbmNlIHRvIHRoZSBuZXh0IGNoYXJhY3RlciBhbmQgcmV0dXJuIGl0LgotICBpbnRfdHlwZSBzbmV4dGMoKSB7Ci0gIHJldHVybiAoIF9NX2dlbmQgLSBfTV9nbmV4dCA+IDEgPwotICAgICAgICAgICAgIF9UcmFpdHM6OnRvX2ludF90eXBlKCorK19NX2duZXh0KSA6Ci0gICAgICAgICAgICAgdGhpcy0+X01fc25leHRjX2F1eCgpKTsKLSAgfQotCi0gIC8vIFJldHVybiB0aGUgY3VycmVudCBjaGFyYWN0ZXIgYW5kIGFkdmFuY2UgdG8gdGhlIG5leHQuCi0gIGludF90eXBlIHNidW1wYygpIHsKLSAgICByZXR1cm4gX01fZ25leHQgPCBfTV9nZW5kID8gX1RyYWl0czo6dG9faW50X3R5cGUoKl9NX2duZXh0KyspCi0gICAgICA6IHRoaXMtPnVmbG93KCk7Ci0gIH0KLQotICAvLyBSZXR1cm4gdGhlIGN1cnJlbnQgY2hhcmFjdGVyIHdpdGhvdXQgYWR2YW5jaW5nIHRvIHRoZSBuZXh0LgotICBpbnRfdHlwZSBzZ2V0YygpIHsKLSAgICByZXR1cm4gX01fZ25leHQgPCBfTV9nZW5kID8gX1RyYWl0czo6dG9faW50X3R5cGUoKl9NX2duZXh0KQotICAgICAgOiB0aGlzLT51bmRlcmZsb3coKTsKLSAgfQotCi0gIHN0cmVhbXNpemUgc2dldG4oY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uKQotICB7IHJldHVybiB0aGlzLT54c2dldG4oX19zLCBfX24pOyB9Ci0KLSAgaW50X3R5cGUgc3B1dGJhY2tjKGNoYXJfdHlwZSBfX2MpIHsKLSAgICByZXR1cm4gKChfTV9nYmVnaW4gPCBfTV9nbmV4dCkgJiYgX1RyYWl0czo6ZXEoX19jLCAqKF9NX2duZXh0IC0gMSkpKQotICAgICAgPyBfVHJhaXRzOjp0b19pbnRfdHlwZSgqLS1fTV9nbmV4dCkKLSAgICAgIDogdGhpcy0+cGJhY2tmYWlsKF9UcmFpdHM6OnRvX2ludF90eXBlKF9fYykpOwotICB9Ci0KLSAgaW50X3R5cGUgc3VuZ2V0YygpIHsKLSAgICByZXR1cm4gKF9NX2diZWdpbiA8IF9NX2duZXh0KQotICAgICAgPyBfVHJhaXRzOjp0b19pbnRfdHlwZSgqLS1fTV9nbmV4dCkKLSAgICAgIDogdGhpcy0+cGJhY2tmYWlsKCk7Ci0gIH0KLQotcHJvdGVjdGVkOiAgICAgICAgICAgICAgICAgICAgICAvLyBWaXJ0dWFsIGxvY2FsZSBmdW5jdGlvbnMuCi0KLSAgLy8gVGhpcyBpcyBhIGhvb2ssIGNhbGxlZCBieSBwdWJpbWJ1ZSgpIGp1c3QgYmVmb3JlIHB1YmltYnVlKCkKLSAgLy8gc2V0cyB0aGUgc3RyZWFtYnVmJ3MgbG9jYWxlIHRvIF9fbG9jLiAgTm90ZSB0aGF0IGltYnVlIHNob3VsZAotICAvLyBub3QgKGFuZCBjYW5ub3QsIHNpbmNlIGl0IGhhcyBubyBhY2Nlc3MgdG8gc3RyZWFtYnVmJ3MgcHJpdmF0ZQotICAvLyBtZW1iZXJzKSBzZXQgdGhlIHN0cmVhbWJ1ZidzIGxvY2FsZSBpdHNlbGYuCi0gIHZpcnR1YWwgdm9pZCBpbWJ1ZShjb25zdCBsb2NhbGUmKTsKLQotcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMb2NhbGUtcmVsYXRlZCBmdW5jdGlvbnMuCi0gIGxvY2FsZSBwdWJpbWJ1ZShjb25zdCBsb2NhbGUmKTsKLSAgbG9jYWxlIGdldGxvYygpIGNvbnN0IHsgcmV0dXJuIF9NX2xvY2FsZTsgfQotCi0jaWYgIWRlZmluZWQgKF9TVExQX05PX0FOQUNIUk9OSVNNUykKLSAgdm9pZCBzdG9zc2MoKSB7IHRoaXMtPnNidW1wYygpOyB9Ci0jZW5kaWYKLSNpZiBkZWZpbmVkIChfX01WU19fKSB8fCBkZWZpbmVkIChfX09TNDAwX18pCi1wcml2YXRlOiAvLyBEYXRhIG1lbWJlcnMuCi0KLSAgY2hhcl90eXBlKiBfTV9nYmVnaW47IC8vIEJlZ2lubmluZyBvZiBnZXQgYXJlYQotICBjaGFyX3R5cGUqIF9NX2duZXh0OyAvLyBDdXJyZW50IHBvc2l0aW9uIHdpdGhpbiB0aGUgZ2V0IGFyZWEKLSAgY2hhcl90eXBlKiBfTV9nZW5kOyAvLyBFbmQgb2YgZ2V0IGFyZWEKLQotICBjaGFyX3R5cGUqIF9NX3BiZWdpbjsgLy8gQmVnaW5uaW5nIG9mIHB1dCBhcmVhCi0gIGNoYXJfdHlwZSogX01fcG5leHQ7IC8vIEN1cnJlbnQgcG9zaXRpb24gd2l0aGluIHRoZSBwdXQgYXJlYQotICBjaGFyX3R5cGUqIF9NX3BlbmQ7IC8vIEVuZCBvZiBwdXQgYXJlYQotI2VuZGlmCi19OwotCi0jaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCkKLV9TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBiYXNpY19zdHJlYW1idWY8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPjsKLSMgIGlmICFkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQotX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIGJhc2ljX3N0cmVhbWJ1Zjx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+OwotIyAgZW5kaWYgLy8gX1NUTFBfTk9fV0NIQVJfVAotI2VuZGlmIC8vIF9TVExQX1VTRV9URU1QTEFURV9FWFBPUlQKLQotX1NUTFBfRU5EX05BTUVTUEFDRQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfRVhQT1NFX1NUUkVBTV9JTVBMRU1FTlRBVElPTikgJiYgIWRlZmluZWQgKF9TVExQX0xJTktfVElNRV9JTlNUQU5USUFUSU9OKQotIyAgaW5jbHVkZSA8c3RsL19zdHJlYW1idWYuYz4KLSNlbmRpZgotCi0jZW5kaWYKLQotLy8gTG9jYWwgVmFyaWFibGVzOgotLy8gbW9kZTpDKysKLS8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9fc3RyaW5nLmMgYi9zdGwvX3N0cmluZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGJjNjI4Li4wMDAwMDAwCi0tLSBhL3N0bC9fc3RyaW5nLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2OTEgKzAsMCBAQAotLyoKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk0Ci0gKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3Ci0gKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTcKLSAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotI2lmbmRlZiBfU1RMUF9TVFJJTkdfQwotI2RlZmluZSBfU1RMUF9TVFJJTkdfQwotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX1NUUklOR19ICi0jICBpbmNsdWRlIDxzdGwvX3N0cmluZy5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1RSQUlUU19GVU5DVElPTlNfSAotIyAgaW5jbHVkZSA8c3RsL19jdHJhaXRzX2Zucy5oPgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfTVNWQzZfTUVNX1RfQlVHX1dPUktBUk9VTkQpCi0jICBkZWZpbmUgYmFzaWNfc3RyaW5nIF9TVExQX05PX01FTV9UX05BTUUoc3RyKQotI2VsaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpCi0jICBkZWZpbmUgYmFzaWNfc3RyaW5nIF9TVExQX05PTl9EQkdfTkFNRShzdHIpCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9TVExQX05FU1RFRF9UWVBFX1BBUkFNX0JVRykKLSMgIGRlZmluZSBfX3NpemVfdHlwZV9fIHNpemVfdAotIyAgZGVmaW5lIHNpemVfdHlwZSBzaXplX3QKLSMgIGRlZmluZSBpdGVyYXRvciBfQ2hhclQqCi0jZWxzZQotIyAgZGVmaW5lIF9fc2l6ZV90eXBlX18gX1NUTFBfVFlQRU5BTUVfT05fUkVUVVJOX1RZUEUgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz46OnNpemVfdHlwZQotI2VuZGlmCi0KLV9TVExQX0JFR0lOX05BTUVTUEFDRQotCi1fU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCi0KLS8vIEEgaGVscGVyIGNsYXNzIHRvIHVzZSBhIGNoYXJfdHJhaXRzIGFzIGEgZnVuY3Rpb24gb2JqZWN0LgotdGVtcGxhdGUgPGNsYXNzIF9UcmFpdHM+Ci1zdHJ1Y3QgX05vdF93aXRoaW5fdHJhaXRzIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPHR5cGVuYW1lIF9UcmFpdHM6OmNoYXJfdHlwZSwgYm9vbD4gewotICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmNoYXJfdHlwZSBfQ2hhclQ7Ci0gIGNvbnN0IF9DaGFyVCogX01fZmlyc3Q7Ci0gIGNvbnN0IF9DaGFyVCogX01fbGFzdDsKLQotICBfTm90X3dpdGhpbl90cmFpdHMoY29uc3QgX0NoYXJUKiBfX2YsIGNvbnN0IF9DaGFyVCogX19sKQotICAgIDogX01fZmlyc3QoX19mKSwgX01fbGFzdChfX2wpIHt9Ci0KLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IF9DaGFyVCYgX194KSBjb25zdCB7Ci0gICAgcmV0dXJuIGZpbmRfaWYoX01fZmlyc3QsIF9NX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfRXFfY2hhcl9ib3VuZDxfVHJhaXRzPihfX3gpKSA9PSBfTV9sYXN0OwotICB9Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIE5vbi1pbmxpbmUgZGVjbGFyYXRpb25zLgotCi0jaWYgIWRlZmluZWQgKGJhc2ljX3N0cmluZykKLV9TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQotI2VuZGlmCi0KLS8vIENoYW5nZSB0aGUgc3RyaW5nJ3MgY2FwYWNpdHkgc28gdGhhdCBpdCBpcyBsYXJnZSBlbm91Z2ggdG8gaG9sZAotLy8gIGF0IGxlYXN0IF9fcmVzX2FyZyBlbGVtZW50cywgcGx1cyB0aGUgdGVybWluYXRpbmcgX0NoYXJUKCkuICBOb3RlIHRoYXQsCi0vLyAgaWYgX19yZXNfYXJnIDwgY2FwYWNpdHkoKSwgdGhpcyBtZW1iZXIgZnVuY3Rpb24gbWF5IGFjdHVhbGx5IGRlY3JlYXNlCi0vLyAgdGhlIHN0cmluZydzIGNhcGFjaXR5LgotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgotdm9pZCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPjo6cmVzZXJ2ZShzaXplX3R5cGUgX19yZXNfYXJnKSB7Ci0gIGlmIChfX3Jlc19hcmcgPiBtYXhfc2l6ZSgpKQotICAgIHRoaXMtPl9NX3Rocm93X2xlbmd0aF9lcnJvcigpOwotCi0gIHNpemVfdHlwZSBfX24gPSAobWF4KShfX3Jlc19hcmcsIHNpemUoKSkgKyAxOwotICBpZiAoX19uIDw9IGNhcGFjaXR5KCkgKyAxKQotICAgIHJldHVybjsKLQotICBwb2ludGVyIF9fbmV3X3N0YXJ0ID0gdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuYWxsb2NhdGUoX19uLCBfX24pOwotICBwb2ludGVyIF9fbmV3X2ZpbmlzaCA9IF9fbmV3X3N0YXJ0OwotCi0gIF9TVExQX1RSWSB7Ci0gICAgX19uZXdfZmluaXNoID0gX1NUTFBfUFJJViBfX3Vjb3B5KHRoaXMtPl9NX1N0YXJ0KCksIHRoaXMtPl9NX0ZpbmlzaCgpLCBfX25ld19zdGFydCk7Ci0gICAgX01fY29uc3RydWN0X251bGwoX19uZXdfZmluaXNoKTsKLSAgfQotICBfU1RMUF9VTldJTkQoKF9TVExQX1NURDo6X0Rlc3Ryb3lfUmFuZ2UoX19uZXdfc3RhcnQsIF9fbmV3X2ZpbmlzaCksCi0gICAgICAgICAgICAgICAgdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuZGVhbGxvY2F0ZShfX25ld19zdGFydCwgX19uKSkpCi0KLSAgdGhpcy0+X01fZGVzdHJveV9yYW5nZSgpOwotICB0aGlzLT5fTV9kZWFsbG9jYXRlX2Jsb2NrKCk7Ci0gIHRoaXMtPl9NX3Jlc2V0KF9fbmV3X3N0YXJ0LCBfX25ld19maW5pc2gsIF9fbmV3X3N0YXJ0ICsgX19uKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgotYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4mCi1iYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPjo6YXBwZW5kKHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MpIHsKLSAgaWYgKF9fbiA+IG1heF9zaXplKCkgfHwgc2l6ZSgpID4gbWF4X3NpemUoKSAtIF9fbikKLSAgICB0aGlzLT5fTV90aHJvd19sZW5ndGhfZXJyb3IoKTsKLSAgaWYgKHNpemUoKSArIF9fbiA+IGNhcGFjaXR5KCkpCi0gICAgcmVzZXJ2ZShzaXplKCkgKyAobWF4KShzaXplKCksIF9fbikpOwotICBpZiAoX19uID4gMCkgewotI2lmIGRlZmluZWQgKF9TVExQX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0pCi0gICAgaWYgKHRoaXMtPl9NX3VzaW5nX3N0YXRpY19idWYoKSkKLSAgICAgIF9UcmFpdHM6OmFzc2lnbih0aGlzLT5fTV9maW5pc2ggKyAxLCBfX24gLSAxLCBfX2MpOwotICAgIGVsc2UKLSNlbmRpZiAvKiBfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNICovCi0gICAgX1NUTFBfUFJJViBfX3VuaW5pdGlhbGl6ZWRfZmlsbF9uKHRoaXMtPl9NX2ZpbmlzaCArIDEsIF9fbiAtIDEsIF9fYyk7Ci0gICAgX1NUTFBfVFJZIHsKLSAgICAgIF9NX2NvbnN0cnVjdF9udWxsKHRoaXMtPl9NX2ZpbmlzaCArIF9fbik7Ci0gICAgfQotICAgIF9TVExQX1VOV0lORCh0aGlzLT5fTV9kZXN0cm95X3B0cl9yYW5nZSh0aGlzLT5fTV9maW5pc2ggKyAxLCB0aGlzLT5fTV9maW5pc2ggKyBfX24pKQotICAgIF9UcmFpdHM6OmFzc2lnbigqZW5kKCksIF9fYyk7Ci0gICAgdGhpcy0+X01fZmluaXNoICs9IF9fbjsKLSAgfQotICByZXR1cm4gKnRoaXM7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KLWJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mCi1iYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjpfTV9hcHBlbmQoY29uc3QgX0NoYXJUKiBfX2ZpcnN0LCBjb25zdCBfQ2hhclQqIF9fbGFzdCkgewotICBpZiAoX19maXJzdCAhPSBfX2xhc3QpIHsKLSAgICBjb25zdCBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IHNpemUoKTsKLSAgICBwdHJkaWZmX3QgX19uID0gX19sYXN0IC0gX19maXJzdDsKLSAgICBpZiAoKHNpemVfdHlwZSlfX24gPiBtYXhfc2l6ZSgpIHx8IF9fb2xkX3NpemUgPiBtYXhfc2l6ZSgpIC0gX19uKQotICAgICAgdGhpcy0+X01fdGhyb3dfbGVuZ3RoX2Vycm9yKCk7Ci0gICAgaWYgKF9fb2xkX3NpemUgKyBfX24gPiBjYXBhY2l0eSgpKSB7Ci0gICAgICBzaXplX3R5cGUgX19sZW4gPSBfX29sZF9zaXplICsgKG1heCkoX19vbGRfc2l6ZSwgKHNpemVfdCkgX19uKSArIDE7Ci0gICAgICBwb2ludGVyIF9fbmV3X3N0YXJ0ID0gdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuYWxsb2NhdGUoX19sZW4sIF9fbGVuKTsKLSAgICAgIHBvaW50ZXIgX19uZXdfZmluaXNoID0gX19uZXdfc3RhcnQ7Ci0gICAgICBfU1RMUF9UUlkgewotICAgICAgICBfX25ld19maW5pc2ggPSBfU1RMUF9QUklWIF9fdWNvcHkodGhpcy0+X01fU3RhcnQoKSwgdGhpcy0+X01fRmluaXNoKCksIF9fbmV3X3N0YXJ0KTsKLSAgICAgICAgX19uZXdfZmluaXNoID0gX1NUTFBfUFJJViBfX3Vjb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19uZXdfZmluaXNoKTsKLSAgICAgICAgX01fY29uc3RydWN0X251bGwoX19uZXdfZmluaXNoKTsKLSAgICAgIH0KLSAgICAgIF9TVExQX1VOV0lORCgoX1NUTFBfU1REOjpfRGVzdHJveV9SYW5nZShfX25ld19zdGFydCxfX25ld19maW5pc2gpLAotICAgICAgICAgICAgICAgICAgICB0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5kZWFsbG9jYXRlKF9fbmV3X3N0YXJ0LF9fbGVuKSkpCi0gICAgICB0aGlzLT5fTV9kZXN0cm95X3JhbmdlKCk7Ci0gICAgICB0aGlzLT5fTV9kZWFsbG9jYXRlX2Jsb2NrKCk7Ci0gICAgICB0aGlzLT5fTV9yZXNldChfX25ld19zdGFydCwgX19uZXdfZmluaXNoLCBfX25ld19zdGFydCArIF9fbGVuKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBjb25zdCBfQ2hhclQqIF9fZjEgPSBfX2ZpcnN0OwotICAgICAgKytfX2YxOwotI2lmIGRlZmluZWQgKF9TVExQX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0pCi0gICAgICBpZiAodGhpcy0+X01fdXNpbmdfc3RhdGljX2J1ZigpKQotICAgICAgICBfTV9jb3B5KF9fZjEsIF9fbGFzdCwgdGhpcy0+X01fRmluaXNoKCkgKyAxKTsKLSAgICAgIGVsc2UKLSNlbmRpZiAvKiBfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNICovCi0gICAgICBfU1RMUF9QUklWIF9fdWNvcHkoX19mMSwgX19sYXN0LCB0aGlzLT5fTV9maW5pc2ggKyAxKTsKLSAgICAgIF9TVExQX1RSWSB7Ci0gICAgICAgIF9NX2NvbnN0cnVjdF9udWxsKHRoaXMtPl9NX2ZpbmlzaCArIF9fbik7Ci0gICAgICB9Ci0gICAgICBfU1RMUF9VTldJTkQodGhpcy0+X01fZGVzdHJveV9wdHJfcmFuZ2UodGhpcy0+X01fZmluaXNoICsgMSwgdGhpcy0+X01fZmluaXNoICsgX19uKSkKLSAgICAgIF9UcmFpdHM6OmFzc2lnbigqZW5kKCksICpfX2ZpcnN0KTsKLSAgICAgIHRoaXMtPl9NX2ZpbmlzaCArPSBfX247Ci0gICAgfQotICB9Ci0gIHJldHVybiAqdGhpczsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgotYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4mCi1iYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPjo6YXNzaWduKHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MpIHsKLSAgaWYgKF9fbiA8PSBzaXplKCkpIHsKLSAgICBfVHJhaXRzOjphc3NpZ24odGhpcy0+X01fU3RhcnQoKSwgX19uLCBfX2MpOwotICAgIGVyYXNlKGJlZ2luKCkgKyBfX24sIGVuZCgpKTsKLSAgfQotICBlbHNlIHsKLSAgICBpZiAoX19uIDwgY2FwYWNpdHkoKSkgewotICAgICAgX1RyYWl0czo6YXNzaWduKHRoaXMtPl9NX1N0YXJ0KCksIHNpemUoKSwgX19jKTsKLSAgICAgIGFwcGVuZChfX24gLSBzaXplKCksIF9fYyk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgX1NlbGYgX19zdHIoX19uLCBfX2MpOwotICAgICAgdGhpcy0+c3dhcChfX3N0cik7Ci0gICAgfQotICB9Ci0gIHJldHVybiAqdGhpczsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgotYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4mCi1iYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPjo6X01fYXNzaWduKGNvbnN0IF9DaGFyVCogX19mLCBjb25zdCBfQ2hhclQqIF9fbCkgewotICBwdHJkaWZmX3QgX19uID0gX19sIC0gX19mOwotICBpZiAoX19TVEFUSUNfQ0FTVChzaXplX3R5cGUsIF9fbikgPD0gc2l6ZSgpKSB7Ci0gICAgX1RyYWl0czo6Y29weSh0aGlzLT5fTV9TdGFydCgpLCBfX2YsIF9fbik7Ci0gICAgZXJhc2UoYmVnaW4oKSArIF9fbiwgZW5kKCkpOwotICB9Ci0gIGVsc2UgewotICAgIF9UcmFpdHM6OmNvcHkodGhpcy0+X01fU3RhcnQoKSwgX19mLCBzaXplKCkpOwotICAgIF9NX2FwcGVuZChfX2YgKyBzaXplKCksIF9fbCk7Ci0gIH0KLSAgcmV0dXJuICp0aGlzOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+Ci1fQ2hhclQqIGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+IDo6X01faW5zZXJ0X2F1eChfQ2hhclQqIF9fcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DaGFyVCBfX2MpIHsKLSAgcG9pbnRlciBfX25ld19wb3MgPSBfX3A7Ci0gIGlmICh0aGlzLT5fTV9maW5pc2ggKyAxIDwgdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuX01fZGF0YSkgewotICAgIF9NX2NvbnN0cnVjdF9udWxsKHRoaXMtPl9NX2ZpbmlzaCArIDEpOwotICAgIF9UcmFpdHM6Om1vdmUoX19wICsgMSwgX19wLCB0aGlzLT5fTV9maW5pc2ggLSBfX3ApOwotICAgIF9UcmFpdHM6OmFzc2lnbigqX19wLCBfX2MpOwotICAgICsrdGhpcy0+X01fZmluaXNoOwotICB9Ci0gIGVsc2UgewotICAgIGNvbnN0IHNpemVfdHlwZSBfX29sZF9sZW4gPSBzaXplKCk7Ci0gICAgc2l6ZV90eXBlIF9fbGVuID0gX19vbGRfbGVuICsgKG1heCkoX19vbGRfbGVuLCBfX1NUQVRJQ19DQVNUKHNpemVfdHlwZSwxKSkgKyAxOwotICAgIHBvaW50ZXIgX19uZXdfc3RhcnQgPSB0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5hbGxvY2F0ZShfX2xlbiwgX19sZW4pOwotICAgIHBvaW50ZXIgX19uZXdfZmluaXNoID0gX19uZXdfc3RhcnQ7Ci0gICAgX1NUTFBfVFJZIHsKLSAgICAgIF9fbmV3X3BvcyA9IF9TVExQX1BSSVYgX191Y29weSh0aGlzLT5fTV9TdGFydCgpLCBfX3AsIF9fbmV3X3N0YXJ0KTsKLSAgICAgIF9Db3B5X0NvbnN0cnVjdChfX25ld19wb3MsIF9fYyk7Ci0gICAgICBfX25ld19maW5pc2ggPSBfX25ld19wb3MgKyAxOwotICAgICAgX19uZXdfZmluaXNoID0gX1NUTFBfUFJJViBfX3Vjb3B5KF9fcCwgdGhpcy0+X01fZmluaXNoLCBfX25ld19maW5pc2gpOwotICAgICAgX01fY29uc3RydWN0X251bGwoX19uZXdfZmluaXNoKTsKLSAgICB9Ci0gICAgX1NUTFBfVU5XSU5EKChfU1RMUF9TVEQ6Ol9EZXN0cm95X1JhbmdlKF9fbmV3X3N0YXJ0LF9fbmV3X2ZpbmlzaCksCi0gICAgICAgICAgICAgICAgICB0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5kZWFsbG9jYXRlKF9fbmV3X3N0YXJ0LF9fbGVuKSkpCi0gICAgdGhpcy0+X01fZGVzdHJveV9yYW5nZSgpOwotICAgIHRoaXMtPl9NX2RlYWxsb2NhdGVfYmxvY2soKTsKLSAgICB0aGlzLT5fTV9yZXNldChfX25ld19zdGFydCwgX19uZXdfZmluaXNoLCBfX25ld19zdGFydCArIF9fbGVuKTsKLSAgfQotICByZXR1cm4gX19uZXdfcG9zOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+Ci12b2lkIGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+OjppbnNlcnQoaXRlcmF0b3IgX19wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IF9fbiwgX0NoYXJUIF9fYykgewotICBpZiAoX19uICE9IDApIHsKLSAgICBpZiAoc2l6ZV90eXBlKHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLl9NX2RhdGEgLSB0aGlzLT5fTV9maW5pc2gpID49IF9fbiArIDEpIHsKLSAgICAgIGNvbnN0IHNpemVfdHlwZSBfX2VsZW1zX2FmdGVyID0gdGhpcy0+X01fZmluaXNoIC0gX19wb3M7Ci0gICAgICBwb2ludGVyIF9fb2xkX2ZpbmlzaCA9IHRoaXMtPl9NX2ZpbmlzaDsKLSAgICAgIGlmIChfX2VsZW1zX2FmdGVyID49IF9fbikgewotI2lmIGRlZmluZWQgKF9TVExQX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0pCi0gICAgICAgIGlmICh0aGlzLT5fTV91c2luZ19zdGF0aWNfYnVmKCkpCi0gICAgICAgICAgX01fY29weSgodGhpcy0+X01fZmluaXNoIC0gX19uKSArIDEsIHRoaXMtPl9NX2ZpbmlzaCArIDEsIHRoaXMtPl9NX2ZpbmlzaCArIDEpOwotICAgICAgICBlbHNlCi0jZW5kaWYgLyogX1NUTFBfVVNFX1NIT1JUX1NUUklOR19PUFRJTSAqLwotICAgICAgICBfU1RMUF9QUklWIF9fdWNvcHkoKHRoaXMtPl9NX2ZpbmlzaCAtIF9fbikgKyAxLCB0aGlzLT5fTV9maW5pc2ggKyAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+X01fZmluaXNoICsgMSk7Ci0gICAgICAgIHRoaXMtPl9NX2ZpbmlzaCArPSBfX247Ci0gICAgICAgIF9UcmFpdHM6Om1vdmUoX19wb3MgKyBfX24sIF9fcG9zLCAoX19lbGVtc19hZnRlciAtIF9fbikgKyAxKTsKLSAgICAgICAgX1RyYWl0czo6YXNzaWduKF9fcG9zLCBfX24sIF9fYyk7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNKQotICAgICAgICBpZiAodGhpcy0+X01fdXNpbmdfc3RhdGljX2J1ZigpKQotICAgICAgICAgIF9UcmFpdHM6OmFzc2lnbih0aGlzLT5fTV9maW5pc2ggKyAxLCBfX24gLSBfX2VsZW1zX2FmdGVyIC0gMSwgX19jKTsKLSAgICAgICAgZWxzZQotI2VuZGlmIC8qIF9TVExQX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0gKi8KLSAgICAgICAgX1NUTFBfUFJJViBfX3VuaW5pdGlhbGl6ZWRfZmlsbF9uKHRoaXMtPl9NX2ZpbmlzaCArIDEsIF9fbiAtIF9fZWxlbXNfYWZ0ZXIgLSAxLCBfX2MpOwotICAgICAgICB0aGlzLT5fTV9maW5pc2ggKz0gX19uIC0gX19lbGVtc19hZnRlcjsKLSAgICAgICAgX1NUTFBfVFJZIHsKLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNKQotICAgICAgICAgIGlmICh0aGlzLT5fTV91c2luZ19zdGF0aWNfYnVmKCkpCi0gICAgICAgICAgICBfTV9jb3B5KF9fcG9zLCBfX29sZF9maW5pc2ggKyAxLCB0aGlzLT5fTV9maW5pc2gpOwotICAgICAgICAgIGVsc2UKLSNlbmRpZiAvKiBfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNICovCi0gICAgICAgICAgX1NUTFBfUFJJViBfX3Vjb3B5KF9fcG9zLCBfX29sZF9maW5pc2ggKyAxLCB0aGlzLT5fTV9maW5pc2gpOwotICAgICAgICAgIHRoaXMtPl9NX2ZpbmlzaCArPSBfX2VsZW1zX2FmdGVyOwotICAgICAgICB9Ci0gICAgICAgIF9TVExQX1VOV0lORCgoX1NUTFBfU1REOjpfRGVzdHJveV9SYW5nZShfX29sZF9maW5pc2ggKyAxLCB0aGlzLT5fTV9maW5pc2gpLAotICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPl9NX2ZpbmlzaCA9IF9fb2xkX2ZpbmlzaCkpCi0gICAgICAgIF9UcmFpdHM6OmFzc2lnbihfX3BvcywgX19lbGVtc19hZnRlciArIDEsIF9fYyk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSBzaXplKCk7Ci0gICAgICBzaXplX3R5cGUgX19sZW4gPSBfX29sZF9zaXplICsgKG1heCkoX19vbGRfc2l6ZSwgX19uKSArIDE7Ci0gICAgICBwb2ludGVyIF9fbmV3X3N0YXJ0ID0gdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuYWxsb2NhdGUoX19sZW4sIF9fbGVuKTsKLSAgICAgIHBvaW50ZXIgX19uZXdfZmluaXNoID0gX19uZXdfc3RhcnQ7Ci0gICAgICBfU1RMUF9UUlkgewotICAgICAgICBfX25ld19maW5pc2ggPSBfU1RMUF9QUklWIF9fdWNvcHkodGhpcy0+X01fU3RhcnQoKSwgX19wb3MsIF9fbmV3X3N0YXJ0KTsKLSAgICAgICAgX19uZXdfZmluaXNoID0gX1NUTFBfUFJJViBfX3VuaW5pdGlhbGl6ZWRfZmlsbF9uKF9fbmV3X2ZpbmlzaCwgX19uLCBfX2MpOwotICAgICAgICBfX25ld19maW5pc2ggPSBfU1RMUF9QUklWIF9fdWNvcHkoX19wb3MsIHRoaXMtPl9NX2ZpbmlzaCwgX19uZXdfZmluaXNoKTsKLSAgICAgICAgX01fY29uc3RydWN0X251bGwoX19uZXdfZmluaXNoKTsKLSAgICAgIH0KLSAgICAgIF9TVExQX1VOV0lORCgoX1NUTFBfU1REOjpfRGVzdHJveV9SYW5nZShfX25ld19zdGFydCxfX25ld19maW5pc2gpLAotICAgICAgICAgICAgICAgICAgICB0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5kZWFsbG9jYXRlKF9fbmV3X3N0YXJ0LF9fbGVuKSkpCi0gICAgICB0aGlzLT5fTV9kZXN0cm95X3JhbmdlKCk7Ci0gICAgICB0aGlzLT5fTV9kZWFsbG9jYXRlX2Jsb2NrKCk7Ci0gICAgICB0aGlzLT5fTV9yZXNldChfX25ld19zdGFydCwgX19uZXdfZmluaXNoLCBfX25ld19zdGFydCArIF9fbGVuKTsKLSAgICB9Ci0gIH0KLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgotdm9pZCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPjo6X01faW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9DaGFyVCogX19maXJzdCwgY29uc3QgX0NoYXJUKiBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBfX3NlbGZfcmVmKSB7Ci0gIC8vdGhpcyB2ZXJzaW9uIGhhcyB0byB0YWtlIGNhcmUgYWJvdXQgdGhlIGF1dG8gcmVmZXJlbmNpbmcKLSAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KSB7Ci0gICAgY29uc3QgcHRyZGlmZl90IF9fbiA9IF9fbGFzdCAtIF9fZmlyc3Q7Ci0gICAgaWYgKHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLl9NX2RhdGEgLSB0aGlzLT5fTV9maW5pc2ggPj0gX19uICsgMSkgewotICAgICAgY29uc3QgcHRyZGlmZl90IF9fZWxlbXNfYWZ0ZXIgPSB0aGlzLT5fTV9maW5pc2ggLSBfX3BvczsKLSAgICAgIHBvaW50ZXIgX19vbGRfZmluaXNoID0gdGhpcy0+X01fZmluaXNoOwotICAgICAgaWYgKF9fZWxlbXNfYWZ0ZXIgPj0gX19uKSB7Ci0jaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1NIT1JUX1NUUklOR19PUFRJTSkKLSAgICAgICAgaWYgKHRoaXMtPl9NX3VzaW5nX3N0YXRpY19idWYoKSkKLSAgICAgICAgICBfTV9jb3B5KCh0aGlzLT5fTV9maW5pc2ggLSBfX24pICsgMSwgdGhpcy0+X01fZmluaXNoICsgMSwgdGhpcy0+X01fZmluaXNoICsgMSk7Ci0gICAgICAgIGVsc2UKLSNlbmRpZiAvKiBfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNICovCi0gICAgICAgIF9TVExQX1BSSVYgX191Y29weSgodGhpcy0+X01fZmluaXNoIC0gX19uKSArIDEsIHRoaXMtPl9NX2ZpbmlzaCArIDEsIHRoaXMtPl9NX2ZpbmlzaCArIDEpOwotICAgICAgICB0aGlzLT5fTV9maW5pc2ggKz0gX19uOwotICAgICAgICBfVHJhaXRzOjptb3ZlKF9fcG9zICsgX19uLCBfX3BvcywgKF9fZWxlbXNfYWZ0ZXIgLSBfX24pICsgMSk7Ci0gICAgICAgIGlmICghX19zZWxmX3JlZiB8fCBfX2xhc3QgPCBfX3BvcykgewotICAgICAgICAgIF9NX2NvcHkoX19maXJzdCwgX19sYXN0LCBfX3Bvcyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgLy9XZSBoYXZlIHRvIGNoZWNrIHRoYXQgdGhlIHNvdXJjZSBidWZmZXIgaGFzbid0IG1vdmUKLSAgICAgICAgICBpZiAoX19maXJzdCA+PSBfX3BvcykgewotICAgICAgICAgICAgLy9UaGUgc291cmNlIGJ1ZmZlciBoYXMgbW92ZQotICAgICAgICAgICAgX19maXJzdCArPSBfX247Ci0gICAgICAgICAgICBfX2xhc3QgKz0gX19uOwotICAgICAgICAgICAgX01fY29weShfX2ZpcnN0LCBfX2xhc3QsIF9fcG9zKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvL1RoZSBzb3VyY2UgYnVmZmVyIGhhc24ndCBtb3ZlLCBpdCBoYXMgYmVlbiBkdXBsaWNhdGVkCi0gICAgICAgICAgICBfTV9tb3ZlKF9fZmlyc3QsIF9fbGFzdCwgX19wb3MpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fbWlkID0gX19maXJzdDsKLSAgICAgICAgX19taWQgKz0gX19lbGVtc19hZnRlciArIDE7Ci0jaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1NIT1JUX1NUUklOR19PUFRJTSkKLSAgICAgICAgaWYgKHRoaXMtPl9NX3VzaW5nX3N0YXRpY19idWYoKSkKLSAgICAgICAgICBfTV9jb3B5KF9fbWlkLCBfX2xhc3QsIHRoaXMtPl9NX2ZpbmlzaCArIDEpOwotICAgICAgICBlbHNlCi0jZW5kaWYgLyogX1NUTFBfVVNFX1NIT1JUX1NUUklOR19PUFRJTSAqLwotICAgICAgICBfU1RMUF9QUklWIF9fdWNvcHkoX19taWQsIF9fbGFzdCwgdGhpcy0+X01fZmluaXNoICsgMSk7Ci0gICAgICAgIHRoaXMtPl9NX2ZpbmlzaCArPSBfX24gLSBfX2VsZW1zX2FmdGVyOwotICAgICAgICBfU1RMUF9UUlkgewotI2lmIGRlZmluZWQgKF9TVExQX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0pCi0gICAgICAgICAgaWYgKHRoaXMtPl9NX3VzaW5nX3N0YXRpY19idWYoKSkKLSAgICAgICAgICAgIF9NX2NvcHkoX19wb3MsIF9fb2xkX2ZpbmlzaCArIDEsIHRoaXMtPl9NX2ZpbmlzaCk7Ci0gICAgICAgICAgZWxzZQotI2VuZGlmIC8qIF9TVExQX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0gKi8KLSAgICAgICAgICBfU1RMUF9QUklWIF9fdWNvcHkoX19wb3MsIF9fb2xkX2ZpbmlzaCArIDEsIHRoaXMtPl9NX2ZpbmlzaCk7Ci0gICAgICAgICAgdGhpcy0+X01fZmluaXNoICs9IF9fZWxlbXNfYWZ0ZXI7Ci0gICAgICAgIH0KLSAgICAgICAgX1NUTFBfVU5XSU5EKChfU1RMUF9TVEQ6Ol9EZXN0cm95X1JhbmdlKF9fb2xkX2ZpbmlzaCArIDEsIHRoaXMtPl9NX2ZpbmlzaCksCi0gICAgICAgICAgICAgICAgICAgICAgdGhpcy0+X01fZmluaXNoID0gX19vbGRfZmluaXNoKSkKLSAgICAgICAgaWYgKCFfX3NlbGZfcmVmKQotICAgICAgICAgIF9NX2NvcHkoX19maXJzdCwgX19taWQsIF9fcG9zKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIF9NX21vdmUoX19maXJzdCwgX19taWQsIF9fcG9zKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBjb25zdCBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IHNpemUoKTsKLSAgICAgIHNpemVfdHlwZSBfX2xlbiA9IF9fb2xkX3NpemUgKyAobWF4KShfX29sZF9zaXplLCBfX1NUQVRJQ19DQVNUKGNvbnN0IHNpemVfdHlwZSxfX24pKSArIDE7Ci0gICAgICBwb2ludGVyIF9fbmV3X3N0YXJ0ID0gdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuYWxsb2NhdGUoX19sZW4sIF9fbGVuKTsKLSAgICAgIHBvaW50ZXIgX19uZXdfZmluaXNoID0gX19uZXdfc3RhcnQ7Ci0gICAgICBfU1RMUF9UUlkgewotICAgICAgICBfX25ld19maW5pc2ggPSBfU1RMUF9QUklWIF9fdWNvcHkodGhpcy0+X01fU3RhcnQoKSwgX19wb3MsIF9fbmV3X3N0YXJ0KTsKLSAgICAgICAgX19uZXdfZmluaXNoID0gX1NUTFBfUFJJViBfX3Vjb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19uZXdfZmluaXNoKTsKLSAgICAgICAgX19uZXdfZmluaXNoID0gX1NUTFBfUFJJViBfX3Vjb3B5KF9fcG9zLCB0aGlzLT5fTV9maW5pc2gsIF9fbmV3X2ZpbmlzaCk7Ci0gICAgICAgIF9NX2NvbnN0cnVjdF9udWxsKF9fbmV3X2ZpbmlzaCk7Ci0gICAgICB9Ci0gICAgICBfU1RMUF9VTldJTkQoKF9TVExQX1NURDo6X0Rlc3Ryb3lfUmFuZ2UoX19uZXdfc3RhcnQsX19uZXdfZmluaXNoKSwKLSAgICAgICAgICAgICAgICAgICAgdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuZGVhbGxvY2F0ZShfX25ld19zdGFydCxfX2xlbikpKQotICAgICAgdGhpcy0+X01fZGVzdHJveV9yYW5nZSgpOwotICAgICAgdGhpcy0+X01fZGVhbGxvY2F0ZV9ibG9jaygpOwotICAgICAgdGhpcy0+X01fcmVzZXQoX19uZXdfc3RhcnQsIF9fbmV3X2ZpbmlzaCwgX19uZXdfc3RhcnQgKyBfX2xlbik7Ci0gICAgfQotICB9Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KLWJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+JgotYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4gOjpyZXBsYWNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jKSB7Ci0gIHNpemVfdHlwZSBfX2xlbiA9IChzaXplX3R5cGUpKF9fbGFzdCAtIF9fZmlyc3QpOwotCi0gIGlmIChfX2xlbiA+PSBfX24pIHsKLSAgICBfVHJhaXRzOjphc3NpZ24oX19maXJzdCwgX19uLCBfX2MpOwotICAgIGVyYXNlKF9fZmlyc3QgKyBfX24sIF9fbGFzdCk7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgX1RyYWl0czo6YXNzaWduKF9fZmlyc3QsIF9fbGVuLCBfX2MpOwotICAgIGluc2VydChfX2xhc3QsIF9fbiAtIF9fbGVuLCBfX2MpOwotICB9Ci0gIHJldHVybiAqdGhpczsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgotYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4mCi1iYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiA6Ol9NX3JlcGxhY2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9DaGFyVCogX19mLCBjb25zdCBfQ2hhclQqIF9fbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIF9fc2VsZl9yZWYpIHsKLSAgY29uc3QgcHRyZGlmZl90ICAgICAgIF9fbiA9IF9fbCAtIF9fZjsKLSAgY29uc3QgZGlmZmVyZW5jZV90eXBlIF9fbGVuID0gX19sYXN0IC0gX19maXJzdDsKLSAgaWYgKF9fbGVuID49IF9fbikgewotICAgIGlmICghX19zZWxmX3JlZiB8fCBfX2wgPCBfX2ZpcnN0IHx8IF9fZiA+PSBfX2xhc3QpCi0gICAgICBfTV9jb3B5KF9fZiwgX19sLCBfX2ZpcnN0KTsKLSAgICBlbHNlCi0gICAgICBfTV9tb3ZlKF9fZiwgX19sLCBfX2ZpcnN0KTsKLSAgICBlcmFzZShfX2ZpcnN0ICsgX19uLCBfX2xhc3QpOwotICB9Ci0gIGVsc2UgewotICAgIGlmICghX19zZWxmX3JlZiB8fCAoX19mID49IF9fbGFzdCkgfHwgKF9fbCA8PSBfX2ZpcnN0KSkgewotICAgICAgLy9ubyBvdmVybGFwOgotICAgICAgY29uc3RfaXRlcmF0b3IgX19tID0gX19mICsgX19sZW47Ci0gICAgICBfTV9jb3B5KF9fZiwgX19tLCBfX2ZpcnN0KTsKLSAgICAgIF9NX2luc2VydChfX2xhc3QsIF9fbSwgX19sLCBmYWxzZSApOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIC8vd2UgaGF2ZSB0byB0YWtlIGNhcmUgb2Ygb3ZlcmxhcGluZwotICAgICAgaWYgKF9fZiA8IF9fZmlyc3QpIHsKLSAgICAgICAgY29uc3RfaXRlcmF0b3IgX19tID0gX19mICsgX19sZW47Ci0gICAgICAgIC8vV2UgaGF2ZSB0byBkZWFsIHdpdGggcG9zc2libGUgcmVhbGxvY2F0aW9uIGJlY2F1c2Ugd2UgZG8gaW5zZXJ0IGZpcnN0LgotICAgICAgICBjb25zdCBkaWZmZXJlbmNlX3R5cGUgX19vZmZfZGVzdCA9IF9fZmlyc3QgLSB0aGlzLT5iZWdpbigpOwotICAgICAgICBjb25zdCBkaWZmZXJlbmNlX3R5cGUgX19vZmZfc3JjID0gX19mIC0gdGhpcy0+YmVnaW4oKTsKLSAgICAgICAgX01faW5zZXJ0KF9fbGFzdCwgX19tLCBfX2wsIHRydWUpOwotICAgICAgICBfVHJhaXRzOjptb3ZlKGJlZ2luKCkgKyBfX29mZl9kZXN0LCBiZWdpbigpICsgX19vZmZfc3JjLCBfX2xlbik7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgY29uc3RfaXRlcmF0b3IgX19tID0gX19mICsgX19sZW47Ci0gICAgICAgIF9UcmFpdHM6Om1vdmUoX19maXJzdCwgX19mLCBfX2xlbik7Ci0gICAgICAgIF9NX2luc2VydChfX2xhc3QsIF9fbSwgX19sLCB0cnVlKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuICp0aGlzOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+IF9fc2l6ZV90eXBlX18KLWJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+IDo6ZmluZChjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX24pIGNvbnN0IHsKLSAgY29uc3Qgc2l6ZV90IF9fbGVuID0gc2l6ZSgpOwotICBpZiAoX19wb3MgPj0gX19sZW4gfHwgX19wb3MgKyBfX24gPiBfX2xlbikKLSAgICByZXR1cm4gbnBvczsKLSAgZWxzZSB7Ci0gICAgY29uc3RfcG9pbnRlciBfX3Jlc3VsdCA9Ci0gICAgICBfU1RMUF9TVEQ6OnNlYXJjaCh0aGlzLT5fTV9TdGFydCgpICsgX19wb3MsIHRoaXMtPl9NX0ZpbmlzaCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgX19zLCBfX3MgKyBfX24sIF9TVExQX1BSSVYgX0VxX3RyYWl0czxfVHJhaXRzPigpKTsKLSAgICByZXR1cm4gX19yZXN1bHQgIT0gdGhpcy0+X01fRmluaXNoKCkgPyBfX3Jlc3VsdCAtIHRoaXMtPl9NX1N0YXJ0KCkgOiBucG9zOwotICB9Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4gX19zaXplX3R5cGVfXwotYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4gOjpmaW5kKF9DaGFyVCBfX2MsIHNpemVfdHlwZSBfX3BvcykgY29uc3QgewotICBpZiAoX19wb3MgPj0gc2l6ZSgpKSAvKl9fcG9zICsgMSA+IHNpemUoKSovCi0gICAgcmV0dXJuIG5wb3M7Ci0gIGVsc2UgewotICAgIGNvbnN0X3BvaW50ZXIgX19yZXN1bHQgPQotICAgICAgX1NUTFBfU1REOjpmaW5kX2lmKHRoaXMtPl9NX1N0YXJ0KCkgKyBfX3BvcywgdGhpcy0+X01fRmluaXNoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfRXFfY2hhcl9ib3VuZDxfVHJhaXRzPihfX2MpKTsKLSAgICByZXR1cm4gX19yZXN1bHQgIT0gdGhpcy0+X01fRmluaXNoKCkgPyBfX3Jlc3VsdCAtIHRoaXMtPl9NX1N0YXJ0KCkgOiBucG9zOwotICB9Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KLV9fc2l6ZV90eXBlX18KLWJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+OjpyZmluZChjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdAotewotICBjb25zdCBzaXplX3R5cGUgX19sZW4gPSBzaXplKCk7Ci0gIGlmICggX19sZW4gPCBfX24gKSB7Ci0gICAgcmV0dXJuIG5wb3M7Ci0gIH0KLSAgY29uc3RfcG9pbnRlciBfX2xhc3QgPSB0aGlzLT5fTV9TdGFydCgpICsgKG1pbikoIF9fbGVuIC0gX19uLCBfX3BvcykgKyBfX247Ci0gIGNvbnN0X3BvaW50ZXIgX19yZXN1bHQgPSBmaW5kX2VuZCh0aGlzLT5fTV9TdGFydCgpLCBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3MsIF9fcyArIF9fbiwgX1NUTFBfUFJJViBfRXFfdHJhaXRzPF9UcmFpdHM+KCkpOwotICByZXR1cm4gX19yZXN1bHQgIT0gX19sYXN0ID8gX19yZXN1bHQgLSB0aGlzLT5fTV9TdGFydCgpIDogbnBvczsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgotX19zaXplX3R5cGVfXwotYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz46OnJmaW5kKF9DaGFyVCBfX2MsIHNpemVfdHlwZSBfX3BvcykgY29uc3QKLXsKLSAgY29uc3Qgc2l6ZV90eXBlIF9fbGVuID0gc2l6ZSgpOwotICBpZiAoIF9fbGVuIDwgMSApIHsKLSAgICByZXR1cm4gbnBvczsKLSAgfQotICBjb25zdF9pdGVyYXRvciBfX2xhc3QgPSBiZWdpbigpICsgKG1pbikoX19sZW4gLSAxLCBfX3BvcykgKyAxOwotICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIF9fcnJlc3VsdCA9Ci0gICAgX1NUTFBfU1REOjpmaW5kX2lmKGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoX19sYXN0KSwgcmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9FcV9jaGFyX2JvdW5kPF9UcmFpdHM+KF9fYykpOwotICByZXR1cm4gX19ycmVzdWx0ICE9IHJlbmQoKSA/IChfX3JyZXN1bHQuYmFzZSgpIC0gMSkgLSBiZWdpbigpIDogbnBvczsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPiBfX3NpemVfdHlwZV9fCi1iYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiA6OmZpbmRfZmlyc3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uKSBjb25zdCB7Ci0gIGlmIChfX3BvcyA+PSBzaXplKCkpIC8qX19wb3MgKyAxID4gc2l6ZSgpKi8KLSAgICByZXR1cm4gbnBvczsKLSAgZWxzZSB7Ci0gICAgY29uc3RfaXRlcmF0b3IgX19yZXN1bHQgPSBfU1RMUF9QUklWIF9fZmluZF9maXJzdF9vZihiZWdpbigpICsgX19wb3MsIGVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19zLCBfX3MgKyBfX24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9FcV90cmFpdHM8X1RyYWl0cz4oKSk7Ci0gICAgcmV0dXJuIF9fcmVzdWx0ICE9IGVuZCgpID8gX19yZXN1bHQgLSBiZWdpbigpIDogbnBvczsKLSAgfQotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+Ci0gX19zaXplX3R5cGVfXwotYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4gOjpmaW5kX2xhc3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX24pIGNvbnN0Ci17Ci0gIGNvbnN0IHNpemVfdHlwZSBfX2xlbiA9IHNpemUoKTsKLSAgaWYgKCBfX2xlbiA8IDEgKSB7Ci0gICAgcmV0dXJuIG5wb3M7Ci0gIH0KLSAgY29uc3QgY29uc3RfaXRlcmF0b3IgX19sYXN0ID0gYmVnaW4oKSArIChtaW4pKF9fbGVuIC0gMSwgX19wb3MpICsgMTsKLSAgY29uc3QgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciBfX3JyZXN1bHQgPQotICAgIF9TVExQX1BSSVYgX19maW5kX2ZpcnN0X29mKGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoX19sYXN0KSwgcmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcywgX19zICsgX19uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfRXFfdHJhaXRzPF9UcmFpdHM+KCkpOwotICByZXR1cm4gX19ycmVzdWx0ICE9IHJlbmQoKSA/IChfX3JyZXN1bHQuYmFzZSgpIC0gMSkgLSBiZWdpbigpIDogbnBvczsKLX0KLQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+IF9fc2l6ZV90eXBlX18KLWJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+IDo6ZmluZF9maXJzdF9ub3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbikgY29uc3QgewotICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmNoYXJfdHlwZSBfQ2hhclR5cGU7Ci0gIGlmIChfX3BvcyA+PSBzaXplKCkpIC8qX19wb3MgKyAxID49IHNpemUoKSovCi0gICAgcmV0dXJuIG5wb3M7Ci0gIGVsc2UgewotICAgIGNvbnN0X3BvaW50ZXIgX19yZXN1bHQgPSBfU1RMUF9TVEQ6OmZpbmRfaWYodGhpcy0+X01fU3RhcnQoKSArIF9fcG9zLCB0aGlzLT5fTV9GaW5pc2goKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX05vdF93aXRoaW5fdHJhaXRzPF9UcmFpdHM+KF9fQ09OU1RfQ0FTVChjb25zdCBfQ2hhclR5cGUqLCBfX3MpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fQ09OU1RfQ0FTVChjb25zdCBfQ2hhclR5cGUqLCBfX3MpICsgX19uKSk7Ci0gICAgcmV0dXJuIF9fcmVzdWx0ICE9IHRoaXMtPl9NX2ZpbmlzaCA/IF9fcmVzdWx0IC0gdGhpcy0+X01fU3RhcnQoKSA6IG5wb3M7Ci0gIH0KLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPiBfX3NpemVfdHlwZV9fCi1iYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiA6OmZpbmRfZmlyc3Rfbm90X29mKF9DaGFyVCBfX2MsIHNpemVfdHlwZSBfX3BvcykgY29uc3QgewotICBpZiAoMSA+IHNpemUoKSkKLSAgICByZXR1cm4gbnBvczsKLSAgZWxzZSB7Ci0gICAgY29uc3RfcG9pbnRlciBfX3Jlc3VsdCA9IF9TVExQX1NURDo6ZmluZF9pZih0aGlzLT5fTV9TdGFydCgpICsgX19wb3MsIHRoaXMtPl9NX0ZpbmlzaCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfTmVxX2NoYXJfYm91bmQ8X1RyYWl0cz4oX19jKSk7Ci0gICAgcmV0dXJuIF9fcmVzdWx0ICE9IHRoaXMtPl9NX2ZpbmlzaCA/IF9fcmVzdWx0IC0gdGhpcy0+X01fU3RhcnQoKSA6IG5wb3M7Ci0gIH0KLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgotX19zaXplX3R5cGVfXwotYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz46OmZpbmRfbGFzdF9ub3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgY29uc3QKLXsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpjaGFyX3R5cGUgX0NoYXJUeXBlOwotICBjb25zdCBzaXplX3R5cGUgX19sZW4gPSBzaXplKCk7Ci0gIGlmICggX19sZW4gPCAxICkgewotICAgIHJldHVybiBucG9zOwotICB9Ci0gIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCA9IGJlZ2luKCkgKyAobWluKShfX2xlbiAtIDEsIF9fcG9zKSArIDE7Ci0gIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgX19ybGFzdCA9IGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoX19sYXN0KTsKLSAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciBfX3JyZXN1bHQgPQotICAgIF9TVExQX1NURDo6ZmluZF9pZihfX3JsYXN0LCByZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX05vdF93aXRoaW5fdHJhaXRzPF9UcmFpdHM+KChjb25zdCBfQ2hhclR5cGUqKV9fcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IF9DaGFyVHlwZSopX19zICsgX19uKSk7Ci0gIHJldHVybiBfX3JyZXN1bHQgIT0gcmVuZCgpID8gKF9fcnJlc3VsdC5iYXNlKCkgLSAxKSAtIGJlZ2luKCkgOiBucG9zOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+Ci1fX3NpemVfdHlwZV9fCi1iYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjpmaW5kX2xhc3Rfbm90X29mKF9DaGFyVCBfX2MsIHNpemVfdHlwZSBfX3BvcykgY29uc3QKLXsKLSAgY29uc3Qgc2l6ZV90eXBlIF9fbGVuID0gc2l6ZSgpOwotICBpZiAoIF9fbGVuIDwgMSApIHsKLSAgICByZXR1cm4gbnBvczsKLSAgfQotICBjb25zdF9pdGVyYXRvciBfX2xhc3QgPSBiZWdpbigpICsgKG1pbikoX19sZW4gLSAxLCBfX3BvcykgKyAxOwotICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIF9fcmxhc3QgPSBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKF9fbGFzdCk7Ci0gIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgX19ycmVzdWx0ID0KLSAgICBfU1RMUF9TVEQ6OmZpbmRfaWYoX19ybGFzdCwgcmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9OZXFfY2hhcl9ib3VuZDxfVHJhaXRzPihfX2MpKTsKLSAgcmV0dXJuIF9fcnJlc3VsdCAhPSByZW5kKCkgPyAoX19ycmVzdWx0LmJhc2UoKSAtIDEpIC0gYmVnaW4oKSA6IG5wb3M7Ci19Ci0KLSNpZiAhZGVmaW5lZCAoYmFzaWNfc3RyaW5nKQotX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQotI2VuZGlmCi0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KLXZvaWQgX1NUTFBfQ0FMTCBfU19zdHJpbmdfY29weShjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiYgX19zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DaGFyVCogX19idWYsIHNpemVfdCBfX24pIHsKLSAgaWYgKF9fbiA+IDApIHsKLSAgICBfX24gPSAobWluKSAoX19uIC0gMSwgX19zLnNpemUoKSk7Ci0gICAgX1NUTFBfU1REOjpjb3B5KF9fcy5iZWdpbigpLCBfX3MuYmVnaW4oKSArIF9fbiwgX19idWYpOwotICAgIF9fYnVmW19fbl0gPSBfQ2hhclQoKTsKLSAgfQotfQotCi1fU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKLQotX1NUTFBfRU5EX05BTUVTUEFDRQotCi0jaW5jbHVkZSA8c3RsL19yYW5nZV9lcnJvcnMuaD4KLQotX1NUTFBfQkVHSU5fTkFNRVNQQUNFCi0KLV9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKLQotLy8gX1N0cmluZ19iYXNlIG1ldGhvZHMKLXRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KLXZvaWQgX1N0cmluZ19iYXNlPF9UcCxfQWxsb2M+OjpfTV90aHJvd19sZW5ndGhfZXJyb3IoKSBjb25zdAoteyBfX3N0bF90aHJvd19sZW5ndGhfZXJyb3IoImJhc2ljX3N0cmluZyIpOyB9Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KLXZvaWQgX1N0cmluZ19iYXNlPF9UcCwgX0FsbG9jPjo6X01fdGhyb3dfb3V0X29mX3JhbmdlKCkgY29uc3QKLXsgX19zdGxfdGhyb3dfb3V0X29mX3JhbmdlKCJiYXNpY19zdHJpbmciKTsgfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Ci12b2lkIF9TdHJpbmdfYmFzZTxfVHAsIF9BbGxvYz46Ol9NX2FsbG9jYXRlX2Jsb2NrKHNpemVfdCBfX24pIHsKLSAgaWYgKChfX24gPD0gKG1heF9zaXplKCkgKyAxKSkgJiYgKF9fbiA+IDApKSB7Ci0jaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1NIT1JUX1NUUklOR19PUFRJTSkKLSAgICBpZiAoX19uID4gX0RFRkFVTFRfU0laRSkgewotICAgICAgdGhpcy0+X01fYnVmZmVycy5fTV9keW5hbWljX2J1ZiA9IF9NX2VuZF9vZl9zdG9yYWdlLmFsbG9jYXRlKF9fbiwgX19uKTsKLSAgICAgIHRoaXMtPl9NX2ZpbmlzaCA9IHRoaXMtPl9NX2J1ZmZlcnMuX01fZHluYW1pY19idWY7Ci0gICAgICB0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5fTV9kYXRhID0gdGhpcy0+X01fZmluaXNoICsgX19uOwotICAgIH0KLSNlbHNlCi0gICAgdGhpcy0+X01fc3RhcnQgID0gX01fZW5kX29mX3N0b3JhZ2UuYWxsb2NhdGUoX19uLCBfX24pOwotICAgIHRoaXMtPl9NX2ZpbmlzaCA9IHRoaXMtPl9NX3N0YXJ0OwotICAgIHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLl9NX2RhdGEgPSB0aGlzLT5fTV9maW5pc2ggKyBfX247Ci0jZW5kaWYgLypfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNICAqLwotICB9IGVsc2UgewotICAgIHRoaXMtPl9NX3Rocm93X2xlbmd0aF9lcnJvcigpOwotICB9Ci19Ci0KLSNpZiAhZGVmaW5lZCAoYmFzaWNfc3RyaW5nKQotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+Ci1iYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjpiYXNpY19zdHJpbmcoY29uc3QgX0NoYXJUKiBfX3MpCi0gIDogX1NUTFBfUFJJViBfU3RyaW5nX2Jhc2U8X0NoYXJULF9BbGxvYz4oYWxsb2NhdG9yX3R5cGUoKSkgewotICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKQotICBfTV9yYW5nZV9pbml0aWFsaXplKF9fcywgX19zICsgdHJhaXRzX3R5cGU6Omxlbmd0aChfX3MpKTsKLX0KLSNlbmRpZgotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+Ci1iYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjpiYXNpY19zdHJpbmcoY29uc3QgX0NoYXJUKiBfX3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKLSAgOiBfU1RMUF9QUklWIF9TdHJpbmdfYmFzZTxfQ2hhclQsX0FsbG9jPihfX2EpIHsKLSAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKLSAgX01fcmFuZ2VfaW5pdGlhbGl6ZShfX3MsIF9fcyArIHRyYWl0c190eXBlOjpsZW5ndGgoX19zKSk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KLWJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OmJhc2ljX3N0cmluZyhjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+ICYgX19zKQotICA6IF9TVExQX1BSSVYgX1N0cmluZ19iYXNlPF9DaGFyVCxfQWxsb2M+KF9fcy5nZXRfYWxsb2NhdG9yKCkpCi17IF9NX3JhbmdlX2luaXRpYWxpemUoX19zLl9NX1N0YXJ0KCksIF9fcy5fTV9GaW5pc2goKSk7IH0KLQotI2lmIGRlZmluZWQgKGJhc2ljX3N0cmluZykKLV9TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQotIyAgdW5kZWYgYmFzaWNfc3RyaW5nCi0jZWxzZQotLyogSWYgYmFzaWNfc3RyaW5nIGlzIGRlZmluZWQgaXQgbWVhbnMgdGhhdCBpdCB3b24ndCBiZSB0aGUgYmFzaWNfc3RyaW5nIGNsYXNzCi0gKiBleHBvc2VkIHRvIFNUTHBvcnQgdXNlcnMgc28gbnBvcyBkbyBub3QgbmVlZCBleHRlcm5hbCBsaW5rYWdlLgotICovCi0jICBpZiAhZGVmaW5lZCAoX1NUTFBfU1RBVElDX0NPTlNUX0lOSVRfQlVHKQotIyAgICBpZiAhZGVmaW5lZCAoX19HTlVDX18pIHx8IChfX0dOVUNfXyAhPSAyKSB8fCAoX19HTlVDX01JTk9SX18gIT0gOTYpCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+Ci1jb25zdCBzaXplX3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6bnBvczsKLSMgICAgZW5kaWYKLSMgIGVuZGlmCi0jZW5kaWYKLQotX1NUTFBfRU5EX05BTUVTUEFDRQotCi0jdW5kZWYgX19zaXplX3R5cGVfXwotI2lmIGRlZmluZWQgKF9TVExQX05FU1RFRF9UWVBFX1BBUkFNX0JVRykKLSMgIHVuZGVmIHNpemVfdHlwZQotIyAgdW5kZWYgaXRlcmF0b3IKLSNlbmRpZgotCi0jZW5kaWYgLyogIF9TVExQX1NUUklOR19DICovCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX3N0cmluZy5oIGIvc3RsL19zdHJpbmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI4ZGVkZC4uMDAwMDAwMAotLS0gYS9zdGwvX3N0cmluZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQxNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTE5OTkKLSAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogQm9yaXMgRm9taXRjaGV2Ci0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICovCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfU1RSSU5HX0gKLSNkZWZpbmUgX1NUTFBfSU5URVJOQUxfU1RSSU5HX0gKLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9BTExPQ19ICi0jICBpbmNsdWRlIDxzdGwvX2FsbG9jLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBfU1RMUF9TVFJJTkdfRldEX0gKLSMgIGluY2x1ZGUgPHN0bC9fc3RyaW5nX2Z3ZC5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfRlVOQ1RJT05fQkFTRV9ICi0jICBpbmNsdWRlIDxzdGwvX2Z1bmN0aW9uX2Jhc2UuaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0FMR09CQVNFX0gKLSMgIGluY2x1ZGUgPHN0bC9fYWxnb2Jhc2UuaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0lURVJBVE9SX0gKLSMgIGluY2x1ZGUgPHN0bC9faXRlcmF0b3IuaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX1VOSU5JVElBTElaRURfSAotIyAgaW5jbHVkZSA8c3RsL191bmluaXRpYWxpemVkLmg+Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9TVExQX1VTRV9URU1QTEFURV9FWFBSRVNTSU9OKQotIyAgaW5jbHVkZSA8c3RsL19zdHJpbmdfc3VtLmg+Ci0jZW5kaWYgLyogX1NUTFBfVVNFX1RFTVBMQVRFX0VYUFJFU1NJT04gKi8KLQotI2lmIGRlZmluZWQgKF9fTVdFUktTX18pICYmICEgZGVmaW5lZCAoX1NUTFBfVVNFX09XTl9OQU1FU1BBQ0UpCi0KLS8vIE1TTCBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzIGV4cGVjdCB0byBzZWUgdGhlIGRlZmluaXRpb24gb2Ygc3RyZWFtcG9zCi0vLyB3aGVuIHRoaXMgaGVhZGVyIGlzIGluY2x1ZGVkLiBXZSBleHBlY3QgdGhpcyB0byBiZSBmaXhlZCBpbiBsYXRlciBNU0wKLS8vIGltcGxlbWVudGF0aW9ucwotIyAgaWYgIWRlZmluZWQoIF9fTVNMX0NQUF9fICkgfHwgX19NU0xfQ1BQX18gPCAweDQxMDUKLSMgICAgaW5jbHVkZSA8c3RsL21zbF9zdHJpbmcuaD4KLSMgIGVuZGlmCi0jZW5kaWYgLy8gX19NV0VSS1NfXwotCi0vKgotICogU3RhbmRhcmQgQysrIHN0cmluZyBjbGFzcy4gIFRoaXMgY2xhc3MgaGFzIHBlcmZvcm1hbmNlCi0gKiBjaGFyYWN0ZXJpc3RpY3MgdmVyeSBtdWNoIGxpa2UgdmVjdG9yPD4sIG1lYW5pbmcsIGZvciBleGFtcGxlLCB0aGF0Ci0gKiBpdCBkb2VzIG5vdCBwZXJmb3JtIHJlZmVyZW5jZS1jb3VudCBvciBjb3B5LW9uLXdyaXRlLCBhbmQgdGhhdAotICogY29uY2F0ZW5hdGlvbiBvZiB0d28gc3RyaW5ncyBpcyBhbiBPKE4pIG9wZXJhdGlvbi4KLQotICogVGhlcmUgYXJlIHRocmVlIHJlYXNvbnMgd2h5IGJhc2ljX3N0cmluZyBpcyBub3QgaWRlbnRpY2FsIHRvCi0gKiB2ZWN0b3IuCi0gKiBGaXJzdCwgYmFzaWNfc3RyaW5nIGNhbiBhbHdheXMgc3RvcmVzIGEgbnVsbCBjaGFyYWN0ZXIKLSAqIGF0IHRoZSBlbmQgKG1hY3JvIGRlcGVuZGVudCk7IHRoaXMgbWFrZXMgaXQgcG9zc2libGUgZm9yIGNfc3RyIHRvCi0gKiBiZSBhIGZhc3Qgb3BlcmF0aW9uLgotICogU2Vjb25kLCB0aGUgQysrIHN0YW5kYXJkIHJlcXVpcmVzIGJhc2ljX3N0cmluZyB0byBjb3B5IGVsZW1lbnRzCi0gKiB1c2luZyBjaGFyX3RyYWl0czw+Ojphc3NpZ24sIGNoYXJfdHJhaXRzPD46OmNvcHksIGFuZAotICogY2hhcl90cmFpdHM8Pjo6bW92ZS4gIFRoaXMgbWVhbnMgdGhhdCBhbGwgb2YgdmVjdG9yPD4ncyBsb3ctbGV2ZWwKLSAqIG9wZXJhdGlvbnMgbXVzdCBiZSByZXdyaXR0ZW4uICBUaGlyZCwgYmFzaWNfc3RyaW5nPD4gaGFzIGEgbG90IG9mCi0gKiBleHRyYSBmdW5jdGlvbnMgaW4gaXRzIGludGVyZmFjZSB0aGF0IGFyZSBjb252ZW5pZW50IGJ1dCwgc3RyaWN0bHkKLSAqIHNwZWFraW5nLCByZWR1bmRhbnQuCi0KLSAqIEFkZGl0aW9uYWxseSwgdGhlIEMrKyBzdGFuZGFyZCBpbXBvc2VzIGEgbWFqb3IgcmVzdHJpY3Rpb246IGFjY29yZGluZwotICogdG8gdGhlIHN0YW5kYXJkLCB0aGUgY2hhcmFjdGVyIHR5cGUgX0NoYXJUIG11c3QgYmUgYSBQT0QgdHlwZS4gIFRoaXMKLSAqIGltcGxlbWVudGF0aW9uIHdlYWtlbnMgdGhhdCByZXN0cmljdGlvbiwgYW5kIGFsbG93cyBfQ2hhclQgdG8gYmUgYQotICogYSB1c2VyLWRlZmluZWQgbm9uLVBPRCB0eXBlLiAgSG93ZXZlciwgX0NoYXJUIG11c3Qgc3RpbGwgaGF2ZSBhCi0gKiBkZWZhdWx0IGNvbnN0cnVjdG9yLgotICovCi0KLSNpbmNsdWRlIDxzdGwvX3N0cmluZ19iYXNlLmg+Ci0KLV9TVExQX0JFR0lOX05BTUVTUEFDRQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENsYXNzIGJhc2ljX3N0cmluZy4KLQotLy8gQ2xhc3MgaW52YXJpYW50czoKLS8vICgxKSBbc3RhcnQsIGZpbmlzaCkgaXMgYSB2YWxpZCByYW5nZS4KLS8vICgyKSBFYWNoIGl0ZXJhdG9yIGluIFtzdGFydCwgZmluaXNoKSBwb2ludHMgdG8gYSB2YWxpZCBvYmplY3QKLS8vICAgICBvZiB0eXBlIHZhbHVlX3R5cGUuCi0vLyAoMykgKmZpbmlzaCBpcyBhIHZhbGlkIG9iamVjdCBvZiB0eXBlIHZhbHVlX3R5cGU7IHdoZW4KLS8vICAgICB2YWx1ZV90eXBlIGlzIG5vdCBhIFBPRCBpdCBpcyB2YWx1ZV90eXBlKCkuCi0vLyAoNCkgW2ZpbmlzaCArIDEsIGVuZF9vZl9zdG9yYWdlKSBpcyBhIHZhbGlkIHJhbmdlLgotLy8gKDUpIEVhY2ggaXRlcmF0b3IgaW4gW2ZpbmlzaCArIDEsIGVuZF9vZl9zdG9yYWdlKSBwb2ludHMgdG8KLS8vICAgICB1bmluaW5pdGlhbGl6ZWQgbWVtb3J5LgotCi0vLyBOb3RlIG9uZSBpbXBvcnRhbnQgY29uc2VxdWVuY2U6IGEgc3RyaW5nIG9mIGxlbmd0aCBuIG11c3QgbWFuYWdlCi0vLyBhIGJsb2NrIG9mIG1lbW9yeSB3aG9zZSBzaXplIGlzIGF0IGxlYXN0IG4gKyAxLgotCi1zdHJ1Y3QgX1N0cmluZ19yZXNlcnZlX3Qge307Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfTVNWQzZfTUVNX1RfQlVHX1dPUktBUk9VTkQpCi0jICBkZWZpbmUgYmFzaWNfc3RyaW5nIF9TVExQX05PX01FTV9UX05BTUUoc3RyKQotI2VsaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpCi0jICBkZWZpbmUgYmFzaWNfc3RyaW5nIF9TVExQX05PTl9EQkdfTkFNRShzdHIpCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKGJhc2ljX3N0cmluZykKLV9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKLSNlbmRpZgotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+Ci1jbGFzcyBiYXNpY19zdHJpbmcgOiBwcm90ZWN0ZWQgX1NUTFBfUFJJViBfU3RyaW5nX2Jhc2U8X0NoYXJULF9BbGxvYz4KLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUEFSVElBTF9TUEVDX1dPUktBUk9VTkQpICYmICFkZWZpbmVkIChiYXNpY19zdHJpbmcpCi0gICAgICAgICAgICAgICAgICAgLCBwdWJsaWMgX19zdGxwb3J0X2NsYXNzPGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4gPgotI2VuZGlmCi17Ci1wcm90ZWN0ZWQ6ICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJvdGVjdGVkIG1lbWJlcnMgaW5oZXJpdGVkIGZyb20gYmFzZS4KLSAgdHlwZWRlZiBfU1RMUF9QUklWIF9TdHJpbmdfYmFzZTxfQ2hhclQsX0FsbG9jPiBfQmFzZTsKLSAgdHlwZWRlZiBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+IF9TZWxmOwotICAvLyBmYnAgOiB1c2VkIHRvIG9wdGltaXplIGNoYXIvd2NoYXJfdCBjYXNlcywgYW5kIHRvIHNpbXBsaWZ5Ci0gIC8vIF9TVExQX0RFRl9DT05TVF9QTENUX05FV19CVUcgcHJvYmxlbSB3b3JrYXJvdW5kCi0gIHR5cGVkZWYgdHlwZW5hbWUgX0lzSW50ZWdyYWw8X0NoYXJUPjo6X1JldCBfQ2hhcl9Jc19JbnRlZ3JhbDsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfSXNQT0Q8X0NoYXJUPjo6X1R5cGUgX0NoYXJfSXNfUE9EOwotICB0eXBlZGVmIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnIHJfYV9pX3Q7Ci0KLXB1YmxpYzoKLSAgdHlwZWRlZiBfQ2hhclQgdmFsdWVfdHlwZTsKLSAgdHlwZWRlZiBfVHJhaXRzIHRyYWl0c190eXBlOwotCi0gIHR5cGVkZWYgdmFsdWVfdHlwZSogcG9pbnRlcjsKLSAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlKiBjb25zdF9wb2ludGVyOwotICB0eXBlZGVmIHZhbHVlX3R5cGUmIHJlZmVyZW5jZTsKLSAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlJiBjb25zdF9yZWZlcmVuY2U7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnNpemVfdHlwZSBzaXplX3R5cGU7Ci0gIHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKLSAgdHlwZWRlZiByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyBfSXRlcmF0b3JfY2F0ZWdvcnk7Ci0KLSAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlKiBjb25zdF9pdGVyYXRvcjsKLSAgdHlwZWRlZiB2YWx1ZV90eXBlKiAgICAgICBpdGVyYXRvcjsKLQotICBfU1RMUF9ERUNMQVJFX1JBTkRPTV9BQ0NFU1NfUkVWRVJTRV9JVEVSQVRPUlM7Ci0KLSNpbmNsdWRlIDxzdGwvX3N0cmluZ19ucG9zLmg+Ci0KLSAgdHlwZWRlZiBfU3RyaW5nX3Jlc2VydmVfdCBfUmVzZXJ2ZV90OwotCi1wdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnN0cnVjdG9yLCBkZXN0cnVjdG9yLCBhc3NpZ25tZW50LgotICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKLQotICBhbGxvY2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9yKCkgY29uc3QKLSAgeyByZXR1cm4gX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoKGNvbnN0IGFsbG9jYXRvcl90eXBlJil0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZSwgX0NoYXJUKTsgfQotCi0jaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCi0gIGV4cGxpY2l0IGJhc2ljX3N0cmluZyhjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKLSNlbHNlCi0gIGJhc2ljX3N0cmluZygpCi0gICAgICA6IF9TVExQX1BSSVYgX1N0cmluZ19iYXNlPF9DaGFyVCxfQWxsb2M+KGFsbG9jYXRvcl90eXBlKCksIF9CYXNlOjpfREVGQVVMVF9TSVpFKQotICB7IF9NX3Rlcm1pbmF0ZV9zdHJpbmcoKTsgfQotICBleHBsaWNpdCBiYXNpY19zdHJpbmcoY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKLSNlbmRpZgotICAgICAgOiBfU1RMUF9QUklWIF9TdHJpbmdfYmFzZTxfQ2hhclQsX0FsbG9jPihfX2EsIF9CYXNlOjpfREVGQVVMVF9TSVpFKQotICB7IF9NX3Rlcm1pbmF0ZV9zdHJpbmcoKTsgfQotCi0jaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCi0gIGJhc2ljX3N0cmluZyhfUmVzZXJ2ZV90LCBzaXplX3QgX19uLAotICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCi0jZWxzZQotICBiYXNpY19zdHJpbmcoX1Jlc2VydmVfdCwgc2l6ZV90IF9fbikKLSAgICA6IF9TVExQX1BSSVYgX1N0cmluZ19iYXNlPF9DaGFyVCxfQWxsb2M+KGFsbG9jYXRvcl90eXBlKCksIF9fbiArIDEpCi0gIHsgX01fdGVybWluYXRlX3N0cmluZygpOyB9Ci0gIGJhc2ljX3N0cmluZyhfUmVzZXJ2ZV90LCBzaXplX3QgX19uLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQotI2VuZGlmCi0gICAgOiBfU1RMUF9QUklWIF9TdHJpbmdfYmFzZTxfQ2hhclQsX0FsbG9jPihfX2EsIF9fbiArIDEpCi0gIHsgX01fdGVybWluYXRlX3N0cmluZygpOyB9Ci0KLSAgYmFzaWNfc3RyaW5nKGNvbnN0IF9TZWxmJik7Ci0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKLSAgYmFzaWNfc3RyaW5nKGNvbnN0IF9TZWxmJiBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbiA9IG5wb3MsCi0gICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKLSNlbHNlCi0gIGJhc2ljX3N0cmluZyhjb25zdCBfU2VsZiYgX19zLCBzaXplX3R5cGUgX19wb3MpCi0gICAgOiBfU1RMUF9QUklWIF9TdHJpbmdfYmFzZTxfQ2hhclQsX0FsbG9jPihhbGxvY2F0b3JfdHlwZSgpKSB7Ci0gICAgaWYgKF9fcG9zID4gX19zLnNpemUoKSkKLSAgICAgIHRoaXMtPl9NX3Rocm93X291dF9vZl9yYW5nZSgpOwotICAgIGVsc2UKLSAgICAgIF9NX3JhbmdlX2luaXRpYWxpemUoX19zLl9NX1N0YXJ0KCkgKyBfX3BvcywgX19zLl9NX0ZpbmlzaCgpKTsKLSAgfQotICBiYXNpY19zdHJpbmcoY29uc3QgX1NlbGYmIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKQotICAgIDogX1NUTFBfUFJJViBfU3RyaW5nX2Jhc2U8X0NoYXJULF9BbGxvYz4oYWxsb2NhdG9yX3R5cGUoKSkgewotICAgIGlmIChfX3BvcyA+IF9fcy5zaXplKCkpCi0gICAgICB0aGlzLT5fTV90aHJvd19vdXRfb2ZfcmFuZ2UoKTsKLSAgICBlbHNlCi0gICAgICBfTV9yYW5nZV9pbml0aWFsaXplKF9fcy5fTV9TdGFydCgpICsgX19wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIF9fcy5fTV9TdGFydCgpICsgX19wb3MgKyAobWluKSAoX19uLCBfX3Muc2l6ZSgpIC0gX19wb3MpKTsKLSAgfQotICBiYXNpY19zdHJpbmcoY29uc3QgX1NlbGYmIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uLAotICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKLSNlbmRpZgotICAgIDogX1NUTFBfUFJJViBfU3RyaW5nX2Jhc2U8X0NoYXJULF9BbGxvYz4oX19hKSB7Ci0gICAgaWYgKF9fcG9zID4gX19zLnNpemUoKSkKLSAgICAgIHRoaXMtPl9NX3Rocm93X291dF9vZl9yYW5nZSgpOwotICAgIGVsc2UKLSAgICAgIF9NX3JhbmdlX2luaXRpYWxpemUoX19zLl9NX1N0YXJ0KCkgKyBfX3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgX19zLl9NX1N0YXJ0KCkgKyBfX3BvcyArIChtaW4pIChfX24sIF9fcy5zaXplKCkgLSBfX3BvcykpOwotICB9Ci0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKLSAgYmFzaWNfc3RyaW5nKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uLAotICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCi0jZWxzZQotICBiYXNpY19zdHJpbmcoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX24pCi0gICAgOiBfU1RMUF9QUklWIF9TdHJpbmdfYmFzZTxfQ2hhclQsX0FsbG9jPihhbGxvY2F0b3JfdHlwZSgpKSB7Ci0gICAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKQotICAgICAgX01fcmFuZ2VfaW5pdGlhbGl6ZShfX3MsIF9fcyArIF9fbik7Ci0gICAgfQotICBiYXNpY19zdHJpbmcoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX24sIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCi0jZW5kaWYKLSAgICA6IF9TVExQX1BSSVYgX1N0cmluZ19iYXNlPF9DaGFyVCxfQWxsb2M+KF9fYSkgewotICAgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKLSAgICAgIF9NX3JhbmdlX2luaXRpYWxpemUoX19zLCBfX3MgKyBfX24pOwotICAgIH0KLQotI2lmICFkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQotICBiYXNpY19zdHJpbmcoY29uc3QgX0NoYXJUKiBfX3MsCi0gICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSk7Ci0jZWxzZQotICBiYXNpY19zdHJpbmcoY29uc3QgX0NoYXJUKiBfX3MpOwotICBiYXNpY19zdHJpbmcoY29uc3QgX0NoYXJUKiBfX3MsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpOwotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKLSAgYmFzaWNfc3RyaW5nKHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MsCi0gICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKLSNlbHNlCi0gIGJhc2ljX3N0cmluZyhzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jKQotICAgIDogX1NUTFBfUFJJViBfU3RyaW5nX2Jhc2U8X0NoYXJULF9BbGxvYz4oYWxsb2NhdG9yX3R5cGUoKSwgX19uICsgMSkgewotIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1NIT1JUX1NUUklOR19PUFRJTSkKLSAgICBpZiAodGhpcy0+X01fdXNpbmdfc3RhdGljX2J1ZigpKSB7Ci0gICAgICBfVHJhaXRzOjphc3NpZ24odGhpcy0+X01fU3RhcnQoKSwgX19uLCBfX2MpOwotICAgICAgdGhpcy0+X01fZmluaXNoID0gdGhpcy0+X01fU3RhcnQoKSArIF9fbjsKLSAgICB9Ci0gICAgZWxzZQotIyAgZW5kaWYKLSAgICB0aGlzLT5fTV9maW5pc2ggPSBfU1RMUF9QUklWIF9fdW5pbml0aWFsaXplZF9maWxsX24odGhpcy0+X01fU3RhcnQoKSwgX19uLCBfX2MpOwotICAgIF9NX3Rlcm1pbmF0ZV9zdHJpbmcoKTsKLSAgfQotICBiYXNpY19zdHJpbmcoc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYywgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKLSNlbmRpZgotICAgIDogX1NUTFBfUFJJViBfU3RyaW5nX2Jhc2U8X0NoYXJULF9BbGxvYz4oX19hLCBfX24gKyAxKSB7Ci0jaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1NIT1JUX1NUUklOR19PUFRJTSkKLSAgICBpZiAodGhpcy0+X01fdXNpbmdfc3RhdGljX2J1ZigpKSB7Ci0gICAgICBfVHJhaXRzOjphc3NpZ24odGhpcy0+X01fU3RhcnQoKSwgX19uLCBfX2MpOwotICAgICAgdGhpcy0+X01fZmluaXNoID0gdGhpcy0+X01fU3RhcnQoKSArIF9fbjsKLSAgICB9Ci0gICAgZWxzZQotI2VuZGlmCi0gICAgdGhpcy0+X01fZmluaXNoID0gX1NUTFBfUFJJViBfX3VuaW5pdGlhbGl6ZWRfZmlsbF9uKHRoaXMtPl9NX1N0YXJ0KCksIF9fbiwgX19jKTsKLSAgICBfTV90ZXJtaW5hdGVfc3RyaW5nKCk7Ci0gIH0KLQotICBiYXNpY19zdHJpbmcoX19tb3ZlX3NvdXJjZTxfU2VsZj4gc3JjKQotICAgIDogX1NUTFBfUFJJViBfU3RyaW5nX2Jhc2U8X0NoYXJULF9BbGxvYz4oX19tb3ZlX3NvdXJjZTxfQmFzZT4oc3JjLmdldCgpKSkge30KLQotICAvLyBDaGVjayB0byBzZWUgaWYgX0lucHV0SXRlcmF0b3IgaXMgYW4gaW50ZWdlciB0eXBlLiAgSWYgc28sIHRoZW4KLSAgLy8gaXQgY2FuJ3QgYmUgYW4gaXRlcmF0b3IuCi0jaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykgJiYgIShkZWZpbmVkIChfX01SQ19fKSB8fCAoZGVmaW5lZChfX1NDX18pICYmICFkZWZpbmVkKF9fRE1DX18pKSkgLy8qdHkgMDQvMzAvMjAwMSAtIG1wdyBjb21waWxlcnMgY2hva2Ugb24gdGhpcyBjdG9yCi0jICBpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX01TVkM2X01FTV9UX0JVR19XT1JLQVJPVU5EKQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Ci0gIGJhc2ljX3N0cmluZyhfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwKLSAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlICYgX19hIF9TVExQX0FMTE9DQVRPUl9UWVBFX0RGTCkKLSAgICA6IF9TVExQX1BSSVYgX1N0cmluZ19iYXNlPF9DaGFyVCxfQWxsb2M+KF9fYSkgewotICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lzSW50ZWdyYWw8X0lucHV0SXRlcmF0b3I+OjpfUmV0IF9JbnRlZ3JhbDsKLSAgICBfTV9pbml0aWFsaXplX2Rpc3BhdGNoKF9fZiwgX19sLCBfSW50ZWdyYWwoKSk7Ci0gIH0KLSMgICAgaWYgZGVmaW5lZCAoX1NUTFBfTkVFRFNfRVhUUkFfVEVNUExBVEVfQ09OU1RSVUNUT1JTKQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Ci0gIGJhc2ljX3N0cmluZyhfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCkKLSAgICA6IF9TVExQX1BSSVYgX1N0cmluZ19iYXNlPF9DaGFyVCxfQWxsb2M+KGFsbG9jYXRvcl90eXBlKCkpIHsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0ludGVncmFsPF9JbnB1dEl0ZXJhdG9yPjo6X1JldCBfSW50ZWdyYWw7Ci0gICAgX01faW5pdGlhbGl6ZV9kaXNwYXRjaChfX2YsIF9fbCwgX0ludGVncmFsKCkpOwotICB9Ci0jICAgIGVuZGlmCi0jICBlbHNlCi0gIC8qIFdlIG5lZWQgYW4gYWRkaXRpb25uYWwgY29uc3RydWN0b3IgdG8gYnVpbGQgYW4gZW1wdHkgc3RyaW5nIHdpdGhvdXQKLSAgICogYW55IGFsbG9jYXRpb24gb3IgdGVybWluYXRpb24gY2hhciovCi1wcm90ZWN0ZWQ6Ci0gIHN0cnVjdCBfQ2FsbGVkRnJvbVdvcmthcm91bmRfdCB7fTsKLSAgYmFzaWNfc3RyaW5nKF9DYWxsZWRGcm9tV29ya2Fyb3VuZF90LCBjb25zdCBhbGxvY2F0b3JfdHlwZSAmX19hKQotICAgIDogX1N0cmluZ19iYXNlPF9DaGFyVCxfQWxsb2M+KF9fYSkge30KLXB1YmxpYzoKLSMgIGVuZGlmIC8qIF9TVExQX1VTRV9NU1ZDNl9NRU1fVF9CVUdfV09SS0FST1VORCAqLwotI2VuZGlmIC8qICFfX01SQ19fIHx8IChfX1NDX18gJiYgIV9fRE1DX18pICovCi0KLSNpZiAhKGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpICYmICEoZGVmaW5lZCAoX19NUkNfXykgfHwgKGRlZmluZWQgKF9fU0NfXykgJiYgIWRlZmluZWQgKF9fRE1DX18pKSkpIHx8IFwKLSAgICAhZGVmaW5lZCAoX1NUTFBfTk9fTUVUSE9EX1NQRUNJQUxJWkFUSU9OKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykgfHwgXAotICAgICBkZWZpbmVkIChfU1RMUF9VU0VfTVNWQzZfTUVNX1RfQlVHX1dPUktBUk9VTkQpCi0gIGJhc2ljX3N0cmluZyhjb25zdCBfQ2hhclQqIF9fZiwgY29uc3QgX0NoYXJUKiBfX2wsCi0gICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hIF9TVExQX0FMTE9DQVRPUl9UWVBFX0RGTCkKLSAgICA6IF9TVExQX1BSSVYgX1N0cmluZ19iYXNlPF9DaGFyVCxfQWxsb2M+KF9fYSkgewotICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2YpICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19sKQotICAgIF9NX3JhbmdlX2luaXRpYWxpemUoX19mLCBfX2wpOwotICB9Ci0jICBpZiBkZWZpbmVkIChfU1RMUF9ORUVEU19FWFRSQV9URU1QTEFURV9DT05TVFJVQ1RPUlMpCi0gIGJhc2ljX3N0cmluZyhjb25zdCBfQ2hhclQqIF9fZiwgY29uc3QgX0NoYXJUKiBfX2wpCi0gICAgOiBfU1RMUF9QUklWIF9TdHJpbmdfYmFzZTxfQ2hhclQsX0FsbG9jPihhbGxvY2F0b3JfdHlwZSgpKSB7Ci0gICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fZikgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2wpCi0gICAgX01fcmFuZ2VfaW5pdGlhbGl6ZShfX2YsIF9fbCk7Ci0gIH0KLSMgIGVuZGlmCi0jZW5kaWYgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLwotCi1wcml2YXRlOgotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcj4KLSAgdm9pZCBfTV9yYW5nZV9pbml0aWFsaXplKF9JbnB1dEl0ZXIgX19mLCBfSW5wdXRJdGVyIF9fbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0X2l0ZXJhdG9yX3RhZyAmX190YWcpIHsKLSAgICB0aGlzLT5fTV9hbGxvY2F0ZV9ibG9jaygpOwotICAgIF9NX2NvbnN0cnVjdF9udWxsKHRoaXMtPl9NX0ZpbmlzaCgpKTsKLSAgICBfU1RMUF9UUlkgewotICAgICAgX01fYXBwZW5kVChfX2YsIF9fbCwgX190YWcpOwotICAgIH0KLSAgICBfU1RMUF9VTldJTkQodGhpcy0+X01fZGVzdHJveV9yYW5nZSgpKQotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcj4KLSAgdm9pZCBfTV9yYW5nZV9pbml0aWFsaXplKF9Gb3J3YXJkSXRlciBfX2YsIF9Gb3J3YXJkSXRlciBfX2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3J3YXJkX2l0ZXJhdG9yX3RhZyAmKSB7Ci0gICAgZGlmZmVyZW5jZV90eXBlIF9fbiA9IGRpc3RhbmNlKF9fZiwgX19sKTsKLSAgICB0aGlzLT5fTV9hbGxvY2F0ZV9ibG9jayhfX24gKyAxKTsKLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNKQotICAgIGlmICh0aGlzLT5fTV91c2luZ19zdGF0aWNfYnVmKCkpIHsKLSAgICAgIF9NX2NvcHlUKF9fZiwgX19sLCB0aGlzLT5fTV9TdGFydCgpKTsKLSAgICAgIHRoaXMtPl9NX2ZpbmlzaCA9IHRoaXMtPl9NX1N0YXJ0KCkgKyBfX247Ci0gICAgfQotICAgIGVsc2UKLSNlbmRpZiAvKiBfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNICovCi0gICAgdGhpcy0+X01fZmluaXNoID0gdW5pbml0aWFsaXplZF9jb3B5KF9fZiwgX19sLCB0aGlzLT5fTV9TdGFydCgpKTsKLSAgICB0aGlzLT5fTV90ZXJtaW5hdGVfc3RyaW5nKCk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcj4KLSAgdm9pZCBfTV9yYW5nZV9pbml0aWFsaXplVChfSW5wdXRJdGVyIF9fZiwgX0lucHV0SXRlciBfX2wpIHsKLSAgICBfTV9yYW5nZV9pbml0aWFsaXplKF9fZiwgX19sLCBfU1RMUF9JVEVSQVRPUl9DQVRFR09SWShfX2YsIF9JbnB1dEl0ZXIpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW50ZWdlcj4KLSAgdm9pZCBfTV9pbml0aWFsaXplX2Rpc3BhdGNoKF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX194LCBjb25zdCBfX3RydWVfdHlwZSYgLypfSW50ZWdyYWwqLykgewotICAgIHRoaXMtPl9NX2FsbG9jYXRlX2Jsb2NrKF9fbiArIDEpOwotI2lmIGRlZmluZWQgKF9TVExQX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0pCi0gICAgaWYgKHRoaXMtPl9NX3VzaW5nX3N0YXRpY19idWYoKSkgewotICAgICAgX1RyYWl0czo6YXNzaWduKHRoaXMtPl9NX1N0YXJ0KCksIF9fbiwgX194KTsKLSAgICAgIHRoaXMtPl9NX2ZpbmlzaCA9IHRoaXMtPl9NX1N0YXJ0KCkgKyBfX247Ci0gICAgfQotICAgIGVsc2UKLSNlbmRpZiAvKiBfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNICovCi0gICAgdGhpcy0+X01fZmluaXNoID0gX1NUTFBfUFJJViBfX3VuaW5pdGlhbGl6ZWRfZmlsbF9uKHRoaXMtPl9NX1N0YXJ0KCksIF9fbiwgX194KTsKLSAgICB0aGlzLT5fTV90ZXJtaW5hdGVfc3RyaW5nKCk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcj4KLSAgdm9pZCBfTV9pbml0aWFsaXplX2Rpc3BhdGNoKF9JbnB1dEl0ZXIgX19mLCBfSW5wdXRJdGVyIF9fbCwgY29uc3QgX19mYWxzZV90eXBlJiAvKl9JbnRlZ3JhbCovKSB7Ci0gICAgX01fcmFuZ2VfaW5pdGlhbGl6ZVQoX19mLCBfX2wpOwotICB9Ci0KLXB1YmxpYzoKLSAgfmJhc2ljX3N0cmluZygpCi0gIHsgdGhpcy0+X01fZGVzdHJveV9yYW5nZSgpOyB9Ci0KLSAgX1NlbGYmIG9wZXJhdG9yPShjb25zdCBfU2VsZiYgX19zKSB7Ci0gICAgaWYgKCZfX3MgIT0gdGhpcykKLSAgICAgIF9NX2Fzc2lnbihfX3MuX01fU3RhcnQoKSwgX19zLl9NX0ZpbmlzaCgpKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBfU2VsZiYgb3BlcmF0b3I9KGNvbnN0IF9DaGFyVCogX19zKSB7Ci0gICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKLSAgICByZXR1cm4gX01fYXNzaWduKF9fcywgX19zICsgdHJhaXRzX3R5cGU6Omxlbmd0aChfX3MpKTsKLSAgfQotCi0gIF9TZWxmJiBvcGVyYXRvcj0oX0NoYXJUIF9fYykKLSAgeyByZXR1cm4gYXNzaWduKF9fU1RBVElDX0NBU1Qoc2l6ZV90eXBlLDEpLCBfX2MpOyB9Ci0KLXByb3RlY3RlZDoKLQotICBzdGF0aWMgX0NoYXJUIF9TVExQX0NBTEwgX01fbnVsbCgpCi0gIHsgcmV0dXJuIF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQoX0NoYXJUKTsgfQotCi1wcm90ZWN0ZWQ6ICAgICAgICAgICAgICAgICAgICAgLy8gSGVscGVyIGZ1bmN0aW9ucyB1c2VkIGJ5IGNvbnN0cnVjdG9ycwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBlbHNld2hlcmUuCi0gIC8vIGZicCA6IHNpbXBsaWZ5IGludGVnZXIgdHlwZXMgKGNoYXIsIHdjaGFyKQotICB2b2lkIF9NX2NvbnN0cnVjdF9udWxsX2F1eChfQ2hhclQqIF9fcCwgY29uc3QgX19mYWxzZV90eXBlJiAvKl9Jc19JbnRlZ3JhbCovKSBjb25zdCB7Ci0jaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1NIT1JUX1NUUklOR19PUFRJTSkKLSAgICBpZiAodGhpcy0+X01fdXNpbmdfc3RhdGljX2J1ZigpKQotICAgICAgX1RyYWl0czo6YXNzaWduKCpfX3AsIF9NX251bGwoKSk7Ci0gICAgZWxzZQotI2VuZGlmIC8qX1NUTFBfVVNFX1NIT1JUX1NUUklOR19PUFRJTSovCi0gICAgX1NUTFBfU1REOjpfQ29uc3RydWN0KF9fcCk7Ci0gIH0KLSAgdm9pZCBfTV9jb25zdHJ1Y3RfbnVsbF9hdXgoX0NoYXJUKiBfX3AsIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKl9Jc19JbnRlZ3JhbCovKSBjb25zdAotICB7ICpfX3AgPSAwOyB9Ci0KLSAgdm9pZCBfTV9mb3JjZV9jb25zdHJ1Y3RfbnVsbChfQ2hhclQqLCBjb25zdCBfX3RydWVfdHlwZSYgLyogX0lzX1BPRCAqLykgY29uc3QKLSAgeyAvKk5vdGhpbmcgdG8gZG8qLyB9Ci0gIHZvaWQgX01fZm9yY2VfY29uc3RydWN0X251bGwoX0NoYXJUKiBfX3AsIGNvbnN0IF9fZmFsc2VfdHlwZSYgLyogX0lzX1BPRCAqLykgY29uc3QKLSAgeyBfTV9jb25zdHJ1Y3RfbnVsbF9hdXgoX19wLCBfQ2hhcl9Jc19JbnRlZ3JhbCgpKTsgfQotCi0gIHZvaWQgX01fY29uc3RydWN0X251bGwoX0NoYXJUKiBfX3ApIGNvbnN0IHsKLSAgICB0eXBlZGVmIF9fZmFsc2VfdHlwZSBfQW5zd2VyOwotCi0gICAgX01fZm9yY2VfY29uc3RydWN0X251bGwoX19wLCBfQW5zd2VyKCkpOwotICB9Ci0KLXByb3RlY3RlZDoKLSAgLy8gSGVscGVyIGZ1bmN0aW9ucyB1c2VkIGJ5IGNvbnN0cnVjdG9ycy4gIEl0IGlzIGEgc2V2ZXJlIGVycm9yIGZvcgotICAvLyBhbnkgb2YgdGhlbSB0byBiZSBjYWxsZWQgYW55d2hlcmUgZXhjZXB0IGZyb20gd2l0aGluIGNvbnN0cnVjdG9ycy4KLSAgdm9pZCBfTV90ZXJtaW5hdGVfc3RyaW5nX2F1eChjb25zdCBfX2ZhbHNlX3R5cGUmIF9faXNfaW50ZWdyYWwpIHsKLSAgICBfU1RMUF9UUlkgewotICAgICAgX01fY29uc3RydWN0X251bGxfYXV4KHRoaXMtPl9NX0ZpbmlzaCgpLCBfX2lzX2ludGVncmFsKTsKLSAgICB9Ci0gICAgX1NUTFBfVU5XSU5EKHRoaXMtPl9NX2Rlc3Ryb3lfcmFuZ2UoMCwwKSkKLSAgfQotCi0gIHZvaWQgX01fdGVybWluYXRlX3N0cmluZ19hdXgoY29uc3QgX190cnVlX3R5cGUmIF9faXNfaW50ZWdyYWwpCi0gIHsgX01fY29uc3RydWN0X251bGxfYXV4KHRoaXMtPl9NX0ZpbmlzaCgpLCBfX2lzX2ludGVncmFsKTsgfQotCi0gIHZvaWQgX01fZm9yY2VfdGVybWluYXRlX3N0cmluZyhjb25zdCBfX3RydWVfdHlwZSYgLyogX0lzX1BPRCAqLykKLSAgeyAvKk5vdGhpbmcgdG8gZG8qLyB9Ci0gIHZvaWQgX01fZm9yY2VfdGVybWluYXRlX3N0cmluZyhjb25zdCBfX2ZhbHNlX3R5cGUmIC8qIF9Jc19QT0QgKi8pCi0gIHsgX01fdGVybWluYXRlX3N0cmluZ19hdXgoX0NoYXJfSXNfSW50ZWdyYWwoKSk7IH0KLQotICB2b2lkIF9NX3Rlcm1pbmF0ZV9zdHJpbmcoKSB7Ci0gICAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgX0Fuc3dlcjsKLQotICAgIF9NX2ZvcmNlX3Rlcm1pbmF0ZV9zdHJpbmcoX0Fuc3dlcigpKTsKLSAgfQotCi0gIGJvb2wgX01faW5zaWRlKGNvbnN0IF9DaGFyVCogX19zKSBjb25zdCB7Ci0gICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKLSAgICByZXR1cm4gKF9fcyA+PSB0aGlzLT5fTV9TdGFydCgpKSAmJiAoX19zIDwgdGhpcy0+X01fRmluaXNoKCkpOwotICB9Ci0KLSAgdm9pZCBfTV9yYW5nZV9pbml0aWFsaXplKGNvbnN0IF9DaGFyVCogX19mLCBjb25zdCBfQ2hhclQqIF9fbCkgewotICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2YpIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2wpCi0gICAgcHRyZGlmZl90IF9fbiA9IF9fbCAtIF9fZjsKLSAgICB0aGlzLT5fTV9hbGxvY2F0ZV9ibG9jayhfX24gKyAxKTsKLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNKQotICAgIGlmICh0aGlzLT5fTV91c2luZ19zdGF0aWNfYnVmKCkpIHsKLSAgICAgIF9NX2NvcHkoX19mLCBfX2wsIHRoaXMtPl9NX1N0YXJ0KCkpOwotICAgICAgdGhpcy0+X01fZmluaXNoID0gdGhpcy0+X01fU3RhcnQoKSArIF9fbjsKLSAgICB9Ci0gICAgZWxzZQotI2VuZGlmIC8qIF9TVExQX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0gKi8KLSAgICB0aGlzLT5fTV9maW5pc2ggPSB1bmluaXRpYWxpemVkX2NvcHkoX19mLCBfX2wsIHRoaXMtPl9NX1N0YXJ0KCkpOwotICAgIF9NX3Rlcm1pbmF0ZV9zdHJpbmcoKTsKLSAgfQotCi1wdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEl0ZXJhdG9ycy4KLSAgaXRlcmF0b3IgYmVnaW4oKSAgICAgICAgICAgICB7IHJldHVybiB0aGlzLT5fTV9TdGFydCgpOyB9Ci0gIGl0ZXJhdG9yIGVuZCgpICAgICAgICAgICAgICAgeyByZXR1cm4gdGhpcy0+X01fRmluaXNoKCk7IH0KLSAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiB0aGlzLT5fTV9TdGFydCgpOyB9Ci0gIGNvbnN0X2l0ZXJhdG9yIGVuZCgpICAgY29uc3QgeyByZXR1cm4gdGhpcy0+X01fRmluaXNoKCk7IH0KLQotICByZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpCi0gICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcih0aGlzLT5fTV9GaW5pc2goKSk7IH0KLSAgcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkKLSAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKHRoaXMtPl9NX1N0YXJ0KCkpOyB9Ci0gIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3QKLSAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKHRoaXMtPl9NX0ZpbmlzaCgpKTsgfQotICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSAgIGNvbnN0Ci0gICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcih0aGlzLT5fTV9TdGFydCgpKTsgfQotCi1wdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpemUsIGNhcGFjaXR5LCBldGMuCi0gIHNpemVfdHlwZSBzaXplKCkgY29uc3QgeyByZXR1cm4gdGhpcy0+X01fRmluaXNoKCkgLSB0aGlzLT5fTV9TdGFydCgpOyB9Ci0gIHNpemVfdHlwZSBsZW5ndGgoKSBjb25zdCB7IHJldHVybiBzaXplKCk7IH0KLSAgc2l6ZV90IG1heF9zaXplKCkgY29uc3QgeyByZXR1cm4gX0Jhc2U6Om1heF9zaXplKCk7IH0KLQotICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jKSB7Ci0gICAgaWYgKF9fbiA8PSBzaXplKCkpCi0gICAgICBlcmFzZShiZWdpbigpICsgX19uLCBlbmQoKSk7Ci0gICAgZWxzZQotICAgICAgYXBwZW5kKF9fbiAtIHNpemUoKSwgX19jKTsKLSAgfQotCi0gIHZvaWQgcmVzaXplKHNpemVfdHlwZSBfX24pIHsgcmVzaXplKF9fbiwgX01fbnVsbCgpKTsgfQotCi0gIHZvaWQgcmVzZXJ2ZShzaXplX3R5cGUgPSAwKTsKLQotICBzaXplX3R5cGUgY2FwYWNpdHkoKSBjb25zdAotICB7IHJldHVybiAodGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuX01fZGF0YSAtIHRoaXMtPl9NX1N0YXJ0KCkpIC0gMTsgfQotCi0gIHZvaWQgY2xlYXIoKSB7Ci0gICAgaWYgKCFlbXB0eSgpKSB7Ci0gICAgICBfVHJhaXRzOjphc3NpZ24oKih0aGlzLT5fTV9TdGFydCgpKSwgX01fbnVsbCgpKTsKLSAgICAgIHRoaXMtPl9NX2Rlc3Ryb3lfcmFuZ2UoMSk7Ci0gICAgICB0aGlzLT5fTV9maW5pc2ggPSB0aGlzLT5fTV9TdGFydCgpOwotICAgIH0KLSAgfQotCi0gIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiB0aGlzLT5fTV9TdGFydCgpID09IHRoaXMtPl9NX0ZpbmlzaCgpOyB9Ci0KLXB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gRWxlbWVudCBhY2Nlc3MuCi0KLSAgY29uc3RfcmVmZXJlbmNlIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fbikgY29uc3QKLSAgeyByZXR1cm4gKih0aGlzLT5fTV9TdGFydCgpICsgX19uKTsgfQotICByZWZlcmVuY2Ugb3BlcmF0b3JbXShzaXplX3R5cGUgX19uKQotICB7IHJldHVybiAqKHRoaXMtPl9NX1N0YXJ0KCkgKyBfX24pOyB9Ci0KLSAgY29uc3RfcmVmZXJlbmNlIGF0KHNpemVfdHlwZSBfX24pIGNvbnN0IHsKLSAgICBpZiAoX19uID49IHNpemUoKSkKLSAgICAgIHRoaXMtPl9NX3Rocm93X291dF9vZl9yYW5nZSgpOwotICAgIHJldHVybiAqKHRoaXMtPl9NX1N0YXJ0KCkgKyBfX24pOwotICB9Ci0KLSAgcmVmZXJlbmNlIGF0KHNpemVfdHlwZSBfX24pIHsKLSAgICBpZiAoX19uID49IHNpemUoKSkKLSAgICAgIHRoaXMtPl9NX3Rocm93X291dF9vZl9yYW5nZSgpOwotICAgIHJldHVybiAqKHRoaXMtPl9NX1N0YXJ0KCkgKyBfX24pOwotICB9Ci0KLXB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXBwZW5kLCBvcGVyYXRvcis9LCBwdXNoX2JhY2suCi0KLSAgX1NlbGYmIG9wZXJhdG9yKz0oY29uc3QgX1NlbGYmIF9fcykgeyByZXR1cm4gYXBwZW5kKF9fcyk7IH0KLSAgX1NlbGYmIG9wZXJhdG9yKz0oY29uc3QgX0NoYXJUKiBfX3MpIHsgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykgcmV0dXJuIGFwcGVuZChfX3MpOyB9Ci0gIF9TZWxmJiBvcGVyYXRvcis9KF9DaGFyVCBfX2MpIHsgcHVzaF9iYWNrKF9fYyk7IHJldHVybiAqdGhpczsgfQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKLSMgIGlmICFkZWZpbmVkIChfU1RMUF9VU0VfTVNWQzZfTUVNX1RfQlVHX1dPUktBUk9VTkQpCi1wcml2YXRlOiAvLyBIZWxwZXIgZnVuY3Rpb25zIGZvciBhcHBlbmQuCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgotICBfU2VsZiYgX01fYXBwZW5kVChfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnB1dF9pdGVyYXRvcl90YWcgJikgewotICAgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3QgOyArK19fZmlyc3QpCi0gICAgICBwdXNoX2JhY2soKl9fZmlyc3QpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXI+Ci0gIF9TZWxmJiBfTV9hcHBlbmRUKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3J3YXJkX2l0ZXJhdG9yX3RhZyAmKSB7Ci0gICAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KSB7Ci0gICAgICBjb25zdCBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IHRoaXMtPnNpemUoKTsKLSAgICAgIGRpZmZlcmVuY2VfdHlwZSBfX24gPSBkaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QpOwotICAgICAgaWYgKF9fU1RBVElDX0NBU1Qoc2l6ZV90eXBlLF9fbikgPiB0aGlzLT5tYXhfc2l6ZSgpIHx8IF9fb2xkX3NpemUgPiB0aGlzLT5tYXhfc2l6ZSgpIC0gX19TVEFUSUNfQ0FTVChzaXplX3R5cGUsX19uKSkKLSAgICAgICAgdGhpcy0+X01fdGhyb3dfbGVuZ3RoX2Vycm9yKCk7Ci0gICAgICBpZiAoX19vbGRfc2l6ZSArIF9fbiA+IHRoaXMtPmNhcGFjaXR5KCkpIHsKLSAgICAgICAgc2l6ZV90eXBlIF9fbGVuID0gX19vbGRfc2l6ZSArIChtYXgpKF9fb2xkX3NpemUsIF9fU1RBVElDX0NBU1Qoc2l6ZV90eXBlLF9fbikpICsgMTsKLSAgICAgICAgcG9pbnRlciBfX25ld19zdGFydCA9IHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLmFsbG9jYXRlKF9fbGVuLCBfX2xlbik7Ci0gICAgICAgIHBvaW50ZXIgX19uZXdfZmluaXNoID0gX19uZXdfc3RhcnQ7Ci0gICAgICAgIF9TVExQX1RSWSB7Ci0gICAgICAgICAgX19uZXdfZmluaXNoID0gdW5pbml0aWFsaXplZF9jb3B5KHRoaXMtPl9NX1N0YXJ0KCksIHRoaXMtPl9NX0ZpbmlzaCgpLCBfX25ld19zdGFydCk7Ci0gICAgICAgICAgX19uZXdfZmluaXNoID0gdW5pbml0aWFsaXplZF9jb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19uZXdfZmluaXNoKTsKLSAgICAgICAgICBfTV9jb25zdHJ1Y3RfbnVsbChfX25ld19maW5pc2gpOwotICAgICAgICB9Ci0gICAgICAgIF9TVExQX1VOV0lORCgoX1NUTFBfU1REOjpfRGVzdHJveV9SYW5nZShfX25ld19zdGFydCxfX25ld19maW5pc2gpLAotICAgICAgICAgIHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLmRlYWxsb2NhdGUoX19uZXdfc3RhcnQsIF9fbGVuKSkpCi0gICAgICAgICAgdGhpcy0+X01fZGVzdHJveV9yYW5nZSgpOwotICAgICAgICB0aGlzLT5fTV9kZWFsbG9jYXRlX2Jsb2NrKCk7Ci0gICAgICAgIHRoaXMtPl9NX3Jlc2V0KF9fbmV3X3N0YXJ0LCBfX25ld19maW5pc2gsIF9fbmV3X3N0YXJ0ICsgX19sZW4pOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIF9Gb3J3YXJkSXRlciBfX2YxID0gX19maXJzdDsKLSAgICAgICAgKytfX2YxOwotI2lmIGRlZmluZWQgKF9TVExQX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0pCi0gICAgICAgIGlmICh0aGlzLT5fTV91c2luZ19zdGF0aWNfYnVmKCkpCi0gICAgICAgICAgX01fY29weVQoX19mMSwgX19sYXN0LCB0aGlzLT5fTV9GaW5pc2goKSArIDEpOwotICAgICAgICBlbHNlCi0jZW5kaWYgLyogX1NUTFBfVVNFX1NIT1JUX1NUUklOR19PUFRJTSAqLwotICAgICAgICAgIHVuaW5pdGlhbGl6ZWRfY29weShfX2YxLCBfX2xhc3QsIHRoaXMtPl9NX0ZpbmlzaCgpICsgMSk7Ci0gICAgICAgIF9TVExQX1RSWSB7Ci0gICAgICAgICAgX01fY29uc3RydWN0X251bGwodGhpcy0+X01fRmluaXNoKCkgKyBfX24pOwotICAgICAgICB9Ci0gICAgICAgIF9TVExQX1VOV0lORCh0aGlzLT5fTV9kZXN0cm95X3B0cl9yYW5nZSh0aGlzLT5fTV9GaW5pc2goKSArIDEsIHRoaXMtPl9NX0ZpbmlzaCgpICsgX19uKSkKLSAgICAgICAgX1RyYWl0czo6YXNzaWduKCp0aGlzLT5fTV9maW5pc2gsICpfX2ZpcnN0KTsKLSAgICAgICAgdGhpcy0+X01fZmluaXNoICs9IF9fbjsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2VyPgotICBfU2VsZiYgX01fYXBwZW5kX2Rpc3BhdGNoKF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX194LCBjb25zdCBfX3RydWVfdHlwZSYgLypJbnRlZ3JhbCovKQotICB7IHJldHVybiBhcHBlbmQoKHNpemVfdHlwZSkgX19uLCAoX0NoYXJUKSBfX3gpOyB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXI+Ci0gIF9TZWxmJiBfTV9hcHBlbmRfZGlzcGF0Y2goX0lucHV0SXRlciBfX2YsIF9JbnB1dEl0ZXIgX19sLCBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qSW50ZWdyYWwqLykKLSAgeyByZXR1cm4gX01fYXBwZW5kVChfX2YsIF9fbCwgX1NUTFBfSVRFUkFUT1JfQ0FURUdPUlkoX19mLCBfSW5wdXRJdGVyKSk7IH0KLQotcHVibGljOgotICAvLyBDaGVjayB0byBzZWUgaWYgX0lucHV0SXRlcmF0b3IgaXMgYW4gaW50ZWdlciB0eXBlLiAgSWYgc28sIHRoZW4KLSAgLy8gaXQgY2FuJ3QgYmUgYW4gaXRlcmF0b3IuCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgotICBfU2VsZiYgYXBwZW5kKF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QpIHsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0ludGVncmFsPF9JbnB1dEl0ZXI+OjpfUmV0IF9JbnRlZ3JhbDsKLSAgICByZXR1cm4gX01fYXBwZW5kX2Rpc3BhdGNoKF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOwotICB9Ci0jICBlbmRpZgotI2VuZGlmCi0KLXByb3RlY3RlZDoKLSAgX1NlbGYmIF9NX2FwcGVuZChjb25zdCBfQ2hhclQqIF9fZmlyc3QsIGNvbnN0IF9DaGFyVCogX19sYXN0KTsKLQotcHVibGljOgotI2lmICFkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKSB8fCBcCi0gICAgIWRlZmluZWQgKF9TVExQX05PX01FVEhPRF9TUEVDSUFMSVpBVElPTikgJiYgIWRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpCi0jICBpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX01TVkM2X01FTV9UX0JVR19XT1JLQVJPVU5EKQotICBfU2VsZiYgYXBwZW5kKGNvbnN0IF9DaGFyVCogX19maXJzdCwgY29uc3QgX0NoYXJUKiBfX2xhc3QpIHsKLSAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19maXJzdClfU1RMUF9GSVhfTElURVJBTF9CVUcoX19sYXN0KQotICAgIHJldHVybiBfTV9hcHBlbmQoX19maXJzdCwgX19sYXN0KTsKLSAgfQotIyAgZW5kaWYKLSNlbmRpZgotCi0gIF9TZWxmJiBhcHBlbmQoY29uc3QgX1NlbGYmIF9fcykKLSAgeyByZXR1cm4gX01fYXBwZW5kKF9fcy5fTV9TdGFydCgpLCBfX3MuX01fRmluaXNoKCkpOyB9Ci0KLSAgX1NlbGYmIGFwcGVuZChjb25zdCBfU2VsZiYgX19zLAotICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgewotICAgIGlmIChfX3BvcyA+IF9fcy5zaXplKCkpCi0gICAgICB0aGlzLT5fTV90aHJvd19vdXRfb2ZfcmFuZ2UoKTsKLSAgICByZXR1cm4gX01fYXBwZW5kKF9fcy5fTV9TdGFydCgpICsgX19wb3MsCi0gICAgICAgICAgICAgICAgICAgICBfX3MuX01fU3RhcnQoKSArIF9fcG9zICsgKG1pbikgKF9fbiwgX19zLnNpemUoKSAtIF9fcG9zKSk7Ci0gIH0KLQotICBfU2VsZiYgYXBwZW5kKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uKQotICB7IF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpIHJldHVybiBfTV9hcHBlbmQoX19zLCBfX3MrX19uKTsgfQotICBfU2VsZiYgYXBwZW5kKGNvbnN0IF9DaGFyVCogX19zKQotICB7IF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpIHJldHVybiBfTV9hcHBlbmQoX19zLCBfX3MgKyB0cmFpdHNfdHlwZTo6bGVuZ3RoKF9fcykpOyB9Ci0gIF9TZWxmJiBhcHBlbmQoc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYyk7Ci0KLXB1YmxpYzoKLSAgdm9pZCBwdXNoX2JhY2soX0NoYXJUIF9fYykgewotICAgIGlmICh0aGlzLT5fTV9GaW5pc2goKSArIDEgPT0gdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuX01fZGF0YSkKLSAgICAgIHJlc2VydmUoc2l6ZSgpICsgKG1heCkoc2l6ZSgpLCBfX1NUQVRJQ19DQVNUKHNpemVfdHlwZSwxKSkpOwotICAgIF9NX2NvbnN0cnVjdF9udWxsKHRoaXMtPl9NX0ZpbmlzaCgpICsgMSk7Ci0gICAgX1RyYWl0czo6YXNzaWduKCoodGhpcy0+X01fRmluaXNoKCkpLCBfX2MpOwotICAgICsrdGhpcy0+X01fZmluaXNoOwotICB9Ci0KLSAgdm9pZCBwb3BfYmFjaygpIHsKLSAgICBfVHJhaXRzOjphc3NpZ24oKih0aGlzLT5fTV9GaW5pc2goKSAtIDEpLCBfTV9udWxsKCkpOwotICAgIHRoaXMtPl9NX2Rlc3Ryb3lfYmFjaygpOwotICAgIC0tdGhpcy0+X01fZmluaXNoOwotICB9Ci0KLXB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXNzaWduCi0gIF9TZWxmJiBhc3NpZ24oY29uc3QgX1NlbGYmIF9fcykKLSAgeyByZXR1cm4gX01fYXNzaWduKF9fcy5fTV9TdGFydCgpLCBfX3MuX01fRmluaXNoKCkpOyB9Ci0KLSAgX1NlbGYmIGFzc2lnbihjb25zdCBfU2VsZiYgX19zLAotICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgewotICAgIGlmIChfX3BvcyA+IF9fcy5zaXplKCkpCi0gICAgICB0aGlzLT5fTV90aHJvd19vdXRfb2ZfcmFuZ2UoKTsKLSAgICByZXR1cm4gX01fYXNzaWduKF9fcy5fTV9TdGFydCgpICsgX19wb3MsCi0gICAgICAgICAgICAgICAgICAgICBfX3MuX01fU3RhcnQoKSArIF9fcG9zICsgKG1pbikgKF9fbiwgX19zLnNpemUoKSAtIF9fcG9zKSk7Ci0gIH0KLQotICBfU2VsZiYgYXNzaWduKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uKQotICB7IF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpIHJldHVybiBfTV9hc3NpZ24oX19zLCBfX3MgKyBfX24pOyB9Ci0KLSAgX1NlbGYmIGFzc2lnbihjb25zdCBfQ2hhclQqIF9fcykKLSAgeyBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKSByZXR1cm4gX01fYXNzaWduKF9fcywgX19zICsgX1RyYWl0czo6bGVuZ3RoKF9fcykpOyB9Ci0KLSAgX1NlbGYmIGFzc2lnbihzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jKTsKLQotI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCi0jICBpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX01TVkM2X01FTV9UX0JVR19XT1JLQVJPVU5EKQotcHJpdmF0ZTogICAgICAgICAgICAgICAgICAgICAgICAvLyBIZWxwZXIgZnVuY3Rpb25zIGZvciBhc3NpZ24uCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW50ZWdlcj4KLSAgX1NlbGYmIF9NX2Fzc2lnbl9kaXNwYXRjaChfSW50ZWdlciBfX24sIF9JbnRlZ2VyIF9feCwgY29uc3QgX190cnVlX3R5cGUmIC8qX0ludGVncmFsKi8pCi0gIHsgcmV0dXJuIGFzc2lnbigoc2l6ZV90eXBlKSBfX24sIChfQ2hhclQpIF9feCk7IH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcj4KLSAgX1NlbGYmIF9NX2Fzc2lnbl9kaXNwYXRjaChfSW5wdXRJdGVyIF9fZiwgX0lucHV0SXRlciBfX2wsIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypfSW50ZWdyYWwqLykgewotICAgIHBvaW50ZXIgX19jdXIgPSB0aGlzLT5fTV9TdGFydCgpOwotICAgIHdoaWxlIChfX2YgIT0gX19sICYmIF9fY3VyICE9IHRoaXMtPl9NX0ZpbmlzaCgpKSB7Ci0gICAgICBfVHJhaXRzOjphc3NpZ24oKl9fY3VyLCAqX19mKTsKLSAgICAgICsrX19mOwotICAgICAgKytfX2N1cjsKLSAgICB9Ci0gICAgaWYgKF9fZiA9PSBfX2wpCi0gICAgICBlcmFzZShfX2N1ciwgdGhpcy0+ZW5kKCkpOwotICAgIGVsc2UKLSAgICAgIF9NX2FwcGVuZFQoX19mLCBfX2wsIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9fZiwgX0lucHV0SXRlcikpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi1wdWJsaWM6Ci0gIC8vIENoZWNrIHRvIHNlZSBpZiBfSW5wdXRJdGVyYXRvciBpcyBhbiBpbnRlZ2VyIHR5cGUuICBJZiBzbywgdGhlbgotICAvLyBpdCBjYW4ndCBiZSBhbiBpdGVyYXRvci4KLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXI+Ci0gIF9TZWxmJiBhc3NpZ24oX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCkgewotICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lzSW50ZWdyYWw8X0lucHV0SXRlcj46Ol9SZXQgX0ludGVncmFsOwotICAgIHJldHVybiBfTV9hc3NpZ25fZGlzcGF0Y2goX19maXJzdCwgX19sYXN0LCBfSW50ZWdyYWwoKSk7Ci0gIH0KLSMgIGVuZGlmCi0jZW5kaWYKLQotcHJvdGVjdGVkOgotICBfU2VsZiYgX01fYXNzaWduKGNvbnN0IF9DaGFyVCogX19mLCBjb25zdCBfQ2hhclQqIF9fbCk7Ci0KLXB1YmxpYzoKLQotI2lmICFkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKSB8fCBcCi0gICAgIWRlZmluZWQgKF9TVExQX05PX01FVEhPRF9TUEVDSUFMSVpBVElPTikgJiYgIWRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpCi0jICBpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX01TVkM2X01FTV9UX0JVR19XT1JLQVJPVU5EKQotICBfU2VsZiYgYXNzaWduKGNvbnN0IF9DaGFyVCogX19mLCBjb25zdCBfQ2hhclQqIF9fbCkgewotICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2YpIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2wpCi0gICAgcmV0dXJuIF9NX2Fzc2lnbihfX2YsIF9fbCk7Ci0gIH0KLSMgIGVuZGlmCi0jZW5kaWYKLQotcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnNlcnQKLQotICBfU2VsZiYgaW5zZXJ0KHNpemVfdHlwZSBfX3BvcywgY29uc3QgX1NlbGYmIF9fcykgewotICAgIGlmIChfX3BvcyA+IHNpemUoKSkKLSAgICAgIHRoaXMtPl9NX3Rocm93X291dF9vZl9yYW5nZSgpOwotICAgIGlmIChzaXplKCkgPiBtYXhfc2l6ZSgpIC0gX19zLnNpemUoKSkKLSAgICAgIHRoaXMtPl9NX3Rocm93X2xlbmd0aF9lcnJvcigpOwotICAgIF9NX2luc2VydChiZWdpbigpICsgX19wb3MsIF9fcy5fTV9TdGFydCgpLCBfX3MuX01fRmluaXNoKCksICZfX3MgPT0gdGhpcyk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgX1NlbGYmIGluc2VydChzaXplX3R5cGUgX19wb3MsIGNvbnN0IF9TZWxmJiBfX3MsCi0gICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fYmVnLCBzaXplX3R5cGUgX19uKSB7Ci0gICAgaWYgKF9fcG9zID4gc2l6ZSgpIHx8IF9fYmVnID4gX19zLnNpemUoKSkKLSAgICAgIHRoaXMtPl9NX3Rocm93X291dF9vZl9yYW5nZSgpOwotICAgIHNpemVfdHlwZSBfX2xlbiA9IChtaW4pIChfX24sIF9fcy5zaXplKCkgLSBfX2JlZyk7Ci0gICAgaWYgKHNpemUoKSA+IG1heF9zaXplKCkgLSBfX2xlbikKLSAgICAgIHRoaXMtPl9NX3Rocm93X2xlbmd0aF9lcnJvcigpOwotICAgIF9NX2luc2VydChiZWdpbigpICsgX19wb3MsCi0gICAgICAgICAgICAgIF9fcy5fTV9TdGFydCgpICsgX19iZWcsIF9fcy5fTV9TdGFydCgpICsgX19iZWcgKyBfX2xlbiwgJl9fcyA9PSB0aGlzKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgX1NlbGYmIGluc2VydChzaXplX3R5cGUgX19wb3MsIGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uKSB7Ci0gICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKLSAgICBpZiAoX19wb3MgPiBzaXplKCkpCi0gICAgICB0aGlzLT5fTV90aHJvd19vdXRfb2ZfcmFuZ2UoKTsKLSAgICBpZiAoc2l6ZSgpID4gbWF4X3NpemUoKSAtIF9fbikKLSAgICAgIHRoaXMtPl9NX3Rocm93X2xlbmd0aF9lcnJvcigpOwotICAgIF9NX2luc2VydChiZWdpbigpICsgX19wb3MsIF9fcywgX19zICsgX19uLCBfTV9pbnNpZGUoX19zKSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgX1NlbGYmIGluc2VydChzaXplX3R5cGUgX19wb3MsIGNvbnN0IF9DaGFyVCogX19zKSB7Ci0gICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKLSAgICBpZiAoX19wb3MgPiBzaXplKCkpCi0gICAgICB0aGlzLT5fTV90aHJvd19vdXRfb2ZfcmFuZ2UoKTsKLSAgICBzaXplX3R5cGUgX19sZW4gPSBfVHJhaXRzOjpsZW5ndGgoX19zKTsKLSAgICBpZiAoc2l6ZSgpID4gbWF4X3NpemUoKSAtIF9fbGVuKQotICAgICAgdGhpcy0+X01fdGhyb3dfbGVuZ3RoX2Vycm9yKCk7Ci0gICAgX01faW5zZXJ0KHRoaXMtPl9NX1N0YXJ0KCkgKyBfX3BvcywgX19zLCBfX3MgKyBfX2xlbiwgX01faW5zaWRlKF9fcykpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIF9TZWxmJiBpbnNlcnQoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jKSB7Ci0gICAgaWYgKF9fcG9zID4gc2l6ZSgpKQotICAgICAgdGhpcy0+X01fdGhyb3dfb3V0X29mX3JhbmdlKCk7Ci0gICAgaWYgKHNpemUoKSA+IG1heF9zaXplKCkgLSBfX24pCi0gICAgICB0aGlzLT5fTV90aHJvd19sZW5ndGhfZXJyb3IoKTsKLSAgICBpbnNlcnQoYmVnaW4oKSArIF9fcG9zLCBfX24sIF9fYyk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIF9fcCwgX0NoYXJUIF9fYykgewotICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3ApCi0gICAgaWYgKF9fcCA9PSBlbmQoKSkgewotICAgICAgcHVzaF9iYWNrKF9fYyk7Ci0gICAgICByZXR1cm4gdGhpcy0+X01fRmluaXNoKCkgLSAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZXR1cm4gX01faW5zZXJ0X2F1eChfX3AsIF9fYyk7Ci0gIH0KLQotICB2b2lkIGluc2VydChpdGVyYXRvciBfX3AsIHNpemVfdCBfX24sIF9DaGFyVCBfX2MpOwotCi1wcm90ZWN0ZWQ6ICAvLyBIZWxwZXIgZnVuY3Rpb25zIGZvciBpbnNlcnQuCi0KLSAgdm9pZCBfTV9pbnNlcnQoaXRlcmF0b3IgX19wLCBjb25zdCBfQ2hhclQqIF9fZmlyc3QsIGNvbnN0IF9DaGFyVCogX19sYXN0LCBib29sIF9fc2VsZl9yZWYpOwotCi0gIHBvaW50ZXIgX01faW5zZXJ0X2F1eChwb2ludGVyLCBfQ2hhclQpOwotCi0gIHZvaWQgX01fY29weShjb25zdCBfQ2hhclQqIF9fZiwgY29uc3QgX0NoYXJUKiBfX2wsIF9DaGFyVCogX19yZXMpIHsKLSAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19mKSBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19sKQotICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3JlcykKLSAgICBfVHJhaXRzOjpjb3B5KF9fcmVzLCBfX2YsIF9fbCAtIF9fZik7Ci0gIH0KLQotICB2b2lkIF9NX21vdmUoY29uc3QgX0NoYXJUKiBfX2YsIGNvbnN0IF9DaGFyVCogX19sLCBfQ2hhclQqIF9fcmVzKSB7Ci0gICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fZikgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fbCkKLSAgICBfVHJhaXRzOjptb3ZlKF9fcmVzLCBfX2YsIF9fbCAtIF9fZik7Ci0gIH0KLQotI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCi0jICBpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX01TVkM2X01FTV9UX0JVR19XT1JLQVJPVU5EKQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyPgotICB2b2lkIF9NX2luc2VydF9vdmVyZmxvdyhpdGVyYXRvciBfX3BvcywgX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZSBfX24pIHsKLSAgICBjb25zdCBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IHRoaXMtPnNpemUoKTsKLSAgICBzaXplX3R5cGUgX19sZW4gPSBfX29sZF9zaXplICsgKG1heCkoX19vbGRfc2l6ZSwgX19TVEFUSUNfQ0FTVChzaXplX3R5cGUsX19uKSkgKyAxOwotICAgIHBvaW50ZXIgX19uZXdfc3RhcnQgPSB0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5hbGxvY2F0ZShfX2xlbiwgX19sZW4pOwotICAgIHBvaW50ZXIgX19uZXdfZmluaXNoID0gX19uZXdfc3RhcnQ7Ci0gICAgX1NUTFBfVFJZIHsKLSAgICAgIF9fbmV3X2ZpbmlzaCA9IHVuaW5pdGlhbGl6ZWRfY29weSh0aGlzLT5fTV9TdGFydCgpLCBfX3BvcywgX19uZXdfc3RhcnQpOwotICAgICAgX19uZXdfZmluaXNoID0gdW5pbml0aWFsaXplZF9jb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19uZXdfZmluaXNoKTsKLSAgICAgIF9fbmV3X2ZpbmlzaCA9IHVuaW5pdGlhbGl6ZWRfY29weShfX3BvcywgdGhpcy0+X01fRmluaXNoKCksIF9fbmV3X2ZpbmlzaCk7Ci0gICAgICBfTV9jb25zdHJ1Y3RfbnVsbChfX25ld19maW5pc2gpOwotICAgIH0KLSAgICBfU1RMUF9VTldJTkQoKF9TVExQX1NURDo6X0Rlc3Ryb3lfUmFuZ2UoX19uZXdfc3RhcnQsX19uZXdfZmluaXNoKSwKLSAgICAgICAgICAgICAgICAgIHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLmRlYWxsb2NhdGUoX19uZXdfc3RhcnQsIF9fbGVuKSkpCi0gICAgdGhpcy0+X01fZGVzdHJveV9yYW5nZSgpOwotICAgIHRoaXMtPl9NX2RlYWxsb2NhdGVfYmxvY2soKTsKLSAgICB0aGlzLT5fTV9yZXNldChfX25ld19zdGFydCwgX19uZXdfZmluaXNoLCBfX25ld19zdGFydCArIF9fbGVuKTsKLSAgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgotICB2b2lkIF9NX2luc2VydFQoaXRlcmF0b3IgX19wLCBfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LAotICAgICAgICAgICAgICAgICAgY29uc3QgaW5wdXRfaXRlcmF0b3JfdGFnICYpIHsKLSAgICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpIHsKLSAgICAgIF9fcCA9IGluc2VydChfX3AsICpfX2ZpcnN0KTsKLSAgICAgICsrX19wOwotICAgIH0KLSAgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXI+Ci0gIHZvaWQgX01faW5zZXJ0VChpdGVyYXRvciBfX3BvcywgX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICBjb25zdCBmb3J3YXJkX2l0ZXJhdG9yX3RhZyAmKSB7Ci0gICAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KSB7Ci0gICAgICBkaWZmZXJlbmNlX3R5cGUgX19uID0gZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KTsKLSAgICAgIGlmICh0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5fTV9kYXRhIC0gdGhpcy0+X01fZmluaXNoID49IF9fbiArIDEpIHsKLSAgICAgICAgY29uc3QgZGlmZmVyZW5jZV90eXBlIF9fZWxlbXNfYWZ0ZXIgPSB0aGlzLT5fTV9maW5pc2ggLSBfX3BvczsKLSAgICAgICAgaWYgKF9fZWxlbXNfYWZ0ZXIgPj0gX19uKSB7Ci0jICAgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0pCi0gICAgICAgICAgaWYgKHRoaXMtPl9NX3VzaW5nX3N0YXRpY19idWYoKSkKLSAgICAgICAgICAgIF9NX2NvcHkoKHRoaXMtPl9NX0ZpbmlzaCgpIC0gX19uKSArIDEsIHRoaXMtPl9NX0ZpbmlzaCgpICsgMSwgdGhpcy0+X01fRmluaXNoKCkgKyAxKTsKLSAgICAgICAgICBlbHNlCi0jICAgIGVuZGlmIC8qIF9TVExQX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0gKi8KLSAgICAgICAgICB1bmluaXRpYWxpemVkX2NvcHkoKHRoaXMtPl9NX0ZpbmlzaCgpIC0gX19uKSArIDEsIHRoaXMtPl9NX0ZpbmlzaCgpICsgMSwgdGhpcy0+X01fRmluaXNoKCkgKyAxKTsKLSAgICAgICAgICB0aGlzLT5fTV9maW5pc2ggKz0gX19uOwotICAgICAgICAgIF9UcmFpdHM6Om1vdmUoX19wb3MgKyBfX24sIF9fcG9zLCAoX19lbGVtc19hZnRlciAtIF9fbikgKyAxKTsKLSAgICAgICAgICBfTV9jb3B5VChfX2ZpcnN0LCBfX2xhc3QsIF9fcG9zKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICBwb2ludGVyIF9fb2xkX2ZpbmlzaCA9IHRoaXMtPl9NX0ZpbmlzaCgpOwotICAgICAgICAgIF9Gb3J3YXJkSXRlciBfX21pZCA9IF9fZmlyc3Q7Ci0gICAgICAgICAgYWR2YW5jZShfX21pZCwgX19lbGVtc19hZnRlciArIDEpOwotIyAgICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNKQotICAgICAgICAgIGlmICh0aGlzLT5fTV91c2luZ19zdGF0aWNfYnVmKCkpCi0gICAgICAgICAgICBfTV9jb3B5VChfX21pZCwgX19sYXN0LCB0aGlzLT5fTV9GaW5pc2goKSArIDEpOwotICAgICAgICAgIGVsc2UKLSMgICAgZW5kaWYgLyogX1NUTFBfVVNFX1NIT1JUX1NUUklOR19PUFRJTSAqLwotICAgICAgICAgIHVuaW5pdGlhbGl6ZWRfY29weShfX21pZCwgX19sYXN0LCB0aGlzLT5fTV9GaW5pc2goKSArIDEpOwotICAgICAgICAgIHRoaXMtPl9NX2ZpbmlzaCArPSBfX24gLSBfX2VsZW1zX2FmdGVyOwotICAgICAgICAgIF9TVExQX1RSWSB7Ci0jICAgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0pCi0gICAgICAgICAgICBpZiAodGhpcy0+X01fdXNpbmdfc3RhdGljX2J1ZigpKQotICAgICAgICAgICAgICBfTV9jb3B5KF9fcG9zLCBfX29sZF9maW5pc2ggKyAxLCB0aGlzLT5fTV9GaW5pc2goKSk7Ci0gICAgICAgICAgICBlbHNlCi0jICAgIGVuZGlmIC8qIF9TVExQX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0gKi8KLSAgICAgICAgICAgIHVuaW5pdGlhbGl6ZWRfY29weShfX3BvcywgX19vbGRfZmluaXNoICsgMSwgdGhpcy0+X01fRmluaXNoKCkpOwotICAgICAgICAgICAgdGhpcy0+X01fZmluaXNoICs9IF9fZWxlbXNfYWZ0ZXI7Ci0gICAgICAgICAgfQotICAgICAgICAgIF9TVExQX1VOV0lORCgodGhpcy0+X01fZGVzdHJveV9wdHJfcmFuZ2UoX19vbGRfZmluaXNoICsgMSwgdGhpcy0+X01fRmluaXNoKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+X01fZmluaXNoID0gX19vbGRfZmluaXNoKSkKLSAgICAgICAgICBfTV9jb3B5VChfX2ZpcnN0LCBfX21pZCwgX19wb3MpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgX01faW5zZXJ0X292ZXJmbG93KF9fcG9zLCBfX2ZpcnN0LCBfX2xhc3QsIF9fbik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2VyPgotICB2b2lkIF9NX2luc2VydF9kaXNwYXRjaChpdGVyYXRvciBfX3AsIF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX194LAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX3RydWVfdHlwZSYgLypJbnRlZ3JhbCovKSB7Ci0gICAgaW5zZXJ0KF9fcCwgKHNpemVfdHlwZSkgX19uLCAoX0NoYXJUKSBfX3gpOwotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXI+Ci0gIHZvaWQgX01faW5zZXJ0X2Rpc3BhdGNoKGl0ZXJhdG9yIF9fcCwgX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19mYWxzZV90eXBlJiAvKkludGVncmFsKi8pIHsKLSAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19wKQotICAgIC8qCi0gICAgICogV2l0aGluIHRoZSBiYXNpY19zdHJpbmcgaW1wbGVtZW50YXRpb24gd2UgYXJlIG9ubHkgZ29pbmcgdG8gY2hlY2sgZm9yCi0gICAgICogc2VsZiByZWZlcmVuY2luZyBpZiBpdGVyYXRvcnMgYXJlIHN0cmluZyBpdGVyYXRvcnMgb3IgX0NoYXJUIHBvaW50ZXJzLgotICAgICAqIEEgdXNlciBjb3VsZCBlbmNhcHN1bGF0ZSB0aG9zZSBpdGVyYXRvciB3aXRoaW4gdGhlaXIgb3duIGl0ZXJhdG9yIGludGVyZmFjZQotICAgICAqIGFuZCBpbiB0aGlzIGNhc2UgbGVhZCB0byBhIGJhZCBiZWhhdmlvciwgdGhpcyBpcyBhIGtub3duIGxpbWl0YXRpb24uCi0gICAgICovCi0gICAgdHlwZWRlZiB0eXBlbmFtZSBfQXJlU2FtZVVuQ1ZUeXBlczxfSW5wdXRJdGVyLCBpdGVyYXRvcj46Ol9SZXQgX0lzSXRlcmF0b3I7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBfQXJlU2FtZVVuQ1ZUeXBlczxfSW5wdXRJdGVyLCBjb25zdF9pdGVyYXRvcj46Ol9SZXQgX0lzQ29uc3RJdGVyYXRvcjsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIF9Mb3IyPF9Jc0l0ZXJhdG9yLCBfSXNDb25zdEl0ZXJhdG9yPjo6X1JldCBfQ2hlY2tJbnNpZGU7Ci0gICAgX01faW5zZXJ0X2F1eChfX3AsIF9fZmlyc3QsIF9fbGFzdCwgX0NoZWNrSW5zaWRlKCkpOwotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21JdGVyPgotICB2b2lkIF9NX2luc2VydF9hdXggKGl0ZXJhdG9yIF9fcCwgX1JhbmRvbUl0ZXIgX19maXJzdCwgX1JhbmRvbUl0ZXIgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKl9DaGVja0luc2lkZSovKSB7Ci0gICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcCkKLSAgICBfTV9pbnNlcnQoX19wLCAmKCpfX2ZpcnN0KSwgJigqX19sYXN0KSwgX01faW5zaWRlKCYoKl9fZmlyc3QpKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyPgotICB2b2lkIF9NX2luc2VydF9hdXggKGl0ZXJhdG9yIF9fcCwgX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qX0NoZWNrSW5zaWRlKi8pIHsKLSAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19wKQotICAgIF9NX2luc2VydFQoX19wLCBfX2ZpcnN0LCBfX2xhc3QsIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9fZmlyc3QsIF9JbnB1dEl0ZXIpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KLSAgdm9pZCBfTV9jb3B5VChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsIHBvaW50ZXIgX19yZXN1bHQpIHsKLSAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19yZXN1bHQpCi0gICAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0LCArK19fcmVzdWx0KQotICAgICAgX1RyYWl0czo6YXNzaWduKCpfX3Jlc3VsdCwgKl9fZmlyc3QpOwotICB9Ci0KLSMgICAgaWYgIWRlZmluZWQgKF9TVExQX05PX01FVEhPRF9TUEVDSUFMSVpBVElPTikKLSAgdm9pZCBfTV9jb3B5VChjb25zdCBfQ2hhclQqIF9fZiwgY29uc3QgX0NoYXJUKiBfX2wsIF9DaGFyVCogX19yZXMpIHsKLSAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19mKSBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19sKQotICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3JlcykKLSAgICBfVHJhaXRzOjpjb3B5KF9fcmVzLCBfX2YsIF9fbCAtIF9fZik7Ci0gIH0KLSMgICAgZW5kaWYKLQotcHVibGljOgotICAvLyBDaGVjayB0byBzZWUgaWYgX0lucHV0SXRlcmF0b3IgaXMgYW4gaW50ZWdlciB0eXBlLiAgSWYgc28sIHRoZW4KLSAgLy8gaXQgY2FuJ3QgYmUgYW4gaXRlcmF0b3IuCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgotICB2b2lkIGluc2VydChpdGVyYXRvciBfX3AsIF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QpIHsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0ludGVncmFsPF9JbnB1dEl0ZXI+OjpfUmV0IF9JbnRlZ3JhbDsKLSAgICBfTV9pbnNlcnRfZGlzcGF0Y2goX19wLCBfX2ZpcnN0LCBfX2xhc3QsIF9JbnRlZ3JhbCgpKTsKLSAgfQotIyAgZW5kaWYKLSNlbmRpZgotCi1wdWJsaWM6Ci0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykgfHwgXAotICAgICFkZWZpbmVkIChfU1RMUF9OT19NRVRIT0RfU1BFQ0lBTElaQVRJT04pICYmICFkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQotICB2b2lkIGluc2VydChpdGVyYXRvciBfX3AsIGNvbnN0IF9DaGFyVCogX19mLCBjb25zdCBfQ2hhclQqIF9fbCkgewotICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2YpIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2wpCi0gICAgX01faW5zZXJ0KF9fcCwgX19mLCBfX2wsIF9NX2luc2lkZShfX2YpKTsKLSAgfQotI2VuZGlmCi0KLXB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXJhc2UuCi0KLSAgX1NlbGYmIGVyYXNlKHNpemVfdHlwZSBfX3BvcyA9IDAsIHNpemVfdHlwZSBfX24gPSBucG9zKSB7Ci0gICAgaWYgKF9fcG9zID4gc2l6ZSgpKQotICAgICAgdGhpcy0+X01fdGhyb3dfb3V0X29mX3JhbmdlKCk7Ci0gICAgZXJhc2UoYmVnaW4oKSArIF9fcG9zLCBiZWdpbigpICsgX19wb3MgKyAobWluKSAoX19uLCBzaXplKCkgLSBfX3BvcykpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIF9fcG9zKSB7Ci0gICAgLy8gVGhlIG1vdmUgaW5jbHVkZXMgdGhlIHRlcm1pbmF0aW5nIF9DaGFyVCgpLgotICAgIF9UcmFpdHM6Om1vdmUoX19wb3MsIF9fcG9zICsgMSwgdGhpcy0+X01fRmluaXNoKCkgLSBfX3Bvcyk7Ci0gICAgdGhpcy0+X01fZGVzdHJveV9iYWNrKCk7Ci0gICAgLS10aGlzLT5fTV9maW5pc2g7Ci0gICAgcmV0dXJuIF9fcG9zOwotICB9Ci0KLSAgaXRlcmF0b3IgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KSB7Ci0gICAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KSB7Ci0gICAgICAvLyBUaGUgbW92ZSBpbmNsdWRlcyB0aGUgdGVybWluYXRpbmcgX0NoYXJUKCkuCi0gICAgICB0cmFpdHNfdHlwZTo6bW92ZShfX2ZpcnN0LCBfX2xhc3QsICh0aGlzLT5fTV9GaW5pc2goKSAtIF9fbGFzdCkgKyAxKTsKLSAgICAgIHBvaW50ZXIgX19uZXdfZmluaXNoID0gdGhpcy0+X01fRmluaXNoKCkgLSAoX19sYXN0IC0gX19maXJzdCk7Ci0gICAgICB0aGlzLT5fTV9kZXN0cm95X3B0cl9yYW5nZShfX25ld19maW5pc2ggKyAxLCB0aGlzLT5fTV9GaW5pc2goKSArIDEpOwotICAgICAgdGhpcy0+X01fZmluaXNoID0gX19uZXdfZmluaXNoOwotICAgIH0KLSAgICByZXR1cm4gX19maXJzdDsKLSAgfQotCi1wdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlcGxhY2UuICAoQ29uY2VwdHVhbGx5IGVxdWl2YWxlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gZXJhc2UgZm9sbG93ZWQgYnkgaW5zZXJ0LikKLSAgX1NlbGYmIHJlcGxhY2Uoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uLCBjb25zdCBfU2VsZiYgX19zKSB7Ci0gICAgaWYgKF9fcG9zID4gc2l6ZSgpKQotICAgICAgdGhpcy0+X01fdGhyb3dfb3V0X29mX3JhbmdlKCk7Ci0gICAgY29uc3Qgc2l6ZV90eXBlIF9fbGVuID0gKG1pbikgKF9fbiwgc2l6ZSgpIC0gX19wb3MpOwotICAgIGlmIChzaXplKCkgLSBfX2xlbiA+PSBtYXhfc2l6ZSgpIC0gX19zLnNpemUoKSkKLSAgICAgIHRoaXMtPl9NX3Rocm93X2xlbmd0aF9lcnJvcigpOwotICAgIHJldHVybiBfTV9yZXBsYWNlKGJlZ2luKCkgKyBfX3BvcywgYmVnaW4oKSArIF9fcG9zICsgX19sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgX19zLl9NX1N0YXJ0KCksIF9fcy5fTV9GaW5pc2goKSwgJl9fcyA9PSB0aGlzKTsKLSAgfQotCi0gIF9TZWxmJiByZXBsYWNlKHNpemVfdHlwZSBfX3BvczEsIHNpemVfdHlwZSBfX24xLCBjb25zdCBfU2VsZiYgX19zLAotICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19wb3MyLCBzaXplX3R5cGUgX19uMikgewotICAgIGlmIChfX3BvczEgPiBzaXplKCkgfHwgX19wb3MyID4gX19zLnNpemUoKSkKLSAgICAgIHRoaXMtPl9NX3Rocm93X291dF9vZl9yYW5nZSgpOwotICAgIGNvbnN0IHNpemVfdHlwZSBfX2xlbjEgPSAobWluKSAoX19uMSwgc2l6ZSgpIC0gX19wb3MxKTsKLSAgICBjb25zdCBzaXplX3R5cGUgX19sZW4yID0gKG1pbikgKF9fbjIsIF9fcy5zaXplKCkgLSBfX3BvczIpOwotICAgIGlmIChzaXplKCkgLSBfX2xlbjEgPj0gbWF4X3NpemUoKSAtIF9fbGVuMikKLSAgICAgIHRoaXMtPl9NX3Rocm93X2xlbmd0aF9lcnJvcigpOwotICAgIHJldHVybiBfTV9yZXBsYWNlKGJlZ2luKCkgKyBfX3BvczEsIGJlZ2luKCkgKyBfX3BvczEgKyBfX2xlbjEsCi0gICAgICAgICAgICAgICAgICAgICAgX19zLl9NX1N0YXJ0KCkgKyBfX3BvczIsIF9fcy5fTV9TdGFydCgpICsgX19wb3MyICsgX19sZW4yLCAmX19zID09IHRoaXMpOwotICB9Ci0KLSAgX1NlbGYmIHJlcGxhY2Uoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uMSwKLSAgICAgICAgICAgICAgICAgY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX24yKSB7Ci0gICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKLSAgICBpZiAoX19wb3MgPiBzaXplKCkpCi0gICAgICB0aGlzLT5fTV90aHJvd19vdXRfb2ZfcmFuZ2UoKTsKLSAgICBjb25zdCBzaXplX3R5cGUgX19sZW4gPSAobWluKSAoX19uMSwgc2l6ZSgpIC0gX19wb3MpOwotICAgIGlmIChfX24yID4gbWF4X3NpemUoKSB8fCBzaXplKCkgLSBfX2xlbiA+PSBtYXhfc2l6ZSgpIC0gX19uMikKLSAgICAgIHRoaXMtPl9NX3Rocm93X2xlbmd0aF9lcnJvcigpOwotICAgIHJldHVybiBfTV9yZXBsYWNlKGJlZ2luKCkgKyBfX3BvcywgYmVnaW4oKSArIF9fcG9zICsgX19sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgX19zLCBfX3MgKyBfX24yLCBfTV9pbnNpZGUoX19zKSk7Ci0gIH0KLQotICBfU2VsZiYgcmVwbGFjZShzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24xLCBjb25zdCBfQ2hhclQqIF9fcykgewotICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCi0gICAgaWYgKF9fcG9zID4gc2l6ZSgpKQotICAgICAgdGhpcy0+X01fdGhyb3dfb3V0X29mX3JhbmdlKCk7Ci0gICAgY29uc3Qgc2l6ZV90eXBlIF9fbGVuID0gKG1pbikgKF9fbjEsIHNpemUoKSAtIF9fcG9zKTsKLSAgICBjb25zdCBzaXplX3R5cGUgX19uMiA9IF9UcmFpdHM6Omxlbmd0aChfX3MpOwotICAgIGlmIChfX24yID4gbWF4X3NpemUoKSB8fCBzaXplKCkgLSBfX2xlbiA+PSBtYXhfc2l6ZSgpIC0gX19uMikKLSAgICAgIHRoaXMtPl9NX3Rocm93X2xlbmd0aF9lcnJvcigpOwotICAgIHJldHVybiBfTV9yZXBsYWNlKGJlZ2luKCkgKyBfX3BvcywgYmVnaW4oKSArIF9fcG9zICsgX19sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgX19zLCBfX3MgKyBfVHJhaXRzOjpsZW5ndGgoX19zKSwgX01faW5zaWRlKF9fcykpOwotICB9Ci0KLSAgX1NlbGYmIHJlcGxhY2Uoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uMSwKLSAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbjIsIF9DaGFyVCBfX2MpIHsKLSAgICBpZiAoX19wb3MgPiBzaXplKCkpCi0gICAgICB0aGlzLT5fTV90aHJvd19vdXRfb2ZfcmFuZ2UoKTsKLSAgICBjb25zdCBzaXplX3R5cGUgX19sZW4gPSAobWluKSAoX19uMSwgc2l6ZSgpIC0gX19wb3MpOwotICAgIGlmIChfX24yID4gbWF4X3NpemUoKSB8fCBzaXplKCkgLSBfX2xlbiA+PSBtYXhfc2l6ZSgpIC0gX19uMikKLSAgICAgIHRoaXMtPl9NX3Rocm93X2xlbmd0aF9lcnJvcigpOwotICAgIHJldHVybiByZXBsYWNlKGJlZ2luKCkgKyBfX3BvcywgYmVnaW4oKSArIF9fcG9zICsgX19sZW4sIF9fbjIsIF9fYyk7Ci0gIH0KLQotICBfU2VsZiYgcmVwbGFjZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QsIGNvbnN0IF9TZWxmJiBfX3MpIHsKLSAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19maXJzdClfU1RMUF9GSVhfTElURVJBTF9CVUcoX19sYXN0KQotICAgIHJldHVybiBfTV9yZXBsYWNlKF9fZmlyc3QsIF9fbGFzdCwgX19zLl9NX1N0YXJ0KCksIF9fcy5fTV9GaW5pc2goKSwgJl9fcyA9PSB0aGlzKTsKLSAgfQotCi0gIF9TZWxmJiByZXBsYWNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX24pIHsKLSAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19maXJzdClfU1RMUF9GSVhfTElURVJBTF9CVUcoX19sYXN0KQotICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCi0gICAgcmV0dXJuIF9NX3JlcGxhY2UoX19maXJzdCwgX19sYXN0LCBfX3MsIF9fcyArIF9fbiwgX01faW5zaWRlKF9fcykpOwotICB9Ci0KLSAgX1NlbGYmIHJlcGxhY2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0LAotICAgICAgICAgICAgICAgICBjb25zdCBfQ2hhclQqIF9fcykgewotICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2ZpcnN0KV9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2xhc3QpCi0gICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKLSAgICByZXR1cm4gX01fcmVwbGFjZShfX2ZpcnN0LCBfX2xhc3QsIF9fcywgX19zICsgX1RyYWl0czo6bGVuZ3RoKF9fcyksIF9NX2luc2lkZShfX3MpKTsKLSAgfQotCi0gIF9TZWxmJiByZXBsYWNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCwgc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYyk7Ci0KLXByb3RlY3RlZDogICAgICAgICAgICAgICAgICAgICAgICAvLyBIZWxwZXIgZnVuY3Rpb25zIGZvciByZXBsYWNlLgotICBfU2VsZiYgX01fcmVwbGFjZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IF9DaGFyVCogX19mLCBjb25zdCBfQ2hhclQqIF9fbCwgYm9vbCBfX3NlbGZfcmVmKTsKLQotcHVibGljOgotI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCi0jICBpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX01TVkM2X01FTV9UX0JVR19XT1JLQVJPVU5EKQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0ludGVnZXI+Ci0gIF9TZWxmJiBfTV9yZXBsYWNlX2Rpc3BhdGNoKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0ludGVnZXIgX19uLCBfSW50ZWdlciBfX3gsIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKklzSW50ZWdyYWwqLykgewotICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2ZpcnN0KSBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19sYXN0KQotICAgIHJldHVybiByZXBsYWNlKF9fZmlyc3QsIF9fbGFzdCwgKHNpemVfdHlwZSkgX19uLCAoX0NoYXJUKSBfX3gpOwotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXI+Ci0gIF9TZWxmJiBfTV9yZXBsYWNlX2Rpc3BhdGNoKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlciBfX2YsIF9JbnB1dEl0ZXIgX19sLCBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qSXNJbnRlZ3JhbCovKSB7Ci0gICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fZmlyc3QpIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2xhc3QpCi0gICAgdHlwZWRlZiB0eXBlbmFtZSBfQXJlU2FtZVVuQ1ZUeXBlczxfSW5wdXRJdGVyLCBpdGVyYXRvcj46Ol9SZXQgX0lzSXRlcmF0b3I7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBfQXJlU2FtZVVuQ1ZUeXBlczxfSW5wdXRJdGVyLCBjb25zdF9pdGVyYXRvcj46Ol9SZXQgX0lzQ29uc3RJdGVyYXRvcjsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIF9Mb3IyPF9Jc0l0ZXJhdG9yLCBfSXNDb25zdEl0ZXJhdG9yPjo6X1JldCBfQ2hlY2tJbnNpZGU7Ci0gICAgcmV0dXJuIF9NX3JlcGxhY2VfYXV4KF9fZmlyc3QsIF9fbGFzdCwgX19mLCBfX2wsIF9DaGVja0luc2lkZSgpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tSXRlcj4KLSAgX1NlbGYmIF9NX3JlcGxhY2VfYXV4KGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9SYW5kb21JdGVyIF9fZiwgX1JhbmRvbUl0ZXIgX19sLCBfX3RydWVfdHlwZSBjb25zdCYgLypfQ2hlY2tJbnNpZGUqLykgewotICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2ZpcnN0KSBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19sYXN0KQotICAgIHJldHVybiBfTV9yZXBsYWNlKF9fZmlyc3QsIF9fbGFzdCwgJigqX19mKSwgJigqX19sKSwgX01faW5zaWRlKCYoKl9fZikpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgotICBfU2VsZiYgX01fcmVwbGFjZV9hdXgoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlciBfX2YsIF9JbnB1dEl0ZXIgX19sLCBfX2ZhbHNlX3R5cGUgY29uc3QmIC8qX0NoZWNrSW5zaWRlKi8pIHsKLSAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19maXJzdCkgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fbGFzdCkKLSAgICByZXR1cm4gX01fcmVwbGFjZVQoX19maXJzdCwgX19sYXN0LCBfX2YsIF9fbCwgX1NUTFBfSVRFUkFUT1JfQ0FURUdPUlkoX19mLCBfSW5wdXRJdGVyKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcj4KLSAgX1NlbGYmIF9NX3JlcGxhY2VUKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIgX19mLCBfSW5wdXRJdGVyIF9fbCwgY29uc3QgaW5wdXRfaXRlcmF0b3JfdGFnJl9faXRlX3RhZykgewotICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2ZpcnN0KSBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19sYXN0KQotICAgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3QgJiYgX19mICE9IF9fbDsgKytfX2ZpcnN0LCArK19fZikKLSAgICAgIF9UcmFpdHM6OmFzc2lnbigqX19maXJzdCwgKl9fZik7Ci0gICAgaWYgKF9fZiA9PSBfX2wpCi0gICAgICBlcmFzZShfX2ZpcnN0LCBfX2xhc3QpOwotICAgIGVsc2UKLSAgICAgIF9NX2luc2VydFQoX19sYXN0LCBfX2YsIF9fbCwgX19pdGVfdGFnKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyPgotICBfU2VsZiYgX01fcmVwbGFjZVQoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyIF9fZiwgX0ZvcndhcmRJdGVyIF9fbCwgY29uc3QgZm9yd2FyZF9pdGVyYXRvcl90YWcgJl9faXRlX3RhZykgewotICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2ZpcnN0KSBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19sYXN0KQotICAgIGRpZmZlcmVuY2VfdHlwZSBfX24gPSBkaXN0YW5jZShfX2YsIF9fbCk7Ci0gICAgY29uc3QgZGlmZmVyZW5jZV90eXBlIF9fbGVuID0gX19sYXN0IC0gX19maXJzdDsKLSAgICBpZiAoX19sZW4gPj0gX19uKSB7Ci0gICAgICBfTV9jb3B5VChfX2YsIF9fbCwgX19maXJzdCk7Ci0gICAgICBlcmFzZShfX2ZpcnN0ICsgX19uLCBfX2xhc3QpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIF9Gb3J3YXJkSXRlciBfX20gPSBfX2Y7Ci0gICAgICBhZHZhbmNlKF9fbSwgX19sZW4pOwotICAgICAgX01fY29weVQoX19mLCBfX20sIF9fZmlyc3QpOwotICAgICAgX01faW5zZXJ0VChfX2xhc3QsIF9fbSwgX19sLCBfX2l0ZV90YWcpOwotICAgIH0KLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotcHVibGljOgotICAvLyBDaGVjayB0byBzZWUgaWYgX0lucHV0SXRlciBpcyBhbiBpbnRlZ2VyIHR5cGUuICBJZiBzbywgdGhlbgotICAvLyBpdCBjYW4ndCBiZSBhbiBpdGVyYXRvci4KLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXI+Ci0gIF9TZWxmJiByZXBsYWNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgX0lucHV0SXRlciBfX2YsIF9JbnB1dEl0ZXIgX19sKSB7Ci0gICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fZmlyc3QpX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fbGFzdCkKLSAgICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0ludGVncmFsPF9JbnB1dEl0ZXI+OjpfUmV0IF9JbnRlZ3JhbDsKLSAgICByZXR1cm4gX01fcmVwbGFjZV9kaXNwYXRjaChfX2ZpcnN0LCBfX2xhc3QsIF9fZiwgX19sLCAgX0ludGVncmFsKCkpOwotICB9Ci0KLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKSB8fCBcCi0gICAgIWRlZmluZWQgKF9TVExQX05PX01FVEhPRF9TUEVDSUFMSVpBVElPTikgJiYgIWRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpCi0jICBpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX01TVkM2X01FTV9UX0JVR19XT1JLQVJPVU5EKQotICBfU2VsZiYgcmVwbGFjZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgIGNvbnN0IF9DaGFyVCogX19mLCBjb25zdCBfQ2hhclQqIF9fbCkgewotICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2ZpcnN0KV9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2xhc3QpCi0gICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fZikgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fbCkKLSAgICByZXR1cm4gX01fcmVwbGFjZShfX2ZpcnN0LCBfX2xhc3QsIF9fZiwgX19sLCBfTV9pbnNpZGUoX19mKSk7Ci0gIH0KLSMgIGVuZGlmCi0jZW5kaWYKLQotcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPdGhlciBtb2RpZmllciBtZW1iZXIgZnVuY3Rpb25zLgotCi0gIHNpemVfdHlwZSBjb3B5KF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdCB7Ci0gICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKLSAgICBpZiAoX19wb3MgPiBzaXplKCkpCi0gICAgICB0aGlzLT5fTV90aHJvd19vdXRfb2ZfcmFuZ2UoKTsKLSAgICBjb25zdCBzaXplX3R5cGUgX19sZW4gPSAobWluKSAoX19uLCBzaXplKCkgLSBfX3Bvcyk7Ci0gICAgX1RyYWl0czo6Y29weShfX3MsIHRoaXMtPl9NX1N0YXJ0KCkgKyBfX3BvcywgX19sZW4pOwotICAgIHJldHVybiBfX2xlbjsKLSAgfQotCi0gIHZvaWQgc3dhcChfU2VsZiYgX19zKSB7Ci0gICAgdGhpcy0+X01fU3dhcChfX3MpOwotICB9Ci0KLXB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29udmVyc2lvbiB0byBDIHN0cmluZy4KLQotICBjb25zdCBfQ2hhclQqIGNfc3RyKCkgY29uc3QgeyByZXR1cm4gdGhpcy0+X01fU3RhcnQoKTsgfQotICBjb25zdCBfQ2hhclQqIGRhdGEoKSAgY29uc3QgeyByZXR1cm4gdGhpcy0+X01fU3RhcnQoKTsgfQotCi1wdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmQuCi0KLSAgc2l6ZV90eXBlIGZpbmQoY29uc3QgX1NlbGYmIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QKLSAgICB7IHJldHVybiBmaW5kKF9fcy5fTV9TdGFydCgpLCBfX3BvcywgX19zLnNpemUoKSk7IH0KLQotICBzaXplX3R5cGUgZmluZChjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QKLSAgICB7IF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpIHJldHVybiBmaW5kKF9fcywgX19wb3MsIF9UcmFpdHM6Omxlbmd0aChfX3MpKTsgfQotCi0gIHNpemVfdHlwZSBmaW5kKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIGNvbnN0OwotCi0gIC8vIFdJRTogVmVyc2FudCBzY2hlbWEgY29tcGlsZXIgNS4yLjIgSUNFIHdvcmthcm91bmQKLSAgc2l6ZV90eXBlIGZpbmQoX0NoYXJUIF9fYykgY29uc3QgeyByZXR1cm4gZmluZChfX2MsIDApOyB9Ci0gIHNpemVfdHlwZSBmaW5kKF9DaGFyVCBfX2MsIHNpemVfdHlwZSBfX3BvcyAvKiA9IDAgKi8pIGNvbnN0OwotCi1wdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJmaW5kLgotCi0gIHNpemVfdHlwZSByZmluZChjb25zdCBfU2VsZiYgX19zLCBzaXplX3R5cGUgX19wb3MgPSBucG9zKSBjb25zdAotICAgIHsgcmV0dXJuIHJmaW5kKF9fcy5fTV9TdGFydCgpLCBfX3BvcywgX19zLnNpemUoKSk7IH0KLQotICBzaXplX3R5cGUgcmZpbmQoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3BvcyA9IG5wb3MpIGNvbnN0Ci0gICAgeyBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKSByZXR1cm4gcmZpbmQoX19zLCBfX3BvcywgX1RyYWl0czo6bGVuZ3RoKF9fcykpOyB9Ci0KLSAgc2l6ZV90eXBlIHJmaW5kKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIGNvbnN0OwotICBzaXplX3R5cGUgcmZpbmQoX0NoYXJUIF9fYywgc2l6ZV90eXBlIF9fcG9zID0gbnBvcykgY29uc3Q7Ci0KLXB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmluZF9maXJzdF9vZgotCi0gIHNpemVfdHlwZSBmaW5kX2ZpcnN0X29mKGNvbnN0IF9TZWxmJiBfX3MsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0Ci0gICAgeyByZXR1cm4gZmluZF9maXJzdF9vZihfX3MuX01fU3RhcnQoKSwgX19wb3MsIF9fcy5zaXplKCkpOyB9Ci0KLSAgc2l6ZV90eXBlIGZpbmRfZmlyc3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0Ci0gICAgeyBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKSByZXR1cm4gZmluZF9maXJzdF9vZihfX3MsIF9fcG9zLCBfVHJhaXRzOjpsZW5ndGgoX19zKSk7IH0KLQotICBzaXplX3R5cGUgZmluZF9maXJzdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uKSBjb25zdDsKLQotICBzaXplX3R5cGUgZmluZF9maXJzdF9vZihfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdAotICAgIHsgcmV0dXJuIGZpbmQoX19jLCBfX3Bvcyk7IH0KLQotcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5kX2xhc3Rfb2YKLQotICBzaXplX3R5cGUgZmluZF9sYXN0X29mKGNvbnN0IF9TZWxmJiBfX3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fcG9zID0gbnBvcykgY29uc3QKLSAgICB7IHJldHVybiBmaW5kX2xhc3Rfb2YoX19zLl9NX1N0YXJ0KCksIF9fcG9zLCBfX3Muc2l6ZSgpKTsgfQotCi0gIHNpemVfdHlwZSBmaW5kX2xhc3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3BvcyA9IG5wb3MpIGNvbnN0Ci0gICAgeyBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKSByZXR1cm4gZmluZF9sYXN0X29mKF9fcywgX19wb3MsIF9UcmFpdHM6Omxlbmd0aChfX3MpKTsgfQotCi0gIHNpemVfdHlwZSBmaW5kX2xhc3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uKSBjb25zdDsKLQotICBzaXplX3R5cGUgZmluZF9sYXN0X29mKF9DaGFyVCBfX2MsIHNpemVfdHlwZSBfX3BvcyA9IG5wb3MpIGNvbnN0IHsKLSAgICByZXR1cm4gcmZpbmQoX19jLCBfX3Bvcyk7Ci0gIH0KLQotcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5kX2ZpcnN0X25vdF9vZgotCi0gIHNpemVfdHlwZSBmaW5kX2ZpcnN0X25vdF9vZihjb25zdCBfU2VsZiYgX19zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QKLSAgICB7IHJldHVybiBmaW5kX2ZpcnN0X25vdF9vZihfX3MuX01fU3RhcnQoKSwgX19wb3MsIF9fcy5zaXplKCkpOyB9Ci0KLSAgc2l6ZV90eXBlIGZpbmRfZmlyc3Rfbm90X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdAotICB7IF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpIHJldHVybiBmaW5kX2ZpcnN0X25vdF9vZihfX3MsIF9fcG9zLCBfVHJhaXRzOjpsZW5ndGgoX19zKSk7IH0KLQotICBzaXplX3R5cGUgZmluZF9maXJzdF9ub3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX24pIGNvbnN0OwotCi0gIHNpemVfdHlwZSBmaW5kX2ZpcnN0X25vdF9vZihfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdDsKLQotcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5kX2xhc3Rfbm90X29mCi0KLSAgc2l6ZV90eXBlIGZpbmRfbGFzdF9ub3Rfb2YoY29uc3QgX1NlbGYmIF9fcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fcG9zID0gbnBvcykgY29uc3QKLSAgeyByZXR1cm4gZmluZF9sYXN0X25vdF9vZihfX3MuX01fU3RhcnQoKSwgX19wb3MsIF9fcy5zaXplKCkpOyB9Ci0KLSAgc2l6ZV90eXBlIGZpbmRfbGFzdF9ub3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3BvcyA9IG5wb3MpIGNvbnN0Ci0gICAgeyBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKSByZXR1cm4gZmluZF9sYXN0X25vdF9vZihfX3MsIF9fcG9zLCBfVHJhaXRzOjpsZW5ndGgoX19zKSk7IH0KLQotICBzaXplX3R5cGUgZmluZF9sYXN0X25vdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uKSBjb25zdDsKLQotICBzaXplX3R5cGUgZmluZF9sYXN0X25vdF9vZihfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MgPSBucG9zKSBjb25zdDsKLQotcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdWJzdHJpbmcuCi0gIF9TZWxmIHN1YnN0cihzaXplX3R5cGUgX19wb3MgPSAwLCBzaXplX3R5cGUgX19uID0gbnBvcykgY29uc3QKLSAgeyByZXR1cm4gX1NlbGYoKnRoaXMsIF9fcG9zLCBfX24sIGdldF9hbGxvY2F0b3IoKSk7IH0KLQotcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb21wYXJlCi0gIGludCBjb21wYXJlKGNvbnN0IF9TZWxmJiBfX3MpIGNvbnN0Ci0gIHsgcmV0dXJuIF9NX2NvbXBhcmUodGhpcy0+X01fU3RhcnQoKSwgdGhpcy0+X01fRmluaXNoKCksIF9fcy5fTV9TdGFydCgpLCBfX3MuX01fRmluaXNoKCkpOyB9Ci0KLSAgaW50IGNvbXBhcmUoc2l6ZV90eXBlIF9fcG9zMSwgc2l6ZV90eXBlIF9fbjEsCi0gICAgICAgICAgICAgIGNvbnN0IF9TZWxmJiBfX3MpIGNvbnN0IHsKLSAgICBpZiAoX19wb3MxID4gc2l6ZSgpKQotICAgICAgdGhpcy0+X01fdGhyb3dfb3V0X29mX3JhbmdlKCk7Ci0gICAgcmV0dXJuIF9NX2NvbXBhcmUodGhpcy0+X01fU3RhcnQoKSArIF9fcG9zMSwKLSAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5fTV9TdGFydCgpICsgX19wb3MxICsgKG1pbikgKF9fbjEsIHNpemUoKSAtIF9fcG9zMSksCi0gICAgICAgICAgICAgICAgICAgICAgX19zLl9NX1N0YXJ0KCksIF9fcy5fTV9GaW5pc2goKSk7Ci0gIH0KLQotICBpbnQgY29tcGFyZShzaXplX3R5cGUgX19wb3MxLCBzaXplX3R5cGUgX19uMSwKLSAgICAgICAgICAgICAgY29uc3QgX1NlbGYmIF9fcywKLSAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fcG9zMiwgc2l6ZV90eXBlIF9fbjIpIGNvbnN0IHsKLSAgICBpZiAoX19wb3MxID4gc2l6ZSgpIHx8IF9fcG9zMiA+IF9fcy5zaXplKCkpCi0gICAgICB0aGlzLT5fTV90aHJvd19vdXRfb2ZfcmFuZ2UoKTsKLSAgICByZXR1cm4gX01fY29tcGFyZSh0aGlzLT5fTV9TdGFydCgpICsgX19wb3MxLAotICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPl9NX1N0YXJ0KCkgKyBfX3BvczEgKyAobWluKSAoX19uMSwgc2l6ZSgpIC0gX19wb3MxKSwKLSAgICAgICAgICAgICAgICAgICAgICBfX3MuX01fU3RhcnQoKSArIF9fcG9zMiwKLSAgICAgICAgICAgICAgICAgICAgICBfX3MuX01fU3RhcnQoKSArIF9fcG9zMiArIChtaW4pIChfX24yLCBfX3Muc2l6ZSgpIC0gX19wb3MyKSk7Ci0gIH0KLQotICBpbnQgY29tcGFyZShjb25zdCBfQ2hhclQqIF9fcykgY29uc3QgewotICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCi0gICAgcmV0dXJuIF9NX2NvbXBhcmUodGhpcy0+X01fU3RhcnQoKSwgdGhpcy0+X01fRmluaXNoKCksIF9fcywgX19zICsgX1RyYWl0czo6bGVuZ3RoKF9fcykpOwotICB9Ci0KLSAgaW50IGNvbXBhcmUoc2l6ZV90eXBlIF9fcG9zMSwgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IF9DaGFyVCogX19zKSBjb25zdCB7Ci0gICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKLSAgICBpZiAoX19wb3MxID4gc2l6ZSgpKQotICAgICAgdGhpcy0+X01fdGhyb3dfb3V0X29mX3JhbmdlKCk7Ci0gICAgcmV0dXJuIF9NX2NvbXBhcmUodGhpcy0+X01fU3RhcnQoKSArIF9fcG9zMSwKLSAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5fTV9TdGFydCgpICsgX19wb3MxICsgKG1pbikgKF9fbjEsIHNpemUoKSAtIF9fcG9zMSksCi0gICAgICAgICAgICAgICAgICAgICAgX19zLCBfX3MgKyBfVHJhaXRzOjpsZW5ndGgoX19zKSk7Ci0gIH0KLQotICBpbnQgY29tcGFyZShzaXplX3R5cGUgX19wb3MxLCBzaXplX3R5cGUgX19uMSwgY29uc3QgX0NoYXJUKiBfX3MsCi0gICAgICAgICAgICAgIHNpemVfdHlwZSBfX24yKSBjb25zdCB7Ci0gICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKLSAgICBpZiAoX19wb3MxID4gc2l6ZSgpKQotICAgICAgdGhpcy0+X01fdGhyb3dfb3V0X29mX3JhbmdlKCk7Ci0gICAgcmV0dXJuIF9NX2NvbXBhcmUodGhpcy0+X01fU3RhcnQoKSArIF9fcG9zMSwKLSAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5fTV9TdGFydCgpICsgX19wb3MxICsgKG1pbikgKF9fbjEsIHNpemUoKSAtIF9fcG9zMSksCi0gICAgICAgICAgICAgICAgICAgICAgX19zLCBfX3MgKyBfX24yKTsKLSAgfQotCi1wdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgY29tcGFyZS4KLQotICBzdGF0aWMgaW50IF9TVExQX0NBTEwgX01fY29tcGFyZShjb25zdCBfQ2hhclQqIF9fZjEsIGNvbnN0IF9DaGFyVCogX19sMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0NoYXJUKiBfX2YyLCBjb25zdCBfQ2hhclQqIF9fbDIpIHsKLSAgICBjb25zdCBwdHJkaWZmX3QgX19uMSA9IF9fbDEgLSBfX2YxOwotICAgIGNvbnN0IHB0cmRpZmZfdCBfX24yID0gX19sMiAtIF9fZjI7Ci0gICAgY29uc3QgaW50IGNtcCA9IF9UcmFpdHM6OmNvbXBhcmUoX19mMSwgX19mMiwgKG1pbikgKF9fbjEsIF9fbjIpKTsKLSAgICByZXR1cm4gY21wICE9IDAgPyBjbXAgOiAoX19uMSA8IF9fbjIgPyAtMSA6IChfX24xID4gX19uMiA/IDEgOiAwKSk7Ci0gIH0KLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfVEVNUExBVEVfRVhQUkVTU0lPTikgJiYgIWRlZmluZWQgKF9TVExQX0RFQlVHKSAmJiAhZGVmaW5lZCAoX1NUTFBfVVNFX01TVkM2X01FTV9UX0JVR19XT1JLQVJPVU5EKQotIyAgZGVmaW5lIF9TVExQX1NUUklOR19TVU1fQkFTRShfX3Jlc2VydmUsIF9fc2l6ZSwgX19hbGxvYykgX1NUTFBfUFJJViBfU3RyaW5nX2Jhc2U8X0NoYXJULF9BbGxvYz4oX19hbGxvYywgX19zaXplICsgMSkKLSMgIGluY2x1ZGUgPHN0bC9fc3RyaW5nX3N1bV9tZXRob2RzLmg+Ci0jICB1bmRlZiBfU1RMUF9TVFJJTkdfU1VNX0JBU0UKLSNlbmRpZiAvKiBfU1RMUF9VU0VfVEVNUExBVEVfRVhQUkVTU0lPTiAqLwotfTsKLQotI2lmICFkZWZpbmVkIChfU1RMUF9TVEFUSUNfQ09OU1RfSU5JVF9CVUcpCi0jICBpZiBkZWZpbmVkIChfX0dOVUNfXykgJiYgKF9fR05VQ19fID09IDIpICYmIChfX0dOVUNfTUlOT1JfXyA9PSA5NikKLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KLWNvbnN0IHNpemVfdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjpucG9zID0gfihzaXplX3QpIDA7Ci0jICBlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUKQotX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIGJhc2ljX3N0cmluZzxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiwgYWxsb2NhdG9yPGNoYXI+ID47Ci0jICBpZiBkZWZpbmVkIChfU1RMUF9IQVNfV0NIQVJfVCkKLV9TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBiYXNpY19zdHJpbmc8d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4sIGFsbG9jYXRvcjx3Y2hhcl90PiA+OwotIyAgZW5kaWYKLSNlbmRpZiAvKiBfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUICovCi0KLSNpZiBkZWZpbmVkIChiYXNpY19zdHJpbmcpCi1fU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKLSMgIHVuZGVmIGJhc2ljX3N0cmluZwotI2VuZGlmCi0KLV9TVExQX0VORF9OQU1FU1BBQ0UKLQotI2lmIGRlZmluZWQgKF9TVExQX1VTRV9NU1ZDNl9NRU1fVF9CVUdfV09SS0FST1VORCkKLSMgIGluY2x1ZGUgPHN0bC9fc3RyaW5nX3dvcmthcm91bmQuaD4KLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpCi0jICBpbmNsdWRlIDxzdGwvZGVidWcvX3N0cmluZy5oPgotI2VuZGlmCi0KLV9TVExQX0JFR0lOX05BTUVTUEFDRQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIE5vbi1tZW1iZXIgZnVuY3Rpb25zLgotLy8gU3dhcC4KLSNpZiBkZWZpbmVkIChfU1RMUF9GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIpCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+Ci1pbmxpbmUgdm9pZCBfU1RMUF9DQUxMCi1zd2FwKGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+JiBfX3gsCi0gICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+JiBfX3kpCi17IF9feC5zd2FwKF9feSk7IH0KLSNlbmRpZiAvKiBfU1RMUF9GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIgKi8KLQotI2lmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+Ci1zdHJ1Y3QgX19tb3ZlX3RyYWl0czxiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+ID4gewotICB0eXBlZGVmIF9fc3RscF9tb3ZhYmxlIGltcGxlbWVudGVkOwotICAvL0NvbXBsZXRuZXNzIGRlcGVuZHMgb24gdGhlIGFsbG9jYXRvcjoKLSAgdHlwZWRlZiB0eXBlbmFtZSBfX21vdmVfdHJhaXRzPF9BbGxvYz46OmNvbXBsZXRlIGNvbXBsZXRlOwotfTsKLS8qI2Vsc2UKLSAqIFRoZXJlIGlzIG5vIG5lZWQgdG8gc3BlY2lhbGl6ZSBmb3Igc3RyaW5nIGFuZCB3c3RyaW5nIGluIHRoaXMgY2FzZQotICogYXMgdGhlIGRlZmF1bHQgX19tb3ZlX3RyYWl0cyB3aWxsIGFscmVhZHkgdGVsbCB0aGF0IHN0cmluZyBpcyBtb3ZhYmxlCi0gKiBidXQgbm90IGNvbXBsZXRlLiBXZSBjYW5ub3QgZGVmaW5lIGl0IGFzIGNvbXBsZXRlIGFzIG5vdGhpbmcgZ3VhcmFudHkKLSAqIHRoYXQgdGhlIFNUTHBvcnQgdXNlciBoYXNuJ3Qgc3BlY2lhbGl6ZWQgc3RkOjphbGxvY2F0b3IgZm9yIGNoYXIgb3IKLSAqIHdjaGFyX3QuCi0gKi8KLSNlbmRpZgotCi1fU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCi0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KLXZvaWQgX1NUTFBfQ0FMTCBfU19zdHJpbmdfY29weShjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiYgX19zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DaGFyVCogX19idWYsIHNpemVfdCBfX24pOwotCi0jaWYgZGVmaW5lZChfU1RMUF9VU0VfV0lERV9JTlRFUkZBQ0UpCi0vLyBBIGNvdXBsZSBvZiBmdW5jdGlvbnMgdG8gdHJhbnNmZXIgYmV0d2VlbiBBU0NJSS9Vbmljb2RlCi13c3RyaW5nIF9fQVNDSUlUb1dpZGUoY29uc3QgY2hhciAqYXNjaWkpOwotc3RyaW5nIF9fV2lkZVRvQVNDSUkoY29uc3Qgd2NoYXJfdCAqd2lkZSk7Ci0jZW5kaWYKLQotaW5saW5lIGNvbnN0IGNoYXIqIF9TVExQX0NBTEwKLV9fZ2V0X2Nfc3RyaW5nKGNvbnN0IHN0cmluZyYgX19zdHIpIHsgcmV0dXJuIF9fc3RyLmNfc3RyKCk7IH0KLQotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi0KLV9TVExQX0VORF9OQU1FU1BBQ0UKLQotI2luY2x1ZGUgPHN0bC9fc3RyaW5nX29wZXJhdG9ycy5oPgotCi0jaWYgZGVmaW5lZChfU1RMUF9VU0VfTk9fSU9TVFJFQU1TKSB8fCBcCi0gICAgKGRlZmluZWQgKF9TVExQX0VYUE9TRV9TVFJFQU1fSU1QTEVNRU5UQVRJT04pICYmICFkZWZpbmVkIChfU1RMUF9MSU5LX1RJTUVfSU5TVEFOVElBVElPTikpCi0jICBpbmNsdWRlIDxzdGwvX3N0cmluZy5jPgotI2VuZGlmCi0KLSNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9TVFJJTkdfSCAqLwotCi0vKgotICogTG9jYWwgVmFyaWFibGVzOgotICogbW9kZTpDKysKLSAqIEVuZDoKLSAqLwpkaWZmIC0tZ2l0IGEvc3RsL19zdHJpbmdfYmFzZS5oIGIvc3RsL19zdHJpbmdfYmFzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjMwNDlkLi4wMDAwMDAwCi0tLSBhL3N0bC9fc3RyaW5nX2Jhc2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTE5OTkKLSAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogQm9yaXMgRm9taXRjaGV2Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDAzCi0gKiBGcmFuY29pcyBEdW1vbnQKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLQotI2lmbmRlZiBfU1RMUF9TVFJJTkdfQkFTRV9ICi0jZGVmaW5lIF9TVExQX1NUUklOR19CQVNFX0gKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDbGFzcyBfU3RyaW5nX2Jhc2UuCi0KLS8vIF9TdHJpbmdfYmFzZSBpcyBhIGhlbHBlciBjbGFzcyB0aGF0IG1ha2VzIGl0IGl0IGVhc2llciB0byB3cml0ZSBhbgotLy8gZXhjZXB0aW9uLXNhZmUgdmVyc2lvbiBvZiBiYXNpY19zdHJpbmcuICBUaGUgY29uc3RydWN0b3IgYWxsb2NhdGVzLAotLy8gYnV0IGRvZXMgbm90IGluaXRpYWxpemUsIGEgYmxvY2sgb2YgbWVtb3J5LiAgVGhlIGRlc3RydWN0b3IKLS8vIGRlYWxsb2NhdGVzLCBidXQgZG9lcyBub3QgZGVzdHJveSBlbGVtZW50cyB3aXRoaW4sIGEgYmxvY2sgb2YKLS8vIG1lbW9yeS4gIFRoZSBkZXN0cnVjdG9yIGFzc3VtZXMgdGhhdCBfTV9zdGFydCBlaXRoZXIgaXMgbnVsbCwgb3IgZWxzZQotLy8gcG9pbnRzIHRvIGEgYmxvY2sgb2YgbWVtb3J5IHRoYXQgd2FzIGFsbG9jYXRlZCB1c2luZyBfU3RyaW5nX2Jhc2UncwotLy8gYWxsb2NhdG9yIGFuZCB3aG9zZSBzaXplIGlzIF9NX2VuZF9vZl9zdG9yYWdlLl9NX2RhdGEgLSBfTV9zdGFydC4KLQotX1NUTFBfQkVHSU5fTkFNRVNQQUNFCi0KLV9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKLQotI2lmbmRlZiBfU1RMUF9TSE9SVF9TVFJJTkdfU1oKLSMgIGRlZmluZSBfU1RMUF9TSE9SVF9TVFJJTkdfU1ogMTYKLSNlbmRpZgotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Ci1jbGFzcyBfU3RyaW5nX2Jhc2UgewotICB0eXBlZGVmIF9TdHJpbmdfYmFzZTxfVHAsIF9BbGxvYz4gX1NlbGY7Ci1wcm90ZWN0ZWQ6Ci0gIF9TVExQX0ZPUkNFX0FMTE9DQVRPUlMoX1RwLCBfQWxsb2MpCi1wdWJsaWM6Ci0gIC8vZHVtczogU29tZSBjb21waWxlcihNU1ZDNikgcmVxdWlyZSBpdCB0byBiZSBwdWJsaWMgbm90IHNpbXBseSBwcm90ZWN0ZWQhCi0gIGVudW0ge19ERUZBVUxUX1NJWkUgPSBfU1RMUF9TSE9SVF9TVFJJTkdfU1p9OwotICAvL1RoaXMgaXMgbmVlZGVkIGJ5IHRoZSBmdWxsIG1vdmUgZnJhbWV3b3JrCi0gIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jX3RyYWl0czxfVHAsIF9BbGxvYz46OmFsbG9jYXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOwotICB0eXBlZGVmIF9TVExQX2FsbG9jX3Byb3h5PF9UcCosIF9UcCwgYWxsb2NhdG9yX3R5cGU+IF9BbGxvY1Byb3h5OwotICB0eXBlZGVmIHNpemVfdCBzaXplX3R5cGU7Ci1wcml2YXRlOgotI2lmIGRlZmluZWQgKF9TVExQX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0pCi0gIHVuaW9uIF9CdWZmZXJzIHsKLSAgICBfVHAqICBfTV9keW5hbWljX2J1ZjsKLSAgICBfVHAgICBfTV9zdGF0aWNfYnVmW19ERUZBVUxUX1NJWkVdOwotICB9IF9NX2J1ZmZlcnM7Ci0jZWxzZQotICBfVHAqICAgIF9NX3N0YXJ0OwotI2VuZGlmIC8qIF9TVExQX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0gKi8KLXByb3RlY3RlZDoKLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNKQotICBib29sIF9NX3VzaW5nX3N0YXRpY19idWYoKSBjb25zdCB7Ci0gICAgcmV0dXJuIChfTV9lbmRfb2Zfc3RvcmFnZS5fTV9kYXRhID09IF9NX2J1ZmZlcnMuX01fc3RhdGljX2J1ZiArIF9ERUZBVUxUX1NJWkUpOwotICB9Ci0gIF9UcCBjb25zdCogX01fU3RhcnQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIF9NX3VzaW5nX3N0YXRpY19idWYoKT9fTV9idWZmZXJzLl9NX3N0YXRpY19idWY6X01fYnVmZmVycy5fTV9keW5hbWljX2J1ZjsKLSAgfQotICBfVHAqIF9NX1N0YXJ0KCkgewotICAgIHJldHVybiBfTV91c2luZ19zdGF0aWNfYnVmKCk/X01fYnVmZmVycy5fTV9zdGF0aWNfYnVmOl9NX2J1ZmZlcnMuX01fZHluYW1pY19idWY7Ci0gIH0KLSNlbHNlCi0gIF9UcCBjb25zdCogX01fU3RhcnQoKSBjb25zdCB7cmV0dXJuIF9NX3N0YXJ0O30KLSAgX1RwKiBfTV9TdGFydCgpIHtyZXR1cm4gX01fc3RhcnQ7fQotI2VuZGlmIC8qIF9TVExQX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0gKi8KLQotICBfVHAqICAgIF9NX2ZpbmlzaDsKLSAgX0FsbG9jUHJveHkgX01fZW5kX29mX3N0b3JhZ2U7Ci0KLSAgX1RwIGNvbnN0KiBfTV9GaW5pc2goKSBjb25zdCB7cmV0dXJuIF9NX2ZpbmlzaDt9Ci0gIF9UcCogX01fRmluaXNoKCkge3JldHVybiBfTV9maW5pc2g7fQotCi0gIC8vIFByZWNvbmRpdGlvbjogMCA8IF9fbiA8PSBtYXhfc2l6ZSgpLgotICB2b2lkIF9NX2FsbG9jYXRlX2Jsb2NrKHNpemVfdCBfX24gPSBfREVGQVVMVF9TSVpFKTsKLSAgdm9pZCBfTV9kZWFsbG9jYXRlX2Jsb2NrKCkgewotI2lmIGRlZmluZWQgKF9TVExQX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0pCi0gICAgaWYgKCFfTV91c2luZ19zdGF0aWNfYnVmKCkgJiYgKF9NX2J1ZmZlcnMuX01fZHluYW1pY19idWYgIT0gMCkpCi0gICAgICBfTV9lbmRfb2Zfc3RvcmFnZS5kZWFsbG9jYXRlKF9NX2J1ZmZlcnMuX01fZHluYW1pY19idWYsIF9NX2VuZF9vZl9zdG9yYWdlLl9NX2RhdGEgLSBfTV9idWZmZXJzLl9NX2R5bmFtaWNfYnVmKTsKLSNlbHNlCi0gICAgaWYgKF9NX3N0YXJ0ICE9IDApCi0gICAgICBfTV9lbmRfb2Zfc3RvcmFnZS5kZWFsbG9jYXRlKF9NX3N0YXJ0LCBfTV9lbmRfb2Zfc3RvcmFnZS5fTV9kYXRhIC0gX01fc3RhcnQpOwotI2VuZGlmIC8qIF9TVExQX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0gKi8KLSAgfQotCi0gIHNpemVfdCBtYXhfc2l6ZSgpIGNvbnN0IHsKLSAgICBjb25zdCBzaXplX3R5cGUgX19zdHJpbmdfbWF4X3NpemUgPSBzaXplX3R5cGUoLTEpIC8gc2l6ZW9mKF9UcCk7Ci0gICAgdHlwZW5hbWUgYWxsb2NhdG9yX3R5cGU6OnNpemVfdHlwZSBfX2FsbG9jX21heF9zaXplID0gX01fZW5kX29mX3N0b3JhZ2UubWF4X3NpemUoKTsKLSAgICByZXR1cm4gKG1pbikoX19hbGxvY19tYXhfc2l6ZSwgX19zdHJpbmdfbWF4X3NpemUpIC0gMTsKLSAgfQotCi0gIF9TdHJpbmdfYmFzZShjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQotI2lmIGRlZmluZWQgKF9TVExQX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0pCi0gICAgOiBfTV9maW5pc2goX01fYnVmZmVycy5fTV9zdGF0aWNfYnVmKSwgX01fZW5kX29mX3N0b3JhZ2UoX19hLCBfTV9idWZmZXJzLl9NX3N0YXRpY19idWYgKyBfREVGQVVMVF9TSVpFKQotI2Vsc2UKLSAgICA6IF9NX3N0YXJ0KDApLCBfTV9maW5pc2goMCksIF9NX2VuZF9vZl9zdG9yYWdlKF9fYSwgKF9UcCopMCkKLSNlbmRpZgotICAgIHt9Ci0KLSAgX1N0cmluZ19iYXNlKGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EsIHNpemVfdCBfX24pCi0jaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1NIT1JUX1NUUklOR19PUFRJTSkKLSAgICA6IF9NX2ZpbmlzaChfTV9idWZmZXJzLl9NX3N0YXRpY19idWYpLCBfTV9lbmRfb2Zfc3RvcmFnZShfX2EsIF9NX2J1ZmZlcnMuX01fc3RhdGljX2J1ZiArIF9ERUZBVUxUX1NJWkUpIHsKLSNlbHNlCi0gICAgOiBfTV9zdGFydCgwKSwgX01fZmluaXNoKDApLCBfTV9lbmRfb2Zfc3RvcmFnZShfX2EsIChfVHAqKTApIHsKLSNlbmRpZgotICAgICAgX01fYWxsb2NhdGVfYmxvY2soX19uKTsKLSAgICB9Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNKQotICB2b2lkIF9NX21vdmVfc3JjIChfU2VsZiAmc3JjKSB7Ci0gICAgICBpZiAoc3JjLl9NX3VzaW5nX3N0YXRpY19idWYoKSkgewotICAgICAgICBfTV9idWZmZXJzID0gc3JjLl9NX2J1ZmZlcnM7Ci0gICAgICAgIF9NX2ZpbmlzaCA9IF9NX2J1ZmZlcnMuX01fc3RhdGljX2J1ZiArIChzcmMuX01fZmluaXNoIC0gc3JjLl9NX2J1ZmZlcnMuX01fc3RhdGljX2J1Zik7Ci0gICAgICAgIF9NX2VuZF9vZl9zdG9yYWdlLl9NX2RhdGEgPSBfTV9idWZmZXJzLl9NX3N0YXRpY19idWYgKyBfREVGQVVMVF9TSVpFOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIF9NX2J1ZmZlcnMuX01fZHluYW1pY19idWYgPSBzcmMuX01fYnVmZmVycy5fTV9keW5hbWljX2J1ZjsKLSAgICAgICAgX01fZmluaXNoID0gc3JjLl9NX2ZpbmlzaDsKLSAgICAgICAgX01fZW5kX29mX3N0b3JhZ2UuX01fZGF0YSA9IHNyYy5fTV9lbmRfb2Zfc3RvcmFnZS5fTV9kYXRhOwotICAgICAgICBzcmMuX01fYnVmZmVycy5fTV9keW5hbWljX2J1ZiA9IDA7Ci0gICAgICB9Ci0gICAgfQotI2VuZGlmCi0KLSAgX1N0cmluZ19iYXNlKF9fbW92ZV9zb3VyY2U8X1NlbGY+IHNyYykKLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNKQotICAgIDogX01fZW5kX29mX3N0b3JhZ2UoX19tb3ZlX3NvdXJjZTxfQWxsb2NQcm94eT4oc3JjLmdldCgpLl9NX2VuZF9vZl9zdG9yYWdlKSkgewotICAgICAgX01fbW92ZV9zcmMoc3JjLmdldCgpKTsKLSNlbHNlCi0gICAgOiBfTV9zdGFydChzcmMuZ2V0KCkuX01fc3RhcnQpLCBfTV9maW5pc2goc3JjLmdldCgpLl9NX2ZpbmlzaCksCi0gICAgICBfTV9lbmRfb2Zfc3RvcmFnZShfX21vdmVfc291cmNlPF9BbGxvY1Byb3h5PihzcmMuZ2V0KCkuX01fZW5kX29mX3N0b3JhZ2UpKSB7Ci0gICAgICBzcmMuZ2V0KCkuX01fc3RhcnQgPSAwOwotI2VuZGlmCi0gICAgfQotCi0gIH5fU3RyaW5nX2Jhc2UoKSB7IF9NX2RlYWxsb2NhdGVfYmxvY2soKTsgfQotCi0gIHZvaWQgX01fcmVzZXQoX1RwICpfX3N0YXJ0LCBfVHAgKl9fZmluaXNoLCBfVHAgKl9fZW5kX29mX3N0b3JhZ2UpIHsKLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNKQotICAgIF9NX2J1ZmZlcnMuX01fZHluYW1pY19idWYgPSBfX3N0YXJ0OwotI2Vsc2UKLSAgICBfTV9zdGFydCA9IF9fc3RhcnQ7Ci0jZW5kaWYKLSAgICBfTV9maW5pc2ggPSBfX2ZpbmlzaDsKLSAgICBfTV9lbmRfb2Zfc3RvcmFnZS5fTV9kYXRhID0gX19lbmRfb2Zfc3RvcmFnZTsKLSAgfQotCi0gIHZvaWQgX01fZGVzdHJveV9iYWNrICgpIHsKLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNKQotICAgIGlmICghX01fdXNpbmdfc3RhdGljX2J1ZigpKQotI2VuZGlmIC8qIF9TVExQX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0gKi8KLSAgICAgIF9TVExQX1NURDo6X0Rlc3Ryb3koX01fZmluaXNoKTsKLSAgfQotCi0gIHZvaWQgX01fZGVzdHJveV9yYW5nZShzaXplX3QgX19mcm9tX29mZiA9IDAsIHNpemVfdCBfX3RvX29mZiA9IDEpIHsKLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNKQotICAgIGlmICghX01fdXNpbmdfc3RhdGljX2J1ZigpKQotICAgICAgX1NUTFBfU1REOjpfRGVzdHJveV9SYW5nZShfTV9idWZmZXJzLl9NX2R5bmFtaWNfYnVmICsgX19mcm9tX29mZiwgX01fZmluaXNoICsgX190b19vZmYpOwotI2Vsc2UKLSAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95X1JhbmdlKF9NX3N0YXJ0ICsgX19mcm9tX29mZiwgX01fZmluaXNoICsgX190b19vZmYpOwotI2VuZGlmIC8qIF9TVExQX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0gKi8KLSAgfQotCi0gIHZvaWQgX01fZGVzdHJveV9wdHJfcmFuZ2UoX1RwICpfX2YsIF9UcCAqX19sKSB7Ci0jaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1NIT1JUX1NUUklOR19PUFRJTSkKLSAgICBpZiAoIV9NX3VzaW5nX3N0YXRpY19idWYoKSkKLSNlbmRpZiAvKiBfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNICovCi0gICAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95X1JhbmdlKF9fZiwgX19sKTsKLSAgfQotCi0gIHZvaWQgX01fU3dhcChfU2VsZiAmX19zKSB7Ci0jaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1NIT1JUX1NUUklOR19PUFRJTSkKLSAgICBpZiAoX01fdXNpbmdfc3RhdGljX2J1ZigpKSB7Ci0gICAgICBpZiAoX19zLl9NX3VzaW5nX3N0YXRpY19idWYoKSkgewotICAgICAgICBfU1RMUF9TVEQ6OnN3YXAoX01fYnVmZmVycywgX19zLl9NX2J1ZmZlcnMpOwotICAgICAgICBfVHAgKl9fdG1wID0gX01fZmluaXNoOwotICAgICAgICBfTV9maW5pc2ggPSBfTV9idWZmZXJzLl9NX3N0YXRpY19idWYgKyAoX19zLl9NX2ZpbmlzaCAtIF9fcy5fTV9idWZmZXJzLl9NX3N0YXRpY19idWYpOwotICAgICAgICBfX3MuX01fZmluaXNoID0gX19zLl9NX2J1ZmZlcnMuX01fc3RhdGljX2J1ZiArIChfX3RtcCAtIF9NX2J1ZmZlcnMuX01fc3RhdGljX2J1Zik7Ci0gICAgICAgIC8vV2UgbmVlZCB0byBzd2FwIF9NX2VuZF9vZl9zdG9yYWdlIGZvciBhbGxvY2F0b3JzIHdpdGggc3RhdGU6Ci0gICAgICAgIF9NX2VuZF9vZl9zdG9yYWdlLnN3YXAoX19zLl9NX2VuZF9vZl9zdG9yYWdlKTsKLSAgICAgICAgX01fZW5kX29mX3N0b3JhZ2UuX01fZGF0YSA9IF9NX2J1ZmZlcnMuX01fc3RhdGljX2J1ZiArIF9ERUZBVUxUX1NJWkU7Ci0gICAgICAgIF9fcy5fTV9lbmRfb2Zfc3RvcmFnZS5fTV9kYXRhID0gX19zLl9NX2J1ZmZlcnMuX01fc3RhdGljX2J1ZiArIF9ERUZBVUxUX1NJWkU7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBfX3MuX01fU3dhcCgqdGhpcyk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoX19zLl9NX3VzaW5nX3N0YXRpY19idWYoKSkgewotICAgICAgX1RwICpfX3RtcCA9IF9NX2J1ZmZlcnMuX01fZHluYW1pY19idWY7Ci0gICAgICBfVHAgKl9fdG1wX2ZpbmlzaCA9IF9NX2ZpbmlzaDsKLSAgICAgIF9UcCAqX190bXBfZW5kX2RhdGEgPSBfTV9lbmRfb2Zfc3RvcmFnZS5fTV9kYXRhOwotICAgICAgX01fYnVmZmVycyA9IF9fcy5fTV9idWZmZXJzOwotICAgICAgLy9XZSBuZWVkIHRvIHN3YXAgX01fZW5kX29mX3N0b3JhZ2UgZm9yIGFsbG9jYXRvcnMgd2l0aCBzdGF0ZToKLSAgICAgIF9NX2VuZF9vZl9zdG9yYWdlLnN3YXAoX19zLl9NX2VuZF9vZl9zdG9yYWdlKTsKLSAgICAgIF9NX2VuZF9vZl9zdG9yYWdlLl9NX2RhdGEgPSBfTV9idWZmZXJzLl9NX3N0YXRpY19idWYgKyBfREVGQVVMVF9TSVpFOwotICAgICAgX01fZmluaXNoID0gX01fYnVmZmVycy5fTV9zdGF0aWNfYnVmICsgKF9fcy5fTV9maW5pc2ggLSBfX3MuX01fYnVmZmVycy5fTV9zdGF0aWNfYnVmKTsKLSAgICAgIF9fcy5fTV9idWZmZXJzLl9NX2R5bmFtaWNfYnVmID0gX190bXA7Ci0gICAgICBfX3MuX01fZW5kX29mX3N0b3JhZ2UuX01fZGF0YSA9IF9fdG1wX2VuZF9kYXRhOwotICAgICAgX19zLl9NX2ZpbmlzaCA9IF9fdG1wX2ZpbmlzaDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBfU1RMUF9TVEQ6OnN3YXAoX01fYnVmZmVycy5fTV9keW5hbWljX2J1ZiwgX19zLl9NX2J1ZmZlcnMuX01fZHluYW1pY19idWYpOwotICAgICAgX01fZW5kX29mX3N0b3JhZ2Uuc3dhcChfX3MuX01fZW5kX29mX3N0b3JhZ2UpOwotICAgICAgX1NUTFBfU1REOjpzd2FwKF9NX2ZpbmlzaCwgX19zLl9NX2ZpbmlzaCk7Ci0gICAgfQotI2Vsc2UKLSAgICBfU1RMUF9TVEQ6OnN3YXAoX01fc3RhcnQsIF9fcy5fTV9zdGFydCk7Ci0gICAgX01fZW5kX29mX3N0b3JhZ2Uuc3dhcChfX3MuX01fZW5kX29mX3N0b3JhZ2UpOwotICAgIF9TVExQX1NURDo6c3dhcChfTV9maW5pc2gsIF9fcy5fTV9maW5pc2gpOwotI2VuZGlmIC8qIF9TVExQX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0gKi8KLSAgfQotCi0gIHZvaWQgX1NUTFBfRlVOQ1RJT05fVEhST1dTIF9NX3Rocm93X2xlbmd0aF9lcnJvcigpIGNvbnN0OwotICB2b2lkIF9TVExQX0ZVTkNUSU9OX1RIUk9XUyBfTV90aHJvd19vdXRfb2ZfcmFuZ2UoKSBjb25zdDsKLX07Ci0KLSN1bmRlZiBfU1RMUF9TSE9SVF9TVFJJTkdfU1oKLQotI2lmIGRlZmluZWQgKF9TVExQX1VTRV9URU1QTEFURV9FWFBPUlQpCi1fU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgX1N0cmluZ19iYXNlPGNoYXIsIGFsbG9jYXRvcjxjaGFyPiA+OwotIyAgaWYgZGVmaW5lZCAoX1NUTFBfSEFTX1dDSEFSX1QpCi1fU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgX1N0cmluZ19iYXNlPHdjaGFyX3QsIGFsbG9jYXRvcjx3Y2hhcl90PiA+OwotIyAgZW5kaWYKLSNlbmRpZiAvKiBfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUICovCi0KLV9TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQotCi1fU1RMUF9FTkRfTkFNRVNQQUNFCi0KLSNlbmRpZiAvKiBfU1RMUF9TVFJJTkdfQkFTRV9IICovCi0KLS8qCi0gKiBMb2NhbCBWYXJpYWJsZXM6Ci0gKiBtb2RlOkMrKwotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9zdGwvX3N0cmluZ19md2QuaCBiL3N0bC9fc3RyaW5nX2Z3ZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTIwMzIyLi4wMDAwMDAwCi0tLSBhL3N0bC9fc3RyaW5nX2Z3ZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5NwotICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLQotI2lmbmRlZiBfU1RMUF9TVFJJTkdfRldEX0gKLSNkZWZpbmUgX1NUTFBfU1RSSU5HX0ZXRF9ICi0KLSNpZm5kZWYgX1NUTFBfSU9TRldECi0jICBpbmNsdWRlIDxpb3Nmd2Q+Ci0jZW5kaWYKLQotX1NUTFBfQkVHSU5fTkFNRVNQQUNFCi0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfTElNSVRFRF9ERUZBVUxUX1RFTVBMQVRFUykKLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsCi0gICAgICAgICAgY2xhc3MgX1RyYWl0cyA9IGNoYXJfdHJhaXRzPF9DaGFyVD4sCi0gICAgICAgICAgY2xhc3MgX0FsbG9jID0gYWxsb2NhdG9yPF9DaGFyVD4gPgotY2xhc3MgYmFzaWNfc3RyaW5nOwotI2Vsc2UKLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsCi0gICAgICAgICAgY2xhc3MgX1RyYWl0cywKLSAgICAgICAgICBjbGFzcyBfQWxsb2M+Ci1jbGFzcyBiYXNpY19zdHJpbmc7Ci0jZW5kaWYgLyogX1NUTFBfTElNSVRFRF9ERUZBVUxUX1RFTVBMQVRFUyAqLwotCi10eXBlZGVmIGJhc2ljX3N0cmluZzxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiwgYWxsb2NhdG9yPGNoYXI+ID4gc3RyaW5nOwotCi0jaWYgZGVmaW5lZCAoX1NUTFBfSEFTX1dDSEFSX1QpCi10eXBlZGVmIGJhc2ljX3N0cmluZzx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiwgYWxsb2NhdG9yPHdjaGFyX3Q+ID4gd3N0cmluZzsKLSNlbmRpZgotCi1fU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCi0KLS8vVGhpcyBmdW5jdGlvbiBsaW1pdHMgaGVhZGVyIGRlcGVuZGVuY3kgYmV0d2VlbiBleGNlcHRpb24gYW5kIHN0cmluZwotLy9pbXBsZW1lbnRhdGlvbi4gSXQgaXMgaW1wbGVtZW50ZWQgaW4gX3N0cmluZy5oCi1jb25zdCBjaGFyKiBfU1RMUF9DQUxMIF9fZ2V0X2Nfc3RyaW5nKGNvbnN0IHN0cmluZyYgX19zdHIpOwotCi1fU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKLQotX1NUTFBfRU5EX05BTUVTUEFDRQotCi0jZW5kaWYgLyogX1NUTFBfU1RSSU5HX0ZXRF9IICovCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX3N0cmluZ19oYXNoLmggYi9zdGwvX3N0cmluZ19oYXNoLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZjEzMzkuLjAwMDAwMDAKLS0tIGEvc3RsL19zdHJpbmdfaGFzaC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0xOTk5Ci0gKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0jaWZuZGVmIF9TVExQX1NUUklOR19IQVNIX0gKLSNkZWZpbmUgX1NUTFBfU1RSSU5HX0hBU0hfSAotCi0jaWZuZGVmIF9TVExQX0hBU0hfRlVOX0gKLSMgaW5jbHVkZSA8c3RsL19oYXNoX2Z1bi5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfU1RSSU5HX0gKLSMgaW5jbHVkZSA8c3RsL19zdHJpbmcuaD4KLSNlbmRpZgotCi1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgotX1NUTFBfSU5MSU5FX0xPT1Agc2l6ZV90Ci1fX3N0bF9zdHJpbmdfaGFzaChjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiYgX19zKSB7Ci0gIHVuc2lnbmVkIGxvbmcgX19oID0gMDsKLSAgc2l6ZV90IF9fbGVuID0gX19zLnNpemUoKTsKLSAgY29uc3QgX0NoYXJUKiBfX2RhdGEgPSBfX3MuZGF0YSgpOwotICBmb3IgKCBzaXplX3QgX19pID0gMDsgX19pIDwgX19sZW47ICsrX19pKQotICAgIF9faCA9IC8qIDUgKl9faCAqLyhfX2ggPDwgMikgKyBfX2ggKyBfX2RhdGFbX19pXTsKLSAgcmV0dXJuIHNpemVfdChfX2gpOwotfQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikKLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgotc3RydWN0IGhhc2g8YmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4gPiB7Ci0gIHNpemVfdCBvcGVyYXRvcigpKGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+JiBfX3MpIGNvbnN0Ci0gICAgeyByZXR1cm4gX19zdGxfc3RyaW5nX2hhc2goX19zKTsgfQotfTsKLQotI2Vsc2UKLQotX1NUTFBfVEVNUExBVEVfTlVMTAotc3RydWN0IF9TVExQX0NMQVNTX0RFQ0xTUEVDIGhhc2g8c3RyaW5nPiB7Ci0gIHNpemVfdCBvcGVyYXRvcigpKGNvbnN0IHN0cmluZyYgX19zKSBjb25zdAotICAgIHsgcmV0dXJuIF9fc3RsX3N0cmluZ19oYXNoKF9fcyk7IH0KLX07Ci0KLSMgIGlmIGRlZmluZWQgKF9TVExQX0hBU19XQ0hBUl9UKQotX1NUTFBfVEVNUExBVEVfTlVMTAotc3RydWN0IF9TVExQX0NMQVNTX0RFQ0xTUEVDIGhhc2g8d3N0cmluZz4gewotICBzaXplX3Qgb3BlcmF0b3IoKShjb25zdCB3c3RyaW5nJiBfX3MpIGNvbnN0Ci0gICAgeyByZXR1cm4gX19zdGxfc3RyaW5nX2hhc2goX19zKTsgfQotfTsKLSMgIGVuZGlmCi0KLSNlbmRpZiAvKiBfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OICovCi0KLV9TVExQX0VORF9OQU1FU1BBQ0UKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zdGwvX3N0cmluZ19zdW0uaCBiL3N0bC9fc3RyaW5nX3N1bS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGUxZTMxLi4wMDAwMDAwCi0tLSBhL3N0bC9fc3RyaW5nX3N1bS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDEzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMKLSAqIEZyYW5jb2lzIER1bW9udAotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0jaWZuZGVmIF9TVExQX1NUUklOR19TVU1fSAotI2RlZmluZSBfU1RMUF9TVFJJTkdfU1VNX0gKLQotX1NUTFBfQkVHSU5fTkFNRVNQQUNFCi0KLV9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKLQotLypjaGFyIHdyYXBwZXIgdG8gc2ltdWxhdGUgYmFzaWNfc3RyaW5nKi8KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+Ci1zdHJ1Y3QgX19jaGFyX3dyYXBwZXIgewotICB0eXBlZGVmIGNvbnN0IF9DaGFyVCYgY29uc3RfcmVmZXJlbmNlOwotCi0gIF9fY2hhcl93cmFwcGVyKF9DaGFyVCBfX3ZhbCkgOiBfVmFsKF9fdmFsKSB7fQotCi0gIF9DaGFyVCBnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIF9WYWw7IH0KLSAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiAxOyB9Ci0KLSAgY29uc3RfcmVmZXJlbmNlIG9wZXJhdG9yW10gKHNpemVfdCBfX24pIGNvbnN0IHsKLSAgICAvL1RvIGF2b2lkIGEgY2hlY2sgb24gX19uIHdlIHVzZSB0aGlzIHN0cmFuZ2UgaW1wbGVtZW50YXRpb24KLSAgICByZXR1cm4gKCZfVmFsKVtfX25dOwotICB9Ci0KLXByaXZhdGU6Ci0gIF9DaGFyVCBfVmFsOwotfTsKLQotLypDIHN0cmluZyB3cmFwcGVyIHRvIHNpbXVsYXRlIGJhc2ljX3N0cmluZyovCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgotc3RydWN0IF9fY3N0cl93cmFwcGVyIHsKLSAgdHlwZWRlZiBjb25zdCBfQ2hhclQmIGNvbnN0X3JlZmVyZW5jZTsKLQotICBfX2NzdHJfd3JhcHBlcihjb25zdCBfQ2hhclQgKl9fY3N0ciwgc2l6ZV90IF9fc2l6ZSkgOgotICAgIF9DU3RyKF9fY3N0ciksIF9TaXplKF9fc2l6ZSkge30KLQotICBjb25zdCBfQ2hhclQqIGNfc3RyKCkgY29uc3QgeyByZXR1cm4gX0NTdHI7IH0KLQotICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9TaXplOyB9Ci0KLSAgY29uc3RfcmVmZXJlbmNlIG9wZXJhdG9yW10gKHNpemVfdCBfX24pIGNvbnN0IHsgcmV0dXJuIF9DU3RyW19fbl07IH0KLQotcHJpdmF0ZToKLSAgY29uc3QgX0NoYXJUICpfQ1N0cjsKLSAgc2l6ZV90IF9TaXplOwotfTsKLQotLypiYXNpY19zdHJpbmcgd3JhcHBlciB0byBlbnN1cmUgdGhhdCB3ZSBvbmx5IHN0b3JlIGEgcmVmZXJlbmNlIHRvIHRoZSBvcmlnaW5hbCBzdHJpbmcgYW5kIG5vdCBjb3B5IGl0Ki8KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KLXN0cnVjdCBfX2JzdHJfd3JhcHBlciB7Ci0gIHR5cGVkZWYgY29uc3QgX0NoYXJUJiBjb25zdF9yZWZlcmVuY2U7Ci0gIHR5cGVkZWYgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiBfQlN0cmluZzsKLQotICBfX2JzdHJfd3JhcHBlciAoX0JTdHJpbmcgY29uc3QmIF9fcykgOgotICAgIF9CU3RyKF9fcykge30KLQotICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9CU3RyLnNpemUoKTsgfQotCi0gIGNvbnN0X3JlZmVyZW5jZSBvcGVyYXRvcltdIChzaXplX3QgX19uKSBjb25zdCB7IHJldHVybiBfQlN0cltfX25dOyB9Ci0KLSAgX0JTdHJpbmcgY29uc3QmIGJfc3RyKCkgY29uc3QgeyByZXR1cm4gX0JTdHI7IH0KLQotcHJpdmF0ZToKLSAgX0JTdHJpbmcgY29uc3QmIF9CU3RyOwotfTsKLQotc3RydWN0IF9fb25fbGVmdCB7fTsKLXN0cnVjdCBfX29uX3JpZ2h0IHt9OwotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2MsCi0gICAgICAgICAgY2xhc3MgX0xlZnQsIGNsYXNzIF9SaWdodCwKLSAgICAgICAgICBjbGFzcyBfU3RvcmFnZURpcmVjdGlvbj4KLWNsYXNzIF9fYnN0cl9zdW0gewotcHVibGljOgotICB0eXBlZGVmIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4gX0JTdHJpbmc7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0JTdHJpbmc6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9yZWZlcmVuY2U7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0JTdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOwotICB0eXBlZGVmIHR5cGVuYW1lIF9CU3RyaW5nOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0JTdHJpbmc6OnNpemVfdHlwZSBzaXplX3R5cGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0JTdHJpbmc6OmFsbG9jYXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOwotICB0eXBlZGVmIF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9MZWZ0LCBfUmlnaHQsIF9TdG9yYWdlRGlyZWN0aW9uPiBfU2VsZjsKLQotICBfX2JzdHJfc3VtIChfTGVmdCBjb25zdCYgbGhzLCBfUmlnaHQgY29uc3QmIHJocykgOgotICAgIF9saHMobGhzKSwgX3JocyhyaHMpIHt9Ci0KLSAgX0xlZnQgY29uc3QmIGdldExocygpIGNvbnN0IHsgcmV0dXJuIF9saHM7IH0KLSAgX1JpZ2h0IGNvbnN0JiBnZXRSaHMoKSBjb25zdCB7IHJldHVybiBfcmhzOyB9Ci0KLSAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IHsgcmV0dXJuIF9NX2dldF9zdG9yYWdlKGZhbHNlKS5nZXRfYWxsb2NhdG9yKCk7IH0KLQotICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIF9NX2dldF9zdG9yYWdlKCkuYmVnaW4oKTsgfQotICBjb25zdF9pdGVyYXRvciBlbmQoKSAgIGNvbnN0IHsgcmV0dXJuIF9NX2dldF9zdG9yYWdlKCkuZW5kKCk7IH0KLSAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBjb25zdCB7IHJldHVybiBfTV9nZXRfc3RvcmFnZSgpLnJiZWdpbigpOyB9Ci0gIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpICAgY29uc3QgeyByZXR1cm4gX01fZ2V0X3N0b3JhZ2UoKS5yZW5kKCk7IH0KLQotICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9saHMuc2l6ZSgpICsgX3Jocy5zaXplKCk7IH0KLSAgc2l6ZV90eXBlIGxlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIHNpemUoKTsgfQotCi0gIHNpemVfdCBtYXhfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX2dldF9zdG9yYWdlKCkubWF4X3NpemUoKTsgfQotICBzaXplX3R5cGUgY2FwYWNpdHkoKSBjb25zdCB7IHJldHVybiBzaXplKCk7IH0KLSAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIHNpemUoKSA9PSAwOyB9Ci0KLSAgY29uc3RfcmVmZXJlbmNlIG9wZXJhdG9yW10oc2l6ZV90IF9fbikgY29uc3QKLSAgeyByZXR1cm4gKF9fbiA8IF9saHMuc2l6ZSgpKT9fbGhzW19fbl06X3Joc1tfX24gLSBfbGhzLnNpemUoKV07IH0KLQotICBjb25zdF9yZWZlcmVuY2UgYXQoc2l6ZV90eXBlIF9fbikgY29uc3QKLSAgeyByZXR1cm4gX01fZ2V0X3N0b3JhZ2UoKS5hdChfX24pOyB9Ci0KLSAgLy9vcGVyYXRvciArPQotICB0eXBlZGVmIF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9TZWxmLCBfX2JzdHJfd3JhcHBlcjxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4sIF9fb25fbGVmdD4gX0JTdHJPbkxlZnQ7Ci0gIF9CU3RyT25MZWZ0IG9wZXJhdG9yICs9IChjb25zdCBfQlN0cmluZyYgX19zKSB7IHJldHVybiBhcHBlbmQoX19zKTsgfQotCi0gIHR5cGVkZWYgX19ic3RyX3N1bTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX1NlbGYsIF9fY3N0cl93cmFwcGVyPF9DaGFyVD4sIF9fb25fbGVmdD4gX0NTdHJPbkxlZnQ7Ci0gIF9DU3RyT25MZWZ0IG9wZXJhdG9yICs9IChjb25zdCBfQ2hhclQqIF9fcykgeyByZXR1cm4gYXBwZW5kKF9fcyk7IH0KLQotICB0eXBlZGVmIF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9TZWxmLCBfX2NoYXJfd3JhcHBlcjxfQ2hhclQ+LCBfX29uX2xlZnQ+IF9DaGFyT25MZWZ0OwotICBfQ2hhck9uTGVmdCBvcGVyYXRvciArPSAoX0NoYXJUIF9fYykgeyByZXR1cm4gX0NoYXJPbkxlZnQoKnRoaXMsIF9fYyk7IH0KLQotICAvL2FwcGVuZAotICBfQlN0ck9uTGVmdCBhcHBlbmQgKGNvbnN0IF9CU3RyaW5nJiBfX3MpCi0gIHsgcmV0dXJuIF9CU3RyT25MZWZ0KCp0aGlzLCBfX3MpOyB9Ci0gIF9CU3RyaW5nJiBhcHBlbmQoY29uc3QgX0JTdHJpbmcmIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKQotICB7IHJldHVybiBfTV9nZXRfc3RvcmFnZSgpLmFwcGVuZChfX3MsIF9fcG9zLCBfX24pOyB9Ci0gIF9DU3RyT25MZWZ0IGFwcGVuZChjb25zdCBfQ2hhclQqIF9fcykgewotICAgIGNvbnN0IHNpemVfdHlwZSBfX24gPSBfVHJhaXRzOjpsZW5ndGgoX19zKTsKLSAgICByZXR1cm4gX0NTdHJPbkxlZnQoKnRoaXMsIF9fY3N0cl93cmFwcGVyPF9DaGFyVD4oX19zLCBfX24pKTsKLSAgfQotICBfQ1N0ck9uTGVmdCBhcHBlbmQoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX24pCi0gIHsgcmV0dXJuIF9DU3RyT25MZWZ0KCp0aGlzLCBfX2NzdHJfd3JhcHBlcjxfQ2hhclQ+KF9fcywgX19uKSk7IH0KLSAgX0JTdHJpbmcmIGFwcGVuZChzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jKQotICB7cmV0dXJuIF9NX2dldF9zdG9yYWdlKCkuYXBwZW5kKF9fbiwgX19jKTt9Ci0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgotICBfQlN0cmluZyYgYXBwZW5kKF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QpCi0gIHtyZXR1cm4gX01fZ2V0X3N0b3JhZ2UoKS5hcHBlbmQoX19maXJzdCwgX19sYXN0KTt9Ci0KLSAgLy9hc3NpZ24KLSAgX0JTdHJpbmcmIGFzc2lnbihjb25zdCBfQlN0cmluZyYgX19zKSB7cmV0dXJuIF9NX2dldF9zdG9yYWdlKCkuYXNzaWduKF9fcyk7fQotICBfQlN0cmluZyYgYXNzaWduKGNvbnN0IF9CU3RyaW5nJiBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikge3JldHVybiBfTV9nZXRfc3RvcmFnZSgpLmFzc2lnbihfX3MsIF9fcG9zLCBfX24pO30KLSAgX0JTdHJpbmcmIGFzc2lnbihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbikge3JldHVybiBfTV9nZXRfc3RvcmFnZSgpLmFzc2lnbihfX3MsIF9fbik7fQotICBfQlN0cmluZyYgYXNzaWduKGNvbnN0IF9DaGFyVCogX19zKSB7cmV0dXJuIF9NX2dldF9zdG9yYWdlKCkuYXNzaWduKF9fcyk7IH0KLSAgX0JTdHJpbmcmIGFzc2lnbihzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jKSB7cmV0dXJuIF9NX2dldF9zdG9yYWdlKCkuYXNzaWduKF9fbiwgX19jKTt9Ci0KLSAgLy9pbnNlcnQKLSAgX0JTdHJpbmcmIGluc2VydChzaXplX3R5cGUgX19wb3MsIGNvbnN0IF9CU3RyaW5nJiBfX3MpIHtyZXR1cm4gX01fZ2V0X3N0b3JhZ2UoKS5pbnNlcnQoX19wb3MsIF9fcyk7fQotICBfQlN0cmluZyYgaW5zZXJ0KHNpemVfdHlwZSBfX3BvcywgY29uc3QgX0JTdHJpbmcmIF9fcywgc2l6ZV90eXBlIF9fYmVnLCBzaXplX3R5cGUgX19uKQotICB7cmV0dXJuIF9NX2dldF9zdG9yYWdlKCkuaW5zZXJ0KF9fcG9zLCBfX3MsIF9fYmVnLCBfX24pO30KLSAgX0JTdHJpbmcmIGluc2VydChzaXplX3R5cGUgX19wb3MsIGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uKSB7cmV0dXJuIF9NX2dldF9zdG9yYWdlKCkuaW5zZXJ0KF9fcG9zLCBfX3MsIF9fbik7fQotICBfQlN0cmluZyYgaW5zZXJ0KHNpemVfdHlwZSBfX3BvcywgY29uc3QgX0NoYXJUKiBfX3MpIHtyZXR1cm4gX01fZ2V0X3N0b3JhZ2UoKS5pbnNlcnQoX19wb3MsIF9fcyk7fQotICBfQlN0cmluZyYgaW5zZXJ0KHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYykge3JldHVybiBfTV9nZXRfc3RvcmFnZSgpLmluc2VydChfX3BvcywgX19uLCBfX2MpO30KLQotICAvL2VyYXNlCi0gIF9CU3RyaW5nJiBlcmFzZShzaXplX3R5cGUgX19wb3MgPSAwLCBzaXplX3R5cGUgX19uID1fQlN0cmluZzo6bnBvcykge3JldHVybiBfTV9nZXRfc3RvcmFnZSgpLmVyYXNlKF9fcG9zLCBfX24pO30KLQotICAvL3JlcGxhY2UKLSAgX0JTdHJpbmcmIHJlcGxhY2Uoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uLCBjb25zdCBfQlN0cmluZyYgX19zKQotICB7cmV0dXJuIF9NX2dldF9zdG9yYWdlKCkucmVwbGFjZShfX3BvcywgX19uLCBfX3MpO30KLSAgX0JTdHJpbmcmIHJlcGxhY2Uoc2l6ZV90eXBlIF9fcG9zMSwgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IF9CU3RyaW5nJiBfX3MsIHNpemVfdHlwZSBfX3BvczIsIHNpemVfdHlwZSBfX24yKQotICB7cmV0dXJuIF9NX2dldF9zdG9yYWdlKCkucmVwbGFjZShfX3BvczEsIF9fbjEsIF9fcywgX19wb3MyLCBfX24yKTt9Ci0gIF9CU3RyaW5nJiByZXBsYWNlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uMikKLSAge3JldHVybiBfTV9nZXRfc3RvcmFnZSgpLnJlcGxhY2UoX19wb3MsIF9fbjEsIF9fcywgX19uMik7fQotICBfQlN0cmluZyYgcmVwbGFjZShzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24xLCBjb25zdCBfQ2hhclQqIF9fcykKLSAge3JldHVybiBfTV9nZXRfc3RvcmFnZSgpLnJlcGxhY2UoX19wb3MsIF9fbjEsIF9fcyk7fQotICBfQlN0cmluZyYgcmVwbGFjZShzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24xLCBzaXplX3R5cGUgX19uMiwgX0NoYXJUIF9fYykKLSAge3JldHVybiBfTV9nZXRfc3RvcmFnZSgpLnJlcGxhY2UoX19wb3MsIF9fbjEsIF9fbjIsIF9fYyk7fQotCi0gIHNpemVfdHlwZSBjb3B5KF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdAotICB7cmV0dXJuIF9NX2dldF9zdG9yYWdlKCkuY29weShfX3MsIF9fbiwgX19wb3MpO30KLQotICB2b2lkIHN3YXAoX0JTdHJpbmcmIF9fcykKLSAge19NX2dldF9zdG9yYWdlKCkuc3dhcChfX3MpO30KLQotICBjb25zdCBfQ2hhclQqIGNfc3RyKCkgY29uc3QgeyByZXR1cm4gX01fZ2V0X3N0b3JhZ2UoKS5jX3N0cigpOyB9Ci0gIGNvbnN0IF9DaGFyVCogZGF0YSgpICBjb25zdCB7IHJldHVybiBfTV9nZXRfc3RvcmFnZSgpLmRhdGEoKTsgfQotCi0gIC8vZmluZCBmYW1pbHkKLSAgc2l6ZV90eXBlIGZpbmQoY29uc3QgX0JTdHJpbmcmIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QgeyByZXR1cm4gX01fZ2V0X3N0b3JhZ2UoKS5maW5kKF9fcywgX19wb3MpOyB9Ci0gIHNpemVfdHlwZSBmaW5kKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdCB7IHJldHVybiBfTV9nZXRfc3RvcmFnZSgpLmZpbmQoX19zLCBfX3Bvcyk7IH0KLSAgc2l6ZV90eXBlIGZpbmQoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgY29uc3QgeyByZXR1cm4gX01fZ2V0X3N0b3JhZ2UoKS5maW5kKF9fcywgX19wb3MsIF9fbik7IH0KLSAgc2l6ZV90eXBlIGZpbmQoX0NoYXJUIF9fYywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QgeyByZXR1cm4gX01fZ2V0X3N0b3JhZ2UoKS5maW5kKF9fYywgX19wb3MpOyB9Ci0KLSAgc2l6ZV90eXBlIHJmaW5kKGNvbnN0IF9CU3RyaW5nJiBfX3MsIHNpemVfdHlwZSBfX3BvcyA9IF9CU3RyaW5nOjpucG9zKSBjb25zdCB7IHJldHVybiBfTV9nZXRfc3RvcmFnZSgpLnJmaW5kKF9fcywgX19wb3MpOyB9Ci0gIHNpemVfdHlwZSByZmluZChjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gX0JTdHJpbmc6Om5wb3MpIGNvbnN0IHsgcmV0dXJuIF9NX2dldF9zdG9yYWdlKCkucmZpbmQoX19zLCBfX3Bvcyk7IH0KLSAgc2l6ZV90eXBlIHJmaW5kKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIGNvbnN0IHsgcmV0dXJuIF9NX2dldF9zdG9yYWdlKCkucmZpbmQoX19zLCBfX3BvcywgX19uKTsgfQotICBzaXplX3R5cGUgcmZpbmQoX0NoYXJUIF9fYywgc2l6ZV90eXBlIF9fcG9zID0gX0JTdHJpbmc6Om5wb3MpIGNvbnN0IHsgcmV0dXJuIF9NX2dldF9zdG9yYWdlKCkucmZpbmQoX19jLCBfX3Bvcyk7IH0KLQotICBzaXplX3R5cGUgZmluZF9maXJzdF9vZihjb25zdCBfQlN0cmluZyYgX19zLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdAotICB7IHJldHVybiBfTV9nZXRfc3RvcmFnZSgpLmZpbmRfZmlyc3Rfb2YoX19zLCBfX3Bvcyk7IH0KLSAgc2l6ZV90eXBlIGZpbmRfZmlyc3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0Ci0gIHsgcmV0dXJuIF9NX2dldF9zdG9yYWdlKCkuZmluZF9maXJzdF9vZihfX3MsIF9fcG9zKTsgfQotICBzaXplX3R5cGUgZmluZF9maXJzdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdAotICB7IHJldHVybiBfTV9nZXRfc3RvcmFnZSgpLmZpbmRfZmlyc3Rfb2YoX19zLCBfX3BvcywgX19uKTsgfQotICBzaXplX3R5cGUgZmluZF9maXJzdF9vZihfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdAotICB7IHJldHVybiBfTV9nZXRfc3RvcmFnZSgpLmZpbmQoX19jLCBfX3Bvcyk7IH0KLQotICBzaXplX3R5cGUgZmluZF9sYXN0X29mKGNvbnN0IF9CU3RyaW5nJiBfX3MsIHNpemVfdHlwZSBfX3BvcyA9IF9CU3RyaW5nOjpucG9zKSBjb25zdAotICB7IHJldHVybiBfTV9nZXRfc3RvcmFnZSgpLmZpbmRfbGFzdF9vZihfX3MsIF9fcG9zKTsgfQotICBzaXplX3R5cGUgZmluZF9sYXN0X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MgPSBfQlN0cmluZzo6bnBvcykgY29uc3QKLSAgeyByZXR1cm4gX01fZ2V0X3N0b3JhZ2UoKS5maW5kX2xhc3Rfb2YoX19zLCBfX3Bvcyk7IH0KLSAgc2l6ZV90eXBlIGZpbmRfbGFzdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdAotICB7IHJldHVybiBfTV9nZXRfc3RvcmFnZSgpLmZpbmRfbGFzdF9vZihfX3MsIF9fcG9zLCBfX24pOyB9Ci0gIHNpemVfdHlwZSBmaW5kX2xhc3Rfb2YoX0NoYXJUIF9fYywgc2l6ZV90eXBlIF9fcG9zID0gX0JTdHJpbmc6Om5wb3MpIGNvbnN0Ci0gIHsgcmV0dXJuIF9NX2dldF9zdG9yYWdlKCkucmZpbmQoX19jLCBfX3Bvcyk7IH0KLQotICBzaXplX3R5cGUgZmluZF9maXJzdF9ub3Rfb2YoY29uc3QgX0JTdHJpbmcmIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QKLSAgeyByZXR1cm4gX01fZ2V0X3N0b3JhZ2UoKS5maW5kX2ZpcnN0X25vdF9vZihfX3MsIF9fcG9zKTsgfQotICBzaXplX3R5cGUgZmluZF9maXJzdF9ub3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0Ci0gIHsgcmV0dXJuIF9NX2dldF9zdG9yYWdlKCkuZmluZF9maXJzdF9ub3Rfb2YoX19zLCBfX3Bvcyk7IH0KLSAgc2l6ZV90eXBlIGZpbmRfZmlyc3Rfbm90X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIGNvbnN0Ci0gIHsgcmV0dXJuIF9NX2dldF9zdG9yYWdlKCkuZmluZF9maXJzdF9ub3Rfb2YoX19zLCBfX3BvcywgX19uKTsgfQotICBzaXplX3R5cGUgZmluZF9maXJzdF9ub3Rfb2YoX0NoYXJUIF9fYywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QKLSAgeyByZXR1cm4gX01fZ2V0X3N0b3JhZ2UoKS5maW5kX2ZpcnN0X25vdF9vZihfX2MsIF9fcG9zKTsgfQotCi0gIHNpemVfdHlwZSBmaW5kX2xhc3Rfbm90X29mKGNvbnN0IF9CU3RyaW5nJiBfX3MsIHNpemVfdHlwZSBfX3BvcyA9IF9CU3RyaW5nOjpucG9zKSBjb25zdAotICB7IHJldHVybiBfTV9nZXRfc3RvcmFnZSgpLmZpbmRfbGFzdF9ub3Rfb2YoX19zLCBfX3Bvcyk7IH0KLSAgc2l6ZV90eXBlIGZpbmRfbGFzdF9ub3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3BvcyA9X0JTdHJpbmc6OiBucG9zKSBjb25zdAotICB7IHJldHVybiBfTV9nZXRfc3RvcmFnZSgpLmZpbmRfbGFzdF9ub3Rfb2YoX19zLCBfX3Bvcyk7IH0KLSAgc2l6ZV90eXBlIGZpbmRfbGFzdF9ub3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgY29uc3QKLSAgeyByZXR1cm4gX01fZ2V0X3N0b3JhZ2UoKS5maW5kX2xhc3Rfbm90X29mKF9fcywgX19wb3MsIF9fbik7IH0KLSAgc2l6ZV90eXBlIGZpbmRfbGFzdF9ub3Rfb2YoX0NoYXJUIF9fYywgc2l6ZV90eXBlIF9fcG9zID0gX0JTdHJpbmc6Om5wb3MpIGNvbnN0Ci0gIHsgcmV0dXJuIF9NX2dldF9zdG9yYWdlKCkuZmluZF9sYXN0X25vdF9vZihfX2MsIF9fcG9zKTsgfQotCi0gIF9CU3RyaW5nIHN1YnN0cihzaXplX3R5cGUgX19wb3MgPSAwLCBzaXplX3R5cGUgX19uID0gX0JTdHJpbmc6Om5wb3MpIGNvbnN0Ci0gIHsgcmV0dXJuIF9NX2dldF9zdG9yYWdlKCkuc3Vic3RyKF9fcG9zLCBfX24pOyB9Ci0KLSAgLy9jb21wYXJlCi0gIGludCBjb21wYXJlKGNvbnN0IF9CU3RyaW5nJiBfX3MpIGNvbnN0Ci0gIHsgcmV0dXJuIF9NX2dldF9zdG9yYWdlKCkuY29tcGFyZShfX3MpOyB9Ci0gIGludCBjb21wYXJlKHNpemVfdHlwZSBfX3BvczEsIHNpemVfdHlwZSBfX24xLCBjb25zdCBfU2VsZiYgX19zKSBjb25zdAotICB7IHJldHVybiBfTV9nZXRfc3RvcmFnZSgpLmNvbXBhcmUoX19wb3MxLCBfX24xLCBfX3MpOyB9Ci0gIGludCBjb21wYXJlKHNpemVfdHlwZSBfX3BvczEsIHNpemVfdHlwZSBfX24xLCBjb25zdCBfU2VsZiYgX19zLCBzaXplX3R5cGUgX19wb3MyLCBzaXplX3R5cGUgX19uMikgY29uc3QKLSAgeyByZXR1cm4gX01fZ2V0X3N0b3JhZ2UoKS5jb21wYXJlKF9fcG9zMSwgX19uMSwgX19zLCBfX3BvczIsIF9fbjIpOyB9Ci0gIGludCBjb21wYXJlKGNvbnN0IF9DaGFyVCogX19zKSBjb25zdAotICB7IHJldHVybiBfTV9nZXRfc3RvcmFnZSgpLmNvbXBhcmUoX19zKTsgfQotICBpbnQgY29tcGFyZShzaXplX3R5cGUgX19wb3MxLCBzaXplX3R5cGUgX19uMSwgY29uc3QgX0NoYXJUKiBfX3MpIGNvbnN0Ci0gIHsgcmV0dXJuIF9NX2dldF9zdG9yYWdlKCkuY29tcGFyZShfX3BvczEsIF9fbjEsIF9fcyk7IH0KLSAgaW50IGNvbXBhcmUoc2l6ZV90eXBlIF9fcG9zMSwgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uMikgY29uc3QKLSAgeyByZXR1cm4gX01fZ2V0X3N0b3JhZ2UoKS5jb21wYXJlKF9fcG9zMSwgX19uMSwgX19zLCBfX24yKTsgfQotCi0gIC8vUmV0dXJucyB0aGUgdW5kZXJseWluZyBiYXNpY19zdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHRlbXBsYXRlIGV4cHJlc3Npb24KLSAgLy9UaGUgbm9uIGNvbnN0IG1ldGhvZCB3aWxsIGFsd2F5cyBpbml0aWFsaXNlIGl0LgotICBfQlN0cmluZyYgX01fZ2V0X3N0b3JhZ2UoKQotICB7IHJldHVybiBfcmhzLl9NX2dldF9zdG9yYWdlKCp0aGlzLCBfU3RvcmFnZURpcmVjdGlvbigpKTsgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBfTGhzLCBjbGFzcyBfUmhzLCBjbGFzcyBfU3RvcmFnZURpcj4KLSAgX0JTdHJpbmcmIF9NX2dldF9zdG9yYWdlKF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9MaHMsIF9SaHMsIF9TdG9yYWdlRGlyPiAgY29uc3QmIF9fcmVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgX19vbl9sZWZ0IGNvbnN0JiAvKlN0b3JhZ2VEaXIqLykKLSAgeyByZXR1cm4gX2xocy5fTV9nZXRfc3RvcmFnZShfX3JlZik7IH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0xocywgY2xhc3MgX1JocywgY2xhc3MgX1N0b3JhZ2VEaXI+Ci0gIF9CU3RyaW5nJiBfTV9nZXRfc3RvcmFnZShfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfTGhzLCBfUmhzLCBfU3RvcmFnZURpcj4gIGNvbnN0JiBfX3JlZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fb25fcmlnaHQgY29uc3QmIC8qU3RvcmFnZURpciovKQotICB7IHJldHVybiBfcmhzLl9NX2dldF9zdG9yYWdlKF9fcmVmKTsgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBfTGhzLCBjbGFzcyBfUmhzLCBjbGFzcyBfU3RvcmFnZURpcj4KLSAgX0JTdHJpbmcmIF9NX2dldF9zdG9yYWdlKF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9MaHMsIF9SaHMsIF9TdG9yYWdlRGlyPiAgY29uc3QmIF9fcmVmKQotICB7IHJldHVybiBfTV9nZXRfc3RvcmFnZShfX3JlZiwgX1N0b3JhZ2VEaXJlY3Rpb24oKSk7IH0KLQotICAvL1RoZSBjb25zdCBtZXRob2QgY2FuIGJlIGludm9rZWQgd2l0aG91dCBpbml0aWFsaXNpbmcgdGhlIGJhc2ljX3N0cmluZyBzbyBhdm9pZGluZyBkeW5hbWljIGFsbG9jYXRpb24uCi0gIF9CU3RyaW5nIGNvbnN0JiBfTV9nZXRfc3RvcmFnZShib29sIF9fZG9faW5pdCA9IHRydWUpIGNvbnN0Ci0gIHsgcmV0dXJuIF9NX2dldF9zdG9yYWdlKCp0aGlzLCBfX2RvX2luaXQsIF9TdG9yYWdlRGlyZWN0aW9uKCkpOyB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIF9MaHMsIGNsYXNzIF9SaHMsIGNsYXNzIF9TdG9yYWdlRGlyPgotICBfQlN0cmluZyBjb25zdCYgX01fZ2V0X3N0b3JhZ2UoX19ic3RyX3N1bTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0xocywgX1JocywgX1N0b3JhZ2VEaXI+ICBjb25zdCYgX19yZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIF9fZG9faW5pdCwgX19vbl9sZWZ0IGNvbnN0JiAvKlN0b3JhZ2VEaXIqLykgY29uc3QKLSAgeyByZXR1cm4gX2xocy5fTV9nZXRfc3RvcmFnZShfX3JlZiwgX19kb19pbml0KTsgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBfTGhzLCBjbGFzcyBfUmhzLCBjbGFzcyBfU3RvcmFnZURpcj4KLSAgX0JTdHJpbmcgY29uc3QmIF9NX2dldF9zdG9yYWdlKF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9MaHMsIF9SaHMsIF9TdG9yYWdlRGlyPiAgY29uc3QmIF9fcmVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBfX2RvX2luaXQsIF9fb25fcmlnaHQgY29uc3QmIC8qU3RvcmFnZURpciovKSBjb25zdAotICB7IHJldHVybiBfcmhzLl9NX2dldF9zdG9yYWdlKF9fcmVmLCBfX2RvX2luaXQpOyB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIF9MaHMsIGNsYXNzIF9SaHMsIGNsYXNzIF9TdG9yYWdlRGlyPgotICBfQlN0cmluZyBjb25zdCYgX01fZ2V0X3N0b3JhZ2UoX19ic3RyX3N1bTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0xocywgX1JocywgX1N0b3JhZ2VEaXI+ICBjb25zdCYgX19yZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIF9fZG9faW5pdCkgY29uc3QKLSAgeyByZXR1cm4gX01fZ2V0X3N0b3JhZ2UoX19yZWYsIF9fZG9faW5pdCwgX1N0b3JhZ2VEaXJlY3Rpb24oKSk7IH0KLQotcHJpdmF0ZToKLSAgX0xlZnQgIF9saHM7Ci0gIF9SaWdodCBfcmhzOwotfTsKLQotLyoKLSAqIEZvciB0aGlzIG9wZXJhdG9yIHdlIGNob29zZSB0byB1c2UgdGhlIHJpZ2h0IHBhcnQgYXMgdGhlIHN0b3JhZ2UgcGFydAotICovCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2MsCi0gICAgICAgICAgY2xhc3MgX0xoMSwgY2xhc3MgX1JoMSwgY2xhc3MgX1N0b3JlRGlyMSwKLSAgICAgICAgICBjbGFzcyBfTGgyLCBjbGFzcyBfUmgyLCBjbGFzcyBfU3RvcmVEaXIyPgotaW5saW5lIF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsCi0gICAgICAgICAgICAgICAgICBfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfTGgxLCBfUmgxLCBfU3RvcmVEaXIxPiwKLSAgICAgICAgICAgICAgICAgIF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9MaDIsIF9SaDIsIF9TdG9yZURpcjI+LAotICAgICAgICAgICAgICAgICAgX19vbl9yaWdodD4gX1NUTFBfQ0FMTAotb3BlcmF0b3IgKyAoY29uc3QgX19ic3RyX3N1bTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0xoMSwgX1JoMSwgX1N0b3JlRGlyMT4gJl9fbGhzLAotICAgICAgICAgICAgY29uc3QgX19ic3RyX3N1bTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0xoMiwgX1JoMiwgX1N0b3JlRGlyMj4gJl9fcmhzKSB7Ci0gIHJldHVybiBfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLAotICAgICAgICAgICAgICAgICAgICBfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfTGgxLCBfUmgxLCBfU3RvcmVEaXIxPiwKLSAgICAgICAgICAgICAgICAgICAgX19ic3RyX3N1bTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0xoMiwgX1JoMiwgX1N0b3JlRGlyMj4sCi0gICAgICAgICAgICAgICAgICAgIF9fb25fcmlnaHQ+KF9fbGhzLCBfX3Jocyk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYywKLSAgICAgICAgICBjbGFzcyBfTGgxLCBjbGFzcyBfUmgxLCBjbGFzcyBfU3RvcmVEaXIxLAotICAgICAgICAgIGNsYXNzIF9MaDIsIGNsYXNzIF9SaDIsIGNsYXNzIF9TdG9yZURpcjI+Ci1pbmxpbmUgYm9vbCBfU1RMUF9DQUxMCi1vcGVyYXRvciA9PSAoY29uc3QgX19ic3RyX3N1bTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0xoMSwgX1JoMSwgX1N0b3JlRGlyMT4gJl9fbGhzLAotICAgICAgICAgICAgIGNvbnN0IF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9MaDIsIF9SaDIsIF9TdG9yZURpcjI+ICZfX3JocykKLXsgcmV0dXJuIChfX2xocy5zaXplKCkgPT0gX19yaHMuc2l6ZSgpKSAmJiAoX19saHMuX01fZ2V0X3N0b3JhZ2UoKSA9PSBfX3Jocy5fTV9nZXRfc3RvcmFnZSgpKTsgfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2MsCi0gICAgICAgICAgY2xhc3MgX0xoMSwgY2xhc3MgX1JoMSwgY2xhc3MgX1N0b3JlRGlyMSwKLSAgICAgICAgICBjbGFzcyBfTGgyLCBjbGFzcyBfUmgyLCBjbGFzcyBfU3RvcmVEaXIyPgotaW5saW5lIGJvb2wgX1NUTFBfQ0FMTAotb3BlcmF0b3IgPCAoY29uc3QgX19ic3RyX3N1bTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0xoMSwgX1JoMSwgX1N0b3JlRGlyMT4gJl9fbGhzLAotICAgICAgICAgICAgY29uc3QgX19ic3RyX3N1bTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0xoMiwgX1JoMiwgX1N0b3JlRGlyMj4gJl9fcmhzKQoteyByZXR1cm4gX19saHMuX01fZ2V0X3N0b3JhZ2UoKSA8IF9fcmhzLl9NX2dldF9zdG9yYWdlKCk7IH0KLQotI2lmZGVmIF9TVExQX1VTRV9TRVBBUkFURV9SRUxPUFNfTkFNRVNQQUNFCi0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYywKLSAgICAgICAgICBjbGFzcyBfTGgxLCBjbGFzcyBfUmgxLCBjbGFzcyBfU3RvcmVEaXIxLAotICAgICAgICAgIGNsYXNzIF9MaDIsIGNsYXNzIF9SaDIsIGNsYXNzIF9TdG9yZURpcjI+Ci1pbmxpbmUgYm9vbCBfU1RMUF9DQUxMCi1vcGVyYXRvciAhPSAoY29uc3QgX19ic3RyX3N1bTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0xoMSwgX1JoMSwgX1N0b3JlRGlyMT4gJl9fbGhzLAotICAgICAgICAgICAgIGNvbnN0IF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9MaDIsIF9SaDIsIF9TdG9yZURpcjI+ICZfX3JocykKLXsgcmV0dXJuICEoX19saHMgPT0gX19yaHMpOyB9Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYywKLSAgICAgICAgICBjbGFzcyBfTGgxLCBjbGFzcyBfUmgxLCBjbGFzcyBfU3RvcmVEaXIxLAotICAgICAgICAgIGNsYXNzIF9MaDIsIGNsYXNzIF9SaDIsIGNsYXNzIF9TdG9yZURpcjI+Ci1pbmxpbmUgYm9vbCBfU1RMUF9DQUxMCi1vcGVyYXRvciA+IChjb25zdCBfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfTGgxLCBfUmgxLCBfU3RvcmVEaXIxPiAmX19saHMsCi0gICAgICAgICAgICBjb25zdCBfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfTGgyLCBfUmgyLCBfU3RvcmVEaXIyPiAmX19yaHMpCi17IHJldHVybiBfX3JocyA8IF9fbGhzOyB9Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYywKLSAgICAgICAgICBjbGFzcyBfTGgxLCBjbGFzcyBfUmgxLCBjbGFzcyBfU3RvcmVEaXIxLAotICAgICAgICAgIGNsYXNzIF9MaDIsIGNsYXNzIF9SaDIsIGNsYXNzIF9TdG9yZURpcjI+Ci1pbmxpbmUgYm9vbCBfU1RMUF9DQUxMCi1vcGVyYXRvciA8PSAoY29uc3QgX19ic3RyX3N1bTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0xoMSwgX1JoMSwgX1N0b3JlRGlyMT4gJl9fbGhzLAotICAgICAgICAgICAgIGNvbnN0IF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9MaDIsIF9SaDIsIF9TdG9yZURpcjI+ICZfX3JocykKLXsgcmV0dXJuICEoX19yaHMgPCBfX2xocyk7IH0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jLAotICAgICAgICAgIGNsYXNzIF9MaDEsIGNsYXNzIF9SaDEsIGNsYXNzIF9TdG9yZURpcjEsCi0gICAgICAgICAgY2xhc3MgX0xoMiwgY2xhc3MgX1JoMiwgY2xhc3MgX1N0b3JlRGlyMj4KLWlubGluZSBib29sIF9TVExQX0NBTEwKLW9wZXJhdG9yID49IChjb25zdCBfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfTGgxLCBfUmgxLCBfU3RvcmVEaXIxPiAmX19saHMsCi0gICAgICAgICAgICAgY29uc3QgX19ic3RyX3N1bTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0xoMiwgX1JoMiwgX1N0b3JlRGlyMj4gJl9fcmhzKQoteyByZXR1cm4gIShfX2xocyA8IF9fcmhzKTsgfQotCi0jZW5kaWYgLyogX1NUTFBfVVNFX1NFUEFSQVRFX1JFTE9QU19OQU1FU1BBQ0UgKi8KLQotCi0vKgotICogVGhpcyBjbGFzcyB3aWxsIGJlIHVzZWQgdG8gc2ltdWxhdGUgYSB0ZW1wb3Jhcnkgc3RyaW5nIHRoYXQgaXMgcmVxdWlyZWQgZm9yCi0gKiBhIGNhbGwgdG8gdGhlIGNfc3RyIG1ldGhvZCBvbiB0aGUgX19ic3RyX3N1bSBjbGFzcy4KLSAqLwotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+Ci1zdHJ1Y3QgX19zdW1fc3RvcmFnZV9lbGVtIHsKLSAgdHlwZWRlZiBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+IF9CU3RyaW5nOwotCi0gIF9fc3VtX3N0b3JhZ2VfZWxlbShfQWxsb2MgX19hbGxvYykgOiBfTV9pbml0KGZhbHNlKSwgX01fc3RvcmFnZShfX2FsbG9jKQotICB7fQotCi0gIHRlbXBsYXRlIDxjbGFzcyBfTGVmdCwgY2xhc3MgX1JpZ2h0LCBjbGFzcyBfU3RvcmFnZURpcj4KLSAgdm9pZCBfTV9Jbml0KF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9MZWZ0LCBfUmlnaHQsIF9TdG9yYWdlRGlyPiAgY29uc3QmIF9fcmVmKSBjb25zdCB7Ci0gICAgaWYgKCFfTV9pbml0KSB7Ci0gICAgICBfTV9zdG9yYWdlID0gX19yZWY7Ci0gICAgICBfTV9pbml0ID0gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0xlZnQsIGNsYXNzIF9SaWdodCwgY2xhc3MgX1N0b3JhZ2VEaXI+Ci0gIF9CU3RyaW5nIGNvbnN0JiBfTV9nZXRfc3RvcmFnZShfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfTGVmdCwgX1JpZ2h0LCBfU3RvcmFnZURpcj4gIGNvbnN0JiBfX3JlZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgX19kb19pbml0KSBjb25zdCB7Ci0gICAgaWYgKF9fZG9faW5pdCkgewotICAgICAgX01fSW5pdChfX3JlZik7Ci0gICAgfQotICAgIHJldHVybiBfTV9zdG9yYWdlOwotICB9Ci0gIHRlbXBsYXRlIDxjbGFzcyBfTGVmdCwgY2xhc3MgX1JpZ2h0LCBjbGFzcyBfU3RvcmFnZURpcj4KLSAgX0JTdHJpbmcmIF9NX2dldF9zdG9yYWdlKF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9MZWZ0LCBfUmlnaHQsIF9TdG9yYWdlRGlyPiAgY29uc3QmIF9fcmVmKSB7Ci0gICAgX01fSW5pdChfX3JlZik7Ci0gICAgcmV0dXJuIF9NX3N0b3JhZ2U7Ci0gIH0KLQotICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KLSAgX0NoYXJUIGNvbnN0JiBvcGVyYXRvcltdKHNpemVfdCBfX24pIGNvbnN0Ci0gIHsgcmV0dXJuIF9fU1RBVElDX0NBU1QoX0NoYXJUKiwgMClbX19uXTsgfQotCi1wcml2YXRlOgotICBtdXRhYmxlIGJvb2wgX01faW5pdDsKLSAgbXV0YWJsZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+IF9NX3N0b3JhZ2U7Ci19OwotCi1fU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKLQotX1NUTFBfRU5EX05BTUVTUEFDRQotCi0jZW5kaWYgLypfU1RMUF9TVFJJTkdfU1VNX0gqLwpkaWZmIC0tZ2l0IGEvc3RsL19zdHJpbmdfc3VtX21ldGhvZHMuaCBiL3N0bC9fc3RyaW5nX3N1bV9tZXRob2RzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MmNlMTguLjAwMDAwMDAKLS0tIGEvc3RsL19zdHJpbmdfc3VtX21ldGhvZHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAzCi0gKiBGcmFuY29pcyBEdW1vbnQKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLQotLyoKLSAqIEFsbCB0aGUgbmVjZXNzYXJ5IG1ldGhvZHMgdXNlZCBmb3IgdGVtcGxhdGUgZXhwcmVzc2lvbnMgd2l0aCBiYXNpY19zdHJpbmcKLSAqIFRoaXMgZmlsZSBkbyBub3QgaGF2ZSB0byBiZSBtYWNybyBndWFyZGVkIGFzIGl0IGlzIG9ubHkgdXNlZCBpbiB0aGUgX3N0cmluZy5oCi0gKiBmaWxlIGFuZCBpdCBpcyBhIHBhcnQgb2YgdGhlIGJhc2ljX3N0cmluZyBkZWZpbml0aW9uLgotICovCi0KLXB1YmxpYzoKLSAgdGVtcGxhdGUgPGNsYXNzIF9MZWZ0LCBjbGFzcyBfUmlnaHQsIGNsYXNzIF9TdG9yYWdlRGlyPgotICBiYXNpY19zdHJpbmcoX1NUTFBfUFJJViBfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfTGVmdCwgX1JpZ2h0LCBfU3RvcmFnZURpcj4gY29uc3QmIF9fcykKLSAgICA6IF9TVExQX1NUUklOR19TVU1fQkFTRShfUmVzZXJ2ZV90KCksIF9fcy5zaXplKCksIF9fcy5nZXRfYWxsb2NhdG9yKCkpCi0gIHsgX01fYXBwZW5kX3N1bShfX3MpOyB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIF9MZWZ0LCBjbGFzcyBfUmlnaHQsIGNsYXNzIF9TdG9yYWdlRGlyPgotICBiYXNpY19zdHJpbmcoX1NUTFBfUFJJViBfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfTGVmdCwgX1JpZ2h0LCBfU3RvcmFnZURpcj4gY29uc3QmIF9fcywKLSAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbiA9IG5wb3MsCi0gICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKLSAgICA6IF9TVExQX1NUUklOR19TVU1fQkFTRShfUmVzZXJ2ZV90KCksIChfX3BvcyA8PSBfX3Muc2l6ZSgpKSA/ICgobWluKSAoX19uLCBfX3Muc2l6ZSgpIC0gX19wb3MpKSA6IDAsIF9fYSkgewotICAgIHNpemVfdHlwZSBfX3NpemUgPSBfX3Muc2l6ZSgpOwotICAgIGlmIChfX3BvcyA+IF9fc2l6ZSkKLSAgICAgIHRoaXMtPl9NX3Rocm93X291dF9vZl9yYW5nZSgpOwotICAgIGVsc2UKLSAgICAgIF9NX2FwcGVuZF9zdW1fcG9zKF9fcywgX19wb3MsIChtaW4pIChfX24sIF9fc2l6ZSAtIF9fcG9zKSk7Ci0gIH0KLQotcHJpdmF0ZToKLSAgX0NoYXJUKiBfTV9hcHBlbmRfZmFzdChfU1RMUF9QUklWIF9fY2hhcl93cmFwcGVyPF9DaGFyVD4gX19jLCBfQ2hhclQgKl9fYnVmKSB7Ci0gICAgX1NUTFBfU1REOjpfQ29weV9Db25zdHJ1Y3QoX19idWYsIF9fYy5nZXRWYWx1ZSgpKTsKLSAgICByZXR1cm4gX19idWYgKyAxOwotICB9Ci0gIF9DaGFyVCogX01fYXBwZW5kX2Zhc3QoX0NoYXJUIGNvbnN0KiBfX3MsIHNpemVfdHlwZSBfX3Nfc2l6ZSwgX0NoYXJUICpfX2J1ZikKLSAgeyByZXR1cm4gdW5pbml0aWFsaXplZF9jb3B5KF9fcywgX19zICsgX19zX3NpemUsIF9fYnVmKTsgfQotICBfQ2hhclQqIF9NX2FwcGVuZF9mYXN0KF9TVExQX1BSSVYgX19jc3RyX3dyYXBwZXI8X0NoYXJUPiBjb25zdCYgX19zLCBfQ2hhclQgKl9fYnVmKQotICB7IHJldHVybiBfTV9hcHBlbmRfZmFzdChfX3MuY19zdHIoKSwgX19zLnNpemUoKSwgX19idWYpOyB9Ci0gIF9DaGFyVCogX01fYXBwZW5kX2Zhc3QoX1NUTFBfUFJJViBfX2JzdHJfd3JhcHBlcjxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4gX19zLCBfQ2hhclQgKl9fYnVmKQotICB7IHJldHVybiBfTV9hcHBlbmRfZmFzdChfX3MuYl9zdHIoKSwgX19idWYpOyB9Ci0gIF9DaGFyVCogX01fYXBwZW5kX2Zhc3QoX1NlbGYgY29uc3QmIF9fcywgX0NoYXJUICpfX2J1ZikKLSAgeyByZXR1cm4gX01fYXBwZW5kX2Zhc3QoX19zLmRhdGEoKSwgX19zLnNpemUoKSwgX19idWYpOyB9Ci0gIF9DaGFyVCogX01fYXBwZW5kX2Zhc3QoX1NUTFBfUFJJViBfX3N1bV9zdG9yYWdlX2VsZW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+IGNvbnN0JiwgX0NoYXJUICpfX2J1ZikKLSAgeyByZXR1cm4gX19idWY7IH0KLSAgdGVtcGxhdGUgPGNsYXNzIF9MZWZ0LCBjbGFzcyBfUmlnaHQsIGNsYXNzIF9TdG9yYWdlRGlyPgotICBfQ2hhclQqIF9NX2FwcGVuZF9mYXN0KF9TVExQX1BSSVYgX19ic3RyX3N1bTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0xlZnQsIF9SaWdodCwgX1N0b3JhZ2VEaXI+IGNvbnN0JiBfX3MsIF9DaGFyVCAqX19idWYpCi0gIHsgcmV0dXJuIF9NX2FwcGVuZF9mYXN0KF9fcy5nZXRSaHMoKSwgX01fYXBwZW5kX2Zhc3QoX19zLmdldExocygpLCBfX2J1ZikpOyB9Ci0KLSAgX0NoYXJUKiBfTV9hcHBlbmRfZmFzdF9wb3MoX1NUTFBfUFJJViBfX2NoYXJfd3JhcHBlcjxfQ2hhclQ+IF9fYywgX0NoYXJUICpfX2J1Ziwgc2l6ZV90eXBlIC8qX19wb3MqLywgc2l6ZV90eXBlIF9fbikgewotICAgIGlmIChfX24gPT0gMCkKLSAgICAgIHJldHVybiBfX2J1ZjsKLSAgICBfU1RMUF9TVEQ6Ol9Db3B5X0NvbnN0cnVjdChfX2J1ZiwgX19jLmdldFZhbHVlKCkpOwotICAgIHJldHVybiBfX2J1ZiArIDE7Ci0gIH0KLSAgX0NoYXJUKiBfTV9hcHBlbmRfZmFzdF9wb3MoX0NoYXJUIGNvbnN0KiBfX3MsIHNpemVfdHlwZSBfX3Nfc2l6ZSwgX0NoYXJUICpfX2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKQotICB7IHJldHVybiB1bmluaXRpYWxpemVkX2NvcHkoX19zICsgX19wb3MsIF9fcyArIF9fcG9zICsgKG1pbikoX19uLCBfX3Nfc2l6ZSAtIF9fcG9zKSwgX19idWYpOyB9Ci0gIF9DaGFyVCogX01fYXBwZW5kX2Zhc3RfcG9zKF9TVExQX1BSSVYgX19jc3RyX3dyYXBwZXI8X0NoYXJUPiBjb25zdCYgX19zLCBfQ2hhclQgKl9fYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pCi0gIHsgcmV0dXJuIF9NX2FwcGVuZF9mYXN0X3BvcyhfX3MuY19zdHIoKSwgX19zLnNpemUoKSwgX19idWYsIF9fcG9zLCBfX24pOyB9Ci0gIF9DaGFyVCogX01fYXBwZW5kX2Zhc3RfcG9zKF9TVExQX1BSSVYgX19ic3RyX3dyYXBwZXI8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+IF9fcywgX0NoYXJUICpfX2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKQotICB7IHJldHVybiBfTV9hcHBlbmRfZmFzdF9wb3MoX19zLmJfc3RyKCksIF9fYnVmLCBfX3BvcywgX19uKTsgfQotICBfQ2hhclQqIF9NX2FwcGVuZF9mYXN0X3BvcyhfU2VsZiBjb25zdCYgX19zLCBfQ2hhclQgKl9fYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pCi0gIHsgcmV0dXJuIF9NX2FwcGVuZF9mYXN0X3BvcyhfX3MuZGF0YSgpLCBfX3Muc2l6ZSgpLCBfX2J1ZiwgX19wb3MsIF9fbik7IH0KLSAgX0NoYXJUKiBfTV9hcHBlbmRfZmFzdF9wb3MoX1NUTFBfUFJJViBfX3N1bV9zdG9yYWdlX2VsZW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+IGNvbnN0JiwgX0NoYXJUICpfX2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlLCBzaXplX3R5cGUpCi0gIHsgcmV0dXJuIF9fYnVmOyB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIF9MZWZ0LCBjbGFzcyBfUmlnaHQsIGNsYXNzIF9TdG9yYWdlRGlyPgotICBfQ2hhclQqIF9NX2FwcGVuZF9mYXN0X3BvcyhfU1RMUF9QUklWIF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9MZWZ0LCBfUmlnaHQsIF9TdG9yYWdlRGlyPiBjb25zdCYgX19zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ2hhclQgKl9fYnVmLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIHsKLSAgICBpZiAoX19uID09IDApIHsKLSAgICAgIHJldHVybiBfX2J1ZjsKLSAgICB9Ci0gICAgc2l6ZV90eXBlIF9fbGhzX3NpemUgPSBfX3MuZ2V0TGhzKCkuc2l6ZSgpOwotICAgIGlmIChfX3BvcyA8IF9fbGhzX3NpemUpIHsKLSAgICAgIGlmIChfX24gPCAoX19saHNfc2l6ZSAtIF9fcG9zKSkgewotICAgICAgICByZXR1cm4gX01fYXBwZW5kX2Zhc3RfcG9zKF9fcy5nZXRMaHMoKSwgX19idWYsIF9fcG9zLCBfX24pOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIF9NX2FwcGVuZF9mYXN0X3BvcyhfX3MuZ2V0UmhzKCksIF9NX2FwcGVuZF9mYXN0X3BvcyhfX3MuZ2V0TGhzKCksIF9fYnVmLCBfX3BvcywgX19uKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBfX24gLSAoX19saHNfc2l6ZSAtIF9fcG9zKSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBfTV9hcHBlbmRfZmFzdF9wb3MoX19zLmdldFJocygpLCBfX2J1ZiwgX19wb3MgLSBfX2xoc19zaXplLCBfX24pOwotICAgIH0KLSAgfQotCi0gIC8qIE5vdGU6IFdlIGFsd2F5cyBmb3JjZSB1c2Ugb2YgZHluYW1pYyBidWZmZXIgaWYgdGhlIHNob3J0IHN0cmluZyBvcHRpbSBvcHRpb24gaXMgYWN0aXZhdGVkCi0gICAqIHRvIGF2b2lkIGNvbXBsaWNhdGVkIGNvZGUgaWYgdGhlIGJhc2ljX3N0cmluZyB3YXMgaW5zdGFuY2lhdGVkIHdpdGggYSBub24gUE9EIHR5cGUuCi0gICAqIEluIHN1Y2ggYSBjYXNlIHdlIHNob3VsZCB1c2UgYXNzaWdubWVudCBmb3Igb2JqZWN0cyBpbiB0aGUgc3RhdGljIGFycmF5IHNvbWV0aGluZyB0aGF0IHdlCi0gICAqIGRvIG5vdCBkby4KLSAgICovCi0gIHNpemVfdHlwZSBfTV9nZXRfYWRkaXRpb25hbF9zaXplKHNpemVfdHlwZSBfX25ld19zaXplLCBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qX0NoYXJfSXNfUE9EKi8pIGNvbnN0IHsKLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNKQotICAgIC8vVG8gYXZvaWQgcHJvYmxlbSB3aXRoIHRoZSBzdHJpbmcgYXNzdW1wdGlvbnMsIG5ldmVyIGFsbG9jYXRlIGEgZHluYW1pYyBidWZmZXIgc21hbGxlciBvciBlcXVhbAotICAgIC8vdGhhbiB0aGUgc3RhdGljIG9uZToKLSAgICBpZiAoX19uZXdfc2l6ZSA8IF9CYXNlOjpfREVGQVVMVF9TSVpFICsgMSkKLSAgICAgIHJldHVybiAoX0Jhc2U6Ol9ERUZBVUxUX1NJWkUgKyAxKSAtIF9fbmV3X3NpemU7Ci0jZW5kaWYgLyogX1NUTFBfVVNFX1NIT1JUX1NUUklOR19PUFRJTSAqLwotICAgIHJldHVybiAwOwotICB9Ci0gIHNpemVfdHlwZSBfTV9nZXRfYWRkaXRpb25hbF9zaXplKHNpemVfdHlwZSwgY29uc3QgX190cnVlX3R5cGUmIC8qX0NoYXJfSXNfUE9EKi8pIGNvbnN0Ci0gIHsgcmV0dXJuIDA7IH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0xlZnQsIGNsYXNzIF9SaWdodCwgY2xhc3MgX1N0b3JhZ2VEaXI+Ci0gIF9TZWxmJiBfTV9hcHBlbmRfc3VtIChfU1RMUF9QUklWIF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9MZWZ0LCBfUmlnaHQsIF9TdG9yYWdlRGlyPiBjb25zdCYgX19zKSB7Ci0gICAgc2l6ZV90eXBlIF9fc19zaXplID0gX19zLnNpemUoKTsKLSAgICBpZiAoX19zX3NpemUgPT0gMCkKLSAgICAgIHJldHVybiAqdGhpczsKLSAgICBjb25zdCBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IHRoaXMtPnNpemUoKTsKLSAgICBpZiAoX19zX3NpemUgPiB0aGlzLT5tYXhfc2l6ZSgpIHx8IF9fb2xkX3NpemUgPiAodGhpcy0+bWF4X3NpemUoKSAtIF9fc19zaXplKSkKLSAgICAgIHRoaXMtPl9NX3Rocm93X2xlbmd0aF9lcnJvcigpOwotICAgIHNpemVfdHlwZSBfX29mZnNldF9zaXplID0gX01fZ2V0X2FkZGl0aW9uYWxfc2l6ZShfX29sZF9zaXplICsgX19zX3NpemUsIF9DaGFyX0lzX1BPRCgpKTsKLSAgICBpZiAoX19vbGRfc2l6ZSArIF9fc19zaXplICsgX19vZmZzZXRfc2l6ZSA+IHRoaXMtPmNhcGFjaXR5KCkpIHsKLSAgICAgIGNvbnN0IHNpemVfdHlwZSBfX2xlbiA9IF9fb2xkX3NpemUgKyBfX29mZnNldF9zaXplICsgKG1heCkoX19vbGRfc2l6ZSwgX19zX3NpemUpICsgMTsKLSAgICAgIHBvaW50ZXIgX19uZXdfc3RhcnQgPSB0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5hbGxvY2F0ZShfX2xlbik7Ci0gICAgICBwb2ludGVyIF9fbmV3X2ZpbmlzaCA9IF9fbmV3X3N0YXJ0OwotICAgICAgX1NUTFBfVFJZIHsKLSAgICAgICAgX19uZXdfZmluaXNoID0gdW5pbml0aWFsaXplZF9jb3B5KHRoaXMtPl9NX1N0YXJ0KCksIHRoaXMtPl9NX0ZpbmlzaCgpLCBfX25ld19zdGFydCk7Ci0gICAgICAgIF9fbmV3X2ZpbmlzaCA9IHRoaXMtPl9NX2FwcGVuZF9mYXN0KF9fcywgX19uZXdfZmluaXNoKTsKLSAgICAgICAgdGhpcy0+X01fY29uc3RydWN0X251bGwoX19uZXdfZmluaXNoKTsKLSAgICAgIH0KLSAgICAgIF9TVExQX1VOV0lORCgoX1NUTFBfU1REOjpfRGVzdHJveV9SYW5nZShfX25ld19zdGFydCxfX25ld19maW5pc2gpLAotICAgICAgICAgICAgICAgICAgIHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLmRlYWxsb2NhdGUoX19uZXdfc3RhcnQsX19sZW4pKSkKLSAgICAgIHRoaXMtPl9NX2Rlc3Ryb3lfcmFuZ2UoKTsKLSAgICAgIHRoaXMtPl9NX2RlYWxsb2NhdGVfYmxvY2soKTsKLSAgICAgIHRoaXMtPl9NX3Jlc2V0KF9fbmV3X3N0YXJ0LCBfX25ld19maW5pc2gsIF9fbmV3X3N0YXJ0ICsgX19sZW4pOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIF9NX2FwcGVuZF9zdW1fbm9fb3ZlcmZsb3coX19zLCAwLCBfX3Nfc2l6ZSk7Ci0gICAgfQotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBfTGVmdCwgY2xhc3MgX1JpZ2h0LCBjbGFzcyBfU3RvcmFnZURpcj4KLSAgX1NlbGYmIF9NX2FwcGVuZF9zdW1fcG9zKF9TVExQX1BSSVYgX19ic3RyX3N1bTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0xlZnQsIF9SaWdodCwgX1N0b3JhZ2VEaXI+IGNvbnN0JiBfX3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIHsKLSAgICBzaXplX3R5cGUgX19zX3NpemUgPSAobWluKShfX3Muc2l6ZSgpIC0gX19wb3MsIF9fbik7Ci0gICAgaWYgKF9fc19zaXplID09IDApCi0gICAgICByZXR1cm4gKnRoaXM7Ci0gICAgY29uc3Qgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSB0aGlzLT5zaXplKCk7Ci0gICAgaWYgKF9fc19zaXplID4gdGhpcy0+bWF4X3NpemUoKSB8fCBfX29sZF9zaXplID4gKHRoaXMtPm1heF9zaXplKCkgLSBfX3Nfc2l6ZSkpCi0gICAgICB0aGlzLT5fTV90aHJvd19sZW5ndGhfZXJyb3IoKTsKLSAgICBzaXplX3R5cGUgX19vZmZzZXRfc2l6ZSA9IF9NX2dldF9hZGRpdGlvbmFsX3NpemUoX19vbGRfc2l6ZSArIF9fc19zaXplLCBfQ2hhcl9Jc19QT0QoKSk7Ci0gICAgaWYgKF9fb2xkX3NpemUgKyBfX3Nfc2l6ZSArIF9fb2Zmc2V0X3NpemUgPiB0aGlzLT5jYXBhY2l0eSgpKSB7Ci0gICAgICBjb25zdCBzaXplX3R5cGUgX19sZW4gPSBfX29sZF9zaXplICsgX19vZmZzZXRfc2l6ZSArIChtYXgpKF9fb2xkX3NpemUsIF9fc19zaXplKSArIDE7Ci0gICAgICBwb2ludGVyIF9fbmV3X3N0YXJ0ID0gdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuYWxsb2NhdGUoX19sZW4pOwotICAgICAgcG9pbnRlciBfX25ld19maW5pc2ggPSBfX25ld19zdGFydDsKLSAgICAgIF9TVExQX1RSWSB7Ci0gICAgICAgIF9fbmV3X2ZpbmlzaCA9IHVuaW5pdGlhbGl6ZWRfY29weSh0aGlzLT5fTV9TdGFydCgpLCB0aGlzLT5fTV9GaW5pc2goKSwgX19uZXdfc3RhcnQpOwotICAgICAgICBfX25ld19maW5pc2ggPSBfTV9hcHBlbmRfZmFzdF9wb3MoX19zLCBfX25ld19maW5pc2gsIF9fcG9zLCBfX3Nfc2l6ZSk7Ci0gICAgICAgIHRoaXMtPl9NX2NvbnN0cnVjdF9udWxsKF9fbmV3X2ZpbmlzaCk7Ci0gICAgICB9Ci0gICAgICBfU1RMUF9VTldJTkQoKF9TVExQX1NURDo6X0Rlc3Ryb3lfUmFuZ2UoX19uZXdfc3RhcnQsX19uZXdfZmluaXNoKSwKLSAgICAgICAgICAgICAgICAgICB0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5kZWFsbG9jYXRlKF9fbmV3X3N0YXJ0LF9fbGVuKSkpCi0gICAgICB0aGlzLT5fTV9kZXN0cm95X3JhbmdlKCk7Ci0gICAgICB0aGlzLT5fTV9kZWFsbG9jYXRlX2Jsb2NrKCk7Ci0gICAgICB0aGlzLT5fTV9yZXNldChfX25ld19zdGFydCwgX19uZXdfZmluaXNoLCBfX25ld19zdGFydCArIF9fbGVuKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBfTV9hcHBlbmRfc3VtX25vX292ZXJmbG93KF9fcywgX19wb3MsIF9fc19zaXplKTsKLSAgICB9Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIF9MZWZ0LCBjbGFzcyBfUmlnaHQsIGNsYXNzIF9TdG9yYWdlRGlyPgotICB2b2lkIF9NX2FwcGVuZF9zdW1fbm9fb3ZlcmZsb3coX1NUTFBfUFJJViBfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfTGVmdCwgX1JpZ2h0LCBfU3RvcmFnZURpcj4gY29uc3QmIF9fcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgewotICAgIHBvaW50ZXIgX19maW5pc2ggPSB0aGlzLT5fTV9GaW5pc2goKTsKLSAgICBfTV9hcHBlbmRfZmFzdF9wb3MoX19zLCBfX2ZpbmlzaCArIDEsIF9fcG9zICsgMSwgX19uIC0gMSk7Ci0gICAgX1NUTFBfVFJZIHsKLSAgICAgIHRoaXMtPl9NX2NvbnN0cnVjdF9udWxsKF9fZmluaXNoICsgX19uKTsKLSAgICB9Ci0gICAgX1NUTFBfVU5XSU5EKHRoaXMtPl9NX2Rlc3Ryb3lfcHRyX3JhbmdlKF9fZmluaXNoICsgMSwgX19maW5pc2ggKyBfX24pKQotICAgIC8qIFRoZSBjYWxsIHRvIHRoZSB0cmFpdHM6OmFzc2lnbiBtZXRob2QgaXMgb25seSBpbXBvcnRhbnQgZm9yIG5vbiBQT0QgdHlwZXMgYmVjYXVzZSB0aGUgaW5zdGFuY2UKLSAgICAgKiBwb2ludGVkIHRvIGJ5IF9NX2ZpbmlzaCBoYXMgYmVlbiBjb25zdHJ1Y3RlZCAoZGVmYXVsdCBjb25zdHJ1Y3RvcikgYW5kIHNob3VsZCBub3QgYmUgY29uc3RydWN0ZWQKLSAgICAgKiAoY29weSBjb25zdHJ1Y3Rvcikgb25jZSBhZ2Fpbi4gRm9yIFBPRCBpdCBpcyBpcnJlbGV2YW50LCB1bmluaXRpYWxpemVkX2NvcHkgY291bGQgYmUgZmluZSwKLSAgICAgKiBidXQgd2UgYXJlIG5vdCBnb2luZyB0byBtYWtlIHR3byBpbXBsZW1lbnRhdGlvbnMganVzdCBmb3IgdGhhdC4KLSAgICAgKi8KLSAgICBfVHJhaXRzOjphc3NpZ24oKnRoaXMtPl9NX2ZpbmlzaCwgX19zW19fcG9zXSk7Ci0gICAgdGhpcy0+X01fZmluaXNoICs9IF9fbjsKLSAgfQpkaWZmIC0tZ2l0IGEvc3RsL19zdHJpbmdfd29ya2Fyb3VuZC5oIGIvc3RsL19zdHJpbmdfd29ya2Fyb3VuZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2Q1ZDNkLi4wMDAwMDAwCi0tLSBhL3N0bC9fc3RyaW5nX3dvcmthcm91bmQuaAorKysgL2Rldi9udWxsCkBAIC0xLDczMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA0Ci0gKiBGcmFuY29pcyBEdW1vbnQKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLQotLy9JbmNsdWRlZCBmcm9tIF9zdHJpbmcuaCwgbm8gbmVlZCBmb3IgbWFjcm8gZ3VhcmRpbmcuCi0KLV9TVExQX0JFR0lOX05BTUVTUEFDRQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpCi0jICBkZWZpbmUgYmFzaWNfc3RyaW5nIF9TVExQX05PTl9EQkdfTkFNRShzdHIpCi1fU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCi0jZW5kaWYKLQotI2RlZmluZSBfU1RMUF9OT19NRU1fVF9TVFJJTkdfQkFTRSBfU1RMUF9QUklWIF9TVExQX05PX01FTV9UX05BTUUoc3RyKTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4KLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgotY2xhc3MgYmFzaWNfc3RyaW5nIDogcHVibGljIF9TVExQX05PX01FTV9UX1NUUklOR19CQVNFCi0jaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKSAmJiBcCi0gICAgIWRlZmluZWQgKGJhc2ljX3N0cmluZykKLSAgICAgICAgICAgICAgICAgICAsIHB1YmxpYyBfX3N0bHBvcnRfY2xhc3M8YmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiA+Ci0jZW5kaWYKLXsKLXByb3RlY3RlZDogICAgICAgICAgICAgICAgICAgICAgICAvLyBQcm90ZWN0ZWQgbWVtYmVycyBpbmhlcml0ZWQgZnJvbSBiYXNlLgotICB0eXBlZGVmIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4gX1NlbGY7Ci0gIHR5cGVkZWYgX1NUTFBfTk9fTUVNX1RfU1RSSU5HX0JBU0UgX0Jhc2U7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Ol9DaGFyX0lzX1BPRCBfQ2hhcl9Jc19QT0Q7Ci0KLXB1YmxpYzoKLQotICBfX0lNUE9SVF9XSVRIX1JFVkVSU0VfSVRFUkFUT1JTKF9CYXNlKQotCi0gIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Ol9JdGVyYXRvcl9jYXRlZ29yeSBfSXRlcmF0b3JfY2F0ZWdvcnk7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnRyYWl0c190eXBlIHRyYWl0c190eXBlOwotICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpfUmVzZXJ2ZV90IF9SZXNlcnZlX3Q7Ci0KLXB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29uc3RydWN0b3IsIGRlc3RydWN0b3IsIGFzc2lnbm1lbnQuCi0gIGV4cGxpY2l0IGJhc2ljX3N0cmluZyhjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKLSAgICA6IF9TVExQX05PX01FTV9UX1NUUklOR19CQVNFKF9fYSkge30KLQotICBiYXNpY19zdHJpbmcoX1Jlc2VydmVfdCBfX3IsIHNpemVfdCBfX24sCi0gICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKLSAgICA6IF9TVExQX05PX01FTV9UX1NUUklOR19CQVNFKF9fciwgX19uLCBfX2EpIHt9Ci0KLSAgYmFzaWNfc3RyaW5nKGNvbnN0IF9TZWxmJiBfX3MpCi0gICAgOiBfU1RMUF9OT19NRU1fVF9TVFJJTkdfQkFTRShfX3MpIHt9Ci0KLSAgYmFzaWNfc3RyaW5nKGNvbnN0IF9TZWxmJiBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbiA9IG5wb3MsCi0gICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKLSAgICA6IF9TVExQX05PX01FTV9UX1NUUklOR19CQVNFKF9fcywgX19wb3MsIF9fbiwgX19hKSB7fQotCi0gIGJhc2ljX3N0cmluZyhjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbiwKLSAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQotICAgIDogX1NUTFBfTk9fTUVNX1RfU1RSSU5HX0JBU0UoX19zLCBfX24sIF9fYSkge30KLQotICBiYXNpY19zdHJpbmcoY29uc3QgX0NoYXJUKiBfX3MsCi0gICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKLSAgICA6IF9TVExQX05PX01FTV9UX1NUUklOR19CQVNFKF9fcywgX19hKSB7fQotCi0gIGJhc2ljX3N0cmluZyhzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jLAotICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCi0gICAgOiBfU1RMUF9OT19NRU1fVF9TVFJJTkdfQkFTRShfX24sIF9fYywgX19hKSB7fQotCi0gIGJhc2ljX3N0cmluZyhfX21vdmVfc291cmNlPF9TZWxmPiBzcmMpCi0gICAgOiBfU1RMUF9OT19NRU1fVF9TVFJJTkdfQkFTRShfX21vdmVfc291cmNlPF9CYXNlPihzcmMuZ2V0KCkpKSB7fQotCi0gIC8vIENoZWNrIHRvIHNlZSBpZiBfSW5wdXRJdGVyYXRvciBpcyBhbiBpbnRlZ2VyIHR5cGUuICBJZiBzbywgdGhlbgotICAvLyBpdCBjYW4ndCBiZSBhbiBpdGVyYXRvci4KLSNpZiAhKGRlZmluZWQoX19NUkNfXykgfHwgKGRlZmluZWQoX19TQ19fKSAmJiAhZGVmaW5lZChfX0RNQ19fKSkpIC8vKnR5IDA0LzMwLzIwMDEgLSBtcHcgY29tcGlsZXJzIGNob2tlIG9uIHRoaXMgY3RvcgotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Ci0gIGJhc2ljX3N0cmluZyhfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwKLSAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlICYgX19hIF9TVExQX0FMTE9DQVRPUl9UWVBFX0RGTCkKLSAgICA6IF9TVExQX05PX01FTV9UX1NUUklOR19CQVNFKF9CYXNlOjpfQ2FsbGVkRnJvbVdvcmthcm91bmRfdCgpLCBfX2EpIHsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0ludGVncmFsPF9JbnB1dEl0ZXJhdG9yPjo6X1JldCBfSW50ZWdyYWw7Ci0gICAgX01faW5pdGlhbGl6ZV9kaXNwYXRjaChfX2YsIF9fbCwgX0ludGVncmFsKCkpOwotICB9Ci0jICBpZiBkZWZpbmVkIChfU1RMUF9ORUVEU19FWFRSQV9URU1QTEFURV9DT05TVFJVQ1RPUlMpCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KLSAgYmFzaWNfc3RyaW5nKF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sKQotICAgIDogX1NUTFBfTk9fTUVNX1RfU1RSSU5HX0JBU0UoX0Jhc2U6Ol9DYWxsZWRGcm9tV29ya2Fyb3VuZF90KCksIGFsbG9jYXRvcl90eXBlKCkpIHsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0ludGVncmFsPF9JbnB1dEl0ZXJhdG9yPjo6X1JldCBfSW50ZWdyYWw7Ci0gICAgX01faW5pdGlhbGl6ZV9kaXNwYXRjaChfX2YsIF9fbCwgX0ludGVncmFsKCkpOwotICB9Ci0jICBlbmRpZgotI2VuZGlmIC8qICFfX01SQ19fIHx8IChfX1NDX18gJiYgIV9fRE1DX18pICovCi0KLSAgX1NlbGYmIG9wZXJhdG9yPShjb25zdCBfU2VsZiYgX19zKSB7Ci0gICAgX0Jhc2U6Om9wZXJhdG9yPShfX3MpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIF9TZWxmJiBvcGVyYXRvcj0oY29uc3QgX0NoYXJUKiBfX3MpIHsKLSAgICBfQmFzZTo6b3BlcmF0b3I9KF9fcyk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgX1NlbGYmIG9wZXJhdG9yPShfQ2hhclQgX19jKSB7Ci0gICAgX0Jhc2U6Om9wZXJhdG9yPShfX2MpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi1wcml2YXRlOgotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcj4KLSAgdm9pZCBfTV9yYW5nZV9pbml0aWFsaXplKF9JbnB1dEl0ZXIgX19mLCBfSW5wdXRJdGVyIF9fbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0X2l0ZXJhdG9yX3RhZyAmX190YWcpIHsKLSAgICB0aGlzLT5fTV9hbGxvY2F0ZV9ibG9jaygpOwotICAgIHRoaXMtPl9NX2NvbnN0cnVjdF9udWxsKHRoaXMtPl9NX0ZpbmlzaCgpKTsKLSAgICBfU1RMUF9UUlkgewotICAgICAgX01fYXBwZW5kVChfX2YsIF9fbCwgX190YWcpOwotICAgIH0KLSAgICBfU1RMUF9VTldJTkQodGhpcy0+X01fZGVzdHJveV9yYW5nZSgpKQotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcj4KLSAgdm9pZCBfTV9yYW5nZV9pbml0aWFsaXplKF9Gb3J3YXJkSXRlciBfX2YsIF9Gb3J3YXJkSXRlciBfX2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3J3YXJkX2l0ZXJhdG9yX3RhZyAmKSB7Ci0gICAgZGlmZmVyZW5jZV90eXBlIF9fbiA9IGRpc3RhbmNlKF9fZiwgX19sKTsKLSAgICB0aGlzLT5fTV9hbGxvY2F0ZV9ibG9jayhfX24gKyAxKTsKLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNKQotICAgIGlmICh0aGlzLT5fTV91c2luZ19zdGF0aWNfYnVmKCkpIHsKLSAgICAgIF9NX2NvcHlUKF9fZiwgX19sLCB0aGlzLT5fTV9TdGFydCgpKTsKLSAgICAgIHRoaXMtPl9NX2ZpbmlzaCA9IHRoaXMtPl9NX1N0YXJ0KCkgKyBfX247Ci0gICAgfQotICAgIGVsc2UKLSNlbmRpZiAvKiBfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNICovCi0gICAgdGhpcy0+X01fZmluaXNoID0gdW5pbml0aWFsaXplZF9jb3B5KF9fZiwgX19sLCB0aGlzLT5fTV9TdGFydCgpKTsKLSAgICB0aGlzLT5fTV90ZXJtaW5hdGVfc3RyaW5nKCk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcj4KLSAgdm9pZCBfTV9yYW5nZV9pbml0aWFsaXplVChfSW5wdXRJdGVyIF9fZiwgX0lucHV0SXRlciBfX2wpIHsKLSAgICBfTV9yYW5nZV9pbml0aWFsaXplKF9fZiwgX19sLCBfU1RMUF9JVEVSQVRPUl9DQVRFR09SWShfX2YsIF9JbnB1dEl0ZXIpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW50ZWdlcj4KLSAgdm9pZCBfTV9pbml0aWFsaXplX2Rpc3BhdGNoKF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX194LCBjb25zdCBfX3RydWVfdHlwZSYgLypfSW50ZWdyYWwqLykgewotICAgIHRoaXMtPl9NX2FsbG9jYXRlX2Jsb2NrKF9fbiArIDEpOwotI2lmIGRlZmluZWQgKF9TVExQX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0pCi0gICAgaWYgKHRoaXMtPl9NX3VzaW5nX3N0YXRpY19idWYoKSkgewotICAgICAgX1RyYWl0czo6YXNzaWduKHRoaXMtPl9NX1N0YXJ0KCksIF9fbiwgX194KTsKLSAgICAgIHRoaXMtPl9NX2ZpbmlzaCA9IHRoaXMtPl9NX1N0YXJ0KCkgKyBfX247Ci0gICAgfQotICAgIGVsc2UKLSNlbmRpZiAvKiBfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNICovCi0gICAgdGhpcy0+X01fZmluaXNoID0gdW5pbml0aWFsaXplZF9maWxsX24odGhpcy0+X01fU3RhcnQoKSwgX19uLCBfX3gpOwotICAgIHRoaXMtPl9NX3Rlcm1pbmF0ZV9zdHJpbmcoKTsKLSAgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgotICB2b2lkIF9NX2luaXRpYWxpemVfZGlzcGF0Y2goX0lucHV0SXRlciBfX2YsIF9JbnB1dEl0ZXIgX19sLCBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qX0ludGVncmFsKi8pIHsKLSAgICBfTV9yYW5nZV9pbml0aWFsaXplVChfX2YsIF9fbCk7Ci0gIH0KLQotcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBcHBlbmQsIG9wZXJhdG9yKz0sIHB1c2hfYmFjay4KLSAgX1NlbGYmIG9wZXJhdG9yKz0oY29uc3QgX1NlbGYmIF9fcykgewotICAgIF9CYXNlOjpvcGVyYXRvcis9KF9fcyk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIF9TZWxmJiBvcGVyYXRvcis9KGNvbnN0IF9DaGFyVCogX19zKSB7Ci0gICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKLSAgICBfQmFzZTo6b3BlcmF0b3IrPShfX3MpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotICBfU2VsZiYgb3BlcmF0b3IrPShfQ2hhclQgX19jKSB7Ci0gICAgX0Jhc2U6Om9wZXJhdG9yKz0oX19jKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBfU2VsZiYgYXBwZW5kKGNvbnN0IF9TZWxmJiBfX3MpIHsKLSAgICBfQmFzZTo6YXBwZW5kKF9fcyk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgX1NlbGYmIGFwcGVuZChjb25zdCBfU2VsZiYgX19zLAotICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgewotICAgIF9CYXNlOjphcHBlbmQoX19zLCBfX3BvcywgX19uKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBfU2VsZiYgYXBwZW5kKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uKSB7Ci0gICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKLSAgICBfQmFzZTo6YXBwZW5kKF9fcywgX19uKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgX1NlbGYmIGFwcGVuZChjb25zdCBfQ2hhclQqIF9fcykgewotICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCi0gICAgX0Jhc2U6OmFwcGVuZChfX3MpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotICBfU2VsZiYgYXBwZW5kKHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MpIHsKLSAgICBfQmFzZTo6YXBwZW5kKF9fbiwgX19jKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICAvLyBDaGVjayB0byBzZWUgaWYgX0lucHV0SXRlcmF0b3IgaXMgYW4gaW50ZWdlciB0eXBlLiAgSWYgc28sIHRoZW4KLSAgLy8gaXQgY2FuJ3QgYmUgYW4gaXRlcmF0b3IuCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgotICBfU2VsZiYgYXBwZW5kKF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QpIHsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0ludGVncmFsPF9JbnB1dEl0ZXI+OjpfUmV0IF9JbnRlZ3JhbDsKLSAgICByZXR1cm4gX01fYXBwZW5kX2Rpc3BhdGNoKF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOwotICB9Ci0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTUVUSE9EX1NQRUNJQUxJWkFUSU9OKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKLSAgLy9TZWUgZXF1aXZhbGVudCBhc3NpZ24gbWV0aG9kIHJlbWFyay4KLSAgX1NlbGYmIGFwcGVuZChjb25zdCBfQ2hhclQqIF9fZiwgY29uc3QgX0NoYXJUKiBfX2wpIHsKLSAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19mKV9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2wpCi0gICAgX0Jhc2U6OmFwcGVuZChfX2YsIF9fbCk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0jZW5kaWYKLQotcHJpdmF0ZTogICAgICAgICAgICAgICAgICAgICAgICAvLyBIZWxwZXIgZnVuY3Rpb25zIGZvciBhcHBlbmQuCi0KLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXI+Ci0gIF9TZWxmJiBfTV9hcHBlbmRUKF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgaW5wdXRfaXRlcmF0b3JfdGFnICYpIHsKLSAgICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0IDsgKytfX2ZpcnN0KQotICAgICAgX0Jhc2U6OnB1c2hfYmFjaygqX19maXJzdCk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcj4KLSAgX1NlbGYmIF9NX2FwcGVuZFQoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcndhcmRfaXRlcmF0b3JfdGFnICYpICB7Ci0gICAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KSB7Ci0gICAgICBjb25zdCBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IHRoaXMtPnNpemUoKTsKLSAgICAgIGRpZmZlcmVuY2VfdHlwZSBfX24gPSBkaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QpOwotICAgICAgaWYgKF9fU1RBVElDX0NBU1Qoc2l6ZV90eXBlLF9fbikgPiBtYXhfc2l6ZSgpIHx8IF9fb2xkX3NpemUgPiBtYXhfc2l6ZSgpIC0gX19TVEFUSUNfQ0FTVChzaXplX3R5cGUsX19uKSkKLSAgICAgICAgdGhpcy0+X01fdGhyb3dfbGVuZ3RoX2Vycm9yKCk7Ci0gICAgICBpZiAoX19vbGRfc2l6ZSArIF9fbiA+IGNhcGFjaXR5KCkpIHsKLSAgICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fbGVuID0gX19vbGRfc2l6ZSArCi0gICAgICAgICAgKG1heCkoX19vbGRfc2l6ZSwgX19TVEFUSUNfQ0FTVChzaXplX3R5cGUsX19uKSkgKyAxOwotICAgICAgICBwb2ludGVyIF9fbmV3X3N0YXJ0ID0gdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuYWxsb2NhdGUoX19sZW4pOwotICAgICAgICBwb2ludGVyIF9fbmV3X2ZpbmlzaCA9IF9fbmV3X3N0YXJ0OwotICAgICAgICBfU1RMUF9UUlkgewotICAgICAgICAgIF9fbmV3X2ZpbmlzaCA9IHVuaW5pdGlhbGl6ZWRfY29weSh0aGlzLT5fTV9TdGFydCgpLCB0aGlzLT5fTV9GaW5pc2goKSwgX19uZXdfc3RhcnQpOwotICAgICAgICAgIF9fbmV3X2ZpbmlzaCA9IHVuaW5pdGlhbGl6ZWRfY29weShfX2ZpcnN0LCBfX2xhc3QsIF9fbmV3X2ZpbmlzaCk7Ci0gICAgICAgICAgX01fY29uc3RydWN0X251bGwoX19uZXdfZmluaXNoKTsKLSAgICAgICAgfQotICAgICAgICBfU1RMUF9VTldJTkQoKF9TVExQX1NURDo6X0Rlc3Ryb3lfUmFuZ2UoX19uZXdfc3RhcnQsX19uZXdfZmluaXNoKSwKLSAgICAgICAgICB0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5kZWFsbG9jYXRlKF9fbmV3X3N0YXJ0LF9fbGVuKSkpCi0gICAgICAgICAgdGhpcy0+X01fZGVzdHJveV9yYW5nZSgpOwotICAgICAgICB0aGlzLT5fTV9kZWFsbG9jYXRlX2Jsb2NrKCk7Ci0gICAgICAgIHRoaXMtPl9NX3Jlc2V0KF9fbmV3X3N0YXJ0LCBfX25ld19maW5pc2gsIF9fbmV3X3N0YXJ0ICsgX19sZW4pOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIF9Gb3J3YXJkSXRlciBfX2YxID0gX19maXJzdDsKLSAgICAgICAgKytfX2YxOwotI2lmIGRlZmluZWQgKF9TVExQX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0pCi0gICAgICAgIGlmICh0aGlzLT5fTV91c2luZ19zdGF0aWNfYnVmKCkpCi0gICAgICAgICAgX01fY29weVQoX19mMSwgX19sYXN0LCB0aGlzLT5fTV9GaW5pc2goKSArIDEpOwotICAgICAgICBlbHNlCi0jZW5kaWYgLyogX1NUTFBfVVNFX1NIT1JUX1NUUklOR19PUFRJTSAqLwotICAgICAgICAgIHVuaW5pdGlhbGl6ZWRfY29weShfX2YxLCBfX2xhc3QsIHRoaXMtPl9NX0ZpbmlzaCgpICsgMSk7Ci0gICAgICAgIF9TVExQX1RSWSB7Ci0gICAgICAgICAgdGhpcy0+X01fY29uc3RydWN0X251bGwodGhpcy0+X01fRmluaXNoKCkgKyBfX24pOwotICAgICAgICB9Ci0gICAgICAgIF9TVExQX1VOV0lORCh0aGlzLT5fTV9kZXN0cm95X3B0cl9yYW5nZSh0aGlzLT5fTV9GaW5pc2goKSArIDEsIHRoaXMtPl9NX0ZpbmlzaCgpICsgX19uKSkKLSAgICAgICAgX1RyYWl0czo6YXNzaWduKCp0aGlzLT5fTV9maW5pc2gsICpfX2ZpcnN0KTsKLSAgICAgICAgdGhpcy0+X01fZmluaXNoICs9IF9fbjsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2VyPgotICBfU2VsZiYgX01fYXBwZW5kX2Rpc3BhdGNoKF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX194LCBjb25zdCBfX3RydWVfdHlwZSYgLypJbnRlZ3JhbCovKSB7Ci0gICAgcmV0dXJuIGFwcGVuZCgoc2l6ZV90eXBlKSBfX24sIChfQ2hhclQpIF9feCk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcj4KLSAgX1NlbGYmIF9NX2FwcGVuZF9kaXNwYXRjaChfSW5wdXRJdGVyIF9fZiwgX0lucHV0SXRlciBfX2wsIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypJbnRlZ3JhbCovKSB7Ci0gICAgcmV0dXJuIF9NX2FwcGVuZFQoX19mLCBfX2wsIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9fZiwgX0lucHV0SXRlcikpOwotICB9Ci0KLXB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXNzaWduCi0KLSAgX1NlbGYmIGFzc2lnbihjb25zdCBfU2VsZiYgX19zKSB7Ci0gICAgX0Jhc2U6OmFzc2lnbihfX3MpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIF9TZWxmJiBhc3NpZ24oY29uc3QgX1NlbGYmIF9fcywKLSAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIHsKLSAgICBfQmFzZTo6YXNzaWduKF9fcywgX19wb3MsIF9fbik7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgX1NlbGYmIGFzc2lnbihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbikgewotICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCi0gICAgX0Jhc2U6OmFzc2lnbihfX3MsIF9fbik7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgX1NlbGYmIGFzc2lnbihjb25zdCBfQ2hhclQqIF9fcykgewotICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCi0gICAgX0Jhc2U6OmFzc2lnbihfX3MpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIF9TZWxmJiBhc3NpZ24oc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYykgewotICAgIF9CYXNlOjphc3NpZ24oX19uLCBfX2MpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi1wcml2YXRlOiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIGFzc2lnbi4KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0ludGVnZXI+Ci0gIF9TZWxmJiBfTV9hc3NpZ25fZGlzcGF0Y2goX0ludGVnZXIgX19uLCBfSW50ZWdlciBfX3gsIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKl9JbnRlZ3JhbCovKSB7Ci0gICAgcmV0dXJuIGFzc2lnbigoc2l6ZV90eXBlKSBfX24sIChfQ2hhclQpIF9feCk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcj4KLSAgX1NlbGYmIF9NX2Fzc2lnbl9kaXNwYXRjaChfSW5wdXRJdGVyIF9fZiwgX0lucHV0SXRlciBfX2wsIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypfSW50ZWdyYWwqLykgIHsKLSAgICBwb2ludGVyIF9fY3VyID0gdGhpcy0+X01fU3RhcnQoKTsKLSAgICB3aGlsZSAoX19mICE9IF9fbCAmJiBfX2N1ciAhPSB0aGlzLT5fTV9GaW5pc2goKSkgewotICAgICAgX1RyYWl0czo6YXNzaWduKCpfX2N1ciwgKl9fZik7Ci0gICAgICArK19fZjsKLSAgICAgICsrX19jdXI7Ci0gICAgfQotICAgIGlmIChfX2YgPT0gX19sKQotICAgICAgX0Jhc2U6OmVyYXNlKF9fY3VyLCB0aGlzLT5fTV9GaW5pc2goKSk7Ci0gICAgZWxzZQotICAgICAgX01fYXBwZW5kVChfX2YsIF9fbCwgX1NUTFBfSVRFUkFUT1JfQ0FURUdPUlkoX19mLCBfSW5wdXRJdGVyKSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLXB1YmxpYzoKLSAgLy8gQ2hlY2sgdG8gc2VlIGlmIF9JbnB1dEl0ZXJhdG9yIGlzIGFuIGludGVnZXIgdHlwZS4gIElmIHNvLCB0aGVuCi0gIC8vIGl0IGNhbid0IGJlIGFuIGl0ZXJhdG9yLgotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcj4KLSAgX1NlbGYmIGFzc2lnbihfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0KSB7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBfSXNJbnRlZ3JhbDxfSW5wdXRJdGVyPjo6X1JldCBfSW50ZWdyYWw7Ci0gICAgcmV0dXJuIF9NX2Fzc2lnbl9kaXNwYXRjaChfX2ZpcnN0LCBfX2xhc3QsIF9JbnRlZ3JhbCgpKTsKLSAgfQotCi0jaWYgIWRlZmluZWQgKF9TVExQX05PX01FVEhPRF9TUEVDSUFMSVpBVElPTikgJiYgIWRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpCi0gIC8qIFRoaXMgbWV0aG9kIGlzIG5vdCBwYXJ0IG9mIHRoZSBzdGFuZGFyZCBhbmQgaXMgYSBzcGVjaWFsaXphdGlvbiBvZiB0aGUKLSAgICogdGVtcGxhdGUgbWV0aG9kIGFzc2lnbi4gSXQgaXMgb25seSBncmFudGVkIGZvciBjb252ZW5pZW5jZSB0byBjYWxsIGFzc2lnbgotICAgKiB3aXRoIG1peGVkIHBhcmFtZXRlcnMgaXRlcmF0b3IgYW5kIGNvbnN0X2l0ZXJhdG9yLgotICAgKi8KLSAgX1NlbGYmIGFzc2lnbihjb25zdCBfQ2hhclQqIF9fZiwgY29uc3QgX0NoYXJUKiBfX2wpIHsKLSAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19mKV9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2wpCi0gICAgX0Jhc2U6OmFzc2lnbihfX2YsIF9fbCk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0jZW5kaWYKLQotcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnNlcnQKLQotICBfU2VsZiYgaW5zZXJ0KHNpemVfdHlwZSBfX3BvcywgY29uc3QgX1NlbGYmIF9fcykgewotICAgIF9CYXNlOjppbnNlcnQoX19wb3MsIF9fcyk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgX1NlbGYmIGluc2VydChzaXplX3R5cGUgX19wb3MsIGNvbnN0IF9TZWxmJiBfX3MsCi0gICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fYmVnLCBzaXplX3R5cGUgX19uKSB7Ci0gICAgX0Jhc2U6Omluc2VydChfX3BvcywgX19zLCBfX2JlZywgX19uKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgX1NlbGYmIGluc2VydChzaXplX3R5cGUgX19wb3MsIGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uKSB7Ci0gICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKLSAgICBfQmFzZTo6aW5zZXJ0KF9fcG9zLCBfX3MsIF9fbik7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgX1NlbGYmIGluc2VydChzaXplX3R5cGUgX19wb3MsIGNvbnN0IF9DaGFyVCogX19zKSB7Ci0gICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKLSAgICBfQmFzZTo6aW5zZXJ0KF9fcG9zLCBfX3MpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIF9TZWxmJiBpbnNlcnQoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jKSB7Ci0gICAgX0Jhc2U6Omluc2VydChfX3BvcywgX19uLCBfX2MpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBfX3AsIF9DaGFyVCBfX2MpIHsKLSAgICByZXR1cm4gX0Jhc2U6Omluc2VydChfX3AsIF9fYyk7Ci0gIH0KLQotICB2b2lkIGluc2VydChpdGVyYXRvciBfX3AsIHNpemVfdCBfX24sIF9DaGFyVCBfX2MpIHsKLSAgICBfQmFzZTo6aW5zZXJ0KF9fcCwgX19uLCBfX2MpOwotICB9Ci0KLSAgLy8gQ2hlY2sgdG8gc2VlIGlmIF9JbnB1dEl0ZXJhdG9yIGlzIGFuIGludGVnZXIgdHlwZS4gIElmIHNvLCB0aGVuCi0gIC8vIGl0IGNhbid0IGJlIGFuIGl0ZXJhdG9yLgotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcj4KLSAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wLCBfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0KSB7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBfSXNJbnRlZ3JhbDxfSW5wdXRJdGVyPjo6X1JldCBfSW50ZWdyYWw7Ci0gICAgX01faW5zZXJ0X2Rpc3BhdGNoKF9fcCwgX19maXJzdCwgX19sYXN0LCBfSW50ZWdyYWwoKSk7Ci0gIH0KLQotcHJpdmF0ZTogIC8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIGluc2VydC4KLQotICB2b2lkIF9NX2luc2VydChpdGVyYXRvciBfX3AsIGNvbnN0IF9DaGFyVCogX19mLCBjb25zdCBfQ2hhclQqIF9fbCwgYm9vbCBfX3NlbGZfcmVmKSB7Ci0gICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fZilfU1RMUF9GSVhfTElURVJBTF9CVUcoX19sKQotICAgIF9CYXNlOjpfTV9pbnNlcnQoX19wLCBfX2YsIF9fbCwgX19zZWxmX3JlZik7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyPgotICB2b2lkIF9NX2luc2VydF9vdmVyZmxvdyhpdGVyYXRvciBfX3Bvc2l0aW9uLCBfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlIF9fbikgewotICAgIGNvbnN0IHNpemVfdHlwZSBfX29sZF9zaXplID0gdGhpcy0+c2l6ZSgpOwotICAgIGNvbnN0IHNpemVfdHlwZSBfX2xlbiA9IF9fb2xkX3NpemUgKyAobWF4KShfX29sZF9zaXplLCBfX1NUQVRJQ19DQVNUKHNpemVfdHlwZSxfX24pKSArIDE7Ci0gICAgcG9pbnRlciBfX25ld19zdGFydCA9IHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLmFsbG9jYXRlKF9fbGVuKTsKLSAgICBwb2ludGVyIF9fbmV3X2ZpbmlzaCA9IF9fbmV3X3N0YXJ0OwotICAgIF9TVExQX1RSWSB7Ci0gICAgICBfX25ld19maW5pc2ggPSB1bmluaXRpYWxpemVkX2NvcHkodGhpcy0+X01fU3RhcnQoKSwgX19wb3NpdGlvbiwgX19uZXdfc3RhcnQpOwotICAgICAgX19uZXdfZmluaXNoID0gdW5pbml0aWFsaXplZF9jb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19uZXdfZmluaXNoKTsKLSAgICAgIF9fbmV3X2ZpbmlzaCA9IHVuaW5pdGlhbGl6ZWRfY29weShfX3Bvc2l0aW9uLCB0aGlzLT5fTV9GaW5pc2goKSwgX19uZXdfZmluaXNoKTsKLSAgICAgIHRoaXMtPl9NX2NvbnN0cnVjdF9udWxsKF9fbmV3X2ZpbmlzaCk7Ci0gICAgfQotICAgIF9TVExQX1VOV0lORCgoX1NUTFBfU1REOjpfRGVzdHJveV9SYW5nZShfX25ld19zdGFydCxfX25ld19maW5pc2gpLAotICAgICAgICAgICAgICAgICAgdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuZGVhbGxvY2F0ZShfX25ld19zdGFydCxfX2xlbikpKQotICAgIHRoaXMtPl9NX2Rlc3Ryb3lfcmFuZ2UoKTsKLSAgICB0aGlzLT5fTV9kZWFsbG9jYXRlX2Jsb2NrKCk7Ci0gICAgdGhpcy0+X01fcmVzZXQoX19uZXdfc3RhcnQsIF9fbmV3X2ZpbmlzaCwgX19uZXdfc3RhcnQgKyBfX2xlbik7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcj4KLSAgdm9pZCBfTV9pbnNlcnRUKGl0ZXJhdG9yIF9fcCwgX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0X2l0ZXJhdG9yX3RhZyAmKSB7Ci0gICAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KSB7Ci0gICAgICBfX3AgPSBpbnNlcnQoX19wLCAqX19maXJzdCk7Ci0gICAgICArK19fcDsKLSAgICB9Ci0gIH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyPgotICB2b2lkIF9NX2luc2VydFQoaXRlcmF0b3IgX19wb3NpdGlvbiwgX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICBjb25zdCBmb3J3YXJkX2l0ZXJhdG9yX3RhZyAmKSB7Ci0gICAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KSB7Ci0gICAgICBkaWZmZXJlbmNlX3R5cGUgX19uID0gZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KTsKLSAgICAgIGlmICh0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5fTV9kYXRhIC0gdGhpcy0+X01fZmluaXNoID49IF9fbiArIDEpIHsKLSAgICAgICAgY29uc3QgZGlmZmVyZW5jZV90eXBlIF9fZWxlbXNfYWZ0ZXIgPSB0aGlzLT5fTV9maW5pc2ggLSBfX3Bvc2l0aW9uOwotICAgICAgICBpZiAoX19lbGVtc19hZnRlciA+PSBfX24pIHsKLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNKQotICAgICAgICAgIGlmICh0aGlzLT5fTV91c2luZ19zdGF0aWNfYnVmKCkpCi0gICAgICAgICAgICBfQmFzZTo6X01fY29weSgodGhpcy0+X01fRmluaXNoKCkgLSBfX24pICsgMSwgdGhpcy0+X01fRmluaXNoKCkgKyAxLCB0aGlzLT5fTV9GaW5pc2goKSArIDEpOwotICAgICAgICAgIGVsc2UKLSNlbmRpZiAvKiBfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNICovCi0gICAgICAgICAgdW5pbml0aWFsaXplZF9jb3B5KCh0aGlzLT5fTV9GaW5pc2goKSAtIF9fbikgKyAxLCB0aGlzLT5fTV9GaW5pc2goKSArIDEsIHRoaXMtPl9NX0ZpbmlzaCgpICsgMSk7Ci0gICAgICAgICAgdGhpcy0+X01fZmluaXNoICs9IF9fbjsKLSAgICAgICAgICBfVHJhaXRzOjptb3ZlKF9fcG9zaXRpb24gKyBfX24sIF9fcG9zaXRpb24sIChfX2VsZW1zX2FmdGVyIC0gX19uKSArIDEpOwotICAgICAgICAgIF9NX2NvcHlUKF9fZmlyc3QsIF9fbGFzdCwgX19wb3NpdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgcG9pbnRlciBfX29sZF9maW5pc2ggPSB0aGlzLT5fTV9GaW5pc2goKTsKLSAgICAgICAgICBfRm9yd2FyZEl0ZXIgX19taWQgPSBfX2ZpcnN0OwotICAgICAgICAgIGFkdmFuY2UoX19taWQsIF9fZWxlbXNfYWZ0ZXIgKyAxKTsKLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNKQotICAgICAgICAgIGlmICh0aGlzLT5fTV91c2luZ19zdGF0aWNfYnVmKCkpCi0gICAgICAgICAgICBfTV9jb3B5VChfX21pZCwgX19sYXN0LCB0aGlzLT5fTV9GaW5pc2goKSArIDEpOwotICAgICAgICAgIGVsc2UKLSNlbmRpZiAvKiBfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNICovCi0gICAgICAgICAgdW5pbml0aWFsaXplZF9jb3B5KF9fbWlkLCBfX2xhc3QsIHRoaXMtPl9NX0ZpbmlzaCgpICsgMSk7Ci0gICAgICAgICAgdGhpcy0+X01fZmluaXNoICs9IF9fbiAtIF9fZWxlbXNfYWZ0ZXI7Ci0gICAgICAgICAgX1NUTFBfVFJZIHsKLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNKQotICAgICAgICAgICAgaWYgKHRoaXMtPl9NX3VzaW5nX3N0YXRpY19idWYoKSkKLSAgICAgICAgICAgICAgX0Jhc2U6Ol9NX2NvcHkoX19wb3NpdGlvbiwgX19vbGRfZmluaXNoICsgMSwgdGhpcy0+X01fRmluaXNoKCkpOwotICAgICAgICAgICAgZWxzZQotI2VuZGlmIC8qIF9TVExQX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0gKi8KLSAgICAgICAgICAgIHVuaW5pdGlhbGl6ZWRfY29weShfX3Bvc2l0aW9uLCBfX29sZF9maW5pc2ggKyAxLCB0aGlzLT5fTV9GaW5pc2goKSk7Ci0gICAgICAgICAgICB0aGlzLT5fTV9maW5pc2ggKz0gX19lbGVtc19hZnRlcjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgX1NUTFBfVU5XSU5EKCh0aGlzLT5fTV9kZXN0cm95X3B0cl9yYW5nZShfX29sZF9maW5pc2ggKyAxLCB0aGlzLT5fTV9GaW5pc2goKSksCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5fTV9maW5pc2ggPSBfX29sZF9maW5pc2gpKQotICAgICAgICAgIF9NX2NvcHlUKF9fZmlyc3QsIF9fbWlkLCBfX3Bvc2l0aW9uKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIF9NX2luc2VydF9vdmVyZmxvdyhfX3Bvc2l0aW9uLCBfX2ZpcnN0LCBfX2xhc3QsIF9fbik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2VyPgotICB2b2lkIF9NX2luc2VydF9kaXNwYXRjaChpdGVyYXRvciBfX3AsIF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX194LAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX3RydWVfdHlwZSYgLypJbnRlZ3JhbCovKSB7Ci0gICAgaW5zZXJ0KF9fcCwgKHNpemVfdHlwZSkgX19uLCAoX0NoYXJUKSBfX3gpOwotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXI+Ci0gIHZvaWQgX01faW5zZXJ0X2Rpc3BhdGNoKGl0ZXJhdG9yIF9fcCwgX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19mYWxzZV90eXBlJiAvKkludGVncmFsKi8pIHsKLSAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19wKQotICAgIC8qCi0gICAgICogV2l0aGluIHRoZSBiYXNpY19zdHJpbmcgaW1wbGVtZW50YXRpb24gd2UgYXJlIG9ubHkgZ29pbmcgdG8gY2hlY2sgZm9yCi0gICAgICogc2VsZiByZWZlcmVuY2luZyBpZiBpdGVyYXRvcnMgYXJlIHN0cmluZyBpdGVyYXRvcnMgb3IgX0NoYXJUIHBvaW50ZXJzLgotICAgICAqIEEgdXNlciBjb3VsZCBlbmNhcHN1bGF0ZSB0aG9zZSBpdGVyYXRvciB3aXRoaW4gdGhlaXIgb3duIGl0ZXJhdG9yIGludGVyZmFjZQotICAgICAqIGFuZCBpbiB0aGlzIGNhc2UgbGVhZCB0byBhIGJhZCBiZWhhdmlvciwgdGhpcyBpcyBhIGtub3duIGxpbWl0YXRpb24uCi0gICAgICovCi0gICAgdHlwZWRlZiB0eXBlbmFtZSBfQXJlU2FtZVVuQ1ZUeXBlczxfSW5wdXRJdGVyLCBpdGVyYXRvcj46Ol9SZXQgX0lzSXRlcmF0b3I7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBfQXJlU2FtZVVuQ1ZUeXBlczxfSW5wdXRJdGVyLCBjb25zdF9pdGVyYXRvcj46Ol9SZXQgX0lzQ29uc3RJdGVyYXRvcjsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIF9Mb3IyPF9Jc0l0ZXJhdG9yLCBfSXNDb25zdEl0ZXJhdG9yPjo6X1JldCBfQ2hlY2tJbnNpZGU7Ci0gICAgX01faW5zZXJ0X2F1eChfX3AsIF9fZmlyc3QsIF9fbGFzdCwgX0NoZWNrSW5zaWRlKCkpOwotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21JdGVyPgotICB2b2lkIF9NX2luc2VydF9hdXggKGl0ZXJhdG9yIF9fcCwgX1JhbmRvbUl0ZXIgX19maXJzdCwgX1JhbmRvbUl0ZXIgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKl9DaGVja0luc2lkZSovKSB7Ci0gICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcCkKLSAgICBfTV9pbnNlcnQoX19wLCAmKCpfX2ZpcnN0KSwgJigqX19sYXN0KSwgX0Jhc2U6Ol9NX2luc2lkZSgmKCpfX2ZpcnN0KSkpOwotICB9Ci0KLSAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcj4KLSAgdm9pZCBfTV9pbnNlcnRfYXV4IChpdGVyYXRvciBfX3AsIF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19mYWxzZV90eXBlJiAvKl9DaGVja0luc2lkZSovKSB7Ci0gICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcCkKLSAgICBfTV9pbnNlcnRUKF9fcCwgX19maXJzdCwgX19sYXN0LCBfU1RMUF9JVEVSQVRPUl9DQVRFR09SWShfX2ZpcnN0LCBfSW5wdXRJdGVyKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Ci0gIHZvaWQgX01fY29weVQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LCBwb2ludGVyIF9fcmVzdWx0KSB7Ci0gICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcCkKLSAgICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QsICsrX19yZXN1bHQpCi0gICAgICBfVHJhaXRzOjphc3NpZ24oKl9fcmVzdWx0LCAqX19maXJzdCk7Ci0gIH0KLQotI2lmICFkZWZpbmVkIChfU1RMUF9OT19NRVRIT0RfU1BFQ0lBTElaQVRJT04pCi0gIHZvaWQgX01fY29weVQoY29uc3QgX0NoYXJUKiBfX2YsIGNvbnN0IF9DaGFyVCogX19sLCBfQ2hhclQqIF9fcmVzKSB7Ci0gICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fZikgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fbCkgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcmVzKQotICAgIF9CYXNlOjpfTV9jb3B5KF9fZiwgX19sLCBfX3Jlcyk7Ci0gIH0KLSNlbmRpZgotCi1wdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVyYXNlLgotCi0gIF9TZWxmJiBlcmFzZShzaXplX3R5cGUgX19wb3MgPSAwLCBzaXplX3R5cGUgX19uID0gbnBvcykgewotICAgIF9CYXNlOjplcmFzZShfX3BvcywgX19uKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBfX3BvcykgewotICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3BvcykKLSAgICByZXR1cm4gX0Jhc2U6OmVyYXNlKF9fcG9zKTsKLSAgfQotCi0gIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkgewotICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2ZpcnN0KSBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19sYXN0KQotICAgIHJldHVybiBfQmFzZTo6ZXJhc2UoX19maXJzdCwgX19sYXN0KTsKLSAgfQotCi1wdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlcGxhY2UuICAoQ29uY2VwdHVhbGx5IGVxdWl2YWxlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gZXJhc2UgZm9sbG93ZWQgYnkgaW5zZXJ0LikKLSAgX1NlbGYmIHJlcGxhY2Uoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uLCBjb25zdCBfU2VsZiYgX19zKSB7Ci0gICAgX0Jhc2U6OnJlcGxhY2UoX19wb3MsIF9fbiwgX19zKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBfU2VsZiYgcmVwbGFjZShzaXplX3R5cGUgX19wb3MxLCBzaXplX3R5cGUgX19uMSwgY29uc3QgX1NlbGYmIF9fcywKLSAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fcG9zMiwgc2l6ZV90eXBlIF9fbjIpIHsKLSAgICBfQmFzZTo6cmVwbGFjZShfX3BvczEsIF9fbjEsIF9fcywgX19wb3MyLCBfX24yKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBfU2VsZiYgcmVwbGFjZShzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24xLAotICAgICAgICAgICAgICAgICBjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbjIpIHsKLSAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKQotICAgIF9CYXNlOjpyZXBsYWNlKF9fcG9zLCBfX24xLCBfX3MsIF9fbjIpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIF9TZWxmJiByZXBsYWNlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IF9DaGFyVCogX19zKSB7Ci0gICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKLSAgICBfQmFzZTo6cmVwbGFjZShfX3BvcywgX19uMSwgX19zKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBfU2VsZiYgcmVwbGFjZShzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24xLAotICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uMiwgX0NoYXJUIF9fYykgewotICAgIF9CYXNlOjpyZXBsYWNlKF9fcG9zLCBfX24xLCBfX24yLCBfX2MpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIF9TZWxmJiByZXBsYWNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCwgY29uc3QgX1NlbGYmIF9fcykgewotICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2ZpcnN0KSBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19sYXN0KQotICAgIF9CYXNlOjpyZXBsYWNlKF9fZmlyc3QsIF9fbGFzdCwgX19zKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBfU2VsZiYgcmVwbGFjZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgIGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uKSB7Ci0gICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fZmlyc3QpIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2xhc3QpCi0gICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKLSAgICBfQmFzZTo6cmVwbGFjZShfX2ZpcnN0LCBfX2xhc3QsIF9fcywgX19uKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBfU2VsZiYgcmVwbGFjZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgIGNvbnN0IF9DaGFyVCogX19zKSB7Ci0gICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fZmlyc3QpIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2xhc3QpCi0gICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKLSAgICBfQmFzZTo6cmVwbGFjZShfX2ZpcnN0LCBfX2xhc3QsIF9fcyk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgX1NlbGYmIHJlcGxhY2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0LAotICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jKSB7Ci0gICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fZmlyc3QpIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2xhc3QpCi0gICAgX0Jhc2U6OnJlcGxhY2UoX19maXJzdCwgX19sYXN0LCBfX24sIF9fYyk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgLy8gQ2hlY2sgdG8gc2VlIGlmIF9JbnB1dEl0ZXIgaXMgYW4gaW50ZWdlciB0eXBlLiAgSWYgc28sIHRoZW4KLSAgLy8gaXQgY2FuJ3QgYmUgYW4gaXRlcmF0b3IuCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgotICBfU2VsZiYgcmVwbGFjZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIgX19mLCBfSW5wdXRJdGVyIF9fbCkgewotICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2ZpcnN0KV9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2xhc3QpCi0gICAgdHlwZWRlZiB0eXBlbmFtZSBfSXNJbnRlZ3JhbDxfSW5wdXRJdGVyPjo6X1JldCBfSW50ZWdyYWw7Ci0gICAgcmV0dXJuIF9NX3JlcGxhY2VfZGlzcGF0Y2goX19maXJzdCwgX19sYXN0LCBfX2YsIF9fbCwgIF9JbnRlZ3JhbCgpKTsKLSAgfQotCi0jaWYgIWRlZmluZWQgKF9TVExQX05PX01FVEhPRF9TUEVDSUFMSVpBVElPTikgJiYgIWRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpCi0gIF9TZWxmJiByZXBsYWNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgY29uc3QgX0NoYXJUKiBfX2YsIGNvbnN0IF9DaGFyVCogX19sKSB7Ci0gICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fZmlyc3QpIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2xhc3QpCi0gICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fZikgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fbCkKLSAgICBfQmFzZTo6cmVwbGFjZShfX2ZpcnN0LCBfX2xhc3QsIF9fZiwgX19sKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSNlbmRpZgotCi1wcm90ZWN0ZWQ6ICAgICAgICAgICAgICAgICAgICAgICAgLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgcmVwbGFjZS4KLSAgX1NlbGYmIF9NX3JlcGxhY2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICBjb25zdCBfQ2hhclQqIF9fZiwgY29uc3QgX0NoYXJUKiBfX2wsIGJvb2wgX19zZWxmX3JlZikgewotICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2ZpcnN0KSBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19sYXN0KQotICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2YpIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2wpCi0gICAgX0Jhc2U6Ol9NX3JlcGxhY2UoX19maXJzdCwgX19sYXN0LCBfX2YsIF9fbCwgX19zZWxmX3JlZik7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2VyPgotICBfU2VsZiYgX01fcmVwbGFjZV9kaXNwYXRjaChpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX194LCBjb25zdCBfX3RydWVfdHlwZSYgLypJc0ludGVncmFsKi8pIHsKLSAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19maXJzdCkgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fbGFzdCkKLSAgICByZXR1cm4gcmVwbGFjZShfX2ZpcnN0LCBfX2xhc3QsIChzaXplX3R5cGUpIF9fbiwgKF9DaGFyVCkgX194KTsKLSAgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgotICBfU2VsZiYgX01fcmVwbGFjZV9kaXNwYXRjaChpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIgX19mLCBfSW5wdXRJdGVyIF9fbCwgY29uc3QgX19mYWxzZV90eXBlJiAvKklzSW50ZWdyYWwqLykgewotICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2ZpcnN0KSBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19sYXN0KQotICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FyZVNhbWVVbkNWVHlwZXM8X0lucHV0SXRlciwgaXRlcmF0b3I+OjpfUmV0IF9Jc0l0ZXJhdG9yOwotICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FyZVNhbWVVbkNWVHlwZXM8X0lucHV0SXRlciwgY29uc3RfaXRlcmF0b3I+OjpfUmV0IF9Jc0NvbnN0SXRlcmF0b3I7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBfTG9yMjxfSXNJdGVyYXRvciwgX0lzQ29uc3RJdGVyYXRvcj46Ol9SZXQgX0NoZWNrSW5zaWRlOwotICAgIHJldHVybiBfTV9yZXBsYWNlX2F1eChfX2ZpcnN0LCBfX2xhc3QsIF9fZiwgX19sLCBfQ2hlY2tJbnNpZGUoKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUl0ZXI+Ci0gIF9TZWxmJiBfTV9yZXBsYWNlX2F1eChpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBfUmFuZG9tSXRlciBfX2YsIF9SYW5kb21JdGVyIF9fbCwgX190cnVlX3R5cGUgY29uc3QmIC8qX0NoZWNrSW5zaWRlKi8pIHsKLSAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19maXJzdCkgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fbGFzdCkKLSAgICByZXR1cm4gX01fcmVwbGFjZShfX2ZpcnN0LCBfX2xhc3QsICYoKl9fZiksICYoKl9fbCksIF9CYXNlOjpfTV9pbnNpZGUoJigqX19mKSkpOwotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXI+Ci0gIF9TZWxmJiBfTV9yZXBsYWNlX2F1eChpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyIF9fZiwgX0lucHV0SXRlciBfX2wsIF9fZmFsc2VfdHlwZSBjb25zdCYgLypfQ2hlY2tJbnNpZGUqLykgewotICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2ZpcnN0KSBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19sYXN0KQotICAgIHJldHVybiBfTV9yZXBsYWNlVChfX2ZpcnN0LCBfX2xhc3QsIF9fZiwgX19sLCBfU1RMUF9JVEVSQVRPUl9DQVRFR09SWShfX2YsIF9JbnB1dEl0ZXIpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgotICBfU2VsZiYgX01fcmVwbGFjZVQoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlciBfX2YsIF9JbnB1dEl0ZXIgX19sLCBjb25zdCBpbnB1dF9pdGVyYXRvcl90YWcmX19pdGVfdGFnKSB7Ci0gICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fZmlyc3QpIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2xhc3QpCi0gICAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdCAmJiBfX2YgIT0gX19sOyArK19fZmlyc3QsICsrX19mKQotICAgICAgX1RyYWl0czo6YXNzaWduKCpfX2ZpcnN0LCAqX19mKTsKLSAgICBpZiAoX19mID09IF9fbCkKLSAgICAgIF9CYXNlOjplcmFzZShfX2ZpcnN0LCBfX2xhc3QpOwotICAgIGVsc2UKLSAgICAgIF9NX2luc2VydFQoX19sYXN0LCBfX2YsIF9fbCwgX19pdGVfdGFnKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyPgotICBfU2VsZiYgX01fcmVwbGFjZVQoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyIF9fZiwgX0ZvcndhcmRJdGVyIF9fbCwgY29uc3QgZm9yd2FyZF9pdGVyYXRvcl90YWcgJl9faXRlX3RhZykgewotICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2ZpcnN0KSBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19sYXN0KQotICAgIGRpZmZlcmVuY2VfdHlwZSBfX24gPSBkaXN0YW5jZShfX2YsIF9fbCk7Ci0gICAgY29uc3QgZGlmZmVyZW5jZV90eXBlIF9fbGVuID0gX19sYXN0IC0gX19maXJzdDsKLSAgICBpZiAoX19sZW4gPj0gX19uKSB7Ci0gICAgICBfTV9jb3B5VChfX2YsIF9fbCwgX19maXJzdCk7Ci0gICAgICBfQmFzZTo6ZXJhc2UoX19maXJzdCArIF9fbiwgX19sYXN0KTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBfRm9yd2FyZEl0ZXIgX19tID0gX19mOwotICAgICAgYWR2YW5jZShfX20sIF9fbGVuKTsKLSAgICAgIF9NX2NvcHlUKF9fZiwgX19tLCBfX2ZpcnN0KTsKLSAgICAgIF9NX2luc2VydFQoX19sYXN0LCBfX20sIF9fbCwgX19pdGVfdGFnKTsKLSAgICB9Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLXB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXIgbW9kaWZpZXIgbWVtYmVyIGZ1bmN0aW9ucy4KLQotICB2b2lkIHN3YXAoX1NlbGYmIF9fcykKLSAgeyBfQmFzZTo6c3dhcChfX3MpOyB9Ci0KLXB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3Vic3RyaW5nLgotCi0gIF9TZWxmIHN1YnN0cihzaXplX3R5cGUgX19wb3MgPSAwLCBzaXplX3R5cGUgX19uID0gbnBvcykgY29uc3QKLSAgeyByZXR1cm4gX1NlbGYoKnRoaXMsIF9fcG9zLCBfX24sIGdldF9hbGxvY2F0b3IoKSk7IH0KLQotI2lmIGRlZmluZWQgKF9TVExQX1VTRV9URU1QTEFURV9FWFBSRVNTSU9OKSAmJiAhZGVmaW5lZCAoX1NUTFBfREVCVUcpCi0jICBkZWZpbmUgX1NUTFBfU1RSSU5HX1NVTV9CQVNFIF9TVExQX05PX01FTV9UX1NUUklOR19CQVNFCi0jICBpbmNsdWRlIDxzdGwvX3N0cmluZ19zdW1fbWV0aG9kcy5oPgotIyAgdW5kZWYgX1NUTFBfU1RSSU5HX1NVTV9CQVNFCi0jZW5kaWYKLX07Ci0KLSN1bmRlZiBfU1RMUF9OT19NRU1fVF9TVFJJTkdfQkFTRQotCi0jaWYgZGVmaW5lZCAoYmFzaWNfc3RyaW5nKQotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi0jICB1bmRlZiBiYXNpY19zdHJpbmcKLSNlbmRpZgotCi1fU1RMUF9FTkRfTkFNRVNQQUNFCmRpZmYgLS1naXQgYS9zdGwvX3RlbXBidWYuaCBiL3N0bC9fdGVtcGJ1Zi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTBlNmQ0Li4wMDAwMDAwCi0tLSBhL3N0bC9fdGVtcGJ1Zi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk0Ci0gKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3Ci0gKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTcKLSAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0vKiBOT1RFOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBTVEwgaGVhZGVycy4KLSAqICAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuCi0gKi8KLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9URU1QQlVGX0gKLSNkZWZpbmUgX1NUTFBfSU5URVJOQUxfVEVNUEJVRl9ICi0KLSNpZm5kZWYgX1NUTFBfQ0xJTUlUUwotIyAgaW5jbHVkZSA8Y2xpbWl0cz4KLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NTVERMSUIKLSMgIGluY2x1ZGUgPHN0bC9fY3N0ZGxpYi5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfVU5JTklUSUFMSVpFRF9ICi0jICBpbmNsdWRlIDxzdGwvX3VuaW5pdGlhbGl6ZWQuaD4KLSNlbmRpZgotCi1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLXBhaXI8X1RwKiwgcHRyZGlmZl90PiAgX1NUTFBfQ0FMTAotX19nZXRfdGVtcG9yYXJ5X2J1ZmZlcihwdHJkaWZmX3QgX19sZW4sIF9UcCopOwotCi0jaWZuZGVmIF9TVExQX05PX0VYUExJQ0lUX0ZVTkNUSU9OX1RNUExfQVJHUwotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotaW5saW5lIHBhaXI8X1RwKiwgcHRyZGlmZl90PiAgX1NUTFBfQ0FMTCBnZXRfdGVtcG9yYXJ5X2J1ZmZlcihwdHJkaWZmX3QgX19sZW4pIHsKLSAgcmV0dXJuIF9fZ2V0X3RlbXBvcmFyeV9idWZmZXIoX19sZW4sIChfVHAqKSAwKTsKLX0KLQotIyBpZiAhIGRlZmluZWQoX1NUTFBfTk9fRVhURU5TSU9OUykKLS8vIFRoaXMgb3ZlcmxvYWQgaXMgbm90IHJlcXVpcmVkIGJ5IHRoZSBzdGFuZGFyZDsgaXQgaXMgYW4gZXh0ZW5zaW9uLgotLy8gSXQgaXMgc3VwcG9ydGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggdGhlIEhQIFNUTCwgYW5kCi0vLyBiZWNhdXNlIG5vdCBhbGwgY29tcGlsZXJzIHN1cHBvcnQgdGhlIGxhbmd1YWdlIGZlYXR1cmUgKGV4cGxpY2l0Ci0vLyBmdW5jdGlvbiB0ZW1wbGF0ZSBhcmd1bWVudHMpIHRoYXQgaXMgcmVxdWlyZWQgZm9yIHRoZSBzdGFuZGFyZAotLy8gdmVyc2lvbiBvZiBnZXRfdGVtcG9yYXJ5X2J1ZmZlci4KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgcGFpcjxfVHAqLCBwdHJkaWZmX3Q+ICBfU1RMUF9DQUxMCi1nZXRfdGVtcG9yYXJ5X2J1ZmZlcihwdHJkaWZmX3QgX19sZW4sIF9UcCopIHsKLSAgcmV0dXJuIF9fZ2V0X3RlbXBvcmFyeV9idWZmZXIoX19sZW4sIChfVHAqKSAwKTsKLX0KLSMgZW5kaWYKLSNlbmRpZgotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotaW5saW5lIHZvaWQgIF9TVExQX0NBTEwgcmV0dXJuX3RlbXBvcmFyeV9idWZmZXIoX1RwKiBfX3ApIHsKLS8vIFN1blBybyBicmFpbiBkYW1hZ2UKLSAgZnJlZSgoY2hhciopX19wKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3IsIGNsYXNzIF9UcD4KLWNsYXNzIF9UZW1wb3JhcnlfYnVmZmVyIHsKLXByaXZhdGU6Ci0gIHB0cmRpZmZfdCAgX01fb3JpZ2luYWxfbGVuOwotICBwdHJkaWZmX3QgIF9NX2xlbjsKLSAgX1RwKiAgICAgICBfTV9idWZmZXI7Ci0KLSAgdm9pZCBfTV9hbGxvY2F0ZV9idWZmZXIoKSB7Ci0gICAgX01fb3JpZ2luYWxfbGVuID0gX01fbGVuOwotICAgIF9NX2J1ZmZlciA9IDA7Ci0KLSAgICBpZiAoX01fbGVuID4gKHB0cmRpZmZfdCkoSU5UX01BWCAvIHNpemVvZihfVHApKSkKLSAgICAgIF9NX2xlbiA9IElOVF9NQVggLyBzaXplb2YoX1RwKTsKLQotICAgIHdoaWxlIChfTV9sZW4gPiAwKSB7Ci0gICAgICBfTV9idWZmZXIgPSAoX1RwKikgbWFsbG9jKF9NX2xlbiAqIHNpemVvZihfVHApKTsKLSAgICAgIGlmIChfTV9idWZmZXIpCi0gICAgICAgIGJyZWFrOwotICAgICAgX01fbGVuIC89IDI7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBfTV9pbml0aWFsaXplX2J1ZmZlcihjb25zdCBfVHAmLCBjb25zdCBfX3RydWVfdHlwZSYpIHt9Ci0gIHZvaWQgX01faW5pdGlhbGl6ZV9idWZmZXIoY29uc3QgX1RwJiB2YWwsIGNvbnN0IF9fZmFsc2VfdHlwZSYpIHsKLSAgICB1bmluaXRpYWxpemVkX2ZpbGxfbihfTV9idWZmZXIsIF9NX2xlbiwgdmFsKTsKLSAgfQotCi1wdWJsaWM6Ci0gIHB0cmRpZmZfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gX01fbGVuOyB9Ci0gIHB0cmRpZmZfdCByZXF1ZXN0ZWRfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX29yaWdpbmFsX2xlbjsgfQotICBfVHAqIGJlZ2luKCkgeyByZXR1cm4gX01fYnVmZmVyOyB9Ci0gIF9UcCogZW5kKCkgeyByZXR1cm4gX01fYnVmZmVyICsgX01fbGVuOyB9Ci0KLSAgX1RlbXBvcmFyeV9idWZmZXIoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCkgewotICAgIC8vIFdvcmthcm91bmQgZm9yIGEgX190eXBlX3RyYWl0cyBidWcgaW4gdGhlIHByZS03LjMgY29tcGlsZXIuCi0jICAgaWYgZGVmaW5lZChfX3NnaSkgJiYgIWRlZmluZWQoX19HTlVDX18pICYmIF9DT01QSUxFUl9WRVJTSU9OIDwgNzMwCi0gICAgdHlwZWRlZiB0eXBlbmFtZSBfX3R5cGVfdHJhaXRzPF9UcD46OmlzX1BPRF90eXBlIF9Ucml2aWFsOwotIyAgIGVsc2UKLSAgICB0eXBlZGVmIHR5cGVuYW1lIF9fdHlwZV90cmFpdHM8X1RwPjo6aGFzX3RyaXZpYWxfZGVmYXVsdF9jb25zdHJ1Y3RvciAgX1RyaXZpYWw7Ci0jICAgZW5kaWYKLSAgICBfU1RMUF9UUlkgewotICAgICAgX01fbGVuID0gZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KTsKLSAgICAgIF9NX2FsbG9jYXRlX2J1ZmZlcigpOwotICAgICAgaWYgKF9NX2xlbiA+IDApCi0gICAgICAgIF9NX2luaXRpYWxpemVfYnVmZmVyKCpfX2ZpcnN0LCBfVHJpdmlhbCgpKTsKLSAgICB9Ci0gICAgX1NUTFBfVU5XSU5EKGZyZWUoX01fYnVmZmVyKTsgX01fYnVmZmVyID0gMDsgX01fbGVuID0gMCkKLSAgfQotCi0gIH5fVGVtcG9yYXJ5X2J1ZmZlcigpIHsKLSAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95X1JhbmdlKF9NX2J1ZmZlciwgX01fYnVmZmVyICsgX01fbGVuKTsKLSAgICBmcmVlKF9NX2J1ZmZlcik7Ci0gIH0KLQotcHJpdmF0ZToKLSAgLy8gRGlzYWJsZSBjb3B5IGNvbnN0cnVjdG9yIGFuZCBhc3NpZ25tZW50IG9wZXJhdG9yLgotICBfVGVtcG9yYXJ5X2J1ZmZlcihjb25zdCBfVGVtcG9yYXJ5X2J1ZmZlcjxfRm9yd2FyZEl0ZXJhdG9yLCBfVHA+Jikge30KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgX1RlbXBvcmFyeV9idWZmZXI8X0ZvcndhcmRJdGVyYXRvciwgX1RwPiYpIHt9Ci19OwotCi0jIGlmbmRlZiBfU1RMUF9OT19FWFRFTlNJT05TCi0KLS8vIENsYXNzIHRlbXBvcmFyeV9idWZmZXIgaXMgbm90IHBhcnQgb2YgdGhlIHN0YW5kYXJkLiAgSXQgaXMgYW4gZXh0ZW5zaW9uLgotCi10ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvciwKLSAgICAgICAgICBjbGFzcyBfVHAKLSNpZmRlZiBfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OCi0gICAgICAgICAgICAgICAgICAgID0gdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlCi0jZW5kaWYgLyogX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTiAqLwotICAgICAgICAgPgotc3RydWN0IHRlbXBvcmFyeV9idWZmZXIgOiBwdWJsaWMgX1RlbXBvcmFyeV9idWZmZXI8X0ZvcndhcmRJdGVyYXRvciwgX1RwPgotewotICB0ZW1wb3JhcnlfYnVmZmVyKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpCi0gICAgOiBfVGVtcG9yYXJ5X2J1ZmZlcjxfRm9yd2FyZEl0ZXJhdG9yLCBfVHA+KF9fZmlyc3QsIF9fbGFzdCkge30KLSAgfnRlbXBvcmFyeV9idWZmZXIoKSB7fQotfTsKLQotIyBlbmRpZiAvKiBfU1RMUF9OT19FWFRFTlNJT05TICovCi0KLV9TVExQX0VORF9OQU1FU1BBQ0UKLQotIyBpZm5kZWYgX1NUTFBfTElOS19USU1FX0lOU1RBTlRJQVRJT04KLSMgIGluY2x1ZGUgPHN0bC9fdGVtcGJ1Zi5jPgotIyBlbmRpZgotCi0jZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfVEVNUEJVRl9IICovCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX3RocmVhZHMuYyBiL3N0bC9fdGhyZWFkcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDY0MWU4Li4wMDAwMDAwCi0tLSBhL3N0bC9fdGhyZWFkcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qCi0gKgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NAotICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NwotICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk3Ci0gKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5Ci0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLSNpZm5kZWYgX1NUTFBfVEhSRUFEU19DCi0jZGVmaW5lIF9TVExQX1RIUkVBRFNfQwotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX1RIUkVBRFNfSAotIyAgaW5jbHVkZSA8c3RsL190aHJlYWRzLmg+Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9TVExQX0VYUE9TRV9HTE9CQUxTX0lNUExFTUVOVEFUSU9OKQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfU0dJX1RIUkVBRFMpCi0jICBpbmNsdWRlIDx0aW1lLmg+Ci0jZWxpZiBkZWZpbmVkIChfU1RMUF9VTklYKQotIyAgaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NUSU1FCi0jICAgIGluY2x1ZGUgPHN0bC9fY3RpbWUuaD4KLSMgIGVuZGlmCi0jICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfTkFNRVNQQUNFUykgJiYgIWRlZmluZWQgKF9TVExQX1ZFTkRPUl9HTE9CQUxfQ1NURCkKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjp0aW1lX3Q7Ci0jICBlbmRpZgotIyAgaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNlbmRpZgotCi1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLQotI2lmIChfU1RMUF9TVEFUSUNfVEVNUExBVEVfREFUQSA+IDApCi0KLSMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9BVE9NSUNfU1dBUF9NVVRFWCkKLXRlbXBsYXRlPGludCBfXzMyYml0cz4KLV9TVExQX1NUQVRJQ19NVVRFWAotX0F0b21pY19zd2FwX3N0cnVjdDxfXzMyYml0cz46Ol9TX3N3YXBfbG9jayBfU1RMUF9NVVRFWF9JTklUSUFMSVpFUjsKLSMgICAgdW5kZWYgX1NUTFBfVVNFX0FUT01JQ19TV0FQX01VVEVYCi0jICBlbmRpZgotCi0jICBpZiBkZWZpbmVkIChfU1RMUF9USFJFQURTKSAmJiAhZGVmaW5lZCAoX1NUTFBfVVNFX1BUSFJFQURfU1BJTkxPQ0spCi10ZW1wbGF0ZSA8aW50IF9faW5zdD4KLXVuc2lnbmVkIF9TVExQX211dGV4X3NwaW48X19pbnN0Pjo6X19tYXggPSBfU1RMUF9tdXRleF9zcGluPF9faW5zdD46Ol9fbG93X21heDsKLQotdGVtcGxhdGUgPGludCBfX2luc3Q+Ci11bnNpZ25lZCBfU1RMUF9tdXRleF9zcGluPF9faW5zdD46Ol9fbGFzdCA9IDA7Ci0jICBlbmRpZiAvLyBfU1RMUF9VU0VfUFRIUkVBRF9TUElOTE9DSwotCi0jZWxzZSAvKiAoIF9TVExQX1NUQVRJQ19URU1QTEFURV9EQVRBID4gMCApICovCi0KLSMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9BVE9NSUNfU1dBUF9NVVRFWCkKLV9fREVDTEFSRV9JTlNUQU5DRShfU1RMUF9TVEFUSUNfTVVURVgsIF9BdG9taWNfc3dhcF9zdHJ1Y3Q8c2l6ZW9mKF9fc3RsX2F0b21pY190KSA9PSBzaXplb2Yodm9pZCopPjo6X1Nfc3dhcF9sb2NrLAotICAgICAgICAgICAgICAgICAgIF9TVExQX01VVEVYX0lOSVRJQUxJWkVSICApOwotIyAgICB1bmRlZiBfU1RMUF9VU0VfQVRPTUlDX1NXQVBfTVVURVgKLSMgIGVuZGlmIC8qIF9TVExQX1BUSFJFQURTICovCi0KLSMgIGlmIGRlZmluZWQgKF9TVExQX1RIUkVBRFMpICYmICFkZWZpbmVkIChfU1RMUF9VU0VfUFRIUkVBRF9TUElOTE9DSykKLV9fREVDTEFSRV9JTlNUQU5DRSh1bnNpZ25lZCwgX1NUTFBfbXV0ZXhfc3BpbjwwPjo6X19tYXgsICA9MzApOwotX19ERUNMQVJFX0lOU1RBTkNFKHVuc2lnbmVkLCBfU1RMUF9tdXRleF9zcGluPDA+OjpfX2xhc3QsID0wKTsKLSMgIGVuZGlmIC8vIF9TVExQX1VTRV9QVEhSRUFEX1NQSU5MT0NLCi0KLSNlbmRpZiAvKiAoIF9TVExQX1NUQVRJQ19URU1QTEFURV9EQVRBID4gMCApICovCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9USFJFQURTKSAmJiAhZGVmaW5lZCAoX1NUTFBfVVNFX1BUSFJFQURfU1BJTkxPQ0spCi0KLSMgIGlmIGRlZmluZWQgKF9TVExQX1NQQVJDX1NPTEFSSVNfVEhSRUFEUykKLS8vIHVuZGVyZ3JvdW5kIGZ1bmN0aW9uIGluIGxpYmMuc287IHdlIGRvIG5vdCB3YW50IGRlcGVuZGFuY2Ugb24gbGlicnQKLWV4dGVybiAiQyIgaW50IF9fbmFub3NsZWVwKGNvbnN0IHN0cnVjdCB0aW1lc3BlYyosIHN0cnVjdCB0aW1lc3BlYyopOwotIyAgICBkZWZpbmUgX1NUTFBfTkFOT1NMRUVQIF9fbmFub3NsZWVwCi0jICBlbHNlCi0jICAgIGRlZmluZSBfU1RMUF9OQU5PU0xFRVAgbmFub3NsZWVwCi0jICBlbmRpZgotCi10ZW1wbGF0ZSA8aW50IF9faW5zdD4KLXZvaWQgX1NUTFBfQ0FMTAotX1NUTFBfbXV0ZXhfc3BpbjxfX2luc3Q+OjpfU19uc2VjX3NsZWVwKGludCBfX2xvZ19uc2VjKSB7Ci0jICBpZiBkZWZpbmVkIChfU1RMUF9XSU4zMlRIUkVBRFMpCi0gIGlmIChfX2xvZ19uc2VjIDw9IDIwKSB7Ci0gICAgLy8gTm90ZSBmcm9tIGJvb3N0ICh3d3cuYm9vc3Qub3JnKToKLSAgICAvLyBDaGFuZ2VkIHRvIFNsZWVwKDEpIGZyb20gU2xlZXAoMCkuCi0gICAgLy8gQWNjb3JkaW5nIHRvIE1TRE4sIFNsZWVwKDApIHdpbGwgbmV2ZXIgeWllbGQKLSAgICAvLyB0byBhIGxvd2VyLXByaW9yaXR5IHRocmVhZCwgd2hlcmVhcyBTbGVlcCgxKQotICAgIC8vIHdpbGwuIFBlcmZvcm1hbmNlIHNlZW1zIG5vdCB0byBiZSBhZmZlY3RlZC4KLSAgICBTbGVlcCgxKTsKLSAgfSBlbHNlIHsKLSAgICBTbGVlcCgxIDw8IChfX2xvZ19uc2VjIC0gMjApKTsKLSAgfQotIyAgZWxpZiBkZWZpbmVkKF9TVExQX09TMlRIUkVBRFMpCi0gIGlmIChfX2xvZ19uc2VjIDw9IDIwKSB7Ci0gICAgRG9zU2xlZXAoMCk7Ci0gIH0gZWxzZSB7Ci0gICAgRG9zU2xlZXAoMSA8PCAoX19sb2dfbnNlYyAtIDIwKSk7Ci0gIH0KLSMgIGVsaWYgZGVmaW5lZCAoX1NUTFBfVU5JWCkKLSAgdGltZXNwZWMgX190czsKLSAgLyogTWF4IHNsZWVwIGlzIDIqKjI3bnNlYyB+IDYwbXNlYyAgICAgICovCi0gIF9fdHMudHZfc2VjID0gMDsKLSAgX190cy50dl9uc2VjID0gMSA8PCBfX2xvZ19uc2VjOwotICBfU1RMUF9OQU5PU0xFRVAoJl9fdHMsIDApOwotIyAgZW5kaWYKLX0KLQotdGVtcGxhdGUgPGludCBfX2luc3Q+Ci12b2lkICBfU1RMUF9DQUxMCi1fU1RMUF9tdXRleF9zcGluPF9faW5zdD46Ol9NX2RvX2xvY2sodm9sYXRpbGUgX19zdGxfYXRvbWljX3QqIF9fbG9jaykgewotIyAgaWYgZGVmaW5lZChfU1RMUF9BVE9NSUNfRVhDSEFOR0UpCi0gIGlmIChfQXRvbWljX3N3YXAoX19sb2NrLCAxKSkgewotICAgIHVuc2lnbmVkIF9fbXlfc3Bpbl9tYXggPSBfU1RMUF9tdXRleF9zcGluPDA+OjpfX21heDsKLSAgICB1bnNpZ25lZCBfX215X2xhc3Rfc3BpbnMgPSBfU1RMUF9tdXRleF9zcGluPDA+OjpfX2xhc3Q7Ci0gICAgdm9sYXRpbGUgdW5zaWduZWQgX19qdW5rID0gMTc7ICAgLy8gVmFsdWUgZG9lc24ndCBtYXR0ZXIuCi0gICAgdW5zaWduZWQgIF9faTsKLQotICAgIGZvciAoX19pID0gMDsgX19pIDwgX19teV9zcGluX21heDsgKytfX2kpIHsKLSAgICAgIGlmIChfX2kgPCBfX215X2xhc3Rfc3BpbnMvMiB8fCAqX19sb2NrKSB7Ci0gICAgICAgIF9fanVuayAqPSBfX2p1bms7IF9fanVuayAqPSBfX2p1bms7Ci0gICAgICAgIF9fanVuayAqPSBfX2p1bms7IF9fanVuayAqPSBfX2p1bms7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAoIV9BdG9taWNfc3dhcChfX2xvY2ssIDEpKSB7Ci0gICAgICAgICAgLy8gZ290IGl0IQotICAgICAgICAgIC8vIFNwaW5uaW5nIHdvcmtlZC4gIFRodXMgd2UncmUgcHJvYmFibHkgbm90IGJlaW5nIHNjaGVkdWxlZAotICAgICAgICAgIC8vIGFnYWluc3QgdGhlIG90aGVyIHByb2Nlc3Mgd2l0aCB3aGljaCB3ZSB3ZXJlIGNvbnRlbmRpbmcuCi0gICAgICAgICAgLy8gVGh1cyBpdCBtYWtlcyBzZW5zZSB0byBzcGluIGxvbmdlciB0aGUgbmV4dCB0aW1lLgotICAgICAgICAgIF9TVExQX211dGV4X3NwaW48MD46Ol9fbGFzdCA9IF9faTsKLSAgICAgICAgICBfU1RMUF9tdXRleF9zcGluPDA+OjpfX21heCA9IF9TVExQX211dGV4X3NwaW48MD46Ol9faGlnaF9tYXg7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gV2UgYXJlIHByb2JhYmx5IGJlaW5nIHNjaGVkdWxlZCBhZ2FpbnN0IHRoZSBvdGhlciBwcm9jZXNzLiAgU2xlZXAuCi0gICAgX1NUTFBfbXV0ZXhfc3BpbjwwPjo6X19tYXggPSBfU1RMUF9tdXRleF9zcGluPDA+OjpfX2xvd19tYXg7Ci0KLSAgICBmb3IgKF9faSA9IDAgOzsgKytfX2kpIHsKLSAgICAgIGludCBfX2xvZ19uc2VjID0gX19pICsgNjsKLQotICAgICAgaWYgKF9fbG9nX25zZWMgPiAyNykgX19sb2dfbnNlYyA9IDI3OwotICAgICAgaWYgKCFfQXRvbWljX3N3YXAoX19sb2NrLCAxKSkgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIF9TX25zZWNfc2xlZXAoX19sb2dfbnNlYyk7Ci0gICAgfQotICB9IC8qIGZpcnN0IF9BdG9taWNfc3dhcCAqLwotIyAgZW5kaWYKLX0KLSNlbmRpZiAvLyBfU1RMUF9VU0VfUFRIUkVBRF9TUElOTE9DSwotCi1fU1RMUF9FTkRfTkFNRVNQQUNFCi0KLSNlbmRpZiAvKiBfU1RMUF9FWFBPU0VfR0xPQkFMU19JTVBMRU1FTlRBVElPTiAqLwotI2VuZGlmIC8qICBfU1RMUF9USFJFQURTX0MgKi8KLQotLy8gTG9jYWwgVmFyaWFibGVzOgotLy8gbW9kZTpDKysKLS8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9fdGhyZWFkcy5oIGIvc3RsL190aHJlYWRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhOTZjYTIuLjAwMDAwMDAKLS0tIGEvc3RsL190aHJlYWRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0xOTk5Ci0gKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0vLyBXQVJOSU5HOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBDKysKLS8vIHN0YW5kYXJkIGxpYnJhcnkgaGVhZGVycy4gIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIHRoaXMgaGVhZGVyCi0vLyBmaWxlIGRpcmVjdGx5LgotCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfVEhSRUFEU19ICi0jZGVmaW5lIF9TVExQX0lOVEVSTkFMX1RIUkVBRFNfSAotCi0vLyBTdXBwb3J0ZWQgdGhyZWFkaW5nIG1vZGVscyBhcmUgbmF0aXZlIFNHSSwgcHRocmVhZHMsIHVpdGhyZWFkcwotLy8gKHNpbWlsYXIgdG8gcHRocmVhZHMsIGJ1dCBiYXNlZCBvbiBhbiBlYXJsaWVyIGRyYWZ0IG9mIHRoZSBQb3NpeAotLy8gdGhyZWFkcyBzdGFuZGFyZCksIGFuZCBXaW4zMiB0aHJlYWRzLiAgVWl0aHJlYWQgc3VwcG9ydCBieSBKb2NoZW4KLS8vIFNjaGxpY2ssIDE5OTksIGFuZCBTb2xhcmlzIHRocmVhZHMgZ2VuZXJhbGl6ZWQgdG8gdGhlbS4KLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DU1REREVGCi0jICBpbmNsdWRlIDxzdGwvX2NzdGRkZWYuaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NTVERMSUIKLSMgIGluY2x1ZGUgPHN0bC9fY3N0ZGxpYi5oPgotI2VuZGlmCi0KLS8vIE9uIFNVTiBhbmQgTWFjIE9TIFggZ2NjLCB6ZXJvLWluaXRpYWxpemF0aW9uIHdvcmtzIGp1c3QgZmluZS4uLgotI2lmIGRlZmluZWQgKF9fc3VuKSB8fCAoZGVmaW5lZCAoX19HTlVDX18pICYmIGRlZmluZWQoX19BUFBMRV9fKSkKLSMgIGRlZmluZSBfU1RMUF9NVVRFWF9JTklUSUFMSVpFUgotI2VuZGlmCi0KLS8qIFRoaXMgaGVhZGVyIGRlZmluZXMgdGhlIGZvbGxvd2luZyBhdG9taWMgb3BlcmF0aW9uIHRoYXQgcGxhdGZvcm0gc2hvdWxkCi0gKiB0cnkgdG8gc3VwcG9ydCBhcyBtdWNoIGFzIHBvc3NpYmxlLiBBdG9taWMgb3BlcmF0aW9uIGFyZSBleHBvc2VkIGFzIG1hY3JvCi0gKiBpbiBvcmRlciB0byBlYXNpbHkgdGVzdCBmb3IgdGhlaXIgZXhpc3RhbmNlLiBUaGV5IGFyZToKLSAqIF9fc3RsX2F0b21pY190IF9TVExQX0FUT01JQ19JTkNSRU1FTlQodm9sYXRpbGUgX19zdGxfYXRvbWljX3QqIF9fcHRyKSA6Ci0gKiBpbmNyZW1lbnQgKl9fcHRyIGJ5IDEgYW5kIHJldHVybnMgdGhlIG5ldyB2YWx1ZQotICogX19zdGxfYXRvbWljX3QgX1NUTFBfQVRPTUlDX0RFQ1JFTUVOVCh2b2xhdGlsZSBfX3N0bF9hdG9taWNfdCogX19wdHIpIDoKLSAqIGRlY3JlbWVudCAgKl9fcHRyIGJ5IDEgYW5kIHJldHVybnMgdGhlIG5ldyB2YWx1ZQotICogX19zdGxfYXRvbWljX3QgX1NUTFBfQVRPTUlDX0VYQ0hBTkdFKHZvbGF0aWxlIF9fc3RsX2F0b21pY190KiBfX3RhcmdldCwgX19zdGxfYXRvbWljX3QgX192YWwpIDoKLSAqIGFzc2lnbiBfX3ZhbCB0byAqX190YXJnZXQgYW5kIHJldHVybnMgZm9ybWVyICpfX3RhcmdldCB2YWx1ZQotICogdm9pZCogX1NUTFBfQVRPTUlDX0VYQ0hBTkdFX1BUUih2b2lkKiB2b2xhdGlsZSogX190YXJnZXQsIHZvaWQqIF9fcHRyKSA6Ci0gKiBhc3NpZ24gX19wdHIgdG8gKl9fdGFyZ2V0IGFuZCByZXR1cm5zIGZvcm1lciAqX190YXJnZXQgdmFsdWUKLSAqIF9fc3RsX2F0b21pY190IF9TVExQX0FUT01JQ19BREQodm9sYXRpbGUgX19zdGxfYXRvbWljX3QqIF9fdGFyZ2V0LCBfX3N0bF9hdG9taWNfdCBfX3ZhbCkgOgotICogZG9lcyAqX190YXJnZXQgPSAqX190YXJnZXQgKyBfX3ZhbCBhbmQgcmV0dXJucyB0aGUgb2xkICpfX3RhcmdldCB2YWx1ZQotICovCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9XSU4zMikgfHwgZGVmaW5lZCAoX19zZ2kpIHx8IGRlZmluZWQgKF9TVExQX1NQQVJDX1NPTEFSSVNfVEhSRUFEUykKLXR5cGVkZWYgbG9uZyBfX3N0bF9hdG9taWNfdDsKLSNlbHNlCi0vKiBEb24ndCBpbXBvcnQgd2hvbGUgbmFtZXNwYWNlISEhISAtIHB0ciAqLwotLy8gIyBpZiBkZWZpbmVkIChfU1RMUF9VU0VfTkFNRVNQQUNFUykgJiYgISBkZWZpbmVkIChfU1RMUF9WRU5ET1JfR0xPQkFMX0NTVEQpCi0vLyAvLyB1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6c2l6ZV90OwotLy8gdXNpbmcgbmFtZXNwYWNlIF9TVExQX1ZFTkRPUl9DU1REOwotLy8gIyBlbmRpZgotdHlwZWRlZiBzaXplX3QgX19zdGxfYXRvbWljX3Q7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9TVExQX1RIUkVBRFMpCi0KLSMgIGlmIGRlZmluZWQgKF9TVExQX1NHSV9USFJFQURTKQotCi0jICAgIGluY2x1ZGUgPG11dGV4Lmg+Ci0vLyBIYWNrIGZvciBTR0kgbzMyIGNvbXBpbGVycy4KLSMgICAgaWYgIWRlZmluZWQoX19hZGRfYW5kX2ZldGNoKSAmJiBcCi0gICAgICAgIChfX21pcHMgPCAzIHx8ICEoZGVmaW5lZCAoX0FCSU4zMikgfHwgZGVmaW5lZChfQUJJNjQpKSkKLSMgICAgICBkZWZpbmUgX19hZGRfYW5kX2ZldGNoKF9fbCxfX3YpIGFkZF90aGVuX3Rlc3QoKHVuc2lnbmVkIGxvbmcqKV9fbCxfX3YpCi0jICAgICAgZGVmaW5lIF9fdGVzdF9hbmRfc2V0KF9fbCxfX3YpICB0ZXN0X2FuZF9zZXQoX19sLF9fdikKLSMgICAgZW5kaWYgLyogbzMyICovCi0KLSMgICAgaWYgX19taXBzIDwgMyB8fCAhKGRlZmluZWQgKF9BQklOMzIpIHx8IGRlZmluZWQoX0FCSTY0KSkKLSMgICAgICBkZWZpbmUgX1NUTFBfQVRPTUlDX0VYQ0hBTkdFKF9fcCwgX19xKSB0ZXN0X2FuZF9zZXQoX19wLCBfX3EpCi0jICAgIGVsc2UKLSMgICAgICBkZWZpbmUgX1NUTFBfQVRPTUlDX0VYQ0hBTkdFKF9fcCwgX19xKSBfX3Rlc3RfYW5kX3NldCgodW5zaWduZWQgbG9uZyopX19wLCAodW5zaWduZWQgbG9uZylfX3EpCi0jICAgIGVuZGlmCi0KLSMgICAgZGVmaW5lIF9TVExQX0FUT01JQ19JTkNSRU1FTlQoX194KSBfX2FkZF9hbmRfZmV0Y2goX194LCAxKQotIyAgICBkZWZpbmUgX1NUTFBfQVRPTUlDX0RFQ1JFTUVOVChfX3gpIF9fYWRkX2FuZF9mZXRjaChfX3gsIChzaXplX3QpIC0xKQotCi0jICBlbGlmIGRlZmluZWQgKF9TVExQX1BUSFJFQURTKQotCi0jICAgIGluY2x1ZGUgPHB0aHJlYWQuaD4KLSMgICAgaWYgIWRlZmluZWQgKF9TVExQX1VTRV9QVEhSRUFEX1NQSU5MT0NLKQotIyAgICAgIGlmIGRlZmluZWQgKFBUSFJFQURfTVVURVhfSU5JVElBTElaRVIpICYmICFkZWZpbmVkIChfU1RMUF9NVVRFWF9JTklUSUFMSVpFUikgJiYgZGVmaW5lZCAoX1JFRU5UUkFOVCkKLSMgICAgICAgIGRlZmluZSBfU1RMUF9NVVRFWF9JTklUSUFMSVpFUiA9IHsgUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUiB9Ci0jICAgICAgZW5kaWYKLS8vSFBVWCB2YXJpYW50cyBoYXZlIChvbiBzb21lIHBsYXRmb3JtcyBvcHRpb25hbCkgbm9uLXN0YW5kYXJkICJEQ0UiIHB0aHJlYWRzIGltcGwKLSMgICAgICBpZiBkZWZpbmVkIChfREVDVEhSRUFEU18pICYmIChkZWZpbmVkIChfUFRIUkVBRF9VU0VfRDQpIHx8IGRlZmluZWQgKF9faHB1eCkpICYmICFkZWZpbmVkIChfQ01BX1NVUFBSRVNTX0VYVEVSTkFMU18pCi0jICAgICAgICBkZWZpbmUgX1NUTFBfUFRIUkVBRF9BVFRSX0RFRkFVTFQgcHRocmVhZF9tdXRleGF0dHJfZGVmYXVsdAotIyAgICAgIGVsc2UKLSMgICAgICAgIGRlZmluZSBfU1RMUF9QVEhSRUFEX0FUVFJfREVGQVVMVCAwCi0jICAgICAgZW5kaWYKLSMgICAgZWxzZSAvLyBfU1RMUF9VU0VfUFRIUkVBRF9TUElOTE9DSwotIyAgICAgIGlmIGRlZmluZWQgKF9fT3BlbkJTRF9fKQotIyAgICAgICAgaW5jbHVkZSA8c3BpbmxvY2suaD4KLSMgICAgICBlbmRpZgotIyAgICBlbmRpZiAvLyBfU1RMUF9VU0VfUFRIUkVBRF9TUElOTE9DSwotCi0jICAgIGlmIGRlZmluZWQgKF9fR05VQ19fKSAmJiBkZWZpbmVkIChfX2kzODZfXykKLQotIyAgICAgIGlmICFkZWZpbmVkIChfU1RMUF9BVE9NSUNfSU5DUkVNRU5UKQotaW5saW5lIGxvbmcgX1NUTFBfYXRvbWljX2luY3JlbWVudF9nY2NfeDg2KGxvbmcgdm9sYXRpbGUqIHApIHsKLSAgbG9uZyByZXN1bHQ7Ci0gIF9fYXNtX18gX192b2xhdGlsZV9fCi0gICAgKCJsb2NrOyB4YWRkbCAgJTEsICUwOyIKLSAgICA6Ij1tIiAoKnApLCAiPXIiIChyZXN1bHQpCi0gICAgOiJtIiAoKnApLCAgIjEiICAoMSkKLSAgICA6ImNjIik7Ci0gIHJldHVybiByZXN1bHQgKyAxOwotfQotIyAgICAgICAgZGVmaW5lIF9TVExQX0FUT01JQ19JTkNSRU1FTlQoX194KSAoX1NUTFBfYXRvbWljX2luY3JlbWVudF9nY2NfeDg2KChsb25nIHZvbGF0aWxlKilfX3gpKQotIyAgICAgIGVuZGlmCi0KLSMgICAgICBpZiAhZGVmaW5lZCAoX1NUTFBfQVRPTUlDX0RFQ1JFTUVOVCkKLWlubGluZSBsb25nIF9TVExQX2F0b21pY19kZWNyZW1lbnRfZ2NjX3g4Nihsb25nIHZvbGF0aWxlKiBwKSB7Ci0gIGxvbmcgcmVzdWx0OwotICBfX2FzbV9fIF9fdm9sYXRpbGVfXwotICAgICgibG9jazsgeGFkZGwgICUxLCAlMDsiCi0gICAgOiI9bSIgKCpwKSwgIj1yIiAocmVzdWx0KQotICAgIDoibSIgKCpwKSwgICIxIiAgKC0xKQotICAgIDoiY2MiKTsKLSAgcmV0dXJuIHJlc3VsdCAtIDE7Ci19Ci0jICAgICAgICBkZWZpbmUgX1NUTFBfQVRPTUlDX0RFQ1JFTUVOVChfX3gpIChfU1RMUF9hdG9taWNfZGVjcmVtZW50X2djY194ODYoKGxvbmcgdm9sYXRpbGUqKV9feCkpCi0jICAgICAgZW5kaWYKLQotIyAgICAgIGlmICFkZWZpbmVkIChfU1RMUF9BVE9NSUNfQUREKQotaW5saW5lIGxvbmcgX1NUTFBfYXRvbWljX2FkZF9nY2NfeDg2KGxvbmcgdm9sYXRpbGUqIHAsIGxvbmcgYWRkZW5kKSB7Ci0gIGxvbmcgcmVzdWx0OwotICBfX2FzbV9fIF9fdm9sYXRpbGVfXwotICAgICgibG9jazsgeGFkZGwgJTEsICUwOyIKLSAgICA6Ij1tIiAoKnApLCAiPXIiIChyZXN1bHQpCi0gICAgOiJtIiAgKCpwKSwgIjEiICAoYWRkZW5kKQotICAgIDoiY2MiKTsKLSByZXR1cm4gcmVzdWx0ICsgYWRkZW5kOwotfQotIyAgICAgICAgZGVmaW5lIF9TVExQX0FUT01JQ19BREQoX19kc3QsIF9fdmFsKSAgKF9TVExQX2F0b21pY19hZGRfZ2NjX3g4NigobG9uZyB2b2xhdGlsZSopX19kc3QsIChsb25nKV9fdmFsKSkKLSMgICAgICBlbmRpZgotCi0jICAgIGVuZGlmIC8qIGlmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19pMzg2X18pICovCi0KLSMgIGVsaWYgZGVmaW5lZCAoX1NUTFBfV0lOMzJUSFJFQURTKQotCi0jICAgIGlmICFkZWZpbmVkIChfU1RMUF9BVE9NSUNfSU5DUkVNRU5UKQotIyAgICAgIGlmICFkZWZpbmVkIChfU1RMUF9ORVdfUExBVEZPUk1fU0RLKQotIyAgICAgICAgZGVmaW5lIF9TVExQX0FUT01JQ19JTkNSRU1FTlQoX194KSAgICAgICAgICAgSW50ZXJsb2NrZWRJbmNyZW1lbnQoX19DT05TVF9DQVNUKGxvbmcqLCBfX3gpKQotIyAgICAgICAgZGVmaW5lIF9TVExQX0FUT01JQ19ERUNSRU1FTlQoX194KSAgICAgICAgICAgSW50ZXJsb2NrZWREZWNyZW1lbnQoX19DT05TVF9DQVNUKGxvbmcqLCBfX3gpKQotIyAgICAgICAgZGVmaW5lIF9TVExQX0FUT01JQ19FWENIQU5HRShfX3gsIF9feSkgICAgICAgSW50ZXJsb2NrZWRFeGNoYW5nZShfX0NPTlNUX0NBU1QobG9uZyosIF9feCksIF9feSkKLSMgICAgICBlbHNlCi0jICAgICAgICBkZWZpbmUgX1NUTFBfQVRPTUlDX0lOQ1JFTUVOVChfX3gpICAgICAgICAgICBJbnRlcmxvY2tlZEluY3JlbWVudChfX3gpCi0jICAgICAgICBkZWZpbmUgX1NUTFBfQVRPTUlDX0RFQ1JFTUVOVChfX3gpICAgICAgICAgICBJbnRlcmxvY2tlZERlY3JlbWVudChfX3gpCi0jICAgICAgICBkZWZpbmUgX1NUTFBfQVRPTUlDX0VYQ0hBTkdFKF9feCwgX195KSAgICAgICBJbnRlcmxvY2tlZEV4Y2hhbmdlKF9feCwgX195KQotIyAgICAgIGVuZGlmCi0jICAgICAgZGVmaW5lIF9TVExQX0FUT01JQ19FWENIQU5HRV9QVFIoX194LCBfX3kpICAgICBTVExQSW50ZXJsb2NrZWRFeGNoYW5nZVBvaW50ZXIoX194LCBfX3kpCi0vKgotICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbm5hbGl0eSBpcyBvbmx5IGF2YWlsYWJsZSBzaW5jZSBXaW5kb3dzIDk4LCB0aG9zZSB0aGF0IGFyZSB0YXJnZXRpbmcgcHJldmlvdXMgT1NlcwotICogc2hvdWxkIGRlZmluZSBfV0lOMzJfV0lORE9XUyB0byBhIHZhbHVlIGxvd2VyIHRoYXQgdGhlIG9uZSBvZiBXaW4gOTgsIHNlZSBQbGF0Zm9ybSBTREsgZG9jdW1lbnRhdGlvbiBmb3IKLSAqIG1vcmUgaW5mb3JtYXRpb25zOgotICovCi0jICAgICAgaWYgZGVmaW5lZCAoX1NUTFBfTkVXX1BMQVRGT1JNX1NESykgJiYgKCFkZWZpbmVkIChfU1RMUF9XSU4zMl9WRVJTSU9OKSB8fCAoX1NUTFBfV0lOMzJfVkVSU0lPTiA+PSAweDA0MTApKQotIyAgICAgICAgZGVmaW5lIF9TVExQX0FUT01JQ19BREQoX19kc3QsIF9fdmFsKSBJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkKF9fZHN0LCBfX3ZhbCkKLSMgICAgICBlbmRpZgotIyAgICBlbmRpZgotCi0jICBlbGlmIGRlZmluZWQgKF9fREVDQykgfHwgZGVmaW5lZCAoX19ERUNDWFgpCi0KLSMgICAgaW5jbHVkZSA8bWFjaGluZS9idWlsdGlucy5oPgotIyAgICBkZWZpbmUgX1NUTFBfQVRPTUlDX0VYQ0hBTkdFIF9fQVRPTUlDX0VYQ0hfTE9ORwotIyAgICBkZWZpbmUgX1NUTFBfQVRPTUlDX0lOQ1JFTUVOVChfX3gpIF9fQVRPTUlDX0FERF9MT05HKF9feCwgMSkKLSMgICAgZGVmaW5lIF9TVExQX0FUT01JQ19ERUNSRU1FTlQoX194KSBfX0FUT01JQ19BRERfTE9ORyhfX3gsIC0xKQotCi0jICBlbGlmIGRlZmluZWQoX1NUTFBfU1BBUkNfU09MQVJJU19USFJFQURTKQotCi0jICAgIGluY2x1ZGUgPHN0bC9fc3BhcmNfYXRvbWljLmg+Ci0KLSMgIGVsaWYgZGVmaW5lZCAoX1NUTFBfVUlUSFJFQURTKQotCi0vLyB0aGlzIGluY2x1c2lvbiBpcyBwb3RlbnRpYWwgaGF6YXJkIHRvIGJyaW5nIHVwIGFsbCBzb3J0cwotLy8gb2Ygb2xkLXN0eWxlIGhlYWRlcnMuIExldCdzIGFzc3VtZSB2ZW5kb3IgYWxyZWFkeSBrbm93IGhvdwotLy8gdG8gZGVhbCB3aXRoIHRoYXQuCi0jICAgIGlmbmRlZiBfU1RMUF9JTlRFUk5BTF9DVElNRQotIyAgICAgIGluY2x1ZGUgPHN0bC9fY3RpbWUuaD4KLSMgICAgZW5kaWYKLSMgICAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX05BTUVTUEFDRVMpICYmICEgZGVmaW5lZCAoX1NUTFBfVkVORE9SX0dMT0JBTF9DU1REKQotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnRpbWVfdDsKLSMgICAgZW5kaWYKLSMgICAgaW5jbHVkZSA8c3luY2guaD4KLSMgICAgaW5jbHVkZSA8Y3N0ZGlvPgotIyAgICBpbmNsdWRlIDxjd2NoYXI+Ci0KLSMgIGVsaWYgZGVmaW5lZCAoX1NUTFBfQkVUSFJFQURTKQotCi0jICAgIGluY2x1ZGUgPE9TLmg+Ci0jICAgIGluY2x1ZGUgPGNhc3NlcnQ+Ci0jICAgIGluY2x1ZGUgPHN0ZGlvLmg+Ci0jICAgIGRlZmluZSBfU1RMUF9NVVRFWF9JTklUSUFMSVpFUiA9IHsgMCB9Ci0KLSMgIGVsaWYgZGVmaW5lZCAoX1NUTFBfTldUSFJFQURTKQotCi0jICAgIGluY2x1ZGUgPG53dGhyZWFkLmg+Ci0jICAgIGluY2x1ZGUgPG53c2VtYXBoLmg+Ci0KLSMgIGVsaWYgZGVmaW5lZChfU1RMUF9PUzJUSFJFQURTKQotCi0jICAgIGlmIGRlZmluZWQgKF9fR05VQ19fKQotIyAgICAgIGRlZmluZSBJTkNMX0RPU1NFTUFQSE9SRVMKLSMgICAgICBpbmNsdWRlIDxvczIuaD4KLSMgICAgZWxzZQotLy8gVGhpcyBzZWN0aW9uIHNlcnZlcyB0byByZXBsYWNlIG9zMi5oIGZvciBWaXN1YWxBZ2UgQysrCi0gIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBVTE9ORzsKLSMgICAgICBpZiAhZGVmaW5lZCAoX19IRVZfXykgIC8qIElOQ0xfU0VNQVBIT1JFIG1heSBhbHNvIGRlZmluZSBIRVYgKi8KLSMgICAgICAgIGRlZmluZSBfX0hFVl9fCi0gIHR5cGVkZWYgVUxPTkcgSEVWOwotICB0eXBlZGVmIEhFViogIFBIRVY7Ci0jICAgICAgZW5kaWYKLSAgdHlwZWRlZiBVTE9ORyBBUElSRVQ7Ci0gIHR5cGVkZWYgVUxPTkcgSE1UWDsKLSAgdHlwZWRlZiBITVRYKiAgUEhNVFg7Ci0gIHR5cGVkZWYgY29uc3QgY2hhciogIFBDU1o7Ci0gIHR5cGVkZWYgVUxPTkcgQk9PTDMyOwotICBBUElSRVQgX1N5c3RlbSBEb3NDcmVhdGVNdXRleFNlbShQQ1NaIHBzek5hbWUsIFBIRVYgcGhldiwgVUxPTkcgZmxBdHRyLCBCT09MMzIgZlN0YXRlKTsKLSAgQVBJUkVUIF9TeXN0ZW0gRG9zUmVxdWVzdE11dGV4U2VtKEhNVFggaG10eCwgVUxPTkcgdWxUaW1lb3V0KTsKLSAgQVBJUkVUIF9TeXN0ZW0gRG9zUmVsZWFzZU11dGV4U2VtKEhNVFggaG10eCk7Ci0gIEFQSVJFVCBfU3lzdGVtIERvc0Nsb3NlTXV0ZXhTZW0oSE1UWCBobXR4KTsKLSMgICAgICBkZWZpbmUgX1NUTFBfTVVURVhfSU5JVElBTElaRVIgPSB7IDAgfQotIyAgICBlbmRpZiAvKiBHTlVDICovCi0KLSMgIGVuZGlmCi0KLSNlbHNlCi0vKiBubyB0aHJlYWRzICovCi0jICBkZWZpbmUgX1NUTFBfQVRPTUlDX0lOQ1JFTUVOVChfX3gpICsrKCpfX3gpCi0jICBkZWZpbmUgX1NUTFBfQVRPTUlDX0RFQ1JFTUVOVChfX3gpIC0tKCpfX3gpCi0vKiBXZSBkbyBub3QgZ3JhbnQgb3RoZXIgYXRvbWljIG9wZXJhdGlvbnMgYXMgdGhleSBhcmUgdXNlbGVzcyBpZiBTVExwb3J0IGRvIG5vdCBoYXZlCi0gKiB0byBiZSB0aHJlYWQgc2FmZQotICovCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkIChfU1RMUF9NVVRFWF9JTklUSUFMSVpFUikKLSMgIGlmIGRlZmluZWQoX1NUTFBfQVRPTUlDX0VYQ0hBTkdFKQotIyAgICBkZWZpbmUgX1NUTFBfTVVURVhfSU5JVElBTElaRVIgPSB7IDAgfQotIyAgZWxpZiBkZWZpbmVkKF9TVExQX1VJVEhSRUFEUykKLSMgICAgZGVmaW5lIF9TVExQX01VVEVYX0lOSVRJQUxJWkVSID0geyBERUZBVUxUTVVURVggfQotIyAgZWxzZQotIyAgICBkZWZpbmUgX1NUTFBfTVVURVhfSU5JVElBTElaRVIKLSMgIGVuZGlmCi0jZW5kaWYKLQotX1NUTFBfQkVHSU5fTkFNRVNQQUNFCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9USFJFQURTKSAmJiAhZGVmaW5lZCAoX1NUTFBfVVNFX1BUSFJFQURfU1BJTkxPQ0spCi0vLyBIZWxwZXIgc3RydWN0LiAgVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIHZhcmlvdXMgY29tcGlsZXJzIHRoYXQgZG9uJ3QKLS8vIGhhbmRsZSBzdGF0aWMgdmFyaWFibGVzIGluIGlubGluZSBmdW5jdGlvbnMgcHJvcGVybHkuCi10ZW1wbGF0ZSA8aW50IF9faW5zdD4KLXN0cnVjdCBfU1RMUF9tdXRleF9zcGluIHsKLSAgZW51bSB7IF9fbG93X21heCA9IDMwLCBfX2hpZ2hfbWF4ID0gMTAwMCB9OwotICAvLyBMb3cgaWYgd2Ugc3VzcGVjdCB1bmlwcm9jZXNzb3IsIGhpZ2ggZm9yIG11bHRpcHJvY2Vzc29yLgotICBzdGF0aWMgdW5zaWduZWQgX19tYXg7Ci0gIHN0YXRpYyB1bnNpZ25lZCBfX2xhc3Q7Ci0gIHN0YXRpYyB2b2lkIF9TVExQX0NBTEwgX01fZG9fbG9jayh2b2xhdGlsZSBfX3N0bF9hdG9taWNfdCogX19sb2NrKTsKLSAgc3RhdGljIHZvaWQgX1NUTFBfQ0FMTCBfU19uc2VjX3NsZWVwKGludCBfX2xvZ19uc2VjKTsKLX07Ci0jZW5kaWYgLy8gIV9TVExQX1VTRV9QVEhSRUFEX1NQSU5MT0NLCi0KLS8vIExvY2tpbmcgY2xhc3MuICBOb3RlIHRoYXQgdGhpcyBjbGFzcyAqZG9lcyBub3QgaGF2ZSBhIGNvbnN0cnVjdG9yKi4KLS8vIEl0IG11c3QgYmUgaW5pdGlhbGl6ZWQgZWl0aGVyIHN0YXRpY2FsbHksIHdpdGggX1NUTFBfTVVURVhfSU5JVElBTElaRVIsCi0vLyBvciBkeW5hbWljYWxseSwgYnkgZXhwbGljaXRseSBjYWxsaW5nIHRoZSBfTV9pbml0aWFsaXplIG1lbWJlciBmdW5jdGlvbi4KLS8vIChUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIHdheXMgdGhhdCBhIHB0aHJlYWRzIG11dGV4IGNhbiBiZSBpbml0aWFsaXplZC4pCi0vLyBUaGVyZSBhcmUgZXhwbGljaXQgbWVtYmVyIGZ1bmN0aW9ucyBmb3IgYWNxdWlyaW5nIGFuZCByZWxlYXNpbmcgdGhlIGxvY2suCi0KLS8vIFRoZXJlIGlzIG5vIGNvbnN0cnVjdG9yIGJlY2F1c2Ugc3RhdGljIGluaXRpYWxpemF0aW9uIGlzIGVzc2VudGlhbCBmb3IKLS8vIHNvbWUgdXNlcywgYW5kIG9ubHkgYSBjbGFzcyBhZ2dyZWdhdGUgKHNlZSBzZWN0aW9uIDguNS4xIG9mIHRoZSBDKysKLS8vIHN0YW5kYXJkKSBjYW4gYmUgaW5pdGlhbGl6ZWQgdGhhdCB3YXkuICBUaGF0IG1lYW5zIHdlIG11c3QgaGF2ZSBubwotLy8gY29uc3RydWN0b3JzLCBubyBiYXNlIGNsYXNzZXMsIG5vIHZpcnR1YWwgZnVuY3Rpb25zLCBhbmQgbm8gcHJpdmF0ZSBvcgotLy8gcHJvdGVjdGVkIG1lbWJlcnMuCi0KLS8vIEZvciBub24tc3RhdGljIGNhc2VzLCBjbGllbnRzIHNob3VsZCB1c2UgIF9TVExQX211dGV4LgotCi1zdHJ1Y3QgX1NUTFBfQ0xBU1NfREVDTFNQRUMgX1NUTFBfbXV0ZXhfYmFzZSB7Ci0jaWYgZGVmaW5lZCAoX1NUTFBfQVRPTUlDX0VYQ0hBTkdFKSB8fCBkZWZpbmVkIChfU1RMUF9TR0lfVEhSRUFEUykKLSAgLy8gSXQgc2hvdWxkIGJlIHJlbGF0aXZlbHkgZWFzeSB0byBnZXQgdGhpcyB0byB3b3JrIG9uIGFueSBtb2Rlcm4gVW5peC4KLSAgdm9sYXRpbGUgX19zdGxfYXRvbWljX3QgX01fbG9jazsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX1NUTFBfVEhSRUFEUykKLSMgIGlmIGRlZmluZWQgKF9TVExQX0FUT01JQ19FWENIQU5HRSkKLSAgaW5saW5lIHZvaWQgX01faW5pdGlhbGl6ZSgpIHsgX01fbG9jayA9IDA7IH0KLSAgaW5saW5lIHZvaWQgX01fZGVzdHJveSgpIHt9Ci0KLSAgdm9pZCBfTV9hY3F1aXJlX2xvY2soKSB7Ci0gICAgX1NUTFBfbXV0ZXhfc3BpbjwwPjo6X01fZG9fbG9jaygmX01fbG9jayk7Ci0gIH0KLQotICBpbmxpbmUgdm9pZCBfTV9yZWxlYXNlX2xvY2soKSB7Ci0gICAgdm9sYXRpbGUgX19zdGxfYXRvbWljX3QqIF9fbG9jayA9ICZfTV9sb2NrOwotIyAgICBpZiBkZWZpbmVkKF9TVExQX1NHSV9USFJFQURTKSAmJiBkZWZpbmVkKF9fR05VQ19fKSAmJiBfX21pcHMgPj0gMwotICAgIGFzbSgic3luYyIpOwotICAgICpfX2xvY2sgPSAwOwotIyAgICBlbGlmIGRlZmluZWQoX1NUTFBfU0dJX1RIUkVBRFMpICYmIF9fbWlwcyA+PSAzICYmIFwKLSAgICAgICAgIChkZWZpbmVkIChfQUJJTjMyKSB8fCBkZWZpbmVkKF9BQkk2NCkpCi0gICAgX19sb2NrX3JlbGVhc2UoX19sb2NrKTsKLSMgICAgZWxpZiBkZWZpbmVkIChfU1RMUF9TUEFSQ19TT0xBUklTX1RIUkVBRFMpCi0jICAgICAgaWYgZGVmaW5lZCAoX19XT1JENjQpIHx8IGRlZmluZWQgKF9fYXJjaDY0X18pIHx8IGRlZmluZWQgKF9fc3BhcmN2OSkgfHwgZGVmaW5lZCAoX19zcGFyY3Y4cGx1cykKLSAgICBhc20oIm1lbWJhciAjU3RvcmVTdG9yZSA7IG1lbWJhciAjTG9hZFN0b3JlIik7Ci0jICAgICAgZWxzZQotICAgIGFzbSgiIHN0YmFyICIpOwotIyAgICAgIGVuZGlmCi0gICAgKl9fbG9jayA9IDA7Ci0jICAgIGVsc2UKLSAgICAqX19sb2NrID0gMDsKLSAgICAvLyBUaGlzIGlzIG5vdCBzdWZmaWNpZW50IG9uIG1hbnkgbXVsdGlwcm9jZXNzb3JzLCBzaW5jZQotICAgIC8vIHdyaXRlcyB0byBwcm90ZWN0ZWQgdmFyaWFibGVzIGFuZCB0aGUgbG9jayBtYXkgYmUgcmVvcmRlcmVkLgotIyAgICBlbmRpZgotICB9Ci0jICBlbGlmIGRlZmluZWQgKF9TVExQX1BUSFJFQURTKQotIyAgICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfUFRIUkVBRF9TUElOTE9DSykKLSMgICAgICBpZiAhZGVmaW5lZCAoX19PcGVuQlNEX18pCi0gIHB0aHJlYWRfc3BpbmxvY2tfdCBfTV9sb2NrOwotICBpbmxpbmUgdm9pZCBfTV9pbml0aWFsaXplKCkgeyBwdGhyZWFkX3NwaW5faW5pdCggJl9NX2xvY2ssIDAgKTsgfQotICBpbmxpbmUgdm9pZCBfTV9kZXN0cm95KCkgeyBwdGhyZWFkX3NwaW5fZGVzdHJveSggJl9NX2xvY2sgKTsgfQotCi0gIC8vIHNvcnJ5LCBidXQgbm8gc3RhdGljIGluaXRpYWxpemVyIGZvciBwdGhyZWFkX3NwaW5sb2NrX3Q7Ci0gIC8vIHRoaXMgd2lsbCBub3Qgd29yayBmb3IgY29tcGlsZXJzIHRoYXQgaGFzIHByb2JsZW1zIHdpdGggY2FsbAotICAvLyBjb25zdHJ1Y3RvciBvZiBzdGF0aWMgb2JqZWN0Li4uCi0KLSAgLy8gX1NUTFBfbXV0ZXhfYmFzZSgpCi0gIC8vICAgeyBwdGhyZWFkX3NwaW5faW5pdCggJl9NX2xvY2ssIDAgKTsgfQotCi0gIC8vIH5fU1RMUF9tdXRleF9iYXNlKCkKLSAgLy8gICB7IHB0aHJlYWRfc3Bpbl9kZXN0cm95KCAmX01fbG9jayApOyB9Ci0KLSAgaW5saW5lIHZvaWQgX01fYWNxdWlyZV9sb2NrKCkgeyBwdGhyZWFkX3NwaW5fbG9jayggJl9NX2xvY2sgKTsgfQotICBpbmxpbmUgdm9pZCBfTV9yZWxlYXNlX2xvY2soKSB7IHB0aHJlYWRfc3Bpbl91bmxvY2soICZfTV9sb2NrICk7IH0KLSMgICAgICBlbHNlIC8vIF9fT3BlbkJTRF9fCi0gIHNwaW5sb2NrX3QgX01fbG9jazsKLSAgaW5saW5lIHZvaWQgX01faW5pdGlhbGl6ZSgpIHsgX1NQSU5MT0NLX0lOSVQoICZfTV9sb2NrICk7IH0KLSAgaW5saW5lIHZvaWQgX01fZGVzdHJveSgpIHsgfQotICBpbmxpbmUgdm9pZCBfTV9hY3F1aXJlX2xvY2soKSB7IF9TUElOTE9DSyggJl9NX2xvY2sgKTsgfQotICBpbmxpbmUgdm9pZCBfTV9yZWxlYXNlX2xvY2soKSB7IF9TUElOVU5MT0NLKCAmX01fbG9jayApOyB9Ci0jICAgICAgZW5kaWYgLy8gX19PcGVuQlNEX18KLSMgICAgZWxzZSAvLyAhX1NUTFBfVVNFX1BUSFJFQURfU1BJTkxPQ0sKLSAgcHRocmVhZF9tdXRleF90IF9NX2xvY2s7Ci0gIGlubGluZSB2b2lkIF9NX2luaXRpYWxpemUoKQotICB7IHB0aHJlYWRfbXV0ZXhfaW5pdCgmX01fbG9jayxfU1RMUF9QVEhSRUFEX0FUVFJfREVGQVVMVCk7IH0KLSAgaW5saW5lIHZvaWQgX01fZGVzdHJveSgpCi0gIHsgcHRocmVhZF9tdXRleF9kZXN0cm95KCZfTV9sb2NrKTsgfQotICBpbmxpbmUgdm9pZCBfTV9hY3F1aXJlX2xvY2soKSB7Ci0jICAgICAgaWYgZGVmaW5lZCAoIF9faHB1eCApICYmICEgZGVmaW5lZCAoUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUikKLSAgICBpZiAoIV9NX2xvY2suZmllbGQxKSAgX01faW5pdGlhbGl6ZSgpOwotIyAgICAgIGVuZGlmCi0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZfTV9sb2NrKTsKLSAgfQotICBpbmxpbmUgdm9pZCBfTV9yZWxlYXNlX2xvY2soKSB7IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZfTV9sb2NrKTsgfQotIyAgICBlbmRpZiAvLyAhX1NUTFBfVVNFX1BUSFJFQURfU1BJTkxPQ0sKLQotIyAgZWxpZiBkZWZpbmVkIChfU1RMUF9VSVRIUkVBRFMpCi0gIG11dGV4X3QgX01fbG9jazsKLSAgaW5saW5lIHZvaWQgX01faW5pdGlhbGl6ZSgpCi0gIHsgbXV0ZXhfaW5pdCgmX01fbG9jaywgMCwgTlVMTCk7IH0KLSAgaW5saW5lIHZvaWQgX01fZGVzdHJveSgpCi0gIHsgbXV0ZXhfZGVzdHJveSgmX01fbG9jayk7IH0KLSAgaW5saW5lIHZvaWQgX01fYWNxdWlyZV9sb2NrKCkgeyBtdXRleF9sb2NrKCZfTV9sb2NrKTsgfQotICBpbmxpbmUgdm9pZCBfTV9yZWxlYXNlX2xvY2soKSB7IG11dGV4X3VubG9jaygmX01fbG9jayk7IH0KLQotIyAgZWxpZiBkZWZpbmVkIChfU1RMUF9PUzJUSFJFQURTKQotICBITVRYIF9NX2xvY2s7Ci0gIGlubGluZSB2b2lkIF9NX2luaXRpYWxpemUoKSB7IERvc0NyZWF0ZU11dGV4U2VtKE5VTEwsICZfTV9sb2NrLCAwLCBmYWxzZSk7IH0KLSAgaW5saW5lIHZvaWQgX01fZGVzdHJveSgpIHsgRG9zQ2xvc2VNdXRleFNlbShfTV9sb2NrKTsgfQotICBpbmxpbmUgdm9pZCBfTV9hY3F1aXJlX2xvY2soKSB7Ci0gICAgaWYgKCFfTV9sb2NrKSBfTV9pbml0aWFsaXplKCk7Ci0gICAgRG9zUmVxdWVzdE11dGV4U2VtKF9NX2xvY2ssIFNFTV9JTkRFRklOSVRFX1dBSVQpOwotICB9Ci0gIGlubGluZSB2b2lkIF9NX3JlbGVhc2VfbG9jaygpIHsgRG9zUmVsZWFzZU11dGV4U2VtKF9NX2xvY2spOyB9Ci0jICBlbGlmIGRlZmluZWQgKF9TVExQX0JFVEhSRUFEUykKLSAgc2VtX2lkIHNlbTsKLSAgaW5saW5lIHZvaWQgX01faW5pdGlhbGl6ZSgpIHsKLSAgICBzZW0gPSBjcmVhdGVfc2VtKDEsICJTVExQb3J0Iik7Ci0gICAgYXNzZXJ0KHNlbSA+IDApOwotICB9Ci0gIGlubGluZSB2b2lkIF9NX2Rlc3Ryb3koKSB7Ci0gICAgaW50IHQgPSBkZWxldGVfc2VtKHNlbSk7Ci0gICAgYXNzZXJ0KHQgPT0gQl9OT19FUlJPUik7Ci0gIH0KLSAgaW5saW5lIHZvaWQgX01fYWNxdWlyZV9sb2NrKCk7Ci0gIGlubGluZSB2b2lkIF9NX3JlbGVhc2VfbG9jaygpIHsKLSAgICBzdGF0dXNfdCB0ID0gcmVsZWFzZV9zZW0oc2VtKTsKLSAgICBhc3NlcnQodCA9PSBCX05PX0VSUk9SKTsKLSAgfQotIyAgZWxpZiBkZWZpbmVkIChfU1RMUF9OV1RIUkVBRFMpCi0gIExPTkcgX01fbG9jazsKLSAgaW5saW5lIHZvaWQgX01faW5pdGlhbGl6ZSgpCi0gIHsgX01fbG9jayA9IE9wZW5Mb2NhbFNlbWFwaG9yZSgxKTsgfQotICBpbmxpbmUgdm9pZCBfTV9kZXN0cm95KCkKLSAgeyBDbG9zZUxvY2FsU2VtYXBob3JlKF9NX2xvY2spOyB9Ci0gIGlubGluZSB2b2lkIF9NX2FjcXVpcmVfbG9jaygpCi0gIHsgV2FpdE9uTG9jYWxTZW1hcGhvcmUoX01fbG9jayk7IH0KLSAgaW5saW5lIHZvaWQgX01fcmVsZWFzZV9sb2NrKCkgeyBTaWduYWxMb2NhbFNlbWFwaG9yZShfTV9sb2NrKTsgfQotIyAgZWxzZSAgICAgIC8vKnR5IDExLzI0LzIwMDEgLSBhZGRlZCBjb25maWd1cmF0aW9uIGNoZWNrCi0jICAgIGVycm9yICJVbmtub3duIHRocmVhZCBmYWNpbGl0eSBjb25maWd1cmF0aW9uIgotIyAgZW5kaWYKLSNlbHNlIC8qIE5vIHRocmVhZHMgKi8KLSAgaW5saW5lIHZvaWQgX01faW5pdGlhbGl6ZSgpIHt9Ci0gIGlubGluZSB2b2lkIF9NX2Rlc3Ryb3koKSB7fQotICBpbmxpbmUgdm9pZCBfTV9hY3F1aXJlX2xvY2soKSB7fQotICBpbmxpbmUgdm9pZCBfTV9yZWxlYXNlX2xvY2soKSB7fQotI2VuZGlmIC8vIF9TVExQX1BUSFJFQURTCi19OwotCi0vLyBMb2NraW5nIGNsYXNzLiAgVGhlIGNvbnN0cnVjdG9yIGluaXRpYWxpemVzIHRoZSBsb2NrLCB0aGUgZGVzdHJ1Y3RvciBkZXN0cm95cyBpdC4KLS8vIFdlbGwgLSBiZWhhdmluZyBjbGFzcywgZG9lcyBub3QgbmVlZCBzdGF0aWMgaW5pdGlhbGl6ZXIKLQotY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgX1NUTFBfbXV0ZXggOiBwdWJsaWMgX1NUTFBfbXV0ZXhfYmFzZSB7Ci0gIHB1YmxpYzoKLSAgICBpbmxpbmUgX1NUTFBfbXV0ZXggKCkgeyBfTV9pbml0aWFsaXplKCk7IH0KLSAgICBpbmxpbmUgfl9TVExQX211dGV4ICgpIHsgX01fZGVzdHJveSgpOyB9Ci0gIHByaXZhdGU6Ci0gICAgX1NUTFBfbXV0ZXgoY29uc3QgX1NUTFBfbXV0ZXgmKTsKLSAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBfU1RMUF9tdXRleCYpOwotfTsKLQotLy8gQSBsb2NraW5nIGNsYXNzIHRoYXQgdXNlcyBfU1RMUF9TVEFUSUNfTVVURVguICBUaGUgY29uc3RydWN0b3IgdGFrZXMKLS8vIGEgcmVmZXJlbmNlIHRvIGFuIF9TVExQX1NUQVRJQ19NVVRFWCwgYW5kIGFjcXVpcmVzIGEgbG9jay4gIFRoZSBkZXN0cnVjdG9yCi0vLyByZWxlYXNlcyB0aGUgbG9jay4KLS8vIEl0J3Mgbm90IGNsZWFyIHRoYXQgdGhpcyBpcyBleGFjdGx5IHRoZSByaWdodCBmdW5jdGlvbmFsaXR5LgotLy8gSXQgd2lsbCBwcm9iYWJseSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS4KLQotc3RydWN0IF9TVExQX0NMQVNTX0RFQ0xTUEVDIF9TVExQX2F1dG9fbG9jayB7Ci0gIF9TVExQX2F1dG9fbG9jayhfU1RMUF9TVEFUSUNfTVVURVgmIF9fbG9jaykgOiBfTV9sb2NrKF9fbG9jaykKLSAgeyBfTV9sb2NrLl9NX2FjcXVpcmVfbG9jaygpOyB9Ci0gIH5fU1RMUF9hdXRvX2xvY2soKQotICB7IF9NX2xvY2suX01fcmVsZWFzZV9sb2NrKCk7IH0KLQotcHJpdmF0ZToKLSAgX1NUTFBfU1RBVElDX01VVEVYJiBfTV9sb2NrOwotICB2b2lkIG9wZXJhdG9yPShjb25zdCBfU1RMUF9hdXRvX2xvY2smKTsKLSAgX1NUTFBfYXV0b19sb2NrKGNvbnN0IF9TVExQX2F1dG9fbG9jayYpOwotfTsKLQotLyoKLSAqIENsYXNzIF9SZWZjb3VudF9CYXNlIHByb3ZpZGVzIGEgdHlwZSwgX19zdGxfYXRvbWljX3QsIGEgZGF0YSBtZW1iZXIsCi0gKiBfTV9yZWZfY291bnQsIGFuZCBtZW1iZXIgZnVuY3Rpb25zIF9NX2luY3IgYW5kIF9NX2RlY3IsIHdoaWNoIHBlcmZvcm0KLSAqIGF0b21pYyBwcmVpbmNyZW1lbnQvcHJlZGVjcmVtZW50LiAgVGhlIGNvbnN0cnVjdG9yIGluaXRpYWxpemVzCi0gKiBfTV9yZWZfY291bnQuCi0gKi8KLWNsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIF9SZWZjb3VudF9CYXNlIHsKLSAgLy8gVGhlIGRhdGEgbWVtYmVyIF9NX3JlZl9jb3VudAotI2lmIGRlZmluZWQgKF9fRE1DX18pCi1wdWJsaWM6Ci0jZW5kaWYKLSAgX1NUTFBfVk9MQVRJTEUgX19zdGxfYXRvbWljX3QgX01fcmVmX2NvdW50OwotCi0jaWYgZGVmaW5lZCAoX1NUTFBfVEhSRUFEUykgJiYgXAotICAgKCFkZWZpbmVkIChfU1RMUF9BVE9NSUNfSU5DUkVNRU5UKSB8fCAhZGVmaW5lZCAoX1NUTFBfQVRPTUlDX0RFQ1JFTUVOVCkgfHwgXAotICAgIChkZWZpbmVkIChfU1RMUF9XSU4zMl9WRVJTSU9OKSAmJiAoX1NUTFBfV0lOMzJfVkVSU0lPTiA8PSAweDA0MDApKSkKLSMgIGRlZmluZSBfU1RMUF9VU0VfTVVURVgKLSAgX1NUTFBfbXV0ZXggX01fbXV0ZXg7Ci0jZW5kaWYKLQotICBwdWJsaWM6Ci0gIC8vIENvbnN0cnVjdG9yCi0gIF9SZWZjb3VudF9CYXNlKF9fc3RsX2F0b21pY190IF9fbikgOiBfTV9yZWZfY291bnQoX19uKSB7fQotCi0gIC8vIF9NX2luY3IgYW5kIF9NX2RlY3IKLSNpZiBkZWZpbmVkIChfU1RMUF9USFJFQURTKQotIyAgaWYgIWRlZmluZWQgKF9TVExQX1VTRV9NVVRFWCkKLSAgIF9fc3RsX2F0b21pY190IF9NX2luY3IoKSB7IHJldHVybiBfU1RMUF9BVE9NSUNfSU5DUkVNRU5UKCZfTV9yZWZfY291bnQpOyB9Ci0gICBfX3N0bF9hdG9taWNfdCBfTV9kZWNyKCkgeyByZXR1cm4gX1NUTFBfQVRPTUlDX0RFQ1JFTUVOVCgmX01fcmVmX2NvdW50KTsgfQotIyAgZWxzZQotIyAgICB1bmRlZiBfU1RMUF9VU0VfTVVURVgKLSAgX19zdGxfYXRvbWljX3QgX01faW5jcigpIHsKLSAgICBfU1RMUF9hdXRvX2xvY2sgbChfTV9tdXRleCk7Ci0gICAgcmV0dXJuICsrX01fcmVmX2NvdW50OwotICB9Ci0gIF9fc3RsX2F0b21pY190IF9NX2RlY3IoKSB7Ci0gICAgX1NUTFBfYXV0b19sb2NrIGwoX01fbXV0ZXgpOwotICAgIHJldHVybiAtLV9NX3JlZl9jb3VudDsKLSAgfQotIyAgZW5kaWYKLSNlbHNlICAvKiBObyB0aHJlYWRzICovCi0gIF9fc3RsX2F0b21pY190IF9NX2luY3IoKSB7IHJldHVybiArK19NX3JlZl9jb3VudDsgfQotICBfX3N0bF9hdG9taWNfdCBfTV9kZWNyKCkgeyByZXR1cm4gLS1fTV9yZWZfY291bnQ7IH0KLSNlbmRpZgotfTsKLQotLyogQXRvbWljIHN3YXAgb24gX19zdGxfYXRvbWljX3QKLSAqIFRoaXMgaXMgZ3VhcmFudGVlZCB0byBiZWhhdmUgYXMgdGhvdWdoIGl0IHdlcmUgYXRvbWljIG9ubHkgaWYgYWxsCi0gKiBwb3NzaWJseSBjb25jdXJyZW50IHVwZGF0ZXMgdXNlIF9BdG9taWNfc3dhcC4KLSAqIEluIHNvbWUgY2FzZXMgdGhlIG9wZXJhdGlvbiBpcyBlbXVsYXRlZCB3aXRoIGEgbG9jay4KLSAqIElkZW0gZm9yIF9BdG9taWNfc3dhcF9wdHIKLSAqLwotLyogSGVscGVyIHN0cnVjdCB0byBoYW5kbGUgZm9sbG93aW5nIGNhc2VzOgotICogLSBvbiBwbGF0Zm9ybXMgd2hlcmUgc2l6ZW9mKF9fc3RsX2F0b21pY190KSA9PSBzaXplb2Yodm9pZCopIGF0b21pYwotICogICBleGNoYW5nZSBjYW4gYmUgZG9uZSBvbiBwb2ludGVycwotICogLSBvbiBwbGF0Zm9ybSB3aXRob3V0IGF0b21pYyBvcGVyYXRpb24gc3dhcCBpcyBkb25lIGluIGEgY3JpdGljYWwgc2VjdGlvbiwKLSAqICAgcG9ydGFibGUgYnV0IGluZWZmaWNpZW50LgotICovCi10ZW1wbGF0ZSA8aW50IF9fdXNlX3B0cl9hdG9taWNfc3dhcD4KLWNsYXNzIF9BdG9taWNfc3dhcF9zdHJ1Y3QgewotcHVibGljOgotI2lmIGRlZmluZWQgKF9TVExQX1RIUkVBRFMpICYmIFwKLSAgICAhZGVmaW5lZCAoX1NUTFBfQVRPTUlDX0VYQ0hBTkdFKSAmJiBcCi0gICAgKGRlZmluZWQgKF9TVExQX1BUSFJFQURTKSB8fCBkZWZpbmVkIChfU1RMUF9VSVRIUkVBRFMpIHx8IGRlZmluZWQgKF9TVExQX09TMlRIUkVBRFMpIHx8IFwKLSAgICAgZGVmaW5lZCAoX1NUTFBfVVNFX1BUSFJFQURfU1BJTkxPQ0spIHx8IGRlZmluZWQgKF9TVExQX05XVEhSRUFEUykpCi0jICBkZWZpbmUgX1NUTFBfVVNFX0FUT01JQ19TV0FQX01VVEVYCi0gIHN0YXRpYyBfU1RMUF9TVEFUSUNfTVVURVggX1Nfc3dhcF9sb2NrOwotI2VuZGlmCi0KLSAgc3RhdGljIF9fc3RsX2F0b21pY190IF9TX3N3YXAoX1NUTFBfVk9MQVRJTEUgX19zdGxfYXRvbWljX3QqIF9fcCwgX19zdGxfYXRvbWljX3QgX19xKSB7Ci0jaWYgZGVmaW5lZCAoX1NUTFBfVEhSRUFEUykKLSMgIGlmIGRlZmluZWQgKF9TVExQX0FUT01JQ19FWENIQU5HRSkKLSAgcmV0dXJuIF9TVExQX0FUT01JQ19FWENIQU5HRShfX3AsIF9fcSk7Ci0jICBlbGlmIGRlZmluZWQgKF9TVExQX1VTRV9BVE9NSUNfU1dBUF9NVVRFWCkKLSAgX1Nfc3dhcF9sb2NrLl9NX2FjcXVpcmVfbG9jaygpOwotICBfX3N0bF9hdG9taWNfdCBfX3Jlc3VsdCA9ICpfX3A7Ci0gICpfX3AgPSBfX3E7Ci0gIF9TX3N3YXBfbG9jay5fTV9yZWxlYXNlX2xvY2soKTsKLSAgcmV0dXJuIF9fcmVzdWx0OwotIyAgZWxzZQotIyAgICBlcnJvciBNaXNzaW5nIGF0b21pYyBzd2FwIGltcGxlbWVudGF0aW9uCi0jICBlbmRpZgotI2Vsc2UKLSAgLyogbm8gdGhyZWFkcyAqLwotICBfX3N0bF9hdG9taWNfdCBfX3Jlc3VsdCA9ICpfX3A7Ci0gICpfX3AgPSBfX3E7Ci0gIHJldHVybiBfX3Jlc3VsdDsKLSNlbmRpZiAvLyBfU1RMUF9USFJFQURTCi0gIH0KLQotICBzdGF0aWMgdm9pZCogX1Nfc3dhcF9wdHIodm9pZCogX1NUTFBfVk9MQVRJTEUqIF9fcCwgdm9pZCogX19xKSB7Ci0jaWYgZGVmaW5lZCAoX1NUTFBfVEhSRUFEUykKLSMgIGlmIGRlZmluZWQgKF9TVExQX0FUT01JQ19FWENIQU5HRV9QVFIpCi0gIHJldHVybiBfU1RMUF9BVE9NSUNfRVhDSEFOR0VfUFRSKF9fcCwgX19xKTsKLSMgIGVsaWYgZGVmaW5lZCAoX1NUTFBfQVRPTUlDX0VYQ0hBTkdFKQotICBfU1RMUF9TVEFUSUNfQVNTRVJUKHNpemVvZihfX3N0bF9hdG9taWNfdCkgPT0gc2l6ZW9mKHZvaWQqKSkKLSAgcmV0dXJuIF9fUkVJTlRFUlBSRVRfQ0FTVCh2b2lkKiwgX1NUTFBfQVRPTUlDX0VYQ0hBTkdFKF9fUkVJTlRFUlBSRVRfQ0FTVCh2b2xhdGlsZSBfX3N0bF9hdG9taWNfdCosIF9fcCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX1JFSU5URVJQUkVUX0NBU1QoX19zdGxfYXRvbWljX3QsIF9fcSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSMgIGVsaWYgZGVmaW5lZCAoX1NUTFBfVVNFX0FUT01JQ19TV0FQX01VVEVYKQotICBfU19zd2FwX2xvY2suX01fYWNxdWlyZV9sb2NrKCk7Ci0gIHZvaWQgKl9fcmVzdWx0ID0gKl9fcDsKLSAgKl9fcCA9IF9fcTsKLSAgX1Nfc3dhcF9sb2NrLl9NX3JlbGVhc2VfbG9jaygpOwotICByZXR1cm4gX19yZXN1bHQ7Ci0jICBlbHNlCi0jICAgIGVycm9yIE1pc3NpbmcgcG9pbnRlciBhdG9taWMgc3dhcCBpbXBsZW1lbnRhdGlvbgotIyAgZW5kaWYKLSNlbHNlCi0gIC8qIG5vIHRocmVhZCAqLwotICB2b2lkICpfX3Jlc3VsdCA9ICpfX3A7Ci0gICpfX3AgPSBfX3E7Ci0gIHJldHVybiBfX3Jlc3VsdDsKLSNlbmRpZgotICB9Ci19OwotCi1fU1RMUF9URU1QTEFURV9OVUxMCi1jbGFzcyBfQXRvbWljX3N3YXBfc3RydWN0PDA+IHsKLXB1YmxpYzoKLSNpZiBkZWZpbmVkIChfU1RMUF9USFJFQURTKSAmJiBcCi0gICAgKCFkZWZpbmVkIChfU1RMUF9BVE9NSUNfRVhDSEFOR0UpIHx8ICFkZWZpbmVkIChfU1RMUF9BVE9NSUNfRVhDSEFOR0VfUFRSKSkgJiYgXAotICAgIChkZWZpbmVkIChfU1RMUF9QVEhSRUFEUykgfHwgZGVmaW5lZCAoX1NUTFBfVUlUSFJFQURTKSB8fCBkZWZpbmVkIChfU1RMUF9PUzJUSFJFQURTKSB8fCBcCi0gICAgIGRlZmluZWQgKF9TVExQX1VTRV9QVEhSRUFEX1NQSU5MT0NLKSB8fCBkZWZpbmVkIChfU1RMUF9OV1RIUkVBRFMpKQotIyAgZGVmaW5lIF9TVExQX1VTRV9BVE9NSUNfU1dBUF9NVVRFWAotICBzdGF0aWMgX1NUTFBfU1RBVElDX01VVEVYIF9TX3N3YXBfbG9jazsKLSNlbmRpZgotCi0gIHN0YXRpYyBfX3N0bF9hdG9taWNfdCBfU19zd2FwKF9TVExQX1ZPTEFUSUxFIF9fc3RsX2F0b21pY190KiBfX3AsIF9fc3RsX2F0b21pY190IF9fcSkgewotI2lmIGRlZmluZWQgKF9TVExQX1RIUkVBRFMpCi0jICBpZiBkZWZpbmVkIChfU1RMUF9BVE9NSUNfRVhDSEFOR0UpCi0gIHJldHVybiBfU1RMUF9BVE9NSUNfRVhDSEFOR0UoX19wLCBfX3EpOwotIyAgZWxpZiBkZWZpbmVkIChfU1RMUF9VU0VfQVRPTUlDX1NXQVBfTVVURVgpCi0gIC8qIFRoaXMgc2hvdWxkIGJlIHBvcnRhYmxlLCBidXQgcGVyZm9ybWFuY2UgaXMgZXhwZWN0ZWQKLSAgICogdG8gYmUgcXVpdGUgYXdmdWwuICBUaGlzIHJlYWxseSBuZWVkcyBwbGF0Zm9ybSBzcGVjaWZpYwotICAgKiBjb2RlLgotICAgKi8KLSAgX1Nfc3dhcF9sb2NrLl9NX2FjcXVpcmVfbG9jaygpOwotICBfX3N0bF9hdG9taWNfdCBfX3Jlc3VsdCA9ICpfX3A7Ci0gICpfX3AgPSBfX3E7Ci0gIF9TX3N3YXBfbG9jay5fTV9yZWxlYXNlX2xvY2soKTsKLSAgcmV0dXJuIF9fcmVzdWx0OwotIyAgZWxzZQotIyAgICBlcnJvciBNaXNzaW5nIGF0b21pYyBzd2FwIGltcGxlbWVudGF0aW9uCi0jICBlbmRpZgotI2Vsc2UKLSAgLyogbm8gdGhyZWFkcyAqLwotICBfX3N0bF9hdG9taWNfdCBfX3Jlc3VsdCA9ICpfX3A7Ci0gICpfX3AgPSBfX3E7Ci0gIHJldHVybiBfX3Jlc3VsdDsKLSNlbmRpZiAvLyBfU1RMUF9USFJFQURTCi0gIH0KLQotICBzdGF0aWMgdm9pZCogX1Nfc3dhcF9wdHIodm9pZCogX1NUTFBfVk9MQVRJTEUqIF9fcCwgdm9pZCogX19xKSB7Ci0jaWYgZGVmaW5lZCAoX1NUTFBfVEhSRUFEUykKLSMgIGlmIGRlZmluZWQgKF9TVExQX0FUT01JQ19FWENIQU5HRV9QVFIpCi0gIHJldHVybiBfU1RMUF9BVE9NSUNfRVhDSEFOR0VfUFRSKF9fcCwgX19xKTsKLSMgIGVsaWYgZGVmaW5lZCAoX1NUTFBfQVRPTUlDX0VYQ0hBTkdFKQotICBfU1RMUF9TVEFUSUNfQVNTRVJUKHNpemVvZihfX3N0bF9hdG9taWNfdCkgPT0gc2l6ZW9mKHZvaWQqKSkKLSAgcmV0dXJuIF9fUkVJTlRFUlBSRVRfQ0FTVCh2b2lkKiwgX1NUTFBfQVRPTUlDX0VYQ0hBTkdFKF9fUkVJTlRFUlBSRVRfQ0FTVCh2b2xhdGlsZSBfX3N0bF9hdG9taWNfdCosIF9fcCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX1JFSU5URVJQUkVUX0NBU1QoX19zdGxfYXRvbWljX3QsIF9fcSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSMgIGVsaWYgZGVmaW5lZCAoX1NUTFBfVVNFX0FUT01JQ19TV0FQX01VVEVYKQotICBfU19zd2FwX2xvY2suX01fYWNxdWlyZV9sb2NrKCk7Ci0gIHZvaWQgKl9fcmVzdWx0ID0gKl9fcDsKLSAgKl9fcCA9IF9fcTsKLSAgX1Nfc3dhcF9sb2NrLl9NX3JlbGVhc2VfbG9jaygpOwotICByZXR1cm4gX19yZXN1bHQ7Ci0jICBlbHNlCi0jICAgIGVycm9yIE1pc3NpbmcgcG9pbnRlciBhdG9taWMgc3dhcCBpbXBsZW1lbnRhdGlvbgotIyAgZW5kaWYKLSNlbHNlCi0gIC8qIG5vIHRocmVhZCAqLwotICB2b2lkICpfX3Jlc3VsdCA9ICpfX3A7Ci0gICpfX3AgPSBfX3E7Ci0gIHJldHVybiBfX3Jlc3VsdDsKLSNlbmRpZgotICB9Ci19OwotCi0jaWYgZGVmaW5lZCAoX1NUTFBfTVNWQykgJiYgKF9TVExQX01TVkMgPT0gMTMwMCkKLSMgIHByYWdtYSB3YXJuaW5nIChwdXNoKQotIyAgcHJhZ21hIHdhcm5pbmcgKGRpc2FibGUgOiA0MTg5KSAvL19fdXNlX3B0cl9hdG9taWNfc3dhcCBpbml0aWFsaXplZCBidXQgbm90IHVzZWQKLSNlbmRpZgotCi1pbmxpbmUgX19zdGxfYXRvbWljX3QgX1NUTFBfQ0FMTCBfQXRvbWljX3N3YXAoX1NUTFBfVk9MQVRJTEUgX19zdGxfYXRvbWljX3QgKiBfX3AsIF9fc3RsX2F0b21pY190IF9fcSkgewotICBjb25zdCBpbnQgX191c2VfcHRyX2F0b21pY19zd2FwID0gc2l6ZW9mKF9fc3RsX2F0b21pY190KSA9PSBzaXplb2Yodm9pZCopOwotICByZXR1cm4gX0F0b21pY19zd2FwX3N0cnVjdDxfX3VzZV9wdHJfYXRvbWljX3N3YXA+OjpfU19zd2FwKF9fcCwgX19xKTsKLX0KLQotaW5saW5lIHZvaWQqIF9TVExQX0NBTEwgX0F0b21pY19zd2FwX3B0cih2b2lkKiBfU1RMUF9WT0xBVElMRSogX19wLCB2b2lkKiBfX3EpIHsKLSAgY29uc3QgaW50IF9fdXNlX3B0cl9hdG9taWNfc3dhcCA9IHNpemVvZihfX3N0bF9hdG9taWNfdCkgPT0gc2l6ZW9mKHZvaWQqKTsKLSAgcmV0dXJuIF9BdG9taWNfc3dhcF9zdHJ1Y3Q8X191c2VfcHRyX2F0b21pY19zd2FwPjo6X1Nfc3dhcF9wdHIoX19wLCBfX3EpOwotfQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfTVNWQykgJiYgKF9TVExQX01TVkMgPT0gMTMwMCkKLSMgIHByYWdtYSB3YXJuaW5nIChwb3ApCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9TVExQX0JFVEhSRUFEUykKLXRlbXBsYXRlIDxpbnQgX19pbnN0Pgotc3RydWN0IF9TVExQX2Jlb3Nfc3RhdGljX2xvY2tfZGF0YSB7Ci0gIHN0YXRpYyBib29sIGlzX2luaXQ7Ci0gIHN0cnVjdCBtdXRleF90IDogcHVibGljIF9TVExQX211dGV4IHsKLSAgICBtdXRleF90KCkKLSAgICB7IF9TVExQX2Jlb3Nfc3RhdGljX2xvY2tfZGF0YTwwPjo6aXNfaW5pdCA9IHRydWU7IH0KLSAgICB+bXV0ZXhfdCgpCi0gICAgeyBfU1RMUF9iZW9zX3N0YXRpY19sb2NrX2RhdGE8MD46OmlzX2luaXQgPSBmYWxzZTsgfQotICB9OwotICBzdGF0aWMgbXV0ZXhfdCBtdXQ7Ci19OwotCi10ZW1wbGF0ZSA8aW50IF9faW5zdD4KLWJvb2wgX1NUTFBfYmVvc19zdGF0aWNfbG9ja19kYXRhPF9faW5zdD46OmlzX2luaXQgPSBmYWxzZTsKLXRlbXBsYXRlIDxpbnQgX19pbnN0PgotdHlwZW5hbWUgX1NUTFBfYmVvc19zdGF0aWNfbG9ja19kYXRhPF9faW5zdD46Om11dGV4X3QgX1NUTFBfYmVvc19zdGF0aWNfbG9ja19kYXRhPF9faW5zdD46Om11dDsKLQotaW5saW5lIHZvaWQgX1NUTFBfbXV0ZXhfYmFzZTo6X01fYWNxdWlyZV9sb2NrKCkgewotICBpZiAoc2VtID09IDApIHsKLSAgICAvLyB3ZSBuZWVkIHRvIGluaXRpYWxpc2Ugb24gZGVtYW5kIGhlcmUKLSAgICAvLyB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9ucyB1c2Ugb3VyIGdsb2JhbAotICAgIC8vIG11dGV4IGlmIGl0J3MgYXZhaWxhYmxlOgotICAgIGlmIChfU1RMUF9iZW9zX3N0YXRpY19sb2NrX2RhdGE8MD46OmlzX2luaXQpIHsKLSAgICAgIF9TVExQX2F1dG9fbG9jayBhbChfU1RMUF9iZW9zX3N0YXRpY19sb2NrX2RhdGE8MD46Om11dCk7Ci0gICAgICBpZiAoc2VtID09IDApIF9NX2luaXRpYWxpemUoKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAvLyBubyBsb2NrIGF2YWlsYWJsZSwgd2UgbXVzdCBzdGlsbCBiZQotICAgICAgLy8gaW4gc3RhcnR1cCBjb2RlLCBUSEVSRSBNVVNUIEJFIE9ORSBUSFJFQUQKLSAgICAgIC8vIE9OTFkgYWN0aXZlIGF0IHRoaXMgcG9pbnQuCi0gICAgICBfTV9pbml0aWFsaXplKCk7Ci0gICAgfQotICB9Ci0gIHN0YXR1c190IHQ7Ci0gIHQgPSBhY3F1aXJlX3NlbShzZW0pOwotICBhc3NlcnQodCA9PSBCX05PX0VSUk9SKTsKLX0KLSNlbmRpZgotCi1fU1RMUF9FTkRfTkFNRVNQQUNFCi0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfTElOS19USU1FX0lOU1RBTlRJQVRJT04pCi0jICBpbmNsdWRlIDxzdGwvX3RocmVhZHMuYz4KLSNlbmRpZgotCi0jZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfVEhSRUFEU19IICovCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX3RpbWVfZmFjZXRzLmMgYi9zdGwvX3RpbWVfZmFjZXRzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzZjg3ZjkuLjAwMDAwMDAKLS0tIGEvc3RsL190aW1lX2ZhY2V0cy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTA4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogQm9yaXMgRm9taXRjaGV2Ci0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICovCi0jaWZuZGVmIF9TVExQX1RJTUVfRkFDRVRTX0MKLSNkZWZpbmUgX1NUTFBfVElNRV9GQUNFVFNfQwotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX1RJTUVfRkFDRVRTX0gKLSMgIGluY2x1ZGUgPHN0bC9fdGltZV9mYWNldHMuaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX05VTV9QVVRfSAotIyAgaW5jbHVkZSA8c3RsL19udW1fcHV0Lmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9OVU1fR0VUX0gKLSMgIGluY2x1ZGUgPHN0bC9fbnVtX2dldC5oPgotI2VuZGlmCi0KLV9TVExQX0JFR0lOX05BTUVTUEFDRQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIERlY2xhcmF0aW9ucyBvZiBzdGF0aWMgdGVtcGxhdGUgbWVtYmVycy4KLSNpZiAoX1NUTFBfU1RBVElDX1RFTVBMQVRFX0RBVEEgPiAwKQotCi0jICBpZiAhZGVmaW5lZCAoX19CT1JMQU5EQ19fKQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0lucHV0SXRlcmF0b3I+Ci1sb2NhbGU6OmlkIHRpbWVfZ2V0PF9DaGFyVCwgX0lucHV0SXRlcmF0b3I+OjppZDsKLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX091dHB1dEl0ZXJhdG9yPgotbG9jYWxlOjppZCB0aW1lX3B1dDxfQ2hhclQsIF9PdXRwdXRJdGVyYXRvcj46OmlkOwotIyAgZW5kaWYKLQotIyAgaWYgKGRlZmluZWQgKF9fQ1lHV0lOX18pIHx8IGRlZmluZWQgKF9fTUlOR1czMl9fKSkgJiYgXAotICAgICAgIGRlZmluZWQgKF9TVExQX1VTRV9EWU5BTUlDX0xJQikgJiYgIWRlZmluZWQgKF9fQlVJTERJTkdfU1RMUE9SVCkKLS8qCi0gKiBVbmRlciBjeWd3aW4sIHdoZW4gU1RMcG9ydCBpcyB1c2VkIGFzIGEgc2hhcmVkIGxpYnJhcnksIHRoZSBpZCBuZWVkcwotICogdG8gYmUgc3BlY2lmaWVkIGFzIGltcG9ydGVkIG90aGVyd2lzZSB0aGV5IHdpbGwgYmUgZHVwbGljYXRlZCBpbiB0aGUKLSAqIGNhbGxpbmcgZXhlY3V0YWJsZS4KLSAqLwotdGVtcGxhdGUgPD4KLV9TVExQX0RFQ0xTUEVDIGxvY2FsZTo6aWQgdGltZV9nZXQ8Y2hhciwgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+ID46OmlkOwotLyoKLXRlbXBsYXRlIDw+Ci1fU1RMUF9ERUNMU1BFQyBsb2NhbGU6OmlkIHRpbWVfZ2V0PGNoYXIsIGNvbnN0IGNoYXIqPjo6aWQ7Ci0qLwotCi10ZW1wbGF0ZSA8PgotX1NUTFBfREVDTFNQRUMgbG9jYWxlOjppZCB0aW1lX3B1dDxjaGFyLCBvc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4gPjo6aWQ7Ci0vKgotdGVtcGxhdGUgPD4KLV9TVExQX0RFQ0xTUEVDIGxvY2FsZTo6aWQgdGltZV9wdXQ8Y2hhciwgY2hhcio+OjppZDsKLSovCi0KLSMgICAgaWZuZGVmIF9TVExQX05PX1dDSEFSX1QKLXRlbXBsYXRlIDw+Ci1fU1RMUF9ERUNMU1BFQyBsb2NhbGU6OmlkIHRpbWVfZ2V0PHdjaGFyX3QsIGlzdHJlYW1idWZfaXRlcmF0b3I8d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPiA+OjppZDsKLS8qCi10ZW1wbGF0ZSA8PgotX1NUTFBfREVDTFNQRUMgbG9jYWxlOjppZCB0aW1lX2dldDx3Y2hhcl90LCBjb25zdCB3Y2hhcl90Kj46OmlkOwotKi8KLQotdGVtcGxhdGUgPD4KLV9TVExQX0RFQ0xTUEVDIGxvY2FsZTo6aWQgdGltZV9wdXQ8d2NoYXJfdCwgb3N0cmVhbWJ1Zl9pdGVyYXRvcjx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+ID46OmlkOwotLyoKLXRlbXBsYXRlIDw+Ci1fU1RMUF9ERUNMU1BFQyBsb2NhbGU6OmlkIHRpbWVfcHV0PHdjaGFyX3QsIHdjaGFyX3QqPjo6aWQ7Ci0qLwotIyAgICBlbmRpZiAvKiBfU1RMUF9OT19XQ0hBUl9UICovCi0jICBlbmRpZiAvKiBfX0NVR1dJTl9fICYmIF9TVExQX1VTRV9EWU5BTUlDX0xJQiAqLwotCi0jZWxzZSAvKiAoIF9TVExQX1NUQVRJQ19URU1QTEFURV9EQVRBID4gMCApICovCi0KLS8vdHlwZWRlZiB0aW1lX2dldDxjaGFyLCBjb25zdCBjaGFyKj4gdGltZV9nZXRfY2hhcjsKLXR5cGVkZWYgdGltZV9nZXQ8Y2hhciwgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+ID4gdGltZV9nZXRfY2hhcl8yOwotLy90eXBlZGVmIHRpbWVfcHV0PGNoYXIsIGNoYXIqPiB0aW1lX3B1dF9jaGFyOwotdHlwZWRlZiB0aW1lX3B1dDxjaGFyLCBvc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4gPiB0aW1lX3B1dF9jaGFyXzI7Ci0KLS8vX19ERUNMQVJFX0lOU1RBTkNFKGxvY2FsZTo6aWQsIHRpbWVfZ2V0X2NoYXI6OmlkLCApOwotX19ERUNMQVJFX0lOU1RBTkNFKGxvY2FsZTo6aWQsIHRpbWVfZ2V0X2NoYXJfMjo6aWQsICk7Ci0vL19fREVDTEFSRV9JTlNUQU5DRShsb2NhbGU6OmlkLCB0aW1lX3B1dF9jaGFyOjppZCwgKTsKLV9fREVDTEFSRV9JTlNUQU5DRShsb2NhbGU6OmlkLCB0aW1lX3B1dF9jaGFyXzI6OmlkLCApOwotCi0jICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkKLQotLy90eXBlZGVmIHRpbWVfZ2V0PHdjaGFyX3QsIGNvbnN0IHdjaGFyX3QqPiB0aW1lX2dldF93Y2hhcl90OwotdHlwZWRlZiB0aW1lX2dldDx3Y2hhcl90LCBpc3RyZWFtYnVmX2l0ZXJhdG9yPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4gPiB0aW1lX2dldF93Y2hhcl90XzI7Ci0vL3R5cGVkZWYgdGltZV9wdXQ8d2NoYXJfdCwgd2NoYXJfdCo+IHRpbWVfcHV0X3djaGFyX3Q7Ci10eXBlZGVmIHRpbWVfcHV0PHdjaGFyX3QsIG9zdHJlYW1idWZfaXRlcmF0b3I8d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPiA+IHRpbWVfcHV0X3djaGFyX3RfMjsKLQotLy9fX0RFQ0xBUkVfSU5TVEFOQ0UobG9jYWxlOjppZCwgdGltZV9nZXRfd2NoYXJfdDo6aWQsICk7Ci1fX0RFQ0xBUkVfSU5TVEFOQ0UobG9jYWxlOjppZCwgdGltZV9nZXRfd2NoYXJfdF8yOjppZCwgKTsKLS8vX19ERUNMQVJFX0lOU1RBTkNFKGxvY2FsZTo6aWQsIHRpbWVfcHV0X3djaGFyX3Q6OmlkLCApOwotX19ERUNMQVJFX0lOU1RBTkNFKGxvY2FsZTo6aWQsIHRpbWVfcHV0X3djaGFyX3RfMjo6aWQsICk7Ci0KLSMgIGVuZGlmCi0KLSNlbmRpZiAvKiAoIF9TVExQX1NUQVRJQ19URU1QTEFURV9EQVRBID4gMCApICovCi0KLV9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKLQotdGVtcGxhdGUgPGNsYXNzIF9Jbkl0LCBjbGFzcyBfQ2hhclQ+Ci1jb25zdCBzdHJpbmcqIF9TVExQX0NBTEwKLV9fbWF0Y2goX0luSXQmIF9fZmlyc3QsIF9Jbkl0JiBfX2xhc3QsIGNvbnN0IHN0cmluZyAqX19uYW1lLCBjb25zdCBzdHJpbmcgKl9fbmFtZV9lbmQsCi0gICAgICAgIGNvbnN0IGN0eXBlPF9DaGFyVD4mIF9fY3QpIHsKLSAgdHlwZWRlZiBwdHJkaWZmX3QgZGlmZmVyZW5jZV90eXBlOwotICBkaWZmZXJlbmNlX3R5cGUgX19uID0gX19uYW1lX2VuZCAtIF9fbmFtZTsKLSAgZGlmZmVyZW5jZV90eXBlIF9faTsKLSAgc2l6ZV90IF9fcG9zID0gMDsKLSAgZGlmZmVyZW5jZV90eXBlIF9fY2hlY2tfY291bnQgPSBfX247Ci0gIGJvb2wgX19kb19jaGVja1tfTUFYTkFNRVNdOwotICBjb25zdCBzdHJpbmcqIF9fbWF0Y2hpbmdfbmFtZVtfTUFYX05BTUVfTEVOR1RIXTsKLQotICBmb3IgKF9faSA9IDA7IF9faSA8IF9NQVhOQU1FUzsgKytfX2kpCi0gICAgX19kb19jaGVja1tfX2ldID0gdHJ1ZTsKLQotICBmb3IgKF9faSA9IDA7IF9faSA8IF9NQVhfTkFNRV9MRU5HVEg7ICsrX19pKQotICAgIF9fbWF0Y2hpbmdfbmFtZVtfX2ldID0gX19uYW1lX2VuZDsKLQotICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QpIHsKLSAgICBmb3IgKF9faSA9IDA7IF9faSA8IF9fbjsgKytfX2kpIHsKLSAgICAgIGlmIChfX2RvX2NoZWNrW19faV0pIHsKLSAgICAgICAgaWYgKCpfX2ZpcnN0ID09IF9fY3Qud2lkZW4oX19uYW1lW19faV1bX19wb3NdKSkgewotICAgICAgICAgIGlmIChfX3BvcyA9PSAoX19uYW1lW19faV0uc2l6ZSgpIC0gMSkpIHsKLSAgICAgICAgICAgIF9fZG9fY2hlY2tbX19pXSA9IDA7Ci0gICAgICAgICAgICBfX21hdGNoaW5nX25hbWVbX19wb3MgKyAxXSA9IF9fbmFtZSArIF9faTsKLSAgICAgICAgICAgIC0tX19jaGVja19jb3VudDsKLSAgICAgICAgICAgIGlmIChfX2NoZWNrX2NvdW50ID09IDApIHsKLSAgICAgICAgICAgICAgKytfX2ZpcnN0OwotICAgICAgICAgICAgICByZXR1cm4gX19uYW1lICsgX19pOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICBfX2RvX2NoZWNrW19faV0gPSAwOwotICAgICAgICAgIC0tX19jaGVja19jb3VudDsKLSAgICAgICAgICBpZiAoX19jaGVja19jb3VudCA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIF9fbWF0Y2hpbmdfbmFtZVtfX3Bvc107Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICArK19fZmlyc3Q7ICsrX19wb3M7Ci0gIH0KLQotICByZXR1cm4gX19tYXRjaGluZ19uYW1lW19fcG9zXTsKLX0KLQotLy8gX19nZXRfZm9ybWF0dGVkX3RpbWUgcmVhZHMgaW5wdXQgdGhhdCBpcyBhc3N1bWVkIHRvIGJlIGZvcm1hdHRlZAotLy8gYWNjb3JkaW5nIHRvIHRoZSBydWxlcyBmb3IgdGhlIEMgc3RyZnRpbWUgZnVuY3Rpb24gKEMgc3RhbmRhcmQsCi0vLyA3LjEyLjMuNSkuICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBkb19nZXRfdGltZQotLy8gYW5kIGRvX2dldF9kYXRlIHZpcnR1YWwgZnVuY3Rpb25zLCB3aGljaCBkZXBlbmQgb24gdGhlIGxvY2FsZQotLy8gc3BlY2lmaWNhdGlvbnMgZm9yIHRoZSB0aW1lIGFuZCBkYXkgZm9ybWF0cyByZXNwZWN0aXZlbHkuCi0vLyBOb3RlIHRoZSBjYXRjaGFsbCBkZWZhdWx0IGNhc2UsIGludGVuZGVkIG1haW5seSBmb3IgdGhlICclWicKLS8vIGZvcm1hdCBkZXNpZ25hdG9yLCB3aGljaCBkb2VzIG5vdCBtYWtlIHNlbnNlIGhlcmUgc2luY2UgdGhlCi0vLyByZXByZXNlbnRhdGlvbiBvZiB0aW1lem9uZXMgaXMgbm90IHBhcnQgb2YgdGhlIGxvY2FsZS4KLS8vCi0vLyBUaGUgY2FzZSBicmFuY2hlcyBhcmUgaW1wbGVtZW50ZWQgZWl0aGVyIGJ5IGRvaW5nIGEgbWF0Y2ggdXNpbmcKLS8vIHRoZSBhcHBvcHJpYXRlIG5hbWUgdGFibGUgb3IgYnkgZG9pbmcgYSBfX2dldF9pbnRlZ2VyX25vZ3JvdXAuCi0vLwotLy8gJ3knIGZvcm1hdCBpcyBhc3N1bWVkIHRvIG1lYW4gdGhhdCB0aGUgaW5wdXQgcmVwcmVzZW50cyB5ZWFycwotLy8gc2luY2UgMTkwMC4gIFRoYXQgaXMsIDIwMDIgc2hvdWxkIGJlIHJlcHJlc2VudGVkIGFzIDEwMi4gIFRoZXJlCi0vLyBpcyBubyBjZW50dXJ5LWd1ZXNzaW5nLgotLy8KLS8vIFRoZSBtYXRjaCBpcyBzdWNjZXNzZnVsIGlmIGFuZCBvbmx5IGlmIHRoZSBzZWNvbmQgY29tcG9uZW50IG9mIHRoZQotLy8gcmV0dXJuIHZhbHVlIGlzIGZvcm1hdF9lbmQuCi0KLS8vIE5vdGUgdGhhdCB0aGUgYW50ZXBlbnVsdGltYXRlIHBhcmFtZXRlciBpcyBiZWluZyB1c2VkIG9ubHkgdG8gZGV0ZXJtaW5lCi0vLyB0aGUgY29ycmVjdCBvdmVybG9hZGluZyBmb3IgdGhlIGNhbGxzIHRvIF9fZ2V0X2ludGVnZXJfbm9ncm91cC4KLXRlbXBsYXRlIDxjbGFzcyBfSW5JdDEsIGNsYXNzIF9DaD4KLXN0cmluZzo6Y29uc3RfaXRlcmF0b3IgX1NUTFBfQ0FMTAotX19nZXRfZm9ybWF0dGVkX3RpbWUgX1NUTFBfV0VBSyAoX0luSXQxIF9fZmlyc3QsICBfSW5JdDEgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nOjpjb25zdF9pdGVyYXRvciBfX2Zvcm1hdCwgc3RyaW5nOjpjb25zdF9pdGVyYXRvciBfX2Zvcm1hdF9lbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ2gqLCBjb25zdCBfVGltZV9JbmZvJiBfX3RhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW9zX2Jhc2UmIF9fcywgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCB0bSogX190KSB7Ci0gIGNvbnN0IGN0eXBlPF9DaD4mIF9fY3QgPSAqX19TVEFUSUNfQ0FTVChjb25zdCBjdHlwZTxfQ2g+KiwgX19zLl9NX2N0eXBlX2ZhY2V0KCkpOwotICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QgJiYgX19mb3JtYXQgIT0gX19mb3JtYXRfZW5kKSB7Ci0gICAgaWYgKCpfX2Zvcm1hdCA9PSAnJScpIHsKLSAgICAgICsrX19mb3JtYXQ7Ci0gICAgICBjaGFyIF9fYyA9ICpfX2Zvcm1hdDsKLSAgICAgIGlmIChfX2MgPT0gJyMnKSB7IC8vTVMgZXh0ZW5zaW9uCi0gICAgICAgICsrX19mb3JtYXQ7Ci0gICAgICAgIF9fYyA9ICpfX2Zvcm1hdDsKLSAgICAgIH0KLQotICAgICAgc3dpdGNoIChfX2MpIHsKLSAgICAgICAgY2FzZSAnYSc6IHsKLSAgICAgICAgICBjb25zdCBzdHJpbmcqIF9fcHIgPSBfX21hdGNoKF9fZmlyc3QsIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdGFibGUuX01fZGF5bmFtZSArIDAsIF9fdGFibGUuX01fZGF5bmFtZSArIDcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2N0KTsKLSAgICAgICAgICBpZiAoX19wciA9PSBfX3RhYmxlLl9NX2RheW5hbWUgKyA3KQotICAgICAgICAgICAgcmV0dXJuIF9fZm9ybWF0OwotICAgICAgICAgIF9fdC0+dG1fd2RheSA9IF9fU1RBVElDX0NBU1QoaW50LCBfX3ByIC0gX190YWJsZS5fTV9kYXluYW1lKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgJ0EnOiB7Ci0gICAgICAgICAgY29uc3Qgc3RyaW5nKiBfX3ByID0gX19tYXRjaChfX2ZpcnN0LCBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3RhYmxlLl9NX2RheW5hbWUgKyA3LCBfX3RhYmxlLl9NX2RheW5hbWUgKyAxNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fY3QpOwotICAgICAgICAgIGlmIChfX3ByID09IF9fdGFibGUuX01fZGF5bmFtZSArIDE0KQotICAgICAgICAgICAgcmV0dXJuIF9fZm9ybWF0OwotICAgICAgICAgIF9fdC0+dG1fd2RheSA9IF9fU1RBVElDX0NBU1QoaW50LCBfX3ByIC0gX190YWJsZS5fTV9kYXluYW1lIC0gNyk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlICdiJzogewotICAgICAgICAgIGNvbnN0IHN0cmluZyogX19wciA9IF9fbWF0Y2goX19maXJzdCwgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX190YWJsZS5fTV9tb250aG5hbWUgKyAwLCBfX3RhYmxlLl9NX21vbnRobmFtZSArIDEyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19jdCk7Ci0gICAgICAgICAgaWYgKF9fcHIgPT0gX190YWJsZS5fTV9tb250aG5hbWUgKyAxMikKLSAgICAgICAgICAgIHJldHVybiBfX2Zvcm1hdDsKLSAgICAgICAgICBfX3QtPnRtX21vbiA9IF9fU1RBVElDX0NBU1QoaW50LCBfX3ByIC0gX190YWJsZS5fTV9tb250aG5hbWUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSAnQic6IHsKLSAgICAgICAgICBjb25zdCBzdHJpbmcqIF9fcHIgPSBfX21hdGNoKF9fZmlyc3QsIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdGFibGUuX01fbW9udGhuYW1lICsgMTIsIF9fdGFibGUuX01fbW9udGhuYW1lICsgMjQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2N0KTsKLSAgICAgICAgICBpZiAoX19wciA9PSBfX3RhYmxlLl9NX21vbnRobmFtZSArIDI0KQotICAgICAgICAgICAgcmV0dXJuIF9fZm9ybWF0OwotICAgICAgICAgIF9fdC0+dG1fbW9uID0gX19TVEFUSUNfQ0FTVChpbnQsIF9fcHIgLSBfX3RhYmxlLl9NX21vbnRobmFtZSAtIDEyKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgJ2QnOiB7Ci0gICAgICAgICAgYm9vbCBfX3ByID0gX19nZXRfZGVjaW1hbF9pbnRlZ2VyKF9fZmlyc3QsIF9fbGFzdCwgX190LT50bV9tZGF5LCBfX1NUQVRJQ19DQVNUKF9DaCosIDApKTsKLSAgICAgICAgICBpZiAoIV9fcHIgfHwgX190LT50bV9tZGF5IDwgMSB8fCBfX3QtPnRtX21kYXkgPiAzMSkgewotICAgICAgICAgICAgX19lcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7Ci0gICAgICAgICAgICByZXR1cm4gX19mb3JtYXQ7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSAnSCc6IGNhc2UgJ0knOiB7Ci0gICAgICAgICAgYm9vbCBfX3ByID0gX19nZXRfZGVjaW1hbF9pbnRlZ2VyKF9fZmlyc3QsIF9fbGFzdCwgX190LT50bV9ob3VyLCBfX1NUQVRJQ19DQVNUKF9DaCosIDApKTsKLSAgICAgICAgICBpZiAoIV9fcHIpCi0gICAgICAgICAgICByZXR1cm4gX19mb3JtYXQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlICdqJzogewotICAgICAgICAgIGJvb2wgX19wciA9IF9fZ2V0X2RlY2ltYWxfaW50ZWdlcihfX2ZpcnN0LCBfX2xhc3QsIF9fdC0+dG1feWRheSwgX19TVEFUSUNfQ0FTVChfQ2gqLCAwKSk7Ci0gICAgICAgICAgaWYgKCFfX3ByKQotICAgICAgICAgICAgcmV0dXJuIF9fZm9ybWF0OwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSAnbSc6IHsKLSAgICAgICAgICBib29sIF9fcHIgPSBfX2dldF9kZWNpbWFsX2ludGVnZXIoX19maXJzdCwgX19sYXN0LCBfX3QtPnRtX21vbiwgX19TVEFUSUNfQ0FTVChfQ2gqLCAwKSk7Ci0gICAgICAgICAgLS1fX3QtPnRtX21vbjsKLSAgICAgICAgICBpZiAoIV9fcHIgfHwgX190LT50bV9tb24gPCAwIHx8IF9fdC0+dG1fbW9uID4gMTEpIHsKLSAgICAgICAgICAgIF9fZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OwotICAgICAgICAgICAgcmV0dXJuIF9fZm9ybWF0OwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgJ00nOiB7Ci0gICAgICAgICAgYm9vbCBfX3ByID0gX19nZXRfZGVjaW1hbF9pbnRlZ2VyKF9fZmlyc3QsIF9fbGFzdCwgX190LT50bV9taW4sIF9fU1RBVElDX0NBU1QoX0NoKiwgMCkpOwotICAgICAgICAgIGlmICghX19wcikKLSAgICAgICAgICAgIHJldHVybiBfX2Zvcm1hdDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgJ3AnOiB7Ci0gICAgICAgICAgY29uc3Qgc3RyaW5nKiBfX3ByID0gX19tYXRjaChfX2ZpcnN0LCBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3RhYmxlLl9NX2FtX3BtICsgMCwgX190YWJsZS5fTV9hbV9wbSArIDIsIF9fY3QpOwotICAgICAgICAgIGlmIChfX3ByID09IF9fdGFibGUuX01fYW1fcG0gKyAyKQotICAgICAgICAgICAgcmV0dXJuIF9fZm9ybWF0OwotICAgICAgICAgIC8vIDEyOjAwIFBNIDw9PiAxMjowMCwgMTI6MDAgQU0gPD0+IDAwOjAwCi0gICAgICAgICAgaWYgKF9fcHIgPT0gX190YWJsZS5fTV9hbV9wbSArIDEgJiYgX190LT50bV9ob3VyICE9IDEyICkKLSAgICAgICAgICAgIF9fdC0+dG1faG91ciArPSAxMjsKLSAgICAgICAgICBpZiAoX19wciA9PSBfX3RhYmxlLl9NX2FtX3BtICYmIF9fdC0+dG1faG91ciA9PSAxMiApCi0gICAgICAgICAgICBfX3QtPnRtX2hvdXIgPSAwOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSAnUyc6IHsKLSAgICAgICAgICBib29sIF9fcHIgPSBfX2dldF9kZWNpbWFsX2ludGVnZXIoX19maXJzdCwgX19sYXN0LCBfX3QtPnRtX3NlYywgX19TVEFUSUNfQ0FTVChfQ2gqLCAwKSk7Ci0gICAgICAgICAgaWYgKCFfX3ByKQotICAgICAgICAgICAgcmV0dXJuIF9fZm9ybWF0OwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSAneSc6IHsKLSAgICAgICAgICBib29sIF9fcHIgPSBfX2dldF9kZWNpbWFsX2ludGVnZXIoX19maXJzdCwgX19sYXN0LCBfX3QtPnRtX3llYXIsIF9fU1RBVElDX0NBU1QoX0NoKiwgMCkpOwotICAgICAgICAgIGlmICghX19wcikKLSAgICAgICAgICAgIHJldHVybiBfX2Zvcm1hdDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgJ1knOiB7Ci0gICAgICAgICAgYm9vbCBfX3ByID0gX19nZXRfZGVjaW1hbF9pbnRlZ2VyKF9fZmlyc3QsIF9fbGFzdCwgX190LT50bV95ZWFyLCBfX1NUQVRJQ19DQVNUKF9DaCosIDApKTsKLSAgICAgICAgICBfX3QtPnRtX3llYXIgLT0gMTkwMDsKLSAgICAgICAgICBpZiAoIV9fcHIpCi0gICAgICAgICAgICByZXR1cm4gX19mb3JtYXQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGlmICgqX19maXJzdCsrICE9IF9fY3Qud2lkZW4oKl9fZm9ybWF0KSkgYnJlYWs7Ci0gICAgfQotCi0gICAgKytfX2Zvcm1hdDsKLSAgfQotCi0gIHJldHVybiBfX2Zvcm1hdDsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9Jbkl0LCBjbGFzcyBfQ2hhclQ+Ci1ib29sIF9TVExQX0NBTEwKLV9fZ2V0X3Nob3J0X29yX2xvbmdfZGF5bmFtZShfSW5JdCYgX19maXJzdCwgX0luSXQmIF9fbGFzdCwgY29uc3QgY3R5cGU8X0NoYXJUPiYgX19jdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfVGltZV9JbmZvJiBfX3RhYmxlLCB0bSogX190KSB7Ci0gIGNvbnN0IHN0cmluZyogX19wciA9Ci0gICAgX19tYXRjaChfX2ZpcnN0LCBfX2xhc3QsIF9fdGFibGUuX01fZGF5bmFtZSArIDAsIF9fdGFibGUuX01fZGF5bmFtZSArIDE0LCBfX2N0KTsKLSAgX190LT50bV93ZGF5ID0gX19TVEFUSUNfQ0FTVChpbnQsIChfX3ByIC0gX190YWJsZS5fTV9kYXluYW1lKSAlIDcpOwotICByZXR1cm4gX19wciAhPSBfX3RhYmxlLl9NX2RheW5hbWUgKyAxNDsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9Jbkl0LCBjbGFzcyBfQ2hhclQ+Ci1ib29sIF9TVExQX0NBTEwKLV9fZ2V0X3Nob3J0X29yX2xvbmdfbW9udGhuYW1lKF9Jbkl0JiBfX2ZpcnN0LCBfSW5JdCYgX19sYXN0LCBjb25zdCBjdHlwZTxfQ2hhclQ+JiBfX2N0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1RpbWVfSW5mbyYgX190YWJsZSwgdG0qIF9fdCkgewotICBjb25zdCBzdHJpbmcqIF9fcHIgPQotICAgIF9fbWF0Y2goX19maXJzdCwgX19sYXN0LCBfX3RhYmxlLl9NX21vbnRobmFtZSArIDAsIF9fdGFibGUuX01fbW9udGhuYW1lICsgMjQsIF9fY3QpOwotICBfX3QtPnRtX21vbiA9IF9fU1RBVElDX0NBU1QoaW50LCAoX19wciAtIF9fdGFibGUuX01fbW9udGhuYW1lKSAlIDEyKTsKLSAgcmV0dXJuIF9fcHIgIT0gX190YWJsZS5fTV9tb250aG5hbWUgKyAyNDsKLX0KLQotI2lmICFkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQotdGVtcGxhdGUgPGNsYXNzIF9PdUl0PgotX091SXQgX1NUTFBfQ0FMTAotX19wdXRfdGltZShjaGFyICogX19maXJzdCwgY2hhciAqIF9fbGFzdCwgX091SXQgX19vdXRfaXRlLAotICAgICAgICAgICBjb25zdCBpb3NfYmFzZSYgX19zLCB3Y2hhcl90KSB7Ci0gICAgY29uc3QgY3R5cGU8d2NoYXJfdD4mIF9fY3QgPSAqX19TVEFUSUNfQ0FTVChjb25zdCBjdHlwZTx3Y2hhcl90PiosIF9fcy5fTV9jdHlwZV9mYWNldCgpKTsKLSAgICB3Y2hhcl90IF9fd2J1Zls2NF07Ci0gICAgX19jdC53aWRlbihfX2ZpcnN0LCBfX2xhc3QsIF9fd2J1Zik7Ci0gICAgcHRyZGlmZl90IF9fbGVuID0gX19sYXN0IC0gX19maXJzdDsKLSAgICB3Y2hhcl90ICogX19lZW5kID0gX193YnVmICsgX19sZW47Ci0gICAgcmV0dXJuIGNvcHkoKHdjaGFyX3QqKV9fd2J1ZiwgX19lZW5kLCBfX291dF9pdGUpOwotfQotI2VuZGlmCi0KLV9TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoLCBjbGFzcyBfSW5JdD4KLV9Jbkl0Ci10aW1lX2dldDxfQ2gsIF9Jbkl0Pjo6ZG9fZ2V0X2RhdGUoX0luSXQgX19zLCBfSW5JdCAgX19lbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2UmIF9fc3RyLCBpb3NfYmFzZTo6aW9zdGF0ZSYgIF9fZXJyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtKiBfX3QpIGNvbnN0IHsKLSAgdHlwZWRlZiBzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIHN0cmluZ19pdGVyYXRvcjsKLQotICBzdHJpbmdfaXRlcmF0b3IgX19mb3JtYXQgPSBfTV90aW1laW5mby5fTV9kYXRlX2Zvcm1hdC5iZWdpbigpOwotICBzdHJpbmdfaXRlcmF0b3IgX19mb3JtYXRfZW5kID0gX01fdGltZWluZm8uX01fZGF0ZV9mb3JtYXQuZW5kKCk7Ci0KLSAgc3RyaW5nX2l0ZXJhdG9yIF9fcmVzdWx0Ci0gICAgPSBfU1RMUF9QUklWIF9fZ2V0X2Zvcm1hdHRlZF90aW1lKF9fcywgX19lbmQsIF9fZm9ybWF0LCBfX2Zvcm1hdF9lbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fU1RBVElDX0NBU1QoX0NoKiwgMCksIF9NX3RpbWVpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3N0ciwgX19lcnIsIF9fdCk7Ci0gIGlmIChfX3Jlc3VsdCA9PSBfX2Zvcm1hdF9lbmQpCi0gICAgX19lcnIgPSBpb3NfYmFzZTo6Z29vZGJpdDsKLSAgZWxzZSB7Ci0gICAgX19lcnIgPSBpb3NfYmFzZTo6ZmFpbGJpdDsKLSAgICBpZiAoX19zID09IF9fZW5kKQotICAgICAgX19lcnIgfD0gaW9zX2Jhc2U6OmVvZmJpdDsKLSAgfQotICByZXR1cm4gX19zOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoLCBjbGFzcyBfSW5JdD4KLV9Jbkl0Ci10aW1lX2dldDxfQ2gsIF9Jbkl0Pjo6ZG9fZ2V0X3RpbWUoX0luSXQgX19zLCBfSW5JdCAgX19lbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2UmIF9fc3RyLCBpb3NfYmFzZTo6aW9zdGF0ZSYgIF9fZXJyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtKiBfX3QpIGNvbnN0IHsKLSAgdHlwZWRlZiBzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIHN0cmluZ19pdGVyYXRvcjsKLSAgc3RyaW5nX2l0ZXJhdG9yIF9fZm9ybWF0ID0gX01fdGltZWluZm8uX01fdGltZV9mb3JtYXQuYmVnaW4oKTsKLSAgc3RyaW5nX2l0ZXJhdG9yIF9fZm9ybWF0X2VuZCA9IF9NX3RpbWVpbmZvLl9NX3RpbWVfZm9ybWF0LmVuZCgpOwotCi0gIHN0cmluZ19pdGVyYXRvciBfX3Jlc3VsdAotICAgID0gX1NUTFBfUFJJViBfX2dldF9mb3JtYXR0ZWRfdGltZShfX3MsIF9fZW5kLCBfX2Zvcm1hdCwgX19mb3JtYXRfZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX1NUQVRJQ19DQVNUKF9DaCosIDApLCBfTV90aW1laW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19zdHIsIF9fZXJyLCBfX3QpOwotICBfX2VyciA9IF9fcmVzdWx0ID09IF9fZm9ybWF0X2VuZCA/IGlvc19iYXNlOjpnb29kYml0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaW9zX2Jhc2U6OmZhaWxiaXQ7Ci0gIGlmIChfX3MgPT0gX19lbmQpCi0gICAgX19lcnIgfD0gaW9zX2Jhc2U6OmVvZmJpdDsKLSAgcmV0dXJuIF9fczsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaCwgY2xhc3MgX0luSXQ+Ci1fSW5JdAotdGltZV9nZXQ8X0NoLCBfSW5JdD46OmRvX2dldF95ZWFyKF9Jbkl0IF9fcywgX0luSXQgIF9fZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlJiwgaW9zX2Jhc2U6Omlvc3RhdGUmICBfX2VyciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bSogX190KSBjb25zdCB7Ci0gIGlmIChfX3MgPT0gX19lbmQpIHsKLSAgICBfX2VyciA9IGlvc19iYXNlOjpmYWlsYml0IHwgaW9zX2Jhc2U6OmVvZmJpdDsKLSAgICByZXR1cm4gX19zOwotICB9Ci0KLSAgYm9vbCBfX3ByID0gIF9TVExQX1BSSVYgX19nZXRfZGVjaW1hbF9pbnRlZ2VyKF9fcywgX19lbmQsIF9fdC0+dG1feWVhciwgX19TVEFUSUNfQ0FTVChfQ2gqLCAwKSk7Ci0gIF9fdC0+dG1feWVhciAtPSAxOTAwOwotICBfX2VyciA9IF9fcHIgPyBpb3NfYmFzZTo6Z29vZGJpdCA6IGlvc19iYXNlOjpmYWlsYml0OwotICBpZiAoX19zID09IF9fZW5kKQotICAgIF9fZXJyIHw9IGlvc19iYXNlOjplb2ZiaXQ7Ci0KLSAgcmV0dXJuIF9fczsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9DaCwgY2xhc3MgX0luSXQ+Ci1fSW5JdAotdGltZV9nZXQ8X0NoLCBfSW5JdD46OmRvX2dldF93ZWVrZGF5KF9Jbkl0IF9fcywgX0luSXQgIF9fZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlICZfX3N0ciwgaW9zX2Jhc2U6Omlvc3RhdGUgJl9fZXJyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtICpfX3QpIGNvbnN0IHsKLSAgY29uc3QgY3R5cGU8X0NoPiYgX19jdCA9ICpfX1NUQVRJQ19DQVNUKGNvbnN0IGN0eXBlPF9DaD4qLCBfX3N0ci5fTV9jdHlwZV9mYWNldCgpKTsKLSAgYm9vbCBfX3Jlc3VsdCA9Ci0gICAgX1NUTFBfUFJJViBfX2dldF9zaG9ydF9vcl9sb25nX2RheW5hbWUoX19zLCBfX2VuZCwgX19jdCwgX01fdGltZWluZm8sIF9fdCk7Ci0gIGlmIChfX3Jlc3VsdCkKLSAgICBfX2VyciA9IGlvc19iYXNlOjpnb29kYml0OwotICBlbHNlIHsKLSAgICBfX2VyciA9IGlvc19iYXNlOjpmYWlsYml0OwotICAgIGlmIChfX3MgPT0gX19lbmQpCi0gICAgICBfX2VyciB8PSBpb3NfYmFzZTo6ZW9mYml0OwotICB9Ci0gIHJldHVybiBfX3M7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ2gsIGNsYXNzIF9Jbkl0PgotX0luSXQKLXRpbWVfZ2V0PF9DaCwgX0luSXQ+Ojpkb19nZXRfbW9udGhuYW1lKF9Jbkl0IF9fcywgX0luSXQgIF9fZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2UgJl9fc3RyLCBpb3NfYmFzZTo6aW9zdGF0ZSAmX19lcnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bSAqX190KSBjb25zdCB7Ci0gIGNvbnN0IGN0eXBlPF9DaD4mIF9fY3QgPSAqX19TVEFUSUNfQ0FTVChjb25zdCBjdHlwZTxfQ2g+KiwgX19zdHIuX01fY3R5cGVfZmFjZXQoKSk7Ci0gIGJvb2wgX19yZXN1bHQgPQotICAgIF9TVExQX1BSSVYgX19nZXRfc2hvcnRfb3JfbG9uZ19tb250aG5hbWUoX19zLCBfX2VuZCwgX19jdCwgX01fdGltZWluZm8sIF9fdCk7Ci0gIGlmIChfX3Jlc3VsdCkKLSAgICBfX2VyciA9IGlvc19iYXNlOjpnb29kYml0OwotICBlbHNlIHsKLSAgICBfX2VyciA9IGlvc19iYXNlOjpmYWlsYml0OwotICAgIGlmIChfX3MgPT0gX19lbmQpCi0gICAgICBfX2VyciB8PSBpb3NfYmFzZTo6ZW9mYml0OwotICB9Ci0gIHJldHVybiBfX3M7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIF9DaCwgY2xhc3MgX091dHB1dEl0ZXI+Ci1fT3V0cHV0SXRlcgotdGltZV9wdXQ8X0NoLF9PdXRwdXRJdGVyPjo6cHV0KF9PdXRwdXRJdGVyIF9fcywgaW9zX2Jhc2UmIF9fZiwgX0NoIF9fZmlsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0bSogX190bWIsIGNvbnN0IF9DaCogX19wYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0NoKiBfX3BhdF9lbmQpIGNvbnN0IHsKLSAgLy8gIGxvY2FsZSBfX2xvYyA9IF9fZi5nZXRsb2MoKTsKLSAgLy8gIGNvbnN0IGN0eXBlPF9DaD4mIF9DdCA9IHVzZV9mYWNldDxjdHlwZTxfQ2g+ID4oX19sb2MpOwotICBjb25zdCBjdHlwZTxfQ2g+JiBfQ3QgPSAqX19TVEFUSUNfQ0FTVChjb25zdCBjdHlwZTxfQ2g+KiwgX19mLl9NX2N0eXBlX2ZhY2V0KCkpOwotICB3aGlsZSAoX19wYXQgIT0gX19wYXRfZW5kKSB7Ci0gICAgY2hhciBfX2MgPSBfQ3QubmFycm93KCpfX3BhdCwgMCk7Ci0gICAgaWYgKF9fYyA9PSAnJScpIHsKLSAgICAgIGNoYXIgX19tb2QgPSAwOwotICAgICAgKytfX3BhdDsKLSAgICAgIF9fYyA9IF9DdC5uYXJyb3coKl9fcGF0KyssIDApOwotICAgICAgaWYgKF9fYyA9PSAnIycpIHsgLy8gTVMgZXh0ZW5zaW9uCi0gICAgICAgIF9fbW9kID0gX19jOwotICAgICAgICBfX2MgPSBfQ3QubmFycm93KCpfX3BhdCsrLCAwKTsKLSAgICAgIH0KLSAgICAgIF9fcyA9IGRvX3B1dChfX3MsIF9fZiwgX19maWxsLCBfX3RtYiwgX19jLCBfX21vZCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICpfX3MrKyA9ICpfX3BhdCsrOwotICB9Ci0gIHJldHVybiBfX3M7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIF9DaCwgY2xhc3MgX091dHB1dEl0ZXI+Ci1fT3V0cHV0SXRlcgotdGltZV9wdXQ8X0NoLF9PdXRwdXRJdGVyPjo6ZG9fcHV0KF9PdXRwdXRJdGVyIF9fcywgaW9zX2Jhc2UmIF9fZiwgX0NoIC8qIF9fZmlsbCAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0bSogX190bWIsIGNoYXIgX19mb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBfX21vZGlmaWVyICkgY29uc3QgewotICBjaGFyIF9fYnVmWzY0XTsKLSAgY2hhciAqIF9faWVuZCA9IF9TVExQX1BSSVYgX193cml0ZV9mb3JtYXR0ZWRfdGltZShfU1RMUF9BUlJBWV9BTkRfU0laRShfX2J1ZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mb3JtYXQsIF9fbW9kaWZpZXIsIF9NX3RpbWVpbmZvLCBfX3RtYik7Ci0gIC8vICBsb2NhbGUgX19sb2MgPSBfX2YuZ2V0bG9jKCk7Ci0gIHJldHVybiBfU1RMUF9QUklWIF9fcHV0X3RpbWUoX19idWYsIF9faWVuZCwgX19zLCBfX2YsIF9DaCgpKTsKLX0KLQotX1NUTFBfRU5EX05BTUVTUEFDRQotCi0jZW5kaWYgLyogX1NUTFBfVElNRV9GQUNFVFNfQyAqLwotCi0vLyBMb2NhbCBWYXJpYWJsZXM6Ci0vLyBtb2RlOkMrKwotLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RsL190aW1lX2ZhY2V0cy5oIGIvc3RsL190aW1lX2ZhY2V0cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDIzODE4Li4wMDAwMDAwCi0tLSBhL3N0bC9fdGltZV9mYWNldHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotLy8gV0FSTklORzogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgQysrCi0vLyBzdGFuZGFyZCBsaWJyYXJ5IGhlYWRlcnMuICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSB0aGlzIGhlYWRlcgotLy8gZmlsZSBkaXJlY3RseS4KLQotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX1RJTUVfRkFDRVRTX0gKLSNkZWZpbmUgX1NUTFBfSU5URVJOQUxfVElNRV9GQUNFVFNfSAotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NUSU1FCi0jICBpbmNsdWRlIDxzdGwvX2N0aW1lLmg+ICAgICAgICAgICAgICAgIC8vIE5lZWRlZCAoZm9yIHN0cnVjdCB0bSkgYnkgdGltZSBmYWNldHMKLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX0NfTE9DQUxFX0gKLSMgIGluY2x1ZGUgPHN0bC9jX2xvY2FsZS5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfSU9TX0JBU0VfSAotIyAgaW5jbHVkZSA8c3RsL19pb3NfYmFzZS5oPgotI2VuZGlmCi0KLV9TVExQX0JFR0lOX05BTUVTUEFDRQotCi1fU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCi0KLS8vIFRlbXBsYXRlIGZ1bmN0aW9ucyB1c2VkIGJ5IHRpbWVfZ2V0Ci0KLS8vIE1hdGNoaW5nIGlucHV0IGFnYWluc3QgYSBsaXN0IG9mIG5hbWVzCi0KLS8vIEFscGhhYmV0aWMgaW5wdXQgb2YgdGhlIG5hbWVzIG9mIG1vbnRocyBhbmQgdGhlIG5hbWVzCi0vLyBvZiB3ZWVrZGF5cyByZXF1aXJlcyBtYXRjaGluZyBpbnB1dCBhZ2FpbnN0IGEgbGlzdCBvZiBuYW1lcy4KLS8vIFdlIHVzZSBhIHNpbXBsZSBnZW5lcmljIGFsZ29yaXRobSB0byBhY2NvbXBsaXNoIHRoaXMuICBUaGlzCi0vLyBhbGdvcml0aG0gaXMgbm90IHZlcnkgZWZmaWNpZW50LCBlc3BlY2lhbGx5IGZvciBsb25nZXIgbGlzdHMKLS8vIG9mIG5hbWVzLCBidXQgaXQgcHJvYmFibHkgZG9lcyBub3QgbWF0dGVyIGZvciB0aGUgaW5pdGlhbAotLy8gaW1wbGVtZW50YXRpb24gYW5kIGl0IG1heSBuZXZlciBtYXR0ZXIsIHNpbmNlIHdlIGRvIG5vdCBleHBlY3QKLS8vIHRoaXMga2luZCBvZiBpbnB1dCB0byBiZSB1c2VkIHZlcnkgb2Z0ZW4uICBUaGUgYWxnb3JpdGhtCi0vLyBjb3VsZCBiZSBpbXByb3ZlZCBmYWlybHkgc2ltcGx5IGJ5IGNyZWF0aW5nIGEgbmV3IGxpc3Qgb2YKLS8vIG5hbWVzIHN0aWxsIGluIHRoZSBydW5uaW5nIGF0IGVhY2ggaXRlcmF0aW9uLiAgQSBtb3JlIHNvcGhpc3RpY2F0ZWQKLS8vIGFwcHJvYWNoIHdvdWxkIGJlIHRvIGJ1aWxkIGEgdHJpZSB0byBkbyB0aGUgbWF0Y2hpbmcuCi0vLwotLy8gV2UgY29tcGFyZSBlYWNoIGNoYXJhY3RlciBvZiB0aGUgaW5wdXQgdG8gdGhlIGNvcnJlc3BvbmRpbmcKLS8vIGNoYXJhY3RlciBvZiBlYWNoIG5hbWUgb24gdGhlIGxpc3QgdGhhdCBoYXMgbm90IGJlZW4gZWxpbWluYXRlZCwKLS8vIGVpdGhlciBiZWNhdXNlIGV2ZXJ5IGNoYXJhY3RlciBpbiB0aGUgbmFtZSBoYXMgYWxyZWFkeSBiZWVuCi0vLyBtYXRjaGVkLCBvciBiZWNhdXNlIHNvbWUgY2hhcmFjdGVyIGhhcyBub3QgYmVlbiBtYXRjaGVkLiAgV2UKLS8vIGNvbnRpbnVlIG9ubHkgYXMgbG9uZyBhcyB0aGVyZSBhcmUgc29tZSBuYW1lcyB0aGF0IGhhdmUgbm90IGJlZW4KLS8vIGVsaW1pbmF0ZWQuCi0KLS8vIFdlIGRvIG5vdCByZWFsbHkgbmVlZCBhIHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3IgKGEgZm9yd2FyZCBpdGVyYXRvcgotLy8gd291bGQgZG8pLCBidXQgdGhlIGV4dHJhIGdlbmVyYWxpdHkgbWFrZXMgdGhlIG5vdGF0aW9uIGNsdW1zaWVyLAotLy8gYW5kIHdlIGRvbid0IHJlYWxseSBuZWVkIGl0LgotCi0vLyBXZSBjYW4gcmVjb2duaXplIGEgZmFpbGVkIG1hdGNoIGJ5IHRoZSBmYWN0IHRoYXQgdGhlIHNlY29uZAotLy8gY29tcG9uZW50IG9mIHRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSBfX25hbWVfZW5kLgotCi0jZGVmaW5lIF9NQVhOQU1FUyAgICAgICAgNjQKLSNkZWZpbmUgX01BWF9OQU1FX0xFTkdUSCA2NAotCi0vLyBCb3RoIHRpbWVfZ2V0IGFuZCB0aW1lX3B1dCBuZWVkIGEgc3RydWN0dXJlIG9mIHR5cGUgX1RpbWVfSW5mbwotLy8gdG8gcHJvdmlkZSBuYW1lcyBhbmQgYWJicmV2aWF0ZWQgbmFtZXMgZm9yIG1vbnRocyBhbmQgZGF5cywKLS8vIGFzIHdlbGwgYXMgdGhlIGFtL3BtIGRlc2lnbmF0b3IuICBUaGUgbW9udGggYW5kIHdlZWtkYXkgdGFibGVzCi0vLyBoYXZlIHRoZSBhbGwgdGhlIGFiYnJldmlhdGVkIG5hbWVzIGJlZm9yZSBhbGwgdGhlIGZ1bGwgbmFtZXMuCi0vLyBUaGUgX1RpbWVfSW5mbyB0YWJsZXMgYXJlIGluaXRpYWxpemVkIHVzaW5nIHRoZSBub24tdGVtcGxhdGUKLS8vIGZ1bmN0aW9uIF9Jbml0X3RpbWVpbmZvLCB3aGljaCBoYXMgdHdvIG92ZXJsb2FkaW5nczogIG9uZQotLy8gd2l0aCBhIHNpbmdsZSByZWZlcmVuY2UgcGFyYW1ldGVyIGZvciB0aGUgdGFibGUgdG8gYmUgaW5pdGlhbGl6ZWQsCi0vLyBhbmQgb25lIHdpdGggYSBzZWNvbmQgX0xvY2FsZV90aW1lICogcGFyYW1ldGVyLiAgVGhlIGZpcnN0IGZvcm0KLS8vIGlzIGNhbGxlZCBieSB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBhbmQgdGhlIHNlY29uZCBieSBhIHNwZWNpYWwKLS8vIGNvbnN0cnVjdG9yIGludm9rZWQgZnJvbSB0aGUgX2J5bmFtZSBzdWJjbGFzcyBjb25zdHJ1Y3RvciB0bwotLy8gY29uc3RydWN0IHRoZSBiYXNlIGNsYXNzLgotCi1jbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBfVGltZV9JbmZvIHsKLXB1YmxpYzoKLSAgc3RyaW5nIF9NX2RheW5hbWVbMTRdOwotICBzdHJpbmcgX01fbW9udGhuYW1lWzI0XTsKLSAgc3RyaW5nIF9NX2FtX3BtWzJdOwotICBzdHJpbmcgX01fdGltZV9mb3JtYXQ7Ci0gIHN0cmluZyBfTV9kYXRlX2Zvcm1hdDsKLSAgc3RyaW5nIF9NX2RhdGVfdGltZV9mb3JtYXQ7Ci0gIHN0cmluZyBfTV9sb25nX2RhdGVfZm9ybWF0OwotICBzdHJpbmcgX01fbG9uZ19kYXRlX3RpbWVfZm9ybWF0OwotfTsKLQotdm9pZCBfU1RMUF9DQUxMIF9Jbml0X3RpbWVpbmZvKF9UaW1lX0luZm8mKTsKLXZvaWQgX1NUTFBfQ0FMTCBfSW5pdF90aW1laW5mbyhfVGltZV9JbmZvJiwgX0xvY2FsZV90aW1lKik7Ci0KLV9TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQotCi1jbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyB0aW1lX2Jhc2UgewotcHVibGljOgotICBlbnVtIGRhdGVvcmRlciB7bm9fb3JkZXIsIGRteSwgbWR5LCB5bWQsIHlkbX07Ci19OwotCi0jaWYgZGVmaW5lZCAoX1NUTFBfTElNSVRFRF9ERUZBVUxUX1RFTVBMQVRFUykKLXRlbXBsYXRlIDxjbGFzcyBfQ2gsIGNsYXNzIF9Jbkl0PgotI2Vsc2UKLXRlbXBsYXRlIDxjbGFzcyBfQ2gsIGNsYXNzIF9Jbkl0ID0gaXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2gsIGNoYXJfdHJhaXRzPF9DaD4gPiA+Ci0jZW5kaWYKLWNsYXNzIHRpbWVfZ2V0IDogcHVibGljIGxvY2FsZTo6ZmFjZXQsIHB1YmxpYyB0aW1lX2Jhc2UgewotICBmcmllbmQgY2xhc3MgX0xvY2FsZV9pbXBsOwotCi1wdWJsaWM6Ci0gIHR5cGVkZWYgX0NoICAgY2hhcl90eXBlOwotICB0eXBlZGVmIF9Jbkl0IGl0ZXJfdHlwZTsKLQotICBleHBsaWNpdCB0aW1lX2dldChzaXplX3QgX19yZWZzID0gMCkgOiBsb2NhbGU6OmZhY2V0KF9fcmVmcykKLSAgeyBfU1RMUF9QUklWIF9Jbml0X3RpbWVpbmZvKF9NX3RpbWVpbmZvKTsgfQotICBkYXRlb3JkZXIgZGF0ZV9vcmRlcigpIGNvbnN0IHsgcmV0dXJuIGRvX2RhdGVfb3JkZXIoKTsgfQotICBpdGVyX3R5cGUgZ2V0X3RpbWUoaXRlcl90eXBlIF9fcywgaXRlcl90eXBlICBfX2VuZCwgaW9zX2Jhc2UmICBfX3N0ciwKLSAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiAgX19lcnIsIHRtKiBfX3QpIGNvbnN0Ci0gIHsgcmV0dXJuIGRvX2dldF90aW1lKF9fcywgIF9fZW5kLCAgX19zdHIsICBfX2VyciwgX190KTsgfQotICBpdGVyX3R5cGUgZ2V0X2RhdGUoaXRlcl90eXBlIF9fcywgaXRlcl90eXBlICBfX2VuZCwgaW9zX2Jhc2UmICBfX3N0ciwKLSAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiAgX19lcnIsIHRtKiBfX3QpIGNvbnN0Ci0gIHsgcmV0dXJuIGRvX2dldF9kYXRlKF9fcywgIF9fZW5kLCAgX19zdHIsICBfX2VyciwgX190KTsgfQotICBpdGVyX3R5cGUgZ2V0X3dlZWtkYXkoaXRlcl90eXBlIF9fcywgaXRlcl90eXBlICBfX2VuZCwgaW9zX2Jhc2UmICBfX3N0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiAgX19lcnIsIHRtKiBfX3QpIGNvbnN0Ci0gIHsgcmV0dXJuIGRvX2dldF93ZWVrZGF5KF9fcywgIF9fZW5kLCAgX19zdHIsICBfX2VyciwgX190KTsgfQotICBpdGVyX3R5cGUgZ2V0X21vbnRobmFtZShpdGVyX3R5cGUgX19zLCBpdGVyX3R5cGUgIF9fZW5kLCBpb3NfYmFzZSYgIF9fc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgIF9fZXJyLCB0bSogX190KSBjb25zdAotICB7IHJldHVybiBkb19nZXRfbW9udGhuYW1lKF9fcywgIF9fZW5kLCAgX19zdHIsICBfX2VyciwgX190KTsgfQotICBpdGVyX3R5cGUgZ2V0X3llYXIoaXRlcl90eXBlIF9fcywgaXRlcl90eXBlICBfX2VuZCwgaW9zX2Jhc2UmICBfX3N0ciwKLSAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiAgX19lcnIsIHRtKiBfX3QpIGNvbnN0Ci0gIHsgcmV0dXJuIGRvX2dldF95ZWFyKF9fcywgIF9fZW5kLCAgX19zdHIsICBfX2VyciwgX190KTsgfQotCi0gIHN0YXRpYyBfU1RMUF9TVEFUSUNfTUVNQkVSX0RFQ0xTUEVDIGxvY2FsZTo6aWQgaWQ7Ci0KLXByb3RlY3RlZDoKLSAgdGltZV9nZXQoX0xvY2FsZV90aW1lICosIHNpemVfdCBfX3JlZnMpIDogbG9jYWxlOjpmYWNldChfX3JlZnMpIHt9Ci0KLSAgfnRpbWVfZ2V0KCkge30KLQotICB2aXJ0dWFsIGRhdGVvcmRlciBkb19kYXRlX29yZGVyKCkgY29uc3Qge3JldHVybiBub19vcmRlcjt9Ci0KLSAgdmlydHVhbCBpdGVyX3R5cGUgZG9fZ2V0X3RpbWUoaXRlcl90eXBlIF9fcywgaXRlcl90eXBlICBfX2VuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2UmLCBpb3NfYmFzZTo6aW9zdGF0ZSYgIF9fZXJyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bSogX190KSBjb25zdDsKLQotICB2aXJ0dWFsIGl0ZXJfdHlwZSBkb19nZXRfZGF0ZShpdGVyX3R5cGUgX19zLCBpdGVyX3R5cGUgIF9fZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZSYsIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG0qIF9fdCkgY29uc3Q7Ci0KLSAgdmlydHVhbCBpdGVyX3R5cGUgZG9fZ2V0X3dlZWtkYXkoaXRlcl90eXBlIF9fcywgaXRlcl90eXBlICBfX2VuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2UmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtKiBfX3QpIGNvbnN0OwotICB2aXJ0dWFsIGl0ZXJfdHlwZSBkb19nZXRfbW9udGhuYW1lKGl0ZXJfdHlwZSBfX3MsIGl0ZXJfdHlwZSAgX19lbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2UmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bSogX190KSBjb25zdDsKLQotICB2aXJ0dWFsIGl0ZXJfdHlwZSBkb19nZXRfeWVhcihpdGVyX3R5cGUgX19zLCBpdGVyX3R5cGUgIF9fZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZSYsIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG0qIF9fdCkgY29uc3Q7Ci0KLSAgX1NUTFBfUFJJViBfVGltZV9JbmZvIF9NX3RpbWVpbmZvOwotfTsKLQotX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQotCi10aW1lX2Jhc2U6OmRhdGVvcmRlciBfU1RMUF9DQUxMIF9fZ2V0X2RhdGVfb3JkZXIoX0xvY2FsZV90aW1lKik7Ci1fTG9jYWxlX3RpbWUqIF9TVExQX0NBTEwgX19hY3F1aXJlX3RpbWUoY29uc3QgY2hhciogX19uYW1lLCBfTG9jYWxlX25hbWVfaGludCopOwotdm9pZCBfU1RMUF9DQUxMIF9fcmVsZWFzZV90aW1lKF9Mb2NhbGVfdGltZSogX190aW1lKTsKLQotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi0KLXRlbXBsYXRlIDxjbGFzcyBfQ2gsIGNsYXNzIF9Jbkl0PgotY2xhc3MgdGltZV9nZXRfYnluYW1lOwotCi0jaWYgZGVmaW5lZCAoX19HTlVDX18pICYmIChfX0dOVUNfXyA8IDMpCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoLCBjbGFzcyBfSW5JdD4KLV9Mb2NhbGVfbmFtZV9oaW50KiBfTG9jYWxlX3RpbWVfZXh0cmFjdF9oaW50KHRpbWVfZ2V0X2J5bmFtZTxfQ2gsIF9Jbkl0PiopOwotI2Vsc2UKLV9Mb2NhbGVfbmFtZV9oaW50KiBfTG9jYWxlX3RpbWVfZXh0cmFjdF9oaW50KHRpbWVfZ2V0X2J5bmFtZTxjaGFyLCBpc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4gPiopOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9MSU1JVEVEX0RFRkFVTFRfVEVNUExBVEVTKQotdGVtcGxhdGUgPGNsYXNzIF9DaCwgY2xhc3MgX0luSXQ+Ci0jZWxzZQotdGVtcGxhdGUgPGNsYXNzIF9DaCwgY2xhc3MgX0luSXQgPSBpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaCwgY2hhcl90cmFpdHM8X0NoPiA+ID4KLSNlbmRpZgotY2xhc3MgdGltZV9nZXRfYnluYW1lIDogcHVibGljIHRpbWVfZ2V0PF9DaCwgX0luSXQ+IHsKLXB1YmxpYzoKLSAgdHlwZWRlZiAgdGltZV9iYXNlOjpkYXRlb3JkZXIgZGF0ZW9yZGVyOwotICB0eXBlZGVmIF9Jbkl0ICAgICAgICAgICAgICAgICBpdGVyX3R5cGU7Ci0KLSAgZXhwbGljaXQgdGltZV9nZXRfYnluYW1lKGNvbnN0IGNoYXIqIF9fbmFtZSwgc2l6ZV90IF9fcmVmcyA9IDAsIF9Mb2NhbGVfbmFtZV9oaW50KiBfX2hpbnQgPSAwKQotICAgIDogdGltZV9nZXQ8X0NoLCBfSW5JdD4oKF9Mb2NhbGVfdGltZSopIDAsIF9fcmVmcyksCi0gICAgICBfTV90aW1lKF9TVExQX1BSSVYgX19hY3F1aXJlX3RpbWUoX19uYW1lLCBfX2hpbnQpKQotICB7IF9TVExQX1BSSVYgX0luaXRfdGltZWluZm8odGhpcy0+X01fdGltZWluZm8sIHRoaXMtPl9NX3RpbWUpOyB9Ci0KLXByb3RlY3RlZDoKLSAgfnRpbWVfZ2V0X2J5bmFtZSgpIHsgX1NUTFBfUFJJViBfX3JlbGVhc2VfdGltZShfTV90aW1lKTsgfQotICBkYXRlb3JkZXIgZG9fZGF0ZV9vcmRlcigpIGNvbnN0IHsgcmV0dXJuIF9TVExQX1BSSVYgX19nZXRfZGF0ZV9vcmRlcihfTV90aW1lKTsgfQotCi1wcml2YXRlOgotICBfTG9jYWxlX3RpbWUqIF9NX3RpbWU7Ci0KLSAgdHlwZWRlZiB0aW1lX2dldF9ieW5hbWU8X0NoLCBfSW5JdD4gX1NlbGY7Ci0gIC8vZXhwbGljaXRlbHkgZGVmaW5lZCBhcyBwcml2YXRlIHRvIGF2b2lkIHdhcm5pbmdzOgotICB0aW1lX2dldF9ieW5hbWUoX1NlbGYgY29uc3QmKTsKLSAgX1NlbGYmIG9wZXJhdG9yID0gKF9TZWxmIGNvbnN0Jik7Ci0jaWYgZGVmaW5lZCAoX19HTlVDX18pICYmIChfX0dOVUNfXyA8IDMpCi0gIGZyaWVuZCBfTG9jYWxlX25hbWVfaGludCogX0xvY2FsZV90aW1lX2V4dHJhY3RfaGludDw+KF9TZWxmKik7Ci0jZWxzZQotICBmcmllbmQgX0xvY2FsZV9uYW1lX2hpbnQqIF9Mb2NhbGVfdGltZV9leHRyYWN0X2hpbnQodGltZV9nZXRfYnluYW1lPGNoYXIsIGlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiA+Kik7Ci0jZW5kaWYKLX07Ci0KLS8vIHRpbWVfcHV0IGZhY2V0Ci0KLS8vIEZvciB0aGUgZm9ybWF0cyAneCwgJ1gnLCBhbmQgJ2MnLCBkb19wdXQgY2FsbHMgdGhlIGZpcnN0IGZvcm0gb2YKLS8vIHB1dCB3aXRoIHRoZSBwYXR0ZXJuIG9idGFpbmVkIGZyb20gX01fdGltZWluZm8uX01fZGF0ZV9mb3JtYXQgb3IKLS8vIF9NX3RpbWVpbmZvLl9NX3RpbWVfZm9ybWF0LgotCi0vLyBIZWxwZXIgZnVuY3Rpb246ICBfXyAgdGFrZXMgYSBzaW5nbGUtY2hhcmFjdGVyCi0vLyBmb3JtYXQuICBBcyBpbmRpY2F0ZWQgYnkgdGhlIGZvcmVnb2luZyByZW1hcmssIHRoaXMgd2lsbCBuZXZlciBiZQotLy8gJ3gnLCAnWCcsIG9yICdjJy4KLQotX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQotCi1jaGFyICogX1NUTFBfQ0FMTAotX193cml0ZV9mb3JtYXR0ZWRfdGltZShjaGFyICpfX2J1Ziwgc2l6ZV90IF9fYnVmX3NpemUsIGNoYXIgX19mb3JtYXQsIGNoYXIgX19tb2RpZmllciwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1RpbWVfSW5mbyYgX190YWJsZSwgY29uc3QgdG0qIF9fdCk7Ci0KLXRlbXBsYXRlIDxjbGFzcyBfT3VJdD4KLWlubGluZSBfT3VJdCBfU1RMUF9DQUxMIF9fcHV0X3RpbWUoY2hhciAqIF9fZmlyc3QsIGNoYXIgKiBfX2xhc3QsIF9PdUl0IF9fb3V0X2l0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW9zX2Jhc2UmIC8qIF9fbG9jICovLCBjaGFyKQoteyByZXR1cm4gY29weShfX2ZpcnN0LCBfX2xhc3QsIF9fb3V0X2l0ZSk7IH0KLQotI2lmICFkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQotdGVtcGxhdGUgPGNsYXNzIF9PdUl0PgotX091SXQgX1NUTFBfQ0FMTCBfX3B1dF90aW1lKGNoYXIgKiBfX2ZpcnN0LCBjaGFyICogX19sYXN0LCBfT3VJdCBfX291dF9pdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW9zX2Jhc2UmIF9fcywgd2NoYXJfdCk7Ci0jZW5kaWYKLQotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9MSU1JVEVEX0RFRkFVTFRfVEVNUExBVEVTKQotdGVtcGxhdGUgPGNsYXNzIF9DaCwgY2xhc3MgX091dEl0PgotI2Vsc2UKLXRlbXBsYXRlIDxjbGFzcyBfQ2gsIGNsYXNzIF9PdXRJdCA9IG9zdHJlYW1idWZfaXRlcmF0b3I8X0NoLCBjaGFyX3RyYWl0czxfQ2g+ID4gPgotI2VuZGlmCi1jbGFzcyB0aW1lX3B1dCA6IHB1YmxpYyBsb2NhbGU6OmZhY2V0LCBwdWJsaWMgdGltZV9iYXNlIHsKLSAgZnJpZW5kIGNsYXNzIF9Mb2NhbGVfaW1wbDsKLXB1YmxpYzoKLSAgdHlwZWRlZiBfQ2ggICAgICBjaGFyX3R5cGU7Ci0gIHR5cGVkZWYgX091dEl0IGl0ZXJfdHlwZTsKLQotICBleHBsaWNpdCB0aW1lX3B1dChzaXplX3QgX19yZWZzID0gMCkgOiBsb2NhbGU6OmZhY2V0KF9fcmVmcykKLSAgeyBfU1RMUF9QUklWIF9Jbml0X3RpbWVpbmZvKF9NX3RpbWVpbmZvKTsgfQotCi0gIF9PdXRJdCBwdXQoaXRlcl90eXBlIF9fcywgaW9zX2Jhc2UmIF9fZiwgX0NoIF9fZmlsbCwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHRtKiBfX3RtYiwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IF9DaCogX19wYXQsIGNvbnN0IF9DaCogX19wYXRfZW5kKSBjb25zdDsKLQotICBfT3V0SXQgcHV0KGl0ZXJfdHlwZSBfX3MsIGlvc19iYXNlJiBfX2YsIF9DaCAgX19maWxsLAotICAgICAgICAgICAgICAgICAgY29uc3QgdG0qIF9fdG1iLCBjaGFyIF9fZm9ybWF0LCBjaGFyIF9fbW9kaWZpZXIgPSAwKSBjb25zdAotICB7IHJldHVybiBkb19wdXQoX19zLCBfX2YsICBfX2ZpbGwsIF9fdG1iLCBfX2Zvcm1hdCwgX19tb2RpZmllcik7IH0KLQotICBzdGF0aWMgX1NUTFBfU1RBVElDX01FTUJFUl9ERUNMU1BFQyBsb2NhbGU6OmlkIGlkOwotCi1wcm90ZWN0ZWQ6Ci0gIHRpbWVfcHV0KF9Mb2NhbGVfdGltZSogLypfX3RpbWUqLywgc2l6ZV90IF9fcmVmcykgOiBsb2NhbGU6OmZhY2V0KF9fcmVmcykKLSAge30gLy9fU1RMUF9QUklWIF9Jbml0X3RpbWVpbmZvKF9NX3RpbWVpbmZvLCBfX3RpbWUpOyB9Ci0KLSAgfnRpbWVfcHV0KCkge30KLSAgdmlydHVhbCBpdGVyX3R5cGUgZG9fcHV0KGl0ZXJfdHlwZSBfX3MsIGlvc19iYXNlJiBfX2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX3R5cGUgIC8qIF9fZmlsbCAqLywgY29uc3QgdG0qIF9fdG1iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBfX2Zvcm1hdCwgY2hhciAvKiBfX21vZGlmaWVyICovKSBjb25zdDsKLQotICBfU1RMUF9QUklWIF9UaW1lX0luZm8gX01fdGltZWluZm87Ci19OwotCi0jaWYgZGVmaW5lZCAoX1NUTFBfTElNSVRFRF9ERUZBVUxUX1RFTVBMQVRFUykKLXRlbXBsYXRlIDxjbGFzcyBfQ2gsIGNsYXNzIF9PdXRJdD4KLSNlbHNlCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoLCBjbGFzcyBfT3V0SXQgPSBvc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaCwgY2hhcl90cmFpdHM8X0NoPiA+ID4KLSNlbmRpZgotY2xhc3MgdGltZV9wdXRfYnluYW1lIDogcHVibGljIHRpbWVfcHV0PF9DaCwgX091dEl0PiB7Ci0gIGZyaWVuZCBjbGFzcyBfTG9jYWxlX2ltcGw7Ci1wdWJsaWM6Ci0gIHR5cGVkZWYgdGltZV9iYXNlOjpkYXRlb3JkZXIgZGF0ZW9yZGVyOwotICB0eXBlZGVmIF9PdXRJdCBpdGVyX3R5cGU7Ci0gIHR5cGVkZWYgX0NoICAgY2hhcl90eXBlOwotCi0gIGV4cGxpY2l0IHRpbWVfcHV0X2J5bmFtZShjb25zdCBjaGFyICogX19uYW1lLCBzaXplX3QgX19yZWZzID0gMCwgX0xvY2FsZV9uYW1lX2hpbnQqIF9faGludCA9IDApCi0gICAgOiB0aW1lX3B1dDxfQ2gsIF9PdXRJdD4oKF9Mb2NhbGVfdGltZSopIDAsIF9fcmVmcyksCi0gICAgX01fdGltZShfU1RMUF9QUklWIF9fYWNxdWlyZV90aW1lKF9fbmFtZSwgX19oaW50KSkKLSAgeyBfU1RMUF9QUklWIF9Jbml0X3RpbWVpbmZvKHRoaXMtPl9NX3RpbWVpbmZvLCB0aGlzLT5fTV90aW1lKTsgfQotCi1wcm90ZWN0ZWQ6Ci0gIH50aW1lX3B1dF9ieW5hbWUoKSB7IF9TVExQX1BSSVYgX19yZWxlYXNlX3RpbWUoX01fdGltZSk7IH0KLQotcHJpdmF0ZToKLSAgX0xvY2FsZV90aW1lKiBfTV90aW1lOwotCi0gIHR5cGVkZWYgdGltZV9wdXRfYnluYW1lPF9DaCwgX091dEl0PiBfU2VsZjsKLSAgLy9leHBsaWNpdGVseSBkZWZpbmVkIGFzIHByaXZhdGUgdG8gYXZvaWQgd2FybmluZ3M6Ci0gIHRpbWVfcHV0X2J5bmFtZShfU2VsZiBjb25zdCYpOwotICBfU2VsZiYgb3BlcmF0b3IgPSAoX1NlbGYgY29uc3QmKTsKLX07Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUKQotX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIHRpbWVfZ2V0PGNoYXIsIGlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiA+OwotX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIHRpbWVfcHV0PGNoYXIsIG9zdHJlYW1idWZfaXRlcmF0b3I8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiA+OwotLy8gX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIHRpbWVfZ2V0PGNoYXIsIGNvbnN0IGNoYXIqPjsKLS8vIF9TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyB0aW1lX3B1dDxjaGFyLCBjaGFyKj47Ci0jICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkKLV9TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyB0aW1lX2dldDx3Y2hhcl90LCBpc3RyZWFtYnVmX2l0ZXJhdG9yPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4gPjsKLV9TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyB0aW1lX3B1dDx3Y2hhcl90LCBvc3RyZWFtYnVmX2l0ZXJhdG9yPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4gPjsKLS8vIF9TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyB0aW1lX2dldDx3Y2hhcl90LCBjb25zdCB3Y2hhcl90Kj47Ci0vLyBfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgdGltZV9wdXQ8d2NoYXJfdCwgd2NoYXJfdCo+OwotIyAgZW5kaWYKLQotI2VuZGlmCi0KLV9TVExQX0VORF9OQU1FU1BBQ0UKLQotI2lmIGRlZmluZWQgKF9TVExQX0VYUE9TRV9TVFJFQU1fSU1QTEVNRU5UQVRJT04pICYmICFkZWZpbmVkIChfU1RMUF9MSU5LX1RJTUVfSU5TVEFOVElBVElPTikKLSMgIGluY2x1ZGUgPHN0bC9fdGltZV9mYWNldHMuYz4KLSNlbmRpZgotCi0jZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfVElNRV9GQUNFVFNfSCAqLwotCi0vLyBMb2NhbCBWYXJpYWJsZXM6Ci0vLyBtb2RlOkMrKwotLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RsL190cmVlLmggYi9zdGwvX3RyZWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRjNzk5ZC4uMDAwMDAwMAotLS0gYS9zdGwvX3RyZWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDY3OSArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NAotICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NwotICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk3Ci0gKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5Ci0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLQotLyogTk9URTogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgU1RMIGhlYWRlcnMuCi0gKiAgIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LgotICovCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfVFJFRV9ICi0jZGVmaW5lIF9TVExQX0lOVEVSTkFMX1RSRUVfSAotCi0vKgotCi1SZWQtYmxhY2sgdHJlZSBjbGFzcywgZGVzaWduZWQgZm9yIHVzZSBpbiBpbXBsZW1lbnRpbmcgU1RMCi1hc3NvY2lhdGl2ZSBjb250YWluZXJzIChzZXQsIG11bHRpc2V0LCBtYXAsIGFuZCBtdWx0aW1hcCkuIFRoZQotaW5zZXJ0aW9uIGFuZCBkZWxldGlvbiBhbGdvcml0aG1zIGFyZSBiYXNlZCBvbiB0aG9zZSBpbiBDb3JtZW4sCi1MZWlzZXJzb24sIGFuZCBSaXZlc3QsIEludHJvZHVjdGlvbiB0byBBbGdvcml0aG1zIChNSVQgUHJlc3MsIDE5OTApLAotZXhjZXB0IHRoYXQKLQotKDEpIHRoZSBoZWFkZXIgY2VsbCBpcyBtYWludGFpbmVkIHdpdGggbGlua3Mgbm90IG9ubHkgdG8gdGhlIHJvb3QKLWJ1dCBhbHNvIHRvIHRoZSBsZWZ0bW9zdCBub2RlIG9mIHRoZSB0cmVlLCB0byBlbmFibGUgY29uc3RhbnQgdGltZQotYmVnaW4oKSwgYW5kIHRvIHRoZSByaWdodG1vc3Qgbm9kZSBvZiB0aGUgdHJlZSwgdG8gZW5hYmxlIGxpbmVhciB0aW1lCi1wZXJmb3JtYW5jZSB3aGVuIHVzZWQgd2l0aCB0aGUgZ2VuZXJpYyBzZXQgYWxnb3JpdGhtcyAoc2V0X3VuaW9uLAotZXRjLik7Ci0KLSgyKSB3aGVuIGEgbm9kZSBiZWluZyBkZWxldGVkIGhhcyB0d28gY2hpbGRyZW4gaXRzIHN1Y2Nlc3NvciBub2RlIGlzCi1yZWxpbmtlZCBpbnRvIGl0cyBwbGFjZSwgcmF0aGVyIHRoYW4gY29waWVkLCBzbyB0aGF0IHRoZSBvbmx5Ci1pdGVyYXRvcnMgaW52YWxpZGF0ZWQgYXJlIHRob3NlIHJlZmVycmluZyB0byB0aGUgZGVsZXRlZCBub2RlLgotCi0qLwotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0FMR09CQVNFX0gKLSMgIGluY2x1ZGUgPHN0bC9fYWxnb2Jhc2UuaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0FMTE9DX0gKLSMgIGluY2x1ZGUgPHN0bC9fYWxsb2MuaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0lURVJBVE9SX0gKLSMgIGluY2x1ZGUgPHN0bC9faXRlcmF0b3IuaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NPTlNUUlVDVF9ICi0jICBpbmNsdWRlIDxzdGwvX2NvbnN0cnVjdC5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfRlVOQ1RJT05fQkFTRV9ICi0jICBpbmNsdWRlIDxzdGwvX2Z1bmN0aW9uX2Jhc2UuaD4KLSNlbmRpZgotCi1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLQotX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQotCi10eXBlZGVmIGJvb2wgX1JiX3RyZWVfQ29sb3JfdHlwZTsKLS8vY29uc3QgX1JiX3RyZWVfQ29sb3JfdHlwZSBfU19yYl90cmVlX3JlZCA9IGZhbHNlOwotLy9jb25zdCBfUmJfdHJlZV9Db2xvcl90eXBlIF9TX3JiX3RyZWVfYmxhY2sgPSB0cnVlOwotCi0jZGVmaW5lIF9TX3JiX3RyZWVfcmVkIGZhbHNlCi0jZGVmaW5lIF9TX3JiX3RyZWVfYmxhY2sgdHJ1ZQotCi1zdHJ1Y3QgX1JiX3RyZWVfbm9kZV9iYXNlIHsKLSAgdHlwZWRlZiBfUmJfdHJlZV9Db2xvcl90eXBlIF9Db2xvcl90eXBlOwotICB0eXBlZGVmIF9SYl90cmVlX25vZGVfYmFzZSogX0Jhc2VfcHRyOwotCi0gIF9Db2xvcl90eXBlIF9NX2NvbG9yOwotICBfQmFzZV9wdHIgX01fcGFyZW50OwotICBfQmFzZV9wdHIgX01fbGVmdDsKLSAgX0Jhc2VfcHRyIF9NX3JpZ2h0OwotCi0gIHN0YXRpYyBfQmFzZV9wdHIgX1NUTFBfQ0FMTCBfU19taW5pbXVtKF9CYXNlX3B0ciBfX3gpIHsKLSAgICB3aGlsZSAoX194LT5fTV9sZWZ0ICE9IDApIF9feCA9IF9feC0+X01fbGVmdDsKLSAgICByZXR1cm4gX194OwotICB9Ci0KLSAgc3RhdGljIF9CYXNlX3B0ciBfU1RMUF9DQUxMIF9TX21heGltdW0oX0Jhc2VfcHRyIF9feCkgewotICAgIHdoaWxlIChfX3gtPl9NX3JpZ2h0ICE9IDApIF9feCA9IF9feC0+X01fcmlnaHQ7Ci0gICAgcmV0dXJuIF9feDsKLSAgfQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIF9WYWx1ZT4KLXN0cnVjdCBfUmJfdHJlZV9ub2RlIDogcHVibGljIF9SYl90cmVlX25vZGVfYmFzZSB7Ci0gIF9WYWx1ZSBfTV92YWx1ZV9maWVsZDsKLSAgX19UUklWSUFMX1NUVUZGKF9SYl90cmVlX25vZGUpCi19OwotCi1zdHJ1Y3QgX1JiX3RyZWVfYmFzZV9pdGVyYXRvcjsKLQotdGVtcGxhdGUgPGNsYXNzIF9EdW1teT4KLWNsYXNzIF9SYl9nbG9iYWwgewotcHVibGljOgotICB0eXBlZGVmIF9SYl90cmVlX25vZGVfYmFzZSogX0Jhc2VfcHRyOwotICAvLyB0aG9zZSB1c2VkIHRvIGJlIGdsb2JhbCBmdW5jdGlvbnMKLSAgc3RhdGljIHZvaWQgX1NUTFBfQ0FMTCBfUmViYWxhbmNlKF9CYXNlX3B0ciBfX3gsIF9CYXNlX3B0ciYgX19yb290KTsKLSAgc3RhdGljIF9CYXNlX3B0ciBfU1RMUF9DQUxMIF9SZWJhbGFuY2VfZm9yX2VyYXNlKF9CYXNlX3B0ciBfX3osCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmFzZV9wdHImIF9fcm9vdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CYXNlX3B0ciYgX19sZWZ0bW9zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CYXNlX3B0ciYgX19yaWdodG1vc3QpOwotICAvLyB0aG9zZSBhcmUgZnJvbSBfUmJfdHJlZV9iYXNlX2l0ZXJhdG9yIC0gbW92ZWQgaGVyZSB0byByZWR1Y2UgY29kZSBibG9hdAotICAvLyBtb3ZlZCBoZXJlIHRvIHJlZHVjZSBjb2RlIGJsb2F0IHdpdGhvdXQgdGVtcGxhdGl6aW5nIF9SYl90cmVlX2Jhc2VfaXRlcmF0b3IKLSAgc3RhdGljIF9CYXNlX3B0ciAgX1NUTFBfQ0FMTCBfTV9pbmNyZW1lbnQgKF9CYXNlX3B0cik7Ci0gIHN0YXRpYyBfQmFzZV9wdHIgIF9TVExQX0NBTEwgX01fZGVjcmVtZW50IChfQmFzZV9wdHIpOwotICBzdGF0aWMgdm9pZCAgICAgICBfU1RMUF9DQUxMIF9Sb3RhdGVfbGVmdCAoX0Jhc2VfcHRyIF9feCwgX0Jhc2VfcHRyJiBfX3Jvb3QpOwotICBzdGF0aWMgdm9pZCAgICAgICBfU1RMUF9DQUxMIF9Sb3RhdGVfcmlnaHQoX0Jhc2VfcHRyIF9feCwgX0Jhc2VfcHRyJiBfX3Jvb3QpOwotfTsKLQotIyBpZiBkZWZpbmVkIChfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUKQotX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIF9SYl9nbG9iYWw8Ym9vbD47Ci0jIGVuZGlmCi0KLXR5cGVkZWYgX1JiX2dsb2JhbDxib29sPiBfUmJfZ2xvYmFsX2luc3Q7Ci0KLXN0cnVjdCBfUmJfdHJlZV9iYXNlX2l0ZXJhdG9yIHsKLSAgdHlwZWRlZiBfUmJfdHJlZV9ub2RlX2Jhc2UqICAgICAgICBfQmFzZV9wdHI7Ci0gIHR5cGVkZWYgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7Ci0gIHR5cGVkZWYgcHRyZGlmZl90ICAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOwotICBfQmFzZV9wdHIgX01fbm9kZTsKLSAgX1JiX3RyZWVfYmFzZV9pdGVyYXRvcigpIDogX01fbm9kZSgwKSB7fQotICBfUmJfdHJlZV9iYXNlX2l0ZXJhdG9yKF9CYXNlX3B0ciBfX3gpIDogX01fbm9kZShfX3gpIHt9Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfVHJhaXRzPgotc3RydWN0IF9SYl90cmVlX2l0ZXJhdG9yIDogcHVibGljIF9SYl90cmVlX2Jhc2VfaXRlcmF0b3IgewotICB0eXBlZGVmIF9WYWx1ZSB2YWx1ZV90eXBlOwotICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OnJlZmVyZW5jZSAgcmVmZXJlbmNlOwotICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OnBvaW50ZXIgICAgcG9pbnRlcjsKLSAgdHlwZWRlZiBfUmJfdHJlZV9pdGVyYXRvcjxfVmFsdWUsIF9UcmFpdHM+IF9TZWxmOwotICB0eXBlZGVmIF9SYl90cmVlX25vZGVfYmFzZSogICAgX0Jhc2VfcHRyOwotICB0eXBlZGVmIF9SYl90cmVlX25vZGU8X1ZhbHVlPiogX0xpbmtfdHlwZTsKLQotICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6Ol9Ob25Db25zdFRyYWl0cyBfTm9uQ29uc3RUcmFpdHM7Ci0gIHR5cGVkZWYgX1JiX3RyZWVfaXRlcmF0b3I8X1ZhbHVlLCBfTm9uQ29uc3RUcmFpdHM+IGl0ZXJhdG9yOwotICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6Ol9Db25zdFRyYWl0cyBfQ29uc3RUcmFpdHM7Ci0gIHR5cGVkZWYgX1JiX3RyZWVfaXRlcmF0b3I8X1ZhbHVlLCBfQ29uc3RUcmFpdHM+IGNvbnN0X2l0ZXJhdG9yOwotCi0gIF9SYl90cmVlX2l0ZXJhdG9yKCkge30KLSNpZiAhZGVmaW5lZCAoX1NUTFBfREVCVUcpCi0gIC8qIEluIFNUTCBkZWJ1ZyBtb2RlIHdlIG5lZWQgdGhpcyBjb25zdHJ1Y3RvciBpbXBsaWNpdCBmb3IgdGhlIHBvaW50ZXIKLSAgICogc3BlY2lhbGl6YXRpb24gaW1wbGVtZW50YXRpb24uCi0gICAqLwotICBleHBsaWNpdAotI2VuZGlmCi0gIF9SYl90cmVlX2l0ZXJhdG9yKF9CYXNlX3B0ciBfX3gpIDogX1JiX3RyZWVfYmFzZV9pdGVyYXRvcihfX3gpIHt9Ci0gIC8vY29weSBjb25zdHJ1Y3RvciBmb3IgaXRlcmF0b3IgYW5kIGNvbnN0cnVjdG9yIGZyb20gaXRlcmF0b3IgZm9yIGNvbnN0X2l0ZXJhdG9yCi0gIF9SYl90cmVlX2l0ZXJhdG9yKGNvbnN0IGl0ZXJhdG9yJiBfX2l0KSA6IF9SYl90cmVlX2Jhc2VfaXRlcmF0b3IoX19pdC5fTV9ub2RlKSB7fQotCi0gIHJlZmVyZW5jZSBvcGVyYXRvciooKSBjb25zdCB7Ci0gICAgcmV0dXJuIF9fU1RBVElDX0NBU1QoX0xpbmtfdHlwZSwgX01fbm9kZSktPl9NX3ZhbHVlX2ZpZWxkOwotICB9Ci0KLSAgX1NUTFBfREVGSU5FX0FSUk9XX09QRVJBVE9SCi0KLSAgX1NlbGYmIG9wZXJhdG9yKysoKSB7Ci0gICAgX01fbm9kZSA9IF9SYl9nbG9iYWxfaW5zdDo6X01faW5jcmVtZW50KF9NX25vZGUpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotICBfU2VsZiBvcGVyYXRvcisrKGludCkgewotICAgIF9TZWxmIF9fdG1wID0gKnRoaXM7Ci0gICAgKysoKnRoaXMpOwotICAgIHJldHVybiBfX3RtcDsKLSAgfQotCi0gIF9TZWxmJiBvcGVyYXRvci0tKCkgewotICAgIF9NX25vZGUgPSBfUmJfZ2xvYmFsX2luc3Q6Ol9NX2RlY3JlbWVudChfTV9ub2RlKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgX1NlbGYgb3BlcmF0b3ItLShpbnQpIHsKLSAgICBfU2VsZiBfX3RtcCA9ICp0aGlzOwotICAgIC0tKCp0aGlzKTsKLSAgICByZXR1cm4gX190bXA7Ci0gIH0KLQotICBib29sIG9wZXJhdG9yID09IChjb25zdF9pdGVyYXRvciBfX3JocykgY29uc3QgewotICAgIHJldHVybiBfTV9ub2RlID09IF9fcmhzLl9NX25vZGU7Ci0gIH0KLSAgYm9vbCBvcGVyYXRvciAhPSAoY29uc3RfaXRlcmF0b3IgX19yaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gX01fbm9kZSAhPSBfX3Jocy5fTV9ub2RlOwotICB9Ci19OwotCi0jaWYgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikKLV9TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQotdGVtcGxhdGUgPGNsYXNzIF9WYWx1ZSwgY2xhc3MgX1RyYWl0cz4KLXN0cnVjdCBfX3R5cGVfdHJhaXRzPF9TVExQX1BSSVYgX1JiX3RyZWVfaXRlcmF0b3I8X1ZhbHVlLCBfVHJhaXRzPiA+IHsKLSAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgICBoYXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yOwotICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2NvcHlfY29uc3RydWN0b3I7Ci0gIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfYXNzaWdubWVudF9vcGVyYXRvcjsKLSAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9kZXN0cnVjdG9yOwotICB0eXBlZGVmIF9fZmFsc2VfdHlwZSAgIGlzX1BPRF90eXBlOwotfTsKLV9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKLSNlbmRpZiAvKiBfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OICovCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfT0xEX0hQX0lURVJBVE9SX1FVRVJJRVMpCi1fU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKLXRlbXBsYXRlIDxjbGFzcyBfVmFsdWUsIGNsYXNzIF9UcmFpdHM+Ci1pbmxpbmUgX1ZhbHVlKiB2YWx1ZV90eXBlKGNvbnN0IF9TVExQX1BSSVYgX1JiX3RyZWVfaXRlcmF0b3I8X1ZhbHVlLCBfVHJhaXRzPiYpCi17IHJldHVybiAoX1ZhbHVlKikwOyB9Ci1pbmxpbmUgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnkoY29uc3QgX1NUTFBfUFJJViBfUmJfdHJlZV9iYXNlX2l0ZXJhdG9yJikKLXsgcmV0dXJuIGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnKCk7IH0KLWlubGluZSBwdHJkaWZmX3QqIGRpc3RhbmNlX3R5cGUoY29uc3QgX1NUTFBfUFJJViBfUmJfdHJlZV9iYXNlX2l0ZXJhdG9yJikKLXsgcmV0dXJuIChwdHJkaWZmX3QqKSAwOyB9Ci1fU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCi0jZW5kaWYgLyogX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTiAqLwotCi0vLyBCYXNlIGNsYXNzIHRvIGhlbHAgRUgKLQotdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgotY2xhc3MgX1JiX3RyZWVfYmFzZSB7Ci1wdWJsaWM6Ci0gIHR5cGVkZWYgX1JiX3RyZWVfbm9kZV9iYXNlIF9Ob2RlX2Jhc2U7Ci0gIHR5cGVkZWYgX1JiX3RyZWVfbm9kZTxfVHA+IF9Ob2RlOwotICBfU1RMUF9GT1JDRV9BTExPQ0FUT1JTKF9UcCwgX0FsbG9jKQotICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY190cmFpdHM8X1RwLCBfQWxsb2M+OjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKLXByaXZhdGU6Ci0gIHR5cGVkZWYgX1JiX3RyZWVfYmFzZTxfVHAsIF9BbGxvYz4gX1NlbGY7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jX3RyYWl0czxfTm9kZSwgX0FsbG9jPjo6YWxsb2NhdG9yX3R5cGUgX01fbm9kZV9hbGxvY2F0b3JfdHlwZTsKLSAgdHlwZWRlZiBfU1RMUF9hbGxvY19wcm94eTxfTm9kZV9iYXNlLCBfTm9kZSwgX01fbm9kZV9hbGxvY2F0b3JfdHlwZT4gX0FsbG9jUHJveHk7Ci0KLXB1YmxpYzoKLSAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IHsKLSAgICByZXR1cm4gX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoX01faGVhZGVyLCBfVHApOwotICB9Ci0KLXByb3RlY3RlZDoKLSAgX1JiX3RyZWVfYmFzZShjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKSA6Ci0gICAgX01faGVhZGVyKF9TVExQX0NPTlZFUlRfQUxMT0NBVE9SKF9fYSwgX05vZGUpLCBfTm9kZV9iYXNlKCkgKSB7Ci0gICAgX01fZW1wdHlfaW5pdGlhbGl6ZSgpOwotICB9Ci0gIF9SYl90cmVlX2Jhc2UoX19tb3ZlX3NvdXJjZTxfU2VsZj4gc3JjKSA6Ci0gICAgX01faGVhZGVyKF9fbW92ZV9zb3VyY2U8X0FsbG9jUHJveHk+KHNyYy5nZXQoKS5fTV9oZWFkZXIpKSB7Ci0gICAgX01fcmViaW5kKCZzcmMuZ2V0KCkuX01faGVhZGVyLl9NX2RhdGEpOwotICAgIHNyYy5nZXQoKS5fTV9lbXB0eV9pbml0aWFsaXplKCk7Ci0gIH0KLSAgdm9pZCBfTV9lbXB0eV9pbml0aWFsaXplKCkgewotICAgIF9NX2hlYWRlci5fTV9kYXRhLl9NX2NvbG9yID0gX1NfcmJfdHJlZV9yZWQ7IC8vIHVzZWQgdG8gZGlzdGluZ3Vpc2ggaGVhZGVyIGZyb20KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBfX3Jvb3QsIGluIGl0ZXJhdG9yLm9wZXJhdG9yKysKLSAgICBfTV9oZWFkZXIuX01fZGF0YS5fTV9wYXJlbnQgPSAwOwotICAgIF9NX2hlYWRlci5fTV9kYXRhLl9NX2xlZnQgPSAmX01faGVhZGVyLl9NX2RhdGE7Ci0gICAgX01faGVhZGVyLl9NX2RhdGEuX01fcmlnaHQgPSAmX01faGVhZGVyLl9NX2RhdGE7Ci0gIH0KLQotICB2b2lkIF9NX3JlYmluZChfTm9kZV9iYXNlICpfX3N0YXRpY19ub2RlKSB7Ci0gICAgaWYgKF9NX2hlYWRlci5fTV9kYXRhLl9NX3BhcmVudCAhPSAwKSB7Ci0gICAgICBfTV9oZWFkZXIuX01fZGF0YS5fTV9wYXJlbnQtPl9NX3BhcmVudCA9ICZfTV9oZWFkZXIuX01fZGF0YTsKLSAgICB9Ci0gICAgaWYgKF9NX2hlYWRlci5fTV9kYXRhLl9NX3JpZ2h0ID09IF9fc3RhdGljX25vZGUpIHsKLSAgICAgIF9NX2hlYWRlci5fTV9kYXRhLl9NX3JpZ2h0ID0gJl9NX2hlYWRlci5fTV9kYXRhOwotICAgIH0KLSAgICBpZiAoX01faGVhZGVyLl9NX2RhdGEuX01fbGVmdCA9PSBfX3N0YXRpY19ub2RlKSB7Ci0gICAgICBfTV9oZWFkZXIuX01fZGF0YS5fTV9sZWZ0ID0gJl9NX2hlYWRlci5fTV9kYXRhOwotICAgIH0KLSAgfQotCi0gIF9BbGxvY1Byb3h5IF9NX2hlYWRlcjsKLX07Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9ERUJVRykKLSMgIGRlZmluZSBfUmJfdHJlZSBfU1RMUF9OT05fREJHX05BTUUoUmJfdHJlZSkKLSNlbmRpZgotCi10ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX0NvbXBhcmUsCi0gICAgICAgICAgY2xhc3MgX1ZhbHVlLCBjbGFzcyBfS2V5T2ZWYWx1ZSwgY2xhc3MgX1RyYWl0cywKLSAgICAgICAgICBfU1RMUF9ERUZBVUxUX0FMTE9DQVRPUl9TRUxFQ1QoX1ZhbHVlKSA+Ci1jbGFzcyBfUmJfdHJlZSA6IHB1YmxpYyBfUmJfdHJlZV9iYXNlPF9WYWx1ZSwgX0FsbG9jPiB7Ci0gIHR5cGVkZWYgX1JiX3RyZWVfYmFzZTxfVmFsdWUsIF9BbGxvYz4gX0Jhc2U7Ci0gIHR5cGVkZWYgX1JiX3RyZWU8X0tleSwgX0NvbXBhcmUsIF9WYWx1ZSwgX0tleU9mVmFsdWUsIF9UcmFpdHMsIF9BbGxvYz4gX1NlbGY7Ci1wcm90ZWN0ZWQ6Ci0gIHR5cGVkZWYgX1JiX3RyZWVfbm9kZV9iYXNlICogX0Jhc2VfcHRyOwotICB0eXBlZGVmIF9SYl90cmVlX25vZGU8X1ZhbHVlPiBfTm9kZTsKLSAgdHlwZWRlZiBfTm9kZSogX0xpbmtfdHlwZTsKLSAgdHlwZWRlZiBfUmJfdHJlZV9Db2xvcl90eXBlIF9Db2xvcl90eXBlOwotcHVibGljOgotICB0eXBlZGVmIF9LZXkga2V5X3R5cGU7Ci0gIHR5cGVkZWYgX1ZhbHVlIHZhbHVlX3R5cGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6cG9pbnRlciBwb2ludGVyOwotICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUqIGNvbnN0X3BvaW50ZXI7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6cmVmZXJlbmNlIHJlZmVyZW5jZTsKLSAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlJiBjb25zdF9yZWZlcmVuY2U7Ci0gIHR5cGVkZWYgc2l6ZV90IHNpemVfdHlwZTsKLSAgdHlwZWRlZiBwdHJkaWZmX3QgZGlmZmVyZW5jZV90eXBlOwotICB0eXBlZGVmIGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnIF9JdGVyYXRvcl9jYXRlZ29yeTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7Ci0KLXByb3RlY3RlZDoKLQotICBfU1RMUF9LRVlfVFlQRV9GT1JfQ09OVF9FWFQoa2V5X3R5cGUpCi0gIF9CYXNlX3B0ciBfTV9jcmVhdGVfbm9kZShjb25zdCB2YWx1ZV90eXBlJiBfX3gpIHsKLSAgICBfTGlua190eXBlIF9fdG1wID0gdGhpcy0+X01faGVhZGVyLmFsbG9jYXRlKDEpOwotICAgIF9TVExQX1RSWSB7Ci0gICAgICBfQ29weV9Db25zdHJ1Y3QoJl9fdG1wLT5fTV92YWx1ZV9maWVsZCwgX194KTsKLSAgICB9Ci0gICAgX1NUTFBfVU5XSU5EKHRoaXMtPl9NX2hlYWRlci5kZWFsbG9jYXRlKF9fdG1wLDEpKQotICAgIF9TX2xlZnQoX190bXApID0gMDsKLSAgICBfU19yaWdodChfX3RtcCkgPSAwOwotICAgIHJldHVybiBfX3RtcDsKLSAgfQotCi0gIF9CYXNlX3B0ciBfTV9jbG9uZV9ub2RlKF9CYXNlX3B0ciBfX3gpIHsKLSAgICBfQmFzZV9wdHIgX190bXAgPSBfTV9jcmVhdGVfbm9kZShfU192YWx1ZShfX3gpKTsKLSAgICBfU19jb2xvcihfX3RtcCkgPSBfU19jb2xvcihfX3gpOwotICAgIHJldHVybiBfX3RtcDsKLSAgfQotCi0gIHNpemVfdHlwZSBfTV9ub2RlX2NvdW50OyAvLyBrZWVwcyB0cmFjayBvZiBzaXplIG9mIHRyZWUKLSAgX0NvbXBhcmUgX01fa2V5X2NvbXBhcmU7Ci0KLSAgX0Jhc2VfcHRyIF9NX3Jvb3QoKSBjb25zdAotICB7IHJldHVybiB0aGlzLT5fTV9oZWFkZXIuX01fZGF0YS5fTV9wYXJlbnQ7IH0KLSAgX0Jhc2VfcHRyIF9NX2xlZnRtb3N0KCkgY29uc3QKLSAgeyByZXR1cm4gdGhpcy0+X01faGVhZGVyLl9NX2RhdGEuX01fbGVmdDsgfQotICBfQmFzZV9wdHIgX01fcmlnaHRtb3N0KCkgY29uc3QKLSAgeyByZXR1cm4gdGhpcy0+X01faGVhZGVyLl9NX2RhdGEuX01fcmlnaHQ7IH0KLQotICBfQmFzZV9wdHImIF9NX3Jvb3QoKQotICB7IHJldHVybiB0aGlzLT5fTV9oZWFkZXIuX01fZGF0YS5fTV9wYXJlbnQ7IH0KLSAgX0Jhc2VfcHRyJiBfTV9sZWZ0bW9zdCgpCi0gIHsgcmV0dXJuIHRoaXMtPl9NX2hlYWRlci5fTV9kYXRhLl9NX2xlZnQ7IH0KLSAgX0Jhc2VfcHRyJiBfTV9yaWdodG1vc3QoKQotICB7IHJldHVybiB0aGlzLT5fTV9oZWFkZXIuX01fZGF0YS5fTV9yaWdodDsgfQotCi0gIHN0YXRpYyBfQmFzZV9wdHImIF9TVExQX0NBTEwgX1NfbGVmdChfQmFzZV9wdHIgX194KQotICB7IHJldHVybiBfX3gtPl9NX2xlZnQ7IH0KLSAgc3RhdGljIF9CYXNlX3B0ciYgX1NUTFBfQ0FMTCBfU19yaWdodChfQmFzZV9wdHIgX194KQotICB7IHJldHVybiBfX3gtPl9NX3JpZ2h0OyB9Ci0gIHN0YXRpYyBfQmFzZV9wdHImIF9TVExQX0NBTEwgX1NfcGFyZW50KF9CYXNlX3B0ciBfX3gpCi0gIHsgcmV0dXJuIF9feC0+X01fcGFyZW50OyB9Ci0gIHN0YXRpYyB2YWx1ZV90eXBlJiBfU1RMUF9DQUxMIF9TX3ZhbHVlKF9CYXNlX3B0ciBfX3gpCi0gIHsgcmV0dXJuIF9fU1RBVElDX0NBU1QoX0xpbmtfdHlwZSwgX194KS0+X01fdmFsdWVfZmllbGQ7IH0KLSAgc3RhdGljIGNvbnN0IF9LZXkmIF9TVExQX0NBTEwgX1Nfa2V5KF9CYXNlX3B0ciBfX3gpCi0gIHsgcmV0dXJuIF9LZXlPZlZhbHVlKCkoX1NfdmFsdWUoX194KSk7fQotICBzdGF0aWMgX0NvbG9yX3R5cGUmIF9TVExQX0NBTEwgX1NfY29sb3IoX0Jhc2VfcHRyIF9feCkKLSAgeyByZXR1cm4gKF9Db2xvcl90eXBlJikoX194LT5fTV9jb2xvcik7IH0KLQotICBzdGF0aWMgX0Jhc2VfcHRyIF9TVExQX0NBTEwgX1NfbWluaW11bShfQmFzZV9wdHIgX194KQotICB7IHJldHVybiBfUmJfdHJlZV9ub2RlX2Jhc2U6Ol9TX21pbmltdW0oX194KTsgfQotCi0gIHN0YXRpYyBfQmFzZV9wdHIgX1NUTFBfQ0FMTCBfU19tYXhpbXVtKF9CYXNlX3B0ciBfX3gpCi0gIHsgcmV0dXJuIF9SYl90cmVlX25vZGVfYmFzZTo6X1NfbWF4aW11bShfX3gpOyB9Ci0KLXB1YmxpYzoKLSAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpfTm9uQ29uc3RUcmFpdHMgX05vbkNvbnN0VHJhaXRzOwotICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6Ol9Db25zdFRyYWl0cyBfQ29uc3RUcmFpdHM7Ci0gIHR5cGVkZWYgX1JiX3RyZWVfaXRlcmF0b3I8dmFsdWVfdHlwZSwgX05vbkNvbnN0VHJhaXRzPiBpdGVyYXRvcjsKLSAgdHlwZWRlZiBfUmJfdHJlZV9pdGVyYXRvcjx2YWx1ZV90eXBlLCBfQ29uc3RUcmFpdHM+IGNvbnN0X2l0ZXJhdG9yOwotICBfU1RMUF9ERUNMQVJFX0JJRElSRUNUSU9OQUxfUkVWRVJTRV9JVEVSQVRPUlM7Ci0KLXByaXZhdGU6Ci0gIGl0ZXJhdG9yIF9NX2luc2VydChfQmFzZV9wdHIgX19wYXJlbnQsIGNvbnN0IHZhbHVlX3R5cGUmIF9fdmFsLCBfQmFzZV9wdHIgX19vbl9sZWZ0ID0gMCwgX0Jhc2VfcHRyIF9fb25fcmlnaHQgPSAwKTsKLSAgX0Jhc2VfcHRyIF9NX2NvcHkoX0Jhc2VfcHRyIF9feCwgX0Jhc2VfcHRyIF9fcCk7Ci0gIHZvaWQgX01fZXJhc2UoX0Jhc2VfcHRyIF9feCk7Ci0KLXB1YmxpYzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGlvbi9kZWFsbG9jYXRpb24KLSAgX1JiX3RyZWUoKQotICAgIDogX1JiX3RyZWVfYmFzZTxfVmFsdWUsIF9BbGxvYz4oYWxsb2NhdG9yX3R5cGUoKSksIF9NX25vZGVfY291bnQoMCksIF9NX2tleV9jb21wYXJlKF9Db21wYXJlKCkpCi0gICAge30KLQotICBfUmJfdHJlZShjb25zdCBfQ29tcGFyZSYgX19jb21wKQotICAgIDogX1JiX3RyZWVfYmFzZTxfVmFsdWUsIF9BbGxvYz4oYWxsb2NhdG9yX3R5cGUoKSksIF9NX25vZGVfY291bnQoMCksIF9NX2tleV9jb21wYXJlKF9fY29tcCkKLSAgICB7fQotCi0gIF9SYl90cmVlKGNvbnN0IF9Db21wYXJlJiBfX2NvbXAsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCi0gICAgOiBfUmJfdHJlZV9iYXNlPF9WYWx1ZSwgX0FsbG9jPihfX2EpLCBfTV9ub2RlX2NvdW50KDApLCBfTV9rZXlfY29tcGFyZShfX2NvbXApCi0gICAge30KLQotICBfUmJfdHJlZShjb25zdCBfU2VsZiYgX194KQotICAgIDogX1JiX3RyZWVfYmFzZTxfVmFsdWUsIF9BbGxvYz4oX194LmdldF9hbGxvY2F0b3IoKSksCi0gICAgICBfTV9ub2RlX2NvdW50KDApLCBfTV9rZXlfY29tcGFyZShfX3guX01fa2V5X2NvbXBhcmUpIHsKLSAgICBpZiAoX194Ll9NX3Jvb3QoKSAhPSAwKSB7Ci0gICAgICBfU19jb2xvcigmdGhpcy0+X01faGVhZGVyLl9NX2RhdGEpID0gX1NfcmJfdHJlZV9yZWQ7Ci0gICAgICBfTV9yb290KCkgPSBfTV9jb3B5KF9feC5fTV9yb290KCksICZ0aGlzLT5fTV9oZWFkZXIuX01fZGF0YSk7Ci0gICAgICBfTV9sZWZ0bW9zdCgpID0gX1NfbWluaW11bShfTV9yb290KCkpOwotICAgICAgX01fcmlnaHRtb3N0KCkgPSBfU19tYXhpbXVtKF9NX3Jvb3QoKSk7Ci0gICAgfQotICAgIF9NX25vZGVfY291bnQgPSBfX3guX01fbm9kZV9jb3VudDsKLSAgfQotCi0gIF9SYl90cmVlKF9fbW92ZV9zb3VyY2U8X1NlbGY+IHNyYykKLSAgICA6IF9SYl90cmVlX2Jhc2U8X1ZhbHVlLCBfQWxsb2M+KF9fbW92ZV9zb3VyY2U8X0Jhc2U+KHNyYy5nZXQoKSkpLAotICAgICAgX01fbm9kZV9jb3VudChzcmMuZ2V0KCkuX01fbm9kZV9jb3VudCksCi0gICAgICBfTV9rZXlfY29tcGFyZShfQXNNb3ZlU291cmNlKHNyYy5nZXQoKS5fTV9rZXlfY29tcGFyZSkpIHsKLSAgICBzcmMuZ2V0KCkuX01fbm9kZV9jb3VudCA9IDA7Ci0gIH0KLQotICB+X1JiX3RyZWUoKSB7IGNsZWFyKCk7IH0KLSAgX1NlbGYmIG9wZXJhdG9yPShjb25zdCBfU2VsZiYgX194KTsKLQotcHVibGljOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhY2Nlc3NvcnM6Ci0gIF9Db21wYXJlIGtleV9jb21wKCkgY29uc3QgeyByZXR1cm4gX01fa2V5X2NvbXBhcmU7IH0KLQotICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIGl0ZXJhdG9yKF9NX2xlZnRtb3N0KCkpOyB9Ci0gIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX01fbGVmdG1vc3QoKSk7IH0KLSAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gaXRlcmF0b3IoJnRoaXMtPl9NX2hlYWRlci5fTV9kYXRhKTsgfQotICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfX0NPTlNUX0NBU1QoX0Jhc2VfcHRyLCAmdGhpcy0+X01faGVhZGVyLl9NX2RhdGEpKTsgfQotCi0gIHJldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KLSAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBjb25zdAotICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQotICByZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9Ci0gIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0Ci0gIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KLSAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIF9NX25vZGVfY291bnQgPT0gMDsgfQotICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX25vZGVfY291bnQ7IH0KLSAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgeyByZXR1cm4gc2l6ZV90eXBlKC0xKTsgfQotCi0gIHZvaWQgc3dhcChfU2VsZiYgX190KSB7Ci0gICAgaWYgKF9fdC5lbXB0eSgpKSB7Ci0gICAgICBpZiAodGhpcy0+ZW1wdHkoKSkgcmV0dXJuOwotICAgICAgX190Ll9NX2hlYWRlci5zd2FwKHRoaXMtPl9NX2hlYWRlcik7Ci0gICAgICBfX3QuX01fcmViaW5kKCZ0aGlzLT5fTV9oZWFkZXIuX01fZGF0YSk7Ci0gICAgICB0aGlzLT5fTV9lbXB0eV9pbml0aWFsaXplKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHRoaXMtPmVtcHR5KCkpIHsKLSAgICAgIF9fdC5zd2FwKCp0aGlzKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICB0aGlzLT5fTV9oZWFkZXIuc3dhcChfX3QuX01faGVhZGVyKTsKLSAgICAgIHRoaXMtPl9NX3JlYmluZCgmX190Ll9NX2hlYWRlci5fTV9kYXRhKTsKLSAgICAgIF9fdC5fTV9yZWJpbmQoJnRoaXMtPl9NX2hlYWRlci5fTV9kYXRhKTsKLSAgICB9Ci0gICAgX1NUTFBfU1REOjpzd2FwKF9NX25vZGVfY291bnQsIF9fdC5fTV9ub2RlX2NvdW50KTsKLSAgICBfU1RMUF9TVEQ6OnN3YXAoX01fa2V5X2NvbXBhcmUsIF9fdC5fTV9rZXlfY29tcGFyZSk7Ci0gIH0KLQotcHVibGljOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnNlcnQvZXJhc2UKLSAgcGFpcjxpdGVyYXRvcixib29sPiBpbnNlcnRfdW5pcXVlKGNvbnN0IHZhbHVlX3R5cGUmIF9feCk7Ci0gIGl0ZXJhdG9yIGluc2VydF9lcXVhbChjb25zdCB2YWx1ZV90eXBlJiBfX3gpOwotCi0gIGl0ZXJhdG9yIGluc2VydF91bmlxdWUoaXRlcmF0b3IgX19wb3MsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCk7Ci0gIGl0ZXJhdG9yIGluc2VydF9lcXVhbChpdGVyYXRvciBfX3BvcywgY29uc3QgdmFsdWVfdHlwZSYgX194KTsKLQotI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCi0gIHRlbXBsYXRlPGNsYXNzIF9JST4gdm9pZCBpbnNlcnRfZXF1YWwoX0lJIF9fZmlyc3QsIF9JSSBfX2xhc3QpIHsKLSAgICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCi0gICAgICBpbnNlcnRfZXF1YWwoKl9fZmlyc3QpOwotICB9Ci0gIHRlbXBsYXRlPGNsYXNzIF9JST4gdm9pZCBpbnNlcnRfdW5pcXVlKF9JSSBfX2ZpcnN0LCBfSUkgX19sYXN0KSB7Ci0gICAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQotICAgICAgaW5zZXJ0X3VuaXF1ZSgqX19maXJzdCk7Ci0gIH0KLSNlbHNlCi0gIHZvaWQgaW5zZXJ0X3VuaXF1ZShjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpIHsKLSAgICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCi0gICAgICBpbnNlcnRfdW5pcXVlKCpfX2ZpcnN0KTsKLSAgfQotICB2b2lkIGluc2VydF91bmlxdWUoY29uc3QgdmFsdWVfdHlwZSogX19maXJzdCwgY29uc3QgdmFsdWVfdHlwZSogX19sYXN0KSB7Ci0gICAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQotICAgICAgaW5zZXJ0X3VuaXF1ZSgqX19maXJzdCk7Ci0gIH0KLSAgdm9pZCBpbnNlcnRfZXF1YWwoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KSB7Ci0gICAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQotICAgICAgaW5zZXJ0X2VxdWFsKCpfX2ZpcnN0KTsKLSAgfQotICB2b2lkIGluc2VydF9lcXVhbChjb25zdCB2YWx1ZV90eXBlKiBfX2ZpcnN0LCBjb25zdCB2YWx1ZV90eXBlKiBfX2xhc3QpIHsKLSAgICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCi0gICAgICBpbnNlcnRfZXF1YWwoKl9fZmlyc3QpOwotICB9Ci0jZW5kaWYKLQotICB2b2lkIGVyYXNlKGl0ZXJhdG9yIF9fcG9zKSB7Ci0gICAgX0Jhc2VfcHRyIF9feCA9IF9SYl9nbG9iYWxfaW5zdDo6X1JlYmFsYW5jZV9mb3JfZXJhc2UoX19wb3MuX01fbm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5fTV9oZWFkZXIuX01fZGF0YS5fTV9wYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+X01faGVhZGVyLl9NX2RhdGEuX01fbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5fTV9oZWFkZXIuX01fZGF0YS5fTV9yaWdodCk7Ci0gICAgX1NUTFBfU1REOjpfRGVzdHJveSgmX1NfdmFsdWUoX194KSk7Ci0gICAgdGhpcy0+X01faGVhZGVyLmRlYWxsb2NhdGUoX19TVEFUSUNfQ0FTVChfTGlua190eXBlLCBfX3gpLCAxKTsKLSAgICAtLV9NX25vZGVfY291bnQ7Ci0gIH0KLQotICBzaXplX3R5cGUgZXJhc2UoY29uc3Qga2V5X3R5cGUmIF9feCkgewotICAgIHBhaXI8aXRlcmF0b3IsaXRlcmF0b3I+IF9fcCA9IGVxdWFsX3JhbmdlKF9feCk7Ci0gICAgc2l6ZV90eXBlIF9fbiA9IGRpc3RhbmNlKF9fcC5maXJzdCwgX19wLnNlY29uZCk7Ci0gICAgZXJhc2UoX19wLmZpcnN0LCBfX3Auc2Vjb25kKTsKLSAgICByZXR1cm4gX19uOwotICB9Ci0KLSAgc2l6ZV90eXBlIGVyYXNlX3VuaXF1ZShjb25zdCBrZXlfdHlwZSYgX194KSB7Ci0gICAgaXRlcmF0b3IgX19pID0gZmluZChfX3gpOwotICAgIGlmIChfX2kuX01fbm9kZSAhPSAmdGhpcy0+X01faGVhZGVyLl9NX2RhdGEpIHsKLSAgICAgIGVyYXNlKF9faSk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICB2b2lkIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkgewotICAgIGlmIChfX2ZpcnN0Ll9NX25vZGUgPT0gdGhpcy0+X01faGVhZGVyLl9NX2RhdGEuX01fbGVmdCAmJiAvLyBiZWdpbigpCi0gICAgICAgIF9fbGFzdC5fTV9ub2RlID09ICZ0aGlzLT5fTV9oZWFkZXIuX01fZGF0YSkgICAgICAgICAgIC8vIGVuZCgpCi0gICAgICBjbGVhcigpOwotICAgIGVsc2UKLSAgICAgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkgZXJhc2UoX19maXJzdCsrKTsKLSAgfQotCi0gIHZvaWQgZXJhc2UoY29uc3Qga2V5X3R5cGUqIF9fZmlyc3QsIGNvbnN0IGtleV90eXBlKiBfX2xhc3QpIHsKLSAgICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QpIGVyYXNlKCpfX2ZpcnN0KyspOwotICB9Ci0KLSAgdm9pZCBjbGVhcigpIHsKLSAgICBpZiAoX01fbm9kZV9jb3VudCAhPSAwKSB7Ci0gICAgICBfTV9lcmFzZShfTV9yb290KCkpOwotICAgICAgX01fbGVmdG1vc3QoKSA9ICZ0aGlzLT5fTV9oZWFkZXIuX01fZGF0YTsKLSAgICAgIF9NX3Jvb3QoKSA9IDA7Ci0gICAgICBfTV9yaWdodG1vc3QoKSA9ICZ0aGlzLT5fTV9oZWFkZXIuX01fZGF0YTsKLSAgICAgIF9NX25vZGVfY291bnQgPSAwOwotICAgIH0KLSAgfQotCi1wdWJsaWM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBvcGVyYXRpb25zOgotICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKLSAgaXRlcmF0b3IgZmluZChjb25zdCBfS1QmIF9faykgeyByZXR1cm4gaXRlcmF0b3IoX01fZmluZChfX2spKTsgfQotICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKLSAgY29uc3RfaXRlcmF0b3IgZmluZChjb25zdCBfS1QmIF9faykgY29uc3QgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX01fZmluZChfX2spKTsgfQotcHJpdmF0ZToKLSAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0gIF9CYXNlX3B0ciBfTV9maW5kKGNvbnN0IF9LVCYgX19rKSBjb25zdCB7Ci0gICAgX0Jhc2VfcHRyIF9feSA9IF9fQ09OU1RfQ0FTVChfQmFzZV9wdHIsICZ0aGlzLT5fTV9oZWFkZXIuX01fZGF0YSk7ICAgICAgLy8gTGFzdCBub2RlIHdoaWNoIGlzIG5vdCBsZXNzIHRoYW4gX19rLgotICAgIF9CYXNlX3B0ciBfX3ggPSBfTV9yb290KCk7ICAgICAgLy8gQ3VycmVudCBub2RlLgotCi0gICAgd2hpbGUgKF9feCAhPSAwKQotICAgICAgaWYgKCFfTV9rZXlfY29tcGFyZShfU19rZXkoX194KSwgX19rKSkKLSAgICAgICAgX195ID0gX194LCBfX3ggPSBfU19sZWZ0KF9feCk7Ci0gICAgICBlbHNlCi0gICAgICAgIF9feCA9IF9TX3JpZ2h0KF9feCk7Ci0KLSAgICBpZiAoX195ICE9ICZ0aGlzLT5fTV9oZWFkZXIuX01fZGF0YSkgewotICAgICAgaWYgKF9NX2tleV9jb21wYXJlKF9faywgX1Nfa2V5KF9feSkpKSB7Ci0gICAgICAgIF9feSA9IF9fQ09OU1RfQ0FTVChfQmFzZV9wdHIsICZ0aGlzLT5fTV9oZWFkZXIuX01fZGF0YSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBfX3k7Ci0gIH0KLQotICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKLSAgX0Jhc2VfcHRyIF9NX2xvd2VyX2JvdW5kKGNvbnN0IF9LVCYgX19rKSBjb25zdCB7Ci0gICAgX0Jhc2VfcHRyIF9feSA9IF9fQ09OU1RfQ0FTVChfQmFzZV9wdHIsICZ0aGlzLT5fTV9oZWFkZXIuX01fZGF0YSk7IC8qIExhc3Qgbm9kZSB3aGljaCBpcyBub3QgbGVzcyB0aGFuIF9fay4gKi8KLSAgICBfQmFzZV9wdHIgX194ID0gX01fcm9vdCgpOyAvKiBDdXJyZW50IG5vZGUuICovCi0KLSAgICB3aGlsZSAoX194ICE9IDApCi0gICAgICBpZiAoIV9NX2tleV9jb21wYXJlKF9TX2tleShfX3gpLCBfX2spKQotICAgICAgICBfX3kgPSBfX3gsIF9feCA9IF9TX2xlZnQoX194KTsKLSAgICAgIGVsc2UKLSAgICAgICAgX194ID0gX1NfcmlnaHQoX194KTsKLQotICAgIHJldHVybiBfX3k7Ci0gIH0KLQotICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKLSAgX0Jhc2VfcHRyIF9NX3VwcGVyX2JvdW5kKGNvbnN0IF9LVCYgX19rKSBjb25zdCB7Ci0gICAgX0Jhc2VfcHRyIF9feSA9IF9fQ09OU1RfQ0FTVChfQmFzZV9wdHIsICZ0aGlzLT5fTV9oZWFkZXIuX01fZGF0YSk7IC8qIExhc3Qgbm9kZSB3aGljaCBpcyBncmVhdGVyIHRoYW4gX19rLiAqLwotICAgIF9CYXNlX3B0ciBfX3ggPSBfTV9yb290KCk7IC8qIEN1cnJlbnQgbm9kZS4gKi8KLQotICAgIHdoaWxlIChfX3ggIT0gMCkKLSAgICAgIGlmIChfTV9rZXlfY29tcGFyZShfX2ssIF9TX2tleShfX3gpKSkKLSAgICAgICAgX195ID0gX194LCBfX3ggPSBfU19sZWZ0KF9feCk7Ci0gICAgICBlbHNlCi0gICAgICAgIF9feCA9IF9TX3JpZ2h0KF9feCk7Ci0KLSAgICByZXR1cm4gX195OwotICB9Ci0KLXB1YmxpYzoKLSAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0gIHNpemVfdHlwZSBjb3VudChjb25zdCBfS1QmIF9feCkgY29uc3QgewotICAgIHBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPiBfX3AgPSBlcXVhbF9yYW5nZShfX3gpOwotICAgIHJldHVybiBkaXN0YW5jZShfX3AuZmlyc3QsIF9fcC5zZWNvbmQpOwotICB9Ci0gIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAotICBpdGVyYXRvciBsb3dlcl9ib3VuZChjb25zdCBfS1QmIF9feCkgeyByZXR1cm4gaXRlcmF0b3IoX01fbG93ZXJfYm91bmQoX194KSk7IH0KLSAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0gIGNvbnN0X2l0ZXJhdG9yIGxvd2VyX2JvdW5kKGNvbnN0IF9LVCYgX194KSBjb25zdCB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfTV9sb3dlcl9ib3VuZChfX3gpKTsgfQotICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKLSAgaXRlcmF0b3IgdXBwZXJfYm91bmQoY29uc3QgX0tUJiBfX3gpIHsgcmV0dXJuIGl0ZXJhdG9yKF9NX3VwcGVyX2JvdW5kKF9feCkpOyB9Ci0gIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAotICBjb25zdF9pdGVyYXRvciB1cHBlcl9ib3VuZChjb25zdCBfS1QmIF9feCkgY29uc3QgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX01fdXBwZXJfYm91bmQoX194KSk7IH0KLSAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0gIHBhaXI8aXRlcmF0b3IsaXRlcmF0b3I+IGVxdWFsX3JhbmdlKGNvbnN0IF9LVCYgX194KQotICB7IHJldHVybiBwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4obG93ZXJfYm91bmQoX194KSwgdXBwZXJfYm91bmQoX194KSk7IH0KLSAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0gIHBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPiBlcXVhbF9yYW5nZShjb25zdCBfS1QmIF9feCkgY29uc3QKLSAgeyByZXR1cm4gcGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+KGxvd2VyX2JvdW5kKF9feCksIHVwcGVyX2JvdW5kKF9feCkpOyB9Ci0gIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAotICBwYWlyPGl0ZXJhdG9yLGl0ZXJhdG9yPiBlcXVhbF9yYW5nZV91bmlxdWUoY29uc3QgX0tUJiBfX3gpIHsKLSAgICBwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4gX19wOwotICAgIF9fcC5zZWNvbmQgPSBsb3dlcl9ib3VuZChfX3gpOwotICAgIGlmIChfX3Auc2Vjb25kLl9NX25vZGUgIT0gJnRoaXMtPl9NX2hlYWRlci5fTV9kYXRhICYmCi0gICAgICAgICFfTV9rZXlfY29tcGFyZShfX3gsIF9TX2tleShfX3Auc2Vjb25kLl9NX25vZGUpKSkgewotICAgICAgX19wLmZpcnN0ID0gX19wLnNlY29uZCsrOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIF9fcC5maXJzdCA9IF9fcC5zZWNvbmQ7Ci0gICAgfQotICAgIHJldHVybiBfX3A7Ci0gIH0KLSAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0gIHBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPiBlcXVhbF9yYW5nZV91bmlxdWUoY29uc3QgX0tUJiBfX3gpIGNvbnN0IHsKLSAgICBwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4gX19wOwotICAgIF9fcC5zZWNvbmQgPSBsb3dlcl9ib3VuZChfX3gpOwotICAgIGlmIChfX3Auc2Vjb25kLl9NX25vZGUgIT0gJnRoaXMtPl9NX2hlYWRlci5fTV9kYXRhICYmCi0gICAgICAgICFfTV9rZXlfY29tcGFyZShfX3gsIF9TX2tleShfX3Auc2Vjb25kLl9NX25vZGUpKSkgewotICAgICAgX19wLmZpcnN0ID0gX19wLnNlY29uZCsrOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIF9fcC5maXJzdCA9IF9fcC5zZWNvbmQ7Ci0gICAgfQotICAgIHJldHVybiBfX3A7Ci0gIH0KLQotI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHKQotcHVibGljOgotICAvLyBEZWJ1Z2dpbmcuCi0gIGJvb2wgX19yYl92ZXJpZnkoKSBjb25zdDsKLSNlbmRpZiAvL19TVExQX0RFQlVHCi19OwotCi0jaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpCi0jICB1bmRlZiBfUmJfdHJlZQotI2VuZGlmCi0KLV9TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQotCi1fU1RMUF9FTkRfTkFNRVNQQUNFCi0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfTElOS19USU1FX0lOU1RBTlRJQVRJT04pCi0jICBpbmNsdWRlIDxzdGwvX3RyZWUuYz4KLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpCi0jICBpbmNsdWRlIDxzdGwvZGVidWcvX3RyZWUuaD4KLSNlbmRpZgotCi1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLQotI2RlZmluZSBfU1RMUF9URU1QTEFURV9IRUFERVIgdGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfVmFsdWUsIGNsYXNzIF9LZXlPZlZhbHVlLCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+Ci0jZGVmaW5lIF9TVExQX1RFTVBMQVRFX0NPTlRBSU5FUiBfU1RMUF9QUklWIF9SYl90cmVlPF9LZXksX0NvbXBhcmUsX1ZhbHVlLF9LZXlPZlZhbHVlLF9UcmFpdHMsX0FsbG9jPgotI2luY2x1ZGUgPHN0bC9fcmVsb3BzX2NvbnQuaD4KLSN1bmRlZiBfU1RMUF9URU1QTEFURV9DT05UQUlORVIKLSN1bmRlZiBfU1RMUF9URU1QTEFURV9IRUFERVIKLQotI2lmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pCi10ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0tleU9mVmFsdWUsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KLXN0cnVjdCBfX21vdmVfdHJhaXRzPF9TVExQX1BSSVYgX1JiX3RyZWU8X0tleSwgX0NvbXBhcmUsIF9WYWx1ZSwgX0tleU9mVmFsdWUsIF9UcmFpdHMsIF9BbGxvYz4gPgotICA6IF9TVExQX1BSSVYgX19tb3ZlX3RyYWl0c19oZWxwMjxfQ29tcGFyZSwgX0FsbG9jPiB7fTsKLSNlbmRpZgotCi1fU1RMUF9FTkRfTkFNRVNQQUNFCi0KLSNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9UUkVFX0ggKi8KLQotLy8gTG9jYWwgVmFyaWFibGVzOgotLy8gbW9kZTpDKysKLS8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9fdHlwZWluZm8uaCBiL3N0bC9fdHlwZWluZm8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU2MDJmYi4uMDAwMDAwMAotLS0gYS9zdGwvX3R5cGVpbmZvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9UWVBFSU5GTwotI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9UWVBFSU5GTwotCi0jaWYgIWRlZmluZWQgKF9TVExQX05PX1RZUEVJTkZPKQotCi0jICBpZiBkZWZpbmVkIChfU1RMUF9OT19ORVdfTkVXX0hFQURFUikKLSMgICAgaW5jbHVkZSA8dHlwZWluZm8uaD4KLSMgIGVsc2UKLSMgICAgaWZkZWYgX1NUTFBfQlJPS0VOX0JBRF9DQVNUX0NMQVNTCi0jICAgICAgZGVmaW5lIGJhZF9jYXN0IF9TVExQX05VTExJRklFRF9CUk9LRU5fQkFEX0NBU1RfQ0xBU1MKLSMgICAgZW5kaWYKLSMgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ1BQX1JVTlRJTUVfSEVBREVSKHR5cGVpbmZvKQotIyAgICBpZmRlZiBfU1RMUF9CUk9LRU5fQkFEX0NBU1RfQ0xBU1MKLSMgICAgICB1bmRlZiBiYWRfY2FzdAotIyAgICAgIHVuZGVmIF9TVExQX05VTExJRklFRF9CUk9LRU5fQkFEX0NBU1RfQ0xBU1MKLSMgICAgZW5kaWYKLSMgIGVuZGlmCi0KLSMgIGlmIChkZWZpbmVkKF9TVExQX01TVkMpICYmIChfU1RMUF9NU1ZDID49IDEzMDApKSB8fCAoZGVmaW5lZChfX0lOVEVMX0NPTVBJTEVSKSAmJiAoX19JTlRFTF9DT01QSUxFUiA+PSA4MDApKQotLy8gSW4gLk5FVCwgPHR5cGVpbmZvPiBhY3R1YWxseSBpbmNsdWRlcyA8dHlwZWluZm8uaD4KLSMgICAgdW5kZWYgX1NUTFBfT0xEU1REX3R5cGVpbmZvCi0jICBlbmRpZgotCi0vLyBpZiA8dHlwZWluZm8uaD4gYWxyZWFkeSBpbmNsdWRlZCwgZG8gbm90IGltcG9ydCBhbnl0aGluZwotIyAgaWYgZGVmaW5lZChfU1RMUF9VU0VfTkFNRVNQQUNFUykgJiYgIWRlZmluZWQoX1NUTFBfT0xEU1REX3R5cGVpbmZvKSAmJiBcCi0gICAgICAoZGVmaW5lZChfU1RMUF9WRU5ET1JfR0xPQkFMX0VYQ0VQVF9TVEQpIHx8IFwKLSAgICAgICBkZWZpbmVkKF9TVExQX1VTRV9PV05fTkFNRVNQQUNFKSB8fCBkZWZpbmVkIChfU1RMUF9ERUJVRykpCi0jICAgIGlmIGRlZmluZWQoX1NUTFBfTVNWQykgJiYgKF9TVExQX01TVkMgPCAxMzAwKSAmJiAhZGVmaW5lZChfU1RMUF9XQ0VfTkVUKQotY2xhc3MgYmFkX2Nhc3QgOiBwdWJsaWMgZXhjZXB0aW9uIHt9OwotIyAgICBlbmRpZgotCi1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLS8vIFZDIDYgYW5kIGVWQyA0IGhhdmUgdHlwZV9pbmZvIGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlCi0jICAgIGlmIChkZWZpbmVkKF9TVExQX01TVkMpICYmIChfU1RMUF9NU1ZDIDwgMTMwMCkpIHx8IGRlZmluZWQoX1NUTFBfV0NFX05FVCkKLXVzaW5nIDo6dHlwZV9pbmZvOwotIyAgICBlbHNlCi11c2luZyBfU1RMUF9WRU5ET1JfRVhDRVBUX1NURDo6dHlwZV9pbmZvOwotIyAgICBlbmRpZgotCi0jICAgIGlmICEoZGVmaW5lZCAoX19NUkNfXykgfHwgZGVmaW5lZCAoX19TQ19fKSB8fCBkZWZpbmVkIChfX0RNQ19fKSkKLXVzaW5nIF9TVExQX1ZFTkRPUl9FWENFUFRfU1REOjpiYWRfdHlwZWlkOwotIyAgICBlbmRpZgotCi0vLyNpZiBkZWZpbmVkKCBfX3hsQ19fICkgJiYgKF9feGxDX18gPCAweDUwMCkKLS8vIyBpbmNsdWRlIDxleGNlcHRpb24+Ci0vL3N0cnVjdCBiYWRfY2FzdCA6IGV4Y2VwdGlvbiB7fTsKLS8vI2VuZGlmCi0jICAgIGlmIGRlZmluZWQgKF9TVExQX01TVkMpICYmIChfU1RMUF9NU1ZDIDwgMTMwMCkgJiYgIWRlZmluZWQgKF9TVExQX1dDRV9ORVQpCi11c2luZyA6OmJhZF9jYXN0OwotIyAgICBlbHNlCi11c2luZyBfU1RMUF9WRU5ET1JfRVhDRVBUX1NURDo6YmFkX2Nhc3Q7Ci0jICAgIGVuZGlmCi0KLV9TVExQX0VORF9OQU1FU1BBQ0UKLQotIyAgZW5kaWYKLQotI2Vsc2UKLQotIyAgaWZuZGVmIF9TVExQX0lOVEVSTkFMX0VYQ0VQVElPTgotIyAgICBpbmNsdWRlIDxzdGwvX2V4Y2VwdGlvbi5oPgotIyAgZW5kaWYKLQotX1NUTFBfQkVHSU5fTkFNRVNQQUNFCi0jICBpZiAhZGVmaW5lZCAoX19ETUNfXykKLXN0cnVjdCBiYWRfY2FzdCA6IGV4Y2VwdGlvbiB7fTsKLSMgIGVuZGlmCi1fU1RMUF9FTkRfTkFNRVNQQUNFCi0jZW5kaWYKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zdGwvX3VuaW5pdGlhbGl6ZWQuaCBiL3N0bC9fdW5pbml0aWFsaXplZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmYzNTc4Li4wMDAwMDAwCi0tLSBhL3N0bC9fdW5pbml0aWFsaXplZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDM3ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk0Ci0gKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3Ci0gKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTcKLSAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0vKiBOT1RFOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBTVEwgaGVhZGVycy4KLSAqICAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuCi0gKi8KLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9VTklOSVRJQUxJWkVEX0gKLSNkZWZpbmUgX1NUTFBfSU5URVJOQUxfVU5JTklUSUFMSVpFRF9ICi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1NUUklORwotIyAgaW5jbHVkZSA8c3RsL19jc3RyaW5nLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9BTEdPQkFTRV9ICi0jICBpbmNsdWRlIDxzdGwvX2FsZ29iYXNlLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DT05TVFJVQ1RfSAotIyAgaW5jbHVkZSA8c3RsL19jb25zdHJ1Y3QuaD4KLSNlbmRpZgotCi1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLQotX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQotCi0vLyB1bmluaXRpYWxpemVkX2NvcHkKLQotdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9PdXRwdXRJdGVyLCBjbGFzcyBfRGlzdGFuY2U+Ci1pbmxpbmUgX091dHB1dEl0ZXIgX191Y29weShfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXIgX19yZXN1bHQsIF9EaXN0YW5jZSopIHsKLSAgX091dHB1dEl0ZXIgX19jdXIgPSBfX3Jlc3VsdDsKLSAgX1NUTFBfVFJZIHsKLSAgICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QsICsrX19jdXIpCi0gICAgICBfUGFyYW1fQ29uc3RydWN0KCYqX19jdXIsICpfX2ZpcnN0KTsKLSAgICByZXR1cm4gX19jdXI7Ci0gIH0KLSAgX1NUTFBfVU5XSU5EKF9TVExQX1NURDo6X0Rlc3Ryb3lfUmFuZ2UoX19yZXN1bHQsIF9fY3VyKSkKLSAgX1NUTFBfUkVUX0FGVEVSX1RIUk9XKF9fY3VyKQotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX091dHB1dEl0ZXIsIGNsYXNzIF9EaXN0YW5jZT4KLWlubGluZSBfT3V0cHV0SXRlciBfX3Vjb3B5KF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlciBfX3Jlc3VsdCwgY29uc3QgaW5wdXRfaXRlcmF0b3JfdGFnICYsIF9EaXN0YW5jZSogX19kKQoteyByZXR1cm4gX191Y29weShfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0LCBfX2QpOyB9Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9OT05URU1QTF9CQVNFX01BVENIX0JVRykKLXRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfT3V0cHV0SXRlciwgY2xhc3MgX0Rpc3RhbmNlPgotaW5saW5lIF9PdXRwdXRJdGVyIF9fdWNvcHkoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0LCBjb25zdCBmb3J3YXJkX2l0ZXJhdG9yX3RhZyAmLCBfRGlzdGFuY2UqIF9fZCkKLXsgcmV0dXJuIF9fdWNvcHkoX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCwgX19kKTsgfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX091dHB1dEl0ZXIsIGNsYXNzIF9EaXN0YW5jZT4KLWlubGluZSBfT3V0cHV0SXRlciBfX3Vjb3B5KF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlciBfX3Jlc3VsdCwgY29uc3QgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgJiwgX0Rpc3RhbmNlKiBfX2QpCi17IHJldHVybiBfX3Vjb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQsIF9fZCk7IH0KLSNlbmRpZgotCi10ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9PdXRwdXRJdGVyLCBjbGFzcyBfRGlzdGFuY2U+Ci1pbmxpbmUgX091dHB1dEl0ZXIgX191Y29weShfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlciBfX3Jlc3VsdCwgY29uc3QgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgJiwgX0Rpc3RhbmNlKikgewotICBfT3V0cHV0SXRlciBfX2N1ciA9IF9fcmVzdWx0OwotICBfU1RMUF9UUlkgewotICAgIGZvciAoX0Rpc3RhbmNlIF9fbiA9IF9fbGFzdCAtIF9fZmlyc3Q7IF9fbiA+IDA7IC0tX19uKSB7Ci0gICAgICBfUGFyYW1fQ29uc3RydWN0KCYqX19jdXIsICpfX2ZpcnN0KTsKLSAgICAgICsrX19maXJzdDsKLSAgICAgICsrX19jdXI7Ci0gICAgfQotICAgIHJldHVybiBfX2N1cjsKLSAgfQotICBfU1RMUF9VTldJTkQoX1NUTFBfU1REOjpfRGVzdHJveV9SYW5nZShfX3Jlc3VsdCwgX19jdXIpKQotICBfU1RMUF9SRVRfQUZURVJfVEhST1coX19jdXIpCi19Ci0KLS8vVXNlZCBpbnRlcm5hbHkKLXRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX091dHB1dEl0ZXI+Ci1pbmxpbmUgX091dHB1dEl0ZXIgX191Y29weShfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsIF9PdXRwdXRJdGVyIF9fcmVzdWx0KQoteyByZXR1cm4gX191Y29weShfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0LCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZygpLCAocHRyZGlmZl90KikwKTsgfQotCi1pbmxpbmUgdm9pZCoKLV9fdWNvcHlfdHJpdmlhbChjb25zdCB2b2lkKiBfX2ZpcnN0LCBjb25zdCB2b2lkKiBfX2xhc3QsIHZvaWQqIF9fcmVzdWx0KSB7Ci0gIC8vZHVtczogdGhpcyB2ZXJzaW9uIGNhbiB1c2UgbWVtY3B5IChfX2NvcHlfdHJpdmlhbCBjYW4ndCkKLSAgcmV0dXJuIChfX2xhc3QgPT0gX19maXJzdCkgPyBfX3Jlc3VsdCA6Ci0gICAgKChjaGFyKiltZW1jcHkoX19yZXN1bHQsIF9fZmlyc3QsICgoY29uc3QgY2hhciopX19sYXN0IC0gKGNvbnN0IGNoYXIqKV9fZmlyc3QpKSkgKwotICAgICgoY29uc3QgY2hhciopX19sYXN0IC0gKGNvbnN0IGNoYXIqKV9fZmlyc3QpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX091dHB1dEl0ZXI+Ci1pbmxpbmUgX091dHB1dEl0ZXIgX191Y29weV9wdHJzKF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsIF9PdXRwdXRJdGVyIF9fcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qVHJpdmlhbFVDb3B5Ki8pCi17IHJldHVybiBfX3Vjb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQsIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKCksIChwdHJkaWZmX3QqKTApOyB9Ci0KLXRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfT3V0cHV0SXRlcj4KLWlubGluZSBfT3V0cHV0SXRlciBfX3Vjb3B5X3B0cnMoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwgX091dHB1dEl0ZXIgX19yZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKlRyaXZpYWxVQ29weSovKSB7Ci0gIC8vIHdlIGtub3cgdGhleSBhbGwgcG9pbnRlcnMsIHNvIHRoaXMgY2FzdCBpcyBPSwotICAvLyAgcmV0dXJuIChfT3V0cHV0SXRlcilfX2NvcHlfdHJpdmlhbCgmKCpfX2ZpcnN0KSwgJigqX19sYXN0KSwgJigqX19yZXN1bHQpKTsKLSAgcmV0dXJuIChfT3V0cHV0SXRlcilfX3Vjb3B5X3RyaXZpYWwoX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfT3V0cHV0SXRlcj4KLWlubGluZSBfT3V0cHV0SXRlciBfX3Vjb3B5X2F1eChfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LCBfT3V0cHV0SXRlciBfX3Jlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX3RydWVfdHlwZSYgLypCb3RoUHRyVHlwZSovKSB7Ci0gIHJldHVybiBfX3Vjb3B5X3B0cnMoX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICBfVXNlVHJpdmlhbFVDb3B5KF9TVExQX1ZBTFVFX1RZUEUoX19maXJzdCwgX0lucHV0SXRlciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9WQUxVRV9UWVBFKF9fcmVzdWx0LCBfT3V0cHV0SXRlcikpLl9BbnN3ZXIoKSk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfT3V0cHV0SXRlcj4KLWlubGluZSBfT3V0cHV0SXRlciBfX3Vjb3B5X2F1eChfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LCBfT3V0cHV0SXRlciBfX3Jlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qQm90aFB0clR5cGUqLykgewotICByZXR1cm4gX191Y29weShfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0LAotICAgICAgICAgICAgICAgICBfU1RMUF9JVEVSQVRPUl9DQVRFR09SWShfX2ZpcnN0LCBfSW5wdXRJdGVyKSwKLSAgICAgICAgICAgICAgICAgX1NUTFBfRElTVEFOQ0VfVFlQRShfX2ZpcnN0LCBfSW5wdXRJdGVyKSk7Ci19Ci0KLV9TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX0ZvcndhcmRJdGVyPgotaW5saW5lIF9Gb3J3YXJkSXRlcgotdW5pbml0aWFsaXplZF9jb3B5KF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsIF9Gb3J3YXJkSXRlciBfX3Jlc3VsdCkKLXsgcmV0dXJuIF9TVExQX1BSSVYgX191Y29weV9hdXgoX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCwgX0JvdGhQdHJUeXBlPCBfSW5wdXRJdGVyLCBfRm9yd2FyZEl0ZXI+OjpfQW5zd2VyKCkpOyB9Ci0KLWlubGluZSBjaGFyKgotdW5pbml0aWFsaXplZF9jb3B5KGNvbnN0IGNoYXIqIF9fZmlyc3QsIGNvbnN0IGNoYXIqIF9fbGFzdCwgY2hhciogX19yZXN1bHQpCi17IHJldHVybiAgKGNoYXIqKV9TVExQX1BSSVYgX191Y29weV90cml2aWFsKF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQpOyB9Ci0KLSMgIGlmIGRlZmluZWQgKF9TVExQX0hBU19XQ0hBUl9UKSAvLyBkd2EgOC8xNS85NwotaW5saW5lIHdjaGFyX3QqCi11bmluaXRpYWxpemVkX2NvcHkoY29uc3Qgd2NoYXJfdCogX19maXJzdCwgY29uc3Qgd2NoYXJfdCogX19sYXN0LCB3Y2hhcl90KiBfX3Jlc3VsdCkKLXsgcmV0dXJuICAod2NoYXJfdCopX1NUTFBfUFJJViBfX3Vjb3B5X3RyaXZpYWwgKF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQpOyB9Ci0jICBlbmRpZgotCi0vLyB1bmluaXRpYWxpemVkX2NvcHlfbiAobm90IHBhcnQgb2YgdGhlIEMrKyBzdGFuZGFyZCkKLV9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKLQotdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9TaXplLCBjbGFzcyBfRm9yd2FyZEl0ZXI+Ci1fU1RMUF9JTkxJTkVfTE9PUAotcGFpcjxfSW5wdXRJdGVyLCBfRm9yd2FyZEl0ZXI+Ci1fX3Vjb3B5X24oX0lucHV0SXRlciBfX2ZpcnN0LCBfU2l6ZSBfX2NvdW50LCBfRm9yd2FyZEl0ZXIgX19yZXN1bHQsCi0gICAgICAgICAgY29uc3QgaW5wdXRfaXRlcmF0b3JfdGFnICYpIHsKLSAgX0ZvcndhcmRJdGVyIF9fY3VyID0gX19yZXN1bHQ7Ci0gIF9TVExQX1RSWSB7Ci0gICAgZm9yICggOyBfX2NvdW50ID4gMCA7IC0tX19jb3VudCwgKytfX2ZpcnN0LCArK19fY3VyKQotICAgICAgX1BhcmFtX0NvbnN0cnVjdCgmKl9fY3VyLCAqX19maXJzdCk7Ci0gICAgcmV0dXJuIHBhaXI8X0lucHV0SXRlciwgX0ZvcndhcmRJdGVyPihfX2ZpcnN0LCBfX2N1cik7Ci0gIH0KLSAgX1NUTFBfVU5XSU5EKF9TVExQX1NURDo6X0Rlc3Ryb3lfUmFuZ2UoX19yZXN1bHQsIF9fY3VyKSkKLSAgX1NUTFBfUkVUX0FGVEVSX1RIUk9XKChwYWlyPF9JbnB1dEl0ZXIsIF9Gb3J3YXJkSXRlcj4oX19maXJzdCwgX19jdXIpKSkKLX0KLQotIyAgaWYgZGVmaW5lZCAoX1NUTFBfTk9OVEVNUExfQkFTRV9NQVRDSF9CVUcpCi10ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX1NpemUsIGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+Ci1pbmxpbmUgcGFpcjxfSW5wdXRJdGVyLCBfRm9yd2FyZEl0ZXJhdG9yPgotX191Y29weV9uKF9JbnB1dEl0ZXIgX19maXJzdCwgX1NpemUgX19jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX3Jlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9yd2FyZF9pdGVyYXRvcl90YWcgJikKLXsgcmV0dXJuIF9fdWNvcHlfbihfX2ZpcnN0LCBfX2NvdW50LCBfX3Jlc3VsdCwgaW5wdXRfaXRlcmF0b3JfdGFnKCkpOyB9Ci0KLXRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfU2l6ZSwgY2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KLWlubGluZSBwYWlyPF9JbnB1dEl0ZXIsIF9Gb3J3YXJkSXRlcmF0b3I+Ci1fX3Vjb3B5X24oX0lucHV0SXRlciBfX2ZpcnN0LCBfU2l6ZSBfX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZyAmKQoteyByZXR1cm4gX191Y29weV9uKF9fZmlyc3QsIF9fY291bnQsIF9fcmVzdWx0LCBpbnB1dF9pdGVyYXRvcl90YWcoKSk7IH0KLSMgIGVuZGlmCi0KLXRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX1NpemUsIGNsYXNzIF9Gb3J3YXJkSXRlcj4KLWlubGluZSBwYWlyPF9SYW5kb21BY2Nlc3NJdGVyLCBfRm9yd2FyZEl0ZXI+Ci1fX3Vjb3B5X24oX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwgX1NpemUgX19jb3VudCwgX0ZvcndhcmRJdGVyIF9fcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyAmKSB7Ci0gIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCA9IF9fZmlyc3QgKyBfX2NvdW50OwotICByZXR1cm4gcGFpcjxfUmFuZG9tQWNjZXNzSXRlciwgX0ZvcndhcmRJdGVyPihfX2xhc3QsIHVuaW5pdGlhbGl6ZWRfY29weShfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0KSk7Ci19Ci0KLS8vIFRoaXMgaXMgdXNlZCBpbnRlcm5hbGx5IGluIDxyb3BlPiAsIHdoaWNoIGlzIGV4dGVuc2lvbiBpdHNlbGYuCi10ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX1NpemUsIGNsYXNzIF9Gb3J3YXJkSXRlcj4KLWlubGluZSBwYWlyPF9JbnB1dEl0ZXIsIF9Gb3J3YXJkSXRlcj4KLV9fdWNvcHlfbihfSW5wdXRJdGVyIF9fZmlyc3QsIF9TaXplIF9fY291bnQsIF9Gb3J3YXJkSXRlciBfX3Jlc3VsdCkKLXsgcmV0dXJuIF9TVExQX1BSSVYgX191Y29weV9uKF9fZmlyc3QsIF9fY291bnQsIF9fcmVzdWx0LCBfU1RMUF9JVEVSQVRPUl9DQVRFR09SWShfX2ZpcnN0LCBfSW5wdXRJdGVyKSk7IH0KLQotI2lmICFkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQotCi1fU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKLQotdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9TaXplLCBjbGFzcyBfRm9yd2FyZEl0ZXI+Ci1pbmxpbmUgcGFpcjxfSW5wdXRJdGVyLCBfRm9yd2FyZEl0ZXI+Ci11bmluaXRpYWxpemVkX2NvcHlfbihfSW5wdXRJdGVyIF9fZmlyc3QsIF9TaXplIF9fY291bnQsIF9Gb3J3YXJkSXRlciBfX3Jlc3VsdCkKLXsgcmV0dXJuIF9TVExQX1BSSVYgX191Y29weV9uKF9fZmlyc3QsIF9fY291bnQsIF9fcmVzdWx0KTsgfQotCi1fU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCi0KLSNlbmRpZgotCi10ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfVHAsIGNsYXNzIF9EaXN0YW5jZT4KLWlubGluZSB2b2lkIF9fdWZpbGwoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsIGNvbnN0IF9UcCYgX194LCBfRGlzdGFuY2UqKSB7Ci0gIF9Gb3J3YXJkSXRlciBfX2N1ciA9IF9fZmlyc3Q7Ci0gIF9TVExQX1RSWSB7Ci0gICAgZm9yICggOyBfX2N1ciAhPSBfX2xhc3Q7ICsrX19jdXIpCi0gICAgICBfUGFyYW1fQ29uc3RydWN0KCYqX19jdXIsIF9feCk7Ci0gIH0KLSAgX1NUTFBfVU5XSU5EKF9TVExQX1NURDo6X0Rlc3Ryb3lfUmFuZ2UoX19maXJzdCwgX19jdXIpKQotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfVHAsIGNsYXNzIF9EaXN0YW5jZT4KLWlubGluZSB2b2lkIF9fdWZpbGwoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IF9UcCYgX194LCBjb25zdCBpbnB1dF9pdGVyYXRvcl90YWcgJiwgX0Rpc3RhbmNlKiBfX2QpCi17IF9fdWZpbGwoX19maXJzdCwgX19sYXN0LCBfX3gsIF9fZCk7IH0KLQotI2lmIGRlZmluZWQgKF9TVExQX05PTlRFTVBMX0JBU0VfTUFUQ0hfQlVHKQotdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1RwLCBjbGFzcyBfRGlzdGFuY2U+Ci1pbmxpbmUgdm9pZCBfX3VmaWxsKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICBjb25zdCBfVHAmIF9feCwgY29uc3QgZm9yd2FyZF9pdGVyYXRvcl90YWcgJiwgX0Rpc3RhbmNlKiBfX2QpCi17IF9fdWZpbGwoX19maXJzdCwgX19sYXN0LCBfX3gsIF9fZCk7IH0KLQotdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1RwLCBjbGFzcyBfRGlzdGFuY2U+Ci1pbmxpbmUgdm9pZCBfX3VmaWxsKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICBjb25zdCBfVHAmIF9feCwgY29uc3QgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgJiwgX0Rpc3RhbmNlKiBfX2QpCi17IF9fdWZpbGwoX19maXJzdCwgX19sYXN0LCBfX3gsIF9fZCk7IH0KLSNlbmRpZgotCi10ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfVHAsIGNsYXNzIF9EaXN0YW5jZT4KLWlubGluZSB2b2lkIF9fdWZpbGwoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IF9UcCYgX194LCBjb25zdCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyAmLCBfRGlzdGFuY2UqKSB7Ci0gIF9Gb3J3YXJkSXRlciBfX2N1ciA9IF9fZmlyc3Q7Ci0gIF9TVExQX1RSWSB7Ci0gICAgZm9yIChfRGlzdGFuY2UgX19uID0gX19sYXN0IC0gX19maXJzdDsgX19uID4gMDsgLS1fX24sICsrX19jdXIpCi0gICAgICBfUGFyYW1fQ29uc3RydWN0KCYqX19jdXIsIF9feCk7Ci0gIH0KLSAgX1NUTFBfVU5XSU5EKF9TVExQX1NURDo6X0Rlc3Ryb3lfUmFuZ2UoX19maXJzdCwgX19jdXIpKQotfQotCi1fU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKLQotdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1RwPgotaW5saW5lIHZvaWQgdW5pbml0aWFsaXplZF9maWxsKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LCAgY29uc3QgX1RwJiBfX3gpIHsKLSAgX1NUTFBfUFJJViBfX3VmaWxsKF9fZmlyc3QsIF9fbGFzdCwgX194LAotICAgICAgICAgICAgICAgICAgICAgX1NUTFBfSVRFUkFUT1JfQ0FURUdPUlkoX19maXJzdCwgX0ZvcndhcmRJdGVyKSwKLSAgICAgICAgICAgICAgICAgICAgIF9TVExQX0RJU1RBTkNFX1RZUEUoX19maXJzdCwgX0ZvcndhcmRJdGVyKSk7Ci19Ci0KLS8vIFNwZWNpYWxpemF0aW9uOiBmb3Igb25lLWJ5dGUgdHlwZXMgd2UgY2FuIHVzZSBtZW1zZXQuCi1pbmxpbmUgdm9pZCB1bmluaXRpYWxpemVkX2ZpbGwodW5zaWduZWQgY2hhciogX19maXJzdCwgdW5zaWduZWQgY2hhciogX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXImIF9fdmFsKSB7Ci0gIHVuc2lnbmVkIGNoYXIgX190bXAgPSBfX3ZhbDsKLSAgbWVtc2V0KF9fZmlyc3QsIF9fdG1wLCBfX2xhc3QgLSBfX2ZpcnN0KTsKLX0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fU0lHTkVEX0JVSUxUSU5TKQotaW5saW5lIHZvaWQgdW5pbml0aWFsaXplZF9maWxsKHNpZ25lZCBjaGFyKiBfX2ZpcnN0LCBzaWduZWQgY2hhciogX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpZ25lZCBjaGFyJiBfX3ZhbCkgewotICBzaWduZWQgY2hhciBfX3RtcCA9IF9fdmFsOwotICBtZW1zZXQoX19maXJzdCwgX19TVEFUSUNfQ0FTVCh1bnNpZ25lZCBjaGFyLF9fdG1wKSwgX19sYXN0IC0gX19maXJzdCk7Ci19Ci0jZW5kaWYKLWlubGluZSB2b2lkIHVuaW5pdGlhbGl6ZWRfZmlsbChjaGFyKiBfX2ZpcnN0LCBjaGFyKiBfX2xhc3QsIGNvbnN0IGNoYXImIF9fdmFsKSB7Ci0gIGNoYXIgX190bXAgPSBfX3ZhbDsKLSAgbWVtc2V0KF9fZmlyc3QsIF9fU1RBVElDX0NBU1QodW5zaWduZWQgY2hhcixfX3RtcCksIF9fbGFzdCAtIF9fZmlyc3QpOwotfQotCi1fU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCi0KLXRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9TaXplLCBjbGFzcyBfVHA+Ci1pbmxpbmUgX0ZvcndhcmRJdGVyIF9fdWZpbGxfbihfRm9yd2FyZEl0ZXIgX19maXJzdCwgX1NpemUgX19uLCBjb25zdCBfVHAmIF9feCkgewotICBfRm9yd2FyZEl0ZXIgX19jdXIgPSBfX2ZpcnN0OwotICBfU1RMUF9UUlkgewotICAgIGZvciAoIDsgX19uID4gMDsgLS1fX24sICsrX19jdXIpCi0gICAgICBfUGFyYW1fQ29uc3RydWN0KCYqX19jdXIsIF9feCk7Ci0gIH0KLSAgX1NUTFBfVU5XSU5EKF9TVExQX1NURDo6X0Rlc3Ryb3lfUmFuZ2UoX19maXJzdCwgX19jdXIpKQotICByZXR1cm4gX19jdXI7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9TaXplLCBjbGFzcyBfVHA+Ci1pbmxpbmUgX0ZvcndhcmRJdGVyIF9fdWZpbGxfbihfRm9yd2FyZEl0ZXIgX19maXJzdCwgX1NpemUgX19uLCBjb25zdCBfVHAmIF9feCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0X2l0ZXJhdG9yX3RhZyAmKQoteyByZXR1cm4gX191ZmlsbF9uKF9fZmlyc3QsIF9fbiwgX194KTsgfQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfTk9OVEVNUExfQkFTRV9NQVRDSF9CVUcpCi10ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfU2l6ZSwgY2xhc3MgX1RwPgotaW5saW5lIF9Gb3J3YXJkSXRlciBfX3VmaWxsX24oX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9TaXplIF9fbiwgY29uc3QgX1RwJiBfX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3J3YXJkX2l0ZXJhdG9yX3RhZyAmKQoteyByZXR1cm4gX191ZmlsbF9uKF9fZmlyc3QsIF9fbiwgX194KTsgfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfU2l6ZSwgY2xhc3MgX1RwPgotaW5saW5lIF9Gb3J3YXJkSXRlciBfX3VmaWxsX24oX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9TaXplIF9fbiwgY29uc3QgX1RwJiBfX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZyAmKQoteyByZXR1cm4gX191ZmlsbF9uKF9fZmlyc3QsIF9fbiwgX194KTsgfQotI2VuZGlmCi0KLXRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9TaXplLCBjbGFzcyBfVHA+Ci1pbmxpbmUgX0ZvcndhcmRJdGVyIF9fdW5pbml0aWFsaXplZF9maWxsX24oX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9TaXplIF9fbiwgY29uc3QgX1RwJiBfX3gpIHsKLSAgX0ZvcndhcmRJdGVyIF9fbGFzdCA9IF9fZmlyc3QgKyBfX247Ci0gIF9fdWZpbGwoX19maXJzdCwgX19sYXN0LCBfX3gsIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKCksIChwdHJkaWZmX3QqKTApOwotICByZXR1cm4gX19sYXN0OwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfU2l6ZSwgY2xhc3MgX1RwPgotaW5saW5lIF9Gb3J3YXJkSXRlciBfX3VmaWxsX24oX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9TaXplIF9fbiwgY29uc3QgX1RwJiBfX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyAmKQoteyByZXR1cm4gX191bmluaXRpYWxpemVkX2ZpbGxfbihfX2ZpcnN0LCBfX24sIF9feCk7IH0KLQotLyogX191bmluaXRpYWxpemVkX2luaXQgaXMgYW4gaW50ZXJuYWwgYWxnbyB0byBpbml0IGEgcmFuZ2Ugd2l0aCBhIHZhbHVlCi0gKiBidWlsdCB1c2luZyBkZWZhdWx0IGNvbnN0cnVjdG9yLiBJdCBpcyBvbmx5IGNhbGxlZCB3aXRoIHBvaW50ZXIgYXMKLSAqIGl0ZXJhdG9yLgotICovCi10ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfU2l6ZSwgY2xhc3MgX1RwPgotaW5saW5lIF9Gb3J3YXJkSXRlciBfX3Vpbml0X2F1eF9hdXgoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9TaXplIF9fbiwgY29uc3QgX1RwJiBfX3ZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypfSGFzRGVmYXVsdFplcm8qLykKLXsgcmV0dXJuIF9fdW5pbml0aWFsaXplZF9maWxsX24oX19maXJzdCwgX19uLCBfX3ZhbCk7IH0KLQotdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1NpemUsIGNsYXNzIF9UcD4KLWlubGluZSBfRm9yd2FyZEl0ZXIgX191aW5pdF9hdXhfYXV4KF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfU2l6ZSBfX24sIGNvbnN0IF9UcCYgX192YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX3RydWVfdHlwZSYgLypfSGFzRGVmYXVsdFplcm8qLykgewotICBtZW1zZXQoKHVuc2lnbmVkIGNoYXIqKV9fZmlyc3QsIDAsIF9fbiAqIHNpemVvZihfVHApKTsKLSAgcmV0dXJuIF9fZmlyc3QgKyBfX247Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9TaXplLCBjbGFzcyBfVHA+Ci1pbmxpbmUgX0ZvcndhcmRJdGVyIF9fdWluaXRfYXV4KF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfU2l6ZSBfX24sIGNvbnN0IF9UcCYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKl9Ucml2aWFsSW5pdCovKQoteyByZXR1cm4gX19maXJzdCArIF9fbjsgfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfU2l6ZSwgY2xhc3MgX1RwPgotaW5saW5lIF9Gb3J3YXJkSXRlciBfX3Vpbml0X2F1eChfRm9yd2FyZEl0ZXIgX19maXJzdCwgX1NpemUgX19uLCBjb25zdCBfVHAmIF9fdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qX1RyaXZpYWxJbml0Ki8pCi17IHJldHVybiBfX3Vpbml0X2F1eF9hdXgoX19maXJzdCwgX19uLCBfX3ZhbCwgX0hhc0RlZmF1bHRaZXJvVmFsdWUoX19maXJzdCkuX0Fuc3dlcigpKTsgfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfU2l6ZSwgY2xhc3MgX1RwPgotaW5saW5lIF9Gb3J3YXJkSXRlciBfX3VuaW5pdGlhbGl6ZWRfaW5pdChfRm9yd2FyZEl0ZXIgX19maXJzdCwgX1NpemUgX19uLCBjb25zdCBfVHAmIF9fdmFsKQoteyByZXR1cm4gX191aW5pdF9hdXgoX19maXJzdCwgX19uLCBfX3ZhbCwgX1VzZVRyaXZpYWxJbml0KF9fZmlyc3QpLl9BbnN3ZXIoKSk7IH0KLQotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi0KLXRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9TaXplLCBjbGFzcyBfVHA+Ci1pbmxpbmUgdm9pZAotdW5pbml0aWFsaXplZF9maWxsX24oX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9TaXplIF9fbiwgY29uc3QgX1RwJiBfX3gpCi17IF9TVExQX1BSSVYgX191ZmlsbF9uKF9fZmlyc3QsIF9fbiwgX194LCBfU1RMUF9JVEVSQVRPUl9DQVRFR09SWShfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIpKTsgfQotCi0vLyBFeHRlbnNpb25zOiBfX3VuaW5pdGlhbGl6ZWRfY29weV9jb3B5LCBfX3VuaW5pdGlhbGl6ZWRfY29weV9maWxsLAotLy8gX191bmluaXRpYWxpemVkX2ZpbGxfY29weS4KLQotLy8gX191bmluaXRpYWxpemVkX2NvcHlfY29weQotLy8gQ29waWVzIFtmaXJzdDEsIGxhc3QxKSBpbnRvIFtyZXN1bHQsIHJlc3VsdCArIChsYXN0MSAtIGZpcnN0MSkpLCBhbmQKLS8vICBjb3BpZXMgW2ZpcnN0MiwgbGFzdDIpIGludG8KLS8vICBbcmVzdWx0ICsgKGxhc3QxIC0gZmlyc3QxKSwgcmVzdWx0ICsgKGxhc3QxIC0gZmlyc3QxKSArIChsYXN0MiAtIGZpcnN0MikpLgotCi1fU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCi0KLXRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0SXRlcjIsIGNsYXNzIF9Gb3J3YXJkSXRlcj4KLWlubGluZSBfRm9yd2FyZEl0ZXIKLV9fdW5pbml0aWFsaXplZF9jb3B5X2NvcHkoX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIxIF9fbGFzdDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyLCBfSW5wdXRJdGVyMiBfX2xhc3QyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXIgX19yZXN1bHQpCi17IHJldHVybiB1bmluaXRpYWxpemVkX2NvcHkoX19maXJzdDIsIF9fbGFzdDIsIHVuaW5pdGlhbGl6ZWRfY29weShfX2ZpcnN0MSwgX19sYXN0MSwgX19yZXN1bHQpKTsgfQotCi0vLyBfX3VuaW5pdGlhbGl6ZWRfZmlsbF9jb3B5Ci0vLyBGaWxscyBbcmVzdWx0LCBtaWQpIHdpdGggeCwgYW5kIGNvcGllcyBbZmlyc3QsIGxhc3QpIGludG8KLS8vICBbbWlkLCBtaWQgKyAobGFzdCAtIGZpcnN0KSkuCi10ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfVHAsIGNsYXNzIF9JbnB1dEl0ZXI+Ci1pbmxpbmUgX0ZvcndhcmRJdGVyCi1fX3VuaW5pdGlhbGl6ZWRfZmlsbF9jb3B5KF9Gb3J3YXJkSXRlciBfX3Jlc3VsdCwgX0ZvcndhcmRJdGVyIF9fbWlkLCBjb25zdCBfVHAmIF9feCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCkgewotICB1bmluaXRpYWxpemVkX2ZpbGwoX19yZXN1bHQsIF9fbWlkLCBfX3gpOwotICBfU1RMUF9UUlkgewotICAgIHJldHVybiB1bmluaXRpYWxpemVkX2NvcHkoX19maXJzdCwgX19sYXN0LCBfX21pZCk7Ci0gIH0KLSAgX1NUTFBfVU5XSU5EKF9TVExQX1NURDo6X0Rlc3Ryb3lfUmFuZ2UoX19yZXN1bHQsIF9fbWlkKSkKLSAgX1NUTFBfUkVUX0FGVEVSX1RIUk9XKF9fcmVzdWx0KQotfQotCi0vLyBfX3VuaW5pdGlhbGl6ZWRfY29weV9maWxsCi0vLyBDb3BpZXMgW2ZpcnN0MSwgbGFzdDEpIGludG8gW2ZpcnN0MiwgZmlyc3QyICsgKGxhc3QxIC0gZmlyc3QxKSksIGFuZAotLy8gIGZpbGxzIFtmaXJzdDIgKyAobGFzdDEgLSBmaXJzdDEpLCBsYXN0Mikgd2l0aCB4LgotdGVtcGxhdGUgPGNsYXNzIF9JdGVyLCBjbGFzcyBfVHA+Ci1pbmxpbmUgdm9pZAotX191bmluaXRpYWxpemVkX2NvcHlfZmlsbChfSXRlciBfX2ZpcnN0MSwgX0l0ZXIgX19sYXN0MSwgX0l0ZXIgX19maXJzdDIsIF9JdGVyIF9fbGFzdDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9UcCYgX194KSB7Ci0gIF9JdGVyIF9fbWlkMiA9IHVuaW5pdGlhbGl6ZWRfY29weShfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIpOwotICBfU1RMUF9UUlkgewotICAgIHVuaW5pdGlhbGl6ZWRfZmlsbChfX21pZDIsIF9fbGFzdDIsIF9feCk7Ci0gIH0KLSAgX1NUTFBfVU5XSU5EKF9TVExQX1NURDo6X0Rlc3Ryb3lfUmFuZ2UoX19maXJzdDIsIF9fbWlkMikpCi19Ci0KLS8qIF9fdW5pbml0aWFsaXplZF9tb3ZlOgotICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGludGVybmFseSBhbmQgb25seSB3aXRoIHBvaW50ZXJzIGFzIGl0ZXJhdG9ycy4KLSAqLwotdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1RyaXZpYWxVQ3B5PgotaW5saW5lIF9Gb3J3YXJkSXRlcgotX191bmluaXRpYWxpemVkX21vdmUoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwgX0ZvcndhcmRJdGVyIF9fcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgX1RyaXZpYWxVQ3B5IF9fdHJpdmlhbF91Y3B5LCBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qX01vdmFibGUqLykKLXsgcmV0dXJuIF9fdWNvcHlfcHRycyhfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0LCBfX3RyaXZpYWxfdWNweSk7IH0KLQotdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1RyaXZpYWxVQ3B5PgotX1NUTFBfSU5MSU5FX0xPT1AKLV9Gb3J3YXJkSXRlcgotX191bmluaXRpYWxpemVkX21vdmUoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwgX0ZvcndhcmRJdGVyIF9fcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgX1RyaXZpYWxVQ3B5ICwgY29uc3QgX190cnVlX3R5cGUmIC8qX01vdmFibGUqLykgewotICAvL01vdmUgY29uc3RydWN0b3Igc2hvdWxkIG5vdCB0aHJvdyBzbyB3ZSBkbyBub3QgbmVlZCB0byB0YWtlIGNhcmUgb2YgZXhjZXB0aW9ucyBoZXJlLgotICBmb3IgKHB0cmRpZmZfdCBfX24gPSBfX2xhc3QgLSBfX2ZpcnN0IDsgX19uID4gMDsgLS1fX24pIHsKLSAgICBfTW92ZV9Db25zdHJ1Y3QoJipfX3Jlc3VsdCwgKl9fZmlyc3QpOwotICAgICsrX19maXJzdDsgKytfX3Jlc3VsdDsKLSAgfQotICByZXR1cm4gX19yZXN1bHQ7Ci19Ci0KLV9TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQotCi1fU1RMUF9FTkRfTkFNRVNQQUNFCi0KLSNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9VTklOSVRJQUxJWkVEX0ggKi8KLQotLy8gTG9jYWwgVmFyaWFibGVzOgotLy8gbW9kZTpDKysKLS8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9fdW5vcmRlcmVkX21hcC5oIGIvc3RsL191bm9yZGVyZWRfbWFwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhZDMyOGQuLjAwMDAwMDAKLS0tIGEvc3RsL191bm9yZGVyZWRfbWFwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNAotICogRnJhbmNvaXMgRHVtb250Ci0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICovCi0KLS8qIE5PVEU6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIFNUTCBoZWFkZXJzLgotICogICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4KLSAqLwotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX1VOT1JERVJFRF9NQVBfSAotI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9VTk9SREVSRURfTUFQX0gKLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9IQVNIVEFCTEVfSAotIyAgaW5jbHVkZSA8c3RsL19oYXNodGFibGUuaD4KLSNlbmRpZgotCi1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLQotLy9TcGVjaWZpYyBpdGVyYXRvciB0cmFpdHMgY3JlYXRpb24KLV9TVExQX0NSRUFURV9IQVNIX0lURVJBVE9SX1RSQUlUUyhVbm9yZGVyZWRNYXBUcmFpdHNULCB0cmFpdHMpCi0KLXRlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIF9TVExQX0RGTF9UTVBMX1BBUkFNKF9IYXNoRmNuLGhhc2g8X0tleT4pLAotICAgICAgICAgIF9TVExQX0RGTF9UTVBMX1BBUkFNKF9FcXVhbEtleSxlcXVhbF90bzxfS2V5PiksCi0gICAgICAgICAgX1NUTFBfREVGQVVMVF9QQUlSX0FMTE9DQVRPUl9TRUxFQ1QoY29uc3QgX0tleSwgX1RwKSA+Ci1jbGFzcyB1bm9yZGVyZWRfbWFwCi0jaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKQotICAgICAgICAgICAgICAgOiBwdWJsaWMgX19zdGxwb3J0X2NsYXNzPHVub3JkZXJlZF9tYXA8X0tleSwgX1RwLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+ID4KLSNlbmRpZgotewotcHJpdmF0ZToKLSAgdHlwZWRlZiB1bm9yZGVyZWRfbWFwPF9LZXksIF9UcCwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPiBfU2VsZjsKLXB1YmxpYzoKLSAgdHlwZWRlZiBfS2V5IGtleV90eXBlOwotICB0eXBlZGVmIF9UcCBkYXRhX3R5cGU7Ci0gIHR5cGVkZWYgX1RwIG1hcHBlZF90eXBlOwotI2lmICFkZWZpbmVkIChfX0RNQ19fKQotICB0eXBlZGVmIHBhaXI8Y29uc3Qga2V5X3R5cGUsIGRhdGFfdHlwZT4gdmFsdWVfdHlwZTsKLSNlbHNlCi0gIHR5cGVkZWYgcGFpcjxrZXlfdHlwZSwgZGF0YV90eXBlPiB2YWx1ZV90eXBlOwotI2VuZGlmCi1wcml2YXRlOgotICAvL1NwZWNpZmljIGl0ZXJhdG9yIHRyYWl0cyBjcmVhdGlvbgotICB0eXBlZGVmIF9TVExQX1BSSVYgX1Vub3JkZXJlZE1hcFRyYWl0c1Q8dmFsdWVfdHlwZT4gX1Vub3JkZXJlZE1hcFRyYWl0czsKLQotcHVibGljOgotICB0eXBlZGVmIGhhc2h0YWJsZTx2YWx1ZV90eXBlLCBrZXlfdHlwZSwgX0hhc2hGY24sIF9Vbm9yZGVyZWRNYXBUcmFpdHMsCi0gICAgICAgICAgICAgICAgICAgIF9TVExQX1NFTEVDVDFTVCh2YWx1ZV90eXBlLCAgX0tleSksIF9FcXVhbEtleSwgX0FsbG9jID4gX0h0OwotCi0gIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpoYXNoZXIgaGFzaGVyOwotICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6a2V5X2VxdWFsIGtleV9lcXVhbDsKLQotICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6c2l6ZV90eXBlIHNpemVfdHlwZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpwb2ludGVyIHBvaW50ZXI7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpjb25zdF9wb2ludGVyIGNvbnN0X3BvaW50ZXI7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpyZWZlcmVuY2UgcmVmZXJlbmNlOwotICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZTsKLQotICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6aXRlcmF0b3IgaXRlcmF0b3I7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmxvY2FsX2l0ZXJhdG9yIGxvY2FsX2l0ZXJhdG9yOwotICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6Y29uc3RfbG9jYWxfaXRlcmF0b3IgY29uc3RfbG9jYWxfaXRlcmF0b3I7Ci0KLSAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmFsbG9jYXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOwotCi0gIGhhc2hlciBoYXNoX2Z1bmN0aW9uKCkgY29uc3QgeyByZXR1cm4gX01faHQuaGFzaF9mdW5jdCgpOyB9Ci0gIGtleV9lcXVhbCBrZXlfZXEoKSBjb25zdCB7IHJldHVybiBfTV9odC5rZXlfZXEoKTsgfQotICBhbGxvY2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9yKCkgY29uc3QgeyByZXR1cm4gX01faHQuZ2V0X2FsbG9jYXRvcigpOyB9Ci0KLXByaXZhdGU6Ci0gIF9IdCBfTV9odDsKLSAgX1NUTFBfS0VZX1RZUEVfRk9SX0NPTlRfRVhUKGtleV90eXBlKQotCi1wdWJsaWM6Ci0gIGV4cGxpY2l0IHVub3JkZXJlZF9tYXAoc2l6ZV90eXBlIF9fbiA9IDEwMCwgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQotICAgIDogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgX19hKSB7fQotCi0gIHVub3JkZXJlZF9tYXAoX19tb3ZlX3NvdXJjZTxfU2VsZj4gc3JjKQotICAgIDogX01faHQoX19tb3ZlX3NvdXJjZTxfSHQ+KHNyYy5nZXQoKS5fTV9odCkpIHt9Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Ci0gIHVub3JkZXJlZF9tYXAoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsCi0gICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbiA9IDEwMCwgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCi0gICAgICAgICAgICAgICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAotICAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQotICAgIDogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgX19hKQotICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9Ci0jZWxzZQotICB1bm9yZGVyZWRfbWFwKGNvbnN0IHZhbHVlX3R5cGUqIF9fZiwgY29uc3QgdmFsdWVfdHlwZSogX19sLAotICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX24gPSAxMDAsIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAotICAgICAgICAgICAgICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKLSAgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKLSAgICA6IF9NX2h0KF9fbiwgX19oZiwgX19lcWwsIF9fYSkKLSAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQotCi0gIHVub3JkZXJlZF9tYXAoY29uc3RfaXRlcmF0b3IgX19mLCBjb25zdF9pdGVyYXRvciBfX2wsCi0gICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbiA9IDEwMCwgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCi0gICAgICAgICAgICAgICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAotICAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQotICAgIDogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgX19hKQotICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9Ci0jZW5kaWYgLypfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCi0KLSAgX1NlbGYmIG9wZXJhdG9yID0gKGNvbnN0IF9TZWxmJiBfX290aGVyKQotICB7IF9NX2h0ID0gX19vdGhlci5fTV9odDsgcmV0dXJuICp0aGlzOyB9Ci0KLSAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCB7IHJldHVybiBfTV9odC5zaXplKCk7IH0KLSAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgeyByZXR1cm4gX01faHQubWF4X3NpemUoKTsgfQotICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gX01faHQuZW1wdHkoKTsgfQotICB2b2lkIHN3YXAoX1NlbGYmIF9faHMpIHsgX01faHQuc3dhcChfX2hzLl9NX2h0KTsgfQotCi0gIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gX01faHQuYmVnaW4oKTsgfQotICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBfTV9odC5lbmQoKTsgfQotICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmJlZ2luKCk7IH0KLSAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gX01faHQuZW5kKCk7IH0KLQotICBwYWlyPGl0ZXJhdG9yLGJvb2w+IGluc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX29iaikKLSAgeyByZXR1cm4gX01faHQuaW5zZXJ0X3VuaXF1ZShfX29iaik7IH0KLSAgaXRlcmF0b3IgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIC8qX19oaW50Ki8sIGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKQotICB7IHJldHVybiBfTV9odC5pbnNlcnRfdW5pcXVlKF9fb2JqKTsgfQotI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KLSAgdm9pZCBpbnNlcnQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wpCi0jZWxzZQotICB2b2lkIGluc2VydChjb25zdCB2YWx1ZV90eXBlKiBfX2YsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbCkKLSAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZixfX2wpOyB9Ci0gIHZvaWQgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fZiwgY29uc3RfaXRlcmF0b3IgX19sKQotI2VuZGlmIC8qX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLwotICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9Ci0KLSAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0gIGl0ZXJhdG9yIGZpbmQoY29uc3QgX0tUJiBfX2tleSkgeyByZXR1cm4gX01faHQuZmluZChfX2tleSk7IH0KLSAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0gIGNvbnN0X2l0ZXJhdG9yIGZpbmQoY29uc3QgX0tUJiBfX2tleSkgY29uc3QgeyByZXR1cm4gX01faHQuZmluZChfX2tleSk7IH0KLQotICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKLSAgX1RwJiBvcGVyYXRvcltdKGNvbnN0IF9LVCYgX19rZXkpIHsKLSAgICBpdGVyYXRvciBfX2l0ID0gX01faHQuZmluZChfX2tleSk7Ci0gICAgcmV0dXJuIChfX2l0ID09IF9NX2h0LmVuZCgpID8KLSAgICAgIF9NX2h0Ll9NX2luc2VydCh2YWx1ZV90eXBlKF9fa2V5LCBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKF9UcCkpKS5zZWNvbmQgOgotICAgICAgKCpfX2l0KS5zZWNvbmQgKTsKLSAgfQotCi0gIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAotICBzaXplX3R5cGUgY291bnQoY29uc3QgX0tUJiBfX2tleSkgY29uc3QgeyByZXR1cm4gX01faHQuY291bnQoX19rZXkpOyB9Ci0KLSAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0gIHBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPiBlcXVhbF9yYW5nZShjb25zdCBfS1QmIF9fa2V5KQotICB7IHJldHVybiBfTV9odC5lcXVhbF9yYW5nZShfX2tleSk7IH0KLSAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0gIHBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPiBlcXVhbF9yYW5nZShjb25zdCBfS1QmIF9fa2V5KSBjb25zdAotICB7IHJldHVybiBfTV9odC5lcXVhbF9yYW5nZShfX2tleSk7IH0KLQotICBzaXplX3R5cGUgZXJhc2UoY29uc3Qga2V5X3R5cGUmIF9fa2V5KSB7cmV0dXJuIF9NX2h0LmVyYXNlKF9fa2V5KTsgfQotICB2b2lkIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9faXQpIHsgX01faHQuZXJhc2UoX19pdCk7IH0KLSAgdm9pZCBlcmFzZShjb25zdF9pdGVyYXRvciBfX2YsIGNvbnN0X2l0ZXJhdG9yIF9fbCkgeyBfTV9odC5lcmFzZShfX2YsIF9fbCk7IH0KLSAgdm9pZCBjbGVhcigpIHsgX01faHQuY2xlYXIoKTsgfQotCi0gIHNpemVfdHlwZSBidWNrZXRfY291bnQoKSBjb25zdCB7IHJldHVybiBfTV9odC5idWNrZXRfY291bnQoKTsgfQotICBzaXplX3R5cGUgbWF4X2J1Y2tldF9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0Lm1heF9idWNrZXRfY291bnQoKTsgfQotICBzaXplX3R5cGUgYnVja2V0X3NpemUoc2l6ZV90eXBlIF9fbikgY29uc3QgeyByZXR1cm4gX01faHQuZWxlbXNfaW5fYnVja2V0KF9fbik7IH0KLSAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0gIHNpemVfdHlwZSBidWNrZXQoY29uc3QgX0tUJiBfX2spIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmJ1Y2tldChfX2spOyB9Ci0gIGxvY2FsX2l0ZXJhdG9yIGJlZ2luKHNpemVfdHlwZSBfX24pIHsgcmV0dXJuIF9NX2h0LmJlZ2luKF9fbik7IH0KLSAgbG9jYWxfaXRlcmF0b3IgZW5kKHNpemVfdHlwZSBfX24pIHsgcmV0dXJuIF9NX2h0LmVuZChfX24pOyB9Ci0gIGNvbnN0X2xvY2FsX2l0ZXJhdG9yIGJlZ2luKHNpemVfdHlwZSBfX24pIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmJlZ2luKF9fbik7IH0KLSAgY29uc3RfbG9jYWxfaXRlcmF0b3IgZW5kKHNpemVfdHlwZSBfX24pIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmVuZChfX24pOyB9Ci0KLSAgZmxvYXQgbG9hZF9mYWN0b3IoKSBjb25zdCB7IHJldHVybiBfTV9odC5sb2FkX2ZhY3RvcigpOyB9Ci0gIGZsb2F0IG1heF9sb2FkX2ZhY3RvcigpIGNvbnN0IHsgcmV0dXJuIF9NX2h0Lm1heF9sb2FkX2ZhY3RvcigpOyB9Ci0gIHZvaWQgbWF4X2xvYWRfZmFjdG9yKGZsb2F0IF9fdmFsKSB7IF9NX2h0Lm1heF9sb2FkX2ZhY3RvcihfX3ZhbCk7IH0KLSAgdm9pZCByZWhhc2goc2l6ZV90eXBlIF9faGludCkgeyBfTV9odC5yZWhhc2goX19oaW50KTsgfQotfTsKLQotLy9TcGVjaWZpYyBpdGVyYXRvciB0cmFpdHMgY3JlYXRpb24KLV9TVExQX0NSRUFURV9IQVNIX0lURVJBVE9SX1RSQUlUUyhVbm9yZGVyZWRNdWx0aW1hcFRyYWl0c1QsIHRyYWl0cykKLQotdGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgX1NUTFBfREZMX1RNUExfUEFSQU0oX0hhc2hGY24saGFzaDxfS2V5PiksCi0gICAgICAgICAgX1NUTFBfREZMX1RNUExfUEFSQU0oX0VxdWFsS2V5LGVxdWFsX3RvPF9LZXk+KSwKLSAgICAgICAgICBfU1RMUF9ERUZBVUxUX1BBSVJfQUxMT0NBVE9SX1NFTEVDVChjb25zdCBfS2V5LCBfVHApID4KLWNsYXNzIHVub3JkZXJlZF9tdWx0aW1hcAotI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QQVJUSUFMX1NQRUNfV09SS0FST1VORCkKLSAgICAgICAgICAgICAgICAgICAgOiBwdWJsaWMgX19zdGxwb3J0X2NsYXNzPHVub3JkZXJlZF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4gPgotI2VuZGlmCi17Ci1wcml2YXRlOgotICB0eXBlZGVmIHVub3JkZXJlZF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4gX1NlbGY7Ci1wdWJsaWM6Ci0gIHR5cGVkZWYgX0tleSBrZXlfdHlwZTsKLSAgdHlwZWRlZiBfVHAgZGF0YV90eXBlOwotICB0eXBlZGVmIF9UcCBtYXBwZWRfdHlwZTsKLSNpZiAhZGVmaW5lZCAoX19ETUNfXykKLSAgdHlwZWRlZiBwYWlyPGNvbnN0IGtleV90eXBlLCBkYXRhX3R5cGU+IHZhbHVlX3R5cGU7Ci0jZWxzZQotICB0eXBlZGVmIHBhaXI8a2V5X3R5cGUsIGRhdGFfdHlwZT4gdmFsdWVfdHlwZTsKLSNlbmRpZgotcHJpdmF0ZToKLSAgLy9TcGVjaWZpYyBpdGVyYXRvciB0cmFpdHMgY3JlYXRpb24KLSAgdHlwZWRlZiBfU1RMUF9QUklWIF9Vbm9yZGVyZWRNdWx0aW1hcFRyYWl0c1Q8dmFsdWVfdHlwZT4gX1Vub3JkZXJlZE11bHRpbWFwVHJhaXRzOwotCi1wdWJsaWM6Ci0gIHR5cGVkZWYgaGFzaHRhYmxlPHZhbHVlX3R5cGUsIGtleV90eXBlLCBfSGFzaEZjbiwgX1Vub3JkZXJlZE11bHRpbWFwVHJhaXRzLAotICAgICAgICAgICAgICAgICAgICBfU1RMUF9TRUxFQ1QxU1QodmFsdWVfdHlwZSwgIF9LZXkpLCBfRXF1YWxLZXksIF9BbGxvYyA+IF9IdDsKLQotICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6aGFzaGVyIGhhc2hlcjsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmtleV9lcXVhbCBrZXlfZXF1YWw7Ci0KLSAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OnNpemVfdHlwZSBzaXplX3R5cGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOwotICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6cG9pbnRlciBwb2ludGVyOwotICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6Y29uc3RfcG9pbnRlciBjb25zdF9wb2ludGVyOwotICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6cmVmZXJlbmNlIHJlZmVyZW5jZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9yZWZlcmVuY2U7Ci0KLSAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6Oml0ZXJhdG9yIGl0ZXJhdG9yOwotICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpsb2NhbF9pdGVyYXRvciBsb2NhbF9pdGVyYXRvcjsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmNvbnN0X2xvY2FsX2l0ZXJhdG9yIGNvbnN0X2xvY2FsX2l0ZXJhdG9yOwotCi0gIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKLQotICBoYXNoZXIgaGFzaF9mdW5jdGlvbigpIGNvbnN0IHsgcmV0dXJuIF9NX2h0Lmhhc2hfZnVuY3QoKTsgfQotICBrZXlfZXF1YWwga2V5X2VxKCkgY29uc3QgeyByZXR1cm4gX01faHQua2V5X2VxKCk7IH0KLSAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmdldF9hbGxvY2F0b3IoKTsgfQotCi1wcml2YXRlOgotICBfSHQgX01faHQ7Ci0gIF9TVExQX0tFWV9UWVBFX0ZPUl9DT05UX0VYVChrZXlfdHlwZSkKLQotcHVibGljOgotICBleHBsaWNpdCB1bm9yZGVyZWRfbXVsdGltYXAoc2l6ZV90eXBlIF9fbiA9IDEwMCwgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKLSAgICA6IF9NX2h0KF9fbiwgX19oZiwgX19lcWwsIF9fYSkge30KLQotICB1bm9yZGVyZWRfbXVsdGltYXAoX19tb3ZlX3NvdXJjZTxfU2VsZj4gc3JjKQotICAgIDogX01faHQoX19tb3ZlX3NvdXJjZTxfSHQ+KHNyYy5nZXQoKS5fTV9odCkpIHt9Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Ci0gIHVub3JkZXJlZF9tdWx0aW1hcChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwKLSAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX24gPSAxMDAsIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAotICAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCi0gICAgOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBfX2EpCi0gIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZiwgX19sKTsgfQotI2Vsc2UKLSAgdW5vcmRlcmVkX211bHRpbWFwKGNvbnN0IHZhbHVlX3R5cGUqIF9fZiwgY29uc3QgdmFsdWVfdHlwZSogX19sLAotICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbiA9IDEwMCwgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKLSAgICA6IF9NX2h0KF9fbiwgX19oZiwgX19lcWwsIF9fYSkKLSAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLCBfX2wpOyB9Ci0KLSAgdW5vcmRlcmVkX211bHRpbWFwKGNvbnN0X2l0ZXJhdG9yIF9fZiwgY29uc3RfaXRlcmF0b3IgX19sLAotICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbiA9IDEwMCwgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKLSAgICA6IF9NX2h0KF9fbiwgX19oZiwgX19lcWwsIF9fYSkKLSAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLCBfX2wpOyB9Ci0jZW5kaWYgLypfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCi0KLSAgX1NlbGYmIG9wZXJhdG9yID0gKGNvbnN0IF9TZWxmJiBfX290aGVyKQotICB7IF9NX2h0ID0gX19vdGhlci5fTV9odDsgcmV0dXJuICp0aGlzOyB9Ci0KLSAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCB7IHJldHVybiBfTV9odC5zaXplKCk7IH0KLSAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgeyByZXR1cm4gX01faHQubWF4X3NpemUoKTsgfQotICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gX01faHQuZW1wdHkoKTsgfQotICB2b2lkIHN3YXAoX1NlbGYmIF9faHMpIHsgX01faHQuc3dhcChfX2hzLl9NX2h0KTsgfQotCi0gIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gX01faHQuYmVnaW4oKTsgfQotICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBfTV9odC5lbmQoKTsgfQotICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmJlZ2luKCk7IH0KLSAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gX01faHQuZW5kKCk7IH0KLQotICBpdGVyYXRvciBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCi0gIHsgcmV0dXJuIF9NX2h0Lmluc2VydF9lcXVhbChfX29iaik7IH0KLSAgaXRlcmF0b3IgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIC8qX19oaW50Ki8sIGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKQotICB7IHJldHVybiBfTV9odC5pbnNlcnRfZXF1YWwoX19vYmopOyB9Ci0jaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgotICB2b2lkIGluc2VydChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCkKLSNlbHNlCi0gIHZvaWQgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUqIF9fZiwgY29uc3QgdmFsdWVfdHlwZSogX19sKQotICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsX19sKTsgfQotICB2b2lkIGluc2VydChjb25zdF9pdGVyYXRvciBfX2YsIGNvbnN0X2l0ZXJhdG9yIF9fbCkKLSNlbmRpZiAvKl9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KLSAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLCBfX2wpOyB9Ci0KLSAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0gIGl0ZXJhdG9yIGZpbmQoY29uc3QgX0tUJiBfX2tleSkgeyByZXR1cm4gX01faHQuZmluZChfX2tleSk7IH0KLSAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0gIGNvbnN0X2l0ZXJhdG9yIGZpbmQoY29uc3QgX0tUJiBfX2tleSkgY29uc3QgeyByZXR1cm4gX01faHQuZmluZChfX2tleSk7IH0KLQotICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKLSAgc2l6ZV90eXBlIGNvdW50KGNvbnN0IF9LVCYgX19rZXkpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmNvdW50KF9fa2V5KTsgfQotCi0gIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAotICBwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4gZXF1YWxfcmFuZ2UoY29uc3QgX0tUJiBfX2tleSkKLSAgeyByZXR1cm4gX01faHQuZXF1YWxfcmFuZ2UoX19rZXkpOyB9Ci0gIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAotICBwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4gZXF1YWxfcmFuZ2UoY29uc3QgX0tUJiBfX2tleSkgY29uc3QKLSAgeyByZXR1cm4gX01faHQuZXF1YWxfcmFuZ2UoX19rZXkpOyB9Ci0KLSAgc2l6ZV90eXBlIGVyYXNlKGNvbnN0IGtleV90eXBlJiBfX2tleSkge3JldHVybiBfTV9odC5lcmFzZShfX2tleSk7IH0KLSAgdm9pZCBlcmFzZShjb25zdF9pdGVyYXRvciBfX2l0KSB7IF9NX2h0LmVyYXNlKF9faXQpOyB9Ci0gIHZvaWQgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19mLCBjb25zdF9pdGVyYXRvciBfX2wpIHsgX01faHQuZXJhc2UoX19mLCBfX2wpOyB9Ci0gIHZvaWQgY2xlYXIoKSB7IF9NX2h0LmNsZWFyKCk7IH0KLQotICBzaXplX3R5cGUgYnVja2V0X2NvdW50KCkgY29uc3QgeyByZXR1cm4gX01faHQuYnVja2V0X2NvdW50KCk7IH0KLSAgc2l6ZV90eXBlIG1heF9idWNrZXRfY291bnQoKSBjb25zdCB7IHJldHVybiBfTV9odC5tYXhfYnVja2V0X2NvdW50KCk7IH0KLSAgc2l6ZV90eXBlIGJ1Y2tldF9zaXplKHNpemVfdHlwZSBfX24pIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmVsZW1zX2luX2J1Y2tldChfX24pOyB9Ci0gIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAotICBzaXplX3R5cGUgYnVja2V0KGNvbnN0IF9LVCYgX19rKSBjb25zdCB7IHJldHVybiBfTV9odC5idWNrZXQoX19rKTsgfQotICBsb2NhbF9pdGVyYXRvciBiZWdpbihzaXplX3R5cGUgX19uKSB7IHJldHVybiBfTV9odC5iZWdpbihfX24pOyB9Ci0gIGxvY2FsX2l0ZXJhdG9yIGVuZChzaXplX3R5cGUgX19uKSB7IHJldHVybiBfTV9odC5lbmQoX19uKTsgfQotICBjb25zdF9sb2NhbF9pdGVyYXRvciBiZWdpbihzaXplX3R5cGUgX19uKSBjb25zdCB7IHJldHVybiBfTV9odC5iZWdpbihfX24pOyB9Ci0gIGNvbnN0X2xvY2FsX2l0ZXJhdG9yIGVuZChzaXplX3R5cGUgX19uKSBjb25zdCB7IHJldHVybiBfTV9odC5lbmQoX19uKTsgfQotCi0gIGZsb2F0IGxvYWRfZmFjdG9yKCkgY29uc3QgeyByZXR1cm4gX01faHQubG9hZF9mYWN0b3IoKTsgfQotICBmbG9hdCBtYXhfbG9hZF9mYWN0b3IoKSBjb25zdCB7IHJldHVybiBfTV9odC5tYXhfbG9hZF9mYWN0b3IoKTsgfQotICB2b2lkIG1heF9sb2FkX2ZhY3RvcihmbG9hdCBfX3ZhbCkgeyBfTV9odC5tYXhfbG9hZF9mYWN0b3IoX192YWwpOyB9Ci0gIHZvaWQgcmVoYXNoKHNpemVfdHlwZSBfX2hpbnQpIHsgX01faHQucmVoYXNoKF9faGludCk7IH0KLX07Ci0KLSNkZWZpbmUgX1NUTFBfVEVNUExBVEVfSEVBREVSIHRlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoRmNuLCBjbGFzcyBfRXFsS2V5LCBjbGFzcyBfQWxsb2M+Ci0jZGVmaW5lIF9TVExQX1RFTVBMQVRFX0NPTlRBSU5FUiB1bm9yZGVyZWRfbWFwPF9LZXksX1RwLF9IYXNoRmNuLF9FcWxLZXksX0FsbG9jPgotCi0jaW5jbHVkZSA8c3RsL19yZWxvcHNfaGFzaF9jb250Lmg+Ci0KLSN1bmRlZiBfU1RMUF9URU1QTEFURV9DT05UQUlORVIKLSNkZWZpbmUgX1NUTFBfVEVNUExBVEVfQ09OVEFJTkVSIHVub3JkZXJlZF9tdWx0aW1hcDxfS2V5LF9UcCxfSGFzaEZjbixfRXFsS2V5LF9BbGxvYz4KLQotI2luY2x1ZGUgPHN0bC9fcmVsb3BzX2hhc2hfY29udC5oPgotCi0jdW5kZWYgX1NUTFBfVEVNUExBVEVfQ09OVEFJTkVSCi0jdW5kZWYgX1NUTFBfVEVNUExBVEVfSEVBREVSCi0KLS8vIFNwZWNpYWxpemF0aW9uIG9mIGluc2VydF9pdGVyYXRvciBzbyB0aGF0IGl0IHdpbGwgd29yayBmb3IgdW5vcmRlcmVkX21hcAotLy8gYW5kIHVub3JkZXJlZF9tdWx0aW1hcC4KLQotI2lmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pCi10ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaEZuLCAgY2xhc3MgX0VxS2V5LCBjbGFzcyBfQWxsb2M+Ci1zdHJ1Y3QgX19tb3ZlX3RyYWl0czx1bm9yZGVyZWRfbWFwPF9LZXksIF9UcCwgX0hhc2hGbiwgX0VxS2V5LCBfQWxsb2M+ID4gOgotICBfU1RMUF9QUklWIF9fbW92ZV90cmFpdHNfaGVscDx0eXBlbmFtZSB1bm9yZGVyZWRfbWFwPF9LZXksIF9UcCwgX0hhc2hGbiwgX0VxS2V5LCBfQWxsb2M+OjpfSHQ+Ci17fTsKLQotdGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2hGbiwgIGNsYXNzIF9FcUtleSwgY2xhc3MgX0FsbG9jPgotc3RydWN0IF9fbW92ZV90cmFpdHM8dW5vcmRlcmVkX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2hGbiwgX0VxS2V5LCBfQWxsb2M+ID4gOgotICBfU1RMUF9QUklWIF9fbW92ZV90cmFpdHNfaGVscDx0eXBlbmFtZSB1bm9yZGVyZWRfbWFwPF9LZXksIF9UcCwgX0hhc2hGbiwgX0VxS2V5LCBfQWxsb2M+OjpfSHQ+Ci17fTsKLQotdGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2hGbiwgIGNsYXNzIF9FcUtleSwgY2xhc3MgX0FsbG9jPgotY2xhc3MgaW5zZXJ0X2l0ZXJhdG9yPHVub3JkZXJlZF9tYXA8X0tleSwgX1RwLCBfSGFzaEZuLCBfRXFLZXksIF9BbGxvYz4gPiB7Ci1wcm90ZWN0ZWQ6Ci0gIHR5cGVkZWYgdW5vcmRlcmVkX21hcDxfS2V5LCBfVHAsIF9IYXNoRm4sIF9FcUtleSwgX0FsbG9jPiBfQ29udGFpbmVyOwotICBfQ29udGFpbmVyKiBjb250YWluZXI7Ci1wdWJsaWM6Ci0gIHR5cGVkZWYgX0NvbnRhaW5lciAgICAgICAgICBjb250YWluZXJfdHlwZTsKLSAgdHlwZWRlZiBvdXRwdXRfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OwotICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKLSAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKLSAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHBvaW50ZXI7Ci0gIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICByZWZlcmVuY2U7Ci0KLSAgaW5zZXJ0X2l0ZXJhdG9yKF9Db250YWluZXImIF9feCkgOiBjb250YWluZXIoJl9feCkge30KLSAgaW5zZXJ0X2l0ZXJhdG9yKF9Db250YWluZXImIF9feCwgdHlwZW5hbWUgX0NvbnRhaW5lcjo6aXRlcmF0b3IpCi0gICAgOiBjb250YWluZXIoJl9feCkge30KLSAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JgotICBvcGVyYXRvcj0oY29uc3QgdHlwZW5hbWUgX0NvbnRhaW5lcjo6dmFsdWVfdHlwZSYgX192YWwpIHsKLSAgICBjb250YWluZXItPmluc2VydChfX3ZhbCk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYgb3BlcmF0b3IqKCkgeyByZXR1cm4gKnRoaXM7IH0KLSAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JiBvcGVyYXRvcisrKCkgeyByZXR1cm4gKnRoaXM7IH0KLSAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JiBvcGVyYXRvcisrKGludCkgeyByZXR1cm4gKnRoaXM7IH0KLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoRm4sICBjbGFzcyBfRXFLZXksIGNsYXNzIF9BbGxvYz4KLWNsYXNzIGluc2VydF9pdGVyYXRvcjx1bm9yZGVyZWRfbXVsdGltYXA8X0tleSwgX1RwLCBfSGFzaEZuLCBfRXFLZXksIF9BbGxvYz4gPiB7Ci1wcm90ZWN0ZWQ6Ci0gIHR5cGVkZWYgdW5vcmRlcmVkX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2hGbiwgX0VxS2V5LCBfQWxsb2M+IF9Db250YWluZXI7Ci0gIF9Db250YWluZXIqIGNvbnRhaW5lcjsKLSAgdHlwZW5hbWUgX0NvbnRhaW5lcjo6aXRlcmF0b3IgaXRlcjsKLXB1YmxpYzoKLSAgdHlwZWRlZiBfQ29udGFpbmVyICAgICAgICAgIGNvbnRhaW5lcl90eXBlOwotICB0eXBlZGVmIG91dHB1dF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7Ci0gIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOwotICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOwotICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgcG9pbnRlcjsKLSAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKLQotICBpbnNlcnRfaXRlcmF0b3IoX0NvbnRhaW5lciYgX194KSA6IGNvbnRhaW5lcigmX194KSB7fQotICBpbnNlcnRfaXRlcmF0b3IoX0NvbnRhaW5lciYgX194LCB0eXBlbmFtZSBfQ29udGFpbmVyOjppdGVyYXRvcikKLSAgICA6IGNvbnRhaW5lcigmX194KSB7fQotICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mCi0gIG9wZXJhdG9yPShjb25zdCB0eXBlbmFtZSBfQ29udGFpbmVyOjp2YWx1ZV90eXBlJiBfX3ZhbCkgewotICAgIGNvbnRhaW5lci0+aW5zZXJ0KF9fdmFsKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JiBvcGVyYXRvciooKSB7IHJldHVybiAqdGhpczsgfQotICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mIG9wZXJhdG9yKysoKSB7IHJldHVybiAqdGhpczsgfQotICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mIG9wZXJhdG9yKysoaW50KSB7IHJldHVybiAqdGhpczsgfQotfTsKLQotI2VuZGlmIC8qIF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04gKi8KLQotX1NUTFBfRU5EX05BTUVTUEFDRQotCi0jZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfVU5PUkRFUkVEX01BUF9IICovCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX3Vub3JkZXJlZF9zZXQuaCBiL3N0bC9fdW5vcmRlcmVkX3NldC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2Q2NjJkLi4wMDAwMDAwCi0tLSBhL3N0bC9fdW5vcmRlcmVkX3NldC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzk4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQKLSAqIEZyYW5jb2lzIER1bW9udAotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0vKiBOT1RFOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBTVEwgaGVhZGVycy4KLSAqICAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuCi0gKi8KLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9VTk9SREVSRURfU0VUX0gKLSNkZWZpbmUgX1NUTFBfSU5URVJOQUxfVU5PUkRFUkVEX1NFVF9ICi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfSEFTSFRBQkxFX0gKLSMgIGluY2x1ZGUgPHN0bC9faGFzaHRhYmxlLmg+Ci0jZW5kaWYKLQotX1NUTFBfQkVHSU5fTkFNRVNQQUNFCi0KLS8vU3BlY2lmaWMgaXRlcmF0b3IgdHJhaXRzIGNyZWF0aW9uCi1fU1RMUF9DUkVBVEVfSEFTSF9JVEVSQVRPUl9UUkFJVFMoVW5vcmRlcmVkU2V0VHJhaXRzVCwgQ29uc3RfdHJhaXRzKQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlLCBfU1RMUF9ERkxfVE1QTF9QQVJBTShfSGFzaEZjbixoYXNoPF9WYWx1ZT4pLAotICAgICAgICAgIF9TVExQX0RGTF9UTVBMX1BBUkFNKF9FcXVhbEtleSxlcXVhbF90bzxfVmFsdWU+KSwKLSAgICAgICAgICBfU1RMUF9ERUZBVUxUX0FMTE9DQVRPUl9TRUxFQ1QoX1ZhbHVlKSA+Ci1jbGFzcyB1bm9yZGVyZWRfc2V0Ci0jaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKQotICAgICAgICAgICAgICAgOiBwdWJsaWMgX19zdGxwb3J0X2NsYXNzPHVub3JkZXJlZF9zZXQ8X1ZhbHVlLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+ID4KLSNlbmRpZgotewotICB0eXBlZGVmIHVub3JkZXJlZF9zZXQ8X1ZhbHVlLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+IF9TZWxmOwotICAvL1NwZWNpZmljIGl0ZXJhdG9yIHRyYWl0cyBjcmVhdGlvbgotICB0eXBlZGVmIF9TVExQX1BSSVYgX1Vub3JkZXJlZFNldFRyYWl0c1Q8X1ZhbHVlPiBfVW5vcmRlcmVkU2V0VHJhaXRzOwotcHVibGljOgotICB0eXBlZGVmIGhhc2h0YWJsZTxfVmFsdWUsIF9WYWx1ZSwgX0hhc2hGY24sCi0gICAgICAgICAgICAgICAgICAgIF9Vbm9yZGVyZWRTZXRUcmFpdHMsIF9TVExQX1BSSVYgX0lkZW50aXR5PF9WYWx1ZT4sIF9FcXVhbEtleSwgX0FsbG9jPiBfSHQ7Ci1wdWJsaWM6Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjprZXlfdHlwZSBrZXlfdHlwZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6Omhhc2hlciBoYXNoZXI7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjprZXlfZXF1YWwga2V5X2VxdWFsOwotCi0gIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpzaXplX3R5cGUgc2l6ZV90eXBlOwotICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OnBvaW50ZXIgICAgICAgICBwb2ludGVyOwotICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6Y29uc3RfcG9pbnRlciAgIGNvbnN0X3BvaW50ZXI7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpyZWZlcmVuY2UgICAgICAgcmVmZXJlbmNlOwotICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZTsKLQotICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6aXRlcmF0b3IgaXRlcmF0b3I7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmxvY2FsX2l0ZXJhdG9yIGxvY2FsX2l0ZXJhdG9yOwotICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6Y29uc3RfbG9jYWxfaXRlcmF0b3IgY29uc3RfbG9jYWxfaXRlcmF0b3I7Ci0KLSAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmFsbG9jYXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOwotCi0gIGhhc2hlciBoYXNoX2Z1bmN0aW9uKCkgY29uc3QgeyByZXR1cm4gX01faHQuaGFzaF9mdW5jdCgpOyB9Ci0gIGtleV9lcXVhbCBrZXlfZXEoKSBjb25zdCB7IHJldHVybiBfTV9odC5rZXlfZXEoKTsgfQotICBhbGxvY2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9yKCkgY29uc3QgeyByZXR1cm4gX01faHQuZ2V0X2FsbG9jYXRvcigpOyB9Ci0KLXByaXZhdGU6Ci0gIF9IdCBfTV9odDsKLSAgX1NUTFBfS0VZX1RZUEVfRk9SX0NPTlRfRVhUKGtleV90eXBlKQotCi1wdWJsaWM6Ci0gIGV4cGxpY2l0IHVub3JkZXJlZF9zZXQoc2l6ZV90eXBlIF9fbiA9IDEwMCwgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQotICAgIDogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgX19hKSB7fQotCi0gIHVub3JkZXJlZF9zZXQoX19tb3ZlX3NvdXJjZTxfU2VsZj4gc3JjKQotICAgIDogX01faHQoX19tb3ZlX3NvdXJjZTxfSHQ+KHNyYy5nZXQoKS5fTV9odCkpIHt9Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Ci0gIHVub3JkZXJlZF9zZXQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsCi0gICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbiA9IDEwMCwgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCi0gICAgICAgICAgICAgICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAotICAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQotICAgIDogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgX19hKQotICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9Ci0jZWxzZQotICB1bm9yZGVyZWRfc2V0KGNvbnN0IHZhbHVlX3R5cGUqIF9fZiwgY29uc3QgdmFsdWVfdHlwZSogX19sLAotICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX24gPSAxMDAsIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAotICAgICAgICAgICAgICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKLSAgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKLSAgICA6IF9NX2h0KF9fbiwgX19oZiwgX19lcWwsIF9fYSkKLSAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQotCi0gIHVub3JkZXJlZF9zZXQoY29uc3RfaXRlcmF0b3IgX19mLCBjb25zdF9pdGVyYXRvciBfX2wsCi0gICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbiA9IDEwMCwgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCi0gICAgICAgICAgICAgICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAotICAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQotICAgIDogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgX19hKQotICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9Ci0jZW5kaWYgLypfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCi0KLSAgX1NlbGYmIG9wZXJhdG9yID0gKGNvbnN0IF9TZWxmJiBfX290aGVyKQotICB7IF9NX2h0ID0gX19vdGhlci5fTV9odDsgcmV0dXJuICp0aGlzOyB9Ci0KLSAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCB7IHJldHVybiBfTV9odC5zaXplKCk7IH0KLSAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgeyByZXR1cm4gX01faHQubWF4X3NpemUoKTsgfQotICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gX01faHQuZW1wdHkoKTsgfQotICB2b2lkIHN3YXAoX1NlbGYmIF9faHMpIHsgX01faHQuc3dhcChfX2hzLl9NX2h0KTsgfQotCi0gIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gX01faHQuYmVnaW4oKTsgfQotICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBfTV9odC5lbmQoKTsgfQotICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmJlZ2luKCk7IH0KLSAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gX01faHQuZW5kKCk7IH0KLQotICBwYWlyPGl0ZXJhdG9yLCBib29sPiBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCi0gIHsgcmV0dXJuIF9NX2h0Lmluc2VydF91bmlxdWUoX19vYmopOyB9Ci0gIGl0ZXJhdG9yIGluc2VydChjb25zdF9pdGVyYXRvciAvKl9faGludCovLCBjb25zdCB2YWx1ZV90eXBlJiBfX29iaikKLSAgeyByZXR1cm4gX01faHQuaW5zZXJ0X3VuaXF1ZShfX29iaik7IH0KLSNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Ci0gIHZvaWQgaW5zZXJ0KF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sKQotI2Vsc2UKLSAgdm9pZCBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19mLCBjb25zdF9pdGVyYXRvciBfX2wpCi0gIHtfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQotICB2b2lkIGluc2VydChjb25zdCB2YWx1ZV90eXBlKiBfX2YsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbCkKLSNlbmRpZgotICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLF9fbCk7IH0KLQotICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKLSAgaXRlcmF0b3IgZmluZChjb25zdCBfS1QmIF9fa2V5KSB7IHJldHVybiBfTV9odC5maW5kKF9fa2V5KTsgfQotICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKLSAgY29uc3RfaXRlcmF0b3IgZmluZChjb25zdCBfS1QmIF9fa2V5KSBjb25zdCB7IHJldHVybiBfTV9odC5maW5kKF9fa2V5KTsgfQotCi0gIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAotICBzaXplX3R5cGUgY291bnQoY29uc3QgX0tUJiBfX2tleSkgY29uc3QgeyByZXR1cm4gX01faHQuY291bnQoX19rZXkpOyB9Ci0KLSAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0gIHBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPiBlcXVhbF9yYW5nZShjb25zdCBfS1QmIF9fa2V5KQotICB7IHJldHVybiBfTV9odC5lcXVhbF9yYW5nZShfX2tleSk7IH0KLSAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0gIHBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPiBlcXVhbF9yYW5nZShjb25zdCBfS1QmIF9fa2V5KSBjb25zdAotICB7IHJldHVybiBfTV9odC5lcXVhbF9yYW5nZShfX2tleSk7IH0KLQotICBzaXplX3R5cGUgZXJhc2UoY29uc3Qga2V5X3R5cGUmIF9fa2V5KSB7cmV0dXJuIF9NX2h0LmVyYXNlKF9fa2V5KTsgfQotICB2b2lkIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9faXQpIHsgX01faHQuZXJhc2UoX19pdCk7IH0KLSAgdm9pZCBlcmFzZShjb25zdF9pdGVyYXRvciBfX2YsIGNvbnN0X2l0ZXJhdG9yIF9fbCkgeyBfTV9odC5lcmFzZShfX2YsIF9fbCk7IH0KLSAgdm9pZCBjbGVhcigpIHsgX01faHQuY2xlYXIoKTsgfQotCi0gIHNpemVfdHlwZSBidWNrZXRfY291bnQoKSBjb25zdCB7IHJldHVybiBfTV9odC5idWNrZXRfY291bnQoKTsgfQotICBzaXplX3R5cGUgbWF4X2J1Y2tldF9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0Lm1heF9idWNrZXRfY291bnQoKTsgfQotICBzaXplX3R5cGUgYnVja2V0X3NpemUoc2l6ZV90eXBlIF9fbikgY29uc3QgeyByZXR1cm4gX01faHQuZWxlbXNfaW5fYnVja2V0KF9fbik7IH0KLSAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0gIHNpemVfdHlwZSBidWNrZXQoY29uc3QgX0tUJiBfX2spIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmJ1Y2tldChfX2spOyB9Ci0gIGxvY2FsX2l0ZXJhdG9yIGJlZ2luKHNpemVfdHlwZSBfX24pIHsgcmV0dXJuIF9NX2h0LmJlZ2luKF9fbik7IH0KLSAgbG9jYWxfaXRlcmF0b3IgZW5kKHNpemVfdHlwZSBfX24pIHsgcmV0dXJuIF9NX2h0LmVuZChfX24pOyB9Ci0gIGNvbnN0X2xvY2FsX2l0ZXJhdG9yIGJlZ2luKHNpemVfdHlwZSBfX24pIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmJlZ2luKF9fbik7IH0KLSAgY29uc3RfbG9jYWxfaXRlcmF0b3IgZW5kKHNpemVfdHlwZSBfX24pIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmVuZChfX24pOyB9Ci0KLSAgZmxvYXQgbG9hZF9mYWN0b3IoKSBjb25zdCB7IHJldHVybiBfTV9odC5sb2FkX2ZhY3RvcigpOyB9Ci0gIGZsb2F0IG1heF9sb2FkX2ZhY3RvcigpIGNvbnN0IHsgcmV0dXJuIF9NX2h0Lm1heF9sb2FkX2ZhY3RvcigpOyB9Ci0gIHZvaWQgbWF4X2xvYWRfZmFjdG9yKGZsb2F0IF9fdmFsKSB7IF9NX2h0Lm1heF9sb2FkX2ZhY3RvcihfX3ZhbCk7IH0KLSAgdm9pZCByZWhhc2goc2l6ZV90eXBlIF9faGludCkgeyBfTV9odC5yZWhhc2goX19oaW50KTsgfQotfTsKLQotLy9TcGVjaWZpYyBpdGVyYXRvciB0cmFpdHMgY3JlYXRpb24KLV9TVExQX0NSRUFURV9IQVNIX0lURVJBVE9SX1RSQUlUUyhVbm9yZGVyZWRNdWx0aXNldFRyYWl0c1QsIENvbnN0X3RyYWl0cykKLQotdGVtcGxhdGUgPGNsYXNzIF9WYWx1ZSwgX1NUTFBfREZMX1RNUExfUEFSQU0oX0hhc2hGY24saGFzaDxfVmFsdWU+KSwKLSAgICAgICAgICBfU1RMUF9ERkxfVE1QTF9QQVJBTShfRXF1YWxLZXksZXF1YWxfdG88X1ZhbHVlPiksCi0gICAgICAgICAgX1NUTFBfREVGQVVMVF9BTExPQ0FUT1JfU0VMRUNUKF9WYWx1ZSkgPgotY2xhc3MgdW5vcmRlcmVkX211bHRpc2V0Ci0jaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKQotICAgICAgICAgICAgICAgOiBwdWJsaWMgX19zdGxwb3J0X2NsYXNzPHVub3JkZXJlZF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4gPgotI2VuZGlmCi17Ci0gIHR5cGVkZWYgdW5vcmRlcmVkX211bHRpc2V0PF9WYWx1ZSwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPiBfU2VsZjsKLSAgLy9TcGVjaWZpYyBpdGVyYXRvciB0cmFpdHMgY3JlYXRpb24KLSAgdHlwZWRlZiBfU1RMUF9QUklWIF9Vbm9yZGVyZWRNdWx0aXNldFRyYWl0c1Q8X1ZhbHVlPiBfVW5vcmRlcmVkTXVsdGlzZXRUcmFpdHM7Ci1wdWJsaWM6Ci0gIHR5cGVkZWYgaGFzaHRhYmxlPF9WYWx1ZSwgX1ZhbHVlLCBfSGFzaEZjbiwKLSAgICAgICAgICAgICAgICAgICAgX1Vub3JkZXJlZE11bHRpc2V0VHJhaXRzLCBfU1RMUF9QUklWIF9JZGVudGl0eTxfVmFsdWU+LCBfRXF1YWxLZXksIF9BbGxvYz4gX0h0OwotCi0gIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjprZXlfdHlwZSBrZXlfdHlwZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6Omhhc2hlciBoYXNoZXI7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjprZXlfZXF1YWwga2V5X2VxdWFsOwotCi0gIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpzaXplX3R5cGUgc2l6ZV90eXBlOwotICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OnBvaW50ZXIgICAgICAgcG9pbnRlcjsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmNvbnN0X3BvaW50ZXIgY29uc3RfcG9pbnRlcjsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OnJlZmVyZW5jZSByZWZlcmVuY2U7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlOwotCi0gIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjppdGVyYXRvciBpdGVyYXRvcjsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOwotICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6bG9jYWxfaXRlcmF0b3IgbG9jYWxfaXRlcmF0b3I7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpjb25zdF9sb2NhbF9pdGVyYXRvciBjb25zdF9sb2NhbF9pdGVyYXRvcjsKLQotICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7Ci0KLSAgaGFzaGVyIGhhc2hfZnVuY3Rpb24oKSBjb25zdCB7IHJldHVybiBfTV9odC5oYXNoX2Z1bmN0KCk7IH0KLSAga2V5X2VxdWFsIGtleV9lcSgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmtleV9lcSgpOyB9Ci0gIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdCB7IHJldHVybiBfTV9odC5nZXRfYWxsb2NhdG9yKCk7IH0KLQotcHJpdmF0ZToKLSAgX0h0IF9NX2h0OwotICBfU1RMUF9LRVlfVFlQRV9GT1JfQ09OVF9FWFQoa2V5X3R5cGUpCi0KLXB1YmxpYzoKLSAgZXhwbGljaXQgdW5vcmRlcmVkX211bHRpc2V0KHNpemVfdHlwZSBfX24gPSAxMDAsIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCi0gICAgOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBfX2EpIHt9Ci0KLSAgdW5vcmRlcmVkX211bHRpc2V0KF9fbW92ZV9zb3VyY2U8X1NlbGY+IHNyYykKLSAgICA6IF9NX2h0KF9fbW92ZV9zb3VyY2U8X0h0PihzcmMuZ2V0KCkuX01faHQpKSB7fQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgotICB1bm9yZGVyZWRfbXVsdGlzZXQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsCi0gICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uID0gMTAwLCBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQotICAgIDogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgX19hKQotICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsIF9fbCk7IH0KLSNlbHNlCi0gIHVub3JkZXJlZF9tdWx0aXNldChjb25zdCB2YWx1ZV90eXBlKiBfX2YsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbCwKLSAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX24gPSAxMDAsIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAotICAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCi0gICAgOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBfX2EpCi0gIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZiwgX19sKTsgfQotCi0gIHVub3JkZXJlZF9tdWx0aXNldChjb25zdF9pdGVyYXRvciBfX2YsIGNvbnN0X2l0ZXJhdG9yIF9fbCwKLSAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX24gPSAxMDAsIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAotICAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCi0gICAgOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBfX2EpCi0gIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZiwgX19sKTsgfQotI2VuZGlmIC8qX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLwotCi0gIF9TZWxmJiBvcGVyYXRvciA9IChjb25zdCBfU2VsZiYgX19vdGhlcikKLSAgeyBfTV9odCA9IF9fb3RoZXIuX01faHQ7IHJldHVybiAqdGhpczsgfQotCi0gIHNpemVfdHlwZSBzaXplKCkgY29uc3QgeyByZXR1cm4gX01faHQuc2l6ZSgpOyB9Ci0gIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0Lm1heF9zaXplKCk7IH0KLSAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmVtcHR5KCk7IH0KLSAgdm9pZCBzd2FwKF9TZWxmJiBocykgeyBfTV9odC5zd2FwKGhzLl9NX2h0KTsgfQotCi0gIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gX01faHQuYmVnaW4oKTsgfQotICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBfTV9odC5lbmQoKTsgfQotICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmJlZ2luKCk7IH0KLSAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gX01faHQuZW5kKCk7IH0KLQotICBpdGVyYXRvciBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCi0gIHsgcmV0dXJuIF9NX2h0Lmluc2VydF9lcXVhbChfX29iaik7IH0KLSAgaXRlcmF0b3IgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIC8qX19oaW50Ki8sIGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKQotICB7IHJldHVybiBfTV9odC5pbnNlcnRfZXF1YWwoX19vYmopOyB9Ci0jaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgotICB2b2lkIGluc2VydChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCkKLSNlbHNlCi0gIHZvaWQgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUqIF9fZiwgY29uc3QgdmFsdWVfdHlwZSogX19sKQotICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsX19sKTsgfQotICB2b2lkIGluc2VydChjb25zdF9pdGVyYXRvciBfX2YsIGNvbnN0X2l0ZXJhdG9yIF9fbCkKLSNlbmRpZiAvKl9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KLSAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLCBfX2wpOyB9Ci0KLSAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0gIGl0ZXJhdG9yIGZpbmQoY29uc3QgX0tUJiBfX2tleSkgeyByZXR1cm4gX01faHQuZmluZChfX2tleSk7IH0KLSAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0gIGNvbnN0X2l0ZXJhdG9yIGZpbmQoY29uc3QgX0tUJiBfX2tleSkgY29uc3QgeyByZXR1cm4gX01faHQuZmluZChfX2tleSk7IH0KLQotICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKLSAgc2l6ZV90eXBlIGNvdW50KGNvbnN0IF9LVCYgX19rZXkpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmNvdW50KF9fa2V5KTsgfQotCi0gIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAotICBwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4gZXF1YWxfcmFuZ2UoY29uc3QgX0tUJiBfX2tleSkKLSAgeyByZXR1cm4gX01faHQuZXF1YWxfcmFuZ2UoX19rZXkpOyB9Ci0gIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAotICBwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4gZXF1YWxfcmFuZ2UoY29uc3QgX0tUJiBfX2tleSkgY29uc3QKLSAgeyByZXR1cm4gX01faHQuZXF1YWxfcmFuZ2UoX19rZXkpOyB9Ci0KLSAgc2l6ZV90eXBlIGVyYXNlKGNvbnN0IGtleV90eXBlJiBfX2tleSkge3JldHVybiBfTV9odC5lcmFzZShfX2tleSk7IH0KLSAgdm9pZCBlcmFzZShjb25zdF9pdGVyYXRvciBfX2l0KSB7IF9NX2h0LmVyYXNlKF9faXQpOyB9Ci0gIHZvaWQgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19mLCBjb25zdF9pdGVyYXRvciBfX2wpIHsgX01faHQuZXJhc2UoX19mLCBfX2wpOyB9Ci0gIHZvaWQgY2xlYXIoKSB7IF9NX2h0LmNsZWFyKCk7IH0KLQotICBzaXplX3R5cGUgYnVja2V0X2NvdW50KCkgY29uc3QgeyByZXR1cm4gX01faHQuYnVja2V0X2NvdW50KCk7IH0KLSAgc2l6ZV90eXBlIG1heF9idWNrZXRfY291bnQoKSBjb25zdCB7IHJldHVybiBfTV9odC5tYXhfYnVja2V0X2NvdW50KCk7IH0KLSAgc2l6ZV90eXBlIGJ1Y2tldF9zaXplKHNpemVfdHlwZSBfX24pIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmVsZW1zX2luX2J1Y2tldChfX24pOyB9Ci0gIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAotICBzaXplX3R5cGUgYnVja2V0KGNvbnN0IF9LVCYgX19rKSBjb25zdCB7IHJldHVybiBfTV9odC5idWNrZXQoX19rKTsgfQotICBsb2NhbF9pdGVyYXRvciBiZWdpbihzaXplX3R5cGUgX19uKSB7IHJldHVybiBfTV9odC5iZWdpbihfX24pOyB9Ci0gIGxvY2FsX2l0ZXJhdG9yIGVuZChzaXplX3R5cGUgX19uKSB7IHJldHVybiBfTV9odC5lbmQoX19uKTsgfQotICBjb25zdF9sb2NhbF9pdGVyYXRvciBiZWdpbihzaXplX3R5cGUgX19uKSBjb25zdCB7IHJldHVybiBfTV9odC5iZWdpbihfX24pOyB9Ci0gIGNvbnN0X2xvY2FsX2l0ZXJhdG9yIGVuZChzaXplX3R5cGUgX19uKSBjb25zdCB7IHJldHVybiBfTV9odC5lbmQoX19uKTsgfQotCi0gIGZsb2F0IGxvYWRfZmFjdG9yKCkgY29uc3QgeyByZXR1cm4gX01faHQubG9hZF9mYWN0b3IoKTsgfQotICBmbG9hdCBtYXhfbG9hZF9mYWN0b3IoKSBjb25zdCB7IHJldHVybiBfTV9odC5tYXhfbG9hZF9mYWN0b3IoKTsgfQotICB2b2lkIG1heF9sb2FkX2ZhY3RvcihmbG9hdCBfX3ZhbCkgeyBfTV9odC5tYXhfbG9hZF9mYWN0b3IoX192YWwpOyB9Ci0gIHZvaWQgcmVoYXNoKHNpemVfdHlwZSBfX2hpbnQpIHsgX01faHQucmVoYXNoKF9faGludCk7IH0KLX07Ci0KLSNkZWZpbmUgX1NUTFBfVEVNUExBVEVfSEVBREVSIHRlbXBsYXRlIDxjbGFzcyBfVmFsdWUsIGNsYXNzIF9IYXNoRmNuLCBjbGFzcyBfRXF1YWxLZXksIGNsYXNzIF9BbGxvYz4KLSNkZWZpbmUgX1NUTFBfVEVNUExBVEVfQ09OVEFJTkVSIHVub3JkZXJlZF9zZXQ8X1ZhbHVlLF9IYXNoRmNuLF9FcXVhbEtleSxfQWxsb2M+Ci0KLSNpbmNsdWRlIDxzdGwvX3JlbG9wc19oYXNoX2NvbnQuaD4KLQotI3VuZGVmIF9TVExQX1RFTVBMQVRFX0NPTlRBSU5FUgotI2RlZmluZSBfU1RMUF9URU1QTEFURV9DT05UQUlORVIgdW5vcmRlcmVkX211bHRpc2V0PF9WYWx1ZSxfSGFzaEZjbixfRXF1YWxLZXksX0FsbG9jPgotI2luY2x1ZGUgPHN0bC9fcmVsb3BzX2hhc2hfY29udC5oPgotCi0jdW5kZWYgX1NUTFBfVEVNUExBVEVfQ09OVEFJTkVSCi0jdW5kZWYgX1NUTFBfVEVNUExBVEVfSEVBREVSCi0KLS8vIFNwZWNpYWxpemF0aW9uIG9mIGluc2VydF9pdGVyYXRvciBzbyB0aGF0IGl0IHdpbGwgd29yayBmb3IgdW5vcmRlcmVkX3NldAotLy8gYW5kIHVub3JkZXJlZF9tdWx0aXNldC4KLQotI2lmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pCi10ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaEZjbiwgY2xhc3MgX0VxdWFsS2V5LCBjbGFzcyBfQWxsb2M+Ci1zdHJ1Y3QgX19tb3ZlX3RyYWl0czx1bm9yZGVyZWRfc2V0PF9WYWx1ZSwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPiA+IDoKLSAgX1NUTFBfUFJJViBfX21vdmVfdHJhaXRzX2F1eDx0eXBlbmFtZSB1bm9yZGVyZWRfc2V0PF9WYWx1ZSwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPjo6X0h0Pgote307Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVmFsdWUsIGNsYXNzIF9IYXNoRmNuLCBjbGFzcyBfRXF1YWxLZXksIGNsYXNzIF9BbGxvYz4KLXN0cnVjdCBfX21vdmVfdHJhaXRzPHVub3JkZXJlZF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4gPiA6Ci0gIF9TVExQX1BSSVYgX19tb3ZlX3RyYWl0c19hdXg8dHlwZW5hbWUgdW5vcmRlcmVkX211bHRpc2V0PF9WYWx1ZSwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPjo6X0h0Pgote307Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVmFsdWUsIGNsYXNzIF9IYXNoRmNuLCBjbGFzcyBfRXF1YWxLZXksIGNsYXNzIF9BbGxvYz4KLWNsYXNzIGluc2VydF9pdGVyYXRvcjx1bm9yZGVyZWRfc2V0PF9WYWx1ZSwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPiA+IHsKLXByb3RlY3RlZDoKLSAgdHlwZWRlZiB1bm9yZGVyZWRfc2V0PF9WYWx1ZSwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPiBfQ29udGFpbmVyOwotICBfQ29udGFpbmVyKiBjb250YWluZXI7Ci1wdWJsaWM6Ci0gIHR5cGVkZWYgX0NvbnRhaW5lciAgICAgICAgICBjb250YWluZXJfdHlwZTsKLSAgdHlwZWRlZiBvdXRwdXRfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OwotICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKLSAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKLSAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHBvaW50ZXI7Ci0gIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICByZWZlcmVuY2U7Ci0KLSAgaW5zZXJ0X2l0ZXJhdG9yKF9Db250YWluZXImIF9feCkgOiBjb250YWluZXIoJl9feCkge30KLSAgaW5zZXJ0X2l0ZXJhdG9yKF9Db250YWluZXImIF9feCwgdHlwZW5hbWUgX0NvbnRhaW5lcjo6aXRlcmF0b3IpCi0gICAgOiBjb250YWluZXIoJl9feCkge30KLSAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JgotICBvcGVyYXRvcj0oY29uc3QgdHlwZW5hbWUgX0NvbnRhaW5lcjo6dmFsdWVfdHlwZSYgX192YWwpIHsKLSAgICBjb250YWluZXItPmluc2VydChfX3ZhbCk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYgb3BlcmF0b3IqKCkgeyByZXR1cm4gKnRoaXM7IH0KLSAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JiBvcGVyYXRvcisrKCkgeyByZXR1cm4gKnRoaXM7IH0KLSAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JiBvcGVyYXRvcisrKGludCkgeyByZXR1cm4gKnRoaXM7IH0KLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVmFsdWUsIGNsYXNzIF9IYXNoRmNuLCBjbGFzcyBfRXF1YWxLZXksIGNsYXNzIF9BbGxvYz4KLWNsYXNzIGluc2VydF9pdGVyYXRvcjx1bm9yZGVyZWRfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+ID4gewotcHJvdGVjdGVkOgotICB0eXBlZGVmIHVub3JkZXJlZF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4gX0NvbnRhaW5lcjsKLSAgX0NvbnRhaW5lciogY29udGFpbmVyOwotICB0eXBlbmFtZSBfQ29udGFpbmVyOjppdGVyYXRvciBpdGVyOwotcHVibGljOgotICB0eXBlZGVmIF9Db250YWluZXIgICAgICAgICAgY29udGFpbmVyX3R5cGU7Ci0gIHR5cGVkZWYgb3V0cHV0X2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKLSAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7Ci0gIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7Ci0gIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICBwb2ludGVyOwotICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgcmVmZXJlbmNlOwotCi0gIGluc2VydF9pdGVyYXRvcihfQ29udGFpbmVyJiBfX3gpIDogY29udGFpbmVyKCZfX3gpIHt9Ci0gIGluc2VydF9pdGVyYXRvcihfQ29udGFpbmVyJiBfX3gsIHR5cGVuYW1lIF9Db250YWluZXI6Oml0ZXJhdG9yKQotICAgIDogY29udGFpbmVyKCZfX3gpIHt9Ci0gIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYKLSAgb3BlcmF0b3I9KGNvbnN0IHR5cGVuYW1lIF9Db250YWluZXI6OnZhbHVlX3R5cGUmIF9fdmFsKSB7Ci0gICAgY29udGFpbmVyLT5pbnNlcnQoX192YWwpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mIG9wZXJhdG9yKigpIHsgcmV0dXJuICp0aGlzOyB9Ci0gIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYgb3BlcmF0b3IrKygpIHsgcmV0dXJuICp0aGlzOyB9Ci0gIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYgb3BlcmF0b3IrKyhpbnQpIHsgcmV0dXJuICp0aGlzOyB9Ci19OwotI2VuZGlmIC8qIF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04gKi8KLQotX1NUTFBfRU5EX05BTUVTUEFDRQotCi0jZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfVU5PUkRFUkVEX1NFVF9IICovCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6Ci0KZGlmZiAtLWdpdCBhL3N0bC9fdmFsYXJyYXkuYyBiL3N0bC9fdmFsYXJyYXkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg0MWE0My4uMDAwMDAwMAotLS0gYS9zdGwvX3ZhbGFycmF5LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk0Ci0gKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3Ci0gKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTcKLSAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotI2lmbmRlZiBfU1RMUF9WQUxBUlJBWV9DCi0jZGVmaW5lIF9TVExQX1ZBTEFSUkFZX0MKLQotI2lmbmRlZiBfU1RMUF9WQUxBUlJBWV9ICi0jIGluY2x1ZGUgPHN0bC9fdmFsYXJyYXkuaD4KLSNlbmRpZgotCi1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLV9WYWxhcnJheV9ib29sIHZhbGFycmF5PF9UcD46OiBvcGVyYXRvciEoKSBjb25zdCB7Ci0gIF9WYWxhcnJheV9ib29sIF9fdG1wKHRoaXMtPnNpemUoKSwgX1ZhbGFycmF5X2Jvb2w6Ol9Ob0luaXQoKSk7Ci0gIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IHRoaXMtPnNpemUoKTsgKytfX2kpCi0gICAgX190bXBbX19pXSA9ICEoKnRoaXMpW19faV07Ci0gIHJldHVybiBfX3RtcDsKLX0KLQotLy8gQmVoYXZpb3IgaXMgdW5kZWZpbmVkIGlmIF9feCBhbmQgKnRoaXMgaGF2ZSBkaWZmZXJlbnQgc2l6ZXMKLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci12YWxhcnJheTxfVHA+JiB2YWxhcnJheTxfVHA+OjpvcGVyYXRvcj0oY29uc3Qgc2xpY2VfYXJyYXk8X1RwPiYgX194KQotewotICBzaXplX3QgX19pbmRleCA9IF9feC5fTV9zbGljZS5zdGFydCgpOwotICBmb3IgKHNpemVfdCBfX2kgPSAwOwotICAgICAgIF9faSA8IF9feC5fTV9zbGljZS5zaXplKCk7Ci0gICAgICAgKytfX2ksIF9faW5kZXggKz0gX194Ll9NX3NsaWNlLnN0cmlkZSgpKQotICAgICgqdGhpcylbX19pXSA9IF9feC5fTV9hcnJheVtfX2luZGV4XTsKLSAgcmV0dXJuICp0aGlzOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotdmFsYXJyYXk8X1RwPiB2YWxhcnJheTxfVHA+OjpvcGVyYXRvcltdKHNsaWNlIF9fc2xpY2UpIGNvbnN0IHsKLSAgdmFsYXJyYXk8X1RwPiBfX3RtcChfX3NsaWNlLnNpemUoKSwgX05vSW5pdCgpKTsKLSAgc2l6ZV90IF9faW5kZXggPSBfX3NsaWNlLnN0YXJ0KCk7Ci0gIGZvciAoc2l6ZV90IF9faSA9IDA7Ci0gICAgICAgX19pIDwgX19zbGljZS5zaXplKCk7Ci0gICAgICAgKytfX2ksIF9faW5kZXggKz0gX19zbGljZS5zdHJpZGUoKSkKLSAgICBfX3RtcFtfX2ldID0gKCp0aGlzKVtfX2luZGV4XTsKLSAgcmV0dXJuIF9fdG1wOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1NpemU+Ci1ib29sIF9Hc2xpY2VfSXRlcl90bXBsPF9TaXplPjo6X01faW5jcigpIHsKLSAgc2l6ZV90IF9fZGltID0gX01faW5kaWNlcy5zaXplKCkgLSAxOwotICArK19NX3N0ZXA7Ci0gIGZvciAoOzspIHsKLSAgICBfTV8xZF9pZHggKz0gX01fZ3NsaWNlLl9NX3N0cmlkZXNbX19kaW1dOwotICAgIGlmICgrK19NX2luZGljZXNbX19kaW1dICE9IF9NX2dzbGljZS5fTV9sZW5ndGhzW19fZGltXSkKLSAgICAgIHJldHVybiB0cnVlOwotICAgIGVsc2UgaWYgKF9fZGltICE9IDApIHsKLSAgICAgIF9NXzFkX2lkeCAtPSBfTV9nc2xpY2UuX01fc3RyaWRlc1tfX2RpbV0gKiBfTV9nc2xpY2UuX01fbGVuZ3Roc1tfX2RpbV07Ci0gICAgICBfTV9pbmRpY2VzW19fZGltXSA9IDA7Ci0gICAgICAtLV9fZGltOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLQotLy8gQmVoYXZpb3IgaXMgdW5kZWZpbmVkIGlmIF9feCBhbmQgKnRoaXMgaGF2ZSBkaWZmZXJlbnQgc2l6ZXMsIG9yIGlmCi0vLyBfX3ggd2FzIGNvbnN0cnVjdGVkIGZyb20gYSBkZWdlbmVyYXRlIGdzbGljZS4KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci12YWxhcnJheTxfVHA+JiB2YWxhcnJheTxfVHA+OjpvcGVyYXRvcj0oY29uc3QgZ3NsaWNlX2FycmF5PF9UcD4mIF9feCkKLXsKLSAgaWYgKHRoaXMtPnNpemUoKSAhPSAwKSB7Ci0gICAgX0dzbGljZV9JdGVyIF9faShfX3guX01fZ3NsaWNlKTsKLSAgICBkbwotICAgICAgKCp0aGlzKVtfX2kuX01fc3RlcF0gPSBfX3guX01fYXJyYXlbX19pLl9NXzFkX2lkeF07Ci0gICAgd2hpbGUoX19pLl9NX2luY3IoKSk7Ci0gIH0KLSAgcmV0dXJuICp0aGlzOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotdmFsYXJyYXk8X1RwPiB2YWxhcnJheTxfVHA+OjpvcGVyYXRvcltdKGNvbnN0IGdzbGljZSYgX19zbGljZSkgY29uc3QKLXsKLSAgdmFsYXJyYXk8X1RwPiBfX3RtcChfX3NsaWNlLl9NX3NpemUoKSwgX05vSW5pdCgpKTsKLSAgaWYgKF9fdG1wLnNpemUoKSAhPSAwKSB7Ci0gICAgX0dzbGljZV9JdGVyIF9faShfX3NsaWNlKTsKLSAgICBkbyBfX3RtcFtfX2kuX01fc3RlcF0gPSAoKnRoaXMpW19faS5fTV8xZF9pZHhdOyB3aGlsZShfX2kuX01faW5jcigpKTsKLSAgfQotICByZXR1cm4gX190bXA7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci12YWxhcnJheTxfVHA+IHZhbGFycmF5PF9UcD46Om9wZXJhdG9yW10oY29uc3QgX1ZhbGFycmF5X2Jvb2wmIF9fbWFzaykgY29uc3QKLXsKLSAgc2l6ZV90IF9wX3NpemUgPSAwOwotICB7Ci0gICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19tYXNrLnNpemUoKTsgKytfX2kpCi0gICAgICBpZiAoX19tYXNrW19faV0pICsrX3Bfc2l6ZTsKLSAgfQotCi0gIHZhbGFycmF5PF9UcD4gX190bXAoX3Bfc2l6ZSwgX05vSW5pdCgpKTsKLSAgc2l6ZV90IF9faWR4ID0gMDsKLSAgewotICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fbWFzay5zaXplKCk7ICsrX19pKQotICAgICAgaWYgKF9fbWFza1tfX2ldKSBfX3RtcFtfX2lkeCsrXSA9ICgqdGhpcylbX19pXTsKLSAgfQotCi0gIHJldHVybiBfX3RtcDsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLXZhbGFycmF5PF9UcD4mIHZhbGFycmF5PF9UcD46Om9wZXJhdG9yPShjb25zdCBpbmRpcmVjdF9hcnJheTxfVHA+JiBfX3gpIHsKLSAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194Ll9NX2FkZHIuc2l6ZSgpOyArK19faSkKLSAgICAoKnRoaXMpW19faV0gPSBfX3guX01fYXJyYXlbX194Ll9NX2FkZHJbX19pXV07Ci0gIHJldHVybiAqdGhpczsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLXZhbGFycmF5PF9UcD4KLXZhbGFycmF5PF9UcD46Om9wZXJhdG9yW10oY29uc3QgX1ZhbGFycmF5X3NpemVfdCYgX19hZGRyKSBjb25zdAotewotICB2YWxhcnJheTxfVHA+IF9fdG1wKF9fYWRkci5zaXplKCksIF9Ob0luaXQoKSk7Ci0gIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fYWRkci5zaXplKCk7ICsrX19pKQotICAgIF9fdG1wW19faV0gPSAoKnRoaXMpW19fYWRkcltfX2ldXTsKLSAgcmV0dXJuIF9fdG1wOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIE90aGVyIHZhbGFycmF5IG5vbmlubGluZSBtZW1iZXIgZnVuY3Rpb25zCi0KLS8vIFNoaWZ0IGFuZCBjc2hpZnQKLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLXZhbGFycmF5PF9UcD4gdmFsYXJyYXk8X1RwPjo6c2hpZnQoaW50IF9fbikgY29uc3QKLXsKLSAgdmFsYXJyYXk8X1RwPiBfX3RtcCh0aGlzLT5zaXplKCkpOwotCi0gIGlmIChfX24gPj0gMCkgewotICAgIGlmIChfX24gPCB0aGlzLT5zaXplKCkpCi0gICAgICBjb3B5KHRoaXMtPl9NX2ZpcnN0ICsgX19uLCB0aGlzLT5fTV9maXJzdCArIHRoaXMtPnNpemUoKSwKLSAgICAgICAgICAgX190bXAuX01fZmlyc3QpOwotICB9Ci0gIGVsc2UgewotICAgIGlmICgtX19uIDwgdGhpcy0+c2l6ZSgpKQotICAgICAgY29weSh0aGlzLT5fTV9maXJzdCwgdGhpcy0+X01fZmlyc3QgKyB0aGlzLT5zaXplKCkgKyBfX24sCi0gICAgICAgICAgIF9fdG1wLl9NX2ZpcnN0IC0gX19uKTsKLSAgfQotICByZXR1cm4gX190bXA7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci12YWxhcnJheTxfVHA+IHZhbGFycmF5PF9UcD46OmNzaGlmdChpbnQgX19tKSBjb25zdAotewotICB2YWxhcnJheTxfVHA+IF9fdG1wKHRoaXMtPnNpemUoKSk7Ci0KLSAgLy8gUmVkdWNlIF9fbSB0byBhbiBlcXVpdmFsZW50IG51bWJlciBpbiB0aGUgcmFuZ2UgWzAsIHNpemUoKSkuICBXZQotICAvLyBoYXZlIHRvIGJlIGNhcmVmdWwgd2l0aCBuZWdhdGl2ZSBudW1iZXJzLCBzaW5jZSB0aGUgc2lnbiBvZiBhICUgYgotICAvLyBpcyB1bnNwZWNpZmllZCB3aGVuIGEgPCAwLgotICBsb25nIF9fbiA9IF9fbTsKLSAgaWYgKHRoaXMtPnNpemUoKSA8IChudW1lcmljX2xpbWl0czxsb25nPjo6bWF4KSgpKQotICAgIF9fbiAlPSBsb25nKHRoaXMtPnNpemUoKSk7Ci0gIGlmIChfX24gPCAwKQotICAgIF9fbiArPSB0aGlzLT5zaXplKCk7Ci0KLSAgY29weSh0aGlzLT5fTV9maXJzdCwgICAgICAgdGhpcy0+X01fZmlyc3QgKyBfX24sCi0gICAgICAgX190bXAuX01fZmlyc3QgKyAodGhpcy0+c2l6ZSgpIC0gX19uKSk7Ci0gIGNvcHkodGhpcy0+X01fZmlyc3QgKyBfX24sIHRoaXMtPl9NX2ZpcnN0ICsgdGhpcy0+c2l6ZSgpLAotICAgICAgIF9fdG1wLl9NX2ZpcnN0KTsKLQotICByZXR1cm4gX190bXA7Ci19Ci0KLV9TVExQX0VORF9OQU1FU1BBQ0UKLQotI2VuZGlmIC8qICBfU1RMUF9WQUxBUlJBWV9DICovCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX3ZhbGFycmF5LmggYi9zdGwvX3ZhbGFycmF5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzN2M1YjkuLjAwMDAwMDAKLS0tIGEvc3RsL192YWxhcnJheS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTY2NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0jaWZuZGVmIF9TVExQX1ZBTEFSUkFZX0gKLSNkZWZpbmUgX1NUTFBfVkFMQVJSQVlfSAotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NNQVRICi0jICBpbmNsdWRlIDxzdGwvX2NtYXRoLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9ORVcKLSMgIGluY2x1ZGUgPHN0bC9fbmV3Lmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9BTEdPX0gKLSMgIGluY2x1ZGUgPHN0bC9fYWxnby5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfTlVNRVJJQ19ICi0jICBpbmNsdWRlIDxzdGwvX251bWVyaWMuaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0xJTUlUUwotIyAgaW5jbHVkZSA8c3RsL19saW1pdHMuaD4KLSNlbmRpZgotCi0vKiBBcyB3ZSBvbmx5IG5lZWQgdGhlIF9TVExQX0FTU0VSVCBtYWNybyBmcm9tIF9kZWJ1Zy5oIHdlIHRlc3QgaXQgdG8gaW5jbHVkZSBfZGVidWcuaCAqLwotI2lmbmRlZiBfU1RMUF9BU1NFUlQKLSMgIGluY2x1ZGUgPHN0bC9kZWJ1Zy9fZGVidWcuaD4KLSNlbmRpZgotCi1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLQotY2xhc3Mgc2xpY2U7Ci1jbGFzcyBnc2xpY2U7Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+IGNsYXNzIHZhbGFycmF5OwotdHlwZWRlZiB2YWxhcnJheTxib29sPiAgICBfVmFsYXJyYXlfYm9vbDsKLXR5cGVkZWYgdmFsYXJyYXk8c2l6ZV90PiAgX1ZhbGFycmF5X3NpemVfdDsKLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4gY2xhc3Mgc2xpY2VfYXJyYXk7Ci10ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBjbGFzcyBnc2xpY2VfYXJyYXk7Ci10ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBjbGFzcyBtYXNrX2FycmF5OwotdGVtcGxhdGUgPGNsYXNzIF9UcD4gY2xhc3MgaW5kaXJlY3RfYXJyYXk7Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gY2xhc3MgdmFsYXJyYXkKLQotLy8gQmFzZSBjbGFzcyB0byBoYW5kbGUgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGRlYWxsb2NhdGlvbi4gIFdlIGNhbid0IGp1c3QKLS8vIHVzZSB2ZWN0b3I8PiwgYmVjYXVzZSB2ZWN0b3I8Ym9vbD4gd291bGQgYmUgdW5zdWl0YWJsZSBhcyBhbiBpbnRlcm5hbAotLy8gcmVwcmVzZW50YXRpb24gZm9yIHZhbGFycmF5PGJvb2w+LgotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotc3RydWN0IF9WYWxhcnJheV9iYXNlCi17Ci0gIF9UcCogICBfTV9maXJzdDsKLSAgc2l6ZV90IF9NX3NpemU7Ci0KLSAgX1ZhbGFycmF5X2Jhc2UoKSA6IF9NX2ZpcnN0KDApLCBfTV9zaXplKDApIHt9Ci0gIF9WYWxhcnJheV9iYXNlKHNpemVfdCBfX24pIDogX01fZmlyc3QoMCksIF9NX3NpemUoMCkgeyBfTV9hbGxvY2F0ZShfX24pOyB9Ci0gIH5fVmFsYXJyYXlfYmFzZSgpIHsgX01fZGVhbGxvY2F0ZSgpOyB9Ci0KLSAgdm9pZCBfTV9hbGxvY2F0ZShzaXplX3QgX19uKSB7Ci0gICAgaWYgKF9fbiAhPSAwKSB7Ci0gICAgICBfTV9maXJzdCA9IF9fU1RBVElDX0NBU1QoX1RwKiwgKG1hbGxvYyhfX24gKiBzaXplb2YoX1RwKSkpKTsKLSAgICAgIF9NX3NpemUgID0gX19uOwotI2lmICFkZWZpbmVkKF9TVExQX05PX0JBRF9BTExPQykgJiYgZGVmaW5lZChfU1RMUF9VU0VfRVhDRVBUSU9OUykKLSAgICAgIGlmIChfTV9maXJzdCA9PSAwKSB7Ci0gICAgICAgIF9NX3NpemUgPSAwOwotICAgICAgICB0aHJvdyBfU1RMUF9TVEQ6OmJhZF9hbGxvYygpOwotICAgICAgfQotI2VuZGlmCi0gICAgfQotICAgIGVsc2UgewotICAgICAgX01fZmlyc3QgPSAwOwotICAgICAgX01fc2l6ZSA9IDA7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBfTV9kZWFsbG9jYXRlKCkgewotICAgIGZyZWUoX01fZmlyc3QpOwotICAgIF9NX2ZpcnN0ID0gMDsKLSAgICBfTV9zaXplID0gMDsKLSAgfQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWNsYXNzIHZhbGFycmF5IDogcHJpdmF0ZSBfVmFsYXJyYXlfYmFzZTxfVHA+Ci17Ci0gIGZyaWVuZCBjbGFzcyBnc2xpY2U7Ci0KLXB1YmxpYzoKLSAgdHlwZWRlZiBfVHAgdmFsdWVfdHlwZTsKLQotICAvLyBCYXNpYyBjb25zdHJ1Y3RvcnMKLSAgdmFsYXJyYXkoKSA6IF9WYWxhcnJheV9iYXNlPF9UcD4oKSB7fQotICBleHBsaWNpdCB2YWxhcnJheShzaXplX3QgX19uKSA6IF9WYWxhcnJheV9iYXNlPF9UcD4oX19uKQotICAgIHsgdW5pbml0aWFsaXplZF9maWxsX24odGhpcy0+X01fZmlyc3QsIHRoaXMtPl9NX3NpemUsIF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQodmFsdWVfdHlwZSkpOyB9Ci0gIHZhbGFycmF5KGNvbnN0IHZhbHVlX3R5cGUmIF9feCwgc2l6ZV90IF9fbikgOiBfVmFsYXJyYXlfYmFzZTxfVHA+KF9fbikKLSAgICB7IHVuaW5pdGlhbGl6ZWRfZmlsbF9uKHRoaXMtPl9NX2ZpcnN0LCB0aGlzLT5fTV9zaXplLCBfX3gpOyB9Ci0gIHZhbGFycmF5KGNvbnN0IHZhbHVlX3R5cGUqIF9fcCwgc2l6ZV90IF9fbikgOiBfVmFsYXJyYXlfYmFzZTxfVHA+KF9fbikKLSAgICB7IHVuaW5pdGlhbGl6ZWRfY29weShfX3AsIF9fcCArIF9fbiwgdGhpcy0+X01fZmlyc3QpOyB9Ci0gIHZhbGFycmF5KGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCkgOiBfVmFsYXJyYXlfYmFzZTxfVHA+KF9feC5fTV9zaXplKSB7Ci0gICAgdW5pbml0aWFsaXplZF9jb3B5KF9feC5fTV9maXJzdCwgX194Ll9NX2ZpcnN0ICsgX194Ll9NX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPl9NX2ZpcnN0KTsKLSAgfQotCi0gIC8vIENvbnN0cnVjdG9ycyBmcm9tIGF1eGlsaWFyeSBhcnJheSB0eXBlcwotICB2YWxhcnJheShjb25zdCBzbGljZV9hcnJheTxfVHA+Jik7Ci0gIHZhbGFycmF5KGNvbnN0IGdzbGljZV9hcnJheTxfVHA+Jik7Ci0gIHZhbGFycmF5KGNvbnN0IG1hc2tfYXJyYXk8X1RwPiYpOwotICB2YWxhcnJheShjb25zdCBpbmRpcmVjdF9hcnJheTxfVHA+Jik7Ci0KLSAgLy8gRGVzdHJ1Y3RvcgotICB+dmFsYXJyYXkoKSB7IF9TVExQX1NURDo6X0Rlc3Ryb3lfUmFuZ2UodGhpcy0+X01fZmlyc3QsIHRoaXMtPl9NX2ZpcnN0ICsgdGhpcy0+X01fc2l6ZSk7IH0KLQotICAvLyBFeHRlbnNpb246IGNvbnN0cnVjdG9yIHRoYXQgZG9lc24ndCBpbml0aWFsaXplIHZhbGFycmF5IGVsZW1lbnRzIHRvIGEKLSAgLy8gc3BlY2lmaWMgdmFsdWUuICBUaGlzIGlzIGZhc3RlciBmb3IgdHlwZXMgc3VjaCBhcyBpbnQgYW5kIGRvdWJsZS4KLXByaXZhdGU6Ci0gIHZvaWQgX01faW5pdGlhbGl6ZShjb25zdCBfX3RydWVfdHlwZSYpIHt9Ci0gIHZvaWQgX01faW5pdGlhbGl6ZShjb25zdCBfX2ZhbHNlX3R5cGUmKQotICAgIHsgdW5pbml0aWFsaXplZF9maWxsX24odGhpcy0+X01fZmlyc3QsIHRoaXMtPl9NX3NpemUsIF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQoX1RwKSk7IH0KLQotcHVibGljOgotICBzdHJ1Y3QgX05vSW5pdCB7fTsKLSAgdmFsYXJyYXkoc2l6ZV90IF9fbiwgX05vSW5pdCkgOiBfVmFsYXJyYXlfYmFzZTxfVHA+KF9fbikgewotICAgIHR5cGVkZWYgdHlwZW5hbWUgX190eXBlX3RyYWl0czxfVHA+OjpoYXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yIF9Jc19Ucml2aWFsOwotICAgIF9NX2luaXRpYWxpemUoX0lzX1RyaXZpYWwoKSk7Ci0gIH0KLQotcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBc3NpZ25tZW50Ci0gIC8vIEJhc2ljIGFzc2lnbm1lbnQuICBOb3RlIHRoYXQgJ3ggPSB5JyBpcyB1bmRlZmluZWQgaWYgeC5zaXplKCkgIT0geS5zaXplKCkKLSAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3I9KGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCkgewotICAgIF9TVExQX0FTU0VSVChfX3guc2l6ZSgpID09IHRoaXMtPnNpemUoKSkKLSAgICBpZiAodGhpcyAhPSAmX194KQotICAgICAgY29weShfX3guX01fZmlyc3QsIF9feC5fTV9maXJzdCArIF9feC5fTV9zaXplLCB0aGlzLT5fTV9maXJzdCk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgLy8gU2NhbGFyIGFzc2lnbm1lbnQKLSAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3I9KGNvbnN0IHZhbHVlX3R5cGUmIF9feCkgewotICAgIGZpbGxfbih0aGlzLT5fTV9maXJzdCwgdGhpcy0+X01fc2l6ZSwgX194KTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICAvLyBBc3NpZ25tZW50IG9mIGF1eGlsaWFyeSBhcnJheSB0eXBlcwotICB2YWxhcnJheTxfVHA+JiBvcGVyYXRvcj0oY29uc3Qgc2xpY2VfYXJyYXk8X1RwPiYpOwotICB2YWxhcnJheTxfVHA+JiBvcGVyYXRvcj0oY29uc3QgZ3NsaWNlX2FycmF5PF9UcD4mKTsKLSAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3I9KGNvbnN0IG1hc2tfYXJyYXk8X1RwPiYpOwotICB2YWxhcnJheTxfVHA+JiBvcGVyYXRvcj0oY29uc3QgaW5kaXJlY3RfYXJyYXk8X1RwPiYpOwotCi1wdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVsZW1lbnQgYWNjZXNzCi0gIHZhbHVlX3R5cGUgIG9wZXJhdG9yW10oc2l6ZV90IF9fbikgY29uc3QgeyByZXR1cm4gdGhpcy0+X01fZmlyc3RbX19uXTsgfQotICB2YWx1ZV90eXBlJiBvcGVyYXRvcltdKHNpemVfdCBfX24pICAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX2ZpcnN0W19fbl07IH0KLSAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiB0aGlzLT5fTV9zaXplOyB9Ci0KLXB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3Vic2V0dGluZyBvcGVyYXRpb25zIHdpdGggYXV4aWxpYXJ5IHR5cGUKLSAgdmFsYXJyYXk8X1RwPiAgICAgICAgICAgIG9wZXJhdG9yW10oc2xpY2UpIGNvbnN0OwotICBzbGljZV9hcnJheTxfVHA+ICAgIG9wZXJhdG9yW10oc2xpY2UpOwotICB2YWxhcnJheTxfVHA+ICAgICAgICAgICAgb3BlcmF0b3JbXShjb25zdCBnc2xpY2UmKSBjb25zdDsKLSAgZ3NsaWNlX2FycmF5PF9UcD4gICBvcGVyYXRvcltdKGNvbnN0IGdzbGljZSYpOwotICB2YWxhcnJheTxfVHA+ICAgICAgICAgICAgb3BlcmF0b3JbXShjb25zdCBfVmFsYXJyYXlfYm9vbCYpIGNvbnN0OwotICBtYXNrX2FycmF5PF9UcD4gICAgIG9wZXJhdG9yW10oY29uc3QgX1ZhbGFycmF5X2Jvb2wmKTsKLSAgdmFsYXJyYXk8X1RwPiAgICAgICAgICAgIG9wZXJhdG9yW10oY29uc3QgX1ZhbGFycmF5X3NpemVfdCYpIGNvbnN0OwotICBpbmRpcmVjdF9hcnJheTxfVHA+IG9wZXJhdG9yW10oY29uc3QgX1ZhbGFycmF5X3NpemVfdCYpOwotCi1wdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVuYXJ5IG9wZXJhdG9ycy4KLSAgdmFsYXJyYXk8X1RwPiBvcGVyYXRvcisoKSBjb25zdCB7IHJldHVybiAqdGhpczsgfQotCi0gIHZhbGFycmF5PF9UcD4gb3BlcmF0b3ItKCkgY29uc3QgewotICAgIHZhbGFycmF5PF9UcD4gX190bXAodGhpcy0+c2l6ZSgpLCBfTm9Jbml0KCkpOwotICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IHRoaXMtPnNpemUoKTsgKytfX2kpCi0gICAgICBfX3RtcFtfX2ldID0gLSgqdGhpcylbX19pXTsKLSAgICByZXR1cm4gX190bXA7Ci0gIH0KLQotICB2YWxhcnJheTxfVHA+IG9wZXJhdG9yfigpIGNvbnN0IHsKLSAgICB2YWxhcnJheTxfVHA+IF9fdG1wKHRoaXMtPnNpemUoKSwgX05vSW5pdCgpKTsKLSAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCB0aGlzLT5zaXplKCk7ICsrX19pKQotICAgICAgX190bXBbX19pXSA9IH4oKnRoaXMpW19faV07Ci0gICAgcmV0dXJuIF9fdG1wOwotICB9Ci0KLSAgX1ZhbGFycmF5X2Jvb2wgb3BlcmF0b3IhKCkgY29uc3Q7Ci0KLXB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2NhbGFyIGNvbXB1dGVkIGFzc2lnbm1lbnQuCi0gIHZhbGFycmF5PF9UcD4mIG9wZXJhdG9yKj0gKGNvbnN0IHZhbHVlX3R5cGUmIF9feCkgewotICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IHRoaXMtPnNpemUoKTsgKytfX2kpCi0gICAgICAoKnRoaXMpW19faV0gKj0gX194OwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIHZhbGFycmF5PF9UcD4mIG9wZXJhdG9yLz0gKGNvbnN0IHZhbHVlX3R5cGUmIF9feCkgewotICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IHRoaXMtPnNpemUoKTsgKytfX2kpCi0gICAgICAoKnRoaXMpW19faV0gLz0gX194OwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIHZhbGFycmF5PF9UcD4mIG9wZXJhdG9yJT0gKGNvbnN0IHZhbHVlX3R5cGUmIF9feCkgewotICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IHRoaXMtPnNpemUoKTsgKytfX2kpCi0gICAgICAoKnRoaXMpW19faV0gJT0gX194OwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIHZhbGFycmF5PF9UcD4mIG9wZXJhdG9yKz0gKGNvbnN0IHZhbHVlX3R5cGUmIF9feCkgewotICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IHRoaXMtPnNpemUoKTsgKytfX2kpCi0gICAgICAoKnRoaXMpW19faV0gKz0gX194OwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIHZhbGFycmF5PF9UcD4mIG9wZXJhdG9yLT0gKGNvbnN0IHZhbHVlX3R5cGUmIF9feCkgewotICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IHRoaXMtPnNpemUoKTsgKytfX2kpCi0gICAgICAoKnRoaXMpW19faV0gLT0gX194OwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIHZhbGFycmF5PF9UcD4mIG9wZXJhdG9yXj0gKGNvbnN0IHZhbHVlX3R5cGUmIF9feCkgewotICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IHRoaXMtPnNpemUoKTsgKytfX2kpCi0gICAgICAoKnRoaXMpW19faV0gXj0gX194OwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIHZhbGFycmF5PF9UcD4mIG9wZXJhdG9yJj0gKGNvbnN0IHZhbHVlX3R5cGUmIF9feCkgewotICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IHRoaXMtPnNpemUoKTsgKytfX2kpCi0gICAgICAoKnRoaXMpW19faV0gJj0gX194OwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIHZhbGFycmF5PF9UcD4mIG9wZXJhdG9yfD0gKGNvbnN0IHZhbHVlX3R5cGUmIF9feCkgewotICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IHRoaXMtPnNpemUoKTsgKytfX2kpCi0gICAgICAoKnRoaXMpW19faV0gfD0gX194OwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIHZhbGFycmF5PF9UcD4mIG9wZXJhdG9yPDw9IChjb25zdCB2YWx1ZV90eXBlJiBfX3gpIHsKLSAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCB0aGlzLT5zaXplKCk7ICsrX19pKQotICAgICAgKCp0aGlzKVtfX2ldIDw8PSBfX3g7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3I+Pj0gKGNvbnN0IHZhbHVlX3R5cGUmIF9feCkgewotICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IHRoaXMtPnNpemUoKTsgKytfX2kpCi0gICAgICAoKnRoaXMpW19faV0gPj49IF9feDsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBcnJheSBjb21wdXRlZCBhc3NpZ25tZW50LgotICB2YWxhcnJheTxfVHA+JiBvcGVyYXRvcio9IChjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gpIHsKLSAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCB0aGlzLT5zaXplKCk7ICsrX19pKQotICAgICAgKCp0aGlzKVtfX2ldICo9IF9feFtfX2ldOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIHZhbGFycmF5PF9UcD4mIG9wZXJhdG9yLz0gKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCkgewotICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IHRoaXMtPnNpemUoKTsgKytfX2kpCi0gICAgICAoKnRoaXMpW19faV0gLz0gX194W19faV07Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3IlPSAoY29uc3QgdmFsYXJyYXk8X1RwPiYgX194KSB7Ci0gICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgdGhpcy0+c2l6ZSgpOyArK19faSkKLSAgICAgICgqdGhpcylbX19pXSAlPSBfX3hbX19pXTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICB2YWxhcnJheTxfVHA+JiBvcGVyYXRvcis9IChjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gpIHsKLSAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCB0aGlzLT5zaXplKCk7ICsrX19pKQotICAgICAgKCp0aGlzKVtfX2ldICs9IF9feFtfX2ldOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIHZhbGFycmF5PF9UcD4mIG9wZXJhdG9yLT0gKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCkgewotICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IHRoaXMtPnNpemUoKTsgKytfX2kpCi0gICAgICAoKnRoaXMpW19faV0gLT0gX194W19faV07Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3JePSAoY29uc3QgdmFsYXJyYXk8X1RwPiYgX194KSB7Ci0gICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgdGhpcy0+c2l6ZSgpOyArK19faSkKLSAgICAgICgqdGhpcylbX19pXSBePSBfX3hbX19pXTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICB2YWxhcnJheTxfVHA+JiBvcGVyYXRvciY9IChjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gpIHsKLSAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCB0aGlzLT5zaXplKCk7ICsrX19pKQotICAgICAgKCp0aGlzKVtfX2ldICY9IF9feFtfX2ldOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIHZhbGFycmF5PF9UcD4mIG9wZXJhdG9yfD0gKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCkgewotICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IHRoaXMtPnNpemUoKTsgKytfX2kpCi0gICAgICAoKnRoaXMpW19faV0gfD0gX194W19faV07Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3I8PD0gKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCkgewotICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IHRoaXMtPnNpemUoKTsgKytfX2kpCi0gICAgICAoKnRoaXMpW19faV0gPDw9IF9feFtfX2ldOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIHZhbGFycmF5PF9UcD4mIG9wZXJhdG9yPj49IChjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gpIHsKLSAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCB0aGlzLT5zaXplKCk7ICsrX19pKQotICAgICAgKCp0aGlzKVtfX2ldID4+PSBfX3hbX19pXTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPdGhlciBtZW1iZXIgZnVuY3Rpb25zLgotCi0gIC8vIFRoZSByZXN1bHQgaXMgdW5kZWZpbmVkIGZvciB6ZXJvLWxlbmd0aCBhcnJheXMKLSAgdmFsdWVfdHlwZSBzdW0oKSBjb25zdCB7Ci0gICAgcmV0dXJuIGFjY3VtdWxhdGUodGhpcy0+X01fZmlyc3QgKyAxLCB0aGlzLT5fTV9maXJzdCArIHRoaXMtPl9NX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgKCp0aGlzKVswXSk7Ci0gIH0KLQotICAvLyBUaGUgcmVzdWx0IGlzIHVuZGVmaW5lZCBmb3IgemVyby1sZW5ndGggYXJyYXlzCi0gIHZhbHVlX3R5cGUgKG1pbikgKCkgY29uc3QgewotICAgIHJldHVybiAqbWluX2VsZW1lbnQodGhpcy0+X01fZmlyc3QgKyAwLCB0aGlzLT5fTV9maXJzdCArIHRoaXMtPl9NX3NpemUpOwotICB9Ci0KLSAgdmFsdWVfdHlwZSAobWF4KSAoKSBjb25zdCB7Ci0gICAgcmV0dXJuICptYXhfZWxlbWVudCh0aGlzLT5fTV9maXJzdCArIDAsIHRoaXMtPl9NX2ZpcnN0ICsgdGhpcy0+X01fc2l6ZSk7Ci0gIH0KLQotICB2YWxhcnJheTxfVHA+IHNoaWZ0KGludCBfX24pIGNvbnN0OwotICB2YWxhcnJheTxfVHA+IGNzaGlmdChpbnQgX19uKSBjb25zdDsKLQotICB2YWxhcnJheTxfVHA+IGFwcGx5KHZhbHVlX3R5cGUgX19mKHZhbHVlX3R5cGUpKSBjb25zdCB7Ci0gICAgdmFsYXJyYXk8X1RwPiBfX3RtcCh0aGlzLT5zaXplKCkpOwotICAgIHRyYW5zZm9ybSh0aGlzLT5fTV9maXJzdCArIDAsIHRoaXMtPl9NX2ZpcnN0ICsgdGhpcy0+X01fc2l6ZSwgX190bXAuX01fZmlyc3QsCi0gICAgICAgICAgICAgIF9fZik7Ci0gICAgcmV0dXJuIF9fdG1wOwotICB9Ci0gIHZhbGFycmF5PF9UcD4gYXBwbHkodmFsdWVfdHlwZSBfX2YoY29uc3QgdmFsdWVfdHlwZSYpKSBjb25zdCB7Ci0gICAgdmFsYXJyYXk8X1RwPiBfX3RtcCh0aGlzLT5zaXplKCkpOwotICAgIHRyYW5zZm9ybSh0aGlzLT5fTV9maXJzdCArIDAsIHRoaXMtPl9NX2ZpcnN0ICsgdGhpcy0+X01fc2l6ZSwgX190bXAuX01fZmlyc3QsCi0gICAgICAgICAgICAgIF9fZik7Ci0gICAgcmV0dXJuIF9fdG1wOwotICB9Ci0KLSAgdm9pZCByZXNpemUoc2l6ZV90IF9fbiwgdmFsdWVfdHlwZSBfX3ggPSB2YWx1ZV90eXBlKCkpIHsKLSAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95X1JhbmdlKHRoaXMtPl9NX2ZpcnN0LCB0aGlzLT5fTV9maXJzdCArIHRoaXMtPl9NX3NpemUpOwotICAgIF9WYWxhcnJheV9iYXNlPF9UcD46Ol9NX2RlYWxsb2NhdGUoKTsKLSAgICBfVmFsYXJyYXlfYmFzZTxfVHA+OjpfTV9hbGxvY2F0ZShfX24pOwotICAgIHVuaW5pdGlhbGl6ZWRfZmlsbF9uKHRoaXMtPl9NX2ZpcnN0LCB0aGlzLT5fTV9zaXplLCBfX3gpOwotICB9Ci19OwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHZhbGFycmF5IG5vbi1tZW1iZXIgZnVuY3Rpb25zLgotCi0vLyBCaW5hcnkgYXJpdGhtZXRpYyBvcGVyYXRpb25zIGJldHdlZW4gdHdvIGFycmF5cy4gIEJlaGF2aW9yIGlzCi0vLyB1bmRlZmluZWQgaWYgdGhlIHR3byBhcnJheXMgZG8gbm90IGhhdmUgdGhlIHNhbWUgbGVuZ3RoLgotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotaW5saW5lIHZhbGFycmF5PF9UcD4gIF9TVExQX0NBTEwgb3BlcmF0b3IqKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWxhcnJheTxfVHA+JiBfX3kpIHsKLSAgdHlwZWRlZiB0eXBlbmFtZSB2YWxhcnJheTxfVHA+OjpfTm9Jbml0IF9Ob0luaXQ7Ci0gIHZhbGFycmF5PF9UcD4gX190bXAoX194LnNpemUoKSwgX05vSW5pdCgpKTsKLSAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCi0gICAgX190bXBbX19pXSA9IF9feFtfX2ldICogX195W19faV07Ci0gIHJldHVybiBfX3RtcDsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWlubGluZSB2YWxhcnJheTxfVHA+ICBfU1RMUF9DQUxMIG9wZXJhdG9yLyhjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsYXJyYXk8X1RwPiYgX195KSB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OwotICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7Ci0gIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQotICAgIF9fdG1wW19faV0gPSBfX3hbX19pXSAvIF9feVtfX2ldOwotICByZXR1cm4gX190bXA7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgdmFsYXJyYXk8X1RwPiAgX1NUTFBfQ0FMTCBvcGVyYXRvciUoY29uc3QgdmFsYXJyYXk8X1RwPiYgX194LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feSkgewotICB0eXBlZGVmIHR5cGVuYW1lIHZhbGFycmF5PF9UcD46Ol9Ob0luaXQgX05vSW5pdDsKLSAgdmFsYXJyYXk8X1RwPiBfX3RtcChfX3guc2l6ZSgpLCBfTm9Jbml0KCkpOwotICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKLSAgICBfX3RtcFtfX2ldID0gX194W19faV0gJSBfX3lbX19pXTsKLSAgcmV0dXJuIF9fdG1wOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotaW5saW5lIHZhbGFycmF5PF9UcD4gIF9TVExQX0NBTEwgb3BlcmF0b3IrKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWxhcnJheTxfVHA+JiBfX3kpIHsKLSAgdHlwZWRlZiB0eXBlbmFtZSB2YWxhcnJheTxfVHA+OjpfTm9Jbml0IF9Ob0luaXQ7Ci0gIHZhbGFycmF5PF9UcD4gX190bXAoX194LnNpemUoKSwgX05vSW5pdCgpKTsKLSAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCi0gICAgX190bXBbX19pXSA9IF9feFtfX2ldICsgX195W19faV07Ci0gIHJldHVybiBfX3RtcDsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWlubGluZSB2YWxhcnJheTxfVHA+ICBfU1RMUF9DQUxMIG9wZXJhdG9yLShjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsYXJyYXk8X1RwPiYgX195KSB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OwotICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7Ci0gIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQotICAgIF9fdG1wW19faV0gPSBfX3hbX19pXSAtIF9feVtfX2ldOwotICByZXR1cm4gX190bXA7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgdmFsYXJyYXk8X1RwPiBfU1RMUF9DQUxMIG9wZXJhdG9yXihjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsYXJyYXk8X1RwPiYgX195KSB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OwotICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7Ci0gIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQotICAgIF9fdG1wW19faV0gPSBfX3hbX19pXSBeIF9feVtfX2ldOwotICByZXR1cm4gX190bXA7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgdmFsYXJyYXk8X1RwPiBfU1RMUF9DQUxMIG9wZXJhdG9yJihjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsYXJyYXk8X1RwPiYgX195KSB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OwotICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7Ci0gIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQotICAgIF9fdG1wW19faV0gPSBfX3hbX19pXSAmIF9feVtfX2ldOwotICByZXR1cm4gX190bXA7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgdmFsYXJyYXk8X1RwPiBfU1RMUF9DQUxMIG9wZXJhdG9yfChjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsYXJyYXk8X1RwPiYgX195KSB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OwotICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7Ci0gIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQotICAgIF9fdG1wW19faV0gPSBfX3hbX19pXSB8IF9feVtfX2ldOwotICByZXR1cm4gX190bXA7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgdmFsYXJyYXk8X1RwPiBfU1RMUF9DQUxMIG9wZXJhdG9yPDwoY29uc3QgdmFsYXJyYXk8X1RwPiYgX194LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feSkgewotICB0eXBlZGVmIHR5cGVuYW1lIHZhbGFycmF5PF9UcD46Ol9Ob0luaXQgX05vSW5pdDsKLSAgdmFsYXJyYXk8X1RwPiBfX3RtcChfX3guc2l6ZSgpLCBfTm9Jbml0KCkpOwotICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKLSAgICBfX3RtcFtfX2ldID0gX194W19faV0gPDwgX195W19faV07Ci0gIHJldHVybiBfX3RtcDsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWlubGluZSB2YWxhcnJheTxfVHA+IF9TVExQX0NBTEwgb3BlcmF0b3I+Pihjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsYXJyYXk8X1RwPiYgX195KSB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OwotICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7Ci0gIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQotICAgIF9fdG1wW19faV0gPSBfX3hbX19pXSA+PiBfX3lbX19pXTsKLSAgcmV0dXJuIF9fdG1wOwotfQotCi0vLyBCaW5hcnkgYXJpdGhtZXRpYyBvcGVyYXRpb25zIGJldHdlZW4gYW4gYXJyYXkgYW5kIGEgc2NhbGFyLgotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotaW5saW5lIHZhbGFycmF5PF9UcD4gX1NUTFBfQ0FMTCBvcGVyYXRvciooY29uc3QgdmFsYXJyYXk8X1RwPiYgX194LCBjb25zdCBfVHAmIF9fYykgewotICB0eXBlZGVmIHR5cGVuYW1lIHZhbGFycmF5PF9UcD46Ol9Ob0luaXQgX05vSW5pdDsKLSAgdmFsYXJyYXk8X1RwPiBfX3RtcChfX3guc2l6ZSgpLCBfTm9Jbml0KCkpOwotICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKLSAgICBfX3RtcFtfX2ldID0gX194W19faV0gICogX19jOwotICByZXR1cm4gX190bXA7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgdmFsYXJyYXk8X1RwPiBfU1RMUF9DQUxMIG9wZXJhdG9yKihjb25zdCBfVHAmIF9fYywgY29uc3QgdmFsYXJyYXk8X1RwPiYgX194KSB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OwotICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7Ci0gIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQotICAgIF9fdG1wW19faV0gPSBfX2MgKiBfX3hbX19pXTsKLSAgcmV0dXJuIF9fdG1wOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotaW5saW5lIHZhbGFycmF5PF9UcD4gX1NUTFBfQ0FMTCBvcGVyYXRvci8oY29uc3QgdmFsYXJyYXk8X1RwPiYgX194LCBjb25zdCBfVHAmIF9fYykgewotICB0eXBlZGVmIHR5cGVuYW1lIHZhbGFycmF5PF9UcD46Ol9Ob0luaXQgX05vSW5pdDsKLSAgdmFsYXJyYXk8X1RwPiBfX3RtcChfX3guc2l6ZSgpLCBfTm9Jbml0KCkpOwotICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKLSAgICBfX3RtcFtfX2ldID0gX194W19faV0gIC8gX19jOwotICByZXR1cm4gX190bXA7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgdmFsYXJyYXk8X1RwPiBfU1RMUF9DQUxMIG9wZXJhdG9yLyhjb25zdCBfVHAmIF9fYywgY29uc3QgdmFsYXJyYXk8X1RwPiYgX194KSB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OwotICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7Ci0gIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQotICAgIF9fdG1wW19faV0gPSBfX2MgLyBfX3hbX19pXTsKLSAgcmV0dXJuIF9fdG1wOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotaW5saW5lIHZhbGFycmF5PF9UcD4gX1NUTFBfQ0FMTCBvcGVyYXRvciUoY29uc3QgdmFsYXJyYXk8X1RwPiYgX194LCBjb25zdCBfVHAmIF9fYykgewotICB0eXBlZGVmIHR5cGVuYW1lIHZhbGFycmF5PF9UcD46Ol9Ob0luaXQgX05vSW5pdDsKLSAgdmFsYXJyYXk8X1RwPiBfX3RtcChfX3guc2l6ZSgpLCBfTm9Jbml0KCkpOwotICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKLSAgICBfX3RtcFtfX2ldID0gX194W19faV0gICUgX19jOwotICByZXR1cm4gX190bXA7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgdmFsYXJyYXk8X1RwPiBfU1RMUF9DQUxMIG9wZXJhdG9yJShjb25zdCBfVHAmIF9fYywgY29uc3QgdmFsYXJyYXk8X1RwPiYgX194KSB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OwotICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7Ci0gIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQotICAgIF9fdG1wW19faV0gPSBfX2MgJSBfX3hbX19pXTsKLSAgcmV0dXJuIF9fdG1wOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotaW5saW5lIHZhbGFycmF5PF9UcD4gX1NUTFBfQ0FMTCBvcGVyYXRvcisoY29uc3QgdmFsYXJyYXk8X1RwPiYgX194LCBjb25zdCBfVHAmIF9fYykgewotICB0eXBlZGVmIHR5cGVuYW1lIHZhbGFycmF5PF9UcD46Ol9Ob0luaXQgX05vSW5pdDsKLSAgdmFsYXJyYXk8X1RwPiBfX3RtcChfX3guc2l6ZSgpLCBfTm9Jbml0KCkpOwotICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKLSAgICBfX3RtcFtfX2ldID0gX194W19faV0gICsgX19jOwotICByZXR1cm4gX190bXA7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgdmFsYXJyYXk8X1RwPiBfU1RMUF9DQUxMIG9wZXJhdG9yKyhjb25zdCBfVHAmIF9fYywgY29uc3QgdmFsYXJyYXk8X1RwPiYgX194KSB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OwotICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7Ci0gIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQotICAgIF9fdG1wW19faV0gPSBfX2MgKyBfX3hbX19pXTsKLSAgcmV0dXJuIF9fdG1wOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotaW5saW5lIHZhbGFycmF5PF9UcD4gX1NUTFBfQ0FMTCBvcGVyYXRvci0oY29uc3QgdmFsYXJyYXk8X1RwPiYgX194LCBjb25zdCBfVHAmIF9fYykgewotICB0eXBlZGVmIHR5cGVuYW1lIHZhbGFycmF5PF9UcD46Ol9Ob0luaXQgX05vSW5pdDsKLSAgdmFsYXJyYXk8X1RwPiBfX3RtcChfX3guc2l6ZSgpLCBfTm9Jbml0KCkpOwotICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKLSAgICBfX3RtcFtfX2ldID0gX194W19faV0gIC0gX19jOwotICByZXR1cm4gX190bXA7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgdmFsYXJyYXk8X1RwPiBfU1RMUF9DQUxMIG9wZXJhdG9yLShjb25zdCBfVHAmIF9fYywgY29uc3QgdmFsYXJyYXk8X1RwPiYgX194KSB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OwotICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7Ci0gIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQotICAgIF9fdG1wW19faV0gPSBfX2MgLSBfX3hbX19pXTsKLSAgcmV0dXJuIF9fdG1wOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotaW5saW5lIHZhbGFycmF5PF9UcD4gX1NUTFBfQ0FMTCBvcGVyYXRvcl4oY29uc3QgdmFsYXJyYXk8X1RwPiYgX194LCBjb25zdCBfVHAmIF9fYykgewotICB0eXBlZGVmIHR5cGVuYW1lIHZhbGFycmF5PF9UcD46Ol9Ob0luaXQgX05vSW5pdDsKLSAgdmFsYXJyYXk8X1RwPiBfX3RtcChfX3guc2l6ZSgpLCBfTm9Jbml0KCkpOwotICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKLSAgICBfX3RtcFtfX2ldID0gX194W19faV0gIF4gX19jOwotICByZXR1cm4gX190bXA7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgdmFsYXJyYXk8X1RwPiBfU1RMUF9DQUxMIG9wZXJhdG9yXihjb25zdCBfVHAmIF9fYywgY29uc3QgdmFsYXJyYXk8X1RwPiYgX194KSB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OwotICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7Ci0gIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQotICAgIF9fdG1wW19faV0gPSBfX2MgXiBfX3hbX19pXTsKLSAgcmV0dXJuIF9fdG1wOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotaW5saW5lIHZhbGFycmF5PF9UcD4gX1NUTFBfQ0FMTCBvcGVyYXRvciYoY29uc3QgdmFsYXJyYXk8X1RwPiYgX194LCBjb25zdCBfVHAmIF9fYykgewotICB0eXBlZGVmIHR5cGVuYW1lIHZhbGFycmF5PF9UcD46Ol9Ob0luaXQgX05vSW5pdDsKLSAgdmFsYXJyYXk8X1RwPiBfX3RtcChfX3guc2l6ZSgpLCBfTm9Jbml0KCkpOwotICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKLSAgICBfX3RtcFtfX2ldID0gX194W19faV0gICYgX19jOwotICByZXR1cm4gX190bXA7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgdmFsYXJyYXk8X1RwPiBfU1RMUF9DQUxMIG9wZXJhdG9yJihjb25zdCBfVHAmIF9fYywgY29uc3QgdmFsYXJyYXk8X1RwPiYgX194KSB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OwotICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7Ci0gIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQotICAgIF9fdG1wW19faV0gPSBfX2MgJiBfX3hbX19pXTsKLSAgcmV0dXJuIF9fdG1wOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotaW5saW5lIHZhbGFycmF5PF9UcD4gX1NUTFBfQ0FMTCBvcGVyYXRvcnwoY29uc3QgdmFsYXJyYXk8X1RwPiYgX194LCBjb25zdCBfVHAmIF9fYykgewotICB0eXBlZGVmIHR5cGVuYW1lIHZhbGFycmF5PF9UcD46Ol9Ob0luaXQgX05vSW5pdDsKLSAgdmFsYXJyYXk8X1RwPiBfX3RtcChfX3guc2l6ZSgpLCBfTm9Jbml0KCkpOwotICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKLSAgICBfX3RtcFtfX2ldID0gX194W19faV0gIHwgX19jOwotICByZXR1cm4gX190bXA7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgdmFsYXJyYXk8X1RwPiBfU1RMUF9DQUxMIG9wZXJhdG9yfChjb25zdCBfVHAmIF9fYywgY29uc3QgdmFsYXJyYXk8X1RwPiYgX194KSB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OwotICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7Ci0gIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQotICAgIF9fdG1wW19faV0gPSBfX2MgfCBfX3hbX19pXTsKLSAgcmV0dXJuIF9fdG1wOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotaW5saW5lIHZhbGFycmF5PF9UcD4gX1NUTFBfQ0FMTCBvcGVyYXRvcjw8KGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCwgY29uc3QgX1RwJiBfX2MpIHsKLSAgdHlwZWRlZiB0eXBlbmFtZSB2YWxhcnJheTxfVHA+OjpfTm9Jbml0IF9Ob0luaXQ7Ci0gIHZhbGFycmF5PF9UcD4gX190bXAoX194LnNpemUoKSwgX05vSW5pdCgpKTsKLSAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCi0gICAgX190bXBbX19pXSA9IF9feFtfX2ldICA8PCBfX2M7Ci0gIHJldHVybiBfX3RtcDsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWlubGluZSB2YWxhcnJheTxfVHA+IF9TVExQX0NBTEwgb3BlcmF0b3I8PChjb25zdCBfVHAmIF9fYywgY29uc3QgdmFsYXJyYXk8X1RwPiYgX194KSB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OwotICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7Ci0gIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQotICAgIF9fdG1wW19faV0gPSBfX2MgPDwgX194W19faV07Ci0gIHJldHVybiBfX3RtcDsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWlubGluZSB2YWxhcnJheTxfVHA+IF9TVExQX0NBTEwgb3BlcmF0b3I+Pihjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gsIGNvbnN0IF9UcCYgX19jKSB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OwotICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7Ci0gIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQotICAgIF9fdG1wW19faV0gPSBfX3hbX19pXSAgPj4gX19jOwotICByZXR1cm4gX190bXA7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgdmFsYXJyYXk8X1RwPiBfU1RMUF9DQUxMIG9wZXJhdG9yPj4oY29uc3QgX1RwJiBfX2MsIGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCkgewotICB0eXBlZGVmIHR5cGVuYW1lIHZhbGFycmF5PF9UcD46Ol9Ob0luaXQgX05vSW5pdDsKLSAgdmFsYXJyYXk8X1RwPiBfX3RtcChfX3guc2l6ZSgpLCBfTm9Jbml0KCkpOwotICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKLSAgICBfX3RtcFtfX2ldID0gX19jID4+IF9feFtfX2ldOwotICByZXR1cm4gX190bXA7Ci19Ci0KLS8vIEJpbmFyeSBsb2dpY2FsIG9wZXJhdGlvbnMgYmV0d2VlbiB0d28gYXJyYXlzLiAgQmVoYXZpb3IgaXMgdW5kZWZpbmVkCi0vLyBpZiB0aGUgdHdvIGFycmF5cyBoYXZlIGRpZmZlcmVudCBsZW5ndGhzLiAgTm90ZSB0aGF0IG9wZXJhdG9yPT0gZG9lcwotLy8gbm90IGRvIHdoYXQgeW91IG1pZ2h0IGF0IGZpcnN0IGV4cGVjdC4KLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWlubGluZSBfVmFsYXJyYXlfYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yPT0oY29uc3QgdmFsYXJyYXk8X1RwPiYgX194LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsYXJyYXk8X1RwPiYgX195KQotewotICBfVmFsYXJyYXlfYm9vbCBfX3RtcChfX3guc2l6ZSgpLCBfVmFsYXJyYXlfYm9vbDo6X05vSW5pdCgpKTsKLSAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCi0gICAgX190bXBbX19pXSA9IF9feFtfX2ldID09IF9feVtfX2ldOwotICByZXR1cm4gX190bXA7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgX1ZhbGFycmF5X2Jvb2wgX1NUTFBfQ0FMTCBvcGVyYXRvcjwoY29uc3QgdmFsYXJyYXk8X1RwPiYgX194LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWxhcnJheTxfVHA+JiBfX3kpCi17Ci0gIF9WYWxhcnJheV9ib29sIF9fdG1wKF9feC5zaXplKCksIF9WYWxhcnJheV9ib29sOjpfTm9Jbml0KCkpOwotICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKLSAgICBfX3RtcFtfX2ldID0gX194W19faV0gPCBfX3lbX19pXTsKLSAgcmV0dXJuIF9fdG1wOwotfQotCi0jaWZkZWYgX1NUTFBfVVNFX1NFUEFSQVRFX1JFTE9QU19OQU1FU1BBQ0UKLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWlubGluZSBfVmFsYXJyYXlfYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yIT0oY29uc3QgdmFsYXJyYXk8X1RwPiYgX194LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsYXJyYXk8X1RwPiYgX195KQotewotICBfVmFsYXJyYXlfYm9vbCBfX3RtcChfX3guc2l6ZSgpLCBfVmFsYXJyYXlfYm9vbDo6X05vSW5pdCgpKTsKLSAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCi0gICAgX190bXBbX19pXSA9IF9feFtfX2ldICE9IF9feVtfX2ldOwotICByZXR1cm4gX190bXA7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgX1ZhbGFycmF5X2Jvb2wgX1NUTFBfQ0FMTCBvcGVyYXRvcj4oY29uc3QgdmFsYXJyYXk8X1RwPiYgX194LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWxhcnJheTxfVHA+JiBfX3kpCi17Ci0gIF9WYWxhcnJheV9ib29sIF9fdG1wKF9feC5zaXplKCksIF9WYWxhcnJheV9ib29sOjpfTm9Jbml0KCkpOwotICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKLSAgICBfX3RtcFtfX2ldID0gX194W19faV0gPiBfX3lbX19pXTsKLSAgcmV0dXJuIF9fdG1wOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotaW5saW5lIF9WYWxhcnJheV9ib29sIF9TVExQX0NBTEwgb3BlcmF0b3I8PShjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWxhcnJheTxfVHA+JiBfX3kpCi17Ci0gIF9WYWxhcnJheV9ib29sIF9fdG1wKF9feC5zaXplKCksIF9WYWxhcnJheV9ib29sOjpfTm9Jbml0KCkpOwotICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKLSAgICBfX3RtcFtfX2ldID0gX194W19faV0gPD0gX195W19faV07Ci0gIHJldHVybiBfX3RtcDsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWlubGluZSBfVmFsYXJyYXlfYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yPj0oY29uc3QgdmFsYXJyYXk8X1RwPiYgX194LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsYXJyYXk8X1RwPiYgX195KQotewotICBfVmFsYXJyYXlfYm9vbCBfX3RtcChfX3guc2l6ZSgpLCBfVmFsYXJyYXlfYm9vbDo6X05vSW5pdCgpKTsKLSAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCi0gICAgX190bXBbX19pXSA9IF9feFtfX2ldID49IF9feVtfX2ldOwotICByZXR1cm4gX190bXA7Ci19Ci0KLSNlbmRpZiAvKiBfU1RMUF9VU0VfU0VQQVJBVEVfUkVMT1BTX05BTUVTUEFDRSAqLwotLy8gZmJwIDogc3dhcCA/Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgX1ZhbGFycmF5X2Jvb2wgX1NUTFBfQ0FMTCBvcGVyYXRvciYmKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feSkKLXsKLSAgX1ZhbGFycmF5X2Jvb2wgX190bXAoX194LnNpemUoKSwgX1ZhbGFycmF5X2Jvb2w6Ol9Ob0luaXQoKSk7Ci0gIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQotICAgIF9fdG1wW19faV0gPSBfX3hbX19pXSAmJiBfX3lbX19pXTsKLSAgcmV0dXJuIF9fdG1wOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotaW5saW5lIF9WYWxhcnJheV9ib29sIF9TVExQX0NBTEwgb3BlcmF0b3J8fChjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWxhcnJheTxfVHA+JiBfX3kpCi17Ci0gIF9WYWxhcnJheV9ib29sIF9fdG1wKF9feC5zaXplKCksIF9WYWxhcnJheV9ib29sOjpfTm9Jbml0KCkpOwotICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKLSAgICBfX3RtcFtfX2ldID0gX194W19faV0gfHwgX195W19faV07Ci0gIHJldHVybiBfX3RtcDsKLX0KLQotLy8gTG9naWNhbCBvcGVyYXRpb25zIGJldHdlZW4gYW4gYXJyYXkgYW5kIGEgc2NhbGFyLgotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotaW5saW5lIF9WYWxhcnJheV9ib29sIF9TVExQX0NBTEwgb3BlcmF0b3I9PShjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gsIGNvbnN0IF9UcCYgX19jKQotewotICBfVmFsYXJyYXlfYm9vbCBfX3RtcChfX3guc2l6ZSgpLCBfVmFsYXJyYXlfYm9vbDo6X05vSW5pdCgpKTsKLSAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCi0gICAgX190bXBbX19pXSA9IF9feFtfX2ldID09IF9fYzsKLSAgcmV0dXJuIF9fdG1wOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotaW5saW5lIF9WYWxhcnJheV9ib29sIF9TVExQX0NBTEwgb3BlcmF0b3I9PShjb25zdCBfVHAmIF9fYywgY29uc3QgdmFsYXJyYXk8X1RwPiYgX194KQotewotICBfVmFsYXJyYXlfYm9vbCBfX3RtcChfX3guc2l6ZSgpLCBfVmFsYXJyYXlfYm9vbDo6X05vSW5pdCgpKTsKLSAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCi0gICAgX190bXBbX19pXSA9IF9fYyA9PSBfX3hbX19pXTsKLSAgcmV0dXJuIF9fdG1wOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotaW5saW5lIF9WYWxhcnJheV9ib29sIF9TVExQX0NBTEwgb3BlcmF0b3IhPShjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gsIGNvbnN0IF9UcCYgX19jKQotewotICBfVmFsYXJyYXlfYm9vbCBfX3RtcChfX3guc2l6ZSgpLCBfVmFsYXJyYXlfYm9vbDo6X05vSW5pdCgpKTsKLSAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCi0gICAgX190bXBbX19pXSA9IF9feFtfX2ldICE9IF9fYzsKLSAgcmV0dXJuIF9fdG1wOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotaW5saW5lIF9WYWxhcnJheV9ib29sIF9TVExQX0NBTEwgb3BlcmF0b3IhPShjb25zdCBfVHAmIF9fYywgY29uc3QgdmFsYXJyYXk8X1RwPiYgX194KQotewotICBfVmFsYXJyYXlfYm9vbCBfX3RtcChfX3guc2l6ZSgpLCBfVmFsYXJyYXlfYm9vbDo6X05vSW5pdCgpKTsKLSAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCi0gICAgX190bXBbX19pXSA9IF9fYyAhPSBfX3hbX19pXTsKLSAgcmV0dXJuIF9fdG1wOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotaW5saW5lIF9WYWxhcnJheV9ib29sIF9TVExQX0NBTEwgb3BlcmF0b3I8KGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCwgY29uc3QgX1RwJiBfX2MpCi17Ci0gIF9WYWxhcnJheV9ib29sIF9fdG1wKF9feC5zaXplKCksIF9WYWxhcnJheV9ib29sOjpfTm9Jbml0KCkpOwotICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKLSAgICBfX3RtcFtfX2ldID0gX194W19faV0gPCBfX2M7Ci0gIHJldHVybiBfX3RtcDsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWlubGluZSBfVmFsYXJyYXlfYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yPChjb25zdCBfVHAmIF9fYywgY29uc3QgdmFsYXJyYXk8X1RwPiYgX194KQotewotICBfVmFsYXJyYXlfYm9vbCBfX3RtcChfX3guc2l6ZSgpLCBfVmFsYXJyYXlfYm9vbDo6X05vSW5pdCgpKTsKLSAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCi0gICAgX190bXBbX19pXSA9IF9fYyA8IF9feFtfX2ldOwotICByZXR1cm4gX190bXA7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgX1ZhbGFycmF5X2Jvb2wgX1NUTFBfQ0FMTCBvcGVyYXRvcj4oY29uc3QgdmFsYXJyYXk8X1RwPiYgX194LCBjb25zdCBfVHAmIF9fYykKLXsKLSAgX1ZhbGFycmF5X2Jvb2wgX190bXAoX194LnNpemUoKSwgX1ZhbGFycmF5X2Jvb2w6Ol9Ob0luaXQoKSk7Ci0gIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQotICAgIF9fdG1wW19faV0gPSBfX3hbX19pXSA+IF9fYzsKLSAgcmV0dXJuIF9fdG1wOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotaW5saW5lIF9WYWxhcnJheV9ib29sIF9TVExQX0NBTEwgb3BlcmF0b3I+KGNvbnN0IF9UcCYgX19jLCBjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gpCi17Ci0gIF9WYWxhcnJheV9ib29sIF9fdG1wKF9feC5zaXplKCksIF9WYWxhcnJheV9ib29sOjpfTm9Jbml0KCkpOwotICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKLSAgICBfX3RtcFtfX2ldID0gX19jID4gX194W19faV07Ci0gIHJldHVybiBfX3RtcDsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWlubGluZSBfVmFsYXJyYXlfYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yPD0oY29uc3QgdmFsYXJyYXk8X1RwPiYgX194LCBjb25zdCBfVHAmIF9fYykKLXsKLSAgX1ZhbGFycmF5X2Jvb2wgX190bXAoX194LnNpemUoKSwgX1ZhbGFycmF5X2Jvb2w6Ol9Ob0luaXQoKSk7Ci0gIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQotICAgIF9fdG1wW19faV0gPSBfX3hbX19pXSAgPD0gX19jOwotICByZXR1cm4gX190bXA7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgX1ZhbGFycmF5X2Jvb2wgX1NUTFBfQ0FMTCBvcGVyYXRvcjw9KGNvbnN0IF9UcCYgX19jLCBjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gpCi17Ci0gIF9WYWxhcnJheV9ib29sIF9fdG1wKF9feC5zaXplKCksIF9WYWxhcnJheV9ib29sOjpfTm9Jbml0KCkpOwotICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKLSAgICBfX3RtcFtfX2ldID0gX19jIDw9IF9feFtfX2ldOwotICByZXR1cm4gX190bXA7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgX1ZhbGFycmF5X2Jvb2wgX1NUTFBfQ0FMTCBvcGVyYXRvcj49KGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCwgY29uc3QgX1RwJiBfX2MpCi17Ci0gIF9WYWxhcnJheV9ib29sIF9fdG1wKF9feC5zaXplKCksIF9WYWxhcnJheV9ib29sOjpfTm9Jbml0KCkpOwotICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKLSAgICBfX3RtcFtfX2ldID0gX194W19faV0gPj0gX19jOwotICByZXR1cm4gX190bXA7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgX1ZhbGFycmF5X2Jvb2wgX1NUTFBfQ0FMTCBvcGVyYXRvcj49KGNvbnN0IF9UcCYgX19jLCBjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gpCi17Ci0gIF9WYWxhcnJheV9ib29sIF9fdG1wKF9feC5zaXplKCksIF9WYWxhcnJheV9ib29sOjpfTm9Jbml0KCkpOwotICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKLSAgICBfX3RtcFtfX2ldID0gX19jID49IF9feFtfX2ldOwotICByZXR1cm4gX190bXA7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgX1ZhbGFycmF5X2Jvb2wgX1NUTFBfQ0FMTCBvcGVyYXRvciYmKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCwgY29uc3QgX1RwJiBfX2MpCi17Ci0gIF9WYWxhcnJheV9ib29sIF9fdG1wKF9feC5zaXplKCksIF9WYWxhcnJheV9ib29sOjpfTm9Jbml0KCkpOwotICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKLSAgICBfX3RtcFtfX2ldID0gX194W19faV0gJiYgX19jOwotICByZXR1cm4gX190bXA7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgX1ZhbGFycmF5X2Jvb2wgX1NUTFBfQ0FMTCBvcGVyYXRvciYmKGNvbnN0IF9UcCYgX19jLCBjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gpCi17Ci0gIF9WYWxhcnJheV9ib29sIF9fdG1wKF9feC5zaXplKCksIF9WYWxhcnJheV9ib29sOjpfTm9Jbml0KCkpOwotICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKLSAgICBfX3RtcFtfX2ldID0gX19jICYmIF9feFtfX2ldOwotICByZXR1cm4gX190bXA7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgX1ZhbGFycmF5X2Jvb2wgX1NUTFBfQ0FMTCBvcGVyYXRvcnx8KGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCwgY29uc3QgX1RwJiBfX2MpCi17Ci0gIF9WYWxhcnJheV9ib29sIF9fdG1wKF9feC5zaXplKCksIF9WYWxhcnJheV9ib29sOjpfTm9Jbml0KCkpOwotICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKLSAgICBfX3RtcFtfX2ldID0gX194W19faV0gfHwgX19jOwotICByZXR1cm4gX190bXA7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgX1ZhbGFycmF5X2Jvb2wgX1NUTFBfQ0FMTCBvcGVyYXRvcnx8KGNvbnN0IF9UcCYgX19jLCBjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gpCi17Ci0gIF9WYWxhcnJheV9ib29sIF9fdG1wKF9feC5zaXplKCksIF9WYWxhcnJheV9ib29sOjpfTm9Jbml0KCkpOwotICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKLSAgICBfX3RtcFtfX2ldID0gX19jIHx8IF9feFtfX2ldOwotICByZXR1cm4gX190bXA7Ci19Ci0KLS8vIHZhbGFycmF5ICJ0cmFuc2NlbmRlbnRhbHMiICh0aGUgbGlzdCBpbmNsdWRlcyBhYnMgYW5kIHNxcnQsIHdoaWNoLAotLy8gb2YgY291cnNlLCBhcmUgbm90IHRyYW5zY2VuZGVudGFsKS4KLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWlubGluZSB2YWxhcnJheTxfVHA+IGFicyhjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gpIHsKLSAgdHlwZWRlZiB0eXBlbmFtZSB2YWxhcnJheTxfVHA+OjpfTm9Jbml0IF9Ob0luaXQ7Ci0gIHZhbGFycmF5PF9UcD4gX190bXAoX194LnNpemUoKSwgX05vSW5pdCgpKTsKLSAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCi0gICAgX190bXBbX19pXSA9IDo6YWJzKF9feFtfX2ldKTsKLSAgcmV0dXJuIF9fdG1wOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotaW5saW5lIHZhbGFycmF5PF9UcD4gYWNvcyhjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gpIHsKLSAgdHlwZWRlZiB0eXBlbmFtZSB2YWxhcnJheTxfVHA+OjpfTm9Jbml0IF9Ob0luaXQ7Ci0gIHZhbGFycmF5PF9UcD4gX190bXAoX194LnNpemUoKSwgX05vSW5pdCgpKTsKLSAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCi0gICAgX190bXBbX19pXSA9IDo6YWNvcyhfX3hbX19pXSk7Ci0gIHJldHVybiBfX3RtcDsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWlubGluZSB2YWxhcnJheTxfVHA+IGFzaW4oY29uc3QgdmFsYXJyYXk8X1RwPiYgX194KSB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OwotICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7Ci0gIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQotICAgIF9fdG1wW19faV0gPSA6OmFzaW4oX194W19faV0pOwotICByZXR1cm4gX190bXA7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgdmFsYXJyYXk8X1RwPiBhdGFuKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCkgewotICB0eXBlZGVmIHR5cGVuYW1lIHZhbGFycmF5PF9UcD46Ol9Ob0luaXQgX05vSW5pdDsKLSAgdmFsYXJyYXk8X1RwPiBfX3RtcChfX3guc2l6ZSgpLCBfTm9Jbml0KCkpOwotICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKLSAgICBfX3RtcFtfX2ldID0gOjphdGFuKF9feFtfX2ldKTsKLSAgcmV0dXJuIF9fdG1wOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotaW5saW5lIHZhbGFycmF5PF9UcD4gYXRhbjIoY29uc3QgdmFsYXJyYXk8X1RwPiYgX194LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsYXJyYXk8X1RwPiYgX195KSB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OwotICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7Ci0gIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQotICAgIF9fdG1wW19faV0gPSA6OmF0YW4yKF9feFtfX2ldLCBfX3lbX19pXSk7Ci0gIHJldHVybiBfX3RtcDsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWlubGluZSB2YWxhcnJheTxfVHA+IGF0YW4yKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCwgY29uc3QgX1RwJiBfX2MpIHsKLSAgdHlwZWRlZiB0eXBlbmFtZSB2YWxhcnJheTxfVHA+OjpfTm9Jbml0IF9Ob0luaXQ7Ci0gIHZhbGFycmF5PF9UcD4gX190bXAoX194LnNpemUoKSwgX05vSW5pdCgpKTsKLSAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCi0gICAgX190bXBbX19pXSA9IDo6YXRhbjIoX194W19faV0sIF9fYyk7Ci0gIHJldHVybiBfX3RtcDsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWlubGluZSB2YWxhcnJheTxfVHA+IGF0YW4yKGNvbnN0IF9UcCYgX19jLCBjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gpIHsKLSAgdHlwZWRlZiB0eXBlbmFtZSB2YWxhcnJheTxfVHA+OjpfTm9Jbml0IF9Ob0luaXQ7Ci0gIHZhbGFycmF5PF9UcD4gX190bXAoX194LnNpemUoKSwgX05vSW5pdCgpKTsKLSAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCi0gICAgX190bXBbX19pXSA9IDo6YXRhbjIoX19jLCBfX3hbX19pXSk7Ci0gIHJldHVybiBfX3RtcDsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWlubGluZSB2YWxhcnJheTxfVHA+IGNvcyhjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gpIHsKLSAgdHlwZWRlZiB0eXBlbmFtZSB2YWxhcnJheTxfVHA+OjpfTm9Jbml0IF9Ob0luaXQ7Ci0gIHZhbGFycmF5PF9UcD4gX190bXAoX194LnNpemUoKSwgX05vSW5pdCgpKTsKLSAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCi0gICAgX190bXBbX19pXSA9IDo6Y29zKF9feFtfX2ldKTsKLSAgcmV0dXJuIF9fdG1wOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotaW5saW5lIHZhbGFycmF5PF9UcD4gY29zaChjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gpIHsKLSAgdHlwZWRlZiB0eXBlbmFtZSB2YWxhcnJheTxfVHA+OjpfTm9Jbml0IF9Ob0luaXQ7Ci0gIHZhbGFycmF5PF9UcD4gX190bXAoX194LnNpemUoKSwgX05vSW5pdCgpKTsKLSAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCi0gICAgX190bXBbX19pXSA9IDo6Y29zaChfX3hbX19pXSk7Ci0gIHJldHVybiBfX3RtcDsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWlubGluZSB2YWxhcnJheTxfVHA+IGV4cChjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gpIHsKLSAgdHlwZWRlZiB0eXBlbmFtZSB2YWxhcnJheTxfVHA+OjpfTm9Jbml0IF9Ob0luaXQ7Ci0gIHZhbGFycmF5PF9UcD4gX190bXAoX194LnNpemUoKSwgX05vSW5pdCgpKTsKLSAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCi0gICAgX190bXBbX19pXSA9IDo6ZXhwKF9feFtfX2ldKTsKLSAgcmV0dXJuIF9fdG1wOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotaW5saW5lIHZhbGFycmF5PF9UcD4gbG9nKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCkgewotICB0eXBlZGVmIHR5cGVuYW1lIHZhbGFycmF5PF9UcD46Ol9Ob0luaXQgX05vSW5pdDsKLSAgdmFsYXJyYXk8X1RwPiBfX3RtcChfX3guc2l6ZSgpLCBfTm9Jbml0KCkpOwotICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKLSAgICBfX3RtcFtfX2ldID0gOjpsb2coX194W19faV0pOwotICByZXR1cm4gX190bXA7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgdmFsYXJyYXk8X1RwPiBsb2cxMChjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gpIHsKLSAgdHlwZWRlZiB0eXBlbmFtZSB2YWxhcnJheTxfVHA+OjpfTm9Jbml0IF9Ob0luaXQ7Ci0gIHZhbGFycmF5PF9UcD4gX190bXAoX194LnNpemUoKSwgX05vSW5pdCgpKTsKLSAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCi0gICAgX190bXBbX19pXSA9IDo6bG9nMTAoX194W19faV0pOwotICByZXR1cm4gX190bXA7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgdmFsYXJyYXk8X1RwPiBwb3coY29uc3QgdmFsYXJyYXk8X1RwPiYgX194LAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feSkgewotICB0eXBlZGVmIHR5cGVuYW1lIHZhbGFycmF5PF9UcD46Ol9Ob0luaXQgX05vSW5pdDsKLSAgdmFsYXJyYXk8X1RwPiBfX3RtcChfX3guc2l6ZSgpLCBfTm9Jbml0KCkpOwotICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKLSAgICBfX3RtcFtfX2ldID0gOjpwb3coX194W19faV0sIF9feVtfX2ldKTsKLSAgcmV0dXJuIF9fdG1wOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotaW5saW5lIHZhbGFycmF5PF9UcD4gcG93KGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCwgY29uc3QgX1RwJiBfX2MpIHsKLSAgdHlwZWRlZiB0eXBlbmFtZSB2YWxhcnJheTxfVHA+OjpfTm9Jbml0IF9Ob0luaXQ7Ci0gIHZhbGFycmF5PF9UcD4gX190bXAoX194LnNpemUoKSwgX05vSW5pdCgpKTsKLSAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCi0gICAgX190bXBbX19pXSA9IDo6cG93KF9feFtfX2ldLCBfX2MpOwotICByZXR1cm4gX190bXA7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgdmFsYXJyYXk8X1RwPiBwb3coY29uc3QgX1RwJiBfX2MsIGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCkgewotICB0eXBlZGVmIHR5cGVuYW1lIHZhbGFycmF5PF9UcD46Ol9Ob0luaXQgX05vSW5pdDsKLSAgdmFsYXJyYXk8X1RwPiBfX3RtcChfX3guc2l6ZSgpLCBfTm9Jbml0KCkpOwotICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKLSAgICBfX3RtcFtfX2ldID0gOjpwb3coX19jLCBfX3hbX19pXSk7Ci0gIHJldHVybiBfX3RtcDsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWlubGluZSB2YWxhcnJheTxfVHA+IHNpbihjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gpIHsKLSAgdHlwZWRlZiB0eXBlbmFtZSB2YWxhcnJheTxfVHA+OjpfTm9Jbml0IF9Ob0luaXQ7Ci0gIHZhbGFycmF5PF9UcD4gX190bXAoX194LnNpemUoKSwgX05vSW5pdCgpKTsKLSAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCi0gICAgX190bXBbX19pXSA9IDo6c2luKF9feFtfX2ldKTsKLSAgcmV0dXJuIF9fdG1wOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotaW5saW5lIHZhbGFycmF5PF9UcD4gc2luaChjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gpIHsKLSAgdHlwZWRlZiB0eXBlbmFtZSB2YWxhcnJheTxfVHA+OjpfTm9Jbml0IF9Ob0luaXQ7Ci0gIHZhbGFycmF5PF9UcD4gX190bXAoX194LnNpemUoKSwgX05vSW5pdCgpKTsKLSAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCi0gICAgX190bXBbX19pXSA9IDo6c2luaChfX3hbX19pXSk7Ci0gIHJldHVybiBfX3RtcDsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWlubGluZSB2YWxhcnJheTxfVHA+IHNxcnQoY29uc3QgdmFsYXJyYXk8X1RwPiYgX194KSB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OwotICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7Ci0gIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQotICAgIF9fdG1wW19faV0gPSA6OnNxcnQoX194W19faV0pOwotICByZXR1cm4gX190bXA7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgdmFsYXJyYXk8X1RwPiB0YW4oY29uc3QgdmFsYXJyYXk8X1RwPiYgX194KSB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OwotICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7Ci0gIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQotICAgIF9fdG1wW19faV0gPSA6OnRhbihfX3hbX19pXSk7Ci0gIHJldHVybiBfX3RtcDsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWlubGluZSB2YWxhcnJheTxfVHA+IHRhbmgoY29uc3QgdmFsYXJyYXk8X1RwPiYgX194KSB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OwotICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7Ci0gIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQotICAgIF9fdG1wW19faV0gPSA6OnRhbmgoX194W19faV0pOwotICByZXR1cm4gX190bXA7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gc2xpY2UgYW5kIHNsaWNlX2FycmF5Ci0KLWNsYXNzIHNsaWNlIHsKLXB1YmxpYzoKLSAgc2xpY2UoKSA6IF9NX3N0YXJ0KDApLCBfTV9sZW5ndGgoMCksIF9NX3N0cmlkZSgwKSB7fQotICBzbGljZShzaXplX3QgX19zdGFydCwgc2l6ZV90IF9fbGVuZ3RoLCBzaXplX3QgX19zdHJpZGUpCi0gICAgOiBfTV9zdGFydChfX3N0YXJ0KSwgX01fbGVuZ3RoKF9fbGVuZ3RoKSwgX01fc3RyaWRlKF9fc3RyaWRlKQotICAgIHt9Ci0gIF9fVFJJVklBTF9ERVNUUlVDVE9SKHNsaWNlKQotCi0gIHNpemVfdCBzdGFydCgpICBjb25zdCB7IHJldHVybiBfTV9zdGFydDsgfQotICBzaXplX3Qgc2l6ZSgpICAgY29uc3QgeyByZXR1cm4gX01fbGVuZ3RoOyB9Ci0gIHNpemVfdCBzdHJpZGUoKSBjb25zdCB7IHJldHVybiBfTV9zdHJpZGU7IH0KLQotcHJpdmF0ZToKLSAgc2l6ZV90IF9NX3N0YXJ0OwotICBzaXplX3QgX01fbGVuZ3RoOwotICBzaXplX3QgX01fc3RyaWRlOwotfTsKLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWNsYXNzIHNsaWNlX2FycmF5IHsKLSAgZnJpZW5kIGNsYXNzIHZhbGFycmF5PF9UcD47Ci1wdWJsaWM6Ci0gIHR5cGVkZWYgX1RwIHZhbHVlX3R5cGU7Ci0KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIF9feCkgY29uc3QgewotICAgIHNpemVfdCBfX2luZGV4ID0gX01fc2xpY2Uuc3RhcnQoKTsKLSAgICBmb3IgKHNpemVfdCBfX2kgPSAwOwotICAgICAgICAgX19pIDwgX01fc2xpY2Uuc2l6ZSgpOwotICAgICAgICAgKytfX2ksIF9faW5kZXggKz0gX01fc2xpY2Uuc3RyaWRlKCkpCi0gICAgICBfTV9hcnJheVtfX2luZGV4XSA9IF9feFtfX2ldOwotICB9Ci0KLSAgdm9pZCBvcGVyYXRvcio9KGNvbnN0IHZhbGFycmF5PHZhbHVlX3R5cGU+JiBfX3gpIGNvbnN0IHsKLSAgICBzaXplX3QgX19pbmRleCA9IF9NX3NsaWNlLnN0YXJ0KCk7Ci0gICAgZm9yIChzaXplX3QgX19pID0gMDsKLSAgICAgICAgIF9faSA8IF9NX3NsaWNlLnNpemUoKTsKLSAgICAgICAgICsrX19pLCBfX2luZGV4ICs9IF9NX3NsaWNlLnN0cmlkZSgpKQotICAgICAgX01fYXJyYXlbX19pbmRleF0gKj0gX194W19faV07Ci0gIH0KLQotICB2b2lkIG9wZXJhdG9yLz0oY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIF9feCkgY29uc3QgewotICAgIHNpemVfdCBfX2luZGV4ID0gX01fc2xpY2Uuc3RhcnQoKTsKLSAgICBmb3IgKHNpemVfdCBfX2kgPSAwOwotICAgICAgICAgX19pIDwgX01fc2xpY2Uuc2l6ZSgpOwotICAgICAgICAgKytfX2ksIF9faW5kZXggKz0gX01fc2xpY2Uuc3RyaWRlKCkpCi0gICAgICBfTV9hcnJheVtfX2luZGV4XSAvPSBfX3hbX19pXTsKLSAgfQotCi0gIHZvaWQgb3BlcmF0b3IlPShjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgX194KSBjb25zdCB7Ci0gICAgc2l6ZV90IF9faW5kZXggPSBfTV9zbGljZS5zdGFydCgpOwotICAgIGZvciAoc2l6ZV90IF9faSA9IDA7Ci0gICAgICAgICBfX2kgPCBfTV9zbGljZS5zaXplKCk7Ci0gICAgICAgICArK19faSwgX19pbmRleCArPSBfTV9zbGljZS5zdHJpZGUoKSkKLSAgICAgIF9NX2FycmF5W19faW5kZXhdICU9IF9feFtfX2ldOwotICB9Ci0KLSAgdm9pZCBvcGVyYXRvcis9KGNvbnN0IHZhbGFycmF5PHZhbHVlX3R5cGU+JiBfX3gpIGNvbnN0IHsKLSAgICBzaXplX3QgX19pbmRleCA9IF9NX3NsaWNlLnN0YXJ0KCk7Ci0gICAgZm9yIChzaXplX3QgX19pID0gMDsKLSAgICAgICAgIF9faSA8IF9NX3NsaWNlLnNpemUoKTsKLSAgICAgICAgICsrX19pLCBfX2luZGV4ICs9IF9NX3NsaWNlLnN0cmlkZSgpKQotICAgICAgX01fYXJyYXlbX19pbmRleF0gKz0gX194W19faV07Ci0gIH0KLQotICB2b2lkIG9wZXJhdG9yLT0oY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIF9feCkgY29uc3QgewotICAgIHNpemVfdCBfX2luZGV4ID0gX01fc2xpY2Uuc3RhcnQoKTsKLSAgICBmb3IgKHNpemVfdCBfX2kgPSAwOwotICAgICAgICAgX19pIDwgX01fc2xpY2Uuc2l6ZSgpOwotICAgICAgICAgKytfX2ksIF9faW5kZXggKz0gX01fc2xpY2Uuc3RyaWRlKCkpCi0gICAgICBfTV9hcnJheVtfX2luZGV4XSAtPSBfX3hbX19pXTsKLSAgfQotCi0gIHZvaWQgb3BlcmF0b3JePShjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgX194KSBjb25zdCB7Ci0gICAgc2l6ZV90IF9faW5kZXggPSBfTV9zbGljZS5zdGFydCgpOwotICAgIGZvciAoc2l6ZV90IF9faSA9IDA7Ci0gICAgICAgICBfX2kgPCBfTV9zbGljZS5zaXplKCk7Ci0gICAgICAgICArK19faSwgX19pbmRleCArPSBfTV9zbGljZS5zdHJpZGUoKSkKLSAgICAgIF9NX2FycmF5W19faW5kZXhdIF49IF9feFtfX2ldOwotICB9Ci0KLSAgdm9pZCBvcGVyYXRvciY9KGNvbnN0IHZhbGFycmF5PHZhbHVlX3R5cGU+JiBfX3gpIGNvbnN0IHsKLSAgICBzaXplX3QgX19pbmRleCA9IF9NX3NsaWNlLnN0YXJ0KCk7Ci0gICAgZm9yIChzaXplX3QgX19pID0gMDsKLSAgICAgICAgIF9faSA8IF9NX3NsaWNlLnNpemUoKTsKLSAgICAgICAgICsrX19pLCBfX2luZGV4ICs9IF9NX3NsaWNlLnN0cmlkZSgpKQotICAgICAgX01fYXJyYXlbX19pbmRleF0gJj0gX194W19faV07Ci0gIH0KLQotICB2b2lkIG9wZXJhdG9yfD0oY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIF9feCkgY29uc3QgewotICAgIHNpemVfdCBfX2luZGV4ID0gX01fc2xpY2Uuc3RhcnQoKTsKLSAgICBmb3IgKHNpemVfdCBfX2kgPSAwOwotICAgICAgICAgX19pIDwgX01fc2xpY2Uuc2l6ZSgpOwotICAgICAgICAgKytfX2ksIF9faW5kZXggKz0gX01fc2xpY2Uuc3RyaWRlKCkpCi0gICAgICBfTV9hcnJheVtfX2luZGV4XSB8PSBfX3hbX19pXTsKLSAgfQotCi0gIHZvaWQgb3BlcmF0b3I8PD0oY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIF9feCkgY29uc3QgewotICAgIHNpemVfdCBfX2luZGV4ID0gX01fc2xpY2Uuc3RhcnQoKTsKLSAgICBmb3IgKHNpemVfdCBfX2kgPSAwOwotICAgICAgICAgX19pIDwgX01fc2xpY2Uuc2l6ZSgpOwotICAgICAgICAgKytfX2ksIF9faW5kZXggKz0gX01fc2xpY2Uuc3RyaWRlKCkpCi0gICAgICBfTV9hcnJheVtfX2luZGV4XSA8PD0gX194W19faV07Ci0gIH0KLQotICB2b2lkIG9wZXJhdG9yPj49KGNvbnN0IHZhbGFycmF5PHZhbHVlX3R5cGU+JiBfX3gpIGNvbnN0IHsKLSAgICBzaXplX3QgX19pbmRleCA9IF9NX3NsaWNlLnN0YXJ0KCk7Ci0gICAgZm9yIChzaXplX3QgX19pID0gMDsKLSAgICAgICAgIF9faSA8IF9NX3NsaWNlLnNpemUoKTsKLSAgICAgICAgICsrX19pLCBfX2luZGV4ICs9IF9NX3NsaWNlLnN0cmlkZSgpKQotICAgICAgX01fYXJyYXlbX19pbmRleF0gPj49IF9feFtfX2ldOwotICB9Ci0KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgdmFsdWVfdHlwZSYgX19jKSAvKmNvbnN0IGNvdWxkIGJlIGNvbnN0IGJ1dCBzdGFuZGFyZCBzYXlzIE5PICgyNi4zLjUuNC0xKSovIHsKLSAgICBzaXplX3QgX19pbmRleCA9IF9NX3NsaWNlLnN0YXJ0KCk7Ci0gICAgZm9yIChzaXplX3QgX19pID0gMDsKLSAgICAgICAgIF9faSA8IF9NX3NsaWNlLnNpemUoKTsKLSAgICAgICAgICsrX19pLCBfX2luZGV4ICs9IF9NX3NsaWNlLnN0cmlkZSgpKQotICAgICAgX01fYXJyYXlbX19pbmRleF0gPSBfX2M7Ci0gIH0KLQotICB+c2xpY2VfYXJyYXkoKSB7fQotCi1wcml2YXRlOgotICBzbGljZV9hcnJheShjb25zdCBzbGljZSYgX19zbGljZSwgdmFsYXJyYXk8X1RwPiYgX19hcnJheSkKLSAgICA6IF9NX3NsaWNlKF9fc2xpY2UpLCBfTV9hcnJheShfX2FycmF5KQotICAgIHt9Ci0KLSAgc2xpY2UgICAgICAgICAgX01fc2xpY2U7Ci0gIHZhbGFycmF5PF9UcD4mIF9NX2FycmF5OwotCi1wcml2YXRlOiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERpc2FibGUgYXNzaWdubWVudCBhbmQgZGVmYXVsdCBjb25zdHJ1Y3RvcgotICBzbGljZV9hcnJheSgpOwotICBzbGljZV9hcnJheShjb25zdCBzbGljZV9hcnJheSYpOwotICBzbGljZV9hcnJheSYgb3BlcmF0b3I9KGNvbnN0IHNsaWNlX2FycmF5Jik7Ci19OwotCi0vLyB2YWxhcnJheSBtZW1iZXIgZnVuY3Rpb25zIGRlYWxpbmcgd2l0aCBzbGljZSBhbmQgc2xpY2VfYXJyYXkKLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWlubGluZSB2YWxhcnJheTxfVHA+Ojp2YWxhcnJheShjb25zdCBzbGljZV9hcnJheTxfVHA+JiBfX3gpCi0gIDogX1ZhbGFycmF5X2Jhc2U8X1RwPihfX3guX01fc2xpY2Uuc2l6ZSgpKSB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX190eXBlX3RyYWl0czxfVHA+OjpoYXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yCi0gICAgICAgICAgX0lzX1RyaXZpYWw7Ci0gIF9NX2luaXRpYWxpemUoX0lzX1RyaXZpYWwoKSk7Ci0gICp0aGlzID0gX194OwotfQotCi0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgc2xpY2VfYXJyYXk8X1RwPiB2YWxhcnJheTxfVHA+OjpvcGVyYXRvcltdKHNsaWNlIF9fc2xpY2UpIHsKLSAgcmV0dXJuIHNsaWNlX2FycmF5PF9UcD4oX19zbGljZSwgKnRoaXMpOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGdzbGljZSBhbmQgZ3NsaWNlX2FycmF5Ci0KLXRlbXBsYXRlIDxjbGFzcyBfU2l6ZT4KLXN0cnVjdCBfR3NsaWNlX0l0ZXJfdG1wbDsKLQotY2xhc3MgZ3NsaWNlIHsKLSAgZnJpZW5kIHN0cnVjdCBfR3NsaWNlX0l0ZXJfdG1wbDxzaXplX3Q+OwotcHVibGljOgotICBnc2xpY2UoKSA6IF9NX3N0YXJ0KDApLCBfTV9sZW5ndGhzKDApLCBfTV9zdHJpZGVzKDApIHt9Ci0gIGdzbGljZShzaXplX3QgX19zdGFydCwKLSAgICAgICAgIGNvbnN0IF9WYWxhcnJheV9zaXplX3QmIF9fbGVuZ3RocywgY29uc3QgX1ZhbGFycmF5X3NpemVfdCYgX19zdHJpZGVzKQotICAgIDogX01fc3RhcnQoX19zdGFydCksIF9NX2xlbmd0aHMoX19sZW5ndGhzKSwgX01fc3RyaWRlcyhfX3N0cmlkZXMpCi0gICAge30KLSAgX19UUklWSUFMX0RFU1RSVUNUT1IoZ3NsaWNlKQotCi0gIHNpemVfdCBzdGFydCgpICAgICAgICAgICAgY29uc3QgeyByZXR1cm4gX01fc3RhcnQ7IH0KLSAgX1ZhbGFycmF5X3NpemVfdCBzaXplKCkgICBjb25zdCB7IHJldHVybiBfTV9sZW5ndGhzOyB9Ci0gIF9WYWxhcnJheV9zaXplX3Qgc3RyaWRlKCkgY29uc3QgeyByZXR1cm4gX01fc3RyaWRlczsgfQotCi0gIC8vIEV4dGVuc2lvbjogY2hlY2sgZm9yIGFuIGVtcHR5IGdzbGljZS4KLSAgYm9vbCBfTV9lbXB0eSgpIGNvbnN0IHsgcmV0dXJuIF9NX2xlbmd0aHMuc2l6ZSgpID09IDA7IH0KLQotICAvLyBFeHRlbnNpb246IG51bWJlciBvZiBpbmRpY2VzIHRoaXMgZ3NsaWNlIHJlcHJlc2VudHMuICAoRm9yIGEgZGVnZW5lcmF0ZQotICAvLyBnc2xpY2UsIHRoZXkncmUgbm90IG5lY2Vzc2FyaWx5IGFsbCBkaXN0aW5jdC4pCi0gIHNpemVfdCBfTV9zaXplKCkgY29uc3QgewotICAgIHJldHVybiAhdGhpcy0+X01fZW1wdHkoKQotICAgICAgPyBhY2N1bXVsYXRlKF9NX2xlbmd0aHMuX01fZmlyc3QgKyAxLAotICAgICAgICAgICAgICAgICAgIF9NX2xlbmd0aHMuX01fZmlyc3QgKyBfTV9sZW5ndGhzLl9NX3NpemUsCi0gICAgICAgICAgICAgICAgICAgX01fbGVuZ3Roc1swXSwKLSAgICAgICAgICAgICAgICAgICBtdWx0aXBsaWVzPHNpemVfdD4oKSkKLSAgICAgIDogMDsKLSAgfQotCi0jIGlmbmRlZiBfX0hQX2FDQwotcHJpdmF0ZToKLSMgZW5kaWYKLQotICBzaXplX3QgX01fc3RhcnQ7Ci0gIF9WYWxhcnJheV9zaXplX3QgX01fbGVuZ3RoczsKLSAgX1ZhbGFycmF5X3NpemVfdCBfTV9zdHJpZGVzOwotfTsKLQotLy8gVGhpcyBpcyBub3QgYW4gU1RMIGl0ZXJhdG9yLiAgSXQgaXMgY29uc3RydWN0ZWQgZnJvbSBhIGdzbGljZSwgYW5kIGl0Ci0vLyBzdGVwcyB0aHJvdWdoIHRoZSBnc2xpY2UgaW5kaWNlcyBpbiBzZXF1ZW5jZS4gIFNlZSAyMy4zLjYgb2YgdGhlIEMrKwotLy8gc3RhbmRhcmQsIHBhcmFncmFwaHMgMi0zLCBmb3IgYW4gZXhwbGFuYXRpb24gb2YgdGhlIHNlcXVlbmNlLiAgQXQKLS8vIGVhY2ggc3RlcCB3ZSBnZXQgdHdvIHRoaW5nczogdGhlIG9yZGluYWwgKGkuZS4gbnVtYmVyIG9mIHN0ZXBzIHRha2VuKSwKLS8vIGFuZCB0aGUgb25lLWRpbWVuc2lvbmFsIGluZGV4LgotCi10ZW1wbGF0ZSA8Y2xhc3MgX1NpemU+Ci1zdHJ1Y3QgX0dzbGljZV9JdGVyX3RtcGwgewotICBfR3NsaWNlX0l0ZXJfdG1wbChjb25zdCBnc2xpY2UmIF9fZ3NsaWNlKQotICAgIDogX01fc3RlcCgwKSwgX01fMWRfaWR4KF9fZ3NsaWNlLnN0YXJ0KCkpLAotICAgICAgX01faW5kaWNlcyhzaXplX3QoMCksIF9fZ3NsaWNlLl9NX2xlbmd0aHMuc2l6ZSgpKSwKLSAgICAgIF9NX2dzbGljZShfX2dzbGljZSkKLSAgICB7fQotCi0gIGJvb2wgX01fZG9uZSgpIGNvbnN0IHsgcmV0dXJuIF9NX2luZGljZXNbMF0gPT0gX01fZ3NsaWNlLl9NX2xlbmd0aHNbMF07IH0KLQotICBib29sIF9NX2luY3IoKTsKLQotICBfU2l6ZSBfTV9zdGVwOwotICBfU2l6ZSBfTV8xZF9pZHg7Ci0KLSAgdmFsYXJyYXk8X1NpemU+IF9NX2luZGljZXM7Ci0gIGNvbnN0IGdzbGljZSYgX01fZ3NsaWNlOwotfTsKLQotdHlwZWRlZiBfR3NsaWNlX0l0ZXJfdG1wbDxzaXplX3Q+IF9Hc2xpY2VfSXRlcjsKLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWNsYXNzIGdzbGljZV9hcnJheSB7Ci0gIGZyaWVuZCBjbGFzcyB2YWxhcnJheTxfVHA+OwotcHVibGljOgotICB0eXBlZGVmIF9UcCB2YWx1ZV90eXBlOwotCi0gIHZvaWQgb3BlcmF0b3I9IChjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgX194KSBjb25zdCB7Ci0gICAgaWYgKCFfTV9nc2xpY2UuX01fZW1wdHkoKSkgewotICAgICAgX0dzbGljZV9JdGVyIF9faShfTV9nc2xpY2UpOwotICAgICAgZG8gX01fYXJyYXlbX19pLl9NXzFkX2lkeF0gPSBfX3hbX19pLl9NX3N0ZXBdOyB3aGlsZShfX2kuX01faW5jcigpKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIG9wZXJhdG9yKj0gKGNvbnN0IHZhbGFycmF5PHZhbHVlX3R5cGU+JiBfX3gpIGNvbnN0IHsKLSAgICBpZiAoIV9NX2dzbGljZS5fTV9lbXB0eSgpKSB7Ci0gICAgICBfR3NsaWNlX0l0ZXIgX19pKF9NX2dzbGljZSk7Ci0gICAgICBkbyBfTV9hcnJheVtfX2kuX01fMWRfaWR4XSAqPSBfX3hbX19pLl9NX3N0ZXBdOyB3aGlsZShfX2kuX01faW5jcigpKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIG9wZXJhdG9yLz0gKGNvbnN0IHZhbGFycmF5PHZhbHVlX3R5cGU+JiBfX3gpIGNvbnN0IHsKLSAgICBpZiAoIV9NX2dzbGljZS5fTV9lbXB0eSgpKSB7Ci0gICAgICBfR3NsaWNlX0l0ZXIgX19pKF9NX2dzbGljZSk7Ci0gICAgICBkbyBfTV9hcnJheVtfX2kuX01fMWRfaWR4XSAvPSBfX3hbX19pLl9NX3N0ZXBdOyB3aGlsZShfX2kuX01faW5jcigpKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIG9wZXJhdG9yJT0gKGNvbnN0IHZhbGFycmF5PHZhbHVlX3R5cGU+JiBfX3gpIGNvbnN0IHsKLSAgICBpZiAoIV9NX2dzbGljZS5fTV9lbXB0eSgpKSB7Ci0gICAgICBfR3NsaWNlX0l0ZXIgX19pKF9NX2dzbGljZSk7Ci0gICAgICBkbyBfTV9hcnJheVtfX2kuX01fMWRfaWR4XSAlPSBfX3hbX19pLl9NX3N0ZXBdOyB3aGlsZShfX2kuX01faW5jcigpKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIG9wZXJhdG9yKz0gKGNvbnN0IHZhbGFycmF5PHZhbHVlX3R5cGU+JiBfX3gpIGNvbnN0IHsKLSAgICBpZiAoIV9NX2dzbGljZS5fTV9lbXB0eSgpKSB7Ci0gICAgICBfR3NsaWNlX0l0ZXIgX19pKF9NX2dzbGljZSk7Ci0gICAgICBkbyBfTV9hcnJheVtfX2kuX01fMWRfaWR4XSArPSBfX3hbX19pLl9NX3N0ZXBdOyB3aGlsZShfX2kuX01faW5jcigpKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIG9wZXJhdG9yLT0gKGNvbnN0IHZhbGFycmF5PHZhbHVlX3R5cGU+JiBfX3gpIGNvbnN0IHsKLSAgICBpZiAoIV9NX2dzbGljZS5fTV9lbXB0eSgpKSB7Ci0gICAgICBfR3NsaWNlX0l0ZXIgX19pKF9NX2dzbGljZSk7Ci0gICAgICBkbyBfTV9hcnJheVtfX2kuX01fMWRfaWR4XSAtPSBfX3hbX19pLl9NX3N0ZXBdOyB3aGlsZShfX2kuX01faW5jcigpKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIG9wZXJhdG9yXj0gKGNvbnN0IHZhbGFycmF5PHZhbHVlX3R5cGU+JiBfX3gpIGNvbnN0IHsKLSAgICBpZiAoIV9NX2dzbGljZS5fTV9lbXB0eSgpKSB7Ci0gICAgICBfR3NsaWNlX0l0ZXIgX19pKF9NX2dzbGljZSk7Ci0gICAgICBkbyBfTV9hcnJheVtfX2kuX01fMWRfaWR4XSBePSBfX3hbX19pLl9NX3N0ZXBdOyB3aGlsZShfX2kuX01faW5jcigpKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIG9wZXJhdG9yJj0gKGNvbnN0IHZhbGFycmF5PHZhbHVlX3R5cGU+JiBfX3gpIGNvbnN0IHsKLSAgICBpZiAoIV9NX2dzbGljZS5fTV9lbXB0eSgpKSB7Ci0gICAgICBfR3NsaWNlX0l0ZXIgX19pKF9NX2dzbGljZSk7Ci0gICAgICBkbyBfTV9hcnJheVtfX2kuX01fMWRfaWR4XSAmPSBfX3hbX19pLl9NX3N0ZXBdOyB3aGlsZShfX2kuX01faW5jcigpKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIG9wZXJhdG9yfD0gKGNvbnN0IHZhbGFycmF5PHZhbHVlX3R5cGU+JiBfX3gpIGNvbnN0IHsKLSAgICBpZiAoIV9NX2dzbGljZS5fTV9lbXB0eSgpKSB7Ci0gICAgICBfR3NsaWNlX0l0ZXIgX19pKF9NX2dzbGljZSk7Ci0gICAgICBkbyBfTV9hcnJheVtfX2kuX01fMWRfaWR4XSB8PSBfX3hbX19pLl9NX3N0ZXBdOyB3aGlsZShfX2kuX01faW5jcigpKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIG9wZXJhdG9yPDw9IChjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgX194KSBjb25zdCB7Ci0gICAgaWYgKCFfTV9nc2xpY2UuX01fZW1wdHkoKSkgewotICAgICAgX0dzbGljZV9JdGVyIF9faShfTV9nc2xpY2UpOwotICAgICAgZG8gX01fYXJyYXlbX19pLl9NXzFkX2lkeF0gPDw9IF9feFtfX2kuX01fc3RlcF07IHdoaWxlKF9faS5fTV9pbmNyKCkpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgb3BlcmF0b3I+Pj0gKGNvbnN0IHZhbGFycmF5PHZhbHVlX3R5cGU+JiBfX3gpIGNvbnN0IHsKLSAgICBpZiAoIV9NX2dzbGljZS5fTV9lbXB0eSgpKSB7Ci0gICAgICBfR3NsaWNlX0l0ZXIgX19pKF9NX2dzbGljZSk7Ci0gICAgICBkbyBfTV9hcnJheVtfX2kuX01fMWRfaWR4XSA+Pj0gX194W19faS5fTV9zdGVwXTsgd2hpbGUoX19pLl9NX2luY3IoKSk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBvcGVyYXRvcj0gKGNvbnN0IHZhbHVlX3R5cGUmIF9fYykgLypjb25zdCBjb3VsZCBiZSBjb25zdCBidXQgc3RhbmRhcmQgc2F5cyBOTyAoMjYuMy43LjQtMSkqLyB7Ci0gICAgaWYgKCFfTV9nc2xpY2UuX01fZW1wdHkoKSkgewotICAgICAgX0dzbGljZV9JdGVyIF9faShfTV9nc2xpY2UpOwotICAgICAgZG8gX01fYXJyYXlbX19pLl9NXzFkX2lkeF0gPSBfX2M7IHdoaWxlKF9faS5fTV9pbmNyKCkpOwotICAgIH0KLSAgfQotCi0gIH5nc2xpY2VfYXJyYXkoKSB7fQotCi1wcml2YXRlOgotICBnc2xpY2VfYXJyYXkoY29uc3QgZ3NsaWNlJiBfX2dzbGljZSwgdmFsYXJyYXk8X1RwPiYgX19hcnJheSkKLSAgICA6IF9NX2dzbGljZShfX2dzbGljZSksIF9NX2FycmF5KF9fYXJyYXkpCi0gICAge30KLQotICBnc2xpY2UgICAgICAgICAgICAgICAgX01fZ3NsaWNlOwotICB2YWxhcnJheTx2YWx1ZV90eXBlPiYgX01fYXJyYXk7Ci0KLXByaXZhdGU6ICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGlzYWJsZSBhc3NpZ25tZW50Ci0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IGdzbGljZV9hcnJheTxfVHA+Jik7Ci19OwotCi0vLyB2YWxhcnJheSBtZW1iZXIgZnVuY3Rpb25zIGRlYWxpbmcgd2l0aCBnc2xpY2UgYW5kIGdzbGljZV9hcnJheS4gIE5vdGUKLS8vIHRoYXQgaXQgaXMgaWxsZWdhbCAoYmVoYXZpb3IgaXMgdW5kZWZpbmVkKSB0byBjb25zdHJ1Y3QgYSBnc2xpY2VfYXJyYXkKLS8vIGZyb20gYSBkZWdlbmVyYXRlIGdzbGljZS4KLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWlubGluZSB2YWxhcnJheTxfVHA+Ojp2YWxhcnJheShjb25zdCBnc2xpY2VfYXJyYXk8X1RwPiYgX194KQotICA6IF9WYWxhcnJheV9iYXNlPF9UcD4oX194Ll9NX2dzbGljZS5fTV9zaXplKCkpIHsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfX3R5cGVfdHJhaXRzPF9UcD46Omhhc190cml2aWFsX2RlZmF1bHRfY29uc3RydWN0b3IKLSAgICAgICAgICBfSXNfVHJpdmlhbDsKLSAgX01faW5pdGlhbGl6ZShfSXNfVHJpdmlhbCgpKTsKLSAgKnRoaXMgPSBfX3g7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgZ3NsaWNlX2FycmF5PF9UcD4gdmFsYXJyYXk8X1RwPjo6b3BlcmF0b3JbXShjb25zdCBnc2xpY2UmIF9fc2xpY2UpIHsKLSAgcmV0dXJuIGdzbGljZV9hcnJheTxfVHA+KF9fc2xpY2UsICp0aGlzKTsKLX0KLQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIG1hc2tfYXJyYXkKLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWNsYXNzIG1hc2tfYXJyYXkgewotICBmcmllbmQgY2xhc3MgdmFsYXJyYXk8X1RwPjsKLXB1YmxpYzoKLSAgdHlwZWRlZiBfVHAgdmFsdWVfdHlwZTsKLQotICB2b2lkIG9wZXJhdG9yPShjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgX194KSBjb25zdCB7Ci0gICAgc2l6ZV90IF9faWR4ID0gMDsKLSAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfTV9hcnJheS5zaXplKCk7ICsrX19pKQotICAgICAgaWYgKF9NX21hc2tbX19pXSkgX01fYXJyYXlbX19pXSA9IF9feFtfX2lkeCsrXTsKLSAgfQotCi0gIHZvaWQgb3BlcmF0b3IqPShjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgX194KSBjb25zdCB7Ci0gICAgc2l6ZV90IF9faWR4ID0gMDsKLSAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfTV9hcnJheS5zaXplKCk7ICsrX19pKQotICAgICAgaWYgKF9NX21hc2tbX19pXSkgX01fYXJyYXlbX19pXSAqPSBfX3hbX19pZHgrK107Ci0gIH0KLQotICB2b2lkIG9wZXJhdG9yLz0oY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIF9feCkgY29uc3QgewotICAgIHNpemVfdCBfX2lkeCA9IDA7Ci0gICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX01fYXJyYXkuc2l6ZSgpOyArK19faSkKLSAgICAgIGlmIChfTV9tYXNrW19faV0pIF9NX2FycmF5W19faV0gLz0gX194W19faWR4KytdOwotICB9Ci0KLSAgdm9pZCBvcGVyYXRvciU9KGNvbnN0IHZhbGFycmF5PHZhbHVlX3R5cGU+JiBfX3gpIGNvbnN0IHsKLSAgICBzaXplX3QgX19pZHggPSAwOwotICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9NX2FycmF5LnNpemUoKTsgKytfX2kpCi0gICAgICBpZiAoX01fbWFza1tfX2ldKSBfTV9hcnJheVtfX2ldICU9IF9feFtfX2lkeCsrXTsKLSAgfQotCi0gIHZvaWQgb3BlcmF0b3IrPShjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgX194KSBjb25zdCB7Ci0gICAgc2l6ZV90IF9faWR4ID0gMDsKLSAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfTV9hcnJheS5zaXplKCk7ICsrX19pKQotICAgICAgaWYgKF9NX21hc2tbX19pXSkgX01fYXJyYXlbX19pXSArPSBfX3hbX19pZHgrK107Ci0gIH0KLQotICB2b2lkIG9wZXJhdG9yLT0oY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIF9feCkgY29uc3QgewotICAgIHNpemVfdCBfX2lkeCA9IDA7Ci0gICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX01fYXJyYXkuc2l6ZSgpOyArK19faSkKLSAgICAgIGlmIChfTV9tYXNrW19faV0pIF9NX2FycmF5W19faV0gLT0gX194W19faWR4KytdOwotICB9Ci0KLSAgdm9pZCBvcGVyYXRvcl49KGNvbnN0IHZhbGFycmF5PHZhbHVlX3R5cGU+JiBfX3gpIGNvbnN0IHsKLSAgICBzaXplX3QgX19pZHggPSAwOwotICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9NX2FycmF5LnNpemUoKTsgKytfX2kpCi0gICAgICBpZiAoX01fbWFza1tfX2ldKSBfTV9hcnJheVtfX2ldIF49IF9feFtfX2lkeCsrXTsKLSAgfQotCi0gIHZvaWQgb3BlcmF0b3ImPShjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgX194KSBjb25zdCB7Ci0gICAgc2l6ZV90IF9faWR4ID0gMDsKLSAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfTV9hcnJheS5zaXplKCk7ICsrX19pKQotICAgICAgaWYgKF9NX21hc2tbX19pXSkgX01fYXJyYXlbX19pXSAmPSBfX3hbX19pZHgrK107Ci0gIH0KLQotICB2b2lkIG9wZXJhdG9yfD0oY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIF9feCkgY29uc3QgewotICAgIHNpemVfdCBfX2lkeCA9IDA7Ci0gICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX01fYXJyYXkuc2l6ZSgpOyArK19faSkKLSAgICAgIGlmIChfTV9tYXNrW19faV0pIF9NX2FycmF5W19faV0gfD0gX194W19faWR4KytdOwotICB9Ci0KLSAgdm9pZCBvcGVyYXRvcjw8PShjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgX194KSBjb25zdCB7Ci0gICAgc2l6ZV90IF9faWR4ID0gMDsKLSAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfTV9hcnJheS5zaXplKCk7ICsrX19pKQotICAgICAgaWYgKF9NX21hc2tbX19pXSkgX01fYXJyYXlbX19pXSA8PD0gX194W19faWR4KytdOwotICB9Ci0KLSAgdm9pZCBvcGVyYXRvcj4+PShjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgX194KSBjb25zdCB7Ci0gICAgc2l6ZV90IF9faWR4ID0gMDsKLSAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfTV9hcnJheS5zaXplKCk7ICsrX19pKQotICAgICAgaWYgKF9NX21hc2tbX19pXSkgX01fYXJyYXlbX19pXSA+Pj0gX194W19faWR4KytdOwotICB9Ci0KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgdmFsdWVfdHlwZSYgX19jKSBjb25zdCB7Ci0gICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX01fYXJyYXkuc2l6ZSgpOyArK19faSkKLSAgICAgIGlmIChfTV9tYXNrW19faV0pIF9NX2FycmF5W19faV0gPSBfX2M7Ci0gIH0KLQotICB+bWFza19hcnJheSgpIHt9Ci0KLSAgLy8gRXh0ZW5zaW9uOiBudW1iZXIgb2YgdHJ1ZSB2YWx1ZXMgaW4gdGhlIG1hc2sKLSAgc2l6ZV90IF9NX251bV90cnVlKCkgY29uc3QgewotICAgIHNpemVfdCBfX3Jlc3VsdCA9IDA7Ci0gICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX01fbWFzay5zaXplKCk7ICsrX19pKQotICAgICAgaWYgKF9NX21hc2tbX19pXSkgKytfX3Jlc3VsdDsKLSAgICByZXR1cm4gX19yZXN1bHQ7Ci0gIH0KLQotcHJpdmF0ZToKLSAgbWFza19hcnJheShjb25zdCBfVmFsYXJyYXlfYm9vbCYgX19tYXNrLCB2YWxhcnJheTxfVHA+JiBfX2FycmF5KQotICAgIDogX01fbWFzayhfX21hc2spLCBfTV9hcnJheShfX2FycmF5KQotICAgIHt9Ci0KLSAgX1ZhbGFycmF5X2Jvb2wgX01fbWFzazsKLSAgdmFsYXJyYXk8X1RwPiYgX01fYXJyYXk7Ci0KLXByaXZhdGU6ICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGlzYWJsZSBhc3NpZ25tZW50Ci0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IG1hc2tfYXJyYXk8X1RwPiYpOwotfTsKLQotLy8gdmFsYXJyYXkgbWVtYmVyIGZ1bmN0aW9ucyBkZWFsaW5nIHdpdGggbWFza19hcnJheQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotaW5saW5lIHZhbGFycmF5PF9UcD46OnZhbGFycmF5KGNvbnN0IG1hc2tfYXJyYXk8X1RwPiYgX194KQotICA6IF9WYWxhcnJheV9iYXNlPF9UcD4oX194Ll9NX251bV90cnVlKCkpCi17Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX190eXBlX3RyYWl0czxfVHA+OjpoYXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yCi0gICAgICAgICAgX0lzX1RyaXZpYWw7Ci0gIF9NX2luaXRpYWxpemUoX0lzX1RyaXZpYWwoKSk7Ci0gICp0aGlzID0gX194OwotfQotCi0vLyBCZWhhdmlvciBpcyB1bmRlZmluZWQgaWYgX194Ll9NX251bV90cnVlKCkgIT0gdGhpcy0+c2l6ZSgpCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotaW5saW5lIHZhbGFycmF5PF9UcD4mIHZhbGFycmF5PF9UcD46Om9wZXJhdG9yPShjb25zdCBtYXNrX2FycmF5PF9UcD4mIF9feCkgewotICBzaXplX3QgX19pZHggPSAwOwotICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guX01fYXJyYXkuc2l6ZSgpOyArK19faSkKLSAgICBpZiAoX194Ll9NX21hc2tbX19pXSkgKCp0aGlzKVtfX2lkeCsrXSA9IF9feC5fTV9hcnJheVtfX2ldOwotICByZXR1cm4gKnRoaXM7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgbWFza19hcnJheTxfVHA+IHZhbGFycmF5PF9UcD46Om9wZXJhdG9yW10oY29uc3QgX1ZhbGFycmF5X2Jvb2wmIF9fbWFzaykKLXsKLSAgcmV0dXJuIG1hc2tfYXJyYXk8X1RwPihfX21hc2ssICp0aGlzKTsKLX0KLQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGluZGlyZWN0X2FycmF5Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1jbGFzcyBpbmRpcmVjdF9hcnJheSB7Ci0gIGZyaWVuZCBjbGFzcyB2YWxhcnJheTxfVHA+OwotcHVibGljOgotICB0eXBlZGVmIF9UcCB2YWx1ZV90eXBlOwotCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHZhbGFycmF5PHZhbHVlX3R5cGU+JiBfX3gpIGNvbnN0IHsKLSAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfTV9hZGRyLnNpemUoKTsgKytfX2kpCi0gICAgICBfTV9hcnJheVtfTV9hZGRyW19faV1dID0gX194W19faV07Ci0gIH0KLQotICB2b2lkIG9wZXJhdG9yKj0oY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIF9feCkgY29uc3QgewotICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9NX2FkZHIuc2l6ZSgpOyArK19faSkKLSAgICAgIF9NX2FycmF5W19NX2FkZHJbX19pXV0gKj0gX194W19faV07Ci0gIH0KLQotICB2b2lkIG9wZXJhdG9yLz0oY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIF9feCkgY29uc3QgewotICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9NX2FkZHIuc2l6ZSgpOyArK19faSkKLSAgICAgIF9NX2FycmF5W19NX2FkZHJbX19pXV0gLz0gX194W19faV07Ci0gIH0KLQotICB2b2lkIG9wZXJhdG9yJT0oY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIF9feCkgY29uc3QgewotICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9NX2FkZHIuc2l6ZSgpOyArK19faSkKLSAgICAgIF9NX2FycmF5W19NX2FkZHJbX19pXV0gJT0gX194W19faV07Ci0gIH0KLQotICB2b2lkIG9wZXJhdG9yKz0oY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIF9feCkgY29uc3QgewotICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9NX2FkZHIuc2l6ZSgpOyArK19faSkKLSAgICAgIF9NX2FycmF5W19NX2FkZHJbX19pXV0gKz0gX194W19faV07Ci0gIH0KLQotICB2b2lkIG9wZXJhdG9yLT0oY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIF9feCkgY29uc3QgewotICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9NX2FkZHIuc2l6ZSgpOyArK19faSkKLSAgICAgIF9NX2FycmF5W19NX2FkZHJbX19pXV0gLT0gX194W19faV07Ci0gIH0KLQotICB2b2lkIG9wZXJhdG9yXj0oY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIF9feCkgY29uc3QgewotICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9NX2FkZHIuc2l6ZSgpOyArK19faSkKLSAgICAgIF9NX2FycmF5W19NX2FkZHJbX19pXV0gXj0gX194W19faV07Ci0gIH0KLQotICB2b2lkIG9wZXJhdG9yJj0oY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIF9feCkgY29uc3QgewotICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9NX2FkZHIuc2l6ZSgpOyArK19faSkKLSAgICAgIF9NX2FycmF5W19NX2FkZHJbX19pXV0gJj0gX194W19faV07Ci0gIH0KLQotICB2b2lkIG9wZXJhdG9yfD0oY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIF9feCkgY29uc3QgewotICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9NX2FkZHIuc2l6ZSgpOyArK19faSkKLSAgICAgIF9NX2FycmF5W19NX2FkZHJbX19pXV0gfD0gX194W19faV07Ci0gIH0KLQotICB2b2lkIG9wZXJhdG9yPDw9KGNvbnN0IHZhbGFycmF5PHZhbHVlX3R5cGU+JiBfX3gpIGNvbnN0IHsKLSAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfTV9hZGRyLnNpemUoKTsgKytfX2kpCi0gICAgICBfTV9hcnJheVtfTV9hZGRyW19faV1dIDw8PSBfX3hbX19pXTsKLSAgfQotCi0gIHZvaWQgb3BlcmF0b3I+Pj0oY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIF9feCkgY29uc3QgewotICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9NX2FkZHIuc2l6ZSgpOyArK19faSkKLSAgICAgIF9NX2FycmF5W19NX2FkZHJbX19pXV0gPj49IF9feFtfX2ldOwotICB9Ci0KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgdmFsdWVfdHlwZSYgX19jKSBjb25zdCB7Ci0gICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX01fYWRkci5zaXplKCk7ICsrX19pKQotICAgICAgX01fYXJyYXlbX01fYWRkcltfX2ldXSA9IF9fYzsKLSAgfQotCi0gIH5pbmRpcmVjdF9hcnJheSgpIHt9Ci0KLXByaXZhdGU6Ci0gIGluZGlyZWN0X2FycmF5KGNvbnN0IF9WYWxhcnJheV9zaXplX3QmIF9fYWRkciwgdmFsYXJyYXk8X1RwPiYgX19hcnJheSkKLSAgICA6IF9NX2FkZHIoX19hZGRyKSwgX01fYXJyYXkoX19hcnJheSkKLSAgICB7fQotCi0gIF9WYWxhcnJheV9zaXplX3QgX01fYWRkcjsKLSAgdmFsYXJyYXk8X1RwPiYgICBfTV9hcnJheTsKLQotcHJpdmF0ZTogICAgICAgICAgICAgICAgICAgICAgICAvLyBEaXNhYmxlIGFzc2lnbm1lbnQKLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgaW5kaXJlY3RfYXJyYXk8X1RwPiYpOwotfTsKLQotLy8gdmFsYXJyYXkgbWVtYmVyIGZ1bmN0aW9ucyBkZWFsaW5nIHdpdGggaW5kaXJlY3RfYXJyYXkKLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWlubGluZSB2YWxhcnJheTxfVHA+Ojp2YWxhcnJheShjb25zdCBpbmRpcmVjdF9hcnJheTxfVHA+JiBfX3gpCi0gIDogX1ZhbGFycmF5X2Jhc2U8X1RwPihfX3guX01fYWRkci5zaXplKCkpCi17Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX190eXBlX3RyYWl0czxfVHA+OjpoYXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yCi0gICAgICAgICAgX0lzX1RyaXZpYWw7Ci0gIF9NX2luaXRpYWxpemUoX0lzX1RyaXZpYWwoKSk7Ci0gICp0aGlzID0gX194OwotfQotCi0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1pbmxpbmUgaW5kaXJlY3RfYXJyYXk8X1RwPgotdmFsYXJyYXk8X1RwPjo6b3BlcmF0b3JbXShjb25zdCBfVmFsYXJyYXlfc2l6ZV90JiBfX2FkZHIpCi17Ci0gIHJldHVybiBpbmRpcmVjdF9hcnJheTxfVHA+KF9fYWRkciwgKnRoaXMpOwotfQotCi1fU1RMUF9FTkRfTkFNRVNQQUNFCi0KLSMgaWYgIWRlZmluZWQgKF9TVExQX0xJTktfVElNRV9JTlNUQU5USUFUSU9OKQotIyAgaW5jbHVkZSA8c3RsL192YWxhcnJheS5jPgotIyBlbmRpZgotCi0jZW5kaWYgLyogX1NUTFBfVkFMQVJSQVkgKi8KLQotCi0vLyBMb2NhbCBWYXJpYWJsZXM6Ci0vLyBtb2RlOkMrKwotLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RsL192ZWN0b3IuYyBiL3N0bC9fdmVjdG9yLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0NmEyM2UuLjAwMDAwMDAKLS0tIGEvc3RsL192ZWN0b3IuYworKysgL2Rldi9udWxsCkBAIC0xLDIzNSArMCwwIEBACi0vKgotICoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTQKLSAqIEhld2xldHQtUGFja2FyZCBDb21wYW55Ci0gKgotICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKLSAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NwotICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogQm9yaXMgRm9taXRjaGV2Ci0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICovCi0jaWZuZGVmIF9TVExQX1ZFQ1RPUl9DCi0jZGVmaW5lIF9TVExQX1ZFQ1RPUl9DCi0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfSU5URVJOQUxfVkVDVE9SX0gpCi0jICBpbmNsdWRlIDxzdGwvX3ZlY3Rvci5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGwvX3JhbmdlX2Vycm9ycy5oPgotCi1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLQotX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Ci12b2lkIF9WZWN0b3JfYmFzZTxfVHAsX0FsbG9jPjo6X01fdGhyb3dfbGVuZ3RoX2Vycm9yKCkgY29uc3QgewotICBfX3N0bF90aHJvd19sZW5ndGhfZXJyb3IoInZlY3RvciIpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Ci12b2lkIF9WZWN0b3JfYmFzZTxfVHAsIF9BbGxvYz46Ol9NX3Rocm93X291dF9vZl9yYW5nZSgpIGNvbnN0IHsKLSAgX19zdGxfdGhyb3dfb3V0X29mX3JhbmdlKCJ2ZWN0b3IiKTsKLX0KLQotI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QVFJfU1BFQ0lBTElaQVRJT05TKQotIyAgZGVmaW5lIHZlY3RvciBfU1RMUF9QVFJfSU1QTF9OQU1FKHZlY3RvcikKLSNlbGlmIGRlZmluZWQgKF9TVExQX0RFQlVHKQotIyAgZGVmaW5lIHZlY3RvciBfU1RMUF9OT05fREJHX05BTUUodmVjdG9yKQotI2Vsc2UKLV9TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9ORVNURURfVFlQRV9QQVJBTV9CVUcpCi0jICBkZWZpbmUgX19pdGVyYXRvcl9fICBfVHAqCi0jZWxzZQotIyAgZGVmaW5lIF9faXRlcmF0b3JfXyAgX1NUTFBfVFlQRU5BTUVfT05fUkVUVVJOX1RZUEUgdmVjdG9yPF9UcCwgX0FsbG9jPjo6aXRlcmF0b3IKLSNlbmRpZgotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Ci12b2lkIHZlY3RvcjxfVHAsIF9BbGxvYz46OnJlc2VydmUoc2l6ZV90eXBlIF9fbikgewotICBpZiAoY2FwYWNpdHkoKSA8IF9fbikgewotICAgIGlmIChtYXhfc2l6ZSgpIDwgX19uKSB7Ci0gICAgICB0aGlzLT5fTV90aHJvd19sZW5ndGhfZXJyb3IoKTsKLSAgICB9Ci0KLSAgICBjb25zdCBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IHNpemUoKTsKLSAgICBwb2ludGVyIF9fdG1wOwotICAgIGlmICh0aGlzLT5fTV9zdGFydCkgewotICAgICAgX190bXAgPSBfTV9hbGxvY2F0ZV9hbmRfY29weShfX24sIHRoaXMtPl9NX3N0YXJ0LCB0aGlzLT5fTV9maW5pc2gpOwotICAgICAgX01fY2xlYXIoKTsKLSAgICB9IGVsc2UgewotICAgICAgX190bXAgPSB0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5hbGxvY2F0ZShfX24sIF9fbik7Ci0gICAgfQotICAgIF9NX3NldChfX3RtcCwgX190bXAgKyBfX29sZF9zaXplLCBfX3RtcCArIF9fbik7Ci0gIH0KLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgotdm9pZCB2ZWN0b3I8X1RwLCBfQWxsb2M+OjpfTV9pbnNlcnRfb3ZlcmZsb3dfYXV4KHBvaW50ZXIgX19wb3MsIGNvbnN0IF9UcCYgX194LCBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qRE8gTk9UIFVTRSEhKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fZmlsbF9sZW4sIGJvb2wgX19hdGVuZCApIHsKLSAgY29uc3Qgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSBzaXplKCk7Ci0gIHNpemVfdHlwZSBfX2xlbiA9IF9fb2xkX3NpemUgKyAobWF4KShfX29sZF9zaXplLCBfX2ZpbGxfbGVuKTsKLQotICBwb2ludGVyIF9fbmV3X3N0YXJ0ID0gdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuYWxsb2NhdGUoX19sZW4sIF9fbGVuKTsKLSAgcG9pbnRlciBfX25ld19maW5pc2ggPSBfX25ld19zdGFydDsKLSAgX1NUTFBfVFJZIHsKLSAgICBfX25ld19maW5pc2ggPSBfU1RMUF9QUklWIF9fdW5pbml0aWFsaXplZF9tb3ZlKHRoaXMtPl9NX3N0YXJ0LCBfX3BvcywgX19uZXdfc3RhcnQsIF9Ucml2aWFsVUNvcHkoKSwgX01vdmFibGUoKSk7Ci0gICAgLy8gaGFuZGxlIGluc2VydGlvbgotICAgIGlmIChfX2ZpbGxfbGVuID09IDEpIHsKLSAgICAgIF9Db3B5X0NvbnN0cnVjdChfX25ld19maW5pc2gsIF9feCk7Ci0gICAgICArK19fbmV3X2ZpbmlzaDsKLSAgICB9IGVsc2UKLSAgICAgIF9fbmV3X2ZpbmlzaCA9IF9TVExQX1BSSVYgX191bmluaXRpYWxpemVkX2ZpbGxfbihfX25ld19maW5pc2gsIF9fZmlsbF9sZW4sIF9feCk7Ci0gICAgaWYgKCFfX2F0ZW5kKQotICAgICAgX19uZXdfZmluaXNoID0gX1NUTFBfUFJJViBfX3VuaW5pdGlhbGl6ZWRfbW92ZShfX3BvcywgdGhpcy0+X01fZmluaXNoLCBfX25ld19maW5pc2gsIF9Ucml2aWFsVUNvcHkoKSwgX01vdmFibGUoKSk7IC8vIGNvcHkgcmVtYWluZGVyCi0gIH0KLSAgX1NUTFBfVU5XSU5EKChfU1RMUF9TVEQ6Ol9EZXN0cm95X1JhbmdlKF9fbmV3X3N0YXJ0LF9fbmV3X2ZpbmlzaCksCi0gICAgICAgICAgICAgICB0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5kZWFsbG9jYXRlKF9fbmV3X3N0YXJ0LF9fbGVuKSkpCi0gIF9NX2NsZWFyX2FmdGVyX21vdmUoKTsKLSAgX01fc2V0KF9fbmV3X3N0YXJ0LCBfX25ld19maW5pc2gsIF9fbmV3X3N0YXJ0ICsgX19sZW4pOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Ci12b2lkIHZlY3RvcjxfVHAsIF9BbGxvYz46Ol9NX2luc2VydF9vdmVyZmxvdyhwb2ludGVyIF9fcG9zLCBjb25zdCBfVHAmIF9feCwgY29uc3QgX190cnVlX3R5cGUmIC8qX1RyaXZpYWxDb3B5Ki8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19maWxsX2xlbiwgYm9vbCBfX2F0ZW5kICkgewotICBjb25zdCBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IHNpemUoKTsKLSAgc2l6ZV90eXBlIF9fbGVuID0gX19vbGRfc2l6ZSArIChtYXgpKF9fb2xkX3NpemUsIF9fZmlsbF9sZW4pOwotCi0gIHBvaW50ZXIgX19uZXdfc3RhcnQgPSB0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5hbGxvY2F0ZShfX2xlbiwgX19sZW4pOwotICBwb2ludGVyIF9fbmV3X2ZpbmlzaCA9IF9fU1RBVElDX0NBU1QocG9pbnRlciwgX1NUTFBfUFJJViBfX2NvcHlfdHJpdmlhbCh0aGlzLT5fTV9zdGFydCwgX19wb3MsIF9fbmV3X3N0YXJ0KSk7Ci0gIC8vIGhhbmRsZSBpbnNlcnRpb24KLSAgX19uZXdfZmluaXNoID0gX1NUTFBfUFJJViBfX2ZpbGxfbihfX25ld19maW5pc2gsIF9fZmlsbF9sZW4sIF9feCk7Ci0gIGlmICghX19hdGVuZCkKLSAgICBfX25ld19maW5pc2ggPSBfX1NUQVRJQ19DQVNUKHBvaW50ZXIsIF9TVExQX1BSSVYgX19jb3B5X3RyaXZpYWwoX19wb3MsIHRoaXMtPl9NX2ZpbmlzaCwgX19uZXdfZmluaXNoKSk7IC8vIGNvcHkgcmVtYWluZGVyCi0gIF9NX2NsZWFyKCk7Ci0gIF9NX3NldChfX25ld19zdGFydCwgX19uZXdfZmluaXNoLCBfX25ld19zdGFydCArIF9fbGVuKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgotdm9pZCB2ZWN0b3I8X1RwLCBfQWxsb2M+OjpfTV9maWxsX2luc2VydF9hdXgoaXRlcmF0b3IgX19wb3MsIHNpemVfdHlwZSBfX24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfVHAmIF9feCwgY29uc3QgX190cnVlX3R5cGUmIC8qX01vdmFibGUqLykgewotICBpZiAoX01faXNfaW5zaWRlKF9feCkpIHsKLSAgICBfVHAgX194X2NvcHkgPSBfX3g7Ci0gICAgX01fZmlsbF9pbnNlcnRfYXV4KF9fcG9zLCBfX24sIF9feF9jb3B5LCBfX3RydWVfdHlwZSgpKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaXRlcmF0b3IgX19zcmMgPSB0aGlzLT5fTV9maW5pc2ggLSAxOwotICBpdGVyYXRvciBfX2RzdCA9IF9fc3JjICsgX19uOwotICBmb3IgKDsgX19zcmMgPj0gX19wb3M7IC0tX19kc3QsIC0tX19zcmMpIHsKLSAgICBfU1RMUF9TVEQ6Ol9Nb3ZlX0NvbnN0cnVjdChfX2RzdCwgKl9fc3JjKTsKLSAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95X01vdmVkKF9fc3JjKTsKLSAgfQotICBfU1RMUF9QUklWIF9fdW5pbml0aWFsaXplZF9maWxsX24oX19wb3MsIF9fbiwgX194KTsKLSAgdGhpcy0+X01fZmluaXNoICs9IF9fbjsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgotdm9pZCB2ZWN0b3I8X1RwLCBfQWxsb2M+OjpfTV9maWxsX2luc2VydF9hdXggKGl0ZXJhdG9yIF9fcG9zLCBzaXplX3R5cGUgX19uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9UcCYgX194LCBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qX01vdmFibGUqLykgewotICAvL0hlcmUgc2VsZiByZWZlcmVuY2luZyBuZWVkcyB0byBiZSBjaGVja2VkIGV2ZW4gZm9yIG5vbiBtb3ZhYmxlIHR5cGVzLgotICBpZiAoX01faXNfaW5zaWRlKF9feCkpIHsKLSAgICBfVHAgX194X2NvcHkgPSBfX3g7Ci0gICAgX01fZmlsbF9pbnNlcnRfYXV4KF9fcG9zLCBfX24sIF9feF9jb3B5LCBfX2ZhbHNlX3R5cGUoKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGNvbnN0IHNpemVfdHlwZSBfX2VsZW1zX2FmdGVyID0gdGhpcy0+X01fZmluaXNoIC0gX19wb3M7Ci0gIHBvaW50ZXIgX19vbGRfZmluaXNoID0gdGhpcy0+X01fZmluaXNoOwotICBpZiAoX19lbGVtc19hZnRlciA+IF9fbikgewotICAgIF9TVExQX1BSSVYgX191Y29weV9wdHJzKHRoaXMtPl9NX2ZpbmlzaCAtIF9fbiwgdGhpcy0+X01fZmluaXNoLCB0aGlzLT5fTV9maW5pc2gsIF9Ucml2aWFsVUNvcHkoKSk7Ci0gICAgdGhpcy0+X01fZmluaXNoICs9IF9fbjsKLSAgICBfU1RMUF9QUklWIF9fY29weV9iYWNrd2FyZF9wdHJzKF9fcG9zLCBfX29sZF9maW5pc2ggLSBfX24sIF9fb2xkX2ZpbmlzaCwgX1RyaXZpYWxDb3B5KCkpOwotICAgIF9TVExQX1NURDo6ZmlsbChfX3BvcywgX19wb3MgKyBfX24sIF9feCk7Ci0gIH0gZWxzZSB7Ci0gICAgdGhpcy0+X01fZmluaXNoID0gX1NUTFBfUFJJViBfX3VuaW5pdGlhbGl6ZWRfZmlsbF9uKHRoaXMtPl9NX2ZpbmlzaCwgX19uIC0gX19lbGVtc19hZnRlciwgX194KTsKLSAgICBfU1RMUF9QUklWIF9fdWNvcHlfcHRycyhfX3BvcywgX19vbGRfZmluaXNoLCB0aGlzLT5fTV9maW5pc2gsIF9Ucml2aWFsVUNvcHkoKSk7Ci0gICAgdGhpcy0+X01fZmluaXNoICs9IF9fZWxlbXNfYWZ0ZXI7Ci0gICAgX1NUTFBfU1REOjpmaWxsKF9fcG9zLCBfX29sZF9maW5pc2gsIF9feCk7Ci0gIH0KLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgotdm9pZCB2ZWN0b3I8X1RwLCBfQWxsb2M+OjpfTV9maWxsX2luc2VydChpdGVyYXRvciBfX3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3gpIHsKLSAgaWYgKF9fbiAhPSAwKSB7Ci0gICAgaWYgKHNpemVfdHlwZSh0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5fTV9kYXRhIC0gdGhpcy0+X01fZmluaXNoKSA+PSBfX24pIHsKLSAgICAgIF9NX2ZpbGxfaW5zZXJ0X2F1eChfX3BvcywgX19uLCBfX3gsIF9Nb3ZhYmxlKCkpOwotICAgIH0gZWxzZQotICAgICAgX01faW5zZXJ0X292ZXJmbG93KF9fcG9zLCBfX3gsIF9Ucml2aWFsQ29weSgpLCBfX24pOwotICB9Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KLXZlY3RvcjxfVHAsIF9BbGxvYz4mIHZlY3RvcjxfVHAsIF9BbGxvYz46Om9wZXJhdG9yID0gKGNvbnN0IHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9feCkgewotICBpZiAoJl9feCAhPSB0aGlzKSB7Ci0gICAgY29uc3Qgc2l6ZV90eXBlIF9feGxlbiA9IF9feC5zaXplKCk7Ci0gICAgaWYgKF9feGxlbiA+IGNhcGFjaXR5KCkpIHsKLSAgICAgIHNpemVfdHlwZSBfX2xlbiA9IF9feGxlbjsKLSAgICAgIHBvaW50ZXIgX190bXAgPSBfTV9hbGxvY2F0ZV9hbmRfY29weShfX2xlbiwgX19DT05TVF9DQVNUKGNvbnN0X3BvaW50ZXIsIF9feC5fTV9zdGFydCkgKyAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0NPTlNUX0NBU1QoY29uc3RfcG9pbnRlciwgX194Ll9NX2ZpbmlzaCkgKyAwKTsKLSAgICAgIF9NX2NsZWFyKCk7Ci0gICAgICB0aGlzLT5fTV9zdGFydCA9IF9fdG1wOwotICAgICAgdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuX01fZGF0YSA9IHRoaXMtPl9NX3N0YXJ0ICsgX19sZW47Ci0gICAgfSBlbHNlIGlmIChzaXplKCkgPj0gX194bGVuKSB7Ci0gICAgICBwb2ludGVyIF9faSA9IF9TVExQX1BSSVYgX19jb3B5X3B0cnMoX19DT05TVF9DQVNUKGNvbnN0X3BvaW50ZXIsIF9feC5fTV9zdGFydCkgKyAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fQ09OU1RfQ0FTVChjb25zdF9wb2ludGVyLCBfX3guX01fZmluaXNoKSArIDAsIHRoaXMtPl9NX3N0YXJ0LCBfVHJpdmlhbENvcHkoKSk7Ci0gICAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95X1JhbmdlKF9faSwgdGhpcy0+X01fZmluaXNoKTsKLSAgICB9IGVsc2UgewotICAgICAgX1NUTFBfUFJJViBfX2NvcHlfcHRycyhfX0NPTlNUX0NBU1QoY29uc3RfcG9pbnRlciwgX194Ll9NX3N0YXJ0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19DT05TVF9DQVNUKGNvbnN0X3BvaW50ZXIsIF9feC5fTV9zdGFydCkgKyBzaXplKCksIHRoaXMtPl9NX3N0YXJ0LCBfVHJpdmlhbENvcHkoKSk7Ci0gICAgICBfU1RMUF9QUklWIF9fdWNvcHlfcHRycyhfX0NPTlNUX0NBU1QoY29uc3RfcG9pbnRlciwgX194Ll9NX3N0YXJ0KSArIHNpemUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fQ09OU1RfQ0FTVChjb25zdF9wb2ludGVyLCBfX3guX01fZmluaXNoKSArIDAsIHRoaXMtPl9NX2ZpbmlzaCwgX1RyaXZpYWxVQ29weSgpKTsKLSAgICB9Ci0gICAgdGhpcy0+X01fZmluaXNoID0gdGhpcy0+X01fc3RhcnQgKyBfX3hsZW47Ci0gIH0KLSAgcmV0dXJuICp0aGlzOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Ci12b2lkIHZlY3RvcjxfVHAsIF9BbGxvYz46Ol9NX2ZpbGxfYXNzaWduKHNpemVfdCBfX24sIGNvbnN0IF9UcCYgX192YWwpIHsKLSAgaWYgKF9fbiA+IGNhcGFjaXR5KCkpIHsKLSAgICB2ZWN0b3I8X1RwLCBfQWxsb2M+IF9fdG1wKF9fbiwgX192YWwsIGdldF9hbGxvY2F0b3IoKSk7Ci0gICAgX190bXAuc3dhcCgqdGhpcyk7Ci0gIH0gZWxzZSBpZiAoX19uID4gc2l6ZSgpKSB7Ci0gICAgZmlsbChiZWdpbigpLCBlbmQoKSwgX192YWwpOwotICAgIHRoaXMtPl9NX2ZpbmlzaCA9IF9TVExQX1BSSVYgX191bmluaXRpYWxpemVkX2ZpbGxfbih0aGlzLT5fTV9maW5pc2gsIF9fbiAtIHNpemUoKSwgX192YWwpOwotICB9IGVsc2UKLSAgICBlcmFzZShfU1RMUF9QUklWIF9fZmlsbF9uKGJlZ2luKCksIF9fbiwgX192YWwpLCBlbmQoKSk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KLV9faXRlcmF0b3JfXwotdmVjdG9yPF9UcCwgX0FsbG9jPjo6aW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBjb25zdCBfVHAmIF9feCkgewotICBzaXplX3R5cGUgX19uID0gX19wb3MgLSBiZWdpbigpOwotICBfTV9maWxsX2luc2VydChfX3BvcywgMSwgX194KTsKLSAgcmV0dXJuIGJlZ2luKCkgKyBfX247Ci19Ci0KLSN1bmRlZiBfX2l0ZXJhdG9yX18KLQotI2lmIGRlZmluZWQgKHZlY3RvcikKLSMgIHVuZGVmIHZlY3RvcgotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi0jZW5kaWYKLQotX1NUTFBfRU5EX05BTUVTUEFDRQotCi0jZW5kaWYgLyogIF9TVExQX1ZFQ1RPUl9DICovCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX3ZlY3Rvci5oIGIvc3RsL192ZWN0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI0ZTM0Ny4uMDAwMDAwMAotLS0gYS9zdGwvX3ZlY3Rvci5oCisrKyAvZGV2L251bGwKQEAgLTEsNzM1ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk0Ci0gKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3Ci0gKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTcKLSAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0vKiBOT1RFOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBTVEwgaGVhZGVycy4KLSAqICAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuCi0gKi8KLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9WRUNUT1JfSAotI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9WRUNUT1JfSAotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0FMR09CQVNFX0gKLSMgIGluY2x1ZGUgPHN0bC9fYWxnb2Jhc2UuaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0FMTE9DX0gKLSMgIGluY2x1ZGUgPHN0bC9fYWxsb2MuaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0lURVJBVE9SX0gKLSMgIGluY2x1ZGUgPHN0bC9faXRlcmF0b3IuaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX1VOSU5JVElBTElaRURfSAotIyAgaW5jbHVkZSA8c3RsL191bmluaXRpYWxpemVkLmg+Ci0jZW5kaWYKLQotX1NUTFBfQkVHSU5fTkFNRVNQQUNFCi0KLS8vIFRoZSB2ZWN0b3IgYmFzZSBjbGFzcyBzZXJ2ZXMgb25lIHB1cnBvc2UsIGl0cyBjb25zdHJ1Y3RvciBhbmQKLS8vIGRlc3RydWN0b3IgYWxsb2NhdGUgKGJ1dCBkb24ndCBpbml0aWFsaXplKSBzdG9yYWdlLiAgVGhpcyBtYWtlcwotLy8gZXhjZXB0aW9uIHNhZmV0eSBlYXNpZXIuCi0KLV9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKLQotdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgotY2xhc3MgX1ZlY3Rvcl9iYXNlIHsKLXB1YmxpYzoKLSAgdHlwZWRlZiBfVmVjdG9yX2Jhc2U8X1RwLCBfQWxsb2M+IF9TZWxmOwotICBfU1RMUF9GT1JDRV9BTExPQ0FUT1JTKF9UcCwgX0FsbG9jKQotICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY190cmFpdHM8X1RwLCBfQWxsb2M+OjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKLSAgdHlwZWRlZiBfVHAqIHBvaW50ZXI7Ci0gIHR5cGVkZWYgX1NUTFBfYWxsb2NfcHJveHk8cG9pbnRlciwgX1RwLCBhbGxvY2F0b3JfdHlwZT4gX0FsbG9jUHJveHk7Ci0KLSAgX1ZlY3Rvcl9iYXNlKGNvbnN0IF9BbGxvYyYgX19hKQotICAgIDogX01fc3RhcnQoMCksIF9NX2ZpbmlzaCgwKSwgX01fZW5kX29mX3N0b3JhZ2UoX19hLCAwKSB7fQotCi0gIF9WZWN0b3JfYmFzZShzaXplX3QgX19uLCBjb25zdCBfQWxsb2MmIF9fYSkKLSAgICA6IF9NX3N0YXJ0KDApLCBfTV9maW5pc2goMCksIF9NX2VuZF9vZl9zdG9yYWdlKF9fYSwgMCkgewotICAgIF9NX3N0YXJ0ID0gX01fZW5kX29mX3N0b3JhZ2UuYWxsb2NhdGUoX19uLCBfX24pOwotICAgIF9NX2ZpbmlzaCA9IF9NX3N0YXJ0OwotICAgIF9NX2VuZF9vZl9zdG9yYWdlLl9NX2RhdGEgPSBfTV9zdGFydCArIF9fbjsKLSAgICBfU1RMUF9NUFdGSVhfVFJZIF9TVExQX01QV0ZJWF9DQVRDSAotICB9Ci0KLSAgX1ZlY3Rvcl9iYXNlKF9fbW92ZV9zb3VyY2U8X1NlbGY+IHNyYykKLSAgICA6IF9NX3N0YXJ0KHNyYy5nZXQoKS5fTV9zdGFydCksIF9NX2ZpbmlzaChzcmMuZ2V0KCkuX01fZmluaXNoKSwKLSAgICAgIF9NX2VuZF9vZl9zdG9yYWdlKF9fbW92ZV9zb3VyY2U8X0FsbG9jUHJveHk+KHNyYy5nZXQoKS5fTV9lbmRfb2Zfc3RvcmFnZSkpIHsKLSAgICAvL1NldCB0aGUgc291cmNlIGFzIGVtcHR5OgotICAgIHNyYy5nZXQoKS5fTV9maW5pc2ggPSBzcmMuZ2V0KCkuX01fZW5kX29mX3N0b3JhZ2UuX01fZGF0YSA9IHNyYy5nZXQoKS5fTV9zdGFydCA9IDA7Ci0gIH0KLQotICB+X1ZlY3Rvcl9iYXNlKCkgewotICAgIGlmIChfTV9zdGFydCAhPSBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKHBvaW50ZXIpKQotICAgICAgX01fZW5kX29mX3N0b3JhZ2UuZGVhbGxvY2F0ZShfTV9zdGFydCwgX01fZW5kX29mX3N0b3JhZ2UuX01fZGF0YSAtIF9NX3N0YXJ0KTsKLSAgfQotCi1wcm90ZWN0ZWQ6Ci0gIHZvaWQgX1NUTFBfRlVOQ1RJT05fVEhST1dTIF9NX3Rocm93X2xlbmd0aF9lcnJvcigpIGNvbnN0OwotICB2b2lkIF9TVExQX0ZVTkNUSU9OX1RIUk9XUyBfTV90aHJvd19vdXRfb2ZfcmFuZ2UoKSBjb25zdDsKLQotICBwb2ludGVyIF9NX3N0YXJ0OwotICBwb2ludGVyIF9NX2ZpbmlzaDsKLSAgX0FsbG9jUHJveHkgX01fZW5kX29mX3N0b3JhZ2U7Ci19OwotCi0jaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BUUl9TUEVDSUFMSVpBVElPTlMpCi0jICBkZWZpbmUgdmVjdG9yIF9TVExQX1BUUl9JTVBMX05BTUUodmVjdG9yKQotI2VsaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpCi0jICBkZWZpbmUgdmVjdG9yIF9TVExQX05PTl9EQkdfTkFNRSh2ZWN0b3IpCi0jZWxzZQotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi0jZW5kaWYKLQotdGVtcGxhdGUgPGNsYXNzIF9UcCwgX1NUTFBfREVGQVVMVF9BTExPQ0FUT1JfU0VMRUNUKF9UcCkgPgotY2xhc3MgdmVjdG9yIDogcHJvdGVjdGVkIF9TVExQX1BSSVYgX1ZlY3Rvcl9iYXNlPF9UcCwgX0FsbG9jPgotI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QQVJUSUFMX1NQRUNfV09SS0FST1VORCkgJiYgIWRlZmluZWQgKHZlY3RvcikKLSAgICAgICAgICAgICAsIHB1YmxpYyBfX3N0bHBvcnRfY2xhc3M8dmVjdG9yPF9UcCwgX0FsbG9jPiA+Ci0jZW5kaWYKLXsKLXByaXZhdGU6Ci0gIHR5cGVkZWYgX1NUTFBfUFJJViBfVmVjdG9yX2Jhc2U8X1RwLCBfQWxsb2M+IF9CYXNlOwotICB0eXBlZGVmIHZlY3RvcjxfVHAsIF9BbGxvYz4gX1NlbGY7Ci1wdWJsaWM6Ci0gIF9TVExQX0ZPUkNFX0FMTE9DQVRPUlMoX1RwLCBfQWxsb2MpCi0gIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmFsbG9jYXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOwotCi0gIHR5cGVkZWYgX1RwIHZhbHVlX3R5cGU7Ci0gIHR5cGVkZWYgdmFsdWVfdHlwZSogcG9pbnRlcjsKLSAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlKiBjb25zdF9wb2ludGVyOwotICB0eXBlZGVmIHZhbHVlX3R5cGUqIGl0ZXJhdG9yOwotICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUqIGNvbnN0X2l0ZXJhdG9yOwotCi0gIHR5cGVkZWYgdmFsdWVfdHlwZSYgcmVmZXJlbmNlOwotICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmIGNvbnN0X3JlZmVyZW5jZTsKLSAgdHlwZWRlZiBzaXplX3Qgc2l6ZV90eXBlOwotICB0eXBlZGVmIHB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7Ci0gIHR5cGVkZWYgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgX0l0ZXJhdG9yX2NhdGVnb3J5OwotCi0gIF9TVExQX0RFQ0xBUkVfUkFORE9NX0FDQ0VTU19SRVZFUlNFX0lURVJBVE9SUzsKLQotICBhbGxvY2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9yKCkgY29uc3QKLSAgeyByZXR1cm4gX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoKGNvbnN0IGFsbG9jYXRvcl90eXBlJil0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZSwgX1RwKTsgfQotCi1wcml2YXRlOgotICB0eXBlZGVmIHR5cGVuYW1lIF9fdHlwZV90cmFpdHM8X1RwPjo6aGFzX3RyaXZpYWxfYXNzaWdubWVudF9vcGVyYXRvciBfVHJpdmlhbENvcHk7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX190eXBlX3RyYWl0czxfVHA+OjpoYXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yIF9Ucml2aWFsVUNvcHk7Ci0jaWYgIWRlZmluZWQgKF9TVExQX05PX01PVkVfU0VNQU5USUMpCi0gIHR5cGVkZWYgdHlwZW5hbWUgX19tb3ZlX3RyYWl0czxfVHA+OjppbXBsZW1lbnRlZCBfTW92YWJsZTsKLSNlbHNlCi0gIHR5cGVkZWYgX19mYWxzZV90eXBlIF9Nb3ZhYmxlOwotI2VuZGlmCi0KLSAgLy8gaGFuZGxlcyBpbnNlcnRpb25zIG9uIG92ZXJmbG93Ci0gIHZvaWQgX01faW5zZXJ0X292ZXJmbG93X2F1eChwb2ludGVyIF9fcG9zLCBjb25zdCBfVHAmIF9feCwgY29uc3QgX19mYWxzZV90eXBlJiAvKl9Nb3ZhYmxlKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19maWxsX2xlbiwgYm9vbCBfX2F0ZW5kKTsKLSAgdm9pZCBfTV9pbnNlcnRfb3ZlcmZsb3dfYXV4KHBvaW50ZXIgX19wb3MsIGNvbnN0IF9UcCYgX194LCBjb25zdCBfX3RydWVfdHlwZSYgLypfTW92YWJsZSovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fZmlsbF9sZW4sIGJvb2wgX19hdGVuZCkgewotICAgIC8vV2UgbmVlZCB0byB0YWtlIGNhcmUgb2Ygc2VsZiByZWZlcmVuY2luZyBoZXJlOgotICAgIGlmIChfTV9pc19pbnNpZGUoX194KSkgewotICAgICAgdmFsdWVfdHlwZSBfX3hfY29weSA9IF9feDsKLSAgICAgIF9NX2luc2VydF9vdmVyZmxvd19hdXgoX19wb3MsIF9feF9jb3B5LCBfX2ZhbHNlX3R5cGUoKSwgX19maWxsX2xlbiwgX19hdGVuZCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIF9NX2luc2VydF9vdmVyZmxvd19hdXgoX19wb3MsIF9feCwgX19mYWxzZV90eXBlKCksIF9fZmlsbF9sZW4sIF9fYXRlbmQpOwotICB9Ci0KLSAgdm9pZCBfTV9pbnNlcnRfb3ZlcmZsb3cocG9pbnRlciBfX3BvcywgY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypfVHJpdmlhbENvcHkqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fZmlsbF9sZW4sIGJvb2wgX19hdGVuZCA9IGZhbHNlKQotICB7IF9NX2luc2VydF9vdmVyZmxvd19hdXgoX19wb3MsIF9feCwgX01vdmFibGUoKSwgX19maWxsX2xlbiwgX19hdGVuZCk7IH0KLSAgdm9pZCBfTV9pbnNlcnRfb3ZlcmZsb3cocG9pbnRlciBfX3BvcywgY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKl9Ucml2aWFsQ29weSovLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19maWxsX2xlbiwgYm9vbCBfX2F0ZW5kID0gZmFsc2UpOwotICB2b2lkIF9NX3JhbmdlX2NoZWNrKHNpemVfdHlwZSBfX24pIGNvbnN0IHsKLSAgICBpZiAoX19uID49IHNpemVfdHlwZSh0aGlzLT5fTV9maW5pc2ggLSB0aGlzLT5fTV9zdGFydCkpCi0gICAgICB0aGlzLT5fTV90aHJvd19vdXRfb2ZfcmFuZ2UoKTsKLSAgfQotCi1wdWJsaWM6Ci0gIGl0ZXJhdG9yIGJlZ2luKCkgICAgICAgICAgICAgeyByZXR1cm4gdGhpcy0+X01fc3RhcnQ7IH0KLSAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiB0aGlzLT5fTV9zdGFydDsgfQotICBpdGVyYXRvciBlbmQoKSAgICAgICAgICAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX2ZpbmlzaDsgfQotICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCAgIHsgcmV0dXJuIHRoaXMtPl9NX2ZpbmlzaDsgfQotCi0gIHJldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgICAgICAgICAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9Ci0gIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3QgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9Ci0gIHJldmVyc2VfaXRlcmF0b3IgcmVuZCgpICAgICAgICAgICAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KLSAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgY29uc3QgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQotCi0gIHNpemVfdHlwZSBzaXplKCkgY29uc3QgICAgICAgIHsgcmV0dXJuIHNpemVfdHlwZSh0aGlzLT5fTV9maW5pc2ggLSB0aGlzLT5fTV9zdGFydCk7IH0KLSAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgewotICAgIHNpemVfdHlwZSBfX3ZlY3Rvcl9tYXhfc2l6ZSA9IHNpemVfdHlwZSgtMSkgLyBzaXplb2YoX1RwKTsKLSAgICB0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6c2l6ZV90eXBlIF9fYWxsb2NfbWF4X3NpemUgPSB0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5tYXhfc2l6ZSgpOwotICAgIHJldHVybiAoX19hbGxvY19tYXhfc2l6ZSA8IF9fdmVjdG9yX21heF9zaXplKT9fX2FsbG9jX21heF9zaXplOl9fdmVjdG9yX21heF9zaXplOwotICB9Ci0KLSAgc2l6ZV90eXBlIGNhcGFjaXR5KCkgY29uc3QgICAgeyByZXR1cm4gc2l6ZV90eXBlKHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLl9NX2RhdGEgLSB0aGlzLT5fTV9zdGFydCk7IH0KLSAgYm9vbCBlbXB0eSgpIGNvbnN0ICAgICAgICAgICAgeyByZXR1cm4gdGhpcy0+X01fc3RhcnQgPT0gdGhpcy0+X01fZmluaXNoOyB9Ci0KLSAgcmVmZXJlbmNlIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fbikgeyByZXR1cm4gKihiZWdpbigpICsgX19uKTsgfQotICBjb25zdF9yZWZlcmVuY2Ugb3BlcmF0b3JbXShzaXplX3R5cGUgX19uKSBjb25zdCB7IHJldHVybiAqKGJlZ2luKCkgKyBfX24pOyB9Ci0KLSAgcmVmZXJlbmNlIGZyb250KCkgICAgICAgICAgICAgeyByZXR1cm4gKmJlZ2luKCk7IH0KLSAgY29uc3RfcmVmZXJlbmNlIGZyb250KCkgY29uc3QgeyByZXR1cm4gKmJlZ2luKCk7IH0KLSAgcmVmZXJlbmNlIGJhY2soKSAgICAgICAgICAgICAgeyByZXR1cm4gKihlbmQoKSAtIDEpOyB9Ci0gIGNvbnN0X3JlZmVyZW5jZSBiYWNrKCkgY29uc3QgIHsgcmV0dXJuICooZW5kKCkgLSAxKTsgfQotCi0gIHJlZmVyZW5jZSBhdChzaXplX3R5cGUgX19uKSB7IF9NX3JhbmdlX2NoZWNrKF9fbik7IHJldHVybiAoKnRoaXMpW19fbl07IH0KLSAgY29uc3RfcmVmZXJlbmNlIGF0KHNpemVfdHlwZSBfX24pIGNvbnN0IHsgX01fcmFuZ2VfY2hlY2soX19uKTsgcmV0dXJuICgqdGhpcylbX19uXTsgfQotCi0jaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCi0gIGV4cGxpY2l0IHZlY3Rvcihjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKLSNlbHNlCi0gIHZlY3RvcigpCi0gICAgOiBfU1RMUF9QUklWIF9WZWN0b3JfYmFzZTxfVHAsIF9BbGxvYz4oYWxsb2NhdG9yX3R5cGUoKSkge30KLSAgdmVjdG9yKGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCi0jZW5kaWYKLSAgICA6IF9TVExQX1BSSVYgX1ZlY3Rvcl9iYXNlPF9UcCwgX0FsbG9jPihfX2EpIHt9Ci0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKLXByaXZhdGU6Ci0gIC8vV2UgYWx3YXlzIGNhbGwgX01faW5pdGlhbGl6ZSB3aXRoIG9ubHkgMSBwYXJhbWV0ZXIuIERlZmF1bHQgcGFyYW1ldGVyCi0gIC8vaXMgdXNlZCB0byBhbGxvdyBleHBsaWNpdCBpbnN0YW5jaWF0aW9uIG9mIHZlY3RvciB3aXRoIHR5cGVzIHdpdGggbm8KLSAgLy9kZWZhdWx0IGNvbnN0cnVjdG9yLgotICB2b2lkIF9NX2luaXRpYWxpemUoc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3ZhbCA9IF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQoX1RwKSkKLSAgeyB0aGlzLT5fTV9maW5pc2ggPSBfU1RMUF9QUklWIF9fdW5pbml0aWFsaXplZF9pbml0KHRoaXMtPl9NX3N0YXJ0LCBfX24sIF9fdmFsKTsgfQotcHVibGljOgotICBleHBsaWNpdCB2ZWN0b3Ioc2l6ZV90eXBlIF9fbikKLSAgICA6IF9TVExQX1BSSVYgX1ZlY3Rvcl9iYXNlPF9UcCwgX0FsbG9jPihfX24sIGFsbG9jYXRvcl90eXBlKCkpCi0gIHsgX01faW5pdGlhbGl6ZShfX24pOyB9Ci0gIHZlY3RvcihzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9fdmFsLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKLSNlbHNlCi0gIGV4cGxpY2l0IHZlY3RvcihzaXplX3R5cGUgX19uKQotICAgIDogX1NUTFBfUFJJViBfVmVjdG9yX2Jhc2U8X1RwLCBfQWxsb2M+KF9fbiwgYWxsb2NhdG9yX3R5cGUoKSkKLSAgeyB0aGlzLT5fTV9maW5pc2ggPSBfU1RMUF9QUklWIF9fdW5pbml0aWFsaXplZF9pbml0KHRoaXMtPl9NX3N0YXJ0LCBfX24sIF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQoX1RwKSk7IH0KLSAgdmVjdG9yKHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX192YWwpCi0gICAgOiBfU1RMUF9QUklWIF9WZWN0b3JfYmFzZTxfVHAsIF9BbGxvYz4oX19uLCBhbGxvY2F0b3JfdHlwZSgpKQotICB7IHRoaXMtPl9NX2ZpbmlzaCA9IF9TVExQX1BSSVYgX191bmluaXRpYWxpemVkX2ZpbGxfbih0aGlzLT5fTV9zdGFydCwgX19uLCBfX3ZhbCk7IH0KLSAgdmVjdG9yKHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX192YWwsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCi0jZW5kaWYKLSAgICA6IF9TVExQX1BSSVYgX1ZlY3Rvcl9iYXNlPF9UcCwgX0FsbG9jPihfX24sIF9fYSkKLSAgeyB0aGlzLT5fTV9maW5pc2ggPSBfU1RMUF9QUklWIF9fdW5pbml0aWFsaXplZF9maWxsX24odGhpcy0+X01fc3RhcnQsIF9fbiwgX192YWwpOyB9Ci0KLSAgdmVjdG9yKGNvbnN0IF9TZWxmJiBfX3gpCi0gICAgOiBfU1RMUF9QUklWIF9WZWN0b3JfYmFzZTxfVHAsIF9BbGxvYz4oX194LnNpemUoKSwgX194LmdldF9hbGxvY2F0b3IoKSkKLSAgeyB0aGlzLT5fTV9maW5pc2ggPSBfU1RMUF9QUklWIF9fdWNvcHlfcHRycyhfX3guYmVnaW4oKSwgX194LmVuZCgpLCB0aGlzLT5fTV9zdGFydCwgX1RyaXZpYWxVQ29weSgpKTsgfQotCi0gIHZlY3RvcihfX21vdmVfc291cmNlPF9TZWxmPiBzcmMpCi0gICAgOiBfU1RMUF9QUklWIF9WZWN0b3JfYmFzZTxfVHAsIF9BbGxvYz4oX19tb3ZlX3NvdXJjZTxfQmFzZT4oc3JjLmdldCgpKSkKLSAge30KLQotI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCi1wcml2YXRlOgotICB0ZW1wbGF0ZSA8Y2xhc3MgX0ludGVnZXI+Ci0gIHZvaWQgX01faW5pdGlhbGl6ZV9hdXgoX0ludGVnZXIgX19uLCBfSW50ZWdlciBfX3ZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX3RydWVfdHlwZSYgLypfSXNJbnRlZ3JhbCovKSB7Ci0gICAgc2l6ZV90eXBlIF9fcmVhbF9uOwotICAgIHRoaXMtPl9NX3N0YXJ0ID0gdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuYWxsb2NhdGUoX19uLCBfX3JlYWxfbik7Ci0gICAgdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuX01fZGF0YSA9IHRoaXMtPl9NX3N0YXJ0ICsgX19yZWFsX247Ci0gICAgdGhpcy0+X01fZmluaXNoID0gX1NUTFBfUFJJViBfX3VuaW5pdGlhbGl6ZWRfZmlsbF9uKHRoaXMtPl9NX3N0YXJ0LCBfX24sIF9fdmFsKTsKLSAgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KLSAgdm9pZCBfTV9pbml0aWFsaXplX2F1eChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19mYWxzZV90eXBlJiAvKl9Jc0ludGVncmFsKi8pCi0gIHsgX01fcmFuZ2VfaW5pdGlhbGl6ZShfX2ZpcnN0LCBfX2xhc3QsIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yKSk7IH0KLQotcHVibGljOgotICAvLyBDaGVjayB3aGV0aGVyIGl0J3MgYW4gaW50ZWdyYWwgdHlwZS4gIElmIHNvLCBpdCdzIG5vdCBhbiBpdGVyYXRvci4KLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgotICB2ZWN0b3IoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAotICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSBfU1RMUF9BTExPQ0FUT1JfVFlQRV9ERkwgKQotICAgIDogX1NUTFBfUFJJViBfVmVjdG9yX2Jhc2U8X1RwLCBfQWxsb2M+KF9fYSkgewotICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lzSW50ZWdyYWw8X0lucHV0SXRlcmF0b3I+OjpfUmV0IF9JbnRlZ3JhbDsKLSAgICBfTV9pbml0aWFsaXplX2F1eChfX2ZpcnN0LCBfX2xhc3QsIF9JbnRlZ3JhbCgpKTsKLSAgfQotCi0jICBpZiBkZWZpbmVkIChfU1RMUF9ORUVEU19FWFRSQV9URU1QTEFURV9DT05TVFJVQ1RPUlMpCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KLSAgdmVjdG9yKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKLSAgICA6IF9TVExQX1BSSVYgX1ZlY3Rvcl9iYXNlPF9UcCwgX0FsbG9jPihhbGxvY2F0b3JfdHlwZSgpKSB7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBfSXNJbnRlZ3JhbDxfSW5wdXRJdGVyYXRvcj46Ol9SZXQgX0ludGVncmFsOwotICAgIF9NX2luaXRpYWxpemVfYXV4KF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOwotICB9Ci0jICBlbmRpZiAvKiBfU1RMUF9ORUVEU19FWFRSQV9URU1QTEFURV9DT05TVFJVQ1RPUlMgKi8KLQotI2Vsc2UgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLwotICB2ZWN0b3IoY29uc3QgX1RwKiBfX2ZpcnN0LCBjb25zdCBfVHAqIF9fbGFzdCwKLSAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQotICAgIDogX1NUTFBfUFJJViBfVmVjdG9yX2Jhc2U8X1RwLCBfQWxsb2M+KF9fbGFzdCAtIF9fZmlyc3QsIF9fYSkKLSAgeyB0aGlzLT5fTV9maW5pc2ggPSBfU1RMUF9QUklWIF9fdWNvcHlfcHRycyhfX2ZpcnN0LCBfX2xhc3QsIHRoaXMtPl9NX3N0YXJ0LCBfVHJpdmlhbFVDb3B5KCkpOyB9Ci0jZW5kaWYgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLwotCi0gIC8vQXMgdGhlIHZlY3RvciBjb250YWluZXIgaXMgYSBiYWNrIGluc2VydCBvcmllbnRlZCBjb250YWluZXIgaXQKLSAgLy9zZWVtcyByYXRoZXIgbG9naWNhbCB0byBkZXN0cm95IGVsZW1lbnRzIGluIHJldmVyc2Ugb3JkZXIuCi0gIH52ZWN0b3IoKSB7IF9TVExQX1NURDo6X0Rlc3Ryb3lfUmFuZ2UocmJlZ2luKCksIHJlbmQoKSk7IH0KLQotICBfU2VsZiYgb3BlcmF0b3I9KGNvbnN0IF9TZWxmJiBfX3gpOwotCi0gIHZvaWQgcmVzZXJ2ZShzaXplX3R5cGUgX19uKTsKLQotICAvLyBhc3NpZ24oKSwgYSBnZW5lcmFsaXplZCBhc3NpZ25tZW50IG1lbWJlciBmdW5jdGlvbi4gIFR3bwotICAvLyB2ZXJzaW9uczogb25lIHRoYXQgdGFrZXMgYSBjb3VudCwgYW5kIG9uZSB0aGF0IHRha2VzIGEgcmFuZ2UuCi0gIC8vIFRoZSByYW5nZSB2ZXJzaW9uIGlzIGEgbWVtYmVyIHRlbXBsYXRlLCBzbyB3ZSBkaXNwYXRjaCBvbiB3aGV0aGVyCi0gIC8vIG9yIG5vdCB0aGUgdHlwZSBpcyBhbiBpbnRlZ2VyLgotCi0gIHZvaWQgYXNzaWduKHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX192YWwpIHsgX01fZmlsbF9hc3NpZ24oX19uLCBfX3ZhbCk7IH0KLSAgdm9pZCBfTV9maWxsX2Fzc2lnbihzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9fdmFsKTsKLQotI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCi0gIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXI+Ci0gIHZvaWQgX01fYXNzaWduX2F1eChfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwgY29uc3QgZm9yd2FyZF9pdGVyYXRvcl90YWcgJikgewotI2Vsc2UKLSAgdm9pZCBhc3NpZ24oY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KSB7Ci0gICAgdHlwZWRlZiBjb25zdF9pdGVyYXRvciBfRm9yd2FyZEl0ZXI7Ci0jZW5kaWYKLSAgICBjb25zdCBzaXplX3R5cGUgX19sZW4gPSBkaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QpOwotICAgIGlmIChfX2xlbiA+IGNhcGFjaXR5KCkpIHsKLSAgICAgIHNpemVfdHlwZSBfX24gPSBfX2xlbjsKLSAgICAgIGl0ZXJhdG9yIF9fdG1wID0gX01fYWxsb2NhdGVfYW5kX2NvcHkoX19uLCBfX2ZpcnN0LCBfX2xhc3QpOwotICAgICAgX01fY2xlYXIoKTsKLSAgICAgIF9NX3NldChfX3RtcCwgX190bXAgKyBfX2xlbiwgX190bXAgKyBfX24pOwotICAgIH0KLSAgICBlbHNlIGlmIChzaXplKCkgPj0gX19sZW4pIHsKLSAgICAgIGl0ZXJhdG9yIF9fbmV3X2ZpbmlzaCA9IGNvcHkoX19maXJzdCwgX19sYXN0LCB0aGlzLT5fTV9zdGFydCk7Ci0gICAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95X1JhbmdlKF9fbmV3X2ZpbmlzaCwgdGhpcy0+X01fZmluaXNoKTsKLSAgICAgIHRoaXMtPl9NX2ZpbmlzaCA9IF9fbmV3X2ZpbmlzaDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBfRm9yd2FyZEl0ZXIgX19taWQgPSBfX2ZpcnN0OwotICAgICAgYWR2YW5jZShfX21pZCwgc2l6ZSgpKTsKLSAgICAgIGNvcHkoX19maXJzdCwgX19taWQsIHRoaXMtPl9NX3N0YXJ0KTsKLSAgICAgIHRoaXMtPl9NX2ZpbmlzaCA9IHVuaW5pdGlhbGl6ZWRfY29weShfX21pZCwgX19sYXN0LCB0aGlzLT5fTV9maW5pc2gpOwotICAgIH0KLSAgfQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXI+Ci0gIHZvaWQgX01fYXNzaWduX2F1eChfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5wdXRfaXRlcmF0b3JfdGFnICYpIHsKLSAgICBpdGVyYXRvciBfX2N1ciA9IGJlZ2luKCk7Ci0gICAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdCAmJiBfX2N1ciAhPSBlbmQoKTsgKytfX2N1ciwgKytfX2ZpcnN0KQotICAgICAgKl9fY3VyID0gKl9fZmlyc3Q7Ci0gICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQotICAgICAgZXJhc2UoX19jdXIsIGVuZCgpKTsKLSAgICBlbHNlCi0gICAgICBpbnNlcnQoZW5kKCksIF9fZmlyc3QsIF9fbGFzdCk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0ludGVnZXI+Ci0gIHZvaWQgX01fYXNzaWduX2Rpc3BhdGNoKF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX192YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKl9Jc0ludGVncmFsKi8pCi0gIHsgX01fZmlsbF9hc3NpZ24oX19uLCBfX3ZhbCk7IH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcj4KLSAgdm9pZCBfTV9hc3NpZ25fZGlzcGF0Y2goX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19mYWxzZV90eXBlJiAvKl9Jc0ludGVncmFsKi8pCi0gIHsgX01fYXNzaWduX2F1eChfX2ZpcnN0LCBfX2xhc3QsIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9fZmlyc3QsIF9JbnB1dEl0ZXIpKTsgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KLSAgdm9pZCBhc3NpZ24oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KSB7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBfSXNJbnRlZ3JhbDxfSW5wdXRJdGVyYXRvcj46Ol9SZXQgX0ludGVncmFsOwotICAgIF9NX2Fzc2lnbl9kaXNwYXRjaChfX2ZpcnN0LCBfX2xhc3QsIF9JbnRlZ3JhbCgpKTsKLSAgfQotI2VuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KLQotI2lmICFkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fQU5BQ0hST05JU01TKQotICB2b2lkIHB1c2hfYmFjayhjb25zdCBfVHAmIF9feCA9IF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQoX1RwKSkgewotI2Vsc2UKLSAgdm9pZCBwdXNoX2JhY2soY29uc3QgX1RwJiBfX3gpIHsKLSNlbmRpZiAvKiFfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNICYmICFfU1RMUF9OT19BTkFDSFJPTklTTVMqLwotICAgIGlmICh0aGlzLT5fTV9maW5pc2ggIT0gdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuX01fZGF0YSkgewotICAgICAgX0NvcHlfQ29uc3RydWN0KHRoaXMtPl9NX2ZpbmlzaCwgX194KTsKLSAgICAgICsrdGhpcy0+X01fZmluaXNoOwotICAgIH0KLSAgICBlbHNlCi0gICAgICBfTV9pbnNlcnRfb3ZlcmZsb3codGhpcy0+X01fZmluaXNoLCBfX3gsIF9Ucml2aWFsQ29weSgpLCAxVUwsIHRydWUpOwotICB9Ci0KLSNpZiAhZGVmaW5lZChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKSAmJiAhZGVmaW5lZChfU1RMUF9OT19BTkFDSFJPTklTTVMpCi0gIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBfX3BvcywgY29uc3QgX1RwJiBfX3ggPSBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKF9UcCkpOwotI2Vsc2UKLSAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBjb25zdCBfVHAmIF9feCk7Ci0jZW5kaWYgLyohX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSAmJiAhX1NUTFBfTk9fQU5BQ0hST05JU01TKi8KLQotI2lmIGRlZmluZWQoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkgJiYgIWRlZmluZWQoX1NUTFBfTk9fQU5BQ0hST05JU01TKQotICB2b2lkIHB1c2hfYmFjaygpIHsgcHVzaF9iYWNrKF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQoX1RwKSk7IH0KLSAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zKSB7IHJldHVybiBpbnNlcnQoX19wb3MsIF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQoX1RwKSk7IH0KLSNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0gJiYgIV9TVExQX05PX0FOQUNIUk9OSVNNUyovCi0KLSAgdm9pZCBzd2FwKF9TZWxmJiBfX3gpIHsKLSAgICBfU1RMUF9TVEQ6OnN3YXAodGhpcy0+X01fc3RhcnQsIF9feC5fTV9zdGFydCk7Ci0gICAgX1NUTFBfU1REOjpzd2FwKHRoaXMtPl9NX2ZpbmlzaCwgX194Ll9NX2ZpbmlzaCk7Ci0gICAgdGhpcy0+X01fZW5kX29mX3N0b3JhZ2Uuc3dhcChfX3guX01fZW5kX29mX3N0b3JhZ2UpOwotICB9Ci0KLXByaXZhdGU6Ci0gIHZvaWQgX01fZmlsbF9pbnNlcnRfYXV4IChpdGVyYXRvciBfX3Bvcywgc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKl9Nb3ZhYmxlKi8pOwotICB2b2lkIF9NX2ZpbGxfaW5zZXJ0X2F1eCAoaXRlcmF0b3IgX19wb3MsIHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX194LCBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qX01vdmFibGUqLyk7Ci0gIHZvaWQgX01fZmlsbF9pbnNlcnQgKGl0ZXJhdG9yIF9fcG9zLCBzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9feCk7Ci0KLSAgYm9vbCBfTV9pc19pbnNpZGUoY29uc3QgdmFsdWVfdHlwZSYgX194KSBjb25zdCB7Ci0gICAgcmV0dXJuICgmX194ID49IHRoaXMtPl9NX3N0YXJ0ICYmICZfX3ggPCB0aGlzLT5fTV9maW5pc2gpOwotICB9Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KLSAgdm9pZCBfTV9yYW5nZV9pbnNlcnRfcmVhbGxvYyhpdGVyYXRvciBfX3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAotI2Vsc2UKLSAgdm9pZCBfTV9yYW5nZV9pbnNlcnRfcmVhbGxvYyhpdGVyYXRvciBfX3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QsCi0jZW5kaWYgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX24pIHsKLSAgICBjb25zdCBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IHNpemUoKTsKLSAgICBzaXplX3R5cGUgX19sZW4gPSBfX29sZF9zaXplICsgKG1heCkoX19vbGRfc2l6ZSwgX19uKTsKLSAgICBwb2ludGVyIF9fbmV3X3N0YXJ0ID0gdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuYWxsb2NhdGUoX19sZW4sIF9fbGVuKTsKLSAgICBwb2ludGVyIF9fbmV3X2ZpbmlzaCA9IF9fbmV3X3N0YXJ0OwotICAgIF9TVExQX1RSWSB7Ci0gICAgICBfX25ld19maW5pc2ggPSBfU1RMUF9QUklWIF9fdW5pbml0aWFsaXplZF9tb3ZlKHRoaXMtPl9NX3N0YXJ0LCBfX3BvcywgX19uZXdfc3RhcnQsIF9Ucml2aWFsVUNvcHkoKSwgX01vdmFibGUoKSk7Ci0gICAgICBfX25ld19maW5pc2ggPSB1bmluaXRpYWxpemVkX2NvcHkoX19maXJzdCwgX19sYXN0LCBfX25ld19maW5pc2gpOwotICAgICAgX19uZXdfZmluaXNoID0gX1NUTFBfUFJJViBfX3VuaW5pdGlhbGl6ZWRfbW92ZShfX3BvcywgdGhpcy0+X01fZmluaXNoLCBfX25ld19maW5pc2gsIF9Ucml2aWFsVUNvcHkoKSwgX01vdmFibGUoKSk7Ci0gICAgfQotICAgIF9TVExQX1VOV0lORCgoX1NUTFBfU1REOjpfRGVzdHJveV9SYW5nZShfX25ld19zdGFydCxfX25ld19maW5pc2gpLAotICAgICAgICAgICAgICAgICAgdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuZGVhbGxvY2F0ZShfX25ld19zdGFydCxfX2xlbikpKQotICAgIF9NX2NsZWFyX2FmdGVyX21vdmUoKTsKLSAgICBfTV9zZXQoX19uZXdfc3RhcnQsIF9fbmV3X2ZpbmlzaCwgX19uZXdfc3RhcnQgKyBfX2xlbik7Ci0gIH0KLQotI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCi0gIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgotICB2b2lkIF9NX3JhbmdlX2luc2VydF9hdXgoaXRlcmF0b3IgX19wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAotI2Vsc2UKLSAgdm9pZCBfTV9yYW5nZV9pbnNlcnRfYXV4KGl0ZXJhdG9yIF9fcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0LAotI2VuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX24sIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKl9Nb3ZhYmxlKi8pIHsKLSAgICBpdGVyYXRvciBfX3NyYyA9IHRoaXMtPl9NX2ZpbmlzaCAtIDE7Ci0gICAgaXRlcmF0b3IgX19kc3QgPSBfX3NyYyArIF9fbjsKLSAgICBmb3IgKDsgX19zcmMgPj0gX19wb3M7IC0tX19kc3QsIC0tX19zcmMpIHsKLSAgICAgIF9TVExQX1NURDo6X01vdmVfQ29uc3RydWN0KF9fZHN0LCAqX19zcmMpOwotICAgICAgX1NUTFBfU1REOjpfRGVzdHJveV9Nb3ZlZChfX3NyYyk7Ci0gICAgfQotICAgIHVuaW5pdGlhbGl6ZWRfY29weShfX2ZpcnN0LCBfX2xhc3QsIF9fcG9zKTsKLSAgICB0aGlzLT5fTV9maW5pc2ggKz0gX19uOwotICB9Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KLSAgdm9pZCBfTV9yYW5nZV9pbnNlcnRfYXV4KGl0ZXJhdG9yIF9fcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKLSNlbHNlCi0gIHZvaWQgX01fcmFuZ2VfaW5zZXJ0X2F1eChpdGVyYXRvciBfX3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCwKLSNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uLCBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qX01vdmFibGUqLykgewotICAgIGNvbnN0IHNpemVfdHlwZSBfX2VsZW1zX2FmdGVyID0gdGhpcy0+X01fZmluaXNoIC0gX19wb3M7Ci0gICAgcG9pbnRlciBfX29sZF9maW5pc2ggPSB0aGlzLT5fTV9maW5pc2g7Ci0gICAgaWYgKF9fZWxlbXNfYWZ0ZXIgPiBfX24pIHsKLSAgICAgIF9TVExQX1BSSVYgX191Y29weV9wdHJzKHRoaXMtPl9NX2ZpbmlzaCAtIF9fbiwgdGhpcy0+X01fZmluaXNoLCB0aGlzLT5fTV9maW5pc2gsIF9Ucml2aWFsVUNvcHkoKSk7Ci0gICAgICB0aGlzLT5fTV9maW5pc2ggKz0gX19uOwotICAgICAgX1NUTFBfUFJJViBfX2NvcHlfYmFja3dhcmRfcHRycyhfX3BvcywgX19vbGRfZmluaXNoIC0gX19uLCBfX29sZF9maW5pc2gsIF9Ucml2aWFsQ29weSgpKTsKLSAgICAgIGNvcHkoX19maXJzdCwgX19sYXN0LCBfX3Bvcyk7Ci0gICAgfQotICAgIGVsc2UgewotI2lmIGRlZmluZWQgKCBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICkKLSAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19taWQgPSBfX2ZpcnN0OwotICAgICAgYWR2YW5jZShfX21pZCwgX19lbGVtc19hZnRlcik7Ci0jZWxzZQotICAgICAgY29uc3RfcG9pbnRlciBfX21pZCA9IF9fZmlyc3QgKyBfX2VsZW1zX2FmdGVyOwotI2VuZGlmCi0gICAgICB1bmluaXRpYWxpemVkX2NvcHkoX19taWQsIF9fbGFzdCwgdGhpcy0+X01fZmluaXNoKTsKLSAgICAgIHRoaXMtPl9NX2ZpbmlzaCArPSBfX24gLSBfX2VsZW1zX2FmdGVyOwotICAgICAgX1NUTFBfUFJJViBfX3Vjb3B5X3B0cnMoX19wb3MsIF9fb2xkX2ZpbmlzaCwgdGhpcy0+X01fZmluaXNoLCBfVHJpdmlhbFVDb3B5KCkpOwotICAgICAgdGhpcy0+X01fZmluaXNoICs9IF9fZWxlbXNfYWZ0ZXI7Ci0gICAgICBjb3B5KF9fZmlyc3QsIF9fbWlkLCBfX3Bvcyk7Ci0gICAgfSAvKiBlbGVtc19hZnRlciAqLwotICB9Ci0KLQotI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW50ZWdlcj4KLSAgdm9pZCBfTV9pbnNlcnRfZGlzcGF0Y2goaXRlcmF0b3IgX19wb3MsIF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX192YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fdHJ1ZV90eXBlJikKLSAgeyBfTV9maWxsX2luc2VydChfX3BvcywgKHNpemVfdHlwZSkgX19uLCAoX1RwKSBfX3ZhbCk7IH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Ci0gIHZvaWQgX01faW5zZXJ0X2Rpc3BhdGNoKGl0ZXJhdG9yIF9fcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fZmFsc2VfdHlwZSYpCi0gIHsgX01fcmFuZ2VfaW5zZXJ0KF9fcG9zLCBfX2ZpcnN0LCBfX2xhc3QsIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yKSk7IH0KLQotcHVibGljOgotICAvLyBDaGVjayB3aGV0aGVyIGl0J3MgYW4gaW50ZWdyYWwgdHlwZS4gIElmIHNvLCBpdCdzIG5vdCBhbiBpdGVyYXRvci4KLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgotICB2b2lkIGluc2VydChpdGVyYXRvciBfX3BvcywgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KSB7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBfSXNJbnRlZ3JhbDxfSW5wdXRJdGVyYXRvcj46Ol9SZXQgX0ludGVncmFsOwotICAgIF9NX2luc2VydF9kaXNwYXRjaChfX3BvcywgX19maXJzdCwgX19sYXN0LCBfSW50ZWdyYWwoKSk7Ci0gIH0KLQotcHJpdmF0ZToKLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgotICB2b2lkIF9NX3JhbmdlX2luc2VydChpdGVyYXRvciBfX3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnB1dF9pdGVyYXRvcl90YWcgJikgewotICAgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkgewotICAgICAgX19wb3MgPSBpbnNlcnQoX19wb3MsICpfX2ZpcnN0KTsKLSAgICAgICsrX19wb3M7Ci0gICAgfQotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+Ci0gIHZvaWQgX01fcmFuZ2VfaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLAotICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3J3YXJkX2l0ZXJhdG9yX3RhZyAmKSB7Ci0jZWxzZSAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCi1wdWJsaWM6Ci0gIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLAotICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpIHsKLSNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCi0gICAgLyogVGhpcyBtZXRob2QgZG8gbm90IGNoZWNrIHNlbGYgcmVmZXJlbmNpbmcuCi0gICAgICogU3RhbmRhcmQgZm9yYmlkcyBpdCwgY2hlY2tlZCBieSB0aGUgZGVidWcgbW9kZS4KLSAgICAgKi8KLSAgICBpZiAoX19maXJzdCAhPSBfX2xhc3QpIHsKLSAgICAgIHNpemVfdHlwZSBfX24gPSBkaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QpOwotCi0gICAgICBpZiAoc2l6ZV90eXBlKHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLl9NX2RhdGEgLSB0aGlzLT5fTV9maW5pc2gpID49IF9fbikgewotICAgICAgICBfTV9yYW5nZV9pbnNlcnRfYXV4KF9fcG9zLCBfX2ZpcnN0LCBfX2xhc3QsIF9fbiwgX01vdmFibGUoKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgX01fcmFuZ2VfaW5zZXJ0X3JlYWxsb2MoX19wb3MsIF9fZmlyc3QsIF9fbGFzdCwgX19uKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotcHVibGljOgotICB2b2lkIGluc2VydCAoaXRlcmF0b3IgX19wb3MsIHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX194KQotICB7IF9NX2ZpbGxfaW5zZXJ0KF9fcG9zLCBfX24sIF9feCk7IH0KLQotICB2b2lkIHBvcF9iYWNrKCkgewotICAgIC0tdGhpcy0+X01fZmluaXNoOwotICAgIF9TVExQX1NURDo6X0Rlc3Ryb3kodGhpcy0+X01fZmluaXNoKTsKLSAgfQotCi1wcml2YXRlOgotICBpdGVyYXRvciBfTV9lcmFzZShpdGVyYXRvciBfX3BvcywgY29uc3QgX190cnVlX3R5cGUmIC8qX01vdmFibGUqLykgewotICAgIF9TVExQX1NURDo6X0Rlc3Ryb3koX19wb3MpOwotICAgIGl0ZXJhdG9yIF9fZHN0ID0gX19wb3MsIF9fc3JjID0gX19kc3QgKyAxOwotICAgIGl0ZXJhdG9yIF9fZW5kID0gZW5kKCk7Ci0gICAgZm9yICg7IF9fc3JjICE9IF9fZW5kOyArK19fZHN0LCArK19fc3JjKSB7Ci0gICAgICBfU1RMUF9TVEQ6Ol9Nb3ZlX0NvbnN0cnVjdChfX2RzdCwgKl9fc3JjKTsKLSAgICAgIF9TVExQX1NURDo6X0Rlc3Ryb3lfTW92ZWQoX19zcmMpOwotICAgIH0KLSAgICB0aGlzLT5fTV9maW5pc2ggPSBfX2RzdDsKLSAgICByZXR1cm4gX19wb3M7Ci0gIH0KLSAgaXRlcmF0b3IgX01fZXJhc2UoaXRlcmF0b3IgX19wb3MsIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypfTW92YWJsZSovKSB7Ci0gICAgaWYgKF9fcG9zICsgMSAhPSBlbmQoKSkKLSAgICAgIF9TVExQX1BSSVYgX19jb3B5X3B0cnMoX19wb3MgKyAxLCB0aGlzLT5fTV9maW5pc2gsIF9fcG9zLCBfVHJpdmlhbENvcHkoKSk7Ci0gICAgLS10aGlzLT5fTV9maW5pc2g7Ci0gICAgX1NUTFBfU1REOjpfRGVzdHJveSh0aGlzLT5fTV9maW5pc2gpOwotICAgIHJldHVybiBfX3BvczsKLSAgfQotICBpdGVyYXRvciBfTV9lcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QsIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKl9Nb3ZhYmxlKi8pIHsKLSAgICBpdGVyYXRvciBfX2RzdCA9IF9fZmlyc3QsIF9fc3JjID0gX19sYXN0OwotICAgIGl0ZXJhdG9yIF9fZW5kID0gZW5kKCk7Ci0gICAgZm9yICg7IF9fZHN0ICE9IF9fbGFzdCAmJiBfX3NyYyAhPSBfX2VuZDsgKytfX2RzdCwgKytfX3NyYykgewotICAgICAgX1NUTFBfU1REOjpfRGVzdHJveShfX2RzdCk7Ci0gICAgICBfU1RMUF9TVEQ6Ol9Nb3ZlX0NvbnN0cnVjdChfX2RzdCwgKl9fc3JjKTsKLSAgICB9Ci0gICAgaWYgKF9fZHN0ICE9IF9fbGFzdCkgewotICAgICAgLy9UaGVyZSBpcyBtb3JlIGVsZW1lbnRzIHRvIGVyYXNlIHRoYW4gZWxlbWVudCB0byBtb3ZlOgotICAgICAgX1NUTFBfU1REOjpfRGVzdHJveV9SYW5nZShfX2RzdCwgX19sYXN0KTsKLSAgICAgIF9TVExQX1NURDo6X0Rlc3Ryb3lfTW92ZWRfUmFuZ2UoX19sYXN0LCBfX2VuZCk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgLy9UaGVyZSBpcyBtb3JlIGVsZW1lbnQgdG8gbW92ZSB0aGFuIGVsZW1lbnQgdG8gZXJhc2U6Ci0gICAgICBmb3IgKDsgX19zcmMgIT0gX19lbmQ7ICsrX19kc3QsICsrX19zcmMpIHsKLSAgICAgICAgX1NUTFBfU1REOjpfRGVzdHJveV9Nb3ZlZChfX2RzdCk7Ci0gICAgICAgIF9TVExQX1NURDo6X01vdmVfQ29uc3RydWN0KF9fZHN0LCAqX19zcmMpOwotICAgICAgfQotICAgICAgX1NUTFBfU1REOjpfRGVzdHJveV9Nb3ZlZF9SYW5nZShfX2RzdCwgX19lbmQpOwotICAgIH0KLSAgICB0aGlzLT5fTV9maW5pc2ggPSBfX2RzdDsKLSAgICByZXR1cm4gX19maXJzdDsKLSAgfQotICBpdGVyYXRvciBfTV9lcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QsIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypfTW92YWJsZSovKSB7Ci0gICAgcG9pbnRlciBfX2kgPSBfU1RMUF9QUklWIF9fY29weV9wdHJzKF9fbGFzdCwgdGhpcy0+X01fZmluaXNoLCBfX2ZpcnN0LCBfVHJpdmlhbENvcHkoKSk7Ci0gICAgX1NUTFBfU1REOjpfRGVzdHJveV9SYW5nZShfX2ksIHRoaXMtPl9NX2ZpbmlzaCk7Ci0gICAgdGhpcy0+X01fZmluaXNoID0gX19pOwotICAgIHJldHVybiBfX2ZpcnN0OwotICB9Ci0KLXB1YmxpYzoKLSAgaXRlcmF0b3IgZXJhc2UoaXRlcmF0b3IgX19wb3MpIHsKLSAgICByZXR1cm4gX01fZXJhc2UoX19wb3MsIF9Nb3ZhYmxlKCkpOwotICB9Ci0gIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkgewotICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKLSAgICAgIHJldHVybiBfX2ZpcnN0OwotICAgIHJldHVybiBfTV9lcmFzZShfX2ZpcnN0LCBfX2xhc3QsIF9Nb3ZhYmxlKCkpOwotICB9Ci0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKLSAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9fbmV3X3NpemUsIGNvbnN0IF9UcCYgX194ID0gX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRChfVHApKSB7Ci0jZWxzZQotICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgX19uZXdfc2l6ZSwgY29uc3QgX1RwJiBfX3gpIHsKLSNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0qLwotICAgIGlmIChfX25ld19zaXplIDwgc2l6ZSgpKQotICAgICAgZXJhc2UoYmVnaW4oKSArIF9fbmV3X3NpemUsIGVuZCgpKTsKLSAgICBlbHNlCi0gICAgICBpbnNlcnQoZW5kKCksIF9fbmV3X3NpemUgLSBzaXplKCksIF9feCk7Ci0gIH0KLQotI2lmIGRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCi0gIHZvaWQgcmVzaXplKHNpemVfdHlwZSBfX25ld19zaXplKSB7IHJlc2l6ZShfX25ld19zaXplLCBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKF9UcCkpOyB9Ci0jZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKi8KLQotICB2b2lkIGNsZWFyKCkgewotICAgIGVyYXNlKGJlZ2luKCksIGVuZCgpKTsKLSAgfQotCi1wcml2YXRlOgotICB2b2lkIF9NX2NsZWFyKCkgewotICAgIF9TVExQX1NURDo6X0Rlc3Ryb3lfUmFuZ2UocmJlZ2luKCksIHJlbmQoKSk7Ci0gICAgdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuZGVhbGxvY2F0ZSh0aGlzLT5fTV9zdGFydCwgdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuX01fZGF0YSAtIHRoaXMtPl9NX3N0YXJ0KTsKLSAgfQotCi0gIHZvaWQgX01fY2xlYXJfYWZ0ZXJfbW92ZSgpIHsKLSAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95X01vdmVkX1JhbmdlKHJiZWdpbigpLCByZW5kKCkpOwotICAgIHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLmRlYWxsb2NhdGUodGhpcy0+X01fc3RhcnQsIHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLl9NX2RhdGEgLSB0aGlzLT5fTV9zdGFydCk7Ci0gIH0KLQotICB2b2lkIF9NX3NldChwb2ludGVyIF9fcywgcG9pbnRlciBfX2YsIHBvaW50ZXIgX19lKSB7Ci0gICAgdGhpcy0+X01fc3RhcnQgPSBfX3M7Ci0gICAgdGhpcy0+X01fZmluaXNoID0gX19mOwotICAgIHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLl9NX2RhdGEgPSBfX2U7Ci0gIH0KLQotI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCi0gIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgotICBwb2ludGVyIF9NX2FsbG9jYXRlX2FuZF9jb3B5KHNpemVfdHlwZSYgX19uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpCi0jZWxzZSAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCi0gIHBvaW50ZXIgX01fYWxsb2NhdGVfYW5kX2NvcHkoc2l6ZV90eXBlJiBfX24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfcG9pbnRlciBfX2ZpcnN0LCBjb25zdF9wb2ludGVyIF9fbGFzdCkKLSNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCi0gIHsKLSAgICBwb2ludGVyIF9fcmVzdWx0ID0gdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuYWxsb2NhdGUoX19uLCBfX24pOwotICAgIF9TVExQX1RSWSB7Ci0gICAgICB1bmluaXRpYWxpemVkX2NvcHkoX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCk7Ci0gICAgICByZXR1cm4gX19yZXN1bHQ7Ci0gICAgfQotICAgIF9TVExQX1VOV0lORCh0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5kZWFsbG9jYXRlKF9fcmVzdWx0LCBfX24pKQotICAgIF9TVExQX1JFVF9BRlRFUl9USFJPVyhfX3Jlc3VsdCkKLSAgfQotCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Ci0gIHZvaWQgX01fcmFuZ2VfaW5pdGlhbGl6ZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnB1dF9pdGVyYXRvcl90YWcgJikgewotICAgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKLSAgICAgIHB1c2hfYmFjaygqX19maXJzdCk7Ci0gIH0KLSAgLy8gVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBieSB0aGUgY29uc3RydWN0b3IuCi0gIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgotICB2b2lkIF9NX3JhbmdlX2luaXRpYWxpemUoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcndhcmRfaXRlcmF0b3JfdGFnICYpIHsKLSAgICBzaXplX3R5cGUgX19uID0gZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KTsKLSAgICB0aGlzLT5fTV9zdGFydCA9IHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLmFsbG9jYXRlKF9fbiwgX19uKTsKLSAgICB0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5fTV9kYXRhID0gdGhpcy0+X01fc3RhcnQgKyBfX247Ci0gICAgdGhpcy0+X01fZmluaXNoID0gdW5pbml0aWFsaXplZF9jb3B5KF9fZmlyc3QsIF9fbGFzdCwgdGhpcy0+X01fc3RhcnQpOwotICB9Ci0jZW5kaWYgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLwotfTsKLQotI2lmIGRlZmluZWQgKHZlY3RvcikKLSMgIHVuZGVmIHZlY3RvcgotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi0jZW5kaWYKLQotX1NUTFBfRU5EX05BTUVTUEFDRQotCi0jaWYgIWRlZmluZWQgKF9TVExQX0xJTktfVElNRV9JTlNUQU5USUFUSU9OKQotIyAgaW5jbHVkZSA8c3RsL192ZWN0b3IuYz4KLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BUUl9TUEVDSUFMSVpBVElPTlMpCi0jICBpbmNsdWRlIDxzdGwvcG9pbnRlcnMvX3ZlY3Rvci5oPgotI2VuZGlmCi0KLS8vV2UgZGVmaW5lIHRoZSBib29sIHNwZWNpYWxpemF0aW9uIGJlZm9yZSB0aGUgZGVidWcgaW50ZXJmYXZlCi0vL3RvIGJlbmVmaXQgb2YgdGhlIGRlYnVnIHZlcnNpb24gb2YgdmVjdG9yIGV2ZW4gZm9yIHRoZSBib29sCi0vL3NwZWNpYWxpemF0aW9uLgotI2lmICFkZWZpbmVkIChfU1RMUF9OT19CT09MKSB8fCAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKLSMgIGlmICFkZWZpbmVkIChfU1RMUF9JTlRFUk5BTF9CVkVDVE9SX0gpCi0jICAgIGluY2x1ZGUgPHN0bC9fYnZlY3Rvci5oPgotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpCi0jICBpbmNsdWRlIDxzdGwvZGVidWcvX3ZlY3Rvci5oPgotI2VuZGlmCi0KLV9TVExQX0JFR0lOX05BTUVTUEFDRQotCi0jaWYgIWRlZmluZWQgKF9TVExQX05PX0JPT0wpICYmICFkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQotLy8gVGhpcyB0eXBlZGVmIGlzIG5vbi1zdGFuZGFyZC4gIEl0IGlzIHByb3ZpZGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgotdHlwZWRlZiB2ZWN0b3I8Ym9vbCwgYWxsb2NhdG9yPGJvb2w+ID4gYml0X3ZlY3RvcjsKLSNlbmRpZgotCi0jZGVmaW5lIF9TVExQX1RFTVBMQVRFX0hFQURFUiB0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Ci0jZGVmaW5lIF9TVExQX1RFTVBMQVRFX0NPTlRBSU5FUiB2ZWN0b3I8X1RwLCBfQWxsb2M+Ci0jaW5jbHVkZSA8c3RsL19yZWxvcHNfY29udC5oPgotI3VuZGVmIF9TVExQX1RFTVBMQVRFX0NPTlRBSU5FUgotI3VuZGVmIF9TVExQX1RFTVBMQVRFX0hFQURFUgotCi0jaWYgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikKLXRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KLXN0cnVjdCBfX21vdmVfdHJhaXRzPHZlY3RvcjxfVHAsIF9BbGxvYz4gPiB7Ci0gIHR5cGVkZWYgX19zdGxwX21vdmFibGUgaW1wbGVtZW50ZWQ7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX19tb3ZlX3RyYWl0czxfQWxsb2M+Ojpjb21wbGV0ZSBjb21wbGV0ZTsKLSNpZiBkZWZpbmVkIChfX0JPUkxBTkRDX18pICYmIChfX0JPUkxBTkRDX18gPCAweDU2MCkKLSAgLy8gZGlzYWJsZSBpbmNvcnJlY3QgImRlcGVuZGVudCB0eXBlIHF1YWxpZmllciIgZXJyb3IKLSAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgX1JldDsKLSNlbmRpZgotfTsKLQotIyAgaWYgIWRlZmluZWQgKF9TVExQX0RFQlVHKQotdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgotc3RydWN0IF9EZWZhdWx0WmVyb1ZhbHVlPHZlY3RvcjxfVHAsIF9BbGxvYz4gPgoteyB0eXBlZGVmIHR5cGVuYW1lIF9fdHlwZV90cmFpdHM8X0FsbG9jPjo6aGFzX3RyaXZpYWxfZGVmYXVsdF9jb25zdHJ1Y3RvciBfUmV0OyB9OwotIyAgZW5kaWYKLQotI2VuZGlmIC8qIF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04gKi8KLQotX1NUTFBfRU5EX05BTUVTUEFDRQotCi0jZW5kaWYgLyogX1NUTFBfVkVDVE9SX0ggKi8KLQotLy8gTG9jYWwgVmFyaWFibGVzOgotLy8gbW9kZTpDKysKLS8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9ib29zdF90eXBlX3RyYWl0cy5oIGIvc3RsL2Jvb3N0X3R5cGVfdHJhaXRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0MWNjNDEuLjAwMDAwMDAKLS0tIGEvc3RsL2Jvb3N0X3R5cGVfdHJhaXRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQKLSAqIEZyYW5jb2lzIER1bW9udAotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0jaWZuZGVmIF9TVExQX0JPT1NUX1RZUEVfVFJBSVRTX0gKLSNkZWZpbmUgX1NUTFBfQk9PU1RfVFlQRV9UUkFJVFNfSAotCi0jaW5jbHVkZSA8Ym9vc3QvdHlwZV90cmFpdHMvaXNfaW50ZWdyYWwuaHBwPgotI2luY2x1ZGUgPGJvb3N0L3R5cGVfdHJhaXRzL2lzX2Zsb2F0LmhwcD4KLSNpbmNsdWRlIDxib29zdC90eXBlX3RyYWl0cy9oYXNfdHJpdmlhbF9jb25zdHJ1Y3Rvci5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3QvdHlwZV90cmFpdHMvaGFzX3RyaXZpYWxfY29weS5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3QvdHlwZV90cmFpdHMvaGFzX3RyaXZpYWxfYXNzaWduLmhwcD4KLSNpbmNsdWRlIDxib29zdC90eXBlX3RyYWl0cy9oYXNfdHJpdmlhbF9kZXN0cnVjdG9yLmhwcD4KLSNpbmNsdWRlIDxib29zdC90eXBlX3RyYWl0cy9pc19wb2QuaHBwPgotI2luY2x1ZGUgPGJvb3N0L3R5cGVfdHJhaXRzL2lzX3BvaW50ZXIuaHBwPgotI2luY2x1ZGUgPGJvb3N0L3R5cGVfdHJhaXRzL2lzX3JlZmVyZW5jZS5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3QvdHlwZV90cmFpdHMvcmVtb3ZlX2N2LmhwcD4KLSNpbmNsdWRlIDxib29zdC90eXBlX3RyYWl0cy9pc19zYW1lLmhwcD4KLQotLyoKLSAqIFRoaXMgZmlsZSBtb3N0bHkgd3JhcHMgYm9vc3QgdHlwZV90cmFpdHMgaW4gdGhlIFNUTHBvcnQgdHlwZV90cmFpdHMuCi0gKiBXaGVuIGNoZWNraW5nIGEgdHlwZSB0cmFpdHMgbGlrZSB0cml2aWFsIGFzc2lnbiBvcGVyYXRvciBmb3IgaW5zdGFuY2UKLSAqIGJvdGggdGhlIGJvb3N0IHZhbHVlIGFuZCBTVExwb3J0IHZhbHVlcyBoYXMgdG8gYmUgdGFrZW4gaW50byBhY2NvdW50Ci0gKiBhcyB3ZSBkb24ndCBrbm93IHdoYXQgdGhlIHVzZXIgbWlnaHQgaGF2ZSBwcmVmZXIsIHNwZWNpYWxpemluZyB0aGUgYm9vc3QKLSAqIHR5cGUgdHJhaXRzIG9yIHRoZSBTVExwb3J0IG9uZS4KLSAqLwotX1NUTFBfQkVHSU5fTkFNRVNQQUNFCi0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBfSXNSZWYgewotICBlbnVtIHsgX0lzID0gOjpib29zdDo6aXNfcmVmZXJlbmNlPF9UcD46OnZhbHVlIH07Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX19ib29sMnR5cGU8X0lzPjo6X1JldCBfUmV0OwotfTsKLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9Jc1B0ciB7Ci0gIGVudW0geyBpc19wb2ludGVyID0gOjpib29zdDo6aXNfcG9pbnRlcjxfVHA+Ojp2YWx1ZSB9OwotICB0eXBlZGVmIHR5cGVuYW1lIF9fYm9vbDJ0eXBlPGlzX3BvaW50ZXI+OjpfUmV0IF9SZXQ7Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX0lzSW50ZWdyYWwgewotICBlbnVtIHsgaXNfaW50ZWdyYWwgPSA6OmJvb3N0Ojppc19pbnRlZ3JhbDxfVHA+Ojp2YWx1ZSB9OwotICB0eXBlZGVmIHR5cGVuYW1lIF9fYm9vbDJ0eXBlPGlzX2ludGVncmFsPjo6X1JldCBfUmV0OwotfTsKLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9Jc1JhdGlvbmFsIHsKLSAgZW51bSB7IGlzX2Zsb2F0ID0gOjpib29zdDo6aXNfZmxvYXQ8X1RwPjo6dmFsdWUgfTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jvb2wydHlwZTxpc19mbG9hdD46Ol9SZXQgX1JldDsKLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1zdHJ1Y3QgX190eXBlX3RyYWl0cyB7Ci0gIGVudW0geyB0cml2aWFsX2NvbnN0cnVjdG9yID0gOjpib29zdDo6aGFzX3RyaXZpYWxfY29uc3RydWN0b3I8X1RwPjo6dmFsdWUgfTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jvb2wydHlwZTx0cml2aWFsX2NvbnN0cnVjdG9yPjo6X1JldCBoYXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yOwotCi0gIGVudW0geyB0cml2aWFsX2NvcHkgPSA6OmJvb3N0OjpoYXNfdHJpdmlhbF9jb3B5PF9UcD46OnZhbHVlIH07Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX19ib29sMnR5cGU8dHJpdmlhbF9jb3B5Pjo6X1JldCBoYXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yOwotCi0gIGVudW0geyB0cml2aWFsX2Fzc2lnbiA9IDo6Ym9vc3Q6Omhhc190cml2aWFsX2Fzc2lnbjxfVHA+Ojp2YWx1ZSB9OwotICB0eXBlZGVmIHR5cGVuYW1lIF9fYm9vbDJ0eXBlPHRyaXZpYWxfYXNzaWduPjo6X1JldCBoYXNfdHJpdmlhbF9hc3NpZ25tZW50X29wZXJhdG9yOwotCi0gIGVudW0geyB0cml2aWFsX2Rlc3RydWN0b3IgPSA6OmJvb3N0OjpoYXNfdHJpdmlhbF9kZXN0cnVjdG9yPF9UcD46OnZhbHVlIH07Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX19ib29sMnR5cGU8dHJpdmlhbF9kZXN0cnVjdG9yPjo6X1JldCBoYXNfdHJpdmlhbF9kZXN0cnVjdG9yOwotCi0gIGVudW0geyBwb2QgPSA6OmJvb3N0Ojppc19wb2Q8X1RwPjo6dmFsdWUgfTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jvb2wydHlwZTxwb2Q+OjpfUmV0IGlzX1BPRF90eXBlOwotfTsKLQotdGVtcGxhdGUgPGNsYXNzIF9UcDEsIGNsYXNzIF9UcDI+Ci1zdHJ1Y3QgX1RyaXZpYWxDb3B5IHsKLSAgdHlwZWRlZiB0eXBlbmFtZSA6OmJvb3N0OjpyZW1vdmVfY3Y8X1RwMT46OnR5cGUgdW5jdjE7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgOjpib29zdDo6cmVtb3ZlX2N2PF9UcDI+Ojp0eXBlIHVuY3YyOwotCi0gIGVudW0geyBzYW1lID0gOjpib29zdDo6aXNfc2FtZTx1bmN2MSwgdW5jdjI+Ojp2YWx1ZSB9OwotICB0eXBlZGVmIHR5cGVuYW1lIF9fYm9vbDJ0eXBlPHNhbWU+OjpfUmV0IF9TYW1lOwotCi0gIGVudW0geyBib29zdF90cml2aWFsX2Fzc2lnbiA9IDo6Ym9vc3Q6Omhhc190cml2aWFsX2Fzc2lnbjx1bmN2MT46OnZhbHVlIH07Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX19ib29sMnR5cGU8Ym9vc3RfdHJpdmlhbF9hc3NpZ24+OjpfUmV0IF9Cb29zdFRyaXZpYWxBc3NpZ247Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX190eXBlX3RyYWl0czx1bmN2MT46Omhhc190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3IgX1NUTFBUcml2aWFsQXNzaWduOwotICB0eXBlZGVmIHR5cGVuYW1lIF9Mb3IyPF9Cb29zdFRyaXZpYWxBc3NpZ24sIF9TVExQVHJpdmlhbEFzc2lnbj46Ol9SZXQgX1RyaXZpYWxBc3NpZ247Ci0KLSAgdHlwZWRlZiB0eXBlbmFtZSBfTGFuZDI8X1NhbWUsIF9Ucml2aWFsQXNzaWduPjo6X1JldCBfVHlwZTsKLSAgc3RhdGljIF9UeXBlIF9BbnN3ZXIoKSB7IHJldHVybiBfVHlwZSgpOyB9Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwMSwgY2xhc3MgX1RwMj4KLXN0cnVjdCBfVHJpdmlhbFVDb3B5IHsKLSAgdHlwZWRlZiB0eXBlbmFtZSA6OmJvb3N0OjpyZW1vdmVfY3Y8X1RwMT46OnR5cGUgdW5jdjE7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgOjpib29zdDo6cmVtb3ZlX2N2PF9UcDI+Ojp0eXBlIHVuY3YyOwotCi0gIGVudW0geyBzYW1lID0gOjpib29zdDo6aXNfc2FtZTx1bmN2MSwgdW5jdjI+Ojp2YWx1ZSB9OwotICB0eXBlZGVmIHR5cGVuYW1lIF9fYm9vbDJ0eXBlPHNhbWU+OjpfUmV0IF9TYW1lOwotCi0gIGVudW0geyBib29zdF90cml2aWFsX2NvcHkgPSA6OmJvb3N0OjpoYXNfdHJpdmlhbF9jb3B5PHVuY3YxPjo6dmFsdWUgfTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jvb2wydHlwZTxib29zdF90cml2aWFsX2NvcHk+OjpfUmV0IF9Cb29zdFRyaXZpYWxDb3B5OwotICB0eXBlZGVmIHR5cGVuYW1lIF9fdHlwZV90cmFpdHM8dW5jdjE+OjpoYXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yIF9TVExQVHJpdmlhbENvcHk7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0xvcjI8X0Jvb3N0VHJpdmlhbENvcHksIF9TVExQVHJpdmlhbENvcHk+OjpfUmV0IF9Ucml2aWFsQ29weTsKLQotICB0eXBlZGVmIHR5cGVuYW1lIF9MYW5kMjxfU2FtZSwgX1RyaXZpYWxDb3B5Pjo6X1JldCBfVHlwZTsKLSAgc3RhdGljIF9UeXBlIF9BbnN3ZXIoKSB7IHJldHVybiBfVHlwZSgpOyB9Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotc3RydWN0IF9EZWZhdWx0WmVyb1ZhbHVlIHsKLSAgZW51bSB7IGlzX2ludGVncmFsID0gOjpib29zdDo6aXNfaW50ZWdyYWw8X1RwPjo6dmFsdWUgfTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jvb2wydHlwZTxpc19pbnRlZ3JhbD46Ol9SZXQgX0lzSW50ZWdyYWw7Ci0gIGVudW0geyBpc19mbG9hdCA9IDo6Ym9vc3Q6OmlzX2Zsb2F0PF9UcD46OnZhbHVlIH07Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX19ib29sMnR5cGU8aXNfZmxvYXQ+OjpfUmV0IF9Jc0Zsb2F0OwotICBlbnVtIHsgaXNfcG9pbnRlciA9IDo6Ym9vc3Q6OmlzX3BvaW50ZXI8X1RwPjo6dmFsdWUgfTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jvb2wydHlwZTxpc19wb2ludGVyPjo6X1JldCBfSXNQb2ludGVyOwotCi0gIHR5cGVkZWYgdHlwZW5hbWUgX0xvcjM8X0lzSW50ZWdyYWwsIF9Jc0Zsb2F0LCBfSXNQb2ludGVyPjo6X1JldCBfUmV0OwotfTsKLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLXN0cnVjdCBfVHJpdmlhbEluaXQgewotICB0eXBlZGVmIHR5cGVuYW1lIDo6Ym9vc3Q6OnJlbW92ZV9jdjxfVHA+Ojp0eXBlIHVuY3Y7Ci0KLSAgZW51bSB7IGJvb3N0X3RyaXZpYWxfY29uc3RydWN0b3IgPSA6OmJvb3N0OjpoYXNfdHJpdmlhbF9jb25zdHJ1Y3Rvcjx1bmN2Pjo6dmFsdWUgfTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jvb2wydHlwZTxib29zdF90cml2aWFsX2NvbnN0cnVjdG9yPjo6X1JldCBfQm9vc3RUcml2aWFsSW5pdDsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfX3R5cGVfdHJhaXRzPHVuY3Y+OjpoYXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yIF9TVExQVHJpdmlhbEluaXQ7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0xvcjI8X0Jvb3N0VHJpdmlhbEluaXQsIF9TVExQVHJpdmlhbEluaXQ+OjpfUmV0IF9UcjE7Ci0KLSAgdHlwZWRlZiB0eXBlbmFtZSBfRGVmYXVsdFplcm9WYWx1ZTxfVHA+OjpfUmV0IF9UcjI7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX05vdDxfVHIyPjo6X1JldCBfVHIzOwotCi0gIHR5cGVkZWYgdHlwZW5hbWUgX0xhbmQyPF9UcjEsIF9UcjM+OjpfUmV0IF9SZXQ7Ci0gIHN0YXRpYyBfUmV0IF9BbnN3ZXIoKSB7IHJldHVybiBfUmV0KCk7IH0KLX07Ci0KLV9TVExQX0VORF9OQU1FU1BBQ0UKLQotI2VuZGlmIC8qIF9TVExQX0JPT1NUX1RZUEVfVFJBSVRTX0ggKi8KZGlmZiAtLWdpdCBhL3N0bC9jX2xvY2FsZS5oIGIvc3RsL2NfbG9jYWxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNTBiYjYuLjAwMDAwMDAKLS0tIGEvc3RsL2NfbG9jYWxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLQotCi0jaWZuZGVmIF9TVExQX0NfTE9DQUxFX0gKLSNkZWZpbmUgX1NUTFBfQ19MT0NBTEVfSAotCi0vKgotICogSW1wbGVtZW50YXRpb24gZGVwZW5kZW50IGRlZmluaXRpb25zLgotICogQmV3YXJlOiBUaGlzIGhlYWRlciBpcyBub3QgYSBwdXJlbHkgaW50ZXJuYWwgaGVhZGVyLCBpdCBpcyBhbHNvIGluY2x1ZGVkCi0gKiBmcm9tIHRoZSBvdXRzaWRlIHdvcmxkIHdoZW4gYnVpbGRpbmcgdGhlIFNUTHBvcnQgbGlicmFyeS4gU28gdGhpcyBoZWFkZXIKLSAqIHNob3VsZCBub3QgcmVmZXJlbmNlIGludGVybmFsIGhlYWRlcnMgKHN0bHBvcnQvc3RsL18qLmgpIGRpcmVjdGx5LgotICovCi0jaWYgZGVmaW5lZCAoX19zZ2kpCi0jICBpZiBkZWZpbmVkIChST09UXzY1KSAvKiBJUklYIDYuNS54ICovCi0jICAgIGluY2x1ZGUgPHNnaWRlZnMuaD4KLSMgICAgaW5jbHVkZSA8c3RhbmRhcmRzLmg+Ci0jICAgIGluY2x1ZGUgPHdjaGFyLmg+Ci0jICAgIGluY2x1ZGUgPGN0eXBlLmg+Ci0jICBlbHNlIC8qIElSSVggcHJlLTYuNSAqLwotIyAgICBpbmNsdWRlIDxzZ2lkZWZzLmg+Ci0jICAgIGluY2x1ZGUgPHN0YW5kYXJkcy5oPgotIyAgICBpZiAhZGVmaW5lZChfU0laRV9UKSAmJiAhZGVmaW5lZChfU0laRV9UXykKLSMgICAgICBkZWZpbmUgX1NJWkVfVAotIyAgICAgIGlmIChfTUlQU19TWkxPTkcgPT0gMzIpCi10eXBlZGVmIHVuc2lnbmVkIGludCBzaXplX3Q7Ci0jICAgICAgZW5kaWYKLSMgICAgICBpZiAoX01JUFNfU1pMT05HID09IDY0KQotdHlwZWRlZiB1bnNpZ25lZCBsb25nIHNpemVfdDsKLSMgICAgICBlbmRpZgotIyAgICBlbmRpZgotIyAgICBpZiAhZGVmaW5lZCAoX1dDSEFSX1QpCi0jICAgICAgZGVmaW5lIF9XQ0hBUl9UCi0jICAgICAgaWYgKF9NSVBTX1NaTE9ORyA9PSAzMikKLXR5cGVkZWYgbG9uZyB3Y2hhcl90OwotIyAgICAgIGVuZGlmCi0jICAgICAgaWYgKF9NSVBTX1NaTE9ORyA9PSA2NCkKLXR5cGVkZWYgX19pbnQzMl90IHdjaGFyX3Q7Ci0jICAgICAgZW5kaWYKLSMgICAgZW5kaWYgLyogX1dDSEFSX1QgKi8KLSMgICAgaWYgIWRlZmluZWQgKF9XSU5UX1QpCi0jICAgICAgZGVmaW5lIF9XSU5UX1QKLSMgICAgICBpZiAoX01JUFNfU1pMT05HID09IDMyKQotdHlwZWRlZiBsb25nIHdpbnRfdDsKLSMgICAgICBlbmRpZgotIyAgICAgIGlmIChfTUlQU19TWkxPTkcgPT0gNjQpCi10eXBlZGVmIF9faW50MzJfdCB3aW50X3Q7Ci0jICAgICAgZW5kaWYKLSMgICAgZW5kaWYgLyogX1dJTlRfVCAqLwotIyAgICBpZiAhZGVmaW5lZCAoX01CU1RBVEVfVCkKLSMgICAgICBkZWZpbmUgX01CU1RBVEVfVAotLyogX01TQ19WRVIgY2hlY2sgaXMgaGVyZSBmb3IgaGlzdG9yaWNhbCByZWFzb24gYW5kIHNlZW1zIHdyb25nIGFzIGl0IGlzIHRoZSBtYWNybyBkZWZpbmVkCi0gKiBieSBNaWNyb3NvZnQgY29tcGlsZXJzIHRvIGdpdmUgdGhlaXIgdmVyc2lvbiBhbmQgd2UgYXJlIGN1cnJlbnRseSBpbiBhIFNHSSBwbGF0Zm9ybSBzY29wZS4KLSAqIEhvd2V2ZXIgX01TQ19WRVIgbWlnaHQgYWxzbyBiZSBhIFNHSSBjb21waWxlciBtYWNybyBzbyB3ZSBrZWVwIGl0IHRoaXMgd2F5LiovCi0jICAgICAgaWYgZGVmaW5lZCAoX01TQ19WRVIpCi10eXBlZGVmIGludCBtYnN0YXRlX3Q7Ci0jICAgICAgZWxzZQotdHlwZWRlZiBjaGFyIG1ic3RhdGVfdDsKLSMgICAgICBlbmRpZgotIyAgICBlbmRpZiAvKiBfTUJTVEFURV9UICovCi0jICBlbmRpZiAvKiBST09UNjUgKi8KLSNlbHNlIC8qIF9fc2dpICovCi0jICBpbmNsdWRlIDxzdGRkZWYuaD4KLSMgIGlmICFkZWZpbmVkIChBTkRST0lEKQotLyogVGhlIEFuZHJvaWQgd2NoYXIuaCBoZWFkZXIgaXMgYnJva2VuLCBhbmQgdHJpZXMgdG8gcmVkZWZpbmUgd2NoYXJfdC4gKi8KLSMgICAgaW5jbHVkZSA8d2NoYXIuaD4KLSMgIGVuZGlmCi0jICBpbmNsdWRlIDxjdHlwZS5oPgotI2VuZGlmIC8qIF9fc2dpICovCi0KLS8qCi0gKiBHRU5FUkFMIEZSQU1FV09SSwotICovCi0KLS8qCi0gKiBPcGFxdWUgdHlwZXMsIGltcGxlbWVudGF0aW9uIChpZiB0aGVyZSBpcyBvbmUpIGRlcGVuZHMKLSAqIG9uIHBsYXRmb3JtIGxvY2FsZSBBUEkuCi0gKi8KLXN0cnVjdCBfTG9jYWxlX2N0eXBlOwotc3RydWN0IF9Mb2NhbGVfbnVtZXJpYzsKLXN0cnVjdCBfTG9jYWxlX3RpbWU7Ci1zdHJ1Y3QgX0xvY2FsZV9jb2xsYXRlOwotc3RydWN0IF9Mb2NhbGVfbW9uZXRhcnk7Ci1zdHJ1Y3QgX0xvY2FsZV9tZXNzYWdlczsKLXN0cnVjdCBfTG9jYWxlX25hbWVfaGludDsKLQotLyoKLSAgQml0bWFzayBtYWNyb3MuCi0qLwotCi0vKgotICogRm9yIG5hcnJvdyBjaGFyYWN0ZXJzLCB3ZSBleHBvc2UgdGhlIGxvb2t1cCB0YWJsZSBpbnRlcmZhY2UuCi0gKi8KLQotLyogSW50ZXJuYWwgYml0bWFzayBtYWNyb3MsIG9zLXNwZWNpZmljLiAqLwotCi0jaWYgZGVmaW5lZCAoX19zZ2kpICAgICAgICAgICAgICAvKiBJUklYICovCi0KLSMgIGRlZmluZSBfTG9jYWxlX1MgICAgICAweDAwMDAwMDA4ICAgICAgLyogU3BhY2luZyBjaGFyYWN0ZXIgKi8KLSMgIGRlZmluZSBfTG9jYWxlX0EgICAgICAweDAwMDA0MDAwICAgICAgLyogQWxwaGFiZXRpY2FsIGNoYXJhY3RlcnMgb25seSAqLwotIyAgZGVmaW5lIF9Mb2NhbGVfQiAgICAgIDB4MDAwMDAwNDAgICAgICAvKiBPYnNvbGV0ZTogd2FzIHNwYWNlIGNoYXIgb25seSAqLwotIyAgZGVmaW5lIF9Mb2NhbGVfUFIgICAgIDB4MDAwMDgwMDAgICAgICAvKiBQcmludGFibGUgY2hhcmFjdGVycyBvbmx5ICovCi0jICBkZWZpbmUgX0xvY2FsZV9HICAgICAgMHg0MDAwMDAwMCAgICAgIC8qIEdyYXBoaWMgY2hhcmFjdGVycyBvbmx5ICovCi0jICBkZWZpbmUgX0xvY2FsZV9CTCAgICAgMHg4MDAwMDAwMCAgICAgIC8qIFRoZSBibGFuayBjaGFyYWN0ZXIgY2xhc3MgKi8KLQotLyogUHVibGljIGJpdG1hc2sgbWFjcm9zLCBtdXN0IGJlIGRlZmluZWQgZm9yIGV2ZXJ5IE9TLiBUaGVzZSB2YWx1ZXMsIG9mCi0gKiBjb3Vyc2UsIGFyZSBzcGVjaWZpYyB0byBJUklYLiAqLwotCi0jICBkZWZpbmUgX0xvY2FsZV9DTlRSTCAgMHgwMDAwMDAyMCAgICAgIC8qIENvbnRyb2wgY2hhcmFjdGVyICovCi0jICBkZWZpbmUgX0xvY2FsZV9VUFBFUiAgMHgwMDAwMDAwMSAgICAgIC8qIFVwcGVyIGNhc2UgKi8KLSMgIGRlZmluZSBfTG9jYWxlX0xPV0VSICAweDAwMDAwMDAyICAgICAgLyogTG93ZXIgY2FzZSAqLwotIyAgZGVmaW5lIF9Mb2NhbGVfRElHSVQgIDB4MDAwMDAwMDQgICAgICAvKiBOdW1lcmFsIChkaWdpdCkgKi8KLSMgIGRlZmluZSBfTG9jYWxlX1hESUdJVCAweDAwMDAwMDgwICAgICAgLyogaGVYYWRlY2ltYWwgZGlnaXQgKi8KLSMgIGRlZmluZSBfTG9jYWxlX1BVTkNUICAweDAwMDAwMDEwICAgICAgLyogUHVuY3R1YXRpb24gKi8KLSMgIGRlZmluZSBfTG9jYWxlX1NQQUNFICAoX0xvY2FsZV9TIHwgX0xvY2FsZV9CTCkKLSMgIGRlZmluZSBfTG9jYWxlX1BSSU5UICAoX0xvY2FsZV9QVU5DVCB8IF9Mb2NhbGVfVVBQRVIgfCBfTG9jYWxlX0xPV0VSIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgX0xvY2FsZV9ESUdJVCB8IF9Mb2NhbGVfQSB8IF9Mb2NhbGVfWERJR0lUIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgX0xvY2FsZV9QUikKLSMgIGRlZmluZSBfTG9jYWxlX0FMUEhBICBfTG9jYWxlX0EKLQotLyoKLSogQWxsIG9mIHRoZXNlIGV4Y2VwdCBmb3IgZ3JhcGggYW5kIGJsYW5rIGFyZSBmcm9tIHRoZSBDIHN0YW5kYXJkOwotKiBncmFwaCBhbmQgYmxhbmsgYXJlIFhQRzQuICAoZ3JhcGggaW4gWFBHNCBkb2Vzbid0IG1lYW4gcXVpdGUgdGhlCi0qIHNhbWUgdGhpbmcgYXMgZ3JhcGggaW4gdGhlIEMrKyBsaWJyYXJ5KQotKi8KLQotI2VuZGlmIC8qIElSSVggKi8KLQotCi0jaWYgZGVmaW5lZCAoX19MeW54X18pCi0gLyogYXpvdjogT24gTHlueCBpc2FscGhhIGRlZmluZWQgYXMgKF9VIHwgX0wpLCB3aGljaCBnaXZlcyB1cyBhIG1hc2sKLSAgKiB1bnVzYWJsZSBpbiBjdHlwZV90YWJsZS4gU28gd2UgaGF2ZSB0byByZWRlZmluZSBpdCBhbmQgdXNlIGhhcmQtY29kZWQKLSAgKiBudW1iZXJzICh0byBhdm9pZCBwb3RlbnRpYWwgY2xhc2hlcyBpZiBzeXN0ZW0gaGVhZGVycyBjaGFuZ2UpLgotICAqCi0gICogUC5TLiBBY3R1YWxseSwgSSBzZWUgbm8gcmVhc29uIGluIHVzaW5nIHBsYXRmb3JtLXNwZWNpZmljIG1hc2tzIC0KLSAgKiBoYXZpbmcganVzdCBvbmUgc2V0IG9mIG1hc2tzIGZvciBhbGwgcGxhdGZvcm1zIHNob3VsZCB3b3JrIGp1c3QgYXMKLSAgKiB3ZWxsIC0gd2Ugb25seSB1c2UgdGhlbSBpbnRlcm5hbGx5IGFuZCB0aGV5IGRvbid0IGhhdmUgdG8gYmUgZXF1YWwKLSAgKiB0byB3aGF0ZXZlciBkZWZpbmVkIGluIGxvY2FsIGN0eXBlLmgKLSAgKgotICAqLwotIyAgZGVmaW5lIF9Mb2NhbGVfQ05UUkwgIDA0MCAgICAgLyogX0MsIENvbnRyb2wgY2hhcmFjdGVyICovCi0jICBkZWZpbmUgX0xvY2FsZV9VUFBFUiAgMDEgICAgICAvKiBfVSwgVXBwZXIgY2FzZSAqLwotIyAgZGVmaW5lIF9Mb2NhbGVfTE9XRVIgIDAyICAgICAgLyogX0wsIExvd2VyIGNhc2UgKi8KLSMgIGRlZmluZSBfTG9jYWxlX0RJR0lUICAwNCAgICAgIC8qIF9OLCBOdW1lcmFsIChkaWdpdCkgKi8KLSMgIGRlZmluZSBfTG9jYWxlX1hESUdJVCAwMjAwICAgIC8qIF9YLCBoZVhhZGVjaW1hbCBkaWdpdCAqLwotIyAgZGVmaW5lIF9Mb2NhbGVfUFVOQ1QgIDAyMCAgICAgLyogX1AsIFB1bmN0dWF0aW9uICovCi0jICBkZWZpbmUgX0xvY2FsZV9TUEFDRSAgMDEwICAgICAvKiBfUywgU3BhY2luZyAqLwotIyAgZGVmaW5lIF9Mb2NhbGVfQUxQSEEgIDA0MDAwMCAgLyogbm9uZSwgQWxwaGFudW1lcmljYWwgKi8KLSMgIGRlZmluZSBfTG9jYWxlX1BSSU5UICAoX0xvY2FsZV9QVU5DVCB8IF9Mb2NhbGVfVVBQRVIgfCBfTG9jYWxlX0xPV0VSIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICBfTG9jYWxlX0RJR0lUIHwgX0xvY2FsZV9BTFBIQSB8IF9Mb2NhbGVfWERJR0lUIHxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIF9Mb2NhbGVfU1BBQ0UgKSAvKiBQcmludGFibGUgKi8KLSNlbmRpZiAvKiBfX0x5bnhfXyAqLwotCi0jaWYgZGVmaW5lZCAoX19HTlVDX18pIHx8IGRlZmluZWQgKF9fQk9STEFORENfXykgfHwgZGVmaW5lZCAoX19DT01PX18pCi0KLSMgIGlmIGRlZmluZWQgKF9fQ1lHV0lOX18pCi0KLSMgICAgZGVmaW5lIF9Mb2NhbGVfQ05UUkwgIDA0MAotIyAgICBkZWZpbmUgX0xvY2FsZV9VUFBFUiAgMDIKLSMgICAgZGVmaW5lIF9Mb2NhbGVfTE9XRVIgIDAxCi0jICAgIGRlZmluZSBfTG9jYWxlX0RJR0lUICAwNAotIyAgICBkZWZpbmUgX0xvY2FsZV9YRElHSVQgKCAwMTAwIHwgX0xvY2FsZV9ESUdJVCApCi0jICAgIGRlZmluZSBfTG9jYWxlX1BVTkNUICAwMjAKLSMgICAgZGVmaW5lIF9Mb2NhbGVfU1BBQ0UgIDAxMAotIyAgICBkZWZpbmUgX0xvY2FsZV9BTFBIQSAgMDIwMAotIyAgICBkZWZpbmUgX0xvY2FsZV9QUklOVCAgKF9Mb2NhbGVfQUxQSEEgfCBfTG9jYWxlX0RJR0lUIHwgX0xvY2FsZV9QVU5DVCB8IDA0MDAgKQotCi0jICBlbGlmIGRlZmluZWQgKF9fRnJlZUJTRF9fKSB8fCAoIGRlZmluZWQgKF9fQVBQTEVfXykgJiYgZGVmaW5lZCAoX19HTlVDX18pICYmIChfX0dOVUNfXyA+IDMpICkKLQotIyAgICBkZWZpbmUgX0xvY2FsZV9DTlRSTCBfQ1RZUEVfQwotIyAgICBkZWZpbmUgX0xvY2FsZV9VUFBFUiBfQ1RZUEVfVQotIyAgICBkZWZpbmUgX0xvY2FsZV9MT1dFUiBfQ1RZUEVfTAotIyAgICBkZWZpbmUgX0xvY2FsZV9ESUdJVCBfQ1RZUEVfRAotIyAgICBkZWZpbmUgX0xvY2FsZV9YRElHSVQgX0NUWVBFX1gKLSMgICAgZGVmaW5lIF9Mb2NhbGVfUFVOQ1QgX0NUWVBFX1AKLSMgICAgZGVmaW5lIF9Mb2NhbGVfU1BBQ0UgX0NUWVBFX1MKLSMgICAgZGVmaW5lIF9Mb2NhbGVfUFJJTlQgX0NUWVBFX1IKLSMgICAgZGVmaW5lIF9Mb2NhbGVfQUxQSEEgX0NUWVBFX0EKLQotIyAgZWxpZiBkZWZpbmVkIChfX05ldEJTRF9fKSB8fCBkZWZpbmVkIChfX09wZW5CU0RfXykgfHwgZGVmaW5lZCAoX19hbWlnYW9zX18pIHx8IGRlZmluZWQoQU5EUk9JRCkKLQotIyAgICBkZWZpbmUgX0xvY2FsZV9DTlRSTCBfQwotIyAgICBkZWZpbmUgX0xvY2FsZV9VUFBFUiBfVQotIyAgICBkZWZpbmUgX0xvY2FsZV9MT1dFUiBfTAotIyAgICBkZWZpbmUgX0xvY2FsZV9ESUdJVCBfTgotIyAgICBkZWZpbmUgX0xvY2FsZV9YRElHSVQgKF9OfF9YKQotIyAgICBkZWZpbmUgX0xvY2FsZV9QVU5DVCBfUAotIyAgICBkZWZpbmUgX0xvY2FsZV9TUEFDRSBfUwotIyAgICBkZWZpbmUgX0xvY2FsZV9QUklOVCAoX1B8X1V8X0x8X058X0IpCi0jICAgIGRlZmluZSBfTG9jYWxlX0FMUEhBIChfVXxfTCkKLSMgIGVsaWYgZGVmaW5lZCAoX19FTVhfXykgLyogT1MvMiB3aXRoIGVteCBydW50aW1lICovCi0jICAgIGRlZmluZSBfTG9jYWxlX0NOVFJMIF9DTlRSTAotIyAgICBkZWZpbmUgX0xvY2FsZV9VUFBFUiBfVVBQRVIKLSMgICAgZGVmaW5lIF9Mb2NhbGVfTE9XRVIgX0xPV0VSCi0jICAgIGRlZmluZSBfTG9jYWxlX0RJR0lUIF9ESUdJVAotIyAgICBkZWZpbmUgX0xvY2FsZV9YRElHSVQgX1hESUdJVAotIyAgICBkZWZpbmUgX0xvY2FsZV9QVU5DVCBfUFVOQ1QKLSMgICAgZGVmaW5lIF9Mb2NhbGVfU1BBQ0UgX1NQQUNFCi0jICAgIGRlZmluZSBfTG9jYWxlX1BSSU5UIF9QUklOVAotIyAgICBkZWZpbmUgX0xvY2FsZV9BTFBIQSAoX1VQUEVSfF9MT1dFUikKLQotIyAgZWxpZiBkZWZpbmVkIChfU1RMUF9VU0VfR0xJQkMpIC8qIGxpbnV4LCB1c2luZyB0aGUgZ251IGNvbXBpbGVyICovCi0KLS8qIFRoaXMgc2VjdGlvbiB1c2VzIG1hY3JvcyBkZWZpbmVkIGluIHRoZSBnbnUgbGliYyBjdHlwZS5oIGhlYWRlciAqLwotCi0jICAgIGRlZmluZSBfTG9jYWxlX0NOVFJMICBfSVNjbnRybAotIyAgICBkZWZpbmUgX0xvY2FsZV9VUFBFUiAgX0lTdXBwZXIKLSMgICAgZGVmaW5lIF9Mb2NhbGVfTE9XRVIgIF9JU2xvd2VyCi0jICAgIGRlZmluZSBfTG9jYWxlX0RJR0lUICBfSVNkaWdpdAotIyAgICBkZWZpbmUgX0xvY2FsZV9YRElHSVQgX0lTeGRpZ2l0Ci0jICAgIGRlZmluZSBfTG9jYWxlX1BVTkNUICBfSVNwdW5jdAotIyAgICBkZWZpbmUgX0xvY2FsZV9TUEFDRSAgX0lTc3BhY2UKLSMgICAgZGVmaW5lIF9Mb2NhbGVfUFJJTlQgIF9JU3ByaW50Ci0jICAgIGRlZmluZSBfTG9jYWxlX0FMUEhBICBfSVNhbHBoYQotCi0jICBlbmRpZiAvKiBHTElCQyAqLwotCi0jZW5kaWYgLyogZ251ICovCi0KLSNpZiAoZGVmaW5lZCAoX19zdW4pICYmIGRlZmluZWQgKF9fU1ZSNCkpIHx8IFwKLSAgICAoZGVmaW5lZCAoX19kaWdpdGFsX18pICYmIGRlZmluZWQgKF9fdW5peF9fKSkgfHwgXAotICAgICBkZWZpbmVkIChfQUlYKQotLyogZmJwIDogY29uZGl0aW9uIGZyb20gQVQmVCBjb2RlKi8KLSMgIGlmICEoZGVmaW5lZCAoX19YUEc0X0NIQVJfQ0xBU1NfXykgfHwgZGVmaW5lZCAoX1hQRzRfMikgfHwgXAotICAgICAgIChkZWZpbmVkIChfWE9QRU5fU09VUkNFKSAmJiAoX1hPUEVOX1ZFUlNJT04gLSAwID09IDQpKSkgJiYgISBkZWZpbmVkIChfSVNDTlRSTCkKLSAgLyogZmJwIDogb24gMi41LjEsIHRoZSBkZWZpbmVzIGFyZSBkaWZmZXJlbnQgOyggKi8KLSAgLyogIyBpZiAoIGRlZmluZWQgKF9fc3VuKSAmJiBkZWZpbmVkIChfX1NWUjQpICYmICEgZGVmaW5lZCAoX0lTQ05UUkwpICkgKi8KLSMgICAgZGVmaW5lIF9JU0NOVFJMIF9DCi0jICAgIGRlZmluZSBfSVNVUFBFUiBfVQotIyAgICBkZWZpbmUgX0lTTE9XRVIgX0wKLSMgICAgZGVmaW5lIF9JU0RJR0lUIF9OCi0jICAgIGRlZmluZSBfSVNYRElHSVQgX1gKLSMgICAgZGVmaW5lIF9JU1BVTkNUIF9QCi0jICAgIGRlZmluZSBfSVNTUEFDRSBfUwotIyAgICBkZWZpbmUgX0lTUFJJTlQgKF9QIHwgX1UgfCBfTCB8IF9OIHwgX0IpCi0jICAgIGRlZmluZSBfSVNBTFBIQSAoX1UgfCBfTCkKLSMgIGVuZGlmCi0KLSMgIGRlZmluZSBfTG9jYWxlX0NOVFJMICBfSVNDTlRSTAotIyAgZGVmaW5lIF9Mb2NhbGVfVVBQRVIgIF9JU1VQUEVSCi0jICBkZWZpbmUgX0xvY2FsZV9MT1dFUiAgX0lTTE9XRVIKLSMgIGRlZmluZSBfTG9jYWxlX0RJR0lUICBfSVNESUdJVAotIyAgZGVmaW5lIF9Mb2NhbGVfWERJR0lUIF9JU1hESUdJVAotIyAgZGVmaW5lIF9Mb2NhbGVfUFVOQ1QgIF9JU1BVTkNUCi0jICBkZWZpbmUgX0xvY2FsZV9TUEFDRSAgX0lTU1BBQ0UKLSMgIGRlZmluZSBfTG9jYWxlX1BSSU5UICBfSVNQUklOVAotIyAgZGVmaW5lIF9Mb2NhbGVfQUxQSEEgIF9JU0FMUEhBCi0jZWxpZiBkZWZpbmVkIChfX01XRVJLU19fKSAmJiBkZWZpbmVkIChOX1BMQVRfTkxNKQotIyAgZGVmaW5lIF9Mb2NhbGVfQ05UUkwgIF9DTlRSTF8KLSMgIGRlZmluZSBfTG9jYWxlX1VQUEVSICBfVVBQRVJfCi0jICBkZWZpbmUgX0xvY2FsZV9MT1dFUiAgX0xPV0VSXwotIyAgZGVmaW5lIF9Mb2NhbGVfRElHSVQgIF9ESUdJVF8KLSMgIGRlZmluZSBfTG9jYWxlX1hESUdJVCBfWERJR0lUXwotIyAgZGVmaW5lIF9Mb2NhbGVfUFVOQ1QgIF9QVU5DVF8KLSMgIGRlZmluZSBfTG9jYWxlX1NQQUNFICBfU1BBQ0VfCi0jICBkZWZpbmUgX0xvY2FsZV9QUklOVCAgKF9QVU5DVF98X1VQUEVSX3xfTE9XRVJffF9ESUdJVF98X0JMQU5LXykKLSMgIGRlZmluZSBfTG9jYWxlX0FMUEhBICAoX1VQUEVSX3xfTE9XRVJfKQotI2VsaWYgZGVmaW5lZCAoX19NV0VSS1NfXykKLSMgIGRlZmluZSBfTG9jYWxlX0NOVFJMICBfX2NvbnRyb2xfY2hhcgotIyAgZGVmaW5lIF9Mb2NhbGVfVVBQRVIgIF9fdXBwZXJfY2FzZQotIyAgZGVmaW5lIF9Mb2NhbGVfTE9XRVIgIF9fbG93ZXJfY2FzZQotIyAgZGVmaW5lIF9Mb2NhbGVfRElHSVQgIF9fZGlnaXQKLSMgIGRlZmluZSBfTG9jYWxlX1hESUdJVCBfX2hleF9kaWdpdAotIyAgZGVmaW5lIF9Mb2NhbGVfUFVOQ1QgIF9fcHVuY3R1YXRpb24KLSMgIGRlZmluZSBfTG9jYWxlX1NQQUNFICBfX3NwYWNlX2NoYXIKLSMgIGRlZmluZSBfTG9jYWxlX1BSSU5UICBfX3ByaW50YWJsZQotIyAgZGVmaW5lIF9Mb2NhbGVfQUxQSEEgIF9fYWxwaGFudW1lcmljCi0jZWxpZiBkZWZpbmVkIChfX0JPUkxBTkRDX18pCi0jICBkZWZpbmUgX0xvY2FsZV9DTlRSTCAgX0lTX0NUTAotIyAgZGVmaW5lIF9Mb2NhbGVfVVBQRVIgIF9JU19VUFAKLSMgIGRlZmluZSBfTG9jYWxlX0xPV0VSICBfSVNfTE9XCi0jICBkZWZpbmUgX0xvY2FsZV9ESUdJVCAgX0lTX0RJRwotIyAgZGVmaW5lIF9Mb2NhbGVfWERJR0lUIF9JU19IRVgKLSMgIGRlZmluZSBfTG9jYWxlX1BVTkNUICBfSVNfUFVOCi0jICBkZWZpbmUgX0xvY2FsZV9TUEFDRSAgX0lTX1NQCi0jICBkZWZpbmUgX0xvY2FsZV9QUklOVCAgKF9JU19TUHxfSVNfUFVOfF9JU19VUFB8X0lTX0xPV3xfSVNfRElHKQotIyAgZGVmaW5lIF9Mb2NhbGVfQUxQSEEgIF9JU19BTFBIQQotI2VsaWYgZGVmaW5lZCAoX1NUTFBfTVNWQ19MSUIpIHx8IGRlZmluZWQgKF9fTUlOR1czMl9fKQotIyAgZGVmaW5lIF9Mb2NhbGVfQ05UUkwgIF9DT05UUk9MCi0jICBkZWZpbmUgX0xvY2FsZV9VUFBFUiAgX1VQUEVSCi0jICBkZWZpbmUgX0xvY2FsZV9MT1dFUiAgX0xPV0VSCi0jICBkZWZpbmUgX0xvY2FsZV9ESUdJVCAgX0RJR0lUCi0jICBkZWZpbmUgX0xvY2FsZV9YRElHSVQgX0hFWAotIyAgZGVmaW5lIF9Mb2NhbGVfUFVOQ1QgIF9QVU5DVAotIyAgZGVmaW5lIF9Mb2NhbGVfU1BBQ0UgIF9TUEFDRQotIyAgZGVmaW5lIF9Mb2NhbGVfUFJJTlQgIChfQUxQSEEgfCBfRElHSVQgfCBfQkxBTksgfCBfUFVOQ1QpCi0jICBkZWZpbmUgX0xvY2FsZV9BTFBIQSAgKCBfQUxQSEEgJiB+IChfVVBQRVIgfCBfTE9XRVIgKSkKLSNlbGlmIGRlZmluZWQgKF9fRE1DX18pCi0jICBkZWZpbmUgX0xvY2FsZV9DTlRSTCAgX0NPTlRST0wKLSMgIGRlZmluZSBfTG9jYWxlX1VQUEVSICBfVVBQRVIKLSMgIGRlZmluZSBfTG9jYWxlX0xPV0VSICBfTE9XRVIKLSMgIGRlZmluZSBfTG9jYWxlX0RJR0lUICBfRElHSVQKLSMgIGRlZmluZSBfTG9jYWxlX1hESUdJVCBfSEVYCi0jICBkZWZpbmUgX0xvY2FsZV9QVU5DVCAgX1BVTkNUCi0jICBkZWZpbmUgX0xvY2FsZV9TUEFDRSAgX1NQQUNFCi0jICBkZWZpbmUgX0xvY2FsZV9QUklOVCAgKF9VUFBFUiB8IF9MT1dFUiB8IF9ESUdJVCB8IF9QVU5DVCB8IF9TUEFDRSkKLSMgIGRlZmluZSBfTG9jYWxlX0FMUEhBICBfQUxQSEEgJiB+KF9VUFBFUiB8IF9MT1dFUikKLSNlbGlmIGRlZmluZWQgKF9fTVJDX18pIHx8IGRlZmluZWQgKF9fU0NfXykgICAgLyogKlRZIDAyLzI0LzIwMDAgLSBhZGRlZCBzdXBwb3J0IGZvciBNUFcgKi8KLSMgIGRlZmluZSBfTG9jYWxlX0NOVFJMICBfQ1RMCi0jICBkZWZpbmUgX0xvY2FsZV9VUFBFUiAgX1VQUAotIyAgZGVmaW5lIF9Mb2NhbGVfTE9XRVIgIF9MT1cKLSMgIGRlZmluZSBfTG9jYWxlX0RJR0lUICBfRElHCi0jICBkZWZpbmUgX0xvY2FsZV9YRElHSVQgX0hFWAotIyAgZGVmaW5lIF9Mb2NhbGVfUFVOQ1QgIF9QVU4KLSMgIGRlZmluZSBfTG9jYWxlX1NQQUNFICBfQkxBCi0jICBkZWZpbmUgX0xvY2FsZV9QUklOVCAgKF9VUFAgfCBfTE9XIHwgX0RJRyB8IF9QVU4gfCBfQkxBKQotIyAgZGVmaW5lIF9Mb2NhbGVfQUxQSEEgIChfVVBQIHwgX0xPVykKLSNlbGlmIGRlZmluZWQgKF9fTUxDQ1BQX18pCi0jICBkZWZpbmUgX0xvY2FsZV9DTlRSTCAgICAxCi0jICBkZWZpbmUgX0xvY2FsZV9VUFBFUiAgICAyCi0jICBkZWZpbmUgX0xvY2FsZV9MT1dFUiAgICA0Ci0jICBkZWZpbmUgX0xvY2FsZV9ESUdJVCAgICA4Ci0jICBkZWZpbmUgX0xvY2FsZV9YRElHSVQgIDE2Ci0jICBkZWZpbmUgX0xvY2FsZV9QVU5DVCAgIDMyCi0jICBkZWZpbmUgX0xvY2FsZV9TUEFDRSAgIDY0Ci0jICBkZWZpbmUgX0xvY2FsZV9QUklOVCAgMTI4Ci0jICBkZWZpbmUgX0xvY2FsZV9BTFBIQSAgMjU2Ci0jZWxpZiBkZWZpbmVkIChfX0dOVUNfXykgJiYgKF9fR05VQ19fID09IDMpICYmIGRlZmluZWQgKF9fQVBQTEVfXykKLSMgIGRlZmluZSBfTG9jYWxlX0NOVFJMIF9DCi0jICBkZWZpbmUgX0xvY2FsZV9VUFBFUiBfVQotIyAgZGVmaW5lIF9Mb2NhbGVfTE9XRVIgX0wKLSMgIGRlZmluZSBfTG9jYWxlX0RJR0lUIF9ECi0jICBkZWZpbmUgX0xvY2FsZV9YRElHSVQgX1gKLSMgIGRlZmluZSBfTG9jYWxlX1BVTkNUIF9QCi0jICBkZWZpbmUgX0xvY2FsZV9TUEFDRSBfUwotIyAgZGVmaW5lIF9Mb2NhbGVfUFJJTlQgX1IKLSMgIGRlZmluZSBfTG9jYWxlX0FMUEhBIF9BCi0jZWxpZiBkZWZpbmVkIChfX2hwdXgpIHx8IGRlZmluZWQgKF9fb3NmX18pCi0jICBpZiBkZWZpbmVkIChfX0hQX2FDQykgJiYgIWRlZmluZWQgKF9JTkNMVURFX0hQVVhfU09VUkNFKQotIyAgICBkZWZpbmUgX0lTQUxQSEEgICAgICAweDAwMQotIyAgICBkZWZpbmUgX0lTQUxOVU0gICAgICAweDAwMgotIyAgICBkZWZpbmUgX0lTQkxBTksgICAgICAweDAwNAotIyAgICBkZWZpbmUgX0lTQ05UUkwgICAgICAweDAwOAotIyAgICBkZWZpbmUgX0lTRElHSVQgICAgICAweDAxMAotIyAgICBkZWZpbmUgX0lTR1JBUEggICAgICAweDAyMAotIyAgICBkZWZpbmUgX0lTTE9XRVIgICAgICAweDA0MAotIyAgICBkZWZpbmUgX0lTUFJJTlQgICAgICAweDA4MAotIyAgICBkZWZpbmUgX0lTUFVOQ1QgICAgICAweDEwMAotIyAgICBkZWZpbmUgX0lTU1BBQ0UgICAgICAweDIwMAotIyAgICBkZWZpbmUgX0lTVVBQRVIgICAgICAweDQwMAotIyAgICBkZWZpbmUgX0lTWERJR0lUICAgICAweDgwMAotIyAgZW5kaWYKLSMgIGRlZmluZSBfTG9jYWxlX0NOVFJMICBfSVNDTlRSTAotIyAgZGVmaW5lIF9Mb2NhbGVfVVBQRVIgIF9JU1VQUEVSCi0jICBkZWZpbmUgX0xvY2FsZV9MT1dFUiAgX0lTTE9XRVIKLSMgIGRlZmluZSBfTG9jYWxlX0RJR0lUICBfSVNESUdJVAotIyAgZGVmaW5lIF9Mb2NhbGVfWERJR0lUIF9JU1hESUdJVAotIyAgZGVmaW5lIF9Mb2NhbGVfUFVOQ1QgIF9JU1BVTkNUCi0jICBkZWZpbmUgX0xvY2FsZV9TUEFDRSAgX0lTU1BBQ0UKLSMgIGRlZmluZSBfTG9jYWxlX1BSSU5UICBfSVNQUklOVAotIyAgZGVmaW5lIF9Mb2NhbGVfQUxQSEEgIF9JU0FMUEhBCi0jZWxpZiBkZWZpbmVkIChfX01WU19fKSB8fCBkZWZpbmVkIChfX09TNDAwX18pCi0jICBkZWZpbmUgX0xvY2FsZV9DTlRSTCBfX0lTQ05UUkwKLSMgIGRlZmluZSBfTG9jYWxlX1VQUEVSIF9fSVNVUFBFUgotIyAgZGVmaW5lIF9Mb2NhbGVfTE9XRVIgX19JU0xPV0VSCi0jICBkZWZpbmUgX0xvY2FsZV9ESUdJVCBfX0lTRElHSVQKLSMgIGRlZmluZSBfTG9jYWxlX1hESUdJVCBfX0lTWERJR0lUCi0jICBkZWZpbmUgX0xvY2FsZV9QVU5DVCBfX0lTUFVOQ1QKLSMgIGRlZmluZSBfTG9jYWxlX1NQQUNFIF9fSVNTUEFDRQotIyAgZGVmaW5lIF9Mb2NhbGVfUFJJTlQgX19JU1BSSU5UCi0jICBkZWZpbmUgX0xvY2FsZV9BTFBIQSBfX0lTQUxQSEEKLSNlbGlmIGRlZmluZWQgKF9fUU5YTlRPX18pICB8fCBkZWZpbmVkIChfX1dBVENPTUNfXykKLSMgIGRlZmluZSBfTG9jYWxlX0NOVFJMIF9DTlRSTAotIyAgZGVmaW5lIF9Mb2NhbGVfVVBQRVIgX1VQUEVSCi0jICBkZWZpbmUgX0xvY2FsZV9MT1dFUiBfTE9XRVIKLSMgIGRlZmluZSBfTG9jYWxlX0RJR0lUIF9ESUdJVAotIyAgZGVmaW5lIF9Mb2NhbGVfWERJR0lUIF9YRElHVAotIyAgZGVmaW5lIF9Mb2NhbGVfUFVOQ1QgX1BVTkNUCi0jICBkZWZpbmUgX0xvY2FsZV9TUEFDRSBfU1BBQ0UKLSMgIGRlZmluZSBfTG9jYWxlX1BSSU5UIF9QUklOVAotIyAgZGVmaW5lIF9Mb2NhbGVfQUxQSEEgKF9VUFBFUiB8IF9MT1dFUikKLSNlbGlmIGRlZmluZWQgKF9fREpHUFApCi0jICBkZWZpbmUgX0xvY2FsZV9DTlRSTCAgX19kal9JU0NOVFJMCi0jICBkZWZpbmUgX0xvY2FsZV9VUFBFUiAgX19kal9JU1VQUEVSCi0jICBkZWZpbmUgX0xvY2FsZV9MT1dFUiAgX19kal9JU0xPV0VSCi0jICBkZWZpbmUgX0xvY2FsZV9ESUdJVCAgX19kal9JU0RJR0lUCi0jICBkZWZpbmUgX0xvY2FsZV9YRElHSVQgX19kal9JU1hESUdJVAotIyAgZGVmaW5lIF9Mb2NhbGVfUFVOQ1QgIF9fZGpfSVNQVU5DVAotIyAgZGVmaW5lIF9Mb2NhbGVfU1BBQ0UgIF9fZGpfSVNTUEFDRQotIyAgZGVmaW5lIF9Mb2NhbGVfUFJJTlQgIF9fZGpfSVNQUklOVAotIyAgZGVmaW5lIF9Mb2NhbGVfQUxQSEEgIF9fZGpfSVNBTFBIQQotI2VsaWYgZGVmaW5lZCAoX1NUTFBfU0NPX09QRU5TRVJWRVIpCi0jICBkZWZpbmUgX0xvY2FsZV9DTlRSTCBfQwotIyAgZGVmaW5lIF9Mb2NhbGVfVVBQRVIgX1UKLSMgIGRlZmluZSBfTG9jYWxlX0xPV0VSIF9MCi0jICBkZWZpbmUgX0xvY2FsZV9ESUdJVCBfTgotIyAgZGVmaW5lIF9Mb2NhbGVfWERJR0lUIF9YCi0jICBkZWZpbmUgX0xvY2FsZV9QVU5DVCBfUAotIyAgZGVmaW5lIF9Mb2NhbGVfU1BBQ0UgX1MKLSMgIGRlZmluZSBfTG9jYWxlX1BSSU5UIF9SCi0jICBkZWZpbmUgX0xvY2FsZV9BTFBIQSBfQQotI2VsaWYgZGVmaW5lZCAoX19OQ1JfU1ZSKQotIyAgZGVmaW5lIF9Mb2NhbGVfQ05UUkwgX0MKLSMgIGRlZmluZSBfTG9jYWxlX1VQUEVSIF9VCi0jICBkZWZpbmUgX0xvY2FsZV9MT1dFUiBfTAotIyAgZGVmaW5lIF9Mb2NhbGVfRElHSVQgX04KLSMgIGRlZmluZSBfTG9jYWxlX1hESUdJVCBfWAotIyAgZGVmaW5lIF9Mb2NhbGVfUFVOQ1QgX1AKLSMgIGRlZmluZSBfTG9jYWxlX1NQQUNFIF9TCi0jICBkZWZpbmUgX0xvY2FsZV9QUklOVCAoX1AgfCBfVSB8IF9MIHwgX04gfCBfQikKLSMgIGRlZmluZSBfTG9jYWxlX0FMUEhBIChfVSB8IF9MKQotI2VsaWYgZGVmaW5lZCAoX0NSQVkpCi0jICBkZWZpbmUgX0xvY2FsZV9DTlRSTCAgX0NOVFJMCi0jICBkZWZpbmUgX0xvY2FsZV9VUFBFUiAgX1VQUEVSCi0jICBkZWZpbmUgX0xvY2FsZV9MT1dFUiAgX0xPV0VSCi0jICBkZWZpbmUgX0xvY2FsZV9ESUdJVCAgX0RJR0lUCi0jICBkZWZpbmUgX0xvY2FsZV9YRElHSVQgX1hESUdJVAotIyAgZGVmaW5lIF9Mb2NhbGVfUFVOQ1QgIF9QVU5DVAotIyAgZGVmaW5lIF9Mb2NhbGVfU1BBQ0UgIF9TUEFDRQotIyAgZGVmaW5lIF9Mb2NhbGVfUFJJTlQgIF9QUklOVAotIyAgZGVmaW5lIF9Mb2NhbGVfQUxQSEEgIF9BTFBIQQotI2VuZGlmCi0KLS8qIFdlIGFyYml0cmFyaWx5IGNvbnNpZGVyIF9Mb2NhbGVfQ05UUkwgbWFjcm8gdG8gY2hlY2sgbG9jYWxlIGZhY2V0IG51bWVyaWMKLSAqIGlkZW50aWZpZXIgaGFzIGJlZW4gZGVmaW5lZCBmb3IgdGhlIHBsYXRmb3JtL2NvbXBpbGVyOgotICovCi0jaWYgIWRlZmluZWQgKF9Mb2NhbGVfQ05UUkwpCi0jICBlcnJvciBVbmFibGUgdG8gZmluZCB5b3VyIHBsYXRmb3JtIGxvY2FsZSBmYWNldHMgZGVmaW5pdGlvbnMsIHBsZWFzZSBncmFudCB0aGVtLgotI2VuZGlmCi0KLSNlbmRpZiAvKiBfU1RMUF9DX0xPQ0FMRV9IICovCmRpZmYgLS1naXQgYS9zdGwvY2hhcl90cmFpdHMuaCBiL3N0bC9jaGFyX3RyYWl0cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmU4ZDA4Li4wMDAwMDAwCi0tLSBhL3N0bC9jaGFyX3RyYWl0cy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjkwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NwotICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLQotI2lmbmRlZiBfU1RMUF9DSEFSX1RSQUlUU19ICi0jZGVmaW5lIF9TVExQX0NIQVJfVFJBSVRTX0gKLQotLy8gRGVmaW5lIGNoYXJfdHJhaXRzCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1NURERFRgotIyAgaW5jbHVkZSA8c3RsL19jc3RkZGVmLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DU1RSSU5HCi0jICBpbmNsdWRlIDxzdGwvX2NzdHJpbmcuaD4KLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX191bml4KSB8fCBkZWZpbmVkIChOX1BMQVRfTkxNKQotIyAgaW5jbHVkZSA8c3lzL3R5cGVzLmg+ICAgICAgICAgLy8gRm9yIG9mZl90Ci0jZW5kaWYgLyogX191bml4ICovCi0KLSNpZmRlZiBfX0JPUkxBTkRDX18KLSMgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NfSEVBREVSKG1lbS5oKQotIyAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ19IRUFERVIoc3RyaW5nLmgpCi0jICBpbmNsdWRlIF9TVExQX05BVElWRV9DX0hFQURFUihfc3RkZGVmLmgpCi0jZW5kaWYKLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DT05TVFJVQ1RfSAotIyAgaW5jbHVkZSA8c3RsL19jb25zdHJ1Y3QuaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NXQ0hBUgotIyAgaW5jbHVkZSA8c3RsL19jd2NoYXIuaD4KLSNlbmRpZgotCi1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4gY2xhc3MgYWxsb2NhdG9yOwotCi0jZGVmaW5lIF9TVExQX05VTExfQ0hBUl9JTklUKF9DaFQpIF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQoX0NoVCkKLQotI2lmIGRlZmluZWQgKF9fc2dpKSAmJiBkZWZpbmVkIChfU1RMUF9IQVNfTk9fTkVXX0NfSEVBREVSUykgLyogSVJJWCAqLwotdHlwZWRlZiBvZmY2NF90IHN0cmVhbW9mZjsKLSNlbGlmIGRlZmluZWQoX1NUTFBfV0NFKQotdHlwZWRlZiBsb25nIHN0cmVhbW9mZjsKLSNlbGlmIGRlZmluZWQgKF9TVExQX1dJTjMyKQotIyAgaWYgZGVmaW5lZCAoX1NUTFBfTE9OR19MT05HKSAmJiAhZGVmaW5lZCAoX19DWUdXSU5fXykKLS8vVGhlIFdpbjMyIGZpbGUgaW8gQVBJIHN1cHBvcnQgNjQgYml0cyBhY2Nlc3Mgc28gc3RyZWFtb2ZmIGFuZCBzdHJlYW1zaXplCi0vL2hhcyB0byByZWZsZWN0IHRoYXQuIERvIG5vdCBjaGFuZ2UgdGhlIHN0cmluZ2J1ZiBiZWhhdmlvci4KLXR5cGVkZWYgX1NUTFBfTE9OR19MT05HIHN0cmVhbW9mZjsKLSMgIGVsc2UKLXR5cGVkZWYgcHRyZGlmZl90IHN0cmVhbW9mZjsKLSMgIGVuZGlmCi0jZWxzZSAvLyBfX3VuaXgKLSMgIGlmZGVmIF9TVExQX1VTRV9ERUZBVUxUX0ZJTEVfT0ZGU0VUCi10eXBlZGVmIG9mZl90IHN0cmVhbW9mZjsKLSMgIGVsaWYgZGVmaW5lZChfTEFSR0VGSUxFX1NPVVJDRSkgfHwgZGVmaW5lZChfTEFSR0VGSUxFNjRfU09VUkNFKSAvKiB8fCBkZWZpbmVkKF9fVVNFX0ZJTEVfT0ZGU0VUNjQpICovIFwKLSAgICAgICAvKiB8fCAoZGVmaW5lZChfRklMRV9PRkZTRVRfQklUUykgJiYgKF9GSUxFX09GRlNFVF9CSVRTID09IDY0KSkgKi8gLyogfHwgZGVmaW5lZCAoX19zZ2kpICYmIGRlZmluZWQgKF9TVExQX0hBU19OT19ORVdfQ19IRUFERVJTKSAqLwotdHlwZWRlZiBvZmY2NF90IHN0cmVhbW9mZjsKLSMgIGVsaWYgZGVmaW5lZChBTkRST0lEKQotdHlwZWRlZiBsb25nIHN0cmVhbW9mZjsKLSMgIGVsc2UKLXR5cGVkZWYgb2ZmX3Qgc3RyZWFtb2ZmOwotIyAgZW5kaWYKLSNlbmRpZiAvKiBfX191bml4ICovCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9XSU4zMikKLXR5cGVkZWYgc3RyZWFtb2ZmIHN0cmVhbXNpemU7Ci0jZWxzZQotdHlwZWRlZiBwdHJkaWZmX3Qgc3RyZWFtc2l6ZTsKLSNlbmRpZgotCi0vLyBDbGFzcyBmcG9zLCB3aGljaCByZXByZXNlbnRzIGEgcG9zaXRpb24gd2l0aGluIGEgZmlsZS4gIChUaGUgQysrCi0vLyBzdGFuZGFyZCBjYWxscyBmb3IgaXQgdG8gYmUgZGVmaW5lZCBpbiA8aW9zPi4gIFRoaXMgaW1wbGVtZW50YXRpb24KLS8vIG1vdmVzIGl0IHRvIDxpb3Nmd2Q+LCB3aGljaCBpcyBpbmNsdWRlZCBieSA8aW9zPi4pCi10ZW1wbGF0ZSA8Y2xhc3MgX1N0YXRlVD4gY2xhc3MgZnBvcyB7Ci1wdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZyb20gdGFibGUgODggb2YgdGhlIEMrKyBzdGFuZGFyZC4KLSAgZnBvcyhzdHJlYW1vZmYgX19wb3MpIDogX01fcG9zKF9fcG9zKSwgX01fc3QoX1NUTFBfTlVMTF9DSEFSX0lOSVQoX1N0YXRlVCkpIHt9Ci0gIGZwb3MoKSA6IF9NX3BvcygwKSwgX01fc3QoX1NUTFBfTlVMTF9DSEFSX0lOSVQoX1N0YXRlVCkpIHt9Ci0KLSAgb3BlcmF0b3Igc3RyZWFtb2ZmKCkgY29uc3QgeyByZXR1cm4gX01fcG9zOyB9Ci0KLSAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGZwb3MmIF9feSkgY29uc3QKLSAgeyByZXR1cm4gX01fcG9zID09IF9feS5fTV9wb3M7IH0KLSAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGZwb3MmIF9feSkgY29uc3QKLSAgeyByZXR1cm4gX01fcG9zICE9IF9feS5fTV9wb3M7IH0KLQotICBmcG9zJiBvcGVyYXRvcis9KHN0cmVhbW9mZiBfX29mZikgewotICAgIF9NX3BvcyArPSBfX29mZjsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgZnBvcyYgb3BlcmF0b3ItPShzdHJlYW1vZmYgX19vZmYpIHsKLSAgICBfTV9wb3MgLT0gX19vZmY7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgZnBvcyBvcGVyYXRvcisoc3RyZWFtb2ZmIF9fb2ZmKSB7Ci0gICAgZnBvcyBfX3RtcCgqdGhpcyk7Ci0gICAgX190bXAgKz0gX19vZmY7Ci0gICAgcmV0dXJuIF9fdG1wOwotICB9Ci0gIGZwb3Mgb3BlcmF0b3ItKHN0cmVhbW9mZiBfX29mZikgewotICAgIGZwb3MgX190bXAoKnRoaXMpOwotICAgIF9fdG1wIC09IF9fb2ZmOwotICAgIHJldHVybiBfX3RtcDsKLSAgfQotCi1wdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hbmlwdWxhdGlvbiBvZiB0aGUgc3RhdGUgbWVtYmVyLgotICBfU3RhdGVUIHN0YXRlKCkgY29uc3QgeyByZXR1cm4gX01fc3Q7IH0KLSAgdm9pZCBzdGF0ZShfU3RhdGVUIF9fc3QpIHsgX01fc3QgPSBfX3N0OyB9Ci1wcml2YXRlOgotICBzdHJlYW1vZmYgX01fcG9zOwotICBfU3RhdGVUIF9NX3N0OwotfTsKLQotI2lmICFkZWZpbmVkIChfU1RMUF9OT19NQlNUQVRFX1QpCi10eXBlZGVmIGZwb3M8bWJzdGF0ZV90PiBzdHJlYW1wb3M7Ci10eXBlZGVmIGZwb3M8bWJzdGF0ZV90PiB3c3RyZWFtcG9zOwotI2VuZGlmCi0KLS8vIENsYXNzIF9fY2hhcl90cmFpdHNfYmFzZS4KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9JbnRUPgotY2xhc3MgX19jaGFyX3RyYWl0c19iYXNlIHsKLXB1YmxpYzoKLSAgdHlwZWRlZiBfQ2hhclQgY2hhcl90eXBlOwotICB0eXBlZGVmIF9JbnRUIGludF90eXBlOwotICB0eXBlZGVmIHN0cmVhbW9mZiBvZmZfdHlwZTsKLSAgdHlwZWRlZiBzdHJlYW1wb3MgcG9zX3R5cGU7Ci0jaWYgZGVmaW5lZCAoX1NUTFBfTk9fTUJTVEFURV9UKQotICB0eXBlZGVmIGNoYXIgICAgICBzdGF0ZV90eXBlOwotI2Vsc2UKLSAgdHlwZWRlZiBtYnN0YXRlX3Qgc3RhdGVfdHlwZTsKLSNlbmRpZgotCi0gIHN0YXRpYyB2b2lkIF9TVExQX0NBTEwgYXNzaWduKGNoYXJfdHlwZSYgX19jMSwgY29uc3QgY2hhcl90eXBlJiBfX2MyKSB7IF9fYzEgPSBfX2MyOyB9Ci0gIHN0YXRpYyBib29sIF9TVExQX0NBTEwgZXEoY29uc3QgY2hhcl90eXBlJiBfX2MxLCBjb25zdCBjaGFyX3R5cGUmIF9fYzIpCi0gIHsgcmV0dXJuIF9fYzEgPT0gX19jMjsgfQotICBzdGF0aWMgYm9vbCBfU1RMUF9DQUxMIGx0KGNvbnN0IGNoYXJfdHlwZSYgX19jMSwgY29uc3QgY2hhcl90eXBlJiBfX2MyKQotICB7IHJldHVybiBfX2MxIDwgX19jMjsgfQotCi0gIHN0YXRpYyBpbnQgX1NUTFBfQ0FMTCBjb21wYXJlKGNvbnN0IGNoYXJfdHlwZSogX19zMSwgY29uc3QgY2hhcl90eXBlKiBfX3MyLCBzaXplX3QgX19uKSB7Ci0gICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19uOyArK19faSkKLSAgICAgIGlmICghZXEoX19zMVtfX2ldLCBfX3MyW19faV0pKQotICAgICAgICByZXR1cm4gX19zMVtfX2ldIDwgX19zMltfX2ldID8gLTEgOiAxOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgc3RhdGljIHNpemVfdCBfU1RMUF9DQUxMIGxlbmd0aChjb25zdCBjaGFyX3R5cGUqIF9fcykgewotICAgIGNvbnN0IGNoYXJfdHlwZSBfTnVsbENoYXIgPSBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKGNoYXJfdHlwZSk7Ci0gICAgc2l6ZV90IF9faSgwKTsKLSAgICBmb3IgKDsgIWVxKF9fc1tfX2ldLCBfTnVsbENoYXIpOyArK19faSkge30KLSAgICByZXR1cm4gX19pOwotICB9Ci0KLSAgc3RhdGljIGNvbnN0IGNoYXJfdHlwZSogX1NUTFBfQ0FMTCBmaW5kKGNvbnN0IGNoYXJfdHlwZSogX19zLCBzaXplX3QgX19uLCBjb25zdCBjaGFyX3R5cGUmIF9fYykgewotICAgIGZvciAoIDsgX19uID4gMCA7ICsrX19zLCAtLV9fbikKLSAgICAgIGlmIChlcSgqX19zLCBfX2MpKQotICAgICAgICByZXR1cm4gX19zOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgc3RhdGljIGNoYXJfdHlwZSogX1NUTFBfQ0FMTCBtb3ZlKGNoYXJfdHlwZSogX19zMSwgY29uc3QgY2hhcl90eXBlKiBfX3MyLCBzaXplX3QgX1N6KQotICB7IHJldHVybiAoX1N6ID09IDAgPyBfX3MxIDogKGNoYXJfdHlwZSopbWVtbW92ZShfX3MxLCBfX3MyLCBfU3ogKiBzaXplb2YoY2hhcl90eXBlKSkpOyB9Ci0KLSAgc3RhdGljIGNoYXJfdHlwZSogX1NUTFBfQ0FMTCBjb3B5KGNoYXJfdHlwZSogX19zMSwgY29uc3QgY2hhcl90eXBlKiBfX3MyLCBzaXplX3QgX19uKSB7Ci0gICAgcmV0dXJuIChfX24gPT0gMCA/IF9fczEgOgotICAgICAgKGNoYXJfdHlwZSopbWVtY3B5KF9fczEsIF9fczIsIF9fbiAqIHNpemVvZihjaGFyX3R5cGUpKSk7Ci0gIH0KLQotICBzdGF0aWMgY2hhcl90eXBlKiBfU1RMUF9DQUxMIGFzc2lnbihjaGFyX3R5cGUqIF9fcywgc2l6ZV90IF9fbiwgY2hhcl90eXBlIF9fYykgewotICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fbjsgKytfX2kpCi0gICAgICBfX3NbX19pXSA9IF9fYzsKLSAgICByZXR1cm4gX19zOwotICB9Ci0KLSAgc3RhdGljIGludF90eXBlIF9TVExQX0NBTEwgbm90X2VvZihjb25zdCBpbnRfdHlwZSYgX19jKQotICB7IHJldHVybiAhZXFfaW50X3R5cGUoX19jLCBlb2YoKSkgPyBfX2MgOiBfX1NUQVRJQ19DQVNUKGludF90eXBlLCAwKTsgfQotCi0gIHN0YXRpYyBjaGFyX3R5cGUgX1NUTFBfQ0FMTCB0b19jaGFyX3R5cGUoY29uc3QgaW50X3R5cGUmIF9fYykKLSAgeyByZXR1cm4gKGNoYXJfdHlwZSlfX2M7IH0KLQotICBzdGF0aWMgaW50X3R5cGUgX1NUTFBfQ0FMTCB0b19pbnRfdHlwZShjb25zdCBjaGFyX3R5cGUmIF9fYykKLSAgeyByZXR1cm4gKGludF90eXBlKV9fYzsgfQotCi0gIHN0YXRpYyBib29sIF9TVExQX0NBTEwgZXFfaW50X3R5cGUoY29uc3QgaW50X3R5cGUmIF9fYzEsIGNvbnN0IGludF90eXBlJiBfX2MyKQotICB7IHJldHVybiBfX2MxID09IF9fYzI7IH0KLQotICBzdGF0aWMgaW50X3R5cGUgX1NUTFBfQ0FMTCBlb2YoKQotICB7IHJldHVybiAoaW50X3R5cGUpLTE7IH0KLX07Ci0KLS8vIEdlbmVyaWMgY2hhcl90cmFpdHMgY2xhc3MuICBOb3RlIHRoYXQgdGhpcyBjbGFzcyBpcyBwcm92aWRlZCBvbmx5Ci0vLyAgYXMgYSBiYXNlIGZvciBleHBsaWNpdCBzcGVjaWFsaXphdGlvbjsgaXQgaXMgdW5saWtlbHkgdG8gYmUgdXNlZnVsCi0vLyAgYXMgaXMgZm9yIGFueSBwYXJ0aWN1bGFyIHVzZXItZGVmaW5lZCB0eXBlLiAgSW4gcGFydGljdWxhciwgaXQKLS8vICAqd2lsbCBub3Qgd29yayogZm9yIGEgbm9uLVBPRCB0eXBlLgotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgotY2xhc3MgY2hhcl90cmFpdHMKLSAgOiBwdWJsaWMgX19jaGFyX3RyYWl0c19iYXNlPF9DaGFyVCwgX0NoYXJUPiB7fTsKLQotLy8gU3BlY2lhbGl6YXRpb24gZm9yIGNoYXIuCi0KLV9TVExQX1RFTVBMQVRFX05VTEwKLWNsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIGNoYXJfdHJhaXRzPGNoYXI+Ci0gIDogcHVibGljIF9fY2hhcl90cmFpdHNfYmFzZTxjaGFyLCBpbnQ+IHsKLXB1YmxpYzoKLSAgdHlwZWRlZiBjaGFyIGNoYXJfdHlwZTsKLSAgdHlwZWRlZiBpbnQgaW50X3R5cGU7Ci0gIHR5cGVkZWYgc3RyZWFtb2ZmIG9mZl90eXBlOwotI2lmICFkZWZpbmVkIChfU1RMUF9OT19NQlNUQVRFX1QpCi0gIHR5cGVkZWYgc3RyZWFtcG9zIHBvc190eXBlOwotICB0eXBlZGVmIG1ic3RhdGVfdCBzdGF0ZV90eXBlOwotI2VuZGlmCi0KLSAgc3RhdGljIGNoYXIgX1NUTFBfQ0FMTCB0b19jaGFyX3R5cGUoY29uc3QgaW50JiBfX2MpCi0gIHsgcmV0dXJuIChjaGFyKSh1bnNpZ25lZCBjaGFyKV9fYzsgfQotCi0gIHN0YXRpYyBpbnQgX1NUTFBfQ0FMTCB0b19pbnRfdHlwZShjb25zdCBjaGFyJiBfX2MpCi0gIHsgcmV0dXJuICh1bnNpZ25lZCBjaGFyKV9fYzsgfQotCi0gIHN0YXRpYyBpbnQgX1NUTFBfQ0FMTCBjb21wYXJlKGNvbnN0IGNoYXIqIF9fczEsIGNvbnN0IGNoYXIqIF9fczIsIHNpemVfdCBfX24pCi0gIHsgcmV0dXJuIG1lbWNtcChfX3MxLCBfX3MyLCBfX24pOyB9Ci0KLSAgc3RhdGljIHNpemVfdCBfU1RMUF9DQUxMIGxlbmd0aChjb25zdCBjaGFyKiBfX3MpCi0gIHsgcmV0dXJuIHN0cmxlbihfX3MpOyB9Ci0KLSAgc3RhdGljIHZvaWQgX1NUTFBfQ0FMTCBhc3NpZ24oY2hhciYgX19jMSwgY29uc3QgY2hhciYgX19jMikKLSAgeyBfX2MxID0gX19jMjsgfQotCi0gIHN0YXRpYyBjaGFyKiBfU1RMUF9DQUxMIGFzc2lnbihjaGFyKiBfX3MsIHNpemVfdCBfX24sIGNoYXIgX19jKSB7Ci0gICAgbWVtc2V0KF9fcywgX19jLCBfX24pOwotICAgIHJldHVybiBfX3M7Ci0gIH0KLX07Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9IQVNfV0NIQVJfVCkKLS8vIFNwZWNpYWxpemF0aW9uIGZvciB3Y2hhcl90LgotX1NUTFBfVEVNUExBVEVfTlVMTAotY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgY2hhcl90cmFpdHM8d2NoYXJfdD4KLSAgOiBwdWJsaWMgX19jaGFyX3RyYWl0c19iYXNlPHdjaGFyX3QsIHdpbnRfdD4gewotIyAgaWYgIWRlZmluZWQgKF9TVExQX05PX05BVElWRV9XSURFX0ZVTkNUSU9OUykgJiYgIWRlZmluZWQgKF9TVExQX1dDSEFSX0hQQUNDX0VYQ0xVREUpCi1wdWJsaWM6Ci0jICAgIGlmICFkZWZpbmVkIChOX1BMQVRfTkxNKQotIyAgICAgIGlmICFkZWZpbmVkIChfX0JPUkxBTkRDX18pCi0gIHN0YXRpYyB3Y2hhcl90KiBfU1RMUF9DQUxMIG1vdmUod2NoYXJfdCogX19kZXN0LCBjb25zdCB3Y2hhcl90KiBfX3NyYywgc2l6ZV90IF9fbikKLSAgeyByZXR1cm4gd21lbW1vdmUoX19kZXN0LCBfX3NyYywgX19uKTsgfQotIyAgICAgIGVuZGlmCi0KLSAgc3RhdGljIHdjaGFyX3QqIF9TVExQX0NBTEwgY29weSh3Y2hhcl90KiBfX2Rlc3QsIGNvbnN0IHdjaGFyX3QqIF9fc3JjLCBzaXplX3QgX19uKQotICB7IHJldHVybiB3bWVtY3B5KF9fZGVzdCwgX19zcmMsIF9fbik7IH0KLQotIyAgICAgIGlmICFkZWZpbmVkIChfX0RNQ19fKSAmJiAhZGVmaW5lZCAoX19CT1JMQU5EQ19fKQotICBzdGF0aWMgaW50IF9TVExQX0NBTEwgY29tcGFyZShjb25zdCB3Y2hhcl90KiBfX3MxLCBjb25zdCB3Y2hhcl90KiBfX3MyLCBzaXplX3QgX19uKQotICB7IHJldHVybiB3bWVtY21wKF9fczEsIF9fczIsIF9fbik7IH0KLSMgICAgICBlbmRpZgotCi0gIHN0YXRpYyB3Y2hhcl90KiBfU1RMUF9DQUxMIGFzc2lnbih3Y2hhcl90KiBfX3MsIHNpemVfdCBfX24sIHdjaGFyX3QgX19jKQotICB7IHJldHVybiB3bWVtc2V0KF9fcywgX19jLCBfX24pOyB9Ci0jICAgIGVuZGlmCi0KLSAgc3RhdGljIHNpemVfdCBfU1RMUF9DQUxMIGxlbmd0aChjb25zdCB3Y2hhcl90KiBfX3MpCi0gIHsgcmV0dXJuIHdjc2xlbihfX3MpOyB9Ci0KLSAgc3RhdGljIHZvaWQgX1NUTFBfQ0FMTCBhc3NpZ24od2NoYXJfdCYgX19jMSwgY29uc3Qgd2NoYXJfdCYgX19jMikKLSAgeyBfX2MxID0gX19jMjsgfQotIyAgZW5kaWYKLX07Ci0jZW5kaWYKLQotX1NUTFBfRU5EX05BTUVTUEFDRQotCi0jZW5kaWYgLyogX1NUTFBfQ0hBUl9UUkFJVFNfSCAqLwotCi0vLyBMb2NhbCBWYXJpYWJsZXM6Ci0vLyBtb2RlOkMrKwotLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RsL2NvbmZpZy9fYWl4LmggYi9zdGwvY29uZmlnL19haXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNiY2IzMi4uMDAwMDAwMAotLS0gYS9zdGwvY29uZmlnL19haXguaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNkZWZpbmUgX1NUTFBfUExBVEZPUk0gIkFJWCIKZGlmZiAtLWdpdCBhL3N0bC9jb25maWcvX2FuZHJvaWQuaCBiL3N0bC9jb25maWcvX2FuZHJvaWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE5NTRiZi4uMDAwMDAwMAotLS0gYS9zdGwvY29uZmlnL19hbmRyb2lkLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0jaWZuZGVmIF9fc3RsX2NvbmZpZ19fYW5kcm9pZF9oCi0jZGVmaW5lIF9fc3RsX2NvbmZpZ19fYW5kcm9pZF9oCi0KLSNkZWZpbmUgX1NUTFBfUExBVEZPUk0gIkFuZHJvaWQiCi0KLS8vIFRoZSBBbmRyb2lkIEMgbGlicmFyeSBpcyBtb3N0bHkgZ2xpYmMtbGlrZQotI2RlZmluZSBfU1RMUF9VU0VfR0xJQkMgMQotCi0vLyAuLi5hbmQgVW5peC1saWtlLgotI2RlZmluZSBfU1RMUF9VTklYIDEKLQotLy8gSGF2ZSBwdGhyZWFkcyBzdXBwb3J0LgotI2RlZmluZSBfUFRIUkVBRFMKLQotLy8gRG9uJ3QgaGF2ZSBuYXRpdmUgPGNwbHVzcGx1cz4gaGVhZGVycwotI2RlZmluZSBfU1RMUF9IQVNfTk9fTkVXX0NfSEVBREVSUyAxCi0KLS8vIERvbid0IHVzZSB3Y2hhci5oIGV0YwotI2RlZmluZSBfU1RMUF9OT19XQ0hBUl9UIDEKLQotLy8gRG9uJ3QgaGF2ZSAod29ya2luZykgbmF0aXZlIHdpZGUgY2hhcmFjdGVyIHN1cHBvcnQuCi0jZGVmaW5lIF9TVExQX05PX05BVElWRV9XSURFX0ZVTkNUSU9OUyAxCi0KLS8vIERvbid0IHVzZSBtYnN0YXRlX3QsIGRlZmluZSBvdXIgb3duLgotI2RlZmluZSBfU1RMUF9OT19OQVRJVkVfTUJTVEFURV9UIDEKLQotLy8gTm8gKHByb3Blcikgd2lkZSBzdHJlYW0gc3VwcG9ydCBpbiBBbmRyb2lkCi0jZGVmaW5lIF9TVExQX05PX05BVElWRV9XSURFX1NUUkVBTVMgMQotCi0vLyBDIGxpYnJhcnkgaXMgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuCi0jZGVmaW5lIF9TVExQX1ZFTkRPUl9HTE9CQUxfQ1NURCAxCi0KLS8vIERvbid0IGhhdmUgdW5kZXJseWluZyBsb2NhbCBzdXBwb3J0LgotI3VuZGVmIF9TVExQX1JFQUxfTE9DQUxFX0lNUExFTUVOVEVECi0KLS8vIE5vIHB0aHJlYWRfc3BpbmxvY2tfdCBpbiBBbmRyb2lkCi0jZGVmaW5lIF9TVExQX0RPTlRfVVNFX1BUSFJFQURfU1BJTkxPQ0sgMQotCi0vLyBEbyBub3QgZW5hYmxlIHRocmVhZCBzdXBwb3J0Ci0jZGVmaW5lIF9OT1RIUkVBRFMgMQotCi0vLyBMaXR0bGUgZW5kaWFuIHBsYXRmb3JtLgotI2RlZmluZSBfU1RMUF9MSVRUTEVfRU5ESUFOIDEKLQotLy8gTm8gPGV4Y2VwdGlvbj4gaGVhZGVycwotI2RlZmluZSBfU1RMUF9OT19FWENFUFRJT05fSEVBREVSIDEKLQotLy8gTm8gdGhyb3dpbmcgZXhjZXB0aW9ucwotI2RlZmluZSBfU1RMUF9OT19FWENFUFRJT05TIDEKLQotLy8gRGlzYWJsZSBhbGwgaW9zdHJlYW1zCi0jZGVmaW5lIF9TVExQX05PX0lPU1RSRUFNUyAxCi0KLS8vIE5vIG5lZWQgdG8gZGVmaW5lIG91ciBvd24gbmFtZXNwYWNlCi0jZGVmaW5lIF9TVExQX05PX09XTl9OQU1FU1BBQ0UgMQotCi0vLyBOZWVkIHRoaXMgdG8gZGVmaW5lIFNUTHBvcnQncyBvd24gYmFkX2FsbG9jIGNsYXNzICh3aGljaCB3b24ndCBiZQotLy8gdGhyb3duIGluIGFueSBjYXNlKQotI2RlZmluZSBfU1RMUF9ORVdfRE9OVF9USFJPV19CQURfQUxMT0MgMQotCi0vLyBVc2UgX19uZXdfYWxsb2MgaW5zdGVhZCBvZiBfX25vZGVfYWxsb2MsIHNvIHdlIGRvbid0IG5lZWQgc3RhdGljIGZ1bmN0aW9ucy4KLSNkZWZpbmUgX1NUTFBfVVNFX1NJTVBMRV9OT0RFX0FMTE9DIDEKLQotLy8gRG9uJ3QgdXNlIGV4dGVybiB2ZXJzaW9ucyBvZiByYW5nZSBlcnJvcnMsIHNvIHdlIGRvbid0IG5lZWQgdG8KLS8vIGNvbXBpbGUgYXMgYSBsaWJyYXJ5LgotI2RlZmluZSBfU1RMUF9VU0VfTk9fRVhURVJOX1JBTkdFX0VSUk9SUyAxCi0KLS8vIFRoZSBzeXN0ZW0gbWF0aCBsaWJyYXJ5IGRvZXNuJ3QgaGF2ZSBsb25nIGRvdWJsZSB2YXJpYW50cywgZS5nCi0vLyBzaW5sLCBjb3NsLCBldGMKLSNkZWZpbmUgX1NUTFBfTk9fVkVORE9SX01BVEhfTCAxCi0KLS8vIERlZmluZSBob3cgdG8gaW5jbHVkZSBvdXIgbmF0aXZlIGhlYWRlcnMuCi0jZGVmaW5lIF9TVExQX05BVElWRV9IRUFERVIoaGVhZGVyKSA8bGlic3RkYysrL2luY2x1ZGUvaGVhZGVyPgotI2RlZmluZSBfU1RMUF9OQVRJVkVfQ19IRUFERVIoaGVhZGVyKSA8Li4vaW5jbHVkZS9oZWFkZXI+Ci0jZGVmaW5lIF9TVExQX05BVElWRV9DUFBfQ19IRUFERVIoaGVhZGVyKSA8bGlic3RkYysrL2luY2x1ZGUvaGVhZGVyPgotI2RlZmluZSBfU1RMUF9OQVRJVkVfT0xEX1NUUkVBTVNfSEVBREVSKGhlYWRlcikgPGxpYnN0ZGMrKy9pbmNsdWRlL2hlYWRlcj4KLSNkZWZpbmUgX1NUTFBfTkFUSVZFX0NQUF9SVU5USU1FX0hFQURFUihoZWFkZXIpIDxsaWJzdGRjKysvaW5jbHVkZS9oZWFkZXI+Ci0KLSNlbmRpZiAvKiBfX3N0bF9jb25maWdfX2FuZHJvaWRfaCAqLwpkaWZmIC0tZ2l0IGEvc3RsL2NvbmZpZy9fYXBjYy5oIGIvc3RsL2NvbmZpZy9fYXBjYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZThiMTE1Li4wMDAwMDAwCi0tLSBhL3N0bC9jb25maWcvX2FwY2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8vIFNUTHBvcnQgY29uZmlnIGZpbGUgZm9yIEFwb2dlZSA0LngKLQotI2RlZmluZSBfU1RMUF9DT01QSUxFUiAiQXBvZ2VlIgotCi0jZGVmaW5lIF9TVExQX05PX05FV19ORVdfSEVBREVSIDEKLSNkZWZpbmUgX1NUTFBfSEFTX05PX05FV19JT1NUUkVBTVMgMQotI2RlZmluZSBfU1RMUF9IQVNfTk9fTkVXX0NfSEVBREVSUyAxCi0KLSNpZiBkZWZpbmVkKF9YT1BFTl9TT1VSQ0UpICYmIChfWE9QRU5fVkVSU0lPTiAtIDAgPj0gNCkKLSMgZGVmaW5lIF9TVExQX1JBTkQ0OCAxCi0jZW5kaWYKLS8vICMgIGRlZmluZSBfU1RMUF9SQU5ENDggMQotI2RlZmluZSBfU1RMUF9MT05HX0xPTkcgbG9uZyBsb25nCi0jZGVmaW5lIF9TVExQX05PX0JBRF9BTExPQyAxCi0jZGVmaW5lIF9TVExQX05PX01FTUJFUl9URU1QTEFURV9LRVlXT1JEIDEKLSNkZWZpbmUgX1NUTFBfTk9OX1RZUEVfVE1QTF9QQVJBTV9CVUcgMQotLy8gIyAgZGVmaW5lIF9TVExQX05PX0VYUExJQ0lUX0ZVTkNUSU9OX1RNUExfQVJHUyAxCi0jZGVmaW5lIF9TVExQX05PX0VYQ0VQVElPTl9IRUFERVIgMQotCi0jdW5kZWYgIF9TVExQX0xJTktfVElNRV9JTlNUQU5USUFUSU9OCi0jZGVmaW5lIF9TVExQX0xJTktfVElNRV9JTlNUQU5USUFUSU9OIDEKLQotI2lmZGVmIF9fU1RETElCCi0jICB1bmRlZiBfU1RMUF9OT19ORVdfQ19IRUFERVJTCi0jICB1bmRlZiBfU1RMUF9OT19ORVdfTkVXX0hFQURFUgotIyAgdW5kZWYgX1NUTFBfTk9fQkFEX0FMTE9DCi0jICB1bmRlZiBfU1RMUF9MT05HX0xPTkcKLSNlbHNlCi0jICB1bmRlZiAgX1NUTFBfTk9fRVhDRVBUSU9OX1NQRUMKLSMgIGRlZmluZSBfU1RMUF9OT19FWENFUFRJT05fU1BFQyAxCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3N0bC9jb25maWcvX2FwcGxlLmggYi9zdGwvY29uZmlnL19hcHBsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzAzMGRiLi4wMDAwMDAwCi0tLSBhL3N0bC9jb25maWcvX2FwcGxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyogU1RMcG9ydCBjb25maWd1cmF0aW9uIGZpbGUKLSAqIEl0IGlzIGludGVybmFsIFNUTHBvcnQgaGVhZGVyIC0gRE8gTk9UIGluY2x1ZGUgaXQgZGlyZWN0bHkKLSAqLwotCi0vKiBjb21tb24gY29uZmlndXJhdGlvbiBzZXR0aW5ncyBmb3IgQXBwbGUgTVBXIE1yQ3BwIC8gU0NwcCAqLwotCi0jaWYgZGVmaW5lZCAoX19NUkNfXykKLSMgIGRlZmluZSBfU1RMUF9DT01QSUxFUiAiTVBXIE1yQ3BwIgotI2Vsc2UKLSMgIGRlZmluZSBfU1RMUF9DT01QSUxFUiAiTVBXIFNDcHAiCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19NUkNfXykgJiYgX19NUkNfXyA8IDB4NTAwCi0jIGVycm9yIEFwcGxlJ3MgTVBXIE1yQ3BwIHYuNS4wLjAgb3IgYmV0dGVyIGNvbXBpbGVyIHJlcXVpcmVkCi0jZW5kaWYKLSNpZiBkZWZpbmVkKF9fU0NfXykgJiYgX19TQ19fIDwgMHg4OTAKLSMgZXJyb3IgQXBwbGUncyBNUFcgU0NwcCB2LjguOS4wIG9yIGJldHRlciBjb21waWxlciByZXF1aXJlZAotI2VuZGlmCi0KLS8qIFRPRE86IENoZWNrIHRoYXQgdGhpcyBjb25maWcgaXMgbmVjZXNzYXJ5IGZvciBhbGwgY29tcGlsZXIgdmVyc2lvbnMuCi0gKiBJdCBpcyBoZXJlIGZvciBoaXN0b3JpY2FsIHJlYXNvbnMgZm9yIHRoZSBtb21lbnQuCi0gKi8KLSNkZWZpbmUgX1NUTFBfTk9fQ09OVEFJTkVSU19FWFRFTlNJT04KLQotI2lmZGVmIHFNYWNBcHAKLSMgaWZuZGVmIF9fQ09ORElUSU9OQUxNQUNST1NfXyAvKiBza2lwIGluY2x1ZGluZyBDb25kaXRpb25hbE1hY3Jvc19BQy5oIGlmIENvbmRpdGlvbmFsTWFjcm9zLmggaXMgYWxyZWFkeSBpbmNsdWRlZCAqLwotIyBpbmNsdWRlIDxDb3JlU3dpdGNoZXNfQUMuaD4KLSMgaW5jbHVkZSA8Q29uZGl0aW9uYWxNYWNyb3NfQUMuaD4KLSMgaW5jbHVkZSA8VHlwZXNfQUMuaD4KLSMgZGVmaW5lIF9TVExQX0ZJTEVfXyBfRklMRV9BQwotIyBkZWZpbmUgX1NUTFBfREVCVUdfTUVTU0FHRQotIyBkZWZpbmUgX19zdGxfZGVidWdfbWVzc2FnZSBQcm9ncmFtQnJlYWtfQUMKLSMgaW5jbHVkZSA8Q29uZGl0aW9uYWxNYWNyb3MuaD4KLSMgZW5kaWYKLSMgaW5jbHVkZSA8VHlwZXMuaD4KLSNlbHNlCi0jIGluY2x1ZGUgPENvbmRpdGlvbmFsTWFjcm9zLmg+Ci0jIGluY2x1ZGUgPFR5cGVzLmg+Ci0jZW5kaWYKLQotI2RlZmluZSBfU1RMUF9VSU5UMzJfVCBVSW50MzIKLXR5cGVkZWYgaW50IHdpbnRfdDsKLQotI2lmbmRlZiBUWVBFX0JPT0wKLSMgZXJyb3IgPENvbmRpdGlvbmFsTWFjcm9zLmg+IG11c3QgYmUgaW5jbHVkZWQuIChUWVBFX0JPT0wpCi0jZW5kaWYKLSNpZiAhVFlQRV9CT09MCi0jIGRlZmluZSBfU1RMUF9OT19CT09MCi0jIGRlZmluZSBfU1RMUF9ET05UX1VTRV9CT09MX1RZUEVERUYKLSNlbmRpZgotCi0jaWZuZGVmIFRZUEVfTE9OR0xPTkcKLSMgZXJyb3IgPENvbmRpdGlvbmFsTWFjcm9zLmg+IG11c3QgYmUgaW5jbHVkZWQuIChUWVBFX0xPTkdMT05HKQotI2VuZGlmCi0jaWYgVFlQRV9MT05HTE9ORwotIyBkZWZpbmUgX1NUTFBfTE9OR19MT05HIGxvbmcgbG9uZwotI2VuZGlmCi0KLSNpZiAhX19vcHRpb24oZXhjZXB0aW9ucykKLSMgZGVmaW5lIF9TVExQX0hBU19OT19FWENFUFRJT05TCi0jZW5kaWYKLQotI2RlZmluZSBfU1RMUF9ERUJVR19NRVNTQUdFX1BPU1QgRGVidWdTdHIoIlxwU1RMIGRpYWdub3NpcyBpc3N1ZWQuIFNlZSAnc3RkZXJyJyBmb3IgZGV0YWlsLiIpOwotI2RlZmluZSBfU1RMUF9BU1NFUlRfTVNHX1RSQUlMRVIgIiAiCi0KLSNpZmRlZiBfU1RMUF9ERUJVRwotIyAgIGRlZmluZSBfU1RMUF9USFJPVyh4KSAoRGVidWdTdHIoIlxwU1RMIGlzIGFib3V0IHRvIHRocm93IGV4Y2VwdGlvbjogIiN4KSx0aHJvdyB4KQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9fTVJDX18pCi0jIGlmbmRlZiBfX3NwaWxsYXJncwotIyAgZGVmaW5lIF9fc3BpbGxhcmdzIDEgLy8gTXJDcHAgcmVxdWlyZXMgdGhpcyBzeW1ib2wgdG8gYmUgZGVmaW5lZCBhcyAxIHRvIHByb3Blcmx5IGhhbmRsZSB2YV9zdGFydDsgcmVmLlsgZmlsZSBzdGRhcmcuaDsgbGluZSAyNiBdCi0jIGVuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19TQ19fKQotI2RlZmluZSBfU1RMUF9WRU5ET1JfTE9OR19ET1VCTEVfTUFUSCAgICAgICAgLy8qVFkgMTIvMDMvMjAwMCAtIFNDcHAncyBuYXRpdmUgbWF0aCB0eXBlIGlzIGxvbmcgZG91YmxlCi0jZW5kaWYKLQotI2lmbmRlZiBfU1RMUF9OQVRJVkVfSU5DTFVERV9QQVRICi0jIGlmIF9fb3B0aW9uKHVuaXhfaW5jbHVkZXMpCi0jICBkZWZpbmUgX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSCAuLi9DSW5jbHVkZXMgICAvLyBleHBlY3RzIHRoZSBhbGlhcyB0byB7Q0luY2x1ZGVzfSB1bmRlciB0aGUgc2FtZSBmb2xkZXIgYXMge1NUTH0KLSMgZWxzZQotIyAgZGVmaW5lIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEggOjpDSW5jbHVkZXMgICAvLyBleHBlY3RzIHRoZSBhbGlhcyB0byB7Q0luY2x1ZGVzfSB1bmRlciB0aGUgc2FtZSBmb2xkZXIgYXMge1NUTH0KLSMgZW5kaWYKLSNlbmRpZgotI2lmICFkZWZpbmVkKF9TVExQX01BS0VfSEVBREVSKQotIyBpZiAhX19vcHRpb24odW5peF9pbmNsdWRlcykKLSMgIGRlZmluZSBfU1RMUF9NQUtFX0hFQURFUihwYXRoLCBoZWFkZXIpIDxwYXRoOmhlYWRlcj4gLy8gTWFjIHVzZXMgIjoiIGZvciBkaXJlY3RvcnkgZGVsaW1pdGVyCi0jIGVuZGlmCi0jZW5kaWYKLQotIyBkZWZpbmUgX1NUTEQgX0RCRyAgLy8gdG8ga2VlcCB0aGUgbGVuZ3RoIG9mIGdlbmVyYXRlZCBzeW1ib2xzIHdpdGhpbiB0aGUgY29tcGlsZXIgbGltaXRhdGlvbgotCi0jZGVmaW5lIF9TVExQX1VTRV9TVERJT19JTyAxICAgICAgIC8vKlRZIDAyLzI0LzIwMDAgLSBzZWUgYWxzbyA7IHJlZi5bIGZpbGUgX2ZzdHJlYW0uaDsgbGluZSAzNiBdCi0jZGVmaW5lIF9TVExQX05PX1RIUkVBRFMgICAgICAgICAgIC8vKlRZIDEyLzE3LzIwMDAgLSBtdWx0aS10aHJlYWQgY2FwYWJpbGl0eSBub3QgZXhwbG9yZWQsIHlldC4KLSN1bmRlZiBfUkVFTlRSQU5UICAgICAgICAgICAgICAgICAgLy8qdHkgMTEvMjQvMjAwMSAtIHRvIG1ha2Ugc3VyZSBubyB0aHJlYWQgZmFjaWxpdHkgaXMgYWN0aXZhdGVkCi0jZGVmaW5lIF9OT1RIUkVBRFMgICAgICAgICAgICAgICAgIC8vKnR5IDEyLzA3LzIwMDEgLQotCi0vLyBuYXRpdmUgbGlicmFyeSBsaW1pdGF0aW9ucwotI2RlZmluZSBfU1RMUF9WRU5ET1JfR0xPQkFMX1NURCAgICAgICAgICAvLyBtcHcncyBjKysgbGlicyBkbyBub3QgdXRpbGl6ZSBuYW1lc3BhY2Ugc3RkIHlldAotI2RlZmluZSBfU1RMUF9OT19CQURfQUxMT0MgICAgICAgICAgICAgICAvLyBrbm93biBsaW1pdGF0aW9uCi0jZGVmaW5lIF9TVExQX0hBU19OT19ORVdfQ19IRUFERVJTICAgICAgIC8vIGtub3duIGxpbWl0YXRpb24KLSNkZWZpbmUgX1NUTFBfTk9fTkVXX05FV19IRUFERVIgICAgICAgICAgLy8ga25vd24gbGltaXRhdGlvbgotI2RlZmluZSBfU1RMUF9OT19OQVRJVkVfTUJTVEFURV9UICAgICAgICAvLyBrbm93biBsaW1pdGF0aW9uCi0jZGVmaW5lIF9TVExQX05PX05BVElWRV9XSURFX0ZVTkNUSU9OUyAgIC8vIGtub3duIGxpbWl0YXRpb24KLSNkZWZpbmUgX1NUTFBfTk9fTkFUSVZFX1dJREVfU1RSRUFNUyAgICAgLy8ga25vd24gbGltaXRhdGlvbgotI2RlZmluZSBfU1RMUF9OT19VTkNBVUdIVF9FWENFUFRfU1VQUE9SVCAvLyBrbm93biBsaW1pdGF0aW9uCi0jZGVmaW5lIF9TVExQX0JST0tFTl9FWENFUFRJT05fQ0xBU1MgICAgIC8vIGtub3duIGxpbWl0YXRpb24KLQotLy8gY29tcGlsZXIgbGltaXRhdGlvbnMKLSMgZGVmaW5lIF9TVExQX0RPTlRfU0lNVUxBVEVfUEFSVElBTF9TUEVDX0ZPUl9UWVBFX1RSQUlUUwotCi0jIGRlZmluZSBfU1RMUF9NUFdGSVhfVFJZIHRyeXsgICAgICAgICAgICAgICAgICAgICAgLy8qVFkgMDYvMDEvMjAwMCAtIGV4Y2VwdGlvbiBoYW5kbGluZyBidWcgd29ya2Fyb3VuZAotIyBkZWZpbmUgX1NUTFBfTVBXRklYX0NBVENIIH1jYXRjaCguLi4pe3Rocm93O30gICAgICAgICAgICAgIC8vKlRZIDA2LzAxLzIwMDAgLSBleGNlcHRpb24gaGFuZGxpbmcgYnVnIHdvcmthcm91bmQKLSMgZGVmaW5lIF9TVExQX01QV0ZJWF9DQVRDSF9BQ1RJT04oYWN0aW9uKSB9Y2F0Y2goLi4uKXthY3Rpb247dGhyb3c7fSAgLy8qVFkgMDYvMDEvMjAwMCAtIGV4Y2VwdGlvbiBoYW5kbGluZyBidWcgd29ya2Fyb3VuZAotIyBkZWZpbmUgX1NUTFBfVEhST1dfUkVUVVJOX0JVRyAgICAgICAgICAgIC8vIGtub3duIGxpbWl0YXRpb24KLSMgZGVmaW5lIF9TVExQX05PX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04gICAgLy8ga25vd24gbGltaXRhdGlvbgotIyBkZWZpbmUgX1NUTFBfTk9fUEFSVElBTF9TUEVDSUFMSVpBVElPTl9TWU5UQVggICAgLy8ga25vd24gbGltaXRhdGlvbgotIyBkZWZpbmUgX1NUTFBfTk9fRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSICAgIC8vIGtub3duIGxpbWl0YXRpb24KLSMgZGVmaW5lIF9TVExQX05PX1JFTE9QU19OQU1FU1BBQ0UgICAgICAgICAgLy8ga25vd24gbGltaXRhdGlvbgotLy8gZW5kIG9mIHN0bF9hcHBsZS5oCmRpZmYgLS1naXQgYS9zdGwvY29uZmlnL19hczQwMC5oIGIvc3RsL2NvbmZpZy9fYXM0MDAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAyNjFhNC4uMDAwMDAwMAotLS0gYS9zdGwvY29uZmlnL19hczQwMC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLy8gU1RMcG9ydCBjb25maWd1cmF0aW9uIGZpbGUKLS8vIEl0IGlzIGludGVybmFsIFNUTHBvcnQgaGVhZGVyIC0gRE8gTk9UIGluY2x1ZGUgaXQgZGlyZWN0bHkKLQotLy8gQVMvNDAwIEMrKyBjb25maWcKLQotIyBpZmRlZiBfUkVFTlRSQU5UCi0jICBkZWZpbmUgX1BUSFJFQURTCi0jIGVuZGlmCi0KLSMgIGRlZmluZSBfU1RMUF9OT19ORVdfTkVXX0hFQURFUiAxCi0KLSMgIGRlZmluZSBfU1RMUF9OT19CT09MCi0jICBkZWZpbmUgX1NUTFBfTElNSVRFRF9ERUZBVUxUX1RFTVBMQVRFUwotCi0jICBkZWZpbmUgX1NUTFBfSEFTX05PX05BTUVTUEFDRVMKLSMgIGRlZmluZSBfU1RMUF9ORUVEX1RZUEVOQU1FCi0jICBkZWZpbmUgX1NUTFBfTkVFRF9FWFBMSUNJVAotIyAgZGVmaW5lIF9TVExQX0hBU19OT19FWENFUFRJT05TCi0jICBkZWZpbmUgX1NUTFBfTk9fRVhDRVBUSU9OX1NQRUMKLSMgIGRlZmluZSBfU1RMUF9OT19BUlJPV19PUEVSQVRPUgotIyAgZGVmaW5lIF9TVExQX05PX05FV19TVFlMRV9DQVNUUwotCi0jICBkZWZpbmUgX1NUTFBfTkVFRF9NVVRBQkxFCi0jICBkZWZpbmUgX1NUTFBfTk9fUEFSVElBTF9TUEVDSUFMSVpBVElPTl9TWU5UQVgKLSMgIGRlZmluZSBfU1RMUF9OT19CQURfQUxMT0MKLSMgIGRlZmluZSBfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVTCi0jICBkZWZpbmUgX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFX0NMQVNTRVMKLSMgIGRlZmluZSBfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVfS0VZV09SRAotIyAgZGVmaW5lIF9TVExQX05PX0ZSSUVORF9URU1QTEFURVMKLSMgIGRlZmluZSBfU1RMUF9OT19RVUFMSUZJRURfRlJJRU5EUwotIyAgZGVmaW5lIF9TVExQX05PX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04KLSMgIGRlZmluZSBfU1RMUF9OT19GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIKLQotIyAgZGVmaW5lIF9TVExQX05PX01FVEhPRF9TUEVDSUFMSVpBVElPTgotIyAgZGVmaW5lIF9TVExQX05PX0VYUExJQ0lUX0ZVTkNUSU9OX1RNUExfQVJHUwotCi0vLyAjICBkZWZpbmUgX1NUTFBfTk9fRVhDRVBUSU9OX0hFQURFUgotCi0jICBkZWZpbmUgX1NUTFBfSEFTX05PX05FV19DX0hFQURFUlMKLQotIyAgZGVmaW5lIF9TVExQX1NUQVRJQ19DT05TVF9JTklUX0JVRwotIyAgZGVmaW5lIF9TVExQX1RIUk9XX1JFVFVSTl9CVUcKLSMgIGRlZmluZSBfU1RMUF9MSU5LX1RJTUVfSU5TVEFOVElBVElPTgotIyAgZGVmaW5lIF9TVExQX05PX1RFTVBMQVRFX0NPTlZFUlNJT05TCi0KLSMgIGRlZmluZSBfU1RMUF9OT05fVFlQRV9UTVBMX1BBUkFNX0JVRyAxCi0jICBkZWZpbmUgX1NUTFBfVFJJVklBTF9ERVNUUlVDVE9SX0JVRyAgMQotCi0jICBpZiBkZWZpbmVkKF9MT05HX0xPTkcpCi0jICAgIGRlZmluZSBfU1RMUF9MT05HX0xPTkcgbG9uZyBsb25nCi0jICBlbmRpZgotIyAgaWYgZGVmaW5lZChfUFRIUkVBRFMpCi0jICAgIGRlZmluZSBfTVVMVElfVEhSRUFERUQKLSMgIGVuZGlmCi0vLyBmYnAgOiB0byBmaXggX19wYXJ0aXRpb24oKSBwcm9ibGVtCi0jIGRlZmluZSBfU1RMUF9OT05URU1QTF9CQVNFX01BVENIX0JVRyAxCmRpZmYgLS1naXQgYS9zdGwvY29uZmlnL19hdXRvX2xpbmsuaCBiL3N0bC9jb25maWcvX2F1dG9fbGluay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmI1MjMyLi4wMDAwMDAwCi0tLSBhL3N0bC9jb25maWcvX2F1dG9fbGluay5oCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyogV2UgZG8gbm90IHVzZSBhdXRvIGxpbmsgZmVhdHVyZSB3aGVuOgotICogIC0gdXNlciBhc2tlZCBub3QgdG8gdXNlIGl0IChfU1RMUF9ET05UX1VTRV9BVVRPX0xJTkspCi0gKiAgLSBTVExwb3J0IGlzIHVzZWQgb25seSBhcyBhIFNUTCBsaWJyYXJ5IChfU1RMUF9OT19JT1NUUkVBTVMgfHwgX1NUTFBfVVNFX05PX0lPU1RSRUFNUykKLSAqICAtIHdlIGFyZSBidWlsZGluZyBhIEMgdHJhbnNsYXRpb24gdW5pdCwgU1RMcG9ydCBpcyBhIEMrKyBTdGFuZGFyZCBsaWJyYXJ5IGltcGxlbWVudGF0aW9uCi0gKi8KLSNpZiAhZGVmaW5lZCAoX19CVUlMRElOR19TVExQT1JUKSAmJiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9VU0VfQVVUT19MSU5LKSAmJiBcCi0gICAgIWRlZmluZWQgKF9TVExQX05PX0lPU1RSRUFNUykgJiYgIWRlZmluZWQgKF9TVExQX1VTRV9OT19JT1NUUkVBTVMpICYmIFwKLSAgICBkZWZpbmVkIChfX2NwbHVzcGx1cykKLQotIyAgZGVmaW5lIF9TVExQX1NUUklOR0laRShYKSBfU1RMUF9TVFJJTkdJWkVfQVVYKFgpCi0jICBkZWZpbmUgX1NUTFBfU1RSSU5HSVpFX0FVWChYKSAjWAotCi0jICBpZiBkZWZpbmVkIChfU1RMUF9ERUJVRykKLSMgICAgZGVmaW5lIF9TVExQX0xJQl9PUFRJTV9NT0RFICJzdGxkIgotIyAgZWxpZiBkZWZpbmVkIChfREVCVUcpCi0jICAgIGRlZmluZSBfU1RMUF9MSUJfT1BUSU1fTU9ERSAiZCIKLSMgIGVsc2UKLSMgICAgZGVmaW5lIF9TVExQX0xJQl9PUFRJTV9NT0RFICIiCi0jICBlbmRpZgotCi0jICBpZiBkZWZpbmVkIChfU1RMUF9MSUJfTkFNRV9NT1RJRikKLSMgICAgZGVmaW5lIF9TVExQX0xJQl9NT1RJRiAiXyJfU1RMUF9MSUJfTkFNRV9NT1RJRgotIyAgZWxzZQotIyAgICBkZWZpbmUgX1NUTFBfTElCX01PVElGICIiCi0jICBlbmRpZgotCi0jICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfRFlOQU1JQ19MSUIpCi0jICAgIGlmIGRlZmluZWQgKF9TVExQX1VTSU5HX0NST1NTX05BVElWRV9SVU5USU1FX0xJQikKLSMgICAgICBkZWZpbmUgX1NUTFBfTElCX1RZUEUgIl94IgotIyAgICBlbHNlCi0jICAgICAgZGVmaW5lIF9TVExQX0xJQl9UWVBFICIiCi0jICAgIGVuZGlmCi0jICBlbHNlCi0jICAgIGlmIGRlZmluZWQgKF9TVExQX1VTSU5HX0NST1NTX05BVElWRV9SVU5USU1FX0xJQikKLSMgICAgICBkZWZpbmUgX1NUTFBfTElCX1RZUEUgIl9zdGF0aXgiCi0jICAgIGVsc2UKLSMgICAgICBkZWZpbmUgX1NUTFBfTElCX1RZUEUgIl9zdGF0aWMiCi0jICAgIGVuZGlmCi0jICBlbmRpZgotCi0jICBkZWZpbmUgX1NUTFBfVkVSU0lPTl9TVFIgX1NUTFBfU1RSSU5HSVpFKF9TVExQT1JUX01BSk9SKSIuIl9TVExQX1NUUklOR0laRShfU1RMUE9SVF9NSU5PUikKLQotIyAgZGVmaW5lIF9TVExQX1NUTFBPUlRfTElCICJzdGxwb3J0Il9TVExQX0xJQl9PUFRJTV9NT0RFIiJfU1RMUF9MSUJfVFlQRSIiX1NUTFBfTElCX01PVElGIi4iX1NUTFBfVkVSU0lPTl9TVFIiLmxpYiIKLQotIyAgaWYgZGVmaW5lZCAoX1NUTFBfVkVSQk9TRV9BVVRPX0xJTkspCi0jICAgIHByYWdtYSBtZXNzYWdlICgiU1RMcG9ydDogQXV0byBsaW5raW5nIHRvICJfU1RMUF9TVExQT1JUX0xJQikKLSMgIGVuZGlmCi0jICBwcmFnbWEgY29tbWVudCAobGliLCBfU1RMUF9TVExQT1JUX0xJQikKLQotIyAgdW5kZWYgX1NUTFBfU1RMUE9SVF9MSUIKLSMgIHVuZGVmIF9TVExQX0xJQl9PUFRJTV9NT0RFCi0jICB1bmRlZiBfU1RMUF9MSUJfVFlQRQotIyAgdW5kZWYgX1NUTFBfU1RSSU5HSVpFX0FVWAotIyAgdW5kZWYgX1NUTFBfU1RSSU5HSVpFCi0KLSNlbmRpZiAvKiBfU1RMUF9ET05UX1VTRV9BVVRPX0xJTksgKi8KLQpkaWZmIC0tZ2l0IGEvc3RsL2NvbmZpZy9fYmMuaCBiL3N0bC9jb25maWcvX2JjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NmRlMDcuLjAwMDAwMDAKLS0tIGEvc3RsL2NvbmZpZy9fYmMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vLyBTVExwb3J0IGNvbmZpZ3VyYXRpb24gZmlsZQotLy8gSXQgaXMgaW50ZXJuYWwgU1RMcG9ydCBoZWFkZXIgLSBETyBOT1QgaW5jbHVkZSBpdCBkaXJlY3RseQotCi0vLyNkZWZpbmUgX1NUTFBfVkVSQk9TRQotCi0jZGVmaW5lIF9TVExQX0NPTVBJTEVSICJCb3JsYW5kIgotCi0jaWYgKF9fQk9STEFORENfXyA8IDB4NTUxKQotIyAgZXJyb3IgLSBCb3JsYW5kIGNvbXBpbGVycyBiZWxvdyB2ZXJzaW9uIDUuNS4xIG5vdCBzdXBwb3J0ZWQuCi0jZW5kaWYKLQotI2lmIChfX0JPUkxBTkRDX18gPj0gMHg1ODApICYmIChfX0JPUkxBTkRDX18gPCAweDU5MCkKLSMgIGRlZmluZSBfU1RMUF9OT19ORVdfQ19IRUFERVJTCi0jICBkZWZpbmUgX1NUTFBfTkFUSVZFX0NQUF9SVU5USU1FX0hFQURFUihoZWFkZXIpIDwuLi9pbmNsdWRlL2Rpbmt1bXdhcmUvIyNoZWFkZXI+Ci0jICBkZWZpbmUgX1NUTFBfTk9fRk9SQ0VfSU5TVEFOVElBVEUKLSNlbmRpZgotCi0jaWYgKF9fQk9STEFORENfXyA+PSAweDU2MCkgJiYgKF9fQk9STEFORENfXyA8IDB4NTcwKQotIyAgZGVmaW5lIF9VU0VfT0xEX1JXX1NUTAotI2VuZGlmCi0KLSNpZiAoX19CT1JMQU5EQ19fID49IDB4NTYwKQotIyAgZGVmaW5lIE5PV0lOQkFTRUlOVEVSTE9DSyAgLy8gc3JjL2ZzdHJlYW0uY3BwIGVycm9yIGluIHdpbmJhc2UuaAotI2VuZGlmCi0KLSNpZiAoX19CT1JMQU5EQ19fIDwgMHg1NjQpCi0jICBkZWZpbmUgX1NUTFBfUVVBTElGSUVEX1NQRUNJQUxJWkFUSU9OX0JVRwotI2VuZGlmCi0KLSNpZiAoX19CT1JMQU5EQ19fIDwgMHg1NjApCi0jICBkZWZpbmUgX1NUTFBfTk9fQ09OVEFJTkVSU19FWFRFTlNJT04KLSNlbmRpZgotCi0jZGVmaW5lIF9TVExQX05PX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUgotI2RlZmluZSBfU1RMUF9ET05UX1VTRV9QUklWX05BTUVTUEFDRQotI2RlZmluZSBfU1RMUF9OT19WRU5ET1JfU1RETElCX0wKLSNkZWZpbmUgX1NUTFBfTk9fVkVORE9SX01BVEhfRgotI2RlZmluZSBfU1RMUF9ET05UX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0gMQotI2RlZmluZSBfU1RMUF9OT19OQVRJVkVfTUJTVEFURV9UCi0jZGVmaW5lIF9TVExQX0RMTEVYUE9SVF9ORUVEU19QUkVERUNMQVJBVElPTgotI3VuZGVmIF9TVExQX05PX1VORVhQRUNURURfRVhDRVBUX1NVUFBPUlQKLSNpZiAoX19CT1JMQU5EQ19fIDwgMHg1ODApICYmICFkZWZpbmVkIChfUlRMRExMKQotIyAgZGVmaW5lIF9VTkNBVUdIVF9FWENFUFRJT04gMQotI2VuZGlmCi0KLS8vIDxsaW1pdHM+IHByb2JsZW0KLSNkZWZpbmUgX1NUTFBfU1RBVElDX0NPTlNUX0lOSVRfQlVHCi0KLS8vIDxiaXRzZXQ+IHByb2JsZW1zCi0jZGVmaW5lIF9TVExQX01FTUJFUl9TUEVDSUFMSVpBVElPTl9CVUcgMQotI2RlZmluZSBfU1RMUF9IQVNfU1BFQ0lGSUNfUFJPTE9HX0VQSUxPRyAxCi0KLSNkZWZpbmUgX1NUTFBfTE9OR19MT05HICBfX2ludDY0Ci0KLS8vIGF1dG8gZW5hYmxlIHRocmVhZCBzYWZldHkgYW5kIGV4Y2VwdGlvbnM6Ci0jaWZuZGVmIF9DUFBVTldJTkQKLSMgIGRlZmluZSBfU1RMUF9IQVNfTk9fRVhDRVBUSU9OUwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfX01UX18pICYmICFkZWZpbmVkIChfTk9USFJFQURTKSAmJiAhZGVmaW5lZCAoX1JFRU5UUkFOVCkKLSMgIGlmIGRlZmluZWQgKF9TVExQX1ZFUkJPU0UpCi0jICAgIHByYWdtYSBtZXNzYWdlICgibXVsdGkgdGhyZWFkZWQiKQotIyAgZW5kaWYKLSMgIGRlZmluZSBfUkVFTlRSQU5UIDEKLSNlbHNlCi0jICBpZiBkZWZpbmVkIChfU1RMUF9WRVJCT1NFKQotIyAgICBwcmFnbWEgbWVzc2FnZSAoInNpbmdsZSB0aHJlYWRlZCIpCi0jICBlbmRpZgotI2VuZGlmCi0KLSNkZWZpbmUgX1NUTFBfRVhQT1JUX0RFQ0xTUEVDIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQotI2RlZmluZSBfU1RMUF9JTVBPUlRfREVDTFNQRUMgX19kZWNsc3BlYyhkbGxpbXBvcnQpCi0KLSNkZWZpbmUgX1NUTFBfQ0xBU1NfRVhQT1JUX0RFQ0xTUEVDIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQotI2RlZmluZSBfU1RMUF9DTEFTU19JTVBPUlRfREVDTFNQRUMgX19kZWNsc3BlYyhkbGxpbXBvcnQpCi0KLSNpZiBkZWZpbmVkIChfRExMKQotIyAgZGVmaW5lIF9TVExQX0RMTAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoX1JUTERMTCkKLSMgIGRlZmluZSBfU1RMUF9SVU5USU1FX0RMTAotI2VuZGlmCi0jaW5jbHVkZSA8c3RsL2NvbmZpZy9fZGV0ZWN0X2RsbF9vcl9saWIuaD4KLSN1bmRlZiBfU1RMUF9SVU5USU1FX0RMTAotI3VuZGVmIF9TVExQX0RMTAotCi0jaWYgZGVmaW5lZCAoX1NUTFBfVVNFX0RZTkFNSUNfTElCKQotIyAgaWYgZGVmaW5lZCAoX1NUTFBfVkVSQk9TRSkKLSMgICAgcHJhZ21hIG1lc3NhZ2UgKCJVc2luZy9CdWlsZGluZyBTVExwb3J0IGRsbCIpCi0jICBlbmRpZgotI2VsaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1NUQVRJQ19MSUIpCi0jICBpZiBkZWZpbmVkIChfU1RMUF9WRVJCT1NFKQotIyAgICBwcmFnbWEgbWVzc2FnZSAoIlVzaW5nL0J1aWxkaW5nIFNUTHBvcnQgbGliIikKLSMgIGVuZGlmCi0jZWxzZQotIyAgZXJyb3IgVW5rbm93biBTVExwb3J0IHVzYWdlIGNvbmZpZyAoZGxsL2xpYj8pCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9TVExQX1VTSU5HX0NST1NTX05BVElWRV9SVU5USU1FX0xJQikKLSMgIGlmIGRlZmluZWQgKF9TVExQX1ZFUkJPU0UpCi0jICAgIHByYWdtYSBtZXNzYWdlICgiVXNpbmcgY3Jvc3MgdmVyc2lvbiBvZiBuYXRpdmUgcnVudGltZSIpCi0jICBlbmRpZgotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfSU1QT1JUX1RFTVBMQVRFX0tFWVdPUkQpCi0vLyMgIGRlZmluZSBfU1RMUF9JTVBPUlRfVEVNUExBVEVfS0VZV09SRCBfX2RlY2xzcGVjKGRsbGltcG9ydCkKLSNlbmRpZgotLy8jZGVmaW5lIF9TVExQX0VYUE9SVF9URU1QTEFURV9LRVlXT1JEIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfVVNFX0RZTkFNSUNfTElCKQotIyAgZGVmaW5lIF9TVExQX1VTRV9ERUNMU1BFQyAxCi0jICBpZiAoX19CT1JMQU5EQ19fIDwgMHg1ODApCi0jICBpZiBkZWZpbmVkIChfX0JVSUxESU5HX1NUTFBPUlQpCi0jICAgIGRlZmluZSBfU1RMUF9DQUxMIF9fY2RlY2wgX19leHBvcnQKLSMgIGVsc2UKLSMgICAgZGVmaW5lICBfU1RMUF9DQUxMIF9fY2RlY2wgX19pbXBvcnQKLSMgIGVuZGlmCi0jZWxzZQotIyAgZGVmaW5lICBfU1RMUF9DQUxMIF9fY2RlY2wKLSNlbmRpZgotI2Vsc2UKLSMgIGRlZmluZSAgX1NUTFBfQ0FMTCBfX2NkZWNsCi0jZW5kaWYKLQotI2luY2x1ZGUgPHN0bC9jb25maWcvX2F1dG9fbGluay5oPgpkaWZmIC0tZ2l0IGEvc3RsL2NvbmZpZy9fY3JheS5oIGIvc3RsL2NvbmZpZy9fY3JheS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmFiZDRmLi4wMDAwMDAwCi0tLSBhL3N0bC9jb25maWcvX2NyYXkuaAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTcKLSAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0jZGVmaW5lIF9TVExQX0NPTVBJTEVSICJDQyIKLQotLy8gTW9zdGx5IGNvcnJlY3QgZ3Vlc3MsIGNoYW5nZSBpdCBmb3IgQWxwaGEgKGFuZCBvdGhlciBlbnZpcm9ubWVudHMKLS8vIHRoYXQgaGFzIDY0LWJpdCAibG9uZyIpCi0jICBkZWZpbmUgX1NUTFBfVUlOVDMyX1QgdW5zaWduZWQgbG9uZwotCi0vLyBVbmNvbW1lbnQgaWYgbG9uZyBsb25nIGlzIGF2YWlsYWJsZQotIyAgZGVmaW5lIF9TVExQX0xPTkdfTE9ORyBsb25nIGxvbmcKLQotLy8gVW5jb21tZW50IHRoaXMgaWYgeW91ciBjb21waWxlciBjYW4ndCBpbmxpbmUgd2hpbGUoKSwgZm9yKCkKLSMgIGRlZmluZSBfU1RMUF9MT09QX0lOTElORV9QUk9CTEVNUyAxCi0KLS8vIFVuY29tbWVudCB0aGlzIGlmIHlvdXIgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCBleGNlcHRpb25zCi0vLyBDcmF5IEMrKyBzdXBwb3J0cyBleGNlcHRpb25zIHdoZW4gJy1oIGV4Y2VwdGlvbnMnIG9wdGlvbiBpcyB1c2VyOwotLy8gdGhlcmVmb3JlICctRF9TVExQX0hBU19OT19FWENFUFRJT05TJyBtdXN0IGJlIHVzZWQgd2hlbiAnLWggZXhjZXB0aW9ucycKLS8vIGlzIE5PVCB1c2VkLgotLy8jICBkZWZpbmUgX1NUTFBfSEFTX05PX0VYQ0VQVElPTlMgMQotCi0vLyBEZWxldGU/Ci0vLyBEZWZpbmUgdGhpcyBpZiBjb21waWxlciBsYWNrcyA8ZXhjZXB0aW9uPiBoZWFkZXIKLS8vIyAgZGVmaW5lIF9TVExQX05PX0VYQ0VQVElPTl9IRUFERVIgMQotCi0vLyBVbmNvbW1lbnQgdGhpcyBpZiB5b3VyIEMgbGlicmFyeSBoYXMgbHJhbmQ0OCgpIGZ1bmN0aW9uCi0jICBkZWZpbmUgX1NUTFBfUkFORDQ4IDEKLQotLy8gVW5jb21tZW50IGlmIG5hdGl2ZSBuZXctc3R5bGUgQyBsaWJyYXJ5IGhlYWRlcnMgbGlsZSA8Y3N0ZGRlZj4sIGV0YyBhcmUgbm90IGF2YWlsYWJsZS4KLSMgICBkZWZpbmUgX1NUTFBfSEFTX05PX05FV19DX0hFQURFUlMgMQotCi0vLyB1bmNvbW1lbnQgaWYgbmV3LXN0eWxlIGhlYWRlcnMgPG5ldz4gaXMgYXZhaWxhYmxlCi0jICAgZGVmaW5lIF9TVExQX05PX05FV19ORVdfSEVBREVSIDEKLQotLy8gdW5jb21tZW50IHRoaXMgaWYgPGlvc3RyZWFtPiBhbmQgb3RoZXIgU1REIGhlYWRlcnMgcHV0IHRoZWlyIHN0dWZmIGluIDo6bmFtZXNwYWNlLAotLy8gbm90IHN0ZDo6Ci0jICBkZWZpbmUgX1NUTFBfVkVORE9SX0dMT0JBTF9TVEQKLQotLy8gdW5jb21tZW50IHRoaXMgaWYgPGNzdGRpbz4gYW5kIHRoZSBsaWtlIHB1dCBzdHVmZiBpbiA6Om5hbWVzcGFjZSwKLS8vIG5vdCBzdGQ6OgotIyAgZGVmaW5lIF9TVExQX1ZFTkRPUl9HTE9CQUxfQ1NURAotCi0jIGRlZmluZSBfU1RMUF9OQVRJVkVfQ19IRUFERVIoX194KSA8L3Vzci9pbmNsdWRlLyMjX194PgotLy8gV0FSTklORzogRm9sbG93aW5nIGlzIGhhcmRjb2RlZCB0byB0aGUgc3lzdGVtIGRlZmF1bHQgQysrIGluY2x1ZGUgZmlsZXMKLSMgZGVmaW5lIF9TVExQX05BVElWRV9DUFBfUlVOVElNRV9IRUFERVIoX194KSA8L29wdC9jdGwvQ0MvQ0MvaW5jbHVkZS8jI19feD4KLQotCi0jIGRlZmluZSBfU1RMUF9OT19OQVRJVkVfTUJTVEFURV9UCi0jIGRlZmluZSBfU1RMUF9OT19VU0lOR19GT1JfR0xPQkFMX0ZVTkNUSU9OUwotLy8jIGRlZmluZSBfU1RMUF9WRU5ET1JfR0xPQkFMX0VYQ0VQVF9TVEQKLQotI2lmICFkZWZpbmVkIChfQ1JBWUlFRUUpCi0jICBkZWZpbmUgX1NUTFBfTk9fSUVDNTU5X1NVUFBPUlQgMQotI2VuZGlmCmRpZmYgLS1naXQgYS9zdGwvY29uZmlnL19jeWd3aW4uaCBiL3N0bC9jb25maWcvX2N5Z3dpbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTYwZDAxLi4wMDAwMDAwCi0tLSBhL3N0bC9jb25maWcvX2N5Z3dpbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jZGVmaW5lIF9TVExQX1BMQVRGT1JNICJDeWd3aW4iCi0KLS8qIEdsaWJjIGlzIHRoZSBwbGF0Zm9ybSBBUEkgKi8KLSNpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX0dMSUJDKQotIyAgZGVmaW5lIF9TVExQX1VTRV9HTElCQwotI2VuZGlmCmRpZmYgLS1naXQgYS9zdGwvY29uZmlnL19kZWMuaCBiL3N0bC9jb25maWcvX2RlYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjczMmQ5Li4wMDAwMDAwCi0tLSBhL3N0bC9jb25maWcvX2RlYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLSNkZWZpbmUgX1NUTFBfQ09NUElMRVIgIkRlYyIKLQotIyBkZWZpbmUgX1NUTFBfSEFTX1NQRUNJRklDX1BST0xPR19FUElMT0cKLQotIyBkZWZpbmUgX1NUTFBfTkFUSVZFX0hFQURFUihoZWFkZXIpIDwuLi9jeHgvIyNoZWFkZXI+Ci0jIGRlZmluZSBfU1RMUF9OQVRJVkVfQ19IRUFERVIoeCkgPC4uL2luY2x1ZGUvIyN4PgotCi0jaWYgKF9fREVDQ1hYX1ZFUiA8IDYwMzAwMDAwKQotIyBkZWZpbmUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUihoZWFkZXIpIDwuLi9jeHgvIyNoZWFkZXI+Ci0jZWxzZQotIyBkZWZpbmUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUihoZWFkZXIpIDwvdXNyL2luY2x1ZGUvY3h4X2NuYW1lLyMjaGVhZGVyPgotI2VuZGlmCi0KLSMgZGVmaW5lIF9TVExQX05BVElWRV9PTERfU1RSRUFNU19IRUFERVIoaGVhZGVyKSA8Li4vY3h4LyMjaGVhZGVyPgotIyBkZWZpbmUgX1NUTFBfTkFUSVZFX0NQUF9SVU5USU1FX0hFQURFUihoZWFkZXIpIDwuLi9jeHgvIyNoZWFkZXI+Ci0KLS8vIEFscGhhIGlzIGxpdHRsZS1lbmRpYW4KLSMgZGVmaW5lIF9TVExQX0xJVFRMRV9FTkRJQU4KLQotLy8gY29sbGlzaW9ucwotIyBkZWZpbmUgX1NUTFBfRE9OVF9QVVRfU1RMUE9SVF9JTl9TVEQKLQotI2lmIChfX0RFQ0NYWF9WRVIgPCA2MDAwMDAwMCkKLQotLy8gYXV0b21hdGljIHRlbXBsYXRlIGluc3RhbnRpYXRpb24gZG9lcyBub3QKLS8vIHdvcmsgd2l0aCBuYW1lc3BhY2VzIDsoCi0jIGRlZmluZSBfU1RMUF9IQVNfTk9fTkFNRVNQQUNFUyAxCi0KLSMgZGVmaW5lIF9TVExQX05PX05FV19ORVdfSEVBREVSIDEKLQotIyBkZWZpbmUgX1NUTFBfTk9fV0NIQVJfVCAgMQotIyBkZWZpbmUgX1NUTFBfTkVFRF9FWFBMSUNJVCAgMQotCi0jIGRlZmluZSBfU1RMUF9OT19CT09MICAxCi0jIGRlZmluZSBfU1RMUF9ORUVEX1RZUEVOQU1FIDEKLSMgZGVmaW5lIF9TVExQX05PX05FV19TVFlMRV9DQVNUUyAxCi0jIGRlZmluZSBfU1RMUF9ORUVEX01VVEFCTEUgMQotIyBkZWZpbmUgX1NUTFBfTk9fQkFEX0FMTE9DIDEKLQotCi0jIGRlZmluZSBfU1RMUF9OT19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OX1NZTlRBWCAxCi0KLSMgZGVmaW5lIF9TVExQX05PX01FTUJFUl9URU1QTEFURVMgMQotIyBkZWZpbmUgX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFX0NMQVNTRVMgMQotIyBkZWZpbmUgX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFX0tFWVdPUkQgMQotIyBkZWZpbmUgX1NUTFBfTk9fRlJJRU5EX1RFTVBMQVRFUyAxCi0jIGRlZmluZSBfU1RMUF9OT19RVUFMSUZJRURfRlJJRU5EUyAxCi0jIGRlZmluZSBfU1RMUF9OT19DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OIDEKLSMgZGVmaW5lIF9TVExQX05PX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUiAxCi0jIGRlZmluZSBfU1RMUF9OT05fVFlQRV9UTVBMX1BBUkFNX0JVRyAxCi0jIGRlZmluZSBfU1RMUF9CUk9LRU5fVVNJTkdfRElSRUNUSVZFIDEKLSMgZGVmaW5lIF9TVExQX05PX0VYQ0VQVElPTl9IRUFERVIgMQotIyBkZWZpbmUgX1NUTFBfREVGX0NPTlNUX1BMQ1RfTkVXX0JVRyAxCi0jIGRlZmluZSBfU1RMUF9ERUZfQ09OU1RfREVGX1BBUkFNX0JVRyAxCi0KLSNlbmRpZgotCi0KLSNpZmRlZiBfX05PX1VTRV9TVERfSU9TVFJFQU0KLSMgIGRlZmluZSBfU1RMUF9IQVNfTk9fTkVXX0lPU1RSRUFNUyAxCi0jIGVsc2UKLS8vIGRlZmF1bHQgaXMgdG8gdXNlIG5ldyBpb3N0cmVhbXMsIGFueXdheQotIyBpZm5kZWYgX19VU0VfU1REX0lPU1RSRUFNCi0jICBkZWZpbmUgX19VU0VfU1REX0lPU1RSRUFNCi0jIGVuZGlmCi0jZW5kaWYKLQotLy8jIGlmbmRlZiBfX1NURF9TVFJJQ1RfQU5TSV9FUlJPUlMKLS8vIyBlbmRpZgotCi0jaWZuZGVmIF9fRVhDRVBUSU9OUwotIyBkZWZpbmUgX1NUTFBfSEFTX05PX0VYQ0VQVElPTlMgMQotI2VuZGlmCi0KLSMgaWZkZWYgX19JTVBMSUNJVF9JTkNMVURFX0VOQUJMRUQKLQotLy8gYnV0LCB3b3JrcyB3aXRoIG91cnMgOykuCi0jICBkZWZpbmUgX1NUTFBfTElOS19USU1FX0lOU1RBTlRJQVRJT04gMQotIyBlbHNlCi0jICB1bmRlZiBfU1RMUF9MSU5LX1RJTUVfSU5TVEFOVElBVElPTgotIyBlbmRpZgotCi0jIGlmIGRlZmluZWQgKF9fSU1QTElDSVRfVVNJTkdfU1REKSAmJiAhZGVmaW5lZCAoX19OT19VU0VfU1REX0lPU1RSRUFNKQotLy8gd2Ugc2hvdWxkIGJhbiB0aGF0ICEKLS8vICMgIGVycm9yICJTVExwb3J0IHdvbid0IHdvcmsgd2l0aCBuZXcgaW9zdHJlYW1zIGFuZCBzdGQ6OiBiZWluZyBpbXBsaWNpdGx5IGluY2x1ZGVkLiBQbGVhc2UgdXNlIC1zdGQgc3RyaWN0X2Fuc2lbX2Vycm9yc10gb3Igc3BlY2lmeSBfX05PX1VTRV9TVERfSU9TVFJFQU0iCi0jIGVuZGlmCi0KLSMgaWYgKGRlZmluZWQgKF9fU1REX1NUUklDVF9BTlNJKSB8fCBkZWZpbmVkIChfX1NURF9TVFJJQ1RfQU5TSV9FUlJPUlMpKQotIyAgZGVmaW5lIF9TVExQX1NUUklDVF9BTlNJIDEKLSMgZWxzZQotLy8gd2Ugd2FudCB0byBlbmZvcmNlIGl0Ci0jICBkZWZpbmUgX1NUTFBfTE9OR19MT05HIGxvbmcgbG9uZwotIyBlbmRpZgotCi0vLyB1bnNpZ25lZCAzMi1iaXQgaW50ZWdlciB0eXBlCi0jICBkZWZpbmUgX1NUTFBfVUlOVDMyX1QgdW5zaWduZWQgaW50Ci0jaWYgZGVmaW5lZChfWE9QRU5fU09VUkNFKSAmJiAoX1hPUEVOX1ZFUlNJT04gLSAwID49IDQpCi0jIGRlZmluZSBfU1RMUF9SQU5ENDggMQotI2VuZGlmCi0vLyAjICBkZWZpbmUgX1NUTFBfUkFORDQ4IDEKLQotIyAgZGVmaW5lIF9TVExQX05PX0VYUExJQ0lUX0ZVTkNUSU9OX1RNUExfQVJHUyAxCi0KLSMgaWYgKF9fREVDQ1hYX1ZFUiA8PSA2MDYwMDAwMCkKLSMgIGRlZmluZSBfU1RMUF9IQVNfTk9fTkVXX0NfSEVBREVSUyAxCi0jIGVuZGlmCi0KZGlmZiAtLWdpdCBhL3N0bC9jb25maWcvX2RlY192bXMuaCBiL3N0bC9jb25maWcvX2RlY192bXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRmOGQyNi4uMDAwMDAwMAotLS0gYS9zdGwvY29uZmlnL19kZWNfdm1zLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vLyBPcGVuVk1TIHZlcnNpb24KLQotI2RlZmluZSBfU1RMUF9DT01QSUxFUiAiRGVjIFZtcyIKLQotIyBkZWZpbmUgX1NUTFBfTkFUSVZFX0hFQURFUihoZWFkZXIpIDxzeXMkbGlicmFyeTojI2hlYWRlcj4KLSMgZGVmaW5lIF9TVExQX05BVElWRV9DX0hFQURFUih4KSA8c3lzJGxpYnJhcnk6IyN4PgotIyBkZWZpbmUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUihoZWFkZXIpIDxzeXMkbGlicmFyeTojI2hlYWRlcj4KLSMgZGVmaW5lIF9TVExQX05BVElWRV9DUFBfUlVOVElNRV9IRUFERVIoaGVhZGVyKSA8c3lzJGxpYnJhcnk6IyNoZWFkZXI+Ci0KLSNpZiAoX19ERUNDWFhfVkVSIDwgNjAwMDAwMDApCi0KLS8vIGF1dG9tYXRpYyB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIGRvZXMgbm90Ci0vLyB3b3JrIHdpdGggbmFtZXNwYWNlcyA7KAotIyBkZWZpbmUgX1NUTFBfSEFTX05PX05BTUVTUEFDRVMgMQotCi0jIGRlZmluZSBfU1RMUF9OT19XQ0hBUl9UICAxCi0jIGRlZmluZSBfU1RMUF9ORUVEX0VYUExJQ0lUICAxCi0KLSMgZGVmaW5lIF9TVExQX05PX0JPT0wgIDEKLSMgZGVmaW5lIF9TVExQX05FRURfVFlQRU5BTUUgMQotIyBkZWZpbmUgX1NUTFBfTk9fTkVXX1NUWUxFX0NBU1RTIDEKLSMgZGVmaW5lIF9TVExQX05FRURfTVVUQUJMRSAxCi0jIGRlZmluZSBfU1RMUF9OT19CQURfQUxMT0MgMQotCi0jIGRlZmluZSBfU1RMUF9OT19ORVdfTkVXX0hFQURFUiAxCi0jIGRlZmluZSBfU1RMUF9OT19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OX1NZTlRBWCAxCi0KLSMgZGVmaW5lIF9TVExQX05PX01FTUJFUl9URU1QTEFURVMgMQotIyBkZWZpbmUgX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFX0NMQVNTRVMgMQotIyBkZWZpbmUgX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFX0tFWVdPUkQgMQotIyBkZWZpbmUgX1NUTFBfTk9fRlJJRU5EX1RFTVBMQVRFUyAxCi0jIGRlZmluZSBfU1RMUF9OT19RVUFMSUZJRURfRlJJRU5EUyAxCi0jIGRlZmluZSBfU1RMUF9OT19DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OIDEKLSMgZGVmaW5lIF9TVExQX05PX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUiAxCi0jIGRlZmluZSBfU1RMUF9OT05fVFlQRV9UTVBMX1BBUkFNX0JVRyAxCi0jIGRlZmluZSBfU1RMUF9CUk9LRU5fVVNJTkdfRElSRUNUSVZFIDEKLSMgZGVmaW5lIF9TVExQX05PX0VYQ0VQVElPTl9IRUFERVIgMQotIyBkZWZpbmUgX1NUTFBfREVGX0NPTlNUX1BMQ1RfTkVXX0JVRyAxCi0jIGRlZmluZSBfU1RMUF9ERUZfQ09OU1RfREVGX1BBUkFNX0JVRyAxCi0KLSNlbmRpZgotCi0KLSNpZmRlZiBfX05PX1VTRV9TVERfSU9TVFJFQU0KLSMgIGRlZmluZSBfU1RMUF9VU0VfTk9fSU9TVFJFQU1TIDEKLSMgZWxzZQotLy8gZGVmYXVsdCBpcyB0byB1c2UgbmV3IGlvc3RyZWFtcywgYW55d2F5Ci0jIGlmbmRlZiBfX1VTRV9TVERfSU9TVFJFQU0KLSMgIGRlZmluZSBfX1VTRV9TVERfSU9TVFJFQU0KLSMgZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIF9fRVhDRVBUSU9OUwotIyBkZWZpbmUgX1NUTFBfSEFTX05PX0VYQ0VQVElPTlMgMQotI2VuZGlmCi0KLSMgaWZkZWYgX19JTVBMSUNJVF9JTkNMVURFX0VOQUJMRUQKLQotI2lmZGVmIF9TVExQX1VTRV9OT19JT1NUUkVBTVMKLS8vIGltcGxpY2l0IGluY2x1ZGUgaW50cm9kdWNlcyBjb25mbGljdHMKLS8vIGJldHdlZW4gc3RscG9ydCBhbmQgbmF0aXZlIGxpYi4KLSMgdW5kZWYgX19JTVBMSUNJVF9JTkNMVURFX0VOQUJMRUQKLSNlbmRpZgotCi0vLyBidXQsIHdvcmtzIHdpdGggb3VycyA7KS4KLSMgIGRlZmluZSBfU1RMUF9MSU5LX1RJTUVfSU5TVEFOVElBVElPTiAxCi0KLSMgZW5kaWYKLQotIyBpZiBkZWZpbmVkIChfX0lNUExJQ0lUX1VTSU5HX1NURCkgJiYgIWRlZmluZWQgKF9fTk9fVVNFX1NURF9JT1NUUkVBTSkKLS8vIHdlIHNob3VsZCBiYW4gdGhhdCAhCi0jICBlcnJvciAiU1RMcG9ydCB3b24ndCB3b3JrIHdpdGggbmV3IGlvc3RyZWFtcyBhbmQgc3RkOjogYmVpbmcgaW1wbGljaXRseSBpbmNsdWRlZC4gUGxlYXNlIHVzZSAtc3RkIHN0cmljdF9hbnNpW19lcnJvcnNdIG9yIHNwZWNpZnkgX19OT19VU0VfU1REX0lPU1RSRUFNIgotIyBlbmRpZgotCi0jIGlmICEoZGVmaW5lZCAoX19TVERfU1RSSUNUX0FOU0kpIHx8IGRlZmluZWQgKF9fU1REX1NUUklDVF9BTlNJX0VSUk9SUykpCi0vLyB3ZSB3YW50IHRvIGVuZm9yY2UgaXQKLSMgIGRlZmluZSBfU1RMUF9MT05HX0xPTkcgbG9uZyBsb25nCi0jIGVuZGlmCi0KLS8vIHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyIHR5cGUKLSMgIGRlZmluZSBfU1RMUF9VSU5UMzJfVCB1bnNpZ25lZCBpbnQKLSNpZiBkZWZpbmVkKF9YT1BFTl9TT1VSQ0UpICYmIChfWE9QRU5fVkVSU0lPTiAtIDAgPj0gNCkKLSMgZGVmaW5lIF9TVExQX1JBTkQ0OCAxCi0jZW5kaWYKLS8vICMgIGRlZmluZSBfU1RMUF9SQU5ENDggMQotCi0jICBkZWZpbmUgX1NUTFBfTk9fRVhQTElDSVRfRlVOQ1RJT05fVE1QTF9BUkdTIDEKLQotI2RlZmluZSBfU1RMUF9IQVNfTk9fTkVXX0NfSEVBREVSUyAxCi0KZGlmZiAtLWdpdCBhL3N0bC9jb25maWcvX2RldGVjdF9kbGxfb3JfbGliLmggYi9zdGwvY29uZmlnL19kZXRlY3RfZGxsX29yX2xpYi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTA0OWZhLi4wMDAwMDAwCi0tLSBhL3N0bC9jb25maWcvX2RldGVjdF9kbGxfb3JfbGliLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKiBGaWxlIHVzZWQgdG8gZGVmaW5lIG1hY3JvczoKLSAqIF9TVExQX1VTRV9EWU5BTUlDX0xJQjogVG8gc2lnbmFsIHVzZSBTVExwb3J0IGFzIGEgZGxsIG9yIGJ1aWxkIG9mIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICBTVExwb3J0IGRsbHMuCi0gKiBfU1RMUF9VU0VfU1RBVElDX0xJQjogVG8gc2lnbmFsIHVzZSBvZiBTVExwb3J0IGFzIGEgc3RhdGljIGxpYiBvciBidWlsZCBvZgotICogICAgICAgICAgICAgICAgICAgICAgIHRoZSBTVExwb3J0IHN0YXRpYyBsaWJzLgotICogX1NUTFBfVVNJTkdfQ1JPU1NfTkFUSVZFX1JVTlRJTUVfTElCOiBTaWduYWwgdGhhdCB3ZSBhcmUgdXNpbmcgYSBuYXRpdmUgcnVudGltZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBhIHZlcnNpb24gZGlmZmVyZW50IGZyb20gdGhlIFNUTHBvcnQgb25lLgotICogSWYgX1NUTFBfVVNFX0RZTkFNSUNfTElCIG9yIF9TVExQX1VTRV9TVEFUSUNfTElCIGlzIGFscmVkYXkgZGVmaW5lZCBpdCBtZWFucyB0aGF0Ci0gKiB1c2VyIGZvcmNlcyB1c2Ugb2YgYSBzcGVjaWZpYyB2ZXJzaW9uLiBJbiB0aGlzIGNhc2UgX1NUTFBfVVNJTkdfQ1JPU1NfTkFUSVZFX1JVTlRJTUVfTElCCi0gKiB3aWxsIHN1cmVseSBiZSBkZWZpbmVkIG90aGVyd2lzZSB0aGVyZSBpcyBubyBuZWVkIHRvIGZvcmNlIG1hY3JvIGRlZmluZXMuCi0gKgotICogQmVmb3JlIGluY2x1ZGluZyB0aGlzIGZpbGUgdGhlIGNvbXBpbGVyIG11c3QgZGVmaW5lOgotICogX1NUTFBfRExMOiBJZiB3ZSBhcmUgYnVpbGRpbmcgYSBkbGwKLSAqIF9TVExQX1JVTlRJTUVfRExMOiBJZiB3ZSBhcmUgdXNpbmcgbmF0aXZlIHJ1bnRpbWUgYXMgYSBkbGwKLSAqLwotI2lmIGRlZmluZWQgKF9fQlVJTERJTkdfU1RMUE9SVCkKLSMgIHVuZGVmIF9TVExQX1VTRV9EWU5BTUlDX0xJQgotIyAgdW5kZWYgX1NUTFBfVVNFX1NUQVRJQ19MSUIKLSMgIGlmIGRlZmluZWQgKF9TVExQX0RMTCkKLS8qIFdlIGFyZSBidWlsZGluZyB0aGUgU1RMcG9ydCBkbGwgKi8KLSMgICAgZGVmaW5lIF9TVExQX1VTRV9EWU5BTUlDX0xJQgotIyAgICBpZiAhZGVmaW5lZCAoX1NUTFBfUlVOVElNRV9ETEwpCi0jICAgICAgZGVmaW5lIF9TVExQX1VTSU5HX0NST1NTX05BVElWRV9SVU5USU1FX0xJQgotIyAgICBlbmRpZgotIyAgZWxzZQotIyAgICBkZWZpbmUgX1NUTFBfVVNFX1NUQVRJQ19MSUIKLSMgICAgaWYgZGVmaW5lZCAoX1NUTFBfUlVOVElNRV9ETEwpCi0jICAgICAgZGVmaW5lIF9TVExQX1VTSU5HX0NST1NTX05BVElWRV9SVU5USU1FX0xJQgotIyAgICBlbmRpZgotIyAgZW5kaWYKLSNlbHNlCi0jICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fSU9TVFJFQU1TKQotLyogU1RMcG9ydCB1c2Ugb25seSBkZXBlbmQgb24gX1NUTFBfUlVOVElNRV9ETEwgYXMgd2UgYXJlIHJlcGxhY2luZwotICogdGhlIG5hdGl2ZSBydW50aW1lLgotICovCi0jICAgIGlmIGRlZmluZWQgKF9TVExQX1JVTlRJTUVfRExMKQotIyAgICAgIGlmICFkZWZpbmVkIChfU1RMUF9VU0VfU1RBVElDX0xJQikKLSMgICAgICAgIGlmICFkZWZpbmVkIChfU1RMUF9VU0VfRFlOQU1JQ19MSUIpCi0jICAgICAgICAgIGRlZmluZSBfU1RMUF9VU0VfRFlOQU1JQ19MSUIKLSMgICAgICAgIGVuZGlmCi0jICAgICAgZWxzZQotLyogVGhlIHVzZXIgaXMgZm9yY2luZyB1c2Ugb2YgU1RMcG9ydCBhcyBhIGR5bmFtaWMgbGlicmFyeS4gV2Ugc2lnbmFsIGl0IHNvCi0gKiB0aGF0IHRoZSBTVExwb3J0IG5hbWVzcGFjZSB3aWxsIGJlIG1vZGlmeSB0byByZXBvcnQgc3VjaCBhIGNvbWJpbmF0aW9uCi0gKiBhbmQgZm9yY2UgdGhlIHVzZXIgdG8gbGluayB3aXRoIHRoZSByZWJ1aWx0IFNUTHBvcnQgbGlicmFyeS4KLSAqLwotIyAgICAgICAgZGVmaW5lIF9TVExQX1VTSU5HX0NST1NTX05BVElWRV9SVU5USU1FX0xJQgotIyAgICAgIGVuZGlmCi0jICAgIGVsc2UKLSMgICAgICBpZiAhZGVmaW5lZChfU1RMUF9VU0VfRFlOQU1JQ19MSUIpCi0jICAgICAgICBpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX1NUQVRJQ19MSUIpCi0jICAgICAgICAgIGRlZmluZSBfU1RMUF9VU0VfU1RBVElDX0xJQgotIyAgICAgICAgZW5kaWYKLSMgICAgICBlbHNlCi0vKiBJZGVtIHByZXZpb3VzIHJlbWFyayBidXQgdGhlIHVzZXIgZm9yY2VzIHVzZSBvZiB0aGUgc3RhdGljIG5hdGl2ZSBydW50aW1lLgotICovCi0jICAgICAgICBkZWZpbmUgX1NUTFBfVVNJTkdfQ1JPU1NfTkFUSVZFX1JVTlRJTUVfTElCCi0jICAgICAgZW5kaWYKLSMgICAgZW5kaWYKLSMgIGVsc2UKLS8qIElmIHdlIGRvIG5vdCBidWlsZCBhbmQgdXNlIFNUTHBvcnQgbGlicyB3ZSBjb25zaWRlciB0aGF0IHdlIGFyZSBpbiBhIHN0YXRpYyBsaWIKLSAqIG1vZGUgYXMgb25seSBkeW5hbWljIGxpYiBuZWVkcyBhZGRpdGlvbmFsIGV4cG9ydC9pbXBvcnQgc3BlY2lmaWVyLgotICovCi0jICAgIGRlZmluZSBfU1RMUF9VU0VfU1RBVElDX0xJQgotIyAgZW5kaWYKLSNlbmRpZgotCi0vKiB3ZSBkb24ndCBoYXZlIGEgc3RhdGljIG5hdGl2ZSBydW50aW1lIGxpYnJhcnkgb24gZXZjMy9ldmM0ICovCi0jaWZkZWYgX1NUTFBfV0NFCi0jICB1bmRlZiBfU1RMUF9VU0lOR19DUk9TU19OQVRJVkVfUlVOVElNRV9MSUIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3RsL2NvbmZpZy9fZG0uaCBiL3N0bC9jb25maWcvX2RtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMDI3YTkuLjAwMDAwMDAKLS0tIGEvc3RsL2NvbmZpZy9fZG0uaAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vLyBTVExwb3J0IGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgRGlnaXRhbCBNYXJzIEMrKwotCi0vLyNkZWZpbmUgX1NUTFBfVkVSQk9TRQotCi0jZGVmaW5lIF9TVExQX0NPTVBJTEVSICJETUMiCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9WRVJCT1NFKQotIyAgcHJhZ21hIG1lc3NhZ2UgX19ETUNfVkVSU0lPTl9TVFJJTkdfXwotI2VuZGlmCi0KLSNpZiAoX19ETUNfXyA8IDB4ODQ2KQotIyAgZXJyb3IgIkRpZ2l0YWwgTWFycyBDKysgdmVyc2lvbnMgcHJpb3IgdG8gOC40NiBhcmUgbm90IHN1cHBvcnRlZCEiCi0jZW5kaWYKLQotI2lmbmRlZiBfQ1BQVU5XSU5ECi0jICBkZWZpbmUgX1NUTFBfTk9fRVhDRVBUSU9OUwotI2VuZGlmCi0jZGVmaW5lIF9TVExQX1ZFTkRPUl9HTE9CQUxfQ1NURAotCi0vL0RNQyBwcmVmZXIgZW51bSB0byByZWFsIHN0YXRpYyBjb25zdCB2YXJpYWJsZSBiZWNhdXNlIGl0IGRvIG5vdCBjb25zaWRlcgotLy9zdGF0aWMgY29uc3QgYXMgY29uc3QgZW5vdWdoIHRvIGJlIHVzZWQgaW4gc3dpdGNoIGRlY2xhcmF0aW9uLi4uCi0jZGVmaW5lIF9TVExQX1NUQVRJQ19DT05TVF9JTklUX0JVRwotCi0jaWYgIWRlZmluZWQgKF9XSU4zMikKLS8vIGl0J3Mgbm90IGZ1bGx5IHN1cHBvcnRlZCBvbiBub24tV2luMzIgcGxhdGZvcm1zCi0jICBkZWZpbmUgX1NUTFBfTk9fTkFUSVZFX1dJREVfRlVOQ1RJT05TCi0jZW5kaWYKLQotLyogX1NUTFBfTk9fT1dOX05BTUVTUEFDRSBpcyBkZWZpbmVkIGJlY2F1c2UgRGlnaXRhbCBNYXJzJyBsaW5rZXIgYW5kIGxpYmFyaWFuCi0gICBhcHBlYXIgdG8gaGF2ZSBwcm9ibGVtcyB3aXRoIFNUTHBvcnQgbmFtZXNwYWNlcy4gU3VtbWFyeSBvZiB0aGUgaXNzdWVzOgotCi0gICBTVEFUSUM6IERpZ2l0YWwgTWFycycgbGlicmFyaWFuIChsaWIuZXhlKSBtYXkgZmFpbCB3aXRoICJsZW4gPD0gSURNQVgiIGVycm9yCi0gICBpZiBfU1RMUF9ERUJVRyBpcyBkZWZpbmVkLiAgVGhpcyBpcyBiZWNhdXNlIERpZ2l0YWwgTWFycycgbGlicmFyaWFuIHVzZXMKLSAgIE1pY3Jvc29mdCBPTUYgZm9ybWF0LCB3aGljaCBsaW1pdHMgaWRlbnRpZmllciBsZW5ndGggdG8gYWJvdXQgNTEyIGJ5dGVzLgotICAgV2l0aCBTVExwb3J0IG5hbWVzcGFjZXMsIHNvbWUgaWRlbnRpZmllcnMgc3VjaCBhcyBDYXRlZ29yeV9NYXAgaW4KLSAgIHNyYy9sb2NhbGVfY2F0YWxvZy5jcHAgbWF5IGV4Y2VlZCB0aGUgbWF4aW11bSBPTUYgaWRlbnRpZmllciBsZW5ndGguCi0KLSAgIERZTkFNSUM6IEV4cG9ydCBpc3N1ZXMgd2l0aCBjaW4sIGNvdXQsIGNlcnIsIGNsb2cgaW4gc3JjL2lvc3RyZWFtLmNwcC4KLSAgIEV4cG9ydHMgaW4gRGlnaXRhbCBNYXJzICdkZWYnIGZpbGUgbXVzdCBtYXRjaCBtYW5nbGVkIG5hbWVzIGluIGlvc3RyZWFtLmNwcC4KLSAgIFdpdGggU1RMcG9ydCBuYW1lc3BhY2VzLCB0aGUgbWFuZ2xlZCBuYW1lcyBpbiB0aGUgaW50ZXJtZWRpYXRlIGZpbGVzIG5vCi0gICBsb25nZXIgbWF0Y2ggdGhlc2UgcHJlLWRlZmluZWQgZXhwb3J0cy4gVG8gdXNlIFNUTHBvcnQgZHluYW1pYyBsaWJyYXJpZXMKLSAgIGFuZCBTVExwb3J0IG5hbWVzcGFjZXMgd2l0aCBEaWdpdGFsIE1hcnMsIHRoZSBwcmUtZGVmaW5lZCBleHBvcnRzIGluCi0gICBzcmMvaW9zdHJlYW0uY3BwIGFuZCB0aGUgcmVsYXRlZCBEaWdpdGFsIE1hcnMgJ2RlZicgZmlsZXMgd291bGQgbmVlZCB0byBiZQotICAgcmV2aXNlZC4gKi8KLSNkZWZpbmUgX1NUTFBfTk9fT1dOX05BTUVTUEFDRSAxCi0KLS8vIHNlbGVjdCB0aHJlYWRzIHN0cmF0ZWd5Ci0jaWYgZGVmaW5lZCAoX01UKSAmJiAhZGVmaW5lZCAoX05PVEhSRUFEUykKLSMgIGRlZmluZSBfUkVFTlRSQU5UCi0jZWxzZQotIyAgZGVmaW5lIF9OT1RIUkVBRFMKLSNlbmRpZgotCi0jaWZuZGVmIF9CT09MX0RFRklORUQKLSMgIGRlZmluZSBfU1RMUF9OT19CT09MCi0jZWxzZQotIyAgZGVmaW5lIF9TVExQX0RPTlRfVVNFX0JPT0xfVFlQRURFRgotI2VuZGlmCi0KLSNpZiBfSU5URUdSQUxfTUFYX0JJVFMgPj0gNjQKLSMgIGRlZmluZSBfU1RMUF9MT05HX0xPTkcgbG9uZyBsb25nCi0jZW5kaWYKLQotI2RlZmluZSBfU1RMUF9ET05UX1VTRV9QUklWX05BTUVTUEFDRQotI2RlZmluZSBfU1RMUF9OT19CQURfQUxMT0MKLSNkZWZpbmUgX1NUTFBfVEhST1dfUkVUVVJOX0JVRwotCi0jaWYgIWRlZmluZWQgKF9ETEwpCi0jICB1bmRlZiBfU1RMUF9OT19VTkVYUEVDVEVEX0VYQ0VQVF9TVVBQT1JUCi0jZW5kaWYKLQotI2RlZmluZSBfU1RMUF9VU0VfQUJCUkVWUwotI2RlZmluZSBfU1RMUF9OT19DT05UQUlORVJTX0VYVEVOU0lPTgotI2RlZmluZSBfU1RMUF9OT19GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIKLQotI2RlZmluZSBfU1RMUF9FWFBPUlRfREVDTFNQRUMgX19kZWNsc3BlYyhkbGxleHBvcnQpCi0jZGVmaW5lIF9TVExQX0lNUE9SVF9ERUNMU1BFQyBfX2RlY2xzcGVjKGRsbGltcG9ydCkKLQotI2RlZmluZSBfU1RMUF9DTEFTU19FWFBPUlRfREVDTFNQRUMgX19kZWNsc3BlYyhkbGxleHBvcnQpCi0jZGVmaW5lIF9TVExQX0NMQVNTX0lNUE9SVF9ERUNMU1BFQyBfX2RlY2xzcGVjKGRsbGltcG9ydCkKLQotI2RlZmluZSBfU1RMUF9JTVBPUlRfVEVNUExBVEVfS0VZV09SRCBfX2RlY2xzcGVjKGRsbGltcG9ydCkKLSNkZWZpbmUgX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0tFWVdPUkQgX19kZWNsc3BlYyhkbGxleHBvcnQpCi0KLSNpZiBkZWZpbmVkIChfV0lORExMKQotIyAgZGVmaW5lIF9TVExQX0RMTAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoX0RMTCkKLSMgIGRlZmluZSBfU1RMUF9SVU5USU1FX0RMTAotI2VuZGlmCi0jaW5jbHVkZSA8c3RsL2NvbmZpZy9fZGV0ZWN0X2RsbF9vcl9saWIuaD4KLSN1bmRlZiBfU1RMUF9SVU5USU1FX0RMTAotI3VuZGVmIF9TVExQX0RMTAotCi0jaWYgZGVmaW5lZCAoX1NUTFBfVVNFX0RZTkFNSUNfTElCKQotIyAgZGVmaW5lIF9TVExQX1VTRV9ERUNMU1BFQyAxCi0jICBpZiBkZWZpbmVkIChfX0JVSUxESU5HX1NUTFBPUlQpCi0jICAgIGRlZmluZSBfU1RMUF9DQUxMIF9fZXhwb3J0Ci0jICBlbHNlCi0jICAgIGRlZmluZSBfU1RMUF9DQUxMCi0jICBlbmRpZgotI2Vsc2UKLSMgIGRlZmluZSBfU1RMUF9DQUxMCi0jZW5kaWYKLQotI2luY2x1ZGUgPHN0bC9jb25maWcvX2F1dG9fbGluay5oPgotCi0jICB1bmRlZiBfX1NDX18KLQpkaWZmIC0tZ2l0IGEvc3RsL2NvbmZpZy9fZXBpbG9nLmggYi9zdGwvY29uZmlnL19lcGlsb2cuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNiYWNlNS4uMDAwMDAwMAotLS0gYS9zdGwvY29uZmlnL19lcGlsb2cuaAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLSNpZiBkZWZpbmVkIChfU1RMUF9NU1ZDKSB8fCBkZWZpbmVkIChfX0lDTCkgfHwgZGVmaW5lZCAoX19CT1JMQU5EQ19fKQotCi0jaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKQotIyAgcHJhZ21hIG9wdGlvbiBwb3AKLSMgIHByYWdtYSBvcHRpb24gLXctcG93ICAgICAvLyAtdy04MDYyIFByZXZpb3VzIG9wdGlvbnMgYW5kIHdhcm5pbmdzIG5vdCByZXN0b3JlZAotI2Vsc2UKLSMgIGlmICEoZGVmaW5lZCAoX1NUTFBfTVNWQykgJiYgKF9TVExQX01TVkMgPCAxMjAwKSkKLSMgICAgcHJhZ21hIHdhcm5pbmcgKHBvcCkKLSMgIGVuZGlmCi0jICBwcmFnbWEgcGFjayAocG9wKQotI2VuZGlmCi0KLSNlbGlmIGRlZmluZWQgKF9fc2dpKSAmJiAhZGVmaW5lZCAoX19HTlVDX18pICYmIChfTUlQU19TSU0gIT0gX01JUFNfU0lNX0FCSTMyKQotCi0jICBwcmFnbWEgcmVzZXQgd29mZiAxMTc0Ci0jICBwcmFnbWEgcmVzZXQgd29mZiAxMzc1Ci0jICBwcmFnbWEgcmVzZXQgd29mZiAxMjA5Ci0vKiBmcm9tIGl0ZXJhdG9yX2Jhc2UuaCAqLwotIyAgcHJhZ21hIHJlc2V0IHdvZmYgMTE4MwotCi0jZWxpZiBkZWZpbmVkIChfX0RFQ0NYWCkKLQotIyAgaWZkZWYgX19QUkFHTUFfRU5WSVJPTk1FTlQKLSMgICAgcHJhZ21hIF9fZW52aXJvbm1lbnQgX19yZXN0b3JlCi0jICBlbmRpZgotCi0jZWxpZiBkZWZpbmVkIChfX0lCTUNQUF9fKQotCi0jICBwcmFnbWEgaW5mbyhyZXN0b3JlKQotCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvc3RsL2NvbmZpZy9fZXZjLmggYi9zdGwvY29uZmlnL19ldmMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg4MWE5YS4uMDAwMDAwMAotLS0gYS9zdGwvY29uZmlnL19ldmMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM1NCArMCwwIEBACi0vKgotICogRmlsZSB0byBoYXZlIE1pY3Jvc29mdCBlTWJlZGRlZCBWaXN1YWwgQysrIDMuMCBhbmQgLk5FVCB3b3JraW5nIHdpdGggU1RMcG9ydAotICogTWF5IDIwMDQKLSAqIE9yaWdpbiA6IFpkZW5layBOZW1lYyAtIHplcm9AbWFwZmFjdG9yLmNvbQotICogICAgICAgICAgTWljaGFlbCBGaW5rIC0gdml2aWRvc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQKLSAqLwotCi0jaWZuZGVmIF9TVExQX0VWQ19ICi0jZGVmaW5lIF9TVExQX0VWQ19ICi0KLSNkZWZpbmUgX1NUTFBfQ09NUElMRVIgImVNYmVkZGVkIFZpc3VhbCBDKysiCi0KLS8vIFRoaXMgZmxhZyBpcyBiZWluZyB1c2VkIGJ5IFNUTHBvcnQgdG8gc3VwcG9ydAotLy8gb2xkLWZhc2hpb25lZCBXaW5kb3dzIENFIFNESyAoc2VlIHN0bF93aW5jZS5oKQotLy8gZG8gbm90IHVzZSB3aXRoIGVNZWJlZGRlZCBWaXN1YWwgQysrIDMgb3IgNCEKLSNpZmRlZiBfU1RMUF9XSU5DRQotIyAgdW5kZWYgX1NUTFBfV0lOQ0UKLSNlbmRpZgotCi0vKiBDb21waWxlciBkZXBlbmRlbnQgZGVmaW5lLiBUaGUgZm9sbG93aW5nIGRlZmluZXMgbWF5IGJlIGF2YWlsYWJsZToKLSAqIF9TVExQX1dDRV9FVkMzIHdoZW4gY29tcGlsaW5nIHVuZGVyIGVNYmVkZGVkIFZpc3VhbCBDKysgMwotICogX1NUTFBfV0NFX05FVCAgd2hlbiBjb21waWxpbmcgdW5kZXIgZU1iZWRkZWQgVmlzdWFsIEMrKyAuTkVUCi0gKiBfU1RMUF9XQ0UgICAgICBhbHdheXMgZGVmaW5lZCB3aGVuIGNvbXBpbGluZyB3aXRoIG9uZSBvZiB0aGUgYWJvdmUKLSAqLwotI3VuZGVmIF9TVExQX1dDRV9FVkMzCi0jdW5kZWYgX1NUTFBfV0NFX05FVAotCi0jaWYgKF9XSU4zMl9XQ0UgPiAzMDApCi0jICBkZWZpbmUgX1NUTFBfV0NFX05FVCBVTkRFUl9DRQotI2VsaWYgKF9XSU4zMl9XQ0UgPT0gMzAwKQotIyAgZGVmaW5lIF9TVExQX1dDRV9FVkMzIFVOREVSX0NFCi0jZWxzZQotIyAgZXJyb3IgTm8gc3VwcG9ydCBmb3IgV2luZG93cyBDRSBiZWxvdyAzLjAhCi0jZW5kaWYKLQotLy8gVGhpcyBpcyBkZWZpbmVkIGZvciBhbGwgcGxhdGZvcm1zIHVzaW5nIFdpbmRvd3MgQ0UKLSNkZWZpbmUgX1NUTFBfV0NFCi0KLS8qIEFsbCBXaW5kb3dzIENFIHZlcnNpb25zIHVwIHRvIGF0IGxlYXN0IHZlcnNpb24gNSBhcmUgbGl0dGxlLWVuZGlhbiwgZXZlbgotICogaWYgdGhlIGhhcmR3YXJlIChsaWtlIGUuZy4gTUlQUykgY2FuIGJlIGNvbmZpZ3VyZWQgZm9yIGJpZy1lbmRpYW4sIHRvby4gKi8KLSNkZWZpbmUgX1NUTFBfTElUVExFX0VORElBTgotCi0vLyBFbnN1cmUgX0RFQlVHIGlzIGRlZmluZWQuCi0jaWYgZGVmaW5lZCAoREVCVUcpICYmICFkZWZpbmVkIChfREVCVUcpCi0jICBkZWZpbmUgX0RFQlVHCi0jZW5kaWYKLQotLy8gaW4gZXZjMy80LCBvbiBBUk0sIGNoZWNrIHRoYXQgX1NUTFBfREVCVUcgaXMgbm90IGRlZmluZWQKLS8vIHRoZSBBUk0gY29tcGlsZXIgaGFzIGEgYnVnIHRoYXQgcHJldmVudHMgdGhhdCBkZWJ1ZyBtb2RlIGZyb20gd29ya2luZwotI2lmIF9XSU4zMl9XQ0UgPCA1MDAgJiYgZGVmaW5lZChBUk0pICYmIGRlZmluZWQoX1NUTFBfREVCVUcpCi0jICBlcnJvciBfU1RMUF9ERUJVRyBtb2RlIGlzIG5vdCBzdXBwb3J0ZWQgaW4gZXZjMyBhbmQgZXZjNCBvbiB0aGUgQVJNIHBsYXRmb3JtIQotI2VuZGlmCi0KLS8vIGluaGVyaXQgYWxsIG1zdmM2IG9wdGlvbnMKLSNpbmNsdWRlIDxzdGwvY29uZmlnL19tc3ZjLmg+Ci0KLS8vIENFIHVwIHRvIGF0IGxlYXN0IHZlcnNpb24gNSBoYXMgbm8gQyBsb2NhbGUgc3VwcG9ydAotI2RlZmluZSBfU1RMUF9OT19MT0NBTEVfU1VQUE9SVAotCi0jaWYgX1dJTjMyX1dDRSA+PSAweDUwMAotICAgLy8gU0RLcyBidWlsdCB3aXRoIFBCNSBoYXZlIHRlcm1pbmF0ZSZjbyBpbiBuYW1lc3BhY2Ugc3RkLi4uCi0jICBkZWZpbmUgX1NUTFBfVkVORE9SX1RFUk1JTkFURV9TVEQgX1NUTFBfVkVORE9SX1NURAotIyAgZGVmaW5lIF9TVExQX1ZFTkRPUl9VTkNBVUdIVF9FWENFUFRJT05fU1REIF9TVExQX1ZFTkRPUl9TVEQKLSAgIC8vIC4uLmFuZCBuZXdfaGFuZGxlci9zZXRfbmV3X2hhbmRsZXIgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuCi0jICBkZWZpbmUgX1NUTFBfR0xPQkFMX05FV19IQU5ETEVSIDEKLSNlbmRpZgotCi0vLyBBbHdheXMgdGhyZWFkZWQgaW4gZU1iZWRkZWQgVmlzdWFsIEMrKyAzLjAgYW5kIC5ORVQKLSNpZm5kZWYgX01UCi0jICBkZWZpbmUgX01UCi0jZW5kaWYKLQotLy8gd2UgZG9uJ3QgaGF2ZSBhIHN0YXRpYyBuYXRpdmUgcnVudGltZSBsaWJyYXJ5Ci0jdW5kZWYgX1NUTFBfVVNJTkdfQ1JPU1NfTkFUSVZFX1JVTlRJTUVfTElCCi0KLSNpZiBfV0lOMzJfV0NFIDwgNDAwCi0vLyBubyBsb25nIGRvdWJsZSB1bmRlciBDRTMgYW5kIG9sZGVyCi0jICBkZWZpbmUgX1NUTFBfTk9fTE9OR19ET1VCTEUKLSNlbmRpZgotCi0vLyBubyAqZiBhbmQgKmwgbWF0aCBmdW5jdGlvbnMgYXZhaWxhYmxlCi0jZGVmaW5lIF9TVExQX05PX1ZFTkRPUl9NQVRIX0YKLSNkZWZpbmUgX1NUTFBfTk9fVkVORE9SX01BVEhfTAotCi0vKgotICogUmVkaXJlY3QgY291dCwgY2VyciBhbmQgY2xvZzoKLSAqIElmIGRlZmluZWQgcmVkaXJlY3QgY291dCwgY2VyciBhbmQgY2xvZyB0bwotICogZmlsZXMgc3Rkb3V0LnR4dCwgc3RkZXJyLnR4dCBhbmQgc3RkbG9nLnR4dAotICovCi0vLyMgZGVmaW5lIF9TVExQX1JFRElSRUNUX1NURFNUUkVBTVMKLQotLyoKLSAqIFN0YXRpYyBjbGFzcyBtZW1iZXJzIG1heSBnZW5lcmF0ZSBMTksxMTc5OgotICogV3JvbmcgQ09NREFUIHBhY2tpbmcgbWF5IGNhdXNlIExOSzExNzkgZXJyb3IuCi0gKiBGb3IgZGV0YWlscyBzZWUgaHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL2dyb3Vwcz90aD04YTA1YzgyYzRmZmVlMjgwCi0gKiBleGFtcGxlIFA3OC4gVGhpcyBkZWZpbmUgaXMgbm90IHVzZWQvbmVlZGVkIGF0IHRoaXMgbW9tZW50Ci0gKiBidXQgbWF5IGNhbWUgaGFuZHkgaW4gZnV0dXJlLi4uCi0gKi8KLS8vIyBkZWZpbmUgX1NUTFBfU1RBVElDX01FTUJFUlNfQlVHCi0KLS8vIFVzZSB3aWRlLXN0cmluZyBpbnRlcmZhY2Ugb2Ygd2luZG93cyBuYXRpdmUgZnVuY3Rpb25zIChDcmVhdGVGaWxlLi4uKS4KLS8vIE5vdGUgdGhhdCB0aGlzIHNob3VsZCBiZSBkZWZpbmVkIGFsbCB0aGUgdGltZSB3aGlsZSB1bmRlciBDRS4KLSNpZiBkZWZpbmVkIChVTklDT0RFKQotIyAgZGVmaW5lIF9TVExQX1VTRV9XSURFX0lOVEVSRkFDRQotI2VuZGlmCi0KLS8vIEZvcmNlIGV4Y2VwdGlvbiBzdGQgdG8gc3RkIGluc3RlYWQgb2YgX19zdGRfYWxpYXMuCi0jaWYgZGVmaW5lZCAoX19jcGx1c3BsdXMpICYmICFkZWZpbmVkIChfU1RMUF9IQVNfTk9fTkFNRVNQQUNFUykKLSMgIGlmZGVmIF9TVExQX1ZFTkRPUl9FWENFUFRfU1RECi0jICAgIHVuZGVmIF9TVExQX1ZFTkRPUl9FWENFUFRfU1RECi0jICBlbmRpZgotIyAgZGVmaW5lIF9TVExQX1ZFTkRPUl9FWENFUFRfU1REIHN0ZAotI2VuZGlmCi0KLS8vIHNob3J0IHN0cmluZyBvcHRpbWl6YXRpb24gYnVnIHVuZGVyIGV2YzMsIGV2YzQgdXNpbmcgQVJNIGNvbXBpbGVyCi0jaWYgX01TQ19WRVI8MTQwMCAmJiAoZGVmaW5lZCAoQVJNKSB8fCBkZWZpbmVkIChfQVJNXykpCi0jICBkZWZpbmUgX1NUTFBfRE9OVF9VU0VfU0hPUlRfU1RSSU5HX09QVElNCi0jZW5kaWYKLQotLy8gd2hlbiB1c2luZyBNRkMsIGRpc2FibGUgYW5vdGhlciBwbGFjZW1lbnQgbmV3IGRlY2xhcmF0aW9uLCBzaW5jZSB0aGVyZSBpcyBvbmUgaW4gd2NlYWx0LmgKLSNpZiAhZGVmaW5lZCAoX19CVUlMRElOR19TVExQT1JUKSAmJiBkZWZpbmVkIChfTUZDX1ZFUikKLSMgIGRlZmluZSBfX1BMQUNFTUVOVF9ORVdfSU5MSU5FCi0jZW5kaWYKLQotLy8gdGhyZWFkcwotI3VuZGVmIF9SRUVOVFJBTlQKLSNkZWZpbmUgX1JFRU5UUkFOVAotI3VuZGVmIF9OT1RIUkVBRFMKLQotLy8gVXNlIG9sZCBmYXNoaW9uZWQgaGVhZGVycyAoY3RpbWUgdnMuIHRpbWUuaCkuCi0jdW5kZWYgX1NUTFBfTk9fTkVXX0NfSEVBREVSUwotI2RlZmluZSBfU1RMUF9OT19ORVdfQ19IRUFERVJTCi0KLS8vIGV4Y2VwdGlvbiBoYW5kbGluZyBzdXBwb3J0OiBvbmx5IG9uIGV2YzQgYW5kIHVzZXIgYWRkZWQgL0dYIHRvIHByb2plY3Qgc2V0dGluZ3MKLSNpZiBkZWZpbmVkIChfU1RMUF9XQ0VfRVZDMykgfHwgIWRlZmluZWQgKF9DUFBVTldJTkQpCi0jICBkZWZpbmUgX1NUTFBfTk9fRVhDRVBUSU9OX0hFQURFUgotIyAgZGVmaW5lIF9TVExQX05PX0VYQ0VQVElPTlMKLSMgIHVuZGVmIF9TVExQX1VTRV9FWENFUFRJT05TCi0jICBpZm5kZWYgX19USFJPV19CQURfQUxMT0MKLSMgICAgZGVmaW5lIF9fVEhST1dfQkFEX0FMTE9DIHsgX1NUTFBfV0lOQ0VfVFJBQ0UoTCJvdXQgb2YgbWVtb3J5Iik7IEV4aXRUaHJlYWQoMSk7IH0KLSMgIGVuZGlmCi0jZW5kaWYKLQotI2RlZmluZSBfU1RMUF9XSU5DRV9UUkFDRShtc2cpIE91dHB1dERlYnVnU3RyaW5nKG1zZykKLQotLyoKLSAqIGVNYmVkZGVkIFZpc3VhbCBDKysgLk5FVCBzcGVjaWZpYyBzZXR0aW5ncwotICovCi0jaWYgZGVmaW5lZCAoX1NUTFBfV0NFX05FVCkKLQotLy8gZXZjNCBoYXMgbm8gbG9jYWxlIGFuZCB0aW1lIHN1cHBvcnQKLSMgIGRlZmluZSBfU1RMUF9OT19MT0NBTEVfU1VQUE9SVAotIyAgZGVmaW5lIF9TVExQX05PX1RJTUVfU1VQUE9SVAotCi0vLyBwdHJkaWZmX3QgaXMgbm90IGRlZmluZWQgaW4gZXZjNCBoZWFkZXJzCi0jICBpZm5kZWYgX1BUUkRJRkZfVF9ERUZJTkVECi0gICB0eXBlZGVmIGludCBwdHJkaWZmX3Q7Ci0jICAgIGRlZmluZSBfUFRSRElGRl9UX0RFRklORUQKLSMgIGVuZGlmCi0KLS8qCi0gKiBIZWxwZXIgbWFjcm9zIGZvciBpbmNsdWRpbmcgdGhlIG5hdGl2ZSBoZWFkZXJzIGluIGNhc2VzIHdoZXJlIGEgZmlsZSB3aXRoCi0gKiB0aGUgc2FtZSBuYW1lIGFsc28gZXhpc3RzIGluIHRoZSBTVExwb3J0IGluY2x1ZGUgZm9sZGVyLiBUaGUgaWRlYSBiZWhpbmQKLSAqIHRoaXMgaXMgdGhhdCB3ZSBmaXJzdCBnbyB1cCBvbmUgZGlyZWN0b3J5IGFuZCB0aGVuIGRvd24gaW50byBhIGRpciB0aGF0Ci0gKiBpcyBvbmx5IHByZXNlbnQgaW4gdGhlIG5hdGl2ZSBpbnN0YWxsIGJ1dCBub3QgaW4gU1RMcG9ydC4KLSAqCi0gKi8KLSMgIGlmICFkZWZpbmVkIChfU1RMUF9OQVRJVkVfSU5DTFVERV9QQVRIKQotIyAgICBpZiBkZWZpbmVkIChfWDg2XykKLSMgICAgICBpZiBkZWZpbmVkIChfU1RMUF9XQ0VfVEFSR0VUX1BST0NfU1VCVFlQRV9FTVVMQVRPUikKLSMgICAgICAgIGRlZmluZSBfU1RMUF9OQVRJVkVfSU5DTFVERV9QQVRIIC4uL0VtdWxhdG9yCi0jICAgICAgZWxzZQotIyAgICAgICAgZGVmaW5lIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEggLi4vWDg2Ci0jICAgICAgZW5kaWYKLSMgICAgZWxpZiBkZWZpbmVkIChfQVJNXykKLSMgICAgICBpZiBfTVNDX1ZFUiA8IDE0MDAKLSAgICAgICAgIC8vIGVWQzMvNAotIyAgICAgICAgaWYgZGVmaW5lZCAoQVJNVjQpCi0jICAgICAgICAgIGRlZmluZSBfU1RMUF9OQVRJVkVfSU5DTFVERV9QQVRIIC4uL0FybXY0Ci0jICAgICAgICBlbGlmIGRlZmluZWQgKEFSTVY0SSkKLSMgICAgICAgICAgZGVmaW5lIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEggLi4vQXJtdjRpCi0jICAgICAgICBlbGlmIGRlZmluZWQgKEFSTVY0VCkKLSMgICAgICAgICAgZGVmaW5lIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEggLi4vQXJtdjR0Ci0jICAgICAgICBlbHNlCi0jICAgICAgICAgIGVycm9yIFVua25vd24gQVJNIFNESy4KLSMgICAgICAgIGVuZGlmCi0jICAgICAgZWxzZQotICAgICAgICAgLy8gVkM4IGNyb3NzY29tcGlsaW5nIGZvciBDRQotIyAgICAgICAgaWYgZGVmaW5lZCAoQVJNVjQpCi0jICAgICAgICAgIGRlZmluZSBfU1RMUF9OQVRJVkVfSU5DTFVERV9QQVRIIC4uL0FybXY0Ci0jICAgICAgICBlbGlmIGRlZmluZWQoQVJNVjRJKSB8fCBkZWZpbmVkKEFSTVY0VCkKLSMgICAgICAgICAgZGVmaW5lIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEggLi4vQXJtdjRpCi0jICAgICAgICBlbHNlCi0jICAgICAgICAgIGVycm9yIFVua25vd24gQVJNIFNESy4KLSMgICAgICAgIGVuZGlmCi0jICAgICAgZW5kaWYKLSMgICAgZWxpZiBkZWZpbmVkIChfTUlQU18pCi0jICAgICAgaWYgZGVmaW5lZCAoTUlQUzE2KQotIyAgICAgICAgZGVmaW5lIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEggLi4vbWlwczE2Ci0jICAgICAgZWxpZiBkZWZpbmVkIChNSVBTSUkpCi0jICAgICAgICBkZWZpbmUgX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSCAuLi9taXBzSUkKLSMgICAgICBlbGlmIGRlZmluZWQgKE1JUFNJSV9GUCkKLSMgICAgICAgIGRlZmluZSBfU1RMUF9OQVRJVkVfSU5DTFVERV9QQVRIIC4uL21pcHNJSV9mcAotIyAgICAgIGVsaWYgZGVmaW5lZCAoTUlQU0lWKQotIyAgICAgICAgZGVmaW5lIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEggLi4vbWlwc0lWCi0jICAgICAgZWxpZiBkZWZpbmVkIChNSVBTSVZfRlApCi0jICAgICAgICBkZWZpbmUgX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSCAuLi9taXBzSVZfZnAKLSMgICAgICBlbHNlCi0jICAgICAgICBlcnJvciBVbmtub3duIE1JUFMgU0RLLgotIyAgICAgIGVuZGlmCi0jICAgIGVsaWYgZGVmaW5lZCAoU0h4KQotIyAgICAgIGlmIGRlZmluZWQgKFNIMykKLSMgICAgICAgIGRlZmluZSBfU1RMUF9OQVRJVkVfSU5DTFVERV9QQVRIIC4uL3NoMwotIyAgICAgIGVsaWYgZGVmaW5lZCAoU0g0KQotIyAgICAgICAgZGVmaW5lIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEggLi4vc2g0Ci0jICAgICAgZWxzZQotIyAgICAgICAgZXJyb3IgVW5rbm93biBTSHggU0RLLgotIyAgICAgIGVuZGlmCi0jICAgIGVsc2UKLSMgICAgICBlcnJvciBVbmtub3duIFNESy4KLSMgICAgZW5kaWYKLSMgIGVuZGlmIC8qICFfU1RMUF9OQVRJVkVfSU5DTFVERV9QQVRIICovCi0KLS8qIFdvcmthcm91bmQgd2hlbiB1c2luZyBNRkNDRSBhbmQgdXNpbmcgPG5ldz4gdG9nZXRoZXI6IE1GQ0NFJ3Mgd2NlYWx0LmggZG9lc24ndAotICogY2hlY2sgZm9yIF9fUExBQ0VNRU5UX05FV19JTkxJTkUgYmVmb3JlIGRlZmluaW5nIG9wZXJhdG9yIG5ldywgc28gd2hlbiA8bmV3PgotICogZGVmaW5lcyB0aGUgb3BlcmF0b3JlIGJlZm9yZSwgdGhlcmUgd2lsbCBiZSBhbiBlcnJvciBDMjA4NDoKLSAqICJmdW5jdGlvbiAndm9pZCAqX19jZGVjbCBvcGVyYXRvciBuZXcodW5zaWduZWQgaW50LHZvaWQgKiknIGFscmVhZHkgaGFzIGEgYm9keSIuCi0gKi8KLSMgIGlmZGVmIF9TVExQX1VTRV9NRkMKLSMgICAgZGVmaW5lIF9fUExBQ0VNRU5UX05FV19JTkxJTkUKLSMgIGVuZGlmCi0KLSNlbmRpZiAvKiBfU1RMUF9XQ0VfTkVUICovCi0KLS8qIFdvcmthcm91bmQgaW4gX3dpbmRvd3MuaCBuZWVkcyBuYXRpdmUgaGVhZGVycyBhY2Nlc3MgbWFjcm9zCi0gKiB0byBiZSBkZWZpbmVkICovCi0jaW5jbHVkZSA8c3RsL2NvbmZpZy9fbmF0aXZlX2hlYWRlcnMuaD4KLQotLyoKLSAqIGVNYmVkZGVkIFZpc3VhbCBDKysgMy4wIHNwZWNpZmljIHNldHRpbmdzCi0gKi8KLSNpZiBkZWZpbmVkIChfU1RMUF9XQ0VfRVZDMykKLQotIyAgZGVmaW5lIF9TVExQX05PX05BVElWRV9NQlNUQVRFX1QKLQotLy8gZXZjMyBoYXMgbm8gbG9jYWxlIGFuZCB0aW1lIHN1cHBvcnQKLSMgIGRlZmluZSBfU1RMUF9OT19MT0NBTEVfU1VQUE9SVAotIyAgZGVmaW5lIF9TVExQX05PX1RJTUVfU1VQUE9SVAotCi0vLyBldmMzIGhhcyBuZXcsIGJ1dCBubyBleHBsaWNpdCBoZWFkZXIKLSMgIGRlZmluZSBfU1RMUF9OT19ORVdfSEVBREVSCi0jICBkZWZpbmUgX1NUTFBfTk9fTkVXX05FV19IRUFERVIKLQotLy8gZXZjMyBoYXMgbm8gYmFkX2FsbG9jIGFuZCBubyB0eXBlaW5mbwotIyAgdW5kZWYgX1NUTFBfTk9fQkFEX0FMTE9DCi0jICBkZWZpbmUgX1NUTFBfTk9fQkFEX0FMTE9DCi0KLSMgIHVuZGVmIF9TVExQX05PX1RZUEVJTkZPCi0jICBkZWZpbmUgX1NUTFBfTk9fVFlQRUlORk8KLQotLy8gbWlzc2luZyB0aGluZ3MgaW4gZU1iZWRkZWQgVmlzdWFsIEMrKyAzLjAgaGVhZGVycwotIyAgaWZuZGVmIF9TSVpFX1RfREVGSU5FRAotICAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgc2l6ZV90OwotIyAgICBkZWZpbmUgX1NJWkVfVF9ERUZJTkVECi0jICBlbmRpZgotCi0jICBpZm5kZWYgX1dDSEFSX1RfREVGSU5FRAotICAgdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB3Y2hhcl90OwotIyAgICBkZWZpbmUgX1dDSEFSX1RfREVGSU5FRAotIyAgZW5kaWYKLQotLy8gcHRyZGlmZl90IGlzIG5vdCBkZWZpbmVkIGluIGV2YzMgaGVhZGVycwotIyAgaWZuZGVmIF9QVFJESUZGX1RfREVGSU5FRAotICAgdHlwZWRlZiBpbnQgcHRyZGlmZl90OwotIyAgICBkZWZpbmUgX1BUUkRJRkZfVF9ERUZJTkVECi0jICBlbmRpZgotCi0vLyBjbG9ja190IGlzIG5vdCBkZWZpbmVkIGluIGV2YzMgaGVhZGVycwotIyAgaWZuZGVmIF9DTE9DS19UX0RFRklORUQKLSAgIHR5cGVkZWYgbG9uZyBjbG9ja190OwotIyAgICBkZWZpbmUgX0NMT0NLX1RfREVGSU5FRAotIyAgZW5kaWYKLQotLy8gU3RydWN0IHRtIGlzIG5vdCBkZWZpbmVkIGluIGV2YzMgaGVhZGVycwotIyAgaWZuZGVmIF9UTV9ERUZJTkVECi1zdHJ1Y3QgdG0gewotICAgaW50IHRtX3NlYzsgICAgIC8qIHNlY29uZHMgYWZ0ZXIgdGhlIG1pbnV0ZSAtIFswLDU5XSAqLwotICAgaW50IHRtX21pbjsgICAgIC8qIG1pbnV0ZXMgYWZ0ZXIgdGhlIGhvdXIgLSBbMCw1OV0gKi8KLSAgIGludCB0bV9ob3VyOyAgICAvKiBob3VycyBzaW5jZSBtaWRuaWdodCAtIFswLDIzXSAqLwotICAgaW50IHRtX21kYXk7ICAgIC8qIGRheSBvZiB0aGUgbW9udGggLSBbMSwzMV0gKi8KLSAgIGludCB0bV9tb247ICAgICAvKiBtb250aHMgc2luY2UgSmFudWFyeSAtIFswLDExXSAqLwotICAgaW50IHRtX3llYXI7ICAgIC8qIHllYXJzIHNpbmNlIDE5MDAgKi8KLSAgIGludCB0bV93ZGF5OyAgICAvKiBkYXlzIHNpbmNlIFN1bmRheSAtIFswLDZdICovCi0gICBpbnQgdG1feWRheTsgICAgLyogZGF5cyBzaW5jZSBKYW51YXJ5IDEgLSBbMCwzNjVdICovCi0gICBpbnQgdG1faXNkc3Q7ICAgLyogZGF5bGlnaHQgc2F2aW5ncyB0aW1lIGZsYWcgKi8KLX07Ci0jICAgIGRlZmluZSBfVE1fREVGSU5FRAotIyAgZW5kaWYKLQotLy8gZGVmaW5lIHBsYWNlbWVudCBuZXcgYW5kIGRlbGV0ZSBvcGVyYXRvcgotLy8gbm90ZTogd2hlbiBNRkNDRSBoZWFkZXJzIGFyZSBpbmNsdWRlZCBmaXJzdCwgZG9uJ3QgZGVmaW5lIHRoZSBuZXcgb3BlcmF0b3IsCi0vLyAgICAgICBzaW5jZSBpdCB3YXMgYWxyZWFkeSBkZWZpbmVkIGluIHdjZWFsdC5oCi0jICBpZmRlZiBfX2NwbHVzcGx1cwotIyAgICBpZm5kZWYgX19QTEFDRU1FTlRfTkVXX0lOTElORQotIyAgICAgIGlmbmRlZiBfTUZDX1ZFUgotaW5saW5lIHZvaWQgKl9fY2RlY2wgb3BlcmF0b3IgbmV3KHNpemVfdCwgdm9pZCAqX1ApIHsgcmV0dXJuIChfUCk7IH0KLSMgICAgICBlbmRpZiAvKiBfTUZDX1ZFUiAqLwotaW5saW5lIHZvaWQgX19jZGVjbCBvcGVyYXRvciBkZWxldGUodm9pZCAqLCB2b2lkICopIHsgcmV0dXJuOyB9Ci0jICAgICAgZGVmaW5lIF9fUExBQ0VNRU5UX05FV19JTkxJTkUKLSMgICAgZW5kaWYKLSMgIGVuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLS8vIGV2YzMgZG9lc24ndCBoYXZlIG5hdGl2ZSB3aWRlIGZ1bmN0aW9ucywgZS5nLiBmZ2V0d2MsIHdtZW1tb3ZlCi0jICBkZWZpbmUgX1NUTFBfTk9fTkFUSVZFX1dJREVfRlVOQ1RJT05TCi0KLS8vIGV2YzMgZG9lc24ndCBoYXZlIGFzc2VydC5oCi0jICBpZm5kZWYgX0FTU0VSVF9ERUZJTkVECi0jICAgIGRlZmluZSBhc3NlcnQoZXhwcikgX1NUTFBfQVNTRVJUKGV4cHIpCi0jICAgIGRlZmluZSBfQVNTRVJUX0RFRklORUQKLSMgIGVuZGlmCi0KLSNlbmRpZiAvKiBfU1RMUF9XQ0VfRVZDMyAqLwotCi0vLyBNaW5pbWl6ZSB3aW5kb3dzLmggaW5jbHVkZXMKLSNpZiAhZGVmaW5lZCAoV0lOMzJfTEVBTl9BTkRfTUVBTikKLSMgIGRlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCAoVkNfRVhUUkFMRUFOKQotIyAgZGVmaW5lIFZDX0VYVFJBTEVBTgotI2VuZGlmCi0jaWYgIWRlZmluZWQgKFNUUklDVCkKLSMgIGRlZmluZSBTVFJJQ1QKLSNlbmRpZgotCi0vLyBEb24ndCBsZXQgd2luZG93cy5oIGRlZmluZSBpdHMgbWluIGFuZCBtYXggbWFjcm9zLgotI2lmICFkZWZpbmVkIChOT01JTk1BWCkKLSMgIGRlZmluZSBOT01JTk1BWAotI2VuZGlmCi0KLS8qCi0gKiBvcmlnaW5hbCBjYWxsOiBUZXJtaW5hdGVQcm9jZXNzKEdldEN1cnJlbnRQcm9jZXNzKCksIDApOwotICogd2Ugc3Vic3RpdHV0ZSB0aGUgR2V0Q3VycmVudFByb2Nlc3MoKSB3aXRoIHRoZSByZXN1bHQgb2YgdGhlIGlubGluZSBmdW5jdGlvbgotICogZGVmaW5lZCBpbiBrZnVuY3MuaCwgc2luY2Ugd2UgdGhlbiBjYW4gYXZvaWQgaW5jbHVkaW5nIDx3aW5kb3dzLmg+IGF0IGFsbC4KLSAqIGFsbCBuZWVkZWQgV2luMzIgQVBJIGZ1bmN0aW9ucyBhcmUgZGVmaW5lZCBpbiA8c3RsL193aW5kb3dzLmg+Ci0gKi8KLSNpZm5kZWYgX0FCT1JUX0RFRklORUQKLSMgIGRlZmluZSBfU1RMUF9BQk9SVCgpIFRlcm1pbmF0ZVByb2Nlc3MocmVpbnRlcnByZXRfY2FzdDxIQU5ETEU+KDY2KSwgMCkKLSMgIGRlZmluZSBfQUJPUlRfREVGSU5FRAotI2VuZGlmCi0KLS8vIE5vdGljZTogd2luZG93cy5oIGlzbid0IGluY2x1ZGVkIGhlcmUgYW55bW9yZTsgYWxsIG5lZWRlZCBkZWZpbmVzIGFyZSBpbgotLy8gc3RsL193aW5kb3dzLmggbm93Ci0KLSNlbmRpZiAvKiBfU1RMUF9FVkNfSCAqLwpkaWZmIC0tZ2l0IGEvc3RsL2NvbmZpZy9fZnJlZWJzZC5oIGIvc3RsL2NvbmZpZy9fZnJlZWJzZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmI2YjU4Li4wMDAwMDAwCi0tLSBhL3N0bC9jb25maWcvX2ZyZWVic2QuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNkZWZpbmUgX1NUTFBfUExBVEZPUk0gIkZyZWUgQlNEIgpkaWZmIC0tZ2l0IGEvc3RsL2NvbmZpZy9fZ2NjLmggYi9zdGwvY29uZmlnL19nY2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRhZTQ1Mi4uMDAwMDAwMAotLS0gYS9zdGwvY29uZmlnL19nY2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ2MiArMCwwIEBACi0vKiBTVExwb3J0IGNvbmZpZ3VyYXRpb24gZmlsZQotICogSXQgaXMgaW50ZXJuYWwgU1RMcG9ydCBoZWFkZXIgLSBETyBOT1QgaW5jbHVkZSBpdCBkaXJlY3RseQotICovCi0KLSNkZWZpbmUgX1NUTFBfQ09NUElMRVIgImdjYyIKLQotLyogU3lzdGVtcyBoYXZpbmcgR0xJQkMgaW5zdGFsbGVkIGhhdmUgZGlmZmVyZW50IHRyYWl0cyAqLwotI2lmIGRlZmluZWQgKF9fbGludXhfXykKLSMgIGlmbmRlZiBfU1RMUF9VU0VfR0xJQkMKLSMgICAgZGVmaW5lIF9TVExQX1VTRV9HTElCQyAxCi0jICBlbmRpZgotIyAgaWYgZGVmaW5lZCAoX19VQ0xJQkNfXykgJiYgIWRlZmluZWQgKF9TVExQX1VTRV9VQ0xJQkMpCi0jICAgIGRlZmluZSBfU1RMUF9VU0VfVUNMSUJDIDEKLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9fQ1lHV0lOX18pICYmIFwKLSAgICAgKF9fR05VQ19fID49IDMpICYmIChfX0dOVUNfTUlOT1JfXyA+PSAzKSAmJiAhZGVmaW5lZCAoX0dMSUJDUFBfVVNFX0M5OSkKLSMgIGRlZmluZSBfU1RMUF9OT19WRU5ET1JfTUFUSF9MCi0jICBkZWZpbmUgX1NUTFBfTk9fVkVORE9SX1NURExJQl9MCi0jZW5kaWYKLQotI2lmIChfX0dOVUNfXyA8IDMpCi0jICBkZWZpbmUgX1NUTFBfTk9fVkVORE9SX1NURExJQl9MCi0jZW5kaWYKLQotLyogV2UgZ3Vlc3MgaWYgd2UgYXJlIHVzaW5nIHRoZSBjeWd3aW4gZGlzdHJpYiB0aGF0IGhhcyBhIHNwZWNpYWwgaW5jbHVkZSBzY2hlbWEuCi0gKiBUaGVyZSBpcyBubyB3YXkgdG8gZGlzdGluZ3Vpc2ggYSBjeWd3aW4gZGlzdHJpYiB1c2VkIGluIG5vLWN5Z3dpbiBtb2RlIGZyb20gYQotICogbWluZ3cgaW5zdGFsbC4gV2UgYXJlIGZvcmNlZCB0byB1c2UgYSBjb25maWd1cmF0aW9uIG9wdGlvbgotICovCi0jaWYgIWRlZmluZWQgKF9TVExQX05BVElWRV9JTkNMVURFX1BBVEgpICYmIFwKLSAgICAoZGVmaW5lZCAoX19DWUdXSU5fXykgfHwgZGVmaW5lZCAoX19NSU5HVzMyX18pICYmIGRlZmluZWQgKF9TVExQX05PX0NZR1dJTikpCi0jICBpZiAoX19HTlVDX18gPiAzKSB8fCAoKF9fR05VQ19fID09IDMpICYmIChfX0dOVUNfTUlOT1JfXyA+IDMpKQotIyAgICBkZWZpbmUgX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSCAuLi8uLi8uLi9fX0dOVUNfXy5fX0dOVUNfTUlOT1JfXy5fX0dOVUNfUEFUQ0hMRVZFTF9fL2luY2x1ZGUvYysrCi0jICBlbGlmIGRlZmluZWQgKF9TVExQX05PX0NZR1dJTikKLSMgICAgZGVmaW5lIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEggLi4vbWluZ3cKLS8qIyAgZWxzZQotICogQmVmb3JlIHZlcnNpb24gZ2NjIDMuNCwgdGhlIGN5Z3dpbiBwYWNrYWdlIGluY2x1ZGUgcGF0aCB3YXMgY29uZm9ybSB0byB0aGUKLSAqIEdOVSBjb252ZW50aW9uIHdoaWNoIGlzIHNldCBsYXRlciBpbiB0aGlzIGZpbGUuCi0gKi8KLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmIChfX0dOVUNfXyA8IDMpIHx8ICgoX19HTlVDX18gPT0gMykgJiYgKF9fR05VQ19NSU5PUl9fIDwgNCkpCi0vKiBkZWZpbmUgZm9yIGdjYyB2ZXJzaW9ucyBiZWZvcmUgMy40LjAuICovCi0jICBkZWZpbmUgX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFX0tFWVdPUkQKLSNlbmRpZgotCi0vKiBhem92OiBnY2Mgb24gbHlueCBoYXZlIGEgYnVnIHRoYXQgY2F1c2VzIGludGVybmFsCi0gKiBjb21waWxlciBlcnJvcnMgd2hlbiBjb21waWxpbmcgU1RMcG9ydCB3aXRoIG5hbWVzcGFjZXMgdHVybmVkIG9uLgotICogV2hlbiB0aGUgY29tcGlsZXIgZ2V0cyBiZXR0ZXIgLSBjb21tZW50IG91dCBfU1RMUF9IQVNfTk9fTkFNRVNQQUNFUwotICovCi0jaWYgZGVmaW5lZCAoX19MeW54X18pICYmIChfX0dOVUNfXyA8IDMpCi0jICBkZWZpbmUgX1NUTFBfSEFTX05PX05BTUVTUEFDRVMgMQotIyAgZGVmaW5lIF9TVExQX05PX1NUQVRJQ19URU1QTEFURV9EQVRBIDEKLS8qIHR1cm4gb2ZmIHVzZWxlc3Mgd2FybmluZyBhYm91dCBpbmNsdWRpbmcgc3lzdGVtIGhlYWRlcnMgKi8KLSMgIGRlZmluZSBfX05PX0lOQ0xVREVfV0FSTl9fIDEKLSNlbmRpZgotCi0vKiBUcnU2NCBVbml4LCBBSVgsIEhQIDogZ2NjIHRoZXJlIGJ5IGRlZmF1bHQgdXNlcyBuYXRpdmUgbGQgYW5kIGhlbmNlIGNhbm5vdCBhdXRvLWluc3RhbnRpYXRlCi0gICBzdGF0aWMgdGVtcGxhdGUgZGF0YS4gSWYgeW91IGFyZSB1c2luZyBHTlUgbGQsIHBsZWFzZSBzYXkgc28gaW4gdXNlcl9jb25maWcuaCBoZWFkZXIgKi8KLSNpZiAoX19HTlVDX18gPCAzKSAmJiAhZGVmaW5lZChfU1RMUF9HQ0NfVVNFU19HTlVfTEQpICYmIFwKLSAgICgoZGVmaW5lZCAoX19vc2ZfXykgJiYgZGVmaW5lZCAoX19hbHBoYV9fKSkgfHwgZGVmaW5lZCAoX0FJWCkgfHwgZGVmaW5lZCAoX19ocHV4KSB8fCBkZWZpbmVkKF9fYW1pZ2Fvc19fKSApCi0jICBkZWZpbmUgX1NUTFBfTk9fU1RBVElDX1RFTVBMQVRFX0RBVEEKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQgKF9SRUVOVFJBTlQpICYmIChkZWZpbmVkIChfVEhSRUFEX1NBRkUpIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmluZWQgKF9fT3BlbkJTRF9fKSAmJiBkZWZpbmVkIChfUE9TSVhfVEhSRUFEUykpIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmluZWQgKF9fTUlOR1czMl9fKSAmJiBkZWZpbmVkIChfTVQpKSkKLSMgIGRlZmluZSBfUkVFTlRSQU5UCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9fREpHUFApCi0jICBkZWZpbmUgX1NUTFBfUkFORDQ4ICAgIDEKLSMgIGRlZmluZSBfTk9USFJFQURTICAgIDEKLSMgIHVuZGVmICBfUFRIUkVBRFMKLSMgIGRlZmluZSBfU1RMUF9MSVRUTEVfRU5ESUFOCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9fTUlOR1czMl9fKQotLyogTWluZ3czMiwgZWdjcyBjb21waWxlciB1c2luZyB0aGUgTWljcm9zb2Z0IEMgcnVudGltZSAqLwotIyAgZGVmaW5lIF9TVExQX1ZFTkRPUl9HTE9CQUxfQ1NURAotIyAgdW5kZWYgIF9TVExQX05PX0RSQU5ENDgKLSMgIGRlZmluZSBfU1RMUF9OT19EUkFORDQ4Ci0jICBkZWZpbmUgX1NUTFBfQ0FMTAotCi0jICBpZiBkZWZpbmVkIChfU1RMUF9ORVdfUExBVEZPUk1fU0RLKQotLyogRm9yIHRoZSBtb21lbnQgdGhlIFdpbmRvd3MgU0RLIGNvbWluZyB3aXRoIE1pbmd3IHN0aWxsIG1pbWlrIHRoZSBvbGQgcGxhdGZvcm0gU0RLLiAqLwotIyAgICB1bmRlZiBfU1RMUF9ORVdfUExBVEZPUk1fU0RLCi0jICBlbmRpZgotI2VuZGlmIC8qIF9fTUlOR1czMl9fICovCi0KLSNpZiBkZWZpbmVkIChfX0NZR1dJTl9fKSB8fCBkZWZpbmVkIChfX01JTkdXMzJfXykKLSMgIGlmICFkZWZpbmVkIChfU1RMUF9VU0VfU1RBVElDX0xJQikKLSMgICAgZGVmaW5lIF9TVExQX1VTRV9ERUNMU1BFQyAxCi0jICAgIGlmICFkZWZpbmVkIChfU1RMUF9VU0VfRFlOQU1JQ19MSUIpCi0jICAgICAgZGVmaW5lIF9TVExQX1VTRV9EWU5BTUlDX0xJQgotIyAgICBlbmRpZgotIyAgICBkZWZpbmUgX1NUTFBfRVhQT1JUX0RFQ0xTUEVDIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQotIyAgICBkZWZpbmUgX1NUTFBfQ0xBU1NfRVhQT1JUX0RFQ0xTUEVDIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQotIyAgICBkZWZpbmUgX1NUTFBfQ0xBU1NfSU1QT1JUX0RFQ0xTUEVDIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQotIyAgZW5kaWYKLS8qIFRoZSBmb2xsb3dpbmcgaXMgZGVmaW5lZCBpbmRlcGVuZGVudGx5IG9mIF9TVExQX1VTRV9TVEFUSUNfTElCIGJlY2F1c2UgaXQgaXMgYWxzbwotICogdXNlZCB0byBpbXBvcnQgc3ltYm9scyBmcm9tIFBTREsgdW5kZXIgTWluR1cKLSAqLwotIyAgZGVmaW5lIF9TVExQX0lNUE9SVF9ERUNMU1BFQyBfX2RlY2xzcGVjKGRsbGltcG9ydCkKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX19DWUdXSU5fXykgfHwgZGVmaW5lZCAoX19NSU5HVzMyX18pIHx8ICEoZGVmaW5lZCAoX1NUTFBfVVNFX0dMSUJDKSB8fCBkZWZpbmVkIChfX3N1bikgfHwgZGVmaW5lZChfX0FQUExFX18pKQotIyAgaWYgIWRlZmluZWQgKF9fTUlOR1czMl9fKSAmJiAhZGVmaW5lZCAoX19DWUdXSU5fXykKLSMgICAgZGVmaW5lIF9TVExQX05PX05BVElWRV9NQlNUQVRFX1QgICAgMQotIyAgZW5kaWYKLSMgIGlmICFkZWZpbmVkIChfX01JTkdXMzJfXykgfHwgKF9fR05VQ19fIDwgMykgfHwgKF9fR05VQ19fID09IDMpICYmIChfX0dOVUNfTUlOT1JfXyA8IDQpCi0jICAgIGRlZmluZSBfU1RMUF9OT19OQVRJVkVfV0lERV9GVU5DVElPTlMgMQotIyAgZW5kaWYKLSMgIGRlZmluZSBfU1RMUF9OT19OQVRJVkVfV0lERV9TVFJFQU1TICAgMQotI2VuZGlmCi0KLSNkZWZpbmUgX1NUTFBfTk9SRVRVUk5fRlVOQ1RJT04gX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKQotCi0vKiBNYWMgT1MgWCBpcyBhIGxpdHRsZSBkaWZmZXJlbnQgd2l0aCBuYW1lc3BhY2VzIGFuZCBjYW5ub3QgaW5zdGFudGlhdGUKLSAqIHN0YXRpYyBkYXRhIG1lbWJlcnMgaW4gdGVtcGxhdGUgY2xhc3NlcyAqLwotI2lmIGRlZmluZWQgKF9fQVBQTEVfXykKLSMgIGlmICgoX19HTlVDX18gPCAzKSB8fCAoKF9fR05VQ19fID09IDMpICYmIChfX0dOVUNfTUlOT1JfXyA8IDMpKSkKLS8qIE1hYyBPUyBYIGlzIG1pc3NpbmcgYSByZXF1aXJlZCB0eXBlZGVmIGFuZCBzdGFuZGFyZCBtYWNybyAqLwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgd2ludF90OwotIyAgZW5kaWYKLQotIyAgZGVmaW5lIF9fdW5peAotCi0jICBpZiAoX19HTlVDX18gPCAzKQotCi0gLyogTWFjIE9TIFggbmVlZHMgb25lIGFuZCBvbmx5IG9uZSBzb3VyY2UgZmlsZSB0byBpbml0aWFsaXplIGFsbCBzdGF0aWMgZGF0YQotICAqIG1lbWJlcnMgaW4gdGVtcGxhdGUgY2xhc3Nlcy4gT25seSBvbmUgc291cmNlIGZpbGUgaW4gYW4gZXhlY3V0YWJsZSBvcgotICAqIGxpYnJhcnkgY2FuIGRlY2xhcmUgaW5zdGFuY2VzIGZvciBzdWNoIGRhdGEgbWVtYmVycywgb3RoZXJ3aXNlIGR1cGxpY2F0ZQotICAqIHN5bWJvbHMgd2lsbCBiZSBnZW5lcmF0ZWQuICovCi0KLSMgICAgZGVmaW5lIF9TVExQX05PX1NUQVRJQ19URU1QTEFURV9EQVRBCi0jICAgIGRlZmluZSBfU1RMUF9TVEFUSUNfQ09OU1RfSU5JVF9CVUcgMQotIyAgICBkZWZpbmUgX1NUTFBfU1RBVElDX1RFTVBMQVRFX0RBVEEgMAotIyAgICBkZWZpbmUgX1NUTFBfV0VBS19BVFRSSUJVVEUgMQotIC8qIFdvcmthcm91bmQgZm9yIHRoZSBicm9rZW4gTWFjIE9TIFggQysrIHByZXByb2Nlc3NvciB3aGljaCBjYW5ub3QgaGFuZGxlCi0gICogcGFyYW1ldGVyaXplZCBtYWNyb3MgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyAqLwotIyAgICBkZWZpbmUgX1NUTFBfTkFUSVZFX0hFQURFUihoZWFkZXIpIDwuLi9nKysvIyNoZWFkZXIjIz4KLSMgICAgZGVmaW5lIF9TVExQX05BVElWRV9DX0hFQURFUihoZWFkZXIpIDwuLi9pbmNsdWRlLyMjaGVhZGVyIyM+Ci0jICAgIGRlZmluZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSEVBREVSKGhlYWRlcikgPC4uL2crKy8jI2hlYWRlciMjPgotIyAgICBkZWZpbmUgX1NUTFBfTkFUSVZFX09MRF9TVFJFQU1TX0hFQURFUihoZWFkZXIpIDwuLi9nKysvIyNoZWFkZXIjIz4KLSMgICAgZGVmaW5lIF9TVExQX05BVElWRV9DUFBfUlVOVElNRV9IRUFERVIoaGVhZGVyKSA8Li4vZysrLyMjaGVhZGVyIyM+Ci0jICBlbmRpZiAvKiBfX0dOVUNfXyA8IDMgKi8KLQotIyAgZGVmaW5lIF9TVExQX05PX0xPTkdfRE9VQkxFCi0KLS8qIE1hYyBPUyBYIG5lZWRzIGFsbCAiOjoiIHNjb3BlIHJlZmVyZW5jZXMgdG8gYmUgInN0ZDo6IiAqLwotIyAgZGVmaW5lIF9TVExQX1VTRV9ORVdfQ19IRUFERVJTCi0KLSMgIGRlZmluZSBfU1RMUF9OT19WRU5ET1JfU1RETElCX0wKLQotI2VuZGlmIC8qIF9fQVBQTEVfXyAqLwotCi0KLSNpZiBkZWZpbmVkKF9fQkVPU19fKSAmJiBkZWZpbmVkKF9fSU5URUxfXykKLSMgIGRlZmluZSBfU1RMUF9OQVRJVkVfSEVBREVSKGhlYWRlcikgPC4uL3N0bHBvcnQvYmVvcy8jI2hlYWRlciMjPgotIyAgZGVmaW5lIF9TVExQX05BVElWRV9DX0hFQURFUihoZWFkZXIpIDwuLi9zdGxwb3J0L2Jlb3MvIyNoZWFkZXIjIz4KLSMgIGRlZmluZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSEVBREVSKGhlYWRlcikgPC4uL3N0bHBvcnQvYmVvcy8jI2hlYWRlciMjPgotIyAgZGVmaW5lIF9TVExQX05BVElWRV9PTERfU1RSRUFNU19IRUFERVIoaGVhZGVyKSA8Li4vc3RscG9ydC9iZW9zLyMjaGVhZGVyIyM+Ci0jICBkZWZpbmUgX1NUTFBfTkFUSVZFX0NQUF9SVU5USU1FX0hFQURFUihoZWFkZXIpIDwuLi9zdGxwb3J0L2Jlb3MvIyNoZWFkZXIjIz4KLSMgIGRlZmluZSBfU1RMUF9OT19OQVRJVkVfV0lERV9GVU5DVElPTlMgMQotIyAgZGVmaW5lIF9TVExQX05PX05BVElWRV9XSURFX1NUUkVBTVMgICAxCi0vKgotIyAgZGVmaW5lIF9OT1RIUkVBRFMgMQotKi8KLSMgIGlmZGVmIF9QVEhSRUFEUwotIyAgICB1bmRlZiAgX1BUSFJFQURTCi0jICBlbmRpZgotIyAgaWZkZWYgX1NUTFBfUFRIUkVBRFMKLSMgICAgdW5kZWYgX1NUTFBfUFRIUkVBRFMKLSMgIGVuZGlmCi0jICBkZWZpbmUgX1NUTFBfVVNFX1NURElPX0lPIDEKLSMgIGRlZmluZSBfU1RMUF9VU0VfR0xJQkMgMQotI2VuZGlmCi0KLS8qIGcrKyAyLjcueCBhbmQgYWJvdmUgKi8KLSNkZWZpbmUgX1NUTFBfTE9OR19MT05HIGxvbmcgbG9uZwotCi0jaWZkZWYgX1NUTFBfVVNFX1VDTElCQwotLyoKLSMgIGlmbmRlZiBfX0RPX0M5OV9NQVRIX18KLSovCi0gIC8qIE5vICpmIG1hdGggZnVjdGlvbnMgdmFyaWFudHMgKGkuZS4gc3FydGYsIGZhYnNmLCBldGMuKSAqLwotIyAgZGVmaW5lIF9TVExQX05PX1ZFTkRPUl9NQVRIX0YKLSAgLyogTm8gKmwgbWF0aCBmdWN0aW9ucyB2YXJpYW50cyAoaS5lLiBzcXJ0bCwgZmFic2wsIGV0Yy4pICovCi0jICBkZWZpbmUgX1NUTFBfTk9fVkVORE9SX01BVEhfTAotIyAgZGVmaW5lIF9TVExQX05PX0xPTkdfRE9VQkxFCi0vKgotIyAgZW5kaWYKLSovCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9fT3BlbkJTRF9fKSB8fCBkZWZpbmVkIChfX0ZyZWVCU0RfXykKLSMgIGRlZmluZSBfU1RMUF9OT19WRU5ET1JfTUFUSF9MCi0jICBkZWZpbmUgX1NUTFBfTk9fVkVORE9SX1NURExJQl9MIC8qIG5vIGxsYWJzICovCi0jICBpZm5kZWYgX191bml4Ci0jICAgIGRlZmluZSBfX3VuaXgKLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9fYWxwaGFfXykKLSMgIGRlZmluZSBfU1RMUF9OT19WRU5ET1JfTUFUSF9MCi0jICBkZWZpbmUgX1NUTFBfTk9fSUVDNTU5X1NVUFBPUlQKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX19ocHV4KQotIyAgZGVmaW5lIF9TVExQX05PX1ZFTkRPUl9TVERMSUJfTCAvKiBubyBsbGFicyAqLwotICAvKiBObyAqZiBtYXRoIGZ1Y3Rpb25zIHZhcmlhbnRzIChpLmUuIHNxcnRmLCBmYWJzZiwgZXRjLikgKi8KLSMgIGRlZmluZSBfU1RMUF9OT19WRU5ET1JfTUFUSF9GCi0jZW5kaWYKLQotI2lmIChfX0dOVUNfXyA+PSAzKQotIyAgaWZuZGVmIF9TVExQX0hBU19OT19ORVdfQ19IRUFERVJTCi0vKgotIyAgICBpZm5kZWYgX1NUTFBfVVNFX1VDTElCQwotKi8KLSMgICAgZGVmaW5lIF9TVExQX0hBU19OQVRJVkVfRkxPQVRfQUJTCi0vKgotIyAgICBlbmRpZgotKi8KLSMgIGVsc2UKLSMgICAgaWZkZWYgX1NUTFBfVVNFX0dMSUJDCi0jICAgICAgZGVmaW5lIF9TVExQX1ZFTkRPUl9MT05HX0RPVUJMRV9NQVRIICAxCi0jICAgIGVuZGlmCi0jICBlbmRpZgotI2VuZGlmCi0KLSNpZiAoX19HTlVDX18gPCAzKQotIyAgZGVmaW5lIF9TVExQX0hBU19OT19ORVdfQ19IRUFERVJTICAgICAxCi0jICBkZWZpbmUgX1NUTFBfVkVORE9SX0dMT0JBTF9DU1REICAgICAgIDEKLSMgIGRlZmluZSBfU1RMUF9ET05UX1VTRV9QVEhSRUFEX1NQSU5MT0NLIDEKLSMgIGlmbmRlZiBfX0hPTk9SX1NURAotIyAgICBkZWZpbmUgX1NUTFBfVkVORE9SX0dMT0JBTF9FWENFUFRfU1REIDEKLSMgIGVuZGlmCi0vKiBlZ2NzIGZhaWxzIHRvIGluaXRpYWxpemUgYnVpbHRpbiB0eXBlcyBpbiBleHByLiBsaWtlIHRoaXMgOiBuZXcocCkgY2hhcigpOyAgKi8KLSMgIGRlZmluZSBfU1RMUF9ERUZfQ09OU1RfUExDVF9ORVdfQlVHIDEKLSNlbmRpZgotCi0vKgotI2RlZmluZSBfU1RMUF9WRU5ET1JfR0xPQkFMX0NTVEQgMQotKi8KLQotI2lmIChfX0dOVUNfXyA9PSAyKSAmJiAoX19HTlVDX01JTk9SX18gPCA5NSkKLSMgIGRlZmluZSBfU1RMUF9OT19VTkNBVUdIVF9FWENFUFRfU1VQUE9SVAotIyAgZGVmaW5lIF9TVExQX05PX1VORVhQRUNURURfRVhDRVBUX1NVUFBPUlQKLSMgIGRlZmluZSBfU1RMUF9ERUZfQ09OU1RfREVGX1BBUkFNX0JVRyAxCi0jZWxpZiAhZGVmaW5lZCAoQU5EUk9JRCkKLS8vIERvbid0IGRyYWcgaW4gdGhlc2UgZXh0ZXJuYWxzIG9uIEFuZHJvaWQuCi0jICB1bmRlZiBfU1RMUF9OT19VTkNBVUdIVF9FWENFUFRfU1VQUE9SVAotIyAgdW5kZWYgX1NUTFBfTk9fVU5FWFBFQ1RFRF9FWENFUFRfU1VQUE9SVAotI2VuZGlmCi0KLSNpZiAoX19HTlVDX01JTk9SX18gPCA5KSAgJiYgKF9fR05VQ19fIDwgMykgLyogZ2NjIDIuOCAqLwotIyAgZGVmaW5lIF9TVExQX05PX1RFTVBMQVRFX0NPTlZFUlNJT05TCi0jICBkZWZpbmUgX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFX0NMQVNTRVMgMQotIyAgZGVmaW5lIF9TVExQX05PX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUiAxCi0jICBkZWZpbmUgX1NUTFBfTk9fRlJJRU5EX1RFTVBMQVRFUyAxCi0jICBkZWZpbmUgX1NUTFBfSEFTX05PX05BTUVTUEFDRVMgMQotIyAgZGVmaW5lIF9TVExQX05PX01FVEhPRF9TUEVDSUFMSVpBVElPTiAxCi0jICBkZWZpbmUgX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFUyAxCi0jICBkZWZpbmUgX1NUTFBfTk9fQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTiAxCi0jICBkZWZpbmUgX1NUTFBfRE9OVF9TSU1VTEFURV9QQVJUSUFMX1NQRUNfRk9SX1RZUEVfVFJBSVRTCi0vKiAgREpHUFAgZG9lc24ndCBzZWVtIHRvIGltcGxlbWVudCBpdCBpbiAyLjgueCAqLwotIyAgaWZkZWYgREpHUFAKLSMgICAgZGVmaW5lICBfU1RMUF9OT19TVEFUSUNfVEVNUExBVEVfREFUQSAxCi0jICBlbmRpZgotI2VuZGlmCi0KLSNpZiBfX0dOVUNfXyA8PSAyICYmIF9fR05VQ19NSU5PUl9fIDw9IDcgJiYgIWRlZmluZWQgKF9fQ1lHV0lOMzJfXykKLS8qIFdpbGwgaXQgd29yayB3aXRoIDIuNiA/IEkgZG91YnQgaXQuICovCi0jICBpZiAoIF9fR05VQ19NSU5PUl9fIDwgNiApCi1fX0dJVkVfVVBfV0lUSF9TVEwoR0NDXzI3Mik7Ci0jICBlbmRpZgotCi0jICBkZWZpbmUgIF9TVExQX05PX1JFTE9QU19OQU1FU1BBQ0UKLSMgIGRlZmluZSAgX1NUTFBfTk9OX1RZUEVfVE1QTF9QQVJBTV9CVUcKLSMgIGRlZmluZSAgX1NUTFBfTElNSVRFRF9ERUZBVUxUX1RFTVBMQVRFUyAxCi0jICBkZWZpbmUgIF9TVExQX0RFRkFVTFRfVFlQRV9QQVJBTSAxCi0jICBkZWZpbmUgIF9TVExQX05PX0JBRF9BTExPQwotIyAgZGVmaW5lICBfU1RMUF9OT19BUlJPV19PUEVSQVRPUiAxCi0jICBpZm5kZWYgX1NUTFBfTk9fU1RBVElDX1RFTVBMQVRFX0RBVEEKLSMgICAgZGVmaW5lICBfU1RMUF9OT19TVEFUSUNfVEVNUExBVEVfREFUQQotIyAgZW5kaWYKLSMgIGRlZmluZSAgX1NUTFBfU1RBVElDX0NPTlNUX0lOSVRfQlVHIDEKLSMgIGRlZmluZSAgX1NUTFBfTk9fTUVUSE9EX1NQRUNJQUxJWkFUSU9OIDEKLQotIyAgaWYgIWRlZmluZWQgKF9fQ1lHV0lOMzJfXykKLSMgICAgZGVmaW5lIF9TVExQX05FU1RFRF9UWVBFX1BBUkFNX0JVRyAgIDEKLSMgICAgZGVmaW5lIF9TVExQX0JBU0VfTUFUQ0hfQlVHICAgICAgIDEKLS8qICB1bnVzZWQgb3BlcmF0b3JzIGFyZSByZXF1aXJlZCAoZm9yd2FyZCkgKi8KLSMgICAgZGVmaW5lICBfU1RMUF9DT05TVF9DT05TVFJVQ1RPUl9CVUcKLSMgICAgZGVmaW5lIF9TVExQX05PX0RFRkFVTFRfTk9OX1RZUEVfUEFSQU0KLSMgIGVuZGlmCi0jICBkZWZpbmUgX1NUTFBfTk9fUEFSVElBTF9TUEVDSUFMSVpBVElPTl9TWU5UQVggMQotIyAgZGVmaW5lIF9TVExQX05PX0VYUExJQ0lUX0ZVTkNUSU9OX1RNUExfQVJHUyAxCi0jICBkZWZpbmUgX1NUTFBfTk9fRVhDRVBUSU9OX0hFQURFUiAxCi0jZWxzZSAvKiAhIDw9IDIuNy4qICovCi0jZW5kaWYgLyogISA8PSAyLjcuKiAqLwotCi0vKiBzdGF0aWMgdGVtcGxhdGUgZGF0YSBtZW1iZXJzIHdvcmthcm91bmQgc3RyYXRlZ3kgZm9yIGdjYyB0cmllcwotICogdG8gdXNlIHdlYWsgc3ltYm9scy4KLSAqIGlmIHlvdSBkb24ndCB3YW50IHRvIHVzZSB0aGF0LCAjZGVmaW5lIF9TVExQX1dFQUtfQVRUUklCVVRFPTAgKCB5b3UnbGwKLSAqIGhhdmUgdG8gcHV0ICIjZGVmaW5lIF9fUFVUX1NUQVRJQ19EQVRBX01FTUJFUlNfSEVSRSIgbGluZSBpbiBvbmUgb2YgeW91cgotICogY29tcGlsYXRpb24gdW5pdCAoIG9yIENGTEFHUyBmb3IgaXQgKSBfYmVmb3JlXyBpbmNsdWRpbmcgYW55IFNUTCBoZWFkZXIgKS4KLSAqLwotI2lmIGRlZmluZWQgKF9TVExQX05PX1NUQVRJQ19URU1QTEFURV9EQVRBKSAmJiAhIGRlZmluZWQgKF9TVExQX1dFQUtfQVRUUklCVVRFICkKLS8qIHN5c3RlbXMgdXNpbmcgR05VIGxkIG9yIGZvcm1hdCB0aGF0IHN1cHBvcnRzIHdlYWsgc3ltYm9scwotICAgbWF5IHVzZSAid2VhayIgYXR0cmlidXRlCi0gICBMaW51eCAmIFNvbGFyaXMgKCB4ODYgJiBTUEFSQyApIGFyZSBiZWluZyBhdXRvLXJlY29nbml6ZWQgaGVyZSAqLwotIyAgaWYgZGVmaW5lZChfU1RMUF9HTlVfTEQpIHx8IGRlZmluZWQoX19FTEZfXykgfHwgZGVmaW5lZCAoX19DWUdXSU5fXykgfHwgXAotICAgICAoKCBkZWZpbmVkIChfX1NWUjQpIHx8IGRlZmluZWQgKCBfX3N2cjRfXyApKSAmJiBcCi0gICAgICAoIGRlZmluZWQgKHN1bikgfHwgZGVmaW5lZCAoIF9fc3VuX18gKSkpCi0jICAgIGRlZmluZSBfU1RMUF9XRUFLX0FUVFJJQlVURSAxCi0jICBlbmRpZgotI2VuZGlmIC8qIF9TVExQX1dFQUtfQVRUUklCVVRFICovCi0KLQotLyogc3RyaWN0IEFOU0kgcHJvaGliaXRzICJsb25nIGxvbmciICggZ2NjKSAqLwotI2lmIGRlZmluZWQgKCBfX1NUUklDVF9BTlNJX18gKQotIyAgdW5kZWYgX1NUTFBfTE9OR19MT05HCi0vKgotIyAgICBkZWZpbmUgX1NUTFBfU1RSSUNUX0FOU0kgMQotKi8KLSNlbmRpZgotCi0vKgotI2lmICFkZWZpbmVkIChfX1NUUklDVF9BTlNJX18pIHx8IGRlZmluZWQgKF9fQlVJTERJTkdfU1RMUE9SVCkKLSMgIGRlZmluZSBfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUCi0jICBkZWZpbmUgX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0tFWVdPUkQgZXh0ZXJuCi0jICBkZWZpbmUgX1NUTFBfSU1QT1JUX1RFTVBMQVRFX0tFWVdPUkQgZXh0ZXJuCi0jZW5kaWYKLSovCi0KLSNpZm5kZWYgX19FWENFUFRJT05TCi0jICB1bmRlZiAgX1NUTFBfRE9OVF9VU0VfRVhDRVBUSU9OUwotIyAgZGVmaW5lIF9TVExQX0RPTlRfVVNFX0VYQ0VQVElPTlMgMQotI2VuZGlmCi0KLSNpZiAoX19HTlVDX18gPj0gMykKLQotIyAgaWYgIWRlZmluZWQgKF9TVExQX05BVElWRV9JTkNMVURFX1BBVEgpCi0jICAgIGlmICggKF9fR05VQ19fID09IDMgKSAmJiAoKF9fR05VQ19NSU5PUl9fID09IDApIHx8ICgoX19HTlVDX01JTk9SX18gPCAzKSAmJiBkZWZpbmVkKF9fQVBQTEVfQ0NfXykpKSkKLSMgICAgICBkZWZpbmUgX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSCAuLi9nKystdjMKLSMgICAgZWxzZQotIyAgICAgIGlmICggKChfX0dOVUNfXyA9PSA0ICkgfHwgKF9fR05VQ19NSU5PUl9fID49IDMpKSAmJiBkZWZpbmVkKF9fQVBQTEVfQ0NfXykpCi0jICAgICAgICBkZWZpbmUgX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSCAuLi9jKysKLS8qCi0qIEJlZm9yZSB2ZXJzaW9uIDMuNC4wIHRoZSAwIHBhdGNoIGxldmVsIHdhcyBub3QgcGFydCBvZiB0aGUgaW5jbHVkZSBwYXRoOgotKi8KLSMgICAgICBlbGlmIGRlZmluZWQgKF9fR05VQ19QQVRDSExFVkVMX18pICYmICgoX19HTlVDX1BBVENITEVWRUxfXyA+IDApIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19HTlVDX18gPT0gMyAmJiBfX0dOVUNfTUlOT1JfXyA+PSA0KSB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fR05VQ19fID4gMykpCi0jICAgICAgICBkZWZpbmUgX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSCAuLi9fX0dOVUNfXy5fX0dOVUNfTUlOT1JfXy5fX0dOVUNfUEFUQ0hMRVZFTF9fCi0jICAgICAgZWxzZQotIyAgICAgICAgZGVmaW5lIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEggLi4vX19HTlVDX18uX19HTlVDX01JTk9SX18KLSMgICAgICBlbmRpZgotIyAgICBlbmRpZgotIyAgZW5kaWYKLQotLyogSW5zdGFudGlhdGlvbiBzY2hlbWUgdGhhdCB1c2VkIChkZWZhdWx0KSBpbiBnY2MgMyBtYWRlIHZvaWQgb2Ygc2Vuc2UgZXhwbGljaXQKLSAgIGluc3RhbnRpYXRpb24gd2l0aGluIGxpYnJhcnk6IG5vdGhpbmcgZXhjZXB0IGluY3JlYXNlZCBsaWJyYXJ5IHNpemUuIC0gcHRyCi0gKi8KLSMgIGRlZmluZSBfU1RMUF9OT19GT1JDRV9JTlNUQU5USUFURQotCi0jZWxpZiAoX19HTlVDX01JTk9SX18gPCA4KQotCi0jICBpZiAhZGVmaW5lZCAoX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSCkKLSMgICAgZGVmaW5lIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEggLi4vZysrLWluY2x1ZGUKLSMgIGVuZGlmCi0KLS8qIHR1bmluZyBvZiBzdGF0aWMgdGVtcGxhdGUgZGF0YSBtZW1iZXJzIHdvcmthcm91bmQgKi8KLSMgIGlmICggX1NUTFBfU1RBVElDX1RFTVBMQVRFX0RBVEEgPCAxICkKLSMgICAgaWYgKCBfU1RMUF9XRUFLX0FUVFJJQlVURSA+IDAgKQotIyAgICAgIGRlZmluZSBfU1RMUF9XRUFLIF9fYXR0cmlidXRlX18gKCggd2VhayApKQotIyAgICBlbHNlCi0jICAgICAgZGVmaW5lIF9TVExQX1dFQUsKLSMgICAgZW5kaWYgLyogX1NUTFBfV0VBS19BVFRSSUJVVEUgKi8KLQotIyAgICBpZmRlZiBfX1BVVF9TVEFUSUNfREFUQV9NRU1CRVJTX0hFUkUKLSMgICAgICBkZWZpbmUgX19ERUNMQVJFX0lOU1RBTkNFKHR5cGUsaXRlbSxpbml0KSB0eXBlIGl0ZW0gX1NUTFBfV0VBSyBpbml0Ci0jICAgIGVsc2UKLSMgICAgICBkZWZpbmUgX19ERUNMQVJFX0lOU1RBTkNFKHR5cGUsaXRlbSxpbml0KQotIyAgICBlbmRpZiAvKiBfX1BVVF9TVEFUSUNfREFUQV9NRU1CRVJTX0hFUkUgKi8KLSMgIGVuZGlmIC8qIF9TVExQX1NUQVRJQ19URU1QTEFURV9EQVRBICovCi0KLSNlbHNlCi0KLS8qIGdjYy0yLjk1LjAgdXNlZCB0byB1c2UgImcrKy0zIiBkaXJlY3Rvcnkgd2hpY2ggaGFzIGJlZW4gY2hhbmdlZCB0byAiZysrIiBpbgotICogc3lzdGVtLWRlcGVuZGVudCAiaW5jbHVkZSIgZm9yIDIuOTUuMiBleGNlcHQgZm9yIEN5Z3dpbiBhbmQgTWluZ3cgcGFja2FnZXMuCi0gKiBJIGV4cGVjdCAiZysrLTMiIG5vdCBiZWluZyB1c2VkIGluIGxhdGVyIHJlbGVhc2VzLgotICogSWYgeW91ciBpbnN0YWxsYXRpb24gdXNlICJnKystMyIgaW5jbHVkZSBkaXJlY3RvcnkgZm9yIGFueSByZWFzb24gKHByZS0yLjk1LjIgb3IgV2luIGJpbmFyeSBraXQpLAotICogcGxlYXNlIGNoYW5nZSB0aGUgbWFjcm8gYmVsb3cgdG8gcG9pbnQgdG8geW91ciBkaXJlY3RvcnkuCi0gKi8KLQotIyAgaWYgIWRlZmluZWQgKF9TVExQX05BVElWRV9JTkNMVURFX1BBVEgpCi0jICAgIGlmIGRlZmluZWQoX19ESkdQUCkKLSMgICAgICBkZWZpbmUgX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSCAuLi9sYW5nL2N4eAotIyAgICBlbGlmIChfX0dOVUNfXyA+PSAzKSB8fCAoX19HTlVDX01JTk9SX18gPj0gOTcpCi0jICAgICAgZGVmaW5lIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEggLi4vaW5jbHVkZS9nKystdjMKLSMgICAgZWxpZiAoKF9fR05VQ19NSU5PUl9fID49IDk1ICYmIF9fR05VQ19NSU5PUl9fIDwgOTcpICYmIFwKLSAgICAgICAgICAhKCBkZWZpbmVkIChfX0ZyZWVCU0RfXykgfHwgZGVmaW5lZCAoX19OZXRCU0RfXykgfHwgZGVmaW5lZChfX3NnaSkgfHwgZGVmaW5lZCAoX19PUzJfXykgKSApCi0jICAgICAgZGVmaW5lIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEggLi4vZysrLTMKLSMgICAgZWxpZiAoX19HTlVDX01JTk9SX18gPiA4KSAmJiAoX19HTlVDX01JTk9SX18gPCA5NSkgJiYgKF9fR05VQ19fIDwgMykgJiYgIWRlZmluZWQoIF9fTHlueF9fICkKLS8qIHRoaXMgcmVhbGx5IHN1Y2tzLCBhcyBHTlVwcm8gZG9lcyBub3QgcmVhbGx5IGlkZW50aWZpZXMgaXRzZWxmLCBzbyB3ZSBoYXZlIHRvIGd1ZXNzCi0gKiBkZXBlbmRpbmcgb24gYSBwbGF0Zm9ybQotICovCi0jICAgICAgaWZkZWYgX19ocHV4Ci0jICAgICAgICBkZWZpbmUgX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSCAuLi9nKystMwotIyAgICAgIGVsc2UKLSMgICAgICAgIGRlZmluZSBfU1RMUF9OQVRJVkVfSU5DTFVERV9QQVRIIC4uL2crKy0yCi0jICAgICAgZW5kaWYKLSMgICAgZWxzZQotIyAgICAgIGRlZmluZSBfU1RMUF9OQVRJVkVfSU5DTFVERV9QQVRIIGcrKwotIyAgICBlbmRpZgotIyAgZW5kaWYKLQotLyogPGV4Y2VwdGlvbj4gZXQgYWwgKi8KLSMgIGlmZGVmIF9fRnJlZUJTRF9fCi0jICAgIGlmIChfX0dOVUNfXyA+IDIpIHx8IChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fID4gOTUpCi0jICAgICAgZGVmaW5lIF9TVExQX05BVElWRV9DUFBfUlVOVElNRV9JTkNMVURFX1BBVEggLi4vaW5jbHVkZQotIyAgICBlbmRpZgotIyAgZWxzZQotLyogYXpvdiAqLwotIyAgICBpZm5kZWYgX19MeW54X18KLSMgICAgICBpZiAoX19HTlVDX18gPiAyKSB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+PSA5NykKLS8qCi0jICAgICBkZWZpbmUgX1NUTFBfTkFUSVZFX0NQUF9SVU5USU1FX0lOQ0xVREVfUEFUSCAuLi9nKystdjMKLSovCi0jICAgICAgZWxzZQotIyAgICAgICAgZGVmaW5lIF9TVExQX05BVElWRV9DUFBfUlVOVElNRV9JTkNMVURFX1BBVEggLi4vaW5jbHVkZQotIyAgICAgIGVuZGlmCi0jICAgIGVuZGlmCi0jICBlbmRpZgotCi0jZW5kaWYgLyogR05VQ19NSU5PUiA8IDggKi8KLQotI2lmICFkZWZpbmVkIChfU1RMUF9OQVRJVkVfQ19JTkNMVURFX1BBVEgpCi0jICBkZWZpbmUgX1NUTFBfTkFUSVZFX0NfSU5DTFVERV9QQVRIIC4uL2luY2x1ZGUKLSNlbmRpZgotCi0vKiBUdW5lIHNldHRpbmdzIGZvciB0aGUgY2FzZSB3aGVyZSBzdGF0aWMgdGVtcGxhdGUgZGF0YSBtZW1iZXJzIGFyZSBub3QKLSAqIGluc3RhbmlhdGVkIGJ5IGRlZmF1bHQKLSAqLwotI2lmIGRlZmluZWQgKCBfU1RMUF9OT19TVEFUSUNfVEVNUExBVEVfREFUQSApCi0jICBkZWZpbmUgX1NUTFBfU1RBVElDX1RFTVBMQVRFX0RBVEEgMAotIyAgaWYgIWRlZmluZWQgKCBfU1RMUF9XRUFLX0FUVFJJQlVURSApCi0jICAgIGRlZmluZSBfU1RMUF9XRUFLX0FUVFJJQlVURSAwCi0jICBlbmRpZgotIyAgaWZkZWYgX19QVVRfU1RBVElDX0RBVEFfTUVNQkVSU19IRVJFCi0jICAgIGRlZmluZSBfX0RFQ0xBUkVfSU5TVEFOQ0UodHlwZSxpdGVtLGluaXQpIHR5cGUgaXRlbSBpbml0Ci0jICBlbHNlCi0jICAgIGRlZmluZSBfX0RFQ0xBUkVfSU5TVEFOQ0UodHlwZSxpdGVtLGluaXQpCi0jICBlbmRpZgotI2Vsc2UKLSMgIGRlZmluZSBfU1RMUF9TVEFUSUNfVEVNUExBVEVfREFUQSAxCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3N0bC9jb25maWcvX2hwYWNjLmggYi9zdGwvY29uZmlnL19ocGFjYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2M1Y2M0Li4wMDAwMDAwCi0tLSBhL3N0bC9jb25maWcvX2hwYWNjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLy8gU1RMcG9ydCBjb25maWd1cmF0aW9uIGZpbGUKLS8vIEl0IGlzIGludGVybmFsIFNUTHBvcnQgaGVhZGVyIC0gRE8gTk9UIGluY2x1ZGUgaXQgZGlyZWN0bHkKLQotI2RlZmluZSBfU1RMUF9DT01QSUxFUiAiQWNjIgotCi0vLyBzeXN0ZW0gQy1saWJyYXJ5IGRlcGVuZGVudAotI2lmIGRlZmluZWQoX1hPUEVOX1NPVVJDRSkgJiYgKF9YT1BFTl9WRVJTSU9OIC0gMCA+PSA0KQotIyAgZGVmaW5lIF9TVExQX1JBTkQ0OCAxCi0jZW5kaWYKLS8vICMgIGRlZmluZSBfU1RMUF9SQU5ENDggMQotI2RlZmluZSBfU1RMUF9OT19OQVRJVkVfTUJTVEFURV9UICAgICAgMQotI2RlZmluZSBfU1RMUF9IUEFDQ19CUk9LRU5fQlVGRU5EICAgICAgIDEKLSNkZWZpbmUgX1NUTFBfV0NIQVJfSFBBQ0NfRVhDTFVERSAgICAgIDEKLQotLy8gdGhpcyB3YXMgcmVwb3J0ZWQgdG8gaGVscCwganVzdCBhcyB3aXRoIFNVTiBDQyA0LjIKLSNkZWZpbmUgX1NUTFBfSU5MSU5FX1NUUklOR19MSVRFUkFMX0JVRwotCi0vLyBzcGVjaWZpYyBwcm9sb2cgaXMgbmVlZGVkIHRvIHNlbGVjdCBjb3JyZWN0IHRocmVhZHMgaW1wbAotI2RlZmluZSBfU1RMUF9IQVNfU1BFQ0lGSUNfUFJPTE9HX0VQSUxPRwotCi0vLyBIUCBhQ0Mgd2l0aCArbm9laAotI2lmZGVmIF9fSFBBQ0NfTk9FSAotIyAgZGVmaW5lIF9TVExQX0hBU19OT19FWENFUFRJT05TIDEKLSNlbmRpZgotCi0vLyBIUCBjb21waWxlcnMKLS8vIEF0IHRoYXQgcG9pbnQsIHdlIG9ubHkga25vdyB3ZSBhcmUgb24gSFAgKGFuZCBfbm90XyB1c2luZyBnY2MsCi0vLyBhY2NvcmRpbmcgdG8gInN0bGNvbXAuaCIKLQotLy8gX19IUF9hQ0MgaW5kaWNhdGUgSFAgQU5TSSBDKyssIGJ1dCBub3QgYWx3YXlzICgwMy54eCBkb2VzIG5vdAotLy8gZGVmaW5lIGl0IGJlZm9yZSAzLjEzLCBmb3IgZXhhbXBsZSkuCi0vLwotI2lmIGRlZmluZWQgKF9fSFBfYUNDKQotCi0jICBkZWZpbmUgX1NUTFBfTk9fRk9SQ0VfSU5TVEFOVElBVEUKLSMgIGRlZmluZSBfU1RMUF9MT05HX0xPTkcgbG9uZyBsb25nCi0jICBkZWZpbmUgX1NUTFBfTk9fVkVORE9SX1NURExJQl9MCi0KLSMgIGlmIChfX0hQX2FDQyA8PSAzMDAwMCAmJiBfX0hQX2FDQyA+PSAxMjEwMCkKLQotLy9TcGVjaWFsIGtsdWRnZSB0byB3b3JrYXJvdW5kIGJ1ZyBpbiBhQ0MgQS4wMS4yMywgQ1IgSkFHYWM0MDYzNAotIyAgICBpZmRlZiBfU1RMUF9ERUJVRwotc3RhdGljIHZvaWQgX1NUTFBfZHVtbXlfbGl0ZXJhbCgpIHsgY29uc3QgY2hhciAqcCA9ICJ4Ijt9Ci1zdGF0aWMgdm9pZCBfU1RMUF9kdW1teV9saXRlcmFsXzIoKSB7IGNvbnN0IGNoYXIgKnAgPSAiMTIzNDU2Nzg5IjsgfQotc3RhdGljIHZvaWQgX1NUTFBfZHVtbXlfbGl0ZXJhbF8zKCkgeyBjb25zdCBjaGFyICpwID0gIjEyMzQ1NjcwMDAwMDAwMDAwMDAwMDA4OSI7fQotIyAgICBlbmRpZgotCi0jICAgIGRlZmluZSBfU1RMUF9IUF9BQ0MgICAgICAgICAgICAgICAgICAgMDEyMwotIyAgICBkZWZpbmUgX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSCAgICAgICAuLi9pbmNsdWRlCi0jICAgIGRlZmluZSBfU1RMUF9WRU5ET1JfR0xPQkFMX1NURCAgICAgICAgIDEKLSMgICAgZGVmaW5lIF9TVExQX1ZFTkRPUl9HTE9CQUxfQ1NURCAgICAgICAgMQotIyAgICBkZWZpbmUgX1NUTFBfRE9OVF9USFJPV19SQU5HRV9FUlJPUlMgICAxCi0jICAgIGRlZmluZSBfU1RMUF9TVEFUSUNfQ09OU1RfSU5JVF9CVUcgMQotIyAgICBpZiAoX19IUF9hQ0MgIDwgMTI3MDApCi0vL25ldyBmbGFnOiBvbiBtb3N0IEhQIGNvbXBpbGVycyBjd2NoYXIgaXMgbWlzc2luZwotIyAgICAgIGRlZmluZSBfU1RMUF9OT19DV0NIQVIKLSMgICAgZW5kaWYKLQotIyAgICBkZWZpbmUgX1NUTFBfRk9SQ0VfQUxMT0NBVE9SUyh0LGEpIFwKLSAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2NfdHJhaXRzPHQsYT46Ol9PcmlnIF9TVExQX2R1bW15X3R5cGUxO1wKLSAgdHlwZWRlZiB0eXBlbmFtZSBfU1RMUF9kdW1teV90eXBlMTo6IF9TVExQX1RFTVBMQVRFIHJlYmluZDx0Pjo6b3RoZXIgX1NUTFBfZHVtbXlfdHlwZTI7Ci0KLSMgIGVuZGlmIC8qIDEyMyAqLwotCi0vLyBsYXRlc3QgdmVyc2lvbiBhbmQgdXAKLSMgIGlmIChfX0hQX2FDQyA+PSAzMjUwMCApCi0jICAgIGRlZmluZSBfU1RMUF9IUF9BQ0MgICAgICAgICAgICAgICAgICAgMDMyNQotCi0jICAgIGRlZmluZSBfU1RMUF9VU0VfTkVXX0NfSEVBREVSUwotCi0jICAgIGRlZmluZSBfU1RMUF9GT1JDRV9BTExPQ0FUT1JTKHQsYSkgXAotICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY190cmFpdHM8dCxhPjo6X09yaWcgX1NUTFBfZHVtbXlfdHlwZTE7XAotICB0eXBlZGVmIHR5cGVuYW1lIF9TVExQX2R1bW15X3R5cGUxOjogX1NUTFBfVEVNUExBVEUgcmViaW5kPHQ+OjpvdGhlciBfU1RMUF9kdW1teV90eXBlMjsKLQotIyAgICBpZiAhZGVmaW5lZCAoIF9JTkNMVURFX19TVERDX0ExX1NPVVJDRSApIC8vIEhQLVVYIDExaSBvbmx5Ci0jICAgICAgZGVmaW5lIF9TVExQX0hBU19OT19VTklYOThfV0NIQVJfRVhURU5TSU9OUwotIyAgICBlbmRpZgotCi0jICAgIGlmIGRlZmluZWQgKF9IUF9OQU1FU1BBQ0VfU1REKSAvLyBvcHRpb24gLUFBCi0vLyBmcm9tIG5vdywgd2UgaGF2ZSBhIGZ1bGwgc3RhbmRhcmQgbGliIGluIG5hbWVzcGFjZSBzdGQKLS8vCi0vLyAtQUEgaW5kaWNhdGVzIHRoYXQgd2UgYXJlIGNvbXBpbGluZyBhZ2FpbnN0IFJvZ3VlIFdhdmUgMi4yLjEKLS8vIFNUTCBzaGlwcGVkIHdpdGggdGhlIEhQIGFDQyBjb21waWxlci4gLUFBIHRlbGxzIHRoZSBjb21waWxlcgotLy8gdG8gdXNlIHRoZSBTVEwgZGVmaW5lZCBpbiB0aGUgaW5jbHVkZV9zdGQgZGlyZWN0b3J5LgotLy8KLSMgICAgICBkZWZpbmUgX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSCAuLi9pbmNsdWRlX3N0ZAotCi0vLyAjICAgICAgZGVmaW5lIF9TVExQX0hQQUNDX09OTFlfTkFUSVZFX1NUUklORyAxIC8vIFNUTFBvcnQgX3N0cmluZy5jIGluY2x1ZGVzIDxsb2NhbGU+Ci0jICAgICAgZGVmaW5lIF9TVExQX0hQX0FDQ19DT01QQVQgICAgICAgICAgICAtMQotIyAgICBlbHNlIC8vIG9wdGlvbiAtQWEKLSMgICAgICBkZWZpbmUgX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSCAgICAgICAuLi9pbmNsdWRlCi0jICAgICAgZGVmaW5lIF9TVExQX1ZFTkRPUl9HTE9CQUxfU1REICAgICAgICAgMQotIyAgICAgIGRlZmluZSBfU1RMUF9WRU5ET1JfR0xPQkFMX0NTVEQgICAgICAgIDEKLSMgICAgICBkZWZpbmUgX1NUTFBfRE9OVF9USFJPV19SQU5HRV9FUlJPUlMgICAxCi0jICAgIGVuZGlmIC8qIF9OQU1FU1BBQ0VfU1REICovCi0jICBlbmRpZgotCi0jICBpZiAoX19IUF9hQ0MgPj0gMzE0MDAgJiYgX19IUF9hQ0MgPCAzMjUwMCkKLSMgICAgZGVmaW5lIF9TVExQX0hQX0FDQyAwMzE0Ci0KLSMgICAgZGVmaW5lIF9TVExQX0ZPUkNFX0FMTE9DQVRPUlModCxhKSBcCi10eXBlZGVmIHR5cGVuYW1lIF9BbGxvY190cmFpdHM8dCxhPjo6X09yaWcgX1NUTFBfZHVtbXlfdHlwZTE7XAotdHlwZWRlZiB0eXBlbmFtZSBfU1RMUF9kdW1teV90eXBlMTo6IF9TVExQX1RFTVBMQVRFIHJlYmluZDx0Pjo6b3RoZXIgX1NUTFBfZHVtbXlfdHlwZTI7Ci0jICAgIGRlZmluZSBfU1RMUF9OT19DV0NIQVIKLSMgICAgaWYgZGVmaW5lZCAoX05BTUVTUEFDRV9TVEQpIC8vIG9wdGlvbiAtQUEKLS8vIGZyb20gbm93LCB3ZSBoYXZlIGEgZnVsbCBzdGFuZGFyZCBsaWIgaW4gbmFtZXNwYWNlIHN0ZAotIyAgICAgIGRlZmluZSBfU1RMUF9OQVRJVkVfSU5DTFVERV9QQVRIICAgICAgIC4uL2luY2x1ZGVfc3RkCi0vLyMgICAgICBkZWZpbmUgX1NUTFBfSFBBQ0NfT05MWV9OQVRJVkVfU1RSSU5HIDEgLy8gU1RMUG9ydCBfc3RyaW5nLmMgaW5jbHVkZXMgPGxvY2FsZT4KLSMgICAgICBkZWZpbmUgX1NUTFBfSFBfQUNDX0NPTVBBVCAgICAgICAgICAgIC0xCi0jICAgIGVsc2UgLy8ga2luZCBvZiBjb21wYXRpYmlsaXR5IG1vZGUKLSMgICAgICAgZGVmaW5lIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEggICAgICAgLi4vaW5jbHVkZQotIyAgICAgIGRlZmluZSBfU1RMUF9WRU5ET1JfR0xPQkFMX1NURCAgICAgICAgIDEKLSMgICAgICBkZWZpbmUgX1NUTFBfVkVORE9SX0dMT0JBTF9DU1REICAgICAgICAxCi0jICAgICAgZGVmaW5lIF9TVExQX0RPTlRfVEhST1dfUkFOR0VfRVJST1JTICAgMQotIyAgICAgIGRlZmluZSBfU1RMUF9OT19ST1BFICAgICAgICAgICAgICAgICAgIDEKLSMgICAgZW5kaWYgLyogX05BTUVTUEFDRV9TVEQgKi8KLSMgIGVuZGlmIC8qIDMxNCAqLwotCi0jICBpZiAoKF9fSFBfYUNDID49IDMwMDAwICYmIF9fSFBfYUNDIDwgMzE0MDApIHx8IChfX0hQX2FDQyA9PSAxKSkgLy8gQS4wMy4xMzogX19IUF9hQ0MgPT0gMQotCi0jICAgIGlmIChfX0hQX2FDQyAhPSAxKQotIyAgICAgIGRlZmluZSBfU1RMUF9IQVNfTk9fTkVXX0NfSEVBREVSUyAxCi0jICAgIGVuZGlmCi0KLSMgICAgZGVmaW5lIF9TVExQX05PX1FVQUxJRklFRF9GUklFTkRTICAgICAgIDEKLS8vIGFDQyBidWcgPyBuZWVkIGV4cGxpY2l0IGFyZ3Mgb24gY29uc3RydWN0b3JzIG9mIHBhcnRpYWwgc3BlY2lhbGl6ZWQKLS8vIGNsYXNzZXMKLSMgICAgZGVmaW5lIF9TVExQX1BBUlRJQUxfU1BFQ19ORUVEU19URU1QTEFURV9BUkdTIDEKLS8vID8/IGZicCA6IG1heWJlIHByZXNlbnQgaW4gc29tZSB2ZXJzaW9ucyA/Ci0jICAgIGRlZmluZSBfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVfQ0xBU1NFUyAxCi0jICAgIGRlZmluZSBfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVfS0VZV09SRCAxCi0vLyA8ZXhjZXB0aW9uPiBhbmQgc3R1ZmYgaXMgaW4gZ2xvYmFsIG5hbWVzcGFjZQotIyAgICBkZWZpbmUgX1NUTFBfVkVORE9SX0dMT0JBTF9FWENFUFRfU1RECi0vLyBmYnAgOiBtb3ZlZCBoZXJlCi0jICAgIGRlZmluZSBfU1RMUF9WRU5ET1JfR0xPQkFMX0NTVEQgICAgICAgIDEKLS8vICMgICAgIGRlZmluZSBfSU5DTFVERV9IUFVYX1NPVVJDRQotIyAgICBkZWZpbmUgX1hQRzQKLSMgICAgZGVmaW5lIF9JTkNMVURFX1hPUEVOX1NPVVJDRQotIyAgICBkZWZpbmUgX0lOQ0xVREVfQUVTX1NPVVJDRQotIyAgZW5kaWYgLyogPCAzMTQgKi8KLSMgIGlmIF9fSFBfYUNDID09IDEKLSMgICAgZGVmaW5lIF9TVExQX0JST0tFTl9VU0lOR19JTl9DTEFTUwotIyAgICBkZWZpbmUgX1NUTFBfVVNJTkdfQkFTRV9NRU1CRVIKLSMgICAgZGVmaW5lIF9TVExQX05PX0NXQ0hBUgotLy8gIyAgICAgZGVmaW5lIF9TVExQX05PX1dDSEFSX1QgMQotIyAgZW5kaWYKLSNlbmRpZiAvKiBIUF9BQ0MgKi8KLQotLy8KLSNpZm5kZWYgX19IUF9hQ0MKLSMgIGRlZmluZSBfU1RMUF9OQVRJVkVfSU5DTFVERV9QQVRIIC4uL0NDCi0jICBkZWZpbmUgX1NUTFBfTkFUSVZFX0NfSU5DTFVERV9QQVRIIC4uL2luY2x1ZGUKLS8vIGl0IGlzIEhQJ3Mgb2xkIGNmcm9udC1iYXNlZCBjb21waWxlci4KLSMgIGRlZmluZSBfU1RMUF9OT19CT09MIDEKLS8vICMgIGRlZmluZSBfU1RMUF9ET05UX1VTRV9CT09MX1RZUEVERUYgMQotIyAgZGVmaW5lIF9TVExQX05PX05FV19ORVdfSEVBREVSIDEKLSMgIGRlZmluZSBfU1RMUF9MSU1JVEVEX0RFRkFVTFRfVEVNUExBVEVTIDEKLSMgIGRlZmluZSBfU1RMUF9OT19TSUdORURfQlVJTFRJTlMKLSMgIGRlZmluZSBfU1RMUF9IQVNfTk9fTkFNRVNQQUNFUyAxCi0jICBkZWZpbmUgX1NUTFBfTkVFRF9UWVBFTkFNRSAxCi0jICBkZWZpbmUgX1NUTFBfTkVFRF9FWFBMSUNJVCAxCi0jICBkZWZpbmUgX1NUTFBfTk9fRVhDRVBUSU9OX1NQRUMgMQotIyAgZGVmaW5lIF9TVExQX05PTlRFTVBMX0JBU0VfTUFUQ0hfQlVHIDEKLSMgIGRlZmluZSBfU1RMUF9OT19BUlJPV19PUEVSQVRPUiAxCi0jICBkZWZpbmUgX1NUTFBfQkFTRV9NQVRDSF9CVUcKLSMgIGRlZmluZSBfU1RMUF9CQVNFX1RZUEVERUZfT1VUU0lERV9CVUcgMQotIyAgZGVmaW5lIF9TVExQX05PX05FV19TVFlMRV9DQVNUUyAxCi0vLyAjICBkZWZpbmUgX1NUTFBfTk9fV0NIQVJfVCAxCi0vLyAjICBkZWZpbmUgX1NUTFBfTE9OR19MT05HIGxvbmcgbG9uZwotIyAgZGVmaW5lIF9TVExQX05FRURfTVVUQUJMRSAxCi0jICBkZWZpbmUgX1NUTFBfTk9fUEFSVElBTF9TUEVDSUFMSVpBVElPTl9TWU5UQVggMQotIyAgZGVmaW5lIF9TVExQX05PX0JBRF9BTExPQyAxCi0jICBkZWZpbmUgX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFUyAxCi0jICBkZWZpbmUgX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFX0NMQVNTRVMgMQotIyAgZGVmaW5lIF9TVExQX05PX01FTUJFUl9URU1QTEFURV9LRVlXT1JEIDEKLSMgIGRlZmluZSBfU1RMUF9OT19GUklFTkRfVEVNUExBVEVTIDEKLSMgIGRlZmluZSBfU1RMUF9OT19RVUFMSUZJRURfRlJJRU5EUyAxCi0jICBkZWZpbmUgX1NUTFBfTk9fQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTiAxCi0jICBkZWZpbmUgX1NUTFBfTk9fRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSIDEKLSMgIGRlZmluZSBfU1RMUF9NRU1CRVJfUE9JTlRFUl9QQVJBTV9CVUcgMQotIyAgZGVmaW5lIF9TVExQX05PTl9UWVBFX1RNUExfUEFSQU1fQlVHIDEKLSMgIGRlZmluZSBfU1RMUF9OT19ERUZBVUxUX05PTl9UWVBFX1BBUkFNIDEKLS8vICMgIGRlZmluZSBfU1RMUF9OT19NRVRIT0RfU1BFQ0lBTElaQVRJT04gMQotIyAgZGVmaW5lIF9TVExQX05PX0VYUExJQ0lUX0ZVTkNUSU9OX1RNUExfQVJHUyAxCi0jICBkZWZpbmUgX1NUTFBfTk9fRVhDRVBUSU9OX0hFQURFUiAxCi0jICBkZWZpbmUgX1NUTFBfREVGX0NPTlNUX1BMQ1RfTkVXX0JVRyAxCi0jICBkZWZpbmUgX1NUTFBfREVGX0NPTlNUX0RFRl9QQVJBTV9CVUcgMQotIyAgZGVmaW5lIF9TVExQX0hBU19OT19ORVdfQ19IRUFERVJTIDEKLS8vICMgIGRlZmluZSBfU1RMUF9TVEFUSUNfQ09OU1RfSU5JVF9CVUcgMQotLy8gIyAgZGVmaW5lIF9TVExQX1RIUk9XX1JFVFVSTl9CVUcgMQotLy8gIyAgZGVmaW5lIF9TVExQX0xJTktfVElNRV9JTlNUQU5USUFUSU9OIDEKLS8vICMgIGRlZmluZSBfU1RMUF9OT19URU1QTEFURV9DT05WRVJTSU9OUyAxCi0jICBkZWZpbmUgX1NUTFBfTk9fVFlQRUlORk8gMQotIyAgZGVmaW5lIF9TVExQX1dDSEFSX1RfSVNfVVNIT1JUIDEKLQotI2VuZGlmIC8qIGNmcm9udCAqLwpkaWZmIC0tZ2l0IGEvc3RsL2NvbmZpZy9faHB1eC5oIGIvc3RsL2NvbmZpZy9faHB1eC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTY3YzA4Li4wMDAwMDAwCi0tLSBhL3N0bC9jb25maWcvX2hwdXguaAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSNpZm5kZWYgX19zdGxfY29uZmlnX19ocHV4X2gKLSNkZWZpbmUgX19zdGxfY29uZmlnX19ocHV4X2gKLQotI2RlZmluZSBfU1RMUF9QTEFURk9STSAiSFAgVW5peCIKLQotI2lmZGVmIF9fR05VQ19fCi0jICBkZWZpbmUgX1NUTFBfTk9fV0NIQVJfVAotIyAgZGVmaW5lIF9TVExQX05PX0xPTkdfRE9VQkxFCi0jZW5kaWYKLQotI2VuZGlmIC8qIF9fc3RsX2NvbmZpZ19faHB1eF9oICovCmRpZmYgLS1naXQgYS9zdGwvY29uZmlnL19pYm0uaCBiL3N0bC9jb25maWcvX2libS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmM1MDRjLi4wMDAwMDAwCi0tLSBhL3N0bC9jb25maWcvX2libS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qIFNUTHBvcnQgY29uZmlndXJhdGlvbiBmaWxlCi0gKiBJdCBpcyBpbnRlcm5hbCBTVExwb3J0IGhlYWRlciAtIERPIE5PVCBpbmNsdWRlIGl0IGRpcmVjdGx5Ci0gKi8KLQotI2lmIGRlZmluZWQgKF9fSUJNQ1BQX18pIHx8IGRlZmluZWQgKF9fSUJNQ19fKQotIyAgZGVmaW5lIF9TVExQX0NPTVBJTEVSICJWaXN1YWwgQWdlIEMrKyIKLSNlbGlmIGRlZmluZWQgKF9feGxDX18pCi0jICBkZWZpbmUgX1NUTFBfQ09NUElMRVIgInhsYyIKLSNlbHNlCi0jICBlcnJvciAiVW5rbm93biBjb21waWxlciIKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoX19JQk1DUFBfXykgfHwgKF9fSUJNQ1BQX18gPCA1MDApCi0jIGRlZmluZSBfU1RMUF9IQVNfTk9fTkVXX0NfSEVBREVSUyAxCi0jZW5kaWYKLQotLyogc3RyaW5nIGxpdGVyYWwgcHJvYmxlbSwgc2FtZSBhcyB3aXRoIFNVTiBhbmQgYUNDICovCi0jIGRlZmluZSBfU1RMUF9JTkxJTkVfU1RSSU5HX0xJVEVSQUxfQlVHIDEKLSMgZGVmaW5lIF9TVExQX0hBU19OQVRJVkVfRkxPQVRfQUJTCi0KLSMgZGVmaW5lIF9TVExQX0RFRl9DT05TVF9QTENUX05FV19CVUcgMQotIyBkZWZpbmUgX1NUTFBfREVGX0NPTlNUX0RFRl9QQVJBTV9CVUcgMQotCi0KLSMgaWZkZWYgX19JQk1DUFBfXwotIyAgZGVmaW5lIF9TVExQX0hBU19TUEVDSUZJQ19QUk9MT0dfRVBJTE9HCi0jIGVuZGlmCi0KLS8qICMgIGlmICggZGVmaW5lZCAoX19NVUxUSV9fKSAmJiBkZWZpbmVkIChfX1dJTkRPV1NfXykpCi0gKiAjICAgZGVmaW5lICBfU1RMUF9XSU4zMlRIUkVBRFMgMSAgICAgICAgICAgT25seSBWaXN1YWwgQWdlIDMuNSBmb3IgV2luZG93cwotICogIyAgZW5kaWYKLSAqLwotCi0jICBpZiAoIGRlZmluZWQgKF9fTVVMVElfXykgJiYgZGVmaW5lZCAoX19PUzJfXykpCi0jICAgZGVmaW5lIF9TVExQX09TMlRIUkVBRFMgMQotIyAgZW5kaWYKLQotLyogX19URU1QSU5DX18gaXMgc2V0IHdoZW4gL0Z0KyBvcHRpb24gaXMgdXNlZCAqLwotIyAgaWZkZWYgX19URU1QSU5DX18KLSMgICAgZGVmaW5lIF9TVExQX0xJTktfVElNRV9JTlNUQU5USUFUSU9OIDEKLSMgIGVuZGlmCi0KLSMgaWYgZGVmaW5lZCAoX19NVlNfXykKLS8qIGxvbmcgbG9uZyBzdXBwb3J0IGlzIGJ1Z2d5IC0gcmVwb3J0ZWQgYnkgVGlubnkgTmcKLSAqICMgIGlmIF9fRVhURU5ERURfXyAmJiBfX0NPTVBJTEVSX1ZFUl9fID49IDB4MjIwNjAwMDAKLSAqICMgICBkZWZpbmUgX1NUTFBfTE9OR19MT05HIGxvbmcgbG9uZwotICogIyAgZW5kaWYKLSAqLwotLyogYm9yaXMgOiBoc3Rhc2ggcmVwb3J0ZWQgaXQgY2FuIGJlIHRyZWF0ZWQgbGlrZSBVTklYICovCi0jICBkZWZpbmUgX1NUTFBfVU5JWCAxCi0jICBkZWZpbmUgX1NUTFBfTk9fVFlQRUlORk8gMQotIyAgdW5kZWYgX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSAotIyAgZGVmaW5lIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEggL3Vzci9scHAvaW9jbGliL2luY2x1ZGUKLS8qIHNhbWUgZm9yIEMgaGVhZGVycyBsaWtlIDxzdHJpbmcuaD4gKi8KLSMgIHVuZGVmIF9TVExQX05BVElWRV9DX0lOQ0xVREVfUEFUSAotIyAgZGVmaW5lIF9TVExQX05BVElWRV9DX0lOQ0xVREVfUEFUSCAvdXNyL2luY2x1ZGUKLSMgIGRlZmluZSBfU1RMUF9OQVRJVkVfQ1BQX1JVTlRJTUVfSU5DTFVERV9QQVRIIC91c3IvaW5jbHVkZQotCi0jIGVsaWYgKGRlZmluZWQgKF9fV0lORE9XU19fKSB8fCBkZWZpbmVkIChfQUlYKSB8fCBkZWZpbmVkIChfX09TMl9fKSApICYmIChfX0lCTUNQUF9fID49IDM1MCkKLQotIyAgZGVmaW5lIF9TVExQX0xPTkdfTE9ORyBsb25nIGxvbmcKLQotI2VuZGlmCi0KLSNpZiAhKCBkZWZpbmVkKCBfX3hsQ19fICkgJiYgX194bENfXyA+PSAweDUwMCApCi0KLS8qIEFJWCB4bEMgMy4xICwgMy4wLjEgPT0weDMwMQotICogVmlzdWFsIEFnZSBDKysgMy54Ci0gKiBPUy0zOTAgQysrCi0gKiBmYnAgOiBzaG91bGQgYmUgbW9yZSB2ZXJzaW9uLXNwZWNpZmljIQotICovCi0KLSMgIGRlZmluZSBfU1RMUF9OT19CT09MIDEKLSMgIGRlZmluZSBfU1RMUF9ET05UX1VTRV9CT09MX1RZUEVERUYgMQotIyAgZGVmaW5lIF9TVExQX0xJTUlURURfREVGQVVMVF9URU1QTEFURVMgMQotIyAgZGVmaW5lIF9TVExQX0hBU19OT19OQU1FU1BBQ0VTIDEKLSMgIGRlZmluZSBfU1RMUF9ORUVEX1RZUEVOQU1FIDEKLSMgIGRlZmluZSBfU1RMUF9ORUVEX0VYUExJQ0lUIDEKLSMgIGRlZmluZSBfU1RMUF9OT19BUlJPV19PUEVSQVRPUiAxCi0jICBkZWZpbmUgX1NUTFBfTk9fTkVXX1NUWUxFX0NBU1RTIDEKLSMgIGRlZmluZSBfU1RMUF9OT19XQ0hBUl9UIDEKLSMgIGRlZmluZSBfU1RMUF9ORUVEX01VVEFCTEUgMQotIyAgZGVmaW5lIF9TVExQX05PX1BBUlRJQUxfU1BFQ0lBTElaQVRJT05fU1lOVEFYIDEKLSMgIGRlZmluZSBfU1RMUF9OT19CQURfQUxMT0MgMQotCi0jICBkZWZpbmUgX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFUyAxCi0jICBkZWZpbmUgX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFX0NMQVNTRVMgMQotIyAgZGVmaW5lIF9TVExQX05PX01FTUJFUl9URU1QTEFURV9LRVlXT1JEIDEKLSMgIGRlZmluZSBfU1RMUF9OT19GUklFTkRfVEVNUExBVEVTIDEKLSMgIGRlZmluZSBfU1RMUF9OT19RVUFMSUZJRURfRlJJRU5EUyAxCi0jICBkZWZpbmUgX1NUTFBfTk9fQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTiAxCi0jICBkZWZpbmUgX1NUTFBfTk9fRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSIDEKLQotIyAgZGVmaW5lIF9TVExQX05PX0RFRkFVTFRfTk9OX1RZUEVfUEFSQU0gMQotIyAgZGVmaW5lIF9TVExQX05PX01FVEhPRF9TUEVDSUFMSVpBVElPTiAxCi0jICBkZWZpbmUgX1NUTFBfTk9fRVhQTElDSVRfRlVOQ1RJT05fVE1QTF9BUkdTIDEKLSMgIGRlZmluZSBfU1RMUF9OT19FWENFUFRJT05fSEVBREVSIDEKLQotIyAgZGVmaW5lIF9TVExQX05PX05FV19ORVdfSEVBREVSIDEKLQotIyAgaWYgZGVmaW5lZCAoX19PUzJfXykgJiYgKF9fSUJNQ1BQX18gPD0gMzUwKQotIyAgIGRlZmluZSBfU1RMUF9OT19UWVBFSU5GTyAxCi0jICBlbmRpZgotIyAgZGVmaW5lIF9TVExQX05PX05FV19ORVdfSEVBREVSIDEKLQotIyAgZGVmaW5lIF9TVExQX1NUQVRJQ19DT05TVF9JTklUX0JVRyAxCi0vKiAjICBkZWZpbmUgX1NUTFBfVEhST1dfUkVUVVJOX0JVRyAxICovCi0KLQotIyAgZGVmaW5lIF9TVExQX05PX1RFTVBMQVRFX0NPTlZFUlNJT05TIDEKLSMgIGRlZmluZSBfU1RMUF9CQVNFX1RZUEVERUZfT1VUU0lERV9CVUcgMQotCi0vKiBBSVggeGxDLCBWaXN1YWwgQWdlIDMuMCBmb3IgT1MvMiBhbmQgTVMgKi8KLSMgIGRlZmluZSBfU1RMUF9UUklWSUFMX0RFU1RSVUNUT1JfQlVHCi0KLSMgIGRlZmluZSBfU1RMUF9OT05fVFlQRV9UTVBMX1BBUkFNX0JVRyAxCi0jICBkZWZpbmUgX1NUTFBfTk9OVEVNUExfQkFTRV9NQVRDSF9CVUcgMQotCi0jaWYgX19JQk1DUFBfXyA8PSAzNTAKLSMgIGRlZmluZSBfU1RMUF9ORUVEX1VOUkVBQ0hBQkxFX1JFVFVSTiAxCi0jZW5kaWYKLQotI2lmIF9fSUJNQ1BQX18gPCAzNTAKLSMgIGRlZmluZSBfU1RMUF9OT19MT05HX0RPVUJMRSAxCi0jZW5kaWYKLQotI2lmIF9fSUJNQ1BQX18gPj0gMzY1Ci0vKiBkb2VzIG5vdCBoYXZlIG5ldyBDIGhlYWRlcnMsIGJ1dCBoYXMgZGl2KCkgKi8KLSMgIGRlZmluZSBfU1RMUF9MRElWCi0jZW5kaWYKLQotI2VuZGlmIC8qIHhsQyA1ICovCi0KLS8qIGRldGVjdCB4bEM1IGJ5OiAqLwotI2lmIGRlZmluZWQoX19JQk1DUFBfXykgJiYgKDUwMCA8PSBfX0lCTUNQUF9fKSAmJiAoX19JQk1DUFBfXyA8IDcwMCkKLSMgIGRlZmluZSBfU1RMUF9VU0VfRVhDRVBUSU9OUyAxCi0jICBkZWZpbmUgX1NUTFBfU1RBVElDX0NPTlNUX0lOSVRfQlVHIDEKLS8qICNwcmFnbWEgcmVwb3J0KGRpc2FibGUsQ1BQQzE1MDAwMjkpCi0gKiB1bnNpZ25lZCAzMi1iaXQgaW50ZWdlciB0eXBlCi0gKi8KLSMgIGRlZmluZSBfU1RMUF9VSU5UMzJfVCB1bnNpZ25lZCBpbnQKLSMgIGlmIGRlZmluZWQoX1hPUEVOX1NPVVJDRSkgJiYgKF9YT1BFTl9WRVJTSU9OIC0gMCA+PSA0KQotIyAgICBkZWZpbmUgX1NUTFBfUkFORDQ4IDEKLSMgIGVuZGlmCi0vKiAjICBkZWZpbmUgX1NUTFBfUkFORDQ4IDEgKi8KLSNlbmRpZiAvKiBfX0lCTUNQUF9fID09IDUwMCAqLwpkaWZmIC0tZ2l0IGEvc3RsL2NvbmZpZy9faW50ZWwuaCBiL3N0bC9jb25maWcvX2ludGVsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmODAyMmYuLjAwMDAwMDAKLS0tIGEvc3RsL2NvbmZpZy9faW50ZWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8vIFNUTHBvcnQgY29uZmlndXJhdGlvbiBmaWxlCi0vLyBJdCBpcyBpbnRlcm5hbCBTVExwb3J0IGhlYWRlciAtIERPIE5PVCBpbmNsdWRlIGl0IGRpcmVjdGx5Ci0KLSNkZWZpbmUgX1NUTFBfQ09NUElMRVIgIkludGVsIElDTCIKLQotI2RlZmluZSBfU1RMUF9JTVBPUlRfVEVNUExBVEVfS0VZV09SRCBleHRlcm4KLQotLyogWW91IG5lZWQgdG8gdW5kZWYgZm9sbG93aW5nIG1hY3JvIGlmIHlvdXIgaWNsIGluc3RhbGwgaXMgYmluZGVkIHRvIE1TVkMgNgotICogbmF0aXZlIGxpYiBhbmQgeW91IGFyZSBidWlsZGluZyB3aXRoIC9RdmM3IG9yIC9RdmM3LjEgb3IgL1F2Yzggb3B0aW9uLgotICovCi0vKiAjZGVmaW5lIF9TVExQX01TVkNfTElCIDEyMDAgKi8KLS8qIFlvdSBuZWVkIHRvIHVuZGVmIGZvbGxvd2luZyBtYWNybyBpZiB5b3VyIGljbCBpbnN0YWxsIGlzIGJpbmRlZCB0byBNU1ZDIC5OZXQgMjAwMgotICogbmF0aXZlIGxpYiBhbmQgeW91IGFyZSBidWlsZGluZyB3aXRob3V0IGFueSAvUXZjKiBvcHRpb24gb3Igd2l0aCAvUXZjNiBvciAvUXZjNy4xCi0gKiBvciAvUXZjOCBvcHRpb24uCi0gKi8KLS8qICNkZWZpbmUgX1NUTFBfTVNWQ19MSUIgMTMwMCAqLwotLyogWW91IG5lZWQgdG8gdW5kZWYgZm9sbG93aW5nIG1hY3JvIGlmIHlvdXIgaWNsIGluc3RhbGwgaXMgYmluZGVkIHRvIE1TVkMgLk5ldCAyMDAyCi0gKiBuYXRpdmUgbGliIGFuZCB5b3UgYXJlIGJ1aWxkaW5nIHdpdGhvdXQgYW55IC9RdmMqIG9wdGlvbiBvciB3aXRoIC9RdmM2IG9yIC9RdmM3Ci0gKiBvciAvUXZjOCBvcHRpb24uCi0gKi8KLS8qICNkZWZpbmUgX1NUTFBfTVNWQ19MSUIgMTMxMCAqLwotLyogWW91IG5lZWQgdG8gdW5kZWYgZm9sbG93aW5nIG1hY3JvIGlmIHlvdXIgaWNsIGluc3RhbGwgaXMgYmluZGVkIHRvIE1TVkMgLk5ldCAyMDAyCi0gKiBuYXRpdmUgbGliIGFuZCB5b3UgYXJlIGJ1aWxkaW5nIHdpdGhvdXQgYW55IC9RdmMqIG9wdGlvbiBvciB3aXRoIC9RdmM2IG9yIC9RdmM3Ci0gKiBvciAvUXZjNy4xIG9wdGlvbi4KLSAqLwotLyogI2RlZmluZSBfU1RMUF9NU1ZDX0xJQiAxNDAwICovCi0KLSNpbmNsdWRlIDxzdGwvY29uZmlnL19tc3ZjLmg+Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9ET05UX1JFVFVSTl9WT0lEKQotIyAgdW5kZWYgX1NUTFBfRE9OVF9SRVRVUk5fVk9JRAotI2VuZGlmCi0KLSNpZiAoX19JQ0wgPj0gOTAwKQotLyogIyAgdW5kZWYgX1NUTFBfTk9fVU5FWFBFQ1RFRF9FWENFUFRfU1VQUE9SVCAqLwotIyAgaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfVVNFX0VYQ0VQVElPTlMpCi0jICAgIGRlZmluZSBfU1RMUF9OT1RIUk9XIHRocm93KCkKLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmIChfX0lDTCA8PSA4MTApCi0vKiBJZiBtZXRob2Qgc3BlY2lhbGl6YXRpb24gaXMgYWN0aXZhdGVkLCBjb21waWxlciBkbyBub3QgZXhwb3J0IHNvbWUKLSAqIHN5bWJvbHMgYW55bW9yZS4KLSAqLwotIyAgZGVmaW5lIF9TVExQX05PX01FVEhPRF9TUEVDSUFMSVpBVElPTiAxCi0jZW5kaWYKLQotI2lmIChfX0lDTCA+PSA4MDApCi0jICBkZWZpbmUgX1NUTFBfU1RBVElDX0NPTlNUX0lOSVRfQlVHIDEKLSNlbmRpZgotCi0jaWYgKF9fSUNMID49IDQ1MCkKLSMgIGRlZmluZSBfU1RMUF9ETExFWFBPUlRfTkVFRFNfUFJFREVDTEFSQVRJT04gMQotI2VuZGlmCi0KLSNpZiAoX19JQ0wgPCA0NTApCi0vKiAgICBvbmx5IHN0YXRpYyBTVExwb3J0IGxpYiB3b3JrcyBmb3IgSUNMICovCi0jICB1bmRlZiAgX1NUTFBfVVNFX1NUQVRJQ19MSUIKLSMgIHVuZGVmICBfU1RMUF9VU0VfRFlOQU1JQ19MSUIKLSMgIGRlZmluZSBfU1RMUF9VU0VfU1RBVElDX0xJQgotLyogICAgZGlzYWJsZSBob29rIHdoaWNoIG1ha2VzIHRlbXBsYXRlIHN5bWJvbHMgdG8gYmUgc2VhcmNoZWQgZm9yIGluIHRoZSBsaWJyYXJ5ICovCi0jICB1bmRlZiBfU1RMUF9OT19DVVNUT01fSU8KLSNlbmRpZgotCi0jdW5kZWYgIF9TVExQX0xPTkdfTE9ORwotI2RlZmluZSBfU1RMUF9MT05HX0xPTkcgbG9uZyBsb25nCi0KLSNpZiBkZWZpbmVkIChfX2NwbHVzcGx1cykgJiYgKF9fSUNMID49IDkwMCkgJiYgKF9TVExQX01TVkNfTElCIDwgMTMwMCkKLW5hbWVzcGFjZSBzdGQKLXsKLSAgdm9pZCBfU1RMUF9DQUxMIHVuZXhwZWN0ZWQoKTsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3RsL2NvbmZpZy9fa2FpLmggYi9zdGwvY29uZmlnL19rYWkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIyYmVkYi4uMDAwMDAwMAotLS0gYS9zdGwvY29uZmlnL19rYWkuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8vIFNUTHBvcnQgY29uZmlnIGZpbGUgZm9yIEtBSSBDKysgY29tcGlsZXIKLQotI2lmIGRlZmluZWQoX1hPUEVOX1NPVVJDRSkgJiYgKF9YT1BFTl9WRVJTSU9OIC0gMCA+PSA0KQotIyBkZWZpbmUgX1NUTFBfUkFORDQ4IDEKLSNlbmRpZgotCi0jICBpZm5kZWYgX19LQUlfU1RSSUNUIC8qIF9OT19MT05HTE9ORyAqLwotIyAgIGRlZmluZSBfU1RMUF9MT05HX0xPTkcgbG9uZyBsb25nCi0jICBlbmRpZgotCi0jICBpZiAhZGVmaW5lZCAoX19FWENFUFRJT05TKSAmJiAhIGRlZmluZWQgKF9FWENFUFRJT05TKQotIyAgICBkZWZpbmUgX1NUTFBfSEFTX05PX0VYQ0VQVElPTlMKLSMgIGVuZGlmCi0KLSMgaWZuZGVmIF9fQlVJTERJTkdfU1RMUE9SVAotIyAgZGVmaW5lIF9TVExQX0xJTktfVElNRV9JTlNUQU5USUFUSU9OIDEKLSMgZW5kaWYKLQotLy8gdHdvIGxldmVscyBvZiBtYWNyb3MgZG8gbm90IHdvcmsgZ29vZCB3aXRoIGtjYy4KLSMgICBkZWZpbmUgX1NUTFBfTkFUSVZFX0hFQURFUihoZWFkZXIpICAgIDwuLi9pbmNsdWRlLyMjaGVhZGVyPgotIyAgIGRlZmluZSBfU1RMUF9OQVRJVkVfQ19IRUFERVIoaGVhZGVyKSAgICA8Li4vaW5jbHVkZS8jI2hlYWRlcj4KLSMgICBkZWZpbmUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUihoZWFkZXIpICAgIDwuLi9pbmNsdWRlLyMjaGVhZGVyPgotIyAgIGRlZmluZSBfU1RMUF9OQVRJVkVfQ1BQX1JVTlRJTUVfSEVBREVSKGhlYWRlcikgPC4uL2luY2x1ZGUvIyNoZWFkZXI+Ci0KLSMgaWZkZWYgX1dJTjMyCi0jICBkZWZpbmUgX1NUTFBfTUlOSU1VTV9JTVBPUlRfU1RECi0jIGVuZGlmCi0KLS8vIEtBSSBDKysgdXNlcyBFREcgZnJvbnQtZW5kLCBidXQgYXBwYXJlbnRseSBkaWZmZXJlbnQgc3dpdGNoZXMKLS8vICMgIGRlZmluZSBfX0VER19TV0lUQ0hFUyAxCi0KLQotIyAgZGVmaW5lIF9TVExQX1ZFTkRPUl9HTE9CQUxfQ1NURCAxCi0jICBkZWZpbmUgX1NUTFBfVkVORE9SX01CX05BTUVTUEFDRSBzdGQKLQotLy8gYm9yaXMgOiBzb21lIG9mIHRob3NlIG1heSBhbHNvIGFwcGx5IHRvIEtDQyAzLjQKLSMgaWYgX19LQ0NfVkVSU0lPTiA8IDQwMDAKLSMgIGRlZmluZSBfU1RMUF9WRU5ET1JfR0xPQkFMX0VYQ0VQVF9TVEQgMQotCi0jIGVuZGlmCi0KLSMgaWYgZGVmaW5lZCAoX19zZ2kpCi0vLyB0aGlzIHJlcXVpcmVzIHNvbWUgZGlzY3JpbWluYXRpb24gb24gd2hldGhlciB3ZSBhcmUgYWN0dWFsbHkgb24KLS8vIGEgc3lzdGVtIG9mZmljaWFsbHkgc3VwcG9ydGVkIGJ5IEtBSS4KLSMgIGRlZmluZSBfU1RMUF9IQVNfTk9fTkVXX0NfSEVBREVSUyAxCi0jICBpbmNsdWRlIDxzdGFuZGFyZHMuaD4KLSMgZW5kaWYKLQpkaWZmIC0tZ2l0IGEvc3RsL2NvbmZpZy9fbGludXguaCBiL3N0bC9jb25maWcvX2xpbnV4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MmNkOGIuLjAwMDAwMDAKLS0tIGEvc3RsL2NvbmZpZy9fbGludXguaAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLSNpZm5kZWYgX19zdGxfY29uZmlnX19saW51eF9oCi0jZGVmaW5lIF9fc3RsX2NvbmZpZ19fbGludXhfaAotCi0jZGVmaW5lIF9TVExQX1BMQVRGT1JNICJMaW51eCIKLQotI2luY2x1ZGUgPGZlYXR1cmVzLmg+Ci0KLS8qIFRoaXMgaXMgZGVmaW5lZCB3ZXRoZXIgbGlicmFyeSBpbiB1c2UgaXMgZ2xpYmMgb3Igbm90LgotICAgVGhpcyBtYXkgYmUgdHJlYXRlZCBhcyBwcmVzZW5jZSBvZiBHTlUgbGliYyBjb21wYXRpYmxlCi0gICBoZWFkZXIgZmlsZXMgKHRoZXNlIGRlZmluZSBpcyBub3QgcmVhbGx5IGludGVuZGVkIHRvIGNoZWNrCi0gICBmb3IgdGhlIHByZXNlbmNlIG9mIGEgcGFydGljdWxhciBsaWJyYXJ5LCBidXQgcmF0aGVyIGlzIHVzZWQKLSAgIHRvIGRlZmluZSBhbiBJTlRFUkZBQ0UuKSAqLwotI2lmbmRlZiBfU1RMUF9VU0VfR0xJQkMKLSMgIGRlZmluZSBfU1RMUF9VU0VfR0xJQkMgMQotI2VuZGlmCi0KLSNkZWZpbmUgX1NUTFBfVU5JWCAxCi0KLSNpZiBkZWZpbmVkKF9SRUVOVFJBTlQpICYmICFkZWZpbmVkKF9QVEhSRUFEUykKLSMgZGVmaW5lIF9QVEhSRUFEUwotI2VuZGlmCi0KLSNpZmRlZiBfX1VDTElCQ19fIC8qIHVDbGliYyAwLjkuMjcgKi8KLSMgIGRlZmluZSBfU1RMUF9VU0VfVUNMSUJDIDEKLSMgIGlmICFkZWZpbmVkKF9fVUNMSUJDX0hBU19XQ0hBUl9fKQotIyAgICBpZm5kZWYgX1NUTFBfTk9fV0NIQVJfVAotIyAgICAgIGRlZmluZSBfU1RMUF9OT19XQ0hBUl9UCi0jICAgIGVuZGlmCi0jICAgIGlmbmRlZiBfU1RMUF9OT19NQlNUQVRFX1QKLSMgICAgICBkZWZpbmUgX1NUTFBfTk9fTUJTVEFURV9UCi0jICAgIGVuZGlmCi0jICAgIGlmbmRlZiBfU1RMUF9OT19OQVRJVkVfV0lERV9TVFJFQU1TCi0jICAgICAgZGVmaW5lIF9TVExQX05PX05BVElWRV9XSURFX1NUUkVBTVMKLSMgICAgZW5kaWYKLSMgIGVuZGlmIC8qIF9fVUNMSUJDX0hBU19XQ0hBUl9fICovCi0gICAvKiBIbW0sIGJvZ3VzIF9HTElCQ1BQX1VTRV9OQU1FU1BBQ0VTIHNlZW1zIHVuZGVmaW5lZC4uLiAqLwotIyAgZGVmaW5lIF9TVExQX1ZFTkRPUl9HTE9CQUxfQ1NURCAxCi0jICBpZiBkZWZpbmVkKF9TVExQX1JFQUxfTE9DQUxFX0lNUExFTUVOVEVEKQotICAgICAvKiBsb2NhbGUgaW4gdUNsaWJjIGlzIHZlcnkgcmVzdHJpY3RlZCAqLwotICAgICAvKiByZWNoZWNrIGlmIF9fVUNMSUJDX0hBU19MT0NBTEVfXyBkZWZpbmVkLi4uKi8KLSMgICAgdW5kZWYgX1NUTFBfUkVBTF9MT0NBTEVfSU1QTEVNRU5URUQKLSMgIGVuZGlmCi0jZW5kaWYKLQotCi0jaWYgZGVmaW5lZChfUFRIUkVBRFMpCi0jICBkZWZpbmUgX1NUTFBfVEhSRUFEUwotIyAgZGVmaW5lIF9TVExQX1BUSFJFQURTCi0vKgotIyAgaWZuZGVmIF9fVVNFX1VOSVg5OAotIyAgICBkZWZpbmUgX19VU0VfVU5JWDk4Ci0jICBlbmRpZgotKi8KLS8qIFRoaXMgZmVhdHVyZSBleGlzdCBhdCBsZWFzdCBzaW5jZSBnbGliYyAyLjIuNCAqLwotLyogIyAgZGVmaW5lIF9fRklUX1hTSV9USFIgKi8gLyogVW5peCA5OCBvciBYL09wZW4gU3lzdGVtIEludGVyZmFjZXMgRXh0ZW50aW9uICovCi0jICBpZmRlZiBfX1VTRV9YT1BFTjJLCi0vKiBUaGUgSUVFRSBTdGQuIDEwMDMuMWotMjAwMCBpbnRyb2R1Y2VzIGZ1bmN0aW9ucyB0byBpbXBsZW1lbnQgc3BpbmxvY2tzLiAqLwotIyAgIGlmbmRlZiBfX1VDTElCQ19fIC8qIFRoZXJlIGFyZSBubyBzcGlubG9ja3MgaW4gdUNsaWJjIDAuOS4yNyAqLwotIyAgICAgZGVmaW5lIF9TVExQX1VTRV9QVEhSRUFEX1NQSU5MT0NLCi0jICAgZWxzZQotIyAgICAgaWZuZGVmIF9TVExQX0RPTlRfVVNFX1BUSFJFQURfU1BJTkxPQ0sKLSAgICAgICAgLyogaW4gdUNsaWJjICgwLjkuMjYpIHB0aHJlYWRfc3BpbmxvY2sqIGRlY2xhcmVkIGluIGhlYWRlcnMKLSAgICAgICAgICogYnV0IGFic2VudCBpbiBsaWJyYXJ5ICovCi0jICAgICAgIGRlZmluZSBfU1RMUF9ET05UX1VTRV9QVEhSRUFEX1NQSU5MT0NLCi0jICAgICBlbmRpZgotIyAgIGVuZGlmCi0vKiAjICAgZGVmaW5lIF9fRklUX1BTSEFSRURfTVVURVggKi8KLSMgIGVuZGlmCi0jZW5kaWYKLQotLyogRW5kaWFubmVzICovCi0jaW5jbHVkZSA8ZW5kaWFuLmg+Ci0jaWYgIWRlZmluZWQoX19CWVRFX09SREVSKSB8fCAhZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pIHx8ICFkZWZpbmVkKF9fQklHX0VORElBTikKLSMgIGVycm9yICJPbmUgb2YgX19CWVRFX09SREVSLCBfX0xJVFRMRV9FTkRJQU4gYW5kIF9fQklHX0VORElBTiB1bmRlZmluZWQ7IEZpeCBtZSEiCi0jZW5kaWYKLQotI2lmICggX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTiApCi0jICBkZWZpbmUgX1NUTFBfTElUVExFX0VORElBTiAxCi0jZWxpZiAoIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4gKQotIyAgZGVmaW5lIF9TVExQX0JJR19FTkRJQU4gMQotI2Vsc2UKLSMgIGVycm9yICJfX0JZVEVfT1JERVIgbmVpdGhlciBfX0JJR19FTkRJQU4gbm9yIF9fTElUVExFX0VORElBTjsgRml4IG1lISIKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKF9fR05VQ19fIDwgMykKLSMgIGRlZmluZSBfU1RMUF9OT19OQVRJVkVfV0lERV9GVU5DVElPTlMgMQotLyoKLSMgICAgZGVmaW5lIF9TVExQX05PX05BVElWRV9XSURFX1NUUkVBTVMgICAxCi0qLwotI2VuZGlmCi0KLQotI2VuZGlmIC8qIF9fc3RsX2NvbmZpZ19fbGludXhfaCAqLwpkaWZmIC0tZ2l0IGEvc3RsL2NvbmZpZy9fbWFjLmggYi9zdGwvY29uZmlnL19tYWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgwY2M3MS4uMDAwMDAwMAotLS0gYS9zdGwvY29uZmlnL19tYWMuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNkZWZpbmUgX1NUTFBfUExBVEZPUk0gIk1hYyIKZGlmZiAtLWdpdCBhL3N0bC9jb25maWcvX21hY29zeC5oIGIvc3RsL2NvbmZpZy9fbWFjb3N4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMzQ1MmIuLjAwMDAwMDAKLS0tIGEvc3RsL2NvbmZpZy9fbWFjb3N4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNkZWZpbmUgX1NUTFBfUExBVEZPUk0gIk1hYyBPUyBYIgotCi0jaWYgZGVmaW5lZCAoX19CSUdfRU5ESUFOX18pCi0jICBkZWZpbmUgX1NUTFBfQklHX0VORElBTiAxCi0jZWxpZiBkZWZpbmVkIChfX0xJVFRMRV9FTkRJQU5fXykKLSMgIGRlZmluZSBfU1RMUF9MSVRUTEVfRU5ESUFOIDEKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3RsL2NvbmZpZy9fbXN2Yy5oIGIvc3RsL2NvbmZpZy9fbXN2Yy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzUwMzZmLi4wMDAwMDAwCi0tLSBhL3N0bC9jb25maWcvX21zdmMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM1MyArMCwwIEBACi0vKiBTVExwb3J0IGNvbmZpZ3VyYXRpb24gZmlsZQotICogSXQgaXMgaW50ZXJuYWwgU1RMcG9ydCBoZWFkZXIgLSBETyBOT1QgaW5jbHVkZSBpdCBkaXJlY3RseQotICogTWljcm9zb2Z0IFZpc3VhbCBDKysgNi4wLCA3LjAsIDcuMSwgOC4wLCBJQ0wKLSAqLwotCi0jaWYgIWRlZmluZWQgKF9TVExQX0NPTVBJTEVSKQotIyAgZGVmaW5lIF9TVExQX0NPTVBJTEVSICJNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBDKysiCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkIChfX0lDTCkgJiYgIWRlZmluZWQgKF9TVExQX01TVkMpCi0jICBkZWZpbmUgX1NUTFBfTVNWQyBfTVNDX1ZFUgotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfTVNWQ19MSUIpCi0jICBkZWZpbmUgX1NUTFBfTVNWQ19MSUIgX01TQ19WRVIKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX19CVUlMRElOR19TVExQT1JUKSAmJiBkZWZpbmVkIChfTUFOQUdFRCkKLS8qIEJ1aWxkaW5nIGEgbWFuYWdlZCB2ZXJzaW9uIG9mIFNUTHBvcnQgaXMgbm90IHN1cHBvcnRlZCBiZWNhdXNlIHdlIGhhdmVuJ3QKLSAqIGZvdW5kIGEgZ29vZCByZWFzb24gdG8gc3VwcG9ydCBpdC4gSG93ZXZlciwgYnVpbGRpbmcgYSBtYW5hZ2VkIHRyYW5zbGF0aW9uCi0gKiB1bml0IHVzaW5nIFNUTHBvcnQgX2lzXyBzdXBwb3J0ZWQuCi0gKi8KLSMgIGVycm9yIFNvcnJ5IGJ1dCBidWlsZGluZyBhIG1hbmFnZWQgdmVyc2lvbiBvZiBTVExwb3J0IGlzIG5vdCBzdXBwb3J0ZWQuCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9TVExQX1VTSU5HX1BMQVRGT1JNX1NES19DT01QSUxFUikKLS8qIFRoaXMgaXMgYSBzcGVjaWZpYyBzZWN0aW9uIGZvciBjb21waWxlcnMgY29taW5nIHdpdGggcGxhdGZvcm0gU0RLcy4gTmF0aXZlCi0gKiBsaWJyYXJ5IGNvbWluZyB3aXRoIGl0IGlzIGRpZmZlcmVudCBmcm9tIHRoZSBvbmUgY29taW5nIHdpdGggY29tbWVyY2lhbAotICogTVNWQyBjb21waWxlcnMgc28gdGhlcmUgaXMgc29tZSBzcGVjaWZpYyBzZXR0aW5ncy4KLSAqLwotIyAgZGVmaW5lIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEggLi4vY3J0Ci0jICBkZWZpbmUgX1NUTFBfVkVORE9SX0dMT0JBTF9DU1RECi0jICBkZWZpbmUgX1NUTFBfVkVORE9SX1RFUk1JTkFURV9TVEQKLSMgIGRlZmluZSBfU1RMUF9HTE9CQUxfTkVXX0hBTkRMRVIKLSMgIGlmIChfU1RMUF9NU1ZDX0xJQiA8PSAxNDAwKQotLyogV2UgaG9wZSB0aGlzIGJ1ZyB3aWxsIGJlIGZpeGVkIGluIGZ1dHVyZSB2ZXJzaW9ucy4gKi8KLSMgICAgZGVmaW5lIF9TVExQX05FV19ET05UX1RIUk9XX0JBRF9BTExPQyAxCi0jICBlbmRpZgotI2VuZGlmCi0KLSNkZWZpbmUgX1NUTFBfQ0FMTCBfX2NkZWNsCi0KLSNpZm5kZWYgX1NUTFBfTE9OR19MT05HCi0jICBkZWZpbmUgX1NUTFBfTE9OR19MT05HIF9faW50NjQKLSNlbmRpZgotCi0jZGVmaW5lIF9TVExQX1BSQUdNQV9PTkNFCi0KLS8qIFRoZXNlIHN3aXRjaGVzIGRlcGVuZCBvbiBjb21waWxlciBmbGFncy4gV2UgYXJlIGhvcGluZyBoZXJlIHRoYXQgY29tcGlsZXJzCi0gKiBzaW11bGF0aW5nIE1TVkMgYmVoYXZpb3IgdXNlIGlkZW50aWNhbCBtYWNyb3MgdG8gcmVwb3J0IGNvbXBpbGF0aW9uIGNvbnRleHQuCi0gKiBPdGhlcndpc2UgdGhvc2UgbWFjcm9zIHdpbGwgaGF2ZSB0byBiZSB1bmRlZiBpbiBzcGVjaWZpYyBjb21waWxlciBjb25maWd1cmF0aW9uCi0gKiBmaWxlcy4KLSAqLwotI2lmbmRlZiBfQ1BQVU5XSU5ECi0jICBkZWZpbmUgX1NUTFBfRE9OVF9VU0VfRVhDRVBUSU9OUyAxCi0jZW5kaWYKLQotI2lmbmRlZiBfQ1BQUlRUSQotIyAgZGVmaW5lIF9TVExQX05PX1JUVEkgMQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfTVQpICYmICFkZWZpbmVkIChfU1RMUF9OT19USFJFQURTKSAmJiAhZGVmaW5lZCAoX1JFRU5UUkFOVCkKLSMgIGRlZmluZSBfUkVFTlRSQU5UIDEKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQgKF9OQVRJVkVfV0NIQVJfVF9ERUZJTkVEKQotIyAgZGVmaW5lIF9TVExQX1dDSEFSX1RfSVNfVVNIT1JUIDEKLSNlbmRpZgotCi0jZGVmaW5lIF9TVExQX01JTklNVU1fSU1QT1JUX1NURAotI2RlZmluZSBfU1RMUF9OT19WRU5ET1JfU1RETElCX0wgMQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfTVNWQykKLQotI2RlZmluZSBfU1RMUF9OT1JFVFVSTl9GVU5DVElPTiBfX2RlY2xzcGVjKG5vcmV0dXJuKQotCi0vKiBGdWxsIGNvbXBpbGVyIHZlcnNpb24gY29tZXMgZnJvbSBib29zdCBsaWJyYXJ5IGludHJpbnNpY3MuaHBwIGhlYWRlci4gKi8KLSMgIGlmIGRlZmluZWQgKF9NU0NfRlVMTF9WRVIpICYmIChfTVNDX0ZVTExfVkVSID49IDE0MDA1MDIxNSkKLSMgICAgZGVmaW5lIF9TVExQX0hBU19UUklWSUFMX0NPTlNUUlVDVE9SKFQpIF9faGFzX3RyaXZpYWxfY29uc3RydWN0b3IoVCkKLSMgICAgZGVmaW5lIF9TVExQX0hBU19UUklWSUFMX0NPUFkoVCkgX19oYXNfdHJpdmlhbF9jb3B5KFQpCi0jICAgIGRlZmluZSBfU1RMUF9IQVNfVFJJVklBTF9BU1NJR04oVCkgX19oYXNfdHJpdmlhbF9hc3NpZ24oVCkKLSMgICAgZGVmaW5lIF9TVExQX0hBU19UUklWSUFMX0RFU1RSVUNUT1IoVCkgX19oYXNfdHJpdmlhbF9kZXN0cnVjdG9yKFQpCi0jICAgIGRlZmluZSBfU1RMUF9JU19QT0QoVCkgX19pc19wb2QoVCkKLSMgICAgZGVmaW5lIF9TVExQX0hBU19UWVBFX1RSQUlUU19JTlRSSU5TSUNTCi0jICBlbmRpZgotCi0jICBpZm5kZWYgX1NUTFBfTVNWQzUwX0NPTVBBVElCSUxJVFkKLSMgICAgZGVmaW5lIF9TVExQX01TVkM1MF9DT01QQVRJQklMSVRZICAgMQotIyAgZW5kaWYKLQotIyAgZGVmaW5lIF9TVExQX0RMTEVYUE9SVF9ORUVEU19QUkVERUNMQVJBVElPTiAxCi0jICBkZWZpbmUgX1NUTFBfSEFTX1NQRUNJRklDX1BST0xPR19FUElMT0cgMQotCi0vKiAjIGlmbmRlZiBfX0JVSUxESU5HX1NUTFBPUlQKLSAqICMgIGRlZmluZSBfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUIDEKLSAqICMgZW5kaWYKLSAqLwotIyAgaWYgKF9TVExQX01TVkMgPD0gMTQwMSkKLSMgICAgZGVmaW5lIF9TVExQX1NUQVRJQ19DT05TVF9JTklUX0JVRyAgIDEKLSMgIGVuZGlmCi0KLS8qKiBOb3RlOiB0aGUgbWFjcm8gX1NUTFBfTk9fVU5DQVVHSFRfRVhDRVBUX1NVUFBPUlQgaXMgZGVmaW5lZAotdW5jb25kaXRpb25hbGx5IGFuZCB1bmRlZidlZCBoZXJlIHdoZW4gYXBwbGljYWJsZS4gKi8KLSMgIGlmIGRlZmluZWQoVU5ERVJfQ0UpCi0vKiBlVkN4OgotdW5jYXVnaHRfZXhjZXB0aW9uIGlzIGRlY2xhcmVkIGluIHRoZSBTREtzIGRlbGl2ZXJlZCB3aXRoIGVWQzQgKGVWQzMgaXMKLXVua25vd24pIGFuZCB0aGV5IGFsbCByZXNpZGUgaW4gbmFtZXNwYWNlICdzdGQnIHRoZXJlLiBIb3dldmVyLCB0aGV5IGFyZSBub3QKLXBhcnQgb2YgYW55IGxpYiBzbyBsaW5raW5nIGZhaWxzLiBXaGVuIHVzaW5nIFZDOCB0byBjcm9zc2NvbXBpbGUgZm9yIENFIDUgb24KLWFuIEFSTVY0SSwgdGhlIHVuY2F1Z2h0X2V4Y2VwdGlvbiB0ZXN0IGZhaWxzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgd3JvbmcKLXZhbHVlLiAqLwotIyAgZWxzZQotLyogVkN4OgotVGhlc2UgYXJlIHByZXNlbnQgYXQgbGVhc3Qgc2luY2UgVkM2LCBidXQgdGhlIHVuY2F1Z2h0X2V4Y2VwdGlvbigpIG9mIFZDNiBpcwotYnJva2VuLCBpdCByZXR1cm5zIHRoZSB3cm9uZyB2YWx1ZSBpbiB0aGUgdW5pdHRlc3RzLiA3LjEgYW5kIGxhdGVyIHNlZW0gdG8KLXdvcmssIDcuMCBpcyBzdGlsbCB1bmtub3duICh3ZSBhc3N1bWUgaXQgd29ya3MgdW50aWwgbmVnYXRpdmUgcmVwb3J0KS4gKi8KLSMgICAgaWYgKF9TVExQX01TVkMgPj0gMTMwMCkvLyBWQzcgYW5kIGxhdGVyCi0jICAgICAgdW5kZWYgX1NUTFBfTk9fVU5DQVVHSFRfRVhDRVBUX1NVUFBPUlQKLSMgICAgICBpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9VU0VfRVhDRVBUSU9OUykKLSMgICAgICAgIGRlZmluZSBfU1RMUF9OT1RIUk9XIHRocm93KCkKLSMgICAgICBlbmRpZgotIyAgICBlbmRpZgotIyAgZW5kaWYKLQotIyAgaWYgKF9TVExQX01TVkMgPD0gMTMwMCkKLSMgICAgZGVmaW5lIF9TVExQX05PX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04gMQotIyAgICBkZWZpbmUgX1NUTFBfTk9fRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSIDEKLS8qIFRoZXJlIGlzIG5vIHBhcnRpYWwgc3BlYywgYW5kIE1TVkMgYnJlYWtzIG9uIHNpbXVsYXRpbmcgaXQgZm9yIGl0ZXJhdG9yX3RyYWl0cyBxdWVyaWVzICovCi0jICAgIGRlZmluZSBfU1RMUF9VU0VfT0xEX0hQX0lURVJBVE9SX1FVRVJJRVMKLSMgICAgZGVmaW5lIF9TVExQX05PX1RZUEVOQU1FX0lOX1RFTVBMQVRFX0hFQURFUgotIyAgICBkZWZpbmUgX1NUTFBfTk9fTUVUSE9EX1NQRUNJQUxJWkFUSU9OIDEKLSMgICAgZGVmaW5lIF9TVExQX0RFRl9DT05TVF9QTENUX05FV19CVUcgMQotIyAgICBkZWZpbmUgX1NUTFBfTk9fVFlQRU5BTUVfT05fUkVUVVJOX1RZUEUgMQotLyogVkMrKyBjYW5ub3QgaGFuZGxlIGRlZmF1bHQgYWxsb2NhdG9yIGFyZ3VtZW50IGluIHRlbXBsYXRlIGNvbnN0cnVjdG9ycyAqLwotIyAgICBkZWZpbmUgX1NUTFBfTkVFRFNfRVhUUkFfVEVNUExBVEVfQ09OU1RSVUNUT1JTCi0jICAgIGRlZmluZSBfU1RMUF9OT19RVUFMSUZJRURfRlJJRU5EUyAgICAxCi0jICAgIGRlZmluZSBfU1RMUF9OT19GUklFTkRfVEVNUExBVEVTCi0vKiBGYWlscyB0byBwcm9wZXJseSByZXNvbHZlIGNhbGwgdG8gc2luKCkgZnJvbSB3aXRoaW4gc2luKCkgKi8KLSMgIGVuZGlmCi0KLSMgIGlmIChfU1RMUF9NU1ZDIDwgMTMwMCkKLSMgICAgZGVmaW5lIF9TVExQX05PX0lFQzU1OV9TVVBQT1JUIDEKLSMgIGVuZGlmCi0KLSMgIGlmIChfU1RMUF9NU1ZDIDwgMTMwMCkgLyogaW5jbHVkaW5nIE1TVkMgNi4wICovCi0jICAgIGRlZmluZSBfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVfS0VZV09SRCAxCi0jICAgIGRlZmluZSBfU1RMUF9ET05UX1NVUFBPUlRfUkVCSU5EX01FTUJFUl9URU1QTEFURSAxCi0jICBlbmRpZgotCi0jICBpZiAoX1NUTFBfTVNWQyA+PSAxMjAwKQotIyAgICBkZWZpbmUgX1NUTFBfSEFTX05BVElWRV9GTE9BVF9BQlMgMQotIyAgZW5kaWYKLQotLy8gVE9ETzogc29tZSBlVkM0IGNvbXBpbGVycyByZXBvcnQgX01TQ19WRVIgMTIwMSBvciAxMjAyLCB3aGljaCBjYXRlZ29yeSBkbyB0aGV5IGJlbG9uZyB0bz8KLSMgIGlmIChfU1RMUF9NU1ZDID4gMTIwMCkgJiYgKF9TVExQX01TVkMgPCAxMzEwKQotIyAgICBkZWZpbmUgX1NUTFBfTk9fTU9WRV9TRU1BTlRJQwotIyAgZW5kaWYKLQotIyAgaWYgKF9TVExQX01TVkMgPCAxMzAwKQotLyogVE9ETzogcmVtb3ZlIHRoaXMgaWYgaXQgaXMgaGFuZGxlZCBhbmQgZG9jdW1lbnRlZCBlbHNld2hlcmUKLSAqIGR1bXM6IFZDNiBkbyBub3QgaGFuZGxlIGNvcnJlY3RseSBtZW1iZXIgdGVtcGxhdGVzIG9mIGNsYXNzIHRoYXQgYXJlIGV4cGxpY2l0ZWx5Ci0gKiBpbnN0YW5jaWF0ZWQgdG8gYmUgZXhwb3J0ZWQuIFRoZXJlIGlzIGEgd29ya2Fyb3VuZCwgc2VwZXJhdGUgdGhlIG5vbiB0ZW1wbGF0ZSBtZXRob2RzCi0gKiBmcm9tIHRoZSB0ZW1wbGF0ZSBvbmVzIHdpdGhpbiAyIGRpZmZlcmVudCBjbGFzc2VzIGFuZCBvbmx5IGV4cG9ydCB0aGUgbm9uIHRlbXBsYXRlIG9uZS4KLSAqIEl0IGlzIGltcGxlbWVudGVkIGZvciBiYXNpY19zdHJpbmcgYW5kIGxvY2FsZSBhdCB0aGUgd3JpdGluZyBvZiB0aGlzIG5vdGUuCi0gKiBIb3dldmVyIHRoaXMgcHJvYmxlbSBob3Mgbm90ICBiZWVuIGNvbnNpZGVyZWQgYXMgaW1wb3J0YW50IGVub3VnaCB0byByZW1vdmUgdGVtcGxhdGUgbWVtYmVyCi0gKiBtZXRob2RzIGZvciBvdGhlciBjbGFzc2VzLiBNb3Jlb3ZlciBCb29zdCAod3d3LmJvb3N0Lm9yZykgcmVxdWlyZWQgaXQgdG8gYmUgZ3JhbnRlZC4KLSAqIFRoZSB3b3JrYXJvdW5kIGlzIGFjdGl2YXRlZCB0aGFua3MgdG8gdGhlIF9TVExQX1VTRV9NU1ZDNl9NRU1fVF9CVUdfV09SS0FST1VORCBtYWNybyBkZWZpbmVkCi0gKiBsYXRlciBpbiB0aGlzIGNvbmZpZyBmaWxlLgotICovCi0vKgotIyAgICBpZiBkZWZpbmVkIChfRExMKQotIyAgICAgIGRlZmluZSBfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVTIDEKLSMgICAgZW5kaWYKLSovCi0KLS8qIEJvcmlzIDogbm90IGRlZmluaW5nIHRoaXMgbWFjcm8gZm9yIFNQNSBjYXVzZXMgb3RoZXIgcHJvYmxlbXMgKi8KLS8qIyAgICBpZiAhZGVmaW5lZCAoX01TQ19GVUxMX1ZFUikgfHwgKF9NU0NfRlVMTF9WRVIgPCAxMjAwODgwNCApICovCi0jICAgIGRlZmluZSBfU1RMUF9OT19VU0lOR19GT1JfR0xPQkFMX0ZVTkNUSU9OUyAxCi0vKiMgICAgZW5kaWYgKi8KLSMgICAgZGVmaW5lIF9TVExQX0RPTlRfVVNFX0JPT0xfVFlQRURFRiAxCi0jICAgIGRlZmluZSBfU1RMUF9ET05UX1JFVFVSTl9WT0lEIDEKLSMgIGVuZGlmCi0KLS8qCi0gKiBNU1ZDNiBpcyBrbm93biB0byBoYXZlIG1hbnkgdHJvdWJsZSB3aXRoIG5hbWVzcGFjZSBtYW5hZ2VtZW50IGJ1dAotICogTVNWQyAuTmV0IDIwMDMgYW5kIDIwMDUgYWxzbyBoYXZlIGEgYnVnIGRpZmZpY3VsdCB0byByZXByb2R1Y2Ugd2l0aG91dAotICogU1RMcG9ydDoKLSAqIG5hbWVzcGFjZSBzdGxwX3N0ZCB7Ci0gKiAgIHR5cGVkZWYgaW50IGZvb19pbnQ7Ci0gKiB9Ci0gKiAjaW5jbHVkZSA8bWFwPgotICogY29uc3QgZm9vX2ludCBiYXIgPSAwOwotICoKLSAqIEFzIHlvdSBjYW4gc2VlIGZvbyBpcyBhdmFpbGFibGUgd2l0aG91dCBuYW1lc3BhY2Ugc3BlY2lmaWNhdGlvbiBhcyBpZgotICogYSB1c2luZyBuYW1lc3BhY2Ugc3RscF9zdGQgaGFzIGJlZW4gcGVyZm9ybWVkLiBEZWZpbmluZyBfU1RMUF9VU0lOR19OQU1FU1BBQ0VfQlVHCi0gKiByZXN0b3JlIHRoZSBleHBlY3RlZCBjb21waWxhdGlvbiBlcnJvci4KLSAqLwotIyAgZGVmaW5lIF9TVExQX1VTSU5HX05BTUVTUEFDRV9CVUcgMQotCi0jICBpZiAoX1NUTFBfTVNWQyA8IDEzMDApIC8qIE1TVkMgNi4wIGFuZCBlYXJsaWVyICovCi0jICAgIGRlZmluZSBfU1RMUF9OT19FWFBMSUNJVF9GVU5DVElPTl9UTVBMX0FSR1MgMQotLyogZGVmaW5lZCBmb3IgREVCVUcgYW5kIE5ERUJVRyB0b28sIHRvIGFsbG93IHVzZXIgbWl4IG93biBkZWJ1ZyBidWlsZCB3aXRoIFNUTFAgcmVsZWFzZSBsaWJyYXJ5ICovCi0jICAgIGRlZmluZSBfU1RMUF9VU0VfQUJCUkVWUwotIyAgZW5kaWYKLQotLy8gVE9ETzogd2hhdCBpcyB0aGUgZWFybGllc3QgdmVyc2lvbiBmb3IgdGhpcz8gSWYgaXQgaXMgMTIwMCwgdXNlIF9TVExQX01TVkM+PTEyMDAuCi0jICBpZiAoX1NUTFBfTVNWQyA+IDExMDApICYmIChfU1RMUF9NU1ZDIDwgMTMwMCkKLXR5cGVkZWYgY2hhciBfX3N0bF9jaGFyOwotIyAgICBkZWZpbmUgX1NUTFBfREVGQVVMVENIQVIgX19zdGxfY2hhcgotIyAgZW5kaWYKLQotIyAgaWYgKF9TVExQX01TVkMgPCAxMjAwKSAvKiBiZWZvcmUgVkMrKyA2LjAgKi8KLS8qICMgIGRlZmluZSBfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVTIDEgKi8KLSMgICAgZGVmaW5lIF9TVExQX0RPTlRfU0lNVUxBVEVfUEFSVElBTF9TUEVDX0ZPUl9UWVBFX1RSQUlUUyAxCi0jICAgIGRlZmluZSBfU1RMUF9ET05UX1VTRV9QQVJUSUFMX1NQRUNfV1JLRCAxCi0jICAgIGRlZmluZSBfU1RMUF9RVUFMSUZJRURfU1BFQ0lBTElaQVRJT05fQlVHIDEKLSMgICAgZGVmaW5lIF9TVExQX05PTl9UWVBFX1RNUExfUEFSQU1fQlVHIDEKLSMgICAgZGVmaW5lIF9TVExQX1RIUk9XX1JFVFVSTl9CVUcgMQotIyAgICBkZWZpbmUgX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFX0NMQVNTRVMgMQotIyAgICBkZWZpbmUgX1NUTFBfREVGX0NPTlNUX0RFRl9QQVJBTV9CVUcgMQotIyAgZW5kaWYKLQotIyAgaWYgKF9TVExQX01TVkMgPCAxMTAwICkKLSMgICAgaWZuZGVmIF9TVExQX1VTRV9OT19JT1NUUkVBTVMKLSMgICAgICBkZWZpbmUgX1NUTFBfVVNFX05PX0lPU1RSRUFNUwotIyAgICBlbmRpZgotLyogIyAgZGVmaW5lIF9TVExQX05FU1RFRF9UWVBFX1BBUkFNX0JVRyAxICovCi0vKiBEZWJ1ZyBtb2RlIGRvZXMgbm90IHdvcmsgZm9yIDQuMiAqLwotIyAgICBpZiBkZWZpbmVkIChfU1RMUF9ERUJVRykKLSMgICAgICBwcmFnbWEgbWVzc2FnZSAoIlNUTHBvcnQgZGVidWcgbW9kZSBkb2VzIG5vdCB3b3JrIGZvciBWQysrIDQuMiwgdHVybmluZyBfU1RMUF9ERUJVRyBvZmYgLi4uIikKLSMgICAgICB1bmRlZiBfU1RMUF9ERUJVRwotIyAgICBlbmRpZgotIyAgICBkZWZpbmUgX1NUTFBfTk9fQk9PTCAgICAgICAgICAgIDEKLSMgICAgZGVmaW5lIF9TVExQX05FRURfVFlQRU5BTUUgICAgICAxCi0jICAgIGRlZmluZSBfU1RMUF9ORUVEX0VYUExJQ0lUICAgICAgMQotIyAgICBkZWZpbmUgX1NUTFBfTkVFRF9NVVRBQkxFICAgICAgIDEKLSMgICAgZGVmaW5lIF9TVExQX05PX1BBUlRJQUxfU1BFQ0lBTElaQVRJT05fU1lOVEFYCi0jICAgIGRlZmluZSBfU1RMUF9MSU1JVEVEX0RFRkFVTFRfVEVNUExBVEVTIDEKLSMgICAgZGVmaW5lIF9TVExQX05PTlRFTVBMX0JBU0VfTUFUQ0hfQlVHIDEKLSMgICAgZGVmaW5lIF9TVExQX0JST0tFTl9VU0lOR19ESVJFQ1RJVkUgIDEKLSMgICAgZGVmaW5lIF9TVExQX05PX0FSUk9XX09QRVJBVE9SIDEKLSMgICAgZGVmaW5lIF9TVExQX05PX1NJR05FRF9CVUlMVElOUyAxCi0jICAgIGRlZmluZSBfU1RMUF9OT19FWENFUFRJT05fU1BFQyAxCi0jICAgIGRlZmluZSBfU1RMUF9IQVNfTk9fTkFNRVNQQUNFUyAxCi0jICAgIGRlZmluZSBfU1RMUF9OT19BVF9NRU1CRVJfRlVOQ1RJT04gMQotIyAgICBkZWZpbmUgX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFUyAxCi0jICBlbmRpZiAvKiAxMTAwICovCi0KLSNlbmRpZiAvKiBfU1RMUF9NU1ZDICovCi0KLS8qKiBUaGUgZGVza3RvcCB2YXJpYW50cyBzdGFydGluZyB3aXRoIFZDOCBoYXZlIGEgc2V0IG9mIG1vcmUgc2VjdXJlIHJlcGxhY2VtZW50cwotZm9yIHRoZSBlcnJvci1wcm9uZSBzdHJpbmcgaGFuZGxpbmcgZnVuY3Rpb25zIG9mIHRoZSBDIHN0YW5kYXJkIGxpYi4gKi8KLSNpZiAoX1NUTFBfTVNWQ19MSUIgPj0gMTQwMCkgJiYgIWRlZmluZWQgKF9TVExQX1VTSU5HX1BMQVRGT1JNX1NES19DT01QSUxFUikgJiYgIWRlZmluZWQoVU5ERVJfQ0UpCi0jICBkZWZpbmUgX1NUTFBfVVNFX1NBRkVfU1RSSU5HX0ZVTkNUSU9OUyAxCi0jZW5kaWYKLQotI2lmIChfU1RMUF9NU1ZDX0xJQiA8PSAxMzEwKQotIyAgZGVmaW5lIF9TVExQX1ZFTkRPUl9HTE9CQUxfQ1NURAotI2VuZGlmCi0KLSNpZiAoX1NUTFBfTVNWQ19MSUIgPj0gMTMwMCkgJiYgIWRlZmluZWQoVU5ERVJfQ0UpCi0vKiBTdGFydGluZyB3aXRoIE1TVkMgNy4wIGFuZCBjb21waWxlcnMgc2ltdWxhdGluZyBpdCwKLSAqIHdlIGFzc3VtZSB0aGF0IHRoZSBuZXcgU0RLIGlzIGdyYW50ZWQ6Ci0gKi8KLSMgIGRlZmluZSBfU1RMUF9ORVdfUExBVEZPUk1fU0RLIDEKLSNlbmRpZgotCi0jaWYgKF9TVExQX01TVkNfTElCIDwgMTMwMCkgLyogaW5jbHVkaW5nIE1TVkMgNi4wICovCi0jICBkZWZpbmUgX1NUTFBfR0xPQkFMX05FV19IQU5ETEVSIDEKLSMgIGRlZmluZSBfU1RMUF9WRU5ET1JfVU5FWFBFQ1RFRF9TVEQKLSMgIGRlZmluZSBfU1RMUF9ORVdfRE9OVF9USFJPV19CQURfQUxMT0MgMQotI2VuZGlmCi0KLSNpZiAoX1NUTFBfTVNWQ19MSUIgPCAxMTAwKQotLyogdXAgdG8gNC4yLCBsaWJyYXJ5IGlzIGluIGdsb2JhbCBuYW1lc3BhY2UgKi8KLSMgIGRlZmluZSBfU1RMUF9WRU5ET1JfR0xPQkFMX1NURAotI2VuZGlmCi0KLSNpZiAoX1NUTFBfTVNWQ19MSUIgPD0gMTAxMCkKLS8qICJib29sIiBpcyByZXNlcnZlZCBpbiBNU1ZDIDQuMSB3aGlsZSA8eXZhbHMuaD4gYWJzZW50LCBzbyA6ICovCi0jICBkZWZpbmUgX1NUTFBfTk9fQkFEX0FMTE9DCi0jICBkZWZpbmUgX1NUTFBfSEFTX05PX05FV19DX0hFQURFUlMgMQotIyAgZGVmaW5lIF9TVExQX05PX05FV19ORVdfSEVBREVSIDEKLSNlbGlmIChfU1RMUF9NU1ZDX0xJQiA8IDExMDApCi0vKiBWQysrIDQuMiBhbmQgaGlnaGVyICovCi0jICBkZWZpbmUgX1NUTFBfWVZBTFNfSCAxCi0jICBkZWZpbmUgX1NUTFBfVVNFX05PX0lPU1RSRUFNUyAxCi0jZW5kaWYKLQotI2RlZmluZSBfU1RMUF9FWFBPUlRfREVDTFNQRUMgX19kZWNsc3BlYyhkbGxleHBvcnQpCi0jZGVmaW5lIF9TVExQX0lNUE9SVF9ERUNMU1BFQyBfX2RlY2xzcGVjKGRsbGltcG9ydCkKLQotI2lmICFkZWZpbmVkIChfU1RMUF9NU1ZDKSB8fCAoX1NUTFBfTVNWQyA+PSAxMTAwKQotIyAgZGVmaW5lIF9TVExQX0NMQVNTX0VYUE9SVF9ERUNMU1BFQyBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKLSMgIGRlZmluZSBfU1RMUF9DTEFTU19JTVBPUlRfREVDTFNQRUMgX19kZWNsc3BlYyhkbGxpbXBvcnQpCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9fRExMKSB8fCBkZWZpbmVkIChfRExMKSB8fCBkZWZpbmVkIChfUlRMRExMKSB8fCBkZWZpbmVkIChfQUZYRExMKQotIyAgZGVmaW5lIF9TVExQX1JVTlRJTUVfRExMCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChfX0JVSUxESU5HX1NUTFBPUlQpICYmIFwKLSAgIChkZWZpbmVkIChfU1RMUF9VU0VfRFlOQU1JQ19MSUIpIHx8IFwKLSAgICBkZWZpbmVkIChfU1RMUF9SVU5USU1FX0RMTCkgJiYgIWRlZmluZWQgKF9TVExQX1VTRV9TVEFUSUNfTElCKSkKLSMgIGRlZmluZSBfU1RMUF9ETEwKLSNlbmRpZgotI2luY2x1ZGUgPHN0bC9jb25maWcvX2RldGVjdF9kbGxfb3JfbGliLmg+Ci0jdW5kZWYgX1NUTFBfUlVOVElNRV9ETEwKLSN1bmRlZiBfU1RMUF9ETEwKLQotI2lmIGRlZmluZWQgKF9TVExQX1VTRV9EWU5BTUlDX0xJQikKLSMgIHVuZGVmICBfU1RMUF9VU0VfREVDTFNQRUMKLSMgIGRlZmluZSBfU1RMUF9VU0VfREVDTFNQRUMgMQotIyAgaWYgKF9TVExQX01TVkMgPj0gMTIwMCkgJiYgKF9TVExQX01TVkMgPCAxMzAwKQotIyAgICBkZWZpbmUgX1NUTFBfVVNFX01TVkM2X01FTV9UX0JVR19XT1JLQVJPVU5EIDEKLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkIChfU1RMUF9JTVBPUlRfVEVNUExBVEVfS0VZV09SRCkKLSMgIGlmICFkZWZpbmVkIChfTVNDX0VYVEVOU0lPTlMpIHx8IGRlZmluZWQoX1NUTFBfTVNWQykgJiYgX1NUTFBfTVNWQyA+PSAxMzAwCi0jICAgIGRlZmluZSBfU1RMUF9JTVBPUlRfVEVNUExBVEVfS0VZV09SRAotIyAgZWxzZQotIyAgICBkZWZpbmUgX1NUTFBfSU1QT1JUX1RFTVBMQVRFX0tFWVdPUkQgZXh0ZXJuCi0jICBlbmRpZgotI2VuZGlmCi0jZGVmaW5lIF9TVExQX0VYUE9SVF9URU1QTEFURV9LRVlXT1JECi0KLSNpZiBkZWZpbmVkIChfU1RMUF9NU1ZDKSAmJiAoX1NUTFBfTVNWQyA8IDEyMDApCi0vKiAgICBvbmx5IHN0YXRpYyBTVExwb3J0IGxpYiBub3cgd29ya3MgZm9yIFZDIDUuMCAqLwotIyAgdW5kZWYgIF9TVExQX1VTRV9TVEFUSUNfTElCCi0jICB1bmRlZiAgX1NUTFBfVVNFX0RZTkFNSUNfTElCCi0jICBkZWZpbmUgX1NUTFBfVVNFX1NUQVRJQ19MSUIKLS8qICAgIGRpc2FibGUgaG9vayB3aGljaCBtYWtlcyB0ZW1wbGF0ZSBzeW1ib2xzIHRvIGJlIHNlYXJjaGVkIGZvciBpbiB0aGUgbGlicmFyeSAqLwotIyAgdW5kZWYgX1NUTFBfTk9fQ1VTVE9NX0lPCi0jZW5kaWYKLQotI2luY2x1ZGUgPHN0bC9jb25maWcvX2F1dG9fbGluay5oPgotCi0jaWYgZGVmaW5lZCAoX1NUTFBfVVNJTkdfUExBVEZPUk1fU0RLX0NPTVBJTEVSKQotLyogVGhlIFdpbmRvd3MgNjQgYml0cyBTREsgcmVxdWlyZWQgZm9yIHRoZSBtb21lbnQgbGluayB0byBidWZmZXJvdmVyZmxvd1UubGliIGZvcgotICogYWRkaXRpb25hbCBidWZmZXIgb3ZlcnJ1biBjaGVja3MuIFJhdGhlciB0aGFuIHJlcXVpcmUgdGhlIFNUTHBvcnQgYnVpbGQgc3lzdGVtIGFuZAotICogdXNlcnMgdG8gZXhwbGljaXRlbHkgbGluayB3aXRoIGl0IHdlIHVzZSB0aGUgTVNWQyBhdXRvIGxpbmsgZmVhdHVyZS4KLSAqLwotIyAgaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfVVNFX0FVVE9fTElOSykgfHwgZGVmaW5lZCAoX19CVUlMRElOR19TVExQT1JUKQotIyAgICBwcmFnbWEgY29tbWVudCAobGliLCAiYnVmZmVyb3ZlcmZsb3dVLmxpYiIpCi0jICAgIGlmIGRlZmluZWQgKF9TVExQX1ZFUkJPU0VfQVVUT19MSU5LKQotIyAgICAgIHByYWdtYSBtZXNzYWdlICgiU1RMcG9ydDogQXV0byBsaW5raW5nIHRvIGJ1ZmZlcm92ZXJmbG93VS5saWIiKQotIyAgICBlbmRpZgotIyAgZW5kaWYKLSNlbmRpZgotCi0vKiBMb2NhbCBWYXJpYWJsZXM6Ci0gKiBtb2RlOkMrKwotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9zdGwvY29uZmlnL19td2NjbmxtLmggYi9zdGwvY29uZmlnL19td2NjbmxtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlYWY5YjUuLjAwMDAwMDAKLS0tIGEvc3RsL2NvbmZpZy9fbXdjY25sbS5oCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLy8gU1RMcG9ydCBjb25maWd1cmF0aW9uIGZpbGUKLS8vIEl0IGlzIGludGVybmFsIFNUTHBvcnQgaGVhZGVyIC0gRE8gTk9UIGluY2x1ZGUgaXQgZGlyZWN0bHkKLQotI2RlZmluZSBfU1RMUF9DT01QSUxFUiAiTWV0cm93ZXJrcyBDb2RlV2FycmlvciIKLQotLy8gQnJpbmcgaW4gZGVmaW5pdGlvbiBvZiBfX01TTF9fIGFuZCByZWxhdGVkIGl0ZW1zCi0jaW5jbHVkZSA8bXNsR2xvYmFscy5oPgotI2luY2x1ZGUgPGFuc2lfcGFybXMuaD4KLQotLy8gKioqIENvZGVXYXJyaW9yIENvbXBpbGVyIENvbW1vbiBGZWF0dXJlcyAqKioKLSNpZiBfX29wdGlvbihsb25nbG9uZykKLSMgIGRlZmluZSBfU1RMUF9MT05HX0xPTkcgIGxvbmcgbG9uZwotI2VuZGlmCi0KLSNkZWZpbmUgX1NUTFBfVVNFX1VOSVhfRU1VTEFUSU9OX0lPICAxCi0KLSNkZWZpbmUgX1NUTFBfVVNFX0FVVE9fUFRSX0NPTlZFUlNJT05TICAxCi0KLSNpZmRlZiBfX0lOVEVMX18KLSMgIGRlZmluZSBfU1RMUF9MSVRUTEVfRU5ESUFOCi0jZWxzZQotIyAgZGVmaW5lIF9TVExQX0JJR19FTkRJQU4KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfTVNMX05PX0xPQ0FMRSkKLSMgIGRlZmluZSBfU1RMUF9OT19JTVBPUlRfTE9DQUxFCi0jZW5kaWYKLQotI2lmICFfX29wdGlvbiggd2NoYXJfdHlwZSApCi0jICBkZWZpbmUgX1NUTFBfV0NIQVJfVF9JU19VU0hPUlQKLSNlbmRpZgotCi0jaWYgX19NV0VSS1NfXyA8IDB4MzAwMAotLy8gKioqIENvZGVXYXJyaW9yIENvbXBpbGVyIENvbW1vbiBCdWdzICoqKgotIyAgZGVmaW5lIF9fTVNMX0ZJWF9JVEVSQVRPUlNfXyhteVR5cGUpICAgIC8vIFNvbWUgTVNMIGhlYWRlcnMgcmVseSBvbiB0aGlzCi0jICBkZWZpbmUgX1NUTFBfTk9fRlJJRU5EX1RFTVBMQVRFUyAxICAvLyBCdWcgbXlzdGVyaW91c2x5IHJlaW50cm9kdWNlZCBpbiB0aGlzIHZlcnNpb24uCi0jICBkZWZpbmUgX1NUTFBfVEhST1dfUkVUVVJOX0JVRyAgMQotI2VuZGlmCi0KLSNpZiBfX01XRVJLU19fID49IDB4MjQwNQotIyAgZGVmaW5lIF9TVExQX0hBU19OQVRJVkVfRkxPQVRfQUJTCi0jZW5kaWYKLQotI2lmIF9fTVdFUktTX18gPCAweDI0MDUKLSMgIGRlZmluZSBfU1RMUF9TVEFUSUNfQ09OU1RfSU5JVF9CVUcKLSNlbmRpZgotCi0jaWYgX19NV0VSS1NfXyA8PSAweDIzMDMKLSMgIGRlZmluZSBfU1RMUF9OT19URU1QTEFURV9DT05WRVJTSU9OUyAgMQotIyAgZGVmaW5lIF9TVExQX05PX01FTUJFUl9URU1QTEFURV9LRVlXT1JEICAxCi0jZW5kaWYKLQotI2lmIF9fTVdFUktTX18gPCAweDIzMDEKLSMgIGRlZmluZSBfU1RMUF9NRU1CRVJfU1BFQ0lBTElaQVRJT05fQlVHICAxCi0jZW5kaWYKLQotI2lmIF9fTVdFUktTX18gPCAweDIzMDAgICAgLy8gQ1cgUHJvNSBmZWF0dXJlcwotIyAgZGVmaW5lIF9TVExQX0lOTElORV9NRU1CRVJfVEVNUExBVEVTIDEKLSMgIGRlZmluZSBfU1RMUF9SRUxPUFNfSU5fU1REX0JVRyAgIDEKLSMgIGRlZmluZSBfU1RMUF9ERUZfQ09OU1RfUExDVF9ORVdfQlVHIDEKLSMgIGRlZmluZSBfU1RMUF9ERUZfQ09OU1RfREVGX1BBUkFNX0JVRyAxCi0jICBkZWZpbmUgX1NUTFBfTk9fVFlQRU5BTUVfT05fUkVUVVJOX1RZUEUKLSNlbmRpZgotCi0vLyBmaXhlcyB0byBuYXRpdmUgaW5jbHVzaW9uIHdyYXBwZXJzLgotI2lmIF9fTVdFUktTX18gPj0gMHgyMzAwICAvLyBDV1BybzUgY2hhbmdlcyBwYXRocyAtIGR3YSAyLzI4Lzk5Ci0jICBkZWZpbmUgX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSCAgLi4vbndzZGsvaW5jbHVkZS9ubG0KLSMgIGRlZmluZSBfU1RMUF9OQVRJVkVfQ19JTkNMVURFX1BBVEggIC4uL253c2RrL2luY2x1ZGUvbmxtCi0jICBkZWZpbmUgX1NUTFBfTkFUSVZFX0hFQURFUihoZWFkZXIpICAgICA8Li4vbndzZGsvaW5jbHVkZS9ubG0vIyNoZWFkZXI+Ci0jICBkZWZpbmUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUihoZWFkZXIpICAgICA8Li4vTGlicmFyaWVzL01TTCBDKysvSW5jbHVkZS8jI2hlYWRlcj4KLSMgIGRlZmluZSBfU1RMUF9OQVRJVkVfQ19IRUFERVIoaGVhZGVyKSAgICAgPC4uL253c2RrL2luY2x1ZGUvbmxtLyMjaGVhZGVyPgotIyAgZGVmaW5lIF9TVExQX05BVElWRV9DUFBfUlVOVElNRV9IRUFERVIoaGVhZGVyKSA8Li4vTGlicmFyaWVzL01TTCBDKysvSW5jbHVkZS8jI2hlYWRlcj4KLQotIyAgZGVmaW5lIF9TVExQX1ZFTkRPUl9HTE9CQUxfQ1NURCAgMQotIyAgZGVmaW5lIF9TVExQX05PX1ZFTkRPUl9TVERMSUJfTCAgMQotIyAgZGVmaW5lIF9TVExQX05PX1ZFTkRPUl9NQVRIX0YgICAgMQotIyAgZGVmaW5lIF9TVExQX05PX1ZFTkRPUl9NQVRIX0wgICAgMQotICAgICAvLyMgICBkZWZpbmUgX01TTF9OT19USFJPV19TUEVDUwotICAgICAvLyMgICBkZWZpbmUgX1NURAotICAgICAvLyMgICBkZWZpbmUgX0NTVEQKLSNlbmRpZgotCi0vLyBmYnAKLSNpZiAhZGVmaW5lZCggX19NU0xfQ1BQX18gKSB8fCBfX01TTF9DUFBfXyA8PSAweDQxMDUKLSMgIGRlZmluZSBfU1RMUF9OT19OQVRJVkVfV0lERV9TVFJFQU1TIDEKLSMgZW5kaWYKLQotI2RlZmluZSBfU1RMUF9ETExFWFBPUlRfTkVFRFNfUFJFREVDTEFSQVRJT04gMQpkaWZmIC0tZ2l0IGEvc3RsL2NvbmZpZy9fbXdlcmtzLmggYi9zdGwvY29uZmlnL19td2Vya3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZkYTMyYi4uMDAwMDAwMAotLS0gYS9zdGwvY29uZmlnL19td2Vya3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vLyBTVExwb3J0IGNvbmZpZ3VyYXRpb24gZmlsZQotLy8gSXQgaXMgaW50ZXJuYWwgU1RMcG9ydCBoZWFkZXIgLSBETyBOT1QgaW5jbHVkZSBpdCBkaXJlY3RseQotCi0jZGVmaW5lIF9TVExQX0NPTVBJTEVSICJNZXRyb3dlcmsgQ29kZXdhcnJpb3IiCi0KLS8vIEJyaW5nIGluIGRlZmluaXRpb24gb2YgX19NU0xfXyBhbmQgcmVsYXRlZCBpdGVtcwotI2luY2x1ZGUgPG1zbEdsb2JhbHMuaD4KLSNpbmNsdWRlIDxhbnNpX3Bhcm1zLmg+Ci0KLS8vCi0vLyAgQ29tcGlsZXIgZmVhdHVyZXMKLS8vCi0KLQotLy8gKioqIENvZGVXYXJyaW9yIENvbXBpbGVyIENvbW1vbiBGZWF0dXJlcyAqKioKLSMgIGlmIF9fb3B0aW9uKGxvbmdsb25nKQotIyAgIGRlZmluZSBfU1RMUF9MT05HX0xPTkcgIGxvbmcgbG9uZwotIyAgZW5kaWYKLQotIyAgZGVmaW5lIF9TVExQX1VTRV9VTklYX0VNVUxBVElPTl9JTyAgMQotCi0jICBkZWZpbmUgX1NUTFBfVVNFX0FVVE9fUFRSX0NPTlZFUlNJT05TICAxCi0KLSMgaWZkZWYgX19JTlRFTF9fCi0jICBkZWZpbmUgX1NUTFBfTElUVExFX0VORElBTgotIyBlbHNlCi0jICBkZWZpbmUgX1NUTFBfQklHX0VORElBTgotIyBlbmRpZgotCi0jaWYgZGVmaW5lZChfTVNMX05PX0xPQ0FMRSkKLSNkZWZpbmUgX1NUTFBfTk9fSU1QT1JUX0xPQ0FMRQotI2VuZGlmCi0jaWYgIV9fb3B0aW9uKCB3Y2hhcl90eXBlICkKLSMgZGVmaW5lIF9TVExQX1dDSEFSX1RfSVNfVVNIT1JUCi0jZW5kaWYKLQotIyAgaWYgX19NV0VSS1NfXyA8IDB4MzAwMAotLy8gKioqIENvZGVXYXJyaW9yIENvbXBpbGVyIENvbW1vbiBCdWdzICoqKgotIyAgIGRlZmluZSBfX01TTF9GSVhfSVRFUkFUT1JTX18obXlUeXBlKSAgICAvLyBTb21lIE1TTCBoZWFkZXJzIHJlbHkgb24gdGhpcwotIyAgIGRlZmluZSBfU1RMUF9OT19GUklFTkRfVEVNUExBVEVTIDEgIC8vIEJ1ZyBteXN0ZXJpb3VzbHkgcmVpbnRyb2R1Y2VkIGluIHRoaXMgdmVyc2lvbi4KLSMgICBkZWZpbmUgX1NUTFBfVEhST1dfUkVUVVJOX0JVRyAgMQotIyAgZW5kaWYKLQotLy8gICoqKiBWZXJzaW9uLXNwZWNpZmljIHNldHRpbmdzICoqKgotCi0jICBpZiBfX01XRVJLU19fID49IDB4MjQwNQotIyAgIGRlZmluZSBfU1RMUF9IQVNfTkFUSVZFX0ZMT0FUX0FCUwotIyAgZW5kaWYKLQotIyAgaWYgX19NV0VSS1NfXyA8IDB4MjQwNQotIyAgIGRlZmluZSBfU1RMUF9TVEFUSUNfQ09OU1RfSU5JVF9CVUcKLSMgIGVuZGlmCi0KLSMgIGlmIF9fTVdFUktTX18gPD0gMHgyMzAzCi0jICAgZGVmaW5lIF9TVExQX05PX1RFTVBMQVRFX0NPTlZFUlNJT05TICAxCi0jICAgZGVmaW5lIF9TVExQX05PX01FTUJFUl9URU1QTEFURV9LRVlXT1JEICAxCi0jICBlbmRpZgotCi0jICBpZiBfX01XRVJLU19fIDwgMHgyMzAxCi0jICAgZGVmaW5lIF9TVExQX01FTUJFUl9TUEVDSUFMSVpBVElPTl9CVUcgIDEKLSMgIGVuZGlmCi0KLSMgIGlmIF9fTVdFUktTX18gPCAweDIzMDAgICAgLy8gQ1cgUHJvNSBmZWF0dXJlcwotIyAgIGRlZmluZSBfU1RMUF9JTkxJTkVfTUVNQkVSX1RFTVBMQVRFUyAxCi0jICAgZGVmaW5lIF9TVExQX1JFTE9QU19JTl9TVERfQlVHICAgMQotIyAgIGRlZmluZSBfU1RMUF9ERUZfQ09OU1RfUExDVF9ORVdfQlVHIDEKLSMgICBkZWZpbmUgX1NUTFBfREVGX0NPTlNUX0RFRl9QQVJBTV9CVUcgMQotIyAgIGRlZmluZSBfU1RMUF9OT19UWVBFTkFNRV9PTl9SRVRVUk5fVFlQRQotIyAgZW5kaWYKLQotIyAgaWYgX19NV0VSS1NfXyA8IDB4MjIwMCAgICAvLyBDVyBQcm80IGZlYXR1cmVzCi0jICAgZGVmaW5lIF9TVExQX0JST0tFTl9VU0lOR19ESVJFQ1RJVkUgIDEKLSMgICBkZWZpbmUgX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFUyAxCi0jICAgZGVmaW5lIF9TVExQX05PX01FTUJFUl9URU1QTEFURV9DTEFTU0VTIDEKLSMgICBkZWZpbmUgX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFX0tFWVdPUkQgMQotIyAgIGRlZmluZSBfU1RMUF9OT19GUklFTkRfVEVNUExBVEVTIDEKLSMgICBkZWZpbmUgX1NUTFBfTk9fUVVBTElGSUVEX0ZSSUVORFMgMQotIyAgIGRlZmluZSBfU1RMUF9OT19GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIgMQotIyAgZW5kaWYKLQotIyAgaWYgX19NV0VSS1NfXyA8IDB4MjEwMCAgICAgIC8vIENXIFBybzMgZmVhdHVyZXMKLSMgICBkZWZpbmUgX1NUTFBfTk9fQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTiAxCi0jICAgZGVmaW5lIF9TVExQX0hBU19OT19OQU1FU1BBQ0VTIDEKLSMgICBkZWZpbmUgX1NUTFBfTk9fRVhQTElDSVRfRlVOQ1RJT05fVE1QTF9BUkdTIDEKLQotIyAgIGRlZmluZSBfU1RMUF9ORUVEX1RZUEVOQU1FICAgICAgICAxCi0jICAgZGVmaW5lIF9TVExQX05PX0FSUk9XX09QRVJBVE9SIDEKLSMgICBkZWZpbmUgX1NUTFBfVEVNUExBVEVfUEFSQU1fU1VCVFlQRV9CVUcgIDEKLSMgICBkZWZpbmUgX1NUTFBfRk9SQ0VEX0lOTElORV9JTlNUQU5USUFUSU9OX0JVRyAgMQotIyAgIGRlZmluZSBfU1RMUF9NVUxUSV9DT05TVF9URU1QTEFURV9BUkdfQlVHICAxCi0jICAgZGVmaW5lIF9TVExQX0lOTElORV9OQU1FX1JFU09MVVRJT05fQlVHICAxCi0vLyAqKiogTWV0cm93ZXJrcyBTdGFuZGFyZCBMaWJyYXJ5IEJ1ZyAqKioKLSMgICBkZWZpbmUgX1NUTFBfTVNWQzUwX0NPTVBBVElCSUxJVFkgMQotIyAgZW5kaWYKLQotIyAgaWYgX19NV0VSS1NfXyA8IDB4MjAwMCAgICAgIC8vIHYuIDIuMCBmZWF0dXJlcwotIyAgIGRlZmluZSBfU1RMUF9OT19XQ0hBUl9UIDEKLSMgICBkZWZpbmUgX1NUTFBfTk9fREVGQVVMVF9OT05fVFlQRV9QQVJBTSAxCi0jICAgZGVmaW5lIF9TVExQX05PTl9UWVBFX1RNUExfUEFSQU1fQlVHICAxICAvLyBkd2EgOC8yMS85NyAtIHRoaXMgYnVnIGZpeGVkIGZvciBDV1BybzIKLSMgIGVuZGlmCi0KLSMgIGlmIF9fTVdFUktTX18gPCAweDE5MDAgICAgICAgICAgICAgICAgIC8vIGR3YSA4LzE5Lzk3IC0gMS45IENvbXBpbGVyIGZlYXR1cmUgZGVmaW5lcwotIyAgIGRlZmluZSBfU1RMUF9MSU1JVEVEX0RFRkFVTFRfVEVNUExBVEVTIDEKLSMgICBkZWZpbmUgX1NUTFBfQkFTRV9UWVBFREVGX0JVRyAgICAgICAgMQotIyAgIGRlZmluZSBfU1RMUF9CQVNFX01BVENIX0JVRyAgIDEKLSMgICBkZWZpbmUgX1NUTFBfTk9OVEVNUExfQkFTRV9NQVRDSF9CVUcgMQotIyAgIGRlZmluZSBfU1RMUF9ERUZBVUxUX1RZUEVfUEFSQU0gIDEgICAgICAvLyBNb3JlIGxpbWl0ZWQgdGVtcGxhdGUgcGFyYW1ldGVycwotCi0jICAgaWYgX19NV0VSS1NfXyA8IDB4MTgwMAotICAgIF9fR0lWRV9VUF9XSVRIX1NUTChDV18xOCkKLSMgICBlbmRpZgotCi0jICBlbmRpZgotCi0KLS8vIGZpeGVzIHRvIG5hdGl2ZSBpbmNsdXNpb24gd3JhcHBlcnMuCi0jIGlmIF9fTVdFUktTX18gPj0gMHgyMzAwICAvLyBDV1BybzUgY2hhbmdlcyBwYXRocyAtIGR3YSAyLzI4Lzk5Ci0jICBkZWZpbmUgX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSCAgLi4vaW5jbHVkZQotIyAgZGVmaW5lIF9TVExQX05BVElWRV9DX0lOQ0xVREVfUEFUSCAgLi4vaW5jbHVkZQotIyAgZGVmaW5lIF9TVExQX05BVElWRV9IRUFERVIoaGVhZGVyKSAgICAgPC4uL2luY2x1ZGUvIyNoZWFkZXI+Ci0jICBkZWZpbmUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUihoZWFkZXIpICAgICA8Li4vaW5jbHVkZS8jI2hlYWRlcj4KLSMgIGRlZmluZSBfU1RMUF9OQVRJVkVfQ19IRUFERVIoaGVhZGVyKSAgICAgPC4uL2luY2x1ZGUvIyNoZWFkZXI+Ci0jICBkZWZpbmUgX1NUTFBfTkFUSVZFX0NQUF9SVU5USU1FX0hFQURFUihoZWFkZXIpIDwuLi9pbmNsdWRlLyMjaGVhZGVyPgotIyBlbHNlCi0KLSMgIGRlZmluZSBfU1RMUF9OQVRJVkVfSU5DTFVERV9QQVRIICBNYWNpbnRvc2ggSEQ6Q29kZXdhcnJpb3IgUHJvIDQ6TWV0cm93ZXJrcyBDb2RlV2FycmlvcjpNZXRyb3dlcmtzIFN0YW5kYXJkIExpYnJhcnk6TVNMIEMrKzpJbmNsdWRlCi0jICBkZWZpbmUgX1NUTFBfTkFUSVZFX0NfSU5DTFVERV9QQVRIICBNYWNpbnRvc2ggSEQ6Q29kZXdhcnJpb3IgUHJvIDQ6TWV0cm93ZXJrcyBDb2RlV2FycmlvcjpNZXRyb3dlcmtzIFN0YW5kYXJkIExpYnJhcnk6TVNMIEM6TVNMIENvbW1vbjpQdWJsaWMgSW5jbHVkZXMKLSMgIGRlZmluZSBfU1RMUF9OQVRJVkVfSEVBREVSKGhlYWRlcikgICAgIDxNYWNpbnRvc2ggSEQ6Q29kZXdhcnJpb3IgUHJvIDQ6TWV0cm93ZXJrcyBDb2RlV2FycmlvcjpNZXRyb3dlcmtzIFN0YW5kYXJkIExpYnJhcnk6TVNMIEMrKzpJbmNsdWRlOiMjaGVhZGVyPgotIyAgZGVmaW5lIF9TVExQX05BVElWRV9DUFBfQ19IRUFERVIoaGVhZGVyKSAgICAgPE1hY2ludG9zaCBIRDpDb2Rld2FycmlvciBQcm8gNDpNZXRyb3dlcmtzIENvZGVXYXJyaW9yOk1ldHJvd2Vya3MgU3RhbmRhcmQgTGlicmFyeTpNU0wgQysrOkluY2x1ZGU6IyNoZWFkZXI+Ci0jICBkZWZpbmUgX1NUTFBfTkFUSVZFX0NfSEVBREVSKGhlYWRlcikgICAgIDxNYWNpbnRvc2ggSEQ6Q29kZXdhcnJpb3IgUHJvIDQ6TWV0cm93ZXJrcyBDb2RlV2FycmlvcjpNZXRyb3dlcmtzIFN0YW5kYXJkIExpYnJhcnk6TVNMIEM6TVNMIENvbW1vbjpQdWJsaWMgSW5jbHVkZXM6IyNoZWFkZXI+Ci0jICBkZWZpbmUgX1NUTFBfTkFUSVZFX0NQUF9SVU5USU1FX0hFQURFUihoZWFkZXIpIDxNYWNpbnRvc2ggSEQ6Q29kZXdhcnJpb3IgUHJvIDQ6TWV0cm93ZXJrcyBDb2RlV2FycmlvcjpNZXRyb3dlcmtzIFN0YW5kYXJkIExpYnJhcnk6TVNMIEM6TVNMIENvbW1vbjpQdWJsaWMgSW5jbHVkZXM6IyNoZWFkZXI+Ci0KLSMgZW5kaWYKLQotLy9Gb2xsb3dpbmcgYmxvY2sgY29tZSBmcm9tIGJvb3N0IGludHJpbnNpY3MuaHBwIGZpbGU6Ci0jaWYgZGVmaW5lZCAoX19NU0xfQ1BQX18pICYmIChfX01TTF9DUFBfXyA+PSAweDgwMDApCi0gICAgLy8gTWV0cm93ZXJrcyBjb21waWxlciBpcyBhY3F1aXJpbmcgaW50cmluc2ljIHR5cGUgdHJhaXRzIHN1cHBvcnQKLSAgICAvLyBwb3N0IHZlcnNpb24gOC4gIFdlIGhvb2sgaW50byB0aGUgcHVibGlzaGVkIGludGVyZmFjZSB0byBwaWNrIHVwCi0gICAgLy8gdXNlciBkZWZpbmVkIHNwZWNpYWxpemF0aW9ucyBhcyB3ZWxsIGFzIGNvbXBpbGVyIGludHJpbnNpY3MgYXMKLSAgICAvLyBhbmQgd2hlbiB0aGV5IGJlY29tZSBhdmFpbGFibGU6Ci0jICAgaW5jbHVkZSA8bXNsX3V0aWxpdHk+Ci0jICAgZGVmaW5lIF9TVExQX0hBU19UUklWSUFMX0NPTlNUUlVDVE9SKFQpIE1ldHJvd2Vya3M6Omhhc190cml2aWFsX2RlZmF1bHRfY3RvcjxUPjo6dmFsdWUKLSMgICBkZWZpbmUgX1NUTFBfSEFTX1RSSVZJQUxfQ09QWShUKSBNZXRyb3dlcmtzOjpoYXNfdHJpdmlhbF9jb3B5X2N0b3I8VD46OnZhbHVlCi0jICAgZGVmaW5lIF9TVExQX0hBU19UUklWSUFMX0FTU0lHTihUKSBNZXRyb3dlcmtzOjpoYXNfdHJpdmlhbF9hc3NpZ25tZW50PFQ+Ojp2YWx1ZQotIyAgIGRlZmluZSBfU1RMUF9IQVNfVFJJVklBTF9ERVNUUlVDVE9SKFQpIE1ldHJvd2Vya3M6Omhhc190cml2aWFsX2R0b3I8VD46OnZhbHVlCi0jICAgZGVmaW5lIF9TVExQX0lTX1BPRChUKSBNZXRyb3dlcmtzOjppc19QT0Q8VD46OnZhbHVlCi0jICAgZGVmaW5lIF9TVExQX0hBU19UWVBFX1RSQUlUU19JTlRSSU5TSUNTCi0jZW5kaWYKLQotLy8gZmJwCi0jIGlmICFkZWZpbmVkKCBfX01TTF9DUFBfXyApIHx8IF9fTVNMX0NQUF9fIDw9IDB4NDEwNQotIyAgIGRlZmluZSBfU1RMUF9OT19OQVRJVkVfV0lERV9TVFJFQU1TIDEKLSMgIGVuZGlmCi0KLSMgaWYgZGVmaW5lZChfX01BQ0hfXykKLSMgIGRlZmluZSBfU1RMUF9NQUMKLSMgIGRlZmluZSBPX0JJTkFSWSAwCi0jIGVsaWYgZGVmaW5lZChtYWNpbnRvc2gpCi0jICBkZWZpbmUgX05PVEhSRUFEUwotIyBlbmRpZgotIyBkZWZpbmUgX1NUTFBfRExMRVhQT1JUX05FRURTX1BSRURFQ0xBUkFUSU9OIDEKZGlmZiAtLWdpdCBhL3N0bC9jb25maWcvX25ldHdhcmUuaCBiL3N0bC9jb25maWcvX25ldHdhcmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRkZWJkMi4uMDAwMDAwMAotLS0gYS9zdGwvY29uZmlnL19uZXR3YXJlLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jZGVmaW5lIF9TVExQX1BMQVRGT1JNICJOb3ZlbGwgTmV0d2FyZSIKZGlmZiAtLWdpdCBhL3N0bC9jb25maWcvX29wZW5ic2QuaCBiL3N0bC9jb25maWcvX29wZW5ic2QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I2OTgyNS4uMDAwMDAwMAotLS0gYS9zdGwvY29uZmlnL19vcGVuYnNkLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jZGVmaW5lIF9TVExQX1BMQVRGT1JNICJPcGVuIEJTRCIKZGlmZiAtLWdpdCBhL3N0bC9jb25maWcvX3Byb2xvZy5oIGIvc3RsL2NvbmZpZy9fcHJvbG9nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZDk0M2YuLjAwMDAwMDAKLS0tIGEvc3RsL2NvbmZpZy9fcHJvbG9nLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0KLSNpZiBkZWZpbmVkIChfU1RMUF9NU1ZDKSB8fCBkZWZpbmVkIChfX0lDTCkKLQotIyAgaWYgIWRlZmluZWQgKF9TVExQX01TVkMpIHx8IChfU1RMUF9NU1ZDID49IDEyMDApCi0jICAgIHByYWdtYSB3YXJuaW5nKHB1c2gpCi0jICBlbmRpZgotIyAgaW5jbHVkZSA8c3RsL2NvbmZpZy9fd2FybmluZ3Nfb2ZmLmg+Ci0vKiBXZSBhcmUgZm9yY2luZyB0aGUgYWxpZ25tZW50IHRvIGd1YXJhbnR5IHRoYXQgbGlicmFyaWVzIGFyZSB1c2UKLSAqIHdpdGggdGhlIHNhbWUgYWxpZ25tZW50IGFzIHRoZSBvbmUgdXNlIHRvIGJ1aWxkIHRoZW0uCi0gKi8KLSMgIGlmICFkZWZpbmVkIChfV0lONjQpCi0jICAgIHByYWdtYSBwYWNrKHB1c2gsIDgpCi0jICBlbHNlCi0jICAgIHByYWdtYSBwYWNrKHB1c2gsIDE2KQotIyAgZW5kaWYKLQotI2VsaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKQotCi0jICBwcmFnbWEgb3B0aW9uIHB1c2gKLSMgIHByYWdtYSBvcHRpb24gLVZ4LSAtVmUtIC1hOCAtYiAtcGMKLSMgIGluY2x1ZGUgPHN0bC9jb25maWcvX3dhcm5pbmdzX29mZi5oPgotCi0jZWxpZiBkZWZpbmVkIChfX3NnaSkgJiYgIWRlZmluZWQgKF9fR05VQ19fKSAmJiAoX01JUFNfU0lNICE9IF9NSVBTX1NJTV9BQkkzMikKLQotIyAgcHJhZ21hIHNldCB3b2ZmIDEyMDkKLSMgIHByYWdtYSBzZXQgd29mZiAxMTc0Ci0jICBwcmFnbWEgc2V0IHdvZmYgMTM3NQotLyogZnJvbSBpdGVyYXRvcl9iYXNlLmggKi8KLSMgIHByYWdtYSBzZXQgd29mZiAxMTgzCi0KLSNlbGlmIGRlZmluZWQgKF9fREVDQ1hYKQotCi0jICBpZmRlZiBfX1BSQUdNQV9FTlZJUk9OTUVOVAotIyAgICBwcmFnbWEgX19lbnZpcm9ubWVudCBfX3NhdmUKLSMgICAgcHJhZ21hIF9fZW52aXJvbm1lbnQgX19oZWFkZXJfZGVmYXVsdHMKLSMgIGVuZGlmCi0KLSNlbGlmIGRlZmluZWQgKF9fSUJNQ1BQX18pCi0vKiBzdXByZXNzIEVEQzMxMzA6IEEgY29uc3RhbnQgaXMgYmVpbmcgdXNlZCBhcyBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gKi8KLSMgIHByYWdtYSBpbmZvKG5vY25kKQotCi0jZWxpZiBkZWZpbmVkIChfX0hQX2FDQykKLS8qIF9SRUVOVFJBTlQgc2VsZWN0cyBQb3NpeCAxYyB0aHJlYWRzIHVubGVzcyBkcmFmdDQgc2VsZWN0ZWQuCi0gKiAgKiBUaGlzIHVzYWdlIGlzIG9ic29sZXNjZW50LCAiLURfUE9TSVhfQ19TT1VSQ0U9MTk5NTA2IiBpcyBwcmVmZXJyZWQgKi8KLSMgIGlmIDAgLyogZGVmaW5lZCAoX1JFRU5UUkFOVCkgJiYgISBkZWZpbmVkIChfUE9TSVhfQ19TT1VSQ0UpICovCi0jICAgIGRlZmluZSBfUE9TSVhfQ19TT1VSQ0UgMTk5NTA2Ci0jICBlbmRpZgotI2VsaWYgZGVmaW5lZCAoX19XQVRDT01DUExVU1BMVVNfXykKLSMgIHByYWdtYSB3YXJuaW5nIDYwNCAxMCAvKiBtdXN0IGxvb2thaGVhZCB0byBkZXRlcm1pbmUuLi4gKi8KLSMgIHByYWdtYSB3YXJuaW5nIDU5NCAxMCAvKiByZXNvbHZlZCBhcyBkZWNsYXJhdGlvbi90eXBlICovCi0jICBwcmFnbWEgd2FybmluZyA1OTUgMTAgLyogcmVzb2x2ZWQgYXMgYW4gZXhwcmVzc2lvbiAqLwotI2VuZGlmCmRpZmYgLS1naXQgYS9zdGwvY29uZmlnL19zZ2kuaCBiL3N0bC9jb25maWcvX3NnaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjc1MThmLi4wMDAwMDAwCi0tLSBhL3N0bC9jb25maWcvX3NnaS5oCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLy8gU1RMcG9ydCBjb25maWd1cmF0aW9uIGZpbGUKLS8vIEl0IGlzIGludGVybmFsIFNUTHBvcnQgaGVhZGVyIC0gRE8gTk9UIGluY2x1ZGUgaXQgZGlyZWN0bHkKLQotI2RlZmluZSBfU1RMUF9DT01QSUxFUiAiQ0MiCi0KLSNkZWZpbmUgX1NUTFBfSEFTX1NQRUNJRklDX1BST0xPR19FUElMT0cKLQotLy8gZGVmaW5lIG5hdGl2ZSBpbmNsdWRlIHBhdGggYmVmb3JlIHRyeWluZyB0byBpbmNsdWRlIGFueXRoaW5nCi0KLSNkZWZpbmUgX1NUTFBfTkFUSVZFX0hFQURFUihfX3gpIDwvdXNyL2luY2x1ZGUvQ0MvIyNfX3g+Ci0jZGVmaW5lIF9TVExQX05BVElWRV9DX0hFQURFUihfX3gpIDwvdXNyL2luY2x1ZGUvIyNfX3g+Ci0jZGVmaW5lIF9TVExQX05BVElWRV9PTERfU1RSRUFNU19IRUFERVIoX194KSA8L3Vzci9pbmNsdWRlL0NDLyMjX194PgotI2RlZmluZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSEVBREVSKF9feCkgPC91c3IvaW5jbHVkZS9DQy8jI19feD4KLSNkZWZpbmUgX1NUTFBfTkFUSVZFX0NQUF9SVU5USU1FX0hFQURFUihfX3gpIDwvdXNyL2luY2x1ZGUvQ0MvIyNfX3g+Ci0KLSNkZWZpbmUgX1NUTFBfTk9fTkFUSVZFX01CU1RBVEVfVAotCi0jZGVmaW5lIF9TVExQX05PX1VTSU5HX0ZPUl9HTE9CQUxfRlVOQ1RJT05TCi0jZGVmaW5lIF9TVExQX05PX05BVElWRV9XSURFX0ZVTkNUSU9OUwotI2RlZmluZSBfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVfQ0xBU1NFUwotCi0vLyAjZGVmaW5lIF9TVExQX05PX0JBRF9BTExPQwotCi0jZGVmaW5lIF9TVExfSEFTX05BTUVTUEFDRVMKLQotI2lmICEgZGVmaW5lZCAoX19FWENFUFRJT05TKSAmJiAhIGRlZmluZWQgKF9TVExQX05PX0VYQ0VQVElPTlMpCi0jICBkZWZpbmUgX1NUTFBfTk9fRVhDRVBUSU9OUwotI2VuZGlmCi0KLS8vICNkZWZpbmUgX1NUTFBfTk9USFJPVyB0aHJvdygpCi0KLSNkZWZpbmUgX19FREdfU1dJVENIRVMKLQotI2RlZmluZSBfU1RMUF9VU0VfU0dJX1NUUklORyAgICAgICAgIDEKLQotI2RlZmluZSBfU1RMUF9IQVNfTk9fTkVXX0NfSEVBREVSUyAxCi0vLyAjICBkZWZpbmUgX1NUTFBfVkVORE9SX0dMT0JBTF9FWENFUFRfU1RECi0KLSNkZWZpbmUgX1NUTFBfTk9fUE9TVF9DT01QQVRJQkxFX1NFQ1RJT04KLQotI2luY2x1ZGUgPHN0YW5kYXJkcy5oPgotCi0jaWYgIShfQ09NUElMRVJfVkVSU0lPTiA+PSA3MzApCi0jICBkZWZpbmUgX1NUTFBfTk9fTkVXX05FV19IRUFERVIgMQotI2VuZGlmCi0KLSNpZiAoX0NPTVBJTEVSX1ZFUlNJT04gPj0gNzMwICYmIGRlZmluZWQoX1NUQU5EQVJEX0NfUExVU19QTFVTKSkKLSMgIGRlZmluZSBfU1RMUF9FWFRFUk5fUkFOR0VfRVJST1JTCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkKF9CT09MKQotIyAgZGVmaW5lIF9TVExQX05PX0JPT0wKLSNlbmRpZgotI2lmIGRlZmluZWQoX01JUFNfU0lNKSAmJiBfTUlQU19TSU0gPT0gX0FCSU8zMgotIyAgZGVmaW5lIF9TVExQX1NUQVRJQ19DT05TVF9JTklUX0JVRwotI2VuZGlmCi0KLSNpZiAoX0NPTVBJTEVSX1ZFUlNJT04gPCA3MjApIHx8IChkZWZpbmVkKF9NSVBTX1NJTSkgJiYgX01JUFNfU0lNID09IF9BQklPMzIpCi0jICBkZWZpbmUgX1NUTFBfREVGX0NPTlNUX1BMQ1RfTkVXX0JVRwotIyAgZGVmaW5lIF9TVExQX0RFRl9DT05TVF9ERUZfUEFSQU1fQlVHCi0jZW5kaWYKLSNpZiAhKChfQ09NUElMRVJfVkVSU0lPTiA+PSA3MzApICYmIGRlZmluZWQoX01JUFNfU0lNKSAmJiBfTUlQU19TSU0gIT0gX0FCSU8zMikKLSMgIGRlZmluZSBfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVfS0VZV09SRAotI2VuZGlmCi0jaWYgIWRlZmluZWQoX1NUQU5EQVJEX0NfUExVU19QTFVTKQotIyAgZGVmaW5lIF9TVExQX05PX0VYUExJQ0lUX0ZVTkNUSU9OX1RNUExfQVJHUwotI2VuZGlmCi0jaWYgISgoX0NPTVBJTEVSX1ZFUlNJT04gPj0gNzIxKSAmJiBkZWZpbmVkKF9OQU1FU1BBQ0VTKSkKLSMgIGRlZmluZSBfU1RMUF9IQVNfTk9fTkFNRVNQQUNFUwotI2VuZGlmCi0jaWYgKF9DT01QSUxFUl9WRVJTSU9OIDwgNzIxKSB8fCAhZGVmaW5lZChfU1RMX0hBU19OQU1FU1BBQ0VTKSB8fCBkZWZpbmVkKF9TVExQX05PX05BTUVTUEFDRVMpCi0jICBkZWZpbmUgX1NUTFBfTk9fRVhDRVBUSU9OX0hFQURFUgotI2VuZGlmCi0jaWYgX0NPTVBJTEVSX1ZFUlNJT04gPCA3MzAgfHwgIWRlZmluZWQoX1NUQU5EQVJEX0NfUExVU19QTFVTKSB8fCAhZGVmaW5lZChfTkFNRVNQQUNFUykKLSMgIGRlZmluZSBfU1RMUF9OT19CQURfQUxMT0MKLSNlbmRpZgotI2lmIGRlZmluZWQoX0xPTkdMT05HKSAmJiBkZWZpbmVkKF9TR0lBUEkpICYmIF9TR0lBUEkKLSMgIGRlZmluZSBfU1RMUF9MT05HX0xPTkcgbG9uZyBsb25nCi0jZW5kaWYKLSNpZiAhKF9DT01QSUxFUl9WRVJTSU9OID49IDczMCAmJiBkZWZpbmVkKF9TVEFOREFSRF9DX1BMVVNfUExVUykpCi0jICBkZWZpbmUgX1NUTFBfVVNFX05PX0lPU1RSRUFNUwotI2VuZGlmCi0jaWYgIShfQ09NUElMRVJfVkVSU0lPTiA+PSA3MzAgJiYgZGVmaW5lZChfU1RBTkRBUkRfQ19QTFVTX1BMVVMpKQotIyAgZGVmaW5lIF9TVExQX05PX0FUX01FTUJFUl9GVU5DVElPTgotI2VuZGlmCi0vLyAjICAgaWYgIShfQ09NUElMRVJfVkVSU0lPTiA+PSA3MzAgJiYgZGVmaW5lZChfU1RBTkRBUkRfQ19QTFVTX1BMVVMpKQotI2lmICEoX0NPTVBJTEVSX1ZFUlNJT04gPj0gNzIxICYmIGRlZmluZWQoX1NUQU5EQVJEX0NfUExVU19QTFVTKSkKLSMgIGRlZmluZSBfU1RMUF9OT19URU1QTEFURV9DT05WRVJTSU9OUwotI2VuZGlmCi0jaWYgISgoX0NPTVBJTEVSX1ZFUlNJT04gPj0gNzMwKSAmJiBkZWZpbmVkKF9NSVBTX1NJTSkgJiYgX01JUFNfU0lNICE9IF9BQklPMzIpCi0jICBkZWZpbmUgX1NUTFBfTk9fRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3N0bC9jb25maWcvX3NvbGFyaXMuaCBiL3N0bC9jb25maWcvX3NvbGFyaXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UwMGQ5Yy4uMDAwMDAwMAotLS0gYS9zdGwvY29uZmlnL19zb2xhcmlzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0jaWZuZGVmIF9fc3RsX2NvbmZpZ19fc29sYXJpc19oCi0jZGVmaW5lIF9fc3RsX2NvbmZpZ19fc29sYXJpc19oCi0KLSNkZWZpbmUgX1NUTFBfUExBVEZPUk0gIlN1biBTb2xhcmlzIgotCi0vKiBpbmNsdWRlIHN5c3RlbSBmZWF0dXJlcyBmaWxlICovCi0jaW5jbHVkZSA8c3lzL2ZlYXR1cmVfdGVzdHMuaD4KLQotLyogc3lzdGVtLWRlcGVuZGVudCBkZWZpbmVzICovCi0KLS8qCi0gKiBTaG91bGQgYmUgZml4ZWQ6Ci0gKiAxLiBfX1N1bk9TXzVfeCBub3QgZGVmaW5lZCwgYW5kIG5vIHdheSB0byBkZXJpdmUgdGhpcyBmcm9tIGhlYWRlcnMgb25seTsKLSAqICAgIGRlZmluZSBpdCB3aXRoIC1EIG9uIGNvbXBpbGVyIGNvbW1hbmQgbGluZSBpcyBhIGJhZCBpZGVhIHRvby4KLSAqCi0gKiAyLiBTb2xhcmlzIG1heSBoYXMsIGJ1dCBtYXkgaGFzbid0IE1BVEhfRiBhbmQgTUFUSF9MIGZ1bmN0aW9ucyAoZXZlbiB3aXRoIHR3bwotICogICAgdW5kZXJzY29yZXMpLS0tdGhpcyBkZXBlbmRzIHVwb24gc3lzdGVtIHVwZGF0ZSBsZXZlbCBhbmQgc2VlbXMgbGVnYWxseSBwcmVzZW50Ci0gKiAgICBvbmx5IGluIFNvbGFyaXMgMTAgKGkuZS4gSSBzYXcgU29sYXJpcyA5IHdpdGggYW5kIHdpdGhvdXQgX19hY29zZiBpbiBsaWJtLnNvLjEpCi0gKgotICogICAgICAgICAgICAgIC0gcHRyCi0gKi8KLQotI2lmIGRlZmluZWQgKF9fU3VuT1NfNV84KSAmJiAhIGRlZmluZWQgKF9TVExQX0hBU19OT19ORVdfQ19IRUFERVJTKSAmJiAoIF9fY3BsdXNwbHVzID49IDE5OTcxMUwpCi0jICBkZWZpbmUgX1NUTFBfSEFTX05BVElWRV9GTE9BVF9BQlMKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfWE9QRU5fU09VUkNFKSAmJiAoX1hPUEVOX1ZFUlNJT04gLSAwID49IDQpCi0jIGRlZmluZSBfU1RMUF9SQU5ENDggMQotI2VuZGlmCi0KLSNpZiAoZGVmaW5lZChfWE9QRU5fU09VUkNFKSAmJiAoX1hPUEVOX1ZFUlNJT04gLSAwID09IDQpKSB8fCBkZWZpbmVkIChfX1N1bk9TXzVfNikKLSMgZGVmaW5lIF9TVExQX1dDSEFSX1NVTlBST19FWENMVURFIDEKLSMgZGVmaW5lIF9TVExQX05PX05BVElWRV9XSURFX0ZVTkNUSU9OUyAxCi0jZW5kaWYKLQotLyogYm9yaXMgOiB0aGlzIHNob3VsZCBhbHdheXMgYmUgZGVmaW5lZCBmb3IgU29sYXJpcyA1ICYgNi4gQW55IGlkZWFzIGhvdyB0byBkbyBpdD8gKi8KLSNpZiAhKGRlZmluZWQgKCBfX0tDQyApICYmIF9fS0NDX1ZFUlNJT04gPiAzNDAwICkgJiYgXAotICAoKGRlZmluZWQoX19TdW5PU181XzVfMSkgfHwgZGVmaW5lZChfX1N1bk9TXzVfNikgKSkKLSMgIGlmbmRlZiBfU1RMUF9OT19OQVRJVkVfTUJTVEFURV9UCi0jICAgIGRlZmluZSBfU1RMUF9OT19OQVRJVkVfTUJTVEFURV9UIDEKLSMgIGVuZGlmCi0jZW5kaWYgLyogS0NDICovCi0KLS8qIEZvciBTUEFSQyB3ZSB1c2UgbGlnaHR3ZWlnaHQgc3luY2hyb25pemF0aW9uICovCi0jaWYgZGVmaW5lZCAoX19zcGFyYykgLyogJiYgKGRlZmluZWQgKF9SRUVOVFJBTlQpIHx8IGRlZmluZWQgKF9QVEhSRUFEUykpICovCi0jICBpZiAoIChkZWZpbmVkIChfX0dOVUNfXykgJiYgZGVmaW5lZCAoX19zcGFyY192OV9fKSkgfHwgXAotICAgICAgICBkZWZpbmVkIChfX3NwYXJjdjkpICkgXAotICAgICAgICYmICFkZWZpbmVkKF9OT1RIUkVBRFMpICYmICFkZWZpbmVkIChfU1RMUF9OT19TUEFSQ19TT0xBUklTX1RIUkVBRFMpCi0jICAgIGRlZmluZSBfU1RMUF9TUEFSQ19TT0xBUklTX1RIUkVBRFMKLSMgICAgZGVmaW5lIF9TVExQX1RIUkVBRFNfREVGSU5FRAotIyAgZW5kaWYKLSNlbmRpZgotCi0vKiBnY2MgZG9lcyBub3Qgc3VwcG9ydCBFTEY2NCB5ZXQgOyBob3dldmVyOyBpdCBzdXBwb3J0cyB1bHRyYXNwYXJjICsgdjhwbHVzLgotICogbGltaXRzLmggY29udGFpbnMgaW52YWxpZCB2YWx1ZXMgZm9yIHRoaXMgY29tYmluYXRpb24KLSAqLwotI2lmZGVmIF9fR05VQ19fCi0jICBpZiAoZGVmaW5lZCAgKF9fc3BhcmNfdjlfXykgfHwgZGVmaW5lZCAoX19zcGFyY3Y5KSkgJiYgIWRlZmluZWQgKCBfX1dPUkQ2NCApICYmICFkZWZpbmVkKF9fYXJjaDY0X18pCi0jICAgIGRlZmluZSBfX0xPTkdfTUFYX18gMjE0NzQ4MzY0N0wKLSMgIGVuZGlmCi0jZW5kaWYKLQotLyoKLSAqIEhtbSwgSSBkb24ndCBmb3VuZCBpbiBTb2xhcmlzIDkgc3lzdGVtIGhlYWRlcnMgZGVmaW5pdGlvbiBsaWtlIF9fU3VuT1NfNV85Ci0gKiAoZGVmaW5lZCBpbiBTdW5Qcm8/KTsgSSBhbHNvIGNhbid0IGZpbmQgZnVuY3Rpb25zIGxpa2UgZm1vZGYgKGFnYWluLAotICogSSBmb3VuZCBtb2RmZiBpbiBsaWJjLCBidXQgbm8gYWNvc2YgZXRjLikuIFN0cmFuZ2UsIEkgc2F3IF9fY29zZiBmdW5jdGlvbnMKLSAqIChidWlsdC1pbj8pIGF0IGxlYXN0IHdpdGggZ2NjIHNvbWUgdGltZSBhZ28sIGJ1dCBkb24ndCBzZWUgb25lcyB3aXRoCi0gKiBnY2MgMy4zLjIgb24gU3VuT1Mgc3BhcmMtc29sYXJpczEgNS45IEdlbmVyaWNfMTEyMjMzLTAzIHN1bjR1IHNwYXJjIFNVTlcsVWx0cmEtNjAKLSAqIGZyb20gU29yY2Vmb3JnZSdzIENGLgotICogICAgMjAwNS0xMi0xNSwgLSBwdHIKLSAqCi0gKiBQLlMuIFRoYXQncyB3aHkgSSBhZGQgdHdvIGRlZmluZXM6Ci0gKi8KLQotLyogI2lmZGVmIF9fR05VQ19fICovCi0jZGVmaW5lIF9TVExQX05PX1ZFTkRPUl9NQVRIX0YKLSNkZWZpbmUgX1NUTFBfTk9fVkVORE9SX01BVEhfTAotLyogI2VuZGlmICovCi0KLSNpZmRlZiBfX0dOVUNfXwotIyAgZGVmaW5lIF9TVExQX1dDSEFSX0JPUkxBTkRfRVhDTFVERQotIyAgZGVmaW5lIF9TVExQX05PX05BVElWRV9XSURFX0ZVTkNUSU9OUyAxCi0jZW5kaWYKLQotI2VuZGlmIC8qIF9fc3RsX2NvbmZpZ19fc29sYXJpc19oICovCmRpZmYgLS1naXQgYS9zdGwvY29uZmlnL19zdW5wcm9jYy5oIGIvc3RsL2NvbmZpZy9fc3VucHJvY2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU0ZTEyMS4uMDAwMDAwMAotLS0gYS9zdGwvY29uZmlnL19zdW5wcm9jYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8vIFNUTHBvcnQgY29uZmlndXJhdGlvbiBmaWxlCi0vLyBJdCBpcyBpbnRlcm5hbCBTVExwb3J0IGhlYWRlciAtIERPIE5PVCBpbmNsdWRlIGl0IGRpcmVjdGx5Ci0KLSNkZWZpbmUgX1NUTFBfQ09NUElMRVIgIlN1bnBybyBDQyIKLQotI2RlZmluZSBfU1RMUF9MT05HX0xPTkcgIGxvbmcgbG9uZwotCi0vLyBHQUI6IDExLzA5LzA1Ci0vLyBTdGFydGluZyB3aXRoIDUuMCB0aGUgU1RMcG9ydCBjb2RlIGV4cGVjdHMgdG8gYmUKLS8vIGluc3RhbnRpYXRlZCBkdXJpbmcgY29tcGlsZSB0aW1lLiBUaGlzIGlzIGR1ZSB0byB1bmRlZmluZwotLy8gYSBudW1iZXIgb2YgZGVmaW5lcyB0aGF0IGFyZSBhbHNvIHVzZWQgaW4gdGhlIGMgdmVyc2lvbnMKLS8vIG9mIHRoZSBmaWxlLiBXaGVuIHRoZXkgYXJlIHVuZGVmZWQgdGhlIGMgdmVyc2lvbiBmYWlscyB0bwotLy8gY29tcGlsZS4KLS8vICMgIGRlZmluZSBfU1RMUF9MSU5LX1RJTUVfSU5TVEFOVElBVElPTiAxCi0KLSNpZiAhIGRlZmluZWQoX0JPT0wpCi0jICBkZWZpbmUgX1NUTFBfTk9fQk9PTCAxCi0jZW5kaWYKLQotLy8gY29tcGF0aWJpbGl0eSBtb2RlIHN0dWZmCi0jaWYgKF9fU1VOUFJPX0NDID49IDB4NTEwKSAmJiAoIWRlZmluZWQgKF9fU1VOUFJPX0NDX0NPTVBBVCkgfHwgKF9fU1VOUFJPX0NDX0NPTVBBVCA9PSA1ICkpCi0jICBkZWZpbmUgX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSCAuLi9DQy9Dc3RkCi0jICBkZWZpbmUgX1NUTFBfTkFUSVZFX0NQUF9SVU5USU1FX0lOQ0xVREVfUEFUSCAuLi9DQwotI2VsaWYgKF9fU1VOUFJPX0NDID49IDB4NTAwKSAmJiAoIWRlZmluZWQgKF9fU1VOUFJPX0NDX0NPTVBBVCkgfHwgKF9fU1VOUFJPX0NDX0NPTVBBVCA9PSA1ICkpCi0jICBkZWZpbmUgX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSCAuLi9DQwotI2VsaWYgKGRlZmluZWQgKF9fU1VOUFJPX0NDX0NPTVBBVCkgJiYgX19TVU5QUk9fQ0NfQ09NUEFUID09IDQpCi0jICBkZWZpbmUgX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSCAuLi9DQzQKLSNlbHNlCi0jICBkZWZpbmUgX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSCAuLi9DQwotI2VuZGlmCi0KLSNkZWZpbmUgX1NUTFBfU1RBVElDX0NPTlNUX0lOSVRfQlVHIDEKLQotI2lmIChfX1NVTlBST19DQyA8IDB4NTMwKQotLy8gdGhvc2UgYXJlIHRlc3RlZCBhbmQgcHJvdmVkIG5vdCB0byB3b3JrLi4uCi0jICBkZWZpbmUgX1NUTFBfTk9fQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTiAxCi0jICBkZWZpbmUgX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFX0NMQVNTRVMgMQotIyAgZGVmaW5lIF9TVExQX1VTRV9PTERfSFBfSVRFUkFUT1JfUVVFUklFUwotI2VuZGlmCi0KLSNpZmRlZiBfU1RMUF9VU0VfTk9fSU9TVFJFQU1TCi0jICBkZWZpbmUgX1NUTFBfSEFTX05PX05FV19DX0hFQURFUlMgMQotI2VuZGlmCi0KLS8vIHRob3NlIGRvIG5vdCBkZXBlbmQgb24gY29tcGF0aWJpbGl0eQotI2lmIChfX1NVTlBST19DQyA8IDB4NTEwKQotIyAgZGVmaW5lIF9TVExQX05PX1RZUEVOQU1FX09OX1JFVFVSTl9UWVBFIDEKLSMgIGRlZmluZSBfU1RMUF9OT05URU1QTF9CQVNFX01BVENIX0JVRyAxCi0jZW5kaWYKLQotI2lmIChfX1NVTlBST19DQyA8IDB4NTEwKSB8fCAoZGVmaW5lZCAoX19TVU5QUk9fQ0NfQ09NUEFUKSAmJiAoX19TVU5QUk9fQ0NfQ09NUEFUIDwgNSkpCi0KLSMgIGRlZmluZSBfU1RMUF9OT19RVUFMSUZJRURfRlJJRU5EUyAxCi0KLS8vIG5vIHBhcnRpYWwgLCBqdXN0IGZvciBleHBsaWNpdCBvbmUKLSMgIGRlZmluZSBfU1RMUF9QQVJUSUFMX1NQRUNfTkVFRFNfVEVNUExBVEVfQVJHUwotIyAgZGVmaW5lIF9TVExQX05PTl9UWVBFX1RNUExfUEFSQU1fQlVHIDEKLQotIyAgZGVmaW5lIF9TVExQX05PX01FTUJFUl9URU1QTEFURVMgMQotIyAgZGVmaW5lIF9TVExQX05PX0ZSSUVORF9URU1QTEFURVMgMQotCi0jICBkZWZpbmUgX1NUTFBfTk9fRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSIDEKLSMgIGRlZmluZSBfU1RMUF9OT19FWFBMSUNJVF9GVU5DVElPTl9UTVBMX0FSR1MKLSMgIGRlZmluZSBfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVfS0VZV09SRCAxCi0jZW5kaWYKLQotLy8gRmVhdHVyZXMgdGhhdCBkZXBlbmQgb24gY29tcGF0aWJpbGl0eSBzd2l0Y2gKLSNpZiAoIF9fU1VOUFJPX0NDIDwgMHg1MDAgKSB8fCAoZGVmaW5lZCAoX19TVU5QUk9fQ0NfQ09NUEFUKSAmJiAoX19TVU5QUk9fQ0NfQ09NUEFUIDwgNSkpCi0KLSMgIGlmbmRlZiBfU1RMUF9VU0VfTk9fSU9TVFJFQU1TCi0jICAgIGRlZmluZSBfU1RMUF9VU0VfTk9fSU9TVFJFQU1TIDEKLSMgIGVuZGlmCi0jICBkZWZpbmUgX1NUTFBfTk9fTkVXX05FV19IRUFERVIgMQotLy8gIyAgZGVmaW5lIF9TVExQX05PX1JFTE9QU19OQU1FU1BBQ0UKLSMgIGRlZmluZSBfU1RMUF9IQVNfTk9fTkFNRVNQQUNFUyAxCi0jICBkZWZpbmUgX1NUTFBfTkVFRF9NVVRBQkxFICAxCi0jICBkZWZpbmUgX1NUTFBfTk9fQkFEX0FMTE9DIDEKLSMgIGRlZmluZSBfU1RMUF9OT19FWENFUFRJT05fSEVBREVSIDEKLSMgIGRlZmluZSBfU1RMUF9OQVRJVkVfQ19JTkNMVURFX1BBVEggLi4vaW5jbHVkZQotI2VsaWYgKF9fU1VOUFJPX0NDIDwgMHg1MTApCi0vLyAjICBkZWZpbmUgX1NUTFBfTkFUSVZFX0NfSEVBREVSKGhlYWRlcikgPC4uL0NDLyMjaGVhZGVyIyMuU1VOV0NDaD4KLSMgIGRlZmluZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSEVBREVSKGhlYWRlcikgPC4uL0NDLyMjaGVhZGVyIyMuU1VOV0NDaD4KLSMgIGRlZmluZSBfU1RMUF9OQVRJVkVfQ19JTkNMVURFX1BBVEggL3Vzci9pbmNsdWRlCi0jZWxpZiBkZWZpbmVkKCBfX1N1bk9TXzVfNV8xICkgfHwgZGVmaW5lZCggX19TdW5PU181XzYgKSB8fCBkZWZpbmVkKCBfX1N1bk9TXzVfNyApCi0jICBkZWZpbmUgX1NUTFBfTkFUSVZFX0NfSU5DTFVERV9QQVRIIC4uL0NDL3N0ZAotIyAgZGVmaW5lIF9TVExQX05BVElWRV9DUFBfQ19JTkNMVURFX1BBVEggLi4vQ0Mvc3RkCi0jZWxzZQotIyAgZGVmaW5lIF9TVExQX05BVElWRV9DX0lOQ0xVREVfUEFUSCAvdXNyL2luY2x1ZGUKLSMgIGRlZmluZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSU5DTFVERV9QQVRIIC4uL0NDL3N0ZAotI2VuZGlmCi0KLSNpZiAoIF9fU1VOUFJPX0NDIDwgMHg1MDAgKQotCi0jICB1bmRlZiBfU1RMUF9OQVRJVkVfQ19IRUFERVIKLSMgIHVuZGVmIF9TVExQX05BVElWRV9DUFBfQ19IRUFERVIKLQotIyAgZGVmaW5lIHdpbnRfdCBfX3dpbnRfdAotLy8gZmFtb3VzIENDIDQuMiBidWcKLSMgIGRlZmluZSBfU1RMUF9JTkxJTkVfU1RSSU5HX0xJVEVSQUxfQlVHIDEKLS8vIC91c3IvaW5jbHVkZQotIyAgZGVmaW5lIF9TVExQX05BVElWRV9DX0lOQ0xVREVfUEFUSCAuLi9pbmNsdWRlCi0KLS8vIDQuMiBjYW5ub3QgaGFuZGxlIGl0ZXJhdG9yX3RyYWl0czxfVHA+OjppdGVyYXRvcl9jYXRlZ29yeSBhcyBhIHJldHVybiB0eXBlIDsoCi0jICBkZWZpbmUgX1NUTFBfVVNFX09MRF9IUF9JVEVSQVRPUl9RVUVSSUVTCi0KLS8vIDQuMiBkb2VzIG5vdCBsaWtlIGl0Ci0jICB1bmRlZiAgX1NUTFBfUEFSVElBTF9TUEVDX05FRURTX1RFTVBMQVRFX0FSR1MKLQotIyAgZGVmaW5lIF9TVExQX0xJTUlURURfREVGQVVMVF9URU1QTEFURVMgMQotCi0jICBkZWZpbmUgX1NUTFBfTkVFRF9UWVBFTkFNRSAxCi0jICBkZWZpbmUgX1NUTFBfTkVFRF9FWFBMSUNJVCAxCi0jICBkZWZpbmUgX1NUTFBfTk9fQkFEX0FMTE9DIDEKLSMgIGRlZmluZSBfU1RMUF9OT19BUlJPV19PUEVSQVRPUiAxCi0KLSMgIGRlZmluZSBfU1RMUF9ERUZfQ09OU1RfUExDVF9ORVdfQlVHIDEKLSMgIGRlZmluZSBfU1RMUF9ERUZfQ09OU1RfREVGX1BBUkFNX0JVRyAxCi0jICBkZWZpbmUgX1NUTFBfR0xPQkFMX05FU1RFRF9SRVRVUk5fVFlQRV9QQVJBTV9CVUcgMQotIyAgdW5kZWYgIF9TVExQX0hBU19OT19ORVdfQ19IRUFERVJTCi0jICBkZWZpbmUgX1NUTFBfSEFTX05PX05FV19DX0hFQURFUlMgMQotLy8gIyAgZGVmaW5lIF9TVExQX0RPTlRfU0lNVUxBVEVfUEFSVElBTF9TUEVDX0ZPUl9UWVBFX1RSQUlUUwotCi0jICBpZiAoIF9fU1VOUFJPX0NDIDwgMHg0MjAgKQotIyAgICBkZWZpbmUgX1NUTFBfTk9fUEFSVElBTF9TUEVDSUFMSVpBVElPTl9TWU5UQVggMQotIyAgICBkZWZpbmUgX1NUTFBfTk9fTkVXX1NUWUxFX0NBU1RTIDEKLSMgICAgZGVmaW5lIF9TVExQX05PX01FVEhPRF9TUEVDSUFMSVpBVElPTiAxCi0jICAgIGlmICggX19TVU5QUk9fQ0MgPiAweDQwMSApCi0jICAgICAgaWYgKF9fU1VOUFJPX0NDPT0weDQxMCkKLSMgICAgICAgIGRlZmluZSBfU1RMUF9CQVNFX1RZUEVERUZfT1VUU0lERV9CVUcgIDEKLSMgICAgICBlbmRpZgotIyAgICBlbHNlCi0gICAvLyBTVU5Qcm8gQysrIDQuMC4xCi0jICAgICAgZGVmaW5lIF9TVExQX0JBU0VfTUFUQ0hfQlVHICAgICAgICAgIDEKLSMgICAgICBkZWZpbmUgX1NUTFBfQkFTRV9UWVBFREVGX0JVRyAgICAgICAgMQotIyAgICAgIGlmICgoIF9fU1VOUFJPX0NDIDwgMHg0MDEgKSAmJiAhZGVmaW5lZChfX1NVTlBST19DKSkKLSAgICAgICAgIF9fR0lWRV9VUF9XSVRIX1NUTChTVU5QUk9fNDAxKQotIyAgICAgIGVuZGlmCi0jICAgIGVuZGlmIC8qIDQuMC4xICovCi0jICBlbmRpZiAvKiA0LjIgKi8KLSNlbmRpZiAvKiA8ICA1LjAgKi8KLQotI2lmbmRlZiBfTUJTVEFURVRfSAotIyAgZGVmaW5lIF9NQlNUQVRFVF9ICi0jICB1bmRlZiBfTUJTVEFURV9UCi0jICBkZWZpbmUgX01CU1RBVEVfVAotdHlwZWRlZiBzdHJ1Y3QgX19tYnN0YXRlX3QgewotIyAgaWYgZGVmaW5lZChfTFA2NCkKLSAgbG9uZyAgICBfX2ZpbGxlcls0XTsKLSMgIGVsc2UKLSAgaW50ICAgICBfX2ZpbGxlcls2XTsKLSMgIGVuZGlmCi19IF9fbWJzdGF0ZV90OwotIyAgaWZuZGVmIF9TVExQX0hBU19OT19OQU1FU1BBQ0VTCi1uYW1lc3BhY2Ugc3RkIHsKLSAgdHlwZWRlZiBfX21ic3RhdGVfdCBtYnN0YXRlX3Q7Ci19Ci11c2luZyBzdGQ6Om1ic3RhdGVfdDsKLSMgIGVsc2UKLXR5cGVkZWYgX19tYnN0YXRlX3QgbWJzdGF0ZV90OwotIyAgZW5kaWYKLSNlbmRpZiAgLyogX19NQlNUQVRFVF9IICovCmRpZmYgLS1naXQgYS9zdGwvY29uZmlnL19zeW1hbnRlYy5oIGIvc3RsL2NvbmZpZy9fc3ltYW50ZWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkyNmJmNS4uMDAwMDAwMAotLS0gYS9zdGwvY29uZmlnL19zeW1hbnRlYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyogU1RMcG9ydCBjb25maWd1cmF0aW9uIGZpbGUKLSAqIEl0IGlzIGludGVybmFsIFNUTHBvcnQgaGVhZGVyIC0gRE8gTk9UIGluY2x1ZGUgaXQgZGlyZWN0bHkKLSAqLwotCi0jZGVmaW5lIF9TVExQX0NPTVBJTEVSICJTeW1hbnRlYyIKLQotLyogaWYgbm90IHVzaW5nIG1heGltdW0gQU5TSSBjb21wYXRpYmlsaXR5ICggLUEgLUFiIC1BdyksCi0gKiB1bmNvbW1lbnQgdGhlIGZvbGxvd2luZyB0d28gbGluZXM6Ci0gKi8KLS8qIyAgZGVmaW5lIF9TVExQX05PX0JPT0wgMSAqLwotLyojICBkZWZpbmUgX1NUTFBfTk9fV0NIQVJfVCAxICovCi0KLS8qIFRPRE86IENoZWNrIHRoYXQgdGhpcyBjb25maWcgaXMgbmVjZXNzYXJ5IGZvciBhbGwgY29tcGlsZXIgdmVyc2lvbnMuCi0gKiBJdCBpcyBoZXJlIGZvciBoaXN0b3JpY2FsIHJlYXNvbnMgZm9yIHRoZSBtb21lbnQuCi0gKi8KLSNkZWZpbmUgX1NUTFBfTk9fQ09OVEFJTkVSU19FWFRFTlNJT04KLQotIyAgZGVmaW5lIF9TVExQX0hBU19OT19OQU1FU1BBQ0VTIDEKLQotIyAgZGVmaW5lIF9TVExQX05FRURfVFlQRU5BTUUgMQotIyAgZGVmaW5lIF9TVExQX05FRURfRVhQTElDSVQgMQotIyAgZGVmaW5lIF9TVExQX05PX05FV19TVFlMRV9DQVNUUyAxCi0jICBkZWZpbmUgX1NUTFBfTkVFRF9NVVRBQkxFIDEKLSMgIGRlZmluZSBfU1RMUF9OT19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OX1NZTlRBWCAxCi0vKiAjICBkZWZpbmUgX1NUTFBfTk9fQkFEX0FMTE9DIDEgKi8KLQotIyAgZGVmaW5lIF9TVExQX05PX01FTUJFUl9URU1QTEFURVMgMQotIyAgZGVmaW5lIF9TVExQX05PX01FTUJFUl9URU1QTEFURV9DTEFTU0VTIDEKLSMgIGRlZmluZSBfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVfS0VZV09SRCAxCi0jICBkZWZpbmUgX1NUTFBfTk9fRlJJRU5EX1RFTVBMQVRFUyAxCi0jICBkZWZpbmUgX1NUTFBfTk9fUVVBTElGSUVEX0ZSSUVORFMgMQotIyAgZGVmaW5lIF9TVExQX05PX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04gMQotIyAgZGVmaW5lIF9TVExQX05PX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUiAxCi0KLS8qICMgIGRlZmluZSBfU1RMUF9OT19ERUZBVUxUX05PTl9UWVBFX1BBUkFNIDEgKi8KLSMgIGRlZmluZSBfU1RMUF9OT19NRVRIT0RfU1BFQ0lBTElaQVRJT04gMQotIyAgZGVmaW5lIF9TVExQX05PX0VYUExJQ0lUX0ZVTkNUSU9OX1RNUExfQVJHUyAxCi0vKiAjICBkZWZpbmUgX1NUTFBfTk9fRVhDRVBUSU9OX0hFQURFUiAxICovCi0KLSMgIGRlZmluZSBfU1RMUF9IQVNfTk9fTkVXX0NfSEVBREVSUyAxCi0KLSMgIGRlZmluZSBfU1RMUF9TVEFUSUNfQ09OU1RfSU5JVF9CVUcgMQotIyAgZGVmaW5lIF9TVExQX1RIUk9XX1JFVFVSTl9CVUcgMQotLyogIyAgZGVmaW5lIF9TVExQX0xJTktfVElNRV9JTlNUQU5USUFUSU9OIDEgKi8KLSMgIGRlZmluZSBfU1RMUF9OT19URU1QTEFURV9DT05WRVJTSU9OUyAxCi0KLSMgIGRlZmluZSBfU1RMUF9OT05fVFlQRV9UTVBMX1BBUkFNX0JVRyAxCi0KZGlmZiAtLWdpdCBhL3N0bC9jb25maWcvX3N5c3RlbS5oIGIvc3RsL2NvbmZpZy9fc3lzdGVtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMjIwNDQuLjAwMDAwMDAKLS0tIGEvc3RsL2NvbmZpZy9fc3lzdGVtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5NwotICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogQm9yaXMgRm9taXRjaGV2Ci0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICovCi0KLS8qCi0gKiBQdXJwb3NlIG9mIHRoaXMgZmlsZSA6Ci0gKgotICogVG8gaG9sZCBDT01QSUxFUi1TUEVDSUZJQyBwb3J0aW9uIG9mIFNUTHBvcnQgc2V0dGluZ3MuCi0gKiBJbiBnZW5lcmFsLCB1c2VyIHNob3VsZCBub3QgZWRpdCB0aGlzIGZpbGUgdW5sZXNzCi0gKiB1c2luZyB0aGUgY29tcGlsZXIgbm90IHJlY29nbml6ZWQgYmVsb3cuCi0gKgotICogSWYgeW91ciBjb21waWxlciBpcyBub3QgYmVpbmcgcmVjb2duaXplZCB5ZXQsCi0gKiBwbGVhc2UgbG9vayBmb3IgZGVmaW5pdGlvbnMgb2YgbWFjcm9zIGluIHN0bF9teWNvbXAuaCwKLSAqIGNvcHkgc3RsX215Y29tcC5oIHRvIHN0bF9ZT1VSX0NPTVBJTEVSX05BTUUsCi0gKiBhZGp1c3QgZmxhZ3MgZm9yIHlvdXIgY29tcGlsZXIsIGFuZCBhZGQgIDxpbmNsdWRlIGNvbmZpZy9zdGxfWU9VUl9DT01QSUxFUl9OQU1FPgotICogdG8gdGhlIHNlY3RvbiBjb250cm9sbGVkIGJ5IHVuaXF1ZSBtYWNybyBkZWZpbmVkIGludGVybmFseSBieSB5b3VyIGNvbXBpbGVyLgotICoKLSAqIFRvIGNoYW5nZSB1c2VyLWRlZmluYWJsZSBzZXR0aW5ncywgcGxlYXNlIGVkaXQgPHVzZXJfY29uZmlnLmg+Ci0gKgotICovCi0KLSNpZm5kZWYgX19zdGxfY29uZmlnX19zeXN0ZW1faAotI2RlZmluZSBfX3N0bF9jb25maWdfX3N5c3RlbV9oCi0KLSNpZiBkZWZpbmVkKF9fU1lNQklBTjMyX18pCi0jICBpZiBkZWZpbmVkKF9fR0NDRV9fKSB8fCBkZWZpbmVkKF9fQVJNQ0NfXykKLSMgICAgaW5jbHVkZSA8c3RsL2NvbmZpZy9zdGxfZ2NjZS5oPgotIyAgZWxpZiBkZWZpbmVkKF9fV0lOU0NXX18pCi0jICAgIGluY2x1ZGUgPHN0bC9jb25maWcvc3RsX3dpbnNjdy5oPgotIyAgZW5kaWYKLSMgIGluY2x1ZGUgPHN0bC9jb25maWcvc3RsX3N5bWJpYW4uaD4KLSNlbGlmIGRlZmluZWQgKF9fc3VuKQotIyAgaW5jbHVkZSA8c3RsL2NvbmZpZy9fc29sYXJpcy5oPgotIyAgaWYgZGVmaW5lZCAoX19HTlVDX18pCi0jICAgIGluY2x1ZGUgPHN0bC9jb25maWcvX2djYy5oPgotIyAgZWxpZiBkZWZpbmVkIChfX1NVTlBST19DQykKLSMgICAgaW5jbHVkZSA8c3RsL2NvbmZpZy9fc3VucHJvY2MuaD4KLS8qCi0jICBpZmRlZiBfX0tDQwotIyAgICBpbmNsdWRlIDxzdGwvY29uZmlnL19rYWkuaD4KLSMgIGVuZGlmCi0qLwotIyAgZWxpZiBkZWZpbmVkIChfX0FQT0dFRV9fKSAgLyogQXBvZ2VlIDQueCAqLwotIyAgICBpbmNsdWRlIDxzdGwvY29uZmlnL19hcGNjLmg+Ci0jICBlbGlmIGRlZmluZWQgKF9fRkNDX1ZFUlNJT04pIC8qIEZ1aml0c3UgQ29tcGlsZXIsIHY0LjAgYXNzdW1lZCAqLwotIyAgICBpbmNsdWRlIDxzdGwvY29uZmlnL19mdWppdHN1Lmg+Ci0jICBlbmRpZgotI2VsaWYgZGVmaW5lZCAoX19ocHV4KQotIyAgaW5jbHVkZSA8c3RsL2NvbmZpZy9faHB1eC5oPgotIyAgaWYgZGVmaW5lZCAoX19HTlVDX18pCi0jICAgIGluY2x1ZGUgPHN0bC9jb25maWcvX2djYy5oPgotIyAgZWxpZiBkZWZpbmVkIChfX0hQX2FDQykKLSMgICAgaW5jbHVkZSA8c3RsL2NvbmZpZy9faHBhY2MuaD4KLSMgIGVuZGlmCi0jZWxpZiBkZWZpbmVkIChBTkRST0lEKQotICAgLyogQW5kcm9pZCBtb2JpbGUgcGhvbmUgcGxhdGZvcm0uIFNvbWV3aGF0IGJ1dCBub3QgZW50aXJlbHkgR05VL0xpbnV4LWxpa2UgKi8KLSMgIGluY2x1ZGUgPHN0bC9jb25maWcvX2FuZHJvaWQuaD4KLSMgIGluY2x1ZGUgPHN0bC9jb25maWcvX2djYy5oPgotI2VsaWYgZGVmaW5lZCAobGludXgpIHx8IGRlZmluZWQgKF9fbGludXhfXykKLSMgIGluY2x1ZGUgPHN0bC9jb25maWcvX2xpbnV4Lmg+Ci0vKiBJbnRlbCdzIGljYyBkZWZpbmUgX19HTlVDX18hICovCi0jICBpZiBkZWZpbmVkIChfX0lOVEVMX0NPTVBJTEVSKQotIyAgICBpbmNsdWRlIDxzdGwvY29uZmlnL19pY2MuaD4KLSMgIGVsaWYgZGVmaW5lZCAoX19HTlVDX18pCi0jICAgIGluY2x1ZGUgPHN0bC9jb25maWcvX2djYy5oPgotIyAgZW5kaWYKLS8qCi0jICBpZmRlZiBfX0tDQwotIyAgICBpbmNsdWRlIDxzdGwvY29uZmlnL19rYWkuaD4KLSMgIGVuZGlmCi0qLwotI2VsaWYgZGVmaW5lZCAoX19GcmVlQlNEX18pCi0jICBpbmNsdWRlIDxzdGwvY29uZmlnL19mcmVlYnNkLmg+Ci0jICBpZiBkZWZpbmVkIChfX0dOVUNfXykKLSMgICAgaW5jbHVkZSA8c3RsL2NvbmZpZy9fZ2NjLmg+Ci0jICBlbmRpZgotI2VsaWYgZGVmaW5lZCAoX19PcGVuQlNEX18pCi0jICBpbmNsdWRlIDxzdGwvY29uZmlnL19vcGVuYnNkLmg+Ci0jICBpZiBkZWZpbmVkIChfX0dOVUNfXykKLSMgICAgaW5jbHVkZSA8c3RsL2NvbmZpZy9fZ2NjLmg+Ci0jICBlbmRpZgotI2VsaWYgZGVmaW5lZCAoTl9QTEFUX05MTSkgLyogTm92ZWxsIE5ldFdhcmUgKi8KLSMgIGluY2x1ZGUgPHN0bC9jb25maWcvX25ldHdhcmUuaD4KLSMgIGlmZGVmIF9fTVdFUktTX18gLyogTWV0cm93ZXJrcyBDb2RlV2FycmlvciAqLwotIyAgICBpbmNsdWRlIDxzdGwvY29uZmlnL19td2NjbmxtLmg+Ci0jICBlbmRpZgotI2VsaWYgZGVmaW5lZCAoX19zZ2kpIC8qIElSSVg/ICovCi0jICBkZWZpbmUgX1NUTFBfUExBVEZPUk0gIlNHSSBJcml4IgotIyAgaWYgZGVmaW5lZCAoX19HTlVDX18pCi0jICAgIGluY2x1ZGUgPHN0bC9jb25maWcvX2djYy5oPgotIyAgZWxzZQotIyAgICBpbmNsdWRlIDxzdGwvY29uZmlnL19zZ2kuaD4KLSMgIGVuZGlmCi0jZWxpZiBkZWZpbmVkIChfX09TNDAwX18pIC8qIEFTLzQwMCBDKysgKi8KLSMgIGRlZmluZSBfU1RMUF9QTEFURk9STSAiT1MgNDAwIgotIyAgaWYgZGVmaW5lZCAoX19HTlVDX18pCi0jICAgIGluY2x1ZGUgPHN0bC9jb25maWcvX2djYy5oPgotIyAgZWxzZQotIyAgICBpbmNsdWRlIDxzdGwvY29uZmlnL19hczQwMC5oPgotIyAgZW5kaWYKLSNlbGlmIGRlZmluZWQgKF9BSVgpCi0jICBpbmNsdWRlIDxzdGwvY29uZmlnL19haXguaD4KLSMgIGlmIGRlZmluZWQgKF9feGxDX18pIHx8IGRlZmluZWQgKF9fSUJNQ19fKSB8fCBkZWZpbmVkICggX19JQk1DUFBfXyApCi0gICAgIC8qIEFJWCB4bEMsIFZpc3VhbCBBZ2UgQysrICwgT1MtMzkwIEMrKyAqLwotIyAgICBpbmNsdWRlIDxzdGwvY29uZmlnL19pYm0uaD4KLSMgIGVuZGlmCi0jZWxpZiBkZWZpbmVkIChfQ1JBWSkgLyogQ3JheSBDKysgMy40IG9yIDMuNSAqLwotIyAgZGVmaW5lIF9TVExQX1BMQVRGT1JNICJDcmF5IgotIyAgaW5jbHVkZSA8Y29uZmlnL19jcmF5Lmg+Ci0jZWxpZiBkZWZpbmVkIChfX0RFQ0NYWCkgfHwgZGVmaW5lZCAoX19ERUNDKQotIyAgZGVmaW5lIF9TVExQX1BMQVRGT1JNICJERUNDIgotIyAgaWZkZWYgX192bXMKLSMgICAgaW5jbHVkZSA8c3RsL2NvbmZpZy9fZGVjX3Ztcy5oPgotIyAgZWxzZQotIyAgICBpbmNsdWRlIDxzdGwvY29uZmlnL19kZWMuaD4KLSMgIGVuZGlmCi0jZWxpZiBkZWZpbmVkIChtYWNpbnRvc2gpIHx8IGRlZmluZWQgKF9NQUMpCi0jICBpbmNsdWRlIDxzdGwvY29uZmlnL19tYWMuaD4KLSMgIGlmIGRlZmluZWQgKF9fTVdFUktTX18pCi0jICAgIGluY2x1ZGUgPHN0bC9jb25maWcvX213ZXJrcy5oPgotIyAgZWxpZiBkZWZpbmVkIChfX01SQ19fKSB8fCAoZGVmaW5lZCAoX19TQ19fKSAmJiAoX19TQ19fID49IDB4ODgyKSkKLSAgICAgLyogQXBwbGUgTVBXIFNDcHAgOC44LjIsIEFwcGxlIE1QVyBNckNwcCA0LjEuMCAqLwotIyAgICBpbmNsdWRlIDxzdGwvY29uZmlnL19hcHBsZS5oPgotIyAgZW5kaWYKLSNlbGlmIGRlZmluZWQgKF9fQVBQTEVfXykKLSMgIGluY2x1ZGUgPHN0bC9jb25maWcvX21hY29zeC5oPgotIyAgaWZkZWYgX19HTlVDX18KLSMgICAgaW5jbHVkZSA8c3RsL2NvbmZpZy9fZ2NjLmg+Ci0jICBlbmRpZgotI2VsaWYgZGVmaW5lZCAoX19DWUdXSU5fXykKLSMgIGluY2x1ZGUgPHN0bC9jb25maWcvX2N5Z3dpbi5oPgotIyAgaWYgZGVmaW5lZCAoX19HTlVDX18pCi0jICAgIGluY2x1ZGUgPHN0bC9jb25maWcvX2djYy5oPgotIyAgZW5kaWYKLSNlbGlmIGRlZmluZWQgKF9fTUlOR1czMl9fKQotIyAgZGVmaW5lIF9TVExQX1BMQVRGT1JNICJNaW5HVyIKLSMgIGlmIGRlZmluZWQgKF9fR05VQ19fKQotIyAgICBpbmNsdWRlIDxzdGwvY29uZmlnL19nY2MuaD4KLSMgIGVuZGlmCi0jICBpbmNsdWRlIDxzdGwvY29uZmlnL193aW5kb3dzLmg+Ci0jZWxpZiBkZWZpbmVkIChfV0lOMzIpIHx8IGRlZmluZWQgKF9fV0lOMzIpIHx8IGRlZmluZWQgKFdJTjMyKSB8fCBkZWZpbmVkIChfX1dJTjMyX18pIHx8IFwKLSAgICAgIGRlZmluZWQgKF9fV0lOMTYpIHx8IGRlZmluZWQgKFdJTjE2KSB8fCBkZWZpbmVkIChfV0lOMTYpCi0jICBpZiBkZWZpbmVkICggX19CT1JMQU5EQ19fICkgIC8qIEJvcmxhbmQgQysrICggNC54IC0gNS54ICkgKi8KLSMgICAgaW5jbHVkZSA8c3RsL2NvbmZpZy9fYmMuaD4KLSMgIGVsaWYgZGVmaW5lZCAoX19XQVRDT01fQ1BMVVNQTFVTX18pIHx8IGRlZmluZWQgKF9fV0FUQ09NQ19fKSAgLyogV2F0Y29tIEMrKyAqLwotIyAgICBpbmNsdWRlIDxzdGwvY29uZmlnL193YXRjb20uaD4KLSMgIGVsaWYgZGVmaW5lZCAoX19DT01PX18pIHx8IGRlZmluZWQgKF9fQ09NT19WRVJTSU9OXykKLSMgICAgaW5jbHVkZSA8c3RsL2NvbmZpZy9fY29tby5oPgotIyAgZWxpZiBkZWZpbmVkIChfX0RNQ19fKSAgIC8qIERpZ2l0YWwgTWFycyBDKysgKi8KLSMgICAgaW5jbHVkZSA8c3RsL2NvbmZpZy9fZG0uaD4KLSMgIGVsaWYgZGVmaW5lZCAoX19TQ19fKSAmJiAoX19TQ19fIDwgMHg4MDApIC8qIFN5bWFudGVjIDcuNSAqLwotIyAgICBpbmNsdWRlIDxzdGwvY29uZmlnL19zeW1hbnRlYy5oPgotIyAgZWxpZiBkZWZpbmVkIChfX0lDTCkgLyogSW50ZWwgcmVmZXJlbmNlIGNvbXBpbGVyIGZvciBXaW4gKi8KLSMgICAgaW5jbHVkZSA8c3RsL2NvbmZpZy9faW50ZWwuaD4KLSMgIGVsaWYgZGVmaW5lZCAoX19NV0VSS1NfXykKLSMgICAgaW5jbHVkZSA8c3RsL2NvbmZpZy9fbXdlcmtzLmg+Ci0jICBlbGlmIGRlZmluZWQgKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkgJiYgZGVmaW5lZCAoVU5ERVJfQ0UpCi0gICAgIC8qIE1pY3Jvc29mdCBlTWJlZGRlZCBWaXN1YWwgQysrIDMuMCwgNC4wICguTkVUKSAqLwotIyAgICBpbmNsdWRlIDxzdGwvY29uZmlnL19ldmMuaD4KLSMgIGVsaWYgZGVmaW5lZCAoX01TQ19WRVIpCi0gICAgLyogTWljcm9zb2Z0IFZpc3VhbCBDKysgNi4wLCA3LjAsIDcuMSwgOC4wICovCi0jICAgIGluY2x1ZGUgPHN0bC9jb25maWcvX21zdmMuaD4KLSMgIGVuZGlmCi0KLSMgIGluY2x1ZGUgPHN0bC9jb25maWcvX3dpbmRvd3MuaD4KLSNlbHNlCi0jICBlcnJvciBVbmtub3duIHBsYXRmb3JtICEhCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkIChfU1RMUF9DT01QSUxFUikKLS8qIFVuYWJsZSB0byBpZGVudGlmeSB0aGUgY29tcGlsZXIsIGlzc3VlIGVycm9yIGRpYWdub3N0aWMuCi0gKiBFZGl0IDxjb25maWcvc3RsX215Y29tcC5oPiB0byBzZXQgU1RMcG9ydCB1cCBmb3IgeW91ciBjb21waWxlci4gKi8KLSMgIGluY2x1ZGUgPHN0bC9jb25maWcvc3RsX215Y29tcC5oPgotI2VuZGlmCi0KLSNlbmRpZiAvKiBfX3N0bF9jb25maWdfX3N5c3RlbV9oICovCmRpZmYgLS1naXQgYS9zdGwvY29uZmlnL193YXJuaW5nc19vZmYuaCBiL3N0bC9jb25maWcvX3dhcm5pbmdzX29mZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjE4ZTZlLi4wMDAwMDAwCi0tLSBhL3N0bC9jb25maWcvX3dhcm5pbmdzX29mZi5oCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyogVGhpcyBoZWFkZXIgdHVybnMgb2ZmIHdhcm5pbmdzIHRoYXQgU1RMcG9ydCBoZWFkZXJzIGdlbmVyYXRlIGZvciBjb21waWxlZAotICogdXNlciBjb2RlLgotICovCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9NU1ZDKQotIyAgaWYgKF9TVExQX01TVkMgPiAxMDAwKQotIyAgICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfTVNWQzZfTUVNX1RfQlVHX1dPUktBUk9VTkQpCi0vKgotICogMzEvMDcvMjAwNDogZHVtcyAtIG5vdyB0aGF0IHdlIGRvIG5vdCBleHBvcnQgdGhlIGJhc2ljX3N0cmluZyBjbGFzcyBhbnltb3JlIGJ1dCBvbmx5IGEgYmFzZSBjbGFzcwotICogd2UgaGF2ZSB0byBkaXNhYmxlIHRoaXMgd2FybmluZyBhcyB0aGUgc3RyaW5nIGFyZSB1c2VkIGFzIGRhdGEgbWVtYmVycyB0eXBlIG9mIG1hbnkgaW9zdHJlYW0gY2xhc3Nlcy4KLSAqLwotIyAgICAgIHByYWdtYSB3YXJuaW5nICggZGlzYWJsZSA6IDQyNTEgKSAgLy8gaWdub3JlIHRlbXBsYXRlIGNsYXNzZXMgYmVpbmcgZXhwb3J0ZWQgaW4gLmRsbCdzCi0jICAgIGVuZGlmCi0KLSMgICAgaWYgKF9TVExQX01TVkMgPCAxMjAwKSAvLyBWQzUgYW5kIGVhcmxpZXIKLSMgICAgICBwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQzODkgKSAvLyAnPT0nIDogc2lnbmVkL3Vuc2lnbmVkIG1pc21hdGNoCi0vLyBtdWx0aXBsZSBjb3B5IGNvbnN0cnVjdG9ycy9hc3NpZ25tZW50IG9wZXJhdG9ycyBzcGVjaWZpZWQsCi0vLyB3aXRoIG1lbWJlciB0ZW1wbGF0ZXMgYXJlIGJvZ3VzLi4uCi0jICAgICAgcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0NTIxICkKLSMgICAgICBwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQ1MjIgKQotIyAgICBlbmRpZgotCi0jICAgIGlmIChfU1RMUF9NU1ZDIDwgMTMwMCkgLy8gVkM2LCBlVkMzLCBlVkM0Ci0jICAgICAgcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0MDk3ICkgLy8gdHlwZWRlZi1uYW1lIHVzZWQgYXMgYmFzZWQgY2xhc3Mgb2YgKC4uLikKLSMgICAgICBwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQyMzEgKSAvLyBub24gc3RhbmRhcmQgZXh0ZW5zaW9uIDogJ2V4dGVybicgYmVmb3JlIHRlbXBsYXRlIGluc3RhbmNpYXRpb24KLSMgICAgICBwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQyNDQgKSAvLyBpbXBsaWNpdCBjb252ZXJzaW9uOiBwb3NzaWJsZSBsb3NzIG9mIGRhdGEKLSMgICAgICBwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQyODQgKSAvLyBmb3IgLT4gb3BlcmF0b3IKLS8vVGhpcyB3YXJuaW5nIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIG9mIHRoZSBuYXRpdmUgcGxhdGZvcm0gaGVhZGVyczoKLSMgICAgICBwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQyOTAgKSAvLyBjKysgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24gaWdub3JlZAotIyAgICAgIHByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDUxNCApIC8vIHVucmVmZXJlbmNlZCBpbmxpbmUgZnVuY3Rpb24gaGFzIGJlZW4gcmVtb3ZlZAotIyAgICAgIHByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDY2MCApIC8vIHRlbXBsYXRlLWNsYXNzIHNwZWNpYWxpemF0aW9uICcuLi4nIGlzIGFscmVhZHkgaW5zdGFudGlhdGVkCi0jICAgICAgcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0NzAxICkgLy8gbG9jYWwgdmFyaWFibGUgJy4uLicgbWF5IGJlIHVzZWQgd2l0aG91dCBoYXZpbmcgYmVlbiBpbml0aWFsaXplZAotIyAgICAgIHByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDcxMCApIC8vIGZ1bmN0aW9uICguLi4pIG5vdCBpbmxpbmVkCi0jICAgICAgcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0Nzg2ICkgLy8gaWRlbnRpZmllciB0cnVuY2F0ZWQgdG8gMjU1IGNoYXJhY3RlcnMKLSMgICAgZW5kaWYKLQotIyAgICBpZiAoX1NUTFBfTVNWQyA8IDE0MDApCi0jICAgICAgcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0NTExICkgLy8gY29weSBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgZ2VuZXJhdGVkCi0jICAgIGVuZGlmCi0KLS8vUG9vbCBvZiBjb21tb24gd2FybmluZ3MgZm9yIGFsbCBNU1ZDIHN1cHBvcnRlZCB2ZXJzaW9uczoKLS8vTWFueSBhcmUgb25seSB1c2VmdWwgaWYgd2FybmluZyBsZXZlbCBpcyBzZXQgdG8gNC4KLSMgICAgcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0MTAwICkgLy8gdW5yZWZlcmVuY2VkIGZvcm1hbCBwYXJhbWV0ZXIKLSMgICAgcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0MTI3ICkgLy8gY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBpcyBjb25zdGFudAotIyAgICBwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQxNDYgKSAvLyB1bmFyeSBtaW51cyBvcGVyYXRvciBhcHBsaWVkIHRvIHVuc2lnbmVkIHR5cGUsIHJlc3VsdCBzdGlsbCB1bnNpZ25lZAotIyAgICBwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQyNDUgKSAvLyBjb252ZXJzaW9uIGZyb20gJ2VudW0gJyB0byAndW5zaWduZWQgaW50Jywgc2lnbmVkL3Vuc2lnbmVkIG1pc21hdGNoCi0jICAgIHByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDM1NSApIC8vIHRoaXMgdXNlZCBpbiBiYXNlIG1lbWJlciBpbml0aWFsaXplciBsaXN0ICh1c2VkIGluIHJvcGUgaW1wbGVtZW50YXRpb24pCi0jICAgIHByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDUxMCApIC8vIGRlZmF1bHQgY29uc3RydWN0b3IgY2Fubm90IGJlIGdlbmVyYXRlZAotIyAgICBwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQ1MTIgKSAvLyBhc3NpZ25tZW50IG9wZXJhdG9yIGNvdWxkIG5vdCBiZSBnZW5lcmF0ZWQKLSMgICAgcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0NTcxICkgLy8gY2F0Y2goLi4uKSBibG9ja3MgY29tcGlsZWQgd2l0aCAvRUhzIGRvIG5vdCBjYXRjaCBvciByZS10aHJvdyBTdHJ1Y3R1cmVkIEV4Y2VwdGlvbnMKLSMgICAgcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0NjEwICkgLy8gc3RydWN0ICcuLi4nIGNhbiBuZXZlciBiZSBpbnN0YW50aWF0ZWQgLSB1c2VyIGRlZmluZWQgY29uc3RydXRvciByZXF1aXJlZAotIyAgZW5kaWYKLSNlbGlmIGRlZmluZWQgKF9fQk9STEFORENfXykKLSMgIHByYWdtYSBvcHRpb24gLXctY2NjIC8vIC13LTgwMDggQ29uZGl0aW9uIGlzIGFsd2F5cyB0cnVlIE9SIENvbmRpdGlvbiBpcyBhbHdheXMgZmFsc2UKLSMgIHByYWdtYSBvcHRpb24gLXctaW5sIC8vIC13LTgwMjcgRnVuY3Rpb25zIGNvbnRhaW5pbmcgcmVzZXJ2ZWQgd29yZHMgYXJlIG5vdCBleHBhbmRlZCBpbmxpbmUKLSMgIHByYWdtYSBvcHRpb24gLXctbmd1IC8vIC13LTgwNDEgTmVnYXRpbmcgdW5zaWduZWQgdmFsdWUKLSMgIHByYWdtYSBvcHRpb24gLXctcG93IC8vIC13LTgwNjIgUHJldmlvdXMgb3B0aW9ucyBhbmQgd2FybmluZ3Mgbm90IHJlc3RvcmVkCi0jICBwcmFnbWEgb3B0aW9uIC13LXJjaCAvLyAtdy04MDY2IFVucmVhY2hhYmxlIGNvZGUKLSMgIHByYWdtYSBvcHRpb24gLXctcGFyIC8vIC13LTgwNTcgUGFyYW1ldGVyICdwYXJhbWV0ZXInIGlzIG5ldmVyIHVzZWQKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3RsL2NvbmZpZy9fd2F0Y29tLmggYi9zdGwvY29uZmlnL193YXRjb20uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk2MDQyNC4uMDAwMDAwMAotLS0gYS9zdGwvY29uZmlnL193YXRjb20uaAorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vLyBTVExwb3J0IGNvbmZpZ3VyYXRpb24gZmlsZQotLy8gSXQgaXMgaW50ZXJuYWwgU1RMcG9ydCBoZWFkZXIgLSBETyBOT1QgaW5jbHVkZSBpdCBkaXJlY3RseQotCi0jZGVmaW5lIF9TVExQX0NPTVBJTEVSICJXYXRjb20iCi0KLSMgaWZuZGVmIF9TVExQX1VTRV9OT19JT1NUUkVBTVMKLSMgIGRlZmluZSBfU1RMUF9VU0VfTk9fSU9TVFJFQU1TCi0jIGVuZGlmCi0KLSMgZGVmaW5lIF9TVExQX05PX1JFTE9QU19OQU1FU1BBQ0UKLSMgZGVmaW5lIF9TVExQX05PX1BBUlRJQUxfU1BFQ0lBTElaQVRJT05fU1lOVEFYCi0KLSMgIGRlZmluZSBfU1RMUF9IQVNfU1BFQ0lGSUNfUFJPTE9HX0VQSUxPRwotIyAgZGVmaW5lIF9TVExQX0RPTlRfU0lNVUxBVEVfUEFSVElBTF9TUEVDX0ZPUl9UWVBFX1RSQUlUUwotIyAgZGVmaW5lIF9TVExQX1VTRV9PTERfSFBfSVRFUkFUT1JfUVVFUklFUwotCi0vLyBPbiBRTlgsIGhlYWRlcnMgYXJlIHN1cHBvc2VkIHRvIGJlIGZvdW5kIGluIC91c3IvaW5jbHVkZSwKLS8vIHNvIGRlZmF1bHQgIi4uL2luY2x1ZGUiIHNob3VsZCB3b3JrLgotIyBpZm5kZWYgX19RTlhfXwotIyAgZGVmaW5lIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEggLi4vaAotIyBlbmRpZgotCi0vLyBJbmxpbmUgcmVwbGFjZW1lbnRzIGZvciBsb2NraW5nIGNhbGxzIHVuZGVyIFdhdGNvbQotLy8gRGVmaW5lIF9TVExQX05PX1dBVENPTV9JTkxJTkVfSU5URVJMT0NLIHRvIGtlZXAgdXNpbmcKLS8vIHN0YW5kYXJkIFdJTjMyIGNhbGxzCi0vLyBEZWZpbmUgX1NUTF9NVUxUSVBST0NFU1NPUiB0byBlbmFibGUgbG9jawotI2lmICFkZWZpbmVkKF9TVExQX05PX1dBVENPTV9JTkxJTkVfSU5URVJMT0NLKQotCi1sb25nICAgIF9fc3RsX0ludGVybG9ja2VkSW5jcmVtZW50KCBsb25nICp2YXIgKTsKLWxvbmcgICAgX19zdGxfSW50ZXJsb2NrZWREZWNyZW1lbnQoIGxvbmcgKnZhciApOwotCi0jaWZkZWYgX1NUTF9NVUxUSVBST0NFU1NPUgotLy8gTXVsdGlwbGUgUHJvY2Vzc29ycywgYWRkIGxvY2sgcHJlZml4Ci0jcHJhZ21hIGF1eCBfX3N0bF9JbnRlcmxvY2tlZEluY3JlbWVudCBwYXJtIFsgZWN4IF0gPSBcCi0gICAgICAgICIuNTg2IiAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIm1vdiBlYXgsIDEiICAgICAgICAgICAgXAotICAgICAgICAibG9jayB4YWRkIFtlY3hdLCBlYXgiICAgICAgIFwKLSAgICAgICAgImluYyBlYXgiICAgICAgICAgICAgICAgXAotICAgICAgICB2YWx1ZSBbZWF4XTsKLQotCi0jcHJhZ21hIGF1eCBfX3N0bF9JbnRlcmxvY2tlZERlY3JlbWVudCBwYXJtIFsgZWN4IF0gPSBcCi0gICAgICAgICIuNTg2IiAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIm1vdiBlYXgsIDBGRkZGRkZGRmgiICAgXAotICAgICAgICAibG9jayB4YWRkIFtlY3hdLCBlYXgiICAgICAgIFwKLSAgICAgICAgImRlYyBlYXgiICAgICAgICAgICAgICAgXAotICAgICAgICB2YWx1ZSBbZWF4XTsKLSNlbHNlCi0vLyBTaW5nbGUgUHJvY2Vzc29yLCBsb2NrIHByZWZpeCBub3QgbmVlZGVkCi0jcHJhZ21hIGF1eCBfX3N0bF9JbnRlcmxvY2tlZEluY3JlbWVudCBwYXJtIFsgZWN4IF0gPSBcCi0gICAgICAgICIuNTg2IiAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIm1vdiBlYXgsIDEiICAgICAgICAgICAgXAotICAgICAgICAieGFkZCBbZWN4XSwgZWF4IiAgICAgICBcCi0gICAgICAgICJpbmMgZWF4IiAgICAgICAgICAgICAgIFwKLSAgICAgICAgdmFsdWUgW2VheF07Ci0KLSNwcmFnbWEgYXV4IF9fc3RsX0ludGVybG9ja2VkRGVjcmVtZW50IHBhcm0gWyBlY3ggXSA9IFwKLSAgICAgICAgIi41ODYiICAgICAgICAgICAgICAgICAgXAotICAgICAgICAibW92IGVheCwgMEZGRkZGRkZGaCIgICBcCi0gICAgICAgICJ4YWRkIFtlY3hdLCBlYXgiICAgICAgIFwKLSAgICAgICAgImRlYyBlYXgiICAgICAgICAgICAgICAgXAotICAgICAgICB2YWx1ZSBbZWF4XTsKLSNlbmRpZiAvLyBfU1RMX01VTFRJUFJPQ0VTU09SCi0KLWxvbmcgICAgX19zdGxfSW50ZXJsb2NrZWRFeGNoYW5nZSggbG9uZyAqRGVzdGluYXRpb24sIGxvbmcgVmFsdWUgKTsKLQotLy8geGNoZyBoYXMgYXV0by1sb2NrCi0jcHJhZ21hIGF1eCBfX3N0bF9JbnRlcmxvY2tlZEV4Y2hhbmdlIHBhcm0gW2VjeF0gW2VheF0gPSBcCi0gICAgICAgICIuNTg2IiAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgInhjaGcgZWF4LCBbZWN4XSIgICAgICAgXAotICAgICAgICB2YWx1ZSBbZWF4XTsKLSNlbHNlCi0KLSNkZWZpbmUgX19zdGxfSW50ZXJsb2NrZWRJbmNyZW1lbnQgICAgICBJbnRlcmxvY2tlZEluY3JlbWVudAotI2RlZmluZSBfX3N0bF9JbnRlcmxvY2tlZERlY3JlbWVudCAgICAgIEludGVybG9ja2VkRGVjcmVtZW50Ci0jZGVmaW5lIF9fc3RsX0ludGVybG9ja2VkRXhjaGFuZ2UgICAgICAgSW50ZXJsb2NrZWRFeGNoYW5nZQotI2VuZGlmIC8qIElOTElORSBJTlRFUkxPQ0sgKi8KLQotI2RlZmluZSBfU1RMUF9BVE9NSUNfSU5DUkVNRU5UKF9feCkgX19zdGxfSW50ZXJsb2NrZWRJbmNyZW1lbnQoKGxvbmcqKV9feCkKLSNkZWZpbmUgX1NUTFBfQVRPTUlDX0RFQ1JFTUVOVChfX3gpIF9fc3RsX0ludGVybG9ja2VkRGVjcmVtZW50KChsb25nKilfX3gpCi0jZGVmaW5lIF9TVExQX0FUT01JQ19FWENIQU5HRShfX3gsIF9feSkgX19zdGxfSW50ZXJsb2NrZWRFeGNoYW5nZSgobG9uZyopX194LCAobG9uZylfX3kpCi0KLS8vIGJvcmlzIDogaXMgdGhpcyB0cnVlIG9yIGp1c3QgdGhlIGhlYWRlciBpcyBub3QgaW4gL3Vzci9pbmNsdWRlID8KLSMgaWZkZWYgX19RTlhfXwotIyAgZGVmaW5lIF9TVExQX05PX1RZUEVJTkZPIDEKLSMgZW5kaWYKLQotIyAgZGVmaW5lIF9TVExQX05PX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUiAxCi0jICBkZWZpbmUgX1NUTFBfTk9fQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTiAxCi0jICBkZWZpbmUgX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFX0tFWVdPUkQgMQotIyAgZGVmaW5lIF9TVExQX05PX01FTUJFUl9URU1QTEFURVMgMQotIyAgZGVmaW5lIF9TVExQX05PX0ZSSUVORF9URU1QTEFURVMgMQotIyAgZGVmaW5lIF9TVExQX05PX01FTUJFUl9URU1QTEFURV9DTEFTU0VTIDEKLQotCi0jICBkZWZpbmUgX1NUTFBfTElNSVRFRF9ERUZBVUxUX1RFTVBMQVRFUyAxCi0jICBkZWZpbmUgX1NUTFBfSEFTX05PX05BTUVTUEFDRVMgMQotIyAgZGVmaW5lIF9TVExQX05FRURfVFlQRU5BTUUgMQotCi0jICBpZiBfX1dBVENPTUNfXyA8IDExMDAKLSMgIGRlZmluZSBfU1RMUF9OT19XQ0hBUl9UIDEKLSMgIGRlZmluZSBfU1RMUF9OT19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OX1NZTlRBWCAxCi0jICBlbmRpZgotCi0jICBkZWZpbmUgX1NUTFBfTk9fRVhQTElDSVRfRlVOQ1RJT05fVE1QTF9BUkdTIDEKLQotIyAgZGVmaW5lIF9TVExQX1NUQVRJQ19DT05TVF9JTklUX0JVRyAxCi0vLyAjICBkZWZpbmUgX1NUTFBfVEhST1dfUkVUVVJOX0JVRyAxCi0jICBkZWZpbmUgX1NUTFBfTk9fVEVNUExBVEVfQ09OVkVSU0lPTlMgMQotCi0jICBkZWZpbmUgX1NUTFBfQkFTRV9UWVBFREVGX09VVFNJREVfQlVHIDEKLQotIyAgZGVmaW5lIF9TVExQX0hBU19OT19ORVdfSU9TVFJFQU1TIDEKLSMgIGRlZmluZSBfU1RMUF9IQVNfTk9fTkVXX0NfSEVBREVSUyAxCi0jICBkZWZpbmUgX1NUTFBfTk9fTkVXX05FV19IRUFERVIgMQotIyAgZGVmaW5lIF9TVExQX1ZFTkRPUl9HTE9CQUxfU1RECi0KLSMgIGRlZmluZSBfU1RMUF9OT19ERUZBVUxUX05PTl9UWVBFX1BBUkFNIDEKLSMgIGRlZmluZSBfU1RMUF9OT05fVFlQRV9UTVBMX1BBUkFNX0JVRyAxCi0jICBkZWZpbmUgX1NUTFBfTk9OVEVNUExfQkFTRV9NQVRDSF9CVUcKLSMgIGRlZmluZSBfU1RMUF9OT19FWENFUFRJT05fSEVBREVSIDEKLSMgIGRlZmluZSBfU1RMUF9OT19CQURfQUxMT0MgMQotCi0jICBkZWZpbmUgX1NUTFBfTkVTVEVEX1RZUEVfUEFSQU1fQlVHIDEKLQotIyAgZGVmaW5lIF9TVExQX05PX1VTSU5HX0ZPUl9HTE9CQUxfRlVOQ1RJT05TIDEKLQotIyAgaWYgKF9fV0FUQ09NX0NQTFVTUExVU19fIDwgMTEwMCApCi0jICAgZGVmaW5lIF9TVExQX05PX0JPT0wgMQotIyAgIGRlZmluZSBfU1RMUF9ORUVEX0VYUExJQ0lUIDEKLSMgICBkZWZpbmUgX1NUTFBfTkVFRF9NVVRBQkxFIDEKLSMgICBkZWZpbmUgX1NUTFBfTk9fQVJST1dfT1BFUkFUT1IgMQotIyAgZW5kaWYKLS8vIFRoaXMgb25lIGlzIHByZXNlbnQgaW4gMTEsIGJ1dCBhcHBhcmVudGx5IGhhcyBidWdzICh3aXRoIGF1dG9fcHRyKS4KLSMgICBkZWZpbmUgX1NUTFBfTk9fTkVXX1NUWUxFX0NBU1RTIDEKLQotLy8gR2V0IHJpZCBvZiBXYXRjb20ncyBtaW4gYW5kIG1heCBtYWNyb3MKLSN1bmRlZiBtaW4KLSN1bmRlZiBtYXgKLQotLy8gZm9yIHN3aXRjaGVzICgteHMsICAteHNzLCAgLXhzdCkKLS8vCi0jaWYgIShkZWZpbmVkIChfX1NXX1hTKSB8fCBkZWZpbmVkIChfX1NXX1hTUykgfHwgZGVmaW5lZChfX1NXX1hTVCkpCi0jICAgIGRlZmluZSBfU1RMUF9IQVNfTk9fRVhDRVBUSU9OUyAxCi0jIGVuZGlmCi0KLSMgaWYgZGVmaW5lZCAoIF9NVCApICYmICFkZWZpbmVkIChfTk9USFJFQURTKSAmJiAhZGVmaW5lZCAoX1JFRU5UUkFOVCkKLSMgZGVmaW5lIF9SRUVOVFJBTlQgMQotIyBlbmRpZgotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3N0bC9jb25maWcvX3dpbmRvd3MuaCBiL3N0bC9jb25maWcvX3dpbmRvd3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkwNjhiYy4uMDAwMDAwMAotLS0gYS9zdGwvY29uZmlnL193aW5kb3dzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0xOTk5Ci0gKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMwotICogRnJhbmNvaXMgRHVtb250Ci0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICovCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX1dJTkRPV1NfSAotI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9XSU5ET1dTX0gKLQotI2lmICFkZWZpbmVkIChfU1RMUF9QTEFURk9STSkKLSMgIGRlZmluZSBfU1RMUF9QTEFURk9STSAiV2luZG93cyIKLSNlbmRpZgotCi0vKiBfU1RMUF9XSU4zMl9WRVJTSU9OIGlzIHVzZWQgdG8gZGV0ZWN0IHRhcmdldHRlZCBXaW5kb3dzIHBsYXRmb3JtcyBhcwotICogb2xkIG9uZXMgYXJlIG5vdCBzdXBwb3J0aW5nIHNvbWUgV2luMzIgZnVuY3Rpb25zIHRoYXQgU1RMcG9ydCB1c2UuCi0gKiBMaW1pdGVkIE9TcyBhcmUgZ29pbmcgdXAgdG8gYW5kIGluY2x1ZGluZyBXaW5kb3dzIDk4IHNvIHRoZXkgY2FuIGJlCi0gKiBkZXRlY3RlZCB1c2luZyBXSU5WRVIgb3IgX1dJTjMyX1dJTkRPV1MgbWFjcm9zLCB3ZSBkbyBub3QgaGF2ZSB0byB1c2UKLSAqIF9XSU5OVF9XSU5ET1dTIG1hY3JvIGZvciB0aGUgbW9tZW50LgotICovCi0jaWYgIWRlZmluZWQgKF9TVExQX1dJTjMyX1ZFUlNJT04pCi0jICBpZiBkZWZpbmVkIChXSU5WRVIpCi0jICAgIGRlZmluZSBfU1RMUF9XSU4zMl9WRVJTSU9OIFdJTlZFUgotIyAgZWxpZiBkZWZpbmVkIChfV0lOMzJfV0lORE9XUykKLSMgICAgZGVmaW5lIF9TVExQX1dJTjMyX1ZFUlNJT04gX1dJTjMyX1dJTkRPV1MKLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkIChfU1RMUF9CSUdfRU5ESUFOKSAmJiAhZGVmaW5lZCAoX1NUTFBfTElUVExFX0VORElBTikKLSMgIGlmIGRlZmluZWQgKF9NSVBTRUIpCi0jICAgIGRlZmluZSBfU1RMUF9CSUdfRU5ESUFOIDEKLSMgIGVuZGlmCi0jICBpZiBkZWZpbmVkIChfX2kzODYpIHx8IGRlZmluZWQgKF9NX0lYODYpIHx8IGRlZmluZWQgKF9NX0FSTSkgfHwgXAotICAgICAgZGVmaW5lZCAoX19hbWQ2NF9fKSB8fCBkZWZpbmVkIChfTV9BTUQ2NCkgfHwgZGVmaW5lZCAoX194ODZfNjRfXykgfHwgXAotICAgICAgZGVmaW5lZCAoX19hbHBoYV9fKQotIyAgICBkZWZpbmUgX1NUTFBfTElUVExFX0VORElBTiAxCi0jICBlbmRpZgotIyAgaWYgZGVmaW5lZCAoX19pYTY0X18pCi0gICAgLyogaXRhbml1bSBhbGxvd3MgYm90aCBzZXR0aW5ncyAoZm9yIGluc3RhbmNlIHZpYSBnY2MgLW1iaWctZW5kaWFuKSAtIGhlbmNlIGEgc2VwZXJhdGUgY2hlY2sgaXMgcmVxdWlyZWQgKi8KLSMgICAgaWYgZGVmaW5lZCAoX19CSUdfRU5ESUFOX18pCi0jICAgICAgZGVmaW5lIF9TVExQX0JJR19FTkRJQU4gMQotIyAgICBlbHNlCi0jICAgICAgZGVmaW5lIF9TVExQX0xJVFRMRV9FTkRJQU4gMQotIyAgICBlbmRpZgotIyAgZW5kaWYKLSNlbmRpZiAvKiBfU1RMUF9CSUdfRU5ESUFOICovCi0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfV0lORE9XU19IX0lOQ0xVREVEKQotIyAgZGVmaW5lIF9TVExQX1dJTkRPV1NfSF9JTkNMVURFRAotIyAgaWYgIShkZWZpbmVkICggX1NUTFBfTVNWQyApIHx8IGRlZmluZWQgKF9fQk9STEFORENfXykgfHwgZGVmaW5lZCAoX19JQ0wpIHx8IGRlZmluZWQgKF9fV0FUQ09NQ19fKSB8fCBcCi0gICAgICAgIGRlZmluZWQgKF9fTUlOR1czMl9fKSB8fCBkZWZpbmVkIChfX0RNQ19fKSkKLSMgICAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX01GQykKLSMgICAgICBpbmNsdWRlIDxhZnguaD4KLSMgICAgZWxzZQotIyAgICAgIGluY2x1ZGUgPHdpbmRvd3MuaD4KLSMgICAgZW5kaWYKLSMgIGVsc2UKLS8qIFRoaXMgc2VjdGlvbiBzZXJ2ZXMgYXMgYSByZXBsYWNlbWVudCBmb3Igd2luZG93cy5oIGhlYWRlciBmb3IgVmlzdWFsIEMrKyAqLwotIyAgICBpZiBkZWZpbmVkIChfX2NwbHVzcGx1cykKLWV4dGVybiAiQyIgewotIyAgICBlbmRpZgotIyAgICBpZiAoZGVmaW5lZCAoX01fQU1ENjQpIHx8IGRlZmluZWQgKF9NX0lBNjQpIHx8ICghZGVmaW5lZCAoX1NUTFBfV0NFKSAmJiBkZWZpbmVkIChfTV9NUlgwMDApKSB8fCBkZWZpbmVkIChfTV9BTFBIQSkgfHwgXAotICAgICAgICAoZGVmaW5lZCAoX01fUFBDKSAmJiAoX1NUTFBfTVNWQ19MSUIgPj0gMTAwMCkpKSAmJiAhZGVmaW5lZCAoUkNfSU5WT0tFRCkKLSMgICAgICBkZWZpbmUgSW50ZXJsb2NrZWRJbmNyZW1lbnQgICAgICAgX0ludGVybG9ja2VkSW5jcmVtZW50Ci0jICAgICAgZGVmaW5lIEludGVybG9ja2VkRGVjcmVtZW50ICAgICAgIF9JbnRlcmxvY2tlZERlY3JlbWVudAotIyAgICAgIGRlZmluZSBJbnRlcmxvY2tlZEV4Y2hhbmdlICAgICAgICBfSW50ZXJsb2NrZWRFeGNoYW5nZQotLyogSGVyZSB3ZSB1c2UgYSBkaWZmZXJlbnQgbWFjcm8gbmFtZSB0aGFuIHRoZSBJbnRlcmxvY2tlZEV4Y2hhbmdlUG9pbnRlciBTREsgZnVuY3Rpb24KLSAqIHRvIGF2b2lkIG1hY3JvIGRlZmluaXRpb24gY29uZmxpY3QgYXMgdGhlIFNESyBtaWdodCBhbHJlYWR5IGRlZmluZSBJbnRlcmxvY2tlZEV4Y2hhbmdlUG9pbnRlcgotICogYXMgYSBtYWNyby4KLSAqLwotIyAgICAgIGRlZmluZSBTVExQSW50ZXJsb2NrZWRFeGNoYW5nZVBvaW50ZXIgX0ludGVybG9ja2VkRXhjaGFuZ2VQb2ludGVyCi0jICAgICAgZGVmaW5lIF9TVExQX1NURENBTEwKLSMgICAgZWxzZQotIyAgICAgIGlmIGRlZmluZWQgKF9NQUMpCi0jICAgICAgICBkZWZpbmUgX1NUTFBfU1REQ0FMTCBfY2RlY2wKLSMgICAgICBlbHNlCi0jICAgICAgICBkZWZpbmUgX1NUTFBfU1REQ0FMTCBfX3N0ZGNhbGwKLSMgICAgICBlbmRpZgotIyAgICBlbmRpZgotCi0jICAgIGlmIGRlZmluZWQgKF9TVExQX05FV19QTEFURk9STV9TREspCi1fU1RMUF9JTVBPUlRfREVDTFNQRUMgbG9uZyBfU1RMUF9TVERDQUxMIEludGVybG9ja2VkSW5jcmVtZW50KGxvbmcgdm9sYXRpbGUgKik7Ci1fU1RMUF9JTVBPUlRfREVDTFNQRUMgbG9uZyBfU1RMUF9TVERDQUxMIEludGVybG9ja2VkRGVjcmVtZW50KGxvbmcgdm9sYXRpbGUgKik7Ci1fU1RMUF9JTVBPUlRfREVDTFNQRUMgbG9uZyBfU1RMUF9TVERDQUxMIEludGVybG9ja2VkRXhjaGFuZ2UobG9uZyB2b2xhdGlsZSAqLCBsb25nKTsKLSMgICAgICBpZiBkZWZpbmVkIChTVExQSW50ZXJsb2NrZWRFeGNoYW5nZVBvaW50ZXIpCi1fU1RMUF9JTVBPUlRfREVDTFNQRUMgdm9pZCogX1NUTFBfU1REQ0FMTCBTVExQSW50ZXJsb2NrZWRFeGNoYW5nZVBvaW50ZXIodm9pZCogdm9sYXRpbGUgKiwgdm9pZCopOwotIyAgICAgIGVuZGlmCi1fU1RMUF9JTVBPUlRfREVDTFNQRUMgbG9uZyBfU1RMUF9TVERDQUxMIEludGVybG9ja2VkRXhjaGFuZ2VBZGQobG9uZyB2b2xhdGlsZSAqLCBsb25nKTsKLSMgICAgZWxpZiBkZWZpbmVkIChfU1RMUF9XQ0UpCi0KLS8qIHN0YXJ0IG9mIGVNYmVkZGVkIFZpc3VhbCBDKysgc3BlY2lmaWMgc2VjdGlvbiAqLwotIyAgICAgIGluY2x1ZGUgPHdpbmRlZi5oPiAvKiBuZWVkZWQgZm9yIGJhc2ljIHdpbmRvd3MgdHlwZXMgKi8KLQotICAgICAgIC8qKiBpbiBTREtzIGdlbmVyYXRlZCB3aXRoIFBCNSwgd2luZGVmLmggc29tZWhvdyBpbmNsdWRlcyBoZWFkZXJzIHdoaWNoIHRoZW4KLSAgICAgICBkZWZpbmUgc2V0am1wLiAqLwotIyAgICAgIGlmIChfV0lOMzJfV0NFID49IDB4NTAwKQotIyAgICAgICAgZGVmaW5lIF9TVExQX05BVElWRV9TRVRKTVBfSF9JTkNMVURFRAotIyAgICAgIGVuZGlmCi0KLSMgICAgICBpZm5kZWYgX1dJTkJBU0VfIC8qIHdpbmJhc2UuaCBhbHJlYWR5IGluY2x1ZGVkPyAqLwotbG9uZyBXSU5BUEkgSW50ZXJsb2NrZWRJbmNyZW1lbnQobG9uZyopOwotbG9uZyBXSU5BUEkgSW50ZXJsb2NrZWREZWNyZW1lbnQobG9uZyopOwotbG9uZyBXSU5BUEkgSW50ZXJsb2NrZWRFeGNoYW5nZShsb25nKiwgbG9uZyk7Ci0jICAgICAgZW5kaWYKLQotIyAgICAgIGlmbmRlZiBfX1dJTkRPV1NfXyAvKiB3aW5kb3dzLmggYWxyZWFkeSBpbmNsdWRlZD8gKi8KLQotIyAgICAgICAgaWYgZGVmaW5lZCAoeDg2KQotIyAgICAgICAgICBpbmNsdWRlIDx3aW5iYXNlLmg+IC8qIG5lZWRlZCBmb3IgaW5saW5lIHZlcnNpb25zIG9mIEludGVybG9ja2VkKiBmdW5jdGlvbnMgKi8KLSMgICAgICAgIGVuZGlmCi0KLSMgICAgICAgIGlmbmRlZiBfTUZDX1ZFUgotCi0jICAgICAgICAgIGRlZmluZSBNZXNzYWdlQm94IE1lc3NhZ2VCb3hXCi1pbnQgV0lOQVBJIE1lc3NhZ2VCb3hXKEhXTkQgaFduZCwgTFBDV1NUUiBscFRleHQsIExQQ1dTVFIgbHBDYXB0aW9uLCBVSU5UIHVUeXBlKTsKLQotIyAgICAgICAgICBkZWZpbmUgd3ZzcHJpbnRmIHd2c3ByaW50ZlcKLWludCBXSU5BUEkgd3ZzcHJpbnRmVyhMUFdTVFIsIExQQ1dTVFIsIHZhX2xpc3QgQXJnTGlzdCk7Ci0KLXZvaWQgV0lOQVBJIEV4aXRUaHJlYWQoRFdPUkQgZHdFeGl0Q29kZSk7Ci0KLSMgICAgICAgICAgaWYgIWRlZmluZWQgKENPUkVETEwpCi0jICAgICAgICAgICAgZGVmaW5lIF9TVExQX1dDRV9XSU5CQVNFQVBJIERFQ0xTUEVDX0lNUE9SVAotIyAgICAgICAgICBlbHNlCi0jICAgICAgICAgICAgZGVmaW5lIF9TVExQX1dDRV9XSU5CQVNFQVBJCi0jICAgICAgICAgIGVuZGlmCi0KLV9TVExQX1dDRV9XSU5CQVNFQVBJIGludCBXSU5BUEkKLU11bHRpQnl0ZVRvV2lkZUNoYXIoVUlOVCBDb2RlUGFnZSwgRFdPUkQgZHdGbGFncywgTFBDU1RSIGxwTXVsdGlCeXRlU3RyLAotICAgICAgICAgICAgICAgICAgICBpbnQgY2JNdWx0aUJ5dGUsIExQV1NUUiBscFdpZGVDaGFyU3RyLCBpbnQgY2NoV2lkZUNoYXIpOwotCi1fU1RMUF9XQ0VfV0lOQkFTRUFQSSBVSU5UIFdJTkFQSSBHZXRBQ1AoKTsKLQotX1NUTFBfV0NFX1dJTkJBU0VBUEkgQk9PTCBXSU5BUEkgVGVybWluYXRlUHJvY2VzcyhIQU5ETEUgaFByb2Nlc3MsIERXT1JEIHVFeGl0Q29kZSk7Ci0KLSMgICAgICAgICAgZGVmaW5lIE91dHB1dERlYnVnU3RyaW5nIE91dHB1dERlYnVnU3RyaW5nVwotdm9pZCBXSU5BUEkgT3V0cHV0RGVidWdTdHJpbmdXKExQQ1dTVFIpOwotCi1fU1RMUF9XQ0VfV0lOQkFTRUFQSSB2b2lkIFdJTkFQSSBTbGVlcChEV09SRCk7Ci0KLSMgICAgICAgICAgdW5kZWYgX1NUTFBfV0NFX1dJTkJBU0VBUEkKLQotIyAgICAgICAgZW5kaWYgLyogIV9NRkNfVkVSICovCi0KLSMgICAgICBlbmRpZiAvKiAhX19XSU5ET1dTX18gKi8KLQotLyogZW5kIG9mIGVNYmVkZGVkIFZpc3VhbCBDKysgc3BlY2lmaWMgc2VjdGlvbiAqLwotCi0jICAgIGVsc2UKLS8qIGJvcmlzIDogZm9yIHRoZSBsYXRlc3QgU0RLLCB5b3UgbWF5IGFjdHVhbGx5IG5lZWQgdGhlIG90aGVyIHZlcnNpb24gb2YgdGhlIGRlY2xhcmF0aW9uIChhYm92ZSkKLSAqIGV2ZW4gZm9yIGVhcmxpZXIgVkMrKyB2ZXJzaW9ucy4gVGhlcmUgaXMgbm8gd2F5IHRvIHRlbGwgU0RLIHZlcnNpb25zIGFwYXJ0LCBzb3JyeSAuLi4KLSAqLwotX1NUTFBfSU1QT1JUX0RFQ0xTUEVDIGxvbmcgX1NUTFBfU1REQ0FMTCBJbnRlcmxvY2tlZEluY3JlbWVudChsb25nKik7Ci1fU1RMUF9JTVBPUlRfREVDTFNQRUMgbG9uZyBfU1RMUF9TVERDQUxMIEludGVybG9ja2VkRGVjcmVtZW50KGxvbmcqKTsKLV9TVExQX0lNUE9SVF9ERUNMU1BFQyBsb25nIF9TVExQX1NURENBTEwgSW50ZXJsb2NrZWRFeGNoYW5nZShsb25nKiwgbG9uZyk7Ci0jICAgIGVuZGlmCi0KLSMgICAgaWYgIWRlZmluZWQgKFNUTFBJbnRlcmxvY2tlZEV4Y2hhbmdlUG9pbnRlcikKLS8qIFRoaXMgQVBJIGZ1bmN0aW9uIGRvIG5vdCBleGlzdCBpbiB0aGUgb2xkIHBsYXRmb3JtIFNESyBhbmQgaXMgZXF1aXZhbGVudCB0bwotICogSW50ZXJsb2NrZWRFeGNoYW5nZSBvbiAzMiBiaXRzIHBsYXRmb3JtOgotICovCi0jICAgICAgaWYgZGVmaW5lZCAoX19jcGx1c3BsdXMpCi0vKiBXZSBkbyBub3QgZGVmaW5lIHRoaXMgZnVuY3Rpb24gaWYgd2UgYXJlIG5vdCBpbiBhIEMrKyB0cmFuc2xhdGlvbiB1bml0IGp1c3QKLSAqIGJlY2F1c2Ugb2YgdGhlIGlubGluZSBwb3J0YWJpbGl0eSBpc3N1ZSBpdCB3b3VsZCBpbnRyb2R1Y2UuIFdlIHdpbGwgaGF2ZSB0bwotICogZml4IGl0IHRoZSBkYXkgd2UgbmVlZCB0aGlzIGZ1bmN0aW9uIGZvciBhIEMgdHJhbnNsYXRpb24gdW5pdC4KLSAqLwotaW5saW5lCi12b2lkKiBfU1RMUF9DQUxMIFNUTFBJbnRlcmxvY2tlZEV4Y2hhbmdlUG9pbnRlcih2b2lkKiB2b2xhdGlsZSogX19hLCB2b2lkKiBfX2IpIHsKLSMgICAgICAgIGlmIGRlZmluZWQgKF9TVExQX01TVkMpCi0vKiBIZXJlIE1TVkMgcHJvZHVjZXMgd2FybmluZyBpZiA2NCBiaXRzIHBvcnRhYmlsaXR5IGlzc3VlIGlzIGFjdGl2YXRlZC4KLSAqIE1TVkMgZG8gbm90IHNlZSB0aGF0IF9TVExQX0FUT01JQ19FWENIQU5HRV9QVFIgaXMgYSBtYWNybyB3aGljaCBjb250ZW50Ci0gKiBpcyBiYXNlZCBvbiB0aGUgcGxhdGZvcm0sIFdpbjMyIG9yIFdpbjY0Ci0gKi8KLSMgICAgICAgICAgcHJhZ21hIHdhcm5pbmcgKHB1c2gpCi0jICAgICAgICAgIHByYWdtYSB3YXJuaW5nIChkaXNhYmxlIDogNDMxMSkgLy8gcG9pbnRlciB0cnVuY2F0aW9uIGZyb20gdm9pZCogdG8gbG9uZwotIyAgICAgICAgICBwcmFnbWEgd2FybmluZyAoZGlzYWJsZSA6IDQzMTIpIC8vIGNvbnZlcnNpb24gZnJvbSBsb25nIHRvIHZvaWQqIG9mIGdyZWF0ZXIgc2l6ZQotIyAgICAgICAgZW5kaWYKLSMgICAgICAgIGlmICFkZWZpbmVkIChfU1RMUF9OT19ORVdfU1RZTEVfQ0FTVFMpCi0gIHJldHVybiByZWludGVycHJldF9jYXN0PHZvaWQqPihJbnRlcmxvY2tlZEV4Y2hhbmdlKHJlaW50ZXJwcmV0X2Nhc3Q8bG9uZyo+KGNvbnN0X2Nhc3Q8dm9pZCoqPihfX2EpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxsb25nPihfX2IpKSk7Ci0jICAgICAgICBlbHNlCi0gIHJldHVybiAodm9pZCopSW50ZXJsb2NrZWRFeGNoYW5nZSgobG9uZyopX19hLCAobG9uZylfX2IpOwotIyAgICAgICAgZW5kaWYKLSMgICAgICAgIGlmIGRlZmluZWQgKF9TVExQX01TVkMpCi0jICAgICAgICAgIHByYWdtYSB3YXJuaW5nIChwb3ApCi0jICAgICAgICBlbmRpZgotfQotIyAgICAgIGVuZGlmCi0jICAgIGVuZGlmCi0KLSMgICAgaWYgIWRlZmluZWQgKF9TVExQX1dDRSkKLV9TVExQX0lNUE9SVF9ERUNMU1BFQyB2b2lkIF9TVExQX1NURENBTEwgU2xlZXAodW5zaWduZWQgbG9uZyk7Ci1fU1RMUF9JTVBPUlRfREVDTFNQRUMgdm9pZCBfU1RMUF9TVERDQUxMIE91dHB1dERlYnVnU3RyaW5nQShjb25zdCBjaGFyKiBscE91dHB1dFN0cmluZyk7Ci0jICAgIGVuZGlmCi0KLSMgICAgaWYgZGVmaW5lZCAoSW50ZXJsb2NrZWRJbmNyZW1lbnQpCi0jICAgICAgcHJhZ21hIGludHJpbnNpYyhfSW50ZXJsb2NrZWRJbmNyZW1lbnQpCi0jICAgICAgcHJhZ21hIGludHJpbnNpYyhfSW50ZXJsb2NrZWREZWNyZW1lbnQpCi0jICAgICAgcHJhZ21hIGludHJpbnNpYyhfSW50ZXJsb2NrZWRFeGNoYW5nZSkKLSMgICAgICBwcmFnbWEgaW50cmluc2ljKF9JbnRlcmxvY2tlZEV4Y2hhbmdlUG9pbnRlcikKLSMgICAgZW5kaWYKLSMgICAgaWYgZGVmaW5lZCAoX19jcGx1c3BsdXMpCi19IC8qIGV4dGVybiAiQyIgKi8KLSMgICAgZW5kaWYKLQotIyAgZW5kaWYgLyogU1RMX01TVkMgX19CT1JMQU5EQ19fIF9fSUNMIF9fV0FUQ09NQ19fIF9fTUlOR1czMl9fIF9fRE1DX18qLwotCi0jZW5kaWYgLyogX1NUTFBfV0lORE9XU19IX0lOQ0xVREVEICovCi0KLSNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9XSU5ET1dTX0ggKi8KZGlmZiAtLWdpdCBhL3N0bC9jb25maWcvY29tcGF0LmggYi9zdGwvY29uZmlnL2NvbXBhdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDNkODc0Li4wMDAwMDAwCi0tLSBhL3N0bC9jb25maWcvY29tcGF0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0KLS8qCi0gKiBDb21wYXRpYmlsaXR5IHNlY3Rpb24KLSAqIFRoaXMgc2VjdGlvbiBzZXRzIG5ldy1zdHlsZSBtYWNyb3MgYmFzZWQgb24gb2xkLXN0eWxlIG9uZXMsIGZvciBjb21wYXRpYmlsaXR5Ci0gKi8KLQotI2lmIGRlZmluZWQgKF9fU1RMX0RFQlVHKSAmJiAhZGVmaW5lZCAoX1NUTFBfREVCVUcpCi0jICBkZWZpbmUgX1NUTFBfREVCVUcgX19TVExfREVCVUcKLSNlbmRpZgotI2lmIGRlZmluZWQgKF9fU1RMX05PX0FOQUNIUk9OSVNNUykgJiYgIWRlZmluZWQgKF9TVExQX05PX0FOQUNIUk9OSVNNUykKLSMgIGRlZmluZSBfU1RMUF9OT19BTkFDSFJPTklTTVMgX19TVExfTk9fQU5BQ0hST05JU01TCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChfX1NUTF9OT19FWFRFTlNJT05TKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKLSMgIGRlZmluZSBfU1RMUF9OT19FWFRFTlNJT05TIF9fU1RMX05PX0VYVEVOU0lPTlMKLSNlbmRpZgotI2lmIGRlZmluZWQgKF9fU1RMX05PX0VYQ0VQVElPTlMpICYmICFkZWZpbmVkIChfU1RMUF9OT19FWENFUFRJT05TKQotIyAgZGVmaW5lIF9TVExQX05PX0VYQ0VQVElPTlMgX19TVExfTk9fRVhDRVBUSU9OUwotI2VuZGlmCi0jaWYgZGVmaW5lZCAoX19TVExfTk9fTkFNRVNQQUNFUykgJiYgIWRlZmluZWQgKF9TVExQX05PX05BTUVTUEFDRVMpCi0jICBkZWZpbmUgX1NUTFBfTk9fTkFNRVNQQUNFUyBfX1NUTF9OT19OQU1FU1BBQ0VTCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChfX1NUTF9NSU5JTVVNX0RFRkFVTFRfVEVNUExBVEVfUEFSQU1TKSAmJiAhZGVmaW5lZCAoX1NUTFBfTUlOSU1VTV9ERUZBVUxUX1RFTVBMQVRFX1BBUkFNUykKLSMgIGRlZmluZSBfU1RMUF9NSU5JTVVNX0RFRkFVTFRfVEVNUExBVEVfUEFSQU1TIF9fU1RMX01JTklNVU1fREVGQVVMVF9URU1QTEFURV9QQVJBTVMKLSNlbmRpZgotI2lmIGRlZmluZWQgKF9fU1RMX05PX09XTl9OQU1FU1BBQ0UpICYmICFkZWZpbmVkIChfU1RMUF9OT19PV05fTkFNRVNQQUNFKQotIyAgZGVmaW5lIF9TVExQX05PX09XTl9OQU1FU1BBQ0UgX19TVExfTk9fT1dOX05BTUVTUEFDRQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfX1NUTF9OT19SRUxPUFNfTkFNRVNQQUNFKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fUkVMT1BTX05BTUVTUEFDRSkKLSMgIGRlZmluZSBfU1RMUF9OT19SRUxPUFNfTkFNRVNQQUNFIF9fU1RMX05PX1JFTE9QU19OQU1FU1BBQ0UKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX19TVExfREVCVUdfVU5JTklUSUFMSVpFRCkgJiYgIWRlZmluZWQgKF9TVExQX0RFQlVHX1VOSU5JVElBTElaRUQpCi0jICBkZWZpbmUgX1NUTFBfREVCVUdfVU5JTklUSUFMSVpFRCBfX1NUTF9ERUJVR19VTklOSVRJQUxJWkVECi0jZW5kaWYKLSNpZiBkZWZpbmVkIChfX1NUTF9TSFJFRF9CWVRFKSAmJiAhZGVmaW5lZCAoX1NUTFBfU0hSRURfQllURSkKLSMgIGRlZmluZSBfU1RMUF9TSFJFRF9CWVRFIF9fU1RMX1NIUkVEX0JZVEUKLSNlbmRpZgotI2lmIGRlZmluZWQgKF9fU1RMX1VTRV9NRkMpICYmICFkZWZpbmVkIChfU1RMUF9VU0VfTUZDKQotIyAgZGVmaW5lIF9TVExQX1VTRV9NRkMgX19TVExfVVNFX01GQwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfX1NUTF9VU0VfTkVXQUxMT0MpICYmICFkZWZpbmVkIChfU1RMUF9VU0VfTkVXQUxMT0MpCi0jICBkZWZpbmUgX1NUTFBfVVNFX05FV0FMTE9DIF9fU1RMX1VTRV9ORVdBTExPQwotI2VuZGlmCi0jaWYgZGVmaW5lZCAoX19TVExfVVNFX01BTExPQykgJiYgIWRlZmluZWQgKF9TVExQX1VTRV9NQUxMT0MpCi0jICBkZWZpbmUgX1NUTFBfVVNFX01BTExPQyBfX1NUTF9VU0VfTUFMTE9DCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9fU1RMX0RFQlVHX0FMTE9DKSAmJiAhZGVmaW5lZCAoX1NUTFBfREVCVUdfQUxMT0MpCi0jICBkZWZpbmUgX1NUTFBfREVCVUdfQUxMT0MgX19TVExfREVCVUdfQUxMT0MKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX19TVExfREVCVUdfTUVTU0FHRSkgJiYgIWRlZmluZWQgKF9TVExQX0RFQlVHX01FU1NBR0UpCi0jICBkZWZpbmUgX1NUTFBfREVCVUdfTUVTU0FHRSBfX1NUTF9ERUJVR19NRVNTQUdFCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9fU1RMX0RFQlVHX1RFUk1JTkFURSkgJiYgIWRlZmluZWQgKF9TVExQX0RFQlVHX1RFUk1JTkFURSkKLSMgIGRlZmluZSBfU1RMUF9ERUJVR19URVJNSU5BVEUgX19TVExfREVCVUdfVEVSTUlOQVRFCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9fU1RMX1VTRV9BQkJSRVZTKSAmJiAhZGVmaW5lZCAoX1NUTFBfVVNFX0FCQlJFVlMpCi0jICBkZWZpbmUgX1NUTFBfVVNFX0FCQlJFVlMgX19TVExfVVNFX0FCQlJFVlMKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX19TVExfTk9fTVNWQzUwX0NPTVBBVElCSUxJVFkpICYmICFkZWZpbmVkIChfU1RMUF9OT19NU1ZDNTBfQ09NUEFUSUJJTElUWSkKLSMgIGRlZmluZSBfU1RMUF9OT19NU1ZDNTBfQ09NUEFUSUJJTElUWSBfX1NUTF9OT19NU1ZDNTBfQ09NUEFUSUJJTElUWQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfX1NUTF9VU0VfUkFXX1NHSV9BTExPQ0FUT1JTKSAmJiAhZGVmaW5lZCAoX1NUTFBfVVNFX1JBV19TR0lfQUxMT0NBVE9SUykKLSMgIGRlZmluZSBfU1RMUF9VU0VfUkFXX1NHSV9BTExPQ0FUT1JTIF9fU1RMX1VTRV9SQVdfU0dJX0FMTE9DQVRPUlMKLSNlbmRpZgotCi0vKiBTVExwb3J0IGRvIG5vdCBzdXBwb3J0IGFueW1vcmUgdGhlIGlvc3RyZWFtIHdyYXBwZXIgbW9kZSBzbyB0aGlzIG1hY3JvIHNob3VsZAotICogYWx3YXlzIGJlZW4gZGVmaW5lIGZvciBvdGhlciBsaWJyYXJpZXMgdGhhdCB3YXMgdXNpbmcgaXQ6Ci0gKi8KLSNpZiAhZGVmaW5lZCAoX1NUTFBfT1dOX0lPU1RSRUFNUykKLSMgIGRlZmluZSBfU1RMUF9PV05fSU9TVFJFQU1TCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9TVExQX05PX09XTl9JT1NUUkVBTVMpCi0jICBlcnJvciBTVExwb3J0IGRvIG5vdCBzdXBwb3J0IGFueW1vcmUgdGhlIHdyYXBwZXIgbW9kZS4gSWYgeW91IHdhbnQgdG8gdXNlIFNUTHBvcnQgXAotdXNlIGl0cyBpb3N0cmVhbXMgaW1wbGVtZW50YXRpb24gb3Igbm8gaW9zdHJlYW1zIGF0IGFsbC4KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3RsL2NvbmZpZy9mZWF0dXJlcy5oIGIvc3RsL2NvbmZpZy9mZWF0dXJlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjI4NWQ1Li4wMDAwMDAwCi0tLSBhL3N0bC9jb25maWcvZmVhdHVyZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDExOTYgKzAsMCBAQAotIC8qCi0gICoKLSAgKiBDb3B5cmlnaHQgKGMpIDE5OTQKLSAgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQotICAqCi0gICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKLSAgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KLSAgKgotICAqIENvcHlyaWdodCAoYykgMTk5NwotICAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKLSAgKgotICAqIENvcHlyaWdodCAoYykgMTk5OQotICAqIEJvcmlzIEZvbWl0Y2hldgotICAqCi0gICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICAqCi0gICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICAqCi0gICovCi0KLSNpZm5kZWYgX1NUTFBfRkVBVFVSRVNfSAotI2RlZmluZSBfU1RMUF9GRUFUVVJFU19ICi0KLS8qCi0gKiBQdXJwb3NlIG9mIHRoaXMgZmlsZToKLSAqCi0gKiBEZWZpbmVzIGFsbCBTVExwb3J0IHNldHRpbmdzLgotICogVGhpcyBmaWxlIGlzIGFjdHVhbGx5IGEgd3JhcHBlciA6IGl0IGluY2x1ZGVzIGNvbXBpbGVyLXNwZWNpZmljCi0gKiBzZXR0aW5ncyBmcm9tIDxjb25maWcvc3RsY29tcC5oPgotICogYW5kIHVzZXItZGVmaW5lZCBzZXR0aW5ncyBmcm9tIDxjb25maWcvdXNlcl9jb25maWcuaD4uCi0gKiBTZWUgPGNvbmZpZy9zdGxfbXljb21wLmg+IGFuZCA8Y29uZmlnL3VzZXJfY29uZmlnLmg+IGZvciB0aGUgZGVzY3JpcHRpb24KLSAqIG9mIHRob3NlIG1hY3JvcwotICoKLSAqLwotCi0vKiBEZWZpbml0aW9uIG9mIHRoZSBTVExwb3J0IHZlcnNpb24gaW5mb3JtYXRpb25zICovCi0jaW5jbHVkZSA8c3RsL19zdGxwb3J0X3ZlcnNpb24uaD4KLQotLyogT3RoZXIgbWFjcm9zIGRlZmluZWQgYnkgdGhpcyBmaWxlOgotCi0gKiBib29sLCB0cnVlLCBhbmQgZmFsc2UsIGlmIF9TVExQX05PX0JPT0wgaXMgZGVmaW5lZC4KLSAqIHR5cGVuYW1lLCBhcyBhIG51bGwgbWFjcm8gaWYgaXQncyBub3QgYWxyZWFkeSBhIGtleXdvcmQuCi0gKiBleHBsaWNpdCwgYXMgYSBudWxsIG1hY3JvIGlmIGl0J3Mgbm90IGFscmVhZHkgYSBrZXl3b3JkLgotICogbmFtZXNwYWNlLXJlbGF0ZWQgbWFjcm9zIChfU1RMUF9TVEQsIF9TVExQX0JFR0lOX05BTUVTUEFDRSwgZXRjLikKLSAqIGV4Y2VwdGlvbi1yZWxhdGVkIG1hY3JvcyAoX1NUTFBfVFJZLCBfU1RMUF9VTldJTkQsIGV0Yy4pCi0gKiBfU1RMUF9BU1NFUlQsIGVpdGhlciBhcyBhIHRlc3Qgb3IgYXMgYSBudWxsIG1hY3JvLCBkZXBlbmRpbmcgb24KLSAgIHdoZXRoZXIgb3Igbm90IF9TVExQX0FTU0VSVElPTlMgaXMgZGVmaW5lZC4KLSovCi0KLS8qIERlZmluaXRpb24gb2YgdGhlIDIgU1RMcG9ydCBkZWJ1ZyBsZXZlbHMgKi8KLSNkZWZpbmUgX1NUTFBfU1RMUE9SVF9EQkdfTEVWRUwgMQotI2RlZmluZSBfU1RMUF9TVEFOREFSRF9EQkdfTEVWRUwgMgotCi0vKiBQbGFjZWhvbGRlciBmb3IgdXNlciB0byBvdmVycmlkZSBzZXR0aW5ncy4KLSAqIEl0IGNvdWxkIGJlIGFsc28gdXNlZCB0byBtYXNrIHNldHRpbmdzIGZyb20KLSAqIGRpZmZlcmVudCBkaXJlY3Rvcmllcy4KLSAqLwotI2luY2x1ZGUgPHN0bC9jb25maWcvdXNlcl9jb25maWcuaD4KLQotI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHKSAmJiAhZGVmaW5lZCAoX1NUTFBfREVCVUdfTEVWRUwpCi0jICBkZWZpbmUgX1NUTFBfREVCVUdfTEVWRUwgX1NUTFBfU1RMUE9SVF9EQkdfTEVWRUwKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX19CVUlMRElOR19TVExQT1JUKQotLyogRm9yIHRoZSBTVExwb3J0IGltcGxlbWVudGF0aW9uIHdlIGNhbiB1c2UgZXZlcnl0aGluZzoKLSAqLwotIyAgaWYgZGVmaW5lZCAoX1NUTFBfTk9fQU5BQ0hST05JU01TKQotIyAgICB1bmRlZiBfU1RMUF9OT19BTkFDSFJPTklTTVMKLSMgIGVuZGlmCi0jICBpZiBkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQotIyAgICB1bmRlZiBfU1RMUF9OT19FWFRFTlNJT05TCi0jICBlbmRpZgotLyogTW9yZW92ZXIgdGhlcmUgYXJlIHRoaW5ncyB0aGF0IGhhcyBubyBzZW5zOgotICovCi0jICBpZiBkZWZpbmVkIChfU1RMUF9OT19JT1NUUkVBTVMpCi0jICAgIGVycm9yIElmIHlvdSBkbyBub3QgdXNlIGlvc3RyZWFtcyB5b3UgZG8gbm90IG5lZWQgdG8gYnVpbGQgdGhlIFNUTHBvcnQgbGlicmFyeS4KLSMgIGVuZGlmCi0jZW5kaWYKLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiBUaGlzIGZpbGUgaXMgdXNlZCBmb3IgY29tcGF0aWJpbGl0eTsgaXQgYWNjZXB0cyBvbGQtc3R5bGUgY29uZmlnCi0gICBzd2l0Y2hlcyAqLwotI2luY2x1ZGUgPHN0bC9jb25maWcvY29tcGF0Lmg+Ci0KLS8qIENvbW1vbiBjb25maWd1cmF0aW9uIGZpbGUgZm9yIHRoaXMgcGFydGljdWxhciBpbnN0YWxsYXRpb24uICovCi0jaW5jbHVkZSA8c3RsL2NvbmZpZy9ob3N0Lmg+Ci0KLS8qIE9wZXJhdGlvbmFsIEVudmlyb25tZW50IHNwZWNpZmljICovCi0jaW5jbHVkZSA8c3RsL2NvbmZpZy9fc3lzdGVtLmg+Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi0vKiBzb21lIGZpeGVzIHRvIGNvbmZpZ3VyYXRpb24uIFRoaXMgYWxzbyBpbmNsdWRlcyBtb2RpZmljYXRpb25zCi0gKiBvZiBTVExwb3J0IHN3aXRjaGVzIGRlcGVuZGluZyBvbiBjb21waWxlciBmbGFncywKLSAqIG9yIHNldHRpbmdzIGFwcGxpY2FibGUgdG8gYSBncm91cCBvZiBjb21waWxlcnMsIHN1Y2ggYXMKLSAqIHRvIGFsbCB3aG8gdXNlIEVERyBmcm9udC1lbmQuCi0gKi8KLSNpbmNsdWRlIDxzdGwvY29uZmlnL3N0bF9jb25maXguaD4KLQotI2lmZGVmIF9TVExQX1VTRV9CT09TVF9TVVBQT1JUCi0vKiBXZSBhcmUgZ29pbmcgdG8gdXNlIHRoZSBib29zdCBsaWJyYXJ5IHN1cHBvcnQuIFRvIGxpbWl0IHRoZSBwcm9ibGVtCi0gKiBvZiBzZWxmIHJlZmVyZW5jaW5nIGhlYWRlcnMgd2UgaGF2ZSB0byBzcGVjaWZ5IGNsZWFybHkgdG8gdGhlIGJvb3N0Ci0gKiBsaWJyYXJ5IHRoYXQgdGhlIFN0YW5kYXJkIGxpYiBpcyBTVExwb3J0OgotICovCi0jICBpZm5kZWYgQk9PU1RfU1RETElCX0NPTkZJRwotIyAgICBkZWZpbmUgQk9PU1RfU1RETElCX0NPTkZJRyA8Ym9vc3QvY29uZmlnL3N0ZGxpYi9zdGxwb3J0LmhwcD4KLSMgIGVuZGlmCi0jZW5kaWYKLQotCi0vKgotICogUGVyZm9ybXMgaW50ZWdyaXR5IGNoZWNrIG9uIHVzZXItc3BlY2lmaWVkIHBhcmFtZXRlcnMKLSAqIGFuZCBzaXRlLXNwZWNpZmljIHNldHRpbmdzLgotICovCi0vKgotIyBpbmNsdWRlIDxzdGwvX2NoZWNrX2NvbmZpZy5oPgotKi8KLQotLyogU0dJIHRlcm1zICovCi0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFUykgJiYgIWRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCi0jICBkZWZpbmUgX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAxCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkIChfU1RMUF9OT19GUklFTkRfVEVNUExBVEVTKSAmJiAhZGVmaW5lZCAoX1NUTFBfRlJJRU5EX1RFTVBMQVRFUykKLSMgIGRlZmluZSBfU1RMUF9GUklFTkRfVEVNUExBVEVTIDEKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQgKF9TVExQX05PX01FTUJFUl9URU1QTEFURV9DTEFTU0VTKSAmJiAhZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFX0NMQVNTRVMpCi0jICBkZWZpbmUgX1NUTFBfTUVNQkVSX1RFTVBMQVRFX0NMQVNTRVMgMQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVfQ0xBU1NFUykgJiYgIWRlZmluZWQgKF9TVExQX0RPTlRfU1VQUE9SVF9SRUJJTkRfTUVNQkVSX1RFTVBMQVRFKQotIyAgZGVmaW5lIF9TVExQX0RPTlRfU1VQUE9SVF9SRUJJTkRfTUVNQkVSX1RFTVBMQVRFIDEKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQgKF9TVExQX05PX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pICYmICFkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQotIyAgZGVmaW5lIF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04gMQotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSKQotIyAgZGVmaW5lIF9TVExQX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUiAxCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkIChfU1RMUF9ET05UX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0pICYmICFkZWZpbmVkIChfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNKQotIyAgZGVmaW5lIF9TVExQX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0gMQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykgJiYgXAotICAgIWRlZmluZWQgKF9TVExQX05PX0NPTlRBSU5FUlNfRVhURU5TSU9OKSAmJiAhZGVmaW5lZCAoX1NUTFBfVVNFX0NPTlRBSU5FUlNfRVhURU5TSU9OKQotIyAgZGVmaW5lIF9TVExQX1VTRV9DT05UQUlORVJTX0VYVEVOU0lPTgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfQ09OVEFJTkVSU19FWFRFTlNJT04pCi0jICBkZWZpbmUgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUIHRlbXBsYXRlIDxjbGFzcyBfS1Q+Ci0jZWxzZQotIyAgZGVmaW5lIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUFRSX1NQRUNJQUxJWkFUSU9OUykgJiYgXAotICAgIChkZWZpbmVkIChfU1RMUF9OT19DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKSAmJiBkZWZpbmVkIChfU1RMUF9ET05UX1NJTVVMQVRFX1BBUlRJQUxfU1BFQ19GT1JfVFlQRV9UUkFJVFMpKQotIyAgZXJyb3IgIlNvcnJ5IGJ1dCBhY2NvcmRpbmcgdGhlIFNUTHBvcnQgc2V0dGluZ3MgeW91ciBjb21waWxlciBjYW4gbm90IHN1cHBvcnQgdGhlIHBvaW50ZXIgc3BlY2lhbGl6YXRpb24gZmVhdHVyZS4iCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9TVExQX05PX0lPU1RSRUFNUykgJiYgXAotICAgIWRlZmluZWQgKF9TVExQX1VTRV9ORVdBTExPQykgJiYgIWRlZmluZWQgKF9TVExQX1VTRV9NQUxMT0MpCi0jICBkZWZpbmUgX1NUTFBfVVNFX05FV0FMTE9DCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkIChfU1RMUF9CSUdfRU5ESUFOKSAmJiAhZGVmaW5lZCAoX1NUTFBfTElUVExFX0VORElBTikKLSMgIGlmIGRlZmluZWQgKF9NSVBTRUIpIHx8IGRlZmluZWQgKF9fc3BhcmMpIHx8IGRlZmluZWQgKF9BSVgpIHx8IFwKLSAgICAgIGRlZmluZWQgKF9faHB1eCkgfHwgZGVmaW5lZCAobWFjaW50b3NoKSB8fCBkZWZpbmVkIChfTUFDKQotIyAgICBkZWZpbmUgX1NUTFBfQklHX0VORElBTiAxCi0jICBlbGlmIGRlZmluZWQgKF9faTM4NikgfHwgZGVmaW5lZCAoX01fSVg4NikgfHwgZGVmaW5lZCAoX01fQVJNKSB8fCBcCi0gICAgICAgIGRlZmluZWQgKF9fYW1kNjRfXykgfHwgZGVmaW5lZCAoX01fQU1ENjQpIHx8IGRlZmluZWQgKF9feDg2XzY0X18pIHx8IFwKLSAgICAgICAgZGVmaW5lZCAoX19hbHBoYV9fKQotIyAgICBkZWZpbmUgX1NUTFBfTElUVExFX0VORElBTiAxCi0jICBlbGlmIGRlZmluZWQgKF9faWE2NF9fKQotICAgIC8qIGl0YW5pdW0gYWxsb3dzIGJvdGggc2V0dGluZ3MgKGZvciBpbnN0YW5jZSB2aWEgZ2NjIC1tYmlnLWVuZGlhbikgLSBoZW5jZSBhIHNlcGVyYXRlIGNoZWNrIGlzIHJlcXVpcmVkICovCi0jICAgIGlmIGRlZmluZWQgKF9fQklHX0VORElBTl9fKQotIyAgICAgIGRlZmluZSBfU1RMUF9CSUdfRU5ESUFOIDEKLSMgICAgZWxzZQotIyAgICAgIGRlZmluZSBfU1RMUF9MSVRUTEVfRU5ESUFOIDEKLSMgICAgZW5kaWYKLSMgIGVsc2UKLSMgICAgZXJyb3IgImNhbid0IGRldGVybWluZSBlbmRpYW5lc3MiCi0jICBlbmRpZgotI2VuZGlmIC8qIF9TVExQX0JJR19FTkRJQU4gKi8KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogZmluYWwgd29ya2Fyb3VuZCB0dW5pbmcgYmFzZWQgb24gZ2l2ZW4gZmxhZ3MKLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotI2lmbmRlZiBfU1RMUF9VSU5UMzJfVAotIyAgZGVmaW5lIF9TVExQX1VJTlQzMl9UIHVuc2lnbmVkIGxvbmcKLSNlbmRpZgotI2lmbmRlZiBfU1RMUF9BQk9SVAotIyAgZGVmaW5lIF9TVExQX0FCT1JUKCkgYWJvcnQoKQotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfSEFTX05PX05BTUVTUEFDRVMpCi0jICBpZiBkZWZpbmVkIF9TVExQX05PX05BTUVTUEFDRVMKLSMgICAgdW5kZWYgX1NUTFBfVVNFX05BTUVTUEFDRVMKLSMgIGVsc2UKLS8qIGFzc3VtZSBpdCBhcyB0aGUgZGVmYXVsdCwgdHVybiBpdCBvZmYgbGF0ZXIgaWYgTk9fTkFNRVNQQUNFUyBzZWxlY3RlZCAqLwotIyAgICB1bmRlZiBfU1RMUF9VU0VfTkFNRVNQQUNFUwotIyAgICBkZWZpbmUgX1NUTFBfVVNFX05BTUVTUEFDRVMgMQotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX1NUTFBfTk9fSU9TVFJFQU1TKQotIyAgZGVmaW5lIF9TVExQX1VTRV9OT19JT1NUUkVBTVMKLSNlbmRpZgotCi0vKiBPcGVyYXRpbmcgc3lzdGVtIHJlY29nbml0aW9uIChiYXNpYykgKi8KLSNpZiBkZWZpbmVkIChfX3VuaXgpIHx8IGRlZmluZWQgKF9fbGludXhfXykgfHwgZGVmaW5lZCAoX19RTlhfXykgfHwgZGVmaW5lZCAoX0FJWCkgIHx8IGRlZmluZWQgKF9fTmV0QlNEX18pIHx8IGRlZmluZWQoX19PcGVuQlNEX18pIHx8IGRlZmluZWQgKF9fTHlueF9fKQotIyAgZGVmaW5lIF9TVExQX1VOSVggMQotI2VsaWYgZGVmaW5lZChtYWNpbnRvc2gpIHx8IGRlZmluZWQgKF9NQUMpCi0jICBkZWZpbmUgX1NUTFBfTUFDICAxCi0jZWxpZiBkZWZpbmVkIChfV0lOMzIpIHx8IGRlZmluZWQgKF9fV0lOMzIpIHx8IGRlZmluZWQgKFdJTjMyKSB8fCBkZWZpbmVkIChfX1dJTjMyX18pCi0jICBpZm5kZWYgX19TWU1CSUFOMzJfXwotIyAgICBkZWZpbmUgX1NUTFBfV0lOMzIgMQotIyAgZW5kaWYKLSNlbGlmIGRlZmluZWQgKF9fV0lOMTYpIHx8IGRlZmluZWQgKFdJTjE2KSB8fCBkZWZpbmVkIChfV0lOMTYpCi0jICBkZWZpbmUgX1NUTFBfV0lOMTYKLSNlbmRpZiAvKiBfX3VuaXggKi8KLQotI2lmIGRlZmluZWQgKF9TVExQX1dJTjE2KQotIyAgZGVmaW5lIF9TVExQX0xET1VCTEVfODAKLSNlbGlmIGRlZmluZWQoX1NUTFBfV0lOMzIpCi0jICBpZiBkZWZpbmVkIChfU1RMUF9NU1ZDKSB8fCBkZWZpbmVkIChfX0lDTCkgfHwgZGVmaW5lZCAoX19CT1JMQU5EQ19fKSB8fCBkZWZpbmVkIChfX0NZR1dJTl9fKQotIyAgICBkZWZpbmUgX1NUTFBfTERPVUJMRV82NAotIyAgZWxzZQotIyAgICBkZWZpbmUgX1NUTFBfTERPVUJMRV85NgotIyAgZW5kaWYKLSNlbGlmIGRlZmluZWQgKF9TVExQX1VOSVgpCi0jICBpZiBkZWZpbmVkIChfX0NZR1dJTl9fKQotIyAgICBkZWZpbmUgX1NUTFBfTERPVUJMRV85NgotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQgKF9TVExQX0xET1VCTEVfNjQpICYmICFkZWZpbmVkIChfU1RMUF9MRE9VQkxFXzgwKSAmJiAhZGVmaW5lZCAoX1NUTFBfTERPVUJMRV85NikgJiYgIWRlZmluZWQgKF9TVExQX0xET1VCTEVfMTI4KQotIyAgZGVmaW5lIF9TVExQX0xET1VCTEVfMTI4Ci0jZW5kaWYKLQotI2lmICFkZWZpbmVkIChfU1RMUF9OT19MT05HX0RPVUJMRSkKLSMgIGRlZmluZSBfU1RMUF9MT05HRVNUX0ZMT0FUX1RZUEUgbG9uZyBkb3VibGUKLSNlbHNlCi0jICBkZWZpbmUgX1NUTFBfTE9OR0VTVF9GTE9BVF9UWVBFIGRvdWJsZQotI2VuZGlmCi0KLS8qIE5hdGl2ZSBoZWFkZXJzIGFjY2VzcyBtYWNyb3MgKi8KLSNpbmNsdWRlIDxzdGwvY29uZmlnL19uYXRpdmVfaGVhZGVycy5oPgotCi0vKiAgc2hhcmVkIGxpYnJhcnkgdHVuZS11cCAqLwotCi0jaWYgZGVmaW5lZCAoX19CVUlMRElOR19TVExQT1JUKQotLyogIGlmIHdlIGFyZSByZWJ1aWxkaW5nIHJpZ2h0IG5vdywgcGxhY2UgZXZlcnl0aGluZyBoZXJlICovCi0jICB1bmRlZiAgX1NUTFBfREVTSUdOQVRFRF9ETEwKLSMgIGRlZmluZSBfU1RMUF9ERVNJR05BVEVEX0RMTCAxCi0jZW5kaWYKLQotLyogVXNlIG93biBuYW1lc3BhY2UgYWx3YXlzIGlmIHBvc3NpYmxlIGFuZCBub3QgZXhwbGljaXRseSBpbnN0cnVjdGVkIG90aGVyd2lzZSAqLwotI2lmIGRlZmluZWQgKF9TVExQX1VTRV9OQU1FU1BBQ0VTKSAmJiAhZGVmaW5lZCAoX1NUTFBfQlJPS0VOX1VTSU5HX0RJUkVDVElWRSkgJiYgXAotICAgIWRlZmluZWQgKF9TVExQX05PX09XTl9OQU1FU1BBQ0UpCi0jICB1bmRlZiAgX1NUTFBfVVNFX09XTl9OQU1FU1BBQ0UKLSMgIGRlZmluZSBfU1RMUF9VU0VfT1dOX05BTUVTUEFDRSAgMQotI2Vsc2UKLSMgIHVuZGVmIF9TVExQX1dIT0xFX05BVElWRV9TVEQKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQgKF9OT1RIUkVBRFMpICYmICFkZWZpbmVkIChfU1RMUF9USFJFQURTX0RFRklORUQpCi0KLSMgIGlmIGRlZmluZWQgKF9QVEhSRUFEUykKLSMgICAgZGVmaW5lIF9TVExQX1BUSFJFQURTCi0jICAgIGRlZmluZSBfU1RMUF9USFJFQURTCi0jICBlbmRpZgotIyAgaWYgZGVmaW5lZCAoX1VJVEhSRUFEUykKLSMgICAgZGVmaW5lIF9TVExQX1VJVEhSRUFEUwotIyAgICBkZWZpbmUgX1NUTFBfVEhSRUFEUwotIyAgZW5kaWYKLQotIyAgaWYgZGVmaW5lZCAoX19zZ2kpICYmICFkZWZpbmVkIChfX0tDQykgJiYgIWRlZmluZWQgKF9fR05VQ19fKQotIyAgICBkZWZpbmUgX1NUTFBfU0dJX1RIUkVBRFMKLSMgIGVsaWYgZGVmaW5lZCAoX19ERUNDKSB8fCBkZWZpbmVkIChfX0RFQ0NYWCkKLSMgICAgZGVmaW5lIF9TVExQX0RFQ19USFJFQURTCi0jICBlbGlmIGRlZmluZWQgKF9TVExQX1dJTjMyKSAmJiAhZGVmaW5lZCAoX1NUTFBfUFRIUkVBRFMpCi0jICAgIGRlZmluZSBfU1RMUF9XSU4zMlRIUkVBRFMgMQotIyAgZWxpZiAoKGRlZmluZWQgKF9fc3VuKSAmJiAhZGVmaW5lZCAoX19saW51eF9fKSkgfHwgZGVmaW5lZCAoX1VJVEhSRUFEUykgKSAmJiBcCi0gICAgICAgICFkZWZpbmVkKF9TVExQX1BUSFJFQURTKQotIyAgICBkZWZpbmUgX1NUTFBfVUlUSFJFQURTCi0jICBlbGlmIGRlZmluZWQgKF9fT1MyX18pCi0jICAgIGRlZmluZSBfU1RMUF9PUzJUSFJFQURTCi0jICBlbGlmIGRlZmluZWQgKF9fQkVPU19fKQotIyAgICBkZWZpbmUgX1NUTFBfQkVUSFJFQURTCi0jICBlbGlmIGRlZmluZWQgKF9fTVdFUktTX18pICYmIGRlZmluZWQgKE5fUExBVF9OTE0pIC8qIChfX2Rlc3Rfb3MgPT0gX19uZXR3YXJlX29zKSAqLwotIyAgICBkZWZpbmUgX1NUTFBfTldUSFJFQURTCi0jICBlbHNlCi0jICAgIGRlZmluZSBfU1RMUF9QVEhSRUFEUwotIyAgZW5kaWYgLyogX19zZ2kgKi8KLSMgIGRlZmluZSBfU1RMUF9USFJFQURTX0RFRklORUQKLSNlbmRpZgotCi0jaWYgKGRlZmluZWQgKF9SRUVOVFJBTlQpIHx8IGRlZmluZWQgKF9USFJFQURfU0FGRSkgfHwgXAotICAgIChkZWZpbmVkIChfUE9TSVhfVEhSRUFEUykgJiYgZGVmaW5lZCAoX19PcGVuQlNEX18pKSkgJiYgXAotICAgICFkZWZpbmVkIChfU1RMUF9USFJFQURTKQotIyAgZGVmaW5lIF9TVExQX1RIUkVBRFMKLSNlbmRpZiAvKiBfUkVFTlRSQU5UICovCi0KLSNpZiBkZWZpbmVkIChfX2xpbnV4X18pICYmIGRlZmluZWQgKF9TVExQX1BUSFJFQURTKQotLyogIyAgaW5jbHVkZSA8ZmVhdHVyZXMuaD4gKi8KLQotIyAgaWYgZGVmaW5lZCAoX19VU0VfWE9QRU4ySykgJiYgIWRlZmluZWQgKF9TVExQX0RPTlRfVVNFX1BUSFJFQURfU1BJTkxPQ0spCi0jICAgIGRlZmluZSBfU1RMUF9VU0VfUFRIUkVBRF9TUElOTE9DSwotIyAgICBkZWZpbmUgX1NUTFBfU1RBVElDX01VVEVYIF9TVExQX211dGV4Ci0jICBlbmRpZiAvKiBfX1VTRV9YT1BFTjJLICovCi0jZW5kaWYgLyogX19saW51eF9fICYmIF9TVExQX1BUSFJFQURTICovCi0KLSNpZiBkZWZpbmVkIChfX09wZW5CU0RfXykgJiYgZGVmaW5lZCAoX1BPU0lYX1RIUkVBRFMpICYmICFkZWZpbmVkIChfU1RMUF9ET05UX1VTRV9QVEhSRUFEX1NQSU5MT0NLKQotIyAgZGVmaW5lIF9TVExQX1VTRV9QVEhSRUFEX1NQSU5MT0NLCi0jICBkZWZpbmUgX1NUTFBfU1RBVElDX01VVEVYIF9TVExQX211dGV4Ci0jZW5kaWYKLQotI2lmbmRlZiBfU1RMUF9TVEFUSUNfTVVURVgKLSMgIGRlZmluZSBfU1RMUF9TVEFUSUNfTVVURVggX1NUTFBfbXV0ZXhfYmFzZQotI2VuZGlmCi0KLSNpZiAoZGVmaW5lZCAoX01GQ19WRVIpIHx8IGRlZmluZWQgKF9BRlhETEwpKSAmJiAhZGVmaW5lZCAoX1NUTFBfVVNFX01GQykKLSMgIGRlZmluZSBfU1RMUF9VU0VfTUZDIDEKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX1NUTFBfVEhSRUFEUykKLSMgIGRlZmluZSBfU1RMUF9WT0xBVElMRSB2b2xhdGlsZQotLyogd2luZG93cy5oIF9NVVNUIGJlIGluY2x1ZGVkIGJlZm9yZSBib29sIGRlZmluaXRpb24gOyggKi8KLSMgIGlmIGRlZmluZWQgKF9TVExQX1dJTjMyVEhSRUFEUykgJiYgZGVmaW5lZCAoX1NUTFBfTk9fQk9PTCkKLSMgICAgdW5kZWYgIE5PTUlOTUFYCi0jICAgIGRlZmluZSBOT01JTk1BWAotIyAgICBpZmRlZiBfU1RMUF9VU0VfTUZDCi0jICAgICAgaW5jbHVkZSA8YWZ4Lmg+Ci0jICAgIGVsc2UKLSMgICAgICBpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jICAgIGVuZGlmCi0jICAgIGRlZmluZSBfU1RMUF9XSU5ET1dTX0hfSU5DTFVERUQKLSMgIGVuZGlmCi0jZWxzZQotIyAgZGVmaW5lIF9TVExQX1ZPTEFUSUxFCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkIChfU1RMUF9VU0VfTkVXX0NfSEVBREVSUykgJiYgIWRlZmluZWQgKF9TVExQX0hBU19OT19ORVdfQ19IRUFERVJTKQotIyAgZGVmaW5lIF9TVExQX1VTRV9ORVdfQ19IRUFERVJTCi0jZW5kaWYKLS8qIGRpc2FibGUgbmV3LXN0eWxlIGhlYWRlcnMgaWYgcmVxdWVzdGVkICovCi0jaWYgZGVmaW5lZCAoX1NUTFBfTk9fTkVXX0NfSEVBREVSUykKLSMgIHVuZGVmIF9TVExQX1VTRV9ORVdfQ19IRUFERVJTCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkIChfU1RMUF9TVEFUSUNfVEVNUExBVEVfREFUQSkKLSMgIGRlZmluZSBfU1RMUF9TVEFUSUNfVEVNUExBVEVfREFUQSAxCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9TVExQX0JBU0VfVFlQRURFRl9CVUcpCi0jICB1bmRlZiAgX1NUTFBfQkFTRV9UWVBFREVGX09VVFNJREVfQlVHCi0jICBkZWZpbmUgX1NUTFBfQkFTRV9UWVBFREVGX09VVFNJREVfQlVHIDEKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX1NUTFBfTkVTVEVEX1RZUEVfUEFSQU1fQlVHKSB8fCAoZGVmaW5lZCAoX1NUTFBfTVNWQykgJiYgKF9TVExQX01TVkMgPCAxMTAwKSkKLSMgIGRlZmluZSBfU1RMUF9HTE9CQUxfTkVTVEVEX1JFVFVSTl9UWVBFX1BBUkFNX0JVRwotI2VuZGlmCi0KLS8qIFNVTnBybyA0LjIgaW5saW5lIHN0cmluZyBsaXRlcmFsIGJ1ZyAqLwotI2lmZGVmIF9TVExQX0lOTElORV9TVFJJTkdfTElURVJBTF9CVUcKLSMgIGRlZmluZSBfU1RMUF9GSVhfTElURVJBTF9CVUcoX194KSBfX3ggPSBfX3g7Ci0jZWxzZQotIyAgZGVmaW5lIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3gpCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9TVExQX05PTl9UWVBFX1RNUExfUEFSQU1fQlVHKQotIyAgdW5kZWYgIF9TVExQX05PX0RFRkFVTFRfTk9OX1RZUEVfUEFSQU0KLSMgIGRlZmluZSBfU1RMUF9OT19ERUZBVUxUX05PTl9UWVBFX1BBUkFNIDEKLSNlbmRpZgotCi0jZGVmaW5lIF9TVExQX05FVyBuZXcKLSNkZWZpbmUgX1NUTFBfUExBQ0VNRU5UX05FVyBuZXcKLQotI2lmZGVmIF9TVExQX0RFQlVHCi0jICBkZWZpbmUgX1NUTFBfQVNTRVJUSU9OUyAxCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkIChfU1RMUF9TVEFUSUNfQVNTRVJUKQotLyogU29tZSBjb21waWxlciBzdXBwb3J0IDAgc2l6ZSBhcnJheSBzbyB3ZSB1c2UgbmVnYXRpdmUgc2l6ZSBhcnJheSB0byBnZW5lcmF0ZQotICogYSBjb21waWxhdGlvbiB0aW1lIGVycm9yLgotICovCi0jICBkZWZpbmUgX1NUTFBfU1RBVElDX0FTU0VSVChleHByKSB0eXBlZGVmIGNoYXIgX19zdGF0aWNfYXNzZXJ0W2V4cHIgPyAxIDogLTFdOwotI2VuZGlmCi0KLS8qIGFwcGxlIG1wdyBleGNlcHRpb24gaGFuZGxpbmcgYnVnICovCi0jaWZuZGVmIF9TVExQX01QV0ZJWF9UUlkKLSMgIGRlZmluZSBfU1RMUF9NUFdGSVhfVFJZCi0jZW5kaWYKLSNpZm5kZWYgX1NUTFBfTVBXRklYX0NBVENICi0jICBkZWZpbmUgX1NUTFBfTVBXRklYX0NBVENICi0jZW5kaWYKLSNpZm5kZWYgX1NUTFBfTVBXRklYX0NBVENIX0FDVElPTgotIyAgZGVmaW5lIF9TVExQX01QV0ZJWF9DQVRDSF9BQ1RJT04oYWN0aW9uKQotI2VuZGlmCi0KLS8qIGlmIF9TVExQX0RFQlVHIG9yIF9TVExQX0FTU0VSVElPTlMgYXJlIHNldCwgc3RsL2RlYnVnL19kZWJ1Zy5oIGRlZmluZXMgdGhvc2UgKi8KLQotI2lmICFkZWZpbmVkIChfU1RMUF9BU1NFUlRJT05TKSAmJiAhZGVmaW5lZCAoX1NUTFBfREVCVUcpICYmICFkZWZpbmVkIChfU1RMUF9ERUJVR19BTExPQykKLSMgIGRlZmluZSBfU1RMUF9BU1NFUlQoZXhwcikKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQgKF9TVExQX0RFQlVHKQotIyAgZGVmaW5lIF9TVExQX1ZFUkJPU0VfQVNTRVJUKGV4cHIsZGlhZ25vc3RpYykKLSMgIGRlZmluZSBfU1RMUF9ERUJVR19DSEVDSyhleHByKQotIyAgZGVmaW5lIF9TVExQX0RFQlVHX0RPKGV4cHIpCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkIChfU1RMUF9XRUFLKQotIyAgZGVmaW5lIF9TVExQX1dFQUsKLSNlbmRpZgotCi0vKiBkZWZhdWx0IHBhcmFtZXRlcnMgYXMgdGVtcGxhdGUgdHlwZXMgZGVyaXZlZCBmcm9tIGFyZ3VtZW50cyAoIG5vdCBhbHdheXMgc3VwcG9ydGVkICkgKi8KLSNpZiBkZWZpbmVkIChfU1RMUF9MSU1JVEVEX0RFRkFVTFRfVEVNUExBVEVTKQotIyAgZGVmaW5lIF9TVExQX0RGTF9UTVBMX1BBUkFNKCBjbGFzc25hbWUsIGRlZnZhbCApIGNsYXNzIGNsYXNzbmFtZQotI2Vsc2UKLSMgIGlmICFkZWZpbmVkIChfU1RMUF9ERUZBVUxUX1RZUEVfUEFSQU0pCi0jICAgIGRlZmluZSBfU1RMUF9ERUZBVUxUX1RZUEVfUEFSQU0gMQotIyAgZW5kaWYKLSMgIGRlZmluZSBfU1RMUF9ERkxfVE1QTF9QQVJBTSggY2xhc3NuYW1lLCBkZWZ2YWwgKSBjbGFzcyBjbGFzc25hbWUgPSBkZWZ2YWwKLSNlbmRpZgotCi0vKiBkZWZhdWx0IHBhcmFtZXRlcnMgYXMgY29tcGxldGUgdHlwZXMgKi8KLSNpZiBkZWZpbmVkIChfU1RMUF9ERUZBVUxUX1RZUEVfUEFSQU0pCi0jICBkZWZpbmUgX1NUTFBfREZMX1RZUEVfUEFSQU0oIGNsYXNzbmFtZSwgZGVmdmFsICkgY2xhc3MgY2xhc3NuYW1lID0gZGVmdmFsCi0jICBkZWZpbmUgX1NUTFBfREZMX05PTl9UWVBFX1BBUkFNKHR5cGUsbmFtZSx2YWwpIHR5cGUgbmFtZSA9IHZhbAotI2Vsc2UKLSMgIGRlZmluZSBfU1RMUF9ERkxfVFlQRV9QQVJBTSggY2xhc3NuYW1lLCBkZWZ2YWwgKSBjbGFzcyBjbGFzc25hbWUKLSMgIGRlZmluZSBfU1RMUF9ERkxfTk9OX1RZUEVfUEFSQU0odHlwZSxuYW1lLHZhbCkgdHlwZSBuYW1lCi0jZW5kaWYKLQotLyogU0dJIGNvbXBhdGliaWxpdHkgKi8KLQotI2lmZGVmIF9TVExQX05PX1dDSEFSX1QKLSMgIGlmbmRlZiBfU1RMUF9OT19OQVRJVkVfV0lERV9TVFJFQU1TCi0jICAgIGRlZmluZSAgX1NUTFBfTk9fTkFUSVZFX1dJREVfU1RSRUFNUyAxCi0jICBlbmRpZgotI2Vsc2UKLSMgIGRlZmluZSBfU1RMUF9IQVNfV0NIQVJfVCAxCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkIChfU1RMUF9OT19BVF9NRU1CRVJfRlVOQ1RJT04pCi0jICBkZWZpbmUgX1NUTFBfQ0FOX1RIUk9XX1JBTkdFX0VSUk9SUyAxCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkIChfU1RMUF9VU0VfUkFXX1NHSV9BTExPQ0FUT1JTKQotIyAgZGVmaW5lIF9TVExQX0RFRkFVTFRfQUxMT0NBVE9SKF9UcCkgYWxsb2NhdG9yPCBfVHAgPgotIyAgZGVmaW5lIF9TVExQX0RFRkFVTFRfQUxMT0NBVE9SX1NFTEVDVCggX1RwICkgX1NUTFBfREZMX1RNUExfUEFSQU0oX0FsbG9jLCBhbGxvY2F0b3I8IF9UcCA+KQotIyAgZGVmaW5lIF9TVExQX0RFRkFVTFRfUEFJUl9BTExPQ0FUT1IoX0tleSwgX1RwKSBhbGxvY2F0b3I8IHBhaXIgPCBfS2V5LCBfVHAgPiA+Ci0jICBpZiBkZWZpbmVkIChfU1RMUF9MSU1JVEVEX0RFRkFVTFRfVEVNUExBVEVTKQotIyAgICBkZWZpbmUgX1NUTFBfREVGQVVMVF9QQUlSX0FMTE9DQVRPUl9TRUxFQ1QoX0tleSwgX1RwICkgY2xhc3MgX0FsbG9jCi0jICAgIGRlZmluZSBfU1RMUF9VU0VfV1JBUFBFUl9GT1JfQUxMT0NfUEFSQU0gMQotIyAgZWxzZQotIyAgICBkZWZpbmUgX1NUTFBfREVGQVVMVF9QQUlSX0FMTE9DQVRPUl9TRUxFQ1QoX0tleSwgX1RwICkgXAotICAgICAgICAgICAgY2xhc3MgX0FsbG9jID0gYWxsb2NhdG9yPCBwYWlyIDwgX0tleSwgX1RwID4gPgotIyAgZW5kaWYKLSNlbHNlCi0jICBkZWZpbmUgX1NUTFBfREVGQVVMVF9BTExPQ0FUT1IoIF9UcCApIF9fc2dpX2FsbG9jCi0jICBkZWZpbmUgX1NUTFBfREVGQVVMVF9BTExPQ0FUT1JfU0VMRUNUKCBfVHAgKSBfU1RMUF9ERkxfVFlQRV9QQVJBTShfQWxsb2MsX19zZ2lfYWxsb2MpCi0jICBkZWZpbmUgX1NUTFBfREVGQVVMVF9QQUlSX0FMTE9DQVRPUiggX0tleSwgX1RwICkgX19zZ2lfYWxsb2MKLSMgIGRlZmluZSBfU1RMUF9ERUZBVUxUX1BBSVJfQUxMT0NBVE9SX1NFTEVDVChfS2V5LCBfVHAgKSBfU1RMUF9ERkxfVFlQRV9QQVJBTShfQWxsb2MsX19zZ2lfYWxsb2MpCi0jICBpZiBkZWZpbmVkIChfU1RMUF9MSU1JVEVEX0RFRkFVTFRfVEVNUExBVEVTKSAmJiAhZGVmaW5lZCAoX1NUTFBfREVGQVVMVF9UWVBFX1BBUkFNKQotIyAgICBkZWZpbmUgX1NUTFBfVVNFX1dSQVBQRVJfRk9SX0FMTE9DX1BBUkFNIDEKLSMgIGVuZGlmCi0jZW5kaWYKLQotLyogZGVidWcgbW9kZSB0b29sICovCi0jaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpCi0jICBkZWZpbmUgX1NUTFBfTk9OX0RCR19OQU1FKFgpIF9Ob25EYmdfIyNYCi0jZW5kaWYKLQotLyogcG9pbnRlciBzcGVjaWFsaXphdGlvbiB0b29sICovCi0jaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BUUl9TUEVDSUFMSVpBVElPTlMpCi0jICBkZWZpbmUgX1NUTFBfUFRSX0lNUExfTkFNRShYKSBfSW1wbF8jI1gKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX1NUTFBfVVNFX01TVkM2X01FTV9UX0JVR19XT1JLQVJPVU5EKQotIyAgZGVmaW5lIF9TVExQX05PX01FTV9UX05BTUUoWCkgX05vTWVtVF8jI1gKLSMgIGlmIGRlZmluZWQgKF9TVExQX0RFQlVHKQotIyAgICBkZWZpbmUgX1NUTFBfTk9OX0RCR19OT19NRU1fVF9OQU1FKFgpIF9Ob25EYmdfTm9NZW1UXyMjWAotIyAgZW5kaWYKLSNlbmRpZgotCi0vKiB0aGlzIGFsd2F5cyBtZWFuIHRoZSBDIGxpYnJhcnkgaXMgaW4gZ2xvYmFsIG5hbWVzcGFjZSAqLwotI2lmIGRlZmluZWQgKF9TVExQX0hBU19OT19ORVdfQ19IRUFERVJTKSAmJiAhZGVmaW5lZCAoX1NUTFBfVkVORE9SX0dMT0JBTF9DU1REKQotIyAgZGVmaW5lIF9TVExQX1ZFTkRPUl9HTE9CQUxfQ1NURCAxCi0jZW5kaWYKLQotLyogRGVwZW5kaW5nIG9mIHdoZXRoZXIgY29tcGlsZXIgc3VwcG9ydHMgbmFtZXNwYWNlcywKLSAqIHR1bmUgdGhlIHBhcmFtZXRlcnMgZm9yIHZlbmRvci1zdXBwbGllZCBsaWJyYXJpZXMuCi0gKiBUaGlzIHNlY3Rpb24gaXMgZ3VhcmRlZCBieSBfU1RMUF9IQVNfTk9fTkFNRVNQQUNFUywgbm90IGJ5IF9TVExQX1VTRV9OQU1FU1BBQ0VTLAotICogc2luY2UgaXQgZGVwZW5kcyBvbmx5IG9uIHRoZSBuYXRpdmUgZmVhdHVyZXMsIG5vdCBvbiB1c2VyJ3MgcHJlZmVyZW5jZSB3aGV0aGVyCi0gKiB0byB1c2UgbmFtZXNwYWNlIGZvciBTVExwb3J0IG9yIG5vdC4KLSAqLwotI2lmICFkZWZpbmVkIChfU1RMUF9IQVNfTk9fTkFNRVNQQUNFUykKLS8qIEltcG9ydCBzb21lIHZlbmRvcidzIGhlYWRlcnMgaW50byBjb3JyZXNwb25kaW5nIFNUTHBvcnQgb25lcyBpZiB0aGV5IG1pZ2h0IGJlIG5lZWRlZAotICogKGlmIHdlIHdyYXAgbmF0aXZlIGlvc3RyZWFtcyBhbmQgdXNlIG5hbWVwYWNlIG90aGVyIHRoYW4gc3RkOjopICovCi0jICBpZiBkZWZpbmVkIChfU1RMUF9XSE9MRV9OQVRJVkVfU1REKQotIyAgICBkZWZpbmUgIF9TVExQX0lNUE9SVF9WRU5ET1JfU1REIDEKLSMgICAgdW5kZWYgICBfU1RMUF9NSU5JTVVNX0lNUE9SVF9TVEQKLSMgIGVuZGlmCi0KLS8qIGlmIHVzaW5nIHN0bHBvcnQ6OiBuYW1lc3BhY2Ugb3IgaWYgQyBsaWJyYXJ5IHN0dWZmIGlzIG5vdCBpbiB2ZW5kb3IncyBzdGQ6OiwKLSAqIHRyeSBpbXBvcnRpbmcgJ2VtLgotICogTVNWQyBoYXMgYW1iaWd1aXR5IHByb2JsZW0gd2hlbiB3ZSB0cnkgdG8gaW1wb3J0IEMtc3R5bGUgc3RkOjogc3R1ZmYgYmFjayBpbnRvIGdsb2JhbCBuYW1lc3BhY2UgKi8KLSMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9OQU1FU1BBQ0VTKSAmJiAoZGVmaW5lZChfU1RMUF9VU0VfT1dOX05BTUVTUEFDRSkgfHwgZGVmaW5lZCAoX1NUTFBfVkVORE9SX0dMT0JBTF9DU1REKSkKLSMgICAgZGVmaW5lICBfU1RMUF9JTVBPUlRfVkVORE9SX0NTVEQgMQotIyAgZW5kaWYKLQotIyAgaWYgZGVmaW5lZCAoX1NUTFBfTk9fVVNJTkdfRk9SX0dMT0JBTF9GVU5DVElPTlMpICYmICFkZWZpbmVkIChfU1RMUF9ET19JTVBPUlRfQ1NURF9GVU5DVElPTlMpCi0jICAgIGRlZmluZSBfU1RMUF9OT19DU1REX0ZVTkNUSU9OX0lNUE9SVFMKLSMgIGVuZGlmCi0KLSMgIGRlZmluZSBfU1RMUF9VU0lOR19OQU1FU1BBQ0UoeCkgdXNpbmcgbmFtZXNwYWNlIHggOwotCi1uYW1lc3BhY2Ugc3RkIHsgfQotbmFtZXNwYWNlIF9fc3RkX2FsaWFzID0gc3RkOwotCi0vKiBhc3N1bWUgc3RkOjogbmFtZXNwYWNlIGZvciBDKysgc3RkIGxpYnJhcnkgaWYgbm90IGJlaW5nIHRvbGQgb3RoZXJ3aXNlICovCi0jICBpZiBkZWZpbmVkIChfU1RMUF9WRU5ET1JfR0xPQkFMX1NURCkKLSMgICAgZGVmaW5lIF9TVExQX1ZFTkRPUl9TVEQKLSMgIGVsc2UKLSMgICAgZGVmaW5lIF9TVExQX1ZFTkRPUl9TVEQgX19zdGRfYWxpYXMKLSMgIGVuZGlmCi0KLS8qIHR1bmUgdGhpbmdzIHRoYXQgY29tZSBmcm9tIEMgbGlicmFyeSAqLwotIyAgaWYgIGRlZmluZWQgKF9TVExQX1ZFTkRPUl9HTE9CQUxfQ1NURCkgfHwgIWRlZmluZWQoX1NUTFBfVVNFX05FV19DX0hFQURFUlMpCi0vKiAgaW4gb2xkLXN0eWxlIGhlYWRlcnMsIEMgZnVuY3Rpb25zIGdvIHRvIGdsb2JhbCBzY29wZS4gKi8KLSMgICAgZGVmaW5lIF9TVExQX1ZFTkRPUl9DU1RECi0jICAgIGRlZmluZSBfU1RMUF9VU0lOR19WRU5ET1JfQ1NURAotIyAgZWxzZQotIyAgICBkZWZpbmUgX1NUTFBfVkVORE9SX0NTVEQgIF9TVExQX1ZFTkRPUl9TVEQKLSMgICAgZGVmaW5lIF9TVExQX1VTSU5HX1ZFTkRPUl9DU1REIF9TVExQX1VTSU5HX05BTUVTUEFDRShfU1RMUF9WRU5ET1JfQ1NURCkKLSMgIGVuZGlmIC8qIF9TVExQX1ZFTkRPUl9DU1REICovCi0vKiBleGNlcHRpb24sIHR5cGVpbmZvLCBuZXcgLSBhbHdheXMgY29tZSBmcm9tIHRoZSB2ZW5kb3IgKi8KLSMgIGlmICFkZWZpbmVkIChfU1RMUF9WRU5ET1JfRVhDRVBUX1NURCkKLSMgICAgaWYgZGVmaW5lZCAoX1NUTFBfVkVORE9SX0dMT0JBTF9FWENFUFRfU1REKQotIyAgICAgIGRlZmluZSBfU1RMUF9WRU5ET1JfRVhDRVBUX1NURAotIyAgICBlbHNlCi0jICAgICAgZGVmaW5lIF9TVExQX1ZFTkRPUl9FWENFUFRfU1REIF9TVExQX1ZFTkRPUl9TVEQKLSMgICAgZW5kaWYKLSMgIGVuZGlmCi0jICBkZWZpbmUgX1NUTFBfT0xEX0lPX05BTUVTUEFDRQotIyAgaWYgIWRlZmluZWQgKF9TVExQX1ZFTkRPUl9NQl9OQU1FU1BBQ0UpCi0jICAgIGRlZmluZSBfU1RMUF9WRU5ET1JfTUJfTkFNRVNQQUNFIF9TVExQX1ZFTkRPUl9DU1RECi0jICBlbmRpZgotI2Vsc2UKLS8qIGNvbXBpbGVyIGhhcyBubyBuYW1lc3BhY2Ugc3VwcG9ydCAqLwotIyAgZGVmaW5lIF9TVExQX1ZFTkRPUl9TVEQKLSMgIGRlZmluZSBfU1RMUF9WRU5ET1JfQ1NURAotIyAgZGVmaW5lIF9TVExQX1VTSU5HX05BTUVTUEFDRSh4KQotIyAgZGVmaW5lIF9TVExQX1VTSU5HX1ZFTkRPUl9DU1RECi0jICBkZWZpbmUgX1NUTFBfVkVORE9SX0VYQ0VQVF9TVEQKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX1NUTFBfVVNFX05BTUVTUEFDRVMpCi0KLSMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9PV05fTkFNRVNQQUNFKQotIyAgICBpZiAhZGVmaW5lZCAoX1NUTFBfU1REX05BTUUpCi0jICAgICAgaWYgIWRlZmluZWQgKF9TVExQX0RFQlVHKQotIyAgICAgICAgaWYgIWRlZmluZWQgKF9TVExQX1VTSU5HX0NST1NTX05BVElWRV9SVU5USU1FX0xJQikKLSMgICAgICAgICAgaWZuZGVmIF9TVExQX1RIUkVBRFMKLSMgICAgICAgICAgICBkZWZpbmUgX1NUTFBfU1REX05BTUUgIHN0bHBtdHhfc3RkCi0jICAgICAgICAgIGVsc2UKLSMgICAgICAgICAgICBkZWZpbmUgX1NUTFBfU1REX05BTUUgIHN0bHBfc3RkCi0jICAgICAgICAgIGVuZGlmCi0jICAgICAgICBlbHNlCi0jICAgICAgICAgIGlmbmRlZiBfU1RMUF9USFJFQURTCi0jICAgICAgICAgICAgZGVmaW5lIF9TVExQX1NURF9OQU1FICBzdGxweG10eF9zdGQKLSMgICAgICAgICAgZWxzZQotIyAgICAgICAgICAgIGRlZmluZSBfU1RMUF9TVERfTkFNRSAgc3RscHhfc3RkCi0jICAgICAgICAgIGVuZGlmCi0jICAgICAgICBlbmRpZgotIyAgICAgIGVsc2UKLS8qCi0gKiBUaGUgU1RMcG9ydCBkZWJ1ZyBtb2RlIGlzIGJpbmFyeSBpbmNvbXBhdGlibGUgd2l0aCB0aGUgb3RoZXIgbW9kZXMsCi0gKiBsZXRzIG1ha2UgaXQgY2xlYXIgb24gdGhlIFNUTHBvcnQgbmFtZXNwYWNlIHRvIGdlbmVyYXRlIGxpbmsgZXJyb3JzIHJhdGhlcgotICogdGhhbiBydW50aW1lLgotICovCi0jICAgICAgICBpZiAhZGVmaW5lZCAoX1NUTFBfVVNJTkdfQ1JPU1NfTkFUSVZFX1JVTlRJTUVfTElCKQotIyAgICAgICAgICBpZm5kZWYgX1NUTFBfVEhSRUFEUwotIyAgICAgICAgICAgIGRlZmluZSBfU1RMUF9TVERfTkFNRSAgc3RscGRtdHhfc3RkCi0jICAgICAgICAgIGVsc2UKLSMgICAgICAgICAgICBkZWZpbmUgX1NUTFBfU1REX05BTUUgIHN0bHBkX3N0ZAotIyAgICAgICAgICBlbmRpZgotIyAgICAgICAgZWxzZQotIyAgICAgICAgICBpZm5kZWYgX1NUTFBfVEhSRUFEUwotIyAgICAgICAgICAgIGRlZmluZSBfU1RMUF9TVERfTkFNRSAgc3RscGR4bXR4X3N0ZAotIyAgICAgICAgICBlbHNlCi0jICAgICAgICAgICAgZGVmaW5lIF9TVExQX1NURF9OQU1FICBzdGxwZHhfc3RkCi0jICAgICAgICAgIGVuZGlmCi0jICAgICAgICBlbmRpZgotIyAgICAgIGVuZGlmCi0jICAgIGVuZGlmCi1uYW1lc3BhY2UgX1NUTFBfU1REX05BTUUgeyB9Ci0jICBlbHNlCi0jICAgIGlmIGRlZmluZWQgKF9TVExQX0RFQlVHKQotbmFtZXNwYWNlIHN0ZEQgPSBzdGQ7Ci0jICAgIGVuZGlmCi0jICAgIGRlZmluZSBfU1RMUF9TVERfTkFNRSBzdGQKLSMgIGVuZGlmIC8qIF9TVExQX1VTRV9PV05fTkFNRVNQQUNFICovCi0KLSMgIGlmICFkZWZpbmVkIChfU1RMUF9VU0lOR19OQU1FU1BBQ0VfQlVHKQotIyAgICBkZWZpbmUgX1NUTFBfUFJJVl9OQU1FIHN0bHBfcHJpdgotbmFtZXNwYWNlIF9TVExQX1BSSVZfTkFNRSB7Ci0gIHVzaW5nIG5hbWVzcGFjZSBfU1RMUF9TVERfTkFNRTsKLX0KLSMgIGVsc2UKLSMgICAgZGVmaW5lIF9TVExQX1BSSVZfTkFNRSBwcml2Ci0jICBlbmRpZgotCi0jICBkZWZpbmUgX1NUTFBfQkVHSU5fTkFNRVNQQUNFIG5hbWVzcGFjZSBfU1RMUF9TVERfTkFNRSB7Ci0jICBkZWZpbmUgX1NUTFBfRU5EX05BTUVTUEFDRSB9Ci0KLSMgIGlmICFkZWZpbmVkIChfU1RMUF9ET05UX1VTRV9QUklWX05BTUVTUEFDRSkKLSMgICAgaWYgIWRlZmluZWQgKF9TVExQX1VTSU5HX05BTUVTUEFDRV9CVUcpCi0vKiBXZSBwcmVmZXIgdG8gbWFrZSBwcml2YXRlIG5hbWVzcGFjZSBhIHRvdGFseSBzZXBlcmF0ZWQgbmFtZXNwYWNlLi4uCi0gKi8KLSMgICAgICBkZWZpbmUgX1NUTFBfUFJJViA6Ol9TVExQX1BSSVZfTkFNRTo6Ci0jICAgICAgZGVmaW5lIF9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UgfSBuYW1lc3BhY2UgX1NUTFBfUFJJVl9OQU1FIHsKLSMgICAgICBkZWZpbmUgX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFIH0gbmFtZXNwYWNlIF9TVExQX1NURF9OQU1FIHsKLSMgICAgZWxzZQotLyogYnV0IHNvbWV0aW1lcyB3ZSBjYW4ndDoKLSAqLwotIyAgICAgIGRlZmluZSBfU1RMUF9QUklWIF9TVExQX1BSSVZfTkFNRTo6Ci0jICAgICAgZGVmaW5lIF9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UgbmFtZXNwYWNlIF9TVExQX1BSSVZfTkFNRSB7Ci0jICAgICAgZGVmaW5lIF9TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRSB9Ci0jICAgIGVuZGlmCi0jICBlbHNlCi0jICAgIGRlZmluZSBfU1RMUF9QUklWCi0jICAgIGRlZmluZSBfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCi0jICAgIGRlZmluZSBfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKLSMgIGVuZGlmCi0KLS8qIGRlY2lkZSB3aGV0aGVyIG9yIG5vdCB3ZSB1c2Ugc2VwYXJhdGUgbmFtZXNwYWNlIGZvciByZWwgb3BzICovCi0jICBpZiBkZWZpbmVkIChfU1RMUF9OT19SRUxPUFNfTkFNRVNQQUNFKQotIyAgICBkZWZpbmUgX1NUTFBfQkVHSU5fUkVMT1BTX05BTUVTUEFDRSBfU1RMUF9CRUdJTl9OQU1FU1BBQ0UgbmFtZXNwYWNlIHJlbF9vcHMge30KLSMgICAgZGVmaW5lIF9TVExQX0VORF9SRUxPUFNfTkFNRVNQQUNFIH0KLSMgIGVsc2UKLS8qIFVzZSBzdGQ6OnJlbF9vcHMgbmFtZXNwYWNlICovCi0jICAgIGRlZmluZSBfU1RMUF9CRUdJTl9SRUxPUFNfTkFNRVNQQUNFIF9TVExQX0JFR0lOX05BTUVTUEFDRSBuYW1lc3BhY2UgcmVsX29wcyB7Ci0jICAgIGRlZmluZSBfU1RMUF9FTkRfUkVMT1BTX05BTUVTUEFDRSB9IH0KLSMgICAgZGVmaW5lIF9TVExQX1VTRV9TRVBBUkFURV9SRUxPUFNfTkFNRVNQQUNFCi0jICBlbmRpZiAvKiBVc2Ugc3RkOjpyZWxfb3BzIG5hbWVzcGFjZSAqLwotCi0jICBkZWZpbmUgX1NUTFBfU1REIDo6X1NUTFBfU1REX05BTUUKLQotLyogT2ZmaWNpYWwgU1RMcG9ydCBuYW1lc3BhY2Ugd2hlbiBzdGQgaXMgbm90IHJlZGVmaW5lZC4KLSAqIEhlcmUgd2UgZG9uJ3QgdXNlIGEgbWFjcm8gYXMgc3RscG9ydCBpcyB1c2VkIGFzIGZpbGUgbmFtZSBieSBib29zdAotICogYW5kIGZvbGRlciBuYW1lIHVuZGVyIGJlb3M6Ci0gKi8KLW5hbWVzcGFjZSBzdGxwb3J0ID0gX1NUTFBfU1REX05BTUU7Ci0KLS8qIEJhY2t3YXJkIGNvbXBhdGliaWxpdHk6Ci0gKi8KLW5hbWVzcGFjZSBfU1RMID0gX1NUTFBfU1REX05BTUU7Ci0jdW5kZWYgX19TVExQT1JUX05BTUVTUEFDRQotI2RlZmluZSBfX1NUTFBPUlRfTkFNRVNQQUNFIF9TVExQX1NURF9OQU1FCi0KLSNlbHNlIC8qIF9TVExQX1VTRV9OQU1FU1BBQ0VTICovCi0vKiBTVExwb3J0IGlzIGJlaW5nIHB1dCBpbnRvIGdsb2JhbCBuYW1lc3BhY2UgKi8KLSMgIGRlZmluZSBfU1RMUF9TVEQKLSMgIGRlZmluZSBfU1RMUF9QUklWCi0jICBkZWZpbmUgX1NUTFBfQkVHSU5fTkFNRVNQQUNFCi0jICBkZWZpbmUgX1NUTFBfRU5EX05BTUVTUEFDRQotIyAgZGVmaW5lIF9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKLSMgIGRlZmluZSBfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKLQotLyogYm9yaXMgOiBpdCB3YXMgZm91bmQgb3V0IHRoYXQgX1NUTFBfVVNFX1NFUEFSQVRFX1JFTE9QU19OQU1FU1BBQ0UKLSAgIGNhdXNlcyBsZXNzIHByb2JsZW1zIHRoYW4gaGF2aW5nIHJlbGF0aW9uYWwgb3BlcmF0b3IgdGVtcGxhdGVzIGluIGdsb2JhbCBuYW1lc3BhY2UKLSAgIFBsZWFzZSBkZWZpbmUgX1NUTFBfTk9fUkVMT1BTX05BTUVTUEFDRSBpbiBjb25maWcvdXNlcl9jb25maWcuaCBpZiB5b3VyIGNvZGUgcmVseSBvbiB0aGVtLiAqLwotIyAgaWYgIWRlZmluZWQgKF9TVExQX05PX1JFTE9QU19OQU1FU1BBQ0UpCi0jICAgIGRlZmluZSBfU1RMUF9VU0VfU0VQQVJBVEVfUkVMT1BTX05BTUVTUEFDRQotIyAgZW5kaWYKLSMgIGRlZmluZSBfU1RMUF9CRUdJTl9SRUxPUFNfTkFNRVNQQUNFCi0jICBkZWZpbmUgX1NUTFBfRU5EX1JFTE9QU19OQU1FU1BBQ0UKLSMgIHVuZGVmICBfU1RMUF9VU0VfT1dOX05BTUVTUEFDRQotI2VuZGlmICAvKiBfU1RMUF9VU0VfTkFNRVNQQUNFUyAqLwotCi0jZGVmaW5lIFNUTFBPUlRfQ1NURCBfU1RMUF9WRU5ET1JfQ1NURAotI2RlZmluZSBTVExQT1JUICAgICAgX1NUTFBfU1REX05BTUUKLQotI2lmIGRlZmluZWQoX1NUTFBfQk9HVVNfVEVNUExBVEVfVFlQRV9NQVRDSElOR19CVUcpCi0jICBkZWZpbmUgX1NUTFBfU0lNUExFX1RZUEUoVCkgX3N0bF90cml2aWFsX3Byb3h5PFQ+Ci0jZWxzZQotIyAgZGVmaW5lIF9TVExQX1NJTVBMRV9UWVBFKFQpIFQKLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX1JBTkQ0OAotIyAgZGVmaW5lIF9TVExQX05PX0RSQU5ENDgKLSNlbmRpZgotCi0vKiBhZHZhbmNlZCBrZXl3b3JkcyB1c2FnZSAqLwotI2RlZmluZSBfX0NfQ0FTVChfX3gsIF9feSkgKChfX3gpKF9feSkpCi0jaWZuZGVmICBfU1RMUF9OT19ORVdfU1RZTEVfQ0FTVFMKLSMgIGRlZmluZSBfX0NPTlNUX0NBU1QoX194LF9feSkgY29uc3RfY2FzdDxfX3g+KF9feSkKLSMgIGRlZmluZSBfX1NUQVRJQ19DQVNUKF9feCxfX3kpIHN0YXRpY19jYXN0PF9feD4oX195KQotIyAgZGVmaW5lIF9fUkVJTlRFUlBSRVRfQ0FTVChfX3gsX195KSByZWludGVycHJldF9jYXN0PF9feD4oX195KQotIyAgZGVmaW5lIF9fRFlOQU1JQ19DQVNUKF9feCxfX3kpIGR5bmFtaWNfY2FzdDxfX3g+KF9feSkKLSNlbHNlCi0jICBkZWZpbmUgX19TVEFUSUNfQ0FTVChfX3gsX195KSBfX0NfQ0FTVChfX3gsIF9feSkKLSMgIGRlZmluZSBfX0NPTlNUX0NBU1QoX194LF9feSkgX19DX0NBU1QoX194LCBfX3kpCi0jICBkZWZpbmUgX19SRUlOVEVSUFJFVF9DQVNUKF9feCxfX3kpIF9fQ19DQVNUKF9feCwgX195KQotIyAgZGVmaW5lIF9fRFlOQU1JQ19DQVNUKF9feCxfX3kpIF9fQ19DQVNUKF9feCwgX195KQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9ORUVEX1RZUEVOQU1FKSAmJiAhIGRlZmluZWQgKHR5cGVuYW1lKQotIyAgZGVmaW5lIHR5cGVuYW1lCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9TVExQX05FRURfVFlQRU5BTUUpIHx8IGRlZmluZWQgKF9TVExQX05PX1RZUEVOQU1FX09OX1JFVFVSTl9UWVBFICkKLSMgIGRlZmluZSBfU1RMUF9UWVBFTkFNRV9PTl9SRVRVUk5fVFlQRQotI2Vsc2UKLSMgIGRlZmluZSBfU1RMUF9UWVBFTkFNRV9PTl9SRVRVUk5fVFlQRSB0eXBlbmFtZQotI2VuZGlmCi0KLSNpZmRlZiBfU1RMUF9OT19UWVBFTkFNRV9JTl9URU1QTEFURV9IRUFERVIKLSMgIGRlZmluZSBfU1RMUF9IRUFERVJfVFlQRU5BTUUKLSNlbHNlCi0jICBkZWZpbmUgX1NUTFBfSEVBREVSX1RZUEVOQU1FIHR5cGVuYW1lCi0jZW5kaWYKLQotI2lmbmRlZiBfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVfS0VZV09SRAotIyAgZGVmaW5lIF9TVExQX1RFTVBMQVRFIHRlbXBsYXRlCi0jZWxzZQotIyAgZGVmaW5lIF9TVExQX1RFTVBMQVRFCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9TVExQX1VTRV9DT05UQUlORVJTX0VYVEVOU0lPTikKLSMgIGRlZmluZSBfU1RMUF9LRVlfVFlQRV9GT1JfQ09OVF9FWFQodHlwZSkKLSMgIGRlZmluZSBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQgdGVtcGxhdGUgPGNsYXNzIF9LVD4KLSNlbHNlCi0jICBkZWZpbmUgX1NUTFBfS0VZX1RZUEVfRk9SX0NPTlRfRVhUKHR5cGUpIHR5cGVkZWYgdHlwZSBfS1Q7Ci0jICBkZWZpbmUgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9TVExQX05FRURfRVhQTElDSVQpICYmICFkZWZpbmVkIChleHBsaWNpdCkKLSMgIGRlZmluZSBleHBsaWNpdAotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfTkVFRF9NVVRBQkxFKQotIyAgZGVmaW5lIF9TVExQX0FTU0lHTl9NVVRBQkxFKHR5cGUseCx5KSB4ID0geQotI2Vsc2UKLSMgIGRlZmluZSBfU1RMUF9BU1NJR05fTVVUQUJMRSh0eXBlLHgseSkgX19DT05TVF9DQVNUKHR5cGUseCk9eQotIyAgZGVmaW5lIG11dGFibGUKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX1NUTFBfTk9fU0lHTkVEX0JVSUxUSU5TKQotLyogb2xkIEhQLVVYIGRvZXNuJ3QgdW5kZXJzdGFuZCAic2lnbmVkIiBrZXl3b3JkICovCi0jICBkZWZpbmUgc2lnbmVkCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9TVExQX0xPT1BfSU5MSU5FX1BST0JMRU1TKQotIyAgZGVmaW5lIF9TVExQX0lOTElORV9MT09QCi0jZWxzZQotIyAgZGVmaW5lIF9TVExQX0lOTElORV9MT09QIGlubGluZQotI2VuZGlmCi0KLSNkZWZpbmUgX1NUTFBfUFJJVkFURSBwdWJsaWMKLQotI2lmbmRlZiBfU1RMUF9OT19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OX1NZTlRBWAotIyAgZGVmaW5lIF9TVExQX1RFTVBMQVRFX05VTEwgdGVtcGxhdGU8PgotI2Vsc2UKLSMgIGRlZmluZSBfU1RMUF9URU1QTEFURV9OVUxMCi0jZW5kaWYKLQotI2lmZGVmIF9TVExQX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUgotIyAgZGVmaW5lIF9TVExQX09QRVJBVE9SX1RFTVBMQVRFCi0jZWxzZQotIyAgZGVmaW5lIF9TVExQX09QRVJBVE9SX1RFTVBMQVRFIF9TVExQX1RFTVBMQVRFX05VTEwKLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04KLS8qIHVubGVzcyB3ZSBoYXZlIG90aGVyIGNvbXBpbGVyIHByb2JsZW0sIHRyeSBzaW11bGF0aW5nIHBhcnRpYWwgc3BlYyBoZXJlICovCi0jICBpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9TSU1VTEFURV9QQVJUSUFMX1NQRUNfRk9SX1RZUEVfVFJBSVRTKQotIyAgICBkZWZpbmUgX1NUTFBfU0lNVUxBVEVfUEFSVElBTF9TUEVDX0ZPUl9UWVBFX1RSQUlUUwotIyAgZW5kaWYKLS8qIEZvciB5b3VyIG93biBpdGVyYXRvcnMsIHBsZWFzZSB1c2UgaW5oZXJpdGFuY2UgZnJvbSBpdGVyYXRvcjw+IGluc3RlYWQgb2YgdGhlc2Ugb2Jzb2xldGUgcXVlcmllcy4gKi8KLSMgIGlmICAoZGVmaW5lZCAoX1NUTFBfTkVTVEVEX1RZUEVfUEFSQU1fQlVHKSB8fCAhZGVmaW5lZCAoX1NUTFBfU0lNVUxBVEVfUEFSVElBTF9TUEVDX0ZPUl9UWVBFX1RSQUlUUykpCi0jICAgIGlmICEgZGVmaW5lZCAoIF9TVExQX1VTRV9PTERfSFBfSVRFUkFUT1JfUVVFUklFUyApCi0jICAgICAgZGVmaW5lIF9TVExQX1VTRV9PTERfSFBfSVRFUkFUT1JfUVVFUklFUwotIyAgICBlbmRpZgotIyAgZWxpZiBkZWZpbmVkICggX1NUTFBfTk9fQU5BQ0hST05JU01TICkKLSMgICAgdW5kZWYgX1NUTFBfVVNFX09MRF9IUF9JVEVSQVRPUl9RVUVSSUVTCi0jICBlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfTk9fRVhQTElDSVRfRlVOQ1RJT05fVE1QTF9BUkdTCi0jICBkZWZpbmUgX1NUTFBfTlVMTF9UTVBMX0FSR1MgPD4KLSMgZWxzZQotIyAgZGVmaW5lIF9TVExQX05VTExfVE1QTF9BUkdTCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkIChfU1RMUF9BTExPQ0FUT1JfVFlQRV9ERkwpCi0jICBpZiBkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQotIyAgICBkZWZpbmUgX1NUTFBfTkVFRFNfRVhUUkFfVEVNUExBVEVfQ09OU1RSVUNUT1JTCi0jICBlbmRpZgotIyAgaWYgZGVmaW5lZCAoX1NUTFBfTkVFRFNfRVhUUkFfVEVNUExBVEVfQ09OU1RSVUNUT1JTKQotIyAgICBkZWZpbmUgX1NUTFBfQUxMT0NBVE9SX1RZUEVfREZMCi0jICBlbHNlCi0jICAgIGRlZmluZSBfU1RMUF9BTExPQ0FUT1JfVFlQRV9ERkwgPSBhbGxvY2F0b3JfdHlwZSgpCi0jICBlbmRpZgotI2VuZGlmCi0KLS8qIFdoZW4gdGhlIGNvbXBpbGVyIGRvIG5vdCBjb3JyZWN0bHkgaW5pdGlhbGl6ZWQgdGhlIGJhc2ljIHR5cGVzIHZhbHVlIGluIGRlZmF1bHQgcGFyYW1ldGVycyB3ZSBwcmVmZXIKLSAqIHRvIGF2b2lkIHRoZW0gdG8gYmUgYWJsZSB0byBjb3JyZWN0IHRoaXMgYnVnLgotICovCi0jaWYgZGVmaW5lZCAoX1NUTFBfREVGX0NPTlNUX0RFRl9QQVJBTV9CVUcpCi0jICBkZWZpbmUgX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSAxCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9fU0dJX1NUTF9OT19BUlJPV19PUEVSQVRPUikgJiYgISBkZWZpbmVkIChfU1RMUF9OT19BUlJPV19PUEVSQVRPUikKLSMgIGRlZmluZSBfU1RMUF9OT19BUlJPV19PUEVSQVRPUgotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikKLSMgIGlmICEoZGVmaW5lZCAoX1NUTFBfTk9fQVJST1dfT1BFUkFUT1IpKSAmJiBcCi0gICAgICAgIWRlZmluZWQgKF9TVExQX05PX01TVkM1MF9DT01QQVRJQklMSVRZKSAmJiAhZGVmaW5lZCAoX1NUTFBfTVNWQzUwX0NPTVBBVElCSUxJVFkpCi0vKiB0aGlzIG9uZSBpcyBuZWVkZWQgZm9yIHByb3BlciByZXZlcnNlX2l0ZXJhdG9yPD4gb3BlcmF0b3IgLT4oKSBoYW5kbGluZyAqLwotIyAgICBkZWZpbmUgX1NUTFBfTVNWQzUwX0NPTVBBVElCSUxJVFkgMQotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoIF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04gKQotIyAgaWYgKGRlZmluZWQoX19JQk1DUFBfXykgJiYgKDUwMCA8PSBfX0lCTUNQUF9fKSAmJiAoX19JQk1DUFBfXyA8IDYwMCkgKQotIyAgICBkZWZpbmUgX1NUTFBfREVDTEFSRV9SRVZFUlNFX0lURVJBVE9SUyhfX3JldmVyc2VfaXRlcmF0b3IpIFwKLSAgIHR5cGVkZWYgdHlwZW5hbWUgX1NUTFBfU1REIDo6IHJldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3I+IGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7IFwKLSAgIHR5cGVkZWYgdHlwZW5hbWUgX1NUTFBfU1REIDo6IHJldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3I+IHJldmVyc2VfaXRlcmF0b3IKLSMgIGVsaWYgKGRlZmluZWQgKF9fc2dpKSAmJiAhIGRlZmluZWQgKF9fR05VQ19fKSkgfHwgZGVmaW5lZCAoX19TVU5QUk9fQ0MpIHx8IGRlZmluZWQgKF9feGxDX18pCi0jICAgIGRlZmluZSBfU1RMUF9ERUNMQVJFX1JFVkVSU0VfSVRFUkFUT1JTKF9fcmV2ZXJzZV9pdGVyYXRvcikgXAotICAgdHlwZWRlZiBfU1RMUF9TVEQ6OiBfU1RMUF9URU1QTEFURSByZXZlcnNlX2l0ZXJhdG9yPGNvbnN0X2l0ZXJhdG9yPiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOyBcCi0gICB0eXBlZGVmIF9TVExQX1NURDo6IF9TVExQX1RFTVBMQVRFIHJldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3I+IHJldmVyc2VfaXRlcmF0b3IKLSMgIGVsc2UKLSMgICAgZGVmaW5lIF9TVExQX0RFQ0xBUkVfUkVWRVJTRV9JVEVSQVRPUlMoX19yZXZlcnNlX2l0ZXJhdG9yKSBcCi0gICB0eXBlZGVmIF9TVExQX1NURDo6cmV2ZXJzZV9pdGVyYXRvcjxjb25zdF9pdGVyYXRvcj4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsgXAotICAgdHlwZWRlZiBfU1RMUF9TVEQ6OnJldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3I+IHJldmVyc2VfaXRlcmF0b3IKLSMgIGVuZGlmCi0jZWxzZSAvKiBfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OICovCi0jICBpZiBkZWZpbmVkIChfU1RMUF9NU1ZDNTBfQ09NUEFUSUJJTElUWSkKLSMgICAgZGVmaW5lIF9TVExQX0RFQ0xBUkVfUkVWRVJTRV9JVEVSQVRPUlMoX19yZXZlcnNlX2l0ZXJhdG9yKSBcCi0gIHR5cGVkZWYgX1NUTFBfU1REOjpfX3JldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3IsIHZhbHVlX3R5cGUsIGNvbnN0X3JlZmVyZW5jZSwgXAotICAgIGNvbnN0X3BvaW50ZXIsIGRpZmZlcmVuY2VfdHlwZT4gIGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7IFwKLSAgdHlwZWRlZiBfU1RMUF9TVEQ6Ol9fcmV2ZXJzZV9pdGVyYXRvcjxpdGVyYXRvciwgdmFsdWVfdHlwZSwgcmVmZXJlbmNlLCBwb2ludGVyLCBkaWZmZXJlbmNlX3R5cGU+IFwKLSAgICByZXZlcnNlX2l0ZXJhdG9yCi0jICBlbHNlCi0jICAgIGRlZmluZSBfU1RMUF9ERUNMQVJFX1JFVkVSU0VfSVRFUkFUT1JTKF9fcmV2ZXJzZV9pdGVyYXRvcikgXAotICB0eXBlZGVmIF9TVExQX1NURDo6X19yZXZlcnNlX2l0ZXJhdG9yPGNvbnN0X2l0ZXJhdG9yLCB2YWx1ZV90eXBlLCBjb25zdF9yZWZlcmVuY2UsIFwKLSAgICBkaWZmZXJlbmNlX3R5cGU+ICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOyBcCi0gIHR5cGVkZWYgX1NUTFBfU1REOjpfX3JldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3IsIHZhbHVlX3R5cGUsIFwKLSAgICByZWZlcmVuY2UsIGRpZmZlcmVuY2VfdHlwZT4gXAotICAgIHJldmVyc2VfaXRlcmF0b3IKLSMgIGVuZGlmCi0jZW5kaWYgLyogX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTiAqLwotCi0jZGVmaW5lIF9TVExQX0RFQ0xBUkVfQklESVJFQ1RJT05BTF9SRVZFUlNFX0lURVJBVE9SUyBcCi0gICAgICAgIF9TVExQX0RFQ0xBUkVfUkVWRVJTRV9JVEVSQVRPUlMocmV2ZXJzZV9iaWRpcmVjdGlvbmFsX2l0ZXJhdG9yKQotI2RlZmluZSBfU1RMUF9ERUNMQVJFX1JBTkRPTV9BQ0NFU1NfUkVWRVJTRV9JVEVSQVRPUlMgXAotICAgICAgICBfU1RMUF9ERUNMQVJFX1JFVkVSU0VfSVRFUkFUT1JTKHJldmVyc2VfaXRlcmF0b3IpCi0KLSNkZWZpbmUgX19JTVBPUlRfQ09OVEFJTkVSX1RZUEVERUZTKF9TdXBlcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdHlwZWRlZiB0eXBlbmFtZSBfU3VwZXI6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHR5cGVkZWYgdHlwZW5hbWUgX1N1cGVyOjpzaXplX3R5cGUgc2l6ZV90eXBlOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB0eXBlZGVmIHR5cGVuYW1lIF9TdXBlcjo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsgICAgICAgICAgICBcCi0gICAgdHlwZWRlZiB0eXBlbmFtZSBfU3VwZXI6OnJlZmVyZW5jZSByZWZlcmVuY2U7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHR5cGVkZWYgdHlwZW5hbWUgX1N1cGVyOjpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlOyAgICAgICAgICAgIFwKLSAgICB0eXBlZGVmIHR5cGVuYW1lIF9TdXBlcjo6cG9pbnRlciBwb2ludGVyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdHlwZWRlZiB0eXBlbmFtZSBfU3VwZXI6OmNvbnN0X3BvaW50ZXIgY29uc3RfcG9pbnRlcjsgICAgICAgICAgICAgICAgXAotICAgIHR5cGVkZWYgdHlwZW5hbWUgX1N1cGVyOjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKLQotCi0jZGVmaW5lIF9fSU1QT1JUX0lURVJBVE9SUyhfU3VwZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHR5cGVkZWYgdHlwZW5hbWUgX1N1cGVyOjppdGVyYXRvciBpdGVyYXRvcjsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB0eXBlZGVmIHR5cGVuYW1lIF9TdXBlcjo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7Ci0KLSNkZWZpbmUgX19JTVBPUlRfUkVWRVJTRV9JVEVSQVRPUlMoX1N1cGVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHR5cGVkZWYgdHlwZW5hbWUgX1N1cGVyOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOyBcCi0gICAgdHlwZWRlZiB0eXBlbmFtZSBfU3VwZXI6OnJldmVyc2VfaXRlcmF0b3IgcmV2ZXJzZV9pdGVyYXRvcjsKLQotI2RlZmluZSAgX19JTVBPUlRfU1VQRVJfQ09QWV9BU1NJR05NRU5UKF9fZGVyaXZlZF9uYW1lLCBfU2VsZiwgX1NVUEVSKSAgICAgICBcCi0gICAgX19kZXJpdmVkX25hbWUoY29uc3QgX1N1cGVyJiBfX3gpIDogX1NVUEVSKF9feCkge30gICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBfU2VsZiYgb3BlcmF0b3I9KGNvbnN0IF9TdXBlciYgX194KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAqKF9TdXBlciopdGhpcyA9IF9feDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHJldHVybiAqdGhpczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIF9fZGVyaXZlZF9uYW1lKGNvbnN0IF9TZWxmJiBfX3gpIDogX1NVUEVSKF9feCkge30gICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgX1NlbGYmIG9wZXJhdG9yPShjb25zdCBfU2VsZiYgX194KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKihfU3VwZXIqKXRoaXMgPSBfX3g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICByZXR1cm4gKnRoaXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfQotCi0jZGVmaW5lIF9fSU1QT1JUX1dJVEhfSVRFUkFUT1JTKF9TdXBlcikgXAotICBfX0lNUE9SVF9DT05UQUlORVJfVFlQRURFRlMoX1N1cGVyKSBfX0lNUE9SVF9JVEVSQVRPUlMoX1N1cGVyKQotCi0jZGVmaW5lIF9fSU1QT1JUX1dJVEhfUkVWRVJTRV9JVEVSQVRPUlMoX1N1cGVyKSBcCi0gIF9fSU1QT1JUX1dJVEhfSVRFUkFUT1JTKF9TdXBlcikgX19JTVBPUlRfUkVWRVJTRV9JVEVSQVRPUlMoX1N1cGVyKQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfVFJJVklBTF9DT05TVFJVQ1RPUl9CVUcpCi0jICBkZWZpbmUgX19UUklWSUFMX0NPTlNUUlVDVE9SKF9fdHlwZSkgX190eXBlKCkge30KLSNlbHNlCi0jICBkZWZpbmUgX19UUklWSUFMX0NPTlNUUlVDVE9SKF9fdHlwZSkKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX1NUTFBfVFJJVklBTF9ERVNUUlVDVE9SX0JVRykKLSMgIGRlZmluZSBfX1RSSVZJQUxfREVTVFJVQ1RPUihfX3R5cGUpIH5fX3R5cGUoKSB7fQotI2Vsc2UKLSMgIGRlZmluZSBfX1RSSVZJQUxfREVTVFJVQ1RPUihfX3R5cGUpCi0jZW5kaWYKLQotI2RlZmluZSBfX1RSSVZJQUxfU1RVRkYoX190eXBlKSAgXAotICBfX1RSSVZJQUxfQ09OU1RSVUNUT1IoX190eXBlKSBfX1RSSVZJQUxfREVTVFJVQ1RPUihfX3R5cGUpCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9IQVNfTk9fRVhDRVBUSU9OUykKLSMgIGRlZmluZSBfU1RMUF9OT19FWENFUFRJT05TCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkIChfU1RMUF9ET05UX1VTRV9FWENFUFRJT05TKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhDRVBUSU9OUykgJiYgIWRlZmluZWQgKF9TVExQX1VTRV9FWENFUFRJT05TKQotIyAgZGVmaW5lIF9TVExQX1VTRV9FWENFUFRJT05TCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9TVExQX1VTRV9FWENFUFRJT05TKQotIyAgZGVmaW5lIF9TVExQX1RSWSB0cnkKLSMgIGRlZmluZSBfU1RMUF9DQVRDSF9BTEwgY2F0Y2goLi4uKQotIyAgaWZuZGVmIF9TVExQX1RIUk9XCi0jICAgIGRlZmluZSBfU1RMUF9USFJPVyh4KSB0aHJvdyB4Ci0jICBlbmRpZgotIyAgZGVmaW5lIF9TVExQX1JFVEhST1cgdGhyb3cKLQotIyAgZGVmaW5lIF9TVExQX1VOV0lORChhY3Rpb24pIGNhdGNoKC4uLikgeyBhY3Rpb247IHRocm93OyB9Ci0KLSMgIGlmZGVmIF9TVExQX1RIUk9XX1JFVFVSTl9CVUcKLSMgICAgZGVmaW5lIF9TVExQX1JFVF9BRlRFUl9USFJPVyhkYXRhKSByZXR1cm4gZGF0YTsKLSMgIGVsc2UKLSMgICAgZGVmaW5lIF9TVExQX1JFVF9BRlRFUl9USFJPVyhkYXRhKQotIyAgZW5kaWYKLQotLyogV2UgZG8gbm90IHVzZSBleGNlcHRpb24gdGhyb3cgc3BlY2lmaWNhdGlvbnMgdW5sZXNzIHdlIGFyZSBmb3JjZWQgdG8gKi8KLSMgIGlmICFkZWZpbmVkIChfU1RMUF9USFJPV1MpCi0jICAgIGRlZmluZSBfU1RMUF9USFJPV1MoeCkKLSMgIGVuZGlmCi0jICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9USFJPVykKLSMgICAgZGVmaW5lIF9TVExQX05PVEhST1cKLSMgIGVuZGlmCi0jZWxzZQotIyAgZGVmaW5lIF9TVExQX1RSWQotIyAgZGVmaW5lIF9TVExQX0NBVENIX0FMTCBpZiAoZmFsc2UpCi0jICBpZm5kZWYgX1NUTFBfVEhST1cKLSMgICAgZGVmaW5lIF9TVExQX1RIUk9XKHgpCi0jICBlbmRpZgotIyAgZGVmaW5lIF9TVExQX1JFVEhST1cge30KLSMgIGRlZmluZSBfU1RMUF9VTldJTkQoYWN0aW9uKQotIyAgZGVmaW5lIF9TVExQX1RIUk9XUyh4KQotIyAgZGVmaW5lIF9TVExQX05PVEhST1cKLSMgIGRlZmluZSBfU1RMUF9SRVRfQUZURVJfVEhST1coZGF0YSkKLSNlbmRpZgotCi0vKgotICogSGVyZSB3ZSBjaGVjayBfU1RMUF9OT19FWENFUFRJT05TIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGNvbXBpbGVyIGhhcyBubwotICogZXhjZXB0aW9uIHN1cHBvcnQgYnV0IG5vdCB0aGUgX1NUTFBfVVNFX0VYQ0VQVElPTlMgd2hpY2ggc2ltcGx5IG1lYW5zCi0gKiB0aGF0IHRoZSB1c2VyIGRvIG5vdCB3YW50IHRvIHVzZSB0aGVtLgotICovCi0jaWYgIWRlZmluZWQgKF9TVExQX05PX0VYQ0VQVElPTlMpICYmICFkZWZpbmVkIChfU1RMUF9OT19FWENFUFRJT05fU1BFQykKLSMgIGRlZmluZSBfU1RMUF9USFJPV1NfSU5IRVJFTlRMWSh4KSB0aHJvdyB4Ci0jICBkZWZpbmUgX1NUTFBfTk9USFJPV19JTkhFUkVOVExZIHRocm93KCkKLSNlbHNlCi0jICBkZWZpbmUgX1NUTFBfVEhST1dTX0lOSEVSRU5UTFkoeCkKLSMgIGRlZmluZSBfU1RMUF9OT1RIUk9XX0lOSEVSRU5UTFkKLSNlbmRpZgotCi0vKiBTVExwb3J0IGZ1bmN0aW9uIG5vdCByZXR1cm5pbmcgYXJlIGZ1bmN0aW9ucyB0aGF0IHRocm93IHNvIHdlIHRyYW5zbGF0ZQotICogdGhlIG5vcmV0dXJuIGZ1bmN0aW9ucyBpbiB0aHJvd2luZyBmdW5jdGlvbnMgdGFraW5nIGFsc28gaW50byBhY2NvdW50Ci0gKiBleGNlcHRpb24gc3VwcG9ydCBhY3RpdmF0aW9uLgotICovCi0jaWYgZGVmaW5lZCAoX1NUTFBfTk9SRVRVUk5fRlVOQ1RJT04pICYmICFkZWZpbmVkIChfU1RMUF9OT19FWENFUFRJT05TKSAmJiBcCi0gICAhZGVmaW5lZCAoX1NUTFBfRlVOQ1RJT05fVEhST1dTKQotIyAgZGVmaW5lIF9TVExQX0ZVTkNUSU9OX1RIUk9XUyBfU1RMUF9OT1JFVFVSTl9GVU5DVElPTgotI2Vsc2UKLSMgIGRlZmluZSBfU1RMUF9GVU5DVElPTl9USFJPV1MKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfU1RMUF9OT19CT09MKQotIyAgaWYgKGRlZmluZWQgKF9fSUJNQ1BQX18pICYmIChfX0lCTUNQUF9fIDwgNDAwKSkgJiYgISBkZWZpbmVkIChfQUlYKQotIyAgICBpbmNsdWRlIDxpc3lub255bS5ocHA+Ci0jICAgIGlmIGRlZmluZWQgKF9fT1M0MDBfXykKLXR5cGVkZWYgaW50IGJvb2w7Ci0jICAgIGVsaWYgISggZGVmaW5lZCAoX194bENfXykgfHwgZGVmaW5lZCAoX0FJWCkpCi10eXBlZGVmIEJvb2xlYW4gYm9vbDsKLSMgICAgZW5kaWYKLSMgIGVsc2UKLSMgICAgaWYgZGVmaW5lZChfU1RMUF9ZVkFMU19IKQotIyAgICAgIGluY2x1ZGUgPHl2YWxzLmg+Ci0jICAgIGVsc2UKLSMgICAgICBpZiBkZWZpbmVkIChfU1RMUF9ET05UX1VTRV9CT09MX1RZUEVERUYpCi0jICAgICAgICBkZWZpbmUgYm9vbCBpbnQKLSMgICAgICBlbHNlCi10eXBlZGVmIGludCBib29sOwotIyAgICAgIGVuZGlmCi0jICAgICAgZGVmaW5lIHRydWUgMQotIyAgICAgIGRlZmluZSBmYWxzZSAwCi0jICAgIGVuZGlmCi0jICBlbmRpZiAvKiBfX0lCTUNQUF9fICovCi0jZWxzZQotIyAgZGVmaW5lIF9TVExQX0JPT0xfS0VZV09SRCAxCi0jZW5kaWYgLyogX1NUTFBfTk9fQk9PTCAqLwotCi0jaWZuZGVmIF9TVExQX01QV19FWFRSQV9DT05TVAotIyAgZGVmaW5lIF9TVExQX01QV19FWFRSQV9DT05TVAotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfREVGQVVMVENIQVIKLSMgIGRlZmluZSBfU1RMUF9ERUZBVUxUQ0hBUiBjaGFyCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHX0FMTE9DKSAmJiAhZGVmaW5lZCAoX1NUTFBfQVNTRVJUSU9OUykKLSMgIGRlZmluZSBfU1RMUF9BU1NFUlRJT05TIDEKLSNlbmRpZgotCi0vKiB1bmluaXRpYWxpemVkIHZhbHVlIGZpbGxlciAqLwotI2lmbmRlZiBfU1RMUF9TSFJFRF9CWVRFCi0vKiBUaGlzIHZhbHVlIGlzIGRlc2lnbmVkIHRvIGNhdXNlIHByb2JsZW1zIGlmIGFuIGVycm9yIG9jY3VycyAqLwotIyAgZGVmaW5lIF9TVExQX1NIUkVEX0JZVEUgMHhBMwotI2VuZGlmIC8qIF9TVExQX1NIUkVEX0JZVEUgKi8KLQotLyogc2hhcmVkIGxpYnJhcnkgdHVuZS11cCAqLwotI2lmbmRlZiBfU1RMUF9JTVBPUlRfREVDTFNQRUMKLSMgIGRlZmluZSBfU1RMUF9JTVBPUlRfREVDTFNQRUMKLSNlbmRpZgotCi0vKiBhIGtleXdvcmQgdXNlZCB0byBpbnN0YW50aWF0ZSBleHBvcnQgdGVtcGxhdGUgKi8KLSNpZm5kZWYgX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0tFWVdPUkQKLSMgIGRlZmluZSBfU1RMUF9FWFBPUlRfVEVNUExBVEVfS0VZV09SRAotI2VuZGlmCi0jaWZuZGVmIF9TVExQX0lNUE9SVF9URU1QTEFURV9LRVlXT1JECi0jICBkZWZpbmUgX1NUTFBfSU1QT1JUX1RFTVBMQVRFX0tFWVdPUkQKLSNlbmRpZgotCi0jaWZkZWYgX1NUTFBfVVNFX05PX0lPU1RSRUFNUwotLyoKLSAqIElmIHdlIGRvIG5vdCB1c2UgaW9zdHJlYW1zIHdlIGRvIG5vdCB1c2UgdGhlIGV4cG9ydC9pbXBvcnQKLSAqIHRlY2huaXF1ZXMgdG8gYXZvaWQgYnVpbGQgb2YgdGhlIFNUTHBvcnQgbGlicmFyeS4KLSAqLwotIyAgdW5kZWYgX1NUTFBfVVNFX0RFQ0xTUEVDCi0vKiBXZSBhbHNvIHVuZGVmIFVTRV9EWU5BTUlDX0xJQiBtYWNybyBhcyB0aGlzIG1hY3JvIGFkZCBzb21lIGNvZGUKLSAqIHRvIHVzZSB0aGUgZHluYW1pYyAoc2hhcmVkKSBTVExwb3J0IGxpYnJhcnkgZm9yIHNvbWUgcGxhdGZvcm0vY29tcGlsZXIKLSAqIGNvbmZpZ3VyYXRpb24gbGVhZGluZyB0byBwcm9ibGVtIHdoZW4gZG8gbm90IGxpbmsgdG8gdGhlIFNUTHBvcnQgbGliLgotICovCi0jICB1bmRlZiBfU1RMUF9VU0VfRFlOQU1JQ19MSUIKLSNlbmRpZgotCi0jaWYgIGRlZmluZWQgKF9TVExQX0RMTEVYUE9SVF9ORUVEU19QUkVERUNMQVJBVElPTikgJiYgZGVmaW5lZCAoX1NUTFBfVVNFX0RFQ0xTUEVDKQotIyAgaWYgISBkZWZpbmVkIChfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUKQotLyogdGhpcyBzZXR0aW5nIHR1cm5zIG9uICJleHRlcm4gdGVtcGxhdGUiIGV4dGVuc2lvbiB1c2UgKi8KLSMgICAgZGVmaW5lIF9TVExQX1VTRV9URU1QTEFURV9FWFBPUlQKLSMgIGVuZGlmCi0jICBpZiBkZWZpbmVkIChfU1RMUF9ERVNJR05BVEVEX0RMTCkgJiYgISBkZWZpbmVkIChfU1RMUF9OT19GT1JDRV9JTlNUQU5USUFURSkKLSMgICAgZGVmaW5lIF9TVExQX05PX0ZPUkNFX0lOU1RBTlRJQVRFCi0jICBlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9ERVNJR05BVEVEX0RMTCkgLyogVGhpcyBpcyBhIGxpYiB3aGljaCB3aWxsIGNvbnRhaW4gU1RMcG9ydCBleHBvcnRzICovCi0jICBkZWZpbmUgIF9TVExQX0VYUE9SVCBfU1RMUF9FWFBPUlRfVEVNUExBVEVfS0VZV09SRAotI2Vsc2UKLSMgIGRlZmluZSAgX1NUTFBfRVhQT1JUIF9TVExQX0lNUE9SVF9URU1QTEFURV9LRVlXT1JECi0jZW5kaWYKLQotI2lmbmRlZiBfU1RMUF9FWFBPUlRfVEVNUExBVEUKLSMgIGRlZmluZSAgX1NUTFBfRVhQT1JUX1RFTVBMQVRFIF9TVExQX0VYUE9SVCB0ZW1wbGF0ZQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfREVDTFNQRUMpIC8qIHVzaW5nIGV4cG9ydC9pbXBvcnQgdGVjaG5pcXVlICovCi0KLSMgIGlmbmRlZiBfU1RMUF9FWFBPUlRfREVDTFNQRUMKLSMgICAgZGVmaW5lIF9TVExQX0VYUE9SVF9ERUNMU1BFQwotIyAgZW5kaWYKLSMgIGlmbmRlZiBfU1RMUF9JTVBPUlRfREVDTFNQRUMKLSMgICAgZGVmaW5lIF9TVExQX0lNUE9SVF9ERUNMU1BFQwotIyAgZW5kaWYKLSMgIGlmbmRlZiBfU1RMUF9DTEFTU19FWFBPUlRfREVDTFNQRUMKLSMgICAgZGVmaW5lIF9TVExQX0NMQVNTX0VYUE9SVF9ERUNMU1BFQwotIyAgZW5kaWYKLSMgIGlmbmRlZiBfU1RMUF9DTEFTU19JTVBPUlRfREVDTFNQRUMKLSMgICAgZGVmaW5lIF9TVExQX0NMQVNTX0lNUE9SVF9ERUNMU1BFQwotIyAgZW5kaWYKLSMgIGlmIGRlZmluZWQgKF9TVExQX0RFU0lHTkFURURfRExMKSAvKiBUaGlzIGlzIGEgbGliIHdoaWNoIHdpbGwgY29udGFpbiBTVExwb3J0IGV4cG9ydHMgKi8KLSMgICAgZGVmaW5lICBfU1RMUF9ERUNMU1BFQyAgICAgICAgX1NUTFBfRVhQT1JUX0RFQ0xTUEVDCi0jICAgIGRlZmluZSAgX1NUTFBfQ0xBU1NfREVDTFNQRUMgIF9TVExQX0NMQVNTX0VYUE9SVF9ERUNMU1BFQwotIyAgZWxzZQotIyAgICBkZWZpbmUgIF9TVExQX0RFQ0xTUEVDICAgICAgICBfU1RMUF9JTVBPUlRfREVDTFNQRUMgICAvKiBPdGhlciBtb2R1bGVzLCBpbXBvcnRpbmcgU1RMcG9ydCBleHBvcnRzICovCi0jICAgIGRlZmluZSAgX1NUTFBfQ0xBU1NfREVDTFNQRUMgIF9TVExQX0NMQVNTX0lNUE9SVF9ERUNMU1BFQwotIyAgZW5kaWYKLQotI2Vsc2UgLyogTm90IHVzaW5nIERMTCBleHBvcnQvaW1wb3J0IHNwZWNpZmljYXRpb25zICovCi0KLSMgIGRlZmluZSBfU1RMUF9ERUNMU1BFQwotIyAgZGVmaW5lIF9TVExQX0NMQVNTX0RFQ0xTUEVDCi0KLSNlbmRpZgotCi0jZGVmaW5lIF9TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBfU1RMUF9FWFBPUlQgdGVtcGxhdGUgY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMKLQotI2lmIGRlZmluZWQgKF9TVExQX01TVkMpIHx8IGRlZmluZWQgKF9fSUNMKQotIyAgZGVmaW5lIF9TVExQX1NUQVRJQ19NRU1CRVJfREVDTFNQRUMKLSNlbHNlCi0jICBkZWZpbmUgX1NUTFBfU1RBVElDX01FTUJFUl9ERUNMU1BFQyBfU1RMUF9ERUNMU1BFQwotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfQ0FMTCkKLSMgIGRlZmluZSBfU1RMUF9DQUxMCi0jZW5kaWYKLQotI2lmbmRlZiBfU1RMUF9VU0VfTk9fSU9TVFJFQU1TCi0KLSMgIGlmIGRlZmluZWQgKF9fREVDQ1hYKSAmJiAhIGRlZmluZWQgKF9fVVNFX1NURF9JT1NUUkVBTSkKLSMgICAgZGVmaW5lIF9fVVNFX1NURF9JT1NUUkVBTQotIyAgZW5kaWYKLQotLyogV2Ugb25seSBuZWVkIHRvIGV4cG9zZSBkZXRhaWxzIG9mIHN0cmVhbXMgaW1wbGVtZW50YXRpb24KLSAgIGlmIHdlIHVzZSBub24tc3RhbmRhcmQgaS9vIG9yIGFyZSBidWlsZGluZyBTVExwb3J0Ki8KLSMgIGlmIGRlZmluZWQgKF9fQlVJTERJTkdfU1RMUE9SVCkgfHwgZGVmaW5lZCAoX1NUTFBfTk9fRk9SQ0VfSU5TVEFOVElBVEUpIHx8ICFkZWZpbmVkKF9TVExQX05PX0NVU1RPTV9JTykKLSMgICAgZGVmaW5lIF9TVExQX0VYUE9TRV9TVFJFQU1fSU1QTEVNRU5UQVRJT04gMQotIyAgZW5kaWYKLQotLyogV2Ugb25seSBuZWVkIHRvIGV4cG9zZSBkZXRhaWxzIG9mIGdsb2JhbCBpbXBsZW1lbnRhdGlvbiBpZiB3ZSBhcmUgYnVpbGRpbmcgU1RMcG9ydAotICAgb3IgaGF2ZSBub3QgaW5zdGFudGlhdGVkIGV2ZXJ5dGhpbmcgaW4gdGhlIGxpYiAqLwotIyAgaWYgZGVmaW5lZCAoX19CVUlMRElOR19TVExQT1JUKSB8fCBkZWZpbmVkIChfU1RMUF9OT19GT1JDRV9JTlNUQU5USUFURSkKLSMgICAgdW5kZWYgIF9TVExQX0VYUE9TRV9HTE9CQUxTX0lNUExFTUVOVEFUSU9OCi0jICAgIGRlZmluZSBfU1RMUF9FWFBPU0VfR0xPQkFMU19JTVBMRU1FTlRBVElPTiAxCi0jICBlbmRpZgotCi0jZWxzZSAvKiBfU1RMUF9VU0VfTk9fSU9TVFJFQU1TICovCi0vKiB3aGVuIHdlIGFyZSBub3QgdXNpbmcgU0dJIGlvc3RyZWFtcywgd2UgbXVzdCBleHBvc2UgZ2xvYmFscywgYnV0IG5vdCBzdHJlYW1zIGltcGxlbWVudGF0aW9uICovCi0jICBkZWZpbmUgX1NUTFBfRVhQT1NFX0dMT0JBTFNfSU1QTEVNRU5UQVRJT04KLSNlbmRpZiAvKiBfU1RMUF9VU0VfTk9fSU9TVFJFQU1TICovCi0KLSNpZmRlZiBfU1RMUF9QQVJUSUFMX1NQRUNfTkVFRFNfVEVNUExBVEVfQVJHUwotIyAgZGVmaW5lIF9TVExQX1BTUEVDMih0MSx0MikgPCB0MSx0MiA+Ci0jICBkZWZpbmUgX1NUTFBfUFNQRUMzKHQxLHQyLHQzKSA8IHQxLHQyLHQzID4KLSNlbHNlCi0jICBkZWZpbmUgX1NUTFBfUFNQRUMyKHQxLHQyKSAgLyogbm90aGluZyAqLwotIyAgZGVmaW5lIF9TVExQX1BTUEVDMyh0MSx0Mix0MykgIC8qIG5vdGhpbmcgKi8KLSNlbmRpZgotCi0vKiBBY3RpdmF0aW9uIG9mIHRoZSBwYXJ0aWFsIHRlbXBsYXRlIHdvcmthcm91bmQ6Ci0gKi8KLSNpZiAhZGVmaW5lZChfU1RMUF9ET05UX1VTRV9QQVJUSUFMX1NQRUNfV1JLRCkgJiZcCi0gICAoIWRlZmluZWQoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikgfHwgIWRlZmluZWQoX1NUTFBfRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSKSkKLSMgIGRlZmluZSBfU1RMUF9VU0VfUEFSVElBTF9TUEVDX1dPUktBUk9VTkQKLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX1VTRV9OT19JT1NUUkVBTVMKLSMgIGRlZmluZSBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFIF9TVExQX1NURAotIyAgZGVmaW5lIF9TVExQX05PX1dJREVfU1RSRUFNUyAgX1NUTFBfTk9fV0NIQVJfVAotI2VuZGlmCi0KLSNpZmRlZiBfU1RMUF9VU0VfU0VQQVJBVEVfUkVMT1BTX05BTUVTUEFDRQotIyAgZGVmaW5lIF9TVExQX1JFTE9QU19PUEVSQVRPUlMoX1RNUEwsIF9UUCkgXAotX1RNUEwgaW5saW5lIGJvb2wgX1NUTFBfQ0FMTCBvcGVyYXRvciE9KGNvbnN0IF9UUCYgX194LCBjb25zdCBfVFAmIF9feSkge3JldHVybiAhKF9feCA9PSBfX3kpO31cCi1fVE1QTCBpbmxpbmUgYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yPihjb25zdCBfVFAmIF9feCwgY29uc3QgX1RQJiBfX3kpICB7cmV0dXJuIF9feSA8IF9feDt9XAotX1RNUEwgaW5saW5lIGJvb2wgX1NUTFBfQ0FMTCBvcGVyYXRvcjw9KGNvbnN0IF9UUCYgX194LCBjb25zdCBfVFAmIF9feSkgeyByZXR1cm4gIShfX3kgPCBfX3gpO31cCi1fVE1QTCBpbmxpbmUgYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yPj0oY29uc3QgX1RQJiBfX3gsIGNvbnN0IF9UUCYgX195KSB7IHJldHVybiAhKF9feCA8IF9feSk7fQotI2Vsc2UKLSMgIGRlZmluZSBfU1RMUF9SRUxPUFNfT1BFUkFUT1JTKF9UTVBMLCBfVFApCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKCBfU1RMUF9VU0VfQUJCUkVWUyApCi0jICBpbmNsdWRlIDxzdGwvX2FiYnJldnMuaD4KLSNlbmRpZgotCi0vKiBBIHJlYWxseSB1c2VmdWwgbWFjcm8gKi8KLSNkZWZpbmUgX1NUTFBfQVJSQVlfU0laRShBKSBzaXplb2YoQSkgLyBzaXplb2YoQVswXSkKLSNkZWZpbmUgX1NUTFBfQVJSQVlfQU5EX1NJWkUoQSkgQSwgc2l6ZW9mKEEpIC8gc2l6ZW9mKEFbMF0pCi0KLS8qIHNvbWUgY2xlYW51cCAqLwotI3VuZGVmIF9TVExQX0RPTlRfVVNFX0JPT0xfVFlQRURFRgotI3VuZGVmIF9TVExQX1lWQUxTX0gKLSN1bmRlZiBfU1RMUF9MT09QX0lOTElORV9QUk9CTEVNUwotI3VuZGVmIF9TVExQX05FRURfRVhQTElDSVQKLSN1bmRlZiBfU1RMUF9ORUVEX1RZUEVOQU1FCi0jdW5kZWYgX1NUTFBfTk9fTkVXX1NUWUxFX0NBU1RTCi0jdW5kZWYgX19BVVRPX0NPTkZJR1VSRUQKLQotI2VuZGlmIC8qIF9TVExQX0ZFQVRVUkVTX0ggKi8KZGlmZiAtLWdpdCBhL3N0bC9jb25maWcvaG9zdC5oIGIvc3RsL2NvbmZpZy9ob3N0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1YjcxYTMuLjAwMDAwMDAKLS0tIGEvc3RsL2NvbmZpZy9ob3N0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNzkgKzAsMCBAQAotLyoKLSAqIFRoaXMgZmlsZSBkZWZpbmVzIHNpdGUgY29uZmlndXJhdGlvbi4KLSAqLwotCi0vKgotICogX1NUTFBfTk9fVEhSRUFEUzogaWYgZGVmaW5lZCwgU1RMcG9ydCBkb24ndCB1c2UgYW55Ci0gKiBtdWx0aXRocmVhZGluZyBzdXBwb3J0LiBTeW5vbnltIGlzIF9OT1RIUkVBRFMKLSAqLwotLyoKLSNkZWZpbmUgX05PVEhSRUFEUwotI2RlZmluZSBfU1RMUF9OT19USFJFQURTCi0qLwotCi0vKiBfUFRIUkVBRFM6IGlmIGRlZmluZWQsIHVzZSBQT1NJWCB0aHJlYWRzIGZvciBtdWx0aXRocmVhZGluZyBzdXBwb3J0LiAqLwotLyoKLSNkZWZpbmUgX1BUSFJFQURTCi0qLwotCi0vKiBjb21wYXRpYmlsaXR5IHNlY3Rpb24KLSAqLwotCi0jaWYgKGRlZmluZWQgKF9TVExQX05PVEhSRUFEUykgfHwgZGVmaW5lZCAoX1NUTFBfTk9fVEhSRUFEUykgfHwgZGVmaW5lZCAoTk9USFJFQURTKSkKLSMgIGlmICFkZWZpbmVkIChfTk9USFJFQURTKQotIyAgICBkZWZpbmUgX05PVEhSRUFEUwotIyAgZW5kaWYKLSMgIGlmICFkZWZpbmVkIChfU1RMUF9OT19USFJFQURTKQotIyAgICBkZWZpbmUgX1NUTFBfTk9fVEhSRUFEUwotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoX1NUTFBfVVNFX0RZTkFNSUNfTElCKSAmJiAhZGVmaW5lZChfU1RMUF9VU0VfU1RBVElDX0xJQikKLS8qCi0gKiBUdXJuIF9TVExQX1VTRV9EWU5BTUlDX0xJQiB0byBlbmZvcmNlIHVzZSBvZiAuZGxsIHZlcnNpb24gb2YgU1RMcG9ydCBsaWJyYXJ5LgotICogTk9URTogcGxlYXNlIGRvIHRoYXQgb25seSBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmchCi0gKiBDaGFuZ2luZyBkZWZhdWx0IHdpbGwgcmVxdWlyZSB5b3UgdG8gY2hhbmdlIG1ha2VmaWxlcyBpbiAiYnVpbGQiIGFjY29yZGluZ2x5Ci0gKiBhbmQgdG8gcmVidWlsZCBTVExQb3J0IGxpYnJhcnkhCi0gKiBPbiBVTklYLCB0aGlzIGhhcyBubyBlZmZlY3QsIHNlZSBidWlsZC9saWIvUkVBRE1FIGZvciBtYWtlIHRhZ3MuCi0gKiBTZWUgU1RMcG9ydCBjb25maWd1cmF0aW9uIGZpbGUgKGJ1aWxkL2xpYi9jb25maWd1cmUuYmF0KSBmb3IgaGVscCBpbiBidWlsZGluZwotICogdGhlIHJlcXVpcmUgbGlicmFyeSB2ZXJzaW9ucy4KLSAqLwotLyoKLSNkZWZpbmUgX1NUTFBfVVNFX0RZTkFNSUNfTElCCi0qLwotCi0vKgotICogVHVybiBfU1RMUF9VU0VfU1RBVElDX0xJQiB0byBlbmZvcmNlIHVzZSBvZiBzdGF0aWMgdmVyc2lvbiBvZiBTVExwb3J0IGxpYnJhcnkuCi0gKiBOT1RFOiBwbGVhc2UgZG8gdGhhdCBvbmx5IGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZyEKLSAqIENoYW5naW5nIGRlZmF1bHQgd2lsbCByZXF1aXJlIHlvdSB0byBjaGFuZ2UgbWFrZWZpbGUgaW4gImJ1aWxkIiBhY2NvcmRpbmdseQotICogYW5kIHRvIHJlYnVpbGQgU1RMUG9ydCBsaWJyYXJ5IQotICogT24gVU5JWCwgdGhpcyBoYXMgbm8gZWZmZWN0LCBzZWUgYnVpbGQvbGliL1JFQURNRSBmb3IgbWFrZSB0YWdzLgotICogU2VlIFNUTHBvcnQgY29uZmlndXJhdGlvbiBmaWxlIChidWlsZC9saWIvY29uZmlndXJlLmJhdCkgZm9yIGhlbHAgaW4gYnVpbGRpbmcKLSAqIHRoZSByZXF1aXJlIGxpYnJhcnkgdmVyc2lvbnMuCi0gKi8KLS8qCi0jZGVmaW5lIF9TVExQX1VTRV9TVEFUSUNfTElCCi0qLwotI2VuZGlmCi0KLS8qCi0gKiBTaWduYWwgU1RMcG9ydCB0aGF0IHdlIGFyZSB1c2luZyB0aGUgY3lnd2luIGRpc3RyaWIgd2l0aCB0aGUgLW1uby1jeWd3aW4gb3B0aW9uLgotICogVGhpcyBpcyBzaW1pbGFyIHRvIGEgbWluZ3cgZW52aXJvbm1lbnQgZXhjZXB0IHRoYXQgcmVsYXRpdmUgcGF0aCB0byBuYXRpdmUgaGVhZGVycwotICogaXMgZGlmZmVyZW50LCB0aGlzIGlzIHdoeSB3ZSBuZWVkIHRoaXMgbWFjcm8uCi0gKi8KLS8qCi0jZGVmaW5lIF9TVExQX05PX0NZR1dJTgotICovCi0KLS8qCi0gKiBFZGl0IHJlbGF0aXZlIHBhdGggYmVsb3cgKG9yIHB1dCBmdWxsIHBhdGgpIHRvIGdldCBuYXRpdmUKLSAqIGNvbXBpbGVyIHZlbmRvcidzIGhlYWRlcnMgaW5jbHVkZWQuIERlZmF1bHQgaXMgIi4uL2luY2x1ZGUiCi0gKiBmb3IgX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSCwgZGVmYXVsdCBmb3Igb3RoZXIgbWFjcm9zIGlzCi0gKiBfU1RMUF9OQVRJVkVfSU5DTFVERV9QQVRILgotICogSGludDogbmV2ZXIgaW5zdGFsbCBTVExwb3J0IGluIHRoZSBkaXJlY3RvcnkgdGhhdCBlbmRzIHdpdGggImluY2x1ZGUiCi0gKi8KLS8qCi0jdW5kZWYgX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSAotI2RlZmluZSBfU1RMUF9OQVRJVkVfSU5DTFVERV9QQVRIIC4uL2luY2x1ZGUKLSovCi0vKiBzYW1lIGZvciBDIGxpYnJhcnkgaGVhZGVycyBsaWtlIDxjc3RyaW5nPiAqLwotLyoKLSN1bmRlZiBfU1RMUF9OQVRJVkVfQ1BQX0NfSU5DTFVERV9QQVRICi0jZGVmaW5lIF9TVExQX05BVElWRV9DUFBfQ19JTkNMVURFX1BBVEggX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSAotKi8KLS8qIHNhbWUgZm9yIEMgaGVhZGVycyBsaWtlIDxzdHJpbmcuaD4gKi8KLS8qCi0jdW5kZWYgX1NUTFBfTkFUSVZFX0NfSU5DTFVERV9QQVRICi0jZGVmaW5lIF9TVExQX05BVElWRV9DX0lOQ0xVREVfUEFUSCBfU1RMUF9OQVRJVkVfSU5DTFVERV9QQVRICi0qLwotLyogU29tZSBjb21waWxlcnMgbG9jYXRlIGJhc2ljIEMrKyBydW50aW1lIHN1cHBvcnQgaGVhZGVycyAoPG5ldz4sIDx0eXBlaW5mbz4sIDxleGNlcHRpb24+KSBpbiBzZXBhcmF0ZSBkaXJlY3RvcnkgKi8KLS8qCi0jdW5kZWYgX1NUTFBfTkFUSVZFX0NQUF9SVU5USU1FX0lOQ0xVREVfUEFUSAotI2RlZmluZSBfU1RMUF9OQVRJVkVfQ1BQX1JVTlRJTUVfSU5DTFVERV9QQVRIIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEgKLSovCi0KLS8qCi0gKiBJZiBuYW1lc3Bhc2VzIGF2YWlsYWJsZSwgU1RMcG9ydCB1c2Ugb3duIG5hbWVzcGFjZSAoYW5kIG1hc3F1ZXJhZGUKLSAqIGl0IGFzIHN0ZCkuIERpc2FibGUgb3duIG5hbWVzcGFjZSBtYXkgY2F1c2UgdW5kZWZpbmVkIGJlaGF2aW91ci4KLSAqLwotLyoKLSNkZWZpbmUgX1NUTFBfTk9fT1dOX05BTUVTUEFDRSAgMQotKi8KLQotLyoKLSAqIFVuY29tbWVudCBfU1RMUF9MRUFLU19QRURBTlRJQyB0byBmb3JjZSBkZWFsbG9jYXRpb24gb2YgQUxMIGFsbG9jYXRlZAotICogbWVtb3J5IGNodW5rcy4gTm9ybWFsbHkgbm90IHJlcXVpcmVkLiBCdXQgaWYgeW91IHdvcnJ5IGFib3V0IHF1YXppLWxlYWtzCi0gKiAobWF5IGJlIHJlcG9ydGVkIGJ5IHNvbWUgbGVha3MgZGV0ZWN0aW9uIHRvb2xzKSwgdXNlCi0gKiBfU1RMUF9MRUFLU19QRURBTlRJQy4gSXQgc2hvdWxkIGJlIHVzZWQgd2l0aCBfU1RMUF9VU0VfTkVXQUxMT0Mgb3IKLSAqIF9TVExQX1VTRV9NQUxMT0MgKHNlZSBiZWxvdyksIHRoZSBkZWZhdWx0IG5vZGVfYWxsb2MgYWxsb2NhdG9yIGFsc28gY2xlYW4KLSAqIGl0cyBpbnRlcm5hbCBtZW1vcnkgcG9vbCBidXQgb25seSBpZiBTVExwb3J0IGlzIHVzZWQgYXMgYSBkeW5hbWljIGxpYnJhcnkKLSAqIHVuZGVyIFdpbjMyICh1c2luZyBNU1ZDIGxpa2UgY29tcGlsZXJzKS4KLSAqLwotLyoKLSNkZWZpbmUgX1NUTFBfTEVBS1NfUEVEQU5USUMgMQotKi8KLQotLyoKLSAqIFVuY29tbWVudCBfU1RMUF9VU0VfTkVXQUxMT0MgdG8gZm9yY2UgYWxsb2NhdG9yPFQ+IHRvIHVzZSBwbGFpbiAibmV3IgotICogaW5zdGVhZCBvZiBTVExwb3J0IG9wdGltaXplZCBub2RlIGFsbG9jYXRvciBlbmdpbmUuCi0gKi8KLS8qCi0jZGVmaW5lIF9TVExQX1VTRV9ORVdBTExPQyAxCi0qLwotCi0vKgotICogVW5jb21tZW50IF9TVExQX1VTRV9NQUxMT0MgdG8gZm9yY2UgYWxsb2NhdG9yPFQ+IHRvIHVzZSBwbGFpbiAibWFsbG9jIgotICogaW5zdGVhZCBvZiBTVExwb3J0IG9wdGltaXplZCBub2RlIGFsbG9jYXRvciBlbmdpbmUuCi0gKi8KLS8qCi0jZGVmaW5lIF9TVExQX1VTRV9NQUxMT0MgMQotKi8KLQotLyoKLSAqIFVuY29tbWVudCBfU1RMUF9VU0VfUEVSVEhSRUFEX0FMTE9DIHRvIGZvcmNlIGFsbG9jYXRvcjxUPiB0byB1c2UKLSAqIGEgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gdGFyZ2V0dGluZyB0aGUgbWFzc2l2ZWx5IG11bHRpLXRocmVhZGVkCi0gKiBlbnZpcm9ubWVudC4gVGhlIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIHRoZSBQT1NJWCBwdGhyZWFkCi0gKiBpbnRlcmZhY2UuCi0gKi8KLS8qCi0jZGVmaW5lIF9TVExQX1VTRV9QRVJUSFJFQURfQUxMT0MgMQotKi8KLQotLyoKLSAqIFNldCBfU1RMUF9ERUJVR19BTExPQyB0byB1c2UgYWxsb2NhdG9ycyB0aGF0IHBlcmZvcm0gbWVtb3J5IGRlYnVnZ2luZywKLSAqIHN1Y2ggYXMgcGFkZGluZy9jaGVja2luZyBmb3IgbWVtb3J5IGNvbnNpc3RlbmN5Ci0gKi8KLS8qCi0jZGVmaW5lIF9TVExQX0RFQlVHX0FMTE9DIDEKLSovCi0KLS8qCi0gKiBGb3IgY29tcGlsZXIgbm90IHN1cHBvcnRpbmcgcGFydGlhbCB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBvciBvcmRlcmluZyBvZgotICogdGVtcGxhdGUgZnVuY3Rpb25zIFNUTHBvcnQgaW1wbGVtZW50IGEgd29ya2Fyb3VuZCBiYXNlZCBvbiBpbmhlcml0YW5jZQotICogZGV0ZWN0aW9uLiBUaGlzIGluaGVyaXRhbmNlIGNhbiBpbnRyb2R1Y2UgdHJvdWJsZSBpbiBjbGllbnQgY29kZSB3aGVuCi0gKiBhIHVzZXIgY2xhc3MgZGVyaXZlZCBhIFNUTCBjb250YWluZXIgKHdoaWNoIGlzIG5vdCBhZHZpc2VkIGFzIFNUTCBjb250YWluZXJzCi0gKiBkbyBub3QgaGF2ZSB2aXJ0dWFsIGRlc3RydWN0b3JzKS4gVG8gZGlzYWJsZSB0aGlzIHdvcmthcm91bmQgdHVybiB0aGlzIG1hY3JvIG9uOgotICovCi0vKgotI2RlZmluZSBfU1RMUF9ET05UX1VTRV9QQVJUSUFMX1NQRUNfV1JLRCAxCi0qLwotCi0vKgotICogVW5jb21tZW50IHRoaXMgdG8gZm9yY2UgYWxsIGRlYnVnIGRpYWdub3N0aWMgdG8gYmUgZGlyZWN0ZWQgdGhyb3VnaCBhCi0gKiB1c2VyLWRlZmluZWQgZ2xvYmFsIGZ1bmN0aW9uOgotICogIHZvaWQgX19zdGxfZGVidWdfbWVzc2FnZShjb25zdCBjaGFyICogZm9ybWF0X3N0ciwgLi4uKQotICogaW5zdGVhZCBvZiBwcmVkZWZpbmVkIFNUTHBvcnQgcm91dGluZS4KLSAqIFRoaXMgYWxsb3dzIHlvdSB0byB0YWtlIGNvbnRyb2wgb2YgZGVidWcgbWVzc2FnZSBvdXRwdXQuCi0gKiBEZWZhdWx0IHJvdXRpbmUgY2FsbHMgZnByaW50ZihzdGRlcnIsLi4uKQotICogTm90ZSA6IElmIHlvdSBzZXQgdGhpcyBtYWNybywgeW91IG11c3Qgc3VwcGx5IF9fc3RsX2RlYnVnX21lc3NhZ2UKLSAqIGZ1bmN0aW9uIGRlZmluaXRpb24gc29tZXdoZXJlLgotICovCi0vKgotI2RlZmluZSBfU1RMUF9ERUJVR19NRVNTQUdFIDEKLSovCi0KLS8qCi0gKiBVbmNvbW1lbnQgdGhpcyB0byBmb3JjZSBhbGwgZmFpbGVkIGFzc2VydGlvbnMgdG8gYmUgZXhlY3V0ZWQgdGhyb3VnaAotICogdXNlci1kZWZpbmVkIGdsb2JhbCBmdW5jdGlvbjoKLSAqICB2b2lkIF9fc3RsX2RlYnVnX3Rlcm1pbmF0ZSh2b2lkKS4gVGhpcyBhbGxvd3MKLSAqIHlvdSB0byB0YWtlIGNvbnRyb2wgb2YgYXNzZXJ0aW9uIGJlaGF2aW91ciBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgotICogRGVmYXVsdCByb3V0aW5lIGNhbGxzIF9TVExQX0FCT1JUKCkuCi0gKiBOb3RlIDogSWYgeW91IHNldCB0aGlzIG1hY3JvLCB5b3UgbXVzdCBzdXBwbHkgX19zdGxfZGVidWdfdGVybWluYXRlCi0gKiBmdW5jdGlvbiBkZWZpbml0aW9uIHNvbWV3aGVyZS4KLSAqLwotLyoKLSNkZWZpbmUgX1NUTFBfREVCVUdfVEVSTUlOQVRFIDEKLSovCi0KLS8qCi0gKiBVbmNvbW1lbnQgdGhhdCB0byBkaXNhYmxlIGV4Y2VwdGlvbiBoYW5kbGluZyBjb2RlCi0gKi8KLS8qCi0jZGVmaW5lIF9TVExQX0RPTlRfVVNFX0VYQ0VQVElPTlMgMQotKi8KLQotLyoKLSAqIF9TVExQX05PX05BTUVTUEFDRVM6IGlmIGRlZmluZWQsIGRvbid0IHB1dCB0aGUgbGlicmFyeSBpbiBuYW1lc3BhY2UKLSAqIHN0bHBvcnQ6OiBvciBzdGQ6OiwgZXZlbiBpZiB0aGUgY29tcGlsZXIgc3VwcG9ydHMgbmFtZXNwYWNlcwotICovCi0vKgotI2RlZmluZSBfU1RMUF9OT19OQU1FU1BBQ0VTIDEKLSovCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29tcGF0aWJpbGl0eSBzZWN0aW9uCi0gKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0vKgotICogVXNlIGFiYnJldmlhdGVkIGNsYXNzIG5hbWVzIGZvciBsaW5rZXIgYmVuZWZpdCAoZG9uJ3QgYWZmZWN0IGludGVyZmFjZSkuCi0gKiBUaGlzIG9wdGlvbiBpcyBvYnNvbGV0ZSwgYnV0IHNob3VsZCB3b3JrIGluIHRoaXMgcmVsZWFzZS4KLSAqCi0gKi8KLS8qCi0jZGVmaW5lIF9TVExQX1VTRV9BQkJSRVZTCi0qLwotCi0vKgotICogVGhpcyBkZWZpbml0aW9uIHByZWNsdWRlcyBTVExwb3J0IHJldmVyc2VfaXRlcmF0b3IgdG8gYmUgY29tcGF0aWJsZSB3aXRoCi0gKiBvdGhlciBwYXJ0cyBvZiBNU1ZDIGxpYnJhcnkuIChXaXRoIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24sIGl0IGp1c3QKLSAqIGhhcyBubyBlZmZlY3QpLgotICogVXNlIGl0IF9PTkxZXyBpZiB5b3UgdXNlIFNHSS1zdHlsZSByZXZlcnNlX2l0ZXJhdG9yPD4gdGVtcGxhdGUgZXhwbGljaXRseQotICovCi0vKgotI2RlZmluZSBfU1RMUF9OT19NU1ZDNTBfQ09NUEFUSUJJTElUWSAxCi0qLwotCi0vKgotICogX1NUTFBfVVNFX1JBV19TR0lfQUxMT0NBVE9SUyBpcyBhIGhvb2sgc28gdGhhdCB1c2VycyBjYW4gZGlzYWJsZSB1c2Ugb2YKLSAqIGFsbG9jYXRvcjxUPiBhcyBkZWZhdWx0IHBhcmFtZXRlciBmb3IgY29udGFpbmVycywgYW5kIHVzZSBTR0kKLSAqIHJhdyBhbGxvY2F0b3JzIGFzIGRlZmF1bHQgb25lcywgd2l0aG91dCBoYXZpbmcgdG8gZWRpdCBsaWJyYXJ5IGhlYWRlcnMuCi0gKiBVc2Ugb2YgdGhpcyBtYWNybyBpcyBzdHJvbmdseSBkaXNjb3VyYWdlZC4KLSAqLwotLyoKLSNkZWZpbmUgX1NUTFBfVVNFX1JBV19TR0lfQUxMT0NBVE9SUyAxCi0qLwotCi0vKgotICogVXNlIG9ic29sZXRlIG92ZXJsb2FkZWQgdGVtcGxhdGUgZnVuY3Rpb25zIGl0ZXJhdG9yX2NhdGVnb3J5KCksIHZhbHVlX3R5cGUoKSwgZGlzdGFuY2VfdHlwZSgpCi0gKiBmb3IgcXVlcnlpbmcgaXRlcmF0b3IgcHJvcGVydGllcy4gUGxlYXNlIG5vdGUgdGhvc2UgbmFtZXMgYXJlIG5vbi1zdGFuZGFyZCBhbmQgYXJlIG5vdCBndWFyYW50ZWVkCi0gKiB0byBiZSB1c2VkIGJ5IGV2ZXJ5IGltcGxlbWVudGF0aW9uLiBIb3dldmVyLCB0aGlzIHNldHRpbmcgaXMgb24gYnkgZGVmYXVsdCB3aGVuIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24KLSAqIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGUgY29tcGlsZXIgYW5kIGNhbm5vdCBiZSBzaW11bGF0ZWQgKG9ubHkgaWYgX1NUTFBfTk9fQU5BQ0hST05JU01TIGlzIG5vdCBzZXQpLgotICogVXNlIG9mIHRob3NlIGludGVyZmFjZXMgZm9yIHVzZXItZGVmaW5lZCBpdGVyYXRvcnMgaXMgc3Ryb25nbHkgZGlzY291cmFnZWQ6Ci0gKiBwbGVhc2UgdXNlIHB1YmxpYyBpbmhlcml0YW5jZSBmcm9tIGl0ZXJhdG9yPD4gdGVtcGxhdGUgdG8gYWNoaWV2ZSBkZXNpcmVkIGVmZmVjdC4KLSAqIFNlY29uZCBmb3JtIGlzIHRvIGRpc2FibGUgb2xkLXN0eWxlIHF1ZXJpZXMgaW4gYW55IGNhc2UuCi0gKi8KLS8qCi0jZGVmaW5lIF9TVExQX1VTRV9PTERfSFBfSVRFUkFUT1JfUVVFUklFUwotI2RlZmluZSBfU1RMUF9OT19PTERfSFBfSVRFUkFUT1JfUVVFUklFUwotKi8KLQotCi0vKgotICogT24gc3lzdGVtcyB3aXRoIHN1cHBvcnQgb2YgbGFyZ2UgZmlsZXMgKF9MQVJHRUZJTEVfU09VUkNFLAotICogX0xBUkdFRklMRTY0X1NPVVJDRSBkZWZpbmVkKSB3ZSB3aWxsIHVzZSA2NC1iaXQgZmlsZSBvZmZzZXQsIGV2ZW4gaWYKLSAqIF9fVVNFX0ZJTEVfT0ZGU0VUNjQgb3IgX0ZJTEVfT0ZGU0VUX0JJVFMgbm90IGRlZmluZWQgb3IgX0ZJTEVfT0ZGU0VUX0JJVFMKLSAqIGxlc3MgdGhhbiA2NC4gSW4gdGhlIGxhc3QgY2FzZSBzaXplb2Yoc3RkOjpzdHJlYW1vZmYpIG1heSBub3QgYmUgZXF1YWwgdG8KLSAqIHNpemVvZihvZmZfdCksIGlmIHlvdSB3YW50IHRvIGZvcmNlIGVxdWFsIHNpemUgb2Ygb2ZmX3QgYW5kIHN0cmVhbW9mZiwKLSAqIHVuY29tbWVudCBtYWNybyBiZWxvdy4gQnV0IHBheSBhdHRlbnRpb24sIHRoaXMgaGFzIGluZmx1ZW5jZSBvbiBsaWJzdGxwb3J0Ci0gKiBhbmQgaW4gZnV0dXJlIHVzYWdlIGl0IG1heSBjYXVzZSBjb25mbGljdCB3aXRoIGRlZmluZWQgX0ZJTEVfT0ZGU0VUX0JJVFMgbWFjcm8uCi0gKi8KLQotLyoKLSNkZWZpbmUgX1NUTFBfVVNFX0RFRkFVTFRfRklMRV9PRkZTRVQKLSovCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0vKiBUaGlzIHNlY3Rpb24gY29udGFpbnMgc3dpdGhlcyB3aGljaCBzaG91bGQgYmUgb2ZmIGJ5IGRlZmF1bHQsCi0gKiBidXQgc28gZmV3IGNvbXBpbGVycyB3b3VsZCBoYXZlIGl0IHVuZGVmaW5lZCwgc28gdGhhdCB3ZSBzZXQgdGhlbSBoZXJlLAotICogd2l0aCB0aGUgb3B0aW9uIHRvIGJlIHR1cm5lZCBvZmYgbGF0ZXIgaW4gY29tcGlsZXItc3BlY2lmaWMgZmlsZQotICovCi0KLSNkZWZpbmUgX1NUTFBfTk9fVU5DQVVHSFRfRVhDRVBUX1NVUFBPUlQKLSNkZWZpbmUgX1NUTFBfTk9fVU5FWFBFQ1RFRF9FWENFUFRfU1VQUE9SVAotCi0vKgotICBMb2NhbCBWYXJpYWJsZXM6Ci0gIG1vZGU6QysrCi0gIEVuZDoKLSovCmRpZmYgLS1naXQgYS9zdGwvY29uZmlnL3N0bF9jb25maXguaCBiL3N0bC9jb25maWcvc3RsX2NvbmZpeC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWJlMWYyLi4wMDAwMDAwCi0tLSBhL3N0bC9jb25maWcvc3RsX2NvbmZpeC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogQm9yaXMgRm9taXRjaGV2Ci0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICovCi0KLS8qCi0gKiBTVExwb3J0IGNvbmZpZ3VyYXRpb24gZmlsZQotICogSXQgaXMgaW50ZXJuYWwgU1RMcG9ydCBoZWFkZXIgLSBETyBOT1QgaW5jbHVkZSBpdCBkaXJlY3RseQotICogUHVycG9zZSBvZiB0aGlzIGZpbGUgOiB0byBkZWZpbmUgU1RMcG9ydCBzZXR0aW5ncyB0aGF0IGRlcGVuZCBvbgotICogY29tcGlsZXIgZmxhZ3Mgb3IgY2FuIGJlIG90aGVyd2lzZSBtaXNzZWQKLSAqCi0gKi8KLQotI2lmbmRlZiBfU1RMUF9DT05GSVhfSAotIyBkZWZpbmUgX1NUTFBfQ09ORklYX0gKLQotLyogSWYsIGJ5IGFueSBjaGFuY2UsIEMgY29tcGlsZXIgZ2V0cyB0aGVyZSwgdHJ5IHRvIGhlbHAgaXQgdG8gcGFzcyBzbW9vdGhseSAqLwotIyBpZiAhIGRlZmluZWQgKF9fY3BsdXNwbHVzKSAmJiAhIGRlZmluZWQgKF9TVExQX0hBU19OT19OQU1FU1BBQ0VTKQotIyAgZGVmaW5lIF9TVExQX0hBU19OT19OQU1FU1BBQ0VTCi0jIGVuZGlmCi0KLSMgaWYgZGVmaW5lZChfX01JTkdXMzJfXykKLSMgICBkZWZpbmUgX1NUTFBfTk9fRFJBTkQ0OAotIyBlbmRpZgotCi0vKiBNb2RlbmEgQysrIGxpYnJhcnkgICovCi0jaWYgZGVmaW5lZCAoX19NV0VSS1NfXykgJiYgX19NV0VSS1NfXyA8PSAweDIzMDMgfHwgKGRlZmluZWQgKF9fS0NDKSAmJiBfX0tDQ19WRVJTSU9OIDwgMzQwMCkKLSMgaW5jbHVkZSA8bWNvbXBpbGUuaD4KLSMgZGVmaW5lIF9TVExQX1VTRV9NU0lQTCAxCi0jIGlmIGRlZmluZWQgKF9fS0NDKSB8fCAoZGVmaW5lZChfX01TTF9DUFBfXykgJiYgXAotICAgICAgICggKF9fTVNMX0NQUF9fID49IDB4NTAwMCAmJiBkZWZpbmVkKCBfTVNMX05PX01FU1NBR0VfRkFDRVQgKSkgfHwgXAotICAgKF9fTVNMX0NQUF9fIDwgMHg1MDAwICYmIGRlZmluZWQoIE1TSVBMX05MX1RZUEVTICkpKSAgXAotICAgKQotIyAgZGVmaW5lIF9TVExQX05PX05BVElWRV9NRVNTQUdFX0ZBQ0VUIDEKLSMgZW5kaWYKLSNlbmRpZgotCi0vKiBjb21tb24gc3dpdGNoZXMgZm9yIEVERyBmcm9udC1lbmQgKi8KLSMgaWYgZGVmaW5lZCAoX19FREdfU1dJVENIRVMpCi0jICAgaWYgIShkZWZpbmVkKF9UWVBFTkFNRSkgfHwgZGVmaW5lZCAoX1RZUEVOQU1FX0lTX0tFWVdPUkQpKQotIyAgICAgdW5kZWYgIF9TVExQX05FRURfVFlQRU5BTUUKLSMgICAgIGRlZmluZSBfU1RMUF9ORUVEX1RZUEVOQU1FIDEKLSMgICBlbmRpZgotIyAgIGlmICFkZWZpbmVkKF9XQ0hBUl9UX0lTX0tFWVdPUkQpCi0jICAgICB1bmRlZiBfU1RMUF9OT19XQ0hBUl9UCi0jICAgICBkZWZpbmUgX1NUTFBfTk9fV0NIQVJfVCAxCi0jICAgZW5kaWYKLSMgICBpZm5kZWYgX1BBUlRJQUxfU1BFQ0lBTElaQVRJT05fT0ZfQ0xBU1NfVEVNUExBVEVTCi0jICAgICB1bmRlZiBfU1RMUF9OT19DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OCi0jICAgICBkZWZpbmUgX1NUTFBfTk9fQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTiAxCi0jICAgZW5kaWYKLSMgICBpZm5kZWYgX01FTUJFUl9URU1QTEFURVMKLSMgICAgIHVuZGVmIF9TVExQX05PX01FTUJFUl9URU1QTEFURVMKLSMgICAgIGRlZmluZSBfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVTIDEKLSMgICAgIHVuZGVmIF9TVExQX05PX01FTUJFUl9URU1QTEFURV9DTEFTU0VTCi0jICAgICBkZWZpbmUgX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFX0NMQVNTRVMgMQotIyAgIGVuZGlmCi0jICAgaWYgIWRlZmluZWQoX01FTUJFUl9URU1QTEFURV9LRVlXT1JEKQotIyAgICAgdW5kZWYgIF9TVExQX05PX01FTUJFUl9URU1QTEFURV9LRVlXT1JECi0jICAgICBkZWZpbmUgX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFX0tFWVdPUkQgMQotIyAgIGVuZGlmCi0jICAgaWYgIWRlZmluZWQgKF9fRVhDRVBUSU9OUykgJiYgISBkZWZpbmVkIChfRVhDRVBUSU9OUykKLSMgICAgIHVuZGVmICBfU1RMUF9IQVNfTk9fRVhDRVBUSU9OUwotIyAgICAgZGVmaW5lIF9TVExQX0hBU19OT19FWENFUFRJT05TCi0jICAgZW5kaWYKLSMgICB1bmRlZiBfX0VER19TV0lUQ0hFUwotIyBlbmRpZiAvKiBFREcgKi8KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3RsL2NvbmZpZy9zdGxfZ2NjZS5oIGIvc3RsL2NvbmZpZy9zdGxfZ2NjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWY3MDQwLi4wMDAwMDAwCi0tLSBhL3N0bC9jb25maWcvc3RsX2djY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSNpZm5kZWYgX1NUTFBfV0lOU0NXX0gKLSNkZWZpbmUgX1NUTFBfV0lOU0NXX0gKLQotI2RlZmluZSBfU1RMUF9DT01QSUxFUiAiR0NDRSIKLQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgIGRlZmluZSBfU1RMUF9MT05HX0xPTkcgbG9uZyBsb25nCi0KLSNpZmRlZiBfU1RMUF9OT19VTkNBVUdIVF9FWENFUFRfU1VQUE9SVAotIyAgdW5kZWYgX1NUTFBfTk9fVU5DQVVHSFRfRVhDRVBUX1NVUFBPUlQKLSNlbmRpZgotCi0jaWZkZWYgX1NUTFBfTk9fVU5FWFBFQ1RFRF9FWENFUFRfU1VQUE9SVAotIyAgdW5kZWYgX1NUTFBfTk9fVU5FWFBFQ1RFRF9FWENFUFRfU1VQUE9SVAotI2VuZGlmCi0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3N0bC9jb25maWcvc3RsX215Y29tcC5oIGIvc3RsL2NvbmZpZy9zdGxfbXljb21wLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxMGQ1ZmEuLjAwMDAwMDAKLS0tIGEvc3RsL2NvbmZpZy9zdGxfbXljb21wLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5NwotICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogQm9yaXMgRm9taXRjaGV2Ci0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICovCi0KLS8qCi0gKiBQdXJwb3NlIG9mIHRoaXMgZmlsZSA6Ci0gKgotICogQSBsaXN0IG9mIENPTVBJTEVSLVNQRUNJRklDIHBvcnRpb24gb2YgU1RMcG9ydCBzZXR0aW5ncy4KLSAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB0byBoZWxwIGluIG1hbnVhbCBjb25maWd1cmF0aW9uCi0gKiBvZiBTVExwb3J0LiBUaGlzIGZpbGUgaXMgYmVpbmcgaW5jbHVkZWQgYnkgc3RsY29tcC5oCi0gKiB3aGVuIFNUTHBvcnQgaXMgdW5hYmxlIHRvIGlkZW50aWZ5IHlvdXIgY29tcGlsZXIuCi0gKiBQbGVhc2UgcmVtb3ZlIHRoZSBlcnJvciBkaWFnbm9zdGljIGJlbG93IGJlZm9yZSBhZGp1c3RpbmcKLSAqIG1hY3Jvcy4KLSAqCi0gKi8KLSNpZm5kZWYgX1NUTFBfTVlDT01QX0gKLSNkZWZpbmUgIF9TVExQX01ZQ09NUF9ICi0KLSNlcnJvciAiWW91ciBjb21waWxlciB2ZXJzaW9uIGlzIG5vdCByZWNvZ25pemVkIGJ5IFNUTHBvcnQuIFBsZWFzZSBlZGl0IDxzdGxwb3J0L3N0bC9jb25maWcvc3RsX215Y29tcC5oPiIKLQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLS8vIHRoZSB2YWx1ZXMgY2hvb3NlbiBoZXJlIGFzIGRlZmF1bHRzIHRyeSB0byBnaXZlCi0vLyBtYXhpbXVtIGZ1bmN0aW9uYWxpdHkgb24gdGhlIG1vc3QgY29uc2VydmF0aXZlIHNldHRpbmdzCi0KLS8vIE1vc3RseSBjb3JyZWN0IGd1ZXNzLCBjaGFuZ2UgaXQgZm9yIEFscGhhIChhbmQgb3RoZXIgZW52aXJvbm1lbnRzCi0vLyB0aGF0IGhhcyA2NC1iaXQgImxvbmciKQotLy8gIyAgZGVmaW5lIF9TVExQX1VJTlQzMl9UIHVuc2lnbmVkIGxvbmcKLQotLy8gRGlzYWJsZXMgd2NoYXJfdCBmdW5jdGlvbmFsaXR5Ci0vLyAjICBkZWZpbmUgX1NUTFBfTk9fV0NIQVJfVCAgMQotCi0vLyBEZWZpbmUgaWYgd2NoYXJfdCBpcyBub3QgYSB1bmlxdWUgdHlwZSwgYW5kIGlzIGFjdHVhbGx5IGEgdHlwZWRlZiB0byB1bnNpZ25lZCBzaG9ydC4KLS8vICMgIGRlZmluZSBfU1RMUF9XQ0hBUl9UX0lTX1VTSE9SVCAxCi0KLS8vIFVuY29tbWVudCBpZiBsb25nIGxvbmcgaXMgYXZhaWxhYmxlCi0vLyAjICBkZWZpbmUgX1NUTFBfTE9OR19MT05HIGxvbmcgbG9uZwotCi0vLyBVbmNvbW1lbnQgaWYgbG9uZyBkb3VibGUgaXMgbm90IGF2YWlsYWJsZQotLy8gIyAgZGVmaW5lIF9TVExQX05PX0xPTkdfRE9VQkxFIDEKLQotLy8gVW5jb21tZW50IHRoaXMgaWYgeW91ciBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0ICJ0eXBlbmFtZSIga2V5d29yZAotLy8gIyAgZGVmaW5lIF9TVExQX05FRURfVFlQRU5BTUUgMQotCi0vLyBVbmNvbW1lbnQgdGhpcyBpZiB5b3VyIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgIm11dGFibGUiIGtleXdvcmQKLS8vICMgIGRlZmluZSBfU1RMUF9ORUVEX01VVEFCTEUgMQotCi0vLyBVbmNvbW1lbnQgdGhpcyBpZiB5b3VyIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgImV4cGxpY2l0IiBrZXl3b3JkCi0vLyAjICBkZWZpbmUgX1NUTFBfTkVFRF9FWFBMSUNJVCAxCi0KLS8vIFVuY29tbWVudCBpZiBuZXctc3R5bGUtY2FzdHMgbGlrZSBjb25zdF9jYXN0PD4gYXJlIG5vdCBhdmFpbGFibGUKLS8vICMgIGRlZmluZSBfU1RMUF9OT19ORVdfU1RZTEVfQ0FTVFMgMQotCi0vLyBVbmNvbW1lbnQgdGhpcyBpZiB5b3VyIGNvbXBpbGVyIGRvZXMgbm90IGhhdmUgImJvb2wiIHR5cGUKLS8vICMgIGRlZmluZSAgX1NUTFBfTk9fQk9PTCAxCi0KLS8vIFVuY29tbWVudCB0aGlzIGlmIHlvdXIgY29tcGlsZXIgZG9lcyBub3QgaGF2ZSAiYm9vbCIgdHlwZSwgYnV0IGhhcyAiYm9vbCIga2V5d29yZCByZXNlcnZlZAotLy8gIyAgZGVmaW5lICBfU1RMUF9ET05UX1VTRV9CT09MX1RZUEVERUYgMQotCi0vLyBVbmNvbW1lbnQgdGhpcyBpZiB5b3VyIGNvbXBpbGVyIGRvZXMgbm90IGhhdmUgImJvb2wiIHR5cGUsIGJ1dCBkZWZpbmVzICJib29sIiBpbiA8eXZhbHMuaD4KLS8vICMgIGRlZmluZSAgX1NUTFBfWVZBTFNfSCAxCi0KLS8vIFVuY29tbWVudCB0aGlzIGlmIHlvdXIgY29tcGlsZXIgaGFzIGxpbWl0ZWQgb3Igbm8gZGVmYXVsdCB0ZW1wbGF0ZSBhcmd1bWVudHMgZm9yIGNsYXNzZXMKLS8vICMgIGRlZmluZSBfU1RMUF9MSU1JVEVEX0RFRkFVTFRfVEVNUExBVEVTIDEKLQotLy8gVW5jb21tZW50IHRoaXMgaWYgeW91ciBjb21waWxlciBzdXBwb3J0IG9ubHkgY29tcGxldGUgKG5vdCBkZXBlbmRlbnQgb24gb3RoZXIgcGFyYW1ldGVycykKLS8vIHR5cGVzIGFzIGRlZmF1bHQgcGFyYW1ldGVycyBmb3IgY2xhc3MgdGVtcGxhdGVzCi0vLyAjICBkZWZpbmUgX1NUTFBfREVGQVVMVF9UWVBFX1BBUkFNIDEKLQotLy8gVW5jb21tZW50IHRoaXMgaWYgeW91ciBjb21waWxlciBkbyBub3Qgc3VwcG9ydCBkZWZhdWx0IHBhcmFtZXRlcnMgaW4gdGVtcGxhdGUgY2xhc3MgbWV0aG9kcwotLy8gIyAgZGVmaW5lIF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0gMQotCi0vLyBVbmNvbW1lbnQgdGhpcyBpZiB5b3VyIGNvbXBpbGVyIGhhcyBwcm9ibGVtIHdpdGggbm90LXR5cGUKLS8vIGRlZmF1bHQgdGVtcGxhdGUgcGFyYW1ldGVycwotLy8gIyAgZGVmaW5lIF9TVExQX05PX0RFRkFVTFRfTk9OX1RZUEVfUEFSQU0gMQotCi0vLyBEZWZpbmUgaWYgY29tcGlsZXIgaGFzCi0vLyB0cm91YmxlIHdpdGggZnVuY3Rpb25zIGdldHRpbmcgbm9uLXR5cGUtcGFyYW1ldGVyaXplZCBjbGFzc2VzIGFzIHBhcmFtZXRlcnMKLS8vICMgIGRlZmluZSBfU1RMUF9OT05fVFlQRV9UTVBMX1BBUkFNX0JVRyAxCi0KLS8vIFVuY29tbWVudCB0aGlzIGlmIHlvdXIgY29tcGlsZXIgbGFja3Mgc3RhdGljIGRhdGEgbWVtYmVycy4KLS8vIFVuY29tbWVudCBuZXh0IGxpbmUgaWYgeW91ciBjb21waWxlciBzdXBwb3J0cyBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkKLS8vICMgIGRlZmluZSBfU1RMUF9OT19TVEFUSUNfVEVNUExBVEVfREFUQSAxCi0vLyAjICBkZWZpbmUgX1NUTFBfV0VBS19BVFRSSUJVVEUgMQotCi0vLyBVbmNvbW1lbnQgdGhpcyBpZiB5b3VyIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgbmFtZXNwYWNlcwotLy8gIyAgZGVmaW5lIF9TVExQX0hBU19OT19OQU1FU1BBQ0VTIDEKLQotLy8gVW5jb21tZW50IGlmICJ1c2luZyIga2V5d29yZCBkb2VzIG5vdCB3b3JrIHdpdGggdGVtcGxhdGUgdHlwZXMKLS8vICMgZGVmaW5lIF9TVExQX0JST0tFTl9VU0lOR19ESVJFQ1RJVkUgMQotCi0vLyBVbmNvbW1lbnQgdGhpcyBpZiB5b3VyIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgZXhjZXB0aW9ucwotLy8gIyAgZGVmaW5lIF9TVExQX0hBU19OT19FWENFUFRJT05TIDEKLQotLy8gVW5jb21tZW50IHRoaXMgd2hlbiB5b3UgYXJlIGFibGUgdG8gZGV0ZWN0IHRoYXQgdGhlIHVzZXIgZG8gbm90Ci0vLyB3YW50IHRvIHVzZSB0aGUgZXhjZXB0aW9ucyBmZWF0dXJlLgotLy8gIyAgZGVmaW5lIF9TVExQX0RPTlRfVVNFX0VYQ0VQVElPTlMgMQotCi0vLyBVbmNvbW1lbnQgdGhpcyBpZiB5b3VyIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgZXhjZXB0aW9uIHNwZWNpZmljYXRpb25zCi0vLyAjICBkZWZpbmUgX1NUTFBfTk9fRVhDRVBUSU9OX1NQRUMKLQotLy8gRGVmaW5lIHRoaXMgaWYgeW91ciBjb21waWxlciByZXF1aXJlcyByZXR1cm4gc3RhdGVtZW50IGFmdGVyIHRocm93KCkKLS8vICMgZGVmaW5lIF9TVExQX1RIUk9XX1JFVFVSTl9CVUcgMQotCi0vLyBEZWZpbmUgdGhpcyBpZiB5b3VyIGNvbXBpbGVyIGRvIG5vdCBzdXBwb3J0IHJldHVybiBvZiB2b2lkCi0vLyAjIGRlZmluZSBfU1RMUF9ET05UX1JFVFVSTl9WT0lEIDEKLQotLy8gSGVhZGVyIDxuZXc+IHRoYXQgY29tZXMgd2l0aCB0aGUgY29tcGlsZXIKLS8vIGRvZXMgbm90IGRlZmluZSBiYWRfYWxsb2MgZXhjZXB0aW9uCi0vLyAjICBkZWZpbmUgX1NUTFBfTk9fQkFEX0FMTE9DICAxCi0KLS8vIERlZmluZSB0aGlzIGlmIHlvdXIgY29tcGlsZXIgZG8gbm90IHRocm93IGJhZF9hbGxvYyBmcm9tIHRoZSBuZXcgb3BlcmF0b3IKLS8vICMgIGRlZmluZSBfU1RMUF9ORVdfRE9OVF9USFJPV19CQURfQUxMT0MgIDEKLQotLy8gVW5jb21tZW50IGlmIG1lbWJlciB0ZW1wbGF0ZSBtZXRob2RzIGFyZSBub3QgYXZhaWxhYmxlCi0vLyAjICBkZWZpbmUgX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFUyAgIDEKLQotLy8gVW5jb21tZW50IGlmIG1lbWJlciB0ZW1wbGF0ZSBjbGFzc2VzIGFyZSBub3QgYXZhaWxhYmxlCi0vLyAjICBkZWZpbmUgX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFX0NMQVNTRVMgICAxCi0KLS8vIFVuY29tbWVudCBpZiB5b3VyIGNvbXBpbGVyIGRvIG5vdCBzdXBwb3J0IHRoZSBzdGQ6OmFsbG9jYXRvciByZWJpbmQgdGVjaG5pcXVlCi0vLyBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlIG9mIGJhZCBtZW1iZXIgdGVtcGxhdGUgY2xhc3NlcyBzdXBwb3J0LCBpdCBpcyBhdXRvbWF0aWNhbGx5Ci0vLyBkZWZpbmVkIGlmIF9TVExQX05PX01FTUJFUl9URU1QTEFURV9DTEFTU0VTIGlzIGRlZmluZWQuCi0vLyAjIGRlZmluZSBfU1RMUF9ET05UX1NVUFBPUlRfUkVCSU5EX01FTUJFUl9URU1QTEFURSAxCi0KLS8vIFVuY29tbWVudCBpZiBubyAidGVtcGxhdGUiIGtleXdvcmQgc2hvdWxkIGJlIHVzZWQgd2l0aCBtZW1iZXIgdGVtcGxhdGUgY2xhc3NlcwotLy8gIyAgZGVmaW5lIF9TVExQX05PX01FTUJFUl9URU1QTEFURV9LRVlXT1JEICAgMQotCi0vLyBVbmNvbW1lbnQgaWYgZnJpZW5kIG1lbWJlciB0ZW1wbGF0ZXMgYXJlIG5vdCBhdmFpbGFibGUKLS8vICMgIGRlZmluZSBfU1RMUF9OT19GUklFTkRfVEVNUExBVEVTICAgMQotCi0vLyBDb21waWxlciBkb2VzIG5vdCBhY2NlcHQgZnJpZW5kIGRlY2xhcmF0aW9uIHF1YWxpZmllZCB3aXRoIG5hbWVzcGFjZSBuYW1lLgotLy8gIyAgZGVmaW5lIF9TVExQX05PX1FVQUxJRklFRF9GUklFTkRTIDEKLQotLy8gVW5jb21tZW50IGlmIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gaXMgbm90IGF2YWlsYWJsZQotLy8gIyAgZGVmaW5lIF9TVExQX05PX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04gMQotCi0vLyBEZWZpbmUgaWYgY2xhc3MgYmVpbmcgcGFydGlhbGx5IHNwZWNpYWxpemVkIHJlcXVpcmUgZnVsbCBuYW1lICh0ZW1wbGF0ZSBwYXJhbWV0ZXJzKQotLy8gb2YgaXRzZWxmIGZvciBtZXRob2QgZGVjbGFyYXRpb25zCi0vLyAjICBkZWZpbmUgX1NUTFBfUEFSVElBTF9TUEVDX05FRURTX1RFTVBMQVRFX0FSR1MKLQotLy8gQ29tcGlsZXIgaGFzIHByb2JsZW0gd2l0aCBxdWFsaWZpZWQgc3BlY2lhbGl6YXRpb25zIChjb250IGludCwgdm9sYXRpbGUgaW50Li4uKQotLy8gIyAgZGVmaW5lIF9TVExQX1FVQUxJRklFRF9TUEVDSUFMSVpBVElPTl9CVUcKLQotLy8gQ29tcGlsZXIgaGFzIHByb2JsZW1zIHNwZWNpYWxpemluZyBtZW1iZXJzIG9mIHBhcnRpYWxseQotLy8gc3BlY2lhbGl6ZWQgY2xhc3MKLS8vICMgIGRlZmluZSBfU1RMUF9NRU1CRVJfU1BFQ0lBTElaQVRJT05fQlVHCi0KLS8vIFVuY29tbWVudCBpZiBwYXJ0aWFsIG9yZGVyIG9mIHRlbXBsYXRlIGZ1bmN0aW9ucyBpcyBub3QgYXZhaWxhYmxlCi0vLyAjICBkZWZpbmUgX1NUTFBfTk9fRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSIDEKLQotLy8gVW5jb21tZW50IGlmIHNwZWNpYWxpemF0aW9uIG9mIG1ldGhvZHMgaXMgbm90IGFsbG93ZWQKLS8vICMgIGRlZmluZSBfU1RMUF9OT19NRVRIT0RfU1BFQ0lBTElaQVRJT04gIDEKLQotLy8gVW5jb21tZW50IGlmIGZ1bGwgIHNwZWNpYWxpemF0aW9uIGRvZXMgbm90IHVzZSBwYXJ0aWFsIHNwZWMuIHN5bnRheCA6IHRlbXBsYXRlIDw+IHN0cnVjdCAuLi4uCi0vLyAjICBkZWZpbmUgX1NUTFBfTk9fUEFSVElBTF9TUEVDSUFMSVpBVElPTl9TWU5UQVggIDEKLQotLy8gVW5jb21tZW50IGlmIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgZXhwbGljaXQgdGVtcGxhdGUgYXJndW1lbnRzIGZvciBmdW5jdGlvbnMKLS8vICMgZGVmaW5lIF9TVExQX05PX0VYUExJQ0lUX0ZVTkNUSU9OX1RNUExfQVJHUwotCi0vLyBVbmNvbW1lbnQgdGhpcyBpZiB5b3VyIGNvbXBpbGVyIGNhbid0IGlubGluZSB3aGlsZSgpLCBmb3IoKQotLy8gIyAgZGVmaW5lIF9TVExQX0xPT1BfSU5MSU5FX1BST0JMRU1TIDEKLQotLy8gRGVmaW5lIGlmIHRoZSBjb21waWxlciBmYWlscyB0byBtYXRjaCBhIHRlbXBsYXRlIGZ1bmN0aW9uIGFyZ3VtZW50IG9mIGJhc2UKLS8vICMgIGRlZmluZSBfU1RMUF9CQVNFX01BVENIX0JVRyAgICAgICAgICAxCi0KLS8vIERlZmluZSBpZiB0aGUgY29tcGlsZXIgZmFpbHMgdG8gbWF0Y2ggYSB0ZW1wbGF0ZSBmdW5jdGlvbiBhcmd1bWVudCBvZiBiYXNlCi0vLyAobm9uLXRlbXBsYXRlKQotLy8jICBkZWZpbmUgIF9TVExQX05PTlRFTVBMX0JBU0VfTUFUQ0hfQlVHIDEKLQotLy8gRGVmaW5lIGlmIHRoZSBjb21waWxlciByZWplY3RzIG91dGxpbmUgbWV0aG9kIGRlZmluaXRpb24KLS8vIGV4cGxpY2l0bHkgdGFraW5nIG5lc3RlZCB0eXBlcy90eXBlZGVmcwotLy8gIyAgZGVmaW5lIF9TVExQX05FU1RFRF9UWVBFX1BBUkFNX0JVRyAgIDEKLQotLy8gQ29tcGlsZXIgcmVxdWlyZXMgdHlwZW5hbWUga2V5d29yZCBvbiBvdXRsaW5lIG1ldGhvZCBkZWZpbml0aW9uCi0vLyBleHBsaWNpdGx5IHRha2luZyBuZXN0ZWQgdHlwZXMvdHlwZWRlZnMKLS8vICNkZWZpbmUgIF9TVExQX1RZUEVOQU1FX09OX1JFVFVSTl9UWVBFCi0KLS8vIERlZmluZSBpZiB0aGUgYmFzZWNsYXNzIHR5cGVkZWZzIG5vdCB2aXNpYmxlIGZyb20gb3V0c2lkZQotLy8gIyAgZGVmaW5lIF9TVExQX0JBU0VfVFlQRURFRl9PVVRTSURFX0JVRyAxCi0KLS8vIGlmIHlvdXIgY29tcGlsZXIgaGF2ZSBzZXJpb3VzIHByb2JsZW1zIHdpdGggdHlwZWRlZnMsIHRyeSB0aGlzIG9uZQotLy8gIyAgZGVmaW5lIF9TVExQX0JBU0VfVFlQRURFRl9CVUcgICAgICAgICAgMQotCi0vLyBVbmNvbW1lbnQgaWYgZ2V0dGluZyBlcnJvcnMgY29tcGlsaW5nIG1lbV9mdW4qIGFkYXB0b3JzCi0vLyAjICBkZWZpbmUgX1NUTFBfTUVNQkVSX1BPSU5URVJfUEFSQU1fQlVHIDEKLQotLy8gKiBfU1RMUF9TVEFUSUNfQ09OU1RfSU5JVF9CVUc6IGRlZmluZWQgaWYgdGhlIGNvbXBpbGVyIGNhbid0IGhhbmRsZSBhCi0vLyAgIGNvbnN0YW50LWluaXRpYWxpemVyIGluIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHN0YXRpYyBjb25zdCBkYXRhIG1lbWJlcgotLy8gICBvZiBpbnRlZ2VyIHR5cGUuICAoU2VlIHNlY3Rpb24gOS40LjIsIHBhcmFncmFwaCA0LCBvZiB0aGUgQysrIHN0YW5kYXJkLikKLS8vICMgZGVmaW5lIF9TVExQX1NUQVRJQ19DT05TVF9JTklUX0JVRwotCi0vLyBEZWZpbmUgaWYgZGVmYXVsdCBjb25zdHJ1Y3RvciBmb3IgYnVpbHRpbiBpbnRlZ2VyIHR5cGUgZmFpbHMgdG8gaW5pdGlhbGl6ZSBpdCB0byAwCi0vLyBJbiBleHByZXNzaW9uIGxpa2UgbmV3KCZjaGFyKSBjaGFyKCk6Ci0vLyMgZGVmaW5lIF9TVExQX0RFRl9DT05TVF9QTENUX05FV19CVUcgMQotLy8gSW4gZGVmYXVsdCBmdW5jdGlvbiBwYXJhbWV0ZXIgbGlrZSBfTV9tZXRob2QoX1RwIF9feCA9IF9UcCgpKQotLy8jIGRlZmluZSBfU1RMUF9ERUZfQ09OU1RfREVGX1BBUkFNX0JVRyAxCi0KLS8vIERlZmluZWQgaWYgY29uc3RydWN0b3IKLS8vIHJlcXVpcmVkIHRvIGV4cGxpY2l0bHkgY2FsbCBtZW1iZXIncyBkZWZhdWx0IGNvbnN0cnVjdG9ycyBmb3IgY29uc3Qgb2JqZWN0cwotLy8gIyAgZGVmaW5lIF9TVExQX0NPTlNUX0NPTlNUUlVDVE9SX0JVRyAgICAxCi0KLS8vIERlZmluZWQgaWYgdGhlIGNvbXBpbGVyIGhhcyB0cm91YmxlIGNhbGxpbmcgUE9ELXR5cGVzIGNvbnN0cnVjdG9ycy9kZXN0cnVjdG9ycwotLy8gIyAgZGVmaW5lIF9TVExQX1RSSVZJQUxfQ09OU1RSVUNUT1JfQlVHICAgIDEKLS8vICMgIGRlZmluZSBfU1RMUF9UUklWSUFMX0RFU1RSVUNUT1JfQlVHICAgIDEKLQotLy8gRGVmaW5lIGlmIGhhdmluZyBwcm9ibGVtcyBzcGVjaWFsaXppbmcgbWFwcy9zZXRzIHdpdGgKLS8vIGtleSB0eXBlIGJlaW5nIGNvbnN0Ci0vLyAjICBkZWZpbmUgX1NUTFBfTVVMVElfQ09OU1RfVEVNUExBVEVfQVJHX0JVRwotCi0vLyBVbmNvbW1lbnQgdGhpcyB0byBkaXNhYmxlIC0+IG9wZXJhdG9ycyBvbiBhbGwgaXRlcmF0b3JzCi0vLyAjICBkZWZpbmUgICBfU1RMUF9OT19BUlJPV19PUEVSQVRPUiAxCi0KLS8vIFVuY29tbWVudCB0aGlzIHRvIGRpc2JsZSBhdCgpIG1lbWJlciBmdW5jdGlvbnMgZm9yIGNvbnRhaW5lcnMKLS8vICMgIGRlZmluZSAgIF9TVExQX05PX0FUX01FTUJFUl9GVU5DVElPTiAxCi0KLS8vIERlZmluZSB0aGlzIGlmIGNvbXBpbGVyIGxhY2tzIDxleGNlcHRpb24+IGhlYWRlcgotLy8gIyAgZGVmaW5lIF9TVExQX05PX0VYQ0VQVElPTl9IRUFERVIgMQotCi0vLyBVbmNvbW1lbnQgdGhpcyBpZiB5b3VyIEMgbGlicmFyeSBoYXMgbHJhbmQ0OCgpIGZ1bmN0aW9uCi0vLyAjICBkZWZpbmUgX1NUTFBfUkFORDQ4IDEKLQotLy8gVW5jb21tZW50IGlmIG5hdGl2ZSBuZXctc3R5bGUgQyBsaWJyYXJ5IGhlYWRlcnMgbGlsZSA8Y3N0ZGRlZj4sIGV0YyBhcmUgbm90IGF2YWlsYWJsZS4KLS8vICMgICBkZWZpbmUgX1NUTFBfSEFTX05PX05FV19DX0hFQURFUlMgMQotCi0vLyB1bmNvbW1lbnQgaWYgbmV3LXN0eWxlIGhlYWRlcnMgPG5ldz4gaXMgYXZhaWxhYmxlCi0vLyAjICBkZWZpbmUgX1NUTFBfSEFTX05FV19ORVdfSEVBREVSIDEKLQotLy8gdW5jb21tZW50IHRoaXMgaWYgPGlvc3RyZWFtPiBhbmQgb3RoZXIgU1REIGhlYWRlcnMgcHV0IHRoZWlyIHN0dWZmIGluIDo6bmFtZXNwYWNlLAotLy8gbm90IHN0ZDo6Ci0vLyAjICBkZWZpbmUgX1NUTFBfVkVORE9SX0dMT0JBTF9TVEQKLQotLy8gdW5jb21tZW50IHRoaXMgaWYgPGNzdGRpbz4gYW5kIHRoZSBsaWtlIHB1dCBzdHVmZiBpbiA6Om5hbWVzcGFjZSwKLS8vIG5vdCBzdGQ6OgotLy8gIyAgZGVmaW5lIF9TVExQX1ZFTkRPUl9HTE9CQUxfQ1NURAotCi0vLyB1bmNvbW1lbnQgdGhpcyBpZiB5b3VyIGNvbXBpbGVyIGNvbnNpZGVyIGFzIGFtYmlndW91cyBhIGZ1bmN0aW9uIGltcG9ydGVkIHdpdGhpbgotLy8gdGhlIHN0bHBvcnQgbmFtZXNwYWNlIGFuZCBjYWxsZWQgd2l0aG91dCBzY29wZSAoOjogb3Igc3RkOjopCi0vLyAjICBkZWZpbmUgX1NUTFBfTk9fVVNJTkdfRk9SX0dMT0JBTF9GVU5DVElPTlMgMQotCi0vLyB1bmNvbW1lbnQgdGhpcyBpZiB5b3VyIGNvbXBpbGVyIGRlZmluZSBhbGwgdGhlIEMgbWF0aCBmdW5jdGlvbnMgQysrIGFkZGl0aW9uYWwKLS8vIG92ZXJsb2FkcyBpbiA6Om5hbWVzcGFjZSBhbmQgbm90IG9ubHkgaW4gc3RkOjouCi0vLyAjICBkZWZpbmUgX1NUTFBfSEFTX0dMT0JBTF9DX01BVEhfRlVOQ1RJT05TIDEKLQotLy8gdW5jb21tZW50IHRoaXMgaWYgeW91ciBjb21waWxlciBoYXMgcHJvYmxlbSB3aXRoIHRoZSBpbXBvcnQgb2YgYSBuYW1lc3BhY2UgaW4KLS8vIGFuIG90aGVyIG9uZSB3aXRoIHRoZSB1c2luZyBuYW1lc3BhY2UgZGlyZWN0aXZlCi0vLyAjICBkZWZpbmUgX1NUTFBfVVNJTkdfTkFNRVNQQUNFX0JVRyAxCi0KLS8vIEVkaXQgcmVsYXRpdmUgcGF0aCBiZWxvdyAob3IgcHV0IGZ1bGwgcGF0aCkgdG8gZ2V0IG5hdGl2ZQotLy8gY29tcGlsZXIgaGVhZGVycyBpbmNsdWRlZC4gRGVmYXVsdCBpcyAiLi4vaW5jbHVkZSIuCi0vLyBDIGhlYWRlcnMgbWF5IHJlc2lkZSBpbiBkaWZmZXJlbnQgZGlyZWN0b3J5LCBzbyBzZXBhcmF0ZSBtYWNybyBpcyBwcm92aWRlZC4KLS8vIEhpbnQgOiBuZXZlciBpbnN0YWxsIFNUTHBvcnQgaW4gdGhlIGRpcmVjdG9yeSB0aGF0IGVuZHMgd2l0aCAiaW5jbHVkZSIKLS8vICMgZGVmaW5lIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEggLi4vaW5jbHVkZQotLy8gIyBkZWZpbmUgX1NUTFBfTkFUSVZFX0NfSU5DTFVERV9QQVRIIC4uL2luY2x1ZGUKLS8vICMgZGVmaW5lIF9TVExQX05BVElWRV9DUFBfQ19JTkNMVURFX1BBVEggLi4vaW5jbHVkZQotCi0vLyBUaGlzIG1hY3JvIGNvbnN0cnVjdHMgaGVhZGVyIHBhdGggZnJvbSBkaXJlY3RvcnkgYW5kIG5hbWUuCi0vLyBZb3UgbWF5IGNoYW5nZSBpdCBpZiB5b3VyIGNvbXBpbGVyIGRvZXMgbm90IHVuZGVyc3RhbmQgIi8iLgotLy8gIyAgZGVmaW5lIF9TVExQX01BS0VfSEVBREVSKHBhdGgsIGhlYWRlcikgPHBhdGgvaGVhZGVyPgotCi0vLyBUaGlzIG1hY3JvIGNvbnN0cnVjdHMgbmF0aXZlIGluY2x1ZGUgaGVhZGVyIHBhdGggZnJvbSBpbmNsdWRlIHBhdGggYW5kIG5hbWUuCi0vLyBZb3UgbWF5IGhhdmUgZG8gZGVmaW5lIGl0IGlmIGV4cGVyaW1lbnRpbmcgcHJvYmxlbXMgd2l0aCBwcmVwcm9jZXNzb3IKLS8vICMgZGVmaW5lIF9TVExQX05BVElWRV9IRUFERVIoaGVhZGVyKSBfU1RMUF9NQUtFX0hFQURFUihfU1RMUF9OQVRJVkVfSU5DTFVERV9QQVRILGhlYWRlcikKLQotLy8gU2FtZSBmb3IgQyBoZWFkZXJzCi0vLyAjZGVmaW5lIF9TVExQX05BVElWRV9DX0hFQURFUihoZWFkZXIpCi0KLS8vIHVuY29tbWVudCB0aGlzIGlmIHlvdXIgY29tcGlsZXIvcGxhdGZvcm0gZG8gbm90IGZ1bGx5IHN1cHBvcnQgdGhlIElFQyA1NTkgZmxvYXRpbmcgcG9pbnQKLS8vIG51bWJlcnMgc3BlY2lmaWNhdGlvbiAoYWxzbyBrbm93biBhcyBJRUVFIDc1NCBpbiB0aGUgVVMpLiBUaGlzIHNwZWNpZmljYXRpb24gZGVmaW5lIHRoZQotLy8gaW5maW5pdHkgYW5kIE5hTiAoTm90IGEgTnVtYmVyKSByZXByZXNlbnRhdGlvbi4gVW5pdCB0ZXN0cyBzaG91bGQgdGVsbCB5b3UgaWYgeW91ciBjb21waWxlcgotLy8gc3VwcG9ydCBpdC4KLS8vICMgIGRlZmluZSBfU1RMUF9OT19JRUM1NTlfU1VQUE9SVCAxCi0KLQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL3N0bC9jb25maWcvc3RsX3N5bWJpYW4uaCBiL3N0bC9jb25maWcvc3RsX3N5bWJpYW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZlZTNjNC4uMDAwMDAwMAotLS0gYS9zdGwvY29uZmlnL3N0bF9zeW1iaWFuLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0jaWZuZGVmIF9fc3RscF9jb25maWdfc3ltYmlhbl9oCi0jZGVmaW5lIF9fc3RscF9jb25maWdfc3ltYmlhbl9oCi0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jaWYgZGVmaW5lZChfV0lOMzIpCi0jICB1bmRlZiBfV0lOMzIKLSNlbmRpZgotCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0jICBpbmNsdWRlIDxlMzJjbW4uaD4KLSNlbmRpZgotCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotI2lmIGRlZmluZWQoX19NQVJNX18pCi0jICBpZiAhZGVmaW5lZChfTV9BUk0pCi0jICAgIGRlZmluZSBfTV9BUk0gIDEKLSMgIGVuZGlmCi0jZWxzZQotIyAgaWYgIWRlZmluZWQoX01fSVg4NikKLSMgICAgZGVmaW5lIF9NX0lYODYgMQotIyAgZW5kaWYKLSNlbmRpZgotCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotI2RlZmluZSBfX1BJUFNfXwotCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotI2RlZmluZSBfU1RMUF9IQVNfTk9fTkVXX0NfSEVBREVSUyAgICAgICAgICAxCi0jZGVmaW5lIF9TVExQX05PX05FV19ORVdfSEVBREVSICAgICAgICAgICAgIDEKLSNkZWZpbmUgX1NUTFBfTk9fTkVXX0hFQURFUiAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBfU1RMUF9ORVdfRE9OVF9USFJPV19CQURfQUxMT0MgICAgICAxCi0jZGVmaW5lIF9TVExQX05PX0VYQ0VQVElPTl9IRUFERVIgICAgICAgICAgIDEKLSNkZWZpbmUgX1NUTFBfTk9fVFlQRUlORk8gICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBfU1RMUF9OT19WRU5ET1JfU1RETElCX0wgICAgICAgICAgICAxCi0jZGVmaW5lIF9TVExQX1VTRV9OT1RfSU5JVF9TRUdNRU5UICAgICAgICAgIDEKLSNkZWZpbmUgX1NUTFBfTk9fTE9OR19ET1VCTEUgICAgICAgICAgICAgICAgMQotI2RlZmluZSBfU1RMUF9OT19PV05fTkFNRVNQQUNFICAgICAgICAgICAgICAxCi0jZGVmaW5lIF9TVExQX1VTRV9NQUxMT0MgICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgX1NUTFBfVVNFX05PX0VYVEVSTl9SQU5HRV9FUlJPUlMgICAgMQotI2RlZmluZSBfU1RMUF9VU0VfU0lNUExFX05PREVfQUxMT0MgICAgICAgICAxCi0jZGVmaW5lIF9TVExQX0RPTlRfVEhST1dfUkFOR0VfRVJST1JTICAgICAgIDEKLSNkZWZpbmUgX1NUTFBfRVhQT1NFX0dMT0JBTFNfSU1QTEVNRU5UQVRJT04gMQotI2RlZmluZSBfU1RMUF9VU0VfTkVXQUxMT0MgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIF9TVExQX0lOTElORV9FWENFUFRJT05fQ0xBU1MgICAgICAgIDEKLSNkZWZpbmUgX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EICAgMQotI2RlZmluZSBfU1RMUF9ORUVEU19FWFRSQV9URU1QTEFURV9DT05TVFJVQ1RPUlMgMQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSNpZmRlZiBfU1RMUF9SRUFMX0xPQ0FMRV9JTVBMRU1FTlRFRAotIyAgdW5kZWYgX1NUTFBfUkVBTF9MT0NBTEVfSU1QTEVNRU5URUQKLSNlbmRpZgotCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotI2RlZmluZSBfU1RMUF9OQVRJVkVfQ19JTkNMVURFX1BBVEggICBzdGRhcGlzCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotI2RlZmluZSBfTG9jYWxlX1NQQUNFICAgX0NUWVBFX1MKLSNkZWZpbmUgX0xvY2FsZV9QUklOVCAgIF9DVFlQRV9SCi0jZGVmaW5lIF9Mb2NhbGVfQ05UUkwgICBfQ1RZUEVfQwotI2RlZmluZSBfTG9jYWxlX1VQUEVSICAgX0NUWVBFX1UKLSNkZWZpbmUgX0xvY2FsZV9MT1dFUiAgIF9DVFlQRV9MCi0jZGVmaW5lIF9Mb2NhbGVfQUxQSEEgICBfQ1RZUEVfQQotI2RlZmluZSBfTG9jYWxlX0RJR0lUICAgX0NUWVBFX0QKLSNkZWZpbmUgX0xvY2FsZV9QVU5DVCAgIF9DVFlQRV9QCi0jZGVmaW5lIF9Mb2NhbGVfWERJR0lUICBfQ1RZUEVfWAotCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zdGwvY29uZmlnL3N0bF93aW5zY3cuaCBiL3N0bC9jb25maWcvc3RsX3dpbnNjdy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTE2MWU5Li4wMDAwMDAwCi0tLSBhL3N0bC9jb25maWcvc3RsX3dpbnNjdy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotI2lmbmRlZiBfU1RMUF9XSU5TQ1dfSAotI2RlZmluZSBfU1RMUF9XSU5TQ1dfSAotCi0jZGVmaW5lIF9TVExQX0NPTVBJTEVSICJXSU5TQ1ciCi0KLSN1bmRlZiBfX01XRVJLU19fCi0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jICBkZWZpbmUgX1NUTFBfV0NIQVJfVF9JU19VU0hPUlQgMQotIyAgZGVmaW5lIF9TVExQX0xPTkdfTE9ORyBsb25nIGxvbmcKLQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3RsL2NvbmZpZy91c2VyX2NvbmZpZy5oIGIvc3RsL2NvbmZpZy91c2VyX2NvbmZpZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2FjN2Y5Li4wMDAwMDAwCi0tLSBhL3N0bC9jb25maWcvdXNlcl9jb25maWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqLwotCi0vKgotICogUHVycG9zZSBvZiB0aGlzIGZpbGUgOgotICoKLSAqIFRvIGhvbGQgdXNlci1kZWZpbmFibGUgcG9ydGlvbiBvZiBTVExwb3J0IHNldHRpbmdzIHdoaWNoIG1heSBiZSBvdmVycmlkZGVuCi0gKiBvbiBwZXItcHJvamVjdCBiYXNpcy4KLSAqIFBsZWFzZSBub3RlIHRoYXQgaWYgeW91IHVzZSBTVExwb3J0IGlvc3RyZWFtcyAoY29tcGlsZWQgbGlicmFyeSkgdGhlbiB5b3UgaGF2ZQotICogdG8gdXNlIGNvbnNpc3RlbnQgc2V0dGluZ3Mgd2hlbiB5b3UgY29tcGlsZSBTVExwb3J0IGxpYnJhcnkgYW5kIHlvdXIgcHJvamVjdC4KLSAqIFRob3NlIHNldHRpbmdzIGFyZSBkZWZpbmVkIGluIGhvc3QuaCBhbmQgaGF2ZSB0byBiZSB0aGUgc2FtZSBmb3IgYSBnaXZlbgotICogU1RMcG9ydCBpbnN0YWxsYXRpb24uCi0gKi8KLQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFVzZXItc2V0dGFibGUgbWFjcm9zIHRoYXQgY29udHJvbCBjb21waWxhdGlvbjoKLSAqICAgICAgICAgICAgICBGZWF0dXJlcyBzZWxlY3Rpb24KLSAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLS8qCi0gKiBVc2UgdGhpcyBzd2l0Y2ggZm9yIGVtYmVkZGVkIHN5c3RlbXMgd2hlcmUgbm8gaW9zdHJlYW1zIGFyZSBhdmFpbGFibGUKLSAqIGF0IGFsbC4gU1RMcG9ydCBvd24gaW9zdHJlYW1zIHdpbGwgYWxzbyBnZXQgZGlzYWJsZWQgYXV0b21hdGljYWxseSB0aGVuLgotICogWW91IGNhbiBlaXRoZXIgdXNlIFNUTHBvcnQgaW9zdHJlYW1zLCBvciBubyBpb3N0cmVhbXMuCi0gKiBJZiB5b3Ugd2FudCBpb3N0cmVhbXMsIHlvdSBoYXZlIHRvIGNvbXBpbGUgbGlicmFyeSBpbiAuLi9idWlsZC9saWIKLSAqIGFuZCBzdXBwbHkgcmVzdWx0aW5nIGxpYnJhcnkgYXQgbGluayB0aW1lLgotICovCi0vKgotI2RlZmluZSBfU1RMUF9OT19JT1NUUkVBTVMgMQotKi8KLQotLyoKLSAqIFNldCBfU1RMUF9ERUJVRyB0byB0dXJuIHRoZSAiRGVidWcgTW9kZSIgb24uCi0gKiBUaGF0IGdldHMgeW91IGNoZWNrZWQgaXRlcmF0b3JzL3JhbmdlcyBpbiB0aGUgbWFubmVyCi0gKiBvZiAiU2FmZSBTVEwiLiBWZXJ5IHVzZWZ1bCBmb3IgZGVidWdnaW5nLiBUaHJlYWQtc2FmZS4KLSAqIFBsZWFzZSBkbyBub3QgZm9yZ2V0IHRvIGxpbmsgcHJvcGVyIFNUTHBvcnQgbGlicmFyeSBmbGF2b3IKLSAqIChlLmcgbGlic3RscG9ydHN0bGcuc28gb3IgbGlic3RscG9ydHN0bGcuYSkgd2hlbiB5b3Ugc2V0IHRoaXMgZmxhZwotICogaW4gU1RMcG9ydCBpb3N0cmVhbXMgbW9kZSwgbmFtZXNwYWNlIGN1c3RvbWl6YXRpb24gZ3VhcmFudHkgdGhhdCB5b3UKLSAqIGxpbmsgdG8gdGhlIHJpZ2h0IGxpYnJhcnkuCi0gKi8KLS8qCi0jZGVmaW5lIF9TVExQX0RFQlVHIDEKLSovCi0vKgotICogWW91IGNhbiBhbHNvIGNob29zZSB0aGUgZGVidWcgbGV2ZWw6Ci0gKiBTVExwb3J0IGRlYnVnIGxldmVsOiBEZWZhdWx0IHZhbHVlCi0gKiAgICAgICAgICAgICAgICAgICAgICBDaGVjayBvbmx5IHdoYXQgdGhlIFNUTHBvcnQgaW1wbGVtZW50YXRpb24gY29uc2lkZXIgYXMgaW52YWxpZC4KLSAqICAgICAgICAgICAgICAgICAgICAgIEl0IGFsc28gY2hhbmdlIHRoZSBpdGVyYXRvciBpbnZhbGlkYXRpb24gc2NoZW1hLgotICogU3RhbmRhcmQgZGVidWcgbGV2ZWw6IENoZWNrIGZvciBhbGwgb3BlcmF0aW9ucyB0aGUgc3RhbmRhcmQgY29uc2lkZXIgYXMgInVuZGVmaW5lZCBiZWhhdmlvciIKLSAqICAgICAgICAgICAgICAgICAgICAgICBldmVuIGlmIFNUbHBvcnQgaW1wbGVtZW50IGl0IGNvcnJlY3RseS4gSXQgYWxzbyBpbnZhbGlkYXRlcyBpdGVyYXRvcnMKLSAqICAgICAgICAgICAgICAgICAgICAgICBtb3JlIG9mdGVuLgotICovCi0vKgotI2RlZmluZSAgIF9TVExQX0RFQlVHX0xFVkVMIF9TVExQX1NUTFBPUlRfREJHX0xFVkVMCi0jZGVmaW5lICAgX1NUTFBfREVCVUdfTEVWRUwgX1NUTFBfU1RBTkRBUkRfREJHX0xFVkVMCi0qLwotLyogV2hlbiBhbiBpbmNvbnNpc3RlbmN5IGlzIGRldGVjdGVkIGJ5IHRoZSAnc2FmZSBTVEwnIHRoZSBwcm9ncmFtIHdpbGwgYWJvcnQuCi0gKiBJZiB5b3UgcHJlZmVyIGFuIGV4Y2VwdGlvbiBkZWZpbmUgdGhlIGZvbGxvd2luZyBtYWNyby4gVGhlIHRocm93biBleGNlcHRpb24KLSAqIHdpbGwgYmUgdGhlIFN0YW5kYXJkIHJ1bnRpbWVfZXJyb3IgZXhjZXB0aW9uLgotICovCi0vKgotI2RlZmluZSBfU1RMUF9ERUJVR19NT0RFX1RIUk9XUwotICovCi0KLS8qCi0gKiBfU1RMUF9OT19DVVNUT01fSU8gOiBkZWZpbmUgdGhpcyBpZiB5b3UgZG8gbm90IGluc3RhbnRpYXRlIGJhc2ljX3h4eCBpb3N0cmVhbQotICogY2xhc3NlcyB3aXRoIGN1c3RvbSB0eXBlcyAod2hpY2ggaXMgbW9zdCBsaWtlbHkgdGhlIGNhc2UpLiBDdXN0b20gbWVhbnMgdHlwZXMKLSAqIG90aGVyIHRoYW4gY2hhciwgd2NoYXJfdCwgY2hhcl90cmFpdHM8PiBhbmQgYWxsb2NhdG9yPD4gbGlrZQotICogYmFzaWNfb3N0cmVhbTxteV9jaGFyX3R5cGUsIG15X3RyYWl0czxteV9jaGFyX3R5cGU+ID4gb3IKLSAqIGJhc2ljX3N0cmluZzxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiwgbXlfYWxsb2NhdG9yID4KLSAqIFdoZW4gdGhpcyBvcHRpb24gaXMgb24sIG1vc3Qgbm9uLWlubGluZSB0ZW1wbGF0ZSBmdW5jdGlvbnMgZGVmaW5pdGlvbnMgZm9yIGlvc3RyZWFtcwotICogYXJlIG5vdCBzZWVuIGJ5IHRoZSBjbGllbnQgd2hpY2ggc2F2ZXMgYSBsb3Qgb2YgY29tcGlsZSB0aW1lIGZvciBtb3N0IGNvbXBpbGVycywKLSAqIGFsc28gb2JqZWN0IGFuZCBleGVjdXRhYmxlIHNpemUgZm9yIHNvbWUuCi0gKiBEZWZhdWx0IGlzIG9mZiwganVzdCBub3QgdG8gYnJlYWsgY29tcGlsYXRpb24gZm9yIHRob3NlIHdobyBkbyB1c2UgdGhvc2UgdHlwZXMuCi0gKiBUaGF0IGFsc28gZ3VhcmFudGVlcyB0aGF0IHlvdSBzdGlsbCB1c2Ugb3B0aW1pemVkIHN0YW5kYXJkIGkvbyB3aGVuIHlvdSBjb21waWxlCi0gKiB5b3VyIHByb2dyYW0gd2l0aG91dCBvcHRpbWl6YXRpb24uIE9wdGlvbiBkb2VzIG5vdCBhZmZlY3QgU1RMcG9ydCBsaWJyYXJ5IGJ1aWxkOyB5b3UKLSAqIG1heSB1c2UgdGhlIHNhbWUgYmluYXJ5IGxpYnJhcnkgd2l0aCBhbmQgd2l0aG91dCB0aGlzIG9wdGlvbiwgb24gcGVyLXByb2plY3QgYmFzaXMuCi0gKi8KLS8qCi0jZGVmaW5lIF9TVExQX05PX0NVU1RPTV9JTwotKi8KLQotLyoKLSAqIF9TVExQX05PX1JFTE9QU19OQU1FU1BBQ0U6IGlmIGRlZmluZWQsIGRvbid0IHB1dCB0aGUgcmVsYXRpb25hbAotICogb3BlcmF0b3IgdGVtcGxhdGVzICg+LCA8PS4gPj0sICE9KSBpbiBuYW1lc3BhY2Ugc3RkOjpyZWxfb3BzLCBldmVuCi0gKiBpZiB0aGUgY29tcGlsZXIgc3VwcG9ydHMgbmFtZXNwYWNlcy4KLSAqIE5vdGUgOiBpZiB0aGUgY29tcGlsZXIgZG8gbm90IHN1cHBvcnQgbmFtZXNwYWNlcywgdGhvc2Ugb3BlcmF0b3JzIGFyZSBub3QgYmUgcHJvdmlkZWQgYnkgZGVmYXVsdCwKLSAqIHRvIHNpbXVsYXRlIGhpZGluZyB0aGVtIGludG8gcmVsX29wcy4gVGhpcyB3YXMgcHJvdmVkIHRvIHJlc29sdmUgbWFueSBjb21waWxlciBidWdzIHdpdGggYW1iaWd1aXR5LgotICovCi0vKgotI2RlZmluZSBfU1RMUF9OT19SRUxPUFNfTkFNRVNQQUNFIDEKLSovCi0KLS8qCi0gKiBJZiBfU1RMUF9VU0VfT1dOX05BTUVTUEFDRSBpcyBpbiBlZmZlY3QsIFNUTHBvcnQgYnkgZGVmYXVsdCB3aWxsIHRyeQotICogdG8gcmVuYW1lIHN0ZDo6IGZvciB0aGUgdXNlciB0byBzdGxwb3J0OjouIElmIHlvdSBkbyBub3Qgd2FudCB0aGlzIGZlYXR1cmUsCi0gKiBwbGVhc2UgZGVmaW5lIHRoZSBmb2xsb3dpbmcgc3dpdGNoIGFuZCB0aGVuIHVzZSBzdGxwb3J0OjoKLSAqLwotLyoKLSNkZWZpbmUgX1NUTFBfRE9OVF9SRURFRklORV9TVEQgMQotKi8KLQotLyoKLSAqIF9TVExQX1dIT0xFX05BVElWRV9TVEQgOiBvbmx5IG1lYW5pbmdmdWwgaW4gX1NUTFBfVVNFX09XTl9OQU1FU1BBQ0UgbW9kZS4KLSAqIE5vcm1hbGx5LCBTVExwb3J0IG9ubHkgaW1wb3J0cyBuZWNlc3NhcnkgY29tcG9uZW50cyBmcm9tIG5hdGl2ZSBzdGQ6OiBuYW1lc3BhY2UgLQotICogdGhvc2Ugbm90IHlldCBwcm92aWRlZCBieSBTVExwb3J0ICg8aW9zdHJlYW0+LCA8Y29tcGxleD4sIGV0Yy4pCi0gKiBhbmQgdGhlaXIgZGVwZW5kZW5jaWVzICg8c3RyaW5nPiwgPHN0ZGV4Y2VwdD4pLgotICogWW91IG1pZ2h0IHdhbnQgZXZlcnl0aGluZyBmcm9tIHN0ZDo6IGJlaW5nIGF2YWlsYWJsZSBpbiBzdGQ6OiBuYW1lc3BhY2Ugd2hlbiB5b3UKLSAqIGluY2x1ZGUgY29ycmVzcG9uZGluZyBTVExwb3J0IGhlYWRlciAobGlrZSBTVExwb3J0IDxtYXA+IHByb3ZpZGVzIHN0ZDo6bWFwIGFzIHdlbGwsIGV0Yy4pLAotICogaWYgeW91IGFyZSBnb2luZyB0byB1c2UgYm90aCBzdGxwb3J0OjogYW5kIHN0ZDo6IGNvbXBvbmVudHMgaW4geW91ciBjb2RlLgotICogT3RoZXJ3aXNlIHRoaXMgb3B0aW9uIGlzIG5vdCByZWNvbW1lbmRlZCBhcyBpdCBpbmNyZWFzZXMgdGhlIHNpemUgb2YgeW91ciBvYmplY3QgZmlsZXMKLSAqIGFuZCBzbG93cyBkb3duIGNvbXBpbGF0aW9uLgotICovCi0vKgotI2RlZmluZSBfU1RMUF9XSE9MRV9OQVRJVkVfU1RECi0qLwotCi0vKgotICogVXNlIHRoaXMgb3B0aW9uIHRvIGNhdGNoIHVuaW5pdGlhbGl6ZWQgbWVtYmVycyBpbiB5b3VyIGNsYXNzZXMuCi0gKiBXaGVuIGl0IGlzIHNldCwgY29uc3RydWN0KCkgYW5kIGRlc3Ryb3koKSBmaWxsIHRoZSBjbGFzcyBzdG9yYWdlCi0gKiB3aXRoIF9TVExQX1NIUkVEX0JZVEUgKHNlZSBiZWxvdykuCi0gKiBOb3RlIDogX1NUTFBfREVCVUcgYW5kIF9TVExQX0RFQlVHX0FMTE9DIGRvbid0IHNldCB0aGlzIG9wdGlvbiBhdXRvbWF0aWNhbGx5LgotICovCi0vKgotI2RlZmluZSBfU1RMUF9ERUJVR19VTklOSVRJQUxJWkVEIDEKLSNkZWZpbmUgX1NUTFBfREVCVUdfQUxMT0MgMQotKi8KLQotLyoKLSAqIFVuY29tbWVudCBhbmQgcHJvdmlkZSBhIGRlZmluaXRpb24gZm9yIHRoZSBieXRlIHdpdGggd2hpY2ggcmF3IG1lbW9yeQotICogd2lsbCBiZSBmaWxsZWQgaWYgX1NUTFBfREVCVUdfQUxMT0Mgb3IgX1NUTFBfREVCVUdfVU5JTklUSUFMSVpFRCBpcyBkZWZpbmVkLgotICogQ2hvb3NlIGEgdmFsdWUgd2hpY2ggaXMgbGlrZWx5IHRvIGNhdXNlIGEgbm90aWNlYWJsZSBwcm9ibGVtIGlmIGRlcmVmZXJlbmNlZAotICogb3Igb3RoZXJ3aXNlIGFidXNlZC4gQSBnb29kIHZhbHVlIG1heSBhbHJlYWR5IGJlIGRlZmluZWQgZm9yIHlvdXIgcGxhdGZvcm0uCi0gKi8KLS8qCi0jZGVmaW5lIF9TVExQX1NIUkVEX0JZVEUgMHhBMwotKi8KLQotLyoKLSAqICBUaGlzIG9wdGlvbiBpcyBmb3IgZ2NjIHVzZXJzIG9ubHkgYW5kIG9ubHkgYWZmZWN0cyBzeXN0ZW1zIHdoZXJlIG5hdGl2ZSBsaW5rZXIKLSAqICBkb2VzIG5vdCBsZXQgZ2NjIHRvIGltcGxlbWVudCBhdXRvbWF0aWMgaW5zdGFudGlhdGlvbiBvZiBzdGF0aWMgdGVtcGxhdGUgZGF0YSBtZW1iZXJzLwotICogIEl0IGlzIGJlaW5nIHB1dCBpbiB0aGlzIGZpbGUgYXMgdGhlcmUgaXMgbm8gd2F5IHRvIGNoZWNrIGlmIHdlIGFyZSB1c2luZyBHTlUgbGQgYXV0b21hdGljYWxseSwKLSAqICBzbyBpdCBiZWNvbWVzIHVzZXIncyByZXNwb25zaWJpbGl0eS4KLSAqLwotLyoKLSNkZWZpbmUgX1NUTFBfR0NDX1VTRVNfR05VX0xECi0qLwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvbXBhdGliaWxpdHkgc2VjdGlvbgotICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotLyoKLSAqICBEZWZpbmUgdGhpcyBtYWNybyB0byBkaXNhYmxlIGFuYWNocm9uaXN0aWMgY29uc3RydWN0cyAobGlrZSB0aGUgb25lcyB1c2VkIGluIEhQIFNUTCBhbmQKLSAqICBub3QgaW5jbHVkZWQgaW4gZmluYWwgc3RhbmRhcmQsIGV0Yy4KLSAqLwotLyoKLSNkZWZpbmUgX1NUTFBfTk9fQU5BQ0hST05JU01TIDEKLSovCi0KLS8qCi0gKiAgRGVmaW5lIHRoaXMgbWFjcm8gdG8gZGlzYWJsZSBTVExwb3J0IGV4dGVuc2lvbnMgKGZvciBleGFtcGxlLCB0byBtYWtlIHN1cmUgeW91ciBjb2RlIHdpbGwKLSAqICBjb21waWxlIHdpdGggc29tZSBvdGhlciBpbXBsZW1lbnRhdGlvbiApCi0gKi8KLS8qCi0jZGVmaW5lIF9TVExQX05PX0VYVEVOU0lPTlMgMQotKi8KLQotLyoKLSAqIFlvdSBzaG91bGQgZGVmaW5lIHRoaXMgbWFjcm8gaWYgY29tcGlsaW5nIHdpdGggTUZDIC0gU1RMcG9ydCA8c3RsL2NvbmZpZy9fd2luZG93cy5oPgotICogdGhlbiBpbmNsdWRlIDxhZnguaD4gaW5zdGVhZCBvZiA8d2luZG93cy5oPiB0byBnZXQgc3luY2hyb25pc2F0aW9uIHByaW1pdGl2ZXMKLSAqLwotLyoKLSNkZWZpbmUgX1NUTFBfVVNFX01GQyAxCi0qLwotCi0vKgotICogYm9yaXMgOiB0aGlzIHNldHRpbmcgaXMgaGVyZSBhcyB3ZSBjYW5ub3QgZGV0ZWN0IHByZWNlbnNlIG9mIG5ldyBQbGF0Zm9ybSBTREsgYXV0b21hdGljYWxseQotICogSWYgeW91IGFyZSB1c2luZyBuZXcgUFNESyB3aXRoIFZDKysgNi4wIG9yIGxvd2VyLAotICogcGxlYXNlIGRlZmluZSB0aGlzIHRvIGdldCBjb3JyZWN0IHByb3RvdHlwZXMgZm9yIEludGVybG9ja2VkWFhYIGZ1bmN0aW9ucwotICovCi0vKgotI2RlZmluZSBfU1RMUF9ORVdfUExBVEZPUk1fU0RLIDEKLSovCi0KLS8qCi0gKiBGb3IgdGhlIHNhbWUgcmVhc29uIGFzIHRoZSBvbmUgYWJvdmUgd2UgYXJlIG5vdCBhYmxlIHRvIGRldGVjdCBlYXNpbHkgdXNlCi0gKiBvZiB0aGUgY29tcGlsZXIgY29taW5nIHdpdGggdGhlIFBsYXRmb3JtIFNESyBpbnN0ZWFkIG9mIHRoZSBvbmUgY29taW5nIHdpdGgKLSAqIGEgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gcmVsZWFzZS4gVGhpcyBjaGFuZ2UgbmF0aXZlIEMvQysrIGxpYnJhcnkgbG9jYXRpb24KLSAqIGFuZCBpbXBsZW1lbnRhdGlvbiwgcGxlYXNlIGRlZmluZSB0aGlzIHRvIGdldCBjb3JyZWN0IFNUTHBvcnQgY29uZmlndXJhdGlvbi4KLSAqLwotLyoKLSNkZWZpbmUgX1NUTFBfVVNJTkdfUExBVEZPUk1fU0RLX0NPTVBJTEVSIDEKLSovCi0KLS8qCi0gKiBTb21lIGNvbXBpbGVycyBzdXBwb3J0IHRoZSBhdXRvbWF0aWMgbGlua2luZyBmZWF0dXJlLgotICogVW5jb21tZW50IHRoZSBmb2xsb3dpbmcgaWYgeW91IHByZWZlciB0byBzcGVjaWZ5IHRoZSBTVExwb3J0IGxpYnJhcnkKLSAqIHRvIGxpbmsgd2l0aCB5b3Vyc2VsZi4KLSAqIEZvciB0aGUgbW9tZW50LCB0aGlzIGZlYXR1cmUgaXMgb25seSBzdXBwb3J0ZWQgYW5kIGltcGxlbWVudGVkIHdpdGhpbiBTVExwb3J0Ci0gKiBieSB0aGUgTWljcm9zb2Z0IGNvbXBpbGVycy4KLSAqLwotLyoKLSNkZWZpbmUgX1NUTFBfRE9OVF9VU0VfQVVUT19MSU5LIDEKLSovCi0KLS8qCi0gKiBJZiB5b3UgY3VzdG9taXplIHRoZSBTVExwb3J0IGdlbmVyYXRlZCBsaWJyYXJ5IG5hbWVzIGRvbid0IGZvcmdldCB0byBnaXZlCi0gKiB0aGUgbW90aWYgeW91IHVzZWQgZHVyaW5nIGNvbmZpZ3VyYXRpb24gaGVyZSBpZiB5b3Ugc3RpbGwgd2FudCB0aGUgYXV0byBsaW5rCi0gKiB0byB3b3JrLiAoRG8gbm90IHJlbW92ZSBkb3VibGUgcXVvdGVzIGluIHRoZSBtYWNybyB2YWx1ZSkKLSAqLwotLyoKLSNkZWZpbmUgX1NUTFBfTElCX05BTUVfTU9USUYgIj8/PyIKLSAqLwotCi0vKgotICogV2hlbiB1c2luZyBhdXRvbWF0aWMgbGlua2luZyAoc2VlIGFib3ZlKSwgb3V0cHV0IGEgbWVzc2FnZSB0aGF0IHRlbGxzIHRoZQotICogdXNlciB3aGljaCBsaWIgaXMgZ2V0dGluZyBsaW5rZWQgdmlhICdwcmFnbWEgbWVzc2FnZSguLiknLgotICogVGhpcyBzZXR0aW5nIGhhcyBubyBlZmZlY3QgaWYgYXV0b21hdGljIGxpbmtpbmcgaXMgbm90IGFjdGl2ZS4KLSAqLwotLyoKLSNkZWZpbmUgX1NUTFBfVkVSQk9TRV9BVVRPX0xJTksgMQotKi8KLQotLyoKLSAqIFVzZSBtaW5pbXVtIHNldCBvZiBkZWZhdWx0IGFyZ3VtZW50cyBvbiB0ZW1wbGF0ZSBjbGFzc2VzIHRoYXQgaGF2ZSBtb3JlCi0gKiB0aGFuIG9uZSAtIGZvciBleGFtcGxlIG1hcDw+LCBzZXQ8Pi4KLSAqIFRoaXMgaGFzIGVmZmVjdCBvbmx5IGlmIF9TVExQX0xJTUlURURfREVGQVVMVF9URU1QTEFURVMgaXMgb24uCi0gKiBJZiBfU1RMUF9NSU5JTVVNX0RFRkFVTFRfVEVNUExBVEVfUEFSQU1TIGlzIHNldCwgeW91J2xsIGJlIGFibGUgdG8gY29tcGlsZQotICogc2V0PFQ+IHdpdGggdGhvc2UgY29tcGlsZXJzLCBidXQgeW91J2xsIGhhdmUgdG8gdXNlIF9fc2V0X188VCwgbGVzczxUPj4KLSAqCi0gKiBBZmZlY3RzIDogbWFwPD4sIG11bHRpbWFwPD4sIHNldDw+LCBtdWx0aXNldDw+LCBoYXNoXyo8PiwKLSAqIHF1ZXVlPD4sIHByaW9yaXR5X3F1ZXVlPD4sIHN0YWNrPD4sIGlzdHJlYW1faXRlcmF0b3I8PgotICovCi0vKgotI2RlZmluZSBfU1RMUF9NSU5JTVVNX0RFRkFVTFRfVEVNUExBVEVfUEFSQU1TIDEKLSovCi0KLS8qCi0gKiBUaGUgYWdyZWdhdGlvbiBvZiBzdHJpbmdzIHVzaW5nIHRoZSArIG9wZXJhdG9yIGlzIGFuIGV4cGVuc2l2ZSBvcGVyYXRpb24KLSAqIGFzIGl0IHJlcXVpcmVzIGNvbnN0cnVjdGlvbiBvZiB0ZW1wb3Jhcnkgb2JqZWN0cyB0aGF0IG5lZWQgbWVtb3J5IGFsbG9jYXRpb24KLSAqIGFuZCBkZWFsbG9jYXRpb24uIFRoZSBwcm9ibGVtIGNhbiBiZSBldmVuIG1vcmUgaW1wb3J0YW50IGlmIHlvdSBhcmUgYWRkaW5nCi0gKiBzZXZlcmFsIHN0cmluZ3MgdG9nZXRoZXIgaW4gYSBzaW5nbGUgZXhwcmVzc2lvbi4gVG8gYXZvaWQgdGhpcyBwcm9ibGVtIFNUTHBvcnQKLSAqIGltcGxlbWVudCBleHByZXNzaW9uIHRlbXBsYXRlLiBXaXRoIHRoaXMgdGVjaG5pcXVlIGFkZGl0aW9uIG9mIDIgc3RyaW5ncyBpcyBub3QKLSAqIGEgc3RyaW5nIGFueW1vcmUgYnV0IGEgdGVtcG9yYXJ5IG9iamVjdCBoYXZpbmcgYSByZWZlcmVuY2UgdG8gZWFjaCBvZiB0aGUKLSAqIG9yaWdpbmFsIHN0cmluZ3MgaW52b2x2ZWQgaW4gdGhlIGV4cHJlc3Npb24uIFRoaXMgb2JqZWN0IGNhcnJ5IGluZm9ybWF0aW9uCi0gKiBkaXJlY3RseSB0byB0aGUgZGVzdGluYXRpb24gc3RyaW5nIHRvIHNldCBpdHMgc2l6ZSBjb3JyZWN0bHkgYW5kIG9ubHkgbWFrZQotICogYSBzaW5nbGUgY2FsbCB0byB0aGUgYWxsb2NhdG9yLiBUaGlzIHRlY2huaXF1ZSBhbHNvIHdvcmtzIGZvciB0aGUgYWRkaXRpb24gb2YKLSAqIE4gZWxlbWVudHMgd2hlcmUgZWxlbWVudHMgYXJlIGJhc2ljX3N0cmluZywgQyBzdHJpbmcgb3IgYSBzaW5nbGUgY2hhcmFjdGVyLgotICogVGhlIGRyYXdiYWNrIGNhbiBiZSBsb25nZXIgY29tcGlsYXRpb24gdGltZSBhbmQgYmlnZ2VyIGV4ZWN1dGFibGUgc2l6ZS4KLSAqIFNUTHBvcnQgcmVidWlsZDogWWVzCi0gKi8KLS8qCi0jZGVmaW5lIF9TVExQX1VTRV9URU1QTEFURV9FWFBSRVNTSU9OIDEKLSovCi0KLS8qCi0gKiBCeSBkZWZhdWx0IHRoZSBTVExwb3J0IGJhc2ljX3N0cmluZyBpbXBsZW1lbnRhdGlvbiB1c2UgYSBsaXR0bGUgc3RhdGljIGJ1ZmZlcgotICogKG9mIDE2IGNoYXJzIHdoZW4gd3JpdGluZyB0aGlzIGRvYykgdG8gYXZvaWQgc3lzdGVtYXRpY2FsbHkgbWVtb3J5IGFsbG9jYXRpb24KLSAqIGluIGNhc2Ugb2YgbGl0dGxlIGJhc2ljX3N0cmluZy4gVGhlIGRyYXdiYWNrIG9mIHN1Y2ggYSBtZXRob2QgaXMgYmlnZ2VyCi0gKiBiYXNpY19zdHJpbmcgc2l6ZSBhbmQgc29tZSBwZXJmb3JtYW5jZSBwZW5hbHR5IGZvciBtZXRob2QgbGlrZSBzd2FwLiBJZiB5b3UKLSAqIHByZWZlciBzeXN0ZW1hdGljYWwgZHluYW1pYyBhbGxvY2F0aW9uIHR1cm4gb24gdGhpcyBtYWNyby4KLSAqIFNUTHBvcnQgcmVidWlsZDogWWVzCi0gKi8KLS8qCi0jZGVmaW5lIF9TVExQX0RPTlRfVVNFX1NIT1JUX1NUUklOR19PUFRJTSAxCi0qLwotCi0vKgotICogVG8gcmVkdWNlIHRoZSBmYW1vdXMgY29kZSBibG9hdCB0cm91YmxlIGR1ZSB0byB0aGUgdXNlIG9mIHRlbXBsYXRlcyBTVExwb3J0IGdyYW50Ci0gKiBhIHNwZWNpYWxpemF0aW9uIG9mIHNvbWUgY29udGFpbmVycyBmb3IgcG9pbnRlciB0eXBlcy4gU28gYWxsIGluc3RhbmNpYXRpb25zCi0gKiBvZiB0aG9zZSBjb250YWluZXJzIHdpdGggYSBwb2ludGVyIHR5cGUgd2lsbCB1c2UgdGhlIHNhbWUgaW1wbGVtZW50YXRpb24gYmFzZWQgb24KLSAqIGEgY29udGFpbmVyIG9mIHZvaWQqLiBUaGlzIGZlYXR1cmUgaGFzIHNob3cgdmVyeSBnb29kIHJlc3VsdCBvbiBvYmplY3QgZmlsZXMgc2l6ZQotICogYnV0IGFmdGVyIGxpbmsgcGhhc2UgYW5kIG9wdGltaXphdGlvbiB5b3Ugd2lsbCBvbmx5IGV4cGVyaW1lbnQgYmVuZWZpdCBpZiB5b3UgdXNlCi0gKiBtYW55IGNvbnRhaW5lciB3aXRoIHBvaW50ZXIgdHlwZXMuCi0gKi8KLS8qCi0jZGVmaW5lIF9TVExQX1VTRV9QVFJfU1BFQ0lBTElaQVRJT05TIDEKLSovCi0KLS8qCi0gKiBUbyBhY2hpZXZlIG1hbnkgZGlmZmVyZW50IG9wdGltaXphdGlvbnMgd2l0aGluIHRoZSB0ZW1wbGF0ZSBpbXBsZW1lbnRhdGlvbnMgU1RMcG9ydAotICogdXNlcyBzb21lIHR5cGUgdHJhaXRzIHRlY2huaXF1ZS4gV2l0aCB0aGlzIG1hY3JvIHlvdSBjYW4gYXNrIFNUTHBvcnQgdG8gdXNlIHRoZSBmYW1vdXMKLSAqIGJvb3N0IHR5cGUgdHJhaXRzIHJhdGhlciB0aGFuIHRoZSBpbnRlcm5hbCBvbmUuIFRoZSBhZHZhbnRhZ2VzIGFyZSBtb3JlIGNvbXBpbGVyCi0gKiBpbnRlZ3JhdGlvbiBhbmQgYSBiZXR0ZXIgc3VwcG9ydC4gSWYgeW91IG9ubHkgZGVmaW5lIHRoaXMgbWFjcm8gb25jZSB0aGUgU1RMcG9ydCBoYXMgYmVlbgotICogYnVpbHQgeW91IGp1c3QgaGF2ZSB0byBhZGQgdGhlIGJvb3N0IGluc3RhbGwgcGF0aCB3aXRoaW4geW91ciBpbmNsdWRlIHBhdGguIElmIHlvdSB3YW50Ci0gKiB0byB1c2UgdGhpcyBmZWF0dXJlIGF0IFNUTHBvcnQgYnVpbHQgdGltZSB5b3Ugd2lsbCBoYXZlIHRvIGRlZmluZSB0aGUKLSAqIFNUTFBfQlVJTERfQk9PU1RfUEFUSCBlbnJpcm9ubWVudCB2YXJpYWJsZSB3aXRoIHRoZSB2YWx1ZSBvZiB0aGUgYm9vc3QgbGlicmFyeSBwYXRoLgotICovCi0vKgotI2RlZmluZSBfU1RMUF9VU0VfQk9PU1RfU1VQUE9SVCAxCi0qLwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0vKgotICBMb2NhbCBWYXJpYWJsZXM6Ci0gIG1vZGU6IEMrKwotICBFbmQ6Ci0qLwpkaWZmIC0tZ2l0IGEvc3RsL2RlYnVnL19kZWJ1Zy5jIGIvc3RsL2RlYnVnL19kZWJ1Zy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTMyYTYyLi4wMDAwMDAwCi0tLSBhL3N0bC9kZWJ1Zy9fZGVidWcuYworKysgL2Rldi9udWxsCkBAIC0xLDYzOSArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NwotICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogQm9yaXMgRm9taXRjaGV2Ci0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICovCi0KLSNpZm5kZWYgX1NUTFBfREVCVUdfQwotI2RlZmluZSBfU1RMUF9ERUJVR19DCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9ERUJVRykKLSNpZiBkZWZpbmVkIChfU1RMUF9USFJFQURTKQotIyAgaWYgIWRlZmluZWQgKF9TVExQX05FRURfTVVUQUJMRSkKLSMgICAgZGVmaW5lIF9TVExQX0FDUVVJUkVfTE9DSyhfTG9jaykgX0xvY2suX01fYWNxdWlyZV9sb2NrKCk7Ci0jICAgIGRlZmluZSBfU1RMUF9SRUxFQVNFX0xPQ0soX0xvY2spIF9Mb2NrLl9NX3JlbGVhc2VfbG9jaygpOwotIyAgZWxzZQotIyAgICBkZWZpbmUgX1NUTFBfQUNRVUlSRV9MT0NLKF9Mb2NrKSAoKF9TVExQX211dGV4JilfTG9jaykuX01fYWNxdWlyZV9sb2NrKCk7Ci0jICAgIGRlZmluZSBfU1RMUF9SRUxFQVNFX0xPQ0soX0xvY2spICgoX1NUTFBfbXV0ZXgmKV9Mb2NrKS5fTV9yZWxlYXNlX2xvY2soKTsKLSMgIGVuZGlmIC8qIF9TVExQX05FRURfTVVUQUJMRSAqLwotI2Vsc2UKLSMgIGRlZmluZSBfU1RMUF9BQ1FVSVJFX0xPQ0soX0xvY2spCi0jICBkZWZpbmUgX1NUTFBfUkVMRUFTRV9MT0NLKF9Mb2NrKQotI2VuZGlmIC8qIF9TVExQX1RIUkVBRFMgKi8KLQotX1NUTFBfQkVHSU5fTkFNRVNQQUNFCi1fU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCi0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gIGdsb2JhbCBub24taW5saW5lIGZ1bmN0aW9ucwotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBbIGkxLCBpMikKLSNpZiAhZGVmaW5lZCAoX19ETUNfXykKLXRlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+Ci1pbmxpbmUgYm9vbCAgX1NUTFBfQ0FMTAotX19pbl9yYW5nZV9hdXgoY29uc3QgX0l0ZXJhdG9yJiBfX2l0LCBjb25zdCBfSXRlcmF0b3ImIF9fZmlyc3QsCi0gICAgICAgICAgICAgICBjb25zdCBfSXRlcmF0b3ImIF9fbGFzdCwgY29uc3QgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgJikgewotICAgIHJldHVybiAoIF9faXQgPj0gX19maXJzdCAmJgotICAgICAgICAgICAgIF9faXQgPCBfX2xhc3QpOwotfQotI2VuZGlmCi0KLXRlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3IxLCBjbGFzcyBfSXRlcmF0b3I+Ci0jaWYgZGVmaW5lZCAoX1NUTFBfTVNWQykgJiYgKF9TVExQX01TVkMgPj0gMTEwMCkKLWlubGluZSBib29sIF9TVExQX0NBTEwgIF9faW5fcmFuZ2VfYXV4KF9JdGVyYXRvcjEgX19pdCwgY29uc3QgX0l0ZXJhdG9yJiBfX2ZpcnN0LAotI2Vsc2UKLWlubGluZSBib29sIF9TVExQX0NBTEwgIF9faW5fcmFuZ2VfYXV4KGNvbnN0IF9JdGVyYXRvcjEmIF9faXQsIGNvbnN0IF9JdGVyYXRvciYgX19maXJzdCwKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0l0ZXJhdG9yJiBfX2xhc3QsIGNvbnN0IGZvcndhcmRfaXRlcmF0b3JfdGFnICYpIHsKLSAgX0l0ZXJhdG9yMSBfX2koX19maXJzdCk7Ci0gIGZvciAoOyAgX19pICE9IF9fbGFzdCAmJiBfX2kgIT0gX19pdDsgKytfX2kpOwotICByZXR1cm4gKF9faSAhPSBfX2xhc3QpOwotfQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfTk9OVEVNUExfQkFTRV9NQVRDSF9CVUcpCi10ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yMSwgY2xhc3MgX0l0ZXJhdG9yPgotaW5saW5lIGJvb2wgIF9TVExQX0NBTEwKLV9faW5fcmFuZ2VfYXV4KGNvbnN0IF9JdGVyYXRvcjEmIF9faXQsIGNvbnN0IF9JdGVyYXRvciYgX19maXJzdCwKLSAgICAgICAgICAgICAgIGNvbnN0IF9JdGVyYXRvciYgX19sYXN0LCBjb25zdCBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZyAmKSB7Ci0gIF9JdGVyYXRvcjEgX19pKF9fZmlyc3QpOwotICBmb3IgKDsgIF9faSAhPSBfX2xhc3QgJiYgX19pICE9IF9faXQ7ICsrX19pKTsKLSAgcmV0dXJuIChfX2kgIT0gX19sYXN0KTsKLX0KLSNlbmRpZgotCi10ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgotYm9vbCBfU1RMUF9DQUxMIF9fY2hlY2tfcmFuZ2VfYXV4KGNvbnN0IF9JdGVyYXRvciYgX19maXJzdCwgY29uc3QgX0l0ZXJhdG9yJiBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19mYWxzZV90eXBlJiAvKl9Jc0ludGVncmFsKi8pIHsKLSAgX1NUTFBfVkVSQk9TRV9SRVRVUk4oX192YWxpZF9yYW5nZShfX2ZpcnN0LF9fbGFzdCksIF9TdGxNc2dfSU5WQUxJRF9SQU5HRSApCi0gIHJldHVybiB0cnVlOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0ludGVncmFsPgotYm9vbCBfU1RMUF9DQUxMIF9fY2hlY2tfcmFuZ2VfYXV4KF9JbnRlZ3JhbCAvKl9fZmlyc3QqLywgX0ludGVncmFsIC8qX19sYXN0Ki8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX190cnVlX3R5cGUmIC8qX0lzSW50ZWdyYWwqLykKLXsgcmV0dXJuIHRydWU7IH0KLQotdGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KLWJvb2wgX1NUTFBfQ0FMTCAgX19jaGVja19yYW5nZShjb25zdCBfSXRlcmF0b3ImIF9fZmlyc3QsIGNvbnN0IF9JdGVyYXRvciYgX19sYXN0KSB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0lzSW50ZWdyYWw8X0l0ZXJhdG9yPjo6X1JldCBfSW50ZWdyYWw7Ci0gIHJldHVybiBfX2NoZWNrX3JhbmdlX2F1eChfX2ZpcnN0LCBfX2xhc3QsIF9JbnRlZ3JhbCgpKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KLWJvb2wgX1NUTFBfQ0FMTCAgX19jaGVja19yYW5nZShjb25zdCBfSXRlcmF0b3ImIF9faXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0l0ZXJhdG9yJiBfX3N0YXJ0LCBjb25zdCBfSXRlcmF0b3ImIF9fZmluaXNoKSB7Ci0gIF9TVExQX1ZFUkJPU0VfUkVUVVJOKF9faW5fcmFuZ2UoX19pdCwgX19zdGFydCwgX19maW5pc2gpLAotICAgICAgICAgICAgICAgICAgICAgICBfU3RsTXNnX05PVF9JTl9SQU5HRV8xKQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KLWJvb2wgX1NUTFBfQ0FMTCAgX19jaGVja19yYW5nZShjb25zdCBfSXRlcmF0b3ImIF9fZmlyc3QsIGNvbnN0IF9JdGVyYXRvciYgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9JdGVyYXRvciYgX19zdGFydCwgY29uc3QgX0l0ZXJhdG9yJiBfX2ZpbmlzaCkgewotICBfU1RMUF9WRVJCT1NFX1JFVFVSTihfX2luX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCwgX19zdGFydCwgX19maW5pc2gpLAotICAgICAgICAgICAgICAgICAgICAgICBfU3RsTXNnX05PVF9JTl9SQU5HRV8yKQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWJvb2wgX1NUTFBfQ0FMTCBfX2NoZWNrX3B0cl9yYW5nZShjb25zdCBfVHAqIF9fZmlyc3QsIGNvbnN0IF9UcCogX19sYXN0KSB7Ci0gIF9TVExQX1ZFUkJPU0VfUkVUVVJOKChfX2ZpcnN0ICE9IDAgfHwgX19sYXN0ID09IDApLCBfU3RsTXNnX0lOVkFMSURfQVJHVU1FTlQpCi0gIF9TVExQX1ZFUkJPU0VfUkVUVVJOKF9fdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0LCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZygpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgX1N0bE1zZ19JTlZBTElEX1JBTkdFKQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLXRlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+Ci12b2lkIF9TVExQX0NBTEwgX19pbnZhbGlkYXRlX3JhbmdlKGNvbnN0IF9fb3duZWRfbGlzdCogX19iYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfSXRlcmF0b3ImIF9fZmlyc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9JdGVyYXRvciYgX19sYXN0KSB7Ci0gIHR5cGVkZWYgX19vd25lZF9saW5rIF9MX3R5cGU7Ci0gIF9TVExQX0FDUVVJUkVfTE9DSyhfX2Jhc2UtPl9NX2xvY2spCi0gIF9MX3R5cGUqIF9fcHJldiA9IF9fQ09OU1RfQ0FTVChfTF90eXBlKiwgJl9fYmFzZS0+X01fbm9kZSk7Ci0gIF9MX3R5cGUqIF9fcG9zID0gX19wcmV2LT5fTV9uZXh0OwotCi0gIHdoaWxlIChfX3BvcyAhPSAwKSB7Ci0gICAgaWYgKCEoJl9fZmlyc3QgPT0gX19TVEFUSUNfQ0FTVChfSXRlcmF0b3IqLCBfX3BvcykgfHwgJl9fbGFzdCA9PSBfX1NUQVRJQ19DQVNUKF9JdGVyYXRvciosIF9fcG9zKSkgJiYKLSAgICAgICAgX19pbl9yYW5nZV9hdXgoX19TVEFUSUNfQ0FTVChfSXRlcmF0b3IqLCBfX3BvcyktPl9NX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICBfX2ZpcnN0Ll9NX2l0ZXJhdG9yLCBfX2xhc3QuX01faXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9fZmlyc3QsIF9JdGVyYXRvcikpKSB7Ci0gICAgICBfX3Bvcy0+X01fb3duZXIgPSAwOwotICAgICAgX19wcmV2LT5fTV9uZXh0ID0gX19wb3MtPl9NX25leHQ7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgX19wcmV2ID0gX19wb3M7Ci0gICAgfQotICAgIF9fcG9zID0gX19wcmV2LT5fTV9uZXh0OwotICB9Ci0gIF9TVExQX1JFTEVBU0VfTE9DSyhfX2Jhc2UtPl9NX2xvY2spCi19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+Ci12b2lkIF9TVExQX0NBTEwgX19pbnZhbGlkYXRlX2l0ZXJhdG9yKGNvbnN0IF9fb3duZWRfbGlzdCogX19iYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfSXRlcmF0b3ImIF9faXQpIHsKLSAgdHlwZWRlZiBfX293bmVkX2xpbmsgICBfTF90eXBlOwotICBfU1RMUF9BQ1FVSVJFX0xPQ0soX19iYXNlLT5fTV9sb2NrKQotICBfTF90eXBlKiBfX3ByZXYgPSBfX0NPTlNUX0NBU1QoX0xfdHlwZSosICZfX2Jhc2UtPl9NX25vZGUpOwotICBfTF90eXBlKiBfX3BvcyA9IF9fcHJldi0+X01fbmV4dDsKLSAgd2hpbGUgKF9fcG9zICE9IDApIHsKLSAgICAvLyB0aGlzIHJlcXVpcmVzIHNhZmUgaXRlcmF0b3JzIHRvIGJlIGRlcml2ZWQgZnJvbSBfX293bmVkX2xpbmsKLSAgICBpZiAoKF9fcG9zICE9IF9fU1RBVElDX0NBU1QoY29uc3QgX0xfdHlwZSosICZfX2l0KSkgJiYKLSAgICAgICAgKF9fU1RBVElDX0NBU1QoX0l0ZXJhdG9yKiwgX19wb3MpLT5fTV9pdGVyYXRvciA9PSBfX2l0Ll9NX2l0ZXJhdG9yKSkgewotICAgICAgX19wb3MtPl9NX293bmVyID0gMDsKLSAgICAgIF9fcHJldi0+X01fbmV4dCA9IF9fcG9zLT5fTV9uZXh0OwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIF9fcHJldiA9IF9fcG9zOwotICAgIH0KLSAgICBfX3BvcyA9IF9fcHJldi0+X01fbmV4dDsKLSAgfQotICBfU1RMUF9SRUxFQVNFX0xPQ0soX19iYXNlLT5fTV9sb2NrKQotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgotdm9pZCBfU1RMUF9DQUxMICBfX2NoYW5nZV9yYW5nZV9vd25lcihjb25zdCBfSXRlcmF0b3ImIF9fZmlyc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9JdGVyYXRvciYgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX293bmVkX2xpc3QqIF9fZHN0KSB7Ci0gIGlmIChfX2ZpcnN0Ll9Pd25lcigpID09IF9fZHN0KQotICAgIHJldHVybjsKLQotICB0eXBlZGVmIF9fb3duZWRfbGluayBfTF90eXBlOwotICAvLyBDaGVjayBfX3N0bF9kZWJ1Z19lbmdpbmU8X0R1bW15Pjo6X1N3YXBfb3duZXJzIGNvbW1lbnRzIHRvIHNlZSB3aHkgdGhlcmUgaXMgbm8gbG9jayBoZXJlCi0gIC8vX1NUTFBfQUNRVUlSRV9MT0NLKF9fYmFzZS0+X01fbG9jaykKLSAgX19vd25lZF9saXN0ICpfX2Jhc2UgPSBfX0NPTlNUX0NBU1QoX19vd25lZF9saXN0KiwgX19maXJzdC5fT3duZXIoKSk7Ci0gIF9MX3R5cGUqIF9fc3JjX3ByZXYgPSAmX19iYXNlLT5fTV9ub2RlOwotICBfTF90eXBlKiBfX3BvcyA9IF9fc3JjX3ByZXYtPl9NX25leHQ7Ci0gIF9MX3R5cGUqIF9fZHN0X3ByZXYgPSBfX0NPTlNUX0NBU1QoX0xfdHlwZSosICZfX2RzdC0+X01fbm9kZSk7Ci0KLSAgd2hpbGUgKF9fcG9zICE9IDApIHsKLSAgICBpZiAoISgmX19maXJzdCA9PSBfX1NUQVRJQ19DQVNUKF9JdGVyYXRvciosIF9fcG9zKSB8fCAmX19sYXN0ID09IF9fU1RBVElDX0NBU1QoX0l0ZXJhdG9yKiwgX19wb3MpKSAmJgotICAgICAgICBfX2luX3JhbmdlX2F1eChfX1NUQVRJQ19DQVNUKF9JdGVyYXRvciosIF9fcG9zKS0+X01faXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgIF9fZmlyc3QuX01faXRlcmF0b3IsIF9fbGFzdC5fTV9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfSVRFUkFUT1JfQ0FURUdPUlkoX19maXJzdCwgX0l0ZXJhdG9yKSkpIHsKLSAgICAgIF9fcG9zLT5fTV9vd25lciA9IF9fQ09OU1RfQ0FTVChfX293bmVkX2xpc3QqLCBfX2RzdCk7Ci0gICAgICAvL3JlbW92ZSBfX3BvcyBmcm9tIF9fYmFzZToKLSAgICAgIF9fc3JjX3ByZXYtPl9NX25leHQgPSBfX3Bvcy0+X01fbmV4dDsKLSAgICAgIC8vYWRkIF9fcG9zIHRvIF9fZHN0OgotICAgICAgX19wb3MtPl9NX25leHQgPSBfX2RzdF9wcmV2LT5fTV9uZXh0OwotICAgICAgX19kc3RfcHJldi0+X01fbmV4dCA9IF9fcG9zOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIF9fc3JjX3ByZXYgPSBfX3BvczsKLSAgICB9Ci0gICAgX19wb3MgPSBfX3NyY19wcmV2LT5fTV9uZXh0OwotICB9Ci0gIC8vX1NUTFBfUkVMRUFTRV9MT0NLKF9fYmFzZS0+X01fbG9jaykKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KLXZvaWQgX1NUTFBfQ0FMTCBfX2NoYW5nZV9pdGVfb3duZXIoY29uc3QgX0l0ZXJhdG9yJiBfX2l0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX293bmVkX2xpc3QqIF9fZHN0KSB7Ci0gIGlmIChfX2l0Ll9Pd25lcigpID09IF9fZHN0KQotICAgIHJldHVybjsKLQotICB0eXBlZGVmIF9fb3duZWRfbGluayBfTF90eXBlOwotICAvLyBDaGVjayBfX3N0bF9kZWJ1Z19lbmdpbmU8X0R1bW15Pjo6X1N3YXBfb3duZXJzIGNvbW1lbnRzIHRvIHNlZSB3aHkgdGhlcmUgaXMgbm8gbG9jayBoZXJlCi0gIC8vX1NUTFBfQUNRVUlSRV9MT0NLKF9fYmFzZS0+X01fbG9jaykKLSAgX19vd25lZF9saXN0ICpfX2Jhc2UgPSBfX0NPTlNUX0NBU1QoX19vd25lZF9saXN0KiwgX19pdC5fT3duZXIoKSk7Ci0gIF9MX3R5cGUqIF9fcHJldiA9ICZfX2Jhc2UtPl9NX25vZGU7Ci0gIF9MX3R5cGUqIF9fcG9zID0gX19wcmV2LT5fTV9uZXh0OwotICBfTF90eXBlKiBfX2RzdF9wcmV2ID0gX19DT05TVF9DQVNUKF9MX3R5cGUqLCAmX19kc3QtPl9NX25vZGUpOwotCi0gIHdoaWxlIChfX3BvcyAhPSAwKSB7Ci0gICAgLy8gdGhpcyByZXF1aXJlcyBzYWZlIGl0ZXJhdG9ycyB0byBiZSBkZXJpdmVkIGZyb20gX19vd25lZF9saW5rCi0gICAgaWYgKChfX3BvcyAhPSBfX1NUQVRJQ19DQVNUKGNvbnN0IF9MX3R5cGUqLCAmX19pdCkpICYmCi0gICAgICAgIChfX1NUQVRJQ19DQVNUKF9JdGVyYXRvciosIF9fcG9zKS0+X01faXRlcmF0b3IgPT0gX19pdC5fTV9pdGVyYXRvcikpIHsKLSAgICAgIF9fcG9zLT5fTV9vd25lciA9IF9fQ09OU1RfQ0FTVChfX293bmVkX2xpc3QqLCBfX2RzdCk7Ci0gICAgICAvL3JlbW92ZSBfX3BvcyBmcm9tIF9fYmFzZToKLSAgICAgIF9fcHJldi0+X01fbmV4dCA9IF9fcG9zLT5fTV9uZXh0OwotICAgICAgLy9hZGQgX19wb3MgdG8gX19kc3Q6Ci0gICAgICBfX3Bvcy0+X01fbmV4dCA9IF9fZHN0X3ByZXYtPl9NX25leHQ7Ci0gICAgICBfX2RzdF9wcmV2LT5fTV9uZXh0ID0gX19wb3M7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgX19wcmV2ID0gX19wb3M7Ci0gICAgfQotICAgIF9fcG9zID0gX19wcmV2LT5fTV9uZXh0OwotICB9Ci0gIC8vX1NUTFBfUkVMRUFTRV9MT0NLKF9fYmFzZS0+X01fbG9jaykKLX0KLQotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi1fU1RMUF9FTkRfTkFNRVNQQUNFCi0KLSNlbmRpZiAvKiBfU1RMUF9ERUJVRyAqLwotCi0jaWYgZGVmaW5lZCAoX1NUTFBfRVhQT1NFX0dMT0JBTFNfSU1QTEVNRU5UQVRJT04pCi0KLSMgIGlmbmRlZiBfU1RMUF9JTlRFUk5BTF9DU1RETElCCi0jICAgIGluY2x1ZGUgPHN0bC9fY3N0ZGxpYi5oPgotIyAgZW5kaWYKLQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyAuYyBzZWN0aW9uCi0vLyAgb3duZWRfbGlzdCBub24taW5saW5lIG1ldGhvZHMgYW5kIGdsb2JhbCBmdW5jdGlvbnMKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jICBpZiBkZWZpbmVkIChfU1RMUF9BU1NFUlRJT05TKQotCi1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLV9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKLQotIyAgICBpZiAhZGVmaW5lZCAoX1NUTFBfU1RSSU5HX0xJVEVSQUwpCi0jICAgICAgZGVmaW5lIF9TVExQX1NUUklOR19MSVRFUkFMKF9feCkgX194Ci0jICAgIGVuZGlmCi0KLSMgICAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1dJREVfSU5URVJGQUNFKQotLy8gbm90ZTogV2luQ0UgbmVlZHMgdGhpcyB0byBmb3JtYXQgc2luZ2xlLWJ5dGUgc3RyaW5ncyBpbiBfX3N0bF9kZWJ1Z19lbmdpbmU6Ol9NZXNzYWdlCi0jICAgICAgZGVmaW5lIF9TVExQX1BFUkNFTlRfUyAiJWhzIgotIyAgICBlbHNlCi0jICAgICAgZGVmaW5lIF9TVExQX1BFUkNFTlRfUyAiJXMiCi0jICAgIGVuZGlmIC8qIF9TVExQX1VTRV9XSURFX0lOVEVSRkFDRSAqLwotCi0jICAgIGRlZmluZSBfU1RMUF9NRVNTQUdFX1RBQkxFX0JPRFkgPSB7IFwKLV9TVExQX1NUUklOR19MSVRFUkFMKCJcbiIgX1NUTFBfUEVSQ0VOVF9TICIoJWQpOiBTVEwgZXJyb3I6ICIgX1NUTFBfUEVSQ0VOVF9TICJcbiIpLCBcCi1fU1RMUF9TVFJJTkdfTElURVJBTChfU1RMUF9QRVJDRU5UX1MgIiglZCk6IFNUTCBhc3NlcnRpb24gZmFpbHVyZSA6ICIgX1NUTFBfUEVSQ0VOVF9TICJcbiIgX1NUTFBfQVNTRVJUX01TR19UUkFJTEVSKSwgXAotX1NUTFBfU1RSSU5HX0xJVEVSQUwoIlxuIiBfU1RMUF9QRVJDRU5UX1MgIiglZCk6IFNUTCBlcnJvciA6ICIgX1NUTFBfUEVSQ0VOVF9TICJcbiIgX1NUTFBfUEVSQ0VOVF9TICIoJWQpOiBTVEwgYXNzZXJ0aW9uIGZhaWx1cmU6ICAgICAiIF9TVExQX1BFUkNFTlRfUyAiIFxuIiBfU1RMUF9BU1NFUlRfTVNHX1RSQUlMRVIpLCBcCi1fU1RMUF9TVFJJTkdfTElURVJBTCgiSW52YWxpZCBhcmd1bWVudCB0byBvcGVyYXRpb24gKHNlZSBvcGVyYXRpb24gZG9jdW1lbnRhdGlvbikiKSwgICAgICAgICAgICAgICAgICBcCi1fU1RMUF9TVFJJTkdfTElURVJBTCgiVGFraW5nIGFuIGl0ZXJhdG9yIG91dCBvZiBkZXN0cm95ZWQgKG9yIG90aGVyd2lzZSBjb3JydXB0ZWQpIGNvbnRhaW5lciIpLCAgICAgICBcCi1fU1RMUF9TVFJJTkdfTElURVJBTCgiVHJ5aW5nIHRvIGV4dHJhY3QgYW4gb2JqZWN0IG91dCBmcm9tIGVtcHR5IGNvbnRhaW5lciIpLFwKLV9TVExQX1NUUklOR19MSVRFUkFMKCJQYXN0LXRoZS1lbmQgaXRlcmF0b3IgY291bGQgbm90IGJlIGVyYXNlZCIpLCAgXAotX1NUTFBfU1RSSU5HX0xJVEVSQUwoIkluZGV4IG91dCBvZiBib3VuZHMiKSwgIFwKLV9TVExQX1NUUklOR19MSVRFUkFMKCJDb250YWluZXIgZG9lc24ndCBvd24gdGhlIGl0ZXJhdG9yIiksICBcCi1fU1RMUF9TVFJJTkdfTElURVJBTCgiQ29udGFpbmVyIGlzIG93bmVyIG9mIHRoZSBpdGVyYXRvciwgYnV0IHNob3VsZCBub3QiKSwgIFwKLV9TVExQX1NUUklOR19MSVRFUkFMKCJVbmluaXRpYWxpemVkIG9yIGludmFsaWRhdGVkIChieSBtdXRhdGluZyBvcGVyYXRpb24pIGl0ZXJhdG9yIHVzZWQiKSwgIFwKLV9TVExQX1NUUklOR19MSVRFUkFMKCJVbmluaXRpYWxpemVkIG9yIGludmFsaWRhdGVkIChieSBtdXRhdGluZyBvcGVyYXRpb24pIGxlZnRoYW5kIGl0ZXJhdG9yIGluIGV4cHJlc3Npb24iKSwgIFwKLV9TVExQX1NUUklOR19MSVRFUkFMKCJVbmluaXRpYWxpemVkIG9yIGludmFsaWRhdGVkIChieSBtdXRhdGluZyBvcGVyYXRpb24pIHJpZ2h0aGFuZCBpdGVyYXRvciBpbiBleHByZXNzaW9uIiksICBcCi1fU1RMUF9TVFJJTkdfTElURVJBTCgiSXRlcmF0b3JzIHVzZWQgaW4gZXhwcmVzc2lvbiBhcmUgZnJvbSBkaWZmZXJlbnQgb3duZXJzIiksICBcCi1fU1RMUF9TVFJJTkdfTElURVJBTCgiSXRlcmF0b3IgY291bGQgbm90IGJlIGRlcmVmZXJlbmNlZCAocGFzdC10aGUtZW5kID8pIiksICBcCi1fU1RMUF9TVFJJTkdfTElURVJBTCgiUmFuZ2UgW2ZpcnN0LGxhc3QpIGlzIGludmFsaWQiKSwgIFwKLV9TVExQX1NUUklOR19MSVRFUkFMKCJJdGVyYXRvciBpcyBub3QgaW4gcmFuZ2UgW2ZpcnN0LGxhc3QpIiksICBcCi1fU1RMUF9TVFJJTkdfTElURVJBTCgiUmFuZ2UgW2ZpcnN0LGxhc3QpIGlzIG5vdCBpbiByYW5nZSBbc3RhcnQsZmluaXNoKSIpLCAgXAotX1NUTFBfU1RSSU5HX0xJVEVSQUwoIlRoZSBhZHZhbmNlIHdvdWxkIHByb2R1Y2UgaW52YWxpZCBpdGVyYXRvciIpLCAgXAotX1NUTFBfU1RSSU5HX0xJVEVSQUwoIkl0ZXJhdG9yIGlzIHNpbmd1bGFyIChhZHZhbmNlZCBiZXlvbmQgdGhlIGJvdW5kcyA/KSIpLCAgXAotX1NUTFBfU1RSSU5HX0xJVEVSQUwoIkludmFsaWQgc3RyaWN0IHdlYWsgb3JkZXJpbmcgcHJlZGljYXRlLCBpZiBwcmVkKGEsIGIpIHRoZW4gd2Ugc2hvdWxkIGhhdmUgIXByZWQoYiwgYSkiKSwgXAotX1NUTFBfU1RSSU5HX0xJVEVSQUwoIkludmFsaWQgZXF1aXZhbGVudCBwcmVkaWNhdGUsIGlmIHByZWQoYSwgYikgdGhlbiB3ZSBzaG91bGQgaGF2ZSBwcmVkKGIsIGEpIiksIFwKLV9TVExQX1NUUklOR19MSVRFUkFMKCJNZW1vcnkgYmxvY2sgZGVhbGxvY2F0ZWQgdHdpY2UiKSwgIFwKLV9TVExQX1NUUklOR19MSVRFUkFMKCJEZWFsbG9jYXRpbmcgYSBibG9jayB0aGF0IHdhcyBuZXZlciBhbGxvY2F0ZWQiKSwgIFwKLV9TVExQX1NUUklOR19MSVRFUkFMKCJEZWFsbG9jYXRpbmcgYSBtZW1vcnkgYmxvY2sgYWxsb2NhdGVkIGZvciBhbm90aGVyIHR5cGUiKSwgIFwKLV9TVExQX1NUUklOR19MSVRFUkFMKCJTaXplIG9mIGJsb2NrIHBhc3NlZCB0byBkZWFsbG9jYXRlKCkgZG9lc24ndCBtYXRjaCBibG9jayBzaXplIiksICBcCi1fU1RMUF9TVFJJTkdfTElURVJBTCgiUG9pbnRlciB1bmRlcnJ1biAtIHNhZmV0eSBtYXJnaW4gYXQgZnJvbnQgb2YgbWVtb3J5IGJsb2NrIG92ZXJ3cml0dGVuIiksICBcCi1fU1RMUF9TVFJJTkdfTElURVJBTCgiUG9pbnRlciBvdmVycnJ1biAtIHNhZmV0eSBtYXJnaW4gYXQgYmFjayBvZiBtZW1vcnkgYmxvY2sgb3ZlcndyaXR0ZW4iKSwgICBcCi1fU1RMUF9TVFJJTkdfTElURVJBTCgiQXR0ZW1wdCB0byBkZXJlZmVyZW5jZSBudWxsIHBvaW50ZXIgcmV0dXJuZWQgYnkgYXV0b19wdHI6OmdldCgpIiksICAgXAotX1NUTFBfU1RSSU5HX0xJVEVSQUwoIk1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9uIHJldHVybmVkIGEgd3JvbmdseSBhbGlnbiBtZW1vcnkgYmxvY2siKSwgICBcCi1fU1RMUF9TVFJJTkdfTElURVJBTCgiVW5rbm93biBwcm9ibGVtIikgXAotICB9Ci0KLSMgICAgaWYgKF9TVExQX1NUQVRJQ19URU1QTEFURV9EQVRBID4gMCkKLXRlbXBsYXRlIDxjbGFzcyBfRHVtbXk+Ci1jb25zdCBjaGFyKiBfX3N0bF9kZWJ1Z19lbmdpbmU8X0R1bW15Pjo6X01lc3NhZ2VfdGFibGVbX1N0bE1zZ19NQVhdICBfU1RMUF9NRVNTQUdFX1RBQkxFX0JPRFk7Ci0KLSMgICAgICBpZiAoZGVmaW5lZCAoX19DWUdXSU5fXykgfHwgZGVmaW5lZCAoX19NSU5HVzMyX18pKSAmJiBcCi0gICAgICAgICAgIGRlZmluZWQgKF9TVExQX1VTRV9EWU5BTUlDX0xJQikgJiYgIWRlZmluZWQgKF9fQlVJTERJTkdfU1RMUE9SVCkKLS8qCi0gKiBVbmRlciBjeWd3aW4sIHdoZW4gU1RMcG9ydCBpcyB1c2VkIGFzIGEgc2hhcmVkIGxpYnJhcnksIHRoZSBpZCBuZWVkcwotICogdG8gYmUgc3BlY2lmaWVkIGFzIGltcG9ydGVkIG90aGVyd2lzZSB0aGV5IHdpbGwgYmUgZHVwbGljYXRlZCBpbiB0aGUKLSAqIGNhbGxpbmcgZXhlY3V0YWJsZS4KLSAqLwotX1NUTFBfVEVNUExBVEVfTlVMTAotX1NUTFBfREVDTFNQRUMgY29uc3QgY2hhciogX19zdGxfZGVidWdfZW5naW5lPGJvb2w+OjpfTWVzc2FnZV90YWJsZVtfU3RsTXNnX01BWF07Ci0jICAgICAgZW5kaWYKLQotIyAgICBlbHNlCi1fX0RFQ0xBUkVfSU5TVEFOQ0UoY29uc3QgY2hhciosIF9fc3RsX2RlYnVnX2VuZ2luZTxib29sPjo6X01lc3NhZ2VfdGFibGVbX1N0bE1zZ19NQVhdLAotICAgICAgICAgICAgICAgICAgIF9TVExQX01FU1NBR0VfVEFCTEVfQk9EWSk7Ci0jICAgIGVuZGlmCi0KLSMgICAgdW5kZWYgX1NUTFBfU1RSSU5HX0xJVEVSQUwKLSMgICAgdW5kZWYgX1NUTFBfUEVSQ0VOVF9TCi0KLV9TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQotX1NUTFBfRU5EX05BTUVTUEFDRQotCi0vLyBhYm9ydCgpCi0jICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1NURExJQgotIyAgICBpbmNsdWRlIDxzdGwvX2NzdGRsaWIuaD4KLSMgIGVuZGlmCi0KLSMgIGlmICFkZWZpbmVkIChfU1RMUF9ERUJVR19NRVNTQUdFKQotIyAgICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1NUREFSRwotIyAgICAgIGluY2x1ZGUgPHN0bC9fY3N0ZGFyZy5oPgotIyAgICBlbmRpZgotIyAgICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1NURElPCi0jICAgICAgaW5jbHVkZSA8c3RsL19jc3RkaW8uaD4KLSMgICAgZW5kaWYKLSMgICAgaWYgZGVmaW5lZCAoX1NUTFBfREVCVUdfTU9ERV9USFJPV1MpICYmICFkZWZpbmVkIChfU1RMUF9SQU5HRV9FUlJPUlNfSCkKLSMgICAgICBpbmNsdWRlIDxzdGwvX3JhbmdlX2Vycm9ycy5oPgotIyAgICBlbmRpZgotCi1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLV9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKLQotdGVtcGxhdGUgPGNsYXNzIF9EdW1teT4KLXZvaWQgX1NUTFBfQ0FMTAotX19zdGxfZGVidWdfZW5naW5lPF9EdW1teT46Ol9NZXNzYWdlKGNvbnN0IGNoYXIgKiBfX2Zvcm1hdF9zdHIsIC4uLikgewotICBTVExQT1JUX0NTVEQ6OnZhX2xpc3QgX19hcmdzOwotICB2YV9zdGFydCggX19hcmdzLCBfX2Zvcm1hdF9zdHIgKTsKLQotIyAgICAgIGlmICFkZWZpbmVkIChfU1RMUF9ERUJVR19NT0RFX1RIUk9XUykKLSMgICAgICAgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9XSURFX0lOVEVSRkFDRSkKLSAgVENIQVIgX19idWZmZXJbNTEyXTsKLSAgaW50IF9jb252ZXJ0ID0gc3RybGVuKF9fZm9ybWF0X3N0cikgKyAxOwotICBMUFdTVFIgX2xwdyA9IChMUFdTVFIpYWxsb2NhKF9jb252ZXJ0ICogc2l6ZW9mKHdjaGFyX3QpKTsKLSAgX2xwd1swXSA9ICdcMCc7Ci0gIE11bHRpQnl0ZVRvV2lkZUNoYXIoR2V0QUNQKCksIDAsIF9fZm9ybWF0X3N0ciwgLTEsIF9scHcsIF9jb252ZXJ0KTsKLSAgd3ZzcHJpbnRmKF9fYnVmZmVyLCBfbHB3LCBfX2FyZ3MpOwotICBfU1RMUF9XSU5DRV9UUkFDRShfX2J1ZmZlcik7Ci0jICAgICAgICBlbGlmIGRlZmluZWQgKF9TVExQX1dJTjMyKSAmJiAoZGVmaW5lZChfU1RMUF9NU1ZDKSB8fCBkZWZpbmVkIChfX0lDTCkpCi0gIGNoYXIgX19idWZmZXIgWzQwOTZdOwotCi0jICAgICAgICAgIGlmICFkZWZpbmVkIChfU1RMUF9VU0VfU0FGRV9TVFJJTkdfRlVOQ1RJT05TKQotICB2c25wcmludGYoX19idWZmZXIsIF9TVExQX0FSUkFZX1NJWkUoX19idWZmZXIpLCBfX2Zvcm1hdF9zdHIsIF9fYXJncyk7Ci0jICAgICAgICAgIGVsc2UKLSAgdnNucHJpbnRmX3MoX19idWZmZXIsIF9TVExQX0FSUkFZX1NJWkUoX19idWZmZXIpLCBfVFJVTkNBVEUsIF9fZm9ybWF0X3N0ciwgX19hcmdzKTsKLSMgICAgICAgICAgZW5kaWYKLQotICBPdXRwdXREZWJ1Z1N0cmluZ0EoX19idWZmZXIpOwotCi0jICAgICAgICBlbGlmIGRlZmluZWQgKF9fYW1pZ2Fvc19fKQotICBTVExQT1JUX0NTVEQ6OnZmcHJpbnRmKHN0ZGVyciwgX19mb3JtYXRfc3RyLCAoY2hhciAqKV9fYXJncyk7Ci0jICAgICAgICBlbHNlCi0gIFNUTFBPUlRfQ1NURDo6dmZwcmludGYoc3RkZXJyLCBfX2Zvcm1hdF9zdHIsIF9fYXJncyk7Ci0jICAgICAgICBlbmRpZgotIyAgICAgIGVsc2UKLSAgY2hhciBfX2J1ZmZlcls0MDk2XTsKLQotIyAgICAgICAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1NBRkVfU1RSSU5HX0ZVTkNUSU9OUykKLSAgdnNucHJpbnRmX3MoX19idWZmZXIsIF9TVExQX0FSUkFZX1NJWkUoX19idWZmZXIpLCBfVFJVTkNBVEUsIF9fZm9ybWF0X3N0ciwgX19hcmdzKTsKLSMgICAgICAgIGVsaWYgZGVmaW5lZCAoX1NUTFBfV0lOMzIpICYmIChkZWZpbmVkKF9TVExQX01TVkMpIHx8IGRlZmluZWQgKF9fSUNMKSkKLSAgdnNucHJpbnRmKF9fYnVmZmVyLCBfU1RMUF9BUlJBWV9TSVpFKF9fYnVmZmVyKSwgX19mb3JtYXRfc3RyLCBfX2FyZ3MpOwotIyAgICAgICAgZWxzZQotICB2c3ByaW50ZihfX2J1ZmZlciwgX19mb3JtYXRfc3RyLCBfX2FyZ3MpOwotIyAgICAgICAgZW5kaWYKLSMgICAgICBlbmRpZgotCi0jICAgICAgaWZkZWYgX1NUTFBfREVCVUdfTUVTU0FHRV9QT1NUCi0gIF9TVExQX0RFQlVHX01FU1NBR0VfUE9TVAotIyAgICAgIGVuZGlmCi0KLSAgdmFfZW5kKF9fYXJncyk7Ci0KLSMgICAgICBpZiBkZWZpbmVkIChfU1RMUF9ERUJVR19NT0RFX1RIUk9XUykKLSAgX19zdGxfdGhyb3dfcnVudGltZV9lcnJvcihfX2J1ZmZlcik7Ci0jICAgICAgZW5kaWYKLX0KLQotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi1fU1RMUF9FTkRfTkFNRVNQQUNFCi0KLSMgICAgZWxzZQotX1NUTFBfQkVHSU5fTkFNRVNQQUNFCi1fU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCi10ZW1wbGF0ZSA8Y2xhc3MgX0R1bW15Pgotdm9pZCBfU1RMUF9DQUxMCi1fX3N0bF9kZWJ1Z19lbmdpbmU8X0R1bW15Pjo6X01lc3NhZ2UoY29uc3QgY2hhciAqIF9fZm9ybWF0X3N0ciwgLi4uKQote30KLV9TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQotX1NUTFBfRU5EX05BTUVTUEFDRQotIyAgICBlbmRpZiAvKiBfU1RMUF9ERUJVR19NRVNTQUdFICovCi0KLV9TVExQX0JFR0lOX05BTUVTUEFDRQotX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0R1bW15Pgotdm9pZCBfU1RMUF9DQUxMCi1fX3N0bF9kZWJ1Z19lbmdpbmU8X0R1bW15Pjo6X0luZGV4ZWRFcnJvcihpbnQgX19lcnJvcl9pbmQsIGNvbnN0IGNoYXIqIF9fZiwgaW50IF9fbCkgewotICBfX3N0bF9kZWJ1Z19tZXNzYWdlKF9NZXNzYWdlX3RhYmxlW19TdGxGb3JtYXRfRVJST1JfUkVUVVJOXSwKLSAgICAgICAgICAgICAgICAgICAgICBfX2YsIF9fbCwgX01lc3NhZ2VfdGFibGVbX19lcnJvcl9pbmRdKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9EdW1teT4KLXZvaWQgX1NUTFBfQ0FMTAotX19zdGxfZGVidWdfZW5naW5lPF9EdW1teT46Ol9WZXJib3NlQXNzZXJ0KGNvbnN0IGNoYXIqIF9fZXhwciwgaW50IF9fZXJyb3JfaW5kLCBjb25zdCBjaGFyKiBfX2YsIGludCBfX2wpIHsKLSAgX19zdGxfZGVidWdfbWVzc2FnZShfTWVzc2FnZV90YWJsZVtfU3RsRm9ybWF0X1ZFUkJPU0VfQVNTRVJUSU9OX0ZBSUxVUkVdLAotICAgICAgICAgICAgICAgICAgICAgIF9fZiwgX19sLCBfTWVzc2FnZV90YWJsZVtfX2Vycm9yX2luZF0sIF9fZiwgX19sLCBfX2V4cHIpOwotICBfX3N0bF9kZWJ1Z190ZXJtaW5hdGUoKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9EdW1teT4KLXZvaWQgX1NUTFBfQ0FMTAotX19zdGxfZGVidWdfZW5naW5lPF9EdW1teT46Ol9Bc3NlcnQoY29uc3QgY2hhciogX19leHByLCBjb25zdCBjaGFyKiBfX2YsIGludCBfX2wpIHsKLSAgX19zdGxfZGVidWdfbWVzc2FnZShfTWVzc2FnZV90YWJsZVtfU3RsRm9ybWF0X0FTU0VSVElPTl9GQUlMVVJFXSxfX2YsIF9fbCwgX19leHByKTsKLSAgX19zdGxfZGVidWdfdGVybWluYXRlKCk7Ci19Ci0KLS8vIGlmIGV4Y2VwdGlvbnMgYXJlIHByZXNlbnQsIHNlbmRzIHVuaXF1ZSBleGNlcHRpb24KLS8vIGlmIG5vdCwgY2FsbHMgYWJvcnQoKSB0byB0ZXJtaW5hdGUKLXRlbXBsYXRlIDxjbGFzcyBfRHVtbXk+Ci12b2lkIF9TVExQX0NBTEwKLV9fc3RsX2RlYnVnX2VuZ2luZTxfRHVtbXk+OjpfVGVybWluYXRlKCkKLXsgX1NUTFBfQUJPUlQoKTsgfQotCi1fU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKLV9TVExQX0VORF9OQU1FU1BBQ0UKLQotIyAgZW5kaWYgLyogX1NUTFBfQVNTRVJUSU9OUyAqLwotCi0jICBpZiBkZWZpbmVkIChfU1RMUF9ERUJVRykKLQotX1NUTFBfQkVHSU5fTkFNRVNQQUNFCi1fU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCi0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gIG93bmVkX2xpc3Qgbm9uLWlubGluZSBtZXRob2RzCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotdGVtcGxhdGUgPGNsYXNzIF9EdW1teT4KLXZvaWQgIF9TVExQX0NBTEwKLV9fc3RsX2RlYnVnX2VuZ2luZTxfRHVtbXk+OjpfSW52YWxpZGF0ZV9hbGwoX19vd25lZF9saXN0KiBfX2wpIHsKLSAgX1NUTFBfQUNRVUlSRV9MT0NLKF9fbC0+X01fbG9jayk7Ci0gIF9TdGFtcF9hbGwoX19sLCAwKTsKLSAgX19sLT5fTV9ub2RlLl9NX25leHQgPTA7Ci0gIF9TVExQX1JFTEVBU0VfTE9DSyhfX2wtPl9NX2xvY2spOwotfQotCi0vLyBib3JpcyA6IHRoaXMgaXMgdW5hc2FmZSByb3V0aW5lOyBzaG91bGQgYmUgdXNlZCBmcm9tIHdpdGhpbiBjcml0aWNhbCBzZWN0aW9uIG9ubHkgIQotdGVtcGxhdGUgPGNsYXNzIF9EdW1teT4KLXZvaWQgIF9TVExQX0NBTEwKLV9fc3RsX2RlYnVnX2VuZ2luZTxfRHVtbXk+OjpfU3RhbXBfYWxsKF9fb3duZWRfbGlzdCogX19sLCBfX293bmVkX2xpc3QqIF9fbykgewotICAvLyBjcnVjaWFsCi0gIGlmIChfX2wtPl9NX25vZGUuX01fb3duZXIpIHsKLSAgICBmb3IgKF9fb3duZWRfbGluayogIF9fcG9zID0gKF9fb3duZWRfbGluayopX19sLT5fTV9ub2RlLl9NX25leHQ7Ci0gICAgICBfX3BvcyAhPSAwOyBfX3BvcyA9IChfX293bmVkX2xpbmsqKV9fcG9zLT5fTV9uZXh0KSB7Ci0gICAgICBfU1RMUF9BU1NFUlQoX19wb3MtPl9Pd25lcigpPT0gX19sKQotICAgICAgX19wb3MtPl9NX293bmVyPV9fbzsKLSAgICB9Ci0gIH0KLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9EdW1teT4KLXZvaWQgIF9TVExQX0NBTEwKLV9fc3RsX2RlYnVnX2VuZ2luZTxfRHVtbXk+OjpfVmVyaWZ5KGNvbnN0IF9fb3duZWRfbGlzdCogX19sKSB7Ci0gIF9TVExQX0FDUVVJUkVfTE9DSyhfX2wtPl9NX2xvY2spOwotICBpZiAoX19sKSB7Ci0gICAgX1NUTFBfQVNTRVJUKF9fbC0+X01fbm9kZS5fT3duZXIoKSAhPSAwKQotICAgIGZvciAoX19vd25lZF9saW5rKiBfX3BvcyA9IChfX293bmVkX2xpbmsqKV9fbC0+X01fbm9kZS5fTV9uZXh0OwotICAgICAgICAgX19wb3MgIT0gMDsgX19wb3MgPSAoX19vd25lZF9saW5rKilfX3Bvcy0+X01fbmV4dCkgewotICAgICAgX1NUTFBfQVNTRVJUKF9fcG9zLT5fT3duZXIoKT09IF9fbCkKLSAgICB9Ci0gIH0KLSAgX1NUTFBfUkVMRUFTRV9MT0NLKF9fbC0+X01fbG9jayk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfRHVtbXk+Ci12b2lkIF9TVExQX0NBTEwKLV9fc3RsX2RlYnVnX2VuZ2luZTxfRHVtbXk+OjpfU3dhcF9vd25lcnMoX19vd25lZF9saXN0JiBfX3gsIF9fb3duZWRfbGlzdCYgX195KSB7Ci0gIC8qCi0gICAqICBhY2NvcmRpbmcgdG8gdGhlIHN0YW5kYXJkIDogLS1ubyBzd2FwKCkgZnVuY3Rpb24gaW52YWxpZGF0ZXMgYW55IHJlZmVyZW5jZXMsCi0gICAqICBwb2ludGVycywgIG9yICBpdGVyYXRvcnMgcmVmZXJyaW5nIHRvIHRoZSBlbGVtZW50cyBvZiB0aGUgY29udGFpbmVycyBiZWluZyBzd2FwcGVkLgotICAgKi8KLQotICBfX293bmVkX2xpbmsqIF9fdG1wOwotCi0gIC8qCi0gICAqIGJvcmlzIDogdGhlcmUgaXMgYSBkZWFkbG9jayBwb3RlbnRpYWwgc2l0dWF0aW9uIGhlcmUgaWYgd2UgbG9jayB0d28gY29udGFpbmVycyBzZXF1ZW50aWFsbHkuCi0gICAqIEFzIHVzZXIgaXMgc3VwcG9zZWQgdG8gcHJvdmlkZSBpdHMgb3duIHN5bmNocm9uaXphdGlvbiBhcm91bmQgc3dhcCgpICggaXQgaXMgdW5zYWZlIHRvIGRvIGFueSBjb250YWluZXIvaXRlcmF0b3IgYWNjZXNzCi0gICAqIGluIHBhcmFsbGVsIHdpdGggc3dhcCgpKSwgd2UganVzdCBkbyBub3QgdXNlIGFueSBsb2NraW5nIGF0IGFsbCAtLSB0aGF0IGJlaGF2aW91ciBpcyBjbG9zZXIgdG8gbm9uLWRlYnVnIHZlcnNpb24KLSAgICovCi0KLSAgX190bXAgPSBfX3guX01fbm9kZS5fTV9uZXh0OwotCi0gIF9TdGFtcF9hbGwoJl9feCwgJl9feSk7Ci0gIF9TdGFtcF9hbGwoJl9feSwgJl9feCk7Ci0KLSAgX194Ll9NX25vZGUuX01fbmV4dCA9IF9feS5fTV9ub2RlLl9NX25leHQ7Ci0gIF9feS5fTV9ub2RlLl9NX25leHQgPSBfX3RtcDsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9EdW1teT4KLXZvaWQgX1NUTFBfQ0FMTAotX19zdGxfZGVidWdfZW5naW5lPF9EdW1teT46Ol9TZXRfb3duZXIoX19vd25lZF9saXN0JiBfX3NyYywgX19vd25lZF9saXN0JiBfX2RzdCkgewotICBpZiAoJl9fc3JjID09ICZfX2RzdCkKLSAgICByZXR1cm47Ci0KLSAgLy8gQ2hlY2sgX19zdGxfZGVidWdfZW5naW5lPF9EdW1teT46Ol9Td2FwX293bmVycyBjb21tZW50cyB0byBzZWUgd2h5IHRoZXJlIGlzIG5vIGxvY2sgaGVyZQotICB0eXBlZGVmIF9fb3duZWRfbGluayBfTF90eXBlOwotICBfTF90eXBlKiBfX3ByZXYgPSAmX19zcmMuX01fbm9kZTsKLSAgX0xfdHlwZSogX19wb3MgPSBfX3ByZXYtPl9NX25leHQ7Ci0KLSAgd2hpbGUgKF9fcG9zICE9IDApIHsKLSAgICBfX3Bvcy0+X01fb3duZXIgPSAmX19kc3Q7Ci0gICAgX19wcmV2ID0gX19wb3M7Ci0gICAgX19wb3MgPSBfX3ByZXYtPl9NX25leHQ7Ci0gIH0KLSAgX19wcmV2LT5fTV9uZXh0ID0gX19kc3QuX01fbm9kZS5fTV9uZXh0OwotICBfX2RzdC5fTV9ub2RlLl9NX25leHQgPSBfX3NyYy5fTV9ub2RlLl9NX25leHQ7Ci0gIF9fc3JjLl9NX25vZGUuX01fbmV4dCA9IDA7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfRHVtbXk+Ci12b2lkIF9TVExQX0NBTEwKLV9fc3RsX2RlYnVnX2VuZ2luZTxfRHVtbXk+OjpfTV9kZXRhY2goX19vd25lZF9saXN0KiBfX2wsIF9fb3duZWRfbGluayogX19jX25vZGUpIHsKLSAgaWYgKF9fbCAgIT0gMCkgewotCi0gICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoX19sLT5fT3duZXIoKSE9MCwgX1N0bE1zZ19JTlZBTElEX0NPTlRBSU5FUikKLQotICAgIF9TVExQX0FDUVVJUkVfTE9DSyhfX2wtPl9NX2xvY2spCi0gICAgICAvLyBib3JpcyA6IHJlLXRlc3QgdGhlIGNvbmRpdGlvbiBpbiBjYXNlIHNvbWVvbmUgZWxzZSBhbHJlYWR5IGRlbGV0ZWQgdXMKLSAgICAgIGlmKF9fY19ub2RlLT5fTV9vd25lciAhPSAwKSB7Ci0gICAgICAgIF9fb3duZWRfbGluayogX19wcmV2LCAqX19uZXh0OwotCi0gICAgICAgIGZvciAoX19wcmV2ID0gJl9fbC0+X01fbm9kZTsgKF9fbmV4dCA9IF9fcHJldi0+X01fbmV4dCkgIT0gX19jX25vZGU7Ci0gICAgICAgICAgICAgX19wcmV2ID0gX19uZXh0KSB7Ci0gICAgICAgICAgX1NUTFBfQVNTRVJUKF9fbmV4dCAmJiBfX25leHQtPl9Pd25lcigpID09IF9fbCkKLSAgICAgICAgICAgIH0KLQotICAgICAgICBfX3ByZXYtPl9NX25leHQgPSBfX2Nfbm9kZS0+X01fbmV4dDsKLSAgICAgICAgX19jX25vZGUtPl9NX293bmVyPTA7Ci0gICAgICB9Ci0gICAgX1NUTFBfUkVMRUFTRV9MT0NLKF9fbC0+X01fbG9jaykKLSAgfQotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0R1bW15Pgotdm9pZCBfU1RMUF9DQUxMCi1fX3N0bF9kZWJ1Z19lbmdpbmU8X0R1bW15Pjo6X01fYXR0YWNoKF9fb3duZWRfbGlzdCogX19sLCBfX293bmVkX2xpbmsqIF9fY19ub2RlKSB7Ci0gIGlmIChfX2wgPT0wKSB7Ci0gICAgKF9fY19ub2RlKS0+X01fb3duZXIgPSAwOwotICB9IGVsc2UgewotICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKF9fbC0+X093bmVyKCkhPTAsIF9TdGxNc2dfSU5WQUxJRF9DT05UQUlORVIpCi0gICAgX1NUTFBfQUNRVUlSRV9MT0NLKF9fbC0+X01fbG9jaykKLSAgICBfX2Nfbm9kZS0+X01fb3duZXIgPSBfX2w7Ci0gICAgX19jX25vZGUtPl9NX25leHQgPSBfX2wtPl9NX25vZGUuX01fbmV4dDsKLSAgICBfX2wtPl9NX25vZGUuX01fbmV4dCA9IF9fY19ub2RlOwotICAgIF9TVExQX1JFTEVBU0VfTE9DSyhfX2wtPl9NX2xvY2spCi0gIH0KLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9EdW1teT4KLXZvaWQqIF9TVExQX0NBTEwKLV9fc3RsX2RlYnVnX2VuZ2luZTxfRHVtbXk+OjpfR2V0X2NvbnRhaW5lcl9wdHIoY29uc3QgX19vd25lZF9saW5rKiBfX2wpIHsKLSAgY29uc3QgX19vd25lZF9saXN0KiBfX293bmVyICAgID0gX19sLT5fT3duZXIoKTsKLSAgX1NUTFBfVkVSQk9TRV9SRVRVUk5fMChfX293bmVyICE9IDAsIF9TdGxNc2dfSU5WQUxJRF9JVEVSQVRPUikKLSAgdm9pZCogX19yZXQgPSBfX0NPTlNUX0NBU1Qodm9pZCosX19vd25lci0+X093bmVyKCkpOwotICBfU1RMUF9WRVJCT1NFX1JFVFVSTl8wKF9fcmV0ICE9MCwgX1N0bE1zZ19JTlZBTElEX0NPTlRBSU5FUikKLSAgcmV0dXJuIF9fcmV0OwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0R1bW15PgotYm9vbCBfU1RMUF9DQUxMCi1fX3N0bF9kZWJ1Z19lbmdpbmU8X0R1bW15Pjo6X0NoZWNrX3NhbWVfb3duZXIoY29uc3QgX19vd25lZF9saW5rJiBfX2kxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fb3duZWRfbGluayYgX19pMikgewotICBfU1RMUF9WRVJCT1NFX1JFVFVSTihfX2kxLl9WYWxpZCgpLCBfU3RsTXNnX0lOVkFMSURfTEVGVEhBTkRfSVRFUkFUT1IpCi0gIF9TVExQX1ZFUkJPU0VfUkVUVVJOKF9faTIuX1ZhbGlkKCksIF9TdGxNc2dfSU5WQUxJRF9SSUdIVEhBTkRfSVRFUkFUT1IpCi0gIF9TVExQX1ZFUkJPU0VfUkVUVVJOKChfX2kxLl9Pd25lcigpID09IF9faTIuX093bmVyKCkpLCBfU3RsTXNnX0RJRkZFUkVOVF9PV05FUlMpCi0gIHJldHVybiB0cnVlOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0R1bW15PgotYm9vbCBfU1RMUF9DQUxMCi1fX3N0bF9kZWJ1Z19lbmdpbmU8X0R1bW15Pjo6X0NoZWNrX3NhbWVfb3JfbnVsbF9vd25lcihjb25zdCBfX293bmVkX2xpbmsmIF9faTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX293bmVkX2xpbmsmIF9faTIpIHsKLSAgX1NUTFBfVkVSQk9TRV9SRVRVUk4oX19pMS5fT3duZXIoKSA9PSBfX2kyLl9Pd25lcigpLCBfU3RsTXNnX0RJRkZFUkVOVF9PV05FUlMpCi0gIHJldHVybiB0cnVlOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0R1bW15PgotYm9vbCBfU1RMUF9DQUxMCi1fX3N0bF9kZWJ1Z19lbmdpbmU8X0R1bW15Pjo6X0NoZWNrX2lmX293bmVyKCBjb25zdCBfX293bmVkX2xpc3QgKiBfX2wsIGNvbnN0IF9fb3duZWRfbGluayYgX19pdCkgewotICBjb25zdCBfX293bmVkX2xpc3QqIF9fb3duZXJfcHRyID0gX19pdC5fT3duZXIoKTsKLSAgX1NUTFBfVkVSQk9TRV9SRVRVUk4oX19vd25lcl9wdHIgIT0gMCwgX1N0bE1zZ19JTlZBTElEX0lURVJBVE9SKQotICBfU1RMUF9WRVJCT1NFX1JFVFVSTihfX2wgPT0gX19vd25lcl9wdHIsIF9TdGxNc2dfTk9UX09XTkVSKQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9EdW1teT4KLWJvb2wgX1NUTFBfQ0FMTAotX19zdGxfZGVidWdfZW5naW5lPF9EdW1teT46Ol9DaGVja19pZl9ub3Rfb3duZXIoIGNvbnN0IF9fb3duZWRfbGlzdCAqIF9fbCwgY29uc3QgX19vd25lZF9saW5rJiBfX2l0KSB7Ci0gIGNvbnN0IF9fb3duZWRfbGlzdCogX19vd25lcl9wdHIgPSBfX2l0Ll9Pd25lcigpOwotICBfU1RMUF9WRVJCT1NFX1JFVFVSTihfX293bmVyX3B0ciAhPSAwLCBfU3RsTXNnX0lOVkFMSURfSVRFUkFUT1IpCi0gIF9TVExQX1ZFUkJPU0VfUkVUVVJOKF9fbCAhPSBfX293bmVyX3B0ciwgX1N0bE1zZ19TSE9VTERfTk9UX09XTkVSKQotICByZXR1cm4gdHJ1ZTsKLX0KLQotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi1fU1RMUF9FTkRfTkFNRVNQQUNFCi0KLSMgIGVuZGlmIC8qIF9TVExQX0RFQlVHICovCi0KLSNlbmRpZiAvKiBpZiBkZWZpbmVkIChFWFBPU0VfR0xPQkFMU19JTVBMRU1FTlRBVElPTikgKi8KLQotI2VuZGlmIC8qIGhlYWRlciBndWFyZCAqLwotCi0vLyBMb2NhbCBWYXJpYWJsZXM6Ci0vLyBtb2RlOkMrKwotLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RsL2RlYnVnL19kZWJ1Zy5oIGIvc3RsL2RlYnVnL19kZWJ1Zy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGU2MjE4Li4wMDAwMDAwCi0tLSBhL3N0bC9kZWJ1Zy9fZGVidWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ2MCArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NwotICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogQm9yaXMgRm9taXRjaGV2Ci0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICovCi0KLSNpZm5kZWYgX1NUTFBfREVCVUdfSAotI2RlZmluZSBfU1RMUF9ERUJVR19ICi0KLSNpZiBkZWZpbmVkIChfU1RMUF9BU1NFUlRJT05TKSB8fCBkZWZpbmVkIChfU1RMUF9ERUJVRykKLQotIyAgaWZuZGVmIF9TVExQX1RZUEVfVFJBSVRTX0gKLSMgICAgaW5jbHVkZSA8c3RsL3R5cGVfdHJhaXRzLmg+Ci0jICBlbmRpZgotCi0jICBpZiAhZGVmaW5lZCAoX1NUTFBfRVhUUkFfT1BFUkFUT1JTX0ZPUl9ERUJVRykgJiYgXAotICAgICAgKGRlZmluZWQgKF9TVExQX0JBU0VfTUFUQ0hfQlVHKSB8fCAoZGVmaW5lZCAoX1NUTFBfTVNWQykgJiYgX1NUTFBfTVNWQyA8IDExMDApKQotIyAgICBkZWZpbmUgX1NUTFBfRVhUUkFfT1BFUkFUT1JTX0ZPUl9ERUJVRwotIyAgZW5kaWYKLQotIyAgaWYgIWRlZmluZWQgKF9TVExQX0ZJTEVfXykKLSMgICAgZGVmaW5lIF9TVExQX0ZJTEVfXyBfX0ZJTEVfXwotIyAgZW5kaWYKLQotX1NUTFBfQkVHSU5fTkFNRVNQQUNFCi0KLV9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKLQotZW51bSB7Ci0gIC8vR2VuZXJhbCBlcnJvcnMKLSAgX1N0bEZvcm1hdF9FUlJPUl9SRVRVUk4sCi0gIF9TdGxGb3JtYXRfQVNTRVJUSU9OX0ZBSUxVUkUsCi0gIF9TdGxGb3JtYXRfVkVSQk9TRV9BU1NFUlRJT05fRkFJTFVSRSwKLSAgX1N0bE1zZ19JTlZBTElEX0FSR1VNRU5ULAotICAvL0NvbnRhaW5lci9JdGVyYXRvciByZWxhdGVkIGVycm9ycwotICBfU3RsTXNnX0lOVkFMSURfQ09OVEFJTkVSLAotICBfU3RsTXNnX0VNUFRZX0NPTlRBSU5FUiwKLSAgX1N0bE1zZ19FUkFTRV9QQVNUX1RIRV9FTkQsCi0gIF9TdGxNc2dfT1VUX09GX0JPVU5EUywKLSAgX1N0bE1zZ19OT1RfT1dORVIsCi0gIF9TdGxNc2dfU0hPVUxEX05PVF9PV05FUiwKLSAgX1N0bE1zZ19JTlZBTElEX0lURVJBVE9SLAotICBfU3RsTXNnX0lOVkFMSURfTEVGVEhBTkRfSVRFUkFUT1IsCi0gIF9TdGxNc2dfSU5WQUxJRF9SSUdIVEhBTkRfSVRFUkFUT1IsCi0gIF9TdGxNc2dfRElGRkVSRU5UX09XTkVSUyAgICAgLAotICBfU3RsTXNnX05PVF9ERVJFRkVSRU5DRUFCTEUgICwKLSAgX1N0bE1zZ19JTlZBTElEX1JBTkdFICAgICAgICAsCi0gIF9TdGxNc2dfTk9UX0lOX1JBTkdFXzEgICAgICAgLAotICBfU3RsTXNnX05PVF9JTl9SQU5HRV8yICAgICAgICwKLSAgX1N0bE1zZ19JTlZBTElEX0FEVkFOQ0UgICAgICAsCi0gIF9TdGxNc2dfU0lOR1VMQVJfSVRFUkFUT1IgICAgLAotICAvL0JhZCBwcmVkaWNhdGUgZm9yIHNvcnRpbmcKLSAgX1N0bE1zZ19JTlZBTElEX1NUUklDVF9XRUFLX1BSRURJQ0FURSwKLSAgX1N0bE1zZ19JTlZBTElEX0VRVUlWQUxFTlRfUFJFRElDQVRFLAotICAvLyBkZWJ1ZyBhbGxvYyBtZXNzYWdlcwotICBfU3RsTXNnX0RCQV9ERUxFVEVEX1RXSUNFICAgICwKLSAgX1N0bE1zZ19EQkFfTkVWRVJfQUxMT0NBVEVEICAsCi0gIF9TdGxNc2dfREJBX1RZUEVfTUlTTUFUQ0ggICAgLAotICBfU3RsTXNnX0RCQV9TSVpFX01JU01BVENIICAgICwKLSAgX1N0bE1zZ19EQkFfVU5ERVJSVU4gICAgICAgICAsCi0gIF9TdGxNc2dfREJBX09WRVJSVU4gICAgICAgICAgLAotICAvLyBhdXRvX3B0ciBtZXNzYWdlcwotICBfU3RsTXNnX0FVVE9fUFRSX05VTEwgICAgLAotICAvL01lbW9yeSBhbGlnbmVudCBtZXNzYWdlCi0gIF9TdGxNc2dfV1JPTkdfTUVNT1JZX0FMSUdOTUVOVCwKLSAgX1N0bE1zZ19VTktOT1dOCi0gIC8qIF9TdGxNc2dfTUFYICovCi19OwotCi0vKiBoYXZlIHRvIGhhcmRjb2RlIHRoYXQgOygpICovCi0jICBkZWZpbmUgX1N0bE1zZ19NQVggMzEKLQotLy8gVGhpcyBjbGFzcyBpcyB1bmlxdWUgKG5vdCBpbmhlcml0ZWQgZnJvbSBleGNlcHRpb24pLAotLy8gdG8gZGlzYWxsb3cgY2F0Y2ggaW4gYW55dGhpbmcgYnV0ICguLi4pCi1zdHJ1Y3QgX19zdGxfZGVidWdfZXhjZXB0aW9uIHsKLSAgLy8gbm8gbWVtYmVycwotfTsKLQotY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgX19vd25lZF9saW5rOwotY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgX19vd25lZF9saXN0OwotCi0jaWYgZGVmaW5lZCAoX1NUTFBfREVCVUdfTU9ERV9USFJPV1MpCi0jICBkZWZpbmUgX1NUTFBfTUVTU0FHRV9OT1JFVFVSTiBfU1RMUF9GVU5DVElPTl9USFJPV1MKLSNlbHNlCi0jICBkZWZpbmUgX1NUTFBfTUVTU0FHRV9OT1JFVFVSTgotI2VuZGlmCi0KLXRlbXBsYXRlIDxjbGFzcyBfRHVtbXk+Ci1zdHJ1Y3QgX19zdGxfZGVidWdfZW5naW5lIHsKLQotICAvLyBCYXNpYyByb3V0aW5lIHRvIHJlcG9ydCBhbnkgZGVidWcgbWVzc2FnZQotICAvLyBVc2UgX1NUTFBfREVCVUdfTUVTU0FHRSB0byBvdmVycmlkZQotICBzdGF0aWMgdm9pZCBfU1RMUF9NRVNTQUdFX05PUkVUVVJOIF9TVExQX0NBTEwgX01lc3NhZ2UoY29uc3QgY2hhciAqIGZvcm1hdF9zdHIsIC4uLik7Ci0KLSAgLy8gTWljc2VsbGFub3VzIGZ1bmN0aW9uIHRvIHJlcG9ydCBpbmRleGVkIGVycm9yIG1lc3NhZ2UKLSAgc3RhdGljIHZvaWQgX1NUTFBfQ0FMTCAgX0luZGV4ZWRFcnJvcihpbnQgX19pbmQsIGNvbnN0IGNoYXIqIF9fZiwgaW50IF9fbCk7Ci0KLSAgLy8gQmFzaWMgYXNzZXJ0aW9uIHJlcG9ydCBtZWNoYW5pc20uCi0gIC8vIFJlcG9ydHMgZmFpbGVkIGFzc2VydGlvbiB2aWEgX19zdGxfZGVidWdfbWVzc2FnZSBhbmQgY2FsbHMgX1Rlcm1pbmF0ZQotICAvLyBpZiBfU1RMUF9ERUJVR19URVJNSU5BVEUgaXMgc3BlY2lmaWVkLCBjYWxscyBfX3N0bF9kZWJ1Z190ZXJtaW5hdGUgaW5zdGVhZAotICBzdGF0aWMgdm9pZCBfU1RMUF9DQUxMICBfQXNzZXJ0KGNvbnN0IGNoYXIqIF9fZXhwciwgY29uc3QgY2hhciogX19mLCBpbnQgX19sKTsKLQotICAvLyBUaGUgc2FtZSwgd2l0aCBhZGRpdGlvbmFsIGRpYWdub3N0aWNzCi0gIHN0YXRpYyB2b2lkIF9TVExQX0NBTEwgIF9WZXJib3NlQXNzZXJ0KGNvbnN0IGNoYXIqIF9fZXhwciwgaW50IF9fZXJyb3JfaW5kLCBjb25zdCBjaGFyKiBfX2YsIGludCBfX2wpOwotCi0gIC8vIElmIGV4Y2VwdGlvbnMgYXJlIHByZXNlbnQsIHNlbmRzIHVuaXF1ZSBleGNlcHRpb24KLSAgLy8gSWYgbm90LCBjYWxscyBfU1RMUF9BQk9SVCgpIHRvIHRlcm1pbmF0ZQotICAvLyBVc2UgX1NUTFBfREVCVUdfVEVSTUlOQVRFIHRvIG92ZXJyaWRlCi0gIHN0YXRpYyB2b2lkIF9TVExQX0NBTEwgIF9UZXJtaW5hdGUoKTsKLQotIyAgaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpCi0gIC8vIG93bmVkX2xpc3QvbGluayBkZWxlZ2F0ZSBub24taW5saW5lIGZ1bmN0aW9ucyBoZXJlCi0KLSAgc3RhdGljIGJvb2wgX1NUTFBfQ0FMTCAgX0NoZWNrX3NhbWVfb3duZXIoIGNvbnN0IF9fb3duZWRfbGluayYgX19pMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fb3duZWRfbGluayYgX19pMik7Ci0gIHN0YXRpYyBib29sIF9TVExQX0NBTEwgIF9DaGVja19zYW1lX29yX251bGxfb3duZXIoIGNvbnN0IF9fb3duZWRfbGluayYgX19pMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19vd25lZF9saW5rJiBfX2kyKTsKLSAgc3RhdGljIGJvb2wgX1NUTFBfQ0FMTCAgX0NoZWNrX2lmX293bmVyKCBjb25zdCBfX293bmVkX2xpc3QqLCBjb25zdCBfX293bmVkX2xpbmsmKTsKLQotICBzdGF0aWMgYm9vbCBfU1RMUF9DQUxMICBfQ2hlY2tfaWZfbm90X293bmVyKCBjb25zdCBfX293bmVkX2xpc3QqLCBjb25zdCBfX293bmVkX2xpbmsmKTsKLQotICBzdGF0aWMgdm9pZCBfU1RMUF9DQUxMICBfVmVyaWZ5KGNvbnN0IF9fb3duZWRfbGlzdCopOwotCi0gIHN0YXRpYyB2b2lkIF9TVExQX0NBTEwgIF9Td2FwX293bmVycyhfX293bmVkX2xpc3QmLCBfX293bmVkX2xpc3QmKTsKLQotICBzdGF0aWMgdm9pZCBfU1RMUF9DQUxMICBfSW52YWxpZGF0ZV9hbGwoX19vd25lZF9saXN0Kik7Ci0KLSAgc3RhdGljIHZvaWQgX1NUTFBfQ0FMTCAgX1NldF9vd25lcihfX293bmVkX2xpc3QmIC8qc3JjKi8sIF9fb3duZWRfbGlzdCYgLypkc3QqLyk7Ci0KLSAgc3RhdGljIHZvaWQgX1NUTFBfQ0FMTCAgX1N0YW1wX2FsbChfX293bmVkX2xpc3QqLCBfX293bmVkX2xpc3QqKTsKLQotICBzdGF0aWMgdm9pZCBfU1RMUF9DQUxMICBfTV9kZXRhY2goX19vd25lZF9saXN0KiwgX19vd25lZF9saW5rKik7Ci0KLSAgc3RhdGljIHZvaWQgX1NUTFBfQ0FMTCAgX01fYXR0YWNoKF9fb3duZWRfbGlzdCosIF9fb3duZWRfbGluayopOwotCi0gIC8vIGFjY2Vzc29yIDogY2hlY2sgYW5kIGdldCBwb2ludGVyIHRvIHRoZSBjb250YWluZXIKLSAgc3RhdGljIHZvaWQqIF9TVExQX0NBTEwgIF9HZXRfY29udGFpbmVyX3B0cihjb25zdCBfX293bmVkX2xpbmsqKTsKLSMgIGVuZGlmCi0KLSAgLy8gZGVidWcgbWVzc2FnZXMgYW5kIGZvcm1hdHMKLSAgc3RhdGljIF9TVExQX1NUQVRJQ19NRU1CRVJfREVDTFNQRUMgY29uc3QgY2hhciogX01lc3NhZ2VfdGFibGVbX1N0bE1zZ19NQVhdOwotfTsKLQotI3VuZGVmIF9TVExQX01FU1NBR0VfTk9SRVRVUk4KLQotIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCkKLV9TVExQX0VYUE9SVF9URU1QTEFURSBzdHJ1Y3QgX1NUTFBfQ0xBU1NfREVDTFNQRUMgX19zdGxfZGVidWdfZW5naW5lPGJvb2w+OwotIyAgZW5kaWYgLyogX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCAqLwotCi10eXBlZGVmIF9fc3RsX2RlYnVnX2VuZ2luZTxib29sPiBfX3N0bF9kZWJ1Z2dlcjsKLQotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi0KLV9TVExQX0VORF9OQU1FU1BBQ0UKLQotIyAgaWYgIWRlZmluZWQgKF9TVExQX0FTU0VSVCkKLSMgICAgZGVmaW5lIF9TVExQX0FTU0VSVChleHByKSBcCi0gICAgICAgaWYgKCEoZXhwcikpIHsgX1NUTFBfUFJJViBfX3N0bF9kZWJ1Z2dlcjo6X0Fzc2VydCggIyBleHByLCBfU1RMUF9GSUxFX18sIF9fTElORV9fKTsgfQotIyAgZW5kaWYKLQotI2VuZGlmIC8qIF9TVExQX0FTU0VSVElPTlMgfHwgX1NUTFBfREVCVUcgKi8KLQotLy8gdGhpcyBzZWN0aW9uIGlzIGZvciBfU1RMUF9ERUJVRyBvbmx5Ci0jaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpCi0KLSMgIGlmICFkZWZpbmVkIChfU1RMUF9WRVJCT1NFX0FTU0VSVCkKLS8vIGZicCA6IG5ldyBmb3JtIG5vdCByZXF1aXJpbmcgIjsiCi0jICAgIGRlZmluZSBfU1RMUF9WRVJCT1NFX0FTU0VSVChleHByLCBfX2RpYWdfbnVtKSBcCi0gICAgICAgaWYgKCEoZXhwcikpIHsgX1NUTFBfUFJJViBfX3N0bF9kZWJ1Z2dlcjo6X1ZlcmJvc2VBc3NlcnRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAjIGV4cHIsICBfU1RMUF9QUklWIF9fZGlhZ19udW0sIF9TVExQX0ZJTEVfXywgX19MSU5FX18gKTsgXAotICAgICAgICAgIH0KLSMgIGVuZGlmCi0KLSMgIGRlZmluZSBfU1RMUF9ERUJVR19DSEVDSyhleHByKSBfU1RMUF9BU1NFUlQoZXhwcikKLSMgIGRlZmluZSBfU1RMUF9ERUJVR19ETyhleHByKSAgICBleHByOwotCi0jICBpZiAoX1NUTFBfREVCVUdfTEVWRUwgPT0gX1NUTFBfU1RBTkRBUkRfREJHX0xFVkVMKQotIyAgICBkZWZpbmUgX1NUTFBfU1REX0RFQlVHX0NIRUNLKGV4cHIpIF9TVExQX0RFQlVHX0NIRUNLKGV4cHIpCi0jICAgIGRlZmluZSBfU1RMUF9TVERfREVCVUdfRE8oZXhwcikgX1NUTFBfREVCVUdfRE8oZXhwcikKLSMgIGVsc2UKLSMgICAgZGVmaW5lIF9TVExQX1NURF9ERUJVR19DSEVDSyhleHByKQotIyAgICBkZWZpbmUgX1NUTFBfU1REX0RFQlVHX0RPKGV4cHIpCi0jICBlbmRpZgotCi0jICBpZiAhZGVmaW5lZCAoX1NUTFBfVkVSQk9TRV9SRVRVUk4pCi0jICAgIGRlZmluZSBfU1RMUF9WRVJCT1NFX1JFVFVSTihfX2V4cHIsX19kaWFnX251bSkgaWYgKCEoX19leHByKSkgeyBcCi0gICAgICAgICBfU1RMUF9QUklWIF9fc3RsX2RlYnVnZ2VyOjpfSW5kZXhlZEVycm9yKF9fZGlhZ19udW0sIF9TVExQX0ZJTEVfXyAsIF9fTElORV9fKTsgXAotICAgICAgICAgcmV0dXJuIGZhbHNlOyB9Ci0jICBlbmRpZgotCi0jICBpZiAhZGVmaW5lZCAoX1NUTFBfVkVSQk9TRV9SRVRVUk5fMCkKLSMgICAgZGVmaW5lIF9TVExQX1ZFUkJPU0VfUkVUVVJOXzAoX19leHByLF9fZGlhZ19udW0pIGlmICghKF9fZXhwcikpIHsgXAotICAgICAgICAgX1NUTFBfUFJJViBfX3N0bF9kZWJ1Z2dlcjo6X0luZGV4ZWRFcnJvcihfX2RpYWdfbnVtLCBfU1RMUF9GSUxFX18sIF9fTElORV9fKTsgXAotICAgICAgICAgcmV0dXJuIDA7IH0KLSMgIGVuZGlmCi0KLSMgIGlmbmRlZiBfU1RMUF9JTlRFUk5BTF9USFJFQURTX0gKLSMgICAgaW5jbHVkZSA8c3RsL190aHJlYWRzLmg+Ci0jICBlbmRpZgotCi0jICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfSVRFUkFUT1JfQkFTRV9ICi0jICAgIGluY2x1ZGUgPHN0bC9faXRlcmF0b3JfYmFzZS5oPgotIyAgZW5kaWYKLQotX1NUTFBfQkVHSU5fTkFNRVNQQUNFCi0KLV9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKLQotLyoKLSAqIFNwZWNpYWwgZGVidWcgaXRlcmF0b3IgdHJhaXRzIGhhdmluZyBhbiBhZGRpdGlvbm5hbCBzdGF0aWMgbWVtYmVyCi0gKiBtZXRob2QgX0NoZWNrLiBJdCBpcyB1c2VkIGJ5IHRoZSBzbGl0IGRlYnVnIGltcGxlbWVudGF0aW9uIHRvIGNoZWNrCi0gKiB0aGUgc3BlY2lhbCBiZWZvcmVfYmVnaW4gaXRlcmF0b3IuCi0gKi8KLXRlbXBsYXRlIDxjbGFzcyBfVHJhaXRzPgotc3RydWN0IF9EYmdUcmFpdHMgOiBfVHJhaXRzIHsKLSAgdHlwZWRlZiBfRGJnVHJhaXRzPHR5cGVuYW1lIF9UcmFpdHM6Ol9Db25zdFRyYWl0cz4gX0NvbnN0VHJhaXRzOwotICB0eXBlZGVmIF9EYmdUcmFpdHM8dHlwZW5hbWUgX1RyYWl0czo6X05vbkNvbnN0VHJhaXRzPiBfTm9uQ29uc3RUcmFpdHM7Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KLSAgc3RhdGljIGJvb2wgX0NoZWNrKGNvbnN0IF9JdGVyYXRvciYpIHtyZXR1cm4gdHJ1ZTt9Ci19OwotCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLXRlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+Ci1pbmxpbmUgYm9vbCAgX1NUTFBfQ0FMTCBfX3ZhbGlkX3JhbmdlKGNvbnN0IF9JdGVyYXRvciYgX19pMSAsY29uc3QgX0l0ZXJhdG9yJiBfX2kyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyYpCi17IHJldHVybiAoX19pMSA8IF9faTIpIHx8IChfX2kxID09IF9faTIpOyB9Ci0KLXRlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+Ci1pbmxpbmUgYm9vbCAgX1NUTFBfQ0FMTCBfX3ZhbGlkX3JhbmdlKGNvbnN0IF9JdGVyYXRvciYgX19pMSAsY29uc3QgX0l0ZXJhdG9yJiBfX2kyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZyYpIHsKLSAgLy8gY2hlY2sgaWYgY29tcGFyYWJsZQotICBib29sIF9fZHVtbXkoX19pMT09X19pMik7Ci0gIHJldHVybiAoX19kdW1teT09X19kdW1teSk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+Ci1pbmxpbmUgYm9vbCAgX1NUTFBfQ0FMTCBfX3ZhbGlkX3JhbmdlKGNvbnN0IF9JdGVyYXRvciYgX19pMSAsY29uc3QgX0l0ZXJhdG9yJiBfX2kyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3J3YXJkX2l0ZXJhdG9yX3RhZyYpIHsKLSAgLy8gY2hlY2sgaWYgY29tcGFyYWJsZQotICBib29sIF9fZHVtbXkoX19pMT09X19pMik7Ci0gIHJldHVybiAoX19kdW1teT09X19kdW1teSk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+Ci1pbmxpbmUgYm9vbCAgX1NUTFBfQ0FMTCBfX3ZhbGlkX3JhbmdlKGNvbnN0IF9JdGVyYXRvciYsY29uc3QgX0l0ZXJhdG9yJiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5wdXRfaXRlcmF0b3JfdGFnJikKLXsgcmV0dXJuIHRydWU7IH0KLQotdGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KLWlubGluZSBib29sICBfU1RMUF9DQUxMIF9fdmFsaWRfcmFuZ2UoY29uc3QgX0l0ZXJhdG9yJixjb25zdCBfSXRlcmF0b3ImLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvdXRwdXRfaXRlcmF0b3JfdGFnJikKLXsgcmV0dXJuIHRydWU7IH0KLQotdGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KLWlubGluZSBib29sIF9TVExQX0NBTEwgX192YWxpZF9yYW5nZShjb25zdCBfSXRlcmF0b3ImIF9faTEsIGNvbnN0IF9JdGVyYXRvciYgX19pMikKLXsgcmV0dXJuIF9fdmFsaWRfcmFuZ2UoX19pMSxfX2kyLF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9faTEsIF9JdGVyYXRvcikpOyB9Ci0KLS8vIE5vdGUgOiB0aGF0IG1lYW5zIGluIHJhbmdlIFtpMSwgaTJdLgotdGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KLWlubGluZSBib29sICBfU1RMUF9DQUxMIF9faW5fcmFuZ2UoY29uc3QgX0l0ZXJhdG9yJiBfSXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9JdGVyYXRvciYgX19pMSwgY29uc3QgX0l0ZXJhdG9yJiBfX2kyKQoteyByZXR1cm4gX192YWxpZF9yYW5nZShfX2kxLF9JdCkgJiYgX192YWxpZF9yYW5nZShfSXQsX19pMik7IH0KLQotdGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KLWlubGluZSBib29sICBfU1RMUF9DQUxMIF9faW5fcmFuZ2UoY29uc3QgX0l0ZXJhdG9yJiBfX2ZpcnN0LCBjb25zdCBfSXRlcmF0b3ImIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0l0ZXJhdG9yJiBfX3N0YXJ0LCBjb25zdCBfSXRlcmF0b3ImIF9fZmluaXNoKQoteyByZXR1cm4gX192YWxpZF9yYW5nZShfX2ZpcnN0LF9fbGFzdCkgJiYgX192YWxpZF9yYW5nZShfX3N0YXJ0LF9fZmlyc3QpICYmIF9fdmFsaWRfcmFuZ2UoX19sYXN0LF9fZmluaXNoKTsgfQotCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLWNsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIF9fb3duZWRfbGluayB7Ci1wdWJsaWM6Ci0gIF9fb3duZWRfbGluaygpIDogX01fb3duZXIoMCkge30KLSAgX19vd25lZF9saW5rKGNvbnN0IF9fb3duZWRfbGlzdCogX19jKSA6IF9NX293bmVyKDApLCBfTV9uZXh0KDApCi0gIHsgX19zdGxfZGVidWdnZXI6Ol9NX2F0dGFjaChfX0NPTlNUX0NBU1QoX19vd25lZF9saXN0KixfX2MpLCB0aGlzKTsgfQotICBfX293bmVkX2xpbmsoY29uc3QgX19vd25lZF9saW5rJiBfX3Jocyk6IF9NX293bmVyKDApCi0gIHsgX19zdGxfZGVidWdnZXI6Ol9NX2F0dGFjaChfX0NPTlNUX0NBU1QoX19vd25lZF9saXN0KixfX3Jocy5fTV9vd25lciksIHRoaXMpOyB9Ci0gIF9fb3duZWRfbGluayYgb3BlcmF0b3I9KGNvbnN0IF9fb3duZWRfbGluayYgX19yaHMpIHsKLSAgICBfX293bmVkX2xpc3QqIF9fbmV3X293bmVyID0gX19DT05TVF9DQVNUKF9fb3duZWRfbGlzdCosX19yaHMuX01fb3duZXIpOwotICAgIF9fb3duZWRfbGlzdCogX19vbGRfb3duZXIgPSBfTV9vd25lcjsKLSAgICBpZiAoIF9fb2xkX293bmVyICE9IF9fbmV3X293bmVyICkgewotICAgICAgX19zdGxfZGVidWdnZXI6Ol9NX2RldGFjaChfX29sZF9vd25lciwgdGhpcyk7Ci0gICAgICBfX3N0bF9kZWJ1Z2dlcjo6X01fYXR0YWNoKF9fbmV3X293bmVyLCB0aGlzKTsKLSAgICB9Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIH5fX293bmVkX2xpbmsoKSB7Ci0gICAgX19zdGxfZGVidWdnZXI6Ol9NX2RldGFjaChfTV9vd25lciwgdGhpcyk7Ci0gICAgX0ludmFsaWRhdGUoKTsKLSAgfQotCi0gIGNvbnN0IF9fb3duZWRfbGlzdCogX093bmVyKCkgY29uc3QgeyByZXR1cm4gX01fb3duZXI7IH0KLSAgX19vd25lZF9saXN0KiBfT3duZXIoKSB7IHJldHVybiBfTV9vd25lcjsgfQotICB2b2lkIF9TZXRfb3duZXIoY29uc3QgX19vd25lZF9saXN0KiBfX28pIHsgX01fb3duZXI9IF9fQ09OU1RfQ0FTVChfX293bmVkX2xpc3QqLF9fbyk7IH0KLSAgYm9vbCBfVmFsaWQoKSBjb25zdCB7IHJldHVybiBfTV9vd25lciAhPSAwOyB9Ci0gIHZvaWQgX0ludmFsaWRhdGUoKSB7IF9NX293bmVyID0gMDsgX01fbmV4dCA9IDA7IH0KLSAgdm9pZCBfTGlua190b19zZWxmKCkgeyBfTV9uZXh0ID0gMDsgfQotCi0gIF9fb3duZWRfbGluayogX05leHQoKSB7IHJldHVybiBfTV9uZXh0OyB9Ci0gIGNvbnN0IF9fb3duZWRfbGluayogX05leHQoKSBjb25zdCB7IHJldHVybiBfTV9uZXh0OyB9Ci0KLXB1YmxpYzoKLSAgX19vd25lZF9saXN0KiBfTV9vd25lcjsKLSAgX19vd25lZF9saW5rKiBfTV9uZXh0OwotfTsKLQotCi1jbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBfX293bmVkX2xpc3QgewotcHVibGljOgotICBfX293bmVkX2xpc3Qodm9pZCogX19vKSB7Ci0gICAgLy8gICAgZnByaW50ZihzdGRlcnIsICJfX293bmVkX2xpc3QoKTogJXBcbiIsKHZvaWQqKXRoaXMpOwotICAgIF9NX25vZGUuX01fb3duZXIgPSBfX1JFSU5URVJQUkVUX0NBU1QoX19vd25lZF9saXN0KixfX28pOwotICAgIF9NX25vZGUuX01fbmV4dCA9IDA7Ci0gIH0KLSAgfl9fb3duZWRfbGlzdCgpIHsKLSAgICAvLyAgICBmcHJpbnRmKHN0ZGVyciwgIn5fX293bmVkX2xpc3QoKTogJXBcbiIsKHZvaWQqKXRoaXMpOwotICAgIF9JbnZhbGlkYXRlX2FsbCgpOwotICAgIC8vIHRoYXQgcHJldmVudHMgZGV0YWNoCi0gICAgX01fbm9kZS5fSW52YWxpZGF0ZSgpOwotICB9Ci0gIGNvbnN0IHZvaWQqIF9Pd25lcigpIGNvbnN0IHsgcmV0dXJuIChjb25zdCB2b2lkKilfTV9ub2RlLl9NX293bmVyOyB9Ci0gIHZvaWQqIF9Pd25lcigpIHsgcmV0dXJuICh2b2lkKilfTV9ub2RlLl9NX293bmVyOyB9Ci0gIGJvb2wgIF9WYWxpZCgpIGNvbnN0IHsgcmV0dXJuIF9NX25vZGUuX01fb3duZXIgIT0gMDsgfQotICB2b2lkIF9JbnZhbGlkYXRlKCkgeyBfTV9ub2RlLl9NX293bmVyID0gMDsgfQotCi0gIF9fb3duZWRfbGluayogX0ZpcnN0KCkgeyByZXR1cm4gX01fbm9kZS5fTmV4dCgpOyB9Ci0gIF9fb3duZWRfbGluayogX0xhc3QoKSB7IHJldHVybiAwIDsgfQotCi0gIGNvbnN0IF9fb3duZWRfbGluayogX0ZpcnN0KCkgY29uc3QgeyByZXR1cm4gKF9fb3duZWRfbGluayopX01fbm9kZS5fTV9uZXh0OyB9Ci0gIGNvbnN0IF9fb3duZWRfbGluayogX0xhc3QoKSBjb25zdCB7IHJldHVybiAwIDt9Ci0KLSAgdm9pZCBfVmVyaWZ5KCkgY29uc3QgeyBfX3N0bF9kZWJ1Z2dlcjo6X1ZlcmlmeSh0aGlzKTsgfQotICB2b2lkIF9Td2FwX293bmVycyhfX293bmVkX2xpc3QmIF9feSkgeyBfX3N0bF9kZWJ1Z2dlcjo6X1N3YXBfb3duZXJzKCp0aGlzLCBfX3kpOyB9Ci0gIHZvaWQgX0ludmFsaWRhdGVfYWxsKCkgeyBfX3N0bF9kZWJ1Z2dlcjo6X0ludmFsaWRhdGVfYWxsKHRoaXMpOyB9Ci0gIHZvaWQgX1NldF9vd25lcihfX293bmVkX2xpc3QmIF9feSkgeyBfX3N0bF9kZWJ1Z2dlcjo6X1NldF9vd25lcigqdGhpcywgX195KTsgfQotCi0gIG11dGFibGUgX19vd25lZF9saW5rIF9NX25vZGU7Ci0gIG11dGFibGUgX1NUTFBfbXV0ZXggIF9NX2xvY2s7Ci0KLXByaXZhdGU6Ci0gIC8vIHNob3VsZCBuZXZlciBiZSBjYWxsZWQsIHNob3VsZCBiZSBsZWZ0IG5vdCBpbXBsZW1lbnRlZCwKLSAgLy8gYnV0IHNvbWUgY29tcGlsZXJzIGNvbXBsYWluIGFib3V0IGl0IDsoCi0gIF9fb3duZWRfbGlzdChjb25zdCBfX293bmVkX2xpc3QmKXt9Ci0gIF9fb3duZWRfbGlzdCYgb3BlcmF0b3IgPSAoY29uc3QgX19vd25lZF9saXN0JikgeyByZXR1cm4gKnRoaXM7IH0KLQotICBmcmllbmQgY2xhc3MgX19vd25lZF9saW5rOwotICBmcmllbmQgc3RydWN0IF9fc3RsX2RlYnVnX2VuZ2luZTxib29sPjsKLX07Ci0KLQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLS8vIGZvcndhcmQgZGVjbGFyYXRpb2lucwotCi10ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgotYm9vbCBfU1RMUF9DQUxMIF9fY2hlY2tfcmFuZ2UoY29uc3QgX0l0ZXJhdG9yJiwgY29uc3QgX0l0ZXJhdG9yJik7Ci10ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgotYm9vbCBfU1RMUF9DQUxMIF9fY2hlY2tfcmFuZ2UoY29uc3QgX0l0ZXJhdG9yJiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9JdGVyYXRvciYsIGNvbnN0IF9JdGVyYXRvciYpOwotdGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KLWJvb2wgX1NUTFBfQ0FMTCBfX2NoZWNrX3JhbmdlKGNvbnN0IF9JdGVyYXRvciYsIGNvbnN0IF9JdGVyYXRvciYgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0l0ZXJhdG9yJiwgY29uc3QgX0l0ZXJhdG9yJiApOwotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWJvb2wgX1NUTFBfQ0FMTCBfX2NoZWNrX3B0cl9yYW5nZShjb25zdCBfVHAqLCBjb25zdCBfVHAqKTsKLQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgotdm9pZCBfU1RMUF9DQUxMIF9faW52YWxpZGF0ZV9yYW5nZShjb25zdCBfX293bmVkX2xpc3QqIF9fYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0l0ZXJhdG9yJiBfX2ZpcnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfSXRlcmF0b3ImIF9fbGFzdCk7Ci0KLXRlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+Ci12b2lkIF9TVExQX0NBTEwgX19pbnZhbGlkYXRlX2l0ZXJhdG9yKGNvbnN0IF9fb3duZWRfbGlzdCogX19iYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfSXRlcmF0b3ImIF9faXQpOwotCi10ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgotdm9pZCBfU1RMUF9DQUxMIF9fY2hhbmdlX3JhbmdlX293bmVyKGNvbnN0IF9JdGVyYXRvciYgX19maXJzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfSXRlcmF0b3ImIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX293bmVkX2xpc3QqIF9fZHN0KTsKLQotdGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KLXZvaWQgIF9TVExQX0NBTEwgX19jaGFuZ2VfaXRlX293bmVyKGNvbnN0IF9JdGVyYXRvciYgX19pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fb3duZWRfbGlzdCogX19kc3QpOwotCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotaW5saW5lIGJvb2wgX1NUTFBfQ0FMTAotX19jaGVja19zYW1lX293bmVyKGNvbnN0IF9fb3duZWRfbGluayYgX19pMSwgY29uc3QgX19vd25lZF9saW5rJiBfX2kyKQoteyByZXR1cm4gX19zdGxfZGVidWdnZXI6Ol9DaGVja19zYW1lX293bmVyKF9faTEsX19pMik7IH0KLQotaW5saW5lIGJvb2wgX1NUTFBfQ0FMTAotX19jaGVja19zYW1lX29yX251bGxfb3duZXIoY29uc3QgX19vd25lZF9saW5rJiBfX2kxLCBjb25zdCBfX293bmVkX2xpbmsmIF9faTIpCi17IHJldHVybiBfX3N0bF9kZWJ1Z2dlcjo6X0NoZWNrX3NhbWVfb3JfbnVsbF9vd25lcihfX2kxLF9faTIpOyB9Ci0KLXRlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+Ci1pbmxpbmUgYm9vbCBfU1RMUF9DQUxMICBfX2NoZWNrX2lmX293bmVyKCBjb25zdCBfX293bmVkX2xpc3QqIF9fb3duZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfSXRlcmF0b3ImIF9faXQpCi17IHJldHVybiBfX3N0bF9kZWJ1Z2dlcjo6X0NoZWNrX2lmX293bmVyKF9fb3duZXIsIChjb25zdCBfX293bmVkX2xpbmsmKV9faXQpOyB9Ci0KLXRlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+Ci1pbmxpbmUgYm9vbCBfU1RMUF9DQUxMIF9fY2hlY2tfaWZfbm90X293bmVyKCBjb25zdCBfX293bmVkX2xpc3QqIC8qX19vd25lciovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0l0ZXJhdG9yJiAvKl9faXQqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fZmFsc2VfdHlwZSYpCi17IHJldHVybiB0cnVlOyB9Ci0KLXRlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+Ci1pbmxpbmUgYm9vbCBfU1RMUF9DQUxMIF9fY2hlY2tfaWZfbm90X293bmVyKCBjb25zdCBfX293bmVkX2xpc3QqIF9fb3duZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfSXRlcmF0b3ImIF9faXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX3RydWVfdHlwZSYpCi17IHJldHVybiBfX3N0bF9kZWJ1Z2dlcjo6X0NoZWNrX2lmX25vdF9vd25lcihfX293bmVyLCAoY29uc3QgX19vd25lZF9saW5rJilfX2l0KTsgfQotCi1fU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKLQotX1NUTFBfRU5EX05BTUVTUEFDRQotCi0jZW5kaWYgLyogX1NUTFBfREVCVUcgKi8KLQotI2lmIGRlZmluZWQgKF9TVExQX0FTU0VSVElPTlMpCi0KLSMgIGlmICFkZWZpbmVkIChfU1RMUF9BU1NFUlRfTVNHX1RSQUlMRVIpCi0jICAgIGRlZmluZSBfU1RMUF9BU1NFUlRfTVNHX1RSQUlMRVIKLSMgIGVuZGlmCi0KLS8vIGR3YSAxMi8zMC85OCAtIGlmIF9TVExQX0RFQlVHX01FU1NBR0UgaXMgZGVmaW5lZCwgdGhlIHVzZXIgY2FuIHN1cHBseSBvd24gZGVmaW5pdGlvbi4KLSMgIGlmICFkZWZpbmVkIChfU1RMUF9ERUJVR19NRVNTQUdFKQotIyAgICBkZWZpbmUgX19zdGxfZGVidWdfbWVzc2FnZSBfX3N0bF9kZWJ1Z2dlcjo6X01lc3NhZ2UKLSMgIGVsc2UKLWV4dGVybiAgdm9pZCBfX3N0bF9kZWJ1Z19tZXNzYWdlKGNvbnN0IGNoYXIgKiBmb3JtYXRfc3RyLCAuLi4pOwotIyAgZW5kaWYKLQotLy8gZmJwOiBpZiBfU1RMUF9ERUJVR19URVJNSU5BVEUgaXMgZGVmaW5lZCwgdGhlIHVzZXIgY2FuIHN1cHBseSBvd24gZGVmaW5pdGlvbi4KLSMgIGlmICFkZWZpbmVkIChfU1RMUF9ERUJVR19URVJNSU5BVEUpCi0jICAgIGRlZmluZSBfX3N0bF9kZWJ1Z190ZXJtaW5hdGUgX19zdGxfZGVidWdnZXI6Ol9UZXJtaW5hdGUKLSMgIGVsc2UKLWV4dGVybiAgdm9pZCBfX3N0bF9kZWJ1Z190ZXJtaW5hdGUoKTsKLSMgIGVuZGlmCi0KLSNlbmRpZgotCi0jaWYgIWRlZmluZWQgKF9TVExQX0xJTktfVElNRV9JTlNUQU5USUFUSU9OKQotIyAgaW5jbHVkZSA8c3RsL2RlYnVnL19kZWJ1Zy5jPgotI2VuZGlmCi0KLSNlbmRpZiAvKiBERUJVR19IICovCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvZGVidWcvX2RlcXVlLmggYi9zdGwvZGVidWcvX2RlcXVlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NTk1YTAuLjAwMDAwMDAKLS0tIGEvc3RsL2RlYnVnL19kZXF1ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDAwICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk0Ci0gKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3Ci0gKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTcKLSAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0vKiBOT1RFOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBTVEwgaGVhZGVycy4KLSAqICAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuCi0gKi8KLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9EQkdfREVRVUVfSAotI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9EQkdfREVRVUVfSAotCi0jaWZuZGVmIF9TVExQX0RCR19JVEVSQVRPUl9ICi0jICBpbmNsdWRlIDxzdGwvZGVidWcvX2l0ZXJhdG9yLmg+Ci0jZW5kaWYKLQotI2RlZmluZSBfU1RMUF9OT05fREJHX0RFUVVFIF9TVExQX1BSSVYgX1NUTFBfTk9OX0RCR19OQU1FKGRlcXVlKSA8X1RwLF9BbGxvYz4KLQotX1NUTFBfQkVHSU5fTkFNRVNQQUNFCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9ERUJVR19VU0VfRElTVElOQ1RfVkFMVUVfVFlQRV9IRUxQRVJTKQotdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgotaW5saW5lIF9UcCogdmFsdWVfdHlwZShjb25zdCBfU1RMUF9QUklWIF9EQkdfaXRlcl9iYXNlPCBfU1RMUF9OT05fREJHX0RFUVVFID4mKQoteyByZXR1cm4gKF9UcCopMDsgfQotdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgotaW5saW5lIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5KGNvbnN0IF9TVExQX1BSSVYgX0RCR19pdGVyX2Jhc2U8IF9TVExQX05PTl9EQkdfREVRVUUgPiYpCi17IHJldHVybiByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZygpOyB9Ci0jZW5kaWYKLQotdGVtcGxhdGUgPGNsYXNzIF9UcCwgX1NUTFBfREJHX0FMTE9DQVRPUl9TRUxFQ1QoX1RwKSA+Ci1jbGFzcyBkZXF1ZSA6Ci0jaWYgIWRlZmluZWQgKF9fRE1DX18pCi0gICAgICAgICAgICAgcHJpdmF0ZQotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fY29uc3RydWN0X2NoZWNrZXI8X1NUTFBfTk9OX0RCR19ERVFVRSA+Ci0jaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKQotICAgICAgICAgICAgLCBwdWJsaWMgX19zdGxwb3J0X2NsYXNzPGRlcXVlPF9UcCwgX0FsbG9jPiA+Ci0jZW5kaWYKLXsKLSAgdHlwZWRlZiBkZXF1ZTxfVHAsX0FsbG9jPiBfU2VsZjsKLSAgdHlwZWRlZiBfU1RMUF9OT05fREJHX0RFUVVFIF9CYXNlOwotICB0eXBlZGVmIF9TVExQX1BSSVYgX19jb25zdHJ1Y3RfY2hlY2tlcjxfU1RMUF9OT05fREJHX0RFUVVFID4gX0NvbnN0cnVjdENoZWNrOwotCi1wdWJsaWM6Ci0gIC8vIEJhc2ljIHR5cGVzCi0gIF9fSU1QT1JUX0NPTlRBSU5FUl9UWVBFREVGUyhfQmFzZSkKLQotICAvLyBJdGVyYXRvcnMKLSAgdHlwZWRlZiBfU1RMUF9QUklWIF9EQkdfaXRlcjxfQmFzZSwgX1NUTFBfUFJJViBfRGJnVHJhaXRzPF9Ob25jb25zdF90cmFpdHM8dmFsdWVfdHlwZT4gPiA+IGl0ZXJhdG9yOwotICB0eXBlZGVmIF9TVExQX1BSSVYgX0RCR19pdGVyPF9CYXNlLCBfU1RMUF9QUklWIF9EYmdUcmFpdHM8X0NvbnN0X3RyYWl0czx2YWx1ZV90eXBlPiA+ID4gICAgY29uc3RfaXRlcmF0b3I7Ci0KLSAgX1NUTFBfREVDTEFSRV9SQU5ET01fQUNDRVNTX1JFVkVSU0VfSVRFUkFUT1JTOwotCi1wcm90ZWN0ZWQ6Ci0gIF9CYXNlIF9NX25vbl9kYmdfaW1wbDsKLSAgX1NUTFBfUFJJViBfX293bmVkX2xpc3QgX01faXRlcl9saXN0OwotCi0gIHZvaWQgX0ludmFsaWRhdGVfYWxsKCkKLSAgeyBfTV9pdGVyX2xpc3QuX0ludmFsaWRhdGVfYWxsKCk7IH0KLSAgdm9pZCBfSW52YWxpZGF0ZV9pdGVyYXRvcihjb25zdCBpdGVyYXRvciYgX19pdCkKLSAgeyBfU1RMUF9QUklWIF9faW52YWxpZGF0ZV9pdGVyYXRvcigmX01faXRlcl9saXN0LF9faXQpOyB9Ci0gIHZvaWQgX0ludmFsaWRhdGVfaXRlcmF0b3JzKGNvbnN0IGl0ZXJhdG9yJiBfX2ZpcnN0LCBjb25zdCBpdGVyYXRvciYgX19sYXN0KQotICB7IF9TVExQX1BSSVYgX19pbnZhbGlkYXRlX3JhbmdlKCZfTV9pdGVyX2xpc3QsIF9fZmlyc3QsIF9fbGFzdCk7IH0KLQotcHVibGljOgotICAvLyBCYXNpYyBhY2Nlc3NvcnMKLSAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5nZXRfYWxsb2NhdG9yKCk7IH0KLQotICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5iZWdpbigpKTsgfQotICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBpdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuZW5kKCkpOyB9Ci0gIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLmJlZ2luKCkpOyB9Ci0gIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5lbmQoKSk7IH0KLQotICByZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9Ci0gIHJldmVyc2VfaXRlcmF0b3IgcmVuZCgpIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KLSAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBjb25zdCB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQotICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSBjb25zdCB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9Ci0KLSAgcmVmZXJlbmNlIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fbikgewotICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKF9fbiA8IHNpemUoKSwgX1N0bE1zZ19PVVRfT0ZfQk9VTkRTKQotICAgIHJldHVybiBfTV9ub25fZGJnX2ltcGxbX19uXTsKLSAgfQotICBjb25zdF9yZWZlcmVuY2Ugb3BlcmF0b3JbXShzaXplX3R5cGUgX19uKSBjb25zdCB7Ci0gICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoX19uIDwgc2l6ZSgpLCBfU3RsTXNnX09VVF9PRl9CT1VORFMpCi0gICAgcmV0dXJuIF9NX25vbl9kYmdfaW1wbFtfX25dOwotICB9Ci0KLSAgcmVmZXJlbmNlIGF0KHNpemVfdHlwZSBfX24pIHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5hdChfX24pOyB9Ci0gIGNvbnN0X3JlZmVyZW5jZSBhdChzaXplX3R5cGUgX19uKSBjb25zdCB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwuYXQoX19uKTsgfQotCi0gIHJlZmVyZW5jZSBmcm9udCgpIHsKLSAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghZW1wdHkoKSwgX1N0bE1zZ19FTVBUWV9DT05UQUlORVIpCi0gICAgcmV0dXJuICpiZWdpbigpOwotICB9Ci0gIGNvbnN0X3JlZmVyZW5jZSBmcm9udCgpIGNvbnN0IHsKLSAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghZW1wdHkoKSwgX1N0bE1zZ19FTVBUWV9DT05UQUlORVIpCi0gICAgcmV0dXJuICpiZWdpbigpOwotICB9Ci0gIHJlZmVyZW5jZSBiYWNrKCkgewotICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFlbXB0eSgpLCBfU3RsTXNnX0VNUFRZX0NPTlRBSU5FUikKLSAgICByZXR1cm4gKigtLWVuZCgpKTsKLSAgfQotICBjb25zdF9yZWZlcmVuY2UgYmFjaygpIGNvbnN0IHsKLSAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghZW1wdHkoKSwgX1N0bE1zZ19FTVBUWV9DT05UQUlORVIpCi0gICAgcmV0dXJuICooLS1lbmQoKSk7Ci0gIH0KLQotICAvLyBDb25zdHJ1Y3RvciwgZGVzdHJ1Y3Rvci4KLSAgZXhwbGljaXQgZGVxdWUoY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpIDoKLSAgICBfTV9ub25fZGJnX2ltcGwoX19hKSwgX01faXRlcl9saXN0KCZfTV9ub25fZGJnX2ltcGwpIHt9Ci0gIGRlcXVlKGNvbnN0IF9TZWxmJiBfX3gpIDoKLSAgICBfQ29uc3RydWN0Q2hlY2soX194KSwgX01fbm9uX2RiZ19pbXBsKF9feC5fTV9ub25fZGJnX2ltcGwpLAotICAgIF9NX2l0ZXJfbGlzdCgmX01fbm9uX2RiZ19pbXBsKSB7fQotCi0jaWYgIWRlZmluZWQoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKLSAgZXhwbGljaXQgZGVxdWUoc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX194ID0gX1RwKCksCi0jZWxzZQotICBkZXF1ZShzaXplX3R5cGUgX19uLCBwYXJhbV90eXBlIF9feCwKLSNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0qLwotICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpIDoKLSAgICBfTV9ub25fZGJnX2ltcGwoX19uLCBfX3gsIF9fYSksIF9NX2l0ZXJfbGlzdCgmX01fbm9uX2RiZ19pbXBsKSB7fQotI2lmIGRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCi0gIGV4cGxpY2l0IGRlcXVlKHNpemVfdHlwZSBfX24pIDoKLSAgICBfTV9ub25fZGJnX2ltcGwoX19uKSwgX01faXRlcl9saXN0KCZfTV9ub25fZGJnX2ltcGwpIHt9Ci0jZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKi8KLQotICBkZXF1ZShfX21vdmVfc291cmNlPF9TZWxmPiBzcmMpCi0gICAgOiBfTV9ub25fZGJnX2ltcGwoX19tb3ZlX3NvdXJjZTxfQmFzZT4oc3JjLmdldCgpLl9NX25vbl9kYmdfaW1wbCkpLAotICAgICAgX01faXRlcl9saXN0KCZfTV9ub25fZGJnX2ltcGwpIHsKLSNpZiBkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKSB8fCAoX1NUTFBfREVCVUdfTEVWRUwgPT0gX1NUTFBfU1RBTkRBUkRfREJHX0xFVkVMKQotICAgIHNyYy5nZXQoKS5fTV9pdGVyX2xpc3QuX0ludmFsaWRhdGVfYWxsKCk7Ci0jZWxzZQotICAgIHNyYy5nZXQoKS5fTV9pdGVyX2xpc3QuX1NldF9vd25lcihfTV9pdGVyX2xpc3QpOwotI2VuZGlmCi0gIH0KLQotI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KLSAgZGVxdWUoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAotICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hIF9TVExQX0FMTE9DQVRPUl9UWVBFX0RGTCkKLSAgICA6IF9Db25zdHJ1Y3RDaGVjayhfX2ZpcnN0LCBfX2xhc3QpLAotICAgICAgX01fbm9uX2RiZ19pbXBsKF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2ZpcnN0KSwgX1NUTFBfUFJJViBfTm9uX0RiZ19pdGVyKF9fbGFzdCksIF9fYSksCi0gICAgICBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkgewotICAgIH0KLSMgIGlmIGRlZmluZWQgKF9TVExQX05FRURTX0VYVFJBX1RFTVBMQVRFX0NPTlNUUlVDVE9SUykKLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgotICBkZXF1ZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCi0gICAgOiBfQ29uc3RydWN0Q2hlY2soX19maXJzdCwgX19sYXN0KSwKLSAgICAgIF9NX25vbl9kYmdfaW1wbChfU1RMUF9QUklWIF9Ob25fRGJnX2l0ZXIoX19maXJzdCksIF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2xhc3QpKSwKLSAgICAgIF9NX2l0ZXJfbGlzdCgmX01fbm9uX2RiZ19pbXBsKSB7Ci0gICAgfQotIyAgZW5kaWYKLSNlbHNlCi0gIGRlcXVlKGNvbnN0IHZhbHVlX3R5cGUqIF9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbGFzdCwKLSAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCi0gICAgOiBfQ29uc3RydWN0Q2hlY2soX19maXJzdCwgX19sYXN0KSwKLSAgICAgIF9NX25vbl9kYmdfaW1wbChfX2ZpcnN0LCBfX2xhc3QsIF9fYSksCi0gICAgICBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkgewotICAgIH0KLQotICBkZXF1ZShjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QsCi0gICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQotICAgIDogX0NvbnN0cnVjdENoZWNrKF9fZmlyc3QsIF9fbGFzdCksCi0gICAgICBfTV9ub25fZGJnX2ltcGwoX19maXJzdC5fTV9pdGVyYXRvciwgX19sYXN0Ll9NX2l0ZXJhdG9yLCBfX2EpLAotICAgICAgX01faXRlcl9saXN0KCZfTV9ub25fZGJnX2ltcGwpIHsKLSAgICB9Ci0jZW5kaWYKLQotICBfU2VsZiYgb3BlcmF0b3I9KGNvbnN0IF9TZWxmJiBfX3gpIHsKLSAgICBpZiAodGhpcyAhPSAmX194KSB7Ci0gICAgICBfSW52YWxpZGF0ZV9hbGwoKTsKLSAgICAgIF9NX25vbl9kYmdfaW1wbCA9IF9feC5fTV9ub25fZGJnX2ltcGw7Ci0gICAgfQotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwuZW1wdHkoKTsgfQotICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5zaXplKCk7IH0KLSAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLm1heF9zaXplKCk7IH0KLQotICB2b2lkIHN3YXAoX1NlbGYmIF9feCkgewotICAgIF9NX2l0ZXJfbGlzdC5fU3dhcF9vd25lcnMoX194Ll9NX2l0ZXJfbGlzdCk7Ci0gICAgX01fbm9uX2RiZ19pbXBsLnN3YXAoX194Ll9NX25vbl9kYmdfaW1wbCk7Ci0gIH0KLQotcHVibGljOgotICB2b2lkIGFzc2lnbihzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9fdmFsKSB7Ci0gICAgX0ludmFsaWRhdGVfYWxsKCk7Ci0gICAgX01fbm9uX2RiZ19pbXBsLmFzc2lnbihfX24sIF9fdmFsKTsKLSAgfQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgotICB2b2lkIGFzc2lnbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpIHsKLSAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKLSAgICBfSW52YWxpZGF0ZV9hbGwoKTsKLSAgICBfTV9ub25fZGJnX2ltcGwuYXNzaWduKF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2ZpcnN0KSwgX1NUTFBfUFJJViBfTm9uX0RiZ19pdGVyKF9fbGFzdCkpOwotICB9Ci0jZWxzZQotICB2b2lkIGFzc2lnbihjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpIHsKLSAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKLSAgICBfSW52YWxpZGF0ZV9hbGwoKTsKLSAgICBfTV9ub25fZGJnX2ltcGwuYXNzaWduKF9fZmlyc3QuX01faXRlcmF0b3IsIF9fbGFzdC5fTV9pdGVyYXRvcik7Ci0gIH0KLSAgdm9pZCBhc3NpZ24oY29uc3QgdmFsdWVfdHlwZSAqX19maXJzdCwgY29uc3QgdmFsdWVfdHlwZSAqX19sYXN0KSB7Ci0gICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3B0cl9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQotICAgIF9JbnZhbGlkYXRlX2FsbCgpOwotICAgIF9NX25vbl9kYmdfaW1wbC5hc3NpZ24oX19maXJzdCwgX19sYXN0KTsKLSAgfQotI2VuZGlmCi0KLXB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHVzaF8qIGFuZCBwb3BfKgotCi0jaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pICYmICFkZWZpbmVkIChfU1RMUF9OT19BTkFDSFJPTklTTVMpCi0gIHZvaWQgcHVzaF9iYWNrKGNvbnN0IHZhbHVlX3R5cGUmIF9fdCA9IF9UcCgpKSB7Ci0jZWxzZQotICB2b2lkIHB1c2hfYmFjayhjb25zdCB2YWx1ZV90eXBlJiBfX3QpIHsKLSNlbmRpZiAvKiFfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNICYmICFfU1RMUF9OT19BTkFDSFJPTklTTVMqLwotICAgIF9JbnZhbGlkYXRlX2FsbCgpOwotICAgIF9NX25vbl9kYmdfaW1wbC5wdXNoX2JhY2soX190KTsKLSAgfQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkgJiYgIWRlZmluZWQgKF9TVExQX05PX0FOQUNIUk9OSVNNUykKLSAgdm9pZCBwdXNoX2JhY2soKSB7Ci0gICAgX0ludmFsaWRhdGVfYWxsKCk7Ci0gICAgX01fbm9uX2RiZ19pbXBsLnB1c2hfYmFjaygpOwotICB9Ci0jZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNICYmICFfU1RMUF9OT19BTkFDSFJPTklTTVMqLwotCi0jaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pICYmICFkZWZpbmVkIChfU1RMUF9OT19BTkFDSFJPTklTTVMpCi0gIHZvaWQgcHVzaF9mcm9udChjb25zdCB2YWx1ZV90eXBlJiBfX3QgPSBfVHAoKSkgewotI2Vsc2UKLSAgdm9pZCBwdXNoX2Zyb250KGNvbnN0IHZhbHVlX3R5cGUmIF9fdCkgewotI2VuZGlmIC8qIV9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0gJiYgIV9TVExQX05PX0FOQUNIUk9OSVNNUyovCi0gICAgX0ludmFsaWRhdGVfYWxsKCk7Ci0gICAgX01fbm9uX2RiZ19pbXBsLnB1c2hfZnJvbnQoX190KTsKLSAgfQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkgJiYgIWRlZmluZWQgKF9TVExQX05PX0FOQUNIUk9OSVNNUykKLSAgdm9pZCBwdXNoX2Zyb250KCkgewotICAgIF9JbnZhbGlkYXRlX2FsbCgpOwotICAgIF9NX25vbl9kYmdfaW1wbC5wdXNoX2Zyb250KCk7Ci0gIH0KLSNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0gJiYgIV9TVExQX05PX0FOQUNIUk9OSVNNUyovCi0KLSAgdm9pZCBwb3BfYmFjaygpIHsKLSAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghZW1wdHkoKSwgX1N0bE1zZ19FTVBUWV9DT05UQUlORVIpCi0gICAgX0ludmFsaWRhdGVfaXRlcmF0b3IoZW5kKCkpOwotICAgIF9NX25vbl9kYmdfaW1wbC5wb3BfYmFjaygpOwotICB9Ci0KLSAgdm9pZCBwb3BfZnJvbnQoKSB7Ci0gICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoIWVtcHR5KCksIF9TdGxNc2dfRU1QVFlfQ09OVEFJTkVSKQotICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9yKGJlZ2luKCkpOwotICAgIF9NX25vbl9kYmdfaW1wbC5wb3BfZnJvbnQoKTsKLSAgfQotCi1wdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluc2VydAotCi0jaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pICYmICFkZWZpbmVkIChfU1RMUF9OT19BTkFDSFJPTklTTVMpCi0gIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBfX3BvcywgY29uc3QgdmFsdWVfdHlwZSYgX194ID0gX1RwKCkpIHsKLSNlbHNlCi0gIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBfX3BvcywgY29uc3QgdmFsdWVfdHlwZSYgX194KSB7Ci0jZW5kaWYgLyohX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSAmJiAhX1NUTFBfTk9fQU5BQ0hST05JU01TKi8KLSAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfb3duZXIoJl9NX2l0ZXJfbGlzdCwgX19wb3MpKQotICAgIF9JbnZhbGlkYXRlX2FsbCgpOwotICAgIHJldHVybiBpdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0KF9fcG9zLl9NX2l0ZXJhdG9yLCBfX3gpKTsKLSAgfQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkgJiYgIWRlZmluZWQgKF9TVExQX05PX0FOQUNIUk9OSVNNUykKLSAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zKSB7Ci0gICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX2lmX293bmVyKCZfTV9pdGVyX2xpc3QsIF9fcG9zKSkKLSAgICBfSW52YWxpZGF0ZV9hbGwoKTsKLSAgICByZXR1cm4gaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLmluc2VydChfX3Bvcy5fTV9pdGVyYXRvcikpOwotICB9Ci0jZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNICYmICFfU1RMUF9OT19BTkFDSFJPTklTTVMqLwotCi0gIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpIHsKLSAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfb3duZXIoJl9NX2l0ZXJfbGlzdCwgX19wb3MpKQotICAgIGlmIChfX24gIT0gMCkgX0ludmFsaWRhdGVfYWxsKCk7Ci0gICAgX01fbm9uX2RiZ19pbXBsLmluc2VydChfX3Bvcy5fTV9pdGVyYXRvciwgX19uLCBfX3gpOwotICB9Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Ci0gIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpIHsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIF9BcmVTYW1lVW5DVlR5cGVzPF9JbnB1dEl0ZXJhdG9yLCBpdGVyYXRvcj46Ol9SZXQgX0lzTm9uQ29uc3RJdGVyYXRvcjsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIF9BcmVTYW1lVW5DVlR5cGVzPF9JbnB1dEl0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj46Ol9SZXQgX0lzQ29uc3RJdGVyYXRvcjsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIF9Mb3IyPF9Jc05vbkNvbnN0SXRlcmF0b3IsIF9Jc0NvbnN0SXRlcmF0b3I+OjpfUmV0IF9Eb0NoZWNrOwotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LCBfX3BvcykpCi0gICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCi0gICAgLy9TZXF1ZW5jZSByZXF1aXJlbWVudHMgMjMuMS4xIFRhYmxlIDY3OgotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9ub3Rfb3duZXIoJl9NX2l0ZXJfbGlzdCwgX19maXJzdCwgX0RvQ2hlY2soKSkpOwotICAgIF9NX25vbl9kYmdfaW1wbC5pbnNlcnQoX19wb3MuX01faXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9Ob25fRGJnX2l0ZXIoX19maXJzdCksIF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2xhc3QpKTsKLSAgICAvL2R1bXM6IGJlY2F1c2Ugb2Ygc2VsZiBpbnNlcnRpb24gaXRlcmF0b3JzIG11c3QgYmUgaW52YWxpZGF0ZWQgYWZ0ZXIgaW5zZXJ0aW9uLgotICAgIGlmIChfX2ZpcnN0ICE9IF9fbGFzdCkgX0ludmFsaWRhdGVfYWxsKCk7Ci0gIH0KLSNlbHNlCi0gIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLAotICAgICAgICAgICAgICBjb25zdCB2YWx1ZV90eXBlKiBfX2ZpcnN0LCBjb25zdCB2YWx1ZV90eXBlKiBfX2xhc3QpIHsKLSAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfb3duZXIoJl9NX2l0ZXJfbGlzdCwgX19wb3MpKQotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19wdHJfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKLSAgICBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0KF9fcG9zLl9NX2l0ZXJhdG9yLCBfX2ZpcnN0LCBfX2xhc3QpOwotICAgIC8vZHVtczogYmVjYXVzZSBvZiBzZWxmIGluc2VydGlvbiBpdGVyYXRvcnMgbXVzdCBiZSBpbnZhbGlkYXRlZCBhZnRlciBpbnNlcnRpb24uCi0gICAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KSBfSW52YWxpZGF0ZV9hbGwoKTsKLSAgfQotICB2b2lkIGluc2VydChpdGVyYXRvciBfX3BvcywKLSAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KSB7Ci0gICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX2lmX293bmVyKCZfTV9pdGVyX2xpc3QsIF9fcG9zKSkKLSAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKLSAgICAvL1NlcXVlbmNlIHJlcXVpcmVtZW50cyAyMy4xLjEgVGFibGUgNjc6Ci0gICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX2lmX25vdF9vd25lcigmX01faXRlcl9saXN0LCBfX2ZpcnN0LCBfX3RydWVfdHlwZSgpKSk7Ci0gICAgX01fbm9uX2RiZ19pbXBsLmluc2VydChfX3Bvcy5fTV9pdGVyYXRvciwgX19maXJzdC5fTV9pdGVyYXRvciwgX19sYXN0Ll9NX2l0ZXJhdG9yKTsKLSAgICAvL2R1bXM6IGJlY2F1c2Ugb2Ygc2VsZiBpbnNlcnRpb24gaXRlcmF0b3JzIG11c3QgYmUgaW52YWxpZGF0ZWQgYWZ0ZXIgaW5zZXJ0aW9uLgotICAgIGlmIChfX2ZpcnN0ICE9IF9fbGFzdCkgX0ludmFsaWRhdGVfYWxsKCk7Ci0gIH0KLSNlbmRpZgotCi0jaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCi0gIHZvaWQgcmVzaXplKHNpemVfdHlwZSBfX25ld19zaXplLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ggPSBfVHAoKSkgewotI2Vsc2UKLSAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9fbmV3X3NpemUsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkgewotI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCi0gICAgaWYgKF9fbmV3X3NpemUgIT0gc2l6ZSgpKSB7Ci0gICAgICBpZiAoKF9fbmV3X3NpemUgPiBzaXplKCkpIHx8IChfX25ld19zaXplIDwgc2l6ZSgpIC0gMSkpCi0gICAgICAgIF9JbnZhbGlkYXRlX2FsbCgpOwotICAgICAgZWxzZQotICAgICAgICBfSW52YWxpZGF0ZV9pdGVyYXRvcihlbmQoKSk7Ci0gICAgfQotICAgIF9NX25vbl9kYmdfaW1wbC5yZXNpemUoX19uZXdfc2l6ZSwgX194KTsKLSAgfQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKLSAgdm9pZCByZXNpemUoc2l6ZV90eXBlIG5ld19zaXplKSB7IHJlc2l6ZShuZXdfc2l6ZSwgX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRChfVHApKTsgfQotI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCi0KLSAgLy8gRXJhc2UKLSAgaXRlcmF0b3IgZXJhc2UoaXRlcmF0b3IgX19wb3MpIHsKLSAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfb3duZXIoJl9NX2l0ZXJfbGlzdCwgX19wb3MpKQotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX0RlcmVmZXJlbmNlYWJsZShfX3BvcykpCi0gICAgaWYgKF9fcG9zLl9NX2l0ZXJhdG9yID09IF9NX25vbl9kYmdfaW1wbC5iZWdpbigpKQotICAgICAgX0ludmFsaWRhdGVfaXRlcmF0b3IoX19wb3MpOwotICAgIGVsc2UgewotICAgICAgdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yIF9fdG1wID0gLS0oX01fbm9uX2RiZ19pbXBsLmVuZCgpKTsKLSAgICAgIGlmIChfX3Bvcy5fTV9pdGVyYXRvciA9PSBfX3RtcCkKLSAgICAgICAgX0ludmFsaWRhdGVfaXRlcmF0b3IoX19wb3MpOwotICAgICAgZWxzZQotICAgICAgICBfSW52YWxpZGF0ZV9hbGwoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGl0ZXJhdG9yICgmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuZXJhc2UoX19wb3MuX01faXRlcmF0b3IpKTsKLSAgfQotCi0gIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkgewotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QsIGJlZ2luKCksIGVuZCgpKSkKLSAgICBpZiAoIWVtcHR5KCkpIHsKLSAgICAgIGlmIChfX2ZpcnN0Ll9NX2l0ZXJhdG9yID09IF9NX25vbl9kYmdfaW1wbC5iZWdpbigpIHx8Ci0gICAgICAgICAgX19sYXN0Ll9NX2l0ZXJhdG9yID09IF9NX25vbl9kYmdfaW1wbC5lbmQoKSkKLSAgICAgICAgX0ludmFsaWRhdGVfaXRlcmF0b3JzKF9fZmlyc3QsIF9fbGFzdCk7Ci0gICAgICBlbHNlCi0gICAgICAgIF9JbnZhbGlkYXRlX2FsbCgpOwotICAgIH0KLSAgICByZXR1cm4gaXRlcmF0b3IgKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5lcmFzZShfX2ZpcnN0Ll9NX2l0ZXJhdG9yLCBfX2xhc3QuX01faXRlcmF0b3IpKTsKLSAgfQotCi0gIHZvaWQgY2xlYXIoKSB7Ci0gICAgX0ludmFsaWRhdGVfYWxsKCk7Ci0gICAgX01fbm9uX2RiZ19pbXBsLmNsZWFyKCk7Ci0gIH0KLX07Ci0KLV9TVExQX0VORF9OQU1FU1BBQ0UKLQotI3VuZGVmIF9TVExQX05PTl9EQkdfREVRVUUKLQotI2VuZGlmIC8qIF9TVExQX0lOVEVSTkFMX0RFUVVFX0ggKi8KLQotLy8gTG9jYWwgVmFyaWFibGVzOgotLy8gbW9kZTpDKysKLS8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9kZWJ1Zy9faGFzaHRhYmxlLmggYi9zdGwvZGVidWcvX2hhc2h0YWJsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGQ2NDExLi4wMDAwMDAwCi0tLSBhL3N0bC9kZWJ1Zy9faGFzaHRhYmxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMzggKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTQKLSAqIEhld2xldHQtUGFja2FyZCBDb21wYW55Ci0gKgotICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKLSAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NwotICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogQm9yaXMgRm9taXRjaGV2Ci0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICovCi0KLS8qIE5PVEU6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIFNUTCBoZWFkZXJzLgotICogICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4KLSAqLwotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0RCR19IQVNIVEFCTEVfSAotI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9EQkdfSEFTSFRBQkxFX0gKLQotLy8gSGFzaHRhYmxlIGNsYXNzLCB1c2VkIHRvIGltcGxlbWVudCB0aGUgaGFzaGVkIGFzc29jaWF0aXZlIGNvbnRhaW5lcnMKLS8vIGhhc2hfc2V0LCBoYXNoX21hcCwgaGFzaF9tdWx0aXNldCwgYW5kIGhhc2hfbXVsdGltYXAsCi0vLyB1bm9yZGVyZWRfc2V0LCB1bm9yZGVyZWRfbWFwLCB1bm9yZGVyZWRfbXVsdGlzZXQsIHVub3JkZXJlZF9tdWx0aW1hcAotCi0jaWZuZGVmIF9TVExQX0RCR19JVEVSQVRPUl9ICi0jICBpbmNsdWRlIDxzdGwvZGVidWcvX2l0ZXJhdG9yLmg+Ci0jZW5kaWYKLQotX1NUTFBfQkVHSU5fTkFNRVNQQUNFCi0KLV9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKLQotdGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9FcXVhbD4KLWNsYXNzIF9EYmdFcXVhbCB7Ci1wdWJsaWM6Ci0gIF9EYmdFcXVhbCgpIHt9Ci0gIF9EYmdFcXVhbChjb25zdCBfRXF1YWwmIF9fZXEpIDogX01fbm9uX2RiZ19lcShfX2VxKSB7fQotICBfRGJnRXF1YWwoY29uc3QgX0RiZ0VxdWFsJiBfX2VxKSA6IF9NX25vbl9kYmdfZXEoX19lcS5fTV9ub25fZGJnX2VxKSB7fQotCi0jaWYgIWRlZmluZWQgKF9TVExQX1VTRV9DT05UQUlORVJTX0VYVEVOU0lPTikKLSAgYm9vbCBvcGVyYXRvciAoKSAoY29uc3QgX0tleSYgX19saHMsIGNvbnN0IF9LZXkmIF9fcmhzKSBjb25zdAotI2Vsc2UKLSAgdGVtcGxhdGUgPGNsYXNzIF9LcDEsIGNsYXNzIF9LcDI+Ci0gIGJvb2wgb3BlcmF0b3IgKCkgKGNvbnN0IF9LcDEmIF9fbGhzLCBjb25zdCBfS3AyJiBfX3JocykgY29uc3QKLSNlbmRpZgotICAgICAgewotI2lmICFkZWZpbmVkIChfU1RMUF9VU0VfQ09OVEFJTkVSU19FWFRFTlNJT04pCi0gICAgICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKF9NX25vbl9kYmdfZXEoX19yaHMsIF9fbGhzKSA9PSBfTV9ub25fZGJnX2VxKF9fbGhzLCBfX3JocyksIF9TdGxNc2dfSU5WQUxJRF9FUVVJVkFMRU5UX1BSRURJQ0FURSkKLSNlbmRpZgotICAgICAgICByZXR1cm4gX01fbm9uX2RiZ19lcShfX2xocywgX19yaHMpID8gdHJ1ZSA6IGZhbHNlOwotICAgICAgfQotCi0gIF9FcXVhbCBub25fZGJnX2tleV9lcSgpIGNvbnN0IHsgcmV0dXJuIF9NX25vbl9kYmdfZXE7IH0KLXByaXZhdGU6Ci0gIF9FcXVhbCBfTV9ub25fZGJnX2VxOwotfTsKLQotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi0KLSNkZWZpbmUgX1NUTFBfTk9OX0RCR19IVCBcCi1fU1RMUF9QUklWIF9TVExQX05PTl9EQkdfTkFNRShoYXNodGFibGUpIDxfVmFsLCBfS2V5LCBfSEYsIF9UcmFpdHMsIF9FeEssIF9TVExQX1BSSVYgX0RiZ0VxdWFsPF9LZXksIF9FcUs+LCBfQWxsPgotCi0jaWYgZGVmaW5lZCAoX1NUTFBfREVCVUdfVVNFX0RJU1RJTkNUX1ZBTFVFX1RZUEVfSEVMUEVSUykKLXRlbXBsYXRlIDxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSEYsCi0gICAgICAgICAgY2xhc3MgX0V4SywgY2xhc3MgX0VxSywgY2xhc3MgX0FsbD4KLWlubGluZSBfVmFsKgotdmFsdWVfdHlwZShjb25zdCBfU1RMUF9QUklWIF9EQkdfaXRlcl9iYXNlPCBfU1RMUF9OT05fREJHX0hUID4mKQoteyByZXR1cm4gKF9WYWwqKTA7IH0KLQotdGVtcGxhdGUgPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwKLSAgICAgICAgICBjbGFzcyBfRXhLLCBjbGFzcyBfRXFLLCBjbGFzcyBfQWxsPgotaW5saW5lIGZvcndhcmRfaXRlcmF0b3JfdGFnCi1pdGVyYXRvcl9jYXRlZ29yeShjb25zdCBfU1RMUF9QUklWIF9EQkdfaXRlcl9iYXNlPCBfU1RMUF9OT05fREJHX0hUID4mKQoteyByZXR1cm4gZm9yd2FyZF9pdGVyYXRvcl90YWcoKTsgfQotI2VuZGlmCi0KLXRlbXBsYXRlIDxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSEYsCi0gICAgICAgICAgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0V4SywgY2xhc3MgX0VxSywgY2xhc3MgX0FsbD4KLWNsYXNzIGhhc2h0YWJsZSB7Ci0gIHR5cGVkZWYgaGFzaHRhYmxlPF9WYWwsIF9LZXksIF9IRiwgX1RyYWl0cywgX0V4SywgX0VxSywgX0FsbD4gX1NlbGY7Ci0gIHR5cGVkZWYgX1NUTFBfTk9OX0RCR19IVCBfQmFzZTsKLQotICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6Ol9Ob25Db25zdFRyYWl0cyBfTm9uQ29uc3RUcmFpdHM7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6X0NvbnN0VHJhaXRzIF9Db25zdFRyYWl0czsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpfTm9uQ29uc3RMb2NhbFRyYWl0cyBfTm9uQ29uc3RMb2NhbFRyYWl0czsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpfQ29uc3RMb2NhbFRyYWl0cyBfQ29uc3RMb2NhbFRyYWl0czsKLQotICBfQmFzZSBfTV9ub25fZGJnX2ltcGw7Ci0gIF9TVExQX1BSSVYgX19vd25lZF9saXN0IF9NX2l0ZXJfbGlzdDsKLQotcHVibGljOgotICB0eXBlZGVmIF9LZXkga2V5X3R5cGU7Ci0gIHR5cGVkZWYgX0hGIGhhc2hlcjsKLSAgdHlwZWRlZiBfRXFLIGtleV9lcXVhbDsKLQotICBfX0lNUE9SVF9DT05UQUlORVJfVFlQRURFRlMoX0Jhc2UpCi0KLSAgdHlwZWRlZiBfU1RMUF9QUklWIF9EQkdfaXRlcjxfQmFzZSwgX1NUTFBfUFJJViBfRGJnVHJhaXRzPF9Ob25Db25zdFRyYWl0cz4gPiBpdGVyYXRvcjsKLSAgdHlwZWRlZiBfU1RMUF9QUklWIF9EQkdfaXRlcjxfQmFzZSwgX1NUTFBfUFJJViBfRGJnVHJhaXRzPF9Db25zdFRyYWl0cz4gPiAgICBjb25zdF9pdGVyYXRvcjsKLSAgLy90eXBlZGVmIF9TVExQX1BSSVYgX0RCR19pdGVyPF9CYXNlLCBfRGJnVHJhaXRzPF9Ob25Db25zdExvY2FsVHJhaXRzPiA+IGxvY2FsX2l0ZXJhdG9yOwotICB0eXBlZGVmIGl0ZXJhdG9yIGxvY2FsX2l0ZXJhdG9yOwotICAvL3R5cGVkZWYgX1NUTFBfUFJJViBfREJHX2l0ZXI8X0Jhc2UsIF9EYmdUcmFpdHM8X0NvbnN0TG9jYWxUcmFpdHM+ID4gICAgY29uc3RfbG9jYWxfaXRlcmF0b3I7Ci0gIHR5cGVkZWYgY29uc3RfaXRlcmF0b3IgY29uc3RfbG9jYWxfaXRlcmF0b3I7Ci0KLSAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IgX0Jhc2VfaXRlcmF0b3I7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X2l0ZXJhdG9yIF9CYXNlX2NvbnN0X2l0ZXJhdG9yOwotCi0gIGhhc2hlciBoYXNoX2Z1bmN0KCkgY29uc3QgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLmhhc2hfZnVuY3QoKTsgfQotICBrZXlfZXF1YWwga2V5X2VxKCkgY29uc3QgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLmtleV9lcSgpLm5vbl9kYmdfa2V5X2VxKCk7IH0KLQotcHJpdmF0ZToKLSAgdm9pZCBfSW52YWxpZGF0ZV9pdGVyYXRvcihjb25zdCBjb25zdF9pdGVyYXRvciYgX19pdCkKLSAgeyBfU1RMUF9QUklWIF9faW52YWxpZGF0ZV9pdGVyYXRvcigmX01faXRlcl9saXN0LCBfX2l0KTsgfQotICB2b2lkIF9JbnZhbGlkYXRlX2l0ZXJhdG9ycyhjb25zdCBjb25zdF9pdGVyYXRvciYgX19maXJzdCwgY29uc3QgY29uc3RfaXRlcmF0b3ImIF9fbGFzdCkKLSAgeyBfU1RMUF9QUklWIF9faW52YWxpZGF0ZV9yYW5nZSgmX01faXRlcl9saXN0LCBfX2ZpcnN0LCBfX2xhc3QpOyB9Ci0KLSAgX1NUTFBfS0VZX1RZUEVfRk9SX0NPTlRfRVhUKGtleV90eXBlKQotCi1wdWJsaWM6Ci0gIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdCB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwuZ2V0X2FsbG9jYXRvcigpOyB9Ci0KLSAgaGFzaHRhYmxlKHNpemVfdHlwZSBfX24sCi0gICAgICAgICAgICBjb25zdCBfSEYmICBfX2hmLAotICAgICAgICAgICAgY29uc3QgX0VxSyYgX19lcWwsCi0gICAgICAgICAgICBjb25zdCBfRXhLJiBfX2V4dCwKLSAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQotICAgIDogX01fbm9uX2RiZ19pbXBsKF9fbiwgX19oZiwgX19lcWwsIF9fZXh0LCBfX2EpLAotICAgICAgX01faXRlcl9saXN0KCZfTV9ub25fZGJnX2ltcGwpIHt9Ci0KLSAgaGFzaHRhYmxlKHNpemVfdHlwZSBfX24sCi0gICAgICAgICAgICBjb25zdCBfSEYmICAgIF9faGYsCi0gICAgICAgICAgICBjb25zdCBfRXFLJiAgIF9fZXFsLAotICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCi0gICAgOiBfTV9ub25fZGJnX2ltcGwoX19uLCBfX2hmLCBfX2VxbCwgX19hKSwKLSAgICAgIF9NX2l0ZXJfbGlzdCgmX01fbm9uX2RiZ19pbXBsKSB7fQotCi0gIGhhc2h0YWJsZShjb25zdCBfU2VsZiYgX19odCkKLSAgICA6IF9NX25vbl9kYmdfaW1wbChfX2h0Ll9NX25vbl9kYmdfaW1wbCksCi0gICAgICBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KLQotICBoYXNodGFibGUoX19tb3ZlX3NvdXJjZTxfU2VsZj4gc3JjKQotICAgIDogX01fbm9uX2RiZ19pbXBsKF9fbW92ZV9zb3VyY2U8X0Jhc2U+KHNyYy5nZXQoKS5fTV9ub25fZGJnX2ltcGwpKSwKLSAgICAgIF9NX2l0ZXJfbGlzdCgmX01fbm9uX2RiZ19pbXBsKSB7Ci0jaWYgZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykgfHwgKF9TVExQX0RFQlVHX0xFVkVMID09IF9TVExQX1NUQU5EQVJEX0RCR19MRVZFTCkKLSAgICBzcmMuZ2V0KCkuX01faXRlcl9saXN0Ll9JbnZhbGlkYXRlX2FsbCgpOwotI2Vsc2UKLSAgICBzcmMuZ2V0KCkuX01faXRlcl9saXN0Ll9TZXRfb3duZXIoX01faXRlcl9saXN0KTsKLSNlbmRpZgotICB9Ci0KLSAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwuc2l6ZSgpOyB9Ci0gIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5tYXhfc2l6ZSgpOyB9Ci0gIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwuZW1wdHkoKTsgfQotCi0gIF9TZWxmJiBvcGVyYXRvcj0oY29uc3QgX1NlbGYmIF9faHQpIHsKLSAgICBpZiAodGhpcyAhPSAmX19odCkgewotICAgICAgLy9TaG91bGQgbm90IGludmFsaWRhdGUgZW5kIGl0ZXJhdG9yCi0gICAgICBfSW52YWxpZGF0ZV9pdGVyYXRvcnMoYmVnaW4oKSwgZW5kKCkpOwotICAgICAgX01fbm9uX2RiZ19pbXBsID0gX19odC5fTV9ub25fZGJnX2ltcGw7Ci0gICAgfQotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIHZvaWQgc3dhcChfU2VsZiYgX19odCkgewotICAgX01faXRlcl9saXN0Ll9Td2FwX293bmVycyhfX2h0Ll9NX2l0ZXJfbGlzdCk7Ci0gICBfTV9ub25fZGJnX2ltcGwuc3dhcChfX2h0Ll9NX25vbl9kYmdfaW1wbCk7Ci0gIH0KLQotICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5iZWdpbigpKTsgfQotICBpdGVyYXRvciBlbmQoKSAgIHsgcmV0dXJuIGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5lbmQoKSk7IH0KLSAgbG9jYWxfaXRlcmF0b3IgYmVnaW4oc2l6ZV90eXBlIF9fbikgewotICAgIC8vVE9ETzogQWRkIGNoZWNrcyBmb3IgaXRlcmF0b3IgbG9jYWxpdHkgLT4gYXZvaWRzIGNvbXBhcmlzb24gYmV0d2VlbiBkaWZmZXJlbnQgYnVja2V0IGl0ZXJhdG9ycwotICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKChfX24gPCBidWNrZXRfY291bnQoKSksIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKLSAgICByZXR1cm4gbG9jYWxfaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLmJlZ2luKF9fbikpOwotICB9Ci0gIGxvY2FsX2l0ZXJhdG9yIGVuZChzaXplX3R5cGUgX19uKSB7Ci0gICAgLy9UT0RPOiBBZGQgY2hlY2tzIGZvciBpdGVyYXRvciBsb2NhbGl0eSAtPiBhdm9pZHMgY29tcGFyaXNvbiBiZXR3ZWVuIGRpZmZlcmVudCBidWNrZXQgaXRlcmF0b3JzCi0gICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoKF9fbiA8IGJ1Y2tldF9jb3VudCgpKSwgX1N0bE1zZ19JTlZBTElEX0FSR1VNRU5UKQotICAgIHJldHVybiBsb2NhbF9pdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuZW5kKF9fbikpOwotICB9Ci0KLSAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBjb25zdF9pdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuYmVnaW4oKSk7IH0KLSAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLmVuZCgpKTsgfQotICBjb25zdF9sb2NhbF9pdGVyYXRvciBiZWdpbihzaXplX3R5cGUgX19uKSBjb25zdCB7Ci0gICAgLy9UT0RPOiBBZGQgY2hlY2tzIGZvciBpdGVyYXRvciBsb2NhbGl0eSAtPiBhdm9pZHMgY29tcGFyaXNvbiBiZXR3ZWVuIGRpZmZlcmVudCBidWNrZXQgaXRlcmF0b3JzCi0gICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoKF9fbiA8IGJ1Y2tldF9jb3VudCgpKSwgX1N0bE1zZ19JTlZBTElEX0FSR1VNRU5UKQotICAgIHJldHVybiBjb25zdF9sb2NhbF9pdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuYmVnaW4oX19uKSk7Ci0gIH0KLSAgY29uc3RfbG9jYWxfaXRlcmF0b3IgZW5kKHNpemVfdHlwZSBfX24pIGNvbnN0IHsKLSAgICAvL1RPRE86IEFkZCBjaGVja3MgZm9yIGl0ZXJhdG9yIGxvY2FsaXR5IC0+IGF2b2lkcyBjb21wYXJpc29uIGJldHdlZW4gZGlmZmVyZW50IGJ1Y2tldCBpdGVyYXRvcnMKLSAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCgoX19uIDwgYnVja2V0X2NvdW50KCkpLCBfU3RsTXNnX0lOVkFMSURfQVJHVU1FTlQpCi0gICAgcmV0dXJuIGNvbnN0X2xvY2FsX2l0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5lbmQoX19uKSk7Ci0gIH0KLQotICBwYWlyPGl0ZXJhdG9yLCBib29sPiBpbnNlcnRfdW5pcXVlKGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKSB7Ci0gICAgcGFpcjxfQmFzZV9pdGVyYXRvciwgYm9vbD4gX19yZXMgPSBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0X3VuaXF1ZShfX29iaik7Ci0gICAgcmV0dXJuIHBhaXI8aXRlcmF0b3IsIGJvb2w+KGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9fcmVzLmZpcnN0KSwgX19yZXMuc2Vjb25kKTsKLSAgfQotCi0gIGl0ZXJhdG9yIGluc2VydF9lcXVhbChjb25zdCB2YWx1ZV90eXBlJiBfX29iaikKLSAgeyByZXR1cm4gaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLmluc2VydF9lcXVhbChfX29iaikpOyB9Ci0KLSAgcGFpcjxpdGVyYXRvciwgYm9vbD4gaW5zZXJ0X3VuaXF1ZV9ub3Jlc2l6ZShjb25zdCB2YWx1ZV90eXBlJiBfX29iaikgewotICAgIHBhaXI8X0Jhc2VfaXRlcmF0b3IsIGJvb2w+IF9fcmVzID0gX01fbm9uX2RiZ19pbXBsLmluc2VydF91bmlxdWVfbm9yZXNpemUoX19vYmopOwotICAgIHJldHVybiBwYWlyPGl0ZXJhdG9yLCBib29sPihpdGVyYXRvcigmX01faXRlcl9saXN0LCBfX3Jlcy5maXJzdCksIF9fcmVzLnNlY29uZCk7Ci0gIH0KLQotICBpdGVyYXRvciBpbnNlcnRfZXF1YWxfbm9yZXNpemUoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCi0gIHsgcmV0dXJuIGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5pbnNlcnRfZXF1YWxfbm9yZXNpemUoX19vYmopKTsgfQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgotICB2b2lkIGluc2VydF91bmlxdWUoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wpIHsKLSAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19mLCBfX2wpKQotICAgIF9NX25vbl9kYmdfaW1wbC5pbnNlcnRfdW5pcXVlKF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2YpLCBfU1RMUF9QUklWIF9Ob25fRGJnX2l0ZXIoX19sKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Ci0gIHZvaWQgaW5zZXJ0X2VxdWFsKF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sKXsKLSAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19mLCBfX2wpKQotICAgIF9NX25vbl9kYmdfaW1wbC5pbnNlcnRfZXF1YWwoX1NUTFBfUFJJViBfTm9uX0RiZ19pdGVyKF9fZiksIF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2wpKTsKLSAgfQotCi0jZWxzZQotICB2b2lkIGluc2VydF91bmlxdWUoY29uc3QgdmFsdWVfdHlwZSogX19mLCBjb25zdCB2YWx1ZV90eXBlKiBfX2wpIHsKLSAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcHRyX3JhbmdlKF9fZiwgX19sKSkKLSAgICBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7Ci0gIH0KLQotICB2b2lkIGluc2VydF9lcXVhbChjb25zdCB2YWx1ZV90eXBlKiBfX2YsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbCkgewotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19wdHJfcmFuZ2UoX19mLCBfX2wpKQotICAgIF9NX25vbl9kYmdfaW1wbC5pbnNlcnRfZXF1YWwoX19mLCBfX2wpOwotICB9Ci0KLSAgdm9pZCBpbnNlcnRfdW5pcXVlKGNvbnN0X2l0ZXJhdG9yIF9fZiwgY29uc3RfaXRlcmF0b3IgX19sKSB7Ci0gICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZiwgX19sKSkKLSAgICBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0X3VuaXF1ZShfX2YuX01faXRlcmF0b3IsIF9fbC5fTV9pdGVyYXRvcik7Ci0gIH0KLQotICB2b2lkIGluc2VydF9lcXVhbChjb25zdF9pdGVyYXRvciBfX2YsIGNvbnN0X2l0ZXJhdG9yIF9fbCkgewotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2YsIF9fbCkpCi0gICAgX01fbm9uX2RiZ19pbXBsLmluc2VydF9lcXVhbChfX2YuX01faXRlcmF0b3IsIF9fbC5fTV9pdGVyYXRvcik7Ci0gIH0KLSNlbmRpZgotCi0gIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAotICBpdGVyYXRvciBmaW5kKGNvbnN0IF9LVCYgX19rZXkpCi0gIHsgcmV0dXJuIGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5maW5kKF9fa2V5KSk7IH0KLSAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0gIGNvbnN0X2l0ZXJhdG9yIGZpbmQoY29uc3QgX0tUJiBfX2tleSkgY29uc3QKLSAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLmZpbmQoX19rZXkpKTsgfQotCi0gIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAotICBzaXplX3R5cGUgY291bnQoY29uc3QgX0tUJiBfX2tleSkgY29uc3QgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLmNvdW50KF9fa2V5KTsgfQotCi0gIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAotICBwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4gZXF1YWxfcmFuZ2UoY29uc3QgX0tUJiBfX2tleSkgewotICAgIHBhaXI8X0Jhc2VfaXRlcmF0b3IsIF9CYXNlX2l0ZXJhdG9yPiBfX3JlcyA9IF9NX25vbl9kYmdfaW1wbC5lcXVhbF9yYW5nZShfX2tleSk7Ci0gICAgcmV0dXJuIHBhaXI8aXRlcmF0b3IsaXRlcmF0b3I+IChpdGVyYXRvcigmX01faXRlcl9saXN0LF9fcmVzLmZpcnN0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsX19yZXMuc2Vjb25kKSk7Ci0gIH0KLQotICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKLSAgcGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+IGVxdWFsX3JhbmdlKGNvbnN0IF9LVCYgX19rZXkpIGNvbnN0IHsKLSAgICBwYWlyIDxfQmFzZV9jb25zdF9pdGVyYXRvciwgX0Jhc2VfY29uc3RfaXRlcmF0b3I+IF9fcmVzID0gX01fbm9uX2RiZ19pbXBsLmVxdWFsX3JhbmdlKF9fa2V5KTsKLSAgICByZXR1cm4gcGFpcjxjb25zdF9pdGVyYXRvcixjb25zdF9pdGVyYXRvcj4gKGNvbnN0X2l0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsX19yZXMuZmlyc3QpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCxfX3Jlcy5zZWNvbmQpKTsKLSAgfQotCi0gIHNpemVfdHlwZSBlcmFzZShjb25zdCBrZXlfdHlwZSYgX19rZXkpIHsKLSAgICBwYWlyPF9CYXNlX2l0ZXJhdG9yLCBfQmFzZV9pdGVyYXRvcj4gX19wID0gX01fbm9uX2RiZ19pbXBsLmVxdWFsX3JhbmdlKF9fa2V5KTsKLSAgICBzaXplX3R5cGUgX19uID0gX1NUTFBfU1REOjpkaXN0YW5jZShfX3AuZmlyc3QsIF9fcC5zZWNvbmQpOwotICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9ycyhjb25zdF9pdGVyYXRvcigmX01faXRlcl9saXN0LCBfX3AuZmlyc3QpLCBjb25zdF9pdGVyYXRvcigmX01faXRlcl9saXN0LCBfX3Auc2Vjb25kKSk7Ci0gICAgX01fbm9uX2RiZ19pbXBsLmVyYXNlKF9fcC5maXJzdCwgX19wLnNlY29uZCk7Ci0gICAgcmV0dXJuIF9fbjsKLSAgfQotCi0gIHZvaWQgZXJhc2UoY29uc3QgY29uc3RfaXRlcmF0b3ImIF9faXQpIHsKLSAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9EZXJlZmVyZW5jZWFibGUoX19pdCkpCi0gICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX2lmX293bmVyKCZfTV9pdGVyX2xpc3QsIF9faXQpKQotICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9yKF9faXQpOwotICAgIF9NX25vbl9kYmdfaW1wbC5lcmFzZShfX2l0Ll9NX2l0ZXJhdG9yKTsKLSAgfQotICB2b2lkIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkgewotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yKGJlZ2luKCkpLCBjb25zdF9pdGVyYXRvcihlbmQoKSkpKQotICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9ycyhfX2ZpcnN0LCBfX2xhc3QpOwotICAgIF9NX25vbl9kYmdfaW1wbC5lcmFzZShfX2ZpcnN0Ll9NX2l0ZXJhdG9yLCBfX2xhc3QuX01faXRlcmF0b3IpOwotICB9Ci0KLSAgdm9pZCByZWhhc2goc2l6ZV90eXBlIF9fbnVtX2J1Y2tldHNfaGludCkgeyBfTV9ub25fZGJnX2ltcGwucmVoYXNoKF9fbnVtX2J1Y2tldHNfaGludCk7IH0KLSAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9fbnVtX2VsZW1lbnRzX2hpbnQpIHsgX01fbm9uX2RiZ19pbXBsLnJlc2l6ZShfX251bV9lbGVtZW50c19oaW50KTsgfQotCi0gIHZvaWQgY2xlYXIoKSB7Ci0gICAgX0ludmFsaWRhdGVfaXRlcmF0b3JzKGJlZ2luKCksIGVuZCgpKTsKLSAgICBfTV9ub25fZGJnX2ltcGwuY2xlYXIoKTsKLSAgfQotCi0gIHJlZmVyZW5jZSBfTV9pbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopIHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5fTV9pbnNlcnQoX19vYmopOyB9Ci0KLSAgc2l6ZV90eXBlIGJ1Y2tldF9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5idWNrZXRfY291bnQoKTsgfQotICBzaXplX3R5cGUgbWF4X2J1Y2tldF9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5tYXhfYnVja2V0X2NvdW50KCk7IH0KLSAgc2l6ZV90eXBlIGVsZW1zX2luX2J1Y2tldChzaXplX3R5cGUgX19uKSBjb25zdCB7Ci0gICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoKF9fbiA8IGJ1Y2tldF9jb3VudCgpKSwgX1N0bE1zZ19JTlZBTElEX0FSR1VNRU5UKQotICAgIHJldHVybiBfTV9ub25fZGJnX2ltcGwuZWxlbXNfaW5fYnVja2V0KF9fbik7Ci0gIH0KLSAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0gIHNpemVfdHlwZSBidWNrZXQoY29uc3QgX0tUJiBfX2spIGNvbnN0IHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5idWNrZXQoX19rKTsgfQotCi0gIGZsb2F0IGxvYWRfZmFjdG9yKCkgY29uc3QgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLmxvYWRfZmFjdG9yKCk7IH0KLSAgZmxvYXQgbWF4X2xvYWRfZmFjdG9yKCkgY29uc3QgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLm1heF9sb2FkX2ZhY3RvcigpOyB9Ci0gIHZvaWQgbWF4X2xvYWRfZmFjdG9yKGZsb2F0IF9feikgewotICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKChfX3ogPiAwLjBmKSwgX1N0bE1zZ19JTlZBTElEX0FSR1VNRU5UKQotICAgIF9NX25vbl9kYmdfaW1wbC5tYXhfbG9hZF9mYWN0b3IoX196KTsKLSAgfQotfTsKLQotX1NUTFBfRU5EX05BTUVTUEFDRQotCi0jdW5kZWYgX1NUTFBfTk9OX0RCR19IVAotCi0jZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfSEFTSFRBQkxFX0ggKi8KLQotLy8gTG9jYWwgVmFyaWFibGVzOgotLy8gbW9kZTpDKysKLS8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9kZWJ1Zy9faXRlcmF0b3IuaCBiL3N0bC9kZWJ1Zy9faXRlcmF0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZhYWE5Zi4uMDAwMDAwMAotLS0gYS9zdGwvZGVidWcvX2l0ZXJhdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NTggKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTcKLSAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0jaWZuZGVmIF9TVExQX0RCR19JVEVSQVRPUl9ICi0jZGVmaW5lIF9TVExQX0RCR19JVEVSQVRPUl9ICi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfUEFJUl9ICi0jICBpbmNsdWRlIDxzdGwvX3BhaXIuaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0FMTE9DX0gKLSMgIGluY2x1ZGUgPHN0bC9fYWxsb2MuaD4KLSNlbmRpZgotCi0jZGVmaW5lIF9TVExQX0RCR19BTExPQ0FUT1JfU0VMRUNUKCBfVHAgKSBfU1RMUF9ERUZBVUxUX0FMTE9DQVRPUl9TRUxFQ1QoIF9UcCApCi0KLV9TVExQX0JFR0lOX05BTUVTUEFDRQotCi1fU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCi0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXRlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+Ci12b2lkIF9EZWNyZW1lbnQoX0l0ZXJhdG9yJiBfX2l0LCBjb25zdCBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZyAmKQoteyAtLV9faXQ7IH0KLQotdGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KLXZvaWQgX0RlY3JlbWVudChfSXRlcmF0b3ImIF9faXQsIGNvbnN0IHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnICYpCi17IC0tX19pdDsgfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgotdm9pZCBfRGVjcmVtZW50KF9JdGVyYXRvciYgX19pdCwgY29uc3QgZm9yd2FyZF9pdGVyYXRvcl90YWcgJikKLXsgX1NUTFBfQVNTRVJUKDApIH0KLQotdGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KLXZvaWQgX0FkdmFuY2UoX0l0ZXJhdG9yJiwgcHRyZGlmZl90LCBjb25zdCBmb3J3YXJkX2l0ZXJhdG9yX3RhZyAmKQoteyBfU1RMUF9BU1NFUlQoMCkgfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgotdm9pZCBfQWR2YW5jZShfSXRlcmF0b3ImIF9faXQsIHB0cmRpZmZfdCwgY29uc3QgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgJikKLXsgX1NUTFBfQVNTRVJUKDApIH0KLQotdGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KLXZvaWQgX0FkdmFuY2UoX0l0ZXJhdG9yJiBfX2l0LCBwdHJkaWZmX3QgX19uLCBjb25zdCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyAmKQoteyBfX2l0ICs9IF9fbjsgfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgotcHRyZGlmZl90IF9EQkdfZGlzdGFuY2UoY29uc3QgX0l0ZXJhdG9yJiBfX3gsIGNvbnN0IF9JdGVyYXRvciYgX195LCBjb25zdCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyAmKQoteyByZXR1cm4gX194IC0gX195OyB9Ci0KLXRlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+Ci1wdHJkaWZmX3QgX0RCR19kaXN0YW5jZShjb25zdCBfSXRlcmF0b3ImLCBjb25zdCBfSXRlcmF0b3ImLCBjb25zdCBmb3J3YXJkX2l0ZXJhdG9yX3RhZyAmKSB7Ci0gIF9TVExQX0FTU0VSVCgwKQotICByZXR1cm4gMDsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KLXB0cmRpZmZfdCBfREJHX2Rpc3RhbmNlKGNvbnN0IF9JdGVyYXRvciYsIGNvbnN0IF9JdGVyYXRvciYsIGNvbnN0IGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnICYpIHsKLSAgX1NUTFBfQVNTRVJUKDApCi0gIHJldHVybiAwOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgotYm9vbCBfQ29tcGFyZUl0KGNvbnN0IF9JdGVyYXRvciYsIGNvbnN0IF9JdGVyYXRvciYsIGNvbnN0IGZvcndhcmRfaXRlcmF0b3JfdGFnICYpIHsKLSAgX1NUTFBfQVNTRVJUKDApCi0gIHJldHVybiBmYWxzZTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KLWJvb2wgX0NvbXBhcmVJdChjb25zdCBfSXRlcmF0b3ImLCBjb25zdCBfSXRlcmF0b3ImLCBjb25zdCBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZyAmKSB7Ci0gIF9TVExQX0FTU0VSVCgwKQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+Ci1ib29sIF9Db21wYXJlSXQoY29uc3QgX0l0ZXJhdG9yJiBfX3gsIGNvbnN0IF9JdGVyYXRvciYgX195LCBjb25zdCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyAmKQoteyByZXR1cm4gX194IDwgX195OyB9Ci0KLXRlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+Ci1ib29sIF9EZXJlZmVyZW5jZWFibGUoY29uc3QgX0l0ZXJhdG9yJiBfX2l0KQoteyByZXR1cm4gKF9faXQuX0dldF9jb250YWluZXJfcHRyKCkgIT0gMCkgJiYgIShfX2l0Ll9NX2l0ZXJhdG9yID09IChfX2l0Ll9HZXRfY29udGFpbmVyX3B0cigpKS0+ZW5kKCkpOyB9Ci0KLXRlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+Ci1ib29sIF9JbmNyZW1lbnRhYmxlKGNvbnN0IF9JdGVyYXRvciYgX19pdCwgcHRyZGlmZl90IF9fbiwgY29uc3QgZm9yd2FyZF9pdGVyYXRvcl90YWcgJikKLXsgcmV0dXJuIChfX24gPT0gMSkgJiYgX0RlcmVmZXJlbmNlYWJsZShfX2l0KTsgfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgotYm9vbCBfSW5jcmVtZW50YWJsZShjb25zdCBfSXRlcmF0b3ImIF9faXQsIHB0cmRpZmZfdCBfX24sIGNvbnN0IGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnICYpIHsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfSXRlcmF0b3I6Ol9Db250YWluZXJfdHlwZSBfX2NvbnRhaW5lcl90eXBlOwotICBfX2NvbnRhaW5lcl90eXBlKiBfX2MgPSBfX2l0Ll9HZXRfY29udGFpbmVyX3B0cigpOwotICByZXR1cm4gKF9fYyAhPSAwKSAmJiAoKF9fbiA9PSAxICYmIF9faXQuX01faXRlcmF0b3IgIT0gX19jLT5lbmQoKSApIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAoX19uID09IC0xICYmIF9faXQuX01faXRlcmF0b3IgIT0gX19jLT5iZWdpbigpKSk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+Ci1ib29sIF9JbmNyZW1lbnRhYmxlKGNvbnN0IF9JdGVyYXRvciYgX19pdCwgcHRyZGlmZl90IF9fbiwgY29uc3QgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgJikgewotICB0eXBlZGVmIHR5cGVuYW1lIF9JdGVyYXRvcjo6X0NvbnRhaW5lcl90eXBlIF9fY29udGFpbmVyX3R5cGU7Ci0gIF9fY29udGFpbmVyX3R5cGUqIF9fYyA9IF9faXQuX0dldF9jb250YWluZXJfcHRyKCk7Ci0gIGlmIChfX2MgPT0gMCkgcmV0dXJuIGZhbHNlOwotICBwdHJkaWZmX3QgX19uZXdfcG9zID0gKF9faXQuX01faXRlcmF0b3IgLSBfX2MtPmJlZ2luKCkpICsgX19uOwotICByZXR1cm4gIChfX25ld19wb3MgPj0gMCkgJiYgKF9fU1RBVElDX0NBU1QodHlwZW5hbWUgX19jb250YWluZXJfdHlwZTo6c2l6ZV90eXBlLCBfX25ld19wb3MpIDw9IF9fYy0+c2l6ZSgpKTsKLX0KLQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NvbnRhaW5lcj4KLXN0cnVjdCBfREJHX2l0ZXJfYmFzZSA6IHB1YmxpYyBfX293bmVkX2xpbmsgewotcHVibGljOgotICB0eXBlZGVmIHR5cGVuYW1lIF9Db250YWluZXI6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfQ29udGFpbmVyOjpyZWZlcmVuY2UgIHJlZmVyZW5jZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfQ29udGFpbmVyOjpwb2ludGVyICAgIHBvaW50ZXI7Ci0gIHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKLSAgLy9wcml2YXRlOgotICB0eXBlZGVmIHR5cGVuYW1lIF9Db250YWluZXI6Oml0ZXJhdG9yICAgICAgICBfTm9uY29uc3RfaXRlcmF0b3I7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0NvbnRhaW5lcjo6Y29uc3RfaXRlcmF0b3IgIF9Db25zdF9pdGVyYXRvcjsKLSAgdHlwZWRlZiBfQ29udGFpbmVyICAgICAgICAgICAgICAgICAgICAgX0NvbnRhaW5lcl90eXBlOwotCi0jaWZkZWYgX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTgotICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQ29uc3RfaXRlcmF0b3I+OjppdGVyYXRvcl9jYXRlZ29yeSBfSXRlcmF0b3JfY2F0ZWdvcnk7Ci0jZWxzZQotICB0eXBlZGVmIHR5cGVuYW1lIF9Db250YWluZXI6Ol9JdGVyYXRvcl9jYXRlZ29yeSAgX0l0ZXJhdG9yX2NhdGVnb3J5OwotI2VuZGlmCi0gIHR5cGVkZWYgX0l0ZXJhdG9yX2NhdGVnb3J5IGl0ZXJhdG9yX2NhdGVnb3J5OwotCi0gIF9EQkdfaXRlcl9iYXNlKCkgOiBfX293bmVkX2xpbmsoMCkgIHt9Ci0gIF9EQkdfaXRlcl9iYXNlKGNvbnN0IF9fb3duZWRfbGlzdCogX19jLCBjb25zdCBfQ29uc3RfaXRlcmF0b3ImIF9faXQpIDoKLSNpZiBkZWZpbmVkKF9fSFBfYUNDKSAmJiAoX19IUF9hQ0MgPCA2MDAwMCkKLSAgX19vd25lZF9saW5rKF9fYyksIF9NX2l0ZXJhdG9yKCpfX1JFSU5URVJQUkVUX0NBU1QoY29uc3QgX05vbmNvbnN0X2l0ZXJhdG9yICosICZfX2l0KSkge30KLSNlbHNlCi0gICAgX19vd25lZF9saW5rKF9fYyksIF9NX2l0ZXJhdG9yKCooY29uc3QgX05vbmNvbnN0X2l0ZXJhdG9yKikmX19pdCkge30KLSNlbmRpZgotICBfQ29udGFpbmVyKiBfR2V0X2NvbnRhaW5lcl9wdHIoKSBjb25zdCB7Ci0gICAgcmV0dXJuIChfQ29udGFpbmVyKilfX3N0bF9kZWJ1Z2dlcjo6X0dldF9jb250YWluZXJfcHRyKHRoaXMpOwotICB9Ci0KLSAgdm9pZCBfX2luY3JlbWVudCgpOwotICB2b2lkIF9fZGVjcmVtZW50KCk7Ci0gIHZvaWQgX19hZHZhbmNlKHB0cmRpZmZfdCBfX24pOwotCi0vLyBwcm90ZWN0ZWQ6Ci0gIF9Ob25jb25zdF9pdGVyYXRvciBfTV9pdGVyYXRvcjsKLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ29udGFpbmVyPgotaW5saW5lIHZvaWQgX0RCR19pdGVyX2Jhc2U8X0NvbnRhaW5lcj46Ol9faW5jcmVtZW50KCkgewotICBfU1RMUF9ERUJVR19DSEVDSyhfSW5jcmVtZW50YWJsZSgqdGhpcywgMSwgX0l0ZXJhdG9yX2NhdGVnb3J5KCkpKQotICArK19NX2l0ZXJhdG9yOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NvbnRhaW5lcj4KLWlubGluZSB2b2lkIF9EQkdfaXRlcl9iYXNlPF9Db250YWluZXI+OjpfX2RlY3JlbWVudCgpIHsKLSAgX1NUTFBfREVCVUdfQ0hFQ0soX0luY3JlbWVudGFibGUoKnRoaXMsIC0xLCBfSXRlcmF0b3JfY2F0ZWdvcnkoKSkpCi0gIF9EZWNyZW1lbnQoX01faXRlcmF0b3IsIF9JdGVyYXRvcl9jYXRlZ29yeSgpKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9Db250YWluZXI+Ci1pbmxpbmUgdm9pZCBfREJHX2l0ZXJfYmFzZTxfQ29udGFpbmVyPjo6X19hZHZhbmNlKHB0cmRpZmZfdCBfX24pIHsKLSAgX1NUTFBfREVCVUdfQ0hFQ0soX0luY3JlbWVudGFibGUoKnRoaXMsIF9fbiwgX0l0ZXJhdG9yX2NhdGVnb3J5KCkpKQotICBfQWR2YW5jZShfTV9pdGVyYXRvciwgX19uLCBfSXRlcmF0b3JfY2F0ZWdvcnkoKSk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ29udGFpbmVyPgotcHRyZGlmZl90IG9wZXJhdG9yLShjb25zdCBfREJHX2l0ZXJfYmFzZTxfQ29udGFpbmVyPiYgX194LAotICAgICAgICAgICAgICAgICAgICBjb25zdCBfREJHX2l0ZXJfYmFzZTxfQ29udGFpbmVyPiYgX195ICkgewotICB0eXBlZGVmIHR5cGVuYW1lIF9EQkdfaXRlcl9iYXNlPF9Db250YWluZXI+OjpfSXRlcmF0b3JfY2F0ZWdvcnkgIF9JdGVyYXRvcl9jYXRlZ29yeTsKLSAgX1NUTFBfREVCVUdfQ0hFQ0soX19jaGVja19zYW1lX293bmVyKF9feCwgX195KSkKLSAgcmV0dXJuIF9EQkdfZGlzdGFuY2UoX194Ll9NX2l0ZXJhdG9yLF9feS5fTV9pdGVyYXRvciwgX0l0ZXJhdG9yX2NhdGVnb3J5KCkpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NvbnRhaW5lciwgY2xhc3MgX1RyYWl0cz4KLXN0cnVjdCBfREJHX2l0ZXJfbWlkIDogcHVibGljIF9EQkdfaXRlcl9iYXNlPF9Db250YWluZXI+IHsKLSAgdHlwZWRlZiBfREJHX2l0ZXJfbWlkPF9Db250YWluZXIsIHR5cGVuYW1lIF9UcmFpdHM6Ol9Ob25Db25zdFRyYWl0cz4gX05vbmNvbnN0X3NlbGY7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0NvbnRhaW5lcjo6aXRlcmF0b3IgICAgICAgIF9Ob25jb25zdF9pdGVyYXRvcjsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfQ29udGFpbmVyOjpjb25zdF9pdGVyYXRvciAgX0NvbnN0X2l0ZXJhdG9yOwotCi0gIF9EQkdfaXRlcl9taWQoKSB7fQotCi0gIGV4cGxpY2l0IF9EQkdfaXRlcl9taWQoY29uc3QgX05vbmNvbnN0X3NlbGYmIF9faXQpIDoKLSAgICAgIF9EQkdfaXRlcl9iYXNlPF9Db250YWluZXI+KF9faXQpIHt9Ci0KLSAgX0RCR19pdGVyX21pZChjb25zdCBfX293bmVkX2xpc3QqIF9fYywgY29uc3QgX0NvbnN0X2l0ZXJhdG9yJiBfX2l0KSA6Ci0gICAgICBfREJHX2l0ZXJfYmFzZTxfQ29udGFpbmVyPihfX2MsIF9faXQpIHt9Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NvbnRhaW5lciwgY2xhc3MgX1RyYWl0cz4KLXN0cnVjdCBfREJHX2l0ZXIgOiBwdWJsaWMgX0RCR19pdGVyX21pZDxfQ29udGFpbmVyLCBfVHJhaXRzPiB7Ci0gIHR5cGVkZWYgX0RCR19pdGVyX2Jhc2U8X0NvbnRhaW5lcj4gICAgICAgICAgX0Jhc2U7Ci1wdWJsaWM6Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpyZWZlcmVuY2UgIHJlZmVyZW5jZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpwb2ludGVyICAgIHBvaW50ZXI7Ci0KLSAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6X05vbmNvbnN0X2l0ZXJhdG9yIF9Ob25jb25zdF9pdGVyYXRvcjsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6X0NvbnN0X2l0ZXJhdG9yIF9Db25zdF9pdGVyYXRvcjsKLQotcHJpdmF0ZToKLSAgdHlwZWRlZiBfREJHX2l0ZXI8X0NvbnRhaW5lciwgX1RyYWl0cz4gICAgIF9TZWxmOwotICB0eXBlZGVmIF9EQkdfaXRlcl9taWQ8X0NvbnRhaW5lciwgdHlwZW5hbWUgX1RyYWl0czo6X05vbkNvbnN0VHJhaXRzPiBfTm9uY29uc3RfbWlkOwotCi1wdWJsaWM6Ci0KLSNpZmRlZiBfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OCi0gIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yX2NhdGVnb3J5IGl0ZXJhdG9yX2NhdGVnb3J5OwotI2VuZGlmCi0gIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Ol9JdGVyYXRvcl9jYXRlZ29yeSAgX0l0ZXJhdG9yX2NhdGVnb3J5OwotCi1wdWJsaWM6Ci0gIF9EQkdfaXRlcigpIHt9Ci0gICAgLy8gYm9yaXMgOiByZWFsIHR5cGUgb2YgaXRlciB3b3VsZCBiZSBuaWNlCi0gIF9EQkdfaXRlcihjb25zdCBfX293bmVkX2xpc3QqIF9fYywgY29uc3QgX0NvbnN0X2l0ZXJhdG9yJiBfX2l0KSA6Ci0gICAgX0RCR19pdGVyX21pZDxfQ29udGFpbmVyLCBfVHJhaXRzPihfX2MsIF9faXQpIHt9Ci0KLSAgLy8gVGhpcyBhbGxvd3MgY29udmVyc2lvbnMgZnJvbSBpdGVyYXRvciB0byBjb25zdF9pdGVyYXRvciB3aXRob3V0IGJlaW5nCi0gIC8vIHJlZHVuZGFudCB3aXRoIHRoZSBjb3B5IGNvbnN0cnVjdG9yIGJlbG93LgotICBfREJHX2l0ZXIoY29uc3QgX05vbmNvbnN0X21pZCYgX19yaHMpIDoKLSAgICBfREJHX2l0ZXJfbWlkPF9Db250YWluZXIsIF9UcmFpdHM+KF9fcmhzKSB7fQotCi0gIF9EQkdfaXRlcihjb25zdCAgX1NlbGYmIF9fcmhzKSA6Ci0gICAgX0RCR19pdGVyX21pZDxfQ29udGFpbmVyLCBfVHJhaXRzPihfX3Jocykge30KLQotICAvLyBUaGlzIGFsbG93cyBjb252ZXJzaW9ucyBmcm9tIGl0ZXJhdG9yIHRvIGNvbnN0X2l0ZXJhdG9yIHdpdGhvdXQgYmVpbmcKLSAgLy8gcmVkdW5kYW50IHdpdGggdGhlIGNvcHkgYXNzaWdubWVudCBvcGVyYXRvciBiZWxvdy4KLSAgX1NlbGYmIG9wZXJhdG9yPShjb25zdCBfTm9uY29uc3RfbWlkJiBfX3JocykgewotICAgIChfQmFzZSYpKnRoaXMgPSBfX3JoczsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBfU2VsZiYgb3BlcmF0b3I9KGNvbnN0ICBfU2VsZiYgX19yaHMpIHsKLSAgICAoX0Jhc2UmKSp0aGlzID0gX19yaHM7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgcmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0OwotCi0gIF9TVExQX0RFRklORV9BUlJPV19PUEVSQVRPUgotCi0gIF9TZWxmJiBvcGVyYXRvcisrKCkgewotICAgIHRoaXMtPl9faW5jcmVtZW50KCk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIF9TZWxmIG9wZXJhdG9yKysoaW50KSB7Ci0gICAgX1NlbGYgX190bXAgPSAqdGhpczsKLSAgICB0aGlzLT5fX2luY3JlbWVudCgpOwotICAgIHJldHVybiBfX3RtcDsKLSAgfQotICBfU2VsZiYgb3BlcmF0b3ItLSgpIHsKLSAgICB0aGlzLT5fX2RlY3JlbWVudCgpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotICBfU2VsZiBvcGVyYXRvci0tKGludCkgewotICAgIF9TZWxmIF9fdG1wID0gKnRoaXM7Ci0gICAgdGhpcy0+X19kZWNyZW1lbnQoKTsKLSAgICByZXR1cm4gX190bXA7Ci0gIH0KLQotICBfU2VsZiYgb3BlcmF0b3IrPShkaWZmZXJlbmNlX3R5cGUgX19uKSB7Ci0gICAgdGhpcy0+X19hZHZhbmNlKF9fbik7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgX1NlbGYmIG9wZXJhdG9yLT0oZGlmZmVyZW5jZV90eXBlIF9fbikgewotICAgIHRoaXMtPl9fYWR2YW5jZSgtX19uKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgX1NlbGYgb3BlcmF0b3IrKGRpZmZlcmVuY2VfdHlwZSBfX24pIGNvbnN0IHsKLSAgICBfU2VsZiBfX3RtcCgqdGhpcyk7Ci0gICAgX190bXAuX19hZHZhbmNlKF9fbik7Ci0gICAgcmV0dXJuIF9fdG1wOwotICB9Ci0gIF9TZWxmIG9wZXJhdG9yLShkaWZmZXJlbmNlX3R5cGUgX19uKSBjb25zdCB7Ci0gICAgX1NlbGYgX190bXAoKnRoaXMpOwotICAgIF9fdG1wLl9fYWR2YW5jZSgtX19uKTsKLSAgICByZXR1cm4gX190bXA7Ci0gIH0KLSAgcmVmZXJlbmNlIG9wZXJhdG9yW10oZGlmZmVyZW5jZV90eXBlIF9fbikgY29uc3QgeyByZXR1cm4gKigqdGhpcyArIF9fbik7IH0KLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ29udGFpbmVyLCBjbGFzcyBfVHJhaXRzPgotaW5saW5lCi0jaWYgZGVmaW5lZCAoX1NUTFBfTkVTVEVEX1RZUEVfUEFSQU1fQlVHKQotX1NUTFBfVFlQRU5BTUVfT05fUkVUVVJOX1RZUEUgX1RyYWl0czo6cmVmZXJlbmNlCi0jZWxzZQotX1NUTFBfVFlQRU5BTUVfT05fUkVUVVJOX1RZUEUgX0RCR19pdGVyPF9Db250YWluZXIsIF9UcmFpdHM+OjpyZWZlcmVuY2UKLSNlbmRpZgotX0RCR19pdGVyPF9Db250YWluZXIsIF9UcmFpdHM+OjpvcGVyYXRvciooKSBjb25zdCB7Ci0gIF9TVExQX0RFQlVHX0NIRUNLKF9EZXJlZmVyZW5jZWFibGUoKnRoaXMpKQotICBfU1RMUF9ERUJVR19DSEVDSyhfVHJhaXRzOjpfQ2hlY2soKnRoaXMpKQotICByZXR1cm4gKnRoaXMtPl9NX2l0ZXJhdG9yOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NvbnRhaW5lcj4KLWlubGluZSBib29sCi1vcGVyYXRvcj09KGNvbnN0IF9EQkdfaXRlcl9iYXNlPF9Db250YWluZXI+JiBfX3gsIGNvbnN0IF9EQkdfaXRlcl9iYXNlPF9Db250YWluZXI+JiBfX3kpIHsKLSAgX1NUTFBfREVCVUdfQ0hFQ0soX19jaGVja19zYW1lX29yX251bGxfb3duZXIoX194LCBfX3kpKQotICByZXR1cm4gX194Ll9NX2l0ZXJhdG9yID09IF9feS5fTV9pdGVyYXRvcjsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9Db250YWluZXI+Ci1pbmxpbmUgYm9vbAotb3BlcmF0b3I8KGNvbnN0IF9EQkdfaXRlcl9iYXNlPF9Db250YWluZXI+JiBfX3gsIGNvbnN0IF9EQkdfaXRlcl9iYXNlPF9Db250YWluZXI+JiBfX3kpIHsKLSAgX1NUTFBfREVCVUdfQ0hFQ0soX19jaGVja19zYW1lX29yX251bGxfb3duZXIoX194LCBfX3kpKQotICB0eXBlZGVmIHR5cGVuYW1lIF9EQkdfaXRlcl9iYXNlPF9Db250YWluZXI+OjpfSXRlcmF0b3JfY2F0ZWdvcnkgX0NhdGVnb3J5OwotICByZXR1cm4gX0NvbXBhcmVJdChfX3guX01faXRlcmF0b3IgLCBfX3kuX01faXRlcmF0b3IsIF9DYXRlZ29yeSgpKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9Db250YWluZXI+Ci1pbmxpbmUgYm9vbAotb3BlcmF0b3I+KGNvbnN0IF9EQkdfaXRlcl9iYXNlPF9Db250YWluZXI+JiBfX3gsCi0gICAgICAgY29uc3QgX0RCR19pdGVyX2Jhc2U8X0NvbnRhaW5lcj4mIF9feSkgewotICB0eXBlZGVmIHR5cGVuYW1lIF9EQkdfaXRlcl9iYXNlPF9Db250YWluZXI+OjpfSXRlcmF0b3JfY2F0ZWdvcnkgX0NhdGVnb3J5OwotICByZXR1cm4gX0NvbXBhcmVJdChfX3kuX01faXRlcmF0b3IgLCBfX3guX01faXRlcmF0b3IsIF9DYXRlZ29yeSgpKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIF9Db250YWluZXI+Ci1pbmxpbmUgYm9vbAotb3BlcmF0b3I+PShjb25zdCBfREJHX2l0ZXJfYmFzZTxfQ29udGFpbmVyPiYgX194LCBjb25zdCBfREJHX2l0ZXJfYmFzZTxfQ29udGFpbmVyPiYgX195KSB7Ci0gIF9TVExQX0RFQlVHX0NIRUNLKF9fY2hlY2tfc2FtZV9vcl9udWxsX293bmVyKF9feCwgX195KSkKLSAgdHlwZWRlZiB0eXBlbmFtZSBfREJHX2l0ZXJfYmFzZTxfQ29udGFpbmVyPjo6X0l0ZXJhdG9yX2NhdGVnb3J5IF9DYXRlZ29yeTsKLSAgcmV0dXJuICFfQ29tcGFyZUl0KF9feC5fTV9pdGVyYXRvciAsIF9feS5fTV9pdGVyYXRvciwgX0NhdGVnb3J5KCkpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NvbnRhaW5lcj4KLWlubGluZSBib29sCi1vcGVyYXRvcjw9KGNvbnN0IF9EQkdfaXRlcl9iYXNlPF9Db250YWluZXI+JiBfX3gsCi0gICAgICAgY29uc3QgX0RCR19pdGVyX2Jhc2U8X0NvbnRhaW5lcj4mIF9feSkgewotICB0eXBlZGVmIHR5cGVuYW1lIF9EQkdfaXRlcl9iYXNlPF9Db250YWluZXI+OjpfSXRlcmF0b3JfY2F0ZWdvcnkgX0NhdGVnb3J5OwotICByZXR1cm4gIV9Db21wYXJlSXQoX195Ll9NX2l0ZXJhdG9yICwgX194Ll9NX2l0ZXJhdG9yLCBfQ2F0ZWdvcnkoKSk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBfQ29udGFpbmVyPgotaW5saW5lIGJvb2wKLW9wZXJhdG9yIT0oY29uc3QgX0RCR19pdGVyX2Jhc2U8X0NvbnRhaW5lcj4mIF9feCwKLSAgICAgICAgY29uc3QgX0RCR19pdGVyX2Jhc2U8X0NvbnRhaW5lcj4mIF9feSkgewotICBfU1RMUF9ERUJVR19DSEVDSyhfX2NoZWNrX3NhbWVfb3JfbnVsbF9vd25lcihfX3gsIF9feSkpCi0gIHJldHVybiBfX3guX01faXRlcmF0b3IgIT0gX195Ll9NX2l0ZXJhdG9yOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NvbnRhaW5lciwgY2xhc3MgX1RyYWl0cz4KLWlubGluZSBfREJHX2l0ZXI8X0NvbnRhaW5lciwgX1RyYWl0cz4KLW9wZXJhdG9yKyhwdHJkaWZmX3QgX19uLCBjb25zdCBfREJHX2l0ZXI8X0NvbnRhaW5lciwgX1RyYWl0cz4mIF9faXQpIHsKLSAgX0RCR19pdGVyPF9Db250YWluZXIsIF9UcmFpdHM+IF9fdG1wKF9faXQpOwotICByZXR1cm4gX190bXAgKz0gX19uOwotfQotCi0KLXRlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+Ci1pbmxpbmUgX0l0ZXJhdG9yIF9Ob25fRGJnX2l0ZXIoX0l0ZXJhdG9yIF9faXQpCi17IHJldHVybiBfX2l0OyB9Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIpCi10ZW1wbGF0ZSA8Y2xhc3MgX0NvbnRhaW5lciwgY2xhc3MgX1RyYWl0cz4KLWlubGluZSB0eXBlbmFtZSBfREJHX2l0ZXI8X0NvbnRhaW5lciwgX1RyYWl0cz46Ol9Ob25jb25zdF9pdGVyYXRvcgotX05vbl9EYmdfaXRlcihfREJHX2l0ZXI8X0NvbnRhaW5lciwgX1RyYWl0cz4gX19pdCkKLXsgcmV0dXJuIF9faXQuX01faXRlcmF0b3I7IH0KLSNlbmRpZgotCi0vKgotICogSGVscGVyIGNsYXNzZXMgdG8gY2hlY2sgaXRlcmF0b3IgcmFuZ2Ugb3IgcG9pbnRlciB2YWxpZGl0eQotICogYXQgY29uc3RydWN0aW9uIHRpbWUuCi0gKi8KLXRlbXBsYXRlIDxjbGFzcyBfQ29udGFpbmVyPgotY2xhc3MgX19jb25zdHJ1Y3RfY2hlY2tlciB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0NvbnRhaW5lcjo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOwotcHJvdGVjdGVkOgotICBfX2NvbnN0cnVjdF9jaGVja2VyKCkge30KLQotICBfX2NvbnN0cnVjdF9jaGVja2VyKGNvbnN0IHZhbHVlX3R5cGUqIF9fcCkgewotICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKChfX3AgIT0gMCksIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKLSAgfQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXI+Ci0gIF9fY29uc3RydWN0X2NoZWNrZXIoY29uc3QgX0lucHV0SXRlciYgX19mLCBjb25zdCBfSW5wdXRJdGVyJiBfX2wpIHsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0ludGVncmFsPF9JbnB1dEl0ZXI+OjpfUmV0IF9JbnRlZ3JhbDsKLSAgICBfTV9jaGVja19kaXNwYXRjaChfX2YsIF9fbCwgX0ludGVncmFsKCkpOwotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2VyPgotICB2b2lkIF9NX2NoZWNrX2Rpc3BhdGNoKF9JbnRlZ2VyICwgX0ludGVnZXIsIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKklzSW50ZWdyYWwqLykge30KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcj4KLSAgdm9pZCBfTV9jaGVja19kaXNwYXRjaChjb25zdCBfSW5wdXRJdGVyJiBfX2YsIGNvbnN0IF9JbnB1dEl0ZXImIF9fbCwgY29uc3QgX19mYWxzZV90eXBlJiAvKklzSW50ZWdyYWwqLykgewotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9fY2hlY2tfcmFuZ2UoX19mLF9fbCkpCi0gIH0KLSNlbmRpZgotCi0jaWYgIWRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpIHx8ICFkZWZpbmVkIChfU1RMUF9OT19NRVRIT0RfU1BFQ0lBTElaQVRJT04pCi0gIF9fY29uc3RydWN0X2NoZWNrZXIoY29uc3QgdmFsdWVfdHlwZSogX19mLCBjb25zdCB2YWx1ZV90eXBlKiBfX2wpIHsKLSAgICBfU1RMUF9ERUJVR19DSEVDSyhfX2NoZWNrX3B0cl9yYW5nZShfX2YsX19sKSkKLSAgfQotCi0gIHR5cGVkZWYgX0RCR19pdGVyX2Jhc2U8X0NvbnRhaW5lcj4gX0l0ZVR5cGU7Ci0gIF9fY29uc3RydWN0X2NoZWNrZXIoY29uc3QgX0l0ZVR5cGUmIF9fZiwgY29uc3QgX0l0ZVR5cGUmIF9fbCkgewotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9fY2hlY2tfcmFuZ2UoX19mLF9fbCkpCi0gIH0KLSNlbmRpZgotfTsKLQotI2lmIGRlZmluZWQgKF9TVExQX1VTRV9PTERfSFBfSVRFUkFUT1JfUVVFUklFUykKLSMgIGlmIGRlZmluZWQgKF9TVExQX05FU1RFRF9UWVBFX1BBUkFNX0JVRykgfHxcCi0gICAgIChkZWZpbmVkIChfX1NVTlBST19DQykgJiYgX19TVU5QUk9fQ0MgPCAweDYwMCkgfHxcCi0gICAgIChkZWZpbmVkIChfU1RMUF9NU1ZDKSAmJiAoX1NUTFBfTVNWQyA8IDExMDApKQotIyAgICBkZWZpbmUgX1NUTFBfREVCVUdfVVNFX0RJU1RJTkNUX1ZBTFVFX1RZUEVfSEVMUEVSUyAxCi0jICBlbmRpZgotCi1fU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKLQotdGVtcGxhdGUgPGNsYXNzIF9Db250YWluZXI+Ci1pbmxpbmUgcHRyZGlmZl90KgotZGlzdGFuY2VfdHlwZShjb25zdCBfU1RMUF9QUklWIF9EQkdfaXRlcl9iYXNlPF9Db250YWluZXI+JikgeyByZXR1cm4gKHB0cmRpZmZfdCopIDA7IH0KLQotIyAgaWYgIWRlZmluZWQgKF9TVExQX0RFQlVHX1VTRV9ESVNUSU5DVF9WQUxVRV9UWVBFX0hFTFBFUlMpCi10ZW1wbGF0ZSA8Y2xhc3MgX0NvbnRhaW5lcj4KLWlubGluZSBfU1RMUF9UWVBFTkFNRV9PTl9SRVRVUk5fVFlQRSBfU1RMUF9QUklWIF9EQkdfaXRlcl9iYXNlPF9Db250YWluZXI+Ojp2YWx1ZV90eXBlKgotdmFsdWVfdHlwZShjb25zdCBfU1RMUF9QUklWIF9EQkdfaXRlcl9iYXNlPF9Db250YWluZXI+JikgewotICB0eXBlZGVmIHR5cGVuYW1lIF9TVExQX1BSSVYgX0RCR19pdGVyX2Jhc2U8X0NvbnRhaW5lcj46OnZhbHVlX3R5cGUgX1ZhbDsKLSAgcmV0dXJuIChfVmFsKikwOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0NvbnRhaW5lcj4KLWlubGluZSBfU1RMUF9UWVBFTkFNRV9PTl9SRVRVUk5fVFlQRSBfU1RMUF9QUklWIF9EQkdfaXRlcl9iYXNlPF9Db250YWluZXI+OjpfSXRlcmF0b3JfY2F0ZWdvcnkKLWl0ZXJhdG9yX2NhdGVnb3J5KGNvbnN0IF9TVExQX1BSSVYgX0RCR19pdGVyX2Jhc2U8X0NvbnRhaW5lcj4mKSB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1NUTFBfUFJJViBfREJHX2l0ZXJfYmFzZTxfQ29udGFpbmVyPjo6X0l0ZXJhdG9yX2NhdGVnb3J5IF9DYXRlZ29yeTsKLSAgcmV0dXJuIF9DYXRlZ29yeSgpOwotfQotIyAgZW5kaWYKLQotX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQotCi0jZW5kaWYgLyogX1NUTFBfVVNFX09MRF9IUF9JVEVSQVRPUl9RVUVSSUVTICovCi0KLV9TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQotCi1fU1RMUF9FTkRfTkFNRVNQQUNFCi0KLSNlbmRpZiAvKiBJTlRFUk5BTF9IICovCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvZGVidWcvX2xpc3QuaCBiL3N0bC9kZWJ1Zy9fbGlzdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjJlYzFjLi4wMDAwMDAwCi0tLSBhL3N0bC9kZWJ1Zy9fbGlzdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTAyICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk0Ci0gKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3Ci0gKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTcKLSAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0vKiBOT1RFOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBTVEwgaGVhZGVycy4KLSAqICAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuCi0gKi8KLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9EQkdfTElTVF9ICi0jZGVmaW5lIF9TVExQX0lOVEVSTkFMX0RCR19MSVNUX0gKLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9BTEdPX0gKLSMgIGluY2x1ZGUgPHN0bC9fYWxnby5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfREJHX0lURVJBVE9SX0gKLSMgIGluY2x1ZGUgPHN0bC9kZWJ1Zy9faXRlcmF0b3IuaD4KLSNlbmRpZgotCi0jZGVmaW5lIF9TVExQX05PTl9EQkdfTElTVCBfU1RMUF9QUklWIF9TVExQX05PTl9EQkdfTkFNRShsaXN0KSA8X1RwLCBfQWxsb2M+Ci0KLV9TVExQX0JFR0lOX05BTUVTUEFDRQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfREVCVUdfVVNFX0RJU1RJTkNUX1ZBTFVFX1RZUEVfSEVMUEVSUykKLXRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KLWlubGluZSBfVHAqCi12YWx1ZV90eXBlKGNvbnN0IF9TVExQX1BSSVYgX0RCR19pdGVyX2Jhc2U8IF9TVExQX05PTl9EQkdfTElTVCA+JikKLXsgcmV0dXJuIChfVHAqKTA7IH0KLXRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KLWlubGluZSBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZwotaXRlcmF0b3JfY2F0ZWdvcnkoY29uc3QgX1NUTFBfUFJJViBfREJHX2l0ZXJfYmFzZTwgX1NUTFBfTk9OX0RCR19MSVNUID4mKQoteyByZXR1cm4gYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcoKTsgfQotI2VuZGlmCi0KLXRlbXBsYXRlIDxjbGFzcyBfVHAsIF9TVExQX0RFRkFVTFRfQUxMT0NBVE9SX1NFTEVDVChfVHApID4KLWNsYXNzIGxpc3QgOgotI2lmICFkZWZpbmVkIChfX0RNQ19fKQotICAgICAgICAgICAgIHByaXZhdGUKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfX2NvbnN0cnVjdF9jaGVja2VyPF9TVExQX05PTl9EQkdfTElTVCA+Ci0jaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKQotICAgICAgICAgICAsIHB1YmxpYyBfX3N0bHBvcnRfY2xhc3M8bGlzdDxfVHAsIF9BbGxvYz4gPgotI2VuZGlmCi17Ci0gIHR5cGVkZWYgX1NUTFBfTk9OX0RCR19MSVNUIF9CYXNlOwotICB0eXBlZGVmIGxpc3Q8X1RwLCBfQWxsb2M+IF9TZWxmOwotICB0eXBlZGVmIF9TVExQX1BSSVYgX19jb25zdHJ1Y3RfY2hlY2tlcjxfU1RMUF9OT05fREJHX0xJU1QgPiBfQ29uc3RydWN0Q2hlY2s7Ci0KLXB1YmxpYzoKLSAgX19JTVBPUlRfQ09OVEFJTkVSX1RZUEVERUZTKF9CYXNlKQotCi1wdWJsaWM6Ci0gIHR5cGVkZWYgX1NUTFBfUFJJViBfREJHX2l0ZXI8X0Jhc2UsIF9TVExQX1BSSVYgX0RiZ1RyYWl0czxfTm9uY29uc3RfdHJhaXRzPHZhbHVlX3R5cGU+ID4gPiBpdGVyYXRvcjsKLSAgdHlwZWRlZiBfU1RMUF9QUklWIF9EQkdfaXRlcjxfQmFzZSwgX1NUTFBfUFJJViBfRGJnVHJhaXRzPF9Db25zdF90cmFpdHM8dmFsdWVfdHlwZT4gPiA+ICAgIGNvbnN0X2l0ZXJhdG9yOwotCi0gIF9TVExQX0RFQ0xBUkVfQklESVJFQ1RJT05BTF9SRVZFUlNFX0lURVJBVE9SUzsKLQotcHJpdmF0ZToKLSAgX0Jhc2UgX01fbm9uX2RiZ19pbXBsOwotICBfU1RMUF9QUklWIF9fb3duZWRfbGlzdCBfTV9pdGVyX2xpc3Q7Ci0KLSAgdm9pZCBfSW52YWxpZGF0ZV9pdGVyYXRvcihjb25zdCBpdGVyYXRvciYgX19pdCkKLSAgeyBfU1RMUF9QUklWIF9faW52YWxpZGF0ZV9pdGVyYXRvcigmX01faXRlcl9saXN0LCBfX2l0KTsgfQotICB2b2lkIF9JbnZhbGlkYXRlX2l0ZXJhdG9ycyhjb25zdCBpdGVyYXRvciYgX19maXJzdCwgY29uc3QgaXRlcmF0b3ImIF9fbGFzdCkKLSAgeyBfU1RMUF9QUklWIF9faW52YWxpZGF0ZV9yYW5nZSgmX01faXRlcl9saXN0LCBfX2ZpcnN0LCBfX2xhc3QpOyB9Ci0KLSAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IgX0Jhc2VfaXRlcmF0b3I7Ci0KLXB1YmxpYzoKLSAgZXhwbGljaXQgbGlzdChjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkgOgotICAgIF9NX25vbl9kYmdfaW1wbChfX2EpLCBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KLQotI2lmICFkZWZpbmVkKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCi0gIGV4cGxpY2l0IGxpc3Qoc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3ggPSBfVHAoKSwKLSNlbHNlCi0gIGxpc3Qoc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3gsCi0jZW5kaWYgLyohX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCi0gICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKLSAgICA6IF9NX25vbl9kYmdfaW1wbChfX24sIF9feCwgX19hKSwgX01faXRlcl9saXN0KCZfTV9ub25fZGJnX2ltcGwpIHt9Ci0KLSNpZiBkZWZpbmVkKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCi0gIGV4cGxpY2l0IGxpc3Qoc2l6ZV90eXBlIF9fbikKLSAgICA6IF9NX25vbl9kYmdfaW1wbChfX24pLCBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KLSNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0qLwotCi0gIGxpc3QoX19tb3ZlX3NvdXJjZTxfU2VsZj4gc3JjKQotICAgIDogX01fbm9uX2RiZ19pbXBsKF9fbW92ZV9zb3VyY2U8X0Jhc2U+KHNyYy5nZXQoKS5fTV9ub25fZGJnX2ltcGwpKSwKLSAgICAgIF9NX2l0ZXJfbGlzdCgmX01fbm9uX2RiZ19pbXBsKSB7Ci0jaWYgZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykgfHwgKF9TVExQX0RFQlVHX0xFVkVMID09IF9TVExQX1NUQU5EQVJEX0RCR19MRVZFTCkKLSAgICBzcmMuZ2V0KCkuX01faXRlcl9saXN0Ll9JbnZhbGlkYXRlX2FsbCgpOwotI2Vsc2UKLSAgICBzcmMuZ2V0KCkuX01faXRlcl9saXN0Ll9TZXRfb3duZXIoX01faXRlcl9saXN0KTsKLSNlbmRpZgotICB9Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQotICAvLyBXZSBkb24ndCBuZWVkIGFueSBkaXNwYXRjaGluZyB0cmlja3MgaGVyZSwgYmVjYXVzZSBpbnNlcnQgZG9lcyBhbGwgb2YKLSAgLy8gdGhhdCBhbnl3YXkuCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KLSAgbGlzdChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCi0gICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSBfU1RMUF9BTExPQ0FUT1JfVFlQRV9ERkwpCi0gICAgOiBfQ29uc3RydWN0Q2hlY2soX19maXJzdCwgX19sYXN0KSwKLSAgICAgIF9NX25vbl9kYmdfaW1wbChfU1RMUF9QUklWIF9Ob25fRGJnX2l0ZXIoX19maXJzdCksIF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2xhc3QpLCBfX2EpLAotICAgICAgX01faXRlcl9saXN0KCZfTV9ub25fZGJnX2ltcGwpIHt9Ci0jICBpZiBkZWZpbmVkIChfU1RMUF9ORUVEU19FWFRSQV9URU1QTEFURV9DT05TVFJVQ1RPUlMpCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KLSAgbGlzdChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCi0gICAgOiBfQ29uc3RydWN0Q2hlY2soX19maXJzdCwgX19sYXN0KSwKLSAgICAgIF9NX25vbl9kYmdfaW1wbChfU1RMUF9QUklWIF9Ob25fRGJnX2l0ZXIoX19maXJzdCksIF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2xhc3QpKSwKLSAgICAgIF9NX2l0ZXJfbGlzdCgmX01fbm9uX2RiZ19pbXBsKSB7fQotIyAgZW5kaWYKLSNlbHNlCi0KLSAgbGlzdChjb25zdCB2YWx1ZV90eXBlKiBfX2ZpcnN0LCBjb25zdCB2YWx1ZV90eXBlKiBfX2xhc3QsCi0gICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCi0gICAgOiBfQ29uc3RydWN0Q2hlY2soX19maXJzdCwgX19sYXN0KSwKLSAgICAgIF9NX25vbl9kYmdfaW1wbChfX2ZpcnN0LCBfX2xhc3QsIF9fYSksCi0gICAgICBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KLSAgbGlzdChjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QsCi0gICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCi0gICAgOiBfQ29uc3RydWN0Q2hlY2soX19maXJzdCwgX19sYXN0KSwKLSAgICAgIF9NX25vbl9kYmdfaW1wbChfX2ZpcnN0Ll9NX2l0ZXJhdG9yLCBfX2xhc3QuX01faXRlcmF0b3IsIF9fYSksCi0gICAgICBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KLQotI2VuZGlmCi0KLSAgbGlzdChjb25zdCBfU2VsZiYgX194KSA6Ci0gICAgX0NvbnN0cnVjdENoZWNrKF9feCksCi0gICAgX01fbm9uX2RiZ19pbXBsKF9feC5fTV9ub25fZGJnX2ltcGwpICwgX01faXRlcl9saXN0KCZfTV9ub25fZGJnX2ltcGwpIHt9Ci0KLSAgX1NlbGYmIG9wZXJhdG9yPShjb25zdCBfU2VsZiYgX194KSB7Ci0gICAgaWYgKHRoaXMgIT0gJl9feCkgewotICAgICAgLy9TaG91bGQgbm90IGludmFsaWRhdGUgZW5kIGl0ZXJhdG9yCi0gICAgICBfSW52YWxpZGF0ZV9pdGVyYXRvcnMoYmVnaW4oKSwgZW5kKCkpOwotICAgICAgX01fbm9uX2RiZ19pbXBsID0gX194Ll9NX25vbl9kYmdfaW1wbDsKLSAgICB9Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5nZXRfYWxsb2NhdG9yKCk7IH0KLQotICBpdGVyYXRvciBiZWdpbigpICAgICAgICAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5iZWdpbigpKTsgfQotICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5iZWdpbigpKTsgfQotCi0gIGl0ZXJhdG9yIGVuZCgpICAgICAgICAgICAgICAgeyByZXR1cm4gaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLmVuZCgpKTsgfQotICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5lbmQoKSk7IH0KLQotICByZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9Ci0gIHJldmVyc2VfaXRlcmF0b3IgcmVuZCgpICAgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQotCi0gIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3QgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KLSAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgY29uc3QgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQotCi0gIHNpemVfdHlwZSBzaXplKCkgY29uc3QgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLnNpemUoKTsgfQotICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwubWF4X3NpemUoKTsgfQotICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLmVtcHR5KCk7IH0KLQotICAvLyB0aG9zZSBhcmUgaGVyZSB0byBlbmZvcmNlIGNoZWNraW5nCi0gIHJlZmVyZW5jZSBmcm9udCgpIHsKLSAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghZW1wdHkoKSwgX1N0bE1zZ19FTVBUWV9DT05UQUlORVIpCi0gICAgcmV0dXJuICpiZWdpbigpOwotICB9Ci0gIGNvbnN0X3JlZmVyZW5jZSBmcm9udCgpIGNvbnN0IHsKLSAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghZW1wdHkoKSwgX1N0bE1zZ19FTVBUWV9DT05UQUlORVIpCi0gICAgcmV0dXJuICpiZWdpbigpOwotICB9Ci0gIHJlZmVyZW5jZSBiYWNrKCkgewotICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFlbXB0eSgpLCBfU3RsTXNnX0VNUFRZX0NPTlRBSU5FUikKLSAgICByZXR1cm4gKigtLWVuZCgpKTsKLSAgfQotICBjb25zdF9yZWZlcmVuY2UgYmFjaygpIGNvbnN0IHsKLSAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghZW1wdHkoKSwgX1N0bE1zZ19FTVBUWV9DT05UQUlORVIpCi0gICAgcmV0dXJuICooLS1lbmQoKSk7Ci0gIH0KLQotICB2b2lkIHN3YXAoX1NlbGYmIF9feCkgewotICAgIF9NX2l0ZXJfbGlzdC5fU3dhcF9vd25lcnMoX194Ll9NX2l0ZXJfbGlzdCk7Ci0gICAgX01fbm9uX2RiZ19pbXBsLnN3YXAoX194Ll9NX25vbl9kYmdfaW1wbCk7Ci0gIH0KLQotI2lmICFkZWZpbmVkKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pICYmICFkZWZpbmVkKF9TVExQX05PX0FOQUNIUk9OSVNNUykKLSAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBjb25zdCBfVHAmIF9feCA9IF9UcCgpKSB7Ci0jZWxzZQotICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIGNvbnN0IF9UcCYgX194KSB7Ci0jZW5kaWYgLyohX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSAmJiAhX1NUTFBfTk9fQU5BQ0hST05JU01TKi8KLSAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfb3duZXIoJl9NX2l0ZXJfbGlzdCxfX3BvcykpCi0gICAgcmV0dXJuIGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsX01fbm9uX2RiZ19pbXBsLmluc2VydChfX3Bvcy5fTV9pdGVyYXRvciwgX194KSApOwotICB9Ci0KLSNpZiBkZWZpbmVkKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pICYmICFkZWZpbmVkKF9TVExQX05PX0FOQUNIUk9OSVNNUykKLSAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zKSB7IHJldHVybiBpbnNlcnQoX19wb3MsIF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQoX1RwKSk7IH0KLSNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0gJiYgIV9TVExQX05PX0FOQUNIUk9OSVNNUyovCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Ci0gIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpIHsKLSMgIGlmIChfU1RMUF9ERUJVR19MRVZFTCA9PSBfU1RMUF9TVEFOREFSRF9EQkdfTEVWRUwpCi0gICAgdHlwZWRlZiB0eXBlbmFtZSBfQXJlU2FtZVVuQ1ZUeXBlczxfSW5wdXRJdGVyYXRvciwgaXRlcmF0b3I+OjpfUmV0IF9Jc0xpc3RJdGVyYXRvcjsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIF9BcmVTYW1lVW5DVlR5cGVzPF9JbnB1dEl0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj46Ol9SZXQgX0lzTGlzdENvbnN0SXRlcmF0b3I7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBfTG9yMjxfSXNMaXN0SXRlcmF0b3IsIF9Jc0xpc3RDb25zdEl0ZXJhdG9yPjo6X1JldCBfRG9DaGVjazsKLSMgIGVuZGlmCi0gICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX2lmX293bmVyKCZfTV9pdGVyX2xpc3QsIF9fcG9zKSkKLSAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKLSAgICBfU1RMUF9TVERfREVCVUdfQ0hFQ0soX19jaGVja19pZl9ub3Rfb3duZXIoJl9NX2l0ZXJfbGlzdCwgX19maXJzdCwgX0RvQ2hlY2soKSkpCi0gICAgX01fbm9uX2RiZ19pbXBsLmluc2VydChfX3Bvcy5fTV9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2ZpcnN0KSwgX1NUTFBfUFJJViBfTm9uX0RiZ19pdGVyKF9fbGFzdCkpOwotICB9Ci0jZWxzZQotICB2b2lkIGluc2VydChpdGVyYXRvciBfX3BvcywgY29uc3QgX1RwKiBfX2ZpcnN0LCBjb25zdCBfVHAqIF9fbGFzdCkgewotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LF9fcG9zKSkKLSAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcHRyX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCi0gICAgX01fbm9uX2RiZ19pbXBsLmluc2VydChfX3Bvcy5fTV9pdGVyYXRvciwgX19maXJzdCwgX19sYXN0KTsKLSAgfQotCi0gIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLAotICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpIHsKLSAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfb3duZXIoJl9NX2l0ZXJfbGlzdCwgX19wb3MpKQotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQotICAgIF9TVExQX1NURF9ERUJVR19DSEVDSyhfX2NoZWNrX2lmX25vdF9vd25lcigmX01faXRlcl9saXN0LCBfX2ZpcnN0LCBfRG9DaGVjaygpKSkKLSAgICBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0KF9fcG9zLl9NX2l0ZXJhdG9yLCBfX2ZpcnN0Ll9NX2l0ZXJhdG9yLCBfX2xhc3QuX01faXRlcmF0b3IpOwotICB9Ci0jZW5kaWYKLQotICB2b2lkIGluc2VydChpdGVyYXRvciBfX3Bvcywgc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3gpIHsKLSAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfb3duZXIoJl9NX2l0ZXJfbGlzdCxfX3BvcykpCi0gICAgX01fbm9uX2RiZ19pbXBsLmluc2VydChfX3Bvcy5fTV9pdGVyYXRvciwgX19uLCBfX3gpOwotICB9Ci0KLSAgdm9pZCBwdXNoX2JhY2soY29uc3RfcmVmZXJlbmNlIF9feCkgeyBfTV9ub25fZGJnX2ltcGwucHVzaF9iYWNrKF9feCk7IH0KLSAgdm9pZCBwb3BfYmFjaygpIHsKLSAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghZW1wdHkoKSwgX1N0bE1zZ19FTVBUWV9DT05UQUlORVIpCi0gICAgX0ludmFsaWRhdGVfaXRlcmF0b3IoZW5kKCkpOwotICAgIF9NX25vbl9kYmdfaW1wbC5wb3BfYmFjaygpOwotICB9Ci0KLSAgdm9pZCBwdXNoX2Zyb250KGNvbnN0X3JlZmVyZW5jZSBfX3gpIHsgX01fbm9uX2RiZ19pbXBsLnB1c2hfZnJvbnQoX194KTsgfQotICB2b2lkIHBvcF9mcm9udCgpIHsKLSAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghZW1wdHkoKSwgX1N0bE1zZ19FTVBUWV9DT05UQUlORVIpCi0gICAgX0ludmFsaWRhdGVfaXRlcmF0b3IoYmVnaW4oKSk7Ci0gICAgX01fbm9uX2RiZ19pbXBsLnBvcF9mcm9udCgpOwotICB9Ci0KLSAgaXRlcmF0b3IgZXJhc2UoaXRlcmF0b3IgX19wb3MpIHsKLSAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9EZXJlZmVyZW5jZWFibGUoX19wb3MpKQotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LF9fcG9zKSkKLSAgICBfSW52YWxpZGF0ZV9pdGVyYXRvcihfX3Bvcyk7Ci0gICAgcmV0dXJuIGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsX01fbm9uX2RiZ19pbXBsLmVyYXNlKF9fcG9zLl9NX2l0ZXJhdG9yKSk7Ci0gIH0KLSAgaXRlcmF0b3IgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KSB7Ci0gICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCwgYmVnaW4oKSwgZW5kKCkpKQotICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9ycyhfX2ZpcnN0LCBfX2xhc3QpOwotICAgIHJldHVybiBpdGVyYXRvciAoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLmVyYXNlKF9fZmlyc3QuX01faXRlcmF0b3IsIF9fbGFzdC5fTV9pdGVyYXRvcikpOwotICB9Ci0KLSNpZiAhZGVmaW5lZChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQotICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgX19uZXdfc2l6ZSwgY29uc3QgX1RwJiBfX3ggPSBfVHAoKSkgewotI2Vsc2UKLSAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9fbmV3X3NpemUsIGNvbnN0IF9UcCYgX194KSB7Ci0jZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKi8KLSAgICBfQmFzZV9pdGVyYXRvciBfX2kgPSBfTV9ub25fZGJnX2ltcGwuYmVnaW4oKTsKLSAgICBzaXplX3R5cGUgX19sZW4gPSAwOwotICAgIGZvciAoIDsgX19pICE9IF9NX25vbl9kYmdfaW1wbC5lbmQoKSAmJiBfX2xlbiA8IF9fbmV3X3NpemU7ICsrX19pLCArK19fbGVuKTsKLQotICAgIGlmIChfX2xlbiA9PSBfX25ld19zaXplKQotICAgICAgZXJhc2UoaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX19pKSwgZW5kKCkpOwotICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIF9faSA9PSBlbmQoKQotICAgICAgX01fbm9uX2RiZ19pbXBsLmluc2VydChfTV9ub25fZGJnX2ltcGwuZW5kKCksIF9fbmV3X3NpemUgLSBfX2xlbiwgX194KTsKLSAgfQotCi0jaWYgZGVmaW5lZChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQotICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgX19uZXdfc2l6ZSkgeyByZXNpemUoX19uZXdfc2l6ZSwgX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRChfVHApKTsgfQotI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQotcHJpdmF0ZToKLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2VyPgotICB2b2lkIF9NX2Fzc2lnbl9kaXNwYXRjaChfSW50ZWdlciBfX24sIF9JbnRlZ2VyIF9fdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX3RydWVfdHlwZSYgLypfSXNJbnRlZ3JhbCovKSB7Ci0gICAgX01fY2hlY2tfYXNzaWduKF9fbik7Ci0gICAgX01fbm9uX2RiZ19pbXBsLmFzc2lnbihfX24sIF9fdmFsKTsKLSAgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgotICB2b2lkIF9NX2Fzc2lnbl9kaXNwYXRjaChfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qX0lzSW50ZWdyYWwqLykgewotICAgIHNpemVfdHlwZSBfX2xlbiA9IGRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7Ci0gICAgX01fY2hlY2tfYXNzaWduKF9fbGVuKTsKLSAgICBfTV9ub25fZGJnX2ltcGwuYXNzaWduKF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2ZpcnN0KSwgX1NUTFBfUFJJViBfTm9uX0RiZ19pdGVyKF9fbGFzdCkpOwotICB9Ci0KLXB1YmxpYzoKLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgotICB2b2lkIGFzc2lnbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpIHsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0ludGVncmFsPF9JbnB1dEl0ZXJhdG9yPjo6X1JldCBfSW50ZWdyYWw7Ci0gICAgX01fYXNzaWduX2Rpc3BhdGNoKF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOwotICB9Ci0jZWxzZQotICB2b2lkIGFzc2lnbihjb25zdCBfVHAqIF9fZmlyc3QsIGNvbnN0IF9UcCogX19sYXN0KSB7Ci0gICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3B0cl9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQotICAgIF9NX25vbl9kYmdfaW1wbC5hc3NpZ24oX19maXJzdCwgX19sYXN0KTsKLSAgfQotCi0gIHZvaWQgYXNzaWduKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkgewotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQotICAgIF9NX25vbl9kYmdfaW1wbC5hc3NpZ24oX19maXJzdC5fTV9pdGVyYXRvciwgX19sYXN0Ll9NX2l0ZXJhdG9yKTsKLSAgfQotI2VuZGlmCi0KLXByaXZhdGU6Ci0gIHZvaWQgX01fY2hlY2tfYXNzaWduKHNpemVfdHlwZSBfX24pIHsKLSAgICBzaXplX3R5cGUgX19zaXplID0gc2l6ZSgpOwotICAgIGlmIChfX24gPCBfX3NpemUpIHsKLSAgICAgIGl0ZXJhdG9yIF9faXQgPSBiZWdpbigpOwotICAgICAgYWR2YW5jZShfX2l0LCBfX24gKyAxKTsKLSAgICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9ycyhfX2l0LCBlbmQoKSk7Ci0gICAgfQotICB9Ci0KLXB1YmxpYzoKLSAgdm9pZCBhc3NpZ24oc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3ZhbCkgewotICAgIF9NX2NoZWNrX2Fzc2lnbihfX24pOwotICAgIF9NX25vbl9kYmdfaW1wbC5hc3NpZ24oX19uLCBfX3ZhbCk7Ci0gIH0KLQotICB2b2lkIHJlbW92ZShjb25zdCBfVHAmIF9feCkgewotICAgIF9CYXNlX2l0ZXJhdG9yIF9fZmlyc3QgPSBfTV9ub25fZGJnX2ltcGwuYmVnaW4oKSwgX19sYXN0ID0gX01fbm9uX2RiZ19pbXBsLmVuZCgpOwotICAgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkgewotICAgICAgX0Jhc2VfaXRlcmF0b3IgX19uZXh0ID0gX19maXJzdDsKLSAgICAgICsrX19uZXh0OwotICAgICAgaWYgKF9feCA9PSAqX19maXJzdCkgewotICAgICAgICBfSW52YWxpZGF0ZV9pdGVyYXRvcihpdGVyYXRvcigmX01faXRlcl9saXN0LCBfX2ZpcnN0KSk7Ci0gICAgICAgIF9NX25vbl9kYmdfaW1wbC5lcmFzZShfX2ZpcnN0KTsKLSAgICAgIH0KLSAgICAgIF9fZmlyc3QgPSBfX25leHQ7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBjbGVhcigpIHsKLSAgICBfSW52YWxpZGF0ZV9pdGVyYXRvcnMoYmVnaW4oKSwgZW5kKCkpOwotICAgIF9NX25vbl9kYmdfaW1wbC5jbGVhcigpOwotICB9Ci0KLXB1YmxpYzoKLSAgdm9pZCBzcGxpY2UoaXRlcmF0b3IgX19wb3MsIF9TZWxmJiBfX3gpIHsKLSAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfb3duZXIoJl9NX2l0ZXJfbGlzdCxfX3BvcykpCi0gICAgX01fbm9uX2RiZ19pbXBsLnNwbGljZShfX3Bvcy5fTV9pdGVyYXRvciwgX194Ll9NX25vbl9kYmdfaW1wbCk7Ci0jaWYgKF9TVExQX0RFQlVHX0xFVkVMICE9IF9TVExQX1NUQU5EQVJEX0RCR19MRVZFTCkKLSAgICBpZiAoZ2V0X2FsbG9jYXRvcigpID09IF9feC5nZXRfYWxsb2NhdG9yKCkpCi0gICAgICBfX3guX01faXRlcl9saXN0Ll9TZXRfb3duZXIoX01faXRlcl9saXN0KTsKLSAgICBlbHNlCi0jZW5kaWYKLSAgICAgIC8vIFN0ZDogMjMuMi4yLjQ6NAotICAgICAgLy8gZW5kIGl0ZXJhdG9yIGlzIG5vdCBpbnZhbGlkYXRlZDoKLSAgICAgIF9feC5fSW52YWxpZGF0ZV9pdGVyYXRvcnMoX194LmJlZ2luKCksIF9feC5lbmQoKSk7Ci0gIH0KLQotICB2b2lkIHNwbGljZShpdGVyYXRvciBfX3BvcywgX1NlbGYmIF9feCwgaXRlcmF0b3IgX19pKSB7Ci0gICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX2lmX293bmVyKCZfTV9pdGVyX2xpc3QsX19wb3MpKQotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX0RlcmVmZXJlbmNlYWJsZShfX2kpKQotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmKF9feC5fTV9pdGVyX2xpc3QpLF9faSkpCi0gICAgX01fbm9uX2RiZ19pbXBsLnNwbGljZShfX3Bvcy5fTV9pdGVyYXRvciwgX194Ll9NX25vbl9kYmdfaW1wbCwgX19pLl9NX2l0ZXJhdG9yKTsKLSNpZiAoX1NUTFBfREVCVUdfTEVWRUwgIT0gX1NUTFBfU1RBTkRBUkRfREJHX0xFVkVMKQotICAgIGlmIChnZXRfYWxsb2NhdG9yKCkgPT0gX194LmdldF9hbGxvY2F0b3IoKSkKLSAgICAgIF9TVExQX1BSSVYgX19jaGFuZ2VfaXRlX293bmVyKF9faSwgJl9NX2l0ZXJfbGlzdCk7Ci0gICAgZWxzZQotI2VuZGlmCi0gICAgICAvLyBTdGQ6IDIzLjIuMi40OjcKLSAgICAgIF9feC5fSW52YWxpZGF0ZV9pdGVyYXRvcihfX2kpOwotICB9Ci0KLSAgdm9pZCBzcGxpY2UoaXRlcmF0b3IgX19wb3MsIF9TZWxmJiBfX3gsIGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkgewotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LCBfX3BvcykpCi0gICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCwgX194LmJlZ2luKCksIF9feC5lbmQoKSkpCi0gICAgX1NUTFBfREVCVUdfQ0hFQ0sodGhpcyA9PSAmX194ID8gIV9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX3BvcywgX19maXJzdCwgX19sYXN0KSA6IHRydWUpCi0jaWYgKF9TVExQX0RFQlVHX0xFVkVMICE9IF9TVExQX1NUQU5EQVJEX0RCR19MRVZFTCkKLSAgICBpZiAodGhpcy0+Z2V0X2FsbG9jYXRvcigpID09IF9feC5nZXRfYWxsb2NhdG9yKCkpCi0gICAgICBfU1RMUF9QUklWIF9fY2hhbmdlX3JhbmdlX293bmVyKF9fZmlyc3QsIF9fbGFzdCwgJl9NX2l0ZXJfbGlzdCk7Ci0gICAgZWxzZQotI2VuZGlmCi0gICAgICAvLyBTdGQ6IDIzLjIuMi40OjEyCi0gICAgICBfX3guX0ludmFsaWRhdGVfaXRlcmF0b3JzKF9fZmlyc3QsIF9fbGFzdCk7Ci0gICAgX01fbm9uX2RiZ19pbXBsLnNwbGljZShfX3Bvcy5fTV9pdGVyYXRvciwgX194Ll9NX25vbl9kYmdfaW1wbCwgX19maXJzdC5fTV9pdGVyYXRvciwgX19sYXN0Ll9NX2l0ZXJhdG9yKTsKLSAgfQotCi0gIHZvaWQgbWVyZ2UoX1NlbGYmIF9feCkgewotI2lmICFkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1NURDo6aXNfc29ydGVkKGJlZ2luKCkuX01faXRlcmF0b3IsIGVuZCgpLl9NX2l0ZXJhdG9yKSkKLSAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9TVEQ6OmlzX3NvcnRlZChfX3guYmVnaW4oKS5fTV9pdGVyYXRvciwgX194LmVuZCgpLl9NX2l0ZXJhdG9yKSkKLSNlbmRpZgotICAgIF9NX25vbl9kYmdfaW1wbC5tZXJnZShfX3guX01fbm9uX2RiZ19pbXBsKTsKLSAgICBpZiAodGhpcy0+Z2V0X2FsbG9jYXRvcigpID09IF9feC5nZXRfYWxsb2NhdG9yKCkpIHsKLSAgICAgIF9feC5fTV9pdGVyX2xpc3QuX1NldF9vd25lcihfTV9pdGVyX2xpc3QpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIF9feC5fSW52YWxpZGF0ZV9pdGVyYXRvcnMoX194LmJlZ2luKCksIF9feC5lbmQoKSk7Ci0gICAgfQotICB9Ci0gIHZvaWQgcmV2ZXJzZSgpIHsKLSAgICBfTV9ub25fZGJnX2ltcGwucmV2ZXJzZSgpOwotICB9Ci0gIHZvaWQgdW5pcXVlKCkgewotICAgIF9CYXNlX2l0ZXJhdG9yIF9fZmlyc3QgPSBfTV9ub25fZGJnX2ltcGwuYmVnaW4oKSwgX19sYXN0ID0gX01fbm9uX2RiZ19pbXBsLmVuZCgpOwotICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkgcmV0dXJuOwotICAgIF9CYXNlX2l0ZXJhdG9yIF9fbmV4dCA9IF9fZmlyc3Q7Ci0gICAgd2hpbGUgKCsrX19uZXh0ICE9IF9fbGFzdCkgewotICAgICAgaWYgKCpfX2ZpcnN0ID09ICpfX25leHQpIHsKLSAgICAgICAgX0ludmFsaWRhdGVfaXRlcmF0b3IoaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX19uZXh0KSk7Ci0gICAgICAgIF9NX25vbl9kYmdfaW1wbC5lcmFzZShfX25leHQpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBfX2ZpcnN0ID0gX19uZXh0OwotICAgICAgX19uZXh0ID0gX19maXJzdDsKLSAgICB9Ci0gIH0KLSAgdm9pZCBzb3J0KCkgewotICAgIF9NX25vbl9kYmdfaW1wbC5zb3J0KCk7Ci0gIH0KLQotI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCi0gIHRlbXBsYXRlIDxjbGFzcyBfUHJlZGljYXRlPgotICB2b2lkIHJlbW92ZV9pZihfUHJlZGljYXRlIF9fcHJlZCkgewotICAgIF9CYXNlX2l0ZXJhdG9yIF9fZmlyc3QgPSBfTV9ub25fZGJnX2ltcGwuYmVnaW4oKSwgX19sYXN0ID0gX01fbm9uX2RiZ19pbXBsLmVuZCgpOwotICAgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkgewotICAgICAgX0Jhc2VfaXRlcmF0b3IgX19uZXh0ID0gX19maXJzdDsKLSAgICAgICsrX19uZXh0OwotICAgICAgaWYgKF9fcHJlZCgqX19maXJzdCkpIHsKLSAgICAgICAgX0ludmFsaWRhdGVfaXRlcmF0b3IoaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX19maXJzdCkpOwotICAgICAgICBfTV9ub25fZGJnX2ltcGwuZXJhc2UoX19maXJzdCk7Ci0gICAgICB9Ci0gICAgICBfX2ZpcnN0ID0gX19uZXh0OwotICAgIH0KLSAgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBfQmluYXJ5UHJlZGljYXRlPgotICB2b2lkIHVuaXF1ZShfQmluYXJ5UHJlZGljYXRlIF9fYmluYXJ5X3ByZWQpIHsKLSAgICBfQmFzZV9pdGVyYXRvciBfX2ZpcnN0ID0gX01fbm9uX2RiZ19pbXBsLmJlZ2luKCksIF9fbGFzdCA9IF9NX25vbl9kYmdfaW1wbC5lbmQoKTsKLSAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QpIHJldHVybjsKLSAgICBfQmFzZV9pdGVyYXRvciBfX25leHQgPSBfX2ZpcnN0OwotICAgIHdoaWxlICgrK19fbmV4dCAhPSBfX2xhc3QpIHsKLSAgICAgIGlmIChfX2JpbmFyeV9wcmVkKCpfX2ZpcnN0LCAqX19uZXh0KSkgewotICAgICAgICBfSW52YWxpZGF0ZV9pdGVyYXRvcihpdGVyYXRvcigmX01faXRlcl9saXN0LCBfX25leHQpKTsKLSAgICAgICAgX01fbm9uX2RiZ19pbXBsLmVyYXNlKF9fbmV4dCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIF9fZmlyc3QgPSBfX25leHQ7Ci0gICAgICBfX25leHQgPSBfX2ZpcnN0OwotICAgIH0KLSAgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBfU3RyaWN0V2Vha09yZGVyaW5nPgotICB2b2lkIG1lcmdlKF9TZWxmJiBfX3gsIF9TdHJpY3RXZWFrT3JkZXJpbmcgX19jb21wKSB7Ci0jaWYgIWRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpCi0gICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfU1REOjppc19zb3J0ZWQoX01fbm9uX2RiZ19pbXBsLmJlZ2luKCksIF9NX25vbl9kYmdfaW1wbC5lbmQoKSwgX19jb21wKSkKLSAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9TVEQ6OmlzX3NvcnRlZChfX3guYmVnaW4oKS5fTV9pdGVyYXRvciwgX194LmVuZCgpLl9NX2l0ZXJhdG9yLCBfX2NvbXApKQotI2VuZGlmCi0gICAgX01fbm9uX2RiZ19pbXBsLm1lcmdlKF9feC5fTV9ub25fZGJnX2ltcGwsIF9fY29tcCk7Ci0gICAgaWYgKHRoaXMtPmdldF9hbGxvY2F0b3IoKSA9PSBfX3guZ2V0X2FsbG9jYXRvcigpKSB7Ci0gICAgICBfX3guX01faXRlcl9saXN0Ll9TZXRfb3duZXIoX01faXRlcl9saXN0KTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBfX3guX0ludmFsaWRhdGVfaXRlcmF0b3JzKF9feC5iZWdpbigpLCBfX3guZW5kKCkpOwotICAgIH0KLSAgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBfU3RyaWN0V2Vha09yZGVyaW5nPgotICB2b2lkIHNvcnQoX1N0cmljdFdlYWtPcmRlcmluZyBfX2NvbXApIHsKLSAgICBfTV9ub25fZGJnX2ltcGwuc29ydChfX2NvbXApOwotICB9Ci0jZW5kaWYKLX07Ci0KLQotX1NUTFBfRU5EX05BTUVTUEFDRQotCi0jdW5kZWYgX1NUTFBfTk9OX0RCR19MSVNUCi0KLSNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9MSVNUX0ggKi8KLQotLy8gTG9jYWwgVmFyaWFibGVzOgotLy8gbW9kZTpDKysKLS8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9kZWJ1Zy9fc2xpc3QuaCBiL3N0bC9kZWJ1Zy9fc2xpc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY1NzA2Ni4uMDAwMDAwMAotLS0gYS9zdGwvZGVidWcvX3NsaXN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MTIgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NwotICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk3Ci0gKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5Ci0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLQotLyogTk9URTogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgU1RMIGhlYWRlcnMuCi0gKiAgIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LgotICovCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfREJHX1NMSVNUX0gKLSNkZWZpbmUgX1NUTFBfSU5URVJOQUxfREJHX1NMSVNUX0gKLQotI2lmbmRlZiBfU1RMUF9EQkdfSVRFUkFUT1JfSAotIyAgaW5jbHVkZSA8c3RsL2RlYnVnL19pdGVyYXRvci5oPgotI2VuZGlmCi0KLSNkZWZpbmUgX1NUTFBfTk9OX0RCR19TTElTVCBfU1RMUF9QUklWIF9TVExQX05PTl9EQkdfTkFNRShzbGlzdCkgPF9UcCwgX0FsbG9jPgotCi1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLQotI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHX1VTRV9ESVNUSU5DVF9WQUxVRV9UWVBFX0hFTFBFUlMpCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Ci1pbmxpbmUgX1RwKgotdmFsdWVfdHlwZShjb25zdCBfU1RMUF9QUklWIF9EQkdfaXRlcl9iYXNlPCBfU1RMUF9OT05fREJHX1NMSVNUID4mKQoteyByZXR1cm4gKF9UcCopMDsgfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Ci1pbmxpbmUgZm9yd2FyZF9pdGVyYXRvcl90YWcKLWl0ZXJhdG9yX2NhdGVnb3J5KGNvbnN0IF9TVExQX1BSSVYgX0RCR19pdGVyX2Jhc2U8IF9TVExQX05PTl9EQkdfU0xJU1QgPiYpCi17IHJldHVybiBmb3J3YXJkX2l0ZXJhdG9yX3RhZygpOyB9Ci0jZW5kaWYKLQotX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQotCi0vKgotICogc2xpc3Qgc3BlY2lhbCBkZWJ1ZyB0cmFpdHMgdmVyc2lvbi4KLSAqLwotdGVtcGxhdGUgPGNsYXNzIF9UcmFpdHM+Ci1zdHJ1Y3QgX1NsaXN0RGJnVHJhaXRzIDogX1RyYWl0cyB7Ci0gIHR5cGVkZWYgX1NsaXN0RGJnVHJhaXRzPHR5cGVuYW1lIF9UcmFpdHM6Ol9Db25zdFRyYWl0cz4gX0NvbnN0VHJhaXRzOwotICB0eXBlZGVmIF9TbGlzdERiZ1RyYWl0czx0eXBlbmFtZSBfVHJhaXRzOjpfTm9uQ29uc3RUcmFpdHM+IF9Ob25Db25zdFRyYWl0czsKLQotICAvKgotICAgKiBXZSBkb24ndCB3YW50IHRoZSBiZWZvcmVfYmVnaW4gaXRlcmF0b3IgdG8gcmV0dXJuIGZhbHNlIGF0IF9EZXJlZmVyZW5jZWFibGUKLSAgICogY2FsbCB0byBkbyBub3QgYnJlYWsgdGhlIGN1cnJlbnQgZGVidWcgZnJhbWV3b3JrIGJ1dCBjYWxsaW5nICogb3BlcmF0b3Igc2hvdWxkCi0gICAqIGZhaWwuCi0gICAqLwotICB0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgotICBzdGF0aWMgYm9vbCBfQ2hlY2soY29uc3QgX0l0ZXJhdG9yJiBfX2l0KQotICB7IHJldHVybiAhKF9faXQuX01faXRlcmF0b3IgPT0gKF9faXQuX0dldF9jb250YWluZXJfcHRyKCkpLT5iZWZvcmVfYmVnaW4oKSk7IH0KLX07Ci0KLV9TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBfU1RMUF9ERUZBVUxUX0FMTE9DQVRPUl9TRUxFQ1QoX1RwKSA+Ci1jbGFzcyBzbGlzdCA6Ci0jaWYgIWRlZmluZWQgKF9fRE1DX18pCi0gICAgICAgICAgICAgcHJpdmF0ZQotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fY29uc3RydWN0X2NoZWNrZXI8X1NUTFBfTk9OX0RCR19TTElTVCA+Ci0jaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKQotICAgICAgICAgICAgLCBwdWJsaWMgX19zdGxwb3J0X2NsYXNzPHNsaXN0PF9UcCwgX0FsbG9jPiA+Ci0jZW5kaWYKLXsKLXByaXZhdGU6Ci0gIHR5cGVkZWYgX1NUTFBfTk9OX0RCR19TTElTVCBfQmFzZTsKLSAgdHlwZWRlZiBzbGlzdDxfVHAsX0FsbG9jPiBfU2VsZjsKLSAgdHlwZWRlZiBfU1RMUF9QUklWIF9fY29uc3RydWN0X2NoZWNrZXI8X1NUTFBfTk9OX0RCR19TTElTVCA+IF9Db25zdHJ1Y3RDaGVjazsKLQotcHVibGljOgotCi0gIF9fSU1QT1JUX0NPTlRBSU5FUl9UWVBFREVGUyhfQmFzZSkKLQotICB0eXBlZGVmIF9TVExQX1BSSVYgX0RCR19pdGVyPF9CYXNlLCBfU1RMUF9QUklWIF9TbGlzdERiZ1RyYWl0czxfTm9uY29uc3RfdHJhaXRzPHZhbHVlX3R5cGU+ID4gPiBpdGVyYXRvcjsKLSAgdHlwZWRlZiBfU1RMUF9QUklWIF9EQkdfaXRlcjxfQmFzZSwgX1NUTFBfUFJJViBfU2xpc3REYmdUcmFpdHM8X0NvbnN0X3RyYWl0czx2YWx1ZV90eXBlPiA+ID4gICAgY29uc3RfaXRlcmF0b3I7Ci0KLSAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5nZXRfYWxsb2NhdG9yKCk7IH0KLXByaXZhdGU6Ci0gIF9CYXNlIF9NX25vbl9kYmdfaW1wbDsKLSAgX1NUTFBfUFJJViBfX293bmVkX2xpc3QgX01faXRlcl9saXN0OwotCi0gIHZvaWQgX0ludmFsaWRhdGVfaXRlcmF0b3IoY29uc3QgaXRlcmF0b3ImIF9faXQpCi0gIHsgX1NUTFBfUFJJViBfX2ludmFsaWRhdGVfaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX19pdCk7IH0KLSAgdm9pZCBfSW52YWxpZGF0ZV9pdGVyYXRvcnMoY29uc3QgaXRlcmF0b3ImIF9fZmlyc3QsIGNvbnN0IGl0ZXJhdG9yJiBfX2xhc3QpCi0gIHsgX1NUTFBfUFJJViBfX2ludmFsaWRhdGVfcmFuZ2UoJl9NX2l0ZXJfbGlzdCwgX19maXJzdCwgX19sYXN0KTsgfQotCi0gIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yIF9CYXNlX2l0ZXJhdG9yOwotCi1wdWJsaWM6Ci0gIGV4cGxpY2l0IHNsaXN0KGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQotICAgIDogX01fbm9uX2RiZ19pbXBsKF9fYSkgLCBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KLQotI2lmICFkZWZpbmVkKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCi0gIGV4cGxpY2l0IHNsaXN0KHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCA9IF9UcCgpLAotI2Vsc2UKLSAgc2xpc3Qoc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX194LAotI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCi0gICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSAgYWxsb2NhdG9yX3R5cGUoKSkKLSAgICA6IF9NX25vbl9kYmdfaW1wbChfX24sIF9feCwgX19hKSwgX01faXRlcl9saXN0KCZfTV9ub25fZGJnX2ltcGwpIHt9Ci0KLSNpZiBkZWZpbmVkKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCi0gIGV4cGxpY2l0IHNsaXN0KHNpemVfdHlwZSBfX24pIDogX01fbm9uX2RiZ19pbXBsKF9fbikgLCBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KLSNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0qLwotCi0gIHNsaXN0KF9fbW92ZV9zb3VyY2U8X1NlbGY+IHNyYykKLSAgICA6IF9NX25vbl9kYmdfaW1wbChfX21vdmVfc291cmNlPF9CYXNlPihzcmMuZ2V0KCkuX01fbm9uX2RiZ19pbXBsKSksCi0gICAgICBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkgewotI2lmIGRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpIHx8IChfU1RMUF9ERUJVR19MRVZFTCA9PSBfU1RMUF9TVEFOREFSRF9EQkdfTEVWRUwpCi0gICAgc3JjLmdldCgpLl9NX2l0ZXJfbGlzdC5fSW52YWxpZGF0ZV9hbGwoKTsKLSNlbHNlCi0gICAgc3JjLmdldCgpLl9NX2l0ZXJfbGlzdC5fU2V0X293bmVyKF9NX2l0ZXJfbGlzdCk7Ci0jZW5kaWYKLSAgfQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKLSAgLy8gV2UgZG9uJ3QgbmVlZCBhbnkgZGlzcGF0Y2hpbmcgdHJpY2tzIGhlcmUsIGJlY2F1c2UgX01faW5zZXJ0X2FmdGVyX3JhbmdlCi0gIC8vIGFscmVhZHkgZG9lcyB0aGVtLgotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Ci0gIHNsaXN0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKLSAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSBfU1RMUF9BTExPQ0FUT1JfVFlQRV9ERkwpCi0gICAgOiBfQ29uc3RydWN0Q2hlY2soX19maXJzdCwgX19sYXN0KSwKLSAgICAgIF9NX25vbl9kYmdfaW1wbChfU1RMUF9QUklWIF9Ob25fRGJnX2l0ZXIoX19maXJzdCksIF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2xhc3QpLCBfX2EpLAotICAgICAgX01faXRlcl9saXN0KCZfTV9ub25fZGJnX2ltcGwpIHt9Ci0jICBpZiBkZWZpbmVkIChfU1RMUF9ORUVEU19FWFRSQV9URU1QTEFURV9DT05TVFJVQ1RPUlMpCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KLSAgc2xpc3QoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQotICAgIDogX0NvbnN0cnVjdENoZWNrKF9fZmlyc3QsIF9fbGFzdCksCi0gICAgICBfTV9ub25fZGJnX2ltcGwoX1NUTFBfUFJJViBfTm9uX0RiZ19pdGVyKF9fZmlyc3QpLCBfU1RMUF9QUklWIF9Ob25fRGJnX2l0ZXIoX19sYXN0KSksCi0gICAgICBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KLSMgIGVuZGlmCi0jZWxzZQotCi0gIHNsaXN0KGNvbnN0IHZhbHVlX3R5cGUqIF9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbGFzdCwKLSAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9ICBhbGxvY2F0b3JfdHlwZSgpKQotICAgIDogX0NvbnN0cnVjdENoZWNrKF9fZmlyc3QsIF9fbGFzdCksCi0gICAgICBfTV9ub25fZGJnX2ltcGwoX19maXJzdCwgX19sYXN0LCBfX2EpLAotICAgICAgX01faXRlcl9saXN0KCZfTV9ub25fZGJnX2ltcGwpIHt9Ci0KLSAgc2xpc3QoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0LAotICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSApCi0gICAgOiBfQ29uc3RydWN0Q2hlY2soX19maXJzdCwgX19sYXN0KSwKLSAgICAgIF9NX25vbl9kYmdfaW1wbChfX2ZpcnN0Ll9NX2l0ZXJhdG9yLCBfX2xhc3QuX01faXRlcmF0b3IsIF9fYSksCi0gICAgICBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KLSNlbmRpZgotCi0gIHNsaXN0KGNvbnN0IF9TZWxmJiBfX3gpIDoKLSAgICBfQ29uc3RydWN0Q2hlY2soX194KSwKLSAgICBfTV9ub25fZGJnX2ltcGwoX194Ll9NX25vbl9kYmdfaW1wbCksIF9NX2l0ZXJfbGlzdCgmX01fbm9uX2RiZ19pbXBsKSB7fQotCi0gIF9TZWxmJiBvcGVyYXRvcj0gKGNvbnN0IF9TZWxmJiBfX3gpIHsKLSAgICBpZiAodGhpcyAhPSAmX194KSB7Ci0gICAgICBfSW52YWxpZGF0ZV9pdGVyYXRvcnMoYmVnaW4oKSwgZW5kKCkpOwotICAgICAgX01fbm9uX2RiZ19pbXBsID0gX194Ll9NX25vbl9kYmdfaW1wbDsKLSAgICB9Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgfnNsaXN0KCkge30KLQotICB2b2lkIGFzc2lnbihzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ZhbCkgewotICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9ycyhiZWdpbigpLCBlbmQoKSk7Ci0gICAgX01fbm9uX2RiZ19pbXBsLmFzc2lnbihfX24sIF9fdmFsKTsKLSAgfQotCi0gIGl0ZXJhdG9yIGJlZm9yZV9iZWdpbigpCi0gIHsgcmV0dXJuIGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5iZWZvcmVfYmVnaW4oKSk7IH0KLSAgY29uc3RfaXRlcmF0b3IgYmVmb3JlX2JlZ2luKCkgY29uc3QKLSAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLmJlZm9yZV9iZWdpbigpKTsgfQotCi0gIGl0ZXJhdG9yIGJlZ2luKCkKLSAgeyByZXR1cm4gaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLmJlZ2luKCkpOyB9Ci0gIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QKLSAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLmJlZ2luKCkpO30KLQotICBpdGVyYXRvciBlbmQoKQotICB7IHJldHVybiBpdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuZW5kKCkpOyB9Ci0gIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0Ci0gIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5lbmQoKSk7IH0KLQotICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLmVtcHR5KCk7IH0KLSAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwuc2l6ZSgpOyB9Ci0gIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5tYXhfc2l6ZSgpOyB9Ci0KLSAgdm9pZCBzd2FwKF9TZWxmJiBfX3gpIHsKLSAgICBfTV9pdGVyX2xpc3QuX1N3YXBfb3duZXJzKF9feC5fTV9pdGVyX2xpc3QpOwotICAgIF9NX25vbl9kYmdfaW1wbC5zd2FwKF9feC5fTV9ub25fZGJnX2ltcGwpOwotICB9Ci0KLSAgcmVmZXJlbmNlIGZyb250KCkgewotICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFlbXB0eSgpLCBfU3RsTXNnX0VNUFRZX0NPTlRBSU5FUikKLSAgICByZXR1cm4gX01fbm9uX2RiZ19pbXBsLmZyb250KCk7Ci0gIH0KLSAgY29uc3RfcmVmZXJlbmNlIGZyb250KCkgY29uc3QgewotICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFlbXB0eSgpLCBfU3RsTXNnX0VNUFRZX0NPTlRBSU5FUikKLSAgICByZXR1cm4gX01fbm9uX2RiZ19pbXBsLmZyb250KCk7Ci0gIH0KLSAgdm9pZCBwdXNoX2Zyb250KGNvbnN0X3JlZmVyZW5jZSBfX3gpIHsgX01fbm9uX2RiZ19pbXBsLnB1c2hfZnJvbnQoX194KTsgfQotICB2b2lkIHBvcF9mcm9udCgpIHsKLSAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghZW1wdHkoKSwgX1N0bE1zZ19FTVBUWV9DT05UQUlORVIpCi0gICAgX01fbm9uX2RiZ19pbXBsLnBvcF9mcm9udCgpOwotICB9Ci0gIGl0ZXJhdG9yIHByZXZpb3VzKGNvbnN0X2l0ZXJhdG9yIF9fcG9zKSB7Ci0gICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX2lmX293bmVyKCZfTV9pdGVyX2xpc3QsIF9fcG9zKSkKLSAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghKF9fcG9zLl9NX2l0ZXJhdG9yID09IF9NX25vbl9kYmdfaW1wbC5iZWZvcmVfYmVnaW4oKSksIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKLSAgICByZXR1cm4gaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLnByZXZpb3VzKF9fcG9zLl9NX2l0ZXJhdG9yKSk7Ci0gIH0KLSAgY29uc3RfaXRlcmF0b3IgcHJldmlvdXMoY29uc3RfaXRlcmF0b3IgX19wb3MpIGNvbnN0IHsKLSAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfb3duZXIoJl9NX2l0ZXJfbGlzdCwgX19wb3MpKQotICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCEoX19wb3MuX01faXRlcmF0b3IgPT0gX01fbm9uX2RiZ19pbXBsLmJlZm9yZV9iZWdpbigpKSwgX1N0bE1zZ19JTlZBTElEX0FSR1VNRU5UKQotICAgIHJldHVybiBjb25zdF9pdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwucHJldmlvdXMoX19wb3MuX01faXRlcmF0b3IpKTsKLSAgfQotCi1wdWJsaWM6Ci0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKLSAgaXRlcmF0b3IgaW5zZXJ0X2FmdGVyKGl0ZXJhdG9yIF9fcG9zLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ggPSBfVHAoKSkgewotI2Vsc2UKLSAgaXRlcmF0b3IgaW5zZXJ0X2FmdGVyKGl0ZXJhdG9yIF9fcG9zLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpIHsKLSNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0qLwotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX0RlcmVmZXJlbmNlYWJsZShfX3BvcykpCi0gICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX2lmX293bmVyKCZfTV9pdGVyX2xpc3QsIF9fcG9zKSkKLSAgICByZXR1cm4gaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCxfTV9ub25fZGJnX2ltcGwuaW5zZXJ0X2FmdGVyKF9fcG9zLl9NX2l0ZXJhdG9yLCBfX3gpKTsKLSAgfQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKLSAgaXRlcmF0b3IgaW5zZXJ0X2FmdGVyKGl0ZXJhdG9yIF9fcG9zKSB7Ci0gICAgcmV0dXJuIGluc2VydF9hZnRlcihfX3BvcywgX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRChfVHApKTsKLSAgfQotI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCi0KLSAgdm9pZCBpbnNlcnRfYWZ0ZXIoaXRlcmF0b3IgX19wb3MsIHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkgewotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX0RlcmVmZXJlbmNlYWJsZShfX3BvcykpCi0gICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX2lmX293bmVyKCZfTV9pdGVyX2xpc3QsIF9fcG9zKSkKLSAgICBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0X2FmdGVyKF9fcG9zLl9NX2l0ZXJhdG9yLCBfX24sIF9feCk7Ci0gIH0KLQotI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KLSAgdm9pZCBhc3NpZ24oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KSB7Ci0gICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCi0gICAgX0ludmFsaWRhdGVfaXRlcmF0b3JzKGJlZ2luKCksIGVuZCgpKTsKLSAgICBfTV9ub25fZGJnX2ltcGwuYXNzaWduKF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2ZpcnN0KSwgX1NUTFBfUFJJViBfTm9uX0RiZ19pdGVyKF9fbGFzdCkpOwotICB9Ci0jZWxzZQotICB2b2lkIGFzc2lnbihjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpIHsKLSAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKLSAgICBfSW52YWxpZGF0ZV9pdGVyYXRvcnMoYmVnaW4oKSwgZW5kKCkpOwotICAgIF9NX25vbl9kYmdfaW1wbC5hc3NpZ24oX19maXJzdC5fTV9pdGVyYXRvciwgX19sYXN0Ll9NX2l0ZXJhdG9yKTsKLSAgfQotICB2b2lkIGFzc2lnbihjb25zdCB2YWx1ZV90eXBlICpfX2ZpcnN0LCBjb25zdCB2YWx1ZV90eXBlICpfX2xhc3QpIHsKLSAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcHRyX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCi0gICAgX0ludmFsaWRhdGVfaXRlcmF0b3JzKGJlZ2luKCksIGVuZCgpKTsKLSAgICBfTV9ub25fZGJnX2ltcGwuYXNzaWduKF9fZmlyc3QsIF9fbGFzdCk7Ci0gIH0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKLSAgdGVtcGxhdGUgPGNsYXNzIF9Jbkl0ZXI+Ci0gIHZvaWQgaW5zZXJ0X2FmdGVyKGl0ZXJhdG9yIF9fcG9zLCBfSW5JdGVyIF9fZmlyc3QsIF9Jbkl0ZXIgX19sYXN0KSB7Ci0gICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfRGVyZWZlcmVuY2VhYmxlKF9fcG9zKSkKLSAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfb3duZXIoJl9NX2l0ZXJfbGlzdCwgX19wb3MpKQotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQotICAgIF9NX25vbl9kYmdfaW1wbC5pbnNlcnRfYWZ0ZXIoX19wb3MuX01faXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9Ob25fRGJnX2l0ZXIoX19maXJzdCksIF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2xhc3QpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5JdGVyPgotICB2b2lkIGluc2VydChpdGVyYXRvciBfX3BvcywgX0luSXRlciBfX2ZpcnN0LCBfSW5JdGVyIF9fbGFzdCkgewotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LCBfX3BvcykpCi0gICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoIShfX3Bvcy5fTV9pdGVyYXRvciA9PSBfTV9ub25fZGJnX2ltcGwuYmVmb3JlX2JlZ2luKCkpLCBfU3RsTXNnX0lOVkFMSURfQVJHVU1FTlQpCi0gICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCi0gICAgX01fbm9uX2RiZ19pbXBsLmluc2VydChfX3Bvcy5fTV9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2ZpcnN0KSwgX1NUTFBfUFJJViBfTm9uX0RiZ19pdGVyKF9fbGFzdCkpOwotICB9Ci0jZWxzZQotICB2b2lkIGluc2VydF9hZnRlcihpdGVyYXRvciBfX3BvcywKLSAgICAgICAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KSB7Ci0gICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfRGVyZWZlcmVuY2VhYmxlKF9fcG9zKSkKLSAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfb3duZXIoJl9NX2l0ZXJfbGlzdCwgX19wb3MpKQotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQotICAgIF9NX25vbl9kYmdfaW1wbC5pbnNlcnRfYWZ0ZXIoX19wb3MuX01faXRlcmF0b3IsIF9fZmlyc3QuX01faXRlcmF0b3IsIF9fbGFzdC5fTV9pdGVyYXRvcik7Ci0gIH0KLSAgdm9pZCBpbnNlcnRfYWZ0ZXIoaXRlcmF0b3IgX19wb3MsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlX3R5cGUqIF9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbGFzdCkgewotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX0RlcmVmZXJlbmNlYWJsZShfX3BvcykpCi0gICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX2lmX293bmVyKCZfTV9pdGVyX2xpc3QsIF9fcG9zKSkKLSAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcHRyX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCi0gICAgX01fbm9uX2RiZ19pbXBsLmluc2VydF9hZnRlcihfX3Bvcy5fTV9pdGVyYXRvciwgX19maXJzdCwgX19sYXN0KTsKLSAgfQotCi0gIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpIHsKLSAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfb3duZXIoJl9NX2l0ZXJfbGlzdCwgX19wb3MpKQotICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCEoX19wb3MuX01faXRlcmF0b3IgPT0gX01fbm9uX2RiZ19pbXBsLmJlZm9yZV9iZWdpbigpKSwgX1N0bE1zZ19JTlZBTElEX0FSR1VNRU5UKQotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQotICAgIF9NX25vbl9kYmdfaW1wbC5pbnNlcnQoX19wb3MuX01faXRlcmF0b3IsIF9fZmlyc3QuX01faXRlcmF0b3IsIF9fbGFzdC5fTV9pdGVyYXRvcik7Ci0gIH0KLSAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIGNvbnN0IHZhbHVlX3R5cGUqIF9fZmlyc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZV90eXBlKiBfX2xhc3QpIHsKLSAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfb3duZXIoJl9NX2l0ZXJfbGlzdCxfX3BvcykpCi0gICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoIShfX3Bvcy5fTV9pdGVyYXRvciA9PSBfTV9ub25fZGJnX2ltcGwuYmVmb3JlX2JlZ2luKCkpLCBfU3RsTXNnX0lOVkFMSURfQVJHVU1FTlQpCi0gICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3B0cl9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQotICAgIF9NX25vbl9kYmdfaW1wbC5pbnNlcnQoX19wb3MuX01faXRlcmF0b3IsIF9fZmlyc3QsIF9fbGFzdCk7Ci0gIH0KLSNlbmRpZgotCi0jaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCi0gIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBfX3BvcywgY29uc3QgdmFsdWVfdHlwZSYgX194ID0gX1RwKCkpIHsKLSNlbHNlCi0gIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBfX3BvcywgY29uc3QgdmFsdWVfdHlwZSYgX194KSB7Ci0jZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKi8KLSAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfb3duZXIoJl9NX2l0ZXJfbGlzdCwgX19wb3MpKQotICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCEoX19wb3MuX01faXRlcmF0b3IgPT0gX01fbm9uX2RiZ19pbXBsLmJlZm9yZV9iZWdpbigpKSwgX1N0bE1zZ19JTlZBTElEX0FSR1VNRU5UKQotICAgIHJldHVybiBpdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0KF9fcG9zLl9NX2l0ZXJhdG9yLCBfX3gpKTsKLSAgfQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKLSAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zKSB7Ci0gICAgcmV0dXJuIGluc2VydChfX3BvcywgX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRChfVHApKTsKLSAgfQotI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCi0KLSAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkgewotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LCBfX3BvcykpCi0gICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoIShfX3Bvcy5fTV9pdGVyYXRvciA9PSBfTV9ub25fZGJnX2ltcGwuYmVmb3JlX2JlZ2luKCkpLCBfU3RsTXNnX0lOVkFMSURfQVJHVU1FTlQpCi0gICAgX01fbm9uX2RiZ19pbXBsLmluc2VydChfX3Bvcy5fTV9pdGVyYXRvciwgX19uLCBfX3gpOwotICB9Ci0KLXB1YmxpYzoKLSAgaXRlcmF0b3IgZXJhc2VfYWZ0ZXIoaXRlcmF0b3IgX19wb3MpIHsKLSAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9EZXJlZmVyZW5jZWFibGUoX19wb3MpKQotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LF9fcG9zKSkKLSAgICBpdGVyYXRvciBfX3RtcCA9IF9fcG9zOyArK19fdG1wOwotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX0RlcmVmZXJlbmNlYWJsZShfX3RtcCkpCi0gICAgX0ludmFsaWRhdGVfaXRlcmF0b3IoX190bXApOwotICAgIHJldHVybiBpdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuZXJhc2VfYWZ0ZXIoX19wb3MuX01faXRlcmF0b3IpKTsKLSAgfQotICBpdGVyYXRvciBlcmFzZV9hZnRlcihpdGVyYXRvciBfX2JlZm9yZV9maXJzdCwgaXRlcmF0b3IgX19sYXN0KSB7Ci0gICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfRGVyZWZlcmVuY2VhYmxlKF9fYmVmb3JlX2ZpcnN0KSkKLSAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19iZWZvcmVfZmlyc3QsIF9fbGFzdCwgYmVnaW4oKSwgZW5kKCkpKQotICAgIGl0ZXJhdG9yIF9fdG1wID0gX19iZWZvcmVfZmlyc3Q7ICsrX190bXA7Ci0gICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfRGVyZWZlcmVuY2VhYmxlKF9fdG1wKSkKLSAgICBfSW52YWxpZGF0ZV9pdGVyYXRvcnMoX190bXAsIF9fbGFzdCk7Ci0gICAgcmV0dXJuIGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5lcmFzZV9hZnRlcihfX2JlZm9yZV9maXJzdC5fTV9pdGVyYXRvciwgX19sYXN0Ll9NX2l0ZXJhdG9yKSk7Ci0gIH0KLQotICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBfX3BvcykgewotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX0RlcmVmZXJlbmNlYWJsZShfX3BvcykpCi0gICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoX19wb3MuX01faXRlcmF0b3IgIT0gX01fbm9uX2RiZ19pbXBsLmJlZm9yZV9iZWdpbigpLCBfU3RsTXNnX0lOVkFMSURfQVJHVU1FTlQpCi0gICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX2lmX293bmVyKCZfTV9pdGVyX2xpc3QsIF9fcG9zKSkKLSAgICBfSW52YWxpZGF0ZV9pdGVyYXRvcihfX3Bvcyk7Ci0gICAgcmV0dXJuIGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5lcmFzZShfX3Bvcy5fTV9pdGVyYXRvcikpOwotICB9Ci0gIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkgewotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QsIGJlZ2luKCksIGVuZCgpKSkKLSAgICBfSW52YWxpZGF0ZV9pdGVyYXRvcnMoX19maXJzdCwgX19sYXN0KTsKLSAgICByZXR1cm4gaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLmVyYXNlKF9fZmlyc3QuX01faXRlcmF0b3IsIF9fbGFzdC5fTV9pdGVyYXRvcikpOwotICB9Ci0KLSNpZiAhZGVmaW5lZChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQotICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgX19uZXdfc2l6ZSwgY29uc3QgdmFsdWVfdHlwZSYgX194ID0gX1RwKCkpIHsKLSNlbHNlCi0gIHZvaWQgcmVzaXplKHNpemVfdHlwZSBfX25ld19zaXplLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpIHsKLSNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0qLwotICAgIF9NX25vbl9kYmdfaW1wbC5yZXNpemUoX19uZXdfc2l6ZSwgX194KTsKLSAgfQotCi0jaWYgZGVmaW5lZChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQotICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgX19uZXdfc2l6ZSkgeyByZXNpemUoX19uZXdfc2l6ZSwgX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRChfVHApKTsgfQotI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCi0KLSAgdm9pZCBjbGVhcigpIHsKLSAgICBfSW52YWxpZGF0ZV9pdGVyYXRvcnMoYmVnaW4oKSwgZW5kKCkpOwotICAgIF9NX25vbl9kYmdfaW1wbC5jbGVhcigpOwotICB9Ci0KLXB1YmxpYzoKLSAgLy8gUmVtb3ZlcyBhbGwgb2YgdGhlIGVsZW1lbnRzIGZyb20gdGhlIGxpc3QgX194IHRvICp0aGlzLCBpbnNlcnRpbmcKLSAgLy8gdGhlbSBpbW1lZGlhdGVseSBhZnRlciBfX3Bvcy4gIF9feCBtdXN0IG5vdCBiZSAqdGhpcy4gIENvbXBsZXhpdHk6Ci0gIC8vIGxpbmVhciBpbiBfX3guc2l6ZSgpLgotICB2b2lkIHNwbGljZV9hZnRlcihpdGVyYXRvciBfX3BvcywgX1NlbGYmIF9feCkgewotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX0RlcmVmZXJlbmNlYWJsZShfX3BvcykpCi0gICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX2lmX293bmVyKCZfTV9pdGVyX2xpc3QsX19wb3MpKQotICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCEoJl9feCA9PSB0aGlzKSwgX1N0bE1zZ19JTlZBTElEX0FSR1VNRU5UKQotICAgIF9NX25vbl9kYmdfaW1wbC5zcGxpY2VfYWZ0ZXIoX19wb3MuX01faXRlcmF0b3IsIF9feC5fTV9ub25fZGJnX2ltcGwpOwotICAgIGlmIChnZXRfYWxsb2NhdG9yKCkgPT0gX194LmdldF9hbGxvY2F0b3IoKSkgewotICAgICAgX194Ll9NX2l0ZXJfbGlzdC5fU2V0X293bmVyKF9NX2l0ZXJfbGlzdCk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgX194Ll9JbnZhbGlkYXRlX2l0ZXJhdG9ycyhfX3guYmVnaW4oKSwgX194LmVuZCgpKTsKLSAgICB9Ci0gIH0KLQotICAvLyBNb3ZlcyB0aGUgZWxlbWVudCB0aGF0IGZvbGxvd3MgX19wcmV2IHRvICp0aGlzLCBpbnNlcnRpbmcgaXQgaW1tZWRpYXRlbHkKLSAgLy8gIGFmdGVyIF9fcG9zLiAgVGhpcyBpcyBjb25zdGFudCB0aW1lLgotICB2b2lkIHNwbGljZV9hZnRlcihpdGVyYXRvciBfX3BvcywgX1NlbGYmIF9feCwgaXRlcmF0b3IgX19wcmV2KSB7Ci0gICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfRGVyZWZlcmVuY2VhYmxlKF9fcG9zKSkKLSAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfb3duZXIoJl9NX2l0ZXJfbGlzdCwgX19wb3MpKQotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX0RlcmVmZXJlbmNlYWJsZShfX3ByZXYpKQotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmX194Ll9NX2l0ZXJfbGlzdCwgX19wcmV2KSkKLSAgICBpdGVyYXRvciBfX2VsZW0gPSBfX3ByZXY7ICsrX19lbGVtOwotICAgIF9NX25vbl9kYmdfaW1wbC5zcGxpY2VfYWZ0ZXIoX19wb3MuX01faXRlcmF0b3IsIF9feC5fTV9ub25fZGJnX2ltcGwsIF9fcHJldi5fTV9pdGVyYXRvcik7Ci0gICAgaWYgKGdldF9hbGxvY2F0b3IoKSA9PSBfX3guZ2V0X2FsbG9jYXRvcigpKSB7Ci0gICAgICBfU1RMUF9QUklWIF9fY2hhbmdlX2l0ZV9vd25lcihfX2VsZW0sICZfTV9pdGVyX2xpc3QpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIF9feC5fSW52YWxpZGF0ZV9pdGVyYXRvcihfX2VsZW0pOwotICAgIH0KLSAgfQotCi0gIC8vIE1vdmVzIHRoZSByYW5nZSBbX19iZWZvcmVfZmlyc3QgKyAxLCBfX2JlZm9yZV9sYXN0ICsgMSkgdG8gKnRoaXMsCi0gIC8vICBpbnNlcnRpbmcgaXQgaW1tZWRpYXRlbHkgYWZ0ZXIgX19wb3MuICBUaGlzIGlzIGNvbnN0YW50IHRpbWUuCi0gIHZvaWQgc3BsaWNlX2FmdGVyKGl0ZXJhdG9yIF9fcG9zLCBfU2VsZiYgX194LAotICAgICAgICAgICAgICAgICAgICBpdGVyYXRvciBfX2JlZm9yZV9maXJzdCwgaXRlcmF0b3IgX19iZWZvcmVfbGFzdCkgewotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX0RlcmVmZXJlbmNlYWJsZShfX3BvcykpCi0gICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX2lmX293bmVyKCZfTV9pdGVyX2xpc3QsX19wb3MpKQotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2JlZm9yZV9maXJzdCwgX19iZWZvcmVfbGFzdCkpCi0gICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX2lmX293bmVyKCZfX3guX01faXRlcl9saXN0LCBfX2JlZm9yZV9maXJzdCkpCi0gICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfRGVyZWZlcmVuY2VhYmxlKF9fYmVmb3JlX2ZpcnN0KSkKLSAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9EZXJlZmVyZW5jZWFibGUoX19iZWZvcmVfbGFzdCkpCi0gICAgaXRlcmF0b3IgX19maXJzdCA9IF9fYmVmb3JlX2ZpcnN0OyArK19fZmlyc3Q7Ci0gICAgaXRlcmF0b3IgX19sYXN0ID0gX19iZWZvcmVfbGFzdDsgKytfX2xhc3Q7Ci0gICAgaWYgKGdldF9hbGxvY2F0b3IoKSA9PSBfX3guZ2V0X2FsbG9jYXRvcigpKSB7Ci0gICAgICBfU1RMUF9QUklWIF9fY2hhbmdlX3JhbmdlX293bmVyKF9fZmlyc3QsIF9fbGFzdCwgJl9NX2l0ZXJfbGlzdCk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgX194Ll9JbnZhbGlkYXRlX2l0ZXJhdG9ycyhfX2ZpcnN0LCBfX2xhc3QpOwotICAgIH0KLSAgICBfTV9ub25fZGJnX2ltcGwuc3BsaWNlX2FmdGVyKF9fcG9zLl9NX2l0ZXJhdG9yLCBfX3guX01fbm9uX2RiZ19pbXBsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19iZWZvcmVfZmlyc3QuX01faXRlcmF0b3IsIF9fYmVmb3JlX2xhc3QuX01faXRlcmF0b3IpOwotICB9Ci0KLSAgLy8gTGluZWFyIGluIGRpc3RhbmNlKGJlZ2luKCksIF9fcG9zKSwgYW5kIGxpbmVhciBpbiBfX3guc2l6ZSgpLgotICB2b2lkIHNwbGljZShpdGVyYXRvciBfX3BvcywgX1NlbGYmIF9feCkgewotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LF9fcG9zKSkKLSAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghKF9fcG9zLl9NX2l0ZXJhdG9yID09IF9NX25vbl9kYmdfaW1wbC5iZWZvcmVfYmVnaW4oKSksIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKLSAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghKCZfX3ggPT0gdGhpcyksIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKLSAgICBfTV9ub25fZGJnX2ltcGwuc3BsaWNlKF9fcG9zLl9NX2l0ZXJhdG9yLCBfX3guX01fbm9uX2RiZ19pbXBsKTsKLSAgICBpZiAoZ2V0X2FsbG9jYXRvcigpID09IF9feC5nZXRfYWxsb2NhdG9yKCkpIHsKLSAgICAgIF9feC5fTV9pdGVyX2xpc3QuX1NldF9vd25lcihfTV9pdGVyX2xpc3QpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIF9feC5fSW52YWxpZGF0ZV9pdGVyYXRvcnMoX194LmJlZ2luKCksIF9feC5lbmQoKSk7Ci0gICAgfQotICB9Ci0KLSAgLy8gTGluZWFyIGluIGRpc3RhbmNlKGJlZ2luKCksIF9fcG9zKSwgYW5kIGluIGRpc3RhbmNlKF9feC5iZWdpbigpLCBfX2kpLgotICB2b2lkIHNwbGljZShpdGVyYXRvciBfX3BvcywgX1NlbGYmIF9feCwgaXRlcmF0b3IgX19pKSB7Ci0gICAgLy9fX3BvcyBzaG91bGQgYmUgb3duZWQgYnkgKnRoaXMgYW5kIG5vdCBiZSB0aGUgYmVmb3JlX2JlZ2luIGl0ZXJhdG9yCi0gICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX2lmX293bmVyKCZfTV9pdGVyX2xpc3QsX19wb3MpKQotICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCEoX19wb3MuX01faXRlcmF0b3IgPT0gX01fbm9uX2RiZ19pbXBsLmJlZm9yZV9iZWdpbigpKSwgX1N0bE1zZ19JTlZBTElEX0FSR1VNRU5UKQotICAgIC8vX19pIHNob3VsZCBiZSBkZXJlZmVyZW5jZWFibGUsIG5vdCBiZWZvcmVfYmVnaW4gYW5kIGJlIG93bmVkIGJ5IF9feAotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX0RlcmVmZXJlbmNlYWJsZShfX2kpKQotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmX194Ll9NX2l0ZXJfbGlzdCAsX19pKSkKLSAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghKF9faSA9PSBfX3guYmVmb3JlX2JlZ2luKCkpLCBfU3RsTXNnX0lOVkFMSURfQVJHVU1FTlQpCi0gICAgaWYgKGdldF9hbGxvY2F0b3IoKSA9PSBfX3guZ2V0X2FsbG9jYXRvcigpKSB7Ci0gICAgICBfU1RMUF9QUklWIF9fY2hhbmdlX2l0ZV9vd25lcihfX2ksICZfTV9pdGVyX2xpc3QpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIF9feC5fSW52YWxpZGF0ZV9pdGVyYXRvcihfX2kpOwotICAgIH0KLSAgICBfTV9ub25fZGJnX2ltcGwuc3BsaWNlKF9fcG9zLl9NX2l0ZXJhdG9yLCBfX3guX01fbm9uX2RiZ19pbXBsLCBfX2kuX01faXRlcmF0b3IpOwotICB9Ci0KLSAgLy8gTGluZWFyIGluIGRpc3RhbmNlKGJlZ2luKCksIF9fcG9zKSwgaW4gZGlzdGFuY2UoX194LmJlZ2luKCksIF9fZmlyc3QpLAotICAvLyBhbmQgaW4gZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KS4KLSAgdm9pZCBzcGxpY2UoaXRlcmF0b3IgX19wb3MsIF9TZWxmJiBfX3gsIGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkgewotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LF9fcG9zKSkKLSAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghKF9fcG9zLl9NX2l0ZXJhdG9yID09IF9NX25vbl9kYmdfaW1wbC5iZWZvcmVfYmVnaW4oKSksIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKLSAgICAvL19TVExQX1ZFUkJPU0VfQVNTRVJUKCZfX3ggIT0gdGhpcywgX1N0bE1zZ19JTlZBTElEX0FSR1VNRU5UKQotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QsIF9feC5iZWdpbigpLCBfX3guZW5kKCkpKQotICAgIGlmIChnZXRfYWxsb2NhdG9yKCkgPT0gX194LmdldF9hbGxvY2F0b3IoKSkgewotICAgICAgX1NUTFBfUFJJViBfX2NoYW5nZV9yYW5nZV9vd25lcihfX2ZpcnN0LCBfX2xhc3QsICZfTV9pdGVyX2xpc3QpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIF9feC5fSW52YWxpZGF0ZV9pdGVyYXRvcnMoX19maXJzdCwgX19sYXN0KTsKLSAgICB9Ci0gICAgX01fbm9uX2RiZ19pbXBsLnNwbGljZShfX3Bvcy5fTV9pdGVyYXRvciwgX194Ll9NX25vbl9kYmdfaW1wbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZmlyc3QuX01faXRlcmF0b3IsIF9fbGFzdC5fTV9pdGVyYXRvcik7Ci0gIH0KLQotICB2b2lkIHJldmVyc2UoKQotICB7IF9NX25vbl9kYmdfaW1wbC5yZXZlcnNlKCk7IH0KLQotICB2b2lkIHJlbW92ZShjb25zdCB2YWx1ZV90eXBlJiBfX3ZhbCkgewotICAgIF9CYXNlX2l0ZXJhdG9yIF9fZmlyc3QgPSBfTV9ub25fZGJnX2ltcGwuYmVnaW4oKSwgX19sYXN0ID0gX01fbm9uX2RiZ19pbXBsLmVuZCgpOwotICAgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkgewotICAgICAgX0Jhc2VfaXRlcmF0b3IgX19uZXh0ID0gX19maXJzdDsKLSAgICAgICsrX19uZXh0OwotICAgICAgaWYgKF9fdmFsID09ICpfX2ZpcnN0KSB7Ci0gICAgICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9yKGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9fZmlyc3QpKTsKLSAgICAgICAgX01fbm9uX2RiZ19pbXBsLmVyYXNlKF9fZmlyc3QpOwotICAgICAgfQotICAgICAgX19maXJzdCA9IF9fbmV4dDsKLSAgICB9Ci0gIH0KLSAgdm9pZCB1bmlxdWUoKSB7Ci0gICAgX0Jhc2VfaXRlcmF0b3IgX19maXJzdCA9IF9NX25vbl9kYmdfaW1wbC5iZWdpbigpLCBfX2xhc3QgPSBfTV9ub25fZGJnX2ltcGwuZW5kKCk7Ci0gICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KSByZXR1cm47Ci0gICAgX0Jhc2VfaXRlcmF0b3IgX19uZXh0ID0gX19maXJzdDsKLSAgICB3aGlsZSAoKytfX25leHQgIT0gX19sYXN0KSB7Ci0gICAgICBpZiAoKl9fZmlyc3QgPT0gKl9fbmV4dCkgewotICAgICAgICBfSW52YWxpZGF0ZV9pdGVyYXRvcihpdGVyYXRvcigmX01faXRlcl9saXN0LCBfX25leHQpKTsKLSAgICAgICAgX01fbm9uX2RiZ19pbXBsLmVyYXNlKF9fbmV4dCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIF9fZmlyc3QgPSBfX25leHQ7Ci0gICAgICBfX25leHQgPSBfX2ZpcnN0OwotICAgIH0KLSAgfQotICB2b2lkIG1lcmdlKF9TZWxmJiBfX3gpIHsKLSAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCgmX194ICE9IHRoaXMsIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKLSNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKLSAgICAvKiBjb21tZW50cyBiZWxvdyBkdWUgdG8gYnVnIGluIEdDQyBjb21waWxlcnM6IG9uZXMgZWF0IGFsbCBtZW1vcnkgIGFuZCBkaWUgaWYgc2VlCi0gICAgICogc29tZXRoaW5nIGxpa2UgbmFtZXNwYWNlX25hbWU6OmZ1bmNfbmFtZSgpIC0gcHRyCi0gICAgICovCi0gICAgX1NUTFBfREVCVUdfQ0hFQ0soIC8qIF9TVExQX1NURDo6ICovIGlzX3NvcnRlZChfTV9ub25fZGJnX2ltcGwuYmVnaW4oKSwgX01fbm9uX2RiZ19pbXBsLmVuZCgpKSkKLSAgICBfU1RMUF9ERUJVR19DSEVDSyggLyogX1NUTFBfU1REOjogKi8gaXNfc29ydGVkKF9feC5iZWdpbigpLl9NX2l0ZXJhdG9yLCBfX3guZW5kKCkuX01faXRlcmF0b3IpKQotI2VuZGlmCi0gICAgX01fbm9uX2RiZ19pbXBsLm1lcmdlKF9feC5fTV9ub25fZGJnX2ltcGwpOwotICAgIGlmIChnZXRfYWxsb2NhdG9yKCkgPT0gX194LmdldF9hbGxvY2F0b3IoKSkgewotICAgICAgX194Ll9NX2l0ZXJfbGlzdC5fU2V0X293bmVyKF9NX2l0ZXJfbGlzdCk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgX194Ll9JbnZhbGlkYXRlX2l0ZXJhdG9ycyhfX3guYmVnaW4oKSwgX194LmVuZCgpKTsKLSAgICB9Ci0gIH0KLSAgdm9pZCBzb3J0KCkgewotICAgIF9NX25vbl9kYmdfaW1wbC5zb3J0KCk7Ci0gIH0KLQotI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCi0gIHRlbXBsYXRlIDxjbGFzcyBfUHJlZGljYXRlPgotICB2b2lkIHJlbW92ZV9pZihfUHJlZGljYXRlIF9fcHJlZCkgewotICAgIF9CYXNlX2l0ZXJhdG9yIF9fZmlyc3QgPSBfTV9ub25fZGJnX2ltcGwuYmVnaW4oKSwgX19sYXN0ID0gX01fbm9uX2RiZ19pbXBsLmVuZCgpOwotICAgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkgewotICAgICAgX0Jhc2VfaXRlcmF0b3IgX19uZXh0ID0gX19maXJzdDsKLSAgICAgICsrX19uZXh0OwotICAgICAgaWYgKF9fcHJlZCgqX19maXJzdCkpIHsKLSAgICAgICAgX0ludmFsaWRhdGVfaXRlcmF0b3IoaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX19maXJzdCkpOwotICAgICAgICBfTV9ub25fZGJnX2ltcGwuZXJhc2UoX19maXJzdCk7Ci0gICAgICB9Ci0gICAgICBfX2ZpcnN0ID0gX19uZXh0OwotICAgIH0KLSAgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBfQmluYXJ5UHJlZGljYXRlPgotICB2b2lkIHVuaXF1ZShfQmluYXJ5UHJlZGljYXRlIF9fcHJlZCkgewotICAgIF9CYXNlX2l0ZXJhdG9yIF9fZmlyc3QgPSBfTV9ub25fZGJnX2ltcGwuYmVnaW4oKSwgX19sYXN0ID0gX01fbm9uX2RiZ19pbXBsLmVuZCgpOwotICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkgcmV0dXJuOwotICAgIF9CYXNlX2l0ZXJhdG9yIF9fbmV4dCA9IF9fZmlyc3Q7Ci0gICAgd2hpbGUgKCsrX19uZXh0ICE9IF9fbGFzdCkgewotICAgICAgaWYgKF9fYmluYXJ5X3ByZWQoKl9fZmlyc3QsICpfX25leHQpKSB7Ci0gICAgICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9yKGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9fbmV4dCkpOwotICAgICAgICBfTV9ub25fZGJnX2ltcGwuZXJhc2UoX19uZXh0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgX19maXJzdCA9IF9fbmV4dDsKLSAgICAgIF9fbmV4dCA9IF9fZmlyc3Q7Ci0gICAgfQotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIF9TdHJpY3RXZWFrT3JkZXJpbmc+Ci0gIHZvaWQgbWVyZ2UoX1NlbGYmIF9feCwgX1N0cmljdFdlYWtPcmRlcmluZyBfX29yZCkgewotICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCZfX3ggIT0gdGhpcywgX1N0bE1zZ19JTlZBTElEX0FSR1VNRU5UKQotI2lmICFkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQotICAgIC8qIGNvbW1lbnRzIGJlbG93IGR1ZSB0byBidWcgaW4gR0NDIGNvbXBpbGVyczogb25lcyBlYXQgYWxsIG1lbW9yeSAgYW5kIGRpZSBpZiBzZWUKLSAgICAgKiBzb21ldGhpbmcgbGlrZSBuYW1lc3BhY2VfbmFtZTo6ZnVuY19uYW1lKCkgLSBwdHIKLSAgICAgKi8KLSAgICBfU1RMUF9ERUJVR19DSEVDSyggLyogX1NUTFBfU1REOjogKi8gaXNfc29ydGVkKF9NX25vbl9kYmdfaW1wbC5iZWdpbigpLCBfTV9ub25fZGJnX2ltcGwuZW5kKCksIF9fb3JkKSkKLSAgICBfU1RMUF9ERUJVR19DSEVDSyggLyogX1NUTFBfU1REOjogKi8gaXNfc29ydGVkKF9feC5iZWdpbigpLl9NX2l0ZXJhdG9yLCBfX3guZW5kKCkuX01faXRlcmF0b3IsIF9fb3JkKSkKLSNlbmRpZgotICAgIF9NX25vbl9kYmdfaW1wbC5tZXJnZShfX3guX01fbm9uX2RiZ19pbXBsLCBfX29yZCk7Ci0gICAgaWYgKGdldF9hbGxvY2F0b3IoKSA9PSBfX3guZ2V0X2FsbG9jYXRvcigpKSB7Ci0gICAgICBfX3guX01faXRlcl9saXN0Ll9TZXRfb3duZXIoX01faXRlcl9saXN0KTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBfX3guX0ludmFsaWRhdGVfaXRlcmF0b3JzKF9feC5iZWdpbigpLCBfX3guZW5kKCkpOwotICAgIH0KLSAgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBfU3RyaWN0V2Vha09yZGVyaW5nPgotICB2b2lkIHNvcnQoX1N0cmljdFdlYWtPcmRlcmluZyBfX2NvbXApCi0gIHsgX01fbm9uX2RiZ19pbXBsLnNvcnQoX19jb21wKTsgfQotI2VuZGlmCi19OwotCi1fU1RMUF9FTkRfTkFNRVNQQUNFCi0KLSN1bmRlZiBfU1RMUF9OT05fREJHX1NMSVNUCi0KLSNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9EQkdfU0xJU1RfSCAqLwotCi0vLyBMb2NhbCBWYXJpYWJsZXM6Ci0vLyBtb2RlOkMrKwotLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RsL2RlYnVnL19zdHJpbmcuaCBiL3N0bC9kZWJ1Zy9fc3RyaW5nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyYWRjNjMuLjAwMDAwMDAKLS0tIGEvc3RsL2RlYnVnL19zdHJpbmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDg2NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTE5OTkKLSAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogQm9yaXMgRm9taXRjaGV2Ci0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKi8KLQotI2lmbmRlZiBfU1RMUF9EQkdfU1RSSU5HX0gKLSNkZWZpbmUgX1NUTFBfREJHX1NUUklOR19ICi0KLSNpZm5kZWYgX1NUTFBfREJHX0lURVJBVE9SX0gKLSMgIGluY2x1ZGUgPHN0bC9kZWJ1Zy9faXRlcmF0b3IuaD4KLSNlbmRpZgotCi1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLQotI2RlZmluZSBfU1RMUF9OT05fREJHX1NUUklOR19OQU1FIF9TVExQX05PTl9EQkdfTkFNRShzdHIpCi0jZGVmaW5lIF9TVExQX05PTl9EQkdfU1RSSU5HIF9TVExQX1BSSVYgX1NUTFBfTk9OX0RCR19TVFJJTkdfTkFNRSA8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9ERUJVR19VU0VfRElTVElOQ1RfVkFMVUVfVFlQRV9IRUxQRVJTKQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCxjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+Ci1pbmxpbmUgX0NoYXJUKgotdmFsdWVfdHlwZShjb25zdCBfU1RMUF9QUklWIF9EQkdfaXRlcl9iYXNlPCBfU1RMUF9OT05fREJHX1NUUklORyA+JikKLXsgcmV0dXJuIChfQ2hhclQqKTA7IH0KLXRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KLWlubGluZSByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZwotaXRlcmF0b3JfY2F0ZWdvcnkoY29uc3QgX1NUTFBfUFJJViBfREJHX2l0ZXJfYmFzZTwgX1NUTFBfTk9OX0RCR19TVFJJTkcgPiYpCi17IHJldHVybiByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZygpOyB9Ci0jZW5kaWYKLQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgotY2xhc3MgYmFzaWNfc3RyaW5nIDoKLSNpZiAhZGVmaW5lZCAoX19ETUNfXykKLSAgICAgICAgICAgICAgICAgICAgIHByaXZhdGUKLSNlbHNlCi0gICAgICAgICAgICAgICAgICAgICBwdWJsaWMKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fY29uc3RydWN0X2NoZWNrZXI8X1NUTFBfTk9OX0RCR19TVFJJTkcgPgotI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QQVJUSUFMX1NQRUNfV09SS0FST1VORCkgJiYgIWRlZmluZWQgKGJhc2ljX3N0cmluZykKLSAgICAgICAgICAgICAgICAgICAsIHB1YmxpYyBfX3N0bHBvcnRfY2xhc3M8YmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiA+Ci0jZW5kaWYKLXsKLXByb3RlY3RlZDoKLSAgdHlwZWRlZiBfU1RMUF9OT05fREJHX1NUUklORyBfQmFzZTsKLSAgdHlwZWRlZiBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+IF9TZWxmOwotICB0eXBlZGVmIF9TVExQX1BSSVYgX19jb25zdHJ1Y3RfY2hlY2tlcjxfU1RMUF9OT05fREJHX1NUUklORyA+IF9Db25zdHJ1Y3RDaGVjazsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfSXNQT0Q8X0NoYXJUPjo6X1R5cGUgX0NoYXJfSXNfUE9EOwotCi1wdWJsaWM6Ci0gIF9fSU1QT1JUX0NPTlRBSU5FUl9UWVBFREVGUyhfQmFzZSkKLSAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6dHJhaXRzX3R5cGUgdHJhaXRzX3R5cGU7Ci0gIHR5cGVkZWYgX1NUTFBfUFJJViBfREJHX2l0ZXI8X0Jhc2UsIF9TVExQX1BSSVYgX0RiZ1RyYWl0czxfTm9uY29uc3RfdHJhaXRzPHZhbHVlX3R5cGU+ID4gPiBpdGVyYXRvcjsKLSAgdHlwZWRlZiBfU1RMUF9QUklWIF9EQkdfaXRlcjxfQmFzZSwgX1NUTFBfUFJJViBfRGJnVHJhaXRzPF9Db25zdF90cmFpdHM8dmFsdWVfdHlwZT4gPiA+IGNvbnN0X2l0ZXJhdG9yOwotICBfU1RMUF9ERUNMQVJFX1JBTkRPTV9BQ0NFU1NfUkVWRVJTRV9JVEVSQVRPUlM7Ci0KLXB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29uc3RydWN0b3IsIGRlc3RydWN0b3IsIGFzc2lnbm1lbnQuCi0gIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Ol9SZXNlcnZlX3QgX1Jlc2VydmVfdDsKLQotcHJpdmF0ZToKLSAgX0Jhc2UgX01fbm9uX2RiZ19pbXBsOwotICBfU1RMUF9QUklWIF9fb3duZWRfbGlzdCBfTV9pdGVyX2xpc3Q7Ci0KLSAgdm9pZCBfSW52YWxpZGF0ZV9hbGwoKQotICB7IF9NX2l0ZXJfbGlzdC5fSW52YWxpZGF0ZV9hbGwoKTsgfQotICB2b2lkIF9Db21wYXJlX0NhcGFjaXR5IChzaXplX3R5cGUgX19vbGRfY2FwYWNpdHkpIHsKLSAgICBpZiAodGhpcy0+Y2FwYWNpdHkoKSA+IF9fb2xkX2NhcGFjaXR5KSB7Ci0gICAgICBfSW52YWxpZGF0ZV9hbGwoKTsKLSAgICB9Ci0gIH0KLSAgdm9pZCBfSW52YWxpZGF0ZV9pdGVyYXRvcihjb25zdCBpdGVyYXRvciYgX19pdCkKLSAgeyBfU1RMUF9QUklWIF9faW52YWxpZGF0ZV9pdGVyYXRvcigmX01faXRlcl9saXN0LCBfX2l0KTsgfQotICB2b2lkIF9JbnZhbGlkYXRlX2l0ZXJhdG9ycyhjb25zdCBpdGVyYXRvciYgX19mLCBjb25zdCBpdGVyYXRvciYgX19sKQotICB7IF9TVExQX1BSSVYgX19pbnZhbGlkYXRlX3JhbmdlKCZfTV9pdGVyX2xpc3QsIF9fZiwgX19sKTsgfQotCi1wdWJsaWM6Ci0jaW5jbHVkZSA8c3RsL19zdHJpbmdfbnBvcy5oPgotCi0gIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdCB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwuZ2V0X2FsbG9jYXRvcigpOyB9Ci0KLSAgZXhwbGljaXQgYmFzaWNfc3RyaW5nKGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQotICAgIDogX01fbm9uX2RiZ19pbXBsKF9fYSksIF9NX2l0ZXJfbGlzdCgmX01fbm9uX2RiZ19pbXBsKSB7fQotCi0gIGJhc2ljX3N0cmluZyhfUmVzZXJ2ZV90IF9fciwgc2l6ZV90IF9fbiwKLSAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQotICAgIDogX01fbm9uX2RiZ19pbXBsKF9fciwgX19uLCBfX2EpLCBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KLQotICBiYXNpY19zdHJpbmcoY29uc3QgX1NlbGYmIF9fcykKLSAgICA6IF9Db25zdHJ1Y3RDaGVjayhfX3MpLAotICAgICAgX01fbm9uX2RiZ19pbXBsKF9fcy5fTV9ub25fZGJnX2ltcGwpLCBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KLQotICBiYXNpY19zdHJpbmcoY29uc3QgX1NlbGYmIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uID0gbnBvcywKLSAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQotICAgIDogX01fbm9uX2RiZ19pbXBsKF9fcy5fTV9ub25fZGJnX2ltcGwsIF9fcG9zLCBfX24sIF9fYSksCi0gICAgICBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KLQotICBiYXNpY19zdHJpbmcoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX24sCi0gICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKLSAgICA6IF9Db25zdHJ1Y3RDaGVjayhfX3MpLCBfTV9ub25fZGJnX2ltcGwoX19zLCBfX24sIF9fYSksCi0gICAgICBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KLQotICBiYXNpY19zdHJpbmcoY29uc3QgX0NoYXJUKiBfX3MsCi0gICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKLSAgICA6IF9Db25zdHJ1Y3RDaGVjayhfX3MpLAotICAgICAgX01fbm9uX2RiZ19pbXBsKF9fcywgX19hKSwgX01faXRlcl9saXN0KCZfTV9ub25fZGJnX2ltcGwpIHt9Ci0KLSAgYmFzaWNfc3RyaW5nKHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MsCi0gICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKLSAgICA6IF9NX25vbl9kYmdfaW1wbChfX24sIF9fYywgX19hKSwgX01faXRlcl9saXN0KCZfTV9ub25fZGJnX2ltcGwpIHt9Ci0KLSAgYmFzaWNfc3RyaW5nKF9fbW92ZV9zb3VyY2U8X1NlbGY+IHNyYykKLSAgICA6IF9NX25vbl9kYmdfaW1wbChfX21vdmVfc291cmNlPF9CYXNlID4oc3JjLmdldCgpLl9NX25vbl9kYmdfaW1wbCkpLAotICAgICAgX01faXRlcl9saXN0KCZfTV9ub25fZGJnX2ltcGwpIHsKLSNpZiBkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKSB8fCAoX1NUTFBfREVCVUdfTEVWRUwgPT0gX1NUTFBfU1RBTkRBUkRfREJHX0xFVkVMKQotICAgIHNyYy5nZXQoKS5fTV9pdGVyX2xpc3QuX0ludmFsaWRhdGVfYWxsKCk7Ci0jZWxzZQotICAgIHNyYy5nZXQoKS5fTV9pdGVyX2xpc3QuX1NldF9vd25lcihfTV9pdGVyX2xpc3QpOwotI2VuZGlmCi0gIH0KLQotI2lmICFkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKSB8fCBkZWZpbmVkKF9fTVJDX18pIHx8IGRlZmluZWQoX19TQ19fKQotICBiYXNpY19zdHJpbmcoY29uc3QgX0NoYXJUKiBfX2YsIGNvbnN0IF9DaGFyVCogX19sLAotICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCi0gICAgOiBfQ29uc3RydWN0Q2hlY2soX19mLCBfX2wpLAotICAgICAgX01fbm9uX2RiZ19pbXBsKF9fZiwgX19sLCBfX2EpLCBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkgewotICB9Ci0gIGJhc2ljX3N0cmluZyhjb25zdF9pdGVyYXRvciBfX2YsIGNvbnN0X2l0ZXJhdG9yIF9fbCwKLSAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlICYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKLSAgICA6IF9Db25zdHJ1Y3RDaGVjayhfX2YsIF9fbCksCi0gICAgICBfTV9ub25fZGJnX2ltcGwoX19mLl9NX2l0ZXJhdG9yLCBfX2wuX01faXRlcmF0b3IsIF9fYSksIF9NX2l0ZXJfbGlzdCgmX01fbm9uX2RiZ19pbXBsKSB7Ci0gIH0KLSNlbHNlCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KLSAgYmFzaWNfc3RyaW5nKF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLAotICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUgJiBfX2EgX1NUTFBfQUxMT0NBVE9SX1RZUEVfREZMKQotICAgIDogX0NvbnN0cnVjdENoZWNrKF9fZiwgX19sKSwKLSAgICAgIF9NX25vbl9kYmdfaW1wbChfU1RMUF9QUklWIF9Ob25fRGJnX2l0ZXIoX19mKSwgX1NUTFBfUFJJViBfTm9uX0RiZ19pdGVyKF9fbCksIF9fYSksCi0gICAgICBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KLSMgIGlmIGRlZmluZWQgKF9TVExQX05FRURTX0VYVFJBX1RFTVBMQVRFX0NPTlNUUlVDVE9SUykKLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgotICBiYXNpY19zdHJpbmcoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wpCi0gICAgOiBfQ29uc3RydWN0Q2hlY2soX19mLCBfX2wpLAotICAgICAgX01fbm9uX2RiZ19pbXBsKF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2YpLCBfU1RMUF9QUklWIF9Ob25fRGJnX2l0ZXIoX19sKSksCi0gICAgICBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KLSMgIGVuZGlmCi0jZW5kaWYKLQotcHJpdmF0ZToKLSAgLy8gY29uc3RydWN0b3IgZnJvbSBub24tZGVidWcgdmVyc2lvbiBmb3Igc3Vic3RyCi0gIGJhc2ljX3N0cmluZyAoY29uc3QgX0Jhc2UmIF9feCkKLSAgICA6IF9NX25vbl9kYmdfaW1wbChfX3gpLCBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KLQotcHVibGljOgotICBfU2VsZiYgb3BlcmF0b3I9KGNvbnN0IF9TZWxmJiBfX3MpIHsKLSAgICBpZiAodGhpcyAhPSAmX19zKSB7Ci0gICAgICBhc3NpZ24oX19zKTsKLSAgICB9Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgX1NlbGYmIG9wZXJhdG9yPShjb25zdCBfQ2hhclQqIF9fcykgewotICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCi0gICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoKF9fcyAhPSAwKSwgX1N0bE1zZ19JTlZBTElEX0FSR1VNRU5UKQotICAgIHJldHVybiBhc3NpZ24oX19zKTsKLSAgfQotCi0gIF9TZWxmJiBvcGVyYXRvcj0oX0NoYXJUIF9fYykgewotICAgIHJldHVybiBhc3NpZ24oMSwgX19jKTsKLSAgfQotCi0gIC8vIEl0ZXJhdG9ycy4KLSAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBpdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuYmVnaW4oKSk7IH0KLSAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBjb25zdF9pdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuYmVnaW4oKSk7IH0KLSAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLmVuZCgpKTsgfQotICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBjb25zdF9pdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuZW5kKCkpOyB9Ci0KLSAgcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSAgICAgICAgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQotICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9Ci0gIHJldmVyc2VfaXRlcmF0b3IgcmVuZCgpICAgICAgICAgICAgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQotICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSBjb25zdCAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KLQotICAvLyBTaXplLCBjYXBhY2l0eSwgZXRjLgotICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5zaXplKCk7IH0KLSAgc2l6ZV90eXBlIGxlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5sZW5ndGgoKTsgfQotICBzaXplX3QgbWF4X3NpemUoKSBjb25zdCB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwubWF4X3NpemUoKTsgfQotCi0gIHZvaWQgcmVzaXplKHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MpIHsKLSAgICBpZiAoX19uID4gY2FwYWNpdHkoKSkKLSAgICAgIF9JbnZhbGlkYXRlX2FsbCgpOwotICAgIGVsc2UgaWYgKF9fbiA8IHNpemUoKSkKLSAgICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9ycyhiZWdpbigpICsgX19uLCBlbmQoKSk7Ci0gICAgX01fbm9uX2RiZ19pbXBsLnJlc2l6ZShfX24sIF9fYyk7Ci0gIH0KLSAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9fbikgeyByZXNpemUoX19uLCBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKF9DaGFyVCkpOyB9Ci0gIHNpemVfdHlwZSBjYXBhY2l0eSgpIGNvbnN0IHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5jYXBhY2l0eSgpOyB9Ci0KLSAgdm9pZCByZXNlcnZlKHNpemVfdHlwZSBfX3MgPSAwKSB7Ci0gICAgaWYgKF9fcyA+IGNhcGFjaXR5KCkpIF9JbnZhbGlkYXRlX2FsbCgpOwotICAgIF9NX25vbl9kYmdfaW1wbC5yZXNlcnZlKF9fcyk7Ci0gIH0KLQotICB2b2lkIGNsZWFyKCkgewotICAgIF9JbnZhbGlkYXRlX2FsbCgpOwotICAgIF9NX25vbl9kYmdfaW1wbC5jbGVhcigpOwotICB9Ci0KLSAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5lbXB0eSgpOyB9Ci0KLSAgY29uc3RfcmVmZXJlbmNlIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fbikgY29uc3QgewotICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKF9fbiA8PSB0aGlzLT5zaXplKCksIF9TdGxNc2dfT1VUX09GX0JPVU5EUyk7Ci0gICAgcmV0dXJuIF9NX25vbl9kYmdfaW1wbFtfX25dOwotICB9Ci0KLSAgcmVmZXJlbmNlIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fbikgewotICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKF9fbiA8IHRoaXMtPnNpemUoKSwgX1N0bE1zZ19PVVRfT0ZfQk9VTkRTKQotICAgIHJldHVybiBfTV9ub25fZGJnX2ltcGxbX19uXTsKLSAgfQotCi0gIGNvbnN0X3JlZmVyZW5jZSBhdChzaXplX3R5cGUgX19uKSBjb25zdCB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwuYXQoX19uKTsgfQotICByZWZlcmVuY2UgYXQoc2l6ZV90eXBlIF9fbikgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLmF0KF9fbik7IH0KLQotICAvLyBBcHBlbmQsIG9wZXJhdG9yKz0sIHB1c2hfYmFjay4KLSAgX1NlbGYmIG9wZXJhdG9yKz0oY29uc3QgX1NlbGYmIF9fcykgeyByZXR1cm4gYXBwZW5kKF9fcyk7IH0KLSAgX1NlbGYmIG9wZXJhdG9yKz0oY29uc3QgX0NoYXJUKiBfX3MpIHsKLSAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKQotICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKChfX3MgIT0gMCksIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKLSAgICByZXR1cm4gYXBwZW5kKF9fcyk7Ci0gIH0KLSAgX1NlbGYmIG9wZXJhdG9yKz0oX0NoYXJUIF9fYykgeyByZXR1cm4gYXBwZW5kKDEsIF9fYyk7IH0KLQotI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgotICBfU2VsZiYgYXBwZW5kKF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QpIHsKLSAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKLSAgICBzaXplX3R5cGUgX19vbGRfY2FwYWNpdHkgPSBjYXBhY2l0eSgpOwotICAgIF9NX25vbl9kYmdfaW1wbC5hcHBlbmQoX1NUTFBfUFJJViBfTm9uX0RiZ19pdGVyKF9fZmlyc3QpLCBfU1RMUF9QUklWIF9Ob25fRGJnX2l0ZXIoX19sYXN0KSk7Ci0gICAgX0NvbXBhcmVfQ2FwYWNpdHkoX19vbGRfY2FwYWNpdHkpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykgfHwgXAotICAgICFkZWZpbmVkIChfU1RMUF9OT19NRVRIT0RfU1BFQ0lBTElaQVRJT04pICYmICFkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQotICBfU2VsZiYgYXBwZW5kKGNvbnN0IF9DaGFyVCogX19mLCBjb25zdCBfQ2hhclQqIF9fbCkgewotICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2YpIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2wpCi0gICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3B0cl9yYW5nZShfX2YsIF9fbCkpCi0gICAgc2l6ZV90eXBlIF9fb2xkX2NhcGFjaXR5ID0gY2FwYWNpdHkoKTsKLSAgICBfTV9ub25fZGJnX2ltcGwuYXBwZW5kKF9fZiwgX19sKTsKLSAgICBfQ29tcGFyZV9DYXBhY2l0eShfX29sZF9jYXBhY2l0eSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgX1NlbGYmIGFwcGVuZChjb25zdF9pdGVyYXRvciBfX2YsIGNvbnN0X2l0ZXJhdG9yIF9fbCkgewotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2YsIF9fbCkpCi0gICAgc2l6ZV90eXBlIF9fb2xkX2NhcGFjaXR5ID0gY2FwYWNpdHkoKTsKLSAgICBfTV9ub25fZGJnX2ltcGwuYXBwZW5kKF9fZi5fTV9pdGVyYXRvciwgX19sLl9NX2l0ZXJhdG9yKTsKLSAgICBfQ29tcGFyZV9DYXBhY2l0eShfX29sZF9jYXBhY2l0eSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0jZW5kaWYKLQotICBfU2VsZiYgYXBwZW5kKGNvbnN0IF9TZWxmJiBfX3MpIHsKLSAgICBzaXplX3R5cGUgX19vbGRfY2FwYWNpdHkgPSBjYXBhY2l0eSgpOwotICAgIF9NX25vbl9kYmdfaW1wbC5hcHBlbmQoX19zLl9NX25vbl9kYmdfaW1wbCk7Ci0gICAgX0NvbXBhcmVfQ2FwYWNpdHkoX19vbGRfY2FwYWNpdHkpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIF9TZWxmJiBhcHBlbmQoY29uc3QgX1NlbGYmIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSB7Ci0gICAgc2l6ZV90eXBlIF9fb2xkX2NhcGFjaXR5ID0gY2FwYWNpdHkoKTsKLSAgICBfTV9ub25fZGJnX2ltcGwuYXBwZW5kKF9fcy5fTV9ub25fZGJnX2ltcGwsIF9fcG9zLCBfX24pOwotICAgIF9Db21wYXJlX0NhcGFjaXR5KF9fb2xkX2NhcGFjaXR5KTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBfU2VsZiYgYXBwZW5kKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uKSB7Ci0gICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKLSAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCgoX19zICE9IDApLCBfU3RsTXNnX0lOVkFMSURfQVJHVU1FTlQpCi0gICAgc2l6ZV90eXBlIF9fb2xkX2NhcGFjaXR5ID0gY2FwYWNpdHkoKTsKLSAgICBfTV9ub25fZGJnX2ltcGwuYXBwZW5kKF9fcywgX19uKTsKLSAgICBfQ29tcGFyZV9DYXBhY2l0eShfX29sZF9jYXBhY2l0eSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgX1NlbGYmIGFwcGVuZChjb25zdCBfQ2hhclQqIF9fcykgewotICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCi0gICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoKF9fcyAhPSAwKSwgX1N0bE1zZ19JTlZBTElEX0FSR1VNRU5UKQotICAgIHNpemVfdHlwZSBfX29sZF9jYXBhY2l0eSA9IGNhcGFjaXR5KCk7Ci0gICAgX01fbm9uX2RiZ19pbXBsLmFwcGVuZChfX3MpOwotICAgIF9Db21wYXJlX0NhcGFjaXR5KF9fb2xkX2NhcGFjaXR5KTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBfU2VsZiYgYXBwZW5kKHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MpIHsKLSAgICBzaXplX3R5cGUgX19vbGRfY2FwYWNpdHkgPSB0aGlzLT5jYXBhY2l0eSgpOwotICAgIF9NX25vbl9kYmdfaW1wbC5hcHBlbmQoX19uLCBfX2MpOwotICAgIF9Db21wYXJlX0NhcGFjaXR5KF9fb2xkX2NhcGFjaXR5KTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICB2b2lkIHB1c2hfYmFjayhfQ2hhclQgX19jKSB7Ci0gICAgc2l6ZV90eXBlIF9fb2xkX2NhcGFjaXR5ID0gdGhpcy0+Y2FwYWNpdHkoKTsKLSAgICBfTV9ub25fZGJnX2ltcGwucHVzaF9iYWNrKF9fYyk7Ci0gICAgX0NvbXBhcmVfQ2FwYWNpdHkoX19vbGRfY2FwYWNpdHkpOwotICB9Ci0KLSAgdm9pZCBwb3BfYmFjaygpIHsKLSAgICBfSW52YWxpZGF0ZV9pdGVyYXRvcih0aGlzLT5lbmQoKSk7Ci0gICAgX01fbm9uX2RiZ19pbXBsLnBvcF9iYWNrKCk7Ci0gIH0KLQotICAvLyBBc3NpZ24KLXByaXZhdGU6Ci0gIHZvaWQgX01fY2hlY2tfYXNzaWduKHNpemVfdHlwZSBfX24pIHsKLSAgICBpZiAoX19uID4gY2FwYWNpdHkoKSkgewotICAgICAgX0ludmFsaWRhdGVfYWxsKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKF9fbiA8IHNpemUoKSkgewotICAgICAgX0ludmFsaWRhdGVfaXRlcmF0b3JzKGJlZ2luKCkgKyBfX24sIGVuZCgpKTsKLSAgICB9Ci0gIH0KLQotcHVibGljOgotICBfU2VsZiYgYXNzaWduKGNvbnN0IF9TZWxmJiBfX3MpIHsKLSAgICBfTV9jaGVja19hc3NpZ24oX19zLnNpemUoKSk7Ci0gICAgX01fbm9uX2RiZ19pbXBsLmFzc2lnbihfX3MuX01fbm9uX2RiZ19pbXBsKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBfU2VsZiYgYXNzaWduKGNvbnN0IF9TZWxmJiBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgewotICAgIGlmIChfX3BvcyA8IF9fcy5zaXplKCkpIHsKLSAgICAgIF9NX2NoZWNrX2Fzc2lnbigobWluKSAoX19uLCBfX3Muc2l6ZSgpIC0gX19wb3MpKTsKLSAgICB9Ci0gICAgX01fbm9uX2RiZ19pbXBsLmFzc2lnbihfX3MuX01fbm9uX2RiZ19pbXBsLCBfX3BvcywgX19uKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBfU2VsZiYgYXNzaWduKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uKSB7Ci0gICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKLSAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCgoX19zICE9IDApLCBfU3RsTXNnX0lOVkFMSURfQVJHVU1FTlQpCi0gICAgX01fY2hlY2tfYXNzaWduKChtaW4pIChfVHJhaXRzOjpsZW5ndGgoX19zKSwgX19uKSk7Ci0gICAgX01fbm9uX2RiZ19pbXBsLmFzc2lnbihfX3MsIF9fcyArIF9fbik7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgX1NlbGYmIGFzc2lnbihjb25zdCBfQ2hhclQqIF9fcykgewotICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCi0gICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoKF9fcyAhPSAwKSwgX1N0bE1zZ19JTlZBTElEX0FSR1VNRU5UKQotICAgIF9NX2NoZWNrX2Fzc2lnbihfVHJhaXRzOjpsZW5ndGgoX19zKSk7Ci0gICAgX01fbm9uX2RiZ19pbXBsLmFzc2lnbihfX3MpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIF9TZWxmJiBhc3NpZ24oc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYykgewotICAgIF9NX2NoZWNrX2Fzc2lnbihfX24pOwotICAgIF9NX25vbl9kYmdfaW1wbC5hc3NpZ24oX19uLCBfX2MpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0jaWYgZGVmaW5lZChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQotcHJpdmF0ZToKLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2VyPgotICB2b2lkIF9NX2Fzc2lnbl9kaXNwYXRjaChfSW50ZWdlciBfX24sIF9JbnRlZ2VyIF9feCwgY29uc3QgX190cnVlX3R5cGUmIC8qX0ludGVncmFsKi8pIHsKLSAgICBfTV9jaGVja19hc3NpZ24oX19uKTsKLSAgICBfTV9ub25fZGJnX2ltcGwuYXNzaWduKChzaXplX3R5cGUpX19uLCAoX0NoYXJUKV9feCk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcj4KLSAgdm9pZCBfTV9hc3NpZ25fZGlzcGF0Y2goX0lucHV0SXRlciBfX2YsIF9JbnB1dEl0ZXIgX19sLCBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qX0ludGVncmFsKi8pICB7Ci0gICAgX01fY2hlY2tfYXNzaWduKGRpc3RhbmNlKF9fZiwgX19sKSk7Ci0gICAgX01fbm9uX2RiZ19pbXBsLmFzc2lnbihfU1RMUF9QUklWIF9Ob25fRGJnX2l0ZXIoX19mKSwgX1NUTFBfUFJJViBfTm9uX0RiZ19pdGVyKF9fbCkpOwotICB9Ci1wdWJsaWM6Ci0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgotICBpbmxpbmUgX1NlbGYmIGFzc2lnbihfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0KSB7Ci0gICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fZmlyc3QpIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2xhc3QpCi0gICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCi0gICAgdHlwZWRlZiB0eXBlbmFtZSBfSXNJbnRlZ3JhbDxfSW5wdXRJdGVyPjo6X1JldCBfSW50ZWdyYWw7Ci0gICAgX01fYXNzaWduX2Rpc3BhdGNoKF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykgfHwgXAotICAgICFkZWZpbmVkIChfU1RMUF9OT19NRVRIT0RfU1BFQ0lBTElaQVRJT04pICYmICFkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQotICBfU2VsZiYgYXNzaWduKGNvbnN0IF9DaGFyVCogX19mLCBjb25zdCBfQ2hhclQqIF9fbCkgewotICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2YpIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2wpCi0gICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3B0cl9yYW5nZShfX2YsIF9fbCkpCi0gICAgX01fY2hlY2tfYXNzaWduKGRpc3RhbmNlKF9fZiwgX19sKSk7Ci0gICAgX01fbm9uX2RiZ19pbXBsLmFzc2lnbihfX2YsIF9fbCk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIF9TZWxmJiBhc3NpZ24oY29uc3RfaXRlcmF0b3IgX19mLCBjb25zdF9pdGVyYXRvciBfX2wpIHsKLSAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19mLCBfX2wpKQotICAgIF9NX2NoZWNrX2Fzc2lnbihkaXN0YW5jZShfX2YsIF9fbCkpOwotICAgIF9NX25vbl9kYmdfaW1wbC5hc3NpZ24oX19mLl9NX2l0ZXJhdG9yLCBfX2wuX01faXRlcmF0b3IpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotI2VuZGlmCi0KLSAgLy8gSW5zZXJ0Ci0gIF9TZWxmJiBpbnNlcnQoc2l6ZV90eXBlIF9fcG9zLCBjb25zdCBfU2VsZiYgX19zKSB7Ci0gICAgc2l6ZV90eXBlIF9fb2xkX2NhcGFjaXR5ID0gY2FwYWNpdHkoKTsKLSAgICBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0KF9fcG9zLCBfX3MuX01fbm9uX2RiZ19pbXBsKTsKLSAgICBfQ29tcGFyZV9DYXBhY2l0eShfX29sZF9jYXBhY2l0eSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgX1NlbGYmIGluc2VydChzaXplX3R5cGUgX19wb3MsIGNvbnN0IF9TZWxmJiBfX3MsCi0gICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fYmVnLCBzaXplX3R5cGUgX19uKSB7Ci0gICAgc2l6ZV90eXBlIF9fb2xkX2NhcGFjaXR5ID0gY2FwYWNpdHkoKTsKLSAgICBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0KF9fcG9zLCBfX3MuX01fbm9uX2RiZ19pbXBsLCBfX2JlZywgX19uKTsKLSAgICBfQ29tcGFyZV9DYXBhY2l0eShfX29sZF9jYXBhY2l0eSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgX1NlbGYmIGluc2VydChzaXplX3R5cGUgX19wb3MsIGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uKSB7Ci0gICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKLSAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCgoX19zICE9IDApLCBfU3RsTXNnX0lOVkFMSURfQVJHVU1FTlQpCi0gICAgc2l6ZV90eXBlIF9fb2xkX2NhcGFjaXR5ID0gY2FwYWNpdHkoKTsKLSAgICBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0KF9fcG9zLCBfX3MsIF9fbik7Ci0gICAgX0NvbXBhcmVfQ2FwYWNpdHkoX19vbGRfY2FwYWNpdHkpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIF9TZWxmJiBpbnNlcnQoc2l6ZV90eXBlIF9fcG9zLCBjb25zdCBfQ2hhclQqIF9fcykgewotICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCi0gICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoKF9fcyAhPSAwKSwgX1N0bE1zZ19JTlZBTElEX0FSR1VNRU5UKQotICAgIHJldHVybiBpbnNlcnQoX19wb3MsIF9fcywgX1RyYWl0czo6bGVuZ3RoKF9fcykpOwotICB9Ci0KLSAgX1NlbGYmIGluc2VydChzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MpIHsKLSAgICBzaXplX3R5cGUgX19vbGRfY2FwYWNpdHkgPSBjYXBhY2l0eSgpOwotICAgIF9NX25vbl9kYmdfaW1wbC5pbnNlcnQoX19wb3MsIF9fbiwgX19jKTsKLSAgICBfQ29tcGFyZV9DYXBhY2l0eShfX29sZF9jYXBhY2l0eSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIF9fcCwgX0NoYXJUIF9fYykgewotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LF9fcCkpCi0gICAgc2l6ZV90eXBlIF9fb2xkX2NhcGFjaXR5ID0gY2FwYWNpdHkoKTsKLSAgICB0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IgX19yZXQgPSBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0KF9fcC5fTV9pdGVyYXRvciwgX19jKTsKLSAgICBfQ29tcGFyZV9DYXBhY2l0eShfX29sZF9jYXBhY2l0eSk7Ci0gICAgcmV0dXJuIGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9fcmV0KTsKLSAgfQotCi0gIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcCwgc2l6ZV90IF9fbiwgX0NoYXJUIF9fYykgewotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LF9fcCkpCi0gICAgc2l6ZV90eXBlIF9fb2xkX2NhcGFjaXR5ID0gY2FwYWNpdHkoKTsKLSAgICBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0KF9fcC5fTV9pdGVyYXRvciwgX19uLCBfX2MpOwotICAgIF9Db21wYXJlX0NhcGFjaXR5KF9fb2xkX2NhcGFjaXR5KTsKLSAgfQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKLXByaXZhdGU6Ci0gIHRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tSXRlcj4KLSAgdm9pZCBfTV9pbnNlcnRfYXV4IChpdGVyYXRvciBfX3AsIF9SYW5kb21JdGVyIF9fZmlyc3QsIF9SYW5kb21JdGVyIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX3RydWVfdHlwZSYgLypfSXNJdGVyYXRvciovKQotICB7IF9NX25vbl9kYmdfaW1wbC5pbnNlcnQoX19wLl9NX2l0ZXJhdG9yLCBfX2ZpcnN0Ll9NX2l0ZXJhdG9yLCBfX2xhc3QuX01faXRlcmF0b3IpOyB9Ci0KLSAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcj4KLSAgdm9pZCBfTV9pbnNlcnRfYXV4IChpdGVyYXRvciBfX3AsIF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19mYWxzZV90eXBlJiAvKl9Jc0l0ZXJhdG9yKi8pIHsKLSAgICBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0KF9fcC5fTV9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2ZpcnN0KSwgX1NUTFBfUFJJViBfTm9uX0RiZ19pdGVyKF9fbGFzdCkpOwotICB9Ci0KLXB1YmxpYzoKLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXI+Ci0gIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcCwgX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCkgewotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LF9fcCkpCi0gICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsX19sYXN0KSkKLQotICAgIC8qIEluIGRlYnVnIG1vZGUgd2UgYXJlIGVuY2Fwc3VsYXRpbmcgbm9uIGRlYnVnIHN0cmluZyBpdGVyYXRvcnMgaW4gZGVidWcgb25lLgotICAgICAqIERvaW5nIHNvIHRoZSBub24gZGVidWcgaW1wbGVtZW50YXRpb24gd2lsbCBub3QgY2hlY2sgZm9yIHNlbGYgaW5zZXJ0aW9uCi0gICAgICogKHguaW5zZXJ0KHguYmVnaW4oKSwgeC5iZWdpbigpLCB4LmVuZCgpKS4gVG8gYXZvaWQgdGhpcyBwcm9ibGVtIHdlIHRyeSB0bwotICAgICAqIGd1ZXNzIHdoZW4gX0lucHV0SXRlciBpcyBpdGVyYXRvciBvciBjb25zdF9pdGVyYXRvciBhbmQgaW4gdGhpcyBjYXNlIGNhbGwKLSAgICAgKiB0aGUgbm9uIGRlYnVnIGluc2VydCBtZXRob2Qgd2l0aCBub24gZGVidWcgc3RyaW5nIGl0ZXJhdG9yLgotICAgICAqLwotICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FyZVNhbWVVbkNWVHlwZXM8X0lucHV0SXRlciwgaXRlcmF0b3I+OjpfUmV0IF9Jc05vbkNvbnN0SXRlcmF0b3I7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBfQXJlU2FtZVVuQ1ZUeXBlczxfSW5wdXRJdGVyLCBjb25zdF9pdGVyYXRvcj46Ol9SZXQgX0lzQ29uc3RJdGVyYXRvcjsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIF9Mb3IyPF9Jc05vbkNvbnN0SXRlcmF0b3IsIF9Jc0NvbnN0SXRlcmF0b3I+OjpfUmV0IF9Jc0l0ZXJhdG9yOwotCi0gICAgc2l6ZV90eXBlIF9fb2xkX2NhcGFjaXR5ID0gdGhpcy0+Y2FwYWNpdHkoKTsKLSAgICBfTV9pbnNlcnRfYXV4KF9fcCwgX19maXJzdCwgX19sYXN0LCBfSXNJdGVyYXRvcigpKTsKLSAgICBfQ29tcGFyZV9DYXBhY2l0eShfX29sZF9jYXBhY2l0eSk7Ci0gIH0KLSNlbmRpZgotCi0jaWYgIWRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpIHx8IFwKLSAgICAhZGVmaW5lZCAoX1NUTFBfTk9fTUVUSE9EX1NQRUNJQUxJWkFUSU9OKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKLSAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wLCBjb25zdF9pdGVyYXRvciBfX2YsIGNvbnN0X2l0ZXJhdG9yIF9fbCkgewotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LF9fcCkpCi0gICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZixfX2wpKQotICAgIHNpemVfdHlwZSBfX29sZF9jYXBhY2l0eSA9IGNhcGFjaXR5KCk7Ci0gICAgX01fbm9uX2RiZ19pbXBsLmluc2VydChfX3AuX01faXRlcmF0b3IsIF9fZi5fTV9pdGVyYXRvciwgX19sLl9NX2l0ZXJhdG9yKTsKLSAgICBfQ29tcGFyZV9DYXBhY2l0eShfX29sZF9jYXBhY2l0eSk7Ci0gIH0KLSAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wLCBjb25zdCBfQ2hhclQqIF9fZiwgY29uc3QgX0NoYXJUKiBfX2wpIHsKLSAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19mKV9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2wpCi0gICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX2lmX293bmVyKCZfTV9pdGVyX2xpc3QsX19wKSkKLSAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcHRyX3JhbmdlKF9fZixfX2wpKQotICAgIHNpemVfdHlwZSBfX29sZF9jYXBhY2l0eSA9IGNhcGFjaXR5KCk7Ci0gICAgX01fbm9uX2RiZ19pbXBsLmluc2VydChfX3AuX01faXRlcmF0b3IsIF9fZiwgX19sKTsKLSAgICBfQ29tcGFyZV9DYXBhY2l0eShfX29sZF9jYXBhY2l0eSk7Ci0gIH0KLSNlbmRpZgotCi0gIC8vIEVyYXNlLgotICBfU2VsZiYgZXJhc2Uoc2l6ZV90eXBlIF9fcG9zID0gMCwgc2l6ZV90eXBlIF9fbiA9IG5wb3MpIHsKLSAgICBpZiAoX19wb3MgPCBzaXplKCkpIHsKLSAgICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9ycyhiZWdpbigpICsgX19wb3MsIGVuZCgpKTsKLSAgICB9Ci0gICAgX01fbm9uX2RiZ19pbXBsLmVyYXNlKF9fcG9zLCBfX24pOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBfX3BvcykgewotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX0RlcmVmZXJlbmNlYWJsZShfX3BvcykpCi0gICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX2lmX293bmVyKCZfTV9pdGVyX2xpc3QsX19wb3MpKQotICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9ycyhfX3BvcywgZW5kKCkpOwotICAgIHJldHVybiBpdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuZXJhc2UoX19wb3MuX01faXRlcmF0b3IpKTsKLSAgfQotICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBfX2YsIGl0ZXJhdG9yIF9fbCkgewotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2YsIF9fbCwgYmVnaW4oKSwgZW5kKCkpKQotICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9ycyhfX2YsIGVuZCgpKTsKLSAgICByZXR1cm4gaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLmVyYXNlKF9fZi5fTV9pdGVyYXRvciwgX19sLl9NX2l0ZXJhdG9yKSk7Ci0gIH0KLQotICAvLyBTdWJzdHJpbmcuCi0gIF9TZWxmIHN1YnN0cihzaXplX3R5cGUgX19wb3MgPSAwLCBzaXplX3R5cGUgX19uID0gbnBvcykgY29uc3QKLSAgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLnN1YnN0cihfX3BvcywgX19uKTsgfQotCi0gIC8vIFJlcGxhY2UuICAoQ29uY2VwdHVhbGx5IGVxdWl2YWxlbnQgdG8gZXJhc2UgZm9sbG93ZWQgYnkgaW5zZXJ0LikKLSAgX1NlbGYmIHJlcGxhY2Uoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uLCBjb25zdCBfU2VsZiYgX19zKSB7Ci0gICAgc2l6ZV90eXBlIF9fb2xkX2NhcGFjaXR5ID0gY2FwYWNpdHkoKTsKLSAgICBfTV9ub25fZGJnX2ltcGwucmVwbGFjZShfX3BvcywgX19uLCBfX3MuX01fbm9uX2RiZ19pbXBsKTsKLSAgICBfQ29tcGFyZV9DYXBhY2l0eShfX29sZF9jYXBhY2l0eSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgX1NlbGYmIHJlcGxhY2Uoc2l6ZV90eXBlIF9fcG9zMSwgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IF9TZWxmJiBfX3MsCi0gICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX3BvczIsIHNpemVfdHlwZSBfX24yKSB7Ci0gICAgc2l6ZV90eXBlIF9fb2xkX2NhcGFjaXR5ID0gY2FwYWNpdHkoKTsKLSAgICBfTV9ub25fZGJnX2ltcGwucmVwbGFjZShfX3BvczEsIF9fbjEsIF9fcy5fTV9ub25fZGJnX2ltcGwsIF9fcG9zMiwgX19uMik7Ci0gICAgX0NvbXBhcmVfQ2FwYWNpdHkoX19vbGRfY2FwYWNpdHkpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIF9TZWxmJiByZXBsYWNlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uMikgewotICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCi0gICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoKF9fcyAhPSAwKSwgX1N0bE1zZ19JTlZBTElEX0FSR1VNRU5UKQotICAgIHNpemVfdHlwZSBfX29sZF9jYXBhY2l0eSA9IGNhcGFjaXR5KCk7Ci0gICAgX01fbm9uX2RiZ19pbXBsLnJlcGxhY2UoX19wb3MsIF9fbjEsIF9fcywgX19uMik7Ci0gICAgX0NvbXBhcmVfQ2FwYWNpdHkoX19vbGRfY2FwYWNpdHkpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIF9TZWxmJiByZXBsYWNlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IF9DaGFyVCogX19zKSB7Ci0gICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKLSAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCgoX19zICE9IDApLCBfU3RsTXNnX0lOVkFMSURfQVJHVU1FTlQpCi0gICAgc2l6ZV90eXBlIF9fb2xkX2NhcGFjaXR5ID0gY2FwYWNpdHkoKTsKLSAgICBfTV9ub25fZGJnX2ltcGwucmVwbGFjZShfX3BvcywgX19uMSwgX19zKTsKLSAgICBfQ29tcGFyZV9DYXBhY2l0eShfX29sZF9jYXBhY2l0eSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgX1NlbGYmIHJlcGxhY2Uoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uMSwgc2l6ZV90eXBlIF9fbjIsIF9DaGFyVCBfX2MpIHsKLSAgICBzaXplX3R5cGUgX19vbGRfY2FwYWNpdHkgPSBjYXBhY2l0eSgpOwotICAgIF9NX25vbl9kYmdfaW1wbC5yZXBsYWNlKF9fcG9zLCBfX24xLCBfX24yLCBfX2MpOwotICAgIF9Db21wYXJlX0NhcGFjaXR5KF9fb2xkX2NhcGFjaXR5KTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBfU2VsZiYgcmVwbGFjZShpdGVyYXRvciBfX2YsIGl0ZXJhdG9yIF9fbCwgY29uc3QgX1NlbGYmIF9fcykgewotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2YsIF9fbCwgYmVnaW4oKSwgZW5kKCkpKQotICAgIHNpemVfdHlwZSBfX29sZF9jYXBhY2l0eSA9IGNhcGFjaXR5KCk7Ci0gICAgX01fbm9uX2RiZ19pbXBsLnJlcGxhY2UoX19mLl9NX2l0ZXJhdG9yLCBfX2wuX01faXRlcmF0b3IsIF9fcy5fTV9ub25fZGJnX2ltcGwpOwotICAgIF9Db21wYXJlX0NhcGFjaXR5KF9fb2xkX2NhcGFjaXR5KTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBfU2VsZiYgcmVwbGFjZShpdGVyYXRvciBfX2YsIGl0ZXJhdG9yIF9fbCwgY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX24pIHsKLSAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKQotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2YsIF9fbCwgYmVnaW4oKSwgZW5kKCkpKQotICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKChfX3MgIT0gMCksIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKLSAgICBzaXplX3R5cGUgX19vbGRfY2FwYWNpdHkgPSBjYXBhY2l0eSgpOwotICAgIF9NX25vbl9kYmdfaW1wbC5yZXBsYWNlKF9fZi5fTV9pdGVyYXRvciwgX19sLl9NX2l0ZXJhdG9yLCBfX3MsIF9fbik7Ci0gICAgX0NvbXBhcmVfQ2FwYWNpdHkoX19vbGRfY2FwYWNpdHkpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIF9TZWxmJiByZXBsYWNlKGl0ZXJhdG9yIF9fZiwgaXRlcmF0b3IgX19sLCBjb25zdCBfQ2hhclQqIF9fcykgewotICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCi0gICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZiwgX19sLCBiZWdpbigpLCBlbmQoKSkpCi0gICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoKF9fcyAhPSAwKSwgX1N0bE1zZ19JTlZBTElEX0FSR1VNRU5UKQotICAgIHNpemVfdHlwZSBfX29sZF9jYXBhY2l0eSA9IGNhcGFjaXR5KCk7Ci0gICAgX01fbm9uX2RiZ19pbXBsLnJlcGxhY2UoX19mLl9NX2l0ZXJhdG9yLCBfX2wuX01faXRlcmF0b3IsIF9fcyk7Ci0gICAgX0NvbXBhcmVfQ2FwYWNpdHkoX19vbGRfY2FwYWNpdHkpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIF9TZWxmJiByZXBsYWNlKGl0ZXJhdG9yIF9fZiwgaXRlcmF0b3IgX19sLCBzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jKSB7Ci0gICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZiwgX19sLCBiZWdpbigpLCBlbmQoKSkpCi0gICAgc2l6ZV90eXBlIF9fb2xkX2NhcGFjaXR5ID0gY2FwYWNpdHkoKTsKLSAgICBfTV9ub25fZGJnX2ltcGwucmVwbGFjZShfX2YuX01faXRlcmF0b3IsIF9fbC5fTV9pdGVyYXRvciwgX19uLCBfX2MpOwotICAgIF9Db21wYXJlX0NhcGFjaXR5KF9fb2xkX2NhcGFjaXR5KTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCi1wcml2YXRlOgotICB0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUl0ZXI+Ci0gIHZvaWQgX01fcmVwbGFjZV9hdXgoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgIF9SYW5kb21JdGVyIF9fZiwgX1JhbmRvbUl0ZXIgX19sLCBfX3RydWVfdHlwZSBjb25zdCYgLypfSXNJdGVyYXRvciovKQotICB7IF9NX25vbl9kYmdfaW1wbC5yZXBsYWNlKF9fZmlyc3QuX01faXRlcmF0b3IsIF9fbGFzdC5fTV9pdGVyYXRvciwgX19mLl9NX2l0ZXJhdG9yLCBfX2wuX01faXRlcmF0b3IpOyB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXI+Ci0gIHZvaWQgX01fcmVwbGFjZV9hdXgoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIgX19mLCBfSW5wdXRJdGVyIF9fbCwgX19mYWxzZV90eXBlIGNvbnN0JiAvKl9Jc0l0ZXJhdG9yKi8pIHsKLSAgICBfTV9ub25fZGJnX2ltcGwucmVwbGFjZShfX2ZpcnN0Ll9NX2l0ZXJhdG9yLCBfX2xhc3QuX01faXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfTm9uX0RiZ19pdGVyKF9fZiksIF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2wpKTsKLSAgfQotCi1wdWJsaWM6Ci0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgotICBfU2VsZiYgcmVwbGFjZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIgX19mLCBfSW5wdXRJdGVyIF9fbCkgewotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QsIGJlZ2luKCksIGVuZCgpKSkKLSAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19mLCBfX2wpKQotCi0gICAgLyogU2VlIGluc2VydCBjb21tZW50IGZvciByZXNvbiBvZiBpdGVyYXRvciBkZXRlY3Rpb24uCi0gICAgICovCi0gICAgdHlwZWRlZiB0eXBlbmFtZSBfQXJlU2FtZVVuQ1ZUeXBlczxfSW5wdXRJdGVyLCBpdGVyYXRvcj46Ol9SZXQgX0lzTm9uQ29uc3RJdGVyYXRvcjsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIF9BcmVTYW1lVW5DVlR5cGVzPF9JbnB1dEl0ZXIsIGNvbnN0X2l0ZXJhdG9yPjo6X1JldCBfSXNDb25zdEl0ZXJhdG9yOwotICAgIHR5cGVkZWYgdHlwZW5hbWUgX0xvcjI8X0lzTm9uQ29uc3RJdGVyYXRvciwgX0lzQ29uc3RJdGVyYXRvcj46Ol9SZXQgX0lzSXRlcmF0b3I7Ci0KLSAgICBzaXplX3R5cGUgX19vbGRfY2FwYWNpdHkgPSBjYXBhY2l0eSgpOwotICAgIF9NX3JlcGxhY2VfYXV4KF9fZmlyc3QsIF9fbGFzdCwgX19mLCBfX2wsIF9Jc0l0ZXJhdG9yKCkpOwotICAgIF9Db21wYXJlX0NhcGFjaXR5KF9fb2xkX2NhcGFjaXR5KTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSNlbmRpZgotCi0jaWYgIWRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpIHx8IFwKLSAgICAhZGVmaW5lZCAoX1NUTFBfTk9fTUVUSE9EX1NQRUNJQUxJWkFUSU9OKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKLSAgX1NlbGYmIHJlcGxhY2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0LAotICAgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvciBfX2YsIGNvbnN0X2l0ZXJhdG9yIF9fbCkgewotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QsIGJlZ2luKCksIGVuZCgpKSkKLSAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19mLCBfX2wpKQotICAgIHNpemVfdHlwZSBfX29sZF9jYXBhY2l0eSA9IGNhcGFjaXR5KCk7Ci0gICAgX01fbm9uX2RiZ19pbXBsLnJlcGxhY2UoX19maXJzdC5fTV9pdGVyYXRvciwgX19sYXN0Ll9NX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZi5fTV9pdGVyYXRvciwgX19sLl9NX2l0ZXJhdG9yKTsKLSAgICBfQ29tcGFyZV9DYXBhY2l0eShfX29sZF9jYXBhY2l0eSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgX1NlbGYmIHJlcGxhY2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0LAotICAgICAgICAgICAgICAgICBjb25zdCBfQ2hhclQqIF9fZiwgY29uc3QgX0NoYXJUKiBfX2wpIHsKLSAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19mKV9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2wpCi0gICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCwgYmVnaW4oKSwgZW5kKCkpKQotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19wdHJfcmFuZ2UoX19mLCBfX2wpKQotICAgIHNpemVfdHlwZSBfX29sZF9jYXBhY2l0eSA9IGNhcGFjaXR5KCk7Ci0gICAgX01fbm9uX2RiZ19pbXBsLnJlcGxhY2UoX19maXJzdC5fTV9pdGVyYXRvciwgX19sYXN0Ll9NX2l0ZXJhdG9yLCBfX2YsIF9fbCk7Ci0gICAgX0NvbXBhcmVfQ2FwYWNpdHkoX19vbGRfY2FwYWNpdHkpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotI2VuZGlmCi0KLSAgLy8gT3RoZXIgbW9kaWZpZXIgbWVtYmVyIGZ1bmN0aW9ucy4KLSAgdm9pZCBzd2FwKF9TZWxmJiBfX3MpIHsKLSAgICBfTV9pdGVyX2xpc3QuX1N3YXBfb3duZXJzKF9fcy5fTV9pdGVyX2xpc3QpOwotICAgIF9NX25vbl9kYmdfaW1wbC5zd2FwKF9fcy5fTV9ub25fZGJnX2ltcGwpOwotICB9Ci0KLSAgaW50IGNvbXBhcmUoY29uc3QgX1NlbGYmIF9fcykgY29uc3QKLSAgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLmNvbXBhcmUoX19zLl9NX25vbl9kYmdfaW1wbCk7IH0KLSAgaW50IGNvbXBhcmUoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uLCBjb25zdCBfU2VsZiYgX19zKSBjb25zdAotICB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwuY29tcGFyZShfX3BvcywgX19uLCBfX3MuX01fbm9uX2RiZ19pbXBsKTsgfQotICBpbnQgY29tcGFyZShzaXplX3R5cGUgX19wb3MxLCBzaXplX3R5cGUgX19uMSwgY29uc3QgX1NlbGYmIF9fcywKLSAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fcG9zMiwgc2l6ZV90eXBlIF9fbjIpIGNvbnN0Ci0gIHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5jb21wYXJlKF9fcG9zMSwgX19uMSwgX19zLl9NX25vbl9kYmdfaW1wbCwgX19wb3MyLCBfX24yKTsgfQotICBpbnQgY29tcGFyZShjb25zdCBfQ2hhclQqIF9fcykgY29uc3QgewotICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCi0gICAgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5jb21wYXJlKF9fcyk7Ci0gIH0KLSAgaW50IGNvbXBhcmUoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uLCBjb25zdCBfQ2hhclQqIF9fcykgY29uc3QgewotICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCi0gICAgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5jb21wYXJlKF9fcG9zLCBfX24sIF9fcyk7Ci0gIH0KLSAgaW50IGNvbXBhcmUoc2l6ZV90eXBlIF9fcG9zMSwgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IF9DaGFyVCogX19zLAotICAgICAgICAgICAgICBzaXplX3R5cGUgX19uMikgY29uc3QgewotICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCi0gICAgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5jb21wYXJlKF9fcG9zMSwgX19uMSwgX19zLCBfX24yKTsKLSAgfQotCi0gIC8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIGNvbXBhcmUuCi0gIHN0YXRpYyBpbnQgX1NUTFBfQ0FMTCBfTV9jb21wYXJlKGNvbnN0IF9DaGFyVCogX19mMSwgY29uc3QgX0NoYXJUKiBfX2wxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfQ2hhclQqIF9fZjIsIGNvbnN0IF9DaGFyVCogX19sMikKLSAgeyByZXR1cm4gX0Jhc2U6Ol9NX2NvbXBhcmUoX19mMSwgX19sMSwgX19mMiwgX19sMik7IH0KLSAgc3RhdGljIGludCBfU1RMUF9DQUxMIF9NX2NvbXBhcmUoY29uc3RfaXRlcmF0b3IgX19mMSwgY29uc3RfaXRlcmF0b3IgX19sMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0NoYXJUKiBfX2YyLCBjb25zdCBfQ2hhclQqIF9fbDIpCi0gIHsgcmV0dXJuIF9CYXNlOjpfTV9jb21wYXJlKF9fZjEuX01faXRlcmF0b3IsIF9fbDEuX01faXRlcmF0b3IsIF9fZjIsIF9fbDIpOyB9Ci0gIHN0YXRpYyBpbnQgX1NUTFBfQ0FMTCBfTV9jb21wYXJlKGNvbnN0IF9DaGFyVCogX19mMSwgY29uc3QgX0NoYXJUKiBfX2wxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvciBfX2YyLCBjb25zdF9pdGVyYXRvciBfX2wyKQotICB7IHJldHVybiBfQmFzZTo6X01fY29tcGFyZShfX2YxLCBfX2wxLCBfX2YyLl9NX2l0ZXJhdG9yLCBfX2wyLl9NX2l0ZXJhdG9yKTsgfQotICBzdGF0aWMgaW50IF9TVExQX0NBTEwgX01fY29tcGFyZShjb25zdF9pdGVyYXRvciBfX2YxLCBjb25zdF9pdGVyYXRvciBfX2wxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvciBfX2YyLCBjb25zdF9pdGVyYXRvciBfX2wyKQotICB7IHJldHVybiBfQmFzZTo6X01fY29tcGFyZShfX2YxLl9NX2l0ZXJhdG9yLCBfX2wxLl9NX2l0ZXJhdG9yLCBfX2YyLl9NX2l0ZXJhdG9yLCBfX2wyLl9NX2l0ZXJhdG9yKTsgfQotCi0gIGNvbnN0IF9DaGFyVCogY19zdHIoKSBjb25zdCB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwuY19zdHIoKTsgfQotICBjb25zdCBfQ2hhclQqIGRhdGEoKSAgY29uc3QgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLmRhdGEoKTsgfQotCi0gIHNpemVfdHlwZSBjb3B5KF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdAotICB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwuY29weShfX3MsIF9fbiwgX19wb3MpOyB9Ci0KLSAgLy8gZmluZC4KLSAgc2l6ZV90eXBlIGZpbmQoY29uc3QgX1NlbGYmIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QKLSAgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLmZpbmQoX19zLl9NX25vbl9kYmdfaW1wbCwgX19wb3MpOyB9Ci0gIHNpemVfdHlwZSBmaW5kKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdCB7Ci0gICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKLSAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCgoX19zICE9IDApLCBfU3RsTXNnX0lOVkFMSURfQVJHVU1FTlQpCi0gICAgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5maW5kKF9fcywgX19wb3MpOwotICB9Ci0gIHNpemVfdHlwZSBmaW5kKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIGNvbnN0IHsKLSAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKQotICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKChfX3MgIT0gMCksIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKLSAgICByZXR1cm4gX01fbm9uX2RiZ19pbXBsLmZpbmQoX19zLCBfX3BvcywgX19uKTsKLSAgfQotICAvLyBXSUU6IFZlcnNhbnQgc2NoZW1hIGNvbXBpbGVyIDUuMi4yIElDRSB3b3JrYXJvdW5kCi0gIHNpemVfdHlwZSBmaW5kKF9DaGFyVCBfX2MpIGNvbnN0IHsgcmV0dXJuIGZpbmQoX19jLCAwKTsgfQotICBzaXplX3R5cGUgZmluZChfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MgLyogPSAwICovKSBjb25zdAotICB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwuZmluZChfX2MsIF9fcG9zKTsgfQotCi0gIC8vIHJmaW5kLgotICBzaXplX3R5cGUgcmZpbmQoY29uc3QgX1NlbGYmIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gbnBvcykgY29uc3QKLSAgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLnJmaW5kKF9fcy5fTV9ub25fZGJnX2ltcGwsIF9fcG9zKTsgfQotICBzaXplX3R5cGUgcmZpbmQoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3BvcyA9IG5wb3MpIGNvbnN0IHsKLSAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKQotICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKChfX3MgIT0gMCksIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKLSAgICByZXR1cm4gX01fbm9uX2RiZ19pbXBsLnJmaW5kKF9fcywgX19wb3MpOwotICB9Ci0gIHNpemVfdHlwZSByZmluZChjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdCB7Ci0gICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKLSAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCgoX19zICE9IDApLCBfU3RsTXNnX0lOVkFMSURfQVJHVU1FTlQpCi0gICAgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5yZmluZChfX3MsIF9fcG9zLCBfX24pOwotICB9Ci0gIHNpemVfdHlwZSByZmluZChfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MgPSBucG9zKSBjb25zdAotICB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwucmZpbmQoX19jLCBfX3Bvcyk7IH0KLQotICAvLyBmaW5kX2ZpcnN0X29mCi0gIHNpemVfdHlwZSBmaW5kX2ZpcnN0X29mKGNvbnN0IF9TZWxmJiBfX3MsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0Ci0gIHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5maW5kX2ZpcnN0X29mKF9fcy5fTV9ub25fZGJnX2ltcGwsIF9fcG9zKTsgfQotICBzaXplX3R5cGUgZmluZF9maXJzdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QgewotICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCi0gICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoKF9fcyAhPSAwKSwgX1N0bE1zZ19JTlZBTElEX0FSR1VNRU5UKQotICAgIHJldHVybiBfTV9ub25fZGJnX2ltcGwuZmluZF9maXJzdF9vZihfX3MsIF9fcG9zKTsKLSAgfQotICBzaXplX3R5cGUgZmluZF9maXJzdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdCB7Ci0gICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKLSAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCgoX19zICE9IDApLCBfU3RsTXNnX0lOVkFMSURfQVJHVU1FTlQpCi0gICAgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5maW5kX2ZpcnN0X29mKF9fcywgX19wb3MsIF9fbik7Ci0gIH0KLSAgc2l6ZV90eXBlIGZpbmRfZmlyc3Rfb2YoX0NoYXJUIF9fYywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QKLSAgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLmZpbmRfZmlyc3Rfb2YoX19jLCBfX3Bvcyk7IH0KLQotICAvLyBmaW5kX2xhc3Rfb2YKLSAgc2l6ZV90eXBlIGZpbmRfbGFzdF9vZihjb25zdCBfU2VsZiYgX19zLCBzaXplX3R5cGUgX19wb3MgPSBucG9zKSBjb25zdAotICB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwuZmluZF9sYXN0X29mKF9fcy5fTV9ub25fZGJnX2ltcGwsIF9fcG9zKTsgfQotICBzaXplX3R5cGUgZmluZF9sYXN0X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MgPSBucG9zKSBjb25zdCB7Ci0gICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKLSAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCgoX19zICE9IDApLCBfU3RsTXNnX0lOVkFMSURfQVJHVU1FTlQpCi0gICAgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5maW5kX2xhc3Rfb2YoX19zLCBfX3Bvcyk7Ci0gIH0KLSAgc2l6ZV90eXBlIGZpbmRfbGFzdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdCB7Ci0gICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKLSAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCgoX19zICE9IDApLCBfU3RsTXNnX0lOVkFMSURfQVJHVU1FTlQpCi0gICAgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5maW5kX2xhc3Rfb2YoX19zLCBfX3BvcywgX19uKTsKLSAgfQotICBzaXplX3R5cGUgZmluZF9sYXN0X29mKF9DaGFyVCBfX2MsIHNpemVfdHlwZSBfX3BvcyA9IG5wb3MpIGNvbnN0Ci0gIHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5yZmluZChfX2MsIF9fcG9zKTsgfQotCi0gIC8vIGZpbmRfZmlyc3Rfbm90X29mCi0gIHNpemVfdHlwZSBmaW5kX2ZpcnN0X25vdF9vZihjb25zdCBfU2VsZiYgX19zLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdAotICB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwuZmluZF9maXJzdF9ub3Rfb2YoX19zLl9NX25vbl9kYmdfaW1wbCwgX19wb3MpOyB9Ci0gIHNpemVfdHlwZSBmaW5kX2ZpcnN0X25vdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QgewotICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCi0gICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoKF9fcyAhPSAwKSwgX1N0bE1zZ19JTlZBTElEX0FSR1VNRU5UKQotICAgIHJldHVybiBfTV9ub25fZGJnX2ltcGwuZmluZF9maXJzdF9ub3Rfb2YoX19zLCBfX3Bvcyk7Ci0gIH0KLSAgc2l6ZV90eXBlIGZpbmRfZmlyc3Rfbm90X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIGNvbnN0IHsKLSAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKQotICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKChfX3MgIT0gMCksIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKLSAgICByZXR1cm4gX01fbm9uX2RiZ19pbXBsLmZpbmRfZmlyc3Rfbm90X29mKF9fcywgX19wb3MsIF9fbik7Ci0gIH0KLSAgc2l6ZV90eXBlIGZpbmRfZmlyc3Rfbm90X29mKF9DaGFyVCBfX2MsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0Ci0gIHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5maW5kX2ZpcnN0X25vdF9vZihfX2MsIF9fcG9zKTsgfQotCi0gIC8vIGZpbmRfbGFzdF9ub3Rfb2YKLSAgc2l6ZV90eXBlIGZpbmRfbGFzdF9ub3Rfb2YoY29uc3QgX1NlbGYmIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gbnBvcykgY29uc3QKLSAgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLmZpbmRfbGFzdF9ub3Rfb2YoX19zLl9NX25vbl9kYmdfaW1wbCwgX19wb3MpOyB9Ci0gIHNpemVfdHlwZSBmaW5kX2xhc3Rfbm90X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MgPSBucG9zKSBjb25zdCB7Ci0gICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKLSAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCgoX19zICE9IDApLCBfU3RsTXNnX0lOVkFMSURfQVJHVU1FTlQpCi0gICAgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5maW5kX2xhc3Rfbm90X29mKF9fcywgX19wb3MpOwotICB9Ci0gIHNpemVfdHlwZSBmaW5kX2xhc3Rfbm90X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIGNvbnN0IHsKLSAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKQotICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKChfX3MgIT0gMCksIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKLSAgICByZXR1cm4gX01fbm9uX2RiZ19pbXBsLmZpbmRfbGFzdF9ub3Rfb2YoX19zLCBfX3BvcywgX19uKTsKLSAgfQotICBzaXplX3R5cGUgZmluZF9sYXN0X25vdF9vZihfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MgPSBucG9zKSBjb25zdAotICB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwuZmluZF9sYXN0X25vdF9vZihfX2MsIF9fcG9zKTsgfQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1RFTVBMQVRFX0VYUFJFU1NJT04pCi0jICBpbmNsdWRlIDxzdGwvZGVidWcvX3N0cmluZ19zdW1fbWV0aG9kcy5oPgotI2VuZGlmIC8qIF9TVExQX1VTRV9URU1QTEFURV9FWFBSRVNTSU9OICovCi19OwotCi0vLyBUaGlzIGlzIGEgaG9vayB0byBpbnN0YW50aWF0ZSBTVExwb3J0IGV4cG9ydHMgaW4gYSBkZXNpZ25hdGVkIERMTAotI2lmIGRlZmluZWQgKF9TVExQX1VTRV9URU1QTEFURV9FWFBPUlQpICYmICFkZWZpbmVkIChfU1RMUF9VU0VfTVNWQzZfTUVNX1RfQlVHX1dPUktBUk9VTkQpCi1fU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCi1fU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgX19jb25zdHJ1Y3RfY2hlY2tlcjxfU1RMUF9OT05fREJHX1NUUklOR19OQU1FIDxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiwgYWxsb2NhdG9yPGNoYXI+ID4gPjsKLV9TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQotX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIGJhc2ljX3N0cmluZzxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiwgYWxsb2NhdG9yPGNoYXI+ID47Ci0jICBpZiBkZWZpbmVkIChfU1RMUF9IQVNfV0NIQVJfVCkKLV9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKLV9TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBfX2NvbnN0cnVjdF9jaGVja2VyPF9TVExQX05PTl9EQkdfU1RSSU5HX05BTUUgPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+LCBhbGxvY2F0b3I8d2NoYXJfdD4gPiA+OwotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi1fU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgYmFzaWNfc3RyaW5nPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+LCBhbGxvY2F0b3I8d2NoYXJfdD4gPjsKLSMgIGVuZGlmCi0jZW5kaWYgLyogX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCAqLwotCi0jdW5kZWYgX1NUTFBfTk9OX0RCR19TVFJJTkcKLSN1bmRlZiBfU1RMUF9OT05fREJHX1NUUklOR19OQU1FCi0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfU1RBVElDX0NPTlNUX0lOSVRfQlVHKQotIyAgaWYgZGVmaW5lZCAoX19HTlVDX18pICYmIChfX0dOVUNfXyA9PSAyKSAmJiAoX19HTlVDX01JTk9SX18gPT0gOTYpCi10ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+Ci1jb25zdCBzaXplX3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6bnBvcyA9IH4oc2l6ZV90KSAwOwotIyAgZWxzZQotdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgotY29uc3Qgc2l6ZV90IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46Om5wb3M7Ci0jICBlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChiYXNpY19zdHJpbmcpCi1fU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKLSN1bmRlZiBiYXNpY19zdHJpbmcKLSNlbmRpZgotCi1fU1RMUF9FTkRfTkFNRVNQQUNFCi0KLSNlbmRpZiAvKiBfU1RMUF9EQkdfU1RSSU5HICovCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvZGVidWcvX3RyZWUuaCBiL3N0bC9kZWJ1Zy9fdHJlZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWJiNDEwLi4wMDAwMDAwCi0tLSBhL3N0bC9kZWJ1Zy9fdHJlZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzE2ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk0Ci0gKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3Ci0gKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTcKLSAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0vKiBOT1RFOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBTVEwgaGVhZGVycy4KLSAqICAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuCi0gKi8KLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9EQkdfVFJFRV9ICi0jZGVmaW5lIF9TVExQX0lOVEVSTkFMX0RCR19UUkVFX0gKLQotI2lmbmRlZiBfU1RMUF9EQkdfSVRFUkFUT1JfSAotIyAgaW5jbHVkZSA8c3RsL2RlYnVnL19pdGVyYXRvci5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfRlVOQ1RJT05fQkFTRV9ICi0jICBpbmNsdWRlIDxzdGwvX2Z1bmN0aW9uX2Jhc2UuaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX0FMTE9DX0gKLSMgIGluY2x1ZGUgPHN0bC9fYWxsb2MuaD4KLSNlbmRpZgotCi1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLQotX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX0NvbXBhcmU+Ci1jbGFzcyBfRGJnQ29tcGFyZSB7Ci1wdWJsaWM6Ci0gIF9EYmdDb21wYXJlKCkge30KLSAgX0RiZ0NvbXBhcmUoY29uc3QgX0NvbXBhcmUmIF9fY21wKSA6IF9NX25vbl9kYmdfY21wKF9fY21wKSB7fQotICBfRGJnQ29tcGFyZShjb25zdCBfRGJnQ29tcGFyZSYgX19jbXApIDogX01fbm9uX2RiZ19jbXAoX19jbXAuX01fbm9uX2RiZ19jbXApIHt9Ci0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX0NPTlRBSU5FUlNfRVhURU5TSU9OKQotICBib29sIG9wZXJhdG9yICgpIChjb25zdCBfS2V5JiBfX2xocywgY29uc3QgX0tleSYgX19yaHMpIGNvbnN0IHsKLSNlbHNlCi0gIHRlbXBsYXRlIDxjbGFzcyBfS3AxLCBjbGFzcyBfS3AyPgotICBib29sIG9wZXJhdG9yICgpIChjb25zdCBfS3AxJiBfX2xocywgY29uc3QgX0twMiYgX19yaHMpIGNvbnN0IHsKLSNlbmRpZgotICAgIGlmIChfTV9ub25fZGJnX2NtcChfX2xocywgX19yaHMpKSB7Ci0gICAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghX01fbm9uX2RiZ19jbXAoX19yaHMsIF9fbGhzKSwgX1N0bE1zZ19JTlZBTElEX1NUUklDVF9XRUFLX1BSRURJQ0FURSkKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBfQ29tcGFyZSBub25fZGJnX2tleV9jb21wKCkgY29uc3QgeyByZXR1cm4gX01fbm9uX2RiZ19jbXA7IH0KLXByaXZhdGU6Ci0gIF9Db21wYXJlIF9NX25vbl9kYmdfY21wOwotfTsKLQotI2RlZmluZSBfU1RMUF9OT05fREJHX1RSRUUgX1NUTFBfUFJJViBfU1RMUF9OT05fREJHX05BTUUoUmJfdHJlZSkgPF9LZXksIF9TVExQX1BSSVYgX0RiZ0NvbXBhcmU8X0tleSwgX0NvbXBhcmU+LCBfVmFsdWUsIF9LZXlPZlZhbHVlLCBfVHJhaXRzLCBfQWxsb2M+Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9ERUJVR19VU0VfRElTVElOQ1RfVkFMVUVfVFlQRV9IRUxQRVJTKQotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi10ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX0NvbXBhcmUsCi0gICAgICAgICAgY2xhc3MgX1ZhbHVlLCBjbGFzcyBfS2V5T2ZWYWx1ZSwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jID4KLWlubGluZSBfVmFsdWUqCi12YWx1ZV90eXBlKGNvbnN0IF9TVExQX1BSSVYgX0RCR19pdGVyX2Jhc2U8IF9TVExQX05PTl9EQkdfVFJFRSA+JikKLXsgcmV0dXJuIChfVmFsdWUqKTA7IH0KLXRlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfQ29tcGFyZSwKLSAgICAgICAgICBjbGFzcyBfVmFsdWUsIGNsYXNzIF9LZXlPZlZhbHVlLCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2MgPgotaW5saW5lIGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnCi1pdGVyYXRvcl9jYXRlZ29yeShjb25zdCBfU1RMUF9QUklWIF9EQkdfaXRlcl9iYXNlPCBfU1RMUF9OT05fREJHX1RSRUUgPiYpCi17IHJldHVybiBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZygpOyB9Ci1fU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCi0jZW5kaWYKLQotdGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9Db21wYXJlLAotICAgICAgICAgIGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0tleU9mVmFsdWUsIGNsYXNzIF9UcmFpdHMsCi0gICAgICAgICAgX1NUTFBfREJHX0FMTE9DQVRPUl9TRUxFQ1QoX1ZhbHVlKSA+Ci1jbGFzcyBfUmJfdHJlZSB7Ci0gIHR5cGVkZWYgX1NUTFBfTk9OX0RCR19UUkVFIF9CYXNlOwotICB0eXBlZGVmIF9SYl90cmVlPF9LZXksIF9Db21wYXJlLCBfVmFsdWUsIF9LZXlPZlZhbHVlLCBfVHJhaXRzLCBfQWxsb2M+IF9TZWxmOwotICBfQmFzZSBfTV9ub25fZGJnX2ltcGw7Ci0gIF9TVExQX1BSSVYgX19vd25lZF9saXN0IF9NX2l0ZXJfbGlzdDsKLQotcHVibGljOgotICBfX0lNUE9SVF9DT05UQUlORVJfVFlQRURFRlMoX0Jhc2UpCi0gIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmtleV90eXBlIGtleV90eXBlOwotCi0gIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6X05vbkNvbnN0VHJhaXRzIF9Ob25Db25zdEl0ZVRyYWl0czsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpfQ29uc3RUcmFpdHMgICAgX0NvbnN0SXRlVHJhaXRzOwotICB0eXBlZGVmIF9TVExQX1BSSVYgX0RCR19pdGVyPF9CYXNlLCBfU1RMUF9QUklWIF9EYmdUcmFpdHM8X05vbkNvbnN0SXRlVHJhaXRzPiA+IGl0ZXJhdG9yOwotICB0eXBlZGVmIF9TVExQX1BSSVYgX0RCR19pdGVyPF9CYXNlLCBfU1RMUF9QUklWIF9EYmdUcmFpdHM8X0NvbnN0SXRlVHJhaXRzPiA+ICAgIGNvbnN0X2l0ZXJhdG9yOwotCi0gIF9TVExQX0RFQ0xBUkVfQklESVJFQ1RJT05BTF9SRVZFUlNFX0lURVJBVE9SUzsKLQotcHJpdmF0ZToKLSAgX1NUTFBfS0VZX1RZUEVfRk9SX0NPTlRfRVhUKGtleV90eXBlKQotICB2b2lkIF9JbnZhbGlkYXRlX2l0ZXJhdG9yKGNvbnN0IGl0ZXJhdG9yJiBfX2l0KQotICB7IF9TVExQX1BSSVYgX19pbnZhbGlkYXRlX2l0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsX19pdCk7IH0KLSAgdm9pZCBfSW52YWxpZGF0ZV9pdGVyYXRvcnMoY29uc3QgaXRlcmF0b3ImIF9fZmlyc3QsIGNvbnN0IGl0ZXJhdG9yJiBfX2xhc3QpCi0gIHsgX1NUTFBfUFJJViBfX2ludmFsaWRhdGVfcmFuZ2UoJl9NX2l0ZXJfbGlzdCwgX19maXJzdCwgX19sYXN0KTsgfQotCi0gIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yIF9CYXNlX2l0ZXJhdG9yOwotICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9pdGVyYXRvciBfQmFzZV9jb25zdF9pdGVyYXRvcjsKLQotcHVibGljOgotICBfUmJfdHJlZSgpCi0gICAgOiBfTV9ub25fZGJnX2ltcGwoKSwgX01faXRlcl9saXN0KCZfTV9ub25fZGJnX2ltcGwpIHt9Ci0gIF9SYl90cmVlKGNvbnN0IF9Db21wYXJlJiBfX2NvbXApCi0gICAgOiBfTV9ub25fZGJnX2ltcGwoX19jb21wKSwgX01faXRlcl9saXN0KCZfTV9ub25fZGJnX2ltcGwpIHt9Ci0gIF9SYl90cmVlKGNvbnN0IF9Db21wYXJlJiBfX2NvbXAsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCi0gICAgOiBfTV9ub25fZGJnX2ltcGwoX19jb21wLCBfX2EpLCBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KLSAgX1JiX3RyZWUoY29uc3QgX1NlbGYmIF9feCkKLSAgICA6IF9NX25vbl9kYmdfaW1wbChfX3guX01fbm9uX2RiZ19pbXBsKSwgX01faXRlcl9saXN0KCZfTV9ub25fZGJnX2ltcGwpIHt9Ci0KLSAgX1JiX3RyZWUoX19tb3ZlX3NvdXJjZTxfU2VsZj4gc3JjKToKLSAgICBfTV9ub25fZGJnX2ltcGwoX19tb3ZlX3NvdXJjZTxfQmFzZT4oc3JjLmdldCgpLl9NX25vbl9kYmdfaW1wbCkpLAotICAgIF9NX2l0ZXJfbGlzdCgmX01fbm9uX2RiZ19pbXBsKSB7Ci0jaWYgZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykgfHwgKF9TVExQX0RFQlVHX0xFVkVMID09IF9TVExQX1NUQU5EQVJEX0RCR19MRVZFTCkKLSAgICBzcmMuZ2V0KCkuX01faXRlcl9saXN0Ll9JbnZhbGlkYXRlX2FsbCgpOwotI2Vsc2UKLSAgICBzcmMuZ2V0KCkuX01faXRlcl9saXN0Ll9TZXRfb3duZXIoX01faXRlcl9saXN0KTsKLSNlbmRpZgotICB9Ci0KLSAgfl9SYl90cmVlKCkge30KLQotICBfU2VsZiYgb3BlcmF0b3I9KGNvbnN0IF9TZWxmJiBfX3gpIHsKLSAgICBpZiAodGhpcyAhPSAmX194KSB7Ci0gICAgICAvL1Nob3VsZCBub3QgaW52YWxpZGF0ZSBlbmQgaXRlcmF0b3I6Ci0gICAgICBfSW52YWxpZGF0ZV9pdGVyYXRvcnMoYmVnaW4oKSwgZW5kKCkpOwotICAgICAgX01fbm9uX2RiZ19pbXBsID0gX194Ll9NX25vbl9kYmdfaW1wbDsKLSAgICB9Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5nZXRfYWxsb2NhdG9yKCk7IH0KLSAgX0NvbXBhcmUga2V5X2NvbXAoKSBjb25zdCB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwua2V5X2NvbXAoKS5ub25fZGJnX2tleV9jb21wKCk7IH0KLQotICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5iZWdpbigpKTsgfQotICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5iZWdpbigpKTsgfQotICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBpdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuZW5kKCkpOyB9Ci0gIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5lbmQoKSk7IH0KLQotICByZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9Ci0gIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3QgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KLSAgcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQotICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSBjb25zdCB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9Ci0KLSAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5lbXB0eSgpOyB9Ci0gIHNpemVfdHlwZSBzaXplKCkgY29uc3QgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLnNpemUoKTsgfQotICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwubWF4X3NpemUoKTsgfQotICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKLSAgc2l6ZV90eXBlIGNvdW50KGNvbnN0IF9LVCYgX194KSBjb25zdCB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwuY291bnQoX194KTsgfQotCi0gIHZvaWQgc3dhcChfU2VsZiYgX190KSB7Ci0gICAgX01fbm9uX2RiZ19pbXBsLnN3YXAoX190Ll9NX25vbl9kYmdfaW1wbCk7Ci0gICAgX01faXRlcl9saXN0Ll9Td2FwX293bmVycyhfX3QuX01faXRlcl9saXN0KTsKLSAgfQotCi0gIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAotICBpdGVyYXRvciBmaW5kKGNvbnN0IF9LVCYgX19rKQotICB7IHJldHVybiBpdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuZmluZChfX2spKTsgfQotICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKLSAgY29uc3RfaXRlcmF0b3IgZmluZChjb25zdCBfS1QmIF9faykgY29uc3QKLSAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLmZpbmQoX19rKSk7IH0KLQotICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKLSAgaXRlcmF0b3IgbG93ZXJfYm91bmQoY29uc3QgX0tUJiBfX3gpCi0gIHsgcmV0dXJuIGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5sb3dlcl9ib3VuZChfX3gpKTsgfQotICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKLSAgY29uc3RfaXRlcmF0b3IgbG93ZXJfYm91bmQoY29uc3QgX0tUJiBfX3gpIGNvbnN0Ci0gIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5sb3dlcl9ib3VuZChfX3gpKTsgfQotCi0gIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAotICBpdGVyYXRvciB1cHBlcl9ib3VuZChjb25zdCBfS1QmIF9feCkKLSAgeyByZXR1cm4gaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLnVwcGVyX2JvdW5kKF9feCkpOyB9Ci0gIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAotICBjb25zdF9pdGVyYXRvciB1cHBlcl9ib3VuZChjb25zdCBfS1QmIF9feCkgY29uc3QKLSAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLnVwcGVyX2JvdW5kKF9feCkpOyB9Ci0KLSAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0gIHBhaXI8aXRlcmF0b3IsaXRlcmF0b3I+IGVxdWFsX3JhbmdlKGNvbnN0IF9LVCYgX194KSB7Ci0gICAgcmV0dXJuIHBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPihpdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwubG93ZXJfYm91bmQoX194KSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwudXBwZXJfYm91bmQoX194KSkpOwotICB9Ci0gIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAotICBwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4gZXF1YWxfcmFuZ2UoY29uc3QgX0tUJiBfX3gpIGNvbnN0IHsKLSAgICByZXR1cm4gcGFpcjxjb25zdF9pdGVyYXRvcixjb25zdF9pdGVyYXRvcj4oY29uc3RfaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLmxvd2VyX2JvdW5kKF9feCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwudXBwZXJfYm91bmQoX194KSkpOwotICB9Ci0KLSAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0gIHBhaXI8aXRlcmF0b3IsaXRlcmF0b3I+IGVxdWFsX3JhbmdlX3VuaXF1ZShjb25zdCBfS1QmIF9feCkgewotICAgIF9TVExQX1NURDo6cGFpcjxfQmFzZV9pdGVyYXRvciwgX0Jhc2VfaXRlcmF0b3I+IF9fcDsKLSAgICBfX3AgPSBfTV9ub25fZGJnX2ltcGwuZXF1YWxfcmFuZ2VfdW5pcXVlKF9feCk7Ci0gICAgcmV0dXJuIHBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPihpdGVyYXRvcigmX01faXRlcl9saXN0LCBfX3AuZmlyc3QpLCBpdGVyYXRvcigmX01faXRlcl9saXN0LCBfX3Auc2Vjb25kKSk7Ci0gIH0KLSAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0gIHBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPiBlcXVhbF9yYW5nZV91bmlxdWUoY29uc3QgX0tUJiBfX3gpIGNvbnN0IHsKLSAgICBfU1RMUF9TVEQ6OnBhaXI8X0Jhc2VfY29uc3RfaXRlcmF0b3IsIF9CYXNlX2NvbnN0X2l0ZXJhdG9yPiBfX3A7Ci0gICAgX19wID0gX01fbm9uX2RiZ19pbXBsLmVxdWFsX3JhbmdlX3VuaXF1ZShfX3gpOwotICAgIHJldHVybiBwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4oY29uc3RfaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX19wLmZpcnN0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9fcC5zZWNvbmQpKTsKLSAgfQotCi0gIHBhaXI8aXRlcmF0b3IsYm9vbD4gaW5zZXJ0X3VuaXF1ZShjb25zdCB2YWx1ZV90eXBlJiBfX3gpIHsKLSAgICBfU1RMUF9TVEQ6OnBhaXI8X0Jhc2VfaXRlcmF0b3IsIGJvb2w+IF9fcmVzID0gX01fbm9uX2RiZ19pbXBsLmluc2VydF91bmlxdWUoX194KTsKLSAgICByZXR1cm4gcGFpcjxpdGVyYXRvciwgYm9vbD4oaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX19yZXMuZmlyc3QpLCBfX3Jlcy5zZWNvbmQpOwotICB9Ci0gIGl0ZXJhdG9yIGluc2VydF9lcXVhbChjb25zdCB2YWx1ZV90eXBlJiBfX3gpCi0gIHsgcmV0dXJuIGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5pbnNlcnRfZXF1YWwoX194KSk7IH0KLQotICBpdGVyYXRvciBpbnNlcnRfdW5pcXVlKGl0ZXJhdG9yIF9fcG9zLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpIHsKLSAgICBfU1RMUF9ERUJVR19DSEVDSyhfX2NoZWNrX2lmX293bmVyKCZfTV9pdGVyX2xpc3QsX19wb3MpKQotICAgIHJldHVybiBpdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0X3VuaXF1ZShfX3Bvcy5fTV9pdGVyYXRvciwgX194KSk7Ci0gIH0KLSAgaXRlcmF0b3IgaW5zZXJ0X2VxdWFsKGl0ZXJhdG9yIF9fcG9zLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpIHsKLSAgICBfU1RMUF9ERUJVR19DSEVDSyhfX2NoZWNrX2lmX293bmVyKCZfTV9pdGVyX2xpc3QsIF9fcG9zKSkKLSAgICByZXR1cm4gaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLmluc2VydF9lcXVhbChfX3Bvcy5fTV9pdGVyYXRvciwgX194KSk7Ci0gIH0KLQotI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCi0gIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgotICB2b2lkIGluc2VydF9lcXVhbChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpIHsKLSAgICBfU1RMUF9ERUJVR19DSEVDSyhfX2NoZWNrX3JhbmdlKF9fZmlyc3QsX19sYXN0KSkKLSAgICBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0X2VxdWFsKF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2ZpcnN0KSwgX1NUTFBfUFJJViBfTm9uX0RiZ19pdGVyKF9fbGFzdCkpOwotICB9Ci0gIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgotICB2b2lkIGluc2VydF91bmlxdWUoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KSB7Ci0gICAgX1NUTFBfREVCVUdfQ0hFQ0soX19jaGVja19yYW5nZShfX2ZpcnN0LF9fbGFzdCkpCi0gICAgX01fbm9uX2RiZ19pbXBsLmluc2VydF91bmlxdWUoX1NUTFBfUFJJViBfTm9uX0RiZ19pdGVyKF9fZmlyc3QpLCBfU1RMUF9QUklWIF9Ob25fRGJnX2l0ZXIoX19sYXN0KSk7Ci0gIH0KLSNlbHNlCi0gIHZvaWQgaW5zZXJ0X3VuaXF1ZShjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpIHsKLSAgICBfU1RMUF9ERUJVR19DSEVDSyhfX2NoZWNrX3JhbmdlKF9fZmlyc3QsX19sYXN0KSkKLSAgICBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0X3VuaXF1ZShfX2ZpcnN0Ll9NX2l0ZXJhdG9yLCBfX2xhc3QuX01faXRlcmF0b3IpOwotICB9Ci0gIHZvaWQgaW5zZXJ0X3VuaXF1ZShjb25zdCB2YWx1ZV90eXBlKiBfX2ZpcnN0LCBjb25zdCB2YWx1ZV90eXBlKiBfX2xhc3QpIHsKLSAgICBfU1RMUF9ERUJVR19DSEVDSyhfX2NoZWNrX3B0cl9yYW5nZShfX2ZpcnN0LF9fbGFzdCkpCi0gICAgX01fbm9uX2RiZ19pbXBsLmluc2VydF91bmlxdWUoX19maXJzdCwgX19sYXN0KTsKLSAgfQotICB2b2lkIGluc2VydF9lcXVhbChjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpIHsKLSAgICBfU1RMUF9ERUJVR19DSEVDSyhfX2NoZWNrX3JhbmdlKF9fZmlyc3QsX19sYXN0KSkKLSAgICBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0X2VxdWFsKF9fZmlyc3QuX01faXRlcmF0b3IsIF9fbGFzdC5fTV9pdGVyYXRvcik7Ci0gIH0KLSAgdm9pZCBpbnNlcnRfZXF1YWwoY29uc3QgdmFsdWVfdHlwZSogX19maXJzdCwgY29uc3QgdmFsdWVfdHlwZSogX19sYXN0KSB7Ci0gICAgX1NUTFBfREVCVUdfQ0hFQ0soX19jaGVja19wdHJfcmFuZ2UoX19maXJzdCxfX2xhc3QpKQotICAgIF9NX25vbl9kYmdfaW1wbC5pbnNlcnRfZXF1YWwoX19maXJzdCwgX19sYXN0KTsKLSAgfQotI2VuZGlmCi0KLSAgdm9pZCBlcmFzZShpdGVyYXRvciBfX3BvcykgewotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9fY2hlY2tfaWZfb3duZXIoJl9NX2l0ZXJfbGlzdCxfX3BvcykpCi0gICAgX1NUTFBfREVCVUdfQ0hFQ0soX0RlcmVmZXJlbmNlYWJsZShfX3BvcykpCi0gICAgX0ludmFsaWRhdGVfaXRlcmF0b3IoX19wb3MpOwotICAgIF9NX25vbl9kYmdfaW1wbC5lcmFzZShfX3Bvcy5fTV9pdGVyYXRvcik7Ci0gIH0KLSAgc2l6ZV90eXBlIGVyYXNlKGNvbnN0IGtleV90eXBlJiBfX3gpIHsKLSAgICBwYWlyPF9CYXNlX2l0ZXJhdG9yLF9CYXNlX2l0ZXJhdG9yPiBfX3AgPSBfTV9ub25fZGJnX2ltcGwuZXF1YWxfcmFuZ2UoX194KTsKLSAgICBzaXplX3R5cGUgX19uID0gZGlzdGFuY2UoX19wLmZpcnN0LCBfX3Auc2Vjb25kKTsKLSAgICBfSW52YWxpZGF0ZV9pdGVyYXRvcnMoaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX19wLmZpcnN0KSwgaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX19wLnNlY29uZCkpOwotICAgIF9NX25vbl9kYmdfaW1wbC5lcmFzZShfX3AuZmlyc3QsIF9fcC5zZWNvbmQpOwotICAgIHJldHVybiBfX247Ci0gIH0KLSAgc2l6ZV90eXBlIGVyYXNlX3VuaXF1ZShjb25zdCBrZXlfdHlwZSYgX194KSB7Ci0gICAgX0Jhc2VfaXRlcmF0b3IgX19pID0gX01fbm9uX2RiZ19pbXBsLmZpbmQoX194KTsKLSAgICBpZiAoX19pICE9IF9NX25vbl9kYmdfaW1wbC5lbmQoKSkgewotICAgICAgX0ludmFsaWRhdGVfaXRlcmF0b3IoaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX19pKSk7Ci0gICAgICBfTV9ub25fZGJnX2ltcGwuZXJhc2UoX19pKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHZvaWQgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KSB7Ci0gICAgX1NUTFBfREVCVUdfQ0hFQ0soX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QsIGJlZ2luKCksIGVuZCgpKSkKLSAgICBfSW52YWxpZGF0ZV9pdGVyYXRvcnMoX19maXJzdCwgX19sYXN0KTsKLSAgICBfTV9ub25fZGJnX2ltcGwuZXJhc2UoX19maXJzdC5fTV9pdGVyYXRvciwgX19sYXN0Ll9NX2l0ZXJhdG9yKTsKLSAgfQotICB2b2lkIGVyYXNlKGNvbnN0IGtleV90eXBlKiBfX2ZpcnN0LCBjb25zdCBrZXlfdHlwZSogX19sYXN0KSB7Ci0gICAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0KSBlcmFzZSgqX19maXJzdCsrKTsKLSAgfQotCi0gIHZvaWQgY2xlYXIoKSB7Ci0gICAgLy9zaG91bGQgbm90IGludmFsaWRhdGUgZW5kOgotICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9ycyhiZWdpbigpLCBlbmQoKSk7Ci0gICAgX01fbm9uX2RiZ19pbXBsLmNsZWFyKCk7Ci0gIH0KLX07Ci0KLV9TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQotX1NUTFBfRU5EX05BTUVTUEFDRQotCi0jdW5kZWYgX1NUTFBfTk9OX0RCR19UUkVFCi0KLSNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9EQkdfVFJFRV9IICovCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvZGVidWcvX3ZlY3Rvci5oIGIvc3RsL2RlYnVnL192ZWN0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcxYjc2NC4uMDAwMDAwMAotLS0gYS9zdGwvZGVidWcvX3ZlY3Rvci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDQ5ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk0Ci0gKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3Ci0gKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTcKLSAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0vKiBOT1RFOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBTVEwgaGVhZGVycy4KLSAqICAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuCi0gKi8KLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9EQkdfVkVDVE9SX0gKLSNkZWZpbmUgX1NUTFBfSU5URVJOQUxfREJHX1ZFQ1RPUl9ICi0KLSNpZm5kZWYgX1NUTFBfREJHX0lURVJBVE9SX0gKLSMgIGluY2x1ZGUgPHN0bC9kZWJ1Zy9faXRlcmF0b3IuaD4KLSNlbmRpZgotCi0jZGVmaW5lIF9TVExQX05PTl9EQkdfVkVDVE9SIF9TVExQX1BSSVYgX1NUTFBfTk9OX0RCR19OQU1FKHZlY3RvcikgPF9UcCwgX0FsbG9jPgotCi1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLQotI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHX1VTRV9ESVNUSU5DVF9WQUxVRV9UWVBFX0hFTFBFUlMpCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Ci1pbmxpbmUgX1RwKgotdmFsdWVfdHlwZShjb25zdCBfU1RMUF9QUklWIF9EQkdfaXRlcl9iYXNlPCBfU1RMUF9OT05fREJHX1ZFQ1RPUiA+JikKLXsgcmV0dXJuIChfVHAqKTA7IH0KLXRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KLWlubGluZSByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZwotaXRlcmF0b3JfY2F0ZWdvcnkoY29uc3QgX1NUTFBfUFJJViBfREJHX2l0ZXJfYmFzZTwgX1NUTFBfTk9OX0RCR19WRUNUT1IgPiYpCi17IHJldHVybiByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZygpOyB9Ci0jZW5kaWYKLQotX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfTmNJdD4KLXN0cnVjdCBfVmVjdG9yX2NvbnN0X3RyYWl0czsKLQotdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX05jSXQ+Ci1zdHJ1Y3QgX1ZlY3Rvcl9ub25jb25zdF90cmFpdHMgewotICB0eXBlZGVmIF9Ob25jb25zdF90cmFpdHM8X1RwPiBfQmFzZVQ7Ci0gIHR5cGVkZWYgX1RwIHZhbHVlX3R5cGU7Ci0gIHR5cGVkZWYgX1RwJiByZWZlcmVuY2U7Ci0gIHR5cGVkZWYgX1RwKiBwb2ludGVyOwotICB0eXBlZGVmIF9WZWN0b3JfY29uc3RfdHJhaXRzPF9UcCwgX05jSXQ+IF9Db25zdFRyYWl0czsKLSAgdHlwZWRlZiBfVmVjdG9yX25vbmNvbnN0X3RyYWl0czxfVHAsIF9OY0l0PiBfTm9uQ29uc3RUcmFpdHM7Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfTmNJdD4KLXN0cnVjdCBfVmVjdG9yX2NvbnN0X3RyYWl0cyB7Ci0gIHR5cGVkZWYgX0NvbnN0X3RyYWl0czxfVHA+IF9CYXNlVDsKLSAgdHlwZWRlZiBfVHAgdmFsdWVfdHlwZTsKLSAgdHlwZWRlZiBjb25zdCBfVHAmIHJlZmVyZW5jZTsKLSAgdHlwZWRlZiBjb25zdCBfVHAqIHBvaW50ZXI7Ci0gIHR5cGVkZWYgX1ZlY3Rvcl9jb25zdF90cmFpdHM8X1RwLCBfTmNJdD4gX0NvbnN0VHJhaXRzOwotICB0eXBlZGVmIF9WZWN0b3Jfbm9uY29uc3RfdHJhaXRzPF9UcCwgX05jSXQ+IF9Ob25Db25zdFRyYWl0czsKLX07Ci0KLV9TVExQX1RFTVBMQVRFX05VTEwKLXN0cnVjdCBfVmVjdG9yX25vbmNvbnN0X3RyYWl0czxib29sLCBfQml0X2l0ZXJhdG9yPiB7Ci0gIHR5cGVkZWYgX0JpdF9pdGVyYXRvcjo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOwotICB0eXBlZGVmIF9CaXRfaXRlcmF0b3I6OnJlZmVyZW5jZSByZWZlcmVuY2U7Ci0gIHR5cGVkZWYgX0JpdF9pdGVyYXRvcjo6cG9pbnRlciBwb2ludGVyOwotICB0eXBlZGVmIF9WZWN0b3JfY29uc3RfdHJhaXRzPGJvb2wsIF9CaXRfaXRlcmF0b3I+IF9Db25zdFRyYWl0czsKLSAgdHlwZWRlZiBfVmVjdG9yX25vbmNvbnN0X3RyYWl0czxib29sLCBfQml0X2l0ZXJhdG9yPiBfTm9uQ29uc3RUcmFpdHM7Ci19OwotCi1fU1RMUF9URU1QTEFURV9OVUxMCi1zdHJ1Y3QgX1ZlY3Rvcl9jb25zdF90cmFpdHM8Ym9vbCwgX0JpdF9pdGVyYXRvcj4gewotICB0eXBlZGVmIF9CaXRfY29uc3RfaXRlcmF0b3I6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKLSAgdHlwZWRlZiBfQml0X2NvbnN0X2l0ZXJhdG9yOjpyZWZlcmVuY2UgcmVmZXJlbmNlOwotICB0eXBlZGVmIF9CaXRfY29uc3RfaXRlcmF0b3I6OnBvaW50ZXIgcG9pbnRlcjsKLSAgdHlwZWRlZiBfVmVjdG9yX2NvbnN0X3RyYWl0czxib29sLCBfQml0X2l0ZXJhdG9yPiBfQ29uc3RUcmFpdHM7Ci0gIHR5cGVkZWYgX1ZlY3Rvcl9ub25jb25zdF90cmFpdHM8Ym9vbCwgX0JpdF9pdGVyYXRvcj4gX05vbkNvbnN0VHJhaXRzOwotfTsKLQotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi0KLXRlbXBsYXRlIDxjbGFzcyBfVHAsIF9TVExQX0RCR19BTExPQ0FUT1JfU0VMRUNUKF9UcCkgPgotY2xhc3MgdmVjdG9yIDoKLSNpZiAhZGVmaW5lZCAoX19ETUNfXykKLSAgICAgICAgICAgICBwcml2YXRlCi0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX19jb25zdHJ1Y3RfY2hlY2tlcjwgX1NUTFBfTk9OX0RCR19WRUNUT1IgPgotI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QQVJUSUFMX1NQRUNfV09SS0FST1VORCkKLSAgICAgICAgICAgICAsIHB1YmxpYyBfX3N0bHBvcnRfY2xhc3M8dmVjdG9yPF9UcCwgX0FsbG9jPiA+Ci0jZW5kaWYKLXsKLXByaXZhdGU6Ci0gIHR5cGVkZWYgX1NUTFBfTk9OX0RCR19WRUNUT1IgX0Jhc2U7Ci0gIHR5cGVkZWYgdmVjdG9yPF9UcCwgX0FsbG9jPiBfU2VsZjsKLSAgdHlwZWRlZiBfU1RMUF9QUklWIF9fY29uc3RydWN0X2NoZWNrZXI8X1NUTFBfTk9OX0RCR19WRUNUT1IgPiBfQ29uc3RydWN0Q2hlY2s7Ci0gIF9CYXNlIF9NX25vbl9kYmdfaW1wbDsKLSAgX1NUTFBfUFJJViBfX293bmVkX2xpc3QgX01faXRlcl9saXN0OwotCi1wdWJsaWM6Ci0gIF9fSU1QT1JUX0NPTlRBSU5FUl9UWVBFREVGUyhfQmFzZSkKLQotICB0eXBlZGVmIF9TVExQX1BSSVYgX0RCR19pdGVyPF9CYXNlLAotICAgIF9TVExQX1BSSVYgX0RiZ1RyYWl0czxfU1RMUF9QUklWIF9WZWN0b3Jfbm9uY29uc3RfdHJhaXRzPHZhbHVlX3R5cGUsIHR5cGVuYW1lIF9CYXNlOjppdGVyYXRvcj4gPiA+IGl0ZXJhdG9yOwotCi0gIHR5cGVkZWYgX1NUTFBfUFJJViBfREJHX2l0ZXI8X0Jhc2UsCi0gICAgX1NUTFBfUFJJViBfRGJnVHJhaXRzPF9TVExQX1BSSVYgX1ZlY3Rvcl9jb25zdF90cmFpdHM8dmFsdWVfdHlwZSwgdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yPiA+ID4gY29uc3RfaXRlcmF0b3I7Ci0KLXByaXZhdGU6Ci0gIHZvaWQgX0ludmFsaWRhdGVfYWxsKCkKLSAgeyBfTV9pdGVyX2xpc3QuX0ludmFsaWRhdGVfYWxsKCk7IH0KLSAgdm9pZCBfSW52YWxpZGF0ZV9pdGVyYXRvcihjb25zdCBpdGVyYXRvciYgX19pdCkKLSAgeyBfU1RMUF9QUklWIF9faW52YWxpZGF0ZV9pdGVyYXRvcigmX01faXRlcl9saXN0LCBfX2l0KTsgfQotICB2b2lkIF9JbnZhbGlkYXRlX2l0ZXJhdG9ycyhjb25zdCBpdGVyYXRvciYgX19maXJzdCwgY29uc3QgaXRlcmF0b3ImIF9fbGFzdCkKLSAgeyBfU1RMUF9QUklWIF9faW52YWxpZGF0ZV9yYW5nZSgmX01faXRlcl9saXN0LCBfX2ZpcnN0LCBfX2xhc3QpOyB9Ci0KLSAgdm9pZCBfQ2hlY2tfT3ZlcmZsb3coc2l6ZV90eXBlIF9fbmIpIHsKLSAgICBpZiAoc2l6ZSgpICsgX19uYiA+IGNhcGFjaXR5KCkpCi0gICAgICBfSW52YWxpZGF0ZV9hbGwoKTsKLSAgfQotICB2b2lkIF9Db21wYXJlX0NhcGFjaXR5IChzaXplX3R5cGUgX19vbGRfY2FwYWNpdHkpIHsKLSAgICBpZiAoY2FwYWNpdHkoKSA+IF9fb2xkX2NhcGFjaXR5KSB7Ci0gICAgICBfSW52YWxpZGF0ZV9hbGwoKTsKLSAgICB9Ci0gIH0KLQotcHVibGljOgotICBfU1RMUF9ERUNMQVJFX1JBTkRPTV9BQ0NFU1NfUkVWRVJTRV9JVEVSQVRPUlM7Ci0KLSAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5nZXRfYWxsb2NhdG9yKCk7IH0KLQotICBpdGVyYXRvciBiZWdpbigpICAgICAgICAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5iZWdpbigpKTsgfQotICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5iZWdpbigpKTsgfQotICBpdGVyYXRvciBlbmQoKSAgICAgICAgICAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5lbmQoKSk7IH0KLSAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuZW5kKCkpOyB9Ci0KLSAgcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSAgICAgICAgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQotICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9Ci0gIHJldmVyc2VfaXRlcmF0b3IgcmVuZCgpICAgICAgICAgICAgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQotICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSBjb25zdCAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KLQotICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0ICAgICAgICB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwuc2l6ZSgpOyB9Ci0gIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0ICAgIHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5tYXhfc2l6ZSgpOyB9Ci0gIHNpemVfdHlwZSBjYXBhY2l0eSgpIGNvbnN0ICAgIHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5jYXBhY2l0eSgpOyB9Ci0gIGJvb2wgZW1wdHkoKSBjb25zdCAgICAgICAgICAgIHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5lbXB0eSgpOyB9Ci0KLSAgcmVmZXJlbmNlIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fbikgewotICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKF9fbiA8IHNpemUoKSwgX1N0bE1zZ19PVVRfT0ZfQk9VTkRTKQotICAgIHJldHVybiBfTV9ub25fZGJnX2ltcGxbX19uXTsKLSAgfQotCi0gIGNvbnN0X3JlZmVyZW5jZSBvcGVyYXRvcltdKHNpemVfdHlwZSBfX24pIGNvbnN0IHsKLSAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVChfX24gPCBzaXplKCksIF9TdGxNc2dfT1VUX09GX0JPVU5EUykKLSAgICByZXR1cm4gX01fbm9uX2RiZ19pbXBsW19fbl07Ci0gIH0KLQotICByZWZlcmVuY2UgYXQoc2l6ZV90eXBlIF9fbikgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLmF0KF9fbik7IH0KLSAgY29uc3RfcmVmZXJlbmNlIGF0KHNpemVfdHlwZSBfX24pIGNvbnN0IHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5hdChfX24pOyB9Ci0KLSAgZXhwbGljaXQgdmVjdG9yKGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQotICAgIDogX01fbm9uX2RiZ19pbXBsKF9fYSksIF9NX2l0ZXJfbGlzdCgmX01fbm9uX2RiZ19pbXBsKSAge30KLQotI2lmICFkZWZpbmVkKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCi0gIGV4cGxpY2l0IHZlY3RvcihzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9feCA9IF9UcCgpLAotI2Vsc2UKLSAgdmVjdG9yKHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX194LAotI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCi0gICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKLSAgICA6IF9NX25vbl9kYmdfaW1wbChfX24sIF9feCwgX19hKSwgX01faXRlcl9saXN0KCZfTV9ub25fZGJnX2ltcGwpIHt9Ci0KLSNpZiBkZWZpbmVkKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCi0gIGV4cGxpY2l0IHZlY3RvcihzaXplX3R5cGUgX19uKQotICAgIDogX01fbm9uX2RiZ19pbXBsKF9fbiksIF9NX2l0ZXJfbGlzdCgmX01fbm9uX2RiZ19pbXBsKSB7fQotI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCi0KLSAgdmVjdG9yKGNvbnN0IF9TZWxmJiBfX3gpCi0gICAgOiBfQ29uc3RydWN0Q2hlY2soX194KSwgX01fbm9uX2RiZ19pbXBsKF9feC5fTV9ub25fZGJnX2ltcGwpLCBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KLQotICB2ZWN0b3IoX19tb3ZlX3NvdXJjZTxfU2VsZj4gc3JjKQotICAgIDogX01fbm9uX2RiZ19pbXBsKF9fbW92ZV9zb3VyY2U8X0Jhc2U+KHNyYy5nZXQoKS5fTV9ub25fZGJnX2ltcGwpKSwKLSAgICAgIF9NX2l0ZXJfbGlzdCgmX01fbm9uX2RiZ19pbXBsKSB7Ci0jaWYgZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykgfHwgKF9TVExQX0RFQlVHX0xFVkVMID09IF9TVExQX1NUQU5EQVJEX0RCR19MRVZFTCkKLSAgICBzcmMuZ2V0KCkuX01faXRlcl9saXN0Ll9JbnZhbGlkYXRlX2FsbCgpOwotI2Vsc2UKLSAgICBzcmMuZ2V0KCkuX01faXRlcl9saXN0Ll9TZXRfb3duZXIoX01faXRlcl9saXN0KTsKLSNlbmRpZgotICB9Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Ci0gIHZlY3RvcihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCi0gICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hIF9TVExQX0FMTE9DQVRPUl9UWVBFX0RGTCkKLSAgICA6IF9Db25zdHJ1Y3RDaGVjayhfX2ZpcnN0LCBfX2xhc3QpLAotICAgICAgX01fbm9uX2RiZ19pbXBsKF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2ZpcnN0KSwgX1NUTFBfUFJJViBfTm9uX0RiZ19pdGVyKF9fbGFzdCksIF9fYSksCi0gICAgICBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KLQotIyAgaWYgZGVmaW5lZCAoX1NUTFBfTkVFRFNfRVhUUkFfVEVNUExBVEVfQ09OU1RSVUNUT1JTKQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Ci0gIHZlY3RvcihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCi0gICAgOiBfQ29uc3RydWN0Q2hlY2soX19maXJzdCwgX19sYXN0KSwKLSAgICAgIF9NX25vbl9kYmdfaW1wbChfU1RMUF9QUklWIF9Ob25fRGJnX2l0ZXIoX19maXJzdCksIF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2xhc3QpKSwKLSAgICAgIF9NX2l0ZXJfbGlzdCgmX01fbm9uX2RiZ19pbXBsKSB7fQotIyAgZW5kaWYKLSNlbHNlCi0gIHZlY3Rvcihjb25zdCBfVHAqIF9fZmlyc3QsIGNvbnN0IF9UcCogX19sYXN0LAotICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCi0gICAgOiBfQ29uc3RydWN0Q2hlY2soX19maXJzdCwgX19sYXN0KSwgX01fbm9uX2RiZ19pbXBsKF9fZmlyc3QsIF9fbGFzdCwgX19hKSwKLSAgICBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KLQotICAvLyBteXN0ZXJpb3VzIFZDKysgYnVnID8KLSAgdmVjdG9yKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCAsCi0gICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKLSAgICA6IF9Db25zdHJ1Y3RDaGVjayhfX2ZpcnN0LCBfX2xhc3QpLAotICAgICAgX01fbm9uX2RiZ19pbXBsKF9fZmlyc3QuX01faXRlcmF0b3IsIF9fbGFzdC5fTV9pdGVyYXRvciwgX19hKSwKLSAgICBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KLSNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCi0KLSAgX1NlbGYmIG9wZXJhdG9yPShjb25zdCBfU2VsZiYgX194KSB7Ci0gICAgaWYgKHRoaXMgIT0gJl9feCkgewotICAgICAgX0ludmFsaWRhdGVfYWxsKCk7Ci0gICAgICBfTV9ub25fZGJnX2ltcGwgPSBfX3guX01fbm9uX2RiZ19pbXBsOwotICAgIH0KLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICB2b2lkIHJlc2VydmUoc2l6ZV90eXBlIF9fbikgewotICAgIGlmIChjYXBhY2l0eSgpIDwgX19uKQotICAgICAgX0ludmFsaWRhdGVfYWxsKCk7Ci0gICAgX01fbm9uX2RiZ19pbXBsLnJlc2VydmUoX19uKTsKLSAgfQotCi0gIHJlZmVyZW5jZSBmcm9udCgpIHsKLSAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghZW1wdHkoKSwgX1N0bE1zZ19FTVBUWV9DT05UQUlORVIpCi0gICAgcmV0dXJuICpiZWdpbigpOwotICB9Ci0gIGNvbnN0X3JlZmVyZW5jZSBmcm9udCgpIGNvbnN0IHsKLSAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghZW1wdHkoKSwgX1N0bE1zZ19FTVBUWV9DT05UQUlORVIpCi0gICAgcmV0dXJuICpiZWdpbigpOwotICB9Ci0gIHJlZmVyZW5jZSBiYWNrKCkgewotICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFlbXB0eSgpLCBfU3RsTXNnX0VNUFRZX0NPTlRBSU5FUikKLSAgICByZXR1cm4gKigtLWVuZCgpKTsKLSAgfQotICBjb25zdF9yZWZlcmVuY2UgYmFjaygpIGNvbnN0IHsKLSAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghZW1wdHkoKSwgX1N0bE1zZ19FTVBUWV9DT05UQUlORVIpCi0gICAgcmV0dXJuICooLS1lbmQoKSk7Ci0gIH0KLQotICB2b2lkIHN3YXAoX1NlbGYmIF9feCkgewotICAgIF9NX2l0ZXJfbGlzdC5fU3dhcF9vd25lcnMoX194Ll9NX2l0ZXJfbGlzdCk7Ci0gICAgX01fbm9uX2RiZ19pbXBsLnN3YXAoX194Ll9NX25vbl9kYmdfaW1wbCk7Ci0gIH0KLQotI2lmICFkZWZpbmVkKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCi0gIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBfX3BvcywgY29uc3QgX1RwJiBfX3ggPSBfVHAoKSkgewotI2Vsc2UKLSAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBjb25zdCBfVHAmIF9feCkgewotI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCi0gICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX2lmX293bmVyKCZfTV9pdGVyX2xpc3QsIF9fcG9zKSkKLSAgICBfQ2hlY2tfT3ZlcmZsb3coMSk7Ci0gICAgcmV0dXJuIGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5pbnNlcnQoX19wb3MuX01faXRlcmF0b3IsIF9feCkpOwotICB9Ci0KLSNpZiBkZWZpbmVkKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCi0gIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBfX3BvcykKLSAgeyByZXR1cm4gaW5zZXJ0KF9fcG9zLCBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKF9UcCkpOyB9Ci0jZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKi8KLQotI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCi0gIC8vIENoZWNrIHdoZXRoZXIgaXQncyBhbiBpbnRlZ3JhbCB0eXBlLiAgSWYgc28sIGl0J3Mgbm90IGFuIGl0ZXJhdG9yLgotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Ci0gIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLAotICAgICAgICAgICAgICBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpIHsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIF9BcmVTYW1lVW5DVlR5cGVzPF9JbnB1dEl0ZXJhdG9yLCBpdGVyYXRvcj46Ol9SZXQgX0lzTm9uQ29uc3RJdGVyYXRvcjsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIF9BcmVTYW1lVW5DVlR5cGVzPF9JbnB1dEl0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj46Ol9SZXQgX0lzQ29uc3RJdGVyYXRvcjsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIF9Mb3IyPF9Jc05vbkNvbnN0SXRlcmF0b3IsIF9Jc0NvbnN0SXRlcmF0b3I+OjpfUmV0IF9Eb0NoZWNrOwotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LCBfX3BvcykpCi0gICAgLy9TZXF1ZW5jZSByZXF1aXJlbWVudHMgMjMuMS4xIFRhYmxlIDY3OgotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9ub3Rfb3duZXIoJl9NX2l0ZXJfbGlzdCwgX19maXJzdCwgX0RvQ2hlY2soKSkpOwotICAgIHNpemVfdHlwZSBfX29sZF9jYXBhY2l0eSA9IGNhcGFjaXR5KCk7Ci0gICAgX01fbm9uX2RiZ19pbXBsLmluc2VydChfX3Bvcy5fTV9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2ZpcnN0KSwgX1NUTFBfUFJJViBfTm9uX0RiZ19pdGVyKF9fbGFzdCkpOwotICAgIF9Db21wYXJlX0NhcGFjaXR5KF9fb2xkX2NhcGFjaXR5KTsKLSAgfQotI2Vsc2UKLSAgdm9pZCBpbnNlcnQgKGl0ZXJhdG9yIF9fcG9zLAotICAgICAgICAgICAgICAgY29uc3QgdmFsdWVfdHlwZSAqX19maXJzdCwgY29uc3QgdmFsdWVfdHlwZSAqX19sYXN0KSB7Ci0gICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3B0cl9yYW5nZShfX2ZpcnN0LF9fbGFzdCkpCi0gICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX2lmX293bmVyKCZfTV9pdGVyX2xpc3QsIF9fcG9zKSkKLSAgICBzaXplX3R5cGUgX19vbGRfY2FwYWNpdHkgPSBjYXBhY2l0eSgpOwotICAgIF9NX25vbl9kYmdfaW1wbC5pbnNlcnQoX19wb3MuX01faXRlcmF0b3IsIF9fZmlyc3QsIF9fbGFzdCk7Ci0gICAgX0NvbXBhcmVfQ2FwYWNpdHkoX19vbGRfY2FwYWNpdHkpOwotICB9Ci0KLSAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3MsCi0gICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkgewotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LF9fbGFzdCkpCi0gICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX2lmX293bmVyKCZfTV9pdGVyX2xpc3QsIF9fcG9zKSkKLSAgICAvL1NlcXVlbmNlIHJlcXVpcmVtZW50cyAyMy4xLjEgVGFibGUgNjc6Ci0gICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX2lmX25vdF9vd25lcigmX01faXRlcl9saXN0LCBfX2ZpcnN0LCBfX3RydWVfdHlwZSgpKSk7Ci0gICAgc2l6ZV90eXBlIF9fb2xkX2NhcGFjaXR5ID0gY2FwYWNpdHkoKTsKLSAgICBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0KF9fcG9zLl9NX2l0ZXJhdG9yLCBfX2ZpcnN0Ll9NX2l0ZXJhdG9yLCBfX2xhc3QuX01faXRlcmF0b3IpOwotICAgIF9Db21wYXJlX0NhcGFjaXR5KF9fb2xkX2NhcGFjaXR5KTsKLX0KLSNlbmRpZgotCi0gIHZvaWQgaW5zZXJ0IChpdGVyYXRvciBfX3Bvcywgc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3gpewotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LCBfX3BvcykpCi0gICAgX0NoZWNrX092ZXJmbG93KF9fbik7Ci0gICAgX01fbm9uX2RiZ19pbXBsLmluc2VydChfX3Bvcy5fTV9pdGVyYXRvciwgX19uLCBfX3gpOwotICB9Ci0KLSAgdm9pZCBwb3BfYmFjaygpIHsKLSAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghZW1wdHkoKSwgX1N0bE1zZ19FTVBUWV9DT05UQUlORVIpCi0gICAgX0ludmFsaWRhdGVfaXRlcmF0b3IoZW5kKCkpOwotICAgIF9NX25vbl9kYmdfaW1wbC5wb3BfYmFjaygpOwotICB9Ci0gIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIF9fcG9zKSB7Ci0gICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfRGVyZWZlcmVuY2VhYmxlKF9fcG9zKSkKLSAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfb3duZXIoJl9NX2l0ZXJfbGlzdCwgX19wb3MpKQotICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9ycyhfX3BvcywgZW5kKCkpOwotICAgIHJldHVybiBpdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuZXJhc2UoX19wb3MuX01faXRlcmF0b3IpKTsKLSAgfQotICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpIHsKLSAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0LCBiZWdpbigpLCBlbmQoKSkpCi0gICAgX0ludmFsaWRhdGVfaXRlcmF0b3JzKF9fZmlyc3QsIGVuZCgpKTsKLSAgICByZXR1cm4gaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLmVyYXNlKF9fZmlyc3QuX01faXRlcmF0b3IsIF9fbGFzdC5fTV9pdGVyYXRvcikpOwotICB9Ci0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKLSAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9fbmV3X3NpemUsIGNvbnN0IF9UcCYgX194ID0gX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRChfVHApKSB7Ci0jZWxzZQotICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgX19uZXdfc2l6ZSwgY29uc3QgX1RwJiBfX3gpIHsKLSNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0qLwotICAgIGlmIChfX25ld19zaXplID4gY2FwYWNpdHkoKSkgewotICAgICAgX0ludmFsaWRhdGVfYWxsKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKF9fbmV3X3NpemUgPCBzaXplKCkpIHsKLSAgICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9ycyhiZWdpbigpICsgX19uZXdfc2l6ZSwgZW5kKCkpOwotICAgIH0KLSAgICBfTV9ub25fZGJnX2ltcGwucmVzaXplKF9fbmV3X3NpemUsIF9feCk7Ci0gIH0KLQotI2lmIGRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCi0gIHZvaWQgcmVzaXplKHNpemVfdHlwZSBfX25ld19zaXplKSB7IHJlc2l6ZShfX25ld19zaXplLCBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKF9UcCkpOyB9Ci0jZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKi8KLQotI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCi1wcml2YXRlOgotICB0ZW1wbGF0ZSA8Y2xhc3MgX0ludGVnZXI+Ci0gIHZvaWQgX01fYXNzaWduX2Rpc3BhdGNoKF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX192YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKl9Jc0ludGVncmFsKi8pIHsKLSAgICBfTV9jaGVja19hc3NpZ24oX19uKTsKLSAgICBfTV9ub25fZGJnX2ltcGwuYXNzaWduKF9fbiwgX192YWwpOwotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXI+Ci0gIHZvaWQgX01fYXNzaWduX2Rpc3BhdGNoKF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypfSXNJbnRlZ3JhbCovKSB7Ci0gICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsX19sYXN0KSkKLSAgICBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IHNpemUoKTsKLSAgICBzaXplX3R5cGUgX19vbGRfY2FwYWNpdHkgPSBjYXBhY2l0eSgpOwotICAgIGl0ZXJhdG9yIF9fb2xkX2VuZCA9IGVuZCgpOwotICAgIF9NX25vbl9kYmdfaW1wbC5hc3NpZ24oX1NUTFBfUFJJViBfTm9uX0RiZ19pdGVyKF9fZmlyc3QpLCBfU1RMUF9QUklWIF9Ob25fRGJnX2l0ZXIoX19sYXN0KSk7Ci0gICAgaWYgKF9fb2xkX2NhcGFjaXR5ICE9IDApIHsKLSAgICAgIGlmIChlbXB0eSgpIHx8IChjYXBhY2l0eSgpID4gX19vbGRfY2FwYWNpdHkpKSB7Ci0gICAgICAgIF9JbnZhbGlkYXRlX2FsbCgpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoc2l6ZSgpIDwgX19vbGRfc2l6ZSkgewotICAgICAgICBfSW52YWxpZGF0ZV9pdGVyYXRvcnMoYmVnaW4oKSArIHNpemUoKSwgX19vbGRfZW5kKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotcHVibGljOgotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Ci0gIHZvaWQgYXNzaWduKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkgewotICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lzSW50ZWdyYWw8X0lucHV0SXRlcmF0b3I+OjpfUmV0IF9JbnRlZ3JhbDsKLSAgICBfTV9hc3NpZ25fZGlzcGF0Y2goX19maXJzdCwgX19sYXN0LCBfSW50ZWdyYWwoKSk7Ci0gIH0KLSNlbHNlCi1wcml2YXRlOgotICB2b2lkIF9NX2Fzc2lnbihjb25zdCB2YWx1ZV90eXBlICpfX2ZpcnN0LCBjb25zdCB2YWx1ZV90eXBlICpfX2xhc3QpIHsKLSAgICBzaXplX3R5cGUgX19sZW4gPSBkaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QpOwotICAgIF9NX2NoZWNrX2Fzc2lnbihfX2xlbik7Ci0gICAgX01fbm9uX2RiZ19pbXBsLmFzc2lnbihfX2ZpcnN0LCBfX2xhc3QpOwotICB9Ci1wdWJsaWM6Ci0gIHZvaWQgYXNzaWduKGNvbnN0IHZhbHVlX3R5cGUgKl9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUgKl9fbGFzdCkgewotICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19wdHJfcmFuZ2UoX19maXJzdCxfX2xhc3QpKQotICAgIF9NX2Fzc2lnbihfX2ZpcnN0LCBfX2xhc3QpOwotICB9Ci0KLSAgdm9pZCBhc3NpZ24oY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KSB7Ci0gICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsX19sYXN0KSkKLSAgICBfTV9hc3NpZ24oX19maXJzdC5fTV9pdGVyYXRvciwgX19sYXN0Ll9NX2l0ZXJhdG9yKTsKLSAgfQotI2VuZGlmCi0KLXByaXZhdGU6Ci0gIHZvaWQgX01fY2hlY2tfYXNzaWduKHNpemVfdHlwZSBfX24pIHsKLSAgICBpZiAoX19uID4gY2FwYWNpdHkoKSkgewotICAgICAgX0ludmFsaWRhdGVfYWxsKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKF9fbiA8IHNpemUoKSkgewotICAgICAgX0ludmFsaWRhdGVfaXRlcmF0b3JzKGJlZ2luKCkgKyBfX24sIGVuZCgpKTsKLSAgICB9Ci0gIH0KLQotcHVibGljOgotICB2b2lkIGFzc2lnbihzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9fdmFsKSB7Ci0gICAgX01fY2hlY2tfYXNzaWduKF9fbik7Ci0gICAgX01fbm9uX2RiZ19pbXBsLmFzc2lnbihfX24sIF9fdmFsKTsKLSAgfQotCi0gIHZvaWQgY2xlYXIoKSB7Ci0gICAgX0ludmFsaWRhdGVfYWxsKCk7Ci0gICAgX01fbm9uX2RiZ19pbXBsLmNsZWFyKCk7Ci0gIH0KLSAgdm9pZCBwdXNoX2JhY2soY29uc3QgX1RwJiBfX3gpIHsKLSAgICBfQ2hlY2tfT3ZlcmZsb3coMSk7Ci0gICAgX01fbm9uX2RiZ19pbXBsLnB1c2hfYmFjayhfX3gpOwotICB9Ci19OwotCi1fU1RMUF9FTkRfTkFNRVNQQUNFCi0KLSN1bmRlZiBfU1RMUF9OT05fREJHX1ZFQ1RPUgotCi0jZW5kaWYgLyogX1NUTFBfREJHX1ZFQ1RPUl9IICovCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvbXNsX3N0cmluZy5oIGIvc3RsL21zbF9zdHJpbmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTYyNzY4Yy4uMDAwMDAwMAotLS0gYS9zdGwvbXNsX3N0cmluZy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5OAotICogTWFyayBvZiB0aGUgVW5pY29ybiwgSW5jLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQotICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKLSAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCi0gKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgotICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgTWFyayBvZiB0aGUgVW5pY29ybiwgSW5jLiBtYWtlcyBubwotICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotICoKLSAqLwotI2lmIGRlZmluZWQoIF9TVExQX1VTRV9NU0lQTCApICYmICFkZWZpbmVkKCBfU1RMUF9NU0xfU1RSSU5HX0hfICkKLSNkZWZpbmUgX1NUTFBfTVNMX1NUUklOR19IXwotCi0vLyMgZGVmaW5lIGNoYXJfdHJhaXRzIF9fbXNsX2NoYXJfdHJhaXRzCi0jIGRlZmluZSBiYXNpY19zdHJpbmcgX19tc2xfYmFzaWNfc3RyaW5nCi0jIGRlZmluZSBiX3N0cl9yZWYgX19tc2xfYl9zdHJfcmVmCi0jIGRlZmluZSBiYXNpY19pc3RyZWFtIF9fbXNsX2Jhc2ljX2lzdHJlYW0KLSMgZGVmaW5lIGJhc2ljX29zdHJlYW0gX19tc2xfYmFzaWNfb3N0cmVhbQotIyBkZWZpbmUgc3RyaW5nIF9fbXNsX3N0cmluZwotIyBkZWZpbmUgd3N0cmluZyBfX21zbF93c3RyaW5nCi0jIGRlZmluZSBpdGVyYXRvcl90cmFpdHMgX19tc2xfaXRlcmF0b3JfdHJhaXRzCi0KLW5hbWVzcGFjZSBzdGQKLXsKLSAgdGVtcGxhdGU8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cz4gY2xhc3MgYmFzaWNfaXN0cmVhbTsKLSAgdGVtcGxhdGU8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cz4gY2xhc3MgYmFzaWNfb3N0cmVhbTsKLX0KLQotIyBpbmNsdWRlIF9TVExQX05BVElWRV9IRUFERVIoc3RyaW5nKQotLy8gIyB1bmRlZiBjaGFyX3RyYWl0cwotIyB1bmRlZiBiYXNpY19zdHJpbmcKLSMgdW5kZWYgYl9zdHJfcmVmCi0jIHVuZGVmIGJhc2ljX2lzdHJlYW0KLSMgdW5kZWYgYmFzaWNfb3N0cmVhbQotIyB1bmRlZiBzdHJpbmcKLSMgdW5kZWYgd3N0cmluZwotIyB1bmRlZiBpdGVyYXRvcl90cmFpdHMKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zdGwvcG9pbnRlcnMvX2RlcXVlLmggYi9zdGwvcG9pbnRlcnMvX2RlcXVlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyYzI3NzQuLjAwMDAwMDAKLS0tIGEvc3RsL3BvaW50ZXJzL19kZXF1ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzc5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQKLSAqIEZyYW5jb2lzIER1bW9udAotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0vKiBOT1RFOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBTVEwgaGVhZGVycy4KLSAqICAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuCi0gKi8KLQotI2lmbmRlZiBfU1RMUF9TUEVDSUFMSVpFRF9ERVFVRV9ICi0jZGVmaW5lIF9TVExQX1NQRUNJQUxJWkVEX0RFUVVFX0gKLQotI2lmbmRlZiBfU1RMUF9QT0lOVEVSU19TUEVDX1RPT0xTX0gKLSMgIGluY2x1ZGUgPHN0bC9wb2ludGVycy9fdG9vbHMuaD4KLSNlbmRpZgotCi1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLV9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKLQotLyoKLSAqIHN0cnVjdCBoZWxwZXIgdG8gY2FzdCBkZXF1ZSBpdGVyYXRvcnM6Ci0gKi8KLXRlbXBsYXRlIDxjbGFzcyBfU3RvcmFnZVQsIGNsYXNzIF9WYWx1ZVQ+Ci1zdHJ1Y3QgX0RlcXVlSXRlQ2FzdCB7Ci0gIHR5cGVkZWYgX0RlcXVlX2l0ZXJhdG9yPF9WYWx1ZVQsIF9Ob25jb25zdF90cmFpdHM8X1ZhbHVlVD4gPiBpdGVyYXRvcjsKLSAgdHlwZWRlZiBfRGVxdWVfaXRlcmF0b3I8X1ZhbHVlVCwgX0NvbnN0X3RyYWl0czxfVmFsdWVUPiA+ICAgIGNvbnN0X2l0ZXJhdG9yOwotICB0eXBlZGVmIF9EZXF1ZV9pdGVyYXRvcjxfU3RvcmFnZVQsIF9Ob25jb25zdF90cmFpdHM8X1N0b3JhZ2VUPiA+IHN0b3JhZ2VfaXRlcmF0b3I7Ci0gIHR5cGVkZWYgX0RlcXVlX2l0ZXJhdG9yPF9TdG9yYWdlVCwgX0NvbnN0X3RyYWl0czxfU3RvcmFnZVQ+ID4gY29uc3Rfc3RvcmFnZV9pdGVyYXRvcjsKLSAgdHlwZWRlZiBfQ2FzdFRyYWl0czxfU3RvcmFnZVQsIF9WYWx1ZVQ+IGNhc3RfdHJhaXRzOwotCi0gIHN0YXRpYyBpdGVyYXRvciB0b192YWx1ZV90eXBlX2l0ZSAoc3RvcmFnZV9pdGVyYXRvciBjb25zdCYgX19pdGUpIHsKLSAgICBpdGVyYXRvciB0bXA7Ci0gICAgdG1wLl9NX2N1ciA9IGNhc3RfdHJhaXRzOjp0b192YWx1ZV90eXBlX3B0cihfX2l0ZS5fTV9jdXIpOwotICAgIHRtcC5fTV9maXJzdCA9IGNhc3RfdHJhaXRzOjp0b192YWx1ZV90eXBlX3B0cihfX2l0ZS5fTV9maXJzdCk7Ci0gICAgdG1wLl9NX2xhc3QgPSBjYXN0X3RyYWl0czo6dG9fdmFsdWVfdHlwZV9wdHIoX19pdGUuX01fbGFzdCk7Ci0gICAgdG1wLl9NX25vZGUgPSBjYXN0X3RyYWl0czo6dG9fdmFsdWVfdHlwZV9wcHRyKF9faXRlLl9NX25vZGUpOwotICAgIHJldHVybiB0bXA7Ci0gIH0KLSAgc3RhdGljIHN0b3JhZ2VfaXRlcmF0b3IgdG9fc3RvcmFnZV90eXBlX2l0ZSAoaXRlcmF0b3IgY29uc3QmIF9faXRlKSB7Ci0gICAgc3RvcmFnZV9pdGVyYXRvciB0bXA7Ci0gICAgdG1wLl9NX2N1ciA9IGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfcHRyKF9faXRlLl9NX2N1cik7Ci0gICAgdG1wLl9NX2ZpcnN0ID0gY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9wdHIoX19pdGUuX01fZmlyc3QpOwotICAgIHRtcC5fTV9sYXN0ID0gY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9wdHIoX19pdGUuX01fbGFzdCk7Ci0gICAgdG1wLl9NX25vZGUgPSBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX3BwdHIoX19pdGUuX01fbm9kZSk7Ci0gICAgcmV0dXJuIHRtcDsKLSAgfQotCi0gIHN0YXRpYyBjb25zdF9pdGVyYXRvciB0b192YWx1ZV90eXBlX2NpdGUgKGNvbnN0X3N0b3JhZ2VfaXRlcmF0b3IgY29uc3QmIF9faXRlKSB7Ci0gICAgY29uc3RfaXRlcmF0b3IgdG1wOwotICAgIHRtcC5fTV9jdXIgPSBjYXN0X3RyYWl0czo6dG9fdmFsdWVfdHlwZV9wdHIoX19pdGUuX01fY3VyKTsKLSAgICB0bXAuX01fZmlyc3QgPSBjYXN0X3RyYWl0czo6dG9fdmFsdWVfdHlwZV9wdHIoX19pdGUuX01fZmlyc3QpOwotICAgIHRtcC5fTV9sYXN0ID0gY2FzdF90cmFpdHM6OnRvX3ZhbHVlX3R5cGVfcHRyKF9faXRlLl9NX2xhc3QpOwotICAgIHRtcC5fTV9ub2RlID0gY2FzdF90cmFpdHM6OnRvX3ZhbHVlX3R5cGVfcHB0cihfX2l0ZS5fTV9ub2RlKTsKLSAgICByZXR1cm4gdG1wOwotICB9Ci0KLSAgc3RhdGljIGNvbnN0X3N0b3JhZ2VfaXRlcmF0b3IgdG9fc3RvcmFnZV90eXBlX2NpdGUgKGNvbnN0X2l0ZXJhdG9yIGNvbnN0JiBfX2l0ZSkgewotICAgIGNvbnN0X3N0b3JhZ2VfaXRlcmF0b3IgdG1wOwotICAgIHRtcC5fTV9jdXIgPSBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX3B0cihfX2l0ZS5fTV9jdXIpOwotICAgIHRtcC5fTV9maXJzdCA9IGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfcHRyKF9faXRlLl9NX2ZpcnN0KTsKLSAgICB0bXAuX01fbGFzdCA9IGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfcHRyKF9faXRlLl9NX2xhc3QpOwotICAgIHRtcC5fTV9ub2RlID0gY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9wcHRyKF9faXRlLl9NX25vZGUpOwotICAgIHJldHVybiB0bXA7Ci0gIH0KLX07Ci0KLSNkZWZpbmUgREVRVUVfSU1QTCBfU1RMUF9QVFJfSU1QTF9OQU1FKGRlcXVlKQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCkgJiYgIWRlZmluZWQgKF9TVExQX1VTRV9NU1ZDNl9NRU1fVF9CVUdfV09SS0FST1VORCkKLV9TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBfU1RMUF9hbGxvY19wcm94eTxzaXplX3QsIHZvaWQqLCAgYWxsb2NhdG9yPHZvaWQqPiA+OwotX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIF9TVExQX2FsbG9jX3Byb3h5PHZvaWQqKiosIHZvaWQqKiwgIGFsbG9jYXRvcjx2b2lkKio+ID47Ci1fU1RMUF9FWFBPUlQgdGVtcGxhdGUgc3RydWN0IF9TVExQX0NMQVNTX0RFQ0xTUEVDIF9EZXF1ZV9pdGVyYXRvcjx2b2lkKiwgX05vbmNvbnN0X3RyYWl0czx2b2lkKj4gPjsKLV9TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBfRGVxdWVfYmFzZTx2b2lkKixhbGxvY2F0b3I8dm9pZCo+ID47Ci1fU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgREVRVUVfSU1QTDx2b2lkKixhbGxvY2F0b3I8dm9pZCo+ID47Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHKQotIyAgZGVmaW5lIGRlcXVlIF9TVExQX05PTl9EQkdfTkFNRShkZXF1ZSkKLSNlbHNlCi1fU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKLSNlbmRpZgotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBfU1RMUF9ERUZBVUxUX0FMTE9DQVRPUl9TRUxFQ1QoX1RwKSA+Ci1jbGFzcyBkZXF1ZQotI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QQVJUSUFMX1NQRUNfV09SS0FST1VORCkgJiYgIWRlZmluZWQgKGRlcXVlKQotICAgICAgICAgICAgOiBwdWJsaWMgX19zdGxwb3J0X2NsYXNzPGRlcXVlPF9UcCwgX0FsbG9jPiA+Ci0jZW5kaWYKLXsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfU1RMUF9QUklWIF9TdG9yYWdlVHlwZTxfVHA+OjpfVHlwZSBfU3RvcmFnZVR5cGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jX3RyYWl0czxfU3RvcmFnZVR5cGUsIF9BbGxvYz46OmFsbG9jYXRvcl90eXBlIF9TdG9yYWdlVHlwZUFsbG9jOwotICB0eXBlZGVmIF9TVExQX1BSSVYgREVRVUVfSU1QTDxfU3RvcmFnZVR5cGUsIF9TdG9yYWdlVHlwZUFsbG9jPiBfQmFzZTsKLSAgdHlwZWRlZiBkZXF1ZTxfVHAsIF9BbGxvYz4gX1NlbGY7Ci0KLSAgdHlwZWRlZiBfU1RMUF9QUklWIF9DYXN0VHJhaXRzPF9TdG9yYWdlVHlwZSwgX1RwPiBjYXN0X3RyYWl0czsKLSAgdHlwZWRlZiBfU1RMUF9QUklWIF9EZXF1ZUl0ZUNhc3Q8X1N0b3JhZ2VUeXBlLCBfVHA+IGl0ZV9jYXN0X3RyYWl0czsKLQotcHVibGljOgotICB0eXBlZGVmIF9UcCB2YWx1ZV90eXBlOwotICB0eXBlZGVmIHZhbHVlX3R5cGUqIHBvaW50ZXI7Ci0gIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSogY29uc3RfcG9pbnRlcjsKLSAgdHlwZWRlZiB2YWx1ZV90eXBlJiByZWZlcmVuY2U7Ci0gIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSYgY29uc3RfcmVmZXJlbmNlOwotICB0eXBlZGVmIHNpemVfdCBzaXplX3R5cGU7Ci0gIHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKLSAgdHlwZWRlZiByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyBfSXRlcmF0b3JfY2F0ZWdvcnk7Ci0gIF9TVExQX0ZPUkNFX0FMTE9DQVRPUlModmFsdWVfdHlwZSwgX0FsbG9jKQotICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY190cmFpdHM8dmFsdWVfdHlwZSwgX0FsbG9jPjo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7Ci0gIHR5cGVkZWYgX1NUTFBfUFJJViBfRGVxdWVfaXRlcmF0b3I8dmFsdWVfdHlwZSwgX05vbmNvbnN0X3RyYWl0czx2YWx1ZV90eXBlPiA+IGl0ZXJhdG9yOwotICB0eXBlZGVmIF9TVExQX1BSSVYgX0RlcXVlX2l0ZXJhdG9yPHZhbHVlX3R5cGUsIF9Db25zdF90cmFpdHM8dmFsdWVfdHlwZT4gPiAgICBjb25zdF9pdGVyYXRvcjsKLQotICBfU1RMUF9ERUNMQVJFX1JBTkRPTV9BQ0NFU1NfUkVWRVJTRV9JVEVSQVRPUlM7Ci0KLXB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gQmFzaWMgYWNjZXNzb3JzCi0gIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gaXRlX2Nhc3RfdHJhaXRzOjp0b192YWx1ZV90eXBlX2l0ZShfTV9pbXBsLmJlZ2luKCkpOyB9Ci0gIGl0ZXJhdG9yIGVuZCgpICAgeyByZXR1cm4gaXRlX2Nhc3RfdHJhaXRzOjp0b192YWx1ZV90eXBlX2l0ZShfTV9pbXBsLmVuZCgpKTsgfQotICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGl0ZV9jYXN0X3RyYWl0czo6dG9fdmFsdWVfdHlwZV9jaXRlKF9NX2ltcGwuYmVnaW4oKSk7IH0KLSAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgICB7IHJldHVybiBpdGVfY2FzdF90cmFpdHM6OnRvX3ZhbHVlX3R5cGVfY2l0ZShfTV9pbXBsLmVuZCgpKTsgfQotCi0gIHJldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KLSAgcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9Ci0gIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3QKLSAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KLSAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgY29uc3QKLSAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQotCi0gIHJlZmVyZW5jZSBvcGVyYXRvcltdKHNpemVfdHlwZSBfX24pCi0gIHsgcmV0dXJuIGNhc3RfdHJhaXRzOjp0b192YWx1ZV90eXBlX3JlZihfTV9pbXBsW19fbl0pOyB9Ci0gIGNvbnN0X3JlZmVyZW5jZSBvcGVyYXRvcltdKHNpemVfdHlwZSBfX24pIGNvbnN0Ci0gIHsgcmV0dXJuIGNhc3RfdHJhaXRzOjp0b192YWx1ZV90eXBlX2NyZWYoX01faW1wbFtfX25dKTsgfQotCi0gIHJlZmVyZW5jZSBhdChzaXplX3R5cGUgX19uKQotICB7IHJldHVybiBjYXN0X3RyYWl0czo6dG9fdmFsdWVfdHlwZV9yZWYoX01faW1wbC5hdChfX24pKTsgfQotICBjb25zdF9yZWZlcmVuY2UgYXQoc2l6ZV90eXBlIF9fbikgY29uc3QKLSAgeyByZXR1cm4gY2FzdF90cmFpdHM6OnRvX3ZhbHVlX3R5cGVfY3JlZihfTV9pbXBsLmF0KF9fbikpOyB9Ci0KLSAgcmVmZXJlbmNlIGZyb250KCkgeyByZXR1cm4gY2FzdF90cmFpdHM6OnRvX3ZhbHVlX3R5cGVfcmVmKF9NX2ltcGwuZnJvbnQoKSk7IH0KLSAgcmVmZXJlbmNlIGJhY2soKSAgeyByZXR1cm4gY2FzdF90cmFpdHM6OnRvX3ZhbHVlX3R5cGVfcmVmKF9NX2ltcGwuYmFjaygpKTsgfQotICBjb25zdF9yZWZlcmVuY2UgZnJvbnQoKSBjb25zdCB7IHJldHVybiBjYXN0X3RyYWl0czo6dG9fdmFsdWVfdHlwZV9jcmVmKF9NX2ltcGwuZnJvbnQoKSk7IH0KLSAgY29uc3RfcmVmZXJlbmNlIGJhY2soKSBjb25zdCAgeyByZXR1cm4gY2FzdF90cmFpdHM6OnRvX3ZhbHVlX3R5cGVfY3JlZihfTV9pbXBsLmJhY2soKSk7IH0KLQotICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0ICAgICB7IHJldHVybiBfTV9pbXBsLnNpemUoKTsgfQotICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCB7IHJldHVybiBfTV9pbXBsLm1heF9zaXplKCk7IH0KLSAgYm9vbCBlbXB0eSgpIGNvbnN0ICAgICAgICAgeyByZXR1cm4gX01faW1wbC5lbXB0eSgpOyB9Ci0gIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdCB7IHJldHVybiBfU1RMUF9DT05WRVJUX0FMTE9DQVRPUihfTV9pbXBsLmdldF9hbGxvY2F0b3IoKSwgdmFsdWVfdHlwZSk7IH0KLQotICBleHBsaWNpdCBkZXF1ZShjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKLSAgICA6IF9NX2ltcGwoX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoX19hLCBfU3RvcmFnZVR5cGUpKSB7fQotCi0gIGRlcXVlKGNvbnN0IF9TZWxmJiBfX3gpIDogX01faW1wbChfX3guX01faW1wbCkge30KLQotI2lmICFkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQotICBleHBsaWNpdCBkZXF1ZShzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ZhbCA9IF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQodmFsdWVfdHlwZSksCi0jZWxzZQotICBkZXF1ZShzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ZhbCwKLSNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0qLwotICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKLSAgICA6IF9NX2ltcGwoX19uLCBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWYoX192YWwpLCBfU1RMUF9DT05WRVJUX0FMTE9DQVRPUihfX2EsIF9TdG9yYWdlVHlwZSkpIHt9Ci0gIC8vIGludCxsb25nIHZhcmlhbnRzIG1heSBiZSBuZWVkZWQKLSNpZiBkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQotICBleHBsaWNpdCBkZXF1ZShzaXplX3R5cGUgX19uKSA6IF9NX2ltcGwoX19uKSB7fQotI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Ci0gIGRlcXVlKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKLSAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSBfU1RMUF9BTExPQ0FUT1JfVFlQRV9ERkwpCi0jaWYgIWRlZmluZWQgKF9TVExQX1VTRV9JVEVSQVRPUl9XUkFQUEVSKQotICA6IF9NX2ltcGwoX19maXJzdCwgX19sYXN0LAotICAgICAgICAgICAgX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoX19hLCBfU3RvcmFnZVR5cGUpKSB7Ci0jZWxzZQotICA6IF9NX2ltcGwoX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoX19hLCBfU3RvcmFnZVR5cGUpKSB7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfSVRFUkFUT1JfV1JBUFBFUikKLSAgICBpbnNlcnQoZW5kKCksIF9fZmlyc3QsIF9fbGFzdCk7Ci0jZW5kaWYKLSAgfQotCi0jICBpZiBkZWZpbmVkIChfU1RMUF9ORUVEU19FWFRSQV9URU1QTEFURV9DT05TVFJVQ1RPUlMpCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KLSAgZGVxdWUoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQotIyAgICBpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX0lURVJBVE9SX1dSQVBQRVIpCi0gICAgOiBfTV9pbXBsKF9fZmlyc3QsIF9fbGFzdCkge30KLSMgICAgZWxzZQotICB7IGluc2VydChlbmQoKSwgX19maXJzdCwgX19sYXN0KTsgfQotIyAgICBlbmRpZgotIyAgZW5kaWYKLQotI2Vsc2UKLSAgZGVxdWUoY29uc3RfcG9pbnRlciBfX2ZpcnN0LCBjb25zdF9wb2ludGVyIF9fbGFzdCwKLSAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkgKQotICAgIDogX01faW1wbChjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NwdHIoX19maXJzdCksCi0gICAgICAgICAgICAgIGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3B0cihfX2xhc3QpLAotICAgICAgICAgICAgICBfU1RMUF9DT05WRVJUX0FMTE9DQVRPUihfX2EsIF9TdG9yYWdlVHlwZSkpIHt9Ci0KLSAgZGVxdWUoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0LAotICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSApCi0gICAgOiBfTV9pbXBsKGl0ZV9jYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NpdGUoX19maXJzdCksCi0gICAgICAgICAgICAgIGl0ZV9jYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NpdGUoX19sYXN0KSwKLSAgICAgICAgICAgICAgX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoX19hLCBfU3RvcmFnZVR5cGUpKSB7fQotI2VuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KLQotICBkZXF1ZShfX21vdmVfc291cmNlPF9TZWxmPiBzcmMpCi0gICAgOiBfTV9pbXBsKF9fbW92ZV9zb3VyY2U8X0Jhc2U+KHNyYy5nZXQoKS5fTV9pbXBsKSkge30KLQotICBfU2VsZiYgb3BlcmF0b3I9IChjb25zdCBfU2VsZiYgX194KSB7IF9NX2ltcGwgPSBfX3guX01faW1wbDsgcmV0dXJuICp0aGlzOyB9Ci0KLSAgdm9pZCBzd2FwKF9TZWxmJiBfX3gpIHsgX01faW1wbC5zd2FwKF9feC5fTV9pbXBsKTsgfQotCi0gIHZvaWQgYXNzaWduKHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9fdmFsKSB7Ci0gICAgX01faW1wbC5hc3NpZ24oX19uLCBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWYoX192YWwpKTsKLSAgfQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKLSMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9JVEVSQVRPUl9XUkFQUEVSKQotcHJpdmF0ZToKLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2VyPgotICB2b2lkIF9NX2Fzc2lnbl9kaXNwYXRjaChfSW50ZWdlciBfX24sIF9JbnRlZ2VyIF9fdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX3RydWVfdHlwZSYpCi0gIHsgX01faW1wbC5hc3NpZ24oX19uLCBfX3ZhbCk7IH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Ci0gIHZvaWQgX01fYXNzaWduX2Rpc3BhdGNoKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19mYWxzZV90eXBlJikgewotICAgIF9NX2ltcGwuYXNzaWduKHR5cGVuYW1lIF9TVExQX1BSSVYgX0l0ZVdyYXBwZXI8X1N0b3JhZ2VUeXBlLCBfVHAsIF9JbnB1dEl0ZXJhdG9yPjo6X0l0ZShfX2ZpcnN0KSwKLSAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfU1RMUF9QUklWIF9JdGVXcmFwcGVyPF9TdG9yYWdlVHlwZSwgX1RwLCBfSW5wdXRJdGVyYXRvcj46Ol9JdGUoX19sYXN0KSk7Ci0gIH0KLQotcHVibGljOgotIyAgZW5kaWYKLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgotICB2b2lkIGFzc2lnbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpIHsKLSMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9JVEVSQVRPUl9XUkFQUEVSKQotICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lzSW50ZWdyYWw8X0lucHV0SXRlcmF0b3I+OjpfUmV0IF9JbnRlZ3JhbDsKLSAgICBfTV9hc3NpZ25fZGlzcGF0Y2goX19maXJzdCwgX19sYXN0LCBfSW50ZWdyYWwoKSk7Ci0jICBlbHNlCi0gICAgX01faW1wbC5hc3NpZ24oX19maXJzdCwgX19sYXN0KTsKLSMgIGVuZGlmCi0gIH0KLSNlbHNlCi0gIHZvaWQgYXNzaWduKGNvbnN0X3BvaW50ZXIgX19maXJzdCwgY29uc3RfcG9pbnRlciBfX2xhc3QpCi0gIHsgX01faW1wbC5hc3NpZ24oY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcHRyKF9fZmlyc3QpLAotICAgICAgICAgICAgICAgICAgIGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3B0cihfX2xhc3QpKTsgfQotICB2b2lkIGFzc2lnbihjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpCi0gIHsgX01faW1wbC5hc3NpZ24oaXRlX2Nhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY2l0ZShfX2ZpcnN0KSwKLSAgICAgICAgICAgICAgICAgICBpdGVfY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jaXRlKF9fbGFzdCkpOyB9Ci0jZW5kaWYgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLwotCi0jaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pICYmICFkZWZpbmVkIChfU1RMUF9OT19BTkFDSFJPTklTTVMpCi0gIHZvaWQgcHVzaF9iYWNrKGNvbnN0IHZhbHVlX3R5cGUmIF9fdCA9IF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQodmFsdWVfdHlwZSkpCi0jZWxzZQotICB2b2lkIHB1c2hfYmFjayhjb25zdCB2YWx1ZV90eXBlJiBfX3QpCi0jZW5kaWYgLyohX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSAmJiAhX1NUTFBfTk9fQU5BQ0hST05JU01TKi8KLSAgeyBfTV9pbXBsLnB1c2hfYmFjayhjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWYoX190KSk7IH0KLQotI2lmICFkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fQU5BQ0hST05JU01TKQotICB2b2lkIHB1c2hfZnJvbnQoY29uc3QgdmFsdWVfdHlwZSYgX190ID0gX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRCh2YWx1ZV90eXBlKSkKLSNlbHNlCi0gIHZvaWQgcHVzaF9mcm9udChjb25zdCB2YWx1ZV90eXBlJiBfX3QpCi0jZW5kaWYgLyohX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSAmJiAhX1NUTFBfTk9fQU5BQ0hST05JU01TKi8KLSAgeyBfTV9pbXBsLnB1c2hfZnJvbnQoY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcmVmKF9fdCkpOyB9Ci0KLSMgaWYgZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkgJiYgIWRlZmluZWQgKF9TVExQX05PX0FOQUNIUk9OSVNNUykKLSAgdm9pZCBwdXNoX2JhY2soKSAgeyBfTV9pbXBsLnB1c2hfYmFjaygpOyB9Ci0gIHZvaWQgcHVzaF9mcm9udCgpIHsgX01faW1wbC5wdXNoX2Zyb250KCk7IH0KLSMgZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNICYmICFfU1RMUF9OT19BTkFDSFJPTklTTVMqLwotCi0gIHZvaWQgcG9wX2JhY2soKSAgeyBfTV9pbXBsLnBvcF9iYWNrKCk7IH0KLSAgdm9pZCBwb3BfZnJvbnQoKSB7IF9NX2ltcGwucG9wX2Zyb250KCk7IH0KLQotI2lmICFkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fQU5BQ0hST05JU01TKQotICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCA9IF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQodmFsdWVfdHlwZSkpCi0jZWxzZQotICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKLSNlbmRpZiAvKiFfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNICYmICFfU1RMUF9OT19BTkFDSFJPTklTTVMqLwotICB7IHJldHVybiBpdGVfY2FzdF90cmFpdHM6OnRvX3ZhbHVlX3R5cGVfaXRlKF9NX2ltcGwuaW5zZXJ0KGl0ZV9jYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2l0ZShfX3BvcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcmVmKF9feCkpKTsgfQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkgJiYgIWRlZmluZWQgKF9TVExQX05PX0FOQUNIUk9OSVNNUykKLSAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zKSB7IHJldHVybiBpbnNlcnQoX19wb3MsIF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQodmFsdWVfdHlwZSkpOyB9Ci0jZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNICYmICFfU1RMUF9OT19BTkFDSFJPTklTTVMqLwotCi0gIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCi0gIHsgX01faW1wbC5pbnNlcnQoaXRlX2Nhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfaXRlKF9fcG9zKSwgX19uLCBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWYoX194KSk7IH0KLQotI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCi0jICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfSVRFUkFUT1JfV1JBUFBFUikKLXByaXZhdGU6Ci0gIHRlbXBsYXRlIDxjbGFzcyBfSW50ZWdlcj4KLSAgdm9pZCBfTV9pbnNlcnRfZGlzcGF0Y2goaXRlcmF0b3IgX19wb3MsIF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX192YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fdHJ1ZV90eXBlJikgewotICAgIF9NX2ltcGwuaW5zZXJ0KGl0ZV9jYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2l0ZShfX3BvcyksIF9fbiwgX192YWwpOwotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgotICB2b2lkIF9NX2luc2VydF9kaXNwYXRjaChpdGVyYXRvciBfX3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2ZhbHNlX3R5cGUmKSB7Ci0gICAgX01faW1wbC5pbnNlcnQoaXRlX2Nhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfaXRlKF9fcG9zKSwKLSAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfU1RMUF9QUklWIF9JdGVXcmFwcGVyPF9TdG9yYWdlVHlwZSwgX1RwLCBfSW5wdXRJdGVyYXRvcj46Ol9JdGUoX19maXJzdCksCi0gICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX1NUTFBfUFJJViBfSXRlV3JhcHBlcjxfU3RvcmFnZVR5cGUsIF9UcCwgX0lucHV0SXRlcmF0b3I+OjpfSXRlKF9fbGFzdCkpOwotICB9Ci0KLXB1YmxpYzoKLSMgIGVuZGlmCi0KLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgotICB2b2lkIGluc2VydChpdGVyYXRvciBfX3BvcywgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KSB7Ci0jICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfSVRFUkFUT1JfV1JBUFBFUikKLSAgICAvLyBDaGVjayB3aGV0aGVyIGl0J3MgYW4gaW50ZWdyYWwgdHlwZS4gIElmIHNvLCBpdCdzIG5vdCBhbiBpdGVyYXRvci4KLSAgICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0ludGVncmFsPF9JbnB1dEl0ZXJhdG9yPjo6X1JldCBfSW50ZWdyYWw7Ci0gICAgX01faW5zZXJ0X2Rpc3BhdGNoKF9fcG9zLCBfX2ZpcnN0LCBfX2xhc3QsIF9JbnRlZ3JhbCgpKTsKLSMgIGVsc2UKLSAgICBfTV9pbXBsLmluc2VydChpdGVfY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9pdGUoX19wb3MpLCBfX2ZpcnN0LCBfX2xhc3QpOwotIyAgZW5kaWYKLSAgfQotCi0jZWxzZSAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCi0gIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLAotICAgICAgICAgICAgICBjb25zdF9wb2ludGVyIF9fZmlyc3QsIGNvbnN0X3BvaW50ZXIgX19sYXN0KSB7Ci0gICAgX01faW1wbC5pbnNlcnQoaXRlX2Nhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfaXRlKF9fcG9zKSwKLSAgICAgICAgICAgICAgICAgICBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NwdHIoX19maXJzdCksCi0gICAgICAgICAgICAgICAgICAgY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcHRyKF9fbGFzdCkpOwotICB9Ci0gIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLAotICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpIHsKLSAgICBfTV9pbXBsLmluc2VydChpdGVfY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9pdGUoX19wb3MpLAotICAgICAgICAgICAgICAgICAgIGl0ZV9jYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NpdGUoX19maXJzdCksCi0gICAgICAgICAgICAgICAgICAgaXRlX2Nhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY2l0ZShfX2xhc3QpKTsKLSAgfQotCi0jZW5kaWYgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLwotCi0jaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCi0gIHZvaWQgcmVzaXplKHNpemVfdHlwZSBfX25ld19zaXplLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ggPSBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKHZhbHVlX3R5cGUpKQotI2Vsc2UKLSAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9fbmV3X3NpemUsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKLSNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0qLwotICB7IF9NX2ltcGwucmVzaXplKF9fbmV3X3NpemUsIGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3JlZihfX3gpKTsgfQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKLSAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9fbmV3X3NpemUpIHsgX01faW1wbC5yZXNpemUoX19uZXdfc2l6ZSk7IH0KLSNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0qLwotCi0gIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIF9fcG9zKQotICB7IHJldHVybiBpdGVfY2FzdF90cmFpdHM6OnRvX3ZhbHVlX3R5cGVfaXRlKF9NX2ltcGwuZXJhc2UoaXRlX2Nhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfaXRlKF9fcG9zKSkpOyB9Ci0KLSAgaXRlcmF0b3IgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KQotICB7IHJldHVybiBpdGVfY2FzdF90cmFpdHM6OnRvX3ZhbHVlX3R5cGVfaXRlKF9NX2ltcGwuZXJhc2UoaXRlX2Nhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfaXRlKF9fZmlyc3QpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlX2Nhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfaXRlKF9fbGFzdCkpKTsgfQotICB2b2lkIGNsZWFyKCkgeyBfTV9pbXBsLmNsZWFyKCk7IH0KLQotcHJpdmF0ZToKLSAgX0Jhc2UgX01faW1wbDsKLX07Ci0KLSNpZiBkZWZpbmVkIChkZXF1ZSkKLSMgIHVuZGVmIGRlcXVlCi1fU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKLSNlbmRpZgotCi0jdW5kZWYgREVRVUVfSU1QTAotCi1fU1RMUF9FTkRfTkFNRVNQQUNFCi0KLSNlbmRpZiAvKiBfU1RMUF9TUEVDSUFMSVpFRF9ERVFVRV9IICovCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvcG9pbnRlcnMvX2xpc3QuaCBiL3N0bC9wb2ludGVycy9fbGlzdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDFiMTFkLi4wMDAwMDAwCi0tLSBhL3N0bC9wb2ludGVycy9fbGlzdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMKLSAqIEZyYW5jb2lzIER1bW9udAotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0vKiBOT1RFOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBTVEwgaGVhZGVycy4KLSAqICAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuCi0gKi8KLQotI2lmbmRlZiBfU1RMUF9QVFJfU1BFQ0lBTElaRURfTElTVF9ICi0jZGVmaW5lIF9TVExQX1BUUl9TUEVDSUFMSVpFRF9MSVNUX0gKLQotI2lmbmRlZiBfU1RMUF9QT0lOVEVSU19TUEVDX1RPT0xTX0gKLSMgIGluY2x1ZGUgPHN0bC9wb2ludGVycy9fdG9vbHMuaD4KLSNlbmRpZgotCi1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLQotI2RlZmluZSBMSVNUX0lNUEwgX1NUTFBfUFRSX0lNUExfTkFNRShsaXN0KQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCkgJiYgIWRlZmluZWQgKF9TVExQX1VTRV9NU1ZDNl9NRU1fVF9CVUdfV09SS0FST1VORCkKLQotX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQotCi1fU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgX0xpc3Rfbm9kZTx2b2lkKj47Ci0KLV9TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQotCi1fU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgYWxsb2NhdG9yPF9TVExQX1BSSVYgX0xpc3Rfbm9kZTx2b2lkKj4gPjsKLQotX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQotCi1fU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgX1NUTFBfYWxsb2NfcHJveHk8X0xpc3Rfbm9kZV9iYXNlLCBfTGlzdF9ub2RlPHZvaWQqPiwgYWxsb2NhdG9yPF9MaXN0X25vZGU8dm9pZCo+ID4gPjsKLV9TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBfTGlzdF9iYXNlPHZvaWQqLCBhbGxvY2F0b3I8dm9pZCo+ID47Ci1fU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgTElTVF9JTVBMPHZvaWQqLCBhbGxvY2F0b3I8dm9pZCo+ID47Ci0KLV9TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9ERUJVRykKLSMgIGRlZmluZSBsaXN0IF9TVExQX05PTl9EQkdfTkFNRShsaXN0KQotX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQotI2VuZGlmCi0KLXRlbXBsYXRlIDxjbGFzcyBfVHAsIF9TVExQX0RFRkFVTFRfQUxMT0NBVE9SX1NFTEVDVChfVHApID4KLWNsYXNzIGxpc3QKLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUEFSVElBTF9TUEVDX1dPUktBUk9VTkQpICYmICFkZWZpbmVkIChsaXN0KQotICAgICAgICAgICA6IHB1YmxpYyBfX3N0bHBvcnRfY2xhc3M8bGlzdDxfVHAsIF9BbGxvYz4gPgotI2VuZGlmCi17Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1NUTFBfUFJJViBfU3RvcmFnZVR5cGU8X1RwPjo6X1R5cGUgX1N0b3JhZ2VUeXBlOwotICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY190cmFpdHM8X1N0b3JhZ2VUeXBlLCBfQWxsb2M+OjphbGxvY2F0b3JfdHlwZSBfU3RvcmFnZVR5cGVBbGxvYzsKLSAgdHlwZWRlZiBfU1RMUF9QUklWIExJU1RfSU1QTDxfU3RvcmFnZVR5cGUsIF9TdG9yYWdlVHlwZUFsbG9jPiBfQmFzZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IgX0Jhc2VJdGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X2l0ZXJhdG9yIF9CYXNlQ29uc3RJdGU7Ci0gIHR5cGVkZWYgX1NUTFBfUFJJViBfQ2FzdFRyYWl0czxfU3RvcmFnZVR5cGUsIF9UcD4gY2FzdF90cmFpdHM7Ci0gIHR5cGVkZWYgbGlzdDxfVHAsIF9BbGxvYz4gX1NlbGY7Ci0KLXB1YmxpYzoKLSAgdHlwZWRlZiBfVHAgdmFsdWVfdHlwZTsKLSAgdHlwZWRlZiB2YWx1ZV90eXBlKiBwb2ludGVyOwotICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUqIGNvbnN0X3BvaW50ZXI7Ci0gIHR5cGVkZWYgdmFsdWVfdHlwZSYgcmVmZXJlbmNlOwotICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmIGNvbnN0X3JlZmVyZW5jZTsKLSAgdHlwZWRlZiBzaXplX3Qgc2l6ZV90eXBlOwotICB0eXBlZGVmIHB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7Ci0gIF9TVExQX0ZPUkNFX0FMTE9DQVRPUlModmFsdWVfdHlwZSwgX0FsbG9jKQotICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY190cmFpdHM8dmFsdWVfdHlwZSwgX0FsbG9jPjo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7Ci0gIHR5cGVkZWYgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgX0l0ZXJhdG9yX2NhdGVnb3J5OwotCi0gIHR5cGVkZWYgX1NUTFBfUFJJViBfTGlzdF9pdGVyYXRvcjx2YWx1ZV90eXBlLCBfTm9uY29uc3RfdHJhaXRzPHZhbHVlX3R5cGU+ID4gaXRlcmF0b3I7Ci0gIHR5cGVkZWYgX1NUTFBfUFJJViBfTGlzdF9pdGVyYXRvcjx2YWx1ZV90eXBlLCBfQ29uc3RfdHJhaXRzPHZhbHVlX3R5cGU+ID4gICAgY29uc3RfaXRlcmF0b3I7Ci0KLSAgX1NUTFBfREVDTEFSRV9CSURJUkVDVElPTkFMX1JFVkVSU0VfSVRFUkFUT1JTOwotCi0gIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdAotICB7IHJldHVybiBfU1RMUF9DT05WRVJUX0FMTE9DQVRPUihfTV9pbXBsLmdldF9hbGxvY2F0b3IoKSwgdmFsdWVfdHlwZSk7IH0KLQotIyBpZiAhKGRlZmluZWQoX19NUkNfXyl8fChkZWZpbmVkKF9fU0NfXykgJiYgIWRlZmluZWQoX19ETUNfXykpKQotICBleHBsaWNpdAotIyBlbmRpZgotICBsaXN0KGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQotICAgIDogX01faW1wbChfU1RMUF9DT05WRVJUX0FMTE9DQVRPUihfX2EsIF9TdG9yYWdlVHlwZSkpIHt9Ci0KLSNpZiAhZGVmaW5lZChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQotICBleHBsaWNpdCBsaXN0KHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9fdmFsID0gX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRCh2YWx1ZV90eXBlKSwKLSNlbHNlCi0gIGxpc3Qoc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX192YWwsCi0jZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKi8KLSAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKLSAgICA6IF9NX2ltcGwoX19uLCBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWYoX192YWwpLAotICAgICAgICAgICAgICBfU1RMUF9DT05WRVJUX0FMTE9DQVRPUihfX2EsIF9TdG9yYWdlVHlwZSkpIHt9Ci0KLSNpZiBkZWZpbmVkKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCi0gIGV4cGxpY2l0IGxpc3Qoc2l6ZV90eXBlIF9fbikKLSAgICA6IF9NX2ltcGwoX19uKSB7fQotI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Ci0gIGxpc3QoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAotICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgX1NUTFBfQUxMT0NBVE9SX1RZUEVfREZMKQotIyAgaWYgIWRlZmluZWQgKF9TVExQX1VTRV9JVEVSQVRPUl9XUkFQUEVSKQotICAgIDogX01faW1wbChfX2ZpcnN0LCBfX2xhc3QsIF9TVExQX0NPTlZFUlRfQUxMT0NBVE9SKF9fYSwgX1N0b3JhZ2VUeXBlKSkge30KLSMgIGVsc2UKLSAgICA6IF9NX2ltcGwoX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoX19hLCBfU3RvcmFnZVR5cGUpKSB7Ci0gICAgaW5zZXJ0KGJlZ2luKCksIF9fZmlyc3QsIF9fbGFzdCk7Ci0gIH0KLSMgIGVuZGlmCi0KLSMgIGlmIGRlZmluZWQgKF9TVExQX05FRURTX0VYVFJBX1RFTVBMQVRFX0NPTlNUUlVDVE9SUykKLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgotICBsaXN0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKLSMgICAgaWYgIWRlZmluZWQgKF9TVExQX1VTRV9XUkFQUEVSX0lURVJBVE9SKQotICAgIDogX01faW1wbChfX2ZpcnN0LCBfX2xhc3QpIHt9Ci0jICAgIGVsc2UKLSAgeyBpbnNlcnQoYmVnaW4oKSwgX19maXJzdCwgX19sYXN0KTsgfQotIyAgICBlbmRpZgotIyAgZW5kaWYKLQotI2Vsc2UgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLwotCi0gIGxpc3QoY29uc3QgdmFsdWVfdHlwZSAqX19maXJzdCwgY29uc3QgdmFsdWVfdHlwZSAqX19sYXN0LAotICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQotICAgIDogX01faW1wbChjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NwdHIoX19maXJzdCksCi0gICAgICAgICAgICAgIGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3B0cihfX2xhc3QpLAotICAgICAgICAgICAgICAgX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoX19hLCBfU3RvcmFnZVR5cGUpKSB7fQotICBsaXN0KGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCwKLSAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKLSAgICA6IF9NX2ltcGwoX0Jhc2VDb25zdEl0ZShfX2ZpcnN0Ll9NX25vZGUpLCBfQmFzZUNvbnN0SXRlKF9fbGFzdC5fTV9ub2RlKSwKLSAgICAgICAgICAgICAgX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoX19hLCBfU3RvcmFnZVR5cGUpKSB7fQotCi0jZW5kaWYgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLwotCi0gIGxpc3QoY29uc3QgX1NlbGYmIF9feCkgOiBfTV9pbXBsKF9feC5fTV9pbXBsKSB7fQotCi0gIGxpc3QoX19tb3ZlX3NvdXJjZTxfU2VsZj4gc3JjKQotICAgIDogX01faW1wbChfX21vdmVfc291cmNlPF9CYXNlPihzcmMuZ2V0KCkuX01faW1wbCkpIHt9Ci0KLSAgaXRlcmF0b3IgYmVnaW4oKSAgICAgICAgICAgICB7IHJldHVybiBpdGVyYXRvcihfTV9pbXBsLmJlZ2luKCkuX01fbm9kZSk7IH0KLSAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfTV9pbXBsLmJlZ2luKCkuX01fbm9kZSk7IH0KLQotICBpdGVyYXRvciBlbmQoKSAgICAgICAgICAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9NX2ltcGwuZW5kKCkuX01fbm9kZSk7IH0KLSAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfTV9pbXBsLmVuZCgpLl9NX25vZGUpOyB9Ci0KLSAgcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSAgICAgICAgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQotICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9Ci0KLSAgcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgICAgICAgICAgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9Ci0gIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0ICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQotCi0gIGJvb2wgZW1wdHkoKSBjb25zdCAgICAgICAgIHsgcmV0dXJuIF9NX2ltcGwuZW1wdHkoKTsgfQotICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0ICAgICB7IHJldHVybiBfTV9pbXBsLnNpemUoKTsgfQotICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCB7IHJldHVybiBfTV9pbXBsLm1heF9zaXplKCk7IH0KLQotICByZWZlcmVuY2UgZnJvbnQoKSAgICAgICAgICAgICB7IHJldHVybiAqYmVnaW4oKTsgfQotICBjb25zdF9yZWZlcmVuY2UgZnJvbnQoKSBjb25zdCB7IHJldHVybiAqYmVnaW4oKTsgfQotICByZWZlcmVuY2UgYmFjaygpICAgICAgICAgICAgICB7IHJldHVybiAqKC0tZW5kKCkpOyB9Ci0gIGNvbnN0X3JlZmVyZW5jZSBiYWNrKCkgY29uc3QgIHsgcmV0dXJuICooLS1lbmQoKSk7IH0KLQotICB2b2lkIHN3YXAoX1NlbGYgJl9feCkgeyBfTV9pbXBsLnN3YXAoX194Ll9NX2ltcGwpOyB9Ci0gIHZvaWQgY2xlYXIoKSB7IF9NX2ltcGwuY2xlYXIoKTsgfQotCi0jaWYgIWRlZmluZWQoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkgJiYgIWRlZmluZWQoX1NUTFBfTk9fQU5BQ0hST05JU01TKQotICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIGNvbnN0X3JlZmVyZW5jZSBfX3ggPSBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKHZhbHVlX3R5cGUpKQotI2Vsc2UKLSAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBjb25zdF9yZWZlcmVuY2UgX194KQotI2VuZGlmIC8qIV9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0gJiYgIV9TVExQX05PX0FOQUNIUk9OSVNNUyovCi0gIHsgcmV0dXJuIGl0ZXJhdG9yKF9NX2ltcGwuaW5zZXJ0KF9CYXNlSXRlKF9fcG9zLl9NX25vZGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWYoX194KSkuX01fbm9kZSk7IH0KLQotI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCi0jICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfSVRFUkFUT1JfV1JBUFBFUikKLXByaXZhdGU6Ci0gIHRlbXBsYXRlIDxjbGFzcyBfSW50ZWdlcj4KLSAgdm9pZCBfTV9pbnNlcnRfZGlzcGF0Y2goaXRlcmF0b3IgX19wb3MsIF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX192YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fdHJ1ZV90eXBlJikKLSAgeyBfTV9pbXBsLmluc2VydChfQmFzZUl0ZShfX3Bvcy5fTV9ub2RlKSwgX19uLCBfX3ZhbCk7IH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Ci0gIHZvaWQgX01faW5zZXJ0X2Rpc3BhdGNoKGl0ZXJhdG9yIF9fcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fZmFsc2VfdHlwZSYpIHsKLSAgICBfTV9pbXBsLmluc2VydChfQmFzZUl0ZShfX3Bvcy5fTV9ub2RlKSwKLSAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfU1RMUF9QUklWIF9JdGVXcmFwcGVyPF9TdG9yYWdlVHlwZSwgX1RwLCBfSW5wdXRJdGVyYXRvcj46Ol9JdGUoX19maXJzdCksCi0gICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX1NUTFBfUFJJViBfSXRlV3JhcHBlcjxfU3RvcmFnZVR5cGUsIF9UcCwgX0lucHV0SXRlcmF0b3I+OjpfSXRlKF9fbGFzdCkpOwotICB9Ci0KLXB1YmxpYzoKLSMgIGVuZGlmCi0KLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgotICB2b2lkIGluc2VydChpdGVyYXRvciBfX3BvcywgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KSB7Ci0jICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfSVRFUkFUT1JfV1JBUFBFUikKLSAgICAvLyBDaGVjayB3aGV0aGVyIGl0J3MgYW4gaW50ZWdyYWwgdHlwZS4gIElmIHNvLCBpdCdzIG5vdCBhbiBpdGVyYXRvci4KLSAgICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0ludGVncmFsPF9JbnB1dEl0ZXJhdG9yPjo6X1JldCBfSW50ZWdyYWw7Ci0gICAgX01faW5zZXJ0X2Rpc3BhdGNoKF9fcG9zLCBfX2ZpcnN0LCBfX2xhc3QsIF9JbnRlZ3JhbCgpKTsKLSMgIGVsc2UKLSAgICBfTV9pbXBsLmluc2VydChfQmFzZUl0ZShfX3Bvcy5fTV9ub2RlKSwgX19maXJzdCwgX19sYXN0KTsKLSMgIGVuZGlmCi0gIH0KLSNlbHNlIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KLSAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIGNvbnN0IHZhbHVlX3R5cGUgKl9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUgKl9fbGFzdCkKLSAgeyBfTV9pbXBsLmluc2VydChfQmFzZUl0ZShfX3Bvcy5fTV9ub2RlKSwgY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcHRyKF9fZmlyc3QpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NwdHIoX19sYXN0KSk7IH0KLSAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKLSAgeyBfTV9pbXBsLmluc2VydChfQmFzZUl0ZShfX3Bvcy5fTV9ub2RlKSwgX0Jhc2VDb25zdEl0ZShfX2ZpcnN0Ll9NX25vZGUpLCBfQmFzZUNvbnN0SXRlKF9fbGFzdC5fTV9ub2RlKSk7IH0KLSNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCi0KLSAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKLSAgeyBfTV9pbXBsLmluc2VydChfQmFzZUl0ZShfX3Bvcy5fTV9ub2RlKSwgX19uLCBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWYoX194KSk7IH0KLQotICB2b2lkIHB1c2hfZnJvbnQoY29uc3QgdmFsdWVfdHlwZSYgX194KSB7IF9NX2ltcGwucHVzaF9mcm9udChjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWYoX194KSk7IH0KLSAgdm9pZCBwdXNoX2JhY2soY29uc3QgdmFsdWVfdHlwZSYgX194KSAgeyBfTV9pbXBsLnB1c2hfYmFjayhjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWYoX194KSk7IH0KLQotI2lmIGRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pICYmICFkZWZpbmVkIChfU1RMUF9OT19BTkFDSFJPTklTTVMpCi0gIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBfX3BvcykgeyByZXR1cm4gaXRlcmF0b3IoX01faW1wbC5pbnNlcnQoX19wb3MuX01fbm9kZSkuX01fbm9kZSk7IH0KLSAgdm9pZCBwdXNoX2Zyb250KCkgeyBfTV9pbXBsLnB1c2hfZnJvbnQoKTt9Ci0gIHZvaWQgcHVzaF9iYWNrKCkgIHsgX01faW1wbC5wdXNoX2JhY2soKTt9Ci0jIGVuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSAmJiAhX1NUTFBfTk9fQU5BQ0hST05JU01TKi8KLQotICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBfX3BvcykKLSAgeyByZXR1cm4gaXRlcmF0b3IoX01faW1wbC5lcmFzZShfQmFzZUl0ZShfX3Bvcy5fTV9ub2RlKSkuX01fbm9kZSk7IH0KLSAgaXRlcmF0b3IgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KQotICB7IHJldHVybiBpdGVyYXRvcihfTV9pbXBsLmVyYXNlKF9CYXNlSXRlKF9fZmlyc3QuX01fbm9kZSksIF9CYXNlSXRlKF9fbGFzdC5fTV9ub2RlKSkuX01fbm9kZSk7IH0KLQotI2lmICFkZWZpbmVkKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCi0gIHZvaWQgcmVzaXplKHNpemVfdHlwZSBfX25ld19zaXplLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ggPSBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKHZhbHVlX3R5cGUpKQotI2Vsc2UKLSAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9fbmV3X3NpemUpIHsgX01faW1wbC5yZXNpemUoX19uZXdfc2l6ZSk7IH0KLSAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9fbmV3X3NpemUsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKLSNlbmRpZiAvKiFfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKi8KLSAge19NX2ltcGwucmVzaXplKF9fbmV3X3NpemUsIGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3JlZihfX3gpKTt9Ci0KLSAgdm9pZCBwb3BfZnJvbnQoKSB7IF9NX2ltcGwucG9wX2Zyb250KCk7IH0KLSAgdm9pZCBwb3BfYmFjaygpICB7IF9NX2ltcGwucG9wX2JhY2soKTsgfQotCi0gIF9TZWxmJiBvcGVyYXRvcj0oY29uc3QgX1NlbGYmIF9feCkKLSAgeyBfTV9pbXBsID0gX194Ll9NX2ltcGw7IHJldHVybiAqdGhpczsgfQotICB2b2lkIGFzc2lnbihzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ZhbCkKLSAgeyBfTV9pbXBsLmFzc2lnbihfX24sIGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3JlZihfX3ZhbCkpOyB9Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQotIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX0lURVJBVE9SX1dSQVBQRVIpCi1wcml2YXRlOgotICB0ZW1wbGF0ZSA8Y2xhc3MgX0ludGVnZXI+Ci0gIHZvaWQgX01fYXNzaWduX2Rpc3BhdGNoKF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX192YWwsIGNvbnN0IF9fdHJ1ZV90eXBlJikKLSAgeyBfTV9pbXBsLmFzc2lnbihfX24sIF9fdmFsKTsgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KLSAgdm9pZCBfTV9hc3NpZ25fZGlzcGF0Y2goX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2ZhbHNlX3R5cGUmKSB7Ci0gICAgX01faW1wbC5hc3NpZ24odHlwZW5hbWUgX1NUTFBfUFJJViBfSXRlV3JhcHBlcjxfU3RvcmFnZVR5cGUsIF9UcCwgX0lucHV0SXRlcmF0b3I+OjpfSXRlKF9fZmlyc3QpLAotICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9TVExQX1BSSVYgX0l0ZVdyYXBwZXI8X1N0b3JhZ2VUeXBlLCBfVHAsIF9JbnB1dEl0ZXJhdG9yPjo6X0l0ZShfX2xhc3QpKTsKLSAgfQotCi1wdWJsaWM6Ci0jICBlbmRpZgotCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KLSAgdm9pZCBhc3NpZ24oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KSB7Ci0jICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfSVRFUkFUT1JfV1JBUFBFUikKLSAgICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0ludGVncmFsPF9JbnB1dEl0ZXJhdG9yPjo6X1JldCBfSW50ZWdyYWw7Ci0gICAgX01fYXNzaWduX2Rpc3BhdGNoKF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOwotIyAgZWxzZQotICAgIF9NX2ltcGwuYXNzaWduKF9fZmlyc3QsIF9fbGFzdCk7Ci0jICBlbmRpZgotICB9Ci0jZWxzZQotICB2b2lkIGFzc2lnbihjb25zdCB2YWx1ZV90eXBlICpfX2ZpcnN0LCBjb25zdCB2YWx1ZV90eXBlICpfX2xhc3QpIHsKLSAgICBfTV9pbXBsLmFzc2lnbihjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NwdHIoX19maXJzdCksCi0gICAgICAgICAgICAgICAgICAgY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcHRyKF9fbGFzdCkpOwotICB9Ci0gIHZvaWQgYXNzaWduKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKLSAgeyBfTV9pbXBsLmFzc2lnbihfQmFzZUNvbnN0SXRlKF9fZmlyc3QuX01fbm9kZSksIF9CYXNlQ29uc3RJdGUoX19sYXN0Ll9NX25vZGUpKTsgfQotI2VuZGlmCi0KLSAgdm9pZCBzcGxpY2UoaXRlcmF0b3IgX19wb3MsIF9TZWxmJiBfX3gpCi0gIHsgX01faW1wbC5zcGxpY2UoX0Jhc2VJdGUoX19wb3MuX01fbm9kZSksIF9feC5fTV9pbXBsKTsgfQotICB2b2lkIHNwbGljZShpdGVyYXRvciBfX3BvcywgX1NlbGYmIF9feCwgaXRlcmF0b3IgX19pKQotICB7IF9NX2ltcGwuc3BsaWNlKF9CYXNlSXRlKF9fcG9zLl9NX25vZGUpLCBfX3guX01faW1wbCwgX0Jhc2VJdGUoX19pLl9NX25vZGUpKTsgfQotICB2b2lkIHNwbGljZShpdGVyYXRvciBfX3BvcywgX1NlbGYmIF9feCwgaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KQotICB7IF9NX2ltcGwuc3BsaWNlKF9CYXNlSXRlKF9fcG9zLl9NX25vZGUpLCBfX3guX01faW1wbCwKLSAgICAgICAgICAgICAgICAgICBfQmFzZUl0ZShfX2ZpcnN0Ll9NX25vZGUpLCBfQmFzZUl0ZShfX2xhc3QuX01fbm9kZSkpOyB9Ci0KLSAgdm9pZCByZW1vdmUoY29uc3RfcmVmZXJlbmNlIF9fdmFsKQotICB7IF9NX2ltcGwucmVtb3ZlKGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3JlZihfX3ZhbCkpOyB9Ci0gIHZvaWQgdW5pcXVlKCkgeyBfTV9pbXBsLnVuaXF1ZSgpOyB9Ci0gIHZvaWQgbWVyZ2UoX1NlbGYmIF9feCkgeyBfTV9pbXBsLm1lcmdlKF9feC5fTV9pbXBsKTsgfQotICB2b2lkIHJldmVyc2UoKSB7IF9NX2ltcGwucmV2ZXJzZSgpOyB9Ci0gIHZvaWQgc29ydCgpIHsgX01faW1wbC5zb3J0KCk7IH0KLQotI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCi0gIHRlbXBsYXRlIDxjbGFzcyBfUHJlZGljYXRlPgotICB2b2lkIHJlbW92ZV9pZihfUHJlZGljYXRlIF9fcHJlZCkKLSAgeyBfTV9pbXBsLnJlbW92ZV9pZihfU1RMUF9QUklWIF9VbmFyeVByZWRXcmFwcGVyPF9TdG9yYWdlVHlwZSwgX1RwLCBfUHJlZGljYXRlPihfX3ByZWQpKTsgfQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0JpbmFyeVByZWRpY2F0ZT4KLSAgdm9pZCB1bmlxdWUoX0JpbmFyeVByZWRpY2F0ZSBfX2Jpbl9wcmVkKQotICB7IF9NX2ltcGwudW5pcXVlKF9TVExQX1BSSVYgX0JpbmFyeVByZWRXcmFwcGVyPF9TdG9yYWdlVHlwZSwgX1RwLCBfQmluYXJ5UHJlZGljYXRlPihfX2Jpbl9wcmVkKSk7IH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX1N0cmljdFdlYWtPcmRlcmluZz4KLSAgdm9pZCBtZXJnZShfU2VsZiAmX194LCBfU3RyaWN0V2Vha09yZGVyaW5nIF9fY29tcCkKLSAgeyBfTV9pbXBsLm1lcmdlKF9feC5fTV9pbXBsLCBfU1RMUF9QUklWIF9CaW5hcnlQcmVkV3JhcHBlcjxfU3RvcmFnZVR5cGUsIF9UcCwgX1N0cmljdFdlYWtPcmRlcmluZz4oX19jb21wKSk7IH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX1N0cmljdFdlYWtPcmRlcmluZz4KLSAgdm9pZCBzb3J0KF9TdHJpY3RXZWFrT3JkZXJpbmcgX19jb21wKQotICB7IF9NX2ltcGwuc29ydChfU1RMUF9QUklWIF9CaW5hcnlQcmVkV3JhcHBlcjxfU3RvcmFnZVR5cGUsIF9UcCwgX1N0cmljdFdlYWtPcmRlcmluZz4oX19jb21wKSk7IH0KLSNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCi0KLXByaXZhdGU6Ci0gIF9CYXNlIF9NX2ltcGw7Ci19OwotCi0jaWYgZGVmaW5lZCAobGlzdCkKLSMgIHVuZGVmIGxpc3QKLV9TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQotI2VuZGlmCi0KLSN1bmRlZiBMSVNUX0lNUEwKLQotX1NUTFBfRU5EX05BTUVTUEFDRQotCi0jZW5kaWYgLyogX1NUTFBfUFRSX1NQRUNJQUxJWkVEX0xJU1RfSCAqLwotCi0vLyBMb2NhbCBWYXJpYWJsZXM6Ci0vLyBtb2RlOkMrKwotLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RsL3BvaW50ZXJzL19zZXQuaCBiL3N0bC9wb2ludGVycy9fc2V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2NmZkOTguLjAwMDAwMDAKLS0tIGEvc3RsL3BvaW50ZXJzL19zZXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDUzNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1Ci0gKiBGcmFuY29pcyBEdW1vbnQKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqLwotCi0vKiBOT1RFOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBTVEwgaGVhZGVycy4KLSAqICAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuCi0gKi8KLQotI2lmbmRlZiBfU1RMUF9QVFJfU1BFQ0lBTElaRURfU0VUX0gKLSNkZWZpbmUgX1NUTFBfUFRSX1NQRUNJQUxJWkVEX1NFVF9ICi0KLSNpZm5kZWYgX1NUTFBfUE9JTlRFUlNfU1BFQ19UT09MU19ICi0jICBpbmNsdWRlIDxzdGwvcG9pbnRlcnMvX3Rvb2xzLmg+Ci0jZW5kaWYKLQotX1NUTFBfQkVHSU5fTkFNRVNQQUNFCi0KLS8vU3BlY2lmaWMgaXRlcmF0b3IgdHJhaXRzIGNyZWF0aW9uCi1fU1RMUF9DUkVBVEVfSVRFUkFUT1JfVFJBSVRTKFNldFRyYWl0c1QsIENvbnN0X3RyYWl0cykKLQotI2lmIGRlZmluZWQgKF9TVExQX1VTRV9URU1QTEFURV9FWFBPUlQpICYmICFkZWZpbmVkIChfU1RMUF9VU0VfTVNWQzZfTUVNX1RfQlVHX1dPUktBUk9VTkQpCi1fU1RMUF9FWFBPUlQgdGVtcGxhdGUgc3RydWN0IF9TVExQX0NMQVNTX0RFQ0xTUEVDIGxlc3M8dm9pZCo+OwotCi1fU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCi0KLXR5cGVkZWYgX1JiX3RyZWVfbm9kZTx2b2lkKj4gX05vZGU7Ci1fU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgX1NUTFBfYWxsb2NfcHJveHk8X1JiX3RyZWVfbm9kZV9iYXNlLCBfTm9kZSwgIGFsbG9jYXRvcjxfTm9kZT4gPjsKLV9TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBfUmJfdHJlZV9iYXNlPHZvaWQqLCBhbGxvY2F0b3I8dm9pZCo+ID47Ci0jICBpZiBkZWZpbmVkIChfU1RMUF9ERUJVRykKLV9TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBfRGJnQ29tcGFyZTx2b2lkKiwgbGVzczx2b2lkKj4gPjsKLSMgICAgZGVmaW5lIF9SYl90cmVlIF9TVExQX05PTl9EQkdfTkFNRShSYl90cmVlKQotX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIF9SYl90cmVlPHZvaWQqLCBfRGJnQ29tcGFyZTx2b2lkKiwgbGVzczx2b2lkKj4gPiwgdm9pZCosIF9JZGVudGl0eTx2b2lkKj4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NldFRyYWl0c1Q8dm9pZCo+LCBhbGxvY2F0b3I8dm9pZCo+ID47Ci0jICAgIHVuZGVmIF9SYl90cmVlCi0jICBlbmRpZgotX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIF9SYl90cmVlPHZvaWQqLCBsZXNzPHZvaWQqPiwgdm9pZCosIF9JZGVudGl0eTx2b2lkKj4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NldFRyYWl0c1Q8dm9pZCo+LCBhbGxvY2F0b3I8dm9pZCo+ID47Ci1fU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKLSNlbmRpZgotCi10ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgX1NUTFBfREZMX1RNUExfUEFSQU0oX0NvbXBhcmUsIGxlc3M8X0tleT4pLAotICAgICAgICAgICAgICAgICAgICAgIF9TVExQX0RFRkFVTFRfQUxMT0NBVE9SX1NFTEVDVChfS2V5KSA+Ci1jbGFzcyBzZXQKLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUEFSVElBTF9TUEVDX1dPUktBUk9VTkQpCi0gICAgICAgICAgOiBwdWJsaWMgX19zdGxwb3J0X2NsYXNzPHNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jPiA+Ci0jZW5kaWYKLXsKLSAgdHlwZWRlZiBfU1RMUF9QUklWIF9Bc3NvY1N0b3JhZ2VUeXBlczxfS2V5LCBfQ29tcGFyZT4gX0Fzc29jU3RvcmFnZVR5cGVzOwotICB0eXBlZGVmIHR5cGVuYW1lIF9Bc3NvY1N0b3JhZ2VUeXBlczo6X0tleVN0b3JhZ2VUeXBlIF9LZXlTdG9yYWdlVHlwZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfQXNzb2NTdG9yYWdlVHlwZXM6Ol9Db21wYXJlU3RvcmFnZVR5cGUgX0NvbXBhcmVTdG9yYWdlVHlwZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2NfdHJhaXRzPF9LZXlTdG9yYWdlVHlwZSwgX0FsbG9jPjo6YWxsb2NhdG9yX3R5cGUgX1N0b3JhZ2VUeXBlQWxsb2M7Ci0gIHR5cGVkZWYgX1NUTFBfUFJJViBfQ2FzdFRyYWl0czxfS2V5U3RvcmFnZVR5cGUsIF9LZXk+IGNhc3RfdHJhaXRzOwotCi0gIHR5cGVkZWYgc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2M+IF9TZWxmOwotcHVibGljOgotICB0eXBlZGVmIF9LZXkgICAgIGtleV90eXBlOwotICB0eXBlZGVmIF9LZXkgICAgIHZhbHVlX3R5cGU7Ci0gIHR5cGVkZWYgX0NvbXBhcmUga2V5X2NvbXBhcmU7Ci0gIHR5cGVkZWYgX0NvbXBhcmUgdmFsdWVfY29tcGFyZTsKLQotcHJvdGVjdGVkOgotICAvL1NwZWNpZmljIGl0ZXJhdG9yIHRyYWl0cyBjcmVhdGlvbgotICB0eXBlZGVmIF9TVExQX1BSSVYgX1NldFRyYWl0c1Q8dmFsdWVfdHlwZT4gX1NldFRyYWl0czsKLSAgdHlwZWRlZiBfU1RMUF9QUklWIF9SYl90cmVlPGtleV90eXBlLCBrZXlfY29tcGFyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGUsIF9TVExQX1BSSVYgX0lkZW50aXR5PHZhbHVlX3R5cGU+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NldFRyYWl0cywgX0FsbG9jPiBfUHJpdl9SZXBfdHlwZTsKLQotICB0eXBlZGVmIF9TVExQX1BSSVYgX1NldFRyYWl0c1Q8X0tleVN0b3JhZ2VUeXBlPiBfU2V0U3RvcmFnZVRyYWl0czsKLQotcHVibGljOgotICAvL2R1bXM6IG5lZWQgdGhlIGZvbGxvd2luZyBwdWJsaWMgZm9yIHRoZSBfX21vdmVfdHJhaXRzIGZyYW1ld29yawotICB0eXBlZGVmIF9TVExQX1BSSVYgX1JiX3RyZWU8X0tleVN0b3JhZ2VUeXBlLCBfQ29tcGFyZVN0b3JhZ2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0tleVN0b3JhZ2VUeXBlLCBfU1RMUF9QUklWIF9JZGVudGl0eTxfS2V5U3RvcmFnZVR5cGU+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NldFN0b3JhZ2VUcmFpdHMsIF9TdG9yYWdlVHlwZUFsbG9jPiBfUmVwX3R5cGU7Ci0KLXByaXZhdGU6Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjppdGVyYXRvciBiYXNlX2l0ZXJhdG9yOwotICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6Y29uc3RfaXRlcmF0b3IgY29uc3RfYmFzZV9pdGVyYXRvcjsKLQotcHVibGljOgotICB0eXBlZGVmIHR5cGVuYW1lIF9Qcml2X1JlcF90eXBlOjpwb2ludGVyIHBvaW50ZXI7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1ByaXZfUmVwX3R5cGU6OmNvbnN0X3BvaW50ZXIgY29uc3RfcG9pbnRlcjsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfUHJpdl9SZXBfdHlwZTo6cmVmZXJlbmNlIHJlZmVyZW5jZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfUHJpdl9SZXBfdHlwZTo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfUHJpdl9SZXBfdHlwZTo6aXRlcmF0b3IgaXRlcmF0b3I7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1ByaXZfUmVwX3R5cGU6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOwotICB0eXBlZGVmIHR5cGVuYW1lIF9Qcml2X1JlcF90eXBlOjpyZXZlcnNlX2l0ZXJhdG9yIHJldmVyc2VfaXRlcmF0b3I7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1ByaXZfUmVwX3R5cGU6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfUHJpdl9SZXBfdHlwZTo6c2l6ZV90eXBlIHNpemVfdHlwZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfUHJpdl9SZXBfdHlwZTo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfUHJpdl9SZXBfdHlwZTo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7Ci0KLXByaXZhdGU6Ci0gIF9SZXBfdHlwZSBfTV90OyAgLy8gcmVkLWJsYWNrIHRyZWUgcmVwcmVzZW50aW5nIHNldAotICBfU1RMUF9LRVlfVFlQRV9GT1JfQ09OVF9FWFQoa2V5X3R5cGUpCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9ERUJVRykKLSAgc3RhdGljIGl0ZXJhdG9yIF9TX3RvX3ZhbHVlX2l0ZShjb25zdF9iYXNlX2l0ZXJhdG9yIF9faXRlKQotICB7IHJldHVybiBpdGVyYXRvcihfX2l0ZS5fT3duZXIoKSwgX19pdGUuX01faXRlcmF0b3IuX01fbm9kZSk7IH0KLSAgc3RhdGljIGJhc2VfaXRlcmF0b3IgX1NfdG9fc3RvcmFnZV9pdGUoY29uc3RfaXRlcmF0b3IgX19pdGUpCi0gIHsgcmV0dXJuIGJhc2VfaXRlcmF0b3IoX19pdGUuX093bmVyKCksIF9faXRlLl9NX2l0ZXJhdG9yLl9NX25vZGUpOyB9Ci0jZWxzZQotICBzdGF0aWMgaXRlcmF0b3IgX1NfdG9fdmFsdWVfaXRlKGNvbnN0X2Jhc2VfaXRlcmF0b3IgX19pdGUpCi0gIHsgcmV0dXJuIGl0ZXJhdG9yKF9faXRlLl9NX25vZGUpOyB9Ci0gIHN0YXRpYyBiYXNlX2l0ZXJhdG9yIF9TX3RvX3N0b3JhZ2VfaXRlKGNvbnN0X2l0ZXJhdG9yIF9faXRlKQotICB7IHJldHVybiBiYXNlX2l0ZXJhdG9yKF9faXRlLl9NX25vZGUpOyB9Ci0jZW5kaWYKLQotcHVibGljOgotICBzZXQoKSA6IF9NX3QoX0NvbXBhcmVTdG9yYWdlVHlwZSgpLCBfU3RvcmFnZVR5cGVBbGxvYygpKSB7fQotICBleHBsaWNpdCBzZXQoY29uc3QgX0NvbXBhcmUmIF9fY29tcCwKLSAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQotICAgIDogX01fdChfX2NvbXAsIF9TVExQX0NPTlZFUlRfQUxMT0NBVE9SKF9fYSwgX0tleVN0b3JhZ2VUeXBlKSkge30KLQotI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KLSAgc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKLSAgICA6IF9NX3QoX0NvbXBhcmUoKSwgX1N0b3JhZ2VUeXBlQWxsb2MoKSkgewotIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX0lURVJBVE9SX1dSQVBQRVIpCi0gICAgX01fdC5pbnNlcnRfdW5pcXVlKHR5cGVuYW1lIF9TVExQX1BSSVYgX0l0ZVdyYXBwZXI8X0tleVN0b3JhZ2VUeXBlLCBfS2V5LCBfSW5wdXRJdGVyYXRvcj46Ol9JdGUoX19maXJzdCksCi0gICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9TVExQX1BSSVYgX0l0ZVdyYXBwZXI8X0tleVN0b3JhZ2VUeXBlLCBfS2V5LCBfSW5wdXRJdGVyYXRvcj46Ol9JdGUoX19sYXN0KSk7Ci0jICBlbHNlCi0gICAgX01fdC5pbnNlcnRfdW5pcXVlKF9fZmlyc3QsIF9fbGFzdCk7Ci0jICBlbmRpZgotICB9Ci0KLSMgIGlmIGRlZmluZWQgKF9TVExQX05FRURTX0VYVFJBX1RFTVBMQVRFX0NPTlNUUlVDVE9SUykKLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgotICBzZXQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LCBjb25zdCBfQ29tcGFyZSYgX19jb21wKQotICAgIDogX01fdChfX2NvbXAsIF9TdG9yYWdlVHlwZUFsbG9jKCkpIHsKLSMgICAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX0lURVJBVE9SX1dSQVBQRVIpCi0gICAgX01fdC5pbnNlcnRfdW5pcXVlKHR5cGVuYW1lIF9TVExQX1BSSVYgX0l0ZVdyYXBwZXI8X0tleVN0b3JhZ2VUeXBlLCBfS2V5LCBfSW5wdXRJdGVyYXRvcj46Ol9JdGUoX19maXJzdCksCi0gICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9TVExQX1BSSVYgX0l0ZVdyYXBwZXI8X0tleVN0b3JhZ2VUeXBlLCBfS2V5LCBfSW5wdXRJdGVyYXRvcj46Ol9JdGUoX19sYXN0KSk7Ci0jICAgIGVsc2UKLSAgICBfTV90Lmluc2VydF91bmlxdWUoX19maXJzdCwgX19sYXN0KTsKLSMgICAgZW5kaWYKLSAgfQotIyAgZW5kaWYKLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgotICBzZXQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LCBjb25zdCBfQ29tcGFyZSYgX19jb21wLAotICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSBfU1RMUF9BTExPQ0FUT1JfVFlQRV9ERkwpCi0gICAgOiBfTV90KF9fY29tcCwgX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoX19hLCBfS2V5U3RvcmFnZVR5cGUpKSB7Ci0jICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfSVRFUkFUT1JfV1JBUFBFUikKLSAgICBfTV90Lmluc2VydF91bmlxdWUodHlwZW5hbWUgX1NUTFBfUFJJViBfSXRlV3JhcHBlcjxfS2V5U3RvcmFnZVR5cGUsIF9LZXksIF9JbnB1dEl0ZXJhdG9yPjo6X0l0ZShfX2ZpcnN0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX1NUTFBfUFJJViBfSXRlV3JhcHBlcjxfS2V5U3RvcmFnZVR5cGUsIF9LZXksIF9JbnB1dEl0ZXJhdG9yPjo6X0l0ZShfX2xhc3QpKTsKLSMgIGVsc2UKLSAgICBfTV90Lmluc2VydF91bmlxdWUoX19maXJzdCwgX19sYXN0KTsKLSMgIGVuZGlmCi0gIH0KLSNlbHNlCi0gIHNldChjb25zdCB2YWx1ZV90eXBlKiBfX2ZpcnN0LCBjb25zdCB2YWx1ZV90eXBlKiBfX2xhc3QpCi0gICAgOiBfTV90KF9Db21wYXJlKCksIF9TdG9yYWdlVHlwZUFsbG9jKCkpIHsKLSAgICBfTV90Lmluc2VydF91bmlxdWUoY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcHRyKF9fZmlyc3QpLAotICAgICAgICAgICAgICAgICAgICAgICBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NwdHIoX19sYXN0KSk7Ci0gIH0KLQotICBzZXQoY29uc3QgdmFsdWVfdHlwZSogX19maXJzdCwgY29uc3QgdmFsdWVfdHlwZSogX19sYXN0LAotICAgICAgY29uc3QgX0NvbXBhcmUmIF9fY29tcCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCi0gICAgOiBfTV90KF9fY29tcCwgX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoX19hLCBfS2V5U3RvcmFnZVR5cGUpKSB7Ci0gICAgX01fdC5pbnNlcnRfdW5pcXVlKGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3B0cihfX2ZpcnN0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcHRyKF9fbGFzdCkpOwotICB9Ci0KLSAgc2V0KGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKLSAgICA6IF9NX3QoX0NvbXBhcmUoKSwgX1N0b3JhZ2VUeXBlQWxsb2MoKSkKLSAgeyBfTV90Lmluc2VydF91bmlxdWUoX1NfdG9fc3RvcmFnZV9pdGUoX19maXJzdCksIF9TX3RvX3N0b3JhZ2VfaXRlKF9fbGFzdCkpOyB9Ci0KLSAgc2V0KGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCwKLSAgICAgIGNvbnN0IF9Db21wYXJlJiBfX2NvbXAsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQotICAgIDogX01fdChfX2NvbXAsIF9TVExQX0NPTlZFUlRfQUxMT0NBVE9SKF9fYSwgX0tleVN0b3JhZ2VUeXBlKSkKLSAgeyBfTV90Lmluc2VydF91bmlxdWUoX1NfdG9fc3RvcmFnZV9pdGUoX19maXJzdCksIF9TX3RvX3N0b3JhZ2VfaXRlKF9fbGFzdCkpOyB9Ci0jZW5kaWYgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLwotCi0gIHNldChjb25zdCBfU2VsZiYgX194KSA6IF9NX3QoX194Ll9NX3QpIHt9Ci0KLSAgc2V0KF9fbW92ZV9zb3VyY2U8X1NlbGY+IHNyYykKLSAgICA6IF9NX3QoX19tb3ZlX3NvdXJjZTxfUmVwX3R5cGU+KHNyYy5nZXQoKS5fTV90KSkge30KLQotICBfU2VsZiYgb3BlcmF0b3I9KGNvbnN0IF9TZWxmJiBfX3gpIHsKLSAgICBfTV90ID0gX194Ll9NX3Q7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgLy8gYWNjZXNzb3JzOgotICBrZXlfY29tcGFyZSBrZXlfY29tcCgpIGNvbnN0IHsgcmV0dXJuIF9NX3Qua2V5X2NvbXAoKTsgfQotICB2YWx1ZV9jb21wYXJlIHZhbHVlX2NvbXAoKSBjb25zdCB7IHJldHVybiBfTV90LmtleV9jb21wKCk7IH0KLSAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0Ci0gIHsgcmV0dXJuIF9TVExQX0NPTlZFUlRfQUxMT0NBVE9SKF9NX3QuZ2V0X2FsbG9jYXRvcigpLCB2YWx1ZV90eXBlKTsgfQotCi0gIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gX1NfdG9fdmFsdWVfaXRlKF9NX3QuYmVnaW4oKSk7IH0KLSAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gX1NfdG9fdmFsdWVfaXRlKF9NX3QuZW5kKCkpOyB9Ci0gIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gX1NfdG9fdmFsdWVfaXRlKF9NX3QuYmVnaW4oKSk7IH0KLSAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gX1NfdG9fdmFsdWVfaXRlKF9NX3QuZW5kKCkpOyB9Ci0gIHJldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KLSAgcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQotICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9Ci0gIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KLSAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIF9NX3QuZW1wdHkoKTsgfQotICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX3Quc2l6ZSgpOyB9Ci0gIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX3QubWF4X3NpemUoKTsgfQotICB2b2lkIHN3YXAoX1NlbGYmIF9feCkgeyBfTV90LnN3YXAoX194Ll9NX3QpOyB9Ci0KLSAgLy8gaW5zZXJ0L2VyYXNlCi0gIHBhaXI8aXRlcmF0b3IsYm9vbD4gaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9feCkgewotICAgIHBhaXI8YmFzZV9pdGVyYXRvciwgYm9vbD4gcmV0ID0gX01fdC5pbnNlcnRfdW5pcXVlKGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3JlZihfX3gpKTsKLSAgICByZXR1cm4gcGFpcjxpdGVyYXRvciwgYm9vbD4oX1NfdG9fdmFsdWVfaXRlKHJldC5maXJzdCksIHJldC5zZWNvbmQpOwotICB9Ci0gIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBfX3BvcywgY29uc3QgdmFsdWVfdHlwZSYgX194KQotICB7IHJldHVybiBfU190b192YWx1ZV9pdGUoX01fdC5pbnNlcnRfdW5pcXVlKF9TX3RvX3N0b3JhZ2VfaXRlKF9fcG9zKSwgY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcmVmKF9feCkpKTsgfQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgotICB2b2lkIGluc2VydChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpIHsKLSMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9JVEVSQVRPUl9XUkFQUEVSKQotICAgIF9NX3QuaW5zZXJ0X3VuaXF1ZSh0eXBlbmFtZSBfU1RMUF9QUklWIF9JdGVXcmFwcGVyPF9LZXlTdG9yYWdlVHlwZSwgX0tleSwgX0lucHV0SXRlcmF0b3I+OjpfSXRlKF9fZmlyc3QpLAotICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfU1RMUF9QUklWIF9JdGVXcmFwcGVyPF9LZXlTdG9yYWdlVHlwZSwgX0tleSwgX0lucHV0SXRlcmF0b3I+OjpfSXRlKF9fbGFzdCkpOwotIyAgZWxzZQotICAgIF9NX3QuaW5zZXJ0X3VuaXF1ZShfX2ZpcnN0LCBfX2xhc3QpOwotIyAgZW5kaWYKLSAgfQotI2Vsc2UKLSAgdm9pZCBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KQotICB7IF9NX3QuaW5zZXJ0X3VuaXF1ZShfU190b19zdG9yYWdlX2l0ZShfX2ZpcnN0KSwgX1NfdG9fc3RvcmFnZV9pdGUoX19sYXN0KSk7IH0KLSAgdm9pZCBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSogX19maXJzdCwgY29uc3QgdmFsdWVfdHlwZSogX19sYXN0KSB7Ci0gICAgX01fdC5pbnNlcnRfdW5pcXVlKGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3B0cihfX2ZpcnN0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcHRyKF9fbGFzdCkpOwotICB9Ci0jZW5kaWYKLSAgdm9pZCBlcmFzZShpdGVyYXRvciBfX3BvcykKLSAgeyBfTV90LmVyYXNlKF9TX3RvX3N0b3JhZ2VfaXRlKF9fcG9zKSk7IH0KLSAgc2l6ZV90eXBlIGVyYXNlKGNvbnN0IGtleV90eXBlJiBfX3gpCi0gIHsgcmV0dXJuIF9NX3QuZXJhc2VfdW5pcXVlKGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3JlZihfX3gpKTsgfQotICB2b2lkIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkKLSAgeyBfTV90LmVyYXNlKF9TX3RvX3N0b3JhZ2VfaXRlKF9fZmlyc3QpLCBfU190b19zdG9yYWdlX2l0ZShfX2xhc3QpKTsgfQotICB2b2lkIGNsZWFyKCkgeyBfTV90LmNsZWFyKCk7IH0KLQotICAvLyBzZXQgb3BlcmF0aW9uczoKLSAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0gIGNvbnN0X2l0ZXJhdG9yIGZpbmQoY29uc3QgX0tUJiBfX3gpIGNvbnN0Ci0gIHsgcmV0dXJuIF9TX3RvX3ZhbHVlX2l0ZShfTV90LmZpbmQoY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcmVmVChfX3gpKSk7IH0KLSAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0gIGl0ZXJhdG9yIGZpbmQoY29uc3QgX0tUJiBfX3gpCi0gIHsgcmV0dXJuIF9TX3RvX3ZhbHVlX2l0ZShfTV90LmZpbmQoY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcmVmVChfX3gpKSk7IH0KLSAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0gIHNpemVfdHlwZSBjb3VudChjb25zdCBfS1QmIF9feCkgY29uc3QKLSAgeyByZXR1cm4gX01fdC5maW5kKGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3JlZlQoX194KSkgPT0gX01fdC5lbmQoKSA/IDAgOiAxOyB9Ci0gIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAotICBpdGVyYXRvciBsb3dlcl9ib3VuZChjb25zdCBfS1QmIF9feCkKLSAgeyByZXR1cm4gX1NfdG9fdmFsdWVfaXRlKF9NX3QubG93ZXJfYm91bmQoY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcmVmVChfX3gpKSk7IH0KLSAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0gIGNvbnN0X2l0ZXJhdG9yIGxvd2VyX2JvdW5kKGNvbnN0IF9LVCYgX194KSBjb25zdAotICB7IHJldHVybiBfU190b192YWx1ZV9pdGUoX01fdC5sb3dlcl9ib3VuZChjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWZUKF9feCkpKTsgfQotICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKLSAgaXRlcmF0b3IgdXBwZXJfYm91bmQoY29uc3QgX0tUJiBfX3gpCi0gIHsgcmV0dXJuIF9TX3RvX3ZhbHVlX2l0ZShfTV90LnVwcGVyX2JvdW5kKGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3JlZlQoX194KSkpOyB9Ci0gIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAotICBjb25zdF9pdGVyYXRvciB1cHBlcl9ib3VuZChjb25zdCBfS1QmIF9feCkgY29uc3QKLSAgeyByZXR1cm4gX1NfdG9fdmFsdWVfaXRlKF9NX3QudXBwZXJfYm91bmQoY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcmVmVChfX3gpKSk7IH0KLSAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0gIHBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPiBlcXVhbF9yYW5nZShjb25zdCBfS1QmIF9feCkgewotICAgIHBhaXI8YmFzZV9pdGVyYXRvciwgYmFzZV9pdGVyYXRvcj4gX19yZXQ7Ci0gICAgX19yZXQgPSBfTV90LmVxdWFsX3JhbmdlKGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3JlZlQoX194KSk7Ci0gICAgcmV0dXJuIHBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPihfU190b192YWx1ZV9pdGUoX19yZXQuZmlyc3QpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NfdG9fdmFsdWVfaXRlKF9fcmV0LnNlY29uZCkpOwotICB9Ci0gIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAotICBwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4gZXF1YWxfcmFuZ2UoY29uc3QgX0tUJiBfX3gpIGNvbnN0IHsKLSAgICBwYWlyPGNvbnN0X2Jhc2VfaXRlcmF0b3IsIGNvbnN0X2Jhc2VfaXRlcmF0b3I+IF9fcmV0OwotICAgIF9fcmV0ID0gX01fdC5lcXVhbF9yYW5nZV91bmlxdWUoY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcmVmVChfX3gpKTsKLSAgICByZXR1cm4gcGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+KF9TX3RvX3ZhbHVlX2l0ZShfX3JldC5maXJzdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU190b192YWx1ZV9pdGUoX19yZXQuc2Vjb25kKSk7Ci0gIH0KLX07Ci0KLS8vU3BlY2lmaWMgaXRlcmF0b3IgdHJhaXRzIGNyZWF0aW9uCi1fU1RMUF9DUkVBVEVfSVRFUkFUT1JfVFJBSVRTKE11bHRpc2V0VHJhaXRzVCwgQ29uc3RfdHJhaXRzKQotCi10ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgX1NUTFBfREZMX1RNUExfUEFSQU0oX0NvbXBhcmUsIGxlc3M8X0tleT4pLAotICAgICAgICAgICAgICAgICAgICAgX1NUTFBfREVGQVVMVF9BTExPQ0FUT1JfU0VMRUNUKF9LZXkpID4KLWNsYXNzIG11bHRpc2V0Ci0jaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKQotICAgICAgICAgICAgICAgOiBwdWJsaWMgX19zdGxwb3J0X2NsYXNzPG11bHRpc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2M+ID4KLSNlbmRpZgotewotICB0eXBlZGVmIF9TVExQX1BSSVYgX0Fzc29jU3RvcmFnZVR5cGVzPF9LZXksIF9Db21wYXJlPiBfQXNzb2NTdG9yYWdlVHlwZXM7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0Fzc29jU3RvcmFnZVR5cGVzOjpfS2V5U3RvcmFnZVR5cGUgX0tleVN0b3JhZ2VUeXBlOwotICB0eXBlZGVmIHR5cGVuYW1lIF9Bc3NvY1N0b3JhZ2VUeXBlczo6X0NvbXBhcmVTdG9yYWdlVHlwZSBfQ29tcGFyZVN0b3JhZ2VUeXBlOwotICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY190cmFpdHM8X0tleVN0b3JhZ2VUeXBlLCBfQWxsb2M+OjphbGxvY2F0b3JfdHlwZSBfU3RvcmFnZVR5cGVBbGxvYzsKLSAgdHlwZWRlZiBfU1RMUF9QUklWIF9DYXN0VHJhaXRzPF9LZXlTdG9yYWdlVHlwZSwgX0tleT4gY2FzdF90cmFpdHM7Ci0KLSAgdHlwZWRlZiBtdWx0aXNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jPiBfU2VsZjsKLXB1YmxpYzoKLSAgLy8gdHlwZWRlZnM6Ci0gIHR5cGVkZWYgX0tleSAgICAga2V5X3R5cGU7Ci0gIHR5cGVkZWYgX0tleSAgICAgdmFsdWVfdHlwZTsKLSAgdHlwZWRlZiBfQ29tcGFyZSBrZXlfY29tcGFyZTsKLSAgdHlwZWRlZiBfQ29tcGFyZSB2YWx1ZV9jb21wYXJlOwotCi1wcm90ZWN0ZWQ6Ci0gIC8vU3BlY2lmaWMgaXRlcmF0b3IgdHJhaXRzIGNyZWF0aW9uCi0gIHR5cGVkZWYgX1NUTFBfUFJJViBfTXVsdGlzZXRUcmFpdHNUPHZhbHVlX3R5cGU+IF9NdWx0aXNldFRyYWl0czsKLSAgdHlwZWRlZiBfU1RMUF9QUklWIF9SYl90cmVlPGtleV90eXBlLCBrZXlfY29tcGFyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGUsIF9TVExQX1BSSVYgX0lkZW50aXR5PHZhbHVlX3R5cGU+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX011bHRpc2V0VHJhaXRzLCBfQWxsb2M+IF9Qcml2X1JlcF90eXBlOwotCi0gIHR5cGVkZWYgX1NUTFBfUFJJViBfTXVsdGlzZXRUcmFpdHNUPF9LZXlTdG9yYWdlVHlwZT4gX011bHRpc2V0U3RvcmFnZVRyYWl0czsKLXB1YmxpYzoKLSAgLy9kdW1zOiBuZWVkIHRoZSBmb2xsb3dpbmcgcHVibGljIGZvciB0aGUgX19tb3ZlX3RyYWl0cyBmcmFtZXdvcmsKLSAgdHlwZWRlZiBfU1RMUF9QUklWIF9SYl90cmVlPF9LZXlTdG9yYWdlVHlwZSwgX0NvbXBhcmVTdG9yYWdlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9LZXlTdG9yYWdlVHlwZSwgX1NUTFBfUFJJViBfSWRlbnRpdHk8X0tleVN0b3JhZ2VUeXBlPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NdWx0aXNldFN0b3JhZ2VUcmFpdHMsIF9TdG9yYWdlVHlwZUFsbG9jPiBfUmVwX3R5cGU7Ci0KLXByaXZhdGU6Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjppdGVyYXRvciBiYXNlX2l0ZXJhdG9yOwotICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6Y29uc3RfaXRlcmF0b3IgY29uc3RfYmFzZV9pdGVyYXRvcjsKLQotcHVibGljOgotICB0eXBlZGVmIHR5cGVuYW1lIF9Qcml2X1JlcF90eXBlOjpwb2ludGVyIHBvaW50ZXI7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1ByaXZfUmVwX3R5cGU6OmNvbnN0X3BvaW50ZXIgY29uc3RfcG9pbnRlcjsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfUHJpdl9SZXBfdHlwZTo6cmVmZXJlbmNlIHJlZmVyZW5jZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfUHJpdl9SZXBfdHlwZTo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfUHJpdl9SZXBfdHlwZTo6aXRlcmF0b3IgaXRlcmF0b3I7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1ByaXZfUmVwX3R5cGU6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOwotICB0eXBlZGVmIHR5cGVuYW1lIF9Qcml2X1JlcF90eXBlOjpyZXZlcnNlX2l0ZXJhdG9yIHJldmVyc2VfaXRlcmF0b3I7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1ByaXZfUmVwX3R5cGU6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfUHJpdl9SZXBfdHlwZTo6c2l6ZV90eXBlIHNpemVfdHlwZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfUHJpdl9SZXBfdHlwZTo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfUHJpdl9SZXBfdHlwZTo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7Ci0KLXByaXZhdGU6Ci0gIF9SZXBfdHlwZSBfTV90OyAgLy8gcmVkLWJsYWNrIHRyZWUgcmVwcmVzZW50aW5nIG11bHRpc2V0Ci0gIF9TVExQX0tFWV9UWVBFX0ZPUl9DT05UX0VYVChrZXlfdHlwZSkKLQotI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHKQotICBzdGF0aWMgaXRlcmF0b3IgX1NfdG9fdmFsdWVfaXRlKGNvbnN0X2Jhc2VfaXRlcmF0b3IgX19pdGUpCi0gIHsgcmV0dXJuIGl0ZXJhdG9yKF9faXRlLl9Pd25lcigpLCBfX2l0ZS5fTV9pdGVyYXRvci5fTV9ub2RlKTsgfQotICBzdGF0aWMgYmFzZV9pdGVyYXRvciBfU190b19zdG9yYWdlX2l0ZShjb25zdF9pdGVyYXRvciBfX2l0ZSkKLSAgeyByZXR1cm4gYmFzZV9pdGVyYXRvcihfX2l0ZS5fT3duZXIoKSwgX19pdGUuX01faXRlcmF0b3IuX01fbm9kZSk7IH0KLSNlbHNlCi0gIHN0YXRpYyBpdGVyYXRvciBfU190b192YWx1ZV9pdGUoY29uc3RfYmFzZV9pdGVyYXRvciBfX2l0ZSkKLSAgeyByZXR1cm4gaXRlcmF0b3IoX19pdGUuX01fbm9kZSk7IH0KLSAgc3RhdGljIGJhc2VfaXRlcmF0b3IgX1NfdG9fc3RvcmFnZV9pdGUoY29uc3RfaXRlcmF0b3IgX19pdGUpCi0gIHsgcmV0dXJuIGJhc2VfaXRlcmF0b3IoX19pdGUuX01fbm9kZSk7IH0KLSNlbmRpZgotCi1wdWJsaWM6Ci0gIG11bHRpc2V0KCkgOiBfTV90KF9Db21wYXJlKCksIF9TdG9yYWdlVHlwZUFsbG9jKCkpIHt9Ci0gIGV4cGxpY2l0IG11bHRpc2V0KGNvbnN0IF9Db21wYXJlJiBfX2NvbXAsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQotICAgIDogX01fdChfX2NvbXAsIF9TVExQX0NPTlZFUlRfQUxMT0NBVE9SKF9fYSwgX0tleVN0b3JhZ2VUeXBlKSkge30KLQotI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KLSAgbXVsdGlzZXQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQotICAgIDogX01fdChfQ29tcGFyZSgpLCBfU3RvcmFnZVR5cGVBbGxvYygpKSB7Ci0jICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfSVRFUkFUT1JfV1JBUFBFUikKLSAgICBfTV90Lmluc2VydF9lcXVhbCh0eXBlbmFtZSBfU1RMUF9QUklWIF9JdGVXcmFwcGVyPF9LZXlTdG9yYWdlVHlwZSwgX0tleSwgX0lucHV0SXRlcmF0b3I+OjpfSXRlKF9fZmlyc3QpLAotICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9TVExQX1BSSVYgX0l0ZVdyYXBwZXI8X0tleVN0b3JhZ2VUeXBlLCBfS2V5LCBfSW5wdXRJdGVyYXRvcj46Ol9JdGUoX19sYXN0KSk7Ci0jICBlbHNlCi0gICAgX01fdC5pbnNlcnRfZXF1YWwoX19maXJzdCwgX19sYXN0KTsKLSMgIGVuZGlmCi0gIH0KLQotIyAgaWYgZGVmaW5lZCAoX1NUTFBfTkVFRFNfRVhUUkFfVEVNUExBVEVfQ09OU1RSVUNUT1JTKQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Ci0gIG11bHRpc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKLSAgICAgICAgICAgY29uc3QgX0NvbXBhcmUmIF9fY29tcCkKLSAgICA6IF9NX3QoX19jb21wLCBfU3RvcmFnZVR5cGVBbGxvYygpKSB7Ci0jICAgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9JVEVSQVRPUl9XUkFQUEVSKQotICAgIF9NX3QuaW5zZXJ0X2VxdWFsKHR5cGVuYW1lIF9TVExQX1BSSVYgX0l0ZVdyYXBwZXI8X0tleVN0b3JhZ2VUeXBlLCBfS2V5LCBfSW5wdXRJdGVyYXRvcj46Ol9JdGUoX19maXJzdCksCi0gICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX1NUTFBfUFJJViBfSXRlV3JhcHBlcjxfS2V5U3RvcmFnZVR5cGUsIF9LZXksIF9JbnB1dEl0ZXJhdG9yPjo6X0l0ZShfX2xhc3QpKTsKLSMgICAgZWxzZQotICAgIF9NX3QuaW5zZXJ0X2VxdWFsKF9fZmlyc3QsIF9fbGFzdCk7Ci0jICAgIGVuZGlmCi0gIH0KLSMgIGVuZGlmCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KLSAgbXVsdGlzZXQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAotICAgICAgICAgICBjb25zdCBfQ29tcGFyZSYgX19jb21wLAotICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hIF9TVExQX0FMTE9DQVRPUl9UWVBFX0RGTCkKLSAgICA6IF9NX3QoX19jb21wLCBfU1RMUF9DT05WRVJUX0FMTE9DQVRPUihfX2EsIF9LZXlTdG9yYWdlVHlwZSkpIHsKLSMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9JVEVSQVRPUl9XUkFQUEVSKQotICAgIF9NX3QuaW5zZXJ0X2VxdWFsKHR5cGVuYW1lIF9TVExQX1BSSVYgX0l0ZVdyYXBwZXI8X0tleVN0b3JhZ2VUeXBlLCBfS2V5LCBfSW5wdXRJdGVyYXRvcj46Ol9JdGUoX19maXJzdCksCi0gICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX1NUTFBfUFJJViBfSXRlV3JhcHBlcjxfS2V5U3RvcmFnZVR5cGUsIF9LZXksIF9JbnB1dEl0ZXJhdG9yPjo6X0l0ZShfX2xhc3QpKTsKLSMgIGVsc2UKLSAgICBfTV90Lmluc2VydF9lcXVhbChfX2ZpcnN0LCBfX2xhc3QpOwotIyAgZW5kaWYKLSAgfQotCi0jZWxzZQotICBtdWx0aXNldChjb25zdCB2YWx1ZV90eXBlKiBfX2ZpcnN0LCBjb25zdCB2YWx1ZV90eXBlKiBfX2xhc3QpCi0gICAgOiBfTV90KF9Db21wYXJlKCksIF9TdG9yYWdlVHlwZUFsbG9jKCkpIHsKLSAgICBfTV90Lmluc2VydF9lcXVhbChjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NwdHIoX19maXJzdCksCi0gICAgICAgICAgICAgICAgICAgICAgY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcHRyKF9fbGFzdCkpOwotICB9Ci0KLSAgbXVsdGlzZXQoY29uc3QgdmFsdWVfdHlwZSogX19maXJzdCwgY29uc3QgdmFsdWVfdHlwZSogX19sYXN0LAotICAgICAgICAgICBjb25zdCBfQ29tcGFyZSYgX19jb21wLAotICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKLSAgICA6IF9NX3QoX19jb21wLCBfU1RMUF9DT05WRVJUX0FMTE9DQVRPUihfX2EsIF9LZXlTdG9yYWdlVHlwZSkpIHsKLSAgICBfTV90Lmluc2VydF9lcXVhbChjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NwdHIoX19maXJzdCksCi0gICAgICAgICAgICAgICAgICAgICAgY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcHRyKF9fbGFzdCkpOwotICB9Ci0KLSAgbXVsdGlzZXQoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KQotICAgIDogX01fdChfQ29tcGFyZSgpLCBfU3RvcmFnZVR5cGVBbGxvYygpKQotICB7IF9NX3QuaW5zZXJ0X2VxdWFsKF9TX3RvX3N0b3JhZ2VfaXRlKF9fZmlyc3QpLCBfU190b19zdG9yYWdlX2l0ZShfX2xhc3QpKTsgfQotCi0gIG11bHRpc2V0KGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCwKLSAgICAgICAgICAgY29uc3QgX0NvbXBhcmUmIF9fY29tcCwKLSAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCi0gICAgOiBfTV90KF9fY29tcCwgX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoX19hLCBfS2V5U3RvcmFnZVR5cGUpKQotICB7IF9NX3QuaW5zZXJ0X2VxdWFsKF9TX3RvX3N0b3JhZ2VfaXRlKF9fZmlyc3QpLCBfU190b19zdG9yYWdlX2l0ZShfX2xhc3QpKTsgfQotI2VuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KLQotICBtdWx0aXNldChjb25zdCBfU2VsZiYgX194KQotICAgIDogX01fdChfX3guX01fdCkge30KLQotICBfU2VsZiYgb3BlcmF0b3I9KGNvbnN0IF9TZWxmJiBfX3gpIHsKLSAgICBfTV90ID0gX194Ll9NX3Q7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgbXVsdGlzZXQoX19tb3ZlX3NvdXJjZTxfU2VsZj4gc3JjKQotICAgIDogX01fdChfX21vdmVfc291cmNlPF9SZXBfdHlwZT4oc3JjLmdldCgpLl9NX3QpKSB7fQotCi0gIC8vIGFjY2Vzc29yczoKLSAga2V5X2NvbXBhcmUga2V5X2NvbXAoKSBjb25zdCB7IHJldHVybiBfTV90LmtleV9jb21wKCk7IH0KLSAgdmFsdWVfY29tcGFyZSB2YWx1ZV9jb21wKCkgY29uc3QgeyByZXR1cm4gX01fdC5rZXlfY29tcCgpOyB9Ci0gIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdAotICB7IHJldHVybiBfU1RMUF9DT05WRVJUX0FMTE9DQVRPUihfTV90LmdldF9hbGxvY2F0b3IoKSwgdmFsdWVfdHlwZSk7IH0KLQotICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIF9TX3RvX3ZhbHVlX2l0ZShfTV90LmJlZ2luKCkpOyB9Ci0gIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIF9TX3RvX3ZhbHVlX2l0ZShfTV90LmVuZCgpKTsgfQotICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIF9TX3RvX3ZhbHVlX2l0ZShfTV90LmJlZ2luKCkpOyB9Ci0gIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIF9TX3RvX3ZhbHVlX2l0ZShfTV90LmVuZCgpKTsgfQotICByZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9Ci0gIHJldmVyc2VfaXRlcmF0b3IgcmVuZCgpIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KLSAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBjb25zdCB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQotICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSBjb25zdCB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9Ci0gIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBfTV90LmVtcHR5KCk7IH0KLSAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCB7IHJldHVybiBfTV90LnNpemUoKTsgfQotICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCB7IHJldHVybiBfTV90Lm1heF9zaXplKCk7IH0KLSAgdm9pZCBzd2FwKF9TZWxmJiBfX3gpIHsgX01fdC5zd2FwKF9feC5fTV90KTsgfQotCi0gIC8vIGluc2VydC9lcmFzZQotICBpdGVyYXRvciBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX194KQotICB7IHJldHVybiBfU190b192YWx1ZV9pdGUoX01fdC5pbnNlcnRfZXF1YWwoY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcmVmKF9feCkpKTsgfQotICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkgewotICAgIHJldHVybiBfU190b192YWx1ZV9pdGUoX01fdC5pbnNlcnRfZXF1YWwoX1NfdG9fc3RvcmFnZV9pdGUoX19wb3MpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcmVmKF9feCkpKTsKLSAgfQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgotICB2b2lkIGluc2VydChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpIHsKLSMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9JVEVSQVRPUl9XUkFQUEVSKQotICAgIF9NX3QuaW5zZXJ0X2VxdWFsKHR5cGVuYW1lIF9TVExQX1BSSVYgX0l0ZVdyYXBwZXI8X0tleVN0b3JhZ2VUeXBlLCBfS2V5LCBfSW5wdXRJdGVyYXRvcj46Ol9JdGUoX19maXJzdCksCi0gICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX1NUTFBfUFJJViBfSXRlV3JhcHBlcjxfS2V5U3RvcmFnZVR5cGUsIF9LZXksIF9JbnB1dEl0ZXJhdG9yPjo6X0l0ZShfX2xhc3QpKTsKLSMgIGVsc2UKLSAgICBfTV90Lmluc2VydF9lcXVhbChfX2ZpcnN0LCBfX2xhc3QpOwotIyAgZW5kaWYKLSAgfQotI2Vsc2UKLSAgdm9pZCBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSogX19maXJzdCwgY29uc3QgdmFsdWVfdHlwZSogX19sYXN0KSB7Ci0gICAgX01fdC5pbnNlcnRfZXF1YWwoY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcHRyKF9fZmlyc3QpLAotICAgICAgICAgICAgICAgICAgICAgIGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3B0cihfX2xhc3QpKTsKLSAgfQotICB2b2lkIGluc2VydChjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpCi0gIHsgX01fdC5pbnNlcnRfZXF1YWwoX1NfdG9fc3RvcmFnZV9pdGUoX19maXJzdCksIF9TX3RvX3N0b3JhZ2VfaXRlKF9fbGFzdCkpOyB9Ci0jZW5kaWYgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLwotCi0gIHZvaWQgZXJhc2UoaXRlcmF0b3IgX19wb3MpCi0gIHsgX01fdC5lcmFzZShfU190b19zdG9yYWdlX2l0ZShfX3BvcykpOyB9Ci0gIHNpemVfdHlwZSBlcmFzZShjb25zdCBrZXlfdHlwZSYgX194KQotICB7IHJldHVybiBfTV90LmVyYXNlKGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3JlZihfX3gpKTsgfQotICB2b2lkIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkKLSAgeyBfTV90LmVyYXNlKF9TX3RvX3N0b3JhZ2VfaXRlKF9fZmlyc3QpLCBfU190b19zdG9yYWdlX2l0ZShfX2xhc3QpKTsgfQotICB2b2lkIGNsZWFyKCkgeyBfTV90LmNsZWFyKCk7IH0KLQotICAvLyBtdWx0aXNldCBvcGVyYXRpb25zOgotCi0gIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAotICBpdGVyYXRvciBmaW5kKGNvbnN0IF9LVCYgX194KQotICB7IHJldHVybiBfU190b192YWx1ZV9pdGUoX01fdC5maW5kKGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3JlZlQoX194KSkpOyB9Ci0gIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAotICBjb25zdF9pdGVyYXRvciBmaW5kKGNvbnN0IF9LVCYgX194KSBjb25zdAotICB7IHJldHVybiBfU190b192YWx1ZV9pdGUoX01fdC5maW5kKGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3JlZlQoX194KSkpOyB9Ci0gIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAotICBzaXplX3R5cGUgY291bnQoY29uc3QgX0tUJiBfX3gpIGNvbnN0Ci0gIHsgcmV0dXJuIF9NX3QuY291bnQoY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcmVmVChfX3gpKTsgfQotICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKLSAgaXRlcmF0b3IgbG93ZXJfYm91bmQoY29uc3QgX0tUJiBfX3gpCi0gIHsgcmV0dXJuIF9TX3RvX3ZhbHVlX2l0ZShfTV90Lmxvd2VyX2JvdW5kKGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3JlZlQoX194KSkpOyB9Ci0gIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAotICBjb25zdF9pdGVyYXRvciBsb3dlcl9ib3VuZChjb25zdCBfS1QmIF9feCkgY29uc3QKLSAgeyByZXR1cm4gX1NfdG9fdmFsdWVfaXRlKF9NX3QubG93ZXJfYm91bmQoY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcmVmVChfX3gpKSk7IH0KLSAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCi0gIGl0ZXJhdG9yIHVwcGVyX2JvdW5kKGNvbnN0IF9LVCYgX194KQotICB7IHJldHVybiBfU190b192YWx1ZV9pdGUoX01fdC51cHBlcl9ib3VuZChjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWZUKF9feCkpKTsgfQotICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKLSAgY29uc3RfaXRlcmF0b3IgdXBwZXJfYm91bmQoY29uc3QgX0tUJiBfX3gpIGNvbnN0Ci0gIHsgcmV0dXJuIF9TX3RvX3ZhbHVlX2l0ZShfTV90LnVwcGVyX2JvdW5kKGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3JlZlQoX194KSkpOyB9Ci0gIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAotICBwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4gZXF1YWxfcmFuZ2UoY29uc3QgX0tUJiBfX3gpIHsKLSAgICBwYWlyPGJhc2VfaXRlcmF0b3IsIGJhc2VfaXRlcmF0b3I+IF9fcmV0OwotICAgIF9fcmV0ID0gX01fdC5lcXVhbF9yYW5nZShjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWZUKF9feCkpOwotICAgIHJldHVybiBwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4oX1NfdG9fdmFsdWVfaXRlKF9fcmV0LmZpcnN0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TX3RvX3ZhbHVlX2l0ZShfX3JldC5zZWNvbmQpKTsKLSAgfQotICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKLSAgcGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+IGVxdWFsX3JhbmdlKGNvbnN0IF9LVCYgX194KSBjb25zdCB7Ci0gICAgcGFpcjxjb25zdF9iYXNlX2l0ZXJhdG9yLCBjb25zdF9iYXNlX2l0ZXJhdG9yPiBfX3JldDsKLSAgICBfX3JldCA9IF9NX3QuZXF1YWxfcmFuZ2UoY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcmVmVChfX3gpKTsKLSAgICByZXR1cm4gcGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+KF9TX3RvX3ZhbHVlX2l0ZShfX3JldC5maXJzdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU190b192YWx1ZV9pdGUoX19yZXQuc2Vjb25kKSk7Ci0gIH0KLX07Ci0KLV9TVExQX0VORF9OQU1FU1BBQ0UKLQotI2VuZGlmIC8qIF9TVExQX1BUUl9TUEVDSUFMSVpFRF9TRVRfSCAqLwotCi0vLyBMb2NhbCBWYXJpYWJsZXM6Ci0vLyBtb2RlOkMrKwotLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RsL3BvaW50ZXJzL19zbGlzdC5oIGIvc3RsL3BvaW50ZXJzL19zbGlzdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2ZmMjExLi4wMDAwMDAwCi0tLSBhL3N0bC9wb2ludGVycy9fc2xpc3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDQxMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAzCi0gKiBGcmFuY29pcyBEdW1vbnQKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLQotLyogTk9URTogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgU1RMIGhlYWRlcnMuCi0gKiAgIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LgotICovCi0KLSNpZm5kZWYgX1NUTFBfU1BFQ0lBTElaRURfU0xJU1RfSAotI2RlZmluZSBfU1RMUF9TUEVDSUFMSVpFRF9TTElTVF9ICi0KLSNpZm5kZWYgX1NUTFBfUE9JTlRFUlNfU1BFQ19UT09MU19ICi0jICBpbmNsdWRlIDxzdGwvcG9pbnRlcnMvX3Rvb2xzLmg+Ci0jZW5kaWYKLQotX1NUTFBfQkVHSU5fTkFNRVNQQUNFCi0KLSNkZWZpbmUgU0xJU1RfSU1QTCBfU1RMUF9QVFJfSU1QTF9OQU1FKHNsaXN0KQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCkgJiYgIWRlZmluZWQgKF9TVExQX1VTRV9NU1ZDNl9NRU1fVF9CVUdfV09SS0FST1VORCkKLV9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKLQotX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIF9TbGlzdF9ub2RlPHZvaWQqPjsKLXR5cGVkZWYgX1NsaXN0X25vZGU8dm9pZCo+IF9Wb2lkUHRyU05vZGU7Ci1fU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgX1NUTFBfYWxsb2NfcHJveHk8X1NsaXN0X25vZGVfYmFzZSwgX1ZvaWRQdHJTTm9kZSwgYWxsb2NhdG9yPF9Wb2lkUHRyU05vZGU+ID47Ci1fU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgX1NsaXN0X2Jhc2U8dm9pZCosIGFsbG9jYXRvcjx2b2lkKj4gPjsKLV9TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBTTElTVF9JTVBMPHZvaWQqLCBhbGxvY2F0b3I8dm9pZCo+ID47Ci0KLV9TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9ERUJVRykKLSMgIGRlZmluZSBzbGlzdCBfU1RMUF9OT05fREJHX05BTUUoc2xpc3QpCi1fU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCi0jZW5kaWYKLQotdGVtcGxhdGUgPGNsYXNzIF9UcCwgX1NUTFBfREVGQVVMVF9BTExPQ0FUT1JfU0VMRUNUKF9UcCkgPgotY2xhc3Mgc2xpc3QKLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUEFSVElBTF9TUEVDX1dPUktBUk9VTkQpICYmICFkZWZpbmVkIChzbGlzdCkKLSAgICAgICAgICAgICA6IHB1YmxpYyBfX3N0bHBvcnRfY2xhc3M8c2xpc3Q8X1RwLCBfQWxsb2M+ID4KLSNlbmRpZgotewotICB0eXBlZGVmIHR5cGVuYW1lIF9TVExQX1BSSVYgX1N0b3JhZ2VUeXBlPF9UcD46Ol9UeXBlIF9TdG9yYWdlVHlwZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2NfdHJhaXRzPF9TdG9yYWdlVHlwZSwgX0FsbG9jPjo6YWxsb2NhdG9yX3R5cGUgX1N0b3JhZ2VUeXBlQWxsb2M7Ci0gIHR5cGVkZWYgX1NUTFBfUFJJViBTTElTVF9JTVBMPF9TdG9yYWdlVHlwZSwgX1N0b3JhZ2VUeXBlQWxsb2M+IF9CYXNlOwotICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjppdGVyYXRvciBfQmFzZUl0ZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfaXRlcmF0b3IgX0Jhc2VDb25zdEl0ZTsKLSAgdHlwZWRlZiBzbGlzdDxfVHAsIF9BbGxvYz4gX1NlbGY7Ci0gIHR5cGVkZWYgX1NUTFBfUFJJViBfQ2FzdFRyYWl0czxfU3RvcmFnZVR5cGUsIF9UcD4gY2FzdF90cmFpdHM7Ci0gIHR5cGVkZWYgX1NUTFBfUFJJViBfU2xpc3Rfbm9kZV9iYXNlIF9Ob2RlX2Jhc2U7Ci0KLXB1YmxpYzoKLSAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOwotICB0eXBlZGVmIHZhbHVlX3R5cGUqICAgICAgIHBvaW50ZXI7Ci0gIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSogY29uc3RfcG9pbnRlcjsKLSAgdHlwZWRlZiB2YWx1ZV90eXBlJiAgICAgICByZWZlcmVuY2U7Ci0gIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSYgY29uc3RfcmVmZXJlbmNlOwotICB0eXBlZGVmIHNpemVfdCAgICAgICAgICAgIHNpemVfdHlwZTsKLSAgdHlwZWRlZiBwdHJkaWZmX3QgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7Ci0gIHR5cGVkZWYgZm9yd2FyZF9pdGVyYXRvcl90YWcgX0l0ZXJhdG9yX2NhdGVnb3J5OwotCi0gIHR5cGVkZWYgX1NUTFBfUFJJViBfU2xpc3RfaXRlcmF0b3I8dmFsdWVfdHlwZSwgX05vbmNvbnN0X3RyYWl0czx2YWx1ZV90eXBlPiA+ICBpdGVyYXRvcjsKLSAgdHlwZWRlZiBfU1RMUF9QUklWIF9TbGlzdF9pdGVyYXRvcjx2YWx1ZV90eXBlLCBfQ29uc3RfdHJhaXRzPHZhbHVlX3R5cGU+ID4gICAgIGNvbnN0X2l0ZXJhdG9yOwotCi0gIF9TVExQX0ZPUkNFX0FMTE9DQVRPUlModmFsdWVfdHlwZSwgX0FsbG9jKQotICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY190cmFpdHM8dmFsdWVfdHlwZSwgX0FsbG9jPjo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7Ci0KLXB1YmxpYzoKLSAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0Ci0gIHsgcmV0dXJuIF9TVExQX0NPTlZFUlRfQUxMT0NBVE9SKF9NX2ltcGwuZ2V0X2FsbG9jYXRvcigpLCB2YWx1ZV90eXBlKTsgfQotCi0gIGV4cGxpY2l0IHNsaXN0KGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQotICAgIDogX01faW1wbChfU1RMUF9DT05WRVJUX0FMTE9DQVRPUihfX2EsIF9TdG9yYWdlVHlwZSkpIHt9Ci0KLSNpZiAhZGVmaW5lZChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQotICBleHBsaWNpdCBzbGlzdChzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ggPSBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKHZhbHVlX3R5cGUpLAotI2Vsc2UKLSAgc2xpc3Qoc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX194LAotI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCi0gICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSAgYWxsb2NhdG9yX3R5cGUoKSkKLSAgICA6IF9NX2ltcGwoX19uLCBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWYoX194KSwgX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoX19hLCBfU3RvcmFnZVR5cGUpKSB7fQotCi0jaWYgZGVmaW5lZChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQotICBleHBsaWNpdCBzbGlzdChzaXplX3R5cGUgX19uKSA6IF9NX2ltcGwoX19uKSB7fQotI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQotICAvLyBXZSBkb24ndCBuZWVkIGFueSBkaXNwYXRjaGluZyB0cmlja3MgaGVyZSwgYmVjYXVzZSBfTV9pbnNlcnRfYWZ0ZXJfcmFuZ2UKLSAgLy8gYWxyZWFkeSBkb2VzIHRoZW0uCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KLSAgc2xpc3QoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAotICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hIF9TVExQX0FMTE9DQVRPUl9UWVBFX0RGTCkKLSMgIGlmICFkZWZpbmVkIChfU1RMUF9VU0VfSVRFUkFUT1JfV1JBUFBFUikKLSAgICA6IF9NX2ltcGwoX19maXJzdCwgX19sYXN0LCBfU1RMUF9DT05WRVJUX0FMTE9DQVRPUihfX2EsIF9TdG9yYWdlVHlwZSkpIHt9Ci0jICBlbHNlCi0gICAgOiBfTV9pbXBsKF9TVExQX0NPTlZFUlRfQUxMT0NBVE9SKF9fYSwgX1N0b3JhZ2VUeXBlKSkgewotICAgIGluc2VydF9hZnRlcihiZWZvcmVfYmVnaW4oKSwgX19maXJzdCwgX19sYXN0KTsKLSAgfQotIyAgZW5kaWYKLSMgIGlmIGRlZmluZWQgKF9TVExQX05FRURTX0VYVFJBX1RFTVBMQVRFX0NPTlNUUlVDVE9SUykKLSAgLy8gVkMrKyBuZWVkcyB0aGlzIGNyYXp5bmVzcwotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Ci0gIHNsaXN0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKLSMgICAgaWYgIWRlZmluZWQgKF9TVExQX1VTRV9XUkFQUEVSX0lURVJBVE9SKQotICAgIDogX01faW1wbChfX2ZpcnN0LCBfX2xhc3QpIHt9Ci0jICAgIGVsc2UKLSAgeyBpbnNlcnRfYWZ0ZXIoYmVmb3JlX2JlZ2luKCksIF9fZmlyc3QsIF9fbGFzdCk7IH0KLSMgICAgZW5kaWYKLSMgIGVuZGlmCi0jZWxzZSAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCi0gIHNsaXN0KGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCwKLSAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9ICBhbGxvY2F0b3JfdHlwZSgpICkKLSAgICA6IF9NX2ltcGwoX0Jhc2VDb25zdEl0ZShfX2ZpcnN0Ll9NX25vZGUpLCBfQmFzZUNvbnN0SXRlKF9fbGFzdC5fTV9ub2RlKSwKLSAgICAgICAgICAgICAgX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoX19hLCBfU3RvcmFnZVR5cGUpKSB7fQotICBzbGlzdChjb25zdCB2YWx1ZV90eXBlKiBfX2ZpcnN0LCBjb25zdCB2YWx1ZV90eXBlKiBfX2xhc3QsCi0gICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSAgYWxsb2NhdG9yX3R5cGUoKSkKLSAgICA6IF9NX2ltcGwoY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcHRyKF9fZmlyc3QpLCBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NwdHIoX19sYXN0KSwKLSAgICAgICAgICAgICAgX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoX19hLCBfU3RvcmFnZVR5cGUpKSB7fQotI2VuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KLQotICBzbGlzdChjb25zdCBfU2VsZiYgX194KSA6IF9NX2ltcGwoX194Ll9NX2ltcGwpIHt9Ci0gIHNsaXN0KF9fbW92ZV9zb3VyY2U8X1NlbGY+IHNyYykKLSAgICA6IF9NX2ltcGwoX19tb3ZlX3NvdXJjZTxfQmFzZT4oc3JjLmdldCgpLl9NX2ltcGwpKSB7fQotCi0gIF9TZWxmJiBvcGVyYXRvcj0gKGNvbnN0IF9TZWxmJiBfX3gpIHsgX01faW1wbCA9IF9feC5fTV9pbXBsOyByZXR1cm4gKnRoaXM7IH0KLQotICB2b2lkIGFzc2lnbihzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ZhbCkKLSAgeyBfTV9pbXBsLmFzc2lnbihfX24sIGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3JlZihfX3ZhbCkpOyB9Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQotIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX0lURVJBVE9SX1dSQVBQRVIpCi1wcml2YXRlOgotICB0ZW1wbGF0ZSA8Y2xhc3MgX0ludGVnZXI+Ci0gIHZvaWQgX01fYXNzaWduX2Rpc3BhdGNoKF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX192YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fdHJ1ZV90eXBlJikKLSAgeyBfTV9pbXBsLmFzc2lnbihfX24sIF9fdmFsKTsgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KLSAgdm9pZCBfTV9hc3NpZ25fZGlzcGF0Y2goX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2ZhbHNlX3R5cGUmKSB7Ci0gICAgX01faW1wbC5hc3NpZ24odHlwZW5hbWUgX1NUTFBfUFJJViBfSXRlV3JhcHBlcjxfU3RvcmFnZVR5cGUsIF9UcCwgX0lucHV0SXRlcmF0b3I+OjpfSXRlKF9fZmlyc3QpLAotICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9TVExQX1BSSVYgX0l0ZVdyYXBwZXI8X1N0b3JhZ2VUeXBlLCBfVHAsIF9JbnB1dEl0ZXJhdG9yPjo6X0l0ZShfX2xhc3QpKTsKLSAgfQotCi1wdWJsaWM6Ci0jICBlbmRpZgotCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KLSAgdm9pZCBhc3NpZ24oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KSB7Ci0jICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfSVRFUkFUT1JfV1JBUFBFUikKLSAgICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0ludGVncmFsPF9JbnB1dEl0ZXJhdG9yPjo6X1JldCBfSW50ZWdyYWw7Ci0gICAgX01fYXNzaWduX2Rpc3BhdGNoKF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOwotIyAgZWxzZQotICAgIF9NX2ltcGwuYXNzaWduKF9fZmlyc3QsIF9fbGFzdCk7Ci0jICBlbmRpZgotICB9Ci0jZWxzZQotICB2b2lkIGFzc2lnbihjb25zdCB2YWx1ZV90eXBlICpfX2ZpcnN0LCBjb25zdCB2YWx1ZV90eXBlICpfX2xhc3QpIHsKLSAgICBfTV9pbXBsLmFzc2lnbihjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NwdHIoX19maXJzdCksCi0gICAgICAgICAgICAgICAgICAgY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcHRyKF9fbGFzdCkpOwotICB9Ci0gIHZvaWQgYXNzaWduKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkgewotICAgIF9NX2ltcGwuYXNzaWduKF9CYXNlQ29uc3RJdGUoX19maXJzdC5fTV9ub2RlKSwKLSAgICAgICAgICAgICAgICAgICBfQmFzZUNvbnN0SXRlKF9fbGFzdC5fTV9ub2RlKSk7Ci0gIH0KLSNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCi0KLSAgaXRlcmF0b3IgYmVmb3JlX2JlZ2luKCkgICAgICAgICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX01faW1wbC5iZWZvcmVfYmVnaW4oKS5fTV9ub2RlKTsgfQotICBjb25zdF9pdGVyYXRvciBiZWZvcmVfYmVnaW4oKSBjb25zdCB7IHJldHVybiBjb25zdF9pdGVyYXRvcihjb25zdF9jYXN0PF9Ob2RlX2Jhc2UqPihfTV9pbXBsLmJlZm9yZV9iZWdpbigpLl9NX25vZGUpKTsgfQotCi0gIGl0ZXJhdG9yIGJlZ2luKCkgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9NX2ltcGwuYmVnaW4oKS5fTV9ub2RlKTsgfQotICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0ICAgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihjb25zdF9jYXN0PF9Ob2RlX2Jhc2UqPihfTV9pbXBsLmJlZ2luKCkuX01fbm9kZSkpO30KLQotICBpdGVyYXRvciBlbmQoKSAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBpdGVyYXRvcihfTV9pbXBsLmVuZCgpLl9NX25vZGUpOyB9Ci0gIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0ICAgICAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9NX2ltcGwuZW5kKCkuX01fbm9kZSk7IH0KLQotICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0ICAgICAgeyByZXR1cm4gX01faW1wbC5zaXplKCk7IH0KLSAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgIHsgcmV0dXJuIF9NX2ltcGwubWF4X3NpemUoKTsgfQotICBib29sIGVtcHR5KCkgY29uc3QgICAgICAgICAgeyByZXR1cm4gX01faW1wbC5lbXB0eSgpOyB9Ci0KLSAgdm9pZCBzd2FwKF9TZWxmJiBfX3gpIHsgX01faW1wbC5zd2FwKF9feC5fTV9pbXBsKTsgfQotCi1wdWJsaWM6Ci0gIHJlZmVyZW5jZSBmcm9udCgpICAgICAgICAgICAgIHsgcmV0dXJuICpiZWdpbigpOyB9Ci0gIGNvbnN0X3JlZmVyZW5jZSBmcm9udCgpIGNvbnN0IHsgcmV0dXJuICpiZWdpbigpOyB9Ci0jaWYgIWRlZmluZWQoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkgJiYgIWRlZmluZWQoX1NUTFBfTk9fQU5BQ0hST05JU01TKQotICB2b2lkIHB1c2hfZnJvbnQoY29uc3QgdmFsdWVfdHlwZSYgX194ID0gX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRCh2YWx1ZV90eXBlKSkKLSNlbHNlCi0gIHZvaWQgcHVzaF9mcm9udChjb25zdCB2YWx1ZV90eXBlJiBfX3gpCi0jZW5kaWYgLyohX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSAmJiAhX1NUTFBfTk9fQU5BQ0hST05JU01TKi8KLSAgeyBfTV9pbXBsLnB1c2hfZnJvbnQoY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcmVmKF9feCkpOyB9Ci0KLSMgaWYgZGVmaW5lZChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKSAmJiAhZGVmaW5lZChfU1RMUF9OT19BTkFDSFJPTklTTVMpCi0gIHZvaWQgcHVzaF9mcm9udCgpIHsgX01faW1wbC5wdXNoX2Zyb250KCk7fQotIyBlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0gJiYgIV9TVExQX05PX0FOQUNIUk9OSVNNUyovCi0KLSAgdm9pZCBwb3BfZnJvbnQoKSB7IF9NX2ltcGwucG9wX2Zyb250KCk7IH0KLQotICBpdGVyYXRvciBwcmV2aW91cyhjb25zdF9pdGVyYXRvciBfX3BvcykKLSAgeyByZXR1cm4gaXRlcmF0b3IoX01faW1wbC5wcmV2aW91cyhfQmFzZUNvbnN0SXRlKF9fcG9zLl9NX25vZGUpKS5fTV9ub2RlKTsgfQotICBjb25zdF9pdGVyYXRvciBwcmV2aW91cyhjb25zdF9pdGVyYXRvciBfX3BvcykgY29uc3QKLSAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoY29uc3RfY2FzdDxfTm9kZV9iYXNlKj4oX01faW1wbC5wcmV2aW91cyhfQmFzZUNvbnN0SXRlKF9fcG9zLl9NX25vZGUpKS5fTV9ub2RlKSk7IH0KLQotI2lmICFkZWZpbmVkKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCi0gIGl0ZXJhdG9yIGluc2VydF9hZnRlcihpdGVyYXRvciBfX3BvcywgY29uc3QgdmFsdWVfdHlwZSYgX194ID0gX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRCh2YWx1ZV90eXBlKSkKLSNlbHNlCi0gIGl0ZXJhdG9yIGluc2VydF9hZnRlcihpdGVyYXRvciBfX3BvcywgY29uc3QgdmFsdWVfdHlwZSYgX194KQotI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCi0gIHsgcmV0dXJuIGl0ZXJhdG9yKF9NX2ltcGwuaW5zZXJ0X2FmdGVyKF9CYXNlSXRlKF9fcG9zLl9NX25vZGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWYoX194KSkuX01fbm9kZSk7IH0KLQotI2lmIGRlZmluZWQoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKLSAgaXRlcmF0b3IgaW5zZXJ0X2FmdGVyKGl0ZXJhdG9yIF9fcG9zKQotICB7IHJldHVybiBpdGVyYXRvcihfTV9pbXBsLmluc2VydF9hZnRlcihfQmFzZUl0ZShfX3Bvcy5fTV9ub2RlKSkuX01fbm9kZSk7fQotI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCi0KLSAgdm9pZCBpbnNlcnRfYWZ0ZXIoaXRlcmF0b3IgX19wb3MsIHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKLSAgeyBfTV9pbXBsLmluc2VydF9hZnRlcihfQmFzZUl0ZShfX3Bvcy5fTV9ub2RlKSwgX19uLCBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWYoX194KSk7IH0KLQotI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCi0jICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfSVRFUkFUT1JfV1JBUFBFUikKLXByaXZhdGU6Ci0gIHRlbXBsYXRlIDxjbGFzcyBfSW50ZWdlcj4KLSAgdm9pZCBfTV9pbnNlcnRfYWZ0ZXJfZGlzcGF0Y2goaXRlcmF0b3IgX19wb3MsIF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX192YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fdHJ1ZV90eXBlJikgewotICAgIF9NX2ltcGwuaW5zZXJ0X2FmdGVyKF9CYXNlSXRlKF9fcG9zLl9NX25vZGUpLCBfX24sIF9fdmFsKTsKLSAgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KLSAgdm9pZCBfTV9pbnNlcnRfYWZ0ZXJfZGlzcGF0Y2goaXRlcmF0b3IgX19wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19mYWxzZV90eXBlJikgewotICAgIF9NX2ltcGwuaW5zZXJ0X2FmdGVyKF9CYXNlSXRlKF9fcG9zLl9NX25vZGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9TVExQX1BSSVYgX0l0ZVdyYXBwZXI8X1N0b3JhZ2VUeXBlLCBfVHAsIF9JbnB1dEl0ZXJhdG9yPjo6X0l0ZShfX2ZpcnN0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfU1RMUF9QUklWIF9JdGVXcmFwcGVyPF9TdG9yYWdlVHlwZSwgX1RwLCBfSW5wdXRJdGVyYXRvcj46Ol9JdGUoX19sYXN0KSk7Ci0gIH0KLQotcHVibGljOgotIyAgZW5kaWYKLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Ci0gIHZvaWQgaW5zZXJ0X2FmdGVyKGl0ZXJhdG9yIF9fcG9zLCBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpIHsKLSMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9JVEVSQVRPUl9XUkFQUEVSKQotICAgIC8vIENoZWNrIHdoZXRoZXIgaXQncyBhbiBpbnRlZ3JhbCB0eXBlLiAgSWYgc28sIGl0J3Mgbm90IGFuIGl0ZXJhdG9yLgotICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lzSW50ZWdyYWw8X0lucHV0SXRlcmF0b3I+OjpfUmV0IF9JbnRlZ3JhbDsKLSAgICBfTV9pbnNlcnRfYWZ0ZXJfZGlzcGF0Y2goX19wb3MsIF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOwotIyAgZWxzZQotICAgIF9NX2ltcGwuaW5zZXJ0X2FmdGVyKF9CYXNlSXRlKF9fcG9zLl9NX25vZGUpLCBfX2ZpcnN0LCBfX2xhc3QpOwotIyAgZW5kaWYKLSAgfQotCi0jZWxzZSAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCi0gIHZvaWQgaW5zZXJ0X2FmdGVyKGl0ZXJhdG9yIF9fcG9zLAotICAgICAgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpCi0gIHsgX01faW1wbC5pbnNlcnRfYWZ0ZXIoX0Jhc2VJdGUoX19wb3MuX01fbm9kZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgX0Jhc2VDb25zdEl0ZShfX2ZpcnN0Ll9NX25vZGUpLCBfQmFzZUNvbnN0SXRlKF9fbGFzdC5fTV9ub2RlKSk7IH0KLSAgdm9pZCBpbnNlcnRfYWZ0ZXIoaXRlcmF0b3IgX19wb3MsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlX3R5cGUqIF9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbGFzdCkgewotICAgIF9NX2ltcGwuaW5zZXJ0X2FmdGVyKF9CYXNlSXRlKF9fcG9zLl9NX25vZGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3B0cihfX2ZpcnN0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NwdHIoX19sYXN0KSk7Ci0gIH0KLSNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCi0KLSNpZiAhZGVmaW5lZChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQotICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCA9IF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQodmFsdWVfdHlwZSkpCi0jZWxzZQotICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKLSNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0qLwotICB7IHJldHVybiBpdGVyYXRvcihfTV9pbXBsLmluc2VydChfQmFzZUl0ZShfX3Bvcy5fTV9ub2RlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcmVmKF9feCkpLl9NX25vZGUpOyB9Ci0KLSNpZiBkZWZpbmVkKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCi0gIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBfX3BvcykKLSAgeyByZXR1cm4gaXRlcmF0b3IoX01faW1wbC5pbnNlcnQoX0Jhc2VJdGUoX19wb3MuX01fbm9kZSkpLl9NX25vZGUpOyB9Ci0jZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKi8KLQotICB2b2lkIGluc2VydChpdGVyYXRvciBfX3Bvcywgc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX194KQotICB7IF9NX2ltcGwuaW5zZXJ0KF9CYXNlSXRlKF9fcG9zLl9NX25vZGUpLCBfX24sIGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3JlZihfX3gpKTsgfQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKLSMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9JVEVSQVRPUl9XUkFQUEVSKQotcHJpdmF0ZToKLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2VyPgotICB2b2lkIF9NX2luc2VydF9kaXNwYXRjaChpdGVyYXRvciBfX3BvcywgX0ludGVnZXIgX19uLCBfSW50ZWdlciBfX3ZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX190cnVlX3R5cGUmKSB7Ci0gICAgX01faW1wbC5pbnNlcnQoX0Jhc2VJdGUoX19wb3MuX01fbm9kZSksIF9fbiwgX192YWwpOwotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgotICB2b2lkIF9NX2luc2VydF9kaXNwYXRjaChpdGVyYXRvciBfX3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2ZhbHNlX3R5cGUmKSB7Ci0gICAgX01faW1wbC5pbnNlcnQoX0Jhc2VJdGUoX19wb3MuX01fbm9kZSksIHR5cGVuYW1lIF9TVExQX1BSSVYgX0l0ZVdyYXBwZXI8X1N0b3JhZ2VUeXBlLCBfVHAsIF9JbnB1dEl0ZXJhdG9yPjo6X0l0ZShfX2ZpcnN0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX1NUTFBfUFJJViBfSXRlV3JhcHBlcjxfU3RvcmFnZVR5cGUsIF9UcCwgX0lucHV0SXRlcmF0b3I+OjpfSXRlKF9fbGFzdCkpOwotICB9Ci0KLXB1YmxpYzoKLSMgIGVuZGlmCi0KLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgotICB2b2lkIGluc2VydChpdGVyYXRvciBfX3BvcywgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KSB7Ci0jICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfSVRFUkFUT1JfV1JBUFBFUikKLSAgICAvLyBDaGVjayB3aGV0aGVyIGl0J3MgYW4gaW50ZWdyYWwgdHlwZS4gIElmIHNvLCBpdCdzIG5vdCBhbiBpdGVyYXRvci4KLSAgICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0ludGVncmFsPF9JbnB1dEl0ZXJhdG9yPjo6X1JldCBfSW50ZWdyYWw7Ci0gICAgX01faW5zZXJ0X2Rpc3BhdGNoKF9fcG9zLCBfX2ZpcnN0LCBfX2xhc3QsIF9JbnRlZ3JhbCgpKTsKLSMgIGVsc2UKLSAgICBfTV9pbXBsLmluc2VydChfQmFzZUl0ZShfX3Bvcy5fTV9ub2RlKSwgX19maXJzdCwgX19sYXN0KTsKLSMgIGVuZGlmCi0gIH0KLQotI2Vsc2UgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLwotICB2b2lkIGluc2VydChpdGVyYXRvciBfX3BvcywgY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KQotICB7IF9NX2ltcGwuaW5zZXJ0KF9CYXNlSXRlKF9fcG9zLl9NX25vZGUpLCBfQmFzZUNvbnN0SXRlKF9fZmlyc3QuX01fbm9kZSksIF9CYXNlQ29uc3RJdGUoX19sYXN0Ll9NX25vZGUpKTsgfQotICB2b2lkIGluc2VydChpdGVyYXRvciBfX3BvcywgY29uc3QgdmFsdWVfdHlwZSogX19maXJzdCwgY29uc3QgdmFsdWVfdHlwZSogX19sYXN0KQotICB7IF9NX2ltcGwuaW5zZXJ0KF9CYXNlSXRlKF9fcG9zLl9NX25vZGUpLCBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NwdHIoX19maXJzdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3B0cihfX2xhc3QpKTsgfQotI2VuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KLQotICBpdGVyYXRvciBlcmFzZV9hZnRlcihpdGVyYXRvciBfX3BvcykKLSAgeyByZXR1cm4gaXRlcmF0b3IoX01faW1wbC5lcmFzZV9hZnRlcihfQmFzZUl0ZShfX3Bvcy5fTV9ub2RlKSkuX01fbm9kZSk7IH0KLSAgaXRlcmF0b3IgZXJhc2VfYWZ0ZXIoaXRlcmF0b3IgX19iZWZvcmVfZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkKLSAgeyByZXR1cm4gaXRlcmF0b3IoX01faW1wbC5lcmFzZV9hZnRlcihfQmFzZUl0ZShfX2JlZm9yZV9maXJzdC5fTV9ub2RlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmFzZUl0ZShfX2xhc3QuX01fbm9kZSkpLl9NX25vZGUpOyB9Ci0KLSAgaXRlcmF0b3IgZXJhc2UoaXRlcmF0b3IgX19wb3MpCi0gIHsgcmV0dXJuIGl0ZXJhdG9yKF9NX2ltcGwuZXJhc2UoX0Jhc2VJdGUoX19wb3MuX01fbm9kZSkpLl9NX25vZGUpOyB9Ci0gIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkKLSAgeyByZXR1cm4gaXRlcmF0b3IoX01faW1wbC5lcmFzZShfQmFzZUl0ZShfX2ZpcnN0Ll9NX25vZGUpLCBfQmFzZUl0ZShfX2xhc3QuX01fbm9kZSkpLl9NX25vZGUpOyB9Ci0KLSNpZiAhZGVmaW5lZChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQotICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgX19uZXdfc2l6ZSwgY29uc3QgdmFsdWVfdHlwZSYgX194ID0gX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRCh2YWx1ZV90eXBlKSkKLSNlbHNlCi0gIHZvaWQgcmVzaXplKHNpemVfdHlwZSBfX25ld19zaXplLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCi0jZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKi8KLSAgeyBfTV9pbXBsLnJlc2l6ZShfX25ld19zaXplLCBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWYoX194KSk7fQotCi0jaWYgZGVmaW5lZChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQotICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgX19uZXdfc2l6ZSkgeyBfTV9pbXBsLnJlc2l6ZShfX25ld19zaXplKTsgfQotI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCi0KLSAgdm9pZCBjbGVhcigpIHsgX01faW1wbC5jbGVhcigpOyB9Ci0KLSAgdm9pZCBzcGxpY2VfYWZ0ZXIoaXRlcmF0b3IgX19wb3MsIF9TZWxmJiBfX3gsCi0gICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yIF9fYmVmb3JlX2ZpcnN0LCBpdGVyYXRvciBfX2JlZm9yZV9sYXN0KQotICB7IF9NX2ltcGwuc3BsaWNlX2FmdGVyKF9CYXNlSXRlKF9fcG9zLl9NX25vZGUpLCBfX3guX01faW1wbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBfQmFzZUl0ZShfX2JlZm9yZV9maXJzdC5fTV9ub2RlKSwgX0Jhc2VJdGUoX19iZWZvcmVfbGFzdC5fTV9ub2RlKSk7IH0KLSAgdm9pZCBzcGxpY2VfYWZ0ZXIoaXRlcmF0b3IgX19wb3MsIF9TZWxmJiBfX3gsIGl0ZXJhdG9yIF9fcHJldikKLSAgeyBfTV9pbXBsLnNwbGljZV9hZnRlcihfQmFzZUl0ZShfX3Bvcy5fTV9ub2RlKSwgX194Ll9NX2ltcGwsIF9CYXNlSXRlKF9fcHJldi5fTV9ub2RlKSk7IH0KLSAgdm9pZCBzcGxpY2VfYWZ0ZXIoaXRlcmF0b3IgX19wb3MsIF9TZWxmJiBfX3gpCi0gIHsgX01faW1wbC5zcGxpY2VfYWZ0ZXIoX0Jhc2VJdGUoX19wb3MuX01fbm9kZSksIF9feC5fTV9pbXBsKTsgfQotICB2b2lkIHNwbGljZShpdGVyYXRvciBfX3BvcywgX1NlbGYmIF9feCkKLSAgeyBfTV9pbXBsLnNwbGljZShfQmFzZUl0ZShfX3Bvcy5fTV9ub2RlKSwgX194Ll9NX2ltcGwpOyB9Ci0gIHZvaWQgc3BsaWNlKGl0ZXJhdG9yIF9fcG9zLCBfU2VsZiYgX194LCBpdGVyYXRvciBfX2kpCi0gIHsgX01faW1wbC5zcGxpY2UoX0Jhc2VJdGUoX19wb3MuX01fbm9kZSksIF9feC5fTV9pbXBsLCBfQmFzZUl0ZShfX2kuX01fbm9kZSkpOyB9Ci0gIHZvaWQgc3BsaWNlKGl0ZXJhdG9yIF9fcG9zLCBfU2VsZiYgX194LCBpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpCi0gIHsgX01faW1wbC5zcGxpY2UoX0Jhc2VJdGUoX19wb3MuX01fbm9kZSksIF9feC5fTV9pbXBsLAotICAgICAgICAgICAgICAgICAgIF9CYXNlSXRlKF9fZmlyc3QuX01fbm9kZSksIF9CYXNlSXRlKF9fbGFzdC5fTV9ub2RlKSk7IH0KLQotICB2b2lkIHJldmVyc2UoKSB7IF9NX2ltcGwucmV2ZXJzZSgpOyB9Ci0KLSAgdm9pZCByZW1vdmUoY29uc3QgdmFsdWVfdHlwZSYgX192YWwpIHsgX01faW1wbC5yZW1vdmUoY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcmVmKF9fdmFsKSk7IH0KLSAgdm9pZCB1bmlxdWUoKSAgICAgICAgICAgICAgICAgeyBfTV9pbXBsLnVuaXF1ZSgpOyB9Ci0gIHZvaWQgbWVyZ2UoX1NlbGYmIF9feCkgICAgICAgIHsgX01faW1wbC5tZXJnZShfX3guX01faW1wbCk7IH0KLSAgdm9pZCBzb3J0KCkgICAgICAgICAgICAgICAgICAge19NX2ltcGwuc29ydCgpOyB9Ci0KLSNpZmRlZiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTCi0gIHRlbXBsYXRlIDxjbGFzcyBfUHJlZGljYXRlPgotICB2b2lkIHJlbW92ZV9pZihfUHJlZGljYXRlIF9fcHJlZCkKLSAgeyBfTV9pbXBsLnJlbW92ZV9pZihfU1RMUF9QUklWIF9VbmFyeVByZWRXcmFwcGVyPF9TdG9yYWdlVHlwZSwgX1RwLCBfUHJlZGljYXRlPihfX3ByZWQpKTsgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBfQmluYXJ5UHJlZGljYXRlPgotICB2b2lkIHVuaXF1ZShfQmluYXJ5UHJlZGljYXRlIF9fcHJlZCkKLSAgeyBfTV9pbXBsLnVuaXF1ZShfU1RMUF9QUklWIF9CaW5hcnlQcmVkV3JhcHBlcjxfU3RvcmFnZVR5cGUsIF9UcCwgX0JpbmFyeVByZWRpY2F0ZT4oX19wcmVkKSk7IH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX1N0cmljdFdlYWtPcmRlcmluZz4KLSAgdm9pZCBtZXJnZShfU2VsZiYgX194LCBfU3RyaWN0V2Vha09yZGVyaW5nIF9fY29tcCkKLSAgeyBfTV9pbXBsLm1lcmdlKF9feC5fTV9pbXBsLCBfU1RMUF9QUklWIF9CaW5hcnlQcmVkV3JhcHBlcjxfU3RvcmFnZVR5cGUsIF9UcCwgX1N0cmljdFdlYWtPcmRlcmluZz4oX19jb21wKSk7IH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgX1N0cmljdFdlYWtPcmRlcmluZz4KLSAgdm9pZCBzb3J0KF9TdHJpY3RXZWFrT3JkZXJpbmcgX19jb21wKQotICB7IF9NX2ltcGwuc29ydChfU1RMUF9QUklWIF9CaW5hcnlQcmVkV3JhcHBlcjxfU3RvcmFnZVR5cGUsIF9UcCwgX1N0cmljdFdlYWtPcmRlcmluZz4oX19jb21wKSk7IH0KLSNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCi0KLXByaXZhdGU6Ci0gIF9CYXNlIF9NX2ltcGw7Ci19OwotCi0jaWYgZGVmaW5lZCAoc2xpc3QpCi0jICB1bmRlZiBzbGlzdAotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi0jZW5kaWYKLQotI3VuZGVmIFNMSVNUX0lNUEwKLQotX1NUTFBfRU5EX05BTUVTUEFDRQotCi0jZW5kaWYgLyogX1NUTFBfU1BFQ0lBTElaRURfU0xJU1RfSCAqLwotCi0vLyBMb2NhbCBWYXJpYWJsZXM6Ci0vLyBtb2RlOkMrKwotLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RsL3BvaW50ZXJzL190b29scy5oIGIvc3RsL3BvaW50ZXJzL190b29scy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDJmYzQyLi4wMDAwMDAwCi0tLSBhL3N0bC9wb2ludGVycy9fdG9vbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQwMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAzCi0gKiBGcmFuY29pcyBEdW1vbnQKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLQotLyogTk9URTogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgU1RMIGhlYWRlcnMuCi0gKiAgIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LgotICovCi0KLSNpZm5kZWYgX1NUTFBfUE9JTlRFUlNfU1BFQ19UT09MU19ICi0jZGVmaW5lIF9TVExQX1BPSU5URVJTX1NQRUNfVE9PTFNfSAotCi0jaWZuZGVmIF9TVExQX1RZUEVfVFJBSVRTX0gKLSMgIGluY2x1ZGUgPHN0bC90eXBlX3RyYWl0cy5oPgotI2VuZGlmCi0KLV9TVExQX0JFR0lOX05BTUVTUEFDRQotCi0vL1NvbWUgdXNlZnVsbCBkZWNsYXJhdGlvbnM6Ci10ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgbGVzczsKLQotX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1N0b3JhZ2VULCBjbGFzcyBfVmFsdWVULCBjbGFzcyBfQmluYXJ5UHJlZGljYXRlPgotc3RydWN0IF9CaW5hcnlQcmVkV3JhcHBlcjsKLQotLyoKLSAqIFNpbmNlIHRoZSBjb21waWxlciBvbmx5IGFsbG93cyBhdCBtb3N0IG9uZSBub24tdHJpdmlhbAotICogaW1wbGljaXQgY29udmVyc2lvbiB3ZSBjYW4gbWFrZSB1c2Ugb2YgYSBzaGltIGNsYXNzIHRvCi0gKiBiZSBzdXJlIHRoYXQgZnVuY3Rpb25zIGJlbG93IGRvZXNuJ3QgYWNjZXB0IGNsYXNzZXMgd2l0aAotICogaW1wbGljaXQgcG9pbnRlciBjb252ZXJzaW9uIG9wZXJhdG9ycwotICovCi1zdHJ1Y3QgX0NvbnN0Vm9sYXRpbGVWb2lkUG9pbnRlclNoaW0KLXsgX0NvbnN0Vm9sYXRpbGVWb2lkUG9pbnRlclNoaW0oY29uc3Qgdm9sYXRpbGUgdm9pZCopOyB9OwotCi0vL1RoZSBkaXNwYXRjaCBmdW5jdGlvbnM6Ci1zdHJ1Y3QgX1ZvaWRQb2ludGVyU2hpbQoteyBfVm9pZFBvaW50ZXJTaGltKHZvaWQqKTsgfTsKLXN0cnVjdCBfQ29uc3RWb2lkUG9pbnRlclNoaW0KLXsgX0NvbnN0Vm9pZFBvaW50ZXJTaGltKGNvbnN0IHZvaWQqKTsgfTsKLXN0cnVjdCBfVm9sYXRpbGVWb2lkUG9pbnRlclNoaW0KLXsgX1ZvbGF0aWxlVm9pZFBvaW50ZXJTaGltKHZvbGF0aWxlIHZvaWQqKTsgfTsKLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWNoYXIgX1VzZVZvaWRQdHJTdG9yYWdlVHlwZShjb25zdCBfX2ZhbHNlX3R5cGUmIC8qUE9EKi8sIGNvbnN0IF9UcCYpOwotY2hhciBfVXNlVm9pZFB0clN0b3JhZ2VUeXBlKGNvbnN0IF9fdHJ1ZV90eXBlJiAvKlBPRCovLCAuLi4pOwotY2hhciogX1VzZVZvaWRQdHJTdG9yYWdlVHlwZShjb25zdCBfX3RydWVfdHlwZSYgLypQT0QqLywgX1ZvaWRQb2ludGVyU2hpbSk7Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1jaGFyIF9Vc2VDb25zdFZvaWRQdHJTdG9yYWdlVHlwZShjb25zdCBfX2ZhbHNlX3R5cGUmIC8qUE9EKi8sIGNvbnN0IF9UcCYpOwotY2hhciBfVXNlQ29uc3RWb2lkUHRyU3RvcmFnZVR5cGUoY29uc3QgX190cnVlX3R5cGUmIC8qUE9EKi8sIC4uLik7Ci1jaGFyKiBfVXNlQ29uc3RWb2lkUHRyU3RvcmFnZVR5cGUoY29uc3QgX190cnVlX3R5cGUmIC8qUE9EKi8sIF9Db25zdFZvaWRQb2ludGVyU2hpbSk7Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1jaGFyIF9Vc2VWb2xhdGlsZVZvaWRQdHJTdG9yYWdlVHlwZShjb25zdCBfX2ZhbHNlX3R5cGUmIC8qUE9EKi8sIGNvbnN0IF9UcCYpOwotY2hhciBfVXNlVm9sYXRpbGVWb2lkUHRyU3RvcmFnZVR5cGUoY29uc3QgX190cnVlX3R5cGUmIC8qUE9EKi8sIC4uLik7Ci1jaGFyKiBfVXNlVm9sYXRpbGVWb2lkUHRyU3RvcmFnZVR5cGUoY29uc3QgX190cnVlX3R5cGUmIC8qUE9EKi8sIF9Wb2xhdGlsZVZvaWRQb2ludGVyU2hpbSk7Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1jaGFyIF9Vc2VDb25zdFZvbGF0aWxlVm9pZFB0clN0b3JhZ2VUeXBlKGNvbnN0IF9fZmFsc2VfdHlwZSYgLypQT0QqLywgY29uc3QgX1RwJik7Ci1jaGFyIF9Vc2VDb25zdFZvbGF0aWxlVm9pZFB0clN0b3JhZ2VUeXBlKGNvbnN0IF9fdHJ1ZV90eXBlJiAvKlBPRCovLCAuLi4pOwotY2hhciogX1VzZUNvbnN0Vm9sYXRpbGVWb2lkUHRyU3RvcmFnZVR5cGUoY29uc3QgX190cnVlX3R5cGUmIC8qUE9EKi8sIF9Db25zdFZvbGF0aWxlVm9pZFBvaW50ZXJTaGltKTsKLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLXN0cnVjdCBfU3RvcmFnZVR5cGUgewotICB0eXBlZGVmIHR5cGVuYW1lIF9fdHlwZV90cmFpdHM8X1RwPjo6aXNfUE9EX3R5cGUgX1BPRFR5cGU7Ci0gIHN0YXRpYyBfVHAgX19udWxsX3JlcCgpOwotCi0gIGVudW0geyB1c2Vfdm9pZF9wdHIgPSAoc2l6ZW9mKF9Vc2VWb2lkUHRyU3RvcmFnZVR5cGUoX1BPRFR5cGUoKSwgX19udWxsX3JlcCgpKSkgPT0gc2l6ZW9mKGNoYXIqKSkgfTsKLSAgZW51bSB7IHVzZV9jb25zdF92b2lkX3B0ciA9IChzaXplb2YoX1VzZUNvbnN0Vm9pZFB0clN0b3JhZ2VUeXBlKF9QT0RUeXBlKCksIF9fbnVsbF9yZXAoKSkpID09IHNpemVvZihjaGFyKikpIH07Ci0gIGVudW0geyB1c2Vfdm9sYXRpbGVfdm9pZF9wdHIgPSAoc2l6ZW9mKF9Vc2VWb2xhdGlsZVZvaWRQdHJTdG9yYWdlVHlwZShfUE9EVHlwZSgpLCBfX251bGxfcmVwKCkpKSA9PSBzaXplb2YoY2hhciopKSB9OwotICBlbnVtIHsgdXNlX2NvbnN0X3ZvbGF0aWxlX3ZvaWRfcHRyID0gKHNpemVvZihfVXNlQ29uc3RWb2xhdGlsZVZvaWRQdHJTdG9yYWdlVHlwZShfUE9EVHlwZSgpLCBfX251bGxfcmVwKCkpKSA9PSBzaXplb2YoY2hhciopKSB9OwotCi0gIHR5cGVkZWYgdHlwZW5hbWUgX19zZWxlY3Q8IXVzZV9jb25zdF92b2xhdGlsZV92b2lkX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVHAsCi0gICAgICAgICAgdHlwZW5hbWUgX19zZWxlY3Q8dXNlX3ZvaWRfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqLAotICAgICAgICAgIHR5cGVuYW1lIF9fc2VsZWN0PHVzZV9jb25zdF92b2lkX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiwKLSAgICAgICAgICB0eXBlbmFtZSBfX3NlbGVjdDx1c2Vfdm9sYXRpbGVfdm9pZF9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sYXRpbGUgdm9pZCosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9sYXRpbGUgdm9pZCo+OjpfUmV0ID46Ol9SZXQgPjo6X1JldCA+OjpfUmV0IF9RdWFsaWZpZWRUeXBlOwotCi0jaWYgIWRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pCi0gIC8qIElmIHRoZSBjb21waWxlciBkbyBub3Qgc3VwcG9ydCB0aGUgaXRlcmF0b3JfdHJhaXRzIHN0cnVjdHVyZSB3ZSBjYW5ub3Qgd3JhcAotICAgKiBpdGVyYXRvcnMgcGFzcyB0byBjb250YWluZXIgdGVtcGxhdGUgbWV0aG9kcy4gVGhlIGl0ZXJhdG9yIGRlcmVmZXJlbmNlZCB2YWx1ZQotICAgKiBoYXMgdG8gYmUgc3RvcmFibGUgd2l0aG91dCBhbnkgY2FzdCBpbiB0aGUgY2hvc2VuIHN0b3JhZ2UgdHlwZS4gVG8gZ3VhcmFudHkKLSAgICogdGhhdCB0aGUgdm9pZCBwb2ludGVyIGhhcyB0byBiZSBjb3JyZWN0bHkgcXVhbGlmaWVkLgotICAgKi8KLSAgdHlwZWRlZiBfUXVhbGlmaWVkVHlwZSBfVHlwZTsKLSNlbHNlCi0gIC8qIFdpdGggaXRlcmF0b3JfdHJhaXRzIHdlIGNhbiB3cmFwIHBhc3NlZCBpdGVyYXRvcnMgYW5kIG1ha2UgdGhlIG5lY2Vzc2FyeSBjYXN0cy4KLSAgICogV2UgY2FuIGFsd2F5cyB1c2UgYSBzaW1wbGUgdm9pZCogc3RvcmFnZSB0eXBlOgotICAgKi8KLSAgdHlwZWRlZiB0eXBlbmFtZSBfX3NlbGVjdDx1c2VfY29uc3Rfdm9sYXRpbGVfdm9pZF9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX1RwPjo6X1JldCBfVHlwZTsKLSNlbmRpZgotfTsKLQotdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmU+Ci1zdHJ1Y3QgX0Fzc29jU3RvcmFnZVR5cGVzIHsKLSAgdHlwZWRlZiBfU3RvcmFnZVR5cGU8X1RwPiBfU3RvcmFnZVR5cGVJbmZvOwotICB0eXBlZGVmIHR5cGVuYW1lIF9TdG9yYWdlVHlwZUluZm86Ol9UeXBlIF9TVHlwZTsKLQotICAvL1dlIG5lZWQgdG8gYWxzbyBjaGVjayB0aGF0IHRoZSBjb21wYXJpc29uIGZ1bmN0b3IgdXNlZCB0byBpbnN0YW5jaWF0ZSB0aGUgYXNzb2MgY29udGFpbmVyCi0gIC8vaXMgdGhlIGRlZmF1bHQgU3RhbmRhcmQgbGVzcyBpbXBsZW1lbnRhdGlvbjoKLSAgdHlwZWRlZiB0eXBlbmFtZSBfSXNTVExwb3J0Q2xhc3M8X0NvbXBhcmU+OjpfUmV0IF9TVExwb3J0TGVzczsKLSAgZW51bSB7IGlzX2RlZmF1bHRfbGVzcyA9IF9fdHlwZTJib29sPF9TVExwb3J0TGVzcz46Ol9SZXQgfTsKLQotICB0eXBlZGVmIHR5cGVuYW1lIF9fc2VsZWN0PGlzX2RlZmF1bHRfbGVzcywgX1NUeXBlLCBfVHA+OjpfUmV0IF9LZXlTdG9yYWdlVHlwZTsKLSAgZW51bSB7IHB0cl90eXBlID0gX1N0b3JhZ2VUeXBlSW5mbzo6dXNlX2NvbnN0X3ZvbGF0aWxlX3ZvaWRfcHRyIH07Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX19zZWxlY3Q8aXNfZGVmYXVsdF9sZXNzICYmIHB0cl90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CaW5hcnlQcmVkV3JhcHBlcjxfS2V5U3RvcmFnZVR5cGUsIF9UcCwgX0NvbXBhcmU+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Db21wYXJlPjo6X1JldCBfQ29tcGFyZVN0b3JhZ2VUeXBlOwotfTsKLQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikKLS8qCi0gKiBCYXNlIHN0cnVjdCB0byBkZWFsIHdpdGggcXVhbGlmaWVycwotICovCi10ZW1wbGF0ZSA8Y2xhc3MgX1N0b3JhZ2VULCBjbGFzcyBfUXVhbGlmaWVkU3RvcmFnZVQ+Ci1zdHJ1Y3QgX1ZvaWRDYXN0VHJhaXRzQXV4IHsKLSAgdHlwZWRlZiBfUXVhbGlmaWVkU3RvcmFnZVQgdm9pZF9jdl90eXBlOwotICB0eXBlZGVmIF9TdG9yYWdlVCB2b2lkX3R5cGU7Ci0KLSAgc3RhdGljIHZvaWRfdHlwZSAqIHVuY3ZfcHRyKHZvaWRfY3ZfdHlwZSAqX19wdHIpCi0gIHsgcmV0dXJuIF9fcHRyOyB9Ci0gIHN0YXRpYyB2b2lkX3R5cGUgY29uc3QqIHVuY3ZfY3B0cih2b2lkX2N2X3R5cGUgY29uc3QqX19wdHIpCi0gIHsgcmV0dXJuIF9fcHRyOyB9Ci0gIHN0YXRpYyB2b2lkX3R5cGUgKiogdW5jdl9wcHRyKHZvaWRfY3ZfdHlwZSAqKl9fcHRyKQotICB7IHJldHVybiBfX3B0cjsgfQotICBzdGF0aWMgdm9pZF90eXBlICYgdW5jdl9yZWYodm9pZF9jdl90eXBlICYgX19yZWYpCi0gIHsgcmV0dXJuIF9fcmVmOyB9Ci0gIHN0YXRpYyB2b2lkX3R5cGUgY29uc3QmIHVuY3ZfY3JlZih2b2lkX2N2X3R5cGUgY29uc3QmIF9fcmVmKQotICB7IHJldHVybiBfX3JlZjsgfQotICBzdGF0aWMgdm9pZF9jdl90eXBlKiBjdl9wdHIodm9pZF90eXBlICpfX3B0cikKLSAgeyByZXR1cm4gX19wdHI7IH0KLSAgc3RhdGljIHZvaWRfY3ZfdHlwZSBjb25zdCogY3ZfY3B0cih2b2lkX3R5cGUgY29uc3QqX19wdHIpCi0gIHsgcmV0dXJuIF9fcHRyOyB9Ci0gIHN0YXRpYyB2b2lkX2N2X3R5cGUgKiogY3ZfcHB0cih2b2lkX3R5cGUgKipfX3B0cikKLSAgeyByZXR1cm4gX19wdHI7IH0KLSAgc3RhdGljIHZvaWRfY3ZfdHlwZSAmIGN2X3JlZih2b2lkX3R5cGUgJiBfX3JlZikKLSAgeyByZXR1cm4gX19yZWY7IH0KLSAgc3RhdGljIHZvaWRfY3ZfdHlwZSBjb25zdCYgY3ZfY3JlZih2b2lkX3R5cGUgY29uc3QmIF9fcmVmKQotICB7IHJldHVybiBfX3JlZjsgfQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIF9Wb2lkQ1ZUeXBlPgotc3RydWN0IF9Wb2lkQ2FzdFRyYWl0c0F1eEJhc2UgewotICB0eXBlZGVmIF9Wb2lkQ1ZUeXBlKiB2b2lkX2N2X3R5cGU7Ci0gIHR5cGVkZWYgdm9pZCogdm9pZF90eXBlOwotCi0gIHN0YXRpYyB2b2lkX3R5cGUqIHVuY3ZfcHRyKHZvaWRfY3ZfdHlwZSAqX19wdHIpCi0gIHsgcmV0dXJuIF9fQ09OU1RfQ0FTVCh2b2lkX3R5cGUqLCBfX3B0cik7IH0KLSAgc3RhdGljIHZvaWRfdHlwZSBjb25zdCogdW5jdl9jcHRyKHZvaWRfY3ZfdHlwZSBjb25zdCpfX3B0cikKLSAgeyByZXR1cm4gX19DT05TVF9DQVNUKHZvaWRfdHlwZSBjb25zdCosIF9fcHRyKTsgfQotICBzdGF0aWMgdm9pZF90eXBlKiogdW5jdl9wcHRyKHZvaWRfY3ZfdHlwZSAqKl9fcHRyKQotICB7IHJldHVybiBfX0NPTlNUX0NBU1Qodm9pZF90eXBlKiosIF9fcHRyKTsgfQotICBzdGF0aWMgdm9pZF90eXBlJiB1bmN2X3JlZih2b2lkX2N2X3R5cGUgJl9fcmVmKQotICB7IHJldHVybiBfX0NPTlNUX0NBU1Qodm9pZF90eXBlJiwgX19yZWYpOyB9Ci0gIHN0YXRpYyB2b2lkX3R5cGUgY29uc3QmIHVuY3ZfY3JlZih2b2lkX2N2X3R5cGUgY29uc3QmIF9fcHRyKQotICB7IHJldHVybiBfX0NPTlNUX0NBU1Qodm9pZF90eXBlIGNvbnN0JiwgX19wdHIpOyB9Ci0gIC8vIFRoZSByZXZlcnNlIHZlcnNpb25zCi0gIHN0YXRpYyB2b2lkX2N2X3R5cGUgKiBjdl9wdHIodm9pZF90eXBlICpfX3B0cikKLSAgeyByZXR1cm4gX19DT05TVF9DQVNUKHZvaWRfY3ZfdHlwZSAqLCBfX3B0cik7IH0KLSAgc3RhdGljIHZvaWRfY3ZfdHlwZSBjb25zdCogY3ZfY3B0cih2b2lkX3R5cGUgY29uc3QqX19wdHIpCi0gIHsgcmV0dXJuIF9fQ09OU1RfQ0FTVCh2b2lkX2N2X3R5cGUgY29uc3QqLCBfX3B0cik7IH0KLSAgc3RhdGljIHZvaWRfY3ZfdHlwZSAqKiBjdl9wcHRyKHZvaWRfdHlwZSAqKl9fcHRyKQotICB7IHJldHVybiBfX0NPTlNUX0NBU1Qodm9pZF9jdl90eXBlKiosIF9fcHRyKTsgfQotICBzdGF0aWMgdm9pZF9jdl90eXBlICYgY3ZfcmVmKHZvaWRfdHlwZSAmX19yZWYpCi0gIHsgcmV0dXJuIF9fQ09OU1RfQ0FTVCh2b2lkX2N2X3R5cGUgJiwgX19yZWYpOyB9Ci0gIHN0YXRpYyB2b2lkX2N2X3R5cGUgY29uc3QmIGN2X2NyZWYodm9pZF90eXBlIGNvbnN0JiBfX3JlZikKLSAgeyByZXR1cm4gX19DT05TVF9DQVNUKHZvaWRfY3ZfdHlwZSBjb25zdCYsIF9fcmVmKTsgfQotfTsKLQotX1NUTFBfVEVNUExBVEVfTlVMTAotc3RydWN0IF9Wb2lkQ2FzdFRyYWl0c0F1eDx2b2lkKiwgY29uc3Qgdm9pZCo+IDogX1ZvaWRDYXN0VHJhaXRzQXV4QmFzZTx2b2lkIGNvbnN0Pgote307Ci1fU1RMUF9URU1QTEFURV9OVUxMCi1zdHJ1Y3QgX1ZvaWRDYXN0VHJhaXRzQXV4PHZvaWQqLCB2b2xhdGlsZSB2b2lkKj4gOiBfVm9pZENhc3RUcmFpdHNBdXhCYXNlPHZvaWQgdm9sYXRpbGU+Ci17fTsKLV9TVExQX1RFTVBMQVRFX05VTEwKLXN0cnVjdCBfVm9pZENhc3RUcmFpdHNBdXg8dm9pZCosIGNvbnN0IHZvbGF0aWxlIHZvaWQqPiA6IF9Wb2lkQ2FzdFRyYWl0c0F1eEJhc2U8dm9pZCBjb25zdCB2b2xhdGlsZT4KLXt9OwotCi10ZW1wbGF0ZSA8Y2xhc3MgX1N0b3JhZ2VULCBjbGFzcyBfVmFsdWVUPgotc3RydWN0IF9DYXN0VHJhaXRzIHsKLSAgdHlwZWRlZiBfVmFsdWVUIHZhbHVlX3R5cGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1N0b3JhZ2VUeXBlPF9WYWx1ZVQ+OjpfUXVhbGlmaWVkVHlwZSBfUXVhbGlmaWVkU3RvcmFnZVQ7Ci0gIHR5cGVkZWYgX1ZvaWRDYXN0VHJhaXRzQXV4PF9TdG9yYWdlVCwgX1F1YWxpZmllZFN0b3JhZ2VUPiBjdl90cmFpdHM7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgY3ZfdHJhaXRzOjp2b2lkX3R5cGUgdm9pZF90eXBlOwotICB0eXBlZGVmIHR5cGVuYW1lIGN2X3RyYWl0czo6dm9pZF9jdl90eXBlIHZvaWRfY3ZfdHlwZTsKLQotICBzdGF0aWMgdmFsdWVfdHlwZSAqIHRvX3ZhbHVlX3R5cGVfcHRyKHZvaWRfdHlwZSAqX19wdHIpCi0gIHsgcmV0dXJuIF9fUkVJTlRFUlBSRVRfQ0FTVCh2YWx1ZV90eXBlICosIGN2X3RyYWl0czo6Y3ZfcHRyKF9fcHRyKSk7IH0KLSAgc3RhdGljIHZhbHVlX3R5cGUgY29uc3QqIHRvX3ZhbHVlX3R5cGVfY3B0cih2b2lkX3R5cGUgY29uc3QqX19wdHIpCi0gIHsgcmV0dXJuIF9fUkVJTlRFUlBSRVRfQ0FTVCh2YWx1ZV90eXBlIGNvbnN0KiwgY3ZfdHJhaXRzOjpjdl9jcHRyKF9fcHRyKSk7IH0KLSAgc3RhdGljIHZhbHVlX3R5cGUgKiogdG9fdmFsdWVfdHlwZV9wcHRyKHZvaWRfdHlwZSAqKl9fcHRyKQotICB7IHJldHVybiBfX1JFSU5URVJQUkVUX0NBU1QodmFsdWVfdHlwZSAqKiwgY3ZfdHJhaXRzOjpjdl9wcHRyKF9fcHRyKSk7IH0KLSAgc3RhdGljIHZhbHVlX3R5cGUgJiB0b192YWx1ZV90eXBlX3JlZih2b2lkX3R5cGUgJl9fcmVmKQotICB7IHJldHVybiBfX1JFSU5URVJQUkVUX0NBU1QodmFsdWVfdHlwZSAmLCBjdl90cmFpdHM6OmN2X3JlZihfX3JlZikpOyB9Ci0gIHN0YXRpYyB2YWx1ZV90eXBlIGNvbnN0JiB0b192YWx1ZV90eXBlX2NyZWYodm9pZF90eXBlIGNvbnN0JiBfX3B0cikKLSAgeyByZXR1cm4gX19SRUlOVEVSUFJFVF9DQVNUKHZhbHVlX3R5cGUgY29uc3QmLCBjdl90cmFpdHM6OmN2X2NyZWYoX19wdHIpKTsgfQotICAvLyBSZXZlcnNlIHZlcnNpb25zCi0gIHN0YXRpYyB2b2lkX3R5cGUgKiB0b19zdG9yYWdlX3R5cGVfcHRyKHZhbHVlX3R5cGUgKl9fcHRyKQotICB7IHJldHVybiBjdl90cmFpdHM6OnVuY3ZfcHRyKF9fUkVJTlRFUlBSRVRfQ0FTVCh2b2lkX2N2X3R5cGUgKiwgX19wdHIpKTsgfQotICBzdGF0aWMgdm9pZF90eXBlIGNvbnN0KiB0b19zdG9yYWdlX3R5cGVfY3B0cih2YWx1ZV90eXBlIGNvbnN0Kl9fcHRyKQotICB7IHJldHVybiBjdl90cmFpdHM6OnVuY3ZfY3B0cihfX1JFSU5URVJQUkVUX0NBU1Qodm9pZF9jdl90eXBlIGNvbnN0KiwgX19wdHIpKTsgfQotICBzdGF0aWMgdm9pZF90eXBlICoqIHRvX3N0b3JhZ2VfdHlwZV9wcHRyKHZhbHVlX3R5cGUgKipfX3B0cikKLSAgeyByZXR1cm4gY3ZfdHJhaXRzOjp1bmN2X3BwdHIoX19SRUlOVEVSUFJFVF9DQVNUKHZvaWRfY3ZfdHlwZSAqKiwgX19wdHIpKTsgfQotICBzdGF0aWMgdm9pZF90eXBlIGNvbnN0JiB0b19zdG9yYWdlX3R5cGVfY3JlZih2YWx1ZV90eXBlIGNvbnN0JiBfX3JlZikKLSAgeyByZXR1cm4gY3ZfdHJhaXRzOjp1bmN2X2NyZWYoX19SRUlOVEVSUFJFVF9DQVNUKHZvaWRfY3ZfdHlwZSBjb25zdCYsIF9fcmVmKSk7IH0KLQotICAvL01ldGhvZCB1c2VkIHRvIHRyZWF0IHNldCBjb250YWluZXIgdGVtcGxhdGUgbWV0aG9kIGV4dGVuc2lvbgotICBzdGF0aWMgdm9pZF90eXBlIGNvbnN0JiB0b19zdG9yYWdlX3R5cGVfY3JlZlQodmFsdWVfdHlwZSBjb25zdCYgX19yZWYpCi0gIHsgcmV0dXJuIHRvX3N0b3JhZ2VfdHlwZV9jcmVmKF9fcmVmKTsgfQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLXN0cnVjdCBfQ2FzdFRyYWl0czxfVHAsIF9UcD4gewotICB0eXBlZGVmIF9UcCBzdG9yYWdlX3R5cGU7Ci0gIHR5cGVkZWYgX1RwIHZhbHVlX3R5cGU7Ci0KLSAgc3RhdGljIHZhbHVlX3R5cGUgKiB0b192YWx1ZV90eXBlX3B0cihzdG9yYWdlX3R5cGUgKl9fcHRyKQotICB7IHJldHVybiBfX3B0cjsgfQotICBzdGF0aWMgdmFsdWVfdHlwZSBjb25zdCogdG9fdmFsdWVfdHlwZV9jcHRyKHN0b3JhZ2VfdHlwZSBjb25zdCpfX3B0cikKLSAgeyByZXR1cm4gX19wdHI7IH0KLSAgc3RhdGljIHZhbHVlX3R5cGUgKiogdG9fdmFsdWVfdHlwZV9wcHRyKHN0b3JhZ2VfdHlwZSAqKl9fcHRyKQotICB7IHJldHVybiBfX3B0cjsgfQotICBzdGF0aWMgdmFsdWVfdHlwZSAmIHRvX3ZhbHVlX3R5cGVfcmVmKHN0b3JhZ2VfdHlwZSAmX19yZWYpCi0gIHsgcmV0dXJuIF9fcmVmOyB9Ci0gIHN0YXRpYyB2YWx1ZV90eXBlIGNvbnN0JiB0b192YWx1ZV90eXBlX2NyZWYoc3RvcmFnZV90eXBlIGNvbnN0Jl9fcmVmKQotICB7IHJldHVybiBfX3JlZjsgfQotICAvLyBSZXZlcnNlIHZlcnNpb25zCi0gIHN0YXRpYyBzdG9yYWdlX3R5cGUgKiB0b19zdG9yYWdlX3R5cGVfcHRyKHZhbHVlX3R5cGUgKl9fcHRyKQotICB7IHJldHVybiBfX3B0cjsgfQotICBzdGF0aWMgc3RvcmFnZV90eXBlIGNvbnN0KiB0b19zdG9yYWdlX3R5cGVfY3B0cih2YWx1ZV90eXBlIGNvbnN0Kl9fcHRyKQotICB7IHJldHVybiBfX3B0cjsgfQotICBzdGF0aWMgc3RvcmFnZV90eXBlICoqIHRvX3N0b3JhZ2VfdHlwZV9wcHRyKHZhbHVlX3R5cGUgKipfX3B0cikKLSAgeyByZXR1cm4gX19wdHI7IH0KLSAgc3RhdGljIHN0b3JhZ2VfdHlwZSBjb25zdCYgdG9fc3RvcmFnZV90eXBlX2NyZWYodmFsdWVfdHlwZSBjb25zdCYgX19yZWYpCi0gIHsgcmV0dXJuIF9fcmVmOyB9Ci0KLSAgLy9NZXRob2QgdXNlZCB0byB0cmVhdCBzZXQgY29udGFpbmVyIHRlbXBsYXRlIG1ldGhvZCBleHRlbnNpb24KLSAgdGVtcGxhdGUgPGNsYXNzIF9UcDE+Ci0gIHN0YXRpYyBfVHAxIGNvbnN0JiB0b19zdG9yYWdlX3R5cGVfY3JlZlQoX1RwMSBjb25zdCYgX19yZWYpCi0gIHsgcmV0dXJuIF9fcmVmOyB9Ci19OwotCi0jZGVmaW5lIF9TVExQX1VTRV9JVEVSQVRPUl9XUkFQUEVSCi0KLXRlbXBsYXRlIDxjbGFzcyBfU3RvcmFnZVQsIGNsYXNzIF9WYWx1ZVQsIGNsYXNzIF9JdGVyYXRvcj4KLXN0cnVjdCBfSXRlV3JhcHBlciB7Ci0gIHR5cGVkZWYgX0Nhc3RUcmFpdHM8X1N0b3JhZ2VULCBfVmFsdWVUPiBjYXN0X3RyYWl0czsKLSAgdHlwZWRlZiBpdGVyYXRvcl90cmFpdHM8X0l0ZXJhdG9yPiBfSXRlVHJhaXRzOwotCi0gIHR5cGVkZWYgdHlwZW5hbWUgX0l0ZVRyYWl0czo6aXRlcmF0b3JfY2F0ZWdvcnkgaXRlcmF0b3JfY2F0ZWdvcnk7Ci0gIHR5cGVkZWYgX1N0b3JhZ2VUIHZhbHVlX3R5cGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0l0ZVRyYWl0czo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKLSAgdHlwZWRlZiB2YWx1ZV90eXBlKiBwb2ludGVyOwotICB0eXBlZGVmIHZhbHVlX3R5cGUgY29uc3QmIGNvbnN0X3JlZmVyZW5jZTsKLSAgLy9UaGlzIHdyYXBwZXIgd29uJ3QgYmUgdXNlZCBmb3IgaW5wdXQgc28gdG8gYXZvaWQgc3VycHJpc2UKLSAgLy90aGUgcmVmZXJlbmNlIHR5cGUgd2lsbCBiZSBhIGNvbnN0IHJlZmVyZW5jZToKLSAgdHlwZWRlZiBjb25zdF9yZWZlcmVuY2UgcmVmZXJlbmNlOwotCi0gIHR5cGVkZWYgX0l0ZVdyYXBwZXI8X1N0b3JhZ2VULCBfVmFsdWVULCBfSXRlcmF0b3I+IF9TZWxmOwotICB0eXBlZGVmIF9TZWxmIF9JdGU7Ci0KLSAgX0l0ZVdyYXBwZXIoX0l0ZXJhdG9yICZfX2l0ZSkgOiBfTV9pdGUoX19pdGUpIHt9Ci0KLSAgY29uc3RfcmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3JlZigqX01faXRlKTsgfQotCi0gIF9TZWxmJiBvcGVyYXRvcj0gKF9TZWxmIGNvbnN0JiBfX3JocykgewotICAgIF9NX2l0ZSA9IF9fcmhzLl9NX2l0ZTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBfU2VsZiYgb3BlcmF0b3IrKygpIHsKLSAgICArK19NX2l0ZTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBfU2VsZiYgb3BlcmF0b3ItLSgpIHsKLSAgICAtLV9NX2l0ZTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBfU2VsZiYgb3BlcmF0b3IgKz0gKGRpZmZlcmVuY2VfdHlwZSBfX29mZnNldCkgewotICAgIF9NX2l0ZSArPSBfX29mZnNldDsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgZGlmZmVyZW5jZV90eXBlIG9wZXJhdG9yIC0oX1NlbGYgY29uc3QmIF9fb3RoZXIpIGNvbnN0Ci0gIHsgcmV0dXJuIF9NX2l0ZSAtIF9fb3RoZXIuX01faXRlOyB9Ci0KLSAgYm9vbCBvcGVyYXRvciA9PSAoX1NlbGYgY29uc3QmIF9fb3RoZXIpIGNvbnN0Ci0gIHsgcmV0dXJuIF9NX2l0ZSA9PSBfX290aGVyLl9NX2l0ZTsgfQotCi0gIGJvb2wgb3BlcmF0b3IgIT0gKF9TZWxmIGNvbnN0JiBfX290aGVyKSBjb25zdAotICB7IHJldHVybiBfTV9pdGUgIT0gX19vdGhlci5fTV9pdGU7IH0KLQotICBib29sIG9wZXJhdG9yIDwgKF9TZWxmIGNvbnN0JiBfX3JocykgY29uc3QKLSAgeyByZXR1cm4gX01faXRlIDwgX19yaHMuX01faXRlOyB9Ci0KLXByaXZhdGU6Ci0gIF9JdGVyYXRvciBfTV9pdGU7Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfSXRlcmF0b3I+Ci1zdHJ1Y3QgX0l0ZVdyYXBwZXI8X1RwLCBfVHAsIF9JdGVyYXRvcj4KLXsgdHlwZWRlZiBfSXRlcmF0b3IgX0l0ZTsgfTsKLQotI2Vsc2UKLQotLyoKLSAqIEluIHRoaXMgY29uZmlnIHRoZSBzdG9yYWdlIHR5cGUgaXMgcXVhbGlmaWVkIGluIHJlc3BlY3Qgb2YgdGhlCi0gKiB2YWx1ZV90eXBlIHF1YWxpZmljYXRpb24uIFNpbXBsZSByZWludGVycHJldF9jYXN0IGlzIGVub3VnaC4KLSAqLwotdGVtcGxhdGUgPGNsYXNzIF9TdG9yYWdlVCwgY2xhc3MgX1ZhbHVlVD4KLXN0cnVjdCBfQ2FzdFRyYWl0cyB7Ci0gIHR5cGVkZWYgX1N0b3JhZ2VUIHN0b3JhZ2VfdHlwZTsKLSAgdHlwZWRlZiBfVmFsdWVUIHZhbHVlX3R5cGU7Ci0KLSAgc3RhdGljIHZhbHVlX3R5cGUgKiB0b192YWx1ZV90eXBlX3B0cihzdG9yYWdlX3R5cGUgKl9fcHRyKQotICB7IHJldHVybiBfX1JFSU5URVJQUkVUX0NBU1QodmFsdWVfdHlwZSosIF9fcHRyKTsgfQotICBzdGF0aWMgdmFsdWVfdHlwZSBjb25zdCogdG9fdmFsdWVfdHlwZV9jcHRyKHN0b3JhZ2VfdHlwZSBjb25zdCpfX3B0cikKLSAgeyByZXR1cm4gX19SRUlOVEVSUFJFVF9DQVNUKHZhbHVlX3R5cGUgY29uc3QqLCBfX3B0cik7IH0KLSAgc3RhdGljIHZhbHVlX3R5cGUgKiogdG9fdmFsdWVfdHlwZV9wcHRyKHN0b3JhZ2VfdHlwZSAqKl9fcHRyKQotICB7IHJldHVybiBfX1JFSU5URVJQUkVUX0NBU1QodmFsdWVfdHlwZSAqKiwgX19wdHIpOyB9Ci0gIHN0YXRpYyB2YWx1ZV90eXBlICYgdG9fdmFsdWVfdHlwZV9yZWYoc3RvcmFnZV90eXBlICZfX3JlZikKLSAgeyByZXR1cm4gX19SRUlOVEVSUFJFVF9DQVNUKHZhbHVlX3R5cGUmLCBfX3JlZik7IH0KLSAgc3RhdGljIHZhbHVlX3R5cGUgY29uc3QmIHRvX3ZhbHVlX3R5cGVfY3JlZihzdG9yYWdlX3R5cGUgY29uc3QmX19yZWYpCi0gIHsgcmV0dXJuIF9fUkVJTlRFUlBSRVRfQ0FTVCh2YWx1ZV90eXBlIGNvbnN0JiwgX19yZWYpOyB9Ci0gIC8vIFJldmVyc2UgdmVyc2lvbnMKLSAgc3RhdGljIHN0b3JhZ2VfdHlwZSAqIHRvX3N0b3JhZ2VfdHlwZV9wdHIodmFsdWVfdHlwZSAqX19wdHIpCi0gIHsgcmV0dXJuIF9fUkVJTlRFUlBSRVRfQ0FTVChzdG9yYWdlX3R5cGUqLCBfX3B0cik7IH0KLSAgc3RhdGljIHN0b3JhZ2VfdHlwZSBjb25zdCogdG9fc3RvcmFnZV90eXBlX2NwdHIodmFsdWVfdHlwZSBjb25zdCpfX3B0cikKLSAgeyByZXR1cm4gX19SRUlOVEVSUFJFVF9DQVNUKHN0b3JhZ2VfdHlwZSBjb25zdCosIF9fcHRyKTsgfQotICBzdGF0aWMgc3RvcmFnZV90eXBlICoqIHRvX3N0b3JhZ2VfdHlwZV9wcHRyKHZhbHVlX3R5cGUgKipfX3B0cikKLSAgeyByZXR1cm4gX19SRUlOVEVSUFJFVF9DQVNUKHN0b3JhZ2VfdHlwZSAqKiwgX19wdHIpOyB9Ci0gIHN0YXRpYyBzdG9yYWdlX3R5cGUgY29uc3QmIHRvX3N0b3JhZ2VfdHlwZV9jcmVmKHZhbHVlX3R5cGUgY29uc3QmX19yZWYpCi0gIHsgcmV0dXJuIF9fUkVJTlRFUlBSRVRfQ0FTVChzdG9yYWdlX3R5cGUgY29uc3QmLCBfX3JlZik7IH0KLSAgdGVtcGxhdGUgPGNsYXNzIF9UcDE+Ci0gIHN0YXRpYyBfVHAxIGNvbnN0JiB0b19zdG9yYWdlX3R5cGVfY3JlZlQoX1RwMSBjb25zdCYgX19yZWYpCi0gIHsgcmV0dXJuIF9fcmVmOyB9Ci19OwotCi0jZW5kaWYKLQotLy9XcmFwcGVyIGZ1bmN0b3JzOgotdGVtcGxhdGUgPGNsYXNzIF9TdG9yYWdlVCwgY2xhc3MgX1ZhbHVlVCwgY2xhc3MgX1VuYXJ5UHJlZGljYXRlPgotc3RydWN0IF9VbmFyeVByZWRXcmFwcGVyIHsKLSAgdHlwZWRlZiBfQ2FzdFRyYWl0czxfU3RvcmFnZVQsIF9WYWx1ZVQ+IGNhc3RfdHJhaXRzOwotCi0gIF9VbmFyeVByZWRXcmFwcGVyIChfVW5hcnlQcmVkaWNhdGUgY29uc3QmIF9fcHJlZCkgOiBfTV9wcmVkKF9fcHJlZCkge30KLQotICBib29sIG9wZXJhdG9yICgpIChfU3RvcmFnZVQgY29uc3QmIF9fcmVmKSBjb25zdAotICB7IHJldHVybiBfTV9wcmVkKGNhc3RfdHJhaXRzOjp0b192YWx1ZV90eXBlX2NyZWYoX19yZWYpKTsgfQotCi1wcml2YXRlOgotICBfVW5hcnlQcmVkaWNhdGUgX01fcHJlZDsKLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBfU3RvcmFnZVQsIGNsYXNzIF9WYWx1ZVQsIGNsYXNzIF9CaW5hcnlQcmVkaWNhdGU+Ci1zdHJ1Y3QgX0JpbmFyeVByZWRXcmFwcGVyIHsKLSAgdHlwZWRlZiBfQ2FzdFRyYWl0czxfU3RvcmFnZVQsIF9WYWx1ZVQ+IGNhc3RfdHJhaXRzOwotCi0gIF9CaW5hcnlQcmVkV3JhcHBlciAoKSB7fQotICBfQmluYXJ5UHJlZFdyYXBwZXIgKF9CaW5hcnlQcmVkaWNhdGUgY29uc3QmIF9fcHJlZCkgOiBfTV9wcmVkKF9fcHJlZCkge30KLQotICBfQmluYXJ5UHJlZGljYXRlIGdldF9wcmVkKCkgY29uc3QgeyByZXR1cm4gX01fcHJlZDsgfQotCi0gIGJvb2wgb3BlcmF0b3IgKCkgKF9TdG9yYWdlVCBjb25zdCYgX19mc3QsIF9TdG9yYWdlVCBjb25zdCYgX19zbmQpIGNvbnN0Ci0gIHsgcmV0dXJuIF9NX3ByZWQoY2FzdF90cmFpdHM6OnRvX3ZhbHVlX3R5cGVfY3JlZihfX2ZzdCksIGNhc3RfdHJhaXRzOjp0b192YWx1ZV90eXBlX2NyZWYoX19zbmQpKTsgfQotCi0gIC8vQ2FzdCBvcGVyYXRvciB1c2VkIHRvIHRyYW5zcGFyZW50bHkgYWNjZXNzIHVuZGVybHlpbmcgcHJlZGljYXRlCi0gIC8vaW4gc2V0OjprZXlfY29tcCgpIG1ldGhvZAotICBvcGVyYXRvciBfQmluYXJ5UHJlZGljYXRlKCkgY29uc3QKLSAgeyByZXR1cm4gX01fcHJlZDsgfQotCi1wcml2YXRlOgotICBfQmluYXJ5UHJlZGljYXRlIF9NX3ByZWQ7Ci19OwotCi1fU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKLQotX1NUTFBfRU5EX05BTUVTUEFDRQotCi0jZW5kaWYgLyogX1NUTFBfUE9JTlRFUlNfU1BFQ19UT09MU19IICovCmRpZmYgLS1naXQgYS9zdGwvcG9pbnRlcnMvX3ZlY3Rvci5oIGIvc3RsL3BvaW50ZXJzL192ZWN0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRlNGMwMC4uMDAwMDAwMAotLS0gYS9zdGwvcG9pbnRlcnMvX3ZlY3Rvci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjM4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMKLSAqIEZyYW5jb2lzIER1bW9udAotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0vKiBOT1RFOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBTVEwgaGVhZGVycy4KLSAqICAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuCi0gKi8KLQotI2lmbmRlZiBfU1RMUF9TUEVDSUFMSVpFRF9WRUNUT1JfSAotI2RlZmluZSBfU1RMUF9TUEVDSUFMSVpFRF9WRUNUT1JfSAotCi0jaWZuZGVmIF9TVExQX1BPSU5URVJTX1NQRUNfVE9PTFNfSAotIyAgaW5jbHVkZSA8c3RsL3BvaW50ZXJzL190b29scy5oPgotI2VuZGlmCi0KLV9TVExQX0JFR0lOX05BTUVTUEFDRQotCi0jZGVmaW5lIFZFQ1RPUl9JTVBMIF9TVExQX1BUUl9JTVBMX05BTUUodmVjdG9yKQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCkgJiYgIWRlZmluZWQgKF9TVExQX1VTRV9NU1ZDNl9NRU1fVF9CVUdfV09SS0FST1VORCkKLV9TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBfU1RMUF9QUklWIF9WZWN0b3JfYmFzZTx2b2lkKixhbGxvY2F0b3I8dm9pZCo+ID47Ci1fU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgX1NUTFBfUFJJViBWRUNUT1JfSU1QTDx2b2lkKiwgYWxsb2NhdG9yPHZvaWQqPiA+OwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9ERUJVRykKLSMgIGRlZmluZSB2ZWN0b3IgX1NUTFBfTk9OX0RCR19OQU1FKHZlY3RvcikKLV9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKLSNlbmRpZgotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBfU1RMUF9ERUZBVUxUX0FMTE9DQVRPUl9TRUxFQ1QoX1RwKSA+Ci1jbGFzcyB2ZWN0b3IKLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUEFSVElBTF9TUEVDX1dPUktBUk9VTkQpICYmICFkZWZpbmVkICh2ZWN0b3IpCi0gICAgICAgICAgICAgOiBwdWJsaWMgX19zdGxwb3J0X2NsYXNzPHZlY3RvcjxfVHAsIF9BbGxvYz4gPgotI2VuZGlmCi17Ci0gIC8qIEluIHRoZSB2ZWN0b3IgaW1wbGVtZW50YXRpb24gaXRlcmF0b3JzIGFyZSBwb2ludGVyIHdoaWNoIGdpdmUgYSBudW1iZXIKLSAgICogb2Ygb3Bwb3J0dW5pdGllcyBmb3Igb3B0aW1pemF0aW9uLiBUbyBub3QgYnJlYWsgdGhvc2Ugb3B0aW1pemF0aW9ucwotICAgKiBpdGVyYXRvcnMgcGFzc2VkIHRvIHRlbXBsYXRlIHNob3VsZCBub3QgYmUgd3JhcHBlZCBmb3IgY2FzdGluZyBwdXJwb3NlLgotICAgKiBTbyB2ZWN0b3IgaW1wbGVtZW50YXRpb24gd2lsbCBhbHdheXMgdXNlIGEgcXVhbGlmaWVkIHZvaWQgcG9pbnRlciB0eXBlIGFuZAotICAgKiB3b24ndCB1c2UgaXRlcmF0b3Igd3JhcHBpbmcuCi0gICAqLwotICB0eXBlZGVmIHR5cGVuYW1lIF9TVExQX1BSSVYgX1N0b3JhZ2VUeXBlPF9UcD46Ol9RdWFsaWZpZWRUeXBlIF9TdG9yYWdlVHlwZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2NfdHJhaXRzPF9TdG9yYWdlVHlwZSwgX0FsbG9jPjo6YWxsb2NhdG9yX3R5cGUgX1N0b3JhZ2VUeXBlQWxsb2M7Ci0gIHR5cGVkZWYgX1NUTFBfUFJJViBWRUNUT1JfSU1QTDxfU3RvcmFnZVR5cGUsIF9TdG9yYWdlVHlwZUFsbG9jPiBfQmFzZTsKLSAgdHlwZWRlZiB2ZWN0b3I8X1RwLCBfQWxsb2M+IF9TZWxmOwotCi0gIHR5cGVkZWYgX1NUTFBfUFJJViBfQ2FzdFRyYWl0czxfU3RvcmFnZVR5cGUsIF9UcD4gY2FzdF90cmFpdHM7Ci0KLXB1YmxpYzoKLSAgdHlwZWRlZiBfVHAgdmFsdWVfdHlwZTsKLSAgdHlwZWRlZiB2YWx1ZV90eXBlKiBwb2ludGVyOwotICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUqIGNvbnN0X3BvaW50ZXI7Ci0gIHR5cGVkZWYgdmFsdWVfdHlwZSogaXRlcmF0b3I7Ci0gIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSogY29uc3RfaXRlcmF0b3I7Ci0gIHR5cGVkZWYgdmFsdWVfdHlwZSYgcmVmZXJlbmNlOwotICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmIGNvbnN0X3JlZmVyZW5jZTsKLSAgdHlwZWRlZiBzaXplX3Qgc2l6ZV90eXBlOwotICB0eXBlZGVmIHB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7Ci0gIHR5cGVkZWYgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgX0l0ZXJhdG9yX2NhdGVnb3J5OwotCi0gIF9TVExQX0RFQ0xBUkVfUkFORE9NX0FDQ0VTU19SRVZFUlNFX0lURVJBVE9SUzsKLSAgX1NUTFBfRk9SQ0VfQUxMT0NBVE9SUyh2YWx1ZV90eXBlLCBfQWxsb2MpCi0gIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jX3RyYWl0czx2YWx1ZV90eXBlLCBfQWxsb2M+OjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKLQotICBhbGxvY2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9yKCkgY29uc3QKLSAgeyByZXR1cm4gX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoX01faW1wbC5nZXRfYWxsb2NhdG9yKCksIHZhbHVlX3R5cGUpOyB9Ci0KLSAgaXRlcmF0b3IgYmVnaW4oKSAgICAgICAgICAgICB7IHJldHVybiBjYXN0X3RyYWl0czo6dG9fdmFsdWVfdHlwZV9wdHIoX01faW1wbC5iZWdpbigpKTsgfQotICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGNhc3RfdHJhaXRzOjp0b192YWx1ZV90eXBlX2NwdHIoX01faW1wbC5iZWdpbigpKTsgfQotICBpdGVyYXRvciBlbmQoKSAgICAgICAgICAgICAgIHsgcmV0dXJuIGNhc3RfdHJhaXRzOjp0b192YWx1ZV90eXBlX3B0cihfTV9pbXBsLmVuZCgpKTsgfQotICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCAgIHsgcmV0dXJuIGNhc3RfdHJhaXRzOjp0b192YWx1ZV90eXBlX2NwdHIoX01faW1wbC5lbmQoKSk7IH0KLQotICByZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpICAgICAgICAgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQotICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0ICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQotICByZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSAgICAgICAgICAgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9Ci0gIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0ICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KLQotICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0ICAgICAgICB7IHJldHVybiBfTV9pbXBsLnNpemUoKTsgfQotICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCAgICB7IHJldHVybiBfTV9pbXBsLm1heF9zaXplKCk7IH0KLQotICBzaXplX3R5cGUgY2FwYWNpdHkoKSBjb25zdCAgICB7IHJldHVybiBfTV9pbXBsLmNhcGFjaXR5KCk7IH0KLSAgYm9vbCBlbXB0eSgpIGNvbnN0ICAgICAgICAgICAgeyByZXR1cm4gX01faW1wbC5lbXB0eSgpOyB9Ci0KLSAgcmVmZXJlbmNlIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fbikgeyByZXR1cm4gY2FzdF90cmFpdHM6OnRvX3ZhbHVlX3R5cGVfcmVmKF9NX2ltcGxbX19uXSk7IH0KLSAgY29uc3RfcmVmZXJlbmNlIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fbikgY29uc3QgeyByZXR1cm4gY2FzdF90cmFpdHM6OnRvX3ZhbHVlX3R5cGVfY3JlZihfTV9pbXBsW19fbl0pOyB9Ci0KLSAgcmVmZXJlbmNlIGZyb250KCkgICAgICAgICAgICAgeyByZXR1cm4gY2FzdF90cmFpdHM6OnRvX3ZhbHVlX3R5cGVfcmVmKF9NX2ltcGwuZnJvbnQoKSk7IH0KLSAgY29uc3RfcmVmZXJlbmNlIGZyb250KCkgY29uc3QgeyByZXR1cm4gY2FzdF90cmFpdHM6OnRvX3ZhbHVlX3R5cGVfY3JlZihfTV9pbXBsLmZyb250KCkpOyB9Ci0gIHJlZmVyZW5jZSBiYWNrKCkgICAgICAgICAgICAgIHsgcmV0dXJuIGNhc3RfdHJhaXRzOjp0b192YWx1ZV90eXBlX3JlZihfTV9pbXBsLmJhY2soKSk7IH0KLSAgY29uc3RfcmVmZXJlbmNlIGJhY2soKSBjb25zdCAgeyByZXR1cm4gY2FzdF90cmFpdHM6OnRvX3ZhbHVlX3R5cGVfY3JlZihfTV9pbXBsLmJhY2soKSk7IH0KLQotICByZWZlcmVuY2UgYXQoc2l6ZV90eXBlIF9fbikgeyByZXR1cm4gY2FzdF90cmFpdHM6OnRvX3ZhbHVlX3R5cGVfcmVmKF9NX2ltcGwuYXQoX19uKSk7IH0KLSAgY29uc3RfcmVmZXJlbmNlIGF0KHNpemVfdHlwZSBfX24pIGNvbnN0IHsgcmV0dXJuIGNhc3RfdHJhaXRzOjp0b192YWx1ZV90eXBlX2NyZWYoX01faW1wbC5hdChfX24pKTsgfQotCi0gIGV4cGxpY2l0IHZlY3Rvcihjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKLSAgICA6IF9NX2ltcGwoX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoX19hLCBfU3RvcmFnZVR5cGUpKSB7fQotCi0jaWYgIWRlZmluZWQoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKLSAgZXhwbGljaXQgdmVjdG9yKHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9fdmFsID0gX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRCh2YWx1ZV90eXBlKSwKLSNlbHNlCi0gIHZlY3RvcihzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ZhbCwKLSNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0qLwotICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCi0gICAgOiBfTV9pbXBsKF9fbiwgY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcmVmKF9fdmFsKSwKLSAgICAgIF9TVExQX0NPTlZFUlRfQUxMT0NBVE9SKF9fYSwgX1N0b3JhZ2VUeXBlKSkge30KLQotI2lmIGRlZmluZWQoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKLSAgZXhwbGljaXQgdmVjdG9yKHNpemVfdHlwZSBfX24pCi0gICAgOiBfTV9pbXBsKF9fbiwgYWxsb2NhdG9yX3R5cGUoKSApIHt9Ci0jZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKi8KLQotICB2ZWN0b3IoY29uc3QgX1NlbGYmIF9feCkKLSAgICA6IF9NX2ltcGwoX194Ll9NX2ltcGwpIHt9Ci0KLSAgZXhwbGljaXQgdmVjdG9yKF9fbW92ZV9zb3VyY2U8X1NlbGY+IHNyYykKLSAgICA6IF9NX2ltcGwoX19tb3ZlX3NvdXJjZTxfQmFzZT4oc3JjLmdldCgpLl9NX2ltcGwpKSB7fQotCi0jaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKLSAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgotICB2ZWN0b3IoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAotICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSBfU1RMUF9BTExPQ0FUT1JfVFlQRV9ERkwgKQotICA6IF9NX2ltcGwoX19maXJzdCwgX19sYXN0LAotICAgICAgICAgICAgX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoX19hLCBfU3RvcmFnZVR5cGUpKSB7fQotCi0jICBpZiBkZWZpbmVkIChfU1RMUF9ORUVEU19FWFRSQV9URU1QTEFURV9DT05TVFJVQ1RPUlMpCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KLSAgdmVjdG9yKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKLSAgICA6IF9NX2ltcGwoX19maXJzdCwgX19sYXN0KSB7fQotIyAgZW5kaWYKLQotI2Vsc2UKLSAgdmVjdG9yKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCwKLSAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQotICAgIDogX01faW1wbChjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NwdHIoX19maXJzdCksIGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3B0cihfX2xhc3QpLAotICAgICAgICAgICAgICBfU1RMUF9DT05WRVJUX0FMTE9DQVRPUihfX2EsIF9TdG9yYWdlVHlwZSkpIHt9Ci0jZW5kaWYgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLwotCi0gIF9TZWxmJiBvcGVyYXRvcj0oY29uc3QgX1NlbGYmIF9feCkgeyBfTV9pbXBsID0gX194Ll9NX2ltcGw7IHJldHVybiAqdGhpczsgfQotCi0gIHZvaWQgcmVzZXJ2ZShzaXplX3R5cGUgX19uKSB7X01faW1wbC5yZXNlcnZlKF9fbik7fQotICB2b2lkIGFzc2lnbihzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ZhbCkKLSAgeyBfTV9pbXBsLmFzc2lnbihfX24sIGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3JlZihfX3ZhbCkpOyB9Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQotICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Ci0gIHZvaWQgYXNzaWduKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKLSAgeyBfTV9pbXBsLmFzc2lnbihfX2ZpcnN0LCBfX2xhc3QpOyB9Ci0jZWxzZQotICB2b2lkIGFzc2lnbihjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpIHsKLSAgICBfTV9pbXBsLmFzc2lnbihjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NwdHIoX19maXJzdCksCi0gICAgICAgICAgICAgICAgICAgY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcHRyKF9fbGFzdCkpOwotICB9Ci0jZW5kaWYgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLwotCi0jaWYgIWRlZmluZWQoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkgJiYgIWRlZmluZWQoX1NUTFBfTk9fQU5BQ0hST05JU01TKQotICB2b2lkIHB1c2hfYmFjayhjb25zdCB2YWx1ZV90eXBlJiBfX3ggPSBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKHZhbHVlX3R5cGUpKQotI2Vsc2UKLSAgdm9pZCBwdXNoX2JhY2soY29uc3QgdmFsdWVfdHlwZSYgX194KQotI2VuZGlmIC8qIV9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0gJiYgIV9TVExQX05PX0FOQUNIUk9OSVNNUyovCi0gIHsgX01faW1wbC5wdXNoX2JhY2soY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcmVmKF9feCkpOyB9Ci0KLSNpZiAhZGVmaW5lZChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKSAmJiAhZGVmaW5lZChfU1RMUF9OT19BTkFDSFJPTklTTVMpCi0gIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBfX3BvcywgY29uc3QgdmFsdWVfdHlwZSYgX194ID0gX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRCh2YWx1ZV90eXBlKSkKLSNlbHNlCi0gIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBfX3BvcywgY29uc3QgdmFsdWVfdHlwZSYgX194KQotI2VuZGlmIC8qIV9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0gJiYgIV9TVExQX05PX0FOQUNIUk9OSVNNUyovCi0gIHsgcmV0dXJuIGNhc3RfdHJhaXRzOjp0b192YWx1ZV90eXBlX3B0cihfTV9pbXBsLmluc2VydChjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX3B0cihfX3BvcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWYoX194KSkpOyB9Ci0KLSNpZiBkZWZpbmVkKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pICYmICFkZWZpbmVkKF9TVExQX05PX0FOQUNIUk9OSVNNUykKLSAgdm9pZCBwdXNoX2JhY2soKSB7IF9NX2ltcGwucHVzaF9iYWNrKCk7IH0KLSAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zKQotICB7IHJldHVybiBfTV9pbXBsLmluc2VydChjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX3B0cihfX3BvcykpOyB9Ci0jZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNICYmICFfU1RMUF9OT19BTkFDSFJPTklTTVMqLwotCi0gIHZvaWQgc3dhcChfU2VsZiYgX194KSB7IF9NX2ltcGwuc3dhcChfX3guX01faW1wbCk7IH0KLQotI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCi0gIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KLSAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKLSAgeyBfTV9pbXBsLmluc2VydChjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX3B0cihfX3BvcyksIF9fZmlyc3QsIF9fbGFzdCk7IH0KLSNlbHNlCi0gIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpIHsKLSAgICBfTV9pbXBsLmluc2VydChjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX3B0cihfX3BvcyksIGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3B0cihfX2ZpcnN0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3B0cihfX2xhc3QpKTsKLSAgfQotI2VuZGlmCi0KLSAgdm9pZCBpbnNlcnQgKGl0ZXJhdG9yIF9fcG9zLCBzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpIHsKLSAgICBfTV9pbXBsLmluc2VydChjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX3B0cihfX3BvcyksIF9fbiwgY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcmVmKF9feCkpOwotICB9Ci0KLSAgdm9pZCBwb3BfYmFjaygpIHtfTV9pbXBsLnBvcF9iYWNrKCk7fQotICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBfX3BvcykKLSAge3JldHVybiBjYXN0X3RyYWl0czo6dG9fdmFsdWVfdHlwZV9wdHIoX01faW1wbC5lcmFzZShjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX3B0cihfX3BvcykpKTt9Ci0gIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkgewotICAgIHJldHVybiBjYXN0X3RyYWl0czo6dG9fdmFsdWVfdHlwZV9wdHIoX01faW1wbC5lcmFzZShjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX3B0cihfX2ZpcnN0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9wdHIoX19sYXN0KSkpOwotICB9Ci0KLSNpZiAhZGVmaW5lZChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQotICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgX19uZXdfc2l6ZSwgY29uc3QgdmFsdWVfdHlwZSYgX194ID0gX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRCh2YWx1ZV90eXBlKSkKLSNlbHNlCi0gIHZvaWQgcmVzaXplKHNpemVfdHlwZSBfX25ld19zaXplLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCi0jZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKi8KLSAgeyBfTV9pbXBsLnJlc2l6ZShfX25ld19zaXplLCBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWYoX194KSk7IH0KLQotI2lmIGRlZmluZWQoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKLSAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9fbmV3X3NpemUpIHsgX01faW1wbC5yZXNpemUoX19uZXdfc2l6ZSk7IH0KLSNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0qLwotCi0gIHZvaWQgY2xlYXIoKSB7IF9NX2ltcGwuY2xlYXIoKTsgfQotCi1wcml2YXRlOgotICBfQmFzZSBfTV9pbXBsOwotfTsKLQotI2lmIGRlZmluZWQgKHZlY3RvcikKLSMgIHVuZGVmIHZlY3RvcgotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi0jZW5kaWYKLQotI3VuZGVmIFZFQ1RPUl9JTVBMCi0KLV9TVExQX0VORF9OQU1FU1BBQ0UKLQotI2VuZGlmIC8qIF9TVExQX1NQRUNJQUxJWkVEX1ZFQ1RPUl9IICovCmRpZmYgLS1naXQgYS9zdGwvdHlwZV9tYW5pcHMuaCBiL3N0bC90eXBlX21hbmlwcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk2MGUwLi4wMDAwMDAwCi0tLSBhL3N0bC90eXBlX21hbmlwcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzA1ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAzCi0gKiBGcmFu529pcyBEdW1vbnQKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLQotCi0jaWZuZGVmIF9TVExQX1RZUEVfTUFOSVBTX0gKLSNkZWZpbmUgX1NUTFBfVFlQRV9NQU5JUFNfSAotCi1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLQotc3RydWN0IF9fdHJ1ZV90eXBlIHt9Owotc3RydWN0IF9fZmFsc2VfdHlwZSB7fTsKLQotI2lmIGRlZmluZWQgKF9TVExQX1VTRV9OQU1FU1BBQ0VTKQotX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQotdXNpbmcgX1NUTFBfU1REOjpfX3RydWVfdHlwZTsKLXVzaW5nIF9TVExQX1NURDo6X19mYWxzZV90eXBlOwotX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCi0jZW5kaWYKLQotLy9ib29sIHRvIHR5cGUKLXRlbXBsYXRlIDxpbnQgX0lzPgotc3RydWN0IF9fYm9vbDJ0eXBlCi17IHR5cGVkZWYgX190cnVlX3R5cGUgX1JldDsgfTsKLQotX1NUTFBfVEVNUExBVEVfTlVMTAotc3RydWN0IF9fYm9vbDJ0eXBlPDE+IHsgdHlwZWRlZiBfX3RydWVfdHlwZSBfUmV0OyB9OwotCi1fU1RMUF9URU1QTEFURV9OVUxMCi1zdHJ1Y3QgX19ib29sMnR5cGU8MD4geyB0eXBlZGVmIF9fZmFsc2VfdHlwZSBfUmV0OyB9OwotCi0vL3R5cGUgdG8gYm9vbAotdGVtcGxhdGUgPGNsYXNzIF9fYm9vbF90eXBlPgotc3RydWN0IF9fdHlwZTJib29sIHsgZW51bSB7X1JldCA9IDF9OyB9OwotCi1fU1RMUF9URU1QTEFURV9OVUxMCi1zdHJ1Y3QgX190eXBlMmJvb2w8X190cnVlX3R5cGU+IHsgZW51bSB7X1JldCA9IDF9OyB9OwotCi1fU1RMUF9URU1QTEFURV9OVUxMCi1zdHJ1Y3QgX190eXBlMmJvb2w8X19mYWxzZV90eXBlPiB7IGVudW0ge19SZXQgPSAwfTsgfTsKLQotLy9OZWdhdGlvbgotdGVtcGxhdGUgPGNsYXNzIF9Cb29sVHlwZT4KLXN0cnVjdCBfTm90IHsgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgX1JldDsgfTsKLQotX1NUTFBfVEVNUExBVEVfTlVMTAotc3RydWN0IF9Ob3Q8X19mYWxzZV90eXBlPiB7IHR5cGVkZWYgX190cnVlX3R5cGUgX1JldDsgfTsKLQotLy8gbG9naWNhbCBhbmQgb2YgMiBwcmVkaWNhdGVkCi10ZW1wbGF0ZSA8Y2xhc3MgX1AxLCBjbGFzcyBfUDI+Ci1zdHJ1Y3QgX0xhbmQyIHsgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgX1JldDsgfTsKLQotX1NUTFBfVEVNUExBVEVfTlVMTAotc3RydWN0IF9MYW5kMjxfX3RydWVfdHlwZSwgX190cnVlX3R5cGU+IHsgdHlwZWRlZiBfX3RydWVfdHlwZSBfUmV0OyB9OwotCi0vLyBsb2dpY2FsIGFuZCBvZiAzIHByZWRpY2F0ZWQKLXRlbXBsYXRlIDxjbGFzcyBfUDEsIGNsYXNzIF9QMiwgY2xhc3MgX1AzPgotc3RydWN0IF9MYW5kMyB7IHR5cGVkZWYgX19mYWxzZV90eXBlIF9SZXQ7IH07Ci0KLV9TVExQX1RFTVBMQVRFX05VTEwKLXN0cnVjdCBfTGFuZDM8X190cnVlX3R5cGUsIF9fdHJ1ZV90eXBlLCBfX3RydWVfdHlwZT4geyB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9SZXQ7IH07Ci0KLS8vbG9naWNhbCBvciBvZiAyIHByZWRpY2F0ZWQKLXRlbXBsYXRlIDxjbGFzcyBfUDEsIGNsYXNzIF9QMj4KLXN0cnVjdCBfTG9yMiB7IHR5cGVkZWYgX190cnVlX3R5cGUgX1JldDsgfTsKLQotX1NUTFBfVEVNUExBVEVfTlVMTAotc3RydWN0IF9Mb3IyPF9fZmFsc2VfdHlwZSwgX19mYWxzZV90eXBlPiB7IHR5cGVkZWYgX19mYWxzZV90eXBlIF9SZXQ7IH07Ci0KLS8vIGxvZ2ljYWwgb3Igb2YgMyBwcmVkaWNhdGVkCi10ZW1wbGF0ZSA8Y2xhc3MgX1AxLCBjbGFzcyBfUDIsIGNsYXNzIF9QMz4KLXN0cnVjdCBfTG9yMyB7IHR5cGVkZWYgX190cnVlX3R5cGUgX1JldDsgfTsKLQotX1NUTFBfVEVNUExBVEVfTlVMTAotc3RydWN0IF9Mb3IzPF9fZmFsc2VfdHlwZSwgX19mYWxzZV90eXBlLCBfX2ZhbHNlX3R5cGU+IHsgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgX1JldDsgfTsKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIGNsYXNzIHRlbXBsYXRlIF9fc2VsZWN0Ci0vLyBTZWxlY3RzIG9uZSBvZiB0d28gdHlwZXMgYmFzZWQgdXBvbiBhIGJvb2xlYW4gY29uc3RhbnQKLS8vIEludm9jYXRpb246IF9fc2VsZWN0PF9Db25kLCBULCBVPjo6UmVzdWx0Ci0vLyB3aGVyZToKLS8vIGZsYWcgaXMgYSBjb21waWxlLXRpbWUgYm9vbGVhbiBjb25zdGFudAotLy8gVCBhbmQgVSBhcmUgdHlwZXMKLS8vIFJlc3VsdCBldmFsdWF0ZXMgdG8gVCBpZiBmbGFnIGlzIHRydWUsIGFuZCB0byBVIG90aGVyd2lzZS4KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBCRVdBUkU6IElmIHRoZSBjb21waWxlciBkbyBub3Qgc3VwcG9ydCBwYXJ0aWFsIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIG9yIG5lc3RlZCB0ZW1wbGF0ZQotLy9jbGFzc2VzIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoZSBfX3NlbGVjdCBpcyB0byBjb25zaWRlciB0aGUgY29uZGl0aW9uIGFzIGZhbHNlIGFuZCBzbyByZXR1cm4KLS8vdGhlIHNlY29uZCB0ZW1wbGF0ZSB0eXBlISEKLQotI2lmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pCi10ZW1wbGF0ZSA8Ym9vbCBfQ29uZCwgY2xhc3MgX1RwMSwgY2xhc3MgX1RwMj4KLXN0cnVjdCBfX3NlbGVjdCB7IHR5cGVkZWYgX1RwMSBfUmV0OyB9OwotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwMSwgY2xhc3MgX1RwMj4KLXN0cnVjdCBfX3NlbGVjdDxmYWxzZSwgX1RwMSwgX1RwMj4geyB0eXBlZGVmIF9UcDIgX1JldDsgfTsKLQotIyAgaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKQotdGVtcGxhdGUgPGNsYXNzIF9Db25kVCwgY2xhc3MgX1RwMSwgY2xhc3MgX1RwMj4KLXN0cnVjdCBfX3NlbGVjdFQgeyB0eXBlZGVmIF9UcDEgX1JldDsgfTsKLQotdGVtcGxhdGUgPGNsYXNzIF9UcDEsIGNsYXNzIF9UcDI+Ci1zdHJ1Y3QgX19zZWxlY3RUPF9fZmFsc2VfdHlwZSwgX1RwMSwgX1RwMj4geyB0eXBlZGVmIF9UcDIgX1JldDsgfTsKLSMgIGVuZGlmCi0KLSNlbHNlIC8qIF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04gKi8KLQotIyAgaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFX0NMQVNTRVMpCi10ZW1wbGF0ZSA8aW50IF9Db25kPgotc3RydWN0IF9fc2VsZWN0X2F1eCB7Ci0gIHRlbXBsYXRlIDxjbGFzcyBfVHAxLCBjbGFzcyBfVHAyPgotICBzdHJ1Y3QgX0luIHsKLSAgICB0eXBlZGVmIF9UcDEgX1JldDsKLSAgfTsKLX07Ci0KLV9TVExQX1RFTVBMQVRFX05VTEwKLXN0cnVjdCBfX3NlbGVjdF9hdXg8MD4gewotICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwMSwgY2xhc3MgX1RwMj4KLSAgc3RydWN0IF9JbiB7Ci0gICAgdHlwZWRlZiBfVHAyIF9SZXQ7Ci0gIH07Ci19OwotCi10ZW1wbGF0ZSA8aW50IF9Db25kLCBjbGFzcyBfVHAxLCBjbGFzcyBfVHAyPgotc3RydWN0IF9fc2VsZWN0IHsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfX3NlbGVjdF9hdXg8X0NvbmQ+OjpfU1RMUF9URU1QTEFURSBfSW48X1RwMSwgX1RwMj46Ol9SZXQgX1JldDsKLX07Ci0jICBlbHNlIC8qIF9TVExQX01FTUJFUl9URU1QTEFURV9DTEFTU0VTICovCi0vL2RlZmF1bHQgYmVoYXZpb3IKLXRlbXBsYXRlIDxpbnQgX0NvbmQsIGNsYXNzIF9UcDEsIGNsYXNzIF9UcDI+Ci1zdHJ1Y3QgX19zZWxlY3QgewotICB0eXBlZGVmIF9UcDIgX1JldDsKLX07Ci0jICBlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVfQ0xBU1NFUyAqLwotCi0jZW5kaWYgLyogX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTiAqLwotCi0jaWYgZGVmaW5lZCAoX1NUTFBfU0lNVUxBVEVfUEFSVElBTF9TUEVDX0ZPUl9UWVBFX1RSQUlUUykKLS8vIEJvcmlzIDogc2ltdWxhdGlvbiB0ZWNobmlxdWUgaXMgdXNlZCBoZXJlIGFjY29yZGluZyB0byBBZG9iZSBPcGVuIFNvdXJjZSBMaWNlbnNlIFZlcnNpb24gMS4wLgotLy8gQ29weXJpZ2h0IDIwMDAgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQgYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIEF1dGhvcnM6IE1hdCBNYXJjdXMgYW5kIEplc3NlIEpvbmVzCi0vLyBUaGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGlzIHNvdXJjZSBjb2RlIG1heSBiZSBmb3VuZCBhdAotLy8gaHR0cDovL29wZW5zb3VyY2UuYWRvYmUuY29tLgotCi0vLyBUaGVzZSBhcmUgdGhlIGRpc2NyaW1pbmF0aW5nIGZ1bmN0aW9ucwotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWNoYXIgX1NUTFBfQ0FMTCBfSXNTYW1lRnVuKGJvb2wsIF9UcCBjb25zdCB2b2xhdGlsZSosIF9UcCBjb25zdCB2b2xhdGlsZSopOyAvLyBubyBpbXBsZW1lbnRhdGlvbiBpcyByZXF1aXJlZAotY2hhciogX1NUTFBfQ0FMTCBfSXNTYW1lRnVuKGJvb2wsIC4uLik7ICAgICAgIC8vIG5vIGltcGxlbWVudGF0aW9uIGlzIHJlcXVpcmVkCi0KLXRlbXBsYXRlIDxjbGFzcyBfVHAxLCBjbGFzcyBfVHAyPgotc3RydWN0IF9Jc1NhbWUgewotICBzdGF0aWMgX1RwMSogX19udWxsX3JlcDEoKTsKLSAgc3RhdGljIF9UcDIqIF9fbnVsbF9yZXAyKCk7Ci0gIGVudW0geyBfUmV0ID0gKHNpemVvZihfSXNTYW1lRnVuKGZhbHNlLF9fbnVsbF9yZXAxKCksIF9fbnVsbF9yZXAyKCkpKSA9PSBzaXplb2YoY2hhcikpIH07Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX19ib29sMnR5cGU8X1JldD46Ol9SZXQgX1JldFQ7Ci19OwotCi0jZWxzZQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwMSwgY2xhc3MgX1RwMj4KLXN0cnVjdCBfSXNTYW1lQXV4IHsKLSAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgX1JldFQ7Ci0gIGVudW0geyBfUmV0ID0gMCB9OwotfTsKLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLXN0cnVjdCBfVW5Db25zdFR5cGUgeyB0eXBlZGVmIF9UcCBfVHlwZTsgfTsKLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLXN0cnVjdCBfVW5Wb2xhdGlsZVR5cGUgeyB0eXBlZGVmIF9UcCBfVHlwZTsgfTsKLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLXN0cnVjdCBfVW5DVlR5cGUgewotICB0eXBlZGVmIHR5cGVuYW1lIF9VblZvbGF0aWxlVHlwZTxfVHA+OjpfVHlwZSBfVW5WVHlwZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfVW5Db25zdFR5cGU8X1VuVlR5cGU+OjpfVHlwZSBfVHlwZTsKLX07Ci0KLSMgIGlmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotc3RydWN0IF9Jc1NhbWVBdXg8X1RwLCBfVHA+IHsKLSAgdHlwZWRlZiBfX3RydWVfdHlwZSBfUmV0VDsKLSAgZW51bSB7IF9SZXQgPSAxIH07Ci19OwotCi0jICAgIGlmICFkZWZpbmVkIChfU1RMUF9RVUFMSUZJRURfU1BFQ0lBTElaQVRJT05fQlVHKQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLXN0cnVjdCBfVW5Db25zdFR5cGU8Y29uc3QgX1RwPiB7IHR5cGVkZWYgX1RwIF9UeXBlOyB9OwotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotc3RydWN0IF9VblZvbGF0aWxlVHlwZTx2b2xhdGlsZSBfVHA+IHsgdHlwZWRlZiBfVHAgX1R5cGU7IH07Ci0jICAgIGVuZGlmCi0KLSMgICAgaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pCi10ZW1wbGF0ZTxjbGFzcyBfVHA+Ci1zdHJ1Y3QgX1VuQ29uc3RQdHIgeyB0eXBlZGVmIF9UcCBfVHlwZTsgfTsKLQotdGVtcGxhdGU8Y2xhc3MgX1RwPgotc3RydWN0IF9VbkNvbnN0UHRyPF9UcCo+IHsgdHlwZWRlZiBfVHAgX1R5cGU7IH07Ci0KLXRlbXBsYXRlPGNsYXNzIF9UcD4KLXN0cnVjdCBfVW5Db25zdFB0cjxjb25zdCBfVHAqPiB7IHR5cGVkZWYgX1RwIF9UeXBlOyB9OwotIyAgICBlbmRpZgotIyAgZW5kaWYKLQotdGVtcGxhdGUgPGNsYXNzIF9UcDEsIGNsYXNzIF9UcDI+Ci1zdHJ1Y3QgX0lzU2FtZSB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1VuQ1ZUeXBlPF9UcDE+OjpfVHlwZSBfVHlwZTE7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1VuQ1ZUeXBlPF9UcDI+OjpfVHlwZSBfVHlwZTI7Ci0KLSAgdHlwZWRlZiBfSXNTYW1lQXV4PF9UeXBlMSwgX1R5cGUyPiBfQXV4OwotICBlbnVtIHsgX1JldCA9IF9BdXg6Ol9SZXQgfTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfQXV4OjpfUmV0VCBfUmV0VDsKLX07Ci0jZW5kaWYKLQotLyoKLSAqIFRoZSBmb2xsb3dpbmcgc3RydWN0IHdpbGwgdGVsbCB5b3UgaWYgMiB0eXBlcyBhcmUgdGhlIHNhbWUsIHRoZSBsaW1pdGF0aW9ucyBhcmU6Ci0gKiAgLSBpdCBjb21wYXJlcyB0aGUgdHlwZXMgd2l0aG91dCB0aGUgY29uc3Qgb3Igdm9sYXRpbGUgcXVhbGlmaWVycywgaW50IGFuZCBjb25zdCBpbnQKLSAqICAgIHdpbGwgYmUgY29uc2lkZXJlZCBhcyBzYW1lIGZvciBpbnN0YW5jZS4KLSAqICAtIHRoZSBwcmV2aW91cyByZW1hcmtzIGRvIG5vdCBhcHBseSB0byBwb2ludGVyIHR5cGVzLCBpbnQqIGFuZCBpbnQgY29uc3QqIHdvbid0IGJlCi0gKiAgICBjb25zaWRlcmVkIGFzIGNvbXBhcmFibGUuIChpbnQgKiBhbmQgaW50ICpjb25zdCBhcmUpLgotICovCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwMSwgY2xhc3MgX1RwMj4KLXN0cnVjdCBfQXJlU2FtZVVuQ1ZUeXBlcyB7Ci0gIGVudW0geyBfU2FtZSA9IF9Jc1NhbWU8X1RwMSwgX1RwMj46Ol9SZXQgfTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfSXNTYW1lPF9UcDEsIF9UcDI+OjpfUmV0VCBfUmV0OwotfTsKLQotLyogUmF0aGVyIHRoYW4gaW50cm9kdWNpbmcgYSBuZXcgbWFjcm8gZm9yIHRoZSBmb2xsb3dpbmcgY29uc3RydXRpb24gd2UgdXNlCi0gKiBhbiBleGlzdGluZyBvbmUgKF9TVExQX0RPTlRfU0lNVUxBVEVfUEFSVElBTF9TUEVDX0ZPUl9UWVBFX1RSQUlUUykgdGhhdAotICogaXMgdXNlZCBmb3IgYSBzaW1pbGFyIGZlYXR1cmUuCi0gKi8KLSNpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9TSU1VTEFURV9QQVJUSUFMX1NQRUNfRk9SX1RZUEVfVFJBSVRTKQotdGVtcGxhdGUgPGNsYXNzIF9TcmMsIGNsYXNzIF9Ec3Q+Ci1zdHJ1Y3QgX0NvbnZlcnNpb25IZWxwZXIgewotICBzdGF0aWMgY2hhciBfVGVzdChib29sLCBfRHN0KTsKLSAgc3RhdGljIGNoYXIqIF9UZXN0KGJvb2wsIC4uLik7Ci0gIHN0YXRpYyBfU3JjIF9NYWtlU291cmNlKCk7Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgX1NyYywgY2xhc3MgX0RzdD4KLXN0cnVjdCBfSXNDb252ZXJ0aWJsZSB7Ci0gIHR5cGVkZWYgX0NvbnZlcnNpb25IZWxwZXI8X1NyYyosIGNvbnN0IHZvbGF0aWxlIF9Ec3QqPiBfSDsKLSAgZW51bSB7IHZhbHVlID0gKHNpemVvZihjaGFyKSA9PSBzaXplb2YoX0g6Ol9UZXN0KGZhbHNlLCBfSDo6X01ha2VTb3VyY2UoKSkpKSB9OwotICB0eXBlZGVmIHR5cGVuYW1lIF9fYm9vbDJ0eXBlPHZhbHVlPjo6X1JldCBfUmV0OwotfTsKLQotLyogVGhpcyBzdHJ1Y3QgaXMgaW50ZW5kZWQgdG8gc2F5IGlmIGEgcG9pbnRlciBjYW4gYmUgY29udmVydGlibGUgdG8gYW4gb3RoZXIKLSAqIHRha2luZyBpbnRvIGFjY291bnQgY3YgcXVhbGlmaWNhdGlvbnMuIEl0IHNob3VsZG4ndCBiZSBpbnN0YW5jaWF0ZWQgd2l0aAotICogc29tZXRoaW5nIGVsc2UgdGhhbiBwb2ludGVyIHR5cGUgYXMgaXQgdXNlcyBwYXNzIGJ5IHZhbHVlIHBhcmFtZXRlciB0aGF0Ci0gKiByZXN1bHRzIGluIGNvbXBpbGF0aW9uIGVycm9yIHdoZW4gcGFyYW1ldGVyIHR5cGUgaGFzIGEgc3BlY2lhbCBtZW1vcnkKLSAqIGFsaWdubWVudAotICovCi10ZW1wbGF0ZSA8Y2xhc3MgX1NyYywgY2xhc3MgX0RzdD4KLXN0cnVjdCBfSXNDVkNvbnZlcnRpYmxlIHsKLSNpZiAhZGVmaW5lZCAoX19CT1JMQU5EQ19fKQotICB0eXBlZGVmIF9Db252ZXJzaW9uSGVscGVyPF9TcmMsIF9Ec3Q+IF9IOwotICBlbnVtIHsgdmFsdWUgPSAoc2l6ZW9mKGNoYXIpID09IHNpemVvZihfSDo6X1Rlc3QoZmFsc2UsIF9IOjpfTWFrZVNvdXJjZSgpKSkpIH07Ci0jZWxzZQotICBlbnVtIHsgX0lzMSA9IF9fdHlwZTJib29sPF9Jc0NvbnN0PF9TcmM+OjpfUmV0Pjo6X1JldCB9OwotICBlbnVtIHsgX0lzMiA9IF9Jc0NvbnZlcnRpYmxlPF9VbkNvbnN0UHRyPF9TcmM+OjpfVHlwZSwgX1VuQ29uc3RQdHI8X0RzdD46Ol9UeXBlPjo6dmFsdWUgfTsKLSAgZW51bSB7IHZhbHVlID0gX0lzMSA/IDAgOiBfSXMyIH07Ci0jZW5kaWYKLSAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jvb2wydHlwZTx2YWx1ZT46Ol9SZXQgX1JldDsKLX07Ci0KLSNlbHNlCi10ZW1wbGF0ZSA8Y2xhc3MgX1NyYywgY2xhc3MgX0RzdD4KLXN0cnVjdCBfSXNDb252ZXJ0aWJsZSB7Ci0gIGVudW0ge3ZhbHVlID0gMH07Ci0gIHR5cGVkZWYgX19mYWxzZV90eXBlIF9SZXQ7Ci19OwotI2VuZGlmCi0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1zdHJ1Y3QgX0lzQ29uc3QgeyB0eXBlZGVmIF9fZmFsc2VfdHlwZSBfUmV0OyB9OwotCi0jaWYgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikgJiYgIWRlZmluZWQgKF9TVExQX1FVQUxJRklFRF9TUEVDSUFMSVpBVElPTl9CVUcpCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotc3RydWN0IF9Jc0NvbnN0IDxjb25zdCBfVHA+IHsgdHlwZWRlZiBfX3RydWVfdHlwZSBfUmV0OyB9OwotI2VuZGlmCi0KLSMgIGlmIGRlZmluZWQoX19CT1JMQU5EQ19fKQotdGVtcGxhdGU8Y2xhc3MgX1RwPgotc3RydWN0IF9Jc0NvbnN0IDxjb25zdCBfVHAqPiB7IHR5cGVkZWYgX190cnVlX3R5cGUgX1JldDsgfTsKLQotdGVtcGxhdGU8Y2xhc3MgX1RwPgotc3RydWN0IF9Jc0NvbnN0IDxjb25zdCB2b2xhdGlsZSBfVHAqPiB7IHR5cGVkZWYgX190cnVlX3R5cGUgX1JldDsgfTsKLSMgIGVuZGlmCi0KLV9TVExQX0VORF9OQU1FU1BBQ0UKLQotI2VuZGlmIC8qIF9TVExQX1RZUEVfTUFOSVBTX0ggKi8KZGlmZiAtLWdpdCBhL3N0bC90eXBlX3RyYWl0cy5oIGIvc3RsL3R5cGVfdHJhaXRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3YmM2OWYuLjAwMDAwMDAKLS0tIGEvc3RsL3R5cGVfdHJhaXRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NzcgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NwotICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk3Ci0gKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5Ci0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLQotI2lmbmRlZiBfU1RMUF9UWVBFX1RSQUlUU19ICi0jZGVmaW5lIF9TVExQX1RZUEVfVFJBSVRTX0gKLQotLyoKLVRoaXMgaGVhZGVyIGZpbGUgcHJvdmlkZXMgYSBmcmFtZXdvcmsgZm9yIGFsbG93aW5nIGNvbXBpbGUgdGltZSBkaXNwYXRjaAotYmFzZWQgb24gdHlwZSBhdHRyaWJ1dGVzLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHdyaXRpbmcgdGVtcGxhdGUgY29kZS4KLUZvciBleGFtcGxlLCB3aGVuIG1ha2luZyBhIGNvcHkgb2YgYW4gYXJyYXkgb2YgYW4gdW5rbm93biB0eXBlLCBpdCBoZWxwcwotdG8ga25vdyBpZiB0aGUgdHlwZSBoYXMgYSB0cml2aWFsIGNvcHkgY29uc3RydWN0b3Igb3Igbm90LCB0byBoZWxwIGRlY2lkZQotaWYgYSBtZW1jcHkgY2FuIGJlIHVzZWQuCi0KLVRoZSBjbGFzcyB0ZW1wbGF0ZSBfX3R5cGVfdHJhaXRzIHByb3ZpZGVzIGEgc2VyaWVzIG9mIHR5cGVkZWZzIGVhY2ggb2YKLXdoaWNoIGlzIGVpdGhlciBfX3RydWVfdHlwZSBvciBfX2ZhbHNlX3R5cGUuIFRoZSBhcmd1bWVudCB0bwotX190eXBlX3RyYWl0cyBjYW4gYmUgYW55IHR5cGUuIFRoZSB0eXBlZGVmcyB3aXRoaW4gdGhpcyB0ZW1wbGF0ZSB3aWxsCi1hdHRhaW4gdGhlaXIgY29ycmVjdCB2YWx1ZXMgYnkgb25lIG9mIHRoZXNlIG1lYW5zOgotICAgIDEuIFRoZSBnZW5lcmFsIGluc3RhbnRpYXRpb24gY29udGFpbiBjb25zZXJ2YXRpdmUgdmFsdWVzIHdoaWNoIHdvcmsKLSAgICAgICBmb3IgYWxsIHR5cGVzLgotICAgIDIuIFNwZWNpYWxpemF0aW9ucyBtYXkgYmUgZGVjbGFyZWQgdG8gbWFrZSBkaXN0aW5jdGlvbnMgYmV0d2VlbiB0eXBlcy4KLSAgICAzLiBTb21lIGNvbXBpbGVycyAoc3VjaCBhcyB0aGUgU2lsaWNvbiBHcmFwaGljcyBOMzIgYW5kIE42NCBjb21waWxlcnMpCi0gICAgICAgd2lsbCBhdXRvbWF0aWNhbGx5IHByb3ZpZGUgdGhlIGFwcHJvcHJpYXRlIHNwZWNpYWxpemF0aW9ucyBmb3IgYWxsCi0gICAgICAgdHlwZXMuCi0KLUVYQU1QTEU6Ci0KLS8vQ29weSBhbiBhcnJheSBvZiBlbGVtZW50cyB3aGljaCBoYXZlIG5vbi10cml2aWFsIGNvcHkgY29uc3RydWN0b3JzCi10ZW1wbGF0ZSA8Y2xhc3MgVD4gdm9pZCBjb3B5KFQqIHNvdXJjZSwgVCogZGVzdGluYXRpb24sIGludCBuLCBfX2ZhbHNlX3R5cGUpOwotLy9Db3B5IGFuIGFycmF5IG9mIGVsZW1lbnRzIHdoaWNoIGhhdmUgdHJpdmlhbCBjb3B5IGNvbnN0cnVjdG9ycy4gVXNlIG1lbWNweS4KLXRlbXBsYXRlIDxjbGFzcyBUPiB2b2lkIGNvcHkoVCogc291cmNlLCBUKiBkZXN0aW5hdGlvbiwgaW50IG4sIF9fdHJ1ZV90eXBlKTsKLQotLy9Db3B5IGFuIGFycmF5IG9mIGFueSB0eXBlIGJ5IHVzaW5nIHRoZSBtb3N0IGVmZmljaWVudCBjb3B5IG1lY2hhbmlzbQotdGVtcGxhdGUgPGNsYXNzIFQ+IGlubGluZSB2b2lkIGNvcHkoVCogc291cmNlLFQqIGRlc3RpbmF0aW9uLGludCBuKSB7Ci0gICBjb3B5KHNvdXJjZSwgZGVzdGluYXRpb24sIG4sCi0gICAgICAgIHR5cGVuYW1lIF9fdHlwZV90cmFpdHM8VD46Omhhc190cml2aWFsX2NvcHlfY29uc3RydWN0b3IoKSk7Ci19Ci0qLwotCi0jaWZkZWYgX19XQVRDT01DX18KLSMgIGluY2x1ZGUgPHN0bC9fY3djaGFyLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBfU1RMUF9UWVBFX01BTklQU19ICi0jICBpbmNsdWRlIDxzdGwvdHlwZV9tYW5pcHMuaD4KLSNlbmRpZgotCi0jaWZkZWYgX1NUTFBfVVNFX0JPT1NUX1NVUFBPUlQKLSMgIGluY2x1ZGUgPHN0bC9ib29zdF90eXBlX3RyYWl0cy5oPgotIyAgaW5jbHVkZSA8Ym9vc3QvdHlwZV90cmFpdHMvYWRkX3JlZmVyZW5jZS5ocHA+Ci0jICBpbmNsdWRlIDxib29zdC90eXBlX3RyYWl0cy9hZGRfY29uc3QuaHBwPgotI2VuZGlmIC8qIF9TVExQX1VTRV9CT09TVF9TVVBQT1JUICovCi0KLV9TVExQX0JFR0lOX05BTUVTUEFDRQotCi0jaWYgIWRlZmluZWQgKF9TVExQX1VTRV9CT09TVF9TVVBQT1JUKQotCi0vLyBUaGUgZm9sbG93aW5nIGNvdWxkIGJlIHdyaXR0ZW4gaW4gdGVybXMgb2YgbnVtZXJpY19saW1pdHMuCi0vLyBXZSdyZSBkb2luZyBpdCBzZXBhcmF0ZWx5IHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGRlcGVuZGVuY2llcy4KLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9Jc0ludGVncmFsCi17IHR5cGVkZWYgX19mYWxzZV90eXBlIF9SZXQ7IH07Ci0KLSMgIGlmbmRlZiBfU1RMUF9OT19CT09MCi1fU1RMUF9URU1QTEFURV9OVUxMIHN0cnVjdCBfSXNJbnRlZ3JhbDxib29sPgoteyB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9SZXQ7IH07Ci0jICBlbmRpZiAvKiBfU1RMUF9OT19CT09MICovCi0KLV9TVExQX1RFTVBMQVRFX05VTEwgc3RydWN0IF9Jc0ludGVncmFsPGNoYXI+Ci17IHR5cGVkZWYgX190cnVlX3R5cGUgX1JldDsgfTsKLQotIyAgaWZuZGVmIF9TVExQX05PX1NJR05FRF9CVUlMVElOUwotX1NUTFBfVEVNUExBVEVfTlVMTCBzdHJ1Y3QgX0lzSW50ZWdyYWw8c2lnbmVkIGNoYXI+Ci17IHR5cGVkZWYgX190cnVlX3R5cGUgX1JldDsgfTsKLSMgIGVuZGlmCi0KLV9TVExQX1RFTVBMQVRFX05VTEwgc3RydWN0IF9Jc0ludGVncmFsPHVuc2lnbmVkIGNoYXI+Ci17IHR5cGVkZWYgX190cnVlX3R5cGUgX1JldDsgfTsKLQotIyAgaWYgZGVmaW5lZCAoIF9TVExQX0hBU19XQ0hBUl9UICkgJiYgISBkZWZpbmVkIChfU1RMUF9XQ0hBUl9UX0lTX1VTSE9SVCkKLV9TVExQX1RFTVBMQVRFX05VTEwgc3RydWN0IF9Jc0ludGVncmFsPHdjaGFyX3Q+Ci17IHR5cGVkZWYgX190cnVlX3R5cGUgX1JldDsgfTsKLSMgIGVuZGlmIC8qIF9TVExQX0hBU19XQ0hBUl9UICovCi0KLV9TVExQX1RFTVBMQVRFX05VTEwgc3RydWN0IF9Jc0ludGVncmFsPHNob3J0PgoteyB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9SZXQ7IH07Ci0KLV9TVExQX1RFTVBMQVRFX05VTEwgc3RydWN0IF9Jc0ludGVncmFsPHVuc2lnbmVkIHNob3J0PgoteyB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9SZXQ7IH07Ci0KLV9TVExQX1RFTVBMQVRFX05VTEwgc3RydWN0IF9Jc0ludGVncmFsPGludD4KLXsgdHlwZWRlZiBfX3RydWVfdHlwZSBfUmV0OyB9OwotCi1fU1RMUF9URU1QTEFURV9OVUxMIHN0cnVjdCBfSXNJbnRlZ3JhbDx1bnNpZ25lZCBpbnQ+Ci17IHR5cGVkZWYgX190cnVlX3R5cGUgX1JldDsgfTsKLQotX1NUTFBfVEVNUExBVEVfTlVMTCBzdHJ1Y3QgX0lzSW50ZWdyYWw8bG9uZz4KLXsgdHlwZWRlZiBfX3RydWVfdHlwZSBfUmV0OyB9OwotCi1fU1RMUF9URU1QTEFURV9OVUxMIHN0cnVjdCBfSXNJbnRlZ3JhbDx1bnNpZ25lZCBsb25nPgoteyB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9SZXQ7IH07Ci0KLSMgIGlmZGVmIF9TVExQX0xPTkdfTE9ORwotX1NUTFBfVEVNUExBVEVfTlVMTCBzdHJ1Y3QgX0lzSW50ZWdyYWw8X1NUTFBfTE9OR19MT05HPgoteyB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9SZXQ7IH07Ci0KLV9TVExQX1RFTVBMQVRFX05VTEwgc3RydWN0IF9Jc0ludGVncmFsPHVuc2lnbmVkIF9TVExQX0xPTkdfTE9ORz4KLXsgdHlwZWRlZiBfX3RydWVfdHlwZSBfUmV0OyB9OwotIyAgZW5kaWYgLyogX1NUTFBfTE9OR19MT05HICovCi0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBfSXNSYXRpb25hbAoteyB0eXBlZGVmIF9fZmFsc2VfdHlwZSBfUmV0OyB9OwotCi1fU1RMUF9URU1QTEFURV9OVUxMIHN0cnVjdCBfSXNSYXRpb25hbDxmbG9hdD4KLXsgdHlwZWRlZiBfX3RydWVfdHlwZSBfUmV0OyB9OwotCi1fU1RMUF9URU1QTEFURV9OVUxMIHN0cnVjdCBfSXNSYXRpb25hbDxkb3VibGU+Ci17IHR5cGVkZWYgX190cnVlX3R5cGUgX1JldDsgfTsKLQotIyAgaWYgIWRlZmluZWQgKCBfU1RMUF9OT19MT05HX0RPVUJMRSApCi1fU1RMUF9URU1QTEFURV9OVUxMIHN0cnVjdCBfSXNSYXRpb25hbDxsb25nIGRvdWJsZT4KLXsgdHlwZWRlZiBfX3RydWVfdHlwZSBfUmV0OyB9OwotIyAgZW5kaWYKLQotLy8gRm9yd2FyZCBkZWNsYXJhdGlvbnMuCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX190eXBlX3RyYWl0czsKLXRlbXBsYXRlIDxjbGFzcyBfSXNQT0Q+IHN0cnVjdCBfX3R5cGVfdHJhaXRzX2F1eCB7Ci0gICB0eXBlZGVmIF9fZmFsc2VfdHlwZSAgICBoYXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yOwotICAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgICAgaGFzX3RyaXZpYWxfY29weV9jb25zdHJ1Y3RvcjsKLSAgIHR5cGVkZWYgX19mYWxzZV90eXBlICAgIGhhc190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3I7Ci0gICB0eXBlZGVmIF9fZmFsc2VfdHlwZSAgICBoYXNfdHJpdmlhbF9kZXN0cnVjdG9yOwotICAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgICAgaXNfUE9EX3R5cGU7Ci19OwotCi1fU1RMUF9URU1QTEFURV9OVUxMCi1zdHJ1Y3QgX190eXBlX3RyYWl0c19hdXg8X19mYWxzZV90eXBlPiB7Ci0gICB0eXBlZGVmIF9fZmFsc2VfdHlwZSAgICBoYXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yOwotICAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgICAgaGFzX3RyaXZpYWxfY29weV9jb25zdHJ1Y3RvcjsKLSAgIHR5cGVkZWYgX19mYWxzZV90eXBlICAgIGhhc190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3I7Ci0gICB0eXBlZGVmIF9fZmFsc2VfdHlwZSAgICBoYXNfdHJpdmlhbF9kZXN0cnVjdG9yOwotICAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgICAgaXNfUE9EX3R5cGU7Ci19OwotCi1fU1RMUF9URU1QTEFURV9OVUxMCi1zdHJ1Y3QgX190eXBlX3RyYWl0c19hdXg8X190cnVlX3R5cGU+IHsKLSAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yOwotICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2NvcHlfY29uc3RydWN0b3I7Ci0gIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfYXNzaWdubWVudF9vcGVyYXRvcjsKLSAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9kZXN0cnVjdG9yOwotICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGlzX1BPRF90eXBlOwotfTsKLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLXN0cnVjdCBfSXNSZWYgewotICB0eXBlZGVmIF9fZmFsc2VfdHlwZSBfUmV0OwotfTsKLQotIyAgaWYgZGVmaW5lZCAoX1NUTFBfU0lNVUxBVEVfUEFSVElBTF9TUEVDX0ZPUl9UWVBFX1RSQUlUUykKLS8qCi0gKiBCb3JpcyA6IHNpbXVsYXRpb24gdGVjaG5pcXVlIGlzIHVzZWQgaGVyZSBhY2NvcmRpbmcgdG8gQWRvYmUgT3BlbiBTb3VyY2UgTGljZW5zZSBWZXJzaW9uIDEuMC4KLSAqIENvcHlyaWdodCAyMDAwIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBBdXRob3JzOiBNYXQgTWFyY3VzIGFuZCBKZXNzZSBKb25lcwotICogVGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhpcyBzb3VyY2UgY29kZSBtYXkgYmUgZm91bmQgYXQKLSAqIGh0dHA6Ly9vcGVuc291cmNlLmFkb2JlLmNvbS4KLSAqLwotCi1zdHJ1Y3QgX1BvaW50ZXJTaGltIHsKLSAgLyoKLSAgICogU2luY2UgdGhlIGNvbXBpbGVyIG9ubHkgYWxsb3dzIGF0IG1vc3Qgb25lIG5vbi10cml2aWFsCi0gICAqIGltcGxpY2l0IGNvbnZlcnNpb24gd2UgY2FuIG1ha2UgdXNlIG9mIGEgc2hpbSBjbGFzcyB0bwotICAgKiBiZSBzdXJlIHRoYXQgSXNQdHIgYmVsb3cgZG9lc24ndCBhY2NlcHQgY2xhc3NlcyB3aXRoCi0gICAqIGltcGxpY2l0IHBvaW50ZXIgY29udmVyc2lvbiBvcGVyYXRvcnMKLSAgICovCi0gIF9Qb2ludGVyU2hpbShjb25zdCB2b2xhdGlsZSB2b2lkKik7IC8vIG5vIGltcGxlbWVudGF0aW9uCi19OwotCi0vLyBUaGVzZSBhcmUgdGhlIGRpc2NyaW1pbmF0aW5nIGZ1bmN0aW9ucwotY2hhciBfU1RMUF9DQUxMIF9Jc1AoYm9vbCwgX1BvaW50ZXJTaGltKTsgIC8vIG5vIGltcGxlbWVudGF0aW9uIGlzIHJlcXVpcmVkCi1jaGFyKiBfU1RMUF9DQUxMIF9Jc1AoYm9vbCwgLi4uKTsgICAgICAgICAgLy8gbm8gaW1wbGVtZW50YXRpb24gaXMgcmVxdWlyZWQKLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLXN0cnVjdCBfSXNQdHIgewotICAvKgotICAgKiBUaGlzIHRlbXBsYXRlIG1ldGEgZnVuY3Rpb24gdGFrZXMgYSB0eXBlIFQKLSAgICogYW5kIHJldHVybnMgdHJ1ZSBleGFjdGx5IHdoZW4gVCBpcyBhIHBvaW50ZXIuCi0gICAqIE9uZSBjYW4gaW1hZ2luZSBtZXRhLWZ1bmN0aW9ucyBkaXNjcmltaW5hdGluZyBvbgotICAgKiBvdGhlciBjcml0ZXJpYS4KLSAgICovCi0gIHN0YXRpYyBfVHAmIF9fbnVsbF9yZXAoKTsKLSAgZW51bSB7IF9QdHIgPSAoc2l6ZW9mKF9Jc1AoZmFsc2UsX19udWxsX3JlcCgpKSkgPT0gc2l6ZW9mKGNoYXIpKSB9OwotICB0eXBlZGVmIHR5cGVuYW1lIF9fYm9vbDJ0eXBlPF9QdHI+OjpfUmV0IF9SZXQ7Ci0KLX07Ci0KLS8vIHdlIG1ha2UgZ2VuZXJhbCBjYXNlIGRlcGVuZGFudCBvbiB0aGUgZmFjdCB0aGUgdHlwZSBpcyBhY3R1YWxseSBhIHBvaW50ZXIuCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotc3RydWN0IF9fdHlwZV90cmFpdHMgOiBfX3R5cGVfdHJhaXRzX2F1eDx0eXBlbmFtZSBfSXNQdHI8X1RwPjo6X1JldD4ge307Ci0KLSMgIGVsc2UgLyogX1NUTFBfU0lNVUxBVEVfUEFSVElBTF9TUEVDX0ZPUl9UWVBFX1RSQUlUUyAqLwotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPiAgc3RydWN0IF9Jc1B0ciB7Ci0gIHR5cGVkZWYgX19mYWxzZV90eXBlIF9SZXQ7Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotc3RydWN0IF9fdHlwZV90cmFpdHMgewotICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICAgdGhpc19kdW1teV9tZW1iZXJfbXVzdF9iZV9maXJzdDsKLSAgICAgICAgICAgICAgICAgICAvKiBEbyBub3QgcmVtb3ZlIHRoaXMgbWVtYmVyLiBJdCBpbmZvcm1zIGEgY29tcGlsZXIgd2hpY2gKLSAgICAgICAgICAgICAgICAgICAgICBhdXRvbWF0aWNhbGx5IHNwZWNpYWxpemVzIF9fdHlwZV90cmFpdHMgdGhhdCB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgX190eXBlX3RyYWl0cyB0ZW1wbGF0ZSBpcyBzcGVjaWFsLiBJdCBqdXN0IG1ha2VzIHN1cmUgdGhhdAotICAgICAgICAgICAgICAgICAgICAgIHRoaW5ncyB3b3JrIGlmIGFuIGltcGxlbWVudGF0aW9uIGlzIHVzaW5nIGEgdGVtcGxhdGUKLSAgICAgICAgICAgICAgICAgICAgICBjYWxsZWQgX190eXBlX3RyYWl0cyBmb3Igc29tZXRoaW5nIHVucmVsYXRlZC4gKi8KLQotICAgLyogVGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnMgc2hvdWxkIGJlIG9ic2VydmVkIGZvciB0aGUgc2FrZSBvZgotICAgICAgY29tcGlsZXJzIHdoaWNoIGF1dG9tYXRpY2FsbHkgcHJvZHVjZSB0eXBlIHNwZWNpZmljIHNwZWNpYWxpemF0aW9ucwotICAgICAgb2YgdGhpcyBjbGFzczoKLSAgICAgICAgICAtIFlvdSBtYXkgcmVvcmRlciB0aGUgbWVtYmVycyBiZWxvdyBpZiB5b3Ugd2lzaAotICAgICAgICAgIC0gWW91IG1heSByZW1vdmUgYW55IG9mIHRoZSBtZW1iZXJzIGJlbG93IGlmIHlvdSB3aXNoCi0gICAgICAgICAgLSBZb3UgbXVzdCBub3QgcmVuYW1lIG1lbWJlcnMgd2l0aG91dCBtYWtpbmcgdGhlIGNvcnJlc3BvbmRpbmcKLSAgICAgICAgICAgIG5hbWUgY2hhbmdlIGluIHRoZSBjb21waWxlcgotICAgICAgICAgIC0gTWVtYmVycyB5b3UgYWRkIHdpbGwgYmUgdHJlYXRlZCBsaWtlIHJlZ3VsYXIgbWVtYmVycyB1bmxlc3MKLQotICAgICAgICAgICAgeW91IGFkZCB0aGUgYXBwcm9wcmlhdGUgc3VwcG9ydCBpbiB0aGUgY29tcGlsZXIuICovCi0jICBpZiAhZGVmaW5lZCAoX1NUTFBfSEFTX1RZUEVfVFJBSVRTX0lOVFJJTlNJQ1MpCi0gICB0eXBlZGVmIF9fZmFsc2VfdHlwZSAgICBoYXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yOwotICAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgICAgaGFzX3RyaXZpYWxfY29weV9jb25zdHJ1Y3RvcjsKLSAgIHR5cGVkZWYgX19mYWxzZV90eXBlICAgIGhhc190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3I7Ci0gICB0eXBlZGVmIF9fZmFsc2VfdHlwZSAgICBoYXNfdHJpdmlhbF9kZXN0cnVjdG9yOwotICAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgICAgaXNfUE9EX3R5cGU7Ci0jICBlbHNlCi0gICB0eXBlZGVmIHR5cGVuYW1lIF9fYm9vbDJ0eXBlPF9TVExQX0hBU19UUklWSUFMX0NPTlNUUlVDVE9SKF9UcCk+OjpfUmV0IGhhc190cml2aWFsX2RlZmF1bHRfY29uc3RydWN0b3I7Ci0gICB0eXBlZGVmIHR5cGVuYW1lIF9fYm9vbDJ0eXBlPF9TVExQX0hBU19UUklWSUFMX0NPUFkoX1RwKT46Ol9SZXQgaGFzX3RyaXZpYWxfY29weV9jb25zdHJ1Y3RvcjsKLSAgIHR5cGVkZWYgdHlwZW5hbWUgX19ib29sMnR5cGU8X1NUTFBfSEFTX1RSSVZJQUxfQVNTSUdOKF9UcCk+OjpfUmV0IGhhc190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3I7Ci0gICB0eXBlZGVmIHR5cGVuYW1lIF9fYm9vbDJ0eXBlPF9TVExQX0hBU19UUklWSUFMX0RFU1RSVUNUT1IoX1RwKT46Ol9SZXQgaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjsKLSAgIHR5cGVkZWYgdHlwZW5hbWUgX19ib29sMnR5cGU8X1NUTFBfSVNfUE9EKF9UcCk+OjpfUmV0IGlzX1BPRF90eXBlOwotIyAgZW5kaWYKLX07Ci0KLSMgICAgaWYgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikKLXRlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBfSXNQdHI8X1RwKj4KLXsgdHlwZWRlZiBfX3RydWVfdHlwZSBfUmV0OyB9OwotdGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9Jc1JlZjxfVHAmPgoteyB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9SZXQ7IH07Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBfX3R5cGVfdHJhaXRzPF9UcCo+IDogX190eXBlX3RyYWl0c19hdXg8X190cnVlX3R5cGU+Ci17fTsKLSMgICAgZW5kaWYgLyogX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTiAqLwotCi0jICBlbmRpZiAvKiBfU1RMUF9TSU1VTEFURV9QQVJUSUFMX1NQRUNfRk9SX1RZUEVfVFJBSVRTICovCi0KLS8vIFByb3ZpZGUgc29tZSBzcGVjaWFsaXphdGlvbnMuICBUaGlzIGlzIGhhcm1sZXNzIGZvciBjb21waWxlcnMgdGhhdAotLy8gIGhhdmUgYnVpbHQtaW4gX190eXBlc190cmFpdHMgc3VwcG9ydCwgYW5kIGVzc2VudGlhbCBmb3IgY29tcGlsZXJzCi0vLyAgdGhhdCBkb24ndC4KLSMgIGlmICFkZWZpbmVkIChfU1RMUF9RVUFMSUZJRURfU1BFQ0lBTElaQVRJT05fQlVHKQotIyAgICBkZWZpbmUgX1NUTFBfREVGSU5FX1RZUEVfVFJBSVRTX0ZPUihUeXBlKSBcCi1fU1RMUF9URU1QTEFURV9OVUxMIHN0cnVjdCBfX3R5cGVfdHJhaXRzPCBUeXBlID4gOiBfX3R5cGVfdHJhaXRzX2F1eDxfX3RydWVfdHlwZT4ge307IFwKLV9TVExQX1RFTVBMQVRFX05VTEwgc3RydWN0IF9fdHlwZV90cmFpdHM8IGNvbnN0IFR5cGUgPiA6IF9fdHlwZV90cmFpdHNfYXV4PF9fdHJ1ZV90eXBlPiB7fTsgXAotX1NUTFBfVEVNUExBVEVfTlVMTCBzdHJ1Y3QgX190eXBlX3RyYWl0czwgdm9sYXRpbGUgVHlwZSA+IDogX190eXBlX3RyYWl0c19hdXg8X190cnVlX3R5cGU+IHt9OyBcCi1fU1RMUF9URU1QTEFURV9OVUxMIHN0cnVjdCBfX3R5cGVfdHJhaXRzPCBjb25zdCB2b2xhdGlsZSBUeXBlID4gOiBfX3R5cGVfdHJhaXRzX2F1eDxfX3RydWVfdHlwZT4ge30KLSMgIGVsc2UKLSMgICAgZGVmaW5lIF9TVExQX0RFRklORV9UWVBFX1RSQUlUU19GT1IoVHlwZSkgXAotX1NUTFBfVEVNUExBVEVfTlVMTCBzdHJ1Y3QgX190eXBlX3RyYWl0czwgVHlwZSA+IDogX190eXBlX3RyYWl0c19hdXg8X190cnVlX3R5cGU+IHt9OwotIyAgZW5kaWYKLQotIyAgaWZuZGVmIF9TVExQX05PX0JPT0wKLV9TVExQX0RFRklORV9UWVBFX1RSQUlUU19GT1IoYm9vbCk7Ci0jICBlbmRpZiAvKiBfU1RMUF9OT19CT09MICovCi1fU1RMUF9ERUZJTkVfVFlQRV9UUkFJVFNfRk9SKGNoYXIpOwotIyAgaWZuZGVmIF9TVExQX05PX1NJR05FRF9CVUlMVElOUwotX1NUTFBfREVGSU5FX1RZUEVfVFJBSVRTX0ZPUihzaWduZWQgY2hhcik7Ci0jICBlbmRpZgotX1NUTFBfREVGSU5FX1RZUEVfVFJBSVRTX0ZPUih1bnNpZ25lZCBjaGFyKTsKLSMgIGlmIGRlZmluZWQgKCBfU1RMUF9IQVNfV0NIQVJfVCApICYmICEgZGVmaW5lZCAoX1NUTFBfV0NIQVJfVF9JU19VU0hPUlQpCi1fU1RMUF9ERUZJTkVfVFlQRV9UUkFJVFNfRk9SKHdjaGFyX3QpOwotIyAgZW5kaWYgLyogX1NUTFBfSEFTX1dDSEFSX1QgKi8KLQotX1NUTFBfREVGSU5FX1RZUEVfVFJBSVRTX0ZPUihzaG9ydCk7Ci1fU1RMUF9ERUZJTkVfVFlQRV9UUkFJVFNfRk9SKHVuc2lnbmVkIHNob3J0KTsKLV9TVExQX0RFRklORV9UWVBFX1RSQUlUU19GT1IoaW50KTsKLV9TVExQX0RFRklORV9UWVBFX1RSQUlUU19GT1IodW5zaWduZWQgaW50KTsKLV9TVExQX0RFRklORV9UWVBFX1RSQUlUU19GT1IobG9uZyk7Ci1fU1RMUF9ERUZJTkVfVFlQRV9UUkFJVFNfRk9SKHVuc2lnbmVkIGxvbmcpOwotCi0jICBpZmRlZiBfU1RMUF9MT05HX0xPTkcKLV9TVExQX0RFRklORV9UWVBFX1RSQUlUU19GT1IoX1NUTFBfTE9OR19MT05HKTsKLV9TVExQX0RFRklORV9UWVBFX1RSQUlUU19GT1IodW5zaWduZWQgX1NUTFBfTE9OR19MT05HKTsKLSMgIGVuZGlmIC8qIF9TVExQX0xPTkdfTE9ORyAqLwotCi1fU1RMUF9ERUZJTkVfVFlQRV9UUkFJVFNfRk9SKGZsb2F0KTsKLV9TVExQX0RFRklORV9UWVBFX1RSQUlUU19GT1IoZG91YmxlKTsKLQotIyAgaWYgIWRlZmluZWQgKCBfU1RMUF9OT19MT05HX0RPVUJMRSApCi1fU1RMUF9ERUZJTkVfVFlQRV9UUkFJVFNfRk9SKGxvbmcgZG91YmxlKTsKLSMgIGVuZGlmCi0KLSNpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQotdGVtcGxhdGUgPGNsYXNzIF9BcmVQdHJzLCBjbGFzcyBfU3JjLCBjbGFzcyBfRHN0Pgotc3RydWN0IF9Jc0NWQ29udmVydGlibGVJZgoteyB0eXBlZGVmIHR5cGVuYW1lIF9Jc0NWQ29udmVydGlibGU8X1NyYywgX0RzdD46Ol9SZXQgX1JldDsgfTsKLQotdGVtcGxhdGUgPGNsYXNzIF9TcmMsIGNsYXNzIF9Ec3Q+Ci1zdHJ1Y3QgX0lzQ1ZDb252ZXJ0aWJsZUlmPF9fZmFsc2VfdHlwZSwgX1NyYywgX0RzdD4KLXsgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgX1JldDsgfTsKLSNlbHNlCi0jICBpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVfQ0xBU1NFUykKLXRlbXBsYXRlIDxjbGFzcyBfQXJlUHRycz4KLXN0cnVjdCBfSXNDVkNvbnZlcnRpYmxlSWZBdXggewotICB0ZW1wbGF0ZSA8Y2xhc3MgX1NyYywgY2xhc3MgX0RzdD4KLSAgc3RydWN0IF9JbgotICB7IHR5cGVkZWYgdHlwZW5hbWUgX0lzQ1ZDb252ZXJ0aWJsZTxfU3JjLCBfRHN0Pjo6X1JldCBfUmV0OyB9OwotfTsKLQotX1NUTFBfVEVNUExBVEVfTlVMTAotc3RydWN0IF9Jc0NWQ29udmVydGlibGVJZkF1eDxfX2ZhbHNlX3R5cGU+IHsKLSAgdGVtcGxhdGUgPGNsYXNzIF9TcmMsIGNsYXNzIF9Ec3Q+Ci0gIHN0cnVjdCBfSW4KLSAgeyB0eXBlZGVmIF9fZmFsc2VfdHlwZSBfUmV0OyB9OwotfTsKLQotdGVtcGxhdGUgPGNsYXNzIF9BcmVQdHJzLCBjbGFzcyBfU3JjLCBjbGFzcyBfRHN0Pgotc3RydWN0IF9Jc0NWQ29udmVydGlibGVJZiB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0lzQ1ZDb252ZXJ0aWJsZUlmQXV4PF9BcmVQdHJzPjo6X1NUTFBfVEVNUExBVEUgX0luPF9TcmMsIF9Ec3Q+OjpfUmV0IF9SZXQ7Ci19OwotIyAgZWxzZQotLyogZGVmYXVsdCBiZWhhdmlvcjogd2UgcHJlZmVyIHRvIG1pc3MgYW4gb3B0aW1pemF0aW9uIHJhdGhlciB0aGFuIHRha2luZyB0aGUgcmlzayBvZgotICogYSBjb21waWxhdGlvbiBlcnJvciBpZiBwbGF5aW5nIHdpdGggdHlwZXMgd2l0aCBleG90aWMgbWVtb3J5IGFsaWdubWVudC4KLSAqLwotdGVtcGxhdGUgPGNsYXNzIF9BcmVQdHJzLCBjbGFzcyBfU3JjLCBjbGFzcyBfRHN0Pgotc3RydWN0IF9Jc0NWQ29udmVydGlibGVJZgoteyB0eXBlZGVmIF9fZmFsc2VfdHlwZSBfUmV0OyB9OwotIyAgZW5kaWYKLSNlbmRpZgotCi10ZW1wbGF0ZSA8Y2xhc3MgX1NyYywgY2xhc3MgX0RzdD4KLXN0cnVjdCBfVHJpdmlhbE5hdGl2ZVR5cGVDb3B5IHsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfSXNQdHI8X1NyYz46Ol9SZXQgX1B0cjE7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0lzUHRyPF9Ec3Q+OjpfUmV0IF9QdHIyOwotICB0eXBlZGVmIHR5cGVuYW1lIF9MYW5kMjxfUHRyMSwgX1B0cjI+OjpfUmV0IF9Cb3RoUHRyczsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfSXNDVkNvbnZlcnRpYmxlSWY8X0JvdGhQdHJzLCBfU3JjLCBfRHN0Pjo6X1JldCBfQ29udmVydGlibGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0xhbmQyPF9Cb3RoUHRycywgX0NvbnZlcnRpYmxlPjo6X1JldCBfVHJpdmlhbDE7Ci0KLSAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jvb2wydHlwZTwoc2l6ZW9mKF9TcmMpID09IHNpemVvZihfRHN0KSk+OjpfUmV0IF9TYW1lU2l6ZTsKLQotICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0ludGVncmFsPF9TcmM+OjpfUmV0IF9JbnQxOwotICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0ludGVncmFsPF9Ec3Q+OjpfUmV0IF9JbnQyOwotICB0eXBlZGVmIHR5cGVuYW1lIF9MYW5kMjxfSW50MSwgX0ludDI+OjpfUmV0IF9Cb3RoSW50czsKLQotICB0eXBlZGVmIHR5cGVuYW1lIF9Jc1JhdGlvbmFsPF9TcmM+OjpfUmV0IF9SYXQxOwotICB0eXBlZGVmIHR5cGVuYW1lIF9Jc1JhdGlvbmFsPF9Ec3Q+OjpfUmV0IF9SYXQyOwotICB0eXBlZGVmIHR5cGVuYW1lIF9MYW5kMjxfUmF0MSwgX1JhdDI+OjpfUmV0IF9Cb3RoUmF0czsKLQotICB0eXBlZGVmIHR5cGVuYW1lIF9Mb3IyPF9Cb3RoSW50cywgX0JvdGhSYXRzPjo6X1JldCBfQm90aE5hdGl2ZXM7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0xhbmQyPF9Cb3RoTmF0aXZlcywgX1NhbWVTaXplPjo6X1JldCBfVHJpdmlhbDI7Ci0KLSAgdHlwZWRlZiB0eXBlbmFtZSBfTG9yMjxfVHJpdmlhbDEsIF9Ucml2aWFsMj46Ol9SZXQgX1JldDsKLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBfU3JjLCBjbGFzcyBfRHN0Pgotc3RydWN0IF9Ucml2aWFsQ29weSB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX1RyaXZpYWxOYXRpdmVUeXBlQ29weTxfU3JjLCBfRHN0Pjo6X1JldCBfTmF0aXZlUmV0OwotCi0jaWYgIWRlZmluZWQgKF9fQk9STEFORENfXykgfHwgKF9fQk9STEFORENfXyAhPSAweDU2MCkKLSAgdHlwZWRlZiB0eXBlbmFtZSBfX3R5cGVfdHJhaXRzPF9TcmM+OjpoYXNfdHJpdmlhbF9hc3NpZ25tZW50X29wZXJhdG9yIF9UcjE7Ci0jZWxzZQotICB0eXBlZGVmIHR5cGVuYW1lIF9VbkNvbnN0UHRyPF9TcmMqPjo6X1R5cGUgX1RwMzsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfX3R5cGVfdHJhaXRzPF9UcDM+OjpoYXNfdHJpdmlhbF9hc3NpZ25tZW50X29wZXJhdG9yIF9UcjE7Ci0jZW5kaWYKLSAgdHlwZWRlZiB0eXBlbmFtZSBfQXJlU2FtZVVuQ1ZUeXBlczxfU3JjLCBfRHN0Pjo6X1JldCBfVHIyOwotICB0eXBlZGVmIHR5cGVuYW1lIF9MYW5kMjxfVHIxLCBfVHIyPjo6X1JldCBfVXNlclJldDsKLQotICB0eXBlZGVmIHR5cGVuYW1lIF9Mb3IyPF9OYXRpdmVSZXQsIF9Vc2VyUmV0Pjo6X1JldCBfUmV0OwotICBzdGF0aWMgX1JldCBfQW5zd2VyKCkgeyByZXR1cm4gX1JldCgpOyB9Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgX1NyYywgY2xhc3MgX0RzdD4KLXN0cnVjdCBfVHJpdmlhbFVDb3B5IHsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfVHJpdmlhbE5hdGl2ZVR5cGVDb3B5PF9TcmMsIF9Ec3Q+OjpfUmV0IF9OYXRpdmVSZXQ7Ci0KLSNpZiAhZGVmaW5lZCAoX19CT1JMQU5EQ19fKSB8fCAoX19CT1JMQU5EQ19fICE9IDB4NTYwKQotICB0eXBlZGVmIHR5cGVuYW1lIF9fdHlwZV90cmFpdHM8X1NyYz46Omhhc190cml2aWFsX2NvcHlfY29uc3RydWN0b3IgX1RyMTsKLSNlbHNlCi0gIHR5cGVkZWYgdHlwZW5hbWUgX1VuQ29uc3RQdHI8X1NyYyo+OjpfVHlwZSBfVHAzOwotICB0eXBlZGVmIHR5cGVuYW1lIF9fdHlwZV90cmFpdHM8X1RwMz46Omhhc190cml2aWFsX2NvcHlfY29uc3RydWN0b3IgX1RyMTsKLSNlbmRpZgotICB0eXBlZGVmIHR5cGVuYW1lIF9BcmVTYW1lVW5DVlR5cGVzPF9TcmMsIF9Ec3Q+OjpfUmV0IF9UcjI7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0xhbmQyPF9UcjEsIF9UcjI+OjpfUmV0IF9Vc2VyUmV0OwotCi0gIHR5cGVkZWYgdHlwZW5hbWUgX0xvcjI8X05hdGl2ZVJldCwgX1VzZXJSZXQ+OjpfUmV0IF9SZXQ7Ci0gIHN0YXRpYyBfUmV0IF9BbnN3ZXIoKSB7IHJldHVybiBfUmV0KCk7IH0KLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1zdHJ1Y3QgX0RlZmF1bHRaZXJvVmFsdWUgewotICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0ludGVncmFsPF9UcD46Ol9SZXQgX1RyMTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfSXNSYXRpb25hbDxfVHA+OjpfUmV0IF9UcjI7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0lzUHRyPF9UcD46Ol9SZXQgX1RyMzsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfTG9yMzxfVHIxLCBfVHIyLCBfVHIzPjo6X1JldCBfUmV0OwotfTsKLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLXN0cnVjdCBfVHJpdmlhbEluaXQgewotI2lmICFkZWZpbmVkIChfX0JPUkxBTkRDX18pIHx8IChfX0JPUkxBTkRDX18gIT0gMHg1NjApCi0gIHR5cGVkZWYgdHlwZW5hbWUgX190eXBlX3RyYWl0czxfVHA+OjpoYXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yIF9UcjE7Ci0jZWxzZQotICB0eXBlZGVmIHR5cGVuYW1lIF9VbkNvbnN0UHRyPF9UcCo+OjpfVHlwZSBfVHAxOwotICB0eXBlZGVmIHR5cGVuYW1lIF9fdHlwZV90cmFpdHM8X1RwMT46Omhhc190cml2aWFsX2NvcHlfY29uc3RydWN0b3IgX1RyMTsKLSNlbmRpZgotICB0eXBlZGVmIHR5cGVuYW1lIF9EZWZhdWx0WmVyb1ZhbHVlPF9UcD46Ol9SZXQgX1RyMjsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfTm90PF9UcjI+OjpfUmV0IF9UcjM7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0xhbmQyPF9UcjEsIF9UcjM+OjpfUmV0IF9SZXQ7Ci0gIHN0YXRpYyBfUmV0IF9BbnN3ZXIoKSB7IHJldHVybiBfUmV0KCk7IH0KLX07Ci0KLSNlbmRpZiAvKiAhX1NUTFBfVVNFX0JPT1NUX1NVUFBPUlQgKi8KLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLXN0cnVjdCBfSXNQdHJUeXBlIHsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfSXNQdHI8X1RwPjo6X1JldCBfVHlwZTsKLSAgc3RhdGljIF9UeXBlIF9SZXQoKSB7IHJldHVybiBfVHlwZSgpOyB9Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotc3RydWN0IF9Jc1JlZlR5cGUgewotICB0eXBlZGVmIHR5cGVuYW1lIF9Jc1JlZjxfVHA+OjpfUmV0IF9UeXBlOwotICBzdGF0aWMgX1R5cGUgX1JldCgpIHsgcmV0dXJuIF9UeXBlKCk7fQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLXN0cnVjdCBfX2NhbGxfdHJhaXRzIHsKLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfQk9PU1RfU1VQUE9SVCkgJiYgIWRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpCi0gIHR5cGVkZWYgdHlwZW5hbWUgX19zZWxlY3Q8IDo6Ym9vc3Q6OmlzX3JlZmVyZW5jZTxfVHA+Ojp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1RwLCB0eXBlbmFtZSA6OmJvb3N0OjphZGRfcmVmZXJlbmNlPCB0eXBlbmFtZSA6OmJvb3N0OjphZGRfY29uc3Q8X1RwPjo6dHlwZSA+Ojp0eXBlPjo6X1JldCBwYXJhbV90eXBlOwotI2Vsc2UKLSAgdHlwZWRlZiBjb25zdCBfVHAmIHBhcmFtX3R5cGU7Ci0jZW5kaWYgLyogX1NUTFBfVVNFX0JPT1NUX1NVUFBPUlQgKi8KLX07Ci0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX0JPT1NUX1NVUFBPUlQpICYmICFkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKSAmJiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLXN0cnVjdCBfX2NhbGxfdHJhaXRzPF9UcCY+Ci17IHR5cGVkZWYgX1RwJiBwYXJhbV90eXBlOyB9OwotI2VuZGlmCi0KLXRlbXBsYXRlIDxjbGFzcyBfVHAxLCBjbGFzcyBfVHAyPgotc3RydWN0IF9Cb3RoUHRyVHlwZSB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0lzUHRyPF9UcDE+OjpfUmV0IF9Jc1B0cjE7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0lzUHRyPF9UcDI+OjpfUmV0IF9Jc1B0cjI7Ci0KLSAgdHlwZWRlZiB0eXBlbmFtZSBfTGFuZDI8X0lzUHRyMSwgX0lzUHRyMj46Ol9SZXQgX1JldDsKLSAgc3RhdGljIF9SZXQgX0Fuc3dlcigpIHsgcmV0dXJuIF9SZXQoKTsgfQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIF9UcDEsIGNsYXNzIF9UcDIsIGNsYXNzIF9Jc1JlZjEsIGNsYXNzIF9Jc1JlZjI+Ci1zdHJ1Y3QgX09LVG9Td2FwIHsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfQXJlU2FtZVVuQ1ZUeXBlczxfVHAxLCBfVHAyPjo6X1JldCBfU2FtZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfTGFuZDM8X1NhbWUsIF9Jc1JlZjEsIF9Jc1JlZjI+OjpfUmV0IF9UeXBlOwotICBzdGF0aWMgX1R5cGUgX0Fuc3dlcigpIHsgcmV0dXJuIF9UeXBlKCk7IH0KLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHAxLCBjbGFzcyBfVHAyLCBjbGFzcyBfSXNSZWYxLCBjbGFzcyBfSXNSZWYyPgotaW5saW5lIF9PS1RvU3dhcDxfVHAxLCBfVHAyLCBfSXNSZWYxLCBfSXNSZWYyPgotX0lzT0tUb1N3YXAoX1RwMSosIF9UcDIqLCBjb25zdCBfSXNSZWYxJiwgY29uc3QgX0lzUmVmMiYpCi17IHJldHVybiBfT0tUb1N3YXA8X1RwMSwgX1RwMiwgX0lzUmVmMSwgX0lzUmVmMj4oKTsgfQotCi10ZW1wbGF0ZSA8Y2xhc3MgX1NyYywgY2xhc3MgX0RzdD4KLWlubGluZSBfVHJpdmlhbENvcHk8X1NyYywgX0RzdD4gX1VzZVRyaXZpYWxDb3B5KF9TcmMqLCBfRHN0KikKLXsgcmV0dXJuIF9Ucml2aWFsQ29weTxfU3JjLCBfRHN0PigpOyB9Ci0KLXRlbXBsYXRlIDxjbGFzcyBfU3JjLCBjbGFzcyBfRHN0PgotaW5saW5lIF9Ucml2aWFsVUNvcHk8X1NyYywgX0RzdD4gX1VzZVRyaXZpYWxVQ29weShfU3JjKiwgX0RzdCopCi17IHJldHVybiBfVHJpdmlhbFVDb3B5PF9TcmMsIF9Ec3Q+KCk7IH0KLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWlubGluZSBfVHJpdmlhbEluaXQ8X1RwPiBfVXNlVHJpdmlhbEluaXQoX1RwKikKLXsgcmV0dXJuIF9Ucml2aWFsSW5pdDxfVHA+KCk7IH0KLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLXN0cnVjdCBfSXNQT0QgewotICB0eXBlZGVmIHR5cGVuYW1lIF9fdHlwZV90cmFpdHM8X1RwPjo6aXNfUE9EX3R5cGUgX1R5cGU7Ci0gIHN0YXRpYyBfVHlwZSBfQW5zd2VyKCkgeyByZXR1cm4gX1R5cGUoKTsgfQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLWlubGluZSBfSXNQT0Q8X1RwPiBfSXNfUE9EKF9UcCopCi17IHJldHVybiBfSXNQT0Q8X1RwPigpOyB9Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1zdHJ1Y3QgX0RlZmF1bHRaZXJvVmFsdWVRdWVzdGlvbiB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgX0RlZmF1bHRaZXJvVmFsdWU8X1RwPjo6X1JldCBfUmV0OwotICBzdGF0aWMgX1JldCBfQW5zd2VyKCkgeyByZXR1cm4gX1JldCgpOyB9Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotaW5saW5lIF9EZWZhdWx0WmVyb1ZhbHVlUXVlc3Rpb248X1RwPiBfSGFzRGVmYXVsdFplcm9WYWx1ZShfVHAqKQoteyByZXR1cm4gX0RlZmF1bHRaZXJvVmFsdWVRdWVzdGlvbjxfVHA+KCk7IH0KLQotLyoKLSAqIEJhc2UgY2xhc3MgdXNlZDoKLSAqIC0gdG8gc2ltdWxhdGUgcGFydGlhbCB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbgotICogLSB0byBzaW11bGF0ZSBwYXJ0aWFsIGZ1bmN0aW9uIG9yZGVyaW5nCi0gKiAtIHRvIHJlY29nbml6ZSBTVExwb3J0IGNsYXNzIGZyb20gdXNlciBzcGVjaWFsaXplZCBvbmUKLSAqLwotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLXN0cnVjdCBfX3N0bHBvcnRfY2xhc3MKLXsgdHlwZWRlZiBfVHAgX1R5cGU7IH07Ci0KLXRlbXBsYXRlIDxjbGFzcyBfVHA+Ci1zdHJ1Y3QgX0lzU1RMcG9ydENsYXNzIHsKLSAgdHlwZWRlZiB0eXBlbmFtZSBfSXNDb252ZXJ0aWJsZTxfVHAsIF9fc3RscG9ydF9jbGFzczxfVHA+ID46Ol9SZXQgX1JldDsKLSNpZiBkZWZpbmVkIChfX0JPUkxBTkRDX18pCi0gIGVudW0geyBfSXMgPSBfSXNDb252ZXJ0aWJsZTxfVHAsIF9fc3RscG9ydF9jbGFzczxfVHA+ID46OnZhbHVlIH07Ci0jZW5kaWYKLX07Ci0KLSNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUEFSVElBTF9TUEVDX1dPUktBUk9VTkQpICYmICFkZWZpbmVkIChfU1RMUF9GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIpCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotc3RydWN0IF9Td2FwSW1wbGVtZW50ZWQgewotICB0eXBlZGVmIHR5cGVuYW1lIF9Jc1NUTHBvcnRDbGFzczxfVHA+OjpfUmV0IF9SZXQ7Ci0jICBpZiBkZWZpbmVkIChfX0JPUkxBTkRDX18pCi0gIGVudW0geyBfSXMgPSBfSXNTVExwb3J0Q2xhc3M8X1RwPjo6X0lzIH07Ci0jICBlbmRpZgotfTsKLSNlbmRpZgotCi10ZW1wbGF0ZSA8Y2xhc3MgX1RwPgotY2xhc3MgX1RwV2l0aFN0YXRlIDogcHJpdmF0ZSBfVHAgewotICBfVHBXaXRoU3RhdGUoKTsKLSAgaW50IF9zdGF0ZTsKLX07Ci0KLS8qIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVscGVyIHN0cnVjdCB1c2VkIHRvIGd1ZXNzIGlmIHdlIGFyZSB3b3JraW5nCi0gKiBvbiBhIHN0YXRlbGVzcyBjbGFzcy4gSXQgY2FuIG9ubHkgYmUgaW5zdGFuY2lhdGVkIHdpdGggYSBjbGFzcyB0eXBlLiAqLwotdGVtcGxhdGUgPGNsYXNzIF9UcD4KLXN0cnVjdCBfSXNTdGF0ZWxlc3MgewotICBlbnVtIHsgX0lzID0gc2l6ZW9mKF9UcFdpdGhTdGF0ZTxfVHA+KSA9PSBzaXplb2YoaW50KSB9OwotICB0eXBlZGVmIHR5cGVuYW1lIF9fYm9vbDJ0eXBlPF9Jcz46Ol9SZXQgX1JldDsKLX07Ci0KLV9TVExQX0VORF9OQU1FU1BBQ0UKLQotI2lmZGVmIF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04KLSMgIGlmIGRlZmluZWQgKF9fQk9STEFORENfXykgfHwgXAotICAgICAgZGVmaW5lZCAoX19TVU5QUk9fQ0MpIHx8ICBcCi0gICAgIChkZWZpbmVkIChfX01XRVJLU19fKSAmJiAoX19NV0VSS1NfXyA8PSAweDIzMDMpKSB8fCBcCi0gICAgIChkZWZpbmVkIChfX3NnaSkgJiYgZGVmaW5lZCAoX0NPTVBJTEVSX1ZFUlNJT04pKSB8fCBcCi0gICAgICBkZWZpbmVkIChfX0RNQ19fKQotIyAgICBkZWZpbmUgX1NUTFBfSVNfUE9EX0lURVIoX0l0LCBfVHApIF9fdHlwZV90cmFpdHM8IHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czwgX1RwID46OnZhbHVlX3R5cGUgPjo6aXNfUE9EX3R5cGUoKQotIyAgZWxzZQotIyAgICBkZWZpbmUgX1NUTFBfSVNfUE9EX0lURVIoX0l0LCBfVHApIHR5cGVuYW1lIF9fdHlwZV90cmFpdHM8IHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czwgX1RwID46OnZhbHVlX3R5cGUgPjo6aXNfUE9EX3R5cGUoKQotIyAgZW5kaWYKLSNlbHNlCi0jICBkZWZpbmUgX1NUTFBfSVNfUE9EX0lURVIoX0l0LCBfVHApIF9Jc19QT0QoIF9TVExQX1ZBTFVFX1RZUEUoIF9JdCwgX1RwICkgKS5fQW5zd2VyKCkKLSNlbmRpZgotCi0jZW5kaWYgLyogX1NUTFBfVFlQRV9UUkFJVFNfSCAqLwotCi0vLyBMb2NhbCBWYXJpYWJsZXM6Ci0vLyBtb2RlOkMrKwotLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RscG9ydC9hbGdvcml0aG0gYi9zdGxwb3J0L2FsZ29yaXRobQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjUzZDhjCi0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9hbGdvcml0aG0KQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfQUxHT1JJVEhNCisKKyNpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHgxCisjICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgorIyAgZGVmaW5lIF9TVExQX0FMR09SSVRITQorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDEpCisjICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1NURElPCisvLyByZW1vdmUoKSBjb25mbGljdHMsIDxjc3RkaW8+IHNob3VsZCBhbHdheXMgZ28gZmlyc3QKKyMgICAgaW5jbHVkZSA8c3RsL19jc3RkaW8uaD4KKyMgIGVuZGlmCisKKyMgIGlmbmRlZiBfU1RMUF9JTlRFUk5BTF9BTEdPX0gKKyMgICAgaW5jbHVkZSA8c3RsL19hbGdvLmg+CisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAhPSAweDEpIHx8IGRlZmluZWQgKF9TVExQX0lNUE9SVF9WRU5ET1JfU1REKQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfSEFTX0lOQ0xVREVfTkVYVCkKKyMgICAgaW5jbHVkZV9uZXh0IDxhbGdvcml0aG0+CisjICBlbHNlCisjICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0hFQURFUihhbGdvcml0aG0pCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDEgKQorIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfQUxHT1JJVEhNICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGxwb3J0L2Fzc2VydC5oIGIvc3RscG9ydC9hc3NlcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTJkZDI2Ci0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9hc3NlcnQuaApAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmICFkZWZpbmVkIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEKQorIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHgyMDIKKyMgIGluY2x1ZGUgPHN0bC9fY3Byb2xvZy5oPgorI2VsaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgyMDIpICYmICEgZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQorIyAgZGVmaW5lIF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRAorI2VuZGlmCisKKy8qIGV2YzMgZG9lc24ndCBoYXZlIGFzc2VydC5oOyBtYWNybyBhc3NlcnQoKSBpcyBkZWZpbmVkIGluIHN0bF9ldmMuaCAqLworI2lmbmRlZiBfU1RMUF9XQ0VfRVZDMworIyAgaWYgIWRlZmluZWQgKGFzc2VydCkKKyMgICAgZGVmaW5lIF9TVExQX05BVElWRV9BU1NFUlRfSF9JTkNMVURFRAorIyAgICBpZiBkZWZpbmVkIChfU1RMUF9IQVNfSU5DTFVERV9ORVhUKQorIyAgICAgIGluY2x1ZGVfbmV4dCA8YXNzZXJ0Lmg+CisjICAgIGVsc2UKKyMgICAgICBpbmNsdWRlIF9TVExQX05BVElWRV9DX0hFQURFUihhc3NlcnQuaCkKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjICBpZiAhZGVmaW5lZCAoX1NUTFBfTkFUSVZFX0FTU0VSVF9IX0lOQ0xVREVEKQorLyogU2VlIGVycm5vLmggZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyAjZXJyb3IgKi8KKyMgICAgZXJyb3IgYXNzZXJ0IGhhcyBiZWVuIGRlZmluZWQgYmVmb3JlIGluY2x1c2lvbiBvZiBhc3NlcnQuaCBoZWFkZXIuCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDIwMikKKyMgIGlmICEgZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQorIyAgICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgICB1bmRlZiAgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZW5kaWYKKyMgIHVuZGVmICBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKKyNlbmRpZgorCisvKiBMb2NhbCBWYXJpYWJsZXM6CisgKiBtb2RlOkMrKworICogRW5kOgorICovCmRpZmYgLS1naXQgYS9zdGxwb3J0L2JpdHNldCBiL3N0bHBvcnQvYml0c2V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkN2ZjZjMKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L2JpdHNldApAQCAtMCwwICsxLDcwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk4CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX0JJVFNFVAorCisvLyBUaGlzIGltcGxlbWVudGF0aW9uIG9mIGJpdHNldDw+IGhhcyBhIHNlY29uZCB0ZW1wbGF0ZSBwYXJhbWV0ZXIsCisvLyBfV29yZFQsIHdoaWNoIGRlZmF1bHRzIHRvIHVuc2lnbmVkIGxvbmcuICAqWU9VIFNIT1VMRCBOT1QgVVNFCisvLyBUSElTIEZFQVRVUkUqLiAgSXQgaXMgZXhwZXJpbWVudGFsLCBhbmQgaXQgbWF5IGJlIHJlbW92ZWQgaW4KKy8vIGZ1dHVyZSByZWxlYXNlcy4KKworLy8gQSBiaXRzZXQgb2Ygc2l6ZSBOLCB1c2luZyB3b3JkcyBvZiB0eXBlIF9Xb3JkVCwgd2lsbCBoYXZlCisvLyBOICUgKHNpemVvZihfV29yZFQpICogQ0hBUl9CSVQpIHVudXNlZCBiaXRzLiAgKFRoZXkgYXJlIHRoZSBoaWdoLQorLy8gb3JkZXIgYml0cyBpbiB0aGUgaGlnaGVzdCB3b3JkLikgIEl0IGlzIGEgY2xhc3MgaW52YXJpYW50CisvLyBvZiBjbGFzcyBiaXRzZXQ8PiB0aGF0IHRob3NlIHVudXNlZCBiaXRzIGFyZSBhbHdheXMgemVyby4KKworLy8gTW9zdCBvZiB0aGUgYWN0dWFsIGNvZGUgaXNuJ3QgY29udGFpbmVkIGluIGJpdHNldDw+IGl0c2VsZiwgYnV0IGluIHRoZQorLy8gYmFzZSBjbGFzcyBfQmFzZV9iaXRzZXQuICBUaGUgYmFzZSBjbGFzcyB3b3JrcyB3aXRoIHdob2xlIHdvcmRzLCBub3Qgd2l0aAorLy8gaW5kaXZpZHVhbCBiaXRzLiAgVGhpcyBhbGxvd3MgdXMgdG8gc3BlY2lhbGl6ZSBfQmFzZV9iaXRzZXQgZm9yIHRoZQorLy8gaW1wb3J0YW50IHNwZWNpYWwgY2FzZSB3aGVyZSB0aGUgYml0c2V0IGlzIG9ubHkgYSBzaW5nbGUgd29yZC4KKworLy8gVGhlIEMrKyBzdGFuZGFyZCBkb2VzIG5vdCBkZWZpbmUgdGhlIHByZWNpc2Ugc2VtYW50aWNzIG9mIG9wZXJhdG9yW10uCisvLyBJbiB0aGlzIGltcGxlbWVudGF0aW9uIHRoZSBjb25zdCB2ZXJzaW9uIG9mIG9wZXJhdG9yW10gaXMgZXF1aXZhbGVudAorLy8gdG8gdGVzdCgpLCBleGNlcHQgdGhhdCBpdCBkb2VzIG5vIHJhbmdlIGNoZWNraW5nLiAgVGhlIG5vbi1jb25zdCB2ZXJzaW9uCisvLyByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIGEgYml0LCBhZ2FpbiB3aXRob3V0IGRvaW5nIGFueSByYW5nZSBjaGVja2luZy4KKworI2lmbmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDIKKyMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+CisjICBkZWZpbmUgX1NUTFBfQklUU0VUCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MikKKyMgIGlmbmRlZiBfU1RMUF9JTlRFUk5BTF9CSVRTRVQKKyMgICAgaW5jbHVkZSA8c3RsL19iaXRzZXQuaD4KKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEICE9IDB4MikgfHwgZGVmaW5lZCAoX1NUTFBfSU1QT1JUX1ZFTkRPUl9TVEQpCisjICBpZiBkZWZpbmVkIChfU1RMUF9IQVNfSU5DTFVERV9ORVhUKQorIyAgICBpbmNsdWRlX25leHQgPGJpdHNldD4KKyMgIGVsc2UKKyMgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfSEVBREVSKGJpdHNldCkKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MiApCisjICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9CSVRTRVQgKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bHBvcnQvY2Fzc2VydCBiL3N0bHBvcnQvY2Fzc2VydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWJkMGI0Ci0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9jYXNzZXJ0CkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MTAzCisjICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgorI2VsaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgxMDMpICYmICEgZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQorIyAgIGRlZmluZSBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKF9TVExQX1dDRV9FVkMzKQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX05FV19DX0hFQURFUlMpCisjICAgIGlmIGRlZmluZWQgKF9TVExQX0hBU19JTkNMVURFX05FWFQpCisjICAgICAgaW5jbHVkZV9uZXh0IDxjYXNzZXJ0PgorIyAgICBlbHNlCisjICAgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSEVBREVSKGNhc3NlcnQpCisjICAgIGVuZGlmCisjICBlbHNlCisjICAgIGluY2x1ZGUgPGFzc2VydC5oPgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgxMDMgKQorIyAgaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKKyMgICAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgICAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZWxzZQorIyAgICB1bmRlZiBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKKyMgIGVuZGlmCisjZW5kaWYKKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bHBvcnQvY2N0eXBlIGIvc3RscG9ydC9jY3R5cGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEzNTEyZQotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvY2N0eXBlCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX0NDVFlQRQorCisjaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MTA0CisjICBkZWZpbmUgX1NUTFBfQ0NUWVBFCisjICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDEwNCApCisjICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ0NUWVBFCisjICAgIGluY2x1ZGUgPHN0bC9fY2N0eXBlLmg+CisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAhPSAweDEwNCkgfHwgZGVmaW5lZCAoX1NUTFBfSU1QT1JUX1ZFTkRPUl9TVEQpCisjICBpZiBkZWZpbmVkIChfU1RMUF9IQVNfSU5DTFVERV9ORVhUKQorIyAgICBpbmNsdWRlX25leHQgPGNjdHlwZT4KKyMgIGVsc2UKKyMgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSEVBREVSKGNjdHlwZSkKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MTA0ICkKKyMgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+CisjICB1bmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjZW5kaWYKKworI2VuZGlmIC8qIF9TVExQX0NDVFlQRSAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RscG9ydC9jZXJybm8gYi9zdGxwb3J0L2NlcnJubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDE3ZmFmCi0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9jZXJybm8KQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfQ0VSUk5PCisjZGVmaW5lIF9TVExQX0NFUlJOTworCisjaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MTA1CisjICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfV0NFCisjICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfTkVXX0NfSEVBREVSUykKKyMgICAgaWYgZGVmaW5lZCAoX1NUTFBfSEFTX0lOQ0xVREVfTkVYVCkKKyMgICAgICBpbmNsdWRlX25leHQgPGNlcnJubz4KKyMgICAgZWxzZQorIyAgICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUihjZXJybm8pCisjICAgIGVuZGlmCisjICBlbHNlCisjICAgIGluY2x1ZGUgPGVycm5vLmg+CisjICBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgZXJybm8gLyogZXJybm8gaXMgbm90IGEgbWFjcm8gKi8KKyMgIGlmIGRlZmluZWQgKF9TVExQX0lNUE9SVF9WRU5ET1JfQ1NURCkKKyMgICAgICBpZiAhZGVmaW5lZCAoX19JQk1DUFBfXykgJiYgIWRlZmluZWQgKF9faHB1eCkgJiYgIWRlZmluZWQgKF9fTVdFUktTX18pICYmICFkZWZpbmVkIChfU1RMUF9XQ0UpCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjplcnJubzsKK19TVExQX0VORF9OQU1FU1BBQ0UKKyMgICAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgxMDUgKQorIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfQ0VSUk5PICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGxwb3J0L2NmbG9hdCBiL3N0bHBvcnQvY2Zsb2F0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMmUwY2QKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L2NmbG9hdApAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9DRkxPQVQKKyNkZWZpbmUgX1NUTFBfQ0ZMT0FUCisKKyNpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHgxMDYKKyMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+CisjZW5kaWYKKworLy8gQm9ybGFuZCBkZWZpbmVzIHNvbWUgaW1wbGVtZW50YXRpb24gY29uc3RhbnRzIGluIHN0ZDo6IG5hbWVzcGFjZSwKKy8vIHdlIGRvIG5vdCB3YW50IHRvIGltcG9ydCB0aGVtLgorI2lmIGRlZmluZWQgIChfU1RMUF9VU0VfTkVXX0NfSEVBREVSUykgJiYgIWRlZmluZWQgKF9fQk9STEFORENfXykKKyMgIGlmIGRlZmluZWQgKF9TVExQX0hBU19JTkNMVURFX05FWFQpCisjICAgIGluY2x1ZGVfbmV4dCA8Y2Zsb2F0PgorIyAgZWxzZQorIyAgICBpbmNsdWRlIF9TVExQX05BVElWRV9DUFBfQ19IRUFERVIoY2Zsb2F0KQorIyAgZW5kaWYKKyNlbHNlCisjICBpbmNsdWRlIDxmbG9hdC5oPgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDEwNiApCisjICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9DRkxPQVQgKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bHBvcnQvY2lzbzY0NiBiL3N0bHBvcnQvY2lzbzY0NgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDM0NDlkCi0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9jaXNvNjQ2CkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX0NJU082NDYKKyNkZWZpbmUgX1NUTFBfQ0lTTzY0NgorCisjaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MTA3CisjICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChfU1RMUF9XQ0VfRVZDMykgJiYgIWRlZmluZWQgKF9fQk9STEFORENfXykKKyMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9ORVdfQ19IRUFERVJTKQorIyAgICBpZiBkZWZpbmVkIChfU1RMUF9IQVNfSU5DTFVERV9ORVhUKQorIyAgICAgIGluY2x1ZGVfbmV4dCA8Y2lzbzY0Nj4KKyMgICAgZWxzZQorIyAgICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUihjaXNvNjQ2KQorIyAgICBlbmRpZgorIyAgZWxzZQorIyAgICBpbmNsdWRlIDxpc282NDYuaD4KKyMgIGVuZGlmIC8qIF9TVExQX1VTRV9ORVdfQ19IRUFERVJTICovCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MTA3ICkKKyMgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+CisjICB1bmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjZW5kaWYKKworI2VuZGlmIC8qIF9TVExQX0NJU082NDYgKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bHBvcnQvY2xpbWl0cyBiL3N0bHBvcnQvY2xpbWl0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmJjNDEzCi0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9jbGltaXRzCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX0NMSU1JVFMKKyMgZGVmaW5lIF9TVExQX0NMSU1JVFMKKworI2lmbmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDEwOAorIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19TVU5QUk9fQ0MpICYmICgoX19TVU5QUk9fQ0MgPT0gMHg1MDApICYmIChfX1NVTlBST19DQ19DT01QQVQgPiA0KSkKKyMgIGluY2x1ZGUgPC91c3IvaW5jbHVkZS9saW1pdHMuaD4KKyNlbGlmIGRlZmluZWQgKF9TVExQX1VTRV9ORVdfQ19IRUFERVJTKQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfSEFTX0lOQ0xVREVfTkVYVCkKKyMgICAgaW5jbHVkZV9uZXh0IDxjbGltaXRzPgorIyAgZWxzZQorIyAgICBpbmNsdWRlIF9TVExQX05BVElWRV9DUFBfQ19IRUFERVIoY2xpbWl0cykKKyMgIGVuZGlmCisjZWxzZQorIyAgaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKQorIyAgICBpZiBkZWZpbmVkIChfU1RMUF9IQVNfSU5DTFVERV9ORVhUKQorIyAgICAgIGluY2x1ZGVfbmV4dCA8bGltaXRzLmg+CisjICAgIGVsc2UKKyMgICAgICBpbmNsdWRlIF9TVExQX05BVElWRV9DX0hFQURFUihsaW1pdHMuaCkKKyMgICAgZW5kaWYKKyMgIGVsc2UKKyMgICAgaW5jbHVkZSA8bGltaXRzLmg+CisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAgMHgxMDggKQorIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfQ0xJTUlUUyAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RscG9ydC9jbG9jYWxlIGIvc3RscG9ydC9jbG9jYWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4OTk2Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L2Nsb2NhbGUKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfQ0xPQ0FMRQorCisjaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEICAweDEwOQorIyAgZGVmaW5lIF9TVExQX0NMT0NBTEUKKyMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+CisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MTA5KQorIyAgaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NMT0NBTEUKKyMgICAgaW5jbHVkZSA8c3RsL19jbG9jYWxlLmg+CisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAhPSAweDEwOSkgfHwgZGVmaW5lZCAoX1NUTFBfSU1QT1JUX1ZFTkRPUl9TVEQpCisjICBpZiBkZWZpbmVkIChfU1RMUF9IQVNfSU5DTFVERV9ORVhUKQorIyAgICBpbmNsdWRlX25leHQgPGNsb2NhbGU+CisjICBlbHNlCisjICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUihjbG9jYWxlKQorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgxMDkpCisjICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9DTE9DQUxFICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGxwb3J0L2NtYXRoIGIvc3RscG9ydC9jbWF0aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmE4ZjUyCi0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9jbWF0aApAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9DTUFUSAorCisjaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEICAweDExMAorIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KKyNlbGlmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MTEwKSAmJiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQorIyAgZGVmaW5lIF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRAorIyAgZGVmaW5lIF9TVExQX0NNQVRICisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MTEwKSAmJiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQorIyAgaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NNQVRICisjICAgIGluY2x1ZGUgPHN0bC9fY21hdGguaD4KKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEICE9IDB4MTEwKSB8fCBkZWZpbmVkIChfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQpIHx8IGRlZmluZWQgKF9TVExQX0lNUE9SVF9WRU5ET1JfU1REKQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfSEFTX0lOQ0xVREVfTkVYVCkKKyMgICAgaW5jbHVkZV9uZXh0IDxjbWF0aD4KKyMgIGVsc2UKKyMgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSEVBREVSKGNtYXRoKQorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gIDB4MTEwKQorIyAgaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKKyMgICAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgICAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZWxzZQorIyAgICB1bmRlZiBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKKyMgIGVuZGlmCisjZW5kaWYKKworI2VuZGlmIC8qIF9TVExQX0NNQVRIICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGxwb3J0L2NvbXBsZXggYi9zdGxwb3J0L2NvbXBsZXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNmZTYwNQotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvY29tcGxleApAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX0NPTVBMRVgKKworI2lmbmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDEwCisjICBkZWZpbmUgX1NUTFBfQ09NUExFWAorIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgxMCkKKy8vIFRoaXMgaGVhZGVyIGRlY2xhcmVzIHRoZSB0ZW1wbGF0ZSBjbGFzcyBjb21wbGV4LCBhcyBkZXNjcmliZWQgaW4KKy8vIGluIHRoZSBDKysgU3RhbmRhcmQuICBTaW5nbGUtcHJlY2lzaW9uIGNvbXBsZXggbnVtYmVycworLy8gYXJlIGNvbXBsZXg8ZmxvYXQ+LCBkb3VibGUtcHJlY2lzaW9uIGFyZSBjb21wbGV4PGRvdWJsZT4sIGFuZAorLy8gcXVhZCBwcmVjaXNpb24gYXJlIGNvbXBsZXg8bG9uZyBkb3VibGU+LgorCisvLyBOb3RlIHRoYXQgdGhlIHRlbXBsYXRlIGNsYXNzIGNvbXBsZXggaXMgZGVjbGFyZWQgd2l0aGluIG5hbWVzcGFjZQorLy8gc3RkLCBhcyBjYWxsZWQgZm9yIGJ5IHRoZSBkcmFmdCBDKysgc3RhbmRhcmQKKyMgIGlmbmRlZiBfU1RMUF9JTlRFUk5BTF9DT01QTEVYCisjICAgIGluY2x1ZGUgPHN0bC9fY29tcGxleC5oPgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgIT0gMHgxMCkgfHwgZGVmaW5lZCAoX1NUTFBfSU1QT1JUX1ZFTkRPUl9TVEQpCisjICBpZiBkZWZpbmVkIChfU1RMUF9IQVNfSU5DTFVERV9ORVhUKQorIyAgICBpbmNsdWRlX25leHQgPGNvbXBsZXg+CisjICBlbHNlCisjICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0hFQURFUihjb21wbGV4KQorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gIDB4MTAgKQorIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfQ09NUExFWCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RscG9ydC9jc2V0am1wIGIvc3RscG9ydC9jc2V0am1wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZjJiZDgKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L2NzZXRqbXAKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfQ1NFVEpNUAorCisjaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MTExCisjICBkZWZpbmUgX1NUTFBfQ1NFVEpNUAorIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgxMTEpCisjICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1NFVEpNUAorIyAgICBpbmNsdWRlIDxzdGwvX2NzZXRqbXAuaD4KKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEICE9IDB4MTExKSB8fCBkZWZpbmVkIChfU1RMUF9JTVBPUlRfVkVORE9SX1NURCkKKyMgIGlmIGRlZmluZWQgKF9TVExQX0hBU19JTkNMVURFX05FWFQpCisjICAgIGluY2x1ZGVfbmV4dCA8Y3NldGptcD4KKyMgIGVsc2UKKyMgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSEVBREVSKGNzZXRqbXApCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDExMSApCisjICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9DU0VUSk1QICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGxwb3J0L2NzaWduYWwgYi9zdGxwb3J0L2NzaWduYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IxYTMwZAotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvY3NpZ25hbApAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9DU0lHTkFMCisKKyNpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHgxMTIKKyMgIGRlZmluZSBfU1RMUF9DU0lHTkFMCisjICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDExMikKKyMgIGlmbmRlZiBfU1RMUF9JTlRFUk5BTF9DU0lHTkFMCisjICAgIGluY2x1ZGUgPHN0bC9fY3NpZ25hbC5oPgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgIT0gMHgxMTIpIHx8IGRlZmluZWQgKF9TVExQX0lNUE9SVF9WRU5ET1JfU1REKQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfSEFTX0lOQ0xVREVfTkVYVCkKKyMgICAgaW5jbHVkZV9uZXh0IDxjc2lnbmFsPgorIyAgZWxzZQorIyAgICBpbmNsdWRlIF9TVExQX05BVElWRV9DUFBfQ19IRUFERVIoY3NpZ25hbCkKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MTEyICkKKyMgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+CisjICB1bmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjZW5kaWYKKworI2VuZGlmIC8qIF9TVExQX0NTSUdOQUwgKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bHBvcnQvY3N0ZGFyZyBiL3N0bHBvcnQvY3N0ZGFyZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODgyYmJkCi0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9jc3RkYXJnCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX0NTVERBUkcKKworI2lmbmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDExMworIyAgZGVmaW5lIF9TVExQX0NTVERBUkcKKyMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+CisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MTEzKQorIyAgaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NTVERBUkcKKyMgICAgaW5jbHVkZSA8c3RsL19jc3RkYXJnLmg+CisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAhPSAweDExMykgfHwgZGVmaW5lZCAoX1NUTFBfSU1QT1JUX1ZFTkRPUl9TVEQpCisjICBpZiBkZWZpbmVkIChfU1RMUF9IQVNfSU5DTFVERV9ORVhUKQorIyAgICBpbmNsdWRlX25leHQgPGNzdGRhcmc+CisjICBlbHNlCisjICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUihjc3RkYXJnKQorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgxMTMgKQorIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfQ1NUREFSRyAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RscG9ydC9jc3RkZGVmIGIvc3RscG9ydC9jc3RkZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhNjZmMGUKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L2NzdGRkZWYKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfQ1NURERFRgorCisjaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MTE0CisjICBkZWZpbmUgX1NUTFBfQ1NURERFRgorIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgxMTQpCisjICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1NURERFRgorIyAgICBpbmNsdWRlIDxzdGwvX2NzdGRkZWYuaD4KKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEICE9IDB4MTE0KSB8fCBkZWZpbmVkIChfU1RMUF9JTVBPUlRfVkVORE9SX1NURCkKKyMgIGlmIGRlZmluZWQgKF9TVExQX0hBU19JTkNMVURFX05FWFQpCisjICAgIGluY2x1ZGVfbmV4dCA8Y3N0ZGRlZj4KKyMgIGVsc2UKKyMgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSEVBREVSKGNzdGRkZWYpCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDExNCApCisjICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9DU1REREVGICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGxwb3J0L2NzdGRpbyBiL3N0bHBvcnQvY3N0ZGlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMGM4ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L2NzdGRpbwpAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9DU1RESU8KKworI2lmbmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDE1CisjICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgorI2VsaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgxNSkgJiYgIWRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKKyMgIGRlZmluZSBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKKyMgIGRlZmluZSBfU1RMUF9DU1RESU8KKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgxNSkgJiYgIWRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKKyMgIGlmbmRlZiBfU1RMUF9JTlRFUk5BTF9DU1RESU8KKyMgICAgaW5jbHVkZSA8c3RsL19jc3RkaW8uaD4KKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEICE9IDB4MTUpIHx8IGRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkgfHwgZGVmaW5lZCAoX1NUTFBfSU1QT1JUX1ZFTkRPUl9TVEQpCisjICBpZiBkZWZpbmVkIChfU1RMUF9IQVNfSU5DTFVERV9ORVhUKQorIyAgICBpbmNsdWRlX25leHQgPGNzdGRpbz4KKyMgIGVsc2UKKyMgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSEVBREVSKGNzdGRpbykKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MTUpCisjICBpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQorIyAgICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgICB1bmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjICBlbHNlCisjICAgIHVuZGVmIF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRAorIyAgZW5kaWYKKyNlbmRpZgorCisjZW5kaWYKKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bHBvcnQvY3N0ZGxpYiBiL3N0bHBvcnQvY3N0ZGxpYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGFmYTM1Ci0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9jc3RkbGliCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX0NTVERMSUIKKworI2lmbmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDExNgorIyAgZGVmaW5lIF9TVExQX0NTVERMSUIKKyMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+CisjZW5kaWYKKworIyAgaWYgZGVmaW5lZCAoX19HTlVDX18pICYmIGRlZmluZWQgKF9fTUlOR1czMl9fKQorLyogTmF0aXZlIGNzdGRsaWIgaW5jbHVkZXMgc3RkbGliLmggdXNpbmcgYW4gaW5jbHVkZV9uZXh0IHNvIFNUTHBvcnQgc3RkbGliLmgKKyAqIGlzIG5vdCB1c2VkIGFuZCB0aGUgd29ya2Fyb3VuZCBpbiB0aGlzIGZpbGUgbXVzdCBiZSBkdXBsaWNhdGVkIGhlcmUKKyAqIChzZWUgc3RkbGliLmgpLiAqLworIyAgICBpbmNsdWRlICJlcnJuby5oIgorIyAgZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MTE2KQorIyAgaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NTVERMSUIKKyMgICAgaW5jbHVkZSA8c3RsL19jc3RkbGliLmg+CisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAhPSAweDExNikgfHwgZGVmaW5lZCAoX1NUTFBfSU1QT1JUX1ZFTkRPUl9TVEQpCisjICBpZiBkZWZpbmVkIChfU1RMUF9IQVNfSU5DTFVERV9ORVhUKQorIyAgICBpbmNsdWRlX25leHQgPGNzdGRsaWI+CisjICBlbHNlCisjICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUihjc3RkbGliKQorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgxMTYpCisjICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9DU1RETElCICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGxwb3J0L2NzdHJpbmcgYi9zdGxwb3J0L2NzdHJpbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVjZjU4ZAotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvY3N0cmluZwpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9DU1RSSU5HCisKKyNpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHgxMTcKKyMgIGRlZmluZSBfU1RMUF9DU1RSSU5HCisjICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDExNykKKyMgIGlmbmRlZiBfU1RMUF9JTlRFUk5BTF9DU1RSSU5HCisjICAgIGluY2x1ZGUgPHN0bC9fY3N0cmluZy5oPgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgIT0gMHgxMTcpIHx8IGRlZmluZWQgKF9TVExQX0lNUE9SVF9WRU5ET1JfU1REKQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfSEFTX0lOQ0xVREVfTkVYVCkKKyMgICAgaW5jbHVkZV9uZXh0IDxjc3RyaW5nPgorIyAgZWxzZQorIyAgICBpbmNsdWRlIF9TVExQX05BVElWRV9DUFBfQ19IRUFERVIoY3N0cmluZykKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MTE3KQorIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfQ1NUUklORyAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RscG9ydC9jdGltZSBiL3N0bHBvcnQvY3RpbWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFmYjdkZAotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvY3RpbWUKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfQ1RJTUUKKworI2lmbmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDExOAorIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KKyNlbGlmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MTE4KSAmJiAhIGRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKKyMgIGRlZmluZSBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKKyMgIGRlZmluZSBfU1RMUF9DVElNRQorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDExOCkgJiYgIWRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKKyMgIGlmbmRlZiBfU1RMUF9JTlRFUk5BTF9DVElNRQorIyAgICBpbmNsdWRlIDxzdGwvX2N0aW1lLmg+CisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAhPSAweDExOCkgfHwgZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKSB8fCBkZWZpbmVkIChfU1RMUF9JTVBPUlRfVkVORE9SX1NURCkKKyMgIGlmIGRlZmluZWQgKF9TVExQX0hBU19JTkNMVURFX05FWFQpCisjICAgIGluY2x1ZGVfbmV4dCA8Y3RpbWU+CisjICBlbHNlCisjICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUihjdGltZSkKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MTE4KQorIyAgaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKKyMgICAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgICAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZWxzZQorIyAgICB1bmRlZiBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKKyMgIGVuZGlmCisjZW5kaWYKKworI2VuZGlmIC8qIF9TVExQX0NUSU1FICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGxwb3J0L2N0eXBlLmggYi9zdGxwb3J0L2N0eXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjlkMTAwMAotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvY3R5cGUuaApAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfQ1RZUEVfSAorCisvKiBXb3JrYXJvdW5kIGZvciBhICJtaXNiZWhhdmlvdXIiIHdoZW4gY29tcGlsaW5nIHJlc291cmNlIHNjcmlwdHMgdXNpbmcKKyAqIGVNYmVkZGVkIFZpc3VhbCBDKysuIFRoZSBzdGFuZGFyZCAucmMgZmlsZSBpbmNsdWRlcyB3aW5kb3dzIGhlYWRlciBmaWxlcywKKyAqIHdoaWNoIGluIHR1cm4gaW5jbHVkZSBjdHlwZS5oLCB3aGljaCByZXN1bHRzIGluIHdhcm5pbmdzIGFuZCBlcnJvcnMKKyAqLworI2lmICFkZWZpbmVkKFJDX0lOVk9LRUQpCisKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEKQorIyAgICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDIxOQorIyAgICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgorIyAgZWxpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDIxOSkKKyMgICAgZGVmaW5lIF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRAorIyAgICBkZWZpbmUgX1NUTFBfQ1RZUEVfSAorIyAgZW5kaWYKKworIyAgaWYgZGVmaW5lZChfU1RMUF9XQ0VfRVZDMykKK3N0cnVjdCBfZXhjZXB0aW9uOworIyAgZW5kaWYKKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfSEFTX0lOQ0xVREVfTkVYVCkKKyMgICAgaW5jbHVkZV9uZXh0IDxjdHlwZS5oPgorIyAgZWxzZQorIyAgICBpbmNsdWRlIF9TVExQX05BVElWRV9DX0hFQURFUihjdHlwZS5oKQorIyAgZW5kaWYKKworLyogb24gZXZjNCBpbmNsdWRpbmcgY3R5cGUuaCBhbHNvIGRlZmluZXMgc2V0am1wIG1hY3JvICovCisjICBpZiBkZWZpbmVkIChfU1RMUF9XQ0UpCisjICAgIGRlZmluZSBfU1RMUF9OQVRJVkVfU0VUSk1QX0hfSU5DTFVERUQKKyMgIGVuZGlmCisKKyMgIGlmbmRlZiBfU1RMUF9DVFlQRV9IX1NFRU4KKyMgICAgZGVmaW5lIF9TVExQX0NUWVBFX0hfU0VFTgorCisvKiBVbmRlZiBjb252ZW5pZW5jZSBpbnRlcmZhY2VzICovCisjICAgIHVuZGVmIGlzc3BhY2UKKyMgICAgdW5kZWYgaXNwcmludAorIyAgICB1bmRlZiBpc2NudHJsCisjICAgIHVuZGVmIGlzdXBwZXIKKyMgICAgdW5kZWYgaXNsb3dlcgorIyAgICB1bmRlZiBpc2FscGhhCisjICAgIHVuZGVmIGlzZGlnaXQKKyMgICAgdW5kZWYgaXNwdW5jdAorIyAgICB1bmRlZiBpc3hkaWdpdAorIyAgICB1bmRlZiBpc2FsbnVtCisjICAgIHVuZGVmIGlzZ3JhcGgKKyMgICAgdW5kZWYgdG91cHBlcgorIyAgICB1bmRlZiB0b2xvd2VyCisKKyMgICAgaWYgZGVmaW5lZCAoVU5ERVJfQ0UpCisKKyMgICAgICBpZiAoX1dJTjMyX1dDRSA8IDMwMCkgICAgIC8qIE9ubHkgd2lkZSBjaGFycyBmb3Igb2xkZXIgdmVyc2lvbnMgKi8KKyMgICAgICAgIGRlZmluZSBfaXNjdHlwZSBpc3djdHlwZQorIyAgICAgIGVuZGlmCisKK19faW5saW5lIGludCAoaXNhbHBoYSkoaW50IGMpIHsgcmV0dXJuIF9pc2N0eXBlKGMsIF9BTFBIQSk7IH0KK19faW5saW5lIGludCAoaXN1cHBlcikoaW50IGMpIHsgcmV0dXJuIF9pc2N0eXBlKGMsIF9VUFBFUik7IH0KK19faW5saW5lIGludCAoaXNsb3dlcikoaW50IGMpIHsgcmV0dXJuIF9pc2N0eXBlKGMsIF9MT1dFUik7IH0KK19faW5saW5lIGludCAoaXNkaWdpdCkoaW50IGMpIHsgcmV0dXJuIF9pc2N0eXBlKGMsIF9ESUdJVCk7IH0KK19faW5saW5lIGludCAoaXN4ZGlnaXQpKGludCBjKSB7IHJldHVybiBfaXNjdHlwZShjLCBfSEVYKTsgfQorX19pbmxpbmUgaW50IChpc3NwYWNlKShpbnQgYykgeyByZXR1cm4gX2lzY3R5cGUoYywgX1NQQUNFKTsgfQorX19pbmxpbmUgaW50IChpc3B1bmN0KShpbnQgYykgeyByZXR1cm4gX2lzY3R5cGUoYywgX1BVTkNUKTsgfQorX19pbmxpbmUgaW50IChpc2FsbnVtKShpbnQgYykgeyByZXR1cm4gX2lzY3R5cGUoYywgX0FMUEhBfF9ESUdJVCk7IH0KK19faW5saW5lIGludCAoaXNwcmludCkoaW50IGMpIHsgcmV0dXJuIF9pc2N0eXBlKGMsIF9CTEFOS3xfUFVOQ1R8X0FMUEhBfF9ESUdJVCk7IH0KK19faW5saW5lIGludCAoaXNncmFwaCkoaW50IGMpIHsgcmV0dXJuIF9pc2N0eXBlKGMsIF9QVU5DVHxfQUxQSEF8X0RJR0lUKTsgfQorX19pbmxpbmUgaW50IChpc2NudHJsKShpbnQgYykgeyByZXR1cm4gX2lzY3R5cGUoYywgX0NPTlRST0wpOyB9CitfX2lubGluZSBpbnQgKGlzYXNjaWkpKGludCBjKSB7IHJldHVybiAoKHVuc2lnbmVkKShjKSA8IDB4ODApOyB9CisKKyMgICAgICB1bmRlZiBfaXNjdHlwZQorCitfX2lubGluZSBpbnQgKGlzd2FscGhhKShpbnQgYykgeyByZXR1cm4gaXN3Y3R5cGUoKHVuc2lnbmVkIHNob3J0KShjKSwgX0FMUEhBKTsgfQorX19pbmxpbmUgaW50IChpc3d1cHBlcikoaW50IGMpIHsgcmV0dXJuIGlzd2N0eXBlKCh1bnNpZ25lZCBzaG9ydCkoYyksIF9VUFBFUik7IH0KK19faW5saW5lIGludCAoaXN3bG93ZXIpKGludCBjKSB7IHJldHVybiBpc3djdHlwZSgodW5zaWduZWQgc2hvcnQpKGMpLCBfTE9XRVIpOyB9CitfX2lubGluZSBpbnQgKGlzd2RpZ2l0KShpbnQgYykgeyByZXR1cm4gaXN3Y3R5cGUoKHVuc2lnbmVkIHNob3J0KShjKSwgX0RJR0lUKTsgfQorX19pbmxpbmUgaW50IChpc3d4ZGlnaXQpKGludCBjKSB7IHJldHVybiBpc3djdHlwZSgodW5zaWduZWQgc2hvcnQpKGMpLCBfSEVYKTsgfQorX19pbmxpbmUgaW50IChpc3dzcGFjZSkoaW50IGMpIHsgcmV0dXJuIGlzd2N0eXBlKCh1bnNpZ25lZCBzaG9ydCkoYyksIF9TUEFDRSk7IH0KK19faW5saW5lIGludCAoaXN3cHVuY3QpKGludCBjKSB7IHJldHVybiBpc3djdHlwZSgodW5zaWduZWQgc2hvcnQpKGMpLCBfUFVOQ1QpOyB9CitfX2lubGluZSBpbnQgKGlzd2FsbnVtKShpbnQgYykgeyByZXR1cm4gaXN3Y3R5cGUoKHVuc2lnbmVkIHNob3J0KShjKSwgX0FMUEhBfF9ESUdJVCk7IH0KK19faW5saW5lIGludCAoaXN3cHJpbnQpKGludCBjKSB7IHJldHVybiBpc3djdHlwZSgodW5zaWduZWQgc2hvcnQpKGMpLCBfQkxBTkt8X1BVTkNUfF9BTFBIQXxfRElHSVQpOyB9CitfX2lubGluZSBpbnQgKGlzd2dyYXBoKShpbnQgYykgeyByZXR1cm4gaXN3Y3R5cGUoKHVuc2lnbmVkIHNob3J0KShjKSwgX1BVTkNUfF9BTFBIQXxfRElHSVQpOyB9CitfX2lubGluZSBpbnQgKGlzd2NudHJsKShpbnQgYykgeyByZXR1cm4gaXN3Y3R5cGUoKHVuc2lnbmVkIHNob3J0KShjKSwgX0NPTlRST0wpOyB9CitfX2lubGluZSBpbnQgKGlzd2FzY2lpKShpbnQgYykgeyByZXR1cm4gKCh1bnNpZ25lZCkoYykgPCAweDgwKTsgfQorCisjICAgIGVuZGlmIC8qIFVOREVSX0NFICovCisKKyMgIGVuZGlmIC8qIF9TVExQX0NUWVBFX0hfU0VFTiAqLworCisjICBpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDIxOSkKKyMgICAgaWYgISBkZWZpbmVkIChfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQpCisjICAgICAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgICAgICB1bmRlZiAgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgICBlbHNlCisjICAgICAgdW5kZWYgIF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRAorIyAgICBlbmRpZgorIyAgZW5kaWYKKworI2VuZGlmIC8qIFJDX0lOVk9LRUQgKi8KKworI2VuZGlmIC8qIF9TVExQX0NUWVBFX0ggKi8KZGlmZiAtLWdpdCBhL3N0bHBvcnQvY3djaGFyIGIvc3RscG9ydC9jd2NoYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIzMjA1NAotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvY3djaGFyCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX0NXQ0hBUgorCisjaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MTIwCisjICBkZWZpbmUgX1NUTFBfQ1dDSEFSCisjICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDEyMCkKKyMgIGlmbmRlZiBfU1RMUF9JTlRFUk5BTF9DV0NIQVIKKyMgICAgaW5jbHVkZSA8c3RsL19jd2NoYXIuaD4KKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEICE9IDB4MTIwKSB8fCBkZWZpbmVkIChfU1RMUF9JTVBPUlRfVkVORE9SX1NURCkKKyMgIGlmIGRlZmluZWQgKF9TVExQX0hBU19JTkNMVURFX05FWFQpCisjICAgIGluY2x1ZGVfbmV4dCA8Y3djaGFyPgorIyAgZWxzZQorIyAgICBpbmNsdWRlIF9TVExQX05BVElWRV9DUFBfQ19IRUFERVIoY3djaGFyKQorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgxMjApCisjICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9DV0NIQVIgKi8KKworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RscG9ydC9jd2N0eXBlIGIvc3RscG9ydC9jd2N0eXBlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlODYyMTgKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L2N3Y3R5cGUKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfQ1dDVFlQRQorCisjaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MTIxCisjICBkZWZpbmUgX1NUTFBfQ1dDVFlQRQorIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgxMjEpCisjICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1dDVFlQRQorIyAgICBpbmNsdWRlIDxzdGwvX2N3Y3R5cGUuaD4KKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEICE9IDB4MTIxKSB8fCBkZWZpbmVkIChfU1RMUF9JTVBPUlRfVkVORE9SX1NURCkKKyMgIGlmIGRlZmluZWQgKF9TVExQX0hBU19JTkNMVURFX05FWFQpCisjICAgIGluY2x1ZGVfbmV4dCA8Y3djdHlwZT4KKyMgIGVsc2UKKyMgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSEVBREVSKGN3Y3R5cGUpCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDEyMSkKKyMgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+CisjICB1bmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjZW5kaWYKKworI2VuZGlmIC8qIF9TVExQX0NXQ1RZUEUgKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bHBvcnQvZGVxdWUgYi9zdGxwb3J0L2RlcXVlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0OGYxNTkKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L2RlcXVlCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX0RFUVVFCisKKyNpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHgyMgorIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KKyMgIGRlZmluZSBfU1RMUF9ERVFVRQorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDIyKQorIyAgaWZuZGVmIF9TVExQX0lOVEVSTkFMX0RFUVVFX0gKKyMgICAgaW5jbHVkZSA8c3RsL19kZXF1ZS5oPgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgIT0gMHgyMikgfHwgZGVmaW5lZCAoX1NUTFBfSU1QT1JUX1ZFTkRPUl9TVEQpCisjICBpZiBkZWZpbmVkIChfU1RMUF9IQVNfSU5DTFVERV9ORVhUKQorIyAgICBpbmNsdWRlX25leHQgPGRlcXVlPgorIyAgZWxzZQorIyAgICBpbmNsdWRlIF9TVExQX05BVElWRV9IRUFERVIoZGVxdWUpCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDIyKQorIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfREVRVUUgKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bHBvcnQvZXJybm8uaCBiL3N0bHBvcnQvZXJybm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjc5OTliCi0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9lcnJuby5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWYgIWRlZmluZWQgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQpCisjICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDIwNQorIyAgaW5jbHVkZSA8c3RsL19jcHJvbG9nLmg+CisjZWxpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDIwNSkgJiYgIWRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKKyMgIGRlZmluZSBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKKyNlbmRpZgorCisjaWZkZWYgX1NUTFBfV0NFCisvKiBvbmx5IHNob3cgbWVzc2FnZSB3aGVuIGRpcmVjdGx5IGluY2x1ZGluZyB0aGlzIGZpbGUgaW4gYSBub24tbGlicmFyeSBidWlsZCAqLworIyAgaWYgIWRlZmluZWQoX19CVUlMRElOR19TVExQT1JUKSAmJiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDIwNSkKKyMgICAgcHJhZ21hIG1lc3NhZ2UoImVNYmVkZGVkIFZpc3VhbCBDKysgMyBhbmQgLk5FVCBkb24ndCBoYXZlIGEgZXJybm8uaCBoZWFkZXI7IFNUTHBvcnQgd29uJ3QgaW5jbHVkZSBuYXRpdmUgZXJybm8uaCBoZXJlIikKKyMgIGVuZGlmCisjZWxzZQorIyAgaWZuZGVmIGVycm5vCisvKiBXZSBkZWZpbmUgdGhlIGZvbGxvd2luZyBtYWNybyBmaXJzdCB0byBndWFyYW50eSB0aGUgaGVhZGVyIHJlZW50cmFuY3k6ICovCisjICAgIGRlZmluZSBfU1RMUF9OQVRJVkVfRVJSTk9fSF9JTkNMVURFRAorIyAgICBpZiBkZWZpbmVkIChfU1RMUF9IQVNfSU5DTFVERV9ORVhUKQorIyAgICAgIGluY2x1ZGVfbmV4dCA8ZXJybm8uaD4KKyMgICAgZWxzZQorIyAgICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NfSEVBREVSKGVycm5vLmgpCisjICAgIGVuZGlmCisjICAgIGlmIGRlZmluZWQgKF9fQk9STEFORENfXykgJiYgKF9fQk9STEFORENfXyA+PSAweDU5MCkgJiYgZGVmaW5lZCAoX19jcGx1c3BsdXMpCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpfX2Vycm5vOworX1NUTFBfRU5EX05BTUVTUEFDRQorIyAgICBlbmRpZgorIyAgZW5kaWYgLyogZXJybm8gKi8KKworIyAgaWYgIWRlZmluZWQgKF9TVExQX05BVElWRV9FUlJOT19IX0lOQ0xVREVEKQorLyogSWYgZXJybm8gaGFzIGJlZW4gZGVmaW5lZCBiZWZvcmUgaW5jbHVzaW9uIG9mIG5hdGl2ZSBlcnJuby5oIGluY2x1ZGluZyBpdCBmcm9tIFNUTHBvcnQgZXJybm8uaAorICogYmVjb21lcyBpbXBvc3NpYmxlIGJlY2F1c2UgaWY6CisgKiAjZGVmaW5lIGVycm5vIGZvbworICogdGhlbgorICogI2luY2x1ZGUgX1NUTFBfTkFUSVZFX0NfSEVBREVSKGVycm5vLmgpCisgKiBiZWNvbWVzOgorICogI2luY2x1ZGUgX1NUTFBfTkFUSVZFX0NfSEVBREVSKGZvby5oKQorICoKKyAqIFRvIGZpeCB0aGlzIHByb2JsZW0geW91IGhhdmUgdG8gZmluZCB3aGVyZSB0aGlzIGRlZmluaXRpb24gY29tZXMgZnJvbSBhbmQgaW5jbHVkZSBlcnJuby5oIGJlZm9yZSBpdC4KKyAqLworIyAgICBlcnJvciBlcnJubyBoYXMgYmVlbiBkZWZpbmVkIGJlZm9yZSBpbmNsdXNpb24gb2YgZXJybm8uaCBoZWFkZXIuCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDIwNSkKKyMgIGlmICEgZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQorIyAgICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgICB1bmRlZiAgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZW5kaWYKKyMgIHVuZGVmICBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKKyNlbmRpZgorCisvKiBMb2NhbCBWYXJpYWJsZXM6CisgKiBtb2RlOiBDCisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL3N0bHBvcnQvZXhjZXB0aW9uIGIvc3RscG9ydC9leGNlcHRpb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc4MjJlOQotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvZXhjZXB0aW9uCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqLworCisvLyBUaGlzIGhlYWRlciBleGlzdHMgc29sZWx5IGZvciBwb3J0YWJpbGl0eS4gIE5vcm1hbGx5IGl0IGp1c3QgaW5jbHVkZXMKKy8vIHRoZSBuYXRpdmUgaGVhZGVyIDxleGNlcHRpb24+LgorCisjaWZuZGVmIF9TVExQX0VYQ0VQVElPTgorCisjaWYgIWRlZmluZWQgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQpCisjICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDQyMworIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KKyNlbGlmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4NDIzKQorIyAgZGVmaW5lIF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRAorIyAgZGVmaW5lIF9TVExQX0VYQ0VQVElPTgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDQyMykgJiYgIWRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKKyMgIGlmbmRlZiBfU1RMUF9JTlRFUk5BTF9FWENFUFRJT04KKyMgICAgaW5jbHVkZSA8c3RsL19leGNlcHRpb24uaD4KKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEICE9IDB4NDIzKSB8fCBkZWZpbmVkIChfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQpIHx8IGRlZmluZWQgKF9TVExQX0lNUE9SVF9WRU5ET1JfU1REKQorLyogSWYgd2UgYXJlIGhlcmUgaXQgbWVhbnMgdGhhdCB3ZSBhcmUgaW4gYW4gaW5jbHVkZSBjYWxsZWQgCisgKiBmcm9tIHRoZSBuYXRpdmUgbGliIHdoaWNoIG1lYW5zIHRoYXQgd2UgY2FuIHNpbXBseSBmb3J3YXJkIHRoaXMKKyAqIGNhbGwgdG8gdGhlIG5hdGl2ZSBleGNlcHRpb24gaGVhZGVyOgorICovCisjICBpZiBkZWZpbmVkIChfU1RMUF9IQVNfSU5DTFVERV9ORVhUKQorIyAgICBpbmNsdWRlX25leHQgPGV4Y2VwdGlvbj4KKyMgIGVsc2UKKyMgICAgaWYgZGVmaW5lZCAoX19ETUNfXykgJiYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHg4NzQpCisvLyBXb3JrYXJvdW5kIHRvIERNQyBoYXJjb2RlZCB0eXBlaW5mby5oIGluY2x1c2lvbi4KKyMgICAgICBpbmNsdWRlIDwuLi9pbmNsdWRlL2V4Y2VwdGlvbj4KKyMgICAgZWxzZQorIyAgICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9SVU5USU1FX0hFQURFUihleGNlcHRpb24pCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDQyMykKKyMgIGlmICFkZWZpbmVkKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKKyMgICAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgICAgdW5kZWYgIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGVsc2UKKyMgICAgdW5kZWYgIF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRAorIyAgZW5kaWYKKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfRVhDRVBUSU9OICovCisKKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bHBvcnQvZXhjZXB0aW9uLmggYi9zdGxwb3J0L2V4Y2VwdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0YmU5YWYKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L2V4Y2VwdGlvbi5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX09MRFNURF9leGNlcHRpb24KKyNkZWZpbmUgX1NUTFBfT0xEU1REX2V4Y2VwdGlvbgorCisjaWYgIWRlZmluZWQgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQpCisjICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDgyNAorIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKSB8fCBkZWZpbmVkIChfTVNDX1ZFUikKKyMgIGluY2x1ZGUgPGV4Y2VwdGlvbj4KKyNlbHNlCisjICBpZiBkZWZpbmVkIChfU1RMUF9IQVNfSU5DTFVERV9ORVhUKQorIyAgICBpbmNsdWRlX25leHQgPGV4Y2VwdGlvbi5oPgorIyAgZWxzZQorIyAgICBpbmNsdWRlIF9TVExQX05BVElWRV9DUFBfUlVOVElNRV9IRUFERVIoZXhjZXB0aW9uLmgpCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDgyNCkKKyMgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+CisjICB1bmRlZiAgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9PTERTVERfZXhjZXB0aW9uICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGxwb3J0L2Zsb2F0LmggYi9zdGxwb3J0L2Zsb2F0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBmZTNhZAotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvZmxvYXQuaApAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmICFkZWZpbmVkIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEKQorIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHgyMDMKKyMgIGluY2x1ZGUgPHN0bC9fY3Byb2xvZy5oPgorI2VsaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgyMDMpICYmICFkZWZpbmVkIChfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQpCisjICBkZWZpbmUgX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lECisjZWxpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDIwMykKKyMgIGVycm9yIFRoaXMgaGVhZGVyIGlzIG9ubHkgcmVlbnRyYW50IG9uY2UsIGl0IHNob3VsZCBiZSBtb2RpZmllZCBpZiBpdCBoYXMgdG8gYmUgaW5jbHVkZWQgbW9yZS4KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfV0NFX0VWQzMpCitzdHJ1Y3QgX2V4Y2VwdGlvbjsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfSEFTX0lOQ0xVREVfTkVYVCkKKyMgIGluY2x1ZGVfbmV4dCA8ZmxvYXQuaD4KKyNlbHNlCisjICBpbmNsdWRlIF9TVExQX05BVElWRV9DX0hFQURFUihmbG9hdC5oKQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoX19saW51eF9fKQorIyAgaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pICYmIGRlZmluZWQgKF9fY3BsdXNwbHVzKSAmJiAoX19CT1JMQU5EQ19fID49IDB4NTYwKQorX1NUTFBfQkVHSU5fTkFNRVNQQUNFCit1c2luZyA6Ol9tYXhfZGJsZTsKK3VzaW5nIDo6X21heF9mbHQ7Cit1c2luZyA6Ol9tYXhfbGRibGU7Cit1c2luZyA6Ol90aW55X2xkYmxlOworX1NUTFBfRU5EX05BTUVTUEFDRQorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgyMDMpCisjICBpZiAhIGRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKKyMgICAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgICAgdW5kZWYgIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGVuZGlmCisjICB1bmRlZiAgX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lECisjZW5kaWYKZGlmZiAtLWdpdCBhL3N0bHBvcnQvZnN0cmVhbSBiL3N0bHBvcnQvZnN0cmVhbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzRjZDFlCi0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9mc3RyZWFtCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKworLy8gVGhpcyBoZWFkZXIgZGVmaW5lcyBjbGFzc2VzIGJhc2ljX2ZpbGVidWYsIGJhc2ljX2lmc3RyZWFtLAorLy8gYmFzaWNfb2ZzdHJlYW0sIGFuZCBiYXNpY19mc3RyZWFtLiAgVGhlc2UgY2xhc3NlcyByZXByZXNlbnQKKy8vIHN0cmVhbWJ1ZnMgYW5kIHN0cmVhbXMgd2hvc2Ugc291cmNlcyBvciBkZXN0aW5hdGlvbnMgYXJlIGZpbGVzLgorCisjaWZuZGVmIF9TVExQX0ZTVFJFQU0KKworI2lmbmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDEwMjUKKyMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+CisjICBkZWZpbmUgX1NUTFBfRlNUUkVBTQorIyAgaWYgZGVmaW5lZCAoX19ETUNfXykgJiYgZGVmaW5lZCAoX0RMTCkKKyMgICAgZGVmaW5lIF9TVExQX0NMQVNTX0lNUE9SVF9ERUNMU1BFQyBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MTAyNSkgJiYgXAorICAgIShkZWZpbmVkIChfU1RMUF9OT19JT1NUUkVBTVMpICYmIGRlZmluZWQgKF9TVExQX0lNUE9SVF9WRU5ET1JfU1REKSkKKyMgIGluY2x1ZGUgPHN0bC9faW9zZXJyLmg+CisKKyMgIGlmbmRlZiBfU1RMUF9JTlRFUk5BTF9GU1RSRUFNX0gKKyMgICAgaW5jbHVkZSA8c3RsL19mc3RyZWFtLmg+CisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAhPSAweDEwMjUpIHx8IGRlZmluZWQgKF9TVExQX0lNUE9SVF9WRU5ET1JfU1REKQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfSEFTX0lOQ0xVREVfTkVYVCkKKyMgICAgaW5jbHVkZV9uZXh0IDxmc3RyZWFtPgorIyAgZWxzZQorIyAgICBpbmNsdWRlIF9TVExQX05BVElWRV9IRUFERVIoZnN0cmVhbSkKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MTAyNSkKKyMgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+CisjICB1bmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjICBpZiBkZWZpbmVkIChfX0RNQ19fKSAmJiBkZWZpbmVkIChfRExMKQorIyAgICB1bmRlZiBfU1RMUF9DTEFTU19JTVBPUlRfREVDTFNQRUMKKyMgICAgZGVmaW5lIF9TVExQX0NMQVNTX0lNUE9SVF9ERUNMU1BFQworIyAgZW5kaWYKKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfRlNUUkVBTSAqLworCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9mc3RyZWFtLmggYi9zdGxwb3J0L2ZzdHJlYW0uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZnN0cmVhbS5oCnJlbmFtZSB0byBzdGxwb3J0L2ZzdHJlYW0uaApkaWZmIC0tZ2l0IGEvc3RscG9ydC9mdW5jdGlvbmFsIGIvc3RscG9ydC9mdW5jdGlvbmFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ZTM3YWIKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L2Z1bmN0aW9uYWwKQEAgLTAsMCArMSwxNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9GVU5DVElPTkFMCisKKyNpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHgyNworIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KKyMgIGRlZmluZSBfU1RMUF9GVU5DVElPTkFMCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MjcpCisjICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfRlVOQ1RJT05fSAorIyAgICBpbmNsdWRlIDxzdGwvX2Z1bmN0aW9uLmg+CisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAhPSAweDI3KSB8fCBkZWZpbmVkIChfU1RMUF9JTVBPUlRfVkVORE9SX1NURCkKKyMgIGlmIGRlZmluZWQgKF9TVExQX0hBU19JTkNMVURFX05FWFQpCisjICAgIGluY2x1ZGVfbmV4dCA8ZnVuY3Rpb25hbD4KKyMgIGVsc2UKKyMgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfSEVBREVSKGZ1bmN0aW9uYWwpCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDI3KQorIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX1NUTFBfTk9fRVhURU5TSU9OUykgJiYgZGVmaW5lZChfU1RMUF9VU0VfQk9PU1RfU1VQUE9SVCkKKworI2luY2x1ZGUgPGJvb3N0L3JlZi5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvdXRpbGl0eS9yZXN1bHRfb2YuaHBwPgorI2luY2x1ZGUgPGJvb3N0L2JpbmQvcGxhY2Vob2xkZXJzLmhwcD4KKyNpbmNsdWRlIDxib29zdC9tZW1fZm4uaHBwPgorI2luY2x1ZGUgPGJvb3N0L2JpbmQuaHBwPgorCituYW1lc3BhY2UgYm9vc3QgeworCit0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyByZWZlcmVuY2Vfd3JhcHBlcjsKK3RlbXBsYXRlPGNsYXNzIFQ+IHJlZmVyZW5jZV93cmFwcGVyPFQ+IGNvbnN0IHJlZihUICYpOwordGVtcGxhdGU8Y2xhc3MgVD4gaW5saW5lIHJlZmVyZW5jZV93cmFwcGVyPFQgY29uc3Q+IGNvbnN0IGNyZWYoVCBjb25zdCAmKTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRj4gc3RydWN0IHJlc3VsdF9vZjsKKworbmFtZXNwYWNlIF9tZmkgewordGVtcGxhdGU8Y2xhc3MgUiwgY2xhc3MgVD4gY2xhc3MgZG07Cit9CisKK3RlbXBsYXRlPGNsYXNzIFIsIGNsYXNzIFQ+IF9tZmk6OmRtPFIsIFQ+IG1lbV9mbihSIFQ6OipmKTsKKworfSAvLyBuYW1lc3BhY2UgYm9vc3QKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKK25hbWVzcGFjZSB0cjEgeworCit1c2luZyA6OmJvb3N0OjpyZWZlcmVuY2Vfd3JhcHBlcjsKK3VzaW5nIDo6Ym9vc3Q6OnJlZjsKK3VzaW5nIDo6Ym9vc3Q6OmNyZWY7CisKK3VzaW5nIDo6Ym9vc3Q6OnJlc3VsdF9vZjsKKwordXNpbmcgOjpib29zdDo6bWVtX2ZuOworCit1c2luZyA6OmJvb3N0OjpiaW5kOworCituYW1lc3BhY2UgcGxhY2Vob2xkZXJzIHsKKyAgdXNpbmcgOjpfMTsKKyAgdXNpbmcgOjpfMjsKKyAgdXNpbmcgOjpfMzsKKyAgdXNpbmcgOjpfNDsKKyAgdXNpbmcgOjpfNTsKKyAgdXNpbmcgOjpfNjsKKyAgdXNpbmcgOjpfNzsKKyAgdXNpbmcgOjpfODsKKyAgdXNpbmcgOjpfOTsKK30gLy8gcGxhY2Vob2xkZXJzCisKK30gLy8gbmFtZXNwYWNlIHRyMQorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNlbmRpZiAvLyAhX1NUTFBfTk9fRVhURU5TSU9OUyAmJiBfU1RMUF9VU0VfQk9PU1RfU1VQUE9SVAorCisjZW5kaWYgLyogX1NUTFBfRlVOQ1RJT05BTCAqLworCisjaWYgIWRlZmluZWQoX1NUTFBfRlVOQ1RJT05BTF9GVU4pICYmICFkZWZpbmVkKF9TVExQX05PX0VYVEVOU0lPTlMpICYmIGRlZmluZWQoX1NUTFBfVVNFX0JPT1NUX1NVUFBPUlQpCisKKyNpZm5kZWYgQk9PU1RfRlVOQ1RJT05fTlVNX0FSR1MgLy8gYXZvaWQgcmVjdXJzaXZlIGluY2x1ZGVzCisKKy8vICNpZmRlZiBCT09TVF9GVU5DVElPTl9CQVNFX0hFQURFUgorLy8gI3VuZGVmIEJPT1NUX0ZVTkNUSU9OX0JBU0VfSEVBREVSCisvLyAjZW5kaWYKKworLy8gI2lmZGVmIEJPT1NUX0ZVTkNUSU9OX1BST0xPR1VFX0hQUAorLy8gI3VuZGVmIEJPT1NUX0ZVTkNUSU9OX1BST0xPR1VFX0hQUAorLy8gI2VuZGlmCisKKyNkZWZpbmUgX1NUTFBfRlVOQ1RJT05BTF9GVU4KKworI2lmbmRlZiBCT09TVF9GVU5DVElPTl9CQVNFX0hFQURFUiAvLyBhdm9pZCByZWN1cnNpdmUgaW5jbHVkZXMKKyMgIGluY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uLmhwcD4KKyNlbHNlCituYW1lc3BhY2UgYm9vc3QgeworY2xhc3MgYmFkX2Z1bmN0aW9uX2NhbGw7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTaWduYXR1cmUsIHR5cGVuYW1lIEFsbG9jYXRvciA+CitjbGFzcyBmdW5jdGlvbjsKK3RlbXBsYXRlPHR5cGVuYW1lIFNpZ25hdHVyZSwgdHlwZW5hbWUgQWxsb2NhdG9yPgordm9pZCBzd2FwKGZ1bmN0aW9uPFNpZ25hdHVyZSwgQWxsb2NhdG9yPiYgZjEsIGZ1bmN0aW9uPFNpZ25hdHVyZSwgQWxsb2NhdG9yPiYgZjIpOworfQorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCituYW1lc3BhY2UgdHIxIHsKKwordXNpbmcgOjpib29zdDo6YmFkX2Z1bmN0aW9uX2NhbGw7Cit1c2luZyA6OmJvb3N0OjpmdW5jdGlvbjsKK3VzaW5nIDo6Ym9vc3Q6OnN3YXA7CisKK30gLy8gbmFtZXNwYWNlIHRyMQorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNlbmRpZiAvLyAhQk9PU1RfRlVOQ1RJT05fTlVNX0FSR1MKKworI2VuZGlmIC8vICFfU1RMUF9GVU5DVElPTkFMX1JFRiAmJiAhX1NUTFBfTk9fRVhURU5TSU9OUyAmJiBfU1RMUF9VU0VfQk9PU1RfU1VQUE9SVAorCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvaGFzaF9tYXAgYi9zdGxwb3J0L2hhc2hfbWFwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBoYXNoX21hcApyZW5hbWUgdG8gc3RscG9ydC9oYXNoX21hcApkaWZmIC0tZ2l0IGEvaGFzaF9zZXQgYi9zdGxwb3J0L2hhc2hfc2V0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBoYXNoX3NldApyZW5hbWUgdG8gc3RscG9ydC9oYXNoX3NldApkaWZmIC0tZ2l0IGEvc3RscG9ydC9pb21hbmlwIGIvc3RscG9ydC9pb21hbmlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NTU2NGYKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L2lvbWFuaXAKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9JT01BTklQCisKKyNpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHgxMDMwCisjICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgorIyAgZGVmaW5lIF9TVExQX0lPTUFOSVAKKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgxMDMwKSAmJiBcCisgICAhKGRlZmluZWQgKF9TVExQX05PX0lPU1RSRUFNUykgJiYgZGVmaW5lZCAoX1NUTFBfSU1QT1JUX1ZFTkRPUl9TVEQpKQorIyAgaW5jbHVkZSA8c3RsL19pb3NlcnIuaD4KKworIyAgaWZuZGVmIF9TVExQX0lOVEVSTkFMX0lPTUFOSVAKKyMgICAgaW5jbHVkZSA8c3RsL19pb21hbmlwLmg+CisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAhPSAweDEwMzApIHx8IGRlZmluZWQgKF9TVExQX0lNUE9SVF9WRU5ET1JfU1REKQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfSEFTX0lOQ0xVREVfTkVYVCkKKyMgICAgaW5jbHVkZV9uZXh0IDxpb21hbmlwPgorIyAgZWxzZQorIyAgICBpbmNsdWRlIF9TVExQX05BVElWRV9IRUFERVIoaW9tYW5pcCkKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MTAzMCkKKyMgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+CisjICB1bmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjZW5kaWYKKworI2VuZGlmIC8qIF9TVExQX0lPTUFOSVAgKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL2lvbWFuaXAuaCBiL3N0bHBvcnQvaW9tYW5pcC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpb21hbmlwLmgKcmVuYW1lIHRvIHN0bHBvcnQvaW9tYW5pcC5oCmRpZmYgLS1naXQgYS9zdGxwb3J0L2lvcyBiL3N0bHBvcnQvaW9zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyNDkyYmIKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L2lvcwpAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX0lPUworCisjaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MTAzMgorIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KKyMgIGRlZmluZSBfU1RMUF9JT1MKKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgxMDMyKSAmJiBcCisgICAhKGRlZmluZWQgKF9TVExQX05PX0lPU1RSRUFNUykgJiYgZGVmaW5lZCAoX1NUTFBfSU1QT1JUX1ZFTkRPUl9TVEQpKQorIyAgaW5jbHVkZSA8c3RsL19pb3NlcnIuaD4KKworIyAgaWZuZGVmIF9TVExQX0lOVEVSTkFMX0lPU19ICisjICAgIGluY2x1ZGUgPHN0bC9faW9zLmg+CisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAhPSAweDEwMzIpIHx8IGRlZmluZWQgKF9TVExQX0lNUE9SVF9WRU5ET1JfU1REKQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfSEFTX0lOQ0xVREVfTkVYVCkKKyMgICAgaW5jbHVkZV9uZXh0IDxpb3M+CisjICBlbHNlCisjICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0hFQURFUihpb3MpCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDEwMzIpCisjICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9JT1MgKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL2lvcy5oIGIvc3RscG9ydC9pb3MuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW9zLmgKcmVuYW1lIHRvIHN0bHBvcnQvaW9zLmgKZGlmZiAtLWdpdCBhL3N0bHBvcnQvaW9zZndkIGIvc3RscG9ydC9pb3Nmd2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQwMTA0NgotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvaW9zZndkCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfSU9TRldECisKKyNpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHgxMDM0CisjICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgorIyAgZGVmaW5lIF9TVExQX0lPU0ZXRAorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDEwMzQpICYmIFwKKyAgICEoZGVmaW5lZCAoX1NUTFBfTk9fSU9TVFJFQU1TKSAmJiBkZWZpbmVkIChfU1RMUF9JTVBPUlRfVkVORE9SX1NURCkpCisjICBpbmNsdWRlIDxzdGwvX2lvc2Vyci5oPgorCisjICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfSU9TRldECisjICAgIGluY2x1ZGUgPHN0bC9faW9zZndkLmg+CisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAhPSAweDEwMzQpIHx8IGRlZmluZWQgKF9TVExQX0lNUE9SVF9WRU5ET1JfU1REKQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfSEFTX0lOQ0xVREVfTkVYVCkKKyMgICAgaW5jbHVkZV9uZXh0IDxpb3Nmd2Q+CisjICBlbHNlCisjICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0hFQURFUihpb3Nmd2QpCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDEwMzQpCisjICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9JT1NGV0QgKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bHBvcnQvaW9zdHJlYW0gYi9zdGxwb3J0L2lvc3RyZWFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyNDFmMTAKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L2lvc3RyZWFtCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX0lPU1RSRUFNCisKKyNpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHgxMDM3CisjICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgorIyAgZGVmaW5lIF9TVExQX0lPU1RSRUFNCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MTAzNykgJiYgXAorICAgIShkZWZpbmVkIChfU1RMUF9OT19JT1NUUkVBTVMpICYmIGRlZmluZWQgKF9TVExQX0lNUE9SVF9WRU5ET1JfU1REKSkKKyMgIGluY2x1ZGUgPHN0bC9faW9zZXJyLmg+CisKKyMgIGlmZGVmIF9TVExQX1JFRElSRUNUX1NURFNUUkVBTVMKKy8vIGZvciBvZnN0cmVhbSByZWRpcmVjdGlvbgorIyAgICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfRlNUUkVBTV9ICisjICAgICAgaW5jbHVkZSA8c3RsL19mc3RyZWFtLmg+CisjICAgIGVuZGlmCisjICBlbmRpZgorCisjICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfSU9TRldECisjICAgIGluY2x1ZGUgPHN0bC9faW9zZndkLmg+CisjICBlbmRpZgorCisjICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfSVNUUkVBTQorIyAgICBpbmNsdWRlIDxzdGwvX2lzdHJlYW0uaD4KKyMgIGVuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisjICBpZm5kZWYgX1NUTFBfVVNFX05BTUVTUEFDRVMKKy8vIGluIGNhc2Ugb2YgU0dJIGlvc3RyZWFtcywgd2UgaGF2ZSB0byByZW5hbWUgb3VyIHN0cmVhbXMgbm90IHRvIGNsYXNoIHdpdGggdGhvc2UKKy8vIHByb3ZpZGVkIGluIG5hdGl2ZSBsaWIKKyMgICAgZGVmaW5lIGNpbiBfU1RMUF9jaW4KKyMgICAgZGVmaW5lIGNvdXQgX1NUTFBfY291dAorIyAgICBkZWZpbmUgY2VyciBfU1RMUF9jZXJyCisjICAgIGRlZmluZSBjbG9nIF9TVExQX2Nsb2cKKyMgIGVuZGlmCisKKy8vIE5vdGU6IGNpbiBhbmQgd2NpbiBhcmUgYm90aCBhc3NvY2lhdGVkIHdpdGggc3RkaW8uICBUaGUgQyBzdGFuZGFyZAorLy8gKEFtZW5kbWVudCAxLCBzZWN0aW9uIDQuNi4yLjEpIHNheXMgdGhhdCBpdCBpcyBhbiBlcnJvciB0byBtaXgKKy8vIHdpZGUtIGFuZCBuYXJyb3ctb3JpZW50ZWQgSS9PIG9uIHRoZSBzYW1lIHN0cmVhbS4gIFRoaXMgaW1wbGllcworLy8gdGhhdCBpdCBpcyBhbiBlcnJvciB0byB1c2UgYm90aCBjaW4gYW5kIHdjaW4gaW4gdGhlIHNhbWUgQysrCisvLyBwcm9ncmFtOyB0aGUgc2FtZSBhcHBsaWVzIHRvIGNvdXQgYW5kIHdjb3V0LCBhbmQgY2Vyci9jbG9nIGFuZAorLy8gd2NlcnIvd2Nsb2cuCisKK2V4dGVybiBfU1RMUF9ERUNMU1BFQyBpc3RyZWFtIGNpbjsKKworIyAgaWZkZWYgX1NUTFBfUkVESVJFQ1RfU1REU1RSRUFNUworZXh0ZXJuIF9TVExQX0RFQ0xTUEVDIG9mc3RyZWFtIGNvdXQ7CitleHRlcm4gX1NUTFBfREVDTFNQRUMgb2ZzdHJlYW0gY2VycjsKK2V4dGVybiBfU1RMUF9ERUNMU1BFQyBvZnN0cmVhbSBjbG9nOworIyAgZWxzZQorZXh0ZXJuIF9TVExQX0RFQ0xTUEVDIG9zdHJlYW0gY291dDsKK2V4dGVybiBfU1RMUF9ERUNMU1BFQyBvc3RyZWFtIGNlcnI7CitleHRlcm4gX1NUTFBfREVDTFNQRUMgb3N0cmVhbSBjbG9nOworIyAgZW5kaWYKKworIyAgaWZuZGVmIF9TVExQX05PX1dDSEFSX1QKK2V4dGVybiBfU1RMUF9ERUNMU1BFQyB3aXN0cmVhbSB3Y2luOworZXh0ZXJuIF9TVExQX0RFQ0xTUEVDIHdvc3RyZWFtIHdjb3V0OworZXh0ZXJuIF9TVExQX0RFQ0xTUEVDIHdvc3RyZWFtIHdjZXJyOworZXh0ZXJuIF9TVExQX0RFQ0xTUEVDIHdvc3RyZWFtIHdjbG9nOworIyAgZW5kaWYKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEICE9IDB4MTAzNykgfHwgZGVmaW5lZCAoX1NUTFBfSU1QT1JUX1ZFTkRPUl9TVEQpCisjICBpZiBkZWZpbmVkIChfU1RMUF9IQVNfSU5DTFVERV9ORVhUKQorIyAgICBpbmNsdWRlX25leHQgPGlvc3RyZWFtPgorIyAgZWxzZQorIyAgICBpbmNsdWRlIF9TVExQX05BVElWRV9IRUFERVIoaW9zdHJlYW0pCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDEwMzcpCisjICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9JT1NUUkVBTSAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvaW9zdHJlYW0uaCBiL3N0bHBvcnQvaW9zdHJlYW0uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW9zdHJlYW0uaApyZW5hbWUgdG8gc3RscG9ydC9pb3N0cmVhbS5oCmRpZmYgLS1naXQgYS9zdGxwb3J0L2lzbzY0Ni5oIGIvc3RscG9ydC9pc282NDYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTg4NjNhCi0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9pc282NDYuaApAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmICFkZWZpbmVkIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEKQorIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHgyMDQKKyMgIGluY2x1ZGUgPHN0bC9fY3Byb2xvZy5oPgorI2VsaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgyMDQpICYmICFkZWZpbmVkIChfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQpCisjICBkZWZpbmUgX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lECisjZW5kaWYKKworLyogZXZjMyBkb2Vzbid0IGhhdmUgaXNvNjQ2LmggKi8KKyNpZiAhZGVmaW5lZCAoX1NUTFBfV0NFX0VWQzMpICYmICFkZWZpbmVkIChfX0JPUkxBTkRDX18pCisjICBpZiBkZWZpbmVkIChfU1RMUF9IQVNfSU5DTFVERV9ORVhUKQorIyAgICBpbmNsdWRlX25leHQgPGlzbzY0Ni5oPgorIyAgZWxzZQorIyAgICBpbmNsdWRlIF9TVExQX05BVElWRV9DX0hFQURFUihpc282NDYuaCkKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MjA0KQorIyAgaWYgISBkZWZpbmVkIChfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQpCisjICAgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+CisjICAgIHVuZGVmICBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjICBlbmRpZgorIyAgdW5kZWYgIF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRAorI2VuZGlmCisKZGlmZiAtLWdpdCBhL3N0bHBvcnQvaXN0cmVhbSBiL3N0bHBvcnQvaXN0cmVhbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGNhOTAzCi0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9pc3RyZWFtCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfSVNUUkVBTQorCisjaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MTAzNgorIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KKyMgIGRlZmluZSBfU1RMUF9JU1RSRUFNCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MTAzNikgJiYgXAorICAgIShkZWZpbmVkIChfU1RMUF9OT19JT1NUUkVBTVMpICYmIGRlZmluZWQgKF9TVExQX0lNUE9SVF9WRU5ET1JfU1REKSkKKyMgIGluY2x1ZGUgPHN0bC9faW9zZXJyLmg+CisKKyMgIGlmbmRlZiBfU1RMUF9JTlRFUk5BTF9JU1RSRUFNCisjICAgIGluY2x1ZGUgPHN0bC9faXN0cmVhbS5oPgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgIT0gMHgxMDM2KSB8fCBkZWZpbmVkIChfU1RMUF9JTVBPUlRfVkVORE9SX1NURCkKKyMgIGlmIGRlZmluZWQgKF9TVExQX0hBU19JTkNMVURFX05FWFQpCisjICAgIGluY2x1ZGVfbmV4dCA8aXN0cmVhbT4KKyMgIGVsc2UKKyMgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfSEVBREVSKGlzdHJlYW0pCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDEwMzYpCisjICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9JU1RSRUFNICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9pc3RyZWFtLmggYi9zdGxwb3J0L2lzdHJlYW0uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaXN0cmVhbS5oCnJlbmFtZSB0byBzdGxwb3J0L2lzdHJlYW0uaApkaWZmIC0tZ2l0IGEvc3RscG9ydC9pdGVyYXRvciBiL3N0bHBvcnQvaXRlcmF0b3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhkM2RlZQotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvaXRlcmF0b3IKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfSVRFUkFUT1IKKworI2lmbmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDM4CisjICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgorIyAgZGVmaW5lIF9TVExQX0lURVJBVE9SCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MzgpCisjICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfSVRFUkFUT1JfSAorIyAgICBpbmNsdWRlIDxzdGwvX2l0ZXJhdG9yLmg+CisjICBlbmRpZgorCisjICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfU1RSRUFNX0lURVJBVE9SX0gKKyMgICAgaW5jbHVkZSA8c3RsL19zdHJlYW1faXRlcmF0b3IuaD4KKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEICE9IDB4MzgpIHx8IGRlZmluZWQgKF9TVExQX0lNUE9SVF9WRU5ET1JfU1REKQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfSEFTX0lOQ0xVREVfTkVYVCkKKyMgICAgaW5jbHVkZV9uZXh0IDxpdGVyYXRvcj4KKyMgIGVsc2UKKyMgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfSEVBREVSKGl0ZXJhdG9yKQorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgzOCkKKyMgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+CisjICB1bmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjZW5kaWYKKworI2VuZGlmIC8qIF9TVExQX0lURVJBVE9SICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGxwb3J0L2xpbWl0cyBiL3N0bHBvcnQvbGltaXRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMzNiMTQKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L2xpbWl0cwpAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX0xJTUlUUworCisjaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MzkKKyMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+CisjICBkZWZpbmUgX1NUTFBfTElNSVRTCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MzkpCisjICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfTElNSVRTCisjICAgIGluY2x1ZGUgPHN0bC9fbGltaXRzLmg+CisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAhPSAweDM5KSB8fCBkZWZpbmVkIChfU1RMUF9JTVBPUlRfVkVORE9SX1NURCkKKyMgIGlmIGRlZmluZWQgKF9TVExQX0hBU19JTkNMVURFX05FWFQpCisjICAgIGluY2x1ZGVfbmV4dCA8bGltaXRzPgorIyAgZWxzZQorIyAgICBpbmNsdWRlIF9TVExQX05BVElWRV9IRUFERVIobGltaXRzKQorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgzOSkKKyMgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+CisjICB1bmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjZW5kaWYKKworI2VuZGlmIC8qIF9TVExQX0xJTUlUUyAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RscG9ydC9saW1pdHMuaCBiL3N0bHBvcnQvbGltaXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFiNTUzYgotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvbGltaXRzLmgKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCkKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MjAxCisjICBpbmNsdWRlIDxzdGwvX2Nwcm9sb2cuaD4KKyNlbGlmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MjAxKSAmJiAhIGRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKKyMgIGRlZmluZSBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfU1RMUF9XQ0VfRVZDMykKK3N0cnVjdCBfZXhjZXB0aW9uOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9IQVNfSU5DTFVERV9ORVhUKQorIyAgaW5jbHVkZV9uZXh0IDxsaW1pdHMuaD4KKyNlbHNlCisjICBpbmNsdWRlIF9TVExQX05BVElWRV9DX0hFQURFUihsaW1pdHMuaCkKKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgyMDEpCisjICBpZiAhIGRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKKyMgICAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgICAgdW5kZWYgIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGVuZGlmCisjICB1bmRlZiAgX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lECisjZW5kaWYKZGlmZiAtLWdpdCBhL3N0bHBvcnQvbGlzdCBiL3N0bHBvcnQvbGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDdhOGJlCi0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9saXN0CkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX0xJU1QKKworI2lmbmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDQwCisjICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgorIyAgZGVmaW5lIF9TVExQX0xJU1QKKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHg0MCkKKyMgIGlmbmRlZiBfU1RMUF9JTlRFUk5BTF9MSVNUX0gKKyMgICAgaW5jbHVkZSA8c3RsL19saXN0Lmg+CisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAhPSAweDQwKSB8fCBkZWZpbmVkIChfU1RMUF9JTVBPUlRfVkVORE9SX1NURCkKKyMgIGlmIGRlZmluZWQgKF9TVExQX0hBU19JTkNMVURFX05FWFQpCisjICAgIGluY2x1ZGVfbmV4dCA8bGlzdD4KKyMgIGVsc2UKKyMgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfSEVBREVSKGxpc3QpCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDQwKQorIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfTElTVCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RscG9ydC9sb2NhbGUgYi9zdGxwb3J0L2xvY2FsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmNkMDFmCi0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9sb2NhbGUKQEAgLTAsMCArMSwxNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisjaWZuZGVmIF9TVExQX0xPQ0FMRQorCisvLyBCYXNpYyBmcmFtZXdvcms6IGNsYXNzIGxvY2FsZSBhbmQgY2xhc3MgbG9jYWxlOjpmYWNldAorCisjaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MTA0MQorIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KKyMgIGRlZmluZSBfU1RMUF9MT0NBTEUKKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgxMDQxKSAmJiBcCisgICAhKGRlZmluZWQgKF9TVExQX05PX0lPU1RSRUFNUykgJiYgZGVmaW5lZCAoX1NUTFBfSU1QT1JUX1ZFTkRPUl9TVEQpKQorIyAgaW5jbHVkZSA8c3RsL19pb3NlcnIuaD4KKworLy8gSW5kaXZpZHVhbCBmYWNldHMKKyMgIGlmbmRlZiBfU1RMUF9JTlRFUk5BTF9DVFlQRV9ICisjICAgIGluY2x1ZGUgPHN0bC9fY3R5cGUuaD4KKyMgIGVuZGlmCisKKyMgIGlmbmRlZiBfU1RMUF9JTlRFUk5BTF9DT0RFQ1ZUX0gKKyMgICAgaW5jbHVkZSA8c3RsL19jb2RlY3Z0Lmg+CisjICBlbmRpZgorCisjICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ09MTEFURV9ICisjICAgIGluY2x1ZGUgPHN0bC9fY29sbGF0ZS5oPgorIyAgZW5kaWYKKworIyAgaWZuZGVmIF9TVExQX0lOVEVSTkFMX05VTV9QVVRfSAorIyAgICBpbmNsdWRlIDxzdGwvX251bV9wdXQuaD4KKyMgIGVuZGlmCisKKyMgIGlmbmRlZiBfU1RMUF9JTlRFUk5BTF9OVU1fR0VUX0gKKyMgICAgaW5jbHVkZSA8c3RsL19udW1fZ2V0Lmg+CisjICBlbmRpZgorCisvLyB0aG9zZSBuZXZlciBpbmNsdWRlZCBzZXBhcmF0ZWx5IGFueXdheQorIyAgaW5jbHVkZSA8c3RsL19tb25ldGFyeS5oPgorIyAgaW5jbHVkZSA8c3RsL190aW1lX2ZhY2V0cy5oPgorIyAgaW5jbHVkZSA8c3RsL19tZXNzYWdlc19mYWNldHMuaD4KKworLy8gc29tZSBzdHVmZiBmb3Igc3RyZWFtYnVmIGl0ZXJhdG9ycyBlbmRlZCB1cCBkZWZpbmVkIHRoZXJlCisvLyBTdHJpY3RseSBzcGVha2luZywgX2lzdHJlYW0uaCBwb3J0aW9uIGlzIG9ubHkgcmVxdWlyZWQgZm9yIDxpdGVyYXRvcj4sIGJ1dCBpdCBtYXkgYnJlYWsgdG9vIG1hbnkKKy8vIHByb2dyYW1zIGlmIHdlIG9taXQgaXQKKyMgIGlmbmRlZiBfU1RMUF9JU1RSRUFNX0gKKyMgICAgaW5jbHVkZSA8c3RsL19pc3RyZWFtLmg+CisjICBlbmRpZgorCisvLyBDb252ZW5pZW5jZSBpbnRlcmZhY2VzCisjdW5kZWYgaXNzcGFjZQorI3VuZGVmIGlzcHJpbnQKKyN1bmRlZiBpc2NudHJsCisjdW5kZWYgaXN1cHBlcgorI3VuZGVmIGlzbG93ZXIKKyN1bmRlZiBpc2FscGhhCisjdW5kZWYgaXNkaWdpdAorI3VuZGVmIGlzcHVuY3QKKyN1bmRlZiBpc3hkaWdpdAorI3VuZGVmIGlzYWxudW0KKyN1bmRlZiBpc2dyYXBoCisjdW5kZWYgdG91cHBlcgorI3VuZGVmIHRvbG93ZXIKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+IAoraW5saW5lIGJvb2wgaXNzcGFjZSAoX0NoYXJUIGMsIGNvbnN0IGxvY2FsZSYgbG9jKQoreyByZXR1cm4gKHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4obG9jKSkuaXMoY3R5cGVfYmFzZTo6c3BhY2UsIGMpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+IAoraW5saW5lIGJvb2wgaXNwcmludCAoX0NoYXJUIGMsIGNvbnN0IGxvY2FsZSYgbG9jKQoreyByZXR1cm4gKHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4obG9jKSkuaXMoY3R5cGVfYmFzZTo6cHJpbnQsIGMpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+IAoraW5saW5lIGJvb2wgaXNjbnRybCAoX0NoYXJUIGMsIGNvbnN0IGxvY2FsZSYgbG9jKQoreyByZXR1cm4gKHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4obG9jKSkuaXMoY3R5cGVfYmFzZTo6Y250cmwsIGMpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+IAoraW5saW5lIGJvb2wgaXN1cHBlciAoX0NoYXJUIGMsIGNvbnN0IGxvY2FsZSYgbG9jKQoreyByZXR1cm4gKHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4obG9jKSkuaXMoY3R5cGVfYmFzZTo6dXBwZXIsIGMpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+IAoraW5saW5lIGJvb2wgaXNsb3dlciAoX0NoYXJUIGMsIGNvbnN0IGxvY2FsZSYgbG9jKQoreyByZXR1cm4gKHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4obG9jKSkuaXMoY3R5cGVfYmFzZTo6bG93ZXIsIGMpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+IAoraW5saW5lIGJvb2wgaXNhbHBoYSAoX0NoYXJUIGMsIGNvbnN0IGxvY2FsZSYgbG9jKQoreyByZXR1cm4gKHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4obG9jKSkuaXMoY3R5cGVfYmFzZTo6YWxwaGEsIGMpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+IAoraW5saW5lIGJvb2wgaXNkaWdpdCAoX0NoYXJUIGMsIGNvbnN0IGxvY2FsZSYgbG9jKQoreyByZXR1cm4gKHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4obG9jKSkuaXMoY3R5cGVfYmFzZTo6ZGlnaXQsIGMpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+IAoraW5saW5lIGJvb2wgaXNwdW5jdCAoX0NoYXJUIGMsIGNvbnN0IGxvY2FsZSYgbG9jKQoreyByZXR1cm4gKHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4obG9jKSkuaXMoY3R5cGVfYmFzZTo6cHVuY3QsIGMpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+IAoraW5saW5lIGJvb2wgaXN4ZGlnaXQgKF9DaGFyVCBjLCBjb25zdCBsb2NhbGUmIGxvYykKK3sgcmV0dXJuICh1c2VfZmFjZXQ8Y3R5cGU8X0NoYXJUPiA+KGxvYykpLmlzKGN0eXBlX2Jhc2U6OnhkaWdpdCwgYyk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4gCitpbmxpbmUgYm9vbCBpc2FsbnVtIChfQ2hhclQgYywgY29uc3QgbG9jYWxlJiBsb2MpCit7IHJldHVybiAodXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihsb2MpKS5pcyhjdHlwZV9iYXNlOjphbG51bSwgYyk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4gCitpbmxpbmUgYm9vbCBpc2dyYXBoIChfQ2hhclQgYywgY29uc3QgbG9jYWxlJiBsb2MpCit7IHJldHVybiAodXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihsb2MpKS5pcyhjdHlwZV9iYXNlOjpncmFwaCwgYyk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK2lubGluZSBfQ2hhclQgdG91cHBlcihfQ2hhclQgYywgY29uc3QgbG9jYWxlJiBsb2MpCit7IHJldHVybiAodXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihsb2MpKS50b3VwcGVyKGMpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+CitpbmxpbmUgX0NoYXJUIHRvbG93ZXIoX0NoYXJUIGMsIGNvbnN0IGxvY2FsZSYgbG9jKQoreyByZXR1cm4gKHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4obG9jKSkudG9sb3dlcihjKTsgfQorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgIT0gMHgxMDQxKSB8fCBkZWZpbmVkIChfU1RMUF9JTVBPUlRfVkVORE9SX1NURCkKKyMgIGlmIGRlZmluZWQgKF9TVExQX0hBU19JTkNMVURFX05FWFQpCisjICAgIGluY2x1ZGVfbmV4dCA8bG9jYWxlPgorIyAgZWxzZQorIyAgICBpbmNsdWRlIF9TVExQX05BVElWRV9IRUFERVIobG9jYWxlKQorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgxMDQxKQorIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfTE9DQUxFICovCisKKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bHBvcnQvbG9jYWxlLmggYi9zdGxwb3J0L2xvY2FsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxYjU2YjQKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L2xvY2FsZS5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWYgIWRlZmluZWQgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQpCisjICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDI0MgorIyAgaW5jbHVkZSA8c3RsL19jcHJvbG9nLmg+CisjZWxpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDI0MikKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQpCisjICAgIGRlZmluZSBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKKyMgIGVsc2UKKyMgICAgZXJyb3IgU1RMcG9ydCBpbmNsdWRlIHNjaGVtYSB2aW9sYXRpb24KKyMgIGVuZGlmCisjZW5kaWYKKworLyogZXZjMyBkb2Vzbid0IGhhdmUgbG9jYWxlLmggKi8KKyNpZm5kZWYgX1NUTFBfV0NFX0VWQzMKKyMgIGlmIGRlZmluZWQgKF9TVExQX0hBU19JTkNMVURFX05FWFQpCisjICAgIGluY2x1ZGVfbmV4dCA8bG9jYWxlLmg+CisjICBlbHNlCisjICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NfSEVBREVSKGxvY2FsZS5oKQorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgyNDIpCisjICBpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQorIyAgICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgICB1bmRlZiAgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZWxzZQorIyAgICB1bmRlZiAgX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lECisjICBlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9zdGxwb3J0L21hcCBiL3N0bHBvcnQvbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMGM0MDAKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L21hcApAQCAtMCwwICsxLDU3IEBACisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9NQVAKKworI2lmbmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDQzCisjICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgorIyAgZGVmaW5lIF9TVExQX01BUAorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDQzKQorIyAgaWZuZGVmIF9TVExQX0lOVEVSTkFMX01BUF9ICisjICAgIGluY2x1ZGUgPHN0bC9fbWFwLmg+CisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAhPSAweDQzKSB8fCBkZWZpbmVkIChfU1RMUF9JTVBPUlRfVkVORE9SX1NURCkKKyMgIGlmIGRlZmluZWQgKF9TVExQX0hBU19JTkNMVURFX05FWFQpCisjICAgIGluY2x1ZGVfbmV4dCA8bWFwPgorIyAgZWxzZQorIyAgICBpbmNsdWRlIF9TVExQX05BVElWRV9IRUFERVIobWFwKQorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHg0MykKKyMgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+CisjICB1bmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjZW5kaWYKKworI2VuZGlmIC8qIF9TVExQX01BUCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RscG9ydC9tYXRoLmggYi9zdGxwb3J0L21hdGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmI2NjZmCi0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9tYXRoLmgKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCkKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MjQ0CisjICBpbmNsdWRlIDxzdGwvX2Nwcm9sb2cuaD4KKyNlbGlmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MjQ0KSAmJiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQorIyAgZGVmaW5lIF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRAorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoZXhjZXB0aW9uKSAmJiAoIWRlZmluZWQgKF9fS0NDKSB8fCAoX19LQ0NfVkVSU0lPTiA8IDQwMDApKSAmJiBcCisgICAgIShkZWZpbmVkKF9fSUJNQ1BQX18pICYmICg1MDAgPD0gX19JQk1DUFBfXykpICYmICFkZWZpbmVkKF9TVExQX1dDRV9FVkMzKQorIyAgZGVmaW5lIF9TVExQX0VYQ0VQVElPTl9XQVNfUkVERUZJTkVEIDEKKyMgIGRlZmluZSBleGNlcHRpb24gX19tYXRoX2V4Y2VwdGlvbgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9IQVNfSU5DTFVERV9ORVhUKQorIyAgaW5jbHVkZV9uZXh0IDxtYXRoLmg+CisjZWxzZQorIyAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ19IRUFERVIobWF0aC5oKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9FWENFUFRJT05fV0FTX1JFREVGSU5FRCkKKyMgIHVuZGVmIGV4Y2VwdGlvbgorIyAgdW5kZWYgX1NUTFBfRVhDRVBUSU9OX1dBU19SRURFRklORUQKKyNlbmRpZgorCisjaWZkZWYgX1NUTFBfV0NFX0VWQzMKKyMgIHVuZGVmIF9leGNlcHRpb24KKyMgIGRlZmluZSBfZXhjZXB0aW9uIGV4Y2VwdGlvbgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDI0NCkKKyMgIGlmICEgZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQorIyAgICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgICB1bmRlZiAgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZWxzZQorIyAgICB1bmRlZiAgX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lECisjICBlbmRpZgorI2VuZGlmCisKZGlmZiAtLWdpdCBhL3N0bHBvcnQvbWVtLmggYi9zdGxwb3J0L21lbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlYmVjZWEKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L21lbS5oCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX21lbV9oCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCkKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MjQ1CisjICBpbmNsdWRlIDxzdGwvX2Nwcm9sb2cuaD4KKyNlbGlmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MjQ1KSAmJiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQorIyAgZGVmaW5lIF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRAorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAhPSAweDI0NSkgfHwgZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfSEFTX0lOQ0xVREVfTkVYVCkKKyMgICAgaW5jbHVkZV9uZXh0IDxtZW0uaD4KKyMgIGVsc2UKKyMgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ19IRUFERVIobWVtLmgpCisjICBlbmRpZgorI2Vsc2UKKyMgIGlmIGRlZmluZWQgKF9fQk9STEFORENfXykgJiYgZGVmaW5lZCAoX19VU0lOR19DTkFNRV9fKQorIyAgICBkZWZpbmUgX1VTSU5HX0NOQU1FX1dBU19VTkRFRklORUQKKyMgICAgdW5kZWYgX19VU0lOR19DTkFNRV9fCisjICBlbmRpZgorCisjICBpZiBkZWZpbmVkIChfU1RMUF9IQVNfSU5DTFVERV9ORVhUKQorIyAgICBpbmNsdWRlX25leHQgPG1lbS5oPgorIyAgZWxzZQorIyAgICBpbmNsdWRlIF9TVExQX05BVElWRV9DX0hFQURFUihtZW0uaCkKKyMgIGVuZGlmCisKKyMgIGlmIGRlZmluZWQgKF9fQk9STEFORENfXykgJiYgZGVmaW5lZCAoX1VTSU5HX0NOQU1FX1dBU19VTkRFRklORUQpCisjICAgIGRlZmluZSBfX1VTSU5HX0NOQU1FX18KKyMgICAgZGVmaW5lIF9TVExQX21lbV9oIDEKKyMgICAgdW5kZWYgX1VTSU5HX0NOQU1FX1dBU19VTkRFRklORUQKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MjQ1KQorIyAgaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKKyMgICAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgICAgdW5kZWYgIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGVuZGlmCisjICB1bmRlZiAgX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lECisjZW5kaWYKKworI2VuZGlmIC8qIF9TVExQX21lbV9oICovCmRpZmYgLS1naXQgYS9zdGxwb3J0L21lbW9yeSBiL3N0bHBvcnQvbWVtb3J5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMGNlYjMKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L21lbW9yeQpAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5Ny0xOTk5CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX01FTU9SWQorCisjaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4NDYKKyMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+CisjICBkZWZpbmUgX1NUTFBfTUVNT1JZCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4NDYpCisjICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfQUxMT0NfSAorIyAgICBpbmNsdWRlIDxzdGwvX2FsbG9jLmg+CisjICBlbmRpZgorCisjICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfVEVNUEJVRl9ICisjICAgIGluY2x1ZGUgPHN0bC9fdGVtcGJ1Zi5oPgorIyAgZW5kaWYKKworIyAgaWZuZGVmIF9TVExQX0lOVEVSTkFMX1JBV19TVE9SQUdFX0lURVJfSAorIyAgICBpbmNsdWRlIDxzdGwvX3Jhd19zdG9yYWdlX2l0ZXIuaD4KKyMgIGVuZGlmCisKKyMgIGluY2x1ZGUgPHN0bC9fYXV0b19wdHIuaD4KKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgIT0gMHg0NikgfHwgZGVmaW5lZCAoX1NUTFBfSU1QT1JUX1ZFTkRPUl9TVEQpCisjICBpZiBkZWZpbmVkIChfX01TTF9fKQorIyAgICBpbmNsdWRlIF9TVExQX05BVElWRV9IRUFERVIobGltaXRzKQorIyAgZW5kaWYKKworIyAgaWYgIWRlZmluZWQoX1NUTFBfTk9fRVhURU5TSU9OUykgJiYgZGVmaW5lZChfU1RMUF9VU0VfQk9PU1RfU1VQUE9SVCkKKyMgICAgZGVmaW5lIEJPT1NUX1RSMV9NRU1PUllfSU5DTFVERUQKKyMgICAgZGVmaW5lIEJPT1NUX1RSMV9GVUxMX01FTU9SWV9JTkNMVURFRAorIyAgZW5kaWYKKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfSEFTX0lOQ0xVREVfTkVYVCkKKyMgICAgaW5jbHVkZV9uZXh0IDxtZW1vcnk+CisjICBlbHNlCisjICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0hFQURFUihtZW1vcnkpCisjICBlbmRpZgorCisjICBpZiBkZWZpbmVkIChfX01TTF9fKSAmJiAoX19NU0xfXyA+PSAweDI0MDUgICAmJiBfX01TTF9fIDwgMHg1MjAxKSAKKy8qICA5ODA0MDEgdnNzICBNU0wgMi40ICBQcm8gMyBSZWxlYXNlICAqLyAgCisjICAgIGluY2x1ZGUgPG5ld19tZW0uaD4KKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4NDYpCisjICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChfU1RMUF9OT19FWFRFTlNJT05TKSAmJiBkZWZpbmVkKF9TVExQX1VTRV9CT09TVF9TVVBQT1JUKQorCituYW1lc3BhY2UgYm9vc3QgeworCitjbGFzcyBiYWRfd2Vha19wdHI7Cit0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBzaGFyZWRfcHRyOwordGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3Mgd2Vha19wdHI7Cit0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBlbmFibGVfc2hhcmVkX2Zyb21fdGhpczsKK3RlbXBsYXRlPGNsYXNzIEQsIGNsYXNzIFQ+IEQgKiBnZXRfZGVsZXRlcihzaGFyZWRfcHRyPFQ+IGNvbnN0ICYgcCk7Cit0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBVPiBzaGFyZWRfcHRyPFQ+IHN0YXRpY19wb2ludGVyX2Nhc3Qoc2hhcmVkX3B0cjxVPiBjb25zdCAmIHIpOwordGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVT4gc2hhcmVkX3B0cjxUPiBjb25zdF9wb2ludGVyX2Nhc3Qoc2hhcmVkX3B0cjxVPiBjb25zdCAmIHIpOwordGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVT4gc2hhcmVkX3B0cjxUPiBkeW5hbWljX3BvaW50ZXJfY2FzdChzaGFyZWRfcHRyPFU+IGNvbnN0ICYgcik7Cit0ZW1wbGF0ZTxjbGFzcyBUPiB2b2lkIHN3YXAod2Vha19wdHI8VD4gJiBhLCB3ZWFrX3B0cjxUPiAmIGIpOwordGVtcGxhdGU8Y2xhc3MgVD4gdm9pZCBzd2FwKHNoYXJlZF9wdHI8VD4gJiBhLCBzaGFyZWRfcHRyPFQ+ICYgYik7CisKK25hbWVzcGFjZSBkZXRhaWx7CitjbGFzcyBzaGFyZWRfY291bnQ7CitjbGFzcyB3ZWFrX2NvdW50OworfQorCit9IC8vIG5hbWVzcGFjZSBib29zdAorCisjICBpZm5kZWYgQk9PU1RfU0hBUkVEX1BUUl9IUFBfSU5DTFVERUQKKyMgICAgaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+CisjICBlbmRpZgorIyAgaWZuZGVmIEJPT1NUX1dFQUtfUFRSX0hQUF9JTkNMVURFRAorIyAgICBpbmNsdWRlIDxib29zdC93ZWFrX3B0ci5ocHA+CisjICBlbmRpZgorIyAgaWZuZGVmIEJPT1NUX0VOQUJMRV9TSEFSRURfRlJPTV9USElTX0hQUF9JTkNMVURFRAorIyAgICBpbmNsdWRlIDxib29zdC9lbmFibGVfc2hhcmVkX2Zyb21fdGhpcy5ocHA+CisjICBlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworbmFtZXNwYWNlIHRyMSB7CisKK3VzaW5nIDo6Ym9vc3Q6OmJhZF93ZWFrX3B0cjsKK3VzaW5nIDo6Ym9vc3Q6OnNoYXJlZF9wdHI7Cit1c2luZyA6OmJvb3N0Ojpzd2FwOwordXNpbmcgOjpib29zdDo6c3RhdGljX3BvaW50ZXJfY2FzdDsKK3VzaW5nIDo6Ym9vc3Q6OmR5bmFtaWNfcG9pbnRlcl9jYXN0OwordXNpbmcgOjpib29zdDo6Y29uc3RfcG9pbnRlcl9jYXN0OwordXNpbmcgOjpib29zdDo6Z2V0X2RlbGV0ZXI7Cit1c2luZyA6OmJvb3N0Ojp3ZWFrX3B0cjsKK3VzaW5nIDo6Ym9vc3Q6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzOworCisvLyBzaGFyZWRfcHRyIElPCisvLyB3ZWFrX3B0ciBJTworCit9IC8vIG5hbWVzcGFjZSB0cjEKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLyogIV9TVExQX05PX0VYVEVOU0lPTlMgJiYgX1NUTFBfVVNFX0JPT1NUX1NVUFBPUlQgKi8KKworI2VuZGlmIC8qIF9TVExQX01FTU9SWSAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgorCmRpZmYgLS1naXQgYS9zdGxwb3J0L25ldyBiL3N0bHBvcnQvbmV3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3NGNhNDQKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L25ldwpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9ORVdfSEVBREVSCisKKyNpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHg0NDcKKyMgIGRlZmluZSBfU1RMUF9ORVdfSEVBREVSCisjICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDQ0NykKKyMgIGlmbmRlZiBfU1RMUF9ORVdfSF9IRUFERVIKKyMgICAgaW5jbHVkZSA8c3RsL19uZXcuaD4KKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEICE9IDB4NDQ3KSB8fCBkZWZpbmVkIChfU1RMUF9JTVBPUlRfVkVORE9SX1NURCkKKyMgIGlmIGRlZmluZWQgKF9TVExQX0hBU19JTkNMVURFX05FWFQpCisjICAgIGluY2x1ZGVfbmV4dCA8bmV3PgorIyAgZWxzZQorIyAgICBpbmNsdWRlIF9TVExQX05BVElWRV9DUFBfUlVOVElNRV9IRUFERVIobmV3KQorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHg0NDcpCisjICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9ORVcgKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bHBvcnQvbmV3LmggYi9zdGxwb3J0L25ldy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhOWJmMzMKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L25ldy5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWYgIWRlZmluZWQgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQpCisjICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDg0OAorIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KKyNlbGlmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4ODQ4KSAmJiAhIGRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKKyMgIGRlZmluZSBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX1NUTFBfTk9fTkVXX0hFQURFUikKKyMgIGlmIGRlZmluZWQgKF9fQk9STEFORENfXykKKyMgICAgaW5jbHVkZSA8bmV3PgorIyAgZWxpZiBkZWZpbmVkIChfU1RMUF9IQVNfSU5DTFVERV9ORVhUKQorIyAgICBpbmNsdWRlX25leHQgPG5ldy5oPgorIyAgZWxpZiBkZWZpbmVkKF9fSU5URUxfQ09NUElMRVIpICYmIChfX0lOVEVMX0NPTVBJTEVSID49IDgwMCAmJiAhZGVmaW5lZChfTVNDX1ZFUikpCisjICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX09MRF9TVFJFQU1TX0hFQURFUihuZXcuaCkKKyMgIGVsc2UKKyMgICAgaWYgZGVmaW5lZCAoX19HTlVDX18pICYmIChfX0dOVUNfXyA+PSAzKQorIyAgICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX09MRF9TVFJFQU1TX0hFQURFUihuZXcuaCkKKyMgICAgZWxzZQorIyAgICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9SVU5USU1FX0hFQURFUihuZXcuaCkKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYgLyogIWRlZmluZWQoX1NUTFBfTk9fTkVXX0hFQURFUikgKi8KKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4ODQ4KQorIyAgaWYgISBkZWZpbmVkIChfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQpCisjICAgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+CisjICAgIHVuZGVmICBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjICBlbHNlCisjICAgIHVuZGVmICBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKKyMgIGVuZGlmCisjZW5kaWYKKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bHBvcnQvbnVtZXJpYyBiL3N0bHBvcnQvbnVtZXJpYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWU0NjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9udW1lcmljCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX05VTUVSSUMKKworI2lmbmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDQ5CisjICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgorIyAgZGVmaW5lIF9TVExQX05VTUVSSUMKKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHg0OSkKKyMgIGlmbmRlZiBfU1RMUF9JTlRFUk5BTF9OVU1FUklDX0gKKyMgICAgaW5jbHVkZSA8c3RsL19udW1lcmljLmg+CisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAhPSAweDQ5KSB8fCBkZWZpbmVkIChfU1RMUF9JTVBPUlRfVkVORE9SX1NURCkKKyMgIGlmIGRlZmluZWQgKF9TVExQX0hBU19JTkNMVURFX05FWFQpCisjICAgIGluY2x1ZGVfbmV4dCA8bnVtZXJpYz4KKyMgIGVsc2UKKyMgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfSEVBREVSKG51bWVyaWMpCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDQ5KQorIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfTlVNRVJJQyAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RscG9ydC9vc3RyZWFtIGIvc3RscG9ydC9vc3RyZWFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMzRkOWMKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L29zdHJlYW0KQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKyNpZm5kZWYgX1NUTFBfT1NUUkVBTQorCisjaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MTA1MAorIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KKyMgIGRlZmluZSBfU1RMUF9PU1RSRUFNCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MTA1MCkgJiYgXAorICAgIShkZWZpbmVkIChfU1RMUF9OT19JT1NUUkVBTVMpICYmIGRlZmluZWQgKF9TVExQX0lNUE9SVF9WRU5ET1JfU1REKSkKKyMgIGluY2x1ZGUgPHN0bC9faW9zZXJyLmg+CisKKyMgIGlmbmRlZiBfU1RMUF9JTlRFUk5BTF9PU1RSRUFNCisjICAgIGluY2x1ZGUgPHN0bC9fb3N0cmVhbS5oPgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgIT0gMHgxMDUwKSB8fCBkZWZpbmVkIChfU1RMUF9JTVBPUlRfVkVORE9SX1NURCkKKyMgIGlmIGRlZmluZWQgKF9TVExQX0hBU19JTkNMVURFX05FWFQpCisjICAgIGluY2x1ZGVfbmV4dCA8b3N0cmVhbT4KKyMgIGVsc2UKKyMgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfSEVBREVSKG9zdHJlYW0pCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDEwNTApCisjICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9PU1RSRUFNICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9vc3RyZWFtLmggYi9zdGxwb3J0L29zdHJlYW0uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gb3N0cmVhbS5oCnJlbmFtZSB0byBzdGxwb3J0L29zdHJlYW0uaApkaWZmIC0tZ2l0IGEvc3RscG9ydC9wdGhyZWFkLmggYi9zdGxwb3J0L3B0aHJlYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjBkOTBjCi0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9wdGhyZWFkLmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCkKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MjgwCisjICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgorI2VsaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgyODApICYmICEgZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQorIyAgZGVmaW5lIF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX1NVTlBST19DQykgfHwgZGVmaW5lZCAoX19IUF9hQ0MpCisjICBpbmNsdWRlICIvdXNyL2luY2x1ZGUvcHRocmVhZC5oIgorI2Vsc2UKKyMgIGlmIGRlZmluZWQgKF9TVExQX0hBU19JTkNMVURFX05FWFQpCisjICAgIGluY2x1ZGVfbmV4dCA8cHRocmVhZC5oPgorIyAgZWxzZQorIyAgICBpbmNsdWRlIF9TVExQX05BVElWRV9DX0hFQURFUihwdGhyZWFkLmgpCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDI4MCkKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQpCisjICAgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+CisjICAgIHVuZGVmICBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjICBlbHNlCisjICAgIHVuZGVmICBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKKyMgIGVuZGlmCisjZW5kaWYKKworLyoKKyBMb2NhbCBWYXJpYWJsZXM6CisgbW9kZTpDKysKKyBFbmQ6CisqLwpkaWZmIC0tZ2l0IGEvcHRocmVhZF9hbGxvYyBiL3N0bHBvcnQvcHRocmVhZF9hbGxvYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcHRocmVhZF9hbGxvYwpyZW5hbWUgdG8gc3RscG9ydC9wdGhyZWFkX2FsbG9jCmRpZmYgLS1naXQgYS9zdGxwb3J0L3F1ZXVlIGIvc3RscG9ydC9xdWV1ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWNkNjNmCi0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9xdWV1ZQpAQCAtMCwwICsxLDU3IEBACisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9RVUVVRQorCisjaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4NTMKKyMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+CisjICBkZWZpbmUgX1NUTFBfUVVFVUUKKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHg1MykKKyMgIGlmbmRlZiBfU1RMUF9JTlRFUk5BTF9RVUVVRV9ICisjICAgIGluY2x1ZGUgPHN0bC9fcXVldWUuaD4KKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEICE9IDB4NTMpIHx8IGRlZmluZWQgKF9TVExQX0lNUE9SVF9WRU5ET1JfU1REKQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfSEFTX0lOQ0xVREVfTkVYVCkKKyMgICAgaW5jbHVkZV9uZXh0IDxxdWV1ZT4KKyMgIGVsc2UKKyMgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfSEVBREVSKHF1ZXVlKQorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHg1MykKKyMgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+CisjICB1bmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjZW5kaWYKKworI2VuZGlmIC8qIF9TVExQX1FVRVVFICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9ybG9ja3MuaCBiL3N0bHBvcnQvcmxvY2tzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHJsb2Nrcy5oCnJlbmFtZSB0byBzdGxwb3J0L3Jsb2Nrcy5oCmRpZmYgLS1naXQgYS9yb3BlIGIvc3RscG9ydC9yb3BlCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSByb3BlCnJlbmFtZSB0byBzdGxwb3J0L3JvcGUKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc2V0IGIvc3RscG9ydC9zZXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ3OWQ4OQotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc2V0CkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX1NFVAorCisjaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4NTUKKyMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+CisjICBkZWZpbmUgX1NUTFBfU0VUCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4NTUpCisjICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfU0VUX0gKKyMgICAgaW5jbHVkZSA8c3RsL19zZXQuaD4KKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEICE9IDB4NTUpIHx8IGRlZmluZWQgKF9TVExQX0lNUE9SVF9WRU5ET1JfU1REKQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfSEFTX0lOQ0xVREVfTkVYVCkKKyMgICAgaW5jbHVkZV9uZXh0IDxzZXQ+CisjICBlbHNlCisjICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0hFQURFUihzZXQpCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDU1KQorIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfU0VUICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGxwb3J0L3NldGptcC5oIGIvc3RscG9ydC9zZXRqbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDNmNWVmCi0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zZXRqbXAuaApAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9TRVRKTVBfSAorCisjaWYgIWRlZmluZWQgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQpCisjICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDI1NgorIyAgaW5jbHVkZSA8c3RsL19jcHJvbG9nLmg+CisjZWxpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDI1NikgJiYgIWRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKKyMgIGRlZmluZSBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKKyMgIGRlZmluZSBfU1RMUF9TRVRKTVBfSAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9TVExQX1dDRV9FVkMzKQorc3RydWN0IF9leGNlcHRpb247CisjZW5kaWYKKworI2lmICFkZWZpbmVkIChzZXRqbXApCisjICBkZWZpbmUgX1NUTFBfTkFUSVZFX1NFVEpNUF9IX0lOQ0xVREVECisjICBpZiBkZWZpbmVkIChfU1RMUF9IQVNfSU5DTFVERV9ORVhUKQorIyAgICBpbmNsdWRlX25leHQgPHNldGptcC5oPgorIyAgZWxzZQorIyAgICBpbmNsdWRlIF9TVExQX05BVElWRV9DX0hFQURFUihzZXRqbXAuaCkKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmICFkZWZpbmVkIChfU1RMUF9OQVRJVkVfU0VUSk1QX0hfSU5DTFVERUQpCisvKiBTZWUgZXJybm8uaCBmaWxlIGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoaXMgcHJvYmxlbS4gKi8KKyMgIGVycm9yIHNldGptcCBoYXMgYmVlbiBkZWZpbmVkIGJlZm9yZSBpbmNsdXNpb24gb2Ygc2V0am1wLmggaGVhZGVyLgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDI1NikKKyMgIGlmICEgZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQorIyAgICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgICB1bmRlZiAgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZWxzZQorIyAgICB1bmRlZiAgX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lECisjICBlbmRpZgorI2VuZGlmCisjZW5kaWYgLyogX1NUTFBfU0VUSk1QX0ggKi8KZGlmZiAtLWdpdCBhL3N0bHBvcnQvc2lnbmFsLmggYi9zdGxwb3J0L3NpZ25hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ZjkxYmUKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3NpZ25hbC5oCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWYgIWRlZmluZWQgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQpCisjICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDI1NworIyAgaW5jbHVkZSA8c3RsL19jcHJvbG9nLmg+CisjZWxpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDI1NykgJiYgISBkZWZpbmVkIChfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQpCisjICBkZWZpbmUgX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lECisjZW5kaWYKKworLyogZXZjMyBhbmQgZXZjNCBkb24ndCBoYXZlIHNpZ25hbC5oICovCisjaWZuZGVmIF9TVExQX1dDRQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfSEFTX0lOQ0xVREVfTkVYVCkKKyMgICAgaW5jbHVkZV9uZXh0IDxzaWduYWwuaD4KKyMgIGVsc2UKKyMgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ19IRUFERVIoc2lnbmFsLmgpCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDI1NykKKyMgIGlmICEgZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQorIyAgICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgICB1bmRlZiAgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZW5kaWYKKyMgIHVuZGVmICBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9zbGlzdCBiL3N0bHBvcnQvc2xpc3QKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNsaXN0CnJlbmFtZSB0byBzdGxwb3J0L3NsaXN0CmRpZmYgLS1naXQgYS9zdGxwb3J0L3NzdHJlYW0gYi9zdGxwb3J0L3NzdHJlYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM2YmRkZQotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc3N0cmVhbQpAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworLy8gVGhpcyBoZWFkZXIgZGVmaW5lcyBjbGFzc2VzIGJhc2ljX3N0cmluZ2J1ZiwgYmFzaWNfaXN0cmluZ3N0cmVhbSwKKy8vIGJhc2ljX29zdHJpbmdzdHJlYW0sIGFuZCBiYXNpY19zdHJpbmdzdHJlYW0uICBUaGVzZSBjbGFzc2VzCisvLyByZXByZXNlbnQgc3RyZWFtc2J1ZnMgYW5kIHN0cmVhbXMgd2hvc2Ugc291cmNlcyBvciBkZXN0aW5hdGlvbnMgYXJlCisvLyBDKysgc3RyaW5ncy4KKworI2lmbmRlZiBfU1RMUF9TU1RSRUFNCisKKyNpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHgxMDU5CisjICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgorIyAgZGVmaW5lIF9TVExQX1NTVFJFQU0KKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgxMDU5KSAmJiBcCisgICAhKGRlZmluZWQgKF9TVExQX05PX0lPU1RSRUFNUykgJiYgZGVmaW5lZCAoX1NUTFBfSU1QT1JUX1ZFTkRPUl9TVEQpKQorIyAgaW5jbHVkZSA8c3RsL19pb3NlcnIuaD4KKworIyAgaWZuZGVmIF9TVExQX0lOVEVSTkFMX1NTVFJFQU0KKyMgICAgaW5jbHVkZSA8c3RsL19zc3RyZWFtLmg+CisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAhPSAweDEwNTkpIHx8IGRlZmluZWQgKF9TVExQX0lNUE9SVF9WRU5ET1JfU1REKQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfSEFTX0lOQ0xVREVfTkVYVCkKKyMgICAgaW5jbHVkZV9uZXh0IDxzc3RyZWFtPgorIyAgZWxzZQorIyAgICBpbmNsdWRlIF9TVExQX05BVElWRV9IRUFERVIoc3N0cmVhbSkKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MTA1OSkKKyMgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+CisjICB1bmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjZW5kaWYKKworI2VuZGlmIC8qIF9TVExQX1NTVFJFQU0gKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RhY2sgYi9zdGxwb3J0L3N0YWNrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1M2IzMWQKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0YWNrCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX1NUQUNLCisKKyNpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHg2MAorIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KKyMgIGRlZmluZSBfU1RMUF9TVEFDSworI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDYwKQorIyAgaWZuZGVmIF9TVExQX0lOVEVSTkFMX1NUQUNLX0gKKyMgICAgaW5jbHVkZSA8c3RsL19zdGFjay5oPgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgIT0gMHg2MCkgfHwgZGVmaW5lZCAoX1NUTFBfSU1QT1JUX1ZFTkRPUl9TVEQpCisjICBpZiBkZWZpbmVkIChfU1RMUF9IQVNfSU5DTFVERV9ORVhUKQorIyAgICBpbmNsdWRlX25leHQgPHN0YWNrPgorIyAgZWxzZQorIyAgICBpbmNsdWRlIF9TVExQX05BVElWRV9IRUFERVIoc3RhY2spCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDYwKQorIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfU1RBQ0sgKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RkYXJnLmggYi9zdGxwb3J0L3N0ZGFyZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2OGU2NzIKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0ZGFyZy5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisvKiBXb3JrYXJvdW5kIGZvciBhICJtaXNiZWhhdmlvdXIiIHdoZW4gY29tcGlsaW5nIHJlc291cmNlIHNjcmlwdHMgdXNpbmcKKyAqIGVNYmVkZGVkIFZpc3VhbCBDKysuIFRoZSBzdGFuZGFyZCAucmMgZmlsZSBpbmNsdWRlcyB3aW5kb3dzIGhlYWRlciBmaWxlcywKKyAqIHdoaWNoIGluIHR1cm4gaW5jbHVkZSBzdGRhcmcuaCwgd2hpY2ggcmVzdWx0cyBpbiB3YXJuaW5ncyBhbmQgZXJyb3JzCisgKi8KKyNpZiAhZGVmaW5lZCAoUkNfSU5WT0tFRCkKKworIyAgaWYgIWRlZmluZWQgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQpCisjICAgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MjYxCisjICAgIGluY2x1ZGUgPHN0bC9fY3Byb2xvZy5oPgorIyAgZWxpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDI2MSkgJiYgIWRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKKyMgICAgZGVmaW5lIF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRAorIyAgZW5kaWYKKworIyAgaWYgZGVmaW5lZChfU1RMUF9XQ0VfRVZDMykKK3N0cnVjdCBfZXhjZXB0aW9uOworIyAgZW5kaWYKKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfSEFTX0lOQ0xVREVfTkVYVCkKKyMgICAgaW5jbHVkZV9uZXh0IDxzdGRhcmcuaD4KKyMgIGVsc2UKKyMgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ19IRUFERVIoc3RkYXJnLmgpCisjICBlbmRpZgorCisjICBpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDI2MSkKKyMgICAgaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKKyMgICAgICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgICAgIHVuZGVmICBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjICAgIGVsc2UKKyMgICAgICB1bmRlZiAgX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lECisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmIC8qIFJDX0lOVk9LRUQgKi8KZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RkZGVmLmggYi9zdGxwb3J0L3N0ZGRlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NTljMjMKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0ZGRlZi5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MjYyCisjICBpbmNsdWRlIDxzdGwvX2Nwcm9sb2cuaD4KKyNlbGlmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MjYyKSAmJiAhIGRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKKyMgIGRlZmluZSBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX01TQ19WRVIpIHx8IGRlZmluZWQgKF9fRE1DX18pCisvKiBOYXRpdmUgc3RkZGVmLmggY29udGFpbnMgZXJybm8gbWFjcm8gZGVmaW5pdGlvbiBtYWtpbmcgaW5jbHVzaW9uIG9mIG5hdGl2ZQorICogZXJybm8uaCBpbiBTVExwb3J0IGVycm5vLmggaW1wb3NzaWJsZS4gV2UgYXJlIHRoZW4gZm9yY2VkIHRvIGluY2x1ZGUgZXJybm8uaAorICogZmlyc3QuCisgKi8KKyMgIGluY2x1ZGUgImVycm5vLmgiCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX0hBU19JTkNMVURFX05FWFQpCisjICBpbmNsdWRlX25leHQgPHN0ZGRlZi5oPgorI2Vsc2UKKyMgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NfSEVBREVSKHN0ZGRlZi5oKQorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDI2MikKKyMgIGlmICEgZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQorIyAgICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgICB1bmRlZiAgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZWxzZQorIyAgICB1bmRlZiAgX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lECisjICBlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0ZGV4Y2VwdCBiL3N0bHBvcnQvc3RkZXhjZXB0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYjk2YjkKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0ZGV4Y2VwdApAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfU1RERVhDRVBUCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCkKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4NjMKKyMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+CisjZWxpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDYzKSAmJiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQorIyAgZGVmaW5lIF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRAorIyAgZGVmaW5lIF9TVExQX1NUREVYQ0VQVAorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDYzKQorIyAgaWZuZGVmIF9TVExQX0lOVEVSTkFMX1NUREVYQ0VQVAorIyAgICBpbmNsdWRlIDxzdGwvX3N0ZGV4Y2VwdC5oPgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgIT0gMHg2MykgfHwgZGVmaW5lZCAoX1NUTFBfSU1QT1JUX1ZFTkRPUl9TVEQpCisjICBpZiBkZWZpbmVkIChfU1RMUF9IQVNfSU5DTFVERV9ORVhUKQorIyAgICBpbmNsdWRlX25leHQgPHN0ZGV4Y2VwdD4KKyMgIGVsc2UKKyMgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfSEVBREVSKHN0ZGV4Y2VwdCkKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4NjMpCisjICBpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQorIyAgICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgICB1bmRlZiAgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZWxzZQorIyAgICB1bmRlZiAgX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lECisjICBlbmRpZgorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9TVERFWENFUFQgKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RkaW8uaCBiL3N0bHBvcnQvc3RkaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmRiZGVhCi0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGRpby5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisvKiBXb3JrYXJvdW5kIGZvciBhICJtaXNiZWhhdmlvdXIiIHdoZW4gY29tcGlsaW5nIHJlc291cmNlIHNjcmlwdHMgdXNpbmcKKyAqIGVNYmVkZGVkIFZpc3VhbCBDKysuIFRoZSBzdGFuZGFyZCAucmMgZmlsZSBpbmNsdWRlcyB3aW5kb3dzIGhlYWRlciBmaWxlcywKKyAqIHdoaWNoIGluIHR1cm4gaW5jbHVkZSBzdGRhcmcuaCwgd2hpY2ggcmVzdWx0cyBpbiB3YXJuaW5ncyBhbmQgZXJyb3JzCisgKi8KKyNpZiAhZGVmaW5lZChSQ19JTlZPS0VEKQorCisjICBpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDI2NAorIyAgICBpbmNsdWRlIDxzdGwvX2Nwcm9sb2cuaD4KKyMgIGVsaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgyNjQpICYmICFkZWZpbmVkIChfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQpCisjICAgIGRlZmluZSBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKKyMgIGVuZGlmCisKKyMgICAgaWYgZGVmaW5lZChfU1RMUF9XQ0VfRVZDMykKK3N0cnVjdCBfZXhjZXB0aW9uOworIyAgICBlbmRpZgorIyAgICBpZiBkZWZpbmVkIChfU1RMUF9IQVNfSU5DTFVERV9ORVhUKQorIyAgICAgIGluY2x1ZGVfbmV4dCA8c3RkaW8uaD4KKyMgICAgZWxzZQorIyAgICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NfSEVBREVSKHN0ZGlvLmgpCisjICAgIGVuZGlmCisKKyMgICAgaWYgZGVmaW5lZCAoX19TVU5QUk9fQ0MpICYmICFkZWZpbmVkIChfU1RSVUNUX0ZJTEUpCisjICAgICAgZGVmaW5lIF9TVFJVQ1RfRklMRQorIyAgICBlbmRpZgorCisjICAgIGlmIGRlZmluZWQgKF9fQk9STEFORENfXykgJiYgZGVmaW5lZCAoX19jcGx1c3BsdXMpICYmICFkZWZpbmVkIChfX2xpbnV4X18pCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKK3VzaW5nIF9fc3RkX2FsaWFzOjpfc3RyZWFtczsKK19TVExQX0VORF9OQU1FU1BBQ0UKKyMgICAgZW5kaWYKKworIyAgaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgyNjQpCisjICAgIGlmICFkZWZpbmVkIChfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQpCisjICAgICAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgICAgICB1bmRlZiAgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgICBlbHNlCisjICAgICAgdW5kZWYgIF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRAorIyAgICBlbmRpZgorIyAgZW5kaWYKKworI2VuZGlmIC8qIFJDX0lOVk9LRUQgKi8KZGlmZiAtLWdpdCBhL3N0ZGlvc3RyZWFtLmggYi9zdGxwb3J0L3N0ZGlvc3RyZWFtLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHN0ZGlvc3RyZWFtLmgKcmVuYW1lIHRvIHN0bHBvcnQvc3RkaW9zdHJlYW0uaApkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdGRsaWIuaCBiL3N0bHBvcnQvc3RkbGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ1NWY4YQotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc3RkbGliLmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKy8qIFdvcmthcm91bmQgZm9yIGEgIm1pc2JlaGF2aW91ciIgd2hlbiBjb21waWxpbmcgcmVzb3VyY2Ugc2NyaXB0cyB1c2luZworICogZU1iZWRkZWQgVmlzdWFsIEMrKy4gVGhlIHN0YW5kYXJkIC5yYyBmaWxlIGluY2x1ZGVzIHdpbmRvd3MgaGVhZGVyIGZpbGVzLAorICogd2hpY2ggaW4gdHVybiBpbmNsdWRlIHN0ZGxpYi5oLCB3aGljaCByZXN1bHRzIGluIHdhcm5pbmdzIGFuZCBlcnJvcnMKKyAqLworI2lmICFkZWZpbmVkIChSQ19JTlZPS0VEKQorCisjICBpZiAhZGVmaW5lZCAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCkKKyMgICAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHgyNjUKKyMgICAgaW5jbHVkZSA8c3RsL19jcHJvbG9nLmg+CisjICBlbGlmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MjY1KSAmJiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQorIyAgICBkZWZpbmUgX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lECisjICBlbmRpZgorCisjICBpZiBkZWZpbmVkIChfU1RMUF9NU1ZDX0xJQikgfHwgKGRlZmluZWQgKF9fR05VQ19fKSAmJiBkZWZpbmVkIChfX01JTkdXMzJfXykpIHx8IFwKKyAgICAgICBkZWZpbmVkIChfX0JPUkxBTkRDX18pIHx8IGRlZmluZWQgKF9fRE1DX18pIHx8IFwKKyAgICAgICAoZGVmaW5lZCAoX19IUF9hQ0MpICYmIGRlZmluZWQgKF9SRUVOVFJBTlQpKQorLyogTmF0aXZlIHN0ZGxpYi5oIGNvbnRhaW5zIGVycm5vIG1hY3JvIGRlZmluaXRpb24gbWFraW5nIGluY2x1c2lvbiBvZiBuYXRpdmUKKyAqIGVycm5vLmggaW4gU1RMcG9ydCBlcnJuby5oIGltcG9zc2libGUuIFdlIGFyZSB0aGVuIGZvcmNlZCB0byBpbmNsdWRlIGVycm5vLmgKKyAqIGZpcnN0LgorICovCisjICAgIGluY2x1ZGUgImVycm5vLmgiCisjICBlbmRpZgorCisvKgorIGZvcndhcmQtZGVjbGFyYXRpb24gZm9yIF9leGNlcHRpb24gc3RydWN0OyBwcmV2ZW50cyB3YXJuaW5nIG1lc3NhZ2UKKyAuLi9pbmNsdWRlL3N0ZGxpYi5oKDgxNykgOiB3YXJuaW5nIEM0MTE1OiAnX2V4Y2VwdGlvbicgOiBuYW1lZCB0eXBlIGRlZmluaXRpb24gaW4gcGFyZW50aGVzZXMKKyovCisjICBpZiBkZWZpbmVkKF9TVExQX1dDRV9FVkMzKQorc3RydWN0IF9leGNlcHRpb247CisjICBlbmRpZgorCisjICBpZiBkZWZpbmVkIChfU1RMUF9IQVNfSU5DTFVERV9ORVhUKQorIyAgICBpbmNsdWRlX25leHQgPHN0ZGxpYi5oPgorIyAgZWxzZQorIyAgICBpbmNsdWRlIF9TVExQX05BVElWRV9DX0hFQURFUihzdGRsaWIuaCkKKyMgIGVuZGlmCisKKy8qIG9uIGV2YzMvZXZjNCBpbmNsdWRpbmcgc3RkbGliLmggYWxzbyBkZWZpbmVzIHNldGptcCBtYWNybyAqLworIyAgaWYgZGVmaW5lZCAoX1NUTFBfV0NFKQorIyAgICBkZWZpbmUgX1NUTFBfTkFUSVZFX1NFVEpNUF9IX0lOQ0xVREVECisjICBlbmRpZgorCisjICBpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDI2NSkKKyMgICAgaWYgISBkZWZpbmVkIChfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQpCisjICAgICAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgICAgICB1bmRlZiAgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgICBlbHNlCisjICAgICAgdW5kZWYgIF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRAorIyAgICBlbmRpZgorIyAgZW5kaWYKKworI2VuZGlmIC8qIFJDX0lOVk9LRUQgKi8KZGlmZiAtLWdpdCBhL3N0bC9fYWJicmV2cy5oIGIvc3RscG9ydC9zdGwvX2FiYnJldnMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3RsL19hYmJyZXZzLmgKcmVuYW1lIHRvIHN0bHBvcnQvc3RsL19hYmJyZXZzLmgKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL19hbGdvLmMgYi9zdGxwb3J0L3N0bC9fYWxnby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1OGI5MmQKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9fYWxnby5jCkBAIC0wLDAgKzEsMjAyOCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfQUxHT19DCisjZGVmaW5lIF9TVExQX0FMR09fQworCisjaWYgIWRlZmluZWQgKF9TVExQX0lOVEVSTkFMX0FMR09fSCkKKyMgIGluY2x1ZGUgPHN0bC9fYWxnby5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfVEVNUEJVRl9ICisjICBpbmNsdWRlIDxzdGwvX3RlbXBidWYuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyLCBjbGFzcyBfRGlzdGFuY2UsIGNsYXNzIF9Db21wYXJlPgordm9pZCBfX21lcmdlX3dpdGhvdXRfYnVmZmVyKF9CaWRpcmVjdGlvbmFsSXRlciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlciBfX21pZGRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EaXN0YW5jZSBfX2xlbjEsIF9EaXN0YW5jZSBfX2xlbjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NvbXBhcmUgX19jb21wKTsKKworCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyMSwgY2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyMiwKKyAgICAgICAgICBjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXIzLCBjbGFzcyBfQ29tcGFyZT4KK19CaWRpcmVjdGlvbmFsSXRlcjMgX19tZXJnZV9iYWNrd2FyZChfQmlkaXJlY3Rpb25hbEl0ZXIxIF9fZmlyc3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlcjEgX19sYXN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIyIF9fZmlyc3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlcjIgX19sYXN0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIzIF9fcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Db21wYXJlIF9fY29tcCk7CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CisjaWYgIShkZWZpbmVkIChfX1NVTlBST19DQykgJiYgKF9fU1VOUFJPX0NDIDwgMHg0MjAgKSkKK2lubGluZQorI2VuZGlmCitjb25zdCBfVHAmIF9fbWVkaWFuKGNvbnN0IF9UcCYgX19hLCBjb25zdCBfVHAmIF9fYiwgY29uc3QgX1RwJiBfX2MpIHsKKyAgaWYgKF9fYSA8IF9fYikKKyAgICBpZiAoX19iIDwgX19jKQorICAgICAgcmV0dXJuIF9fYjsKKyAgICBlbHNlIGlmIChfX2EgPCBfX2MpCisgICAgICByZXR1cm4gX19jOworICAgIGVsc2UKKyAgICAgIHJldHVybiBfX2E7CisgIGVsc2UgaWYgKF9fYSA8IF9fYykKKyAgICByZXR1cm4gX19hOworICBlbHNlIGlmIChfX2IgPCBfX2MpCisgICAgcmV0dXJuIF9fYzsKKyAgZWxzZQorICAgIHJldHVybiBfX2I7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlPgorI2lmICEoZGVmaW5lZCAoX19TVU5QUk9fQ0MpICYmIChfX1NVTlBST19DQyA8IDB4NDIwICkpCitpbmxpbmUKKyNlbmRpZgorY29uc3QgX1RwJgorX19tZWRpYW4oY29uc3QgX1RwJiBfX2EsIGNvbnN0IF9UcCYgX19iLCBjb25zdCBfVHAmIF9fYywgX0NvbXBhcmUgX19jb21wKSB7CisgIGlmIChfX2NvbXAoX19hLCBfX2IpKSB7CisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoIV9fY29tcChfX2IsIF9fYSksIF9TdGxNc2dfSU5WQUxJRF9TVFJJQ1RfV0VBS19QUkVESUNBVEUpCisgICAgaWYgKF9fY29tcChfX2IsIF9fYykpIHsKKyAgICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFfX2NvbXAoX19jLCBfX2IpLCBfU3RsTXNnX0lOVkFMSURfU1RSSUNUX1dFQUtfUFJFRElDQVRFKQorICAgICAgcmV0dXJuIF9fYjsKKyAgICB9CisgICAgZWxzZSBpZiAoX19jb21wKF9fYSwgX19jKSkgeworICAgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoIV9fY29tcChfX2MsIF9fYSksIF9TdGxNc2dfSU5WQUxJRF9TVFJJQ1RfV0VBS19QUkVESUNBVEUpCisgICAgICByZXR1cm4gX19jOworICAgIH0KKyAgICBlbHNlCisgICAgICByZXR1cm4gX19hOworICB9CisgIGVsc2UgaWYgKF9fY29tcChfX2EsIF9fYykpIHsKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghX19jb21wKF9fYywgX19hKSwgX1N0bE1zZ19JTlZBTElEX1NUUklDVF9XRUFLX1BSRURJQ0FURSkKKyAgICByZXR1cm4gX19hOworICB9CisgIGVsc2UgaWYgKF9fY29tcChfX2IsIF9fYykpIHsKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghX19jb21wKF9fYywgX19iKSwgX1N0bE1zZ19JTlZBTElEX1NUUklDVF9XRUFLX1BSRURJQ0FURSkKKyAgICByZXR1cm4gX19jOworICB9CisgIGVsc2UKKyAgICByZXR1cm4gX19iOworfQorCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcjEsIGNsYXNzIF9Gb3J3YXJkSXRlcjI+CitfRm9yd2FyZEl0ZXIxIHNlYXJjaChfRm9yd2FyZEl0ZXIxIF9fZmlyc3QxLCBfRm9yd2FyZEl0ZXIxIF9fbGFzdDEsCisgICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXIyIF9fZmlyc3QyLCBfRm9yd2FyZEl0ZXIyIF9fbGFzdDIpIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QxLCBfX2xhc3QxKSkKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QyLCBfX2xhc3QyKSkKKyAgLy8gVGVzdCBmb3IgZW1wdHkgcmFuZ2VzCisgIGlmIChfX2ZpcnN0MSA9PSBfX2xhc3QxIHx8IF9fZmlyc3QyID09IF9fbGFzdDIpCisgICAgcmV0dXJuIF9fZmlyc3QxOworCisgIC8vIFRlc3QgZm9yIGEgcGF0dGVybiBvZiBsZW5ndGggMS4KKyAgX0ZvcndhcmRJdGVyMiBfX3AxKF9fZmlyc3QyKTsKKworICBpZiAoICsrX19wMSA9PSBfX2xhc3QyICkKKyAgICByZXR1cm4gZmluZChfX2ZpcnN0MSwgX19sYXN0MSwgKl9fZmlyc3QyKTsKKworICAvLyBHZW5lcmFsIGNhc2UuCisKKyAgZm9yICggOyA7ICkgeyAvLyBfX2ZpcnN0MSAhPSBfX2xhc3QxIHdpbGwgYmUgY2hlY2tlZCBpbiBmaW5kIGJlbG93CisgICAgX19maXJzdDEgPSBmaW5kKF9fZmlyc3QxLCBfX2xhc3QxLCAqX19maXJzdDIpOworICAgIGlmIChfX2ZpcnN0MSA9PSBfX2xhc3QxKQorICAgICAgcmV0dXJuIF9fbGFzdDE7CisKKyAgICBfRm9yd2FyZEl0ZXIyIF9fcCA9IF9fcDE7CisgICAgX0ZvcndhcmRJdGVyMSBfX2N1cnJlbnQgPSBfX2ZpcnN0MTsKKyAgICBpZiAoKytfX2N1cnJlbnQgPT0gX19sYXN0MSkKKyAgICAgIHJldHVybiBfX2xhc3QxOworCisgICAgd2hpbGUgKCpfX2N1cnJlbnQgPT0gKl9fcCkgeworICAgICAgaWYgKCsrX19wID09IF9fbGFzdDIpCisgICAgICAgIHJldHVybiBfX2ZpcnN0MTsKKyAgICAgIGlmICgrK19fY3VycmVudCA9PSBfX2xhc3QxKQorICAgICAgICByZXR1cm4gX19sYXN0MTsKKyAgICB9CisKKyAgICArK19fZmlyc3QxOworICB9CisgIHJldHVybiBfX2ZpcnN0MTsKK30KKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9JbnRlZ2VyLCBjbGFzcyBfVHAsCisgICAgICAgICAgY2xhc3MgX0JpbmFyeVByZWQsIGNsYXNzIF9EaXN0YW5jZT4KK19SYW5kb21BY2Nlc3NJdGVyIF9fc2VhcmNoX24oX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSW50ZWdlciBfX2NvdW50LCBjb25zdCBfVHAmIF9fdmFsLCBfQmluYXJ5UHJlZCBfX3ByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EaXN0YW5jZSosIGNvbnN0IHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnICYpCit7CisgIF9EaXN0YW5jZSBfX3RhaWxTaXplID0gX19sYXN0IC0gX19maXJzdDsKKyAgY29uc3QgX0Rpc3RhbmNlIF9fcGF0dFNpemUgPSBfX2NvdW50OworICBjb25zdCBfRGlzdGFuY2UgX19za2lwT2Zmc2V0ID0gX19wYXR0U2l6ZSAtIDE7CisgIF9SYW5kb21BY2Nlc3NJdGVyIF9fYmFja1RyYWNrOworICBfRGlzdGFuY2UgX19yZW1haW5kZXIsIF9fcHJldlJlbWFpbmRlcjsKKworICBmb3IgKCBfUmFuZG9tQWNjZXNzSXRlciBfX2xvb2tBaGVhZCA9IF9fZmlyc3QgKyBfX3NraXBPZmZzZXQ7IF9fdGFpbFNpemUgPj0gX19wYXR0U2l6ZTsgX19sb29rQWhlYWQgKz0gX19wYXR0U2l6ZSApIHsgLy8gdGhlIG1haW4gbG9vcC4uLgorICAgIC8vX19sb29rQWhlYWQgaGVyZSBpcyBhbHdheXMgcG9pbnRpbmcgdG8gdGhlIGxhc3QgZWxlbWVudCBvZiBuZXh0IHBvc3NpYmxlIG1hdGNoLgorICAgIF9fdGFpbFNpemUgLT0gX19wYXR0U2l6ZTsKKworICAgIHdoaWxlICggIV9fcHJlZCgqX19sb29rQWhlYWQsIF9fdmFsKSApIHsgLy8gdGhlIHNraXAgbG9vcC4uLgorICAgICAgaWYgKF9fdGFpbFNpemUgPCBfX3BhdHRTaXplKQorICAgICAgICByZXR1cm4gX19sYXN0OworCisgICAgICBfX2xvb2tBaGVhZCArPSBfX3BhdHRTaXplOworICAgICAgX190YWlsU2l6ZSAtPSBfX3BhdHRTaXplOworICAgIH0KKworICAgIGlmICggX19za2lwT2Zmc2V0ID09IDAgKSB7CisgICAgICByZXR1cm4gKF9fbG9va0FoZWFkIC0gX19za2lwT2Zmc2V0KTsgLy9TdWNjZXNzCisgICAgfQorCisgICAgX19yZW1haW5kZXIgPSBfX3NraXBPZmZzZXQ7CisKKyAgICBmb3IgKF9fYmFja1RyYWNrID0gX19sb29rQWhlYWQ7IF9fcHJlZCgqLS1fX2JhY2tUcmFjaywgX192YWwpOyApIHsKKyAgICAgIGlmICgtLV9fcmVtYWluZGVyID09IDApCisgICAgICAgIHJldHVybiAoX19sb29rQWhlYWQgLSBfX3NraXBPZmZzZXQpOyAvL1N1Y2Nlc3MKKyAgICB9CisKKyAgICBpZiAoX19yZW1haW5kZXIgPiBfX3RhaWxTaXplKQorICAgICAgcmV0dXJuIF9fbGFzdDsgLy9mYWlsdXJlCisKKyAgICBfX2xvb2tBaGVhZCArPSBfX3JlbWFpbmRlcjsKKyAgICBfX3RhaWxTaXplIC09IF9fcmVtYWluZGVyOworCisgICAgd2hpbGUgKCBfX3ByZWQoKl9fbG9va0FoZWFkLCBfX3ZhbCkgKSB7CisgICAgICBfX3ByZXZSZW1haW5kZXIgPSBfX3JlbWFpbmRlcjsKKyAgICAgIF9fYmFja1RyYWNrID0gX19sb29rQWhlYWQ7CisKKyAgICAgIGRvIHsKKyAgICAgICAgaWYgKC0tX19yZW1haW5kZXIgPT0gMCkKKyAgICAgICAgICByZXR1cm4gKF9fbG9va0FoZWFkIC0gX19za2lwT2Zmc2V0KTsgLy9TdWNjZXNzCisgICAgICB9IHdoaWxlIChfX3ByZWQoKi0tX19iYWNrVHJhY2ssIF9fdmFsKSk7CisKKyAgICAgIC8vYWRqdXN0IHJlbWFpbmRlciBmb3IgbmV4dCBjb21wYXJpc29uCisgICAgICBfX3JlbWFpbmRlciArPSBfX3BhdHRTaXplIC0gX19wcmV2UmVtYWluZGVyOworCisgICAgICBpZiAoX19yZW1haW5kZXIgPiBfX3RhaWxTaXplKQorICAgICAgICByZXR1cm4gX19sYXN0OyAvL2ZhaWx1cmUKKworICAgICAgX19sb29rQWhlYWQgKz0gX19yZW1haW5kZXI7CisgICAgICBfX3RhaWxTaXplIC09IF9fcmVtYWluZGVyOworICAgIH0KKworICAgIC8vX19sb29rQWhlYWQgaGVyZSBpcyBhbHdheXMgcG9pbnRpbmcgdG8gdGhlIGVsZW1lbnQgb2YgdGhlIGxhc3QgbWlzbWF0Y2guCisgIH0KKworICByZXR1cm4gX19sYXN0OyAvL2ZhaWx1cmUKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX0ludGVnZXIsIGNsYXNzIF9UcCwKKyAgICAgICAgICBjbGFzcyBfRGlzdGFuY2UsIGNsYXNzIF9CaW5hcnlQcmVkPgorX0ZvcndhcmRJdGVyIF9fc2VhcmNoX24oX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBfSW50ZWdlciBfX2NvdW50LCBjb25zdCBfVHAmIF9fdmFsLCBfQmluYXJ5UHJlZCBfX3ByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICBfRGlzdGFuY2UqLCBjb25zdCBmb3J3YXJkX2l0ZXJhdG9yX3RhZyAmKSB7CisgIGZvciAoOyAoX19maXJzdCAhPSBfX2xhc3QpICYmICFfX3ByZWQoKl9fZmlyc3QsIF9fdmFsKTsgKytfX2ZpcnN0KSB7fQorICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QpIHsKKyAgICBfSW50ZWdlciBfX24gPSBfX2NvdW50IC0gMTsKKyAgICBfRm9yd2FyZEl0ZXIgX19pID0gX19maXJzdDsKKyAgICArK19faTsKKyAgICB3aGlsZSAoX19pICE9IF9fbGFzdCAmJiBfX24gIT0gMCAmJiBfX3ByZWQoKl9faSwgX192YWwpKSB7CisgICAgICArK19faTsKKyAgICAgIC0tX19uOworICAgIH0KKyAgICBpZiAoX19uID09IDApCisgICAgICByZXR1cm4gX19maXJzdDsKKyAgICBlbHNlIGlmIChfX2kgIT0gX19sYXN0KQorICAgICAgZm9yIChfX2ZpcnN0ID0gKytfX2k7IChfX2ZpcnN0ICE9IF9fbGFzdCkgJiYgIV9fcHJlZCgqX19maXJzdCwgX192YWwpOyArK19fZmlyc3QpIHt9CisgICAgZWxzZQorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIF9fbGFzdDsKK30KKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKKy8vIHNlYXJjaF9uLiAgU2VhcmNoIGZvciBfX2NvdW50IGNvbnNlY3V0aXZlIGNvcGllcyBvZiBfX3ZhbC4KK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9JbnRlZ2VyLCBjbGFzcyBfVHA+CitfRm9yd2FyZEl0ZXIgc2VhcmNoX24oX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgX0ludGVnZXIgX19jb3VudCwgY29uc3QgX1RwJiBfX3ZhbCkgeworICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKKyAgaWYgKF9fY291bnQgPD0gMCkKKyAgICByZXR1cm4gX19maXJzdDsKKyAgaWYgKF9fY291bnQgPT0gMSkKKyAgICAvL1dlIHVzZSBmaW5kIHdoZW4gX19jb3VudCA9PSAxIHRvIHVzZSBwb3RlbnRpYWwgZmluZCBvdmVybG9hZC4KKyAgICByZXR1cm4gZmluZChfX2ZpcnN0LCBfX2xhc3QsIF9fdmFsKTsKKyAgcmV0dXJuIF9TVExQX1BSSVYgX19zZWFyY2hfbihfX2ZpcnN0LCBfX2xhc3QsIF9fY291bnQsIF9fdmFsLCBlcXVhbF90bzxfVHA+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfRElTVEFOQ0VfVFlQRShfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9fZmlyc3QsIF9Gb3J3YXJkSXRlcikpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfSW50ZWdlciwgY2xhc3MgX1RwLCBjbGFzcyBfQmluYXJ5UHJlZD4KK19Gb3J3YXJkSXRlciBzZWFyY2hfbihfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICBfSW50ZWdlciBfX2NvdW50LCBjb25zdCBfVHAmIF9fdmFsLAorICAgICAgICAgICAgICAgICAgICAgIF9CaW5hcnlQcmVkIF9fYmluYXJ5X3ByZWQpIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgIGlmIChfX2NvdW50IDw9IDApCisgICAgcmV0dXJuIF9fZmlyc3Q7CisgIHJldHVybiBfU1RMUF9QUklWIF9fc2VhcmNoX24oX19maXJzdCwgX19sYXN0LCBfX2NvdW50LCBfX3ZhbCwgX19iaW5hcnlfcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9ESVNUQU5DRV9UWVBFKF9fZmlyc3QsIF9Gb3J3YXJkSXRlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfSVRFUkFUT1JfQ0FURUdPUlkoX19maXJzdCwgX0ZvcndhcmRJdGVyKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIxLCBjbGFzcyBfRm9yd2FyZEl0ZXIyPgorX0ZvcndhcmRJdGVyMQorZmluZF9lbmQoX0ZvcndhcmRJdGVyMSBfX2ZpcnN0MSwgX0ZvcndhcmRJdGVyMSBfX2xhc3QxLAorICAgICAgICAgX0ZvcndhcmRJdGVyMiBfX2ZpcnN0MiwgX0ZvcndhcmRJdGVyMiBfX2xhc3QyKSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0MSwgX19sYXN0MSkpCisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0MiwgX19sYXN0MikpCisgIHJldHVybiBfU1RMUF9QUklWIF9fZmluZF9lbmQoX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLCBfX2xhc3QyLAorI2lmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfSVRFUkFUT1JfQ0FURUdPUlkoX19maXJzdDEsIF9Gb3J3YXJkSXRlcjEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9fZmlyc3QyLCBfRm9yd2FyZEl0ZXIyKSwKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yd2FyZF9pdGVyYXRvcl90YWcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3J3YXJkX2l0ZXJhdG9yX3RhZygpLAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfX2VxdWFsX3RvKF9TVExQX1ZBTFVFX1RZUEUoX19maXJzdDEsIF9Gb3J3YXJkSXRlcjEpKQorICAgICk7Cit9CisKKy8vIHVuaXF1ZSBhbmQgdW5pcXVlX2NvcHkKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yLCBjbGFzcyBfT3V0cHV0SXRlcmF0b3IsIGNsYXNzIF9CaW5hcnlQcmVkaWNhdGUsCisgICAgICAgICAgY2xhc3MgX1RwPgorX1NUTFBfSU5MSU5FX0xPT1AgX091dHB1dEl0ZXJhdG9yCitfX3VuaXF1ZV9jb3B5KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LAorICAgICAgICAgICAgICBfQmluYXJ5UHJlZGljYXRlIF9fYmluYXJ5X3ByZWQsIF9UcCopIHsKKyAgX1RwIF9fdmFsID0gKl9fZmlyc3Q7CisgICpfX3Jlc3VsdCA9IF9fdmFsOworICB3aGlsZSAoKytfX2ZpcnN0ICE9IF9fbGFzdCkKKyAgICBpZiAoIV9fYmluYXJ5X3ByZWQoX192YWwsICpfX2ZpcnN0KSkgeworICAgICAgX192YWwgPSAqX19maXJzdDsKKyAgICAgICorK19fcmVzdWx0ID0gX192YWw7CisgICAgfQorICByZXR1cm4gKytfX3Jlc3VsdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9PdXRwdXRJdGVyLCBjbGFzcyBfQmluYXJ5UHJlZGljYXRlPgoraW5saW5lIF9PdXRwdXRJdGVyCitfX3VuaXF1ZV9jb3B5KF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsX091dHB1dEl0ZXIgX19yZXN1bHQsCisgICAgICAgICAgICAgIF9CaW5hcnlQcmVkaWNhdGUgX19iaW5hcnlfcHJlZCwgY29uc3Qgb3V0cHV0X2l0ZXJhdG9yX3RhZyAmKSB7CisgIHJldHVybiBfU1RMUF9QUklWIF9fdW5pcXVlX2NvcHkoX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCwgX19iaW5hcnlfcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsIF9JbnB1dEl0ZXIpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX0JpbmFyeVByZWRpY2F0ZT4KK19TVExQX0lOTElORV9MT09QIF9Gb3J3YXJkSXRlcgorX191bmlxdWVfY29weShfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LCBfRm9yd2FyZEl0ZXIgX19yZXN1bHQsCisgICAgICAgICAgICAgIF9CaW5hcnlQcmVkaWNhdGUgX19iaW5hcnlfcHJlZCwgY29uc3QgZm9yd2FyZF9pdGVyYXRvcl90YWcgJikgeworICAqX19yZXN1bHQgPSAqX19maXJzdDsKKyAgd2hpbGUgKCsrX19maXJzdCAhPSBfX2xhc3QpCisgICAgaWYgKCFfX2JpbmFyeV9wcmVkKCpfX3Jlc3VsdCwgKl9fZmlyc3QpKSAqKytfX3Jlc3VsdCA9ICpfX2ZpcnN0OworICByZXR1cm4gKytfX3Jlc3VsdDsKK30KKworI2lmIGRlZmluZWQgKF9TVExQX05PTlRFTVBMX0JBU0VfTUFUQ0hfQlVHKQordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yLCBjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCBjbGFzcyBfQmluYXJ5UHJlZGljYXRlPgoraW5saW5lIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IKK19fdW5pcXVlX2NvcHkoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fcmVzdWx0LCBfQmluYXJ5UHJlZGljYXRlIF9fYmluYXJ5X3ByZWQsCisgICAgICAgICAgICAgIGNvbnN0IGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnICYpIHsKKyAgcmV0dXJuIF9TVExQX1BSSVYgX191bmlxdWVfY29weShfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0LCBfX2JpbmFyeV9wcmVkLCBmb3J3YXJkX2l0ZXJhdG9yX3RhZygpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yLCBjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIGNsYXNzIF9CaW5hcnlQcmVkaWNhdGU+CitpbmxpbmUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yCitfX3VuaXF1ZV9jb3B5KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fcmVzdWx0LCBfQmluYXJ5UHJlZGljYXRlIF9fYmluYXJ5X3ByZWQsCisgICAgICAgICAgICAgIGNvbnN0IHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnICYpIHsKKyAgcmV0dXJuIF9TVExQX1BSSVYgX191bmlxdWVfY29weShfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0LCBfX2JpbmFyeV9wcmVkLCBmb3J3YXJkX2l0ZXJhdG9yX3RhZygpKTsKK30KKyNlbmRpZiAvKiBfU1RMUF9OT05URU1QTF9CQVNFX01BVENIX0JVRyAqLworCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9PdXRwdXRJdGVyPgorX091dHB1dEl0ZXIKK3VuaXF1ZV9jb3B5KF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsIF9PdXRwdXRJdGVyIF9fcmVzdWx0KSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICBpZiAoX19maXJzdCA9PSBfX2xhc3QpIHJldHVybiBfX3Jlc3VsdDsKKyAgcmV0dXJuIF9TVExQX1BSSVYgX191bmlxdWVfY29weShfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX19lcXVhbF90byhfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsIF9JbnB1dEl0ZXIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9JVEVSQVRPUl9DQVRFR09SWShfX3Jlc3VsdCwgX091dHB1dEl0ZXIpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9PdXRwdXRJdGVyLCBjbGFzcyBfQmluYXJ5UHJlZGljYXRlPgorX091dHB1dEl0ZXIKK3VuaXF1ZV9jb3B5KF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsX091dHB1dEl0ZXIgX19yZXN1bHQsCisgICAgICAgICAgICBfQmluYXJ5UHJlZGljYXRlIF9fYmluYXJ5X3ByZWQpIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkgcmV0dXJuIF9fcmVzdWx0OworICByZXR1cm4gX1NUTFBfUFJJViBfX3VuaXF1ZV9jb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQsIF9fYmluYXJ5X3ByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfSVRFUkFUT1JfQ0FURUdPUlkoX19yZXN1bHQsIF9PdXRwdXRJdGVyKSk7Cit9CisKKy8vIHJvdGF0ZSBhbmQgcm90YXRlX2NvcHksIGFuZCB0aGVpciBhdXhpbGlhcnkgZnVuY3Rpb25zCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9EaXN0YW5jZT4KK19Gb3J3YXJkSXRlciBfX3JvdGF0ZV9hdXgoX0ZvcndhcmRJdGVyIF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlciBfX21pZGRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX0Rpc3RhbmNlKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9yd2FyZF9pdGVyYXRvcl90YWcgJikgeworICBpZiAoX19maXJzdCA9PSBfX21pZGRsZSkKKyAgICByZXR1cm4gX19sYXN0OworICBpZiAoX19sYXN0ICA9PSBfX21pZGRsZSkKKyAgICByZXR1cm4gX19maXJzdDsKKworICBfRm9yd2FyZEl0ZXIgX19maXJzdDIgPSBfX21pZGRsZTsKKyAgZG8geworICAgIF9TVExQX1NURDo6c3dhcCgqX19maXJzdCsrLCAqX19maXJzdDIrKyk7CisgICAgaWYgKF9fZmlyc3QgPT0gX19taWRkbGUpCisgICAgICBfX21pZGRsZSA9IF9fZmlyc3QyOworICB9IHdoaWxlIChfX2ZpcnN0MiAhPSBfX2xhc3QpOworCisgIF9Gb3J3YXJkSXRlciBfX25ld19taWRkbGUgPSBfX2ZpcnN0OworCisgIF9fZmlyc3QyID0gX19taWRkbGU7CisKKyAgd2hpbGUgKF9fZmlyc3QyICE9IF9fbGFzdCkgeworICAgIF9TVExQX1NURDo6c3dhcCAoKl9fZmlyc3QrKywgKl9fZmlyc3QyKyspOworICAgIGlmIChfX2ZpcnN0ID09IF9fbWlkZGxlKQorICAgICAgX19taWRkbGUgPSBfX2ZpcnN0MjsKKyAgICBlbHNlIGlmIChfX2ZpcnN0MiA9PSBfX2xhc3QpCisgICAgICBfX2ZpcnN0MiA9IF9fbWlkZGxlOworICB9CisKKyAgcmV0dXJuIF9fbmV3X21pZGRsZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlciwgY2xhc3MgX0Rpc3RhbmNlPgorX0JpZGlyZWN0aW9uYWxJdGVyIF9fcm90YXRlX2F1eChfQmlkaXJlY3Rpb25hbEl0ZXIgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyIF9fbWlkZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRGlzdGFuY2UqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZyAmKSB7CisgIGlmIChfX2ZpcnN0ID09IF9fbWlkZGxlKQorICAgIHJldHVybiBfX2xhc3Q7CisgIGlmIChfX2xhc3QgID09IF9fbWlkZGxlKQorICAgIHJldHVybiBfX2ZpcnN0OworCisgIF9TVExQX1BSSVYgX19yZXZlcnNlKF9fZmlyc3QsICBfX21pZGRsZSwgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcoKSk7CisgIF9TVExQX1BSSVYgX19yZXZlcnNlKF9fbWlkZGxlLCBfX2xhc3QsICAgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcoKSk7CisKKyAgd2hpbGUgKF9fZmlyc3QgIT0gX19taWRkbGUgJiYgX19taWRkbGUgIT0gX19sYXN0KQorICAgIF9TVExQX1NURDo6c3dhcCgqX19maXJzdCsrLCAqLS1fX2xhc3QpOworCisgIGlmIChfX2ZpcnN0ID09IF9fbWlkZGxlKSB7CisgICAgX1NUTFBfUFJJViBfX3JldmVyc2UoX19taWRkbGUsIF9fbGFzdCwgICBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZygpKTsKKyAgICByZXR1cm4gX19sYXN0OworICB9CisgIGVsc2UgeworICAgIF9TVExQX1BSSVYgX19yZXZlcnNlKF9fZmlyc3QsICBfX21pZGRsZSwgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcoKSk7CisgICAgcmV0dXJuIF9fZmlyc3Q7CisgIH0KK30KKworLy8gcm90YXRlIGFuZCByb3RhdGVfY29weSwgYW5kIHRoZWlyIGF1eGlsaWFyeSBmdW5jdGlvbnMKK3RlbXBsYXRlIDxjbGFzcyBfRXVjbGlkZWFuUmluZ0VsZW1lbnQ+CitfU1RMUF9JTkxJTkVfTE9PUAorX0V1Y2xpZGVhblJpbmdFbGVtZW50IF9fZ2NkKF9FdWNsaWRlYW5SaW5nRWxlbWVudCBfX20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0V1Y2xpZGVhblJpbmdFbGVtZW50IF9fbikgeworICB3aGlsZSAoX19uICE9IDApIHsKKyAgICBfRXVjbGlkZWFuUmluZ0VsZW1lbnQgX190ID0gX19tICUgX19uOworICAgIF9fbSA9IF9fbjsKKyAgICBfX24gPSBfX3Q7CisgIH0KKyAgcmV0dXJuIF9fbTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBjbGFzcyBfRGlzdGFuY2UsIGNsYXNzIF9UcD4KK19SYW5kb21BY2Nlc3NJdGVyIF9fcm90YXRlX2F1eChfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fbWlkZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRGlzdGFuY2UgKiwgX1RwICopIHsKKworICBfRGlzdGFuY2UgX19uID0gX19sYXN0ICAgLSBfX2ZpcnN0OworICBfRGlzdGFuY2UgX19rID0gX19taWRkbGUgLSBfX2ZpcnN0OworICBfRGlzdGFuY2UgX19sID0gX19uIC0gX19rOworICBfUmFuZG9tQWNjZXNzSXRlciBfX3Jlc3VsdCA9IF9fZmlyc3QgKyAoX19sYXN0IC0gX19taWRkbGUpOworCisgIGlmIChfX2sgPT0gMCkgIC8qIF9fZmlyc3QgPT0gbWlkZGxlICovCisgICAgcmV0dXJuIF9fbGFzdDsKKworICBpZiAoX19rID09IF9fbCkgeworICAgIF9TVExQX1NURDo6c3dhcF9yYW5nZXMoX19maXJzdCwgX19taWRkbGUsIF9fbWlkZGxlKTsKKyAgICByZXR1cm4gX19yZXN1bHQ7CisgIH0KKworICBfRGlzdGFuY2UgX19kID0gX1NUTFBfUFJJViBfX2djZChfX24sIF9fayk7CisKKyAgZm9yIChfRGlzdGFuY2UgX19pID0gMDsgX19pIDwgX19kOyBfX2krKykgeworICAgIF9UcCBfX3RtcCA9ICpfX2ZpcnN0OworICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fcCA9IF9fZmlyc3Q7CisKKyAgICBpZiAoX19rIDwgX19sKSB7CisgICAgICBmb3IgKF9EaXN0YW5jZSBfX2ogPSAwOyBfX2ogPCBfX2wvX19kOyBfX2orKykgeworICAgICAgICBpZiAoX19wID4gX19maXJzdCArIF9fbCkgeworICAgICAgICAgICpfX3AgPSAqKF9fcCAtIF9fbCk7CisgICAgICAgICAgX19wIC09IF9fbDsKKyAgICAgICAgfQorCisgICAgICAgICpfX3AgPSAqKF9fcCArIF9fayk7CisgICAgICAgIF9fcCArPSBfX2s7CisgICAgICB9CisgICAgfQorCisgICAgZWxzZSB7CisgICAgICBmb3IgKF9EaXN0YW5jZSBfX2ogPSAwOyBfX2ogPCBfX2svX19kIC0gMTsgX19qICsrKSB7CisgICAgICAgIGlmIChfX3AgPCBfX2xhc3QgLSBfX2spIHsKKyAgICAgICAgICAqX19wID0gKihfX3AgKyBfX2spOworICAgICAgICAgIF9fcCArPSBfX2s7CisgICAgICAgIH0KKworICAgICAgICAqX19wID0gKiAoX19wIC0gX19sKTsKKyAgICAgICAgX19wIC09IF9fbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAqX19wID0gX190bXA7CisgICAgKytfX2ZpcnN0OworICB9CisKKyAgcmV0dXJuIF9fcmVzdWx0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9EaXN0YW5jZT4KK2lubGluZSBfUmFuZG9tQWNjZXNzSXRlcgorX19yb3RhdGVfYXV4KF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyIF9fbWlkZGxlLCBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsCisgICAgICAgICAgICAgX0Rpc3RhbmNlICogX19kaXMsIGNvbnN0IHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnICYpIHsKKyAgcmV0dXJuIF9TVExQX1BSSVYgX19yb3RhdGVfYXV4KF9fZmlyc3QsIF9fbWlkZGxlLCBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2RpcywgX1NUTFBfVkFMVUVfVFlQRShfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcikpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyPgorX0ZvcndhcmRJdGVyCitfX3JvdGF0ZShfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbWlkZGxlLCBfRm9yd2FyZEl0ZXIgX19sYXN0KSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19taWRkbGUpKQorICBfU1RMUF9ERUJVR19DSEVDSyhfX2NoZWNrX3JhbmdlKF9fbWlkZGxlLCBfX2xhc3QpKQorICByZXR1cm4gX19yb3RhdGVfYXV4KF9fZmlyc3QsIF9fbWlkZGxlLCBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfRElTVEFOQ0VfVFlQRShfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIpLAorICAgICAgICAgICAgICAgICAgICAgIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9fZmlyc3QsIF9Gb3J3YXJkSXRlcikpOworfQorCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcj4KK3ZvaWQgcm90YXRlKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19taWRkbGUsIF9Gb3J3YXJkSXRlciBfX2xhc3QpIHsKKyAgX1NUTFBfUFJJViBfX3JvdGF0ZShfX2ZpcnN0LCBfX21pZGRsZSwgX19sYXN0KTsKK30KKworLy8gUmV0dXJuIGEgcmFuZG9tIG51bWJlciBpbiB0aGUgcmFuZ2UgWzAsIF9fbikuICBUaGlzIGZ1bmN0aW9uIGVuY2Fwc3VsYXRlcworLy8gd2hldGhlciB3ZSdyZSB1c2luZyByYW5kIChwYXJ0IG9mIHRoZSBzdGFuZGFyZCBDIGxpYnJhcnkpIG9yIGxyYW5kNDgKKy8vIChub3Qgc3RhbmRhcmQsIGJ1dCBhIG11Y2ggYmV0dGVyIGNob2ljZSB3aGVuZXZlciBpdCdzIGF2YWlsYWJsZSkuCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfRGlzdGFuY2U+CitpbmxpbmUgX0Rpc3RhbmNlIF9fcmFuZG9tX251bWJlcihfRGlzdGFuY2UgX19uKSB7CisjaWZkZWYgX1NUTFBfTk9fRFJBTkQ0OAorICByZXR1cm4gcmFuZCgpICUgX19uOworI2Vsc2UKKyAgcmV0dXJuIGxyYW5kNDgoKSAlIF9fbjsKKyNlbmRpZgorfQorCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyPgordm9pZCByYW5kb21fc2h1ZmZsZShfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QpIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkgcmV0dXJuOworICBmb3IgKF9SYW5kb21BY2Nlc3NJdGVyIF9faSA9IF9fZmlyc3QgKyAxOyBfX2kgIT0gX19sYXN0OyArK19faSkKKyAgICBpdGVyX3N3YXAoX19pLCBfX2ZpcnN0ICsgX1NUTFBfUFJJViBfX3JhbmRvbV9udW1iZXIoKF9faSAtIF9fZmlyc3QpICsgMSkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9SYW5kb21OdW1iZXJHZW5lcmF0b3I+Cit2b2lkIHJhbmRvbV9zaHVmZmxlKF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgX1JhbmRvbU51bWJlckdlbmVyYXRvciAmX19yYW5kKSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICBpZiAoX19maXJzdCA9PSBfX2xhc3QpIHJldHVybjsKKyAgZm9yIChfUmFuZG9tQWNjZXNzSXRlciBfX2kgPSBfX2ZpcnN0ICsgMTsgX19pICE9IF9fbGFzdDsgKytfX2kpCisgICAgaXRlcl9zd2FwKF9faSwgX19maXJzdCArIF9fcmFuZCgoX19pIC0gX19maXJzdCkgKyAxKSk7Cit9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKKy8vIHJhbmRvbV9zYW1wbGUgYW5kIHJhbmRvbV9zYW1wbGVfbiAoZXh0ZW5zaW9ucywgbm90IHBhcnQgb2YgdGhlIHN0YW5kYXJkKS4KK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9PdXRwdXRJdGVyLCBjbGFzcyBfRGlzdGFuY2U+CitfT3V0cHV0SXRlciByYW5kb21fc2FtcGxlX24oX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXIgX19vdXRfaXRlLCBjb25zdCBfRGlzdGFuY2UgX19uKSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICBfRGlzdGFuY2UgX19yZW1haW5pbmcgPSBfU1RMUF9TVEQ6OmRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7CisgIF9EaXN0YW5jZSBfX20gPSAobWluKSAoX19uLCBfX3JlbWFpbmluZyk7CisKKyAgd2hpbGUgKF9fbSA+IDApIHsKKyAgICBpZiAoX1NUTFBfUFJJViBfX3JhbmRvbV9udW1iZXIoX19yZW1haW5pbmcpIDwgX19tKSB7CisgICAgICAqX19vdXRfaXRlID0gKl9fZmlyc3Q7CisgICAgICArK19fb3V0X2l0ZTsKKyAgICAgIC0tX19tOworICAgIH0KKworICAgIC0tX19yZW1haW5pbmc7CisgICAgKytfX2ZpcnN0OworICB9CisgIHJldHVybiBfX291dF9pdGU7Cit9CisKKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX091dHB1dEl0ZXIsIGNsYXNzIF9EaXN0YW5jZSwKKyAgICAgICAgICBjbGFzcyBfUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorX091dHB1dEl0ZXIgcmFuZG9tX3NhbXBsZV9uKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyIF9fb3V0X2l0ZSwgY29uc3QgX0Rpc3RhbmNlIF9fbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3JhbmQpIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgIF9EaXN0YW5jZSBfX3JlbWFpbmluZyA9IF9TVExQX1NURDo6ZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KTsKKyAgX0Rpc3RhbmNlIF9fbSA9IChtaW4pIChfX24sIF9fcmVtYWluaW5nKTsKKworICB3aGlsZSAoX19tID4gMCkgeworICAgIGlmIChfX3JhbmQoX19yZW1haW5pbmcpIDwgX19tKSB7CisgICAgICAqX19vdXRfaXRlID0gKl9fZmlyc3Q7CisgICAgICArK19fb3V0X2l0ZTsKKyAgICAgIC0tX19tOworICAgIH0KKworICAgIC0tX19yZW1haW5pbmc7CisgICAgKytfX2ZpcnN0OworICB9CisgIHJldHVybiBfX291dF9pdGU7Cit9CisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBjbGFzcyBfRGlzdGFuY2U+CitfUmFuZG9tQWNjZXNzSXRlciBfX3JhbmRvbV9zYW1wbGUoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX291dF9pdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0Rpc3RhbmNlIF9fbikgeworICBfRGlzdGFuY2UgX19tID0gMDsKKyAgX0Rpc3RhbmNlIF9fdCA9IF9fbjsKKyAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdCAmJiBfX20gPCBfX247ICsrX19tLCArK19fZmlyc3QpCisgICAgX19vdXRfaXRlW19fbV0gPSAqX19maXJzdDsKKworICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QpIHsKKyAgICArK19fdDsKKyAgICBfRGlzdGFuY2UgX19NID0gX19yYW5kb21fbnVtYmVyKF9fdCk7CisgICAgaWYgKF9fTSA8IF9fbikKKyAgICAgIF9fb3V0X2l0ZVtfX01dID0gKl9fZmlyc3Q7CisgICAgKytfX2ZpcnN0OworICB9CisKKyAgcmV0dXJuIF9fb3V0X2l0ZSArIF9fbTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLAorICAgICAgICAgIGNsYXNzIF9SYW5kb21OdW1iZXJHZW5lcmF0b3IsIGNsYXNzIF9EaXN0YW5jZT4KK19SYW5kb21BY2Nlc3NJdGVyIF9fcmFuZG9tX3NhbXBsZShfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fb3V0X2l0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3JhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0Rpc3RhbmNlIF9fbikgeworICBfRGlzdGFuY2UgX19tID0gMDsKKyAgX0Rpc3RhbmNlIF9fdCA9IF9fbjsKKyAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdCAmJiBfX20gPCBfX247ICsrX19tLCArK19fZmlyc3QpCisgICAgX19vdXRfaXRlW19fbV0gPSAqX19maXJzdDsKKworICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QpIHsKKyAgICArK19fdDsKKyAgICBfRGlzdGFuY2UgX19NID0gX19yYW5kKF9fdCk7CisgICAgaWYgKF9fTSA8IF9fbikKKyAgICAgIF9fb3V0X2l0ZVtfX01dID0gKl9fZmlyc3Q7CisgICAgKytfX2ZpcnN0OworICB9CisKKyAgcmV0dXJuIF9fb3V0X2l0ZSArIF9fbTsKK30KKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcj4KK19SYW5kb21BY2Nlc3NJdGVyCityYW5kb21fc2FtcGxlKF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCisgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fb3V0X2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlciBfX291dF9sYXN0KSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19vdXRfZmlyc3QsIF9fb3V0X2xhc3QpKQorICByZXR1cm4gX1NUTFBfUFJJViBfX3JhbmRvbV9zYW1wbGUoX19maXJzdCwgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19vdXRfZmlyc3QsIF9fb3V0X2xhc3QgLSBfX291dF9maXJzdCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX1JhbmRvbU51bWJlckdlbmVyYXRvcj4KK19SYW5kb21BY2Nlc3NJdGVyCityYW5kb21fc2FtcGxlKF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCisgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fb3V0X2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlciBfX291dF9sYXN0LAorICAgICAgICAgICAgICBfUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3JhbmQpIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX291dF9maXJzdCwgX19vdXRfbGFzdCkpCisgIHJldHVybiBfU1RMUF9QUklWIF9fcmFuZG9tX3NhbXBsZShfX2ZpcnN0LCBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX291dF9maXJzdCwgX19yYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19vdXRfbGFzdCAtIF9fb3V0X2ZpcnN0KTsKK30KKworI2VuZGlmIC8qIF9TVExQX05PX0VYVEVOU0lPTlMgKi8KKworLy8gcGFydGl0aW9uLCBzdGFibGVfcGFydGl0aW9uLCBhbmQgdGhlaXIgYXV4aWxpYXJ5IGZ1bmN0aW9ucworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfUHJlZGljYXRlPgorX1NUTFBfSU5MSU5FX0xPT1AgX0ZvcndhcmRJdGVyIF9fcGFydGl0aW9uKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1ByZWRpY2F0ZSAgIF9fcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3J3YXJkX2l0ZXJhdG9yX3RhZyAmKSB7CisgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkgcmV0dXJuIF9fZmlyc3Q7CisKKyAgd2hpbGUgKF9fcHJlZCgqX19maXJzdCkpCisgICAgaWYgKCsrX19maXJzdCA9PSBfX2xhc3QpIHJldHVybiBfX2ZpcnN0OworCisgIF9Gb3J3YXJkSXRlciBfX25leHQgPSBfX2ZpcnN0OworCisgIHdoaWxlICgrK19fbmV4dCAhPSBfX2xhc3QpIHsKKyAgICBpZiAoX19wcmVkKCpfX25leHQpKSB7CisgICAgICBfU1RMUF9TVEQ6OnN3YXAoKl9fZmlyc3QsICpfX25leHQpOworICAgICAgKytfX2ZpcnN0OworICAgIH0KKyAgfQorICByZXR1cm4gX19maXJzdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlciwgY2xhc3MgX1ByZWRpY2F0ZT4KK19TVExQX0lOTElORV9MT09QIF9CaWRpcmVjdGlvbmFsSXRlciBfX3BhcnRpdGlvbihfQmlkaXJlY3Rpb25hbEl0ZXIgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QcmVkaWNhdGUgX19wcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnICYpIHsKKyAgZm9yICg7OykgeworICAgIGZvciAoOzspIHsKKyAgICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKyAgICAgICAgcmV0dXJuIF9fZmlyc3Q7CisgICAgICBlbHNlIGlmIChfX3ByZWQoKl9fZmlyc3QpKQorICAgICAgICArK19fZmlyc3Q7CisgICAgICBlbHNlCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAtLV9fbGFzdDsKKyAgICBmb3IgKDs7KSB7CisgICAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCisgICAgICAgIHJldHVybiBfX2ZpcnN0OworICAgICAgZWxzZSBpZiAoIV9fcHJlZCgqX19sYXN0KSkKKyAgICAgICAgLS1fX2xhc3Q7CisgICAgICBlbHNlCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpdGVyX3N3YXAoX19maXJzdCwgX19sYXN0KTsKKyAgICArK19fZmlyc3Q7CisgIH0KK30KKworI2lmIGRlZmluZWQgKF9TVExQX05PTlRFTVBMX0JBU0VfTUFUQ0hfQlVHKQordGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlciwgY2xhc3MgX1ByZWRpY2F0ZT4KK2lubGluZQorX0JpZGlyZWN0aW9uYWxJdGVyIF9fcGFydGl0aW9uKF9CaWRpcmVjdGlvbmFsSXRlciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1ByZWRpY2F0ZSBfX3ByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgJikgeworICByZXR1cm4gX19wYXJ0aXRpb24oX19maXJzdCwgX19sYXN0LCBfX3ByZWQsIGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnKCkpOworfQorI2VuZGlmCisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfUHJlZGljYXRlPgorX0ZvcndhcmRJdGVyIHBhcnRpdGlvbihfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwgX1ByZWRpY2F0ZSAgIF9fcHJlZCkgeworICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKKyAgcmV0dXJuIF9TVExQX1BSSVYgX19wYXJ0aXRpb24oX19maXJzdCwgX19sYXN0LCBfX3ByZWQsIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9fZmlyc3QsIF9Gb3J3YXJkSXRlcikpOworfQorCisKKy8qIF9fcHJlZF9vZl9maXJzdDogZmFsc2UgaWYgd2Uga25vdyB0aGF0IF9fcHJlZCgqX19maXJzdCkgaXMgZmFsc2UsCisgKiAgICAgICAgICAgICAgICAgIHRydWUgd2hlbiB3ZSBkb24ndCBrbm93IHRoZSByZXN1bHQgb2YgX19wcmVkKCpfX2ZpcnN0KS4KKyAqIF9fbm90X3ByZWRfb2ZfYmVmb3JlX2xhc3Q6IHRydWUgaWYgd2Uga25vdyB0aGF0IF9fcHJlZCgqLS1fX2xhc3QpIGlzIHRydWUsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSB3aGVuIHdlIGRvbid0IGtub3cgdGhlIHJlc3VsdCBvZiBfX3ByZWQoKi0tX19sYXN0KS4KKyAqLworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfUHJlZGljYXRlLCBjbGFzcyBfRGlzdGFuY2U+CitfRm9yd2FyZEl0ZXIgX19pbnBsYWNlX3N0YWJsZV9wYXJ0aXRpb24oX0ZvcndhcmRJdGVyIF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHJlZGljYXRlIF9fcHJlZCwgX0Rpc3RhbmNlIF9fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgX19wcmVkX29mX2ZpcnN0LCBib29sIF9fcHJlZF9vZl9iZWZvcmVfbGFzdCkgeworICBpZiAoX19sZW4gPT0gMSkKKyAgICByZXR1cm4gKF9fcHJlZF9vZl9maXJzdCAmJiAoX19wcmVkX29mX2JlZm9yZV9sYXN0IHx8IF9fcHJlZCgqX19maXJzdCkpKSA/IF9fbGFzdCA6IF9fZmlyc3Q7CisgIF9Gb3J3YXJkSXRlciBfX21pZGRsZSA9IF9fZmlyc3Q7CisgIF9EaXN0YW5jZSBfX2hhbGZfbGVuID0gX19sZW4gLyAyOworICBfU1RMUF9TVEQ6OmFkdmFuY2UoX19taWRkbGUsIF9faGFsZl9sZW4pOworICByZXR1cm4gX1NUTFBfUFJJViBfX3JvdGF0ZShfU1RMUF9QUklWIF9faW5wbGFjZV9zdGFibGVfcGFydGl0aW9uKF9fZmlyc3QsIF9fbWlkZGxlLCBfX3ByZWQsIF9faGFsZl9sZW4sIF9fcHJlZF9vZl9maXJzdCwgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX21pZGRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfX2lucGxhY2Vfc3RhYmxlX3BhcnRpdGlvbihfX21pZGRsZSwgX19sYXN0LCBfX3ByZWQsIF9fbGVuIC0gX19oYWxmX2xlbiwgdHJ1ZSwgX19wcmVkX29mX2JlZm9yZV9sYXN0KSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9Qb2ludGVyLCBjbGFzcyBfUHJlZGljYXRlLAorICAgICAgICAgIGNsYXNzIF9EaXN0YW5jZT4KK19Gb3J3YXJkSXRlciBfX3N0YWJsZV9wYXJ0aXRpb25fYWRhcHRpdmUoX0ZvcndhcmRJdGVyIF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QcmVkaWNhdGUgX19wcmVkLCBfRGlzdGFuY2UgX19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Qb2ludGVyIF9fYnVmZmVyLCBfRGlzdGFuY2UgX19idWZmZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBfX3ByZWRfb2ZfZmlyc3QsIGJvb2wgX19wcmVkX29mX2JlZm9yZV9sYXN0KSB7CisgIGlmIChfX2xlbiA8PSBfX2J1ZmZlcl9zaXplKSB7CisgICAgX0ZvcndhcmRJdGVyIF9fcmVzdWx0MSA9IF9fZmlyc3Q7CisgICAgX1BvaW50ZXIgX19yZXN1bHQyID0gX19idWZmZXI7CisgICAgaWYgKChfX2ZpcnN0ICE9IF9fbGFzdCkgJiYgKCFfX3ByZWRfb2ZfZmlyc3QgfHwgX19wcmVkKCpfX2ZpcnN0KSkpIHsKKyAgICAgICpfX3Jlc3VsdDIgPSAqX19maXJzdDsKKyAgICAgICsrX19yZXN1bHQyOyArK19fZmlyc3Q7IC0tX19sZW47CisgICAgfQorICAgIGZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdCA7ICsrX19maXJzdCwgLS1fX2xlbikgeworICAgICAgaWYgKCgoX19sZW4gPT0gMSkgJiYgKF9fcHJlZF9vZl9iZWZvcmVfbGFzdCB8fCBfX3ByZWQoKl9fZmlyc3QpKSkgfHwKKyAgICAgICAgICAoKF9fbGVuICE9IDEpICYmIF9fcHJlZCgqX19maXJzdCkpKXsKKyAgICAgICAgKl9fcmVzdWx0MSA9ICpfX2ZpcnN0OworICAgICAgICArK19fcmVzdWx0MTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICAqX19yZXN1bHQyID0gKl9fZmlyc3Q7CisgICAgICAgICsrX19yZXN1bHQyOworICAgICAgfQorICAgIH0KKyAgICBfU1RMUF9TVEQ6OmNvcHkoX19idWZmZXIsIF9fcmVzdWx0MiwgX19yZXN1bHQxKTsKKyAgICByZXR1cm4gX19yZXN1bHQxOworICB9CisgIGVsc2UgeworICAgIF9Gb3J3YXJkSXRlciBfX21pZGRsZSA9IF9fZmlyc3Q7CisgICAgX0Rpc3RhbmNlIF9faGFsZl9sZW4gPSBfX2xlbiAvIDI7CisgICAgX1NUTFBfU1REOjphZHZhbmNlKF9fbWlkZGxlLCBfX2hhbGZfbGVuKTsKKyAgICByZXR1cm4gX1NUTFBfUFJJViBfX3JvdGF0ZShfU1RMUF9QUklWIF9fc3RhYmxlX3BhcnRpdGlvbl9hZGFwdGl2ZShfX2ZpcnN0LCBfX21pZGRsZSwgX19wcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faGFsZl9sZW4sIF9fYnVmZmVyLCBfX2J1ZmZlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcHJlZF9vZl9maXJzdCwgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbWlkZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX19zdGFibGVfcGFydGl0aW9uX2FkYXB0aXZlKF9fbWlkZGxlLCBfX2xhc3QsIF9fcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2xlbiAtIF9faGFsZl9sZW4sIF9fYnVmZmVyLCBfX2J1ZmZlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIF9fcHJlZF9vZl9iZWZvcmVfbGFzdCkpOworICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9QcmVkaWNhdGUsIGNsYXNzIF9UcCwgY2xhc3MgX0Rpc3RhbmNlPgoraW5saW5lIF9Gb3J3YXJkSXRlcgorX19zdGFibGVfcGFydGl0aW9uX2F1eF9hdXgoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHJlZGljYXRlIF9fcHJlZCwgX1RwKiwgX0Rpc3RhbmNlKiwgYm9vbCBfX3ByZWRfb2ZfYmVmb3JlX2xhc3QpIHsKKyAgX1RlbXBvcmFyeV9idWZmZXI8X0ZvcndhcmRJdGVyLCBfVHA+IF9fYnVmKF9fZmlyc3QsIF9fbGFzdCk7CisgIF9TVExQX01QV0ZJWF9UUlkgICAgLy8qVFkgMDYvMDEvMjAwMCAtIHRoZXkgZm9yZ2V0IHRvIGNhbGwgZHRvciBmb3IgX1RlbXBvcmFyeV9idWZmZXIgaWYgbm8gdHJ5L2NhdGNoIGJsb2NrIGlzIHByZXNlbnQKKyAgcmV0dXJuIChfX2J1Zi5zaXplKCkgPiAwKSA/CisgICAgX19zdGFibGVfcGFydGl0aW9uX2FkYXB0aXZlKF9fZmlyc3QsIF9fbGFzdCwgX19wcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRGlzdGFuY2UoX19idWYucmVxdWVzdGVkX3NpemUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYnVmLmJlZ2luKCksIF9fYnVmLnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIF9fcHJlZF9vZl9iZWZvcmVfbGFzdCkgIDoKKyAgICBfX2lucGxhY2Vfc3RhYmxlX3BhcnRpdGlvbihfX2ZpcnN0LCBfX2xhc3QsIF9fcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRGlzdGFuY2UoX19idWYucmVxdWVzdGVkX3NpemUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIF9fcHJlZF9vZl9iZWZvcmVfbGFzdCk7CisgIF9TVExQX01QV0ZJWF9DQVRDSCAgLy8qVFkgMDYvMDEvMjAwMCAtIHRoZXkgZm9yZ2V0IHRvIGNhbGwgZHRvciBmb3IgX1RlbXBvcmFyeV9idWZmZXIgaWYgbm8gdHJ5L2NhdGNoIGJsb2NrIGlzIHByZXNlbnQKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1ByZWRpY2F0ZT4KK19Gb3J3YXJkSXRlcgorX19zdGFibGVfcGFydGl0aW9uX2F1eChfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwgX1ByZWRpY2F0ZSBfX3ByZWQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcndhcmRfaXRlcmF0b3JfdGFnICYpIHsKKyAgcmV0dXJuIF9fc3RhYmxlX3BhcnRpdGlvbl9hdXhfYXV4KF9fZmlyc3QsIF9fbGFzdCwgX19wcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfVkFMVUVfVFlQRShfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfRElTVEFOQ0VfVFlQRShfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIpLCBmYWxzZSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3RJdGVyLCBjbGFzcyBfUHJlZGljYXRlPgorX0JpZGlyZWN0SXRlcgorX19zdGFibGVfcGFydGl0aW9uX2F1eChfQmlkaXJlY3RJdGVyIF9fZmlyc3QsIF9CaWRpcmVjdEl0ZXIgX19sYXN0LCBfUHJlZGljYXRlIF9fcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgJikgeworICBmb3IgKC0tX19sYXN0OzspIHsKKyAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCisgICAgICByZXR1cm4gX19maXJzdDsKKyAgICBlbHNlIGlmICghX19wcmVkKCpfX2xhc3QpKQorICAgICAgLS1fX2xhc3Q7CisgICAgZWxzZQorICAgICAgYnJlYWs7CisgIH0KKyAgKytfX2xhc3Q7CisgIC8vSGVyZSB3ZSBrbm93IHRoYXQgX19wcmVkKCotLV9fbGFzdCkgaXMgdHJ1ZQorICByZXR1cm4gX19zdGFibGVfcGFydGl0aW9uX2F1eF9hdXgoX19maXJzdCwgX19sYXN0LCBfX3ByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsIF9CaWRpcmVjdEl0ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfRElTVEFOQ0VfVFlQRShfX2ZpcnN0LCBfQmlkaXJlY3RJdGVyKSwgdHJ1ZSk7Cit9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9OT05URU1QTF9CQVNFX01BVENIX0JVRykKK3RlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3RJdGVyLCBjbGFzcyBfUHJlZGljYXRlPgorX0JpZGlyZWN0SXRlcgorX19zdGFibGVfcGFydGl0aW9uX2F1eChfQmlkaXJlY3RJdGVyIF9fZmlyc3QsIF9CaWRpcmVjdEl0ZXIgX19sYXN0LCBfUHJlZGljYXRlIF9fcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgJikgeworICByZXR1cm4gX19zdGFibGVfcGFydGl0aW9uX2F1eChfX2ZpcnN0LCBfX2xhc3QsIF9fcHJlZCwgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcoKSk7Cit9CisjZW5kaWYKKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9QcmVkaWNhdGU+CitfRm9yd2FyZEl0ZXIKK3N0YWJsZV9wYXJ0aXRpb24oX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsIF9QcmVkaWNhdGUgX19wcmVkKSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICBmb3IgKDs7KSB7CisgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorICAgICAgcmV0dXJuIF9fZmlyc3Q7CisgICAgZWxzZSBpZiAoX19wcmVkKCpfX2ZpcnN0KSkKKyAgICAgICsrX19maXJzdDsKKyAgICBlbHNlCisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gX1NUTFBfUFJJViBfX3N0YWJsZV9wYXJ0aXRpb25fYXV4KF9fZmlyc3QsIF9fbGFzdCwgX19wcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9fZmlyc3QsIF9Gb3J3YXJkSXRlcikpOworfQorCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZT4KK19SYW5kb21BY2Nlc3NJdGVyIF9fdW5ndWFyZGVkX3BhcnRpdGlvbihfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVHAgX19waXZvdCwgX0NvbXBhcmUgX19jb21wKSB7CisgIGZvciAoOzspIHsKKyAgICB3aGlsZSAoX19jb21wKCpfX2ZpcnN0LCBfX3Bpdm90KSkgeworICAgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoIV9fY29tcChfX3Bpdm90LCAqX19maXJzdCksIF9TdGxNc2dfSU5WQUxJRF9TVFJJQ1RfV0VBS19QUkVESUNBVEUpCisgICAgICArK19fZmlyc3Q7CisgICAgfQorICAgIC0tX19sYXN0OworICAgIHdoaWxlIChfX2NvbXAoX19waXZvdCwgKl9fbGFzdCkpIHsKKyAgICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFfX2NvbXAoKl9fbGFzdCwgX19waXZvdCksIF9TdGxNc2dfSU5WQUxJRF9TVFJJQ1RfV0VBS19QUkVESUNBVEUpCisgICAgICAtLV9fbGFzdDsKKyAgICB9CisgICAgaWYgKCEoX19maXJzdCA8IF9fbGFzdCkpCisgICAgICByZXR1cm4gX19maXJzdDsKKyAgICBpdGVyX3N3YXAoX19maXJzdCwgX19sYXN0KTsKKyAgICArK19fZmlyc3Q7CisgIH0KK30KKworLy8gc29ydCgpIGFuZCBpdHMgYXV4aWxpYXJ5IGZ1bmN0aW9ucy4KKyNkZWZpbmUgX19zdGxfdGhyZXNob2xkICAxNgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmU+Cit2b2lkIF9fdW5ndWFyZGVkX2xpbmVhcl9pbnNlcnQoX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0LCBfVHAgX192YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NvbXBhcmUgX19jb21wKSB7CisgIF9SYW5kb21BY2Nlc3NJdGVyIF9fbmV4dCA9IF9fbGFzdDsKKyAgLS1fX25leHQ7CisgIHdoaWxlIChfX2NvbXAoX192YWwsICpfX25leHQpKSB7CisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoIV9fY29tcCgqX19uZXh0LCBfX3ZhbCksIF9TdGxNc2dfSU5WQUxJRF9TVFJJQ1RfV0VBS19QUkVESUNBVEUpCisgICAgKl9fbGFzdCA9ICpfX25leHQ7CisgICAgX19sYXN0ID0gX19uZXh0OworICAgIC0tX19uZXh0OworICB9CisgICpfX2xhc3QgPSBfX3ZhbDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlPgoraW5saW5lIHZvaWQgX19saW5lYXJfaW5zZXJ0KF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0LCBfVHAgX192YWwsIF9Db21wYXJlIF9fY29tcCkgeworICAvLypUWSAxMi8yNi8xOTk4IC0gYWRkZWQgX192YWwgYXMgYSBwYXJhbXRlcgorICAvLyAgX1RwIF9fdmFsID0gKl9fbGFzdDsgICAgICAgIC8vKlRZIDEyLzI2LzE5OTggLSBfX3ZhbCBzdXBwbGllZCBieSBjYWxsZXIKKyAgaWYgKF9fY29tcChfX3ZhbCwgKl9fZmlyc3QpKSB7CisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoIV9fY29tcCgqX19maXJzdCwgX192YWwpLCBfU3RsTXNnX0lOVkFMSURfU1RSSUNUX1dFQUtfUFJFRElDQVRFKQorICAgIGNvcHlfYmFja3dhcmQoX19maXJzdCwgX19sYXN0LCBfX2xhc3QgKyAxKTsKKyAgICAqX19maXJzdCA9IF9fdmFsOworICB9CisgIGVsc2UKKyAgICBfX3VuZ3VhcmRlZF9saW5lYXJfaW5zZXJ0KF9fbGFzdCwgX192YWwsIF9fY29tcCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZT4KK3ZvaWQgX19pbnNlcnRpb25fc29ydChfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICBfVHAgKiwgX0NvbXBhcmUgX19jb21wKSB7CisgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkgcmV0dXJuOworICBmb3IgKF9SYW5kb21BY2Nlc3NJdGVyIF9faSA9IF9fZmlyc3QgKyAxOyBfX2kgIT0gX19sYXN0OyArK19faSkKKyAgICBfX2xpbmVhcl9pbnNlcnQ8X1JhbmRvbUFjY2Vzc0l0ZXIsIF9UcCwgX0NvbXBhcmU+KF9fZmlyc3QsIF9faSwgKl9faSwgX19jb21wKTsgIC8vKlRZIDEyLzI2LzE5OTggLSBzdXBwbHkgKl9faSBhcyBfX3ZhbAorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmU+Cit2b2lkIF9fdW5ndWFyZGVkX2luc2VydGlvbl9zb3J0X2F1eChfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1RwKiwgX0NvbXBhcmUgX19jb21wKSB7CisgIGZvciAoX1JhbmRvbUFjY2Vzc0l0ZXIgX19pID0gX19maXJzdDsgX19pICE9IF9fbGFzdDsgKytfX2kpCisgICAgX191bmd1YXJkZWRfbGluZWFyX2luc2VydDxfUmFuZG9tQWNjZXNzSXRlciwgX1RwLCBfQ29tcGFyZT4oX19pLCAqX19pLCBfX2NvbXApOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9Db21wYXJlPgoraW5saW5lIHZvaWQgX191bmd1YXJkZWRfaW5zZXJ0aW9uX3NvcnQoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Db21wYXJlIF9fY29tcCkgeworICBfX3VuZ3VhcmRlZF9pbnNlcnRpb25fc29ydF9hdXgoX19maXJzdCwgX19sYXN0LCBfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyKSwgX19jb21wKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBjbGFzcyBfQ29tcGFyZT4KK3ZvaWQgX19maW5hbF9pbnNlcnRpb25fc29ydChfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwgX0NvbXBhcmUgX19jb21wKSB7CisgIGlmIChfX2xhc3QgLSBfX2ZpcnN0ID4gX19zdGxfdGhyZXNob2xkKSB7CisgICAgX19pbnNlcnRpb25fc29ydChfX2ZpcnN0LCBfX2ZpcnN0ICsgX19zdGxfdGhyZXNob2xkLCBfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsX1JhbmRvbUFjY2Vzc0l0ZXIpLCBfX2NvbXApOworICAgIF9fdW5ndWFyZGVkX2luc2VydGlvbl9zb3J0KF9fZmlyc3QgKyBfX3N0bF90aHJlc2hvbGQsIF9fbGFzdCwgX19jb21wKTsKKyAgfQorICBlbHNlCisgICAgX19pbnNlcnRpb25fc29ydChfX2ZpcnN0LCBfX2xhc3QsIF9TVExQX1ZBTFVFX1RZUEUoX19maXJzdCxfUmFuZG9tQWNjZXNzSXRlciksIF9fY29tcCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX1RwLCBjbGFzcyBfU2l6ZSwgY2xhc3MgX0NvbXBhcmU+Cit2b2lkIF9faW50cm9zb3J0X2xvb3AoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsIF9UcCosCisgICAgICAgICAgICAgICAgICAgICAgX1NpemUgX19kZXB0aF9saW1pdCwgX0NvbXBhcmUgX19jb21wKSB7CisgIHdoaWxlIChfX2xhc3QgLSBfX2ZpcnN0ID4gX19zdGxfdGhyZXNob2xkKSB7CisgICAgaWYgKF9fZGVwdGhfbGltaXQgPT0gMCkgeworICAgICAgcGFydGlhbF9zb3J0KF9fZmlyc3QsIF9fbGFzdCwgX19sYXN0LCBfX2NvbXApOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICAtLV9fZGVwdGhfbGltaXQ7CisgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19jdXQgPQorICAgICAgX191bmd1YXJkZWRfcGFydGl0aW9uKF9fZmlyc3QsIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVHAoX19tZWRpYW4oKl9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooX19maXJzdCArIChfX2xhc3QgLSBfX2ZpcnN0KS8yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihfX2xhc3QgLSAxKSwgX19jb21wKSksCisgICAgICAgX19jb21wKTsKKyAgICBfX2ludHJvc29ydF9sb29wKF9fY3V0LCBfX2xhc3QsIChfVHAqKSAwLCBfX2RlcHRoX2xpbWl0LCBfX2NvbXApOworICAgIF9fbGFzdCA9IF9fY3V0OworICB9Cit9CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXI+Cit2b2lkIHNvcnQoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0KSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICBpZiAoX19maXJzdCAhPSBfX2xhc3QpIHsKKyAgICBfU1RMUF9QUklWIF9faW50cm9zb3J0X2xvb3AoX19maXJzdCwgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfX2xnKF9fbGFzdCAtIF9fZmlyc3QpICogMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfX2xlc3MoX1NUTFBfVkFMVUVfVFlQRShfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcikpKTsKKyAgICBfU1RMUF9QUklWIF9fZmluYWxfaW5zZXJ0aW9uX3NvcnQoX19maXJzdCwgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fbGVzcyhfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyKSkpOworICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX0NvbXBhcmU+Cit2b2lkIHNvcnQoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0LCBfQ29tcGFyZSBfX2NvbXApIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgIGlmIChfX2ZpcnN0ICE9IF9fbGFzdCkgeworICAgIF9TVExQX1BSSVYgX19pbnRyb3NvcnRfbG9vcChfX2ZpcnN0LCBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1ZBTFVFX1RZUEUoX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fbGcoX19sYXN0IC0gX19maXJzdCkgKiAyLCBfX2NvbXApOworICAgIF9TVExQX1BSSVYgX19maW5hbF9pbnNlcnRpb25fc29ydChfX2ZpcnN0LCBfX2xhc3QsIF9fY29tcCk7CisgIH0KK30KKworLy8gc3RhYmxlX3NvcnQoKSBhbmQgaXRzIGF1eGlsaWFyeSBmdW5jdGlvbnMuCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX0NvbXBhcmU+Cit2b2lkIF9faW5wbGFjZV9zdGFibGVfc29ydChfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0LCBfQ29tcGFyZSBfX2NvbXApIHsKKyAgaWYgKF9fbGFzdCAtIF9fZmlyc3QgPCAxNSkgeworICAgIF9faW5zZXJ0aW9uX3NvcnQoX19maXJzdCwgX19sYXN0LCBfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsX1JhbmRvbUFjY2Vzc0l0ZXIpLCBfX2NvbXApOworICAgIHJldHVybjsKKyAgfQorICBfUmFuZG9tQWNjZXNzSXRlciBfX21pZGRsZSA9IF9fZmlyc3QgKyAoX19sYXN0IC0gX19maXJzdCkgLyAyOworICBfX2lucGxhY2Vfc3RhYmxlX3NvcnQoX19maXJzdCwgX19taWRkbGUsIF9fY29tcCk7CisgIF9faW5wbGFjZV9zdGFibGVfc29ydChfX21pZGRsZSwgX19sYXN0LCBfX2NvbXApOworICBfX21lcmdlX3dpdGhvdXRfYnVmZmVyKF9fZmlyc3QsIF9fbWlkZGxlLCBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgX19taWRkbGUgLSBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIF9fbGFzdCAtIF9fbWlkZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9fY29tcCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcjEsIGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyMiwKKyAgICAgICAgICBjbGFzcyBfRGlzdGFuY2UsIGNsYXNzIF9Db21wYXJlPgordm9pZCBfX21lcmdlX3NvcnRfbG9vcChfUmFuZG9tQWNjZXNzSXRlcjEgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIxIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIyIF9fcmVzdWx0LCBfRGlzdGFuY2UgX19zdGVwX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgIF9Db21wYXJlIF9fY29tcCkgeworICBfRGlzdGFuY2UgX190d29fc3RlcCA9IDIgKiBfX3N0ZXBfc2l6ZTsKKworICB3aGlsZSAoX19sYXN0IC0gX19maXJzdCA+PSBfX3R3b19zdGVwKSB7CisgICAgX19yZXN1bHQgPSBtZXJnZShfX2ZpcnN0LCBfX2ZpcnN0ICsgX19zdGVwX3NpemUsCisgICAgICAgICAgICAgICAgICAgICBfX2ZpcnN0ICsgX19zdGVwX3NpemUsIF9fZmlyc3QgKyBfX3R3b19zdGVwLAorICAgICAgICAgICAgICAgICAgICAgX19yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICBfX2NvbXApOworICAgIF9fZmlyc3QgKz0gX190d29fc3RlcDsKKyAgfQorICBfX3N0ZXBfc2l6ZSA9IChtaW4pIChfRGlzdGFuY2UoX19sYXN0IC0gX19maXJzdCksIF9fc3RlcF9zaXplKTsKKworICBtZXJnZShfX2ZpcnN0LCBfX2ZpcnN0ICsgX19zdGVwX3NpemUsCisgICAgICAgIF9fZmlyc3QgKyBfX3N0ZXBfc2l6ZSwgX19sYXN0LAorICAgICAgICBfX3Jlc3VsdCwKKyAgICAgICAgX19jb21wKTsKK30KKworY29uc3QgaW50IF9fc3RsX2NodW5rX3NpemUgPSA3OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9EaXN0YW5jZSwgY2xhc3MgX0NvbXBhcmU+Cit2b2lkIF9fY2h1bmtfaW5zZXJ0aW9uX3NvcnQoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0Rpc3RhbmNlIF9fY2h1bmtfc2l6ZSwgX0NvbXBhcmUgX19jb21wKSB7CisgIHdoaWxlIChfX2xhc3QgLSBfX2ZpcnN0ID49IF9fY2h1bmtfc2l6ZSkgeworICAgIF9faW5zZXJ0aW9uX3NvcnQoX19maXJzdCwgX19maXJzdCArIF9fY2h1bmtfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIF9TVExQX1ZBTFVFX1RZUEUoX19maXJzdCxfUmFuZG9tQWNjZXNzSXRlciksIF9fY29tcCk7CisgICAgX19maXJzdCArPSBfX2NodW5rX3NpemU7CisgIH0KKyAgX19pbnNlcnRpb25fc29ydChfX2ZpcnN0LCBfX2xhc3QsIF9TVExQX1ZBTFVFX1RZUEUoX19maXJzdCxfUmFuZG9tQWNjZXNzSXRlciksIF9fY29tcCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX1BvaW50ZXIsIGNsYXNzIF9EaXN0YW5jZSwKKyAgICAgICAgICBjbGFzcyBfQ29tcGFyZT4KK3ZvaWQgX19tZXJnZV9zb3J0X3dpdGhfYnVmZmVyKF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsIF9Qb2ludGVyIF9fYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0Rpc3RhbmNlKiwgX0NvbXBhcmUgX19jb21wKSB7CisgIF9EaXN0YW5jZSBfX2xlbiA9IF9fbGFzdCAtIF9fZmlyc3Q7CisgIF9Qb2ludGVyIF9fYnVmZmVyX2xhc3QgPSBfX2J1ZmZlciArIF9fbGVuOworCisgIF9EaXN0YW5jZSBfX3N0ZXBfc2l6ZSA9IF9fc3RsX2NodW5rX3NpemU7CisgIF9fY2h1bmtfaW5zZXJ0aW9uX3NvcnQoX19maXJzdCwgX19sYXN0LCBfX3N0ZXBfc2l6ZSwgX19jb21wKTsKKworICB3aGlsZSAoX19zdGVwX3NpemUgPCBfX2xlbikgeworICAgIF9fbWVyZ2Vfc29ydF9sb29wKF9fZmlyc3QsIF9fbGFzdCwgX19idWZmZXIsIF9fc3RlcF9zaXplLCBfX2NvbXApOworICAgIF9fc3RlcF9zaXplICo9IDI7CisgICAgX19tZXJnZV9zb3J0X2xvb3AoX19idWZmZXIsIF9fYnVmZmVyX2xhc3QsIF9fZmlyc3QsIF9fc3RlcF9zaXplLCBfX2NvbXApOworICAgIF9fc3RlcF9zaXplICo9IDI7CisgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcjEsIGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcjIsCisgICAgICAgICAgY2xhc3MgX0Rpc3RhbmNlPgorX0JpZGlyZWN0aW9uYWxJdGVyMSBfX3JvdGF0ZV9hZGFwdGl2ZShfQmlkaXJlY3Rpb25hbEl0ZXIxIF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlcjEgX19taWRkbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlcjEgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRGlzdGFuY2UgX19sZW4xLCBfRGlzdGFuY2UgX19sZW4yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIyIF9fYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRGlzdGFuY2UgX19idWZmZXJfc2l6ZSkgeworICBpZiAoX19sZW4xID4gX19sZW4yICYmIF9fbGVuMiA8PSBfX2J1ZmZlcl9zaXplKSB7CisgICAgX0JpZGlyZWN0aW9uYWxJdGVyMiBfX2J1ZmZlcl9lbmQgPSBfU1RMUF9TVEQ6OmNvcHkoX19taWRkbGUsIF9fbGFzdCwgX19idWZmZXIpOworICAgIF9TVExQX1NURDo6Y29weV9iYWNrd2FyZChfX2ZpcnN0LCBfX21pZGRsZSwgX19sYXN0KTsKKyAgICByZXR1cm4gX1NUTFBfU1REOjpjb3B5KF9fYnVmZmVyLCBfX2J1ZmZlcl9lbmQsIF9fZmlyc3QpOworICB9CisgIGVsc2UgaWYgKF9fbGVuMSA8PSBfX2J1ZmZlcl9zaXplKSB7CisgICAgX0JpZGlyZWN0aW9uYWxJdGVyMiBfX2J1ZmZlcl9lbmQgPSBfU1RMUF9TVEQ6OmNvcHkoX19maXJzdCwgX19taWRkbGUsIF9fYnVmZmVyKTsKKyAgICBfU1RMUF9TVEQ6OmNvcHkoX19taWRkbGUsIF9fbGFzdCwgX19maXJzdCk7CisgICAgcmV0dXJuIF9TVExQX1NURDo6Y29weV9iYWNrd2FyZChfX2J1ZmZlciwgX19idWZmZXJfZW5kLCBfX2xhc3QpOworICB9CisgIGVsc2UKKyAgICByZXR1cm4gX1NUTFBfUFJJViBfX3JvdGF0ZShfX2ZpcnN0LCBfX21pZGRsZSwgX19sYXN0KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlciwgY2xhc3MgX0Rpc3RhbmNlLCBjbGFzcyBfUG9pbnRlciwKKyAgICAgICAgICBjbGFzcyBfQ29tcGFyZT4KK3ZvaWQgX19tZXJnZV9hZGFwdGl2ZShfQmlkaXJlY3Rpb25hbEl0ZXIgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIgX19taWRkbGUsCisgICAgICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICBfRGlzdGFuY2UgX19sZW4xLCBfRGlzdGFuY2UgX19sZW4yLAorICAgICAgICAgICAgICAgICAgICAgIF9Qb2ludGVyIF9fYnVmZmVyLCBfRGlzdGFuY2UgX19idWZmZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBfQ29tcGFyZSBfX2NvbXApIHsKKyAgaWYgKF9fbGVuMSA8PSBfX2xlbjIgJiYgX19sZW4xIDw9IF9fYnVmZmVyX3NpemUpIHsKKyAgICBfUG9pbnRlciBfX2J1ZmZlcl9lbmQgPSBfU1RMUF9TVEQ6OmNvcHkoX19maXJzdCwgX19taWRkbGUsIF9fYnVmZmVyKTsKKyAgICBfU1RMUF9TVEQ6Om1lcmdlKF9fYnVmZmVyLCBfX2J1ZmZlcl9lbmQsIF9fbWlkZGxlLCBfX2xhc3QsIF9fZmlyc3QsIF9fY29tcCk7CisgIH0KKyAgZWxzZSBpZiAoX19sZW4yIDw9IF9fYnVmZmVyX3NpemUpIHsKKyAgICBfUG9pbnRlciBfX2J1ZmZlcl9lbmQgPSBfU1RMUF9TVEQ6OmNvcHkoX19taWRkbGUsIF9fbGFzdCwgX19idWZmZXIpOworICAgIF9TVExQX1BSSVYgX19tZXJnZV9iYWNrd2FyZChfX2ZpcnN0LCBfX21pZGRsZSwgX19idWZmZXIsIF9fYnVmZmVyX2VuZCwgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2NvbXApOworICB9CisgIGVsc2UgeworICAgIF9CaWRpcmVjdGlvbmFsSXRlciBfX2ZpcnN0X2N1dCA9IF9fZmlyc3Q7CisgICAgX0JpZGlyZWN0aW9uYWxJdGVyIF9fc2Vjb25kX2N1dCA9IF9fbWlkZGxlOworICAgIF9EaXN0YW5jZSBfX2xlbjExID0gMDsKKyAgICBfRGlzdGFuY2UgX19sZW4yMiA9IDA7CisgICAgaWYgKF9fbGVuMSA+IF9fbGVuMikgeworICAgICAgX19sZW4xMSA9IF9fbGVuMSAvIDI7CisgICAgICBfU1RMUF9TVEQ6OmFkdmFuY2UoX19maXJzdF9jdXQsIF9fbGVuMTEpOworICAgICAgX19zZWNvbmRfY3V0ID0gX1NUTFBfU1REOjpsb3dlcl9ib3VuZChfX21pZGRsZSwgX19sYXN0LCAqX19maXJzdF9jdXQsIF9fY29tcCk7CisgICAgICBfX2xlbjIyICs9IF9TVExQX1NURDo6ZGlzdGFuY2UoX19taWRkbGUsIF9fc2Vjb25kX2N1dCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgX19sZW4yMiA9IF9fbGVuMiAvIDI7CisgICAgICBfU1RMUF9TVEQ6OmFkdmFuY2UoX19zZWNvbmRfY3V0LCBfX2xlbjIyKTsKKyAgICAgIF9fZmlyc3RfY3V0ID0gX1NUTFBfU1REOjp1cHBlcl9ib3VuZChfX2ZpcnN0LCBfX21pZGRsZSwgKl9fc2Vjb25kX2N1dCwgX19jb21wKTsKKyAgICAgIF9fbGVuMTEgKz0gX1NUTFBfU1REOjpkaXN0YW5jZShfX2ZpcnN0LCBfX2ZpcnN0X2N1dCk7CisgICAgfQorICAgIF9CaWRpcmVjdGlvbmFsSXRlciBfX25ld19taWRkbGUgPQorICAgICAgX19yb3RhdGVfYWRhcHRpdmUoX19maXJzdF9jdXQsIF9fbWlkZGxlLCBfX3NlY29uZF9jdXQsIF9fbGVuMSAtIF9fbGVuMTEsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2xlbjIyLCBfX2J1ZmZlciwgX19idWZmZXJfc2l6ZSk7CisgICAgX19tZXJnZV9hZGFwdGl2ZShfX2ZpcnN0LCBfX2ZpcnN0X2N1dCwgX19uZXdfbWlkZGxlLCBfX2xlbjExLAorICAgICAgICAgICAgICAgICAgICAgX19sZW4yMiwgX19idWZmZXIsIF9fYnVmZmVyX3NpemUsIF9fY29tcCk7CisgICAgX19tZXJnZV9hZGFwdGl2ZShfX25ld19taWRkbGUsIF9fc2Vjb25kX2N1dCwgX19sYXN0LCBfX2xlbjEgLSBfX2xlbjExLAorICAgICAgICAgICAgICAgICAgICAgX19sZW4yIC0gX19sZW4yMiwgX19idWZmZXIsIF9fYnVmZmVyX3NpemUsIF9fY29tcCk7CisgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBjbGFzcyBfUG9pbnRlciwgY2xhc3MgX0Rpc3RhbmNlLAorICAgICAgICAgIGNsYXNzIF9Db21wYXJlPgordm9pZCBfX3N0YWJsZV9zb3J0X2FkYXB0aXZlKF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0LCBfUG9pbnRlciBfX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRGlzdGFuY2UgX19idWZmZXJfc2l6ZSwgX0NvbXBhcmUgX19jb21wKSB7CisgIF9EaXN0YW5jZSBfX2xlbiA9IChfX2xhc3QgLSBfX2ZpcnN0ICsgMSkgLyAyOworICBfUmFuZG9tQWNjZXNzSXRlciBfX21pZGRsZSA9IF9fZmlyc3QgKyBfX2xlbjsKKyAgaWYgKF9fbGVuID4gX19idWZmZXJfc2l6ZSkgeworICAgIF9fc3RhYmxlX3NvcnRfYWRhcHRpdmUoX19maXJzdCwgX19taWRkbGUsIF9fYnVmZmVyLCBfX2J1ZmZlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX19jb21wKTsKKyAgICBfX3N0YWJsZV9zb3J0X2FkYXB0aXZlKF9fbWlkZGxlLCBfX2xhc3QsIF9fYnVmZmVyLCBfX2J1ZmZlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX19jb21wKTsKKyAgfQorICBlbHNlIHsKKyAgICBfX21lcmdlX3NvcnRfd2l0aF9idWZmZXIoX19maXJzdCwgX19taWRkbGUsIF9fYnVmZmVyLCAoX0Rpc3RhbmNlKikwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fY29tcCk7CisgICAgX19tZXJnZV9zb3J0X3dpdGhfYnVmZmVyKF9fbWlkZGxlLCBfX2xhc3QsIF9fYnVmZmVyLCAoX0Rpc3RhbmNlKikwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fY29tcCk7CisgIH0KKyAgX19tZXJnZV9hZGFwdGl2ZShfX2ZpcnN0LCBfX21pZGRsZSwgX19sYXN0LCBfRGlzdGFuY2UoX19taWRkbGUgLSBfX2ZpcnN0KSwKKyAgICAgICAgICAgICAgICAgICBfRGlzdGFuY2UoX19sYXN0IC0gX19taWRkbGUpLCBfX2J1ZmZlciwgX19idWZmZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICBfX2NvbXApOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9UcCwgY2xhc3MgX0Rpc3RhbmNlLCBjbGFzcyBfQ29tcGFyZT4KK3ZvaWQgX19zdGFibGVfc29ydF9hdXgoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0LCBfVHAqLCBfRGlzdGFuY2UqLAorICAgICAgICAgICAgICAgICAgICAgICBfQ29tcGFyZSBfX2NvbXApIHsKKyAgX1RlbXBvcmFyeV9idWZmZXI8X1JhbmRvbUFjY2Vzc0l0ZXIsIF9UcD4gYnVmKF9fZmlyc3QsIF9fbGFzdCk7CisgIGlmIChidWYuYmVnaW4oKSA9PSAwKQorICAgIF9faW5wbGFjZV9zdGFibGVfc29ydChfX2ZpcnN0LCBfX2xhc3QsIF9fY29tcCk7CisgIGVsc2UKKyAgICBfX3N0YWJsZV9zb3J0X2FkYXB0aXZlKF9fZmlyc3QsIF9fbGFzdCwgYnVmLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfRGlzdGFuY2UoYnVmLnNpemUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2NvbXApOworfQorCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyPgordm9pZCBzdGFibGVfc29ydChfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QpIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgIF9TVExQX1BSSVYgX19zdGFibGVfc29ydF9hdXgoX19maXJzdCwgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1ZBTFVFX1RZUEUoX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX0RJU1RBTkNFX1RZUEUoX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX19sZXNzKF9TVExQX1ZBTFVFX1RZUEUoX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIpKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX0NvbXBhcmU+Cit2b2lkIHN0YWJsZV9zb3J0KF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsCisgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwgX0NvbXBhcmUgX19jb21wKSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICBfU1RMUF9QUklWIF9fc3RhYmxlX3NvcnRfYXV4KF9fZmlyc3QsIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9ESVNUQU5DRV9UWVBFKF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2NvbXApOworfQorCisvLyBwYXJ0aWFsX3NvcnQsIHBhcnRpYWxfc29ydF9jb3B5LCBhbmQgYXV4aWxpYXJ5IGZ1bmN0aW9ucy4KK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlPgordm9pZCBfX3BhcnRpYWxfc29ydChfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlciBfX21pZGRsZSwKKyAgICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0LCBfVHAqLCBfQ29tcGFyZSBfX2NvbXApIHsKKyAgbWFrZV9oZWFwKF9fZmlyc3QsIF9fbWlkZGxlLCBfX2NvbXApOworICBmb3IgKF9SYW5kb21BY2Nlc3NJdGVyIF9faSA9IF9fbWlkZGxlOyBfX2kgPCBfX2xhc3Q7ICsrX19pKSB7CisgICAgaWYgKF9fY29tcCgqX19pLCAqX19maXJzdCkpIHsKKyAgICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFfX2NvbXAoKl9fZmlyc3QsICpfX2kpLCBfU3RsTXNnX0lOVkFMSURfU1RSSUNUX1dFQUtfUFJFRElDQVRFKQorICAgICAgX19wb3BfaGVhcChfX2ZpcnN0LCBfX21pZGRsZSwgX19pLCBfVHAoKl9faSksIF9fY29tcCwKKyAgICAgICAgICAgICAgICAgX1NUTFBfRElTVEFOQ0VfVFlQRShfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcikpOworICAgIH0KKyAgfQorICBzb3J0X2hlYXAoX19maXJzdCwgX19taWRkbGUsIF9fY29tcCk7Cit9CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXI+Cit2b2lkIHBhcnRpYWxfc29ydChfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LF9SYW5kb21BY2Nlc3NJdGVyIF9fbWlkZGxlLAorICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0KSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX21pZGRsZSkpCisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX21pZGRsZSwgX19sYXN0KSkKKyAgX1NUTFBfUFJJViBfX3BhcnRpYWxfc29ydChfX2ZpcnN0LCBfX21pZGRsZSwgX19sYXN0LCBfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fbGVzcyhfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyKSkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9Db21wYXJlPgordm9pZCBwYXJ0aWFsX3NvcnQoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCxfUmFuZG9tQWNjZXNzSXRlciBfX21pZGRsZSwKKyAgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwgX0NvbXBhcmUgX19jb21wKSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX21pZGRsZSkpCisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX21pZGRsZSwgX19sYXN0KSkKKyAgX1NUTFBfUFJJViBfX3BhcnRpYWxfc29ydChfX2ZpcnN0LCBfX21pZGRsZSwgX19sYXN0LCBfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyKSwgX19jb21wKTsKK30KKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9Db21wYXJlLAorICAgICAgICAgIGNsYXNzIF9EaXN0YW5jZSwgY2xhc3MgX1RwPgorX1JhbmRvbUFjY2Vzc0l0ZXIgX19wYXJ0aWFsX3NvcnRfY29weShfSW5wdXRJdGVyIF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX3Jlc3VsdF9maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19yZXN1bHRfbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NvbXBhcmUgX19jb21wLCBfRGlzdGFuY2UqLCBfVHAqKSB7CisgIGlmIChfX3Jlc3VsdF9maXJzdCA9PSBfX3Jlc3VsdF9sYXN0KSByZXR1cm4gX19yZXN1bHRfbGFzdDsKKyAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19yZXN1bHRfcmVhbF9sYXN0ID0gX19yZXN1bHRfZmlyc3Q7CisgIHdoaWxlKF9fZmlyc3QgIT0gX19sYXN0ICYmIF9fcmVzdWx0X3JlYWxfbGFzdCAhPSBfX3Jlc3VsdF9sYXN0KSB7CisgICAgKl9fcmVzdWx0X3JlYWxfbGFzdCA9ICpfX2ZpcnN0OworICAgICsrX19yZXN1bHRfcmVhbF9sYXN0OworICAgICsrX19maXJzdDsKKyAgfQorICBtYWtlX2hlYXAoX19yZXN1bHRfZmlyc3QsIF9fcmVzdWx0X3JlYWxfbGFzdCwgX19jb21wKTsKKyAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0KSB7CisgICAgaWYgKF9fY29tcCgqX19maXJzdCwgKl9fcmVzdWx0X2ZpcnN0KSkgeworICAgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoIV9fY29tcCgqX19yZXN1bHRfZmlyc3QsICpfX2ZpcnN0KSwgX1N0bE1zZ19JTlZBTElEX1NUUklDVF9XRUFLX1BSRURJQ0FURSkKKyAgICAgIF9fYWRqdXN0X2hlYXAoX19yZXN1bHRfZmlyc3QsIF9EaXN0YW5jZSgwKSwKKyAgICAgICAgICAgICAgICAgICAgX0Rpc3RhbmNlKF9fcmVzdWx0X3JlYWxfbGFzdCAtIF9fcmVzdWx0X2ZpcnN0KSwKKyAgICAgICAgICAgICAgICAgICAgX1RwKCpfX2ZpcnN0KSwKKyAgICAgICAgICAgICAgICAgICAgX19jb21wKTsKKyAgICB9CisgICAgKytfX2ZpcnN0OworICB9CisgIHNvcnRfaGVhcChfX3Jlc3VsdF9maXJzdCwgX19yZXN1bHRfcmVhbF9sYXN0LCBfX2NvbXApOworICByZXR1cm4gX19yZXN1bHRfcmVhbF9sYXN0OworfQorCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyPgorX1JhbmRvbUFjY2Vzc0l0ZXIKK3BhcnRpYWxfc29ydF9jb3B5KF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX3Jlc3VsdF9maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIgX19yZXN1bHRfbGFzdCkgeworICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fcmVzdWx0X2ZpcnN0LCBfX3Jlc3VsdF9sYXN0KSkKKyAgcmV0dXJuIF9TVExQX1BSSVYgX19wYXJ0aWFsX3NvcnRfY29weShfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0X2ZpcnN0LCBfX3Jlc3VsdF9sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX19sZXNzKF9TVExQX1ZBTFVFX1RZUEUoX19maXJzdCwgX0lucHV0SXRlcikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX0RJU1RBTkNFX1RZUEUoX19yZXN1bHRfZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsIF9JbnB1dEl0ZXIpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBjbGFzcyBfQ29tcGFyZT4KK19SYW5kb21BY2Nlc3NJdGVyCitwYXJ0aWFsX3NvcnRfY29weShfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19yZXN1bHRfZmlyc3QsCisgICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX3Jlc3VsdF9sYXN0LCBfQ29tcGFyZSBfX2NvbXApIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX3Jlc3VsdF9maXJzdCwgX19yZXN1bHRfbGFzdCkpCisgIHJldHVybiBfU1RMUF9QUklWIF9fcGFydGlhbF9zb3J0X2NvcHkoX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdF9maXJzdCwgX19yZXN1bHRfbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2NvbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfRElTVEFOQ0VfVFlQRShfX3Jlc3VsdF9maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1ZBTFVFX1RZUEUoX19maXJzdCwgX0lucHV0SXRlcikpOworfQorCisvLyBudGhfZWxlbWVudCgpIGFuZCBpdHMgYXV4aWxpYXJ5IGZ1bmN0aW9ucy4KK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlPgordm9pZCBfX250aF9lbGVtZW50KF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyIF9fbnRoLAorICAgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwgX1RwKiwgX0NvbXBhcmUgX19jb21wKSB7CisgIHdoaWxlIChfX2xhc3QgLSBfX2ZpcnN0ID4gMykgeworICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fY3V0ID0KKyAgICAgIF9fdW5ndWFyZGVkX3BhcnRpdGlvbihfX2ZpcnN0LCBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1RwKF9fbWVkaWFuKCpfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKF9fZmlyc3QgKyAoX19sYXN0IC0gX19maXJzdCkvMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooX19sYXN0IC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fY29tcCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fY29tcCk7CisgICAgaWYgKF9fY3V0IDw9IF9fbnRoKQorICAgICAgX19maXJzdCA9IF9fY3V0OworICAgIGVsc2UKKyAgICAgIF9fbGFzdCA9IF9fY3V0OworICB9CisgIF9faW5zZXJ0aW9uX3NvcnQoX19maXJzdCwgX19sYXN0LCBfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsX1JhbmRvbUFjY2Vzc0l0ZXIpLCBfX2NvbXApOworfQorCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyPgordm9pZCBudGhfZWxlbWVudChfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlciBfX250aCwKKyAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0KSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX250aCkpCisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX250aCwgX19sYXN0KSkKKyAgX1NUTFBfUFJJViBfX250aF9lbGVtZW50KF9fZmlyc3QsIF9fbnRoLCBfX2xhc3QsIF9TVExQX1ZBTFVFX1RZUEUoX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfX2xlc3MoX1NUTFBfVkFMVUVfVFlQRShfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcikpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBjbGFzcyBfQ29tcGFyZT4KK3ZvaWQgbnRoX2VsZW1lbnQoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIgX19udGgsCisgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwgX0NvbXBhcmUgX19jb21wKSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX250aCkpCisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX250aCwgX19sYXN0KSkKKyAgX1NUTFBfUFJJViBfX250aF9lbGVtZW50KF9fZmlyc3QsIF9fbnRoLCBfX2xhc3QsIF9TVExQX1ZBTFVFX1RZUEUoX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIpLCBfX2NvbXApOworfQorCisvLyBCaW5hcnkgc2VhcmNoIChsb3dlcl9ib3VuZCwgdXBwZXJfYm91bmQsIGVxdWFsX3JhbmdlLCBiaW5hcnlfc2VhcmNoKS4KK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1RwLAorICAgICAgICAgIGNsYXNzIF9Db21wYXJlMSwgY2xhc3MgX0NvbXBhcmUyLCBjbGFzcyBfRGlzdGFuY2U+CitfRm9yd2FyZEl0ZXIgX191cHBlcl9ib3VuZChfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwgY29uc3QgX1RwJiBfX3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Db21wYXJlMSBfX2NvbXAxLCBfQ29tcGFyZTIgX19jb21wMiwgX0Rpc3RhbmNlKikgeworICBfRGlzdGFuY2UgX19sZW4gPSBfU1RMUF9TVEQ6OmRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7CisgIF9EaXN0YW5jZSBfX2hhbGY7CisKKyAgd2hpbGUgKF9fbGVuID4gMCkgeworICAgIF9faGFsZiA9IF9fbGVuID4+IDE7CisgICAgX0ZvcndhcmRJdGVyIF9fbWlkZGxlID0gX19maXJzdDsKKyAgICBfU1RMUF9TVEQ6OmFkdmFuY2UoX19taWRkbGUsIF9faGFsZik7CisgICAgaWYgKF9fY29tcDIoX192YWwsICpfX21pZGRsZSkpIHsKKyAgICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFfX2NvbXAxKCpfX21pZGRsZSwgX192YWwpLCBfU3RsTXNnX0lOVkFMSURfU1RSSUNUX1dFQUtfUFJFRElDQVRFKQorICAgICAgX19sZW4gPSBfX2hhbGY7CisgICAgfQorICAgIGVsc2UgeworICAgICAgX19maXJzdCA9IF9fbWlkZGxlOworICAgICAgKytfX2ZpcnN0OworICAgICAgX19sZW4gPSBfX2xlbiAtIF9faGFsZiAtIDE7CisgICAgfQorICB9CisgIHJldHVybiBfX2ZpcnN0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfVHAsCisgICAgICAgICAgY2xhc3MgX0NvbXBhcmUxLCBjbGFzcyBfQ29tcGFyZTIsIGNsYXNzIF9EaXN0YW5jZT4KK3BhaXI8X0ZvcndhcmRJdGVyLCBfRm9yd2FyZEl0ZXI+CitfX2VxdWFsX3JhbmdlKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LCBjb25zdCBfVHAmIF9fdmFsLAorICAgICAgICAgICAgICBfQ29tcGFyZTEgX19jb21wMSwgX0NvbXBhcmUyIF9fY29tcDIsIF9EaXN0YW5jZSogX19kaXN0KSB7CisgIF9EaXN0YW5jZSBfX2xlbiA9IF9TVExQX1NURDo6ZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KTsKKyAgX0Rpc3RhbmNlIF9faGFsZjsKKworICB3aGlsZSAoX19sZW4gPiAwKSB7CisgICAgX19oYWxmID0gX19sZW4gPj4gMTsKKyAgICBfRm9yd2FyZEl0ZXIgX19taWRkbGUgPSBfX2ZpcnN0OworICAgIF9TVExQX1NURDo6YWR2YW5jZShfX21pZGRsZSwgX19oYWxmKTsKKyAgICBpZiAoX19jb21wMSgqX19taWRkbGUsIF9fdmFsKSkgeworICAgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoIV9fY29tcDIoX192YWwsICpfX21pZGRsZSksIF9TdGxNc2dfSU5WQUxJRF9TVFJJQ1RfV0VBS19QUkVESUNBVEUpCisgICAgICBfX2ZpcnN0ID0gX19taWRkbGU7CisgICAgICArK19fZmlyc3Q7CisgICAgICBfX2xlbiA9IF9fbGVuIC0gX19oYWxmIC0gMTsKKyAgICB9CisgICAgZWxzZSBpZiAoX19jb21wMihfX3ZhbCwgKl9fbWlkZGxlKSkgeworICAgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoIV9fY29tcDEoKl9fbWlkZGxlLCBfX3ZhbCksIF9TdGxNc2dfSU5WQUxJRF9TVFJJQ1RfV0VBS19QUkVESUNBVEUpCisgICAgICBfX2xlbiA9IF9faGFsZjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBfRm9yd2FyZEl0ZXIgX19sZWZ0ID0gX1NUTFBfUFJJViBfX2xvd2VyX2JvdW5kKF9fZmlyc3QsIF9fbWlkZGxlLCBfX3ZhbCwgX19jb21wMSwgX19jb21wMiwgX19kaXN0KTsKKyAgICAgIC8vU21hbGwgb3B0aW06IElmIGxvd2VyX2JvdW5kIGhhdmVuJ3QgZm91bmQgYW4gZXF1aXZhbGVudCB2YWx1ZQorICAgICAgLy90aGVyZSBpcyBubyBuZWVkIHRvIGNhbGwgdXBwZXJfYm91bmQuCisgICAgICBpZiAoX19jb21wMSgqX19sZWZ0LCBfX3ZhbCkpIHsKKyAgICAgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoIV9fY29tcDIoX192YWwsICpfX2xlZnQpLCBfU3RsTXNnX0lOVkFMSURfU1RSSUNUX1dFQUtfUFJFRElDQVRFKQorICAgICAgICByZXR1cm4gcGFpcjxfRm9yd2FyZEl0ZXIsIF9Gb3J3YXJkSXRlcj4oX19sZWZ0LCBfX2xlZnQpOworICAgICAgfQorICAgICAgX1NUTFBfU1REOjphZHZhbmNlKF9fZmlyc3QsIF9fbGVuKTsKKyAgICAgIF9Gb3J3YXJkSXRlciBfX3JpZ2h0ID0gX1NUTFBfUFJJViBfX3VwcGVyX2JvdW5kKCsrX19taWRkbGUsIF9fZmlyc3QsIF9fdmFsLCBfX2NvbXAxLCBfX2NvbXAyLCBfX2Rpc3QpOworICAgICAgcmV0dXJuIHBhaXI8X0ZvcndhcmRJdGVyLCBfRm9yd2FyZEl0ZXI+KF9fbGVmdCwgX19yaWdodCk7CisgICAgfQorICB9CisgIHJldHVybiBwYWlyPF9Gb3J3YXJkSXRlciwgX0ZvcndhcmRJdGVyPihfX2ZpcnN0LCBfX2ZpcnN0KTsKK30KKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0SXRlcjIsIGNsYXNzIF9PdXRwdXRJdGVyPgorX091dHB1dEl0ZXIgbWVyZ2UoX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIxIF9fbGFzdDEsCisgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyMiBfX2ZpcnN0MiwgX0lucHV0SXRlcjIgX19sYXN0MiwKKyAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0KSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0MSwgX19sYXN0MSkpCisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0MiwgX19sYXN0MikpCisgIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDIpIHsKKyAgICBpZiAoKl9fZmlyc3QyIDwgKl9fZmlyc3QxKSB7CisgICAgICAqX19yZXN1bHQgPSAqX19maXJzdDI7CisgICAgICArK19fZmlyc3QyOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0MTsKKyAgICAgICsrX19maXJzdDE7CisgICAgfQorICAgICsrX19yZXN1bHQ7CisgIH0KKyAgcmV0dXJuIF9TVExQX1NURDo6Y29weShfX2ZpcnN0MiwgX19sYXN0MiwgX1NUTFBfU1REOjpjb3B5KF9fZmlyc3QxLCBfX2xhc3QxLCBfX3Jlc3VsdCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNsYXNzIF9JbnB1dEl0ZXIyLCBjbGFzcyBfT3V0cHV0SXRlciwKKyAgICAgICAgICBjbGFzcyBfQ29tcGFyZT4KK19PdXRwdXRJdGVyIG1lcmdlKF9JbnB1dEl0ZXIxIF9fZmlyc3QxLCBfSW5wdXRJdGVyMSBfX2xhc3QxLAorICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIsIF9JbnB1dEl0ZXIyIF9fbGFzdDIsCisgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlciBfX3Jlc3VsdCwgX0NvbXBhcmUgX19jb21wKSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0MSwgX19sYXN0MSkpCisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0MiwgX19sYXN0MikpCisgIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDIpIHsKKyAgICBpZiAoX19jb21wKCpfX2ZpcnN0MiwgKl9fZmlyc3QxKSkgeworICAgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoIV9fY29tcCgqX19maXJzdDEsICpfX2ZpcnN0MiksIF9TdGxNc2dfSU5WQUxJRF9TVFJJQ1RfV0VBS19QUkVESUNBVEUpCisgICAgICAqX19yZXN1bHQgPSAqX19maXJzdDI7CisgICAgICArK19fZmlyc3QyOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0MTsKKyAgICAgICsrX19maXJzdDE7CisgICAgfQorICAgICsrX19yZXN1bHQ7CisgIH0KKyAgcmV0dXJuIF9TVExQX1NURDo6Y29weShfX2ZpcnN0MiwgX19sYXN0MiwgX1NUTFBfU1REOjpjb3B5KF9fZmlyc3QxLCBfX2xhc3QxLCBfX3Jlc3VsdCkpOworfQorCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXIsIGNsYXNzIF9EaXN0YW5jZSwgY2xhc3MgX0NvbXBhcmU+Cit2b2lkIF9fbWVyZ2Vfd2l0aG91dF9idWZmZXIoX0JpZGlyZWN0aW9uYWxJdGVyIF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyIF9fbWlkZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0Rpc3RhbmNlIF9fbGVuMSwgX0Rpc3RhbmNlIF9fbGVuMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ29tcGFyZSBfX2NvbXApIHsKKyAgaWYgKF9fbGVuMSA9PSAwIHx8IF9fbGVuMiA9PSAwKQorICAgIHJldHVybjsKKyAgaWYgKF9fbGVuMSArIF9fbGVuMiA9PSAyKSB7CisgICAgaWYgKF9fY29tcCgqX19taWRkbGUsICpfX2ZpcnN0KSkgeworICAgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoIV9fY29tcCgqX19maXJzdCwgKl9fbWlkZGxlKSwgX1N0bE1zZ19JTlZBTElEX1NUUklDVF9XRUFLX1BSRURJQ0FURSkKKyAgICAgIGl0ZXJfc3dhcChfX2ZpcnN0LCBfX21pZGRsZSk7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorICBfQmlkaXJlY3Rpb25hbEl0ZXIgX19maXJzdF9jdXQgPSBfX2ZpcnN0OworICBfQmlkaXJlY3Rpb25hbEl0ZXIgX19zZWNvbmRfY3V0ID0gX19taWRkbGU7CisgIF9EaXN0YW5jZSBfX2xlbjExID0gMDsKKyAgX0Rpc3RhbmNlIF9fbGVuMjIgPSAwOworICBpZiAoX19sZW4xID4gX19sZW4yKSB7CisgICAgX19sZW4xMSA9IF9fbGVuMSAvIDI7CisgICAgX1NUTFBfU1REOjphZHZhbmNlKF9fZmlyc3RfY3V0LCBfX2xlbjExKTsKKyAgICBfX3NlY29uZF9jdXQgPSBfU1RMUF9TVEQ6Omxvd2VyX2JvdW5kKF9fbWlkZGxlLCBfX2xhc3QsICpfX2ZpcnN0X2N1dCwgX19jb21wKTsKKyAgICBfX2xlbjIyICs9IF9TVExQX1NURDo6ZGlzdGFuY2UoX19taWRkbGUsIF9fc2Vjb25kX2N1dCk7CisgIH0KKyAgZWxzZSB7CisgICAgX19sZW4yMiA9IF9fbGVuMiAvIDI7CisgICAgX1NUTFBfU1REOjphZHZhbmNlKF9fc2Vjb25kX2N1dCwgX19sZW4yMik7CisgICAgX19maXJzdF9jdXQgPSBfU1RMUF9TVEQ6OnVwcGVyX2JvdW5kKF9fZmlyc3QsIF9fbWlkZGxlLCAqX19zZWNvbmRfY3V0LCBfX2NvbXApOworICAgIF9fbGVuMTEgKz0gX1NUTFBfU1REOjpkaXN0YW5jZShfX2ZpcnN0LCBfX2ZpcnN0X2N1dCk7CisgIH0KKyAgX0JpZGlyZWN0aW9uYWxJdGVyIF9fbmV3X21pZGRsZQorICAgID0gX1NUTFBfUFJJViBfX3JvdGF0ZShfX2ZpcnN0X2N1dCwgX19taWRkbGUsIF9fc2Vjb25kX2N1dCk7CisgIF9fbWVyZ2Vfd2l0aG91dF9idWZmZXIoX19maXJzdCwgX19maXJzdF9jdXQsIF9fbmV3X21pZGRsZSwgX19sZW4xMSwgX19sZW4yMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX2NvbXApOworICBfX21lcmdlX3dpdGhvdXRfYnVmZmVyKF9fbmV3X21pZGRsZSwgX19zZWNvbmRfY3V0LCBfX2xhc3QsIF9fbGVuMSAtIF9fbGVuMTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgX19sZW4yIC0gX19sZW4yMiwgX19jb21wKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcjEsIGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcjIsCisgICAgICAgICAgY2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyMywgY2xhc3MgX0NvbXBhcmU+CitfQmlkaXJlY3Rpb25hbEl0ZXIzIF9fbWVyZ2VfYmFja3dhcmQoX0JpZGlyZWN0aW9uYWxJdGVyMSBfX2ZpcnN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIxIF9fbGFzdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyMiBfX2ZpcnN0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIyIF9fbGFzdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyMyBfX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ29tcGFyZSBfX2NvbXApIHsKKyAgaWYgKF9fZmlyc3QxID09IF9fbGFzdDEpCisgICAgcmV0dXJuIGNvcHlfYmFja3dhcmQoX19maXJzdDIsIF9fbGFzdDIsIF9fcmVzdWx0KTsKKyAgaWYgKF9fZmlyc3QyID09IF9fbGFzdDIpCisgICAgcmV0dXJuIGNvcHlfYmFja3dhcmQoX19maXJzdDEsIF9fbGFzdDEsIF9fcmVzdWx0KTsKKyAgLS1fX2xhc3QxOworICAtLV9fbGFzdDI7CisgIGZvciAoOzspIHsKKyAgICBpZiAoX19jb21wKCpfX2xhc3QyLCAqX19sYXN0MSkpIHsKKyAgICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFfX2NvbXAoKl9fbGFzdDEsICpfX2xhc3QyKSwgX1N0bE1zZ19JTlZBTElEX1NUUklDVF9XRUFLX1BSRURJQ0FURSkKKyAgICAgICotLV9fcmVzdWx0ID0gKl9fbGFzdDE7CisgICAgICBpZiAoX19maXJzdDEgPT0gX19sYXN0MSkKKyAgICAgICAgcmV0dXJuIGNvcHlfYmFja3dhcmQoX19maXJzdDIsICsrX19sYXN0MiwgX19yZXN1bHQpOworICAgICAgLS1fX2xhc3QxOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICotLV9fcmVzdWx0ID0gKl9fbGFzdDI7CisgICAgICBpZiAoX19maXJzdDIgPT0gX19sYXN0MikKKyAgICAgICAgcmV0dXJuIGNvcHlfYmFja3dhcmQoX19maXJzdDEsICsrX19sYXN0MSwgX19yZXN1bHQpOworICAgICAgLS1fX2xhc3QyOworICAgIH0KKyAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyLCBjbGFzcyBfVHAsCisgICAgICAgICAgY2xhc3MgX0Rpc3RhbmNlLCBjbGFzcyBfQ29tcGFyZT4KK2lubGluZSB2b2lkIF9faW5wbGFjZV9tZXJnZV9hdXgoX0JpZGlyZWN0aW9uYWxJdGVyIF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlciBfX21pZGRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyIF9fbGFzdCwgX1RwKiwgX0Rpc3RhbmNlKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NvbXBhcmUgX19jb21wKSB7CisgIF9EaXN0YW5jZSBfX2xlbjEgPSBfU1RMUF9TVEQ6OmRpc3RhbmNlKF9fZmlyc3QsIF9fbWlkZGxlKTsKKyAgX0Rpc3RhbmNlIF9fbGVuMiA9IF9TVExQX1NURDo6ZGlzdGFuY2UoX19taWRkbGUsIF9fbGFzdCk7CisKKyAgX1RlbXBvcmFyeV9idWZmZXI8X0JpZGlyZWN0aW9uYWxJdGVyLCBfVHA+IF9fYnVmKF9fZmlyc3QsIF9fbGFzdCk7CisgIGlmIChfX2J1Zi5iZWdpbigpID09IDApCisgICAgX19tZXJnZV93aXRob3V0X2J1ZmZlcihfX2ZpcnN0LCBfX21pZGRsZSwgX19sYXN0LCBfX2xlbjEsIF9fbGVuMiwgX19jb21wKTsKKyAgZWxzZQorICAgIF9fbWVyZ2VfYWRhcHRpdmUoX19maXJzdCwgX19taWRkbGUsIF9fbGFzdCwgX19sZW4xLCBfX2xlbjIsCisgICAgICAgICAgICAgICAgICAgICBfX2J1Zi5iZWdpbigpLCBfRGlzdGFuY2UoX19idWYuc2l6ZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgIF9fY29tcCk7Cit9CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyPgordm9pZCBpbnBsYWNlX21lcmdlKF9CaWRpcmVjdGlvbmFsSXRlciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlciBfX21pZGRsZSwKKyAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIgX19sYXN0KSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX21pZGRsZSkpCisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX21pZGRsZSwgX19sYXN0KSkKKyAgaWYgKF9fZmlyc3QgPT0gX19taWRkbGUgfHwgX19taWRkbGUgPT0gX19sYXN0KQorICAgIHJldHVybjsKKyAgX1NUTFBfUFJJViBfX2lucGxhY2VfbWVyZ2VfYXV4KF9fZmlyc3QsIF9fbWlkZGxlLCBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsIF9CaWRpcmVjdGlvbmFsSXRlciksIF9TVExQX0RJU1RBTkNFX1RZUEUoX19maXJzdCwgX0JpZGlyZWN0aW9uYWxJdGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX19sZXNzKF9TVExQX1ZBTFVFX1RZUEUoX19maXJzdCwgX0JpZGlyZWN0aW9uYWxJdGVyKSkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyLCBjbGFzcyBfQ29tcGFyZT4KK3ZvaWQgaW5wbGFjZV9tZXJnZShfQmlkaXJlY3Rpb25hbEl0ZXIgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIgX19taWRkbGUsCisgICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyIF9fbGFzdCwgX0NvbXBhcmUgX19jb21wKSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX21pZGRsZSkpCisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX21pZGRsZSwgX19sYXN0KSkKKyAgaWYgKF9fZmlyc3QgPT0gX19taWRkbGUgfHwgX19taWRkbGUgPT0gX19sYXN0KQorICAgIHJldHVybjsKKyAgX1NUTFBfUFJJViBfX2lucGxhY2VfbWVyZ2VfYXV4KF9fZmlyc3QsIF9fbWlkZGxlLCBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsIF9CaWRpcmVjdGlvbmFsSXRlciksIF9TVExQX0RJU1RBTkNFX1RZUEUoX19maXJzdCwgX0JpZGlyZWN0aW9uYWxJdGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fY29tcCk7Cit9CisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMiwgY2xhc3MgX0NvbXBhcmU+Citib29sIF9faW5jbHVkZXMoX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIxIF9fbGFzdDEsCisgICAgICAgICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIsIF9JbnB1dEl0ZXIyIF9fbGFzdDIsIF9Db21wYXJlIF9fY29tcCkgeworICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdDEsIF9fbGFzdDEpKQorICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdDIsIF9fbGFzdDIpKQorICB3aGlsZSAoX19maXJzdDEgIT0gX19sYXN0MSAmJiBfX2ZpcnN0MiAhPSBfX2xhc3QyKQorICAgIGlmIChfX2NvbXAoKl9fZmlyc3QyLCAqX19maXJzdDEpKSB7CisgICAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghX19jb21wKCpfX2ZpcnN0MSwgKl9fZmlyc3QyKSwgX1N0bE1zZ19JTlZBTElEX1NUUklDVF9XRUFLX1BSRURJQ0FURSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZWxzZSBpZiAoX19jb21wKCpfX2ZpcnN0MSwgKl9fZmlyc3QyKSkKKyAgICAgICsrX19maXJzdDE7CisgICAgZWxzZQorICAgICAgKytfX2ZpcnN0MSwgKytfX2ZpcnN0MjsKKworICByZXR1cm4gX19maXJzdDIgPT0gX19sYXN0MjsKK30KKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0SXRlcjIsIGNsYXNzIF9Db21wYXJlPgorYm9vbCBpbmNsdWRlcyhfSW5wdXRJdGVyMSBfX2ZpcnN0MSwgX0lucHV0SXRlcjEgX19sYXN0MSwKKyAgICAgICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIsIF9JbnB1dEl0ZXIyIF9fbGFzdDIsIF9Db21wYXJlIF9fY29tcCkgeworICByZXR1cm4gX1NUTFBfUFJJViBfX2luY2x1ZGVzKF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0MiwgX19sYXN0MiwgX19jb21wKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMj4KK2Jvb2wgaW5jbHVkZXMoX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIxIF9fbGFzdDEsCisgICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyLCBfSW5wdXRJdGVyMiBfX2xhc3QyKSB7CisgIHJldHVybiBfU1RMUF9QUklWIF9faW5jbHVkZXMoX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLCBfX2xhc3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX19sZXNzKF9TVExQX1ZBTFVFX1RZUEUoX19maXJzdDEsIF9JbnB1dEl0ZXIxKSkpOworfQorCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0SXRlcjIsIGNsYXNzIF9PdXRwdXRJdGVyLAorICAgICAgICAgIGNsYXNzIF9Db21wYXJlPgorX091dHB1dEl0ZXIgX19zZXRfdW5pb24oX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIxIF9fbGFzdDEsCisgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyMiBfX2ZpcnN0MiwgX0lucHV0SXRlcjIgX19sYXN0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0LCBfQ29tcGFyZSBfX2NvbXApIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QxLCBfX2xhc3QxKSkKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QyLCBfX2xhc3QyKSkKKyAgd2hpbGUgKF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0MikgeworICAgIGlmIChfX2NvbXAoKl9fZmlyc3QxLCAqX19maXJzdDIpKSB7CisgICAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghX19jb21wKCpfX2ZpcnN0MiwgKl9fZmlyc3QxKSwgX1N0bE1zZ19JTlZBTElEX1NUUklDVF9XRUFLX1BSRURJQ0FURSkKKyAgICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0MTsKKyAgICAgICsrX19maXJzdDE7CisgICAgfQorICAgIGVsc2UgaWYgKF9fY29tcCgqX19maXJzdDIsICpfX2ZpcnN0MSkpIHsKKyAgICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFfX2NvbXAoKl9fZmlyc3QxLCAqX19maXJzdDIpLCBfU3RsTXNnX0lOVkFMSURfU1RSSUNUX1dFQUtfUFJFRElDQVRFKQorICAgICAgKl9fcmVzdWx0ID0gKl9fZmlyc3QyOworICAgICAgKytfX2ZpcnN0MjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAqX19yZXN1bHQgPSAqX19maXJzdDE7CisgICAgICArK19fZmlyc3QxOworICAgICAgKytfX2ZpcnN0MjsKKyAgICB9CisgICAgKytfX3Jlc3VsdDsKKyAgfQorICByZXR1cm4gX1NUTFBfU1REOjpjb3B5KF9fZmlyc3QyLCBfX2xhc3QyLCBfU1RMUF9TVEQ6OmNvcHkoX19maXJzdDEsIF9fbGFzdDEsIF9fcmVzdWx0KSk7Cit9CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNsYXNzIF9JbnB1dEl0ZXIyLCBjbGFzcyBfT3V0cHV0SXRlcj4KK19PdXRwdXRJdGVyIHNldF91bmlvbihfSW5wdXRJdGVyMSBfX2ZpcnN0MSwgX0lucHV0SXRlcjEgX19sYXN0MSwKKyAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyMiBfX2ZpcnN0MiwgX0lucHV0SXRlcjIgX19sYXN0MiwKKyAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlciBfX3Jlc3VsdCkgeworICByZXR1cm4gX1NUTFBfUFJJViBfX3NldF91bmlvbihfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIsIF9fbGFzdDIsIF9fcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fbGVzcyhfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QxLCBfSW5wdXRJdGVyMSkpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMiwgY2xhc3MgX091dHB1dEl0ZXIsCisgICAgICAgICAgY2xhc3MgX0NvbXBhcmU+CitfT3V0cHV0SXRlciBzZXRfdW5pb24oX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIxIF9fbGFzdDEsCisgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIsIF9JbnB1dEl0ZXIyIF9fbGFzdDIsCisgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXIgX19yZXN1bHQsIF9Db21wYXJlIF9fY29tcCkgeworICByZXR1cm4gX1NUTFBfUFJJViBfX3NldF91bmlvbihfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIsIF9fbGFzdDIsIF9fcmVzdWx0LCBfX2NvbXApOworfQorCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0SXRlcjIsIGNsYXNzIF9PdXRwdXRJdGVyLAorICAgICAgICAgIGNsYXNzIF9Db21wYXJlPgorX091dHB1dEl0ZXIgX19zZXRfaW50ZXJzZWN0aW9uKF9JbnB1dEl0ZXIxIF9fZmlyc3QxLCBfSW5wdXRJdGVyMSBfX2xhc3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyLCBfSW5wdXRJdGVyMiBfX2xhc3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0LCBfQ29tcGFyZSBfX2NvbXApIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QxLCBfX2xhc3QxKSkKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QyLCBfX2xhc3QyKSkKKyAgd2hpbGUgKF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0MikKKyAgICBpZiAoX19jb21wKCpfX2ZpcnN0MSwgKl9fZmlyc3QyKSkgeworICAgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoIV9fY29tcCgqX19maXJzdDIsICpfX2ZpcnN0MSksIF9TdGxNc2dfSU5WQUxJRF9TVFJJQ1RfV0VBS19QUkVESUNBVEUpCisgICAgICArK19fZmlyc3QxOworICAgIH0KKyAgICBlbHNlIGlmIChfX2NvbXAoKl9fZmlyc3QyLCAqX19maXJzdDEpKQorICAgICAgKytfX2ZpcnN0MjsKKyAgICBlbHNlIHsKKyAgICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0MTsKKyAgICAgICsrX19maXJzdDE7CisgICAgICArK19fZmlyc3QyOworICAgICAgKytfX3Jlc3VsdDsKKyAgICB9CisgIHJldHVybiBfX3Jlc3VsdDsKK30KKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0SXRlcjIsIGNsYXNzIF9PdXRwdXRJdGVyPgorX091dHB1dEl0ZXIgc2V0X2ludGVyc2VjdGlvbihfSW5wdXRJdGVyMSBfX2ZpcnN0MSwgX0lucHV0SXRlcjEgX19sYXN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIsIF9JbnB1dEl0ZXIyIF9fbGFzdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0KSB7CisgIHJldHVybiBfU1RMUF9QUklWIF9fc2V0X2ludGVyc2VjdGlvbihfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIsIF9fbGFzdDIsIF9fcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfX2xlc3MoX1NUTFBfVkFMVUVfVFlQRShfX2ZpcnN0MSwgX0lucHV0SXRlcjEpKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0SXRlcjIsIGNsYXNzIF9PdXRwdXRJdGVyLAorICAgICAgICAgIGNsYXNzIF9Db21wYXJlPgorX091dHB1dEl0ZXIgc2V0X2ludGVyc2VjdGlvbihfSW5wdXRJdGVyMSBfX2ZpcnN0MSwgX0lucHV0SXRlcjEgX19sYXN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIsIF9JbnB1dEl0ZXIyIF9fbGFzdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0LCBfQ29tcGFyZSBfX2NvbXApIHsKKyAgcmV0dXJuIF9TVExQX1BSSVYgX19zZXRfaW50ZXJzZWN0aW9uKF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0MiwgX19sYXN0MiwgX19yZXN1bHQsIF9fY29tcCk7Cit9CisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMiwgY2xhc3MgX091dHB1dEl0ZXIsCisgICAgICAgICAgY2xhc3MgX0NvbXBhcmU+CitfT3V0cHV0SXRlciBfX3NldF9kaWZmZXJlbmNlKF9JbnB1dEl0ZXIxIF9fZmlyc3QxLCBfSW5wdXRJdGVyMSBfX2xhc3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyMiBfX2ZpcnN0MiwgX0lucHV0SXRlcjIgX19sYXN0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXIgX19yZXN1bHQsIF9Db21wYXJlIF9fY29tcCkgeworICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdDEsIF9fbGFzdDEpKQorICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdDIsIF9fbGFzdDIpKQorICB3aGlsZSAoX19maXJzdDEgIT0gX19sYXN0MSAmJiBfX2ZpcnN0MiAhPSBfX2xhc3QyKQorICAgIGlmIChfX2NvbXAoKl9fZmlyc3QxLCAqX19maXJzdDIpKSB7CisgICAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghX19jb21wKCpfX2ZpcnN0MiwgKl9fZmlyc3QxKSwgX1N0bE1zZ19JTlZBTElEX1NUUklDVF9XRUFLX1BSRURJQ0FURSkKKyAgICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0MTsKKyAgICAgICsrX19maXJzdDE7CisgICAgICArK19fcmVzdWx0OworICAgIH0KKyAgICBlbHNlIGlmIChfX2NvbXAoKl9fZmlyc3QyLCAqX19maXJzdDEpKQorICAgICAgKytfX2ZpcnN0MjsKKyAgICBlbHNlIHsKKyAgICAgICsrX19maXJzdDE7CisgICAgICArK19fZmlyc3QyOworICAgIH0KKyAgcmV0dXJuIF9TVExQX1NURDo6Y29weShfX2ZpcnN0MSwgX19sYXN0MSwgX19yZXN1bHQpOworfQorCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMiwgY2xhc3MgX091dHB1dEl0ZXI+CitfT3V0cHV0SXRlciBzZXRfZGlmZmVyZW5jZShfSW5wdXRJdGVyMSBfX2ZpcnN0MSwgX0lucHV0SXRlcjEgX19sYXN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyLCBfSW5wdXRJdGVyMiBfX2xhc3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXIgX19yZXN1bHQpIHsKKyAgcmV0dXJuIF9TVExQX1BSSVYgX19zZXRfZGlmZmVyZW5jZShfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIsIF9fbGFzdDIsIF9fcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX19sZXNzKF9TVExQX1ZBTFVFX1RZUEUoX19maXJzdDEsIF9JbnB1dEl0ZXIxKSkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNsYXNzIF9JbnB1dEl0ZXIyLCBjbGFzcyBfT3V0cHV0SXRlciwKKyAgICAgICAgICBjbGFzcyBfQ29tcGFyZT4KK19PdXRwdXRJdGVyIHNldF9kaWZmZXJlbmNlKF9JbnB1dEl0ZXIxIF9fZmlyc3QxLCBfSW5wdXRJdGVyMSBfX2xhc3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIsIF9JbnB1dEl0ZXIyIF9fbGFzdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlciBfX3Jlc3VsdCwgX0NvbXBhcmUgX19jb21wKSB7CisgIHJldHVybiBfU1RMUF9QUklWIF9fc2V0X2RpZmZlcmVuY2UoX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLCBfX2xhc3QyLCBfX3Jlc3VsdCwgX19jb21wKTsKK30KKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNsYXNzIF9JbnB1dEl0ZXIyLCBjbGFzcyBfT3V0cHV0SXRlciwgY2xhc3MgX0NvbXBhcmU+CitfT3V0cHV0SXRlcgorX19zZXRfc3ltbWV0cmljX2RpZmZlcmVuY2UoX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIxIF9fbGFzdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyMiBfX2ZpcnN0MiwgX0lucHV0SXRlcjIgX19sYXN0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0LCBfQ29tcGFyZSBfX2NvbXApIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QxLCBfX2xhc3QxKSkKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QyLCBfX2xhc3QyKSkKKyAgd2hpbGUgKF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0MikgeworICAgIGlmIChfX2NvbXAoKl9fZmlyc3QxLCAqX19maXJzdDIpKSB7CisgICAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghX19jb21wKCpfX2ZpcnN0MiwgKl9fZmlyc3QxKSwgX1N0bE1zZ19JTlZBTElEX1NUUklDVF9XRUFLX1BSRURJQ0FURSkKKyAgICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0MTsKKyAgICAgICsrX19maXJzdDE7CisgICAgICArK19fcmVzdWx0OworICAgIH0KKyAgICBlbHNlIGlmIChfX2NvbXAoKl9fZmlyc3QyLCAqX19maXJzdDEpKSB7CisgICAgICAqX19yZXN1bHQgPSAqX19maXJzdDI7CisgICAgICArK19fZmlyc3QyOworICAgICAgKytfX3Jlc3VsdDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICArK19fZmlyc3QxOworICAgICAgKytfX2ZpcnN0MjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIF9TVExQX1NURDo6Y29weShfX2ZpcnN0MiwgX19sYXN0MiwgX1NUTFBfU1REOjpjb3B5KF9fZmlyc3QxLCBfX2xhc3QxLCBfX3Jlc3VsdCkpOworfQorCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMiwgY2xhc3MgX091dHB1dEl0ZXI+CitfT3V0cHV0SXRlcgorc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlKF9JbnB1dEl0ZXIxIF9fZmlyc3QxLCBfSW5wdXRJdGVyMSBfX2xhc3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyLCBfSW5wdXRJdGVyMiBfX2xhc3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0KSB7CisgIHJldHVybiBfU1RMUF9QUklWIF9fc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlKF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0MiwgX19sYXN0MiwgX19yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX19sZXNzKF9TVExQX1ZBTFVFX1RZUEUoX19maXJzdDEsIF9JbnB1dEl0ZXIxKSkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNsYXNzIF9JbnB1dEl0ZXIyLCBjbGFzcyBfT3V0cHV0SXRlciwgY2xhc3MgX0NvbXBhcmU+CitfT3V0cHV0SXRlcgorc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlKF9JbnB1dEl0ZXIxIF9fZmlyc3QxLCBfSW5wdXRJdGVyMSBfX2xhc3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyLCBfSW5wdXRJdGVyMiBfX2xhc3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgIF9Db21wYXJlIF9fY29tcCkgeworICByZXR1cm4gX1NUTFBfUFJJViBfX3NldF9zeW1tZXRyaWNfZGlmZmVyZW5jZShfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIsIF9fbGFzdDIsIF9fcmVzdWx0LCBfX2NvbXApOworfQorCisvLyBtaW5fZWxlbWVudCBhbmQgbWF4X2VsZW1lbnQsIHdpdGggYW5kIHdpdGhvdXQgYW4gZXhwbGljaXRseSBzdXBwbGllZAorLy8gY29tcGFyaXNvbiBmdW5jdGlvbi4KKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcj4KK19Gb3J3YXJkSXRlciBtYXhfZWxlbWVudChfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCkgeworICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKKyAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KSByZXR1cm4gX19maXJzdDsKKyAgX0ZvcndhcmRJdGVyIF9fcmVzdWx0ID0gX19maXJzdDsKKyAgd2hpbGUgKCsrX19maXJzdCAhPSBfX2xhc3QpCisgICAgaWYgKCpfX3Jlc3VsdCA8ICpfX2ZpcnN0KSB7CisgICAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghKCpfX2ZpcnN0IDwgKl9fcmVzdWx0KSwgX1N0bE1zZ19JTlZBTElEX1NUUklDVF9XRUFLX1BSRURJQ0FURSkKKyAgICAgIF9fcmVzdWx0ID0gX19maXJzdDsKKyAgICB9CisgIHJldHVybiBfX3Jlc3VsdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX0NvbXBhcmU+CitfRm9yd2FyZEl0ZXIgbWF4X2VsZW1lbnQoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgX0NvbXBhcmUgX19jb21wKSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICBpZiAoX19maXJzdCA9PSBfX2xhc3QpIHJldHVybiBfX2ZpcnN0OworICBfRm9yd2FyZEl0ZXIgX19yZXN1bHQgPSBfX2ZpcnN0OworICB3aGlsZSAoKytfX2ZpcnN0ICE9IF9fbGFzdCkgeworICAgIGlmIChfX2NvbXAoKl9fcmVzdWx0LCAqX19maXJzdCkpIHsKKyAgICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFfX2NvbXAoKl9fZmlyc3QsICpfX3Jlc3VsdCksIF9TdGxNc2dfSU5WQUxJRF9TVFJJQ1RfV0VBS19QUkVESUNBVEUpCisgICAgICBfX3Jlc3VsdCA9IF9fZmlyc3Q7CisgICAgfQorICB9CisgIHJldHVybiBfX3Jlc3VsdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcj4KK19Gb3J3YXJkSXRlciBtaW5fZWxlbWVudChfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCkgeworICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKKyAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KSByZXR1cm4gX19maXJzdDsKKyAgX0ZvcndhcmRJdGVyIF9fcmVzdWx0ID0gX19maXJzdDsKKyAgd2hpbGUgKCsrX19maXJzdCAhPSBfX2xhc3QpCisgICAgaWYgKCpfX2ZpcnN0IDwgKl9fcmVzdWx0KSB7CisgICAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghKCpfX3Jlc3VsdCA8ICpfX2ZpcnN0KSwgX1N0bE1zZ19JTlZBTElEX1NUUklDVF9XRUFLX1BSRURJQ0FURSkKKyAgICAgIF9fcmVzdWx0ID0gX19maXJzdDsKKyAgICB9CisgIHJldHVybiBfX3Jlc3VsdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX0NvbXBhcmU+CitfRm9yd2FyZEl0ZXIgbWluX2VsZW1lbnQoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgX0NvbXBhcmUgX19jb21wKSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICBpZiAoX19maXJzdCA9PSBfX2xhc3QpIHJldHVybiBfX2ZpcnN0OworICBfRm9yd2FyZEl0ZXIgX19yZXN1bHQgPSBfX2ZpcnN0OworICB3aGlsZSAoKytfX2ZpcnN0ICE9IF9fbGFzdCkgeworICAgIGlmIChfX2NvbXAoKl9fZmlyc3QsICpfX3Jlc3VsdCkpIHsKKyAgICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFfX2NvbXAoKl9fcmVzdWx0LCAqX19maXJzdCksIF9TdGxNc2dfSU5WQUxJRF9TVFJJQ1RfV0VBS19QUkVESUNBVEUpCisgICAgICBfX3Jlc3VsdCA9IF9fZmlyc3Q7CisgICAgfQorICB9CisgIHJldHVybiBfX3Jlc3VsdDsKK30KKworLy8gbmV4dF9wZXJtdXRhdGlvbiBhbmQgcHJldl9wZXJtdXRhdGlvbiwgd2l0aCBhbmQgd2l0aG91dCBhbiBleHBsaWNpdGx5CisvLyBzdXBwbGllZCBjb21wYXJpc29uIGZ1bmN0aW9uLgorX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyLCBjbGFzcyBfQ29tcGFyZT4KK2Jvb2wgX19uZXh0X3Blcm11dGF0aW9uKF9CaWRpcmVjdGlvbmFsSXRlciBfX2ZpcnN0LCBfQmlkaXJlY3Rpb25hbEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgX0NvbXBhcmUgX19jb21wKSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCisgICAgcmV0dXJuIGZhbHNlOworICBfQmlkaXJlY3Rpb25hbEl0ZXIgX19pID0gX19maXJzdDsKKyAgKytfX2k7CisgIGlmIChfX2kgPT0gX19sYXN0KQorICAgIHJldHVybiBmYWxzZTsKKyAgX19pID0gX19sYXN0OworICAtLV9faTsKKworICBmb3IoOzspIHsKKyAgICBfQmlkaXJlY3Rpb25hbEl0ZXIgX19paSA9IF9faTsKKyAgICAtLV9faTsKKyAgICBpZiAoX19jb21wKCpfX2ksICpfX2lpKSkgeworICAgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoIV9fY29tcCgqX19paSwgKl9faSksIF9TdGxNc2dfSU5WQUxJRF9TVFJJQ1RfV0VBS19QUkVESUNBVEUpCisgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIgX19qID0gX19sYXN0OworICAgICAgd2hpbGUgKCFfX2NvbXAoKl9faSwgKi0tX19qKSkge30KKyAgICAgIGl0ZXJfc3dhcChfX2ksIF9faik7CisgICAgICByZXZlcnNlKF9faWksIF9fbGFzdCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKF9faSA9PSBfX2ZpcnN0KSB7CisgICAgICByZXZlcnNlKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisjaWYgZGVmaW5lZCAoX1NUTFBfTkVFRF9VTlJFQUNIQUJMRV9SRVRVUk4pCisgICAgcmV0dXJuIGZhbHNlOworI2VuZGlmCit9CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyPgorYm9vbCBuZXh0X3Blcm11dGF0aW9uKF9CaWRpcmVjdGlvbmFsSXRlciBfX2ZpcnN0LCBfQmlkaXJlY3Rpb25hbEl0ZXIgX19sYXN0KSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICByZXR1cm4gX1NUTFBfUFJJViBfX25leHRfcGVybXV0YXRpb24oX19maXJzdCwgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfX2xlc3MoX1NUTFBfVkFMVUVfVFlQRShfX2ZpcnN0LCBfQmlkaXJlY3Rpb25hbEl0ZXIpKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXIsIGNsYXNzIF9Db21wYXJlPgorYm9vbCBuZXh0X3Blcm11dGF0aW9uKF9CaWRpcmVjdGlvbmFsSXRlciBfX2ZpcnN0LCBfQmlkaXJlY3Rpb25hbEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgIF9Db21wYXJlIF9fY29tcCkgeworICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKKyAgcmV0dXJuIF9TVExQX1BSSVYgX19uZXh0X3Blcm11dGF0aW9uKF9fZmlyc3QsIF9fbGFzdCwgX19jb21wKTsKK30KKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyLCBjbGFzcyBfQ29tcGFyZT4KK2Jvb2wgX19wcmV2X3Blcm11dGF0aW9uKF9CaWRpcmVjdGlvbmFsSXRlciBfX2ZpcnN0LCBfQmlkaXJlY3Rpb25hbEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgX0NvbXBhcmUgX19jb21wKSB7CisgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKyAgICByZXR1cm4gZmFsc2U7CisgIF9CaWRpcmVjdGlvbmFsSXRlciBfX2kgPSBfX2ZpcnN0OworICArK19faTsKKyAgaWYgKF9faSA9PSBfX2xhc3QpCisgICAgcmV0dXJuIGZhbHNlOworICBfX2kgPSBfX2xhc3Q7CisgIC0tX19pOworCisgIGZvcig7OykgeworICAgIF9CaWRpcmVjdGlvbmFsSXRlciBfX2lpID0gX19pOworICAgIC0tX19pOworICAgIGlmIChfX2NvbXAoKl9faWksICpfX2kpKSB7CisgICAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghX19jb21wKCpfX2ksICpfX2lpKSwgX1N0bE1zZ19JTlZBTElEX1NUUklDVF9XRUFLX1BSRURJQ0FURSkKKyAgICAgIF9CaWRpcmVjdGlvbmFsSXRlciBfX2ogPSBfX2xhc3Q7CisgICAgICB3aGlsZSAoIV9fY29tcCgqLS1fX2osICpfX2kpKSB7fQorICAgICAgaXRlcl9zd2FwKF9faSwgX19qKTsKKyAgICAgIHJldmVyc2UoX19paSwgX19sYXN0KTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoX19pID09IF9fZmlyc3QpIHsKKyAgICAgIHJldmVyc2UoX19maXJzdCwgX19sYXN0KTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKyNpZiBkZWZpbmVkIChfU1RMUF9ORUVEX1VOUkVBQ0hBQkxFX1JFVFVSTikKKyAgICByZXR1cm4gZmFsc2U7CisjZW5kaWYKK30KKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXI+Citib29sIHByZXZfcGVybXV0YXRpb24oX0JpZGlyZWN0aW9uYWxJdGVyIF9fZmlyc3QsIF9CaWRpcmVjdGlvbmFsSXRlciBfX2xhc3QpIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgIHJldHVybiBfU1RMUF9QUklWIF9fcHJldl9wZXJtdXRhdGlvbihfX2ZpcnN0LCBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fbGVzcyhfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsIF9CaWRpcmVjdGlvbmFsSXRlcikpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlciwgY2xhc3MgX0NvbXBhcmU+Citib29sIHByZXZfcGVybXV0YXRpb24oX0JpZGlyZWN0aW9uYWxJdGVyIF9fZmlyc3QsIF9CaWRpcmVjdGlvbmFsSXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgX0NvbXBhcmUgX19jb21wKSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICByZXR1cm4gX1NUTFBfUFJJViBfX3ByZXZfcGVybXV0YXRpb24oX19maXJzdCwgX19sYXN0LCBfX2NvbXApOworfQorCisjaWYgIWRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpCisKKy8vIGlzX2hlYXAsIGEgcHJlZGljYXRlIHRlc3Rpbmcgd2hldGhlciBvciBub3QgYSByYW5nZSBpcworLy8gYSBoZWFwLiAgVGhpcyBmdW5jdGlvbiBpcyBhbiBleHRlbnNpb24sIG5vdCBwYXJ0IG9mIHRoZSBDKysKKy8vIHN0YW5kYXJkLgorX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9EaXN0YW5jZSwgY2xhc3MgX1N0cmljdFdlYWtPcmRlcmluZz4KK2Jvb2wgX19pc19oZWFwKF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsIF9TdHJpY3RXZWFrT3JkZXJpbmcgX19jb21wLAorICAgICAgICAgICAgICAgX0Rpc3RhbmNlIF9fbikgeworICBfRGlzdGFuY2UgX19wYXJlbnQgPSAwOworICBmb3IgKF9EaXN0YW5jZSBfX2NoaWxkID0gMTsgX19jaGlsZCA8IF9fbjsgKytfX2NoaWxkKSB7CisgICAgaWYgKF9fY29tcChfX2ZpcnN0W19fcGFyZW50XSwgX19maXJzdFtfX2NoaWxkXSkpIHsKKyAgICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFfX2NvbXAoX19maXJzdFtfX2NoaWxkXSwgX19maXJzdFtfX3BhcmVudF0pLCBfU3RsTXNnX0lOVkFMSURfU1RSSUNUX1dFQUtfUFJFRElDQVRFKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoKF9fY2hpbGQgJiAxKSA9PSAwKQorICAgICAgKytfX3BhcmVudDsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcj4KK2Jvb2wgaXNfaGVhcChfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QpIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgIHJldHVybiBfU1RMUF9QUklWIF9faXNfaGVhcChfX2ZpcnN0LCBfU1RMUF9QUklWIF9fbGVzcyhfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyKSksIF9fbGFzdCAtIF9fZmlyc3QpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9TdHJpY3RXZWFrT3JkZXJpbmc+Citib29sIGlzX2hlYXAoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0LAorICAgICAgICAgICAgIF9TdHJpY3RXZWFrT3JkZXJpbmcgX19jb21wKSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICByZXR1cm4gX1NUTFBfUFJJViBfX2lzX2hlYXAoX19maXJzdCwgX19jb21wLCBfX2xhc3QgLSBfX2ZpcnN0KTsKK30KKworCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9TdHJpY3RXZWFrT3JkZXJpbmc+Citib29sIF9faXNfc29ydGVkKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICBfU3RyaWN0V2Vha09yZGVyaW5nIF9fY29tcCkgeworICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKKyAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorICAgIHJldHVybiB0cnVlOworCisgIF9Gb3J3YXJkSXRlciBfX25leHQgPSBfX2ZpcnN0OworICBmb3IgKCsrX19uZXh0OyBfX25leHQgIT0gX19sYXN0OyBfX2ZpcnN0ID0gX19uZXh0LCArK19fbmV4dCkgeworICAgIGlmIChfX2NvbXAoKl9fbmV4dCwgKl9fZmlyc3QpKSB7CisgICAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghX19jb21wKCpfX2ZpcnN0LCAqX19uZXh0KSwgX1N0bE1zZ19JTlZBTElEX1NUUklDVF9XRUFLX1BSRURJQ0FURSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisjZW5kaWYgLyogX1NUTFBfTk9fRVhURU5TSU9OUyAqLworCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyN1bmRlZiBfX3N0bF90aHJlc2hvbGQKKworI2VuZGlmIC8qIF9TVExQX0FMR09fQyAqLworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL19hbGdvLmggYi9zdGxwb3J0L3N0bC9fYWxnby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZTVmOTMKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9fYWxnby5oCkBAIC0wLDAgKzEsNzQ1IEBACisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworLyogTk9URTogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgU1RMIGhlYWRlcnMuCisgKiAgIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LgorICovCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQUxHT19ICisjZGVmaW5lIF9TVExQX0lOVEVSTkFMX0FMR09fSAorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0FMR09CQVNFX0gKKyMgIGluY2x1ZGUgPHN0bC9fYWxnb2Jhc2UuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0hFQVBfSAorIyAgaW5jbHVkZSA8c3RsL19oZWFwLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9JVEVSQVRPUl9ICisjICBpbmNsdWRlIDxzdGwvX2l0ZXJhdG9yLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9GVU5DVElPTl9CQVNFX0gKKyMgIGluY2x1ZGUgPHN0bC9fZnVuY3Rpb25fYmFzZS5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX1NVTlBST19DQykgJiYgIWRlZmluZWQgKF9TVExQX0lOVEVSTkFMX0NTVERJTykKKy8vIHJlbW92ZSgpIGNvbmZsaWN0CisjICBpbmNsdWRlIDxzdGwvX2NzdGRpby5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisvLyBmb3JfZWFjaC4gIEFwcGx5IGEgZnVuY3Rpb24gdG8gZXZlcnkgZWxlbWVudCBvZiBhIHJhbmdlLgordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9GdW5jdGlvbj4KK19TVExQX0lOTElORV9MT09QIF9GdW5jdGlvbgorZm9yX2VhY2goX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwgX0Z1bmN0aW9uIF9fZikgeworICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisgICAgX19mKCpfX2ZpcnN0KTsKKyAgcmV0dXJuIF9fZjsKK30KKworLy8gY291bnRfaWYKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfUHJlZGljYXRlPgorX1NUTFBfSU5MSU5FX0xPT1AgX1NUTFBfRElGRkVSRU5DRV9UWVBFKF9JbnB1dEl0ZXIpCitjb3VudF9pZihfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LCBfUHJlZGljYXRlIF9fcHJlZCkgeworICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKKyAgX1NUTFBfRElGRkVSRU5DRV9UWVBFKF9JbnB1dEl0ZXIpIF9fbiA9IDA7CisgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkgeworICAgIGlmIChfX3ByZWQoKl9fZmlyc3QpKQorICAgICAgKytfX247CisgIH0KKyAgcmV0dXJuIF9fbjsKK30KKworLy8gYWRqYWNlbnRfZmluZC4KKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX0JpbmFyeVByZWRpY2F0ZT4KK19TVExQX0lOTElORV9MT09QIF9Gb3J3YXJkSXRlcgorYWRqYWNlbnRfZmluZChfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgX0JpbmFyeVByZWRpY2F0ZSBfX2JpbmFyeV9wcmVkKSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCisgICAgcmV0dXJuIF9fbGFzdDsKKyAgX0ZvcndhcmRJdGVyIF9fbmV4dCA9IF9fZmlyc3Q7CisgIHdoaWxlKCsrX19uZXh0ICE9IF9fbGFzdCkgeworICAgIGlmIChfX2JpbmFyeV9wcmVkKCpfX2ZpcnN0LCAqX19uZXh0KSkKKyAgICAgIHJldHVybiBfX2ZpcnN0OworICAgIF9fZmlyc3QgPSBfX25leHQ7CisgIH0KKyAgcmV0dXJuIF9fbGFzdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcj4KK19TVExQX0lOTElORV9MT09QIF9Gb3J3YXJkSXRlcgorYWRqYWNlbnRfZmluZChfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCkgeworICByZXR1cm4gYWRqYWNlbnRfZmluZChfX2ZpcnN0LCBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX19lcXVhbF90byhfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsIF9Gb3J3YXJkSXRlcikpKTsKK30KKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19BTkFDSFJPTklTTVMpCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX1RwLCBjbGFzcyBfU2l6ZT4KK19TVExQX0lOTElORV9MT09QIHZvaWQKK2NvdW50KF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsIGNvbnN0IF9UcCYgX192YWwsIF9TaXplJiBfX24pIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgICAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorICAgICAgaWYgKCpfX2ZpcnN0ID09IF9fdmFsKQorICAgICAgICArK19fbjsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9QcmVkaWNhdGUsIGNsYXNzIF9TaXplPgorX1NUTFBfSU5MSU5FX0xPT1Agdm9pZAorY291bnRfaWYoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwgX1ByZWRpY2F0ZSBfX3ByZWQsIF9TaXplJiBfX24pIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKyAgICBpZiAoX19wcmVkKCpfX2ZpcnN0KSkKKyAgICAgICsrX19uOworfQorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIxLCBjbGFzcyBfRm9yd2FyZEl0ZXIyPgorX0ZvcndhcmRJdGVyMSBzZWFyY2goX0ZvcndhcmRJdGVyMSBfX2ZpcnN0MSwgX0ZvcndhcmRJdGVyMSBfX2xhc3QxLAorICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyMiBfX2ZpcnN0MiwgX0ZvcndhcmRJdGVyMiBfX2xhc3QyKTsKKworLy8gc2VhcmNoX24uICBTZWFyY2ggZm9yIF9fY291bnQgY29uc2VjdXRpdmUgY29waWVzIG9mIF9fdmFsLgordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX0ludGVnZXIsIGNsYXNzIF9UcD4KK19Gb3J3YXJkSXRlciBzZWFyY2hfbihfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICBfSW50ZWdlciBfX2NvdW50LCBjb25zdCBfVHAmIF9fdmFsKTsKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9JbnRlZ2VyLCBjbGFzcyBfVHAsIGNsYXNzIF9CaW5hcnlQcmVkPgorX0ZvcndhcmRJdGVyIHNlYXJjaF9uKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgIF9JbnRlZ2VyIF9fY291bnQsIGNvbnN0IF9UcCYgX192YWwsIF9CaW5hcnlQcmVkIF9fYmluYXJ5X3ByZWQpOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX0ZvcndhcmRJdGVyPgoraW5saW5lIF9JbnB1dEl0ZXIgZmluZF9maXJzdF9vZihfSW5wdXRJdGVyIF9fZmlyc3QxLCBfSW5wdXRJdGVyIF9fbGFzdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlciBfX2ZpcnN0MiwgX0ZvcndhcmRJdGVyIF9fbGFzdDIpIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QxLCBfX2xhc3QxKSkKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QyLCBfX2xhc3QyKSkKKyAgcmV0dXJuIF9TVExQX1BSSVYgX19maW5kX2ZpcnN0X29mKF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0MiwgX19sYXN0Mik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9CaW5hcnlQcmVkaWNhdGU+CitpbmxpbmUgX0lucHV0SXRlcgorZmluZF9maXJzdF9vZihfSW5wdXRJdGVyIF9fZmlyc3QxLCBfSW5wdXRJdGVyIF9fbGFzdDEsCisgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlciBfX2ZpcnN0MiwgX0ZvcndhcmRJdGVyIF9fbGFzdDIsIF9CaW5hcnlQcmVkaWNhdGUgX19jb21wKSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0MSwgX19sYXN0MSkpCisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0MiwgX19sYXN0MikpCisgIHJldHVybiBfU1RMUF9QUklWIF9fZmluZF9maXJzdF9vZihfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIsIF9fbGFzdDIsIF9fY29tcCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIxLCBjbGFzcyBfRm9yd2FyZEl0ZXIyPgorX0ZvcndhcmRJdGVyMQorZmluZF9lbmQoX0ZvcndhcmRJdGVyMSBfX2ZpcnN0MSwgX0ZvcndhcmRJdGVyMSBfX2xhc3QxLAorICAgICAgICAgX0ZvcndhcmRJdGVyMiBfX2ZpcnN0MiwgX0ZvcndhcmRJdGVyMiBfX2xhc3QyKTsKKworLy8gc3dhcF9yYW5nZXMKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIxLCBjbGFzcyBfRm9yd2FyZEl0ZXIyPgorX1NUTFBfSU5MSU5FX0xPT1AgX0ZvcndhcmRJdGVyMgorc3dhcF9yYW5nZXMoX0ZvcndhcmRJdGVyMSBfX2ZpcnN0MSwgX0ZvcndhcmRJdGVyMSBfX2xhc3QxLCBfRm9yd2FyZEl0ZXIyIF9fZmlyc3QyKSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0MSwgX19sYXN0MSkpCisgIGZvciAoIDsgX19maXJzdDEgIT0gX19sYXN0MTsgKytfX2ZpcnN0MSwgKytfX2ZpcnN0MikKKyAgICBpdGVyX3N3YXAoX19maXJzdDEsIF9fZmlyc3QyKTsKKyAgcmV0dXJuIF9fZmlyc3QyOworfQorCisvLyB0cmFuc2Zvcm0KK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfT3V0cHV0SXRlciwgY2xhc3MgX1VuYXJ5T3BlcmF0aW9uPgorX1NUTFBfSU5MSU5FX0xPT1AgX091dHB1dEl0ZXIKK3RyYW5zZm9ybShfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LCBfT3V0cHV0SXRlciBfX3Jlc3VsdCwgX1VuYXJ5T3BlcmF0aW9uIF9fb3ByKSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QsICsrX19yZXN1bHQpCisgICAgKl9fcmVzdWx0ID0gX19vcHIoKl9fZmlyc3QpOworICByZXR1cm4gX19yZXN1bHQ7Cit9Cit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNsYXNzIF9JbnB1dEl0ZXIyLCBjbGFzcyBfT3V0cHV0SXRlciwgY2xhc3MgX0JpbmFyeU9wZXJhdGlvbj4KK19TVExQX0lOTElORV9MT09QIF9PdXRwdXRJdGVyCit0cmFuc2Zvcm0oX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIxIF9fbGFzdDEsCisgICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIsIF9PdXRwdXRJdGVyIF9fcmVzdWx0LF9CaW5hcnlPcGVyYXRpb24gX19iaW5hcnlfb3ApIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QxLCBfX2xhc3QxKSkKKyAgZm9yICggOyBfX2ZpcnN0MSAhPSBfX2xhc3QxOyArK19fZmlyc3QxLCArK19fZmlyc3QyLCArK19fcmVzdWx0KQorICAgICpfX3Jlc3VsdCA9IF9fYmluYXJ5X29wKCpfX2ZpcnN0MSwgKl9fZmlyc3QyKTsKKyAgcmV0dXJuIF9fcmVzdWx0OworfQorCisvLyByZXBsYWNlX2lmLCByZXBsYWNlX2NvcHksIHJlcGxhY2VfY29weV9pZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfUHJlZGljYXRlLCBjbGFzcyBfVHA+CitfU1RMUF9JTkxJTkVfTE9PUCB2b2lkCityZXBsYWNlX2lmKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LCBfUHJlZGljYXRlIF9fcHJlZCwgY29uc3QgX1RwJiBfX25ld192YWx1ZSkgeworICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKKyAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorICAgIGlmIChfX3ByZWQoKl9fZmlyc3QpKQorICAgICAgKl9fZmlyc3QgPSBfX25ld192YWx1ZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9PdXRwdXRJdGVyLCBjbGFzcyBfVHA+CitfU1RMUF9JTkxJTkVfTE9PUCAgX091dHB1dEl0ZXIKK3JlcGxhY2VfY29weShfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LF9PdXRwdXRJdGVyIF9fcmVzdWx0LAorICAgICAgICAgICAgIGNvbnN0IF9UcCYgX19vbGRfdmFsdWUsIGNvbnN0IF9UcCYgX19uZXdfdmFsdWUpIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCwgKytfX3Jlc3VsdCkKKyAgICAqX19yZXN1bHQgPSAqX19maXJzdCA9PSBfX29sZF92YWx1ZSA/IF9fbmV3X3ZhbHVlIDogKl9fZmlyc3Q7CisgIHJldHVybiBfX3Jlc3VsdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvciwgY2xhc3MgX091dHB1dEl0ZXIsIGNsYXNzIF9QcmVkaWNhdGUsIGNsYXNzIF9UcD4KK19TVExQX0lOTElORV9MT09QIF9PdXRwdXRJdGVyCityZXBsYWNlX2NvcHlfaWYoX0l0ZXJhdG9yIF9fZmlyc3QsIF9JdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgX091dHB1dEl0ZXIgX19yZXN1bHQsCisgICAgICAgICAgICAgICAgX1ByZWRpY2F0ZSBfX3ByZWQsIGNvbnN0IF9UcCYgX19uZXdfdmFsdWUpIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCwgKytfX3Jlc3VsdCkKKyAgICAqX19yZXN1bHQgPSBfX3ByZWQoKl9fZmlyc3QpID8gX19uZXdfdmFsdWUgOiAqX19maXJzdDsKKyAgcmV0dXJuIF9fcmVzdWx0OworfQorCisvLyBnZW5lcmF0ZSBhbmQgZ2VuZXJhdGVfbgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfR2VuZXJhdG9yPgorX1NUTFBfSU5MSU5FX0xPT1Agdm9pZAorZ2VuZXJhdGUoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsIF9HZW5lcmF0b3IgX19nZW4pIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKyAgICAqX19maXJzdCA9IF9fZ2VuKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfT3V0cHV0SXRlciwgY2xhc3MgX1NpemUsIGNsYXNzIF9HZW5lcmF0b3I+CitfU1RMUF9JTkxJTkVfTE9PUCB2b2lkCitnZW5lcmF0ZV9uKF9PdXRwdXRJdGVyIF9fZmlyc3QsIF9TaXplIF9fbiwgX0dlbmVyYXRvciBfX2dlbikgeworICBmb3IgKCA7IF9fbiA+IDA7IC0tX19uLCArK19fZmlyc3QpCisgICAgKl9fZmlyc3QgPSBfX2dlbigpOworfQorCisvLyByZW1vdmUsIHJlbW92ZV9pZiwgcmVtb3ZlX2NvcHksIHJlbW92ZV9jb3B5X2lmCisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfT3V0cHV0SXRlciwgY2xhc3MgX1RwPgorX1NUTFBfSU5MSU5FX0xPT1AgX091dHB1dEl0ZXIKK3JlbW92ZV9jb3B5KF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsX091dHB1dEl0ZXIgX19yZXN1bHQsIGNvbnN0IF9UcCYgX192YWwpIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkgeworICAgIGlmICghKCpfX2ZpcnN0ID09IF9fdmFsKSkgeworICAgICAgKl9fcmVzdWx0ID0gKl9fZmlyc3Q7CisgICAgICArK19fcmVzdWx0OworICAgIH0KKyAgfQorICByZXR1cm4gX19yZXN1bHQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfT3V0cHV0SXRlciwgY2xhc3MgX1ByZWRpY2F0ZT4KK19TVExQX0lOTElORV9MT09QIF9PdXRwdXRJdGVyCityZW1vdmVfY29weV9pZihfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LCBfT3V0cHV0SXRlciBfX3Jlc3VsdCwgX1ByZWRpY2F0ZSBfX3ByZWQpIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkgeworICAgIGlmICghX19wcmVkKCpfX2ZpcnN0KSkgeworICAgICAgKl9fcmVzdWx0ID0gKl9fZmlyc3Q7CisgICAgICArK19fcmVzdWx0OworICAgIH0KKyAgfQorICByZXR1cm4gX19yZXN1bHQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9UcD4KK19TVExQX0lOTElORV9MT09QIF9Gb3J3YXJkSXRlcgorcmVtb3ZlKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LCBjb25zdCBfVHAmIF9fdmFsKSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICBfX2ZpcnN0ID0gZmluZChfX2ZpcnN0LCBfX2xhc3QsIF9fdmFsKTsKKyAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorICAgIHJldHVybiBfX2ZpcnN0OworICBlbHNlIHsKKyAgICBfRm9yd2FyZEl0ZXIgX19uZXh0ID0gX19maXJzdDsKKyAgICByZXR1cm4gcmVtb3ZlX2NvcHkoKytfX25leHQsIF9fbGFzdCwgX19maXJzdCwgX192YWwpOworICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9QcmVkaWNhdGU+CitfU1RMUF9JTkxJTkVfTE9PUCBfRm9yd2FyZEl0ZXIKK3JlbW92ZV9pZihfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwgX1ByZWRpY2F0ZSBfX3ByZWQpIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgIF9fZmlyc3QgPSBmaW5kX2lmKF9fZmlyc3QsIF9fbGFzdCwgX19wcmVkKTsKKyAgaWYgKCBfX2ZpcnN0ID09IF9fbGFzdCApCisgICAgcmV0dXJuIF9fZmlyc3Q7CisgIGVsc2UgeworICAgIF9Gb3J3YXJkSXRlciBfX25leHQgPSBfX2ZpcnN0OworICAgIHJldHVybiByZW1vdmVfY29weV9pZigrK19fbmV4dCwgX19sYXN0LCBfX2ZpcnN0LCBfX3ByZWQpOworICB9Cit9CisKKy8vIHVuaXF1ZSBhbmQgdW5pcXVlX2NvcHkKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfT3V0cHV0SXRlcj4KK19PdXRwdXRJdGVyIHVuaXF1ZV9jb3B5KF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsIF9PdXRwdXRJdGVyIF9fcmVzdWx0KTsKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9PdXRwdXRJdGVyLCBjbGFzcyBfQmluYXJ5UHJlZGljYXRlPgorX091dHB1dEl0ZXIgdW5pcXVlX2NvcHkoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCxfT3V0cHV0SXRlciBfX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9CaW5hcnlQcmVkaWNhdGUgX19iaW5hcnlfcHJlZCk7CisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXI+CitpbmxpbmUgX0ZvcndhcmRJdGVyIHVuaXF1ZShfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCkgeworICBfX2ZpcnN0ID0gYWRqYWNlbnRfZmluZChfX2ZpcnN0LCBfX2xhc3QpOworICByZXR1cm4gdW5pcXVlX2NvcHkoX19maXJzdCwgX19sYXN0LCBfX2ZpcnN0KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX0JpbmFyeVByZWRpY2F0ZT4KK2lubGluZSBfRm9yd2FyZEl0ZXIgdW5pcXVlKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JpbmFyeVByZWRpY2F0ZSBfX2JpbmFyeV9wcmVkKSB7CisgIF9fZmlyc3QgPSBhZGphY2VudF9maW5kKF9fZmlyc3QsIF9fbGFzdCwgX19iaW5hcnlfcHJlZCk7CisgIHJldHVybiB1bmlxdWVfY29weShfX2ZpcnN0LCBfX2xhc3QsIF9fZmlyc3QsIF9fYmluYXJ5X3ByZWQpOworfQorCisvLyByZXZlcnNlIGFuZCByZXZlcnNlX2NvcHksIGFuZCB0aGVpciBhdXhpbGlhcnkgZnVuY3Rpb25zCisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcj4KK19TVExQX0lOTElORV9MT09QIHZvaWQKK19fcmV2ZXJzZShfQmlkaXJlY3Rpb25hbEl0ZXIgX19maXJzdCwgX0JpZGlyZWN0aW9uYWxJdGVyIF9fbGFzdCwgY29uc3QgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgJikgeworICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3QgJiYgX19maXJzdCAhPSAtLV9fbGFzdDsgKytfX2ZpcnN0KQorICAgIF9TVExQX1NURDo6aXRlcl9zd2FwKF9fZmlyc3QsX19sYXN0KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyPgorX1NUTFBfSU5MSU5FX0xPT1Agdm9pZAorX19yZXZlcnNlKF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwgY29uc3QgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgJikgeworICBmb3IgKDsgX19maXJzdCA8IF9fbGFzdDsgKytfX2ZpcnN0KQorICAgIF9TVExQX1NURDo6aXRlcl9zd2FwKF9fZmlyc3QsIC0tX19sYXN0KTsKK30KKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXI+CitpbmxpbmUgdm9pZAorcmV2ZXJzZShfQmlkaXJlY3Rpb25hbEl0ZXIgX19maXJzdCwgX0JpZGlyZWN0aW9uYWxJdGVyIF9fbGFzdCkgeworICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKKyAgX1NUTFBfUFJJViBfX3JldmVyc2UoX19maXJzdCwgX19sYXN0LCBfU1RMUF9JVEVSQVRPUl9DQVRFR09SWShfX2ZpcnN0LCBfQmlkaXJlY3Rpb25hbEl0ZXIpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlciwgY2xhc3MgX091dHB1dEl0ZXI+CitfU1RMUF9JTkxJTkVfTE9PUAorX091dHB1dEl0ZXIgcmV2ZXJzZV9jb3B5KF9CaWRpcmVjdGlvbmFsSXRlciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXIgX19yZXN1bHQpIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkgeworICAgIC0tX19sYXN0OworICAgICpfX3Jlc3VsdCA9ICpfX2xhc3Q7CisgICAgKytfX3Jlc3VsdDsKKyAgfQorICByZXR1cm4gX19yZXN1bHQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXI+Cit2b2lkIHJvdGF0ZShfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbWlkZGxlLCBfRm9yd2FyZEl0ZXIgX19sYXN0KTsKKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX091dHB1dEl0ZXI+CitpbmxpbmUgX091dHB1dEl0ZXIgcm90YXRlX2NvcHkoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX21pZGRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXIgX19sYXN0LCBfT3V0cHV0SXRlciBfX3Jlc3VsdCkgeworICByZXR1cm4gX1NUTFBfU1REOjpjb3B5KF9fZmlyc3QsIF9fbWlkZGxlLCBjb3B5KF9fbWlkZGxlLCBfX2xhc3QsIF9fcmVzdWx0KSk7Cit9CisKKy8vIHJhbmRvbV9zaHVmZmxlCisKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcj4KK3ZvaWQgcmFuZG9tX3NodWZmbGUoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0KTsKKwordGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBjbGFzcyBfUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgordm9pZCByYW5kb21fc2h1ZmZsZShfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgIF9SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fcmFuZCk7CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKKy8vIHJhbmRvbV9zYW1wbGUgYW5kIHJhbmRvbV9zYW1wbGVfbiAoZXh0ZW5zaW9ucywgbm90IHBhcnQgb2YgdGhlIHN0YW5kYXJkKS4KKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX091dHB1dEl0ZXIsIGNsYXNzIF9EaXN0YW5jZT4KK19PdXRwdXRJdGVyIHJhbmRvbV9zYW1wbGVfbihfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlciBfX291dF9pdGUsIGNvbnN0IF9EaXN0YW5jZSBfX24pOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfT3V0cHV0SXRlciwgY2xhc3MgX0Rpc3RhbmNlLAorICAgICAgICAgIGNsYXNzIF9SYW5kb21OdW1iZXJHZW5lcmF0b3I+CitfT3V0cHV0SXRlciByYW5kb21fc2FtcGxlX24oX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXIgX19vdXRfaXRlLCBjb25zdCBfRGlzdGFuY2UgX19uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fcmFuZCk7CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcj4KK19SYW5kb21BY2Nlc3NJdGVyCityYW5kb21fc2FtcGxlKF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCisgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fb3V0X2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlciBfX291dF9sYXN0KTsKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLAorICAgICAgICAgIGNsYXNzIF9SYW5kb21OdW1iZXJHZW5lcmF0b3I+CitfUmFuZG9tQWNjZXNzSXRlcgorcmFuZG9tX3NhbXBsZShfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX291dF9maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIgX19vdXRfbGFzdCwKKyAgICAgICAgICAgICAgX1JhbmRvbU51bWJlckdlbmVyYXRvciYgX19yYW5kKTsKKworI2VuZGlmIC8qIF9TVExQX05PX0VYVEVOU0lPTlMgKi8KKworLy8gcGFydGl0aW9uLCBzdGFibGVfcGFydGl0aW9uLCBhbmQgdGhlaXIgYXV4aWxpYXJ5IGZ1bmN0aW9ucworCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfUHJlZGljYXRlPgorX0ZvcndhcmRJdGVyIHBhcnRpdGlvbihfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwgX1ByZWRpY2F0ZSAgIF9fcHJlZCk7CisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9QcmVkaWNhdGU+CitfRm9yd2FyZEl0ZXIKK3N0YWJsZV9wYXJ0aXRpb24oX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsIF9QcmVkaWNhdGUgX19wcmVkKTsKKworLy8gc29ydCgpIGFuZCBpdHMgYXV4aWxpYXJ5IGZ1bmN0aW9ucy4KK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9TaXplPgoraW5saW5lIF9TaXplIF9fbGcoX1NpemUgX19uKSB7CisgIF9TaXplIF9fazsKKyAgZm9yIChfX2sgPSAwOyBfX24gIT0gMTsgX19uID4+PSAxKSArK19fazsKKyAgcmV0dXJuIF9fazsKK30KKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcj4KK3ZvaWQgc29ydChfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QpOwordGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBjbGFzcyBfQ29tcGFyZT4KK3ZvaWQgc29ydChfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsIF9Db21wYXJlIF9fY29tcCk7CisKKy8vIHN0YWJsZV9zb3J0KCkgYW5kIGl0cyBhdXhpbGlhcnkgZnVuY3Rpb25zLgordGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyPgordm9pZCBzdGFibGVfc29ydChfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QpOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9Db21wYXJlPgordm9pZCBzdGFibGVfc29ydChfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsIF9Db21wYXJlIF9fY29tcCk7CisKKy8vIHBhcnRpYWxfc29ydCwgcGFydGlhbF9zb3J0X2NvcHksIGFuZCBhdXhpbGlhcnkgZnVuY3Rpb25zLgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXI+Cit2b2lkIHBhcnRpYWxfc29ydChfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlciBfX21pZGRsZSwKKyAgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCk7CisKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX0NvbXBhcmU+Cit2b2lkIHBhcnRpYWxfc29ydChfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LF9SYW5kb21BY2Nlc3NJdGVyIF9fbWlkZGxlLAorICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0LCBfQ29tcGFyZSBfX2NvbXApOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXI+CitfUmFuZG9tQWNjZXNzSXRlcgorcGFydGlhbF9zb3J0X2NvcHkoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fcmVzdWx0X2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlciBfX3Jlc3VsdF9sYXN0KTsKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBjbGFzcyBfQ29tcGFyZT4KK19SYW5kb21BY2Nlc3NJdGVyCitwYXJ0aWFsX3NvcnRfY29weShfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19yZXN1bHRfZmlyc3QsCisgICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX3Jlc3VsdF9sYXN0LCBfQ29tcGFyZSBfX2NvbXApOworCisvLyBudGhfZWxlbWVudCgpIGFuZCBpdHMgYXV4aWxpYXJ5IGZ1bmN0aW9ucy4KK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcj4KK3ZvaWQgbnRoX2VsZW1lbnQoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIgX19udGgsCisgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCk7CisKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX0NvbXBhcmU+Cit2b2lkIG50aF9lbGVtZW50KF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyIF9fbnRoLAorICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsIF9Db21wYXJlIF9fY29tcCk7CisKKy8vIGF1eGlsaWFyeSBjbGFzcyBmb3IgbG93ZXJfYm91bmQsIGV0Yy4KK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgorc3RydWN0IF9fbGVzc18yIHsKKyAgYm9vbCBvcGVyYXRvcigpIChjb25zdCBfVDEmIF9feCwgY29uc3QgX1QyJiBfX3kpIGNvbnN0IHsgcmV0dXJuIF9feCA8IF9feSA7IH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KK19fbGVzc18yPF9UMSxfVDI+IF9fbGVzczIoX1QxKiwgX1QyKiApIHsgcmV0dXJuIF9fbGVzc18yPF9UMSwgX1QyPigpOyB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9GVU5DVElPTl9QQVJUSUFMX09SREVSKQordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2xlc3M8X1RwPiBfX2xlc3MyKF9UcCosIF9UcCogKSB7IHJldHVybiBsZXNzPF9UcD4oKTsgfQorI2VuZGlmCisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCisvLyBCaW5hcnkgc2VhcmNoIChsb3dlcl9ib3VuZCwgdXBwZXJfYm91bmQsIGVxdWFsX3JhbmdlLCBiaW5hcnlfc2VhcmNoKS4KK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9UcD4KK2lubGluZSBfRm9yd2FyZEl0ZXIgbG93ZXJfYm91bmQoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9UcCYgX192YWwpIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgIHJldHVybiBfU1RMUF9QUklWIF9fbG93ZXJfYm91bmQoX19maXJzdCwgX19sYXN0LCBfX3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fbGVzczIoX1NUTFBfVkFMVUVfVFlQRShfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIpLCAoX1RwKikwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fbGVzczIoKF9UcCopMCwgX1NUTFBfVkFMVUVfVFlQRShfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9ESVNUQU5DRV9UWVBFKF9fZmlyc3QsIF9Gb3J3YXJkSXRlcikpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlPgoraW5saW5lIF9Gb3J3YXJkSXRlciBsb3dlcl9ib3VuZChfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1RwJiBfX3ZhbCwgX0NvbXBhcmUgX19jb21wKSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICByZXR1cm4gX1NUTFBfUFJJViBfX2xvd2VyX2JvdW5kKF9fZmlyc3QsIF9fbGFzdCwgX192YWwsIF9fY29tcCwgX19jb21wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX0RJU1RBTkNFX1RZUEUoX19maXJzdCwgX0ZvcndhcmRJdGVyKSk7Cit9CisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZTEsIGNsYXNzIF9Db21wYXJlMiwgY2xhc3MgX0Rpc3RhbmNlPgorX0ZvcndhcmRJdGVyIF9fdXBwZXJfYm91bmQoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsIGNvbnN0IF9UcCYgX192YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ29tcGFyZTEgX19jb21wMSwgX0NvbXBhcmUyIF9fY29tcDIsIF9EaXN0YW5jZSopOworCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1RwPgoraW5saW5lIF9Gb3J3YXJkSXRlciB1cHBlcl9ib3VuZChfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1RwJiBfX3ZhbCkgeworICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKKyAgcmV0dXJuIF9TVExQX1BSSVYgX191cHBlcl9ib3VuZChfX2ZpcnN0LCBfX2xhc3QsIF9fdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX19sZXNzMihfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsIF9Gb3J3YXJkSXRlciksIChfVHAqKTApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX19sZXNzMigoX1RwKikwLCBfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsIF9Gb3J3YXJkSXRlcikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX0RJU1RBTkNFX1RZUEUoX19maXJzdCwgX0ZvcndhcmRJdGVyKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmU+CitpbmxpbmUgX0ZvcndhcmRJdGVyIHVwcGVyX2JvdW5kKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfVHAmIF9fdmFsLCBfQ29tcGFyZSBfX2NvbXApIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgIHJldHVybiBfU1RMUF9QUklWIF9fdXBwZXJfYm91bmQoX19maXJzdCwgX19sYXN0LCBfX3ZhbCwgX19jb21wLCBfX2NvbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfRElTVEFOQ0VfVFlQRShfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIpKTsKK30KKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlMSwgY2xhc3MgX0NvbXBhcmUyLCBjbGFzcyBfRGlzdGFuY2U+CitwYWlyPF9Gb3J3YXJkSXRlciwgX0ZvcndhcmRJdGVyPgorX19lcXVhbF9yYW5nZShfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwgY29uc3QgX1RwJiBfX3ZhbCwKKyAgICAgICAgICAgICAgX0NvbXBhcmUxIF9fY29tcDEsIF9Db21wYXJlMiBfX2NvbXAyLCBfRGlzdGFuY2UqKTsKKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9UcD4KK2lubGluZSBwYWlyPF9Gb3J3YXJkSXRlciwgX0ZvcndhcmRJdGVyPgorZXF1YWxfcmFuZ2UoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsIGNvbnN0IF9UcCYgX192YWwpIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgIHJldHVybiBfU1RMUF9QUklWIF9fZXF1YWxfcmFuZ2UoX19maXJzdCwgX19sYXN0LCBfX3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fbGVzczIoX1NUTFBfVkFMVUVfVFlQRShfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIpLCAoX1RwKikwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fbGVzczIoKF9UcCopMCwgX1NUTFBfVkFMVUVfVFlQRShfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9ESVNUQU5DRV9UWVBFKF9fZmlyc3QsIF9Gb3J3YXJkSXRlcikpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlPgoraW5saW5lIHBhaXI8X0ZvcndhcmRJdGVyLCBfRm9yd2FyZEl0ZXI+CitlcXVhbF9yYW5nZShfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwgY29uc3QgX1RwJiBfX3ZhbCwKKyAgICAgICAgICAgIF9Db21wYXJlIF9fY29tcCkgeworICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKKyAgcmV0dXJuIF9TVExQX1BSSVYgX19lcXVhbF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QsIF9fdmFsLCBfX2NvbXAsIF9fY29tcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9ESVNUQU5DRV9UWVBFKF9fZmlyc3QsIF9Gb3J3YXJkSXRlcikpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfVHA+CitpbmxpbmUgYm9vbCBiaW5hcnlfc2VhcmNoKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IF9UcCYgX192YWwpIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgIF9Gb3J3YXJkSXRlciBfX2kgPSBfU1RMUF9QUklWIF9fbG93ZXJfYm91bmQoX19maXJzdCwgX19sYXN0LCBfX3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fbGVzczIoX1NUTFBfVkFMVUVfVFlQRShfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIpLCAoX1RwKikwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fbGVzczIoKF9UcCopMCwgX1NUTFBfVkFMVUVfVFlQRShfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9ESVNUQU5DRV9UWVBFKF9fZmlyc3QsIF9Gb3J3YXJkSXRlcikpOworICByZXR1cm4gX19pICE9IF9fbGFzdCAmJiAhKF9fdmFsIDwgKl9faSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmU+CitpbmxpbmUgYm9vbCBiaW5hcnlfc2VhcmNoKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfVHAmIF9fdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfQ29tcGFyZSBfX2NvbXApIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgIF9Gb3J3YXJkSXRlciBfX2kgPSBfU1RMUF9QUklWIF9fbG93ZXJfYm91bmQoX19maXJzdCwgX19sYXN0LCBfX3ZhbCwgX19jb21wLCBfX2NvbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfRElTVEFOQ0VfVFlQRShfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIpKTsKKyAgcmV0dXJuIF9faSAhPSBfX2xhc3QgJiYgIV9fY29tcChfX3ZhbCwgKl9faSk7Cit9CisKKy8vIG1lcmdlLCB3aXRoIGFuZCB3aXRob3V0IGFuIGV4cGxpY2l0bHkgc3VwcGxpZWQgY29tcGFyaXNvbiBmdW5jdGlvbi4KKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMiwgY2xhc3MgX091dHB1dEl0ZXI+CitfT3V0cHV0SXRlciBtZXJnZShfSW5wdXRJdGVyMSBfX2ZpcnN0MSwgX0lucHV0SXRlcjEgX19sYXN0MSwKKyAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyLCBfSW5wdXRJdGVyMiBfX2xhc3QyLAorICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXIgX19yZXN1bHQpOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNsYXNzIF9JbnB1dEl0ZXIyLCBjbGFzcyBfT3V0cHV0SXRlciwKKyAgICAgICAgICBjbGFzcyBfQ29tcGFyZT4KK19PdXRwdXRJdGVyIG1lcmdlKF9JbnB1dEl0ZXIxIF9fZmlyc3QxLCBfSW5wdXRJdGVyMSBfX2xhc3QxLAorICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIsIF9JbnB1dEl0ZXIyIF9fbGFzdDIsCisgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlciBfX3Jlc3VsdCwgX0NvbXBhcmUgX19jb21wKTsKKworCisvLyBpbnBsYWNlX21lcmdlIGFuZCBpdHMgYXV4aWxpYXJ5IGZ1bmN0aW9ucy4KKworCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyPgordm9pZCBpbnBsYWNlX21lcmdlKF9CaWRpcmVjdGlvbmFsSXRlciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlciBfX21pZGRsZSwKKyAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIgX19sYXN0KSA7CisKK3RlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXIsIGNsYXNzIF9Db21wYXJlPgordm9pZCBpbnBsYWNlX21lcmdlKF9CaWRpcmVjdGlvbmFsSXRlciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlciBfX21pZGRsZSwKKyAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIgX19sYXN0LCBfQ29tcGFyZSBfX2NvbXApOworCisvLyBTZXQgYWxnb3JpdGhtczogaW5jbHVkZXMsIHNldF91bmlvbiwgc2V0X2ludGVyc2VjdGlvbiwgc2V0X2RpZmZlcmVuY2UsCisvLyBzZXRfc3ltbWV0cmljX2RpZmZlcmVuY2UuICBBbGwgb2YgdGhlc2UgYWxnb3JpdGhtcyBoYXZlIHRoZSBwcmVjb25kaXRpb24KKy8vIHRoYXQgdGhlaXIgaW5wdXQgcmFuZ2VzIGFyZSBzb3J0ZWQgYW5kIHRoZSBwb3N0Y29uZGl0aW9uIHRoYXQgdGhlaXIgb3V0cHV0CisvLyByYW5nZXMgYXJlIHNvcnRlZC4KKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMj4KK2Jvb2wgaW5jbHVkZXMoX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIxIF9fbGFzdDEsCisgICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyLCBfSW5wdXRJdGVyMiBfX2xhc3QyKTsKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMiwgY2xhc3MgX0NvbXBhcmU+Citib29sIGluY2x1ZGVzKF9JbnB1dEl0ZXIxIF9fZmlyc3QxLCBfSW5wdXRJdGVyMSBfX2xhc3QxLAorICAgICAgICAgICAgICBfSW5wdXRJdGVyMiBfX2ZpcnN0MiwgX0lucHV0SXRlcjIgX19sYXN0MiwgX0NvbXBhcmUgX19jb21wKTsKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMiwgY2xhc3MgX091dHB1dEl0ZXI+CitfT3V0cHV0SXRlciBzZXRfdW5pb24oX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIxIF9fbGFzdDEsCisgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIsIF9JbnB1dEl0ZXIyIF9fbGFzdDIsCisgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXIgX19yZXN1bHQpOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNsYXNzIF9JbnB1dEl0ZXIyLCBjbGFzcyBfT3V0cHV0SXRlciwKKyAgICAgICAgICBjbGFzcyBfQ29tcGFyZT4KK19PdXRwdXRJdGVyIHNldF91bmlvbihfSW5wdXRJdGVyMSBfX2ZpcnN0MSwgX0lucHV0SXRlcjEgX19sYXN0MSwKKyAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyMiBfX2ZpcnN0MiwgX0lucHV0SXRlcjIgX19sYXN0MiwKKyAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlciBfX3Jlc3VsdCwgX0NvbXBhcmUgX19jb21wKTsKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMiwgY2xhc3MgX091dHB1dEl0ZXI+CitfT3V0cHV0SXRlciBzZXRfaW50ZXJzZWN0aW9uKF9JbnB1dEl0ZXIxIF9fZmlyc3QxLCBfSW5wdXRJdGVyMSBfX2xhc3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyMiBfX2ZpcnN0MiwgX0lucHV0SXRlcjIgX19sYXN0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXIgX19yZXN1bHQpOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNsYXNzIF9JbnB1dEl0ZXIyLCBjbGFzcyBfT3V0cHV0SXRlciwKKyAgICAgICAgICBjbGFzcyBfQ29tcGFyZT4KK19PdXRwdXRJdGVyIHNldF9pbnRlcnNlY3Rpb24oX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIxIF9fbGFzdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyLCBfSW5wdXRJdGVyMiBfX2xhc3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlciBfX3Jlc3VsdCwgX0NvbXBhcmUgX19jb21wKTsKKworCisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0SXRlcjIsIGNsYXNzIF9PdXRwdXRJdGVyPgorX091dHB1dEl0ZXIgc2V0X2RpZmZlcmVuY2UoX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIxIF9fbGFzdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyMiBfX2ZpcnN0MiwgX0lucHV0SXRlcjIgX19sYXN0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0KTsKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMiwgY2xhc3MgX091dHB1dEl0ZXIsCisgICAgICAgICAgY2xhc3MgX0NvbXBhcmU+CitfT3V0cHV0SXRlciBzZXRfZGlmZmVyZW5jZShfSW5wdXRJdGVyMSBfX2ZpcnN0MSwgX0lucHV0SXRlcjEgX19sYXN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyLCBfSW5wdXRJdGVyMiBfX2xhc3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXIgX19yZXN1bHQsIF9Db21wYXJlIF9fY29tcCk7CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0SXRlcjIsIGNsYXNzIF9PdXRwdXRJdGVyPgorX091dHB1dEl0ZXIKK3NldF9zeW1tZXRyaWNfZGlmZmVyZW5jZShfSW5wdXRJdGVyMSBfX2ZpcnN0MSwgX0lucHV0SXRlcjEgX19sYXN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyMiBfX2ZpcnN0MiwgX0lucHV0SXRlcjIgX19sYXN0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlciBfX3Jlc3VsdCk7CisKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMiwgY2xhc3MgX091dHB1dEl0ZXIsCisgICAgICAgICAgY2xhc3MgX0NvbXBhcmU+CitfT3V0cHV0SXRlcgorc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlKF9JbnB1dEl0ZXIxIF9fZmlyc3QxLCBfSW5wdXRJdGVyMSBfX2xhc3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyLCBfSW5wdXRJdGVyMiBfX2xhc3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgIF9Db21wYXJlIF9fY29tcCk7CisKKworLy8gbWluX2VsZW1lbnQgYW5kIG1heF9lbGVtZW50LCB3aXRoIGFuZCB3aXRob3V0IGFuIGV4cGxpY2l0bHkgc3VwcGxpZWQKKy8vIGNvbXBhcmlzb24gZnVuY3Rpb24uCisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXI+CitfRm9yd2FyZEl0ZXIgbWF4X2VsZW1lbnQoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QpOwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX0NvbXBhcmU+CitfRm9yd2FyZEl0ZXIgbWF4X2VsZW1lbnQoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NvbXBhcmUgX19jb21wKTsKKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcj4KK19Gb3J3YXJkSXRlciBtaW5fZWxlbWVudChfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCk7CisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9Db21wYXJlPgorX0ZvcndhcmRJdGVyIG1pbl9lbGVtZW50KF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Db21wYXJlIF9fY29tcCk7CisKKy8vIG5leHRfcGVybXV0YXRpb24gYW5kIHByZXZfcGVybXV0YXRpb24sIHdpdGggYW5kIHdpdGhvdXQgYW4gZXhwbGljaXRseQorLy8gc3VwcGxpZWQgY29tcGFyaXNvbiBmdW5jdGlvbi4KKwordGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcj4KK2Jvb2wgbmV4dF9wZXJtdXRhdGlvbihfQmlkaXJlY3Rpb25hbEl0ZXIgX19maXJzdCwgX0JpZGlyZWN0aW9uYWxJdGVyIF9fbGFzdCk7CisKK3RlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXIsIGNsYXNzIF9Db21wYXJlPgorYm9vbCBuZXh0X3Blcm11dGF0aW9uKF9CaWRpcmVjdGlvbmFsSXRlciBfX2ZpcnN0LCBfQmlkaXJlY3Rpb25hbEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgIF9Db21wYXJlIF9fY29tcCk7CisKKwordGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcj4KK2Jvb2wgcHJldl9wZXJtdXRhdGlvbihfQmlkaXJlY3Rpb25hbEl0ZXIgX19maXJzdCwgX0JpZGlyZWN0aW9uYWxJdGVyIF9fbGFzdCk7CisKKwordGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlciwgY2xhc3MgX0NvbXBhcmU+Citib29sIHByZXZfcGVybXV0YXRpb24oX0JpZGlyZWN0aW9uYWxJdGVyIF9fZmlyc3QsIF9CaWRpcmVjdGlvbmFsSXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgX0NvbXBhcmUgX19jb21wKTsKKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQorLy8gaXNfaGVhcCwgYSBwcmVkaWNhdGUgdGVzdGluZyB3aGV0aGVyIG9yIG5vdCBhIHJhbmdlIGlzCisvLyBhIGhlYXAuICBUaGlzIGZ1bmN0aW9uIGlzIGFuIGV4dGVuc2lvbiwgbm90IHBhcnQgb2YgdGhlIEMrKworLy8gc3RhbmRhcmQuCisKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcj4KK2Jvb2wgaXNfaGVhcChfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QpOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9TdHJpY3RXZWFrT3JkZXJpbmc+Citib29sIGlzX2hlYXAoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0LAorICAgICAgICAgICAgIF9TdHJpY3RXZWFrT3JkZXJpbmcgX19jb21wKTsKKworLy8gaXNfc29ydGVkLCBhIHByZWRpY2F0ZWQgdGVzdGluZyB3aGV0aGVyIGEgcmFuZ2UgaXMgc29ydGVkIGluCisvLyBub25kZXNjZW5kaW5nIG9yZGVyLiAgVGhpcyBpcyBhbiBleHRlbnNpb24sIG5vdCBwYXJ0IG9mIHRoZSBDKysKKy8vIHN0YW5kYXJkLgorX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfU3RyaWN0V2Vha09yZGVyaW5nPgorYm9vbCBfX2lzX3NvcnRlZChfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgX1N0cmljdFdlYWtPcmRlcmluZyBfX2NvbXApOworCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXI+CitpbmxpbmUgYm9vbCBpc19zb3J0ZWQoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QpIHsKKyAgcmV0dXJuIF9TVExQX1BSSVYgX19pc19zb3J0ZWQoX19maXJzdCwgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fbGVzcyhfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsIF9Gb3J3YXJkSXRlcikpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1N0cmljdFdlYWtPcmRlcmluZz4KK2lubGluZSBib29sIGlzX3NvcnRlZChfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICBfU3RyaWN0V2Vha09yZGVyaW5nIF9fY29tcCkgeworICByZXR1cm4gX1NUTFBfUFJJViBfX2lzX3NvcnRlZChfX2ZpcnN0LCBfX2xhc3QsIF9fY29tcCk7Cit9CisjZW5kaWYKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjaWYgIWRlZmluZWQgKF9TVExQX0xJTktfVElNRV9JTlNUQU5USUFUSU9OKQorIyAgaW5jbHVkZSA8c3RsL19hbGdvLmM+CisjZW5kaWYKKworI2VuZGlmIC8qIF9TVExQX0lOVEVSTkFMX0FMR09fSCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgorCmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9fYWxnb2Jhc2UuYyBiL3N0bHBvcnQvc3RsL19hbGdvYmFzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1N2UyNWMKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9fYWxnb2Jhc2UuYwpAQCAtMCwwICsxLDQ4MyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisjaWZuZGVmIF9TVExQX0FMR09CQVNFX0MKKyNkZWZpbmUgX1NUTFBfQUxHT0JBU0VfQworCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0FMR09CQVNFX0gKKyMgIGluY2x1ZGUgPHN0bC9fYWxnb2Jhc2UuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0ZVTkNUSU9OX0JBU0VfSAorIyAgaW5jbHVkZSA8c3RsL19mdW5jdGlvbl9iYXNlLmg+CisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0SXRlcjI+Citib29sIGxleGljb2dyYXBoaWNhbF9jb21wYXJlKF9JbnB1dEl0ZXIxIF9fZmlyc3QxLCBfSW5wdXRJdGVyMSBfX2xhc3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyMiBfX2ZpcnN0MiwgX0lucHV0SXRlcjIgX19sYXN0MikgeworICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdDEsIF9fbGFzdDEpKQorICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdDIsIF9fbGFzdDIpKQorICBmb3IgKCA7IF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0MgorICAgICAgICA7ICsrX19maXJzdDEsICsrX19maXJzdDIpIHsKKyAgICBpZiAoKl9fZmlyc3QxIDwgKl9fZmlyc3QyKSB7CisgICAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghKCpfX2ZpcnN0MiA8ICpfX2ZpcnN0MSksIF9TdGxNc2dfSU5WQUxJRF9TVFJJQ1RfV0VBS19QUkVESUNBVEUpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKCpfX2ZpcnN0MiA8ICpfX2ZpcnN0MSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gX19maXJzdDEgPT0gX19sYXN0MSAmJiBfX2ZpcnN0MiAhPSBfX2xhc3QyOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNsYXNzIF9JbnB1dEl0ZXIyLCBjbGFzcyBfQ29tcGFyZT4KK2Jvb2wgbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIxIF9fbGFzdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyLCBfSW5wdXRJdGVyMiBfX2xhc3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ29tcGFyZSBfX2NvbXApIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QxLCBfX2xhc3QxKSkKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QyLCBfX2xhc3QyKSkKKyAgZm9yICggOyBfX2ZpcnN0MSAhPSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDIKKyAgICAgICAgOyArK19fZmlyc3QxLCArK19fZmlyc3QyKSB7CisgICAgaWYgKF9fY29tcCgqX19maXJzdDEsICpfX2ZpcnN0MikpIHsKKyAgICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFfX2NvbXAoKl9fZmlyc3QyLCAqX19maXJzdDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX1N0bE1zZ19JTlZBTElEX1NUUklDVF9XRUFLX1BSRURJQ0FURSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoX19jb21wKCpfX2ZpcnN0MiwgKl9fZmlyc3QxKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gX19maXJzdDEgPT0gX19sYXN0MSAmJiBfX2ZpcnN0MiAhPSBfX2xhc3QyOworfQorCisjaWYgIWRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0SXRlcjI+CitpbnQgX19sZXhpY29ncmFwaGljYWxfY29tcGFyZV8zd2F5KF9JbnB1dEl0ZXIxIF9fZmlyc3QxLCBfSW5wdXRJdGVyMSBfX2xhc3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyMiBfX2ZpcnN0MiwgX0lucHV0SXRlcjIgX19sYXN0MikgeworICB3aGlsZSAoX19maXJzdDEgIT0gX19sYXN0MSAmJiBfX2ZpcnN0MiAhPSBfX2xhc3QyKSB7CisgICAgaWYgKCpfX2ZpcnN0MSA8ICpfX2ZpcnN0MikgeworICAgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoISgqX19maXJzdDIgPCAqX19maXJzdDEpLCBfU3RsTXNnX0lOVkFMSURfU1RSSUNUX1dFQUtfUFJFRElDQVRFKQorICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoKl9fZmlyc3QyIDwgKl9fZmlyc3QxKQorICAgICAgcmV0dXJuIDE7CisgICAgKytfX2ZpcnN0MTsKKyAgICArK19fZmlyc3QyOworICB9CisgIGlmIChfX2ZpcnN0MiA9PSBfX2xhc3QyKSB7CisgICAgcmV0dXJuICEoX19maXJzdDEgPT0gX19sYXN0MSk7CisgIH0KKyAgZWxzZSB7CisgICAgcmV0dXJuIC0xOworICB9Cit9CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNsYXNzIF9JbnB1dEl0ZXIyPgoraW50IGxleGljb2dyYXBoaWNhbF9jb21wYXJlXzN3YXkoX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIxIF9fbGFzdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyMiBfX2ZpcnN0MiwgX0lucHV0SXRlcjIgX19sYXN0MikgeworICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdDEsIF9fbGFzdDEpKQorICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdDIsIF9fbGFzdDIpKQorICByZXR1cm4gX1NUTFBfUFJJViBfX2xleGljb2dyYXBoaWNhbF9jb21wYXJlXzN3YXkoX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLCBfX2xhc3QyKTsKK30KKyNlbmRpZgorCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX1RwPgorX1NUTFBfSU5MSU5FX0xPT1AgX1JhbmRvbUFjY2Vzc0l0ZXIgX19maW5kKF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfVHAmIF9fdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnICYpIHsKKyAgX1NUTFBfRElGRkVSRU5DRV9UWVBFKF9SYW5kb21BY2Nlc3NJdGVyKSBfX3RyaXBfY291bnQgPSAoX19sYXN0IC0gX19maXJzdCkgPj4gMjsKKworICBmb3IgKCA7IF9fdHJpcF9jb3VudCA+IDAgOyAtLV9fdHJpcF9jb3VudCkgeworICAgIGlmICgqX19maXJzdCA9PSBfX3ZhbCkgcmV0dXJuIF9fZmlyc3Q7CisgICAgKytfX2ZpcnN0OworCisgICAgaWYgKCpfX2ZpcnN0ID09IF9fdmFsKSByZXR1cm4gX19maXJzdDsKKyAgICArK19fZmlyc3Q7CisKKyAgICBpZiAoKl9fZmlyc3QgPT0gX192YWwpIHJldHVybiBfX2ZpcnN0OworICAgICsrX19maXJzdDsKKworICAgIGlmICgqX19maXJzdCA9PSBfX3ZhbCkgcmV0dXJuIF9fZmlyc3Q7CisgICAgKytfX2ZpcnN0OworICB9CisKKyAgc3dpdGNoIChfX2xhc3QgLSBfX2ZpcnN0KSB7CisgIGNhc2UgMzoKKyAgICBpZiAoKl9fZmlyc3QgPT0gX192YWwpIHJldHVybiBfX2ZpcnN0OworICAgICsrX19maXJzdDsKKyAgY2FzZSAyOgorICAgIGlmICgqX19maXJzdCA9PSBfX3ZhbCkgcmV0dXJuIF9fZmlyc3Q7CisgICAgKytfX2ZpcnN0OworICBjYXNlIDE6CisgICAgaWYgKCpfX2ZpcnN0ID09IF9fdmFsKSByZXR1cm4gX19maXJzdDsKKyAgICAvLysrX19maXJzdDsKKyAgY2FzZSAwOgorICBkZWZhdWx0OgorICAgIHJldHVybiBfX2xhc3Q7CisgIH0KK30KKworaW5saW5lIGNoYXIqCitfX2ZpbmQoY2hhciogX19maXJzdCwgY2hhciogX19sYXN0LCBjaGFyIF9fdmFsLCBjb25zdCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyAmKSB7CisgIHZvaWQgKnJlcyA9ICBtZW1jaHIoX19maXJzdCwgX192YWwsIF9fbGFzdCAtIF9fZmlyc3QpOworICByZXR1cm4gcmVzICE9IDAgPyBfX1NUQVRJQ19DQVNUKGNoYXIqLCByZXMpIDogX19sYXN0OworfQoraW5saW5lIGNvbnN0IGNoYXIqCitfX2ZpbmQoY29uc3QgY2hhciogX19maXJzdCwgY29uc3QgY2hhciogX19sYXN0LCBjaGFyIF9fdmFsLCBjb25zdCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyAmKSB7CisgIGNvbnN0IHZvaWQgKnJlcyA9ICBtZW1jaHIoX19maXJzdCwgX192YWwsIF9fbGFzdCAtIF9fZmlyc3QpOworICByZXR1cm4gcmVzICE9IDAgPyBfX1NUQVRJQ19DQVNUKGNvbnN0IGNoYXIqLCByZXMpIDogX19sYXN0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9QcmVkaWNhdGU+CitfU1RMUF9JTkxJTkVfTE9PUCBfUmFuZG9tQWNjZXNzSXRlciBfX2ZpbmRfaWYoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QcmVkaWNhdGUgX19wcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnICYpIHsKKyAgX1NUTFBfRElGRkVSRU5DRV9UWVBFKF9SYW5kb21BY2Nlc3NJdGVyKSBfX3RyaXBfY291bnQgPSAoX19sYXN0IC0gX19maXJzdCkgPj4gMjsKKworICBmb3IgKCA7IF9fdHJpcF9jb3VudCA+IDAgOyAtLV9fdHJpcF9jb3VudCkgeworICAgIGlmIChfX3ByZWQoKl9fZmlyc3QpKSByZXR1cm4gX19maXJzdDsKKyAgICArK19fZmlyc3Q7CisKKyAgICBpZiAoX19wcmVkKCpfX2ZpcnN0KSkgcmV0dXJuIF9fZmlyc3Q7CisgICAgKytfX2ZpcnN0OworCisgICAgaWYgKF9fcHJlZCgqX19maXJzdCkpIHJldHVybiBfX2ZpcnN0OworICAgICsrX19maXJzdDsKKworICAgIGlmIChfX3ByZWQoKl9fZmlyc3QpKSByZXR1cm4gX19maXJzdDsKKyAgICArK19fZmlyc3Q7CisgIH0KKworICBzd2l0Y2goX19sYXN0IC0gX19maXJzdCkgeworICBjYXNlIDM6CisgICAgaWYgKF9fcHJlZCgqX19maXJzdCkpIHJldHVybiBfX2ZpcnN0OworICAgICsrX19maXJzdDsKKyAgY2FzZSAyOgorICAgIGlmIChfX3ByZWQoKl9fZmlyc3QpKSByZXR1cm4gX19maXJzdDsKKyAgICArK19fZmlyc3Q7CisgIGNhc2UgMToKKyAgICBpZiAoX19wcmVkKCpfX2ZpcnN0KSkgcmV0dXJuIF9fZmlyc3Q7CisgICAgICAvLysrX19maXJzdDsKKyAgY2FzZSAwOgorICBkZWZhdWx0OgorICAgIHJldHVybiBfX2xhc3Q7CisgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9UcD4KK19TVExQX0lOTElORV9MT09QIF9JbnB1dEl0ZXIgX19maW5kKF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfVHAmIF9fdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5wdXRfaXRlcmF0b3JfdGFnICYpIHsKKyAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0ICYmICEoKl9fZmlyc3QgPT0gX192YWwpKSArK19fZmlyc3Q7CisgIHJldHVybiBfX2ZpcnN0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX1ByZWRpY2F0ZT4KK19TVExQX0lOTElORV9MT09QIF9JbnB1dEl0ZXIgX19maW5kX2lmKF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHJlZGljYXRlIF9fcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0X2l0ZXJhdG9yX3RhZyAmKSB7CisgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCAmJiAhX19wcmVkKCpfX2ZpcnN0KSkKKyAgICArK19fZmlyc3Q7CisgIHJldHVybiBfX2ZpcnN0OworfQorCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9QcmVkaWNhdGU+CitfSW5wdXRJdGVyIGZpbmRfaWYoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICBfUHJlZGljYXRlIF9fcHJlZCkgeworICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKKyAgcmV0dXJuIF9TVExQX1BSSVYgX19maW5kX2lmKF9fZmlyc3QsIF9fbGFzdCwgX19wcmVkLCBfU1RMUF9JVEVSQVRPUl9DQVRFR09SWShfX2ZpcnN0LCBfSW5wdXRJdGVyKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfVHA+CitfSW5wdXRJdGVyIGZpbmQoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwgY29uc3QgX1RwJiBfX3ZhbCkgeworICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKKyAgcmV0dXJuIF9TVExQX1BSSVYgX19maW5kKF9fZmlyc3QsIF9fbGFzdCwgX192YWwsIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9fZmlyc3QsIF9JbnB1dEl0ZXIpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcjEsIGNsYXNzIF9Gb3J3YXJkSXRlcjIsIGNsYXNzIF9CaW5hcnlQcmVkPgorX0ZvcndhcmRJdGVyMSBzZWFyY2goX0ZvcndhcmRJdGVyMSBfX2ZpcnN0MSwgX0ZvcndhcmRJdGVyMSBfX2xhc3QxLAorICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyMiBfX2ZpcnN0MiwgX0ZvcndhcmRJdGVyMiBfX2xhc3QyLAorICAgICAgICAgICAgICAgICAgICAgX0JpbmFyeVByZWQgIF9fcHJlZCkgeworICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdDEsIF9fbGFzdDEpKQorICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdDIsIF9fbGFzdDIpKQorICAvLyBUZXN0IGZvciBlbXB0eSByYW5nZXMKKyAgaWYgKF9fZmlyc3QxID09IF9fbGFzdDEgfHwgX19maXJzdDIgPT0gX19sYXN0MikKKyAgICByZXR1cm4gX19maXJzdDE7CisKKyAgLy8gVGVzdCBmb3IgYSBwYXR0ZXJuIG9mIGxlbmd0aCAxLgorICBfRm9yd2FyZEl0ZXIyIF9fcDEoX19maXJzdDIpOworCisgIGlmICggKytfX3AxID09IF9fbGFzdDIgKSB7CisgICAgd2hpbGUgKF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgIV9fcHJlZCgqX19maXJzdDEsICpfX2ZpcnN0MikpIHsKKyAgICAgICsrX19maXJzdDE7CisgICAgfQorICAgIHJldHVybiBfX2ZpcnN0MTsKKyAgfQorCisgIC8vIEdlbmVyYWwgY2FzZS4KKworICBmb3IgKCA7IDsgKSB7IC8vIF9fZmlyc3QxICE9IF9fbGFzdDEgd2lsbCBiZSBjaGVja2VkIGJlbG93CisgICAgd2hpbGUgKF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgIV9fcHJlZCgqX19maXJzdDEsICpfX2ZpcnN0MikpIHsKKyAgICAgICsrX19maXJzdDE7CisgICAgfQorICAgIGlmIChfX2ZpcnN0MSA9PSBfX2xhc3QxKSB7CisgICAgICByZXR1cm4gX19sYXN0MTsKKyAgICB9CisgICAgX0ZvcndhcmRJdGVyMiBfX3AgPSBfX3AxOworICAgIF9Gb3J3YXJkSXRlcjEgX19jdXJyZW50ID0gX19maXJzdDE7CisgICAgaWYgKCsrX19jdXJyZW50ID09IF9fbGFzdDEpIHJldHVybiBfX2xhc3QxOworCisgICAgd2hpbGUgKF9fcHJlZCgqX19jdXJyZW50LCAqX19wKSkgeworICAgICAgaWYgKCsrX19wID09IF9fbGFzdDIpCisgICAgICAgIHJldHVybiBfX2ZpcnN0MTsKKyAgICAgIGlmICgrK19fY3VycmVudCA9PSBfX2xhc3QxKQorICAgICAgICByZXR1cm4gX19sYXN0MTsKKyAgICB9CisgICAgKytfX2ZpcnN0MTsKKyAgfQorICByZXR1cm4gX19maXJzdDE7Cit9CisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX0lzQ2hhckxpa2VUeXBlCit7IHR5cGVkZWYgX19mYWxzZV90eXBlIF9SZXQ7IH07CisKK19TVExQX1RFTVBMQVRFX05VTEwgc3RydWN0IF9Jc0NoYXJMaWtlVHlwZTxjaGFyPgoreyB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9SZXQ7IH07CisKK19TVExQX1RFTVBMQVRFX05VTEwgc3RydWN0IF9Jc0NoYXJMaWtlVHlwZTx1bnNpZ25lZCBjaGFyPgoreyB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9SZXQ7IH07CisKKyMgIGlmbmRlZiBfU1RMUF9OT19TSUdORURfQlVJTFRJTlMKK19TVExQX1RFTVBMQVRFX05VTEwgc3RydWN0IF9Jc0NoYXJMaWtlVHlwZTxzaWduZWQgY2hhcj4KK3sgdHlwZWRlZiBfX3RydWVfdHlwZSBfUmV0OyB9OworIyAgZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9UcDEsIGNsYXNzIF9UcDI+CitpbmxpbmUgYm9vbCBfX3N0bHBfZXEoX1RwMSBfX3ZhbDEsIF9UcDIgX192YWwyKQoreyByZXR1cm4gX192YWwxID09IF9fdmFsMjsgfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSKQordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBib29sIF9fc3RscF9lcShfVHAsIF9UcCkKK3sgcmV0dXJuIHRydWU7IH0KKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfVHAyLCBjbGFzcyBfUHJlZGljYXRlPgoraW5saW5lIF9JbnB1dEl0ZXIgX19maW5kX2ZpcnN0X29mX2F1eDIoX0lucHV0SXRlciBfX2ZpcnN0MSwgX0lucHV0SXRlciBfX2xhc3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyIF9fZmlyc3QyLCBfRm9yd2FyZEl0ZXIgX19sYXN0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9UcDIqLCBfUHJlZGljYXRlIF9fcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKiBfVXNlU3RyY3Nwbkxpa2VBbGdvICovKSB7CisgIHVuc2lnbmVkIGNoYXIgX19oaW50c1soVUNIQVJfTUFYICsgMSkgLyBDSEFSX0JJVF07CisgIG1lbXNldChfX2hpbnRzLCAwLCBzaXplb2YoX19oaW50cykgLyBzaXplb2YodW5zaWduZWQgY2hhcikpOworICBmb3IgKDsgX19maXJzdDIgIT0gX19sYXN0MjsgKytfX2ZpcnN0MikgeworICAgIHVuc2lnbmVkIGNoYXIgX190bXAgPSAodW5zaWduZWQgY2hhcikqX19maXJzdDI7CisgICAgX19oaW50c1tfX3RtcCAvIENIQVJfQklUXSB8PSAoMSA8PCAoX190bXAgJSBDSEFSX0JJVCkpOworICB9CisKKyAgZm9yICg7IF9fZmlyc3QxICE9IF9fbGFzdDE7ICsrX19maXJzdDEpIHsKKyAgICBfVHAyIF9fdG1wID0gKF9UcDIpKl9fZmlyc3QxOworICAgIGlmIChfX3N0bHBfZXEoKl9fZmlyc3QxLCBfX3RtcCkgJiYKKyAgICAgICAgX19wcmVkKChfX2hpbnRzWyh1bnNpZ25lZCBjaGFyKV9fdG1wIC8gQ0hBUl9CSVRdICYgKDEgPDwgKCh1bnNpZ25lZCBjaGFyKV9fdG1wICUgQ0hBUl9CSVQpKSkgIT0gMCkpCisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gX19maXJzdDE7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9UcDIsIGNsYXNzIF9QcmVkaWNhdGU+CitpbmxpbmUgX0lucHV0SXRlciBfX2ZpbmRfZmlyc3Rfb2ZfYXV4MihfSW5wdXRJdGVyIF9fZmlyc3QxLCBfSW5wdXRJdGVyIF9fbGFzdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXIgX19maXJzdDIsIF9Gb3J3YXJkSXRlciBfX2xhc3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1RwMiogLyogX19kdW1teSAqLywgX1ByZWRpY2F0ZSAvKiBfX3ByZWQgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qIF9Vc2VTdHJjc3BuTGlrZUFsZ28gKi8pIHsKKyAgcmV0dXJuIF9TVExQX1BSSVYgX19maW5kX2ZpcnN0X29mKF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0MiwgX19sYXN0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX19lcXVhbF90byhfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QxLCBfSW5wdXRJdGVyKSkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfVHAxLCBjbGFzcyBfVHAyPgoraW5saW5lIF9JbnB1dEl0ZXIgX19maW5kX2ZpcnN0X29mX2F1eDEoX0lucHV0SXRlciBfX2ZpcnN0MSwgX0lucHV0SXRlciBfX2xhc3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyIF9fZmlyc3QyLCBfRm9yd2FyZEl0ZXIgX19sYXN0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9UcDEqIF9fcHQxLCBfVHAyKiBfX3B0MikgeworICB0eXBlZGVmIF9TVExQX1RZUEVOQU1FIF9TVExQX1NURDo6X0lzSW50ZWdyYWw8X1RwMT46Ol9SZXQgX0lzSW50ZWdyYWw7CisgIHR5cGVkZWYgX1NUTFBfVFlQRU5BTUUgX1NUTFBfUFJJViBfSXNDaGFyTGlrZVR5cGU8X1RwMj46Ol9SZXQgX0lzQ2hhckxpa2U7CisgIHR5cGVkZWYgX1NUTFBfVFlQRU5BTUUgX1NUTFBfU1REOjpfTGFuZDI8X0lzSW50ZWdyYWwsIF9Jc0NoYXJMaWtlPjo6X1JldCBfVXNlU3RyY3Nwbkxpa2VBbGdvOworICByZXR1cm4gX1NUTFBfUFJJViBfX2ZpbmRfZmlyc3Rfb2ZfYXV4MihfX2ZpcnN0MSwgX19sYXN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19maXJzdDIsIF9fbGFzdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcHQyLCBfSWRlbnRpdHk8Ym9vbD4oKSwgX1VzZVN0cmNzcG5MaWtlQWxnbygpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9Gb3J3YXJkSXRlcj4KK2lubGluZSBfSW5wdXRJdGVyIF9fZmluZF9maXJzdF9vZihfSW5wdXRJdGVyIF9fZmlyc3QxLCBfSW5wdXRJdGVyIF9fbGFzdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyIF9fZmlyc3QyLCBfRm9yd2FyZEl0ZXIgX19sYXN0MikgeworICByZXR1cm4gX1NUTFBfUFJJViBfX2ZpbmRfZmlyc3Rfb2ZfYXV4MShfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIsIF9fbGFzdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1ZBTFVFX1RZUEUoX19maXJzdDEsIF9JbnB1dEl0ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QyLCBfRm9yd2FyZEl0ZXIpKTsKK30KKworLy8gZmluZF9maXJzdF9vZiwgd2l0aCBhbmQgd2l0aG91dCBhbiBleHBsaWNpdGx5IHN1cHBsaWVkIGNvbXBhcmlzb24gZnVuY3Rpb24uCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfQmluYXJ5UHJlZGljYXRlPgorX0lucHV0SXRlciBfX2ZpbmRfZmlyc3Rfb2YoX0lucHV0SXRlciBfX2ZpcnN0MSwgX0lucHV0SXRlciBfX2xhc3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyIF9fZmlyc3QyLCBfRm9yd2FyZEl0ZXIgX19sYXN0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CaW5hcnlQcmVkaWNhdGUgX19jb21wKSB7CisgIGZvciAoIDsgX19maXJzdDEgIT0gX19sYXN0MTsgKytfX2ZpcnN0MSkgeworICAgIGZvciAoX0ZvcndhcmRJdGVyIF9faXRlciA9IF9fZmlyc3QyOyBfX2l0ZXIgIT0gX19sYXN0MjsgKytfX2l0ZXIpIHsKKyAgICAgIGlmIChfX2NvbXAoKl9fZmlyc3QxLCAqX19pdGVyKSkgeworICAgICAgICByZXR1cm4gX19maXJzdDE7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBfX2xhc3QxOworfQorCisvLyBmaW5kX2VuZCwgd2l0aCBhbmQgd2l0aG91dCBhbiBleHBsaWNpdGx5IHN1cHBsaWVkIGNvbXBhcmlzb24gZnVuY3Rpb24uCisvLyBTZWFyY2ggW2ZpcnN0MiwgbGFzdDIpIGFzIGEgc3Vic2VxdWVuY2UgaW4gW2ZpcnN0MSwgbGFzdDEpLCBhbmQgcmV0dXJuCisvLyB0aGUgKmxhc3QqIHBvc3NpYmxlIG1hdGNoLiAgTm90ZSB0aGF0IGZpbmRfZW5kIGZvciBiaWRpcmVjdGlvbmFsIGl0ZXJhdG9ycworLy8gaXMgbXVjaCBmYXN0ZXIgdGhhbiBmb3IgZm9yd2FyZCBpdGVyYXRvcnMuCisKKy8vIGZpbmRfZW5kIGZvciBmb3J3YXJkIGl0ZXJhdG9ycy4KK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIxLCBjbGFzcyBfRm9yd2FyZEl0ZXIyLAorICBjbGFzcyBfQmluYXJ5UHJlZGljYXRlPgorX0ZvcndhcmRJdGVyMSBfX2ZpbmRfZW5kKF9Gb3J3YXJkSXRlcjEgX19maXJzdDEsIF9Gb3J3YXJkSXRlcjEgX19sYXN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXIyIF9fZmlyc3QyLCBfRm9yd2FyZEl0ZXIyIF9fbGFzdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9yd2FyZF9pdGVyYXRvcl90YWcgJiwgY29uc3QgZm9yd2FyZF9pdGVyYXRvcl90YWcgJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfQmluYXJ5UHJlZGljYXRlIF9fY29tcCkgeworICBpZiAoX19maXJzdDIgPT0gX19sYXN0MikKKyAgICByZXR1cm4gX19sYXN0MTsKKyAgZWxzZSB7CisgICAgX0ZvcndhcmRJdGVyMSBfX3Jlc3VsdCA9IF9fbGFzdDE7CisgICAgZm9yICg7OykgeworICAgICAgX0ZvcndhcmRJdGVyMSBfX25ld19yZXN1bHQgPSBfU1RMUF9TVEQ6OnNlYXJjaChfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIsIF9fbGFzdDIsIF9fY29tcCk7CisgICAgICBpZiAoX19uZXdfcmVzdWx0ID09IF9fbGFzdDEpCisgICAgICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgICAgIGVsc2UgeworICAgICAgICBfX3Jlc3VsdCA9IF9fbmV3X3Jlc3VsdDsKKyAgICAgICAgX19maXJzdDEgPSBfX25ld19yZXN1bHQ7CisgICAgICAgICsrX19maXJzdDE7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCisvLyBmaW5kX2VuZCBmb3IgYmlkaXJlY3Rpb25hbCBpdGVyYXRvcnMuICBSZXF1aXJlcyBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uLgorI2lmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pCisKKyMgIGlmbmRlZiBfU1RMUF9JTlRFUk5BTF9JVEVSQVRPUl9ICitfU1RMUF9FTkRfTkFNRVNQQUNFCisjICAgIGluY2x1ZGUgPHN0bC9faXRlcmF0b3IuaD4KK19TVExQX0JFR0lOX05BTUVTUEFDRQorIyAgZW5kaWYgLypfU1RMUF9JTlRFUk5BTF9JVEVSQVRPUl9IKi8KKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyMSwgY2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyMiwKKyAgICAgICAgICBjbGFzcyBfQmluYXJ5UHJlZGljYXRlPgorX0JpZGlyZWN0aW9uYWxJdGVyMQorX19maW5kX2VuZChfQmlkaXJlY3Rpb25hbEl0ZXIxIF9fZmlyc3QxLCBfQmlkaXJlY3Rpb25hbEl0ZXIxIF9fbGFzdDEsCisgICAgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlcjIgX19maXJzdDIsIF9CaWRpcmVjdGlvbmFsSXRlcjIgX19sYXN0MiwKKyAgICAgICAgICAgY29uc3QgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgJiwgY29uc3QgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgJiwKKyAgICAgICAgICAgX0JpbmFyeVByZWRpY2F0ZSBfX2NvbXApIHsKKyAgdHlwZWRlZiBfU1RMUF9TVEQ6OnJldmVyc2VfaXRlcmF0b3I8X0JpZGlyZWN0aW9uYWxJdGVyMT4gX1Jldkl0ZXIxOworICB0eXBlZGVmIF9TVExQX1NURDo6cmV2ZXJzZV9pdGVyYXRvcjxfQmlkaXJlY3Rpb25hbEl0ZXIyPiBfUmV2SXRlcjI7CisKKyAgX1Jldkl0ZXIxIF9fcmxhc3QxKF9fZmlyc3QxKTsKKyAgX1Jldkl0ZXIyIF9fcmxhc3QyKF9fZmlyc3QyKTsKKyAgX1Jldkl0ZXIxIF9fcnJlc3VsdCA9IF9TVExQX1NURDo6c2VhcmNoKF9SZXZJdGVyMShfX2xhc3QxKSwgX19ybGFzdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUmV2SXRlcjIoX19sYXN0MiksIF9fcmxhc3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19jb21wKTsKKworICBpZiAoX19ycmVzdWx0ID09IF9fcmxhc3QxKQorICAgIHJldHVybiBfX2xhc3QxOworICBlbHNlIHsKKyAgICBfQmlkaXJlY3Rpb25hbEl0ZXIxIF9fcmVzdWx0ID0gX19ycmVzdWx0LmJhc2UoKTsKKyAgICBfU1RMUF9TVEQ6OmFkdmFuY2UoX19yZXN1bHQsIC1fU1RMUF9TVEQ6OmRpc3RhbmNlKF9fZmlyc3QyLCBfX2xhc3QyKSk7CisgICAgcmV0dXJuIF9fcmVzdWx0OworICB9Cit9CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorI2VuZGlmIC8qIF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04gKi8KKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcjEsIGNsYXNzIF9Gb3J3YXJkSXRlcjIsCisgICAgICAgICAgY2xhc3MgX0JpbmFyeVByZWRpY2F0ZT4KK19Gb3J3YXJkSXRlcjEKK2ZpbmRfZW5kKF9Gb3J3YXJkSXRlcjEgX19maXJzdDEsIF9Gb3J3YXJkSXRlcjEgX19sYXN0MSwKKyAgICAgICAgIF9Gb3J3YXJkSXRlcjIgX19maXJzdDIsIF9Gb3J3YXJkSXRlcjIgX19sYXN0MiwKKyAgICAgICAgIF9CaW5hcnlQcmVkaWNhdGUgX19jb21wKSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0MSwgX19sYXN0MSkpCisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0MiwgX19sYXN0MikpCisgIHJldHVybiBfU1RMUF9QUklWIF9fZmluZF9lbmQoX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLCBfX2xhc3QyLAorI2lmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfSVRFUkFUT1JfQ0FURUdPUlkoX19maXJzdDEsIF9Gb3J3YXJkSXRlcjEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9fZmlyc3QyLCBfRm9yd2FyZEl0ZXIyKSwKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yd2FyZF9pdGVyYXRvcl90YWcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3J3YXJkX2l0ZXJhdG9yX3RhZygpLAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19jb21wKTsKK30KKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlMSwgY2xhc3MgX0NvbXBhcmUyLCBjbGFzcyBfRGlzdGFuY2U+CitfRm9yd2FyZEl0ZXIgX19sb3dlcl9ib3VuZChfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwgY29uc3QgX1RwJiBfX3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Db21wYXJlMSBfX2NvbXAxLCBfQ29tcGFyZTIgX19jb21wMiwgX0Rpc3RhbmNlKikgeworICBfRGlzdGFuY2UgX19sZW4gPSBfU1RMUF9TVEQ6OmRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7CisgIF9EaXN0YW5jZSBfX2hhbGY7CisgIF9Gb3J3YXJkSXRlciBfX21pZGRsZTsKKworICB3aGlsZSAoX19sZW4gPiAwKSB7CisgICAgX19oYWxmID0gX19sZW4gPj4gMTsKKyAgICBfX21pZGRsZSA9IF9fZmlyc3Q7CisgICAgX1NUTFBfU1REOjphZHZhbmNlKF9fbWlkZGxlLCBfX2hhbGYpOworICAgIGlmIChfX2NvbXAxKCpfX21pZGRsZSwgX192YWwpKSB7CisgICAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghX19jb21wMihfX3ZhbCwgKl9fbWlkZGxlKSwgX1N0bE1zZ19JTlZBTElEX1NUUklDVF9XRUFLX1BSRURJQ0FURSkKKyAgICAgIF9fZmlyc3QgPSBfX21pZGRsZTsKKyAgICAgICsrX19maXJzdDsKKyAgICAgIF9fbGVuID0gX19sZW4gLSBfX2hhbGYgLSAxOworICAgIH0KKyAgICBlbHNlCisgICAgICBfX2xlbiA9IF9faGFsZjsKKyAgfQorICByZXR1cm4gX19maXJzdDsKK30KKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2VuZGlmIC8qIF9TVExQX0FMR09CQVNFX0MgKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL19hbGdvYmFzZS5oIGIvc3RscG9ydC9zdGwvX2FsZ29iYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk3ZGNiZQotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc3RsL19hbGdvYmFzZS5oCkBAIC0wLDAgKzEsNzI4IEBACisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworLyogTk9URTogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgU1RMIGhlYWRlcnMuCisgKiAgIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LgorICovCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQUxHT0JBU0VfSAorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9BTEdPQkFTRV9ICisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1NURERFRgorIyAgaW5jbHVkZSA8c3RsL19jc3RkZGVmLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DU1RSSU5HCisjICBpbmNsdWRlIDxzdGwvX2NzdHJpbmcuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0NMSU1JVFMKKyMgIGluY2x1ZGUgPGNsaW1pdHM+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DU1RETElCCisjICBpbmNsdWRlIDxzdGwvX2NzdGRsaWIuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX1BBSVJfSAorIyAgaW5jbHVkZSA8c3RsL19wYWlyLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9JVEVSQVRPUl9CQVNFX0gKKyMgIGluY2x1ZGUgPHN0bC9faXRlcmF0b3JfYmFzZS5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfVFlQRV9UUkFJVFNfSAorIyAgaW5jbHVkZSA8c3RsL3R5cGVfdHJhaXRzLmg+CisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUEFSVElBTF9TUEVDX1dPUktBUk9VTkQpICYmICFkZWZpbmVkIChfU1RMUF9GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIpCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIHZvaWQgX19zd2FwX2F1eChfVHAmIF9fYSwgX1RwJiBfX2IsIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKlN3YXBJbXBsZW1lbnRlZCovKSB7CisgIF9fYS5fTV9zd2FwX3dvcmthcm91bmQoX19iKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSB2b2lkIF9fc3dhcF9hdXgoX1RwJiBfX2EsIF9UcCYgX19iLCBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qU3dhcEltcGxlbWVudGVkKi8pIHsKKyAgX1RwIF9fdG1wID0gX19hOworICBfX2EgPSBfX2I7CisgIF9fYiA9IF9fdG1wOworfQorX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisjZW5kaWYKKworLy8gc3dhcCBhbmQgaXRlcl9zd2FwCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIHZvaWQgc3dhcChfVHAmIF9fYSwgX1RwJiBfX2IpIHsKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUEFSVElBTF9TUEVDX1dPUktBUk9VTkQpICYmICFkZWZpbmVkIChfU1RMUF9GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIpCisjICBpZiAhZGVmaW5lZChfX0JPUkxBTkRDX18pCisgIHR5cGVkZWYgdHlwZW5hbWUgX1N3YXBJbXBsZW1lbnRlZDxfVHA+OjpfUmV0IF9JbXBsZW1lbnRlZDsKKyMgIGVsc2UKKyAgZW51bSB7IF9JcyA9IF9Td2FwSW1wbGVtZW50ZWQ8X1RwPjo6X0lzIH07CisgIHR5cGVkZWYgdHlwZW5hbWUgX19ib29sMnR5cGU8X0lzPjo6X1JldCBfSW1wbGVtZW50ZWQ7CisjICBlbmRpZgorICBfU1RMUF9QUklWIF9fc3dhcF9hdXgoX19hLCBfX2IsIF9JbXBsZW1lbnRlZCgpKTsKKyNlbHNlCisgIF9UcCBfX3RtcCA9IF9fYTsKKyAgX19hID0gX19iOworICBfX2IgPSBfX3RtcDsKKyNlbmRpZgorfQorCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIxLCBjbGFzcyBfRm9yd2FyZEl0ZXIyLCBjbGFzcyBfVmFsdWU+CitpbmxpbmUgdm9pZCBfX2l0ZXJfc3dhcF9hdXhfYXV4KF9Gb3J3YXJkSXRlcjEmIF9faTEsIF9Gb3J3YXJkSXRlcjImIF9faTIsIF9WYWx1ZSAqKSB7CisgIF9WYWx1ZSB0bXAgPSAqX19pMTsKKyAgKl9faTEgPSAqX19pMjsKKyAgKl9faTIgPSB0bXA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIxLCBjbGFzcyBfRm9yd2FyZEl0ZXIyPgoraW5saW5lIHZvaWQgX19pdGVyX3N3YXBfYXV4KF9Gb3J3YXJkSXRlcjEmIF9faTEsIF9Gb3J3YXJkSXRlcjImIF9faTIsIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKk9LVG9Td2FwKi8pIHsKKyAgLyogbmFtZXNwYWNlIHNwZWNpZmljYXRpb24gYnJlYWtzIGFjY2VzcyB0byB0aGUgcmlnaHQgc3dhcCB0ZW1wbGF0ZSBvdmVybG9hZCAoYXQgbGVhc3QgZm9yIGdjYykgKi8KKyAgLypfU1RMUF9TVEQ6OiovIHN3YXAoKl9faTEsICpfX2kyKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcjEsIGNsYXNzIF9Gb3J3YXJkSXRlcjI+CitpbmxpbmUgdm9pZCBfX2l0ZXJfc3dhcF9hdXgoX0ZvcndhcmRJdGVyMSYgX19pMSwgX0ZvcndhcmRJdGVyMiYgX19pMiwgY29uc3QgX19mYWxzZV90eXBlJiAvKk9LVG9Td2FwKi8pIHsKKyAgX1NUTFBfUFJJViBfX2l0ZXJfc3dhcF9hdXhfYXV4KCBfX2kxLCBfX2kyLCBfU1RMUF9WQUxVRV9UWVBFKF9faTEsX0ZvcndhcmRJdGVyMSkgKTsKK30KKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIxLCBjbGFzcyBfRm9yd2FyZEl0ZXIyPgoraW5saW5lIHZvaWQgaXRlcl9zd2FwKF9Gb3J3YXJkSXRlcjEgX19pMSwgX0ZvcndhcmRJdGVyMiBfX2kyKSB7CisgIF9TVExQX1BSSVYgX19pdGVyX3N3YXBfYXV4KCBfX2kxLCBfX2kyLCBfSXNPS1RvU3dhcChfU1RMUF9WQUxVRV9UWVBFKF9faTEsIF9Gb3J3YXJkSXRlcjEpLCBfU1RMUF9WQUxVRV9UWVBFKF9faTIsIF9Gb3J3YXJkSXRlcjIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfSVNfUkVGX1RZUEVfUkVBTF9SRUYoX19pMSwgX0ZvcndhcmRJdGVyMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9JU19SRUZfVFlQRV9SRUFMX1JFRihfX2kyLCBfRm9yd2FyZEl0ZXIyKSkuX0Fuc3dlcigpKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbWluIGFuZCBtYXgKKworI2lmICFkZWZpbmVkIChfX0JPUkxBTkRDX18pIHx8IGRlZmluZWQgKF9TVExQX1VTRV9PV05fTkFNRVNQQUNFKQorIyAgaWYgKGRlZmluZWQgKF9fQk9STEFORENfXykgJiYgKF9fQk9STEFORENfXyA8IDB4NTgwKSkgJiYgIWRlZmluZWQgKF9fU1REQ19fKQorLy9JbiBub3QgQU5TSSBtb2RlIEJvcmxhbmQgaW1wb3J0IG1pbi9tYXggaW4gZ2xvYmFsIG5hbWVzcGFjZSB3aGljaCBjb25mbGljdAorLy93aXRoIFNUTHBvcnQgbWluL21heCB3aGVuIHVzZXIgZG9lcyBhICd1c2luZyBuYW1lc3BhY2Ugc3RkJyBpbiBpdHMgY29kZQorLy8oc2VlIHRlc3QvdW5pdC9hbGdfdGVzdC5jcHApLiBUbyBhdm9pZCB0aGlzIGNsYXNoIHdlIHNpbXBseSBpbXBvcnQgQm9ybGFuZCBtaW4vbWF4CisvL2luIFNUTHBvcnQgbmFtZXNwYWNlLgordXNpbmcgX1NUTFBfVkVORE9SX1NURDo6bWluOwordXNpbmcgX1NUTFBfVkVORE9SX1NURDo6bWF4OworIyAgZWxzZQordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBjb25zdCBfVHAmIChtaW4pKGNvbnN0IF9UcCYgX19hLCBjb25zdCBfVHAmIF9fYikgeyByZXR1cm4gX19iIDwgX19hID8gX19iIDogX19hOyB9Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIGNvbnN0IF9UcCYgKG1heCkoY29uc3QgX1RwJiBfX2EsIGNvbnN0IF9UcCYgX19iKSB7ICByZXR1cm4gIF9fYSA8IF9fYiA/IF9fYiA6IF9fYTsgfQorIyAgZW5kaWYKKyNlbmRpZgorCisjIGlmIGRlZmluZWQgKF9fQk9STEFORENfXykgJiYgZGVmaW5lZCAoX1NUTFBfVVNFX09XTl9OQU1FU1BBQ0UpCitpbmxpbmUgdW5zaWduZWQgbG9uZyAobWluKSAodW5zaWduZWQgbG9uZyBfX2EsIHVuc2lnbmVkIGxvbmcgX19iKSB7IHJldHVybiBfX2IgPCBfX2EgPyBfX2IgOiBfX2E7IH0KK2lubGluZSB1bnNpZ25lZCBsb25nIChtYXgpICh1bnNpZ25lZCBsb25nIF9fYSwgdW5zaWduZWQgbG9uZyBfX2IpIHsgIHJldHVybiAgX19hIDwgX19iID8gX19iIDogX19hOyB9CisjIGVuZGlmCisKKyMgIGlmICFkZWZpbmVkIChfX0JPUkxBTkRDX18pIHx8IChfX0JPUkxBTkRDX18gPCAweDU5MCkKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlPgoraW5saW5lIGNvbnN0IF9UcCYgKG1pbikoY29uc3QgX1RwJiBfX2EsIGNvbnN0IF9UcCYgX19iLCBfQ29tcGFyZSBfX2NvbXApIHsKKyAgcmV0dXJuIF9fY29tcChfX2IsIF9fYSkgPyBfX2IgOiBfX2E7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlPgoraW5saW5lIGNvbnN0IF9UcCYgKG1heCkoY29uc3QgX1RwJiBfX2EsIGNvbnN0IF9UcCYgX19iLCBfQ29tcGFyZSBfX2NvbXApIHsKKyAgcmV0dXJuIF9fY29tcChfX2EsIF9fYikgPyBfX2IgOiBfX2E7Cit9CisjICBlbHNlCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZT4KK2lubGluZSBjb25zdCBfVHAgKG1pbikoY29uc3QgX1RwIF9fYSwgY29uc3QgX1RwIF9fYiwgX0NvbXBhcmUgX19jb21wKSB7CisgIHJldHVybiBfX2NvbXAoX19iLCBfX2EpID8gX19iIDogX19hOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZT4KK2lubGluZSBjb25zdCBfVHAgKG1heCkoY29uc3QgX1RwIF9fYSwgY29uc3QgX1RwIF9fYiwgX0NvbXBhcmUgX19jb21wKSB7CisgIHJldHVybiBfX2NvbXAoX19hLCBfX2IpID8gX19iIDogX19hOworfQorIyAgZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29weQorCisvLyBBbGwgb2YgdGhlc2UgYXV4aWxpYXJ5IGZ1bmN0aW9ucyBzZXJ2ZSB0d28gcHVycG9zZXMuICAoMSkgUmVwbGFjZQorLy8gY2FsbHMgdG8gY29weSB3aXRoIG1lbW1vdmUgd2hlbmV2ZXIgcG9zc2libGUuICAoTWVtbW92ZSwgbm90IG1lbWNweSwKKy8vIGJlY2F1c2UgdGhlIGlucHV0IGFuZCBvdXRwdXQgcmFuZ2VzIGFyZSBwZXJtaXR0ZWQgdG8gb3ZlcmxhcC4pCisvLyAoMikgSWYgd2UncmUgdXNpbmcgcmFuZG9tIGFjY2VzcyBpdGVyYXRvcnMsIHRoZW4gd3JpdGUgdGhlIGxvb3AgYXMKKy8vIGEgZm9yIGxvb3Agd2l0aCBhbiBleHBsaWNpdCBjb3VudC4KKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX091dHB1dEl0ZXIsIGNsYXNzIF9EaXN0YW5jZT4KK2lubGluZSBfT3V0cHV0SXRlciBfX2NvcHkoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXIgX19yZXN1bHQsIGNvbnN0IGlucHV0X2l0ZXJhdG9yX3RhZyAmLCBfRGlzdGFuY2UqKSB7CisgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19yZXN1bHQsICsrX19maXJzdCkKKyAgICAqX19yZXN1bHQgPSAqX19maXJzdDsKKyAgcmV0dXJuIF9fcmVzdWx0OworfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfTk9OVEVNUExfQkFTRV9NQVRDSF9CVUcpCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX091dHB1dEl0ZXIsIGNsYXNzIF9EaXN0YW5jZT4KK2lubGluZSBfT3V0cHV0SXRlciBfX2NvcHkoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXIgX19yZXN1bHQsIGNvbnN0IGZvcndhcmRfaXRlcmF0b3JfdGFnICYsIF9EaXN0YW5jZSogKSB7CisgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19yZXN1bHQsICsrX19maXJzdCkKKyAgICAqX19yZXN1bHQgPSAqX19maXJzdDsKKyAgcmV0dXJuIF9fcmVzdWx0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX091dHB1dEl0ZXIsIGNsYXNzIF9EaXN0YW5jZT4KK2lubGluZSBfT3V0cHV0SXRlciBfX2NvcHkoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXIgX19yZXN1bHQsIGNvbnN0IGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnICYsIF9EaXN0YW5jZSogKSB7CisgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19yZXN1bHQsICsrX19maXJzdCkKKyAgICAqX19yZXN1bHQgPSAqX19maXJzdDsKKyAgcmV0dXJuIF9fcmVzdWx0OworfQorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX091dHB1dEl0ZXIsIGNsYXNzIF9EaXN0YW5jZT4KK2lubGluZSBfT3V0cHV0SXRlcgorX19jb3B5KF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwKKyAgICAgICBfT3V0cHV0SXRlciBfX3Jlc3VsdCwgY29uc3QgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgJiwgX0Rpc3RhbmNlKikgeworICBmb3IgKF9EaXN0YW5jZSBfX24gPSBfX2xhc3QgLSBfX2ZpcnN0OyBfX24gPiAwOyAtLV9fbikgeworICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0OworICAgICsrX19maXJzdDsKKyAgICArK19fcmVzdWx0OworICB9CisgIHJldHVybiBfX3Jlc3VsdDsKK30KKworaW5saW5lIHZvaWQqCitfX2NvcHlfdHJpdmlhbChjb25zdCB2b2lkKiBfX2ZpcnN0LCBjb25zdCB2b2lkKiBfX2xhc3QsIHZvaWQqIF9fcmVzdWx0KSB7CisgIHNpemVfdCBfX24gPSAoY29uc3QgY2hhciopX19sYXN0IC0gKGNvbnN0IGNoYXIqKV9fZmlyc3Q7CisgIHJldHVybiBfX24gPyAodm9pZCAqKSgoY2hhciopbWVtbW92ZShfX3Jlc3VsdCwgX19maXJzdCwgX19uKSArIF9fbikgOiBfX3Jlc3VsdDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29weV9iYWNrd2FyZCBhdXhpbGlhcnkgZnVuY3Rpb25zCisKK3RlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXIxLCBjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXIyLAorICAgICAgICAgIGNsYXNzIF9EaXN0YW5jZT4KK2lubGluZSBfQmlkaXJlY3Rpb25hbEl0ZXIyIF9fY29weV9iYWNrd2FyZChfQmlkaXJlY3Rpb25hbEl0ZXIxIF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyMSBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyMiBfX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZyAmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EaXN0YW5jZSopIHsKKyAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0KQorICAgICotLV9fcmVzdWx0ID0gKi0tX19sYXN0OworICByZXR1cm4gX19yZXN1bHQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyLCBjbGFzcyBfRGlzdGFuY2U+CitpbmxpbmUgX0JpZGlyZWN0aW9uYWxJdGVyIF9fY29weV9iYWNrd2FyZChfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyIF9fcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EaXN0YW5jZSopIHsKKyAgZm9yIChfRGlzdGFuY2UgX19uID0gX19sYXN0IC0gX19maXJzdDsgX19uID4gMDsgLS1fX24pCisgICAgKi0tX19yZXN1bHQgPSAqLS1fX2xhc3Q7CisgIHJldHVybiBfX3Jlc3VsdDsKK30KKworaW5saW5lIHZvaWQqCitfX2NvcHlfdHJpdmlhbF9iYWNrd2FyZChjb25zdCB2b2lkKiBfX2ZpcnN0LCBjb25zdCB2b2lkKiBfX2xhc3QsIHZvaWQqIF9fcmVzdWx0KSB7CisgIGNvbnN0IHB0cmRpZmZfdCBfTnVtID0gKGNvbnN0IGNoYXIqKV9fbGFzdCAtIChjb25zdCBjaGFyKilfX2ZpcnN0OworICByZXR1cm4gKF9OdW0gPiAwKSA/IG1lbW1vdmUoKGNoYXIqKV9fcmVzdWx0IC0gX051bSwgX19maXJzdCwgX051bSkgOiBfX3Jlc3VsdCA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfT3V0cHV0SXRlcj4KK2lubGluZSBfT3V0cHV0SXRlciBfX2NvcHlfcHRycyhfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LCBfT3V0cHV0SXRlciBfX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qSXNPS1RvTWVtQ3B5Ki8pIHsKKyAgcmV0dXJuIF9TVExQX1BSSVYgX19jb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQsIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKCksIChwdHJkaWZmX3QqKTApOworfQordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9PdXRwdXRJdGVyPgoraW5saW5lIF9PdXRwdXRJdGVyIF9fY29weV9wdHJzKF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsIF9PdXRwdXRJdGVyIF9fcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKklzT0tUb01lbUNweSovKSB7CisgIC8vIHdlIGtub3cgdGhleSBhbGwgcG9pbnRlcnMsIHNvIHRoaXMgY2FzdCBpcyBPSworICAvLyAgcmV0dXJuIChfT3V0cHV0SXRlcilfX2NvcHlfdHJpdmlhbCgmKCpfX2ZpcnN0KSwgJigqX19sYXN0KSwgJigqX19yZXN1bHQpKTsKKyAgcmV0dXJuIChfT3V0cHV0SXRlcilfU1RMUF9QUklWIF9fY29weV90cml2aWFsKF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX091dHB1dEl0ZXI+CitpbmxpbmUgX091dHB1dEl0ZXIgX19jb3B5X2F1eChfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LCBfT3V0cHV0SXRlciBfX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKkJvdGhQdHJUeXBlKi8pIHsKKyAgcmV0dXJuIF9TVExQX1BSSVYgX19jb3B5X3B0cnMoX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1VzZVRyaXZpYWxDb3B5KF9TVExQX1ZBTFVFX1RZUEUoX19maXJzdCwgX0lucHV0SXRlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9WQUxVRV9UWVBFKF9fcmVzdWx0LCBfT3V0cHV0SXRlcikpLl9BbnN3ZXIoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfT3V0cHV0SXRlcj4KK2lubGluZSBfT3V0cHV0SXRlciBfX2NvcHlfYXV4KF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsIF9PdXRwdXRJdGVyIF9fcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19mYWxzZV90eXBlJiAvKkJvdGhQdHJUeXBlKi8pIHsKKyAgcmV0dXJuIF9TVExQX1BSSVYgX19jb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9JVEVSQVRPUl9DQVRFR09SWShfX2ZpcnN0LCBfSW5wdXRJdGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX0RJU1RBTkNFX1RZUEUoX19maXJzdCwgX0lucHV0SXRlcikpOworfQorCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9PdXRwdXRJdGVyPgoraW5saW5lIF9PdXRwdXRJdGVyIGNvcHkoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwgX091dHB1dEl0ZXIgX19yZXN1bHQpIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgIHJldHVybiBfU1RMUF9QUklWIF9fY29weV9hdXgoX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCwgX0JvdGhQdHJUeXBlPCBfSW5wdXRJdGVyLCBfT3V0cHV0SXRlcj46Ol9BbnN3ZXIoKSk7Cit9CisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9PdXRwdXRJdGVyPgoraW5saW5lIF9PdXRwdXRJdGVyIF9fY29weV9iYWNrd2FyZF9wdHJzKF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXIgX19yZXN1bHQsIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypUcml2aWFsQXNzaWdubWVudCovKSB7CisgIHJldHVybiBfU1RMUF9QUklWIF9fY29weV9iYWNrd2FyZChfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfSVRFUkFUT1JfQ0FURUdPUlkoX19maXJzdCwgX0lucHV0SXRlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9ESVNUQU5DRV9UWVBFKF9fZmlyc3QsIF9JbnB1dEl0ZXIpKTsKK30KK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfT3V0cHV0SXRlcj4KK2lubGluZSBfT3V0cHV0SXRlciBfX2NvcHlfYmFja3dhcmRfcHRycyhfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0LCBjb25zdCBfX3RydWVfdHlwZSYgLypUcml2aWFsQXNzaWdubWVudCovKSB7CisgIHJldHVybiAoX091dHB1dEl0ZXIpX1NUTFBfUFJJViBfX2NvcHlfdHJpdmlhbF9iYWNrd2FyZChfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9PdXRwdXRJdGVyPgoraW5saW5lIF9PdXRwdXRJdGVyIF9fY29weV9iYWNrd2FyZF9hdXgoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwgX091dHB1dEl0ZXIgX19yZXN1bHQsIGNvbnN0IF9fZmFsc2VfdHlwZSYpIHsKKyAgcmV0dXJuIF9TVExQX1BSSVYgX19jb3B5X2JhY2t3YXJkKF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9JVEVSQVRPUl9DQVRFR09SWShfX2ZpcnN0LF9JbnB1dEl0ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfRElTVEFOQ0VfVFlQRShfX2ZpcnN0LCBfSW5wdXRJdGVyKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfT3V0cHV0SXRlcj4KK2lubGluZSBfT3V0cHV0SXRlciBfX2NvcHlfYmFja3dhcmRfYXV4KF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsIF9PdXRwdXRJdGVyIF9fcmVzdWx0LCBjb25zdCBfX3RydWVfdHlwZSYpIHsKKyAgcmV0dXJuIF9TVExQX1BSSVYgX19jb3B5X2JhY2t3YXJkX3B0cnMoX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1VzZVRyaXZpYWxDb3B5KF9TVExQX1ZBTFVFX1RZUEUoX19maXJzdCwgX0lucHV0SXRlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9WQUxVRV9UWVBFKF9fcmVzdWx0LCBfT3V0cHV0SXRlcikpLl9BbnN3ZXIoKSk7Cit9CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX091dHB1dEl0ZXI+CitpbmxpbmUgX091dHB1dEl0ZXIgY29weV9iYWNrd2FyZChfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LCBfT3V0cHV0SXRlciBfX3Jlc3VsdCkgeworICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKKyAgcmV0dXJuIF9TVExQX1BSSVYgX19jb3B5X2JhY2t3YXJkX2F1eChfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0LCBfQm90aFB0clR5cGU8IF9JbnB1dEl0ZXIsIF9PdXRwdXRJdGVyPjo6X0Fuc3dlcigpICk7Cit9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikgJiYgIWRlZmluZWQgKF9TVExQX1NJTVVMQVRFX1BBUlRJQUxfU1BFQ19GT1JfVFlQRV9UUkFJVFMpCisjICBkZWZpbmUgX1NUTFBfREVDTEFSRV9DT1BZX1RSSVZJQUwoX1RwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2lubGluZSBfVHAqIGNvcHkoY29uc3QgX1RwKiBfX2ZpcnN0LCBjb25zdCBfVHAqIF9fbGFzdCwgX1RwKiBfX3Jlc3VsdCkgICAgICAgICAgXAoreyByZXR1cm4gKF9UcCopX1NUTFBfUFJJViBfX2NvcHlfdHJpdmlhbChfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0KTsgfSAgICAgICAgICBcCitpbmxpbmUgX1RwKiBjb3B5X2JhY2t3YXJkKGNvbnN0IF9UcCogX19maXJzdCwgY29uc3QgX1RwKiBfX2xhc3QsIF9UcCogX19yZXN1bHQpIFwKK3sgcmV0dXJuIChfVHAqKV9TVExQX1BSSVYgX19jb3B5X3RyaXZpYWxfYmFja3dhcmQoX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCk7IH0KKworIyAgaWYgIWRlZmluZWQgKF9TVExQX05PX0JPT0wpCitfU1RMUF9ERUNMQVJFX0NPUFlfVFJJVklBTChib29sKQorIyAgZW5kaWYKK19TVExQX0RFQ0xBUkVfQ09QWV9UUklWSUFMKGNoYXIpCisjICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fU0lHTkVEX0JVSUxUSU5TKQorX1NUTFBfREVDTEFSRV9DT1BZX1RSSVZJQUwoc2lnbmVkIGNoYXIpCisjICBlbmRpZgorX1NUTFBfREVDTEFSRV9DT1BZX1RSSVZJQUwodW5zaWduZWQgY2hhcikKK19TVExQX0RFQ0xBUkVfQ09QWV9UUklWSUFMKHNob3J0KQorX1NUTFBfREVDTEFSRV9DT1BZX1RSSVZJQUwodW5zaWduZWQgc2hvcnQpCitfU1RMUF9ERUNMQVJFX0NPUFlfVFJJVklBTChpbnQpCitfU1RMUF9ERUNMQVJFX0NPUFlfVFJJVklBTCh1bnNpZ25lZCBpbnQpCitfU1RMUF9ERUNMQVJFX0NPUFlfVFJJVklBTChsb25nKQorX1NUTFBfREVDTEFSRV9DT1BZX1RSSVZJQUwodW5zaWduZWQgbG9uZykKKyMgIGlmICFkZWZpbmVkKF9TVExQX05PX1dDSEFSX1QpICYmICFkZWZpbmVkIChfU1RMUF9XQ0hBUl9UX0lTX1VTSE9SVCkKK19TVExQX0RFQ0xBUkVfQ09QWV9UUklWSUFMKHdjaGFyX3QpCisjICBlbmRpZgorIyAgaWYgZGVmaW5lZCAoX1NUTFBfTE9OR19MT05HKQorX1NUTFBfREVDTEFSRV9DT1BZX1RSSVZJQUwoX1NUTFBfTE9OR19MT05HKQorX1NUTFBfREVDTEFSRV9DT1BZX1RSSVZJQUwodW5zaWduZWQgX1NUTFBfTE9OR19MT05HKQorIyAgZW5kaWYKK19TVExQX0RFQ0xBUkVfQ09QWV9UUklWSUFMKGZsb2F0KQorX1NUTFBfREVDTEFSRV9DT1BZX1RSSVZJQUwoZG91YmxlKQorIyAgaWYgIWRlZmluZWQgKF9TVExQX05PX0xPTkdfRE9VQkxFKQorX1NUTFBfREVDTEFSRV9DT1BZX1RSSVZJQUwobG9uZyBkb3VibGUpCisjICBlbmRpZgorIyAgdW5kZWYgX1NUTFBfREVDTEFSRV9DT1BZX1RSSVZJQUwKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb3B5X24gKG5vdCBwYXJ0IG9mIHRoZSBDKysgc3RhbmRhcmQpCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9TaXplLCBjbGFzcyBfT3V0cHV0SXRlcj4KK19TVExQX0lOTElORV9MT09QIF9TVExQX1NURDo6cGFpcjxfSW5wdXRJdGVyLCBfT3V0cHV0SXRlcj4KK19fY29weV9uKF9JbnB1dEl0ZXIgX19maXJzdCwgX1NpemUgX19jb3VudCwgX091dHB1dEl0ZXIgX19yZXN1bHQsCisgICAgICAgICBjb25zdCBpbnB1dF9pdGVyYXRvcl90YWcgJikgeworICBmb3IgKCA7IF9fY291bnQgPiAwOyAtLV9fY291bnQpIHsKKyAgICAqX19yZXN1bHQgPSAqX19maXJzdDsKKyAgICArK19fZmlyc3Q7CisgICAgKytfX3Jlc3VsdDsKKyAgfQorICByZXR1cm4gX1NUTFBfU1REOjpwYWlyPF9JbnB1dEl0ZXIsIF9PdXRwdXRJdGVyPihfX2ZpcnN0LCBfX3Jlc3VsdCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfUkFJdGVyLCBjbGFzcyBfU2l6ZSwgY2xhc3MgX091dHB1dEl0ZXI+CitpbmxpbmUgX1NUTFBfU1REOjpwYWlyPF9SQUl0ZXIsIF9PdXRwdXRJdGVyPgorX19jb3B5X24oX1JBSXRlciBfX2ZpcnN0LCBfU2l6ZSBfX2NvdW50LCBfT3V0cHV0SXRlciBfX3Jlc3VsdCwKKyAgICAgICAgIGNvbnN0IHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnICYpIHsKKyAgX1JBSXRlciBfX2xhc3QgPSBfX2ZpcnN0ICsgX19jb3VudDsKKyAgcmV0dXJuIF9TVExQX1NURDo6cGFpcjxfUkFJdGVyLCBfT3V0cHV0SXRlcj4oX19sYXN0LCBfU1RMUF9TVEQ6OmNvcHkoX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCkpOworfQorCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9TaXplLCBjbGFzcyBfT3V0cHV0SXRlcj4KK2lubGluZSBwYWlyPF9JbnB1dEl0ZXIsIF9PdXRwdXRJdGVyPgorY29weV9uKF9JbnB1dEl0ZXIgX19maXJzdCwgX1NpemUgX19jb3VudCwgX091dHB1dEl0ZXIgX19yZXN1bHQpIHsKKyAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fZmlyc3QpCisgIHJldHVybiBfU1RMUF9QUklWIF9fY29weV9uKF9fZmlyc3QsIF9fY291bnQsIF9fcmVzdWx0LCBfU1RMUF9JVEVSQVRPUl9DQVRFR09SWShfX2ZpcnN0LCBfSW5wdXRJdGVyKSk7Cit9CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZmlsbCBhbmQgZmlsbF9uCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9UcD4KK19TVExQX0lOTElORV9MT09QCit2b2lkIF9fZmlsbF9md2QoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsIGNvbnN0IF9UcCYgX192YWwpIHsKKyAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorICAgICpfX2ZpcnN0ID0gX192YWw7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9UcCwgY2xhc3MgX0Rpc3RhbmNlPgoraW5saW5lIHZvaWQgX19maWxsKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LCBjb25zdCBfVHAmIF9fdmFsLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0X2l0ZXJhdG9yX3RhZyAmLCBfRGlzdGFuY2UqKSB7CisgIF9TVExQX1BSSVYgX19maWxsX2Z3ZChfX2ZpcnN0LCBfX2xhc3QsIF9fdmFsKTsKK30KKworI2lmIGRlZmluZWQgKF9TVExQX05PTlRFTVBMX0JBU0VfTUFUQ0hfQlVHKQordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1RwLCBjbGFzcyBfRGlzdGFuY2U+CitfU1RMUF9JTkxJTkVfTE9PUAordm9pZCBfX2ZpbGwoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsIGNvbnN0IF9UcCYgX192YWwsCisgICAgICAgICAgICBjb25zdCBmb3J3YXJkX2l0ZXJhdG9yX3RhZyAmLCBfRGlzdGFuY2UqKSB7CisgIF9TVExQX1BSSVYgX19maWxsX2Z3ZChfX2ZpcnN0LCBfX2xhc3QsIF9fdmFsKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1RwLCBjbGFzcyBfRGlzdGFuY2U+CitfU1RMUF9JTkxJTkVfTE9PUAordm9pZCBfX2ZpbGwoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsIGNvbnN0IF9UcCYgX192YWwsCisgICAgICAgICAgICBjb25zdCBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZyAmLCBfRGlzdGFuY2UqKSB7CisgIF9TVExQX1BSSVYgX19maWxsX2Z3ZChfX2ZpcnN0LCBfX2xhc3QsIF9fdmFsKTsKK30KKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9UcCwgY2xhc3MgX0Rpc3RhbmNlPgorX1NUTFBfSU5MSU5FX0xPT1AKK3ZvaWQgX19maWxsKF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwgY29uc3QgX1RwJiBfX3ZhbCwKKyAgICAgICAgICAgIGNvbnN0IHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnICYsIF9EaXN0YW5jZSopIHsKKyAgZm9yIChfRGlzdGFuY2UgX19uID0gX19sYXN0IC0gX19maXJzdCA7IF9fbiA+IDA7ICsrX19maXJzdCwgLS1fX24pCisgICAgKl9fZmlyc3QgPSBfX3ZhbDsKK30KKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9UcD4KK2lubGluZSB2b2lkIGZpbGwoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsIGNvbnN0IF9UcCYgX192YWwpIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgIF9TVExQX1BSSVYgX19maWxsKF9fZmlyc3QsIF9fbGFzdCwgX192YWwsCisgICAgICAgICAgICAgICAgICAgIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9fZmlyc3QsIF9Gb3J3YXJkSXRlciksCisgICAgICAgICAgICAgICAgICAgIF9TVExQX0RJU1RBTkNFX1RZUEUoX19maXJzdCwgX0ZvcndhcmRJdGVyKSk7Cit9CisKKy8vIFNwZWNpYWxpemF0aW9uOiBmb3Igb25lLWJ5dGUgdHlwZXMgd2UgY2FuIHVzZSBtZW1zZXQuCitpbmxpbmUgdm9pZCBmaWxsKHVuc2lnbmVkIGNoYXIqIF9fZmlyc3QsIHVuc2lnbmVkIGNoYXIqIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciYgX192YWwpIHsKKyAgdW5zaWduZWQgY2hhciBfX3RtcCA9IF9fdmFsOworICBtZW1zZXQoX19maXJzdCwgX190bXAsIF9fbGFzdCAtIF9fZmlyc3QpOworfQorI2lmICFkZWZpbmVkIChfU1RMUF9OT19TSUdORURfQlVJTFRJTlMpCitpbmxpbmUgdm9pZCBmaWxsKHNpZ25lZCBjaGFyKiBfX2ZpcnN0LCBzaWduZWQgY2hhciogX19sYXN0LAorICAgICAgICAgICAgICAgICBjb25zdCBzaWduZWQgY2hhciYgX192YWwpIHsKKyAgc2lnbmVkIGNoYXIgX190bXAgPSBfX3ZhbDsKKyAgbWVtc2V0KF9fZmlyc3QsIF9fU1RBVElDX0NBU1QodW5zaWduZWQgY2hhcixfX3RtcCksIF9fbGFzdCAtIF9fZmlyc3QpOworfQorI2VuZGlmCitpbmxpbmUgdm9pZCBmaWxsKGNoYXIqIF9fZmlyc3QsIGNoYXIqIF9fbGFzdCwgY29uc3QgY2hhciYgX192YWwpIHsKKyAgY2hhciBfX3RtcCA9IF9fdmFsOworICBtZW1zZXQoX19maXJzdCwgX19TVEFUSUNfQ0FTVCh1bnNpZ25lZCBjaGFyLF9fdG1wKSwgX19sYXN0IC0gX19maXJzdCk7Cit9CisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9PdXRwdXRJdGVyLCBjbGFzcyBfU2l6ZSwgY2xhc3MgX1RwPgorX1NUTFBfSU5MSU5FX0xPT1AKK19PdXRwdXRJdGVyIF9fZmlsbF9uKF9PdXRwdXRJdGVyIF9fZmlyc3QsIF9TaXplIF9fbiwgY29uc3QgX1RwJiBfX3ZhbCkgeworICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19maXJzdCkKKyAgZm9yICggOyBfX24gPiAwOyAtLV9fbiwgKytfX2ZpcnN0KQorICAgICpfX2ZpcnN0ID0gX192YWw7CisgIHJldHVybiBfX2ZpcnN0OworfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSKQordGVtcGxhdGUgPGNsYXNzIF9TaXplPgoraW5saW5lIHVuc2lnbmVkIGNoYXIqIF9fZmlsbF9uKHVuc2lnbmVkIGNoYXIqIF9fZmlyc3QsIF9TaXplIF9fbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyJiBfX3ZhbCkgeworICBfU1RMUF9TVEQ6OmZpbGwoX19maXJzdCwgX19maXJzdCArIF9fbiwgX192YWwpOworICByZXR1cm4gX19maXJzdCArIF9fbjsKK30KKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fU0lHTkVEX0JVSUxUSU5TKQordGVtcGxhdGUgPGNsYXNzIF9TaXplPgoraW5saW5lIHNpZ25lZCBjaGFyKiBfX2ZpbGxfbihzaWduZWQgY2hhciogX19maXJzdCwgX1NpemUgX19uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaWduZWQgY2hhciYgX192YWwpIHsKKyAgX1NUTFBfU1REOjpmaWxsKF9fZmlyc3QsIF9fZmlyc3QgKyBfX24sIF9fdmFsKTsKKyAgcmV0dXJuIF9fZmlyc3QgKyBfX247Cit9CisjZW5kaWYKK3RlbXBsYXRlIDxjbGFzcyBfU2l6ZT4KK2lubGluZSBjaGFyKiBfX2ZpbGxfbihjaGFyKiBfX2ZpcnN0LCBfU2l6ZSBfX24sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciYgX192YWwpIHsKKyAgX1NUTFBfU1REOjpmaWxsKF9fZmlyc3QsIF9fZmlyc3QgKyBfX24sIF9fdmFsKTsKKyAgcmV0dXJuIF9fZmlyc3QgKyBfX247Cit9CisjZW5kaWYKKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfT3V0cHV0SXRlciwgY2xhc3MgX1NpemUsIGNsYXNzIF9UcD4KK2lubGluZSB2b2lkIGZpbGxfbihfT3V0cHV0SXRlciBfX2ZpcnN0LCBfU2l6ZSBfX24sIGNvbnN0IF9UcCYgX192YWwpIHsKKyAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fZmlyc3QpCisgIF9TVExQX1BSSVYgX19maWxsX24oX19maXJzdCwgX19uLCBfX3ZhbCk7Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZXF1YWwgYW5kIG1pc21hdGNoCisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0SXRlcjI+CitfU1RMUF9JTkxJTkVfTE9PUAorX1NUTFBfU1REOjpwYWlyPF9JbnB1dEl0ZXIxLCBfSW5wdXRJdGVyMj4gbWlzbWF0Y2goX0lucHV0SXRlcjEgX19maXJzdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyMSBfX2xhc3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIpIHsKKyAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fZmlyc3QyKQorICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdDEsIF9fbGFzdDEpKQorICB3aGlsZSAoX19maXJzdDEgIT0gX19sYXN0MSAmJiAqX19maXJzdDEgPT0gKl9fZmlyc3QyKSB7CisgICAgKytfX2ZpcnN0MTsKKyAgICArK19fZmlyc3QyOworICB9CisgIHJldHVybiBfU1RMUF9TVEQ6OnBhaXI8X0lucHV0SXRlcjEsIF9JbnB1dEl0ZXIyPihfX2ZpcnN0MSwgX19maXJzdDIpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNsYXNzIF9JbnB1dEl0ZXIyLCBjbGFzcyBfQmluYXJ5UHJlZGljYXRlPgorX1NUTFBfSU5MSU5FX0xPT1AKK19TVExQX1NURDo6cGFpcjxfSW5wdXRJdGVyMSwgX0lucHV0SXRlcjI+IG1pc21hdGNoKF9JbnB1dEl0ZXIxIF9fZmlyc3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjEgX19sYXN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JpbmFyeVByZWRpY2F0ZSBfX2JpbmFyeV9wcmVkKSB7CisgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2ZpcnN0MikKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QxLCBfX2xhc3QxKSkKKyAgd2hpbGUgKF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19iaW5hcnlfcHJlZCgqX19maXJzdDEsICpfX2ZpcnN0MikpIHsKKyAgICArK19fZmlyc3QxOworICAgICsrX19maXJzdDI7CisgIH0KKyAgcmV0dXJuIF9TVExQX1NURDo6cGFpcjxfSW5wdXRJdGVyMSwgX0lucHV0SXRlcjI+KF9fZmlyc3QxLCBfX2ZpcnN0Mik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0SXRlcjI+CitfU1RMUF9JTkxJTkVfTE9PUAorYm9vbCBlcXVhbChfSW5wdXRJdGVyMSBfX2ZpcnN0MSwgX0lucHV0SXRlcjEgX19sYXN0MSwKKyAgICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIpIHsKKyAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fZmlyc3QxKSBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19sYXN0MSkgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2ZpcnN0MikKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QxLCBfX2xhc3QxKSkKKyAgZm9yICggOyBfX2ZpcnN0MSAhPSBfX2xhc3QxOyArK19fZmlyc3QxLCArK19fZmlyc3QyKQorICAgIGlmICghKCpfX2ZpcnN0MSA9PSAqX19maXJzdDIpKQorICAgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMiwgY2xhc3MgX0JpbmFyeVByZWRpY2F0ZT4KK19TVExQX0lOTElORV9MT09QCitib29sIGVxdWFsKF9JbnB1dEl0ZXIxIF9fZmlyc3QxLCBfSW5wdXRJdGVyMSBfX2xhc3QxLAorICAgICAgICAgICBfSW5wdXRJdGVyMiBfX2ZpcnN0MiwgX0JpbmFyeVByZWRpY2F0ZSBfX2JpbmFyeV9wcmVkKSB7CisgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2ZpcnN0MikKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QxLCBfX2xhc3QxKSkKKyAgZm9yICggOyBfX2ZpcnN0MSAhPSBfX2xhc3QxOyArK19fZmlyc3QxLCArK19fZmlyc3QyKQorICAgIGlmICghX19iaW5hcnlfcHJlZCgqX19maXJzdDEsICpfX2ZpcnN0MikpCisgICAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsZXhpY29ncmFwaGljYWxfY29tcGFyZSBhbmQgbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmVfM3dheS4KKy8vICh0aGUgbGF0dGVyIGlzIG5vdCBwYXJ0IG9mIHRoZSBDKysgc3RhbmRhcmQuKQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNsYXNzIF9JbnB1dEl0ZXIyPgorYm9vbCBsZXhpY29ncmFwaGljYWxfY29tcGFyZShfSW5wdXRJdGVyMSBfX2ZpcnN0MSwgX0lucHV0SXRlcjEgX19sYXN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIsIF9JbnB1dEl0ZXIyIF9fbGFzdDIpOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNsYXNzIF9JbnB1dEl0ZXIyLCBjbGFzcyBfQ29tcGFyZT4KK2Jvb2wgbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIxIF9fbGFzdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyLCBfSW5wdXRJdGVyMiBfX2xhc3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ29tcGFyZSBfX2NvbXApOworCitpbmxpbmUgYm9vbAorbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoY29uc3QgdW5zaWduZWQgY2hhciogX19maXJzdDEsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBfX2xhc3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogX19maXJzdDIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBfX2xhc3QyKSB7CisgIGNvbnN0IHNpemVfdCBfX2xlbjEgPSBfX2xhc3QxIC0gX19maXJzdDE7CisgIGNvbnN0IHNpemVfdCBfX2xlbjIgPSBfX2xhc3QyIC0gX19maXJzdDI7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0MSwgX19sYXN0MSkpCisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0MiwgX19sYXN0MikpCisKKyAgY29uc3QgaW50IF9fcmVzdWx0ID0gbWVtY21wKF9fZmlyc3QxLCBfX2ZpcnN0MiwgKG1pbikgKF9fbGVuMSwgX19sZW4yKSk7CisgIHJldHVybiBfX3Jlc3VsdCAhPSAwID8gKF9fcmVzdWx0IDwgMCkgOiAoX19sZW4xIDwgX19sZW4yKTsKK30KKworCisjaWYgIShDSEFSX01BWCA9PSBTQ0hBUl9NQVgpCitpbmxpbmUgYm9vbCBsZXhpY29ncmFwaGljYWxfY29tcGFyZShjb25zdCBjaGFyKiBfX2ZpcnN0MSwgY29uc3QgY2hhciogX19sYXN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIF9fZmlyc3QyLCBjb25zdCBjaGFyKiBfX2xhc3QyKSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0MSwgX19sYXN0MSkpCisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0MiwgX19sYXN0MikpCisKKyAgcmV0dXJuIGxleGljb2dyYXBoaWNhbF9jb21wYXJlKChjb25zdCB1bnNpZ25lZCBjaGFyKikgX19maXJzdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdW5zaWduZWQgY2hhciopIF9fbGFzdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdW5zaWduZWQgY2hhciopIF9fZmlyc3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVuc2lnbmVkIGNoYXIqKSBfX2xhc3QyKTsKK30KKyNlbmRpZiAvKiBDSEFSX01BWCA9PSBTQ0hBUl9NQVggKi8KKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNsYXNzIF9JbnB1dEl0ZXIyPgoraW50IF9fbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmVfM3dheShfSW5wdXRJdGVyMSBfX2ZpcnN0MSwgX0lucHV0SXRlcjEgX19sYXN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIsIF9JbnB1dEl0ZXIyIF9fbGFzdDIpOworCitpbmxpbmUgaW50CitfX2xleGljb2dyYXBoaWNhbF9jb21wYXJlXzN3YXkoY29uc3QgdW5zaWduZWQgY2hhciogX19maXJzdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogX19sYXN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBfX2ZpcnN0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBfX2xhc3QyKSB7CisgIGNvbnN0IHB0cmRpZmZfdCBfX2xlbjEgPSBfX2xhc3QxIC0gX19maXJzdDE7CisgIGNvbnN0IHB0cmRpZmZfdCBfX2xlbjIgPSBfX2xhc3QyIC0gX19maXJzdDI7CisgIGNvbnN0IGludCBfX3Jlc3VsdCA9IG1lbWNtcChfX2ZpcnN0MSwgX19maXJzdDIsIChtaW4pIChfX2xlbjEsIF9fbGVuMikpOworICByZXR1cm4gX19yZXN1bHQgIT0gMCA/IF9fcmVzdWx0CisgICAgICAgICAgICAgICAgICAgICAgIDogKF9fbGVuMSA9PSBfX2xlbjIgPyAwIDogKF9fbGVuMSA8IF9fbGVuMiA/IC0xIDogMSkpOworfQorCisKKyNpZiAhKENIQVJfTUFYID09IFNDSEFSX01BWCkKK2lubGluZSBpbnQKK19fbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmVfM3dheShjb25zdCBjaGFyKiBfX2ZpcnN0MSwgY29uc3QgY2hhciogX19sYXN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBfX2ZpcnN0MiwgY29uc3QgY2hhciogX19sYXN0MikgeworICByZXR1cm4gX19sZXhpY29ncmFwaGljYWxfY29tcGFyZV8zd2F5KChjb25zdCB1bnNpZ25lZCBjaGFyKikgX19maXJzdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVuc2lnbmVkIGNoYXIqKSBfX2xhc3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1bnNpZ25lZCBjaGFyKikgX19maXJzdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVuc2lnbmVkIGNoYXIqKSBfX2xhc3QyKTsKK30KKyNlbmRpZgorCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMj4KK2ludCBsZXhpY29ncmFwaGljYWxfY29tcGFyZV8zd2F5KF9JbnB1dEl0ZXIxIF9fZmlyc3QxLCBfSW5wdXRJdGVyMSBfX2xhc3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIsIF9JbnB1dEl0ZXIyIF9fbGFzdDIpOworCisjZW5kaWYKKworLy8gY291bnQKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfVHA+CitfU1RMUF9JTkxJTkVfTE9PUCBfU1RMUF9ESUZGRVJFTkNFX1RZUEUoX0lucHV0SXRlcikKK2NvdW50KF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsIGNvbnN0IF9UcCYgX192YWwpIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgIF9TVExQX0RJRkZFUkVOQ0VfVFlQRShfSW5wdXRJdGVyKSBfX24gPSAwOworICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisgICAgaWYgKCpfX2ZpcnN0ID09IF9fdmFsKQorICAgICAgKytfX247CisgIHJldHVybiBfX247Cit9CisKKy8vIGZpbmQgYW5kIGZpbmRfaWYuIE5vdGUgZmluZCBtYXkgYmUgZXhwcmVzc2VkIGluIHRlcm1zIG9mIGZpbmRfaWYgaWYgYXBwcm9wcmlhdGUgYmluZGVyIHdhcyBhdmFpbGFibGUuCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX1RwPgorX0lucHV0SXRlciBmaW5kKF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsIGNvbnN0IF9UcCYgX192YWwpOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX1ByZWRpY2F0ZT4KK19JbnB1dEl0ZXIgZmluZF9pZihfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LCBfUHJlZGljYXRlIF9fcHJlZCk7CisKKy8vIHNlYXJjaC4KK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIxLCBjbGFzcyBfRm9yd2FyZEl0ZXIyLCBjbGFzcyBfQmluYXJ5UHJlZD4KK19Gb3J3YXJkSXRlcjEgc2VhcmNoKF9Gb3J3YXJkSXRlcjEgX19maXJzdDEsIF9Gb3J3YXJkSXRlcjEgX19sYXN0MSwKKyAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlcjIgX19maXJzdDIsIF9Gb3J3YXJkSXRlcjIgX19sYXN0MiwgX0JpbmFyeVByZWQgIF9fcHJlZGljYXRlKTsKKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCisvLyBmaW5kX2ZpcnN0X29mCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX0ZvcndhcmRJdGVyPgorX0lucHV0SXRlciBfX2ZpbmRfZmlyc3Rfb2YoX0lucHV0SXRlciBfX2ZpcnN0MSwgX0lucHV0SXRlciBfX2xhc3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyIF9fZmlyc3QyLCBfRm9yd2FyZEl0ZXIgX19sYXN0Mik7CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9CaW5hcnlQcmVkaWNhdGU+CitfSW5wdXRJdGVyIF9fZmluZF9maXJzdF9vZihfSW5wdXRJdGVyIF9fZmlyc3QxLCBfSW5wdXRJdGVyIF9fbGFzdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXIgX19maXJzdDIsIF9Gb3J3YXJkSXRlciBfX2xhc3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JpbmFyeVByZWRpY2F0ZSBfX2NvbXApOworCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcjEsIGNsYXNzIF9Gb3J3YXJkSXRlcjIsCisgICAgICAgICAgY2xhc3MgX0JpbmFyeVByZWRpY2F0ZT4KK19Gb3J3YXJkSXRlcjEKK2ZpbmRfZW5kKF9Gb3J3YXJkSXRlcjEgX19maXJzdDEsIF9Gb3J3YXJkSXRlcjEgX19sYXN0MSwKKyAgICAgICAgIF9Gb3J3YXJkSXRlcjIgX19maXJzdDIsIF9Gb3J3YXJkSXRlcjIgX19sYXN0MiwKKyAgICAgICAgIF9CaW5hcnlQcmVkaWNhdGUgX19jb21wKTsKKworLy8gcmVwbGFjZQordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1RwPgorX1NUTFBfSU5MSU5FX0xPT1Agdm9pZAorcmVwbGFjZShfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwKKyAgICAgICAgY29uc3QgX1RwJiBfX29sZF92YWx1ZSwgY29uc3QgX1RwJiBfX25ld192YWx1ZSkgeworICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKKyAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorICAgIGlmICgqX19maXJzdCA9PSBfX29sZF92YWx1ZSkKKyAgICAgICpfX2ZpcnN0ID0gX19uZXdfdmFsdWU7Cit9CisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZTEsIGNsYXNzIF9Db21wYXJlMiwgY2xhc3MgX0Rpc3RhbmNlPgorX0ZvcndhcmRJdGVyIF9fbG93ZXJfYm91bmQoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfVHAmIF9fdmFsLCBfQ29tcGFyZTEgX19jb21wMSwgX0NvbXBhcmUyIF9fY29tcDIsIF9EaXN0YW5jZSopOworCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjaWYgIWRlZmluZWQgKF9TVExQX0xJTktfVElNRV9JTlNUQU5USUFUSU9OKQorIyAgaW5jbHVkZSA8c3RsL19hbGdvYmFzZS5jPgorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9BTEdPQkFTRV9IICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CisKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL19hbGxvYy5jIGIvc3RscG9ydC9zdGwvX2FsbG9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY3NDA1YgotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc3RsL19hbGxvYy5jCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisjaWZuZGVmIF9TVExQX0FMTE9DX0MKKyNkZWZpbmUgX1NUTFBfQUxMT0NfQworCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0FMTE9DX0gKKyMgIGluY2x1ZGUgPHN0bC9fYWxsb2MuaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19XQVRDT01DX18pCisjICBwcmFnbWEgd2FybmluZyAxMyA5CisjICBwcmFnbWEgd2FybmluZyAzNjcgOQorIyAgcHJhZ21hIHdhcm5pbmcgMzY4IDkKKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9BbGxvYz4KK3ZvaWQgKiBfU1RMUF9DQUxMIF9fZGVidWdfYWxsb2M8X0FsbG9jPjo6YWxsb2NhdGUoc2l6ZV90IF9fbikgeworICBzaXplX3QgX190b3RhbF9leHRyYSA9IF9fZXh0cmFfYmVmb3JlX2NodW5rKCkgKyBfX2V4dHJhX2FmdGVyX2NodW5rKCk7CisgIHNpemVfdCBfX3JlYWxfbiA9IF9fbiArIF9fdG90YWxfZXh0cmE7CisgIGlmIChfX3JlYWxfbiA8IF9fbikgeworICAgIC8vSXQgbWVhbnMgdGhhdCB3ZSByb2xsZWQgb24gc2l6ZV90LCBfX24gbXVzdCBiZSB2ZXJ5IGxhcmdlOgorICAgIF9TVExQX1RIUk9XX0JBRF9BTExPQzsKKyAgfQorICBfX2FsbG9jX2hlYWRlciAqX19yZXN1bHQgPSAoX19hbGxvY19oZWFkZXIgKilfX2FsbG9jYXRvcl90eXBlOjphbGxvY2F0ZShfX3JlYWxfbik7CisgIG1lbXNldCgoY2hhciopX19yZXN1bHQsIF9fc2hyZWRfYnl0ZSwgX19yZWFsX24gKiBzaXplb2YodmFsdWVfdHlwZSkpOworICBfX3Jlc3VsdC0+X19tYWdpYyA9IF9fbWFnaWM7CisgIF9fcmVzdWx0LT5fX3R5cGVfc2l6ZSA9IHNpemVvZih2YWx1ZV90eXBlKTsKKyAgX19yZXN1bHQtPl9NX3NpemUgPSAoX1NUTFBfVUlOVDMyX1QpX19uOworICByZXR1cm4gKChjaGFyKilfX3Jlc3VsdCkgKyAobG9uZylfX2V4dHJhX2JlZm9yZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9BbGxvYz4KK3ZvaWQgIF9TVExQX0NBTEwKK19fZGVidWdfYWxsb2M8X0FsbG9jPjo6ZGVhbGxvY2F0ZSh2b2lkICpfX3AsIHNpemVfdCBfX24pIHsKKyAgX19hbGxvY19oZWFkZXIgKiBfX3JlYWxfcCA9IChfX2FsbG9jX2hlYWRlciopKChjaGFyICopX19wIC0obG9uZylfX2V4dHJhX2JlZm9yZSk7CisgIC8vIGNoZWNrIGludGVncml0eQorICBfU1RMUF9WRVJCT1NFX0FTU0VSVChfX3JlYWxfcC0+X19tYWdpYyAhPSBfX2RlbGV0ZWRfbWFnaWMsIF9TdGxNc2dfREJBX0RFTEVURURfVFdJQ0UpCisgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKF9fcmVhbF9wLT5fX21hZ2ljID09IF9fbWFnaWMsIF9TdGxNc2dfREJBX05FVkVSX0FMTE9DQVRFRCkKKyAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoX19yZWFsX3AtPl9fdHlwZV9zaXplID09IDEsX1N0bE1zZ19EQkFfVFlQRV9NSVNNQVRDSCkKKyAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoX19yZWFsX3AtPl9NX3NpemUgPT0gX19uLCBfU3RsTXNnX0RCQV9TSVpFX01JU01BVENIKQorICAvLyBjaGVjayBwYWRzIG9uIGJvdGggc2lkZXMKKyAgdW5zaWduZWQgY2hhciogX190bXA7CisgIGZvciAoX190bXAgPSAodW5zaWduZWQgY2hhciopKF9fcmVhbF9wICsgMSk7IF9fdG1wIDwgKHVuc2lnbmVkIGNoYXIqKV9fcDsgKytfX3RtcCkgeworICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCpfX3RtcCA9PSBfX3NocmVkX2J5dGUsIF9TdGxNc2dfREJBX1VOREVSUlVOKQorICB9CisKKyAgc2l6ZV90IF9fcmVhbF9uID0gX19uICsgX19leHRyYV9iZWZvcmVfY2h1bmsoKSArIF9fZXh0cmFfYWZ0ZXJfY2h1bmsoKTsKKworICBmb3IgKF9fdG1wPSAoKHVuc2lnbmVkIGNoYXIqKV9fcCkgKyBfX24gKiBzaXplb2YodmFsdWVfdHlwZSk7CisgICAgICAgX190bXAgPCAoKHVuc2lnbmVkIGNoYXIqKV9fcmVhbF9wKSArIF9fcmVhbF9uIDsgKytfX3RtcCkgeworICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCpfX3RtcCA9PSBfX3NocmVkX2J5dGUsIF9TdGxNc2dfREJBX09WRVJSVU4pCisgIH0KKworICAvLyB0aGF0IG1heSBiZSB1bmZvcnR1bmF0ZSwganVzdCBpbiBjYXNlCisgIF9fcmVhbF9wLT5fX21hZ2ljID0gX19kZWxldGVkX21hZ2ljOworICBtZW1zZXQoKGNoYXIqKV9fcCwgX19zaHJlZF9ieXRlLCBfX24gKiBzaXplb2YodmFsdWVfdHlwZSkpOworICBfX2FsbG9jYXRvcl90eXBlOjpkZWFsbG9jYXRlKF9fcmVhbF9wLCBfX3JlYWxfbik7Cit9CisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2VuZGlmIC8qICBfU1RMUF9BTExPQ19DICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9fYWxsb2MuaCBiL3N0bHBvcnQvc3RsL19hbGxvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5YjhhZjUKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9fYWxsb2MuaApAQCAtMCwwICsxLDU4MCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworLyogTk9URTogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgU1RMIGhlYWRlcnMuCisgKiAgIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LgorICovCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQUxMT0NfSAorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9BTExPQ19ICisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1NURERFRgorIyAgaW5jbHVkZSA8c3RsL19jc3RkZGVmLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DU1RETElCCisjICBpbmNsdWRlIDxzdGwvX2NzdGRsaWIuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NTVFJJTkcKKyMgIGluY2x1ZGUgPHN0bC9fY3N0cmluZy5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQUxHT0JBU0VfSAorIyAgaW5jbHVkZSA8c3RsL19hbGdvYmFzZS5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfTkVXX0hFQURFUgorIyAgaW5jbHVkZSA8c3RsL19uZXcuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NPTlNUUlVDVF9ICisjICBpbmNsdWRlIDxzdGwvX2NvbnN0cnVjdC5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisvLyBNYWxsb2MtYmFzZWQgYWxsb2NhdG9yLiAgVHlwaWNhbGx5IHNsb3dlciB0aGFuIGRlZmF1bHQgYWxsb2MgYmVsb3cuCisvLyBUeXBpY2FsbHkgdGhyZWFkLXNhZmUgYW5kIG1vcmUgc3RvcmFnZSBlZmZpY2llbnQuCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX05PX0lPU1RSRUFNUykKK3R5cGVkZWYgdm9pZCAoKiBfX29vbV9oYW5kbGVyX3R5cGUpKCk7CisjZW5kaWYKKworY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgX19tYWxsb2NfYWxsb2MgeworcHVibGljOgorICAvLyB0aGlzIG9uZSBpcyBuZWVkZWQgZm9yIHByb3BlciBzaW1wbGVfYWxsb2Mgd3JhcHBpbmcKKyAgdHlwZWRlZiBjaGFyIHZhbHVlX3R5cGU7CisgIHN0YXRpYyB2b2lkKiBfU1RMUF9DQUxMIGFsbG9jYXRlKHNpemVfdCBfX24pCisjaWYgIWRlZmluZWQgKF9TVExQX1VTRV9OT19JT1NUUkVBTVMpCisgIDsKKyNlbHNlCisgIHsKKyAgICB2b2lkICpfX3Jlc3VsdCA9IG1hbGxvYyhfX24pOworICAgIGlmIChfX3Jlc3VsdCA9PSAwKSB7CisgICAgICBfU1RMUF9USFJPV19CQURfQUxMT0M7CisgICAgfQorICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgfQorI2VuZGlmCisKKyAgc3RhdGljIHZvaWQgX1NUTFBfQ0FMTCBkZWFsbG9jYXRlKHZvaWQqIF9fcCwgc2l6ZV90IC8qIF9fbiAqLykgeyBmcmVlKChjaGFyKilfX3ApOyB9CisjaWYgIWRlZmluZWQgKF9TVExQX1VTRV9OT19JT1NUUkVBTVMpCisgIHN0YXRpYyBfX29vbV9oYW5kbGVyX3R5cGUgX1NUTFBfQ0FMTCBzZXRfbWFsbG9jX2hhbmRsZXIoX19vb21faGFuZGxlcl90eXBlIF9fZik7CisjZW5kaWYKK307CisKKy8vIE5ldy1iYXNlZCBhbGxvY2F0b3IuICBUeXBpY2FsbHkgc2xvd2VyIHRoYW4gZGVmYXVsdCBhbGxvYyBiZWxvdy4KKy8vIFR5cGljYWxseSB0aHJlYWQtc2FmZSBhbmQgbW9yZSBzdG9yYWdlIGVmZmljaWVudC4KK2NsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIF9fbmV3X2FsbG9jIHsKK3B1YmxpYzoKKyAgLy8gdGhpcyBvbmUgaXMgbmVlZGVkIGZvciBwcm9wZXIgc2ltcGxlX2FsbG9jIHdyYXBwaW5nCisgIHR5cGVkZWYgY2hhciB2YWx1ZV90eXBlOworICBzdGF0aWMgdm9pZCogX1NUTFBfQ0FMTCBhbGxvY2F0ZShzaXplX3QgX19uKSB7IHJldHVybiBfX3N0bF9uZXcoX19uKTsgfQorICBzdGF0aWMgdm9pZCBfU1RMUF9DQUxMIGRlYWxsb2NhdGUodm9pZCogX19wLCBzaXplX3QpIHsgX19zdGxfZGVsZXRlKF9fcCk7IH0KK307CisKKy8vIEFsbG9jYXRvciBhZGFwdG9yIHRvIGNoZWNrIHNpemUgYXJndW1lbnRzIGZvciBkZWJ1Z2dpbmcuCisvLyBSZXBvcnRzIGVycm9ycyB1c2luZyBhc3NlcnQuICBDaGVja2luZyBjYW4gYmUgZGlzYWJsZWQgd2l0aAorLy8gTkRFQlVHLCBidXQgaXQncyBmYXIgYmV0dGVyIHRvIGp1c3QgdXNlIHRoZSB1bmRlcmx5aW5nIGFsbG9jYXRvcgorLy8gaW5zdGVhZCB3aGVuIG5vIGNoZWNraW5nIGlzIGRlc2lyZWQuCisvLyBUaGVyZSBpcyBzb21lIGV2aWRlbmNlIHRoYXQgdGhpcyBjYW4gY29uZnVzZSBQdXJpZnkuCisvLyBUaGlzIGFkYXB0b3IgY2FuIG9ubHkgYmUgYXBwbGllZCB0byByYXcgYWxsb2NhdG9ycworCit0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jPgorY2xhc3MgX19kZWJ1Z19hbGxvYyA6IHB1YmxpYyBfQWxsb2MgeworcHVibGljOgorICB0eXBlZGVmIF9BbGxvYyBfX2FsbG9jYXRvcl90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworcHJpdmF0ZToKKyAgc3RydWN0IF9fYWxsb2NfaGVhZGVyIHsKKyAgICBzaXplX3QgX19tYWdpYzogMTY7CisgICAgc2l6ZV90IF9fdHlwZV9zaXplOjE2OworICAgIF9TVExQX1VJTlQzMl9UIF9NX3NpemU7CisgIH07IC8vIHRoYXQgaXMgOCBieXRlcyBmb3Igc3VyZQorICAvLyBTdW5wcm8gQ0MgaGFzIGJ1ZyBvbiBlbnVtcywgc28gZXh0cmFfYmVmb3JlL2FmdGVyIHNldCBleHBsaWNpdGx5CisgIGVudW0geyBfX3BhZCA9IDgsIF9fbWFnaWMgPSAweGRlYmEsIF9fZGVsZXRlZF9tYWdpYyA9IDB4ZGViZCwKKyAgICAgICAgIF9fc2hyZWRfYnl0ZSA9IF9TVExQX1NIUkVEX0JZVEUgfTsKKworICBlbnVtIHsgX19leHRyYV9iZWZvcmUgPSAxNiwgX19leHRyYV9hZnRlciA9IDggfTsKKyAgLy8gU2l6ZSBvZiBzcGFjZSB1c2VkIHRvIHN0b3JlIHNpemUuICBOb3RlCisgIC8vIHRoYXQgdGhpcyBtdXN0IGJlIGxhcmdlIGVub3VnaCB0byBwcmVzZXJ2ZQorICAvLyBhbGlnbm1lbnQuCisgIHN0YXRpYyBzaXplX3QgX1NUTFBfQ0FMTCBfX2V4dHJhX2JlZm9yZV9jaHVuaygpIHsKKyAgICByZXR1cm4gKGxvbmcpX19leHRyYV9iZWZvcmUgLyBzaXplb2YodmFsdWVfdHlwZSkgKworICAgICAgKHNpemVfdCkoKGxvbmcpX19leHRyYV9iZWZvcmUgJSBzaXplb2YodmFsdWVfdHlwZSkgPiAwKTsKKyAgfQorICBzdGF0aWMgc2l6ZV90IF9TVExQX0NBTEwgX19leHRyYV9hZnRlcl9jaHVuaygpIHsKKyAgICByZXR1cm4gKGxvbmcpX19leHRyYV9hZnRlciAvIHNpemVvZih2YWx1ZV90eXBlKSArCisgICAgICAoc2l6ZV90KSgobG9uZylfX2V4dHJhX2FmdGVyICUgc2l6ZW9mKHZhbHVlX3R5cGUpID4gMCk7CisgIH0KK3B1YmxpYzoKKyAgX19kZWJ1Z19hbGxvYygpIHt9CisgIH5fX2RlYnVnX2FsbG9jKCkge30KKyAgc3RhdGljIHZvaWQqIF9TVExQX0NBTEwgYWxsb2NhdGUoc2l6ZV90KTsKKyAgc3RhdGljIHZvaWQgX1NUTFBfQ0FMTCBkZWFsbG9jYXRlKHZvaWQgKiwgc2l6ZV90KTsKK307CisKKyMgIGlmIGRlZmluZWQgKF9fT1M0MDBfXykKKy8vIGR1bXMgMDIvMDUvMjAwNzogaXMgaXQgcmVhbGx5IG5lY2Vzc2FyeSA/CitlbnVtIHsgX01BWF9CWVRFUyA9IDI1NiB9OworIyAgZWxzZQorZW51bSB7IF9NQVhfQllURVMgPSAzMiAqIHNpemVvZih2b2lkKikgfTsKKyMgIGVuZGlmCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX05PX0lPU1RSRUFNUykKKy8vIERlZmF1bHQgbm9kZSBhbGxvY2F0b3IuCisvLyBXaXRoIGEgcmVhc29uYWJsZSBjb21waWxlciwgdGhpcyBzaG91bGQgYmUgcm91Z2hseSBhcyBmYXN0IGFzIHRoZQorLy8gb3JpZ2luYWwgU1RMIGNsYXNzLXNwZWNpZmljIGFsbG9jYXRvcnMsIGJ1dCB3aXRoIGxlc3MgZnJhZ21lbnRhdGlvbi4KK2NsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIF9fbm9kZV9hbGxvYyB7CisgIHN0YXRpYyB2b2lkICogX1NUTFBfQ0FMTCBfTV9hbGxvY2F0ZShzaXplX3QmIF9fbik7CisgIC8qIF9fcCBtYXkgbm90IGJlIDAgKi8KKyAgc3RhdGljIHZvaWQgX1NUTFBfQ0FMTCBfTV9kZWFsbG9jYXRlKHZvaWQgKl9fcCwgc2l6ZV90IF9fbik7CisKK3B1YmxpYzoKKyAgLy8gdGhpcyBvbmUgaXMgbmVlZGVkIGZvciBwcm9wZXIgc2ltcGxlX2FsbG9jIHdyYXBwaW5nCisgIHR5cGVkZWYgY2hhciB2YWx1ZV90eXBlOworICAvKiBfX24gbXVzdCBiZSA+IDAgICAgICAqLworICBzdGF0aWMgdm9pZCogX1NUTFBfQ0FMTCBhbGxvY2F0ZShzaXplX3QmIF9fbikKKyAgeyByZXR1cm4gKF9fbiA+IChzaXplX3QpX01BWF9CWVRFUykgPyBfX3N0bF9uZXcoX19uKSA6IF9NX2FsbG9jYXRlKF9fbik7IH0KKyAgLyogX19wIG1heSBub3QgYmUgMCAqLworICBzdGF0aWMgdm9pZCBfU1RMUF9DQUxMIGRlYWxsb2NhdGUodm9pZCAqX19wLCBzaXplX3QgX19uKQorICB7IGlmIChfX24gPiAoc2l6ZV90KV9NQVhfQllURVMpIF9fc3RsX2RlbGV0ZShfX3ApOyBlbHNlIF9NX2RlYWxsb2NhdGUoX19wLCBfX24pOyB9Cit9OworCisjICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUKQorX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIF9fZGVidWdfYWxsb2M8X19ub2RlX2FsbG9jPjsKKyMgIGVuZGlmCisKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCkKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBfX2RlYnVnX2FsbG9jPF9fbmV3X2FsbG9jPjsKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBfX2RlYnVnX2FsbG9jPF9fbWFsbG9jX2FsbG9jPjsKKyNlbmRpZgorCisvKiBtYWNybyB0byBjb252ZXJ0IHRoZSBhbGxvY2F0b3IgZm9yIGluaXRpYWxpemF0aW9uCisgKiBub3QgdXNpbmcgTUVNQkVSX1RFTVBMQVRFX0NMQVNTRVMgYXMgaXQgc2hvdWxkIHdvcmsgZ2l2ZW4gdGVtcGxhdGUgY29uc3RydWN0b3IgICovCisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykgfHwgISBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQorLyogaWYgX1NUTFBfTk9fVEVNUExBVEVfQ09OVkVSU0lPTlMgaXMgc2V0LCB0aGUgbWVtYmVyIHRlbXBsYXRlIGNvbnN0cnVjdG9yIGlzCisgKiBub3QgdXNlZCBpbXBsaWNpdGx5IHRvIGNvbnZlcnQgYWxsb2NhdG9yIHBhcmFtZXRlciwgc28gbGV0IHVzIGRvIGl0IGV4cGxpY2l0bHkgKi8KKyMgIGlmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURV9DTEFTU0VTKSAmJiBkZWZpbmVkIChfU1RMUF9OT19URU1QTEFURV9DT05WRVJTSU9OUykKKyMgICAgZGVmaW5lIF9TVExQX0NPTlZFUlRfQUxMT0NBVE9SKF9fYSwgX1RwKSBfX3N0bF9hbGxvY19jcmVhdGUoX19hLChfVHAqKTApCisjICBlbHNlCisjICAgIGRlZmluZSBfU1RMUF9DT05WRVJUX0FMTE9DQVRPUihfX2EsIF9UcCkgX19hCisjICBlbmRpZgorLyogZWxzZSBjb252ZXJ0LCBidXQgb25seSBpZiBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIHdvcmtzLCBzaW5jZSBlbHNlCisgKiBDb250YWluZXI6OmFsbG9jYXRvcl90eXBlIHdvbid0IGJlIGRpZmZlcmVudCAqLworI2Vsc2UKKyMgIGRlZmluZSBfU1RMUF9DT05WRVJUX0FMTE9DQVRPUihfX2EsIF9UcCkgX19zdGxfYWxsb2NfY3JlYXRlKF9fYSwoX1RwKikwKQorI2VuZGlmCisKKy8vIEFub3RoZXIgYWxsb2NhdG9yIGFkYXB0b3I6IF9BbGxvY190cmFpdHMuICBUaGlzIHNlcnZlcyB0d28KKy8vIHB1cnBvc2VzLiAgRmlyc3QsIG1ha2UgaXQgcG9zc2libGUgdG8gd3JpdGUgY29udGFpbmVycyB0aGF0IGNhbiB1c2UKKy8vIGVpdGhlciBTR0ktc3R5bGUgYWxsb2NhdG9ycyBvciBzdGFuZGFyZC1jb25mb3JtaW5nIGFsbG9jYXRvci4KKworLy8gVGhlIGZ1bGx5IGdlbmVyYWwgdmVyc2lvbi4KK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+CitzdHJ1Y3QgX0FsbG9jX3RyYWl0cyB7CisgIHR5cGVkZWYgX0FsbG9jYXRvciBfT3JpZzsKKyNpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBQT1JUX1JFQklORF9NRU1CRVJfVEVNUExBVEUpCisgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jYXRvcjo6X1NUTFBfVEVNUExBVEUgcmViaW5kPF9UcD4gX1JlYmluZF90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9SZWJpbmRfdHlwZTo6b3RoZXIgIGFsbG9jYXRvcl90eXBlOworICBzdGF0aWMgYWxsb2NhdG9yX3R5cGUgY3JlYXRlX2FsbG9jYXRvcihjb25zdCBfT3JpZyYgX19hKQorICB7IHJldHVybiBhbGxvY2F0b3JfdHlwZShfU1RMUF9DT05WRVJUX0FMTE9DQVRPUihfX2EsIF9UcCkpOyB9CisjZWxzZQorICAvLyB0aGlzIGlzIG5vdCBhY3R1YWxseSB0cnVlLCB1c2VkIG9ubHkgdG8gcGFzcyB0aGlzIHR5cGUgdGhyb3VnaAorICAvLyB0byBkeW5hbWljIG92ZXJsb2FkIHNlbGVjdGlvbiBpbiBfU1RMUF9hbGxvY19wcm94eSBtZXRob2RzCisgIHR5cGVkZWYgX0FsbG9jYXRvciBhbGxvY2F0b3JfdHlwZTsKKyNlbmRpZgorfTsKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QRVJUSFJFQURfQUxMT0MpCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKy8vIGluY2x1ZGUgYWRkaXRpb25hbCBoZWFkZXIgaGVyZQorIyAgaW5jbHVkZSA8c3RsL19wdGhyZWFkX2FsbG9jLmg+CitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKwordHlwZWRlZiBfX3B0aHJlYWRfYWxsb2MgX19hbGxvY190eXBlOworI2VsaWYgZGVmaW5lZCAoX1NUTFBfVVNFX05FV0FMTE9DKQordHlwZWRlZiBfX25ld19hbGxvYyBfX2FsbG9jX3R5cGU7CisjZWxpZiBkZWZpbmVkIChfU1RMUF9VU0VfTUFMTE9DKQordHlwZWRlZiBfX21hbGxvY19hbGxvYyBfX2FsbG9jX3R5cGU7CisjZWxzZQordHlwZWRlZiBfX25vZGVfYWxsb2MgX19hbGxvY190eXBlOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9ERUJVR19BTExPQykKK3R5cGVkZWYgX19kZWJ1Z19hbGxvYzxfX2FsbG9jX3R5cGU+IF9fc2dpX2FsbG9jOworI2Vsc2UKK3R5cGVkZWYgX19hbGxvY190eXBlIF9fc2dpX2FsbG9jOworI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fQU5BQ0hST05JU01TKQordHlwZWRlZiBfX3NnaV9hbGxvYyBfX3NpbmdsZV9jbGllbnRfYWxsb2M7Cit0eXBlZGVmIF9fc2dpX2FsbG9jIF9fbXVsdGl0aHJlYWRlZF9hbGxvYzsKKyNlbmRpZgorCisvLyBUaGlzIGltcGxlbWVudHMgYWxsb2NhdG9ycyBhcyBzcGVjaWZpZWQgaW4gdGhlIEMrKyBzdGFuZGFyZC4KKy8vCisvLyBOb3RlIHRoYXQgc3RhbmRhcmQtY29uZm9ybWluZyBhbGxvY2F0b3JzIHVzZSBtYW55IGxhbmd1YWdlIGZlYXR1cmVzCisvLyB0aGF0IGFyZSBub3QgeWV0IHdpZGVseSBpbXBsZW1lbnRlZC4gIEluIHBhcnRpY3VsYXIsIHRoZXkgcmVseSBvbgorLy8gbWVtYmVyIHRlbXBsYXRlcywgcGFydGlhbCBzcGVjaWFsaXphdGlvbiwgcGFydGlhbCBvcmRlcmluZyBvZiBmdW5jdGlvbgorLy8gdGVtcGxhdGVzLCB0aGUgdHlwZW5hbWUga2V5d29yZCwgYW5kIHRoZSB1c2Ugb2YgdGhlIHRlbXBsYXRlIGtleXdvcmQKKy8vIHRvIHJlZmVyIHRvIGEgdGVtcGxhdGUgbWVtYmVyIG9mIGEgZGVwZW5kZW50IHR5cGUuCisKKy8qCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9BbGxvY2F0b3JBdXggeworICB0eXBlZGVmIF9UcCogICAgICAgcG9pbnRlcjsKKyAgdHlwZWRlZiBjb25zdCBfVHAqIGNvbnN0X3BvaW50ZXI7CisgIHR5cGVkZWYgX1RwJiAgICAgICByZWZlcmVuY2U7CisgIHR5cGVkZWYgY29uc3QgX1RwJiBjb25zdF9yZWZlcmVuY2U7CisKKyAgcG9pbnRlciBhZGRyZXNzKHJlZmVyZW5jZSBfX3gpIGNvbnN0IHtyZXR1cm4gJl9feDt9CisgIGNvbnN0X3BvaW50ZXIgYWRkcmVzcyhjb25zdF9yZWZlcmVuY2UgX194KSBjb25zdCB7IHJldHVybiAmX194OyB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9BbGxvY2F0b3JBdXg8Y29uc3QgX1RwPiB7CisgIHR5cGVkZWYgX1RwKiAgICAgICBwb2ludGVyOworICB0eXBlZGVmIGNvbnN0IF9UcCogY29uc3RfcG9pbnRlcjsKKyAgdHlwZWRlZiBfVHAmICAgICAgIHJlZmVyZW5jZTsKKyAgdHlwZWRlZiBjb25zdCBfVHAmIGNvbnN0X3JlZmVyZW5jZTsKKworICBjb25zdF9wb2ludGVyIGFkZHJlc3MoY29uc3RfcmVmZXJlbmNlIF9feCkgY29uc3QgeyByZXR1cm4gJl9feDsgfQorfTsKKyovCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitjbGFzcyBhbGxvY2F0b3IgLy86IHB1YmxpYyBfQWxsb2NhdG9yQXV4PF9UcD4KKy8qIEEgc21hbGwgaGVscGVyIHN0cnVjdCB0byByZWNvZ25pemUgU1RMcG9ydCBhbGxvY2F0b3IgaW1wbGVtZW50YXRpb24KKyAqIGZyb20gYW55IHVzZXIgc3BlY2lhbGl6YXRpb24gb25lLgorICovCisgICAgICAgICAgICAgICAgOiBwdWJsaWMgX19zdGxwb3J0X2NsYXNzPGFsbG9jYXRvcjxfVHA+ID4KK3sKK3B1YmxpYzoKKyAgdHlwZWRlZiBfVHAgICAgICAgIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgX1RwKiAgICAgICBwb2ludGVyOworICB0eXBlZGVmIGNvbnN0IF9UcCogY29uc3RfcG9pbnRlcjsKKyAgdHlwZWRlZiBfVHAmICAgICAgIHJlZmVyZW5jZTsKKyAgdHlwZWRlZiBjb25zdCBfVHAmIGNvbnN0X3JlZmVyZW5jZTsKKyAgdHlwZWRlZiBzaXplX3QgICAgIHNpemVfdHlwZTsKKyAgdHlwZWRlZiBwdHJkaWZmX3QgIGRpZmZlcmVuY2VfdHlwZTsKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVfQ0xBU1NFUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcDE+IHN0cnVjdCByZWJpbmQgeworICAgIHR5cGVkZWYgYWxsb2NhdG9yPF9UcDE+IG90aGVyOworICB9OworI2VuZGlmCisgIGFsbG9jYXRvcigpIF9TVExQX05PVEhST1cge30KKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwMT4gYWxsb2NhdG9yKGNvbnN0IGFsbG9jYXRvcjxfVHAxPiYpIF9TVExQX05PVEhST1cge30KKyNlbmRpZgorICBhbGxvY2F0b3IoY29uc3QgYWxsb2NhdG9yPF9UcD4mKSBfU1RMUF9OT1RIUk9XIHt9CisjaWYgIWRlZmluZWQgKF9TVExQX05PX01PVkVfU0VNQU5USUMpCisgIGFsbG9jYXRvcihfX21vdmVfc291cmNlPGFsbG9jYXRvcjxfVHA+ID4gc3JjKSBfU1RMUF9OT1RIUk9XIHt9CisjZW5kaWYKKyAgfmFsbG9jYXRvcigpIF9TVExQX05PVEhST1cge30KKyAgcG9pbnRlciBhZGRyZXNzKHJlZmVyZW5jZSBfX3gpIGNvbnN0IHtyZXR1cm4gJl9feDt9CisgIGNvbnN0X3BvaW50ZXIgYWRkcmVzcyhjb25zdF9yZWZlcmVuY2UgX194KSBjb25zdCB7IHJldHVybiAmX194OyB9CisgIC8vIF9fbiBpcyBwZXJtaXR0ZWQgdG8gYmUgMC4gIFRoZSBDKysgc3RhbmRhcmQgc2F5cyBub3RoaW5nIGFib3V0IHdoYXQgdGhlIHJldHVybiB2YWx1ZSBpcyB3aGVuIF9fbiA9PSAwLgorICBfVHAqIGFsbG9jYXRlKHNpemVfdHlwZSBfX24sIGNvbnN0IHZvaWQqID0gMCkgeworICAgIGlmIChfX24gPiBtYXhfc2l6ZSgpKSB7CisgICAgICBfU1RMUF9USFJPV19CQURfQUxMT0M7CisgICAgfQorICAgIGlmIChfX24gIT0gMCkgeworICAgICAgc2l6ZV90eXBlIF9fYnVmX3NpemUgPSBfX24gKiBzaXplb2YodmFsdWVfdHlwZSk7CisgICAgICBfVHAqIF9fcmV0ID0gX19SRUlOVEVSUFJFVF9DQVNUKF9UcCosIF9fc2dpX2FsbG9jOjphbGxvY2F0ZShfX2J1Zl9zaXplKSk7CisjaWYgZGVmaW5lZCAoX1NUTFBfREVCVUdfVU5JTklUSUFMSVpFRCkgJiYgIWRlZmluZWQgKF9TVExQX0RFQlVHX0FMTE9DKQorICAgICAgbWVtc2V0KChjaGFyKilfX3JldCwgX1NUTFBfU0hSRURfQllURSwgX19idWZfc2l6ZSk7CisjZW5kaWYKKyAgICAgIHJldHVybiBfX3JldDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKKyAgfQorICAvLyBfX3AgaXMgcGVybWl0dGVkIHRvIGJlIGEgbnVsbCBwb2ludGVyLCBvbmx5IGlmIG49PTAuCisgIHZvaWQgZGVhbGxvY2F0ZShwb2ludGVyIF9fcCwgc2l6ZV90eXBlIF9fbikgeworICAgIF9TVExQX0FTU0VSVCggKF9fcCA9PSAwKSA9PSAoX19uID09IDApICkKKyAgICBpZiAoX19wICE9IDApIHsKKyNpZiBkZWZpbmVkIChfU1RMUF9ERUJVR19VTklOSVRJQUxJWkVEKSAmJiAhZGVmaW5lZCAoX1NUTFBfREVCVUdfQUxMT0MpCisgICAgICBtZW1zZXQoKGNoYXIqKV9fcCwgX1NUTFBfU0hSRURfQllURSwgX19uICogc2l6ZW9mKHZhbHVlX3R5cGUpKTsKKyNlbmRpZgorICAgICAgX19zZ2lfYWxsb2M6OmRlYWxsb2NhdGUoKHZvaWQqKV9fcCwgX19uICogc2l6ZW9mKHZhbHVlX3R5cGUpKTsKKyAgICB9CisgIH0KKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fQU5BQ0hST05JU01TKQorICAvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQorICB2b2lkIGRlYWxsb2NhdGUocG9pbnRlciBfX3ApIGNvbnN0IHsgIGlmIChfX3AgIT0gMCkgX19zZ2lfYWxsb2M6OmRlYWxsb2NhdGUoKHZvaWQqKV9fcCwgc2l6ZW9mKHZhbHVlX3R5cGUpKTsgfQorI2VuZGlmCisgIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IF9TVExQX05PVEhST1cgIHsgcmV0dXJuIHNpemVfdCgtMSkgLyBzaXplb2YodmFsdWVfdHlwZSk7IH0KKyAgdm9pZCBjb25zdHJ1Y3QocG9pbnRlciBfX3AsIGNvbnN0X3JlZmVyZW5jZSBfX3ZhbCkgeyBfU1RMUF9TVEQ6Ol9Db3B5X0NvbnN0cnVjdChfX3AsIF9fdmFsKTsgfQorICB2b2lkIGRlc3Ryb3kocG9pbnRlciBfX3ApIHsgX1NUTFBfU1REOjpfRGVzdHJveShfX3ApOyB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQorICAvKiBTVExwb3J0IGV4dGVuc2lvbiBnaXZpbmcgcm91bmRlZCBzaXplIG9mIGFuIGFsbG9jYXRlZCBtZW1vcnkgYnVmZmVyCisgICAqIFRoaXMgbWV0aG9kIGRvIG5vdCBoYXZlIHRvIGJlIHBhcnQgb2YgYSB1c2VyIGRlZmluZWQgYWxsb2NhdG9yIGltcGxlbWVudGF0aW9uCisgICAqIGFuZCB3b24ndCBldmVuIGJlIGNhbGxlZCBpZiBzdWNoIGEgZnVuY3Rpb24gd2FzIGdyYW50ZWQuCisgICAqLworcHJvdGVjdGVkOgorI2VuZGlmCisgIF9UcCogX01fYWxsb2NhdGUoc2l6ZV90eXBlIF9fbiwgc2l6ZV90eXBlJiBfX2FsbG9jYXRlZF9uKSB7CisgICAgaWYgKF9fbiA+IG1heF9zaXplKCkpIHsKKyAgICAgIF9TVExQX1RIUk9XX0JBRF9BTExPQzsKKyAgICB9CisKKyAgICBpZiAoX19uICE9IDApIHsKKyAgICAgIHNpemVfdHlwZSBfX2J1Zl9zaXplID0gX19uICogc2l6ZW9mKHZhbHVlX3R5cGUpOworICAgICAgX1RwKiBfX3JldCA9IF9fUkVJTlRFUlBSRVRfQ0FTVChfVHAqLCBfX3NnaV9hbGxvYzo6YWxsb2NhdGUoX19idWZfc2l6ZSkpOworI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHX1VOSU5JVElBTElaRUQpICYmICFkZWZpbmVkIChfU1RMUF9ERUJVR19BTExPQykKKyAgICAgIG1lbXNldCgoY2hhciopX19yZXQsIF9TVExQX1NIUkVEX0JZVEUsIF9fYnVmX3NpemUpOworI2VuZGlmCisgICAgICBfX2FsbG9jYXRlZF9uID0gX19idWZfc2l6ZSAvIHNpemVvZih2YWx1ZV90eXBlKTsKKyAgICAgIHJldHVybiBfX3JldDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKKyAgfQorI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QQVJUSUFMX1NQRUNfV09SS0FST1VORCkgJiYgIWRlZmluZWQgKF9TVExQX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUikKKyAgdm9pZCBfTV9zd2FwX3dvcmthcm91bmQoYWxsb2NhdG9yPF9UcD4mIF9fb3RoZXIpIHt9CisjZW5kaWYKK307CisKK19TVExQX1RFTVBMQVRFX05VTEwKK2NsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIGFsbG9jYXRvcjx2b2lkPiB7CitwdWJsaWM6CisgIHR5cGVkZWYgc2l6ZV90ICAgICAgc2l6ZV90eXBlOworICB0eXBlZGVmIHB0cmRpZmZfdCAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgdHlwZWRlZiB2b2lkKiAgICAgICBwb2ludGVyOworICB0eXBlZGVmIGNvbnN0IHZvaWQqIGNvbnN0X3BvaW50ZXI7CisjaWYgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikKKyAgdHlwZWRlZiB2b2lkICAgICAgICB2YWx1ZV90eXBlOworI2VuZGlmCisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFX0NMQVNTRVMpCisgIHRlbXBsYXRlIDxjbGFzcyBfVHAxPiBzdHJ1Y3QgcmViaW5kIHsKKyAgICB0eXBlZGVmIGFsbG9jYXRvcjxfVHAxPiBvdGhlcjsKKyAgfTsKKyNlbmRpZgorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgoraW5saW5lIGJvb2wgX1NUTFBfQ0FMTCBvcGVyYXRvcj09KGNvbnN0IGFsbG9jYXRvcjxfVDE+JiwgY29uc3QgYWxsb2NhdG9yPF9UMj4mKSBfU1RMUF9OT1RIUk9XCit7IHJldHVybiB0cnVlOyB9Cit0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yIT0oY29uc3QgYWxsb2NhdG9yPF9UMT4mLCBjb25zdCBhbGxvY2F0b3I8X1QyPiYpIF9TVExQX05PVEhST1cKK3sgcmV0dXJuIGZhbHNlOyB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUKQorX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIGFsbG9jYXRvcjxjaGFyPjsKKyMgIGlmIGRlZmluZWQgKF9TVExQX0hBU19XQ0hBUl9UKQorX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIGFsbG9jYXRvcjx3Y2hhcl90PjsKKyMgIGVuZGlmCisjICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfUFRSX1NQRUNJQUxJWkFUSU9OUykKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBhbGxvY2F0b3I8dm9pZCo+OworIyAgZW5kaWYKKyNlbmRpZgorCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX19hbGxvY190eXBlX3RyYWl0cyB7CisjaWYgIWRlZmluZWQgKF9fQk9STEFORENfXykKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSXNTVExwb3J0Q2xhc3M8YWxsb2NhdG9yPF9UcD4gPjo6X1JldCBfU1RMcG9ydEFsbG9jOworI2Vsc2UKKyAgZW51bSB7IF9JcyA9IF9Jc1NUTHBvcnRDbGFzczxhbGxvY2F0b3I8X1RwPiA+OjpfSXMgfTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jvb2wydHlwZTxfSXM+OjpfUmV0IF9TVExwb3J0QWxsb2M7CisjZW5kaWYKKyAgLy9UaGUgZGVmYXVsdCBhbGxvY2F0b3IgaW1wbGVtZW50YXRpb24gd2hpY2ggaXMgcmVjb2duaXplIHRoYW5rcyB0byB0aGUKKyAgLy9fX3N0bHBvcnRfY2xhc3MgaW5oZXJpdGFuY2UgaXMgYSBzdGF0ZWxlc3Mgb2JqZWN0IHNvOgorICB0eXBlZGVmIF9TVExwb3J0QWxsb2MgaGFzX3RyaXZpYWxfZGVmYXVsdF9jb25zdHJ1Y3RvcjsKKyAgdHlwZWRlZiBfU1RMcG9ydEFsbG9jIGhhc190cml2aWFsX2NvcHlfY29uc3RydWN0b3I7CisgIHR5cGVkZWYgX1NUTHBvcnRBbGxvYyBoYXNfdHJpdmlhbF9hc3NpZ25tZW50X29wZXJhdG9yOworICB0eXBlZGVmIF9TVExwb3J0QWxsb2MgaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjsKKyAgdHlwZWRlZiBfU1RMcG9ydEFsbG9jIGlzX1BPRF90eXBlOworfTsKKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKKyNpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfX3R5cGVfdHJhaXRzPGFsbG9jYXRvcjxfVHA+ID4gOiBfU1RMUF9QUklWIF9fYWxsb2NfdHlwZV90cmFpdHM8X1RwPiB7fTsKKyNlbHNlCitfU1RMUF9URU1QTEFURV9OVUxMCitzdHJ1Y3QgX190eXBlX3RyYWl0czxhbGxvY2F0b3I8Y2hhcj4gPiA6IF9TVExQX1BSSVYgX19hbGxvY190eXBlX3RyYWl0czxjaGFyPiB7fTsKKyMgIGlmIGRlZmluZWQgKF9TVExQX0hBU19XQ0hBUl9UKQorX1NUTFBfVEVNUExBVEVfTlVMTAorc3RydWN0IF9fdHlwZV90cmFpdHM8YWxsb2NhdG9yPHdjaGFyX3Q+ID4gOiBfU1RMUF9QUklWIF9fYWxsb2NfdHlwZV90cmFpdHM8d2NoYXJfdD4ge307CisjICBlbmRpZgorIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BUUl9TUEVDSUFMSVpBVElPTlMpCitfU1RMUF9URU1QTEFURV9OVUxMCitzdHJ1Y3QgX190eXBlX3RyYWl0czxhbGxvY2F0b3I8dm9pZCo+ID4gOiBfU1RMUF9QUklWIF9fYWxsb2NfdHlwZV90cmFpdHM8dm9pZCo+IHt9OworIyAgZW5kaWYKKyNlbmRpZgorCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfRk9SQ0VfQUxMT0NBVE9SUykKKyMgIGRlZmluZSBfU1RMUF9GT1JDRV9BTExPQ0FUT1JTKGEseSkKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikgJiYgIWRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURV9DTEFTU0VTKQorLy8gVGhlIHZlcnNpb24gZm9yIHRoZSBkZWZhdWx0IGFsbG9jYXRvciwgZm9yIHJhcmUgb2NjYXNpb24gd2hlbiB3ZSBoYXZlIHBhcnRpYWwgc3BlYyB3L28gbWVtYmVyIHRlbXBsYXRlIGNsYXNzZXMKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9UcDE+CitzdHJ1Y3QgX0FsbG9jX3RyYWl0czxfVHAsIGFsbG9jYXRvcjxfVHAxPiA+IHsKKyAgdHlwZWRlZiBhbGxvY2F0b3I8X1RwMT4gX09yaWc7CisgIHR5cGVkZWYgYWxsb2NhdG9yPF9UcD4gYWxsb2NhdG9yX3R5cGU7CisgIHN0YXRpYyBhbGxvY2F0b3JfdHlwZSBjcmVhdGVfYWxsb2NhdG9yKGNvbnN0IGFsbG9jYXRvcjxfVHAxID4mIF9fYSkKKyAgeyByZXR1cm4gYWxsb2NhdG9yX3R5cGUoX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoX19hLCBfVHApKTsgfQorfTsKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfU1VQUE9SVF9SRUJJTkRfTUVNQkVSX1RFTVBMQVRFKSAmJiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgoraW5saW5lIF9TVExQX1RZUEVOQU1FX09OX1JFVFVSTl9UWVBFIF9BbGxvY190cmFpdHM8X1RwLCBfQWxsb2M+OjphbGxvY2F0b3JfdHlwZSAgX1NUTFBfQ0FMTAorX19zdGxfYWxsb2NfY3JlYXRlKGNvbnN0IF9BbGxvYyYgX19hLCBjb25zdCBfVHAqKSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpfU1RMUF9URU1QTEFURSByZWJpbmQ8X1RwPjo6b3RoZXIgX1JlYm91bmRfdHlwZTsKKyAgcmV0dXJuIF9SZWJvdW5kX3R5cGUoX19hKTsKK30KKyNlbHNlCisvLyBJZiBjdXN0b20gYWxsb2NhdG9ycyBhcmUgYmVpbmcgdXNlZCB3aXRob3V0IG1lbWJlciB0ZW1wbGF0ZSBjbGFzc2VzIHN1cHBvcnQgOgorLy8gdXNlciAob24gcHVycG9zZSkgaXMgZm9yY2VkIHRvIGRlZmluZSByZWJpbmQvZ2V0IG9wZXJhdGlvbnMgISEhCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwMSwgY2xhc3MgX1RwMj4KK2lubGluZSBhbGxvY2F0b3I8X1RwMj4mIF9TVExQX0NBTEwKK19fc3RsX2FsbG9jX3JlYmluZChhbGxvY2F0b3I8X1RwMT4mIF9fYSwgY29uc3QgX1RwMiopIHsgIHJldHVybiAoYWxsb2NhdG9yPF9UcDI+JikoX19hKTsgfQordGVtcGxhdGUgPGNsYXNzIF9UcDEsIGNsYXNzIF9UcDI+CitpbmxpbmUgYWxsb2NhdG9yPF9UcDI+IF9TVExQX0NBTEwKK19fc3RsX2FsbG9jX2NyZWF0ZShjb25zdCBhbGxvY2F0b3I8X1RwMT4mLCBjb25zdCBfVHAyKikgeyByZXR1cm4gYWxsb2NhdG9yPF9UcDI+KCk7IH0KKyNlbmRpZgorCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKKy8vIGluaGVyaXRhbmNlIGlzIGJlaW5nIHVzZWQgZm9yIEVCTyBvcHRpbWl6YXRpb24KK3RlbXBsYXRlIDxjbGFzcyBfVmFsdWUsIGNsYXNzIF9UcCwgY2xhc3MgX01heWJlUmVib3VuZEFsbG9jPgorY2xhc3MgX1NUTFBfYWxsb2NfcHJveHkgOiBwdWJsaWMgX01heWJlUmVib3VuZEFsbG9jIHsKK3ByaXZhdGU6CisgIHR5cGVkZWYgX01heWJlUmVib3VuZEFsbG9jIF9CYXNlOworICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpzaXplX3R5cGUgc2l6ZV90eXBlOworICB0eXBlZGVmIF9TVExQX2FsbG9jX3Byb3h5PF9WYWx1ZSwgX1RwLCBfTWF5YmVSZWJvdW5kQWxsb2M+IF9TZWxmOworcHVibGljOgorICBfVmFsdWUgX01fZGF0YTsKKworICBfU1RMUF9hbGxvY19wcm94eSAoY29uc3QgX01heWJlUmVib3VuZEFsbG9jJiBfX2EsIF9WYWx1ZSBfX3ApIDoKKyAgICBfTWF5YmVSZWJvdW5kQWxsb2MoX19hKSwgX01fZGF0YShfX3ApIHt9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKKyAgX1NUTFBfYWxsb2NfcHJveHkgKF9fbW92ZV9zb3VyY2U8X1NlbGY+IHNyYykgOgorICAgIF9CYXNlKF9TVExQX1BSSVYgX0FzTW92ZVNvdXJjZShzcmMuZ2V0KCkuX01fYmFzZSgpKSksCisgICAgX01fZGF0YShfU1RMUF9QUklWIF9Bc01vdmVTb3VyY2Uoc3JjLmdldCgpLl9NX2RhdGEpKSB7fQorCisgIF9CYXNlJiBfTV9iYXNlKCkKKyAgeyByZXR1cm4gKnRoaXM7IH0KKyNlbmRpZgorCitwcml2YXRlOgorICAvKiBGb2xsb3dpbmcgYXJlIGhlbHBlciBtZXRob2RzIHRvIGRldGVjdCBzdGF0ZWxlc3MgYWxsb2NhdG9ycyBhbmQgYXZvaWQKKyAgICogc3dhcCBpbiB0aGlzIGNhc2UuIEZvciBzb21lIGNvbXBpbGVycyAoVkM2KSBpdCBpcyBhIHdvcmthcm91bmQgZm9yIGEKKyAgICogY29tcGlsZXIgYnVnIGluIHRoZSBFbXB0eSBCYXNlIGNsYXNzIE9wdGltaXphdGlvbiBmZWF0dXJlLCBmb3Igb3RoZXJzCisgICAqIGl0IGlzIGEgc21hbGwgb3B0aW1pemF0aW9uIG9yIG5vdGhpbmcgaWYgbm8gRUJPLiAqLworICB2b2lkIF9NX3N3YXBfYWxsb2MoX1NlbGYmLCBjb25zdCBfX3RydWVfdHlwZSYgLypfSXNTdGF0ZWxlc3MqLykKKyAge30KKworICB2b2lkIF9NX3N3YXBfYWxsb2MoX1NlbGYmIF9feCwgY29uc3QgX19mYWxzZV90eXBlJiAvKl9Jc1N0YXRlbGVzcyovKSB7CisgICAgX01heWJlUmVib3VuZEFsbG9jICZfX2Jhc2VfdGhpcyA9ICp0aGlzOworICAgIF9NYXliZVJlYm91bmRBbGxvYyAmX19iYXNlX3ggPSBfX3g7CisgICAgX1NUTFBfU1REOjpzd2FwKF9fYmFzZV90aGlzLCBfX2Jhc2VfeCk7CisgIH0KKworcHVibGljOgorICB2b2lkIF9NX3N3YXBfYWxsb2MoX1NlbGYmIF9feCkgeworI2lmICFkZWZpbmVkIChfX0JPUkxBTkRDX18pCisgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXNTdGF0ZWxlc3M8X01heWJlUmVib3VuZEFsbG9jPjo6X1JldCBfU3RhdGVsZXNzQWxsb2M7CisjZWxzZQorICAgIHR5cGVkZWYgdHlwZW5hbWUgX19ib29sMnR5cGU8X0lzU3RhdGVsZXNzPF9NYXliZVJlYm91bmRBbGxvYz46Ol9Jcz46Ol9SZXQgX1N0YXRlbGVzc0FsbG9jOworI2VuZGlmCisgICAgX01fc3dhcF9hbGxvYyhfX3gsIF9TdGF0ZWxlc3NBbGxvYygpKTsKKyAgfQorCisgIC8qIFdlIG5lZWQgdG8gZGVmaW5lIHRoZSBmb2xsb3dpbmcgc3dhcCBpbXBsZW1lbnRhdGlvbiBmb3IgYWxsb2NhdG9yIHdpdGggc3RhdGUKKyAgICogYXMgdGhvc2UgYWxsb2NhdG9ycyBtaWdodCBoYXZlIGltcGxlbWVudCBhIHNwZWNpYWwgc3dhcCBmdW5jdGlvbiB0byBjb3JyZWN0bHkKKyAgICogbW92ZSBkYXRhcyBmcm9tIGFuIGluc3RhbmNlIHRvIHRoZSBvaGVyLCBfU1RMUF9hbGxvY19wcm94eSBzaG91bGQgbm90IGJyZWFrCisgICAqIHRoaXMgbWVjYW5pc20uICovCisgIHZvaWQgc3dhcChfU2VsZiYgX194KSB7CisgICAgX01fc3dhcF9hbGxvYyhfX3gpOworICAgIF9TVExQX1NURDo6c3dhcChfTV9kYXRhLCBfX3guX01fZGF0YSk7CisgIH0KKworICBfVHAqIGFsbG9jYXRlKHNpemVfdHlwZSBfX24sIHNpemVfdHlwZSYgX19hbGxvY2F0ZWRfbikgeworI2lmICFkZWZpbmVkIChfX0JPUkxBTkRDX18pCisgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXNTVExwb3J0Q2xhc3M8X01heWJlUmVib3VuZEFsbG9jPjo6X1JldCBfU1RMcG9ydEFsbG9jOworI2Vsc2UKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fYm9vbDJ0eXBlPF9Jc1NUTHBvcnRDbGFzczxfTWF5YmVSZWJvdW5kQWxsb2M+OjpfSXM+OjpfUmV0IF9TVExwb3J0QWxsb2M7CisjZW5kaWYKKyAgICByZXR1cm4gYWxsb2NhdGUoX19uLCBfX2FsbG9jYXRlZF9uLCBfU1RMcG9ydEFsbG9jKCkpOworICB9CisKKyAgLy8gVW5pZmllZCBpbnRlcmZhY2UgdG8gcGVyZm9ybSBhbGxvY2F0ZSgpL2RlYWxsb2NhdGUoKSB3aXRoIGxpbWl0ZWQKKyAgLy8gbGFuZ3VhZ2Ugc3VwcG9ydAorI2lmIGRlZmluZWQgKF9TVExQX0RPTlRfU1VQUE9SVF9SRUJJTkRfTUVNQkVSX1RFTVBMQVRFKQorICAvLyBlbHNlIGl0IGlzIHJlYm91bmQgYWxyZWFkeSwgYW5kIGFsbG9jYXRlKCkgbWVtYmVyIGlzIGFjY2Vzc2libGUKKyAgX1RwKiBhbGxvY2F0ZShzaXplX3R5cGUgX19uKQorICB7IHJldHVybiBfX3N0bF9hbGxvY19yZWJpbmQoX19TVEFUSUNfQ0FTVChfQmFzZSYsICp0aGlzKSwgX19TVEFUSUNfQ0FTVChfVHAqLCAwKSkuYWxsb2NhdGUoX19uLCAwKTsgfQorICB2b2lkIGRlYWxsb2NhdGUoX1RwKiBfX3AsIHNpemVfdHlwZSBfX24pCisgIHsgX19zdGxfYWxsb2NfcmViaW5kKF9fU1RBVElDX0NBU1QoX0Jhc2UmLCAqdGhpcyksIF9fU1RBVElDX0NBU1QoX1RwKiwgMCkpLmRlYWxsb2NhdGUoX19wLCBfX24pOyB9Citwcml2YXRlOgorICBfVHAqIGFsbG9jYXRlKHNpemVfdHlwZSBfX24sIHNpemVfdHlwZSYgX19hbGxvY2F0ZWRfbiwgY29uc3QgX190cnVlX3R5cGUmIC8qU1RMcG9ydCBhbGxvY2F0b3IqLykKKyAgeyByZXR1cm4gX19zdGxfYWxsb2NfcmViaW5kKF9fU1RBVElDX0NBU1QoX0Jhc2UmLCAqdGhpcyksIF9fU1RBVElDX0NBU1QoX1RwKiwgMCkpLl9NX2FsbG9jYXRlKF9fbiwgX19hbGxvY2F0ZWRfbik7IH0KKyNlbHNlCisgIC8vRXhwb3NlIFN0YW5kYXJkIGFsbG9jYXRlIG92ZXJsb2FkICh1c2luZyBleHByZXNzaW9uIGRvIG5vdCB3b3JrIGZvciBzb21lIGNvbXBpbGVycyAoQm9ybGFuZCkpCisgIF9UcCogYWxsb2NhdGUoc2l6ZV90eXBlIF9fbikKKyAgeyByZXR1cm4gX0Jhc2U6OmFsbG9jYXRlKF9fbik7IH0KK3ByaXZhdGU6CisgIF9UcCogYWxsb2NhdGUoc2l6ZV90eXBlIF9fbiwgc2l6ZV90eXBlJiBfX2FsbG9jYXRlZF9uLCBjb25zdCBfX3RydWVfdHlwZSYgLypTVExwb3J0IGFsbG9jYXRvciovKQorICB7IHJldHVybiBfQmFzZTo6X01fYWxsb2NhdGUoX19uLCBfX2FsbG9jYXRlZF9uKTsgfQorI2VuZGlmCisKKyAgX1RwKiBhbGxvY2F0ZShzaXplX3R5cGUgX19uLCBzaXplX3R5cGUmIF9fYWxsb2NhdGVkX24sIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypTVExwb3J0IGFsbG9jYXRvciovKQorICB7IF9fYWxsb2NhdGVkX24gPSBfX247IHJldHVybiBhbGxvY2F0ZShfX24pOyB9Cit9OworCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCkKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBfU1RMUF9hbGxvY19wcm94eTxjaGFyKiwgY2hhciwgYWxsb2NhdG9yPGNoYXI+ID47CisjICBpZiBkZWZpbmVkIChfU1RMUF9IQVNfV0NIQVJfVCkKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBfU1RMUF9hbGxvY19wcm94eTx3Y2hhcl90Kiwgd2NoYXJfdCwgYWxsb2NhdG9yPHdjaGFyX3Q+ID47CisjICBlbmRpZgorIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BUUl9TUEVDSUFMSVpBVElPTlMpCitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgX1NUTFBfYWxsb2NfcHJveHk8dm9pZCoqLCB2b2lkKiwgYWxsb2NhdG9yPHZvaWQqPiA+OworIyAgZW5kaWYKKyNlbmRpZgorCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2lmIGRlZmluZWQgKF9TVExQX0VYUE9TRV9HTE9CQUxTX0lNUExFTUVOVEFUSU9OKSAmJiAhZGVmaW5lZCAoX1NUTFBfTElOS19USU1FX0lOU1RBTlRJQVRJT04pCisjICBpbmNsdWRlIDxzdGwvX2FsbG9jLmM+CisjZW5kaWYKKworI2VuZGlmIC8qIF9TVExQX0lOVEVSTkFMX0FMTE9DX0ggKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKKwpkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdGwvX2F1dG9fcHRyLmggYi9zdGxwb3J0L3N0bC9fYXV0b19wdHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzUwNTM0Ci0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvX2F1dG9fcHRyLmgKQEAgLTAsMCArMSwxMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMTk5OQorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9BVVRPX1BUUl9ICisjZGVmaW5lIF9TVExQX0FVVE9fUFRSX0gKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisvLyBpbXBsZW1lbnRhdGlvbiBwcmltaXRpdmUKK2NsYXNzIF9fcHRyX2Jhc2UgeworcHVibGljOgorICB2b2lkKiBfTV9wOworICB2b2lkICBfX3NldChjb25zdCB2b2xhdGlsZSB2b2lkKiBwKSB7IF9NX3AgPSBfX0NPTlNUX0NBU1Qodm9pZCoscCk7IH0KKyAgdm9pZCAgX19zZXQodm9pZCogcCkgeyBfTV9wID0gcDsgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2NsYXNzIGF1dG9fcHRyX3JlZiB7CitwdWJsaWM6CisgIF9fcHRyX2Jhc2UmIF9NX3I7CisgIF9UcCogY29uc3QgX01fcDsKKworICBhdXRvX3B0cl9yZWYoX19wdHJfYmFzZSYgX19yLCBfVHAqIF9fcCkgOiBfTV9yKF9fciksIF9NX3AoX19wKSB7ICB9CisKKyAgX1RwKiByZWxlYXNlKCkgY29uc3QgeyBfTV9yLl9fc2V0KF9fU1RBVElDX0NBU1Qodm9pZCosIDApKTsgcmV0dXJuIF9NX3A7IH0KKworcHJpdmF0ZToKKyAgLy9leHBsaWNpdGVseSBkZWZpbmVkIGFzIHByaXZhdGUgdG8gYXZvaWQgd2FybmluZ3M6CisgIHR5cGVkZWYgYXV0b19wdHJfcmVmPF9UcD4gX1NlbGY7CisgIF9TZWxmJiBvcGVyYXRvciA9IChfU2VsZiBjb25zdCYpOworfTsKKwordGVtcGxhdGU8Y2xhc3MgX1RwPgorY2xhc3MgYXV0b19wdHIgOiAgcHVibGljIF9fcHRyX2Jhc2UgeworcHVibGljOgorICB0eXBlZGVmIF9UcCBlbGVtZW50X3R5cGU7CisgIHR5cGVkZWYgYXV0b19wdHI8X1RwPiBfU2VsZjsKKworICBfVHAqIHJlbGVhc2UoKSBfU1RMUF9OT1RIUk9XIHsKKyAgICBfVHAqIF9fcHggPSB0aGlzLT5nZXQoKTsKKyAgICB0aGlzLT5fTV9wID0gMDsKKyAgICByZXR1cm4gX19weDsKKyAgfQorCisgIHZvaWQgcmVzZXQoX1RwKiBfX3B4ID0gMCkgX1NUTFBfTk9USFJPVyB7CisgICAgX1RwKiBfX3B0ID0gdGhpcy0+Z2V0KCk7CisgICAgaWYgKF9fcHggIT0gX19wdCkKKyAgICAgIGRlbGV0ZSBfX3B0OworICAgIHRoaXMtPl9fc2V0KF9fcHgpOworICB9CisKKyAgX1RwKiBnZXQoKSBjb25zdCBfU1RMUF9OT1RIUk9XCisjaWYgIWRlZmluZWQgKF9fR05VQ19fKSB8fCAoX19HTlVDX18gPiAyKQorICB7IHJldHVybiBfX1NUQVRJQ19DQVNUKF9UcCosIF9NX3ApOyB9CisjZWxzZQorICB7IHJldHVybiBfX1JFSU5URVJQUkVUX0NBU1QoX1RwKiwgX01fcCk7IH0KKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKF9TVExQX05PX0FSUk9XX09QRVJBVE9SKQorICBfVHAqIG9wZXJhdG9yLT4oKSBjb25zdCBfU1RMUF9OT1RIUk9XIHsKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVChnZXQoKSAhPSAwLCBfU3RsTXNnX0FVVE9fUFRSX05VTEwpCisgICAgcmV0dXJuIGdldCgpOworICB9CisjZW5kaWYKKyAgX1RwJiBvcGVyYXRvciooKSBjb25zdCBfU1RMUF9OT1RIUk9XIHsKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVChnZXQoKSAhPSAwLCBfU3RsTXNnX0FVVE9fUFRSX05VTEwpCisgICAgcmV0dXJuICpnZXQoKTsKKyAgfQorCisgIGV4cGxpY2l0IGF1dG9fcHRyKF9UcCogX19weCA9IDApIF9TVExQX05PVEhST1cgeyB0aGlzLT5fX3NldChfX3B4KTsgfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9OT19URU1QTEFURV9DT05WRVJTSU9OUykKKyAgdGVtcGxhdGU8Y2xhc3MgX1RwMT4gYXV0b19wdHIoYXV0b19wdHI8X1RwMT4mIF9fcikgX1NUTFBfTk9USFJPVyB7CisgICAgX1RwKiBfX2NvbnZlcnNpb25DaGVjayA9IF9fci5yZWxlYXNlKCk7CisgICAgdGhpcy0+X19zZXQoX19jb252ZXJzaW9uQ2hlY2spOworICB9CisjICBlbmRpZgorICB0ZW1wbGF0ZTxjbGFzcyBfVHAxPiBhdXRvX3B0cjxfVHA+JiBvcGVyYXRvcj0oYXV0b19wdHI8X1RwMT4mIF9fcikgX1NUTFBfTk9USFJPVyB7CisgICAgX1RwKiBfX2NvbnZlcnNpb25DaGVjayA9IF9fci5yZWxlYXNlKCk7CisgICAgcmVzZXQoX19jb252ZXJzaW9uQ2hlY2spOworICAgIHJldHVybiAqdGhpczsKKyAgfQorI2VuZGlmCisKKyAgYXV0b19wdHIoX1NlbGYmIF9fcikgX1NUTFBfTk9USFJPVyB7IHRoaXMtPl9fc2V0KF9fci5yZWxlYXNlKCkpOyB9CisKKyAgX1NlbGYmIG9wZXJhdG9yPShfU2VsZiYgX19yKSBfU1RMUF9OT1RIUk9XIHsKKyAgICByZXNldChfX3IucmVsZWFzZSgpKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB+YXV0b19wdHIoKSBfU1RMUF9OT1RIUk9XIHsgLyogYm9yaXMgOiByZXNldCgwKSBtaWdodCBiZSBiZXR0ZXIgKi8gZGVsZXRlIHRoaXMtPmdldCgpOyB9CisKKyAgYXV0b19wdHIoYXV0b19wdHJfcmVmPF9UcD4gX19yKSBfU1RMUF9OT1RIUk9XCisgIHsgdGhpcy0+X19zZXQoX19yLnJlbGVhc2UoKSk7IH0KKworICBfU2VsZiYgb3BlcmF0b3I9KGF1dG9fcHRyX3JlZjxfVHA+IF9fcikgX1NUTFBfTk9USFJPVyB7CisgICAgcmVzZXQoX19yLnJlbGVhc2UoKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyNpZiBkZWZpbmVkKF9TVExQX01FTUJFUl9URU1QTEFURVMpICYmICFkZWZpbmVkKF9TVExQX05PX1RFTVBMQVRFX0NPTlZFUlNJT05TKQorICB0ZW1wbGF0ZTxjbGFzcyBfVHAxPiBvcGVyYXRvciBhdXRvX3B0cl9yZWY8X1RwMT4oKSBfU1RMUF9OT1RIUk9XCisgIHsgcmV0dXJuIGF1dG9fcHRyX3JlZjxfVHAxPigqdGhpcywgdGhpcy0+Z2V0KCkpOyB9CisgIHRlbXBsYXRlPGNsYXNzIF9UcDE+IG9wZXJhdG9yIGF1dG9fcHRyPF9UcDE+KCkgX1NUTFBfTk9USFJPVworICB7IHJldHVybiBhdXRvX3B0cjxfVHAxPihyZWxlYXNlKCkpOyB9CisjZWxzZQorICBvcGVyYXRvciBhdXRvX3B0cl9yZWY8X1RwPigpIF9TVExQX05PVEhST1cKKyAgeyByZXR1cm4gYXV0b19wdHJfcmVmPF9UcD4oKnRoaXMsIHRoaXMtPmdldCgpKTsgfQorI2VuZGlmCit9OworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLyogX1NUTFBfQVVUT19QVFJfSCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RsL19iaXRzZXQuYyBiL3N0bHBvcnQvc3RsL19iaXRzZXQuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3RsL19iaXRzZXQuYwpyZW5hbWUgdG8gc3RscG9ydC9zdGwvX2JpdHNldC5jCmRpZmYgLS1naXQgYS9zdGwvX2JpdHNldC5oIGIvc3RscG9ydC9zdGwvX2JpdHNldC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzdGwvX2JpdHNldC5oCnJlbmFtZSB0byBzdGxwb3J0L3N0bC9fYml0c2V0LmgKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL19idmVjdG9yLmggYi9zdGxwb3J0L3N0bC9fYnZlY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNDE3ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9fYnZlY3Rvci5oCkBAIC0wLDAgKzEsODQxIEBACisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworLyogTk9URTogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgU1RMIGhlYWRlcnMuCisgKiAgIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LgorICovCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQlZFQ1RPUl9ICisjZGVmaW5lIF9TVExQX0lOVEVSTkFMX0JWRUNUT1JfSAorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX1ZFQ1RPUl9ICisjICBpbmNsdWRlIDxzdGwvX3ZlY3Rvci5oPgorI2VuZGlmCisKKyNkZWZpbmUgX1NUTFBfV09SRF9CSVQgKGludChDSEFSX0JJVCAqIHNpemVvZih1bnNpZ25lZCBpbnQpKSkKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3N0cnVjdCBfQml0X3JlZmVyZW5jZSB7CisgIHVuc2lnbmVkIGludCogX01fcDsKKyAgdW5zaWduZWQgaW50IF9NX21hc2s7CisgIF9CaXRfcmVmZXJlbmNlKHVuc2lnbmVkIGludCogX194LCB1bnNpZ25lZCBpbnQgX195KQorICAgIDogX01fcChfX3gpLCBfTV9tYXNrKF9feSkge30KKworcHVibGljOgorICBfQml0X3JlZmVyZW5jZSgpIDogX01fcCgwKSwgX01fbWFzaygwKSB7fQorCisgIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7CisgICAgcmV0dXJuICEoISgqX01fcCAmIF9NX21hc2spKTsKKyAgfQorICBfQml0X3JlZmVyZW5jZSYgb3BlcmF0b3IgPSAoYm9vbCBfX3gpIHsKKyAgICBpZiAoX194KSAgKl9NX3AgfD0gX01fbWFzazsKKyAgICBlbHNlICAgICAgKl9NX3AgJj0gfl9NX21hc2s7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIF9CaXRfcmVmZXJlbmNlJiBvcGVyYXRvciA9IChjb25zdCBfQml0X3JlZmVyZW5jZSYgX194KSB7CisgICAgcmV0dXJuICp0aGlzID0gYm9vbChfX3gpOworICB9CisgIGJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IF9CaXRfcmVmZXJlbmNlJiBfX3gpIGNvbnN0IHsKKyAgICByZXR1cm4gYm9vbCgqdGhpcykgPT0gYm9vbChfX3gpOworICB9CisgIGJvb2wgb3BlcmF0b3IgPCAoY29uc3QgX0JpdF9yZWZlcmVuY2UmIF9feCkgY29uc3QgeworICAgIHJldHVybiAhYm9vbCgqdGhpcykgJiYgYm9vbChfX3gpOworICB9CisKKyAgX0JpdF9yZWZlcmVuY2UmIG9wZXJhdG9yIHw9IChib29sIF9feCkgeworICAgIGlmIChfX3gpCisgICAgICAqX01fcCB8PSBfTV9tYXNrOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBfQml0X3JlZmVyZW5jZSYgb3BlcmF0b3IgJj0gKGJvb2wgX194KSB7CisgICAgaWYgKCFfX3gpCisgICAgICAqX01fcCAmPSB+X01fbWFzazsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgdm9pZCBmbGlwKCkgeyAqX01fcCBePSBfTV9tYXNrOyB9Cit9OworCisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCitpbmxpbmUgdm9pZCBzd2FwKF9TVExQX1BSSVYgX0JpdF9yZWZlcmVuY2UmIF9feCwgX1NUTFBfUFJJViBfQml0X3JlZmVyZW5jZSYgX195KSB7CisgIGJvb2wgX190bXAgPSAoYm9vbClfX3g7CisgIF9feCA9IF9feTsKKyAgX195ID0gX190bXA7Cit9CisKKy8vIE1pZ2h0IG5vdCBiZSB2ZXJ5IHVzZWZ1bCBidXQgY29zdHMgbm90aGluZyEKK19TVExQX1RFTVBMQVRFX05VTEwKK3N0cnVjdCBfX3R5cGVfdHJhaXRzPF9TVExQX1BSSVYgX0JpdF9yZWZlcmVuY2U+IHsKKyAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgICAgaGFzX3RyaXZpYWxfZGVmYXVsdF9jb25zdHJ1Y3RvcjsKKyAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICAgaGFzX3RyaXZpYWxfY29weV9jb25zdHJ1Y3RvcjsKKyAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgICAgaGFzX3RyaXZpYWxfYXNzaWdubWVudF9vcGVyYXRvcjsKKyAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICAgaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjsKKyAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgICAgaXNfUE9EX3R5cGU7Cit9OworCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3N0cnVjdCBfQml0X2l0ZXJhdG9yX2Jhc2UgeworICB0eXBlZGVmIHB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7CisKKyAgdW5zaWduZWQgaW50KiBfTV9wOworICB1bnNpZ25lZCBpbnQgIF9NX29mZnNldDsKKworICB2b2lkIF9NX2J1bXBfdXAoKSB7CisgICAgaWYgKF9NX29mZnNldCsrID09IF9TVExQX1dPUkRfQklUIC0gMSkgeworICAgICAgX01fb2Zmc2V0ID0gMDsKKyAgICAgICsrX01fcDsKKyAgICB9CisgIH0KKworICB2b2lkIF9NX2J1bXBfZG93bigpIHsKKyAgICBpZiAoX01fb2Zmc2V0LS0gPT0gMCkgeworICAgICAgX01fb2Zmc2V0ID0gX1NUTFBfV09SRF9CSVQgLSAxOworICAgICAgLS1fTV9wOworICAgIH0KKyAgfQorCisgIF9CaXRfaXRlcmF0b3JfYmFzZSgpIDogX01fcCgwKSwgX01fb2Zmc2V0KDApIHt9CisgIF9CaXRfaXRlcmF0b3JfYmFzZSh1bnNpZ25lZCBpbnQqIF9feCwgdW5zaWduZWQgaW50IF9feSkgOiBfTV9wKF9feCksIF9NX29mZnNldChfX3kpIHt9CisvLyBzZWUgY29tbWVudCBpbiBkb2MvUkVBRE1FLmV2YzQgYW5kIGRvYy9SRUFETUUuZXZjOAorI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIF9NU0NfVkVSPD0xNDAxICYmIGRlZmluZWQoTUlQUykgJiYgZGVmaW5lZChOREVCVUcpCisgIF9CaXRfaXRlcmF0b3JfYmFzZSggY29uc3QgX0JpdF9pdGVyYXRvcl9iYXNlJiBfX3gpIDogX01fcChfX3guX01fcCksIF9NX29mZnNldChfX3guX01fb2Zmc2V0KSB7fQorI2VuZGlmCisgIC8vICBfQml0X2l0ZXJhdG9yX2Jhc2UmIG9wZXJhdG9yID0gKCBjb25zdCBfQml0X2l0ZXJhdG9yX2Jhc2UmIF9feCkgeyBfTV9wID0gX194Ll9NX3AgOyBfTV9vZmZzZXQgPSBfX3guX01fb2Zmc2V0IDsgcmV0dXJuICp0aGlzOyB9CisKKyAgdm9pZCBfTV9hZHZhbmNlIChkaWZmZXJlbmNlX3R5cGUgX19pKSB7CisgICAgZGlmZmVyZW5jZV90eXBlIF9fbiA9IF9faSArIF9NX29mZnNldDsKKyAgICBfTV9wICs9IF9fbiAvIF9TVExQX1dPUkRfQklUOworICAgIF9fbiA9IF9fbiAlIF9TVExQX1dPUkRfQklUOworICAgIGlmIChfX24gPCAwKSB7CisgICAgICBfTV9vZmZzZXQgPSAodW5zaWduZWQgaW50KSBfX24gKyBfU1RMUF9XT1JEX0JJVDsKKyAgICAgIC0tX01fcDsKKyAgICB9IGVsc2UKKyAgICAgIF9NX29mZnNldCA9ICh1bnNpZ25lZCBpbnQpIF9fbjsKKyAgfQorCisgIGRpZmZlcmVuY2VfdHlwZSBfTV9zdWJ0cmFjdChjb25zdCBfQml0X2l0ZXJhdG9yX2Jhc2UmIF9feCkgY29uc3QgeworICAgIHJldHVybiBfU1RMUF9XT1JEX0JJVCAqIChfTV9wIC0gX194Ll9NX3ApICsgX01fb2Zmc2V0IC0gX194Ll9NX29mZnNldDsKKyAgfQorfTsKKworaW5saW5lIGJvb2wgIF9TVExQX0NBTEwgb3BlcmF0b3I9PShjb25zdCBfQml0X2l0ZXJhdG9yX2Jhc2UmIF9feCwgY29uc3QgX0JpdF9pdGVyYXRvcl9iYXNlJiBfX3kpIHsKKyAgcmV0dXJuIF9feS5fTV9wID09IF9feC5fTV9wICYmIF9feS5fTV9vZmZzZXQgPT0gX194Ll9NX29mZnNldDsKK30KK2lubGluZSBib29sICBfU1RMUF9DQUxMIG9wZXJhdG9yIT0oY29uc3QgX0JpdF9pdGVyYXRvcl9iYXNlJiBfX3gsIGNvbnN0IF9CaXRfaXRlcmF0b3JfYmFzZSYgX195KSB7CisgIHJldHVybiBfX3kuX01fcCAhPSBfX3guX01fcCB8fCBfX3kuX01fb2Zmc2V0ICE9IF9feC5fTV9vZmZzZXQ7Cit9CisKK2lubGluZSBib29sIF9TVExQX0NBTEwgb3BlcmF0b3I8KGNvbnN0IF9CaXRfaXRlcmF0b3JfYmFzZSYgX194LCBjb25zdCBfQml0X2l0ZXJhdG9yX2Jhc2UmIF9feSkgeworICByZXR1cm4gX194Ll9NX3AgPCBfX3kuX01fcCB8fCAoX194Ll9NX3AgPT0gX195Ll9NX3AgJiYgX194Ll9NX29mZnNldCA8IF9feS5fTV9vZmZzZXQpOworfQorCitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yPihjb25zdCBfQml0X2l0ZXJhdG9yX2Jhc2UmIF9feCwgY29uc3QgX0JpdF9pdGVyYXRvcl9iYXNlJiBfX3kpICB7CisgIHJldHVybiBvcGVyYXRvciA8KF9feSAsIF9feCk7Cit9CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yPD0oY29uc3QgX0JpdF9pdGVyYXRvcl9iYXNlJiBfX3gsIGNvbnN0IF9CaXRfaXRlcmF0b3JfYmFzZSYgX195KSB7CisgIHJldHVybiAhKF9feSA8IF9feCk7Cit9CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yPj0oY29uc3QgX0JpdF9pdGVyYXRvcl9iYXNlJiBfX3gsIGNvbnN0IF9CaXRfaXRlcmF0b3JfYmFzZSYgX195KSB7CisgIHJldHVybiAhKF9feCA8IF9feSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfUmVmLCBjbGFzcyBfUHRyPgorc3RydWN0IF9CaXRfaXRlciA6IHB1YmxpYyBfQml0X2l0ZXJhdG9yX2Jhc2UgeworICB0eXBlZGVmIF9SZWYgIHJlZmVyZW5jZTsKKyAgdHlwZWRlZiBfUHRyICBwb2ludGVyOworICB0eXBlZGVmIF9CaXRfaXRlcjxfUmVmLCBfUHRyPiBfU2VsZjsKKyAgdHlwZWRlZiByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKKyAgdHlwZWRlZiBib29sIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKKyAgdHlwZWRlZiBzaXplX3Qgc2l6ZV90eXBlOworCisgIF9CaXRfaXRlcih1bnNpZ25lZCBpbnQqIF9feCwgdW5zaWduZWQgaW50IF9feSkgOiBfQml0X2l0ZXJhdG9yX2Jhc2UoX194LCBfX3kpIHt9CisgIF9CaXRfaXRlcigpIHt9CisKKyAgX0JpdF9pdGVyKGNvbnN0IF9CaXRfaXRlcjxfQml0X3JlZmVyZW5jZSwgX0JpdF9yZWZlcmVuY2UqPiYgX194KToKKyAgICBfQml0X2l0ZXJhdG9yX2Jhc2UoKGNvbnN0IF9CaXRfaXRlcmF0b3JfYmFzZSYpX194KSB7fQorCisgIC8vICBfU2VsZiYgb3BlcmF0b3IgPSAoY29uc3QgX0JpdF9pdGVyPF9CaXRfcmVmZXJlbmNlLCBfQml0X3JlZmVyZW5jZSo+JiBfX3gpCisgIC8vICAgeyAoX0JpdF9pdGVyYXRvcl9iYXNlJikqdGhpcyA9IChjb25zdCBfQml0X2l0ZXJhdG9yX2Jhc2UmKV9feDsgcmV0dXJuICp0aGlzOyB9CisKKyAgcmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICByZXR1cm4gX0JpdF9yZWZlcmVuY2UoX01fcCwgMVVMIDw8IF9NX29mZnNldCk7CisgIH0KKyAgX1NlbGYmIG9wZXJhdG9yKysoKSB7CisgICAgX01fYnVtcF91cCgpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBfU2VsZiBvcGVyYXRvcisrKGludCkgeworICAgIF9TZWxmIF9fdG1wID0gKnRoaXM7CisgICAgX01fYnVtcF91cCgpOworICAgIHJldHVybiBfX3RtcDsKKyAgfQorICBfU2VsZiYgb3BlcmF0b3ItLSgpIHsKKyAgICBfTV9idW1wX2Rvd24oKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgX1NlbGYgb3BlcmF0b3ItLShpbnQpIHsKKyAgICBfU2VsZiBfX3RtcCA9ICp0aGlzOworICAgIF9NX2J1bXBfZG93bigpOworICAgIHJldHVybiBfX3RtcDsKKyAgfQorICBfU2VsZiYgb3BlcmF0b3IrPShkaWZmZXJlbmNlX3R5cGUgX19pKSB7CisgICAgX01fYWR2YW5jZShfX2kpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBfU2VsZiYgb3BlcmF0b3ItPShkaWZmZXJlbmNlX3R5cGUgX19pKSB7CisgICAgKnRoaXMgKz0gLV9faTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgX1NlbGYgb3BlcmF0b3IrKGRpZmZlcmVuY2VfdHlwZSBfX2kpIGNvbnN0IHsKKyAgICBfU2VsZiBfX3RtcCA9ICp0aGlzOworICAgIHJldHVybiBfX3RtcCArPSBfX2k7CisgIH0KKyAgX1NlbGYgb3BlcmF0b3ItKGRpZmZlcmVuY2VfdHlwZSBfX2kpIGNvbnN0IHsKKyAgICBfU2VsZiBfX3RtcCA9ICp0aGlzOworICAgIHJldHVybiBfX3RtcCAtPSBfX2k7CisgIH0KKyAgZGlmZmVyZW5jZV90eXBlIG9wZXJhdG9yLShjb25zdCBfU2VsZiYgX194KSBjb25zdCB7CisgICAgcmV0dXJuIF9NX3N1YnRyYWN0KF9feCk7CisgIH0KKyAgcmVmZXJlbmNlIG9wZXJhdG9yW10oZGlmZmVyZW5jZV90eXBlIF9faSkgeyByZXR1cm4gKigqdGhpcyArIF9faSk7IH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfUmVmLCBjbGFzcyBfUHRyPgoraW5saW5lIF9CaXRfaXRlcjxfUmVmLF9QdHI+ICBfU1RMUF9DQUxMCitvcGVyYXRvcisocHRyZGlmZl90IF9fbiwgY29uc3QgX0JpdF9pdGVyPF9SZWYsIF9QdHI+JiBfX3gpIHsKKyAgIHJldHVybiBfX3ggKyBfX247Cit9CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCisjaWYgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikKK3RlbXBsYXRlIDxjbGFzcyBfUmVmLCBjbGFzcyBfUHRyPgorc3RydWN0IF9fdHlwZV90cmFpdHM8IF9TVExQX1BSSVYgX0JpdF9pdGVyPF9SZWYsIF9QdHI+ID4geworICB0eXBlZGVmIF9fZmFsc2VfdHlwZSAgIGhhc190cml2aWFsX2RlZmF1bHRfY29uc3RydWN0b3I7CisgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfY29weV9jb25zdHJ1Y3RvcjsKKyAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9hc3NpZ25tZW50X29wZXJhdG9yOworICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2Rlc3RydWN0b3I7CisgIHR5cGVkZWYgX19mYWxzZV90eXBlICAgaXNfUE9EX3R5cGU7Cit9OworI2VuZGlmIC8qIF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04gKi8KKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9PTERfSFBfSVRFUkFUT1JfUVVFUklFUykKK2lubGluZSByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeShjb25zdCBfU1RMUF9QUklWIF9CaXRfaXRlcmF0b3JfYmFzZSYpCit7IHJldHVybiByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZygpOyB9CitpbmxpbmUgcHRyZGlmZl90KiBkaXN0YW5jZV90eXBlKGNvbnN0IF9TVExQX1BSSVYgX0JpdF9pdGVyYXRvcl9iYXNlJikKK3sgcmV0dXJuIChwdHJkaWZmX3QqKTA7IH0KK2lubGluZSBib29sKiB2YWx1ZV90eXBlKGNvbnN0IF9TVExQX1BSSVYgX0JpdF9pdGVyPF9TVExQX1BSSVYgX0JpdF9yZWZlcmVuY2UsIF9TVExQX1BSSVYgX0JpdF9yZWZlcmVuY2UqPiYpCit7IHJldHVybiAoYm9vbCopMDsgfQoraW5saW5lIGJvb2wqIHZhbHVlX3R5cGUoY29uc3QgX1NUTFBfUFJJViBfQml0X2l0ZXI8Ym9vbCwgY29uc3QgYm9vbCo+JikKK3sgcmV0dXJuIChib29sKikwOyB9CisjZW5kaWYKKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCit0eXBlZGVmIF9CaXRfaXRlcjxib29sLCBjb25zdCBib29sKj4gX0JpdF9jb25zdF9pdGVyYXRvcjsKK3R5cGVkZWYgX0JpdF9pdGVyPF9CaXRfcmVmZXJlbmNlLCBfQml0X3JlZmVyZW5jZSo+IF9CaXRfaXRlcmF0b3I7CisKKy8vIEJpdC12ZWN0b3IgYmFzZSBjbGFzcywgd2hpY2ggZW5jYXBzdWxhdGVzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KKy8vICBvbGQgU0dJLXN0eWxlIGFsbG9jYXRvcnMgYW5kIHN0YW5kYXJkLWNvbmZvcm1pbmcgYWxsb2NhdG9ycy4KK3RlbXBsYXRlIDxjbGFzcyBfQWxsb2M+CitjbGFzcyBfQnZlY3Rvcl9iYXNlIHsKKyAgdHlwZWRlZiBfQnZlY3Rvcl9iYXNlPF9BbGxvYz4gX1NlbGY7CitwdWJsaWM6CisgIF9TVExQX0ZPUkNFX0FMTE9DQVRPUlMoYm9vbCwgX0FsbG9jKQorICB0eXBlZGVmIF9BbGxvYyBhbGxvY2F0b3JfdHlwZTsKKyAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgX19jaHVua190eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY190cmFpdHM8X19jaHVua190eXBlLCBfQWxsb2M+OjphbGxvY2F0b3JfdHlwZSBfX2NodW5rX2FsbG9jYXRvcl90eXBlOworICBhbGxvY2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9yKCkgY29uc3QKKyAgeyByZXR1cm4gX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoX19TVEFUSUNfQ0FTVChjb25zdCBfX2NodW5rX2FsbG9jYXRvcl90eXBlJiwgX01fZW5kX29mX3N0b3JhZ2UpLCBib29sKTsgfQorCisgIF9CdmVjdG9yX2Jhc2UoY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICA6IF9NX3N0YXJ0KCksIF9NX2ZpbmlzaCgpLCBfTV9lbmRfb2Zfc3RvcmFnZShfU1RMUF9DT05WRVJUX0FMTE9DQVRPUihfX2EsIF9fY2h1bmtfdHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fY2h1bmtfdHlwZSopMCkKKyAge30KKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKKyAgX0J2ZWN0b3JfYmFzZShfX21vdmVfc291cmNlPF9TZWxmPiBzcmMpCisgICAgOiBfTV9zdGFydChzcmMuZ2V0KCkuX01fc3RhcnQpLCBfTV9maW5pc2goc3JjLmdldCgpLl9NX2ZpbmlzaCksCisgICAgICBfTV9lbmRfb2Zfc3RvcmFnZShzcmMuZ2V0KCkuX01fZW5kX29mX3N0b3JhZ2UpIHsKKyAgICAvL01ha2UgdGhlIHNvdXJjZSBkZXN0cm95YWJsZQorICAgIHNyYy5nZXQoKS5fTV9zdGFydC5fTV9wID0gMDsKKyAgfQorI2VuZGlmCisKKyAgfl9CdmVjdG9yX2Jhc2UoKSB7CisgICAgX01fZGVhbGxvY2F0ZSgpOworICB9CisKK3Byb3RlY3RlZDoKKworICBzdGF0aWMgc2l6ZV90IF9NX2JpdHNfdG9fY2h1bmtzKHNpemVfdCBfX25fYml0cykKKyAgeyByZXR1cm4gKF9fbl9iaXRzICsgX1NUTFBfV09SRF9CSVQgLSAxKSAvIF9TVExQX1dPUkRfQklUOyB9CisKKyAgX19jaHVua190eXBlKiBfTV9iaXRfYWxsb2Moc2l6ZV90IF9fbikKKyAgeyByZXR1cm4gX01fZW5kX29mX3N0b3JhZ2UuYWxsb2NhdGUoX01fYml0c190b19jaHVua3MoX19uKSk7IH0KKworICB2b2lkIF9NX2RlYWxsb2NhdGUoKSB7CisgICAgaWYgKF9NX3N0YXJ0Ll9NX3ApCisgICAgICBfTV9lbmRfb2Zfc3RvcmFnZS5kZWFsbG9jYXRlKF9NX3N0YXJ0Ll9NX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NX2VuZF9vZl9zdG9yYWdlLl9NX2RhdGEgLSBfTV9zdGFydC5fTV9wKTsKKyAgfQorCisgIF9CaXRfaXRlcmF0b3IgX01fc3RhcnQ7CisgIF9CaXRfaXRlcmF0b3IgX01fZmluaXNoOworICBfU1RMUF9hbGxvY19wcm94eTxfX2NodW5rX3R5cGUqLCBfX2NodW5rX3R5cGUsIF9fY2h1bmtfYWxsb2NhdG9yX3R5cGU+IF9NX2VuZF9vZl9zdG9yYWdlOworfTsKKworCisvLyBUaGUgbmV4dCBmZXcgbGluZXMgYXJlIGNvbmZ1c2luZy4gIFdoYXQgd2UncmUgZG9pbmcgaXMgZGVjbGFyaW5nIGEKKy8vICBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIG9mIHZlY3RvcjxULCBBbGxvYz4gaWYgd2UgaGF2ZSB0aGUgbmVjZXNzYXJ5CisvLyAgY29tcGlsZXIgc3VwcG9ydC4gIE90aGVyd2lzZSwgd2UgZGVmaW5lIGEgY2xhc3MgYml0X3ZlY3RvciB3aGljaCB1c2VzCisvLyAgdGhlIGRlZmF1bHQgYWxsb2NhdG9yLgorCisjaWYgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikgJiYgIWRlZmluZWQgKF9TVExQX05PX0JPT0wpICYmICFkZWZpbmVkIChfX1NVTlBST19DQykKKyMgIGRlZmluZSBfU1RMUF9WRUNCT09MX1RFTVBMQVRFCisjICBkZWZpbmUgX19CVkVDX1RNUExfSEVBREVSIHRlbXBsYXRlIDxjbGFzcyBfQWxsb2M+CisjZWxzZQorIyAgdW5kZWYgX1NUTFBfVkVDQk9PTF9URU1QTEFURQorIyAgaWZkZWYgX1NUTFBfTk9fQk9PTAorIyAgICBkZWZpbmUgX19CVkVDX1RNUExfSEVBREVSCisjICBlbHNlCisjICAgIGRlZmluZSBfX0JWRUNfVE1QTF9IRUFERVIgX1NUTFBfVEVNUExBVEVfTlVMTAorIyAgZW5kaWYKKyMgIGRlZmluZSBfQWxsb2MgYWxsb2NhdG9yPGJvb2w+CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHKQorIyAgZGVmaW5lIHZlY3RvciBfU1RMUF9OT05fREJHX05BTUUodmVjdG9yKQorI2VuZGlmCisKKyNpZmRlZiBfU1RMUF9OT19CT09MCisjICBkZWZpbmUgX19CVkVDVE9SX1FVQUxJRklFRCBiaXRfdmVjdG9yCisjICBkZWZpbmUgX19CVkVDVE9SICAgICAgICAgICBiaXRfdmVjdG9yCisjZWxzZQorIyAgaWZkZWYgX1NUTFBfVkVDQk9PTF9URU1QTEFURQorIyAgICBkZWZpbmUgX19CVkVDVE9SX1FVQUxJRklFRCB2ZWN0b3I8Ym9vbCwgX0FsbG9jPgorIyAgZWxzZQorIyAgICBkZWZpbmUgX19CVkVDVE9SX1FVQUxJRklFRCB2ZWN0b3I8Ym9vbCwgYWxsb2NhdG9yPGJvb2w+ID4KKyMgIGVuZGlmCisjICBpZiBkZWZpbmVkIChfU1RMUF9QQVJUSUFMX1NQRUNfTkVFRFNfVEVNUExBVEVfQVJHUykKKyMgICAgZGVmaW5lIF9fQlZFQ1RPUiBfX0JWRUNUT1JfUVVBTElGSUVECisjICBlbHNlCisjICAgIGRlZmluZSBfX0JWRUNUT1IgdmVjdG9yCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfREVCVUcpIHx8IGRlZmluZWQgKF9TVExQX05PX0JPT0wpCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKyNlbmRpZgorCitfX0JWRUNfVE1QTF9IRUFERVIKK2NsYXNzIF9fQlZFQ1RPUl9RVUFMSUZJRUQgOiBwdWJsaWMgX1NUTFBfUFJJViBfQnZlY3Rvcl9iYXNlPF9BbGxvYyA+CisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKSAmJiAhZGVmaW5lZCAoX1NUTFBfREVCVUcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICwgcHVibGljIF9fc3RscG9ydF9jbGFzczwgX19CVkVDVE9SX1FVQUxJRklFRCA+CisjZW5kaWYKK3sKKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9CdmVjdG9yX2Jhc2U8X0FsbG9jID4gX0Jhc2U7CisgIHR5cGVkZWYgX19CVkVDVE9SX1FVQUxJRklFRCBfU2VsZjsKK3B1YmxpYzoKKyAgdHlwZWRlZiBib29sIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgc2l6ZV90IHNpemVfdHlwZTsKKyAgdHlwZWRlZiBwdHJkaWZmX3QgZGlmZmVyZW5jZV90eXBlOworICB0eXBlZGVmIF9TVExQX1BSSVYgX0JpdF9yZWZlcmVuY2UgcmVmZXJlbmNlOworICB0eXBlZGVmIGJvb2wgY29uc3RfcmVmZXJlbmNlOworICB0eXBlZGVmIF9TVExQX1BSSVYgX0JpdF9yZWZlcmVuY2UqIHBvaW50ZXI7CisgIHR5cGVkZWYgY29uc3QgYm9vbCogY29uc3RfcG9pbnRlcjsKKyAgdHlwZWRlZiByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyBfSXRlcmF0b3JfY2F0ZWdvcnk7CisKKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9CaXRfaXRlcmF0b3IgICAgICAgICAgaXRlcmF0b3I7CisgIHR5cGVkZWYgX1NUTFBfUFJJViBfQml0X2NvbnN0X2l0ZXJhdG9yICAgIGNvbnN0X2l0ZXJhdG9yOworCisgIF9TVExQX0RFQ0xBUkVfUkFORE9NX0FDQ0VTU19SRVZFUlNFX0lURVJBVE9SUzsKKworI2lmZGVmIF9TVExQX1ZFQ0JPT0xfVEVNUExBVEUKKyAgdHlwZWRlZiBfU1RMUF9UWVBFTkFNRSBfU1RMUF9QUklWIF9CdmVjdG9yX2Jhc2U8X0FsbG9jID46OmFsbG9jYXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOworICB0eXBlZGVmIF9TVExQX1RZUEVOQU1FIF9TVExQX1BSSVYgX0J2ZWN0b3JfYmFzZTxfQWxsb2MgPjo6X19jaHVua190eXBlIF9fY2h1bmtfdHlwZTsKKyNlbHNlCisgIHR5cGVkZWYgX1NUTFBfUFJJViBfQnZlY3Rvcl9iYXNlPF9BbGxvYyA+OjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9CdmVjdG9yX2Jhc2U8X0FsbG9jID46Ol9fY2h1bmtfdHlwZSBfX2NodW5rX3R5cGU7CisjZW5kaWYKKworcHJvdGVjdGVkOgorCisgIHZvaWQgX01faW5pdGlhbGl6ZShzaXplX3R5cGUgX19uKSB7CisgICAgX19jaHVua190eXBlKiBfX3EgPSB0aGlzLT5fTV9iaXRfYWxsb2MoX19uKTsKKyAgICB0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5fTV9kYXRhID0gX19xICsgX0Jhc2U6Ol9NX2JpdHNfdG9fY2h1bmtzKF9fbik7CisgICAgdGhpcy0+X01fc3RhcnQgPSBpdGVyYXRvcihfX3EsIDApOworICAgIHRoaXMtPl9NX2ZpbmlzaCA9IHRoaXMtPl9NX3N0YXJ0ICsgZGlmZmVyZW5jZV90eXBlKF9fbik7CisgIH0KKyAgdm9pZCBfTV9pbnNlcnRfYXV4KGl0ZXJhdG9yIF9fcG9zaXRpb24sIGJvb2wgX194KSB7CisgICAgaWYgKHRoaXMtPl9NX2ZpbmlzaC5fTV9wICE9IHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLl9NX2RhdGEpIHsKKyAgICAgIF9TVExQX1BSSVYgX19jb3B5X2JhY2t3YXJkKF9fcG9zaXRpb24sIHRoaXMtPl9NX2ZpbmlzaCwgdGhpcy0+X01fZmluaXNoICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKCksIChkaWZmZXJlbmNlX3R5cGUqKTAgKTsKKyAgICAgICpfX3Bvc2l0aW9uID0gX194OworICAgICAgKyt0aGlzLT5fTV9maW5pc2g7CisgICAgfQorICAgIGVsc2UgeworICAgICAgc2l6ZV90eXBlIF9fbGVuID0gc2l6ZSgpID8gMiAqIHNpemUoKSA6IF9TVExQX1dPUkRfQklUOworICAgICAgX19jaHVua190eXBlKiBfX3EgPSB0aGlzLT5fTV9iaXRfYWxsb2MoX19sZW4pOworICAgICAgaXRlcmF0b3IgX19pID0gX1NUTFBfU1REOjpjb3B5KGJlZ2luKCksIF9fcG9zaXRpb24sIGl0ZXJhdG9yKF9fcSwgMCkpOworICAgICAgKl9faSsrID0gX194OworICAgICAgdGhpcy0+X01fZmluaXNoID0gX1NUTFBfU1REOjpjb3B5KF9fcG9zaXRpb24sIGVuZCgpLCBfX2kpOworICAgICAgdGhpcy0+X01fZGVhbGxvY2F0ZSgpOworICAgICAgdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuX01fZGF0YSA9IF9fcSArIF9CYXNlOjpfTV9iaXRzX3RvX2NodW5rcyhfX2xlbik7CisgICAgICB0aGlzLT5fTV9zdGFydCA9IGl0ZXJhdG9yKF9fcSwgMCk7CisgICAgfQorICB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZvaWQgX01faW5pdGlhbGl6ZV9yYW5nZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnB1dF9pdGVyYXRvcl90YWcgJikgeworICAgIHRoaXMtPl9NX3N0YXJ0ID0gaXRlcmF0b3IoKTsKKyAgICB0aGlzLT5fTV9maW5pc2ggPSBpdGVyYXRvcigpOworICAgIHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLl9NX2RhdGEgPSAwOworICAgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKyAgICAgIHB1c2hfYmFjaygqX19maXJzdCk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KKyAgdm9pZCBfTV9pbml0aWFsaXplX3JhbmdlKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3J3YXJkX2l0ZXJhdG9yX3RhZyAmKSB7CisgICAgc2l6ZV90eXBlIF9fbiA9IF9TVExQX1NURDo6ZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KTsKKyAgICBfTV9pbml0aWFsaXplKF9fbik7CisgICAgX1NUTFBfU1REOjpjb3B5KF9fZmlyc3QsIF9fbGFzdCwgdGhpcy0+X01fc3RhcnQpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICB2b2lkIF9NX2luc2VydF9yYW5nZShpdGVyYXRvciBfX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnB1dF9pdGVyYXRvcl90YWcgJikgeworICAgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkgeworICAgICAgX19wb3MgPSBpbnNlcnQoX19wb3MsICpfX2ZpcnN0KTsKKyAgICAgICsrX19wb3M7CisgICAgfQorICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CisgIHZvaWQgX01faW5zZXJ0X3JhbmdlKGl0ZXJhdG9yIF9fcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcndhcmRfaXRlcmF0b3JfdGFnICYpIHsKKyAgICBpZiAoX19maXJzdCAhPSBfX2xhc3QpIHsKKyAgICAgIHNpemVfdHlwZSBfX24gPSBfU1RMUF9TVEQ6OmRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICBpZiAoY2FwYWNpdHkoKSAtIHNpemUoKSA+PSBfX24pIHsKKyAgICAgICAgX1NUTFBfUFJJViBfX2NvcHlfYmFja3dhcmQoX19wb3NpdGlvbiwgZW5kKCksIHRoaXMtPl9NX2ZpbmlzaCArIGRpZmZlcmVuY2VfdHlwZShfX24pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZygpLCAoZGlmZmVyZW5jZV90eXBlKikwICk7CisgICAgICAgIF9TVExQX1NURDo6Y29weShfX2ZpcnN0LCBfX2xhc3QsIF9fcG9zaXRpb24pOworICAgICAgICB0aGlzLT5fTV9maW5pc2ggKz0gZGlmZmVyZW5jZV90eXBlKF9fbik7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgc2l6ZV90eXBlIF9fbGVuID0gc2l6ZSgpICsgKG1heCkoc2l6ZSgpLCBfX24pOworICAgICAgICBfX2NodW5rX3R5cGUqIF9fcSA9IHRoaXMtPl9NX2JpdF9hbGxvYyhfX2xlbik7CisgICAgICAgIGl0ZXJhdG9yIF9faSA9IF9TVExQX1NURDo6Y29weShiZWdpbigpLCBfX3Bvc2l0aW9uLCBpdGVyYXRvcihfX3EsIDApKTsKKyAgICAgICAgX19pID0gX1NUTFBfU1REOjpjb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19pKTsKKyAgICAgICAgdGhpcy0+X01fZmluaXNoID0gX1NUTFBfU1REOjpjb3B5KF9fcG9zaXRpb24sIGVuZCgpLCBfX2kpOworICAgICAgICB0aGlzLT5fTV9kZWFsbG9jYXRlKCk7CisgICAgICAgIHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLl9NX2RhdGEgPSBfX3EgKyBfQmFzZTo6X01fYml0c190b19jaHVua3MoX19sZW4pOworICAgICAgICB0aGlzLT5fTV9zdGFydCA9IGl0ZXJhdG9yKF9fcSwgMCk7CisgICAgICB9CisgICAgfQorICB9CisKKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisKK3B1YmxpYzoKKyAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiB0aGlzLT5fTV9zdGFydDsgfQorICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIHRoaXMtPl9NX3N0YXJ0OyB9CisgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIHRoaXMtPl9NX2ZpbmlzaDsgfQorICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiB0aGlzLT5fTV9maW5pc2g7IH0KKworICByZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsKKyAgfQorICByZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsKKyAgfQorCisgIHNpemVfdHlwZSBzaXplKCkgY29uc3QgeyByZXR1cm4gc2l6ZV90eXBlKGVuZCgpIC0gYmVnaW4oKSk7IH0KKyAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgeyByZXR1cm4gc2l6ZV90eXBlKC0xKTsgfQorICBzaXplX3R5cGUgY2FwYWNpdHkoKSBjb25zdCB7CisgICAgcmV0dXJuIHNpemVfdHlwZShjb25zdF9pdGVyYXRvcih0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5fTV9kYXRhLCAwKSAtIGJlZ2luKCkpOworICB9CisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBiZWdpbigpID09IGVuZCgpOyB9CisgIHJlZmVyZW5jZSBvcGVyYXRvcltdKHNpemVfdHlwZSBfX24pCisgIHsgcmV0dXJuICooYmVnaW4oKSArIGRpZmZlcmVuY2VfdHlwZShfX24pKTsgfQorICBjb25zdF9yZWZlcmVuY2Ugb3BlcmF0b3JbXShzaXplX3R5cGUgX19uKSBjb25zdAorICB7IHJldHVybiAqKGJlZ2luKCkgKyBkaWZmZXJlbmNlX3R5cGUoX19uKSk7IH0KKworICB2b2lkIF9NX3JhbmdlX2NoZWNrKHNpemVfdHlwZSBfX24pIGNvbnN0IHsKKyAgICBpZiAoX19uID49IHRoaXMtPnNpemUoKSkKKyAgICAgIF9fc3RsX3Rocm93X3JhbmdlX2Vycm9yKCJ2ZWN0b3I8Ym9vbD4iKTsKKyAgfQorCisgIHJlZmVyZW5jZSBhdChzaXplX3R5cGUgX19uKQorICAgIHsgX01fcmFuZ2VfY2hlY2soX19uKTsgcmV0dXJuICgqdGhpcylbX19uXTsgfQorICBjb25zdF9yZWZlcmVuY2UgYXQoc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICB7IF9NX3JhbmdlX2NoZWNrKF9fbik7IHJldHVybiAoKnRoaXMpW19fbl07IH0KKworICBleHBsaWNpdCBfX0JWRUNUT1IoY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfU1RMUF9QUklWIF9CdmVjdG9yX2Jhc2U8X0FsbG9jID4oX19hKSB7fQorCisgIF9fQlZFQ1RPUihzaXplX3R5cGUgX19uLCBib29sIF9fdmFsLAorICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfU1RMUF9QUklWIF9CdmVjdG9yX2Jhc2U8X0FsbG9jID4oX19hKSB7CisgICAgX01faW5pdGlhbGl6ZShfX24pOworICAgIGZpbGwodGhpcy0+X01fc3RhcnQuX01fcCwgKF9fY2h1bmtfdHlwZSopKHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLl9NX2RhdGEpLCBfX3ZhbCA/IH4wIDogMCk7CisgIH0KKworICBleHBsaWNpdCBfX0JWRUNUT1Ioc2l6ZV90eXBlIF9fbikKKyAgICA6IF9TVExQX1BSSVYgX0J2ZWN0b3JfYmFzZTxfQWxsb2MgPihhbGxvY2F0b3JfdHlwZSgpKSB7CisgICAgX01faW5pdGlhbGl6ZShfX24pOworICAgIGZpbGwodGhpcy0+X01fc3RhcnQuX01fcCwgKF9fY2h1bmtfdHlwZSopKHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLl9NX2RhdGEpLCAwKTsKKyAgfQorCisgIF9fQlZFQ1RPUihjb25zdCBfU2VsZiYgX194KQorICAgIDogX1NUTFBfUFJJViBfQnZlY3Rvcl9iYXNlPF9BbGxvYyA+KF9feC5nZXRfYWxsb2NhdG9yKCkpIHsKKyAgICBfTV9pbml0aWFsaXplKF9feC5zaXplKCkpOworICAgIF9TVExQX1NURDo6Y29weShfX3guYmVnaW4oKSwgX194LmVuZCgpLCB0aGlzLT5fTV9zdGFydCk7CisgIH0KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIHRlbXBsYXRlIDxjbGFzcyBfSW50ZWdlcj4KKyAgdm9pZCBfTV9pbml0aWFsaXplX2Rpc3BhdGNoKF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX194LCBjb25zdCBfX3RydWVfdHlwZSYpIHsKKyAgICBfTV9pbml0aWFsaXplKF9fbik7CisgICAgZmlsbCh0aGlzLT5fTV9zdGFydC5fTV9wLCB0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5fTV9kYXRhLCBfX3ggPyB+MCA6IDApOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICB2b2lkIF9NX2luaXRpYWxpemVfZGlzcGF0Y2goX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19mYWxzZV90eXBlJikgeworICAgIF9NX2luaXRpYWxpemVfcmFuZ2UoX19maXJzdCwgX19sYXN0LCBfU1RMUF9JVEVSQVRPUl9DQVRFR09SWShfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvcikpOworICB9CisjICBpZiBkZWZpbmVkIChfU1RMUF9ORUVEU19FWFRSQV9URU1QTEFURV9DT05TVFJVQ1RPUlMpCisgIC8vIENoZWNrIHdoZXRoZXIgaXQncyBhbiBpbnRlZ3JhbCB0eXBlLiAgSWYgc28sIGl0J3Mgbm90IGFuIGl0ZXJhdG9yLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIF9fQlZFQ1RPUihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgOiBfU1RMUF9QUklWIF9CdmVjdG9yX2Jhc2U8X0FsbG9jID4oYWxsb2NhdG9yX3R5cGUoKSkgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lzSW50ZWdyYWw8X0lucHV0SXRlcmF0b3I+OjpfUmV0IF9JbnRlZ3JhbDsKKyAgICBfTV9pbml0aWFsaXplX2Rpc3BhdGNoKF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOworICB9CisjICBlbmRpZgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIF9fQlZFQ1RPUihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hIF9TVExQX0FMTE9DQVRPUl9UWVBFX0RGTCkKKyAgICA6IF9TVExQX1BSSVYgX0J2ZWN0b3JfYmFzZTxfQWxsb2MgPihfX2EpIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0ludGVncmFsPF9JbnB1dEl0ZXJhdG9yPjo6X1JldCBfSW50ZWdyYWw7CisgICAgX01faW5pdGlhbGl6ZV9kaXNwYXRjaChfX2ZpcnN0LCBfX2xhc3QsIF9JbnRlZ3JhbCgpKTsKKyAgfQorI2Vsc2UgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworICBfX0JWRUNUT1IoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfU1RMUF9QUklWIF9CdmVjdG9yX2Jhc2U8X0FsbG9jID4oX19hKSB7CisgICAgc2l6ZV90eXBlIF9fbiA9IF9TVExQX1NURDo6ZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KTsKKyAgICBfTV9pbml0aWFsaXplKF9fbik7CisgICAgX1NUTFBfU1REOjpjb3B5KF9fZmlyc3QsIF9fbGFzdCwgdGhpcy0+X01fc3RhcnQpOworICB9CisgIF9fQlZFQ1RPUihjb25zdCBib29sKiBfX2ZpcnN0LCBjb25zdCBib29sKiBfX2xhc3QsCisgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9TVExQX1BSSVYgX0J2ZWN0b3JfYmFzZTxfQWxsb2MgPihfX2EpIHsKKyAgICBzaXplX3R5cGUgX19uID0gX1NUTFBfU1REOjpkaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QpOworICAgIF9NX2luaXRpYWxpemUoX19uKTsKKyAgICBfU1RMUF9TVEQ6OmNvcHkoX19maXJzdCwgX19sYXN0LCB0aGlzLT5fTV9zdGFydCk7CisgIH0KKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKKyAgX19CVkVDVE9SKF9fbW92ZV9zb3VyY2U8X1NlbGY+IHNyYykKKyAgICA6IF9TVExQX1BSSVYgX0J2ZWN0b3JfYmFzZTxfQWxsb2MgPihfX21vdmVfc291cmNlPF9CYXNlPihzcmMuZ2V0KCkpKSB7fQorI2VuZGlmCisKKyAgfl9fQlZFQ1RPUigpIHt9CisKKyAgX19CVkVDVE9SX1FVQUxJRklFRCYgb3BlcmF0b3I9KGNvbnN0IF9fQlZFQ1RPUl9RVUFMSUZJRUQmIF9feCkgeworICAgIGlmICgmX194ID09IHRoaXMpIHJldHVybiAqdGhpczsKKyAgICBpZiAoX194LnNpemUoKSA+IGNhcGFjaXR5KCkpIHsKKyAgICAgIHRoaXMtPl9NX2RlYWxsb2NhdGUoKTsKKyAgICAgIF9NX2luaXRpYWxpemUoX194LnNpemUoKSk7CisgICAgfQorICAgIF9TVExQX1NURDo6Y29weShfX3guYmVnaW4oKSwgX194LmVuZCgpLCBiZWdpbigpKTsKKyAgICB0aGlzLT5fTV9maW5pc2ggPSBiZWdpbigpICsgZGlmZmVyZW5jZV90eXBlKF9feC5zaXplKCkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vIGFzc2lnbigpLCBhIGdlbmVyYWxpemVkIGFzc2lnbm1lbnQgbWVtYmVyIGZ1bmN0aW9uLiAgVHdvCisgIC8vIHZlcnNpb25zOiBvbmUgdGhhdCB0YWtlcyBhIGNvdW50LCBhbmQgb25lIHRoYXQgdGFrZXMgYSByYW5nZS4KKyAgLy8gVGhlIHJhbmdlIHZlcnNpb24gaXMgYSBtZW1iZXIgdGVtcGxhdGUsIHNvIHdlIGRpc3BhdGNoIG9uIHdoZXRoZXIKKyAgLy8gb3Igbm90IHRoZSB0eXBlIGlzIGFuIGludGVnZXIuCisKKyAgdm9pZCBfTV9maWxsX2Fzc2lnbihzaXplX3QgX19uLCBib29sIF9feCkgeworICAgIGlmIChfX24gPiBzaXplKCkpIHsKKyAgICAgIGZpbGwodGhpcy0+X01fc3RhcnQuX01fcCwgKF9fY2h1bmtfdHlwZSopKHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLl9NX2RhdGEpLCBfX3ggPyB+MCA6IDApOworICAgICAgaW5zZXJ0KGVuZCgpLCBfX24gLSBzaXplKCksIF9feCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgZXJhc2UoYmVnaW4oKSArIF9fbiwgZW5kKCkpOworICAgICAgZmlsbCh0aGlzLT5fTV9zdGFydC5fTV9wLCAoX19jaHVua190eXBlKikodGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuX01fZGF0YSksIF9feCA/IH4wIDogMCk7CisgICAgfQorICB9CisgIHZvaWQgYXNzaWduKHNpemVfdCBfX24sIGJvb2wgX194KSB7IF9NX2ZpbGxfYXNzaWduKF9fbiwgX194KTsgfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICB2b2lkIGFzc2lnbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0ludGVncmFsPF9JbnB1dEl0ZXJhdG9yPjo6X1JldCBfSW50ZWdyYWw7CisgICAgX01fYXNzaWduX2Rpc3BhdGNoKF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2VyPgorICB2b2lkIF9NX2Fzc2lnbl9kaXNwYXRjaChfSW50ZWdlciBfX24sIF9JbnRlZ2VyIF9fdmFsLCBjb25zdCBfX3RydWVfdHlwZSYpCisgICAgeyBfTV9maWxsX2Fzc2lnbigoc2l6ZV90KSBfX24sIChib29sKSBfX3ZhbCk7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcj4KKyAgdm9pZCBfTV9hc3NpZ25fZGlzcGF0Y2goX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwgY29uc3QgX19mYWxzZV90eXBlJikKKyAgICB7IF9NX2Fzc2lnbl9hdXgoX19maXJzdCwgX19sYXN0LCBfU1RMUF9JVEVSQVRPUl9DQVRFR09SWShfX2ZpcnN0LCBfSW5wdXRJdGVyKSk7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZvaWQgX01fYXNzaWduX2F1eChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnB1dF9pdGVyYXRvcl90YWcgJikgeworICAgIGl0ZXJhdG9yIF9fY3VyID0gYmVnaW4oKTsKKyAgICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0ICYmIF9fY3VyICE9IGVuZCgpOyArK19fY3VyLCArK19fZmlyc3QpCisgICAgICAqX19jdXIgPSAqX19maXJzdDsKKyAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCisgICAgICBlcmFzZShfX2N1ciwgZW5kKCkpOworICAgIGVsc2UKKyAgICAgIGluc2VydChlbmQoKSwgX19maXJzdCwgX19sYXN0KTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorICB2b2lkIF9NX2Fzc2lnbl9hdXgoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcndhcmRfaXRlcmF0b3JfdGFnICYpIHsKKyAgICBzaXplX3R5cGUgX19sZW4gPSBfU1RMUF9TVEQ6OmRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgaWYgKF9fbGVuIDwgc2l6ZSgpKQorICAgICAgZXJhc2UoX1NUTFBfU1REOjpjb3B5KF9fZmlyc3QsIF9fbGFzdCwgYmVnaW4oKSksIGVuZCgpKTsKKyAgICBlbHNlIHsKKyAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19taWQgPSBfX2ZpcnN0OworICAgICAgX1NUTFBfU1REOjphZHZhbmNlKF9fbWlkLCBzaXplKCkpOworICAgICAgX1NUTFBfU1REOjpjb3B5KF9fZmlyc3QsIF9fbWlkLCBiZWdpbigpKTsKKyAgICAgIGluc2VydChlbmQoKSwgX19taWQsIF9fbGFzdCk7CisgICAgfQorICB9CisjZW5kaWYgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworCisgIHZvaWQgcmVzZXJ2ZShzaXplX3R5cGUgX19uKSB7CisgICAgaWYgKGNhcGFjaXR5KCkgPCBfX24pIHsKKyAgICAgIGlmIChtYXhfc2l6ZSgpIDwgX19uKQorICAgICAgICBfX3N0bF90aHJvd19sZW5ndGhfZXJyb3IoInZlY3Rvcjxib29sPiIpOworICAgICAgX19jaHVua190eXBlKiBfX3EgPSB0aGlzLT5fTV9iaXRfYWxsb2MoX19uKTsKKyAgICAgIF9TVExQX1BSSVYgX0JpdF9pdGVyYXRvciBfX3ooX19xLCAwKTsKKyAgICAgIHRoaXMtPl9NX2ZpbmlzaCA9IF9TVExQX1NURDo6Y29weShiZWdpbigpLCBlbmQoKSwgX196KTsKKyAgICAgIHRoaXMtPl9NX2RlYWxsb2NhdGUoKTsKKyAgICAgIHRoaXMtPl9NX3N0YXJ0ID0gaXRlcmF0b3IoX19xLCAwKTsKKyAgICAgIHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLl9NX2RhdGEgPSBfX3EgKyBfQmFzZTo6X01fYml0c190b19jaHVua3MoX19uKTsKKyAgICB9CisgIH0KKworICByZWZlcmVuY2UgZnJvbnQoKSB7IHJldHVybiAqYmVnaW4oKTsgfQorICBjb25zdF9yZWZlcmVuY2UgZnJvbnQoKSBjb25zdCB7IHJldHVybiAqYmVnaW4oKTsgfQorICByZWZlcmVuY2UgYmFjaygpIHsgcmV0dXJuICooZW5kKCkgLSAxKTsgfQorICBjb25zdF9yZWZlcmVuY2UgYmFjaygpIGNvbnN0IHsgcmV0dXJuICooZW5kKCkgLSAxKTsgfQorICB2b2lkIHB1c2hfYmFjayhib29sIF9feCkgeworICAgIGlmICh0aGlzLT5fTV9maW5pc2guX01fcCAhPSB0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5fTV9kYXRhKSB7CisgICAgICAqKHRoaXMtPl9NX2ZpbmlzaCkgPSBfX3g7CisgICAgICArK3RoaXMtPl9NX2ZpbmlzaDsKKyAgICB9CisgICAgZWxzZQorICAgICAgX01faW5zZXJ0X2F1eChlbmQoKSwgX194KTsKKyAgfQorICB2b2lkIHN3YXAoX19CVkVDVE9SX1FVQUxJRklFRCYgX194KSB7CisgICAgX1NUTFBfU1REOjpzd2FwKHRoaXMtPl9NX3N0YXJ0LCBfX3guX01fc3RhcnQpOworICAgIF9TVExQX1NURDo6c3dhcCh0aGlzLT5fTV9maW5pc2gsIF9feC5fTV9maW5pc2gpOworICAgIHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLnN3YXAoX194Ll9NX2VuZF9vZl9zdG9yYWdlKTsKKyAgfQorI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QQVJUSUFMX1NQRUNfV09SS0FST1VORCkgJiYgIWRlZmluZWQgKF9TVExQX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUikKKyAgdm9pZCBfTV9zd2FwX3dvcmthcm91bmQoX19CVkVDVE9SX1FVQUxJRklFRCYgX194KSB7IHN3YXAoX194KTsgfQorI2VuZGlmCisKKyAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIGJvb2wgX194ID0gYm9vbCgpKSB7CisgICAgZGlmZmVyZW5jZV90eXBlIF9fbiA9IF9fcG9zaXRpb24gLSBiZWdpbigpOworICAgIGlmICh0aGlzLT5fTV9maW5pc2guX01fcCAhPSB0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5fTV9kYXRhICYmIF9fcG9zaXRpb24gPT0gZW5kKCkpIHsKKyAgICAgICoodGhpcy0+X01fZmluaXNoKSA9IF9feDsKKyAgICAgICsrdGhpcy0+X01fZmluaXNoOworICAgIH0KKyAgICBlbHNlCisgICAgICBfTV9pbnNlcnRfYXV4KF9fcG9zaXRpb24sIF9feCk7CisgICAgcmV0dXJuIGJlZ2luKCkgKyBfX247CisgIH0KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2VyPgorICB2b2lkIF9NX2luc2VydF9kaXNwYXRjaChpdGVyYXRvciBfX3BvcywgX0ludGVnZXIgX19uLCBfSW50ZWdlciBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fdHJ1ZV90eXBlJikgeworICAgIF9NX2ZpbGxfaW5zZXJ0KF9fcG9zLCAoc2l6ZV90eXBlKSBfX24sIChib29sKSBfX3gpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICB2b2lkIF9NX2luc2VydF9kaXNwYXRjaChpdGVyYXRvciBfX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2ZhbHNlX3R5cGUmKSB7CisgICAgX01faW5zZXJ0X3JhbmdlKF9fcG9zLCBfX2ZpcnN0LCBfX2xhc3QsIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yKSk7CisgIH0KKworICAvLyBDaGVjayB3aGV0aGVyIGl0J3MgYW4gaW50ZWdyYWwgdHlwZS4gIElmIHNvLCBpdCdzIG5vdCBhbiBpdGVyYXRvci4KKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICB2b2lkIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLAorICAgICAgICAgICAgICBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0ludGVncmFsPF9JbnB1dEl0ZXJhdG9yPjo6X1JldCBfSW50ZWdyYWw7CisgICAgX01faW5zZXJ0X2Rpc3BhdGNoKF9fcG9zaXRpb24sIF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOworICB9CisjZWxzZSAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisgIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sCisgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkgeworICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkgcmV0dXJuOworICAgIHNpemVfdHlwZSBfX24gPSBfU1RMUF9TVEQ6OmRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgaWYgKGNhcGFjaXR5KCkgLSBzaXplKCkgPj0gX19uKSB7CisgICAgICBfU1RMUF9QUklWIF9fY29weV9iYWNrd2FyZChfX3Bvc2l0aW9uLCBlbmQoKSwgdGhpcy0+X01fZmluaXNoICsgX19uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcoKSwgKGRpZmZlcmVuY2VfdHlwZSopMCApOworICAgICAgX1NUTFBfU1REOjpjb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19wb3NpdGlvbik7CisgICAgICB0aGlzLT5fTV9maW5pc2ggKz0gX19uOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHNpemVfdHlwZSBfX2xlbiA9IHNpemUoKSArIChtYXgpKHNpemUoKSwgX19uKTsKKyAgICAgIF9fY2h1bmtfdHlwZSogX19xID0gdGhpcy0+X01fYml0X2FsbG9jKF9fbGVuKTsKKyAgICAgIGl0ZXJhdG9yIF9faSA9IF9TVExQX1NURDo6Y29weShiZWdpbigpLCBfX3Bvc2l0aW9uLCBpdGVyYXRvcihfX3EsIDApKTsKKyAgICAgIF9faSA9IF9TVExQX1NURDo6Y29weShfX2ZpcnN0LCBfX2xhc3QsIF9faSk7CisgICAgICB0aGlzLT5fTV9maW5pc2ggPSBfU1RMUF9TVEQ6OmNvcHkoX19wb3NpdGlvbiwgZW5kKCksIF9faSk7CisgICAgICB0aGlzLT5fTV9kZWFsbG9jYXRlKCk7CisgICAgICB0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5fTV9kYXRhID0gX19xICsgX0Jhc2U6Ol9NX2JpdHNfdG9fY2h1bmtzKF9fbGVuKTsKKyAgICAgIHRoaXMtPl9NX3N0YXJ0ID0gaXRlcmF0b3IoX19xLCAwKTsKKyAgICB9CisgIH0KKworICB2b2lkIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLCBjb25zdCBib29sKiBfX2ZpcnN0LCBjb25zdCBib29sKiBfX2xhc3QpIHsKKyAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QpIHJldHVybjsKKyAgICBzaXplX3R5cGUgX19uID0gX1NUTFBfU1REOjpkaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QpOworICAgIGlmIChjYXBhY2l0eSgpIC0gc2l6ZSgpID49IF9fbikgeworICAgICAgX1NUTFBfUFJJViBfX2NvcHlfYmFja3dhcmQoX19wb3NpdGlvbiwgZW5kKCksIHRoaXMtPl9NX2ZpbmlzaCArIF9fbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKCksIChkaWZmZXJlbmNlX3R5cGUqKTAgKTsKKyAgICAgIF9TVExQX1NURDo6Y29weShfX2ZpcnN0LCBfX2xhc3QsIF9fcG9zaXRpb24pOworICAgICAgdGhpcy0+X01fZmluaXNoICs9IF9fbjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBzaXplX3R5cGUgX19sZW4gPSBzaXplKCkgKyAobWF4KShzaXplKCksIF9fbik7CisgICAgICBfX2NodW5rX3R5cGUqIF9fcSA9IHRoaXMtPl9NX2JpdF9hbGxvYyhfX2xlbik7CisgICAgICBpdGVyYXRvciBfX2kgPSBfU1RMUF9TVEQ6OmNvcHkoYmVnaW4oKSwgX19wb3NpdGlvbiwgaXRlcmF0b3IoX19xLCAwKSk7CisgICAgICBfX2kgPSBfU1RMUF9TVEQ6OmNvcHkoX19maXJzdCwgX19sYXN0LCBfX2kpOworICAgICAgdGhpcy0+X01fZmluaXNoID0gX1NUTFBfU1REOjpjb3B5KF9fcG9zaXRpb24sIGVuZCgpLCBfX2kpOworICAgICAgdGhpcy0+X01fZGVhbGxvY2F0ZSgpOworICAgICAgdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuX01fZGF0YSA9IF9fcSArIF9CYXNlOjpfTV9iaXRzX3RvX2NodW5rcyhfX2xlbik7CisgICAgICB0aGlzLT5fTV9zdGFydCA9IGl0ZXJhdG9yKF9fcSwgMCk7CisgICAgfQorICB9CisjZW5kaWYgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworCisgIHZvaWQgX01fZmlsbF9pbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgc2l6ZV90eXBlIF9fbiwgYm9vbCBfX3gpIHsKKyAgICBpZiAoX19uID09IDApIHJldHVybjsKKyAgICBpZiAoY2FwYWNpdHkoKSAtIHNpemUoKSA+PSBfX24pIHsKKyAgICAgIF9TVExQX1BSSVYgX19jb3B5X2JhY2t3YXJkKF9fcG9zaXRpb24sIGVuZCgpLCB0aGlzLT5fTV9maW5pc2ggKyBkaWZmZXJlbmNlX3R5cGUoX19uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKCksIChkaWZmZXJlbmNlX3R5cGUqKTAgKTsKKyAgICAgIGZpbGwoX19wb3NpdGlvbiwgX19wb3NpdGlvbiArIGRpZmZlcmVuY2VfdHlwZShfX24pLCBfX3gpOworICAgICAgdGhpcy0+X01fZmluaXNoICs9IGRpZmZlcmVuY2VfdHlwZShfX24pOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHNpemVfdHlwZSBfX2xlbiA9IHNpemUoKSArIChtYXgpKHNpemUoKSwgX19uKTsKKyAgICAgIF9fY2h1bmtfdHlwZSogX19xID0gdGhpcy0+X01fYml0X2FsbG9jKF9fbGVuKTsKKyAgICAgIGl0ZXJhdG9yIF9faSA9IF9TVExQX1NURDo6Y29weShiZWdpbigpLCBfX3Bvc2l0aW9uLCBpdGVyYXRvcihfX3EsIDApKTsKKyAgICAgIGZpbGxfbihfX2ksIF9fbiwgX194KTsKKyAgICAgIHRoaXMtPl9NX2ZpbmlzaCA9IF9TVExQX1NURDo6Y29weShfX3Bvc2l0aW9uLCBlbmQoKSwgX19pICsgZGlmZmVyZW5jZV90eXBlKF9fbikpOworICAgICAgdGhpcy0+X01fZGVhbGxvY2F0ZSgpOworICAgICAgdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuX01fZGF0YSA9IF9fcSArIF9CYXNlOjpfTV9iaXRzX3RvX2NodW5rcyhfX2xlbik7CisgICAgICB0aGlzLT5fTV9zdGFydCA9IGl0ZXJhdG9yKF9fcSwgMCk7CisgICAgfQorICB9CisKKyAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgc2l6ZV90eXBlIF9fbiwgYm9vbCBfX3gpIHsKKyAgICBfTV9maWxsX2luc2VydChfX3Bvc2l0aW9uLCBfX24sIF9feCk7CisgIH0KKworICB2b2lkIHBvcF9iYWNrKCkgeworICAgIC0tdGhpcy0+X01fZmluaXNoOworICB9CisgIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24pIHsKKyAgICBpZiAoX19wb3NpdGlvbiArIDEgIT0gZW5kKCkpCisgICAgICBfU1RMUF9TVEQ6OmNvcHkoX19wb3NpdGlvbiArIDEsIGVuZCgpLCBfX3Bvc2l0aW9uKTsKKyAgICAgIC0tdGhpcy0+X01fZmluaXNoOworICAgIHJldHVybiBfX3Bvc2l0aW9uOworICB9CisgIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkgeworICAgIHRoaXMtPl9NX2ZpbmlzaCA9IF9TVExQX1NURDo6Y29weShfX2xhc3QsIGVuZCgpLCBfX2ZpcnN0KTsKKyAgICByZXR1cm4gX19maXJzdDsKKyAgfQorICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgX19uZXdfc2l6ZSwgYm9vbCBfX3ggPSBib29sKCkpIHsKKyAgICBpZiAoX19uZXdfc2l6ZSA8IHNpemUoKSkKKyAgICAgIGVyYXNlKGJlZ2luKCkgKyBkaWZmZXJlbmNlX3R5cGUoX19uZXdfc2l6ZSksIGVuZCgpKTsKKyAgICBlbHNlCisgICAgICBpbnNlcnQoZW5kKCksIF9fbmV3X3NpemUgLSBzaXplKCksIF9feCk7CisgIH0KKyAgdm9pZCBmbGlwKCkgeworICAgIGZvciAoX19jaHVua190eXBlKiBfX3AgPSB0aGlzLT5fTV9zdGFydC5fTV9wOyBfX3AgIT0gdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuX01fZGF0YTsgKytfX3ApCisgICAgICAqX19wID0gfipfX3A7CisgIH0KKworICB2b2lkIGNsZWFyKCkgeyBlcmFzZShiZWdpbigpLCBlbmQoKSk7IH0KK307CisKKyNpZiBkZWZpbmVkICAoX1NUTFBfTk9fQk9PTCkgfHwgZGVmaW5lZCAoX19IUF9hQ0MpIC8vIGZpeGVkIHNvb24gKDAzLzE3LzIwMDApCisjICBkZWZpbmUgX1NUTFBfVEVNUExBVEVfSEVBREVSIF9fQlZFQ19UTVBMX0hFQURFUgorIyAgZGVmaW5lIF9TVExQX1RFTVBMQVRFX0NPTlRBSU5FUiBfX0JWRUNUT1JfUVVBTElGSUVECisjICBpbmNsdWRlIDxzdGwvX3JlbG9wc19jb250Lmg+CisjICB1bmRlZiBfU1RMUF9URU1QTEFURV9DT05UQUlORVIKKyMgIHVuZGVmIF9TVExQX1RFTVBMQVRFX0hFQURFUgorI2VuZGlmIC8qIE5PX0JPT0wgKi8KKworI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fQk9PTCkKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorI2VuZGlmCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI3VuZGVmIHZlY3RvcgorI3VuZGVmIF9BbGxvYworI3VuZGVmIF9TVExQX1ZFQ0JPT0xfVEVNUExBVEUKKyN1bmRlZiBfX0JWRUNUT1IKKyN1bmRlZiBfX0JWRUNUT1JfUVVBTElGSUVECisjdW5kZWYgX19CVkVDX1RNUExfSEVBREVSCisKKyN1bmRlZiBfU1RMUF9XT1JEX0JJVAorCisjZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfQlZFQ1RPUl9IICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX2NhcnJheS5oIGIvc3RscG9ydC9zdGwvX2NhcnJheS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzdGwvX2NhcnJheS5oCnJlbmFtZSB0byBzdGxwb3J0L3N0bC9fY2FycmF5LmgKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL19jY3R5cGUuaCBiL3N0bHBvcnQvc3RsL19jY3R5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjgyNTI0Ci0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvX2NjdHlwZS5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NDVFlQRQorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9DQ1RZUEUKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9ORVdfQ19IRUFERVJTKQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfSEFTX0lOQ0xVREVfTkVYVCkKKyMgICAgaW5jbHVkZV9uZXh0IDxjY3R5cGU+CisjICBlbHNlCisjICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUihjY3R5cGUpCisjICBlbmRpZgorI2Vsc2UKKyMgIGluY2x1ZGUgPGN0eXBlLmg+CisjZW5kaWYgLyogX1NUTFBfVVNFX05FV19DX0hFQURFUlMgKi8KKworI2lmICEgZGVmaW5lZCAoX1NUTFBfTk9fQ1NURF9GVU5DVElPTl9JTVBPUlRTKQorIyAgaWYgZGVmaW5lZCAoIF9TVExQX0lNUE9SVF9WRU5ET1JfQ1NURCApCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjppc2FsbnVtOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmlzYWxwaGE7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6aXNjbnRybDsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjppc2RpZ2l0OwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmlzZ3JhcGg7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6aXNsb3dlcjsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjppc3ByaW50OwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmlzcHVuY3Q7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6aXNzcGFjZTsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjppc3VwcGVyOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmlzeGRpZ2l0OwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnRvbG93ZXI7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6dG91cHBlcjsKK19TVExQX0VORF9OQU1FU1BBQ0UKKyMgIGVuZGlmIC8qIF9TVExQX0lNUE9SVF9WRU5ET1JfQ1NURCovCisjZW5kaWYgLyogX1NUTFBfTk9fQ1NURF9GVU5DVElPTl9JTVBPUlRTICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdGwvX2Nsb2NhbGUuaCBiL3N0bHBvcnQvc3RsL19jbG9jYWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkxYTliNgotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc3RsL19jbG9jYWxlLmgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ0xPQ0FMRQorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9DTE9DQUxFCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfV0NFX0VWQzMpCisKKyMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9ORVdfQ19IRUFERVJTKQorIyAgICBpZiBkZWZpbmVkIChfU1RMUF9IQVNfSU5DTFVERV9ORVhUKQorIyAgICAgIGluY2x1ZGVfbmV4dCA8Y2xvY2FsZT4KKyMgICAgZWxzZQorIyAgICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUihjbG9jYWxlKQorIyAgICBlbmRpZgorIyAgZWxzZQorIyAgICBpbmNsdWRlIDxsb2NhbGUuaD4KKyMgIGVuZGlmCisKKyMgIGlmIGRlZmluZWQgKF9TVExQX0lNUE9SVF9WRU5ET1JfQ1NURCkKK19TVExQX0JFR0lOX05BTUVTUEFDRQordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6Omxjb252OworIyAgICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fQ1NURF9GVU5DVElPTl9JTVBPUlRTKQordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmxvY2FsZWNvbnY7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6c2V0bG9jYWxlOworIyAgICBlbmRpZgorX1NUTFBfRU5EX05BTUVTUEFDRQorIyAgZW5kaWYKKworI2VuZGlmIC8qICFfU1RMUF9XQ0VfRVZDMyAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL19jbWF0aC5oIGIvc3RscG9ydC9zdGwvX2NtYXRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRjMGZlMgotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc3RsL19jbWF0aC5oCkBAIC0wLDAgKzEsNTc5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DTUFUSAorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9DTUFUSAorCisvKiBnY2MgZG8gbm90IGxpa2Ugd2hlbiBhIHVzaW5nIGRpcmVjdGl2ZSBhcHBlYXIgYWZ0ZXIgYSBmdW5jdGlvbgorICogZGVjbGFyYXRpb24uIGNtYXRoIGhhdmUgYWJzIG92ZXJsb2FkcyBhbmQgY3N0ZGxpYiBhIHVzaW5nIGRpcmVjdGl2ZQorICogc28gY3N0ZGxpYiBoYXMgdG8gYmUgaW5jbHVkZWQgZmlyc3QuCisgKi8KKyNpZiBkZWZpbmVkIChfX0dOVUNfXykgJiYgZGVmaW5lZCAoX1NUTFBfVVNFX05FV19DX0hFQURFUlMpCisjICBpZiBkZWZpbmVkIChfU1RMUF9IQVNfSU5DTFVERV9ORVhUKQorIyAgICBpbmNsdWRlX25leHQgPGNzdGRsaWI+CisjICBlbHNlCisjICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUihjc3RkbGliKQorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX05FV19DX0hFQURFUlMpCisjICBpZiBkZWZpbmVkIChfU1RMUF9IQVNfTk9fTkFNRVNQQUNFUykgJiYgIWRlZmluZWQgKGV4Y2VwdGlvbikKKyMgICAgZGVmaW5lIGV4Y2VwdGlvbiBfX21hdGhfZXhjZXB0aW9uCisjICBlbmRpZgorIyAgaWYgZGVmaW5lZCAoX1NUTFBfSEFTX0lOQ0xVREVfTkVYVCkKKyMgICAgaW5jbHVkZV9uZXh0IDxjbWF0aD4KKyMgIGVsc2UKKyMgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSEVBREVSKGNtYXRoKQorIyAgZW5kaWYKKyMgIGlmIGRlZmluZWQgKF9TVExQX0hBU19OT19OQU1FU1BBQ0VTKQorIyAgICB1bmRlZiBleGNlcHRpb24KKyMgIGVuZGlmCisjZWxzZQorIyAgaW5jbHVkZSA8bWF0aC5oPgorI2VuZGlmCisKKyNpZiAoZGVmaW5lZCAoX19TVU5QUk9fQ0MpICYmIChfX1NVTlBST19DQyA+IDB4NTAwKSkgfHwgXAorICAgICAhKGRlZmluZWQgKF9fSUJNQ1BQX18pICYmIChfX0lCTUNQUF9fID49IDUwMCkgfHwgIShkZWZpbmVkKF9fSFBfYUNDKSAmJiAoX19IUF9hQ0MgPj0gMzAwMDApICkpCisjICBpZiAhZGVmaW5lZChfU1RMUF9IQVNfTk9fTkFNRVNQQUNFUykgJiYgIWRlZmluZWQoX19TVU5QUk9fQ0MpCisvLyBBbGwgdGhlIG90aGVyIGh5cG90IHN0dWZmIGlzIGdvaW5nIHRvIGJlIGF0IGZpbGUgc2NvcGUsIHNvIGZvbGxvdyBhbG9uZyBoZXJlLgorbmFtZXNwYWNlIHN0ZCB7CisjICBlbmRpZgorZXh0ZXJuICJDIiBkb3VibGUgaHlwb3QoZG91YmxlIHgsIGRvdWJsZSB5KTsKKyMgIGlmICFkZWZpbmVkKF9TVExQX0hBU19OT19OQU1FU1BBQ0VTKSAmJiAhZGVmaW5lZChfX1NVTlBST19DQykKK30KKyMgIGVuZGlmCisKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19zdW4pICYmIGRlZmluZWQgKF9fR05VQ19fKQorZXh0ZXJuICJDIiB7CisgIGZsb2F0IF9fY29zZihmbG9hdCB2KTsKKyAgZmxvYXQgX19zaW5mKGZsb2F0IHYpOworICBmbG9hdCBfX2F0YW4yZihmbG9hdCwgZmxvYXQpOworICBmbG9hdCBfX2Nvc2hmKGZsb2F0IHYpOworICBmbG9hdCBfX3NpbmhmKGZsb2F0IHYpOworICBmbG9hdCBfX3NxcnRmKGZsb2F0IHYpOworICBmbG9hdCBfX2V4cGYoZmxvYXQgdik7CisgIGZsb2F0IF9fbG9nZihmbG9hdCB2KTsKKyAgZmxvYXQgX19sb2cxMGYoZmxvYXQgdik7CisKKyAgbG9uZyBkb3VibGUgX19jb3NsKGxvbmcgZG91YmxlIHYpOworICBsb25nIGRvdWJsZSBfX3NpbmwobG9uZyBkb3VibGUgdik7CisgIGxvbmcgZG91YmxlIF9fYXRhbjJsKGxvbmcgZG91YmxlLCBsb25nIGRvdWJsZSk7CisgIGxvbmcgZG91YmxlIF9fY29zaGwobG9uZyBkb3VibGUgdik7CisgIGxvbmcgZG91YmxlIF9fc2luaGwobG9uZyBkb3VibGUgdik7CisgIGxvbmcgZG91YmxlIF9fc3FydGwobG9uZyBkb3VibGUgdik7CisgIGxvbmcgZG91YmxlIF9fZXhwbChsb25nIGRvdWJsZSB2KTsKKyAgbG9uZyBkb3VibGUgX19sb2dsKGxvbmcgZG91YmxlIHYpOworICBsb25nIGRvdWJsZSBfX2xvZzEwbChsb25nIGRvdWJsZSB2KTsKK30KKworZXh0ZXJuICJDIiB7CisgIGlubGluZSBmbG9hdCBjb3NmKGZsb2F0IHYpIHsgcmV0dXJuIF9fY29zZih2KTsgfQorICBpbmxpbmUgZmxvYXQgc2luZihmbG9hdCB2KSB7IHJldHVybiBfX3NpbmYodik7IH0KKyAgaW5saW5lIGZsb2F0IGF0YW4yZihmbG9hdCB2MSwgZmxvYXQgdjIpIHsgcmV0dXJuIF9fYXRhbjJmKHYxLHYyKTsgfQorICBpbmxpbmUgZmxvYXQgY29zaGYoZmxvYXQgdikgeyByZXR1cm4gX19jb3NoZih2KTsgfQorICBpbmxpbmUgZmxvYXQgc2luaGYoZmxvYXQgdikgeyByZXR1cm4gX19zaW5oZih2KTsgfQorICBpbmxpbmUgZmxvYXQgc3FydGYoZmxvYXQgdikgeyByZXR1cm4gX19zcXJ0Zih2KTsgfQorICBpbmxpbmUgZmxvYXQgZXhwZihmbG9hdCB2KSB7IHJldHVybiBfX2V4cGYodik7IH0KKyAgaW5saW5lIGZsb2F0IGxvZ2YoZmxvYXQgdikgeyByZXR1cm4gX19sb2dmKHYpOyB9CisgIGlubGluZSBmbG9hdCBsb2cxMGYoZmxvYXQgdikgeyByZXR1cm4gX19sb2cxMGYodik7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUgY29zbChsb25nIGRvdWJsZSB2KSB7IHJldHVybiBfX2Nvc2wodik7IH0KKyAgaW5saW5lIGxvbmcgZG91YmxlIHNpbmwobG9uZyBkb3VibGUgdikgeyByZXR1cm4gX19zaW5sKHYpOyB9CisgIGlubGluZSBsb25nIGRvdWJsZSBhdGFuMmwobG9uZyBkb3VibGUgdjEsIGxvbmcgZG91YmxlIHYyKSB7IHJldHVybiBfX2F0YW4ybCh2MSx2Mik7IH0KKyAgaW5saW5lIGxvbmcgZG91YmxlIGNvc2hsKGxvbmcgZG91YmxlIHYpIHsgcmV0dXJuIF9fY29zaGwodik7IH0KKyAgaW5saW5lIGxvbmcgZG91YmxlIHNpbmhsKGxvbmcgZG91YmxlIHYpIHsgcmV0dXJuIF9fc2luaGwodik7IH0KKyAgaW5saW5lIGxvbmcgZG91YmxlIHNxcnRsKGxvbmcgZG91YmxlIHYpIHsgcmV0dXJuIF9fc3FydGwodik7IH0KKyAgaW5saW5lIGxvbmcgZG91YmxlIGV4cGwobG9uZyBkb3VibGUgdikgeyByZXR1cm4gX19leHBsKHYpOyB9CisgIGlubGluZSBsb25nIGRvdWJsZSBsb2dsKGxvbmcgZG91YmxlIHYpIHsgcmV0dXJuIF9fbG9nbCh2KTsgfQorICBpbmxpbmUgbG9uZyBkb3VibGUgbG9nMTBsKGxvbmcgZG91YmxlIHYpIHsgcmV0dXJuIF9fbG9nMTBsKHYpOyB9Cit9CisjZW5kaWYgLy8gX19zdW4gJiYgX19HTlVDX18KKworI2lmIGRlZmluZWQgKF9fc3VuKQorZXh0ZXJuICJDIiB7CitleHRlcm4gZmxvYXQgX19hY29zZihmbG9hdCk7CitleHRlcm4gZmxvYXQgX19hc2luZihmbG9hdCk7CitleHRlcm4gZmxvYXQgX19hdGFuZihmbG9hdCk7CitleHRlcm4gZmxvYXQgX19hdGFuMmYoZmxvYXQsIGZsb2F0KTsKK2V4dGVybiBmbG9hdCBfX2NlaWxmKGZsb2F0KTsKK2V4dGVybiBmbG9hdCBfX2Nvc2YoZmxvYXQpOworZXh0ZXJuIGZsb2F0IF9fY29zaGYoZmxvYXQpOworZXh0ZXJuIGZsb2F0IF9fZXhwZihmbG9hdCk7CitleHRlcm4gZmxvYXQgX19mYWJzZihmbG9hdCk7CitleHRlcm4gZmxvYXQgX19mbG9vcmYoZmxvYXQpOworZXh0ZXJuIGZsb2F0IF9fZm1vZGYoZmxvYXQsIGZsb2F0KTsKK2V4dGVybiBmbG9hdCBfX2ZyZXhwZihmbG9hdCwgaW50ICopOworZXh0ZXJuIGZsb2F0IF9fbGRleHBmKGZsb2F0LCBpbnQpOworZXh0ZXJuIGZsb2F0IF9fbG9nZihmbG9hdCk7CitleHRlcm4gZmxvYXQgX19sb2cxMGYoZmxvYXQpOworZXh0ZXJuIGZsb2F0IF9fbW9kZmYoZmxvYXQsIGZsb2F0ICopOworZXh0ZXJuIGZsb2F0IF9fcG93ZihmbG9hdCwgZmxvYXQpOworZXh0ZXJuIGZsb2F0IF9fc2luZihmbG9hdCk7CitleHRlcm4gZmxvYXQgX19zaW5oZihmbG9hdCk7CitleHRlcm4gZmxvYXQgX19zcXJ0ZihmbG9hdCk7CitleHRlcm4gZmxvYXQgX190YW5mKGZsb2F0KTsKK2V4dGVybiBmbG9hdCBfX3RhbmhmKGZsb2F0KTsKKworZXh0ZXJuIGxvbmcgZG91YmxlIF9fYWNvc2wobG9uZyBkb3VibGUpOworZXh0ZXJuIGxvbmcgZG91YmxlIF9fYXNpbmwobG9uZyBkb3VibGUpOworZXh0ZXJuIGxvbmcgZG91YmxlIF9fYXRhbmwobG9uZyBkb3VibGUpOworZXh0ZXJuIGxvbmcgZG91YmxlIF9fYXRhbjJsKGxvbmcgZG91YmxlLCBsb25nIGRvdWJsZSk7CitleHRlcm4gbG9uZyBkb3VibGUgX19jZWlsbChsb25nIGRvdWJsZSk7CitleHRlcm4gbG9uZyBkb3VibGUgX19jb3NsKGxvbmcgZG91YmxlKTsKK2V4dGVybiBsb25nIGRvdWJsZSBfX2Nvc2hsKGxvbmcgZG91YmxlKTsKK2V4dGVybiBsb25nIGRvdWJsZSBfX2V4cGwobG9uZyBkb3VibGUpOworZXh0ZXJuIGxvbmcgZG91YmxlIF9fZmFic2wobG9uZyBkb3VibGUpOworZXh0ZXJuIGxvbmcgZG91YmxlIF9fZmxvb3JsKGxvbmcgZG91YmxlKTsKK2V4dGVybiBsb25nIGRvdWJsZSBfX2Ztb2RsKGxvbmcgZG91YmxlLCBsb25nIGRvdWJsZSk7CitleHRlcm4gbG9uZyBkb3VibGUgX19mcmV4cGwobG9uZyBkb3VibGUsIGludCAqKTsKK2V4dGVybiBsb25nIGRvdWJsZSBfX2xkZXhwbChsb25nIGRvdWJsZSwgaW50KTsKK2V4dGVybiBsb25nIGRvdWJsZSBfX2xvZ2wobG9uZyBkb3VibGUpOworZXh0ZXJuIGxvbmcgZG91YmxlIF9fbG9nMTBsKGxvbmcgZG91YmxlKTsKK2V4dGVybiBsb25nIGRvdWJsZSBfX21vZGZsKGxvbmcgZG91YmxlLCBsb25nIGRvdWJsZSAqKTsKK2V4dGVybiBsb25nIGRvdWJsZSBfX3Bvd2wobG9uZyBkb3VibGUsIGxvbmcgZG91YmxlKTsKK2V4dGVybiBsb25nIGRvdWJsZSBfX3NpbmwobG9uZyBkb3VibGUpOworZXh0ZXJuIGxvbmcgZG91YmxlIF9fc2luaGwobG9uZyBkb3VibGUpOworZXh0ZXJuIGxvbmcgZG91YmxlIF9fc3FydGwobG9uZyBkb3VibGUpOworZXh0ZXJuIGxvbmcgZG91YmxlIF9fdGFubChsb25nIGRvdWJsZSk7CitleHRlcm4gbG9uZyBkb3VibGUgX190YW5obChsb25nIGRvdWJsZSk7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fQk9STEFORENfXykKKyMgIGRlZmluZSBfU1RMUF9DTUFUSF9GVU5DX05BTUVTUEFDRSBfU1RMUF9WRU5ET1JfQ1NURAorI2Vsc2UKKyMgIGRlZmluZSBfU1RMUF9DTUFUSF9GVU5DX05BTUVTUEFDRQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoX19zdW4pIHx8IGRlZmluZWQgKF9fR05VQ19fKQorIyAgZGVmaW5lIF9TVExQX01BVEhfSU5MSU5FKGZsb2F0X3R5cGUsIGZ1bmMsIGNmdW5jKSBcCisgICAgIGlubGluZSBmbG9hdF90eXBlIGZ1bmMgKGZsb2F0X3R5cGUgeCkgeyByZXR1cm4gX1NUTFBfQ01BVEhfRlVOQ19OQU1FU1BBQ0U6OmNmdW5jKHgpOyB9CisjICBkZWZpbmUgX1NUTFBfTUFUSF9JTkxJTkUyKGZsb2F0X3R5cGUsIHR5cGUsIGZ1bmMsIGNmdW5jKSBcCisgICAgIGlubGluZSBmbG9hdF90eXBlIGZ1bmMgKGZsb2F0X3R5cGUgeCwgdHlwZSB5KSB7IHJldHVybiBfU1RMUF9DTUFUSF9GVU5DX05BTUVTUEFDRTo6Y2Z1bmMoeCwgeSk7IH0KKyMgIGRlZmluZSBfU1RMUF9NQVRIX0lOTElORV9EKGZsb2F0X3R5cGUsIGZ1bmMsIGNmdW5jKQorIyAgZGVmaW5lIF9TVExQX01BVEhfSU5MSU5FMl9EKGZsb2F0X3R5cGUsIHR5cGUsIGZ1bmMsIGNmdW5jKQorI2Vsc2UKKyMgIGlmZGVmIF9fU1VOUFJPX0NDCisjICAgIGRlZmluZSBfU1RMUF9NQVRIX0lOTElORShmbG9hdF90eXBlLCBmdW5jLCBjZnVuYykgXAorICAgICAgIGlubGluZSBmbG9hdF90eXBlIGZ1bmMgKGZsb2F0X3R5cGUgeCkgeyByZXR1cm4gX1NUTFBfVkVORE9SX0NTVEQ6Ol9fIyNjZnVuYyh4KTsgfQorIyAgICBkZWZpbmUgX1NUTFBfTUFUSF9JTkxJTkVfRChmbG9hdF90eXBlLCBmdW5jLCBjZnVuYykgXAorICAgICAgIGlubGluZSBmbG9hdF90eXBlIGZ1bmMgKGZsb2F0X3R5cGUgeCkgeyByZXR1cm4gX1NUTFBfVkVORE9SX0NTVEQ6OmNmdW5jKHgpOyB9CisjICAgIGRlZmluZSBfU1RMUF9NQVRIX0lOTElORTIoZmxvYXRfdHlwZSwgdHlwZSwgZnVuYywgY2Z1bmMpIFwKKyAgICAgICBpbmxpbmUgZmxvYXRfdHlwZSBmdW5jIChmbG9hdF90eXBlIHgsIHR5cGUgeSkgeyByZXR1cm4gX1NUTFBfVkVORE9SX0NTVEQ6Ol9fIyNjZnVuYyh4LHkpOyB9CisjICAgIGRlZmluZSBfU1RMUF9NQVRIX0lOTElORTJfRChmbG9hdF90eXBlLCB0eXBlLCBmdW5jLCBjZnVuYykgXAorICAgICAgIGlubGluZSBmbG9hdF90eXBlIGZ1bmMgKGZsb2F0X3R5cGUgeCwgdHlwZSB5KSB7IHJldHVybiBfU1RMUF9WRU5ET1JfQ1NURDo6Y2Z1bmMoeCx5KTsgfQorIyAgZWxzZQorIyAgICBlcnJvciBVbmtub3duIGNvbXBpbGVyIGZvciB0aGUgU3VuIHBsYXRmb3JtCisjICBlbmRpZgorI2VuZGlmCisKKy8qKiBtYWNyb3MgdG8gZGVmaW5lIG1hdGggZnVuY3Rpb25zCitUaGVzZSBtYWNyb3MgKGhhdmluZyBhbiBYIHNvbWV3aGVyZSBpbiB0aGUgbmFtZSkgZm9yd2FyZCB0byB0aGUgQyBsaWJyYXJ5J3MKK2RvdWJsZSBmdW5jdGlvbnMgYnV0IGNhc3QgdGhlIGFyZ3VtZW50cyBhbmQgcmV0dXJuIHZhbHVlcyB0byB0aGUgZ2l2ZW4gdHlwZS4gKi8KKworI2RlZmluZSBfU1RMUF9NQVRIX0lOTElORVgoX190eXBlLGZ1bmMsY2Z1bmMpIFwKKyAgaW5saW5lIF9fdHlwZSBmdW5jIChfX3R5cGUgeCkgXAorICB7IHJldHVybiBfX1NUQVRJQ19DQVNUKF9fdHlwZSwgX1NUTFBfQ01BVEhfRlVOQ19OQU1FU1BBQ0U6OmNmdW5jKChkb3VibGUpeCkpOyB9CisjZGVmaW5lIF9TVExQX01BVEhfSU5MSU5FMlgoX190eXBlMSxfX3R5cGUyLGZ1bmMsY2Z1bmMpIFwKKyAgaW5saW5lIF9fdHlwZTEgZnVuYyAoX190eXBlMSB4LCBfX3R5cGUyIHkpIFwKKyAgeyByZXR1cm4gX19TVEFUSUNfQ0FTVChfX3R5cGUxLCBfU1RMUF9DTUFUSF9GVU5DX05BTUVTUEFDRTo6Y2Z1bmMoKGRvdWJsZSl4LCB5KSk7IH0KKyNkZWZpbmUgX1NUTFBfTUFUSF9JTkxJTkUyUFgoX190eXBlLGZ1bmMsY2Z1bmMpIFwKKyAgaW5saW5lIF9fdHlwZSBmdW5jIChfX3R5cGUgeCwgX190eXBlICp5KSB7IFwKKyAgICBkb3VibGUgdG1wMSwgdG1wMjsgXAorICAgIHRtcDEgPSBfU1RMUF9DTUFUSF9GVU5DX05BTUVTUEFDRTo6Y2Z1bmMoX19TVEFUSUNfQ0FTVChkb3VibGUsIHgpLCAmdG1wMik7IFwKKyAgICAqeSA9IF9fU1RBVElDX0NBU1QoX190eXBlLCB0bXAyKTsgXAorICAgIHJldHVybiBfX1NUQVRJQ19DQVNUKF9fdHlwZSwgdG1wMSk7IFwKKyAgfQorI2RlZmluZSBfU1RMUF9NQVRIX0lOTElORTJYWChfX3R5cGUsZnVuYyxjZnVuYykgXAorICBpbmxpbmUgX190eXBlIGZ1bmMgKF9fdHlwZSB4LCBfX3R5cGUgeSkgXAorICB7IHJldHVybiBfX1NUQVRJQ19DQVNUKF9fdHlwZSwgX1NUTFBfQ01BVEhfRlVOQ19OQU1FU1BBQ0U6OmNmdW5jKChkb3VibGUpeCwgKGRvdWJsZSl5KSk7IH0KKworCisvKiogcm91Z2ggY2hhcmFjdGVyaXphdGlvbiBvZiBjb21waWxlciBhbmQgbmF0aXZlIEMgbGlicmFyeQorRm9yIHRoZSBjb21waWxlciwgaXQgY2FuIGVpdGhlciBzdXBwb3J0IGxvbmcgZG91YmxlIG9yIG5vdC4gSWYgaXQgZG9lc24ndCwgdGhlCittYWNybyBfU1RMUF9OT19MT05HX0RPVUJMRSBpcyBub3QgZGVmaW5lZCBhbmQgd2UgZG9uJ3QgZGVmaW5lIGFueSBsb25nIGRvdWJsZQorb3ZlcmxvYWRzLgorRm9yIHRoZSBuYXRpdmUgQyBsaWJyYXJ5IHRoZSBxdWVzdGlvbiBpcyB3aGV0aGVyIGl0IGhhcyB2YXJpYW50cyB3aXRoIGFuICdmJworc3VmZml4IChmb3IgZmxvYXQgYXMgb3Bwb3NlZCB0byBkb3VibGUpIG9yIGFuICdsJyBzdWZmaXggKGZvciBsb25nIGRvdWJsZSkuIElmCit0aGUgZmxvYXQgdmFyaWFudHMgYXJlIG1pc3NpbmcsIF9TVExQX05PX1ZFTkRPUl9NQVRIX0YgaXMgZGVmaW5lZCwgd2hlbiB0aGUKK2xvbmcgZG91YmxlIHZhcmlhbnRzIGFyZSBtaXNzaW5nLCBfU1RMUF9OT19WRU5ET1JfTUFUSF9MIGlzIGRlZmluZWQuIE9mIGNvdXJzZQordGhlIGxhdHRlciBkb2Vzbid0IG1ha2Ugc2Vuc2UgYW55d2F5IHdoZW4gdGhlIGNvbXBpbGVyIGFscmVhZHkgaGFzIG5vIGxvbmcKK2RvdWJsZSBzdXBwb3J0LgorCitUaG9zZSB0d28gdHJhaXRzIGRldGVybWluZSBhKSB3aGljaCBvdmVybG9hZHMgZ2V0IGRlZmluZWQgYW5kIGIpIGhvdyB0aGV5IGFyZQorZGVmaW5lZC4KKworTWVhbmluZyBvZiBzdWZmaXhlczoKKyIiICAgOiBmdW5jdGlvbiByZXR1cm5pbmcgYW5kIHRha2luZyBhIGZsb2F0X3R5cGUKKyIyIiAgOiBmdW5jdGlvbiByZXR1cm5pbmcgYSBmbG9hdF90eXBlIGFuZCB0YWtpbmcgdG8gZmxvYXRfdHlwZXMKKyIyUCIgOiBmdW5jdGlvbiByZXR1cm5pbmcgYSBmbG9hdF90eXBlIGFuZCB0YWtpbmcgYSBmbG9hdF90eXBlIGFuZCBhIGZsb2F0X3R5cGUqCisiMlBJIjogZnVuY3Rpb24gcmV0dXJuaW5nIGEgZmxvYXRfdHlwZSBhbmQgdGFraW5nIGEgZmxvYXRfdHlwZSBhbmQgYW4gaW50KgorIjJJIiA6IGZ1bmN0aW9uIHJldHVybmluZyBhIGZsb2F0X3R5cGUgYW5kIHRha2luZyBhIGZsb2F0X1R5cGUgYW5kIGFuIGludAorKi8KKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19MT05HX0RPVUJMRSkgJiYgIWRlZmluZWQgKF9TVExQX05PX1ZFTkRPUl9NQVRIX0wpICYmICFkZWZpbmVkIChfU1RMUF9OT19WRU5ET1JfTUFUSF9GKQorICAgLy8gbG9uZyBkb3VibGUgc3VwcG9ydCBhbmQgYm90aCBlLmcuIHNpbmwobG9uZyBkb3VibGUpIGFuZCBzaW5mKGZsb2F0KQorICAgLy8gVGhpcyBpcyB0aGUgZGVmYXVsdCBmb3IgYSBjb3JyZWN0IGFuZCBjb21wbGV0ZSBuYXRpdmUgbGlicmFyeS4KKyMgIGRlZmluZSBfU1RMUF9ERUZfTUFUSF9JTkxJTkUoZnVuYyxjZikgXAorICBfU1RMUF9NQVRIX0lOTElORShmbG9hdCxmdW5jLGNmIyNmKSBcCisgIF9TVExQX01BVEhfSU5MSU5FX0QoZG91YmxlLGZ1bmMsY2YpIFwKKyAgX1NUTFBfTUFUSF9JTkxJTkUobG9uZyBkb3VibGUsZnVuYyxjZiMjbCkKKyMgIGRlZmluZSBfU1RMUF9ERUZfTUFUSF9JTkxJTkUyKGZ1bmMsY2YpIFwKKyAgX1NUTFBfTUFUSF9JTkxJTkUyKGZsb2F0LGZsb2F0LGZ1bmMsY2YjI2YpIFwKKyAgX1NUTFBfTUFUSF9JTkxJTkUyX0QoZG91YmxlLGRvdWJsZSxmdW5jLGNmKSBcCisgIF9TVExQX01BVEhfSU5MSU5FMihsb25nIGRvdWJsZSxsb25nIGRvdWJsZSxmdW5jLGNmIyNsKQorIyAgZGVmaW5lIF9TVExQX0RFRl9NQVRIX0lOTElORTJQKGZ1bmMsY2YpIFwKKyAgX1NUTFBfTUFUSF9JTkxJTkUyKGZsb2F0LGZsb2F0ICosZnVuYyxjZiMjZikgXAorICBfU1RMUF9NQVRIX0lOTElORTJfRChkb3VibGUsZG91YmxlICosZnVuYyxjZikgXAorICBfU1RMUF9NQVRIX0lOTElORTIobG9uZyBkb3VibGUsbG9uZyBkb3VibGUgKixmdW5jLGNmIyNsKQorIyAgZGVmaW5lIF9TVExQX0RFRl9NQVRIX0lOTElORTJQSShmdW5jLGNmKSBcCisgIF9TVExQX01BVEhfSU5MSU5FMihmbG9hdCxpbnQgKixmdW5jLGNmIyNmKSBcCisgIF9TVExQX01BVEhfSU5MSU5FMl9EKGRvdWJsZSxpbnQgKixmdW5jLGNmKSBcCisgIF9TVExQX01BVEhfSU5MSU5FMihsb25nIGRvdWJsZSxpbnQgKixmdW5jLGNmIyNsKQorIyAgZGVmaW5lIF9TVExQX0RFRl9NQVRIX0lOTElORTJJKGZ1bmMsY2YpIFwKKyAgX1NUTFBfTUFUSF9JTkxJTkUyKGZsb2F0LGludCxmdW5jLGNmIyNmKSBcCisgIF9TVExQX01BVEhfSU5MSU5FMl9EKGRvdWJsZSxpbnQsZnVuYyxjZikgXAorICBfU1RMUF9NQVRIX0lOTElORTIobG9uZyBkb3VibGUsaW50LGZ1bmMsY2YjI2wpCisjZWxzZQorIyAgaWYgIWRlZmluZWQgKF9TVExQX05PX0xPTkdfRE9VQkxFKQorIyAgICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fVkVORE9SX01BVEhfRikKKyAgICAgICAvLyBsb25nIGRvdWJsZSBzdXBwb3J0IGFuZCBlLmcuIHNpbmYoZmxvYXQpIGJ1dCBub3QgZS5nLiBzaW5sKGxvbmcgZG91YmxlKQorIyAgICAgIGRlZmluZSBfU1RMUF9ERUZfTUFUSF9JTkxJTkUoZnVuYyxjZikgXAorICAgICAgX1NUTFBfTUFUSF9JTkxJTkUoZmxvYXQsZnVuYyxjZiMjZikgXAorICAgICAgX1NUTFBfTUFUSF9JTkxJTkVYKGxvbmcgZG91YmxlLGZ1bmMsY2YpCisjICAgICAgZGVmaW5lIF9TVExQX0RFRl9NQVRIX0lOTElORTIoZnVuYyxjZikgXAorICAgICAgX1NUTFBfTUFUSF9JTkxJTkUyKGZsb2F0LGZsb2F0LGZ1bmMsY2YjI2YpIFwKKyAgICAgIF9TVExQX01BVEhfSU5MSU5FMlhYKGxvbmcgZG91YmxlLGZ1bmMsY2YpCisjICAgICAgZGVmaW5lIF9TVExQX0RFRl9NQVRIX0lOTElORTJQKGZ1bmMsY2YpIFwKKyAgICAgIF9TVExQX01BVEhfSU5MSU5FMihmbG9hdCxmbG9hdCAqLGZ1bmMsY2YjI2YpIFwKKyAgICAgIF9TVExQX01BVEhfSU5MSU5FMlBYKGxvbmcgZG91YmxlLGZ1bmMsY2YpCisjICAgICAgZGVmaW5lIF9TVExQX0RFRl9NQVRIX0lOTElORTJQSShmdW5jLGNmKSBcCisgICAgICBfU1RMUF9NQVRIX0lOTElORTIoZmxvYXQsaW50ICosZnVuYyxjZiMjZikgXAorICAgICAgX1NUTFBfTUFUSF9JTkxJTkUyWChsb25nIGRvdWJsZSxpbnQgKixmdW5jLGNmKQorIyAgICAgIGRlZmluZSBfU1RMUF9ERUZfTUFUSF9JTkxJTkUySShmdW5jLGNmKSBcCisgICAgICBfU1RMUF9NQVRIX0lOTElORTIoZmxvYXQsaW50LGZ1bmMsY2YjI2YpIFwKKyAgICAgIF9TVExQX01BVEhfSU5MSU5FMlgobG9uZyBkb3VibGUsaW50LGZ1bmMsY2YpCisjICAgIGVsaWYgIWRlZmluZWQgKF9TVExQX05PX1ZFTkRPUl9NQVRIX0wpCisgICAgICAgLy8gbG9uZyBkb3VibGUgc3VwcG9ydCBhbmQgZS5nLiBzaW5sKGxvbmcgZG91YmxlKSBidXQgbm90IGUuZy4gc2luZihmbG9hdCkKKyMgICAgICBkZWZpbmUgX1NUTFBfREVGX01BVEhfSU5MSU5FKGZ1bmMsY2YpIFwKKyAgICAgIF9TVExQX01BVEhfSU5MSU5FWChmbG9hdCxmdW5jLGNmKSBcCisgICAgICBfU1RMUF9NQVRIX0lOTElORShsb25nIGRvdWJsZSxmdW5jLGNmIyNsKQorIyAgICAgIGRlZmluZSBfU1RMUF9ERUZfTUFUSF9JTkxJTkUyKGZ1bmMsY2YpIFwKKyAgICAgIF9TVExQX01BVEhfSU5MSU5FMlhYKGZsb2F0LGZ1bmMsY2YpIFwKKyAgICAgIF9TVExQX01BVEhfSU5MSU5FMihsb25nIGRvdWJsZSxsb25nIGRvdWJsZSxmdW5jLGNmIyNsKQorIyAgICAgIGRlZmluZSBfU1RMUF9ERUZfTUFUSF9JTkxJTkUyUChmdW5jLGNmKSBcCisgICAgICBfU1RMUF9NQVRIX0lOTElORTJQWChmbG9hdCxmdW5jLGNmKSBcCisgICAgICBfU1RMUF9NQVRIX0lOTElORTIobG9uZyBkb3VibGUsbG9uZyBkb3VibGUgKixmdW5jLGNmIyNsKQorIyAgICAgIGRlZmluZSBfU1RMUF9ERUZfTUFUSF9JTkxJTkUyUEkoZnVuYyxjZikgXAorICAgICAgX1NUTFBfTUFUSF9JTkxJTkUyWChmbG9hdCxpbnQgKixmdW5jLGNmKSBcCisgICAgICBfU1RMUF9NQVRIX0lOTElORTIobG9uZyBkb3VibGUsaW50ICosZnVuYyxjZiMjbCkKKyMgICAgICBkZWZpbmUgX1NUTFBfREVGX01BVEhfSU5MSU5FMkkoZnVuYyxjZikgXAorICAgICAgX1NUTFBfTUFUSF9JTkxJTkUyWChmbG9hdCxpbnQsZnVuYyxjZikgXAorICAgICAgX1NUTFBfTUFUSF9JTkxJTkUyKGxvbmcgZG91YmxlLGludCxmdW5jLGNmIyNsKQorIyAgICBlbHNlCisjICAgICAgZGVmaW5lIF9TVExQX0RFRl9NQVRIX0lOTElORShmdW5jLGNmKSBcCisgICAgICBfU1RMUF9NQVRIX0lOTElORVgoZmxvYXQsZnVuYyxjZikgXAorICAgICAgX1NUTFBfTUFUSF9JTkxJTkVYKGxvbmcgZG91YmxlLGZ1bmMsY2YpCisjICAgICAgZGVmaW5lIF9TVExQX0RFRl9NQVRIX0lOTElORTIoZnVuYyxjZikgXAorICAgICAgX1NUTFBfTUFUSF9JTkxJTkUyWFgoZmxvYXQsZnVuYyxjZikgXAorICAgICAgX1NUTFBfTUFUSF9JTkxJTkUyWFgobG9uZyBkb3VibGUsZnVuYyxjZikKKyMgICAgICBkZWZpbmUgX1NUTFBfREVGX01BVEhfSU5MSU5FMlAoZnVuYyxjZikgXAorICAgICAgX1NUTFBfTUFUSF9JTkxJTkUyUFgoZmxvYXQsZnVuYyxjZikgXAorICAgICAgX1NUTFBfTUFUSF9JTkxJTkUyUFgobG9uZyBkb3VibGUsZnVuYyxjZikKKyMgICAgICBkZWZpbmUgX1NUTFBfREVGX01BVEhfSU5MSU5FMlBJKGZ1bmMsY2YpIFwKKyAgICAgIF9TVExQX01BVEhfSU5MSU5FMlgoZmxvYXQsaW50ICosZnVuYyxjZikgXAorICAgICAgX1NUTFBfTUFUSF9JTkxJTkUyWChsb25nIGRvdWJsZSxpbnQgKixmdW5jLGNmKQorIyAgICAgIGRlZmluZSBfU1RMUF9ERUZfTUFUSF9JTkxJTkUySShmdW5jLGNmKSBcCisgICAgICBfU1RMUF9NQVRIX0lOTElORTJYKGZsb2F0LGludCxmdW5jLGNmKSBcCisgICAgICBfU1RMUF9NQVRIX0lOTElORTJYKGxvbmcgZG91YmxlLGludCxmdW5jLGNmKQorIyAgICBlbmRpZgorIyAgZWxzZQorIyAgICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fVkVORE9SX01BVEhfRikKKyMgICAgICBkZWZpbmUgX1NUTFBfREVGX01BVEhfSU5MSU5FKGZ1bmMsY2YpIFwKKyAgICAgIF9TVExQX01BVEhfSU5MSU5FKGZsb2F0LGZ1bmMsY2YjI2YpCisjICAgICAgZGVmaW5lIF9TVExQX0RFRl9NQVRIX0lOTElORTIoZnVuYyxjZikgXAorICAgICAgX1NUTFBfTUFUSF9JTkxJTkUyKGZsb2F0LGZsb2F0LGZ1bmMsY2YjI2YpCisjICAgICAgZGVmaW5lIF9TVExQX0RFRl9NQVRIX0lOTElORTJQKGZ1bmMsY2YpIFwKKyAgICAgIF9TVExQX01BVEhfSU5MSU5FMihmbG9hdCxmbG9hdCAqLGZ1bmMsY2YjI2YpCisjICAgICAgZGVmaW5lIF9TVExQX0RFRl9NQVRIX0lOTElORTJQSShmdW5jLGNmKSBcCisgICAgICBfU1RMUF9NQVRIX0lOTElORTIoZmxvYXQsaW50ICosZnVuYyxjZiMjZikKKyMgICAgICBkZWZpbmUgX1NUTFBfREVGX01BVEhfSU5MSU5FMkkoZnVuYyxjZikgXAorICAgICAgX1NUTFBfTUFUSF9JTkxJTkUyKGZsb2F0LGludCxmdW5jLGNmIyNmKQorIyAgICBlbHNlIC8vIF9TVExQX05PX1ZFTkRPUl9NQVRIX0YKKyAgICAgICAvLyBuZWl0aGVyIGxvbmcgZG91YmxlIHN1cHBvcnQgbm9yIGUuZy4gc2luZihmbG9hdCkgZnVuY3Rpb25zCisjICAgICAgZGVmaW5lIF9TVExQX0RFRl9NQVRIX0lOTElORShmdW5jLGNmKSBcCisgICAgICBfU1RMUF9NQVRIX0lOTElORVgoZmxvYXQsZnVuYyxjZikKKyMgICAgICBkZWZpbmUgX1NUTFBfREVGX01BVEhfSU5MSU5FMihmdW5jLGNmKSBcCisgICAgICBfU1RMUF9NQVRIX0lOTElORTJYWChmbG9hdCxmdW5jLGNmKQorIyAgICAgIGRlZmluZSBfU1RMUF9ERUZfTUFUSF9JTkxJTkUyUChmdW5jLGNmKSBcCisgICAgICBfU1RMUF9NQVRIX0lOTElORTJQWChmbG9hdCxmdW5jLGNmKQorIyAgICAgIGRlZmluZSBfU1RMUF9ERUZfTUFUSF9JTkxJTkUyUEkoZnVuYyxjZikgXAorICAgICAgX1NUTFBfTUFUSF9JTkxJTkUyWChmbG9hdCxpbnQgKixmdW5jLGNmKQorIyAgICAgIGRlZmluZSBfU1RMUF9ERUZfTUFUSF9JTkxJTkUySShmdW5jLGNmKSBcCisgICAgICBfU1RMUF9NQVRIX0lOTElORTJYKGZsb2F0LGludCxmdW5jLGNmKQorIyAgICBlbmRpZiAvLyBfU1RMUF9OT19WRU5ET1JfTUFUSF9GCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9XQ0UpIHx8IFwKKyAgIChkZWZpbmVkKF9TVExQX01TVkMpICYmIChfU1RMUF9NU1ZDIDw9IDEzMDApICYmIGRlZmluZWQgKF9NU0NfRVhURU5TSU9OUykgLyogJiYgIWRlZmluZWQoX1NUTFBfV0NFX05FVCkgKi8pCisvKgorICogZHVtczogVkM2IGhhcyBhbGwgdGhlIHJlcXVpcmVkIEMrKyBmdW5jdGlvbnMgYnV0IG9ubHkgZGVmaW5lIHRoZW0gaWYKKyAqIF9NU0NfRVhURU5TSU9OUyBpcyBub3QgZGVmaW5lZCAoYSBidWc/KS4gU1RMcG9ydCBqdXN0IGRvIHRoZSBzYW1lCisgKiB0aGluZyBhbHNvIHdoZW4gX01TQ19FWFRFTlNJT05TIGlzIGRlZmluZWQuCisgKiBUT0RPOiBhYm92ZSBjaGVjayAoX1NUTFBfTVNWQyA8PSAxMzAwKSBhbHNvIGNhdGNoZXMgVkM3LjAsIGlzIHRoYXQgaW50ZW5kZWQ/CisgKi8KKy8vV2UgaGF2ZSB0byB0ZWxsIHRoZSBjb21waWxlcnMgdGhhdCBhYnMsIGFjb3MgLi4uIG1hdGggZnVuY3Rpb25zIGFyZSBub3QgaW50cmluc2ljCisvL290aGVyd2lzZSB3ZSBoYXZlIEludGVybmFsIENvbXBpbGVyIEVycm9yIGluIHJlbGVhc2UgbW9kZS4uLgorIyAgcHJhZ21hIHdhcm5pbmcocHVzaCkKKyMgIHByYWdtYSB3YXJuaW5nKGRpc2FibGU6IDQxNjIpIC8vIG5vIGZ1bmN0aW9uIHdpdGggQyBsaW5rYWdlIGZvdW5kCisjICBwcmFnbWEgd2FybmluZyhkaXNhYmxlOiA0MTYzKSAvLyBub3QgYXZhaWxhYmxlIGFzIGFuIGludHJpbnNpYyBmdW5jdGlvbgorIyAgcHJhZ21hIGZ1bmN0aW9uIChhYnMsIGFjb3MsIGFzaW4sIGF0YW4sIGF0YW4yLCBjb3MsIGNvc2gsIGV4cCwgZmFicywgZm1vZCwgbG9nLCBsb2cxMCwgc2luLCBzaW5oLCBzcXJ0LCB0YW4sIHRhbmgpCisjICBpZiBkZWZpbmVkIChfU1RMUF9XQ0UpCisjICAgIHByYWdtYSBmdW5jdGlvbiAoY2VpbCwgZmxvb3IpCisjICBlbmRpZgorIyAgZGVmaW5lIF9TVExQX1JFU1RPUkVfRlVOQ1RJT05fSU5UUklOU0lDCisjZW5kaWYgLy8gX1NUTFBfTVNWQyAmJiBfU1RMUF9NU1ZDIDw9IDEzMDAgJiYgIV9TVExQX1dDRSAmJiBfTVNDX0VYVEVOU0lPTlMKKworI2lmIChkZWZpbmVkIChfX0JPUkxBTkRDX18pIHx8IGRlZmluZWQgKF9fV0FUQ09NQ19fKSkgJiYgZGVmaW5lZCAoX1NUTFBfVVNFX05FV19DX0hFQURFUlMpCisvKiBJbiB0aGlzIGNvbmZpZyBCb3JsYW5kIG5hdGl2ZSBsaWIgb25seSBkZWZpbmUgZnVuY3Rpb25zIGluIHN0ZCBuYW1lc3BhY2UuCisgKiBJbiBvcmRlciB0byBoYXZlIGFsbCBvdmVybG9hZHMgaW4gU1RMcG9ydCBuYW1lc3BhY2Ugd2UgbmVlZCB0byBhZGQgdGhlCisgKiBkb3VibGUgb3ZlcmxvYWQgaW4gZ2xvYmFsIG5hbWVzcGFjZS4gV2UgZG8gbm90IHVzZSBhIHVzaW5nIHN0YXRlbWVudCB0byBhdm9pZAorICogaW1wb3J0IG9mIGludmFsaWQgb3ZlcmxvYWQuCisgKi8KKyMgIGRlZmluZSBfU1RMUF9ETUFUSF9JTkxJTkUoZnVuYykgX1NUTFBfTUFUSF9JTkxJTkUoZG91YmxlLCBmdW5jLCBmdW5jKQorIyAgZGVmaW5lIF9TVExQX0RNQVRIX0lOTElORTIoZnVuYykgX1NUTFBfTUFUSF9JTkxJTkUyKGRvdWJsZSwgZG91YmxlLCBmdW5jLCBmdW5jKQorCitfU1RMUF9ETUFUSF9JTkxJTkUoYWNvcykKK19TVExQX0RNQVRIX0lOTElORShhc2luKQorX1NUTFBfRE1BVEhfSU5MSU5FKGF0YW4pCitfU1RMUF9ETUFUSF9JTkxJTkUyKGF0YW4yKQorX1NUTFBfRE1BVEhfSU5MSU5FKGNlaWwpCitfU1RMUF9ETUFUSF9JTkxJTkUoY29zKQorX1NUTFBfRE1BVEhfSU5MSU5FKGNvc2gpCitfU1RMUF9ETUFUSF9JTkxJTkUoZXhwKQorX1NUTFBfRE1BVEhfSU5MSU5FKGZhYnMpCitfU1RMUF9ETUFUSF9JTkxJTkUoZmxvb3IpCitfU1RMUF9ETUFUSF9JTkxJTkUyKGZtb2QpCitfU1RMUF9NQVRIX0lOTElORTJYKGRvdWJsZSwgaW50KiwgZnJleHAsIGZyZXhwKQorX1NUTFBfTUFUSF9JTkxJTkUyWChkb3VibGUsIGludCwgbGRleHAsIGxkZXhwKQorX1NUTFBfRE1BVEhfSU5MSU5FKGxvZykKK19TVExQX0RNQVRIX0lOTElORShsb2cxMCkKK19TVExQX01BVEhfSU5MSU5FMlBYKGRvdWJsZSwgbW9kZiwgbW9kZikKK19TVExQX0RNQVRIX0lOTElORShzaW4pCitfU1RMUF9ETUFUSF9JTkxJTkUoc2luaCkKK19TVExQX0RNQVRIX0lOTElORShzcXJ0KQorX1NUTFBfRE1BVEhfSU5MSU5FKHRhbikKK19TVExQX0RNQVRIX0lOTElORSh0YW5oKQorX1NUTFBfRE1BVEhfSU5MSU5FMihwb3cpCitfU1RMUF9ETUFUSF9JTkxJTkUyKGh5cG90KQorCisjICB1bmRlZiBfU1RMUF9ETUFUSF9JTkxJTkUKKyMgIHVuZGVmIF9TVExQX0RNQVRIX0lOTElORTIKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19ETUNfXykKKyMgIGlmIGRlZmluZWQgKGZhYnMpCitpbmxpbmUgZG91YmxlIF9fc3RscF9mYWJzKGRvdWJsZSBfX3gpIHsgcmV0dXJuIGZhYnMoX194KTsgfQorIyAgICB1bmRlZiBmYWJzCitpbmxpbmUgZG91YmxlIGZhYnMoZG91YmxlIF9feCkgeyByZXR1cm4gX19zdGxwX2ZhYnMoX194KTsgfQorIyAgZW5kaWYKKyMgIGlmIGRlZmluZWQgKGNvcykKK2lubGluZSBkb3VibGUgX19zdGxwX2Nvcyhkb3VibGUgX194KSB7IHJldHVybiBjb3MoX194KTsgfQorIyAgICB1bmRlZiBjb3MKK2lubGluZSBkb3VibGUgY29zKGRvdWJsZSBfX3gpIHsgcmV0dXJuIF9fc3RscF9jb3MoX194KTsgfQorIyAgZW5kaWYKKyMgIGlmIGRlZmluZWQgKHNpbikKK2lubGluZSBkb3VibGUgX19zdGxwX3Npbihkb3VibGUgX194KSB7IHJldHVybiBzaW4oX194KTsgfQorIyAgICB1bmRlZiBzaW4KK2lubGluZSBkb3VibGUgc2luKGRvdWJsZSBfX3gpIHsgcmV0dXJuIF9fc3RscF9zaW4oX194KTsgfQorIyAgZW5kaWYKKyMgIGlmIGRlZmluZWQgKHNxcnQpCitpbmxpbmUgZG91YmxlIF9fc3RscF9zcXJ0KGRvdWJsZSBfX3gpIHsgcmV0dXJuIHNxcnQoX194KTsgfQorIyAgICB1bmRlZiBzcXJ0CitpbmxpbmUgZG91YmxlIHNxcnQoZG91YmxlIF9feCkgeyByZXR1cm4gX19zdGxwX3NxcnQoX194KTsgfQorIyAgZW5kaWYKKyMgIGlmIGRlZmluZWQgKGxkZXhwKQoraW5saW5lIGRvdWJsZSBfX3N0bHBfbGRleHAoZG91YmxlIF9feCwgaW50IF9feSkgeyByZXR1cm4gbGRleHAoX194LCBfX3kpOyB9CisjICAgIHVuZGVmIGxkZXhwCitpbmxpbmUgZG91YmxlIGxkZXhwKGRvdWJsZSBfX3gsIGludCBfX3kpIHsgcmV0dXJuIF9fc3RscF9sZGV4cChfX3gsIF9feSk7IH0KKyMgIGVuZGlmCisjZW5kaWYKKworLyogTVNWQyBuYXRpdmUgbGliIHN0YXJ0aW5nIHdpdGggLk5ldCAyMDAzIGhhcyBhbHJlYWR5IGFsbCBtYXRoIGZ1bmN0aW9ucworICogaW4gZ2xvYmFsIG5hbWVzcGFjZS4KKyAqIEhQLVVYIG5hdGl2ZSBsaWIgaGFzIG1hdGggZnVuY3Rpb25zIGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlLgorICovCisjaWYgKCFkZWZpbmVkIChfU1RMUF9NU1ZDX0xJQikgfHwgKF9TVExQX01TVkNfTElCIDwgMTMxMCkgfHwgZGVmaW5lZChVTkRFUl9DRSkpICYmIFwKKyAgICAoIWRlZmluZWQgKF9fSFBfYUNDKSB8fCAoX19IUF9hQ0MgPCAzMDAwMCkpICYmIFwKKyAgICAhZGVmaW5lZCAoX19XQVRDT01DX18pCitpbmxpbmUgZG91YmxlIGFicyhkb3VibGUgX194KQoreyByZXR1cm4gOjpmYWJzKF9feCk7IH0KKyMgIGlmICFkZWZpbmVkIChfX01WU19fKQorX1NUTFBfREVGX01BVEhfSU5MSU5FKGFicywgZmFicykKKyMgIGVsc2UgLy8gX19NVlNfXyBoYXMgbmF0aXZlIGxvbmcgZG91YmxlIGFicz8KK2lubGluZSBmbG9hdCBhYnMoZmxvYXQgX194KSB7IHJldHVybiA6OmZhYnNmKF9feCk7IH0KKyMgIGVuZGlmCisKK19TVExQX0RFRl9NQVRIX0lOTElORShhY29zLCBhY29zKQorX1NUTFBfREVGX01BVEhfSU5MSU5FKGFzaW4sIGFzaW4pCitfU1RMUF9ERUZfTUFUSF9JTkxJTkUoYXRhbiwgYXRhbikKK19TVExQX0RFRl9NQVRIX0lOTElORTIoYXRhbjIsIGF0YW4yKQorX1NUTFBfREVGX01BVEhfSU5MSU5FKGNlaWwsIGNlaWwpCitfU1RMUF9ERUZfTUFUSF9JTkxJTkUoY29zLCBjb3MpCitfU1RMUF9ERUZfTUFUSF9JTkxJTkUoY29zaCwgY29zaCkKK19TVExQX0RFRl9NQVRIX0lOTElORShleHAsIGV4cCkKK19TVExQX0RFRl9NQVRIX0lOTElORShmYWJzLCBmYWJzKQorX1NUTFBfREVGX01BVEhfSU5MSU5FKGZsb29yLCBmbG9vcikKK19TVExQX0RFRl9NQVRIX0lOTElORTIoZm1vZCwgZm1vZCkKK19TVExQX0RFRl9NQVRIX0lOTElORTJQSShmcmV4cCwgZnJleHApCitfU1RMUF9ERUZfTUFUSF9JTkxJTkUySShsZGV4cCwgbGRleHApCitfU1RMUF9ERUZfTUFUSF9JTkxJTkUobG9nLCBsb2cpCitfU1RMUF9ERUZfTUFUSF9JTkxJTkUobG9nMTAsIGxvZzEwKQorX1NUTFBfREVGX01BVEhfSU5MSU5FMlAobW9kZiwgbW9kZikKK19TVExQX0RFRl9NQVRIX0lOTElORShzaW4sIHNpbikKK19TVExQX0RFRl9NQVRIX0lOTElORShzaW5oLCBzaW5oKQorX1NUTFBfREVGX01BVEhfSU5MSU5FKHNxcnQsIHNxcnQpCitfU1RMUF9ERUZfTUFUSF9JTkxJTkUodGFuLCB0YW4pCitfU1RMUF9ERUZfTUFUSF9JTkxJTkUodGFuaCwgdGFuaCkKK19TVExQX0RFRl9NQVRIX0lOTElORTIocG93LCBwb3cpCisKKyMgIGlmICFkZWZpbmVkKF9TVExQX01TVkMpIC8qIHx8IChfU1RMUF9NU1ZDID4gMTMwMCkgKi8gfHwgZGVmaW5lZChfU1RMUF9XQ0UpIHx8ICFkZWZpbmVkIChfTVNDX0VYVEVOU0lPTlMpIC8qICYmICFkZWZpbmVkKF9TVExQX1dDRV9ORVQpICovCisjICAgIGlmbmRlZiBfU1RMUF9OT19WRU5ET1JfTUFUSF9GCisjICAgICAgaWZuZGVmIF9fc3VuCitpbmxpbmUgZmxvYXQgcG93KGZsb2F0IF9feCwgaW50IF9feSkgeyByZXR1cm4gX1NUTFBfQ01BVEhfRlVOQ19OQU1FU1BBQ0U6OnBvd2YoX194LCBfX1NUQVRJQ19DQVNUKGZsb2F0LF9feSkpOyB9CisjICAgICAgZWxzZQoraW5saW5lIGZsb2F0IHBvdyhmbG9hdCBfX3gsIGludCBfX3kpIHsgcmV0dXJuIDo6X19wb3dmKF9feCwgX19TVEFUSUNfQ0FTVChmbG9hdCxfX3kpKTsgfQorIyAgICAgIGVuZGlmCisjICAgIGVsc2UKK2lubGluZSBmbG9hdCBwb3coZmxvYXQgX194LCBpbnQgX195KSB7IHJldHVybiBfX1NUQVRJQ19DQVNUKGZsb2F0LCBfU1RMUF9DTUFUSF9GVU5DX05BTUVTUEFDRTo6cG93KF9feCwgX19TVEFUSUNfQ0FTVChmbG9hdCxfX3kpKSk7IH0KKyMgICAgZW5kaWYKK2lubGluZSBkb3VibGUgcG93KGRvdWJsZSBfX3gsIGludCBfX3kpIHsgcmV0dXJuIF9TVExQX0NNQVRIX0ZVTkNfTkFNRVNQQUNFOjpwb3coX194LCBfX1NUQVRJQ19DQVNUKGRvdWJsZSxfX3kpKTsgfQorIyAgICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTE9OR19ET1VCTEUpCisjICAgICAgaWYgIWRlZmluZWQoX1NUTFBfTk9fVkVORE9SX01BVEhfTCkKKyMgICAgICAgIGlmbmRlZiBfX3N1bgoraW5saW5lIGxvbmcgZG91YmxlIHBvdyhsb25nIGRvdWJsZSBfX3gsIGludCBfX3kpIHsgcmV0dXJuIF9TVExQX0NNQVRIX0ZVTkNfTkFNRVNQQUNFOjpwb3dsKF9feCwgX19TVEFUSUNfQ0FTVChsb25nIGRvdWJsZSxfX3kpKTsgfQorIyAgICAgICAgZWxzZQorIyAgICAgICAgICBpZm5kZWYgX19TVU5QUk9fQ0MKK2lubGluZSBsb25nIGRvdWJsZSBwb3cobG9uZyBkb3VibGUgX194LCBpbnQgX195KSB7IHJldHVybiA6Ol9fcG93bChfX3gsIF9fU1RBVElDX0NBU1QobG9uZyBkb3VibGUsX195KSk7IH0KKyMgICAgICAgICAgZWxzZQoraW5saW5lIGxvbmcgZG91YmxlIHBvdyhsb25nIGRvdWJsZSBfX3gsIGludCBfX3kpIHsgcmV0dXJuIF9TVExQX1ZFTkRPUl9DU1REOjpfX3Bvd2woX194LCBfX1NUQVRJQ19DQVNUKGxvbmcgZG91YmxlLF9feSkpOyB9CisjICAgICAgICAgIGVuZGlmCisjICAgICAgICBlbmRpZgorIyAgICAgIGVsc2UKK2lubGluZSBsb25nIGRvdWJsZSBwb3cobG9uZyBkb3VibGUgX194LCBpbnQgX195KSB7IHJldHVybiBfX1NUQVRJQ19DQVNUKGxvbmcgZG91YmxlLCBfU1RMUF9DTUFUSF9GVU5DX05BTUVTUEFDRTo6cG93KF9feCwgX19TVEFUSUNfQ0FTVChsb25nIGRvdWJsZSxfX3kpKSk7IH0KKyMgICAgICBlbmRpZgorIyAgICBlbmRpZgorIyAgZWxzZQorLy9UaGUgTVMgbmF0aXZlIHBvdyB2ZXJzaW9uIGhhcyBhIGJ1Z2dlZCBvdmVybG9hZCBzbyBpdCBpcyBub3QgaW1wb3J0ZWQKKy8vaW4gdGhlIFNUTHBvcnQgbmFtZXNwYWNlLgorLy9IZXJlIGlzIHRoZSBidWdnZWQgdmVyc2lvbjoKKy8vaW5saW5lIGRvdWJsZSBwb3coaW50IF9feCwgaW50IF9feSkgICAgICAgICAgICB7IHJldHVybiAoX1Bvd19pbnQoX194LCBfX3kpKTsgfQoraW5saW5lIGRvdWJsZSAgICAgIHBvdyhkb3VibGUgX194LCBpbnQgX195KSAgICAgIHsgcmV0dXJuIChfUG93X2ludChfX3gsIF9feSkpOyB9CitpbmxpbmUgZmxvYXQgICAgICAgcG93KGZsb2F0IF9feCwgaW50IF9feSkgICAgICAgeyByZXR1cm4gKF9Qb3dfaW50KF9feCwgX195KSk7IH0KK2lubGluZSBsb25nIGRvdWJsZSBwb3cobG9uZyBkb3VibGUgX194LCBpbnQgX195KSB7IHJldHVybiAoX1Bvd19pbnQoX194LCBfX3kpKTsgfQorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgKGRlZmluZWQgKF9TVExQX01TVkMpICYmICFkZWZpbmVkIChfU1RMUF9XQ0UpKSB8fCBkZWZpbmVkIChfX0lDTCkgfHwgZGVmaW5lZCAoX19zdW4pCisjICBpZiBkZWZpbmVkIChfU1RMUF9NU1ZDKSAmJiAoX1NUTFBfTVNWQyA+PSAxNDAwKQorIyAgICBwcmFnbWEgd2FybmluZyAocHVzaCkKKyMgICAgcHJhZ21hIHdhcm5pbmcgKGRpc2FibGUgOiA0OTk2KSAvLyBoeXBvdCBpcyBkZXByZWNhdGVkLgorIyAgZW5kaWYKK19TVExQX01BVEhfSU5MSU5FMlhYKGZsb2F0LCBoeXBvdCwgaHlwb3QpCitpbmxpbmUgbG9uZyBkb3VibGUgaHlwb3QobG9uZyBkb3VibGUgeCwgbG9uZyBkb3VibGUgeSkgeyByZXR1cm4gc3FydCh4ICogeCArIHkgKiB5KTsgfQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfTVNWQykgJiYgKF9TVExQX01TVkMgPj0gMTQwMCkKKyMgICAgcHJhZ21hIHdhcm5pbmcgKHBvcCkKKyMgIGVuZGlmCisjZWxzZQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1VDTElCQykKK2lubGluZSBkb3VibGUgaHlwb3QoZG91YmxlIHgsIGRvdWJsZSB5KSB7IHJldHVybiBzcXJ0KHggKiB4ICsgeSAqIHkpOyB9CitfU1RMUF9ERUZfTUFUSF9JTkxJTkUyKGh5cG90LCBoeXBvdCkKKyMgIGVsaWYgZGVmaW5lZCAoX1NUTFBfV0NFKQorICAgLyogQ0UgaGFzIGEgZG91YmxlIF9oeXBvdChkb3VibGUsZG91YmxlKSB3aGljaCB3ZSB1c2UgKi8KK2lubGluZSBkb3VibGUgaHlwb3QoZG91YmxlIF9feCwgZG91YmxlIF9feSkgeyByZXR1cm4gX2h5cG90KF9feCxfX3kpOyB9CitfU1RMUF9ERUZfTUFUSF9JTkxJTkUyKGh5cG90LCBfaHlwb3QpCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9SRVNUT1JFX0ZVTkNUSU9OX0lOVFJJTlNJQykKKy8vcmVzdG9yYXRpb24gb2YgdGhlIGRlZmF1bHQgaW50cmluc2ljIHN0YXR1cyBvZiB0aG9zZSBmdW5jdGlvbnM6CisjICBwcmFnbWEgaW50cmluc2ljIChhYnMsIGFjb3MsIGFzaW4sIGF0YW4sIGF0YW4yLCBjb3MsIGNvc2gsIGV4cCwgZmFicywgZm1vZCwgbG9nLCBsb2cxMCwgc2luLCBzaW5oLCBzcXJ0LCB0YW4sIHRhbmgpCisjICBpZiBkZWZpbmVkIChfU1RMUF9XQ0UpCisjICAgIHByYWdtYSBpbnRyaW5zaWMgKGNlaWwsIGZsb29yKQorIyAgZW5kaWYKKyMgIHByYWdtYSB3YXJuaW5nKHBvcCkKKyMgIHVuZGVmIF9TVExQX1JFU1RPUkVfRlVOQ1RJT05fSU5UUklOU0lDCisjZW5kaWYgLy8gX1NUTFBfTVNWQyAmJiBfU1RMUF9NU1ZDIDw9IDEzMDAgJiYgIV9TVExQX1dDRSAmJiBfTVNDX0VYVEVOU0lPTlMKKworLyogQysrIFN0YW5kYXJkIGlzIHVuY2xlYXIgYWJvdXQgc2V2ZXJhbCBjYWxsIHRvICd1c2luZyA6OmZ1bmMnIGlmIG5ldyBvdmVybG9hZHMKKyAqIG9mIDo6ZnVuYyBhcHBlYXJzIGJldHdlZW4gMiBzdWNjZXNzaXZlICd1c2luZycgY2FsbHMuIFRvIGF2b2lkIHRoaXMgcG90ZW50aWFsCisgKiBwcm9ibGVtIHdlIHByb3ZpZGUgYWxsIGFicyBvdmVybG9hZCBiZWZvcmUgdGhlICd1c2luZycgY2FsbC4KKyAqIEJld2FyZTogVGhpcyBoZWFkZXIgaW5jbHVzaW9uIGhhcyB0byBiZSBhZnRlciBhbGwgYWJzIG92ZXJsb2FkIG9mIHRoaXMgZmlsZS4KKyAqICAgICAgICAgVGhlIGZpcnN0ICd1c2luZyA6OmFicycgY2FsbCBpcyBnb2luZyB0byBiZSBpbiB0aGUgb3RoZXIgaGVhZGVyLgorICovCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NTVERMSUIKKyMgIGluY2x1ZGUgPHN0bC9fY3N0ZGxpYi5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9JTVBPUlRfVkVORE9SX0NTVEQpICYmICFkZWZpbmVkIChfU1RMUF9OT19DU1REX0ZVTkNUSU9OX0lNUE9SVFMpCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKK3VzaW5nIDo6YWJzOwordXNpbmcgOjphY29zOwordXNpbmcgOjphc2luOwordXNpbmcgOjphdGFuOwordXNpbmcgOjphdGFuMjsKK3VzaW5nIDo6Y2VpbDsKK3VzaW5nIDo6Y29zOwordXNpbmcgOjpjb3NoOwordXNpbmcgOjpleHA7Cit1c2luZyA6OmZhYnM7Cit1c2luZyA6OmZsb29yOwordXNpbmcgOjpmbW9kOwordXNpbmcgOjpmcmV4cDsKKy8qCisgICBCZWNhdXNlIG9mIHNvbWUgd2VpcmQgaW50ZXJhY3Rpb24gYmV0d2VlbiBTVExwb3J0IGhlYWRlcnMKKyAgIGFuZCBuYXRpdmUgSFAtVVggaGVhZGVycywgd2hlbiBjb21waWxlZCB3aXRoIF9TVExQX0RFQlVHCisgICBtYWNybyBkZWZpbmVkIHdpdGggYUMrKywgaHlwb3QoKSBpcyBub3QgZGVjbGFyZWQuCisgICBBdCBzb21lIHBvaW50IHdlJ2xsIG5lZWQgdG8gZ2V0IHRvIHRoZSBib3R0b20gbGluZSBvZgorICAgdGhpcyBwcm9ibGVtLgorKi8KKyNpZiAhKGRlZmluZWQoX19IUF9hQ0MpICYmIGRlZmluZWQoX1NUTFBfREVCVUcpKQordXNpbmcgOjpoeXBvdDsKKyNlbmRpZgordXNpbmcgOjpsZGV4cDsKK3VzaW5nIDo6bG9nOwordXNpbmcgOjpsb2cxMDsKK3VzaW5nIDo6bW9kZjsKK3VzaW5nIDo6cG93OwordXNpbmcgOjpzaW47Cit1c2luZyA6OnNpbmg7Cit1c2luZyA6OnNxcnQ7Cit1c2luZyA6OnRhbjsKK3VzaW5nIDo6dGFuaDsKK19TVExQX0VORF9OQU1FU1BBQ0UKKyMgIGlmIGRlZmluZWQgKF9fQk9STEFORENfXykgJiYgKF9fQk9STEFORENfXyA+PSAweDU2MCkgJiYgIWRlZmluZWQgKF9fbGludXhfXykKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpfZWN2dDsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpfZmN2dDsKKyMgIGVuZGlmCisjZW5kaWYKKworI2VuZGlmIC8qIF9TVExQX0lOVEVSTkFMX0NNQVRIICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9fY29kZWN2dC5oIGIvc3RscG9ydC9zdGwvX2NvZGVjdnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWI0MDhiCi0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvX2NvZGVjdnQuaApAQCAtMCwwICsxLDQ0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKy8vIFdBUk5JTkc6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIEMrKworLy8gc3RhbmRhcmQgbGlicmFyeSBoZWFkZXJzLiAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgdGhpcyBoZWFkZXIKKy8vIGZpbGUgZGlyZWN0bHkuCisKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DT0RFQ1ZUX0gKKyNkZWZpbmUgX1NUTFBfSU5URVJOQUxfQ09ERUNWVF9ICisKKyNpZm5kZWYgX1NUTFBfQ19MT0NBTEVfSAorIyAgaW5jbHVkZSA8c3RsL2NfbG9jYWxlLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9MT0NBTEVfSAorIyAgaW5jbHVkZSA8c3RsL19sb2NhbGUuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0FMR09CQVNFX0gKKyMgIGluY2x1ZGUgPHN0bC9fYWxnb2Jhc2UuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgY29kZWN2dF9iYXNlIHsKK3B1YmxpYzoKKyAgZW51bSByZXN1bHQge29rLCBwYXJ0aWFsLCBlcnJvciwgbm9jb252fTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfSW50ZXJuVCwgY2xhc3MgX0V4dGVyblQsIGNsYXNzIF9TdGF0ZVQ+CitjbGFzcyBjb2RlY3Z0IDogcHVibGljIGxvY2FsZTo6ZmFjZXQsIHB1YmxpYyBjb2RlY3Z0X2Jhc2UgeworcHVibGljOgorICB0eXBlZGVmIF9JbnRlcm5UIGludGVybl90eXBlOworICB0eXBlZGVmIF9FeHRlcm5UIGV4dGVybl90eXBlOworICB0eXBlZGVmIF9TdGF0ZVQgc3RhdGVfdHlwZTsKKworI2lmIGRlZmluZWQgKF9TVExQX01TVkMpICYmIChfU1RMUF9NU1ZDIDwgMTMwMCkKKyAgLyogRm9yIHRoZSBtb21lbnQgVkM2IGRvIG5vdCBzdXBwb3J0IHRoaXMgZmFjZXQgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgorICAgKiBiZWNhdXNlIG9mIHRoZSBzdGF0aWMgbG9jYWxlOjppZCBpbnN0YW5jZS4gV2hlbiBWQzYgc2VlIHRoaXMgZGVmaW5pdGlvbgorICAgKiBpdCBnb2VzIGNyYXN5IHdpdGggbG9jYWxlOjppZCBzdGF0aWMgaW5zdGFuY2VzIGFuZCBhbGwgdGhlIGhhc19mYWNldCB0ZXN0cworICAgKiB1bml0IHRlc3RzIGFyZSBmYWlsaW5nLgorICAgKi8KK307CisjZWxzZQorICBleHBsaWNpdCBjb2RlY3Z0KHNpemVfdCBfX3JlZnMgPSAwKSA6IGxvY2FsZTo6ZmFjZXQoX19yZWZzKSB7fQorCisgIHJlc3VsdCBvdXQoc3RhdGVfdHlwZSYgICAgICAgICAgX19zdGF0ZSwKKyAgICAgICAgICAgICBjb25zdCBpbnRlcm5fdHlwZSogICBfX2Zyb20sCisgICAgICAgICAgICAgY29uc3QgaW50ZXJuX3R5cGUqICAgX19mcm9tX2VuZCwKKyAgICAgICAgICAgICBjb25zdCBpbnRlcm5fdHlwZSomICBfX2Zyb21fbmV4dCwKKyAgICAgICAgICAgICBleHRlcm5fdHlwZSogICAgICAgICBfX3RvLAorICAgICAgICAgICAgIGV4dGVybl90eXBlKiAgICAgICAgIF9fdG9fbGltaXQsCisgICAgICAgICAgICAgZXh0ZXJuX3R5cGUqJiAgICAgICAgX190b19uZXh0KSBjb25zdCB7CisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoX19mcm9tIDw9IF9fZnJvbV9lbmQsIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVChfX3RvIDw9IF9fdG9fbGltaXQsIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKKyAgICByZXR1cm4gZG9fb3V0KF9fc3RhdGUsCisgICAgICAgICAgICAgICAgICBfX2Zyb20sIF9fZnJvbV9lbmQsIF9fZnJvbV9uZXh0LAorICAgICAgICAgICAgICAgICAgX190bywgICBfX3RvX2xpbWl0LCBfX3RvX25leHQpOworICB9CisKKyAgcmVzdWx0IHVuc2hpZnQoc3RhdGVfdHlwZSYgICAgX19zdGF0ZSwKKyAgICAgICAgICAgICAgICAgZXh0ZXJuX3R5cGUqICAgX190bywKKyAgICAgICAgICAgICAgICAgZXh0ZXJuX3R5cGUqICAgX190b19saW1pdCwKKyAgICAgICAgICAgICAgICAgZXh0ZXJuX3R5cGUqJiAgX190b19uZXh0KSBjb25zdCB7CisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoX190byA8PSBfX3RvX2xpbWl0LCBfU3RsTXNnX0lOVkFMSURfQVJHVU1FTlQpCisgICAgcmV0dXJuIGRvX3Vuc2hpZnQoX19zdGF0ZSwgX190bywgX190b19saW1pdCwgX190b19uZXh0KTsKKyAgfQorCisgIHJlc3VsdCBpbihzdGF0ZV90eXBlJiAgICAgICAgIF9fc3RhdGUsCisgICAgICAgICAgICBjb25zdCBleHRlcm5fdHlwZSogIF9fZnJvbSwKKyAgICAgICAgICAgIGNvbnN0IGV4dGVybl90eXBlKiAgX19mcm9tX2VuZCwKKyAgICAgICAgICAgIGNvbnN0IGV4dGVybl90eXBlKiYgX19mcm9tX25leHQsCisgICAgICAgICAgICBpbnRlcm5fdHlwZSogICAgICAgIF9fdG8sCisgICAgICAgICAgICBpbnRlcm5fdHlwZSogICAgICAgIF9fdG9fbGltaXQsCisgICAgICAgICAgICBpbnRlcm5fdHlwZSomICAgICAgIF9fdG9fbmV4dCkgY29uc3QgeworICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKF9fZnJvbSA8PSBfX2Zyb21fZW5kLCBfU3RsTXNnX0lOVkFMSURfQVJHVU1FTlQpCisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoX190byA8PSBfX3RvX2xpbWl0LCBfU3RsTXNnX0lOVkFMSURfQVJHVU1FTlQpCisgICAgcmV0dXJuIGRvX2luKF9fc3RhdGUsCisgICAgICAgICAgICAgICAgIF9fZnJvbSwgX19mcm9tX2VuZCwgX19mcm9tX25leHQsCisgICAgICAgICAgICAgICAgIF9fdG8sICBfX3RvX2xpbWl0LCBfX3RvX25leHQpOworICB9CisKKyAgaW50IGVuY29kaW5nKCkgY29uc3QgX1NUTFBfTk9USFJPVyB7IHJldHVybiBkb19lbmNvZGluZygpOyB9CisKKyAgYm9vbCBhbHdheXNfbm9jb252KCkgY29uc3QgX1NUTFBfTk9USFJPVyB7IHJldHVybiBkb19hbHdheXNfbm9jb252KCk7IH0KKworICBpbnQgbGVuZ3RoKHN0YXRlX3R5cGUmICBfX3N0YXRlLAorICAgICAgICAgICAgIGNvbnN0IGV4dGVybl90eXBlKiBfX2Zyb20sCisgICAgICAgICAgICAgY29uc3QgZXh0ZXJuX3R5cGUqIF9fZnJvbV9lbmQsCisgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgIF9fbWF4KSBjb25zdCB7CisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoX19mcm9tIDw9IF9fZnJvbV9lbmQsIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKKyAgICByZXR1cm4gZG9fbGVuZ3RoKF9fc3RhdGUsIF9fZnJvbSwgX19mcm9tX2VuZCwgX19tYXgpOworICB9CisKKyAgaW50IG1heF9sZW5ndGgoKSBjb25zdCBfU1RMUF9OT1RIUk9XIHsgcmV0dXJuIGRvX21heF9sZW5ndGgoKTsgfQorCisgIHN0YXRpYyBsb2NhbGU6OmlkIGlkOworCitwcm90ZWN0ZWQ6CisgIH5jb2RlY3Z0KCkge30KKworICB2aXJ0dWFsIHJlc3VsdCBkb19vdXQoc3RhdGVfdHlwZSYsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnRlcm5fdHlwZSogIF9fZnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludGVybl90eXBlKiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludGVybl90eXBlKiYgX19mcm9tX25leHQsCisgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5fdHlwZSogICAgICAgIF9fdG8sCisgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5fdHlwZSosCisgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5fdHlwZSomICAgICAgIF9fdG9fbmV4dCkgY29uc3QKKyAgeyBfX2Zyb21fbmV4dCA9IF9fZnJvbTsgX190b19uZXh0ICAgPSBfX3RvOyByZXR1cm4gbm9jb252OyB9CisKKyAgdmlydHVhbCByZXN1bHQgZG9faW4gKHN0YXRlX3R5cGUmLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXh0ZXJuX3R5cGUqICBfX2Zyb20sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleHRlcm5fdHlwZSosCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleHRlcm5fdHlwZSomIF9fZnJvbV9uZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuX3R5cGUqICAgICAgICBfX3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuX3R5cGUqLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuX3R5cGUqJiAgICAgICBfX3RvX25leHQpIGNvbnN0CisgIHsgX19mcm9tX25leHQgPSBfX2Zyb207IF9fdG9fbmV4dCA9IF9fdG87IHJldHVybiBub2NvbnY7IH0KKworICB2aXJ0dWFsIHJlc3VsdCBkb191bnNoaWZ0KHN0YXRlX3R5cGUmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybl90eXBlKiBfX3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybl90eXBlKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5fdHlwZSomIF9fdG9fbmV4dCkgY29uc3QKKyAgeyBfX3RvX25leHQgPSBfX3RvOyByZXR1cm4gbm9jb252OyB9CisKKyAgdmlydHVhbCBpbnQgZG9fZW5jb2RpbmcoKSBjb25zdCBfU1RMUF9OT1RIUk9XCisgIHsgcmV0dXJuIDE7IH0KKworICB2aXJ0dWFsIGJvb2wgZG9fYWx3YXlzX25vY29udigpIGNvbnN0IF9TVExQX05PVEhST1cKKyAgeyByZXR1cm4gdHJ1ZTsgfQorCisgIHZpcnR1YWwgaW50IGRvX2xlbmd0aChzdGF0ZV90eXBlJiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4dGVybl90eXBlKiBfX2Zyb20sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleHRlcm5fdHlwZSogX19lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgX19tYXgpIGNvbnN0CisgIHsgcmV0dXJuIChpbnQpKG1pbikgKCBfX1NUQVRJQ19DQVNUKHNpemVfdCwgKF9fZW5kIC0gX19mcm9tKSksIF9fbWF4KTsgfQorCisgIHZpcnR1YWwgaW50IGRvX21heF9sZW5ndGgoKSBjb25zdCBfU1RMUF9OT1RIUk9XCisgIHsgcmV0dXJuIDE7IH0KKworcHJpdmF0ZToKKyAgY29kZWN2dChjb25zdCBjb2RlY3Z0PGludGVybl90eXBlLCBleHRlcm5fdHlwZSwgc3RhdGVfdHlwZT4mKTsKKyAgY29kZWN2dDxpbnRlcm5fdHlwZSwgZXh0ZXJuX3R5cGUsIHN0YXRlX3R5cGU+JiBvcGVyYXRvciA9IChjb25zdCBjb2RlY3Z0PGludGVybl90eXBlLCBleHRlcm5fdHlwZSwgc3RhdGVfdHlwZT4mKTsKK307CisKKyMgIGlmIGRlZmluZWQgKF9TVExQX0VYUE9TRV9TVFJFQU1fSU1QTEVNRU5UQVRJT04pICYmICFkZWZpbmVkIChfU1RMUF9MSU5LX1RJTUVfSU5TVEFOVElBVElPTikKKyMgICAgaWYgIWRlZmluZWQgKF9fQk9STEFORENfXykgfHwgKF9fQk9STEFORENfXyA+PSAweDU5MCkKK3RlbXBsYXRlIDxjbGFzcyBfSW50ZXJuVCwgY2xhc3MgX0V4dGVyblQsIGNsYXNzIF9TdGF0ZVQ+Citsb2NhbGU6OmlkIGNvZGVjdnQ8X0ludGVyblQsIF9FeHRlcm5ULCBfU3RhdGVUPjo6aWQ7CisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfSW50ZXJuVCwgY2xhc3MgX0V4dGVyblQsIGNsYXNzIF9TdGF0ZVQ+CitjbGFzcyBjb2RlY3Z0X2J5bmFtZSA6IHB1YmxpYyBjb2RlY3Z0PF9JbnRlcm5ULCBfRXh0ZXJuVCwgX1N0YXRlVD4ge307CisKK19TVExQX1RFTVBMQVRFX05VTEwKK2NsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIGNvZGVjdnQ8Y2hhciwgY2hhciwgbWJzdGF0ZV90PgorICA6IHB1YmxpYyBsb2NhbGU6OmZhY2V0LCBwdWJsaWMgY29kZWN2dF9iYXNlIHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBjaGFyICAgICAgIGludGVybl90eXBlOworICB0eXBlZGVmIGNoYXIgICAgICAgZXh0ZXJuX3R5cGU7CisgIHR5cGVkZWYgbWJzdGF0ZV90ICBzdGF0ZV90eXBlOworCisgIGV4cGxpY2l0IGNvZGVjdnQoc2l6ZV90IF9fcmVmcyA9IDApIDogbG9jYWxlOjpmYWNldChfX3JlZnMpIHt9CisKKyAgcmVzdWx0IG91dChzdGF0ZV90eXBlJiAgIF9fc3RhdGUsCisgICAgICAgICAgICAgY29uc3QgY2hhciogIF9fZnJvbSwKKyAgICAgICAgICAgICBjb25zdCBjaGFyKiAgX19mcm9tX2VuZCwKKyAgICAgICAgICAgICBjb25zdCBjaGFyKiYgX19mcm9tX25leHQsCisgICAgICAgICAgICAgY2hhciogICAgICAgIF9fdG8sCisgICAgICAgICAgICAgY2hhciogICAgICAgIF9fdG9fbGltaXQsCisgICAgICAgICAgICAgY2hhciomICAgICAgIF9fdG9fbmV4dCkgY29uc3QgeworICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKF9fZnJvbSA8PSBfX2Zyb21fZW5kLCBfU3RsTXNnX0lOVkFMSURfQVJHVU1FTlQpCisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoX190byA8PSBfX3RvX2xpbWl0LCBfU3RsTXNnX0lOVkFMSURfQVJHVU1FTlQpCisgICAgcmV0dXJuIGRvX291dChfX3N0YXRlLAorICAgICAgICAgICAgICAgICAgX19mcm9tLCBfX2Zyb21fZW5kLCBfX2Zyb21fbmV4dCwKKyAgICAgICAgICAgICAgICAgIF9fdG8sICAgX190b19saW1pdCwgX190b19uZXh0KTsKKyAgfQorCisgIHJlc3VsdCB1bnNoaWZ0KHN0YXRlX3R5cGUmIF9fc3RhdGUsCisgICAgICAgICAgICAgICAgIGNoYXIqIF9fdG8sIGNoYXIqIF9fdG9fbGltaXQsIGNoYXIqJiBfX3RvX25leHQpIGNvbnN0IHsKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVChfX3RvIDw9IF9fdG9fbGltaXQsIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKKyAgICByZXR1cm4gZG9fdW5zaGlmdChfX3N0YXRlLCBfX3RvLCBfX3RvX2xpbWl0LCBfX3RvX25leHQpOworICB9CisKKyAgcmVzdWx0IGluKHN0YXRlX3R5cGUmICAgX19zdGF0ZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqICBfX2Zyb20sCisgICAgICAgICAgICBjb25zdCBjaGFyKiAgX19mcm9tX2VuZCwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqJiBfX2Zyb21fbmV4dCwKKyAgICAgICAgICAgIGNoYXIqICAgICAgICBfX3RvLAorICAgICAgICAgICAgY2hhciogICAgICAgIF9fdG9fbGltaXQsCisgICAgICAgICAgICBjaGFyKiYgICAgICAgX190b19uZXh0KSBjb25zdCB7CisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoX19mcm9tIDw9IF9fZnJvbV9lbmQsIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVChfX3RvIDw9IF9fdG9fbGltaXQsIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKKyAgICByZXR1cm4gZG9faW4oX19zdGF0ZSwKKyAgICAgICAgICAgICAgICAgX19mcm9tLCBfX2Zyb21fZW5kLCBfX2Zyb21fbmV4dCwKKyAgICAgICAgICAgICAgICAgX190bywgICBfX3RvX2xpbWl0LCBfX3RvX25leHQpOworICB9CisKKyAgaW50IGVuY29kaW5nKCkgY29uc3QgX1NUTFBfTk9USFJPVyB7IHJldHVybiBkb19lbmNvZGluZygpOyB9CisKKyAgYm9vbCBhbHdheXNfbm9jb252KCkgY29uc3QgX1NUTFBfTk9USFJPVyB7IHJldHVybiBkb19hbHdheXNfbm9jb252KCk7IH0KKworICBpbnQgbGVuZ3RoKHN0YXRlX3R5cGUmIF9fc3RhdGUsCisgICAgICAgICAgICAgY29uc3QgY2hhciogX19mcm9tLCBjb25zdCBjaGFyKiBfX2Zyb21fZW5kLAorICAgICAgICAgICAgIHNpemVfdCBfX21heCkgY29uc3QgeworICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKF9fZnJvbSA8PSBfX2Zyb21fZW5kLCBfU3RsTXNnX0lOVkFMSURfQVJHVU1FTlQpCisgICAgcmV0dXJuIGRvX2xlbmd0aChfX3N0YXRlLCBfX2Zyb20sIF9fZnJvbV9lbmQsIF9fbWF4KTsKKyAgfQorCisgIGludCBtYXhfbGVuZ3RoKCkgY29uc3QgX1NUTFBfTk9USFJPVyB7IHJldHVybiBkb19tYXhfbGVuZ3RoKCk7IH0KKworICBzdGF0aWMgX1NUTFBfU1RBVElDX0RFQ0xTUEVDIGxvY2FsZTo6aWQgaWQ7CisKK3Byb3RlY3RlZDoKKyAgfmNvZGVjdnQoKTsKKworICB2aXJ0dWFsIHJlc3VsdCBkb19vdXQoc3RhdGVfdHlwZSYgICAvKiBfX3N0YXRlICovLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIF9fZnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAvKiBfX2Zyb21fZW5kICovLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciomIF9fZnJvbV9uZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogICAgICAgIF9fdG8sCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiAgICAgICAgLyogX190b19saW1pdCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqJiAgICAgICBfX3RvX25leHQpIGNvbnN0OworCisgIHZpcnR1YWwgcmVzdWx0IGRvX2luIChzdGF0ZV90eXBlJiAgIC8qIF9fc3RhdGUgKi8gLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIF9fZnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAvKiBfX2Zyb21fZW5kICovLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciomIF9fZnJvbV9uZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogICAgICAgIF9fdG8sCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiAgICAgICAgLyogX190b19lbmQgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiYgICAgICAgX190b19uZXh0KSBjb25zdDsKKworICB2aXJ0dWFsIHJlc3VsdCBkb191bnNoaWZ0KHN0YXRlX3R5cGUmIC8qIF9fc3RhdGUgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogICAgICBfX3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqICAgICAgLyogX190b19saW1pdCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiYgICAgIF9fdG9fbmV4dCkgY29uc3Q7CisKKyAgdmlydHVhbCBpbnQgZG9fZW5jb2RpbmcoKSBjb25zdCBfU1RMUF9OT1RIUk9XOworICB2aXJ0dWFsIGJvb2wgZG9fYWx3YXlzX25vY29udigpIGNvbnN0IF9TVExQX05PVEhST1c7CisgIHZpcnR1YWwgaW50IGRvX2xlbmd0aChzdGF0ZV90eXBlJiAgX19zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICBjaGFyKiBfX2Zyb20sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgY2hhciogX19lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgX19tYXgpIGNvbnN0OworICB2aXJ0dWFsIGludCBkb19tYXhfbGVuZ3RoKCkgY29uc3QgX1NUTFBfTk9USFJPVzsKK3ByaXZhdGU6CisgIGNvZGVjdnQoY29uc3QgY29kZWN2dDxjaGFyLCBjaGFyLCBtYnN0YXRlX3Q+Jik7CisgIGNvZGVjdnQ8Y2hhciwgY2hhciwgbWJzdGF0ZV90PiYgb3BlcmF0b3IgPShjb25zdCBjb2RlY3Z0PGNoYXIsIGNoYXIsIG1ic3RhdGVfdD4mKTsKK307CisKKyMgaWZuZGVmIF9TVExQX05PX1dDSEFSX1QKKworX1NUTFBfVEVNUExBVEVfTlVMTAorY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgY29kZWN2dDx3Y2hhcl90LCBjaGFyLCBtYnN0YXRlX3Q+CisgIDogcHVibGljIGxvY2FsZTo6ZmFjZXQsIHB1YmxpYyBjb2RlY3Z0X2Jhc2UgeworcHVibGljOgorICB0eXBlZGVmIHdjaGFyX3QgICAgaW50ZXJuX3R5cGU7CisgIHR5cGVkZWYgY2hhciAgICAgICBleHRlcm5fdHlwZTsKKyAgdHlwZWRlZiBtYnN0YXRlX3QgIHN0YXRlX3R5cGU7CisKKyAgZXhwbGljaXQgY29kZWN2dChzaXplX3QgX19yZWZzID0gMCkgOiBsb2NhbGU6OmZhY2V0KF9fcmVmcykge30KKworICByZXN1bHQgb3V0KHN0YXRlX3R5cGUmICAgICAgX19zdGF0ZSwKKyAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiAgX19mcm9tLAorICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqICBfX2Zyb21fZW5kLAorICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqJiBfX2Zyb21fbmV4dCwKKyAgICAgICAgICAgICBjaGFyKiAgICAgICAgICAgX190bywKKyAgICAgICAgICAgICBjaGFyKiAgICAgICAgICAgX190b19saW1pdCwKKyAgICAgICAgICAgICBjaGFyKiYgICAgICAgICAgX190b19uZXh0KSBjb25zdCB7CisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoX19mcm9tIDw9IF9fZnJvbV9lbmQsIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVChfX3RvIDw9IF9fdG9fbGltaXQsIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKKyAgICByZXR1cm4gZG9fb3V0KF9fc3RhdGUsCisgICAgICAgICAgICAgICAgICBfX2Zyb20sIF9fZnJvbV9lbmQsIF9fZnJvbV9uZXh0LAorICAgICAgICAgICAgICAgICAgX190bywgICBfX3RvX2xpbWl0LCBfX3RvX25leHQpOworICB9CisKKyAgcmVzdWx0IHVuc2hpZnQoc3RhdGVfdHlwZSYgX19zdGF0ZSwKKyAgICAgICAgICAgICAgICAgY2hhciogIF9fdG8sIGNoYXIqICBfX3RvX2xpbWl0LCBjaGFyKiYgX190b19uZXh0KSBjb25zdCB7CisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoX190byA8PSBfX3RvX2xpbWl0LCBfU3RsTXNnX0lOVkFMSURfQVJHVU1FTlQpCisgICAgcmV0dXJuIGRvX3Vuc2hpZnQoX19zdGF0ZSwgX190bywgX190b19saW1pdCwgX190b19uZXh0KTsKKyAgfQorCisgIHJlc3VsdCBpbihzdGF0ZV90eXBlJiAgIF9fc3RhdGUsCisgICAgICAgICAgICBjb25zdCBjaGFyKiAgX19mcm9tLAorICAgICAgICAgICAgY29uc3QgY2hhciogIF9fZnJvbV9lbmQsCisgICAgICAgICAgICBjb25zdCBjaGFyKiYgX19mcm9tX25leHQsCisgICAgICAgICAgICB3Y2hhcl90KiAgICAgX190bywKKyAgICAgICAgICAgIHdjaGFyX3QqICAgICBfX3RvX2xpbWl0LAorICAgICAgICAgICAgd2NoYXJfdComICAgIF9fdG9fbmV4dCkgY29uc3QgeworICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKF9fZnJvbSA8PSBfX2Zyb21fZW5kLCBfU3RsTXNnX0lOVkFMSURfQVJHVU1FTlQpCisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoX190byA8PSBfX3RvX2xpbWl0LCBfU3RsTXNnX0lOVkFMSURfQVJHVU1FTlQpCisgICAgcmV0dXJuIGRvX2luKF9fc3RhdGUsCisgICAgICAgICAgICAgICAgIF9fZnJvbSwgX19mcm9tX2VuZCwgX19mcm9tX25leHQsCisgICAgICAgICAgICAgICAgIF9fdG8sICAgX190b19saW1pdCwgX190b19uZXh0KTsKKyAgfQorCisgIGludCBlbmNvZGluZygpIGNvbnN0IF9TVExQX05PVEhST1cgeyByZXR1cm4gZG9fZW5jb2RpbmcoKTsgfQorCisgIGJvb2wgYWx3YXlzX25vY29udigpIGNvbnN0IF9TVExQX05PVEhST1cgeyByZXR1cm4gZG9fYWx3YXlzX25vY29udigpOyB9CisKKyAgaW50IGxlbmd0aChzdGF0ZV90eXBlJiBfX3N0YXRlLAorICAgICAgICAgICAgIGNvbnN0IGNoYXIqIF9fZnJvbSwgY29uc3QgY2hhciogX19mcm9tX2VuZCwKKyAgICAgICAgICAgICBzaXplX3QgX19tYXgpIGNvbnN0IHsKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVChfX2Zyb20gPD0gX19mcm9tX2VuZCwgX1N0bE1zZ19JTlZBTElEX0FSR1VNRU5UKQorICAgIHJldHVybiBkb19sZW5ndGgoX19zdGF0ZSwgX19mcm9tLCBfX2Zyb21fZW5kLCBfX21heCk7CisgIH0KKworICBpbnQgbWF4X2xlbmd0aCgpIGNvbnN0IF9TVExQX05PVEhST1cgeyByZXR1cm4gZG9fbWF4X2xlbmd0aCgpOyB9CisKKyAgc3RhdGljIF9TVExQX1NUQVRJQ19ERUNMU1BFQyBsb2NhbGU6OmlkIGlkOworCitwcm90ZWN0ZWQ6CisgIH5jb2RlY3Z0KCk7CisKKyAgdmlydHVhbCByZXN1bHQgZG9fb3V0KHN0YXRlX3R5cGUmICAgICAgICAgX19zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqICBfX2Zyb20sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiAgX19mcm9tX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqJiBfX2Zyb21fbmV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqICAgICAgICBfX3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogICAgICAgIF9fdG9fbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiYgICAgICAgX190b19uZXh0KSBjb25zdDsKKworICB2aXJ0dWFsIHJlc3VsdCBkb19pbiAoc3RhdGVfdHlwZSYgICAgICAgICBfX3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIF9fZnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBfX2Zyb21fZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciomIF9fZnJvbV9uZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgd2NoYXJfdCogICAgICAgIF9fdG8sCisgICAgICAgICAgICAgICAgICAgICAgICB3Y2hhcl90KiAgICAgICAgX190b19saW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHdjaGFyX3QqJiAgICAgICBfX3RvX25leHQpIGNvbnN0OworCisgIHZpcnR1YWwgcmVzdWx0IGRvX3Vuc2hpZnQoc3RhdGVfdHlwZSYgICBfX3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqICBfX3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqICBfX3RvX2xpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqJiBfX3RvX25leHQpIGNvbnN0OworCisgIHZpcnR1YWwgaW50IGRvX2VuY29kaW5nKCkgY29uc3QgX1NUTFBfTk9USFJPVzsKKworICB2aXJ0dWFsIGJvb2wgZG9fYWx3YXlzX25vY29udigpIGNvbnN0IF9TVExQX05PVEhST1c7CisKKyAgdmlydHVhbCBpbnQgZG9fbGVuZ3RoKHN0YXRlX3R5cGUmICBfX3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgIGNoYXIqIF9fZnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICBjaGFyKiBfX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBfX21heCkgY29uc3Q7CisKKyAgdmlydHVhbCBpbnQgZG9fbWF4X2xlbmd0aCgpIGNvbnN0IF9TVExQX05PVEhST1c7CisKK3ByaXZhdGU6CisgIGNvZGVjdnQoY29uc3QgY29kZWN2dDx3Y2hhcl90LCBjaGFyLCBtYnN0YXRlX3Q+Jik7CisgIGNvZGVjdnQ8d2NoYXJfdCwgY2hhciwgbWJzdGF0ZV90PiYgb3BlcmF0b3IgPSAoY29uc3QgY29kZWN2dDx3Y2hhcl90LCBjaGFyLCBtYnN0YXRlX3Q+Jik7Cit9OworCisjIGVuZGlmCisKK19TVExQX1RFTVBMQVRFX05VTEwKK2NsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIGNvZGVjdnRfYnluYW1lPGNoYXIsIGNoYXIsIG1ic3RhdGVfdD4KKyAgOiBwdWJsaWMgY29kZWN2dDxjaGFyLCBjaGFyLCBtYnN0YXRlX3Q+IHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgY29kZWN2dF9ieW5hbWUoY29uc3QgY2hhciogX19uYW1lLCBzaXplX3QgX19yZWZzID0gMCk7CisgIH5jb2RlY3Z0X2J5bmFtZSgpOworcHJpdmF0ZToKKyAgY29kZWN2dF9ieW5hbWUoY29uc3QgY29kZWN2dF9ieW5hbWU8Y2hhciwgY2hhciwgbWJzdGF0ZV90PiYpOworICBjb2RlY3Z0X2J5bmFtZTxjaGFyLCBjaGFyLCBtYnN0YXRlX3Q+JiBvcGVyYXRvciA9KGNvbnN0IGNvZGVjdnRfYnluYW1lPGNoYXIsIGNoYXIsIG1ic3RhdGVfdD4mKTsKK307CisKKyMgaWZuZGVmIF9TVExQX05PX1dDSEFSX1QKK19TVExQX1RFTVBMQVRFX05VTEwKK2NsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIGNvZGVjdnRfYnluYW1lPHdjaGFyX3QsIGNoYXIsIG1ic3RhdGVfdD4KKyAgOiBwdWJsaWMgY29kZWN2dDx3Y2hhcl90LCBjaGFyLCBtYnN0YXRlX3Q+IHsKKyAgZnJpZW5kIGNsYXNzIF9Mb2NhbGVfaW1wbDsKK3B1YmxpYzoKKyAgZXhwbGljaXQgY29kZWN2dF9ieW5hbWUoY29uc3QgY2hhciAqIF9fbmFtZSwgc2l6ZV90IF9fcmVmcyA9IDApOworCitwcm90ZWN0ZWQ6CisgIH5jb2RlY3Z0X2J5bmFtZSgpOworCisgIHZpcnR1YWwgcmVzdWx0IGRvX291dChzdGF0ZV90eXBlJiAgICAgICAgIF9fc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiAgX19mcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogIF9fZnJvbV9lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiYgX19mcm9tX25leHQsCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiAgICAgICAgX190bywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqICAgICAgICBfX3RvX2xpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhciomICAgICAgIF9fdG9fbmV4dCkgY29uc3Q7CisKKyAgdmlydHVhbCByZXN1bHQgZG9faW4gKHN0YXRlX3R5cGUmICAgICAgICAgX19zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBfX2Zyb20sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgX19mcm9tX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqJiBfX2Zyb21fbmV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHdjaGFyX3QqICAgICAgICBfX3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgd2NoYXJfdCogICAgICAgIF9fdG9fbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICB3Y2hhcl90KiYgICAgICAgX190b19uZXh0KSBjb25zdDsKKworICB2aXJ0dWFsIHJlc3VsdCBkb191bnNoaWZ0KHN0YXRlX3R5cGUmICAgX19zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiAgX190bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiAgX190b19saW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiYgX190b19uZXh0KSBjb25zdDsKKworICB2aXJ0dWFsIGludCBkb19lbmNvZGluZygpIGNvbnN0IF9TVExQX05PVEhST1c7CisKKyAgdmlydHVhbCBib29sIGRvX2Fsd2F5c19ub2NvbnYoKSBjb25zdCBfU1RMUF9OT1RIUk9XOworCisgIHZpcnR1YWwgaW50IGRvX2xlbmd0aChzdGF0ZV90eXBlJiAgX19zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICBjaGFyKiBfX2Zyb20sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgY2hhciogX19lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgX19tYXgpIGNvbnN0OworCisgIHZpcnR1YWwgaW50IGRvX21heF9sZW5ndGgoKSBjb25zdCBfU1RMUF9OT1RIUk9XOworCitwcml2YXRlOgorICBjb2RlY3Z0X2J5bmFtZShfTG9jYWxlX2NvZGVjdnQqIF9fY3Z0KQorICAgIDogX01fY29kZWN2dChfX2N2dCkge30KKworICBjb2RlY3Z0X2J5bmFtZShjb25zdCBjb2RlY3Z0X2J5bmFtZTx3Y2hhcl90LCBjaGFyLCBtYnN0YXRlX3Q+Jik7CisgIGNvZGVjdnRfYnluYW1lPHdjaGFyX3QsIGNoYXIsIG1ic3RhdGVfdD4mIG9wZXJhdG9yID0oY29uc3QgY29kZWN2dF9ieW5hbWU8d2NoYXJfdCwgY2hhciwgbWJzdGF0ZV90PiYpOworICBfTG9jYWxlX2NvZGVjdnQqIF9NX2NvZGVjdnQ7Cit9OworCisjIGVuZGlmCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2VuZGlmIC8qIF9TVExQX0lOVEVSTkFMX0NPREVDVlRfSCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgorCmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9fY29sbGF0ZS5oIGIvc3RscG9ydC9zdGwvX2NvbGxhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mzg0ZjJlCi0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvX2NvbGxhdGUuaApAQCAtMCwwICsxLDE3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKy8vIFdBUk5JTkc6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIEMrKworLy8gc3RhbmRhcmQgbGlicmFyeSBoZWFkZXJzLiAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgdGhpcyBoZWFkZXIKKy8vIGZpbGUgZGlyZWN0bHkuCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ09MTEFURV9ICisjZGVmaW5lIF9TVExQX0lOVEVSTkFMX0NPTExBVEVfSAorCisjaWZuZGVmIF9TVExQX0NfTE9DQUxFX0gKKyMgaW5jbHVkZSA8c3RsL2NfbG9jYWxlLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9MT0NBTEVfSAorIyBpbmNsdWRlIDxzdGwvX2xvY2FsZS5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfU1RSSU5HX0gKKyMgaW5jbHVkZSA8c3RsL19zdHJpbmcuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4gY2xhc3MgY29sbGF0ZSB7fTsKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+IGNsYXNzIGNvbGxhdGVfYnluYW1lIHt9OworCitfU1RMUF9URU1QTEFURV9OVUxMCitjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBjb2xsYXRlPGNoYXI+IDogcHVibGljIGxvY2FsZTo6ZmFjZXQgeworcHVibGljOgorICB0eXBlZGVmIGNoYXIgICBjaGFyX3R5cGU7CisgIHR5cGVkZWYgc3RyaW5nIHN0cmluZ190eXBlOworCisgIGV4cGxpY2l0IGNvbGxhdGUoc2l6ZV90IF9fcmVmcyA9IDApIDogbG9jYWxlOjpmYWNldChfX3JlZnMpIHt9CisKKyAgaW50IGNvbXBhcmUoY29uc3QgY2hhciogX19sb3cxLCBjb25zdCBjaGFyKiBfX2hpZ2gxLAorICAgICAgICAgICAgICBjb25zdCBjaGFyKiBfX2xvdzIsIGNvbnN0IGNoYXIqIF9faGlnaDIpIGNvbnN0IHsKKyAgICByZXR1cm4gZG9fY29tcGFyZSggX19sb3cxLCBfX2hpZ2gxLCBfX2xvdzIsIF9faGlnaDIpOworICB9CisKKyAgc3RyaW5nX3R5cGUgdHJhbnNmb3JtKGNvbnN0IGNoYXIqIF9fbG93LCBjb25zdCBjaGFyKiBfX2hpZ2gpIGNvbnN0IHsKKyAgICByZXR1cm4gZG9fdHJhbnNmb3JtKF9fbG93LCBfX2hpZ2gpOworICB9CisKKyAgbG9uZyBoYXNoKGNvbnN0IGNoYXIqIF9fbG93LCBjb25zdCBjaGFyKiBfX2hpZ2gpIGNvbnN0CisgICAgeyByZXR1cm4gZG9faGFzaChfX2xvdywgX19oaWdoKTsgfQorCisgIHN0YXRpYyBfU1RMUF9TVEFUSUNfREVDTFNQRUMgbG9jYWxlOjppZCBpZDsKKworcHJvdGVjdGVkOgorICB+Y29sbGF0ZSgpOworCisgIHZpcnR1YWwgaW50IGRvX2NvbXBhcmUoY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKikgY29uc3Q7CisgIHZpcnR1YWwgc3RyaW5nX3R5cGUgZG9fdHJhbnNmb3JtKGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKikgY29uc3Q7CisgIHZpcnR1YWwgbG9uZyBkb19oYXNoKGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKikgY29uc3Q7Citwcml2YXRlOgorICBjb2xsYXRlKGNvbnN0IGNvbGxhdGU8Y2hhcj4mKTsKKyAgY29sbGF0ZTxjaGFyPiYgb3BlcmF0b3IgPShjb25zdCBjb2xsYXRlPGNoYXI+Jik7Cit9OworCisjIGlmbmRlZiBfU1RMUF9OT19XQ0hBUl9UCisKK19TVExQX1RFTVBMQVRFX05VTEwKK2NsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIGNvbGxhdGU8d2NoYXJfdD4gOiBwdWJsaWMgbG9jYWxlOjpmYWNldCB7CitwdWJsaWM6CisgIHR5cGVkZWYgd2NoYXJfdCBjaGFyX3R5cGU7CisgIHR5cGVkZWYgd3N0cmluZyBzdHJpbmdfdHlwZTsKKworICBleHBsaWNpdCBjb2xsYXRlKHNpemVfdCBfX3JlZnMgPSAwKSA6IGxvY2FsZTo6ZmFjZXQoX19yZWZzKSB7fQorCisgIGludCBjb21wYXJlKGNvbnN0IHdjaGFyX3QqIF9fbG93MSwgY29uc3Qgd2NoYXJfdCogX19oaWdoMSwKKyAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogX19sb3cyLCBjb25zdCB3Y2hhcl90KiBfX2hpZ2gyKSBjb25zdCB7CisgICAgcmV0dXJuIGRvX2NvbXBhcmUoIF9fbG93MSwgX19oaWdoMSwgX19sb3cyLCBfX2hpZ2gyKTsKKyAgfQorCisgIHN0cmluZ190eXBlIHRyYW5zZm9ybShjb25zdCB3Y2hhcl90KiBfX2xvdywgY29uc3Qgd2NoYXJfdCogX19oaWdoKSBjb25zdCB7CisgICAgcmV0dXJuIGRvX3RyYW5zZm9ybShfX2xvdywgX19oaWdoKTsKKyAgfQorCisgIGxvbmcgaGFzaChjb25zdCB3Y2hhcl90KiBfX2xvdywgY29uc3Qgd2NoYXJfdCogX19oaWdoKSBjb25zdAorICAgIHsgcmV0dXJuIGRvX2hhc2goX19sb3csIF9faGlnaCk7IH0KKworICBzdGF0aWMgX1NUTFBfU1RBVElDX0RFQ0xTUEVDIGxvY2FsZTo6aWQgaWQ7CisKK3Byb3RlY3RlZDoKKyAgfmNvbGxhdGUoKTsKKworICB2aXJ0dWFsIGludCBkb19jb21wYXJlKGNvbnN0IHdjaGFyX3QqLCBjb25zdCB3Y2hhcl90KiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiwgY29uc3Qgd2NoYXJfdCopIGNvbnN0OworICB2aXJ0dWFsIHN0cmluZ190eXBlIGRvX3RyYW5zZm9ybShjb25zdCB3Y2hhcl90KiwgY29uc3Qgd2NoYXJfdCopIGNvbnN0OworICB2aXJ0dWFsIGxvbmcgZG9faGFzaChjb25zdCB3Y2hhcl90KiBfX2xvdywgY29uc3Qgd2NoYXJfdCogX19oaWdoKSBjb25zdDsKK3ByaXZhdGU6CisgIGNvbGxhdGUoY29uc3QgY29sbGF0ZTx3Y2hhcl90PiYpOworICBjb2xsYXRlPHdjaGFyX3Q+JiBvcGVyYXRvciA9IChjb25zdCBjb2xsYXRlPHdjaGFyX3Q+Jik7Cit9OworCisjIGVuZGlmIC8qIE5PX1dDSEFSX1QgKi8KKworX1NUTFBfVEVNUExBVEVfTlVMTAorY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgY29sbGF0ZV9ieW5hbWU8Y2hhcj46IHB1YmxpYyBjb2xsYXRlPGNoYXI+IHsKKyAgZnJpZW5kIGNsYXNzIF9Mb2NhbGVfaW1wbDsKK3B1YmxpYzoKKyAgZXhwbGljaXQgY29sbGF0ZV9ieW5hbWUoY29uc3QgY2hhciogX19uYW1lLCBzaXplX3QgX19yZWZzID0gMCk7CisKK3Byb3RlY3RlZDoKKyAgfmNvbGxhdGVfYnluYW1lKCk7CisKKyAgdmlydHVhbCBpbnQgZG9fY29tcGFyZShjb25zdCBjaGFyKiwgY29uc3QgY2hhciosCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKSBjb25zdDsKKyAgdmlydHVhbCBzdHJpbmdfdHlwZSBkb190cmFuc2Zvcm0oY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKSBjb25zdDsKKworcHJpdmF0ZToKKyAgY29sbGF0ZV9ieW5hbWUoX0xvY2FsZV9jb2xsYXRlICpfX2NvbGwpCisgICAgOiBfTV9jb2xsYXRlKF9fY29sbCkge30KKyAgX0xvY2FsZV9jb2xsYXRlKiBfTV9jb2xsYXRlOworICBjb2xsYXRlX2J5bmFtZShjb25zdCBjb2xsYXRlX2J5bmFtZTxjaGFyPiYpOworICBjb2xsYXRlX2J5bmFtZTxjaGFyPiYgb3BlcmF0b3IgPShjb25zdCBjb2xsYXRlX2J5bmFtZTxjaGFyPiYpOworfTsKKworIyBpZm5kZWYgX1NUTFBfTk9fV0NIQVJfVAorCitfU1RMUF9URU1QTEFURV9OVUxMCitjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBjb2xsYXRlX2J5bmFtZTx3Y2hhcl90PjogcHVibGljIGNvbGxhdGU8d2NoYXJfdD4geworICBmcmllbmQgY2xhc3MgX0xvY2FsZV9pbXBsOworcHVibGljOgorICBleHBsaWNpdCBjb2xsYXRlX2J5bmFtZShjb25zdCBjaGFyICogX19uYW1lLCBzaXplX3QgX19yZWZzID0gMCk7CisKK3Byb3RlY3RlZDoKKyAgfmNvbGxhdGVfYnluYW1lKCk7CisKKyAgdmlydHVhbCBpbnQgZG9fY29tcGFyZShjb25zdCB3Y2hhcl90KiwgY29uc3Qgd2NoYXJfdCosCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCosIGNvbnN0IHdjaGFyX3QqKSBjb25zdDsKKyAgdmlydHVhbCBzdHJpbmdfdHlwZSBkb190cmFuc2Zvcm0oY29uc3Qgd2NoYXJfdCosIGNvbnN0IHdjaGFyX3QqKSBjb25zdDsKKworcHJpdmF0ZToKKyAgY29sbGF0ZV9ieW5hbWUoX0xvY2FsZV9jb2xsYXRlICpfX2NvbGwpCisgICAgOiBfTV9jb2xsYXRlKF9fY29sbCkge30KKyAgX0xvY2FsZV9jb2xsYXRlKiBfTV9jb2xsYXRlOworICBjb2xsYXRlX2J5bmFtZShjb25zdCBjb2xsYXRlX2J5bmFtZTx3Y2hhcl90PiYpOworICBjb2xsYXRlX2J5bmFtZTx3Y2hhcl90PiYgb3BlcmF0b3IgPShjb25zdCBjb2xsYXRlX2J5bmFtZTx3Y2hhcl90PiYpOworfTsKKworIyBlbmRpZiAvKiBOT19XQ0hBUl9UICovCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK2Jvb2wKK19fbG9jYWxlX2RvX29wZXJhdG9yX2NhbGwgKGNvbnN0IGxvY2FsZSYgX19sb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX3kpIHsKKyAgY29sbGF0ZTxfQ2hhclQ+IGNvbnN0JiBfX2NvbGwgPSB1c2VfZmFjZXQ8Y29sbGF0ZTxfQ2hhclQ+ID4oX19sb2MpOworICByZXR1cm4gX19jb2xsLmNvbXBhcmUoX194LmRhdGEoKSwgX194LmRhdGEoKSArIF9feC5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICBfX3kuZGF0YSgpLCBfX3kuZGF0YSgpICsgX195LnNpemUoKSkgPCAwOworfQorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9DT0xMQVRFX0ggKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL19jb21wbGV4LmMgYi9zdGxwb3J0L3N0bC9fY29tcGxleC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNGZhMWUKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9fY29tcGxleC5jCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworI2lmbmRlZiBfU1RMUF9DT01QTEVYX0MKKyNkZWZpbmUgX1NUTFBfQ09NUExFWF9DCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ09NUExFWAorIyAgaW5jbHVkZSA8c3RsL19jb21wbGV4Lmg+CisjZW5kaWYKKworI2lmICFkZWZpbmVkIChfU1RMUF9VU0VfTk9fSU9TVFJFQU1TKQorIyAgaWZuZGVmIF9TVExQX0lOVEVSTkFMX0lTVFJFQU0KKyMgICAgaW5jbHVkZSA8c3RsL19pc3RyZWFtLmg+CisjICBlbmRpZgorCisjICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfU1NUUkVBTQorIyAgICBpbmNsdWRlIDxzdGwvX3NzdHJlYW0uaD4KKyMgIGVuZGlmCisKKyMgIGlmbmRlZiBfU1RMUF9TVFJJTkdfSU9fSAorIyAgICBpbmNsdWRlIDxzdGwvX3N0cmluZ19pby5oPgorIyAgZW5kaWYKKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworLy8gTm9uLWlubGluZSBtZW1iZXIgZnVuY3Rpb25zLgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgordm9pZCBjb21wbGV4PF9UcD46Ol9kaXYoY29uc3QgX1RwJiBfX3oxX3IsIGNvbnN0IF9UcCYgX196MV9pLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1RwJiBfX3oyX3IsIGNvbnN0IF9UcCYgX196Ml9pLAorICAgICAgICAgICAgICAgICAgICAgICAgX1RwJiBfX3Jlc19yLCBfVHAmIF9fcmVzX2kpIHsKKyAgX1RwIF9fYXIgPSBfX3oyX3IgPj0gMCA/IF9fejJfciA6IC1fX3oyX3I7CisgIF9UcCBfX2FpID0gX196Ml9pID49IDAgPyBfX3oyX2kgOiAtX196Ml9pOworCisgIGlmIChfX2FyIDw9IF9fYWkpIHsKKyAgICBfVHAgX19yYXRpbyA9IF9fejJfciAvIF9fejJfaTsKKyAgICBfVHAgX19kZW5vbSA9IF9fejJfaSAqICgxICsgX19yYXRpbyAqIF9fcmF0aW8pOworICAgIF9fcmVzX3IgPSAoX196MV9yICogX19yYXRpbyArIF9fejFfaSkgLyBfX2Rlbm9tOworICAgIF9fcmVzX2kgPSAoX196MV9pICogX19yYXRpbyAtIF9fejFfcikgLyBfX2Rlbm9tOworICB9CisgIGVsc2UgeworICAgIF9UcCBfX3JhdGlvID0gX196Ml9pIC8gX196Ml9yOworICAgIF9UcCBfX2Rlbm9tID0gX196Ml9yICogKDEgKyBfX3JhdGlvICogX19yYXRpbyk7CisgICAgX19yZXNfciA9IChfX3oxX3IgKyBfX3oxX2kgKiBfX3JhdGlvKSAvIF9fZGVub207CisgICAgX19yZXNfaSA9IChfX3oxX2kgLSBfX3oxX3IgKiBfX3JhdGlvKSAvIF9fZGVub207CisgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3ZvaWQgY29tcGxleDxfVHA+OjpfZGl2KGNvbnN0IF9UcCYgX196MV9yLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1RwJiBfX3oyX3IsIGNvbnN0IF9UcCYgX196Ml9pLAorICAgICAgICAgICAgICAgICAgICAgICAgX1RwJiBfX3Jlc19yLCBfVHAmIF9fcmVzX2kpIHsKKyAgX1RwIF9fYXIgPSBfX3oyX3IgPj0gMCA/IF9fejJfciA6IC1fX3oyX3I7CisgIF9UcCBfX2FpID0gX196Ml9pID49IDAgPyBfX3oyX2kgOiAtX196Ml9pOworCisgIGlmIChfX2FyIDw9IF9fYWkpIHsKKyAgICBfVHAgX19yYXRpbyA9IF9fejJfciAvIF9fejJfaTsKKyAgICBfVHAgX19kZW5vbSA9IF9fejJfaSAqICgxICsgX19yYXRpbyAqIF9fcmF0aW8pOworICAgIF9fcmVzX3IgPSAoX196MV9yICogX19yYXRpbykgLyBfX2Rlbm9tOworICAgIF9fcmVzX2kgPSAtIF9fejFfciAvIF9fZGVub207CisgIH0KKyAgZWxzZSB7CisgICAgX1RwIF9fcmF0aW8gPSBfX3oyX2kgLyBfX3oyX3I7CisgICAgX1RwIF9fZGVub20gPSBfX3oyX3IgKiAoMSArIF9fcmF0aW8gKiBfX3JhdGlvKTsKKyAgICBfX3Jlc19yID0gX196MV9yIC8gX19kZW5vbTsKKyAgICBfX3Jlc19pID0gLSAoX196MV9yICogX19yYXRpbykgLyBfX2Rlbm9tOworICB9Cit9CisKKy8vIEkvTy4KKyNpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX05PX0lPU1RSRUFNUykKKworLy8gQ29tcGxleCBvdXRwdXQsIGluIHRoZSBmb3JtIChyZSxpbSkuICBXZSB1c2UgYSB0d28tc3RlcCBwcm9jZXNzCisvLyBpbnZvbHZpbmcgc3RyaW5nc3RyZWFtIHNvIHRoYXQgd2UgZ2V0IHRoZSBwYWRkaW5nIHJpZ2h0LgordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfU1RMUF9DQUxMCitvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywgY29uc3QgY29tcGxleDxfVHA+JiBfX3opIHsKKyAgYmFzaWNfb3N0cmluZ3N0cmVhbTxfQ2hhclQsIF9UcmFpdHMsIGFsbG9jYXRvcjxfQ2hhclQ+ID4gX190bXA7CisgIF9fdG1wLmZsYWdzKF9fb3MuZmxhZ3MoKSk7CisgIF9fdG1wLmltYnVlKF9fb3MuZ2V0bG9jKCkpOworICBfX3RtcC5wcmVjaXNpb24oX19vcy5wcmVjaXNpb24oKSk7CisgIF9fdG1wIDw8ICcoJyA8PCBfX3oucmVhbCgpIDw8ICcsJyA8PCBfX3ouaW1hZygpIDw8ICcpJzsKKyAgcmV0dXJuIF9fb3MgPDwgX190bXAuc3RyKCk7Cit9CisKKy8vIENvbXBsZXggaW5wdXQgZnJvbSBhcmJpdHJhcnkgc3RyZWFtcy4gIE5vdGUgdGhhdCByZXN1bHRzIGluIHNvbWUKKy8vIGxvY2FsZXMgbWF5IGJlIGNvbmZ1c2luZywgc2luY2UgdGhlIGRlY2ltYWwgY2hhcmFjdGVyIHZhcmllcyB3aXRoCisvLyBsb2NhbGUgYW5kIHRoZSBzZXBhcmF0b3IgYmV0d2VlbiByZWFsIGFuZCBpbWFnaW5hcnkgcGFydHMgZG9lcyBub3QuCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX1NUTFBfQ0FMTAorb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsIGNvbXBsZXg8X1RwPiYgX196KSB7CisgIF9UcCAgX19yZSA9IDA7CisgIF9UcCAgX19pbSA9IDA7CisKKyAgY29uc3QgY3R5cGU8X0NoYXJUPiYgX19jX3R5cGUgPSAqX19pcy5fTV9jdHlwZV9mYWNldCgpOworCisgIGNvbnN0IGNoYXIgX19wdW5jdFs0XSA9ICIoLCkiOworICBfQ2hhclQgX193cHVuY3RbM107CisgIF9fY190eXBlLndpZGVuKF9fcHVuY3QsIF9fcHVuY3QgKyAzLCBfX3dwdW5jdCk7CisKKyAgX0NoYXJUIF9fYzsKKworICBfX2lzID4+IF9fYzsKKyAgaWYgKF9UcmFpdHM6OmVxKF9fYywgX193cHVuY3RbMF0pKSB7ICAvLyBMZWZ0IHBhcmVuCisgICAgX19pcyA+PiBfX3JlID4+IF9fYzsKKyAgICBpZiAoX1RyYWl0czo6ZXEoX19jLCBfX3dwdW5jdFsxXSkpICAvLyBDb21tYQorICAgICAgX19pcyA+PiBfX2ltID4+IF9fYzsKKyAgICBpZiAoIV9UcmFpdHM6OmVxKF9fYywgX193cHVuY3RbMl0pKSAvLyBSaWdodCBwYXJlbgorICAgICAgX19pcy5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7CisgIH0KKyAgZWxzZSB7CisgICAgX19pcy5wdXRiYWNrKF9fYyk7CisgICAgX19pcyA+PiBfX3JlOworICB9CisKKyAgaWYgKF9faXMpCisgICAgX196ID0gY29tcGxleDxfVHA+KF9fcmUsIF9faW0pOworICByZXR1cm4gX19pczsKK30KKworI2VuZGlmIC8qIF9TVExQX1VTRV9OT19JT1NUUkVBTVMgKi8KKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLyogX1NUTFBfQ09NUExFWF9DICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9fY29tcGxleC5oIGIvc3RscG9ydC9zdGwvX2NvbXBsZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGJhMGFkCi0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvX2NvbXBsZXguaApAQCAtMCwwICsxLDkzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ09NUExFWAorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9DT01QTEVYCisKKy8vIFRoaXMgaGVhZGVyIGRlY2xhcmVzIHRoZSB0ZW1wbGF0ZSBjbGFzcyBjb21wbGV4LCBhcyBkZXNjcmliZWQgaW4KKy8vIGluIHRoZSBkcmFmdCBDKysgc3RhbmRhcmQuICBTaW5nbGUtcHJlY2lzaW9uIGNvbXBsZXggbnVtYmVycworLy8gYXJlIGNvbXBsZXg8ZmxvYXQ+LCBkb3VibGUtcHJlY2lzaW9uIGFyZSBjb21wbGV4PGRvdWJsZT4sIGFuZAorLy8gcXVhZCBwcmVjaXNpb24gYXJlIGNvbXBsZXg8bG9uZyBkb3VibGU+LgorCisvLyBOb3RlIHRoYXQgdGhlIHRlbXBsYXRlIGNsYXNzIGNvbXBsZXggaXMgZGVjbGFyZWQgd2l0aGluIG5hbWVzcGFjZQorLy8gc3RkLCBhcyBjYWxsZWQgZm9yIGJ5IHRoZSBkcmFmdCBDKysgc3RhbmRhcmQuCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ01BVEgKKyMgIGluY2x1ZGUgPHN0bC9fY21hdGguaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBjb21wbGV4IHsKKyAgdHlwZWRlZiBfVHAgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiBjb21wbGV4PF9UcD4gX1NlbGY7CisKKyAgLy8gQ29uc3RydWN0b3JzLCBkZXN0cnVjdG9yLCBhc3NpZ25tZW50IG9wZXJhdG9yLgorICBjb21wbGV4KCkgOiBfTV9yZSgwKSwgX01faW0oMCkge30KKyAgY29tcGxleChjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgICAgOiBfTV9yZShfX3gpLCBfTV9pbSgwKSB7fQorICBjb21wbGV4KGNvbnN0IHZhbHVlX3R5cGUmIF9feCwgY29uc3QgdmFsdWVfdHlwZSYgX195KQorICAgIDogX01fcmUoX194KSwgX01faW0oX195KSB7fQorICBjb21wbGV4KGNvbnN0IF9TZWxmJiBfX3opCisgICAgOiBfTV9yZShfX3ouX01fcmUpLCBfTV9pbShfX3ouX01faW0pIHt9CisKKyAgX1NlbGYmIG9wZXJhdG9yPShjb25zdCBfU2VsZiYgX196KSB7CisgICAgX01fcmUgPSBfX3ouX01fcmU7CisgICAgX01faW0gPSBfX3ouX01faW07CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKSAmJiBkZWZpbmVkIChfU1RMUF9GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIpCisgIHRlbXBsYXRlIDxjbGFzcyBfVHAyPgorICBleHBsaWNpdCBjb21wbGV4KGNvbnN0IGNvbXBsZXg8X1RwMj4mIF9feikKKyAgICA6IF9NX3JlKF9fei5fTV9yZSksIF9NX2ltKF9fei5fTV9pbSkge30KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwMj4KKyAgX1NlbGYmIG9wZXJhdG9yPShjb25zdCBjb21wbGV4PF9UcDI+JiBfX3opIHsKKyAgICBfTV9yZSA9IF9fei5fTV9yZTsKKyAgICBfTV9pbSA9IF9fei5fTV9pbTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisKKyAgLy8gRWxlbWVudCBhY2Nlc3MuCisgIHZhbHVlX3R5cGUgcmVhbCgpIGNvbnN0IHsgcmV0dXJuIF9NX3JlOyB9CisgIHZhbHVlX3R5cGUgaW1hZygpIGNvbnN0IHsgcmV0dXJuIF9NX2ltOyB9CisKKyAgLy8gQXJpdGhtZXRpYyBvcD0gb3BlcmF0aW9ucyBpbnZvbHZpbmcgb25lIHJlYWwgYXJndW1lbnQuCisKKyAgX1NlbGYmIG9wZXJhdG9yPSAoY29uc3QgdmFsdWVfdHlwZSYgX194KSB7CisgICAgX01fcmUgPSBfX3g7CisgICAgX01faW0gPSAwOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBfU2VsZiYgb3BlcmF0b3IrPSAoY29uc3QgdmFsdWVfdHlwZSYgX194KSB7CisgICAgX01fcmUgKz0gX194OworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBfU2VsZiYgb3BlcmF0b3ItPSAoY29uc3QgdmFsdWVfdHlwZSYgX194KSB7CisgICAgX01fcmUgLT0gX194OworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBfU2VsZiYgb3BlcmF0b3IqPSAoY29uc3QgdmFsdWVfdHlwZSYgX194KSB7CisgICAgX01fcmUgKj0gX194OworICAgIF9NX2ltICo9IF9feDsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgX1NlbGYmIG9wZXJhdG9yLz0gKGNvbnN0IHZhbHVlX3R5cGUmIF9feCkgeworICAgIF9NX3JlIC89IF9feDsKKyAgICBfTV9pbSAvPSBfX3g7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8gQXJpdGhtZXRpYyBvcD0gb3BlcmF0aW9ucyBpbnZvbHZpbmcgdHdvIGNvbXBsZXggYXJndW1lbnRzLgorCisgIHN0YXRpYyB2b2lkICBfU1RMUF9DQUxMIF9kaXYoY29uc3QgdmFsdWVfdHlwZSYgX196MV9yLCBjb25zdCB2YWx1ZV90eXBlJiBfX3oxX2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWVfdHlwZSYgX196Ml9yLCBjb25zdCB2YWx1ZV90eXBlJiBfX3oyX2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZSYgX19yZXNfciwgdmFsdWVfdHlwZSYgX19yZXNfaSk7CisKKyAgc3RhdGljIHZvaWQgX1NUTFBfQ0FMTCBfZGl2KGNvbnN0IHZhbHVlX3R5cGUmIF9fejFfciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlX3R5cGUmIF9fejJfciwgY29uc3QgdmFsdWVfdHlwZSYgX196Ml9pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZSYgX19yZXNfciwgdmFsdWVfdHlwZSYgX19yZXNfaSk7CisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKSAvLyAmJiBkZWZpbmVkIChfU1RMUF9GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIpCisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcDI+IF9TZWxmJiBvcGVyYXRvcis9IChjb25zdCBjb21wbGV4PF9UcDI+JiBfX3opIHsKKyAgICBfTV9yZSArPSBfX3ouX01fcmU7CisgICAgX01faW0gKz0gX196Ll9NX2ltOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfVHAyPiBfU2VsZiYgb3BlcmF0b3ItPSAoY29uc3QgY29tcGxleDxfVHAyPiYgX196KSB7CisgICAgX01fcmUgLT0gX196Ll9NX3JlOworICAgIF9NX2ltIC09IF9fei5fTV9pbTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwMj4gX1NlbGYmIG9wZXJhdG9yKj0gKGNvbnN0IGNvbXBsZXg8X1RwMj4mIF9feikgeworICAgIHZhbHVlX3R5cGUgX19yID0gX01fcmUgKiBfX3ouX01fcmUgLSBfTV9pbSAqIF9fei5fTV9pbTsKKyAgICB2YWx1ZV90eXBlIF9faSA9IF9NX3JlICogX196Ll9NX2ltICsgX01faW0gKiBfX3ouX01fcmU7CisgICAgX01fcmUgPSBfX3I7CisgICAgX01faW0gPSBfX2k7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcDI+IF9TZWxmJiBvcGVyYXRvci89IChjb25zdCBjb21wbGV4PF9UcDI+JiBfX3opIHsKKyAgICB2YWx1ZV90eXBlIF9fcjsKKyAgICB2YWx1ZV90eXBlIF9faTsKKyAgICBfZGl2KF9NX3JlLCBfTV9pbSwgX196Ll9NX3JlLCBfX3ouX01faW0sIF9fciwgX19pKTsKKyAgICBfTV9yZSA9IF9fcjsKKyAgICBfTV9pbSA9IF9faTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisKKyAgX1NlbGYmIG9wZXJhdG9yKz0gKGNvbnN0IF9TZWxmJiBfX3opIHsKKyAgICBfTV9yZSArPSBfX3ouX01fcmU7CisgICAgX01faW0gKz0gX196Ll9NX2ltOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIF9TZWxmJiBvcGVyYXRvci09IChjb25zdCBfU2VsZiYgX196KSB7CisgICAgX01fcmUgLT0gX196Ll9NX3JlOworICAgIF9NX2ltIC09IF9fei5fTV9pbTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBfU2VsZiYgb3BlcmF0b3IqPSAoY29uc3QgX1NlbGYmIF9feikgeworICAgIHZhbHVlX3R5cGUgX19yID0gX01fcmUgKiBfX3ouX01fcmUgLSBfTV9pbSAqIF9fei5fTV9pbTsKKyAgICB2YWx1ZV90eXBlIF9faSA9IF9NX3JlICogX196Ll9NX2ltICsgX01faW0gKiBfX3ouX01fcmU7CisgICAgX01fcmUgPSBfX3I7CisgICAgX01faW0gPSBfX2k7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgX1NlbGYmIG9wZXJhdG9yLz0gKGNvbnN0IF9TZWxmJiBfX3opIHsKKyAgICB2YWx1ZV90eXBlIF9fcjsKKyAgICB2YWx1ZV90eXBlIF9faTsKKyAgICBfZGl2KF9NX3JlLCBfTV9pbSwgX196Ll9NX3JlLCBfX3ouX01faW0sIF9fciwgX19pKTsKKyAgICBfTV9yZSA9IF9fcjsKKyAgICBfTV9pbSA9IF9faTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLyBEYXRhIG1lbWJlcnMuCisgIHZhbHVlX3R5cGUgX01fcmU7CisgIHZhbHVlX3R5cGUgX01faW07Cit9OworCisvLyBFeHBsaWNpdCBzcGVjaWFsaXphdGlvbnMgZm9yIGZsb2F0LCBkb3VibGUsIGxvbmcgZG91YmxlLiAgVGhlIG9ubHkKKy8vIHJlYXNvbiBmb3IgdGhlc2Ugc3BlY2lhbGl6YXRpb25zIGlzIHRvIGVuYWJsZSBhdXRvbWF0aWMgY29udmVyc2lvbnMKKy8vIGZyb20gY29tcGxleDxmbG9hdD4gdG8gY29tcGxleDxkb3VibGU+LCBhbmQgY29tcGxleDxkb3VibGU+IHRvCisvLyBjb21wbGV4PGxvbmcgZG91YmxlPi4KKworX1NUTFBfVEVNUExBVEVfTlVMTAorc3RydWN0IF9TVExQX0NMQVNTX0RFQ0xTUEVDIGNvbXBsZXg8ZmxvYXQ+IHsKKyAgdHlwZWRlZiBmbG9hdCB2YWx1ZV90eXBlOworICB0eXBlZGVmIGNvbXBsZXg8ZmxvYXQ+IF9TZWxmOworICAvLyBDb25zdHJ1Y3RvcnMsIGRlc3RydWN0b3IsIGFzc2lnbm1lbnQgb3BlcmF0b3IuCisKKyAgY29tcGxleCh2YWx1ZV90eXBlIF9feCA9IDAuMGYsIHZhbHVlX3R5cGUgX195ID0gMC4wZikKKyAgICA6IF9NX3JlKF9feCksIF9NX2ltKF9feSkge30KKworICBjb21wbGV4KGNvbnN0IGNvbXBsZXg8ZmxvYXQ+JiBfX3opICAgIDogX01fcmUoX196Ll9NX3JlKSwgX01faW0oX196Ll9NX2ltKSB7fQorCisgIGlubGluZSBleHBsaWNpdCBjb21wbGV4KGNvbnN0IGNvbXBsZXg8ZG91YmxlPiYgX196KTsKKyNpZm5kZWYgX1NUTFBfTk9fTE9OR19ET1VCTEUKKyAgaW5saW5lIGV4cGxpY2l0IGNvbXBsZXgoY29uc3QgY29tcGxleDxsb25nIGRvdWJsZT4mIF9feik7CisjZW5kaWYKKyAgLy8gRWxlbWVudCBhY2Nlc3MuCisgIHZhbHVlX3R5cGUgcmVhbCgpIGNvbnN0IHsgcmV0dXJuIF9NX3JlOyB9CisgIHZhbHVlX3R5cGUgaW1hZygpIGNvbnN0IHsgcmV0dXJuIF9NX2ltOyB9CisKKyAgLy8gQXJpdGhtZXRpYyBvcD0gb3BlcmF0aW9ucyBpbnZvbHZpbmcgb25lIHJlYWwgYXJndW1lbnQuCisKKyAgX1NlbGYmIG9wZXJhdG9yPSAodmFsdWVfdHlwZSBfX3gpIHsKKyAgICBfTV9yZSA9IF9feDsKKyAgICBfTV9pbSA9IDAuMGY7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIF9TZWxmJiBvcGVyYXRvcis9ICh2YWx1ZV90eXBlIF9feCkgeworICAgIF9NX3JlICs9IF9feDsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgX1NlbGYmIG9wZXJhdG9yLT0gKHZhbHVlX3R5cGUgX194KSB7CisgICAgX01fcmUgLT0gX194OworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBfU2VsZiYgb3BlcmF0b3IqPSAodmFsdWVfdHlwZSBfX3gpIHsKKyAgICBfTV9yZSAqPSBfX3g7CisgICAgX01faW0gKj0gX194OworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBfU2VsZiYgb3BlcmF0b3IvPSAodmFsdWVfdHlwZSBfX3gpIHsKKyAgICBfTV9yZSAvPSBfX3g7CisgICAgX01faW0gLz0gX194OworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vIEFyaXRobWV0aWMgb3A9IG9wZXJhdGlvbnMgaW52b2x2aW5nIHR3byBjb21wbGV4IGFyZ3VtZW50cy4KKworICBzdGF0aWMgdm9pZCBfU1RMUF9DQUxMIF9kaXYoY29uc3QgZmxvYXQmIF9fejFfciwgY29uc3QgZmxvYXQmIF9fejFfaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0JiBfX3oyX3IsIGNvbnN0IGZsb2F0JiBfX3oyX2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCYgX19yZXNfciwgZmxvYXQmIF9fcmVzX2kpOworCisgIHN0YXRpYyB2b2lkIF9TVExQX0NBTEwgX2Rpdihjb25zdCBmbG9hdCYgX196MV9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQmIF9fejJfciwgY29uc3QgZmxvYXQmIF9fejJfaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0JiBfX3Jlc19yLCBmbG9hdCYgX19yZXNfaSk7CisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwMj4KKyAgY29tcGxleDxmbG9hdD4mIG9wZXJhdG9yPShjb25zdCBjb21wbGV4PF9UcDI+JiBfX3opIHsKKyAgICBfTV9yZSA9IF9fei5fTV9yZTsKKyAgICBfTV9pbSA9IF9fei5fTV9pbTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwMj4KKyAgY29tcGxleDxmbG9hdD4mIG9wZXJhdG9yKz0gKGNvbnN0IGNvbXBsZXg8X1RwMj4mIF9feikgeworICAgIF9NX3JlICs9IF9fei5fTV9yZTsKKyAgICBfTV9pbSArPSBfX3ouX01faW07CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcDI+CisgIGNvbXBsZXg8ZmxvYXQ+JiBvcGVyYXRvci09IChjb25zdCBjb21wbGV4PF9UcDI+JiBfX3opIHsKKyAgICBfTV9yZSAtPSBfX3ouX01fcmU7CisgICAgX01faW0gLT0gX196Ll9NX2ltOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfVHAyPgorICBjb21wbGV4PGZsb2F0PiYgb3BlcmF0b3IqPSAoY29uc3QgY29tcGxleDxfVHAyPiYgX196KSB7CisgICAgZmxvYXQgX19yID0gX01fcmUgKiBfX3ouX01fcmUgLSBfTV9pbSAqIF9fei5fTV9pbTsKKyAgICBmbG9hdCBfX2kgPSBfTV9yZSAqIF9fei5fTV9pbSArIF9NX2ltICogX196Ll9NX3JlOworICAgIF9NX3JlID0gX19yOworICAgIF9NX2ltID0gX19pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfVHAyPgorICBjb21wbGV4PGZsb2F0PiYgb3BlcmF0b3IvPSAoY29uc3QgY29tcGxleDxfVHAyPiYgX196KSB7CisgICAgZmxvYXQgX19yOworICAgIGZsb2F0IF9faTsKKyAgICBfZGl2KF9NX3JlLCBfTV9pbSwgX196Ll9NX3JlLCBfX3ouX01faW0sIF9fciwgX19pKTsKKyAgICBfTV9yZSA9IF9fcjsKKyAgICBfTV9pbSA9IF9faTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworI2VuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKworICBfU2VsZiYgb3BlcmF0b3I9KGNvbnN0IF9TZWxmJiBfX3opIHsKKyAgICBfTV9yZSA9IF9fei5fTV9yZTsKKyAgICBfTV9pbSA9IF9fei5fTV9pbTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBfU2VsZiYgb3BlcmF0b3IrPSAoY29uc3QgX1NlbGYmIF9feikgeworICAgIF9NX3JlICs9IF9fei5fTV9yZTsKKyAgICBfTV9pbSArPSBfX3ouX01faW07CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgX1NlbGYmIG9wZXJhdG9yLT0gKGNvbnN0IF9TZWxmJiBfX3opIHsKKyAgICBfTV9yZSAtPSBfX3ouX01fcmU7CisgICAgX01faW0gLT0gX196Ll9NX2ltOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIF9TZWxmJiBvcGVyYXRvcio9IChjb25zdCBfU2VsZiYgX196KSB7CisgICAgdmFsdWVfdHlwZSBfX3IgPSBfTV9yZSAqIF9fei5fTV9yZSAtIF9NX2ltICogX196Ll9NX2ltOworICAgIHZhbHVlX3R5cGUgX19pID0gX01fcmUgKiBfX3ouX01faW0gKyBfTV9pbSAqIF9fei5fTV9yZTsKKyAgICBfTV9yZSA9IF9fcjsKKyAgICBfTV9pbSA9IF9faTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBfU2VsZiYgb3BlcmF0b3IvPSAoY29uc3QgX1NlbGYmIF9feikgeworICAgIHZhbHVlX3R5cGUgX19yOworICAgIHZhbHVlX3R5cGUgX19pOworICAgIF9kaXYoX01fcmUsIF9NX2ltLCBfX3ouX01fcmUsIF9fei5fTV9pbSwgX19yLCBfX2kpOworICAgIF9NX3JlID0gX19yOworICAgIF9NX2ltID0gX19pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vIERhdGEgbWVtYmVycy4KKyAgdmFsdWVfdHlwZSBfTV9yZTsKKyAgdmFsdWVfdHlwZSBfTV9pbTsKK307CisKK19TVExQX1RFTVBMQVRFX05VTEwKK3N0cnVjdCBfU1RMUF9DTEFTU19ERUNMU1BFQyBjb21wbGV4PGRvdWJsZT4geworICB0eXBlZGVmIGRvdWJsZSB2YWx1ZV90eXBlOworICB0eXBlZGVmIGNvbXBsZXg8ZG91YmxlPiBfU2VsZjsKKworICAvLyBDb25zdHJ1Y3RvcnMsIGRlc3RydWN0b3IsIGFzc2lnbm1lbnQgb3BlcmF0b3IuCisKKyAgY29tcGxleCh2YWx1ZV90eXBlIF9feCA9IDAuMCwgdmFsdWVfdHlwZSBfX3kgPSAwLjApCisgICAgOiBfTV9yZShfX3gpLCBfTV9pbShfX3kpIHt9CisKKyAgY29tcGxleChjb25zdCBjb21wbGV4PGRvdWJsZT4mIF9feikKKyAgICA6IF9NX3JlKF9fei5fTV9yZSksIF9NX2ltKF9fei5fTV9pbSkge30KKyAgaW5saW5lIGNvbXBsZXgoY29uc3QgY29tcGxleDxmbG9hdD4mIF9feik7CisjaWYgIWRlZmluZWQgKF9TVExQX05PX0xPTkdfRE9VQkxFKQorICBleHBsaWNpdCBpbmxpbmUgY29tcGxleChjb25zdCBjb21wbGV4PGxvbmcgZG91YmxlPiYgX196KTsKKyNlbmRpZgorICAvLyBFbGVtZW50IGFjY2Vzcy4KKyAgdmFsdWVfdHlwZSByZWFsKCkgY29uc3QgeyByZXR1cm4gX01fcmU7IH0KKyAgdmFsdWVfdHlwZSBpbWFnKCkgY29uc3QgeyByZXR1cm4gX01faW07IH0KKworICAvLyBBcml0aG1ldGljIG9wPSBvcGVyYXRpb25zIGludm9sdmluZyBvbmUgcmVhbCBhcmd1bWVudC4KKworICBfU2VsZiYgb3BlcmF0b3I9ICh2YWx1ZV90eXBlIF9feCkgeworICAgIF9NX3JlID0gX194OworICAgIF9NX2ltID0gMC4wOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBfU2VsZiYgb3BlcmF0b3IrPSAodmFsdWVfdHlwZSBfX3gpIHsKKyAgICBfTV9yZSArPSBfX3g7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIF9TZWxmJiBvcGVyYXRvci09ICh2YWx1ZV90eXBlIF9feCkgeworICAgIF9NX3JlIC09IF9feDsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgX1NlbGYmIG9wZXJhdG9yKj0gKHZhbHVlX3R5cGUgX194KSB7CisgICAgX01fcmUgKj0gX194OworICAgIF9NX2ltICo9IF9feDsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgX1NlbGYmIG9wZXJhdG9yLz0gKHZhbHVlX3R5cGUgX194KSB7CisgICAgX01fcmUgLz0gX194OworICAgIF9NX2ltIC89IF9feDsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLyBBcml0aG1ldGljIG9wPSBvcGVyYXRpb25zIGludm9sdmluZyB0d28gY29tcGxleCBhcmd1bWVudHMuCisKKyAgc3RhdGljIHZvaWQgX1NUTFBfQ0FMTCBfZGl2KGNvbnN0IGRvdWJsZSYgX196MV9yLCBjb25zdCBkb3VibGUmIF9fejFfaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSYgX196Ml9yLCBjb25zdCBkb3VibGUmIF9fejJfaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSYgX19yZXNfciwgZG91YmxlJiBfX3Jlc19pKTsKKyAgc3RhdGljIHZvaWQgX1NUTFBfQ0FMTCBfZGl2KGNvbnN0IGRvdWJsZSYgX196MV9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlJiBfX3oyX3IsIGNvbnN0IGRvdWJsZSYgX196Ml9pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlJiBfX3Jlc19yLCBkb3VibGUmIF9fcmVzX2kpOworCisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykgJiYgZGVmaW5lZCAoX1NUTFBfRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwMj4KKyAgY29tcGxleDxkb3VibGU+JiBvcGVyYXRvcj0oY29uc3QgY29tcGxleDxfVHAyPiYgX196KSB7CisgICAgX01fcmUgPSBfX3ouX01fcmU7CisgICAgX01faW0gPSBfX3ouX01faW07CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcDI+CisgIGNvbXBsZXg8ZG91YmxlPiYgb3BlcmF0b3IrPSAoY29uc3QgY29tcGxleDxfVHAyPiYgX196KSB7CisgICAgX01fcmUgKz0gX196Ll9NX3JlOworICAgIF9NX2ltICs9IF9fei5fTV9pbTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwMj4KKyAgY29tcGxleDxkb3VibGU+JiBvcGVyYXRvci09IChjb25zdCBjb21wbGV4PF9UcDI+JiBfX3opIHsKKyAgICBfTV9yZSAtPSBfX3ouX01fcmU7CisgICAgX01faW0gLT0gX196Ll9NX2ltOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfVHAyPgorICBjb21wbGV4PGRvdWJsZT4mIG9wZXJhdG9yKj0gKGNvbnN0IGNvbXBsZXg8X1RwMj4mIF9feikgeworICAgIGRvdWJsZSBfX3IgPSBfTV9yZSAqIF9fei5fTV9yZSAtIF9NX2ltICogX196Ll9NX2ltOworICAgIGRvdWJsZSBfX2kgPSBfTV9yZSAqIF9fei5fTV9pbSArIF9NX2ltICogX196Ll9NX3JlOworICAgIF9NX3JlID0gX19yOworICAgIF9NX2ltID0gX19pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfVHAyPgorICBjb21wbGV4PGRvdWJsZT4mIG9wZXJhdG9yLz0gKGNvbnN0IGNvbXBsZXg8X1RwMj4mIF9feikgeworICAgIGRvdWJsZSBfX3I7CisgICAgZG91YmxlIF9faTsKKyAgICBfZGl2KF9NX3JlLCBfTV9pbSwgX196Ll9NX3JlLCBfX3ouX01faW0sIF9fciwgX19pKTsKKyAgICBfTV9yZSA9IF9fcjsKKyAgICBfTV9pbSA9IF9faTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworI2VuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKworICBfU2VsZiYgb3BlcmF0b3I9KGNvbnN0IF9TZWxmJiBfX3opIHsKKyAgICBfTV9yZSA9IF9fei5fTV9yZTsKKyAgICBfTV9pbSA9IF9fei5fTV9pbTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBfU2VsZiYgb3BlcmF0b3IrPSAoY29uc3QgX1NlbGYmIF9feikgeworICAgIF9NX3JlICs9IF9fei5fTV9yZTsKKyAgICBfTV9pbSArPSBfX3ouX01faW07CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgX1NlbGYmIG9wZXJhdG9yLT0gKGNvbnN0IF9TZWxmJiBfX3opIHsKKyAgICBfTV9yZSAtPSBfX3ouX01fcmU7CisgICAgX01faW0gLT0gX196Ll9NX2ltOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIF9TZWxmJiBvcGVyYXRvcio9IChjb25zdCBfU2VsZiYgX196KSB7CisgICAgdmFsdWVfdHlwZSBfX3IgPSBfTV9yZSAqIF9fei5fTV9yZSAtIF9NX2ltICogX196Ll9NX2ltOworICAgIHZhbHVlX3R5cGUgX19pID0gX01fcmUgKiBfX3ouX01faW0gKyBfTV9pbSAqIF9fei5fTV9yZTsKKyAgICBfTV9yZSA9IF9fcjsKKyAgICBfTV9pbSA9IF9faTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBfU2VsZiYgb3BlcmF0b3IvPSAoY29uc3QgX1NlbGYmIF9feikgeworICAgIHZhbHVlX3R5cGUgX19yOworICAgIHZhbHVlX3R5cGUgX19pOworICAgIF9kaXYoX01fcmUsIF9NX2ltLCBfX3ouX01fcmUsIF9fei5fTV9pbSwgX19yLCBfX2kpOworICAgIF9NX3JlID0gX19yOworICAgIF9NX2ltID0gX19pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vIERhdGEgbWVtYmVycy4KKyAgdmFsdWVfdHlwZSBfTV9yZTsKKyAgdmFsdWVfdHlwZSBfTV9pbTsKK307CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTE9OR19ET1VCTEUpCisKK19TVExQX1RFTVBMQVRFX05VTEwKK3N0cnVjdCBfU1RMUF9DTEFTU19ERUNMU1BFQyBjb21wbGV4PGxvbmcgZG91YmxlPiB7CisgIHR5cGVkZWYgbG9uZyBkb3VibGUgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiBjb21wbGV4PGxvbmcgZG91YmxlPiBfU2VsZjsKKworICAvLyBDb25zdHJ1Y3RvcnMsIGRlc3RydWN0b3IsIGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgIGNvbXBsZXgodmFsdWVfdHlwZSBfX3ggPSAwLjBsLCB2YWx1ZV90eXBlIF9feSA9IDAuMGwpCisgICAgOiBfTV9yZShfX3gpLCBfTV9pbShfX3kpIHt9CisKKyAgY29tcGxleChjb25zdCBjb21wbGV4PGxvbmcgZG91YmxlPiYgX196KQorICAgIDogX01fcmUoX196Ll9NX3JlKSwgX01faW0oX196Ll9NX2ltKSB7fQorICBpbmxpbmUgY29tcGxleChjb25zdCBjb21wbGV4PGZsb2F0PiYgX196KTsKKyAgaW5saW5lIGNvbXBsZXgoY29uc3QgY29tcGxleDxkb3VibGU+JiBfX3opOworCisgIC8vIEVsZW1lbnQgYWNjZXNzLgorICB2YWx1ZV90eXBlIHJlYWwoKSBjb25zdCB7IHJldHVybiBfTV9yZTsgfQorICB2YWx1ZV90eXBlIGltYWcoKSBjb25zdCB7IHJldHVybiBfTV9pbTsgfQorCisgIC8vIEFyaXRobWV0aWMgb3A9IG9wZXJhdGlvbnMgaW52b2x2aW5nIG9uZSByZWFsIGFyZ3VtZW50LgorCisgIF9TZWxmJiBvcGVyYXRvcj0gKHZhbHVlX3R5cGUgX194KSB7CisgICAgX01fcmUgPSBfX3g7CisgICAgX01faW0gPSAwLjBsOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBfU2VsZiYgb3BlcmF0b3IrPSAodmFsdWVfdHlwZSBfX3gpIHsKKyAgICBfTV9yZSArPSBfX3g7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIF9TZWxmJiBvcGVyYXRvci09ICh2YWx1ZV90eXBlIF9feCkgeworICAgIF9NX3JlIC09IF9feDsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgX1NlbGYmIG9wZXJhdG9yKj0gKHZhbHVlX3R5cGUgX194KSB7CisgICAgX01fcmUgKj0gX194OworICAgIF9NX2ltICo9IF9feDsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgX1NlbGYmIG9wZXJhdG9yLz0gKHZhbHVlX3R5cGUgX194KSB7CisgICAgX01fcmUgLz0gX194OworICAgIF9NX2ltIC89IF9feDsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLyBBcml0aG1ldGljIG9wPSBvcGVyYXRpb25zIGludm9sdmluZyB0d28gY29tcGxleCBhcmd1bWVudHMuCisKKyAgc3RhdGljIHZvaWQgX1NUTFBfQ0FMTCBfZGl2KGNvbnN0IGxvbmcgZG91YmxlJiBfX3oxX3IsIGNvbnN0IGxvbmcgZG91YmxlJiBfX3oxX2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb25nIGRvdWJsZSYgX196Ml9yLCBjb25zdCBsb25nIGRvdWJsZSYgX196Ml9pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBkb3VibGUmIF9fcmVzX3IsIGxvbmcgZG91YmxlJiBfX3Jlc19pKTsKKworICBzdGF0aWMgdm9pZCBfU1RMUF9DQUxMIF9kaXYoY29uc3QgbG9uZyBkb3VibGUmIF9fejFfciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvbmcgZG91YmxlJiBfX3oyX3IsIGNvbnN0IGxvbmcgZG91YmxlJiBfX3oyX2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGRvdWJsZSYgX19yZXNfciwgbG9uZyBkb3VibGUmIF9fcmVzX2kpOworCisjICBpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKSAmJiBkZWZpbmVkIChfU1RMUF9GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIpCisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcDI+CisgIGNvbXBsZXg8bG9uZyBkb3VibGU+JiBvcGVyYXRvcj0oY29uc3QgY29tcGxleDxfVHAyPiYgX196KSB7CisgICAgX01fcmUgPSBfX3ouX01fcmU7CisgICAgX01faW0gPSBfX3ouX01faW07CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcDI+CisgIGNvbXBsZXg8bG9uZyBkb3VibGU+JiBvcGVyYXRvcis9IChjb25zdCBjb21wbGV4PF9UcDI+JiBfX3opIHsKKyAgICBfTV9yZSArPSBfX3ouX01fcmU7CisgICAgX01faW0gKz0gX196Ll9NX2ltOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfVHAyPgorICBjb21wbGV4PGxvbmcgZG91YmxlPiYgb3BlcmF0b3ItPSAoY29uc3QgY29tcGxleDxfVHAyPiYgX196KSB7CisgICAgX01fcmUgLT0gX196Ll9NX3JlOworICAgIF9NX2ltIC09IF9fei5fTV9pbTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwMj4KKyAgY29tcGxleDxsb25nIGRvdWJsZT4mIG9wZXJhdG9yKj0gKGNvbnN0IGNvbXBsZXg8X1RwMj4mIF9feikgeworICAgIGxvbmcgZG91YmxlIF9fciA9IF9NX3JlICogX196Ll9NX3JlIC0gX01faW0gKiBfX3ouX01faW07CisgICAgbG9uZyBkb3VibGUgX19pID0gX01fcmUgKiBfX3ouX01faW0gKyBfTV9pbSAqIF9fei5fTV9yZTsKKyAgICBfTV9yZSA9IF9fcjsKKyAgICBfTV9pbSA9IF9faTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwMj4KKyAgY29tcGxleDxsb25nIGRvdWJsZT4mIG9wZXJhdG9yLz0gKGNvbnN0IGNvbXBsZXg8X1RwMj4mIF9feikgeworICAgIGxvbmcgZG91YmxlIF9fcjsKKyAgICBsb25nIGRvdWJsZSBfX2k7CisgICAgX2RpdihfTV9yZSwgX01faW0sIF9fei5fTV9yZSwgX196Ll9NX2ltLCBfX3IsIF9faSk7CisgICAgX01fcmUgPSBfX3I7CisgICAgX01faW0gPSBfX2k7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyMgIGVuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKworICBfU2VsZiYgb3BlcmF0b3I9KGNvbnN0IF9TZWxmJiBfX3opIHsKKyAgICBfTV9yZSA9IF9fei5fTV9yZTsKKyAgICBfTV9pbSA9IF9fei5fTV9pbTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBfU2VsZiYgb3BlcmF0b3IrPSAoY29uc3QgX1NlbGYmIF9feikgeworICAgIF9NX3JlICs9IF9fei5fTV9yZTsKKyAgICBfTV9pbSArPSBfX3ouX01faW07CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgX1NlbGYmIG9wZXJhdG9yLT0gKGNvbnN0IF9TZWxmJiBfX3opIHsKKyAgICBfTV9yZSAtPSBfX3ouX01fcmU7CisgICAgX01faW0gLT0gX196Ll9NX2ltOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIF9TZWxmJiBvcGVyYXRvcio9IChjb25zdCBfU2VsZiYgX196KSB7CisgICAgdmFsdWVfdHlwZSBfX3IgPSBfTV9yZSAqIF9fei5fTV9yZSAtIF9NX2ltICogX196Ll9NX2ltOworICAgIHZhbHVlX3R5cGUgX19pID0gX01fcmUgKiBfX3ouX01faW0gKyBfTV9pbSAqIF9fei5fTV9yZTsKKyAgICBfTV9yZSA9IF9fcjsKKyAgICBfTV9pbSA9IF9faTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBfU2VsZiYgb3BlcmF0b3IvPSAoY29uc3QgX1NlbGYmIF9feikgeworICAgIHZhbHVlX3R5cGUgX19yOworICAgIHZhbHVlX3R5cGUgX19pOworICAgIF9kaXYoX01fcmUsIF9NX2ltLCBfX3ouX01fcmUsIF9fei5fTV9pbSwgX19yLCBfX2kpOworICAgIF9NX3JlID0gX19yOworICAgIF9NX2ltID0gX19pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vIERhdGEgbWVtYmVycy4KKyAgdmFsdWVfdHlwZSBfTV9yZTsKKyAgdmFsdWVfdHlwZSBfTV9pbTsKK307CisKKyNlbmRpZiAvKiBfU1RMUF9OT19MT05HX0RPVUJMRSAqLworCisvLyBDb252ZXJ0aW5nIGNvbnN0cnVjdG9ycyBmcm9tIG9uZSBvZiB0aGVzZSB0aHJlZSBzcGVjaWFsaXplZCB0eXBlcworLy8gdG8gYW5vdGhlci4KKworaW5saW5lIGNvbXBsZXg8ZmxvYXQ+Ojpjb21wbGV4KGNvbnN0IGNvbXBsZXg8ZG91YmxlPiYgX196KQorICA6IF9NX3JlKChmbG9hdClfX3ouX01fcmUpLCBfTV9pbSgoZmxvYXQpX196Ll9NX2ltKSB7fQoraW5saW5lIGNvbXBsZXg8ZG91YmxlPjo6Y29tcGxleChjb25zdCBjb21wbGV4PGZsb2F0PiYgX196KQorICA6IF9NX3JlKF9fei5fTV9yZSksIF9NX2ltKF9fei5fTV9pbSkge30KKyNpZm5kZWYgX1NUTFBfTk9fTE9OR19ET1VCTEUKK2lubGluZSBjb21wbGV4PGZsb2F0Pjo6Y29tcGxleChjb25zdCBjb21wbGV4PGxvbmcgZG91YmxlPiYgX196KQorICA6IF9NX3JlKChmbG9hdClfX3ouX01fcmUpLCBfTV9pbSgoZmxvYXQpX196Ll9NX2ltKSB7fQoraW5saW5lIGNvbXBsZXg8ZG91YmxlPjo6Y29tcGxleChjb25zdCBjb21wbGV4PGxvbmcgZG91YmxlPiYgX196KQorICA6IF9NX3JlKChkb3VibGUpX196Ll9NX3JlKSwgX01faW0oKGRvdWJsZSlfX3ouX01faW0pIHt9CitpbmxpbmUgY29tcGxleDxsb25nIGRvdWJsZT46OmNvbXBsZXgoY29uc3QgY29tcGxleDxmbG9hdD4mIF9feikKKyAgOiBfTV9yZShfX3ouX01fcmUpLCBfTV9pbShfX3ouX01faW0pIHt9CitpbmxpbmUgY29tcGxleDxsb25nIGRvdWJsZT46OmNvbXBsZXgoY29uc3QgY29tcGxleDxkb3VibGU+JiBfX3opCisgIDogX01fcmUoX196Ll9NX3JlKSwgX01faW0oX196Ll9NX2ltKSB7fQorI2VuZGlmCisKKy8vIFVuYXJ5IG5vbi1tZW1iZXIgYXJpdGhtZXRpYyBvcGVyYXRvcnMuCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgY29tcGxleDxfVHA+IF9TVExQX0NBTEwgb3BlcmF0b3IrKGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KQoreyByZXR1cm4gX196OyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgY29tcGxleDxfVHA+IF9TVExQX0NBTEwgIG9wZXJhdG9yLShjb25zdCBjb21wbGV4PF9UcD4mIF9feikKK3sgcmV0dXJuIGNvbXBsZXg8X1RwPigtX196Ll9NX3JlLCAtX196Ll9NX2ltKTsgfQorCisvLyBOb24tbWVtYmVyIGFyaXRobWV0aWMgb3BlcmF0aW9ucyBpbnZvbHZpbmcgb25lIHJlYWwgYXJndW1lbnQuCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgY29tcGxleDxfVHA+IF9TVExQX0NBTEwgb3BlcmF0b3IrKGNvbnN0IF9UcCYgX194LCBjb25zdCBjb21wbGV4PF9UcD4mIF9feikKK3sgcmV0dXJuIGNvbXBsZXg8X1RwPihfX3ggKyBfX3ouX01fcmUsIF9fei5fTV9pbSk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBjb21wbGV4PF9UcD4gX1NUTFBfQ0FMTCBvcGVyYXRvcisoY29uc3QgY29tcGxleDxfVHA+JiBfX3osIGNvbnN0IF9UcCYgX194KQoreyByZXR1cm4gY29tcGxleDxfVHA+KF9fei5fTV9yZSArIF9feCwgX196Ll9NX2ltKTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIGNvbXBsZXg8X1RwPiBfU1RMUF9DQUxMIG9wZXJhdG9yLShjb25zdCBfVHAmIF9feCwgY29uc3QgY29tcGxleDxfVHA+JiBfX3opCit7IHJldHVybiBjb21wbGV4PF9UcD4oX194IC0gX196Ll9NX3JlLCAtX196Ll9NX2ltKTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIGNvbXBsZXg8X1RwPiBfU1RMUF9DQUxMIG9wZXJhdG9yLShjb25zdCBjb21wbGV4PF9UcD4mIF9feiwgY29uc3QgX1RwJiBfX3gpCit7IHJldHVybiBjb21wbGV4PF9UcD4oX196Ll9NX3JlIC0gX194LCBfX3ouX01faW0pOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgY29tcGxleDxfVHA+IF9TVExQX0NBTEwgb3BlcmF0b3IqKGNvbnN0IF9UcCYgX194LCBjb25zdCBjb21wbGV4PF9UcD4mIF9feikKK3sgcmV0dXJuIGNvbXBsZXg8X1RwPihfX3ggKiBfX3ouX01fcmUsIF9feCAqIF9fei5fTV9pbSk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBjb21wbGV4PF9UcD4gX1NUTFBfQ0FMTCBvcGVyYXRvciooY29uc3QgY29tcGxleDxfVHA+JiBfX3osIGNvbnN0IF9UcCYgX194KQoreyByZXR1cm4gY29tcGxleDxfVHA+KF9fei5fTV9yZSAqIF9feCwgX196Ll9NX2ltICogX194KTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIGNvbXBsZXg8X1RwPiBfU1RMUF9DQUxMIG9wZXJhdG9yLyhjb25zdCBfVHAmIF9feCwgY29uc3QgY29tcGxleDxfVHA+JiBfX3opIHsKKyAgY29tcGxleDxfVHA+IF9fcmVzdWx0OworICBjb21wbGV4PF9UcD46Ol9kaXYoX194LAorICAgICAgICAgICAgICAgICAgICAgX196Ll9NX3JlLCBfX3ouX01faW0sCisgICAgICAgICAgICAgICAgICAgICBfX3Jlc3VsdC5fTV9yZSwgX19yZXN1bHQuX01faW0pOworICByZXR1cm4gX19yZXN1bHQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgY29tcGxleDxfVHA+IF9TVExQX0NBTEwgb3BlcmF0b3IvKGNvbnN0IGNvbXBsZXg8X1RwPiYgX196LCBjb25zdCBfVHAmIF9feCkKK3sgcmV0dXJuIGNvbXBsZXg8X1RwPihfX3ouX01fcmUgLyBfX3gsIF9fei5fTV9pbSAvIF9feCk7IH0KKworLy8gTm9uLW1lbWJlciBhcml0aG1ldGljIG9wZXJhdGlvbnMgaW52b2x2aW5nIHR3byBjb21wbGV4IGFyZ3VtZW50cworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIGNvbXBsZXg8X1RwPiBfU1RMUF9DQUxMCitvcGVyYXRvcisoY29uc3QgY29tcGxleDxfVHA+JiBfX3oxLCBjb25zdCBjb21wbGV4PF9UcD4mIF9fejIpCit7IHJldHVybiBjb21wbGV4PF9UcD4oX196MS5fTV9yZSArIF9fejIuX01fcmUsIF9fejEuX01faW0gKyBfX3oyLl9NX2ltKTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIGNvbXBsZXg8X1RwPiBfU1RMUF9DQUxMCitvcGVyYXRvci0oY29uc3QgY29tcGxleDxfVHA+JiBfX3oxLCBjb25zdCBjb21wbGV4PF9UcD4mIF9fejIpCit7IHJldHVybiBjb21wbGV4PF9UcD4oX196MS5fTV9yZSAtIF9fejIuX01fcmUsIF9fejEuX01faW0gLSBfX3oyLl9NX2ltKTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIGNvbXBsZXg8X1RwPiBfU1RMUF9DQUxMCitvcGVyYXRvciooY29uc3QgY29tcGxleDxfVHA+JiBfX3oxLCBjb25zdCBjb21wbGV4PF9UcD4mIF9fejIpIHsKKyAgcmV0dXJuIGNvbXBsZXg8X1RwPihfX3oxLl9NX3JlICogX196Mi5fTV9yZSAtIF9fejEuX01faW0gKiBfX3oyLl9NX2ltLAorICAgICAgICAgICAgICAgICAgICAgIF9fejEuX01fcmUgKiBfX3oyLl9NX2ltICsgX196MS5fTV9pbSAqIF9fejIuX01fcmUpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIGNvbXBsZXg8X1RwPiBfU1RMUF9DQUxMCitvcGVyYXRvci8oY29uc3QgY29tcGxleDxfVHA+JiBfX3oxLCBjb25zdCBjb21wbGV4PF9UcD4mIF9fejIpIHsKKyAgY29tcGxleDxfVHA+IF9fcmVzdWx0OworICBjb21wbGV4PF9UcD46Ol9kaXYoX196MS5fTV9yZSwgX196MS5fTV9pbSwKKyAgICAgICAgICAgICAgICAgICAgIF9fejIuX01fcmUsIF9fejIuX01faW0sCisgICAgICAgICAgICAgICAgICAgICBfX3Jlc3VsdC5fTV9yZSwgX19yZXN1bHQuX01faW0pOworICByZXR1cm4gX19yZXN1bHQ7Cit9CisKKy8vIENvbXBhcmlzb24gb3BlcmF0b3JzLgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIGJvb2wgX1NUTFBfQ0FMTCBvcGVyYXRvcj09KGNvbnN0IGNvbXBsZXg8X1RwPiYgX196MSwgY29uc3QgY29tcGxleDxfVHA+JiBfX3oyKQoreyByZXR1cm4gX196MS5fTV9yZSA9PSBfX3oyLl9NX3JlICYmIF9fejEuX01faW0gPT0gX196Mi5fTV9pbTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIGJvb2wgX1NUTFBfQ0FMTCBvcGVyYXRvcj09KGNvbnN0IGNvbXBsZXg8X1RwPiYgX196LCBjb25zdCBfVHAmIF9feCkKK3sgcmV0dXJuIF9fei5fTV9yZSA9PSBfX3ggJiYgX196Ll9NX2ltID09IDA7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBib29sIF9TVExQX0NBTEwgb3BlcmF0b3I9PShjb25zdCBfVHAmIF9feCwgY29uc3QgY29tcGxleDxfVHA+JiBfX3opCit7IHJldHVybiBfX3ggPT0gX196Ll9NX3JlICYmIDAgPT0gX196Ll9NX2ltOyB9CisKKy8vMDQvMjcvMDQgZHVtczogcmVtb3ZhbCBvZiB0aGlzIGNoZWNrLCBpZiBpdCBpcyByZXN0YWJsaXNoCisvL3BsZWFzZSBleHBsYWluIHdoeSB0aGUgb3RoZXIgb3BlcmF0b3JzIGFyZSBub3QgbWFjcm8gZ3VhcmRlZAorLy8jaWZkZWYgX1NUTFBfRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yIT0oY29uc3QgY29tcGxleDxfVHA+JiBfX3oxLCBjb25zdCBjb21wbGV4PF9UcD4mIF9fejIpCit7IHJldHVybiBfX3oxLl9NX3JlICE9IF9fejIuX01fcmUgfHwgX196MS5fTV9pbSAhPSBfX3oyLl9NX2ltOyB9CisKKy8vI2VuZGlmIC8qIF9TVExQX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUiAqLworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIGJvb2wgX1NUTFBfQ0FMTCBvcGVyYXRvciE9KGNvbnN0IGNvbXBsZXg8X1RwPiYgX196LCBjb25zdCBfVHAmIF9feCkKK3sgcmV0dXJuIF9fei5fTV9yZSAhPSBfX3ggfHwgX196Ll9NX2ltICE9IDA7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBib29sIF9TVExQX0NBTEwgb3BlcmF0b3IhPShjb25zdCBfVHAmIF9feCwgY29uc3QgY29tcGxleDxfVHA+JiBfX3opCit7IHJldHVybiBfX3ggIT0gX196Ll9NX3JlIHx8IDAgIT0gX196Ll9NX2ltOyB9CisKKy8vIE90aGVyIGJhc2ljIGFyaXRobWV0aWMgb3BlcmF0aW9ucwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfVHAgX1NUTFBfQ0FMTCByZWFsKGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KQoreyByZXR1cm4gX196Ll9NX3JlOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX1RwIF9TVExQX0NBTEwgaW1hZyhjb25zdCBjb21wbGV4PF9UcD4mIF9feikKK3sgcmV0dXJuIF9fei5fTV9pbTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorX1RwIF9TVExQX0NBTEwgYWJzKGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK19UcCBfU1RMUF9DQUxMIGFyZyhjb25zdCBjb21wbGV4PF9UcD4mIF9feik7CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX1RwIF9TVExQX0NBTEwgbm9ybShjb25zdCBjb21wbGV4PF9UcD4mIF9feikKK3sgcmV0dXJuIF9fei5fTV9yZSAqIF9fei5fTV9yZSArIF9fei5fTV9pbSAqIF9fei5fTV9pbTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIGNvbXBsZXg8X1RwPiBfU1RMUF9DQUxMIGNvbmooY29uc3QgY29tcGxleDxfVHA+JiBfX3opCit7IHJldHVybiBjb21wbGV4PF9UcD4oX196Ll9NX3JlLCAtX196Ll9NX2ltKTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorY29tcGxleDxfVHA+IF9TVExQX0NBTEwgcG9sYXIoY29uc3QgX1RwJiBfX3JobykKK3sgcmV0dXJuIGNvbXBsZXg8X1RwPihfX3JobywgMCk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2NvbXBsZXg8X1RwPiBfU1RMUF9DQUxMIHBvbGFyKGNvbnN0IF9UcCYgX19yaG8sIGNvbnN0IF9UcCYgX19waGkpOworCitfU1RMUF9URU1QTEFURV9OVUxMCitfU1RMUF9ERUNMU1BFQyBmbG9hdCBfU1RMUF9DQUxMIGFicyhjb25zdCBjb21wbGV4PGZsb2F0PiYpOworX1NUTFBfVEVNUExBVEVfTlVMTAorX1NUTFBfREVDTFNQRUMgZG91YmxlIF9TVExQX0NBTEwgYWJzKGNvbnN0IGNvbXBsZXg8ZG91YmxlPiYpOworX1NUTFBfVEVNUExBVEVfTlVMTAorX1NUTFBfREVDTFNQRUMgZmxvYXQgX1NUTFBfQ0FMTCBhcmcoY29uc3QgY29tcGxleDxmbG9hdD4mKTsKK19TVExQX1RFTVBMQVRFX05VTEwKK19TVExQX0RFQ0xTUEVDIGRvdWJsZSBfU1RMUF9DQUxMIGFyZyhjb25zdCBjb21wbGV4PGRvdWJsZT4mKTsKK19TVExQX1RFTVBMQVRFX05VTEwKK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8ZmxvYXQ+IF9TVExQX0NBTEwgcG9sYXIoY29uc3QgZmxvYXQmIF9fcmhvLCBjb25zdCBmbG9hdCYgX19waGkpOworX1NUTFBfVEVNUExBVEVfTlVMTAorX1NUTFBfREVDTFNQRUMgY29tcGxleDxkb3VibGU+IF9TVExQX0NBTEwgcG9sYXIoY29uc3QgZG91YmxlJiBfX3JobywgY29uc3QgZG91YmxlJiBfX3BoaSk7CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitfVHAgX1NUTFBfQ0FMTCBhYnMoY29uc3QgY29tcGxleDxfVHA+JiBfX3opCit7IHJldHVybiBfVHAoYWJzKGNvbXBsZXg8ZG91YmxlPihkb3VibGUoX196LnJlYWwoKSksIGRvdWJsZShfX3ouaW1hZygpKSkpKTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorX1RwIF9TVExQX0NBTEwgYXJnKGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KQoreyByZXR1cm4gX1RwKGFyZyhjb21wbGV4PGRvdWJsZT4oZG91YmxlKF9fei5yZWFsKCkpLCBkb3VibGUoX196LmltYWcoKSkpKSk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2NvbXBsZXg8X1RwPiBfU1RMUF9DQUxMIHBvbGFyKGNvbnN0IF9UcCYgX19yaG8sIGNvbnN0IF9UcCYgX19waGkpIHsKKyAgY29tcGxleDxkb3VibGU+IF9fdG1wID0gcG9sYXIoZG91YmxlKF9fcmhvKSwgZG91YmxlKF9fcGhpKSk7CisgIHJldHVybiBjb21wbGV4PF9UcD4oX1RwKF9fdG1wLnJlYWwoKSksIF9UcChfX3RtcC5pbWFnKCkpKTsKK30KKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19MT05HX0RPVUJMRSkKK19TVExQX1RFTVBMQVRFX05VTEwKK19TVExQX0RFQ0xTUEVDIGxvbmcgZG91YmxlIF9TVExQX0NBTEwgYXJnKGNvbnN0IGNvbXBsZXg8bG9uZyBkb3VibGU+Jik7CitfU1RMUF9URU1QTEFURV9OVUxMCitfU1RMUF9ERUNMU1BFQyBsb25nIGRvdWJsZSBfU1RMUF9DQUxMIGFicyhjb25zdCBjb21wbGV4PGxvbmcgZG91YmxlPiYpOworX1NUTFBfVEVNUExBVEVfTlVMTAorX1NUTFBfREVDTFNQRUMgY29tcGxleDxsb25nIGRvdWJsZT4gX1NUTFBfQ0FMTCBwb2xhcihjb25zdCBsb25nIGRvdWJsZSYsIGNvbnN0IGxvbmcgZG91YmxlJik7CisjZW5kaWYKKworCisjaWYgIWRlZmluZWQgKF9TVExQX1VTRV9OT19JT1NUUkVBTVMpCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworIyAgaWZuZGVmIF9TVExQX0lOVEVSTkFMX0lPU0ZXRAorIyAgICBpbmNsdWRlIDxzdGwvX2lvc2Z3ZC5oPgorIyAgZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKKy8vIENvbXBsZXggb3V0cHV0LCBpbiB0aGUgZm9ybSAocmUsaW0pLiAgV2UgdXNlIGEgdHdvLXN0ZXAgcHJvY2VzcworLy8gaW52b2x2aW5nIHN0cmluZ3N0cmVhbSBzbyB0aGF0IHdlIGdldCB0aGUgcGFkZGluZyByaWdodC4KK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgIF9TVExQX0NBTEwKK29wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLCBjb25zdCBjb21wbGV4PF9UcD4mIF9feik7CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX1NUTFBfQ0FMTAorb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsIGNvbXBsZXg8X1RwPiYgX196KTsKKworLy8gU3BlY2lhbGl6YXRpb25zIGZvciBuYXJyb3cgY2hhcmFjdGVyczsgbGV0cyB1cyBhdm9pZCB3aWRlbi4KKworX1NUTFBfT1BFUkFUT1JfVEVNUExBVEUKK19TVExQX0RFQ0xTUEVDIGJhc2ljX2lzdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiYgX1NUTFBfQ0FMTAorb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4mIF9faXMsIGNvbXBsZXg8ZmxvYXQ+JiBfX3opOworCitfU1RMUF9PUEVSQVRPUl9URU1QTEFURQorX1NUTFBfREVDTFNQRUMgYmFzaWNfaXN0cmVhbTxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+JiBfU1RMUF9DQUxMCitvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiYgX19pcywgY29tcGxleDxkb3VibGU+JiBfX3opOworCitfU1RMUF9PUEVSQVRPUl9URU1QTEFURQorX1NUTFBfREVDTFNQRUMgYmFzaWNfb3N0cmVhbTxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+JiBfU1RMUF9DQUxMCitvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiYgX19pcywgY29uc3QgY29tcGxleDxmbG9hdD4mIF9feik7CisKK19TVExQX09QRVJBVE9SX1RFTVBMQVRFCitfU1RMUF9ERUNMU1BFQyBiYXNpY19vc3RyZWFtPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4mIF9TVExQX0NBTEwKK29wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+JiBfX2lzLCBjb25zdCBjb21wbGV4PGRvdWJsZT4mIF9feik7CisKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9OT19MT05HX0RPVUJMRSkKK19TVExQX09QRVJBVE9SX1RFTVBMQVRFCitfU1RMUF9ERUNMU1BFQyBiYXNpY19pc3RyZWFtPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4mIF9TVExQX0NBTEwKK29wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+JiBfX2lzLCBjb21wbGV4PGxvbmcgZG91YmxlPiYgX196KTsKKworX1NUTFBfT1BFUkFUT1JfVEVNUExBVEUKK19TVExQX0RFQ0xTUEVDIGJhc2ljX29zdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiYgX1NUTFBfQ0FMTAorb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4mIF9faXMsIGNvbnN0IGNvbXBsZXg8bG9uZyBkb3VibGU+JiBfX3opOworCisjICBlbmRpZgorCisjICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUKSAmJiAhIGRlZmluZWQgKF9TVExQX05PX1dDSEFSX1QpCisKK19TVExQX0VYUE9SVF9URU1QTEFURSBiYXNpY19pc3RyZWFtPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4mIF9TVExQX0NBTEwKK29wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+JiwgY29tcGxleDxkb3VibGU+Jik7CitfU1RMUF9FWFBPUlRfVEVNUExBVEUgYmFzaWNfb3N0cmVhbTx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+JiBfU1RMUF9DQUxMCitvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPiYsIGNvbnN0IGNvbXBsZXg8ZG91YmxlPiYpOworX1NUTFBfRVhQT1JUX1RFTVBMQVRFIGJhc2ljX2lzdHJlYW08d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPiYgX1NUTFBfQ0FMTAorb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4mLCBjb21wbGV4PGZsb2F0PiYpOworX1NUTFBfRVhQT1JUX1RFTVBMQVRFIGJhc2ljX29zdHJlYW08d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPiYgX1NUTFBfQ0FMTAorb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4mLCBjb25zdCBjb21wbGV4PGZsb2F0PiYpOworCisjICAgIGlmICFkZWZpbmVkIChfU1RMUF9OT19MT05HX0RPVUJMRSkKK19TVExQX0VYUE9SVF9URU1QTEFURSBiYXNpY19pc3RyZWFtPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4mIF9TVExQX0NBTEwKK29wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+JiwgY29tcGxleDxsb25nIGRvdWJsZT4mKTsKK19TVExQX0VYUE9SVF9URU1QTEFURSBiYXNpY19vc3RyZWFtPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4mIF9TVExQX0NBTEwKK29wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+JiwgY29uc3QgY29tcGxleDxsb25nIGRvdWJsZT4mKTsKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworCisvLyBUcmFuc2NlbmRlbnRhbCBmdW5jdGlvbnMuICBUaGVzZSBhcmUgZGVmaW5lZCBvbmx5IGZvciBmbG9hdCwKKy8vICBkb3VibGUsIGFuZCBsb25nIGRvdWJsZS4gIChTcXJ0IGlzbid0IHRyYW5zY2VuZGVudGFsLCBvZiBjb3Vyc2UsCisvLyAgYnV0IGl0J3MgaW5jbHVkZWQgaW4gdGhpcyBzZWN0aW9uIGFueXdheS4pCisKK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8ZmxvYXQ+IF9TVExQX0NBTEwgc3FydChjb25zdCBjb21wbGV4PGZsb2F0PiYpOworCitfU1RMUF9ERUNMU1BFQyBjb21wbGV4PGZsb2F0PiBfU1RMUF9DQUxMIGV4cChjb25zdCBjb21wbGV4PGZsb2F0PiYpOworX1NUTFBfREVDTFNQRUMgY29tcGxleDxmbG9hdD4gX1NUTFBfQ0FMTCAgbG9nKGNvbnN0IGNvbXBsZXg8ZmxvYXQ+Jik7CitfU1RMUF9ERUNMU1BFQyBjb21wbGV4PGZsb2F0PiBfU1RMUF9DQUxMIGxvZzEwKGNvbnN0IGNvbXBsZXg8ZmxvYXQ+Jik7CisKK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8ZmxvYXQ+IF9TVExQX0NBTEwgcG93KGNvbnN0IGNvbXBsZXg8ZmxvYXQ+JiwgaW50KTsKK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8ZmxvYXQ+IF9TVExQX0NBTEwgcG93KGNvbnN0IGNvbXBsZXg8ZmxvYXQ+JiwgY29uc3QgZmxvYXQmKTsKK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8ZmxvYXQ+IF9TVExQX0NBTEwgcG93KGNvbnN0IGZsb2F0JiwgY29uc3QgY29tcGxleDxmbG9hdD4mKTsKK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8ZmxvYXQ+IF9TVExQX0NBTEwgcG93KGNvbnN0IGNvbXBsZXg8ZmxvYXQ+JiwgY29uc3QgY29tcGxleDxmbG9hdD4mKTsKKworX1NUTFBfREVDTFNQRUMgY29tcGxleDxmbG9hdD4gX1NUTFBfQ0FMTCBzaW4oY29uc3QgY29tcGxleDxmbG9hdD4mKTsKK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8ZmxvYXQ+IF9TVExQX0NBTEwgY29zKGNvbnN0IGNvbXBsZXg8ZmxvYXQ+Jik7CitfU1RMUF9ERUNMU1BFQyBjb21wbGV4PGZsb2F0PiBfU1RMUF9DQUxMIHRhbihjb25zdCBjb21wbGV4PGZsb2F0PiYpOworCitfU1RMUF9ERUNMU1BFQyBjb21wbGV4PGZsb2F0PiBfU1RMUF9DQUxMIHNpbmgoY29uc3QgY29tcGxleDxmbG9hdD4mKTsKK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8ZmxvYXQ+IF9TVExQX0NBTEwgY29zaChjb25zdCBjb21wbGV4PGZsb2F0PiYpOworX1NUTFBfREVDTFNQRUMgY29tcGxleDxmbG9hdD4gX1NUTFBfQ0FMTCB0YW5oKGNvbnN0IGNvbXBsZXg8ZmxvYXQ+Jik7CisKK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8ZG91YmxlPiBfU1RMUF9DQUxMIHNxcnQoY29uc3QgY29tcGxleDxkb3VibGU+Jik7CisKK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8ZG91YmxlPiBfU1RMUF9DQUxMIGV4cChjb25zdCBjb21wbGV4PGRvdWJsZT4mKTsKK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8ZG91YmxlPiBfU1RMUF9DQUxMIGxvZyhjb25zdCBjb21wbGV4PGRvdWJsZT4mKTsKK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8ZG91YmxlPiBfU1RMUF9DQUxMIGxvZzEwKGNvbnN0IGNvbXBsZXg8ZG91YmxlPiYpOworCitfU1RMUF9ERUNMU1BFQyBjb21wbGV4PGRvdWJsZT4gX1NUTFBfQ0FMTCBwb3coY29uc3QgY29tcGxleDxkb3VibGU+JiwgaW50KTsKK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8ZG91YmxlPiBfU1RMUF9DQUxMIHBvdyhjb25zdCBjb21wbGV4PGRvdWJsZT4mLCBjb25zdCBkb3VibGUmKTsKK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8ZG91YmxlPiBfU1RMUF9DQUxMIHBvdyhjb25zdCBkb3VibGUmLCBjb25zdCBjb21wbGV4PGRvdWJsZT4mKTsKK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8ZG91YmxlPiBfU1RMUF9DQUxMIHBvdyhjb25zdCBjb21wbGV4PGRvdWJsZT4mLCBjb25zdCBjb21wbGV4PGRvdWJsZT4mKTsKKworX1NUTFBfREVDTFNQRUMgY29tcGxleDxkb3VibGU+IF9TVExQX0NBTEwgc2luKGNvbnN0IGNvbXBsZXg8ZG91YmxlPiYpOworX1NUTFBfREVDTFNQRUMgY29tcGxleDxkb3VibGU+IF9TVExQX0NBTEwgY29zKGNvbnN0IGNvbXBsZXg8ZG91YmxlPiYpOworX1NUTFBfREVDTFNQRUMgY29tcGxleDxkb3VibGU+IF9TVExQX0NBTEwgdGFuKGNvbnN0IGNvbXBsZXg8ZG91YmxlPiYpOworCitfU1RMUF9ERUNMU1BFQyBjb21wbGV4PGRvdWJsZT4gX1NUTFBfQ0FMTCBzaW5oKGNvbnN0IGNvbXBsZXg8ZG91YmxlPiYpOworX1NUTFBfREVDTFNQRUMgY29tcGxleDxkb3VibGU+IF9TVExQX0NBTEwgY29zaChjb25zdCBjb21wbGV4PGRvdWJsZT4mKTsKK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8ZG91YmxlPiBfU1RMUF9DQUxMIHRhbmgoY29uc3QgY29tcGxleDxkb3VibGU+Jik7CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTE9OR19ET1VCTEUpCitfU1RMUF9ERUNMU1BFQyBjb21wbGV4PGxvbmcgZG91YmxlPiBfU1RMUF9DQUxMIHNxcnQoY29uc3QgY29tcGxleDxsb25nIGRvdWJsZT4mKTsKK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8bG9uZyBkb3VibGU+IF9TVExQX0NBTEwgZXhwKGNvbnN0IGNvbXBsZXg8bG9uZyBkb3VibGU+Jik7CitfU1RMUF9ERUNMU1BFQyBjb21wbGV4PGxvbmcgZG91YmxlPiBfU1RMUF9DQUxMIGxvZyhjb25zdCBjb21wbGV4PGxvbmcgZG91YmxlPiYpOworX1NUTFBfREVDTFNQRUMgY29tcGxleDxsb25nIGRvdWJsZT4gX1NUTFBfQ0FMTCBsb2cxMChjb25zdCBjb21wbGV4PGxvbmcgZG91YmxlPiYpOworCitfU1RMUF9ERUNMU1BFQyBjb21wbGV4PGxvbmcgZG91YmxlPiBfU1RMUF9DQUxMIHBvdyhjb25zdCBjb21wbGV4PGxvbmcgZG91YmxlPiYsIGludCk7CitfU1RMUF9ERUNMU1BFQyBjb21wbGV4PGxvbmcgZG91YmxlPiBfU1RMUF9DQUxMIHBvdyhjb25zdCBjb21wbGV4PGxvbmcgZG91YmxlPiYsIGNvbnN0IGxvbmcgZG91YmxlJik7CitfU1RMUF9ERUNMU1BFQyBjb21wbGV4PGxvbmcgZG91YmxlPiBfU1RMUF9DQUxMIHBvdyhjb25zdCBsb25nIGRvdWJsZSYsIGNvbnN0IGNvbXBsZXg8bG9uZyBkb3VibGU+Jik7CitfU1RMUF9ERUNMU1BFQyBjb21wbGV4PGxvbmcgZG91YmxlPiBfU1RMUF9DQUxMIHBvdyhjb25zdCBjb21wbGV4PGxvbmcgZG91YmxlPiYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wbGV4PGxvbmcgZG91YmxlPiYpOworCitfU1RMUF9ERUNMU1BFQyBjb21wbGV4PGxvbmcgZG91YmxlPiBfU1RMUF9DQUxMIHNpbihjb25zdCBjb21wbGV4PGxvbmcgZG91YmxlPiYpOworX1NUTFBfREVDTFNQRUMgY29tcGxleDxsb25nIGRvdWJsZT4gX1NUTFBfQ0FMTCBjb3MoY29uc3QgY29tcGxleDxsb25nIGRvdWJsZT4mKTsKK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8bG9uZyBkb3VibGU+IF9TVExQX0NBTEwgdGFuKGNvbnN0IGNvbXBsZXg8bG9uZyBkb3VibGU+Jik7CisKK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8bG9uZyBkb3VibGU+IF9TVExQX0NBTEwgc2luaChjb25zdCBjb21wbGV4PGxvbmcgZG91YmxlPiYpOworX1NUTFBfREVDTFNQRUMgY29tcGxleDxsb25nIGRvdWJsZT4gX1NUTFBfQ0FMTCBjb3NoKGNvbnN0IGNvbXBsZXg8bG9uZyBkb3VibGU+Jik7CitfU1RMUF9ERUNMU1BFQyBjb21wbGV4PGxvbmcgZG91YmxlPiBfU1RMUF9DQUxMIHRhbmgoY29uc3QgY29tcGxleDxsb25nIGRvdWJsZT4mKTsKKyNlbmRpZgorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNpZm5kZWYgX1NUTFBfTElOS19USU1FX0lOU1RBTlRJQVRJT04KKyMgIGluY2x1ZGUgPHN0bC9fY29tcGxleC5jPgorI2VuZGlmCisKKyNlbmRpZgorCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdGwvX2NvbmZpZ19jb21wYXRfcG9zdC5oIGIvc3RscG9ydC9zdGwvX2NvbmZpZ19jb21wYXRfcG9zdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzYjQxMTEKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9fY29uZmlnX2NvbXBhdF9wb3N0LmgKQEAgLTAsMCArMSw1MSBAQAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKyNpZiAxIC8qIGRlZiBfU1RMUF8zX0NPTVBBVElCSUxJVFkgKi8KKworIyBkZWZpbmUgX19TR0lfU1RMX1BPUlQgIF9TVExQT1JUX1ZFUlNJT04KKworIyBpZiBkZWZpbmVkIChfU1RMUF9ERUJVRykgJiYgISBkZWZpbmVkICggX19TVExfREVCVUcgKQorIyAgZGVmaW5lIF9fU1RMX0RFQlVHIF9TVExQX0RFQlVHCisjIGVuZGlmCisKKyMgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX05BTUVTUEFDRVMpCisjICB1bmRlZiAgX19TVExfVVNFX05BTUVTUEFDRVMKKyMgIGRlZmluZSBfX1NUTF9VU0VfTkFNRVNQQUNFUyBfU1RMUF9VU0VfTkFNRVNQQUNFUworIyBlbmRpZgorCisjIGlmIGRlZmluZWQgKF9TVExQX1VTRV9FWENFUFRJT05TKQorIyAgdW5kZWYgIF9fU1RMX1VTRV9FWENFUFRJT05TCisjICBkZWZpbmUgX19TVExfVVNFX0VYQ0VQVElPTlMgX1NUTFBfVVNFX0VYQ0VQVElPTlMKKyMgZW5kaWYKKworIyBpZiBkZWZpbmVkIChfU1RMUF9CRUdJTl9OQU1FU1BBQ0UpICYmICEgZGVmaW5lZCAoIF9fU1RMX0JFR0lOX05BTUVTUEFDRSApCisjICBkZWZpbmUgX19TVExfQkVHSU5fTkFNRVNQQUNFIF9TVExQX0JFR0lOX05BTUVTUEFDRQorIyAgZGVmaW5lIF9fU1RMX0VORF9OQU1FU1BBQ0UgX1NUTFBfRU5EX05BTUVTUEFDRQorIyAgZGVmaW5lIF9fU1RMX1ZFTkRPUl9TVEQgX1NUTFBfVkVORE9SX1NURAorIyAgZGVmaW5lIF9fU1RMX1ZFTkRPUl9DU1REIF9TVExQX1ZFTkRPUl9DU1RECisjIGVuZGlmCisjIGVuZGlmCisKKy8qCisjIGlmIGRlZmluZWQgKF9TVExQX1hYWCkgJiYgISBkZWZpbmVkICggX19TVExfWFhYICkKKyMgIGRlZmluZSBfX1NUTF9YWFggX1NUTFBfWFhYCisjIGVuZGlmCisqLworCisvKiA1LjAgLT4gNC42IGNvbXBhdGliaWxpdHkgc2VjdGlvbiAqLworI2lmIDEgLyogZGVmIF9TVExQXzQ2X0NPTVBBVElCSUxJVFkgKi8KKworLyogcHJvdmlkZSBhIHVuaWZvcm0gd2F5IHRvIGFjY2VzcyBmdWxsIGZ1bmN0aW9uYWxpdHkgKi8KKyMgZGVmaW5lIF9fc2xpc3RfXyAgICAgICAgIHNsaXN0CisjIGRlZmluZSBfX21hcF9fICAgICAgICAgICBtYXAKKyMgZGVmaW5lIF9fbXVsdGltYXBfXyAgICAgIG11bHRpbWFwCisjIGRlZmluZSBfX3NldF9fICAgICAgICAgICBzZXQKKyMgZGVmaW5lIF9fbXVsdGlzZXRfXyAgICAgIG11bHRpc2V0CisjIGRlZmluZSBfX2xpc3RfXyAgICAgICAgICBsaXN0CisjIGRlZmluZSBfX2hhc2hfbWFwX18gICAgICBoYXNoX21hcAorIyBkZWZpbmUgX19oYXNoX211bHRpbWFwX18gaGFzaF9tdWx0aW1hcAorIyBkZWZpbmUgX19oYXNoX3NldF9fICAgICAgaGFzaF9zZXQKKyMgZGVmaW5lIF9faGFzaF9tdWx0aXNldF9fIGhhc2hfbXVsdGlzZXQKKyMgZGVmaW5lIF9fdmVjdG9yX18gICAgICAgIHZlY3RvcgorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdGwvX2NvbnN0cnVjdC5oIGIvc3RscG9ydC9zdGwvX2NvbnN0cnVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzNjE4NzgKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9fY29uc3RydWN0LmgKQEAgLTAsMCArMSwyODkgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisvKiBOT1RFOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBTVEwgaGVhZGVycy4KKyAqICAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuCisgKi8KKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DT05TVFJVQ1RfSAorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9DT05TVFJVQ1RfSAorCisjaWYgIWRlZmluZWQgKF9TVExQX0RFQlVHX1VOSU5JVElBTElaRUQpICYmICFkZWZpbmVkIChfU1RMUF9JTlRFUk5BTF9DU1RSSU5HKQorIyAgaW5jbHVkZSA8c3RsL19jc3RyaW5nLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9ORVcKKyMgIGluY2x1ZGUgPHN0bC9fbmV3Lmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9JVEVSQVRPUl9CQVNFX0gKKyMgIGluY2x1ZGUgPHN0bC9faXRlcmF0b3JfYmFzZS5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfVFlQRV9UUkFJVFNfSAorIyAgaW5jbHVkZSA8c3RsL3R5cGVfdHJhaXRzLmg+CisjZW5kaWYKKworI2lmICFkZWZpbmVkIChfU1RMUF9NT1ZFX0NPTlNUUlVDVF9GV0tfSCkgJiYgIWRlZmluZWQgKF9TVExQX05PX01PVkVfU0VNQU5USUMpCisjICBpbmNsdWRlIDxzdGwvX21vdmVfY29uc3RydWN0X2Z3ay5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIHZvaWQgX19kZXN0cm95X2F1eChfVHAqIF9fcG9pbnRlciwgY29uc3QgX19mYWxzZV90eXBlJiAvKl9Ucml2aWFsX2Rlc3RydWN0b3IqLykKK3sgX19wb2ludGVyLT5+X1RwKCk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSB2b2lkIF9fZGVzdHJveV9hdXgoX1RwKiwgY29uc3QgX190cnVlX3R5cGUmIC8qX1RyaXZpYWxfZGVzdHJ1Y3RvciovKSB7fQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIHZvaWQgX0Rlc3Ryb3koX1RwKiBfX3BvaW50ZXIpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX3R5cGVfdHJhaXRzPF9UcD46Omhhc190cml2aWFsX2Rlc3RydWN0b3IgX1RyaXZpYWxfZGVzdHJ1Y3RvcjsKKyAgX19kZXN0cm95X2F1eChfX3BvaW50ZXIsIF9Ucml2aWFsX2Rlc3RydWN0b3IoKSk7CisjaWYgZGVmaW5lZCAoX1NUTFBfREVCVUdfVU5JTklUSUFMSVpFRCkKKyAgbWVtc2V0KF9fUkVJTlRFUlBSRVRfQ0FTVChjaGFyKiwgX19wb2ludGVyKSwgX1NUTFBfU0hSRURfQllURSwgc2l6ZW9mKF9UcCkpOworI2VuZGlmCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgdm9pZCBfRGVzdHJveV9Nb3ZlZChfVHAqIF9fcG9pbnRlcikgeworI2lmICFkZWZpbmVkIChfU1RMUF9OT19NT1ZFX1NFTUFOVElDKQorICB0eXBlZGVmIHR5cGVuYW1lIF9fbW92ZV90cmFpdHM8X1RwPjo6Y29tcGxldGUgX1RyaXZpYWxfZGVzdHJ1Y3RvcjsKKyAgX19kZXN0cm95X2F1eChfX3BvaW50ZXIsIF9Ucml2aWFsX2Rlc3RydWN0b3IoKSk7CisjICBpZiBkZWZpbmVkIChfU1RMUF9ERUJVR19VTklOSVRJQUxJWkVEKQorICBtZW1zZXQoKGNoYXIqKV9fcG9pbnRlciwgX1NUTFBfU0hSRURfQllURSwgc2l6ZW9mKF9UcCkpOworIyAgZW5kaWYKKyNlbHNlCisgIF9EZXN0cm95KF9fcG9pbnRlcik7CisjZW5kaWYKK30KKworI2lmIGRlZmluZWQgKG5ldykKKyMgIGRlZmluZSBfU1RMUF9ORVdfUkVERUZJTkUgbmV3CisjICB1bmRlZiBuZXcKKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1QxPgoraW5saW5lIHZvaWQgX0NvbnN0cnVjdF9hdXggKF9UMSogX19wLCBjb25zdCBfX2ZhbHNlX3R5cGUmKSB7CisgIG5ldyhfX3ApIF9UMSgpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1QxPgoraW5saW5lIHZvaWQgX0NvbnN0cnVjdF9hdXggKF9UMSogX19wLCBjb25zdCBfX3RydWVfdHlwZSYpIHsKKyNpZiBkZWZpbmVkIChfU1RMUF9ERUZfQ09OU1RfUExDVF9ORVdfQlVHKQorICAqX19wID0gX1QxKDApOworI2Vsc2UKKyAgLy8gV2UgdXNlIGJpbmFyeSBjb3B5aW5nIGZvciBQT0QgdHlwZXMgc2luY2UgaXQgcmVzdWx0cworICAvLyBpbiBhIGNvbnNpZGVyYWJseSBiZXR0ZXIgY29kZSBhdCBsZWFzdCBvbiBNU1ZDLgorICAqX19wID0gX1QxKCk7CisjZW5kaWYgLyogX1NUTFBfREVGX0NPTlNUX1BMQ1RfTkVXX0JVRyAqLworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1QxPgoraW5saW5lIHZvaWQgX0NvbnN0cnVjdChfVDEqIF9fcCkgeworI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHX1VOSU5JVElBTElaRUQpCisgIG1lbXNldCgoY2hhciopX19wLCBfU1RMUF9TSFJFRF9CWVRFLCBzaXplb2YoX1QxKSk7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChfU1RMUF9ERUZfQ09OU1RfUExDVF9ORVdfQlVHKQorICBfQ29uc3RydWN0X2F1eCAoX19wLCBfSGFzRGVmYXVsdFplcm9WYWx1ZShfX3ApLl9BbnN3ZXIoKSk7CisjZWxzZQorICBfQ29uc3RydWN0X2F1eCAoX19wLCBfSXNfUE9EKF9fcCkuX0Fuc3dlcigpKTsKKyNlbmRpZiAvKiBfU1RMUF9ERUZfQ09OU1RfUExDVF9ORVdfQlVHICovCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgdm9pZCBfQ29weV9Db25zdHJ1Y3RfYXV4KF9UcCogX19wLCBjb25zdCBfVHAmIF9fdmFsLCBjb25zdCBfX2ZhbHNlX3R5cGUmKSB7CisgIG5ldyhfX3ApIF9UcChfX3ZhbCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgdm9pZCBfQ29weV9Db25zdHJ1Y3RfYXV4KF9UcCogX19wLCBjb25zdCBfVHAmIF9fdmFsLCBjb25zdCBfX3RydWVfdHlwZSYpIHsKKyAgLy8gV2UgdXNlIGJpbmFyeSBjb3B5aW5nIGZvciBQT0QgdHlwZXMgc2luY2UgaXQgcmVzdWx0cworICAvLyBpbiBhIGNvbnNpZGVyYWJseSBiZXR0ZXIgY29kZSBhdCBsZWFzdCBvbiBNU1ZDLgorICAqX19wID0gX192YWw7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgdm9pZCBfQ29weV9Db25zdHJ1Y3QoX1RwKiBfX3AsIGNvbnN0IF9UcCYgX192YWwpIHsKKyNpZiBkZWZpbmVkIChfU1RMUF9ERUJVR19VTklOSVRJQUxJWkVEKQorICBtZW1zZXQoKGNoYXIqKV9fcCwgX1NUTFBfU0hSRURfQllURSwgc2l6ZW9mKF9UcCkpOworI2VuZGlmCisgIF9Db3B5X0NvbnN0cnVjdF9hdXgoX19wLCBfX3ZhbCwgX0lzX1BPRChfX3ApLl9BbnN3ZXIoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KK2lubGluZSB2b2lkIF9QYXJhbV9Db25zdHJ1Y3RfYXV4KF9UMSogX19wLCBjb25zdCBfVDImIF9fdmFsLCBjb25zdCBfX2ZhbHNlX3R5cGUmKSB7CisgIG5ldyhfX3ApIF9UMShfX3ZhbCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KK2lubGluZSB2b2lkIF9QYXJhbV9Db25zdHJ1Y3RfYXV4KF9UMSogX19wLCBjb25zdCBfVDImIF9fdmFsLCBjb25zdCBfX3RydWVfdHlwZSYpIHsKKyAgLy8gV2UgdXNlIGJpbmFyeSBjb3B5aW5nIGZvciBQT0QgdHlwZXMgc2luY2UgaXQgcmVzdWx0cworICAvLyBpbiBhIGNvbnNpZGVyYWJseSBiZXR0ZXIgY29kZSBhdCBsZWFzdCBvbiBNU1ZDLgorICAqX19wID0gX1QxKF9fdmFsKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgoraW5saW5lIHZvaWQgX1BhcmFtX0NvbnN0cnVjdChfVDEqIF9fcCwgY29uc3QgX1QyJiBfX3ZhbCkgeworI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHX1VOSU5JVElBTElaRUQpCisgIG1lbXNldCgoY2hhciopX19wLCBfU1RMUF9TSFJFRF9CWVRFLCBzaXplb2YoX1QxKSk7CisjZW5kaWYKKyAgX1BhcmFtX0NvbnN0cnVjdF9hdXgoX19wLCBfX3ZhbCwgX0lzX1BPRChfX3ApLl9BbnN3ZXIoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KK2lubGluZSB2b2lkIF9Nb3ZlX0NvbnN0cnVjdF9BdXgoX1QxKiBfX3AsIF9UMiYgX192YWwsIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypfSXNQT0QqLykgeworI2lmICFkZWZpbmVkIChfU1RMUF9OT19NT1ZFX1NFTUFOVElDKQorICBuZXcoX19wKSBfVDEoX1NUTFBfUFJJViBfQXNNb3ZlU291cmNlKF9fdmFsKSk7CisjZWxzZQorICBfUGFyYW1fQ29uc3RydWN0KF9fcCwgX192YWwpOworI2VuZGlmCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KK2lubGluZSB2b2lkIF9Nb3ZlX0NvbnN0cnVjdF9BdXgoX1QxKiBfX3AsIF9UMiYgX192YWwsIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKl9Jc1BPRCovKSB7CisgIC8vIFdlIHVzZSBiaW5hcnkgY29weWluZyBmb3IgUE9EIHR5cGVzIHNpbmNlIGl0IHJlc3VsdHMKKyAgLy8gaW4gYSBjb25zaWRlcmFibHkgYmV0dGVyIGNvZGUgYXQgbGVhc3Qgb24gTVNWQy4KKyAgKl9fcCA9IF9UMShfX3ZhbCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KK2lubGluZSB2b2lkIF9Nb3ZlX0NvbnN0cnVjdChfVDEqIF9fcCwgX1QyJiBfX3ZhbCkgeworI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHX1VOSU5JVElBTElaRUQpCisgIG1lbXNldCgoY2hhciopX19wLCBfU1RMUF9TSFJFRF9CWVRFLCBzaXplb2YoX1QxKSk7CisjZW5kaWYKKyAgX01vdmVfQ29uc3RydWN0X0F1eChfX3AsIF9fdmFsLCBfSXNfUE9EKF9fcCkuX0Fuc3dlcigpKTsKK30KKworI2lmIGRlZmluZWQoX1NUTFBfTkVXX1JFREVGSU5FKQorIyAgaWYgZGVmaW5lZCAoREVCVUdfTkVXKQorIyAgICBkZWZpbmUgbmV3IERFQlVHX05FVworIyAgZW5kaWYKKyMgIHVuZGVmIF9TVExQX05FV19SRURFRklORQorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yLCBjbGFzcyBfVHA+CitfU1RMUF9JTkxJTkVfTE9PUCB2b2lkCitfX2Rlc3Ryb3lfcmFuZ2VfYXV4KF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsIF9UcCosIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypfVHJpdmlhbF9kZXN0cnVjdG9yKi8pIHsKKyAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KSB7CisgICAgX19kZXN0cm95X2F1eCgmKCpfX2ZpcnN0KSwgX19mYWxzZV90eXBlKCkpOworI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHX1VOSU5JVElBTElaRUQpCisgICAgbWVtc2V0KChjaGFyKikmKCpfX2ZpcnN0KSwgX1NUTFBfU0hSRURfQllURSwgc2l6ZW9mKF9UcCkpOworI2VuZGlmCisgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3IsIGNsYXNzIF9UcD4KKyNpZiBkZWZpbmVkIChfU1RMUF9ERUJVR19VTklOSVRJQUxJWkVEKQorX1NUTFBfSU5MSU5FX0xPT1Agdm9pZAorX19kZXN0cm95X3JhbmdlX2F1eChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LCBfVHAqLCBjb25zdCBfX3RydWVfdHlwZSYgLypfVHJpdmlhbF9kZXN0cnVjdG9yKi8pIHsKKyAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorICAgIG1lbXNldCgoY2hhciopJigqX19maXJzdCksIF9TVExQX1NIUkVEX0JZVEUsIHNpemVvZihfVHApKTsKK30KKyNlbHNlCitpbmxpbmUgdm9pZAorX19kZXN0cm95X3JhbmdlX2F1eChfRm9yd2FyZEl0ZXJhdG9yLCBfRm9yd2FyZEl0ZXJhdG9yLCBfVHAqLCBjb25zdCBfX3RydWVfdHlwZSYgLypfVHJpdmlhbF9kZXN0cnVjdG9yKi8pIHt9CisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3IsIGNsYXNzIF9UcD4KK2lubGluZSB2b2lkCitfX2Rlc3Ryb3lfcmFuZ2UoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwgX1RwICpfX3B0cikgeworICB0eXBlZGVmIHR5cGVuYW1lIF9fdHlwZV90cmFpdHM8X1RwPjo6aGFzX3RyaXZpYWxfZGVzdHJ1Y3RvciBfVHJpdmlhbF9kZXN0cnVjdG9yOworICBfX2Rlc3Ryb3lfcmFuZ2VfYXV4KF9fZmlyc3QsIF9fbGFzdCwgX19wdHIsIF9Ucml2aWFsX2Rlc3RydWN0b3IoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgoraW5saW5lIHZvaWQgX0Rlc3Ryb3lfUmFuZ2UoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCkgeworICBfX2Rlc3Ryb3lfcmFuZ2UoX19maXJzdCwgX19sYXN0LCBfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IpKTsKK30KKworaW5saW5lIHZvaWQgX0Rlc3Ryb3lfUmFuZ2UoY2hhciosIGNoYXIqKSB7fQorI2lmIGRlZmluZWQgKF9TVExQX0hBU19XQ0hBUl9UKSAvLyBkd2EgOC8xNS85NworaW5saW5lIHZvaWQgX0Rlc3Ryb3lfUmFuZ2Uod2NoYXJfdCosIHdjaGFyX3QqKSB7fQoraW5saW5lIHZvaWQgX0Rlc3Ryb3lfUmFuZ2UoY29uc3Qgd2NoYXJfdCosIGNvbnN0IHdjaGFyX3QqKSB7fQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yLCBjbGFzcyBfVHA+CitpbmxpbmUgdm9pZAorX19kZXN0cm95X212X3NyY3MoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwgX1RwICpfX3B0cikgeworICB0eXBlZGVmIHR5cGVuYW1lIF9fbW92ZV90cmFpdHM8X1RwPjo6Y29tcGxldGUgX0NvbXBsZXRlTW92ZTsKKyAgX19kZXN0cm95X3JhbmdlX2F1eChfX2ZpcnN0LCBfX2xhc3QsIF9fcHRyLCBfQ29tcGxldGVNb3ZlKCkpOworfQorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgoraW5saW5lIHZvaWQgX0Rlc3Ryb3lfTW92ZWRfUmFuZ2UoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCkKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKK3sgX19kZXN0cm95X212X3NyY3MoX19maXJzdCwgX19sYXN0LCBfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IpKTsgfQorI2Vsc2UKK3sgX0Rlc3Ryb3lfUmFuZ2UoX19maXJzdCwgX19sYXN0KTsgfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9ERUZfQ09OU1RfREVGX1BBUkFNX0JVRykKKy8vIFRob3NlIGFkYXB0b3JzIGFyZSBoZXJlIHRvIGZpeCBjb21tb24gY29tcGlsZXIgYnVnIHJlZ2FyZGluZyBidWlsdGluczoKKy8vIGV4cHJlc3Npb25zIGxpa2UgaW50IGsgPSBpbnQoKSBzaG91bGQgaW5pdGlhbGl6ZSBrIHRvIDAKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX1RwIF9fZGVmYXVsdF9jb25zdHJ1Y3RlZF9hdXgoX1RwKiwgY29uc3QgX19mYWxzZV90eXBlJikgeworICByZXR1cm4gX1RwKCk7Cit9Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIF9UcCBfX2RlZmF1bHRfY29uc3RydWN0ZWRfYXV4KF9UcCosIGNvbnN0IF9fdHJ1ZV90eXBlJikgeworICByZXR1cm4gX1RwKDApOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIF9UcCBfX2RlZmF1bHRfY29uc3RydWN0ZWQoX1RwKiBfX3ApIHsKKyAgcmV0dXJuIF9fZGVmYXVsdF9jb25zdHJ1Y3RlZF9hdXgoX19wLCBfSGFzRGVmYXVsdFplcm9WYWx1ZShfX3ApLl9BbnN3ZXIoKSk7Cit9CisKKyMgIGRlZmluZSBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKF9UVHApIF9fZGVmYXVsdF9jb25zdHJ1Y3RlZCgoX1RUcCopMCkKKyNlbHNlCisjICBkZWZpbmUgX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRChfVFRwKSBfVFRwKCkKKyNlbmRpZiAvKiBfU1RMUF9ERUZfQ09OU1RfREVGX1BBUkFNX0JVRyAqLworCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fQU5BQ0hST05JU01TKQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE9sZCBuYW1lcyBmcm9tIHRoZSBIUCBTVEwuCisKK3RlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KK2lubGluZSB2b2lkIGNvbnN0cnVjdChfVDEqIF9fcCwgY29uc3QgX1QyJiBfX3ZhbCkge19QYXJhbV9Db25zdHJ1Y3QoX19wLCBfX3ZhbCk7IH0KK3RlbXBsYXRlIDxjbGFzcyBfVDE+CitpbmxpbmUgdm9pZCBjb25zdHJ1Y3QoX1QxKiBfX3ApIHsgX1NUTFBfU1REOjpfQ29uc3RydWN0KF9fcCk7IH0KK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgdm9pZCBkZXN0cm95KF9UcCogX19wb2ludGVyKSB7ICBfU1RMUF9TVEQ6Ol9EZXN0cm95KF9fcG9pbnRlcik7IH0KK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgoraW5saW5lIHZvaWQgZGVzdHJveShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KSB7IF9TVExQX1NURDo6X0Rlc3Ryb3lfUmFuZ2UoX19maXJzdCwgX19sYXN0KTsgfQorI2VuZGlmIC8qIF9TVExQX05PX0FOQUNIUk9OSVNNUyAqLworCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9DT05TVFJVQ1RfSCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RsL19wcm9sb2cuaCBiL3N0bHBvcnQvc3RsL19jcHJvbG9nLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHN0bC9fcHJvbG9nLmgKcmVuYW1lIHRvIHN0bHBvcnQvc3RsL19jcHJvbG9nLmgKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL19jc2V0am1wLmggYi9zdGxwb3J0L3N0bC9fY3NldGptcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMTMyYzEKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9fY3NldGptcC5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NTRVRKTVAKKyNkZWZpbmUgX1NUTFBfSU5URVJOQUxfQ1NFVEpNUAorCisvLyBpZiB0aGUgbWFjcm8gaXMgb24sIHRoZSBoZWFkZXIgaXMgYWxyZWFkeSB0aGVyZQorI2lmICFkZWZpbmVkIChzZXRqbXApCisjICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfTkVXX0NfSEVBREVSUykKKyMgICAgaWYgZGVmaW5lZCAoX1NUTFBfSEFTX0lOQ0xVREVfTkVYVCkKKyMgICAgICBpbmNsdWRlX25leHQgPGNzZXRqbXA+CisjICAgIGVsc2UKKyMgICAgICBpbmNsdWRlIF9TVExQX05BVElWRV9DUFBfQ19IRUFERVIoY3NldGptcCkKKyMgICAgZW5kaWYKKyMgIGVsc2UKKyMgICAgaW5jbHVkZSA8c2V0am1wLmg+CisjICBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9JTVBPUlRfVkVORE9SX0NTVEQpCisKKyMgIGlmIGRlZmluZWQgKF9fQk9STEFORENfXykgJiYgZGVmaW5lZCAoX1NUTFBfVVNFX05FV19DX0hFQURFUlMpCisvKiBGb3IgQm9ybGFuZCwgZXZlbiBpZiBzdGRqbXAuaCBpcyBpbmNsdWRlZCBzeW1ib2xzIHdvbid0IGJlIGluIGdsb2JhbCBuYW1lc3BhY2UKKyAqIHNvIHdlIG5lZWQgdG8gcmVhY2ggdGhlbSBpbiB2ZW5kb3IgbmFtZXNwYWNlOgorICovCisjICAgIHVuZGVmIF9TVExQX05BVElWRV9TRVRKTVBfSF9JTkNMVURFRAorIyAgZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisjICBpZiAhZGVmaW5lZCAoX1NUTFBfTkFUSVZFX1NFVEpNUF9IX0lOQ0xVREVEKQordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmptcF9idWY7CisjICBlbHNlCisvLyBpZiBzZXRqbXAuaCB3YXMgaW5jbHVkZWQgZmlyc3QsIHRoaXMgaXMgaW4gZ2xvYmFsIG5hbWVzcGFjZSwgbm90IGluCisvLyB2ZW5kb3IncyBzdGQuICAtIDIwMDUtMDgtMDQsIHB0cgordXNpbmcgOjpqbXBfYnVmOworIyAgZW5kaWYKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9OT19DU1REX0ZVTkNUSU9OX0lNUE9SVFMpCisjICAgIGlmICFkZWZpbmVkIChzZXRqbXApCisjICAgICAgaWYgIWRlZmluZWQgKF9fTVNMX18pIHx8ICgoX19NU0xfXyA+IDB4NzAwMSkgJiYgKF9fTVNMX18gPCAweDgwMDApKQorIyAgICAgICAgaWZuZGVmIF9TVExQX05BVElWRV9TRVRKTVBfSF9JTkNMVURFRAordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnNldGptcDsKKyMgICAgICAgIGVsc2UKK3VzaW5nIDo6c2V0am1wOworIyAgICAgICAgZW5kaWYKKyMgICAgICBlbmRpZgorIyAgICBlbmRpZgorIyAgICBpZiAhZGVmaW5lZCAoX1NUTFBfTkFUSVZFX1NFVEpNUF9IX0lOQ0xVREVEKQordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmxvbmdqbXA7CisjICAgIGVsc2UKK3VzaW5nIDo6bG9uZ2ptcDsKKyMgICAgZW5kaWYKKyMgIGVuZGlmCitfU1RMUF9FTkRfTkFNRVNQQUNFCisjZW5kaWYgLyogX1NUTFBfSU1QT1JUX1ZFTkRPUl9DU1REICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdGwvX2NzaWduYWwuaCBiL3N0bHBvcnQvc3RsL19jc2lnbmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUxODQ2YgotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc3RsL19jc2lnbmFsLmgKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1NJR05BTAorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9DU0lHTkFMCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfV0NFKQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX05FV19DX0hFQURFUlMpCisjICAgIGlmIGRlZmluZWQgKF9TVExQX0hBU19JTkNMVURFX05FWFQpCisjICAgICAgaW5jbHVkZV9uZXh0IDxjc2lnbmFsPgorIyAgICBlbHNlCisjICAgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSEVBREVSKGNzaWduYWwpCisjICAgIGVuZGlmCisjICBlbHNlCisjICAgIGluY2x1ZGUgPHNpZ25hbC5oPgorIyAgZW5kaWYKKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfSU1QT1JUX1ZFTkRPUl9DU1REKQorX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisjICAgIGlmICFkZWZpbmVkIChfU1RMUF9OT19DU1REX0ZVTkNUSU9OX0lNUE9SVFMpCit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6c2lnbmFsOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnJhaXNlOworIyAgICBlbmRpZiAvKiBfU1RMUF9OT19DU1REX0ZVTkNUSU9OX0lNUE9SVFMgKi8KK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpzaWdfYXRvbWljX3Q7CitfU1RMUF9FTkRfTkFNRVNQQUNFCisjICBlbmRpZiAvKiBfU1RMUF9JTVBPUlRfVkVORE9SX0NTVEQgKi8KKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfQ1NJR05BTCAqLwpkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdGwvX2NzdGRhcmcuaCBiL3N0bHBvcnQvc3RsL19jc3RkYXJnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk4ZjMxYwotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc3RsL19jc3RkYXJnLmgKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKi8KKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DU1REQVJHCisjZGVmaW5lIF9TVExQX0lOVEVSTkFMX0NTVERBUkcKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9ORVdfQ19IRUFERVJTKQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfSEFTX0lOQ0xVREVfTkVYVCkKKyMgICAgaW5jbHVkZV9uZXh0IDxjc3RkYXJnPgorIyAgZWxzZQorIyAgICBpbmNsdWRlIF9TVExQX05BVElWRV9DUFBfQ19IRUFERVIoY3N0ZGFyZykKKyMgIGVuZGlmCisjZWxzZQorIyAgaW5jbHVkZSA8c3RkYXJnLmg+CisjZW5kaWYKKworI2lmZGVmIF9TVExQX0lNUE9SVF9WRU5ET1JfQ1NURAorX1NUTFBfQkVHSU5fTkFNRVNQQUNFCit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6dmFfbGlzdDsKK19TVExQX0VORF9OQU1FU1BBQ0UKKyNlbmRpZiAvKiBfU1RMUF9JTVBPUlRfVkVORE9SX0NTVEQgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9fY3N0ZGRlZi5oIGIvc3RscG9ydC9zdGwvX2NzdGRkZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWE1ODVjCi0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvX2NzdGRkZWYuaApAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DU1REREVGCisjZGVmaW5lIF9TVExQX0lOVEVSTkFMX0NTVERERUYKKworIyAgaWYgKF9fR05VQ19fID49IDMpICYmIGRlZmluZWQgKF9fQ1lHV0lOX18pIC8vIHRoaXMgdG90YWwgSEFDSyBpcyB0aGUgb25seSBleHBlZGllbnQgd2F5IEkgY291bGQgY3lnd2luIHRvIHdvcmsgd2l0aCBHQ0MgMy4wCisjICAgIGRlZmluZSBfX25lZWRfd2ludF90IC8vIG1vc3RseSBiZWNhdXNlIHdpbnRfdCBkaWRuJ3Qgc2VlbSB0byBnZXQgZGVmaW5lZCBvdGhlcndpc2UgOigKKyMgICAgZGVmaW5lIF9fbmVlZF93Y2hhcl90CisjICAgIGRlZmluZSBfX25lZWRfc2l6ZV90CisjICAgIGRlZmluZSBfX25lZWRfcHRyZGlmZl90CisjICAgIGRlZmluZSBfX25lZWRfTlVMTAorIyAgZW5kaWYKKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX05FV19DX0hFQURFUlMpCisjICAgIGlmIGRlZmluZWQgKF9TVExQX0hBU19JTkNMVURFX05FWFQpCisjICAgICAgaW5jbHVkZV9uZXh0IDxjc3RkZGVmPgorIyAgICBlbHNlCisjICAgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSEVBREVSKGNzdGRkZWYpCisjICAgIGVuZGlmCisjICBlbHNlCisjICAgIGluY2x1ZGUgPHN0ZGRlZi5oPgorIyAgZW5kaWYKKworIyAgaWZkZWYgX1NUTFBfSU1QT1JUX1ZFTkRPUl9DU1RECitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpwdHJkaWZmX3Q7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6c2l6ZV90OworX1NUTFBfRU5EX05BTUVTUEFDRQorIyAgZW5kaWYgLyogX1NUTFBfSU1QT1JUX1ZFTkRPUl9DU1REICovCisKKyNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9DU1REREVGICovCmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9fY3N0ZGlvLmggYi9zdGxwb3J0L3N0bC9fY3N0ZGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjcyMzZmMgotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc3RsL19jc3RkaW8uaApAQCAtMCwwICsxLDEyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1NURElPCisjZGVmaW5lIF9TVExQX0lOVEVSTkFMX0NTVERJTworCisjaWYgZGVmaW5lZCAoX19MeW54X18pCisjICBpZiBkZWZpbmVkIChfU1RMUF9IQVNfSU5DTFVERV9ORVhUKQorIyAgICBpbmNsdWRlX25leHQgPHN0ZGFyZy5oPgorIyAgZWxzZQorIyAgICBpbmNsdWRlIF9TVExQX05BVElWRV9DX0hFQURFUihzdGRhcmcuaCkKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9ORVdfQ19IRUFERVJTKQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfSEFTX0lOQ0xVREVfTkVYVCkKKyMgICAgaW5jbHVkZV9uZXh0IDxjc3RkaW8+CisjICBlbHNlCisjICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUihjc3RkaW8pCisjICBlbmRpZgorI2Vsc2UKKyMgIGluY2x1ZGUgPHN0ZGlvLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fTVdFUktTX18pCisjICB1bmRlZiBzdGRpbgorIyAgdW5kZWYgc3Rkb3V0CisjICB1bmRlZiBzdGRlcnIKKyMgIGRlZmluZSBzdGRpbiAgICgmX1NUTFBfVkVORE9SX0NTVEQ6Ol9fZmlsZXNbMF0pCisjICBkZWZpbmUgc3Rkb3V0ICAoJl9TVExQX1ZFTkRPUl9DU1REOjpfX2ZpbGVzWzFdKQorIyAgZGVmaW5lIHN0ZGVyciAgKCZfU1RMUF9WRU5ET1JfQ1NURDo6X19maWxlc1syXSkKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfTVNWQ19MSUIpICYmIChfU1RMUF9NU1ZDX0xJQiA8IDE0MDApIHx8IGRlZmluZWQgKF9TVExQX1VTSU5HX1BMQVRGT1JNX1NES19DT01QSUxFUikKK2lubGluZSBpbnQgdnNucHJpbnRmKGNoYXIgKnMxLCBzaXplX3QgbiwgY29uc3QgY2hhciAqczIsIHZhX2xpc3QgdikKK3sgcmV0dXJuIF9TVExQX1ZFTkRPUl9DU1REOjpfdnNucHJpbnRmKHMxLCBuLCBzMiwgdik7IH0KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfSU1QT1JUX1ZFTkRPUl9DU1REICkKK19TVExQX0JFR0lOX05BTUVTUEFDRQordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OkZJTEU7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6ZnBvc190OwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnNpemVfdDsKKworLy8gdW5kZWYgb2Jzb2xldGUgbWFjcm9zCisjICB1bmRlZiBwdXRjCisjICB1bmRlZiBnZXRjCisjICB1bmRlZiBnZXRjaGFyCisjICB1bmRlZiBwdXRjaGFyCisjICB1bmRlZiBmZW9mCisjICB1bmRlZiBmZXJyb3IKKworIyAgaWYgIWRlZmluZWQgKF9TVExQX05PX0NTVERfRlVOQ1RJT05fSU1QT1JUUykKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpjbGVhcmVycjsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpmY2xvc2U7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6ZmVvZjsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpmZXJyb3I7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6ZmZsdXNoOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmZnZXRjOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmZnZXRwb3M7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6ZmdldHM7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6Zm9wZW47Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6ZnByaW50ZjsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpmcHV0YzsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpmcHV0czsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpmcmVhZDsKKyMgICAgaWYgIWRlZmluZWQgKF9XSU4zMl9XQ0UpIHx8IChfV0lOMzJfV0NFIDwgNDAwKQordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmZyZW9wZW47CisjICAgIGVuZGlmCit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6ZnNjYW5mOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmZzZWVrOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmZzZXRwb3M7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6ZnRlbGw7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6ZndyaXRlOworCisjICAgIGlmICAhKGRlZmluZWQgKF9fSUJNQ1BQX18pICYmIChfX0lCTUNQUF9fID49IDUwMCkpCisjICAgICAgaWYgIWRlZmluZWQgKF9XSU4zMl9XQ0UpIHx8IChfV0lOMzJfV0NFIDwgNDAwKSAvLyBTdXBwbGllZCBhcyBtYWNyb3MsIFRPRE86IHVzZSBpbmxpbmUgZnVuY3Rpb24gdG8gcmVkaXJlY3QgdG8gdGhlIG1hY3Jvcz8KKyB1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6Z2V0YzsKKyB1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6cHV0YzsKKyMgICAgICBlbmRpZgorIHVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpnZXRjaGFyOworIHVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpwdXRjaGFyOworIyAgICBlbmRpZgorCit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6Z2V0czsKKyMgICAgaWYgIWRlZmluZWQgKF9XSU4zMl9XQ0UpIHx8IChfV0lOMzJfV0NFIDwgNDAwKQordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnBlcnJvcjsKKyMgICAgZW5kaWYKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpwcmludGY7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6cHV0czsKKyMgICAgaWYgIWRlZmluZWQgKF9XSU4zMl9XQ0UpIHx8IChfV0lOMzJfV0NFIDwgNDAwKQordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnJlbW92ZTsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpyZW5hbWU7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6cmV3aW5kOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnNldGJ1ZjsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjp0bXBmaWxlOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnRtcG5hbTsKKyMgICAgZW5kaWYKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpzY2FuZjsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpzZXR2YnVmOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnNwcmludGY7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6c3NjYW5mOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnVuZ2V0YzsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjp2ZnByaW50ZjsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjp2cHJpbnRmOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnZzcHJpbnRmOworIyAgICBpZiAoZGVmaW5lZCAoX19NV0VSS1NfXykgfHwgKGRlZmluZWQgKF9TVExQX01TVkNfTElCKSAmJiAoX1NUTFBfTVNWQ19MSUIgPCAxNDAwKSkgfHwgXAorICAgICAgICAoZGVmaW5lZCAoX19CT1JMQU5EQ19fKSkpCit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6dnNucHJpbnRmOworIyAgICBlbmRpZgorIyAgZW5kaWYgLyogX1NUTFBfTk9fQ1NURF9GVU5DVElPTl9JTVBPUlRTICovCitfU1RMUF9FTkRfTkFNRVNQQUNFCisjZW5kaWYgLyogX1NUTFBfSU1QT1JUX1ZFTkRPUl9DU1REICovCisKKyNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9DU1RESU8gKi8KZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL19jc3RkbGliLmggYi9zdGxwb3J0L3N0bC9fY3N0ZGxpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMWRkMzUKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9fY3N0ZGxpYi5oCkBAIC0wLDAgKzEsMTgwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DU1RETElCCisjZGVmaW5lIF9TVExQX0lOVEVSTkFMX0NTVERMSUIKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9ORVdfQ19IRUFERVJTKQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfSEFTX0lOQ0xVREVfTkVYVCkKKyMgICAgaW5jbHVkZV9uZXh0IDxjc3RkbGliPgorIyAgZWxzZQorIyAgICBpbmNsdWRlIF9TVExQX05BVElWRV9DUFBfQ19IRUFERVIoY3N0ZGxpYikKKyMgIGVuZGlmCisjZWxzZQorIyAgaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fQk9STEFORENfXykgJiYgIWRlZmluZWQgKF9fbGludXhfXykKKy8qIEJvcmxhbmQgcHJvY2Vzcy5oIGhlYWRlciBkbyBub3QgYnJpbmcgYW55dGhpbmcgaGVyZSBhbmQgaXMganVzdCBpbmNsdWRlZAorICogaW4gb3JkZXIgdG8gYXZvaWQgaW5jbHVzaW9uIGxhdGVyLiBUaGlzIGhlYWRlciBjYW5ub3QgYmUgaW5jbHVkZWQgbGF0ZXIKKyAqIGJlY2F1c2UgQm9ybGFuZCBjb21waWxlciBjb25zaWRlciB0aGF0IGZvciBpbnN0YW5jZSB0aGUgYWJvcnQgZnVuY3Rpb24KKyAqIGRlZmluZWQgYXMgZXh0ZXJuICJDIiBjYW5ub3QgYmUgb3ZlcmxvYWRlZCBhbmQgaXQgZmluZHMgMiAib3ZlcmxvYWRzIiwKKyAqIG9uY2UgaW4gbmF0aXZlIHN0ZCBuYW1lc3BhY2UgYW5kIHRoZSBvdGhlciBpbiBTVExwb3J0IG5hbWVzcGFjZS4uLgorICovCisjICBpbmNsdWRlIDxwcm9jZXNzLmg+CisjZW5kaWYKKworLyogb24gZXZjMy9ldmM0IGluY2x1ZGluZyBzdGRsaWIuaCBhbHNvIGRlZmluZXMgc2V0am1wIG1hY3JvICovCisjaWYgZGVmaW5lZCAoX1NUTFBfV0NFKQorIyAgZGVmaW5lIF9TVExQX05BVElWRV9TRVRKTVBfSF9JTkNMVURFRAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX01TTF9fKSAmJiAoX19NU0xfXyA8PSAweDUwMDMpCituYW1lc3BhY2Ugc3RkIHsKKyAgdHlwZWRlZiA6OmRpdl90IGRpdl90OworICB0eXBlZGVmIDo6bGRpdl90IGxkaXZfdDsKKyMgIGlmZGVmIF9fTVNMX0xPTkdMT05HX1NVUFBPUlRfXworICB0eXBlZGVmIDo6bGxkaXZfdCBsbGRpdl90OworIyAgZW5kaWYKK30KKyNlbmRpZgorCisjaWZkZWYgX1NUTFBfSU1QT1JUX1ZFTkRPUl9DU1RECitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpkaXZfdDsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpsZGl2X3Q7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6c2l6ZV90OworCisjICBpZm5kZWYgX1NUTFBfTk9fQ1NURF9GVU5DVElPTl9JTVBPUlRTCisjICAgIGlmbmRlZiBfU1RMUF9XQ0UKKy8vIHRoZXNlIGZ1bmN0aW9ucyBqdXN0IGRvbid0IGV4aXN0IG9uIFdpbmRvd3MgQ0UKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjphYm9ydDsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpnZXRlbnY7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6bWJsZW47Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6bWJ0b3djOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnN5c3RlbTsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpic2VhcmNoOworIyAgICBlbmRpZgordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmF0ZXhpdDsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpleGl0OwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmNhbGxvYzsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpmcmVlOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6Om1hbGxvYzsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpyZWFsbG9jOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmF0b2Y7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6YXRvaTsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjphdG9sOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6Om1ic3Rvd2NzOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnN0cnRvZDsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpzdHJ0b2w7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6c3RydG91bDsKKworIyAgICBpZiAhKGRlZmluZWQgKF9TVExQX05PX05BVElWRV9XSURFX1NUUkVBTVMpIHx8IGRlZmluZWQgKF9TVExQX05PX05BVElWRV9NQlNUQVRFX1QpKQordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6Ondjc3RvbWJzOworIyAgICAgIGlmbmRlZiBfU1RMUF9XQ0UKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjp3Y3RvbWI7CisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpxc29ydDsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpsYWJzOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmxkaXY7CisjICAgIGlmIGRlZmluZWQgKF9TVExQX0xPTkdfTE9ORykgJiYgIWRlZmluZWQgKF9TVExQX05PX1ZFTkRPUl9TVERMSUJfTCkKKyMgICAgICBpZiAhZGVmaW5lZChfX3N1bikKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpsbGFiczsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpsbGRpdl90OwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmxsZGl2OworIyAgICAgIGVsc2UKK3VzaW5nIDo6bGxhYnM7Cit1c2luZyA6OmxsZGl2X3Q7Cit1c2luZyA6OmxsZGl2OworIyAgICAgIGVuZGlmCisjICAgIGVuZGlmCit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6cmFuZDsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpzcmFuZDsKKyMgIGVuZGlmIC8qIF9TVExQX05PX0NTVERfRlVOQ1RJT05fSU1QT1JUUyAqLworX1NUTFBfRU5EX05BTUVTUEFDRQorI2VuZGlmIC8qIF9TVExQX0lNUE9SVF9WRU5ET1JfQ1NURCAqLworCisjaWYgKGRlZmluZWQgKF9fQk9STEFORENfXykgfHwgZGVmaW5lZCAoX19XQVRDT01DX18pKSAmJiBkZWZpbmVkIChfU1RMUF9VU0VfTkVXX0NfSEVBREVSUykKKy8vSW4gdGhpcyBjb25maWcgYmNjIGRlZmluZSBldmVyeXRoaW5nIGluIHN0ZCBuYW1lc3BhY2UgYW5kIG5vdCBpbgorLy90aGUgZ2xvYmFsIG9uZS4KK2lubGluZSBpbnQgYWJzKGludCBfX3gpIHsgcmV0dXJuIF9TVExQX1ZFTkRPUl9DU1REOjphYnMoX194KTsgfQoraW5saW5lIF9TVExQX1ZFTkRPUl9DU1REOjpkaXZfdCBkaXYoaW50IF9feCwgaW50IF9feSkgeyByZXR1cm4gX1NUTFBfVkVORE9SX0NTVEQ6OmRpdihfX3gsIF9feSk7IH0KKyNlbmRpZgorCisjaWYgZGVmaW5lZChfTVNDX0VYVEVOU0lPTlMpICYmIGRlZmluZWQoX1NUTFBfTVNWQykgJiYgKF9TVExQX01TVkMgPD0gMTMwMCkKKyMgIGRlZmluZSBfU1RMUF9SRVNUT1JFX0ZVTkNUSU9OX0lOVFJJTlNJQworIyAgcHJhZ21hIHdhcm5pbmcgKHB1c2gpCisjICBwcmFnbWEgd2FybmluZyAoZGlzYWJsZTogNDE2MikKKyMgIHByYWdtYSBmdW5jdGlvbiAoYWJzKQorI2VuZGlmCisKKy8vSFAtVVggbmF0aXZlIGxpYiBoYXMgYWJzKCkgYW5kIGRpdigpIGZ1bmN0aW9ucyBpbiBnbG9iYWwgbmFtZXNwYWNlCisjaWYgIWRlZmluZWQgKF9fU1VOUFJPX0NDKSAmJiBcCisgICAgKCFkZWZpbmVkIChfX0hQX2FDQykgfHwgKF9fSFBfYUNDIDwgMzAwMDApKQorCisvL01TVkMgc3RhcnRpbmcgd2l0aCAuTmV0IDIwMDMgYWxyZWFkeSBkZWZpbmUgYWxsIG1hdGggZnVuY3Rpb25zIGluIGdsb2JhbCBuYW1lc3BhY2U6CisjICBpZiAhZGVmaW5lZCAoX19XQVRDT01DX18pICYmIFwKKyAgICAgKCFkZWZpbmVkIChfU1RMUF9NU1ZDX0xJQikgfHwgKF9TVExQX01TVkNfTElCIDwgMTMxMCkgfHwgZGVmaW5lZCAoVU5ERVJfQ0UpKQoraW5saW5lIGxvbmcgYWJzKGxvbmcgX194KSB7IHJldHVybiBfU1RMUF9WRU5ET1JfQ1NURDo6bGFicyhfX3gpOyB9CisjICBlbmRpZgorCisvKiogVkMgc2luY2UgdmVyc2lvbiA4IGhhcyB0aGlzLCB0aGUgcGxhdGZvcm0gU0RLIGFuZCBDRSBTREtzIGhhbmdpbmcgYmVoaW5kLiAqLworIyAgaWYgIWRlZmluZWQgKF9fV0FUQ09NQ19fKSAmJiBcCisgICAgICghZGVmaW5lZCAoX1NUTFBfTVNWQ19MSUIpIHx8IChfU1RMUF9NU1ZDX0xJQiA8IDE0MDApIHx8IGRlZmluZWQgKF9TVExQX1VTSU5HX1BMQVRGT1JNX1NES19DT01QSUxFUikgfHwgZGVmaW5lZCAoVU5ERVJfQ0UpKQoraW5saW5lIF9TVExQX1ZFTkRPUl9DU1REOjpsZGl2X3QgZGl2KGxvbmcgX194LCBsb25nIF9feSkgeyByZXR1cm4gX1NUTFBfVkVORE9SX0NTVEQ6OmxkaXYoX194LCBfX3kpOyB9CisjICBlbmRpZgorCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX1JFU1RPUkVfRlVOQ1RJT05fSU5UUklOU0lDKQorIyAgcHJhZ21hIGludHJpbnNpYyAoYWJzKQorIyAgcHJhZ21hIHdhcm5pbmcgKHBvcCkKKyMgIHVuZGVmIF9TVExQX1JFU1RPUkVfRlVOQ1RJT05fSU5UUklOU0lDCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX0xPTkdfTE9ORykKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9OT19WRU5ET1JfU1RETElCX0wpCisjICAgIGlmICFkZWZpbmVkIChfX3N1bikKK2lubGluZSBfU1RMUF9MT05HX0xPTkcgIGFicyhfU1RMUF9MT05HX0xPTkcgX194KSB7IHJldHVybiBfU1RMUF9WRU5ET1JfQ1NURDo6bGxhYnMoX194KTsgfQoraW5saW5lIGxsZGl2X3QgZGl2KF9TVExQX0xPTkdfTE9ORyBfX3gsIF9TVExQX0xPTkdfTE9ORyBfX3kpIHsgcmV0dXJuIF9TVExQX1ZFTkRPUl9DU1REOjpsbGRpdihfX3gsIF9feSk7IH0KKyMgICAgZWxzZQoraW5saW5lIF9TVExQX0xPTkdfTE9ORyAgYWJzKF9TVExQX0xPTkdfTE9ORyBfX3gpIHsgcmV0dXJuIDo6bGxhYnMoX194KTsgfQoraW5saW5lIGxsZGl2X3QgZGl2KF9TVExQX0xPTkdfTE9ORyBfX3gsIF9TVExQX0xPTkdfTE9ORyBfX3kpIHsgcmV0dXJuIDo6bGxkaXYoX194LCBfX3kpOyB9CisjICAgIGVuZGlmCisjICBlbHNlCitpbmxpbmUgX1NUTFBfTE9OR19MT05HICBhYnMoX1NUTFBfTE9OR19MT05HIF9feCkgeyByZXR1cm4gX194IDwgMCA/IC1fX3ggOiBfX3g7IH0KKyMgIGVuZGlmCisjZW5kaWYKKworLyogQysrIFN0YW5kYXJkIGlzIHVuY2xlYXIgYWJvdXQgc2V2ZXJhbCBjYWxsIHRvICd1c2luZyA6OmZ1bmMnIGlmIG5ldyBvdmVybG9hZHMKKyAqIG9mIDo6ZnVuYyBhcHBlYXJzIGJldHdlZW4gMiBzdWNjZXNzaXZlICd1c2luZycgY2FsbHMuIFRvIGF2b2lkIHRoaXMgcG90ZW50aWFsCisgKiBwcm9ibGVtIHdlIHByb3ZpZGUgYWxsIGFicyBvdmVybG9hZCBiZWZvcmUgdGhlICd1c2luZycgY2FsbC4KKyAqIEJld2FyZTogVGhpcyBoZWFkZXIgaW5jbHVzaW9uIGhhcyB0byBiZSBhZnRlciBhbGwgYWJzIG92ZXJsb2FkIG9mIHRoaXMgZmlsZS4KKyAqICAgICAgICAgVGhlIGZpcnN0ICd1c2luZyA6OmFicycgY2FsbCBpcyBnb2luZyB0byBiZSBpbiB0aGUgb3RoZXIgaGVhZGVyLgorICovCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NNQVRICisjICBpbmNsdWRlIDxzdGwvX2NtYXRoLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX0lNUE9SVF9WRU5ET1JfQ1NURCkgJiYgIWRlZmluZWQgKF9TVExQX05PX0NTVERfRlVOQ1RJT05fSU1QT1JUUykKKy8vIGFkIGhvYywgZG9uJ3QgcmVwbGFjZSB3aXRoIF9TVExQX1ZFTkRPUl9DU1REOjphYnMgaGVyZSEgLSBwdHIgMjAwNS0wMy0wNQorX1NUTFBfQkVHSU5fTkFNRVNQQUNFCit1c2luZyA6OmFiczsKK3VzaW5nIDo6ZGl2OworX1NUTFBfRU5EX05BTUVTUEFDRQorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9DU1RETElCICovCmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9fY3N0cmluZy5oIGIvc3RscG9ydC9zdGwvX2NzdHJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTBmZDVmCi0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvX2NzdHJpbmcuaApAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DU1RSSU5HCisjZGVmaW5lIF9TVExQX0lOVEVSTkFMX0NTVFJJTkcKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9ORVdfQ19IRUFERVJTKQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfSEFTX0lOQ0xVREVfTkVYVCkKKyMgICAgaW5jbHVkZV9uZXh0IDxjc3RyaW5nPgorIyAgZWxzZQorIyAgICBpbmNsdWRlIF9TVExQX05BVElWRV9DUFBfQ19IRUFERVIoY3N0cmluZykKKyMgIGVuZGlmCisjZWxzZQorIyAgaW5jbHVkZSA8c3RyaW5nLmg+CisjZW5kaWYKKworI2lmZGVmIF9TVExQX0lNUE9SVF9WRU5ET1JfQ1NURAorX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisjICBpbmNsdWRlIDx1c2luZy9jc3RyaW5nPgorX1NUTFBfRU5EX05BTUVTUEFDRQorI2VuZGlmIC8qIF9TVExQX0lNUE9SVF9WRU5ET1JfQ1NURCAqLworCisjZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfQ1NUUklORyAqLwpkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdGwvX2N0aW1lLmggYi9zdGxwb3J0L3N0bC9fY3RpbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmU0MzNiCi0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvX2N0aW1lLmgKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1RJTUUKKyNkZWZpbmUgX1NUTFBfSU5URVJOQUxfQ1RJTUUKKworI2lmICFkZWZpbmVkIChfU1RMUF9XQ0VfRVZDMykKKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX05FV19DX0hFQURFUlMpCisjICAgIGlmIGRlZmluZWQgKF9TVExQX0hBU19JTkNMVURFX05FWFQpCisjICAgICAgaW5jbHVkZV9uZXh0IDxjdGltZT4KKyMgICAgZWxzZQorIyAgICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUihjdGltZSkKKyMgICAgZW5kaWYKKyMgIGVsc2UKKyMgICAgaW5jbHVkZSA8dGltZS5oPgorIyAgZW5kaWYKKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfSU1QT1JUX1ZFTkRPUl9DU1REKQorX1NUTFBfQkVHSU5fTkFNRVNQQUNFCit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6c2l6ZV90OwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmNsb2NrX3Q7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6dGltZV90OwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnRtOworIyAgICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fQ1NURF9GVU5DVElPTl9JTVBPUlRTKQordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmNsb2NrOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmFzY3RpbWU7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6Y3RpbWU7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6Z210aW1lOworCisjICAgICAgaWYgIWRlZmluZWQgKF9XSU4zMl9XQ0UpIHx8IChfV0lOMzJfV0NFIDwgMHg1MDApIC8vIENFNSBzdG9wcGVkIHN1cHBseWluZyB0aGlzCit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6ZGlmZnRpbWU7CisjICAgICAgZW5kaWYKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpta3RpbWU7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6bG9jYWx0aW1lOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnN0cmZ0aW1lOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnRpbWU7CisjICAgIGVuZGlmIC8qIF9TVExQX05PX0NTVERfRlVOQ1RJT05fSU1QT1JUUyAqLworX1NUTFBfRU5EX05BTUVTUEFDRQorIyAgZW5kaWYgLyogX1NUTFBfSU1QT1JUX1ZFTkRPUl9DU1REICovCisKKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfQ1RJTUUgKi8KZGlmZiAtLWdpdCBhL3N0bC9fY3RyYWl0c19mbnMuaCBiL3N0bHBvcnQvc3RsL19jdHJhaXRzX2Zucy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzdGwvX2N0cmFpdHNfZm5zLmgKcmVuYW1lIHRvIHN0bHBvcnQvc3RsL19jdHJhaXRzX2Zucy5oCmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9fY3R5cGUuaCBiL3N0bHBvcnQvc3RsL19jdHlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzYTVkM2MKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9fY3R5cGUuaApAQCAtMCwwICsxLDI4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKy8vIFdBUk5JTkc6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIEMrKworLy8gc3RhbmRhcmQgbGlicmFyeSBoZWFkZXJzLiAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgdGhpcyBoZWFkZXIKKy8vIGZpbGUgZGlyZWN0bHkuCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1RZUEVfSAorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9DVFlQRV9ICisKKyNpZm5kZWYgX1NUTFBfQ19MT0NBTEVfSAorIyAgaW5jbHVkZSA8c3RsL2NfbG9jYWxlLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9MT0NBTEVfSAorIyAgaW5jbHVkZSA8c3RsL19sb2NhbGUuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0FMR09CQVNFX0gKKyMgIGluY2x1ZGUgPHN0bC9fYWxnb2Jhc2UuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgY3R5cGVfYmFzZSB7CitwdWJsaWM6CisgIGVudW0gbWFzayB7CisgICAgc3BhY2UgICA9IF9Mb2NhbGVfU1BBQ0UsCisgICAgcHJpbnQgICA9IF9Mb2NhbGVfUFJJTlQsCisgICAgY250cmwgICA9IF9Mb2NhbGVfQ05UUkwsCisgICAgdXBwZXIgICA9IF9Mb2NhbGVfVVBQRVIsCisgICAgbG93ZXIgICA9IF9Mb2NhbGVfTE9XRVIsCisgICAgYWxwaGEgICA9IF9Mb2NhbGVfQUxQSEEsCisgICAgZGlnaXQgICA9IF9Mb2NhbGVfRElHSVQsCisgICAgcHVuY3QgICA9IF9Mb2NhbGVfUFVOQ1QsCisgICAgeGRpZ2l0ICA9IF9Mb2NhbGVfWERJR0lULAorICAgIGFsbnVtICAgPSBhbHBoYSB8IGRpZ2l0LAorICAgIGdyYXBoICAgPSBhbG51bSB8IHB1bmN0CisgIH07Cit9OworCisvLyBjdHlwZTw+IHRlbXBsYXRlCisKK3RlbXBsYXRlIDxjbGFzcyBjaGFyVD4gY2xhc3MgY3R5cGUge307Cit0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQ+IGNsYXNzIGN0eXBlX2J5bmFtZSB7fTsKKworLy9jdHlwZSBzcGVjaWFsaXphdGlvbnMKKworX1NUTFBfVEVNUExBVEVfTlVMTAorY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgY3R5cGU8Y2hhcj4gOiBwdWJsaWMgbG9jYWxlOjpmYWNldCwgcHVibGljIGN0eXBlX2Jhc2UgeworI2lmbmRlZiBfU1RMUF9OT19XQ0hBUl9UCisjICBpZmRlZiBfU1RMUF9NU1ZDCisgICAgdHlwZWRlZiBjdHlwZTx3Y2hhcl90PiBfV2N0eXBlOworICAgIGZyaWVuZCBfV2N0eXBlOworIyAgZWxzZQorICAgIGZyaWVuZCBjbGFzcyBjdHlwZTx3Y2hhcl90PjsKKyMgIGVuZGlmCisjZW5kaWYKK3B1YmxpYzoKKworICB0eXBlZGVmIGNoYXIgY2hhcl90eXBlOworCisgIGV4cGxpY2l0IGN0eXBlKGNvbnN0IG1hc2sqIF9fdGFiID0gMCwgYm9vbCBfX2RlbCA9IGZhbHNlLCBzaXplX3QgX19yZWZzID0gMCk7CisgIGJvb2wgaXMobWFzayBfX20sIGNoYXIgX19jKSBjb25zdAorICB7IHJldHVybiAoKCooX01fY3R5cGVfdGFibGUrKHVuc2lnbmVkIGNoYXIpX19jKSkgJiBfX20pICE9IDA7IH0KKworICBjb25zdCBjaGFyKiBpcyhjb25zdCBjaGFyKiBfX2xvdywgY29uc3QgY2hhciogX19oaWdoLCBtYXNrKiBfX3ZlYykgY29uc3QgeworICAgIGZvciAoY29uc3QgY2hhciogX19wID0gX19sb3c7X19wICE9IF9faGlnaDsgKytfX3AsICsrX192ZWMpIHsKKyAgICAgICpfX3ZlYyA9IF9NX2N0eXBlX3RhYmxlWyh1bnNpZ25lZCBjaGFyKSpfX3BdOworICAgIH0KKyAgICByZXR1cm4gX19oaWdoOworICB9CisKKyAgY29uc3QgY2hhciogc2Nhbl9pcyhtYXNrIF9fbSwgY29uc3QgY2hhciogX19sb3csIGNvbnN0IGNoYXIqIF9faGlnaCkgY29uc3Q7CisgIGNvbnN0IGNoYXIqIHNjYW5fbm90KG1hc2sgX19tLCBjb25zdCBjaGFyKiBfX2xvdywgY29uc3QgY2hhciogX19oaWdoKSBjb25zdDsKKworICBjaGFyICAgICAgICAodG91cHBlcikoY2hhciBfX2MpIGNvbnN0IHsgcmV0dXJuIGRvX3RvdXBwZXIoX19jKTsgfQorICBjb25zdCBjaGFyKiAodG91cHBlcikoY2hhciogX19sb3csIGNvbnN0IGNoYXIqIF9faGlnaCkgY29uc3QgeworICAgIHJldHVybiBkb190b3VwcGVyKF9fbG93LCBfX2hpZ2gpOworICB9CisKKyAgY2hhciAgICAgICAgKHRvbG93ZXIpKGNoYXIgX19jKSBjb25zdCB7IHJldHVybiBkb190b2xvd2VyKF9fYyk7IH0KKyAgY29uc3QgY2hhciogKHRvbG93ZXIpKGNoYXIqIF9fbG93LCBjb25zdCBjaGFyKiBfX2hpZ2gpIGNvbnN0IHsKKyAgICByZXR1cm4gZG9fdG9sb3dlcihfX2xvdywgX19oaWdoKTsKKyAgfQorCisgIGNoYXIgICAgICAgIHdpZGVuKGNoYXIgX19jKSBjb25zdCB7IHJldHVybiBkb193aWRlbihfX2MpOyB9CisgIGNvbnN0IGNoYXIqIHdpZGVuKGNvbnN0IGNoYXIqIF9fbG93LCBjb25zdCBjaGFyKiBfX2hpZ2gsIGNoYXIqIF9fdG8pIGNvbnN0IHsKKyAgICByZXR1cm4gZG9fd2lkZW4oX19sb3csIF9faGlnaCwgX190byk7CisgIH0KKworICBjaGFyICAgICAgICBuYXJyb3coY2hhciBfX2MsIGNoYXIgX19kZmF1bHQpIGNvbnN0IHsKKyAgICByZXR1cm4gZG9fbmFycm93KF9fYywgX19kZmF1bHQpOworICB9CisgIGNvbnN0IGNoYXIqIG5hcnJvdyhjb25zdCBjaGFyKiBfX2xvdywgY29uc3QgY2hhciogX19oaWdoLAorICAgICAgICAgICAgICAgICAgICAgY2hhciBfX2RmYXVsdCwgY2hhciogX190bykgY29uc3QgeworICAgIHJldHVybiBkb19uYXJyb3coX19sb3csIF9faGlnaCwgX19kZmF1bHQsIF9fdG8pOworICB9CisKKyAgc3RhdGljIF9TVExQX1NUQVRJQ19ERUNMU1BFQyBsb2NhbGU6OmlkIGlkOworICBfU1RMUF9TVEFUSUNfQ09OU1RBTlQoc2l6ZV90LCB0YWJsZV9zaXplID0gMjU2KTsKKworcHJvdGVjdGVkOgorICBjb25zdCBtYXNrKiB0YWJsZSgpIGNvbnN0IF9TVExQX05PVEhST1cgeyByZXR1cm4gX01fY3R5cGVfdGFibGU7IH0KKyAgc3RhdGljIGNvbnN0IG1hc2sqIF9TVExQX0NBTEwgY2xhc3NpY190YWJsZSgpIF9TVExQX05PVEhST1c7CisKKyAgfmN0eXBlKCk7CisKKyAgdmlydHVhbCBjaGFyICAgICAgICBkb190b3VwcGVyKGNoYXIgX19jKSBjb25zdDsKKyAgdmlydHVhbCBjaGFyICAgICAgICBkb190b2xvd2VyKGNoYXIgX19jKSBjb25zdDsKKyAgdmlydHVhbCBjb25zdCBjaGFyKiBkb190b3VwcGVyKGNoYXIqIF9fbG93LCBjb25zdCBjaGFyKiBfX2hpZ2gpIGNvbnN0OworICB2aXJ0dWFsIGNvbnN0IGNoYXIqIGRvX3RvbG93ZXIoY2hhciogX19sb3csIGNvbnN0IGNoYXIqIF9faGlnaCkgY29uc3Q7CisgIHZpcnR1YWwgY2hhciAgICAgICAgZG9fd2lkZW4oY2hhciBfX2MpIGNvbnN0OworICB2aXJ0dWFsIGNvbnN0IGNoYXIqIGRvX3dpZGVuKGNvbnN0IGNoYXIqIF9fbG93LCBjb25zdCBjaGFyKiBfX2hpZ2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogX190bykgY29uc3Q7CisgIHZpcnR1YWwgY2hhciAgICAgICAgZG9fbmFycm93KGNoYXIgX19jLCBjaGFyIC8qIGRmYXVsdCAqLyApIGNvbnN0OworICB2aXJ0dWFsIGNvbnN0IGNoYXIqIGRvX25hcnJvdyhjb25zdCBjaGFyKiBfX2xvdywgY29uc3QgY2hhciogX19oaWdoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIC8qIGRmYXVsdCAqLywgY2hhciogX190bykgY29uc3Q7Citwcml2YXRlOgorICBzdHJ1Y3QgX0lzX21hc2sgeworICAgIG1hc2sgX19tOworICAgIF9Jc19tYXNrKG1hc2sgX194KTogX19tKF9feCkge30KKyAgIGJvb2wgb3BlcmF0b3IoKShjaGFyIF9fYykge3JldHVybiAoX19tICYgKHVuc2lnbmVkIGNoYXIpIF9fYykgIT0gMDt9CisgIH07CisKK3Byb3RlY3RlZDoKKyAgY29uc3QgbWFzayogX01fY3R5cGVfdGFibGU7Citwcml2YXRlOgorICBib29sIF9NX2RlbGV0ZTsKK307CisKK19TVExQX1RFTVBMQVRFX05VTEwKK2NsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIGN0eXBlX2J5bmFtZTxjaGFyPjogcHVibGljIGN0eXBlPGNoYXI+IHsKKyAgZnJpZW5kIGNsYXNzIF9Mb2NhbGVfaW1wbDsKK3B1YmxpYzoKKyAgZXhwbGljaXQgY3R5cGVfYnluYW1lKGNvbnN0IGNoYXIqLCBzaXplX3QgPSAwKTsKKyAgfmN0eXBlX2J5bmFtZSgpOworCisgIHZpcnR1YWwgY2hhciAgICAgICAgZG9fdG91cHBlcihjaGFyIF9fYykgY29uc3Q7CisgIHZpcnR1YWwgY2hhciAgICAgICAgZG9fdG9sb3dlcihjaGFyIF9fYykgY29uc3Q7CisKKyAgdmlydHVhbCBjb25zdCBjaGFyKiBkb190b3VwcGVyKGNoYXIqLCBjb25zdCBjaGFyKikgY29uc3Q7CisgIHZpcnR1YWwgY29uc3QgY2hhciogZG9fdG9sb3dlcihjaGFyKiwgY29uc3QgY2hhciopIGNvbnN0OworCitwcml2YXRlOgorICBjdHlwZV9ieW5hbWUoX0xvY2FsZV9jdHlwZSogX19jdHlwZSkKKyAgICA6IF9NX2N0eXBlKF9fY3R5cGUpCisgIHsgX01faW5pdCgpOyB9CisKKyAgdm9pZCBfTV9pbml0KCk7CisKKyAgLy9leHBsaWNpdGVseSBkZWZpbmVkIGFzIHByaXZhdGUgdG8gYXZvaWQgd2FybmluZ3M6CisgIHR5cGVkZWYgY3R5cGVfYnluYW1lPGNoYXI+IF9TZWxmOworICBjdHlwZV9ieW5hbWUoX1NlbGYgY29uc3QmKTsKKyAgX1NlbGYmIG9wZXJhdG9yID0gKF9TZWxmIGNvbnN0Jik7CisKKyAgbWFzayBfTV9ieW5hbWVfdGFibGVbdGFibGVfc2l6ZV07CisgIF9Mb2NhbGVfY3R5cGUqIF9NX2N0eXBlOworfTsKKworIyAgaWZuZGVmIF9TVExQX05PX1dDSEFSX1QKK19TVExQX1RFTVBMQVRFX05VTEwKK2NsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIGN0eXBlPHdjaGFyX3Q+IDogcHVibGljIGxvY2FsZTo6ZmFjZXQsIHB1YmxpYyBjdHlwZV9iYXNlIHsKK3B1YmxpYzoKKyAgdHlwZWRlZiB3Y2hhcl90IGNoYXJfdHlwZTsKKworICBleHBsaWNpdCBjdHlwZShzaXplX3QgX19yZWZzID0gMCkgOiBsb2NhbGU6OmZhY2V0KF9fcmVmcykge30KKworICBib29sIGlzKG1hc2sgX19tLCB3Y2hhcl90IF9fYykgY29uc3QKKyAgICB7IHJldHVybiBkb19pcyhfX20sIF9fYyk7IH0KKworICBjb25zdCB3Y2hhcl90KiBpcyhjb25zdCB3Y2hhcl90KiBfX2xvdywgY29uc3Qgd2NoYXJfdCogX19oaWdoLAorICAgICAgICAgICAgICAgICAgICBtYXNrKiBfX3ZlYykgY29uc3QKKyAgICB7IHJldHVybiBkb19pcyhfX2xvdywgX19oaWdoLCBfX3ZlYyk7IH0KKworICBjb25zdCB3Y2hhcl90KiBzY2FuX2lzKG1hc2sgX19tLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIF9fbG93LCBjb25zdCB3Y2hhcl90KiBfX2hpZ2gpIGNvbnN0CisgICAgeyByZXR1cm4gZG9fc2Nhbl9pcyhfX20sIF9fbG93LCBfX2hpZ2gpOyB9CisKKyAgY29uc3Qgd2NoYXJfdCogc2Nhbl9ub3QgKG1hc2sgX19tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogX19sb3csIGNvbnN0IHdjaGFyX3QqIF9faGlnaCkgY29uc3QKKyAgICB7IHJldHVybiBkb19zY2FuX25vdChfX20sIF9fbG93LCBfX2hpZ2gpOyB9CisKKyAgd2NoYXJfdCAodG91cHBlcikod2NoYXJfdCBfX2MpIGNvbnN0IHsgcmV0dXJuIGRvX3RvdXBwZXIoX19jKTsgfQorICBjb25zdCB3Y2hhcl90KiAodG91cHBlcikod2NoYXJfdCogX19sb3csIGNvbnN0IHdjaGFyX3QqIF9faGlnaCkgY29uc3QKKyAgICB7IHJldHVybiBkb190b3VwcGVyKF9fbG93LCBfX2hpZ2gpOyB9CisKKyAgd2NoYXJfdCAodG9sb3dlcikod2NoYXJfdCBfX2MpIGNvbnN0IHsgcmV0dXJuIGRvX3RvbG93ZXIoX19jKTsgfQorICBjb25zdCB3Y2hhcl90KiAodG9sb3dlcikod2NoYXJfdCogX19sb3csIGNvbnN0IHdjaGFyX3QqIF9faGlnaCkgY29uc3QKKyAgICB7IHJldHVybiBkb190b2xvd2VyKF9fbG93LCBfX2hpZ2gpOyB9CisKKyAgd2NoYXJfdCB3aWRlbihjaGFyIF9fYykgY29uc3QgeyByZXR1cm4gZG9fd2lkZW4oX19jKTsgfQorICBjb25zdCBjaGFyKiB3aWRlbihjb25zdCBjaGFyKiBfX2xvdywgY29uc3QgY2hhciogX19oaWdoLAorICAgICAgICAgICAgICAgICAgICB3Y2hhcl90KiBfX3RvKSBjb25zdAorICAgIHsgcmV0dXJuIGRvX3dpZGVuKF9fbG93LCBfX2hpZ2gsIF9fdG8pOyB9CisKKyAgY2hhciBuYXJyb3cod2NoYXJfdCBfX2MsIGNoYXIgX19kZmF1bHQpIGNvbnN0CisgICAgeyByZXR1cm4gZG9fbmFycm93KF9fYywgX19kZmF1bHQpOyB9CisgIGNvbnN0IHdjaGFyX3QqIG5hcnJvdyhjb25zdCB3Y2hhcl90KiBfX2xvdywgY29uc3Qgd2NoYXJfdCogX19oaWdoLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBfX2RmYXVsdCwgY2hhciogX190bykgY29uc3QKKyAgICB7IHJldHVybiBkb19uYXJyb3coX19sb3csIF9faGlnaCwgX19kZmF1bHQsIF9fdG8pOyB9CisKKyAgc3RhdGljIF9TVExQX1NUQVRJQ19ERUNMU1BFQyBsb2NhbGU6OmlkIGlkOworCitwcm90ZWN0ZWQ6CisgIH5jdHlwZSgpOworCisgIHZpcnR1YWwgYm9vbCAgICAgICAgICAgZG9faXMobWFzayBfX20sIHdjaGFyX3QgX19jKSBjb25zdDsKKyAgdmlydHVhbCBjb25zdCB3Y2hhcl90KiBkb19pcyhjb25zdCB3Y2hhcl90KiwgY29uc3Qgd2NoYXJfdCosIG1hc2sqKSBjb25zdDsKKyAgdmlydHVhbCBjb25zdCB3Y2hhcl90KiBkb19zY2FuX2lzKG1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiwgY29uc3Qgd2NoYXJfdCopIGNvbnN0OworICB2aXJ0dWFsIGNvbnN0IHdjaGFyX3QqIGRvX3NjYW5fbm90KG1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCosIGNvbnN0IHdjaGFyX3QqKSBjb25zdDsKKyAgdmlydHVhbCB3Y2hhcl90IGRvX3RvdXBwZXIod2NoYXJfdCBfX2MpIGNvbnN0OworICB2aXJ0dWFsIGNvbnN0IHdjaGFyX3QqIGRvX3RvdXBwZXIod2NoYXJfdCosIGNvbnN0IHdjaGFyX3QqKSBjb25zdDsKKyAgdmlydHVhbCB3Y2hhcl90IGRvX3RvbG93ZXIod2NoYXJfdCBjKSBjb25zdDsKKyAgdmlydHVhbCBjb25zdCB3Y2hhcl90KiBkb190b2xvd2VyKHdjaGFyX3QqLCBjb25zdCB3Y2hhcl90KikgY29uc3Q7CisgIHZpcnR1YWwgd2NoYXJfdCBkb193aWRlbihjaGFyIGMpIGNvbnN0OworICB2aXJ0dWFsIGNvbnN0IGNoYXIqIGRvX3dpZGVuKGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgd2NoYXJfdCopIGNvbnN0OworICB2aXJ0dWFsIGNoYXIgIGRvX25hcnJvdyh3Y2hhcl90IF9fYywgY2hhciBfX2RmYXVsdCkgY29uc3Q7CisgIHZpcnR1YWwgY29uc3Qgd2NoYXJfdCogZG9fbmFycm93KGNvbnN0IHdjaGFyX3QqLCBjb25zdCB3Y2hhcl90KiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciwgY2hhciopIGNvbnN0OworfTsKKworX1NUTFBfVEVNUExBVEVfTlVMTAorY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgY3R5cGVfYnluYW1lPHdjaGFyX3Q+OiBwdWJsaWMgY3R5cGU8d2NoYXJfdD4geworICBmcmllbmQgY2xhc3MgX0xvY2FsZV9pbXBsOworcHVibGljOgorICBleHBsaWNpdCBjdHlwZV9ieW5hbWUoY29uc3QgY2hhciogX19uYW1lLCBzaXplX3QgX19yZWZzID0gMCk7CisKK3Byb3RlY3RlZDoKKyAgfmN0eXBlX2J5bmFtZSgpOworCisgIHZpcnR1YWwgYm9vbCAgICAgICAgICAgZG9faXMobWFzayBfX20sIHdjaGFyX3QgX19jKSBjb25zdDsKKyAgdmlydHVhbCBjb25zdCB3Y2hhcl90KiBkb19pcyhjb25zdCB3Y2hhcl90KiwgY29uc3Qgd2NoYXJfdCosIG1hc2sqKSBjb25zdDsKKyAgdmlydHVhbCBjb25zdCB3Y2hhcl90KiBkb19zY2FuX2lzKG1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiwgY29uc3Qgd2NoYXJfdCopIGNvbnN0OworICB2aXJ0dWFsIGNvbnN0IHdjaGFyX3QqIGRvX3NjYW5fbm90KG1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCosIGNvbnN0IHdjaGFyX3QqKSBjb25zdDsKKyAgdmlydHVhbCB3Y2hhcl90IGRvX3RvdXBwZXIod2NoYXJfdCBfX2MpIGNvbnN0OworICB2aXJ0dWFsIGNvbnN0IHdjaGFyX3QqIGRvX3RvdXBwZXIod2NoYXJfdCosIGNvbnN0IHdjaGFyX3QqKSBjb25zdDsKKyAgdmlydHVhbCB3Y2hhcl90IGRvX3RvbG93ZXIod2NoYXJfdCBjKSBjb25zdDsKKyAgdmlydHVhbCBjb25zdCB3Y2hhcl90KiBkb190b2xvd2VyKHdjaGFyX3QqLCBjb25zdCB3Y2hhcl90KikgY29uc3Q7CisKK3ByaXZhdGU6CisgIGN0eXBlX2J5bmFtZShfTG9jYWxlX2N0eXBlKiBfX2N0eXBlKQorICAgIDogX01fY3R5cGUoX19jdHlwZSkge30KKworICAvL2V4cGxpY2l0ZWx5IGRlZmluZWQgYXMgcHJpdmF0ZSB0byBhdm9pZCB3YXJuaW5nczoKKyAgdHlwZWRlZiBjdHlwZV9ieW5hbWU8d2NoYXJfdD4gX1NlbGY7CisgIGN0eXBlX2J5bmFtZShfU2VsZiBjb25zdCYpOworICBfU2VsZiYgb3BlcmF0b3IgPSAoX1NlbGYgY29uc3QmKTsKKworICBfTG9jYWxlX2N0eXBlKiBfTV9jdHlwZTsKK307CisKKyMgIGVuZGlmIC8qIFdDSEFSX1QgKi8KKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfQ1RZUEVfSCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgorCmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9fY3djaGFyLmggYi9zdGxwb3J0L3N0bC9fY3djaGFyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdjYjgyYgotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc3RsL19jd2NoYXIuaApAQCAtMCwwICsxLDM0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1dDSEFSCisjZGVmaW5lIF9TVExQX0lOVEVSTkFMX0NXQ0hBUgorCisjaWYgZGVmaW5lZCAoX1NUTFBfV0NFX0VWQzMpCisjICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfTUJTVEFURV9UCisjICAgIGluY2x1ZGUgPHN0bC9fbWJzdGF0ZV90Lmg+CisjICBlbmRpZgorI2Vsc2UKKyMgIGlmIGRlZmluZWQgKF9fR05VQ19fKQorIyAgICBpZiBkZWZpbmVkIChfU1RMUF9IQVNfSU5DTFVERV9ORVhUKQorIyAgICAgIGluY2x1ZGVfbmV4dCA8Y3N0ZGRlZj4KKyMgICAgZWxzZQorIyAgICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUihjc3RkZGVmKQorIyAgICBlbmRpZgorIyAgZW5kaWYKKworIyAgaWYgIWRlZmluZWQgKF9TVExQX05PX0NXQ0hBUikgJiYgZGVmaW5lZCAoX1NUTFBfVVNFX05FV19DX0hFQURFUlMpCisjICAgIGlmIGRlZmluZWQgKF9TVExQX0hBU19JTkNMVURFX05FWFQpCisjICAgICAgaW5jbHVkZV9uZXh0IDxjd2NoYXI+CisjICAgIGVsc2UKKyMgICAgICBpbmNsdWRlIF9TVExQX05BVElWRV9DUFBfQ19IRUFERVIoY3djaGFyKQorIyAgICBlbmRpZgorIyAgICBpZiBkZWZpbmVkIChfX09wZW5CU0RfXykKK3R5cGVkZWYgX0JTRF9XSU5UX1RfIHdpbnRfdDsKKyMgICAgZW5kaWYgLyogX19PcGVuQlNEX18gKi8KKworIyAgICBpZiBkZWZpbmVkIChfX0RNQ19fKQorIyAgICAgIGRlZmluZSBfX1NURENfTElNSVRfTUFDUk9TCisjICAgICAgaW5jbHVkZSA8c3RkaW50Lmg+IC8vIFdDSEFSX01JTiwgV0NIQVJfTUFYCisjICAgIGVuZGlmCisjICBlbGlmIGRlZmluZWQgKF9TVExQX05PX1dDSEFSX1QpIHx8IFwKKyAgICAgICAoZGVmaW5lZCAoX19CT1JMQU5EQ19fKSAmJiAoX19CT1JMQU5EQ19fIDwgMHg1NzApKSB8fCBcCisgICAgICAgIGRlZmluZWQgKF9fT3BlbkJTRF9fKSB8fCBkZWZpbmVkIChfX0ZyZWVCU0RfXykgfHwgXAorICAgICAgIChkZWZpbmVkIChfX0dOVUNfXykgJiYgKGRlZmluZWQgKF9fQVBQTEVfXykgfHwgZGVmaW5lZCAoIF9fTHlueF9fICkpKQorIyAgICBpZiBkZWZpbmVkIChfU1RMUF9IQVNfSU5DTFVERV9ORVhUKQorIyAgICAgIGluY2x1ZGVfbmV4dCA8c3RkZGVmLmg+CisjICAgIGVsc2UKKyMgICAgICBpbmNsdWRlIF9TVExQX05BVElWRV9DX0hFQURFUihzdGRkZWYuaCkKKyMgICAgZW5kaWYKKyMgICAgaWYgZGVmaW5lZCAoX19MeW54X18pCisjICAgICAgaWZuZGVmIF9XSU5UX1QKK3R5cGVkZWYgbG9uZyBpbnQgd2ludF90OworIyAgICAgICAgZGVmaW5lIF9XSU5UX1QKKyMgICAgICBlbmRpZiAvKiBfV0lOVF9UICovCisjICAgIGVuZGlmCisjICAgIGlmIGRlZmluZWQoX19PcGVuQlNEX18pCit0eXBlZGVmIF9CU0RfV0lOVF9UXyB3aW50X3Q7CisjICAgIGVuZGlmIC8qIF9fT3BlbkJTRF9fICovCisjICBlbHNlCisjICAgIGlmIGRlZmluZWQgKF9TVExQX0hBU19JTkNMVURFX05FWFQpCisjICAgICAgaW5jbHVkZV9uZXh0IDx3Y2hhci5oPgorIyAgICBlbHNlCisjICAgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ19IRUFERVIod2NoYXIuaCkKKyMgICAgZW5kaWYKKworIyAgICBpZiBkZWZpbmVkIChfX3N1bikgJiYgKGRlZmluZWQgKF9YT1BFTl9TT1VSQ0UpIHx8IChfWE9QRU5fVkVSU0lPTiAtIDAgPT0gNCkpCitleHRlcm4gd2ludF90ICAgYnRvd2MoKTsKK2V4dGVybiBpbnQgICAgICBmd3ByaW50ZigpOworZXh0ZXJuIGludCAgICAgIGZ3c2NhbmYoKTsKK2V4dGVybiBpbnQgICAgICBmd2lkZSgpOworZXh0ZXJuIGludCAgICAgIG1ic2luaXQoKTsKK2V4dGVybiBzaXplX3QgICBtYnJsZW4oKTsKK2V4dGVybiBzaXplX3QgICBtYnJ0b3djKCk7CitleHRlcm4gc2l6ZV90ICAgbWJzcnRvd2NzKCk7CitleHRlcm4gaW50ICAgICAgc3dwcmludGYoKTsKK2V4dGVybiBpbnQgICAgICBzd3NjYW5mKCk7CitleHRlcm4gaW50ICAgICAgdmZ3cHJpbnRmKCk7CitleHRlcm4gaW50ICAgICAgdndwcmludGYoKTsKK2V4dGVybiBpbnQgICAgICB2c3dwcmludGYoKTsKK2V4dGVybiBzaXplX3QgICB3Y3J0b21iKCk7CitleHRlcm4gc2l6ZV90ICAgd2NzcnRvbWJzKCk7CitleHRlcm4gd2NoYXJfdCAgKndjc3N0cigpOworZXh0ZXJuIGludCAgICAgIHdjdG9iKCk7CitleHRlcm4gd2NoYXJfdCAgKndtZW1jaHIoKTsKK2V4dGVybiBpbnQgICAgICB3bWVtY21wKCk7CitleHRlcm4gd2NoYXJfdCAgKndtZW1jcHkoKTsKK2V4dGVybiB3Y2hhcl90ICAqd21lbW1vdmUoKTsKK2V4dGVybiB3Y2hhcl90ICAqd21lbXNldCgpOworZXh0ZXJuIGludCAgICAgIHdwcmludGYoKTsKK2V4dGVybiBpbnQgICAgICB3c2NhbmYoKTsKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisKKyMgIGlmIGRlZmluZWQgKF9fTVNMX18pICYmIChfX01TTF9fIDw9IDB4NTFGRikgIC8qIGR3YSAyLzI4Lzk5IC0gbm90IHlldCBpbXBsZW1lbnRlZCBieSBNU0wgICovCisjICAgIGRlZmluZSBfU1RMUF9XQ0hBUl9NU0xfRVhDTFVERSAxCituYW1lc3BhY2Ugc3RkIHsKKyAgZXh0ZXJuICJDIiBzaXplX3Qgd2NzZnRpbWUod2NoYXJfdCAqIHN0ciwgc2l6ZV90IG1heF9zaXplLCBjb25zdCB3Y2hhcl90ICogZm9ybWF0X3N0ciwgY29uc3Qgc3RydWN0IHRtICogdGltZXB0cik7Cit9CisjICAgIGRlZmluZSBfU1RMUF9OT19OQVRJVkVfTUJTVEFURV9UIDEKKyMgIGVsaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKQorIyAgICBpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX05PX0lPU1RSRUFNUykKKyMgICAgICBkZWZpbmUgX1NUTFBfTk9fTkFUSVZFX01CU1RBVEVfVAorIyAgICBlbmRpZgorIyAgICBkZWZpbmUgX1NUTFBfV0NIQVJfQk9STEFORF9FWENMVURFIDEKKyMgIGVuZGlmCisKKyMgIGlmbmRlZiBfU1RMUF9JTlRFUk5BTF9NQlNUQVRFX1QKKyMgICAgaW5jbHVkZSA8c3RsL19tYnN0YXRlX3QuaD4KKyMgIGVuZGlmCisKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQorIyAgICBpZm5kZWYgV0NIQVJfTUlOCisjICAgICAgZGVmaW5lIFdDSEFSX01JTiAwCisvKiBTVU5wcm8gaGFzIHNvbWUgYnVncyB3aXRoIGNhc3RzLiB3Y2hhcl90IGlzIHNpemUgb2YgaW50IHRoZXJlIGFueXdheS4gKi8KKyMgICAgICBpZiBkZWZpbmVkIChfX1NVTlBST19DQykgfHwgZGVmaW5lZCAoX19ESkdQUCkKKyMgICAgICAgIGRlZmluZSBXQ0hBUl9NQVggKH4wKQorIyAgICAgIGVsc2UKKyMgICAgICAgIGRlZmluZSBXQ0hBUl9NQVggKCh3Y2hhcl90KX4wKQorIyAgICAgIGVuZGlmCisjICAgIGVuZGlmCisjICAgIGlmIGRlZmluZWQgKF9fRE1DX18pIHx8IChkZWZpbmVkIChfU1RMUF9NU1ZDX0xJQikgJiYgKF9TVExQX01TVkNfTElCIDwgMTQwMCkpIHx8IGRlZmluZWQoX1dJTjMyX1dDRSkKKy8qIENvbXBpbGVycyB0aGF0IGRvIG5vdCBkZWZpbmUgV0NIQVJfTUlOIGFuZCBXQ0hBUl9NQVggdG8gYmUgdGVzdGFibGUgYXQKKyAqIHByZXByb2Nlc3NpbmcgdGltZS4gKi8KKyMgICAgICB1bmRlZiBXQ0hBUl9NSU4KKyMgICAgICBkZWZpbmUgV0NIQVJfTUlOIDAKKyMgICAgICB1bmRlZiBXQ0hBUl9NQVgKKyMgICAgICBkZWZpbmUgV0NIQVJfTUFYIDB4ZmZmZgorIyAgICBlbmRpZgorIyAgICBpZiBkZWZpbmVkIChfX0dOVUNfXykgJiYgZGVmaW5lZCAoX19hbHBoYV9fKQorLyogRGVmaW5pdGlvbiBvZiBXQ0hBUl9NSU4gYW5kIE1BWCBhcmUgd3JvbmcgZm9yIGFscGhhIHBsYXRmb3JtCisgKiBhcyBnY2MgY29uc2lkZXIgd2NoYXJfdCBhcyBhbiB1bnNpZ25lZCB0eXBlIGJ1dCBXQ0hBUl9NSU4gaXMgZGVmaW5lZCBhcworICogYSBuZWdhdGl2ZSB2YWx1ZS4gU3RhdGljIGFzc2VydGlvbiBpcyBoZXJlIHRvIGNoZWNrIHRoYXQgYSBmdXR1cmUgYWxwaGEKKyAqIFNESyBvciBhIGZ1dHVyZSBnY2Mgd29uJ3QgY2hhbmdlIHRoZSBzaXR1YXRpb24gbWFraW5nIHRoaXMgd29ya2Fyb3VuZAorICogdXNlbGVzcy4KKyAqLworLyogQ2hlY2sgdGhhdCBnY2Mgc3RpbGwgY29uc2lkZXIgd2NoYXJfdCBhcyB1bnNpZ25lZCAqLworX1NUTFBfU1RBVElDX0FTU0VSVCgoKHdjaGFyX3QpLTEgPiAwKSkKKy8qIENoZWNrIHRoYXQgV0NIQVJfTUlOIHZhbHVlIGhhc24ndCBiZWVuIGZpeGVkICovCitfU1RMUF9TVEFUSUNfQVNTRVJUKChXQ0hBUl9NSU4gPCAwKSkKKyMgICAgICB1bmRlZiBXQ0hBUl9NSU4KKyMgICAgICBkZWZpbmUgV0NIQVJfTUlOIDAKKyMgICAgICB1bmRlZiBXQ0hBUl9NQVgKKyMgICAgICBkZWZpbmUgV0NIQVJfTUFYIDB4ZmZmZmZmZmYKKyMgICAgZW5kaWYKKyMgICAgaWYgZGVmaW5lZChfX0hQX2FDQykgJiYgKF9fSFBfYUNDID49IDYwMDAwKQorLyogU3RhcnRpbmcgd2l0aCBCLjExLjMxLCBIUC1VWC9pYTY0IHByb3ZpZGVzIEM5OS1jb21wbGlhbnQgZGVmaW5pdGlvbnMKKyAqIG9mIFdDSEFSX01JTi9NQVggbWFjcm9zIHdpdGhvdXQgaGF2aW5nIHRvIGRlZmluZQorICogX0lOQ0xVREVfU1REQ19fU09VUkNFXzE5OTkwMSBtYWNybyAod2hpY2ggYUNDIGNvbXBpbGVyIGRvZXMgbm90CisgKiBwcmVkZWZpbmUpLiBMZXQgU1RMcG9ydCBwcm92aWRlIEIuMTEuMzEgZGVmaW5pdGlvbnMgb24gYW55IHZlcnNpb24gb2YKKyAqIEhQLVVYL2lhNjQuCisgKi8KKyMgICAgICB1bmRlZiBXQ0hBUl9NSU4KKyMgICAgICBkZWZpbmUgV0NIQVJfTUlOIDAKKyMgICAgICB1bmRlZiBXQ0hBUl9NQVgKKyMgICAgICBkZWZpbmUgV0NIQVJfTUFYIFVJTlRfTUFYCisjICAgIGVuZGlmCisjICBlbmRpZgorCisjICBpZiBkZWZpbmVkIChfU1RMUF9JTVBPUlRfVkVORE9SX0NTVEQpCisKKyMgICAgaWYgZGVmaW5lZCAoX19TVU5QUk9fQ0MpICYmICFkZWZpbmVkIChfU1RMUF9IQVNfTk9fTkVXX0NfSEVBREVSUykKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjp3aW50X3Q7CisjICAgIGVuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorIyAgICBpZiBkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQordHlwZWRlZiBpbnQgd2ludF90OworIyAgICBlbHNlCisvLyBnY2MgMy4wIGhhcyBhIGdsaXRjaCA6IHdpbnRfdCBvbmx5IHN1Y2tlZCBpbnRvIHRoZSBnbG9iYWwgbmFtZXNwYWNlIGlmIF9HTElCQ1BQX1VTRV9XQ0hBUl9UIGlzIGRlZmluZWQKKy8vIF9fTVdFUktTX18gaGFzIGRlZmluaXRpb24gaW4gd2NoYXJfdC5oIChNU0wgQysrKSwgYnV0IG9uZXMgZGlmZmVyIGZyb20gZGVmaW5pdGlvbgorLy8gaW4gc3RkaW8uaDsgSSBwcmVmZXIgc2V0dGluZ3MgZnJvbSBsYXN0IGZpbGUuCisjICAgICAgaWYgKGRlZmluZWQgKF9fR05VQ19fKSAmJiAhIGRlZmluZWQgKF9HTElCQ1BQX1VTRV9XQ0hBUl9UKSkKK3VzaW5nIDo6d2ludF90OworIyAgICAgIGVsc2UKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjp3aW50X3Q7CisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYKKwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnNpemVfdDsKKworIyAgICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTkFUSVZFX01CU1RBVEVfVCkgJiYgIWRlZmluZWQgKF9TVExQX1VTRV9PV05fTUJTVEFURV9UKQordXNpbmcgX1NUTFBfVkVORE9SX01CX05BTUVTUEFDRTo6bWJzdGF0ZV90OworCisjICAgICAgaWYgIWRlZmluZWQgKF9TVExQX05PX0NTVERfRlVOQ1RJT05fSU1QT1JUUykgJiYgIWRlZmluZWQoX1NUTFBfV0NIQVJfQk9STEFORF9FWENMVURFKSAmJiBcCisgICAgICAgICAoIWRlZmluZWQoX19NU0xfXykgfHwgX19NU0xfXyA+IDB4NjAwMSkKKyMgICAgICAgIGlmIGRlZmluZWQgKF9fTUlOR1czMl9fKSAmJiAoKF9fTUlOR1czMl9NQUpPUl9WRVJTSU9OID4gMykgfHwgKChfX01JTkdXMzJfTUFKT1JfVkVSU0lPTiA9PSAzKSAmJiAoX19NSU5HVzMyX01JTk9SX1ZFUlNJT04gPj0gOCkpKSB8fCBcCisgICAgICAgICAgIShkZWZpbmVkIChfX0tDQykgfHwgZGVmaW5lZCAoX19HTlVDX18pKSAmJiAhZGVmaW5lZChfU1RMUF9XQ0VfTkVUKQordXNpbmcgX1NUTFBfVkVORE9SX01CX05BTUVTUEFDRTo6YnRvd2M7CisjICAgICAgICAgIGlmICghZGVmaW5lZChfX01TTF9fKSB8fCBfX01TTF9fID4gMHg3MDAxKQordXNpbmcgX1NUTFBfVkVORE9SX01CX05BTUVTUEFDRTo6bWJzaW5pdDsKKyMgICAgICAgICAgZW5kaWYKKyMgICAgICAgIGVuZGlmCisjICAgICAgICBpZiBkZWZpbmVkIChfX01JTkdXMzJfXykgJiYgKChfX01JTkdXMzJfTUFKT1JfVkVSU0lPTiA+IDMpIHx8ICgoX19NSU5HVzMyX01BSk9SX1ZFUlNJT04gPT0gMykgJiYgKF9fTUlOR1czMl9NSU5PUl9WRVJTSU9OID49IDgpKSkgfHwgXAorICAgICAgICAgICAhZGVmaW5lZCAoX19HTlVDX18pICYmICFkZWZpbmVkKF9TVExQX1dDRV9ORVQpCit1c2luZyBfU1RMUF9WRU5ET1JfTUJfTkFNRVNQQUNFOjptYnJsZW47Cit1c2luZyBfU1RMUF9WRU5ET1JfTUJfTkFNRVNQQUNFOjptYnJ0b3djOwordXNpbmcgX1NUTFBfVkVORE9SX01CX05BTUVTUEFDRTo6bWJzcnRvd2NzOwordXNpbmcgX1NUTFBfVkVORE9SX01CX05BTUVTUEFDRTo6d2NydG9tYjsKK3VzaW5nIF9TVExQX1ZFTkRPUl9NQl9OQU1FU1BBQ0U6Ondjc3J0b21iczsKKyMgICAgICAgIGVuZGlmCisjICAgICAgZW5kaWYgLyogQk9STEFORCAmJiAhX19NU0xfXyB8fCBfX01TTF9fID4gMHg2MDAxICovCisKKyMgICAgZW5kaWYgLyogX1NUTFBfTk9fTkFUSVZFX01CU1RBVEVfVCAqLworCisjICAgIGlmICFkZWZpbmVkIChfU1RMUF9OT19OQVRJVkVfV0lERV9GVU5DVElPTlMpICYmICEgZGVmaW5lZCAoX1NUTFBfTk9fQ1NURF9GVU5DVElPTl9JTVBPUlRTKQorCisjICAgICAgaWYgIWRlZmluZWQgKF9TVExQX1dDSEFSX0JPUkxBTkRfRVhDTFVERSkgJiYgISBkZWZpbmVkIChfU1RMUF9OT19DU1REX0ZVTkNUSU9OX0lNUE9SVFMpCit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6ZmdldHdjOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmZnZXR3czsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpmcHV0d2M7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6ZnB1dHdzOworIyAgICAgIGVuZGlmCisKKyMgICAgICBpZiAhKGRlZmluZWQgKF9TVExQX1dDSEFSX1NVTlBST19FWENMVURFKSB8fCBkZWZpbmVkIChfU1RMUF9XQ0hBUl9CT1JMQU5EX0VYQ0xVREUpIHx8IFwKKyAgICAgICAgICAgIGRlZmluZWQoX1NUTFBfV0NIQVJfSFBBQ0NfRVhDTFVERSkgKQorIyAgICAgICAgaWYgIWRlZmluZWQgKF9fREVDQ1hYKQordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmZ3aWRlOworIyAgICAgICAgZW5kaWYKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpmd3ByaW50ZjsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpmd3NjYW5mOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmdldHdjaGFyOworIyAgICAgIGVuZGlmCisKKyMgICAgICBpZiAhZGVmaW5lZChfU1RMUF9XQ0hBUl9CT1JMQU5EX0VYQ0xVREUpCisjICAgICAgICBpZm5kZWYgX1NUTFBfV0NFX05FVAordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmdldHdjOworIyAgICAgICAgZW5kaWYKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjp1bmdldHdjOworIyAgICAgICAgaWZuZGVmIF9TVExQX1dDRV9ORVQKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpwdXR3YzsKKyMgICAgICAgIGVuZGlmCit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6cHV0d2NoYXI7CisjICAgICAgZW5kaWYKKworIyAgICAgIGlmICEoZGVmaW5lZCAoX1NUTFBfV0NIQVJfU1VOUFJPX0VYQ0xVREUpIHx8IGRlZmluZWQgKF9TVExQX1dDSEFSX0JPUkxBTkRfRVhDTFVERSkgfHwgXAorICAgICAgICAgICAgZGVmaW5lZCAoX1NUTFBfV0NIQVJfSFBBQ0NfRVhDTFVERSkgKQorIyAgICAgICAgaWYgZGVmaW5lZCAoX1NUTFBfTVNWQ19MSUIpICYmIChfU1RMUF9NU1ZDX0xJQiA8PSAxMzAwKSB8fCBcCisgICAgICAgICAgICBkZWZpbmVkIChfX01JTkdXMzJfXykKKyMgICAgICAgICAgdW5kZWYgc3dwcmludGYKKyMgICAgICAgICAgZGVmaW5lIHN3cHJpbnRmIF9zbndwcmludGYKKyMgICAgICAgICAgdW5kZWYgdnN3cHJpbnRmCisjICAgICAgICAgIGRlZmluZSB2c3dwcmludGYgX3ZzbndwcmludGYKK3VzaW5nIDo6c3dwcmludGY7Cit1c2luZyA6OnZzd3ByaW50ZjsKKyMgICAgICAgIGVsc2UKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpzd3ByaW50ZjsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjp2c3dwcmludGY7CisjICAgICAgICBlbmRpZgordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnN3c2NhbmY7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6dmZ3cHJpbnRmOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnZ3cHJpbnRmOworCisjICAgICAgICBpZiAoIWRlZmluZWQoX19NU0xfXykgfHwgX19NU0xfXyA+IDB4NzAwMSApICYmICFkZWZpbmVkKF9TVExQX1dDRV9ORVQpICYmIFwKKyAgICAgICAgICAgICAhZGVmaW5lZChfU1RMUF9VU0VfVUNMSUJDKSAvKiBhdCBsZWFzdCBpbiB1Q2xpYmMgMC45LjI2ICovCisKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjp3Y3NmdGltZTsKKyMgICAgICAgIGVuZGlmCit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6d2NzdG9rOworCisjICAgICAgZW5kaWYKKworIyAgICAgIGlmICFkZWZpbmVkIChfU1RMUF9XQ0VfTkVUKQordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6Ondjc2NvbGw7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6d2NzeGZybTsKKyMgICAgICBlbmRpZgordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6Ondjc2NhdDsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjp3Y3NyY2hyOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6Ondjc2NtcDsKKwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6Ondjc2NweTsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjp3Y3Njc3BuOworCit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6d2NzbGVuOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6Ondjc25jYXQ7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6d2NzbmNtcDsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjp3Y3NuY3B5OwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6Ondjc3Bicms7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6d2NzY2hyOworCit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6d2Nzc3BuOworCisjICAgICAgaWYgIWRlZmluZWQgKF9TVExQX1dDSEFSX0JPUkxBTkRfRVhDTFVERSkKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjp3Y3N0b2Q7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6d2NzdG9sOworIyAgICAgIGVuZGlmCisKKyMgICAgICBpZiAhKGRlZmluZWQgKF9TVExQX1dDSEFSX1NVTlBST19FWENMVURFKSB8fCBkZWZpbmVkIChfU1RMUF9XQ0hBUl9IUEFDQ19FWENMVURFKSApCit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6d2Nzc3RyOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OndtZW1jaHI7CisKKyMgICAgICAgIGlmICFkZWZpbmVkIChfU1RMUF9XQ0hBUl9CT1JMQU5EX0VYQ0xVREUpCisjICAgICAgICAgICAgaWYgIWRlZmluZWQgKF9TVExQX1dDRV9ORVQpCit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6d2N0b2I7CisjICAgICAgICAgICAgZW5kaWYKKyMgICAgICAgICAgaWYgIWRlZmluZWQgKF9fRE1DX18pCit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6d21lbWNtcDsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjp3bWVtbW92ZTsKKyMgICAgICAgICAgZW5kaWYKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjp3cHJpbnRmOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OndzY2FuZjsKKyMgICAgICAgIGVuZGlmCisKKyMgICAgICAgIGlmIGRlZmluZWQgKF9fQk9STEFORENfXykgJiYgIWRlZmluZWQgKF9fbGludXhfXykKK2lubGluZSB3Y2hhcl90KiBfU1RMUF93bWVtY3B5KHdjaGFyX3QqIF9fd2RzdCwgY29uc3Qgd2NoYXJfdCogX193c3JjLCBzaXplX3QgX19uKQoreyByZXR1cm4gX19TVEFUSUNfQ0FTVCh3Y2hhcl90KiwgX1NUTFBfVkVORE9SX0NTVEQ6OndtZW1jcHkoX193ZHN0LCBfX3dzcmMsIF9fbikpOyB9CitpbmxpbmUgd2NoYXJfdCogX1NUTFBfd21lbXNldCh3Y2hhcl90KiBfX3dkc3QsIHdjaGFyX3QgX193Yywgc2l6ZV90IF9fbikKK3sgcmV0dXJuIF9fU1RBVElDX0NBU1Qod2NoYXJfdCosIF9TVExQX1ZFTkRPUl9DU1REOjptZW1zZXQoX193ZHN0LCBfX3djLCBfX24pKTsgfQorIyAgICAgICAgICB1bmRlZiB3bWVtY3B5CisjICAgICAgICAgIHVuZGVmIHdtZW1zZXQKK2lubGluZSB3Y2hhcl90KiB3bWVtY3B5KHdjaGFyX3QqIF9fd2RzdCwgY29uc3Qgd2NoYXJfdCogX193c3JjLCBzaXplX3QgX19uKQoreyByZXR1cm4gX1NUTFBfd21lbWNweShfX3dkc3QsIF9fd3NyYywgX19uKTsgfQoraW5saW5lIHdjaGFyX3QqIHdtZW1zZXQod2NoYXJfdCogX193ZHN0LCB3Y2hhcl90IF9fd2MsIHNpemVfdCBfX24pCit7IHJldHVybiBfU1RMUF93bWVtc2V0KF9fd2RzdCwgX193YywgX19uKTsgfQorIyAgICAgICAgZWxpZiBkZWZpbmVkIChfX0RNQ19fKQoraW5saW5lIHdjaGFyX3QqIHdtZW1jcHkod2NoYXJfdCogX19SRVNUUklDVCBfX3dkc3QsIGNvbnN0IHdjaGFyX3QqIF9fUkVTVFJJQ1QgX193c3JjLCBzaXplX3QgX19uKQoreyByZXR1cm4gX19TVEFUSUNfQ0FTVCh3Y2hhcl90KiwgbWVtY3B5KF9fd2RzdCwgX193c3JjLCBfX24gKiBzaXplb2Yod2NoYXJfdCkpKTsgfQoraW5saW5lIHdjaGFyX3QqIHdtZW1tb3ZlKHdjaGFyX3QqIF9fUkVTVFJJQ1QgX193ZHN0LCBjb25zdCB3Y2hhcl90ICogX19SRVNUUklDVCBfX3djLCBzaXplX3QgX19uKQoreyByZXR1cm4gX19TVEFUSUNfQ0FTVCh3Y2hhcl90KiwgbWVtbW92ZShfX3dkc3QsIF9fd2MsIF9fbiAqIHNpemVvZih3Y2hhcl90KSkpOyB9CitpbmxpbmUgd2NoYXJfdCogd21lbXNldCh3Y2hhcl90KiBfX3dkc3QsIHdjaGFyX3QgX193Yywgc2l6ZV90IF9fbikKK3sgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBfX247IGkrKykgX193ZHN0W2ldID0gX193YzsgcmV0dXJuIF9fd2RzdDsgfQorIyAgICAgICAgZWxzZQordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OndtZW1jcHk7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6d21lbXNldDsKKyMgICAgICAgIGVuZGlmCisjICAgICAgZW5kaWYKKworIyAgICBlbmRpZiAvKiBfU1RMUF9OT19OQVRJVkVfV0lERV9GVU5DVElPTlMgKi8KK19TVExQX0VORF9OQU1FU1BBQ0UKKworIyAgZW5kaWYgLyogX1NUTFBfSU1QT1JUX1ZFTkRPUl9DU1REICovCisKKyMgIHVuZGVmIF9TVExQX1dDSEFSX1NVTlBST19FWENMVURFCisjICB1bmRlZiBfU1RMUF9XQ0hBUl9NU0xfRVhDTFVERQorCisjICBlbmRpZiAvKiAhZGVmaW5lZChfU1RMUF9XQ0VfRVZDMykgKi8KKworI2VuZGlmIC8qIF9TVExQX0lOVEVSTkFMX0NXQ0hBUiAqLwpkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdGwvX2N3Y3R5cGUuaCBiL3N0bHBvcnQvc3RsL19jd2N0eXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNiNTUxZgotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc3RsL19jd2N0eXBlLmgKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1dDVFlQRQorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9DV0NUWVBFCisKKyNpZiBkZWZpbmVkIChfX0JPUkxBTkRDX18pICYmICFkZWZpbmVkIChfU1RMUF9JTlRFUk5BTF9DQ1RZUEUpCisjICBpbmNsdWRlIDxzdGwvX2NjdHlwZS5oPgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfV0NFX0VWQzMpCisjICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfTkVXX0NfSEVBREVSUykKKyMgICAgaWYgZGVmaW5lZCAoX1NUTFBfSEFTX0lOQ0xVREVfTkVYVCkKKyMgICAgICBpbmNsdWRlX25leHQgPGN3Y3R5cGU+CisjICAgIGVsc2UKKyMgICAgICBpbmNsdWRlIF9TVExQX05BVElWRV9DUFBfQ19IRUFERVIoY3djdHlwZSkKKyMgICAgZW5kaWYKKyMgICAgaWYgZGVmaW5lZCAoX19NU0xfXykKK25hbWVzcGFjZSBzdGQgeworICB0eXBlZGVmIHdjaGFyX3Qgd2N0cmFuc190OworICB3aW50X3QgdG93Y3RyYW5zKHdpbnRfdCBjLCB3Y3RyYW5zX3QgdmFsdWUpOworICB3Y3RyYW5zX3Qgd2N0cmFucyhjb25zdCBjaGFyICpuYW1lKTsKK30KK3VzaW5nIHN0ZDo6d2N0cmFuc190OwordXNpbmcgc3RkOjp0b3djdHJhbnM7Cit1c2luZyBzdGQ6OndjdHJhbnM7CisjICAgIGVuZGlmCisjICBlbHNlCisjICAgIGluY2x1ZGUgPHdjdHlwZS5oPgorIyAgZW5kaWYKKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfSU1QT1JUX1ZFTkRPUl9DU1REKSAmJiAhZGVmaW5lZCAoX19ocHV4KQorCisjICAgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9HTElCQykgJiYgIShkZWZpbmVkIChfR0xJQkNQUF9VU0VfV0NIQVJfVCkgfHwgZGVmaW5lZCAoX0dMSUJDWFhfVVNFX1dDSEFSX1QpKSB8fCBcCisgICAgICAgIGRlZmluZWQgKF9fc3VuKSB8fCBkZWZpbmVkIChfX0ZyZWVCU0RfXykgfHwgXAorICAgICAgICBkZWZpbmVkIChfX0NZR1dJTl9fKSB8fCBcCisgICAgICAgIGRlZmluZWQgKF9fTUlOR1czMl9fKSAmJiAoKF9fTUlOR1czMl9NQUpPUl9WRVJTSU9OIDwgMykgfHwgKF9fTUlOR1czMl9NQUpPUl9WRVJTSU9OID09IDMpICYmIChfX01JTkdXMzJfTUlOT1JfVkVSU0lPTiA8PSAwKSkKKy8vV2UgdGFrZSB3aWRlIGZ1bmN0aW9ucyBmcm9tIGdsb2JhbCBuYW1lc3BhY2U6CisjICAgICAgZGVmaW5lIF9TVExQX1ZFTkRPUl9DU1REX1dGVU5DCisjICAgIGVsc2UKKyMgICAgICBkZWZpbmUgX1NUTFBfVkVORE9SX0NTVERfV0ZVTkMgX1NUTFBfVkVORE9SX0NTVEQKKyMgICAgZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURF9XRlVOQzo6d2N0eXBlX3Q7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURF9XRlVOQzo6d2ludF90OworIyAgICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fQ1NURF9GVU5DVElPTl9JTVBPUlRTKQorIyAgICAgIGlmICFkZWZpbmVkIChfX0JPUkxBTkRDX18pICYmICFkZWZpbmVkIChfX01TTF9fKQordXNpbmcgX1NUTFBfVkVORE9SX0NTVERfV0ZVTkM6OndjdHJhbnNfdDsKKyMgICAgICAgIGlmICFkZWZpbmVkIChfX0RNQ19fKSAmJiAoIWRlZmluZWQoX1dJTjMyX1dDRSkgfHwgKF9XSU4zMl9XQ0UgPCA0MDApKQordXNpbmcgX1NUTFBfVkVORE9SX0NTVERfV0ZVTkM6OnRvd2N0cmFuczsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REX1dGVU5DOjp3Y3RyYW5zOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVERfV0ZVTkM6OndjdHlwZTsKKyMgICAgICAgIGVuZGlmCit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURF9XRlVOQzo6aXN3Y3R5cGU7CisjICAgICAgZW5kaWYKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REX1dGVU5DOjppc3dhbG51bTsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REX1dGVU5DOjppc3dhbHBoYTsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REX1dGVU5DOjppc3djbnRybDsKKwordXNpbmcgX1NUTFBfVkVORE9SX0NTVERfV0ZVTkM6Omlzd2RpZ2l0OwordXNpbmcgX1NUTFBfVkVORE9SX0NTVERfV0ZVTkM6Omlzd2dyYXBoOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVERfV0ZVTkM6Omlzd2xvd2VyOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVERfV0ZVTkM6Omlzd3ByaW50OwordXNpbmcgX1NUTFBfVkVORE9SX0NTVERfV0ZVTkM6Omlzd3B1bmN0OwordXNpbmcgX1NUTFBfVkVORE9SX0NTVERfV0ZVTkM6Omlzd3NwYWNlOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVERfV0ZVTkM6Omlzd3VwcGVyOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVERfV0ZVTkM6Omlzd3hkaWdpdDsKKwordXNpbmcgX1NUTFBfVkVORE9SX0NTVERfV0ZVTkM6OnRvd2xvd2VyOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVERfV0ZVTkM6OnRvd3VwcGVyOworIyAgICBlbmRpZiAvKiBfU1RMUF9OT19DU1REX0ZVTkNUSU9OX0lNUE9SVFMgKi8KK19TVExQX0VORF9OQU1FU1BBQ0UKKyMgIGVuZGlmIC8qIF9TVExQX0lNUE9SVF9WRU5ET1JfQ1NURCAqLworI2VuZGlmIC8qIF9TVExQX1dDRV9FVkMzICovCisKKyNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9DV0NUWVBFICovCmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9fZGVxdWUuYyBiL3N0bHBvcnQvc3RsL19kZXF1ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZTllZjYKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9fZGVxdWUuYwpAQCAtMCwwICsxLDgyMyBAQAorLyoKKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworI2lmbmRlZiBfU1RMUF9ERVFVRV9DCisjZGVmaW5lIF9TVExQX0RFUVVFX0MKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9ERVFVRV9ICisjICBpbmNsdWRlIDxzdGwvX2RlcXVlLmg+CisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKworLy8gTm9uLWlubGluZSBtZW1iZXIgZnVuY3Rpb25zIGZyb20gX0RlcXVlX2Jhc2UuCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYyA+CitfRGVxdWVfYmFzZTxfVHAsX0FsbG9jID46On5fRGVxdWVfYmFzZSgpIHsKKyAgaWYgKF9NX21hcC5fTV9kYXRhKSB7CisgICAgX01fZGVzdHJveV9ub2RlcyhfTV9zdGFydC5fTV9ub2RlLCB0aGlzLT5fTV9maW5pc2guX01fbm9kZSArIDEpOworICAgIF9NX21hcC5kZWFsbG9jYXRlKF9NX21hcC5fTV9kYXRhLCBfTV9tYXBfc2l6ZS5fTV9kYXRhKTsKKyAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2MgPgordm9pZCBfRGVxdWVfYmFzZTxfVHAsX0FsbG9jPjo6X01faW5pdGlhbGl6ZV9tYXAoc2l6ZV90IF9fbnVtX2VsZW1lbnRzKSB7CisgIHNpemVfdCBfX251bV9ub2RlcyA9IF9fbnVtX2VsZW1lbnRzIC8gdGhpcy0+YnVmZmVyX3NpemUoKSArIDEgOworCisgIF9NX21hcF9zaXplLl9NX2RhdGEgPSAobWF4KSgoc2l6ZV90KSBfU19pbml0aWFsX21hcF9zaXplLCBfX251bV9ub2RlcyArIDIpOworICBfTV9tYXAuX01fZGF0YSA9IF9NX21hcC5hbGxvY2F0ZShfTV9tYXBfc2l6ZS5fTV9kYXRhKTsKKworICBfVHAqKiBfX25zdGFydCA9IF9NX21hcC5fTV9kYXRhICsgKF9NX21hcF9zaXplLl9NX2RhdGEgLSBfX251bV9ub2RlcykgLyAyOworICBfVHAqKiBfX25maW5pc2ggPSBfX25zdGFydCArIF9fbnVtX25vZGVzOworCisgIF9TVExQX1RSWSB7CisgICAgX01fY3JlYXRlX25vZGVzKF9fbnN0YXJ0LCBfX25maW5pc2gpOworICB9CisgIF9TVExQX1VOV0lORCgoX01fbWFwLmRlYWxsb2NhdGUoX01fbWFwLl9NX2RhdGEsIF9NX21hcF9zaXplLl9NX2RhdGEpLAorICAgICAgICAgICAgICAgIF9NX21hcC5fTV9kYXRhID0gMCwgX01fbWFwX3NpemUuX01fZGF0YSA9IDApKQorICBfTV9zdGFydC5fTV9zZXRfbm9kZShfX25zdGFydCk7CisgIHRoaXMtPl9NX2ZpbmlzaC5fTV9zZXRfbm9kZShfX25maW5pc2ggLSAxKTsKKyAgX01fc3RhcnQuX01fY3VyID0gX01fc3RhcnQuX01fZmlyc3Q7CisgIHRoaXMtPl9NX2ZpbmlzaC5fTV9jdXIgPSB0aGlzLT5fTV9maW5pc2guX01fZmlyc3QgKyBfX251bV9lbGVtZW50cyAlIHRoaXMtPmJ1ZmZlcl9zaXplKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYyA+Cit2b2lkIF9EZXF1ZV9iYXNlPF9UcCxfQWxsb2M+OjpfTV9jcmVhdGVfbm9kZXMoX1RwKiogX19uc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1RwKiogX19uZmluaXNoKSB7CisgIF9UcCoqIF9fY3VyID0gX19uc3RhcnQ7CisgIF9TVExQX1RSWSB7CisgICAgZm9yICg7IF9fY3VyIDwgX19uZmluaXNoOyArK19fY3VyKQorICAgICAgKl9fY3VyID0gX01fbWFwX3NpemUuYWxsb2NhdGUodGhpcy0+YnVmZmVyX3NpemUoKSk7CisgIH0KKyAgX1NUTFBfVU5XSU5EKF9NX2Rlc3Ryb3lfbm9kZXMoX19uc3RhcnQsIF9fY3VyKSkKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jID4KK3ZvaWQgX0RlcXVlX2Jhc2U8X1RwLF9BbGxvYz46Ol9NX2Rlc3Ryb3lfbm9kZXMoX1RwKiogX19uc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9UcCoqIF9fbmZpbmlzaCkgeworICBmb3IgKF9UcCoqIF9fbiA9IF9fbnN0YXJ0OyBfX24gPCBfX25maW5pc2g7ICsrX19uKQorICAgIF9NX21hcF9zaXplLmRlYWxsb2NhdGUoKl9fbiwgdGhpcy0+YnVmZmVyX3NpemUoKSk7Cit9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUFRSX1NQRUNJQUxJWkFUSU9OUykKKyMgIGRlZmluZSBkZXF1ZSBfU1RMUF9QVFJfSU1QTF9OQU1FKGRlcXVlKQorI2VsaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpCisjICBkZWZpbmUgZGVxdWUgX1NUTFBfTk9OX0RCR19OQU1FKGRlcXVlKQorI2Vsc2UKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9ORVNURURfVFlQRV9QQVJBTV9CVUcpCisvLyBxdWFsaWZpZWQgcmVmZXJlbmNlcworIyAgZGVmaW5lIF9faXRlcmF0b3JfXyAgIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9Ob25jb25zdF90cmFpdHM8X1RwPiA+CisjICBkZWZpbmUgY29uc3RfaXRlcmF0b3IgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX0NvbnN0X3RyYWl0czxfVHA+ICA+CisjICBkZWZpbmUgaXRlcmF0b3IgICAgICAgX19pdGVyYXRvcl9fCisjICBkZWZpbmUgc2l6ZV90eXBlICAgICAgc2l6ZV90CisjICBkZWZpbmUgdmFsdWVfdHlwZSAgICAgX1RwCisjZWxzZQorIyAgZGVmaW5lIF9faXRlcmF0b3JfXyAgIF9TVExQX1RZUEVOQU1FX09OX1JFVFVSTl9UWVBFIGRlcXVlPF9UcCwgX0FsbG9jPjo6aXRlcmF0b3IKKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2MgPgorZGVxdWU8X1RwLCBfQWxsb2MgPiYKK2RlcXVlPF9UcCwgX0FsbG9jID46Om9wZXJhdG9yPSAoY29uc3QgZGVxdWU8X1RwLCBfQWxsb2MgPiYgX194KSB7CisgIGNvbnN0IHNpemVfdHlwZSBfX2xlbiA9IHNpemUoKTsKKyAgaWYgKCZfX3ggIT0gdGhpcykgeworICAgIGlmIChfX2xlbiA+PSBfX3guc2l6ZSgpKQorICAgICAgZXJhc2UoX1NUTFBfU1REOjpjb3B5KF9feC5iZWdpbigpLCBfX3guZW5kKCksIHRoaXMtPl9NX3N0YXJ0KSwgdGhpcy0+X01fZmluaXNoKTsKKyAgICBlbHNlIHsKKyAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fbWlkID0gX194LmJlZ2luKCkgKyBkaWZmZXJlbmNlX3R5cGUoX19sZW4pOworICAgICAgX1NUTFBfU1REOjpjb3B5KF9feC5iZWdpbigpLCBfX21pZCwgdGhpcy0+X01fc3RhcnQpOworICAgICAgaW5zZXJ0KHRoaXMtPl9NX2ZpbmlzaCwgX19taWQsIF9feC5lbmQoKSk7CisgICAgfQorICB9CisgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jID4KK3ZvaWQgZGVxdWU8X1RwLCBfQWxsb2MgPjo6X01fZmlsbF9pbnNlcnQoaXRlcmF0b3IgX19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkgeworI2lmICFkZWZpbmVkIChfU1RMUF9OT19NT1ZFX1NFTUFOVElDKQorICB0eXBlZGVmIHR5cGVuYW1lIF9fbW92ZV90cmFpdHM8X1RwPjo6aW1wbGVtZW50ZWQgX01vdmFibGU7CisjZW5kaWYKKyAgaWYgKF9fcG9zLl9NX2N1ciA9PSB0aGlzLT5fTV9zdGFydC5fTV9jdXIpIHsKKyAgICBpdGVyYXRvciBfX25ld19zdGFydCA9IF9NX3Jlc2VydmVfZWxlbWVudHNfYXRfZnJvbnQoX19uKTsKKyAgICBfU1RMUF9UUlkgeworICAgICAgdW5pbml0aWFsaXplZF9maWxsKF9fbmV3X3N0YXJ0LCB0aGlzLT5fTV9zdGFydCwgX194KTsKKyAgICB9CisgICAgX1NUTFBfVU5XSU5EKHRoaXMtPl9NX2Rlc3Ryb3lfbm9kZXMoX19uZXdfc3RhcnQuX01fbm9kZSwgdGhpcy0+X01fc3RhcnQuX01fbm9kZSkpCisgICAgdGhpcy0+X01fc3RhcnQgPSBfX25ld19zdGFydDsKKyAgfQorICBlbHNlIGlmIChfX3Bvcy5fTV9jdXIgPT0gdGhpcy0+X01fZmluaXNoLl9NX2N1cikgeworICAgIGl0ZXJhdG9yIF9fbmV3X2ZpbmlzaCA9IF9NX3Jlc2VydmVfZWxlbWVudHNfYXRfYmFjayhfX24pOworICAgIF9TVExQX1RSWSB7CisgICAgICB1bmluaXRpYWxpemVkX2ZpbGwodGhpcy0+X01fZmluaXNoLCBfX25ld19maW5pc2gsIF9feCk7CisgICAgfQorICAgIF9TVExQX1VOV0lORCh0aGlzLT5fTV9kZXN0cm95X25vZGVzKHRoaXMtPl9NX2ZpbmlzaC5fTV9ub2RlKzEsIF9fbmV3X2ZpbmlzaC5fTV9ub2RlKzEpKQorICAgIHRoaXMtPl9NX2ZpbmlzaCA9IF9fbmV3X2ZpbmlzaDsKKyAgfQorICBlbHNlCisgICAgX01fZmlsbF9pbnNlcnRfYXV4KF9fcG9zLCBfX24sIF9feCwgX01vdmFibGUoKSk7Cit9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jID4KK3ZvaWQgZGVxdWU8X1RwLCBfQWxsb2M+OjppbnNlcnQoaXRlcmF0b3IgX19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlX3R5cGUqIF9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbGFzdCkgeworI2lmICFkZWZpbmVkIChfU1RMUF9OT19NT1ZFX1NFTUFOVElDKQorICB0eXBlZGVmIHR5cGVuYW1lIF9fbW92ZV90cmFpdHM8X1RwPjo6aW1wbGVtZW50ZWQgX01vdmFibGU7CisjZW5kaWYKKyAgc2l6ZV90eXBlIF9fbiA9IF9fbGFzdCAtIF9fZmlyc3Q7CisgIGlmIChfX3Bvcy5fTV9jdXIgPT0gdGhpcy0+X01fc3RhcnQuX01fY3VyKSB7CisgICAgaXRlcmF0b3IgX19uZXdfc3RhcnQgPSBfTV9yZXNlcnZlX2VsZW1lbnRzX2F0X2Zyb250KF9fbik7CisgICAgX1NUTFBfVFJZIHsKKyAgICAgIF9TVExQX1BSSVYgX191Y29weShfX2ZpcnN0LCBfX2xhc3QsIF9fbmV3X3N0YXJ0KTsKKyAgICB9CisgICAgX1NUTFBfVU5XSU5EKHRoaXMtPl9NX2Rlc3Ryb3lfbm9kZXMoX19uZXdfc3RhcnQuX01fbm9kZSwgdGhpcy0+X01fc3RhcnQuX01fbm9kZSkpCisgICAgdGhpcy0+X01fc3RhcnQgPSBfX25ld19zdGFydDsKKyAgfQorICBlbHNlIGlmIChfX3Bvcy5fTV9jdXIgPT0gdGhpcy0+X01fZmluaXNoLl9NX2N1cikgeworICAgIGl0ZXJhdG9yIF9fbmV3X2ZpbmlzaCA9IF9NX3Jlc2VydmVfZWxlbWVudHNfYXRfYmFjayhfX24pOworICAgIF9TVExQX1RSWSB7CisgICAgICBfU1RMUF9QUklWIF9fdWNvcHkoX19maXJzdCwgX19sYXN0LCB0aGlzLT5fTV9maW5pc2gpOworICAgIH0KKyAgICBfU1RMUF9VTldJTkQodGhpcy0+X01fZGVzdHJveV9ub2Rlcyh0aGlzLT5fTV9maW5pc2guX01fbm9kZSArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19uZXdfZmluaXNoLl9NX25vZGUgKyAxKSkKKyAgICB0aGlzLT5fTV9maW5pc2ggPSBfX25ld19maW5pc2g7CisgIH0KKyAgZWxzZQorICAgIF9NX2luc2VydF9yYW5nZV9hdXgoX19wb3MsIF9fZmlyc3QsIF9fbGFzdCwgX19uLCBfTW92YWJsZSgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jID4KK3ZvaWQgZGVxdWU8X1RwLF9BbGxvYz46Omluc2VydChpdGVyYXRvciBfX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpIHsKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX21vdmVfdHJhaXRzPF9UcD46OmltcGxlbWVudGVkIF9Nb3ZhYmxlOworI2VuZGlmCisgIHNpemVfdHlwZSBfX24gPSBfX2xhc3QgLSBfX2ZpcnN0OworICBpZiAoX19wb3MuX01fY3VyID09IHRoaXMtPl9NX3N0YXJ0Ll9NX2N1cikgeworICAgIGl0ZXJhdG9yIF9fbmV3X3N0YXJ0ID0gX01fcmVzZXJ2ZV9lbGVtZW50c19hdF9mcm9udChfX24pOworICAgIF9TVExQX1RSWSB7CisgICAgICBfU1RMUF9QUklWIF9fdWNvcHkoX19maXJzdCwgX19sYXN0LCBfX25ld19zdGFydCk7CisgICAgfQorICAgIF9TVExQX1VOV0lORCh0aGlzLT5fTV9kZXN0cm95X25vZGVzKF9fbmV3X3N0YXJ0Ll9NX25vZGUsIHRoaXMtPl9NX3N0YXJ0Ll9NX25vZGUpKQorICAgIHRoaXMtPl9NX3N0YXJ0ID0gX19uZXdfc3RhcnQ7CisgIH0KKyAgZWxzZSBpZiAoX19wb3MuX01fY3VyID09IHRoaXMtPl9NX2ZpbmlzaC5fTV9jdXIpIHsKKyAgICBpdGVyYXRvciBfX25ld19maW5pc2ggPSBfTV9yZXNlcnZlX2VsZW1lbnRzX2F0X2JhY2soX19uKTsKKyAgICBfU1RMUF9UUlkgeworICAgICAgX1NUTFBfUFJJViBfX3Vjb3B5KF9fZmlyc3QsIF9fbGFzdCwgdGhpcy0+X01fZmluaXNoKTsKKyAgICB9CisgICAgX1NUTFBfVU5XSU5EKHRoaXMtPl9NX2Rlc3Ryb3lfbm9kZXModGhpcy0+X01fZmluaXNoLl9NX25vZGUgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbmV3X2ZpbmlzaC5fTV9ub2RlICsgMSkpCisgICAgdGhpcy0+X01fZmluaXNoID0gX19uZXdfZmluaXNoOworICB9CisgIGVsc2UKKyAgICBfTV9pbnNlcnRfcmFuZ2VfYXV4KF9fcG9zLCBfX2ZpcnN0LCBfX2xhc3QsIF9fbiwgX01vdmFibGUoKSk7Cit9CisKKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYyA+CitfX2l0ZXJhdG9yX18gZGVxdWU8X1RwLF9BbGxvYz46Ol9NX2VyYXNlKGl0ZXJhdG9yIF9fcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX3RydWVfdHlwZSYgLypfTW92YWJsZSovKSB7CisgIGRpZmZlcmVuY2VfdHlwZSBfX2luZGV4ID0gX19wb3MgLSB0aGlzLT5fTV9zdGFydDsKKyAgaWYgKHNpemVfdHlwZShfX2luZGV4KSA8IHRoaXMtPnNpemUoKSA+PiAxKSB7CisgICAgLy9XZSBtb3ZlIHRoZSBzdGFydCBvZiB0aGUgZGVxdWUgb25lIHBvc2l0aW9uIHRvIHRoZSByaWdodAorICAgIC8vc3RhcnRpbmcgZnJvbSB0aGUgcmlnaHRtb3N0IGVsZW1lbnQgdG8gbW92ZS4KKyAgICBpdGVyYXRvciBfX3NyYyA9IF9fcG9zLCBfX2RzdCA9IF9fcG9zOworICAgIF9TVExQX1NURDo6X0Rlc3Ryb3koJigqX19kc3QpKTsKKyAgICBpZiAoX19zcmMgIT0gdGhpcy0+X01fc3RhcnQpIHsKKyAgICAgIGZvciAoLS1fX3NyYzsgX19kc3QgIT0gdGhpcy0+X01fc3RhcnQ7IC0tX19zcmMsIC0tX19kc3QpIHsKKyAgICAgICAgX1NUTFBfU1REOjpfTW92ZV9Db25zdHJ1Y3QoJigqX19kc3QpLCAqX19zcmMpOworICAgICAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95X01vdmVkKCYoKl9fc3JjKSk7CisgICAgICB9CisgICAgfQorICAgIF9NX3BvcF9mcm9udF9hdXgoKTsKKyAgfQorICBlbHNlIHsKKyAgICBpdGVyYXRvciBfX3NyYyA9IF9fcG9zLCBfX2RzdCA9IF9fcG9zOworICAgIF9TVExQX1NURDo6X0Rlc3Ryb3koJigqX19kc3QpKTsKKyAgICBmb3IgKCsrX19zcmM7IF9fc3JjICE9IHRoaXMtPl9NX2ZpbmlzaDsgKytfX3NyYywgKytfX2RzdCkgeworICAgICAgX1NUTFBfU1REOjpfTW92ZV9Db25zdHJ1Y3QoJigqX19kc3QpLCAqX19zcmMpOworICAgICAgX1NUTFBfU1REOjpfRGVzdHJveV9Nb3ZlZCgmKCpfX3NyYykpOworICAgIH0KKyAgICAvL0R1cGxpY2F0aW9uIG9mIHRoZSBwb3BfYmFjayBjb2RlIHdpdGhvdXQgdGhlIGRlc3Ryb3kgd2hpY2ggaGFzIGFscmVhZHkgYmVlbiBkb25lOgorICAgIGlmICh0aGlzLT5fTV9maW5pc2guX01fY3VyICE9IHRoaXMtPl9NX2ZpbmlzaC5fTV9maXJzdCkgeworICAgICAgLS10aGlzLT5fTV9maW5pc2guX01fY3VyOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIF9NX3BvcF9iYWNrX2F1eCgpOworICAgIH0KKyAgfQorICByZXR1cm4gdGhpcy0+X01fc3RhcnQgKyBfX2luZGV4OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2MgPgorX19pdGVyYXRvcl9fIGRlcXVlPF9UcCxfQWxsb2M+OjpfTV9lcmFzZShpdGVyYXRvciBfX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19mYWxzZV90eXBlJiAvKl9Nb3ZhYmxlKi8pIHsKKyAgaXRlcmF0b3IgX19uZXh0ID0gX19wb3M7CisgICsrX19uZXh0OworICBkaWZmZXJlbmNlX3R5cGUgX19pbmRleCA9IF9fcG9zIC0gdGhpcy0+X01fc3RhcnQ7CisgIGlmIChzaXplX3R5cGUoX19pbmRleCkgPCB0aGlzLT5zaXplKCkgPj4gMSkgeworICAgIGNvcHlfYmFja3dhcmQodGhpcy0+X01fc3RhcnQsIF9fcG9zLCBfX25leHQpOworICAgIHBvcF9mcm9udCgpOworICB9CisgIGVsc2UgeworICAgIF9TVExQX1NURDo6Y29weShfX25leHQsIHRoaXMtPl9NX2ZpbmlzaCwgX19wb3MpOworICAgIHBvcF9iYWNrKCk7CisgIH0KKyAgcmV0dXJuIHRoaXMtPl9NX3N0YXJ0ICsgX19pbmRleDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jID4KK19faXRlcmF0b3JfXyBkZXF1ZTxfVHAsX0FsbG9jPjo6X01fZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX3RydWVfdHlwZSYgLypfTW92YWJsZSovKSB7CisgIGRpZmZlcmVuY2VfdHlwZSBfX24gPSBfX2xhc3QgLSBfX2ZpcnN0OworICBkaWZmZXJlbmNlX3R5cGUgX19lbGVtc19iZWZvcmUgPSBfX2ZpcnN0IC0gdGhpcy0+X01fc3RhcnQ7CisgIGlmIChfX2VsZW1zX2JlZm9yZSA8PSBkaWZmZXJlbmNlX3R5cGUodGhpcy0+c2l6ZSgpIC0gX19uKSAvIDIpIHsKKyAgICBpdGVyYXRvciBfX3NyYyA9IF9fZmlyc3QsIF9fZHN0ID0gX19sYXN0OworICAgIGlmIChfX3NyYyAhPSB0aGlzLT5fTV9zdGFydCkgeworICAgICAgZm9yICgtLV9fc3JjLCAtLV9fZHN0OyAoX19zcmMgPj0gdGhpcy0+X01fc3RhcnQpICYmIChfX2RzdCA+PSBfX2ZpcnN0KTsgLS1fX3NyYywgLS1fX2RzdCkgeworICAgICAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95KCYoKl9fZHN0KSk7CisgICAgICAgIF9TVExQX1NURDo6X01vdmVfQ29uc3RydWN0KCYoKl9fZHN0KSwgKl9fc3JjKTsKKyAgICAgIH0KKyAgICAgIGlmIChfX2RzdCA+PSBfX2ZpcnN0KSB7CisgICAgICAgIC8vVGhlcmUgYXJlIG1vcmUgZWxlbWVudHMgdG8gZXJhc2UgdGhhbiBlbGVtZW50cyB0byBtb3ZlCisgICAgICAgIF9TVExQX1NURDo6X0Rlc3Ryb3lfUmFuZ2UoX19maXJzdCwgKytfX2RzdCk7CisgICAgICAgIF9TVExQX1NURDo6X0Rlc3Ryb3lfTW92ZWRfUmFuZ2UodGhpcy0+X01fc3RhcnQsIF9fZmlyc3QpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIC8vVGhlcmUgYXJlIG1vcmUgZWxlbWVudHMgdG8gbW92ZSB0aGFuIGVsZW1lbnRzIHRvIGVyYXNlCisgICAgICAgIGZvciAoOyBfX3NyYyA+PSB0aGlzLT5fTV9zdGFydDsgLS1fX3NyYywgLS1fX2RzdCkgeworICAgICAgICAgIF9TVExQX1NURDo6X0Rlc3Ryb3lfTW92ZWQoJigqX19kc3QpKTsKKyAgICAgICAgICBfU1RMUF9TVEQ6Ol9Nb3ZlX0NvbnN0cnVjdCgmKCpfX2RzdCksICpfX3NyYyk7CisgICAgICAgIH0KKyAgICAgICAgX1NUTFBfU1REOjpfRGVzdHJveV9Nb3ZlZF9SYW5nZSh0aGlzLT5fTV9zdGFydCwgKytfX2RzdCk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgX1NUTFBfU1REOjpfRGVzdHJveV9SYW5nZSh0aGlzLT5fTV9zdGFydCwgX19sYXN0KTsKKyAgICB9CisgICAgaXRlcmF0b3IgX19uZXdfc3RhcnQgPSB0aGlzLT5fTV9zdGFydCArIF9fbjsKKyAgICB0aGlzLT5fTV9kZXN0cm95X25vZGVzKHRoaXMtPl9NX3N0YXJ0Ll9NX25vZGUsIF9fbmV3X3N0YXJ0Ll9NX25vZGUpOworICAgIHRoaXMtPl9NX3N0YXJ0ID0gX19uZXdfc3RhcnQ7CisgIH0KKyAgZWxzZSB7CisgICAgaWYgKF9fbGFzdCAhPSB0aGlzLT5fTV9maW5pc2gpIHsKKyAgICAgIGl0ZXJhdG9yIF9fc3JjID0gX19sYXN0LCBfX2RzdCA9IF9fZmlyc3Q7CisgICAgICBmb3IgKDsgKF9fc3JjICE9IHRoaXMtPl9NX2ZpbmlzaCkgJiYgKF9fZHN0ICE9IF9fbGFzdCk7ICsrX19zcmMsICsrX19kc3QpIHsKKyAgICAgICAgX1NUTFBfU1REOjpfRGVzdHJveSgmKCpfX2RzdCkpOworICAgICAgICBfU1RMUF9TVEQ6Ol9Nb3ZlX0NvbnN0cnVjdCgmKCpfX2RzdCksICpfX3NyYyk7CisgICAgICB9CisgICAgICBpZiAoX19kc3QgIT0gX19sYXN0KSB7CisgICAgICAgIC8vVGhlcmUgYXJlIG1vcmUgZWxlbWVudHMgdG8gZXJhc2UgdGhhbiBlbGVtZW50cyB0byBtb3ZlCisgICAgICAgIF9TVExQX1NURDo6X0Rlc3Ryb3lfUmFuZ2UoX19kc3QsIF9fbGFzdCk7CisgICAgICAgIF9TVExQX1NURDo6X0Rlc3Ryb3lfTW92ZWRfUmFuZ2UoX19sYXN0LCB0aGlzLT5fTV9maW5pc2gpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIC8vVGhlcmUgYXJlIG1vcmUgZWxlbWVudHMgdG8gbW92ZSB0aGFuIGVsZW1lbnRzIHRvIGVyYXNlCisgICAgICAgIGZvciAoOyBfX3NyYyAhPSB0aGlzLT5fTV9maW5pc2g7ICsrX19zcmMsICsrX19kc3QpIHsKKyAgICAgICAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95X01vdmVkKCYoKl9fZHN0KSk7CisgICAgICAgICAgX1NUTFBfU1REOjpfTW92ZV9Db25zdHJ1Y3QoJigqX19kc3QpLCAqX19zcmMpOworICAgICAgICB9CisgICAgICAgIF9TVExQX1NURDo6X0Rlc3Ryb3lfTW92ZWRfUmFuZ2UoX19kc3QsIHRoaXMtPl9NX2ZpbmlzaCk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgX1NUTFBfU1REOjpfRGVzdHJveV9SYW5nZShfX2ZpcnN0LCB0aGlzLT5fTV9maW5pc2gpOworICAgIH0KKyAgICBpdGVyYXRvciBfX25ld19maW5pc2ggPSB0aGlzLT5fTV9maW5pc2ggLSBfX247CisgICAgdGhpcy0+X01fZGVzdHJveV9ub2RlcyhfX25ld19maW5pc2guX01fbm9kZSArIDEsIHRoaXMtPl9NX2ZpbmlzaC5fTV9ub2RlICsgMSk7CisgICAgdGhpcy0+X01fZmluaXNoID0gX19uZXdfZmluaXNoOworICB9CisgIHJldHVybiB0aGlzLT5fTV9zdGFydCArIF9fZWxlbXNfYmVmb3JlOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2MgPgorX19pdGVyYXRvcl9fIGRlcXVlPF9UcCxfQWxsb2M+OjpfTV9lcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypfTW92YWJsZSovKSB7CisgIGRpZmZlcmVuY2VfdHlwZSBfX24gPSBfX2xhc3QgLSBfX2ZpcnN0OworICBkaWZmZXJlbmNlX3R5cGUgX19lbGVtc19iZWZvcmUgPSBfX2ZpcnN0IC0gdGhpcy0+X01fc3RhcnQ7CisgIGlmIChfX2VsZW1zX2JlZm9yZSA8PSBkaWZmZXJlbmNlX3R5cGUodGhpcy0+c2l6ZSgpIC0gX19uKSAvIDIpIHsKKyAgICBjb3B5X2JhY2t3YXJkKHRoaXMtPl9NX3N0YXJ0LCBfX2ZpcnN0LCBfX2xhc3QpOworICAgIGl0ZXJhdG9yIF9fbmV3X3N0YXJ0ID0gdGhpcy0+X01fc3RhcnQgKyBfX247CisgICAgX1NUTFBfU1REOjpfRGVzdHJveV9SYW5nZSh0aGlzLT5fTV9zdGFydCwgX19uZXdfc3RhcnQpOworICAgIHRoaXMtPl9NX2Rlc3Ryb3lfbm9kZXModGhpcy0+X01fc3RhcnQuX01fbm9kZSwgX19uZXdfc3RhcnQuX01fbm9kZSk7CisgICAgdGhpcy0+X01fc3RhcnQgPSBfX25ld19zdGFydDsKKyAgfQorICBlbHNlIHsKKyAgICBfU1RMUF9TVEQ6OmNvcHkoX19sYXN0LCB0aGlzLT5fTV9maW5pc2gsIF9fZmlyc3QpOworICAgIGl0ZXJhdG9yIF9fbmV3X2ZpbmlzaCA9IHRoaXMtPl9NX2ZpbmlzaCAtIF9fbjsKKyAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95X1JhbmdlKF9fbmV3X2ZpbmlzaCwgdGhpcy0+X01fZmluaXNoKTsKKyAgICB0aGlzLT5fTV9kZXN0cm95X25vZGVzKF9fbmV3X2ZpbmlzaC5fTV9ub2RlICsgMSwgdGhpcy0+X01fZmluaXNoLl9NX25vZGUgKyAxKTsKKyAgICB0aGlzLT5fTV9maW5pc2ggPSBfX25ld19maW5pc2g7CisgIH0KKyAgcmV0dXJuIHRoaXMtPl9NX3N0YXJ0ICsgX19lbGVtc19iZWZvcmU7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYyA+Cit2b2lkIGRlcXVlPF9UcCxfQWxsb2M+OjpjbGVhcigpIHsKKyAgZm9yIChfTWFwX3BvaW50ZXIgX19ub2RlID0gdGhpcy0+X01fc3RhcnQuX01fbm9kZSArIDE7CisgICAgICAgX19ub2RlIDwgdGhpcy0+X01fZmluaXNoLl9NX25vZGU7CisgICAgICAgKytfX25vZGUpIHsKKyAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95X1JhbmdlKCpfX25vZGUsICpfX25vZGUgKyB0aGlzLT5idWZmZXJfc2l6ZSgpKTsKKyAgICB0aGlzLT5fTV9tYXBfc2l6ZS5kZWFsbG9jYXRlKCpfX25vZGUsIHRoaXMtPmJ1ZmZlcl9zaXplKCkpOworICB9CisKKyAgaWYgKHRoaXMtPl9NX3N0YXJ0Ll9NX25vZGUgIT0gdGhpcy0+X01fZmluaXNoLl9NX25vZGUpIHsKKyAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95X1JhbmdlKHRoaXMtPl9NX3N0YXJ0Ll9NX2N1ciwgdGhpcy0+X01fc3RhcnQuX01fbGFzdCk7CisgICAgX1NUTFBfU1REOjpfRGVzdHJveV9SYW5nZSh0aGlzLT5fTV9maW5pc2guX01fZmlyc3QsIHRoaXMtPl9NX2ZpbmlzaC5fTV9jdXIpOworICAgIHRoaXMtPl9NX21hcF9zaXplLmRlYWxsb2NhdGUodGhpcy0+X01fZmluaXNoLl9NX2ZpcnN0LCB0aGlzLT5idWZmZXJfc2l6ZSgpKTsKKyAgfQorICBlbHNlCisgICAgX1NUTFBfU1REOjpfRGVzdHJveV9SYW5nZSh0aGlzLT5fTV9zdGFydC5fTV9jdXIsIHRoaXMtPl9NX2ZpbmlzaC5fTV9jdXIpOworCisgIHRoaXMtPl9NX2ZpbmlzaCA9IHRoaXMtPl9NX3N0YXJ0OworfQorCisvLyBQcmVjb25kaXRpb246IHRoaXMtPl9NX3N0YXJ0IGFuZCB0aGlzLT5fTV9maW5pc2ggaGF2ZSBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQsCisvLyBidXQgbm9uZSBvZiB0aGUgZGVxdWUncyBlbGVtZW50cyBoYXZlIHlldCBiZWVuIGNvbnN0cnVjdGVkLgordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jID4KK3ZvaWQgZGVxdWU8X1RwLF9BbGxvYz46Ol9NX2ZpbGxfaW5pdGlhbGl6ZShjb25zdCB2YWx1ZV90eXBlJiBfX3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qX1RyaXZpYWxJbml0Ki8pIHsKKyAgX01hcF9wb2ludGVyIF9fY3VyID0gdGhpcy0+X01fc3RhcnQuX01fbm9kZTsKKyAgX1NUTFBfVFJZIHsKKyAgICBmb3IgKDsgX19jdXIgPCB0aGlzLT5fTV9maW5pc2guX01fbm9kZTsgKytfX2N1cikKKyAgICAgIHVuaW5pdGlhbGl6ZWRfZmlsbCgqX19jdXIsICpfX2N1ciArIHRoaXMtPmJ1ZmZlcl9zaXplKCksIF9fdmFsKTsKKyAgICB1bmluaXRpYWxpemVkX2ZpbGwodGhpcy0+X01fZmluaXNoLl9NX2ZpcnN0LCB0aGlzLT5fTV9maW5pc2guX01fY3VyLCBfX3ZhbCk7CisgIH0KKyAgX1NUTFBfVU5XSU5EKF9TVExQX1NURDo6X0Rlc3Ryb3lfUmFuZ2UodGhpcy0+X01fc3RhcnQsIGl0ZXJhdG9yKCpfX2N1ciwgX19jdXIpKSkKK30KKworCisvLyBDYWxsZWQgb25seSBpZiB0aGlzLT5fTV9maW5pc2guX01fY3VyID09IHRoaXMtPl9NX2ZpbmlzaC5fTV9sYXN0IC0gMS4KK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYyA+Cit2b2lkIGRlcXVlPF9UcCxfQWxsb2M+OjpfTV9wdXNoX2JhY2tfYXV4X3YoY29uc3QgdmFsdWVfdHlwZSYgX190KSB7CisgIF9NX3Jlc2VydmVfbWFwX2F0X2JhY2soKTsKKyAgKih0aGlzLT5fTV9maW5pc2guX01fbm9kZSArIDEpID0gdGhpcy0+X01fbWFwX3NpemUuYWxsb2NhdGUodGhpcy0+YnVmZmVyX3NpemUoKSk7CisgIF9TVExQX1RSWSB7CisgICAgX0NvcHlfQ29uc3RydWN0KHRoaXMtPl9NX2ZpbmlzaC5fTV9jdXIsIF9fdCk7CisgICAgdGhpcy0+X01fZmluaXNoLl9NX3NldF9ub2RlKHRoaXMtPl9NX2ZpbmlzaC5fTV9ub2RlICsgMSk7CisgICAgdGhpcy0+X01fZmluaXNoLl9NX2N1ciA9IHRoaXMtPl9NX2ZpbmlzaC5fTV9maXJzdDsKKyAgfQorICBfU1RMUF9VTldJTkQodGhpcy0+X01fbWFwX3NpemUuZGVhbGxvY2F0ZSgqKHRoaXMtPl9NX2ZpbmlzaC5fTV9ub2RlICsgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPmJ1ZmZlcl9zaXplKCkpKQorfQorCisjaWYgZGVmaW5lZChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKSAmJiAhZGVmaW5lZChfU1RMUF9OT19BTkFDSFJPTklTTVMpCisvLyBDYWxsZWQgb25seSBpZiB0aGlzLT5fTV9maW5pc2guX01fY3VyID09IHRoaXMtPl9NX2ZpbmlzaC5fTV9sYXN0IC0gMS4KK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYyA+Cit2b2lkIGRlcXVlPF9UcCxfQWxsb2M+OjpfTV9wdXNoX2JhY2tfYXV4KCkgeworICBfTV9yZXNlcnZlX21hcF9hdF9iYWNrKCk7CisgICoodGhpcy0+X01fZmluaXNoLl9NX25vZGUgKyAxKSA9IHRoaXMtPl9NX21hcF9zaXplLmFsbG9jYXRlKHRoaXMtPmJ1ZmZlcl9zaXplKCkpOworICBfU1RMUF9UUlkgeworICAgIF9TVExQX1NURDo6X0NvbnN0cnVjdCh0aGlzLT5fTV9maW5pc2guX01fY3VyKTsKKyAgICB0aGlzLT5fTV9maW5pc2guX01fc2V0X25vZGUodGhpcy0+X01fZmluaXNoLl9NX25vZGUgKyAxKTsKKyAgICB0aGlzLT5fTV9maW5pc2guX01fY3VyID0gdGhpcy0+X01fZmluaXNoLl9NX2ZpcnN0OworICB9CisgIF9TVExQX1VOV0lORCh0aGlzLT5fTV9tYXBfc2l6ZS5kZWFsbG9jYXRlKCoodGhpcy0+X01fZmluaXNoLl9NX25vZGUgKyAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+YnVmZmVyX3NpemUoKSkpCit9CisjZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNICYmICFfU1RMUF9OT19BTkFDSFJPTklTTVMqLworCisvLyBDYWxsZWQgb25seSBpZiB0aGlzLT5fTV9zdGFydC5fTV9jdXIgPT0gdGhpcy0+X01fc3RhcnQuX01fZmlyc3QuCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2MgPgordm9pZCBkZXF1ZTxfVHAsX0FsbG9jPjo6X01fcHVzaF9mcm9udF9hdXhfdihjb25zdCB2YWx1ZV90eXBlJiBfX3QpIHsKKyAgX01fcmVzZXJ2ZV9tYXBfYXRfZnJvbnQoKTsKKyAgKih0aGlzLT5fTV9zdGFydC5fTV9ub2RlIC0gMSkgPSB0aGlzLT5fTV9tYXBfc2l6ZS5hbGxvY2F0ZSh0aGlzLT5idWZmZXJfc2l6ZSgpKTsKKyAgX1NUTFBfVFJZIHsKKyAgICB0aGlzLT5fTV9zdGFydC5fTV9zZXRfbm9kZSh0aGlzLT5fTV9zdGFydC5fTV9ub2RlIC0gMSk7CisgICAgdGhpcy0+X01fc3RhcnQuX01fY3VyID0gdGhpcy0+X01fc3RhcnQuX01fbGFzdCAtIDE7CisgICAgX0NvcHlfQ29uc3RydWN0KHRoaXMtPl9NX3N0YXJ0Ll9NX2N1ciwgX190KTsKKyAgfQorICBfU1RMUF9VTldJTkQoKCsrdGhpcy0+X01fc3RhcnQsCisgICAgICAgICAgICAgICAgdGhpcy0+X01fbWFwX3NpemUuZGVhbGxvY2F0ZSgqKHRoaXMtPl9NX3N0YXJ0Ll9NX25vZGUgLSAxKSwgdGhpcy0+YnVmZmVyX3NpemUoKSkpKQorfQorCisKKyNpZiBkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fQU5BQ0hST05JU01TKQorLy8gQ2FsbGVkIG9ubHkgaWYgdGhpcy0+X01fc3RhcnQuX01fY3VyID09IHRoaXMtPl9NX3N0YXJ0Ll9NX2ZpcnN0LgordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jID4KK3ZvaWQgZGVxdWU8X1RwLF9BbGxvYz46Ol9NX3B1c2hfZnJvbnRfYXV4KCkgeworICBfTV9yZXNlcnZlX21hcF9hdF9mcm9udCgpOworICAqKHRoaXMtPl9NX3N0YXJ0Ll9NX25vZGUgLSAxKSA9IHRoaXMtPl9NX21hcF9zaXplLmFsbG9jYXRlKHRoaXMtPmJ1ZmZlcl9zaXplKCkpOworICBfU1RMUF9UUlkgeworICAgIHRoaXMtPl9NX3N0YXJ0Ll9NX3NldF9ub2RlKHRoaXMtPl9NX3N0YXJ0Ll9NX25vZGUgLSAxKTsKKyAgICB0aGlzLT5fTV9zdGFydC5fTV9jdXIgPSB0aGlzLT5fTV9zdGFydC5fTV9sYXN0IC0gMTsKKyAgICBfU1RMUF9TVEQ6Ol9Db25zdHJ1Y3QodGhpcy0+X01fc3RhcnQuX01fY3VyKTsKKyAgfQorICBfU1RMUF9VTldJTkQoKCsrdGhpcy0+X01fc3RhcnQsIHRoaXMtPl9NX21hcF9zaXplLmRlYWxsb2NhdGUoKih0aGlzLT5fTV9zdGFydC5fTV9ub2RlIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5idWZmZXJfc2l6ZSgpKSkpCit9CisjZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNICYmICFfU1RMUF9OT19BTkFDSFJPTklTTVMqLworCisvLyBDYWxsZWQgb25seSBpZiB0aGlzLT5fTV9maW5pc2guX01fY3VyID09IHRoaXMtPl9NX2ZpbmlzaC5fTV9maXJzdC4KK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYyA+Cit2b2lkIGRlcXVlPF9UcCxfQWxsb2M+OjpfTV9wb3BfYmFja19hdXgoKSB7CisgIHRoaXMtPl9NX21hcF9zaXplLmRlYWxsb2NhdGUodGhpcy0+X01fZmluaXNoLl9NX2ZpcnN0LCB0aGlzLT5idWZmZXJfc2l6ZSgpKTsKKyAgdGhpcy0+X01fZmluaXNoLl9NX3NldF9ub2RlKHRoaXMtPl9NX2ZpbmlzaC5fTV9ub2RlIC0gMSk7CisgIHRoaXMtPl9NX2ZpbmlzaC5fTV9jdXIgPSB0aGlzLT5fTV9maW5pc2guX01fbGFzdCAtIDE7Cit9CisKKy8vIE5vdGUgdGhhdCBpZiB0aGUgZGVxdWUgaGFzIGF0IGxlYXN0IG9uZSBlbGVtZW50IChhIHByZWNvbmRpdGlvbiBmb3IgdGhpcyBtZW1iZXIKKy8vIGZ1bmN0aW9uKSwgYW5kIGlmIHRoaXMtPl9NX3N0YXJ0Ll9NX2N1ciA9PSB0aGlzLT5fTV9zdGFydC5fTV9sYXN0LCB0aGVuIHRoZSBkZXF1ZQorLy8gbXVzdCBoYXZlIGF0IGxlYXN0IHR3byBub2Rlcy4KK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYyA+Cit2b2lkIGRlcXVlPF9UcCxfQWxsb2M+OjpfTV9wb3BfZnJvbnRfYXV4KCkgeworICBpZiAodGhpcy0+X01fc3RhcnQuX01fY3VyICE9IHRoaXMtPl9NX3N0YXJ0Ll9NX2xhc3QgLSAxKQorICAgICsrdGhpcy0+X01fc3RhcnQuX01fY3VyOworICBlbHNlIHsKKyAgICB0aGlzLT5fTV9tYXBfc2l6ZS5kZWFsbG9jYXRlKHRoaXMtPl9NX3N0YXJ0Ll9NX2ZpcnN0LCB0aGlzLT5idWZmZXJfc2l6ZSgpKTsKKyAgICB0aGlzLT5fTV9zdGFydC5fTV9zZXRfbm9kZSh0aGlzLT5fTV9zdGFydC5fTV9ub2RlICsgMSk7CisgICAgdGhpcy0+X01fc3RhcnQuX01fY3VyID0gdGhpcy0+X01fc3RhcnQuX01fZmlyc3Q7CisgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jID4KK19faXRlcmF0b3JfXyBkZXF1ZTxfVHAsX0FsbG9jPjo6X01fZmlsbF9pbnNlcnRfYXV4KGl0ZXJhdG9yIF9fcG9zLCBzaXplX3R5cGUgX19uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWVfdHlwZSYgX194LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX190cnVlX3R5cGUmIC8qX01vdmFibGUqLykgeworICBjb25zdCBkaWZmZXJlbmNlX3R5cGUgX19lbGVtc19iZWZvcmUgPSBfX3BvcyAtIHRoaXMtPl9NX3N0YXJ0OworICBzaXplX3R5cGUgX19sZW5ndGggPSB0aGlzLT5zaXplKCk7CisgIHZhbHVlX3R5cGUgX194X2NvcHkgPSBfX3g7CisgIGlmIChfX2VsZW1zX2JlZm9yZSA8PSBkaWZmZXJlbmNlX3R5cGUoX19sZW5ndGggLyAyKSkgeworICAgIGl0ZXJhdG9yIF9fbmV3X3N0YXJ0ID0gX01fcmVzZXJ2ZV9lbGVtZW50c19hdF9mcm9udChfX24pOworICAgIF9fcG9zID0gdGhpcy0+X01fc3RhcnQgKyBfX2VsZW1zX2JlZm9yZTsKKyAgICBfU1RMUF9UUlkgeworICAgICAgaXRlcmF0b3IgX19kc3QgPSBfX25ld19zdGFydDsKKyAgICAgIGl0ZXJhdG9yIF9fc3JjID0gdGhpcy0+X01fc3RhcnQ7CisgICAgICBmb3IgKDsgX19zcmMgIT0gX19wb3M7ICsrX19kc3QsICsrX19zcmMpIHsKKyAgICAgICAgX1NUTFBfU1REOjpfTW92ZV9Db25zdHJ1Y3QoJigqX19kc3QpLCAqX19zcmMpOworICAgICAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95X01vdmVkKCYoKl9fc3JjKSk7CisgICAgICB9CisgICAgICB0aGlzLT5fTV9zdGFydCA9IF9fbmV3X3N0YXJ0OworICAgICAgdW5pbml0aWFsaXplZF9maWxsKF9fZHN0LCBfX3NyYywgX194X2NvcHkpOworICAgICAgX19wb3MgPSBfX2RzdDsKKyAgICB9CisgICAgX1NUTFBfVU5XSU5EKHRoaXMtPl9NX2Rlc3Ryb3lfbm9kZXMoX19uZXdfc3RhcnQuX01fbm9kZSwgdGhpcy0+X01fc3RhcnQuX01fbm9kZSkpCisgIH0KKyAgZWxzZSB7CisgICAgaXRlcmF0b3IgX19uZXdfZmluaXNoID0gX01fcmVzZXJ2ZV9lbGVtZW50c19hdF9iYWNrKF9fbik7CisgICAgY29uc3QgZGlmZmVyZW5jZV90eXBlIF9fZWxlbXNfYWZ0ZXIgPSBkaWZmZXJlbmNlX3R5cGUoX19sZW5ndGgpIC0gX19lbGVtc19iZWZvcmU7CisgICAgX19wb3MgPSB0aGlzLT5fTV9maW5pc2ggLSBfX2VsZW1zX2FmdGVyOworICAgIF9TVExQX1RSWSB7CisgICAgICBpdGVyYXRvciBfX2RzdCA9IF9fbmV3X2ZpbmlzaDsKKyAgICAgIGl0ZXJhdG9yIF9fc3JjID0gdGhpcy0+X01fZmluaXNoOworICAgICAgZm9yICgtLV9fc3JjLCAtLV9fZHN0OyBfX3NyYyA+PSBfX3BvczsgLS1fX3NyYywgLS1fX2RzdCkgeworICAgICAgICBfU1RMUF9TVEQ6Ol9Nb3ZlX0NvbnN0cnVjdCgmKCpfX2RzdCksICpfX3NyYyk7CisgICAgICAgIF9TVExQX1NURDo6X0Rlc3Ryb3lfTW92ZWQoJigqX19zcmMpKTsKKyAgICAgIH0KKyAgICAgIHRoaXMtPl9NX2ZpbmlzaCA9IF9fbmV3X2ZpbmlzaDsKKyAgICAgIHVuaW5pdGlhbGl6ZWRfZmlsbChfX3BvcywgX19wb3MgKyBfX24sIF9feF9jb3B5KTsKKyAgICB9CisgICAgX1NUTFBfVU5XSU5EKHRoaXMtPl9NX2Rlc3Ryb3lfbm9kZXModGhpcy0+X01fZmluaXNoLl9NX25vZGUgKyAxLCBfX25ld19maW5pc2guX01fbm9kZSArIDEpKQorICB9CisgIHJldHVybiBfX3BvczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jID4KK19faXRlcmF0b3JfXyBkZXF1ZTxfVHAsX0FsbG9jPjo6X01fZmlsbF9pbnNlcnRfYXV4KGl0ZXJhdG9yIF9fcG9zLCBzaXplX3R5cGUgX19uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWVfdHlwZSYgX194LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19mYWxzZV90eXBlJiAvKl9Nb3ZhYmxlKi8pIHsKKyAgY29uc3QgZGlmZmVyZW5jZV90eXBlIF9fZWxlbXNfYmVmb3JlID0gX19wb3MgLSB0aGlzLT5fTV9zdGFydDsKKyAgc2l6ZV90eXBlIF9fbGVuZ3RoID0gdGhpcy0+c2l6ZSgpOworICB2YWx1ZV90eXBlIF9feF9jb3B5ID0gX194OworICBpZiAoX19lbGVtc19iZWZvcmUgPD0gZGlmZmVyZW5jZV90eXBlKF9fbGVuZ3RoIC8gMikpIHsKKyAgICBpdGVyYXRvciBfX25ld19zdGFydCA9IF9NX3Jlc2VydmVfZWxlbWVudHNfYXRfZnJvbnQoX19uKTsKKyAgICBpdGVyYXRvciBfX29sZF9zdGFydCA9IHRoaXMtPl9NX3N0YXJ0OworICAgIF9fcG9zID0gdGhpcy0+X01fc3RhcnQgKyBfX2VsZW1zX2JlZm9yZTsKKyAgICBfU1RMUF9UUlkgeworICAgICAgaWYgKF9fZWxlbXNfYmVmb3JlID49IGRpZmZlcmVuY2VfdHlwZShfX24pKSB7CisgICAgICAgIGl0ZXJhdG9yIF9fc3RhcnRfbiA9IHRoaXMtPl9NX3N0YXJ0ICsgZGlmZmVyZW5jZV90eXBlKF9fbik7CisgICAgICAgIF9TVExQX1BSSVYgX191Y29weSh0aGlzLT5fTV9zdGFydCwgX19zdGFydF9uLCBfX25ld19zdGFydCk7CisgICAgICAgIHRoaXMtPl9NX3N0YXJ0ID0gX19uZXdfc3RhcnQ7CisgICAgICAgIF9TVExQX1NURDo6Y29weShfX3N0YXJ0X24sIF9fcG9zLCBfX29sZF9zdGFydCk7CisgICAgICAgIF9TVExQX1NURDo6ZmlsbChfX3BvcyAtIGRpZmZlcmVuY2VfdHlwZShfX24pLCBfX3BvcywgX194X2NvcHkpOworICAgICAgICBfX3BvcyAtPSBkaWZmZXJlbmNlX3R5cGUoX19uKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBfU1RMUF9QUklWIF9fdW5pbml0aWFsaXplZF9jb3B5X2ZpbGwodGhpcy0+X01fc3RhcnQsIF9fcG9zLCBfX25ld19zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPl9NX3N0YXJ0LCBfX3hfY29weSk7CisgICAgICAgIHRoaXMtPl9NX3N0YXJ0ID0gX19uZXdfc3RhcnQ7CisgICAgICAgIGZpbGwoX19vbGRfc3RhcnQsIF9fcG9zLCBfX3hfY29weSk7CisgICAgICB9CisgICAgfQorICAgIF9TVExQX1VOV0lORCh0aGlzLT5fTV9kZXN0cm95X25vZGVzKF9fbmV3X3N0YXJ0Ll9NX25vZGUsIHRoaXMtPl9NX3N0YXJ0Ll9NX25vZGUpKQorICB9CisgIGVsc2UgeworICAgIGl0ZXJhdG9yIF9fbmV3X2ZpbmlzaCA9IF9NX3Jlc2VydmVfZWxlbWVudHNfYXRfYmFjayhfX24pOworICAgIGl0ZXJhdG9yIF9fb2xkX2ZpbmlzaCA9IHRoaXMtPl9NX2ZpbmlzaDsKKyAgICBjb25zdCBkaWZmZXJlbmNlX3R5cGUgX19lbGVtc19hZnRlciA9CisgICAgICBkaWZmZXJlbmNlX3R5cGUoX19sZW5ndGgpIC0gX19lbGVtc19iZWZvcmU7CisgICAgX19wb3MgPSB0aGlzLT5fTV9maW5pc2ggLSBfX2VsZW1zX2FmdGVyOworICAgIF9TVExQX1RSWSB7CisgICAgICBpZiAoX19lbGVtc19hZnRlciA+IGRpZmZlcmVuY2VfdHlwZShfX24pKSB7CisgICAgICAgIGl0ZXJhdG9yIF9fZmluaXNoX24gPSB0aGlzLT5fTV9maW5pc2ggLSBkaWZmZXJlbmNlX3R5cGUoX19uKTsKKyAgICAgICAgX1NUTFBfUFJJViBfX3Vjb3B5KF9fZmluaXNoX24sIHRoaXMtPl9NX2ZpbmlzaCwgdGhpcy0+X01fZmluaXNoKTsKKyAgICAgICAgdGhpcy0+X01fZmluaXNoID0gX19uZXdfZmluaXNoOworICAgICAgICBjb3B5X2JhY2t3YXJkKF9fcG9zLCBfX2ZpbmlzaF9uLCBfX29sZF9maW5pc2gpOworICAgICAgICBmaWxsKF9fcG9zLCBfX3BvcyArIGRpZmZlcmVuY2VfdHlwZShfX24pLCBfX3hfY29weSk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgX1NUTFBfUFJJViBfX3VuaW5pdGlhbGl6ZWRfZmlsbF9jb3B5KHRoaXMtPl9NX2ZpbmlzaCwgX19wb3MgKyBkaWZmZXJlbmNlX3R5cGUoX19uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9feF9jb3B5LCBfX3BvcywgdGhpcy0+X01fZmluaXNoKTsKKyAgICAgICAgdGhpcy0+X01fZmluaXNoID0gX19uZXdfZmluaXNoOworICAgICAgICBmaWxsKF9fcG9zLCBfX29sZF9maW5pc2gsIF9feF9jb3B5KTsKKyAgICAgIH0KKyAgICB9CisgICAgX1NUTFBfVU5XSU5EKHRoaXMtPl9NX2Rlc3Ryb3lfbm9kZXModGhpcy0+X01fZmluaXNoLl9NX25vZGUgKyAxLCBfX25ld19maW5pc2guX01fbm9kZSArIDEpKQorICB9CisgIHJldHVybiBfX3BvczsKK30KKworI2lmICFkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jID4KK3ZvaWQgZGVxdWU8X1RwLF9BbGxvYz46Ol9NX2luc2VydF9yYW5nZV9hdXgoaXRlcmF0b3IgX19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlX3R5cGUqIF9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbiwgY29uc3QgX190cnVlX3R5cGUmIC8qX01vdmFibGUqLykgeworICBjb25zdCBkaWZmZXJlbmNlX3R5cGUgX19lbGVtc19iZWZvcmUgPSBfX3BvcyAtIHRoaXMtPl9NX3N0YXJ0OworICBzaXplX3R5cGUgX19sZW5ndGggPSBzaXplKCk7CisgIGlmIChfX2VsZW1zX2JlZm9yZSA8PSBkaWZmZXJlbmNlX3R5cGUoX19sZW5ndGggLyAyKSkgeworICAgIGl0ZXJhdG9yIF9fbmV3X3N0YXJ0ID0gX01fcmVzZXJ2ZV9lbGVtZW50c19hdF9mcm9udChfX24pOworICAgIF9fcG9zID0gdGhpcy0+X01fc3RhcnQgKyBfX2VsZW1zX2JlZm9yZTsKKyAgICBfU1RMUF9UUlkgeworICAgICAgaXRlcmF0b3IgX19kc3QgPSBfX25ld19zdGFydDsKKyAgICAgIGl0ZXJhdG9yIF9fc3JjID0gdGhpcy0+X01fc3RhcnQ7CisgICAgICBmb3IgKDsgX19zcmMgIT0gX19wb3M7ICsrX19kc3QsICsrX19zcmMpIHsKKyAgICAgICAgX1NUTFBfU1REOjpfTW92ZV9Db25zdHJ1Y3QoJigqX19kc3QpLCAqX19zcmMpOworICAgICAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95X01vdmVkKCYoKl9fc3JjKSk7CisgICAgICB9CisgICAgICB0aGlzLT5fTV9zdGFydCA9IF9fbmV3X3N0YXJ0OworICAgICAgX1NUTFBfUFJJViBfX3Vjb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19kc3QpOworICAgIH0KKyAgICBfU1RMUF9VTldJTkQodGhpcy0+X01fZGVzdHJveV9ub2RlcyhfX25ld19zdGFydC5fTV9ub2RlLCB0aGlzLT5fTV9zdGFydC5fTV9ub2RlKSkKKyAgfQorICBlbHNlIHsKKyAgICBpdGVyYXRvciBfX25ld19maW5pc2ggPSBfTV9yZXNlcnZlX2VsZW1lbnRzX2F0X2JhY2soX19uKTsKKyAgICBjb25zdCBkaWZmZXJlbmNlX3R5cGUgX19lbGVtc19hZnRlciA9IGRpZmZlcmVuY2VfdHlwZShfX2xlbmd0aCkgLSBfX2VsZW1zX2JlZm9yZTsKKyAgICBfX3BvcyA9IHRoaXMtPl9NX2ZpbmlzaCAtIF9fZWxlbXNfYWZ0ZXI7CisgICAgX1NUTFBfVFJZIHsKKyAgICAgIGl0ZXJhdG9yIF9fZHN0ID0gX19uZXdfZmluaXNoOworICAgICAgaXRlcmF0b3IgX19zcmMgPSB0aGlzLT5fTV9maW5pc2g7CisgICAgICBmb3IgKC0tX19zcmMsIC0tX19kc3Q7IF9fc3JjID49IF9fcG9zOyAtLV9fc3JjLCAtLV9fZHN0KSB7CisgICAgICAgIF9TVExQX1NURDo6X01vdmVfQ29uc3RydWN0KCYoKl9fZHN0KSwgKl9fc3JjKTsKKyAgICAgICAgX1NUTFBfU1REOjpfRGVzdHJveV9Nb3ZlZCgmKCpfX3NyYykpOworICAgICAgfQorICAgICAgdGhpcy0+X01fZmluaXNoID0gX19uZXdfZmluaXNoOworICAgICAgX1NUTFBfUFJJViBfX3Vjb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19wb3MpOworICAgIH0KKyAgICBfU1RMUF9VTldJTkQodGhpcy0+X01fZGVzdHJveV9ub2Rlcyh0aGlzLT5fTV9maW5pc2guX01fbm9kZSArIDEsIF9fbmV3X2ZpbmlzaC5fTV9ub2RlICsgMSkpCisgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jID4KK3ZvaWQgZGVxdWU8X1RwLF9BbGxvYz46Ol9NX2luc2VydF9yYW5nZV9hdXgoaXRlcmF0b3IgX19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlX3R5cGUqIF9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbiwgY29uc3QgX19mYWxzZV90eXBlJiAvKl9Nb3ZhYmxlKi8pIHsKKyAgY29uc3QgZGlmZmVyZW5jZV90eXBlIF9fZWxlbXNfYmVmb3JlID0gX19wb3MgLSB0aGlzLT5fTV9zdGFydDsKKyAgc2l6ZV90eXBlIF9fbGVuZ3RoID0gc2l6ZSgpOworICBpZiAoX19lbGVtc19iZWZvcmUgPD0gZGlmZmVyZW5jZV90eXBlKF9fbGVuZ3RoIC8gMikpIHsKKyAgICBpdGVyYXRvciBfX25ld19zdGFydCA9IF9NX3Jlc2VydmVfZWxlbWVudHNfYXRfZnJvbnQoX19uKTsKKyAgICBpdGVyYXRvciBfX29sZF9zdGFydCA9IHRoaXMtPl9NX3N0YXJ0OworICAgIF9fcG9zID0gdGhpcy0+X01fc3RhcnQgKyBfX2VsZW1zX2JlZm9yZTsKKyAgICBfU1RMUF9UUlkgeworICAgICAgaWYgKF9fZWxlbXNfYmVmb3JlID49IGRpZmZlcmVuY2VfdHlwZShfX24pKSB7CisgICAgICAgIGl0ZXJhdG9yIF9fc3RhcnRfbiA9IHRoaXMtPl9NX3N0YXJ0ICsgZGlmZmVyZW5jZV90eXBlKF9fbik7CisgICAgICAgIF9TVExQX1BSSVYgX191Y29weSh0aGlzLT5fTV9zdGFydCwgX19zdGFydF9uLCBfX25ld19zdGFydCk7CisgICAgICAgIHRoaXMtPl9NX3N0YXJ0ID0gX19uZXdfc3RhcnQ7CisgICAgICAgIF9TVExQX1NURDo6Y29weShfX3N0YXJ0X24sIF9fcG9zLCBfX29sZF9zdGFydCk7CisgICAgICAgIF9TVExQX1NURDo6Y29weShfX2ZpcnN0LCBfX2xhc3QsIF9fcG9zIC0gZGlmZmVyZW5jZV90eXBlKF9fbikpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGNvbnN0IHZhbHVlX3R5cGUqIF9fbWlkID0gX19maXJzdCArIChkaWZmZXJlbmNlX3R5cGUoX19uKSAtIF9fZWxlbXNfYmVmb3JlKTsKKyAgICAgICAgX1NUTFBfUFJJViBfX3VuaW5pdGlhbGl6ZWRfY29weV9jb3B5KHRoaXMtPl9NX3N0YXJ0LCBfX3BvcywgX19maXJzdCwgX19taWQsIF9fbmV3X3N0YXJ0KTsKKyAgICAgICAgdGhpcy0+X01fc3RhcnQgPSBfX25ld19zdGFydDsKKyAgICAgICAgX1NUTFBfU1REOjpjb3B5KF9fbWlkLCBfX2xhc3QsIF9fb2xkX3N0YXJ0KTsKKyAgICAgIH0KKyAgICB9CisgICAgX1NUTFBfVU5XSU5EKHRoaXMtPl9NX2Rlc3Ryb3lfbm9kZXMoX19uZXdfc3RhcnQuX01fbm9kZSwgdGhpcy0+X01fc3RhcnQuX01fbm9kZSkpCisgIH0KKyAgZWxzZSB7CisgICAgaXRlcmF0b3IgX19uZXdfZmluaXNoID0gX01fcmVzZXJ2ZV9lbGVtZW50c19hdF9iYWNrKF9fbik7CisgICAgaXRlcmF0b3IgX19vbGRfZmluaXNoID0gdGhpcy0+X01fZmluaXNoOworICAgIGNvbnN0IGRpZmZlcmVuY2VfdHlwZSBfX2VsZW1zX2FmdGVyID0KKyAgICAgIGRpZmZlcmVuY2VfdHlwZShfX2xlbmd0aCkgLSBfX2VsZW1zX2JlZm9yZTsKKyAgICBfX3BvcyA9IHRoaXMtPl9NX2ZpbmlzaCAtIF9fZWxlbXNfYWZ0ZXI7CisgICAgX1NUTFBfVFJZIHsKKworICAgICAgaWYgKF9fZWxlbXNfYWZ0ZXIgPiBkaWZmZXJlbmNlX3R5cGUoX19uKSkgeworICAgICAgICBpdGVyYXRvciBfX2ZpbmlzaF9uID0gdGhpcy0+X01fZmluaXNoIC0gZGlmZmVyZW5jZV90eXBlKF9fbik7CisgICAgICAgIF9TVExQX1BSSVYgX191Y29weShfX2ZpbmlzaF9uLCB0aGlzLT5fTV9maW5pc2gsIHRoaXMtPl9NX2ZpbmlzaCk7CisgICAgICAgIHRoaXMtPl9NX2ZpbmlzaCA9IF9fbmV3X2ZpbmlzaDsKKyAgICAgICAgX1NUTFBfU1REOjpjb3B5X2JhY2t3YXJkKF9fcG9zLCBfX2ZpbmlzaF9uLCBfX29sZF9maW5pc2gpOworICAgICAgICBfU1RMUF9TVEQ6OmNvcHkoX19maXJzdCwgX19sYXN0LCBfX3Bvcyk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgY29uc3QgdmFsdWVfdHlwZSogX19taWQgPSBfX2ZpcnN0ICsgX19lbGVtc19hZnRlcjsKKyAgICAgICAgX1NUTFBfUFJJViBfX3VuaW5pdGlhbGl6ZWRfY29weV9jb3B5KF9fbWlkLCBfX2xhc3QsIF9fcG9zLCB0aGlzLT5fTV9maW5pc2gsIHRoaXMtPl9NX2ZpbmlzaCk7CisgICAgICAgIHRoaXMtPl9NX2ZpbmlzaCA9IF9fbmV3X2ZpbmlzaDsKKyAgICAgICAgX1NUTFBfU1REOjpjb3B5KF9fZmlyc3QsIF9fbWlkLCBfX3Bvcyk7CisgICAgICB9CisgICAgfQorICAgIF9TVExQX1VOV0lORCh0aGlzLT5fTV9kZXN0cm95X25vZGVzKHRoaXMtPl9NX2ZpbmlzaC5fTV9ub2RlICsgMSwgX19uZXdfZmluaXNoLl9NX25vZGUgKyAxKSkKKyAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2MgPgordm9pZCBkZXF1ZTxfVHAsX0FsbG9jPjo6X01faW5zZXJ0X3JhbmdlX2F1eChpdGVyYXRvciBfX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uLCBjb25zdCBfX3RydWVfdHlwZSYgLypfTW92YWJsZSovKSB7CisgIGNvbnN0IGRpZmZlcmVuY2VfdHlwZSBfX2VsZW1zX2JlZm9yZSA9IF9fcG9zIC0gdGhpcy0+X01fc3RhcnQ7CisgIHNpemVfdHlwZSBfX2xlbmd0aCA9IHNpemUoKTsKKyAgaWYgKF9fZWxlbXNfYmVmb3JlIDw9IGRpZmZlcmVuY2VfdHlwZShfX2xlbmd0aCAvIDIpKSB7CisgICAgaXRlcmF0b3IgX19uZXdfc3RhcnQgPSBfTV9yZXNlcnZlX2VsZW1lbnRzX2F0X2Zyb250KF9fbik7CisgICAgX19wb3MgPSB0aGlzLT5fTV9zdGFydCArIF9fZWxlbXNfYmVmb3JlOworICAgIF9TVExQX1RSWSB7CisgICAgICBpdGVyYXRvciBfX2RzdCA9IF9fbmV3X3N0YXJ0OworICAgICAgaXRlcmF0b3IgX19zcmMgPSB0aGlzLT5fTV9zdGFydDsKKyAgICAgIGZvciAoOyBfX3NyYyAhPSBfX3BvczsgKytfX2RzdCwgKytfX3NyYykgeworICAgICAgICBfU1RMUF9TVEQ6Ol9Nb3ZlX0NvbnN0cnVjdCgmKCpfX2RzdCksICpfX3NyYyk7CisgICAgICAgIF9TVExQX1NURDo6X0Rlc3Ryb3lfTW92ZWQoJigqX19zcmMpKTsKKyAgICAgIH0KKyAgICAgIHRoaXMtPl9NX3N0YXJ0ID0gX19uZXdfc3RhcnQ7CisgICAgICBfU1RMUF9QUklWIF9fdWNvcHkoX19maXJzdCwgX19sYXN0LCBfX2RzdCk7CisgICAgfQorICAgIF9TVExQX1VOV0lORCh0aGlzLT5fTV9kZXN0cm95X25vZGVzKF9fbmV3X3N0YXJ0Ll9NX25vZGUsIHRoaXMtPl9NX3N0YXJ0Ll9NX25vZGUpKQorICB9CisgIGVsc2UgeworICAgIGl0ZXJhdG9yIF9fbmV3X2ZpbmlzaCA9IF9NX3Jlc2VydmVfZWxlbWVudHNfYXRfYmFjayhfX24pOworICAgIGNvbnN0IGRpZmZlcmVuY2VfdHlwZSBfX2VsZW1zX2FmdGVyID0gZGlmZmVyZW5jZV90eXBlKF9fbGVuZ3RoKSAtIF9fZWxlbXNfYmVmb3JlOworICAgIF9fcG9zID0gdGhpcy0+X01fZmluaXNoIC0gX19lbGVtc19hZnRlcjsKKyAgICBfU1RMUF9UUlkgeworICAgICAgaXRlcmF0b3IgX19kc3QgPSBfX25ld19maW5pc2g7CisgICAgICBpdGVyYXRvciBfX3NyYyA9IHRoaXMtPl9NX2ZpbmlzaDsKKyAgICAgIGZvciAoLS1fX3NyYywgLS1fX2RzdDsgX19zcmMgPj0gX19wb3M7IC0tX19zcmMsIC0tX19kc3QpIHsKKyAgICAgICAgX1NUTFBfU1REOjpfTW92ZV9Db25zdHJ1Y3QoJigqX19kc3QpLCAqX19zcmMpOworICAgICAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95X01vdmVkKCYoKl9fc3JjKSk7CisgICAgICB9CisgICAgICB0aGlzLT5fTV9maW5pc2ggPSBfX25ld19maW5pc2g7CisgICAgICBfU1RMUF9QUklWIF9fdWNvcHkoX19maXJzdCwgX19sYXN0LCBfX3Bvcyk7CisgICAgfQorICAgIF9TVExQX1VOV0lORCh0aGlzLT5fTV9kZXN0cm95X25vZGVzKHRoaXMtPl9NX2ZpbmlzaC5fTV9ub2RlICsgMSwgX19uZXdfZmluaXNoLl9NX25vZGUgKyAxKSkKKyAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2MgPgordm9pZCBkZXF1ZTxfVHAsX0FsbG9jPjo6X01faW5zZXJ0X3JhbmdlX2F1eChpdGVyYXRvciBfX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uLCBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qX01vdmFibGUqLykgeworICBjb25zdCBkaWZmZXJlbmNlX3R5cGUgX19lbGVtc19iZWZvcmUgPSBfX3BvcyAtIHRoaXMtPl9NX3N0YXJ0OworICBzaXplX3R5cGUgX19sZW5ndGggPSBzaXplKCk7CisgIGlmIChfX2VsZW1zX2JlZm9yZSA8IGRpZmZlcmVuY2VfdHlwZShfX2xlbmd0aCAvIDIpKSB7CisgICAgaXRlcmF0b3IgX19uZXdfc3RhcnQgPSBfTV9yZXNlcnZlX2VsZW1lbnRzX2F0X2Zyb250KF9fbik7CisgICAgaXRlcmF0b3IgX19vbGRfc3RhcnQgPSB0aGlzLT5fTV9zdGFydDsKKyAgICBfX3BvcyA9IHRoaXMtPl9NX3N0YXJ0ICsgX19lbGVtc19iZWZvcmU7CisgICAgX1NUTFBfVFJZIHsKKyAgICAgIGlmIChfX2VsZW1zX2JlZm9yZSA+PSBkaWZmZXJlbmNlX3R5cGUoX19uKSkgeworICAgICAgICBpdGVyYXRvciBfX3N0YXJ0X24gPSB0aGlzLT5fTV9zdGFydCArIF9fbjsKKyAgICAgICAgX1NUTFBfUFJJViBfX3Vjb3B5KHRoaXMtPl9NX3N0YXJ0LCBfX3N0YXJ0X24sIF9fbmV3X3N0YXJ0KTsKKyAgICAgICAgdGhpcy0+X01fc3RhcnQgPSBfX25ld19zdGFydDsKKyAgICAgICAgX1NUTFBfU1REOjpjb3B5KF9fc3RhcnRfbiwgX19wb3MsIF9fb2xkX3N0YXJ0KTsKKyAgICAgICAgX1NUTFBfU1REOjpjb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19wb3MgLSBkaWZmZXJlbmNlX3R5cGUoX19uKSk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgY29uc3RfaXRlcmF0b3IgX19taWQgPSBfX2ZpcnN0ICsgKF9fbiAtIF9fZWxlbXNfYmVmb3JlKTsKKyAgICAgICAgX1NUTFBfUFJJViBfX3VuaW5pdGlhbGl6ZWRfY29weV9jb3B5KHRoaXMtPl9NX3N0YXJ0LCBfX3BvcywgX19maXJzdCwgX19taWQsIF9fbmV3X3N0YXJ0KTsKKyAgICAgICAgdGhpcy0+X01fc3RhcnQgPSBfX25ld19zdGFydDsKKyAgICAgICAgX1NUTFBfU1REOjpjb3B5KF9fbWlkLCBfX2xhc3QsIF9fb2xkX3N0YXJ0KTsKKyAgICAgIH0KKyAgICB9CisgICAgX1NUTFBfVU5XSU5EKHRoaXMtPl9NX2Rlc3Ryb3lfbm9kZXMoX19uZXdfc3RhcnQuX01fbm9kZSwgdGhpcy0+X01fc3RhcnQuX01fbm9kZSkpCisgIH0KKyAgZWxzZSB7CisgICAgaXRlcmF0b3IgX19uZXdfZmluaXNoID0gX01fcmVzZXJ2ZV9lbGVtZW50c19hdF9iYWNrKF9fbik7CisgICAgaXRlcmF0b3IgX19vbGRfZmluaXNoID0gdGhpcy0+X01fZmluaXNoOworICAgIGNvbnN0IGRpZmZlcmVuY2VfdHlwZSBfX2VsZW1zX2FmdGVyID0gX19sZW5ndGggLSBfX2VsZW1zX2JlZm9yZTsKKyAgICBfX3BvcyA9IHRoaXMtPl9NX2ZpbmlzaCAtIF9fZWxlbXNfYWZ0ZXI7CisgICAgX1NUTFBfVFJZIHsKKyAgICAgIGlmIChfX2VsZW1zX2FmdGVyID4gZGlmZmVyZW5jZV90eXBlKF9fbikpIHsKKyAgICAgICAgaXRlcmF0b3IgX19maW5pc2hfbiA9IHRoaXMtPl9NX2ZpbmlzaCAtIGRpZmZlcmVuY2VfdHlwZShfX24pOworICAgICAgICBfU1RMUF9QUklWIF9fdWNvcHkoX19maW5pc2hfbiwgdGhpcy0+X01fZmluaXNoLCB0aGlzLT5fTV9maW5pc2gpOworICAgICAgICB0aGlzLT5fTV9maW5pc2ggPSBfX25ld19maW5pc2g7CisgICAgICAgIF9TVExQX1NURDo6Y29weV9iYWNrd2FyZChfX3BvcywgX19maW5pc2hfbiwgX19vbGRfZmluaXNoKTsKKyAgICAgICAgX1NUTFBfU1REOjpjb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19wb3MpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fbWlkID0gX19maXJzdCArIF9fZWxlbXNfYWZ0ZXI7CisgICAgICAgIF9TVExQX1BSSVYgX191bmluaXRpYWxpemVkX2NvcHlfY29weShfX21pZCwgX19sYXN0LCBfX3BvcywgdGhpcy0+X01fZmluaXNoLCB0aGlzLT5fTV9maW5pc2gpOworICAgICAgICB0aGlzLT5fTV9maW5pc2ggPSBfX25ld19maW5pc2g7CisgICAgICAgIF9TVExQX1NURDo6Y29weShfX2ZpcnN0LCBfX21pZCwgX19wb3MpOworICAgICAgfQorICAgIH0KKyAgICBfU1RMUF9VTldJTkQodGhpcy0+X01fZGVzdHJveV9ub2Rlcyh0aGlzLT5fTV9maW5pc2guX01fbm9kZSArIDEsIF9fbmV3X2ZpbmlzaC5fTV9ub2RlICsgMSkpCisgIH0KK30KKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYyA+Cit2b2lkIGRlcXVlPF9UcCxfQWxsb2M+OjpfTV9uZXdfZWxlbWVudHNfYXRfZnJvbnQoc2l6ZV90eXBlIF9fbmV3X2VsZW1zKSB7CisgIHNpemVfdHlwZSBfX25ld19ub2RlcworICAgICAgPSAoX19uZXdfZWxlbXMgKyB0aGlzLT5idWZmZXJfc2l6ZSgpIC0gMSkgLyB0aGlzLT5idWZmZXJfc2l6ZSgpOworICBfTV9yZXNlcnZlX21hcF9hdF9mcm9udChfX25ld19ub2Rlcyk7CisgIHNpemVfdHlwZSBfX2kgPSAxOworICBfU1RMUF9UUlkgeworICAgIGZvciAoOyBfX2kgPD0gX19uZXdfbm9kZXM7ICsrX19pKQorICAgICAgKih0aGlzLT5fTV9zdGFydC5fTV9ub2RlIC0gX19pKSA9IHRoaXMtPl9NX21hcF9zaXplLmFsbG9jYXRlKHRoaXMtPmJ1ZmZlcl9zaXplKCkpOworICB9CisgIF9TVExQX1VOV0lORChmb3IgKHNpemVfdHlwZSBfX2ogPSAxOyBfX2ogPCBfX2k7ICsrX19qKQorICAgICAgICAgICAgICAgICB0aGlzLT5fTV9tYXBfc2l6ZS5kZWFsbG9jYXRlKCoodGhpcy0+X01fc3RhcnQuX01fbm9kZSAtIF9faiksIHRoaXMtPmJ1ZmZlcl9zaXplKCkpKQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2MgPgordm9pZCBkZXF1ZTxfVHAsX0FsbG9jPjo6X01fbmV3X2VsZW1lbnRzX2F0X2JhY2soc2l6ZV90eXBlIF9fbmV3X2VsZW1zKSB7CisgIHNpemVfdHlwZSBfX25ld19ub2RlcworICAgICAgPSAoX19uZXdfZWxlbXMgKyB0aGlzLT5idWZmZXJfc2l6ZSgpIC0gMSkgLyB0aGlzLT5idWZmZXJfc2l6ZSgpOworICBfTV9yZXNlcnZlX21hcF9hdF9iYWNrKF9fbmV3X25vZGVzKTsKKyAgc2l6ZV90eXBlIF9faSA9IDE7CisgIF9TVExQX1RSWSB7CisgICAgZm9yICg7IF9faSA8PSBfX25ld19ub2RlczsgKytfX2kpCisgICAgICAqKHRoaXMtPl9NX2ZpbmlzaC5fTV9ub2RlICsgX19pKSA9IHRoaXMtPl9NX21hcF9zaXplLmFsbG9jYXRlKHRoaXMtPmJ1ZmZlcl9zaXplKCkpOworICB9CisgIF9TVExQX1VOV0lORChmb3IgKHNpemVfdHlwZSBfX2ogPSAxOyBfX2ogPCBfX2k7ICsrX19qKQorICAgICAgICAgICAgICAgICB0aGlzLT5fTV9tYXBfc2l6ZS5kZWFsbG9jYXRlKCoodGhpcy0+X01fZmluaXNoLl9NX25vZGUgKyBfX2opLCB0aGlzLT5idWZmZXJfc2l6ZSgpKSkKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jID4KK3ZvaWQgZGVxdWU8X1RwLF9BbGxvYz46Ol9NX3JlYWxsb2NhdGVfbWFwKHNpemVfdHlwZSBfX25vZGVzX3RvX2FkZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgX19hZGRfYXRfZnJvbnQpIHsKKyAgc2l6ZV90eXBlIF9fb2xkX251bV9ub2RlcyA9IHRoaXMtPl9NX2ZpbmlzaC5fTV9ub2RlIC0gdGhpcy0+X01fc3RhcnQuX01fbm9kZSArIDE7CisgIHNpemVfdHlwZSBfX25ld19udW1fbm9kZXMgPSBfX29sZF9udW1fbm9kZXMgKyBfX25vZGVzX3RvX2FkZDsKKworICBfTWFwX3BvaW50ZXIgX19uZXdfbnN0YXJ0OworICBpZiAodGhpcy0+X01fbWFwX3NpemUuX01fZGF0YSA+IDIgKiBfX25ld19udW1fbm9kZXMpIHsKKyAgICBfX25ld19uc3RhcnQgPSB0aGlzLT5fTV9tYXAuX01fZGF0YSArICh0aGlzLT5fTV9tYXBfc2l6ZS5fTV9kYXRhIC0gX19uZXdfbnVtX25vZGVzKSAvIDIKKyAgICAgICAgICAgICAgICAgICAgICsgKF9fYWRkX2F0X2Zyb250ID8gX19ub2Rlc190b19hZGQgOiAwKTsKKyAgICBpZiAoX19uZXdfbnN0YXJ0IDwgdGhpcy0+X01fc3RhcnQuX01fbm9kZSkKKyAgICAgIF9TVExQX1NURDo6Y29weSh0aGlzLT5fTV9zdGFydC5fTV9ub2RlLCB0aGlzLT5fTV9maW5pc2guX01fbm9kZSArIDEsIF9fbmV3X25zdGFydCk7CisgICAgZWxzZQorICAgICAgX1NUTFBfU1REOjpjb3B5X2JhY2t3YXJkKHRoaXMtPl9NX3N0YXJ0Ll9NX25vZGUsIHRoaXMtPl9NX2ZpbmlzaC5fTV9ub2RlICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX25ld19uc3RhcnQgKyBfX29sZF9udW1fbm9kZXMpOworICB9CisgIGVsc2UgeworICAgIHNpemVfdHlwZSBfX25ld19tYXBfc2l6ZSA9CisgICAgICB0aGlzLT5fTV9tYXBfc2l6ZS5fTV9kYXRhICsgKG1heCkoKHNpemVfdCl0aGlzLT5fTV9tYXBfc2l6ZS5fTV9kYXRhLCBfX25vZGVzX3RvX2FkZCkgKyAyOworCisgICAgX01hcF9wb2ludGVyIF9fbmV3X21hcCA9IHRoaXMtPl9NX21hcC5hbGxvY2F0ZShfX25ld19tYXBfc2l6ZSk7CisgICAgX19uZXdfbnN0YXJ0ID0gX19uZXdfbWFwICsgKF9fbmV3X21hcF9zaXplIC0gX19uZXdfbnVtX25vZGVzKSAvIDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoX19hZGRfYXRfZnJvbnQgPyBfX25vZGVzX3RvX2FkZCA6IDApOworICAgIF9TVExQX1NURDo6Y29weSh0aGlzLT5fTV9zdGFydC5fTV9ub2RlLCB0aGlzLT5fTV9maW5pc2guX01fbm9kZSArIDEsIF9fbmV3X25zdGFydCk7CisgICAgdGhpcy0+X01fbWFwLmRlYWxsb2NhdGUodGhpcy0+X01fbWFwLl9NX2RhdGEsIHRoaXMtPl9NX21hcF9zaXplLl9NX2RhdGEpOworCisgICAgdGhpcy0+X01fbWFwLl9NX2RhdGEgPSBfX25ld19tYXA7CisgICAgdGhpcy0+X01fbWFwX3NpemUuX01fZGF0YSA9IF9fbmV3X21hcF9zaXplOworICB9CisKKyAgdGhpcy0+X01fc3RhcnQuX01fc2V0X25vZGUoX19uZXdfbnN0YXJ0KTsKKyAgdGhpcy0+X01fZmluaXNoLl9NX3NldF9ub2RlKF9fbmV3X25zdGFydCArIF9fb2xkX251bV9ub2RlcyAtIDEpOworfQorCisjaWYgZGVmaW5lZCAoZGVxdWUpCisjICB1bmRlZiBkZXF1ZQorX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisjZW5kaWYKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjdW5kZWYgX19pdGVyYXRvcl9fCisjdW5kZWYgaXRlcmF0b3IKKyN1bmRlZiBjb25zdF9pdGVyYXRvcgorI3VuZGVmIHNpemVfdHlwZQorI3VuZGVmIHZhbHVlX3R5cGUKKworI2VuZGlmIC8qICBfU1RMUF9ERVFVRV9DICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9fZGVxdWUuaCBiL3N0bHBvcnQvc3RsL19kZXF1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZmFlZWYKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9fZGVxdWUuaApAQCAtMCwwICsxLDExMTUgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisvKiBOT1RFOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBTVEwgaGVhZGVycy4KKyAqICAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuCisgKi8KKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9ERVFVRV9ICisjZGVmaW5lIF9TVExQX0lOVEVSTkFMX0RFUVVFX0gKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9BTEdPQkFTRV9ICisjICBpbmNsdWRlIDxzdGwvX2FsZ29iYXNlLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9BTExPQ19ICisjICBpbmNsdWRlIDxzdGwvX2FsbG9jLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9JVEVSQVRPUl9ICisjICBpbmNsdWRlIDxzdGwvX2l0ZXJhdG9yLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9VTklOSVRJQUxJWkVEX0gKKyMgIGluY2x1ZGUgPHN0bC9fdW5pbml0aWFsaXplZC5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfUkFOR0VfRVJST1JTX0gKKyMgIGluY2x1ZGUgPHN0bC9fcmFuZ2VfZXJyb3JzLmg+CisjZW5kaWYKKworLyogQ2xhc3MgaW52YXJpYW50czoKKyAqICBGb3IgYW55IG5vbnNpbmd1bGFyIGl0ZXJhdG9yIGk6CisgKiAgICBpLm5vZGUgaXMgdGhlIGFkZHJlc3Mgb2YgYW4gZWxlbWVudCBpbiB0aGUgbWFwIGFycmF5LiAgVGhlCisgKiAgICAgIGNvbnRlbnRzIG9mIGkubm9kZSBpcyBhIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiBhIG5vZGUuCisgKiAgICBpLmZpcnN0ID09ICooaS5ub2RlKQorICogICAgaS5sYXN0ICA9PSBpLmZpcnN0ICsgbm9kZV9zaXplCisgKiAgICBpLmN1ciBpcyBhIHBvaW50ZXIgaW4gdGhlIHJhbmdlIFtpLmZpcnN0LCBpLmxhc3QpLiAgTk9URToKKyAqICAgICAgdGhlIGltcGxpY2F0aW9uIG9mIHRoaXMgaXMgdGhhdCBpLmN1ciBpcyBhbHdheXMgYSBkZXJlZmVyZW5jZWFibGUKKyAqICAgICAgcG9pbnRlciwgZXZlbiBpZiBpIGlzIGEgcGFzdC10aGUtZW5kIGl0ZXJhdG9yLgorICogIFN0YXJ0IGFuZCBGaW5pc2ggYXJlIGFsd2F5cyBub25zaW5ndWxhciBpdGVyYXRvcnMuICBOT1RFOiB0aGlzIG1lYW5zCisgKiAgICB0aGF0IGFuIGVtcHR5IGRlcXVlIG11c3QgaGF2ZSBvbmUgbm9kZSwgYW5kIHRoYXQgYSBkZXF1ZQorICogICAgd2l0aCBOIGVsZW1lbnRzLCB3aGVyZSBOIGlzIHRoZSBidWZmZXIgc2l6ZSwgbXVzdCBoYXZlIHR3byBub2Rlcy4KKyAqICBGb3IgZXZlcnkgbm9kZSBvdGhlciB0aGFuIHN0YXJ0Lm5vZGUgYW5kIGZpbmlzaC5ub2RlLCBldmVyeSBlbGVtZW50CisgKiAgICBpbiB0aGUgbm9kZSBpcyBhbiBpbml0aWFsaXplZCBvYmplY3QuICBJZiBzdGFydC5ub2RlID09IGZpbmlzaC5ub2RlLAorICogICAgdGhlbiBbc3RhcnQuY3VyLCBmaW5pc2guY3VyKSBhcmUgaW5pdGlhbGl6ZWQgb2JqZWN0cywgYW5kCisgKiAgICB0aGUgZWxlbWVudHMgb3V0c2lkZSB0aGF0IHJhbmdlIGFyZSB1bmluaXRpYWxpemVkIHN0b3JhZ2UuICBPdGhlcndpc2UsCisgKiAgICBbc3RhcnQuY3VyLCBzdGFydC5sYXN0KSBhbmQgW2ZpbmlzaC5maXJzdCwgZmluaXNoLmN1cikgYXJlIGluaXRpYWxpemVkCisgKiAgICBvYmplY3RzLCBhbmQgW3N0YXJ0LmZpcnN0LCBzdGFydC5jdXIpIGFuZCBbZmluaXNoLmN1ciwgZmluaXNoLmxhc3QpCisgKiAgICBhcmUgdW5pbml0aWFsaXplZCBzdG9yYWdlLgorICogIFttYXAsIG1hcCArIG1hcF9zaXplKSBpcyBhIHZhbGlkLCBub24tZW1wdHkgcmFuZ2UuCisgKiAgW3N0YXJ0Lm5vZGUsIGZpbmlzaC5ub2RlXSBpcyBhIHZhbGlkIHJhbmdlIGNvbnRhaW5lZCB3aXRoaW4KKyAqICAgIFttYXAsIG1hcCArIG1hcF9zaXplKS4KKyAqICBBIHBvaW50ZXIgaW4gdGhlIHJhbmdlIFttYXAsIG1hcCArIG1hcF9zaXplKSBwb2ludHMgdG8gYW4gYWxsb2NhdGVkIG5vZGUKKyAqICAgIGlmIGFuZCBvbmx5IGlmIHRoZSBwb2ludGVyIGlzIGluIHRoZSByYW5nZSBbc3RhcnQubm9kZSwgZmluaXNoLm5vZGVdLgorICovCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX0RlcXVlX2l0ZXJhdG9yX2Jhc2UgeworCisgIHN0YXRpYyBzaXplX3QgX1NfYnVmZmVyX3NpemUoKSB7CisgICAgY29uc3Qgc2l6ZV90IGJsb2Nrc2l6ZSA9IF9NQVhfQllURVM7CisgICAgcmV0dXJuIChzaXplb2YoX1RwKSA8IGJsb2Nrc2l6ZSA/IChibG9ja3NpemUgLyBzaXplb2YoX1RwKSkgOiAxKTsKKyAgfQorCisgIHR5cGVkZWYgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CisKKyAgdHlwZWRlZiBfVHAgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiBzaXplX3Qgc2l6ZV90eXBlOworICB0eXBlZGVmIHB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7CisKKyAgdHlwZWRlZiB2YWx1ZV90eXBlKiogX01hcF9wb2ludGVyOworCisgIHR5cGVkZWYgX0RlcXVlX2l0ZXJhdG9yX2Jhc2U8IF9UcCA+IF9TZWxmOworCisgIHZhbHVlX3R5cGUqIF9NX2N1cjsKKyAgdmFsdWVfdHlwZSogX01fZmlyc3Q7CisgIHZhbHVlX3R5cGUqIF9NX2xhc3Q7CisgIF9NYXBfcG9pbnRlciBfTV9ub2RlOworCisgIF9EZXF1ZV9pdGVyYXRvcl9iYXNlKHZhbHVlX3R5cGUqIF9feCwgX01hcF9wb2ludGVyIF9feSkKKyAgICA6IF9NX2N1cihfX3gpLCBfTV9maXJzdCgqX195KSwKKyAgICAgIF9NX2xhc3QoKl9feSArIF9TX2J1ZmZlcl9zaXplKCkpLCBfTV9ub2RlKF9feSkge30KKworICBfRGVxdWVfaXRlcmF0b3JfYmFzZSgpIDogX01fY3VyKDApLCBfTV9maXJzdCgwKSwgX01fbGFzdCgwKSwgX01fbm9kZSgwKSB7fQorCisvLyBzZWUgY29tbWVudCBpbiBkb2MvUkVBRE1FLmV2YzQgYW5kIGRvYy9SRUFETUUuZXZjOAorI2lmIGRlZmluZWQgKF9TVExQX01TVkMpICYmIChfU1RMUF9NU1ZDIDw9IDE0MDEpICYmIGRlZmluZWQgKE1JUFMpICYmIGRlZmluZWQgKE5ERUJVRykKKyAgX0RlcXVlX2l0ZXJhdG9yX2Jhc2UoX0RlcXVlX2l0ZXJhdG9yX2Jhc2UgY29uc3QmIF9fb3RoZXIpCisgIDogX01fY3VyKF9fb3RoZXIuX01fY3VyKSwgX01fZmlyc3QoX19vdGhlci5fTV9maXJzdCksCisgICAgX01fbGFzdChfX290aGVyLl9NX2xhc3QpLCBfTV9ub2RlKF9fb3RoZXIuX01fbm9kZSkge30KKyNlbmRpZgorCisgIGRpZmZlcmVuY2VfdHlwZSBfTV9zdWJ0cmFjdChjb25zdCBfU2VsZiYgX194KSBjb25zdCB7CisgICAgcmV0dXJuIGRpZmZlcmVuY2VfdHlwZShfU19idWZmZXJfc2l6ZSgpKSAqIChfTV9ub2RlIC0gX194Ll9NX25vZGUgLSAxKSArCisgICAgICAoX01fY3VyIC0gX01fZmlyc3QpICsgKF9feC5fTV9sYXN0IC0gX194Ll9NX2N1cik7CisgIH0KKworICB2b2lkIF9NX2luY3JlbWVudCgpIHsKKyAgICBpZiAoKytfTV9jdXIgPT0gX01fbGFzdCkgeworICAgICAgX01fc2V0X25vZGUoX01fbm9kZSArIDEpOworICAgICAgX01fY3VyID0gX01fZmlyc3Q7CisgICAgfQorICB9CisKKyAgdm9pZCBfTV9kZWNyZW1lbnQoKSB7CisgICAgaWYgKF9NX2N1ciA9PSBfTV9maXJzdCkgeworICAgICAgX01fc2V0X25vZGUoX01fbm9kZSAtIDEpOworICAgICAgX01fY3VyID0gX01fbGFzdDsKKyAgICB9CisgICAgLS1fTV9jdXI7CisgIH0KKworICB2b2lkIF9NX2FkdmFuY2UoZGlmZmVyZW5jZV90eXBlIF9fbikgeworICAgIGNvbnN0IHNpemVfdCBidWZmZXJzaXplID0gX1NfYnVmZmVyX3NpemUoKTsKKyAgICBkaWZmZXJlbmNlX3R5cGUgX19vZmZzZXQgPSBfX24gKyAoX01fY3VyIC0gX01fZmlyc3QpOworICAgIGlmIChfX29mZnNldCA+PSAwICYmIF9fb2Zmc2V0IDwgZGlmZmVyZW5jZV90eXBlKGJ1ZmZlcnNpemUpKQorICAgICAgX01fY3VyICs9IF9fbjsKKyAgICBlbHNlIHsKKyAgICAgIGRpZmZlcmVuY2VfdHlwZSBfX25vZGVfb2Zmc2V0ID0KKyAgICAgICAgX19vZmZzZXQgPiAwID8gX19vZmZzZXQgLyBidWZmZXJzaXplCisgICAgICAgICAgICAgICAgICAgOiAtZGlmZmVyZW5jZV90eXBlKCgtX19vZmZzZXQgLSAxKSAvIGJ1ZmZlcnNpemUpIC0gMTsKKyAgICAgIF9NX3NldF9ub2RlKF9NX25vZGUgKyBfX25vZGVfb2Zmc2V0KTsKKyAgICAgIF9NX2N1ciA9IF9NX2ZpcnN0ICsKKworICAgICAgICAoX19vZmZzZXQgLSBfX25vZGVfb2Zmc2V0ICogZGlmZmVyZW5jZV90eXBlKGJ1ZmZlcnNpemUpKTsKKyAgICB9CisgIH0KKworICB2b2lkIF9NX3NldF9ub2RlKF9NYXBfcG9pbnRlciBfX25ld19ub2RlKSB7CisgICAgX01fbGFzdCA9IChfTV9maXJzdCA9ICooX01fbm9kZSA9IF9fbmV3X25vZGUpKSArIGRpZmZlcmVuY2VfdHlwZShfU19idWZmZXJfc2l6ZSgpKTsKKyAgfQorfTsKKworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVHJhaXRzPgorc3RydWN0IF9EZXF1ZV9pdGVyYXRvciA6IHB1YmxpYyBfRGVxdWVfaXRlcmF0b3JfYmFzZTwgX1RwPiB7CisgIHR5cGVkZWYgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CisgIHR5cGVkZWYgX1RwIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6cmVmZXJlbmNlICByZWZlcmVuY2U7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6cG9pbnRlciAgICBwb2ludGVyOworICB0eXBlZGVmIHNpemVfdCBzaXplX3R5cGU7CisgIHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKKyAgdHlwZWRlZiB2YWx1ZV90eXBlKiogX01hcF9wb2ludGVyOworCisgIHR5cGVkZWYgX0RlcXVlX2l0ZXJhdG9yX2Jhc2U8IF9UcCA+IF9CYXNlOworICB0eXBlZGVmIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcmFpdHM+IF9TZWxmOworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6Ol9Ob25Db25zdFRyYWl0cyAgICAgX05vbkNvbnN0VHJhaXRzOworICB0eXBlZGVmIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9Ob25Db25zdFRyYWl0cz4gaXRlcmF0b3I7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6X0NvbnN0VHJhaXRzICAgICAgICBfQ29uc3RUcmFpdHM7CisgIHR5cGVkZWYgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX0NvbnN0VHJhaXRzPiAgICBjb25zdF9pdGVyYXRvcjsKKworICBfRGVxdWVfaXRlcmF0b3IodmFsdWVfdHlwZSogX194LCBfTWFwX3BvaW50ZXIgX195KSA6CisgICAgX0RlcXVlX2l0ZXJhdG9yX2Jhc2U8dmFsdWVfdHlwZT4oX194LF9feSkge30KKworICBfRGVxdWVfaXRlcmF0b3IoKSB7fQorICAvL2NvcHkgY29uc3RydWN0b3IgZm9yIGl0ZXJhdG9yIGFuZCBjb25zdHJ1Y3RvciBmcm9tIGl0ZXJhdG9yIGZvciBjb25zdF9pdGVyYXRvcgorICBfRGVxdWVfaXRlcmF0b3IoY29uc3QgaXRlcmF0b3ImIF9feCkgOgorICAgIF9EZXF1ZV9pdGVyYXRvcl9iYXNlPHZhbHVlX3R5cGU+KF9feCkge30KKworICByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3QgeworICAgIHJldHVybiAqdGhpcy0+X01fY3VyOworICB9CisKKyAgX1NUTFBfREVGSU5FX0FSUk9XX09QRVJBVE9SCisKKyAgZGlmZmVyZW5jZV90eXBlIG9wZXJhdG9yLShjb25zdCBjb25zdF9pdGVyYXRvciYgX194KSBjb25zdCB7IHJldHVybiB0aGlzLT5fTV9zdWJ0cmFjdChfX3gpOyB9CisKKyAgX1NlbGYmIG9wZXJhdG9yKysoKSB7IHRoaXMtPl9NX2luY3JlbWVudCgpOyByZXR1cm4gKnRoaXM7IH0KKyAgX1NlbGYgb3BlcmF0b3IrKyhpbnQpICB7CisgICAgX1NlbGYgX190bXAgPSAqdGhpczsKKyAgICArKyp0aGlzOworICAgIHJldHVybiBfX3RtcDsKKyAgfQorCisgIF9TZWxmJiBvcGVyYXRvci0tKCkgeyB0aGlzLT5fTV9kZWNyZW1lbnQoKTsgcmV0dXJuICp0aGlzOyB9CisgIF9TZWxmIG9wZXJhdG9yLS0oaW50KSB7CisgICAgX1NlbGYgX190bXAgPSAqdGhpczsKKyAgICAtLSp0aGlzOworICAgIHJldHVybiBfX3RtcDsKKyAgfQorCisgIF9TZWxmJiBvcGVyYXRvcis9KGRpZmZlcmVuY2VfdHlwZSBfX24pIHsgdGhpcy0+X01fYWR2YW5jZShfX24pOyByZXR1cm4gKnRoaXM7IH0KKyAgX1NlbGYgb3BlcmF0b3IrKGRpZmZlcmVuY2VfdHlwZSBfX24pIGNvbnN0IHsKKyAgICBfU2VsZiBfX3RtcCA9ICp0aGlzOworICAgIHJldHVybiBfX3RtcCArPSBfX247CisgIH0KKworICBfU2VsZiYgb3BlcmF0b3ItPShkaWZmZXJlbmNlX3R5cGUgX19uKSB7IHJldHVybiAqdGhpcyArPSAtX19uOyB9CisgIF9TZWxmIG9wZXJhdG9yLShkaWZmZXJlbmNlX3R5cGUgX19uKSBjb25zdCB7CisgICAgX1NlbGYgX190bXAgPSAqdGhpczsKKyAgICByZXR1cm4gX190bXAgLT0gX19uOworICB9CisKKyAgcmVmZXJlbmNlIG9wZXJhdG9yW10oZGlmZmVyZW5jZV90eXBlIF9fbikgY29uc3QgeyByZXR1cm4gKigqdGhpcyArIF9fbik7IH0KK307CisKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1RyYWl0cz4KK2lubGluZSBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfVHJhaXRzPiBfU1RMUF9DQUxMCitvcGVyYXRvcisocHRyZGlmZl90IF9fbiwgY29uc3QgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1RyYWl0cz4mIF9feCkKK3sgcmV0dXJuIF9feCArIF9fbjsgfQorCisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfU0VQQVJBVEVfUkVMT1BTX05BTUVTUEFDRSkKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMCitvcGVyYXRvcj09KGNvbnN0IF9EZXF1ZV9pdGVyYXRvcl9iYXNlPF9UcCA+JiBfX3gsCisgICAgICAgICAgIGNvbnN0IF9EZXF1ZV9pdGVyYXRvcl9iYXNlPF9UcCA+JiBfX3kpCit7IHJldHVybiBfX3guX01fY3VyID09IF9feS5fTV9jdXI7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBib29sIF9TVExQX0NBTEwKK29wZXJhdG9yIDwgKGNvbnN0IF9EZXF1ZV9pdGVyYXRvcl9iYXNlPF9UcCA+JiBfX3gsCisgICAgICAgICAgICBjb25zdCBfRGVxdWVfaXRlcmF0b3JfYmFzZTxfVHAgPiYgX195KSB7CisgIHJldHVybiAoX194Ll9NX25vZGUgPT0gX195Ll9NX25vZGUpID8KKyAgICAoX194Ll9NX2N1ciA8IF9feS5fTV9jdXIpIDogKF9feC5fTV9ub2RlIDwgX195Ll9NX25vZGUpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIGJvb2wgX1NUTFBfQ0FMTAorb3BlcmF0b3IhPShjb25zdCBfRGVxdWVfaXRlcmF0b3JfYmFzZTxfVHAgPiYgX194LAorICAgICAgICAgICBjb25zdCBfRGVxdWVfaXRlcmF0b3JfYmFzZTxfVHAgPiYgX195KQoreyByZXR1cm4gX194Ll9NX2N1ciAhPSBfX3kuX01fY3VyOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMCitvcGVyYXRvcj4oY29uc3QgX0RlcXVlX2l0ZXJhdG9yX2Jhc2U8X1RwID4mIF9feCwKKyAgICAgICAgICBjb25zdCBfRGVxdWVfaXRlcmF0b3JfYmFzZTxfVHAgPiYgX195KQoreyByZXR1cm4gX195IDwgX194OyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgYm9vbCAgX1NUTFBfQ0FMTCBvcGVyYXRvcj49KGNvbnN0IF9EZXF1ZV9pdGVyYXRvcl9iYXNlPF9UcCA+JiBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9EZXF1ZV9pdGVyYXRvcl9iYXNlPF9UcCA+JiBfX3kpCit7IHJldHVybiAhKF9feCA8IF9feSk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBib29sICBfU1RMUF9DQUxMIG9wZXJhdG9yPD0oY29uc3QgX0RlcXVlX2l0ZXJhdG9yX2Jhc2U8X1RwID4mIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0RlcXVlX2l0ZXJhdG9yX2Jhc2U8X1RwID4mIF9feSkKK3sgcmV0dXJuICEoX195IDwgX194KTsgfQorCisjZWxzZSAvKiBfU1RMUF9VU0VfU0VQQVJBVEVfUkVMT1BTX05BTUVTUEFDRSAqLworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVHJhaXRzMSwgY2xhc3MgX1RyYWl0czI+CitpbmxpbmUgYm9vbCAgX1NUTFBfQ0FMTAorb3BlcmF0b3I9PShjb25zdCBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfVHJhaXRzMSA+JiBfX3gsCisgICAgICAgICAgIGNvbnN0IF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcmFpdHMyID4mIF9feSkKK3sgcmV0dXJuIF9feC5fTV9jdXIgPT0gX195Ll9NX2N1cjsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVHJhaXRzMSwgY2xhc3MgX1RyYWl0czI+CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMCitvcGVyYXRvciA8IChjb25zdCBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfVHJhaXRzMSA+JiBfX3gsCisgICAgICAgICAgICBjb25zdCBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfVHJhaXRzMiA+JiBfX3kpIHsKKyAgcmV0dXJuIChfX3guX01fbm9kZSA9PSBfX3kuX01fbm9kZSkgPworICAgIChfX3guX01fY3VyIDwgX195Ll9NX2N1cikgOiAoX194Ll9NX25vZGUgPCBfX3kuX01fbm9kZSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMCitvcGVyYXRvciE9KGNvbnN0IF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9Ob25jb25zdF90cmFpdHM8X1RwPiA+JiBfX3gsCisgICAgICAgICAgIGNvbnN0IF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9Db25zdF90cmFpdHM8X1RwPiA+JiBfX3kpCit7IHJldHVybiBfX3guX01fY3VyICE9IF9feS5fTV9jdXI7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBib29sIF9TVExQX0NBTEwKK29wZXJhdG9yPihjb25zdCBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfTm9uY29uc3RfdHJhaXRzPF9UcD4gPiYgX194LAorICAgICAgICAgIGNvbnN0IF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9Db25zdF90cmFpdHM8X1RwPiA+JiBfX3kpCit7IHJldHVybiBfX3kgPCBfX3g7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBib29sICBfU1RMUF9DQUxMCitvcGVyYXRvcj49KGNvbnN0IF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9Ob25jb25zdF90cmFpdHM8X1RwPiA+JiBfX3gsCisgICAgICAgICAgIGNvbnN0IF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9Db25zdF90cmFpdHM8X1RwPiA+JiBfX3kpCit7IHJldHVybiAhKF9feCA8IF9feSk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBib29sIF9TVExQX0NBTEwKK29wZXJhdG9yPD0oY29uc3QgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX05vbmNvbnN0X3RyYWl0czxfVHA+ID4mIF9feCwKKyAgICAgICAgICAgY29uc3QgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX0NvbnN0X3RyYWl0czxfVHA+ID4mIF9feSkKK3sgcmV0dXJuICEoX195IDwgX194KTsgfQorI2VuZGlmIC8qIF9TVExQX1VTRV9TRVBBUkFURV9SRUxPUFNfTkFNRVNQQUNFICovCisKKyNpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQorX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVHJhaXRzPgorc3RydWN0IF9fdHlwZV90cmFpdHM8X1NUTFBfUFJJViBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfVHJhaXRzPiA+IHsKKyAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgICBoYXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yOworICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2NvcHlfY29uc3RydWN0b3I7CisgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfYXNzaWdubWVudF9vcGVyYXRvcjsKKyAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9kZXN0cnVjdG9yOworICB0eXBlZGVmIF9fZmFsc2VfdHlwZSAgIGlzX1BPRF90eXBlOworfTsKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKyNlbmRpZiAvKiBfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OICovCisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfT0xEX0hQX0lURVJBVE9SX1FVRVJJRVMpCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9UcmFpdHM+IGlubGluZSBfVHAqICBfU1RMUF9DQUxMCit2YWx1ZV90eXBlKGNvbnN0IF9TVExQX1BSSVYgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1RyYWl0cyAgPiYpIHsgcmV0dXJuIChfVHAqKTA7IH0KK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9UcmFpdHM+IGlubGluZSByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyBfU1RMUF9DQUxMCitpdGVyYXRvcl9jYXRlZ29yeShjb25zdCBfU1RMUF9QUklWIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcmFpdHMgID4mKSB7IHJldHVybiByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZygpOyB9Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVHJhaXRzPiBpbmxpbmUgcHRyZGlmZl90KiBfU1RMUF9DQUxMCitkaXN0YW5jZV90eXBlKGNvbnN0IF9TVExQX1BSSVYgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1RyYWl0cyAgPiYpIHsgcmV0dXJuIDA7IH0KK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKyNlbmRpZgorCisvKiBEZXF1ZSBiYXNlIGNsYXNzLiAgSXQgaGFzIHR3byBwdXJwb3Nlcy4gIEZpcnN0LCBpdHMgY29uc3RydWN0b3IKKyAqICBhbmQgZGVzdHJ1Y3RvciBhbGxvY2F0ZSAoYnV0IGRvbid0IGluaXRpYWxpemUpIHN0b3JhZ2UuICBUaGlzIG1ha2VzCisgKiAgZXhjZXB0aW9uIHNhZmV0eSBlYXNpZXIuICBTZWNvbmQsIHRoZSBiYXNlIGNsYXNzIGVuY2Fwc3VsYXRlcyBhbGwgb2YKKyAqICB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBTR0ktc3R5bGUgYWxsb2NhdG9ycyBhbmQgc3RhbmRhcmQtY29uZm9ybWluZworICogIGFsbG9jYXRvcnMuCisgKi8KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgorY2xhc3MgX0RlcXVlX2Jhc2UgeworICB0eXBlZGVmIF9EZXF1ZV9iYXNlPF9UcCwgX0FsbG9jPiBfU2VsZjsKK3B1YmxpYzoKKyAgdHlwZWRlZiBfVHAgdmFsdWVfdHlwZTsKKyAgX1NUTFBfRk9SQ0VfQUxMT0NBVE9SUyhfVHAsIF9BbGxvYykKKyAgdHlwZWRlZiBfQWxsb2MgYWxsb2NhdG9yX3R5cGU7CisgIHR5cGVkZWYgX1NUTFBfYWxsb2NfcHJveHk8c2l6ZV90LCB2YWx1ZV90eXBlLCAgYWxsb2NhdG9yX3R5cGU+IF9BbGxvY19wcm94eTsKKworICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY190cmFpdHM8X1RwKiwgX0FsbG9jPjo6YWxsb2NhdG9yX3R5cGUgX01hcF9hbGxvY190eXBlOworICB0eXBlZGVmIF9TVExQX2FsbG9jX3Byb3h5PHZhbHVlX3R5cGUqKiwgdmFsdWVfdHlwZSosIF9NYXBfYWxsb2NfdHlwZT4gX01hcF9hbGxvY19wcm94eTsKKworICB0eXBlZGVmIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9Ob25jb25zdF90cmFpdHM8X1RwPiA+IGl0ZXJhdG9yOworICB0eXBlZGVmIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9Db25zdF90cmFpdHM8X1RwPiA+ICAgIGNvbnN0X2l0ZXJhdG9yOworCisgIHN0YXRpYyBzaXplX3QgX1NUTFBfQ0FMTCBidWZmZXJfc2l6ZSgpIHsgcmV0dXJuIF9EZXF1ZV9pdGVyYXRvcl9iYXNlPF9UcD46Ol9TX2J1ZmZlcl9zaXplKCk7IH0KKworICBfRGVxdWVfYmFzZShjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hLCBzaXplX3QgX19udW1fZWxlbWVudHMpCisgICAgOiBfTV9zdGFydCgpLCBfTV9maW5pc2goKSwgX01fbWFwKF9TVExQX0NPTlZFUlRfQUxMT0NBVE9SKF9fYSwgX1RwKiksIDApLAorICAgICAgX01fbWFwX3NpemUoX19hLCAoc2l6ZV90KTApCisgIHsgX01faW5pdGlhbGl6ZV9tYXAoX19udW1fZWxlbWVudHMpOyB9CisKKyAgX0RlcXVlX2Jhc2UoY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICA6IF9NX3N0YXJ0KCksIF9NX2ZpbmlzaCgpLCBfTV9tYXAoX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoX19hLCBfVHAqKSwgMCksCisgICAgICBfTV9tYXBfc2l6ZShfX2EsIChzaXplX3QpMCkge30KKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19NT1ZFX1NFTUFOVElDKQorICBfRGVxdWVfYmFzZShfX21vdmVfc291cmNlPF9TZWxmPiBzcmMpCisgICAgOiBfTV9zdGFydChzcmMuZ2V0KCkuX01fc3RhcnQpLCBfTV9maW5pc2goc3JjLmdldCgpLl9NX2ZpbmlzaCksCisgICAgICBfTV9tYXAoX19tb3ZlX3NvdXJjZTxfTWFwX2FsbG9jX3Byb3h5PihzcmMuZ2V0KCkuX01fbWFwKSksCisgICAgICBfTV9tYXBfc2l6ZShfX21vdmVfc291cmNlPF9BbGxvY19wcm94eT4oc3JjLmdldCgpLl9NX21hcF9zaXplKSkgeworICAgIHNyYy5nZXQoKS5fTV9tYXAuX01fZGF0YSA9IDA7CisgICAgc3JjLmdldCgpLl9NX21hcF9zaXplLl9NX2RhdGEgPSAwOworICAgIHNyYy5nZXQoKS5fTV9maW5pc2ggPSBzcmMuZ2V0KCkuX01fc3RhcnQ7CisgIH0KKyNlbmRpZgorCisgIH5fRGVxdWVfYmFzZSgpOworCitwcm90ZWN0ZWQ6CisgIHZvaWQgX01faW5pdGlhbGl6ZV9tYXAoc2l6ZV90KTsKKyAgdm9pZCBfTV9jcmVhdGVfbm9kZXMoX1RwKiogX19uc3RhcnQsIF9UcCoqIF9fbmZpbmlzaCk7CisgIHZvaWQgX01fZGVzdHJveV9ub2RlcyhfVHAqKiBfX25zdGFydCwgX1RwKiogX19uZmluaXNoKTsKKyAgZW51bSB7IF9TX2luaXRpYWxfbWFwX3NpemUgPSA4IH07CisKK3Byb3RlY3RlZDoKKyAgaXRlcmF0b3IgX01fc3RhcnQ7CisgIGl0ZXJhdG9yIF9NX2ZpbmlzaDsKKyAgX01hcF9hbGxvY19wcm94eSAgX01fbWFwOworICBfQWxsb2NfcHJveHkgICAgICBfTV9tYXBfc2l6ZTsKK307CisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUFRSX1NQRUNJQUxJWkFUSU9OUykKKyMgIGRlZmluZSBkZXF1ZSBfU1RMUF9QVFJfSU1QTF9OQU1FKGRlcXVlKQorI2VsaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpCisjICBkZWZpbmUgZGVxdWUgX1NUTFBfTk9OX0RCR19OQU1FKGRlcXVlKQorI2Vsc2UKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIF9TVExQX0RGTF9UTVBMX1BBUkFNKF9BbGxvYywgYWxsb2NhdG9yPF9UcD4pID4KK2NsYXNzIGRlcXVlIDogcHJvdGVjdGVkIF9TVExQX1BSSVYgX0RlcXVlX2Jhc2U8X1RwLCBfQWxsb2M+CisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKSAmJiAhZGVmaW5lZCAoZGVxdWUpCisgICAgICAgICAgICAsIHB1YmxpYyBfX3N0bHBvcnRfY2xhc3M8ZGVxdWU8X1RwLCBfQWxsb2M+ID4KKyNlbmRpZgoreworICB0eXBlZGVmIF9TVExQX1BSSVYgX0RlcXVlX2Jhc2U8X1RwLCBfQWxsb2M+IF9CYXNlOworICB0eXBlZGVmIGRlcXVlPF9UcCwgX0FsbG9jPiBfU2VsZjsKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gQmFzaWMgdHlwZXMKKyAgdHlwZWRlZiBfVHAgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiB2YWx1ZV90eXBlKiBwb2ludGVyOworICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUqIGNvbnN0X3BvaW50ZXI7CisgIHR5cGVkZWYgdmFsdWVfdHlwZSYgcmVmZXJlbmNlOworICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmIGNvbnN0X3JlZmVyZW5jZTsKKyAgdHlwZWRlZiBzaXplX3Qgc2l6ZV90eXBlOworICB0eXBlZGVmIHB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7CisgIHR5cGVkZWYgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgX0l0ZXJhdG9yX2NhdGVnb3J5OworICBfU1RMUF9GT1JDRV9BTExPQ0FUT1JTKF9UcCwgX0FsbG9jKQorICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJdGVyYXRvcnMKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IgICAgICAgaXRlcmF0b3I7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOworCisgIF9TVExQX0RFQ0xBUkVfUkFORE9NX0FDQ0VTU19SRVZFUlNFX0lURVJBVE9SUzsKKworcHJvdGVjdGVkOiAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbCB0eXBlZGVmcworICB0eXBlZGVmIHBvaW50ZXIqIF9NYXBfcG9pbnRlcjsKKyNpZiBkZWZpbmVkIChfU1RMUF9OT19NT1ZFX1NFTUFOVElDKQorICB0eXBlZGVmIF9fZmFsc2VfdHlwZSBfTW92YWJsZTsKKyNlbmRpZgorCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJhc2ljIGFjY2Vzc29ycworICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIHRoaXMtPl9NX3N0YXJ0OyB9CisgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIHRoaXMtPl9NX2ZpbmlzaDsgfQorICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKHRoaXMtPl9NX3N0YXJ0KTsgfQorICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBjb25zdF9pdGVyYXRvcih0aGlzLT5fTV9maW5pc2gpOyB9CisKKyAgcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKHRoaXMtPl9NX2ZpbmlzaCk7IH0KKyAgcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcih0aGlzLT5fTV9zdGFydCk7IH0KKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBjb25zdAorICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IodGhpcy0+X01fZmluaXNoKTsgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSBjb25zdAorICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IodGhpcy0+X01fc3RhcnQpOyB9CisKKyAgcmVmZXJlbmNlIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fbikKKyAgICB7IHJldHVybiB0aGlzLT5fTV9zdGFydFtkaWZmZXJlbmNlX3R5cGUoX19uKV07IH0KKyAgY29uc3RfcmVmZXJlbmNlIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICB7IHJldHVybiB0aGlzLT5fTV9zdGFydFtkaWZmZXJlbmNlX3R5cGUoX19uKV07IH0KKworICB2b2lkIF9NX3JhbmdlX2NoZWNrKHNpemVfdHlwZSBfX24pIGNvbnN0IHsKKyAgICBpZiAoX19uID49IHRoaXMtPnNpemUoKSkKKyAgICAgIF9fc3RsX3Rocm93X291dF9vZl9yYW5nZSgiZGVxdWUiKTsKKyAgfQorICByZWZlcmVuY2UgYXQoc2l6ZV90eXBlIF9fbikKKyAgICB7IF9NX3JhbmdlX2NoZWNrKF9fbik7IHJldHVybiAoKnRoaXMpW19fbl07IH0KKyAgY29uc3RfcmVmZXJlbmNlIGF0KHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgeyBfTV9yYW5nZV9jaGVjayhfX24pOyByZXR1cm4gKCp0aGlzKVtfX25dOyB9CisKKyAgcmVmZXJlbmNlIGZyb250KCkgeyByZXR1cm4gKnRoaXMtPl9NX3N0YXJ0OyB9CisgIHJlZmVyZW5jZSBiYWNrKCkgeworICAgIGl0ZXJhdG9yIF9fdG1wID0gdGhpcy0+X01fZmluaXNoOworICAgIC0tX190bXA7CisgICAgcmV0dXJuICpfX3RtcDsKKyAgfQorICBjb25zdF9yZWZlcmVuY2UgZnJvbnQoKSBjb25zdCB7IHJldHVybiAqdGhpcy0+X01fc3RhcnQ7IH0KKyAgY29uc3RfcmVmZXJlbmNlIGJhY2soKSBjb25zdCB7CisgICAgY29uc3RfaXRlcmF0b3IgX190bXAgPSB0aGlzLT5fTV9maW5pc2g7CisgICAgLS1fX3RtcDsKKyAgICByZXR1cm4gKl9fdG1wOworICB9CisKKyAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCB7IHJldHVybiB0aGlzLT5fTV9maW5pc2ggLSB0aGlzLT5fTV9zdGFydDsgfQorICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCB7IHJldHVybiBzaXplX3R5cGUoLTEpOyB9CisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiB0aGlzLT5fTV9maW5pc2ggPT0gdGhpcy0+X01fc3RhcnQ7IH0KKyAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IHsgcmV0dXJuIHRoaXMtPl9NX21hcF9zaXplOyB9CisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29uc3RydWN0b3IsIGRlc3RydWN0b3IuCisjaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCisgIGV4cGxpY2l0IGRlcXVlKGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorI2Vsc2UKKyAgZGVxdWUoKQorICAgIDogX1NUTFBfUFJJViBfRGVxdWVfYmFzZTxfVHAsIF9BbGxvYz4oYWxsb2NhdG9yX3R5cGUoKSwgMCkge30KKyAgZGVxdWUoY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyNlbmRpZgorICAgIDogX1NUTFBfUFJJViBfRGVxdWVfYmFzZTxfVHAsIF9BbGxvYz4oX19hLCAwKSB7fQorCisgIGRlcXVlKGNvbnN0IF9TZWxmJiBfX3gpCisgICAgOiBfU1RMUF9QUklWIF9EZXF1ZV9iYXNlPF9UcCwgX0FsbG9jPihfX3guZ2V0X2FsbG9jYXRvcigpLCBfX3guc2l6ZSgpKQorICB7IF9TVExQX1BSSVYgX191Y29weShfX3guYmVnaW4oKSwgX194LmVuZCgpLCB0aGlzLT5fTV9zdGFydCk7IH0KKworI2lmICFkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorcHJpdmF0ZToKKyAgdm9pZCBfTV9pbml0aWFsaXplKHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9fdmFsID0gX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRChfVHApKSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJpdmlhbEluaXQ8X1RwPjo6X1JldCBfVHJpdmlhbEluaXQ7CisgICAgX01fZmlsbF9pbml0aWFsaXplKF9fdmFsLCBfVHJpdmlhbEluaXQoKSk7CisgIH0KK3B1YmxpYzoKKyAgZXhwbGljaXQgZGVxdWUoc2l6ZV90eXBlIF9fbikKKyAgICA6IF9TVExQX1BSSVYgX0RlcXVlX2Jhc2U8X1RwLCBfQWxsb2M+KGFsbG9jYXRvcl90eXBlKCksIF9fbikKKyAgeyBfTV9pbml0aWFsaXplKF9fbik7IH0KKyAgZGVxdWUoc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX192YWwsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorI2Vsc2UKKyAgZXhwbGljaXQgZGVxdWUoc2l6ZV90eXBlIF9fbikKKyAgICA6IF9TVExQX1BSSVYgX0RlcXVlX2Jhc2U8X1RwLCBfQWxsb2M+KGFsbG9jYXRvcl90eXBlKCksIF9fbikgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyaXZpYWxJbml0PF9UcD46Ol9SZXQgX1RyaXZpYWxJbml0OworICAgIF9NX2ZpbGxfaW5pdGlhbGl6ZShfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKF9UcCksIF9Ucml2aWFsSW5pdCgpKTsKKyAgfQorICBkZXF1ZShzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ZhbCkKKyAgICA6IF9TVExQX1BSSVYgX0RlcXVlX2Jhc2U8X1RwLCBfQWxsb2M+KGFsbG9jYXRvcl90eXBlKCksIF9fbikKKyAgeyBfTV9maWxsX2luaXRpYWxpemUoX192YWwsIF9fZmFsc2VfdHlwZSgpKTsgfQorICBkZXF1ZShzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ZhbCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyNlbmRpZgorICAgIDogX1NUTFBfUFJJViBfRGVxdWVfYmFzZTxfVHAsIF9BbGxvYz4oX19hLCBfX24pCisgIHsgX01fZmlsbF9pbml0aWFsaXplKF9fdmFsLCBfX2ZhbHNlX3R5cGUoKSk7IH0KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCitwcm90ZWN0ZWQ6CisgIHRlbXBsYXRlIDxjbGFzcyBfSW50ZWdlcj4KKyAgdm9pZCBfTV9pbml0aWFsaXplX2Rpc3BhdGNoKF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX194LCBjb25zdCBfX3RydWVfdHlwZSYpIHsKKyAgICB0aGlzLT5fTV9pbml0aWFsaXplX21hcChfX24pOworICAgIF9NX2ZpbGxfaW5pdGlhbGl6ZShfX3gsIF9fZmFsc2VfdHlwZSgpKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgorICB2b2lkIF9NX2luaXRpYWxpemVfZGlzcGF0Y2goX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fZmFsc2VfdHlwZSYpIHsKKyAgICBfTV9yYW5nZV9pbml0aWFsaXplKF9fZmlyc3QsIF9fbGFzdCwgX1NUTFBfSVRFUkFUT1JfQ0FURUdPUlkoX19maXJzdCwgX0lucHV0SXRlcikpOworICB9CisKK3B1YmxpYzoKKyAgLy8gQ2hlY2sgd2hldGhlciBpdCdzIGFuIGludGVncmFsIHR5cGUuICBJZiBzbywgaXQncyBub3QgYW4gaXRlcmF0b3IuCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgZGVxdWUoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hIF9TVExQX0FMTE9DQVRPUl9UWVBFX0RGTCkKKyAgICA6IF9TVExQX1BSSVYgX0RlcXVlX2Jhc2U8X1RwLCBfQWxsb2M+KF9fYSkgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lzSW50ZWdyYWw8X0lucHV0SXRlcmF0b3I+OjpfUmV0IF9JbnRlZ3JhbDsKKyAgICBfTV9pbml0aWFsaXplX2Rpc3BhdGNoKF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOworICB9CisKKyMgIGlmIGRlZmluZWQgKF9TVExQX05FRURTX0VYVFJBX1RFTVBMQVRFX0NPTlNUUlVDVE9SUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICBkZXF1ZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgOiBfU1RMUF9QUklWIF9EZXF1ZV9iYXNlPF9UcCwgX0FsbG9jPihhbGxvY2F0b3JfdHlwZSgpKSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXNJbnRlZ3JhbDxfSW5wdXRJdGVyYXRvcj46Ol9SZXQgX0ludGVncmFsOworICAgIF9NX2luaXRpYWxpemVfZGlzcGF0Y2goX19maXJzdCwgX19sYXN0LCBfSW50ZWdyYWwoKSk7CisgIH0KKyMgIGVuZGlmCisKKyNlbHNlCisgIGRlcXVlKGNvbnN0IHZhbHVlX3R5cGUqIF9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbGFzdCwKKyAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkgKQorICAgIDogX1NUTFBfUFJJViBfRGVxdWVfYmFzZTxfVHAsIF9BbGxvYz4oX19hLCBfX2xhc3QgLSBfX2ZpcnN0KQorICB7IF9TVExQX1BSSVYgX191Y29weShfX2ZpcnN0LCBfX2xhc3QsIHRoaXMtPl9NX3N0YXJ0KTsgfQorCisgIGRlcXVlKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkgKQorICAgIDogX1NUTFBfUFJJViBfRGVxdWVfYmFzZTxfVHAsIF9BbGxvYz4oX19hLCBfX2xhc3QgLSBfX2ZpcnN0KQorICB7IF9TVExQX1BSSVYgX191Y29weShfX2ZpcnN0LCBfX2xhc3QsIHRoaXMtPl9NX3N0YXJ0KTsgfQorI2VuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19NT1ZFX1NFTUFOVElDKQorICBkZXF1ZShfX21vdmVfc291cmNlPF9TZWxmPiBzcmMpCisgICAgOiBfU1RMUF9QUklWIF9EZXF1ZV9iYXNlPF9UcCwgX0FsbG9jPihfX21vdmVfc291cmNlPF9CYXNlPihzcmMuZ2V0KCkpKQorICB7fQorI2VuZGlmCisKKyAgfmRlcXVlKCkKKyAgeyBfU1RMUF9TVEQ6Ol9EZXN0cm95X1JhbmdlKHRoaXMtPl9NX3N0YXJ0LCB0aGlzLT5fTV9maW5pc2gpOyB9CisKKyAgX1NlbGYmIG9wZXJhdG9yPSAoY29uc3QgX1NlbGYmIF9feCk7CisKKyAgdm9pZCBzd2FwKF9TZWxmJiBfX3gpIHsKKyAgICBfU1RMUF9TVEQ6OnN3YXAodGhpcy0+X01fc3RhcnQsIF9feC5fTV9zdGFydCk7CisgICAgX1NUTFBfU1REOjpzd2FwKHRoaXMtPl9NX2ZpbmlzaCwgX194Ll9NX2ZpbmlzaCk7CisgICAgdGhpcy0+X01fbWFwLnN3YXAoX194Ll9NX21hcCk7CisgICAgdGhpcy0+X01fbWFwX3NpemUuc3dhcChfX3guX01fbWFwX3NpemUpOworICB9CisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKSAmJiAhZGVmaW5lZCAoX1NUTFBfRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSKQorICB2b2lkIF9NX3N3YXBfd29ya2Fyb3VuZChfU2VsZiYgX194KSB7IHN3YXAoX194KTsgfQorI2VuZGlmCisKK3B1YmxpYzoKKyAgLy8gYXNzaWduKCksIGEgZ2VuZXJhbGl6ZWQgYXNzaWdubWVudCBtZW1iZXIgZnVuY3Rpb24uICBUd28KKyAgLy8gdmVyc2lvbnM6IG9uZSB0aGF0IHRha2VzIGEgY291bnQsIGFuZCBvbmUgdGhhdCB0YWtlcyBhIHJhbmdlLgorICAvLyBUaGUgcmFuZ2UgdmVyc2lvbiBpcyBhIG1lbWJlciB0ZW1wbGF0ZSwgc28gd2UgZGlzcGF0Y2ggb24gd2hldGhlcgorICAvLyBvciBub3QgdGhlIHR5cGUgaXMgYW4gaW50ZWdlci4KKworICB2b2lkIF9NX2ZpbGxfYXNzaWduKHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX192YWwpIHsKKyAgICBpZiAoX19uID4gc2l6ZSgpKSB7CisgICAgICBfU1RMUF9TVEQ6OmZpbGwoYmVnaW4oKSwgZW5kKCksIF9fdmFsKTsKKyAgICAgIGluc2VydChlbmQoKSwgX19uIC0gc2l6ZSgpLCBfX3ZhbCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgZXJhc2UoYmVnaW4oKSArIF9fbiwgZW5kKCkpOworICAgICAgX1NUTFBfU1REOjpmaWxsKGJlZ2luKCksIGVuZCgpLCBfX3ZhbCk7CisgICAgfQorICB9CisKKyAgdm9pZCBhc3NpZ24oc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3ZhbCkgeworICAgIF9NX2ZpbGxfYXNzaWduKF9fbiwgX192YWwpOworICB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZvaWQgYXNzaWduKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lzSW50ZWdyYWw8X0lucHV0SXRlcmF0b3I+OjpfUmV0IF9JbnRlZ3JhbDsKKyAgICBfTV9hc3NpZ25fZGlzcGF0Y2goX19maXJzdCwgX19sYXN0LCBfSW50ZWdyYWwoKSk7CisgIH0KKworcHJpdmF0ZTogICAgICAgICAgICAgICAgICAgICAgICAvLyBoZWxwZXIgZnVuY3Rpb25zIGZvciBhc3NpZ24oKQorCisgIHRlbXBsYXRlIDxjbGFzcyBfSW50ZWdlcj4KKyAgdm9pZCBfTV9hc3NpZ25fZGlzcGF0Y2goX0ludGVnZXIgX19uLCBfSW50ZWdlciBfX3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX190cnVlX3R5cGUmIC8qX0lzSW50ZWdyYWwqLykKKyAgeyBfTV9maWxsX2Fzc2lnbigoc2l6ZV90eXBlKSBfX24sIChfVHApIF9fdmFsKTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgdm9pZCBfTV9hc3NpZ25fZGlzcGF0Y2goX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qX0lzSW50ZWdyYWwqLykgeworICAgIF9NX2Fzc2lnbl9hdXgoX19maXJzdCwgX19sYXN0LCBfU1RMUF9JVEVSQVRPUl9DQVRFR09SWShfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvcikpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXI+CisgIHZvaWQgX01fYXNzaWduX2F1eChfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LCBjb25zdCBpbnB1dF9pdGVyYXRvcl90YWcgJikgeworICAgIGl0ZXJhdG9yIF9fY3VyID0gYmVnaW4oKTsKKyAgICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0ICYmIF9fY3VyICE9IGVuZCgpOyArK19fY3VyLCArK19fZmlyc3QpCisgICAgICAqX19jdXIgPSAqX19maXJzdDsKKyAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCisgICAgICBlcmFzZShfX2N1ciwgZW5kKCkpOworICAgIGVsc2UKKyAgICAgIGluc2VydChlbmQoKSwgX19maXJzdCwgX19sYXN0KTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorICB2b2lkIF9NX2Fzc2lnbl9hdXgoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcndhcmRfaXRlcmF0b3JfdGFnICYpIHsKKyNlbHNlCisgIHZvaWQgYXNzaWduKGNvbnN0IHZhbHVlX3R5cGUgKl9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUgKl9fbGFzdCkgeworICAgIHNpemVfdHlwZSBfX3NpemUgPSBzaXplKCk7CisgICAgc2l6ZV90eXBlIF9fbGVuID0gX19sYXN0IC0gX19maXJzdDsKKyAgICBpZiAoX19sZW4gPiBfX3NpemUpIHsKKyAgICAgIGNvbnN0IHZhbHVlX3R5cGUgKl9fbWlkID0gX19maXJzdCArIF9fc2l6ZTsKKyAgICAgIF9TVExQX1NURDo6Y29weShfX2ZpcnN0LCBfX21pZCwgYmVnaW4oKSk7CisgICAgICBpbnNlcnQoZW5kKCksIF9fbWlkLCBfX2xhc3QpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGVyYXNlKF9TVExQX1NURDo6Y29weShfX2ZpcnN0LCBfX2xhc3QsIGJlZ2luKCkpLCBlbmQoKSk7CisgICAgfQorICB9CisgIHZvaWQgYXNzaWduKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkgeworICAgIHR5cGVkZWYgY29uc3RfaXRlcmF0b3IgX0ZvcndhcmRJdGVyYXRvcjsKKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisgICAgc2l6ZV90eXBlIF9fbGVuID0gX1NUTFBfU1REOjpkaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QpOworICAgIGlmIChfX2xlbiA+IHNpemUoKSkgeworICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX21pZCA9IF9fZmlyc3Q7CisgICAgICBfU1RMUF9TVEQ6OmFkdmFuY2UoX19taWQsIHNpemUoKSk7CisgICAgICBfU1RMUF9TVEQ6OmNvcHkoX19maXJzdCwgX19taWQsIGJlZ2luKCkpOworICAgICAgaW5zZXJ0KGVuZCgpLCBfX21pZCwgX19sYXN0KTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBlcmFzZShfU1RMUF9TVEQ6OmNvcHkoX19maXJzdCwgX19sYXN0LCBiZWdpbigpKSwgZW5kKCkpOworICAgIH0KKyAgfQorCisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHVzaF8qIGFuZCBwb3BfKgorCisjaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pICYmICFkZWZpbmVkIChfU1RMUF9OT19BTkFDSFJPTklTTVMpCisgIHZvaWQgcHVzaF9iYWNrKGNvbnN0IHZhbHVlX3R5cGUmIF9fdCA9IF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQoX1RwKSkgeworI2Vsc2UKKyAgdm9pZCBwdXNoX2JhY2soY29uc3QgdmFsdWVfdHlwZSYgX190KSB7CisjZW5kaWYgLyohX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSAmJiAhX1NUTFBfTk9fQU5BQ0hST05JU01TKi8KKyAgICBpZiAodGhpcy0+X01fZmluaXNoLl9NX2N1ciAhPSB0aGlzLT5fTV9maW5pc2guX01fbGFzdCAtIDEpIHsKKyAgICAgIF9Db3B5X0NvbnN0cnVjdCh0aGlzLT5fTV9maW5pc2guX01fY3VyLCBfX3QpOworICAgICAgKyt0aGlzLT5fTV9maW5pc2guX01fY3VyOworICAgIH0KKyAgICBlbHNlCisgICAgICBfTV9wdXNoX2JhY2tfYXV4X3YoX190KTsKKyAgfQorI2lmICFkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fQU5BQ0hST05JU01TKQorICB2b2lkIHB1c2hfZnJvbnQoY29uc3QgdmFsdWVfdHlwZSYgX190ID0gX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRChfVHApKSAgIHsKKyNlbHNlCisgIHZvaWQgcHVzaF9mcm9udChjb25zdCB2YWx1ZV90eXBlJiBfX3QpICAgeworI2VuZGlmIC8qIV9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0gJiYgIV9TVExQX05PX0FOQUNIUk9OSVNNUyovCisgICAgaWYgKHRoaXMtPl9NX3N0YXJ0Ll9NX2N1ciAhPSB0aGlzLT5fTV9zdGFydC5fTV9maXJzdCkgeworICAgICAgX0NvcHlfQ29uc3RydWN0KHRoaXMtPl9NX3N0YXJ0Ll9NX2N1ciAtIDEsIF9fdCk7CisgICAgICAtLXRoaXMtPl9NX3N0YXJ0Ll9NX2N1cjsKKyAgICB9CisgICAgZWxzZQorICAgICAgX01fcHVzaF9mcm9udF9hdXhfdihfX3QpOworICB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fQU5BQ0hST05JU01TKQorICB2b2lkIHB1c2hfYmFjaygpIHsKKyAgICBpZiAodGhpcy0+X01fZmluaXNoLl9NX2N1ciAhPSB0aGlzLT5fTV9maW5pc2guX01fbGFzdCAtIDEpIHsKKyAgICAgIF9TVExQX1NURDo6X0NvbnN0cnVjdCh0aGlzLT5fTV9maW5pc2guX01fY3VyKTsKKyAgICAgICsrdGhpcy0+X01fZmluaXNoLl9NX2N1cjsKKyAgICB9CisgICAgZWxzZQorICAgICAgX01fcHVzaF9iYWNrX2F1eCgpOworICB9CisgIHZvaWQgcHVzaF9mcm9udCgpIHsKKyAgICBpZiAodGhpcy0+X01fc3RhcnQuX01fY3VyICE9IHRoaXMtPl9NX3N0YXJ0Ll9NX2ZpcnN0KSB7CisgICAgICBfU1RMUF9TVEQ6Ol9Db25zdHJ1Y3QodGhpcy0+X01fc3RhcnQuX01fY3VyIC0gMSk7CisgICAgICAtLXRoaXMtPl9NX3N0YXJ0Ll9NX2N1cjsKKyAgICB9CisgICAgZWxzZQorICAgICAgX01fcHVzaF9mcm9udF9hdXgoKTsKKyAgfQorI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSAmJiAhX1NUTFBfTk9fQU5BQ0hST05JU01TKi8KKworICB2b2lkIHBvcF9iYWNrKCkgeworICAgIGlmICh0aGlzLT5fTV9maW5pc2guX01fY3VyICE9IHRoaXMtPl9NX2ZpbmlzaC5fTV9maXJzdCkgeworICAgICAgLS10aGlzLT5fTV9maW5pc2guX01fY3VyOworICAgICAgX1NUTFBfU1REOjpfRGVzdHJveSh0aGlzLT5fTV9maW5pc2guX01fY3VyKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBfTV9wb3BfYmFja19hdXgoKTsKKyAgICAgIF9TVExQX1NURDo6X0Rlc3Ryb3kodGhpcy0+X01fZmluaXNoLl9NX2N1cik7CisgICAgfQorICB9CisKKyAgdm9pZCBwb3BfZnJvbnQoKSB7CisgICAgX1NUTFBfU1REOjpfRGVzdHJveSh0aGlzLT5fTV9zdGFydC5fTV9jdXIpOworICAgIF9NX3BvcF9mcm9udF9hdXgoKTsKKyAgfQorCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluc2VydAorCisjaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pICYmICFkZWZpbmVkIChfU1RMUF9OT19BTkFDSFJPTklTTVMpCisgIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBfX3BvcywgY29uc3QgdmFsdWVfdHlwZSYgX194ID0gX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRChfVHApKSB7CisjZWxzZQorICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkgeworI2VuZGlmIC8qIV9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0gJiYgIV9TVExQX05PX0FOQUNIUk9OSVNNUyovCisjaWYgIWRlZmluZWQgKF9TVExQX05PX01PVkVfU0VNQU5USUMpCisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX21vdmVfdHJhaXRzPF9UcD46OmltcGxlbWVudGVkIF9Nb3ZhYmxlOworI2VuZGlmCisgICAgaWYgKF9fcG9zLl9NX2N1ciA9PSB0aGlzLT5fTV9zdGFydC5fTV9jdXIpIHsKKyAgICAgIHB1c2hfZnJvbnQoX194KTsKKyAgICAgIHJldHVybiB0aGlzLT5fTV9zdGFydDsKKyAgICB9CisgICAgZWxzZSBpZiAoX19wb3MuX01fY3VyID09IHRoaXMtPl9NX2ZpbmlzaC5fTV9jdXIpIHsKKyAgICAgIHB1c2hfYmFjayhfX3gpOworICAgICAgaXRlcmF0b3IgX190bXAgPSB0aGlzLT5fTV9maW5pc2g7CisgICAgICAtLV9fdG1wOworICAgICAgcmV0dXJuIF9fdG1wOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHJldHVybiBfTV9maWxsX2luc2VydF9hdXgoX19wb3MsIDEsIF9feCwgX01vdmFibGUoKSk7CisgICAgfQorICB9CisKKyNpZiBkZWZpbmVkKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pICYmICFkZWZpbmVkKF9TVExQX05PX0FOQUNIUk9OSVNNUykKKyAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zKQorICB7IHJldHVybiBpbnNlcnQoX19wb3MsIF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQoX1RwKSk7IH0KKyNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0gJiYgIV9TVExQX05PX0FOQUNIUk9OSVNNUyovCisKKyAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgeyBfTV9maWxsX2luc2VydChfX3BvcywgX19uLCBfX3gpOyB9CisKK3Byb3RlY3RlZDoKKyAgaXRlcmF0b3IgX01fZmlsbF9pbnNlcnRfYXV4KGl0ZXJhdG9yIF9fcG9zLCBzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gsIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKl9Nb3ZhYmxlKi8pOworICBpdGVyYXRvciBfTV9maWxsX2luc2VydF9hdXgoaXRlcmF0b3IgX19wb3MsIHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCwgY29uc3QgX19mYWxzZV90eXBlJiAvKl9Nb3ZhYmxlKi8pOworCisgIHZvaWQgX01fZmlsbF9pbnNlcnQoaXRlcmF0b3IgX19wb3MsIHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCk7CisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0ludGVnZXI+CisgIHZvaWQgX01faW5zZXJ0X2Rpc3BhdGNoKGl0ZXJhdG9yIF9fcG9zLCBfSW50ZWdlciBfX24sIF9JbnRlZ2VyIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX190cnVlX3R5cGUmIC8qX0lzSW50ZWdyYWwqLykgeworICAgIF9NX2ZpbGxfaW5zZXJ0KF9fcG9zLCAoc2l6ZV90eXBlKSBfX24sICh2YWx1ZV90eXBlKSBfX3gpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICB2b2lkIF9NX2luc2VydF9kaXNwYXRjaChpdGVyYXRvciBfX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qX0lzSW50ZWdyYWwqLykgeworICAgIF9NX2luc2VydChfX3BvcywgX19maXJzdCwgX19sYXN0LCBfU1RMUF9JVEVSQVRPUl9DQVRFR09SWShfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvcikpOworICB9CisKK3B1YmxpYzoKKyAgLy8gQ2hlY2sgd2hldGhlciBpdCdzIGFuIGludGVncmFsIHR5cGUuICBJZiBzbywgaXQncyBub3QgYW4gaXRlcmF0b3IuCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lzSW50ZWdyYWw8X0lucHV0SXRlcmF0b3I+OjpfUmV0IF9JbnRlZ3JhbDsKKyAgICBfTV9pbnNlcnRfZGlzcGF0Y2goX19wb3MsIF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOworICB9CisKKyNlbHNlIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKyAgdm9pZCBfTV9pbnNlcnRfcmFuZ2VfYXV4KGl0ZXJhdG9yIF9fcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWVfdHlwZSogX19maXJzdCwgY29uc3QgdmFsdWVfdHlwZSogX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbiwgY29uc3QgX190cnVlX3R5cGUmIC8qX01vdmFibGUqLyk7CisgIHZvaWQgX01faW5zZXJ0X3JhbmdlX2F1eChpdGVyYXRvciBfX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlX3R5cGUqIF9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX24sIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypfTW92YWJsZSovKTsKKyAgdm9pZCBfTV9pbnNlcnRfcmFuZ2VfYXV4KGl0ZXJhdG9yIF9fcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbiwgY29uc3QgX190cnVlX3R5cGUmIC8qX01vdmFibGUqLyk7CisgIHZvaWQgX01faW5zZXJ0X3JhbmdlX2F1eChpdGVyYXRvciBfX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX24sIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypfTW92YWJsZSovKTsKK3B1YmxpYzoKKyAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3MsCisgICAgICAgICAgICAgIGNvbnN0IHZhbHVlX3R5cGUqIF9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbGFzdCk7CisgIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLAorICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpOworCisjZW5kaWYgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworCitwdWJsaWM6CisjaWYgIWRlZmluZWQoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKKyAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9fbmV3X3NpemUsCisgICAgICAgICAgICAgIGNvbnN0IHZhbHVlX3R5cGUmIF9feCA9IF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQoX1RwKSkgeworI2Vsc2UKKyAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9fbmV3X3NpemUsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkgeworI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCisgICAgY29uc3Qgc2l6ZV90eXBlIF9fbGVuID0gc2l6ZSgpOworICAgIGlmIChfX25ld19zaXplIDwgX19sZW4pCisgICAgICBlcmFzZSh0aGlzLT5fTV9zdGFydCArIF9fbmV3X3NpemUsIHRoaXMtPl9NX2ZpbmlzaCk7CisgICAgZWxzZQorICAgICAgaW5zZXJ0KHRoaXMtPl9NX2ZpbmlzaCwgX19uZXdfc2l6ZSAtIF9fbGVuLCBfX3gpOworICB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgX19uZXdfc2l6ZSkKKyAgeyByZXNpemUoX19uZXdfc2l6ZSwgX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRChfVHApKTsgfQorI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCisKK3Byb3RlY3RlZDoKKyAgaXRlcmF0b3IgX01fZXJhc2UoaXRlcmF0b3IgX19wb3MsIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKl9Nb3ZhYmxlKi8pOworICBpdGVyYXRvciBfTV9lcmFzZShpdGVyYXRvciBfX3BvcywgY29uc3QgX19mYWxzZV90eXBlJiAvKl9Nb3ZhYmxlKi8pOworCisgIGl0ZXJhdG9yIF9NX2VyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCwgY29uc3QgX190cnVlX3R5cGUmIC8qX01vdmFibGUqLyk7CisgIGl0ZXJhdG9yIF9NX2VyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCwgY29uc3QgX19mYWxzZV90eXBlJiAvKl9Nb3ZhYmxlKi8pOworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFcmFzZQorICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBfX3BvcykgeworI2lmICFkZWZpbmVkIChfU1RMUF9OT19NT1ZFX1NFTUFOVElDKQorICAgIHR5cGVkZWYgdHlwZW5hbWUgX19tb3ZlX3RyYWl0czxfVHA+OjppbXBsZW1lbnRlZCBfTW92YWJsZTsKKyNlbmRpZgorICAgIHJldHVybiBfTV9lcmFzZShfX3BvcywgX01vdmFibGUoKSk7CisgIH0KKyAgaXRlcmF0b3IgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KSB7CisjaWYgIWRlZmluZWQgKF9TVExQX05PX01PVkVfU0VNQU5USUMpCisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX21vdmVfdHJhaXRzPF9UcD46OmltcGxlbWVudGVkIF9Nb3ZhYmxlOworI2VuZGlmCisgICAgaWYgKF9fZmlyc3QgPT0gdGhpcy0+X01fc3RhcnQgJiYgX19sYXN0ID09IHRoaXMtPl9NX2ZpbmlzaCkgeworICAgICAgY2xlYXIoKTsKKyAgICAgIHJldHVybiB0aGlzLT5fTV9maW5pc2g7CisgICAgfQorICAgIGVsc2UgeworICAgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorICAgICAgICByZXR1cm4gX19maXJzdDsKKyAgICAgIHJldHVybiBfTV9lcmFzZShfX2ZpcnN0LCBfX2xhc3QsIF9Nb3ZhYmxlKCkpOworICAgIH0KKyAgfQorICB2b2lkIGNsZWFyKCk7CisKK3Byb3RlY3RlZDogICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbCBjb25zdHJ1Y3Rpb24vZGVzdHJ1Y3Rpb24KKworICB2b2lkIF9NX2ZpbGxfaW5pdGlhbGl6ZShjb25zdCB2YWx1ZV90eXBlJiBfX3ZhbCwgY29uc3QgX190cnVlX3R5cGUmIC8qX1RyaXZpYWxJbml0Ki8pCisgIHt9CisgIHZvaWQgX01fZmlsbF9pbml0aWFsaXplKGNvbnN0IHZhbHVlX3R5cGUmIF9fdmFsLCBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qX1RyaXZpYWxJbml0Ki8pOworCisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICB2b2lkIF9NX3JhbmdlX2luaXRpYWxpemUoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5wdXRfaXRlcmF0b3JfdGFnICYpIHsKKyAgICB0aGlzLT5fTV9pbml0aWFsaXplX21hcCgwKTsKKyAgICBfU1RMUF9UUlkgeworICAgICAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorICAgICAgICBwdXNoX2JhY2soKl9fZmlyc3QpOworICAgIH0KKyAgICBfU1RMUF9VTldJTkQoY2xlYXIoKSkKKyAgfQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KKyAgdm9pZCAgX01fcmFuZ2VfaW5pdGlhbGl6ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcndhcmRfaXRlcmF0b3JfdGFnICYpICB7CisgICBzaXplX3R5cGUgX19uID0gX1NUTFBfU1REOjpkaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QpOworICAgdGhpcy0+X01faW5pdGlhbGl6ZV9tYXAoX19uKTsKKyAgIF9NYXBfcG9pbnRlciBfX2N1cl9ub2RlID0gdGhpcy0+X01fc3RhcnQuX01fbm9kZTsKKyAgIF9TVExQX1RSWSB7CisgICAgZm9yICg7IF9fY3VyX25vZGUgPCB0aGlzLT5fTV9maW5pc2guX01fbm9kZTsgKytfX2N1cl9ub2RlKSB7CisgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbWlkID0gX19maXJzdDsKKyAgICAgIF9TVExQX1NURDo6YWR2YW5jZShfX21pZCwgdGhpcy0+YnVmZmVyX3NpemUoKSk7CisgICAgICBfU1RMUF9TVEQ6OnVuaW5pdGlhbGl6ZWRfY29weShfX2ZpcnN0LCBfX21pZCwgKl9fY3VyX25vZGUpOworICAgICAgX19maXJzdCA9IF9fbWlkOworICAgIH0KKyAgICBfU1RMUF9TVEQ6OnVuaW5pdGlhbGl6ZWRfY29weShfX2ZpcnN0LCBfX2xhc3QsIHRoaXMtPl9NX2ZpbmlzaC5fTV9maXJzdCk7CisgICB9CisgIF9TVExQX1VOV0lORChfU1RMUF9TVEQ6Ol9EZXN0cm95X1JhbmdlKHRoaXMtPl9NX3N0YXJ0LCBpdGVyYXRvcigqX19jdXJfbm9kZSwgX19jdXJfbm9kZSkpKQorIH0KKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisKK3Byb3RlY3RlZDogICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbCBwdXNoXyogYW5kIHBvcF8qCisKKyAgdm9pZCBfTV9wdXNoX2JhY2tfYXV4X3YoY29uc3QgdmFsdWVfdHlwZSYpOworICB2b2lkIF9NX3B1c2hfZnJvbnRfYXV4X3YoY29uc3QgdmFsdWVfdHlwZSYpOworI2lmIGRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pICYmICFkZWZpbmVkIChfU1RMUF9OT19BTkFDSFJPTklTTVMpCisgIHZvaWQgX01fcHVzaF9iYWNrX2F1eCgpOworICB2b2lkIF9NX3B1c2hfZnJvbnRfYXV4KCk7CisjZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNICFfU1RMUF9OT19BTkFDSFJPTklTTVMqLworICB2b2lkIF9NX3BvcF9iYWNrX2F1eCgpOworICB2b2lkIF9NX3BvcF9mcm9udF9hdXgoKTsKKworcHJvdGVjdGVkOiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsIGluc2VydCBmdW5jdGlvbnMKKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICB2b2lkIF9NX2luc2VydChpdGVyYXRvciBfX3BvcywKKyAgICAgICAgICAgICAgICBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICBjb25zdCBpbnB1dF9pdGVyYXRvcl90YWcgJikgeworICAgIF9TVExQX1NURDo6Y29weShfX2ZpcnN0LCBfX2xhc3QsIGluc2VydGVyKCp0aGlzLCBfX3BvcykpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CisgIHZvaWQgIF9NX2luc2VydChpdGVyYXRvciBfX3BvcywKKyAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICBjb25zdCBmb3J3YXJkX2l0ZXJhdG9yX3RhZyAmKSB7CisjaWYgIWRlZmluZWQgKF9TVExQX05PX01PVkVfU0VNQU5USUMpCisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX21vdmVfdHJhaXRzPF9UcD46OmltcGxlbWVudGVkIF9Nb3ZhYmxlOworI2VuZGlmCisgICAgc2l6ZV90eXBlIF9fbiA9IF9TVExQX1NURDo6ZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KTsKKyAgICBpZiAoX19wb3MuX01fY3VyID09IHRoaXMtPl9NX3N0YXJ0Ll9NX2N1cikgeworICAgICAgaXRlcmF0b3IgX19uZXdfc3RhcnQgPSBfTV9yZXNlcnZlX2VsZW1lbnRzX2F0X2Zyb250KF9fbik7CisgICAgICBfU1RMUF9UUlkgeworICAgICAgICB1bmluaXRpYWxpemVkX2NvcHkoX19maXJzdCwgX19sYXN0LCBfX25ld19zdGFydCk7CisgICAgICAgIHRoaXMtPl9NX3N0YXJ0ID0gX19uZXdfc3RhcnQ7CisgICAgICB9CisgICAgICBfU1RMUF9VTldJTkQodGhpcy0+X01fZGVzdHJveV9ub2RlcyhfX25ld19zdGFydC5fTV9ub2RlLCB0aGlzLT5fTV9zdGFydC5fTV9ub2RlKSkKKyAgICB9CisgICAgZWxzZSBpZiAoX19wb3MuX01fY3VyID09IHRoaXMtPl9NX2ZpbmlzaC5fTV9jdXIpIHsKKyAgICAgIGl0ZXJhdG9yIF9fbmV3X2ZpbmlzaCA9IF9NX3Jlc2VydmVfZWxlbWVudHNfYXRfYmFjayhfX24pOworICAgICAgX1NUTFBfVFJZIHsKKyAgICAgICAgdW5pbml0aWFsaXplZF9jb3B5KF9fZmlyc3QsIF9fbGFzdCwgdGhpcy0+X01fZmluaXNoKTsKKyAgICAgICAgdGhpcy0+X01fZmluaXNoID0gX19uZXdfZmluaXNoOworICAgICAgfQorICAgICAgX1NUTFBfVU5XSU5EKHRoaXMtPl9NX2Rlc3Ryb3lfbm9kZXModGhpcy0+X01fZmluaXNoLl9NX25vZGUgKyAxLCBfX25ld19maW5pc2guX01fbm9kZSArIDEpKQorICAgIH0KKyAgICBlbHNlCisgICAgICBfTV9pbnNlcnRfcmFuZ2VfYXV4KF9fcG9zLCBfX2ZpcnN0LCBfX2xhc3QsIF9fbiwgX01vdmFibGUoKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KKyAgdm9pZCBfTV9pbnNlcnRfcmFuZ2VfYXV4KGl0ZXJhdG9yIF9fcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX24sIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKl9Nb3ZhYmxlKi8pIHsKKyAgICBjb25zdCBkaWZmZXJlbmNlX3R5cGUgX19lbGVtc2JlZm9yZSA9IF9fcG9zIC0gdGhpcy0+X01fc3RhcnQ7CisgICAgc2l6ZV90eXBlIF9fbGVuZ3RoID0gc2l6ZSgpOworICAgIGlmIChfX2VsZW1zYmVmb3JlIDw9IGRpZmZlcmVuY2VfdHlwZShfX2xlbmd0aCAvIDIpKSB7CisgICAgICBpdGVyYXRvciBfX25ld19zdGFydCA9IF9NX3Jlc2VydmVfZWxlbWVudHNfYXRfZnJvbnQoX19uKTsKKyAgICAgIF9fcG9zID0gdGhpcy0+X01fc3RhcnQgKyBfX2VsZW1zYmVmb3JlOworICAgICAgX1NUTFBfVFJZIHsKKyAgICAgICAgaXRlcmF0b3IgX19kc3QgPSBfX25ld19zdGFydDsKKyAgICAgICAgaXRlcmF0b3IgX19zcmMgPSB0aGlzLT5fTV9zdGFydDsKKyAgICAgICAgZm9yICg7IF9fc3JjICE9IF9fcG9zOyArK19fZHN0LCArK19fc3JjKSB7CisgICAgICAgICAgX1NUTFBfU1REOjpfTW92ZV9Db25zdHJ1Y3QoJigqX19kc3QpLCAqX19zcmMpOworICAgICAgICAgIF9TVExQX1NURDo6X0Rlc3Ryb3lfTW92ZWQoJigqX19zcmMpKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLT5fTV9zdGFydCA9IF9fbmV3X3N0YXJ0OworICAgICAgICB1bmluaXRpYWxpemVkX2NvcHkoX19maXJzdCwgX19sYXN0LCBfX2RzdCk7CisgICAgICB9CisgICAgICBfU1RMUF9VTldJTkQodGhpcy0+X01fZGVzdHJveV9ub2RlcyhfX25ld19zdGFydC5fTV9ub2RlLCB0aGlzLT5fTV9zdGFydC5fTV9ub2RlKSkKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBpdGVyYXRvciBfX25ld19maW5pc2ggPSBfTV9yZXNlcnZlX2VsZW1lbnRzX2F0X2JhY2soX19uKTsKKyAgICAgIGNvbnN0IGRpZmZlcmVuY2VfdHlwZSBfX2VsZW1zYWZ0ZXIgPSBkaWZmZXJlbmNlX3R5cGUoX19sZW5ndGgpIC0gX19lbGVtc2JlZm9yZTsKKyAgICAgIF9fcG9zID0gdGhpcy0+X01fZmluaXNoIC0gX19lbGVtc2FmdGVyOworICAgICAgX1NUTFBfVFJZIHsKKyAgICAgICAgaXRlcmF0b3IgX19kc3QgPSBfX25ld19maW5pc2g7CisgICAgICAgIGl0ZXJhdG9yIF9fc3JjID0gdGhpcy0+X01fZmluaXNoOworICAgICAgICBmb3IgKC0tX19zcmMsIC0tX19kc3Q7IF9fc3JjID49IF9fcG9zOyAtLV9fc3JjLCAtLV9fZHN0KSB7CisgICAgICAgICAgX1NUTFBfU1REOjpfTW92ZV9Db25zdHJ1Y3QoJigqX19kc3QpLCAqX19zcmMpOworICAgICAgICAgIF9TVExQX1NURDo6X0Rlc3Ryb3lfTW92ZWQoJigqX19zcmMpKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLT5fTV9maW5pc2ggPSBfX25ld19maW5pc2g7CisgICAgICAgIHVuaW5pdGlhbGl6ZWRfY29weShfX2ZpcnN0LCBfX2xhc3QsIF9fcG9zKTsKKyAgICAgIH0KKyAgICAgIF9TVExQX1VOV0lORCh0aGlzLT5fTV9kZXN0cm95X25vZGVzKHRoaXMtPl9NX2ZpbmlzaC5fTV9ub2RlICsgMSwgX19uZXdfZmluaXNoLl9NX25vZGUgKyAxKSkKKyAgICB9CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KKyAgdm9pZCBfTV9pbnNlcnRfcmFuZ2VfYXV4KGl0ZXJhdG9yIF9fcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX24sIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypfTW92YWJsZSovKSB7CisgICAgY29uc3QgZGlmZmVyZW5jZV90eXBlIF9fZWxlbXNiZWZvcmUgPSBfX3BvcyAtIHRoaXMtPl9NX3N0YXJ0OworICAgIHNpemVfdHlwZSBfX2xlbmd0aCA9IHNpemUoKTsKKyAgICBpZiAoX19lbGVtc2JlZm9yZSA8PSBkaWZmZXJlbmNlX3R5cGUoX19sZW5ndGggLyAyKSkgeworICAgICAgaXRlcmF0b3IgX19uZXdfc3RhcnQgPSBfTV9yZXNlcnZlX2VsZW1lbnRzX2F0X2Zyb250KF9fbik7CisgICAgICBpdGVyYXRvciBfX29sZF9zdGFydCA9IHRoaXMtPl9NX3N0YXJ0OworICAgICAgX19wb3MgPSB0aGlzLT5fTV9zdGFydCArIF9fZWxlbXNiZWZvcmU7CisgICAgICBfU1RMUF9UUlkgeworICAgICAgICBpZiAoX19lbGVtc2JlZm9yZSA+PSBkaWZmZXJlbmNlX3R5cGUoX19uKSkgeworICAgICAgICAgIGl0ZXJhdG9yIF9fc3RhcnRfbiA9IHRoaXMtPl9NX3N0YXJ0ICsgZGlmZmVyZW5jZV90eXBlKF9fbik7CisgICAgICAgICAgX1NUTFBfU1REOjp1bmluaXRpYWxpemVkX2NvcHkodGhpcy0+X01fc3RhcnQsIF9fc3RhcnRfbiwgX19uZXdfc3RhcnQpOworICAgICAgICAgIHRoaXMtPl9NX3N0YXJ0ID0gX19uZXdfc3RhcnQ7CisgICAgICAgICAgX1NUTFBfU1REOjpjb3B5KF9fc3RhcnRfbiwgX19wb3MsIF9fb2xkX3N0YXJ0KTsKKyAgICAgICAgICBfU1RMUF9TVEQ6OmNvcHkoX19maXJzdCwgX19sYXN0LCBfX3BvcyAtIGRpZmZlcmVuY2VfdHlwZShfX24pKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbWlkID0gX19maXJzdDsKKyAgICAgICAgICBfU1RMUF9TVEQ6OmFkdmFuY2UoX19taWQsIGRpZmZlcmVuY2VfdHlwZShfX24pIC0gX19lbGVtc2JlZm9yZSk7CisgICAgICAgICAgX1NUTFBfUFJJViBfX3VuaW5pdGlhbGl6ZWRfY29weV9jb3B5KHRoaXMtPl9NX3N0YXJ0LCBfX3BvcywgX19maXJzdCwgX19taWQsIF9fbmV3X3N0YXJ0KTsKKyAgICAgICAgICB0aGlzLT5fTV9zdGFydCA9IF9fbmV3X3N0YXJ0OworICAgICAgICAgIF9TVExQX1NURDo6Y29weShfX21pZCwgX19sYXN0LCBfX29sZF9zdGFydCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIF9TVExQX1VOV0lORCh0aGlzLT5fTV9kZXN0cm95X25vZGVzKF9fbmV3X3N0YXJ0Ll9NX25vZGUsIHRoaXMtPl9NX3N0YXJ0Ll9NX25vZGUpKQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGl0ZXJhdG9yIF9fbmV3X2ZpbmlzaCA9IF9NX3Jlc2VydmVfZWxlbWVudHNfYXRfYmFjayhfX24pOworICAgICAgaXRlcmF0b3IgX19vbGRfZmluaXNoID0gdGhpcy0+X01fZmluaXNoOworICAgICAgY29uc3QgZGlmZmVyZW5jZV90eXBlIF9fZWxlbXNhZnRlciA9IGRpZmZlcmVuY2VfdHlwZShfX2xlbmd0aCkgLSBfX2VsZW1zYmVmb3JlOworICAgICAgX19wb3MgPSB0aGlzLT5fTV9maW5pc2ggLSBfX2VsZW1zYWZ0ZXI7CisgICAgICBfU1RMUF9UUlkgeworICAgICAgICBpZiAoX19lbGVtc2FmdGVyID4gZGlmZmVyZW5jZV90eXBlKF9fbikpIHsKKyAgICAgICAgICBpdGVyYXRvciBfX2ZpbmlzaF9uID0gdGhpcy0+X01fZmluaXNoIC0gZGlmZmVyZW5jZV90eXBlKF9fbik7CisgICAgICAgICAgX1NUTFBfU1REOjp1bmluaXRpYWxpemVkX2NvcHkoX19maW5pc2hfbiwgdGhpcy0+X01fZmluaXNoLCB0aGlzLT5fTV9maW5pc2gpOworICAgICAgICAgIHRoaXMtPl9NX2ZpbmlzaCA9IF9fbmV3X2ZpbmlzaDsKKyAgICAgICAgICBfU1RMUF9TVEQ6OmNvcHlfYmFja3dhcmQoX19wb3MsIF9fZmluaXNoX24sIF9fb2xkX2ZpbmlzaCk7CisgICAgICAgICAgX1NUTFBfU1REOjpjb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19wb3MpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19taWQgPSBfX2ZpcnN0OworICAgICAgICAgIF9TVExQX1NURDo6YWR2YW5jZShfX21pZCwgX19lbGVtc2FmdGVyKTsKKyAgICAgICAgICBfU1RMUF9QUklWIF9fdW5pbml0aWFsaXplZF9jb3B5X2NvcHkoX19taWQsIF9fbGFzdCwgX19wb3MsIHRoaXMtPl9NX2ZpbmlzaCwgdGhpcy0+X01fZmluaXNoKTsKKyAgICAgICAgICB0aGlzLT5fTV9maW5pc2ggPSBfX25ld19maW5pc2g7CisgICAgICAgICAgX1NUTFBfU1REOjpjb3B5KF9fZmlyc3QsIF9fbWlkLCBfX3Bvcyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIF9TVExQX1VOV0lORCh0aGlzLT5fTV9kZXN0cm95X25vZGVzKHRoaXMtPl9NX2ZpbmlzaC5fTV9ub2RlICsgMSwgX19uZXdfZmluaXNoLl9NX25vZGUgKyAxKSkKKyAgICB9CisgIH0KKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisKKyAgaXRlcmF0b3IgX01fcmVzZXJ2ZV9lbGVtZW50c19hdF9mcm9udChzaXplX3R5cGUgX19uKSB7CisgICAgc2l6ZV90eXBlIF9fdmFjYW5jaWVzID0gdGhpcy0+X01fc3RhcnQuX01fY3VyIC0gdGhpcy0+X01fc3RhcnQuX01fZmlyc3Q7CisgICAgaWYgKF9fbiA+IF9fdmFjYW5jaWVzKQorICAgICAgX01fbmV3X2VsZW1lbnRzX2F0X2Zyb250KF9fbiAtIF9fdmFjYW5jaWVzKTsKKyAgICByZXR1cm4gdGhpcy0+X01fc3RhcnQgLSBkaWZmZXJlbmNlX3R5cGUoX19uKTsKKyAgfQorCisgIGl0ZXJhdG9yIF9NX3Jlc2VydmVfZWxlbWVudHNfYXRfYmFjayhzaXplX3R5cGUgX19uKSB7CisgICAgc2l6ZV90eXBlIF9fdmFjYW5jaWVzID0gKHRoaXMtPl9NX2ZpbmlzaC5fTV9sYXN0IC0gdGhpcy0+X01fZmluaXNoLl9NX2N1cikgLSAxOworICAgIGlmIChfX24gPiBfX3ZhY2FuY2llcykKKyAgICAgIF9NX25ld19lbGVtZW50c19hdF9iYWNrKF9fbiAtIF9fdmFjYW5jaWVzKTsKKyAgICByZXR1cm4gdGhpcy0+X01fZmluaXNoICsgZGlmZmVyZW5jZV90eXBlKF9fbik7CisgIH0KKworICB2b2lkIF9NX25ld19lbGVtZW50c19hdF9mcm9udChzaXplX3R5cGUgX19uZXdfZWxlbWVudHMpOworICB2b2lkIF9NX25ld19lbGVtZW50c19hdF9iYWNrKHNpemVfdHlwZSBfX25ld19lbGVtZW50cyk7CisKK3Byb3RlY3RlZDogICAgICAgICAgICAgICAgICAgICAgLy8gQWxsb2NhdGlvbiBvZiBfTV9tYXAgYW5kIG5vZGVzCisKKyAgLy8gTWFrZXMgc3VyZSB0aGUgX01fbWFwIGhhcyBzcGFjZSBmb3IgbmV3IG5vZGVzLiAgRG9lcyBub3QgYWN0dWFsbHkKKyAgLy8gIGFkZCB0aGUgbm9kZXMuICBDYW4gaW52YWxpZGF0ZSBfTV9tYXAgcG9pbnRlcnMuICAoQW5kIGNvbnNlcXVlbnRseSwKKyAgLy8gIGRlcXVlIGl0ZXJhdG9ycy4pCisKKyAgdm9pZCBfTV9yZXNlcnZlX21hcF9hdF9iYWNrIChzaXplX3R5cGUgX19ub2Rlc190b19hZGQgPSAxKSB7CisgICAgaWYgKF9fbm9kZXNfdG9fYWRkICsgMSA+IHRoaXMtPl9NX21hcF9zaXplLl9NX2RhdGEgLSAodGhpcy0+X01fZmluaXNoLl9NX25vZGUgLSB0aGlzLT5fTV9tYXAuX01fZGF0YSkpCisgICAgICBfTV9yZWFsbG9jYXRlX21hcChfX25vZGVzX3RvX2FkZCwgZmFsc2UpOworICB9CisKKyAgdm9pZCBfTV9yZXNlcnZlX21hcF9hdF9mcm9udCAoc2l6ZV90eXBlIF9fbm9kZXNfdG9fYWRkID0gMSkgeworICAgIGlmIChfX25vZGVzX3RvX2FkZCA+IHNpemVfdHlwZSh0aGlzLT5fTV9zdGFydC5fTV9ub2RlIC0gdGhpcy0+X01fbWFwLl9NX2RhdGEpKQorICAgICAgX01fcmVhbGxvY2F0ZV9tYXAoX19ub2Rlc190b19hZGQsIHRydWUpOworICB9CisKKyAgdm9pZCBfTV9yZWFsbG9jYXRlX21hcChzaXplX3R5cGUgX19ub2Rlc190b19hZGQsIGJvb2wgX19hZGRfYXRfZnJvbnQpOworfTsKKworI2lmIGRlZmluZWQgKGRlcXVlKQorIyAgdW5kZWYgZGVxdWUKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorI2VuZGlmCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2lmICFkZWZpbmVkIChfU1RMUF9MSU5LX1RJTUVfSU5TVEFOVElBVElPTikKKyMgIGluY2x1ZGUgPHN0bC9fZGVxdWUuYz4KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BUUl9TUEVDSUFMSVpBVElPTlMpCisjICBpbmNsdWRlIDxzdGwvcG9pbnRlcnMvX2RlcXVlLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHKQorIyAgaW5jbHVkZSA8c3RsL2RlYnVnL19kZXF1ZS5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisjZGVmaW5lIF9TVExQX1RFTVBMQVRFX0NPTlRBSU5FUiBkZXF1ZTxfVHAsIF9BbGxvYz4KKyNkZWZpbmUgX1NUTFBfVEVNUExBVEVfSEVBREVSICAgIHRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KKyNpbmNsdWRlIDxzdGwvX3JlbG9wc19jb250Lmg+CisjdW5kZWYgX1NUTFBfVEVNUExBVEVfQ09OVEFJTkVSCisjdW5kZWYgX1NUTFBfVEVNUExBVEVfSEVBREVSCisKKyNpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK3N0cnVjdCBfX21vdmVfdHJhaXRzPGRlcXVlPF9UcCwgX0FsbG9jPiA+IHsKKyAgdHlwZWRlZiBfX3RydWVfdHlwZSBpbXBsZW1lbnRlZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX21vdmVfdHJhaXRzPF9BbGxvYz46OmNvbXBsZXRlIGNvbXBsZXRlOworfTsKKyNlbmRpZgorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9ERVFVRV9IICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CisKZGlmZiAtLWdpdCBhL3N0bC9fZXBpbG9nLmggYi9zdGxwb3J0L3N0bC9fZXBpbG9nLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHN0bC9fZXBpbG9nLmgKcmVuYW1lIHRvIHN0bHBvcnQvc3RsL19lcGlsb2cuaApkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdGwvX2V4Y2VwdGlvbi5oIGIvc3RscG9ydC9zdGwvX2V4Y2VwdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwYmY0YWQKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9fZXhjZXB0aW9uLmgKQEAgLTAsMCArMSwxOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqLworCisvLyBUaGUgaGVhZGVyIDxleGNlcHRpb24+IGNvbnRhaW5zIGxvdy1sZXZlbCBmdW5jdGlvbnMgdGhhdCBpbnRlcmFjdAorLy8gd2l0aCBhIGNvbXBpbGVyJ3MgZXhjZXB0aW9uLWhhbmRsaW5nIG1lY2hhbmlzbS4gIEl0IGlzIGFzc3VtZWQgdG8KKy8vIGJlIHN1cHBsaWVkIHdpdGggdGhlIGNvbXBpbGVyLCByYXRoZXIgdGhhbiB3aXRoIHRoZSBsaWJyYXJ5LCBiZWNhdXNlCisvLyBpdCBpcyBpbmhlcmVudGx5IHRpZWQgdmVyeSBjbG9zZWx5IHRvIHRoZSBjb21waWxlciBpdHNlbGYuCisKKy8vIE9uIHBsYXRmb3JtcyB3aGVyZSA8ZXhjZXB0aW9uPiBkb2VzIG5vdCBleGlzdCwgdGhpcyBoZWFkZXIgZGVmaW5lcworLy8gYW4gZXhjZXB0aW9uIGJhc2UgY2xhc3MuICBUaGlzIGlzICpub3QqIGEgc3Vic3RpdHV0ZSBmb3IgZXZlcnl0aGluZworLy8gaW4gPGV4Y2VwdGlvbj4sIGJ1dCBpdCBzdWZmaWNlcyB0byBzdXBwb3J0IGEgYmFyZSBtaW5pbXVtIG9mIFNUTAorLy8gZnVuY3Rpb25hbGl0eS4KKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9FWENFUFRJT04KKyNkZWZpbmUgX1NUTFBfSU5URVJOQUxfRVhDRVBUSU9OCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhDRVBUSU9OX0hFQURFUikKKworIyAgaWYgZGVmaW5lZCAoIF9VTkNBVUdIVF9FWENFUFRJT04gKQorIyAgICB1bmRlZiBfU1RMUF9OT19VTkNBVUdIVF9FWENFUFRfU1VQUE9SVAorIyAgZW5kaWYKKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfQlJPS0VOX0VYQ0VQVElPTl9DTEFTUykKKyMgICAgZGVmaW5lIGV4Y2VwdGlvbiAgICAgX1NUTFBfTlVMTElGSUVEX0JST0tFTl9FWENFUFRJT05fQ0xBU1MKKyMgICAgZGVmaW5lIGJhZF9leGNlcHRpb24gX1NUTFBfTlVMTElGSUVEX0JST0tFTl9CQURfRVhDRVBUSU9OX0NMQVNTCisjICAgIGlmIGRlZmluZWQgKF9TVExQX05PX05FV19ORVdfSEVBREVSKQorIyAgICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9SVU5USU1FX0hFQURFUihFeGNlcHRpb24uaCkKKyMgICAgZWxzZQorIyAgICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9SVU5USU1FX0hFQURFUihFeGNlcHRpb24pCisjICAgIGVuZGlmCisjICAgIHVuZGVmIGV4Y2VwdGlvbgorIyAgICB1bmRlZiBiYWRfZXhjZXB0aW9uCisjICBlbHNlCisjICAgIGlmIGRlZmluZWQgKF9TVExQX05PX05FV19ORVdfSEVBREVSKQorIyAgICAgIGlmIGRlZmluZWQgKF9TVExQX0hBU19JTkNMVURFX05FWFQpCisjICAgICAgICBpbmNsdWRlX25leHQgPGV4Y2VwdGlvbi5oPgorIyAgICAgIGVsc2UKKyMgICAgICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9SVU5USU1FX0hFQURFUihleGNlcHRpb24uaCkKKyMgICAgICBlbmRpZgorIyAgICBlbHNlCisjICAgICAgaWYgZGVmaW5lZCAoX1NUTFBfSEFTX0lOQ0xVREVfTkVYVCkKKyMgICAgICAgIGluY2x1ZGVfbmV4dCA8ZXhjZXB0aW9uPgorIyAgICAgIGVsc2UKKyMgICAgICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9SVU5USU1FX0hFQURFUihleGNlcHRpb24pCisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisKKyMgIGlmIGRlZmluZWQgKF9TVExQX0hBU19TUEVDSUZJQ19QUk9MT0dfRVBJTE9HKSAmJiBkZWZpbmVkIChfU1RMUF9NU1ZDX0xJQikgJiYgKF9TVExQX01TVkNfTElCIDwgMTMwMCkKKy8vIGR3YSAwMi8wNC8wMAorLy8gVGhlIGhlYWRlciA8eXZhbHMuaD4gd2hpY2ggc2hpcHMgd2l0aCB2YzYgYW5kIGlzIGluY2x1ZGVkIGJ5IGl0cyBuYXRpdmUgPGV4Y2VwdGlvbj4KKy8vIGFjdHVhbGx5IHR1cm5zIG9uIHdhcm5pbmdzLCBzbyB3ZSBoYXZlIHRvIHR1cm4gdGhlbSBiYWNrIG9mZi4KKyMgICAgaW5jbHVkZSA8c3RsL2NvbmZpZy9fd2FybmluZ3Nfb2ZmLmg+CisjICBlbmRpZgorCisjICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfT1dOX05BTUVTUEFDRSkKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisjICAgIGlmICFkZWZpbmVkIChfU1RMUF9CUk9LRU5fRVhDRVBUSU9OX0NMQVNTKQorIyAgICAgIGlmICFkZWZpbmVkIChfU1RMUF9VU0lOR19QTEFURk9STV9TREtfQ09NUElMRVIpIHx8ICFkZWZpbmVkIChfV0lONjQpCit1c2luZyBfU1RMUF9WRU5ET1JfRVhDRVBUX1NURDo6ZXhjZXB0aW9uOworIyAgICAgIGVsc2UKK3VzaW5nIDo6ZXhjZXB0aW9uOworIyAgICAgIGVuZGlmCit1c2luZyBfU1RMUF9WRU5ET1JfRVhDRVBUX1NURDo6YmFkX2V4Y2VwdGlvbjsKKyMgICAgZW5kaWYKKworIyAgICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fVVNJTkdfRk9SX0dMT0JBTF9GVU5DVElPTlMpCisvLyBmYnAgOiBtYW55IHBsYXRmb3JtcyBwcmVzZW50IHN0cmFuZ2UgbWl4IG9mCisvLyB0aG9zZSBpbiB2YXJpb3VzIG5hbWVzcGFjZXMKKyMgICAgICBpZiAhZGVmaW5lZCAoX1NUTFBfVkVORE9SX1VORVhQRUNURURfU1REKQorIyAgICAgICAgZGVmaW5lIF9TVExQX1ZFTkRPUl9VTkVYUEVDVEVEX1NURCBfU1RMUF9WRU5ET1JfRVhDRVBUX1NURAorIyAgICAgIGVsc2UKKy8qIFRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgYXJlIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGFzIF9TVExQX1ZFTkRPUl9URVJNSU5BVEVfU1RECisgKiBhbmQgX1NUTFBfVkVORE9SX1VOQ0FVR0hUX0VYQ0VQVElPTl9TVEQgaGFzIGJlZW4gaW50cm9kdWNlIGFmdGVyIF9TVExQX1ZFTkRPUl9VTkVYUEVDVEVEX1NURAorICogYW5kIF9TVExQX1ZFTkRPUl9VTkVYUEVDVEVEX1NURCB3YXMgdGhlIG1hY3JvIHVzZWQgaW4gdGhlaXIgcGxhY2UgYmVmb3JlIHRoYXQgaW50cm9kdWN0aW9uLgorICovCisjICAgICAgICBpZiAhZGVmaW5lZCAoX1NUTFBfVkVORE9SX1RFUk1JTkFURV9TVEQpCisjICAgICAgICAgIGRlZmluZSBfU1RMUF9WRU5ET1JfVEVSTUlOQVRFX1NURCBfU1RMUF9WRU5ET1JfVU5FWFBFQ1RFRF9TVEQKKyMgICAgICAgIGVuZGlmCisjICAgICAgICBpZiAhZGVmaW5lZCAoX1NUTFBfVkVORE9SX1VOQ0FVR0hUX0VYQ0VQVElPTl9TVEQpCisjICAgICAgICAgIGRlZmluZSBfU1RMUF9WRU5ET1JfVU5DQVVHSFRfRVhDRVBUSU9OX1NURCBfU1RMUF9WRU5ET1JfVU5FWFBFQ1RFRF9TVEQKKyMgICAgICAgIGVuZGlmCisjICAgICAgZW5kaWYKKyMgICAgICBpZiAhZGVmaW5lZCAoX1NUTFBfVkVORE9SX1RFUk1JTkFURV9TVEQpCisjICAgICAgICBkZWZpbmUgX1NUTFBfVkVORE9SX1RFUk1JTkFURV9TVEQgX1NUTFBfVkVORE9SX0VYQ0VQVF9TVEQKKyMgICAgICBlbmRpZgorIyAgICAgIGlmICFkZWZpbmVkIChfU1RMUF9WRU5ET1JfVU5DQVVHSFRfRVhDRVBUSU9OX1NURCkKKyMgICAgICAgIGRlZmluZSBfU1RMUF9WRU5ET1JfVU5DQVVHSFRfRVhDRVBUSU9OX1NURCBfU1RMUF9WRU5ET1JfRVhDRVBUX1NURAorIyAgICAgIGVuZGlmCisjICAgICAgaWYgIWRlZmluZWQgKF9TVExQX1ZFTkRPUl9URVJNSU5BVEVfU1REKQorIyAgICAgICAgZGVmaW5lIF9TVExQX1ZFTkRPUl9URVJNSU5BVEVfU1REIF9TVExQX1ZFTkRPUl9FWENFUFRfU1RECisjICAgICAgZW5kaWYKKyMgICAgICBpZiAhZGVmaW5lZCAoX1NUTFBfVkVORE9SX1VOQ0FVR0hUX0VYQ0VQVElPTl9TVEQpCisjICAgICAgICBkZWZpbmUgX1NUTFBfVkVORE9SX1VOQ0FVR0hUX0VYQ0VQVElPTl9TVEQgX1NUTFBfVkVORE9SX0VYQ0VQVF9TVEQKKyMgICAgICBlbmRpZgorLy8gd2VpcmQgZXJyb3JzCisjICAgICAgICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fVU5FWFBFQ1RFRF9FWENFUFRfU1VQUE9SVCkKKyMgICAgICAgICAgaWYgZGVmaW5lZCAoX19JQ0wpICYmIChfX0lDTCA+PSA5MDApICYmIChfU1RMUF9NU1ZDX0xJQiA8IDEzMDApCisvL1NlZSBjb25maWcvX2ludGVsLmggZm9yIHJlYXNvbiBhYm91dCB0aGlzIHdvcmthcm91bmQKK3VzaW5nIHN0ZDo6dW5leHBlY3RlZDsKKyMgICAgICAgICAgZWxzZQordXNpbmcgX1NUTFBfVkVORE9SX1VORVhQRUNURURfU1REOjp1bmV4cGVjdGVkOworIyAgICAgICAgICBlbmRpZgordXNpbmcgX1NUTFBfVkVORE9SX1VORVhQRUNURURfU1REOjp1bmV4cGVjdGVkX2hhbmRsZXI7Cit1c2luZyBfU1RMUF9WRU5ET1JfVU5FWFBFQ1RFRF9TVEQ6OnNldF91bmV4cGVjdGVkOworIyAgICAgICAgZW5kaWYKK3VzaW5nIF9TVExQX1ZFTkRPUl9URVJNSU5BVEVfU1REOjp0ZXJtaW5hdGU7Cit1c2luZyBfU1RMUF9WRU5ET1JfVEVSTUlOQVRFX1NURDo6dGVybWluYXRlX2hhbmRsZXI7Cit1c2luZyBfU1RMUF9WRU5ET1JfVEVSTUlOQVRFX1NURDo6c2V0X3Rlcm1pbmF0ZTsKKworIyAgICAgIGlmICFkZWZpbmVkIChfU1RMUF9OT19VTkNBVUdIVF9FWENFUFRfU1VQUE9SVCkKK3VzaW5nIF9TVExQX1ZFTkRPUl9VTkNBVUdIVF9FWENFUFRJT05fU1REOjp1bmNhdWdodF9leGNlcHRpb247CisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYgLyogIV9TVExQX05PX1VTSU5HX0ZPUl9HTE9CQUxfRlVOQ1RJT05TICovCitfU1RMUF9FTkRfTkFNRVNQQUNFCisjICBlbmRpZiAvKiBfU1RMUF9PV05fTkFNRVNQQUNFICovCisjZWxzZSAvKiBfU1RMUF9OT19FWENFUFRJT05fSEVBREVSICovCisKKy8qIGZicCA6IGFic2VuY2Ugb2YgPGV4Y2VwdGlvbj4gdXN1YWxseSBtZWFucyB0aGF0IHRob3NlCisgKiBmdW5jdGlvbnMgYXJlIG5vdCBnb2luZyB0byBiZSBjYWxsZWQgYnkgY29tcGlsZXIuCisgKiBTdGlsbCwgZGVmaW5lIHRoZW0gZm9yIHRoZSB1c2VyLgorICogZHVtczogUG9saWN5IG1vZGlmaWNhdGlvbiwgaWYgdGhlIGZ1bmN0aW9uIGRvIG5vdCBiZWhhdmUgbGlrZSB0aGUgU3RhbmRhcmQKKyAqICAgICAgIGRlZmluZWQgaXQgd2UgZG8gbm90IGdyYW50IGl0IGluIHRoZSBTVExwb3J0IG5hbWVzcGFjZS4gV2Ugd2lsbCBoYXZlCisgKiAgICAgICBjb21waWxlIHRpbWUgZXJyb3IgcmF0aGVyIHRoYW4gcnVudGltZSBlcnJvci4KKyAqLworI2lmIDAKKy8qCit0eXBlZGVmIHZvaWQgKCp1bmV4cGVjdGVkX2hhbmRsZXIpKCk7Cit1bmV4cGVjdGVkX2hhbmRsZXIgc2V0X3VuZXhwZWN0ZWQodW5leHBlY3RlZF9oYW5kbGVyIGYpIF9TVExQX05PVEhST1dfSU5IRVJFTlRMWTsKK3ZvaWQgdW5leHBlY3RlZCgpOworCit0eXBlZGVmIHZvaWQgKCp0ZXJtaW5hdGVfaGFuZGxlcikoKTsKK3Rlcm1pbmF0ZV9oYW5kbGVyIHNldF90ZXJtaW5hdGUodGVybWluYXRlX2hhbmRsZXIgZikgX1NUTFBfTk9USFJPV19JTkhFUkVOVExZOwordm9pZCB0ZXJtaW5hdGUoKTsKKworYm9vbCB1bmNhdWdodF9leGNlcHRpb24oKTsgLy8gbm90IGltcGxlbWVudGVkIHVuZGVyIG1wdyBhcyBvZiBKYW4vMTk5OQorKi8KKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfTk9fRVhDRVBUSU9OX0hFQURFUiAqLworCisjaWYgZGVmaW5lZCAoX1NUTFBfTk9fRVhDRVBUSU9OX0hFQURFUikgfHwgZGVmaW5lZCAoX1NUTFBfQlJPS0VOX0VYQ0VQVElPTl9DTEFTUykKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisvLyBzZWN0aW9uIDE4LjYuMQorY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgZXhjZXB0aW9uIHsKK3B1YmxpYzoKKyMgIGlmbmRlZiBfU1RMUF9VU0VfTk9fSU9TVFJFQU1TCisgIGV4Y2VwdGlvbigpIF9TVExQX05PVEhST1c7CisgIHZpcnR1YWwgfmV4Y2VwdGlvbigpIF9TVExQX05PVEhST1c7CisgIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IF9TVExQX05PVEhST1c7CisjICBlbHNlCisgIGV4Y2VwdGlvbigpIF9TVExQX05PVEhST1cge30KKyAgdmlydHVhbCB+ZXhjZXB0aW9uKCkgX1NUTFBfTk9USFJPVyB7fQorICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHdoYXQoKSBjb25zdCBfU1RMUF9OT1RIUk9XIHtyZXR1cm4gImNsYXNzIGV4Y2VwdGlvbiI7fQorIyAgZW5kaWYKK307CisKKy8vIHNlY3Rpb24gMTguNi4yLjEKK2NsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIGJhZF9leGNlcHRpb24gOiBwdWJsaWMgZXhjZXB0aW9uIHsKK3B1YmxpYzoKKyMgIGlmbmRlZiBfU1RMUF9VU0VfTk9fSU9TVFJFQU1TCisgIGJhZF9leGNlcHRpb24oKSBfU1RMUF9OT1RIUk9XOworICB+YmFkX2V4Y2VwdGlvbigpIF9TVExQX05PVEhST1c7CisgIGNvbnN0IGNoYXIqIHdoYXQoKSBjb25zdCBfU1RMUF9OT1RIUk9XOworIyAgZWxzZQorICBiYWRfZXhjZXB0aW9uKCkgX1NUTFBfTk9USFJPVyB7fQorICB+YmFkX2V4Y2VwdGlvbigpIF9TVExQX05PVEhST1cge30KKyAgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IF9TVExQX05PVEhST1cge3JldHVybiAiY2xhc3MgYmFkX2V4Y2VwdGlvbiI7fQorIyAgZW5kaWYKK307CisKKy8vIGZvcndhcmQgZGVjbGFyYXRpb24KK2NsYXNzIF9fTmFtZWRfZXhjZXB0aW9uOworX1NUTFBfRU5EX05BTUVTUEFDRQorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9FWENFUFRJT04gKi8KZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL19mYWNldHNfZndkLmggYi9zdGxwb3J0L3N0bC9fZmFjZXRzX2Z3ZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0Yzg0NTEKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9fZmFjZXRzX2Z3ZC5oCkBAIC0wLDAgKzEsNTMgQEAKKyNpZm5kZWYgX1NUTFBfRkFDRVRTX0ZXRF9ICisjZGVmaW5lIF9TVExQX0ZBQ0VUU19GV0RfSAorCisKKyNpbmNsdWRlIDxzdGwvX2lvc2Z3ZC5oPgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworI2lmIGRlZmluZWQgKF9TVExQX0xJTUlURURfREVGQVVMVF9URU1QTEFURVMpCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfSW5wdXRJdGVyPgorI2Vsc2UKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9JbnB1dEl0ZXIgPSBpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVCwgY2hhcl90cmFpdHM8X0NoYXJUPiA+ID4KKyNlbmRpZgorY2xhc3MgbW9uZXlfZ2V0OworCisjaWYgZGVmaW5lZCAoX1NUTFBfTElNSVRFRF9ERUZBVUxUX1RFTVBMQVRFUykKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9PdXRwdXRJdGVyPgorI2Vsc2UKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9PdXRwdXRJdGVyID0gb3N0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQsIGNoYXJfdHJhaXRzPF9DaGFyVD4gPiA+CisjZW5kaWYKK2NsYXNzIG1vbmV5X3B1dDsKKworI2lmIGRlZmluZWQgKF9TVExQX0xJTUlURURfREVGQVVMVF9URU1QTEFURVMpCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfSW5wdXRJdGVyPgorI2Vsc2UKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9JbnB1dEl0ZXIgPSBpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVCwgY2hhcl90cmFpdHM8X0NoYXJUPiA+ID4KKyNlbmRpZgorY2xhc3MgbnVtX2dldDsKKworI2lmIGRlZmluZWQgKF9TVExQX0xJTUlURURfREVGQVVMVF9URU1QTEFURVMpCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfT3V0cHV0SXRlcj4KKyNlbHNlCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfT3V0cHV0SXRlciA9IG9zdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJULCBjaGFyX3RyYWl0czxfQ2hhclQ+ID4gPgorI2VuZGlmCitjbGFzcyBudW1fcHV0OworCisjaWYgZGVmaW5lZCAoX1NUTFBfTElNSVRFRF9ERUZBVUxUX1RFTVBMQVRFUykKK3RlbXBsYXRlIDxjbGFzcyBfQ2gsIGNsYXNzIF9Jbkl0PgorI2Vsc2UKK3RlbXBsYXRlIDxjbGFzcyBfQ2gsIGNsYXNzIF9Jbkl0ID0gaXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2gsIGNoYXJfdHJhaXRzPF9DaD4gPiA+CisjZW5kaWYKK2NsYXNzIHRpbWVfZ2V0OworCisjaWYgZGVmaW5lZCAoX1NUTFBfTElNSVRFRF9ERUZBVUxUX1RFTVBMQVRFUykKK3RlbXBsYXRlIDxjbGFzcyBfQ2gsIGNsYXNzIF9PdXRJdD4KKyNlbHNlCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoLCBjbGFzcyBfT3V0SXQgPSBvc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaCwgY2hhcl90cmFpdHM8X0NoPiA+ID4KKyNlbmRpZgorY2xhc3MgdGltZV9wdXQ7CisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9fZnN0cmVhbS5jIGIvc3RscG9ydC9zdGwvX2ZzdHJlYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTU0OGFlCi0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvX2ZzdHJlYW0uYwpAQCAtMCwwICsxLDc2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworI2lmbmRlZiBfU1RMUF9GU1RSRUFNX0MKKyNkZWZpbmUgX1NUTFBfRlNUUkVBTV9DCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfRlNUUkVBTV9ICisjICBpbmNsdWRlIDxzdGwvX2ZzdHJlYW0uaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0xJTUlUUworIyAgaW5jbHVkZSA8c3RsL19saW1pdHMuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworIyBpZiBkZWZpbmVkICggX1NUTFBfTkVTVEVEX1RZUEVfUEFSQU1fQlVHICkKKy8vIG5vIHdjaGFyX3QgaXMgc3VwcG9ydGVkIGZvciB0aGlzIG1vZGUKKyMgZGVmaW5lIF9fQkZfaW50X3R5cGVfXyBpbnQKKyMgZGVmaW5lIF9fQkZfcG9zX3R5cGVfXyBzdHJlYW1wb3MKKyMgZGVmaW5lIF9fQkZfb2ZmX3R5cGVfXyBzdHJlYW1vZmYKKyMgZWxzZQorIyBkZWZpbmUgX19CRl9pbnRfdHlwZV9fIF9TVExQX1RZUEVOQU1FX09OX1JFVFVSTl9UWVBFIGJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6aW50X3R5cGUKKyMgZGVmaW5lIF9fQkZfcG9zX3R5cGVfXyBfU1RMUF9UWVBFTkFNRV9PTl9SRVRVUk5fVFlQRSBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46OnBvc190eXBlCisjIGRlZmluZSBfX0JGX29mZl90eXBlX18gX1NUTFBfVFlQRU5BTUVfT05fUkVUVVJOX1RZUEUgYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjpvZmZfdHlwZQorIyBlbmRpZgorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVibGljIGJhc2ljX2ZpbGVidWY8PiBtZW1iZXIgZnVuY3Rpb25zCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46OmJhc2ljX2ZpbGVidWYoKQorICAgICA6ICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPigpLCBfTV9iYXNlKCksCisgICAgX01fY29uc3RhbnRfd2lkdGgoZmFsc2UpLCBfTV9hbHdheXNfbm9jb252KGZhbHNlKSwKKyAgICBfTV9pbnRfYnVmX2R5bmFtaWMoZmFsc2UpLAorICAgIF9NX2luX2lucHV0X21vZGUoZmFsc2UpLCBfTV9pbl9vdXRwdXRfbW9kZShmYWxzZSksCisgICAgX01faW5fZXJyb3JfbW9kZShmYWxzZSksIF9NX2luX3B1dGJhY2tfbW9kZShmYWxzZSksCisgICAgX01faW50X2J1ZigwKSwgX01faW50X2J1Zl9FT1MoMCksCisgICAgX01fZXh0X2J1ZigwKSwgX01fZXh0X2J1Zl9FT1MoMCksCisgICAgX01fZXh0X2J1Zl9jb252ZXJ0ZWQoMCksIF9NX2V4dF9idWZfZW5kKDApLAorICAgIF9NX3N0YXRlKF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQoX1N0YXRlX3R5cGUpKSwKKyAgICBfTV9lbmRfc3RhdGUoX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRChfU3RhdGVfdHlwZSkpLAorICAgIF9NX21tYXBfYmFzZSgwKSwgX01fbW1hcF9sZW4oMCksCisgICAgX01fc2F2ZWRfZWJhY2soMCksIF9NX3NhdmVkX2dwdHIoMCksIF9NX3NhdmVkX2VncHRyKDApLAorICAgIF9NX2NvZGVjdnQoMCksCisgICAgX01fd2lkdGgoMSksIF9NX21heF93aWR0aCgxKQoreworICB0aGlzLT5fTV9zZXR1cF9jb2RlY3Z0KGxvY2FsZSgpLCBmYWxzZSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46On5iYXNpY19maWxlYnVmKCkgeworICB0aGlzLT5jbG9zZSgpOworICBfTV9kZWFsbG9jYXRlX2J1ZmZlcnMoKTsKK30KKworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorX1NUTFBfVFlQRU5BTUVfT05fUkVUVVJOX1RZUEUgYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjppbnRfdHlwZQorYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+Ojp1bmRlcmZsb3coKSB7CisgIHJldHVybiBfVW5kZXJmbG93PF9DaGFyVCwgX1RyYWl0cz46Ol9NX2RvaXQodGhpcyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz4qCitiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46OmNsb3NlKCkgeworICBib29sIF9fb2sgPSB0aGlzLT5pc19vcGVuKCk7CisKKyAgaWYgKF9NX2luX291dHB1dF9tb2RlKSB7CisgICAgX19vayA9IF9fb2sgJiYgIV9UcmFpdHM6OmVxX2ludF90eXBlKHRoaXMtPm92ZXJmbG93KHRyYWl0c190eXBlOjplb2YoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190eXBlOjplb2YoKSk7CisgICAgX19vayA9PSBfX29rICYmIHRoaXMtPl9NX3Vuc2hpZnQoKTsKKyAgfQorICBlbHNlIGlmIChfTV9pbl9pbnB1dF9tb2RlKQorICAgICAgdGhpcy0+X01fZXhpdF9pbnB1dF9tb2RlKCk7CisKKyAgLy8gTm90ZSBvcmRlciBvZiBhcmd1bWVudHMuICBXZSBjbG9zZSB0aGUgZmlsZSBldmVuIGlmIF9fb2sgaXMgZmFsc2UuCisgIF9fb2sgPSBfTV9iYXNlLl9NX2Nsb3NlKCkgJiYgX19vazsKKworICAvLyBSZXN0b3JlIHRoZSBpbml0aWFsIHN0YXRlLCBleGNlcHQgdGhhdCB3ZSBkb24ndCBkZWFsbG9jYXRlIHRoZSBidWZmZXIKKyAgLy8gb3IgbWVzcyB3aXRoIHRoZSBjYWNoZWQgY29kZWN2dCBpbmZvcm1hdGlvbi4KKyAgX01fc3RhdGUgPSBfTV9lbmRfc3RhdGUgPSBfU3RhdGVfdHlwZSgpOworICBfTV9leHRfYnVmX2NvbnZlcnRlZCA9IF9NX2V4dF9idWZfZW5kID0gMDsKKworICBfTV9tbWFwX2Jhc2UgPSAwOworICBfTV9tbWFwX2xlbiA9IDA7CisKKyAgdGhpcy0+c2V0ZygwLCAwLCAwKTsKKyAgdGhpcy0+c2V0cCgwLCAwKTsKKworICBfTV9zYXZlZF9lYmFjayA9IF9NX3NhdmVkX2dwdHIgPSBfTV9zYXZlZF9lZ3B0ciA9IDA7CisKKyAgX01faW5faW5wdXRfbW9kZSA9IF9NX2luX291dHB1dF9tb2RlID0gX01faW5fZXJyb3JfbW9kZSA9IF9NX2luX3B1dGJhY2tfbW9kZQorICAgID0gZmFsc2U7CisKKyAgcmV0dXJuIF9fb2sgPyB0aGlzIDogMDsKK30KKworLy8gVGhpcyBtZW1iZXIgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW5ldmVyIHdlIGV4aXQgaW5wdXQgbW9kZS4KKy8vIEl0IHVubWFwcyB0aGUgbWVtb3J5LW1hcHBlZCBmaWxlLCBpZiBhbnksIGFuZCBzZXRzCisvLyBfTV9pbl9pbnB1dF9tb2RlIHRvIGZhbHNlLgordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK3ZvaWQgYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjpfTV9leGl0X2lucHV0X21vZGUoKSB7CisgIGlmIChfTV9tbWFwX2Jhc2UgIT0gMCkgeworICAgIF9NX2Jhc2UuX01fdW5tYXAoX01fbW1hcF9iYXNlLCBfTV9tbWFwX2xlbik7CisgICAgX01fbW1hcF9iYXNlID0gMDsKKyAgICBfTV9tbWFwX2xlbiA9IDA7CisgIH0KKyAgX01faW5faW5wdXRfbW9kZSA9IGZhbHNlOworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gYmFzaWNfZmlsZWJ1Zjw+IG92ZXJyaWRkZW4gcHJvdGVjdGVkIHZpcnR1YWwgbWVtYmVyIGZ1bmN0aW9ucworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorc3RyZWFtc2l6ZSBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46OnNob3dtYW55YygpIHsKKyAgLy8gSXMgdGhlcmUgYW55IHBvc3NpYmlsaXR5IHRoYXQgcmVhZHMgY2FuIHN1Y2NlZWQ/CisgIGlmICghdGhpcy0+aXNfb3BlbigpIHx8IF9NX2luX291dHB1dF9tb2RlIHx8IF9NX2luX2Vycm9yX21vZGUpCisgICAgcmV0dXJuIC0xOworICBlbHNlIGlmIChfTV9pbl9wdXRiYWNrX21vZGUpCisgICAgcmV0dXJuIHRoaXMtPmVncHRyKCkgLSB0aGlzLT5ncHRyKCk7CisgIGVsc2UgaWYgKF9NX2NvbnN0YW50X3dpZHRoKSB7CisgICAgc3RyZWFtb2ZmIF9fcG9zICA9IF9NX2Jhc2UuX01fc2VlaygwLCBpb3NfYmFzZTo6Y3VyKTsKKyAgICBzdHJlYW1vZmYgX19zaXplID0gX01fYmFzZS5fTV9maWxlX3NpemUoKTsKKyAgICByZXR1cm4gX19wb3MgPj0gMCAmJiBfX3NpemUgPiBfX3BvcyA/IF9fc2l6ZSAtIF9fcG9zIDogMDsKKyAgfQorICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKKworLy8gTWFrZSBhIHB1dGJhY2sgcG9zaXRpb24gYXZhaWxhYmxlLCBpZiBuZWNlc3NhcnksIGJ5IHN3aXRjaGluZyB0byBhCisvLyBzcGVjaWFsIGludGVybmFsIGJ1ZmZlciB1c2VkIG9ubHkgZm9yIHB1dGJhY2suICBUaGUgYnVmZmVyIGlzCisvLyBbX01fcGJhY2tfYnVmLCBfTV9wYmFja19idWYgKyBfU19wYmFja19idWZfc2l6ZSksIGJ1dCB0aGUgYmFzZQorLy8gY2xhc3Mgb25seSBzZWVzIGEgcGllY2Ugb2YgaXQgYXQgYSB0aW1lLiAgKFdlIHdhbnQgdG8gbWFrZSBzdXJlCisvLyB0aGF0IHdlIGRvbid0IHRyeSB0byByZWFkIGEgY2hhcmFjdGVyIHRoYXQgaGFzbid0IGJlZW4gaW5pdGlhbGl6ZWQuKQorLy8gVGhlIGVuZCBvZiB0aGUgcHV0YmFjayBidWZmZXIgaXMgYWx3YXlzIF9NX3BiYWNrX2J1ZiArIF9TX3BiYWNrX2J1Zl9zaXplLAorLy8gYnV0IHRoZSBiZWdpbm5pbmcgaXMgdXN1YWxseSBub3QgX01fcGJhY2tfYnVmLgordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK19fQkZfaW50X3R5cGVfXworYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjpwYmFja2ZhaWwoaW50X3R5cGUgX19jKSB7CisgIGNvbnN0IGludF90eXBlIF9fZW9mID0gdHJhaXRzX3R5cGU6OmVvZigpOworCisgIC8vIElmIHdlIGFyZW4ndCBhbHJlYWR5IGluIGlucHV0IG1vZGUsIHB1c2hiYWNrIGlzIGltcG9zc2libGUuCisgIGlmICghX01faW5faW5wdXRfbW9kZSkKKyAgICByZXR1cm4gX19lb2Y7CisKKyAgLy8gV2UgY2FuIHVzZSB0aGUgb3JkaW5hcnkgZ2V0IGJ1ZmZlciBpZiB0aGVyZSdzIGVub3VnaCBzcGFjZSwgYW5kCisgIC8vIGlmIGl0J3MgYSBidWZmZXIgdGhhdCB3ZSdyZSBhbGxvd2VkIHRvIHdyaXRlIHRvLgorICBpZiAodGhpcy0+Z3B0cigpICE9IHRoaXMtPmViYWNrKCkgJiYKKyAgICAgICh0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19jLCBfX2VvZikgfHwKKyAgICAgICB0cmFpdHNfdHlwZTo6ZXEodHJhaXRzX3R5cGU6OnRvX2NoYXJfdHlwZShfX2MpLCB0aGlzLT5ncHRyKClbLTFdKSB8fAorICAgICAgICFfTV9tbWFwX2Jhc2UpKSB7CisgICAgdGhpcy0+Z2J1bXAoLTEpOworICAgIGlmICh0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19jLCBfX2VvZikgfHwKKyAgICAgICAgdHJhaXRzX3R5cGU6OmVxKHRyYWl0c190eXBlOjp0b19jaGFyX3R5cGUoX19jKSwgKnRoaXMtPmdwdHIoKSkpCisgICAgICByZXR1cm4gdHJhaXRzX3R5cGU6OnRvX2ludF90eXBlKCp0aGlzLT5ncHRyKCkpOworICB9CisgIGVsc2UgaWYgKCF0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19jLCBfX2VvZikpIHsKKyAgICAvLyBBcmUgd2UgaW4gdGhlIHB1dGJhY2sgYnVmZmVyIGFscmVhZHk/CisgICAgX0NoYXJUKiBfX3BiYWNrX2VuZCA9IF9NX3BiYWNrX2J1ZiArIF9fU1RBVElDX0NBU1QoaW50LF9TX3BiYWNrX2J1Zl9zaXplKTsKKyAgICBpZiAoX01faW5fcHV0YmFja19tb2RlKSB7CisgICAgICAvLyBEbyB3ZSBoYXZlIG1vcmUgcm9vbSBpbiB0aGUgcHV0YmFjayBidWZmZXI/CisgICAgICBpZiAodGhpcy0+ZWJhY2soKSAhPSBfTV9wYmFja19idWYpCisgICAgICAgIHRoaXMtPnNldGcodGhpcy0+ZWdwdHIoKSAtIDEsIHRoaXMtPmVncHRyKCkgLSAxLCBfX3BiYWNrX2VuZCk7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBfX2VvZjsgICAgICAgICAgIC8vIE5vIG1vcmUgcm9vbSBpbiB0aGUgYnVmZmVyLCBzbyBmYWlsLgorICAgIH0KKyAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgLy8gV2UncmUgbm90IHlldCBpbiB0aGUgcHV0YmFjayBidWZmZXIuCisgICAgICBfTV9zYXZlZF9lYmFjayA9IHRoaXMtPmViYWNrKCk7CisgICAgICBfTV9zYXZlZF9ncHRyICA9IHRoaXMtPmdwdHIoKTsKKyAgICAgIF9NX3NhdmVkX2VncHRyID0gdGhpcy0+ZWdwdHIoKTsKKyAgICAgIHRoaXMtPnNldGcoX19wYmFja19lbmQgLSAxLCBfX3BiYWNrX2VuZCAtIDEsIF9fcGJhY2tfZW5kKTsKKyAgICAgIF9NX2luX3B1dGJhY2tfbW9kZSA9IHRydWU7CisgICAgfQorICB9CisgIGVsc2UKKyAgICByZXR1cm4gX19lb2Y7CisKKyAgLy8gV2UgaGF2ZSBtYWRlIGEgcHV0YmFjayBwb3NpdGlvbiBhdmFpbGFibGUuICBBc3NpZ24gdG8gaXQsIGFuZCByZXR1cm4uCisgICp0aGlzLT5ncHRyKCkgPSB0cmFpdHNfdHlwZTo6dG9fY2hhcl90eXBlKF9fYyk7CisgIHJldHVybiBfX2M7Cit9CisKKy8vIFRoaXMgbWVtYmVyIGZ1bmN0aW9uIGZsdXNoZXMgdGhlIHB1dCBhcmVhLCBhbmQgYWxzbyBvdXRwdXRzIHRoZQorLy8gY2hhcmFjdGVyIF9fYyAodW5sZXNzIF9fYyBpcyBlb2YpLiAgSW52YXJpYW50OiB3ZSBhbHdheXMgbGVhdmUgcm9vbQorLy8gaW4gdGhlIGludGVybmFsIGJ1ZmZlciBmb3Igb25lIGNoYXJhY3RlciBtb3JlIHRoYW4gdGhlIGJhc2UgY2xhc3Mga25vd3MKKy8vIGFib3V0LiAgV2Ugc2VlIHRoZSBpbnRlcm5hbCBidWZmZXIgYXMgW19NX2ludF9idWYsIF9NX2ludF9idWZfRU9TKSwgYnV0CisvLyB0aGUgYmFzZSBjbGFzcyBvbmx5IHNlZXMgW19NX2ludF9idWYsIF9NX2ludF9idWZfRU9TIC0gMSkuCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorX19CRl9pbnRfdHlwZV9fCitiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46Om92ZXJmbG93KGludF90eXBlIF9fYykgeworICAvLyBTd2l0Y2ggdG8gb3V0cHV0IG1vZGUsIGlmIG5lY2Vzc2FyeS4KKyAgaWYgKCFfTV9pbl9vdXRwdXRfbW9kZSkKKyAgICBpZiAoIV9NX3N3aXRjaF90b19vdXRwdXRfbW9kZSgpKQorICAgICAgcmV0dXJuIHRyYWl0c190eXBlOjplb2YoKTsKKworICBfQ2hhclQqIF9faWJlZ2luID0gdGhpcy0+X01faW50X2J1ZjsKKyAgX0NoYXJUKiBfX2llbmQgICA9IHRoaXMtPnBwdHIoKTsKKyAgdGhpcy0+c2V0cChfTV9pbnRfYnVmLCBfTV9pbnRfYnVmX0VPUyAtIDEpOworCisgIC8vIFB1dCBfX2MgYXQgdGhlIGVuZCBvZiB0aGUgaW50ZXJuYWwgYnVmZmVyLgorICBpZiAoIXRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX2MsIHRyYWl0c190eXBlOjplb2YoKSkpCisgICAgKl9faWVuZCsrID0gX1RyYWl0czo6dG9fY2hhcl90eXBlKF9fYyk7CisKKyAgLy8gRm9yIHZhcmlhYmxlLXdpZHRoIGVuY29kaW5ncywgb3V0cHV0IG1heSB0YWtlIG1vcmUgdGhhbiBvbmUgcGFzcy4KKyAgd2hpbGUgKF9faWJlZ2luICE9IF9faWVuZCkgeworICAgIGNvbnN0IF9DaGFyVCogX19pbmV4dCA9IF9faWJlZ2luOworICAgIGNoYXIqIF9fZW5leHQgICAgICAgICA9IF9NX2V4dF9idWY7CisgICAgdHlwZW5hbWUgX0NvZGVjdnQ6OnJlc3VsdCBfX3N0YXR1cworICAgICAgPSBfTV9jb2RlY3Z0LT5vdXQoX01fc3RhdGUsIF9faWJlZ2luLCBfX2llbmQsIF9faW5leHQsCisgICAgICAgICAgICAgICAgICAgICAgICBfTV9leHRfYnVmLCBfTV9leHRfYnVmX0VPUywgX19lbmV4dCk7CisgICAgaWYgKF9fc3RhdHVzID09IF9Db2RlY3Z0Ojpub2NvbnYpIHsKKyAgICAgIHJldHVybiBfTm9jb252X291dHB1dDxfVHJhaXRzPjo6X01fZG9pdCh0aGlzLCBfX2liZWdpbiwgX19pZW5kKQorICAgICAgICA/IHRyYWl0c190eXBlOjpub3RfZW9mKF9fYykKKyAgICAgICAgOiBfTV9vdXRwdXRfZXJyb3IoKTsKKyAgICB9CisKKyAgICAvLyBGb3IgYSBjb25zdGFudC13aWR0aCBlbmNvZGluZyB3ZSBrbm93IHRoYXQgdGhlIGV4dGVybmFsIGJ1ZmZlcgorICAgIC8vIGlzIGxhcmdlIGVub3VnaCwgc28gZmFpbHVyZSB0byBjb25zdW1lIHRoZSBlbnRpcmUgaW50ZXJuYWwgYnVmZmVyCisgICAgLy8gb3IgdG8gcHJvZHVjZSB0aGUgY29ycmVjdCBudW1iZXIgb2YgZXh0ZXJuYWwgY2hhcmFjdGVycywgaXMgYW4gZXJyb3IuCisgICAgLy8gRm9yIGEgdmFyaWFibGUtd2lkdGggZW5jb2RpbmcsIGhvd2V2ZXIsIHdlIHJlcXVpcmUgb25seSB0aGF0IHdlCisgICAgLy8gY29uc3VtZSBhdCBsZWFzdCBvbmUgaW50ZXJuYWwgY2hhcmFjdGVyCisgICAgZWxzZSBpZiAoX19zdGF0dXMgIT0gX0NvZGVjdnQ6OmVycm9yICYmCisgICAgICAgICAgICAgKCgoX19pbmV4dCA9PSBfX2llbmQpICYmCisgICAgICAgICAgICAgICAoX19lbmV4dCAtIF9NX2V4dF9idWYgPT0gX01fd2lkdGggKiAoX19pZW5kIC0gX19pYmVnaW4pKSkgfHwKKyAgICAgICAgICAgICAgKCFfTV9jb25zdGFudF93aWR0aCAmJiBfX2luZXh0ICE9IF9faWJlZ2luKSkpIHsKKyAgICAgICAgLy8gV2Ugc3VjY2Vzc2Z1bGx5IGNvbnZlcnRlZCBwYXJ0IG9yIGFsbCBvZiB0aGUgaW50ZXJuYWwgYnVmZmVyLgorICAgICAgcHRyZGlmZl90IF9fbiA9IF9fZW5leHQgLSBfTV9leHRfYnVmOworICAgICAgaWYgKF9NX3dyaXRlKF9NX2V4dF9idWYsIF9fbikpCisgICAgICAgIF9faWJlZ2luICs9IF9faW5leHQgLSBfX2liZWdpbjsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIF9NX291dHB1dF9lcnJvcigpOworICAgIH0KKyAgICBlbHNlCisgICAgICByZXR1cm4gX01fb3V0cHV0X2Vycm9yKCk7CisgIH0KKworICByZXR1cm4gdHJhaXRzX3R5cGU6Om5vdF9lb2YoX19jKTsKK30KKworLy8gVGhpcyBtZW1iZXIgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueSBJL08gaGFzIGJlZW4KKy8vIHBlcmZvcm1lZCBvbiB0aGUgc3RyZWFtLCBvdGhlcndpc2UgaXQgaGFzIG5vIGVmZmVjdC4KKy8vCisvLyBfX2J1ZiA9PSAwICYmIF9fbiA9PSAwIG1lYW5zIHRvIG1ha2UgdGhpcyBzdHJlYW0gdW5idWZmZXJlZC4KKy8vIF9fYnVmICE9IDAgJiYgX19uID4gMCBtZWFucyB0byB1c2UgX19idWYgYXMgdGhlIHN0cmVhbSdzIGludGVybmFsCisvLyBidWZmZXIsIHJhdGhlciB0aGFuIHRoZSBidWZmZXIgdGhhdCB3b3VsZCBvdGhlcndpc2UgYmUgYWxsb2NhdGVkCisvLyBhdXRvbWF0aWNhbGx5LiAgX19idWYgbXVzdCBiZSBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgX0NoYXJUIHdob3NlCisvLyBzaXplIGlzIGF0IGxlYXN0IF9fbi4KK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPioKK2Jhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6c2V0YnVmKF9DaGFyVCogX19idWYsIHN0cmVhbXNpemUgX19uKSB7CisgIGlmICghX01faW5faW5wdXRfbW9kZSAmJiEgX01faW5fb3V0cHV0X21vZGUgJiYgIV9NX2luX2Vycm9yX21vZGUgJiYKKyAgICAgIF9NX2ludF9idWYgPT0gMCkgeworICAgIGlmIChfX2J1ZiA9PSAwICYmIF9fbiA9PSAwKQorICAgICAgX01fYWxsb2NhdGVfYnVmZmVycygwLCAxKTsKKyAgICBlbHNlIGlmIChfX2J1ZiAhPSAwICYmIF9fbiA+IDApCisgICAgICBfTV9hbGxvY2F0ZV9idWZmZXJzKF9fYnVmLCBfX24pOworICB9CisgIHJldHVybiB0aGlzOworfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfQVNTRVJUSU9OUykKKy8vIGhlbHBlciBjbGFzcy4KK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+CitzdHJ1Y3QgX0ZpbGVidWZfVG1wX0J1ZiB7CisgIF9DaGFyVCogX01fcHRyOworICBfRmlsZWJ1Zl9UbXBfQnVmKHB0cmRpZmZfdCBfX24pIDogX01fcHRyKDApIHsgX01fcHRyID0gbmV3IF9DaGFyVFtfX25dOyB9CisgIH5fRmlsZWJ1Zl9UbXBfQnVmKCkgeyBkZWxldGVbXSBfTV9wdHI7IH0KK307CisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK19fQkZfcG9zX3R5cGVfXworYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjpzZWVrb2ZmKG9mZl90eXBlIF9fb2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjpzZWVrZGlyIF9fd2hlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjpvcGVubW9kZSAvKiBkdW1teSAqLykgeworICBpZiAoIXRoaXMtPmlzX29wZW4oKSkKKyAgICByZXR1cm4gcG9zX3R5cGUoLTEpOworCisgIGlmICghX01fY29uc3RhbnRfd2lkdGggJiYgX19vZmYgIT0gMCkKKyAgICByZXR1cm4gcG9zX3R5cGUoLTEpOworCisgIGlmICghX01fc2Vla19pbml0KF9fb2ZmICE9IDAgfHwgX193aGVuY2UgIT0gaW9zX2Jhc2U6OmN1cikpCisgICAgcmV0dXJuIHBvc190eXBlKC0xKTsKKworICAvLyBTZWVrIHRvIGJlZ2lubmluZyBvciBlbmQsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB3ZSdyZSBpbiBpbnB1dCBtb2RlLgorICBpZiAoX193aGVuY2UgPT0gaW9zX2Jhc2U6OmJlZyB8fCBfX3doZW5jZSA9PSBpb3NfYmFzZTo6ZW5kKQorICAgIHJldHVybiBfTV9zZWVrX3JldHVybihfTV9iYXNlLl9NX3NlZWsoX01fd2lkdGggKiBfX29mZiwgX193aGVuY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfU3RhdGVfdHlwZSgpKTsKKworICAvLyBTZWVrIHJlbGF0aXZlIHRvIGN1cnJlbnQgcG9zaXRpb24uICBDb21wbGljYXRlZCBpZiB3ZSdyZSBpbiBpbnB1dCBtb2RlLgorICBfU1RMUF9BU1NFUlQoX193aGVuY2UgPT0gaW9zX2Jhc2U6OmN1cikKKyAgaWYgKCFfTV9pbl9pbnB1dF9tb2RlKQorICAgIHJldHVybiBfTV9zZWVrX3JldHVybihfTV9iYXNlLl9NX3NlZWsoX01fd2lkdGggKiBfX29mZiwgX193aGVuY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfU3RhdGVfdHlwZSgpKTsKKworICBpZiAoX01fbW1hcF9iYXNlICE9IDApIHsKKyAgICAvLyBfX29mZiBpcyByZWxhdGl2ZSB0byBncHRyKCkuICBXZSBuZWVkIHRvIGRvIGEgYml0IG9mIGFyaXRobWV0aWMKKyAgICAvLyB0byBnZXQgYW4gb2Zmc2V0IHJlbGF0aXZlIHRvIHRoZSBleHRlcm5hbCBmaWxlIHBvaW50ZXIuCisgICAgc3RyZWFtb2ZmIF9fYWRqdXN0ID0gX01fbW1hcF9sZW4gLSAodGhpcy0+Z3B0cigpIC0gKF9DaGFyVCopIF9NX21tYXBfYmFzZSk7CisKKyAgICAvLyBpZiBfX29mZiA9PSAwLCB3ZSBkbyBub3QgbmVlZCB0byBleGl0IGlucHV0IG1vZGUgYW5kIHRvIHNoaWZ0IGZpbGUgcG9pbnRlcgorICAgIHJldHVybiBfX29mZiA9PSAwID8gcG9zX3R5cGUoX01fYmFzZS5fTV9zZWVrKDAsIGlvc19iYXNlOjpjdXIpIC0gX19hZGp1c3QpCisgICAgICAgICAgICAgICAgICAgICAgOiBfTV9zZWVrX3JldHVybihfTV9iYXNlLl9NX3NlZWsoX19vZmYgLSBfX2FkanVzdCwgaW9zX2Jhc2U6OmN1ciksIF9TdGF0ZV90eXBlKCkpOworICB9CisKKyAgaWYgKF9NX2NvbnN0YW50X3dpZHRoKSB7IC8vIEdldCBvciBzZXQgdGhlIHBvc2l0aW9uLgorICAgIHN0cmVhbW9mZiBfX2lhZGogPSBfTV93aWR0aCAqICh0aGlzLT5ncHRyKCkgLSB0aGlzLT5lYmFjaygpKTsKKworICAgIC8vIENvbXBlbnNhdGUgZm9yIG9mZnNldCByZWxhdGl2ZSB0byBncHRyIHZlcnN1cyBvZmZzZXQgcmVsYXRpdmUKKyAgICAvLyB0byBleHRlcm5hbCBwb2ludGVyLiAgRm9yIGEgdGV4dC1vcmllbnRlZCBzdHJlYW0sIHdoZXJlIHRoZQorICAgIC8vIGNvbXBlbnNhdGlvbiBpcyBtb3JlIHRoYW4ganVzdCBwb2ludGVyIGFyaXRobWV0aWMsIHdlIG1heSBnZXQKKyAgICAvLyBidXQgbm90IHNldCB0aGUgY3VycmVudCBwb3NpdGlvbi4KKworICAgIGlmIChfX2lhZGogPD0gX01fZXh0X2J1Zl9lbmQgLSBfTV9leHRfYnVmKSB7CisgICAgICBzdHJlYW1vZmYgX19lYWRqID0gIF9NX2Jhc2UuX01fZ2V0X29mZnNldChfTV9leHRfYnVmICsgX19TVEFUSUNfQ0FTVChwdHJkaWZmX3QsIF9faWFkaiksIF9NX2V4dF9idWZfZW5kKTsKKworICAgICAgcmV0dXJuIF9fb2ZmID09IDAgPyBwb3NfdHlwZShfTV9iYXNlLl9NX3NlZWsoMCwgaW9zX2Jhc2U6OmN1cikgLSBfX2VhZGopCisgICAgICAgICAgICAgICAgICAgICAgICA6IF9NX3NlZWtfcmV0dXJuKF9NX2Jhc2UuX01fc2VlayhfX29mZiAtIF9fZWFkaiwgaW9zX2Jhc2U6OmN1ciksIF9TdGF0ZV90eXBlKCkpOworICAgIH0KKyAgfQorICBlbHNlIHsgICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgcG9zaXRpb24uICBFbmNvZGluZyBpcyB2YXIgd2lkdGguCisgICAgLy8gR2V0IHBvc2l0aW9uIGluIGludGVybmFsIGJ1ZmZlci4KKyAgICBwdHJkaWZmX3QgX19pcG9zID0gdGhpcy0+Z3B0cigpIC0gdGhpcy0+ZWJhY2soKTsKKworICAgIC8vIEdldCBjb3JyZXNwb25kaW5nIHBvc2l0aW9uIGluIGV4dGVybmFsIGJ1ZmZlci4KKyAgICBfU3RhdGVfdHlwZSBfX3N0YXRlID0gX01fc3RhdGU7CisgICAgaW50IF9fZXBvcyA9IF9NX2NvZGVjdnQtPmxlbmd0aChfX3N0YXRlLCBfTV9leHRfYnVmLCBfTV9leHRfYnVmX2NvbnZlcnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faXBvcyk7CisjaWYgZGVmaW5lZCAoX1NUTFBfQVNTRVJUSU9OUykKKyAgICAvLyBTYW5pdHkgY2hlY2sgKGV4cGVuc2l2ZSk6IG1ha2Ugc3VyZSBfX2Vwb3MgaXMgdGhlIHJpZ2h0IGFuc3dlci4KKyAgICBfU1RMUF9BU1NFUlQoX19lcG9zID49IDApCisgICAgX1N0YXRlX3R5cGUgX190bXBfc3RhdGUgPSBfTV9zdGF0ZTsKKyAgICBfRmlsZWJ1Zl9UbXBfQnVmPF9DaGFyVD4gX19idWYoX19pcG9zKTsKKyAgICBfQ2hhclQqIF9faWJlZ2luID0gX19idWYuX01fcHRyOworICAgIF9DaGFyVCogX19pbmV4dCAgPSBfX2liZWdpbjsKKyAgICBjb25zdCBjaGFyKiBfX2R1bW15OworICAgIHR5cGVuYW1lIF9Db2RlY3Z0OjpyZXN1bHQgX19zdGF0dXMKKyAgICAgID0gX01fY29kZWN2dC0+aW4oX190bXBfc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgIF9NX2V4dF9idWYsIF9NX2V4dF9idWYgKyBfX2Vwb3MsIF9fZHVtbXksCisgICAgICAgICAgICAgICAgICAgICAgIF9faWJlZ2luLCBfX2liZWdpbiArIF9faXBvcywgX19pbmV4dCk7CisgICAgLy8gVGhlIHJlc3VsdCBjb2RlIGlzIG5lY2Vzc2FyaWx5IG9rIGJlY2F1c2U6CisgICAgLy8gLSBub2NvbnY6IGltcG9zc2libGUgZm9yIGEgdmFyaWFibGUgZW5jb2RpbmcKKyAgICAvLyAtIGVycm9yOiBsZW5ndGggbWV0aG9kIGlzIHN1cHBvc2VkIHRvIGNvdW50IHVudGlsIGl0IHJlYWNoIG1heCB2YWx1ZSBvciBmaW5kIGFuIGVycm9yIHNvIHdlIGNhbm5vdCBoYXZlCisgICAgLy8gICAgICAgICAgYW4gZXJyb3IgYWdhaW4gd2hlbiBkZWNvZGluZyBhbiBleHRlcm5hbCBidWZmZXIgdXAgdG8gbGVuZ3RoIHJldHVybiB2YWx1ZS4KKyAgICAvLyAtIHBhcnRpYWw6IGlkZW0gZXJyb3IsIGl0IGlzIGFsc28gYSByZWFzb24gZm9yIGxlbmd0aCB0byBzdG9wIGNvdW50aW5nLgorICAgIF9TVExQX0FTU0VSVChfX3N0YXR1cyA9PSBfQ29kZWN2dDo6b2spCisgICAgX1NUTFBfQVNTRVJUKF9faW5leHQgPT0gX19pYmVnaW4gKyBfX2lwb3MpCisgICAgX1NUTFBfQVNTRVJUKGVxdWFsKHRoaXMtPmViYWNrKCksIHRoaXMtPmdwdHIoKSwgX19pYmVnaW4sIF9TVExQX1BSSVYgX0VxX3RyYWl0czx0cmFpdHNfdHlwZT4oKSkpCisjZW5kaWYKKyAgICAvLyBHZXQgdGhlIGN1cnJlbnQgcG9zaXRpb24gKGF0IHRoZSBlbmQgb2YgdGhlIGV4dGVybmFsIGJ1ZmZlciksCisgICAgLy8gdGhlbiBhZGp1c3QgaXQuICBBZ2FpbiwgaXQgbWlnaHQgYmUgYSB0ZXh0LW9yaWVudGVkIHN0cmVhbS4KKyAgICBzdHJlYW1vZmYgX19jdXIgPSBfTV9iYXNlLl9NX3NlZWsoMCwgaW9zX2Jhc2U6OmN1cik7CisgICAgc3RyZWFtb2ZmIF9fYWRqID0gX01fYmFzZS5fTV9nZXRfb2Zmc2V0KF9NX2V4dF9idWYsIF9NX2V4dF9idWYgKyBfX2Vwb3MpIC0KKyAgICAgICAgICAgICAgICAgICAgICBfTV9iYXNlLl9NX2dldF9vZmZzZXQoX01fZXh0X2J1ZiwgX01fZXh0X2J1Zl9lbmQpOworICAgIGlmIChfX2N1ciAhPSAtMSAmJiBfX2N1ciArIF9fYWRqID49IDApCisgICAgICByZXR1cm4gX19vZmYgPT0gMCA/IHBvc190eXBlKF9fY3VyICsgX19hZGopCisgICAgICAgICAgICAgICAgICAgICAgICA6IF9NX3NlZWtfcmV0dXJuKF9fY3VyICsgX19hZGosIF9fc3RhdGUpOworICB9CisKKyAgcmV0dXJuIHBvc190eXBlKC0xKTsKK30KKworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorX19CRl9wb3NfdHlwZV9fCitiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46OnNlZWtwb3MocG9zX3R5cGUgX19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Om9wZW5tb2RlIC8qIGR1bW15ICovKSB7CisgIGlmICh0aGlzLT5pc19vcGVuKCkpIHsKKyAgICBpZiAoIV9NX3NlZWtfaW5pdCh0cnVlKSkKKyAgICAgIHJldHVybiBwb3NfdHlwZSgtMSk7CisKKyAgICBzdHJlYW1vZmYgX19vZmYgPSBvZmZfdHlwZShfX3Bvcyk7CisgICAgaWYgKF9fb2ZmICE9IC0xICYmIF9NX2Jhc2UuX01fc2VlayhfX29mZiwgaW9zX2Jhc2U6OmJlZykgIT0gLTEpIHsKKyAgICAgIF9NX3N0YXRlID0gX19wb3Muc3RhdGUoKTsKKyAgICAgIHJldHVybiBfTV9zZWVrX3JldHVybihfX29mZiwgX19wb3Muc3RhdGUoKSk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHBvc190eXBlKC0xKTsKK30KKworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgoraW50IGJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6c3luYygpIHsKKyAgaWYgKF9NX2luX291dHB1dF9tb2RlKQorICAgIHJldHVybiB0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUodGhpcy0+b3ZlcmZsb3codHJhaXRzX3R5cGU6OmVvZigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190eXBlOjplb2YoKSkgPyAtMSA6IDA7CisgIHJldHVybiAwOworfQorCisKKy8vIENoYW5nZSB0aGUgZmlsZWJ1ZidzIGxvY2FsZS4gIFRoaXMgbWVtYmVyIGZ1bmN0aW9uIGhhcyBubyBlZmZlY3QKKy8vIHVubGVzcyBpdCBpcyBjYWxsZWQgYmVmb3JlIGFueSBJL08gaXMgcGVyZm9ybWVkIG9uIHRoZSBzdHJlYW0uCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgordm9pZCBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46OmltYnVlKGNvbnN0IGxvY2FsZSYgX19sb2MpIHsKKyAgaWYgKCFfTV9pbl9pbnB1dF9tb2RlICYmICFfTV9pbl9vdXRwdXRfbW9kZSAmJiAhX01faW5fZXJyb3JfbW9kZSkgeworICAgIHRoaXMtPl9NX3NldHVwX2NvZGVjdnQoX19sb2MpOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gYmFzaWNfZmlsZWJ1Zjw+IGhlbHBlciBmdW5jdGlvbnMuCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3Igc3dpdGNoaW5nIGJldHdlZW4gbW9kZXMuCisKKy8vIFRoaXMgbWVtYmVyIGZ1bmN0aW9uIGlzIGNhbGxlZCBpZiB3ZSdyZSBwZXJmb3JtaW5nIHRoZSBmaXJzdCBJL08KKy8vIG9wZXJhdGlvbiBvbiBhIGZpbGVidWYsIG9yIGlmIHdlJ3JlIHBlcmZvcm1pbmcgYW4gaW5wdXQgb3BlcmF0aW9uCisvLyBpbW1lZGlhdGVseSBhZnRlciBhIHNlZWsuCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYm9vbCBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46Ol9NX3N3aXRjaF90b19pbnB1dF9tb2RlKCkgeworICBpZiAodGhpcy0+aXNfb3BlbigpICYmICgoKGludClfTV9iYXNlLl9fb19tb2RlKCkgJiAoaW50KWlvc19iYXNlOjppbikgIT0wKQorICAgICAgJiYgKF9NX2luX291dHB1dF9tb2RlID09IDApICYmIChfTV9pbl9lcnJvcl9tb2RlID09IDApKSB7CisgICAgaWYgKCFfTV9pbnRfYnVmICYmICFfTV9hbGxvY2F0ZV9idWZmZXJzKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBfTV9leHRfYnVmX2NvbnZlcnRlZCA9IF9NX2V4dF9idWY7CisgICAgX01fZXh0X2J1Zl9lbmQgICAgICAgPSBfTV9leHRfYnVmOworCisgICAgX01fZW5kX3N0YXRlICAgID0gX01fc3RhdGU7CisKKyAgICBfTV9pbl9pbnB1dF9tb2RlID0gdHJ1ZTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworCisvLyBUaGlzIG1lbWJlciBmdW5jdGlvbiBpcyBjYWxsZWQgaWYgd2UncmUgcGVyZm9ybWluZyB0aGUgZmlyc3QgSS9PCisvLyBvcGVyYXRpb24gb24gYSBmaWxlYnVmLCBvciBpZiB3ZSdyZSBwZXJmb3JtaW5nIGFuIG91dHB1dCBvcGVyYXRpb24KKy8vIGltbWVkaWF0ZWx5IGFmdGVyIGEgc2Vlay4KK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Citib29sIGJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6X01fc3dpdGNoX3RvX291dHB1dF9tb2RlKCkgeworICBpZiAodGhpcy0+aXNfb3BlbigpICYmIChfTV9iYXNlLl9fb19tb2RlKCkgJiAoaW50KWlvc19iYXNlOjpvdXQpICYmCisgICAgICBfTV9pbl9pbnB1dF9tb2RlID09IDAgJiYgX01faW5fZXJyb3JfbW9kZSA9PSAwKSB7CisKKyAgICBpZiAoIV9NX2ludF9idWYgJiYgIV9NX2FsbG9jYXRlX2J1ZmZlcnMoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIEluIGFwcGVuZCBtb2RlLCBldmVyeSB3cml0ZSBkb2VzIGFuIGltcGxpY2l0IHNlZWsgdG8gdGhlIGVuZAorICAgIC8vIG9mIHRoZSBmaWxlLiAgV2hlbmV2ZXIgbGVhdmluZyBvdXRwdXQgbW9kZSwgdGhlIGVuZCBvZiBmaWxlCisgICAgLy8gZ2V0IHB1dCBpbiB0aGUgaW5pdGlhbCBzaGlmdCBzdGF0ZS4KKyAgICBpZiAoX01fYmFzZS5fX29fbW9kZSgpICYgaW9zX2Jhc2U6OmFwcCkKKyAgICAgIF9NX3N0YXRlID0gX1N0YXRlX3R5cGUoKTsKKworICAgIHRoaXMtPnNldHAoX01faW50X2J1ZiwgX01faW50X2J1Zl9FT1MgLSAxKTsKKyAgICBfTV9pbl9vdXRwdXRfbW9kZSA9IHRydWU7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIZWxwZXIgZnVuY3Rpb25zIGZvciBpbnB1dAorCisvLyBUaGlzIG1lbWJlciBmdW5jdGlvbiBpcyBjYWxsZWQgaWYgdGhlcmUgaXMgYW4gZXJyb3IgZHVyaW5nIGlucHV0LgorLy8gSXQgcHV0cyB0aGUgZmlsZWJ1ZiBpbiBlcnJvciBtb2RlLCBjbGVhciB0aGUgZ2V0IGFyZWEgYnVmZmVyLCBhbmQKKy8vIHJldHVybnMgZW9mLgorLy8gcmV0dXJucyBlb2YuICBFcnJvciBtb2RlIGlzIHN0aWNreTsgaXQgaXMgY2xlYXJlZCBvbmx5IGJ5IGNsb3NlIG9yCisvLyBzZWVrLgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorX19CRl9pbnRfdHlwZV9fCitiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46Ol9NX2lucHV0X2Vycm9yKCkgeworICAgdGhpcy0+X01fZXhpdF9pbnB1dF9tb2RlKCk7CisgIF9NX2luX291dHB1dF9tb2RlID0gZmFsc2U7CisgIF9NX2luX2Vycm9yX21vZGUgPSB0cnVlOworICB0aGlzLT5zZXRnKDAsIDAsIDApOworICByZXR1cm4gdHJhaXRzX3R5cGU6OmVvZigpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorX19CRl9pbnRfdHlwZV9fCitiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46Ol9NX3VuZGVyZmxvd19hdXgoKSB7CisgIC8vIFdlIGhhdmUgdGhlIHN0YXRlIGFuZCBmaWxlIHBvc2l0aW9uIGZyb20gdGhlIGVuZCBvZiB0aGUgaW50ZXJuYWwKKyAgLy8gYnVmZmVyLiAgVGhpcyByb3VuZCwgdGhleSBiZWNvbWUgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW50ZXJuYWwgYnVmZmVyLgorICBfTV9zdGF0ZSAgICA9IF9NX2VuZF9zdGF0ZTsKKworICAvLyBGaWxsIHRoZSBleHRlcm5hbCBidWZmZXIuICBTdGFydCB3aXRoIGFueSBsZWZ0b3ZlciBjaGFyYWN0ZXJzIHRoYXQKKyAgLy8gZGlkbid0IGdldCBjb252ZXJ0ZWQgbGFzdCB0aW1lLgorICBpZiAoX01fZXh0X2J1Zl9lbmQgPiBfTV9leHRfYnVmX2NvbnZlcnRlZCkKKworICAgIF9NX2V4dF9idWZfZW5kID0gX1NUTFBfU1REOjpjb3B5KF9NX2V4dF9idWZfY29udmVydGVkLCBfTV9leHRfYnVmX2VuZCwgX01fZXh0X2J1Zik7CisgICAgLy8gYm9yaXMgOiBjb3B5X2JhY2t3YXJkIGRpZCBub3Qgd29yaworICAgIC8vX01fZXh0X2J1Zl9lbmQgPSBjb3B5X2JhY2t3YXJkKF9NX2V4dF9idWZfY29udmVydGVkLCBfTV9leHRfYnVmX2VuZCwKKyAgICAvL19NX2V4dF9idWYrIChfTV9leHRfYnVmX2VuZCAtIF9NX2V4dF9idWZfY29udmVydGVkKSk7CisgIGVsc2UKKyAgICBfTV9leHRfYnVmX2VuZCA9IF9NX2V4dF9idWY7CisKKyAgLy8gTm93IGZpbGwgdGhlIGV4dGVybmFsIGJ1ZmZlciB3aXRoIGNoYXJhY3RlcnMgZnJvbSB0aGUgZmlsZS4gIFRoaXMgaXMKKyAgLy8gYSBsb29wIGJlY2F1c2Ugb2NjYXNpb25hbGx5IHdlIGRvbid0IGdldCBlbm91Z2ggZXh0ZXJuYWwgY2hhcmFjdGVycworICAvLyB0byBtYWtlIHByb2dyZXNzLgorICBmb3IgKDs7KSB7CisgICAgcHRyZGlmZl90IF9fbiA9IF9NX2Jhc2UuX01fcmVhZChfTV9leHRfYnVmX2VuZCwgX01fZXh0X2J1Zl9FT1MgLSBfTV9leHRfYnVmX2VuZCk7CisgICAgaWYgKF9fbiA8IDApIHsKKyAgICAgIC8vIFJlYWQgZmFpbGVkLCBtYXliZSB3ZSBzaG91bGQgc2V0IGVyciBiaXQgb24gYXNzb2NpYXRlZCBzdHJlYW0uLi4KKyAgICAgIHRoaXMtPnNldGcoMCwgMCwgMCk7CisgICAgICByZXR1cm4gdHJhaXRzX3R5cGU6OmVvZigpOworICAgIH0KKworICAgIF9NX2V4dF9idWZfZW5kICs9IF9fbjsKKworICAgIC8vIElmIGV4dGVybmFsIGJ1ZmZlciBpcyBlbXB0eSB0aGVyZSBpcyBub3RoaW5nIHRvIGRvLiAKKyAgICBpZiAoX01fZXh0X2J1ZiA9PSBfTV9leHRfYnVmX2VuZCkgeworICAgICAgdGhpcy0+c2V0ZygwLCAwLCAwKTsKKyAgICAgIHJldHVybiB0cmFpdHNfdHlwZTo6ZW9mKCk7CisgICAgfQorCisgICAgLy8gQ29udmVydCB0aGUgZXh0ZXJuYWwgYnVmZmVyIHRvIGludGVybmFsIGNoYXJhY3RlcnMuCisgICAgY29uc3QgY2hhciogX19lbmV4dDsKKyAgICBfQ2hhclQqIF9faW5leHQ7CisKKyAgICB0eXBlbmFtZSBfQ29kZWN2dDo6cmVzdWx0IF9fc3RhdHVzCisgICAgICA9IF9NX2NvZGVjdnQtPmluKF9NX2VuZF9zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgX01fZXh0X2J1ZiwgX01fZXh0X2J1Zl9lbmQsIF9fZW5leHQsCisgICAgICAgICAgICAgICAgICAgICAgIF9NX2ludF9idWYsIF9NX2ludF9idWZfRU9TLCBfX2luZXh0KTsKKworICAgIC8qIEVycm9yIGNvbmRpdGlvbnM6CisgICAgICogKDEpIFJldHVybiB2YWx1ZSBvZiBlcnJvci4KKyAgICAgKiAoMikgUHJvZHVjaW5nIGludGVybmFsIGNoYXJhY3RlcnMgd2l0aG91dCBjb25zdW1pbmcgZXh0ZXJuYWwgY2hhcmFjdGVycy4KKyAgICAgKiAoMykgSW4gZml4ZWQtd2lkdGggZW5jb2RpbmdzLCBwcm9kdWNpbmcgYW4gaW50ZXJuYWwgc2VxdWVuY2Ugd2hvc2UgbGVuZ3RoCisgICAgICogaXMgaW5jb25zaXN0ZW50IHdpdGggdGhhdCBvZiB0aGUgaW50ZXJuYWwgc2VxdWVuY2UuCisgICAgICogKDQpIEZhaWx1cmUgdG8gcHJvZHVjZSBhbnkgY2hhcmFjdGVycyBpZiB3ZSBoYXZlIGVub3VnaCBjaGFyYWN0ZXJzIGluCisgICAgICogdGhlIGV4dGVybmFsIGJ1ZmZlciwgd2hlcmUgImVub3VnaCIgbWVhbnMgdGhlIGxhcmdlc3QgcG9zc2libGUgd2lkdGgKKyAgICAgKiBvZiBhIHNpbmdsZSBjaGFyYWN0ZXIuICovCisgICAgaWYgKF9fc3RhdHVzID09IF9Db2RlY3Z0Ojpub2NvbnYpCisgICAgICByZXR1cm4gX05vY29udl9pbnB1dDxfVHJhaXRzPjo6X01fZG9pdCh0aGlzKTsKKyAgICBlbHNlIGlmIChfX3N0YXR1cyA9PSBfQ29kZWN2dDo6ZXJyb3IgfHwKKyAgICAgICAgICAgIChfX2luZXh0ICE9IF9NX2ludF9idWYgJiYgX19lbmV4dCA9PSBfTV9leHRfYnVmKSB8fAorICAgICAgICAgICAgKF9NX2NvbnN0YW50X3dpZHRoICYmIChfX2luZXh0IC0gX01faW50X2J1ZikgKiAgX01fd2lkdGggIT0gKF9fZW5leHQgLSBfTV9leHRfYnVmKSkgfHwKKyAgICAgICAgICAgIChfX2luZXh0ID09IF9NX2ludF9idWYgJiYgX19lbmV4dCAtIF9NX2V4dF9idWYgPj0gX01fbWF4X3dpZHRoKSkKKyAgICAgIHJldHVybiBfTV9pbnB1dF9lcnJvcigpOworICAgIGVsc2UgaWYgKF9faW5leHQgIT0gX01faW50X2J1ZikgeworICAgICAgX01fZXh0X2J1Zl9jb252ZXJ0ZWQgPSBfTV9leHRfYnVmICsgKF9fZW5leHQgLSBfTV9leHRfYnVmKTsKKyAgICAgIHRoaXMtPnNldGcoX01faW50X2J1ZiwgX01faW50X2J1ZiwgX19pbmV4dCk7CisgICAgICByZXR1cm4gdHJhaXRzX3R5cGU6OnRvX2ludF90eXBlKCpfTV9pbnRfYnVmKTsKKyAgICB9CisgICAgLyogV2UgbmVlZCB0byBnbyBhcm91bmQgdGhlIGxvb3AgYWdhaW4gdG8gZ2V0IG1vcmUgZXh0ZXJuYWwgY2hhcmFjdGVycy4KKyAgICAgKiBCdXQgaWYgdGhlIHByZXZpb3VzIHJlYWQgZmFpbGVkIHRoZW4gZG9uJ3QgdHJ5IGFnYWluIGZvciBub3cuCisgICAgICogRG9uJ3QgZW50ZXIgZXJyb3IgbW9kZSBmb3IgYSBmYWlsZWQgcmVhZC4gRXJyb3IgbW9kZSBpcyBzdGlja3ksCisgICAgICogYW5kIHdlIG1pZ2h0IHN1Y2NlZWQgaWYgd2UgdHJ5IGFnYWluLiAqLworICAgIGlmIChfX24gPD0gMCkgeworICAgICAgdGhpcy0+c2V0ZygwLCAwLCAwKTsKKyAgICAgIHJldHVybiB0cmFpdHNfdHlwZTo6ZW9mKCk7CisgICAgfQorICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3Igb3V0cHV0CisKKy8vIFRoaXMgbWVtYmVyIGZ1bmN0aW9uIGlzIGNhbGxlZCBpZiB0aGVyZSBpcyBhbiBlcnJvciBkdXJpbmcgb3V0cHV0LgorLy8gSXQgcHV0cyB0aGUgZmlsZWJ1ZiBpbiBlcnJvciBtb2RlLCBjbGVhciB0aGUgcHV0IGFyZWEgYnVmZmVyLCBhbmQKKy8vIHJldHVybnMgZW9mLiAgRXJyb3IgbW9kZSBpcyBzdGlja3k7IGl0IGlzIGNsZWFyZWQgb25seSBieSBjbG9zZSBvcgorLy8gc2Vlay4KK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitfX0JGX2ludF90eXBlX18KK2Jhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6X01fb3V0cHV0X2Vycm9yKCkgeworICBfTV9pbl9vdXRwdXRfbW9kZSA9IGZhbHNlOworICBfTV9pbl9pbnB1dF9tb2RlID0gZmFsc2U7CisgIF9NX2luX2Vycm9yX21vZGUgPSB0cnVlOworICB0aGlzLT5zZXRwKDAsIDApOworICByZXR1cm4gdHJhaXRzX3R5cGU6OmVvZigpOworfQorCisKKy8vIFdyaXRlIHdoYXRldmVyIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgaXMgbmVjZXNzYXJ5IHRvIGdldCBiYWNrIHRvCisvLyB0aGUgaW5pdGlhbCBzaGlmdCBzdGF0ZS4gIFRoaXMgZnVuY3Rpb24gb3ZlcndyaXRlcyB0aGUgZXh0ZXJuYWwKKy8vIGJ1ZmZlciwgY2hhbmdlcyB0aGUgZXh0ZXJuYWwgZmlsZSBwb3NpdGlvbiwgYW5kIGNoYW5nZXMgdGhlIHN0YXRlLgorLy8gUHJlY29uZGl0aW9uOiB0aGUgaW50ZXJuYWwgYnVmZmVyIGlzIGVtcHR5LgordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jvb2wgYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjpfTV91bnNoaWZ0KCkgeworICBpZiAoX01faW5fb3V0cHV0X21vZGUgJiYgIV9NX2NvbnN0YW50X3dpZHRoKSB7CisgICAgdHlwZW5hbWUgX0NvZGVjdnQ6OnJlc3VsdCBfX3N0YXR1czsKKyAgICBkbyB7CisgICAgICBjaGFyKiBfX2VuZXh0ID0gX01fZXh0X2J1ZjsKKyAgICAgIF9fc3RhdHVzID0gX01fY29kZWN2dC0+dW5zaGlmdChfTV9zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTV9leHRfYnVmLCBfTV9leHRfYnVmX0VPUywgX19lbmV4dCk7CisgICAgICBpZiAoX19zdGF0dXMgPT0gX0NvZGVjdnQ6Om5vY29udiB8fAorICAgICAgICAgIChfX2VuZXh0ID09IF9NX2V4dF9idWYgJiYgX19zdGF0dXMgPT0gX0NvZGVjdnQ6Om9rKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBlbHNlIGlmIChfX3N0YXR1cyA9PSBfQ29kZWN2dDo6ZXJyb3IpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGVsc2UgaWYgKCFfTV93cml0ZShfTV9leHRfYnVmLCBfX2VuZXh0IC0gX01fZXh0X2J1ZikpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IHdoaWxlIChfX3N0YXR1cyA9PSBfQ29kZWN2dDo6cGFydGlhbCk7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIGJ1ZmZlciBhbGxvY2F0aW9uIGFuZCBkZWFsbG9jYXRpb24KKworLy8gVGhpcyBtZW1iZXIgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gd2UncmUgaW5pdGlhbGl6aW5nIGEgZmlsZWJ1ZidzCisvLyBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgYnVmZmVycy4gIFRoZSBhcmd1bWVudCBpcyB0aGUgc2l6ZSBvZiB0aGUKKy8vIGludGVybmFsIGJ1ZmZlcjsgdGhlIGV4dGVybmFsIGJ1ZmZlciBpcyBzaXplZCB1c2luZyB0aGUgY2hhcmFjdGVyCisvLyB3aWR0aCBpbiB0aGUgY3VycmVudCBlbmNvZGluZy4gIFByZWNvbmRpdGlvbnM6IHRoZSBidWZmZXJzIGFyZSBjdXJyZW50bHkKKy8vIG51bGwuICBfX24gPj0gMS4gIF9fYnVmIGlzIGVpdGhlciBhIG51bGwgcG9pbnRlciBvciBhIHBvaW50ZXIgdG8gYW4KKy8vIGFycmF5IHNob3cgc2l6ZSBpcyBhdCBsZWFzdCBfX24uCisKKy8vIFdlIG5lZWQgX19uID49IDEgZm9yIHR3byBkaWZmZXJlbnQgcmVhc29ucy4gIEZvciBpbnB1dCwgdGhlIGJhc2UKKy8vIGNsYXNzIGFsd2F5cyBuZWVkcyBhIGJ1ZmZlciBiZWNhdXNlIG9mIHRoZSBzZW1hbnRpY3Mgb2YgdW5kZXJmbG93KCkuCisvLyBGb3Igb3V0cHV0LCB3ZSB3YW50IHRvIGhhdmUgYW4gaW50ZXJuYWwgYnVmZmVyIHRoYXQncyBsYXJnZXIgYnkgb25lCisvLyBlbGVtZW50IHRoYW4gdGhlIGJ1ZmZlciB0aGF0IHRoZSBiYXNlIGNsYXNzIGtub3dzIGFib3V0LiAgKFNlZQorLy8gYmFzaWNfZmlsZWJ1Zjw+OjpvdmVyZmxvdygpIGZvciB0aGUgcmVhc29uLikKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Citib29sIGJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6X01fYWxsb2NhdGVfYnVmZmVycyhfQ2hhclQqIF9fYnVmLCBzdHJlYW1zaXplIF9fbikgeworICAvL1RoZSBtYWpvciBoeXBvdGhlc2lzIGluIHRoZSBmb2xsb3dpbmcgaW1wbGVtZW50YXRpb24gaXMgdGhhdCBzaXplX3QgaXMgdW5zaWduZWQuCisgIC8vV2UgYWxzbyBuZWVkIHN0cmVhbXNpemUgYnl0ZSByZXByZXNlbnRhdGlvbiB0byBiZSBsYXJnZXIgb3IgZXF1YWwgdG8gdGhlIGludAorICAvL3JlcHJlc2VudGF0aW9uIHRvIGNvcnJlY3RseSBzdG9yZSB0aGUgZW5jb2RpbmcgaW5mb3JtYXRpb24uCisgIF9TVExQX1NUQVRJQ19BU1NFUlQoIW51bWVyaWNfbGltaXRzPHNpemVfdD46OmlzX3NpZ25lZCAmJgorICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJlYW1zaXplKSA+PSBzaXplb2YoaW50KSkKKworICBpZiAoX19idWYgPT0gMCkgeworICAgIHN0cmVhbXNpemUgX19idWZzaXplID0gX19uICogc2l6ZW9mKF9DaGFyVCk7CisgICAgLy9XZSBmaXJzdCBjaGVjayB0aGF0IHRoZSBzdHJlYW1zaXplIHJlcHJlc2VudGF0aW9uIGNhbid0IG92ZXJmbG93IGEgc2l6ZV90IG9uZS4KKyAgICAvL0lmIGl0IGNhbiwgd2UgY2hlY2sgdGhhdCBfX2J1ZnNpemUgaXMgbm90IGhpZ2hlciB0aGFuIHRoZSBzaXplX3QgbWF4IHZhbHVlLgorICAgIGlmICgoc2l6ZW9mKHN0cmVhbXNpemUpID4gc2l6ZW9mKHNpemVfdCkpICYmCisgICAgICAgIChfX2J1ZnNpemUgPiBfX1NUQVRJQ19DQVNUKHN0cmVhbXNpemUsIChudW1lcmljX2xpbWl0czxzaXplX3Q+OjptYXgpKCkpKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBfTV9pbnRfYnVmID0gX19TVEFUSUNfQ0FTVChfQ2hhclQqLCBtYWxsb2MoX19TVEFUSUNfQ0FTVChzaXplX3QsIF9fYnVmc2l6ZSkpKTsKKyAgICBpZiAoIV9NX2ludF9idWYpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgX01faW50X2J1Zl9keW5hbWljID0gdHJ1ZTsKKyAgfQorICBlbHNlIHsKKyAgICBfTV9pbnRfYnVmID0gX19idWY7CisgICAgX01faW50X2J1Zl9keW5hbWljID0gZmFsc2U7CisgIH0KKworICBzdHJlYW1zaXplIF9fZWJ1ZnNpeiA9IChtYXgpKF9fbiAqIF9fU1RBVElDX0NBU1Qoc3RyZWFtc2l6ZSwgX01fd2lkdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fU1RBVElDX0NBU1Qoc3RyZWFtc2l6ZSwgX01fY29kZWN2dC0+bWF4X2xlbmd0aCgpKSk7CisKKyAgX01fZXh0X2J1ZiA9IDA7CisgIGlmICgoc2l6ZW9mKHN0cmVhbXNpemUpIDwgc2l6ZW9mKHNpemVfdCkpIHx8CisgICAgICAoKHNpemVvZihzdHJlYW1zaXplKSA9PSBzaXplb2Yoc2l6ZV90KSkgJiYgbnVtZXJpY19saW1pdHM8c3RyZWFtc2l6ZT46OmlzX3NpZ25lZCkgfHwKKyAgICAgIChfX2VidWZzaXogPD0gX19TVEFUSUNfQ0FTVChzdHJlYW1zaXplLCAobnVtZXJpY19saW1pdHM8c2l6ZV90Pjo6bWF4KSgpKSkpIHsKKyAgICBfTV9leHRfYnVmID0gX19TVEFUSUNfQ0FTVChjaGFyKiwgbWFsbG9jKF9fU1RBVElDX0NBU1Qoc2l6ZV90LCBfX2VidWZzaXopKSk7CisgIH0KKworICBpZiAoIV9NX2V4dF9idWYpIHsKKyAgICBfTV9kZWFsbG9jYXRlX2J1ZmZlcnMoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBfTV9pbnRfYnVmX0VPUyA9IF9NX2ludF9idWYgKyBfX1NUQVRJQ19DQVNUKHB0cmRpZmZfdCwgX19uKTsKKyAgX01fZXh0X2J1Zl9FT1MgPSBfTV9leHRfYnVmICsgX19TVEFUSUNfQ0FTVChwdHJkaWZmX3QsIF9fZWJ1ZnNpeik7CisgIHJldHVybiB0cnVlOworfQorCisvLyBBYmJyZXZpYXRpb24gZm9yIHRoZSBtb3N0IGNvbW1vbiBjYXNlLgordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jvb2wgYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjpfTV9hbGxvY2F0ZV9idWZmZXJzKCkgeworICAvLyBDaG9vc2UgYSBidWZmZXIgdGhhdCdzIGF0IGxlYXN0IDQwOTYgY2hhcmFjdGVycyBsb25nIGFuZCB0aGF0J3MgYQorICAvLyBtdWx0aXBsZSBvZiB0aGUgcGFnZSBzaXplLgorICBzdHJlYW1zaXplIF9fZGVmYXVsdF9idWZzaXogPQorICAgICgoX01fYmFzZS5fX3BhZ2Vfc2l6ZSgpICsgNDA5NVVMKSAvIF9NX2Jhc2UuX19wYWdlX3NpemUoKSkgKiBfTV9iYXNlLl9fcGFnZV9zaXplKCk7CisgIHJldHVybiBfTV9hbGxvY2F0ZV9idWZmZXJzKDAsIF9fZGVmYXVsdF9idWZzaXopOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgordm9pZCBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46Ol9NX2RlYWxsb2NhdGVfYnVmZmVycygpIHsKKyAgaWYgKF9NX2ludF9idWZfZHluYW1pYykKKyAgICBmcmVlKF9NX2ludF9idWYpOworICBmcmVlKF9NX2V4dF9idWYpOworICBfTV9pbnRfYnVmICAgICA9IDA7CisgIF9NX2ludF9idWZfRU9TID0gMDsKKyAgX01fZXh0X2J1ZiAgICAgPSAwOworICBfTV9leHRfYnVmX0VPUyA9IDA7Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIZWxwZXIgZnVuY3Rpb3NuIGZvciBzZWVrIGFuZCBpbWJ1ZQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYm9vbCBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46Ol9NX3NlZWtfaW5pdChib29sIF9fZG9fdW5zaGlmdCkgeworICAvLyBJZiB3ZSdyZSBpbiBlcnJvciBtb2RlLCBsZWF2ZSBpdC4KKyAgIF9NX2luX2Vycm9yX21vZGUgPSBmYWxzZTsKKworICAvLyBGbHVzaCB0aGUgb3V0cHV0IGJ1ZmZlciBpZiB3ZSdyZSBpbiBvdXRwdXQgbW9kZSwgYW5kIChjb25kaXRpb25hbGx5KQorICAvLyBlbWl0IGFuIHVuc2hpZnQgc2VxdWVuY2UuCisgIGlmIChfTV9pbl9vdXRwdXRfbW9kZSkgeworICAgIGJvb2wgX19vayA9ICF0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUodGhpcy0+b3ZlcmZsb3codHJhaXRzX3R5cGU6OmVvZigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190eXBlOjplb2YoKSk7CisgICAgaWYgKF9fZG9fdW5zaGlmdCkKKyAgICAgIF9fb2sgPSBfX29rICYmIHRoaXMtPl9NX3Vuc2hpZnQoKTsKKyAgICBpZiAoIV9fb2spIHsKKyAgICAgIF9NX2luX291dHB1dF9tb2RlID0gZmFsc2U7CisgICAgICBfTV9pbl9lcnJvcl9tb2RlID0gdHJ1ZTsKKyAgICAgIHRoaXMtPnNldHAoMCwgMCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgLy8gRGlzY2FyZCBwdXRiYWNrIGNoYXJhY3RlcnMsIGlmIGFueS4KKyAgaWYgKF9NX2luX2lucHV0X21vZGUgJiYgX01faW5fcHV0YmFja19tb2RlKQorICAgIF9NX2V4aXRfcHV0YmFja19tb2RlKCk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKworLyogQ2hhbmdlIHRoZSBmaWxlYnVmJ3MgbG9jYWxlLiAgVGhpcyBtZW1iZXIgZnVuY3Rpb24gaGFzIG5vIGVmZmVjdAorICogdW5sZXNzIGl0IGlzIGNhbGxlZCBiZWZvcmUgYW55IEkvTyBpcyBwZXJmb3JtZWQgb24gdGhlIHN0cmVhbS4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uIGNvbnN0cnVjdGlvbiBhbmQgb24gYW4gaW1idWUgY2FsbC4gSW4gdGhlCisgKiBjYXNlIG9mIHRoZSBjb25zdHJ1Y3Rpb24gdGhlIGNvZGVjdnQgZmFjZXQgbWlnaHQgYmUgYSBjdXN0b20gb25lIGlmCisgKiB0aGUgYmFzaWNfZmlsZWJ1ZiB1c2VyIGhhcyBpbnN0YW5jaWF0ZSBpdCB3aXRoIGEgY3VzdG9tIGNoYXJfdHJhaXRzLgorICogVGhlIHVzZXIgd2lsbCBoYXZlIHRvIGNhbGwgaW1idWUgYmVmb3JlIGFueSBJL08gb3BlcmF0aW9uLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgordm9pZCBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46Ol9NX3NldHVwX2NvZGVjdnQoY29uc3QgbG9jYWxlJiBfX2xvYywgYm9vbCBfX29uX2ltYnVlKSB7CisgIGlmIChoYXNfZmFjZXQ8X0NvZGVjdnQ+KF9fbG9jKSkgeworICAgIF9NX2NvZGVjdnQgPSAmdXNlX2ZhY2V0PF9Db2RlY3Z0PihfX2xvYykgOworICAgIGludCBfX2VuY29kaW5nICAgID0gX01fY29kZWN2dC0+ZW5jb2RpbmcoKTsKKworICAgIF9NX3dpZHRoICAgICAgICAgID0gKG1heCkoX19lbmNvZGluZywgMSk7CisgICAgX01fbWF4X3dpZHRoICAgICAgPSBfTV9jb2RlY3Z0LT5tYXhfbGVuZ3RoKCk7CisgICAgX01fY29uc3RhbnRfd2lkdGggPSBfX2VuY29kaW5nID4gMDsKKyAgICBfTV9hbHdheXNfbm9jb252ICA9IF9NX2NvZGVjdnQtPmFsd2F5c19ub2NvbnYoKTsKKyAgfQorICBlbHNlIHsKKyAgICBfTV9jb2RlY3Z0ID0gMDsKKyAgICBfTV93aWR0aCA9IF9NX21heF93aWR0aCA9IDE7CisgICAgX01fY29uc3RhbnRfd2lkdGggPSBfTV9hbHdheXNfbm9jb252ICA9IGZhbHNlOworICAgIGlmIChfX29uX2ltYnVlKSB7CisgICAgICAvL1RoaXMgY2FsbCB3aWxsIGdlbmVyYXRlIGFuIGV4Y2VwdGlvbiByZXBvcnRpbmcgdGhlIHByb2JsZW0uCisgICAgICB1c2VfZmFjZXQ8X0NvZGVjdnQ+KF9fbG9jKTsKKyAgICB9CisgIH0KK30KKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjIHVuZGVmIF9fQkZfaW50X3R5cGVfXworIyB1bmRlZiBfX0JGX3Bvc190eXBlX18KKyMgdW5kZWYgX19CRl9vZmZfdHlwZV9fCisKKyNlbmRpZiAvKiBfU1RMUF9GU1RSRUFNX0MgKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL19mc3RyZWFtLmggYi9zdGxwb3J0L3N0bC9fZnN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NDVlNDEKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9fZnN0cmVhbS5oCkBAIC0wLDAgKzEsNzE0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworLy8gVGhpcyBoZWFkZXIgZGVmaW5lcyBjbGFzc2VzIGJhc2ljX2ZpbGVidWYsIGJhc2ljX2lmc3RyZWFtLAorLy8gYmFzaWNfb2ZzdHJlYW0sIGFuZCBiYXNpY19mc3RyZWFtLiAgVGhlc2UgY2xhc3NlcyByZXByZXNlbnQKKy8vIHN0cmVhbWJ1ZnMgYW5kIHN0cmVhbXMgd2hvc2Ugc291cmNlcyBvciBkZXN0aW5hdGlvbnMgYXJlIGZpbGVzLgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0ZTVFJFQU1fSAorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9GU1RSRUFNX0gKKworI2lmIGRlZmluZWQoX19zZ2kpICYmICFkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfU1RBTkRBUkRfQ19QTFVTX1BMVVMpCisjICBlcnJvciBUaGlzIGhlYWRlciBmaWxlIHJlcXVpcmVzIHRoZSAtTEFORzpzdGQgb3B0aW9uCisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9TVFJFQU1CVUYKKyMgIGluY2x1ZGUgPHN0bC9fc3RyZWFtYnVmLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9JU1RSRUFNCisjICBpbmNsdWRlIDxzdGwvX2lzdHJlYW0uaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NPREVDVlRfSAorIyAgaW5jbHVkZSA8c3RsL19jb2RlY3Z0Lmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9XSU4zMl9JTykKK3R5cGVkZWYgdm9pZCogX1NUTFBfZmQ7CisjZWxpZiBkZWZpbmVkIChfU1RMUF9VU0VfVU5JWF9FTVVMQVRJT05fSU8pIHx8IGRlZmluZWQgKF9TVExQX1VTRV9TVERJT19JTykgfHwgZGVmaW5lZCAoX1NUTFBfVVNFX1VOSVhfSU8pCit0eXBlZGVmIGludCBfU1RMUF9mZDsKKyNlbHNlCisjICBlcnJvciAiQ29uZmlndXJlIGkvbyAhIgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENsYXNzIF9GaWxlYnVmX2Jhc2UsIGEgcHJpdmF0ZSBiYXNlIGNsYXNzIHRvIGZhY3RvciBvdXQgdGhlIHN5c3RlbS0KKy8vIGRlcGVuZGVudCBjb2RlIGZyb20gYmFzaWNfZmlsZWJ1Zjw+LgorCitjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBfRmlsZWJ1Zl9iYXNlIHsKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgLy8gT3BlbmluZyBhbmQgY2xvc2luZyBmaWxlcy4KKyAgX0ZpbGVidWZfYmFzZSgpOworCisgIGJvb2wgX01fb3Blbihjb25zdCBjaGFyKiwgaW9zX2Jhc2U6Om9wZW5tb2RlLCBsb25nIF9fcHJvdGVjdGlvbik7CisgIGJvb2wgX01fb3Blbihjb25zdCBjaGFyKiwgaW9zX2Jhc2U6Om9wZW5tb2RlKTsKKyAgYm9vbCBfTV9vcGVuKGludCBfX2lkLCBpb3NfYmFzZTo6b3Blbm1vZGUgPSBpb3NfYmFzZTo6X19kZWZhdWx0X21vZGUpOworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9XSU4zMl9JTykKKyAgYm9vbCBfTV9vcGVuKF9TVExQX2ZkIF9faWQsIGlvc19iYXNlOjpvcGVubW9kZSA9IGlvc19iYXNlOjpfX2RlZmF1bHRfbW9kZSk7CisjZW5kaWYgLyogX1NUTFBfVVNFX1dJTjMyX0lPICovCisgIGJvb2wgX01fY2xvc2UoKTsKKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAvLyBMb3ctbGV2ZWwgSS9PLCBsaWtlIFVuaXggcmVhZC93cml0ZQorICBwdHJkaWZmX3QgX01fcmVhZChjaGFyKiBfX2J1ZiwgIHB0cmRpZmZfdCBfX24pOworICBzdHJlYW1vZmYgX01fc2VlayhzdHJlYW1vZmYgX19vZmZzZXQsIGlvc19iYXNlOjpzZWVrZGlyIF9fZGlyKTsKKyAgc3RyZWFtb2ZmIF9NX2ZpbGVfc2l6ZSgpOworICBib29sIF9NX3dyaXRlKGNoYXIqIF9fYnVmLCAgcHRyZGlmZl90IF9fbik7CisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgLy8gTWVtb3J5LW1hcHBlZCBJL08uCisgIHZvaWQqIF9NX21tYXAoc3RyZWFtb2ZmIF9fb2Zmc2V0LCBzdHJlYW1vZmYgX19sZW4pOworICB2b2lkIF9NX3VubWFwKHZvaWQqIF9fbW1hcF9iYXNlLCBzdHJlYW1vZmYgX19sZW4pOworCitwdWJsaWM6CisgIC8vIFJldHVybnMgYSB2YWx1ZSBuIHN1Y2ggdGhhdCwgaWYgcG9zIGlzIHRoZSBmaWxlIHBvaW50ZXIgYXQgdGhlCisgIC8vIGJlZ2lubmluZyBvZiB0aGUgcmFuZ2UgW2ZpcnN0LCBsYXN0KSwgcG9zICsgbiBpcyB0aGUgZmlsZSBwb2ludGVyIGF0CisgIC8vIHRoZSBlbmQuICBPbiBtYW55IG9wZXJhdGluZyBzeXN0ZW1zIG4gPT0gX19sYXN0IC0gX19maXJzdC4KKyAgLy8gSW4gVW5peCwgd3JpdGluZyBuIGNoYXJhY3RlcnMgYWx3YXlzIGJ1bXBzIHRoZSBmaWxlIHBvc2l0aW9uIGJ5IG4uCisgIC8vIEluIFdpbmRvd3MgdGV4dCBtb2RlLCBob3dldmVyLCBpdCBidW1wcyB0aGUgZmlsZSBwb3NpdGlvbiBieSBuICsgbSwKKyAgLy8gd2hlcmUgbSBpcyB0aGUgbnVtYmVyIG9mIG5ld2xpbmVzIGluIHRoZSByYW5nZS4gIFRoYXQncyBiZWNhdXNlIGFuCisgIC8vIGludGVybmFsIFxuIGNvcnJlc3BvbmRzIHRvIGFuIGV4dGVybmFsIHR3by1jaGFyYWN0ZXIgc2VxdWVuY2UuCisgIHN0cmVhbW9mZiBfTV9nZXRfb2Zmc2V0KGNoYXIqIF9fZmlyc3QsIGNoYXIqIF9fbGFzdCkgeworI2lmIGRlZmluZWQgKF9TVExQX1VOSVgpIHx8IGRlZmluZWQgKF9TVExQX01BQykKKyAgICByZXR1cm4gX19sYXN0IC0gX19maXJzdDsKKyNlbHNlIC8vIGRlZmluZWQgKF9TVExQX1dJTjMyKQorICAgIHJldHVybiAoIChfTV9vcGVubW9kZSAmIGlvc19iYXNlOjpiaW5hcnkpICE9IDAgKQorICAgICAgPyAoX19sYXN0IC0gX19maXJzdCkKKyAgICAgIDogY291bnQoX19maXJzdCwgX19sYXN0LCAnXG4nKSArIChfX2xhc3QgLSBfX2ZpcnN0KTsKKyNlbmRpZgorICB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHdlJ3JlIGluIGJpbmFyeSBtb2RlIG9yIGlmIHdlJ3JlIHVzaW5nIGFuIE9TIG9yIGZpbGUKKyAgLy8gc3lzdGVtIHdoZXJlIHRoZXJlIGlzIG5vIGRpc3RpbmN0aW9uIGJldHdlZW4gdGV4dCBhbmQgYmluYXJ5IG1vZGUuCisgIGJvb2wgX01faW5fYmluYXJ5X21vZGUoKSBjb25zdCB7CisjaWYgZGVmaW5lZCAoX1NUTFBfVU5JWCkgfHwgZGVmaW5lZCAoX1NUTFBfTUFDKSB8fCBkZWZpbmVkKF9fQkVPU19fKSB8fCBkZWZpbmVkIChfX2FtaWdhb3NfXykKKyAgICByZXR1cm4gdHJ1ZTsKKyNlbGlmIGRlZmluZWQgKF9TVExQX1dJTjMyKSB8fCBkZWZpbmVkIChfU1RMUF9WTSkKKyAgICByZXR1cm4gKF9NX29wZW5tb2RlICYgaW9zX2Jhc2U6OmJpbmFyeSkgIT0gMDsKKyNlbHNlCisjICBlcnJvciAiUG9ydCEiCisjZW5kaWYKKyAgfQorCisgIHN0YXRpYyB2b2lkIF9TX2luaXRpYWxpemUoKTsKKworcHJvdGVjdGVkOiAgICAgICAgICAgICAgICAgICAgICAvLyBTdGF0aWMgZGF0YSBtZW1iZXJzLgorICBzdGF0aWMgc2l6ZV90IF9NX3BhZ2Vfc2l6ZTsKKworcHJvdGVjdGVkOiAgICAgICAgICAgICAgICAgICAgICAvLyBEYXRhIG1lbWJlcnMuCisgIF9TVExQX2ZkIF9NX2ZpbGVfaWQ7CisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1NURElPX0lPKQorICAvLyBmb3Igc3RkaW8sIHRoZSB3aG9sZSBGSUxFKiBpcyBiZWluZyBrZXB0IGhlcmUKKyAgRklMRSogX01fZmlsZTsKKyNlbmRpZgorICBpb3NfYmFzZTo6b3Blbm1vZGUgX01fb3Blbm1vZGUgICAgIDsKKyAgdW5zaWduZWQgY2hhciAgICAgIF9NX2lzX29wZW4gICAgICA7CisgIHVuc2lnbmVkIGNoYXIgICAgICBfTV9zaG91bGRfY2xvc2UgOworICB1bnNpZ25lZCBjaGFyICAgICAgX01fcmVndWxhcl9maWxlIDsKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9XSU4zMl9JTykKKyAgX1NUTFBfZmQgX01fdmlld19pZDsKKyNlbmRpZgorCitwdWJsaWMgOgorICBzdGF0aWMgc2l6ZV90ICBfU1RMUF9DQUxMIF9fcGFnZV9zaXplKCkgeyByZXR1cm4gX01fcGFnZV9zaXplOyB9CisgIGludCAgX19vX21vZGUoKSBjb25zdCB7IHJldHVybiAoaW50KV9NX29wZW5tb2RlOyB9CisgIGJvb2wgX19pc19vcGVuKCkgICAgICBjb25zdCB7IHJldHVybiAoX01faXNfb3BlbiAhPTAgKTsgfQorICBib29sIF9fc2hvdWxkX2Nsb3NlKCkgY29uc3QgeyByZXR1cm4gKF9NX3Nob3VsZF9jbG9zZSAhPSAwKTsgfQorICBib29sIF9fcmVndWxhcl9maWxlKCkgY29uc3QgeyByZXR1cm4gKF9NX3JlZ3VsYXJfZmlsZSAhPSAwKTsgfQorICBfU1RMUF9mZCBfX2dldF9mZCgpIGNvbnN0IHsgcmV0dXJuIF9NX2ZpbGVfaWQ7IH0KK307CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ2xhc3MgYmFzaWNfZmlsZWJ1Zjw+LgorCisvLyBGb3J3YXJkIGRlY2xhcmF0aW9uIG9mIHR3byBoZWxwZXIgY2xhc3Nlcy4KK3RlbXBsYXRlIDxjbGFzcyBfVHJhaXRzPiBjbGFzcyBfTm9jb252X2lucHV0OwordGVtcGxhdGUgPGNsYXNzIF9UcmFpdHM+IGNsYXNzIF9Ob2NvbnZfb3V0cHV0OworCisvLyBUaGVyZSBpcyBhIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgdW5kZXJmbG93LCBmb3IgYmFzaWNfZmlsZWJ1ZjxjaGFyPiwKKy8vIGluIGZzdHJlYW0uY3BwLgordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2NsYXNzIF9VbmRlcmZsb3c7CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitjbGFzcyBiYXNpY19maWxlYnVmIDogcHVibGljIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+IHsKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHlwZXMuCisgIHR5cGVkZWYgX0NoYXJUICAgICAgICAgICAgICAgICAgICAgY2hhcl90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmludF90eXBlIGludF90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OnBvc190eXBlIHBvc190eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6Om9mZl90eXBlIG9mZl90eXBlOworICB0eXBlZGVmIF9UcmFpdHMgICAgICAgICAgICAgICAgICAgIHRyYWl0c190eXBlOworCisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6c3RhdGVfdHlwZSBfU3RhdGVfdHlwZTsKKyAgdHlwZWRlZiBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiBfQmFzZTsKKyAgdHlwZWRlZiBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz4gX1NlbGY7CisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29uc3RydWN0b3JzLCBkZXN0cnVjdG9yLgorICBiYXNpY19maWxlYnVmKCk7CisgIH5iYXNpY19maWxlYnVmKCk7CisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3BlbmluZyBhbmQgY2xvc2luZyBmaWxlcy4KKyAgYm9vbCBpc19vcGVuKCkgY29uc3QgeyByZXR1cm4gX01fYmFzZS5fX2lzX29wZW4oKTsgfQorCisgIF9TZWxmKiBvcGVuKGNvbnN0IGNoYXIqIF9fcywgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbSkgeworICAgIHJldHVybiBfTV9iYXNlLl9NX29wZW4oX19zLCBfX20pID8gdGhpcyA6IDA7CisgIH0KKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQorICAvLyBUaGVzZSB0d28gdmVyc2lvbiBvZiBvcGVuKCkgYW5kIGZpbGUgZGVzY3JpcHRvciBnZXR0ZXIgYXJlIGV4dGVuc2lvbnMuCisgIF9TZWxmKiBvcGVuKGNvbnN0IGNoYXIqIF9fcywgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbSwKKyAgICAgICAgICAgICAgbG9uZyBfX3Byb3RlY3Rpb24pIHsKKyAgICByZXR1cm4gX01fYmFzZS5fTV9vcGVuKF9fcywgX19tLCBfX3Byb3RlY3Rpb24pID8gdGhpcyA6IDA7CisgIH0KKworICBfU1RMUF9mZCBmZCgpIGNvbnN0IHsgcmV0dXJuIF9NX2Jhc2UuX19nZXRfZmQoKTsgfQorCisgIF9TZWxmKiBvcGVuKGludCBfX2lkLCBpb3NfYmFzZTo6b3Blbm1vZGUgX0luaXRfbW9kZSA9IGlvc19iYXNlOjpfX2RlZmF1bHRfbW9kZSkgeworICAgIHJldHVybiB0aGlzLT5fTV9vcGVuKF9faWQsIF9Jbml0X21vZGUpOworICB9CisKKyMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9XSU4zMl9JTykKKyAgX1NlbGYqIG9wZW4oX1NUTFBfZmQgX19pZCwgaW9zX2Jhc2U6Om9wZW5tb2RlIF9Jbml0X21vZGUgPSBpb3NfYmFzZTo6X19kZWZhdWx0X21vZGUpIHsKKyAgICByZXR1cm4gX01fYmFzZS5fTV9vcGVuKF9faWQsIF9Jbml0X21vZGUpID8gdGhpcyA6IDA7CisgIH0KKyMgIGVuZGlmIC8qIF9TVExQX1VTRV9XSU4zMl9JTyAqLworCisjZW5kaWYKKworICBfU2VsZiogX01fb3BlbihpbnQgX19pZCwgaW9zX2Jhc2U6Om9wZW5tb2RlIF9Jbml0X21vZGUgPSBpb3NfYmFzZTo6X19kZWZhdWx0X21vZGUpIHsKKyAgICByZXR1cm4gX01fYmFzZS5fTV9vcGVuKF9faWQsIF9Jbml0X21vZGUpID8gdGhpcyA6IDA7CisgIH0KKworICBfU2VsZiogY2xvc2UoKTsKKworcHJvdGVjdGVkOiAgICAgICAgICAgICAgICAgICAgICAvLyBWaXJ0dWFsIGZ1bmN0aW9ucyBmcm9tIGJhc2ljX3N0cmVhbWJ1Zi4KKyAgdmlydHVhbCBzdHJlYW1zaXplIHNob3dtYW55YygpOworICB2aXJ0dWFsIGludF90eXBlIHVuZGVyZmxvdygpOworCisgIHZpcnR1YWwgaW50X3R5cGUgcGJhY2tmYWlsKGludF90eXBlID0gdHJhaXRzX3R5cGU6OmVvZigpKTsKKyAgdmlydHVhbCBpbnRfdHlwZSBvdmVyZmxvdyhpbnRfdHlwZSA9IHRyYWl0c190eXBlOjplb2YoKSk7CisKKyAgdmlydHVhbCBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogc2V0YnVmKGNoYXJfdHlwZSosIHN0cmVhbXNpemUpOworICB2aXJ0dWFsIHBvc190eXBlIHNlZWtvZmYob2ZmX3R5cGUsIGlvc19iYXNlOjpzZWVrZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Om9wZW5tb2RlID0gaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6Om91dCk7CisgIHZpcnR1YWwgcG9zX3R5cGUgc2Vla3Bvcyhwb3NfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjpvcGVubW9kZSA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpOworCisgIHZpcnR1YWwgaW50IHN5bmMoKTsKKyAgdmlydHVhbCB2b2lkIGltYnVlKGNvbnN0IGxvY2FsZSYpOworCitwcml2YXRlOiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhlbHBlciBmdW5jdGlvbnMuCisKKyAgLy8gUHJlY29uZGl0aW9uOiB3ZSBhcmUgY3VycmVudGx5IGluIHB1dGJhY2sgaW5wdXQgbW9kZS4gIEVmZmVjdDoKKyAgLy8gc3dpdGNoZXMgYmFjayB0byBvcmRpbmFyeSBpbnB1dCBtb2RlLgorICB2b2lkIF9NX2V4aXRfcHV0YmFja19tb2RlKCkgeworICAgIHRoaXMtPnNldGcoX01fc2F2ZWRfZWJhY2ssIF9NX3NhdmVkX2dwdHIsIF9NX3NhdmVkX2VncHRyKTsKKyAgICBfTV9pbl9wdXRiYWNrX21vZGUgPSBmYWxzZTsKKyAgfQorICBib29sIF9NX3N3aXRjaF90b19pbnB1dF9tb2RlKCk7CisgIHZvaWQgX01fZXhpdF9pbnB1dF9tb2RlKCk7CisgIGJvb2wgX01fc3dpdGNoX3RvX291dHB1dF9tb2RlKCk7CisKKyAgaW50X3R5cGUgX01faW5wdXRfZXJyb3IoKTsKKyAgaW50X3R5cGUgX01fdW5kZXJmbG93X2F1eCgpOworICBmcmllbmQgY2xhc3MgX1VuZGVyZmxvdzxfQ2hhclQsIF9UcmFpdHM+OworCisgIGludF90eXBlIF9NX291dHB1dF9lcnJvcigpOworICBib29sIF9NX3Vuc2hpZnQoKTsKKworICBib29sIF9NX2FsbG9jYXRlX2J1ZmZlcnMoX0NoYXJUKiBfX2J1Ziwgc3RyZWFtc2l6ZSBfX24pOworICBib29sIF9NX2FsbG9jYXRlX2J1ZmZlcnMoKTsKKyAgdm9pZCBfTV9kZWFsbG9jYXRlX2J1ZmZlcnMoKTsKKworICBwb3NfdHlwZSBfTV9zZWVrX3JldHVybihvZmZfdHlwZSBfX29mZiwgX1N0YXRlX3R5cGUgX19zdGF0ZSkgeworICAgIGlmIChfX29mZiAhPSAtMSkgeworICAgICAgaWYgKF9NX2luX2lucHV0X21vZGUpCisgICAgICAgIF9NX2V4aXRfaW5wdXRfbW9kZSgpOworICAgICAgX01faW5faW5wdXRfbW9kZSA9IGZhbHNlOworICAgICAgX01faW5fb3V0cHV0X21vZGUgPSBmYWxzZTsKKyAgICAgIF9NX2luX3B1dGJhY2tfbW9kZSA9IGZhbHNlOworICAgICAgX01faW5fZXJyb3JfbW9kZSA9IGZhbHNlOworICAgICAgdGhpcy0+c2V0ZygwLCAwLCAwKTsKKyAgICAgIHRoaXMtPnNldHAoMCwgMCk7CisgICAgfQorCisgICAgcG9zX3R5cGUgX19yZXN1bHQoX19vZmYpOworICAgIF9fcmVzdWx0LnN0YXRlKF9fc3RhdGUpOworICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgfQorCisgIGJvb2wgX01fc2Vla19pbml0KGJvb2wgX19kb191bnNoaWZ0KTsKKworICB2b2lkIF9NX3NldHVwX2NvZGVjdnQoY29uc3QgbG9jYWxlJiwgYm9vbCBfX29uX2ltYnVlID0gdHJ1ZSk7CisKK3ByaXZhdGU6ICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGF0YSBtZW1iZXJzIHVzZWQgaW4gYWxsIG1vZGVzLgorCisgIF9GaWxlYnVmX2Jhc2UgX01fYmFzZTsKKworcHJpdmF0ZTogICAgICAgICAgICAgICAgICAgICAgICAvLyBMb2NhbGUtcmVsYXRlZCBpbmZvcm1hdGlvbi4KKworICB1bnNpZ25lZCBjaGFyIF9NX2NvbnN0YW50X3dpZHRoOworICB1bnNpZ25lZCBjaGFyIF9NX2Fsd2F5c19ub2NvbnY7CisKKyAgLy8gcHJpdmF0ZTogICAgICAgICAgICAgICAgICAgICAgICAvLyBNb2RlIGZsYWdzLgorICB1bnNpZ25lZCBjaGFyIF9NX2ludF9idWZfZHluYW1pYzsgIC8vIFRydWUgaWYgaW50ZXJuYWwgYnVmZmVyIGlzIGhlYXAgYWxsb2NhdGVkLAorICAvLyBmYWxzZSBpZiBpdCB3YXMgc3VwcGxpZWQgYnkgdGhlIHVzZXIuCisgIHVuc2lnbmVkIGNoYXIgX01faW5faW5wdXRfbW9kZTsKKyAgdW5zaWduZWQgY2hhciBfTV9pbl9vdXRwdXRfbW9kZTsKKyAgdW5zaWduZWQgY2hhciBfTV9pbl9lcnJvcl9tb2RlOworICB1bnNpZ25lZCBjaGFyIF9NX2luX3B1dGJhY2tfbW9kZTsKKworICAvLyBJbnRlcm5hbCBidWZmZXI6IGNoYXJhY3RlcnMgc2VlbiBieSB0aGUgZmlsZWJ1ZidzIGNsaWVudHMuCisgIF9DaGFyVCogX01faW50X2J1ZjsKKyAgX0NoYXJUKiBfTV9pbnRfYnVmX0VPUzsKKworICAvLyBFeHRlcm5hbCBidWZmZXI6IGNoYXJhY3RlcnMgY29ycmVzcG9uZGluZyB0byB0aGUgZXh0ZXJuYWwgZmlsZS4KKyAgY2hhciogX01fZXh0X2J1ZjsKKyAgY2hhciogX01fZXh0X2J1Zl9FT1M7CisKKyAgLy8gVGhlIHJhbmdlIFtfTV9leHRfYnVmLCBfTV9leHRfYnVmX2NvbnZlcnRlZCkgY29udGFpbnMgdGhlIGV4dGVybmFsCisgIC8vIGNoYXJhY3RlcnMgY29ycmVzcG9uZGluZyB0byB0aGUgc2VxdWVuY2UgaW4gdGhlIGludGVybmFsIGJ1ZmZlci4gIFRoZQorICAvLyByYW5nZSBbX01fZXh0X2J1Zl9jb252ZXJ0ZWQsIF9NX2V4dF9idWZfZW5kKSBjb250YWlucyBjaGFyYWN0ZXJzIHRoYXQKKyAgLy8gaGF2ZSBiZWVuIHJlYWQgaW50byB0aGUgZXh0ZXJuYWwgYnVmZmVyIGJ1dCBoYXZlIG5vdCBiZWVuIGNvbnZlcnRlZAorICAvLyB0byBhbiBpbnRlcm5hbCBzZXF1ZW5jZS4KKyAgY2hhciogX01fZXh0X2J1Zl9jb252ZXJ0ZWQ7CisgIGNoYXIqIF9NX2V4dF9idWZfZW5kOworCisgIC8vIFN0YXRlIGNvcnJlc3BvbmRpbmcgdG8gYmVnaW5uaW5nIG9mIGludGVybmFsIGJ1ZmZlci4KKyAgX1N0YXRlX3R5cGUgX01fc3RhdGU7CisKK3ByaXZhdGU6ICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGF0YSBtZW1iZXJzIHVzZWQgb25seSBpbiBpbnB1dCBtb2RlLgorCisgIC8vIFNpbWlsYXIgdG8gX01fc3RhdGUgZXhjZXB0IHRoYXQgaXQgY29ycmVzcG9uZHMgdG8KKyAgLy8gdGhlIGVuZCBvZiB0aGUgaW50ZXJuYWwgYnVmZmVyIGluc3RlYWQgb2YgdGhlIGJlZ2lubmluZy4KKyAgX1N0YXRlX3R5cGUgX01fZW5kX3N0YXRlOworCisgIC8vIFRoaXMgaXMgYSBudWxsIHBvaW50ZXIgdW5sZXNzIHdlIGFyZSBpbiBtbWFwIGlucHV0IG1vZGUuCisgIHZvaWQqICAgICBfTV9tbWFwX2Jhc2U7CisgIHN0cmVhbW9mZiBfTV9tbWFwX2xlbjsKKworcHJpdmF0ZTogICAgICAgICAgICAgICAgICAgICAgICAvLyBEYXRhIG1lbWJlcnMgdXNlZCBvbmx5IGluIHB1dGJhY2sgbW9kZS4KKyAgX0NoYXJUKiBfTV9zYXZlZF9lYmFjazsKKyAgX0NoYXJUKiBfTV9zYXZlZF9ncHRyOworICBfQ2hhclQqIF9NX3NhdmVkX2VncHRyOworCisgIHR5cGVkZWYgY29kZWN2dDxfQ2hhclQsIGNoYXIsIF9TdGF0ZV90eXBlPiBfQ29kZWN2dDsKKyAgY29uc3QgX0NvZGVjdnQqIF9NX2NvZGVjdnQ7CisKKyAgaW50IF9NX3dpZHRoOyAgICAgICAgICAgICAgICAgLy8gV2lkdGggb2YgdGhlIGVuY29kaW5nIChpZiBjb25zdGFudCksIGVsc2UgMQorICBpbnQgX01fbWF4X3dpZHRoOyAgICAgICAgICAgICAvLyBMYXJnZXN0IHBvc3NpYmxlIHdpZHRoIG9mIHNpbmdsZSBjaGFyYWN0ZXIuCisKKworICBlbnVtIHsgX1NfcGJhY2tfYnVmX3NpemUgPSA4IH07CisgIF9DaGFyVCBfTV9wYmFja19idWZbX1NfcGJhY2tfYnVmX3NpemVdOworCisgIC8vIGZvciBfTm9jb252X291dHB1dAorcHVibGljOgorICBib29sIF9NX3dyaXRlKGNoYXIqIF9fYnVmLCAgcHRyZGlmZl90IF9fbikge3JldHVybiBfTV9iYXNlLl9NX3dyaXRlKF9fYnVmLCBfX24pOyB9CisKK3B1YmxpYzoKKyAgaW50X3R5cGUKKyAgX01fZG9fbm9jb252X2lucHV0KCkgeworICAgIF9NX2V4dF9idWZfY29udmVydGVkID0gX01fZXh0X2J1Zl9lbmQ7CisgICAgLyogdGhpcy0+ICovIF9CYXNlOjpzZXRnKChjaGFyX3R5cGUqKV9NX2V4dF9idWYsIChjaGFyX3R5cGUqKV9NX2V4dF9idWYsIChjaGFyX3R5cGUqKV9NX2V4dF9idWZfZW5kKTsKKyAgICByZXR1cm4gdHJhaXRzX3R5cGU6OnRvX2ludF90eXBlKCpfTV9leHRfYnVmKTsKKyAgfQorfTsKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9URU1QTEFURV9FWFBPUlQpCitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgYmFzaWNfZmlsZWJ1ZjxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+OworIyAgaWYgISBkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQorX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIGJhc2ljX2ZpbGVidWY8d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPjsKKyMgIGVuZGlmCisjZW5kaWYgLyogX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCAqLworCisvLworLy8gVGhpcyBjbGFzcyBoYWQgdG8gYmUgZGVzaWduZWQgdmVyeSBjYXJlZnVsbHkgdG8gd29yaworLy8gd2l0aCBWaXN1YWwgQysrLgorLy8KK3RlbXBsYXRlIDxjbGFzcyBfVHJhaXRzPgorY2xhc3MgX05vY29udl9vdXRwdXQgeworcHVibGljOgorICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmNoYXJfdHlwZSBjaGFyX3R5cGU7CisgIHN0YXRpYyBib29sICBfU1RMUF9DQUxMIF9NX2RvaXQoYmFzaWNfZmlsZWJ1ZjxjaGFyX3R5cGUsIF9UcmFpdHMgPiosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl90eXBlKiwgY2hhcl90eXBlKikKKyAgeyByZXR1cm4gZmFsc2U7IH0KK307CisKK19TVExQX1RFTVBMQVRFX05VTEwKK2NsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIF9Ob2NvbnZfb3V0cHV0PCBjaGFyX3RyYWl0czxjaGFyPiA+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGJvb2wgIF9TVExQX0NBTEwKKyAgX01fZG9pdChiYXNpY19maWxlYnVmPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4qIF9fYnVmLAorICAgICAgICAgIGNoYXIqIF9fZmlyc3QsIGNoYXIqIF9fbGFzdCkgeworICAgIHB0cmRpZmZfdCBfX24gPSBfX2xhc3QgLSBfX2ZpcnN0OworICAgIHJldHVybiAoX19idWYtPl9NX3dyaXRlKF9fZmlyc3QsIF9fbikpOworICB9Cit9OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGJhc2ljX2ZpbGVidWY8PiBoZWxwZXIgZnVuY3Rpb25zLgorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3Igc3dpdGNoaW5nIGJldHdlZW4gbW9kZXMuCisKKy8vCisvLyBUaGlzIGNsYXNzIGhhZCB0byBiZSBkZXNpZ25lZCB2ZXJ5IGNhcmVmdWxseSB0byB3b3JrCisvLyB3aXRoIFZpc3VhbCBDKysuCisvLwordGVtcGxhdGUgPGNsYXNzIF9UcmFpdHM+CitjbGFzcyBfTm9jb252X2lucHV0IHsKK3B1YmxpYzoKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjppbnRfdHlwZSBpbnRfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpjaGFyX3R5cGUgY2hhcl90eXBlOworCisgIHN0YXRpYyBpbmxpbmUgaW50X3R5cGUgX1NUTFBfQ0FMTAorICBfTV9kb2l0KGJhc2ljX2ZpbGVidWY8Y2hhcl90eXBlLCBfVHJhaXRzPiopCisgIHsgcmV0dXJuIF9UcmFpdHM6OmVvZigpOyB9Cit9OworCitfU1RMUF9URU1QTEFURV9OVUxMCitjbGFzcyBfTm9jb252X2lucHV0PGNoYXJfdHJhaXRzPGNoYXI+ID4geworcHVibGljOgorICBzdGF0aWMgaW5saW5lIGludCBfU1RMUF9DQUxMCisgIF9NX2RvaXQoYmFzaWNfZmlsZWJ1ZjxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+KiBfX2J1ZikgeworICAgIHJldHVybiBfX2J1Zi0+X01fZG9fbm9jb252X2lucHV0KCk7CisgIH0KK307CisKKy8vIHVuZGVyZmxvdygpIG1heSBiZSBjYWxsZWQgZm9yIG9uZSBvZiB0d28gcmVhc29ucy4gICgxKSBXZSd2ZQorLy8gYmVlbiBnb2luZyB0aHJvdWdoIHRoZSBzcGVjaWFsIHB1dGJhY2sgYnVmZmVyLCBhbmQgd2UgbmVlZCB0byBtb3ZlIGJhY2sKKy8vIHRvIHRoZSByZWd1bGFyIGludGVybmFsIGJ1ZmZlci4gICgyKSBXZSd2ZSBleGhhdXN0ZWQgdGhlIGludGVybmFsIGJ1ZmZlciwKKy8vIGFuZCB3ZSBuZWVkIHRvIHJlcGxlbnRpc2ggaXQuCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorY2xhc3MgX1VuZGVyZmxvdyB7CitwdWJsaWM6CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6aW50X3R5cGUgaW50X3R5cGU7CisgIHR5cGVkZWYgX1RyYWl0cyAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3R5cGU7CisKKyAgLy8gVGhlcmUgaXMgYSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIHVuZGVyZmxvdywgZm9yIGJhc2ljX2ZpbGVidWY8Y2hhcj4sCisgIC8vIGluIGZzdHJlYW0uY3BwLgorICBzdGF0aWMgaW50X3R5cGUgX1NUTFBfQ0FMTCBfTV9kb2l0KGJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPiogX190aGlzKSB7CisgICAgaWYgKCFfX3RoaXMtPl9NX2luX2lucHV0X21vZGUpIHsKKyAgICAgIGlmICghX190aGlzLT5fTV9zd2l0Y2hfdG9faW5wdXRfbW9kZSgpKQorICAgICAgICByZXR1cm4gdHJhaXRzX3R5cGU6OmVvZigpOworICAgIH0KKyAgICBlbHNlIGlmIChfX3RoaXMtPl9NX2luX3B1dGJhY2tfbW9kZSkgeworICAgICAgX190aGlzLT5fTV9leGl0X3B1dGJhY2tfbW9kZSgpOworICAgICAgaWYgKF9fdGhpcy0+Z3B0cigpICE9IF9fdGhpcy0+ZWdwdHIoKSkgeworICAgICAgICBpbnRfdHlwZSBfX2MgPSB0cmFpdHNfdHlwZTo6dG9faW50X3R5cGUoKl9fdGhpcy0+Z3B0cigpKTsKKyAgICAgICAgcmV0dXJuIF9fYzsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gX190aGlzLT5fTV91bmRlcmZsb3dfYXV4KCk7CisgIH0KK307CisKKy8vIFNwZWNpYWxpemF0aW9uIG9mIHVuZGVyZmxvdzogaWYgdGhlIGNoYXJhY3RlciB0eXBlIGlzIGNoYXIsIG1heWJlCisvLyB3ZSBjYW4gdXNlIG1tYXAgaW5zdGVhZCBvZiByZWFkLgorX1NUTFBfVEVNUExBVEVfTlVMTAorY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgX1VuZGVyZmxvdzwgY2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPgoreworICBwdWJsaWM6CisgICAgdHlwZWRlZiBjaGFyX3RyYWl0czxjaGFyPjo6aW50X3R5cGUgaW50X3R5cGU7CisgICAgdHlwZWRlZiBjaGFyX3RyYWl0czxjaGFyPiB0cmFpdHNfdHlwZTsKKyAgICBzdGF0aWMgaW50X3R5cGUgX1NUTFBfQ0FMTCBfTV9kb2l0KGJhc2ljX2ZpbGVidWY8Y2hhciwgdHJhaXRzX3R5cGUgPiogX190aGlzKTsKK307CisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBfVW5kZXJmbG93PHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID47CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDbGFzcyBiYXNpY19pZnN0cmVhbTw+CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitjbGFzcyBiYXNpY19pZnN0cmVhbSA6IHB1YmxpYyBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4geworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUeXBlcworICB0eXBlZGVmIF9DaGFyVCAgICAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjppbnRfdHlwZSBpbnRfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpwb3NfdHlwZSBwb3NfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpvZmZfdHlwZSBvZmZfdHlwZTsKKyAgdHlwZWRlZiBfVHJhaXRzICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdHlwZTsKKworICB0eXBlZGVmIGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+ICAgICAgICAgICAgICAgIF9CYXNpY19pb3M7CisgIHR5cGVkZWYgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICAgICAgICAgICAgX0Jhc2U7CisgIHR5cGVkZWYgYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+ICAgICAgICAgICAgX0J1ZjsKKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25zdHJ1Y3RvcnMsIGRlc3RydWN0b3IuCisKKyAgYmFzaWNfaWZzdHJlYW0oKSA6CisgICAgYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz4oKSwgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPigwKSwgX01fYnVmKCkgeworICAgICAgdGhpcy0+aW5pdCgmX01fYnVmKTsKKyAgfQorCisgIGV4cGxpY2l0IGJhc2ljX2lmc3RyZWFtKGNvbnN0IGNoYXIqIF9fcywgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kID0gaW9zX2Jhc2U6OmluKSA6CisgICAgYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz4oKSwgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPigwKSwKKyAgICBfTV9idWYoKSB7CisgICAgICB0aGlzLT5pbml0KCZfTV9idWYpOworICAgICAgaWYgKCFfTV9idWYub3BlbihfX3MsIF9fbW9kIHwgaW9zX2Jhc2U6OmluKSkKKyAgICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworICB9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKKyAgZXhwbGljaXQgYmFzaWNfaWZzdHJlYW0oaW50IF9faWQsIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZCA9IGlvc19iYXNlOjppbikgOgorICAgIGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+KCksICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4oMCksIF9NX2J1ZigpIHsKKyAgICB0aGlzLT5pbml0KCZfTV9idWYpOworICAgIGlmICghX01fYnVmLm9wZW4oX19pZCwgX19tb2QgfCBpb3NfYmFzZTo6aW4pKQorICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworICB9CisgIGJhc2ljX2lmc3RyZWFtKGNvbnN0IGNoYXIqIF9fcywgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbSwKKyAgICAgbG9uZyBfX3Byb3RlY3Rpb24pIDoKKyAgICBiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPigpLCAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+KDApLCBfTV9idWYoKSB7CisgICAgdGhpcy0+aW5pdCgmX01fYnVmKTsKKyAgICBpZiAoIV9NX2J1Zi5vcGVuKF9fcywgX19tIHwgaW9zX2Jhc2U6OmluLCBfX3Byb3RlY3Rpb24pKQorICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworICB9CisKKyMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9XSU4zMl9JTykKKyAgZXhwbGljaXQgYmFzaWNfaWZzdHJlYW0oX1NUTFBfZmQgX19pZCwgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kID0gaW9zX2Jhc2U6OmluKSA6CisgICAgYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz4oKSwgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPigwKSwgX01fYnVmKCkgeworICAgIHRoaXMtPmluaXQoJl9NX2J1Zik7CisgICAgaWYgKCFfTV9idWYub3BlbihfX2lkLCBfX21vZCB8IGlvc19iYXNlOjppbikpCisgICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7CisgIH0KKyMgIGVuZGlmIC8qIF9TVExQX1VTRV9XSU4zMl9JTyAqLworI2VuZGlmCisKKyAgfmJhc2ljX2lmc3RyZWFtKCkge30KKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGaWxlIGFuZCBidWZmZXIgb3BlcmF0aW9ucy4KKyAgYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiByZGJ1ZigpIGNvbnN0CisgICAgeyByZXR1cm4gX19DT05TVF9DQVNUKF9CdWYqLCZfTV9idWYpOyB9CisKKyAgYm9vbCBpc19vcGVuKCkgeworICAgIHJldHVybiB0aGlzLT5yZGJ1ZigpLT5pc19vcGVuKCk7CisgIH0KKworICB2b2lkIG9wZW4oY29uc3QgY2hhciogX19zLCBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2QgPSBpb3NfYmFzZTo6aW4pIHsKKyAgICBpZiAoIXRoaXMtPnJkYnVmKCktPm9wZW4oX19zLCBfX21vZCB8IGlvc19iYXNlOjppbikpCisgICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7CisgIH0KKworICB2b2lkIGNsb3NlKCkgeworICAgIGlmICghdGhpcy0+cmRidWYoKS0+Y2xvc2UoKSkKKyAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKKyAgfQorCitwcml2YXRlOgorICBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz4gX01fYnVmOworfTsKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENsYXNzIGJhc2ljX29mc3RyZWFtPD4KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2NsYXNzIGJhc2ljX29mc3RyZWFtIDogcHVibGljIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiB7CitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR5cGVzCisgIHR5cGVkZWYgX0NoYXJUICAgICAgICAgICAgICAgICAgICAgY2hhcl90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmludF90eXBlIGludF90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OnBvc190eXBlIHBvc190eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6Om9mZl90eXBlIG9mZl90eXBlOworICB0eXBlZGVmIF9UcmFpdHMgICAgICAgICAgICAgICAgICAgIHRyYWl0c190eXBlOworCisgIHR5cGVkZWYgYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz4gICAgICAgICAgICAgICAgX0Jhc2ljX2lvczsKKyAgdHlwZWRlZiBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gICAgICAgICAgICBfQmFzZTsKKyAgdHlwZWRlZiBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz4gICAgICAgICAgICBfQnVmOworCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnN0cnVjdG9ycywgZGVzdHJ1Y3Rvci4KKyAgYmFzaWNfb2ZzdHJlYW0oKSA6CisgICAgYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz4oKSwKKyAgICBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4oMCksIF9NX2J1ZigpIHsKKyAgICAgIHRoaXMtPmluaXQoJl9NX2J1Zik7CisgIH0KKyAgZXhwbGljaXQgYmFzaWNfb2ZzdHJlYW0oY29uc3QgY2hhciogX19zLCBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2QgPSBpb3NfYmFzZTo6b3V0KQorICAgIDogYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz4oKSwgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+KDApLCBfTV9idWYoKSB7CisgICAgdGhpcy0+aW5pdCgmX01fYnVmKTsKKyAgICBpZiAoIV9NX2J1Zi5vcGVuKF9fcywgX19tb2QgfCBpb3NfYmFzZTo6b3V0KSkKKyAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKKyAgfQorCisjaWYgIWRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpCisgIGV4cGxpY2l0IGJhc2ljX29mc3RyZWFtKGludCBfX2lkLCBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2QgPSBpb3NfYmFzZTo6b3V0KQorICAgIDogYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz4oKSwgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+KDApLAorICAgIF9NX2J1ZigpIHsKKyAgIHRoaXMtPmluaXQoJl9NX2J1Zik7CisgICBpZiAoIV9NX2J1Zi5vcGVuKF9faWQsIF9fbW9kIHwgaW9zX2Jhc2U6Om91dCkpCisgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKKyAgfQorICBiYXNpY19vZnN0cmVhbShjb25zdCBjaGFyKiBfX3MsIGlvc19iYXNlOjpvcGVubW9kZSBfX20sIGxvbmcgX19wcm90ZWN0aW9uKSA6CisgICAgYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz4oKSwgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPigwKSwgX01fYnVmKCkgeworICAgIHRoaXMtPmluaXQoJl9NX2J1Zik7CisgICAgaWYgKCFfTV9idWYub3BlbihfX3MsIF9fbSB8IGlvc19iYXNlOjpvdXQsIF9fcHJvdGVjdGlvbikpCisgICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7CisgIH0KKyMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9XSU4zMl9JTykKKyAgZXhwbGljaXQgYmFzaWNfb2ZzdHJlYW0oX1NUTFBfZmQgX19pZCwgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kID0gaW9zX2Jhc2U6Om91dCkKKyAgICA6IGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+KCksIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPigwKSwKKyAgICBfTV9idWYoKSB7CisgICB0aGlzLT5pbml0KCZfTV9idWYpOworICAgaWYgKCFfTV9idWYub3BlbihfX2lkLCBfX21vZCB8IGlvc19iYXNlOjpvdXQpKQorICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7CisgIH0KKyMgIGVuZGlmIC8qIF9TVExQX1VTRV9XSU4zMl9JTyAqLworI2VuZGlmCisKKyAgfmJhc2ljX29mc3RyZWFtKCkge30KKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGaWxlIGFuZCBidWZmZXIgb3BlcmF0aW9ucy4KKyAgYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiByZGJ1ZigpIGNvbnN0CisgICAgeyByZXR1cm4gX19DT05TVF9DQVNUKF9CdWYqLCZfTV9idWYpOyB9CisKKyAgYm9vbCBpc19vcGVuKCkgeworICAgIHJldHVybiB0aGlzLT5yZGJ1ZigpLT5pc19vcGVuKCk7CisgIH0KKworICB2b2lkIG9wZW4oY29uc3QgY2hhciogX19zLCBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2Q9IGlvc19iYXNlOjpvdXQpIHsKKyAgICBpZiAoIXRoaXMtPnJkYnVmKCktPm9wZW4oX19zLCBfX21vZCB8IGlvc19iYXNlOjpvdXQpKQorICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworICB9CisKKyAgdm9pZCBjbG9zZSgpIHsKKyAgICBpZiAoIXRoaXMtPnJkYnVmKCktPmNsb3NlKCkpCisgICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7CisgIH0KKworcHJpdmF0ZToKKyAgYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+IF9NX2J1ZjsKK307CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDbGFzcyBiYXNpY19mc3RyZWFtPD4KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2NsYXNzIGJhc2ljX2ZzdHJlYW0gOiBwdWJsaWMgYmFzaWNfaW9zdHJlYW08X0NoYXJULCBfVHJhaXRzPiB7CitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR5cGVzCisgIHR5cGVkZWYgX0NoYXJUICAgICAgICAgICAgICAgICAgICAgY2hhcl90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmludF90eXBlIGludF90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OnBvc190eXBlIHBvc190eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6Om9mZl90eXBlIG9mZl90eXBlOworICB0eXBlZGVmIF9UcmFpdHMgICAgICAgICAgICAgICAgICAgIHRyYWl0c190eXBlOworCisgIHR5cGVkZWYgYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz4gICAgICAgICAgICAgICAgX0Jhc2ljX2lvczsKKyAgdHlwZWRlZiBiYXNpY19pb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICAgICAgICAgICBfQmFzZTsKKyAgdHlwZWRlZiBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz4gICAgICAgICAgICBfQnVmOworCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnN0cnVjdG9ycywgZGVzdHJ1Y3Rvci4KKworICBiYXNpY19mc3RyZWFtKCkKKyAgICA6IGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+KCksIGJhc2ljX2lvc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4oMCksIF9NX2J1ZigpIHsKKyAgICAgIHRoaXMtPmluaXQoJl9NX2J1Zik7CisgIH0KKworICBleHBsaWNpdCBiYXNpY19mc3RyZWFtKGNvbnN0IGNoYXIqIF9fcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2QgPSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0KSA6CisgICAgYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz4oKSwgYmFzaWNfaW9zdHJlYW08X0NoYXJULCBfVHJhaXRzPigwKSwgX01fYnVmKCkgeworICAgICAgdGhpcy0+aW5pdCgmX01fYnVmKTsKKyAgICAgIGlmICghX01fYnVmLm9wZW4oX19zLCBfX21vZCkpCisgICAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKKyAgfQorCisjaWYgIWRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpCisgIGV4cGxpY2l0IGJhc2ljX2ZzdHJlYW0oaW50IF9faWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kID0gaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6Om91dCkgOgorICAgIGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+KCksIGJhc2ljX2lvc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4oMCksIF9NX2J1ZigpIHsKKyAgICB0aGlzLT5pbml0KCZfTV9idWYpOworICAgIGlmICghX01fYnVmLm9wZW4oX19pZCwgX19tb2QpKQorICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworICB9CisgIGJhc2ljX2ZzdHJlYW0oY29uc3QgY2hhciogX19zLCBpb3NfYmFzZTo6b3Blbm1vZGUgX19tLCBsb25nIF9fcHJvdGVjdGlvbikgOgorICAgIGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+KCksICBiYXNpY19pb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+KDApLCBfTV9idWYoKSB7CisgICAgdGhpcy0+aW5pdCgmX01fYnVmKTsKKyAgICBpZiAoIV9NX2J1Zi5vcGVuKF9fcywgX19tLCBfX3Byb3RlY3Rpb24pKQorICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworICB9CisjICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfV0lOMzJfSU8pCisgIGV4cGxpY2l0IGJhc2ljX2ZzdHJlYW0oX1NUTFBfZmQgX19pZCwKKyAgICBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2QgPSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0KSA6CisgICAgYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz4oKSwgIGJhc2ljX2lvc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4oMCksIF9NX2J1ZigpIHsKKyAgICB0aGlzLT5pbml0KCZfTV9idWYpOworICAgIGlmICghX01fYnVmLm9wZW4oX19pZCwgX19tb2QpKQorICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworICB9CisjICBlbmRpZiAvKiBfU1RMUF9VU0VfV0lOMzJfSU8gKi8KKyNlbmRpZgorICB+YmFzaWNfZnN0cmVhbSgpIHt9CisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlsZSBhbmQgYnVmZmVyIG9wZXJhdGlvbnMuCisKKyAgYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiByZGJ1ZigpIGNvbnN0CisgICAgeyByZXR1cm4gX19DT05TVF9DQVNUKF9CdWYqLCZfTV9idWYpOyB9CisKKyAgYm9vbCBpc19vcGVuKCkgeworICAgIHJldHVybiB0aGlzLT5yZGJ1ZigpLT5pc19vcGVuKCk7CisgIH0KKworICB2b2lkIG9wZW4oY29uc3QgY2hhciogX19zLAorICAgICAgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kID0KKyAgICAgIGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpIHsKKyAgICBpZiAoIXRoaXMtPnJkYnVmKCktPm9wZW4oX19zLCBfX21vZCkpCisgICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7CisgIH0KKworICB2b2lkIGNsb3NlKCkgeworICAgIGlmICghdGhpcy0+cmRidWYoKS0+Y2xvc2UoKSkKKyAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKKyAgfQorCitwcml2YXRlOgorICBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz4gX01fYnVmOworCisjaWYgZGVmaW5lZCAoX1NUTFBfTVNWQykgJiYgKF9TVExQX01TVkMgPj0gMTMwMCAmJiBfU1RMUF9NU1ZDIDw9IDEzMTApCisgIHR5cGVkZWYgYmFzaWNfZnN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+IF9TZWxmOworICAvL2V4cGxpY2l0ZWx5IGRlZmluZWQgYXMgcHJpdmF0ZSB0byBhdm9pZCB3YXJuaW5nczoKKyAgYmFzaWNfZnN0cmVhbShfU2VsZiBjb25zdCYpOworICBfU2VsZiYgb3BlcmF0b3IgPSAoX1NlbGYgY29uc3QmKTsKKyNlbmRpZgorfTsKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjaWYgZGVmaW5lZCAoX1NUTFBfRVhQT1NFX1NUUkVBTV9JTVBMRU1FTlRBVElPTikgJiYgIWRlZmluZWQgKF9TVExQX0xJTktfVElNRV9JTlNUQU5USUFUSU9OKQorIyAgaW5jbHVkZSA8c3RsL19mc3RyZWFtLmM+CisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUKQorX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIGJhc2ljX2lmc3RyZWFtPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID47CitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgYmFzaWNfb2ZzdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPjsKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBiYXNpY19mc3RyZWFtPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID47CisjICBpZiAhIGRlZmluZWQgKF9TVExQX05PX1dDSEFSX1QpCitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgYmFzaWNfaWZzdHJlYW08d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPjsKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBiYXNpY19vZnN0cmVhbTx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+OworX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIGJhc2ljX2ZzdHJlYW08d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPjsKKyMgIGVuZGlmCisjZW5kaWYgLyogX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCAqLworCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNlbmRpZiAvKiBfU1RMUF9GU1RSRUFNICovCisKKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL19mdW5jdGlvbi5oIGIvc3RscG9ydC9zdGwvX2Z1bmN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY0YWQzZQotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc3RsL19mdW5jdGlvbi5oCkBAIC0wLDAgKzEsNDMzIEBACisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYtMTk5OAorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworLyogTk9URTogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgU1RMIGhlYWRlcnMuCisgKiAgIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LgorICovCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfRlVOQ1RJT05fSAorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9GVU5DVElPTl9ICisKKyNpZm5kZWYgX1NUTFBfVFlQRV9UUkFJVFNfSAorIyAgaW5jbHVkZSA8c3RsL3R5cGVfdHJhaXRzLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9GVU5DVElPTl9CQVNFX0gKKyMgIGluY2x1ZGUgPHN0bC9fZnVuY3Rpb25fYmFzZS5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IG5vdF9lcXVhbF90byA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwLCBfVHAsIGJvb2w+IHsKKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QgeyByZXR1cm4gX194ICE9IF9feTsgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBncmVhdGVyIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAsIF9UcCwgYm9vbD4geworICBib29sIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdCB7IHJldHVybiBfX3ggPiBfX3k7IH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgZ3JlYXRlcl9lcXVhbCA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwLCBfVHAsIGJvb2w+IHsKKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QgeyByZXR1cm4gX194ID49IF9feTsgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBsZXNzX2VxdWFsIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAsIF9UcCwgYm9vbD4geworICBib29sIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdCB7IHJldHVybiBfX3ggPD0gX195OyB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IGRpdmlkZXMgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCwgX1RwLCBfVHA+IHsKKyAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdCB7IHJldHVybiBfX3ggLyBfX3k7IH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgbW9kdWx1cyA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwLCBfVHAsIF9UcD4geworICBfVHAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0IHsgcmV0dXJuIF9feCAlIF9feTsgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBuZWdhdGUgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248X1RwLCBfVHA+IHsKKyAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gpIGNvbnN0IHsgcmV0dXJuIC1fX3g7IH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgbG9naWNhbF9hbmQgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCwgX1RwLCBib29sPiB7CisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0IHsgcmV0dXJuIF9feCAmJiBfX3k7IH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgbG9naWNhbF9vciA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwLCBfVHAsYm9vbD4geworICBib29sIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdCB7IHJldHVybiBfX3ggfHwgX195OyB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IGxvZ2ljYWxfbm90IDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPF9UcCwgYm9vbD4geworICBib29sIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gpIGNvbnN0IHsgcmV0dXJuICFfX3g7IH0KK307CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKKy8vIGlkZW50aXR5X2VsZW1lbnQgKG5vdCBwYXJ0IG9mIHRoZSBDKysgc3RhbmRhcmQpLgordGVtcGxhdGUgPGNsYXNzIF9UcD4gaW5saW5lIF9UcCBpZGVudGl0eV9lbGVtZW50KHBsdXM8X1RwPikgeyAgcmV0dXJuIF9UcCgwKTsgfQordGVtcGxhdGUgPGNsYXNzIF9UcD4gaW5saW5lIF9UcCBpZGVudGl0eV9lbGVtZW50KG11bHRpcGxpZXM8X1RwPikgeyByZXR1cm4gX1RwKDEpOyB9CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX0JBU0VfVFlQRURFRl9CVUcpCisvLyB0aGlzIHdvcmthcm91bmQgaXMgbmVlZGVkIGZvciBTdW5Qcm8gNC4wLjEKKy8vIHN1Z2dlc3RlZCBieSAiTWFydGluIEFiZXJuZXRoeSIgPGdtYUBwYXN0b24uY28udWs+OgorCisvLyBXZSBoYXZlIHRvIGludHJvZHVjZSB0aGUgWFhhcnlfcHJlZGljYXRlX2F1eCBzdHJ1Y3R1cmVzIGluIG9yZGVyIHRvCisvLyBhY2Nlc3MgdGhlIGFyZ3VtZW50IGFuZCByZXR1cm4gdHlwZXMgb2YgcHJlZGljYXRlIGZ1bmN0aW9ucyBzdXBwbGllZAorLy8gYXMgdHlwZSBwYXJhbWV0ZXJzLiBTVU4gQysrIDQuMC4xIGNvbXBpbGVyIGdpdmVzIGVycm9ycyBmb3IgdGVtcGxhdGUgdHlwZSBwYXJhbWV0ZXJzCisvLyBvZiB0aGUgZm9ybSAnbmFtZTE6Om5hbWUyJywgd2hlcmUgbmFtZTEgaXMgaXRzZWxmIGEgdHlwZSBwYXJhbWV0ZXIuCit0ZW1wbGF0ZSA8Y2xhc3MgX1BhaXI+CitzdHJ1Y3QgX19wYWlyX2F1eCA6IHByaXZhdGUgX1BhaXIgeworICB0eXBlZGVmIHR5cGVuYW1lIF9QYWlyOjpmaXJzdF90eXBlIGZpcnN0X3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1BhaXI6OnNlY29uZF90eXBlIHNlY29uZF90eXBlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9PcGVyYXRpb24+CitzdHJ1Y3QgX191bmFyeV9mdW5fYXV4IDogcHJpdmF0ZSBfT3BlcmF0aW9uIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfT3BlcmF0aW9uOjphcmd1bWVudF90eXBlIGFyZ3VtZW50X3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX09wZXJhdGlvbjo6cmVzdWx0X3R5cGUgcmVzdWx0X3R5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX09wZXJhdGlvbj4KK3N0cnVjdCBfX2JpbmFyeV9mdW5fYXV4ICA6IHByaXZhdGUgX09wZXJhdGlvbiB7CisgIHR5cGVkZWYgdHlwZW5hbWUgX09wZXJhdGlvbjo6Zmlyc3RfYXJndW1lbnRfdHlwZSBmaXJzdF9hcmd1bWVudF90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9PcGVyYXRpb246OnNlY29uZF9hcmd1bWVudF90eXBlIHNlY29uZF9hcmd1bWVudF90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9PcGVyYXRpb246OnJlc3VsdF90eXBlIHJlc3VsdF90eXBlOworfTsKKworIyAgZGVmaW5lIF9fVU5BUllfQVJHKF9fT3BlcmF0aW9uLF9fdHlwZSkgIF9fdW5hcnlfZnVuX2F1eDxfX09wZXJhdGlvbj46Ol9fdHlwZQorIyAgZGVmaW5lIF9fQklOQVJZX0FSRyhfX09wZXJhdGlvbixfX3R5cGUpICBfX2JpbmFyeV9mdW5fYXV4PF9fT3BlcmF0aW9uPjo6X190eXBlCisjICBkZWZpbmUgX19QQUlSX0FSRyhfX1BhaXIsX190eXBlKSAgX19wYWlyX2F1eDxfX1BhaXI+OjpfX3R5cGUKKyNlbHNlCisjICBkZWZpbmUgX19VTkFSWV9BUkcoX19PcGVyYXRpb24sX190eXBlKSAgX19PcGVyYXRpb246Ol9fdHlwZQorIyAgZGVmaW5lIF9fQklOQVJZX0FSRyhfX09wZXJhdGlvbixfX3R5cGUpIF9fT3BlcmF0aW9uOjpfX3R5cGUKKyMgIGRlZmluZSBfX1BBSVJfQVJHKF9fUGFpcixfX3R5cGUpIF9fUGFpcjo6X190eXBlCisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9QcmVkaWNhdGU+CitjbGFzcyB1bmFyeV9uZWdhdGUKKyAgICA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjx0eXBlbmFtZSBfX1VOQVJZX0FSRyhfUHJlZGljYXRlLCBhcmd1bWVudF90eXBlKSwgYm9vbD4geworICB0eXBlZGVmIHVuYXJ5X2Z1bmN0aW9uPHR5cGVuYW1lIF9fVU5BUllfQVJHKF9QcmVkaWNhdGUsIGFyZ3VtZW50X3R5cGUpLCBib29sPiBfQmFzZTsKK3B1YmxpYzoKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6YXJndW1lbnRfdHlwZSBhcmd1bWVudF90eXBlOworcHJpdmF0ZToKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX2NhbGxfdHJhaXRzPGFyZ3VtZW50X3R5cGU+Ojpjb25zdF9wYXJhbV90eXBlIF9BcmdQYXJhbVR5cGU7Citwcm90ZWN0ZWQ6CisgIF9QcmVkaWNhdGUgX01fcHJlZDsKK3B1YmxpYzoKKyAgZXhwbGljaXQgdW5hcnlfbmVnYXRlKGNvbnN0IF9QcmVkaWNhdGUmIF9feCkgOiBfTV9wcmVkKF9feCkge30KKyAgYm9vbCBvcGVyYXRvcigpKF9BcmdQYXJhbVR5cGUgX194KSBjb25zdCB7CisgICAgcmV0dXJuICFfTV9wcmVkKF9feCk7CisgIH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfUHJlZGljYXRlPgoraW5saW5lIHVuYXJ5X25lZ2F0ZTxfUHJlZGljYXRlPgorbm90MShjb25zdCBfUHJlZGljYXRlJiBfX3ByZWQpIHsKKyAgcmV0dXJuIHVuYXJ5X25lZ2F0ZTxfUHJlZGljYXRlPihfX3ByZWQpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1ByZWRpY2F0ZT4KK2NsYXNzIGJpbmFyeV9uZWdhdGUKKyAgICA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248dHlwZW5hbWUgX19CSU5BUllfQVJHKF9QcmVkaWNhdGUsIGZpcnN0X2FyZ3VtZW50X3R5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfX0JJTkFSWV9BUkcoX1ByZWRpY2F0ZSwgc2Vjb25kX2FyZ3VtZW50X3R5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sPiB7CisgIHR5cGVkZWYgYmluYXJ5X2Z1bmN0aW9uPHR5cGVuYW1lIF9fQklOQVJZX0FSRyhfUHJlZGljYXRlLCBmaXJzdF9hcmd1bWVudF90eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX19CSU5BUllfQVJHKF9QcmVkaWNhdGUsIHNlY29uZF9hcmd1bWVudF90eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbD4gX0Jhc2U7CitwdWJsaWM6CisgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmZpcnN0X2FyZ3VtZW50X3R5cGUgZmlyc3RfYXJndW1lbnRfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6c2Vjb25kX2FyZ3VtZW50X3R5cGUgc2Vjb25kX2FyZ3VtZW50X3R5cGU7Citwcml2YXRlOgorICB0eXBlZGVmIHR5cGVuYW1lIF9fY2FsbF90cmFpdHM8Zmlyc3RfYXJndW1lbnRfdHlwZT46OmNvbnN0X3BhcmFtX3R5cGUgX0ZzdEFyZ1BhcmFtVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX2NhbGxfdHJhaXRzPHNlY29uZF9hcmd1bWVudF90eXBlPjo6Y29uc3RfcGFyYW1fdHlwZSBfU25kQXJnUGFyYW1UeXBlOworcHJvdGVjdGVkOgorICBfUHJlZGljYXRlIF9NX3ByZWQ7CitwdWJsaWM6CisgIGV4cGxpY2l0IGJpbmFyeV9uZWdhdGUoY29uc3QgX1ByZWRpY2F0ZSYgX194KSA6IF9NX3ByZWQoX194KSB7fQorICBib29sIG9wZXJhdG9yKCkoX0ZzdEFyZ1BhcmFtVHlwZSBfX3gsIF9TbmRBcmdQYXJhbVR5cGUgX195KSBjb25zdCB7CisgICAgcmV0dXJuICFfTV9wcmVkKF9feCwgX195KTsKKyAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9QcmVkaWNhdGU+CitpbmxpbmUgYmluYXJ5X25lZ2F0ZTxfUHJlZGljYXRlPgorbm90Mihjb25zdCBfUHJlZGljYXRlJiBfX3ByZWQpIHsKKyAgcmV0dXJuIGJpbmFyeV9uZWdhdGU8X1ByZWRpY2F0ZT4oX19wcmVkKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9PcGVyYXRpb24+CitjbGFzcyBiaW5kZXIxc3QgOgorICAgIHB1YmxpYyB1bmFyeV9mdW5jdGlvbjx0eXBlbmFtZSBfX0JJTkFSWV9BUkcoX09wZXJhdGlvbiwgc2Vjb25kX2FyZ3VtZW50X3R5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfX0JJTkFSWV9BUkcoX09wZXJhdGlvbiwgcmVzdWx0X3R5cGUpID4geworICB0eXBlZGVmIHVuYXJ5X2Z1bmN0aW9uPHR5cGVuYW1lIF9fQklOQVJZX0FSRyhfT3BlcmF0aW9uLCBzZWNvbmRfYXJndW1lbnRfdHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX19CSU5BUllfQVJHKF9PcGVyYXRpb24sIHJlc3VsdF90eXBlKSA+IF9CYXNlOworcHVibGljOgorICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjphcmd1bWVudF90eXBlIGFyZ3VtZW50X3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnJlc3VsdF90eXBlIHJlc3VsdF90eXBlOworcHJpdmF0ZToKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX2NhbGxfdHJhaXRzPGFyZ3VtZW50X3R5cGU+OjpwYXJhbV90eXBlIF9BcmdQYXJhbVR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX19jYWxsX3RyYWl0czxhcmd1bWVudF90eXBlPjo6Y29uc3RfcGFyYW1fdHlwZSBfQ29uc3RBcmdQYXJhbVR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX19jYWxsX3RyYWl0czx0eXBlbmFtZSBfT3BlcmF0aW9uOjpmaXJzdF9hcmd1bWVudF90eXBlPjo6Y29uc3RfcGFyYW1fdHlwZSBfVmFsdWVQYXJhbVR5cGU7Citwcm90ZWN0ZWQ6CisgIC8vb3AgaXMgYSBTdGFuZGFyZCBuYW1lICgyMC4zLjYuMSksIGRvIG5vIG1ha2UgaXQgU1RMcG9ydCBuYW1pbmcgY29udmVudGlvbiBjb21wbGlhbnQuCisgIF9PcGVyYXRpb24gb3A7CisgIHR5cGVuYW1lIF9PcGVyYXRpb246OmZpcnN0X2FyZ3VtZW50X3R5cGUgX01fdmFsdWU7CitwdWJsaWM6CisgIGJpbmRlcjFzdChjb25zdCBfT3BlcmF0aW9uJiBfX3gsIF9WYWx1ZVBhcmFtVHlwZSBfX3kpCisgICAgOiBvcChfX3gpLCBfTV92YWx1ZShfX3kpIHt9CisKKyAgcmVzdWx0X3R5cGUgb3BlcmF0b3IoKShfQ29uc3RBcmdQYXJhbVR5cGUgX194KSBjb25zdAorICB7IHJldHVybiBvcChfTV92YWx1ZSwgX194KTsgfQorICAvLyBEUiAxMDkgTWlzc2luZyBiaW5kZXJzIGZvciBub24tY29uc3Qgc2VxdWVuY2UgZWxlbWVudHMKKyAgcmVzdWx0X3R5cGUgb3BlcmF0b3IoKShfQXJnUGFyYW1UeXBlIF9feCkgY29uc3QKKyAgeyByZXR1cm4gb3AoX01fdmFsdWUsIF9feCk7IH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfT3BlcmF0aW9uLCBjbGFzcyBfVHA+CitpbmxpbmUgYmluZGVyMXN0PF9PcGVyYXRpb24+CitiaW5kMXN0KGNvbnN0IF9PcGVyYXRpb24mIF9fZm4sIGNvbnN0IF9UcCYgX194KSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgX09wZXJhdGlvbjo6Zmlyc3RfYXJndW1lbnRfdHlwZSBfQXJnMV90eXBlOworICByZXR1cm4gYmluZGVyMXN0PF9PcGVyYXRpb24+KF9fZm4sIF9BcmcxX3R5cGUoX194KSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfT3BlcmF0aW9uPgorY2xhc3MgYmluZGVyMm5kCisgIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPHR5cGVuYW1lIF9fQklOQVJZX0FSRyhfT3BlcmF0aW9uLCBmaXJzdF9hcmd1bWVudF90eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX19CSU5BUllfQVJHKF9PcGVyYXRpb24sIHJlc3VsdF90eXBlKT4geworICB0eXBlZGVmIHVuYXJ5X2Z1bmN0aW9uPHR5cGVuYW1lIF9fQklOQVJZX0FSRyhfT3BlcmF0aW9uLCBmaXJzdF9hcmd1bWVudF90eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfX0JJTkFSWV9BUkcoX09wZXJhdGlvbiwgcmVzdWx0X3R5cGUpPiBfQmFzZTsKK3B1YmxpYzoKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6YXJndW1lbnRfdHlwZSBhcmd1bWVudF90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpyZXN1bHRfdHlwZSByZXN1bHRfdHlwZTsKK3ByaXZhdGU6CisgIHR5cGVkZWYgdHlwZW5hbWUgX19jYWxsX3RyYWl0czxhcmd1bWVudF90eXBlPjo6cGFyYW1fdHlwZSBfQXJnUGFyYW1UeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9fY2FsbF90cmFpdHM8YXJndW1lbnRfdHlwZT46OmNvbnN0X3BhcmFtX3R5cGUgX0NvbnN0QXJnUGFyYW1UeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9fY2FsbF90cmFpdHM8dHlwZW5hbWUgX09wZXJhdGlvbjo6c2Vjb25kX2FyZ3VtZW50X3R5cGU+Ojpjb25zdF9wYXJhbV90eXBlIF9WYWx1ZVBhcmFtVHlwZTsKK3Byb3RlY3RlZDoKKyAgLy9vcCBpcyBhIFN0YW5kYXJkIG5hbWUgKDIwLjMuNi4zKSwgZG8gbm8gbWFrZSBpdCBTVExwb3J0IG5hbWluZyBjb252ZW50aW9uIGNvbXBsaWFudC4KKyAgX09wZXJhdGlvbiBvcDsKKyAgdHlwZW5hbWUgX09wZXJhdGlvbjo6c2Vjb25kX2FyZ3VtZW50X3R5cGUgdmFsdWU7CitwdWJsaWM6CisgIGJpbmRlcjJuZChjb25zdCBfT3BlcmF0aW9uJiBfX3gsIF9WYWx1ZVBhcmFtVHlwZSBfX3kpCisgICAgICA6IG9wKF9feCksIHZhbHVlKF9feSkge30KKworICByZXN1bHRfdHlwZSBvcGVyYXRvcigpKF9Db25zdEFyZ1BhcmFtVHlwZSBfX3gpIGNvbnN0CisgIHsgcmV0dXJuIG9wKF9feCwgdmFsdWUpOyB9CisgIC8vIERSIDEwOSBNaXNzaW5nIGJpbmRlcnMgZm9yIG5vbi1jb25zdCBzZXF1ZW5jZSBlbGVtZW50cworICByZXN1bHRfdHlwZSBvcGVyYXRvcigpKF9BcmdQYXJhbVR5cGUgX194KSBjb25zdAorICB7IHJldHVybiBvcChfX3gsIHZhbHVlKTsgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9PcGVyYXRpb24sIGNsYXNzIF9UcD4KK2lubGluZSBiaW5kZXIybmQ8X09wZXJhdGlvbj4KK2JpbmQybmQoY29uc3QgX09wZXJhdGlvbiYgX19mbiwgY29uc3QgX1RwJiBfX3gpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfT3BlcmF0aW9uOjpzZWNvbmRfYXJndW1lbnRfdHlwZSBfQXJnMl90eXBlOworICByZXR1cm4gYmluZGVyMm5kPF9PcGVyYXRpb24+KF9fZm4sIF9BcmcyX3R5cGUoX194KSk7Cit9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKKy8vIHVuYXJ5X2NvbXBvc2UgYW5kIGJpbmFyeV9jb21wb3NlIChleHRlbnNpb25zLCBub3QgcGFydCBvZiB0aGUgc3RhbmRhcmQpLgorCit0ZW1wbGF0ZSA8Y2xhc3MgX09wZXJhdGlvbjEsIGNsYXNzIF9PcGVyYXRpb24yPgorY2xhc3MgdW5hcnlfY29tcG9zZSA6CisgIHB1YmxpYyB1bmFyeV9mdW5jdGlvbjx0eXBlbmFtZSBfX1VOQVJZX0FSRyhfT3BlcmF0aW9uMiwgYXJndW1lbnRfdHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfX1VOQVJZX0FSRyhfT3BlcmF0aW9uMSwgcmVzdWx0X3R5cGUpPiB7CisgIHR5cGVkZWYgdW5hcnlfZnVuY3Rpb248dHlwZW5hbWUgX19VTkFSWV9BUkcoX09wZXJhdGlvbjIsIGFyZ3VtZW50X3R5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9fVU5BUllfQVJHKF9PcGVyYXRpb24xLCByZXN1bHRfdHlwZSk+IF9CYXNlOworcHVibGljOgorICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjphcmd1bWVudF90eXBlIGFyZ3VtZW50X3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnJlc3VsdF90eXBlIHJlc3VsdF90eXBlOworcHJpdmF0ZToKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX2NhbGxfdHJhaXRzPGFyZ3VtZW50X3R5cGU+Ojpjb25zdF9wYXJhbV90eXBlIF9BcmdQYXJhbVR5cGU7Citwcm90ZWN0ZWQ6CisgIF9PcGVyYXRpb24xIF9NX2ZuMTsKKyAgX09wZXJhdGlvbjIgX01fZm4yOworcHVibGljOgorICB1bmFyeV9jb21wb3NlKGNvbnN0IF9PcGVyYXRpb24xJiBfX3gsIGNvbnN0IF9PcGVyYXRpb24yJiBfX3kpCisgICAgOiBfTV9mbjEoX194KSwgX01fZm4yKF9feSkge30KKworICByZXN1bHRfdHlwZSBvcGVyYXRvcigpKF9BcmdQYXJhbVR5cGUgX194KSBjb25zdCB7CisgICAgcmV0dXJuIF9NX2ZuMShfTV9mbjIoX194KSk7CisgIH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfT3BlcmF0aW9uMSwgY2xhc3MgX09wZXJhdGlvbjI+CitpbmxpbmUgdW5hcnlfY29tcG9zZTxfT3BlcmF0aW9uMSxfT3BlcmF0aW9uMj4KK2NvbXBvc2UxKGNvbnN0IF9PcGVyYXRpb24xJiBfX2ZuMSwgY29uc3QgX09wZXJhdGlvbjImIF9fZm4yKSB7CisgIHJldHVybiB1bmFyeV9jb21wb3NlPF9PcGVyYXRpb24xLF9PcGVyYXRpb24yPihfX2ZuMSwgX19mbjIpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX09wZXJhdGlvbjEsIGNsYXNzIF9PcGVyYXRpb24yLCBjbGFzcyBfT3BlcmF0aW9uMz4KK2NsYXNzIGJpbmFyeV9jb21wb3NlIDoKKyAgICBwdWJsaWMgdW5hcnlfZnVuY3Rpb248dHlwZW5hbWUgX19VTkFSWV9BUkcoX09wZXJhdGlvbjIsIGFyZ3VtZW50X3R5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfX0JJTkFSWV9BUkcoX09wZXJhdGlvbjEsIHJlc3VsdF90eXBlKT4geworICB0eXBlZGVmIHVuYXJ5X2Z1bmN0aW9uPHR5cGVuYW1lIF9fVU5BUllfQVJHKF9PcGVyYXRpb24yLCBhcmd1bWVudF90eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfX0JJTkFSWV9BUkcoX09wZXJhdGlvbjEsIHJlc3VsdF90eXBlKT4gX0Jhc2U7CitwdWJsaWM6CisgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmFyZ3VtZW50X3R5cGUgYXJndW1lbnRfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6cmVzdWx0X3R5cGUgcmVzdWx0X3R5cGU7Citwcml2YXRlOgorICB0eXBlZGVmIHR5cGVuYW1lIF9fY2FsbF90cmFpdHM8YXJndW1lbnRfdHlwZT46OmNvbnN0X3BhcmFtX3R5cGUgX0FyZ1BhcmFtVHlwZTsKK3Byb3RlY3RlZDoKKyAgX09wZXJhdGlvbjEgX01fZm4xOworICBfT3BlcmF0aW9uMiBfTV9mbjI7CisgIF9PcGVyYXRpb24zIF9NX2ZuMzsKK3B1YmxpYzoKKyAgYmluYXJ5X2NvbXBvc2UoY29uc3QgX09wZXJhdGlvbjEmIF9feCwgY29uc3QgX09wZXJhdGlvbjImIF9feSwKKyAgICAgICAgICAgICAgICAgY29uc3QgX09wZXJhdGlvbjMmIF9feikKKyAgICA6IF9NX2ZuMShfX3gpLCBfTV9mbjIoX195KSwgX01fZm4zKF9feikgeyB9CisKKyAgcmVzdWx0X3R5cGUgb3BlcmF0b3IoKShfQXJnUGFyYW1UeXBlIF9feCkgY29uc3QgeworICAgIHJldHVybiBfTV9mbjEoX01fZm4yKF9feCksIF9NX2ZuMyhfX3gpKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9PcGVyYXRpb24xLCBjbGFzcyBfT3BlcmF0aW9uMiwgY2xhc3MgX09wZXJhdGlvbjM+CitpbmxpbmUgYmluYXJ5X2NvbXBvc2U8X09wZXJhdGlvbjEsIF9PcGVyYXRpb24yLCBfT3BlcmF0aW9uMz4KK2NvbXBvc2UyKGNvbnN0IF9PcGVyYXRpb24xJiBfX2ZuMSwgY29uc3QgX09wZXJhdGlvbjImIF9fZm4yLAorICAgICAgICAgY29uc3QgX09wZXJhdGlvbjMmIF9fZm4zKSB7CisgIHJldHVybiBiaW5hcnlfY29tcG9zZTxfT3BlcmF0aW9uMSxfT3BlcmF0aW9uMixfT3BlcmF0aW9uMz4oX19mbjEsIF9fZm4yLCBfX2ZuMyk7Cit9CisKKy8vIGlkZW50aXR5IGlzIGFuIGV4dGVuc2lvbjogaXQgaXMgbm90IHBhcnQgb2YgdGhlIHN0YW5kYXJkLgordGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IGlkZW50aXR5IDogcHVibGljIF9TVExQX1BSSVYgX0lkZW50aXR5PF9UcD4ge307CisvLyBzZWxlY3Qxc3QgYW5kIHNlbGVjdDJuZCBhcmUgZXh0ZW5zaW9uczogdGhleSBhcmUgbm90IHBhcnQgb2YgdGhlIHN0YW5kYXJkLgordGVtcGxhdGUgPGNsYXNzIF9QYWlyPiBzdHJ1Y3Qgc2VsZWN0MXN0IDogcHVibGljIF9TVExQX1BSSVYgX1NlbGVjdDFzdDxfUGFpcj4ge307Cit0ZW1wbGF0ZSA8Y2xhc3MgX1BhaXI+IHN0cnVjdCBzZWxlY3QybmQgOiBwdWJsaWMgX1NUTFBfUFJJViBfU2VsZWN0Mm5kPF9QYWlyPiB7fTsKKwordGVtcGxhdGUgPGNsYXNzIF9BcmcxLCBjbGFzcyBfQXJnMj4KK3N0cnVjdCBwcm9qZWN0MXN0IDogcHVibGljIF9TVExQX1BSSVYgX1Byb2plY3Qxc3Q8X0FyZzEsIF9BcmcyPiB7fTsKKwordGVtcGxhdGUgPGNsYXNzIF9BcmcxLCBjbGFzcyBfQXJnMj4KK3N0cnVjdCBwcm9qZWN0Mm5kIDogcHVibGljIF9TVExQX1BSSVYgX1Byb2plY3QybmQ8X0FyZzEsIF9BcmcyPiB7fTsKKworCisvLyBjb25zdGFudF92b2lkX2Z1biwgY29uc3RhbnRfdW5hcnlfZnVuLCBhbmQgY29uc3RhbnRfYmluYXJ5X2Z1biBhcmUKKy8vIGV4dGVuc2lvbnM6IHRoZXkgYXJlIG5vdCBwYXJ0IG9mIHRoZSBzdGFuZGFyZC4gIChUaGUgc2FtZSwgb2YgY291cnNlLAorLy8gaXMgdHJ1ZSBvZiB0aGUgaGVscGVyIGZ1bmN0aW9ucyBjb25zdGFudDAsIGNvbnN0YW50MSwgYW5kIGNvbnN0YW50Mi4pCisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9SZXN1bHQ+CitzdHJ1Y3QgX0NvbnN0YW50X3ZvaWRfZnVuIHsKKyAgdHlwZWRlZiBfUmVzdWx0IHJlc3VsdF90eXBlOworICByZXN1bHRfdHlwZSBfTV92YWw7CisKKyAgX0NvbnN0YW50X3ZvaWRfZnVuKGNvbnN0IHJlc3VsdF90eXBlJiBfX3YpIDogX01fdmFsKF9fdikge30KKyAgY29uc3QgcmVzdWx0X3R5cGUmIG9wZXJhdG9yKCkoKSBjb25zdCB7IHJldHVybiBfTV92YWw7IH0KK307CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1Jlc3VsdD4KK3N0cnVjdCBjb25zdGFudF92b2lkX2Z1biA6IHB1YmxpYyBfU1RMUF9QUklWIF9Db25zdGFudF92b2lkX2Z1bjxfUmVzdWx0PiB7CisgIGNvbnN0YW50X3ZvaWRfZnVuKGNvbnN0IF9SZXN1bHQmIF9fdikKKyAgICA6IF9TVExQX1BSSVYgX0NvbnN0YW50X3ZvaWRfZnVuPF9SZXN1bHQ+KF9fdikge30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfUmVzdWx0LCBfU1RMUF9ERkxfVE1QTF9QQVJBTSggX0FyZ3VtZW50ICwgX1Jlc3VsdCkgPgorc3RydWN0IGNvbnN0YW50X3VuYXJ5X2Z1biA6IHB1YmxpYyBfU1RMUF9QUklWIF9Db25zdGFudF91bmFyeV9mdW48X1Jlc3VsdCwgX0FyZ3VtZW50PiB7CisgIGNvbnN0YW50X3VuYXJ5X2Z1bihjb25zdCBfUmVzdWx0JiBfX3YpCisgICAgOiBfU1RMUF9QUklWIF9Db25zdGFudF91bmFyeV9mdW48X1Jlc3VsdCwgX0FyZ3VtZW50PihfX3YpIHt9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1Jlc3VsdCwgX1NUTFBfREZMX1RNUExfUEFSQU0oIF9BcmcxICwgX1Jlc3VsdCksIF9TVExQX0RGTF9UTVBMX1BBUkFNKCBfQXJnMiAsIF9BcmcxKSA+CitzdHJ1Y3QgY29uc3RhbnRfYmluYXJ5X2Z1bgorICA6IHB1YmxpYyBfU1RMUF9QUklWIF9Db25zdGFudF9iaW5hcnlfZnVuPF9SZXN1bHQsIF9BcmcxLCBfQXJnMj4geworICBjb25zdGFudF9iaW5hcnlfZnVuKGNvbnN0IF9SZXN1bHQmIF9fdikKKyAgICA6IF9TVExQX1BSSVYgX0NvbnN0YW50X2JpbmFyeV9mdW48X1Jlc3VsdCwgX0FyZzEsIF9BcmcyPihfX3YpIHt9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1Jlc3VsdD4KK2lubGluZSBjb25zdGFudF92b2lkX2Z1bjxfUmVzdWx0PiBjb25zdGFudDAoY29uc3QgX1Jlc3VsdCYgX192YWwpIHsKKyAgcmV0dXJuIGNvbnN0YW50X3ZvaWRfZnVuPF9SZXN1bHQ+KF9fdmFsKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9SZXN1bHQ+CitpbmxpbmUgY29uc3RhbnRfdW5hcnlfZnVuPF9SZXN1bHQsX1Jlc3VsdD4gY29uc3RhbnQxKGNvbnN0IF9SZXN1bHQmIF9fdmFsKSB7CisgIHJldHVybiBjb25zdGFudF91bmFyeV9mdW48X1Jlc3VsdCxfUmVzdWx0PihfX3ZhbCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfUmVzdWx0PgoraW5saW5lIGNvbnN0YW50X2JpbmFyeV9mdW48X1Jlc3VsdCxfUmVzdWx0LF9SZXN1bHQ+Citjb25zdGFudDIoY29uc3QgX1Jlc3VsdCYgX192YWwpIHsKKyAgcmV0dXJuIGNvbnN0YW50X2JpbmFyeV9mdW48X1Jlc3VsdCxfUmVzdWx0LF9SZXN1bHQ+KF9fdmFsKTsKK30KKworLy8gc3VidHJhY3RpdmVfcm5nIGlzIGFuIGV4dGVuc2lvbjogaXQgaXMgbm90IHBhcnQgb2YgdGhlIHN0YW5kYXJkLgorLy8gTm90ZTogdGhpcyBjb2RlIGFzc3VtZXMgdGhhdCBpbnQgaXMgMzIgYml0cy4KK2NsYXNzIHN1YnRyYWN0aXZlX3JuZyA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxfU1RMUF9VSU5UMzJfVCwgX1NUTFBfVUlOVDMyX1Q+IHsKK3ByaXZhdGU6CisgIF9TVExQX1VJTlQzMl9UIF9NX3RhYmxlWzU1XTsKKyAgX1NUTFBfVUlOVDMyX1QgX01faW5kZXgxOworICBfU1RMUF9VSU5UMzJfVCBfTV9pbmRleDI7CitwdWJsaWM6CisgIF9TVExQX1VJTlQzMl9UIG9wZXJhdG9yKCkoX1NUTFBfVUlOVDMyX1QgX19saW1pdCkgeworICAgIF9NX2luZGV4MSA9IChfTV9pbmRleDEgKyAxKSAlIDU1OworICAgIF9NX2luZGV4MiA9IChfTV9pbmRleDIgKyAxKSAlIDU1OworICAgIF9NX3RhYmxlW19NX2luZGV4MV0gPSBfTV90YWJsZVtfTV9pbmRleDFdIC0gX01fdGFibGVbX01faW5kZXgyXTsKKyAgICByZXR1cm4gX01fdGFibGVbX01faW5kZXgxXSAlIF9fbGltaXQ7CisgIH0KKworICB2b2lkIF9NX2luaXRpYWxpemUoX1NUTFBfVUlOVDMyX1QgX19zZWVkKSB7CisgICAgX1NUTFBfVUlOVDMyX1QgX19rID0gMTsKKyAgICBfTV90YWJsZVs1NF0gPSBfX3NlZWQ7CisgICAgX1NUTFBfVUlOVDMyX1QgX19pOworICAgIGZvciAoX19pID0gMDsgX19pIDwgNTQ7IF9faSsrKSB7CisgICAgICAgIF9TVExQX1VJTlQzMl9UIF9faWkgPSAoMjEgKiAoX19pICsgMSkgJSA1NSkgLSAxOworICAgICAgICBfTV90YWJsZVtfX2lpXSA9IF9fazsKKyAgICAgICAgX19rID0gX19zZWVkIC0gX19rOworICAgICAgICBfX3NlZWQgPSBfTV90YWJsZVtfX2lpXTsKKyAgICB9CisgICAgZm9yIChpbnQgX19sb29wID0gMDsgX19sb29wIDwgNDsgX19sb29wKyspIHsKKyAgICAgICAgZm9yIChfX2kgPSAwOyBfX2kgPCA1NTsgX19pKyspCisgICAgICAgICAgICBfTV90YWJsZVtfX2ldID0gX01fdGFibGVbX19pXSAtIF9NX3RhYmxlWygxICsgX19pICsgMzApICUgNTVdOworICAgIH0KKyAgICBfTV9pbmRleDEgPSAwOworICAgIF9NX2luZGV4MiA9IDMxOworICB9CisKKyAgc3VidHJhY3RpdmVfcm5nKHVuc2lnbmVkIGludCBfX3NlZWQpIHsgX01faW5pdGlhbGl6ZShfX3NlZWQpOyB9CisgIHN1YnRyYWN0aXZlX3JuZygpIHsgX01faW5pdGlhbGl6ZSgxNjE4MDMzOTh1bCk7IH0KK307CisKKyNlbmRpZiAvKiBfU1RMUF9OT19FWFRFTlNJT05TICovCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2luY2x1ZGUgPHN0bC9fZnVuY3Rpb25fYWRhcHRvcnMuaD4KKworI2VuZGlmIC8qIF9TVExQX0lOVEVSTkFMX0ZVTkNUSU9OX0ggKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL19mdW5jdGlvbl9hZGFwdG9ycy5oIGIvc3RscG9ydC9zdGwvX2Z1bmN0aW9uX2FkYXB0b3JzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRhNDE5YgotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc3RsL19mdW5jdGlvbl9hZGFwdG9ycy5oCkBAIC0wLDAgKzEsNzgzIEBACisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYtMTk5OAorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAKKyAqIFBhdmVsIEt1em5ldHNvdgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMQorICogTWVyaWRpYW4nOTMKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworLyogTk9URTogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgU1RMIGhlYWRlcnMuCisgKiAgIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LgorICovCisKKy8vIFRoaXMgZmlsZSBoYXMgbm9vIG1hY3JvIHByb3RlY3Rpb24gYXMgaXQgaXMgbWVhbnQgdG8gYmUgaW5jbHVkZWQgc2V2ZXJhbCB0aW1lcworLy8gZnJvbSBvdGhlciBoZWFkZXIuCisvLyBBZGFwdG9yIGZ1bmN0aW9uIG9iamVjdHM6IHBvaW50ZXJzIHRvIG1lbWJlciBmdW5jdGlvbnMuCisKKy8vIFRoZXJlIGFyZSBhIHRvdGFsIG9mIDE2ID0gMl40IGZ1bmN0aW9uIG9iamVjdHMgaW4gdGhpcyBmYW1pbHkuCisvLyAgKDEpIE1lbWJlciBmdW5jdGlvbnMgdGFraW5nIG5vIGFyZ3VtZW50cyB2cyBtZW1iZXIgZnVuY3Rpb25zIHRha2luZworLy8gICAgICAgb25lIGFyZ3VtZW50LgorLy8gICgyKSBDYWxsIHRocm91Z2ggcG9pbnRlciB2cyBjYWxsIHRocm91Z2ggcmVmZXJlbmNlLgorLy8gICgzKSBNZW1iZXIgZnVuY3Rpb24gd2l0aCB2b2lkIHJldHVybiB0eXBlIHZzIG1lbWJlciBmdW5jdGlvbiB3aXRoCisvLyAgICAgIG5vbi12b2lkIHJldHVybiB0eXBlLgorLy8gICg0KSBDb25zdCB2cyBub24tY29uc3QgbWVtYmVyIGZ1bmN0aW9uLgorCisvLyBOb3RlIHRoYXQgY2hvaWNlICgzKSBpcyBub3RoaW5nIG1vcmUgdGhhbiBhIHdvcmthcm91bmQ6IGFjY29yZGluZworLy8gIHRvIHRoZSBkcmFmdCwgY29tcGlsZXJzIHNob3VsZCBoYW5kbGUgdm9pZCBhbmQgbm9uLXZvaWQgdGhlIHNhbWUgd2F5LgorLy8gIFRoaXMgZmVhdHVyZSBpcyBub3QgeWV0IHdpZGVseSBpbXBsZW1lbnRlZCwgdGhvdWdoLiAgWW91IGNhbiBvbmx5IHVzZQorLy8gIG1lbWJlciBmdW5jdGlvbnMgcmV0dXJuaW5nIHZvaWQgaWYgeW91ciBjb21waWxlciBzdXBwb3J0cyBwYXJ0aWFsCisvLyAgc3BlY2lhbGl6YXRpb24uCisKKy8vIEFsbCBvZiB0aGlzIGNvbXBsZXhpdHkgaXMgaW4gdGhlIGZ1bmN0aW9uIG9iamVjdHMgdGhlbXNlbHZlcy4gIFlvdSBjYW4KKy8vICBpZ25vcmUgaXQgYnkgdXNpbmcgdGhlIGhlbHBlciBmdW5jdGlvbiBtZW1fZnVuIGFuZCBtZW1fZnVuX3JlZiwKKy8vICB3aGljaCBjcmVhdGUgd2hpY2hldmVyIHR5cGUgb2YgYWRhcHRvciBpcyBhcHByb3ByaWF0ZS4KKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKKy8vVGhpcyBpbXBsZW1lbnRhdGlvbiB3aWxsIG9ubHkgYmUgdXNlZCBpZiBuZWVkZWQsIHRoYXQgaXMgdG8gc2F5IHdoZW4gdGhlcmUgaXMgdGhlIHJldHVybiB2b2lkIGJ1ZworLy9hbmQgd2hlbiB0aGVyZSBpcyBubyBwYXJ0aWFsIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uCisjaWYgZGVmaW5lZCAoX1NUTFBfRE9OVF9SRVRVUk5fVk9JRCkgJiYgZGVmaW5lZCAoX1NUTFBfTk9fQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikgJiYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFX0NMQVNTRVMpCisKK3RlbXBsYXRlPGNsYXNzIF9SZXN1bHQsIGNsYXNzIF9UcD4KK2NsYXNzIF9NZW1fZnVuMF9wdHIgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248X1RwKiwgX1Jlc3VsdD4geworcHJvdGVjdGVkOgorICB0eXBlZGVmIF9SZXN1bHQgKF9UcDo6Kl9fZnVuX3R5cGUpICgpOworICBleHBsaWNpdCBfTWVtX2Z1bjBfcHRyKF9fZnVuX3R5cGUgX19mKSA6IF9NX2YoX19mKSB7fQorCitwdWJsaWM6CisgIF9SZXN1bHQgb3BlcmF0b3IgKCkoX1RwKiBfX3ApIGNvbnN0IHsgcmV0dXJuIChfX3AtPipfTV9mKSgpOyB9CisKK3ByaXZhdGU6CisgIF9fZnVuX3R5cGUgX01fZjsKK307CisKK3RlbXBsYXRlPGNsYXNzIF9SZXN1bHQsIGNsYXNzIF9UcCwgY2xhc3MgX0FyZz4KK2NsYXNzIF9NZW1fZnVuMV9wdHIgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCosX0FyZyxfUmVzdWx0PiB7Citwcm90ZWN0ZWQ6CisgIHR5cGVkZWYgX1Jlc3VsdCAoX1RwOjoqX19mdW5fdHlwZSkgKF9BcmcpOworICBleHBsaWNpdCBfTWVtX2Z1bjFfcHRyKF9fZnVuX3R5cGUgX19mKSA6IF9NX2YoX19mKSB7fQorCitwdWJsaWM6CisgIF9SZXN1bHQgb3BlcmF0b3IgKCkoX1RwKiBfX3AsIF9BcmcgX194KSBjb25zdCB7IHJldHVybiAoX19wLT4qX01fZikoX194KTsgfQorCitwcml2YXRlOgorICBfX2Z1bl90eXBlIF9NX2Y7Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBfUmVzdWx0LCBjbGFzcyBfVHA+CitjbGFzcyBfQ29uc3RfbWVtX2Z1bjBfcHRyIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPGNvbnN0IF9UcCosX1Jlc3VsdD4geworcHJvdGVjdGVkOgorICB0eXBlZGVmIF9SZXN1bHQgKF9UcDo6Kl9fZnVuX3R5cGUpICgpIGNvbnN0OworICBleHBsaWNpdCBfQ29uc3RfbWVtX2Z1bjBfcHRyKF9fZnVuX3R5cGUgX19mKSA6IF9NX2YoX19mKSB7fQorCitwdWJsaWM6CisgIF9SZXN1bHQgb3BlcmF0b3IgKCkoY29uc3QgX1RwKiBfX3ApIGNvbnN0IHsgcmV0dXJuIChfX3AtPipfTV9mKSgpOyB9CisKK3ByaXZhdGU6CisgIF9fZnVuX3R5cGUgX01fZjsKK307CisKK3RlbXBsYXRlPGNsYXNzIF9SZXN1bHQsIGNsYXNzIF9UcCwgY2xhc3MgX0FyZz4KK2NsYXNzIF9Db25zdF9tZW1fZnVuMV9wdHIgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPGNvbnN0IF9UcCosX0FyZyxfUmVzdWx0PiB7Citwcm90ZWN0ZWQ6CisgIHR5cGVkZWYgX1Jlc3VsdCAoX1RwOjoqX19mdW5fdHlwZSkgKF9BcmcpIGNvbnN0OworICBleHBsaWNpdCBfQ29uc3RfbWVtX2Z1bjFfcHRyKF9fZnVuX3R5cGUgX19mKSA6IF9NX2YoX19mKSB7fQorCitwdWJsaWM6CisgIF9SZXN1bHQgb3BlcmF0b3IgKCkoY29uc3QgX1RwKiBfX3AsIF9BcmcgX194KSBjb25zdCB7CisgICAgcmV0dXJuIChfX3AtPipfTV9mKShfX3gpOyB9CisKK3ByaXZhdGU6CisgIF9fZnVuX3R5cGUgX01fZjsKK307CisKK3RlbXBsYXRlPGNsYXNzIF9SZXN1bHQsIGNsYXNzIF9UcD4KK2NsYXNzIF9NZW1fZnVuMF9yZWYgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248X1RwLF9SZXN1bHQ+IHsKK3Byb3RlY3RlZDoKKyAgdHlwZWRlZiBfUmVzdWx0IChfVHA6OipfX2Z1bl90eXBlKSAoKTsKKyAgZXhwbGljaXQgX01lbV9mdW4wX3JlZihfX2Z1bl90eXBlIF9fZikgOiBfTV9mKF9fZikge30KKworcHVibGljOgorICBfUmVzdWx0IG9wZXJhdG9yICgpKF9UcCYgX19wKSBjb25zdCB7IHJldHVybiAoX19wLipfTV9mKSgpOyB9CisKK3ByaXZhdGU6CisgIF9fZnVuX3R5cGUgX01fZjsKK307CisKK3RlbXBsYXRlPGNsYXNzIF9SZXN1bHQsIGNsYXNzIF9UcCwgY2xhc3MgX0FyZz4KK2NsYXNzIF9NZW1fZnVuMV9yZWYgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCxfQXJnLF9SZXN1bHQ+IHsKK3Byb3RlY3RlZDoKKyAgdHlwZWRlZiBfUmVzdWx0IChfVHA6OipfX2Z1bl90eXBlKSAoX0FyZyk7CisgIGV4cGxpY2l0IF9NZW1fZnVuMV9yZWYoX19mdW5fdHlwZSBfX2YpIDogX01fZihfX2YpIHt9CisKK3B1YmxpYzoKKyAgX1Jlc3VsdCBvcGVyYXRvciAoKShfVHAmIF9fcCwgX0FyZyBfX3gpIGNvbnN0IHsgcmV0dXJuIChfX3AuKl9NX2YpKF9feCk7IH0KKworcHJpdmF0ZToKKyAgX19mdW5fdHlwZSBfTV9mOworfTsKKwordGVtcGxhdGU8Y2xhc3MgX1Jlc3VsdCwgY2xhc3MgX1RwPgorY2xhc3MgX0NvbnN0X21lbV9mdW4wX3JlZiA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxfVHAsX1Jlc3VsdD4geworcHJvdGVjdGVkOgorICB0eXBlZGVmIF9SZXN1bHQgKF9UcDo6Kl9fZnVuX3R5cGUpICgpIGNvbnN0OworICBleHBsaWNpdCBfQ29uc3RfbWVtX2Z1bjBfcmVmKF9fZnVuX3R5cGUgX19mKSA6IF9NX2YoX19mKSB7fQorCitwdWJsaWM6CisgIF9SZXN1bHQgb3BlcmF0b3IgKCkoY29uc3QgX1RwJiBfX3ApIGNvbnN0IHsgcmV0dXJuIChfX3AuKl9NX2YpKCk7IH0KKworcHJpdmF0ZToKKyAgX19mdW5fdHlwZSBfTV9mOworfTsKKwordGVtcGxhdGU8Y2xhc3MgX1Jlc3VsdCwgY2xhc3MgX1RwLCBjbGFzcyBfQXJnPgorY2xhc3MgX0NvbnN0X21lbV9mdW4xX3JlZiA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwLF9BcmcsX1Jlc3VsdD4geworcHJvdGVjdGVkOgorICB0eXBlZGVmIF9SZXN1bHQgKF9UcDo6Kl9fZnVuX3R5cGUpIChfQXJnKSBjb25zdDsKKyAgZXhwbGljaXQgX0NvbnN0X21lbV9mdW4xX3JlZihfX2Z1bl90eXBlIF9fZikgOiBfTV9mKF9fZikge30KKworcHVibGljOgorICBfUmVzdWx0IG9wZXJhdG9yICgpKGNvbnN0IF9UcCYgX19wLCBfQXJnIF9feCkgY29uc3QgeyByZXR1cm4gKF9fcC4qX01fZikoX194KTsgfQorCitwcml2YXRlOgorICBfX2Z1bl90eXBlIF9NX2Y7Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBfUmVzdWx0Pgorc3RydWN0IF9NZW1fZnVuX3RyYWl0cyB7CisgIHRlbXBsYXRlPGNsYXNzIF9UcD4KKyAgc3RydWN0IF9BcmdzMCB7CisgICAgdHlwZWRlZiBfTWVtX2Z1bjBfcHRyPF9SZXN1bHQsX1RwPiAgICAgICAgICAgIF9QdHI7CisgICAgdHlwZWRlZiBfQ29uc3RfbWVtX2Z1bjBfcHRyPF9SZXN1bHQsX1RwPiAgICAgIF9QdHJfY29uc3Q7CisgICAgdHlwZWRlZiBfTWVtX2Z1bjBfcmVmPF9SZXN1bHQsX1RwPiAgICAgICAgICAgIF9SZWY7CisgICAgdHlwZWRlZiBfQ29uc3RfbWVtX2Z1bjBfcmVmPF9SZXN1bHQsX1RwPiAgICAgIF9SZWZfY29uc3Q7CisgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1RwLCBjbGFzcyBfQXJnPgorICBzdHJ1Y3QgX0FyZ3MxIHsKKyAgICB0eXBlZGVmIF9NZW1fZnVuMV9wdHI8X1Jlc3VsdCxfVHAsX0FyZz4gICAgICAgX1B0cjsKKyAgICB0eXBlZGVmIF9Db25zdF9tZW1fZnVuMV9wdHI8X1Jlc3VsdCxfVHAsX0FyZz4gX1B0cl9jb25zdDsKKyAgICB0eXBlZGVmIF9NZW1fZnVuMV9yZWY8X1Jlc3VsdCxfVHAsX0FyZz4gICAgICAgX1JlZjsKKyAgICB0eXBlZGVmIF9Db25zdF9tZW1fZnVuMV9yZWY8X1Jlc3VsdCxfVHAsX0FyZz4gX1JlZl9jb25zdDsKKyAgfTsKK307CisKK3RlbXBsYXRlPGNsYXNzIF9BcmcsIGNsYXNzIF9SZXN1bHQ+CitjbGFzcyBfUHRyX2Z1bjFfYmFzZSA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxfQXJnLCBfUmVzdWx0PiB7Citwcm90ZWN0ZWQ6CisgIHR5cGVkZWYgX1Jlc3VsdCAoKl9fZnVuX3R5cGUpIChfQXJnKTsKKyAgZXhwbGljaXQgX1B0cl9mdW4xX2Jhc2UoX19mdW5fdHlwZSBfX2YpIDogX01fZihfX2YpIHt9CisKK3B1YmxpYzoKKyAgX1Jlc3VsdCBvcGVyYXRvcigpKF9BcmcgX194KSBjb25zdCB7IHJldHVybiBfTV9mKF9feCk7IH0KKworcHJpdmF0ZToKKyAgX19mdW5fdHlwZSBfTV9mOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9BcmcxLCBjbGFzcyBfQXJnMiwgY2xhc3MgX1Jlc3VsdD4KK2NsYXNzIF9QdHJfZnVuMl9iYXNlIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfQXJnMSxfQXJnMixfUmVzdWx0PiB7Citwcm90ZWN0ZWQ6CisgIHR5cGVkZWYgX1Jlc3VsdCAoKl9fZnVuX3R5cGUpIChfQXJnMSwgX0FyZzIpOworICBleHBsaWNpdCBfUHRyX2Z1bjJfYmFzZShfX2Z1bl90eXBlIF9fZikgOiBfTV9mKF9fZikge30KKworcHVibGljOgorICBfUmVzdWx0IG9wZXJhdG9yKCkoX0FyZzEgX194LCBfQXJnMiBfX3kpIGNvbnN0IHsgcmV0dXJuIF9NX2YoX194LCBfX3kpOyB9CisKK3ByaXZhdGU6CisgIF9fZnVuX3R5cGUgX01fZjsKK307CisKK3RlbXBsYXRlPGNsYXNzIF9SZXN1bHQ+CitzdHJ1Y3QgX1B0cl9mdW5fdHJhaXRzIHsKKyAgdGVtcGxhdGU8Y2xhc3MgX0FyZz4gc3RydWN0IF9BcmdzMSB7CisgICAgdHlwZWRlZiBfUHRyX2Z1bjFfYmFzZTxfQXJnLF9SZXN1bHQ+IF9GdW47CisgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0FyZzEsIGNsYXNzIF9BcmcyPiBzdHJ1Y3QgX0FyZ3MyIHsKKyAgICB0eXBlZGVmIF9QdHJfZnVuMl9iYXNlPF9BcmcxLF9BcmcyLF9SZXN1bHQ+IF9GdW47CisgIH07Cit9OworCisvKiBTcGVjaWFsaXphdGlvbnMgZm9yIHZvaWQgcmV0dXJuIHR5cGUgKi8KK3RlbXBsYXRlPGNsYXNzIF9UcD4KK2NsYXNzIF9Wb2lkX21lbV9mdW4wX3B0ciA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxfVHAqLHZvaWQ+IHsKK3Byb3RlY3RlZDoKKyAgdHlwZWRlZiB2b2lkIChfVHA6OipfX2Z1bl90eXBlKSAoKTsKKyAgZXhwbGljaXQgX1ZvaWRfbWVtX2Z1bjBfcHRyKF9fZnVuX3R5cGUgX19mKSA6IF9NX2YoX19mKSB7fQorCitwdWJsaWM6CisgIHZvaWQgb3BlcmF0b3IgKCkoX1RwKiBfX3ApIGNvbnN0IHsgKF9fcC0+Kl9NX2YpKCk7IH0KKworcHJpdmF0ZToKKyAgX19mdW5fdHlwZSBfTV9mOworfTsKKwordGVtcGxhdGU8Y2xhc3MgX1RwLCBjbGFzcyBfQXJnPgorY2xhc3MgX1ZvaWRfbWVtX2Z1bjFfcHRyIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAqLF9Bcmcsdm9pZD4geworcHJvdGVjdGVkOgorICB0eXBlZGVmIHZvaWQgKF9UcDo6Kl9fZnVuX3R5cGUpIChfQXJnKTsKKyAgZXhwbGljaXQgX1ZvaWRfbWVtX2Z1bjFfcHRyKF9fZnVuX3R5cGUgX19mKSA6IF9NX2YoX19mKSB7fQorCitwdWJsaWM6CisgIHZvaWQgb3BlcmF0b3IgKCkoX1RwKiBfX3AsIF9BcmcgX194KSBjb25zdCB7IChfX3AtPipfTV9mKShfX3gpOyB9CisKK3ByaXZhdGU6CisgIF9fZnVuX3R5cGUgX01fZjsKK307CisKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK2NsYXNzIF9Wb2lkX2NvbnN0X21lbV9mdW4wX3B0ciA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxjb25zdCBfVHAqLHZvaWQ+IHsKK3Byb3RlY3RlZDoKKyAgdHlwZWRlZiB2b2lkIChfVHA6OipfX2Z1bl90eXBlKSAoKSBjb25zdDsKKyAgZXhwbGljaXQgX1ZvaWRfY29uc3RfbWVtX2Z1bjBfcHRyKF9fZnVuX3R5cGUgX19mKSA6IF9NX2YoX19mKSB7fQorCitwdWJsaWM6CisgIHZvaWQgb3BlcmF0b3IgKCkoY29uc3QgX1RwKiBfX3ApIGNvbnN0IHsgKF9fcC0+Kl9NX2YpKCk7IH0KKworcHJpdmF0ZToKKyAgX19mdW5fdHlwZSBfTV9mOworfTsKKwordGVtcGxhdGU8Y2xhc3MgX1RwLCBjbGFzcyBfQXJnPgorY2xhc3MgX1ZvaWRfY29uc3RfbWVtX2Z1bjFfcHRyIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxjb25zdCBfVHAqLF9Bcmcsdm9pZD4geworcHJvdGVjdGVkOgorICB0eXBlZGVmIHZvaWQgKF9UcDo6Kl9fZnVuX3R5cGUpIChfQXJnKSBjb25zdDsKKyAgZXhwbGljaXQgX1ZvaWRfY29uc3RfbWVtX2Z1bjFfcHRyKF9fZnVuX3R5cGUgX19mKSA6IF9NX2YoX19mKSB7fQorCitwdWJsaWM6CisgIHZvaWQgb3BlcmF0b3IgKCkoY29uc3QgX1RwKiBfX3AsIF9BcmcgX194KSBjb25zdCB7IChfX3AtPipfTV9mKShfX3gpOyB9CisKK3ByaXZhdGU6CisgIF9fZnVuX3R5cGUgX01fZjsKK307CisKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK2NsYXNzIF9Wb2lkX21lbV9mdW4wX3JlZiA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxfVHAsdm9pZD4geworcHJvdGVjdGVkOgorICB0eXBlZGVmIHZvaWQgKF9UcDo6Kl9fZnVuX3R5cGUpICgpOworICBleHBsaWNpdCBfVm9pZF9tZW1fZnVuMF9yZWYoX19mdW5fdHlwZSBfX2YpIDogX01fZihfX2YpIHt9CisKK3B1YmxpYzoKKyAgdm9pZCBvcGVyYXRvciAoKShfVHAmIF9fcCkgY29uc3QgeyAoX19wLipfTV9mKSgpOyB9CisKK3ByaXZhdGU6CisgIF9fZnVuX3R5cGUgX01fZjsKK307CisKK3RlbXBsYXRlPGNsYXNzIF9UcCwgY2xhc3MgX0FyZz4KK2NsYXNzIF9Wb2lkX21lbV9mdW4xX3JlZiA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwLF9Bcmcsdm9pZD4geworcHJvdGVjdGVkOgorICB0eXBlZGVmIHZvaWQgKF9UcDo6Kl9fZnVuX3R5cGUpIChfQXJnKTsKKyAgZXhwbGljaXQgX1ZvaWRfbWVtX2Z1bjFfcmVmKF9fZnVuX3R5cGUgX19mKSA6IF9NX2YoX19mKSB7fQorCitwdWJsaWM6CisgIHZvaWQgb3BlcmF0b3IgKCkoX1RwJiBfX3AsIF9BcmcgX194KSBjb25zdCB7IChfX3AuKl9NX2YpKF9feCk7IH0KKworcHJpdmF0ZToKKyAgX19mdW5fdHlwZSBfTV9mOworfTsKKwordGVtcGxhdGU8Y2xhc3MgX1RwPgorY2xhc3MgX1ZvaWRfY29uc3RfbWVtX2Z1bjBfcmVmIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPF9UcCx2b2lkPiB7Citwcm90ZWN0ZWQ6CisgIHR5cGVkZWYgdm9pZCAoX1RwOjoqX19mdW5fdHlwZSkgKCkgY29uc3Q7CisgIGV4cGxpY2l0IF9Wb2lkX2NvbnN0X21lbV9mdW4wX3JlZihfX2Z1bl90eXBlIF9fZikgOiBfTV9mKF9fZikge30KKworcHVibGljOgorICB2b2lkIG9wZXJhdG9yICgpKGNvbnN0IF9UcCYgX19wKSBjb25zdCB7IChfX3AuKl9NX2YpKCk7IH0KKworcHJpdmF0ZToKKyAgX19mdW5fdHlwZSBfTV9mOworfTsKKwordGVtcGxhdGU8Y2xhc3MgX1RwLCBjbGFzcyBfQXJnPgorY2xhc3MgX1ZvaWRfY29uc3RfbWVtX2Z1bjFfcmVmIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAsX0FyZyx2b2lkPiB7Citwcm90ZWN0ZWQ6CisgIHR5cGVkZWYgdm9pZCAoX1RwOjoqX19mdW5fdHlwZSkgKF9BcmcpIGNvbnN0OworICBleHBsaWNpdCBfVm9pZF9jb25zdF9tZW1fZnVuMV9yZWYoX19mdW5fdHlwZSBfX2YpIDogX01fZihfX2YpIHt9CisKK3B1YmxpYzoKKyAgdm9pZCBvcGVyYXRvciAoKShjb25zdCBfVHAmIF9fcCwgX0FyZyBfX3gpIGNvbnN0IHsgKF9fcC4qX01fZikoX194KTsgfQorCitwcml2YXRlOgorICBfX2Z1bl90eXBlIF9NX2Y7Cit9OworCitfU1RMUF9URU1QTEFURV9OVUxMCitzdHJ1Y3QgX01lbV9mdW5fdHJhaXRzPHZvaWQ+IHsKKyAgdGVtcGxhdGU8Y2xhc3MgX1RwPiBzdHJ1Y3QgX0FyZ3MwIHsKKyAgICB0eXBlZGVmIF9Wb2lkX21lbV9mdW4wX3B0cjxfVHA+ICAgICAgICAgICAgIF9QdHI7CisgICAgdHlwZWRlZiBfVm9pZF9jb25zdF9tZW1fZnVuMF9wdHI8X1RwPiAgICAgICBfUHRyX2NvbnN0OworICAgIHR5cGVkZWYgX1ZvaWRfbWVtX2Z1bjBfcmVmPF9UcD4gICAgICAgICAgICAgX1JlZjsKKyAgICB0eXBlZGVmIF9Wb2lkX2NvbnN0X21lbV9mdW4wX3JlZjxfVHA+ICAgICAgIF9SZWZfY29uc3Q7CisgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1RwLCBjbGFzcyBfQXJnPiBzdHJ1Y3QgX0FyZ3MxIHsKKyAgICB0eXBlZGVmIF9Wb2lkX21lbV9mdW4xX3B0cjxfVHAsX0FyZz4gICAgICAgIF9QdHI7CisgICAgdHlwZWRlZiBfVm9pZF9jb25zdF9tZW1fZnVuMV9wdHI8X1RwLF9Bcmc+ICBfUHRyX2NvbnN0OworICAgIHR5cGVkZWYgX1ZvaWRfbWVtX2Z1bjFfcmVmPF9UcCxfQXJnPiAgICAgICAgX1JlZjsKKyAgICB0eXBlZGVmIF9Wb2lkX2NvbnN0X21lbV9mdW4xX3JlZjxfVHAsX0FyZz4gIF9SZWZfY29uc3Q7CisgIH07Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBfQXJnPgorY2xhc3MgX1B0cl92b2lkX2Z1bjFfYmFzZSA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxfQXJnLCB2b2lkPiB7Citwcm90ZWN0ZWQ6CisgIHR5cGVkZWYgdm9pZCAoKl9fZnVuX3R5cGUpIChfQXJnKTsKKyAgZXhwbGljaXQgX1B0cl92b2lkX2Z1bjFfYmFzZShfX2Z1bl90eXBlIF9fZikgOiBfTV9mKF9fZikge30KKworcHVibGljOgorICB2b2lkIG9wZXJhdG9yKCkoX0FyZyBfX3gpIGNvbnN0IHsgX01fZihfX3gpOyB9CisKK3ByaXZhdGU6CisgIF9fZnVuX3R5cGUgX01fZjsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfQXJnMSwgY2xhc3MgX0FyZzI+CitjbGFzcyBfUHRyX3ZvaWRfZnVuMl9iYXNlIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfQXJnMSxfQXJnMix2b2lkPiB7Citwcm90ZWN0ZWQ6CisgIHR5cGVkZWYgdm9pZCAoKl9fZnVuX3R5cGUpIChfQXJnMSwgX0FyZzIpOworICBleHBsaWNpdCBfUHRyX3ZvaWRfZnVuMl9iYXNlKF9fZnVuX3R5cGUgX19mKSA6IF9NX2YoX19mKSB7fQorCitwdWJsaWM6CisgIHZvaWQgb3BlcmF0b3IoKShfQXJnMSBfX3gsIF9BcmcyIF9feSkgY29uc3QgeyBfTV9mKF9feCwgX195KTsgfQorCitwcml2YXRlOgorICBfX2Z1bl90eXBlIF9NX2Y7Cit9OworCitfU1RMUF9URU1QTEFURV9OVUxMCitzdHJ1Y3QgX1B0cl9mdW5fdHJhaXRzPHZvaWQ+IHsKKyAgdGVtcGxhdGU8Y2xhc3MgX0FyZz4gc3RydWN0IF9BcmdzMSB7CisgICAgdHlwZWRlZiBfUHRyX3ZvaWRfZnVuMV9iYXNlPF9Bcmc+IF9GdW47CisgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0FyZzEsIGNsYXNzIF9BcmcyPiBzdHJ1Y3QgX0FyZ3MyIHsKKyAgICB0eXBlZGVmIF9QdHJfdm9pZF9mdW4yX2Jhc2U8X0FyZzEsX0FyZzI+IF9GdW47CisgIH07Cit9OworCisvLyBwYXZlbDogbmVlZCBleHRyYSBsZXZlbCBvZiBpbmhlcml0YW5jZSBoZXJlIHNpbmNlIE1TVkMrKyBkb2VzIG5vdAorLy8gYWNjZXB0IHRyYWl0cy1iYXNlZCBmYWtlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gZm9yIHRlbXBsYXRlCisvLyBhcmd1bWVudHMgb3RoZXIgdGhhbiBmaXJzdAorCit0ZW1wbGF0ZTxjbGFzcyBfUmVzdWx0LCBjbGFzcyBfQXJnPgorY2xhc3MgX1B0cl9mdW4xIDoKKyAgcHVibGljIF9QdHJfZnVuX3RyYWl0czxfUmVzdWx0Pjo6X1NUTFBfVEVNUExBVEUgX0FyZ3MxPF9Bcmc+OjpfRnVuIHsKK3Byb3RlY3RlZDoKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUHRyX2Z1bl90cmFpdHM8X1Jlc3VsdD46Ol9TVExQX1RFTVBMQVRFIF9BcmdzMTxfQXJnPjo6X0Z1biBfQmFzZTsKKyAgZXhwbGljaXQgX1B0cl9mdW4xKHR5cGVuYW1lIF9CYXNlOjpfX2Z1bl90eXBlIF9fZikgOiBfQmFzZShfX2YpIHt9Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBfUmVzdWx0LCBjbGFzcyBfQXJnMSwgY2xhc3MgX0FyZzI+CitjbGFzcyBfUHRyX2Z1bjIgOgorICBwdWJsaWMgX1B0cl9mdW5fdHJhaXRzPF9SZXN1bHQ+OjpfU1RMUF9URU1QTEFURSBfQXJnczI8X0FyZzEsX0FyZzI+OjpfRnVuIHsKK3Byb3RlY3RlZDoKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUHRyX2Z1bl90cmFpdHM8X1Jlc3VsdD46Ol9TVExQX1RFTVBMQVRFIF9BcmdzMjxfQXJnMSxfQXJnMj46Ol9GdW4gX0Jhc2U7CisgIGV4cGxpY2l0IF9QdHJfZnVuMih0eXBlbmFtZSBfQmFzZTo6X19mdW5fdHlwZSBfX2YpIDogX0Jhc2UoX19mKSB7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9SZXN1bHQsIGNsYXNzIF9UcD4KK2NsYXNzIG1lbV9mdW5fdCA6CisgIHB1YmxpYyBfTWVtX2Z1bl90cmFpdHM8X1Jlc3VsdD46Ol9TVExQX1RFTVBMQVRFIF9BcmdzMDxfVHA+OjpfUHRyIHsKKyAgdHlwZWRlZiB0eXBlbmFtZQorICAgIF9NZW1fZnVuX3RyYWl0czxfUmVzdWx0Pjo6X1NUTFBfVEVNUExBVEUgX0FyZ3MwPF9UcD46Ol9QdHIgX0Jhc2U7CitwdWJsaWM6CisgIGV4cGxpY2l0IG1lbV9mdW5fdCh0eXBlbmFtZSBfQmFzZTo6X19mdW5fdHlwZSBfX2YpIDogX0Jhc2UoX19mKSB7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9SZXN1bHQsIGNsYXNzIF9UcD4KK2NsYXNzIGNvbnN0X21lbV9mdW5fdCA6CisgIHB1YmxpYyBfTWVtX2Z1bl90cmFpdHM8X1Jlc3VsdD46Ol9TVExQX1RFTVBMQVRFIF9BcmdzMDxfVHA+OjpfUHRyX2NvbnN0IHsKKyAgdHlwZWRlZiB0eXBlbmFtZQorICAgIF9NZW1fZnVuX3RyYWl0czxfUmVzdWx0Pjo6X1NUTFBfVEVNUExBVEUgX0FyZ3MwPF9UcD46Ol9QdHJfY29uc3QgX0Jhc2U7CitwdWJsaWM6CisgIGV4cGxpY2l0IGNvbnN0X21lbV9mdW5fdCh0eXBlbmFtZSBfQmFzZTo6X19mdW5fdHlwZSBfX2YpIDogX0Jhc2UoX19mKSB7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9SZXN1bHQsIGNsYXNzIF9UcD4KK2NsYXNzIG1lbV9mdW5fcmVmX3QgOgorICBwdWJsaWMgX01lbV9mdW5fdHJhaXRzPF9SZXN1bHQ+OjpfU1RMUF9URU1QTEFURSBfQXJnczA8X1RwPjo6X1JlZiB7CisgIHR5cGVkZWYgdHlwZW5hbWUKKyAgICBfTWVtX2Z1bl90cmFpdHM8X1Jlc3VsdD46Ol9TVExQX1RFTVBMQVRFIF9BcmdzMDxfVHA+OjpfUmVmIF9CYXNlOworcHVibGljOgorICBleHBsaWNpdCBtZW1fZnVuX3JlZl90KHR5cGVuYW1lIF9CYXNlOjpfX2Z1bl90eXBlIF9fZikgOiBfQmFzZShfX2YpIHt9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1Jlc3VsdCwgY2xhc3MgX1RwPgorY2xhc3MgY29uc3RfbWVtX2Z1bl9yZWZfdCA6CisgIHB1YmxpYyBfTWVtX2Z1bl90cmFpdHM8X1Jlc3VsdD46Ol9TVExQX1RFTVBMQVRFIF9BcmdzMDxfVHA+OjpfUmVmX2NvbnN0IHsKKyAgdHlwZWRlZiB0eXBlbmFtZQorICAgIF9NZW1fZnVuX3RyYWl0czxfUmVzdWx0Pjo6X1NUTFBfVEVNUExBVEUgX0FyZ3MwPF9UcD46Ol9SZWZfY29uc3QgX0Jhc2U7CitwdWJsaWM6CisgIGV4cGxpY2l0IGNvbnN0X21lbV9mdW5fcmVmX3QodHlwZW5hbWUgX0Jhc2U6Ol9fZnVuX3R5cGUgX19mKSA6IF9CYXNlKF9fZikge30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfUmVzdWx0LCBjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+CitjbGFzcyBtZW1fZnVuMV90IDoKKyAgcHVibGljIF9NZW1fZnVuX3RyYWl0czxfUmVzdWx0Pjo6X1NUTFBfVEVNUExBVEUgX0FyZ3MxPF9UcCxfQXJnPjo6X1B0ciB7CisgIHR5cGVkZWYgdHlwZW5hbWUKKyAgICBfTWVtX2Z1bl90cmFpdHM8X1Jlc3VsdD46Ol9TVExQX1RFTVBMQVRFIF9BcmdzMTxfVHAsX0FyZz46Ol9QdHIgX0Jhc2U7CitwdWJsaWM6CisgIGV4cGxpY2l0IG1lbV9mdW4xX3QodHlwZW5hbWUgX0Jhc2U6Ol9fZnVuX3R5cGUgX19mKSA6IF9CYXNlKF9fZikge30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfUmVzdWx0LCBjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+CitjbGFzcyBjb25zdF9tZW1fZnVuMV90IDoKKyAgcHVibGljIF9NZW1fZnVuX3RyYWl0czxfUmVzdWx0Pjo6X1NUTFBfVEVNUExBVEUgX0FyZ3MxPF9UcCxfQXJnPjo6X1B0cl9jb25zdCB7CisgIHR5cGVkZWYgdHlwZW5hbWUKKyAgICBfTWVtX2Z1bl90cmFpdHM8X1Jlc3VsdD46Ol9TVExQX1RFTVBMQVRFIF9BcmdzMTxfVHAsX0FyZz46Ol9QdHJfY29uc3QgX0Jhc2U7CitwdWJsaWM6CisgIGV4cGxpY2l0IGNvbnN0X21lbV9mdW4xX3QodHlwZW5hbWUgX0Jhc2U6Ol9fZnVuX3R5cGUgX19mKSA6IF9CYXNlKF9fZikge30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfUmVzdWx0LCBjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+CitjbGFzcyBtZW1fZnVuMV9yZWZfdCA6CisgIHB1YmxpYyBfTWVtX2Z1bl90cmFpdHM8X1Jlc3VsdD46Ol9TVExQX1RFTVBMQVRFIF9BcmdzMTxfVHAsX0FyZz46Ol9SZWYgeworICB0eXBlZGVmIHR5cGVuYW1lCisgICAgX01lbV9mdW5fdHJhaXRzPF9SZXN1bHQ+OjpfU1RMUF9URU1QTEFURSBfQXJnczE8X1RwLF9Bcmc+OjpfUmVmIF9CYXNlOworcHVibGljOgorICBleHBsaWNpdCBtZW1fZnVuMV9yZWZfdCh0eXBlbmFtZSBfQmFzZTo6X19mdW5fdHlwZSBfX2YpIDogX0Jhc2UoX19mKSB7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9SZXN1bHQsIGNsYXNzIF9UcCwgY2xhc3MgX0FyZz4KK2NsYXNzIGNvbnN0X21lbV9mdW4xX3JlZl90IDoKKyAgcHVibGljIF9NZW1fZnVuX3RyYWl0czxfUmVzdWx0Pjo6X1NUTFBfVEVNUExBVEUgX0FyZ3MxPF9UcCxfQXJnPjo6X1JlZl9jb25zdCB7CisgIHR5cGVkZWYgdHlwZW5hbWUKKyAgICBfTWVtX2Z1bl90cmFpdHM8X1Jlc3VsdD46Ol9TVExQX1RFTVBMQVRFIF9BcmdzMTxfVHAsX0FyZz46Ol9SZWZfY29uc3QgX0Jhc2U7CitwdWJsaWM6CisgIGV4cGxpY2l0IGNvbnN0X21lbV9mdW4xX3JlZl90KHR5cGVuYW1lIF9CYXNlOjpfX2Z1bl90eXBlIF9fZikgOiBfQmFzZShfX2YpIHt9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0FyZywgY2xhc3MgX1Jlc3VsdD4KK2NsYXNzIHBvaW50ZXJfdG9fdW5hcnlfZnVuY3Rpb24gOgorICBwdWJsaWMgX1B0cl9mdW4xPF9SZXN1bHQsX0FyZz4geworICB0eXBlZGVmIHR5cGVuYW1lCisgICAgX1B0cl9mdW4xPF9SZXN1bHQsX0FyZz46Ol9fZnVuX3R5cGUgX19mdW5fdHlwZTsKK3B1YmxpYzoKKyAgZXhwbGljaXQgcG9pbnRlcl90b191bmFyeV9mdW5jdGlvbihfX2Z1bl90eXBlIF9fZikKKyAgICA6IF9QdHJfZnVuMTxfUmVzdWx0LF9Bcmc+KF9fZikge30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfQXJnMSwgY2xhc3MgX0FyZzIsIGNsYXNzIF9SZXN1bHQ+CitjbGFzcyBwb2ludGVyX3RvX2JpbmFyeV9mdW5jdGlvbiA6CisgIHB1YmxpYyBfUHRyX2Z1bjI8X1Jlc3VsdCxfQXJnMSxfQXJnMj4geworICB0eXBlZGVmIHR5cGVuYW1lCisgICAgX1B0cl9mdW4yPF9SZXN1bHQsX0FyZzEsX0FyZzI+OjpfX2Z1bl90eXBlIF9fZnVuX3R5cGU7CitwdWJsaWM6CisgIGV4cGxpY2l0IHBvaW50ZXJfdG9fYmluYXJ5X2Z1bmN0aW9uKF9fZnVuX3R5cGUgX19mKQorICAgIDogX1B0cl9mdW4yPF9SZXN1bHQsX0FyZzEsX0FyZzI+KF9fZikge30KK307CisKKyNlbHNlCisKK3RlbXBsYXRlIDxjbGFzcyBfUmV0LCBjbGFzcyBfVHA+CitjbGFzcyBtZW1fZnVuX3QgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248X1RwKixfUmV0PiB7CisgIHR5cGVkZWYgX1JldCAoX1RwOjoqX19mdW5fdHlwZSkodm9pZCk7CitwdWJsaWM6CisgIGV4cGxpY2l0IG1lbV9mdW5fdChfX2Z1bl90eXBlIF9fcGYpIDogX01fZihfX3BmKSB7fQorICBfUmV0IG9wZXJhdG9yKCkoX1RwKiBfX3ApIGNvbnN0IHsgcmV0dXJuIChfX3AtPipfTV9mKSgpOyB9Citwcml2YXRlOgorICBfX2Z1bl90eXBlIF9NX2Y7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JldCwgY2xhc3MgX1RwPgorY2xhc3MgY29uc3RfbWVtX2Z1bl90IDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPGNvbnN0IF9UcCosX1JldD4geworICB0eXBlZGVmIF9SZXQgKF9UcDo6Kl9fZnVuX3R5cGUpKHZvaWQpIGNvbnN0OworcHVibGljOgorICBleHBsaWNpdCBjb25zdF9tZW1fZnVuX3QoX19mdW5fdHlwZSBfX3BmKSA6IF9NX2YoX19wZikge30KKyAgX1JldCBvcGVyYXRvcigpKGNvbnN0IF9UcCogX19wKSBjb25zdCB7IHJldHVybiAoX19wLT4qX01fZikoKTsgfQorcHJpdmF0ZToKKyAgX19mdW5fdHlwZSBfTV9mOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9SZXQsIGNsYXNzIF9UcD4KK2NsYXNzIG1lbV9mdW5fcmVmX3QgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248X1RwLF9SZXQ+IHsKKyAgdHlwZWRlZiBfUmV0IChfVHA6OipfX2Z1bl90eXBlKSh2b2lkKTsKK3B1YmxpYzoKKyAgZXhwbGljaXQgbWVtX2Z1bl9yZWZfdChfX2Z1bl90eXBlIF9fcGYpIDogX01fZihfX3BmKSB7fQorICBfUmV0IG9wZXJhdG9yKCkoX1RwJiBfX3IpIGNvbnN0IHsgcmV0dXJuIChfX3IuKl9NX2YpKCk7IH0KK3ByaXZhdGU6CisgIF9fZnVuX3R5cGUgX01fZjsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfUmV0LCBjbGFzcyBfVHA+CitjbGFzcyBjb25zdF9tZW1fZnVuX3JlZl90IDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPF9UcCxfUmV0PiB7CisgIHR5cGVkZWYgX1JldCAoX1RwOjoqX19mdW5fdHlwZSkodm9pZCkgY29uc3Q7CitwdWJsaWM6CisgIGV4cGxpY2l0IGNvbnN0X21lbV9mdW5fcmVmX3QoX19mdW5fdHlwZSBfX3BmKSA6IF9NX2YoX19wZikge30KKyAgX1JldCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX19yKSBjb25zdCB7IHJldHVybiAoX19yLipfTV9mKSgpOyB9Citwcml2YXRlOgorICBfX2Z1bl90eXBlIF9NX2Y7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JldCwgY2xhc3MgX1RwLCBjbGFzcyBfQXJnPgorY2xhc3MgbWVtX2Z1bjFfdCA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwKixfQXJnLF9SZXQ+IHsKKyAgdHlwZWRlZiBfUmV0IChfVHA6OipfX2Z1bl90eXBlKShfQXJnKTsKK3B1YmxpYzoKKyAgZXhwbGljaXQgbWVtX2Z1bjFfdChfX2Z1bl90eXBlIF9fcGYpIDogX01fZihfX3BmKSB7fQorICBfUmV0IG9wZXJhdG9yKCkoX1RwKiBfX3AsIF9BcmcgX194KSBjb25zdCB7IHJldHVybiAoX19wLT4qX01fZikoX194KTsgfQorcHJpdmF0ZToKKyAgX19mdW5fdHlwZSBfTV9mOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9SZXQsIGNsYXNzIF9UcCwgY2xhc3MgX0FyZz4KK2NsYXNzIGNvbnN0X21lbV9mdW4xX3QgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPGNvbnN0IF9UcCosX0FyZyxfUmV0PiB7CisgIHR5cGVkZWYgX1JldCAoX1RwOjoqX19mdW5fdHlwZSkoX0FyZykgY29uc3Q7CitwdWJsaWM6CisgIGV4cGxpY2l0IGNvbnN0X21lbV9mdW4xX3QoX19mdW5fdHlwZSBfX3BmKSA6IF9NX2YoX19wZikge30KKyAgX1JldCBvcGVyYXRvcigpKGNvbnN0IF9UcCogX19wLCBfQXJnIF9feCkgY29uc3QKKyAgICB7IHJldHVybiAoX19wLT4qX01fZikoX194KTsgfQorcHJpdmF0ZToKKyAgX19mdW5fdHlwZSBfTV9mOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9SZXQsIGNsYXNzIF9UcCwgY2xhc3MgX0FyZz4KK2NsYXNzIG1lbV9mdW4xX3JlZl90IDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAsX0FyZyxfUmV0PiB7CisgIHR5cGVkZWYgX1JldCAoX1RwOjoqX19mdW5fdHlwZSkoX0FyZyk7CitwdWJsaWM6CisgIGV4cGxpY2l0IG1lbV9mdW4xX3JlZl90KF9fZnVuX3R5cGUgX19wZikgOiBfTV9mKF9fcGYpIHt9CisgIF9SZXQgb3BlcmF0b3IoKShfVHAmIF9fciwgX0FyZyBfX3gpIGNvbnN0IHsgcmV0dXJuIChfX3IuKl9NX2YpKF9feCk7IH0KK3ByaXZhdGU6CisgIF9fZnVuX3R5cGUgX01fZjsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfUmV0LCBjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+CitjbGFzcyBjb25zdF9tZW1fZnVuMV9yZWZfdCA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwLF9BcmcsX1JldD4geworICB0eXBlZGVmIF9SZXQgKF9UcDo6Kl9fZnVuX3R5cGUpKF9BcmcpIGNvbnN0OworcHVibGljOgorICBleHBsaWNpdCBjb25zdF9tZW1fZnVuMV9yZWZfdChfX2Z1bl90eXBlIF9fcGYpIDogX01fZihfX3BmKSB7fQorICBfUmV0IG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3IsIF9BcmcgX194KSBjb25zdCB7IHJldHVybiAoX19yLipfTV9mKShfX3gpOyB9Citwcml2YXRlOgorICBfX2Z1bl90eXBlIF9NX2Y7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0FyZywgY2xhc3MgX1Jlc3VsdD4KK2NsYXNzIHBvaW50ZXJfdG9fdW5hcnlfZnVuY3Rpb24gOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248X0FyZywgX1Jlc3VsdD4geworcHJvdGVjdGVkOgorICBfUmVzdWx0ICgqX01fcHRyKShfQXJnKTsKK3B1YmxpYzoKKyAgcG9pbnRlcl90b191bmFyeV9mdW5jdGlvbigpIHt9CisgIGV4cGxpY2l0IHBvaW50ZXJfdG9fdW5hcnlfZnVuY3Rpb24oX1Jlc3VsdCAoKl9feCkoX0FyZykpIDogX01fcHRyKF9feCkge30KKyAgX1Jlc3VsdCBvcGVyYXRvcigpKF9BcmcgX194KSBjb25zdCB7IHJldHVybiBfTV9wdHIoX194KTsgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9BcmcxLCBjbGFzcyBfQXJnMiwgY2xhc3MgX1Jlc3VsdD4KK2NsYXNzIHBvaW50ZXJfdG9fYmluYXJ5X2Z1bmN0aW9uIDoKKyAgcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfQXJnMSxfQXJnMixfUmVzdWx0PiB7Citwcm90ZWN0ZWQ6CisgICAgX1Jlc3VsdCAoKl9NX3B0cikoX0FyZzEsIF9BcmcyKTsKK3B1YmxpYzoKKyAgICBwb2ludGVyX3RvX2JpbmFyeV9mdW5jdGlvbigpIHt9CisgICAgZXhwbGljaXQgcG9pbnRlcl90b19iaW5hcnlfZnVuY3Rpb24oX1Jlc3VsdCAoKl9feCkoX0FyZzEsIF9BcmcyKSkKKyAgICAgIDogX01fcHRyKF9feCkge30KKyAgICBfUmVzdWx0IG9wZXJhdG9yKCkoX0FyZzEgX194LCBfQXJnMiBfX3kpIGNvbnN0IHsKKyAgICAgIHJldHVybiBfTV9wdHIoX194LCBfX3kpOworICAgIH0KK307CisKKyMgIGlmIGRlZmluZWQgKF9TVExQX0RPTlRfUkVUVVJOX1ZPSUQpICYmICFkZWZpbmVkIChfU1RMUF9OT19DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQorLy9QYXJ0aWFsIHNwZWNpYWxpemF0aW9ucyBmb3IgdGhlIHZvaWQgdHlwZQordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2NsYXNzIG1lbV9mdW5fdDx2b2lkLCBfVHA+IDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPF9UcCosdm9pZD4geworICB0eXBlZGVmIHZvaWQgKF9UcDo6Kl9fZnVuX3R5cGUpKHZvaWQpOworcHVibGljOgorICBleHBsaWNpdCBtZW1fZnVuX3QgX1NUTFBfUFNQRUMyKHZvaWQsX1RwKSAoX19mdW5fdHlwZSBfX3BmKSA6IF9NX2YoX19wZikge30KKyAgdm9pZCBvcGVyYXRvcigpKF9UcCogX19wKSBjb25zdCB7IChfX3AtPipfTV9mKSgpOyB9Citwcml2YXRlOgorICBfX2Z1bl90eXBlIF9NX2Y7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorY2xhc3MgY29uc3RfbWVtX2Z1bl90PHZvaWQsIF9UcD4gOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248Y29uc3QgX1RwKix2b2lkPiB7CisgIHR5cGVkZWYgdm9pZCAoX1RwOjoqX19mdW5fdHlwZSkodm9pZCkgY29uc3Q7CitwdWJsaWM6CisgIGV4cGxpY2l0IGNvbnN0X21lbV9mdW5fdCBfU1RMUF9QU1BFQzIodm9pZCxfVHApIChfX2Z1bl90eXBlIF9fcGYpIDogX01fZihfX3BmKSB7fQorICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgX1RwKiBfX3ApIGNvbnN0IHsgKF9fcC0+Kl9NX2YpKCk7IH0KK3ByaXZhdGU6CisgIF9fZnVuX3R5cGUgX01fZjsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitjbGFzcyBtZW1fZnVuX3JlZl90PHZvaWQsIF9UcD4gOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248X1RwLHZvaWQ+IHsKKyAgdHlwZWRlZiB2b2lkIChfVHA6OipfX2Z1bl90eXBlKSh2b2lkKTsKK3B1YmxpYzoKKyAgZXhwbGljaXQgbWVtX2Z1bl9yZWZfdCBfU1RMUF9QU1BFQzIodm9pZCxfVHApIChfX2Z1bl90eXBlIF9fcGYpIDogX01fZihfX3BmKSB7fQorICB2b2lkIG9wZXJhdG9yKCkoX1RwJiBfX3IpIGNvbnN0IHsgKF9fci4qX01fZikoKTsgfQorcHJpdmF0ZToKKyAgX19mdW5fdHlwZSBfTV9mOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2NsYXNzIGNvbnN0X21lbV9mdW5fcmVmX3Q8dm9pZCwgX1RwPiA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxfVHAsdm9pZD4geworICB0eXBlZGVmIHZvaWQgKF9UcDo6Kl9fZnVuX3R5cGUpKHZvaWQpIGNvbnN0OworcHVibGljOgorICBleHBsaWNpdCBjb25zdF9tZW1fZnVuX3JlZl90IF9TVExQX1BTUEVDMih2b2lkLF9UcCkgKF9fZnVuX3R5cGUgX19wZikgOiBfTV9mKF9fcGYpIHt9CisgIHZvaWQgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9fcikgY29uc3QgeyAoX19yLipfTV9mKSgpOyB9Citwcml2YXRlOgorICBfX2Z1bl90eXBlIF9NX2Y7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQXJnPgorY2xhc3MgbWVtX2Z1bjFfdDx2b2lkLCBfVHAsIF9Bcmc+IDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAqLF9Bcmcsdm9pZD4geworICB0eXBlZGVmIHZvaWQgKF9UcDo6Kl9fZnVuX3R5cGUpKF9BcmcpOworcHVibGljOgorICBleHBsaWNpdCBtZW1fZnVuMV90IF9TVExQX1BTUEVDMyh2b2lkLF9UcCxfQXJnKSAoX19mdW5fdHlwZSBfX3BmKSA6IF9NX2YoX19wZikge30KKyAgdm9pZCBvcGVyYXRvcigpKF9UcCogX19wLCBfQXJnIF9feCkgY29uc3QgeyAoX19wLT4qX01fZikoX194KTsgfQorcHJpdmF0ZToKKyAgX19mdW5fdHlwZSBfTV9mOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FyZz4KK2NsYXNzIGNvbnN0X21lbV9mdW4xX3Q8dm9pZCwgX1RwLCBfQXJnPgorICA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248Y29uc3QgX1RwKixfQXJnLHZvaWQ+IHsKKyAgdHlwZWRlZiB2b2lkIChfVHA6OipfX2Z1bl90eXBlKShfQXJnKSBjb25zdDsKK3B1YmxpYzoKKyAgZXhwbGljaXQgY29uc3RfbWVtX2Z1bjFfdCBfU1RMUF9QU1BFQzModm9pZCxfVHAsX0FyZykgKF9fZnVuX3R5cGUgX19wZikgOiBfTV9mKF9fcGYpIHt9CisgIHZvaWQgb3BlcmF0b3IoKShjb25zdCBfVHAqIF9fcCwgX0FyZyBfX3gpIGNvbnN0IHsgKF9fcC0+Kl9NX2YpKF9feCk7IH0KK3ByaXZhdGU6CisgIF9fZnVuX3R5cGUgX01fZjsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+CitjbGFzcyBtZW1fZnVuMV9yZWZfdDx2b2lkLCBfVHAsIF9Bcmc+CisgIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAsX0FyZyx2b2lkPiB7CisgIHR5cGVkZWYgdm9pZCAoX1RwOjoqX19mdW5fdHlwZSkoX0FyZyk7CitwdWJsaWM6CisgIGV4cGxpY2l0IG1lbV9mdW4xX3JlZl90IF9TVExQX1BTUEVDMyh2b2lkLF9UcCxfQXJnKSAoX19mdW5fdHlwZSBfX3BmKSA6IF9NX2YoX19wZikge30KKyAgdm9pZCBvcGVyYXRvcigpKF9UcCYgX19yLCBfQXJnIF9feCkgY29uc3QgeyAoX19yLipfTV9mKShfX3gpOyB9Citwcml2YXRlOgorICBfX2Z1bl90eXBlIF9NX2Y7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQXJnPgorY2xhc3MgY29uc3RfbWVtX2Z1bjFfcmVmX3Q8dm9pZCwgX1RwLCBfQXJnPgorICA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwLF9Bcmcsdm9pZD4geworICB0eXBlZGVmIHZvaWQgKF9UcDo6Kl9fZnVuX3R5cGUpKF9BcmcpIGNvbnN0OworcHVibGljOgorICBleHBsaWNpdCBjb25zdF9tZW1fZnVuMV9yZWZfdCBfU1RMUF9QU1BFQzModm9pZCxfVHAsX0FyZykgKF9fZnVuX3R5cGUgX19wZikgOiBfTV9mKF9fcGYpIHt9CisgIHZvaWQgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9fciwgX0FyZyBfX3gpIGNvbnN0IHsgKF9fci4qX01fZikoX194KTsgfQorcHJpdmF0ZToKKyAgX19mdW5fdHlwZSBfTV9mOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9Bcmc+CitjbGFzcyBwb2ludGVyX3RvX3VuYXJ5X2Z1bmN0aW9uPF9BcmcsIHZvaWQ+IDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPF9BcmcsIHZvaWQ+IHsKKyAgdHlwZWRlZiB2b2lkICgqX19mdW5fdHlwZSkoX0FyZyk7CisgIF9fZnVuX3R5cGUgX01fcHRyOworcHVibGljOgorICBwb2ludGVyX3RvX3VuYXJ5X2Z1bmN0aW9uKCkge30KKyAgZXhwbGljaXQgcG9pbnRlcl90b191bmFyeV9mdW5jdGlvbihfX2Z1bl90eXBlIF9feCkgOiBfTV9wdHIoX194KSB7fQorICB2b2lkIG9wZXJhdG9yKCkoX0FyZyBfX3gpIGNvbnN0IHsgX01fcHRyKF9feCk7IH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfQXJnMSwgY2xhc3MgX0FyZzI+CitjbGFzcyBwb2ludGVyX3RvX2JpbmFyeV9mdW5jdGlvbjxfQXJnMSwgX0FyZzIsIHZvaWQ+IDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfQXJnMSxfQXJnMix2b2lkPiB7CisgIHR5cGVkZWYgdm9pZCAoKl9fZnVuX3R5cGUpKF9BcmcxLCBfQXJnMik7CisgIF9fZnVuX3R5cGUgX01fcHRyOworcHVibGljOgorICBwb2ludGVyX3RvX2JpbmFyeV9mdW5jdGlvbigpIHt9CisgIGV4cGxpY2l0IHBvaW50ZXJfdG9fYmluYXJ5X2Z1bmN0aW9uKF9fZnVuX3R5cGUgX194KSA6IF9NX3B0cihfX3gpIHt9CisgIHZvaWQgb3BlcmF0b3IoKShfQXJnMSBfX3gsIF9BcmcyIF9feSkgY29uc3QgeyBfTV9wdHIoX194LCBfX3kpOyB9Cit9OworCisjICBlbmRpZgorCisjZW5kaWYKKworI2lmICFkZWZpbmVkIChfU1RMUF9NRU1CRVJfUE9JTlRFUl9QQVJBTV9CVUcpCisvLyBNZW1fZnVuIGFkYXB0b3IgaGVscGVyIGZ1bmN0aW9ucy4gIFRoZXJlIGFyZSBvbmx5IHR3bzoKKy8vICBtZW1fZnVuIGFuZCBtZW1fZnVuX3JlZi4gIChtZW1fZnVuMSBhbmQgbWVtX2Z1bjFfcmVmCisvLyAgYXJlIHByb3ZpZGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCBidXQgdGhleSBhcmUgbm8gbG9uZ2VyCisvLyAgcGFydCBvZiB0aGUgQysrIHN0YW5kYXJkLikKKwordGVtcGxhdGUgPGNsYXNzIF9SZXN1bHQsIGNsYXNzIF9UcD4KK2lubGluZSBtZW1fZnVuX3Q8X1Jlc3VsdCxfVHA+CittZW1fZnVuKF9SZXN1bHQgKF9UcDo6Kl9fZikoKSkgeyByZXR1cm4gbWVtX2Z1bl90PF9SZXN1bHQsX1RwPihfX2YpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfUmVzdWx0LCBjbGFzcyBfVHA+CitpbmxpbmUgY29uc3RfbWVtX2Z1bl90PF9SZXN1bHQsX1RwPgorbWVtX2Z1bihfUmVzdWx0IChfVHA6OipfX2YpKCkgY29uc3QpICB7IHJldHVybiBjb25zdF9tZW1fZnVuX3Q8X1Jlc3VsdCxfVHA+KF9fZik7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9SZXN1bHQsIGNsYXNzIF9UcD4KK2lubGluZSBtZW1fZnVuX3JlZl90PF9SZXN1bHQsX1RwPgorbWVtX2Z1bl9yZWYoX1Jlc3VsdCAoX1RwOjoqX19mKSgpKSAgeyByZXR1cm4gbWVtX2Z1bl9yZWZfdDxfUmVzdWx0LF9UcD4oX19mKTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1Jlc3VsdCwgY2xhc3MgX1RwPgoraW5saW5lIGNvbnN0X21lbV9mdW5fcmVmX3Q8X1Jlc3VsdCxfVHA+CittZW1fZnVuX3JlZihfUmVzdWx0IChfVHA6OipfX2YpKCkgY29uc3QpICB7IHJldHVybiBjb25zdF9tZW1fZnVuX3JlZl90PF9SZXN1bHQsX1RwPihfX2YpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfUmVzdWx0LCBjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+CitpbmxpbmUgbWVtX2Z1bjFfdDxfUmVzdWx0LF9UcCxfQXJnPgorbWVtX2Z1bihfUmVzdWx0IChfVHA6OipfX2YpKF9BcmcpKSB7IHJldHVybiBtZW1fZnVuMV90PF9SZXN1bHQsX1RwLF9Bcmc+KF9fZik7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9SZXN1bHQsIGNsYXNzIF9UcCwgY2xhc3MgX0FyZz4KK2lubGluZSBjb25zdF9tZW1fZnVuMV90PF9SZXN1bHQsX1RwLF9Bcmc+CittZW1fZnVuKF9SZXN1bHQgKF9UcDo6Kl9fZikoX0FyZykgY29uc3QpIHsgcmV0dXJuIGNvbnN0X21lbV9mdW4xX3Q8X1Jlc3VsdCxfVHAsX0FyZz4oX19mKTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1Jlc3VsdCwgY2xhc3MgX1RwLCBjbGFzcyBfQXJnPgoraW5saW5lIG1lbV9mdW4xX3JlZl90PF9SZXN1bHQsX1RwLF9Bcmc+CittZW1fZnVuX3JlZihfUmVzdWx0IChfVHA6OipfX2YpKF9BcmcpKSB7IHJldHVybiBtZW1fZnVuMV9yZWZfdDxfUmVzdWx0LF9UcCxfQXJnPihfX2YpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfUmVzdWx0LCBjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+CitpbmxpbmUgY29uc3RfbWVtX2Z1bjFfcmVmX3Q8X1Jlc3VsdCxfVHAsX0FyZz4KK21lbV9mdW5fcmVmKF9SZXN1bHQgKF9UcDo6Kl9fZikoX0FyZykgY29uc3QpIHsgcmV0dXJuIGNvbnN0X21lbV9mdW4xX3JlZl90PF9SZXN1bHQsX1RwLF9Bcmc+KF9fZik7IH0KKworIyAgaWYgIShkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKSB8fCBkZWZpbmVkIChfU1RMUF9OT19BTkFDSFJPTklTTVMpKQorLy8gIG1lbV9mdW4xIGFuZCBtZW1fZnVuMV9yZWYgYXJlIG5vIGxvbmdlciBwYXJ0IG9mIHRoZSBDKysgc3RhbmRhcmQsCisvLyAgYnV0IHRoZXkgYXJlIHByb3ZpZGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgordGVtcGxhdGUgPGNsYXNzIF9SZXN1bHQsIGNsYXNzIF9UcCwgY2xhc3MgX0FyZz4KK2lubGluZSBtZW1fZnVuMV90PF9SZXN1bHQsX1RwLF9Bcmc+CittZW1fZnVuMShfUmVzdWx0IChfVHA6OipfX2YpKF9BcmcpKSB7IHJldHVybiBtZW1fZnVuMV90PF9SZXN1bHQsX1RwLF9Bcmc+KF9fZik7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9SZXN1bHQsIGNsYXNzIF9UcCwgY2xhc3MgX0FyZz4KK2lubGluZSBjb25zdF9tZW1fZnVuMV90PF9SZXN1bHQsX1RwLF9Bcmc+CittZW1fZnVuMShfUmVzdWx0IChfVHA6OipfX2YpKF9BcmcpIGNvbnN0KSB7IHJldHVybiBjb25zdF9tZW1fZnVuMV90PF9SZXN1bHQsX1RwLF9Bcmc+KF9fZik7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9SZXN1bHQsIGNsYXNzIF9UcCwgY2xhc3MgX0FyZz4KK2lubGluZSBtZW1fZnVuMV9yZWZfdDxfUmVzdWx0LF9UcCxfQXJnPgorbWVtX2Z1bjFfcmVmKF9SZXN1bHQgKF9UcDo6Kl9fZikoX0FyZykpIHsgcmV0dXJuIG1lbV9mdW4xX3JlZl90PF9SZXN1bHQsX1RwLF9Bcmc+KF9fZik7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9SZXN1bHQsIGNsYXNzIF9UcCwgY2xhc3MgX0FyZz4KK2lubGluZSBjb25zdF9tZW1fZnVuMV9yZWZfdDxfUmVzdWx0LF9UcCxfQXJnPgorbWVtX2Z1bjFfcmVmKF9SZXN1bHQgKF9UcDo6Kl9fZikoX0FyZykgY29uc3QpIHsgcmV0dXJuIGNvbnN0X21lbV9mdW4xX3JlZl90PF9SZXN1bHQsX1RwLF9Bcmc+KF9fZik7IH0KKworIyAgZW5kaWYKKworI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfQXJnLCBjbGFzcyBfUmVzdWx0PgoraW5saW5lIHBvaW50ZXJfdG9fdW5hcnlfZnVuY3Rpb248X0FyZywgX1Jlc3VsdD4KK3B0cl9mdW4oX1Jlc3VsdCAoKl9fZikoX0FyZykpCit7IHJldHVybiBwb2ludGVyX3RvX3VuYXJ5X2Z1bmN0aW9uPF9BcmcsIF9SZXN1bHQ+KF9fZik7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9BcmcxLCBjbGFzcyBfQXJnMiwgY2xhc3MgX1Jlc3VsdD4KK2lubGluZSBwb2ludGVyX3RvX2JpbmFyeV9mdW5jdGlvbjxfQXJnMSxfQXJnMixfUmVzdWx0PgorcHRyX2Z1bihfUmVzdWx0ICgqX19mKShfQXJnMSwgX0FyZzIpKQoreyByZXR1cm4gcG9pbnRlcl90b19iaW5hcnlfZnVuY3Rpb248X0FyZzEsX0FyZzIsX1Jlc3VsdD4oX19mKTsgfQorCitfU1RMUF9FTkRfTkFNRVNQQUNFCmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9fZnVuY3Rpb25fYmFzZS5oIGIvc3RscG9ydC9zdGwvX2Z1bmN0aW9uX2Jhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTdmNGY1Ci0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvX2Z1bmN0aW9uX2Jhc2UuaApAQCAtMCwwICsxLDIxNyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LTE5OTgKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKy8qIE5PVEU6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIFNUTCBoZWFkZXJzLgorICogICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4KKyAqLworCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0ZVTkNUSU9OX0JBU0VfSAorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9GVU5DVElPTl9CQVNFX0gKKworI2lmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pICYmICFkZWZpbmVkIChfU1RMUF9UWVBFX1RSQUlUU19IKQorIyAgaW5jbHVkZSA8c3RsL3R5cGVfdHJhaXRzLmg+CisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfQXJnLCBjbGFzcyBfUmVzdWx0Pgorc3RydWN0IHVuYXJ5X2Z1bmN0aW9uIHsKKyAgdHlwZWRlZiBfQXJnIGFyZ3VtZW50X3R5cGU7CisgIHR5cGVkZWYgX1Jlc3VsdCByZXN1bHRfdHlwZTsKKyNpZiAhZGVmaW5lZCAoX19CT1JMQU5EQ19fKSB8fCAoX19CT1JMQU5EQ19fIDwgMHg1ODApCitwcm90ZWN0ZWQ6CisgIC8qIFRoaXMgY2xhc3MgcHVycG9zZSBpcyB0byBiZSBkZXJpdmVkIGJ1dCBpdCBpcyBub3QgcG9seW1vcnBoaWMgc28gdXNlcnMgc2hvdWxkIG5ldmVyIHRyeQorICAgKiB0byBkZXN0cm95IGFuIGluc3RhbmNlIG9mIGl0IGRpcmVjdGx5LiBUaGUgcHJvdGVjdGVkIG5vbi12aXJ0dWFsIGRlc3RydWN0b3IgbWFrZSB0aGlzCisgICAqIGZhY3Qgb2J2aW91cyBhdCBjb21waWxhdGlvbiB0aW1lLiAqLworICB+dW5hcnlfZnVuY3Rpb24oKSB7fQorI2VuZGlmCit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0FyZzEsIGNsYXNzIF9BcmcyLCBjbGFzcyBfUmVzdWx0Pgorc3RydWN0IGJpbmFyeV9mdW5jdGlvbiB7CisgIHR5cGVkZWYgX0FyZzEgZmlyc3RfYXJndW1lbnRfdHlwZTsKKyAgdHlwZWRlZiBfQXJnMiBzZWNvbmRfYXJndW1lbnRfdHlwZTsKKyAgdHlwZWRlZiBfUmVzdWx0IHJlc3VsdF90eXBlOworI2lmICFkZWZpbmVkIChfX0JPUkxBTkRDX18pIHx8IChfX0JPUkxBTkRDX18gPCAweDU4MCkKK3Byb3RlY3RlZDoKKyAgLyogU2VlIHVuYXJ5X2Z1bmN0aW9uIGNvbW1lbnQuICovCisgIH5iaW5hcnlfZnVuY3Rpb24oKSB7fQorI2VuZGlmCit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IGVxdWFsX3RvIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAsIF9UcCwgYm9vbD4geworICBib29sIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdCB7IHJldHVybiBfX3ggPT0gX195OyB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IGxlc3MgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCxfVHAsYm9vbD4KKyNpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQorLyogbGVzcyBpcyB0aGUgZGVmYXVsdCB0ZW1wbGF0ZSBwYXJhbWV0ZXIgZm9yIG1hbnkgU1RMIGNvbnRhaW5lcnMsIHRvIGZ1bGx5IHVzZQorICogdGhlIG1vdmUgY29uc3RydWN0b3IgZmVhdHVyZSB3ZSBuZWVkIHRvIGtub3cgdGhhdCB0aGUgZGVmYXVsdCBsZXNzIGlzIGp1c3QgYQorICogZnVuY3Rvci4KKyAqLworICAgICAgICAgICAgICAsIHB1YmxpYyBfX3N0bHBvcnRfY2xhc3M8bGVzczxfVHA+ID4KKyNlbmRpZgoreworICBib29sIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdCB7IHJldHVybiBfX3ggPCBfX3k7IH0KKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QQVJUSUFMX1NQRUNfV09SS0FST1VORCkgJiYgIWRlZmluZWQgKF9TVExQX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUikKKyAgdm9pZCBfTV9zd2FwX3dvcmthcm91bmQobGVzczxfVHA+JiBfX3gpIHt9CisjZW5kaWYKK307CisKKyNpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfX3R5cGVfdHJhaXRzPGxlc3M8X1RwPiA+IHsKKyNpZiAhZGVmaW5lZCAoX19CT1JMQU5EQ19fKQorICB0eXBlZGVmIHR5cGVuYW1lIF9Jc1NUTHBvcnRDbGFzczxsZXNzPF9UcD4gPjo6X1JldCBfU1RMcG9ydExlc3M7CisjZWxzZQorICBlbnVtIHsgX0lzID0gX0lzU1RMcG9ydENsYXNzPGxlc3M8X1RwPiA+OjpfSXMgfTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jvb2wydHlwZTxfSXM+OjpfUmV0IF9TVExwb3J0TGVzczsKKyNlbmRpZgorICB0eXBlZGVmIF9TVExwb3J0TGVzcyBoYXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yOworICB0eXBlZGVmIF9TVExwb3J0TGVzcyBoYXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yOworICB0eXBlZGVmIF9TVExwb3J0TGVzcyBoYXNfdHJpdmlhbF9hc3NpZ25tZW50X29wZXJhdG9yOworICB0eXBlZGVmIF9TVExwb3J0TGVzcyBoYXNfdHJpdmlhbF9kZXN0cnVjdG9yOworICB0eXBlZGVmIF9TVExwb3J0TGVzcyBpc19QT0RfdHlwZTsKK307CisjZW5kaWYKKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorbGVzczxfVHA+IF9fbGVzcyhfVHAqICkgeyByZXR1cm4gbGVzczxfVHA+KCk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2VxdWFsX3RvPF9UcD4gX19lcXVhbF90byhfVHAqICkgeyByZXR1cm4gZXF1YWxfdG88X1RwPigpOyB9CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IHBsdXMgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCwgX1RwLCBfVHA+IHsKKyAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdCB7IHJldHVybiBfX3ggKyBfX3k7IH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgbWludXMgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCwgX1RwLCBfVHA+IHsKKyAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdCB7IHJldHVybiBfX3ggLSBfX3k7IH0KK307CisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3BsdXM8X1RwPiBfX3BsdXMoX1RwKiApIHsgcmV0dXJuIHBsdXM8X1RwPigpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CittaW51czxfVHA+IF9fbWludXMoX1RwKiApIHsgcmV0dXJuIG1pbnVzPF9UcD4oKTsgfQorCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBtdWx0aXBsaWVzIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAsIF9UcCwgX1RwPiB7CisgIF9UcCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QgeyByZXR1cm4gX194ICogX195OyB9Cit9OworCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfUGFpcj4KK3N0cnVjdCBfU2VsZWN0MXN0IDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPF9QYWlyLCB0eXBlbmFtZSBfUGFpcjo6Zmlyc3RfdHlwZT4geworICBjb25zdCB0eXBlbmFtZSBfUGFpcjo6Zmlyc3RfdHlwZSYgb3BlcmF0b3IoKShjb25zdCBfUGFpciYgX194KSBjb25zdCB7CisgICAgcmV0dXJuIF9feC5maXJzdDsKKyAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9QYWlyPgorc3RydWN0IF9TZWxlY3QybmQgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248X1BhaXIsIHR5cGVuYW1lIF9QYWlyOjpzZWNvbmRfdHlwZT4geworICBjb25zdCB0eXBlbmFtZSBfUGFpcjo6c2Vjb25kX3R5cGUmIG9wZXJhdG9yKCkoY29uc3QgX1BhaXImIF9feCkgY29uc3QgeworICAgIHJldHVybiBfX3guc2Vjb25kOworICB9Cit9OworCisvLyBwcm9qZWN0MXN0IGFuZCBwcm9qZWN0Mm5kIGFyZSBleHRlbnNpb25zOiB0aGV5IGFyZSBub3QgcGFydCBvZiB0aGUgc3RhbmRhcmQKK3RlbXBsYXRlIDxjbGFzcyBfQXJnMSwgY2xhc3MgX0FyZzI+CitzdHJ1Y3QgX1Byb2plY3Qxc3QgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9BcmcxLCBfQXJnMiwgX0FyZzE+IHsKKyAgX0FyZzEgb3BlcmF0b3IoKShjb25zdCBfQXJnMSYgX194LCBjb25zdCBfQXJnMiYpIGNvbnN0IHsgcmV0dXJuIF9feDsgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9BcmcxLCBjbGFzcyBfQXJnMj4KK3N0cnVjdCBfUHJvamVjdDJuZCA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X0FyZzEsIF9BcmcyLCBfQXJnMj4geworICBfQXJnMiBvcGVyYXRvcigpKGNvbnN0IF9BcmcxJiwgY29uc3QgX0FyZzImIF9feSkgY29uc3QgeyByZXR1cm4gX195OyB9Cit9OworCisjaWYgZGVmaW5lZCAoX1NUTFBfTVVMVElfQ09OU1RfVEVNUExBVEVfQVJHX0JVRykKKy8vIGZicCA6IHNvcnQgb2Ygc2VsZWN0MXN0IGp1c3QgZm9yIG1hcHMKK3RlbXBsYXRlIDxjbGFzcyBfUGFpciwgY2xhc3MgX1doYXRldmVyPgorLy8gSkRKIChDVyBQcm8xIGRvZXNuJ3QgbGlrZSBjb25zdCB3aGVuIGZpcnN0X3R5cGUgaXMgYWxzbyBjb25zdCkKK3N0cnVjdCBfX1NlbGVjdDFzdF9oaW50IDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPF9QYWlyLCBfV2hhdGV2ZXI+IHsKKyAgICBjb25zdCBfV2hhdGV2ZXImIG9wZXJhdG9yICgpIChjb25zdCBfUGFpciYgX194KSBjb25zdCB7IHJldHVybiBfX3guZmlyc3Q7IH0KK307CisjICBkZWZpbmUgIF9TVExQX1NFTEVDVDFTVChfX3gsX195KSBfU1RMUF9QUklWIF9fU2VsZWN0MXN0X2hpbnQ8IF9feCwgX195ID4KKyNlbHNlCisjICBkZWZpbmUgIF9TVExQX1NFTEVDVDFTVChfX3gsIF9feSkgX1NUTFBfUFJJViBfU2VsZWN0MXN0PCBfX3ggPgorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX0lkZW50aXR5IDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPF9UcCxfVHA+IHsKKyAgY29uc3QgX1RwJiBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194KSBjb25zdCB7IHJldHVybiBfX3g7IH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfUmVzdWx0LCBjbGFzcyBfQXJndW1lbnQ+CitzdHJ1Y3QgX0NvbnN0YW50X3VuYXJ5X2Z1biB7CisgIHR5cGVkZWYgX0FyZ3VtZW50IGFyZ3VtZW50X3R5cGU7CisgIHR5cGVkZWYgIF9SZXN1bHQgIHJlc3VsdF90eXBlOworICByZXN1bHRfdHlwZSBfTV92YWw7CisKKyAgX0NvbnN0YW50X3VuYXJ5X2Z1bihjb25zdCByZXN1bHRfdHlwZSYgX192KSA6IF9NX3ZhbChfX3YpIHt9CisgIGNvbnN0IHJlc3VsdF90eXBlJiBvcGVyYXRvcigpKGNvbnN0IF9Bcmd1bWVudCYpIGNvbnN0IHsgcmV0dXJuIF9NX3ZhbDsgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9SZXN1bHQsIGNsYXNzIF9BcmcxLCBjbGFzcyBfQXJnMj4KK3N0cnVjdCBfQ29uc3RhbnRfYmluYXJ5X2Z1biB7CisgIHR5cGVkZWYgIF9BcmcxICAgZmlyc3RfYXJndW1lbnRfdHlwZTsKKyAgdHlwZWRlZiAgX0FyZzIgICBzZWNvbmRfYXJndW1lbnRfdHlwZTsKKyAgdHlwZWRlZiAgX1Jlc3VsdCByZXN1bHRfdHlwZTsKKyAgX1Jlc3VsdCBfTV92YWw7CisKKyAgX0NvbnN0YW50X2JpbmFyeV9mdW4oY29uc3QgX1Jlc3VsdCYgX192KSA6IF9NX3ZhbChfX3YpIHt9CisgIGNvbnN0IHJlc3VsdF90eXBlJiBvcGVyYXRvcigpKGNvbnN0IF9BcmcxJiwgY29uc3QgX0FyZzImKSBjb25zdCB7CisgICAgcmV0dXJuIF9NX3ZhbDsKKyAgfQorfTsKKworLy8gaWRlbnRpdHlfZWxlbWVudCAobm90IHBhcnQgb2YgdGhlIEMrKyBzdGFuZGFyZCkuCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBpbmxpbmUgX1RwIF9faWRlbnRpdHlfZWxlbWVudChwbHVzPF9UcD4pIHsgIHJldHVybiBfVHAoMCk7IH0KK3RlbXBsYXRlIDxjbGFzcyBfVHA+IGlubGluZSBfVHAgX19pZGVudGl0eV9lbGVtZW50KG11bHRpcGxpZXM8X1RwPikgeyByZXR1cm4gX1RwKDEpOyB9CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9GVU5DVElPTl9CQVNFX0ggKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL19oYXNoX2Z1bi5oIGIvc3RscG9ydC9zdGwvX2hhc2hfZnVuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE5N2Q3YgotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc3RsL19oYXNoX2Z1bi5oCkBAIC0wLDAgKzEsMTQ2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk2LTE5OTgKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqLworCisvKiBOT1RFOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBTVEwgaGVhZGVycy4KKyAqICAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuCisgKi8KKworI2lmbmRlZiBfU1RMUF9IQVNIX0ZVTl9ICisjZGVmaW5lIF9TVExQX0hBU0hfRlVOX0gKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DU1REREVGCisjICBpbmNsdWRlIDxzdGwvX2NzdGRkZWYuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9LZXk+IHN0cnVjdCBoYXNoIHsgfTsKKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCitpbmxpbmUgc2l6ZV90IF9fc3RsX2hhc2hfc3RyaW5nKGNvbnN0IGNoYXIqIF9fcykgeworICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKQorICB1bnNpZ25lZCBsb25nIF9faCA9IDA7CisgIGZvciAoIDsgKl9fczsgKytfX3MpCisgICAgX19oID0gNSpfX2ggKyAqX19zOworCisgIHJldHVybiBzaXplX3QoX19oKTsKK30KKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK19TVExQX1RFTVBMQVRFX05VTEwKK3N0cnVjdCBoYXNoPGNoYXIqPiB7CisgIHNpemVfdCBvcGVyYXRvcigpKGNvbnN0IGNoYXIqIF9fcykgY29uc3QgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgICAgcmV0dXJuIF9TVExQX1BSSVYgX19zdGxfaGFzaF9zdHJpbmcoX19zKTsKKyAgfQorfTsKKworX1NUTFBfVEVNUExBVEVfTlVMTAorc3RydWN0IGhhc2g8Y29uc3QgY2hhcio+IHsKKyAgc2l6ZV90IG9wZXJhdG9yKCkoY29uc3QgY2hhciogX19zKSBjb25zdCB7CisgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKKyAgICByZXR1cm4gX1NUTFBfUFJJViBfX3N0bF9oYXNoX3N0cmluZyhfX3MpOworICB9Cit9OworCitfU1RMUF9URU1QTEFURV9OVUxMIHN0cnVjdCBoYXNoPGNoYXI+IHsKKyAgc2l6ZV90IG9wZXJhdG9yKCkoY2hhciBfX3gpIGNvbnN0IHsgcmV0dXJuIF9feDsgfQorfTsKK19TVExQX1RFTVBMQVRFX05VTEwgc3RydWN0IGhhc2g8dW5zaWduZWQgY2hhcj4geworICBzaXplX3Qgb3BlcmF0b3IoKSh1bnNpZ25lZCBjaGFyIF9feCkgY29uc3QgeyByZXR1cm4gX194OyB9Cit9OworI2lmICFkZWZpbmVkIChfU1RMUF9OT19TSUdORURfQlVJTFRJTlMpCitfU1RMUF9URU1QTEFURV9OVUxMIHN0cnVjdCBoYXNoPHNpZ25lZCBjaGFyPiB7CisgIHNpemVfdCBvcGVyYXRvcigpKHVuc2lnbmVkIGNoYXIgX194KSBjb25zdCB7IHJldHVybiBfX3g7IH0KK307CisjZW5kaWYKK19TVExQX1RFTVBMQVRFX05VTEwgc3RydWN0IGhhc2g8c2hvcnQ+IHsKKyAgc2l6ZV90IG9wZXJhdG9yKCkoc2hvcnQgX194KSBjb25zdCB7IHJldHVybiBfX3g7IH0KK307CitfU1RMUF9URU1QTEFURV9OVUxMIHN0cnVjdCBoYXNoPHVuc2lnbmVkIHNob3J0PiB7CisgIHNpemVfdCBvcGVyYXRvcigpKHVuc2lnbmVkIHNob3J0IF9feCkgY29uc3QgeyByZXR1cm4gX194OyB9Cit9OworX1NUTFBfVEVNUExBVEVfTlVMTCBzdHJ1Y3QgaGFzaDxpbnQ+IHsKKyAgc2l6ZV90IG9wZXJhdG9yKCkoaW50IF9feCkgY29uc3QgeyByZXR1cm4gX194OyB9Cit9OworCisjaWYgIWRlZmluZWQgKF9TVExQX01TVkMpIHx8IChfU1RMUF9NU1ZDIDwgMTMwMCkgfHwgZGVmaW5lZCAoX1dJTjY0KQorX1NUTFBfVEVNUExBVEVfTlVMTCBzdHJ1Y3QgaGFzaDx1bnNpZ25lZCBpbnQ+IHsKKyAgc2l6ZV90IG9wZXJhdG9yKCkodW5zaWduZWQgaW50IF9feCkgY29uc3QgeyByZXR1cm4gX194OyB9Cit9OworI2Vsc2UKKy8qIE1TVkMgLk5ldCBzaW5jZSAyMDAyIGhhcyBhIDY0IGJpdHMgcG9ydGFiaWxpdHkgd2FybmluZyBmZWF0dXJlLiB0eXBlZGVmCisgKiBsaWtlIHNpemVfdCBhcmUgdGFnZ2VkIGFzIHBvdGVudGlhbCA2NCBiaXRzIHZhcmlhYmxlcyBtYWtpbmcgdGhlbSBkaWZmZXJlbnQgZnJvbQorICogdW5zaWduZWQgaW50LiBUbyBhdm9pZCB0aGUgd2FybmluZyB3aGVuIGEgaGFzaCBjb250YWluZXIgaXMgaW5zdGFuY2lhdGVkIHdpdGgKKyAqIHRoZSBzaXplX3Qga2V5IHdlIHByZWZlciB0byBncmFudCB0aGUgc2l6ZV90IHNwZWNpYWxpemF0aW9uIHJhdGhlciB0aGFuIHRoZQorICogdW5zaWduZWQgaW50IG9uZS4KKyAqLworX1NUTFBfVEVNUExBVEVfTlVMTCBzdHJ1Y3QgaGFzaDxzaXplX3Q+IHsKKyAgc2l6ZV90IG9wZXJhdG9yKCkoc2l6ZV90IF9feCkgY29uc3QgeyByZXR1cm4gX194OyB9Cit9OworI2VuZGlmCisKK19TVExQX1RFTVBMQVRFX05VTEwgc3RydWN0IGhhc2g8bG9uZz4geworICBzaXplX3Qgb3BlcmF0b3IoKShsb25nIF9feCkgY29uc3QgeyByZXR1cm4gX194OyB9Cit9OworX1NUTFBfVEVNUExBVEVfTlVMTCBzdHJ1Y3QgaGFzaDx1bnNpZ25lZCBsb25nPiB7CisgIHNpemVfdCBvcGVyYXRvcigpKHVuc2lnbmVkIGxvbmcgX194KSBjb25zdCB7IHJldHVybiBfX3g7IH0KK307CisKKyNpZiBkZWZpbmVkIChfU1RMUF9MT05HX0xPTkcpCitfU1RMUF9URU1QTEFURV9OVUxMIHN0cnVjdCBoYXNoPF9TVExQX0xPTkdfTE9ORz4geworICBzaXplX3Qgb3BlcmF0b3IoKShfU1RMUF9MT05HX0xPTkcgeCkgY29uc3QgeyByZXR1cm4gKHNpemVfdCl4OyB9Cit9OworX1NUTFBfVEVNUExBVEVfTlVMTCBzdHJ1Y3QgaGFzaDx1bnNpZ25lZCBfU1RMUF9MT05HX0xPTkc+IHsKKyAgc2l6ZV90IG9wZXJhdG9yKCkodW5zaWduZWQgX1NUTFBfTE9OR19MT05HIHgpIGNvbnN0IHsgcmV0dXJuIChzaXplX3QpeDsgfQorfTsKKyNlbmRpZgorCitfU1RMUF9URU1QTEFURV9OVUxMCitzdHJ1Y3QgaGFzaDx2b2lkICo+Cit7CisgICAgdW5pb24gX192cCB7CisgICAgICAgIHNpemVfdCBzOworICAgICAgICB2b2lkICAqcDsKKyAgICB9OworCisgICAgc2l6ZV90IG9wZXJhdG9yKCkodm9pZCAqX194KSBjb25zdAorICAgICAgeworICAgICAgICBfX3ZwIHZwOworICAgICAgICB2cC5wID0gX194OworICAgICAgICByZXR1cm4gdnAuczsKKyAgICAgIH0KK307CisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2VuZGlmIC8qIF9TVExQX0hBU0hfRlVOX0ggKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL19oYXNoX21hcC5oIGIvc3RscG9ydC9zdGwvX2hhc2hfbWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q0NjYwMwotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc3RsL19oYXNoX21hcC5oCkBAIC0wLDAgKzEsNTAwIEBACisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworLyogTk9URTogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgU1RMIGhlYWRlcnMuCisgKiAgIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LgorICovCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfSEFTSF9NQVBfSAorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9IQVNIX01BUF9ICisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfSEFTSFRBQkxFX0gKKyMgIGluY2x1ZGUgPHN0bC9faGFzaHRhYmxlLmg+CisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKKy8vU3BlY2lmaWMgaXRlcmF0b3IgdHJhaXRzIGNyZWF0aW9uCitfU1RMUF9DUkVBVEVfSEFTSF9JVEVSQVRPUl9UUkFJVFMoSGFzaE1hcFRyYWl0c1QsIHRyYWl0cykKKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgX1NUTFBfREZMX1RNUExfUEFSQU0oX0hhc2hGY24saGFzaDxfS2V5PiksCisgICAgICAgICAgX1NUTFBfREZMX1RNUExfUEFSQU0oX0VxdWFsS2V5LGVxdWFsX3RvPF9LZXk+KSwKKyAgICAgICAgICBfU1RMUF9ERUZBVUxUX1BBSVJfQUxMT0NBVE9SX1NFTEVDVChfU1RMUF9DT05TVCBfS2V5LCBfVHApID4KK2NsYXNzIGhhc2hfbWFwCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKQorICAgICAgICAgICAgICAgOiBwdWJsaWMgX19zdGxwb3J0X2NsYXNzPGhhc2hfbWFwPF9LZXksIF9UcCwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPiA+CisjZW5kaWYKK3sKK3ByaXZhdGU6CisgIHR5cGVkZWYgaGFzaF9tYXA8X0tleSwgX1RwLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+IF9TZWxmOworcHVibGljOgorICB0eXBlZGVmIF9LZXkga2V5X3R5cGU7CisgIHR5cGVkZWYgX1RwIGRhdGFfdHlwZTsKKyAgdHlwZWRlZiBfVHAgbWFwcGVkX3R5cGU7CisgIHR5cGVkZWYgcGFpcjxfU1RMUF9DT05TVCBrZXlfdHlwZSwgZGF0YV90eXBlPiB2YWx1ZV90eXBlOworcHJpdmF0ZToKKyAgLy9TcGVjaWZpYyBpdGVyYXRvciB0cmFpdHMgY3JlYXRpb24KKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9IYXNoTWFwVHJhaXRzVDx2YWx1ZV90eXBlPiBfSGFzaE1hcFRyYWl0czsKKworcHVibGljOgorICB0eXBlZGVmIGhhc2h0YWJsZTx2YWx1ZV90eXBlLCBrZXlfdHlwZSwgX0hhc2hGY24sIF9IYXNoTWFwVHJhaXRzLAorICAgICAgICAgICAgICAgICAgICBfU1RMUF9TRUxFQ1QxU1QodmFsdWVfdHlwZSwgX0tleSksIF9FcXVhbEtleSwgX0FsbG9jID4gX0h0OworCisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpoYXNoZXIgaGFzaGVyOworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6a2V5X2VxdWFsIGtleV9lcXVhbDsKKworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6c2l6ZV90eXBlIHNpemVfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpwb2ludGVyIHBvaW50ZXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpjb25zdF9wb2ludGVyIGNvbnN0X3BvaW50ZXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpyZWZlcmVuY2UgcmVmZXJlbmNlOworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZTsKKworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6aXRlcmF0b3IgaXRlcmF0b3I7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7CisKKyAgaGFzaGVyIGhhc2hfZnVuY3QoKSBjb25zdCB7IHJldHVybiBfTV9odC5oYXNoX2Z1bmN0KCk7IH0KKyAga2V5X2VxdWFsIGtleV9lcSgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmtleV9lcSgpOyB9CisgIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdCB7IHJldHVybiBfTV9odC5nZXRfYWxsb2NhdG9yKCk7IH0KKworcHJpdmF0ZToKKyAgX0h0IF9NX2h0OworICBfU1RMUF9LRVlfVFlQRV9GT1JfQ09OVF9FWFQoa2V5X3R5cGUpCitwdWJsaWM6CisgIGhhc2hfbWFwKCkgOiBfTV9odCgwLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpIHt9CisgIGV4cGxpY2l0IGhhc2hfbWFwKHNpemVfdHlwZSBfX24pCisgICAgOiBfTV9odChfX24sIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkge30KKyAgaGFzaF9tYXAoc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmKQorICAgIDogX01faHQoX19uLCBfX2hmLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkge30KKyAgaGFzaF9tYXAoc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLAorICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9NX2h0KF9fbiwgX19oZiwgX19lcWwsIF9fYSkge30KKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19NT1ZFX1NFTUFOVElDKQorICBoYXNoX21hcChfX21vdmVfc291cmNlPF9TZWxmPiBzcmMpCisgICAgOiBfTV9odChfX21vdmVfc291cmNlPF9IdD4oc3JjLmdldCgpLl9NX2h0KSkgeworICB9CisjZW5kaWYKKworI2lmZGVmIF9TVExQX01FTUJFUl9URU1QTEFURVMKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICBoYXNoX21hcChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCkKKyAgICA6IF9NX2h0KDAsIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9CisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgaGFzaF9tYXAoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsIHNpemVfdHlwZSBfX24pCisgICAgOiBfTV9odChfX24sIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9CisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgaGFzaF9tYXAoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsIHNpemVfdHlwZSBfX24sCisgICAgICAgICAgIGNvbnN0IGhhc2hlciYgX19oZikKKyAgICA6IF9NX2h0KF9fbiwgX19oZiwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQorIyBpZmRlZiBfU1RMUF9ORUVEU19FWFRSQV9URU1QTEFURV9DT05TVFJVQ1RPUlMKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICBoYXNoX21hcChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbiwKKyAgICAgICAgICAgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsKQorICAgIDogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9CisjIGVuZGlmCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgaGFzaF9tYXAoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsIHNpemVfdHlwZSBfX24sCisgICAgICAgICAgIGNvbnN0IGhhc2hlciYgX19oZiwgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCwKKyAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSBfU1RMUF9BTExPQ0FUT1JfVFlQRV9ERkwpCisgICAgOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBfX2EpCisgICAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQorCisjZWxzZQorICBoYXNoX21hcChjb25zdCB2YWx1ZV90eXBlKiBfX2YsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbCkKKyAgICA6IF9NX2h0KDAsIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9CisgIGhhc2hfbWFwKGNvbnN0IHZhbHVlX3R5cGUqIF9fZiwgY29uc3QgdmFsdWVfdHlwZSogX19sLCBzaXplX3R5cGUgX19uKQorICAgIDogX01faHQoX19uLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQorICBoYXNoX21hcChjb25zdCB2YWx1ZV90eXBlKiBfX2YsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbCwgc2l6ZV90eXBlIF9fbiwKKyAgICAgICAgICAgY29uc3QgaGFzaGVyJiBfX2hmKQorICAgIDogX01faHQoX19uLCBfX2hmLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9CisgIGhhc2hfbWFwKGNvbnN0IHZhbHVlX3R5cGUqIF9fZiwgY29uc3QgdmFsdWVfdHlwZSogX19sLCBzaXplX3R5cGUgX19uLAorICAgICAgICAgICBjb25zdCBoYXNoZXImIF9faGYsIGNvbnN0IGtleV9lcXVhbCYgX19lcWwsCisgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgX19hKQorICAgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7IH0KKworICBoYXNoX21hcChjb25zdF9pdGVyYXRvciBfX2YsIGNvbnN0X2l0ZXJhdG9yIF9fbCkKKyAgICA6IF9NX2h0KDAsIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9CisgIGhhc2hfbWFwKGNvbnN0X2l0ZXJhdG9yIF9fZiwgY29uc3RfaXRlcmF0b3IgX19sLCBzaXplX3R5cGUgX19uKQorICAgIDogX01faHQoX19uLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQorICBoYXNoX21hcChjb25zdF9pdGVyYXRvciBfX2YsIGNvbnN0X2l0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbiwKKyAgICAgICAgICAgY29uc3QgaGFzaGVyJiBfX2hmKQorICAgIDogX01faHQoX19uLCBfX2hmLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9CisgIGhhc2hfbWFwKGNvbnN0X2l0ZXJhdG9yIF9fZiwgY29uc3RfaXRlcmF0b3IgX19sLCBzaXplX3R5cGUgX19uLAorICAgICAgICAgICBjb25zdCBoYXNoZXImIF9faGYsIGNvbnN0IGtleV9lcXVhbCYgX19lcWwsCisgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgX19hKQorICAgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7IH0KKyNlbmRpZiAvKl9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKworcHVibGljOgorICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LnNpemUoKTsgfQorICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCB7IHJldHVybiBfTV9odC5tYXhfc2l6ZSgpOyB9CisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBfTV9odC5lbXB0eSgpOyB9CisgIHZvaWQgc3dhcChfU2VsZiYgX19ocykgeyBfTV9odC5zd2FwKF9faHMuX01faHQpOyB9CisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKSAmJiAhZGVmaW5lZCAoX1NUTFBfRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSKQorICB2b2lkIF9NX3N3YXBfd29ya2Fyb3VuZChfU2VsZiYgX194KSB7IHN3YXAoX194KTsgfQorI2VuZGlmCisgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gX01faHQuYmVnaW4oKTsgfQorICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBfTV9odC5lbmQoKTsgfQorICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmJlZ2luKCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gX01faHQuZW5kKCk7IH0KKworcHVibGljOgorICBwYWlyPGl0ZXJhdG9yLGJvb2w+IGluc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX29iaikKKyAgeyByZXR1cm4gX01faHQuaW5zZXJ0X3VuaXF1ZShfX29iaik7IH0KKyNpZmRlZiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgdm9pZCBpbnNlcnQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wpCisgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsX19sKTsgfQorI2Vsc2UKKyAgdm9pZCBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSogX19mLCBjb25zdCB2YWx1ZV90eXBlKiBfX2wpCisgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsX19sKTsgfQorICB2b2lkIGluc2VydChjb25zdF9pdGVyYXRvciBfX2YsIGNvbnN0X2l0ZXJhdG9yIF9fbCkKKyAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQorI2VuZGlmIC8qX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworICBwYWlyPGl0ZXJhdG9yLGJvb2w+IGluc2VydF9ub3Jlc2l6ZShjb25zdCB2YWx1ZV90eXBlJiBfX29iaikKKyAgeyByZXR1cm4gX01faHQuaW5zZXJ0X3VuaXF1ZV9ub3Jlc2l6ZShfX29iaik7IH0KKworICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgaXRlcmF0b3IgZmluZChjb25zdCBfS1QmIF9fa2V5KSB7IHJldHVybiBfTV9odC5maW5kKF9fa2V5KTsgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgY29uc3RfaXRlcmF0b3IgZmluZChjb25zdCBfS1QmIF9fa2V5KSBjb25zdCB7IHJldHVybiBfTV9odC5maW5kKF9fa2V5KTsgfQorCisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBfVHAmIG9wZXJhdG9yW10oY29uc3QgX0tUJiBfX2tleSkgeworICAgIGl0ZXJhdG9yIF9faXQgPSBfTV9odC5maW5kKF9fa2V5KTsKKyAgICByZXR1cm4gKF9faXQgPT0gX01faHQuZW5kKCkgPworICAgICAgX01faHQuX01faW5zZXJ0KHZhbHVlX3R5cGUoX19rZXksIF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQoX1RwKSkpLnNlY29uZCA6CisgICAgICAoKl9faXQpLnNlY29uZCApOworICB9CisKKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIHNpemVfdHlwZSBjb3VudChjb25zdCBfS1QmIF9fa2V5KSBjb25zdCB7IHJldHVybiBfTV9odC5jb3VudChfX2tleSk7IH0KKworICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgcGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+IGVxdWFsX3JhbmdlKGNvbnN0IF9LVCYgX19rZXkpCisgIHsgcmV0dXJuIF9NX2h0LmVxdWFsX3JhbmdlKF9fa2V5KTsgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgcGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+IGVxdWFsX3JhbmdlKGNvbnN0IF9LVCYgX19rZXkpIGNvbnN0CisgIHsgcmV0dXJuIF9NX2h0LmVxdWFsX3JhbmdlKF9fa2V5KTsgfQorCisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBzaXplX3R5cGUgZXJhc2UoY29uc3QgX0tUJiBfX2tleSkge3JldHVybiBfTV9odC5lcmFzZShfX2tleSk7IH0KKyAgdm9pZCBlcmFzZShpdGVyYXRvciBfX2l0KSB7IF9NX2h0LmVyYXNlKF9faXQpOyB9CisgIHZvaWQgZXJhc2UoaXRlcmF0b3IgX19mLCBpdGVyYXRvciBfX2wpIHsgX01faHQuZXJhc2UoX19mLCBfX2wpOyB9CisgIHZvaWQgY2xlYXIoKSB7IF9NX2h0LmNsZWFyKCk7IH0KKworICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgX19oaW50KSB7IF9NX2h0LnJlc2l6ZShfX2hpbnQpOyB9CisgIHNpemVfdHlwZSBidWNrZXRfY291bnQoKSBjb25zdCB7IHJldHVybiBfTV9odC5idWNrZXRfY291bnQoKTsgfQorICBzaXplX3R5cGUgbWF4X2J1Y2tldF9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0Lm1heF9idWNrZXRfY291bnQoKTsgfQorICBzaXplX3R5cGUgZWxlbXNfaW5fYnVja2V0KHNpemVfdHlwZSBfX24pIGNvbnN0CisgIHsgcmV0dXJuIF9NX2h0LmVsZW1zX2luX2J1Y2tldChfX24pOyB9Cit9OworCisvL1NwZWNpZmljIGl0ZXJhdG9yIHRyYWl0cyBjcmVhdGlvbgorX1NUTFBfQ1JFQVRFX0hBU0hfSVRFUkFUT1JfVFJBSVRTKEhhc2hNdWx0aW1hcFRyYWl0c1QsIHRyYWl0cykKKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgX1NUTFBfREZMX1RNUExfUEFSQU0oX0hhc2hGY24saGFzaDxfS2V5PiksCisgICAgICAgICAgX1NUTFBfREZMX1RNUExfUEFSQU0oX0VxdWFsS2V5LGVxdWFsX3RvPF9LZXk+KSwKKyAgICAgICAgICBfU1RMUF9ERUZBVUxUX1BBSVJfQUxMT0NBVE9SX1NFTEVDVChfU1RMUF9DT05TVCBfS2V5LCBfVHApID4KK2NsYXNzIGhhc2hfbXVsdGltYXAKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUEFSVElBTF9TUEVDX1dPUktBUk9VTkQpCisgICAgICAgICAgICAgICAgICAgIDogcHVibGljIF9fc3RscG9ydF9jbGFzczxoYXNoX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPiA+CisjZW5kaWYKK3sKK3ByaXZhdGU6CisgIHR5cGVkZWYgaGFzaF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4gX1NlbGY7CitwdWJsaWM6CisgIHR5cGVkZWYgX0tleSBrZXlfdHlwZTsKKyAgdHlwZWRlZiBfVHAgZGF0YV90eXBlOworICB0eXBlZGVmIF9UcCBtYXBwZWRfdHlwZTsKKyAgdHlwZWRlZiBwYWlyPF9TVExQX0NPTlNUIGtleV90eXBlLCBkYXRhX3R5cGU+IHZhbHVlX3R5cGU7Citwcml2YXRlOgorICAvL1NwZWNpZmljIGl0ZXJhdG9yIHRyYWl0cyBjcmVhdGlvbgorICB0eXBlZGVmIF9TVExQX1BSSVYgX0hhc2hNdWx0aW1hcFRyYWl0c1Q8dmFsdWVfdHlwZT4gX0hhc2hNdWx0aW1hcFRyYWl0czsKKworcHVibGljOgorICB0eXBlZGVmIGhhc2h0YWJsZTx2YWx1ZV90eXBlLCBrZXlfdHlwZSwgX0hhc2hGY24sIF9IYXNoTXVsdGltYXBUcmFpdHMsCisgICAgICAgICAgICAgICAgICAgIF9TVExQX1NFTEVDVDFTVCh2YWx1ZV90eXBlLCAgX0tleSksIF9FcXVhbEtleSwgX0FsbG9jID4gX0h0OworCisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpoYXNoZXIgaGFzaGVyOworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6a2V5X2VxdWFsIGtleV9lcXVhbDsKKworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6c2l6ZV90eXBlIHNpemVfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpwb2ludGVyIHBvaW50ZXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpjb25zdF9wb2ludGVyIGNvbnN0X3BvaW50ZXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpyZWZlcmVuY2UgcmVmZXJlbmNlOworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZTsKKworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6aXRlcmF0b3IgaXRlcmF0b3I7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7CisKKyAgaGFzaGVyIGhhc2hfZnVuY3QoKSBjb25zdCB7IHJldHVybiBfTV9odC5oYXNoX2Z1bmN0KCk7IH0KKyAga2V5X2VxdWFsIGtleV9lcSgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmtleV9lcSgpOyB9CisgIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdCB7IHJldHVybiBfTV9odC5nZXRfYWxsb2NhdG9yKCk7IH0KKworcHJpdmF0ZToKKyAgX0h0IF9NX2h0OworICBfU1RMUF9LRVlfVFlQRV9GT1JfQ09OVF9FWFQoa2V5X3R5cGUpCitwdWJsaWM6CisgIGhhc2hfbXVsdGltYXAoKSA6IF9NX2h0KDAsIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkge30KKyAgZXhwbGljaXQgaGFzaF9tdWx0aW1hcChzaXplX3R5cGUgX19uKQorICAgIDogX01faHQoX19uLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpIHt9CisgIGhhc2hfbXVsdGltYXAoc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmKQorICAgIDogX01faHQoX19uLCBfX2hmLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkge30KKyAgaGFzaF9tdWx0aW1hcChzaXplX3R5cGUgX19uLCBjb25zdCBoYXNoZXImIF9faGYsIGNvbnN0IGtleV9lcXVhbCYgX19lcWwsCisgICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBfX2EpIHt9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKKyAgaGFzaF9tdWx0aW1hcChfX21vdmVfc291cmNlPF9TZWxmPiBzcmMpCisgICAgOiBfTV9odChfX21vdmVfc291cmNlPF9IdD4oc3JjLmdldCgpLl9NX2h0KSkgeworICB9CisjZW5kaWYKKworI2lmZGVmIF9TVExQX01FTUJFUl9URU1QTEFURVMKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICBoYXNoX211bHRpbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sKQorICAgIDogX01faHQoMCwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQorICAgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZiwgX19sKTsgfQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIGhhc2hfbXVsdGltYXAoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsIHNpemVfdHlwZSBfX24pCisgICAgOiBfTV9odChfX24sIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsIF9fbCk7IH0KKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICBoYXNoX211bHRpbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLCBzaXplX3R5cGUgX19uLAorICAgICAgICAgICAgICAgIGNvbnN0IGhhc2hlciYgX19oZikKKyAgICA6IF9NX2h0KF9fbiwgX19oZiwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLCBfX2wpOyB9CisjICBpZmRlZiBfU1RMUF9ORUVEU19FWFRSQV9URU1QTEFURV9DT05TVFJVQ1RPUlMKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICBoYXNoX211bHRpbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLCBzaXplX3R5cGUgX19uLAorICAgICAgICAgICAgICAgIGNvbnN0IGhhc2hlciYgX19oZiwgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCkKKyAgICA6IF9NX2h0KF9fbiwgX19oZiwgX19lcWwsIGFsbG9jYXRvcl90eXBlKCkpCisgICAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLCBfX2wpOyB9CisjICBlbmRpZgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIGhhc2hfbXVsdGltYXAoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsIHNpemVfdHlwZSBfX24sCisgICAgICAgICAgICAgICAgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLAorICAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgX1NUTFBfQUxMT0NBVE9SX1RZUEVfREZMKQorICAgIDogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgX19hKQorICAgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZiwgX19sKTsgfQorCisjZWxzZQorICBoYXNoX211bHRpbWFwKGNvbnN0IHZhbHVlX3R5cGUqIF9fZiwgY29uc3QgdmFsdWVfdHlwZSogX19sKQorICAgIDogX01faHQoMCwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQorICAgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZiwgX19sKTsgfQorICBoYXNoX211bHRpbWFwKGNvbnN0IHZhbHVlX3R5cGUqIF9fZiwgY29uc3QgdmFsdWVfdHlwZSogX19sLCBzaXplX3R5cGUgX19uKQorICAgIDogX01faHQoX19uLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLCBfX2wpOyB9CisgIGhhc2hfbXVsdGltYXAoY29uc3QgdmFsdWVfdHlwZSogX19mLCBjb25zdCB2YWx1ZV90eXBlKiBfX2wsIHNpemVfdHlwZSBfX24sCisgICAgICAgICAgICAgICAgY29uc3QgaGFzaGVyJiBfX2hmKQorICAgIDogX01faHQoX19uLCBfX2hmLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsIF9fbCk7IH0KKyAgaGFzaF9tdWx0aW1hcChjb25zdCB2YWx1ZV90eXBlKiBfX2YsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbCwgc2l6ZV90eXBlIF9fbiwKKyAgICAgICAgICAgICAgICBjb25zdCBoYXNoZXImIF9faGYsIGNvbnN0IGtleV9lcXVhbCYgX19lcWwsCisgICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBfX2EpCisgICAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLCBfX2wpOyB9CisKKyAgaGFzaF9tdWx0aW1hcChjb25zdF9pdGVyYXRvciBfX2YsIGNvbnN0X2l0ZXJhdG9yIF9fbCkKKyAgICA6IF9NX2h0KDAsIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsIF9fbCk7IH0KKyAgaGFzaF9tdWx0aW1hcChjb25zdF9pdGVyYXRvciBfX2YsIGNvbnN0X2l0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbikKKyAgICA6IF9NX2h0KF9fbiwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQorICAgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZiwgX19sKTsgfQorICBoYXNoX211bHRpbWFwKGNvbnN0X2l0ZXJhdG9yIF9fZiwgY29uc3RfaXRlcmF0b3IgX19sLCBzaXplX3R5cGUgX19uLAorICAgICAgICAgICAgICAgIGNvbnN0IGhhc2hlciYgX19oZikKKyAgICA6IF9NX2h0KF9fbiwgX19oZiwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLCBfX2wpOyB9CisgIGhhc2hfbXVsdGltYXAoY29uc3RfaXRlcmF0b3IgX19mLCBjb25zdF9pdGVyYXRvciBfX2wsIHNpemVfdHlwZSBfX24sCisgICAgICAgICAgICAgICAgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLAorICAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgX19hKQorICAgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZiwgX19sKTsgfQorI2VuZGlmIC8qX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworCitwdWJsaWM6CisgIHNpemVfdHlwZSBzaXplKCkgY29uc3QgeyByZXR1cm4gX01faHQuc2l6ZSgpOyB9CisgIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0Lm1heF9zaXplKCk7IH0KKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmVtcHR5KCk7IH0KKyAgdm9pZCBzd2FwKF9TZWxmJiBfX2hzKSB7IF9NX2h0LnN3YXAoX19ocy5fTV9odCk7IH0KKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUEFSVElBTF9TUEVDX1dPUktBUk9VTkQpICYmICFkZWZpbmVkIChfU1RMUF9GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIpCisgIHZvaWQgX01fc3dhcF93b3JrYXJvdW5kKF9TZWxmJiBfX3gpIHsgc3dhcChfX3gpOyB9CisjZW5kaWYKKworICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIF9NX2h0LmJlZ2luKCk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gX01faHQuZW5kKCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBfTV9odC5iZWdpbigpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmVuZCgpOyB9CisKK3B1YmxpYzoKKyAgaXRlcmF0b3IgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKQorICAgIHsgcmV0dXJuIF9NX2h0Lmluc2VydF9lcXVhbChfX29iaik7IH0KKyNpZmRlZiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgdm9pZCBpbnNlcnQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wpCisgICAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLF9fbCk7IH0KKyNlbHNlCisgIHZvaWQgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUqIF9fZiwgY29uc3QgdmFsdWVfdHlwZSogX19sKSB7CisgICAgX01faHQuaW5zZXJ0X2VxdWFsKF9fZixfX2wpOworICB9CisgIHZvaWQgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fZiwgY29uc3RfaXRlcmF0b3IgX19sKQorICAgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZiwgX19sKTsgfQorI2VuZGlmIC8qX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworICBpdGVyYXRvciBpbnNlcnRfbm9yZXNpemUoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCisgICAgeyByZXR1cm4gX01faHQuaW5zZXJ0X2VxdWFsX25vcmVzaXplKF9fb2JqKTsgfQorCisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBpdGVyYXRvciBmaW5kKGNvbnN0IF9LVCYgX19rZXkpIHsgcmV0dXJuIF9NX2h0LmZpbmQoX19rZXkpOyB9CisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBjb25zdF9pdGVyYXRvciBmaW5kKGNvbnN0IF9LVCYgX19rZXkpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmZpbmQoX19rZXkpOyB9CisKKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIHNpemVfdHlwZSBjb3VudChjb25zdCBfS1QmIF9fa2V5KSBjb25zdCB7IHJldHVybiBfTV9odC5jb3VudChfX2tleSk7IH0KKworICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgcGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+CisgIGVxdWFsX3JhbmdlKGNvbnN0IF9LVCYgX19rZXkpIHsgcmV0dXJuIF9NX2h0LmVxdWFsX3JhbmdlKF9fa2V5KTsgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgcGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+CisgIGVxdWFsX3JhbmdlKGNvbnN0IF9LVCYgX19rZXkpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmVxdWFsX3JhbmdlKF9fa2V5KTsgfQorCisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBzaXplX3R5cGUgZXJhc2UoY29uc3QgX0tUJiBfX2tleSkge3JldHVybiBfTV9odC5lcmFzZShfX2tleSk7IH0KKyAgdm9pZCBlcmFzZShpdGVyYXRvciBfX2l0KSB7IF9NX2h0LmVyYXNlKF9faXQpOyB9CisgIHZvaWQgZXJhc2UoaXRlcmF0b3IgX19mLCBpdGVyYXRvciBfX2wpIHsgX01faHQuZXJhc2UoX19mLCBfX2wpOyB9CisgIHZvaWQgY2xlYXIoKSB7IF9NX2h0LmNsZWFyKCk7IH0KKworcHVibGljOgorICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgX19oaW50KSB7IF9NX2h0LnJlc2l6ZShfX2hpbnQpOyB9CisgIHNpemVfdHlwZSBidWNrZXRfY291bnQoKSBjb25zdCB7IHJldHVybiBfTV9odC5idWNrZXRfY291bnQoKTsgfQorICBzaXplX3R5cGUgbWF4X2J1Y2tldF9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0Lm1heF9idWNrZXRfY291bnQoKTsgfQorICBzaXplX3R5cGUgZWxlbXNfaW5fYnVja2V0KHNpemVfdHlwZSBfX24pIGNvbnN0CisgIHsgcmV0dXJuIF9NX2h0LmVsZW1zX2luX2J1Y2tldChfX24pOyB9Cit9OworCisjZGVmaW5lIF9TVExQX1RFTVBMQVRFX0hFQURFUiB0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaEZjbiwgY2xhc3MgX0VxbEtleSwgY2xhc3MgX0FsbG9jPgorI2RlZmluZSBfU1RMUF9URU1QTEFURV9DT05UQUlORVIgaGFzaF9tYXA8X0tleSxfVHAsX0hhc2hGY24sX0VxbEtleSxfQWxsb2M+CisjaW5jbHVkZSA8c3RsL19yZWxvcHNfaGFzaF9jb250Lmg+CisjdW5kZWYgX1NUTFBfVEVNUExBVEVfQ09OVEFJTkVSCisjZGVmaW5lIF9TVExQX1RFTVBMQVRFX0NPTlRBSU5FUiBoYXNoX211bHRpbWFwPF9LZXksX1RwLF9IYXNoRmNuLF9FcWxLZXksX0FsbG9jPgorI2luY2x1ZGUgPHN0bC9fcmVsb3BzX2hhc2hfY29udC5oPgorI3VuZGVmIF9TVExQX1RFTVBMQVRFX0NPTlRBSU5FUgorI3VuZGVmIF9TVExQX1RFTVBMQVRFX0hFQURFUgorCisjaWYgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9OT19NT1ZFX1NFTUFOVElDKQordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2hGbiwgIGNsYXNzIF9FcUtleSwgY2xhc3MgX0FsbG9jPgorc3RydWN0IF9fbW92ZV90cmFpdHM8aGFzaF9tYXA8X0tleSwgX1RwLCBfSGFzaEZuLCBfRXFLZXksIF9BbGxvYz4gPiA6CisgIF9TVExQX1BSSVYgX19tb3ZlX3RyYWl0c19oZWxwPHR5cGVuYW1lIGhhc2hfbWFwPF9LZXksIF9UcCwgX0hhc2hGbiwgX0VxS2V5LCBfQWxsb2M+OjpfSHQ+Cit7fTsKKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2hGbiwgIGNsYXNzIF9FcUtleSwgY2xhc3MgX0FsbG9jPgorc3RydWN0IF9fbW92ZV90cmFpdHM8aGFzaF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoRm4sIF9FcUtleSwgX0FsbG9jPiA+IDoKKyAgX1NUTFBfUFJJViBfX21vdmVfdHJhaXRzX2hlbHA8dHlwZW5hbWUgaGFzaF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoRm4sIF9FcUtleSwgX0FsbG9jPjo6X0h0Pgore307CisjICBlbmRpZgorCisvLyBTcGVjaWFsaXphdGlvbiBvZiBpbnNlcnRfaXRlcmF0b3Igc28gdGhhdCBpdCB3aWxsIHdvcmsgZm9yIGhhc2hfbWFwCisvLyBhbmQgaGFzaF9tdWx0aW1hcC4KK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoRm4sICBjbGFzcyBfRXFLZXksIGNsYXNzIF9BbGxvYz4KK2NsYXNzIGluc2VydF9pdGVyYXRvcjxoYXNoX21hcDxfS2V5LCBfVHAsIF9IYXNoRm4sIF9FcUtleSwgX0FsbG9jPiA+IHsKK3Byb3RlY3RlZDoKKyAgdHlwZWRlZiBoYXNoX21hcDxfS2V5LCBfVHAsIF9IYXNoRm4sIF9FcUtleSwgX0FsbG9jPiBfQ29udGFpbmVyOworICBfQ29udGFpbmVyKiBjb250YWluZXI7CitwdWJsaWM6CisgIHR5cGVkZWYgX0NvbnRhaW5lciAgICAgICAgICBjb250YWluZXJfdHlwZTsKKyAgdHlwZWRlZiBvdXRwdXRfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisKKyAgaW5zZXJ0X2l0ZXJhdG9yKF9Db250YWluZXImIF9feCkgOiBjb250YWluZXIoJl9feCkge30KKyAgaW5zZXJ0X2l0ZXJhdG9yKF9Db250YWluZXImIF9feCwgdHlwZW5hbWUgX0NvbnRhaW5lcjo6aXRlcmF0b3IpCisgICAgOiBjb250YWluZXIoJl9feCkge30KKyAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JgorICBvcGVyYXRvcj0oY29uc3QgdHlwZW5hbWUgX0NvbnRhaW5lcjo6dmFsdWVfdHlwZSYgX192YWwpIHsKKyAgICBjb250YWluZXItPmluc2VydChfX3ZhbCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYgb3BlcmF0b3IqKCkgeyByZXR1cm4gKnRoaXM7IH0KKyAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JiBvcGVyYXRvcisrKCkgeyByZXR1cm4gKnRoaXM7IH0KKyAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JiBvcGVyYXRvcisrKGludCkgeyByZXR1cm4gKnRoaXM7IH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoRm4sICBjbGFzcyBfRXFLZXksIGNsYXNzIF9BbGxvYz4KK2NsYXNzIGluc2VydF9pdGVyYXRvcjxoYXNoX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2hGbiwgX0VxS2V5LCBfQWxsb2M+ID4geworcHJvdGVjdGVkOgorICB0eXBlZGVmIGhhc2hfbXVsdGltYXA8X0tleSwgX1RwLCBfSGFzaEZuLCBfRXFLZXksIF9BbGxvYz4gX0NvbnRhaW5lcjsKKyAgX0NvbnRhaW5lciogY29udGFpbmVyOworICB0eXBlbmFtZSBfQ29udGFpbmVyOjppdGVyYXRvciBpdGVyOworcHVibGljOgorICB0eXBlZGVmIF9Db250YWluZXIgICAgICAgICAgY29udGFpbmVyX3R5cGU7CisgIHR5cGVkZWYgb3V0cHV0X2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKKyAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICBwb2ludGVyOworICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworCisgIGluc2VydF9pdGVyYXRvcihfQ29udGFpbmVyJiBfX3gpIDogY29udGFpbmVyKCZfX3gpIHt9CisgIGluc2VydF9pdGVyYXRvcihfQ29udGFpbmVyJiBfX3gsIHR5cGVuYW1lIF9Db250YWluZXI6Oml0ZXJhdG9yKQorICAgIDogY29udGFpbmVyKCZfX3gpIHt9CisgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYKKyAgb3BlcmF0b3I9KGNvbnN0IHR5cGVuYW1lIF9Db250YWluZXI6OnZhbHVlX3R5cGUmIF9fdmFsKSB7CisgICAgY29udGFpbmVyLT5pbnNlcnQoX192YWwpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mIG9wZXJhdG9yKigpIHsgcmV0dXJuICp0aGlzOyB9CisgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYgb3BlcmF0b3IrKygpIHsgcmV0dXJuICp0aGlzOyB9CisgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYgb3BlcmF0b3IrKyhpbnQpIHsgcmV0dXJuICp0aGlzOyB9Cit9OworI2VuZGlmIC8qIF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04gKi8KKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfSEFTSF9NQVBfSCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdGwvX2hhc2hfc2V0LmggYi9zdGxwb3J0L3N0bC9faGFzaF9zZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWIxNjhiCi0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvX2hhc2hfc2V0LmgKQEAgLTAsMCArMSw0OTUgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisvKiBOT1RFOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBTVEwgaGVhZGVycy4KKyAqICAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuCisgKi8KKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9IQVNIX1NFVF9ICisjZGVmaW5lIF9TVExQX0lOVEVSTkFMX0hBU0hfU0VUX0gKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9IQVNIVEFCTEVfSAorIyAgaW5jbHVkZSA8c3RsL19oYXNodGFibGUuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworLy9TcGVjaWZpYyBpdGVyYXRvciB0cmFpdHMgY3JlYXRpb24KK19TVExQX0NSRUFURV9IQVNIX0lURVJBVE9SX1RSQUlUUyhIYXNoU2V0VHJhaXRzVCwgQ29uc3RfdHJhaXRzKQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlLCBfU1RMUF9ERkxfVE1QTF9QQVJBTShfSGFzaEZjbixoYXNoPF9WYWx1ZT4pLAorICAgICAgICAgIF9TVExQX0RGTF9UTVBMX1BBUkFNKF9FcXVhbEtleSwgZXF1YWxfdG88X1ZhbHVlPiksCisgICAgICAgICAgX1NUTFBfREZMX1RNUExfUEFSQU0oX0FsbG9jLCBhbGxvY2F0b3I8X1ZhbHVlPikgPgorY2xhc3MgaGFzaF9zZXQKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUEFSVElBTF9TUEVDX1dPUktBUk9VTkQpCisgICAgICAgICAgICAgICA6IHB1YmxpYyBfX3N0bHBvcnRfY2xhc3M8aGFzaF9zZXQ8X1ZhbHVlLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+ID4KKyNlbmRpZgoreworICB0eXBlZGVmIGhhc2hfc2V0PF9WYWx1ZSwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPiBfU2VsZjsKKyAgLy9TcGVjaWZpYyBpdGVyYXRvciB0cmFpdHMgY3JlYXRpb24KKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9IYXNoU2V0VHJhaXRzVDxfVmFsdWU+IF9IYXNoU2V0VHJhaXRzOworcHVibGljOgorICB0eXBlZGVmIGhhc2h0YWJsZTxfVmFsdWUsIF9WYWx1ZSwgX0hhc2hGY24sCisgICAgICAgICAgICAgICAgICAgIF9IYXNoU2V0VHJhaXRzLCBfU1RMUF9QUklWIF9JZGVudGl0eTxfVmFsdWU+LCBfRXF1YWxLZXksIF9BbGxvYz4gX0h0OworcHVibGljOgorICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6a2V5X3R5cGUga2V5X3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpoYXNoZXIgaGFzaGVyOworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6a2V5X2VxdWFsIGtleV9lcXVhbDsKKworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6c2l6ZV90eXBlIHNpemVfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpwb2ludGVyICAgICAgICAgcG9pbnRlcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmNvbnN0X3BvaW50ZXIgICBjb25zdF9wb2ludGVyOworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6cmVmZXJlbmNlICAgICAgIHJlZmVyZW5jZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9yZWZlcmVuY2U7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6Oml0ZXJhdG9yIGl0ZXJhdG9yOworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmFsbG9jYXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOworCisgIGhhc2hlciBoYXNoX2Z1bmN0KCkgY29uc3QgeyByZXR1cm4gX01faHQuaGFzaF9mdW5jdCgpOyB9CisgIGtleV9lcXVhbCBrZXlfZXEoKSBjb25zdCB7IHJldHVybiBfTV9odC5rZXlfZXEoKTsgfQorICBhbGxvY2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9yKCkgY29uc3QgeyByZXR1cm4gX01faHQuZ2V0X2FsbG9jYXRvcigpOyB9CisKK3ByaXZhdGU6CisgIF9IdCBfTV9odDsKKyAgX1NUTFBfS0VZX1RZUEVfRk9SX0NPTlRfRVhUKGtleV90eXBlKQorCitwdWJsaWM6CisgIGhhc2hfc2V0KCkKKyAgICA6IF9NX2h0KDAsIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkge30KKyAgZXhwbGljaXQgaGFzaF9zZXQoc2l6ZV90eXBlIF9fbikKKyAgICA6IF9NX2h0KF9fbiwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKSB7fQorICBoYXNoX3NldChzaXplX3R5cGUgX19uLCBjb25zdCBoYXNoZXImIF9faGYpCisgICAgOiBfTV9odChfX24sIF9faGYsIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKSB7fQorI2lmICFkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorICBoYXNoX3NldChzaXplX3R5cGUgX19uLCBjb25zdCBoYXNoZXImIF9faGYsIGNvbnN0IGtleV9lcXVhbCYgX19lcWwsCisgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorI2Vsc2UKKyAgaGFzaF9zZXQoc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsKQorICAgIDogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgYWxsb2NhdG9yX3R5cGUoKSkge30KKyAgaGFzaF9zZXQoc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLAorICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorI2VuZGlmCisgICAgOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBfX2EpIHt9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKKyAgaGFzaF9zZXQoX19tb3ZlX3NvdXJjZTxfU2VsZj4gc3JjKQorICAgIDogX01faHQoX19tb3ZlX3NvdXJjZTxfSHQ+KHNyYy5nZXQoKS5fTV9odCkpIHt9CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgaGFzaF9zZXQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wpCisgICAgOiBfTV9odCgwLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIGhhc2hfc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLCBzaXplX3R5cGUgX19uKQorICAgIDogX01faHQoX19uLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIGhhc2hfc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLCBzaXplX3R5cGUgX19uLAorICAgICAgICAgICBjb25zdCBoYXNoZXImIF9faGYpCisgICAgOiBfTV9odChfX24sIF9faGYsIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQorICAgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7IH0KKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICBoYXNoX3NldChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbiwKKyAgICAgICAgICAgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLAorICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hIF9TVExQX0FMTE9DQVRPUl9UWVBFX0RGTCkKKyAgICA6IF9NX2h0KF9fbiwgX19oZiwgX19lcWwsIF9fYSkKKyAgICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9CisjICBpZiBkZWZpbmVkIChfU1RMUF9ORUVEU19FWFRSQV9URU1QTEFURV9DT05TVFJVQ1RPUlMpCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgaGFzaF9zZXQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsIHNpemVfdHlwZSBfX24sCisgICAgICAgICAgIGNvbnN0IGhhc2hlciYgX19oZiwgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCkKKyAgICA6IF9NX2h0KF9fbiwgX19oZiwgX19lcWwsIGFsbG9jYXRvcl90eXBlKCkpCisgICAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQorIyAgZW5kaWYKKyNlbHNlCisgIGhhc2hfc2V0KGNvbnN0IHZhbHVlX3R5cGUqIF9fZiwgY29uc3QgdmFsdWVfdHlwZSogX19sKQorICAgIDogX01faHQoMCwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQorICAgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7IH0KKyAgaGFzaF9zZXQoY29uc3QgdmFsdWVfdHlwZSogX19mLCBjb25zdCB2YWx1ZV90eXBlKiBfX2wsIHNpemVfdHlwZSBfX24pCisgICAgOiBfTV9odChfX24sIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9CisgIGhhc2hfc2V0KGNvbnN0IHZhbHVlX3R5cGUqIF9fZiwgY29uc3QgdmFsdWVfdHlwZSogX19sLCBzaXplX3R5cGUgX19uLAorICAgICAgICAgICBjb25zdCBoYXNoZXImIF9faGYpCisgICAgOiBfTV9odChfX24sIF9faGYsIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQorICAgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7IH0KKyAgaGFzaF9zZXQoY29uc3QgdmFsdWVfdHlwZSogX19mLCBjb25zdCB2YWx1ZV90eXBlKiBfX2wsIHNpemVfdHlwZSBfX24sCisgICAgICAgICAgIGNvbnN0IGhhc2hlciYgX19oZiwgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCwKKyAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBfX2EpCisgICAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQorCisgIGhhc2hfc2V0KGNvbnN0X2l0ZXJhdG9yIF9fZiwgY29uc3RfaXRlcmF0b3IgX19sKQorICAgIDogX01faHQoMCwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQorICAgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7IH0KKyAgaGFzaF9zZXQoY29uc3RfaXRlcmF0b3IgX19mLCBjb25zdF9pdGVyYXRvciBfX2wsIHNpemVfdHlwZSBfX24pCisgICAgOiBfTV9odChfX24sIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9CisgIGhhc2hfc2V0KGNvbnN0X2l0ZXJhdG9yIF9fZiwgY29uc3RfaXRlcmF0b3IgX19sLCBzaXplX3R5cGUgX19uLAorICAgICAgICAgICBjb25zdCBoYXNoZXImIF9faGYpCisgICAgOiBfTV9odChfX24sIF9faGYsIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQorICAgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7IH0KKyAgaGFzaF9zZXQoY29uc3RfaXRlcmF0b3IgX19mLCBjb25zdF9pdGVyYXRvciBfX2wsIHNpemVfdHlwZSBfX24sCisgICAgICAgICAgIGNvbnN0IGhhc2hlciYgX19oZiwgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCwKKyAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBfX2EpCisgICAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQorI2VuZGlmIC8qX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworCitwdWJsaWM6CisgIHNpemVfdHlwZSBzaXplKCkgY29uc3QgeyByZXR1cm4gX01faHQuc2l6ZSgpOyB9CisgIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0Lm1heF9zaXplKCk7IH0KKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmVtcHR5KCk7IH0KKyAgdm9pZCBzd2FwKF9TZWxmJiBfX2hzKSB7IF9NX2h0LnN3YXAoX19ocy5fTV9odCk7IH0KKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUEFSVElBTF9TUEVDX1dPUktBUk9VTkQpICYmICFkZWZpbmVkIChfU1RMUF9GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIpCisgIHZvaWQgX01fc3dhcF93b3JrYXJvdW5kKF9TZWxmJiBfX3gpIHsgc3dhcChfX3gpOyB9CisjZW5kaWYKKworICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIF9NX2h0LmJlZ2luKCk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gX01faHQuZW5kKCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBfTV9odC5iZWdpbigpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmVuZCgpOyB9CisKK3B1YmxpYzoKKyAgcGFpcjxpdGVyYXRvciwgYm9vbD4gaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKQorICB7IHJldHVybiBfTV9odC5pbnNlcnRfdW5pcXVlKF9fb2JqKTsgfQorI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgdm9pZCBpbnNlcnQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wpCisjZWxzZQorICB2b2lkIGluc2VydChjb25zdF9pdGVyYXRvciBfX2YsIGNvbnN0X2l0ZXJhdG9yIF9fbCkKKyAge19NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9CisgIHZvaWQgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUqIF9fZiwgY29uc3QgdmFsdWVfdHlwZSogX19sKQorI2VuZGlmCisgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsX19sKTsgfQorCisgIHBhaXI8aXRlcmF0b3IsIGJvb2w+IGluc2VydF9ub3Jlc2l6ZShjb25zdCB2YWx1ZV90eXBlJiBfX29iaikKKyAgeyByZXR1cm4gX01faHQuaW5zZXJ0X3VuaXF1ZV9ub3Jlc2l6ZShfX29iaik7IH0KKworICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgaXRlcmF0b3IgZmluZChjb25zdCBfS1QmIF9fa2V5KSB7IHJldHVybiBfTV9odC5maW5kKF9fa2V5KTsgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgY29uc3RfaXRlcmF0b3IgZmluZChjb25zdCBfS1QmIF9fa2V5KSBjb25zdCB7IHJldHVybiBfTV9odC5maW5kKF9fa2V5KTsgfQorCisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBzaXplX3R5cGUgY291bnQoY29uc3QgX0tUJiBfX2tleSkgY29uc3QgeyByZXR1cm4gX01faHQuY291bnQoX19rZXkpOyB9CisKKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIHBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPiBlcXVhbF9yYW5nZShjb25zdCBfS1QmIF9fa2V5KQorICB7IHJldHVybiBfTV9odC5lcXVhbF9yYW5nZShfX2tleSk7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIHBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPiBlcXVhbF9yYW5nZShjb25zdCBfS1QmIF9fa2V5KSBjb25zdAorICB7IHJldHVybiBfTV9odC5lcXVhbF9yYW5nZShfX2tleSk7IH0KKworICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgc2l6ZV90eXBlIGVyYXNlKGNvbnN0IF9LVCYgX19rZXkpIHtyZXR1cm4gX01faHQuZXJhc2UoX19rZXkpOyB9CisgIHZvaWQgZXJhc2UoaXRlcmF0b3IgX19pdCkgeyBfTV9odC5lcmFzZShfX2l0KTsgfQorICB2b2lkIGVyYXNlKGl0ZXJhdG9yIF9fZiwgaXRlcmF0b3IgX19sKSB7IF9NX2h0LmVyYXNlKF9fZiwgX19sKTsgfQorICB2b2lkIGNsZWFyKCkgeyBfTV9odC5jbGVhcigpOyB9CisKK3B1YmxpYzoKKyAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9faGludCkgeyBfTV9odC5yZXNpemUoX19oaW50KTsgfQorICBzaXplX3R5cGUgYnVja2V0X2NvdW50KCkgY29uc3QgeyByZXR1cm4gX01faHQuYnVja2V0X2NvdW50KCk7IH0KKyAgc2l6ZV90eXBlIG1heF9idWNrZXRfY291bnQoKSBjb25zdCB7IHJldHVybiBfTV9odC5tYXhfYnVja2V0X2NvdW50KCk7IH0KKyAgc2l6ZV90eXBlIGVsZW1zX2luX2J1Y2tldChzaXplX3R5cGUgX19uKSBjb25zdAorICB7IHJldHVybiBfTV9odC5lbGVtc19pbl9idWNrZXQoX19uKTsgfQorfTsKKworLy9TcGVjaWZpYyBpdGVyYXRvciB0cmFpdHMgY3JlYXRpb24KK19TVExQX0NSRUFURV9IQVNIX0lURVJBVE9SX1RSQUlUUyhIYXNoTXVsdGlzZXRUcmFpdHNULCBDb25zdF90cmFpdHMpCisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsdWUsIF9TVExQX0RGTF9UTVBMX1BBUkFNKF9IYXNoRmNuLGhhc2g8X1ZhbHVlPiksCisgICAgICAgICAgX1NUTFBfREZMX1RNUExfUEFSQU0oX0VxdWFsS2V5LCBlcXVhbF90bzxfVmFsdWU+KSwKKyAgICAgICAgICBfU1RMUF9ERkxfVE1QTF9QQVJBTShfQWxsb2MsIGFsbG9jYXRvcjxfVmFsdWU+KSA+CitjbGFzcyBoYXNoX211bHRpc2V0CisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKQorICAgICAgICAgICAgICAgICAgICA6IHB1YmxpYyBfX3N0bHBvcnRfY2xhc3M8aGFzaF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4gPgorI2VuZGlmCit7CisgIHR5cGVkZWYgaGFzaF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4gX1NlbGY7CisgIC8vU3BlY2lmaWMgaXRlcmF0b3IgdHJhaXRzIGNyZWF0aW9uCisgIHR5cGVkZWYgX1NUTFBfUFJJViBfSGFzaE11bHRpc2V0VHJhaXRzVDxfVmFsdWU+IF9IYXNoTXVsdGlzZXRUcmFpdHM7CitwdWJsaWM6CisgIHR5cGVkZWYgaGFzaHRhYmxlPF9WYWx1ZSwgX1ZhbHVlLCBfSGFzaEZjbiwKKyAgICAgICAgICAgICAgICAgICAgX0hhc2hNdWx0aXNldFRyYWl0cywgX1NUTFBfUFJJViBfSWRlbnRpdHk8X1ZhbHVlPiwgX0VxdWFsS2V5LCBfQWxsb2M+IF9IdDsKKworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6a2V5X3R5cGUga2V5X3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpoYXNoZXIgaGFzaGVyOworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6a2V5X2VxdWFsIGtleV9lcXVhbDsKKworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6c2l6ZV90eXBlIHNpemVfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpwb2ludGVyICAgICAgIHBvaW50ZXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpjb25zdF9wb2ludGVyIGNvbnN0X3BvaW50ZXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpyZWZlcmVuY2UgcmVmZXJlbmNlOworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZTsKKworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6aXRlcmF0b3IgaXRlcmF0b3I7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7CisKKyAgaGFzaGVyIGhhc2hfZnVuY3QoKSBjb25zdCB7IHJldHVybiBfTV9odC5oYXNoX2Z1bmN0KCk7IH0KKyAga2V5X2VxdWFsIGtleV9lcSgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmtleV9lcSgpOyB9CisgIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdCB7IHJldHVybiBfTV9odC5nZXRfYWxsb2NhdG9yKCk7IH0KKworcHJpdmF0ZToKKyAgX0h0IF9NX2h0OworICBfU1RMUF9LRVlfVFlQRV9GT1JfQ09OVF9FWFQoa2V5X3R5cGUpCisKK3B1YmxpYzoKKyAgaGFzaF9tdWx0aXNldCgpCisgICAgOiBfTV9odCgwLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpIHt9CisgIGV4cGxpY2l0IGhhc2hfbXVsdGlzZXQoc2l6ZV90eXBlIF9fbikKKyAgICA6IF9NX2h0KF9fbiwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKSB7fQorICBoYXNoX211bHRpc2V0KHNpemVfdHlwZSBfX24sIGNvbnN0IGhhc2hlciYgX19oZikKKyAgICA6IF9NX2h0KF9fbiwgX19oZiwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpIHt9CisgIGhhc2hfbXVsdGlzZXQoc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsKQorICAgIDogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgYWxsb2NhdG9yX3R5cGUoKSkge30KKyAgaGFzaF9tdWx0aXNldChzaXplX3R5cGUgX19uLCBjb25zdCBoYXNoZXImIF9faGYsIGNvbnN0IGtleV9lcXVhbCYgX19lcWwsCisgICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICA6IF9NX2h0KF9fbiwgX19oZiwgX19lcWwsIF9fYSkge30KKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19NT1ZFX1NFTUFOVElDKQorICBoYXNoX211bHRpc2V0KF9fbW92ZV9zb3VyY2U8X1NlbGY+IHNyYykKKyAgICA6IF9NX2h0KF9fbW92ZV9zb3VyY2U8X0h0PihzcmMuZ2V0KCkuX01faHQpKSB7fQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIGhhc2hfbXVsdGlzZXQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wpCisgICAgOiBfTV9odCgwLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLCBfX2wpOyB9CisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgaGFzaF9tdWx0aXNldChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbikKKyAgICA6IF9NX2h0KF9fbiwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQorICAgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZiwgX19sKTsgfQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIGhhc2hfbXVsdGlzZXQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsIHNpemVfdHlwZSBfX24sCisgICAgICAgICAgICAgICAgY29uc3QgaGFzaGVyJiBfX2hmKQorICAgIDogX01faHQoX19uLCBfX2hmLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsIF9fbCk7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIGhhc2hfbXVsdGlzZXQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsIHNpemVfdHlwZSBfX24sCisgICAgICAgICAgICAgICAgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLAorICAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgX1NUTFBfQUxMT0NBVE9SX1RZUEVfREZMKQorICAgIDogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgX19hKQorICAgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZiwgX19sKTsgfQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfTkVFRFNfRVhUUkFfVEVNUExBVEVfQ09OU1RSVUNUT1JTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIGhhc2hfbXVsdGlzZXQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsIHNpemVfdHlwZSBfX24sCisgICAgICAgICAgICAgICAgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsKQorICAgIDogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsIF9fbCk7IH0KKyMgIGVuZGlmCisjZWxzZQorICBoYXNoX211bHRpc2V0KGNvbnN0IHZhbHVlX3R5cGUqIF9fZiwgY29uc3QgdmFsdWVfdHlwZSogX19sKQorICAgIDogX01faHQoMCwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQorICAgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZiwgX19sKTsgfQorICBoYXNoX211bHRpc2V0KGNvbnN0IHZhbHVlX3R5cGUqIF9fZiwgY29uc3QgdmFsdWVfdHlwZSogX19sLCBzaXplX3R5cGUgX19uKQorICAgIDogX01faHQoX19uLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLCBfX2wpOyB9CisgIGhhc2hfbXVsdGlzZXQoY29uc3QgdmFsdWVfdHlwZSogX19mLCBjb25zdCB2YWx1ZV90eXBlKiBfX2wsIHNpemVfdHlwZSBfX24sCisgICAgICAgICAgICAgICAgY29uc3QgaGFzaGVyJiBfX2hmKQorICAgIDogX01faHQoX19uLCBfX2hmLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsIF9fbCk7IH0KKyAgaGFzaF9tdWx0aXNldChjb25zdCB2YWx1ZV90eXBlKiBfX2YsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbCwgc2l6ZV90eXBlIF9fbiwKKyAgICAgICAgICAgICAgICBjb25zdCBoYXNoZXImIF9faGYsIGNvbnN0IGtleV9lcXVhbCYgX19lcWwsCisgICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBfX2EpCisgICAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLCBfX2wpOyB9CisKKyAgaGFzaF9tdWx0aXNldChjb25zdF9pdGVyYXRvciBfX2YsIGNvbnN0X2l0ZXJhdG9yIF9fbCkKKyAgICA6IF9NX2h0KDAsIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsIF9fbCk7IH0KKyAgaGFzaF9tdWx0aXNldChjb25zdF9pdGVyYXRvciBfX2YsIGNvbnN0X2l0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbikKKyAgICA6IF9NX2h0KF9fbiwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQorICAgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZiwgX19sKTsgfQorICBoYXNoX211bHRpc2V0KGNvbnN0X2l0ZXJhdG9yIF9fZiwgY29uc3RfaXRlcmF0b3IgX19sLCBzaXplX3R5cGUgX19uLAorICAgICAgICAgICAgICAgIGNvbnN0IGhhc2hlciYgX19oZikKKyAgICA6IF9NX2h0KF9fbiwgX19oZiwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLCBfX2wpOyB9CisgIGhhc2hfbXVsdGlzZXQoY29uc3RfaXRlcmF0b3IgX19mLCBjb25zdF9pdGVyYXRvciBfX2wsIHNpemVfdHlwZSBfX24sCisgICAgICAgICAgICAgICAgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLAorICAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgX19hKQorICAgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZiwgX19sKTsgfQorI2VuZGlmIC8qX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworCitwdWJsaWM6CisgIHNpemVfdHlwZSBzaXplKCkgY29uc3QgeyByZXR1cm4gX01faHQuc2l6ZSgpOyB9CisgIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0Lm1heF9zaXplKCk7IH0KKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmVtcHR5KCk7IH0KKyAgdm9pZCBzd2FwKF9TZWxmJiBocykgeyBfTV9odC5zd2FwKGhzLl9NX2h0KTsgfQorI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QQVJUSUFMX1NQRUNfV09SS0FST1VORCkgJiYgIWRlZmluZWQgKF9TVExQX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUikKKyAgdm9pZCBfTV9zd2FwX3dvcmthcm91bmQoX1NlbGYmIF9feCkgeyBzd2FwKF9feCk7IH0KKyNlbmRpZgorCisgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gX01faHQuYmVnaW4oKTsgfQorICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBfTV9odC5lbmQoKTsgfQorICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmJlZ2luKCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gX01faHQuZW5kKCk7IH0KKworcHVibGljOgorICBpdGVyYXRvciBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopIHsgcmV0dXJuIF9NX2h0Lmluc2VydF9lcXVhbChfX29iaik7IH0KKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZvaWQgaW5zZXJ0KF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sKQorICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsX19sKTsgfQorI2Vsc2UKKyAgdm9pZCBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSogX19mLCBjb25zdCB2YWx1ZV90eXBlKiBfX2wpCisgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZixfX2wpOyB9CisgIHZvaWQgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fZiwgY29uc3RfaXRlcmF0b3IgX19sKQorICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsIF9fbCk7IH0KKyNlbmRpZiAvKl9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKyAgaXRlcmF0b3IgaW5zZXJ0X25vcmVzaXplKGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKQorICB7IHJldHVybiBfTV9odC5pbnNlcnRfZXF1YWxfbm9yZXNpemUoX19vYmopOyB9CisKKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIGl0ZXJhdG9yIGZpbmQoY29uc3QgX0tUJiBfX2tleSkgeyByZXR1cm4gX01faHQuZmluZChfX2tleSk7IH0KKworICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgY29uc3RfaXRlcmF0b3IgZmluZChjb25zdCBfS1QmIF9fa2V5KSBjb25zdCB7IHJldHVybiBfTV9odC5maW5kKF9fa2V5KTsgfQorCisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBzaXplX3R5cGUgY291bnQoY29uc3QgX0tUJiBfX2tleSkgY29uc3QgeyByZXR1cm4gX01faHQuY291bnQoX19rZXkpOyB9CisKKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIHBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPiBlcXVhbF9yYW5nZShjb25zdCBfS1QmIF9fa2V5KQorICB7IHJldHVybiBfTV9odC5lcXVhbF9yYW5nZShfX2tleSk7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIHBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPiBlcXVhbF9yYW5nZShjb25zdCBfS1QmIF9fa2V5KSBjb25zdAorICB7IHJldHVybiBfTV9odC5lcXVhbF9yYW5nZShfX2tleSk7IH0KKworICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgc2l6ZV90eXBlIGVyYXNlKGNvbnN0IF9LVCYgX19rZXkpIHtyZXR1cm4gX01faHQuZXJhc2UoX19rZXkpOyB9CisgIHZvaWQgZXJhc2UoaXRlcmF0b3IgX19pdCkgeyBfTV9odC5lcmFzZShfX2l0KTsgfQorICB2b2lkIGVyYXNlKGl0ZXJhdG9yIF9fZiwgaXRlcmF0b3IgX19sKSB7IF9NX2h0LmVyYXNlKF9fZiwgX19sKTsgfQorICB2b2lkIGNsZWFyKCkgeyBfTV9odC5jbGVhcigpOyB9CisKK3B1YmxpYzoKKyAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9faGludCkgeyBfTV9odC5yZXNpemUoX19oaW50KTsgfQorICBzaXplX3R5cGUgYnVja2V0X2NvdW50KCkgY29uc3QgeyByZXR1cm4gX01faHQuYnVja2V0X2NvdW50KCk7IH0KKyAgc2l6ZV90eXBlIG1heF9idWNrZXRfY291bnQoKSBjb25zdCB7IHJldHVybiBfTV9odC5tYXhfYnVja2V0X2NvdW50KCk7IH0KKyAgc2l6ZV90eXBlIGVsZW1zX2luX2J1Y2tldChzaXplX3R5cGUgX19uKSBjb25zdAorICB7IHJldHVybiBfTV9odC5lbGVtc19pbl9idWNrZXQoX19uKTsgfQorfTsKKworI2RlZmluZSBfU1RMUF9URU1QTEFURV9IRUFERVIgdGVtcGxhdGUgPGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0hhc2hGY24sIGNsYXNzIF9FcXVhbEtleSwgY2xhc3MgX0FsbG9jPgorI2RlZmluZSBfU1RMUF9URU1QTEFURV9DT05UQUlORVIgaGFzaF9zZXQ8X1ZhbHVlLF9IYXNoRmNuLF9FcXVhbEtleSxfQWxsb2M+CisKKyNpbmNsdWRlIDxzdGwvX3JlbG9wc19oYXNoX2NvbnQuaD4KKworI3VuZGVmIF9TVExQX1RFTVBMQVRFX0NPTlRBSU5FUgorI2RlZmluZSBfU1RMUF9URU1QTEFURV9DT05UQUlORVIgaGFzaF9tdWx0aXNldDxfVmFsdWUsX0hhc2hGY24sX0VxdWFsS2V5LF9BbGxvYz4KKyNpbmNsdWRlIDxzdGwvX3JlbG9wc19oYXNoX2NvbnQuaD4KKworI3VuZGVmIF9TVExQX1RFTVBMQVRFX0NPTlRBSU5FUgorI3VuZGVmIF9TVExQX1RFTVBMQVRFX0hFQURFUgorCisvLyBTcGVjaWFsaXphdGlvbiBvZiBpbnNlcnRfaXRlcmF0b3Igc28gdGhhdCBpdCB3aWxsIHdvcmsgZm9yIGhhc2hfc2V0CisvLyBhbmQgaGFzaF9tdWx0aXNldC4KKworI2lmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pCisjICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKK3RlbXBsYXRlIDxjbGFzcyBfVmFsdWUsIGNsYXNzIF9IYXNoRmNuLCBjbGFzcyBfRXF1YWxLZXksIGNsYXNzIF9BbGxvYz4KK3N0cnVjdCBfX21vdmVfdHJhaXRzPGhhc2hfc2V0PF9WYWx1ZSwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPiA+IDoKKyAgX1NUTFBfUFJJViBfX21vdmVfdHJhaXRzX2F1eDx0eXBlbmFtZSBoYXNoX3NldDxfVmFsdWUsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz46Ol9IdD4KK3t9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaEZjbiwgY2xhc3MgX0VxdWFsS2V5LCBjbGFzcyBfQWxsb2M+CitzdHJ1Y3QgX19tb3ZlX3RyYWl0czxoYXNoX211bHRpc2V0PF9WYWx1ZSwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPiA+IDoKKyAgX1NUTFBfUFJJViBfX21vdmVfdHJhaXRzX2F1eDx0eXBlbmFtZSBoYXNoX211bHRpc2V0PF9WYWx1ZSwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPjo6X0h0Pgore307CisjICBlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaEZjbiwgY2xhc3MgX0VxdWFsS2V5LCBjbGFzcyBfQWxsb2M+CitjbGFzcyBpbnNlcnRfaXRlcmF0b3I8aGFzaF9zZXQ8X1ZhbHVlLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+ID4geworcHJvdGVjdGVkOgorICB0eXBlZGVmIGhhc2hfc2V0PF9WYWx1ZSwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPiBfQ29udGFpbmVyOworICBfQ29udGFpbmVyKiBjb250YWluZXI7CitwdWJsaWM6CisgIHR5cGVkZWYgX0NvbnRhaW5lciAgICAgICAgICBjb250YWluZXJfdHlwZTsKKyAgdHlwZWRlZiBvdXRwdXRfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisKKyAgaW5zZXJ0X2l0ZXJhdG9yKF9Db250YWluZXImIF9feCkgOiBjb250YWluZXIoJl9feCkge30KKyAgaW5zZXJ0X2l0ZXJhdG9yKF9Db250YWluZXImIF9feCwgdHlwZW5hbWUgX0NvbnRhaW5lcjo6aXRlcmF0b3IpCisgICAgOiBjb250YWluZXIoJl9feCkge30KKyAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JgorICBvcGVyYXRvcj0oY29uc3QgdHlwZW5hbWUgX0NvbnRhaW5lcjo6dmFsdWVfdHlwZSYgX192YWwpIHsKKyAgICBjb250YWluZXItPmluc2VydChfX3ZhbCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYgb3BlcmF0b3IqKCkgeyByZXR1cm4gKnRoaXM7IH0KKyAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JiBvcGVyYXRvcisrKCkgeyByZXR1cm4gKnRoaXM7IH0KKyAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JiBvcGVyYXRvcisrKGludCkgeyByZXR1cm4gKnRoaXM7IH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsdWUsIGNsYXNzIF9IYXNoRmNuLCBjbGFzcyBfRXF1YWxLZXksIGNsYXNzIF9BbGxvYz4KK2NsYXNzIGluc2VydF9pdGVyYXRvcjxoYXNoX211bHRpc2V0PF9WYWx1ZSwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPiA+IHsKK3Byb3RlY3RlZDoKKyAgdHlwZWRlZiBoYXNoX211bHRpc2V0PF9WYWx1ZSwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPiBfQ29udGFpbmVyOworICBfQ29udGFpbmVyKiBjb250YWluZXI7CisgIHR5cGVuYW1lIF9Db250YWluZXI6Oml0ZXJhdG9yIGl0ZXI7CitwdWJsaWM6CisgIHR5cGVkZWYgX0NvbnRhaW5lciAgICAgICAgICBjb250YWluZXJfdHlwZTsKKyAgdHlwZWRlZiBvdXRwdXRfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisKKyAgaW5zZXJ0X2l0ZXJhdG9yKF9Db250YWluZXImIF9feCkgOiBjb250YWluZXIoJl9feCkge30KKyAgaW5zZXJ0X2l0ZXJhdG9yKF9Db250YWluZXImIF9feCwgdHlwZW5hbWUgX0NvbnRhaW5lcjo6aXRlcmF0b3IpCisgICAgOiBjb250YWluZXIoJl9feCkge30KKyAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JgorICBvcGVyYXRvcj0oY29uc3QgdHlwZW5hbWUgX0NvbnRhaW5lcjo6dmFsdWVfdHlwZSYgX192YWwpIHsKKyAgICBjb250YWluZXItPmluc2VydChfX3ZhbCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYgb3BlcmF0b3IqKCkgeyByZXR1cm4gKnRoaXM7IH0KKyAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JiBvcGVyYXRvcisrKCkgeyByZXR1cm4gKnRoaXM7IH0KKyAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JiBvcGVyYXRvcisrKGludCkgeyByZXR1cm4gKnRoaXM7IH0KK307CisjZW5kaWYgLyogX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTiAqLworCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9IQVNIX1NFVF9IICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9faGFzaHRhYmxlLmMgYi9zdGxwb3J0L3N0bC9faGFzaHRhYmxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc0MzE1NgotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc3RsL19oYXNodGFibGUuYwpAQCAtMCwwICsxLDU1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKyNpZm5kZWYgX1NUTFBfSEFTSFRBQkxFX0MKKyNkZWZpbmUgX1NUTFBfSEFTSFRBQkxFX0MKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9IQVNIVEFCTEVfSAorIyAgaW5jbHVkZSA8c3RsL19oYXNodGFibGUuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworI2lmIGRlZmluZWQgKF9TVExQX0VYUE9TRV9HTE9CQUxTX0lNUExFTUVOVEFUSU9OKQorCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKKyMgIGRlZmluZSBfX1BSSU1FX0xJU1RfQk9EWSB7IFwKKyAgN3VsLCAgICAgICAgICAyM3VsLCBcCisgIDUzdWwsICAgICAgICAgOTd1bCwgICAgICAgICAxOTN1bCwgICAgICAgMzg5dWwsICAgICAgIDc2OXVsLCAgICAgIFwKKyAgMTU0M3VsLCAgICAgICAzMDc5dWwsICAgICAgIDYxNTF1bCwgICAgICAxMjI4OXVsLCAgICAgMjQ1OTN1bCwgICAgXAorICA0OTE1N3VsLCAgICAgIDk4MzE3dWwsICAgICAgMTk2NjEzdWwsICAgIDM5MzI0MXVsLCAgICA3ODY0MzN1bCwgICBcCisgIDE1NzI4Njl1bCwgICAgMzE0NTczOXVsLCAgICA2MjkxNDY5dWwsICAgMTI1ODI5MTd1bCwgIDI1MTY1ODQzdWwsIFwKKyAgNTAzMzE2NTN1bCwgICAxMDA2NjMzMTl1bCwgIDIwMTMyNjYxMXVsLCA0MDI2NTMxODl1bCwgODA1MzA2NDU3dWwsXAorICAxNjEwNjEyNzQxdWwsIDMyMjEyMjU0NzN1bCwgNDI5NDk2NzI5MXVsICBcCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRHVtbXk+Citjb25zdCBzaXplX3QqIF9TVExQX0NBTEwKK19TdGxfcHJpbWU8X0R1bW15Pjo6X1NfcHJpbWVzKHNpemVfdCAmX19zaXplKSB7CisgIHN0YXRpYyBjb25zdCBzaXplX3QgX2xpc3RbXSA9IF9fUFJJTUVfTElTVF9CT0RZOworIyAgaWZuZGVmIF9fTVdFUktTX18KKyAgX19zaXplID0gIHNpemVvZihfbGlzdCkgLyBzaXplb2YoX2xpc3RbMF0pOworIyAgZWxzZQorICBfX3NpemUgPSAgMzA7CisjICBlbmRpZgorICByZXR1cm4gX2xpc3Q7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRHVtbXk+CitzaXplX3QgX1NUTFBfQ0FMTAorX1N0bF9wcmltZTxfRHVtbXk+OjpfU19tYXhfbmJfYnVja2V0cygpIHsKKyAgc2l6ZV90IF9fc2l6ZTsKKyAgY29uc3Qgc2l6ZV90KiBfX2ZpcnN0ID0gX1NfcHJpbWVzKF9fc2l6ZSk7CisgIHJldHVybiAqKF9fZmlyc3QgKyBfX3NpemUgLSAxKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9EdW1teT4KK3NpemVfdCBfU1RMUF9DQUxMCitfU3RsX3ByaW1lPF9EdW1teT46Ol9TX25leHRfc2l6ZShzaXplX3QgX19uKSB7CisgIHNpemVfdCBfX3NpemU7CisgIGNvbnN0IHNpemVfdCogX19maXJzdCA9IF9TX3ByaW1lcyhfX3NpemUpOworICBjb25zdCBzaXplX3QqIF9fbGFzdCA9ICBfX2ZpcnN0ICsgX19zaXplOworICBjb25zdCBzaXplX3QqIHBvcyA9IF9fbG93ZXJfYm91bmQoX19maXJzdCwgX19sYXN0LCBfX24sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19sZXNzKChzaXplX3QqKTApLCBfX2xlc3MoKHNpemVfdCopMCksIChwdHJkaWZmX3QqKTApOworICByZXR1cm4gKHBvcyA9PSBfX2xhc3QgPyAqKF9fbGFzdCAtIDEpIDogKnBvcyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRHVtbXk+Cit2b2lkIF9TVExQX0NBTEwKK19TdGxfcHJpbWU8X0R1bW15Pjo6X1NfcHJldl9zaXplcyhzaXplX3QgX19uLCBzaXplX3QgY29uc3QqJl9fYmVnaW4sIHNpemVfdCBjb25zdComX19wb3MpIHsKKyAgc2l6ZV90IF9fc2l6ZTsKKyAgX19iZWdpbiA9IF9TX3ByaW1lcyhfX3NpemUpOworICBjb25zdCBzaXplX3QqIF9fbGFzdCA9ICBfX2JlZ2luICsgX19zaXplOworICBfX3BvcyA9IF9fbG93ZXJfYm91bmQoX19iZWdpbiwgX19sYXN0LCBfX24sIAorICAgICAgICAgICAgICAgICAgICAgICAgX19sZXNzKChzaXplX3QqKTApLCBfX2xlc3MoKHNpemVfdCopMCksIChwdHJkaWZmX3QqKTApOworCisgIGlmIChfX3Bvcz09IF9fbGFzdCkKKyAgICAtLV9fcG9zOworICBlbHNlIGlmICgqX19wb3MgPT0gX19uKSB7CisgICAgaWYgKF9fcG9zICE9IF9fYmVnaW4pCisgICAgICAtLV9fcG9zOworICB9Cit9CisKKyMgIHVuZGVmIF9fUFJJTUVfTElTVF9CT0RZCisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHKQorIyAgZGVmaW5lIGhhc2h0YWJsZSBfU1RMUF9OT05fREJHX05BTUUoaGFzaHRhYmxlKQorX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorI2VuZGlmCisKKy8vIGZicDogdGhlc2UgZGVmaW5lcyBhcmUgZm9yIG91dGxpbmUgbWV0aG9kcyBkZWZpbml0aW9ucy4KKy8vIG5lZWRlZCB0byBkZWZpbml0aW9ucyB0byBiZSBwb3J0YWJsZS4gU2hvdWxkIG5vdCBiZSB1c2VkIGluIG1ldGhvZCBib2RpZXMuCisKKyNpZiBkZWZpbmVkICggX1NUTFBfTkVTVEVEX1RZUEVfUEFSQU1fQlVHICkKKyMgIGRlZmluZSBfX3NpemVfdHlwZV9fICAgICAgIHNpemVfdAorIyAgZGVmaW5lIHNpemVfdHlwZSAgICAgICAgICAgc2l6ZV90CisjICBkZWZpbmUgdmFsdWVfdHlwZSAgICAgICAgICBfVmFsCisjICBkZWZpbmUga2V5X3R5cGUgICAgICAgICAgICBfS2V5CisjICBkZWZpbmUgX19yZWZlcmVuY2VfXyAgICAgICBfVmFsJgorCisjICBkZWZpbmUgX19pdGVyYXRvcl9fICAgICAgICBfSHRfaXRlcmF0b3I8X1ZhbCwgX1NUTFBfSEVBREVSX1RZUEVOQU1FIF9UcmFpdHM6Ol9Ob25Db25zdFRyYWl0cywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9LZXksIF9IRiwgX0V4SywgX0VxSywgX0FsbD4KKyMgIGRlZmluZSBfX2NvbnN0X2l0ZXJhdG9yX18gIF9IdF9pdGVyYXRvcjxfVmFsLCBfU1RMUF9IRUFERVJfVFlQRU5BTUUgX1RyYWl0czo6X0NvbnN0VHJhaXRzLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0tleSwgX0hGLCBfRXhLLCBfRXFLLCBfQWxsPgorI2Vsc2UKKyMgIGRlZmluZSBfX3NpemVfdHlwZV9fICAgICAgIF9TVExQX1RZUEVOQU1FX09OX1JFVFVSTl9UWVBFIGhhc2h0YWJsZTxfVmFsLCBfS2V5LCBfSEYsIF9UcmFpdHMsIF9FeEssIF9FcUssIF9BbGw+OjpzaXplX3R5cGUKKyMgIGRlZmluZSBfX3JlZmVyZW5jZV9fICAgICAgIF9TVExQX1RZUEVOQU1FX09OX1JFVFVSTl9UWVBFICBoYXNodGFibGU8X1ZhbCwgX0tleSwgX0hGLCBfVHJhaXRzLCBfRXhLLCBfRXFLLCBfQWxsPjo6cmVmZXJlbmNlCisjICBkZWZpbmUgX19pdGVyYXRvcl9fICAgICAgICBfU1RMUF9UWVBFTkFNRV9PTl9SRVRVUk5fVFlQRSBoYXNodGFibGU8X1ZhbCwgX0tleSwgX0hGLCBfVHJhaXRzLCBfRXhLLCBfRXFLLCBfQWxsPjo6aXRlcmF0b3IKKyMgIGRlZmluZSBfX2NvbnN0X2l0ZXJhdG9yX18gIF9TVExQX1RZUEVOQU1FX09OX1JFVFVSTl9UWVBFIGhhc2h0YWJsZTxfVmFsLCBfS2V5LCBfSEYsIF9UcmFpdHMsIF9FeEssIF9FcUssIF9BbGw+Ojpjb25zdF9pdGVyYXRvcgorI2VuZGlmCisKKy8qCisgKiBUaGlzIG1ldGhvZCBpcyB0b28gZGlmZmljdWx0IHRvIGltcGxlbWVudCBmb3IgaGFzaHRhYmxlIHRoYXQgZG8gbm90CisgKiByZXF1aXJlIGEgc29ydGVkIG9wZXJhdGlvbiBvbiB0aGUgc3RvcmVkIHR5cGUuCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hGLAorICAgICAgICAgIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9FeEssIGNsYXNzIF9FcUssIGNsYXNzIF9BbGw+Citib29sIGhhc2h0YWJsZTxfVmFsLF9LZXksX0hGLF9UcmFpdHMsX0V4SyxfRXFLLF9BbGw+OjpfTV9lcXVhbCgKKyAgICAgICAgICAgICAgY29uc3QgaGFzaHRhYmxlPF9WYWwsX0tleSxfSEYsX1RyYWl0cyxfRXhLLF9FcUssX0FsbD4mIF9faHQxLAorICAgICAgICAgICAgICBjb25zdCBoYXNodGFibGU8X1ZhbCxfS2V5LF9IRixfVHJhaXRzLF9FeEssX0VxSyxfQWxsPiYgX19odDIpIHsKKyAgcmV0dXJuIF9faHQxLl9NX2J1Y2tldHMgPT0gX19odDIuX01fYnVja2V0cyAmJgorICAgICAgICAgX19odDEuX01fZWxlbXMgPT0gX19odDIuX01fZWxlbXM7Cit9CisqLworCisvKiBSZXR1cm5zIHRoZSBpdGVyYXRvciBiZWZvcmUgdGhlIGZpcnN0IGl0ZXJhdG9yIG9mIHRoZSBidWNrZXQgX19uIGFuZCBzZXQKKyAqIF9fbiB0byB0aGUgZmlyc3QgcHJldmlvdXMgYnVja2V0IGhhdmluZyB0aGUgc2FtZSBmaXJzdCBpdGVyYXRvciBhcyBidWNrZXQKKyAqIF9fbi4KKyAqLwordGVtcGxhdGUgPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwKKyAgICAgICAgICBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfRXhLLCBjbGFzcyBfRXFLLCBjbGFzcyBfQWxsPgorX19pdGVyYXRvcl9fCitoYXNodGFibGU8X1ZhbCxfS2V5LF9IRixfVHJhaXRzLF9FeEssX0VxSyxfQWxsPgorICA6Ol9NX2JlZm9yZV9iZWdpbihzaXplX3R5cGUgJl9fbikgY29uc3QgeworICByZXR1cm4gX1NfYmVmb3JlX2JlZ2luKF9NX2VsZW1zLCBfTV9idWNrZXRzLCBfX24pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hGLAorICAgICAgICAgIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9FeEssIGNsYXNzIF9FcUssIGNsYXNzIF9BbGw+CitfX2l0ZXJhdG9yX18KK2hhc2h0YWJsZTxfVmFsLF9LZXksX0hGLF9UcmFpdHMsX0V4SyxfRXFLLF9BbGw+CisgIDo6X1NfYmVmb3JlX2JlZ2luKGNvbnN0IF9FbGVtc0NvbnQmIF9fZWxlbXMsIGNvbnN0IF9CdWNrZXRWZWN0b3ImIF9fYnVja2V0cywKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlICZfX24pIHsKKyAgX0VsZW1zQ29udCAmX19tdXRhYmxlX2VsZW1zID0gX19DT05TVF9DQVNUKF9FbGVtc0NvbnQmLCBfX2VsZW1zKTsKKyAgdHlwZW5hbWUgX0J1Y2tldFZlY3Rvcjo6Y29uc3RfaXRlcmF0b3IgX19icG9zKF9fYnVja2V0cy5iZWdpbigpICsgX19uKTsKKworICBfRWxlbXNJdGUgX19wb3MoKl9fYnBvcyk7CisgIGlmIChfX3BvcyA9PSBfX211dGFibGVfZWxlbXMuYmVnaW4oKSkgeworICAgIF9fbiA9IDA7CisgICAgcmV0dXJuIF9fbXV0YWJsZV9lbGVtcy5iZWZvcmVfYmVnaW4oKTsKKyAgfQorCisgIHR5cGVuYW1lIF9CdWNrZXRWZWN0b3I6OmNvbnN0X2l0ZXJhdG9yIF9fYmN1cihfX2Jwb3MpOworICBfQnVja2V0VHlwZSAqX19wb3Nfbm9kZSA9IF9fcG9zLl9NX25vZGU7CisgIGZvciAoLS1fX2JjdXI7IF9fcG9zX25vZGUgPT0gKl9fYmN1cjsgLS1fX2JjdXIpOworCisgIF9fbiA9IF9fYmN1ciAtIF9fYnVja2V0cy5iZWdpbigpICsgMTsKKyAgX0VsZW1zSXRlIF9fY3VyKCpfX2JjdXIpOworICBfRWxlbXNJdGUgX19wcmV2ID0gX19jdXIrKzsKKyAgZm9yICg7IF9fY3VyICE9IF9fcG9zOyArK19fcHJldiwgKytfX2N1cik7CisgIHJldHVybiBfX3ByZXY7Cit9CisKKwordGVtcGxhdGUgPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwKKyAgICAgICAgICBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfRXhLLCBjbGFzcyBfRXFLLCBjbGFzcyBfQWxsPgorX19pdGVyYXRvcl9fCitoYXNodGFibGU8X1ZhbCxfS2V5LF9IRixfVHJhaXRzLF9FeEssX0VxSyxfQWxsPgorICA6Ol9NX2luc2VydF9ub3Jlc2l6ZShzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX29iaikgeworICAvL1dlIGFsd2F5cyBpbnNlcnQgdGhpcyBlbGVtZW50IGFzIDFzdCBpbiB0aGUgYnVja2V0IHRvIG5vdCBicmVhaworICAvL3RoZSBlbGVtZW50cyBvcmRlciBhcyBlcXVhbCBlbGVtZW50cyBtdXN0IGJlIGtlcHQgbmV4dCB0byBlYWNoIG90aGVyLgorICBzaXplX3R5cGUgX19wcmV2ID0gX19uOworICBfRWxlbXNJdGUgX19wb3MgPSBfTV9iZWZvcmVfYmVnaW4oX19wcmV2KS5fTV9pdGU7CisKKyAgZmlsbChfTV9idWNrZXRzLmJlZ2luKCkgKyBfX3ByZXYsIF9NX2J1Y2tldHMuYmVnaW4oKSArIF9fbiArIDEsCisgICAgICAgX01fZWxlbXMuaW5zZXJ0X2FmdGVyKF9fcG9zLCBfX29iaikuX01fbm9kZSk7CisgICsrX01fbnVtX2VsZW1lbnRzOworICByZXR1cm4gaXRlcmF0b3IoX0VsZW1zSXRlKF9NX2J1Y2tldHNbX19uXSkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hGLAorICAgICAgICAgIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9FeEssIGNsYXNzIF9FcUssIGNsYXNzIF9BbGw+CitwYWlyPF9faXRlcmF0b3JfXywgYm9vbD4KK2hhc2h0YWJsZTxfVmFsLF9LZXksX0hGLF9UcmFpdHMsX0V4SyxfRXFLLF9BbGw+CisgIDo6aW5zZXJ0X3VuaXF1ZV9ub3Jlc2l6ZShjb25zdCB2YWx1ZV90eXBlJiBfX29iaikgeworICBjb25zdCBzaXplX3R5cGUgX19uID0gX01fYmt0X251bShfX29iaik7CisgIF9FbGVtc0l0ZSBfX2N1cihfTV9idWNrZXRzW19fbl0pOworICBfRWxlbXNJdGUgX19sYXN0KF9NX2J1Y2tldHNbX19uICsgMV0pOworCisgIGlmIChfX2N1ciAhPSBfX2xhc3QpIHsKKyAgICBmb3IgKDsgX19jdXIgIT0gX19sYXN0OyArK19fY3VyKSB7CisgICAgICBpZiAoX01fZXF1YWxzKF9NX2dldF9rZXkoKl9fY3VyKSwgX01fZ2V0X2tleShfX29iaikpKSB7CisgICAgICAgIC8vV2UgY2hlY2sgdGhhdCBlcXVpdmFsZW50IGtleXMgaGF2ZSBlcXVhbHMgaGFzaCBjb2RlIGFzIG90aGVyd2lzZSwgb24gcmVzaXplLAorICAgICAgICAvL2VxdWl2YWxlbnQgdmFsdWUgbWlnaHQgbm90IGJlIGluIHRoZSBzYW1lIGJ1Y2tldAorICAgICAgICBfU1RMUF9BU1NFUlQoX01faGFzaChfTV9nZXRfa2V5KCpfX2N1cikpID09IF9NX2hhc2goX01fZ2V0X2tleShfX29iaikpKQorICAgICAgICByZXR1cm4gcGFpcjxpdGVyYXRvciwgYm9vbD4oaXRlcmF0b3IoX19jdXIpLCBmYWxzZSk7CisgICAgICB9CisgICAgfQorICAgIC8qIEhlcmUgd2UgZG8gbm90IHJlbHkgb24gdGhlIF9NX2luc2VydF9ub3Jlc2l6ZSBtZXRob2QgYXMgd2Uga25vdworICAgICAqIHRoYXQgd2UgY2Fubm90IGJyZWFrIGVsZW1lbnQgb3JkZXJzLCBlbGVtZW50cyBhcmUgdW5pcXVlLCBhbmQKKyAgICAgKiBpbnNlcnRpb24gYWZ0ZXIgdGhlIGZpcnN0IGJ1Y2tldCBlbGVtZW50IGlzIGZhc3RlciB0aGFuIHdoYXQgaXMKKyAgICAgKiBkb25lIGluIF9NX2luc2VydF9ub3Jlc2l6ZS4KKyAgICAgKi8KKyAgICBfX2N1ciA9IF9NX2VsZW1zLmluc2VydF9hZnRlcihfRWxlbXNJdGUoX01fYnVja2V0c1tfX25dKSwgX19vYmopOworICAgICsrX01fbnVtX2VsZW1lbnRzOworICAgIHJldHVybiBwYWlyPGl0ZXJhdG9yLCBib29sPihpdGVyYXRvcihfX2N1ciksIHRydWUpOworICB9CisKKyAgcmV0dXJuIHBhaXI8aXRlcmF0b3IsIGJvb2w+KF9NX2luc2VydF9ub3Jlc2l6ZShfX24sIF9fb2JqKSwgdHJ1ZSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSEYsCisgICAgICAgICAgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0V4SywgY2xhc3MgX0VxSywgY2xhc3MgX0FsbD4KK19faXRlcmF0b3JfXworaGFzaHRhYmxlPF9WYWwsX0tleSxfSEYsX1RyYWl0cyxfRXhLLF9FcUssX0FsbD4KKyAgOjppbnNlcnRfZXF1YWxfbm9yZXNpemUoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopIHsKKyAgY29uc3Qgc2l6ZV90eXBlIF9fbiA9IF9NX2JrdF9udW0oX19vYmopOworICB7CisgICAgX0VsZW1zSXRlIF9fY3VyKF9NX2J1Y2tldHNbX19uXSk7CisgICAgX0VsZW1zSXRlIF9fbGFzdChfTV9idWNrZXRzW19fbiArIDFdKTsKKworICAgIGZvciAoOyBfX2N1ciAhPSBfX2xhc3Q7ICsrX19jdXIpIHsKKyAgICAgIGlmIChfTV9lcXVhbHMoX01fZ2V0X2tleSgqX19jdXIpLCBfTV9nZXRfa2V5KF9fb2JqKSkpIHsKKyAgICAgICAgLy9XZSBjaGVjayB0aGF0IGVxdWl2YWxlbnQga2V5cyBoYXZlIGVxdWFscyBoYXNoIGNvZGUgYXMgb3RoZXJ3aXNlLCBvbiByZXNpemUsCisgICAgICAgIC8vZXF1aXZhbGVudCB2YWx1ZSBtaWdodCBub3QgYmUgaW4gdGhlIHNhbWUgYnVja2V0CisgICAgICAgIF9TVExQX0FTU0VSVChfTV9oYXNoKF9NX2dldF9rZXkoKl9fY3VyKSkgPT0gX01faGFzaChfTV9nZXRfa2V5KF9fb2JqKSkpCisgICAgICAgICsrX01fbnVtX2VsZW1lbnRzOworICAgICAgICByZXR1cm4gX01fZWxlbXMuaW5zZXJ0X2FmdGVyKF9fY3VyLCBfX29iaik7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIF9NX2luc2VydF9ub3Jlc2l6ZShfX24sIF9fb2JqKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwKKyAgICAgICAgICBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfRXhLLCBjbGFzcyBfRXFLLCBjbGFzcyBfQWxsPgorX19yZWZlcmVuY2VfXworaGFzaHRhYmxlPF9WYWwsX0tleSxfSEYsX1RyYWl0cyxfRXhLLF9FcUssX0FsbD4KKyAgOjpfTV9pbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopIHsKKyAgX01fZW5sYXJnZShfTV9udW1fZWxlbWVudHMgKyAxKTsKKyAgcmV0dXJuICppbnNlcnRfdW5pcXVlX25vcmVzaXplKF9fb2JqKS5maXJzdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwKKyAgICAgICAgICBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfRXhLLCBjbGFzcyBfRXFLLCBjbGFzcyBfQWxsPgorX19zaXplX3R5cGVfXworaGFzaHRhYmxlPF9WYWwsX0tleSxfSEYsX1RyYWl0cyxfRXhLLF9FcUssX0FsbD4KKyAgOjplcmFzZShjb25zdCBrZXlfdHlwZSYgX19rZXkpIHsKKyAgY29uc3Qgc2l6ZV90eXBlIF9fbiA9IF9NX2JrdF9udW1fa2V5KF9fa2V5KTsKKworICBfRWxlbXNJdGUgX19jdXIoX01fYnVja2V0c1tfX25dKTsKKyAgX0VsZW1zSXRlIF9fbGFzdChfTV9idWNrZXRzW19fbiArIDFdKTsKKyAgaWYgKF9fY3VyID09IF9fbGFzdCkKKyAgICByZXR1cm4gMDsKKworICBzaXplX3R5cGUgX19lcmFzZWQgPSAwOworICBpZiAoX01fZXF1YWxzKF9NX2dldF9rZXkoKl9fY3VyKSwgX19rZXkpKSB7CisgICAgLy9XZSBsb29rIGZvciB0aGUgcG9zIGJlZm9yZSBfX2N1cjoKKyAgICBzaXplX3R5cGUgX19wcmV2X2IgPSBfX247CisgICAgX0VsZW1zSXRlIF9fcHJldiA9IF9NX2JlZm9yZV9iZWdpbihfX3ByZXZfYikuX01faXRlOworICAgIGRvIHsKKyAgICAgIF9fY3VyID0gX01fZWxlbXMuZXJhc2VfYWZ0ZXIoX19wcmV2KTsKKyAgICAgICsrX19lcmFzZWQ7CisgICAgfSB3aGlsZSAoKF9fY3VyICE9IF9fbGFzdCkgJiYgX01fZXF1YWxzKF9NX2dldF9rZXkoKl9fY3VyKSwgX19rZXkpKTsKKyAgICBmaWxsKF9NX2J1Y2tldHMuYmVnaW4oKSArIF9fcHJldl9iLCBfTV9idWNrZXRzLmJlZ2luKCkgKyBfX24gKyAxLCBfX2N1ci5fTV9ub2RlKTsKKyAgfQorICBlbHNlIHsKKyAgICBfRWxlbXNJdGUgX19wcmV2ID0gX19jdXIrKzsKKyAgICBmb3IgKDsgX19jdXIgIT0gX19sYXN0OyArK19fcHJldiwgKytfX2N1cikgeworICAgICAgaWYgKF9NX2VxdWFscyhfTV9nZXRfa2V5KCpfX2N1ciksIF9fa2V5KSkgeworICAgICAgICBkbyB7CisgICAgICAgICAgX19jdXIgPSBfTV9lbGVtcy5lcmFzZV9hZnRlcihfX3ByZXYpOworICAgICAgICAgICsrX19lcmFzZWQ7CisgICAgICAgIH0gd2hpbGUgKChfX2N1ciAhPSBfX2xhc3QpICYmIF9NX2VxdWFscyhfTV9nZXRfa2V5KCpfX2N1ciksIF9fa2V5KSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIF9NX251bV9lbGVtZW50cyAtPSBfX2VyYXNlZDsKKyAgX01fcmVkdWNlKCk7CisgIHJldHVybiBfX2VyYXNlZDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwKKyAgICAgICAgICBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfRXhLLCBjbGFzcyBfRXFLLCBjbGFzcyBfQWxsPgordm9pZCBoYXNodGFibGU8X1ZhbCxfS2V5LF9IRixfVHJhaXRzLF9FeEssX0VxSyxfQWxsPgorICA6OmVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9faXQpIHsKKyAgY29uc3Qgc2l6ZV90eXBlIF9fbiA9IF9NX2JrdF9udW0oKl9faXQpOworICBfRWxlbXNJdGUgX19jdXIoX01fYnVja2V0c1tfX25dKTsKKworICBzaXplX3R5cGUgX19lcmFzZWQgPSAwOworICBpZiAoX19jdXIgPT0gX19pdC5fTV9pdGUpIHsKKyAgICBzaXplX3R5cGUgX19wcmV2X2IgPSBfX247CisgICAgX0VsZW1zSXRlIF9fcHJldiA9IF9NX2JlZm9yZV9iZWdpbihfX3ByZXZfYikuX01faXRlOworICAgIGZpbGwoX01fYnVja2V0cy5iZWdpbigpICsgX19wcmV2X2IsIF9NX2J1Y2tldHMuYmVnaW4oKSArIF9fbiArIDEsCisgICAgICAgICBfTV9lbGVtcy5lcmFzZV9hZnRlcihfX3ByZXYpLl9NX25vZGUpOworICAgICsrX19lcmFzZWQ7CisgIH0KKyAgZWxzZSB7CisgICAgX0VsZW1zSXRlIF9fcHJldiA9IF9fY3VyKys7CisgICAgX0VsZW1zSXRlIF9fbGFzdChfTV9idWNrZXRzW19fbiArIDFdKTsKKyAgICBmb3IgKDsgX19jdXIgIT0gX19sYXN0OyArK19fcHJldiwgKytfX2N1cikgeworICAgICAgaWYgKF9fY3VyID09IF9faXQuX01faXRlKSB7CisgICAgICAgIF9NX2VsZW1zLmVyYXNlX2FmdGVyKF9fcHJldik7CisgICAgICAgICsrX19lcmFzZWQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIF9NX251bV9lbGVtZW50cyAtPSBfX2VyYXNlZDsKKyAgX01fcmVkdWNlKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSEYsCisgICAgICAgICAgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0V4SywgY2xhc3MgX0VxSywgY2xhc3MgX0FsbD4KK3ZvaWQgaGFzaHRhYmxlPF9WYWwsX0tleSxfSEYsX1RyYWl0cyxfRXhLLF9FcUssX0FsbD4KKyAgOjplcmFzZShjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpIHsKKyAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorICAgIHJldHVybjsKKyAgc2l6ZV90eXBlIF9fZl9idWNrZXQgPSBfTV9ia3RfbnVtKCpfX2ZpcnN0KTsKKyAgc2l6ZV90eXBlIF9fbF9idWNrZXQgPSBfX2xhc3QgIT0gZW5kKCkgPyBfTV9ia3RfbnVtKCpfX2xhc3QpIDogKF9NX2J1Y2tldHMuc2l6ZSgpIC0gMSk7CisKKyAgX0VsZW1zSXRlIF9fY3VyKF9NX2J1Y2tldHNbX19mX2J1Y2tldF0pOworICBfRWxlbXNJdGUgX19wcmV2OworICBpZiAoX19jdXIgPT0gX19maXJzdC5fTV9pdGUpIHsKKyAgICBfX3ByZXYgPSBfTV9iZWZvcmVfYmVnaW4oX19mX2J1Y2tldCkuX01faXRlOworICB9CisgIGVsc2UgeworICAgIF9FbGVtc0l0ZSBfX2xhc3QoX01fYnVja2V0c1srK19fZl9idWNrZXRdKTsKKyAgICBfX3ByZXYgPSBfX2N1cisrOworICAgIGZvciAoOyAoX19jdXIgIT0gX19sYXN0KSAmJiAoX19jdXIgIT0gX19maXJzdC5fTV9pdGUpOyArK19fcHJldiwgKytfX2N1cik7CisgIH0KKyAgc2l6ZV90eXBlIF9fZXJhc2VkID0gMDsKKyAgLy9XZSBkbyBub3QgdXNlIHRoZSBzbGlzdDo6ZXJhc2VfYWZ0ZXIgbWV0aG9kIHRha2luZyBhIHJhbmdlIHRvIGNvdW50IHRoZQorICAvL251bWJlciBvZiBlcmFzZWQgZWxlbWVudHM6CisgIHdoaWxlIChfX2N1ciAhPSBfX2xhc3QuX01faXRlKSB7CisgICAgX19jdXIgPSBfTV9lbGVtcy5lcmFzZV9hZnRlcihfX3ByZXYpOworICAgICsrX19lcmFzZWQ7CisgIH0KKyAgZmlsbChfTV9idWNrZXRzLmJlZ2luKCkgKyBfX2ZfYnVja2V0LCBfTV9idWNrZXRzLmJlZ2luKCkgKyBfX2xfYnVja2V0ICsgMSwgX19jdXIuX01fbm9kZSk7CisgIF9NX251bV9lbGVtZW50cyAtPSBfX2VyYXNlZDsKKyAgX01fcmVkdWNlKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSEYsCisgICAgICAgICAgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0V4SywgY2xhc3MgX0VxSywgY2xhc3MgX0FsbD4KK3ZvaWQgaGFzaHRhYmxlPF9WYWwsX0tleSxfSEYsX1RyYWl0cyxfRXhLLF9FcUssX0FsbD4KKyAgOjpyZWhhc2goc2l6ZV90eXBlIF9fbnVtX2J1Y2tldHNfaGludCkgeworICBpZiAoYnVja2V0X2NvdW50KCkgPj0gX19udW1fYnVja2V0c19oaW50KSB7CisgICAgLy8gV2UgYXJlIHRyeWluZyB0byByZWR1Y2UgbnVtYmVyIG9mIGJ1Y2tldHMsIHdlIGhhdmUgdG8gdmFsaWRhdGUgaXQ6CisgICAgc2l6ZV90eXBlIF9fbGltaXRfbnVtX2J1Y2tldHMgPSAoc2l6ZV90eXBlKSgoZmxvYXQpc2l6ZSgpIC8gbWF4X2xvYWRfZmFjdG9yKCkpOworICAgIGlmIChfX251bV9idWNrZXRzX2hpbnQgPCBfX2xpbWl0X251bV9idWNrZXRzKSB7CisgICAgICAvLyBUYXJnZXR0ZWQgbnVtYmVyIG9mIGJ1Y2tldHMgX19udW1fYnVja2V0c19oaW50IHdvdWxkIGJyZWFrCisgICAgICAvLyBsb2FkX2ZhY3RvcigpIDw9IG1heF9sb2FkX2ZhY3RvcigpIHJ1bGUuCisgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgX01fcmVoYXNoKF9fbnVtX2J1Y2tldHNfaGludCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSEYsCisgICAgICAgICAgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0V4SywgY2xhc3MgX0VxSywgY2xhc3MgX0FsbD4KK3ZvaWQgaGFzaHRhYmxlPF9WYWwsX0tleSxfSEYsX1RyYWl0cyxfRXhLLF9FcUssX0FsbD4KKyAgOjpfTV9lbmxhcmdlKHNpemVfdHlwZSBfX3RvX3NpemUpIHsKKyAgc2l6ZV90eXBlIF9fbnVtX2J1Y2tldHMgPSBidWNrZXRfY291bnQoKTsKKyAgc2l6ZV90eXBlIF9fbnVtX2J1Y2tldHNfaGludCA9IChzaXplX3R5cGUpKChmbG9hdClfX3RvX3NpemUgLyBtYXhfbG9hZF9mYWN0b3IoKSk7CisgIGlmIChfX251bV9idWNrZXRzX2hpbnQgPD0gX19udW1fYnVja2V0cykgeworICAgIHJldHVybjsKKyAgfQorICBfX251bV9idWNrZXRzID0gX1NUTFBfUFJJViBfU3RsX3ByaW1lX3R5cGU6Ol9TX25leHRfc2l6ZShfX251bV9idWNrZXRzX2hpbnQpOworCisgIF9NX3JlaGFzaChfX251bV9idWNrZXRzKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwKKyAgICAgICAgICBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfRXhLLCBjbGFzcyBfRXFLLCBjbGFzcyBfQWxsPgordm9pZCBoYXNodGFibGU8X1ZhbCxfS2V5LF9IRixfVHJhaXRzLF9FeEssX0VxSyxfQWxsPgorICA6Ol9NX3JlZHVjZSgpIHsKKyAgc2l6ZV90eXBlIF9fbnVtX2J1Y2tldHMgPSBidWNrZXRfY291bnQoKTsKKyAgLy8gV2Ugb25seSB0cnkgdG8gcmVkdWNlIHRoZSBoYXNodGFibGUgaWYgdGhlIHRoZW9yaWNhbCBsb2FkIGZhY3RvcgorICAvLyBpcyBsb3dlciB0aGFuIGEgZnJhY3Rpb24gb2YgdGhlIG1heCBsb2FkIGZhY3RvcjoKKyAgLy8gNCBmYWN0b3IgaXMgY29taW5nIGZyb20gdGhlIGZhY3QgdGhhdCBwcmltZSBudW1iZXIgbGlzdCBpcyBhbG1vc3QgYQorICAvLyBnZW9tZXRyaWNhbCBzdWl0ZSB3aXRoIHJlYXNvbiAyLCBhcyB3ZSB0cnkgdG8ganVtcCAyIGxldmVscyBpcyBtZWFucworICAvLyBhIDQgZmFjdG9yLgorICBpZiAoKGZsb2F0KXNpemUoKSAvIChmbG9hdClfX251bV9idWNrZXRzID4gbWF4X2xvYWRfZmFjdG9yKCkgLyA0LjBmKQorICAgIHJldHVybjsKKworICBjb25zdCBzaXplX3R5cGUgKl9fZmlyc3Q7CisgIGNvbnN0IHNpemVfdHlwZSAqX19wcmV2OworICBfU1RMUF9QUklWIF9TdGxfcHJpbWVfdHlwZTo6X1NfcHJldl9zaXplcyhfX251bV9idWNrZXRzLCBfX2ZpcnN0LCBfX3ByZXYpOworCisgIC8qIFdlIGFyZSBvbmx5IGdvaW5nIHRvIHJlZHVjZSBudW1iZXIgb2YgYnVja2V0cyBpZiBtb3ZpbmcgdG8geWV0IHRoZSBwcmV2aW91cyBudW1iZXIKKyAgICogb2YgYnVja2V0cyBpbiB0aGUgcHJpbWUgbnVtYmVycyB3b3VsZCByZXNwZWN0IHRoZSBsb2FkIHJ1bGUuIE90aGVyd2lzZSBhbGdvcml0aG0KKyAgICogc3VjY2Vzc2l2ZWx5IHJlbW92aW5nIGFuZCBhZGRpbmcgYW4gZWxlbWVudCB3b3VsZCBlYWNoIHRpbWUgcGVyZm9ybSBhbiBleHBlbnNpdmUKKyAgICogcmVoYXNoIG9wZXJhdGlvbi4gKi8KKyAgY29uc3Qgc2l6ZV90eXBlICpfX3ByZXZfcHJldiA9IF9fcHJldjsKKyAgaWYgKF9fcHJldl9wcmV2ICE9IF9fZmlyc3QpIHsKKyAgICAtLV9fcHJldl9wcmV2OworICAgIGlmICgoZmxvYXQpc2l6ZSgpIC8gKGZsb2F0KSpfX3ByZXZfcHJldiA+IG1heF9sb2FkX2ZhY3RvcigpKQorICAgICAgcmV0dXJuOworICB9CisgIGVsc2UgeworICAgIGlmICgqX19wcmV2ID49IF9fbnVtX2J1Y2tldHMpCisgICAgICByZXR1cm47CisgIH0KKworICAvLyBDYW4gd2UgcmVkdWNlIGZ1cnRoZXI6CisgIHdoaWxlIChfX3ByZXZfcHJldiAhPSBfX2ZpcnN0KSB7CisgICAgLS1fX3ByZXZfcHJldjsKKyAgICBpZiAoKGZsb2F0KXNpemUoKSAvIChmbG9hdCkqX19wcmV2X3ByZXYgPiBtYXhfbG9hZF9mYWN0b3IoKSkKKyAgICAgIC8vIFdlIGNhbm5vdCByZWR1Y2UgZnVydGhlci4KKyAgICAgIGJyZWFrOworICAgIC0tX19wcmV2OworICB9CisKKyAgX01fcmVoYXNoKCpfX3ByZXYpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hGLAorICAgICAgICAgIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9FeEssIGNsYXNzIF9FcUssIGNsYXNzIF9BbGw+Cit2b2lkIGhhc2h0YWJsZTxfVmFsLF9LZXksX0hGLF9UcmFpdHMsX0V4SyxfRXFLLF9BbGw+CisgIDo6X01fcmVzaXplKCkgeworICBpZiAobG9hZF9mYWN0b3IoKSA+IG1heF9sb2FkX2ZhY3RvcigpKSB7CisgICAgLy8gV2UgaGF2ZSB0byBlbmxhcmdlCisgICAgX01fZW5sYXJnZShzaXplKCkpOworICB9CisgIGVsc2UgeworICAgIC8vIFdlIGNhbiB0cnkgdG8gcmVkdWNlIHNpemU6CisgICAgX01fcmVkdWNlKCk7CisgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwKKyAgICAgICAgICBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfRXhLLCBjbGFzcyBfRXFLLCBjbGFzcyBfQWxsPgordm9pZCBoYXNodGFibGU8X1ZhbCxfS2V5LF9IRixfVHJhaXRzLF9FeEssX0VxSyxfQWxsPgorICA6Ol9NX3JlaGFzaChzaXplX3R5cGUgX19udW1fYnVja2V0cykgeworI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHKQorICBfTV9jaGVjaygpOworI2VuZGlmCisgIF9FbGVtc0NvbnQgX190bXBfZWxlbXMoX01fZWxlbXMuZ2V0X2FsbG9jYXRvcigpKTsKKyAgX0J1Y2tldFZlY3RvciBfX3RtcChfX251bV9idWNrZXRzICsgMSwgX19TVEFUSUNfQ0FTVChfQnVja2V0VHlwZSosIDApLCBfTV9idWNrZXRzLmdldF9hbGxvY2F0b3IoKSk7CisgIF9FbGVtc0l0ZSBfX2N1ciwgX19sYXN0KF9NX2VsZW1zLmVuZCgpKTsKKyAgd2hpbGUgKCFfTV9lbGVtcy5lbXB0eSgpKSB7CisgICAgX19jdXIgPSBfTV9lbGVtcy5iZWdpbigpOworICAgIHNpemVfdHlwZSBfX25ld19idWNrZXQgPSBfTV9ia3RfbnVtKCpfX2N1ciwgX19udW1fYnVja2V0cyk7CisgICAgX0VsZW1zSXRlIF9faXRlKF9fY3VyKSwgX19iZWZvcmVfaXRlKF9fY3VyKTsKKyAgICBmb3IgKCsrX19pdGU7CisgICAgICAgICBfX2l0ZSAhPSBfX2xhc3QgJiYgX01fZXF1YWxzKF9NX2dldF9rZXkoKl9fY3VyKSwgX01fZ2V0X2tleSgqX19pdGUpKTsKKyAgICAgICAgICsrX19pdGUsICsrX19iZWZvcmVfaXRlKTsKKyAgICBzaXplX3R5cGUgX19wcmV2X2J1Y2tldCA9IF9fbmV3X2J1Y2tldDsKKyAgICBfRWxlbXNJdGUgIF9fcHJldiA9IF9TX2JlZm9yZV9iZWdpbihfX3RtcF9lbGVtcywgX190bXAsIF9fcHJldl9idWNrZXQpLl9NX2l0ZTsKKyAgICBfX3RtcF9lbGVtcy5zcGxpY2VfYWZ0ZXIoX19wcmV2LCBfTV9lbGVtcywgX01fZWxlbXMuYmVmb3JlX2JlZ2luKCksIF9fYmVmb3JlX2l0ZSk7CisgICAgZmlsbChfX3RtcC5iZWdpbigpICsgX19wcmV2X2J1Y2tldCwgX190bXAuYmVnaW4oKSArIF9fbmV3X2J1Y2tldCArIDEsIF9fY3VyLl9NX25vZGUpOworICB9CisgIF9NX2VsZW1zLnN3YXAoX190bXBfZWxlbXMpOworICBfTV9idWNrZXRzLnN3YXAoX190bXApOworfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hGLAorICAgICAgICAgIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9FeEssIGNsYXNzIF9FcUssIGNsYXNzIF9BbGw+Cit2b2lkIGhhc2h0YWJsZTxfVmFsLF9LZXksX0hGLF9UcmFpdHMsX0V4SyxfRXFLLF9BbGw+OjpfTV9jaGVjaygpIGNvbnN0IHsKKyAgLy9XZSBjaGVjayB0aGF0IGhhc2ggY29kZSBvZiBzdG9yZWQga2V5cyBoYXZlbid0IGNoYW5nZSBhbmQgYWxzbyB0aGF0IGVxdWl2YWxlbnQKKyAgLy9yZWxhdGlvbiBoYXNuJ3QgYmVlbiBtb2RpZmllZAorICBzaXplX3QgX19udW1fYnVja2V0cyA9IGJ1Y2tldF9jb3VudCgpOworICBmb3IgKHNpemVfdCBfX2IgPSAwOyBfX2IgPCBfX251bV9idWNrZXRzOyArK19fYikgeworICAgIF9FbGVtc0l0ZSBfX2N1cihfTV9idWNrZXRzW19fYl0pLCBfX2xhc3QoX01fYnVja2V0c1tfX2IgKyAxXSk7CisgICAgX0VsZW1zSXRlIF9fZnN0KF9fY3VyKSwgX19zbmQoX19jdXIpOworICAgIGZvciAoOyBfX2N1ciAhPSBfX2xhc3Q7ICsrX19jdXIpIHsKKyAgICAgIF9TVExQX0FTU0VSVCggX01fYmt0X251bSgqX19jdXIsIF9fbnVtX2J1Y2tldHMpID09IF9fYiApCisgICAgICBfU1RMUF9BU1NFUlQoICFfTV9lcXVhbHMoX01fZ2V0X2tleSgqX19mc3QpLCBfTV9nZXRfa2V5KCpfX2N1cikpIHx8IF9NX2VxdWFscyhfTV9nZXRfa2V5KCpfX3NuZCksIF9NX2dldF9rZXkoKl9fY3VyKSkgKQorICAgICAgaWYgKF9fZnN0ICE9IF9fc25kKQorICAgICAgICArK19fZnN0OworICAgICAgaWYgKF9fc25kICE9IF9fY3VyKQorICAgICAgICArK19fc25kOworICAgIH0KKyAgfQorfQorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSEYsCisgICAgICAgICAgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0V4SywgY2xhc3MgX0VxSywgY2xhc3MgX0FsbD4KK3ZvaWQgaGFzaHRhYmxlPF9WYWwsX0tleSxfSEYsX1RyYWl0cyxfRXhLLF9FcUssX0FsbD46OmNsZWFyKCkgeworICBfTV9lbGVtcy5jbGVhcigpOworICBfTV9idWNrZXRzLmFzc2lnbihfTV9idWNrZXRzLnNpemUoKSwgX19TVEFUSUNfQ0FTVChfQnVja2V0VHlwZSosIDApKTsKKyAgX01fbnVtX2VsZW1lbnRzID0gMDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwKKyAgICAgICAgICBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfRXhLLCBjbGFzcyBfRXFLLCBjbGFzcyBfQWxsPgordm9pZCBoYXNodGFibGU8X1ZhbCxfS2V5LF9IRixfVHJhaXRzLF9FeEssX0VxSyxfQWxsPgorICA6Ol9NX2NvcHlfZnJvbShjb25zdCBoYXNodGFibGU8X1ZhbCxfS2V5LF9IRixfVHJhaXRzLF9FeEssX0VxSyxfQWxsPiYgX19odCkgeworICBfTV9lbGVtcy5jbGVhcigpOworICBfTV9lbGVtcy5pbnNlcnQoX01fZWxlbXMuZW5kKCksIF9faHQuX01fZWxlbXMuYmVnaW4oKSwgX19odC5fTV9lbGVtcy5lbmQoKSk7CisgIF9NX2J1Y2tldHMucmVzaXplKF9faHQuX01fYnVja2V0cy5zaXplKCkpOworICBfRWxlbXNDb25zdEl0ZSBfX3NyYyhfX2h0Ll9NX2VsZW1zLmJlZ2luKCkpLCBfX3NyY19lbmQoX19odC5fTV9lbGVtcy5lbmQoKSk7CisgIF9FbGVtc0l0ZSBfX2RzdChfTV9lbGVtcy5iZWdpbigpKTsKKyAgdHlwZW5hbWUgX0J1Y2tldFZlY3Rvcjo6Y29uc3RfaXRlcmF0b3IgX19zcmNfYihfX2h0Ll9NX2J1Y2tldHMuYmVnaW4oKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fc3JjX2VuZF9iKF9faHQuX01fYnVja2V0cy5lbmQoKSk7CisgIHR5cGVuYW1lIF9CdWNrZXRWZWN0b3I6Oml0ZXJhdG9yIF9fZHN0X2IoX01fYnVja2V0cy5iZWdpbigpKSwgX19kc3RfZW5kX2IoX01fYnVja2V0cy5lbmQoKSk7CisgIGZvciAoOyBfX3NyYyAhPSBfX3NyY19lbmQ7ICsrX19zcmMsICsrX19kc3QpIHsKKyAgICBmb3IgKDsgX19zcmNfYiAhPSBfX3NyY19lbmRfYjsgKytfX3NyY19iLCArK19fZHN0X2IpIHsKKyAgICAgIGlmICgqX19zcmNfYiA9PSBfX3NyYy5fTV9ub2RlKSB7CisgICAgICAgICpfX2RzdF9iID0gX19kc3QuX01fbm9kZTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGZpbGwoX19kc3RfYiwgX19kc3RfZW5kX2IsIF9fU1RBVElDX0NBU1QoX0J1Y2tldFR5cGUqLCAwKSk7CisgIF9NX251bV9lbGVtZW50cyA9IF9faHQuX01fbnVtX2VsZW1lbnRzOworICBfTV9tYXhfbG9hZF9mYWN0b3IgPSBfX2h0Ll9NX21heF9sb2FkX2ZhY3RvcjsKK30KKworI3VuZGVmIF9faXRlcmF0b3JfXworI3VuZGVmIGNvbnN0X2l0ZXJhdG9yCisjdW5kZWYgX19zaXplX3R5cGVfXworI3VuZGVmIF9fcmVmZXJlbmNlX18KKyN1bmRlZiBzaXplX3R5cGUKKyN1bmRlZiB2YWx1ZV90eXBlCisjdW5kZWYga2V5X3R5cGUKKyN1bmRlZiBfX3N0bF9udW1fcHJpbWVzCisKKyNpZiBkZWZpbmVkIChfU1RMUF9ERUJVRykKKyMgIHVuZGVmIGhhc2h0YWJsZQorX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisjZW5kaWYKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLyogIF9TVExQX0hBU0hUQUJMRV9DICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9faGFzaHRhYmxlLmggYi9zdGxwb3J0L3N0bC9faGFzaHRhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM4ZTJmNQotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc3RsL19oYXNodGFibGUuaApAQCAtMCwwICsxLDY1OCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKy8qIE5PVEU6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIFNUTCBoZWFkZXJzLgorICogICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4KKyAqLworCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0hBU0hUQUJMRV9ICisjZGVmaW5lIF9TVExQX0lOVEVSTkFMX0hBU0hUQUJMRV9ICisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfVkVDVE9SX0gKKyMgIGluY2x1ZGUgPHN0bC9fdmVjdG9yLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9TTElTVF9ICisjICBpbmNsdWRlIDxzdGwvX3NsaXN0Lmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9JVEVSQVRPUl9ICisjICBpbmNsdWRlIDxzdGwvX2l0ZXJhdG9yLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9GVU5DVElPTl9CQVNFX0gKKyMgIGluY2x1ZGUgPHN0bC9fZnVuY3Rpb25fYmFzZS5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQUxHT0JBU0VfSAorIyAgaW5jbHVkZSA8c3RsL19hbGdvYmFzZS5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSEFTSF9GVU5fSAorIyAgaW5jbHVkZSA8c3RsL19oYXNoX2Z1bi5oPgorI2VuZGlmCisKKy8qCisgKiBIYXNodGFibGUgY2xhc3MsIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBoYXNoZWQgYXNzb2NpYXRpdmUgY29udGFpbmVycworICogaGFzaF9zZXQsIGhhc2hfbWFwLCBoYXNoX211bHRpc2V0LCBoYXNoX211bHRpbWFwLAorICogdW5vcmRlcmVkX3NldCwgdW5vcmRlcmVkX21hcCwgdW5vcmRlcmVkX211bHRpc2V0LCB1bm9yZGVyZWRfbXVsdGltYXAuCisgKi8KKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUKQorLy9FeHBvcnQgb2YgdGhlIGNsYXNzZXMgdXNlZCB0byByZXByZXNlbnQgYnVja2V0cyBpbiB0aGUgaGFzaHRhYmxlIGltcGxlbWVudGF0aW9uLgorIyAgaWYgIWRlZmluZWQgKF9TVExQX1VTRV9QVFJfU1BFQ0lBTElaQVRJT05TKQorLy9JZiBwb2ludGVyIHNwZWNpYWxpemF0aW9uIGlzIGVuYWJsZWQgdmVjdG9yPF9TbGlzdF9ub2RlX2Jhc2UqPiB3aWxsIHVzZSB0aGUgdm9pZCoKKy8vc3RvcmFnZSB0eXBlIGZvciB3aGljaCBpbnRlcm5hbCBjbGFzc2VzIGhhdmUgYWxyZWFkeSBiZWVuIGV4cG9ydGVkLgorX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIGFsbG9jYXRvcjxfU1RMUF9QUklWIF9TbGlzdF9ub2RlX2Jhc2UqPjsKKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIF9TVExQX2FsbG9jX3Byb3h5PF9TbGlzdF9ub2RlX2Jhc2UqKiwgX1NsaXN0X25vZGVfYmFzZSosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yPF9TbGlzdF9ub2RlX2Jhc2UqPiA+OworX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIF9WZWN0b3JfYmFzZTxfU2xpc3Rfbm9kZV9iYXNlKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yPF9TbGlzdF9ub2RlX2Jhc2UqPiA+OworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisjICBlbmRpZgorCisjICBpZiBkZWZpbmVkIChfU1RMUF9ERUJVRykKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKyMgICAgZGVmaW5lIF9TVExQX05PTl9EQkdfVkVDVE9SIF9TVExQX05PTl9EQkdfTkFNRSh2ZWN0b3IpCitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgX19jb25zdHJ1Y3RfY2hlY2tlcjxfU1RMUF9OT05fREJHX1ZFQ1RPUjxfU2xpc3Rfbm9kZV9iYXNlKiwgYWxsb2NhdG9yPF9TbGlzdF9ub2RlX2Jhc2UqPiA+ID47CitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgX1NUTFBfTk9OX0RCR19WRUNUT1I8X1NsaXN0X25vZGVfYmFzZSosIGFsbG9jYXRvcjxfU2xpc3Rfbm9kZV9iYXNlKj4gPjsKKyMgICAgdW5kZWYgX1NUTFBfTk9OX0RCR19WRUNUT1IKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorIyAgZW5kaWYKKworX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIHZlY3RvcjxfU1RMUF9QUklWIF9TbGlzdF9ub2RlX2Jhc2UqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3I8X1NUTFBfUFJJViBfU2xpc3Rfbm9kZV9iYXNlKj4gPjsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpCisjICBkZWZpbmUgaGFzaHRhYmxlIF9TVExQX05PTl9EQkdfTkFNRShoYXNodGFibGUpCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisjZW5kaWYKKworLy8gc29tZSBjb21waWxlcnMgcmVxdWlyZSB0aGUgbmFtZXMgb2YgdGVtcGxhdGUgcGFyYW1ldGVycyB0byBiZSB0aGUgc2FtZQordGVtcGxhdGUgPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwKKyAgICAgICAgICBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfRXhLLCBjbGFzcyBfRXFLLCBjbGFzcyBfQWxsPgorY2xhc3MgaGFzaHRhYmxlOworCisjaWYgIWRlZmluZWQgKF9TVExQX0RFQlVHKQorX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfQmFzZUl0ZSwgY2xhc3MgX1RyYWl0cz4KK3N0cnVjdCBfSHRfaXRlcmF0b3IgeworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6Ol9Db25zdFRyYWl0cyBfQ29uc3RUcmFpdHM7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6X05vbkNvbnN0VHJhaXRzIF9Ob25Db25zdFRyYWl0czsKKworICB0eXBlZGVmIF9IdF9pdGVyYXRvcjxfQmFzZUl0ZSxfVHJhaXRzPiBfU2VsZjsKKworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpwb2ludGVyIHBvaW50ZXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6cmVmZXJlbmNlIHJlZmVyZW5jZTsKKyAgdHlwZWRlZiBmb3J3YXJkX2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKKyAgdHlwZWRlZiBwdHJkaWZmX3QgZGlmZmVyZW5jZV90eXBlOworICB0eXBlZGVmIHNpemVfdCBzaXplX3R5cGU7CisKKyAgdHlwZWRlZiBfSHRfaXRlcmF0b3I8X0Jhc2VJdGUsIF9Ob25Db25zdFRyYWl0cz4gaXRlcmF0b3I7CisgIHR5cGVkZWYgX0h0X2l0ZXJhdG9yPF9CYXNlSXRlLCBfQ29uc3RUcmFpdHM+IGNvbnN0X2l0ZXJhdG9yOworCisgIF9IdF9pdGVyYXRvcigpIHt9CisgIC8vY29weSBjb25zdHJ1Y3RvciBmb3IgaXRlcmF0b3IgYW5kIGNvbnN0cnVjdG9yIGZyb20gaXRlcmF0b3IgZm9yIGNvbnN0X2l0ZXJhdG9yCisgIF9IdF9pdGVyYXRvcihjb25zdCBpdGVyYXRvciYgX19pdCkgOiBfTV9pdGUoX19pdC5fTV9pdGUpIHt9CisgIF9IdF9pdGVyYXRvcihfQmFzZUl0ZSBfX2l0KSA6IF9NX2l0ZShfX2l0KSB7fQorCisgIHJlZmVyZW5jZSBvcGVyYXRvciooKSBjb25zdCB7CisgICAgcmV0dXJuICpfTV9pdGU7CisgIH0KKyAgX1NUTFBfREVGSU5FX0FSUk9XX09QRVJBVE9SCisKKyAgX1NlbGYmIG9wZXJhdG9yKysoKSB7CisgICAgKytfTV9pdGU7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIF9TZWxmIG9wZXJhdG9yKysoaW50KSB7CisgICAgX1NlbGYgX190bXAgPSAqdGhpczsKKyAgICArKyp0aGlzOworICAgIHJldHVybiBfX3RtcDsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0X2l0ZXJhdG9yIF9fcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIF9NX2l0ZSA9PSBfX3Jocy5fTV9pdGU7CisgIH0KKyAgYm9vbCBvcGVyYXRvciAhPSAoY29uc3RfaXRlcmF0b3IgX19yaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gX01faXRlICE9IF9fcmhzLl9NX2l0ZTsKKyAgfQorCisgIF9CYXNlSXRlIF9NX2l0ZTsKK307CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCisjaWYgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikKK3RlbXBsYXRlIDxjbGFzcyBfQmFzZUl0ZSwgY2xhc3MgX1RyYWl0cz4KK3N0cnVjdCBfX3R5cGVfdHJhaXRzPF9TVExQX1BSSVYgX0h0X2l0ZXJhdG9yPF9CYXNlSXRlLCBfVHJhaXRzPiA+IHsKKyAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgICBoYXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yOworICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2NvcHlfY29uc3RydWN0b3I7CisgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfYXNzaWdubWVudF9vcGVyYXRvcjsKKyAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9kZXN0cnVjdG9yOworICB0eXBlZGVmIF9fZmFsc2VfdHlwZSAgIGlzX1BPRF90eXBlOworfTsKKyNlbmRpZiAvKiBfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OICovCisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfT0xEX0hQX0lURVJBVE9SX1FVRVJJRVMpCit0ZW1wbGF0ZSA8Y2xhc3MgX0Jhc2VJdGUsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUKKyMgIGlmIGRlZmluZWQgKF9TVExQX05FU1RFRF9UWVBFX1BBUkFNX0JVRykKK19TVExQX1RZUEVOQU1FX09OX1JFVFVSTl9UWVBFIF9UcmFpdHM6OnZhbHVlX3R5cGUgKgorIyAgZWxzZQorX1NUTFBfVFlQRU5BTUVfT05fUkVUVVJOX1RZUEUgX1NUTFBfUFJJViBfSHRfaXRlcmF0b3I8X0Jhc2VJdGUsX1RyYWl0cz46OnZhbHVlX3R5cGUgKgorIyAgZW5kaWYKK3ZhbHVlX3R5cGUoY29uc3QgX1NUTFBfUFJJViBfSHRfaXRlcmF0b3I8X0Jhc2VJdGUsX1RyYWl0cz4mKSB7CisgIHR5cGVkZWYgX1NUTFBfVFlQRU5BTUUgX1NUTFBfUFJJViBfSHRfaXRlcmF0b3I8X0Jhc2VJdGUsX1RyYWl0cz46OnZhbHVlX3R5cGUgX1ZhbDsKKyAgcmV0dXJuIChfVmFsKikgMDsKK30KK3RlbXBsYXRlIDxjbGFzcyBfQmFzZUl0ZSwgY2xhc3MgX1RyYWl0cz4KK2lubGluZSBmb3J3YXJkX2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeShjb25zdCBfU1RMUF9QUklWIF9IdF9pdGVyYXRvcjxfQmFzZUl0ZSxfVHJhaXRzPiYpCit7IHJldHVybiBmb3J3YXJkX2l0ZXJhdG9yX3RhZygpOyB9Cit0ZW1wbGF0ZSA8Y2xhc3MgX0Jhc2VJdGUsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUgcHRyZGlmZl90KiBkaXN0YW5jZV90eXBlKGNvbnN0IF9TVExQX1BSSVYgX0h0X2l0ZXJhdG9yPF9CYXNlSXRlLF9UcmFpdHM+JikKK3sgcmV0dXJuIChwdHJkaWZmX3QqKSAwOyB9CisjZW5kaWYKKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0R1bW15PgorY2xhc3MgX1N0bF9wcmltZSB7CisgIC8vIFJldHVybnMgYmVnaW5pbmcgb2YgcHJpbWVzIGxpc3QgYW5kIHNpemUgYnkgcmVmZXJlbmNlLgorICBzdGF0aWMgY29uc3Qgc2l6ZV90KiBfU19wcmltZXMoc2l6ZV90Jik7CitwdWJsaWM6CisgIC8vUmV0dXJucyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnVja2V0cyBoYW5kbGVkIGJ5IHRoZSBoYXNodGFibGUgaW1wbGVtZW50YXRpb24KKyAgc3RhdGljIHNpemVfdCBfU1RMUF9DQUxMIF9TX21heF9uYl9idWNrZXRzKCk7CisKKyAgLy9SZXR1cm5zIHRoZSBidWNrZXQgc2l6ZSBuZXh0IHRvIGEgcmVxdWlyZWQgc2l6ZQorICBzdGF0aWMgc2l6ZV90IF9TVExQX0NBTEwgX1NfbmV4dF9zaXplKHNpemVfdCk7CisKKyAgLy8gUmV0dXJucyB0aGUgYnVja2V0IHJhbmdlIGNvbnRhaW5pbmcgc29ydGVkIGxpc3Qgb2YgcHJpbWUgbnVtYmVycyA8PSBfX2hpbnQuCisgIHN0YXRpYyB2b2lkIF9TVExQX0NBTEwgX1NfcHJldl9zaXplcyhzaXplX3QgX19oaW50LCBjb25zdCBzaXplX3QgKiZfX2JlZ2luLCBjb25zdCBzaXplX3QgKiZfX2VuZCk7Cit9OworCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCkKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBfU3RsX3ByaW1lPGJvb2w+OworI2VuZGlmCisKK3R5cGVkZWYgX1N0bF9wcmltZTxib29sPiBfU3RsX3ByaW1lX3R5cGU7CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfREVCVUcpCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKyNlbmRpZgorCisvKgorICogSGFzaHRhYmxlcyBoYW5kbGUgYWxsb2NhdG9ycyBhIGJpdCBkaWZmZXJlbnRseSB0aGFuIG90aGVyIGNvbnRhaW5lcnMKKyAqIGRvLiBJZiB3ZSdyZSB1c2luZyBzdGFuZGFyZC1jb25mb3JtaW5nIGFsbG9jYXRvcnMsIHRoZW4gYSBoYXNodGFibGUKKyAqIHVuY29uZGl0aW9uYWxseSBoYXMgYSBtZW1iZXIgdmFyaWFibGUgdG8gaG9sZCBpdHMgYWxsb2NhdG9yLCBldmVuIGlmCisgKiBpdCBzbyBoYXBwZW5zIHRoYXQgYWxsIGluc3RhbmNlcyBvZiB0aGUgYWxsb2NhdG9yIHR5cGUgYXJlIGlkZW50aWNhbC4KKyAqIFRoaXMgaXMgYmVjYXVzZSwgZm9yIGhhc2h0YWJsZXMsIHRoaXMgZXh0cmEgc3RvcmFnZSBpcyBuZWdsaWdpYmxlLgorICogQWRkaXRpb25hbGx5LCBhIGJhc2UgY2xhc3Mgd291bGRuJ3Qgc2VydmUgYW55IG90aGVyIHB1cnBvc2VzOyBpdAorICogd291bGRuJ3QsIGZvciBleGFtcGxlLCBzaW1wbGlmeSB0aGUgZXhjZXB0aW9uLWhhbmRsaW5nIGNvZGUuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSEYsCisgICAgICAgICAgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0V4SywgY2xhc3MgX0VxSywgY2xhc3MgX0FsbD4KK2NsYXNzIGhhc2h0YWJsZSB7CisgIHR5cGVkZWYgaGFzaHRhYmxlPF9WYWwsIF9LZXksIF9IRiwgX1RyYWl0cywgX0V4SywgX0VxSywgX0FsbD4gX1NlbGY7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6X05vbkNvbnN0VHJhaXRzIF9Ob25Db25zdFRyYWl0czsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpfQ29uc3RUcmFpdHMgX0NvbnN0VHJhaXRzOworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6Ol9Ob25Db25zdExvY2FsVHJhaXRzIF9Ob25Db25zdExvY2FsVHJhaXRzOworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6Ol9Db25zdExvY2FsVHJhaXRzIF9Db25zdExvY2FsVHJhaXRzOworCitwdWJsaWM6CisgIHR5cGVkZWYgX0tleSBrZXlfdHlwZTsKKyAgdHlwZWRlZiBfVmFsIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgX0hGIGhhc2hlcjsKKyAgdHlwZWRlZiBfRXFLIGtleV9lcXVhbDsKKworICB0eXBlZGVmIHNpemVfdCAgICAgICAgICAgIHNpemVfdHlwZTsKKyAgdHlwZWRlZiBwdHJkaWZmX3QgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX05vbkNvbnN0VHJhaXRzOjpwb2ludGVyIHBvaW50ZXI7CisgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSogY29uc3RfcG9pbnRlcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfTm9uQ29uc3RUcmFpdHM6OnJlZmVyZW5jZSByZWZlcmVuY2U7CisgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSYgY29uc3RfcmVmZXJlbmNlOworICB0eXBlZGVmIGZvcndhcmRfaXRlcmF0b3JfdGFnIF9JdGVyYXRvcl9jYXRlZ29yeTsKKworICBoYXNoZXIgaGFzaF9mdW5jdCgpIGNvbnN0IHsgcmV0dXJuIF9NX2hhc2g7IH0KKyAga2V5X2VxdWFsIGtleV9lcSgpIGNvbnN0IHsgcmV0dXJuIF9NX2VxdWFsczsgfQorCitwcml2YXRlOgorICBfU1RMUF9GT1JDRV9BTExPQ0FUT1JTKF9WYWwsIF9BbGwpCisjaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpCisgIHR5cGVkZWYgX1NUTFBfUFJJViBfU1RMUF9OT05fREJHX05BTUUoc2xpc3QpPHZhbHVlX3R5cGUsIF9BbGw+IF9FbGVtc0NvbnQ7CisjZWxzZQorICB0eXBlZGVmIHNsaXN0PHZhbHVlX3R5cGUsIF9BbGw+IF9FbGVtc0NvbnQ7CisjZW5kaWYKKyAgdHlwZWRlZiB0eXBlbmFtZSBfRWxlbXNDb250OjppdGVyYXRvciBfRWxlbXNJdGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0VsZW1zQ29udDo6Y29uc3RfaXRlcmF0b3IgX0VsZW1zQ29uc3RJdGU7CisgIHR5cGVkZWYgX1NUTFBfUFJJViBfU2xpc3Rfbm9kZV9iYXNlIF9CdWNrZXRUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY190cmFpdHM8X0J1Y2tldFR5cGUqLCBfQWxsPjo6YWxsb2NhdG9yX3R5cGUgX0J1Y2tldEFsbG9jVHlwZTsKKyAgLyoKKyAgICogV2UgYXJlIGdvaW5nIHRvIHVzZSB2ZWN0b3Igb2YgX1NsaXN0X25vZGVfYmFzZSBwb2ludGVycyBmb3IgMiByZWFzb25zOgorICAgKiAgLSBsaW1pdCBjb2RlIGJsb2F0LCBhbGwgaGFzaHRhYmxlIGluc3RhbmNpYXRpb24gdXNlIHRoZSBzYW1lIGJ1Y2tldHMgcmVwcmVzZW50YXRpb24uCisgICAqICAtIGF2b2lkIF9TVExQX0RFQlVHIHBlcmZvcm1hbmNlIHRyb3VibGU6IHdpdGggYSB2ZWN0b3Igb2YgaXRlcmF0b3Igb24gc2xpc3QgdGhlIHJlc2l6ZQorICAgKiAgICBtZXRob2Qgd291bGQgYmUgdG9vIHNsb3cgYmVjYXVzZSB0aGUgc2xpc3Q6OnNwbGljZV9hZnRlciBtZXRob2QgYmVjb21lIGxpbmVhciBvbgorICAgKiAgICB0aGUgbnVtYmVyIG9mIGl0ZXJhdG9ycyBpbiB0aGUgYnVja2V0cyByYXRoZXIgdGhhbiBjb25zdGFudCBpbiB0aW1lIGFzIHRoZSBpdGVyYXRvcgorICAgKiAgICBoYXMgdG8gYmUgbW92ZSBmcm9tIGEgc2xpc3QgdG8gdGhlIG90aGVyLgorICAgKi8KKyNpZiBkZWZpbmVkIChfU1RMUF9ERUJVRykKKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9TVExQX05PTl9EQkdfTkFNRSh2ZWN0b3IpPF9CdWNrZXRUeXBlKiwgX0J1Y2tldEFsbG9jVHlwZT4gX0J1Y2tldFZlY3RvcjsKKyNlbHNlCisgIHR5cGVkZWYgdmVjdG9yPF9CdWNrZXRUeXBlKiwgX0J1Y2tldEFsbG9jVHlwZT4gX0J1Y2tldFZlY3RvcjsKKyNlbmRpZgorCisgIGhhc2hlciAgICAgICAgICAgICAgICBfTV9oYXNoOworICBrZXlfZXF1YWwgICAgICAgICAgICAgX01fZXF1YWxzOworICBfRWxlbXNDb250ICAgICAgICAgICAgX01fZWxlbXM7CisgIF9CdWNrZXRWZWN0b3IgICAgICAgICBfTV9idWNrZXRzOworICBzaXplX3R5cGUgICAgICAgICAgICAgX01fbnVtX2VsZW1lbnRzOworICBmbG9hdCAgICAgICAgICAgICAgICAgX01fbWF4X2xvYWRfZmFjdG9yOworICBfU1RMUF9LRVlfVFlQRV9GT1JfQ09OVF9FWFQoa2V5X3R5cGUpCisKKyAgc3RhdGljIGNvbnN0IGtleV90eXBlJiBfTV9nZXRfa2V5KGNvbnN0IHZhbHVlX3R5cGUmIF9fdmFsKSB7CisgICAgX0V4SyBrOworICAgIHJldHVybiBrKF9fdmFsKTsKKyAgfQorcHVibGljOgorICB0eXBlZGVmIF9TVExQX1BSSVYgX0h0X2l0ZXJhdG9yPF9FbGVtc0l0ZSwgX05vbkNvbnN0VHJhaXRzPiBpdGVyYXRvcjsKKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9IdF9pdGVyYXRvcjxfRWxlbXNJdGUsIF9Db25zdFRyYWl0cz4gY29uc3RfaXRlcmF0b3I7CisgIC8vVE9ETzogQXZvaWRzIHRoaXMgZGVidWcgY2hlY2sgYW5kIG1ha2UgdGhlIGxvY2FsX2l0ZXJhdG9yIGRpZmZlcmVudCBmcm9tCisgIC8vaXRlcmF0b3IgaW4gZGVidWcgbW9kZSB0b28uCisjaWYgIWRlZmluZWQgKF9TVExQX0RFQlVHKQorICB0eXBlZGVmIF9TVExQX1BSSVYgX0h0X2l0ZXJhdG9yPF9FbGVtc0l0ZSwgX05vbkNvbnN0TG9jYWxUcmFpdHM+IGxvY2FsX2l0ZXJhdG9yOworICB0eXBlZGVmIF9TVExQX1BSSVYgX0h0X2l0ZXJhdG9yPF9FbGVtc0l0ZSwgX0NvbnN0TG9jYWxUcmFpdHM+IGNvbnN0X2xvY2FsX2l0ZXJhdG9yOworI2Vsc2UKKyAgdHlwZWRlZiBpdGVyYXRvciAgICAgICBsb2NhbF9pdGVyYXRvcjsKKyAgdHlwZWRlZiBjb25zdF9pdGVyYXRvciBjb25zdF9sb2NhbF9pdGVyYXRvcjsKKyNlbmRpZgorCisgIHR5cGVkZWYgX0FsbCBhbGxvY2F0b3JfdHlwZTsKKyAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IHsgcmV0dXJuIF9NX2VsZW1zLmdldF9hbGxvY2F0b3IoKTsgfQorCisjaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCisgIGhhc2h0YWJsZShzaXplX3R5cGUgX19uLAorICAgICAgICAgICAgY29uc3QgX0hGJiAgICBfX2hmLAorICAgICAgICAgICAgY29uc3QgX0VxSyYgICBfX2VxbCwKKyAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorI2Vsc2UKKyAgaGFzaHRhYmxlKHNpemVfdHlwZSBfX24sCisgICAgICAgICAgICBjb25zdCBfSEYmICAgIF9faGYsCisgICAgICAgICAgICBjb25zdCBfRXFLJiAgIF9fZXFsKQorICAgIDogX01faGFzaChfX2hmKSwKKyAgICAgIF9NX2VxdWFscyhfX2VxbCksCisgICAgICBfTV9lbGVtcyhhbGxvY2F0b3JfdHlwZSgpKSwKKyAgICAgIF9NX2J1Y2tldHMoX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoX19hLCBfQnVja2V0VHlwZSopKSwKKyAgICAgIF9NX251bV9lbGVtZW50cygwKSwKKyAgICAgIF9NX21heF9sb2FkX2ZhY3RvcigxLjBmKQorICB7IF9NX2luaXRpYWxpemVfYnVja2V0cyhfX24pOyB9CisKKyAgaGFzaHRhYmxlKHNpemVfdHlwZSBfX24sCisgICAgICAgICAgICBjb25zdCBfSEYmICAgIF9faGYsCisgICAgICAgICAgICBjb25zdCBfRXFLJiAgIF9fZXFsLAorICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyNlbmRpZgorICAgIDogX01faGFzaChfX2hmKSwKKyAgICAgIF9NX2VxdWFscyhfX2VxbCksCisgICAgICBfTV9lbGVtcyhfX2EpLAorICAgICAgX01fYnVja2V0cyhfU1RMUF9DT05WRVJUX0FMTE9DQVRPUihfX2EsIF9CdWNrZXRUeXBlKikpLAorICAgICAgX01fbnVtX2VsZW1lbnRzKDApLAorICAgICAgX01fbWF4X2xvYWRfZmFjdG9yKDEuMGYpCisgIHsgX01faW5pdGlhbGl6ZV9idWNrZXRzKF9fbik7IH0KKworICBoYXNodGFibGUoY29uc3QgX1NlbGYmIF9faHQpCisgICAgOiBfTV9oYXNoKF9faHQuX01faGFzaCksCisgICAgICBfTV9lcXVhbHMoX19odC5fTV9lcXVhbHMpLAorICAgICAgX01fZWxlbXMoX19odC5nZXRfYWxsb2NhdG9yKCkpLAorICAgICAgX01fYnVja2V0cyhfU1RMUF9DT05WRVJUX0FMTE9DQVRPUihfX2h0LmdldF9hbGxvY2F0b3IoKSwgX0J1Y2tldFR5cGUqKSksCisgICAgICBfTV9udW1fZWxlbWVudHMoMCksCisgICAgICBfTV9tYXhfbG9hZF9mYWN0b3IoMS4wZikKKyAgeyBfTV9jb3B5X2Zyb20oX19odCk7IH0KKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19NT1ZFX1NFTUFOVElDKQorICBoYXNodGFibGUoX19tb3ZlX3NvdXJjZTxfU2VsZj4gc3JjKQorICAgIDogX01faGFzaChfU1RMUF9QUklWIF9Bc01vdmVTb3VyY2Uoc3JjLmdldCgpLl9NX2hhc2gpKSwKKyAgICAgIF9NX2VxdWFscyhfU1RMUF9QUklWIF9Bc01vdmVTb3VyY2Uoc3JjLmdldCgpLl9NX2VxdWFscykpLAorICAgICAgX01fZWxlbXMoX19tb3ZlX3NvdXJjZTxfRWxlbXNDb250PihzcmMuZ2V0KCkuX01fZWxlbXMpKSwKKyAgICAgIF9NX2J1Y2tldHMoX19tb3ZlX3NvdXJjZTxfQnVja2V0VmVjdG9yPihzcmMuZ2V0KCkuX01fYnVja2V0cykpLAorICAgICAgX01fbnVtX2VsZW1lbnRzKHNyYy5nZXQoKS5fTV9udW1fZWxlbWVudHMpLAorICAgICAgX01fbWF4X2xvYWRfZmFjdG9yKHNyYy5nZXQoKS5fTV9tYXhfbG9hZF9mYWN0b3IpIHt9CisjZW5kaWYKKworICBfU2VsZiYgb3BlcmF0b3I9IChjb25zdCBfU2VsZiYgX19odCkgeworICAgIGlmICgmX19odCAhPSB0aGlzKSB7CisgICAgICBjbGVhcigpOworICAgICAgX01faGFzaCA9IF9faHQuX01faGFzaDsKKyAgICAgIF9NX2VxdWFscyA9IF9faHQuX01fZXF1YWxzOworICAgICAgX01fY29weV9mcm9tKF9faHQpOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB+aGFzaHRhYmxlKCkgeyBjbGVhcigpOyB9CisKKyAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCB7IHJldHVybiBfTV9udW1fZWxlbWVudHM7IH0KKyAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgeyByZXR1cm4gc2l6ZV90eXBlKC0xKTsgfQorICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gc2l6ZSgpID09IDA7IH0KKworICB2b2lkIHN3YXAoX1NlbGYmIF9faHQpIHsKKyAgICBfU1RMUF9TVEQ6OnN3YXAoX01faGFzaCwgX19odC5fTV9oYXNoKTsKKyAgICBfU1RMUF9TVEQ6OnN3YXAoX01fZXF1YWxzLCBfX2h0Ll9NX2VxdWFscyk7CisgICAgX01fZWxlbXMuc3dhcChfX2h0Ll9NX2VsZW1zKTsKKyAgICBfTV9idWNrZXRzLnN3YXAoX19odC5fTV9idWNrZXRzKTsKKyAgICBfU1RMUF9TVEQ6OnN3YXAoX01fbnVtX2VsZW1lbnRzLCBfX2h0Ll9NX251bV9lbGVtZW50cyk7CisgICAgX1NUTFBfU1REOjpzd2FwKF9NX21heF9sb2FkX2ZhY3RvciwgX19odC5fTV9tYXhfbG9hZF9mYWN0b3IpOworICB9CisKKyAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBfTV9lbGVtcy5iZWdpbigpOyB9CisgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIF9NX2VsZW1zLmVuZCgpOyB9CisgIGxvY2FsX2l0ZXJhdG9yIGJlZ2luKHNpemVfdHlwZSBfX24pIHsgcmV0dXJuIF9FbGVtc0l0ZShfTV9idWNrZXRzW19fbl0pOyB9CisgIGxvY2FsX2l0ZXJhdG9yIGVuZChzaXplX3R5cGUgX19uKSB7IHJldHVybiBfRWxlbXNJdGUoX01fYnVja2V0c1tfX24gKyAxXSk7IH0KKworICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIF9fQ09OU1RfQ0FTVChfRWxlbXNDb250JiwgX01fZWxlbXMpLmJlZ2luKCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gX19DT05TVF9DQVNUKF9FbGVtc0NvbnQmLCBfTV9lbGVtcykuZW5kKCk7IH0KKyAgY29uc3RfbG9jYWxfaXRlcmF0b3IgYmVnaW4oc2l6ZV90eXBlIF9fbikgY29uc3QgeyByZXR1cm4gX0VsZW1zSXRlKF9NX2J1Y2tldHNbX19uXSk7IH0KKyAgY29uc3RfbG9jYWxfaXRlcmF0b3IgZW5kKHNpemVfdHlwZSBfX24pIGNvbnN0IHsgcmV0dXJuIF9FbGVtc0l0ZShfTV9idWNrZXRzW19fbiArIDFdKTsgfQorCisgIC8vc3RhdGljIGJvb2wgX1NUTFBfQ0FMTCBfTV9lcXVhbCAoY29uc3QgX1NlbGYmLCBjb25zdCBfU2VsZiYpOworCitwdWJsaWM6CisgIC8vVGhlIG51bWJlciBvZiBidWNrZXRzIGlzIHNpemUoKSAtIDEgYmVjYXVzZSB0aGUgbGFzdCBidWNrZXQgYWx3YXlzIGNvbnRhaW5zCisgIC8vX01fZWxlbXMuZW5kKCkgdG8gbWFrZSBhbGdvIGVhc2llciB0byBpbXBsZW1lbnQuCisgIHNpemVfdHlwZSBidWNrZXRfY291bnQoKSBjb25zdCB7IHJldHVybiBfTV9idWNrZXRzLnNpemUoKSAtIDE7IH0KKyAgc2l6ZV90eXBlIG1heF9idWNrZXRfY291bnQoKSBjb25zdCB7IHJldHVybiBfU1RMUF9QUklWIF9TdGxfcHJpbWVfdHlwZTo6X1NfbWF4X25iX2J1Y2tldHMoKTsgfQorICBzaXplX3R5cGUgZWxlbXNfaW5fYnVja2V0KHNpemVfdHlwZSBfX2J1Y2tldCkgY29uc3QKKyAgeyByZXR1cm4gX1NUTFBfU1REOjpkaXN0YW5jZShfRWxlbXNJdGUoX01fYnVja2V0c1tfX2J1Y2tldF0pLCBfRWxlbXNJdGUoX01fYnVja2V0c1tfX2J1Y2tldCArIDFdKSk7IH0KKworICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgc2l6ZV90eXBlIGJ1Y2tldChjb25zdCBfS1QmIF9faykgY29uc3QgeyByZXR1cm4gX01fYmt0X251bV9rZXkoX19rKTsgfQorCisgIC8vIGhhc2ggcG9saWN5CisgIGZsb2F0IGxvYWRfZmFjdG9yKCkgY29uc3QgeyByZXR1cm4gKGZsb2F0KXNpemUoKSAvIChmbG9hdClidWNrZXRfY291bnQoKTsgfQorICBmbG9hdCBtYXhfbG9hZF9mYWN0b3IoKSBjb25zdCB7IHJldHVybiBfTV9tYXhfbG9hZF9mYWN0b3I7IH0KKyAgdm9pZCBtYXhfbG9hZF9mYWN0b3IoZmxvYXQgX196KSB7CisgICAgX01fbWF4X2xvYWRfZmFjdG9yID0gX196OworICAgIF9NX3Jlc2l6ZSgpOworICB9CisKKyAgcGFpcjxpdGVyYXRvciwgYm9vbD4gaW5zZXJ0X3VuaXF1ZShjb25zdCB2YWx1ZV90eXBlJiBfX29iaikgeworICAgIF9NX2VubGFyZ2UoX01fbnVtX2VsZW1lbnRzICsgMSk7CisgICAgcmV0dXJuIGluc2VydF91bmlxdWVfbm9yZXNpemUoX19vYmopOworICB9CisKKyAgaXRlcmF0b3IgaW5zZXJ0X2VxdWFsKGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKSB7CisgICAgX01fZW5sYXJnZShfTV9udW1fZWxlbWVudHMgKyAxKTsKKyAgICByZXR1cm4gaW5zZXJ0X2VxdWFsX25vcmVzaXplKF9fb2JqKTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIGl0ZXJhdG9yIF9NX2luc2VydF9ub3Jlc2l6ZShzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX29iaik7CitwdWJsaWM6CisgIHBhaXI8aXRlcmF0b3IsIGJvb2w+IGluc2VydF91bmlxdWVfbm9yZXNpemUoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopOworICBpdGVyYXRvciBpbnNlcnRfZXF1YWxfbm9yZXNpemUoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopOworCisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICB2b2lkIGluc2VydF91bmlxdWUoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wpCisgIHsgaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCwgX1NUTFBfSVRFUkFUT1JfQ0FURUdPUlkoX19mLCBfSW5wdXRJdGVyYXRvcikpOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICB2b2lkIGluc2VydF9lcXVhbChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCkKKyAgeyBpbnNlcnRfZXF1YWwoX19mLCBfX2wsIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9fZiwgX0lucHV0SXRlcmF0b3IpKTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgdm9pZCBpbnNlcnRfdW5pcXVlKF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5wdXRfaXRlcmF0b3JfdGFnICYpIHsKKyAgICBmb3IgKCA7IF9fZiAhPSBfX2w7ICsrX19mKQorICAgICAgaW5zZXJ0X3VuaXF1ZSgqX19mKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgdm9pZCBpbnNlcnRfZXF1YWwoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0X2l0ZXJhdG9yX3RhZyAmKSB7CisgICAgZm9yICggOyBfX2YgIT0gX19sOyArK19fZikKKyAgICAgIGluc2VydF9lcXVhbCgqX19mKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorICB2b2lkIGluc2VydF91bmlxdWUoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX19sLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9yd2FyZF9pdGVyYXRvcl90YWcgJikgeworICAgIHNpemVfdHlwZSBfX24gPSBfU1RMUF9TVEQ6OmRpc3RhbmNlKF9fZiwgX19sKTsKKyAgICBfTV9lbmxhcmdlKF9NX251bV9lbGVtZW50cyArIF9fbik7CisgICAgZm9yICggOyBfX24gPiAwOyAtLV9fbiwgKytfX2YpCisgICAgICBpbnNlcnRfdW5pcXVlX25vcmVzaXplKCpfX2YpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CisgIHZvaWQgaW5zZXJ0X2VxdWFsKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fbCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9yd2FyZF9pdGVyYXRvcl90YWcgJikgeworICAgIHNpemVfdHlwZSBfX24gPSBfU1RMUF9TVEQ6OmRpc3RhbmNlKF9fZiwgX19sKTsKKyAgICBfTV9lbmxhcmdlKF9NX251bV9lbGVtZW50cyArIF9fbik7CisgICAgZm9yICggOyBfX24gPiAwOyAtLV9fbiwgKytfX2YpCisgICAgICBpbnNlcnRfZXF1YWxfbm9yZXNpemUoKl9fZik7CisgIH0KKworI2Vsc2UgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworICB2b2lkIGluc2VydF91bmlxdWUoY29uc3QgdmFsdWVfdHlwZSogX19mLCBjb25zdCB2YWx1ZV90eXBlKiBfX2wpIHsKKyAgICBzaXplX3R5cGUgX19uID0gX19sIC0gX19mOworICAgIF9NX2VubGFyZ2UoX01fbnVtX2VsZW1lbnRzICsgX19uKTsKKyAgICBmb3IgKCA7IF9fbiA+IDA7IC0tX19uLCArK19fZikKKyAgICAgIGluc2VydF91bmlxdWVfbm9yZXNpemUoKl9fZik7CisgIH0KKworICB2b2lkIGluc2VydF9lcXVhbChjb25zdCB2YWx1ZV90eXBlKiBfX2YsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbCkgeworICAgIHNpemVfdHlwZSBfX24gPSBfX2wgLSBfX2Y7CisgICAgX01fZW5sYXJnZShfTV9udW1fZWxlbWVudHMgKyBfX24pOworICAgIGZvciAoIDsgX19uID4gMDsgLS1fX24sICsrX19mKQorICAgICAgaW5zZXJ0X2VxdWFsX25vcmVzaXplKCpfX2YpOworICB9CisKKyAgdm9pZCBpbnNlcnRfdW5pcXVlKGNvbnN0X2l0ZXJhdG9yIF9fZiwgY29uc3RfaXRlcmF0b3IgX19sKSB7CisgICAgc2l6ZV90eXBlIF9fbiA9IF9TVExQX1NURDo6ZGlzdGFuY2UoX19mLCBfX2wpOworICAgIF9NX2VubGFyZ2UoX01fbnVtX2VsZW1lbnRzICsgX19uKTsKKyAgICBmb3IgKCA7IF9fbiA+IDA7IC0tX19uLCArK19fZikKKyAgICAgIGluc2VydF91bmlxdWVfbm9yZXNpemUoKl9fZik7CisgIH0KKworICB2b2lkIGluc2VydF9lcXVhbChjb25zdF9pdGVyYXRvciBfX2YsIGNvbnN0X2l0ZXJhdG9yIF9fbCkgeworICAgIHNpemVfdHlwZSBfX24gPSBfU1RMUF9TVEQ6OmRpc3RhbmNlKF9fZiwgX19sKTsKKyAgICBfTV9lbmxhcmdlKF9NX251bV9lbGVtZW50cyArIF9fbik7CisgICAgZm9yICggOyBfX24gPiAwOyAtLV9fbiwgKytfX2YpCisgICAgICBpbnNlcnRfZXF1YWxfbm9yZXNpemUoKl9fZik7CisgIH0KKyNlbmRpZiAvKl9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKworICAvL3JlZmVyZW5jZSBmaW5kX29yX2luc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX29iaik7CisKK3ByaXZhdGU6CisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBfRWxlbXNJdGUgX01fZmluZChjb25zdCBfS1QmIF9fa2V5KSBjb25zdCB7CisgICAgc2l6ZV90eXBlIF9fbiA9IF9NX2JrdF9udW1fa2V5KF9fa2V5KTsKKyAgICBfRWxlbXNJdGUgX19maXJzdChfTV9idWNrZXRzW19fbl0pOworICAgIF9FbGVtc0l0ZSBfX2xhc3QoX01fYnVja2V0c1tfX24gKyAxXSk7CisgICAgZm9yICggOyAoX19maXJzdCAhPSBfX2xhc3QpICYmICFfTV9lcXVhbHMoX01fZ2V0X2tleSgqX19maXJzdCksIF9fa2V5KTsgKytfX2ZpcnN0KTsKKyAgICBpZiAoX19maXJzdCAhPSBfX2xhc3QpCisgICAgICByZXR1cm4gX19maXJzdDsKKyAgICBlbHNlCisgICAgICByZXR1cm4gX19DT05TVF9DQVNUKF9FbGVtc0NvbnQmLCBfTV9lbGVtcykuZW5kKCk7CisgIH0KKworcHVibGljOgorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgaXRlcmF0b3IgZmluZChjb25zdCBfS1QmIF9fa2V5KSB7IHJldHVybiBfTV9maW5kKF9fa2V5KTsgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgY29uc3RfaXRlcmF0b3IgZmluZChjb25zdCBfS1QmIF9fa2V5KSBjb25zdCB7IHJldHVybiBfTV9maW5kKF9fa2V5KTsgfQorCisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBzaXplX3R5cGUgY291bnQoY29uc3QgX0tUJiBfX2tleSkgY29uc3QgeworICAgIGNvbnN0IHNpemVfdHlwZSBfX24gPSBfTV9ia3RfbnVtX2tleShfX2tleSk7CisKKyAgICBfRWxlbXNJdGUgX19jdXIoX01fYnVja2V0c1tfX25dKTsKKyAgICBfRWxlbXNJdGUgX19sYXN0KF9NX2J1Y2tldHNbX19uICsgMV0pOworICAgIGZvciAoOyBfX2N1ciAhPSBfX2xhc3Q7ICsrX19jdXIpIHsKKyAgICAgIGlmIChfTV9lcXVhbHMoX01fZ2V0X2tleSgqX19jdXIpLCBfX2tleSkpIHsKKyAgICAgICAgc2l6ZV90eXBlIF9fcmVzdWx0ID0gMTsKKyAgICAgICAgZm9yICgrK19fY3VyOworICAgICAgICAgICAgIF9fY3VyICE9IF9fbGFzdCAmJiBfTV9lcXVhbHMoX01fZ2V0X2tleSgqX19jdXIpLCBfX2tleSk7CisgICAgICAgICAgICAgKytfX3Jlc3VsdCwgKytfX2N1cik7CisgICAgICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7CisgIH0KKworICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgcGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+IGVxdWFsX3JhbmdlKGNvbnN0IF9LVCYgX19rZXkpIHsKKyAgICB0eXBlZGVmIHBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPiBfUGlpOworICAgIGNvbnN0IHNpemVfdHlwZSBfX24gPSBfTV9ia3RfbnVtX2tleShfX2tleSk7CisKKyAgICBmb3IgKF9FbGVtc0l0ZSBfX2ZpcnN0KF9NX2J1Y2tldHNbX19uXSksIF9fbGFzdChfTV9idWNrZXRzW19fbiArIDFdKTsKKyAgICAgICAgIF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpIHsKKyAgICAgIGlmIChfTV9lcXVhbHMoX01fZ2V0X2tleSgqX19maXJzdCksIF9fa2V5KSkgeworICAgICAgICBfRWxlbXNJdGUgX19jdXIoX19maXJzdCk7CisgICAgICAgIGZvciAoKytfX2N1cjsgKF9fY3VyICE9IF9fbGFzdCkgJiYgX01fZXF1YWxzKF9NX2dldF9rZXkoKl9fY3VyKSwgX19rZXkpOyArK19fY3VyKTsKKyAgICAgICAgcmV0dXJuIF9QaWkoX19maXJzdCwgX19jdXIpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gX1BpaShlbmQoKSwgZW5kKCkpOworICB9CisKKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIHBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPiBlcXVhbF9yYW5nZShjb25zdCBfS1QmIF9fa2V5KSBjb25zdCB7CisgICAgdHlwZWRlZiBwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4gX1BpaTsKKyAgICBjb25zdCBzaXplX3R5cGUgX19uID0gX01fYmt0X251bV9rZXkoX19rZXkpOworCisgICAgZm9yIChfRWxlbXNJdGUgX19maXJzdChfTV9idWNrZXRzW19fbl0pLCBfX2xhc3QoX01fYnVja2V0c1tfX24gKyAxXSk7CisgICAgICAgICBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KSB7CisgICAgICBpZiAoX01fZXF1YWxzKF9NX2dldF9rZXkoKl9fZmlyc3QpLCBfX2tleSkpIHsKKyAgICAgICAgX0VsZW1zSXRlIF9fY3VyKF9fZmlyc3QpOworICAgICAgICBmb3IgKCsrX19jdXI7IChfX2N1ciAhPSBfX2xhc3QpICYmIF9NX2VxdWFscyhfTV9nZXRfa2V5KCpfX2N1ciksIF9fa2V5KTsgKytfX2N1cik7CisgICAgICAgIHJldHVybiBfUGlpKF9fZmlyc3QsIF9fY3VyKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIF9QaWkoZW5kKCksIGVuZCgpKTsKKyAgfQorCisgIHNpemVfdHlwZSBlcmFzZShjb25zdCBrZXlfdHlwZSYgX19rZXkpOworICB2b2lkIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9faXQpOworICB2b2lkIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCk7CisKK3ByaXZhdGU6CisgIHZvaWQgX01fZW5sYXJnZShzaXplX3R5cGUgX19uKTsKKyAgdm9pZCBfTV9yZWR1Y2UoKTsKKyAgdm9pZCBfTV9yZXNpemUoKTsKKyAgdm9pZCBfTV9yZWhhc2goc2l6ZV90eXBlIF9fbnVtX2J1Y2tldHMpOworI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHKQorICB2b2lkIF9NX2NoZWNrKCkgY29uc3Q7CisjZW5kaWYKKworcHVibGljOgorICB2b2lkIHJlaGFzaChzaXplX3R5cGUgX19udW1fYnVja2V0c19oaW50KTsKKyAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9fbnVtX2J1Y2tldHNfaGludCkKKyAgeyByZWhhc2goX19udW1fYnVja2V0c19oaW50KTsgfQorICB2b2lkIGNsZWFyKCk7CisKKyAgLy8gdGhpcyBpcyBmb3IgaGFzaF9tYXA6Om9wZXJhdG9yW10KKyAgcmVmZXJlbmNlIF9NX2luc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX29iaik7CisKK3ByaXZhdGU6CisgIC8vX19uIGlzIHNldCB0byB0aGUgZmlyc3QgYnVja2V0IHRoYXQgaGFzIHRvIGJlIG1vZGlmaWVkIGlmIGFueQorICAvL2VyYXNlL2luc2VydCBvcGVyYXRpb24gaXMgZG9uZSBhZnRlciB0aGUgcmV0dXJuZWQgaXRlcmF0b3IuCisgIGl0ZXJhdG9yIF9NX2JlZm9yZV9iZWdpbihzaXplX3R5cGUgJl9fbikgY29uc3Q7CisKKyAgc3RhdGljIGl0ZXJhdG9yIF9TX2JlZm9yZV9iZWdpbihjb25zdCBfRWxlbXNDb250JiBfX2VsZW1zLCBjb25zdCBfQnVja2V0VmVjdG9yJiBfX2J1Y2tldHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlICZfX24pOworCisgIHZvaWQgX01faW5pdGlhbGl6ZV9idWNrZXRzKHNpemVfdHlwZSBfX24pIHsKKyAgICBjb25zdCBzaXplX3R5cGUgX19uX2J1Y2tldHMgPSBfU1RMUF9QUklWIF9TdGxfcHJpbWVfdHlwZTo6X1NfbmV4dF9zaXplKF9fbikgKyAxOworICAgIF9NX2J1Y2tldHMucmVzZXJ2ZShfX25fYnVja2V0cyk7CisgICAgX01fYnVja2V0cy5hc3NpZ24oX19uX2J1Y2tldHMsIF9fU1RBVElDX0NBU1QoX0J1Y2tldFR5cGUqLCAwKSk7CisgIH0KKworICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgc2l6ZV90eXBlIF9NX2JrdF9udW1fa2V5KGNvbnN0IF9LVCYgX19rZXkpIGNvbnN0CisgIHsgcmV0dXJuIF9NX2JrdF9udW1fa2V5KF9fa2V5LCBidWNrZXRfY291bnQoKSk7IH0KKworICBzaXplX3R5cGUgX01fYmt0X251bShjb25zdCB2YWx1ZV90eXBlJiBfX29iaikgY29uc3QKKyAgeyByZXR1cm4gX01fYmt0X251bV9rZXkoX01fZ2V0X2tleShfX29iaikpOyB9CisKKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIHNpemVfdHlwZSBfTV9ia3RfbnVtX2tleShjb25zdCBfS1QmIF9fa2V5LCBzaXplX3R5cGUgX19uKSBjb25zdAorICB7IHJldHVybiBfTV9oYXNoKF9fa2V5KSAlIF9fbjsgfQorCisgIHNpemVfdHlwZSBfTV9ia3RfbnVtKGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqLCBzaXplX3QgX19uKSBjb25zdAorICB7IHJldHVybiBfTV9ia3RfbnVtX2tleShfTV9nZXRfa2V5KF9fb2JqKSwgX19uKTsgfQorCisgIHZvaWQgX01fY29weV9mcm9tKGNvbnN0IF9TZWxmJiBfX2h0KTsKK307CisKKyNpZiBkZWZpbmVkIChfU1RMUF9ERUJVRykKKyMgIHVuZGVmIGhhc2h0YWJsZQorX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisjZW5kaWYKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjaWYgIWRlZmluZWQgKF9TVExQX0xJTktfVElNRV9JTlNUQU5USUFUSU9OKQorIyAgaW5jbHVkZSA8c3RsL19oYXNodGFibGUuYz4KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpCisjICBpbmNsdWRlIDxzdGwvZGVidWcvX2hhc2h0YWJsZS5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisjZGVmaW5lIF9TVExQX1RFTVBMQVRFX0hFQURFUiB0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hGLCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfRXhLLCBjbGFzcyBfRXFLLCBjbGFzcyBfQWxsPgorI2RlZmluZSBfU1RMUF9URU1QTEFURV9DT05UQUlORVIgaGFzaHRhYmxlPF9WYWwsX0tleSxfSEYsX1RyYWl0cyxfRXhLLF9FcUssX0FsbD4KKyNpbmNsdWRlIDxzdGwvX3JlbG9wc19oYXNoX2NvbnQuaD4KKyN1bmRlZiBfU1RMUF9URU1QTEFURV9DT05UQUlORVIKKyN1bmRlZiBfU1RMUF9URU1QTEFURV9IRUFERVIKKworI2lmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pICYmICFkZWZpbmVkIChfU1RMUF9OT19NT1ZFX1NFTUFOVElDKQordGVtcGxhdGUgPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0V4SywgY2xhc3MgX0VxSywgY2xhc3MgX0FsbD4KK3N0cnVjdCBfX21vdmVfdHJhaXRzPGhhc2h0YWJsZTxfVmFsLCBfS2V5LCBfSEYsIF9UcmFpdHMsIF9FeEssIF9FcUssIF9BbGw+ID4geworICAvL0hhc2h0YWJsZXMgYXJlIG1vdmFibGU6CisgIHR5cGVkZWYgX190cnVlX3R5cGUgaW1wbGVtZW50ZWQ7CisKKyAgLy9Db21wbGV0ZW5lc3MgZGVwZW5kcyBvbiBtYW55IHRlbXBsYXRlIHBhcmFtZXRlcnMsIGZvciB0aGUgbW9tZW50IHdlIGNvbnNpZGVyIGl0IG5vdCBjb21wbGV0ZToKKyAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgY29tcGxldGU7Cit9OworI2VuZGlmCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2VuZGlmIC8qIF9TVExQX0lOVEVSTkFMX0hBU0hUQUJMRV9IICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX2hlYXAuYyBiL3N0bHBvcnQvc3RsL19oZWFwLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHN0bC9faGVhcC5jCnJlbmFtZSB0byBzdGxwb3J0L3N0bC9faGVhcC5jCmRpZmYgLS1naXQgYS9zdGwvX2hlYXAuaCBiL3N0bHBvcnQvc3RsL19oZWFwLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHN0bC9faGVhcC5oCnJlbmFtZSB0byBzdGxwb3J0L3N0bC9faGVhcC5oCmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9faW9tYW5pcC5oIGIvc3RscG9ydC9zdGwvX2lvbWFuaXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjdkOTUxCi0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvX2lvbWFuaXAuaApAQCAtMCwwICsxLDE2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9JT01BTklQCisjZGVmaW5lIF9TVExQX0lOVEVSTkFMX0lPTUFOSVAKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9JU1RSRUFNCisjICBpbmNsdWRlIDxzdGwvX2lzdHJlYW0uaD4gICAgICAgICAgICAgIC8vIEluY2x1ZGVzIDxvc3RyZWFtPiBhbmQgPGlvcz4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1hY2hpbmVyeSBmb3IgZGVmaW5pbmcgbWFuaXB1bGF0b3JzLgorCisvLyBDbGFzcyB0aGF0IGNhbGxzIG9uZSBvZiBpb3NfYmFzZSdzIHNpbmdsZS1hcmd1bWVudCBtZW1iZXIgZnVuY3Rpb25zLgordGVtcGxhdGUgPGNsYXNzIF9Bcmc+CitzdHJ1Y3QgX0lvc19NYW5pcF8xIHsKKyAgIHR5cGVkZWYgX0FyZyAoaW9zX2Jhc2U6OipfX2ZfcHRyX3R5cGUpKF9BcmcpOworCisgIF9Jb3NfTWFuaXBfMShfX2ZfcHRyX3R5cGUgX19mLCBjb25zdCBfQXJnJiBfX2FyZykKKyAgICA6IF9NX2YoX19mKSwgX01fYXJnKF9fYXJnKSB7fQorCisgIHZvaWQgb3BlcmF0b3IoKShpb3NfYmFzZSYgX19pb3MpIGNvbnN0CisgIHsgKF9faW9zLipfTV9mKShfTV9hcmcpOyB9CisKKyAgX19mX3B0cl90eXBlIF9NX2Y7CisgIF9BcmcgX01fYXJnOworfTsKKworLy8gQ2xhc3MgdGhhdCBjYWxscyBvbmUgb2YgaW9zX2Jhc2UncyB0d28tYXJndW1lbnQgbWVtYmVyIGZ1bmN0aW9ucy4KK3N0cnVjdCBfSW9zX1NldGZfTWFuaXAgeworICBpb3NfYmFzZTo6Zm10ZmxhZ3MgX01fZmxhZzsKKyAgaW9zX2Jhc2U6OmZtdGZsYWdzIF9NX21hc2s7CisgIGJvb2wgX01fdHdvX2FyZ3M7CisKKyAgX0lvc19TZXRmX01hbmlwKGlvc19iYXNlOjpmbXRmbGFncyBfX2YpCisgICAgOiBfTV9mbGFnKF9fZiksIF9NX21hc2soMCksIF9NX3R3b19hcmdzKGZhbHNlKSB7fQorCisgIF9Jb3NfU2V0Zl9NYW5pcChpb3NfYmFzZTo6Zm10ZmxhZ3MgX19mLCBpb3NfYmFzZTo6Zm10ZmxhZ3MgX19tKQorICAgIDogX01fZmxhZyhfX2YpLCBfTV9tYXNrKF9fbSksIF9NX3R3b19hcmdzKHRydWUpIHt9CisKKyAgdm9pZCBvcGVyYXRvcigpKGlvc19iYXNlJiBfX2lvcykgY29uc3QgeworICAgIGlmIChfTV90d29fYXJncykKKyAgICAgIF9faW9zLnNldGYoX01fZmxhZywgX01fbWFzayk7CisgICAgZWxzZQorICAgICAgX19pb3Muc2V0ZihfTV9mbGFnKTsKKyAgfQorfTsKKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9Bcmc+CitpbmxpbmUgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfU1RMUF9DQUxMCitvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pc3RyLAorICAgICAgICAgICBjb25zdCBfU1RMUF9QUklWIF9Jb3NfTWFuaXBfMTxfQXJnPiYgX19mKSB7CisgIF9fZihfX2lzdHIpOworICByZXR1cm4gX19pc3RyOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQXJnPgoraW5saW5lIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX1NUTFBfQ0FMTAorb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisgICAgICAgICAgIGNvbnN0IF9TVExQX1BSSVYgX0lvc19NYW5pcF8xPF9Bcmc+JiBfX2YpIHsKKyAgX19mKF9fb3MpOworICByZXR1cm4gX19vczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2lubGluZSBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9TVExQX0NBTEwKK29wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzdHIsCisgICAgICAgICAgIGNvbnN0IF9TVExQX1BSSVYgX0lvc19TZXRmX01hbmlwJiBfX2YpIHsKKyAgX19mKF9faXN0cik7CisgIHJldHVybiBfX2lzdHI7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfU1RMUF9DQUxMCitvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKyAgICAgICAgICAgY29uc3QgX1NUTFBfUFJJViBfSW9zX1NldGZfTWFuaXAmIF9fZikgeworICBfX2YoX19vcyk7CisgIHJldHVybiBfX29zOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRoZSBpb3NfYmFzZSBtYW5pcHVsYXRvcnMuCitpbmxpbmUgX1NUTFBfUFJJViBfSW9zX1NldGZfTWFuaXAgX1NUTFBfQ0FMTCByZXNldGlvc2ZsYWdzKGlvc19iYXNlOjpmbXRmbGFncyBfX21hc2spCit7IHJldHVybiBfU1RMUF9QUklWIF9Jb3NfU2V0Zl9NYW5pcCgwLCBfX21hc2spOyB9CisKK2lubGluZSBfU1RMUF9QUklWIF9Jb3NfU2V0Zl9NYW5pcCBfU1RMUF9DQUxMIHNldGlvc2ZsYWdzKGlvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWcpCit7IHJldHVybiBfU1RMUF9QUklWIF9Jb3NfU2V0Zl9NYW5pcChfX2ZsYWcpOyB9CisKK2lubGluZSBfU1RMUF9QUklWIF9Jb3NfU2V0Zl9NYW5pcCBfU1RMUF9DQUxMIHNldGJhc2UoaW50IF9fbikgeworICBpb3NfYmFzZTo6Zm10ZmxhZ3MgX19iYXNlID0gX19uID09IDggID8gaW9zX2Jhc2U6Om9jdCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX24gPT0gMTAgPyBpb3NfYmFzZTo6ZGVjIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbiA9PSAxNiA/IGlvc19iYXNlOjpoZXggOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6OmZtdGZsYWdzKDApOworICByZXR1cm4gX1NUTFBfUFJJViBfSW9zX1NldGZfTWFuaXAoX19iYXNlLCBpb3NfYmFzZTo6YmFzZWZpZWxkKTsKK30KKworaW5saW5lIF9TVExQX1BSSVYgX0lvc19NYW5pcF8xPHN0cmVhbXNpemU+IF9TVExQX0NBTEwKK3NldHByZWNpc2lvbihpbnQgX19uKSB7CisgIF9TVExQX1BSSVYgX0lvc19NYW5pcF8xPHN0cmVhbXNpemU+OjpfX2ZfcHRyX3R5cGUgX19mID0gJmlvc19iYXNlOjpwcmVjaXNpb247CisgIHJldHVybiBfU1RMUF9QUklWIF9Jb3NfTWFuaXBfMTxzdHJlYW1zaXplPihfX2YsIF9fbik7Cit9CisKK2lubGluZSBfU1RMUF9QUklWIF9Jb3NfTWFuaXBfMTxzdHJlYW1zaXplPiAgX1NUTFBfQ0FMTAorc2V0dyhpbnQgX19uKSB7CisgIF9TVExQX1BSSVYgX0lvc19NYW5pcF8xPHN0cmVhbXNpemU+OjpfX2ZfcHRyX3R5cGUgX19mID0gJmlvc19iYXNlOjp3aWR0aDsgIAorICByZXR1cm4gX1NUTFBfUFJJViBfSW9zX01hbmlwXzE8c3RyZWFtc2l6ZT4oX19mLCBfX24pOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHNldGZpbGwsIGEgbWFuaXB1bGF0b3IgdGhhdCBvcGVyYXRlcyBvbiBiYXNpY19pb3M8PiBpbnN0ZWFkIG9mIGlvc19iYXNlLgorCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+CitzdHJ1Y3QgX1NldGZpbGxfTWFuaXAgeworICBfU2V0ZmlsbF9NYW5pcChfQ2hhclQgX19jKSA6IF9NX2MoX19jKSB7fQorICBfQ2hhclQgX01fYzsKK307CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQ2hhclQyLCBjbGFzcyBfVHJhaXRzPgoraW5saW5lIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX1NUTFBfQ0FMTAorb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisgICAgICAgICAgIGNvbnN0IF9TVExQX1BSSVYgX1NldGZpbGxfTWFuaXA8X0NoYXJUMj4mIF9fbSkgeworICBfX29zLmZpbGwoX19tLl9NX2MpOworICByZXR1cm4gX19vczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0NoYXJUMiwgY2xhc3MgX1RyYWl0cz4KK2lubGluZSBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9TVExQX0NBTEwKK29wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorICAgICAgICAgICBjb25zdCBfU1RMUF9QUklWIF9TZXRmaWxsX01hbmlwPF9DaGFyVDI+JiBfX20pIHsKKyAgX19pcy5maWxsKF9fbS5fTV9jKTsKKyAgcmV0dXJuIF9faXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+CitpbmxpbmUgX1NUTFBfUFJJViBfU2V0ZmlsbF9NYW5pcDxfQ2hhclQ+IF9TVExQX0NBTEwgc2V0ZmlsbChfQ2hhclQgX19jKQoreyByZXR1cm4gX1NUTFBfUFJJViBfU2V0ZmlsbF9NYW5pcDxfQ2hhclQ+KF9fYyk7IH0KKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfSU9NQU5JUCAqLwpkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdGwvX2lvcy5jIGIvc3RscG9ydC9zdGwvX2lvcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZWM3N2YKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9faW9zLmMKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisjaWZuZGVmIF9TVExQX0lPU19DCisjZGVmaW5lIF9TVExQX0lPU19DCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfSU9TX0gKKyMgaW5jbHVkZSA8c3RsL19pb3MuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX1NUUkVBTUJVRgorIyBpbmNsdWRlIDxzdGwvX3N0cmVhbWJ1Zi5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfTlVNUFVOQ1RfSAorIyBpbmNsdWRlIDxzdGwvX251bXB1bmN0Lmg+CisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKKy8vIGJhc2ljX2lvczw+J3Mgbm9uLWlubGluZSBtZW1iZXIgZnVuY3Rpb25zCisKKy8vIFB1YmxpYyBjb25zdHJ1Y3RvciwgdGFraW5nIGEgc3RyZWFtYnVmLgordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+CisgIDo6YmFzaWNfaW9zKGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX3N0cmVhbWJ1ZikKKyAgICA6IGlvc19iYXNlKCksIF9NX2NhY2hlZF9jdHlwZSgwKSwKKyAgICAgIF9NX2ZpbGwoX1NUTFBfTlVMTF9DSEFSX0lOSVQoX0NoYXJUKSksIF9NX3N0cmVhbWJ1ZigwKSwgX01fdGllZF9vc3RyZWFtKDApIHsKKyAgYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz46OmluaXQoX19zdHJlYW1idWYpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qCitiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPjo6cmRidWYoYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fYnVmKSB7CisgIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX3RtcCA9IF9NX3N0cmVhbWJ1ZjsKKyAgX01fc3RyZWFtYnVmID0gX19idWY7CisgIHRoaXMtPmNsZWFyKCk7CisgIHJldHVybiBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+JgorYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz46OmNvcHlmbXQoY29uc3QgYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz4mIF9feCkgeworICBfTV9pbnZva2VfY2FsbGJhY2tzKGVyYXNlX2V2ZW50KTsKKyAgX01fY29weV9zdGF0ZShfX3gpOyAgICAgICAgICAgLy8gSW5oZXJpdGVkIGZyb20gaW9zX2Jhc2UuCisgIF9NX2NhY2hlZF9jdHlwZSA9IF9feC5fTV9jYWNoZWRfY3R5cGU7CisgIF9NX2ZpbGwgPSBfX3guX01fZmlsbDsKKyAgX01fdGllZF9vc3RyZWFtID0gX194Ll9NX3RpZWRfb3N0cmVhbTsKKyAgX01faW52b2tlX2NhbGxiYWNrcyhjb3B5Zm10X2V2ZW50KTsKKyAgdGhpcy0+X01fc2V0X2V4Y2VwdGlvbl9tYXNrKF9feC5leGNlcHRpb25zKCkpOworICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Citsb2NhbGUgYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz46OmltYnVlKGNvbnN0IGxvY2FsZSYgX19sb2MpIHsKKyAgbG9jYWxlIF9fdG1wID0gaW9zX2Jhc2U6OmltYnVlKF9fbG9jKTsKKyAgX1NUTFBfVFJZIHsKKyAgICBpZiAoX01fc3RyZWFtYnVmKQorICAgICAgX01fc3RyZWFtYnVmLT5wdWJpbWJ1ZShfX2xvYyk7CisKKyAgICAvLyBubyB0aHJvd2luZyBoZXJlCisgICAgX01fY2FjaGVkX2N0eXBlID0gJnVzZV9mYWNldDxjdHlwZTxjaGFyX3R5cGU+ID4oX19sb2MpOworICB9CisgIF9TVExQX0NBVENIX0FMTCB7CisgICAgX190bXAgPSBpb3NfYmFzZTo6aW1idWUoX190bXApOworICAgIF9NX2hhbmRsZV9leGNlcHRpb24oaW9zX2Jhc2U6OmZhaWxiaXQpOworICB9CisgIHJldHVybiBfX3RtcDsKK30KKworLy8gUHJvdGVjdGVkIGNvbnN0cnVjdG9yIGFuZCBpbml0aWFsaXphdGlvbiBmdW5jdGlvbnMuIFRoZSBkZWZhdWx0CisvLyBjb25zdHJ1Y3RvciBjcmVhdGVzIGFuIHVuaW5pdGlhbGl6ZWQgYmFzaWNfaW9zLCBhbmQgaW5pdCgpIGluaXRpYWxpemVzCisvLyBhbGwgb2YgdGhlIG1lbWJlcnMgdG8gdGhlIHZhbHVlcyBpbiBUYWJsZSA4OSBvZiB0aGUgQysrIHN0YW5kYXJkLgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz46OmJhc2ljX2lvcygpCisgIDogaW9zX2Jhc2UoKSwKKyAgICBfTV9maWxsKF9TVExQX05VTExfQ0hBUl9JTklUKF9DaGFyVCkpLCBfTV9zdHJlYW1idWYoMCksIF9NX3RpZWRfb3N0cmVhbSgwKQore30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK3ZvaWQKK2Jhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+Ojppbml0KGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX3NiKQoreworICB0aGlzLT5yZGJ1ZihfX3NiKTsKKyAgdGhpcy0+aW1idWUobG9jYWxlKCkpOworICB0aGlzLT50aWUoMCk7CisgIHRoaXMtPl9NX3NldF9leGNlcHRpb25fbWFzayhpb3NfYmFzZTo6Z29vZGJpdCk7CisgIHRoaXMtPl9NX2NsZWFyX25vdGhyb3coX19zYiAhPSAwID8gaW9zX2Jhc2U6Omdvb2RiaXQgOiBpb3NfYmFzZTo6YmFkYml0KTsKKyAgaW9zX2Jhc2U6OmZsYWdzKGlvc19iYXNlOjpza2lwd3MgfCBpb3NfYmFzZTo6ZGVjKTsKKyAgaW9zX2Jhc2U6OndpZHRoKDApOworICBpb3NfYmFzZTo6cHJlY2lzaW9uKDYpOworICB0aGlzLT5maWxsKHdpZGVuKCcgJykpOworICAvLyBXZSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IGFueSBvZiB0aGUgdGhyZWUgYXJyYXlzOiB0aGV5IGFyZQorICAvLyBpbml0aWFsaXplZCBjb3JyZWN0bHkgaW4gaW9zX2Jhc2UncyBjb25zdHJ1Y3Rvci4KK30KKworLy8gVGhpcyBpcyBuZXZlciBjYWxsZWQgZXhjZXB0IGZyb20gd2l0aGluIGEgY2F0Y2ggY2xhdXNlLgordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK3ZvaWQgYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz46Ol9NX2hhbmRsZV9leGNlcHRpb24oaW9zX2Jhc2U6Omlvc3RhdGUgX19mbGFnKQoreworICB0aGlzLT5fTV9zZXRzdGF0ZV9ub3Rocm93KF9fZmxhZyk7CisgIGlmICh0aGlzLT5fTV9nZXRfZXhjZXB0aW9uX21hc2soKSAmIF9fZmxhZykKKyAgICBfU1RMUF9SRVRIUk9XOworfQorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNlbmRpZiAvKiBfU1RMUF9JT1NfQyAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdGwvX2lvcy5oIGIvc3RscG9ydC9zdGwvX2lvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNDIyZjAKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9faW9zLmgKQEAgLTAsMCArMSwxODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0lPU19ICisjZGVmaW5lIF9TVExQX0lOVEVSTkFMX0lPU19ICisKKworI2lmbmRlZiBfU1RMUF9JT1NfQkFTRV9ICisjIGluY2x1ZGUgPHN0bC9faW9zX2Jhc2UuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NUWVBFX0gKKyMgaW5jbHVkZSA8c3RsL19jdHlwZS5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfTlVNUFVOQ1RfSAorIyBpbmNsdWRlIDxzdGwvX251bXB1bmN0Lmg+CisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gQ2xhc3MgYmFzaWNfaW9zLCBhIHN1YmNsYXNzIG9mIGlvc19iYXNlLiAgVGhlIG9ubHkgaW1wb3J0YW50IGRpZmZlcmVuY2UKKy8vIGJldHdlZW4gdGhlIHR3byBpcyB0aGF0IGJhc2ljX2lvcyBpcyBhIGNsYXNzIHRlbXBsYXRlLCBwYXJhbWV0ZXJpemVkCisvLyBieSB0aGUgY2hhcmFjdGVyIHR5cGUuICBpb3NfYmFzZSBleGlzdHMgdG8gZmFjdG9yIG91dCBhbGwgb2YgdGhlCisvLyBjb21tb24gcHJvcGVydGllcyB0aGF0IGRvbid0IGRlcGVuZCBvbiB0aGUgY2hhcmFjdGVyIHR5cGUuCisKKy8vIFRoZSBzZWNvbmQgdGVtcGxhdGUgcGFyYW1ldGVyLCBfVHJhaXRzLCBkZWZhdWx0cyB0byBjaGFyX3RyYWl0czxfQ2hhclQ+LgorLy8gVGhlIGRlZmF1bHQgaXMgZGVjbGFyZWQgaW4gaGVhZGVyIDxpb3Nmd2Q+LCBhbmQgaXQgaXNuJ3QgZGVjbGFyZWQgaGVyZQorLy8gYmVjYXVzZSBDKysgbGFuZ3VhZ2UgcnVsZXMgZG8gbm90IGFsbG93IGl0IHRvIGJlIGRlY2xhcmVkIHR3aWNlLgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorY2xhc3MgYmFzaWNfaW9zIDogcHVibGljIGlvc19iYXNlIHsKKyAgZnJpZW5kIGNsYXNzIGlvc19iYXNlOworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTeW5vbnltcyBmb3IgdHlwZXMuCisgIHR5cGVkZWYgX0NoYXJUICAgICAgICAgICAgICAgICAgICAgY2hhcl90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmludF90eXBlIGludF90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OnBvc190eXBlIHBvc190eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6Om9mZl90eXBlIG9mZl90eXBlOworICB0eXBlZGVmIF9UcmFpdHMgICAgICAgICAgICAgICAgICAgIHRyYWl0c190eXBlOworCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnN0cnVjdG9yLCBkZXN0cnVjdG9yLgorICBleHBsaWNpdCBiYXNpY19pb3MoYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fc3RyZWFtYnVmKTsKKyAgdmlydHVhbCB+YmFzaWNfaW9zKCkge30KKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNZW1iZXJzIGZyb20gY2xhdXNlIDI3LjQuNC4yCisgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiogdGllKCkgY29uc3QgeworICAgIHJldHVybiBfTV90aWVkX29zdHJlYW07CisgIH0KKyAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+KgorICB0aWUoYmFzaWNfb3N0cmVhbTxjaGFyX3R5cGUsIHRyYWl0c190eXBlPiogX19uZXdfdGllZF9vc3RyZWFtKSB7CisgICAgYmFzaWNfb3N0cmVhbTxjaGFyX3R5cGUsIHRyYWl0c190eXBlPiogX190bXAgPSBfTV90aWVkX29zdHJlYW07CisgICAgX01fdGllZF9vc3RyZWFtID0gX19uZXdfdGllZF9vc3RyZWFtOworICAgIHJldHVybiBfX3RtcDsKKyAgfQorCisgIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiByZGJ1ZigpIGNvbnN0CisgICAgeyByZXR1cm4gX01fc3RyZWFtYnVmOyB9CisKKyAgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qCisgIHJkYnVmKGJhc2ljX3N0cmVhbWJ1ZjxjaGFyX3R5cGUsIHRyYWl0c190eXBlPiopOworCisgIC8vIENvcGllcyBfX3gncyBzdGF0ZSB0byAqdGhpcy4KKyAgYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz4mIGNvcHlmbXQoY29uc3QgYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz4mIF9feCk7CisKKyAgY2hhcl90eXBlIGZpbGwoKSBjb25zdCB7IHJldHVybiBfTV9maWxsOyB9CisgIGNoYXJfdHlwZSBmaWxsKGNoYXJfdHlwZSBfX2ZpbGwpIHsKKyAgICBjaGFyX3R5cGUgX190bXAoX01fZmlsbCk7CisgICAgX01fZmlsbCA9IF9fZmlsbDsKKyAgICByZXR1cm4gX190bXA7CisgIH0KKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNZW1iZXJzIGZyb20gMjcuNC40LjMuICBUaGVzZSBmb3VyIGZ1bmN0aW9ucworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYW4gYWxtb3N0IGJlIGRlZmluZWQgaW4gaW9zX2Jhc2UuCisKKyAgdm9pZCBjbGVhcihpb3N0YXRlIF9fc3RhdGUgPSBnb29kYml0KSB7CisgICAgX01fY2xlYXJfbm90aHJvdyh0aGlzLT5yZGJ1ZigpID8gX19zdGF0ZSA6IGlvc3RhdGUoX19zdGF0ZXxpb3NfYmFzZTo6YmFkYml0KSk7CisgICAgX01fY2hlY2tfZXhjZXB0aW9uX21hc2soKTsKKyAgfQorICB2b2lkIHNldHN0YXRlKGlvc3RhdGUgX19zdGF0ZSkgeyB0aGlzLT5jbGVhcihyZHN0YXRlKCkgfCBfX3N0YXRlKTsgfQorCisgIGlvc3RhdGUgZXhjZXB0aW9ucygpIGNvbnN0IHsgcmV0dXJuIHRoaXMtPl9NX2dldF9leGNlcHRpb25fbWFzaygpOyB9CisgIHZvaWQgZXhjZXB0aW9ucyhpb3N0YXRlIF9fbWFzaykgeworICAgIHRoaXMtPl9NX3NldF9leGNlcHRpb25fbWFzayhfX21hc2spOworICAgIHRoaXMtPmNsZWFyKHRoaXMtPnJkc3RhdGUoKSk7CisgIH0KKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMb2NhbGUtcmVsYXRlZCBtZW1iZXIgZnVuY3Rpb25zLgorICBsb2NhbGUgaW1idWUoY29uc3QgbG9jYWxlJik7CisKKyAgaW5saW5lIGNoYXIgbmFycm93KF9DaGFyVCwgY2hhcikgY29uc3QgOworICBpbmxpbmUgX0NoYXJUIHdpZGVuKGNoYXIpIGNvbnN0OworCisgIC8vIEhlbHBlciBmdW5jdGlvbiB0aGF0IG1ha2VzIHRlc3RpbmcgZm9yIEVPRiBtb3JlIGNvbnZlbmllbnQuCisgIHN0YXRpYyBib29sIF9TVExQX0NBTEwgX1NfZW9mKGludF90eXBlIF9fYykgeworICAgIGNvbnN0IGludF90eXBlIF9fZW9mID0gX1RyYWl0czo6ZW9mKCk7CisgICAgcmV0dXJuIF9UcmFpdHM6OmVxX2ludF90eXBlKF9fYywgX19lb2YpOworICB9CisKK3Byb3RlY3RlZDoKKyAgLy8gQ2FjaGVkIGNvcHkgb2YgdGhlIGN1cmVudCBsb2NhbGUncyBjdHlwZSBmYWNldC4gIFNldCBieSBpbml0KCkgYW5kIGltYnVlKCkuCisgIGNvbnN0IGN0eXBlPGNoYXJfdHlwZT4qIF9NX2NhY2hlZF9jdHlwZTsKKworcHVibGljOgorICAvLyBFcXVpdmFsZW50IHRvICZ1c2VfZmFjZXQ8IEZhY2V0ID4oZ2V0bG9jKCkpLCBidXQgZmFzdGVyLgorICBjb25zdCBjdHlwZTxjaGFyX3R5cGU+KiBfTV9jdHlwZV9mYWNldCgpIGNvbnN0IHsgcmV0dXJuIF9NX2NhY2hlZF9jdHlwZTsgfQorCitwcm90ZWN0ZWQ6CisgIGJhc2ljX2lvcygpOworCisgIHZvaWQgaW5pdChiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19zdHJlYW1idWYpOworCitwdWJsaWM6CisKKyAgLy8gSGVscGVyIGZ1bmN0aW9uIHVzZWQgaW4gaXN0cmVhbSBhbmQgb3N0cmVhbS4gIEl0IGlzIGNhbGxlZCBvbmx5IGZyb20KKyAgLy8gYSBjYXRjaCBjbGF1c2UuCisgIHZvaWQgX01faGFuZGxlX2V4Y2VwdGlvbihpb3NfYmFzZTo6aW9zdGF0ZSBfX2ZsYWcpOworCitwcml2YXRlOiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERhdGEgbWVtYmVycworICBjaGFyX3R5cGUgX01fZmlsbDsgICAgICAgICAgICAvLyBUaGUgZmlsbCBjaGFyYWN0ZXIsIHVzZWQgZm9yIHBhZGRpbmcuCisKKyAgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9NX3N0cmVhbWJ1ZjsKKyAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+KiAgIF9NX3RpZWRfb3N0cmVhbTsKKworfTsKKworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgoraW5saW5lIGNoYXIKK2Jhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+OjpuYXJyb3coX0NoYXJUIF9fYywgY2hhciBfX2RlZmF1bHQpIGNvbnN0Cit7IHJldHVybiBfTV9jdHlwZV9mYWNldCgpLT5uYXJyb3coX19jLCBfX2RlZmF1bHQpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUgX0NoYXJUCitiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPjo6d2lkZW4oY2hhciBfX2MpIGNvbnN0Cit7IHJldHVybiBfTV9jdHlwZV9mYWNldCgpLT53aWRlbihfX2MpOyB9CisKKyMgaWYgIWRlZmluZWQgKF9TVExQX05PX01FVEhPRF9TUEVDSUFMSVpBVElPTikKK19TVExQX1RFTVBMQVRFX05VTEwKK2lubGluZSBjaGFyCitiYXNpY19pb3M8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPjo6bmFycm93KGNoYXIgX19jLCBjaGFyKSBjb25zdAoreworICByZXR1cm4gX19jOworfQorCitfU1RMUF9URU1QTEFURV9OVUxMCitpbmxpbmUgY2hhcgorYmFzaWNfaW9zPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID46OndpZGVuKGNoYXIgX19jKSBjb25zdAoreworICByZXR1cm4gX19jOworfQorIyBlbmRpZiAvKiBfU1RMUF9OT19NRVRIT0RfU1BFQ0lBTElaQVRJT04gKi8KKworIyBpZiBkZWZpbmVkIChfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUKQorX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIGJhc2ljX2lvczxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+OworIyAgaWYgISBkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQorX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIGJhc2ljX2lvczx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+OworIyAgZW5kaWYKKyMgZW5kaWYgLyogX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCAqLworCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNpZiBkZWZpbmVkIChfU1RMUF9FWFBPU0VfU1RSRUFNX0lNUExFTUVOVEFUSU9OKSAmJiAhZGVmaW5lZCAoX1NUTFBfTElOS19USU1FX0lOU1RBTlRJQVRJT04pCisjICBpbmNsdWRlIDxzdGwvX2lvcy5jPgorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9JT1MgKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKKwpkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdGwvX2lvc19iYXNlLmggYi9zdGxwb3J0L3N0bC9faW9zX2Jhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWUxMGFkCi0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvX2lvc19iYXNlLmgKQEAgLTAsMCArMSwzNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisjaWZuZGVmIF9TVExQX0lPU19CQVNFX0gKKyNkZWZpbmUgX1NUTFBfSU9TX0JBU0VfSAorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX1NUREVYQ0VQVF9CQVNFCisjICBpbmNsdWRlIDxzdGwvX3N0ZGV4Y2VwdF9iYXNlLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9QQUlSX0gKKyMgIGluY2x1ZGUgPHN0bC9fcGFpci5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfTE9DQUxFX0gKKyMgIGluY2x1ZGUgPHN0bC9fbG9jYWxlLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9TVFJJTkdfSAorIyAgaW5jbHVkZSA8c3RsL19zdHJpbmcuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBDbGFzcyBpb3NfYmFzZS4gIFRoaXMgaXMgdGhlIGJhc2UgY2xhc3Mgb2YgdGhlIGlvcyBoaWVyYXJjaHksIHdoaWNoCisvLyBpbmNsdWRlcyBiYXNpY19pc3RyZWFtIGFuZCBiYXNpY19vc3RyZWFtLiAgQ2xhc3NlcyBpbiB0aGUgaW9zCisvLyBoaWVyYXJjaHkgYXJlIGFjdHVhbGx5IHF1aXRlIHNpbXBsZTogdGhleSBhcmUganVzdCBnbG9yaWZpZWQKKy8vIHdyYXBwZXIgY2xhc3Nlcy4gIFRoZXkgZGVsZWdhdGUgYnVmZmVyaW5nIGFuZCBwaHlzaWNhbCBjaGFyYWN0ZXIKKy8vIG1hbmlwdWxhdGlvbiB0byB0aGUgc3RyZWFtYnVmIGNsYXNzZXMsIGFuZCB0aGV5IGRlbGVnYXRlIG1vc3QKKy8vIGZvcm1hdHRpbmcgdGFza3MgdG8gYSBsb2NhbGUuCisKK2NsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIGlvc19iYXNlIHsKK3B1YmxpYzoKKworICBjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBmYWlsdXJlIDogcHVibGljIF9fTmFtZWRfZXhjZXB0aW9uIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IGZhaWx1cmUoY29uc3Qgc3RyaW5nJik7CisgICAgdmlydHVhbCB+ZmFpbHVyZSgpIF9TVExQX05PVEhST1dfSU5IRVJFTlRMWTsKKyAgfTsKKworICB0eXBlZGVmIGludCBmbXRmbGFnczsKKyAgdHlwZWRlZiBpbnQgaW9zdGF0ZTsKKyAgdHlwZWRlZiBpbnQgb3Blbm1vZGU7CisgIHR5cGVkZWYgaW50IHNlZWtkaXI7CisKKyMgaWZuZGVmIF9TVExQX05PX0FOQUNIUk9OSVNNUworICB0eXBlZGVmIGZtdGZsYWdzIGZtdF9mbGFnczsKKyMgZW5kaWYKKworICAvLyBGb3JtYXR0aW5nIGZsYWdzLgorICBfU1RMUF9TVEFUSUNfQ09OU1RBTlQoaW50LCBsZWZ0ID0gMHgwMDAxKTsKKyAgX1NUTFBfU1RBVElDX0NPTlNUQU5UKGludCwgcmlnaHQgPSAweDAwMDIpOworICBfU1RMUF9TVEFUSUNfQ09OU1RBTlQoaW50LCBpbnRlcm5hbCAgID0gMHgwMDA0KTsKKyAgX1NUTFBfU1RBVElDX0NPTlNUQU5UKGludCwgZGVjICAgICAgICA9IDB4MDAwOCk7CisgIF9TVExQX1NUQVRJQ19DT05TVEFOVChpbnQsIGhleCAgICAgICAgPSAweDAwMTApOworICBfU1RMUF9TVEFUSUNfQ09OU1RBTlQoaW50LCBvY3QgICAgICAgID0gMHgwMDIwKTsKKyAgX1NUTFBfU1RBVElDX0NPTlNUQU5UKGludCwgZml4ZWQgICAgICA9IDB4MDA0MCk7CisgIF9TVExQX1NUQVRJQ19DT05TVEFOVChpbnQsIHNjaWVudGlmaWMgPSAweDAwODApOworICBfU1RMUF9TVEFUSUNfQ09OU1RBTlQoaW50LCBib29sYWxwaGEgID0gMHgwMTAwKTsKKyAgX1NUTFBfU1RBVElDX0NPTlNUQU5UKGludCwgc2hvd2Jhc2UgICA9IDB4MDIwMCk7CisgIF9TVExQX1NUQVRJQ19DT05TVEFOVChpbnQsIHNob3dwb2ludCAgPSAweDA0MDApOworICBfU1RMUF9TVEFUSUNfQ09OU1RBTlQoaW50LCBzaG93cG9zICAgID0gMHgwODAwKTsKKyAgX1NUTFBfU1RBVElDX0NPTlNUQU5UKGludCwgc2tpcHdzICAgICA9IDB4MTAwMCk7CisgIF9TVExQX1NUQVRJQ19DT05TVEFOVChpbnQsIHVuaXRidWYgICAgPSAweDIwMDApOworICBfU1RMUF9TVEFUSUNfQ09OU1RBTlQoaW50LCB1cHBlcmNhc2UgID0gMHg0MDAwKTsKKyAgX1NUTFBfU1RBVElDX0NPTlNUQU5UKGludCwgYWRqdXN0ZmllbGQgPSBsZWZ0IHwgcmlnaHQgfCBpbnRlcm5hbCk7CisgIF9TVExQX1NUQVRJQ19DT05TVEFOVChpbnQsIGJhc2VmaWVsZCAgID0gZGVjIHwgaGV4IHwgb2N0KTsKKyAgX1NUTFBfU1RBVElDX0NPTlNUQU5UKGludCwgZmxvYXRmaWVsZCAgPSBzY2llbnRpZmljIHwgZml4ZWQpOworCisgIC8vIFN0YXRlIGZsYWdzLgorICBfU1RMUF9TVEFUSUNfQ09OU1RBTlQoaW50LCBnb29kYml0ID0gMHgwMCk7CisgIF9TVExQX1NUQVRJQ19DT05TVEFOVChpbnQsIGJhZGJpdCAgPSAweDAxKTsKKyAgX1NUTFBfU1RBVElDX0NPTlNUQU5UKGludCwgZW9mYml0ICA9IDB4MDIpOworICBfU1RMUF9TVEFUSUNfQ09OU1RBTlQoaW50LCBmYWlsYml0ID0gMHgwNCk7CisKKyAgLy8gT3Blbm1vZGUgZmxhZ3MuCisgIF9TVExQX1NUQVRJQ19DT05TVEFOVChpbnQsIF9fZGVmYXVsdF9tb2RlID0gMHgwKTsgLyogaW1wbGVtZW50YXRpb24gZGV0YWlsICovCisgIF9TVExQX1NUQVRJQ19DT05TVEFOVChpbnQsIGFwcCAgICA9IDB4MDEpOworICBfU1RMUF9TVEFUSUNfQ09OU1RBTlQoaW50LCBhdGUgICAgPSAweDAyKTsKKyAgX1NUTFBfU1RBVElDX0NPTlNUQU5UKGludCwgYmluYXJ5ID0gMHgwNCk7CisgIF9TVExQX1NUQVRJQ19DT05TVEFOVChpbnQsIGluICAgICA9IDB4MDgpOworICBfU1RMUF9TVEFUSUNfQ09OU1RBTlQoaW50LCBvdXQgICAgPSAweDEwKTsKKyAgX1NUTFBfU1RBVElDX0NPTlNUQU5UKGludCwgdHJ1bmMgID0gMHgyMCk7CisKKyAgLy8gU2Vla2RpciBmbGFncworICBfU1RMUF9TVEFUSUNfQ09OU1RBTlQoaW50LCBiZWcgPSAweDAxKTsKKyAgX1NUTFBfU1RBVElDX0NPTlNUQU5UKGludCwgY3VyID0gMHgwMik7CisgIF9TVExQX1NUQVRJQ19DT05TVEFOVChpbnQsIGVuZCA9IDB4MDQpOworCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZsYWctbWFuaXB1bGF0aW9uIGZ1bmN0aW9ucy4KKyAgZm10ZmxhZ3MgZmxhZ3MoKSBjb25zdCB7IHJldHVybiBfTV9mbXRmbGFnczsgfQorICBmbXRmbGFncyBmbGFncyhmbXRmbGFncyBfX2ZsYWdzKSB7CisgICAgZm10ZmxhZ3MgX190bXAgPSBfTV9mbXRmbGFnczsKKyAgICBfTV9mbXRmbGFncyA9IF9fZmxhZ3M7CisgICAgcmV0dXJuIF9fdG1wOworICB9CisKKyAgZm10ZmxhZ3Mgc2V0ZihmbXRmbGFncyBfX2ZsYWcpIHsKKyAgICBmbXRmbGFncyBfX3RtcCA9IF9NX2ZtdGZsYWdzOworICAgIF9NX2ZtdGZsYWdzIHw9IF9fZmxhZzsKKyAgICByZXR1cm4gX190bXA7CisgIH0KKyAgZm10ZmxhZ3Mgc2V0ZihmbXRmbGFncyBfX2ZsYWcsIGZtdGZsYWdzIF9fbWFzaykgeworICAgIGZtdGZsYWdzIF9fdG1wID0gX01fZm10ZmxhZ3M7CisgICAgX01fZm10ZmxhZ3MgJj0gfl9fbWFzazsKKyAgICBfTV9mbXRmbGFncyB8PSBfX2ZsYWcgJiBfX21hc2s7CisgICAgcmV0dXJuIF9fdG1wOworICB9CisgIHZvaWQgdW5zZXRmKGZtdGZsYWdzIF9fbWFzaykgeyBfTV9mbXRmbGFncyAmPSB+X19tYXNrOyB9CisKKyAgc3RyZWFtc2l6ZSBwcmVjaXNpb24oKSBjb25zdCB7IHJldHVybiBfTV9wcmVjaXNpb247IH0KKyAgc3RyZWFtc2l6ZSBwcmVjaXNpb24oc3RyZWFtc2l6ZSBfX25ld3ByZWNpc2lvbikgeworICAgIHN0cmVhbXNpemUgX190bXAgPSBfTV9wcmVjaXNpb247CisgICAgX01fcHJlY2lzaW9uID0gX19uZXdwcmVjaXNpb247CisgICAgcmV0dXJuIF9fdG1wOworICB9CisKKyAgc3RyZWFtc2l6ZSB3aWR0aCgpIGNvbnN0IHsgcmV0dXJuIF9NX3dpZHRoOyB9CisgIHN0cmVhbXNpemUgd2lkdGgoc3RyZWFtc2l6ZSBfX25ld3dpZHRoKSB7CisgICAgc3RyZWFtc2l6ZSBfX3RtcCA9IF9NX3dpZHRoOworICAgIF9NX3dpZHRoID0gX19uZXd3aWR0aDsKKyAgICByZXR1cm4gX190bXA7CisgIH0KKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMb2NhbGVzCisgIGxvY2FsZSBpbWJ1ZShjb25zdCBsb2NhbGUmKTsKKyAgbG9jYWxlIGdldGxvYygpIGNvbnN0IHsgcmV0dXJuIF9NX2xvY2FsZTsgfQorCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEF1eGlsaWFyeSBzdG9yYWdlLgorICBzdGF0aWMgaW50IF9TVExQX0NBTEwgeGFsbG9jKCk7CisgIGxvbmcmICBpd29yZChpbnQgX19pbmRleCk7CisgIHZvaWQqJiBwd29yZChpbnQgX19pbmRleCk7CisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVzdHJ1Y3Rvci4KKyAgdmlydHVhbCB+aW9zX2Jhc2UoKTsKKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDYWxsYmFja3MuCisgIGVudW0gZXZlbnQgeyBlcmFzZV9ldmVudCwgaW1idWVfZXZlbnQsIGNvcHlmbXRfZXZlbnQgfTsKKyAgdHlwZWRlZiB2b2lkICgqZXZlbnRfY2FsbGJhY2spKGV2ZW50LCBpb3NfYmFzZSYsIGludCBfX2luZGV4KTsKKyAgdm9pZCByZWdpc3Rlcl9jYWxsYmFjayhldmVudF9jYWxsYmFjayBfX2ZuLCBpbnQgX19pbmRleCk7CisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBtZW1iZXIgZnVuY3Rpb24gYWZmZWN0cyBvbmx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBlaWdodCBwcmVkZWZpbmVkIGlvcyBvYmplY3RzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaW4sIGNvdXQsIGV0Yy4KKyAgc3RhdGljIGJvb2wgX1NUTFBfQ0FMTCBzeW5jX3dpdGhfc3RkaW8oYm9vbCBfX3N5bmMgPSB0cnVlKTsKKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgQysrIHN0YW5kYXJkIHJlcXVpcmVzIG9ubHkgdGhhdCB0aGVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZW1iZXIgZnVuY3Rpb25zIGJlIGRlZmluZWQgaW4gYmFzaWNfaW9zLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBkZWZpbmUgdGhlbSBpbiB0aGUgbm9uLXRlbXBsYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhc2UgY2xhc3MgdG8gYXZvaWQgY29kZSBkdXBsaWNhdGlvbi4KKyAgb3BlcmF0b3Igdm9pZCooKSBjb25zdCB7IHJldHVybiAhZmFpbCgpID8gKHZvaWQqKSBfX0NPTlNUX0NBU1QoaW9zX2Jhc2UqLHRoaXMpIDogKHZvaWQqKSAwOyB9CisgIGJvb2wgb3BlcmF0b3IhKCkgY29uc3QgeyByZXR1cm4gZmFpbCgpOyB9CisKKyAgaW9zdGF0ZSByZHN0YXRlKCkgY29uc3QgeyByZXR1cm4gX01faW9zdGF0ZTsgfQorCisgIGJvb2wgZ29vZCgpIGNvbnN0IHsgcmV0dXJuIF9NX2lvc3RhdGUgPT0gMDsgfQorICBib29sIGVvZigpIGNvbnN0IHsgcmV0dXJuIChfTV9pb3N0YXRlICYgZW9mYml0KSAhPSAwOyB9CisgIGJvb2wgZmFpbCgpIGNvbnN0IHsgcmV0dXJuIChfTV9pb3N0YXRlICYgKGZhaWxiaXQgfCBiYWRiaXQpKSAhPSAwOyB9CisgIGJvb2wgYmFkKCkgY29uc3QgeyByZXR1cm4gKF9NX2lvc3RhdGUgJiBiYWRiaXQpICE9IDA7IH0KKworcHJvdGVjdGVkOiAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZnVuY3Rpb25hbCBwcm90ZWN0ZWQgaW50ZXJmYWNlLgorCisgIC8vIENvcGllcyB0aGUgc3RhdGUgb2YgX194IHRvICp0aGlzLiAgVGhpcyBtZW1iZXIgZnVuY3Rpb24gbWFrZXMgaXQKKyAgLy8gcG9zc2libGUgdG8gaW1wbGVtZW50IGJhc2ljX2lvczo6Y29weWZtdCB3aXRob3V0IGhhdmluZyB0byBleHBvc2UKKyAgLy8gaW9zX2Jhc2UncyBwcml2YXRlIGRhdGEgbWVtYmVycy4gIERvZXMgbm90IGNvcHkgX01fZXhjZXB0aW9uX21hc2sKKyAgLy8gb3IgX01faW9zdGF0ZS4KKyAgdm9pZCBfTV9jb3B5X3N0YXRlKGNvbnN0IGlvc19iYXNlJiBfX3gpOworCisgIHZvaWQgX01fc2V0c3RhdGVfbm90aHJvdyhpb3N0YXRlIF9fc3RhdGUpIHsgX01faW9zdGF0ZSB8PSBfX3N0YXRlOyB9CisgIHZvaWQgX01fY2xlYXJfbm90aHJvdyhpb3N0YXRlIF9fc3RhdGUpIHsgX01faW9zdGF0ZSA9IF9fc3RhdGU7IH0KKyAgaW9zdGF0ZSBfTV9nZXRfZXhjZXB0aW9uX21hc2soKSBjb25zdCB7IHJldHVybiBfTV9leGNlcHRpb25fbWFzazsgfQorICB2b2lkIF9NX3NldF9leGNlcHRpb25fbWFzayhpb3N0YXRlIF9fbWFzaykgeyBfTV9leGNlcHRpb25fbWFzayA9IF9fbWFzazsgfQorICB2b2lkIF9NX2NoZWNrX2V4Y2VwdGlvbl9tYXNrKCkgeworICAgIGlmIChfTV9pb3N0YXRlICYgX01fZXhjZXB0aW9uX21hc2spCisgICAgICBfTV90aHJvd19mYWlsdXJlKCk7CisgIH0KKworICB2b2lkIF9NX2ludm9rZV9jYWxsYmFja3MoZXZlbnQpOworICB2b2lkIF9TVExQX0ZVTkNUSU9OX1RIUk9XUyBfTV90aHJvd19mYWlsdXJlKCk7CisKKyAgaW9zX2Jhc2UoKTsgICAgICAgICAgICAgICAgICAgLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKworcHJvdGVjdGVkOiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluaXRpYWxpemF0aW9uIG9mIHRoZSBJL08gc3lzdGVtCisgIHN0YXRpYyB2b2lkIF9TVExQX0NBTEwgX1NfaW5pdGlhbGl6ZSgpOworICBzdGF0aWMgdm9pZCBfU1RMUF9DQUxMIF9TX3VuaW5pdGlhbGl6ZSgpOworICBzdGF0aWMgYm9vbCBfU19pc19zeW5jZWQ7CisKK3ByaXZhdGU6ICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW52YWxpZGF0ZSB0aGUgY29weSBjb25zdHJ1Y3RvciBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXNzaWdubWVudCBvcGVyYXRvci4KKyAgaW9zX2Jhc2UoY29uc3QgaW9zX2Jhc2UmKTsKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgaW9zX2Jhc2UmKTsKKworcHJpdmF0ZTogICAgICAgICAgICAgICAgICAgICAgICAvLyBEYXRhIG1lbWJlcnMuCisKKyAgZm10ZmxhZ3MgX01fZm10ZmxhZ3M7ICAgICAgICAgLy8gRmxhZ3MKKyAgaW9zdGF0ZSBfTV9pb3N0YXRlOworICBvcGVubW9kZSBfTV9vcGVubW9kZTsKKyAgc2Vla2RpciBfTV9zZWVrZGlyOworICBpb3N0YXRlIF9NX2V4Y2VwdGlvbl9tYXNrOworCisgIHN0cmVhbXNpemUgX01fcHJlY2lzaW9uOworICBzdHJlYW1zaXplIF9NX3dpZHRoOworCisgIGxvY2FsZSBfTV9sb2NhbGU7CisKKyAgcGFpcjxldmVudF9jYWxsYmFjaywgaW50PiogX01fY2FsbGJhY2tzOworICBzaXplX3QgX01fbnVtX2NhbGxiYWNrczsgICAgICAvLyBTaXplIG9mIHRoZSBjYWxsYmFjayBhcnJheS4KKyAgc2l6ZV90IF9NX2NhbGxiYWNrX2luZGV4OyAgICAgLy8gSW5kZXggb2YgdGhlIG5leHQgYXZhaWxhYmxlIGNhbGxiYWNrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbml0aWFsbHkgemVyby4KKworICBsb25nKiBfTV9pd29yZHM7ICAgICAgICAgICAgICAvLyBBdXhpbGlhcnkgc3RvcmFnZS4gIFRoZSBjb3VudCBpcyB6ZXJvCisgIHNpemVfdCBfTV9udW1faXdvcmRzOyAgICAgICAgIC8vIGlmIGFuZCBvbmx5IGlmIHRoZSBwb2ludGVyIGlzIG51bGwuCisKKyAgdm9pZCoqIF9NX3B3b3JkczsKKyAgc2l6ZV90IF9NX251bV9wd29yZHM7CisKK3B1YmxpYzoKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBOZXN0ZWQgaW5pdGlhbGl6ZXIgY2xhc3MuICBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbCwgYnV0IGl0J3MKKyAgLy8gcHJlc2NyaWJlZCBieSB0aGUgc3RhbmRhcmQuICBUaGUgc3RhdGljIGluaXRpYWxpemVyIG9iamVjdCAob24KKyAgLy8gaW1wbGVtZW50YXRpb25zIHdoZXJlIHN1Y2ggYSB0aGluZyBpcyByZXF1aXJlZCkgaXMgZGVjbGFyZWQgaW4KKyAgLy8gPGlvc3RyZWFtPgorICBjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBJbml0CisgIHsKKyAgICBwdWJsaWM6CisgICAgICBJbml0KCk7CisgICAgICB+SW5pdCgpOworICAgIHByaXZhdGU6CisgICAgICBzdGF0aWMgbG9uZyBfU19jb3VudDsKKyAgICAgIGZyaWVuZCBjbGFzcyBpb3NfYmFzZTsKKyAgfTsKKworICBmcmllbmQgY2xhc3MgSW5pdDsKKworcHVibGljOgorIyBpZm5kZWYgX1NUTFBfTk9fQU5BQ0hST05JU01TCisgIC8vICAzMS42ICBPbGQgaW9zdHJlYW1zIG1lbWJlcnMgICAgICAgICAgICAgICAgICAgICAgICAgW2RlcHIuaW9zLm1lbWJlcnNdCisgIHR5cGVkZWYgaW9zdGF0ZSAgaW9fc3RhdGU7CisgIHR5cGVkZWYgb3Blbm1vZGUgb3Blbl9tb2RlOworICB0eXBlZGVmIHNlZWtkaXIgIHNlZWtfZGlyOworICB0eXBlZGVmIF9TVExQX1NURDo6c3RyZWFtb2ZmICBzdHJlYW1vZmY7CisgIHR5cGVkZWYgX1NUTFBfU1REOjpzdHJlYW1wb3MgIHN0cmVhbXBvczsKKyMgZW5kaWYKK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGlvc19iYXNlIG1hbmlwdWxhdG9yIGZ1bmN0aW9ucywgZnJvbSBzZWN0aW9uIDI3LjQuNSBvZiB0aGUgQysrIHN0YW5kYXJkLgorLy8gQWxsIG9mIHRoZW0gYXJlIHRyaXZpYWwgb25lLWxpbmUgd3JhcHBlciBmdW5jdGlvbnMuCisKKy8vIGZtdGZsYWcgbWFuaXB1bGF0b3JzLCBzZWN0aW9uIDI3LjQuNS4xCitpbmxpbmUgaW9zX2Jhc2UmIF9TVExQX0NBTEwgYm9vbGFscGhhKGlvc19iYXNlJiBfX3MpCisgIHsgX19zLnNldGYoaW9zX2Jhc2U6OmJvb2xhbHBoYSk7IHJldHVybiBfX3M7fQorCitpbmxpbmUgaW9zX2Jhc2UmIF9TVExQX0NBTEwgbm9ib29sYWxwaGEoaW9zX2Jhc2UmIF9fcykKKyAgeyBfX3MudW5zZXRmKGlvc19iYXNlOjpib29sYWxwaGEpOyByZXR1cm4gX19zO30KKworaW5saW5lIGlvc19iYXNlJiBfU1RMUF9DQUxMIHNob3diYXNlKGlvc19iYXNlJiBfX3MpCisgIHsgX19zLnNldGYoaW9zX2Jhc2U6OnNob3diYXNlKTsgcmV0dXJuIF9fczt9CisKK2lubGluZSBpb3NfYmFzZSYgX1NUTFBfQ0FMTCBub3Nob3diYXNlKGlvc19iYXNlJiBfX3MpCisgIHsgX19zLnVuc2V0Zihpb3NfYmFzZTo6c2hvd2Jhc2UpOyByZXR1cm4gX19zO30KKworaW5saW5lIGlvc19iYXNlJiBfU1RMUF9DQUxMIHNob3dwb2ludChpb3NfYmFzZSYgX19zKQorICB7IF9fcy5zZXRmKGlvc19iYXNlOjpzaG93cG9pbnQpOyByZXR1cm4gX19zO30KKworaW5saW5lIGlvc19iYXNlJiBfU1RMUF9DQUxMIG5vc2hvd3BvaW50KGlvc19iYXNlJiBfX3MpCisgIHsgX19zLnVuc2V0Zihpb3NfYmFzZTo6c2hvd3BvaW50KTsgcmV0dXJuIF9fczt9CisKK2lubGluZSBpb3NfYmFzZSYgX1NUTFBfQ0FMTCBzaG93cG9zKGlvc19iYXNlJiBfX3MpCisgIHsgX19zLnNldGYoaW9zX2Jhc2U6OnNob3dwb3MpOyByZXR1cm4gX19zO30KKworaW5saW5lIGlvc19iYXNlJiBfU1RMUF9DQUxMIG5vc2hvd3Bvcyhpb3NfYmFzZSYgX19zKQorICB7IF9fcy51bnNldGYoaW9zX2Jhc2U6OnNob3dwb3MpOyByZXR1cm4gX19zO30KKworaW5saW5lIGlvc19iYXNlJiBfU1RMUF9DQUxMIHNraXB3cyhpb3NfYmFzZSYgX19zKQorICB7IF9fcy5zZXRmKGlvc19iYXNlOjpza2lwd3MpOyByZXR1cm4gX19zO30KKworaW5saW5lIGlvc19iYXNlJiBfU1RMUF9DQUxMIG5vc2tpcHdzKGlvc19iYXNlJiBfX3MpCisgIHsgX19zLnVuc2V0Zihpb3NfYmFzZTo6c2tpcHdzKTsgcmV0dXJuIF9fczt9CisKK2lubGluZSBpb3NfYmFzZSYgX1NUTFBfQ0FMTCB1cHBlcmNhc2UoaW9zX2Jhc2UmIF9fcykKKyAgeyBfX3Muc2V0Zihpb3NfYmFzZTo6dXBwZXJjYXNlKTsgcmV0dXJuIF9fczt9CisKK2lubGluZSBpb3NfYmFzZSYgX1NUTFBfQ0FMTCBub3VwcGVyY2FzZShpb3NfYmFzZSYgX19zKQorICB7IF9fcy51bnNldGYoaW9zX2Jhc2U6OnVwcGVyY2FzZSk7IHJldHVybiBfX3M7fQorCitpbmxpbmUgaW9zX2Jhc2UmIF9TVExQX0NBTEwgdW5pdGJ1Zihpb3NfYmFzZSYgX19zKQorICB7IF9fcy5zZXRmKGlvc19iYXNlOjp1bml0YnVmKTsgcmV0dXJuIF9fczt9CisKK2lubGluZSBpb3NfYmFzZSYgX1NUTFBfQ0FMTCBub3VuaXRidWYoaW9zX2Jhc2UmIF9fcykKKyAgeyBfX3MudW5zZXRmKGlvc19iYXNlOjp1bml0YnVmKTsgcmV0dXJuIF9fczt9CisKKworLy8gYWRqdXN0ZmllbGQgbWFuaXB1bGF0b3JzLCBzZWN0aW9uIDI3LjQuNS4yCitpbmxpbmUgaW9zX2Jhc2UmIF9TVExQX0NBTEwgaW50ZXJuYWwoaW9zX2Jhc2UmIF9fcykKKyAgeyBfX3Muc2V0Zihpb3NfYmFzZTo6aW50ZXJuYWwsIGlvc19iYXNlOjphZGp1c3RmaWVsZCk7IHJldHVybiBfX3M7IH0KKworaW5saW5lIGlvc19iYXNlJiBfU1RMUF9DQUxMIGxlZnQoaW9zX2Jhc2UmIF9fcykKKyAgeyBfX3Muc2V0Zihpb3NfYmFzZTo6bGVmdCwgaW9zX2Jhc2U6OmFkanVzdGZpZWxkKTsgcmV0dXJuIF9fczsgfQorCitpbmxpbmUgaW9zX2Jhc2UmIF9TVExQX0NBTEwgcmlnaHQoaW9zX2Jhc2UmIF9fcykKKyAgeyBfX3Muc2V0Zihpb3NfYmFzZTo6cmlnaHQsIGlvc19iYXNlOjphZGp1c3RmaWVsZCk7IHJldHVybiBfX3M7IH0KKworLy8gYmFzZWZpZWxkIG1hbmlwdWxhdG9ycywgc2VjdGlvbiAyNy40LjUuMworaW5saW5lIGlvc19iYXNlJiBfU1RMUF9DQUxMIGRlYyhpb3NfYmFzZSYgX19zKQorICB7IF9fcy5zZXRmKGlvc19iYXNlOjpkZWMsIGlvc19iYXNlOjpiYXNlZmllbGQpOyByZXR1cm4gX19zOyB9CisKK2lubGluZSBpb3NfYmFzZSYgX1NUTFBfQ0FMTCBoZXgoaW9zX2Jhc2UmIF9fcykKKyAgeyBfX3Muc2V0Zihpb3NfYmFzZTo6aGV4LCBpb3NfYmFzZTo6YmFzZWZpZWxkKTsgcmV0dXJuIF9fczsgfQorCitpbmxpbmUgaW9zX2Jhc2UmIF9TVExQX0NBTEwgb2N0KGlvc19iYXNlJiBfX3MpCisgIHsgX19zLnNldGYoaW9zX2Jhc2U6Om9jdCwgaW9zX2Jhc2U6OmJhc2VmaWVsZCk7IHJldHVybiBfX3M7IH0KKworCisvLyBmbG9hdGZpZWxkIG1hbmlwdWxhdG9ycywgc2VjdGlvbiAyNy40LjUuMworaW5saW5lIGlvc19iYXNlJiBfU1RMUF9DQUxMIGZpeGVkKGlvc19iYXNlJiBfX3MpCisgIHsgX19zLnNldGYoaW9zX2Jhc2U6OmZpeGVkLCBpb3NfYmFzZTo6ZmxvYXRmaWVsZCk7IHJldHVybiBfX3M7IH0KKworaW5saW5lIGlvc19iYXNlJiBfU1RMUF9DQUxMIHNjaWVudGlmaWMoaW9zX2Jhc2UmIF9fcykKKyAgeyBfX3Muc2V0Zihpb3NfYmFzZTo6c2NpZW50aWZpYywgaW9zX2Jhc2U6OmZsb2F0ZmllbGQpOyByZXR1cm4gX19zOyB9CisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2VuZGlmIC8qIF9TVExQX0lPU19CQVNFICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CisKZGlmZiAtLWdpdCBhL3N0bC9faW9zZXJyLmggYi9zdGxwb3J0L3N0bC9faW9zZXJyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHN0bC9faW9zZXJyLmgKcmVuYW1lIHRvIHN0bHBvcnQvc3RsL19pb3NlcnIuaApkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdGwvX2lvc2Z3ZC5oIGIvc3RscG9ydC9zdGwvX2lvc2Z3ZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMWRiMzEKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9faW9zZndkLmgKQEAgLTAsMCArMSwxNTkgQEAKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfSU9TRldECisjZGVmaW5lIF9TVExQX0lOVEVSTkFMX0lPU0ZXRAorCisjaWYgZGVmaW5lZCAoX19zZ2kpICYmICFkZWZpbmVkIChfX0dOVUNfXykgJiYgIWRlZmluZWQgKF9TVEFOREFSRF9DX1BMVVNfUExVUykKKyMgIGVycm9yIFRoaXMgaGVhZGVyIGZpbGUgcmVxdWlyZXMgdGhlIC1MQU5HOnN0ZCBvcHRpb24KKyNlbmRpZgorCisvLyBUaGlzIGZpbGUgcHJvdmlkZXMgZm9yd2FyZCBkZWNsYXJhdGlvbnMgb2YgdGhlIG1vc3QgaW1wb3J0YW50IEkvTworLy8gY2xhc3Nlcy4gIE5vdGUgdGhhdCBhbG1vc3QgYWxsIG9mIHRob3NlIGNsYXNzZXMgYXJlIGNsYXNzIHRlbXBsYXRlcywKKy8vIHdpdGggZGVmYXVsdCB0ZW1wbGF0ZSBhcmd1bWVudHMuICBBY2NvcmRpbmcgdG8gdGhlIEMrKyBzdGFuZGFyZCwKKy8vIGlmIGEgY2xhc3MgdGVtcGxhdGUgaXMgZGVjbGFyZWQgbW9yZSB0aGFuIG9uY2UgaW4gdGhlIHNhbWUgc2NvcGUKKy8vIHRoZW4gb25seSBvbmUgb2YgdGhvc2UgZGVjbGFyYXRpb25zIG1heSBoYXZlIGRlZmF1bHQgYXJndW1lbnRzLgorCisvLyA8aW9zZndkPiBjb250YWlucyB0aGUgc2FtZSBkZWNsYXJhdGlvbnMgYXMgb3RoZXIgaGVhZGVycywgYW5kIGluY2x1ZGluZworLy8gYm90aCA8aW9zZndkPiBhbmQgKHNheSkgPGlvc3RyZWFtPiBpcyBwZXJtaXR0ZWQuICBUaGlzIG1lYW5zIHRoYXQgb25seQorLy8gb25lIGhlYWRlciBtYXkgY29udGFpbiB0aG9zZSBkZWZhdWx0IHRlbXBsYXRlIGFyZ3VtZW50cy4KKworLy8gSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiwgdGhlIGRlY2xhcmF0aW9ucyBpbiA8aW9zZndkPiBjb250YWluIGRlZmF1bHQKKy8vIHRlbXBsYXRlIGFyZ3VtZW50cy4gIEFsbCBvZiB0aGUgb3RoZXIgSS9PIGhlYWRlcnMgaW5jbHVkZSA8aW9zZndkPi4KKworI2lmbmRlZiBfU1RMUF9DSEFSX1RSQUlUU19ICisjICBpbmNsdWRlIDxzdGwvY2hhcl90cmFpdHMuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworY2xhc3MgaW9zX2Jhc2U7CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIF9TVExQX0RGTF9UTVBMX1BBUkFNKF9UcmFpdHMgLCBjaGFyX3RyYWl0czxfQ2hhclQ+KSA+CitjbGFzcyBiYXNpY19pb3M7CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIF9TVExQX0RGTF9UTVBMX1BBUkFNKF9UcmFpdHMgLCBjaGFyX3RyYWl0czxfQ2hhclQ+KSA+CitjbGFzcyBiYXNpY19zdHJlYW1idWY7CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIF9TVExQX0RGTF9UTVBMX1BBUkFNKF9UcmFpdHMgLCBjaGFyX3RyYWl0czxfQ2hhclQ+KSA+CitjbGFzcyBiYXNpY19pc3RyZWFtOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBfU1RMUF9ERkxfVE1QTF9QQVJBTShfVHJhaXRzICwgY2hhcl90cmFpdHM8X0NoYXJUPikgPgorY2xhc3MgYmFzaWNfb3N0cmVhbTsKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgX1NUTFBfREZMX1RNUExfUEFSQU0oX1RyYWl0cyAsIGNoYXJfdHJhaXRzPF9DaGFyVD4pID4KK2NsYXNzIGJhc2ljX2lvc3RyZWFtOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBfU1RMUF9ERkxfVE1QTF9QQVJBTSggX1RyYWl0cyAsIGNoYXJfdHJhaXRzPF9DaGFyVD4pLAorICAgICAgICAgIF9TVExQX0RGTF9UTVBMX1BBUkFNKF9BbGxvY2F0b3IgLCBhbGxvY2F0b3I8X0NoYXJUPikgPgorY2xhc3MgYmFzaWNfc3RyaW5nYnVmOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBfU1RMUF9ERkxfVE1QTF9QQVJBTShfVHJhaXRzICwgY2hhcl90cmFpdHM8X0NoYXJUPiksCisgICAgICAgICAgX1NUTFBfREZMX1RNUExfUEFSQU0oX0FsbG9jYXRvciAsIGFsbG9jYXRvcjxfQ2hhclQ+KSA+CitjbGFzcyBiYXNpY19pc3RyaW5nc3RyZWFtOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBfU1RMUF9ERkxfVE1QTF9QQVJBTShfVHJhaXRzICwgY2hhcl90cmFpdHM8X0NoYXJUPiksCisgICAgICAgICAgX1NUTFBfREZMX1RNUExfUEFSQU0oX0FsbG9jYXRvciAsIGFsbG9jYXRvcjxfQ2hhclQ+KSA+CitjbGFzcyBiYXNpY19vc3RyaW5nc3RyZWFtOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBfU1RMUF9ERkxfVE1QTF9QQVJBTShfVHJhaXRzICwgY2hhcl90cmFpdHM8X0NoYXJUPiksCisgICAgICAgICAgX1NUTFBfREZMX1RNUExfUEFSQU0oX0FsbG9jYXRvciAsIGFsbG9jYXRvcjxfQ2hhclQ+KSA+CitjbGFzcyBiYXNpY19zdHJpbmdzdHJlYW07CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIF9TVExQX0RGTF9UTVBMX1BBUkFNKF9UcmFpdHMgLCBjaGFyX3RyYWl0czxfQ2hhclQ+KSA+CitjbGFzcyBiYXNpY19maWxlYnVmOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBfU1RMUF9ERkxfVE1QTF9QQVJBTShfVHJhaXRzICwgY2hhcl90cmFpdHM8X0NoYXJUPikgPgorY2xhc3MgYmFzaWNfaWZzdHJlYW07CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIF9TVExQX0RGTF9UTVBMX1BBUkFNKF9UcmFpdHMgLCBjaGFyX3RyYWl0czxfQ2hhclQ+KSA+CitjbGFzcyBiYXNpY19vZnN0cmVhbTsKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgX1NUTFBfREZMX1RNUExfUEFSQU0oX1RyYWl0cyAsIGNoYXJfdHJhaXRzPF9DaGFyVD4pID4KK2NsYXNzIGJhc2ljX2ZzdHJlYW07CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIF9TVExQX0RGTF9UTVBMX1BBUkFNKF9UcmFpdHMgLCBjaGFyX3RyYWl0czxfQ2hhclQ+KSA+CitjbGFzcyBpc3RyZWFtYnVmX2l0ZXJhdG9yOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBfU1RMUF9ERkxfVE1QTF9QQVJBTShfVHJhaXRzICwgY2hhcl90cmFpdHM8X0NoYXJUPikgPgorY2xhc3Mgb3N0cmVhbWJ1Zl9pdGVyYXRvcjsKKwordHlwZWRlZiBiYXNpY19pb3M8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiAgICBpb3M7CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkKK3R5cGVkZWYgYmFzaWNfaW9zPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4gd2lvczsKKyNlbmRpZgorCisvLyBGb3J3YXJkIGRlY2xhcmF0aW9uIG9mIGNsYXNzIGxvY2FsZSwgYW5kIG9mIHRoZSBtb3N0IGltcG9ydGFudCBmYWNldHMuCitjbGFzcyBsb2NhbGU7Cit0ZW1wbGF0ZSA8Y2xhc3MgX0ZhY2V0PgorI2lmIGRlZmluZWQgKF9TVExQX05PX0VYUExJQ0lUX0ZVTkNUSU9OX1RNUExfQVJHUykKK3N0cnVjdCBfVXNlX2ZhY2V0IHsKKyAgY29uc3QgbG9jYWxlJiBfX2xvYzsKKyAgX1VzZV9mYWNldChjb25zdCBsb2NhbGUmIF9fcF9sb2MpIDogX19sb2MoX19wX2xvYykge30KKyAgaW5saW5lIGNvbnN0IF9GYWNldCYgb3BlcmF0b3IgKigpIGNvbnN0OworfTsKKyMgIGRlZmluZSB1c2VfZmFjZXQgKl9Vc2VfZmFjZXQKKyNlbHNlCitpbmxpbmUgY29uc3QgX0ZhY2V0JiB1c2VfZmFjZXQoY29uc3QgbG9jYWxlJik7CisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4gY2xhc3MgY3R5cGU7Cit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPiBjbGFzcyBjdHlwZV9ieW5hbWU7Cit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPiBjbGFzcyBjb2xsYXRlOwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4gY2xhc3MgY29sbGF0ZV9ieW5hbWU7CisKK19TVExQX1RFTVBMQVRFX05VTEwgY2xhc3MgY3R5cGU8Y2hhcj47CitfU1RMUF9URU1QTEFURV9OVUxMIGNsYXNzIGN0eXBlX2J5bmFtZTxjaGFyPjsKK19TVExQX1RFTVBMQVRFX05VTEwgY2xhc3MgY29sbGF0ZTxjaGFyPjsKK19TVExQX1RFTVBMQVRFX05VTEwgY2xhc3MgY29sbGF0ZV9ieW5hbWU8Y2hhcj47CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkKK19TVExQX1RFTVBMQVRFX05VTEwgY2xhc3MgY3R5cGU8d2NoYXJfdD47CitfU1RMUF9URU1QTEFURV9OVUxMIGNsYXNzIGN0eXBlX2J5bmFtZTx3Y2hhcl90PjsKK19TVExQX1RFTVBMQVRFX05VTEwgY2xhc3MgY29sbGF0ZTx3Y2hhcl90PjsKK19TVExQX1RFTVBMQVRFX05VTEwgY2xhc3MgY29sbGF0ZV9ieW5hbWU8d2NoYXJfdD47CisjZW5kaWYKKworI2lmICEoZGVmaW5lZCAoX19TVU5QUk9fQ0MpICYmIF9fU1VOUFJPX0NDIDwgMHg1MDAgKQorLy8gVHlwZWRlZnMgZm9yIG9yZGluYXJ5IChuYXJyb3ctY2hhcmFjdGVyKSBzdHJlYW1zLgorLy9fU1RMUF9URU1QTEFURV9OVUxMIGNsYXNzIGJhc2ljX3N0cmVhbWJ1ZjxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+OworI2VuZGlmCisKK3R5cGVkZWYgYmFzaWNfaXN0cmVhbTxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+ICBpc3RyZWFtOwordHlwZWRlZiBiYXNpY19vc3RyZWFtPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4gIG9zdHJlYW07Cit0eXBlZGVmIGJhc2ljX2lvc3RyZWFtPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4gaW9zdHJlYW07Cit0eXBlZGVmIGJhc2ljX3N0cmVhbWJ1ZjxjaGFyLGNoYXJfdHJhaXRzPGNoYXI+ID4gc3RyZWFtYnVmOworCit0eXBlZGVmIGJhc2ljX3N0cmluZ2J1ZjxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiwgYWxsb2NhdG9yPGNoYXI+ID4gICAgIHN0cmluZ2J1ZjsKK3R5cGVkZWYgYmFzaWNfaXN0cmluZ3N0cmVhbTxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiwgYWxsb2NhdG9yPGNoYXI+ID4gaXN0cmluZ3N0cmVhbTsKK3R5cGVkZWYgYmFzaWNfb3N0cmluZ3N0cmVhbTxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiwgYWxsb2NhdG9yPGNoYXI+ID4gb3N0cmluZ3N0cmVhbTsKK3R5cGVkZWYgYmFzaWNfc3RyaW5nc3RyZWFtPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+LCBhbGxvY2F0b3I8Y2hhcj4gPiAgc3RyaW5nc3RyZWFtOworCit0eXBlZGVmIGJhc2ljX2ZpbGVidWY8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiAgZmlsZWJ1ZjsKK3R5cGVkZWYgYmFzaWNfaWZzdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiBpZnN0cmVhbTsKK3R5cGVkZWYgYmFzaWNfb2ZzdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiBvZnN0cmVhbTsKK3R5cGVkZWYgYmFzaWNfZnN0cmVhbTxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+ICBmc3RyZWFtOworCisjaWYgIWRlZmluZWQgKF9TVExQX05PX1dDSEFSX1QpCisvLyBUeXBlZGVmcyBmb3Igd2lkZS1jaGFyYWN0ZXIgc3RyZWFtcy4KK3R5cGVkZWYgYmFzaWNfc3RyZWFtYnVmPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4gd3N0cmVhbWJ1ZjsKK3R5cGVkZWYgYmFzaWNfaXN0cmVhbTx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+ICAgd2lzdHJlYW07Cit0eXBlZGVmIGJhc2ljX29zdHJlYW08d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPiAgIHdvc3RyZWFtOwordHlwZWRlZiBiYXNpY19pb3N0cmVhbTx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+ICB3aW9zdHJlYW07CisKK3R5cGVkZWYgYmFzaWNfc3RyaW5nYnVmPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+LCBhbGxvY2F0b3I8d2NoYXJfdD4gPiAgICAgd3N0cmluZ2J1ZjsKK3R5cGVkZWYgYmFzaWNfaXN0cmluZ3N0cmVhbTx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiwgYWxsb2NhdG9yPHdjaGFyX3Q+ID4gd2lzdHJpbmdzdHJlYW07Cit0eXBlZGVmIGJhc2ljX29zdHJpbmdzdHJlYW08d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4sIGFsbG9jYXRvcjx3Y2hhcl90PiA+IHdvc3RyaW5nc3RyZWFtOwordHlwZWRlZiBiYXNpY19zdHJpbmdzdHJlYW08d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4sIGFsbG9jYXRvcjx3Y2hhcl90PiA+ICB3c3RyaW5nc3RyZWFtOworCit0eXBlZGVmIGJhc2ljX2ZpbGVidWY8d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPiAgd2ZpbGVidWY7Cit0eXBlZGVmIGJhc2ljX2lmc3RyZWFtPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4gd2lmc3RyZWFtOwordHlwZWRlZiBiYXNpY19vZnN0cmVhbTx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+IHdvZnN0cmVhbTsKK3R5cGVkZWYgYmFzaWNfZnN0cmVhbTx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+ICB3ZnN0cmVhbTsKKyNlbmRpZgorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNlbmRpZgorCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RsL19pb3N0cmVhbV9zdHJpbmcuaCBiL3N0bHBvcnQvc3RsL19pb3N0cmVhbV9zdHJpbmcuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3RsL19pb3N0cmVhbV9zdHJpbmcuaApyZW5hbWUgdG8gc3RscG9ydC9zdGwvX2lvc3RyZWFtX3N0cmluZy5oCmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9faXN0cmVhbS5jIGIvc3RscG9ydC9zdGwvX2lzdHJlYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjMyN2IyCi0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvX2lzdHJlYW0uYwpAQCAtMCwwICsxLDE0MjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisjaWZuZGVmIF9TVExQX0lTVFJFQU1fQworI2RlZmluZSBfU1RMUF9JU1RSRUFNX0MKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9JU1RSRUFNCisjICBpbmNsdWRlIDxzdGwvX2lzdHJlYW0uaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0xJTUlUUworIyAgaW5jbHVkZSA8c3RsL19saW1pdHMuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX05VTV9HRVRfSAorIyAgaW5jbHVkZSA8c3RsL19udW1fZ2V0Lmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQgKCBfU1RMUF9ORVNURURfVFlQRV9QQVJBTV9CVUcgKQorLy8gbm8gd2NoYXJfdCBpcyBzdXBwb3J0ZWQgZm9yIHRoaXMgbW9kZQorIyAgZGVmaW5lIF9fQklTX2ludF90eXBlX18gaW50CisjICBkZWZpbmUgX19CSVNfcG9zX3R5cGVfXyBzdHJlYW1wb3MKKyMgIGRlZmluZSBfX0JJU19vZmZfdHlwZV9fIHN0cmVhbW9mZgorI2Vsc2UKKyMgIGRlZmluZSBfX0JJU19pbnRfdHlwZV9fIF9TVExQX1RZUEVOQU1FX09OX1JFVFVSTl9UWVBFIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6aW50X3R5cGUKKyMgIGRlZmluZSBfX0JJU19wb3NfdHlwZV9fIF9TVExQX1RZUEVOQU1FX09OX1JFVFVSTl9UWVBFIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6cG9zX3R5cGUKKyMgIGRlZmluZSBfX0JJU19vZmZfdHlwZV9fIF9TVExQX1RZUEVOQU1FX09OX1JFVFVSTl9UWVBFIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6b2ZmX3R5cGUKKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGdW5jdGlvbiBvYmplY3Qgc3RydWN0cyB1c2VkIGJ5IHNvbWUgbWVtYmVyIGZ1bmN0aW9ucy4KKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RyYWl0cz4KK3N0cnVjdCBfSXNfbm90X3dzcGFjZSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6Y2hhcl90eXBlIGFyZ3VtZW50X3R5cGU7CisgIHR5cGVkZWYgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdF90eXBlOworCisgIGNvbnN0IGN0eXBlPGFyZ3VtZW50X3R5cGU+KiBfTV9jdHlwZTsKKworICBfSXNfbm90X3dzcGFjZShjb25zdCBjdHlwZTxhcmd1bWVudF90eXBlPiogX19jX3R5cGUpIDogX01fY3R5cGUoX19jX3R5cGUpIHt9CisgIGJvb2wgb3BlcmF0b3IoKShhcmd1bWVudF90eXBlIF9fYykgY29uc3QKKyAgICB7IHJldHVybiAhX01fY3R5cGUtPmlzKGN0eXBlX2Jhc2U6OnNwYWNlLCBfX2MpOyB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RyYWl0cz4KK3N0cnVjdCBfSXNfd3NwYWNlX251bGwgeworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmNoYXJfdHlwZSBhcmd1bWVudF90eXBlOworICB0eXBlZGVmIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfdHlwZTsKKworICBjb25zdCBjdHlwZTxhcmd1bWVudF90eXBlPiogX01fY3R5cGU7CisKKyAgX0lzX3dzcGFjZV9udWxsKGNvbnN0IGN0eXBlPGFyZ3VtZW50X3R5cGU+KiBfX2NfdHlwZSkgOiBfTV9jdHlwZShfX2NfdHlwZSkge30KKyAgYm9vbCBvcGVyYXRvcigpKGFyZ3VtZW50X3R5cGUgX19jKSBjb25zdCB7CisgICAgcmV0dXJuIF9UcmFpdHM6OmVxKF9fYywgYXJndW1lbnRfdHlwZSgpKSB8fAorICAgICAgICAgICBfTV9jdHlwZS0+aXMoY3R5cGVfYmFzZTo6c3BhY2UsIF9fYyk7CisgIH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHJhaXRzPgorc3RydWN0IF9TY2FuX2Zvcl93c3BhY2UgeworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmNoYXJfdHlwZSAgY2hhcl90eXBlOworICB0eXBlZGVmIGNoYXJfdHlwZSogICAgICAgICAgICAgICAgICAgZmlyc3RfYXJndW1lbnRfdHlwZTsKKyAgdHlwZWRlZiBjaGFyX3R5cGUqICAgICAgICAgICAgICAgICAgIHNlY29uZF9hcmd1bWVudF90eXBlOworICB0eXBlZGVmIGNoYXJfdHlwZSogICAgICAgICAgICAgICAgICAgcmVzdWx0X3R5cGU7CisKKyAgY29uc3QgY3R5cGU8Y2hhcl90eXBlPiogX01fY3R5cGU7CisKKyAgX1NjYW5fZm9yX3dzcGFjZShjb25zdCBjdHlwZTxjaGFyX3R5cGU+KiBfX2N0eXBlKSA6IF9NX2N0eXBlKF9fY3R5cGUpIHt9CisgIGNvbnN0IGNoYXJfdHlwZSoKKyAgb3BlcmF0b3IoKShjb25zdCBjaGFyX3R5cGUqIF9fZmlyc3QsIGNvbnN0IGNoYXJfdHlwZSogX19sYXN0KSBjb25zdCB7CisgICAgcmV0dXJuIF9NX2N0eXBlLT5zY2FuX2lzKGN0eXBlX2Jhc2U6OnNwYWNlLCBfX2ZpcnN0LCBfX2xhc3QpOworICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RyYWl0cz4KK3N0cnVjdCBfU2Nhbl93c3BhY2VfbnVsbCB7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6Y2hhcl90eXBlICBjaGFyX3R5cGU7CisgIHR5cGVkZWYgY2hhcl90eXBlKiAgICAgICAgICAgICAgICAgICBmaXJzdF9hcmd1bWVudF90eXBlOworICB0eXBlZGVmIGNoYXJfdHlwZSogICAgICAgICAgICAgICAgICAgc2Vjb25kX2FyZ3VtZW50X3R5cGU7CisgIHR5cGVkZWYgY2hhcl90eXBlKiAgICAgICAgICAgICAgICAgICByZXN1bHRfdHlwZTsKKworICBjb25zdCBjdHlwZTxjaGFyX3R5cGU+KiBfTV9jdHlwZTsKKworICBfU2Nhbl93c3BhY2VfbnVsbChjb25zdCBjdHlwZTxjaGFyX3R5cGU+KiBfX2NfdHlwZSkgOiBfTV9jdHlwZShfX2NfdHlwZSkge30KKyAgY29uc3QgY2hhcl90eXBlKgorICBvcGVyYXRvcigpKGNvbnN0IGNoYXJfdHlwZSogX19maXJzdCwgY29uc3QgY2hhcl90eXBlKiBfX2xhc3QpIGNvbnN0IHsKKyAgICBfX2xhc3QgPSBmaW5kX2lmKF9fZmlyc3QsIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgIF9FcV9jaGFyX2JvdW5kPF9UcmFpdHM+KGNoYXJfdHlwZSgpKSk7CisgICAgcmV0dXJuIF9NX2N0eXBlLT5zY2FuX2lzKGN0eXBlX2Jhc2U6OnNwYWNlLCBfX2ZpcnN0LCBfX2xhc3QpOworICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RyYWl0cz4KK3N0cnVjdCBfU2Nhbl9mb3Jfbm90X3dzcGFjZSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6Y2hhcl90eXBlICBjaGFyX3R5cGU7CisgIHR5cGVkZWYgY2hhcl90eXBlKiAgICAgICAgICAgICAgICAgICBmaXJzdF9hcmd1bWVudF90eXBlOworICB0eXBlZGVmIGNoYXJfdHlwZSogICAgICAgICAgICAgICAgICAgc2Vjb25kX2FyZ3VtZW50X3R5cGU7CisgIHR5cGVkZWYgY2hhcl90eXBlKiAgICAgICAgICAgICAgICAgICByZXN1bHRfdHlwZTsKKworICBjb25zdCBjdHlwZTxjaGFyX3R5cGU+KiBfTV9jdHlwZTsKKworICBfU2Nhbl9mb3Jfbm90X3dzcGFjZShjb25zdCBjdHlwZTxjaGFyX3R5cGU+KiBfX2NfdHlwZSkgOiBfTV9jdHlwZShfX2NfdHlwZSkge30KKyAgY29uc3QgY2hhcl90eXBlKgorICBvcGVyYXRvcigpKGNvbnN0IGNoYXJfdHlwZSogX19maXJzdCwgY29uc3QgY2hhcl90eXBlKiBfX2xhc3QpIGNvbnN0IHsKKyAgICByZXR1cm4gX01fY3R5cGUtPnNjYW5fbm90KGN0eXBlX2Jhc2U6OnNwYWNlLCBfX2ZpcnN0LCBfX2xhc3QpOworICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RyYWl0cz4KK3N0cnVjdCBfU2Nhbl9mb3JfY2hhcl92YWwgeworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmNoYXJfdHlwZSBjaGFyX3R5cGU7CisgIHR5cGVkZWYgY2hhcl90eXBlKiAgICAgICAgICAgICAgICAgIGZpcnN0X2FyZ3VtZW50X3R5cGU7CisgIHR5cGVkZWYgY2hhcl90eXBlKiAgICAgICAgICAgICAgICAgIHNlY29uZF9hcmd1bWVudF90eXBlOworICB0eXBlZGVmIGNoYXJfdHlwZSogICAgICAgICAgICAgICAgICByZXN1bHRfdHlwZTsKKworICBjaGFyX3R5cGUgX01fdmFsOworCisgIF9TY2FuX2Zvcl9jaGFyX3ZhbChjaGFyX3R5cGUgX192YWwpIDogX01fdmFsKF9fdmFsKSB7fQorCisgIGNvbnN0IGNoYXJfdHlwZSoKKyAgb3BlcmF0b3IoKShjb25zdCBjaGFyX3R5cGUqIF9fZmlyc3QsIGNvbnN0IGNoYXJfdHlwZSogX19sYXN0KSBjb25zdCB7CisgICAgcmV0dXJuIGZpbmRfaWYoX19maXJzdCwgX19sYXN0LCBfRXFfY2hhcl9ib3VuZDxfVHJhaXRzPihfTV92YWwpKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcmFpdHM+CitzdHJ1Y3QgX1NjYW5fZm9yX2ludF92YWwgeworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmNoYXJfdHlwZSBjaGFyX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6aW50X3R5cGUgIGludF90eXBlOworICB0eXBlZGVmIGNoYXJfdHlwZSogICAgICAgICAgICAgICAgICBmaXJzdF9hcmd1bWVudF90eXBlOworICB0eXBlZGVmIGNoYXJfdHlwZSogICAgICAgICAgICAgICAgICBzZWNvbmRfYXJndW1lbnRfdHlwZTsKKyAgdHlwZWRlZiBjaGFyX3R5cGUqICAgICAgICAgICAgICAgICAgcmVzdWx0X3R5cGU7CisKKyAgaW50X3R5cGUgX01fdmFsOworCisgIF9TY2FuX2Zvcl9pbnRfdmFsKGludF90eXBlIF9fdmFsKSA6IF9NX3ZhbChfX3ZhbCkge30KKworICBjb25zdCBjaGFyX3R5cGUqCisgIG9wZXJhdG9yKCkoY29uc3QgY2hhcl90eXBlKiBfX2ZpcnN0LCBjb25zdCBjaGFyX3R5cGUqIF9fbGFzdCkgY29uc3QgeworICAgIHJldHVybiBmaW5kX2lmKF9fZmlyc3QsIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICBfRXFfaW50X2JvdW5kPF9UcmFpdHM+KF9NX3ZhbCkpOworICB9Cit9OworCisvLyBIZWxwZXIgZnVuY3Rpb246IHRyeSB0byBwdXNoIGJhY2sgYSBjaGFyYWN0ZXIgdG8gYSBzdHJlYW1idWYsCisvLyByZXR1cm4gdHJ1ZSBpZiB0aGUgcHVzaGJhY2sgc3VjY2VlZGVkLiAgRG9lcyBub3QgdGhyb3cuCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Citib29sIF9TVExQX0NBTEwKK19fcHVzaGJhY2soYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fYnVmLCBfQ2hhclQgX19jKSB7CisgIGJvb2wgcmV0OworICBfU1RMUF9UUlkgeworICAgIGNvbnN0IHR5cGVuYW1lIF9UcmFpdHM6OmludF90eXBlIF9fZW9mID0gX1RyYWl0czo6ZW9mKCk7CisgICAgcmV0ID0gIV9UcmFpdHM6OmVxX2ludF90eXBlKF9fYnVmLT5zcHV0YmFja2MoX19jKSwgX19lb2YpOworICB9CisgIF9TVExQX0NBVENIX0FMTCB7CisgICAgcmV0ID0gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEZWZpbml0aW9ucyBvZiBiYXNpY19pc3RyZWFtPD4ncyBub25pbmxpbmUgbWVtYmVyIGZ1bmN0aW9ucy4KKworLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBmb3JtYXR0ZWQgaW5wdXQgb2YgbnVtYmVycy4KK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9OdW1iZXI+Citpb3NfYmFzZTo6aW9zdGF0ZSBfU1RMUF9DQUxMCitfX2dldF9udW0oYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX3RoYXQsIF9OdW1iZXImIF9fdmFsKSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpzZW50cnkgX1NlbnRyeTsKKyAgaW9zX2Jhc2U6Omlvc3RhdGUgX19lcnIgPSAwOworICBfU2VudHJ5IF9fc2VudHJ5KCBfX3RoYXQgKTsgICAgIC8vIFNraXAgd2hpdGVzcGFjZS4KKyAgaWYgKF9fc2VudHJ5KSB7CisgICAgdHlwZWRlZiBudW1fZ2V0PF9DaGFyVCwgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQsIF9UcmFpdHM+ID4gX051bV9nZXQ7CisgICAgX1NUTFBfVFJZIHsKKyAgICAgIC8vIERvIG5vdCByZW1vdmUgYWRkaXRpb25hbCBwYXJlbnRoZXNpcyBhcm91bmQgdXNlX2ZhY2V0IGluc3RhbmNpYXRpb24sIHNvbWUgY29tcGlsZXJzIChWQzYpCisgICAgICAvLyByZXF1aXJlIGl0IHdoZW4gYnVpbGRpbmcgdGhlIGxpYnJhcnkuCisgICAgICAodXNlX2ZhY2V0PF9OdW1fZ2V0PihfX3RoYXQuZ2V0bG9jKCkpKS5nZXQoaXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQsIF9UcmFpdHM+KF9fdGhhdC5yZGJ1ZigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgX190aGF0LCBfX2VyciwgX192YWwpOworICAgIH0KKyAgICBfU1RMUF9DQVRDSF9BTEwgeworICAgICAgX190aGF0Ll9NX2hhbmRsZV9leGNlcHRpb24oaW9zX2Jhc2U6OmJhZGJpdCk7CisgICAgfQorICAgIGlmIChfX2VycikgX190aGF0LnNldHN0YXRlKF9fZXJyKTsKKyAgfQorICByZXR1cm4gX19lcnI7Cit9CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Om9wZXJhdG9yPj4gKHNob3J0JiBfX3ZhbCkgeworICBsb25nIF9fbHZhbDsKKyAgX1NUTFBfUFJJViBfX2dldF9udW0oKnRoaXMsIF9fbHZhbCk7CisgIGlmICggdGhpcy0+ZmFpbCgpICkgeworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBzaG9ydCBfX3RtcCA9IF9fU1RBVElDX0NBU1Qoc2hvcnQsIF9fbHZhbCk7CisgIHVuc2lnbmVkIHNob3J0IF9fdXZhbCA9IF9fU1RBVElDX0NBU1QodW5zaWduZWQgc2hvcnQsIF9fbHZhbCk7CisgIC8vIGNoZWNrIGlmIHdlIGxvc2UgZGlnaXRzCisgIC8vICAgIGlmICgoX192YWwgIT0gX19sdmFsKSAmJiAoKHVuc2lnbmVkIHNob3J0KV9fdmFsICE9IF9fbHZhbCkpCisgIGlmICgoX190bXAgIT0gX19sdmFsKSAmJiAoKGxvbmcpX191dmFsICE9IF9fbHZhbCkpCisgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworICBlbHNlCisgICAgX192YWwgPSBfX3RtcDsKKyAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Om9wZXJhdG9yPj4gKGludCYgX192YWwpIHsKKyAgbG9uZyBfX2x2YWw7CisgIF9TVExQX1BSSVYgX19nZXRfbnVtKCp0aGlzLCBfX2x2YWwpOworICBpZiAoIHRoaXMtPmZhaWwoKSApIHsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgaW50IF9fdG1wID0gX19sdmFsOworICB1bnNpZ25lZCBpbnQgX191dmFsID0gX19sdmFsOworICAvLyBjaGVjayBpZiB3ZSBsb3NlIGRpZ2l0cworICAvLyAgICBpZiAoKF9fdmFsICE9IF9fbHZhbCkgJiYgKCh1bnNpZ25lZCBpbnQpX192YWwgIT0gX19sdmFsKSkKKyAgaWYgKChfX3RtcCAhPSBfX2x2YWwpICYmICgobG9uZylfX3V2YWwgIT0gX19sdmFsKSkKKyAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7CisgIGVsc2UKKyAgICBfX3ZhbCA9IF9fdG1wOworICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6b3BlcmF0b3I+PiAodW5zaWduZWQgc2hvcnQmIF9fdmFsKSB7CisgIF9TVExQX1BSSVYgX19nZXRfbnVtKCp0aGlzLCBfX3ZhbCk7CisgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpvcGVyYXRvcj4+ICh1bnNpZ25lZCBpbnQmIF9fdmFsKSB7CisgIF9TVExQX1BSSVYgX19nZXRfbnVtKCp0aGlzLCBfX3ZhbCk7CisgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpvcGVyYXRvcj4+IChsb25nJiBfX3ZhbCkgeworICBfU1RMUF9QUklWIF9fZ2V0X251bSgqdGhpcywgX192YWwpOworICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6b3BlcmF0b3I+PiAodW5zaWduZWQgbG9uZyYgX192YWwpIHsKKyAgX1NUTFBfUFJJViBfX2dldF9udW0oKnRoaXMsIF9fdmFsKTsKKyAgcmV0dXJuICp0aGlzOworfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfTE9OR19MT05HKQordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpvcGVyYXRvcj4+IChfU1RMUF9MT05HX0xPTkcmIF9fdmFsKSB7CisgIF9TVExQX1BSSVYgX19nZXRfbnVtKCp0aGlzLCBfX3ZhbCk7CisgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpvcGVyYXRvcj4+ICh1bnNpZ25lZCBfU1RMUF9MT05HX0xPTkcmIF9fdmFsKSB7CisgIF9TVExQX1BSSVYgX19nZXRfbnVtKCp0aGlzLCBfX3ZhbCk7CisgIHJldHVybiAqdGhpczsKK30KKyNlbmRpZgordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpvcGVyYXRvcj4+IChmbG9hdCYgX192YWwpIHsKKyAgX1NUTFBfUFJJViBfX2dldF9udW0oKnRoaXMsIF9fdmFsKTsKKyAgcmV0dXJuICp0aGlzOworfQordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpvcGVyYXRvcj4+IChkb3VibGUmIF9fdmFsKSB7CisgIF9TVExQX1BSSVYgX19nZXRfbnVtKCp0aGlzLCBfX3ZhbCk7CisgIHJldHVybiAqdGhpczsKK30KKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTE9OR19ET1VCTEUpCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Om9wZXJhdG9yPj4gKGxvbmcgZG91YmxlJiBfX3ZhbCkgeworICBfU1RMUF9QUklWIF9fZ2V0X251bSgqdGhpcywgX192YWwpOworICByZXR1cm4gKnRoaXM7Cit9CisjZW5kaWYKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fQk9PTCkKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6b3BlcmF0b3I+PiAoYm9vbCYgX192YWwpIHsKKyAgX1NUTFBfUFJJViBfX2dldF9udW0oKnRoaXMsIF9fdmFsKTsKKyAgcmV0dXJuICp0aGlzOworfQorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6b3BlcmF0b3I+PiAodm9pZComIF9fdmFsKSB7CisgIF9TVExQX1BSSVYgX19nZXRfbnVtKCp0aGlzLCBfX3ZhbCk7CisgIHJldHVybiAqdGhpczsKK30KKworLy8gVW5mb3JtYXR0ZWQgaW5wdXQKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK19fQklTX2ludF90eXBlX18KK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6cGVlaygpIHsKKyAgdHlwZW5hbWUgX1RyYWl0czo6aW50X3R5cGUgX190bXAgPSBfVHJhaXRzOjplb2YoKTsKKworICB0aGlzLT5fTV9nY291bnQgPSAwOworICBzZW50cnkgX19zZW50cnkoKnRoaXMsIF9Ob19Ta2lwX1dTKCkpOworCisgIGlmIChfX3NlbnRyeSkgeworICAgIF9TVExQX1RSWSB7CisgICAgICBfX3RtcCA9IHRoaXMtPnJkYnVmKCktPnNnZXRjKCk7CisgICAgfQorICAgIF9TVExQX0NBVENIX0FMTCB7CisgICAgICB0aGlzLT5fTV9oYW5kbGVfZXhjZXB0aW9uKGlvc19iYXNlOjpiYWRiaXQpOworICAgIH0KKyAgICBpZiAodGhpcy0+X1NfZW9mKF9fdG1wKSkKKyAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjplb2ZiaXQpOworICB9CisKKyAgcmV0dXJuIF9fdG1wOworfQorCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitfX0JJU19pbnRfdHlwZV9fCitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OmdldCgpIHsKKyAgdHlwZW5hbWUgX1RyYWl0czo6aW50X3R5cGUgX190bXAgPSBfVHJhaXRzOjplb2YoKTsKKyAgc2VudHJ5IF9fc2VudHJ5KCp0aGlzLCBfTm9fU2tpcF9XUygpKTsKKyAgdGhpcy0+X01fZ2NvdW50ID0gMDsKKworICBpZiAoX19zZW50cnkpIHsKKyAgICBfU1RMUF9UUlkgeworICAgICAgX190bXAgPSB0aGlzLT5yZGJ1ZigpLT5zYnVtcGMoKTsKKyAgICB9CisgICAgX1NUTFBfQ0FUQ0hfQUxMIHsKKyAgICAgIHRoaXMtPl9NX2hhbmRsZV9leGNlcHRpb24oaW9zX2Jhc2U6OmJhZGJpdCk7CisgICAgfQorCisgICAgaWYgKCF0aGlzLT5fU19lb2YoX190bXApKQorICAgICAgdGhpcy0+X01fZ2NvdW50ID0gMTsKKyAgfQorCisgIGlmIChfTV9nY291bnQgPT0gMCkKKyAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZW9mYml0IHwgaW9zX2Jhc2U6OmZhaWxiaXQpOworCisgIHJldHVybiBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6Z2V0KF9DaGFyVCYgX19jKSB7CisgIHNlbnRyeSBfX3NlbnRyeSgqdGhpcywgX05vX1NraXBfV1MoKSk7CisgIHRoaXMtPl9NX2djb3VudCA9IDA7CisKKyAgaWYgKF9fc2VudHJ5KSB7CisgICAgdHlwZW5hbWUgX1RyYWl0czo6aW50X3R5cGUgX190bXAgPSBfVHJhaXRzOjplb2YoKTsKKyAgICBfU1RMUF9UUlkgeworICAgICAgX190bXAgPSB0aGlzLT5yZGJ1ZigpLT5zYnVtcGMoKTsKKyAgICB9CisgICAgX1NUTFBfQ0FUQ0hfQUxMIHsKKyAgICAgIHRoaXMtPl9NX2hhbmRsZV9leGNlcHRpb24oaW9zX2Jhc2U6OmJhZGJpdCk7CisgICAgfQorCisgICAgaWYgKCF0aGlzLT5fU19lb2YoX190bXApKSB7CisgICAgICB0aGlzLT5fTV9nY291bnQgPSAxOworICAgICAgX19jID0gX1RyYWl0czo6dG9fY2hhcl90eXBlKF9fdG1wKTsKKyAgICB9CisgIH0KKworICBpZiAodGhpcy0+X01fZ2NvdW50ID09IDApCisgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmVvZmJpdCB8IGlvc19iYXNlOjpmYWlsYml0KTsKKworICByZXR1cm4gKnRoaXM7Cit9CisKKworLy8gUmVhZCBjaGFyYWN0ZXJzIGFuZCBkaXNjYXJkIHRoZW0uICBUaGUgc3RhbmRhcmQgc3BlY2lmaWVzIGEgc2luZ2xlCisvLyBmdW5jdGlvbiB3aXRoIHR3byBhcmd1bWVudHMsIGVhY2ggd2l0aCBhIGRlZmF1bHQuICBXZSBpbnN0ZWFkIHVzZQorLy8gdGhyZWUgb3ZlcmxvZGVkIGZ1bmN0aW9ucywgYmVjYXVzZSBpdCdzIHBvc3NpYmxlIHRvIGltcGxlbWVudCB0aGUKKy8vIGZpcnN0IHR3byBtb3JlIGVmZmljaWVudGx5IHRoYW4gdGhlIGZ1bGx5IGdlbmVyYWwgdGhpcmQgdmVyc2lvbi4KK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6aWdub3JlKCkgeworICBzZW50cnkgX19zZW50cnkoKnRoaXMsIF9Ob19Ta2lwX1dTKCkpOworICB0aGlzLT5fTV9nY291bnQgPSAwOworCisgIGlmIChfX3NlbnRyeSkgeworICAgIGludF90eXBlIF9fYzsKKyAgICBfU1RMUF9UUlkgeworICAgICAgX19jID0gdGhpcy0+cmRidWYoKS0+c2J1bXBjKCk7CisgICAgfQorICAgIF9TVExQX0NBVENIX0FMTCB7CisgICAgICB0aGlzLT5fTV9oYW5kbGVfZXhjZXB0aW9uKGlvc19iYXNlOjpiYWRiaXQpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGlmICghdGhpcy0+X1NfZW9mKF9fYykpCisgICAgICB0aGlzLT5fTV9nY291bnQgPSAxOworICAgIGVsc2UKKyAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjplb2ZiaXQpOworICB9CisKKyAgcmV0dXJuICp0aGlzOworfQorCisvLyBQdXRiYWNrCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OnB1dGJhY2soX0NoYXJUIF9fYykgeworICB0aGlzLT5fTV9nY291bnQgPSAwOworICBzZW50cnkgX19zZW50cnkoKnRoaXMsIF9Ob19Ta2lwX1dTKCkpOworCisgIGlmIChfX3NlbnRyeSkgeworICAgIHR5cGVuYW1lIF9UcmFpdHM6OmludF90eXBlIF9fdG1wID0gX1RyYWl0czo6ZW9mKCk7CisgICAgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fYnVmID0gdGhpcy0+cmRidWYoKTsKKy8vICAgIGlmICghX19idWYgfHwgdGhpcy0+X1NfZW9mKF9fYnVmLT5zcHV0YmFja2MoX19jKSkpCisgICAgaWYgKF9fYnVmKSB7CisgICAgICBfU1RMUF9UUlkgeworICAgICAgICBfX3RtcCA9IF9fYnVmLT5zcHV0YmFja2MoX19jKTsKKyAgICAgIH0KKyAgICAgIF9TVExQX0NBVENIX0FMTCB7CisgICAgICAgIHRoaXMtPl9NX2hhbmRsZV9leGNlcHRpb24oaW9zX2Jhc2U6OmJhZGJpdCk7CisgICAgICB9CisgICAgfQorICAgIGlmICh0aGlzLT5fU19lb2YoX190bXApKQorICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CisgIH0KKyAgZWxzZQorICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKKworICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6dW5nZXQoKSB7CisgIHRoaXMtPl9NX2djb3VudCA9IDA7CisKKyAgc2VudHJ5IF9fc2VudHJ5KCp0aGlzLCBfTm9fU2tpcF9XUygpKTsKKworICBpZiAoX19zZW50cnkpIHsKKyAgICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19idWYgPSB0aGlzLT5yZGJ1ZigpOworICAgIC8vICAgICBpZiAoIV9fYnVmIHx8IF9UcmFpdHM6OmVxX2ludF90eXBlKF9fYnVmLT5zdW5nZXRjKCksIF9UcmFpdHM6OmVvZigpKSkKKyAgICBpZiAoX19idWYpIHsKKyAgICAgIF9TVExQX1RSWSB7CisgICAgICAgIGlmICh0aGlzLT5fU19lb2YoX19idWYtPnN1bmdldGMoKSkpCisgICAgICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CisgICAgICB9CisgICAgICBfU1RMUF9DQVRDSF9BTEwgeworICAgICAgICB0aGlzLT5fTV9oYW5kbGVfZXhjZXB0aW9uKGlvc19iYXNlOjpiYWRiaXQpOworICAgICAgfQorICAgIH0gZWxzZQorICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CisgIH0KKyAgZWxzZQorICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKKworICByZXR1cm4gKnRoaXM7Cit9CisKKy8vIFBvc2l0aW9uaW5nIGFuZCBidWZmZXIgY29udHJvbC4KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2ludCBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OnN5bmMoKSB7CisgIHNlbnRyeSBfX3NlbnRyeSgqdGhpcywgX05vX1NraXBfV1MoKSk7CisKKyAgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fYnVmID0gdGhpcy0+cmRidWYoKTsKKyAgaWYgKF9fYnVmKSB7CisgICAgaWYgKF9fYnVmLT5wdWJzeW5jKCkgPT0gLTEpIHsKKyAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBlbHNlCisgICAgICByZXR1cm4gMDsKKyAgfQorICBlbHNlCisgICAgcmV0dXJuIC0xOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorX19CSVNfcG9zX3R5cGVfXworYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Ojp0ZWxsZygpIHsKKyAgc2VudHJ5IF9fc2VudHJ5KCp0aGlzLCBfTm9fU2tpcF9XUygpKTsKKworICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19idWYgPSB0aGlzLT5yZGJ1ZigpOworICByZXR1cm4gKF9fYnVmICYmICF0aGlzLT5mYWlsKCkpID8gX19idWYtPnB1YnNlZWtvZmYoMCwgaW9zX2Jhc2U6OmN1ciwgaW9zX2Jhc2U6OmluKQorICAgIDogcG9zX3R5cGUoLTEpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpzZWVrZyhwb3NfdHlwZSBfX3BvcykgeworICBzZW50cnkgX19zZW50cnkoKnRoaXMsIF9Ob19Ta2lwX1dTKCkpOworCisgIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX2J1ZiA9IHRoaXMtPnJkYnVmKCk7CisgIGlmICghdGhpcy0+ZmFpbCgpICYmIF9fYnVmKSB7CisgICAgaWYgKF9fYnVmLT5wdWJzZWVrcG9zKF9fcG9zLCBpb3NfYmFzZTo6aW4pID09IHBvc190eXBlKC0xKSkgeworICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworICAgIH0KKyAgfQorICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OnNlZWtnKG9mZl90eXBlIF9fb2ZmLCBpb3NfYmFzZTo6c2Vla2RpciBfX2RpcikgeworICBzZW50cnkgX19zZW50cnkoKnRoaXMsIF9Ob19Ta2lwX1dTKCkpOworCisgIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX2J1ZiA9IHRoaXMtPnJkYnVmKCk7CisgIGlmICghdGhpcy0+ZmFpbCgpICYmIF9fYnVmKQorICAgIF9fYnVmLT5wdWJzZWVrb2ZmKF9fb2ZmLCBfX2RpciwgaW9zX2Jhc2U6OmluKTsKKyAgcmV0dXJuICp0aGlzOworfQorCisvLyBGb3JtYXR0ZWQgaW5wdXQgb2YgY2hhcmFjdGVycyBhbmQgY2hhcmFjdGVyIGFycmF5cy4KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK3ZvaWQgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpfTV9mb3JtYXR0ZWRfZ2V0KF9DaGFyVCYgX19jKSB7CisvLyAgdHlwZW5hbWUgX1RyYWl0czo6aW50X3R5cGUgX190bXAgPSBfVHJhaXRzOjplb2YoKTsKKworICBzZW50cnkgX19zZW50cnkoKnRoaXMpOyAvLyBTa2lwIHdoaXRlc3BhY2UuCisKKyAgaWYgKF9fc2VudHJ5KSB7CisgICAgdHlwZW5hbWUgX1RyYWl0czo6aW50X3R5cGUgX190bXA7Ly8gPSBfVHJhaXRzOjplb2YoKTsKKworICAgIF9TVExQX1RSWSB7CisgICAgICBfX3RtcCA9IHRoaXMtPnJkYnVmKCktPnNidW1wYygpOworICAgIH0KKyAgICBfU1RMUF9DQVRDSF9BTEwgeworICAgICAgdGhpcy0+X01faGFuZGxlX2V4Y2VwdGlvbihpb3NfYmFzZTo6YmFkYml0KTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIXRoaXMtPl9TX2VvZihfX3RtcCkpCisgICAgICBfX2MgPSBfVHJhaXRzOjp0b19jaGFyX3R5cGUoX190bXApOworICAgIGVsc2UKKyAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjplb2ZiaXQgfCBpb3NfYmFzZTo6ZmFpbGJpdCk7CisgIH0KK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gaXN0cmVhbSdzIGhlbHBlciBmdW5jdGlvbnMuCisKKy8vIEEgZ2VuZXJpYyBmdW5jdGlvbiBmb3IgdW5idWZmZXJlZCBpbnB1dC4gIFdlIHN0b3Agd2hlbiB3ZSByZWFjaCBFT0YsCisvLyBvciB3aGVuIHdlIGhhdmUgZXh0cmFjdGVkIF9OdW0gY2hhcmFjdGVycywgb3Igd2hlbiB0aGUgZnVuY3Rpb24gb2JqZWN0CisvLyBfX2lzX2RlbGltIHJldHVybiB0cnVlLiAgSW4gdGhlIGxhc3QgY2FzZSwgaXQgZXh0cmFjdHMgdGhlIGNoYXJhY3RlcgorLy8gZm9yIHdoaWNoIF9faXNfZGVsaW0gaXMgdHJ1ZSwgaWYgYW5kIG9ubHkgaWYgX19leHRyYWN0X2RlbGltIGlzIHRydWUuCisvLyBJdCBhcHBlbmRzIGEgbnVsbCBjaGFyYWN0ZXIgdG8gdGhlIGVuZCBvZiB0aGUgc3RyaW5nOyB0aGlzIG1lYW5zIHRoYXQKKy8vIGl0IG1heSBzdG9yZSB1cCB0byBfTnVtICsgMSBjaGFyYWN0ZXJzLgorLy8KKy8vIF9faXNfZ2V0bGluZSBnb3Zlcm5zIHR3byBjb3JuZXIgY2FzZXM6IHJlYWRpbmcgX051bSBjaGFyYWN0ZXJzIHdpdGhvdXQKKy8vIGVuY291bnRlcmluZyBkZWxpbSBvciBlb2YgKGluIHdoaWNoIGNhc2UgZmFpbGJpdCBpcyBzZXQgaWYgX19pc19nZXRsaW5lCisvLyBpcyB0cnVlKTsgYW5kIHJlYWRpbmcgX051bSBjaGFyYWN0ZXJzIHdoZXJlIHRoZSBfTnVtKzEnc3QgY2hhcmFjdGVyIGlzCisvLyBlb2YgKGluIHdoaWNoIGNhc2UgZW9mYml0IGlzIHNldCBpZiBfX2lzX2dldGxpbmUgaXMgdHJ1ZSkuCisvLworLy8gSXQgaXMgYXNzdW1lZCB0aGF0IF9faXNfZGVsaW0gbmV2ZXIgdGhyb3dzLgorLy8KKy8vIFJldHVybiB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZXh0cmFjdGVkLCBpbmNsdWRpbmcgdGhlCisvLyBkZWxpbWl0ZXIgaWYgaXQgaXMgZXh0cmFjdGVkLiAgTm90ZSB0aGF0IHRoZSBudW1iZXIgb2YgY2hhcmFjYXRlcnMKKy8vIGV4dHJhY3RlZCBpc24ndCBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIHN0b3JlZC4KKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8IGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0lzX0RlbGltPgorc3RyZWFtc2l6ZSBfU1RMUF9DQUxMCitfX3JlYWRfdW5idWZmZXJlZChiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4qIF9fdGhhdCwgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fYnVmLAorICAgICAgICAgICAgICAgICAgc3RyZWFtc2l6ZSBfTnVtLCBfQ2hhclQqIF9fcywKKyAgICAgICAgICAgICAgICAgIF9Jc19EZWxpbSBfX2lzX2RlbGltLAorICAgICAgICAgICAgICAgICAgYm9vbCBfX2V4dHJhY3RfZGVsaW0sIGJvb2wgX19hcHBlbmRfbnVsbCwKKyAgICAgICAgICAgICAgICAgIGJvb2wgX19pc19nZXRsaW5lKQoreworICBzdHJlYW1zaXplIF9fbiA9IDA7CisgIGlvc19iYXNlOjppb3N0YXRlIF9fc3RhdHVzID0gMDsKKworICB0eXBlZGVmIHR5cGVuYW1lIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6aW50X3R5cGUgaW50X3R5cGU7CisgIC8vIFRoZSBvcGVyYXRpb25zIHRoYXQgY2FuIHBvdGVudGlhbGx5IHRocm93IGFyZSBzYnVtcGMsIHNuZXh0YywgYW5kIHNnZXRjLgorICBfU1RMUF9UUlkgeworICAgIGZvciAoOzspIHsKKyAgICAgIGlmIChfX24gPT0gX051bSkgeworICAgICAgICBpZiAoX19pc19nZXRsaW5lKSAvLyBkaWRuJ3QgZmluZCBkZWxpbWl0ZXIgYXMgb25lIG9mIHRoZSBfTnVtIGNoYXJzCisgICAgICAgICAgX19zdGF0dXMgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaW50X3R5cGUgX19jID0gX19idWYtPnNidW1wYygpOyAvLyBzc2Nod2FyegorCisgICAgICBpZiAoX190aGF0LT5fU19lb2YoX19jKSkgeworICAgICAgICBpZiAoX19uIDwgX051bSB8fCBfX2lzX2dldGxpbmUpCisgICAgICAgICAgX19zdGF0dXMgfD0gaW9zX2Jhc2U6OmVvZmJpdDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9IGVsc2UgaWYgKF9faXNfZGVsaW0oX1RyYWl0czo6dG9fY2hhcl90eXBlKF9fYykpKSB7CisgICAgICAgIGlmIChfX2V4dHJhY3RfZGVsaW0pIHsgLy8gRXh0cmFjdCBhbmQgZGlzY2FyZCBjdXJyZW50IGNoYXJhY3Rlci4KKyAgICAgICAgICArK19fbjsKKyAgICAgICAgfSBlbHNlIGlmICggIV9fcHVzaGJhY2soX19idWYsIF9UcmFpdHM6OnRvX2NoYXJfdHlwZShfX2MpKSApIHsgLy8gbGVhdmUgZGVsaW1pdGVyCisgICAgICAgICAgX19zdGF0dXMgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAvLyByZWd1bGFyIGNoYXJhY3RlcgorICAgICAgKl9fcysrID0gX1RyYWl0czo6dG9fY2hhcl90eXBlKF9fYyk7CisgICAgICArK19fbjsKKyAgICB9CisgIH0KKyAgX1NUTFBfQ0FUQ0hfQUxMIHsKKyAgICBfX3RoYXQtPl9NX2hhbmRsZV9leGNlcHRpb24oaW9zX2Jhc2U6OmJhZGJpdCk7CisgICAgKl9fcyA9IF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQoX0NoYXJUKTsKKyAgICByZXR1cm4gX19uOworICB9CisKKyAgaWYgKF9fYXBwZW5kX251bGwpCisgICAgKl9fcyA9ICBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKF9DaGFyVCk7CisgIGlmIChfX3N0YXR1cykKKyAgICBfX3RoYXQtPnNldHN0YXRlKF9fc3RhdHVzKTsgICAgLy8gVGhpcyBtaWdodCB0aHJvdy4KKyAgcmV0dXJuIF9fbjsKK30KKworLy8gTXVjaCBsaWtlIF9fcmVhZF91bmJ1ZmZlcmVkLCBidXQgd2l0aCBvbmUgYWRkaXRpb25hbCBmdW5jdGlvbiBvYmplY3Q6CisvLyBfX3NjYW5fZGVsaW0oZmlyc3QsIGxhc3QpIHJldHVybnMgdGhlIGZpcnN0IHBvaW50ZXIgcCBpbiBbZmlyc3QsIGxhc3QpCisvLyBzdWNoIHRoYXQgX19pc19kZWxpbShwKSBpcyB0cnVlLgorCit0ZW1wbGF0ZSA8IGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0lzX0RlbGltLCBjbGFzcyBfU2Nhbl9EZWxpbT4KK3N0cmVhbXNpemUgX1NUTFBfQ0FMTAorX19yZWFkX2J1ZmZlcmVkKGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiogX190aGF0LCBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19idWYsCisgICAgICAgICAgICAgICAgIHN0cmVhbXNpemUgX051bSwgX0NoYXJUKiBfX3MsCisgICAgICAgICAgICAgICAgIF9Jc19EZWxpbSBfX2lzX2RlbGltLCBfU2Nhbl9EZWxpbSBfX3NjYW5fZGVsaW0sCisgICAgICAgICAgICAgICAgIGJvb2wgX19leHRyYWN0X2RlbGltLCBib29sIF9fYXBwZW5kX251bGwsCisgICAgICAgICAgICAgICAgIGJvb2wgX19pc19nZXRsaW5lKSB7CisgIHN0cmVhbXNpemUgX19uID0gMDsKKyAgaW9zX2Jhc2U6Omlvc3RhdGUgX19zdGF0dXMgPSAwOworICBib29sIF9fZG9uZSAgICA9IGZhbHNlOworCisgIF9TVExQX1RSWSB7CisgICAgd2hpbGUgKF9fYnVmLT5fTV9lZ3B0cigpICE9IF9fYnVmLT5fTV9ncHRyKCkgJiYgIV9fZG9uZSkgeworICAgICAgY29uc3QgX0NoYXJUKiBfX2ZpcnN0ID0gX19idWYtPl9NX2dwdHIoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCogX19sYXN0ICA9IF9fYnVmLT5fTV9lZ3B0cigpOworICAgICAgLy9jYXN0aW5nIG51bWVyaWNfbGltaXRzPHB0cmRpZmZfdD46Om1heCB0byBzdHJlYW1zaXplIG9ubHkgd29ya3MgaXMgcHRyZGlmZl90IGlzIHNpZ25lZCBvciBzdHJlYW1zaXplIHJlcHJlc2VudGF0aW9uCisgICAgICAvL2lzIGxhcmdlciB0aGFuIHB0cmRpZmZfdCBvbmUuCisgICAgICBfU1RMUF9TVEFUSUNfQVNTRVJUKChzaXplb2Yoc3RyZWFtc2l6ZSkgPiBzaXplb2YocHRyZGlmZl90KSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKChzaXplb2Yoc3RyZWFtc2l6ZSkgPT0gc2l6ZW9mKHB0cmRpZmZfdCkpICYmIG51bWVyaWNfbGltaXRzPHB0cmRpZmZfdD46OmlzX3NpZ25lZCkpCisgICAgICBwdHJkaWZmX3QgX19yZXF1ZXN0ID0gX19TVEFUSUNfQ0FTVChwdHJkaWZmX3QsIChtaW4pIChfX1NUQVRJQ19DQVNUKHN0cmVhbXNpemUsIChudW1lcmljX2xpbWl0czxwdHJkaWZmX3Q+OjptYXgpKCkpLCBfTnVtIC0gX19uKSk7CisKKyAgICAgIGNvbnN0IF9DaGFyVCogX19wICA9IF9fc2Nhbl9kZWxpbShfX2ZpcnN0LCBfX2xhc3QpOworICAgICAgcHRyZGlmZl90IF9fY2h1bmsgPSAobWluKSAocHRyZGlmZl90KF9fcCAtIF9fZmlyc3QpLCBfX3JlcXVlc3QpOworICAgICAgX1RyYWl0czo6Y29weShfX3MsIF9fZmlyc3QsIF9fY2h1bmspOworICAgICAgX19zICs9IF9fY2h1bms7CisgICAgICBfX24gKz0gX19jaHVuazsKKyAgICAgIF9fYnVmLT5fTV9nYnVtcCgoaW50KV9fY2h1bmspOworCisgICAgICAvLyBXZSB0ZXJtaW5hdGVkIGJ5IGZpbmRpbmcgZGVsaW0uCisgICAgICBpZiAoX19wICE9IF9fbGFzdCAmJiBfX3AgLSBfX2ZpcnN0IDw9IF9fcmVxdWVzdCkgeworICAgICAgICBpZiAoX19leHRyYWN0X2RlbGltKSB7CisgICAgICAgICAgX19uICs9IDE7CisgICAgICAgICAgX19idWYtPl9NX2didW1wKDEpOworICAgICAgICB9CisgICAgICAgIF9fZG9uZSA9IHRydWU7CisgICAgICB9CisKKyAgICAgIC8vIFdlIHRlcm1pbmF0ZWQgYnkgcmVhZGluZyBhbGwgdGhlIGNoYXJhY3RlcnMgd2Ugd2VyZSBhc2tlZCBmb3IuCisgICAgICBlbHNlIGlmIChfX24gPT0gX051bSkgeworCisgICAgICAgIC8vIEZpbmQgb3V0IGlmIHdlIGhhdmUgcmVhY2hlZCBlb2YuICBUaGlzIG1hdHRlcnMgZm9yIGdldGxpbmUuCisgICAgICAgIGlmIChfX2lzX2dldGxpbmUpIHsKKyAgICAgICAgICBpZiAoX19jaHVuayA9PSBfX2xhc3QgLSBfX2ZpcnN0KSB7CisgICAgICAgICAgICBpZiAoX190aGF0LT5fU19lb2YoX19idWYtPnNnZXRjKCkpKQorICAgICAgICAgICAgICBfX3N0YXR1cyB8PSBpb3NfYmFzZTo6ZW9mYml0OworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBfX3N0YXR1cyB8PSBpb3NfYmFzZTo6ZmFpbGJpdDsKKyAgICAgICAgfQorICAgICAgICBfX2RvbmUgICA9IHRydWU7CisgICAgICB9CisKKyAgICAgIC8vIFRoZSBidWZmZXIgY29udGFpbmVkIGZld2VyIHRoYW4gX051bSAtIF9fbiBjaGFyYWN0ZXJzLiAgRWl0aGVyIHdlJ3JlCisgICAgICAvLyBhdCBlb2YsIG9yIHdlIHNob3VsZCByZWZpbGwgdGhlIGJ1ZmZlciBhbmQgdHJ5IGFnYWluLgorICAgICAgZWxzZSB7CisgICAgICAgIGlmIChfX3RoYXQtPl9TX2VvZihfX2J1Zi0+c2dldGMoKSkpIHsKKyAgICAgICAgICBfX3N0YXR1cyB8PSBpb3NfYmFzZTo6ZW9mYml0OworICAgICAgICAgIF9fZG9uZSA9IHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IC8vIENsb3NlIHRoZSB3aGlsZSBsb29wLgorICB9CisgIF9TVExQX0NBVENIX0FMTCB7CisgICAgX190aGF0LT5fTV9oYW5kbGVfZXhjZXB0aW9uKGlvc19iYXNlOjpiYWRiaXQpOworICAgIF9fZG9uZSA9IHRydWU7CisgIH0KKworICBpZiAoX19kb25lKSB7CisgICAgaWYgKF9fYXBwZW5kX251bGwpCisgICAgICAgICpfX3MgPSAgX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRChfQ2hhclQpOworICAgIGlmIChfX3N0YXR1cyAhPSAwKQorICAgICAgX190aGF0LT5zZXRzdGF0ZShfX3N0YXR1cyk7ICAgLy8gVGhpcyBtaWdodCB0aHJvdy4KKyAgICByZXR1cm4gX19uOworICB9CisKKyAgLy8gSWYgZXhlY3V0aW9uIGhhcyByZWFjaGVkIHRoaXMgcG9pbnQsIHRoZW4gd2UgaGF2ZSBhbiBlbXB0eSBidWZmZXIgYnV0CisgIC8vIHdlIGhhdmUgbm90IHJlYWNoZWQgZW9mLiAgV2hhdCB0aGF0IG1lYW5zIGlzIHRoYXQgdGhlIHN0cmVhbWJ1ZiBoYXMKKyAgLy8gZGVjaWRlZCB0byBzd2l0Y2ggZnJvbSBidWZmZXJlZCB0byB1bmJ1ZmZlcmVkIGlucHV0LiAgV2Ugc3dpdGNoIHRvCisgIC8vIHRvIF9fcmVhZF91bmJ1ZmZlcmVkLgorCisgIHJldHVybiBfX24gKyBfX3JlYWRfdW5idWZmZXJlZChfX3RoYXQsICBfX2J1ZiwgX051bSAtIF9fbiwgX19zLCBfX2lzX2RlbGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19leHRyYWN0X2RlbGltLF9fYXBwZW5kX251bGwsX19pc19nZXRsaW5lKTsKK30KKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OmdldChfQ2hhclQqIF9fcywgc3RyZWFtc2l6ZSBfX24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ2hhclQgX19kZWxpbSkgeworICBzZW50cnkgX19zZW50cnkoKnRoaXMsIF9Ob19Ta2lwX1dTKCkpOworICB0aGlzLT5fTV9nY291bnQgPSAwOworCisgIGlmIChfX3NlbnRyeSkgeworICAgIGlmIChfX24gPiAwKSB7CisgICAgICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19idWYgPSB0aGlzLT5yZGJ1ZigpOworCisgICAgICBpZiAoX19idWYtPmVncHRyKCkgIT0gX19idWYtPmdwdHIoKSkKKyAgICAgICAgdGhpcy0+X01fZ2NvdW50ID0KKyAgICAgICAgICBfU1RMUF9QUklWIF9fcmVhZF9idWZmZXJlZCh0aGlzLCAgX19idWYsIF9fbiAtIDEsIF9fcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9FcV9jaGFyX2JvdW5kPF9UcmFpdHM+KF9fZGVsaW0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX1NjYW5fZm9yX2NoYXJfdmFsPF9UcmFpdHM+KF9fZGVsaW0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCB0cnVlLCBmYWxzZSk7CisgICAgICBlbHNlCisgICAgICAgIHRoaXMtPl9NX2djb3VudCA9CisgICAgICAgICAgX1NUTFBfUFJJViBfX3JlYWRfdW5idWZmZXJlZCh0aGlzLCAgX19idWYsIF9fbiAtIDEsIF9fcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX0VxX2NoYXJfYm91bmQ8X1RyYWl0cz4oX19kZWxpbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgdHJ1ZSwgZmFsc2UpOworICAgIH0KKyAgfQorCisgIGlmICh0aGlzLT5fTV9nY291bnQgPT0gMCkKKyAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7CisKKyAgcmV0dXJuICp0aGlzOworfQorCisvLyBHZXRsaW5lIGlzIGVzc2VudGlhbGx5IGlkZW50aWNhbCB0byBnZXQsIGV4Y2VwdCB0aGF0IGl0IGV4dHJhY3RzCisvLyB0aGUgZGVsaW1pdGVyLgordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6Z2V0bGluZShfQ2hhclQqIF9fcywgc3RyZWFtc2l6ZSBfX24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NoYXJUIF9fZGVsaW0pIHsKKyAgc2VudHJ5IF9fc2VudHJ5KCp0aGlzLCBfTm9fU2tpcF9XUygpKTsKKyAgdGhpcy0+X01fZ2NvdW50ID0gMDsKKworICBpZiAoX19zZW50cnkpIHsKKyAgICBpZiAoX19uID4gMCkgeworICAgICAgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fYnVmID0gdGhpcy0+cmRidWYoKTsKKyAgICAgIHRoaXMtPl9NX2djb3VudCA9IF9fYnVmLT5lZ3B0cigpICE9IF9fYnVmLT5ncHRyKCkKKyAgICAgICAgPyBfU1RMUF9QUklWIF9fcmVhZF9idWZmZXJlZCh0aGlzLCAgX19idWYsIF9fbiAtIDEsIF9fcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9FcV9jaGFyX2JvdW5kPF9UcmFpdHM+KF9fZGVsaW0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX1NjYW5fZm9yX2NoYXJfdmFsPF9UcmFpdHM+KF9fZGVsaW0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIHRydWUsIHRydWUpCisgICAgICAgIDogX1NUTFBfUFJJViBfX3JlYWRfdW5idWZmZXJlZCh0aGlzLCAgX19idWYsIF9fbiAtIDEsIF9fcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX0VxX2NoYXJfYm91bmQ8X1RyYWl0cz4oX19kZWxpbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCB0cnVlLCB0cnVlKTsKKyAgICB9CisgIH0KKworICBpZiAodGhpcy0+X01fZ2NvdW50ID09IDApCisgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworCisgIHJldHVybiAqdGhpczsKK30KKworLy8gUmVhZCBuIGNoYXJhY3RlcnMuICBXZSBkb24ndCBsb29rIGZvciBhbnkgZGVsaW1pdGVyLCBhbmQgd2UgZG9uJ3QKKy8vIHB1dCBpbiBhIHRlcm1pbmF0aW5nIG51bGwgY2hhcmFjdGVyLgordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6cmVhZChjaGFyX3R5cGUqIF9fcywgc3RyZWFtc2l6ZSBfX24pIHsKKyAgc2VudHJ5IF9fc2VudHJ5KCp0aGlzLCBfTm9fU2tpcF9XUygpKTsKKyAgdGhpcy0+X01fZ2NvdW50ID0gMDsKKworICBpZiAoX19zZW50cnkgJiYgIXRoaXMtPmVvZigpKSB7CisgICAgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qX19idWYgPSB0aGlzLT5yZGJ1ZigpOworICAgIGlmIChfX2J1Zi0+Z3B0cigpICE9IF9fYnVmLT5lZ3B0cigpKQorICAgICAgX01fZ2NvdW50CisgICAgICAgID0gX1NUTFBfUFJJViBfX3JlYWRfYnVmZmVyZWQodGhpcywgIF9fYnVmLCBfX24sIF9fcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9Db25zdGFudF91bmFyeV9mdW48Ym9vbCwgaW50X3R5cGU+KGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9Qcm9qZWN0Mm5kPGNvbnN0IF9DaGFyVCosIGNvbnN0IF9DaGFyVCo+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgZWxzZQorICAgICAgX01fZ2NvdW50CisgICAgICAgID0gX1NUTFBfUFJJViBfX3JlYWRfdW5idWZmZXJlZCh0aGlzLCAgX19idWYsIF9fbiwgX19zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfQ29uc3RhbnRfdW5hcnlfZnVuPGJvb2wsIGludF90eXBlPihmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgfQorICBlbHNlCisgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworCisgIGlmICh0aGlzLT5lb2YoKSkKKyAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZW9mYml0IHwgaW9zX2Jhc2U6OmZhaWxiaXQpOworCisgIHJldHVybiAqdGhpczsKK30KKworCisvLyBSZWFkIG4gb3IgZmV3ZXIgY2hhcmFjdGVycy4gIFdlIGRvbid0IGxvb2sgZm9yIGFueSBkZWxpbWl0ZXIsIGFuZAorLy8gd2UgZG9uJ3QgcHV0IGluIGEgdGVybWluYXRpbmcgbnVsbCBjaGFyYWN0ZXIuCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorc3RyZWFtc2l6ZQorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpyZWFkc29tZShjaGFyX3R5cGUqIF9fcywgc3RyZWFtc2l6ZSBfX25tYXgpIHsKKyAgc2VudHJ5IF9fc2VudHJ5KCp0aGlzLCBfTm9fU2tpcF9XUygpKTsKKyAgdGhpcy0+X01fZ2NvdW50ID0gMDsKKworICBpZiAoX19zZW50cnkgJiYgIXRoaXMtPmVvZigpICYmIF9fbm1heCA+PSAwKSB7CisKKyAgICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19idWYgPSB0aGlzLT5yZGJ1ZigpOworICAgIHN0cmVhbXNpemUgX19hdmFpbCA9IF9fYnVmLT5pbl9hdmFpbCgpOworCisgICAgLy8gZmJwIDogaXNuJ3QgZnVsbC1ibG93biBzZXRzdGF0ZSByZXF1aXJlZCBoZXJlID8KKyAgICBpZiAoX19hdmFpbCA9PSAtMSkKKyAgICAgIHRoaXMtPl9NX3NldHN0YXRlX25vdGhyb3coaW9zX2Jhc2U6OmVvZmJpdCk7CisKKyAgICBlbHNlIGlmIChfX2F2YWlsICE9IDApIHsKKworICAgICAgaWYgKF9fYnVmLT5ncHRyKCkgIT0gX19idWYtPmVncHRyKCkpCisgICAgICAgIF9NX2djb3VudAorICAgICAgICAgID0gX1NUTFBfUFJJViBfX3JlYWRfYnVmZmVyZWQodGhpcywgIF9fYnVmLCAobWluKSAoX19hdmFpbCwgX19ubWF4KSwgX19zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfQ29uc3RhbnRfdW5hcnlfZnVuPGJvb2wsIGludF90eXBlPihmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9Qcm9qZWN0Mm5kPGNvbnN0IF9DaGFyVCosIGNvbnN0IF9DaGFyVCo+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgIGVsc2UKKyAgICAgICAgX01fZ2NvdW50CisgICAgICAgICAgPSBfU1RMUF9QUklWIF9fcmVhZF91bmJ1ZmZlcmVkKHRoaXMsICBfX2J1ZiwgKG1pbikgKF9fYXZhaWwsIF9fbm1heCksIF9fcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfQ29uc3RhbnRfdW5hcnlfZnVuPGJvb2wsIGludF90eXBlPihmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICAvLyBmYnAgOiBjaGFuZ2VkIHNvIHRoYXQgZmFpbGJpdCBpcyBzZXQgb25seSB0aGVyZSwgdG8gcGFzcyBEaWV0bWFyJ3MgdGVzdAorICAgIGlmICh0aGlzLT5lb2YoKSkKKyAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjplb2ZiaXQgfCBpb3NfYmFzZTo6ZmFpbGJpdCk7CisgICAgZWxzZQorICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworICB9CisKKyAgLy8gIGlmICh0aGlzLT5lb2YoKSkKKyAgLy8gICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmVvZmJpdCB8IGlvc19iYXNlOjpmYWlsYml0KTsKKworICByZXR1cm4gX01fZ2NvdW50OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgordm9pZCBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Ol9NX2Zvcm1hdHRlZF9nZXQoX0NoYXJUKiBfX3MpIHsKKyAgc2VudHJ5IF9fc2VudHJ5KCp0aGlzKTsgLy8gU2tpcCB3aGl0ZXNwYWNlLgorCisgIGlmIChfX3NlbnRyeSkgeworICAgIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX2J1ZiA9IHRoaXMtPnJkYnVmKCk7CisgICAgc3RyZWFtc2l6ZSBfX25tYXggPSB0aGlzLT53aWR0aCgpID4gMAorICAgICAgPyB0aGlzLT53aWR0aCgpIC0gMQorICAgICAgOiAoKG51bWVyaWNfbGltaXRzPHN0cmVhbXNpemU+OjptYXgpKCkgLyBzaXplb2YoX0NoYXJUKSkgLSAxOworCisgICAgc3RyZWFtc2l6ZSBfX24gPSBfX2J1Zi0+Z3B0cigpICE9IF9fYnVmLT5lZ3B0cigpCisgICAgICA/IF9TVExQX1BSSVYgX19yZWFkX2J1ZmZlcmVkKHRoaXMsICBfX2J1ZiwgX19ubWF4LCBfX3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX0lzX3dzcGFjZV9udWxsPF9UcmFpdHM+KHRoaXMtPl9NX2N0eXBlX2ZhY2V0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9TY2FuX3dzcGFjZV9udWxsPF9UcmFpdHM+KHRoaXMtPl9NX2N0eXBlX2ZhY2V0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgdHJ1ZSwgZmFsc2UpCisgICAgICA6IF9TVExQX1BSSVYgX19yZWFkX3VuYnVmZmVyZWQodGhpcywgIF9fYnVmLCBfX25tYXgsIF9fcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9Jc193c3BhY2VfbnVsbDxfVHJhaXRzPih0aGlzLT5fTV9jdHlwZV9mYWNldCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgdHJ1ZSwgZmFsc2UpOworICAgIGlmIChfX24gPT0gMCkKKyAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKKyAgfQorICB0aGlzLT53aWR0aCgwKTsKK30KKworLy8gQSBnZW5lcmljIHVuYnVmZmVyZWQgZnVuY3Rpb24gZm9yIGlnbm9yaW5nIGNoYXJhY3RlcnMuICBXZSBzdG9wCisvLyB3aGVuIHdlIHJlYWNoIEVPRiwgb3Igd2hlbiB0aGUgZnVuY3Rpb24gb2JqZWN0IF9faXNfZGVsaW0gcmV0dXJucworLy8gdHJ1ZS4gIEluIHRoZSBsYXN0IGNhc2UsIGl0IGV4dHJhY3RzIHRoZSBjaGFyYWN0ZXIgZm9yIHdoaWNoCisvLyBfX2lzX2RlbGltIGlzIHRydWUsIGlmIGFuZCBvbmx5IGlmIF9fZXh0cmFjdF9kZWxpbSBpcyB0cnVlLgorCit0ZW1wbGF0ZSA8IGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0lzX0RlbGltPgordm9pZCBfU1RMUF9DQUxMCitfTV9pZ25vcmVfdW5idWZmZXJlZChiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4qIF9fdGhhdCwKKyAgICAgICAgICAgICAgICAgICAgIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgIF9Jc19EZWxpbSBfX2lzX2RlbGltLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBfX2V4dHJhY3RfZGVsaW0sIGJvb2wgX19zZXRfZmFpbGJpdCkgeworICBib29sIF9fZG9uZSA9IGZhbHNlOworICBpb3NfYmFzZTo6aW9zdGF0ZSBfX3N0YXR1cyA9IDA7CisgIHR5cGVkZWYgdHlwZW5hbWUgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjppbnRfdHlwZSBpbnRfdHlwZTsKKworICBfU1RMUF9UUlkgeworICAgIHdoaWxlICghX19kb25lKSB7CisgICAgICBpbnRfdHlwZSBfX2MgPSBfX2J1Zi0+c2J1bXBjKCk7CisKKyAgICAgIGlmIChfX3RoYXQtPl9TX2VvZihfX2MpKSB7CisgICAgICAgIF9fZG9uZSA9IHRydWU7CisgICAgICAgIF9fc3RhdHVzIHw9IF9fc2V0X2ZhaWxiaXQgPyBpb3NfYmFzZTo6ZW9mYml0IHwgaW9zX2Jhc2U6OmZhaWxiaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGlvc19iYXNlOjplb2ZiaXQ7CisgICAgICB9CisKKyAgICAgIGVsc2UgaWYgKF9faXNfZGVsaW0oX1RyYWl0czo6dG9fY2hhcl90eXBlKF9fYykpKSB7CisgICAgICAgIF9fZG9uZSA9IHRydWU7CisgICAgICAgIGlmICghX19leHRyYWN0X2RlbGltKQorICAgICAgICAgIGlmIChfX3RoYXQtPl9TX2VvZihfX2J1Zi0+c3B1dGJhY2tjKF9UcmFpdHM6OnRvX2NoYXJfdHlwZShfX2MpKSkpCisgICAgICAgICAgICBfX3N0YXR1cyB8PSBpb3NfYmFzZTo6ZmFpbGJpdDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgX1NUTFBfQ0FUQ0hfQUxMIHsKKyAgICBfX3RoYXQtPl9NX2hhbmRsZV9leGNlcHRpb24oaW9zX2Jhc2U6OmJhZGJpdCk7CisgIH0KKworICBfX3RoYXQtPnNldHN0YXRlKF9fc3RhdHVzKTsKK30KKworLy8gQSBnZW5lcmljIGJ1ZmZlcmVkIGZ1bmN0aW9uIGZvciBpZ25vcmluZyBjaGFyYWN0ZXJzLiAgTXVjaCBsaWtlCisvLyBfTV9pZ25vcmVfdW5idWZmZXJlZCwgYnV0IHdpdGggb25lIGFkZGl0aW9uYWwgZnVuY3Rpb24gb2JqZWN0OgorLy8gX19zY2FuX2RlbGltKGZpcnN0LCBsYXN0KSByZXR1cm5zIHRoZSBmaXJzdCBwb2ludGVyIHAgaW4gW2ZpcnN0LAorLy8gbGFzdCkgc3VjaCB0aGF0IF9faXNfZGVsaW0ocCkgaXMgdHJ1ZS4KKwordGVtcGxhdGUgPCBjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9Jc19EZWxpbSwgY2xhc3MgX1NjYW5fRGVsaW0+Cit2b2lkIF9TVExQX0NBTEwKK19NX2lnbm9yZV9idWZmZXJlZChiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4qIF9fdGhhdCwKKyAgICAgICAgICAgICAgICAgICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19idWYsCisgICAgICAgICAgICAgICAgICAgX0lzX0RlbGltIF9faXNfZGVsaW0sIF9TY2FuX0RlbGltIF9fc2Nhbl9kZWxpbSwKKyAgICAgICAgICAgICAgICAgICBib29sIF9fZXh0cmFjdF9kZWxpbSwgYm9vbCBfX3NldF9mYWlsYml0KSB7CisgIGJvb2wgX19hdF9lb2YgICAgICA9IGZhbHNlOworICBib29sIF9fZm91bmRfZGVsaW0gPSBmYWxzZTsKKworICBfU1RMUF9UUlkgeworICAgIHdoaWxlIChfX2J1Zi0+X01fZWdwdHIoKSAhPSBfX2J1Zi0+X01fZ3B0cigpICYmICFfX2F0X2VvZiAmJiAhX19mb3VuZF9kZWxpbSkgeworICAgICAgY29uc3QgX0NoYXJUKiBfX3AgPSBfX3NjYW5fZGVsaW0oX19idWYtPl9NX2dwdHIoKSwgX19idWYtPl9NX2VncHRyKCkpOworICAgICAgX19idWYtPl9NX2didW1wKChpbnQpKF9fcCAtIF9fYnVmLT5fTV9ncHRyKCkpKTsKKworICAgICAgaWYgKF9fcCAhPSBfX2J1Zi0+X01fZWdwdHIoKSkgeyAvLyBXZSBmb3VuZCBkZWxpbSwgc28gd2UncmUgZG9uZS4KKyAgICAgICAgaWYgKF9fZXh0cmFjdF9kZWxpbSkKKyAgICAgICAgICBfX2J1Zi0+X01fZ2J1bXAoMSk7CisgICAgICAgIF9fZm91bmRfZGVsaW0gPSB0cnVlOworICAgICAgfQorCisgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIGRlbGltLiAgVHJ5IHRvIHJlZmlsIHRoZSBidWZmZXIuCisgICAgICAgIF9fYXRfZW9mID0gX190aGF0LT5fU19lb2YoX19idWYtPnNnZXRjKCkpOworICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDbG9zZSB0aGUgd2hpbGUgbG9vcC4KKyAgfQorICBfU1RMUF9DQVRDSF9BTEwgeworICAgIF9fdGhhdC0+X01faGFuZGxlX2V4Y2VwdGlvbihpb3NfYmFzZTo6YmFkYml0KTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoX19hdF9lb2YpIHsKKyAgICBfX3RoYXQtPnNldHN0YXRlKF9fc2V0X2ZhaWxiaXQgPyBpb3NfYmFzZTo6ZW9mYml0IHwgaW9zX2Jhc2U6OmZhaWxiaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBpb3NfYmFzZTo6ZW9mYml0KTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKF9fZm91bmRfZGVsaW0pCisgICAgcmV0dXJuOworCisgIC8vIElmIGV4ZWN1dGlvbiBoYXMgcmVhY2hlZCB0aGlzIHBvaW50LCB0aGVuIHdlIGhhdmUgYW4gZW1wdHkgYnVmZmVyIGJ1dAorICAvLyB3ZSBoYXZlIG5vdCByZWFjaGVkIGVvZi4gIFdoYXQgdGhhdCBtZWFucyBpcyB0aGF0IHRoZSBzdHJlYW1idWYgaGFzCisgIC8vIGRlY2lkZWQgdG8gc3dpdGNoIGZyb20gYSBidWZmZXJlZCB0byBhbiB1bmJ1ZmZlcmVkIG1vZGUuICBXZSBzd2l0Y2gKKyAgLy8gdG8gX01faWdub3JlX3VuYnVmZmVyZWQuCisgIF9NX2lnbm9yZV91bmJ1ZmZlcmVkKF9fdGhhdCwgIF9fYnVmLCBfX2lzX2RlbGltLCBfX2V4dHJhY3RfZGVsaW0sIF9fc2V0X2ZhaWxiaXQpOworfQorCisvLyBPdmVybG9hZGVkIHZlcnNpb25zIG9mIF9NX2lnbm9yZV91bmJ1ZmZlcmVkIGFuZCBfTV9pZ25vcmVfdW5idWZmZXJlZAorLy8gd2l0aCBhbiBleHBsaWNpdCBjb3VudCBfTnVtLiAgUmV0dXJuIHZhbHVlIGlzIHRoZSBudW1iZXIgb2YKKy8vIGNoYXJhY3RlcnMgZXh0cmFjdGVkLgorLy8KKy8vIFRoZSBmdW5jdGlvbiBvYmplY3QgX19tYXhfY2hhcnMgdGFrZXMgdHdvIGFyZ3VtZW50cywgX051bSBhbmQgX19uCisvLyAodGhlIGxhdHRlciBiZWluZyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd2UgaGF2ZSBhbHJlYWR5IHJlYWQpLAorLy8gYW5kIHJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcmVhZCBmcm9tIHRoZSBidWZmZXIuCisvLyBXZSBwYXJhbWV0ZXJpemUgX01faWdub3JlX2J1ZmZlcmVkIHNvIHRoYXQgd2UgY2FuIHVzZSBpdCBmb3IgYm90aAorLy8gYm91bmRlZCBhbmQgdW5ib3VuZGVkIGlucHV0OyBmb3IgdGhlIGZvcm1lciB0aGUgZnVuY3Rpb24gb2JqZWN0IHNob3VsZAorLy8gYmUgbWludXM8PiwgYW5kIGZvciB0aGUgbGF0dGVyIGl0IHNob3VsZCByZXR1cm4gYSBjb25zdGFudCBtYXhpbXVtIHZhbHVlLgorCit0ZW1wbGF0ZSA8IGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX01heF9DaGFycywgY2xhc3MgX0lzX0RlbGltPgorc3RyZWFtc2l6ZSBfU1RMUF9DQUxMCitfTV9pZ25vcmVfdW5idWZmZXJlZChiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4qIF9fdGhhdCwKKyAgICAgICAgICAgICAgICAgICAgIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgIHN0cmVhbXNpemUgX051bSwgX01heF9DaGFycyBfX21heF9jaGFycywKKyAgICAgICAgICAgICAgICAgICAgIF9Jc19EZWxpbSBfX2lzX2RlbGltLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBfX2V4dHJhY3RfZGVsaW0sIGJvb2wgX19zZXRfZmFpbGJpdCkgeworICBzdHJlYW1zaXplIF9fbiA9IDA7CisgIGlvc19iYXNlOjppb3N0YXRlIF9fc3RhdHVzID0gMDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OmludF90eXBlIGludF90eXBlOworCisgIF9TVExQX1RSWSB7CisgICAgd2hpbGUgKF9fbWF4X2NoYXJzKF9OdW0sIF9fbikgPiAwKSB7CisgICAgICBpbnRfdHlwZSBfX2MgPSBfX2J1Zi0+c2J1bXBjKCk7CisKKyAgICAgIGlmIChfX3RoYXQtPl9TX2VvZihfX2MpKSB7CisgICAgICAgIF9fc3RhdHVzIHw9IF9fc2V0X2ZhaWxiaXQgPyBpb3NfYmFzZTo6ZW9mYml0IHwgaW9zX2Jhc2U6OmZhaWxiaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGlvc19iYXNlOjplb2ZiaXQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBlbHNlIGlmIChfX2lzX2RlbGltKF9UcmFpdHM6OnRvX2NoYXJfdHlwZShfX2MpKSkgeworICAgICAgICBpZiAoX19leHRyYWN0X2RlbGltKQorICAgICAgICAgICsrX19uOworICAgICAgICBlbHNlIGlmIChfX3RoYXQtPl9TX2VvZihfX2J1Zi0+c3B1dGJhY2tjKF9UcmFpdHM6OnRvX2NoYXJfdHlwZShfX2MpKSkpCisgICAgICAgICAgX19zdGF0dXMgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAvLyBmYnAgOiBhZGRlZCBjb3VudGVyIGluY3JlbWVudCB0byBwYXNzIERpZXRtYXIncyB0ZXN0CisgICAgICArK19fbjsKKyAgICB9CisgIH0KKyAgX1NUTFBfQ0FUQ0hfQUxMIHsKKyAgICBfX3RoYXQtPl9NX2hhbmRsZV9leGNlcHRpb24oaW9zX2Jhc2U6OmJhZGJpdCk7CisgIH0KKworICBpZiAoX19zdGF0dXMpCisgICAgX190aGF0LT5zZXRzdGF0ZShfX3N0YXR1cyk7ICAgLy8gVGhpcyBtaWdodCB0aHJvdy4KKyAgcmV0dXJuIF9fbjsKK30KKwordGVtcGxhdGUgPCBjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9NYXhfQ2hhcnMsIGNsYXNzIF9Jc19EZWxpbSwgY2xhc3MgX1NjYW5fRGVsaW0+CitzdHJlYW1zaXplIF9TVExQX0NBTEwKK19NX2lnbm9yZV9idWZmZXJlZChiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4qIF9fdGhhdCwKKyAgICAgICAgICAgICAgICAgICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19idWYsCisgICAgICAgICAgICAgICAgICAgc3RyZWFtc2l6ZSBfTnVtLAorICAgICAgICAgICAgICAgICAgIF9NYXhfQ2hhcnMgX19tYXhfY2hhcnMsCisgICAgICAgICAgICAgICAgICAgX0lzX0RlbGltIF9faXNfZGVsaW0sIF9TY2FuX0RlbGltIF9fc2Nhbl9kZWxpbSwKKyAgICAgICAgICAgICAgICAgICBib29sIF9fZXh0cmFjdF9kZWxpbSwgYm9vbCBfX3NldF9mYWlsYml0KSB7CisgIHN0cmVhbXNpemUgX19uID0gMDsKKyAgYm9vbCBfX2F0X2VvZiA9IGZhbHNlOworICBib29sIF9fZG9uZSAgID0gZmFsc2U7CisKKyAgX1NUTFBfVFJZIHsKKyAgICB3aGlsZSAoX19idWYtPl9NX2VncHRyKCkgIT0gX19idWYtPl9NX2dwdHIoKSAmJiAhX19kb25lKSB7CisgICAgICBwdHJkaWZmX3QgX19hdmFpbCA9IF9fYnVmLT5fTV9lZ3B0cigpIC0gX19idWYtPl9NX2dwdHIoKTsKKyAgICAgIHN0cmVhbXNpemUgX19tID0gX19tYXhfY2hhcnMoX051bSwgX19uKTsKKworICAgICAgaWYgKF9fYXZhaWwgPj0gX19tKSB7ICAgICAgIC8vIFdlIGhhdmUgbW9yZSBjaGFyYWN0ZXJzIHRoYW4gd2UgbmVlZC4KKyAgICAgICAgY29uc3QgX0NoYXJUKiBfX2xhc3QgPSBfX2J1Zi0+X01fZ3B0cigpICsgX19TVEFUSUNfQ0FTVChwdHJkaWZmX3QsIF9fbSk7CisgICAgICAgIGNvbnN0IF9DaGFyVCogX19wID0gX19zY2FuX2RlbGltKF9fYnVmLT5fTV9ncHRyKCksIF9fbGFzdCk7CisgICAgICAgIHB0cmRpZmZfdCBfX2NodW5rID0gX19wIC0gX19idWYtPl9NX2dwdHIoKTsKKyAgICAgICAgX19uICs9IF9fY2h1bms7CisgICAgICAgIF9fYnVmLT5fTV9nYnVtcCgoaW50KV9fY2h1bmspOworCisgICAgICAgIGlmIChfX2V4dHJhY3RfZGVsaW0gJiYgX19wICE9IF9fbGFzdCkgeworICAgICAgICAgIF9fbiArPSAxOworICAgICAgICAgIF9fYnVmLT5fTV9nYnVtcCgxKTsKKyAgICAgICAgfQorCisgICAgICAgIF9fZG9uZSA9IHRydWU7CisgICAgICB9CisKKyAgICAgIGVsc2UgeworICAgICAgICBjb25zdCBfQ2hhclQqIF9fcCA9IF9fc2Nhbl9kZWxpbShfX2J1Zi0+X01fZ3B0cigpLCBfX2J1Zi0+X01fZWdwdHIoKSk7CisgICAgICAgIHB0cmRpZmZfdCBfX2NodW5rID0gX19wIC0gX19idWYtPl9NX2dwdHIoKTsKKyAgICAgICAgX19uICs9IF9fY2h1bms7CisgICAgICAgIF9fYnVmLT5fTV9nYnVtcCgoaW50KV9fY2h1bmspOworCisgICAgICAgIGlmIChfX3AgIT0gX19idWYtPl9NX2VncHRyKCkpIHsgLy8gV2UgZm91bmQgZGVsaW0uCisgICAgICAgICAgaWYgKF9fZXh0cmFjdF9kZWxpbSkgeworICAgICAgICAgICAgX19uICs9IDE7CisgICAgICAgICAgICBfX2J1Zi0+X01fZ2J1bXAoMSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgX19kb25lID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFdlIGRpZG4ndCBmaW5kIGRlbGltLiAgVHJ5IHRvIHJlZmlsbCB0aGUgYnVmZmVyLgorICAgICAgICBlbHNlIGlmIChfX3RoYXQtPl9TX2VvZihfX2J1Zi0+c2dldGMoKSkpIHsKKyAgICAgICAgICBfX2RvbmUgICA9IHRydWU7CisgICAgICAgICAgX19hdF9lb2YgPSB0cnVlOworICAgICAgICB9CisgICAgICB9CisgICAgfSAvLyBDbG9zZSB0aGUgd2hpbGUgbG9vcC4KKyAgfQorICBfU1RMUF9DQVRDSF9BTEwgeworICAgIF9fdGhhdC0+X01faGFuZGxlX2V4Y2VwdGlvbihpb3NfYmFzZTo6YmFkYml0KTsKKyAgICByZXR1cm4gX19uOworICB9CisKKyAgaWYgKF9fYXRfZW9mKQorICAgIF9fdGhhdC0+c2V0c3RhdGUoX19zZXRfZmFpbGJpdCA/IGlvc19iYXNlOjplb2ZiaXQgfCBpb3NfYmFzZTo6ZmFpbGJpdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGlvc19iYXNlOjplb2ZiaXQpOworCisgIGlmIChfX2RvbmUpCisgICAgcmV0dXJuIF9fbjsKKworICAvLyBJZiBleGVjdXRpb24gaGFzIHJlYWNoZWQgdGhpcyBwb2ludCwgdGhlbiB3ZSBoYXZlIGFuIGVtcHR5IGJ1ZmZlciBidXQKKyAgLy8gd2UgaGF2ZSBub3QgcmVhY2hlZCBlb2YuICBXaGF0IHRoYXQgbWVhbnMgaXMgdGhhdCB0aGUgc3RyZWFtYnVmIGhhcworICAvLyBkZWNpZGVkIHRvIHN3aXRjaCBmcm9tIGJ1ZmZlcmVkIHRvIHVuYnVmZmVyZWQgaW5wdXQuICBXZSBzd2l0Y2ggdG8KKyAgLy8gdG8gX01faWdub3JlX3VuYnVmZmVyZWQuCisKKyAgcmV0dXJuIF9fbiArIF9NX2lnbm9yZV91bmJ1ZmZlcmVkKF9fdGhhdCwgIF9fYnVmLCBfTnVtLCBfX21heF9jaGFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faXNfZGVsaW0sIF9fZXh0cmFjdF9kZWxpbSwgX19zZXRfZmFpbGJpdCk7Cit9CisKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6aWdub3JlKHN0cmVhbXNpemUgX19uKSB7CisgIHNlbnRyeSBfX3NlbnRyeSgqdGhpcywgX05vX1NraXBfV1MoKSk7CisgIHRoaXMtPl9NX2djb3VudCA9IDA7CisKKyAgaWYgKF9fc2VudHJ5KSB7CisgICAgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fYnVmID0gdGhpcy0+cmRidWYoKTsKKyAgICB0eXBlZGVmIF9TVExQX1BSSVYgX0NvbnN0YW50X3VuYXJ5X2Z1bjxib29sLCBpbnRfdHlwZT4gX0NvbnN0X2Jvb2w7CisgICAgdHlwZWRlZiBfU1RMUF9QUklWIF9Db25zdGFudF9iaW5hcnlfZnVuPHN0cmVhbXNpemUsIHN0cmVhbXNpemUsIHN0cmVhbXNpemU+IF9Db25zdF9zdHJlYW1zaXplOworICAgIGNvbnN0IHN0cmVhbXNpemUgX19tYXhzcyA9IChudW1lcmljX2xpbWl0czxzdHJlYW1zaXplPjo6bWF4KSgpOworCisgICAgaWYgKF9fbiA9PSAobnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KSgpKSB7CisgICAgICBpZiAoX19idWYtPmdwdHIoKSAhPSBfX2J1Zi0+ZWdwdHIoKSkKKyAgICAgICAgX01fZ2NvdW50ID0gX01faWdub3JlX2J1ZmZlcmVkKHRoaXMsICBfX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbWF4c3MsIF9Db25zdF9zdHJlYW1zaXplKF9fbWF4c3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NvbnN0X2Jvb2woZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfUHJvamVjdDJuZDxjb25zdCBfQ2hhclQqLCBjb25zdCBfQ2hhclQqPigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlKTsKKyAgICAgIGVsc2UKKyAgICAgICAgX01fZ2NvdW50ID0gX01faWdub3JlX3VuYnVmZmVyZWQodGhpcywgIF9fYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX21heHNzLCBfQ29uc3Rfc3RyZWFtc2l6ZShfX21heHNzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NvbnN0X2Jvb2woZmFsc2UpLCBmYWxzZSwgZmFsc2UpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGlmIChfX2J1Zi0+Z3B0cigpICE9IF9fYnVmLT5lZ3B0cigpKQorICAgICAgICBfTV9nY291bnQgPSBfTV9pZ25vcmVfYnVmZmVyZWQodGhpcywgIF9fYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19uLCBtaW51czxzdHJlYW1zaXplPigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NvbnN0X2Jvb2woZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfUHJvamVjdDJuZDxjb25zdCBfQ2hhclQqLCBjb25zdCBfQ2hhclQqPigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlKTsKKyAgICAgIGVsc2UKKyAgICAgICAgX01fZ2NvdW50ID0gX01faWdub3JlX3VuYnVmZmVyZWQodGhpcywgIF9fYnVmLCBfX24sIG1pbnVzPHN0cmVhbXNpemU+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Db25zdF9ib29sKGZhbHNlKSwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Omlnbm9yZShzdHJlYW1zaXplIF9fbiwgaW50X3R5cGUgX19kZWxpbSkgeworICBzZW50cnkgX19zZW50cnkoKnRoaXMsIF9Ob19Ta2lwX1dTKCkpOworICB0aGlzLT5fTV9nY291bnQgPSAwOworCisgIGlmIChfX3NlbnRyeSkgeworICAgIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX2J1ZiA9IHRoaXMtPnJkYnVmKCk7CisgICAgdHlwZWRlZiBfU1RMUF9QUklWIF9Db25zdGFudF91bmFyeV9mdW48Ym9vbCwgaW50X3R5cGU+IF9Db25zdF9ib29sOworICAgIHR5cGVkZWYgX1NUTFBfUFJJViBfQ29uc3RhbnRfYmluYXJ5X2Z1bjxzdHJlYW1zaXplLCBzdHJlYW1zaXplLCBzdHJlYW1zaXplPgorICAgICAgX0NvbnN0X3N0cmVhbXNpemU7CisgICAgY29uc3Qgc3RyZWFtc2l6ZSBfX21heHNzID0gKG51bWVyaWNfbGltaXRzPHN0cmVhbXNpemU+OjptYXgpKCk7CisKKyAgICBpZiAoX19uID09IChudW1lcmljX2xpbWl0czxpbnQ+OjptYXgpKCkpIHsKKyAgICAgIGlmIChfX2J1Zi0+Z3B0cigpICE9IF9fYnVmLT5lZ3B0cigpKQorICAgICAgICBfTV9nY291bnQgPSBfTV9pZ25vcmVfYnVmZmVyZWQodGhpcywgIF9fYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tYXhzcywgX0NvbnN0X3N0cmVhbXNpemUoX19tYXhzcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9FcV9pbnRfYm91bmQ8X1RyYWl0cz4oX19kZWxpbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9TY2FuX2Zvcl9pbnRfdmFsPF9UcmFpdHM+KF9fZGVsaW0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgZmFsc2UpOworICAgICAgZWxzZQorICAgICAgICBfTV9nY291bnQgPSBfTV9pZ25vcmVfdW5idWZmZXJlZCh0aGlzLCAgX19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbWF4c3MsIF9Db25zdF9zdHJlYW1zaXplKF9fbWF4c3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9FcV9pbnRfYm91bmQ8X1RyYWl0cz4oX19kZWxpbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIGZhbHNlKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBpZiAoX19idWYtPmdwdHIoKSAhPSBfX2J1Zi0+ZWdwdHIoKSkKKyAgICAgICAgX01fZ2NvdW50ID0gX01faWdub3JlX2J1ZmZlcmVkKHRoaXMsICBfX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbiwgbWludXM8c3RyZWFtc2l6ZT4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX0VxX2ludF9ib3VuZDxfVHJhaXRzPihfX2RlbGltKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX1NjYW5fZm9yX2ludF92YWw8X1RyYWl0cz4oX19kZWxpbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCBmYWxzZSk7CisgICAgICBlbHNlCisgICAgICAgIF9NX2djb3VudCA9IF9NX2lnbm9yZV91bmJ1ZmZlcmVkKHRoaXMsICBfX2J1ZiwgX19uLCBtaW51czxzdHJlYW1zaXplPigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9FcV9pbnRfYm91bmQ8X1RyYWl0cz4oX19kZWxpbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIGZhbHNlKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gKnRoaXM7Cit9CisKKy8vIFRoaXMgbWVtYmVyIGZ1bmN0aW9uIGRvZXMgbm90IGNvbnN0cnVjdCBhIHNlbnRyeSBvYmplY3QsIGJlY2F1c2UKKy8vIGl0IGlzIGNhbGxlZCBmcm9tIHNlbnRyeSdzIGNvbnN0cnVjdG9yLgordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK3ZvaWQgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpfTV9za2lwX3doaXRlc3BhY2UoYm9vbCBfX3NldF9mYWlsYml0KSB7CisgIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX2J1ZiA9IHRoaXMtPnJkYnVmKCk7CisgIGlmICghX19idWYpCisgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CisgIGVsc2UgaWYgKF9fYnVmLT5ncHRyKCkgIT0gX19idWYtPmVncHRyKCkpCisgICAgX01faWdub3JlX2J1ZmZlcmVkKHRoaXMsICBfX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfSXNfbm90X3dzcGFjZTxfVHJhaXRzPih0aGlzLT5fTV9jdHlwZV9mYWNldCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfU2Nhbl9mb3Jfbm90X3dzcGFjZTxfVHJhaXRzPih0aGlzLT5fTV9jdHlwZV9mYWNldCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIF9fc2V0X2ZhaWxiaXQpOworICBlbHNlCisgICAgX01faWdub3JlX3VuYnVmZmVyZWQodGhpcywgIF9fYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX0lzX25vdF93c3BhY2U8X1RyYWl0cz4odGhpcy0+X01fY3R5cGVfZmFjZXQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIF9fc2V0X2ZhaWxiaXQpOworfQorCisKKy8vIFRoaXMgaXMgYSB2ZXJ5IHNpbXBsZSBsb29wIHRoYXQgcmVhZHMgY2hhcmFjdGVycyBmcm9tIF9fc3JjIGFuZCBwdXRzCisvLyB0aGVtIGludG8gX19kZXN0LiAgSXQgbG9va3MgY29tcGxpY2F0ZWQgYmVjYXVzZSBvZiB0aGUgKHN0YW5kYXJkLQorLy8gbWFuZGF0ZWQpIGV4Y2VwdGlvbiBoYW5kbGluZyBwb2xpY3kuCisvLworLy8gV2Ugc3RvcCB3aGVuIHdlIGdldCBhbiBleGNlcHRpb24sIHdoZW4gd2UgZmFpbCB0byBpbnNlcnQgaW50byB0aGUKKy8vIG91dHB1dCBzdHJlYW1idWYsIG9yIHdoZW4gX19pc19kZWxpbSBpcyB0cnVlLgorCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDwgY2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfSXNfRGVsaW0+CitzdHJlYW1zaXplIF9TVExQX0NBTEwKK19fY29weV91bmJ1ZmZlcmVkKGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiogX190aGF0LCBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19zcmMsCisgICAgICAgICAgICAgICAgICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19kZXN0LAorICAgICAgICAgICAgICAgICAgX0lzX0RlbGltIF9faXNfZGVsaW0sCisgICAgICAgICAgICAgICAgICBib29sIF9fZXh0cmFjdF9kZWxpbSwgYm9vbCBfX3JldGhyb3cpIHsKKyAgc3RyZWFtc2l6ZSBfX2V4dHJhY3RlZCA9IDA7CisgIGlvc19iYXNlOjppb3N0YXRlIF9fc3RhdHVzID0gMDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OmludF90eXBlIGludF90eXBlOworICBpbnRfdHlwZSBfX2M7CisKKyAgX1NUTFBfVFJZIHsKKyAgICBmb3IgKDs7KSB7CisgICAgICAvLyBHZXQgYSBjaGFyYWN0ZXIuIElmIHRoZXJlJ3MgYW4gZXhjZXB0aW9uLCBjYXRjaCBhbmQgKG1heWJlKSByZXRocm93IGl0LgorICAgICAgX19jID0gX19zcmMtPnNidW1wYygpOworCisgICAgICAvLyBJZiB3ZSBmYWlsZWQgdG8gZ2V0IGEgY2hhcmFjdGVyLCB0aGVuIHF1aXQuCisgICAgICBpZiAoX190aGF0LT5fU19lb2YoX19jKSkgeworICAgICAgICBfX3N0YXR1cyB8PSBpb3NfYmFzZTo6ZW9mYml0OworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIC8vIElmIGl0J3MgdGhlIGRlbGltaXRlciwgdGhlbiBxdWl0LgorICAgICAgZWxzZSBpZiAoX19pc19kZWxpbShfVHJhaXRzOjp0b19jaGFyX3R5cGUoX19jKSkpIHsKKyAgICAgICAgaWYgKCFfX2V4dHJhY3RfZGVsaW0gJiYgIV9fcHVzaGJhY2soX19zcmMsIF9UcmFpdHM6OnRvX2NoYXJfdHlwZShfX2MpKSkKKyAgICAgICAgICBfX3N0YXR1cyB8PSBpb3NfYmFzZTo6ZmFpbGJpdDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgLy8gVHJ5IHRvIHB1dCB0aGUgY2hhcmFjdGVyIGluIHRoZSBvdXRwdXQgc3RyZWFtYnVmLgorICAgICAgICBib29sIF9fZmFpbGVkID0gZmFsc2U7CisgICAgICAgIF9TVExQX1RSWSB7CisgICAgICAgICAgaWYgKCFfX3RoYXQtPl9TX2VvZihfX2Rlc3QtPnNwdXRjKF9UcmFpdHM6OnRvX2NoYXJfdHlwZShfX2MpKSkpCisgICAgICAgICAgICArK19fZXh0cmFjdGVkOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9fZmFpbGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBfU1RMUF9DQVRDSF9BTEwgeworICAgICAgICAgIF9fZmFpbGVkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHdlIGZhaWxlZCB0byBwdXQgdGhlIGNoYXJhY3RlciBpbiB0aGUgb3V0cHV0IHN0cmVhbWJ1ZiwgdGhlbgorICAgICAgICAvLyB0cnkgdG8gcHVzaCBpdCBiYWNrIHRvIHRoZSBpbnB1dCBzdHJlYW1idWYuCisgICAgICAgIGlmIChfX2ZhaWxlZCAmJiAhX19wdXNoYmFjayhfX3NyYywgX1RyYWl0czo6dG9fY2hhcl90eXBlKF9fYykpKQorICAgICAgICAgIF9fc3RhdHVzIHw9IGlvc19iYXNlOjpmYWlsYml0OworCisgICAgICAgIC8vIGZicCA6IGF2b2lkaW5nIGluZmluaXRlIGxvb3AgaW4gaW8tMjctNi0xLTItMy5leHAKKyAgICAgICAgaWYgKF9fZmFpbGVkKQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgfSAvKiBmb3IgKDs7KSAqLworCisgIH0KKyAgLy8gZmJwIDogdGhpcyB0cnkvY2F0Y2ggbW92ZWQgaGVyZSBpbiByZWFzb25hYmxlIGFzc3VtcHRpb24KKyAgLy8gX19pc19kZWxpbSBuZXZlciB0aHJvdyAoX19wdXNoYmFjayBpcyBndWFyYW50ZWVkIG5vdCB0bykKKyAgX1NUTFBfQ0FUQ0hfQUxMIHsKKyAgICAvLyBTZWUgMjcuNi4xLjIuMywgcGFyYWdyYXBoIDEzLgorICAgIGlmIChfX3JldGhyb3cgJiYgX19leHRyYWN0ZWQgPT0gMCkKKyAgICAgIF9fdGhhdC0+X01faGFuZGxlX2V4Y2VwdGlvbihpb3NfYmFzZTo6ZmFpbGJpdCk7CisgIH0KKyAgX190aGF0LT5zZXRzdGF0ZShfX3N0YXR1cyk7CisgIHJldHVybiBfX2V4dHJhY3RlZDsKK30KKworLy8gQnVmZmVyZWQgY29weWluZyBmcm9tIG9uZSBzdHJlYW1idWYgdG8gYW5vdGhlci4gIFdlIGNvcHkgdGhlIGNoYXJhY3RlcnMKKy8vIGluIGNodW5rcywgcmF0aGVyIHRoYW4gb25lIGF0IGEgdGltZS4gIFdlIHN0aWxsIGhhdmUgdG8gd29ycnkgYWJvdXQgYWxsCisvLyBvZiB0aGUgZXJyb3IgY29uZGl0aW9ucyB3ZSBjaGVja2VkIGluIF9fY29weV91bmJ1ZmZlcmVkLCBwbHVzIG9uZSBtb3JlOgorLy8gdGhlIHN0cmVhbWJ1ZiBtaWdodCBkZWNpZGUgdG8gc3dpdGNoIGZyb20gYSBidWZmZXJlZCB0byBhbiB1bmJ1ZmZlcmVkIG1vZGUuCisKK3RlbXBsYXRlIDwgY2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfSXNfRGVsaW0sIGNsYXNzIF9TY2FuX0RlbGltPgorc3RyZWFtc2l6ZSBfU1RMUF9DQUxMCitfX2NvcHlfYnVmZmVyZWQoYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+KiBfX3RoYXQsIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX3NyYywKKyAgICAgICAgICAgICAgICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19kZXN0LAorICAgICAgICAgICAgICAgIF9TY2FuX0RlbGltIF9fc2Nhbl9kZWxpbSwgX0lzX0RlbGltIF9faXNfZGVsaW0sCisgICAgICAgICAgICAgICAgYm9vbCBfX2V4dHJhY3RfZGVsaW0sIGJvb2wgX19yZXRocm93KSB7CisgIHN0cmVhbXNpemUgX19leHRyYWN0ZWQgPSAwOworICBpb3NfYmFzZTo6aW9zdGF0ZSBfX3N0YXR1cyA9IDA7CisgIHR5cGVkZWYgdHlwZW5hbWUgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjppbnRfdHlwZSBpbnRfdHlwZTsKKyAgLy9Cb3JsYW5kIGNvbXBpbGVyIGdlbmVyYXRlcyBhIHdhcm5pbmcgaWYgYXNzaWdubWVudCBiZWNhdXNlIHZhbHVlIGlzIG5ldmVyIHVzZWQ6CisgIGludF90eXBlIF9fYyAvKj0gX1RyYWl0czo6ZW9mKCkqLzsKKyAgX0NoYXJUKiBfX2ZpcnN0ID0gX19zcmMtPl9NX2dwdHIoKTsKKyAgcHRyZGlmZl90IF9fYXZhaWwgPSBfX3NyYy0+X01fZWdwdHIoKSAtIF9fZmlyc3Q7CisgIC8vIGZicCA6IGludHJvZHVjZWQgdG8gbW92ZSBjYXRjaC90cnkgYmxvY2tzIG91dCBvZiB0aGUgbG9vcAorICBib29sIF9fZG9faGFuZGxlX2V4Y2VwdGlvbnMgPSBmYWxzZTsKKworICBfU1RMUF9UUlkgeworICAgIGZvciAoOzspIHsKKyAgICAgIGNvbnN0IF9DaGFyVCogX19sYXN0ID0gX19zY2FuX2RlbGltKF9fZmlyc3QsIF9fc3JjLT5fTV9lZ3B0cigpKTsKKworICAgICAgLy8gVHJ5IHRvIGNvcHkgdGhlIGVudGlyZSBpbnB1dCBidWZmZXIgdG8gdGhlIG91dHB1dCBidWZmZXIuCisgICAgICBzdHJlYW1zaXplIF9fbiA9IF9fZGVzdC0+c3B1dG4oX19maXJzdCwgX19leHRyYWN0X2RlbGltICYmIF9fbGFzdCAhPSBfX3NyYy0+X01fZWdwdHIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKF9fbGFzdCAtIF9fZmlyc3QpICsgMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKF9fbGFzdCAtIF9fZmlyc3QpKTsKKyAgICAgIF9fc3JjLT5fTV9nYnVtcCgoaW50KV9fbik7CisgICAgICBfX2V4dHJhY3RlZCArPSBfX247CisKKyAgICAgIC8vIGZyb20gdGhpcyBvbiwgY2F0Y2goKSB3aWxsIGNhbGwgX01faGFuZGxlX2V4Y2VwdGlvbnMoKQorICAgICAgX19kb19oYW5kbGVfZXhjZXB0aW9ucyA9IHRydWU7CisKKyAgICAgIGlmIChfX24gPCBfX2F2YWlsKSAgICAgICAgICAvLyBXZSBmb3VuZCB0aGUgZGVsaW1pdGVyLCBvciBlbHNlIGZhaWxlZCB0bworICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgc29tZSBjaGFyYWN0ZXJzLgorCisgICAgICBfX2MgPSBfX3NyYy0+c2dldGMoKTsKKworICAgICAgLy8gVGhyZWUgcG9zc2liaWxpdGllczogd2Ugc3VjY2VlZGVkIGluIHJlZmlsbGluZyB0aGUgYnVmZmVyLCBvcgorICAgICAgLy8gd2UgZ290IEVPRiwgb3IgdGhlIHN0cmVhbWJ1ZiBoYXMgc3dpdGNoZWQgdG8gdW5idWZmZXJlZCBtb2RlLgorICAgICAgX19maXJzdCA9IF9fc3JjLT5fTV9ncHRyKCk7CisgICAgICBfX2F2YWlsID0gX19zcmMtPl9NX2VncHRyKCkgLSBfX2ZpcnN0OworCisgICAgICBpZiAoX19hdmFpbCA+IDApCisgICAgICAgIHt9ICAvLyBkd2EgMS8xNi8wMCAtLSBzdXBwcmVzcyBhIE1ldHJvd2Vya3Mgd2FybmluZworICAgICAgZWxzZSBpZiAoX190aGF0LT5fU19lb2YoX19jKSkgeworICAgICAgICBfX3N0YXR1cyB8PSBpb3NfYmFzZTo6ZW9mYml0OworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICByZXR1cm4gX19leHRyYWN0ZWQgKyBfX2NvcHlfdW5idWZmZXJlZChfX3RoYXQsICBfX3NyYywgX19kZXN0LCBfX2lzX2RlbGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19leHRyYWN0X2RlbGltLCBfX3JldGhyb3cpOworICAgICAgfQorCisgICAgICBfX2RvX2hhbmRsZV9leGNlcHRpb25zID0gZmFsc2U7CisgICAgfQorICB9CisKKyAgX1NUTFBfQ0FUQ0hfQUxMIHsKKyAgICAvLyBTZWUgMjcuNi4xLjIuMywgcGFyYWdyYXBoIDEzLgorICAgIGlmIChfX3JldGhyb3cgJiYgX19kb19oYW5kbGVfZXhjZXB0aW9ucyAmJiAgX19leHRyYWN0ZWQgPT0gMCkKKyAgICAgIF9fdGhhdC0+X01faGFuZGxlX2V4Y2VwdGlvbihpb3NfYmFzZTo6ZmFpbGJpdCk7CisgIH0KKworICBpZiAoX19zdGF0dXMpCisgICAgX190aGF0LT5zZXRzdGF0ZShfX3N0YXR1cyk7ICAgLy8gVGhpcyBtaWdodCB0aHJvdy4KKyAgcmV0dXJuIF9fZXh0cmFjdGVkOworfQorCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPgorICA6OmdldChiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiYgX19kZXN0LCBfQ2hhclQgX19kZWxpbSkgeworICBzZW50cnkgX19zZW50cnkoKnRoaXMsIF9Ob19Ta2lwX1dTKCkpOworICB0aGlzLT5fTV9nY291bnQgPSAwOworCisgIGlmIChfX3NlbnRyeSkgeworICAgIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX3NyYyA9IHRoaXMtPnJkYnVmKCk7CisKKyAgICBpZiAoX19zcmMpCisgICAgICB0aGlzLT5fTV9nY291bnQgPSBfX3NyYy0+ZWdwdHIoKSAhPSBfX3NyYy0+Z3B0cigpCisgICAgICAgID8gX1NUTFBfUFJJViBfX2NvcHlfYnVmZmVyZWQodGhpcywgIF9fc3JjLCAmX19kZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX1NjYW5fZm9yX2NoYXJfdmFsPF9UcmFpdHM+KF9fZGVsaW0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX0VxX2NoYXJfYm91bmQ8X1RyYWl0cz4oX19kZWxpbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlKQorICAgICAgICA6IF9TVExQX1BSSVYgX19jb3B5X3VuYnVmZmVyZWQodGhpcywgIF9fc3JjLCAmX19kZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfRXFfY2hhcl9ib3VuZDxfVHJhaXRzPihfX2RlbGltKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSk7CisgIH0KKworICBpZiAodGhpcy0+X01fZ2NvdW50ID09IDApCisgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworCisgIHJldHVybiAqdGhpczsKK30KKworLy8gQ29weWluZyBjaGFyYWN0ZXJzIGludG8gYSBzdHJlYW1idWYuCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+CisgIDo6b3BlcmF0b3I+PihiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19kZXN0KSB7CisgIHN0cmVhbXNpemUgX19uID0gMDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OnNlbnRyeSBfU2VudHJ5OworICBfU2VudHJ5IF9fc2VudHJ5KCp0aGlzKTsKKyAgaWYgKF9fc2VudHJ5KSB7CisgICAgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fc3JjID0gdGhpcy0+cmRidWYoKTsKKyAgICBpZiAoX19zcmMgJiYgX19kZXN0KQorICAgICAgX19uID0gX19zcmMtPmVncHRyKCkgIT0gX19zcmMtPmdwdHIoKQorICAgICAgICA/IF9TVExQX1BSSVYgX19jb3B5X2J1ZmZlcmVkKHRoaXMsICBfX3NyYywgX19kZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX1Byb2plY3QybmQ8Y29uc3QgX0NoYXJUKiwgY29uc3QgX0NoYXJUKj4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9Db25zdGFudF91bmFyeV9mdW48Ym9vbCwgaW50X3R5cGU+KGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgdHJ1ZSkKKyAgICAgICAgOiBfU1RMUF9QUklWIF9fY29weV91bmJ1ZmZlcmVkKHRoaXMsICBfX3NyYywgX19kZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfQ29uc3RhbnRfdW5hcnlfZnVuPGJvb2wsIGludF90eXBlPihmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgdHJ1ZSk7CisgIH0KKworICBpZiAoX19uID09IDApCisgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworCisgIHJldHVybiAqdGhpczsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gYmFzaWNfaW9zdHJlYW08PiBjbGFzcworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfaW9zdHJlYW08X0NoYXJULCBfVHJhaXRzPgorICA6OmJhc2ljX2lvc3RyZWFtKGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX2J1ZikKKyAgICA6IGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+KCksCisgICAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4oX19idWYpLAorICAgICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+KF9fYnVmKSB7CisgIHRoaXMtPmluaXQoX19idWYpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfaW9zdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6fmJhc2ljX2lvc3RyZWFtKCkKK3t9CisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI3VuZGVmIF9fQklTX2ludF90eXBlX18KKyN1bmRlZiBfX0JJU19wb3NfdHlwZV9fCisjdW5kZWYgX19CSVNfb2ZmX3R5cGVfXworCisjZW5kaWYgLyogX1NUTFBfSVNUUkVBTV9DICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9faXN0cmVhbS5oIGIvc3RscG9ydC9zdGwvX2lzdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjM4ZDAzCi0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvX2lzdHJlYW0uaApAQCAtMCwwICsxLDM1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfSVNUUkVBTQorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9JU1RSRUFNCisKKy8vIHRoaXMgYmxvY2sgaXMgaW5jbHVkZWQgYnkgX29zdHJlYW0uaCwgd2UgaW5jbHVkZSBpdCBoZXJlIHRvIGxvd2VyICNpbmNsdWRlIGxldmVsCisjaWYgZGVmaW5lZCAoX1NUTFBfSEFTX1dDSEFSX1QpICYmICFkZWZpbmVkIChfU1RMUF9JTlRFUk5BTF9DV0NIQVIpCisjICBpbmNsdWRlIDxzdGwvX2N3Y2hhci5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfSU9TX0gKKyMgIGluY2x1ZGUgPHN0bC9faW9zLmg+ICAgICAgICAgICAgICAgICAgLy8gRm9yIGJhc2ljX2lvczw+LiAgSW5jbHVkZXMgPGlvc2Z3ZD4uCisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9PU1RSRUFNX0gKKyMgIGluY2x1ZGUgPHN0bC9fb3N0cmVhbS5oPiAgICAgICAgICAgICAgLy8gTmVlZGVkIGFzIGEgYmFzZSBjbGFzcyBvZiBiYXNpY19pb3N0cmVhbS4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0lTVFJFQU1CVUZfSVRFUkFUT1JfSAorIyAgaW5jbHVkZSA8c3RsL19pc3RyZWFtYnVmX2l0ZXJhdG9yLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0bC9fY3RyYWl0c19mbnMuaD4gICAgLy8gSGVscGVyIGZ1bmN0aW9ucyB0aGF0IGFsbG93IGNoYXIgdHJhaXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGJlIHVzZWQgYXMgZnVuY3Rpb24gb2JqZWN0cy4KK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCkKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitjbGFzcyBfSXNlbnRyeTsKKyNlbmRpZgorCitzdHJ1Y3QgX05vX1NraXBfV1Mge307ICAgICAgICAvLyBEdW1teSBjbGFzcyB1c2VkIGJ5IHNlbnRyeS4KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jvb2wgX01faW5pdF9za2lwKGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pc3RyKTsKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Citib29sIF9NX2luaXRfbm9za2lwKGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pc3RyKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDbGFzcyBiYXNpY19pc3RyZWFtLCBhIGNsYXNzIHRoYXQgcGVyZm9ybXMgZm9ybWF0dGVkIGlucHV0IHRocm91Z2gKKy8vIGEgc3RyZWFtIGJ1ZmZlci4KKworLy8gVGhlIHNlY29uZCB0ZW1wbGF0ZSBwYXJhbWV0ZXIsIF9UcmFpdHMsIGRlZmF1bHRzIHRvIGNoYXJfdHJhaXRzPF9DaGFyVD4uCisvLyBUaGUgZGVmYXVsdCBpcyBkZWNsYXJlZCBpbiBoZWFkZXIgPGlvc2Z3ZD4sIGFuZCBpdCBpc24ndCBkZWNsYXJlZCBoZXJlCisvLyBiZWNhdXNlIEMrKyBsYW5ndWFnZSBydWxlcyBkbyBub3QgYWxsb3cgaXQgdG8gYmUgZGVjbGFyZWQgdHdpY2UuCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitjbGFzcyBiYXNpY19pc3RyZWFtIDogdmlydHVhbCBwdWJsaWMgYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz4geworICB0eXBlZGVmIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiBfU2VsZjsKKworI2lmIGRlZmluZWQgKF9TVExQX01TVkMpICYmIChfU1RMUF9NU1ZDID49IDEzMDAgJiYgX1NUTFBfTVNWQyA8PSAxMzEwKQorICAvL2V4cGxpY2l0ZWx5IGRlZmluZWQgYXMgcHJpdmF0ZSB0byBhdm9pZCB3YXJuaW5nczoKKyAgYmFzaWNfaXN0cmVhbShfU2VsZiBjb25zdCYpOworICBfU2VsZiYgb3BlcmF0b3IgPSAoX1NlbGYgY29uc3QmKTsKKyNlbmRpZgorCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHlwZXMKKyAgdHlwZWRlZiBfQ2hhclQgICAgICAgICAgICAgICAgICAgICBjaGFyX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6aW50X3R5cGUgaW50X3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6cG9zX3R5cGUgcG9zX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6b2ZmX3R5cGUgb2ZmX3R5cGU7CisgIHR5cGVkZWYgX1RyYWl0cyAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3R5cGU7CisgIHR5cGVkZWYgYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz4gICAgIF9CYXNpY19pb3M7CisKKyAgdHlwZWRlZiBiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPiYgKF9TVExQX0NBTEwgKl9faW9zX2ZuKShiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPiYpOworICB0eXBlZGVmIGlvc19iYXNlJiAoX1NUTFBfQ0FMTCAqX19pb3NfYmFzZV9mbikoaW9zX2Jhc2UmKTsKKyAgdHlwZWRlZiBfU2VsZiYgKF9TVExQX0NBTEwgKl9faXN0cmVhbV9mbikoX1NlbGYmKTsKKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3Rvci4KKyAgZXhwbGljaXQgYmFzaWNfaXN0cmVhbShiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19idWYpIDoKKyAgICBiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPigpLCBfTV9nY291bnQoMCkgeworICAgIHRoaXMtPmluaXQoX19idWYpOworICB9CisgIH5iYXNpY19pc3RyZWFtKCkge307CisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmVzdGVkIHNlbnRyeSBjbGFzcy4KKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIb29rcyBmb3IgbWFuaXB1bGF0b3JzLiAgVGhlIGFyZ3VtZW50cyBhcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnVuY3Rpb24gcG9pbnRlcnMuCisgIF9TZWxmJiBvcGVyYXRvcj4+IChfX2lzdHJlYW1fZm4gX19mKSB7IHJldHVybiBfX2YoKnRoaXMpOyB9CisgIF9TZWxmJiBvcGVyYXRvcj4+IChfX2lvc19mbiBfX2YpIHsgIF9fZigqdGhpcyk7IHJldHVybiAqdGhpczsgfQorICBfU2VsZiYgb3BlcmF0b3I+PiAoX19pb3NfYmFzZV9mbiBfX2YpIHsgX19mKCp0aGlzKTsgcmV0dXJuICp0aGlzOyB9CisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9ybWF0dGVkIGlucHV0IG9mIG51bWJlcnMuCisgIF9TZWxmJiBvcGVyYXRvcj4+IChzaG9ydCYgX192YWwpOworICBfU2VsZiYgb3BlcmF0b3I+PiAoaW50JiBfX3ZhbCk7CisgIF9TZWxmJiBvcGVyYXRvcj4+ICh1bnNpZ25lZCBzaG9ydCYgX192YWwpOworICBfU2VsZiYgb3BlcmF0b3I+PiAodW5zaWduZWQgaW50JiBfX3ZhbCk7CisgIF9TZWxmJiBvcGVyYXRvcj4+IChsb25nJiBfX3ZhbCk7CisgIF9TZWxmJiBvcGVyYXRvcj4+ICh1bnNpZ25lZCBsb25nJiBfX3ZhbCk7CisjaWZkZWYgX1NUTFBfTE9OR19MT05HCisgIF9TZWxmJiBvcGVyYXRvcj4+IChfU1RMUF9MT05HX0xPTkcmIF9fdmFsKTsKKyAgX1NlbGYmIG9wZXJhdG9yPj4gKHVuc2lnbmVkIF9TVExQX0xPTkdfTE9ORyYgX192YWwpOworI2VuZGlmCisgIF9TZWxmJiBvcGVyYXRvcj4+IChmbG9hdCYgX192YWwpOworICBfU2VsZiYgb3BlcmF0b3I+PiAoZG91YmxlJiBfX3ZhbCk7CisjIGlmbmRlZiBfU1RMUF9OT19MT05HX0RPVUJMRQorICBfU2VsZiYgb3BlcmF0b3I+PiAobG9uZyBkb3VibGUmIF9fdmFsKTsKKyMgZW5kaWYKKyMgaWZuZGVmIF9TVExQX05PX0JPT0wKKyAgX1NlbGYmIG9wZXJhdG9yPj4gKGJvb2wmIF9fdmFsKTsKKyMgZW5kaWYKKyAgX1NlbGYmIG9wZXJhdG9yPj4gKHZvaWQqJiBfX3ZhbCk7CisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29weWluZyBjaGFyYWN0ZXJzIGludG8gYSBzdHJlYW1idWYuCisgIF9TZWxmJiBvcGVyYXRvcj4+KGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+Kik7CisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gVW5mb3JtYXR0ZWQgaW5wdXQuCisgIHN0cmVhbXNpemUgZ2NvdW50KCkgY29uc3QgeyByZXR1cm4gX01fZ2NvdW50OyB9CisgIGludF90eXBlIHBlZWsoKTsKKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQoKSBmb3Igc2luZ2xlIGNoYXJhY3RlcnMKKyAgaW50X3R5cGUgZ2V0KCk7CisgIF9TZWxmJiBnZXQoY2hhcl90eXBlJiBfX2MpOworCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCgpIGZvciBjaGFyYWN0ZXIgYXJyYXlzLgorICBfU2VsZiYgZ2V0KGNoYXJfdHlwZSogX19zLCBzdHJlYW1zaXplIF9fbiwgY2hhcl90eXBlIF9fZGVsaW0pOworICBfU2VsZiYgZ2V0KGNoYXJfdHlwZSogX19zLCBzdHJlYW1zaXplIF9fbikKKyAgICB7IHJldHVybiBnZXQoX19zLCBfX24sIHRoaXMtPndpZGVuKCdcbicpKTsgfQorCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCgpIGZvciBzdHJlYW1idWZzCisgIF9TZWxmJiBnZXQoYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4mIF9fYnVmLAorICAgICAgICAgICAgICAgICAgICAgY2hhcl90eXBlIF9fZGVsaW0pOworICBfU2VsZiYgZ2V0KGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+JiBfX2J1ZikKKyAgICB7IHJldHVybiBnZXQoX19idWYsIHRoaXMtPndpZGVuKCdcbicpKTsgfQorCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldGxpbmUoKQorICBfU2VsZiYgZ2V0bGluZShjaGFyX3R5cGUqIF9fcywgc3RyZWFtc2l6ZSBfX24sIGNoYXJfdHlwZSBkZWxpbSk7CisgIF9TZWxmJiBnZXRsaW5lKGNoYXJfdHlwZSogX19zLCBzdHJlYW1zaXplIF9fbikKKyAgICB7IHJldHVybiBnZXRsaW5lKF9fcywgX19uLCB0aGlzLT53aWRlbignXG4nKSk7IH0KKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWFkKCksIHJlYWRzb21lKCksIGlnbm9yZSgpCisgIF9TZWxmJiBpZ25vcmUoKTsKKyAgX1NlbGYmIGlnbm9yZShzdHJlYW1zaXplIF9fbik7CisgIF9TZWxmJiBpZ25vcmUoc3RyZWFtc2l6ZSBfX24sIGludF90eXBlIF9fZGVsaW0pOworCisgIF9TZWxmJiByZWFkKGNoYXJfdHlwZSogX19zLCBzdHJlYW1zaXplIF9fbik7CisgIHN0cmVhbXNpemUgcmVhZHNvbWUoY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uKTsKKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwdXRiYWNrCisgIF9TZWxmJiBwdXRiYWNrKGNoYXJfdHlwZSBfX2MpOworICBfU2VsZiYgdW5nZXQoKTsKKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQb3NpdGlvbmluZyBhbmQgYnVmZmVyIGNvbnRyb2wuCisgIGludCBzeW5jKCk7CisKKyAgcG9zX3R5cGUgdGVsbGcoKTsKKyAgX1NlbGYmIHNlZWtnKHBvc190eXBlIF9fcG9zKTsKKyAgX1NlbGYmIHNlZWtnKG9mZl90eXBlLCBpb3NfYmFzZTo6c2Vla2Rpcik7CisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3Igbm9uLW1lbWJlciBleHRyYWN0b3JzLgorICB2b2lkIF9NX2Zvcm1hdHRlZF9nZXQoX0NoYXJUJiBfX2MpOworICB2b2lkIF9NX2Zvcm1hdHRlZF9nZXQoX0NoYXJUKiBfX3MpOworICB2b2lkIF9NX3NraXBfd2hpdGVzcGFjZShib29sIF9fc2V0X2ZhaWxiaXQpOworCitwcml2YXRlOiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE51bWJlciBvZiBjaGFyYWN0ZXJzIGV4dHJhY3RlZCBieSB0aGUKKyAgc3RyZWFtc2l6ZSBfTV9nY291bnQ7ICAgICAgICAgLy8gbW9zdCByZWNlbnQgdW5mb3JtYXR0ZWQgaW5wdXQgZnVuY3Rpb24uCisKK3B1YmxpYzoKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9URU1QTEFURV9FWFBPUlQpCisgIC8vIElmIHdlIGFyZSB1c2luZyBETEwgc3BlY3MsIHdlIGhhdmUgbm90IHRvIHVzZSBpbm5lciBjbGFzc2VzCisgIC8vIGVuZCBjbGFzcyBkZWNsYXJhdGlvbiBoZXJlCisgIHR5cGVkZWYgX0lzZW50cnk8X0NoYXJULCBfVHJhaXRzPiAgICAgIHNlbnRyeTsKK307CisjICBkZWZpbmUgc2VudHJ5IF9Jc2VudHJ5Cit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorY2xhc3MgX0lzZW50cnkgeworICB0eXBlZGVmIF9Jc2VudHJ5PF9DaGFyVCwgX1RyYWl0cz4gX1NlbGY7CisjIGVsc2UKKyAgY2xhc3Mgc2VudHJ5IHsKKyAgICB0eXBlZGVmIHNlbnRyeSBfU2VsZjsKKyNlbmRpZgorCisgIHByaXZhdGU6CisgICAgY29uc3QgYm9vbCBfTV9vazsKKyAgICAvLyAgICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX01fYnVmOworCisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIF9UcmFpdHMgdHJhaXRzX3R5cGU7CisKKyAgICBleHBsaWNpdCBzZW50cnkoYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzdHIsCisgICAgICAgICAgICAgICAgICAgIGJvb2wgX19ub3NraXB3cyA9IGZhbHNlKSA6CisgICAgICBfTV9vaygoX19ub3NraXB3cyB8fCAhKF9faXN0ci5mbGFncygpICYgaW9zX2Jhc2U6OnNraXB3cykpID8gX01faW5pdF9ub3NraXAoX19pc3RyKSA6IF9NX2luaXRfc2tpcChfX2lzdHIpICkKKyAgICAgIC8qICwgX01fYnVmKF9faXN0ci5yZGJ1ZigpKSAqLworICAgICAge30KKworICAgIC8vIENhbGxpbmcgdGhpcyBjb25zdHJ1Y3RvciBpcyB0aGUgc2FtZSBhcyBjYWxsaW5nIHRoZSBwcmV2aW91cyBvbmUgd2l0aAorICAgIC8vIF9fbm9za2lwd3MgPSB0cnVlLCBleGNlcHQgdGhhdCBpdCBkb2Vzbid0IHJlcXVpcmUgYSBydW50aW1lIHRlc3QuCisgICAgc2VudHJ5KGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pc3RyLCBfTm9fU2tpcF9XUykgOiAvKiBfTV9idWYoX19pc3RyLnJkYnVmKCkpLCAqLworICAgICAgX01fb2soX01faW5pdF9ub3NraXAoX19pc3RyKSkge30KKworICAgIH5zZW50cnkoKSB7fQorCisgICAgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIF9NX29rOyB9CisKKyAgcHJpdmF0ZTogICAgICAgICAgICAgICAgICAgICAgICAvLyBEaXNhYmxlIGFzc2lnbm1lbnQgYW5kIGNvcHkgY29uc3RydWN0b3IuCisgICAgLy9JbXBsZW1lbnRhdGlvbiBpcyBoZXJlIG9ubHkgdG8gYXZvaWQgd2FybmluZyB3aXRoIHNvbWUgY29tcGlsZXJzLgorICAgIHNlbnRyeShjb25zdCBfU2VsZiYpIDogX01fb2soZmFsc2UpIHt9CisgICAgX1NlbGYmIG9wZXJhdG9yPShjb25zdCBfU2VsZiYpIHsgcmV0dXJuICp0aGlzOyB9CisgIH07CisKKyMgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCkKKyMgIHVuZGVmIHNlbnRyeQorIyBlbHNlCisgIC8vIGNsb3NlIGJhc2ljX2lzdHJlYW0gY2xhc3MgZGVmaW5pdGlvbiBoZXJlCit9OworIyBlbmRpZgorCisjIGlmIGRlZmluZWQgKF9TVExQX1VTRV9URU1QTEFURV9FWFBPUlQpCitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgX0lzZW50cnk8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPjsKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBiYXNpY19pc3RyZWFtPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID47CisjICBpZiAhIGRlZmluZWQgKF9TVExQX05PX1dDSEFSX1QpCitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgX0lzZW50cnk8d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPjsKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBiYXNpY19pc3RyZWFtPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID47CisjICBlbmRpZgorIyBlbmRpZiAvKiBfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUICovCisKKy8vIE5vbi1tZW1iZXIgY2hhcmFjdGVyIGFuZCBzdHJpbmcgZXh0cmFjdG9yIGZ1bmN0aW9ucy4KK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfU1RMUF9DQUxMCitvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pbl9zdHIsIF9DaGFyVCYgX19jKSB7CisgIF9faW5fc3RyLl9NX2Zvcm1hdHRlZF9nZXQoX19jKTsKKyAgcmV0dXJuIF9faW5fc3RyOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RyYWl0cz4KK2lubGluZSBiYXNpY19pc3RyZWFtPGNoYXIsIF9UcmFpdHM+JiBfU1RMUF9DQUxMCitvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08Y2hhciwgX1RyYWl0cz4mIF9faW5fc3RyLCB1bnNpZ25lZCBjaGFyJiBfX2MpIHsKKyAgX19pbl9zdHIuX01fZm9ybWF0dGVkX2dldChfX1JFSU5URVJQUkVUX0NBU1QoY2hhciYsX19jKSk7CisgIHJldHVybiBfX2luX3N0cjsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcmFpdHM+CitpbmxpbmUgYmFzaWNfaXN0cmVhbTxjaGFyLCBfVHJhaXRzPiYgX1NUTFBfQ0FMTAorb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPGNoYXIsIF9UcmFpdHM+JiBfX2luX3N0ciwgc2lnbmVkIGNoYXImIF9fYykgeworICBfX2luX3N0ci5fTV9mb3JtYXR0ZWRfZ2V0KF9fUkVJTlRFUlBSRVRfQ0FTVChjaGFyJixfX2MpKTsKKyAgcmV0dXJuIF9faW5fc3RyOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgoraW5saW5lIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX1NUTFBfQ0FMTAorb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faW5fc3RyLCBfQ2hhclQqIF9fcykgeworICBfX2luX3N0ci5fTV9mb3JtYXR0ZWRfZ2V0KF9fcyk7CisgIHJldHVybiBfX2luX3N0cjsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcmFpdHM+CitpbmxpbmUgYmFzaWNfaXN0cmVhbTxjaGFyLCBfVHJhaXRzPiYgX1NUTFBfQ0FMTAorb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPGNoYXIsIF9UcmFpdHM+JiBfX2luX3N0ciwgdW5zaWduZWQgY2hhciogX19zKSB7CisgIF9faW5fc3RyLl9NX2Zvcm1hdHRlZF9nZXQoX19SRUlOVEVSUFJFVF9DQVNUKGNoYXIqLF9fcykpOworICByZXR1cm4gX19pbl9zdHI7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHJhaXRzPgoraW5saW5lIGJhc2ljX2lzdHJlYW08Y2hhciwgX1RyYWl0cz4mIF9TVExQX0NBTEwKK29wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxjaGFyLCBfVHJhaXRzPiYgX19pbl9zdHIsIHNpZ25lZCBjaGFyKiBfX3MpIHsKKyAgX19pbl9zdHIuX01fZm9ybWF0dGVkX2dldChfX1JFSU5URVJQUkVUX0NBU1QoY2hhciosX19zKSk7CisgIHJldHVybiBfX2luX3N0cjsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBpc3RyZWFtIG1hbmlwdWxhdG9yLgordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX1NUTFBfQ0FMTAord3MoYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzdHIpIHsKKyAgaWYgKCFfX2lzdHIuZW9mKCkpIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6c2VudHJ5ICAgICAgX1NlbnRyeTsKKyAgICBfU2VudHJ5IF9fc2VudHJ5KF9faXN0ciwgX05vX1NraXBfV1MoKSk7IC8vIERvbid0IHNraXAgd2hpdGVzcGFjZS4KKyAgICBpZiAoX19zZW50cnkpCisgICAgICBfX2lzdHIuX01fc2tpcF93aGl0ZXNwYWNlKGZhbHNlKTsKKyAgfQorICByZXR1cm4gX19pc3RyOworfQorCisvLyBIZWxwZXIgZnVuY3Rpb25zIGZvciBpc3RyZWFtPD46OnNlbnRyeSBjb25zdHJ1Y3Rvci4KK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUgYm9vbCBfTV9pbml0X3NraXAoYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzdHIpIHsKKyAgaWYgKF9faXN0ci5nb29kKCkpIHsKKyAgICBpZiAoX19pc3RyLnRpZSgpKQorICAgICAgX19pc3RyLnRpZSgpLT5mbHVzaCgpOworCisgICAgX19pc3RyLl9NX3NraXBfd2hpdGVzcGFjZSh0cnVlKTsKKyAgfQorCisgIGlmICghX19pc3RyLmdvb2QoKSkgeworICAgIF9faXN0ci5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9IGVsc2UKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2lubGluZSBib29sIF9NX2luaXRfbm9za2lwKGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pc3RyKSB7CisgIGlmIChfX2lzdHIuZ29vZCgpKSB7CisgICAgaWYgKF9faXN0ci50aWUoKSkKKyAgICAgIF9faXN0ci50aWUoKS0+Zmx1c2goKTsKKworICAgIGlmICghX19pc3RyLnJkYnVmKCkpCisgICAgICBfX2lzdHIuc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CisgIH0KKyAgZWxzZQorICAgIF9faXN0ci5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7CisgIHJldHVybiBfX2lzdHIuZ29vZCgpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENsYXNzIGlvc3RyZWFtLgordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2NsYXNzIGJhc2ljX2lvc3RyZWFtCisgIDogcHVibGljIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiwKKyAgICBwdWJsaWMgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Cit7CitwdWJsaWM6CisgIHR5cGVkZWYgYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz4gX0Jhc2ljX2lvczsKKworICBleHBsaWNpdCBiYXNpY19pb3N0cmVhbShiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19idWYpOworICB2aXJ0dWFsIH5iYXNpY19pb3N0cmVhbSgpOworfTsKKworIyBpZiBkZWZpbmVkIChfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUKQorX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIGJhc2ljX2lvc3RyZWFtPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID47CisKKyMgIGlmICEgZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBiYXNpY19pb3N0cmVhbTx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+OworIyAgZW5kaWYKKyMgZW5kaWYgLyogX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCAqLworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9TVExQX0NBTEwgX01fZ2V0X2lzdHJlYW1idWYoYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzdHIpCit7IHJldHVybiBfX2lzdHIucmRidWYoKTsgfQorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNpZiBkZWZpbmVkIChfU1RMUF9FWFBPU0VfU1RSRUFNX0lNUExFTUVOVEFUSU9OKSAmJiAhZGVmaW5lZCAoX1NUTFBfTElOS19USU1FX0lOU1RBTlRJQVRJT04pCisjICBpbmNsdWRlIDxzdGwvX2lzdHJlYW0uYz4KKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfSVNUUkVBTSAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdGwvX2lzdHJlYW1idWZfaXRlcmF0b3IuaCBiL3N0bHBvcnQvc3RsL19pc3RyZWFtYnVmX2l0ZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYzNDBjYgotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc3RsL19pc3RyZWFtYnVmX2l0ZXJhdG9yLmgKQEAgLTAsMCArMSwxNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisvLyBXQVJOSU5HOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBDKysKKy8vIHN0YW5kYXJkIGxpYnJhcnkgaGVhZGVycy4gIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIHRoaXMgaGVhZGVyCisvLyBmaWxlIGRpcmVjdGx5LgorCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfSVNUUkVBTUJVRl9JVEVSQVRPUl9ICisjZGVmaW5lIF9TVExQX0lOVEVSTkFMX0lTVFJFQU1CVUZfSVRFUkFUT1JfSAorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0lURVJBVE9SX0JBU0VfSAorIyBpbmNsdWRlIDxzdGwvX2l0ZXJhdG9yX2Jhc2UuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX1NUUkVBTUJVRgorIyBpbmNsdWRlIDxzdGwvX3N0cmVhbWJ1Zi5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisvLyBkZWZpbmVkIGluIF9pc3RyZWFtLmgKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitleHRlcm4gYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9TVExQX0NBTEwgX01fZ2V0X2lzdHJlYW1idWYoYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiApIDsKKworLy8gV2UgZG8gbm90IHJlYWQgYW55IGNoYXJhY3RlcnMgdW50aWwgb3BlcmF0b3IqIGlzIGNhbGxlZC4gb3BlcmF0b3IqIGNhbGxzIHNnZXRjCisvLyB1bmxlc3MgdGhlIGl0ZXJhdG9yIGlzIHVuY2hhbmdlZCBmcm9tIHRoZSBsYXN0IGNhbGwgaW4gd2hpY2ggY2FzZSBhIGNhY2hlZCB2YWx1ZSBpcworLy8gdXNlZC4gQ2FsbHMgdG8gb3BlcmF0b3IrKyB1c2Ugc2J1bXBjLgorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitjbGFzcyBpc3RyZWFtYnVmX2l0ZXJhdG9yIDoKKyAgcHVibGljIGl0ZXJhdG9yPGlucHV0X2l0ZXJhdG9yX3RhZywgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzOjpvZmZfdHlwZSwgX0NoYXJUKiwgX0NoYXJUJj4KK3sKK3B1YmxpYzoKKyAgdHlwZWRlZiBfQ2hhclQgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX3R5cGU7CisgIHR5cGVkZWYgX1RyYWl0cyAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6aW50X3R5cGUgICAgICAgaW50X3R5cGU7CisgIHR5cGVkZWYgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4gc3RyZWFtYnVmX3R5cGU7CisgIHR5cGVkZWYgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICAgaXN0cmVhbV90eXBlOworCisgIHR5cGVkZWYgaW5wdXRfaXRlcmF0b3JfdGFnICAgICAgICAgICAgICAgaXRlcmF0b3JfY2F0ZWdvcnk7CisgIHR5cGVkZWYgX0NoYXJUICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpvZmZfdHlwZSAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgIHR5cGVkZWYgY29uc3QgX0NoYXJUKiAgICAgICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgdHlwZWRlZiBjb25zdCBfQ2hhclQmICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisKK3B1YmxpYzoKKyAgaXN0cmVhbWJ1Zl9pdGVyYXRvcihzdHJlYW1idWZfdHlwZSogX19wID0gMCkgeyB0aGlzLT5fTV9pbml0KF9fcCk7IH0KKyAgLy8gIGlzdHJlYW1idWZfaXRlcmF0b3IoYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzKSB7IHRoaXMtPl9NX2luaXQoX01fZ2V0X2lzdHJlYW1idWYoX19pcykpOyB9CisgIGlubGluZSBpc3RyZWFtYnVmX2l0ZXJhdG9yKGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcyk7CisKKyAgY2hhcl90eXBlIG9wZXJhdG9yKigpIGNvbnN0IHsgdGhpcy0+X01fZ2V0YygpOyByZXR1cm4gX01fYzsgfQorICBpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVCwgX1RyYWl0cz4mIG9wZXJhdG9yKysoKSB7CisgICAgX01fYnVmLT5zYnVtcGMoKTsKKyAgICBfTV9oYXZlX2MgPSBmYWxzZTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQsIF9UcmFpdHM+ICBvcGVyYXRvcisrKGludCk7CisKKyAgYm9vbCBlcXVhbChjb25zdCBpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVCwgX1RyYWl0cz4mIF9faSkgY29uc3QgeworICAgIGlmICh0aGlzLT5fTV9idWYpCisgICAgICB0aGlzLT5fTV9nZXRjKCk7CisgICAgaWYgKF9faS5fTV9idWYpCisgICAgICBfX2kuX01fZ2V0YygpOworICAgIHJldHVybiB0aGlzLT5fTV9lb2YgPT0gX19pLl9NX2VvZjsKKyAgfQorCitwcml2YXRlOgorICB2b2lkIF9NX2luaXQoc3RyZWFtYnVmX3R5cGUqIF9fcCkgeworICAgIF9NX2J1ZiA9IF9fcDsKKyAgICBfTV9lb2YgPSAoX19wID09IDApOworICAgIF9NX2hhdmVfYyA9IGZhbHNlOworICB9CisKKyAgdm9pZCBfTV9nZXRjKCkgY29uc3QgeworICAgIGlmIChfTV9oYXZlX2MpCisgICAgICByZXR1cm47CisgICAgaW50X3R5cGUgX19jID0gX01fYnVmLT5zZ2V0YygpOworICAgIF9TVExQX01VVEFCTEUoX1NlbGYsIF9NX2MpID0gdHJhaXRzX3R5cGU6OnRvX2NoYXJfdHlwZShfX2MpOworICAgIF9TVExQX01VVEFCTEUoX1NlbGYsIF9NX2VvZikgPSB0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19jLCB0cmFpdHNfdHlwZTo6ZW9mKCkpOworICAgIF9TVExQX01VVEFCTEUoX1NlbGYsIF9NX2hhdmVfYykgPSB0cnVlOworICB9CisKK3ByaXZhdGU6CisgIHN0cmVhbWJ1Zl90eXBlKiBfTV9idWY7CisgIG11dGFibGUgX0NoYXJUIF9NX2M7CisgIG11dGFibGUgYm9vbCBfTV9lb2Y7CisgIG11dGFibGUgYm9vbCBfTV9oYXZlX2M7Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQsIF9UcmFpdHM+Ojppc3RyZWFtYnVmX2l0ZXJhdG9yKGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcykKK3sgdGhpcy0+X01faW5pdChfTV9nZXRfaXN0cmVhbWJ1ZihfX2lzKSk7IH0KKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgoraW5saW5lIGJvb2wgX1NUTFBfQ0FMTCBvcGVyYXRvcj09KGNvbnN0IGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJULCBfVHJhaXRzPiYgX194LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJULCBfVHJhaXRzPiYgX195KSB7CisgIHJldHVybiBfX3guZXF1YWwoX195KTsKK30KKworI2lmZGVmIF9TVExQX1VTRV9TRVBBUkFURV9SRUxPUFNfTkFNRVNQQUNFCisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2lubGluZSBib29sIF9TVExQX0NBTEwgb3BlcmF0b3IhPShjb25zdCBpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVCwgX1RyYWl0cz4mIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVCwgX1RyYWl0cz4mIF9feSkgeworICByZXR1cm4gIV9feC5lcXVhbChfX3kpOworfQorCisjZW5kaWYgLyogX1NUTFBfVVNFX1NFUEFSQVRFX1JFTE9QU19OQU1FU1BBQ0UgKi8KKworIyBpZiBkZWZpbmVkIChfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUKQorX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIGlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPjsKKyMgIGlmIGRlZmluZWQgKElOU1RBTlRJQVRFX1dJREVfU1RSRUFNUykKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBpc3RyZWFtYnVmX2l0ZXJhdG9yPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID47CisjICBlbmRpZgorIyBlbmRpZiAvKiBfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUICovCisKKyMgaWZkZWYgX1NUTFBfVVNFX09MRF9IUF9JVEVSQVRPUl9RVUVSSUVTCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgoraW5saW5lIGlucHV0X2l0ZXJhdG9yX3RhZyBfU1RMUF9DQUxMIGl0ZXJhdG9yX2NhdGVnb3J5KGNvbnN0IGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJULCBfVHJhaXRzPiYpIHsgcmV0dXJuIGlucHV0X2l0ZXJhdG9yX3RhZygpOyB9Cit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgoraW5saW5lIHN0cmVhbW9mZiogX1NUTFBfQ0FMTAorZGlzdGFuY2VfdHlwZShjb25zdCBpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVCwgX1RyYWl0cz4mKSB7IHJldHVybiAoc3RyZWFtb2ZmKikwOyB9Cit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgoraW5saW5lIF9DaGFyVCogX1NUTFBfQ0FMTCB2YWx1ZV90eXBlKGNvbnN0IGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJULCBfVHJhaXRzPiYpIHsgcmV0dXJuIChfQ2hhclQqKTA7IH0KKyMgZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2lzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJULCBfVHJhaXRzPgoraXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQsIF9UcmFpdHM+OjpvcGVyYXRvcisrKGludCkgeworICBfTV9nZXRjKCk7IC8vIF9fdG1wIHNob3VsZCBhdm9pZCBhbnkgZnV0dXJlIGFjdGlvbnMgdW5kZXIKKyAgLy8gdW5kZXJsaW5lZCBidWZmZXItLS1kdXJpbmcgY2FsbCBvZiBvcGVyYXRvciAqKCkKKyAgLy8gKGR1ZSB0byBidWZmZXIgZm9yICp0aGlzIGFuZCBfX3RtcCBhcmUgdGhlIHNhbWUpLgorICBpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVCwgX1RyYWl0cz4gX190bXAgPSAqdGhpczsKKyAgX01fYnVmLT5zYnVtcGMoKTsKKyAgX01faGF2ZV9jID0gZmFsc2U7CisgIHJldHVybiBfX3RtcDsKK30KKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfSVNUUkVBTUJVRl9JVEVSQVRPUl9IICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CisKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL19pdGVyYXRvci5oIGIvc3RscG9ydC9zdGwvX2l0ZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUzYjdiMAotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc3RsL19pdGVyYXRvci5oCkBAIC0wLDAgKzEsMjY1IEBACisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYtMTk5OAorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworLyogTk9URTogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgU1RMIGhlYWRlcnMuCisgKiAgIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LgorICovCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfSVRFUkFUT1JfSAorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9JVEVSQVRPUl9ICisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfSVRFUkFUT1JfQkFTRV9ICisjICBpbmNsdWRlIDxzdGwvX2l0ZXJhdG9yX2Jhc2UuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworI2lmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pCisvLyBUaGlzIGlzIHRoZSBuZXcgdmVyc2lvbiBvZiByZXZlcnNlX2l0ZXJhdG9yLCBhcyBkZWZpbmVkIGluIHRoZQorLy8gIGRyYWZ0IEMrKyBzdGFuZGFyZC4gIEl0IHJlbGllcyBvbiB0aGUgaXRlcmF0b3JfdHJhaXRzIHRlbXBsYXRlLAorLy8gIHdoaWNoIGluIHR1cm4gcmVsaWVzIG9uIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24uICBUaGUgY2xhc3MKKy8vICByZXZlcnNlX2JpZGlyZWN0aW9uYWxfaXRlcmF0b3IgaXMgbm8gbG9uZ2VyIHBhcnQgb2YgdGhlIGRyYWZ0CisvLyAgc3RhbmRhcmQsIGJ1dCBpdCBpcyByZXRhaW5lZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KKwordGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KK2NsYXNzIHJldmVyc2VfaXRlcmF0b3IgOgorICBwdWJsaWMgaXRlcmF0b3I8dHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcj46Oml0ZXJhdG9yX2NhdGVnb3J5LAorICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcj46OnZhbHVlX3R5cGUsCisgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0l0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlLAorICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcj46OnBvaW50ZXIsCisgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0l0ZXJhdG9yPjo6cmVmZXJlbmNlPiB7Citwcm90ZWN0ZWQ6CisgIF9JdGVyYXRvciBjdXJyZW50OworICB0eXBlZGVmIHJldmVyc2VfaXRlcmF0b3I8X0l0ZXJhdG9yPiBfU2VsZjsKK3B1YmxpYzoKKyAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0l0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKyAgLy8gcG9pbnRlciB0eXBlIHJlcXVpcmVkIGZvciBhcnJvdyBvcGVyYXRvciBoaWRkZW4gYmVoaW5kIF9TVExQX0RFRklORV9BUlJPV19PUEVSQVRPUjoKKyAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0l0ZXJhdG9yPjo6cG9pbnRlciBwb2ludGVyOworICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSXRlcmF0b3I+OjpyZWZlcmVuY2UgcmVmZXJlbmNlOworICB0eXBlZGVmIF9JdGVyYXRvciBpdGVyYXRvcl90eXBlOworcHVibGljOgorICByZXZlcnNlX2l0ZXJhdG9yKCkge30KKyAgZXhwbGljaXQgcmV2ZXJzZV9pdGVyYXRvcihpdGVyYXRvcl90eXBlIF9feCkgOiBjdXJyZW50KF9feCkge30KKyAgcmV2ZXJzZV9pdGVyYXRvcihjb25zdCBfU2VsZiYgX194KSA6IGN1cnJlbnQoX194LmN1cnJlbnQpIHt9CisgIF9TZWxmJiBvcGVyYXRvciA9IChjb25zdCBfU2VsZiYgX194KSB7IGN1cnJlbnQgPSBfX3guYmFzZSgpOyByZXR1cm4gKnRoaXM7IH0KKyMgIGlmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIHRlbXBsYXRlIDxjbGFzcyBfSXRlcj4KKyAgcmV2ZXJzZV9pdGVyYXRvcihjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyPiYgX194KSA6IGN1cnJlbnQoX194LmJhc2UoKSkge30KKyAgdGVtcGxhdGUgPGNsYXNzIF9JdGVyPgorICBfU2VsZiYgb3BlcmF0b3IgPSAoY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcj4mIF9feCkgeyBjdXJyZW50ID0gX194LmJhc2UoKTsgcmV0dXJuICp0aGlzOyB9CisjICBlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisKKyAgaXRlcmF0b3JfdHlwZSBiYXNlKCkgY29uc3QgeyByZXR1cm4gY3VycmVudDsgfQorICByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3QgeworICAgIF9JdGVyYXRvciBfX3RtcCA9IGN1cnJlbnQ7CisgICAgcmV0dXJuICotLV9fdG1wOworICB9CisgIF9TVExQX0RFRklORV9BUlJPV19PUEVSQVRPUgorICBfU2VsZiYgb3BlcmF0b3IrKygpIHsKKyAgICAtLWN1cnJlbnQ7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIF9TZWxmIG9wZXJhdG9yKysoaW50KSB7CisgICAgX1NlbGYgX190bXAgPSAqdGhpczsKKyAgICAtLWN1cnJlbnQ7CisgICAgcmV0dXJuIF9fdG1wOworICB9CisgIF9TZWxmJiBvcGVyYXRvci0tKCkgeworICAgICsrY3VycmVudDsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgX1NlbGYgb3BlcmF0b3ItLShpbnQpIHsKKyAgICBfU2VsZiBfX3RtcCA9ICp0aGlzOworICAgICsrY3VycmVudDsKKyAgICByZXR1cm4gX190bXA7CisgIH0KKworICBfU2VsZiBvcGVyYXRvcisoZGlmZmVyZW5jZV90eXBlIF9fbikgY29uc3QgeyByZXR1cm4gX1NlbGYoY3VycmVudCAtIF9fbik7IH0KKyAgX1NlbGYmIG9wZXJhdG9yKz0oZGlmZmVyZW5jZV90eXBlIF9fbikgeworICAgIGN1cnJlbnQgLT0gX19uOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBfU2VsZiBvcGVyYXRvci0oZGlmZmVyZW5jZV90eXBlIF9fbikgY29uc3QgeyByZXR1cm4gX1NlbGYoY3VycmVudCArIF9fbik7IH0KKyAgX1NlbGYmIG9wZXJhdG9yLT0oZGlmZmVyZW5jZV90eXBlIF9fbikgeworICAgIGN1cnJlbnQgKz0gX19uOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICByZWZlcmVuY2Ugb3BlcmF0b3JbXShkaWZmZXJlbmNlX3R5cGUgX19uKSBjb25zdCB7IHJldHVybiAqKCp0aGlzICsgX19uKTsgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KK2lubGluZSBib29sICBfU1RMUF9DQUxMIG9wZXJhdG9yPT0oY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X0l0ZXJhdG9yPiYgX195KQoreyByZXR1cm4gX194LmJhc2UoKSA9PSBfX3kuYmFzZSgpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yPChjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4mIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X0l0ZXJhdG9yPiYgX195KQoreyByZXR1cm4gX195LmJhc2UoKSA8IF9feC5iYXNlKCk7IH0KKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1NFUEFSQVRFX1JFTE9QU19OQU1FU1BBQ0UpCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgoraW5saW5lIGJvb2wgX1NUTFBfQ0FMTCBvcGVyYXRvciE9KGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X0l0ZXJhdG9yPiYgX194LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X0l0ZXJhdG9yPiYgX195KQoreyByZXR1cm4gIShfX3ggPT0gX195KTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgoraW5saW5lIGJvb2wgX1NUTFBfQ0FMTCBvcGVyYXRvcj4oY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4mIF9feSkKK3sgcmV0dXJuIF9feSA8IF9feDsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgoraW5saW5lIGJvb2wgX1NUTFBfQ0FMTCBvcGVyYXRvcjw9KGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X0l0ZXJhdG9yPiYgX194LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X0l0ZXJhdG9yPiYgX195KQoreyByZXR1cm4gIShfX3kgPCBfX3gpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yPj0oY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3kpCit7IHJldHVybiAhKF9feCA8IF9feSk7IH0KKyMgIGVuZGlmIC8qIF9TVExQX1VTRV9TRVBBUkFURV9SRUxPUFNfTkFNRVNQQUNFICovCisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+CisjICBpZiBkZWZpbmVkIChfX1NVTlBST19DQykKK2lubGluZSBwdHJkaWZmX3QgX1NUTFBfQ0FMTAorIyAgZWxzZQoraW5saW5lIHR5cGVuYW1lIHJldmVyc2VfaXRlcmF0b3I8X0l0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlIF9TVExQX0NBTEwKKyMgIGVuZGlmCitvcGVyYXRvci0oY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3gsCisgICAgICAgICAgY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3kpCit7IHJldHVybiBfX3kuYmFzZSgpIC0gX194LmJhc2UoKTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yLCBjbGFzcyBfRGlmZmVyZW5jZVR5cGU+CitpbmxpbmUgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+ICBfU1RMUF9DQUxMCitvcGVyYXRvcisoX0RpZmZlcmVuY2VUeXBlIG4sY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiB4KQoreyByZXR1cm4geC5vcGVyYXRvcisobik7IH0KKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NvbnRhaW5lcj4KK2NsYXNzIGJhY2tfaW5zZXJ0X2l0ZXJhdG9yCisgIDogcHVibGljIGl0ZXJhdG9yPG91dHB1dF9pdGVyYXRvcl90YWcsIHZvaWQsIHZvaWQsIHZvaWQsIHZvaWQ+IHsKKyAgdHlwZWRlZiBiYWNrX2luc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiBfU2VsZjsKK3Byb3RlY3RlZDoKKyAgLy9jIGlzIGEgU3RhbmRhcmQgbmFtZSAoMjQuNC4yLjEpLCBkbyBubyBtYWtlIGl0IFNUTHBvcnQgbmFtaW5nIGNvbnZlbnRpb24gY29tcGxpYW50LgorICBfQ29udGFpbmVyICpjb250YWluZXI7CitwdWJsaWM6CisgIHR5cGVkZWYgX0NvbnRhaW5lciAgICAgICAgICBjb250YWluZXJfdHlwZTsKKyAgdHlwZWRlZiBvdXRwdXRfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworCisgIGV4cGxpY2l0IGJhY2tfaW5zZXJ0X2l0ZXJhdG9yKF9Db250YWluZXImIF9feCkgOiBjb250YWluZXIoJl9feCkge30KKworICBfU2VsZiYgb3BlcmF0b3I9KGNvbnN0IF9TZWxmJiBfX290aGVyKSB7CisgICAgY29udGFpbmVyID0gX19vdGhlci5jb250YWluZXI7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIF9TZWxmJiBvcGVyYXRvcj0oY29uc3QgdHlwZW5hbWUgX0NvbnRhaW5lcjo6dmFsdWVfdHlwZSYgX192YWwpIHsKKyAgICBjb250YWluZXItPnB1c2hfYmFjayhfX3ZhbCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIF9TZWxmJiBvcGVyYXRvciooKSB7IHJldHVybiAqdGhpczsgfQorICBfU2VsZiYgb3BlcmF0b3IrKygpIHsgcmV0dXJuICp0aGlzOyB9CisgIF9TZWxmICBvcGVyYXRvcisrKGludCkgeyByZXR1cm4gKnRoaXM7IH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfQ29udGFpbmVyPgoraW5saW5lIGJhY2tfaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+ICBfU1RMUF9DQUxMIGJhY2tfaW5zZXJ0ZXIoX0NvbnRhaW5lciYgX194KQoreyByZXR1cm4gYmFja19pbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4oX194KTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NvbnRhaW5lcj4KK2NsYXNzIGZyb250X2luc2VydF9pdGVyYXRvcgorICA6IHB1YmxpYyBpdGVyYXRvcjxvdXRwdXRfaXRlcmF0b3JfdGFnLCB2b2lkLCB2b2lkLCB2b2lkLCB2b2lkPiB7CisgIHR5cGVkZWYgZnJvbnRfaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+IF9TZWxmOworcHJvdGVjdGVkOgorICAvL2MgaXMgYSBTdGFuZGFyZCBuYW1lICgyNC40LjIuMyksIGRvIG5vIG1ha2UgaXQgU1RMcG9ydCBuYW1pbmcgY29udmVudGlvbiBjb21wbGlhbnQuCisgIF9Db250YWluZXIgKmNvbnRhaW5lcjsKK3B1YmxpYzoKKyAgdHlwZWRlZiBfQ29udGFpbmVyICAgICAgICAgIGNvbnRhaW5lcl90eXBlOworICB0eXBlZGVmIG91dHB1dF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CisgIGV4cGxpY2l0IGZyb250X2luc2VydF9pdGVyYXRvcihfQ29udGFpbmVyJiBfX3gpIDogY29udGFpbmVyKCZfX3gpIHt9CisKKyAgX1NlbGYmIG9wZXJhdG9yPShjb25zdCBfU2VsZiYgX19vdGhlcikgeworICAgIGNvbnRhaW5lciA9IF9fb3RoZXIuY29udGFpbmVyOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBfU2VsZiYgb3BlcmF0b3I9KGNvbnN0IHR5cGVuYW1lIF9Db250YWluZXI6OnZhbHVlX3R5cGUmIF9fdmFsKSB7CisgICAgY29udGFpbmVyLT5wdXNoX2Zyb250KF9fdmFsKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgX1NlbGYmIG9wZXJhdG9yKigpIHsgcmV0dXJuICp0aGlzOyB9CisgIF9TZWxmJiBvcGVyYXRvcisrKCkgeyByZXR1cm4gKnRoaXM7IH0KKyAgX1NlbGYgIG9wZXJhdG9yKysoaW50KSB7IHJldHVybiAqdGhpczsgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9Db250YWluZXI+CitpbmxpbmUgZnJvbnRfaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+ICBfU1RMUF9DQUxMIGZyb250X2luc2VydGVyKF9Db250YWluZXImIF9feCkKK3sgcmV0dXJuIGZyb250X2luc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPihfX3gpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ29udGFpbmVyPgorY2xhc3MgaW5zZXJ0X2l0ZXJhdG9yCisgIDogcHVibGljIGl0ZXJhdG9yPG91dHB1dF9pdGVyYXRvcl90YWcsIHZvaWQsIHZvaWQsIHZvaWQsIHZvaWQ+IHsKKyAgdHlwZWRlZiBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4gX1NlbGY7Citwcm90ZWN0ZWQ6CisgIC8vY29udGFpbmVyIGlzIGEgU3RhbmRhcmQgbmFtZSAoMjQuNC4yLjUpLCBkbyBubyBtYWtlIGl0IFNUTHBvcnQgbmFtaW5nIGNvbnZlbnRpb24gY29tcGxpYW50LgorICBfQ29udGFpbmVyICpjb250YWluZXI7CisgIHR5cGVuYW1lIF9Db250YWluZXI6Oml0ZXJhdG9yIF9NX2l0ZXI7CitwdWJsaWM6CisgIHR5cGVkZWYgX0NvbnRhaW5lciAgICAgICAgICBjb250YWluZXJfdHlwZTsKKyAgdHlwZWRlZiBvdXRwdXRfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworICBpbnNlcnRfaXRlcmF0b3IoX0NvbnRhaW5lciYgX194LCB0eXBlbmFtZSBfQ29udGFpbmVyOjppdGVyYXRvciBfX2kpCisgICAgOiBjb250YWluZXIoJl9feCksIF9NX2l0ZXIoX19pKSB7fQorCisgIF9TZWxmJiBvcGVyYXRvcj0oX1NlbGYgY29uc3QmIF9fb3RoZXIpIHsKKyAgICBjb250YWluZXIgPSBfX290aGVyLmNvbnRhaW5lcjsKKyAgICBfTV9pdGVyID0gX19vdGhlci5fTV9pdGVyOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBfU2VsZiYgb3BlcmF0b3I9KGNvbnN0IHR5cGVuYW1lIF9Db250YWluZXI6OnZhbHVlX3R5cGUmIF9fdmFsKSB7CisgICAgX01faXRlciA9IGNvbnRhaW5lci0+aW5zZXJ0KF9NX2l0ZXIsIF9fdmFsKTsKKyAgICArK19NX2l0ZXI7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIF9TZWxmJiBvcGVyYXRvciooKSB7IHJldHVybiAqdGhpczsgfQorICBfU2VsZiYgb3BlcmF0b3IrKygpIHsgcmV0dXJuICp0aGlzOyB9CisgIF9TZWxmJiBvcGVyYXRvcisrKGludCkgeyByZXR1cm4gKnRoaXM7IH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfQ29udGFpbmVyLCBjbGFzcyBfSXRlcmF0b3I+CitpbmxpbmUgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+ICBfU1RMUF9DQUxMCitpbnNlcnRlcihfQ29udGFpbmVyJiBfX3gsIF9JdGVyYXRvciBfX2kpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQ29udGFpbmVyOjppdGVyYXRvciBfX2l0ZXI7CisgIHJldHVybiBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4oX194LCBfX2l0ZXIoX19pKSk7Cit9CisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2lmICEgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikgfHwgZGVmaW5lZCAoX1NUTFBfVVNFX09MRF9IUF9JVEVSQVRPUl9RVUVSSUVTKQorIyAgaW5jbHVkZSA8c3RsL19pdGVyYXRvcl9vbGQuaD4KKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfSVRFUkFUT1JfSCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdGwvX2l0ZXJhdG9yX2Jhc2UuaCBiL3N0bHBvcnQvc3RsL19pdGVyYXRvcl9iYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY1OTA0OAotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc3RsL19pdGVyYXRvcl9iYXNlLmgKQEAgLTAsMCArMSw1MjUgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5Ni0xOTk4CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisvKiBOT1RFOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBTVEwgaGVhZGVycy4KKyAqICAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuCisgKi8KKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9JVEVSQVRPUl9CQVNFX0gKKyNkZWZpbmUgX1NUTFBfSU5URVJOQUxfSVRFUkFUT1JfQkFTRV9ICisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1NURERFRgorIyAgaW5jbHVkZSA8c3RsL19jc3RkZGVmLmg+CisjZW5kaWYKKworLy8jIGlmIGRlZmluZWQgIChfU1RMUF9JTVBPUlRfVkVORE9SX0NTVEQpICYmICEgZGVmaW5lZCAoX1NUTFBfVkVORE9SX0dMT0JBTF9DU1REKQorLy9fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKy8vdXNpbmcgbmFtZXNwYWNlIF9TVExQX1ZFTkRPUl9DU1REOworLy9fU1RMUF9FTkRfTkFNRVNQQUNFCisvLyNlbmRpZiAvKiBfU1RMUF9JTVBPUlRfVkVORE9SX0NTVEQgKi8KKworI2lmICFkZWZpbmVkKF9TVExQX1VTRV9PTERfSFBfSVRFUkFUT1JfUVVFUklFUykgJiYgIWRlZmluZWQoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikKKyMgIGlmbmRlZiBfU1RMUF9UWVBFX1RSQUlUU19ICisjICAgIGluY2x1ZGUgPHN0bC90eXBlX3RyYWl0cy5oPgorIyAgZW5kaWYKKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworc3RydWN0IGlucHV0X2l0ZXJhdG9yX3RhZyB7fTsKK3N0cnVjdCBvdXRwdXRfaXRlcmF0b3JfdGFnIHt9Oworc3RydWN0IGZvcndhcmRfaXRlcmF0b3JfdGFnIDogcHVibGljIGlucHV0X2l0ZXJhdG9yX3RhZyB7fTsKK3N0cnVjdCBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZyA6IHB1YmxpYyBmb3J3YXJkX2l0ZXJhdG9yX3RhZyB7fTsKK3N0cnVjdCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyA6IHB1YmxpYyBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZyB7fTsKKwordGVtcGxhdGUgPGNsYXNzIF9DYXRlZ29yeSwgY2xhc3MgX1RwLCBfU1RMUF9ERkxfVE1QTF9QQVJBTShfRGlzdGFuY2UscHRyZGlmZl90KSwKKyAgICAgICAgICBfU1RMUF9ERkxfVE1QTF9QQVJBTShfUG9pbnRlcixfVHAqKSwgX1NUTFBfREZMX1RNUExfUEFSQU0oX1JlZmVyZW5jZSxfVHAmKSA+CitzdHJ1Y3QgaXRlcmF0b3IgeworICB0eXBlZGVmIF9DYXRlZ29yeSAgaXRlcmF0b3JfY2F0ZWdvcnk7CisgIHR5cGVkZWYgX1RwICAgICAgICB2YWx1ZV90eXBlOworICB0eXBlZGVmIF9EaXN0YW5jZSAgZGlmZmVyZW5jZV90eXBlOworICB0eXBlZGVmIF9Qb2ludGVyICAgcG9pbnRlcjsKKyAgdHlwZWRlZiBfUmVmZXJlbmNlIHJlZmVyZW5jZTsKK307CitfU1RMUF9URU1QTEFURV9OVUxMCitzdHJ1Y3QgaXRlcmF0b3I8b3V0cHV0X2l0ZXJhdG9yX3RhZywgdm9pZCwgdm9pZCwgdm9pZCwgdm9pZD4geworICB0eXBlZGVmIG91dHB1dF9pdGVyYXRvcl90YWcgIGl0ZXJhdG9yX2NhdGVnb3J5OworI2lmZGVmIF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04KKyAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICBwb2ludGVyOworICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworI2VuZGlmCit9OworCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX09MRF9IUF9JVEVSQVRPUl9RVUVSSUVTKQorIyAgZGVmaW5lIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9JdCwgX1RwKSBfU1RMUF9TVEQ6Oml0ZXJhdG9yX2NhdGVnb3J5KF9JdCkKKyMgIGRlZmluZSBfU1RMUF9ESVNUQU5DRV9UWVBFKF9JdCwgX1RwKSAgICAgX1NUTFBfU1REOjpkaXN0YW5jZV90eXBlKF9JdCkKKyMgIGRlZmluZSBfU1RMUF9WQUxVRV9UWVBFKF9JdCwgX1RwKSAgICAgICAgX1NUTFBfU1REOjp2YWx1ZV90eXBlKF9JdCkKKy8vT2xkIEhQIGl0ZXJhdG9yIHF1ZXJpZXMgZG8gbm90IGdpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGl0ZXJhdG9yCisvL2Fzc29jaWF0ZWQgcmVmZXJlbmNlIHR5cGUgc28gd2UgY29uc2lkZXIgdGhhdCBpdCBpcyBub3QgYSByZWFsIHJlZmVyZW5jZS4KKyMgIGRlZmluZSBfU1RMUF9JU19SRUZfVFlQRV9SRUFMX1JFRihfSXQsIF9UcCkgX19mYWxzZV90eXBlKCkKKyNlbHNlCisjICBpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQorIyAgICBkZWZpbmUgX1NUTFBfVkFMVUVfVFlQRShfSXQsIF9UcCkgICAgICAgIChfU1RMUF9UWVBFTkFNRSBfU1RMUF9TVEQ6Oml0ZXJhdG9yX3RyYWl0czwgX1RwID46OnZhbHVlX3R5cGUqKTAKKyMgICAgZGVmaW5lIF9TVExQX0RJU1RBTkNFX1RZUEUoX0l0LCBfVHApICAgICAoX1NUTFBfVFlQRU5BTUUgX1NUTFBfU1REOjppdGVyYXRvcl90cmFpdHM8IF9UcCA+OjpkaWZmZXJlbmNlX3R5cGUqKTAKKyMgICAgaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKSB8fCBkZWZpbmVkIChfX1NVTlBST19DQykgfHwgKCBkZWZpbmVkIChfX01XRVJLU19fKSAmJiAoX19NV0VSS1NfXyA8PSAweDIzMDMpKSB8fCBcCisgICAgICAgKGRlZmluZWQgKF9fc2dpKSAmJiBkZWZpbmVkIChfQ09NUElMRVJfVkVSU0lPTikpIHx8IGRlZmluZWQgKF9fRE1DX18pCisjICAgICAgZGVmaW5lIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9JdCwgX1RwKSBfU1RMUF9TVEQ6Oml0ZXJhdG9yX3RyYWl0czwgX1RwID46Oml0ZXJhdG9yX2NhdGVnb3J5KCkKKyMgICAgZWxzZQorIyAgICAgIGRlZmluZSBfU1RMUF9JVEVSQVRPUl9DQVRFR09SWShfSXQsIF9UcCkgX1NUTFBfVFlQRU5BTUUgX1NUTFBfU1REOjppdGVyYXRvcl90cmFpdHM8IF9UcCA+OjppdGVyYXRvcl9jYXRlZ29yeSgpCisjICAgIGVuZGlmCisjICAgIGRlZmluZSBfU1RMUF9JU19SRUZfVFlQRV9SRUFMX1JFRihfSXQsIF9UcCkgX1NUTFBfU1REOjpfSXNSZWZUeXBlPCBfU1RMUF9UWVBFTkFNRSBfU1RMUF9TVEQ6Oml0ZXJhdG9yX3RyYWl0czwgX1RwID46OnJlZmVyZW5jZSA+OjpfUmV0KCkKKyMgIGVsc2UKKyMgICAgZGVmaW5lIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9JdCwgX1RwKSAgIF9TVExQX1NURDo6X19pdGVyYXRvcl9jYXRlZ29yeShfSXQsIF9TVExQX1NURDo6X0lzUHRyVHlwZTxfVHA+OjpfUmV0KCkpCisjICAgIGRlZmluZSBfU1RMUF9ESVNUQU5DRV9UWVBFKF9JdCwgX1RwKSAgICAgICBfU1RMUF9TVEQ6Ol9fZGlzdGFuY2VfdHlwZShfSXQsIF9TVExQX1NURDo6X0lzUHRyVHlwZTxfVHA+OjpfUmV0KCkpCisjICAgIGRlZmluZSBfU1RMUF9WQUxVRV9UWVBFKF9JdCwgX1RwKSAgICAgICAgICBfU1RMUF9TVEQ6Ol9fdmFsdWVfdHlwZShfSXQsIF9TVExQX1NURDo6X0lzUHRyVHlwZTxfVHA+OjpfUmV0KCkpCisjICAgIGRlZmluZSBfU1RMUF9JU19SRUZfVFlQRV9SRUFMX1JFRihfSXQsIF9UcCkgX19mYWxzZV90eXBlKCkKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX0RPTlRfUkVERUZJTkVfU1REKSAmJiBkZWZpbmVkIChfU1RMUF9XSE9MRV9OQVRJVkVfU1REKQorLyogSW4gdGhpcyBtb2RlIHdlIHdpbGwgc2VlIGJvdGggU1RMcG9ydCBpbXBsZW1lbnRhdGlvbiBhbmQgbmF0aXZlCisgKiBvbmUuIFRvIGFsbG93IHNvbWUgaW50ZXJhY3Rpb24gYmV0d2VlbiBib3RoIGltcGxlbWVudGF0aW9ucyB0aHJvdWdoCisgKiBpdGVyYXRvcnMgd2UgaGF2ZSB0byBtYXAgc3RkIGl0ZXJhdG9yIGNhdGVnb3JpZXMgdG8gc3RscG9ydCBvbmVzLiBUaGlzCisgKiB3YXkgd2Ugd2lsbCBiZSBhYmxlIHRvIGluaXRpYWxpemUgU1RMcG9ydCBjb250YWluZXJzIHdpdGggbmF0aXZlCisgKiBpdGVyYXRvcnMsIHRoZSBvdGhlciBzaWRlIHdvbid0IHdvcmsgZXhjZXB0IHdoZW4gU1RMcG9ydCBpdGVyYXRvcnMgYXJlCisgKiBzaW1wbGUgcG9pbnRlcnMuICovCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfSEFTX0lOQ0xVREVfTkVYVCkKKyMgICAgaW5jbHVkZV9uZXh0IDxpdGVyYXRvcj4KKyMgIGVsc2UKKyMgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfSEVBREVSKGl0ZXJhdG9yKQorIyAgZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlQ2F0Pgorc3RydWN0IF9DYXRlZ29yeU1hcHBpbmcKK3sgdHlwZWRlZiBfSXRlQ2F0IF9UYWc7IH07CisKK19TVExQX1RFTVBMQVRFX05VTEwKK3N0cnVjdCBfQ2F0ZWdvcnlNYXBwaW5nPDo6c3RkOjppbnB1dF9pdGVyYXRvcl90YWc+Cit7IHR5cGVkZWYgaW5wdXRfaXRlcmF0b3JfdGFnIF9UYWc7IH07CitfU1RMUF9URU1QTEFURV9OVUxMCitzdHJ1Y3QgX0NhdGVnb3J5TWFwcGluZzw6OnN0ZDo6b3V0cHV0X2l0ZXJhdG9yX3RhZz4KK3sgdHlwZWRlZiBvdXRwdXRfaXRlcmF0b3JfdGFnIF9UYWc7IH07CitfU1RMUF9URU1QTEFURV9OVUxMCitzdHJ1Y3QgX0NhdGVnb3J5TWFwcGluZzw6OnN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWc+Cit7IHR5cGVkZWYgZm9yd2FyZF9pdGVyYXRvcl90YWcgX1RhZzsgfTsKK19TVExQX1RFTVBMQVRFX05VTEwKK3N0cnVjdCBfQ2F0ZWdvcnlNYXBwaW5nPDo6c3RkOjpiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZz4KK3sgdHlwZWRlZiBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZyBfVGFnOyB9OworX1NUTFBfVEVNUExBVEVfTlVMTAorc3RydWN0IF9DYXRlZ29yeU1hcHBpbmc8OjpzdGQ6OnJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnPgoreyB0eXBlZGVmIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnIF9UYWc7IH07CisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+CitzdHJ1Y3QgaXRlcmF0b3JfdHJhaXRzIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSXRlcmF0b3I6Oml0ZXJhdG9yX2NhdGVnb3J5IF9PcmlnaW5hbFRhZzsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQ2F0ZWdvcnlNYXBwaW5nPF9PcmlnaW5hbFRhZz46Ol9UYWcgaXRlcmF0b3JfY2F0ZWdvcnk7CisjZWxzZQordGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KK3N0cnVjdCBpdGVyYXRvcl90cmFpdHMgeworICB0eXBlZGVmIHR5cGVuYW1lIF9JdGVyYXRvcjo6aXRlcmF0b3JfY2F0ZWdvcnkgaXRlcmF0b3JfY2F0ZWdvcnk7CisjZW5kaWYKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSXRlcmF0b3I6OnZhbHVlX3R5cGUgICAgICAgIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0l0ZXJhdG9yOjpkaWZmZXJlbmNlX3R5cGUgICBkaWZmZXJlbmNlX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0l0ZXJhdG9yOjpwb2ludGVyICAgICAgICAgICBwb2ludGVyOworICB0eXBlZGVmIHR5cGVuYW1lIF9JdGVyYXRvcjo6cmVmZXJlbmNlICAgICAgICAgcmVmZXJlbmNlOworfTsKKworI2lmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pICYmICFkZWZpbmVkIChfX1NVTlBST19DQykKKyMgIGRlZmluZSBfU1RMUF9ESUZGRVJFTkNFX1RZUEUoX0l0ZXJhdG9yKSB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0l0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlCisjZWxzZQorIyAgZGVmaW5lIF9TVExQX0RJRkZFUkVOQ0VfVFlQRShfSXRlcmF0b3IpIHB0cmRpZmZfdAorI2VuZGlmCisKKyNpZmRlZiBfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OCisKKy8vIGZicCA6IHRoaXMgb3JkZXIga2VlcHMgZ2NjIGhhcHB5Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IGl0ZXJhdG9yX3RyYWl0czxjb25zdCBfVHAqPiB7CisgIHR5cGVkZWYgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgIGl0ZXJhdG9yX2NhdGVnb3J5OworICB0eXBlZGVmIF9UcCAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICB0eXBlZGVmIHB0cmRpZmZfdCAgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgIHR5cGVkZWYgY29uc3QgX1RwKiAgICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgIHR5cGVkZWYgY29uc3QgX1RwJiAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgaXRlcmF0b3JfdHJhaXRzPF9UcCo+IHsKKyAgdHlwZWRlZiByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyAgaXRlcmF0b3JfY2F0ZWdvcnk7CisgIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgcHRyZGlmZl90ICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgdHlwZWRlZiBfVHAqICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgdHlwZWRlZiBfVHAmICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworfTsKKworIyAgaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKQordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBpdGVyYXRvcl90cmFpdHM8X1RwKiBjb25zdD4geworICB0eXBlZGVmIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnICBpdGVyYXRvcl9jYXRlZ29yeTsKKyAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiBwdHJkaWZmX3QgICAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICB0eXBlZGVmIGNvbnN0IF9UcCogICAgICAgICAgICAgICAgICBwb2ludGVyOworICB0eXBlZGVmIGNvbnN0IF9UcCYgICAgICAgICAgICAgICAgICByZWZlcmVuY2U7Cit9OworIyAgZW5kaWYKKworI2VuZGlmIC8qIF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04gKi8KKworX1NUTFBfRU5EX05BTUVTUEFDRQorI2luY2x1ZGUgPHN0bC9fcHRyc19zcGVjaWFsaXplLmg+CitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworI2lmbmRlZiBfU1RMUF9VU0VfT0xEX0hQX0lURVJBVE9SX1FVRVJJRVMKKy8vIFRoZSBvdmVybG9hZGVkIGZ1bmN0aW9ucyBpdGVyYXRvcl9jYXRlZ29yeSwgZGlzdGFuY2VfdHlwZSwgYW5kCisvLyB2YWx1ZV90eXBlIGFyZSBub3QgcGFydCBvZiB0aGUgQysrIHN0YW5kYXJkLiAgKFRoZXkgaGF2ZSBiZWVuCisvLyByZXBsYWNlZCBieSBzdHJ1Y3QgaXRlcmF0b3JfdHJhaXRzLikgIFRoZXkgYXJlIGluY2x1ZGVkIGZvcgorLy8gYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBIUCBTVEwuCisvLyBXZSBpbnRyb2R1Y2UgaW50ZXJuYWwgbmFtZXMgZm9yIHRoZXNlIGZ1bmN0aW9ucy4KKworIyAgaWZuZGVmIF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfU1RMUF9TVEQ6OnJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnCitfX2l0ZXJhdG9yX2NhdGVnb3J5KGNvbnN0IF9UcCosIGNvbnN0IF9fdHJ1ZV90eXBlJikKK3sgcmV0dXJuIF9TVExQX1NURDo6cmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcoKTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXI+CitpbmxpbmUgX1NUTFBfVFlQRU5BTUVfT05fUkVUVVJOX1RZUEUgX1NUTFBfU1REOjppdGVyYXRvcl90cmFpdHM8X0l0ZXI+OjppdGVyYXRvcl9jYXRlZ29yeQorX19pdGVyYXRvcl9jYXRlZ29yeShjb25zdCBfSXRlciYsIGNvbnN0IF9fZmFsc2VfdHlwZSYpIHsKKyAgdHlwZWRlZiBfU1RMUF9UWVBFTkFNRSBfU1RMUF9TVEQ6Oml0ZXJhdG9yX3RyYWl0czxfSXRlcj46Oml0ZXJhdG9yX2NhdGVnb3J5IF9DYXRlZ29yeTsKKyAgcmV0dXJuIF9DYXRlZ29yeSgpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIHB0cmRpZmZfdCoKK19fZGlzdGFuY2VfdHlwZShjb25zdCBfVHAqLCBjb25zdCBfX3RydWVfdHlwZSYpCit7IHJldHVybiBfX1NUQVRJQ19DQVNUKHB0cmRpZmZfdCosIDApOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcj4KK2lubGluZSBfU1RMUF9UWVBFTkFNRV9PTl9SRVRVUk5fVFlQRSBfU1RMUF9TVEQ6Oml0ZXJhdG9yX3RyYWl0czxfSXRlcj46OmRpZmZlcmVuY2VfdHlwZSoKK19fZGlzdGFuY2VfdHlwZShjb25zdCBfSXRlciYsIGNvbnN0IF9fZmFsc2VfdHlwZSYpIHsKKyAgdHlwZWRlZiBfU1RMUF9UWVBFTkFNRSBfU1RMUF9TVEQ6Oml0ZXJhdG9yX3RyYWl0czxfSXRlcj46OmRpZmZlcmVuY2VfdHlwZSBfZGlmZl90eXBlOworICByZXR1cm4gX19TVEFUSUNfQ0FTVChfZGlmZl90eXBlKiwwKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfVHAqCitfX3ZhbHVlX3R5cGUoY29uc3QgX1RwKiwgY29uc3QgX190cnVlX3R5cGUmKQoreyByZXR1cm4gX19TVEFUSUNfQ0FTVChfVHAqLCAwKTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXI+CitpbmxpbmUgX1NUTFBfVFlQRU5BTUVfT05fUkVUVVJOX1RZUEUgX1NUTFBfU1REOjppdGVyYXRvcl90cmFpdHM8X0l0ZXI+Ojp2YWx1ZV90eXBlKgorX192YWx1ZV90eXBlKGNvbnN0IF9JdGVyJiwgY29uc3QgX19mYWxzZV90eXBlJikgeworICB0eXBlZGVmIF9TVExQX1RZUEVOQU1FIF9TVExQX1NURDo6aXRlcmF0b3JfdHJhaXRzPF9JdGVyPjo6dmFsdWVfdHlwZSBfdmFsdWVfdHlwZTsKKyAgcmV0dXJuIF9fU1RBVElDX0NBU1QoX3ZhbHVlX3R5cGUqLDApOworfQorCisjICBlbmRpZgorCisjZWxzZSAvKiBfU1RMUF9VU0VfT0xEX0hQX0lURVJBVE9SX1FVRVJJRVMgKi8KK3RlbXBsYXRlIDxjbGFzcyBfQ2F0ZWdvcnksIGNsYXNzIF9UcCwgY2xhc3MgX0Rpc3RhbmNlLCBjbGFzcyBfUG9pbnRlciwgY2xhc3MgX1JlZmVyZW5jZT4KK2lubGluZSBfQ2F0ZWdvcnkgX1NUTFBfQ0FMTCBpdGVyYXRvcl9jYXRlZ29yeShjb25zdCBpdGVyYXRvcjxfQ2F0ZWdvcnksX1RwLF9EaXN0YW5jZSxfUG9pbnRlcixfUmVmZXJlbmNlPiYpIHsgcmV0dXJuIF9DYXRlZ29yeSgpOyB9Cit0ZW1wbGF0ZSA8Y2xhc3MgX0NhdGVnb3J5LCBjbGFzcyBfVHAsIGNsYXNzIF9EaXN0YW5jZSwgY2xhc3MgX1BvaW50ZXIsIGNsYXNzIF9SZWZlcmVuY2U+CitpbmxpbmUgX1RwKiBfU1RMUF9DQUxMIHZhbHVlX3R5cGUoY29uc3QgaXRlcmF0b3I8X0NhdGVnb3J5LF9UcCxfRGlzdGFuY2UsX1BvaW50ZXIsX1JlZmVyZW5jZT4mKSB7IHJldHVybiBfX1NUQVRJQ19DQVNUKF9UcCosIDApOyB9Cit0ZW1wbGF0ZSA8Y2xhc3MgX0NhdGVnb3J5LCBjbGFzcyBfVHAsIGNsYXNzIF9EaXN0YW5jZSwgY2xhc3MgX1BvaW50ZXIsIGNsYXNzIF9SZWZlcmVuY2U+CitpbmxpbmUgX0Rpc3RhbmNlKiBfU1RMUF9DQUxMIGRpc3RhbmNlX3R5cGUoY29uc3QgaXRlcmF0b3I8X0NhdGVnb3J5LF9UcCxfRGlzdGFuY2UsX1BvaW50ZXIsX1JlZmVyZW5jZT4mKSB7IHJldHVybiBfX1NUQVRJQ19DQVNUKF9EaXN0YW5jZSosIDApOyB9Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnIF9TVExQX0NBTEwgaXRlcmF0b3JfY2F0ZWdvcnkoY29uc3QgX1RwKikgeyByZXR1cm4gcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcoKTsgfQordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfVHAqIF9TVExQX0NBTEwgdmFsdWVfdHlwZShjb25zdCBfVHAqKSB7IHJldHVybiBfX1NUQVRJQ19DQVNUKF9UcCosIDApOyB9Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIHB0cmRpZmZfdCogX1NUTFBfQ0FMTCBkaXN0YW5jZV90eXBlKGNvbnN0IF9UcCopIHsgcmV0dXJuIF9fU1RBVElDX0NBU1QocHRyZGlmZl90KiwgMCk7IH0KKyNlbmRpZiAvKiBfU1RMUF9VU0VfT0xEX0hQX0lURVJBVE9SX1FVRVJJRVMgKi8KKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19BTkFDSFJPTklTTVMpCisvLyBUaGUgYmFzZSBjbGFzc2VzIGlucHV0X2l0ZXJhdG9yLCBvdXRwdXRfaXRlcmF0b3IsIGZvcndhcmRfaXRlcmF0b3IsCisvLyBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yLCBhbmQgcmFuZG9tX2FjY2Vzc19pdGVyYXRvciBhcmUgbm90IHBhcnQgb2YKKy8vIHRoZSBDKysgc3RhbmRhcmQuICAoVGhleSBoYXZlIGJlZW4gcmVwbGFjZWQgYnkgc3RydWN0IGl0ZXJhdG9yLikKKy8vIFRoZXkgYXJlIGluY2x1ZGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggdGhlIEhQIFNUTC4KK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9EaXN0YW5jZT4gc3RydWN0IGlucHV0X2l0ZXJhdG9yIDoKKyAgcHVibGljIGl0ZXJhdG9yIDxpbnB1dF9pdGVyYXRvcl90YWcsIF9UcCwgX0Rpc3RhbmNlLCBfVHAqLCBfVHAmPiB7fTsKK3N0cnVjdCBvdXRwdXRfaXRlcmF0b3IgOiBwdWJsaWMgaXRlcmF0b3IgPG91dHB1dF9pdGVyYXRvcl90YWcsIHZvaWQsIHZvaWQsIHZvaWQsIHZvaWQ+IHt9OwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0Rpc3RhbmNlPiBzdHJ1Y3QgZm9yd2FyZF9pdGVyYXRvciA6CisgIHB1YmxpYyBpdGVyYXRvcjxmb3J3YXJkX2l0ZXJhdG9yX3RhZywgX1RwLCBfRGlzdGFuY2UsIF9UcCosIF9UcCY+IHt9OwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0Rpc3RhbmNlPiBzdHJ1Y3QgYmlkaXJlY3Rpb25hbF9pdGVyYXRvciA6CisgIHB1YmxpYyBpdGVyYXRvcjxiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZywgX1RwLCBfRGlzdGFuY2UsIF9UcCosIF9UcCY+IHt9OwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0Rpc3RhbmNlPiBzdHJ1Y3QgcmFuZG9tX2FjY2Vzc19pdGVyYXRvciA6CisgIHB1YmxpYyBpdGVyYXRvcjxyYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywgX1RwLCBfRGlzdGFuY2UsIF9UcCosIF9UcCY+IHt9OworCisjICBpZiBkZWZpbmVkIChfU1RMUF9CQVNFX01BVENIX0JVRykgJiYgZGVmaW5lZCAoX1NUTFBfVVNFX09MRF9IUF9JVEVSQVRPUl9RVUVSSUVTKQordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0Rpc3RhbmNlPgoraW5saW5lIGlucHV0X2l0ZXJhdG9yX3RhZyBfU1RMUF9DQUxMCitpdGVyYXRvcl9jYXRlZ29yeShjb25zdCBpbnB1dF9pdGVyYXRvcjxfVHAsIF9EaXN0YW5jZT4mKSB7IHJldHVybiBpbnB1dF9pdGVyYXRvcl90YWcoKTsgfQoraW5saW5lIG91dHB1dF9pdGVyYXRvcl90YWcgX1NUTFBfQ0FMTAoraXRlcmF0b3JfY2F0ZWdvcnkoY29uc3Qgb3V0cHV0X2l0ZXJhdG9yJikgeyByZXR1cm4gb3V0cHV0X2l0ZXJhdG9yX3RhZygpOyB9Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfRGlzdGFuY2U+CitpbmxpbmUgZm9yd2FyZF9pdGVyYXRvcl90YWcgX1NUTFBfQ0FMTAoraXRlcmF0b3JfY2F0ZWdvcnkoY29uc3QgZm9yd2FyZF9pdGVyYXRvcjxfVHAsIF9EaXN0YW5jZT4mKSB7IHJldHVybiBmb3J3YXJkX2l0ZXJhdG9yX3RhZygpOyB9Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfRGlzdGFuY2U+CitpbmxpbmUgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgX1NUTFBfQ0FMTAoraXRlcmF0b3JfY2F0ZWdvcnkoY29uc3QgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcjxfVHAsIF9EaXN0YW5jZT4mKSB7IHJldHVybiBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZygpOyB9Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfRGlzdGFuY2U+CitpbmxpbmUgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgX1NUTFBfQ0FMTAoraXRlcmF0b3JfY2F0ZWdvcnkoY29uc3QgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcjxfVHAsIF9EaXN0YW5jZT4mKSB7IHJldHVybiByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZygpOyB9Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfRGlzdGFuY2U+CitpbmxpbmUgX1RwKiAgX1NUTFBfQ0FMTCB2YWx1ZV90eXBlKGNvbnN0IGlucHV0X2l0ZXJhdG9yPF9UcCwgX0Rpc3RhbmNlPiYpIHsgcmV0dXJuIF9fU1RBVElDX0NBU1QoX1RwKiwgMCk7IH0KK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9EaXN0YW5jZT4KK2lubGluZSBfVHAqIF9TVExQX0NBTEwgdmFsdWVfdHlwZShjb25zdCBmb3J3YXJkX2l0ZXJhdG9yPF9UcCwgX0Rpc3RhbmNlPiYpIHsgcmV0dXJuIF9fU1RBVElDX0NBU1QoX1RwKiwgMCk7IH0KK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9EaXN0YW5jZT4KK2lubGluZSBfVHAqIF9TVExQX0NBTEwgdmFsdWVfdHlwZShjb25zdCBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yPF9UcCwgX0Rpc3RhbmNlPiYpIHsgcmV0dXJuIF9fU1RBVElDX0NBU1QoX1RwKiwgMCk7IH0KK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9EaXN0YW5jZT4KK2lubGluZSBfVHAqIF9TVExQX0NBTEwgdmFsdWVfdHlwZShjb25zdCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yPF9UcCwgX0Rpc3RhbmNlPiYpIHsgcmV0dXJuIF9fU1RBVElDX0NBU1QoX1RwKiwgMCk7IH0KK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9EaXN0YW5jZT4KK2lubGluZSBfRGlzdGFuY2UqIF9TVExQX0NBTEwgZGlzdGFuY2VfdHlwZShjb25zdCBpbnB1dF9pdGVyYXRvcjxfVHAsIF9EaXN0YW5jZT4mKSB7IHJldHVybiBfX1NUQVRJQ19DQVNUKF9EaXN0YW5jZSosIDApOyB9Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfRGlzdGFuY2U+CitpbmxpbmUgX0Rpc3RhbmNlKiBfU1RMUF9DQUxMIGRpc3RhbmNlX3R5cGUoY29uc3QgZm9yd2FyZF9pdGVyYXRvcjxfVHAsIF9EaXN0YW5jZT4mKSB7IHJldHVybiBfX1NUQVRJQ19DQVNUKF9EaXN0YW5jZSosIDApOyB9Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfRGlzdGFuY2U+CitpbmxpbmUgX0Rpc3RhbmNlKiBfU1RMUF9DQUxMIGRpc3RhbmNlX3R5cGUoY29uc3QgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcjxfVHAsIF9EaXN0YW5jZT4mKSB7IHJldHVybiBfX1NUQVRJQ19DQVNUKF9EaXN0YW5jZSosIDApO30KK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9EaXN0YW5jZT4KK2lubGluZSBfRGlzdGFuY2UqIF9TVExQX0NBTEwgZGlzdGFuY2VfdHlwZShjb25zdCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yPF9UcCwgX0Rpc3RhbmNlPiYpIHsgcmV0dXJuIF9fU1RBVElDX0NBU1QoX0Rpc3RhbmNlKiwgMCk7IH0KKyMgIGVuZGlmCisjZW5kaWYKKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CitpbmxpbmUgX1NUTFBfRElGRkVSRU5DRV9UWVBFKF9JbnB1dEl0ZXJhdG9yKSBfU1RMUF9DQUxMCitfX2Rpc3RhbmNlKGNvbnN0IF9JbnB1dEl0ZXJhdG9yJiBfX2ZpcnN0LCBjb25zdCBfSW5wdXRJdGVyYXRvciYgX19sYXN0LAorICAgICAgICAgICBjb25zdCBpbnB1dF9pdGVyYXRvcl90YWcgJikgeworICBfU1RMUF9ESUZGRVJFTkNFX1RZUEUoX0lucHV0SXRlcmF0b3IpIF9fbiA9IDA7CisgIF9JbnB1dEl0ZXJhdG9yIF9faXQoX19maXJzdCk7CisgIHdoaWxlIChfX2l0ICE9IF9fbGFzdCkgeworICAgICsrX19pdDsgKytfX247CisgIH0KKyAgcmV0dXJuIF9fbjsKK30KKworI2lmIGRlZmluZWQgKF9TVExQX05PTlRFTVBMX0JBU0VfTUFUQ0hfQlVHKQordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CitpbmxpbmUgX1NUTFBfRElGRkVSRU5DRV9UWVBFKF9Gb3J3YXJkSXRlcmF0b3IpIF9TVExQX0NBTEwKK19fZGlzdGFuY2UoY29uc3QgX0ZvcndhcmRJdGVyYXRvciYgX19maXJzdCwgY29uc3QgX0ZvcndhcmRJdGVyYXRvciYgX19sYXN0LAorICAgICAgICAgICBjb25zdCBmb3J3YXJkX2l0ZXJhdG9yX3RhZyAmKSB7CisgIF9TVExQX0RJRkZFUkVOQ0VfVFlQRShfRm9yd2FyZEl0ZXJhdG9yKSBfX24gPSAwOworICBfRm9yd2FyZEl0ZXJhdG9yIF9faXQoX19maXJzdCk7CisgIHdoaWxlIChfX2l0ICE9IF9fbGFzdCkgeworICAgICsrX19pdDsgKytfX247CisgIH0KKyAgcmV0dXJuIF9fbjsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3I+CitfU1RMUF9JTkxJTkVfTE9PUCBfU1RMUF9ESUZGRVJFTkNFX1RZUEUoX0JpZGlyZWN0aW9uYWxJdGVyYXRvcikgX1NUTFBfQ0FMTAorX19kaXN0YW5jZShjb25zdCBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yJiBfX2ZpcnN0LCBjb25zdCBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yJiBfX2xhc3QsCisgICAgICAgICAgIGNvbnN0IGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnICYpIHsKKyAgX1NUTFBfRElGRkVSRU5DRV9UWVBFKF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IpIF9fbiA9IDA7CisgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19pdChfX2ZpcnN0KTsKKyAgd2hpbGUgKF9faXQgIT0gX19sYXN0KSB7CisgICAgKytfX2l0OyArK19fbjsKKyAgfQorICByZXR1cm4gX19uOworfQorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+CitpbmxpbmUgX1NUTFBfRElGRkVSRU5DRV9UWVBFKF9SYW5kb21BY2Nlc3NJdGVyYXRvcikgX1NUTFBfQ0FMTAorX19kaXN0YW5jZShjb25zdCBfUmFuZG9tQWNjZXNzSXRlcmF0b3ImIF9fZmlyc3QsIGNvbnN0IF9SYW5kb21BY2Nlc3NJdGVyYXRvciYgX19sYXN0LAorICAgICAgICAgICBjb25zdCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyAmKQoreyByZXR1cm4gX19sYXN0IC0gX19maXJzdDsgfQorCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgoraW5saW5lIF9TVExQX0RJRkZFUkVOQ0VfVFlQRShfSW5wdXRJdGVyYXRvcikgX1NUTFBfQ0FMTAorZGlzdGFuY2UoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQoreyByZXR1cm4gX1NUTFBfUFJJViBfX2Rpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCwgX1NUTFBfSVRFUkFUT1JfQ0FURUdPUlkoX19maXJzdCwgX0lucHV0SXRlcmF0b3IpKTsgfQorCisjaWYgIWRlZmluZWQgKF9TVExQX05PX0FOQUNIUk9OSVNNUykKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvciwgY2xhc3MgX0Rpc3RhbmNlPgoraW5saW5lIHZvaWQgX1NUTFBfQ0FMTCBkaXN0YW5jZShjb25zdCBfSW5wdXRJdGVyYXRvciYgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0lucHV0SXRlcmF0b3ImIF9fbGFzdCwgX0Rpc3RhbmNlJiBfX24pCit7IF9fbiArPSBfU1RMUF9TVEQ6OmRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7IH0KKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfTVNWQykKKy8vIE1TVkMgc3BlY2lmaWMKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvciwgY2xhc3MgX0Rpc3Q+CitpbmxpbmUgdm9pZCAgX1NUTFBfQ0FMTCBfRGlzdGFuY2UoX0lucHV0SXRlcmF0b3IgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyYXRvciBfX2xhc3QsIF9EaXN0JiBfX24pCit7IF9fbiArPSBfU1RMUF9TVEQ6OmRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7IH0KKyMgIGVuZGlmCisjZW5kaWYKKworLy8gZmJwOiB0aG9zZSBhcmUgYmVpbmcgdXNlZCBmb3IgaXRlcmF0b3IvY29uc3RfaXRlcmF0b3IgZGVmaW5pdGlvbnMgZXZlcnl3aGVyZQordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfTm9uY29uc3RfdHJhaXRzOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9Db25zdF90cmFpdHMgeworICB0eXBlZGVmIF9UcCB2YWx1ZV90eXBlOworICB0eXBlZGVmIGNvbnN0IF9UcCYgIHJlZmVyZW5jZTsKKyAgdHlwZWRlZiBjb25zdCBfVHAqICBwb2ludGVyOworICB0eXBlZGVmIF9Db25zdF90cmFpdHM8X1RwPiBfQ29uc3RUcmFpdHM7CisgIHR5cGVkZWYgX05vbmNvbnN0X3RyYWl0czxfVHA+IF9Ob25Db25zdFRyYWl0czsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX05vbmNvbnN0X3RyYWl0cyB7CisgIHR5cGVkZWYgX1RwIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgX1RwJiByZWZlcmVuY2U7CisgIHR5cGVkZWYgX1RwKiBwb2ludGVyOworICB0eXBlZGVmIF9Db25zdF90cmFpdHM8X1RwPiBfQ29uc3RUcmFpdHM7CisgIHR5cGVkZWYgX05vbmNvbnN0X3RyYWl0czxfVHA+IF9Ob25Db25zdFRyYWl0czsKK307CisKKy8qCisgKiBkdW1zOiBBIHNwZWNpYWwgaXRlcmF0b3IvY29uc3RfaXRlcmF0b3IgdHJhaXRzIGZvciBzZXQgYW5kIG11bHRpc2V0IGZvciB3aGljaCBldmVuCisgKiB0aGUgaXRlcmF0b3IgaXMgbm90IG11dGFibGUKKyAqLwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfTm9uY29uc3RfQ29uc3RfdHJhaXRzOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9Db25zdF9Db25zdF90cmFpdHMgeworICB0eXBlZGVmIF9UcCB2YWx1ZV90eXBlOworICB0eXBlZGVmIGNvbnN0IF9UcCYgIHJlZmVyZW5jZTsKKyAgdHlwZWRlZiBjb25zdCBfVHAqICBwb2ludGVyOworICB0eXBlZGVmIF9Db25zdF9Db25zdF90cmFpdHM8X1RwPiBfQ29uc3RUcmFpdHM7CisgIHR5cGVkZWYgX05vbmNvbnN0X0NvbnN0X3RyYWl0czxfVHA+IF9Ob25Db25zdFRyYWl0czsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX05vbmNvbnN0X0NvbnN0X3RyYWl0cyB7CisgIHR5cGVkZWYgX1RwIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgY29uc3QgX1RwJiByZWZlcmVuY2U7CisgIHR5cGVkZWYgY29uc3QgX1RwKiBwb2ludGVyOworICB0eXBlZGVmIF9Db25zdF9Db25zdF90cmFpdHM8X1RwPiBfQ29uc3RUcmFpdHM7CisgIHR5cGVkZWYgX05vbmNvbnN0X0NvbnN0X3RyYWl0czxfVHA+IF9Ob25Db25zdFRyYWl0czsKK307CisKKy8qCisgKiBBIG1hY3JvIHRvIGdlbmVyYXRlIGEgbmV3IGl0ZXJhdG9yIHRyYWl0cyBmcm9tIG9uZSBvZiB0aGUKKyAqIHByZXZpb3VzIG9uZS4gQ2hhbmdpbmcgdGhlIGl0ZXJhdG9yIHRyYWl0cyB0eXBlIG1ha2UgaXRlcmF0b3JzCisgKiBmcm9tIGRpZmZlcmVudCBjb250YWluZXJzIG5vdCBjb21wYXJhYmxlLgorICovCisjZGVmaW5lIF9TVExQX0NSRUFURV9JVEVSQVRPUl9UUkFJVFNfQkFTRShNb3RpZiwgVHJhaXRzKSAgICAgICAgXAordGVtcGxhdGUgPGNsYXNzIF9UcD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0cnVjdCBfIyNNb3RpZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RydWN0IF9Db25zdCMjTW90aWYgOiBwdWJsaWMgX1NUTFBfU1REOjpfQ29uc3RfIyNUcmFpdHM8X1RwPiB7ICBcCisgIHR5cGVkZWYgX0NvbnN0IyNNb3RpZjxfVHA+IF9Db25zdFRyYWl0czsgICAgICAgICAgICAgICAgICAgICAgXAorICB0eXBlZGVmIF8jI01vdGlmPF9UcD4gX05vbkNvbnN0VHJhaXRzOyAgICAgICAgICAgICAgICAgICAgICAgIFwKK307ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RydWN0IF8jI01vdGlmIDogcHVibGljIF9TVExQX1NURDo6X05vbmNvbnN0XyMjVHJhaXRzPF9UcD4geyAgICBcCisgIHR5cGVkZWYgX0NvbnN0IyNNb3RpZjxfVHA+IF9Db25zdFRyYWl0czsgICAgICAgICAgICAgICAgICAgICAgXAorICB0eXBlZGVmIF8jI01vdGlmPF9UcD4gX05vbkNvbnN0VHJhaXRzOyAgICAgICAgICAgICAgICAgICAgICAgIFwKK307CisKKyNkZWZpbmUgX1NUTFBfQ1JFQVRFX0lURVJBVE9SX1RSQUlUUyhNb3RpZiwgVHJhaXRzKSAgICAgICAgICAgICBcCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorX1NUTFBfQ1JFQVRFX0lURVJBVE9SX1RSQUlUU19CQVNFKE1vdGlmLCBUcmFpdHMpICAgICAgICAgICAgICAgIFwKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCisjZGVmaW5lIF9TVExQX0NSRUFURV9IQVNIX0lURVJBVE9SX1RSQUlUUyhNb3RpZiwgVHJhaXRzKSAgICAgICAgXAorX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK19TVExQX0NSRUFURV9JVEVSQVRPUl9UUkFJVFNfQkFTRShOb25Mb2NhbCMjTW90aWYsIFRyYWl0cykgICAgICBcCitfU1RMUF9DUkVBVEVfSVRFUkFUT1JfVFJBSVRTX0JBU0UoTG9jYWwjI01vdGlmLCBUcmFpdHMpICAgICAgICAgXAordGVtcGxhdGUgPGNsYXNzIF9UcD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0cnVjdCBfIyNNb3RpZiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHR5cGVkZWYgX0NvbnN0Tm9uTG9jYWwjI01vdGlmPF9UcD4gX0NvbnN0VHJhaXRzOyAgICAgICAgICAgICAgXAorICB0eXBlZGVmIF9Ob25Mb2NhbCMjTW90aWY8X1RwPiBfTm9uQ29uc3RUcmFpdHM7ICAgICAgICAgICAgICAgIFwKKyAgdHlwZWRlZiBfQ29uc3RMb2NhbCMjTW90aWY8X1RwPiBfQ29uc3RMb2NhbFRyYWl0czsgICAgICAgICAgICBcCisgIHR5cGVkZWYgX0xvY2FsIyNNb3RpZjxfVHA+IF9Ob25Db25zdExvY2FsVHJhaXRzOyAgICAgICAgICAgICAgXAorfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCisvKgorIyAgaWYgZGVmaW5lZCAoX1NUTFBfQkFTRV9UWVBFREVGX0JVRykKKy8vIHRoaXMgd29ya2Fyb3VuZCBpcyBuZWVkZWQgZm9yIFN1blBybyA0LjAuMQordGVtcGxhdGUgPGNsYXNzIF9UcmFpdHM+CitzdHJ1Y3QgX19jbnN0X3RyYWl0c19hdXggOiBwcml2YXRlIF9UcmFpdHMgeworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKK307CisjICBkZWZpbmUgX19UUkFJVFNfVkFMVUVfVFlQRShfVHJhaXRzKSBfX2Nuc3RfdHJhaXRzX2F1eDxfVHJhaXRzPjo6dmFsdWVfdHlwZQorIyAgZWxzZQorIyAgZGVmaW5lIF9fVFJBSVRTX1ZBTFVFX1RZUEUoX1RyYWl0cykgX1RyYWl0czo6dmFsdWVfdHlwZQorIyAgZW5kaWYKKyovCisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9EaXN0YW5jZT4KK19TVExQX0lOTElORV9MT09QIHZvaWQgX1NUTFBfQ0FMTAorX19hZHZhbmNlKF9JbnB1dEl0ZXImIF9faSwgX0Rpc3RhbmNlIF9fbiwgY29uc3QgaW5wdXRfaXRlcmF0b3JfdGFnICYpCit7IHdoaWxlIChfX24tLSkgKytfX2k7IH0KKworLy8gZmJwIDogYWRkZWQgb3V0cHV0IGl0ZXJhdG9yIHRhZyB2YXJpYW50Cit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX0Rpc3RhbmNlPgorX1NUTFBfSU5MSU5FX0xPT1Agdm9pZCBfU1RMUF9DQUxMCitfX2FkdmFuY2UoX0lucHV0SXRlciYgX19pLCBfRGlzdGFuY2UgX19uLCBjb25zdCBvdXRwdXRfaXRlcmF0b3JfdGFnICYpCit7IHdoaWxlIChfX24tLSkgKytfX2k7IH0KKworI2lmIGRlZmluZWQgKF9TVExQX05PTlRFTVBMX0JBU0VfTUFUQ0hfQlVHKQordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3IsIGNsYXNzIF9EaXN0YW5jZT4KK19TVExQX0lOTElORV9MT09QIHZvaWQgX1NUTFBfQ0FMTAorX19hZHZhbmNlKF9Gb3J3YXJkSXRlcmF0b3ImIGksIF9EaXN0YW5jZSBuLCBjb25zdCBmb3J3YXJkX2l0ZXJhdG9yX3RhZyAmKQoreyB3aGlsZSAobi0tKSArK2k7IH0KKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciwgY2xhc3MgX0Rpc3RhbmNlPgorX1NUTFBfSU5MSU5FX0xPT1Agdm9pZCBfU1RMUF9DQUxMCitfX2FkdmFuY2UoX0JpZGlyZWN0aW9uYWxJdGVyYXRvciYgX19pLCBfRGlzdGFuY2UgX19uLAorICAgICAgICAgIGNvbnN0IGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnICYpIHsKKyAgaWYgKF9fbiA+IDApCisgICAgd2hpbGUgKF9fbi0tKSArK19faTsKKyAgZWxzZQorICAgIHdoaWxlIChfX24rKykgLS1fX2k7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIGNsYXNzIF9EaXN0YW5jZT4KK2lubGluZSB2b2lkIF9TVExQX0NBTEwKK19fYWR2YW5jZShfUmFuZG9tQWNjZXNzSXRlcmF0b3ImIF9faSwgX0Rpc3RhbmNlIF9fbiwKKyAgICAgICAgICBjb25zdCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyAmKQoreyBfX2kgKz0gX19uOyB9CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3IsIGNsYXNzIF9EaXN0YW5jZT4KK2lubGluZSB2b2lkIF9TVExQX0NBTEwgYWR2YW5jZShfSW5wdXRJdGVyYXRvciYgX19pLCBfRGlzdGFuY2UgX19uKQoreyBfU1RMUF9QUklWIF9fYWR2YW5jZShfX2ksIF9fbiwgX1NUTFBfSVRFUkFUT1JfQ0FURUdPUlkoX19pLCBfSW5wdXRJdGVyYXRvcikpOyB9CisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2VuZGlmIC8qIF9TVExQX0lOVEVSTkFMX0lURVJBVE9SX0JBU0VfSCAqLworCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9faXRlcmF0b3Jfb2xkLmggYi9zdGxwb3J0L3N0bC9faXRlcmF0b3Jfb2xkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ0YjlhYgotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc3RsL19pdGVyYXRvcl9vbGQuaApAQCAtMCwwICsxLDMzNCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LTE5OTgKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKy8qIE5PVEU6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIFNUTCBoZWFkZXJzLgorICogICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4KKyAqLworCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0lURVJBVE9SX09MRF9ICisjZGVmaW5lIF9TVExQX0lOVEVSTkFMX0lURVJBVE9SX09MRF9ICisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfSVRFUkFUT1JfQkFTRV9ICisjICBpbmNsdWRlIDxzdGwvX2l0ZXJhdG9yX2Jhc2UuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworI2lmZGVmIF9TVExQX1VTRV9PTERfSFBfSVRFUkFUT1JfUVVFUklFUworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NvbnRhaW5lcj4KK2lubGluZSBvdXRwdXRfaXRlcmF0b3JfdGFnIF9TVExQX0NBTEwKK2l0ZXJhdG9yX2NhdGVnb3J5KGNvbnN0IGJhY2tfaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JikgeyByZXR1cm4gb3V0cHV0X2l0ZXJhdG9yX3RhZygpOyB9Cit0ZW1wbGF0ZSA8Y2xhc3MgX0NvbnRhaW5lcj4KK2lubGluZSBvdXRwdXRfaXRlcmF0b3JfdGFnIF9TVExQX0NBTEwKK2l0ZXJhdG9yX2NhdGVnb3J5KGNvbnN0IGZyb250X2luc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYpIHsgcmV0dXJuIG91dHB1dF9pdGVyYXRvcl90YWcoKTsgfQordGVtcGxhdGUgPGNsYXNzIF9Db250YWluZXI+CitpbmxpbmUgb3V0cHV0X2l0ZXJhdG9yX3RhZyBfU1RMUF9DQUxMCitpdGVyYXRvcl9jYXRlZ29yeShjb25zdCBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mKSB7IHJldHVybiBvdXRwdXRfaXRlcmF0b3JfdGFnKCk7IH0KKworI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCBjbGFzcyBfVHAsCisgICAgICAgICAgX1NUTFBfREZMX1RNUExfUEFSQU0oX1JlZmVyZW5jZSwgX1RwJiApLAorI2lmIGRlZmluZWQgKF9TVExQX01TVkM1MF9DT01QQVRJQklMSVRZKQorIyAgZGVmaW5lIF9fUmVmZXJlbmNlIF9SZWZlcmVuY2UsIGNsYXNzIF9Qb2ludGVyCisjICBkZWZpbmUgUmVmZXJlbmNlX18gX1JlZmVyZW5jZSwgX1BvaW50ZXIKKyAgICAgICAgICBfU1RMUF9ERkxfVE1QTF9QQVJBTShfUG9pbnRlciwgX1RwKiksCisjZWxzZQorIyAgZGVmaW5lIF9fUmVmZXJlbmNlIF9SZWZlcmVuY2UKKyMgIGRlZmluZSBSZWZlcmVuY2VfXyBfUmVmZXJlbmNlCisjZW5kaWYKKyAgICAgICAgICBfU1RMUF9ERkxfVFlQRV9QQVJBTShfRGlzdGFuY2UsIHB0cmRpZmZfdCk+CitjbGFzcyByZXZlcnNlX2JpZGlyZWN0aW9uYWxfaXRlcmF0b3IgeworICB0eXBlZGVmIHJldmVyc2VfYmlkaXJlY3Rpb25hbF9pdGVyYXRvcjxfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCBfVHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZmVyZW5jZV9fLCBfRGlzdGFuY2U+IF9TZWxmOworICAvLyAgZnJpZW5kIGlubGluZSBib29sIG9wZXJhdG9yPT0gX1NUTFBfTlVMTF9UTVBMX0FSR1MgKGNvbnN0IF9TZWxmJiB4LCBjb25zdCBfU2VsZiYgeSk7Citwcm90ZWN0ZWQ6CisgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgY3VycmVudDsKK3B1YmxpYzoKKyAgdHlwZWRlZiBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKKyAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICB0eXBlZGVmIF9EaXN0YW5jZSAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyMgIGlmIGRlZmluZWQgKF9TVExQX01TVkM1MF9DT01QQVRJQklMSVRZKQorICB0eXBlZGVmIF9Qb2ludGVyICAgICAgICAgICAgICAgICAgIHBvaW50ZXI7CisjICBlbHNlCisgIHR5cGVkZWYgX1RwKiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlcjsKKyMgIGVuZGlmCisgIHR5cGVkZWYgX1JlZmVyZW5jZSAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworCisgIHJldmVyc2VfYmlkaXJlY3Rpb25hbF9pdGVyYXRvcigpIHt9CisgIGV4cGxpY2l0IHJldmVyc2VfYmlkaXJlY3Rpb25hbF9pdGVyYXRvcihfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9feCkKKyAgICA6IGN1cnJlbnQoX194KSB7fQorICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIGJhc2UoKSBjb25zdCB7IHJldHVybiBjdXJyZW50OyB9CisgIF9SZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3QgeworICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX190bXAgPSBjdXJyZW50OworICAgIHJldHVybiAqKC0tX190bXApOworICB9CisKKyAgX1NUTFBfREVGSU5FX0FSUk9XX09QRVJBVE9SCisKKyAgX1NlbGYmIG9wZXJhdG9yKysoKSB7CisgICAgLS1jdXJyZW50OworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBfU2VsZiBvcGVyYXRvcisrKGludCkgeworICAgIF9TZWxmIF9fdG1wID0gKnRoaXM7CisgICAgLS1jdXJyZW50OworICAgIHJldHVybiBfX3RtcDsKKyAgfQorICBfU2VsZiYgb3BlcmF0b3ItLSgpIHsKKyAgICArK2N1cnJlbnQ7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIF9TZWxmIG9wZXJhdG9yLS0oaW50KSB7CisgICAgX1NlbGYgX190bXAgPSAqdGhpczsKKyAgICArK2N1cnJlbnQ7CisgICAgcmV0dXJuIF9fdG1wOworICB9Cit9OworCisjaWZkZWYgX1NUTFBfVVNFX09MRF9IUF9JVEVSQVRPUl9RVUVSSUVTCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciwgY2xhc3MgX1RwLCBjbGFzcyBfX1JlZmVyZW5jZSwKKyAgICAgICAgICBjbGFzcyBfRGlzdGFuY2U+CitpbmxpbmUgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgX1NUTFBfQ0FMTAoraXRlcmF0b3JfY2F0ZWdvcnkoY29uc3QgcmV2ZXJzZV9iaWRpcmVjdGlvbmFsX2l0ZXJhdG9yPF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IsIF9UcCwgUmVmZXJlbmNlX18sIF9EaXN0YW5jZT4mKQoreyByZXR1cm4gYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcoKTsgfQordGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IsIGNsYXNzIF9UcCwgY2xhc3MgX19SZWZlcmVuY2UsCisgIGNsYXNzIF9EaXN0YW5jZT4KK2lubGluZSBfVHAqIF9TVExQX0NBTEwKK3ZhbHVlX3R5cGUoY29uc3QgcmV2ZXJzZV9iaWRpcmVjdGlvbmFsX2l0ZXJhdG9yPF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IsIF9UcCwgUmVmZXJlbmNlX18sIF9EaXN0YW5jZT4mKQoreyByZXR1cm4gKF9UcCopIDA7IH0KK3RlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCBjbGFzcyBfVHAsIGNsYXNzIF9fUmVmZXJlbmNlLAorICAgICAgICAgIGNsYXNzIF9EaXN0YW5jZT4KK2lubGluZSBfRGlzdGFuY2UqIF9TVExQX0NBTEwKK2Rpc3RhbmNlX3R5cGUoY29uc3QgcmV2ZXJzZV9iaWRpcmVjdGlvbmFsX2l0ZXJhdG9yPF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IsIF9UcCwgUmVmZXJlbmNlX18sIF9EaXN0YW5jZT4mKQoreyByZXR1cm4gKF9EaXN0YW5jZSopIDA7IH0KKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciwgY2xhc3MgX1RwLCBjbGFzcyBfX1JlZmVyZW5jZSwKKyAgICAgICAgICBjbGFzcyBfRGlzdGFuY2U+CitpbmxpbmUgYm9vbCAgX1NUTFBfQ0FMTCBvcGVyYXRvcj09KAorICAgIGNvbnN0IHJldmVyc2VfYmlkaXJlY3Rpb25hbF9pdGVyYXRvcjxfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCBfVHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZmVyZW5jZV9fLCBfRGlzdGFuY2U+JiBfX3gsCisgICAgY29uc3QgcmV2ZXJzZV9iaWRpcmVjdGlvbmFsX2l0ZXJhdG9yPF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IsIF9UcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmZXJlbmNlX18sIF9EaXN0YW5jZT4mIF9feSkKK3sgcmV0dXJuIF9feC5iYXNlKCkgPT0gX195LmJhc2UoKTsgfQorCisjaWZkZWYgX1NUTFBfVVNFX1NFUEFSQVRFX1JFTE9QU19OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9CaUl0ZXIsIGNsYXNzIF9UcCwgY2xhc3MgX19SZWZlcmVuY2UsIGNsYXNzIF9EaXN0YW5jZT4KK2lubGluZSBib29sICBfU1RMUF9DQUxMIG9wZXJhdG9yIT0oCisgICAgY29uc3QgcmV2ZXJzZV9iaWRpcmVjdGlvbmFsX2l0ZXJhdG9yPF9CaUl0ZXIsIF9UcCwgUmVmZXJlbmNlX18sIF9EaXN0YW5jZT4mIF9feCwKKyAgICBjb25zdCByZXZlcnNlX2JpZGlyZWN0aW9uYWxfaXRlcmF0b3I8X0JpSXRlciwgX1RwLCBSZWZlcmVuY2VfXywgX0Rpc3RhbmNlPiYgX195KQoreyByZXR1cm4gIShfX3ggPT0gX195KTsgfQorCisjZW5kaWYKKworI2lmICFkZWZpbmVkICggX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTiApCisKKy8vIFRoaXMgaXMgdGhlIG9sZCB2ZXJzaW9uIG9mIHJldmVyc2VfaXRlcmF0b3IsIGFzIGZvdW5kIGluIHRoZSBvcmlnaW5hbAorLy8gIEhQIFNUTC4gIEl0IGRvZXMgbm90IHVzZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uLgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBjbGFzcyBfVHAsCisgICAgICAgICAgX1NUTFBfREZMX1RNUExfUEFSQU0oX1JlZmVyZW5jZSxfVHAmKSwKKyMgIGlmIGRlZmluZWQgKF9TVExQX01TVkM1MF9DT01QQVRJQklMSVRZKQorICAgICAgICAgIF9TVExQX0RGTF9UTVBMX1BBUkFNKF9Qb2ludGVyLCBfVHAqKSwKKyMgIGVuZGlmCisgICAgICAgICAgX1NUTFBfREZMX1RZUEVfUEFSQU0oX0Rpc3RhbmNlLHB0cmRpZmZfdCk+CitjbGFzcyByZXZlcnNlX2l0ZXJhdG9yIHsKKyAgdHlwZWRlZiByZXZlcnNlX2l0ZXJhdG9yPF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgX1RwLCBSZWZlcmVuY2VfXywgX0Rpc3RhbmNlPiBfU2VsZjsKK3Byb3RlY3RlZDoKKyAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fY3VycmVudDsKK3B1YmxpYzoKKyAgdHlwZWRlZiByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKKyAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICB0eXBlZGVmIF9EaXN0YW5jZSAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyMgIGlmIGRlZmluZWQgKF9TVExQX01TVkM1MF9DT01QQVRJQklMSVRZKQorICB0eXBlZGVmIF9Qb2ludGVyICAgICAgICAgICAgICAgICAgIHBvaW50ZXI7CisjICBlbHNlCisgIHR5cGVkZWYgX1RwKiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlcjsKKyMgIGVuZGlmCisgIHR5cGVkZWYgX1JlZmVyZW5jZSAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworCisgIHJldmVyc2VfaXRlcmF0b3IoKSB7fQorICByZXZlcnNlX2l0ZXJhdG9yKGNvbnN0IF9TZWxmJiBfX3gpIDogX19jdXJyZW50KF9feC5iYXNlKCkpIHt9CisgIGV4cGxpY2l0IHJldmVyc2VfaXRlcmF0b3IoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9feCkgOiBfX2N1cnJlbnQoX194KSB7fQorICBfU2VsZiYgb3BlcmF0b3I9KGNvbnN0IF9TZWxmJiBfX3gpIHtfX2N1cnJlbnQgPSBfX3guYmFzZSgpOyByZXR1cm4gKnRoaXM7IH0KKworICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgYmFzZSgpIGNvbnN0IHsgcmV0dXJuIF9fY3VycmVudDsgfQorICBfUmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICooX19jdXJyZW50IC0gKGRpZmZlcmVuY2VfdHlwZSkxKTsgfQorCisgIF9TVExQX0RFRklORV9BUlJPV19PUEVSQVRPUgorCisgIF9TZWxmJiBvcGVyYXRvcisrKCkgeworICAgIC0tX19jdXJyZW50OworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBfU2VsZiBvcGVyYXRvcisrKGludCkgeworICAgIF9TZWxmIF9fdG1wID0gKnRoaXM7CisgICAgLS1fX2N1cnJlbnQ7CisgICAgcmV0dXJuIF9fdG1wOworICB9CisgIF9TZWxmJiBvcGVyYXRvci0tKCkgeworICAgICsrX19jdXJyZW50OworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBfU2VsZiBvcGVyYXRvci0tKGludCkgeworICAgIF9TZWxmIF9fdG1wID0gKnRoaXM7CisgICAgKytfX2N1cnJlbnQ7CisgICAgcmV0dXJuIF9fdG1wOworICB9CisgIF9TZWxmIG9wZXJhdG9yKyhfRGlzdGFuY2UgX19uKSBjb25zdCB7CisgICAgcmV0dXJuIF9TZWxmKF9fY3VycmVudCAtIF9fbik7CisgIH0KKyAgX1NlbGYmIG9wZXJhdG9yKz0oX0Rpc3RhbmNlIF9fbikgeworICAgIF9fY3VycmVudCAtPSBfX247CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIF9TZWxmIG9wZXJhdG9yLShfRGlzdGFuY2UgX19uKSBjb25zdCB7CisgICAgcmV0dXJuIF9TZWxmKF9fY3VycmVudCArIF9fbik7CisgIH0KKyAgX1NlbGYmIG9wZXJhdG9yLT0oX0Rpc3RhbmNlIF9fbikgeworICAgIF9fY3VycmVudCArPSBfX247CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIF9SZWZlcmVuY2Ugb3BlcmF0b3JbXShfRGlzdGFuY2UgX19uKSBjb25zdCB7IHJldHVybiAqKCp0aGlzICsgX19uKTsgfQorfTsKKworIyAgaWZkZWYgX1NUTFBfVVNFX09MRF9IUF9JVEVSQVRPUl9RVUVSSUVTCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBjbGFzcyBfVHAsCisgICAgICAgICAgY2xhc3MgX19SZWZlcmVuY2UsIGNsYXNzIF9EaXN0YW5jZT4KK2lubGluZSByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyBfU1RMUF9DQUxMCitpdGVyYXRvcl9jYXRlZ29yeShjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgX1RwLCBSZWZlcmVuY2VfXywgX0Rpc3RhbmNlPiYpCit7IHJldHVybiByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZygpOyB9Cit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBjbGFzcyBfVHAsCisgIGNsYXNzIF9fUmVmZXJlbmNlLCBjbGFzcyBfRGlzdGFuY2U+CitpbmxpbmUgX1RwKiAgX1NUTFBfQ0FMTCB2YWx1ZV90eXBlKGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBfVHAsIFJlZmVyZW5jZV9fLCBfRGlzdGFuY2U+JikKK3sgcmV0dXJuIChfVHAqKSAwOyB9Cit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBjbGFzcyBfVHAsCisgICAgICAgICAgY2xhc3MgX19SZWZlcmVuY2UsIGNsYXNzIF9EaXN0YW5jZT4KK2lubGluZSBfRGlzdGFuY2UqICBfU1RMUF9DQUxMCitkaXN0YW5jZV90eXBlKGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBfVHAsIFJlZmVyZW5jZV9fLCBfRGlzdGFuY2U+JikKK3sgcmV0dXJuIChfRGlzdGFuY2UqKSAwOyB9CisjICBlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBjbGFzcyBfVHAsCisgICAgICAgICAgY2xhc3MgX19SZWZlcmVuY2UsIGNsYXNzIF9EaXN0YW5jZT4KK2lubGluZSBib29sICBfU1RMUF9DQUxMCitvcGVyYXRvcj09KGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBfVHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmZXJlbmNlX18sIF9EaXN0YW5jZT4mIF9feCwKKyAgICAgICAgICAgY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIF9UcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZlcmVuY2VfXywgX0Rpc3RhbmNlPiYgX195KQoreworICByZXR1cm4gX194LmJhc2UoKSA9PSBfX3kuYmFzZSgpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBjbGFzcyBfVHAsCisgICAgICAgICAgY2xhc3MgX19SZWZlcmVuY2UsIGNsYXNzIF9EaXN0YW5jZT4KK2lubGluZSBib29sIF9TVExQX0NBTEwKK29wZXJhdG9yPChjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgX1RwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmZXJlbmNlX18sIF9EaXN0YW5jZT4mIF9feCwKKyAgICAgICAgICBjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgX1RwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmZXJlbmNlX18sIF9EaXN0YW5jZT4mIF9feSkKK3sKKyAgcmV0dXJuIF9feS5iYXNlKCkgPCBfX3guYmFzZSgpOworfQorCisjICBpZmRlZiBfU1RMUF9VU0VfU0VQQVJBVEVfUkVMT1BTX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBjbGFzcyBfVHAsCisgICAgICAgICAgY2xhc3MgX19SZWZlcmVuY2UsIGNsYXNzIF9EaXN0YW5jZT4KK2lubGluZSBib29sIF9TVExQX0NBTEwKK29wZXJhdG9yIT0oY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIF9UcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZlcmVuY2VfXywgX0Rpc3RhbmNlPiYgX194LAorICAgICAgICAgICBjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgX1RwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZmVyZW5jZV9fLCBfRGlzdGFuY2U+JiBfX3kpIHsKKyAgcmV0dXJuICEoX194ID09IF9feSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIGNsYXNzIF9UcCwKKyAgICAgICAgICBjbGFzcyBfX1JlZmVyZW5jZSwgY2xhc3MgX0Rpc3RhbmNlPgoraW5saW5lIGJvb2wgX1NUTFBfQ0FMTAorb3BlcmF0b3I+KGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBfVHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZlcmVuY2VfXywgX0Rpc3RhbmNlPiYgX194LAorICAgICAgICAgIGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBfVHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZlcmVuY2VfXywgX0Rpc3RhbmNlPiYgX195KSB7CisgIHJldHVybiBfX3kgPCBfX3g7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIGNsYXNzIF9UcCwKKyAgICAgICAgICBjbGFzcyBfX1JlZmVyZW5jZSwgY2xhc3MgX0Rpc3RhbmNlPgoraW5saW5lIGJvb2wgX1NUTFBfQ0FMTAorb3BlcmF0b3I8PShjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgX1RwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZmVyZW5jZV9fLCBfRGlzdGFuY2U+JiBfX3gsCisgICAgICAgICAgIGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBfVHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmZXJlbmNlX18sIF9EaXN0YW5jZT4mIF9feSkgeworICByZXR1cm4gIShfX3kgPCBfX3gpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBjbGFzcyBfVHAsCisgICAgICAgICAgY2xhc3MgX19SZWZlcmVuY2UsIGNsYXNzIF9EaXN0YW5jZT4KK2lubGluZSBib29sIF9TVExQX0NBTEwKK29wZXJhdG9yPj0oY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIF9UcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZlcmVuY2VfXywgX0Rpc3RhbmNlPiYgX194LAorICAgICAgICAgICBjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgX1RwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZmVyZW5jZV9fLCBfRGlzdGFuY2U+JiBfX3kpIHsKKyAgcmV0dXJuICEoX194IDwgX195KTsKK30KKworIyAgZW5kaWYgLyogX1NUTFBfVVNFX1NFUEFSQVRFX1JFTE9QU19OQU1FU1BBQ0UgKi8KKwordGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgY2xhc3MgX1RwLAorICAgICAgICAgIGNsYXNzIF9fUmVmZXJlbmNlLCBjbGFzcyBfRGlzdGFuY2U+CitpbmxpbmUgX0Rpc3RhbmNlICBfU1RMUF9DQUxMCitvcGVyYXRvci0oY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIF9UcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZmVyZW5jZV9fLCBfRGlzdGFuY2U+JiBfX3gsCisgICAgICAgICAgY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIF9UcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZmVyZW5jZV9fLCBfRGlzdGFuY2U+JiBfX3kpCit7CisgIHJldHVybiBfX3kuYmFzZSgpIC0gX194LmJhc2UoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgY2xhc3MgX1RwLAorICAgICAgICAgIGNsYXNzIF9fUmVmZXJlbmNlLCBjbGFzcyBfRGlzdGFuY2U+CitpbmxpbmUgcmV2ZXJzZV9pdGVyYXRvcjxfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIF9UcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlZmVyZW5jZV9fLCBfRGlzdGFuY2U+ICBfU1RMUF9DQUxMCitvcGVyYXRvcisoX0Rpc3RhbmNlIF9fbiwKKyAgICAgICAgICBjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgX1RwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmZXJlbmNlX18sIF9EaXN0YW5jZT4mIF9feCkKK3sKKyAgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3I8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBfVHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZmVyZW5jZV9fLCBfRGlzdGFuY2U+KF9feC5iYXNlKCkgLSBfX24pOworfQorCisjZW5kaWYgLyogISBkZWZpbmVkICggX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTiApICovCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2VuZGlmIC8qIF9TVExQX0lOVEVSTkFMX0lURVJBVE9SX0ggKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL19saW1pdHMuYyBiL3N0bHBvcnQvc3RsL19saW1pdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTM4MDI0Ci0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvX2xpbWl0cy5jCkBAIC0wLDAgKzEsNDA1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk4LDE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfTElNSVRTX0MKKyNkZWZpbmUgX1NUTFBfTElNSVRTX0MKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9MSU1JVFMKKyMgIGluY2x1ZGUgPHN0bC9fbGltaXRzLmg+CisjZW5kaWYKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgbnVtZXJpY19saW1pdHMgc3RhdGljIG1lbWJlcnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCisjaWYgIWRlZmluZWQgKF9TVExQX1NUQVRJQ19DT05TVF9JTklUX0JVRykgJiYgIWRlZmluZWQgKF9TVExQX05PX1NUQVRJQ19DT05TVF9ERUZJTklUSU9OKQorCisjICBkZWZpbmUgX19kZWNsYXJlX251bWVyaWNfYmFzZV9tZW1iZXIoX190eXBlLCBfX21lbSkgXAordGVtcGxhdGUgPGNsYXNzIF9fbnVtYmVyPiBcCisgIGNvbnN0IF9fdHlwZSBfTnVtZXJpY19saW1pdHNfYmFzZTxfX251bWJlcj46OiBfX21lbQorCitfX2RlY2xhcmVfbnVtZXJpY19iYXNlX21lbWJlcihib29sLCBpc19zcGVjaWFsaXplZCk7CitfX2RlY2xhcmVfbnVtZXJpY19iYXNlX21lbWJlcihpbnQsIGRpZ2l0cyk7CitfX2RlY2xhcmVfbnVtZXJpY19iYXNlX21lbWJlcihpbnQsIGRpZ2l0czEwKTsKK19fZGVjbGFyZV9udW1lcmljX2Jhc2VfbWVtYmVyKGJvb2wsIGlzX3NpZ25lZCk7CitfX2RlY2xhcmVfbnVtZXJpY19iYXNlX21lbWJlcihib29sLCBpc19pbnRlZ2VyKTsKK19fZGVjbGFyZV9udW1lcmljX2Jhc2VfbWVtYmVyKGJvb2wsIGlzX2V4YWN0KTsKK19fZGVjbGFyZV9udW1lcmljX2Jhc2VfbWVtYmVyKGludCwgcmFkaXgpOworX19kZWNsYXJlX251bWVyaWNfYmFzZV9tZW1iZXIoaW50LCBtaW5fZXhwb25lbnQpOworX19kZWNsYXJlX251bWVyaWNfYmFzZV9tZW1iZXIoaW50LCBtYXhfZXhwb25lbnQpOworX19kZWNsYXJlX251bWVyaWNfYmFzZV9tZW1iZXIoaW50LCBtaW5fZXhwb25lbnQxMCk7CitfX2RlY2xhcmVfbnVtZXJpY19iYXNlX21lbWJlcihpbnQsIG1heF9leHBvbmVudDEwKTsKK19fZGVjbGFyZV9udW1lcmljX2Jhc2VfbWVtYmVyKGJvb2wsIGhhc19pbmZpbml0eSk7CitfX2RlY2xhcmVfbnVtZXJpY19iYXNlX21lbWJlcihib29sLCBoYXNfcXVpZXRfTmFOKTsKK19fZGVjbGFyZV9udW1lcmljX2Jhc2VfbWVtYmVyKGJvb2wsIGhhc19zaWduYWxpbmdfTmFOKTsKK19fZGVjbGFyZV9udW1lcmljX2Jhc2VfbWVtYmVyKGZsb2F0X2Rlbm9ybV9zdHlsZSwgaGFzX2Rlbm9ybSk7CitfX2RlY2xhcmVfbnVtZXJpY19iYXNlX21lbWJlcihib29sLCBoYXNfZGVub3JtX2xvc3MpOworX19kZWNsYXJlX251bWVyaWNfYmFzZV9tZW1iZXIoYm9vbCwgaXNfaWVjNTU5KTsKK19fZGVjbGFyZV9udW1lcmljX2Jhc2VfbWVtYmVyKGJvb2wsIGlzX2JvdW5kZWQpOworX19kZWNsYXJlX251bWVyaWNfYmFzZV9tZW1iZXIoYm9vbCwgaXNfbW9kdWxvKTsKK19fZGVjbGFyZV9udW1lcmljX2Jhc2VfbWVtYmVyKGJvb2wsIHRyYXBzKTsKK19fZGVjbGFyZV9udW1lcmljX2Jhc2VfbWVtYmVyKGJvb2wsIHRpbnluZXNzX2JlZm9yZSk7CitfX2RlY2xhcmVfbnVtZXJpY19iYXNlX21lbWJlcihmbG9hdF9yb3VuZF9zdHlsZSwgcm91bmRfc3R5bGUpOworCisjICB1bmRlZiBfX2RlY2xhcmVfbnVtZXJpY19iYXNlX21lbWJlcgorCisjICBkZWZpbmUgX19kZWNsYXJlX2ludGVnZXJfbGltaXRzX21lbWJlcihfX3R5cGUsIF9fbWVtKSBcCit0ZW1wbGF0ZSA8Y2xhc3MgX0ludCwgX1NUTFBfTElNSVRTX01JTl9UWVBFIF9faW1pbiwgX1NUTFBfTElNSVRTX01BWF9UWVBFIF9faW1heCwgaW50IF9faWRpZ2l0cywgYm9vbCBfX2lzbW9kPiBcCisgIGNvbnN0IF9fdHlwZSBfSW50ZWdlcl9saW1pdHM8X0ludCwgX19pbWluLCBfX2ltYXgsIF9faWRpZ2l0cywgX19pc21vZD46OiBfX21lbQorCitfX2RlY2xhcmVfaW50ZWdlcl9saW1pdHNfbWVtYmVyKGJvb2wsIGlzX3NwZWNpYWxpemVkKTsKK19fZGVjbGFyZV9pbnRlZ2VyX2xpbWl0c19tZW1iZXIoaW50LCBkaWdpdHMpOworX19kZWNsYXJlX2ludGVnZXJfbGltaXRzX21lbWJlcihpbnQsIGRpZ2l0czEwKTsKK19fZGVjbGFyZV9pbnRlZ2VyX2xpbWl0c19tZW1iZXIoYm9vbCwgaXNfc2lnbmVkKTsKK19fZGVjbGFyZV9pbnRlZ2VyX2xpbWl0c19tZW1iZXIoYm9vbCwgaXNfaW50ZWdlcik7CitfX2RlY2xhcmVfaW50ZWdlcl9saW1pdHNfbWVtYmVyKGJvb2wsIGlzX2V4YWN0KTsKK19fZGVjbGFyZV9pbnRlZ2VyX2xpbWl0c19tZW1iZXIoaW50LCByYWRpeCk7CitfX2RlY2xhcmVfaW50ZWdlcl9saW1pdHNfbWVtYmVyKGJvb2wsIGlzX2JvdW5kZWQpOworX19kZWNsYXJlX2ludGVnZXJfbGltaXRzX21lbWJlcihib29sLCBpc19tb2R1bG8pOworIyAgdW5kZWYgX19kZWNsYXJlX2ludGVnZXJfbGltaXRzX21lbWJlcgorCisjICBpZiBkZWZpbmVkIChfX0dOVUNfXykgJiYgKF9fR05VQ19fICE9IDIgfHwgX19HTlVDX01JTk9SX18gPiA5NikgJiYgKF9fR05VQ19fICE9IDMgfHwgX19HTlVDX01JTk9SX18gPT0gMCkgJiYgKF9fR05VQ19fIDw9IDMpCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKworIyAgICBkZWZpbmUgX19kZWNsYXJlX251bWVyaWNfbGltaXRzX21lbWJlcihfX2ludGVnZXIpIFwKKyAgX1NUTFBfVEVNUExBVEVfTlVMTCBjb25zdCBpbnQgbnVtZXJpY19saW1pdHM8X19pbnRlZ2VyPjo6ZGlnaXRzOyBcCisgIF9TVExQX1RFTVBMQVRFX05VTEwgY29uc3QgaW50IG51bWVyaWNfbGltaXRzPF9faW50ZWdlcj46OmRpZ2l0czEwOyBcCisgIF9TVExQX1RFTVBMQVRFX05VTEwgY29uc3QgaW50IG51bWVyaWNfbGltaXRzPF9faW50ZWdlcj46OnJhZGl4OyBcCisgIF9TVExQX1RFTVBMQVRFX05VTEwgY29uc3QgYm9vbCBudW1lcmljX2xpbWl0czxfX2ludGVnZXI+Ojppc19zcGVjaWFsaXplZDsgXAorICBfU1RMUF9URU1QTEFURV9OVUxMIGNvbnN0IGJvb2wgbnVtZXJpY19saW1pdHM8X19pbnRlZ2VyPjo6aXNfc2lnbmVkOyBcCisgIF9TVExQX1RFTVBMQVRFX05VTEwgY29uc3QgYm9vbCBudW1lcmljX2xpbWl0czxfX2ludGVnZXI+Ojppc19pbnRlZ2VyOyBcCisgIF9TVExQX1RFTVBMQVRFX05VTEwgY29uc3QgYm9vbCBudW1lcmljX2xpbWl0czxfX2ludGVnZXI+Ojppc19leGFjdDsgXAorICBfU1RMUF9URU1QTEFURV9OVUxMIGNvbnN0IGJvb2wgbnVtZXJpY19saW1pdHM8X19pbnRlZ2VyPjo6aXNfYm91bmRlZDsgXAorICBfU1RMUF9URU1QTEFURV9OVUxMIGNvbnN0IGJvb2wgbnVtZXJpY19saW1pdHM8X19pbnRlZ2VyPjo6aXNfbW9kdWxvCisKK19fZGVjbGFyZV9udW1lcmljX2xpbWl0c19tZW1iZXIoX1NUTFBfTE9OR19MT05HKTsKK19fZGVjbGFyZV9udW1lcmljX2xpbWl0c19tZW1iZXIodW5zaWduZWQgX1NUTFBfTE9OR19MT05HKTsKKworIyAgICB1bmRlZiBfX2RlY2xhcmVfbnVtZXJpY19saW1pdHNfbWVtYmVyCisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKyMgIGVuZGlmCisKKyMgIGRlZmluZSBfX2RlY2xhcmVfZmxvYXRfbGltaXRzX21lbWJlcihfX3R5cGUsIF9fbWVtKSBcCit0ZW1wbGF0ZSA8Y2xhc3MgX19udW1iZXIsICBcCisgICAgICAgICBpbnQgX19EaWdpdHMsIGludCBfX0RpZ2l0czEwLCAgICBcCisgICAgICAgICBpbnQgX19NaW5FeHAsIGludCBfX01heEV4cCwgICAgICBcCisgICAgICAgICBpbnQgX19NaW5FeHAxMCwgaW50IF9fTWF4RXhwMTAsICBcCisgICAgICAgICBib29sIF9fSXNJRUM1NTksIFwKKyAgICAgICAgIGZsb2F0X2Rlbm9ybV9zdHlsZSBfX0Rlbm9ybVN0eWxlLCBcCisgICAgICAgICBmbG9hdF9yb3VuZF9zdHlsZSBfX1JvdW5kU3R5bGU+IFwKK2NvbnN0IF9fdHlwZSBfRmxvYXRpbmdfbGltaXRzPCBfX251bWJlciwgX19EaWdpdHMsIF9fRGlnaXRzMTAsICAgIFwKKyAgICAgICAgIF9fTWluRXhwLCBfX01heEV4cCwgX19NaW5FeHAxMCwgX19NYXhFeHAxMCwgIFwKKyAgICAgICAgIF9fSXNJRUM1NTksIF9fRGVub3JtU3R5bGUsIF9fUm91bmRTdHlsZT46OlwKKyAgICAgICAgIF9fbWVtCisKK19fZGVjbGFyZV9mbG9hdF9saW1pdHNfbWVtYmVyKGJvb2wsIGlzX3NwZWNpYWxpemVkKTsKK19fZGVjbGFyZV9mbG9hdF9saW1pdHNfbWVtYmVyKGludCwgZGlnaXRzKTsKK19fZGVjbGFyZV9mbG9hdF9saW1pdHNfbWVtYmVyKGludCwgZGlnaXRzMTApOworX19kZWNsYXJlX2Zsb2F0X2xpbWl0c19tZW1iZXIoYm9vbCwgaXNfc2lnbmVkKTsKK19fZGVjbGFyZV9mbG9hdF9saW1pdHNfbWVtYmVyKGludCwgcmFkaXgpOworX19kZWNsYXJlX2Zsb2F0X2xpbWl0c19tZW1iZXIoaW50LCBtaW5fZXhwb25lbnQpOworX19kZWNsYXJlX2Zsb2F0X2xpbWl0c19tZW1iZXIoaW50LCBtYXhfZXhwb25lbnQpOworX19kZWNsYXJlX2Zsb2F0X2xpbWl0c19tZW1iZXIoaW50LCBtaW5fZXhwb25lbnQxMCk7CitfX2RlY2xhcmVfZmxvYXRfbGltaXRzX21lbWJlcihpbnQsIG1heF9leHBvbmVudDEwKTsKK19fZGVjbGFyZV9mbG9hdF9saW1pdHNfbWVtYmVyKGJvb2wsIGhhc19pbmZpbml0eSk7CitfX2RlY2xhcmVfZmxvYXRfbGltaXRzX21lbWJlcihib29sLCBoYXNfcXVpZXRfTmFOKTsKK19fZGVjbGFyZV9mbG9hdF9saW1pdHNfbWVtYmVyKGJvb2wsIGhhc19zaWduYWxpbmdfTmFOKTsKK19fZGVjbGFyZV9mbG9hdF9saW1pdHNfbWVtYmVyKGZsb2F0X2Rlbm9ybV9zdHlsZSwgaGFzX2Rlbm9ybSk7CitfX2RlY2xhcmVfZmxvYXRfbGltaXRzX21lbWJlcihib29sLCBoYXNfZGVub3JtX2xvc3MpOworX19kZWNsYXJlX2Zsb2F0X2xpbWl0c19tZW1iZXIoYm9vbCwgaXNfaWVjNTU5KTsKK19fZGVjbGFyZV9mbG9hdF9saW1pdHNfbWVtYmVyKGJvb2wsIGlzX2JvdW5kZWQpOworX19kZWNsYXJlX2Zsb2F0X2xpbWl0c19tZW1iZXIoYm9vbCwgdHJhcHMpOworX19kZWNsYXJlX2Zsb2F0X2xpbWl0c19tZW1iZXIoYm9vbCwgdGlueW5lc3NfYmVmb3JlKTsKK19fZGVjbGFyZV9mbG9hdF9saW1pdHNfbWVtYmVyKGZsb2F0X3JvdW5kX3N0eWxlLCByb3VuZF9zdHlsZSk7CisjICB1bmRlZiBfX2RlY2xhcmVfZmxvYXRfbGltaXRzX21lbWJlcgorCisjZW5kaWYKKworCisjaWYgZGVmaW5lZCAoX1NUTFBfRVhQT1NFX0dMT0JBTFNfSU1QTEVNRU5UQVRJT04pCisKKyMgIGlmIGRlZmluZWQgKF9fR05VQ19fKSB8fCBkZWZpbmVkIChfX0JPUkxBTkRDX18pCisjICAgIGRlZmluZSBfU1RMUF9BRERJVElPTkFMX09QRU5fQlJBQ0tFVCB7CisjICAgIGRlZmluZSBfU1RMUF9BRERJVElPTkFMX0NMT1NFX0JSQUNLRVQgfQorIyAgZWxzZQorIyAgICBkZWZpbmUgX1NUTFBfQURESVRJT05BTF9PUEVOX0JSQUNLRVQKKyMgICAgZGVmaW5lIF9TVExQX0FERElUSU9OQUxfQ0xPU0VfQlJBQ0tFVAorIyAgZW5kaWYKKworLyogVGhlIGZvbGxvd2luZyBjb2RlIGhhcyBiZWVuIGV4dHJhY3RlZCBmcm9tIHRoZSBib29zdCBsaWJyYXJpZXMgKHd3dy5ib29zdC5vcmcpIGFuZAorICogYWRhcHRlZCB3aXRoIHRoZSBTVExwb3J0IHBvcnRhYmlsaXR5IG1hY3Jvcy4gQWR2YW50YWdlIG9uIHByZXZpb3VzIHRlY2huaXF1ZSBpcyB0aGF0CisgKiBjb21wdXRhdGlvbiBvZiBpbmZpbml0eSBhbmQgTmFOIHZhbHVlcyBpcyBvbmx5IGJhc2VkIG9uIGJpZy9saXR0bGUgZW5kaWFuZXNzLCBjb21waWxlcgorICogZmxvYXQsIGRvdWJsZSBvciBsb25nIGRvdWJsZSByZXByZXNlbnRhdGlvbiBpcyB0YWtlbiBpbnRvIGFjY291bnQgdGhhbmtzIHRvIHRoZSBzaXplb2YKKyAqIG9wZXJhdG9yLiAqLwordGVtcGxhdGU8Y2xhc3MgX051bWJlciwgdW5zaWduZWQgc2hvcnQgX1dvcmQ+CitzdHJ1Y3QgZmxvYXRfaGVscGVyIHsKKyAgdW5pb24gX1dvcmRzTnVtYmVyIHsKKyAgICB1bnNpZ25lZCBzaG9ydCBfV29yZHNbOF07CisgICAgX051bWJlciBfbnVtOworICB9OworICBzdGF0aWMgX051bWJlciBnZXRfd29yZF9oaWdoZXIoKSBfU1RMUF9OT1RIUk9XIHsKKyAgICBfV29yZHNOdW1iZXIgX190bXAgPSB7IF9TVExQX0FERElUSU9OQUxfT1BFTl9CUkFDS0VUIF9Xb3JkLCAwLCAwLCAwLCAwLCAwLCAwLCAwIF9TVExQX0FERElUSU9OQUxfQ0xPU0VfQlJBQ0tFVCB9OworICAgIHJldHVybiBfX3RtcC5fbnVtOworICB9IAorICBzdGF0aWMgX051bWJlciBnZXRfd29yZF9sb3dlcigpIF9TVExQX05PVEhST1cgeworICAgIF9Xb3Jkc051bWJlciBfX3RtcCA9IHsgX1NUTFBfQURESVRJT05BTF9PUEVOX0JSQUNLRVQgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCBfU1RMUF9BRERJVElPTkFMX0NMT1NFX0JSQUNLRVQgfTsKKyAgICBfX3RtcC5fV29yZHNbKHNpemVvZihfTnVtYmVyKSA+PSAxMiA/IDEwIDogc2l6ZW9mKF9OdW1iZXIpKSAvIHNpemVvZih1bnNpZ25lZCBzaG9ydCkgLSAxXSA9IF9Xb3JkOworICAgIHJldHVybiBfX3RtcC5fbnVtOworICB9CisgIHN0YXRpYyBfTnVtYmVyIGdldF9mcm9tX2xhc3Rfd29yZCgpIF9TVExQX05PVEhST1cgeworIyAgaWYgZGVmaW5lZCAoX1NUTFBfQklHX0VORElBTikKKyAgICByZXR1cm4gZ2V0X3dvcmRfaGlnaGVyKCk7CisjICBlbHNlIC8qIF9TVExQX0xJVFRMRV9FTkRJQU4gKi8KKyAgICByZXR1cm4gZ2V0X3dvcmRfbG93ZXIoKTsKKyMgIGVuZGlmCisgIH0KKyAgc3RhdGljIF9OdW1iZXIgZ2V0X2Zyb21fZmlyc3Rfd29yZCgpIF9TVExQX05PVEhST1cgeworIyAgaWYgZGVmaW5lZCAoX1NUTFBfQklHX0VORElBTikKKyAgICByZXR1cm4gZ2V0X3dvcmRfbG93ZXIoKTsKKyMgIGVsc2UgLyogX1NUTFBfTElUVExFX0VORElBTiAqLworICAgIHJldHVybiBnZXRfd29yZF9oaWdoZXIoKTsKKyMgIGVuZGlmCisgIH0KK307CisKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9OT19MT05HX0RPVUJMRSkgJiYgIWRlZmluZWQgKF9TVExQX0JJR19FTkRJQU4pCit0ZW1wbGF0ZTxjbGFzcyBfTnVtYmVyLCB1bnNpZ25lZCBzaG9ydCBfV29yZDEsIHVuc2lnbmVkIHNob3J0IF9Xb3JkMj4KK3N0cnVjdCBmbG9hdF9oZWxwZXIyIHsKKyAgdW5pb24gX1dvcmRzTnVtYmVyIHsKKyAgICB1bnNpZ25lZCBzaG9ydCBfV29yZHNbOF07CisgICAgX051bWJlciBfbnVtOworICB9OworICAvL3N0YXRpYyBfTnVtYmVyIGdldF93b3JkX2hpZ2hlcigpIF9TVExQX05PVEhST1cgeworICAvLyAgX1dvcmRzTnVtYmVyIF9fdG1wID0geyBfU1RMUF9BRERJVElPTkFMX09QRU5fQlJBQ0tFVCBfV29yZDEsIF9Xb3JkMiwgMCwgMCwgMCwgMCwgMCwgMCBfU1RMUF9BRERJVElPTkFMX0NMT1NFX0JSQUNLRVQgfTsKKyAgLy8gIHJldHVybiBfX3RtcC5fbnVtOworICAvL30gCisgIHN0YXRpYyBfTnVtYmVyIGdldF93b3JkX2xvd2VyKCkgX1NUTFBfTk9USFJPVyB7CisgICAgX1dvcmRzTnVtYmVyIF9fdG1wID0geyBfU1RMUF9BRERJVElPTkFMX09QRU5fQlJBQ0tFVCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIF9TVExQX0FERElUSU9OQUxfQ0xPU0VfQlJBQ0tFVCB9OworICAgIF9fdG1wLl9Xb3Jkc1soc2l6ZW9mKF9OdW1iZXIpID49IDEyID8gMTAgOiBzaXplb2YoX051bWJlcikpIC8gc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSAtIDJdID0gX1dvcmQxOworICAgIF9fdG1wLl9Xb3Jkc1soc2l6ZW9mKF9OdW1iZXIpID49IDEyID8gMTAgOiBzaXplb2YoX051bWJlcikpIC8gc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSAtIDFdID0gX1dvcmQyOworICAgIHJldHVybiBfX3RtcC5fbnVtOworICB9CisgIHN0YXRpYyBfTnVtYmVyIGdldF9mcm9tX2xhc3Rfd29yZCgpIF9TVExQX05PVEhST1cgeworLy8jICAgIGlmIGRlZmluZWQgKF9TVExQX0JJR19FTkRJQU4pCisvLyAgICByZXR1cm4gZ2V0X3dvcmRfaGlnaGVyKCk7CisvLyMgICAgZWxzZSAvKiBfU1RMUF9MSVRUTEVfRU5ESUFOICovCisgICAgcmV0dXJuIGdldF93b3JkX2xvd2VyKCk7CisvLyMgICAgZW5kaWYKKyAgfQorfTsKKyMgIGVuZGlmCisKKy8qIEZvcm1lciB2YWx1ZXMga2VwdCBpbiBjYXNlIG1vdmluZyB0byBib29zdCBjb2RlIGhhcyBpbnRyb2R1Y2UgYSByZWdyZXNzaW9uIG9uCisgKiBzb21lIHBsYXRmb3JtLiAqLworI2lmIDAKKyMgIGlmIGRlZmluZWQgKF9TVExQX0JJR19FTkRJQU4pCisjICAgIGlmIGRlZmluZWQgKF9fT1M0MDBfXykKKyMgICAgICBkZWZpbmUgX1NUTFBfRkxPQVRfSU5GX1JFUCB7IDB4N2Y4MCwgMCB9CisjICAgICAgZGVmaW5lIF9TVExQX0ZMT0FUX1FOQU5fUkVQIHsgMHhmZmMwLCAwIH0KKyMgICAgICBkZWZpbmUgX1NUTFBfRkxPQVRfU05BTl9SRVAgeyAweGZmODAsIDAgfQorIyAgICAgIGRlZmluZSBfU1RMUF9ET1VCTEVfSU5GX1JFUCB7IDB4N2ZmMCwgMCwgMCwgMCB9CisjICAgICAgZGVmaW5lIF9TVExQX0RPVUJMRV9RTkFOX1JFUCB7IDB4ZmZmOCwgMCwgMCwgMCB9CisjICAgICAgZGVmaW5lIF9TVExQX0RPVUJMRV9TTkFOX1JFUCB7IDB4ZmZmMCwgMCwgMCwgMCB9CisjICAgICAgZGVmaW5lIF9TVExQX0xET1VCTEVfSU5GX1JFUCB7IDB4N2ZmMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9CisjICAgICAgZGVmaW5lIF9TVExQX0xET1VCTEVfUU5BTl9SRVAgeyAweGZmZjgsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfQorIyAgICAgIGRlZmluZSBfU1RMUF9MRE9VQkxFX1NOQU5fUkVQIHsgMHhmZmYwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0KKyMgICAgZWxzZSAvKiBfX09TNDAwX18gKi8KKyMgICAgICBkZWZpbmUgX1NUTFBfRkxPQVRfSU5GX1JFUCAgIHsgMHg3ZjgwLCAwIH0KKyMgICAgICBkZWZpbmUgX1NUTFBfRkxPQVRfUU5BTl9SRVAgIHsgMHg3ZmMxLCAwIH0KKyMgICAgICBkZWZpbmUgX1NUTFBfRkxPQVRfU05BTl9SRVAgIHsgMHg3ZjgxLCAwIH0KKyMgICAgICBkZWZpbmUgX1NUTFBfRE9VQkxFX0lORl9SRVAgIHsgMHg3ZmYwLCAwLCAwLCAwIH0KKyMgICAgICBkZWZpbmUgX1NUTFBfRE9VQkxFX1FOQU5fUkVQIHsgMHg3ZmY5LCAwLCAwLCAwIH0KKyMgICAgICBkZWZpbmUgX1NUTFBfRE9VQkxFX1NOQU5fUkVQIHsgMHg3ZmYxLCAwLCAwLCAwIH0KKyMgICAgICBkZWZpbmUgX1NUTFBfTERPVUJMRV9JTkZfUkVQIHsgMHg3ZmYwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0KKyMgICAgICBkZWZpbmUgX1NUTFBfTERPVUJMRV9RTkFOX1JFUCB7IDB4N2ZmMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9CisjICAgICAgZGVmaW5lIF9TVExQX0xET1VCTEVfU05BTl9SRVAgeyAweDdmZjksIDAsIDAsIDAsIDAsIDAsIDAsIDAgfQorIyAgICBlbmRpZiAvKiBfX09TNDAwX18gKi8KKyMgIGVsc2UgLyogX1NUTFBfTElUVExFX0VORElBTiAqLworIyAgICBpZiBkZWZpbmVkKF9fREVDQ1hYKQorIyAgICAgIGRlZmluZSBfU1RMUF9GTE9BVF9JTkZfUkVQIHsgMCwgMHg3ZjgwIH0KKyMgICAgICBkZWZpbmUgX1NUTFBfRkxPQVRfUU5BTl9SRVAgeyAwLCAweGZmYzAgfQorIyAgICAgIGRlZmluZSBfU1RMUF9GTE9BVF9TTkFOX1JFUCB7IDB4NTU1NSwgMHg3Zjg1IH0KKyMgICAgICBkZWZpbmUgX1NUTFBfRE9VQkxFX0lORl9SRVAgeyAwLCAwLCAwLCAweDdmZjAgfQorIyAgICAgIGRlZmluZSBfU1RMUF9ET1VCTEVfUU5BTl9SRVAgeyAwLCAwLCAwLCAweGZmZjggfQorIyAgICAgIGRlZmluZSBfU1RMUF9ET1VCTEVfU05BTl9SRVAgeyAweDU1NTUsIDB4NTU1NSwgMHg1NTU1LCAweDdmZjUgfQorIyAgICAgIGRlZmluZSBfU1RMUF9MRE9VQkxFX0lORl9SRVAgeyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAweDdmZmYgfQorIyAgICAgIGRlZmluZSBfU1RMUF9MRE9VQkxFX1FOQU5fUkVQIHsgMCwgMCwgMCwgMCwgMCwgMCwgMHg4MDAwLCAweGZmZmYgfQorIyAgICAgIGRlZmluZSBfU1RMUF9MRE9VQkxFX1NOQU5fUkVQIHsgMHg1NTU1LCAweDU1NTUsIDB4NTU1NSwgMHg1NTU1LCAweDU1NTUsIDB4NTU1NSwgMHg1NTU1LCAweDdmZmZ9CisjICAgIGVsc2UKKyMgICAgICBkZWZpbmUgX1NUTFBfRkxPQVRfSU5GX1JFUCB7IDAsIDB4N2Y4MCB9CisjICAgICAgZGVmaW5lIF9TVExQX0ZMT0FUX1FOQU5fUkVQIHsgMCwgMHg3ZmMwIH0KKyMgICAgICBkZWZpbmUgX1NUTFBfRkxPQVRfU05BTl9SRVAgeyAwLCAweDdmYTAgfQorIyAgICAgIGRlZmluZSBfU1RMUF9ET1VCTEVfSU5GX1JFUCB7IDAsIDAsIDAsIDB4N2ZmMCB9CisjICAgICAgZGVmaW5lIF9TVExQX0RPVUJMRV9RTkFOX1JFUCB7IDAsIDAsIDAsIDB4N2ZmOCB9CisjICAgICAgZGVmaW5lIF9TVExQX0RPVUJMRV9TTkFOX1JFUCB7IDAsIDAsIDAsIDB4N2ZmNCB9CisjICAgICAgaWYgZGVmaW5lZCAoX1NUTFBfTVNWQykgfHwgZGVmaW5lZCAoX19JQ0wpCisjICAgICAgICBkZWZpbmUgX1NUTFBfTERPVUJMRV9JTkZfUkVQIHsgMCwgMCwgMCwgMHg3RkYwLCAwIH0KKyMgICAgICAgIGRlZmluZSBfU1RMUF9MRE9VQkxFX1FOQU5fUkVQIHsgMCwgMCwgMCwgMHhGRkY4LCAwIH0KKyMgICAgICAgIGRlZmluZSBfU1RMUF9MRE9VQkxFX1NOQU5fUkVQIHsgMCwgMCwgMCwgMHhGRkY4LCAwIH0KKyMgICAgICBlbGlmIGRlZmluZWQgKF9fQk9STEFORENfXykKKyMgICAgICAgIGRlZmluZSBfU1RMUF9MRE9VQkxFX0lORl9SRVAgeyAwLCAwLCAwLCAweDgwMDAsIDB4N2ZmZiB9CisjICAgICAgICBkZWZpbmUgX1NUTFBfTERPVUJMRV9RTkFOX1JFUCB7IDAsIDAsIDAsIDB4YzAwMCwgMHg3ZmZmIH0KKyMgICAgICAgIGRlZmluZSBfU1RMUF9MRE9VQkxFX1NOQU5fUkVQIHsgMCwgMCwgMCwgMHhhMDAwLCAweDdmZmYgfQorIyAgICAgIGVsc2UKKyMgICAgICAgIGRlZmluZSBfU1RMUF9MRE9VQkxFX0lORl9SRVAgeyAwLCAwLCAwLCAweDgwMDAsIDB4N2ZmZiwgMCB9CisjICAgICAgICBkZWZpbmUgX1NUTFBfTERPVUJMRV9RTkFOX1JFUCB7IDAsIDAsIDAsIDB4YTAwMCwgMHg3ZmZmLCAwIH0KKyMgICAgICAgIGRlZmluZSBfU1RMUF9MRE9VQkxFX1NOQU5fUkVQIHsgMCwgMCwgMCwgMHhjMDAwLCAweDdmZmYsIDAgfQorIyAgICAgIGVuZGlmCisjICAgIGVuZGlmCisjICBlbmRpZgorCit1bmlvbiBfRl9yZXAgeworICB1bnNpZ25lZCBzaG9ydCByZXBbMl07CisgIGZsb2F0IHZhbDsKK307Cit1bmlvbiBfRF9yZXAgeworICB1bnNpZ25lZCBzaG9ydCByZXBbNF07CisgIGRvdWJsZSB2YWw7Cit9OworCisjICBpZm5kZWYgX1NUTFBfTk9fTE9OR19ET1VCTEUKK3VuaW9uIF9MRF9yZXAgeworICB1bnNpZ25lZCBzaG9ydCByZXBbOF07CisgIGxvbmcgZG91YmxlIHZhbDsKK307CisjICBlbmRpZgorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfX2R1bW15PgorZmxvYXQgX1NUTFBfQ0FMTCBfTGltRzxfX2R1bW15Pjo6Z2V0X0ZfaW5mKCkgeworICB0eXBlZGVmIGZsb2F0X2hlbHBlcjxmbG9hdCwgMHg3ZjgwdT4gX0Zsb2F0SGVscGVyOworICByZXR1cm4gX0Zsb2F0SGVscGVyOjpnZXRfZnJvbV9sYXN0X3dvcmQoKTsKK30KK3RlbXBsYXRlIDxjbGFzcyBfX2R1bW15PgorZmxvYXQgX1NUTFBfQ0FMTCBfTGltRzxfX2R1bW15Pjo6Z2V0X0ZfcU5hTigpIHsKKyAgdHlwZWRlZiBmbG9hdF9oZWxwZXI8ZmxvYXQsIDB4N2Y4MXU+IF9GbG9hdEhlbHBlcjsKKyAgcmV0dXJuIF9GbG9hdEhlbHBlcjo6Z2V0X2Zyb21fbGFzdF93b3JkKCk7Cit9Cit0ZW1wbGF0ZSA8Y2xhc3MgX19kdW1teT4KK2Zsb2F0IF9TVExQX0NBTEwgX0xpbUc8X19kdW1teT46OmdldF9GX3NOYU4oKSB7CisgIHR5cGVkZWYgZmxvYXRfaGVscGVyPGZsb2F0LCAweDdmYzF1PiBfRmxvYXRIZWxwZXI7CisgIHJldHVybiBfRmxvYXRIZWxwZXI6OmdldF9mcm9tX2xhc3Rfd29yZCgpOworfQordGVtcGxhdGUgPGNsYXNzIF9fZHVtbXk+CitmbG9hdCBfU1RMUF9DQUxMIF9MaW1HPF9fZHVtbXk+OjpnZXRfRl9kZW5vcm1NaW4oKSB7CisgIHR5cGVkZWYgZmxvYXRfaGVscGVyPGZsb2F0LCAweDAwMDF1PiBfRmxvYXRIZWxwZXI7CisgIHJldHVybiBfRmxvYXRIZWxwZXI6OmdldF9mcm9tX2ZpcnN0X3dvcmQoKTsKK30KKwordGVtcGxhdGUgPGludCBfX3VzZV9kb3VibGVfbGltaXRzPgorY2xhc3MgX051bWVyaWNMaW1pdHNBY2Nlc3M7CisKK19TVExQX1RFTVBMQVRFX05VTEwKK2NsYXNzIF9OdW1lcmljTGltaXRzQWNjZXNzPDE+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGRvdWJsZSBnZXRfaW5mKCkgeworICAgIHR5cGVkZWYgZmxvYXRfaGVscGVyPGRvdWJsZSwgMHg3ZmYwdT4gX0Zsb2F0SGVscGVyOworICAgIHJldHVybiBfRmxvYXRIZWxwZXI6OmdldF9mcm9tX2xhc3Rfd29yZCgpOworICB9CisgIHN0YXRpYyBkb3VibGUgZ2V0X3FOYU4oKSB7CisgICAgdHlwZWRlZiBmbG9hdF9oZWxwZXI8ZG91YmxlLCAweDdmZjF1PiBfRmxvYXRIZWxwZXI7CisgICAgcmV0dXJuIF9GbG9hdEhlbHBlcjo6Z2V0X2Zyb21fbGFzdF93b3JkKCk7CisgIH0KKyAgc3RhdGljIGRvdWJsZSBnZXRfc05hTigpIHsKKyAgICB0eXBlZGVmIGZsb2F0X2hlbHBlcjxkb3VibGUsIDB4N2ZmOXU+IF9GbG9hdEhlbHBlcjsKKyAgICByZXR1cm4gX0Zsb2F0SGVscGVyOjpnZXRfZnJvbV9sYXN0X3dvcmQoKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9fZHVtbXk+Citkb3VibGUgX1NUTFBfQ0FMTCBfTGltRzxfX2R1bW15Pjo6Z2V0X0RfaW5mKCkKK3sgcmV0dXJuIF9OdW1lcmljTGltaXRzQWNjZXNzPDE+OjpnZXRfaW5mKCk7IH0KK3RlbXBsYXRlIDxjbGFzcyBfX2R1bW15PgorZG91YmxlIF9TVExQX0NBTEwgX0xpbUc8X19kdW1teT46OmdldF9EX3FOYU4oKQoreyByZXR1cm4gX051bWVyaWNMaW1pdHNBY2Nlc3M8MT46OmdldF9xTmFOKCk7IH0KK3RlbXBsYXRlIDxjbGFzcyBfX2R1bW15PgorZG91YmxlIF9TVExQX0NBTEwgX0xpbUc8X19kdW1teT46OmdldF9EX3NOYU4oKQoreyByZXR1cm4gX051bWVyaWNMaW1pdHNBY2Nlc3M8MT46OmdldF9zTmFOKCk7IH0KK3RlbXBsYXRlIDxjbGFzcyBfX2R1bW15PgorZG91YmxlIF9TVExQX0NBTEwgX0xpbUc8X19kdW1teT46OmdldF9EX2Rlbm9ybU1pbigpIHsKKyAgdHlwZWRlZiBmbG9hdF9oZWxwZXI8ZG91YmxlLCAweDAwMDF1PiBfRmxvYXRIZWxwZXI7CisgIHJldHVybiBfRmxvYXRIZWxwZXI6OmdldF9mcm9tX2ZpcnN0X3dvcmQoKTsKK30KKworIyAgaWYgIWRlZmluZWQgKF9TVExQX05PX0xPTkdfRE9VQkxFKQorX1NUTFBfVEVNUExBVEVfTlVMTAorY2xhc3MgX051bWVyaWNMaW1pdHNBY2Nlc3M8MD4geworcHVibGljOgorICBzdGF0aWMgbG9uZyBkb3VibGUgZ2V0X2luZigpIHsKKyMgICAgaWYgZGVmaW5lZCAoX1NUTFBfQklHX0VORElBTikKKyAgICB0eXBlZGVmIGZsb2F0X2hlbHBlcjxsb25nIGRvdWJsZSwgMHg3ZmYwdT4gX0Zsb2F0SGVscGVyOworIyAgICBlbHNlCisgICAgdHlwZWRlZiBmbG9hdF9oZWxwZXIyPGxvbmcgZG91YmxlLCAweDgwMDB1LCAweDdmZmZ1PiBfRmxvYXRIZWxwZXI7CisjICAgIGVuZGlmCisgICAgcmV0dXJuIF9GbG9hdEhlbHBlcjo6Z2V0X2Zyb21fbGFzdF93b3JkKCk7CisgIH0KKyAgc3RhdGljIGxvbmcgZG91YmxlIGdldF9xTmFOKCkgeworIyAgICBpZiBkZWZpbmVkIChfU1RMUF9CSUdfRU5ESUFOKQorICAgIHR5cGVkZWYgZmxvYXRfaGVscGVyPGxvbmcgZG91YmxlLCAweDdmZjF1PiBfRmxvYXRIZWxwZXI7CisjICAgIGVsc2UKKyAgICB0eXBlZGVmIGZsb2F0X2hlbHBlcjI8bG9uZyBkb3VibGUsIDB4YzAwMHUsIDB4N2ZmZnU+IF9GbG9hdEhlbHBlcjsKKyMgICAgZW5kaWYKKyAgICByZXR1cm4gX0Zsb2F0SGVscGVyOjpnZXRfZnJvbV9sYXN0X3dvcmQoKTsKKyAgfQorICBzdGF0aWMgbG9uZyBkb3VibGUgZ2V0X3NOYU4oKSB7CisjICAgIGlmIGRlZmluZWQgKF9TVExQX0JJR19FTkRJQU4pCisgICAgdHlwZWRlZiBmbG9hdF9oZWxwZXI8bG9uZyBkb3VibGUsIDB4N2ZmOXU+IF9GbG9hdEhlbHBlcjsKKyMgICAgZWxzZQorICAgIHR5cGVkZWYgZmxvYXRfaGVscGVyMjxsb25nIGRvdWJsZSwgMHg5MDAwdSwgMHg3ZmZmdT4gX0Zsb2F0SGVscGVyOworIyAgICBlbmRpZgorICAgIHJldHVybiBfRmxvYXRIZWxwZXI6OmdldF9mcm9tX2xhc3Rfd29yZCgpOworICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX19kdW1teT4KK2xvbmcgZG91YmxlIF9TVExQX0NBTEwgX0xpbUc8X19kdW1teT46OmdldF9MRF9pbmYoKSB7CisgIGNvbnN0IGludCBfX3VzZV9kb3VibGVfbGltaXRzID0gc2l6ZW9mKGRvdWJsZSkgPT0gc2l6ZW9mKGxvbmcgZG91YmxlKSA/IDEgOiAwOworICByZXR1cm4gX051bWVyaWNMaW1pdHNBY2Nlc3M8X191c2VfZG91YmxlX2xpbWl0cz46OmdldF9pbmYoKTsKK30KK3RlbXBsYXRlIDxjbGFzcyBfX2R1bW15PgorbG9uZyBkb3VibGUgX1NUTFBfQ0FMTCBfTGltRzxfX2R1bW15Pjo6Z2V0X0xEX3FOYU4oKSB7CisgIGNvbnN0IGludCBfX3VzZV9kb3VibGVfbGltaXRzID0gc2l6ZW9mKGRvdWJsZSkgPT0gc2l6ZW9mKGxvbmcgZG91YmxlKSA/IDEgOiAwOworICByZXR1cm4gX051bWVyaWNMaW1pdHNBY2Nlc3M8X191c2VfZG91YmxlX2xpbWl0cz46OmdldF9xTmFOKCk7Cit9Cit0ZW1wbGF0ZSA8Y2xhc3MgX19kdW1teT4KK2xvbmcgZG91YmxlIF9TVExQX0NBTEwgX0xpbUc8X19kdW1teT46OmdldF9MRF9zTmFOKCkgeworICBjb25zdCBpbnQgX191c2VfZG91YmxlX2xpbWl0cyA9IHNpemVvZihkb3VibGUpID09IHNpemVvZihsb25nIGRvdWJsZSkgPyAxIDogMDsKKyAgcmV0dXJuIF9OdW1lcmljTGltaXRzQWNjZXNzPF9fdXNlX2RvdWJsZV9saW1pdHM+OjpnZXRfc05hTigpOworfQordGVtcGxhdGUgPGNsYXNzIF9fZHVtbXk+Citsb25nIGRvdWJsZSBfU1RMUF9DQUxMIF9MaW1HPF9fZHVtbXk+OjpnZXRfTERfZGVub3JtTWluKCkgeworICB0eXBlZGVmIGZsb2F0X2hlbHBlcjxsb25nIGRvdWJsZSwgMHgwMDAxdT4gX0Zsb2F0SGVscGVyOworICByZXR1cm4gX0Zsb2F0SGVscGVyOjpnZXRfZnJvbV9maXJzdF93b3JkKCk7Cit9CisjICBlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfRVhQT1NFX0dMT0JBTFNfSU1QTEVNRU5UQVRJT04gKi8KKworI3VuZGVmIF9TVExQX0xJTUlUU19NSU5fVFlQRQorI3VuZGVmIF9TVExQX0xJTUlUU19NQVhfVFlQRQorCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLyogX1NUTFBfTElNSVRTX0NfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL19saW1pdHMuaCBiL3N0bHBvcnQvc3RsL19saW1pdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDA5MWY2Ci0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvX2xpbWl0cy5oCkBAIC0wLDAgKzEsNTE5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisvKiBOT1RFOiBUaGlzIG1heSBiZSBub3QgcG9ydGFibGUgY29kZS4gUGFydHMgb2YgbnVtZXJpY19saW1pdHM8PiBhcmUKKyAqIGluaGVyZW50bHkgbWFjaGluZS1kZXBlbmRlbnQuICBBdCBwcmVzZW50IHRoaXMgZmlsZSBpcyBzdWl0YWJsZQorICogZm9yIHRoZSBNSVBTLCBTUEFSQywgQWxwaGEgYW5kIGlhMzIgYXJjaGl0ZWN0dXJlcy4KKyAqLworCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0xJTUlUUworI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9MSU1JVFMKKworI2lmbmRlZiBfU1RMUF9DTElNSVRTCisjICBpbmNsdWRlIDxjbGltaXRzPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfQ0ZMT0FUCisjICBpbmNsdWRlIDxjZmxvYXQ+CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX0hBU19XQ0hBUl9UKSAmJiAhZGVmaW5lZCAoX1NUTFBfSU5URVJOQUxfQ1dDSEFSKQorIyAgaW5jbHVkZSA8c3RsL19jd2NoYXIuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworZW51bSBmbG9hdF9yb3VuZF9zdHlsZSB7CisgIHJvdW5kX2luZGV0ZXJtaW5hdGUgICAgICAgPSAtMSwKKyAgcm91bmRfdG93YXJkX3plcm8gICAgICAgICA9ICAwLAorICByb3VuZF90b19uZWFyZXN0ICAgICAgICAgID0gIDEsCisgIHJvdW5kX3Rvd2FyZF9pbmZpbml0eSAgICAgPSAgMiwKKyAgcm91bmRfdG93YXJkX25lZ19pbmZpbml0eSA9ICAzCit9OworCitlbnVtIGZsb2F0X2Rlbm9ybV9zdHlsZSB7CisgIGRlbm9ybV9pbmRldGVybWluYXRlID0gLTEsCisgIGRlbm9ybV9hYnNlbnQgICAgICAgID0gIDAsCisgIGRlbm9ybV9wcmVzZW50ICAgICAgID0gIDEKK307CisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKworLy8gQmFzZSBjbGFzcyBmb3IgYWxsIHNwZWNpYWxpemF0aW9ucyBvZiBudW1lcmljX2xpbWl0cy4KK3RlbXBsYXRlIDxjbGFzcyBfX251bWJlcj4KK2NsYXNzIF9OdW1lcmljX2xpbWl0c19iYXNlIHsKK3B1YmxpYzoKKworICBzdGF0aWMgX19udW1iZXIgKF9TVExQX0NBTEwgbWluKSgpIF9TVExQX05PVEhST1cgeyByZXR1cm4gX19udW1iZXIoKTsgfQorICBzdGF0aWMgX19udW1iZXIgKF9TVExQX0NBTEwgbWF4KSgpIF9TVExQX05PVEhST1cgeyByZXR1cm4gX19udW1iZXIoKTsgfQorCisgIF9TVExQX1NUQVRJQ19DT05TVEFOVChpbnQsIGRpZ2l0cyA9IDApOworICBfU1RMUF9TVEFUSUNfQ09OU1RBTlQoaW50LCBkaWdpdHMxMCA9IDApOworICBfU1RMUF9TVEFUSUNfQ09OU1RBTlQoaW50LCByYWRpeCA9IDApOworICBfU1RMUF9TVEFUSUNfQ09OU1RBTlQoaW50LCBtaW5fZXhwb25lbnQgPSAwKTsKKyAgX1NUTFBfU1RBVElDX0NPTlNUQU5UKGludCwgbWluX2V4cG9uZW50MTAgPSAwKTsKKyAgX1NUTFBfU1RBVElDX0NPTlNUQU5UKGludCwgbWF4X2V4cG9uZW50ID0gMCk7CisgIF9TVExQX1NUQVRJQ19DT05TVEFOVChpbnQsIG1heF9leHBvbmVudDEwID0gMCk7CisKKyAgX1NUTFBfU1RBVElDX0NPTlNUQU5UKGZsb2F0X2Rlbm9ybV9zdHlsZSwgaGFzX2Rlbm9ybSA9IGRlbm9ybV9hYnNlbnQpOworICBfU1RMUF9TVEFUSUNfQ09OU1RBTlQoZmxvYXRfcm91bmRfc3R5bGUsIHJvdW5kX3N0eWxlID0gcm91bmRfdG93YXJkX3plcm8pOworCisgIF9TVExQX1NUQVRJQ19DT05TVEFOVChib29sLCBpc19zcGVjaWFsaXplZCA9IGZhbHNlKTsKKyAgX1NUTFBfU1RBVElDX0NPTlNUQU5UKGJvb2wsIGlzX3NpZ25lZCAgPSBmYWxzZSk7CisgIF9TVExQX1NUQVRJQ19DT05TVEFOVChib29sLCBpc19pbnRlZ2VyID0gZmFsc2UpOworICBfU1RMUF9TVEFUSUNfQ09OU1RBTlQoYm9vbCwgaXNfZXhhY3QgPSBmYWxzZSk7CisgIF9TVExQX1NUQVRJQ19DT05TVEFOVChib29sLCBoYXNfaW5maW5pdHkgPSBmYWxzZSk7CisgIF9TVExQX1NUQVRJQ19DT05TVEFOVChib29sLCBoYXNfcXVpZXRfTmFOID0gZmFsc2UpOworICBfU1RMUF9TVEFUSUNfQ09OU1RBTlQoYm9vbCwgaGFzX3NpZ25hbGluZ19OYU4gPSBmYWxzZSk7CisgIF9TVExQX1NUQVRJQ19DT05TVEFOVChib29sLCBoYXNfZGVub3JtX2xvc3MgPSBmYWxzZSk7CisgIF9TVExQX1NUQVRJQ19DT05TVEFOVChib29sLCBpc19pZWM1NTkgPSBmYWxzZSk7CisgIF9TVExQX1NUQVRJQ19DT05TVEFOVChib29sLCBpc19ib3VuZGVkID0gZmFsc2UpOworICBfU1RMUF9TVEFUSUNfQ09OU1RBTlQoYm9vbCwgaXNfbW9kdWxvID0gZmFsc2UpOworICBfU1RMUF9TVEFUSUNfQ09OU1RBTlQoYm9vbCwgdHJhcHMgPSBmYWxzZSk7CisgIF9TVExQX1NUQVRJQ19DT05TVEFOVChib29sLCB0aW55bmVzc19iZWZvcmUgPSBmYWxzZSk7CisKKyAgc3RhdGljIF9fbnVtYmVyIF9TVExQX0NBTEwgZXBzaWxvbigpIF9TVExQX05PVEhST1cgICAgIHsgcmV0dXJuIF9fbnVtYmVyKCk7IH0KKyAgc3RhdGljIF9fbnVtYmVyIF9TVExQX0NBTEwgcm91bmRfZXJyb3IoKSBfU1RMUF9OT1RIUk9XIHsgcmV0dXJuIF9fbnVtYmVyKCk7IH0KKworICBzdGF0aWMgX19udW1iZXIgX1NUTFBfQ0FMTCBpbmZpbml0eSgpIF9TVExQX05PVEhST1cgICAgICB7IHJldHVybiBfX251bWJlcigpOyB9CisgIHN0YXRpYyBfX251bWJlciBfU1RMUF9DQUxMIHF1aWV0X05hTigpIF9TVExQX05PVEhST1cgICAgIHsgcmV0dXJuIF9fbnVtYmVyKCk7IH0KKyAgc3RhdGljIF9fbnVtYmVyIF9TVExQX0NBTEwgc2lnbmFsaW5nX05hTigpIF9TVExQX05PVEhST1cgeyByZXR1cm4gX19udW1iZXIoKTsgfQorICBzdGF0aWMgX19udW1iZXIgX1NUTFBfQ0FMTCBkZW5vcm1fbWluKCkgX1NUTFBfTk9USFJPVyAgICB7IHJldHVybiBfX251bWJlcigpOyB9Cit9OworCisvLyBCYXNlIGNsYXNzIGZvciBpbnRlZ2Vycy4KKworI2lmZGVmIF9TVExQX0xJTUlURURfREVGQVVMVF9URU1QTEFURVMKKyMgIGlmZGVmIF9TVExQX0xPTkdfTE9ORworIyAgICBkZWZpbmUgX1NUTFBfTElNSVRTX01JTl9UWVBFIF9TVExQX0xPTkdfTE9ORworIyAgICBkZWZpbmUgX1NUTFBfTElNSVRTX01BWF9UWVBFIHVuc2lnbmVkIF9TVExQX0xPTkdfTE9ORworIyAgZWxzZQorIyAgICBkZWZpbmUgX1NUTFBfTElNSVRTX01JTl9UWVBFIGxvbmcKKyMgICAgZGVmaW5lIF9TVExQX0xJTUlUU19NQVhfVFlQRSB1bnNpZ25lZCBsb25nCisjICBlbmRpZgorI2Vsc2UKKyMgIGRlZmluZSBfU1RMUF9MSU1JVFNfTUlOX1RZUEUgX0ludAorIyAgZGVmaW5lIF9TVExQX0xJTUlUU19NQVhfVFlQRSBfSW50CisjZW5kaWYgLyogX1NUTFBfTElNSVRFRF9ERUZBVUxUX1RFTVBMQVRFUyAqLworCit0ZW1wbGF0ZSA8Y2xhc3MgX0ludCwKKyAgICAgICAgICBfU1RMUF9MSU1JVFNfTUlOX1RZUEUgX19pbWluLAorICAgICAgICAgIF9TVExQX0xJTUlUU19NQVhfVFlQRSBfX2ltYXgsCisgICAgICAgICAgaW50IF9faWRpZ2l0cywgYm9vbCBfX2lzbW9kPgorY2xhc3MgX0ludGVnZXJfbGltaXRzIDogcHVibGljIF9OdW1lcmljX2xpbWl0c19iYXNlPF9JbnQ+IHsKK3B1YmxpYzoKKworICBzdGF0aWMgX0ludCAoX1NUTFBfQ0FMTCBtaW4pICgpIF9TVExQX05PVEhST1cgeyByZXR1cm4gKF9JbnQpX19pbWluOyB9CisgIHN0YXRpYyBfSW50IChfU1RMUF9DQUxMIG1heCkgKCkgX1NUTFBfTk9USFJPVyB7IHJldHVybiAoX0ludClfX2ltYXg7IH0KKworICBfU1RMUF9TVEFUSUNfQ09OU1RBTlQoaW50LCBkaWdpdHMgPSAoX19pZGlnaXRzIDwgMCkgPyAoKGludCkoKHNpemVvZihfSW50KSAqIChDSEFSX0JJVCkpKSAtICgoX19pbWluID09IDApID8gMCA6IDEpKSA6IChfX2lkaWdpdHMpKTsKKyAgX1NUTFBfU1RBVElDX0NPTlNUQU5UKGludCwgZGlnaXRzMTAgPSAoZGlnaXRzICogMzAxVUwpIC8gMTAwMCk7CisgIF9TVExQX1NUQVRJQ19DT05TVEFOVChpbnQsIHJhZGl4ID0gMik7CisgIF9TVExQX1NUQVRJQ19DT05TVEFOVChib29sLCBpc19zcGVjaWFsaXplZCA9IHRydWUpOworICBfU1RMUF9TVEFUSUNfQ09OU1RBTlQoYm9vbCwgaXNfc2lnbmVkID0gKF9faW1pbiAhPSAwKSk7CisgIF9TVExQX1NUQVRJQ19DT05TVEFOVChib29sLCBpc19pbnRlZ2VyID0gdHJ1ZSk7CisgIF9TVExQX1NUQVRJQ19DT05TVEFOVChib29sLCBpc19leGFjdCA9IHRydWUpOworICBfU1RMUF9TVEFUSUNfQ09OU1RBTlQoYm9vbCwgaXNfYm91bmRlZCA9IHRydWUpOworICBfU1RMUF9TVEFUSUNfQ09OU1RBTlQoYm9vbCwgaXNfbW9kdWxvID0gX19pc21vZCk7Cit9OworCisvLyBCYXNlIGNsYXNzIGZvciBmbG9hdGluZy1wb2ludCBudW1iZXJzLgordGVtcGxhdGUgPGNsYXNzIF9fbnVtYmVyLAorICAgICAgICAgaW50IF9fRGlnaXRzLCBpbnQgX19EaWdpdHMxMCwKKyAgICAgICAgIGludCBfX01pbkV4cCwgaW50IF9fTWF4RXhwLAorICAgICAgICAgaW50IF9fTWluRXhwMTAsIGludCBfX01heEV4cDEwLAorICAgICAgICAgYm9vbCBfX0lzSUVDNTU5LAorICAgICAgICAgZmxvYXRfZGVub3JtX3N0eWxlIF9fRGVub3JtU3R5bGUsCisgICAgICAgICBmbG9hdF9yb3VuZF9zdHlsZSBfX1JvdW5kU3R5bGU+CitjbGFzcyBfRmxvYXRpbmdfbGltaXRzIDogcHVibGljIF9OdW1lcmljX2xpbWl0c19iYXNlPF9fbnVtYmVyPiB7CitwdWJsaWM6CisKKyAgX1NUTFBfU1RBVElDX0NPTlNUQU5UKGludCwgZGlnaXRzID0gX19EaWdpdHMpOworICBfU1RMUF9TVEFUSUNfQ09OU1RBTlQoaW50LCBkaWdpdHMxMCA9IF9fRGlnaXRzMTApOworICBfU1RMUF9TVEFUSUNfQ09OU1RBTlQoaW50LCByYWRpeCA9IEZMVF9SQURJWCk7CisgIF9TVExQX1NUQVRJQ19DT05TVEFOVChpbnQsIG1pbl9leHBvbmVudCA9IF9fTWluRXhwKTsKKyAgX1NUTFBfU1RBVElDX0NPTlNUQU5UKGludCwgbWF4X2V4cG9uZW50ID0gX19NYXhFeHApOworICBfU1RMUF9TVEFUSUNfQ09OU1RBTlQoaW50LCBtaW5fZXhwb25lbnQxMCA9IF9fTWluRXhwMTApOworICBfU1RMUF9TVEFUSUNfQ09OU1RBTlQoaW50LCBtYXhfZXhwb25lbnQxMCA9IF9fTWF4RXhwMTApOworCisgIF9TVExQX1NUQVRJQ19DT05TVEFOVChmbG9hdF9kZW5vcm1fc3R5bGUsIGhhc19kZW5vcm0gPSBfX0Rlbm9ybVN0eWxlKTsKKyAgX1NUTFBfU1RBVElDX0NPTlNUQU5UKGZsb2F0X3JvdW5kX3N0eWxlLCByb3VuZF9zdHlsZSA9IF9fUm91bmRTdHlsZSk7CisKKyAgX1NUTFBfU1RBVElDX0NPTlNUQU5UKGJvb2wsIGlzX3NwZWNpYWxpemVkID0gdHJ1ZSk7CisgIF9TVExQX1NUQVRJQ19DT05TVEFOVChib29sLCBpc19zaWduZWQgPSB0cnVlKTsKKworICBfU1RMUF9TVEFUSUNfQ09OU1RBTlQoYm9vbCwgaGFzX2luZmluaXR5ID0gdHJ1ZSk7CisjaWYgKCFkZWZpbmVkIChfU1RMUF9NU1ZDKSB8fCAoX1NUTFBfTVNWQyA+IDEzMDApKSAmJiBcCisgICAgKCFkZWZpbmVkIChfX0JPUkxBTkRDX18pIHx8IChfX0JPUkxBTkRDX18gPj0gMHg1OTApKSAmJiBcCisgICAgKCFkZWZpbmVkIChfQ1JBWSkgfHwgZGVmaW5lZCAoX0NSQVlJRUVFKSkKKyAgX1NUTFBfU1RBVElDX0NPTlNUQU5UKGJvb2wsIGhhc19xdWlldF9OYU4gPSB0cnVlKTsKKyAgX1NUTFBfU1RBVElDX0NPTlNUQU5UKGJvb2wsIGhhc19zaWduYWxpbmdfTmFOID0gdHJ1ZSk7CisjZWxzZQorICBfU1RMUF9TVEFUSUNfQ09OU1RBTlQoYm9vbCwgaGFzX3F1aWV0X05hTiA9IGZhbHNlKTsKKyAgX1NUTFBfU1RBVElDX0NPTlNUQU5UKGJvb2wsIGhhc19zaWduYWxpbmdfTmFOID0gZmFsc2UpOworI2VuZGlmCisKKyAgX1NUTFBfU1RBVElDX0NPTlNUQU5UKGJvb2wsIGlzX2llYzU1OSA9IF9fSXNJRUM1NTkgJiYgaGFzX2luZmluaXR5ICYmIGhhc19xdWlldF9OYU4gJiYgaGFzX3NpZ25hbGluZ19OYU4gJiYgKGhhc19kZW5vcm0gPT0gZGVub3JtX3ByZXNlbnQpKTsKKyAgX1NUTFBfU1RBVElDX0NPTlNUQU5UKGJvb2wsIGhhc19kZW5vcm1fbG9zcyA9ICBmYWxzZSk7CisgIF9TVExQX1NUQVRJQ19DT05TVEFOVChib29sLCBpc19ib3VuZGVkID0gdHJ1ZSk7CisgIF9TVExQX1NUQVRJQ19DT05TVEFOVChib29sLCB0cmFwcyA9IHRydWUpOworICBfU1RMUF9TVEFUSUNfQ09OU1RBTlQoYm9vbCwgdGlueW5lc3NfYmVmb3JlID0gZmFsc2UpOworfTsKKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKKy8vIENsYXNzIG51bWVyaWNfbGltaXRzCisKKy8vIFRoZSB1bnNwZWNpYWxpemVkIGNsYXNzLgorCit0ZW1wbGF0ZTxjbGFzcyBfVHA+CitjbGFzcyBudW1lcmljX2xpbWl0cyA6IHB1YmxpYyBfU1RMUF9QUklWIF9OdW1lcmljX2xpbWl0c19iYXNlPF9UcD4ge307CisKKy8vIFNwZWNpYWxpemF0aW9ucyBmb3IgYWxsIGJ1aWx0LWluIGludGVncmFsIHR5cGVzLgorCisjaWYgIWRlZmluZWQgKF9TVExQX05PX0JPT0wpCitfU1RMUF9URU1QTEFURV9OVUxMCitjbGFzcyBudW1lcmljX2xpbWl0czxib29sPgorICA6IHB1YmxpYyBfU1RMUF9QUklWIF9JbnRlZ2VyX2xpbWl0czxib29sLCBmYWxzZSwgdHJ1ZSwgMSwgZmFsc2U+Cit7fTsKKyNlbmRpZiAvKiBfU1RMUF9OT19CT09MICovCisKK19TVExQX1RFTVBMQVRFX05VTEwKK2NsYXNzIG51bWVyaWNfbGltaXRzPGNoYXI+CisgIDogcHVibGljIF9TVExQX1BSSVYgX0ludGVnZXJfbGltaXRzPGNoYXIsIENIQVJfTUlOLCBDSEFSX01BWCwgLTEsIHRydWU+Cit7fTsKKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19TSUdORURfQlVJTFRJTlMpCitfU1RMUF9URU1QTEFURV9OVUxMCitjbGFzcyBudW1lcmljX2xpbWl0czxzaWduZWQgY2hhcj4KKyAgOiBwdWJsaWMgX1NUTFBfUFJJViBfSW50ZWdlcl9saW1pdHM8c2lnbmVkIGNoYXIsIFNDSEFSX01JTiwgU0NIQVJfTUFYLCAtMSwgdHJ1ZT4KK3t9OworI2VuZGlmCisKK19TVExQX1RFTVBMQVRFX05VTEwKK2NsYXNzIG51bWVyaWNfbGltaXRzPHVuc2lnbmVkIGNoYXI+CisgIDogcHVibGljIF9TVExQX1BSSVYgX0ludGVnZXJfbGltaXRzPHVuc2lnbmVkIGNoYXIsIDAsIFVDSEFSX01BWCwgLTEsIHRydWU+Cit7fTsKKworI2lmICEoZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkgfHwgZGVmaW5lZCAoX1NUTFBfV0NIQVJfVF9JU19VU0hPUlQpKQorCitfU1RMUF9URU1QTEFURV9OVUxMCitjbGFzcyBudW1lcmljX2xpbWl0czx3Y2hhcl90PgorICA6IHB1YmxpYyBfU1RMUF9QUklWIF9JbnRlZ2VyX2xpbWl0czx3Y2hhcl90LCBXQ0hBUl9NSU4sIFdDSEFSX01BWCwgLTEsIHRydWU+Cit7fTsKKworI2VuZGlmCisKK19TVExQX1RFTVBMQVRFX05VTEwKK2NsYXNzIG51bWVyaWNfbGltaXRzPHNob3J0PgorICA6IHB1YmxpYyBfU1RMUF9QUklWIF9JbnRlZ2VyX2xpbWl0czxzaG9ydCwgU0hSVF9NSU4sIFNIUlRfTUFYLCAtMSwgdHJ1ZT4KK3t9OworCitfU1RMUF9URU1QTEFURV9OVUxMCitjbGFzcyBudW1lcmljX2xpbWl0czx1bnNpZ25lZCBzaG9ydD4KKyAgOiBwdWJsaWMgX1NUTFBfUFJJViBfSW50ZWdlcl9saW1pdHM8dW5zaWduZWQgc2hvcnQsIDAsIFVTSFJUX01BWCwgLTEsIHRydWU+Cit7fTsKKworI2lmIGRlZmluZWQgKF9feGxDX18pICYmIChfX3hsQ19fID09IDB4NTAwKQorIyAgdW5kZWYgSU5UX01JTgorIyAgZGVmaW5lIElOVF9NSU4gLTIxNDc0ODM2NDgKKyNlbmRpZgorCitfU1RMUF9URU1QTEFURV9OVUxMCitjbGFzcyBudW1lcmljX2xpbWl0czxpbnQ+CisgIDogcHVibGljIF9TVExQX1BSSVYgX0ludGVnZXJfbGltaXRzPGludCwgSU5UX01JTiwgSU5UX01BWCwgLTEsIHRydWU+Cit7fTsKKworX1NUTFBfVEVNUExBVEVfTlVMTAorY2xhc3MgbnVtZXJpY19saW1pdHM8dW5zaWduZWQgaW50PgorICA6IHB1YmxpYyBfU1RMUF9QUklWIF9JbnRlZ2VyX2xpbWl0czx1bnNpZ25lZCBpbnQsIDAsIFVJTlRfTUFYLCAtMSwgdHJ1ZT4KK3t9OworCitfU1RMUF9URU1QTEFURV9OVUxMCitjbGFzcyBudW1lcmljX2xpbWl0czxsb25nPgorICA6IHB1YmxpYyBfU1RMUF9QUklWIF9JbnRlZ2VyX2xpbWl0czxsb25nLCBMT05HX01JTiwgTE9OR19NQVgsIC0xLCB0cnVlPgore307CisKK19TVExQX1RFTVBMQVRFX05VTEwKK2NsYXNzIG51bWVyaWNfbGltaXRzPHVuc2lnbmVkIGxvbmc+CisgIDogcHVibGljIF9TVExQX1BSSVYgX0ludGVnZXJfbGltaXRzPHVuc2lnbmVkIGxvbmcsIDAsIFVMT05HX01BWCwgLTEsIHRydWU+Cit7fTsKKworI2lmIGRlZmluZWQgKF9TVExQX0xPTkdfTE9ORykKKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfTVNWQykgfHwgZGVmaW5lZCAoX19CT1JMQU5EQ19fKQorIyAgICBkZWZpbmUgTE9OR0xPTkdfTUFYICAgICAweDdmZmZmZmZmZmZmZmZmZmZpNjQKKyMgICAgZGVmaW5lIExPTkdMT05HX01JTiAgICAgKC1MT05HTE9OR19NQVgtMWk2NCkKKyMgICAgZGVmaW5lIFVMT05HTE9OR19NQVggICAgMHhmZmZmZmZmZmZmZmZmZmZmVWk2NAorIyAgZWxzZQorIyAgICBpZm5kZWYgTE9OR0xPTkdfTUFYCisjICAgICAgZGVmaW5lIExPTkdMT05HX01BWCAgIDB4N2ZmZmZmZmZmZmZmZmZmZkxMCisjICAgIGVuZGlmCisjICAgIGlmbmRlZiBMT05HTE9OR19NSU4KKyMgICAgICBkZWZpbmUgTE9OR0xPTkdfTUlOICAgKC1MT05HTE9OR19NQVgtMUxMKQorIyAgICBlbmRpZgorIyAgICBpZm5kZWYgVUxPTkdMT05HX01BWAorIyAgICAgIGRlZmluZSBVTE9OR0xPTkdfTUFYICAweGZmZmZmZmZmZmZmZmZmZmZVTEwKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisKKyMgIGlmICFkZWZpbmVkIChfX0dOVUNfXykgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPD0gOTYpIHx8IChfX0dOVUNfXyA9PSAzICYmIF9fR05VQ19NSU5PUl9fID49IDEpIHx8IChfX0dOVUNfXyA+IDMpCisKK19TVExQX1RFTVBMQVRFX05VTEwKK2NsYXNzIG51bWVyaWNfbGltaXRzPF9TVExQX0xPTkdfTE9ORz4KKyAgOiBwdWJsaWMgX1NUTFBfUFJJViBfSW50ZWdlcl9saW1pdHM8X1NUTFBfTE9OR19MT05HLCBMT05HTE9OR19NSU4sIExPTkdMT05HX01BWCwgLTEsIHRydWU+Cit7fTsKKworX1NUTFBfVEVNUExBVEVfTlVMTAorY2xhc3MgbnVtZXJpY19saW1pdHM8dW5zaWduZWQgX1NUTFBfTE9OR19MT05HPgorICA6IHB1YmxpYyBfU1RMUF9QUklWIF9JbnRlZ2VyX2xpbWl0czx1bnNpZ25lZCBfU1RMUF9MT05HX0xPTkcsIDAsIFVMT05HTE9OR19NQVgsIC0xLCB0cnVlPgore307CisjICBlbHNlIC8qIGdjYyAyLjk3IChhZnRlciAyMDAwLTExLTAxKSwgMi45OCwgMy4wICovCisvKgorIG5ld2VzdCBnY2MgaGFzIG5ldyBtYW5nbGluZyBzY2hlbWUsIHRoYXQgaGFzIHByb2JsZW0KKyB3aXRoIGdlbmVyYXRpbmcgbmFtZSBbaW5zdGFudGlhdGVkXSBvZiB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBsaWtlCisgX0ludGVnZXJfbGltaXRzPF9TVExQX0xPTkdfTE9ORywgTE9OR0xPTkdfTUlOLCBMT05HTE9OR19NQVgsIC0xLCB0cnVlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5+fn5+fn5+fn5+fiAgfn5+fn5+fn5+fn5+CisgQmVsb3cgaXMgY29kZSB0aGF0IHNvbHZlIHRoaXMgcHJvYmxlbS4KKyAgIC0gcHRyCisgKi8KK19TVExQX1RFTVBMQVRFX05VTEwKK2NsYXNzIG51bWVyaWNfbGltaXRzPF9TVExQX0xPTkdfTE9ORz4KKyAgOiBwdWJsaWMgX1NUTFBfUFJJViBfTnVtZXJpY19saW1pdHNfYmFzZTxfU1RMUF9MT05HX0xPTkc+IHsKK3B1YmxpYzoKKworICBzdGF0aWMgX1NUTFBfTE9OR19MT05HIChfU1RMUF9DQUxMIG1pbikgKCkgX1NUTFBfTk9USFJPVyB7IHJldHVybiBMT05HTE9OR19NSU47IH0KKyAgc3RhdGljIF9TVExQX0xPTkdfTE9ORyAoX1NUTFBfQ0FMTCBtYXgpICgpIF9TVExQX05PVEhST1cgeyByZXR1cm4gTE9OR0xPTkdfTUFYOyB9CisKKyAgX1NUTFBfU1RBVElDX0NPTlNUQU5UKGludCwgZGlnaXRzID0gKChpbnQpKChzaXplb2YoX1NUTFBfTE9OR19MT05HKSAqIChDSEFSX0JJVCkpKSAtIDEpKTsKKyAgX1NUTFBfU1RBVElDX0NPTlNUQU5UKGludCwgZGlnaXRzMTAgPSAoZGlnaXRzICogMzAxVUwpIC8gMTAwMCk7CisgIF9TVExQX1NUQVRJQ19DT05TVEFOVChpbnQsIHJhZGl4ID0gMik7CisgIF9TVExQX1NUQVRJQ19DT05TVEFOVChib29sLCBpc19zcGVjaWFsaXplZCA9IHRydWUpOworICBfU1RMUF9TVEFUSUNfQ09OU1RBTlQoYm9vbCwgaXNfc2lnbmVkID0gdHJ1ZSk7CisgIF9TVExQX1NUQVRJQ19DT05TVEFOVChib29sLCBpc19pbnRlZ2VyID0gdHJ1ZSk7CisgIF9TVExQX1NUQVRJQ19DT05TVEFOVChib29sLCBpc19leGFjdCA9IHRydWUpOworICBfU1RMUF9TVEFUSUNfQ09OU1RBTlQoYm9vbCwgaXNfYm91bmRlZCA9IHRydWUpOworICBfU1RMUF9TVEFUSUNfQ09OU1RBTlQoYm9vbCwgaXNfbW9kdWxvID0gdHJ1ZSk7Cit9OworCitfU1RMUF9URU1QTEFURV9OVUxMCitjbGFzcyBudW1lcmljX2xpbWl0czx1bnNpZ25lZCBfU1RMUF9MT05HX0xPTkc+CisgIDogcHVibGljIF9TVExQX1BSSVYgX051bWVyaWNfbGltaXRzX2Jhc2U8dW5zaWduZWQgX1NUTFBfTE9OR19MT05HPiB7CitwdWJsaWM6CisKKyAgc3RhdGljIHVuc2lnbmVkIF9TVExQX0xPTkdfTE9ORyAoX1NUTFBfQ0FMTCBtaW4pICgpIF9TVExQX05PVEhST1cgeyByZXR1cm4gMFVMTDsgfQorICBzdGF0aWMgdW5zaWduZWQgX1NUTFBfTE9OR19MT05HIChfU1RMUF9DQUxMIG1heCkgKCkgX1NUTFBfTk9USFJPVyB7IHJldHVybiBVTE9OR0xPTkdfTUFYOyB9CisKKyAgX1NUTFBfU1RBVElDX0NPTlNUQU5UKGludCwgZGlnaXRzID0gKChpbnQpKChzaXplb2YodW5zaWduZWQgX1NUTFBfTE9OR19MT05HKSAqIChDSEFSX0JJVCkpKSkpOworICBfU1RMUF9TVEFUSUNfQ09OU1RBTlQoaW50LCBkaWdpdHMxMCA9IChkaWdpdHMgKiAzMDFVTCkgLyAxMDAwKTsKKyAgX1NUTFBfU1RBVElDX0NPTlNUQU5UKGludCwgcmFkaXggPSAyKTsKKyAgX1NUTFBfU1RBVElDX0NPTlNUQU5UKGJvb2wsIGlzX3NwZWNpYWxpemVkID0gdHJ1ZSk7CisgIF9TVExQX1NUQVRJQ19DT05TVEFOVChib29sLCBpc19zaWduZWQgPSBmYWxzZSk7CisgIF9TVExQX1NUQVRJQ19DT05TVEFOVChib29sLCBpc19pbnRlZ2VyID0gdHJ1ZSk7CisgIF9TVExQX1NUQVRJQ19DT05TVEFOVChib29sLCBpc19leGFjdCA9IHRydWUpOworICBfU1RMUF9TVEFUSUNfQ09OU1RBTlQoYm9vbCwgaXNfYm91bmRlZCA9IHRydWUpOworICBfU1RMUF9TVEFUSUNfQ09OU1RBTlQoYm9vbCwgaXNfbW9kdWxvID0gdHJ1ZSk7Cit9OworCisjICBlbmRpZiAvKiBfX0dOVUNfXyA+IDIwMDAtMTEtMDEgKi8KKworI2VuZGlmIC8qIF9TVExQX0xPTkdfTE9ORyAqLworCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKKy8vIFNwZWNpYWxpemF0aW9ucyBmb3IgYWxsIGJ1aWx0LWluIGZsb2F0aW5nLXBvaW50IHR5cGVzLgordGVtcGxhdGUgPGNsYXNzIF9fZHVtbXk+CitjbGFzcyBfTGltRyB7CitwdWJsaWM6CisgIHN0YXRpYyBmbG9hdCBfU1RMUF9DQUxMIGdldF9GX2luZigpOworICBzdGF0aWMgZmxvYXQgX1NUTFBfQ0FMTCBnZXRfRl9xTmFOKCk7CisgIHN0YXRpYyBmbG9hdCBfU1RMUF9DQUxMIGdldF9GX3NOYU4oKTsKKyAgc3RhdGljIGZsb2F0IF9TVExQX0NBTEwgZ2V0X0ZfZGVub3JtTWluKCk7CisgIHN0YXRpYyBkb3VibGUgX1NUTFBfQ0FMTCBnZXRfRF9pbmYoKTsKKyAgc3RhdGljIGRvdWJsZSBfU1RMUF9DQUxMIGdldF9EX3FOYU4oKTsKKyAgc3RhdGljIGRvdWJsZSBfU1RMUF9DQUxMIGdldF9EX3NOYU4oKTsKKyAgc3RhdGljIGRvdWJsZSBfU1RMUF9DQUxMIGdldF9EX2Rlbm9ybU1pbigpOworCisjaWYgIWRlZmluZWQgKF9TVExQX05PX0xPTkdfRE9VQkxFKQorICBzdGF0aWMgbG9uZyBkb3VibGUgX1NUTFBfQ0FMTCBnZXRfTERfaW5mKCk7CisgIHN0YXRpYyBsb25nIGRvdWJsZSBfU1RMUF9DQUxMIGdldF9MRF9xTmFOKCk7CisgIHN0YXRpYyBsb25nIGRvdWJsZSBfU1RMUF9DQUxMIGdldF9MRF9zTmFOKCk7CisgIHN0YXRpYyBsb25nIGRvdWJsZSBfU1RMUF9DQUxMIGdldF9MRF9kZW5vcm1NaW4oKTsKKyNlbmRpZgorfTsKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9URU1QTEFURV9FWFBPUlQpCitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgX0xpbUc8Ym9vbD47CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fR05VQ19fKQorIyAgaWYgZGVmaW5lZCAoX19GTFRfREVOT1JNX01JTl9fKQorIyAgICBkZWZpbmUgX1NUTFBfRkxUX0RFTk9STV9NSU4gX19GTFRfREVOT1JNX01JTl9fCisjICBlbHNlCisjICAgIGRlZmluZSBfU1RMUF9GTFRfREVOT1JNX1NUWUxFIGRlbm9ybV9hYnNlbnQKKyMgIGVuZGlmCisjICBpZiBkZWZpbmVkIChfX0RCTF9ERU5PUk1fTUlOX18pCisjICAgIGRlZmluZSBfU1RMUF9EQkxfREVOT1JNX01JTiBfX0RCTF9ERU5PUk1fTUlOX18KKyMgIGVsc2UKKyMgICAgZGVmaW5lIF9TVExQX0RCTF9ERU5PUk1fU1RZTEUgZGVub3JtX2Fic2VudAorIyAgZW5kaWYKKyMgIGlmIGRlZmluZWQgKF9fTERCTF9ERU5PUk1fTUlOX18pCisjICAgIGRlZmluZSBfU1RMUF9MREJMX0RFTk9STV9NSU4gX19MREJMX0RFTk9STV9NSU5fXworIyAgZWxzZQorIyAgICBkZWZpbmUgX1NUTFBfTERCTF9ERU5PUk1fU1RZTEUgZGVub3JtX2Fic2VudAorIyAgZW5kaWYKKyNlbmRpZgorCisvKiBJZiBjb21waWxlciBkbyBub3QgZXhwb3NlIHRoYW5rcyB0byBzb21lIG1hY3JvIGl0cyBzdGF0dXMgcmVnYXJkaW5nCisgKiBkZW5vcm1hbGl6ZWQgZmxvYXRpbmcgcG9pbnQgbnVtYmVycywgd2UgY29uc2lkZXIgdGhhdCBkZW5vcm1hbGl6YXRpb24KKyAqIGlzIHByZXNlbnQuIFVuaXQgdGVzdHMgd2lsbCB0ZWxsIHVzIGlmIGNvbXBpbGVyIGRvIG5vdCBzdXBwb3J0IHRoZW0uICovCisjaWYgIWRlZmluZWQgKF9TVExQX0ZMVF9ERU5PUk1fU1RZTEUpCisjICBkZWZpbmUgX1NUTFBfRkxUX0RFTk9STV9TVFlMRSBkZW5vcm1fcHJlc2VudAorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfREJMX0RFTk9STV9TVFlMRSkKKyMgIGRlZmluZSBfU1RMUF9EQkxfREVOT1JNX1NUWUxFIGRlbm9ybV9wcmVzZW50CisjZW5kaWYKKworI2lmICFkZWZpbmVkIChfU1RMUF9MREJMX0RFTk9STV9TVFlMRSkKKyMgIGRlZmluZSBfU1RMUF9MREJMX0RFTk9STV9TVFlMRSBkZW5vcm1fcHJlc2VudAorI2VuZGlmCisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCitfU1RMUF9URU1QTEFURV9OVUxMCitjbGFzcyBudW1lcmljX2xpbWl0czxmbG9hdD4KKyAgOiBwdWJsaWMgX1NUTFBfUFJJViBfRmxvYXRpbmdfbGltaXRzPGZsb2F0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkxUX01BTlRfRElHLCAgIC8vIEJpbmFyeSBkaWdpdHMgb2YgcHJlY2lzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTFRfRElHLCAgICAgICAgLy8gRGVjaW1hbCBkaWdpdHMgb2YgcHJlY2lzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTFRfTUlOX0VYUCwgICAgLy8gTWluaW11bSBleHBvbmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkxUX01BWF9FWFAsICAgIC8vIE1heGltdW0gZXhwb25lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMVF9NSU5fMTBfRVhQLCAvLyBNaW5pbXVtIGJhc2UgMTAgZXhwb25lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMVF9NQVhfMTBfRVhQLCAvLyBNYXhpbXVtIGJhc2UgMTAgZXhwb25lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9GTFRfREVOT1JNX1NUWUxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91bmRfdG9fbmVhcmVzdD4geworcHVibGljOgorICBzdGF0aWMgZmxvYXQgKF9TVExQX0NBTEwgbWluKSAoKSBfU1RMUF9OT1RIUk9XIHsgcmV0dXJuIEZMVF9NSU47IH0KKyAgc3RhdGljIGZsb2F0IF9TVExQX0NBTEwgZGVub3JtX21pbigpIF9TVExQX05PVEhST1cKKyNpZiBkZWZpbmVkIChfU1RMUF9GTFRfREVOT1JNX01JTikKKyAgeyByZXR1cm4gX1NUTFBfRkxUX0RFTk9STV9NSU47IH0KKyNlbHNlCisgIHsgcmV0dXJuIF9TVExQX0ZMVF9ERU5PUk1fU1RZTEUgPyBfU1RMUF9QUklWIF9MaW1HPGJvb2w+OjpnZXRfRl9kZW5vcm1NaW4oKSA6IEZMVF9NSU47IH0KKyNlbmRpZgorICBzdGF0aWMgZmxvYXQgKF9TVExQX0NBTEwgbWF4KSAoKSBfU1RMUF9OT1RIUk9XIHsgcmV0dXJuIEZMVF9NQVg7IH0KKyAgc3RhdGljIGZsb2F0IF9TVExQX0NBTEwgZXBzaWxvbigpIF9TVExQX05PVEhST1cgeyByZXR1cm4gRkxUX0VQU0lMT047IH0KKyAgc3RhdGljIGZsb2F0IF9TVExQX0NBTEwgcm91bmRfZXJyb3IoKSBfU1RMUF9OT1RIUk9XIHsgcmV0dXJuIDAuNWY7IH0gLy8gVW5pdHM6IHVscHMuCisgIHN0YXRpYyAgZmxvYXQgX1NUTFBfQ0FMTCBpbmZpbml0eSgpIF9TVExQX05PVEhST1cgeyByZXR1cm4gX1NUTFBfUFJJViBfTGltRzxib29sPjo6Z2V0X0ZfaW5mKCk7IH0KKyAgc3RhdGljICBmbG9hdCBfU1RMUF9DQUxMIHF1aWV0X05hTigpIF9TVExQX05PVEhST1cgeyByZXR1cm4gX1NUTFBfUFJJViBfTGltRzxib29sPjo6Z2V0X0ZfcU5hTigpOyB9CisgIHN0YXRpYyAgZmxvYXQgX1NUTFBfQ0FMTCBzaWduYWxpbmdfTmFOKCkgX1NUTFBfTk9USFJPVyB7IHJldHVybiBfU1RMUF9QUklWIF9MaW1HPGJvb2w+OjpnZXRfRl9zTmFOKCk7IH0KK307CisKKyN1bmRlZiBfU1RMUF9GTFRfREVOT1JNX01JTgorI3VuZGVmIF9TVExQX0ZMVF9ETk9STV9TVFlMRQorCitfU1RMUF9URU1QTEFURV9OVUxMCitjbGFzcyBudW1lcmljX2xpbWl0czxkb3VibGU+CisgIDogcHVibGljIF9TVExQX1BSSVYgX0Zsb2F0aW5nX2xpbWl0czxkb3VibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkxfTUFOVF9ESUcsICAgLy8gQmluYXJ5IGRpZ2l0cyBvZiBwcmVjaXNpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCTF9ESUcsICAgICAgICAvLyBEZWNpbWFsIGRpZ2l0cyBvZiBwcmVjaXNpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCTF9NSU5fRVhQLCAgICAvLyBNaW5pbXVtIGV4cG9uZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkxfTUFYX0VYUCwgICAgLy8gTWF4aW11bSBleHBvbmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJMX01JTl8xMF9FWFAsIC8vIE1pbmltdW0gYmFzZSAxMCBleHBvbmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJMX01BWF8xMF9FWFAsIC8vIE1heGltdW0gYmFzZSAxMCBleHBvbmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX0RCTF9ERU5PUk1fU1RZTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3VuZF90b19uZWFyZXN0PiB7CitwdWJsaWM6CisgIHN0YXRpYyBkb3VibGUgKF9TVExQX0NBTEwgbWluKSgpIF9TVExQX05PVEhST1cgeyByZXR1cm4gREJMX01JTjsgfQorICBzdGF0aWMgZG91YmxlIF9TVExQX0NBTEwgZGVub3JtX21pbigpIF9TVExQX05PVEhST1cKKyNpZiBkZWZpbmVkIChfU1RMUF9EQkxfREVOT1JNX01JTikKKyAgeyByZXR1cm4gX1NUTFBfREJMX0RFTk9STV9NSU47IH0KKyNlbHNlCisgIHsgcmV0dXJuIF9TVExQX0RCTF9ERU5PUk1fU1RZTEUgPyBfU1RMUF9QUklWIF9MaW1HPGJvb2w+OjpnZXRfRF9kZW5vcm1NaW4oKSA6IERCTF9NSU47IH0KKyNlbmRpZgorICBzdGF0aWMgZG91YmxlIChfU1RMUF9DQUxMIG1heCkoKSBfU1RMUF9OT1RIUk9XIHsgcmV0dXJuIERCTF9NQVg7IH0KKyAgc3RhdGljIGRvdWJsZSBfU1RMUF9DQUxMIGVwc2lsb24oKSBfU1RMUF9OT1RIUk9XIHsgcmV0dXJuIERCTF9FUFNJTE9OOyB9CisgIHN0YXRpYyBkb3VibGUgX1NUTFBfQ0FMTCByb3VuZF9lcnJvcigpIF9TVExQX05PVEhST1cgeyByZXR1cm4gMC41OyB9IC8vIFVuaXRzOiB1bHBzLgorICBzdGF0aWMgIGRvdWJsZSBfU1RMUF9DQUxMIGluZmluaXR5KCkgX1NUTFBfTk9USFJPVyB7IHJldHVybiBfU1RMUF9QUklWIF9MaW1HPGJvb2w+OjpnZXRfRF9pbmYoKTsgfQorICBzdGF0aWMgIGRvdWJsZSBfU1RMUF9DQUxMIHF1aWV0X05hTigpIF9TVExQX05PVEhST1cgeyByZXR1cm4gX1NUTFBfUFJJViBfTGltRzxib29sPjo6Z2V0X0RfcU5hTigpOyB9CisgIHN0YXRpYyAgZG91YmxlIF9TVExQX0NBTEwgc2lnbmFsaW5nX05hTigpIF9TVExQX05PVEhST1cgeyByZXR1cm4gX1NUTFBfUFJJViBfTGltRzxib29sPjo6Z2V0X0Rfc05hTigpOyB9Cit9OworCisjaWYgIWRlZmluZWQgKF9TVExQX05PX0xPTkdfRE9VQkxFKQorCitfU1RMUF9URU1QTEFURV9OVUxMCitjbGFzcyBudW1lcmljX2xpbWl0czxsb25nIGRvdWJsZT4KKyAgOiBwdWJsaWMgX1NUTFBfUFJJViBfRmxvYXRpbmdfbGltaXRzPGxvbmcgZG91YmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTERCTF9NQU5UX0RJRywgIC8vIEJpbmFyeSBkaWdpdHMgb2YgcHJlY2lzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMREJMX0RJRywgICAgICAgLy8gRGVjaW1hbCBkaWdpdHMgb2YgcHJlY2lzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMREJMX01JTl9FWFAsICAgLy8gTWluaW11bSBleHBvbmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTERCTF9NQVhfRVhQLCAgIC8vIE1heGltdW0gZXhwb25lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQkxfTUlOXzEwX0VYUCwvLyBNaW5pbXVtIGJhc2UgMTAgZXhwb25lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQkxfTUFYXzEwX0VYUCwvLyBNYXhpbXVtIGJhc2UgMTAgZXhwb25lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCAgICAgICAgICAvLyBkbyBub3QgY29uZm9ybSB0byBpZWM1NTkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX0xEQkxfREVOT1JNX1NUWUxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91bmRfdG9fbmVhcmVzdD4geworcHVibGljOgorICBzdGF0aWMgbG9uZyBkb3VibGUgKF9TVExQX0NBTEwgbWluKSAoKSBfU1RMUF9OT1RIUk9XIHsgcmV0dXJuIExEQkxfTUlOOyB9CisgIHN0YXRpYyBsb25nIGRvdWJsZSBfU1RMUF9DQUxMIGRlbm9ybV9taW4oKSBfU1RMUF9OT1RIUk9XCisjaWYgZGVmaW5lZCAoX1NUTFBfTERCTF9ERU5PUk1fTUlOKQorICB7IHJldHVybiBfU1RMUF9MREJMX0RFTk9STV9NSU47IH0KKyNlbHNlCisgIHsgcmV0dXJuIF9TVExQX0xEQkxfREVOT1JNX1NUWUxFID8gX1NUTFBfUFJJViBfTGltRzxib29sPjo6Z2V0X0xEX2Rlbm9ybU1pbigpIDogTERCTF9NSU47IH0KKyNlbmRpZgorICBfU1RMUF9TVEFUSUNfQ09OU1RBTlQoYm9vbCwgaXNfaWVjNTU5ID0gZmFsc2UpOworICBzdGF0aWMgbG9uZyBkb3VibGUgKF9TVExQX0NBTEwgbWF4KSAoKSBfU1RMUF9OT1RIUk9XIHsgcmV0dXJuIExEQkxfTUFYOyB9CisgIHN0YXRpYyBsb25nIGRvdWJsZSBfU1RMUF9DQUxMIGVwc2lsb24oKSBfU1RMUF9OT1RIUk9XIHsgcmV0dXJuIExEQkxfRVBTSUxPTjsgfQorICBzdGF0aWMgbG9uZyBkb3VibGUgX1NUTFBfQ0FMTCByb3VuZF9lcnJvcigpIF9TVExQX05PVEhST1cgeyByZXR1cm4gMC41bDsgfQorICBzdGF0aWMgbG9uZyBkb3VibGUgX1NUTFBfQ0FMTCBpbmZpbml0eSgpIF9TVExQX05PVEhST1cKKyAgLy9Gb3IgTVNWQywgbG9uZyBkb3VibGUgaXMgbm90aGluZyBtb3JlIHRoYW4gYW4gYWxpYXMgZm9yIGRvdWJsZS4KKyNpZiAhZGVmaW5lZCAoX1NUTFBfTVNWQykKKyAgeyByZXR1cm4gX1NUTFBfUFJJViBfTGltRzxib29sPjo6Z2V0X0xEX2luZigpOyB9CisjZWxzZQorICB7IHJldHVybiBfU1RMUF9QUklWIF9MaW1HPGJvb2w+OjpnZXRfRF9pbmYoKTsgfQorI2VuZGlmCisgIHN0YXRpYyBsb25nIGRvdWJsZSBfU1RMUF9DQUxMIHF1aWV0X05hTigpIF9TVExQX05PVEhST1cKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTVNWQykKKyAgeyByZXR1cm4gX1NUTFBfUFJJViBfTGltRzxib29sPjo6Z2V0X0xEX3FOYU4oKTsgfQorI2Vsc2UKKyAgeyByZXR1cm4gX1NUTFBfUFJJViBfTGltRzxib29sPjo6Z2V0X0RfcU5hTigpOyB9CisjZW5kaWYKKyAgc3RhdGljIGxvbmcgZG91YmxlIF9TVExQX0NBTEwgc2lnbmFsaW5nX05hTigpIF9TVExQX05PVEhST1cKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTVNWQykKKyAgeyByZXR1cm4gX1NUTFBfUFJJViBfTGltRzxib29sPjo6Z2V0X0xEX3NOYU4oKTsgfQorI2Vsc2UKKyAgeyByZXR1cm4gX1NUTFBfUFJJViBfTGltRzxib29sPjo6Z2V0X0Rfc05hTigpOyB9CisjZW5kaWYKK307CisKKyNlbmRpZgorCisvLyBXZSB3cml0ZSBzcGVjaWFsIHZhbHVlcyAoSW5mIGFuZCBOYU4pIGFzIGJpdCBwYXR0ZXJucyBhbmQKKy8vIGNhc3QgdGhlIHRoZSBhcHByb3ByaWF0ZSBmbG9hdGluZy1wb2ludCB0eXBlcy4KK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2lmICFkZWZpbmVkIChfU1RMUF9MSU5LX1RJTUVfSU5TVEFOVElBVElPTikKKyMgIGluY2x1ZGUgPHN0bC9fbGltaXRzLmM+CisjZW5kaWYKKworI2VuZGlmCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9fbGlzdC5jIGIvc3RscG9ydC9zdGwvX2xpc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmU0MjBiCi0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvX2xpc3QuYwpAQCAtMCwwICsxLDI1MCBAQAorLyoKKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworI2lmbmRlZiBfU1RMUF9MSVNUX0MKKyNkZWZpbmUgX1NUTFBfTElTVF9DCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfTElTVF9ICisjICBpbmNsdWRlIDxzdGwvX2xpc3QuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0NBUlJBWV9ICisjICBpbmNsdWRlIDxzdGwvX2NhcnJheS5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfUkFOR0VfRVJST1JTX0gKKyMgIGluY2x1ZGUgPHN0bC9fcmFuZ2VfZXJyb3JzLmg+CisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKworI2lmIGRlZmluZWQgKF9TVExQX0VYUE9TRV9HTE9CQUxTX0lNUExFTUVOVEFUSU9OKQordGVtcGxhdGUgPGNsYXNzIF9EdW1teT4KK3ZvaWQgX1NUTFBfQ0FMTAorX0xpc3RfZ2xvYmFsPF9EdW1teT46Ol9UcmFuc2ZlcihfTGlzdF9ub2RlX2Jhc2UqIF9fcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9MaXN0X25vZGVfYmFzZSogX19maXJzdCwgX0xpc3Rfbm9kZV9iYXNlKiBfX2xhc3QpIHsKKyAgaWYgKF9fcG9zaXRpb24gIT0gX19sYXN0KSB7CisgICAgLy8gUmVtb3ZlIFtmaXJzdCwgbGFzdCkgZnJvbSBpdHMgb2xkIHBvc2l0aW9uLgorICAgIF9fbGFzdC0+X01fcHJldi0+X01fbmV4dCAgICAgPSBfX3Bvc2l0aW9uOworICAgIF9fZmlyc3QtPl9NX3ByZXYtPl9NX25leHQgICAgPSBfX2xhc3Q7CisgICAgX19wb3NpdGlvbi0+X01fcHJldi0+X01fbmV4dCA9IF9fZmlyc3Q7CisKKyAgICAvLyBTcGxpY2UgW2ZpcnN0LCBsYXN0KSBpbnRvIGl0cyBuZXcgcG9zaXRpb24uCisgICAgX05vZGVfYmFzZSogX190bXAgPSBfX3Bvc2l0aW9uLT5fTV9wcmV2OworICAgIF9fcG9zaXRpb24tPl9NX3ByZXYgPSBfX2xhc3QtPl9NX3ByZXY7CisgICAgX19sYXN0LT5fTV9wcmV2ICAgICA9IF9fZmlyc3QtPl9NX3ByZXY7CisgICAgX19maXJzdC0+X01fcHJldiAgICA9IF9fdG1wOworICB9Cit9CisjZW5kaWYgLyogX1NUTFBfRVhQT1NFX0dMT0JBTFNfSU1QTEVNRU5UQVRJT04gKi8KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgordm9pZCBfTGlzdF9iYXNlPF9UcCxfQWxsb2M+OjpjbGVhcigpIHsKKyAgX05vZGUqIF9fY3VyID0gX19TVEFUSUNfQ0FTVChfTm9kZSosIF9NX25vZGUuX01fZGF0YS5fTV9uZXh0KTsKKyAgd2hpbGUgKAorI2lmIGRlZmluZWQgKF9fQk9STEFORENfXykgLy8gcnVudGltZSBlcnJvcgorICAgICAgICAgX19jdXIgJiYKKyNlbmRpZgorICAgICAgICAgX19jdXIgIT0gJihfTV9ub2RlLl9NX2RhdGEpKSB7CisgICAgX05vZGUqIF9fdG1wID0gX19jdXI7CisgICAgX19jdXIgPSBfX1NUQVRJQ19DQVNUKF9Ob2RlKiwgX19jdXItPl9NX25leHQpOworICAgIF9TVExQX1NURDo6X0Rlc3Ryb3koJl9fdG1wLT5fTV9kYXRhKTsKKyAgICB0aGlzLT5fTV9ub2RlLmRlYWxsb2NhdGUoX190bXAsIDEpOworICB9CisgIF9NX25vZGUuX01fZGF0YS5fTV9uZXh0ID0gJl9NX25vZGUuX01fZGF0YTsKKyAgX01fbm9kZS5fTV9kYXRhLl9NX3ByZXYgPSAmX01fbm9kZS5fTV9kYXRhOworfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfTkVTVEVEX1RZUEVfUEFSQU1fQlVHKQorIyAgZGVmaW5lIHNpemVfdHlwZSBzaXplX3QKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BUUl9TUEVDSUFMSVpBVElPTlMpCisjICBkZWZpbmUgbGlzdCBfU1RMUF9QVFJfSU1QTF9OQU1FKGxpc3QpCisjZWxpZiBkZWZpbmVkIChfU1RMUF9ERUJVRykKKyMgIGRlZmluZSBsaXN0IF9TVExQX05PTl9EQkdfTkFNRShsaXN0KQorI2Vsc2UKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK3ZvaWQgbGlzdDxfVHAsIF9BbGxvYz46OnJlc2l6ZShzaXplX3R5cGUgX19uZXdfc2l6ZSwgY29uc3QgX1RwJiBfX3gpIHsKKyAgaXRlcmF0b3IgX19pID0gYmVnaW4oKTsKKyAgc2l6ZV90eXBlIF9fbGVuID0gMDsKKyAgZm9yICggOyBfX2kgIT0gZW5kKCkgJiYgX19sZW4gPCBfX25ld19zaXplOyArK19faSwgKytfX2xlbik7CisKKyAgaWYgKF9fbGVuID09IF9fbmV3X3NpemUpCisgICAgZXJhc2UoX19pLCBlbmQoKSk7CisgIGVsc2UgLy8gX19pID09IGVuZCgpCisgICAgaW5zZXJ0KGVuZCgpLCBfX25ld19zaXplIC0gX19sZW4sIF9feCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK2xpc3Q8X1RwLCBfQWxsb2M+JiBsaXN0PF9UcCwgX0FsbG9jPjo6b3BlcmF0b3I9KGNvbnN0IGxpc3Q8X1RwLCBfQWxsb2M+JiBfX3gpIHsKKyAgaWYgKHRoaXMgIT0gJl9feCkgeworICAgIGl0ZXJhdG9yIF9fZmlyc3QxID0gYmVnaW4oKTsKKyAgICBpdGVyYXRvciBfX2xhc3QxID0gZW5kKCk7CisgICAgY29uc3RfaXRlcmF0b3IgX19maXJzdDIgPSBfX3guYmVnaW4oKTsKKyAgICBjb25zdF9pdGVyYXRvciBfX2xhc3QyID0gX194LmVuZCgpOworICAgIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDIpCisgICAgICAqX19maXJzdDErKyA9ICpfX2ZpcnN0MisrOworICAgIGlmIChfX2ZpcnN0MiA9PSBfX2xhc3QyKQorICAgICAgZXJhc2UoX19maXJzdDEsIF9fbGFzdDEpOworICAgIGVsc2UKKyAgICAgIGluc2VydChfX2xhc3QxLCBfX2ZpcnN0MiwgX19sYXN0Mik7CisgIH0KKyAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Cit2b2lkIGxpc3Q8X1RwLCBfQWxsb2M+OjpfTV9maWxsX2Fzc2lnbihzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9fdmFsKSB7CisgIGl0ZXJhdG9yIF9faSA9IGJlZ2luKCk7CisgIGZvciAoIDsgX19pICE9IGVuZCgpICYmIF9fbiA+IDA7ICsrX19pLCAtLV9fbikKKyAgICAqX19pID0gX192YWw7CisgIGlmIChfX24gPiAwKQorICAgIGluc2VydChlbmQoKSwgX19uLCBfX3ZhbCk7CisgIGVsc2UKKyAgICBlcmFzZShfX2ksIGVuZCgpKTsKK30KKworI2lmICFkZWZpbmVkIChsaXN0KQorX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYywgY2xhc3MgX1ByZWRpY2F0ZT4KK3ZvaWQgX1NfcmVtb3ZlX2lmKGxpc3Q8X1RwLCBfQWxsb2M+JiBfX3RoYXQsIF9QcmVkaWNhdGUgX19wcmVkKSAgeworICB0eXBlZGVmIHR5cGVuYW1lIGxpc3Q8X1RwLCBfQWxsb2M+OjppdGVyYXRvciBfTGl0ZXJhdG9yOworICBfTGl0ZXJhdG9yIF9fZmlyc3QgPSBfX3RoYXQuYmVnaW4oKTsKKyAgX0xpdGVyYXRvciBfX2xhc3QgPSBfX3RoYXQuZW5kKCk7CisgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkgeworICAgIF9MaXRlcmF0b3IgX19uZXh0ID0gX19maXJzdDsKKyAgICArK19fbmV4dDsKKyAgICBpZiAoX19wcmVkKCpfX2ZpcnN0KSkgX190aGF0LmVyYXNlKF9fZmlyc3QpOworICAgIF9fZmlyc3QgPSBfX25leHQ7CisgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jLCBjbGFzcyBfQmluYXJ5UHJlZGljYXRlPgordm9pZCBfU191bmlxdWUobGlzdDxfVHAsIF9BbGxvYz4mIF9fdGhhdCwgX0JpbmFyeVByZWRpY2F0ZSBfX2JpbmFyeV9wcmVkKSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgbGlzdDxfVHAsIF9BbGxvYz46Oml0ZXJhdG9yIF9MaXRlcmF0b3I7CisgIF9MaXRlcmF0b3IgX19maXJzdCA9IF9fdGhhdC5iZWdpbigpOworICBfTGl0ZXJhdG9yIF9fbGFzdCA9IF9fdGhhdC5lbmQoKTsKKyAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KSByZXR1cm47CisgIF9MaXRlcmF0b3IgX19uZXh0ID0gX19maXJzdDsKKyAgd2hpbGUgKCsrX19uZXh0ICE9IF9fbGFzdCkgeworICAgIGlmIChfX2JpbmFyeV9wcmVkKCpfX2ZpcnN0LCAqX19uZXh0KSkKKyAgICAgIF9fdGhhdC5lcmFzZShfX25leHQpOworICAgIGVsc2UKKyAgICAgIF9fZmlyc3QgPSBfX25leHQ7CisgICAgX19uZXh0ID0gX19maXJzdDsKKyAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2MsIGNsYXNzIF9TdHJpY3RXZWFrT3JkZXJpbmc+Cit2b2lkIF9TX21lcmdlKGxpc3Q8X1RwLCBfQWxsb2M+JiBfX3RoYXQsIGxpc3Q8X1RwLCBfQWxsb2M+JiBfX3gsCisgICAgICAgICAgICAgIF9TdHJpY3RXZWFrT3JkZXJpbmcgX19jb21wKSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgbGlzdDxfVHAsIF9BbGxvYz46Oml0ZXJhdG9yIF9MaXRlcmF0b3I7CisgIF9MaXRlcmF0b3IgX19maXJzdDEgPSBfX3RoYXQuYmVnaW4oKTsKKyAgX0xpdGVyYXRvciBfX2xhc3QxID0gX190aGF0LmVuZCgpOworICBfTGl0ZXJhdG9yIF9fZmlyc3QyID0gX194LmJlZ2luKCk7CisgIF9MaXRlcmF0b3IgX19sYXN0MiA9IF9feC5lbmQoKTsKKyAgaWYgKF9fdGhhdC5nZXRfYWxsb2NhdG9yKCkgPT0gX194LmdldF9hbGxvY2F0b3IoKSkgeworICAgIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDIpIHsKKyAgICAgIGlmIChfX2NvbXAoKl9fZmlyc3QyLCAqX19maXJzdDEpKSB7CisgICAgICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFfX2NvbXAoKl9fZmlyc3QxLCAqX19maXJzdDIpLCBfU3RsTXNnX0lOVkFMSURfU1RSSUNUX1dFQUtfUFJFRElDQVRFKQorICAgICAgICBfTGl0ZXJhdG9yIF9fbmV4dCA9IF9fZmlyc3QyOworICAgICAgICBfTGlzdF9nbG9iYWxfaW5zdDo6X1RyYW5zZmVyKF9fZmlyc3QxLl9NX25vZGUsIF9fZmlyc3QyLl9NX25vZGUsICgrK19fbmV4dCkuX01fbm9kZSk7CisgICAgICAgIF9fZmlyc3QyID0gX19uZXh0OworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICArK19fZmlyc3QxOworICAgIH0KKyAgICBpZiAoX19maXJzdDIgIT0gX19sYXN0MikKKyAgICAgIF9MaXN0X2dsb2JhbF9pbnN0OjpfVHJhbnNmZXIoX19sYXN0MS5fTV9ub2RlLCBfX2ZpcnN0Mi5fTV9ub2RlLCBfX2xhc3QyLl9NX25vZGUpOworICB9CisgIGVsc2UgeworICAgIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDIpIHsKKyAgICAgIGlmIChfX2NvbXAoKl9fZmlyc3QyLCAqX19maXJzdDEpKSB7CisgICAgICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFfX2NvbXAoKl9fZmlyc3QxLCAqX19maXJzdDIpLCBfU3RsTXNnX0lOVkFMSURfU1RSSUNUX1dFQUtfUFJFRElDQVRFKQorICAgICAgICBfX2ZpcnN0MSA9IF9fdGhhdC5pbnNlcnQoX19maXJzdDEsICpfX2ZpcnN0Mik7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgICsrX19maXJzdDE7CisgICAgfQorICAgIGlmIChfX2ZpcnN0MiAhPSBfX2xhc3QyKSB7CisgICAgICBfX3RoYXQuaW5zZXJ0KF9fZmlyc3QxLCBfX2ZpcnN0MiwgX19sYXN0Mik7CisgICAgfQorICAgIF9feC5jbGVhcigpOworICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYywgY2xhc3MgX1N0cmljdFdlYWtPcmRlcmluZz4KK3ZvaWQgX1Nfc29ydChsaXN0PF9UcCwgX0FsbG9jPiYgX190aGF0LCBfU3RyaWN0V2Vha09yZGVyaW5nIF9fY29tcCkgeworICAvLyBEbyBub3RoaW5nIGlmIHRoZSBsaXN0IGhhcyBsZW5ndGggMCBvciAxLgorICBpZiAoX190aGF0Ll9NX25vZGUuX01fZGF0YS5fTV9uZXh0ID09ICZfX3RoYXQuX01fbm9kZS5fTV9kYXRhIHx8CisgICAgICBfX3RoYXQuX01fbm9kZS5fTV9kYXRhLl9NX25leHQtPl9NX25leHQgPT0gJl9fdGhhdC5fTV9ub2RlLl9NX2RhdGEpCisgICAgcmV0dXJuOworCisgIGxpc3Q8X1RwLCBfQWxsb2M+IF9fY2FycnkoX190aGF0LmdldF9hbGxvY2F0b3IoKSk7CisgIGNvbnN0IGludCBOQiA9IDY0OworICBfU1RMUF9QUklWIF9DQXJyYXk8bGlzdDxfVHAsIF9BbGxvYz4sIE5CPiBfX2NvdW50ZXIoX19jYXJyeSk7CisgIGludCBfX2ZpbGwgPSAwOworICB3aGlsZSAoIV9fdGhhdC5lbXB0eSgpKSB7CisgICAgX19jYXJyeS5zcGxpY2UoX19jYXJyeS5iZWdpbigpLCBfX3RoYXQsIF9fdGhhdC5iZWdpbigpKTsKKyAgICBpbnQgX19pID0gMDsKKyAgICB3aGlsZSAoX19pIDwgX19maWxsICYmICFfX2NvdW50ZXJbX19pXS5lbXB0eSgpKSB7CisgICAgICBfU19tZXJnZShfX2NvdW50ZXJbX19pXSwgX19jYXJyeSwgX19jb21wKTsKKyAgICAgIF9fY2Fycnkuc3dhcChfX2NvdW50ZXJbX19pKytdKTsKKyAgICB9CisgICAgX19jYXJyeS5zd2FwKF9fY291bnRlcltfX2ldKTsKKyAgICBpZiAoX19pID09IF9fZmlsbCkgeworICAgICAgKytfX2ZpbGw7CisgICAgICBpZiAoX19maWxsID49IE5CKSB7CisgICAgICAgIC8vTG9va3MgbGlrZSB0aGUgbGlzdCBoYXMgdG9vIG1hbnkgZWxlbWVudHMgdG8gYmUgc29ydGVkIHdpdGggdGhpcyBhbGdvcml0aG06CisgICAgICAgIF9fc3RsX3Rocm93X292ZXJmbG93X2Vycm9yKCJsaXN0Ojpzb3J0Iik7CisgICAgICB9CisgICAgfQorICB9CisKKyAgZm9yIChpbnQgX19pID0gMTsgX19pIDwgX19maWxsOyArK19faSkKKyAgICBfU19tZXJnZShfX2NvdW50ZXJbX19pXSwgX19jb3VudGVyW19faSAtIDFdLCBfX2NvbXApOworICBfX3RoYXQuc3dhcChfX2NvdW50ZXJbX19maWxsIC0gMV0pOworfQorCisjaWYgZGVmaW5lZCAobGlzdCkKKyMgIHVuZGVmIGxpc3QKKyNlbmRpZgorCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLyogIF9TVExQX0xJU1RfQyAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdGwvX2xpc3QuaCBiL3N0bHBvcnQvc3RsL19saXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNkM2YyYgotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc3RsL19saXN0LmgKQEAgLTAsMCArMSw3NDIgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisvKiBOT1RFOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBTVEwgaGVhZGVycy4KKyAqICAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuCisgKi8KKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9MSVNUX0lNUExfSAorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9MSVNUX0lNUExfSAorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0FMR09CQVNFX0gKKyMgIGluY2x1ZGUgPHN0bC9fYWxnb2Jhc2UuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0FMTE9DX0gKKyMgIGluY2x1ZGUgPHN0bC9fYWxsb2MuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0lURVJBVE9SX0gKKyMgIGluY2x1ZGUgPHN0bC9faXRlcmF0b3IuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NPTlNUUlVDVF9ICisjICBpbmNsdWRlIDxzdGwvX2NvbnN0cnVjdC5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfRlVOQ1RJT05fQkFTRV9ICisjICBpbmNsdWRlIDxzdGwvX2Z1bmN0aW9uX2Jhc2UuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCitzdHJ1Y3QgX0xpc3Rfbm9kZV9iYXNlIHsKKyAgX0xpc3Rfbm9kZV9iYXNlKiBfTV9uZXh0OworICBfTGlzdF9ub2RlX2Jhc2UqIF9NX3ByZXY7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0R1bW15PgorY2xhc3MgX0xpc3RfZ2xvYmFsIHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBfTGlzdF9ub2RlX2Jhc2UgX05vZGVfYmFzZTsKKyAgc3RhdGljIHZvaWQgIF9TVExQX0NBTEwgX1RyYW5zZmVyKF9Ob2RlX2Jhc2UqIF9fcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX05vZGVfYmFzZSogX19maXJzdCwgX05vZGVfYmFzZSogX19sYXN0KTsKK307CisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUKQorX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIF9MaXN0X2dsb2JhbDxib29sPjsKKyNlbmRpZgordHlwZWRlZiBfTGlzdF9nbG9iYWw8Ym9vbD4gX0xpc3RfZ2xvYmFsX2luc3Q7CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitjbGFzcyBfTGlzdF9ub2RlIDogcHVibGljIF9MaXN0X25vZGVfYmFzZSB7CitwdWJsaWM6CisgIF9UcCBfTV9kYXRhOworICBfX1RSSVZJQUxfU1RVRkYoX0xpc3Rfbm9kZSkKK307CisKK3N0cnVjdCBfTGlzdF9pdGVyYXRvcl9iYXNlIHsKKyAgdHlwZWRlZiBzaXplX3QgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGU7CisgIHR5cGVkZWYgcHRyZGlmZl90ICAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICB0eXBlZGVmIGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworCisgIF9MaXN0X25vZGVfYmFzZSogX01fbm9kZTsKKworICBfTGlzdF9pdGVyYXRvcl9iYXNlKF9MaXN0X25vZGVfYmFzZSogX194KSA6IF9NX25vZGUoX194KSB7fQorCisgIHZvaWQgX01faW5jcigpIHsgX01fbm9kZSA9IF9NX25vZGUtPl9NX25leHQ7IH0KKyAgdm9pZCBfTV9kZWNyKCkgeyBfTV9ub2RlID0gX01fbm9kZS0+X01fcHJldjsgfQorfTsKKworCit0ZW1wbGF0ZTxjbGFzcyBfVHAsIGNsYXNzIF9UcmFpdHM+CitzdHJ1Y3QgX0xpc3RfaXRlcmF0b3IgOiBwdWJsaWMgX0xpc3RfaXRlcmF0b3JfYmFzZSB7CisgIHR5cGVkZWYgX1RwIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6cG9pbnRlciAgICBwb2ludGVyOworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OnJlZmVyZW5jZSAgcmVmZXJlbmNlOworCisgIHR5cGVkZWYgX0xpc3RfaXRlcmF0b3I8X1RwLCBfVHJhaXRzPiAgICAgICAgIF9TZWxmOworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6Ol9Ob25Db25zdFRyYWl0cyAgICBfTm9uQ29uc3RUcmFpdHM7CisgIHR5cGVkZWYgX0xpc3RfaXRlcmF0b3I8X1RwLCBfTm9uQ29uc3RUcmFpdHM+IGl0ZXJhdG9yOworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6Ol9Db25zdFRyYWl0cyAgICAgICBfQ29uc3RUcmFpdHM7CisgIHR5cGVkZWYgX0xpc3RfaXRlcmF0b3I8X1RwLCBfQ29uc3RUcmFpdHM+ICAgIGNvbnN0X2l0ZXJhdG9yOworCisgIHR5cGVkZWYgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CisgIHR5cGVkZWYgX0xpc3Rfbm9kZTxfVHA+IF9Ob2RlOworICB0eXBlZGVmIHNpemVfdCBzaXplX3R5cGU7CisgIHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKKworICBleHBsaWNpdCBfTGlzdF9pdGVyYXRvcihfTGlzdF9ub2RlX2Jhc2UqIF9feCkgOiBfTGlzdF9pdGVyYXRvcl9iYXNlKF9feCkge30KKyAgX0xpc3RfaXRlcmF0b3IoKSA6IF9MaXN0X2l0ZXJhdG9yX2Jhc2UoMCkge30KKyAgLy9jb3B5IGNvbnN0cnVjdG9yIGZvciBpdGVyYXRvciBhbmQgY29uc3RydWN0b3IgZnJvbSBpdGVyYXRvciBmb3IgY29uc3RfaXRlcmF0b3IKKyAgX0xpc3RfaXRlcmF0b3IoY29uc3QgaXRlcmF0b3ImIF9feCkgOiAgX0xpc3RfaXRlcmF0b3JfYmFzZShfX3guX01fbm9kZSkge30KKworICByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gX19TVEFUSUNfQ0FTVChfTm9kZSosIHRoaXMtPl9NX25vZGUpLT5fTV9kYXRhOyB9CisKKyAgX1NUTFBfREVGSU5FX0FSUk9XX09QRVJBVE9SCisKKyAgX1NlbGYmIG9wZXJhdG9yKysoKSB7CisgICAgdGhpcy0+X01faW5jcigpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBfU2VsZiBvcGVyYXRvcisrKGludCkgeworICAgIF9TZWxmIF9fdG1wID0gKnRoaXM7CisgICAgdGhpcy0+X01faW5jcigpOworICAgIHJldHVybiBfX3RtcDsKKyAgfQorICBfU2VsZiYgb3BlcmF0b3ItLSgpIHsKKyAgICB0aGlzLT5fTV9kZWNyKCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIF9TZWxmIG9wZXJhdG9yLS0oaW50KSB7CisgICAgX1NlbGYgX190bXAgPSAqdGhpczsKKyAgICB0aGlzLT5fTV9kZWNyKCk7CisgICAgcmV0dXJuIF9fdG1wOworICB9CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdF9pdGVyYXRvciBfX3kgKSBjb25zdCB7CisgICAgcmV0dXJuIHRoaXMtPl9NX25vZGUgPT0gX195Ll9NX25vZGU7CisgIH0KKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0X2l0ZXJhdG9yIF9feSApIGNvbnN0IHsKKyAgICByZXR1cm4gdGhpcy0+X01fbm9kZSAhPSBfX3kuX01fbm9kZTsKKyAgfQorfTsKKworI2lmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9UcmFpdHM+CitzdHJ1Y3QgX190eXBlX3RyYWl0czxfU1RMUF9QUklWIF9MaXN0X2l0ZXJhdG9yPF9UcCwgX1RyYWl0cz4gPiB7CisgIHR5cGVkZWYgX19mYWxzZV90eXBlICAgaGFzX3RyaXZpYWxfZGVmYXVsdF9jb25zdHJ1Y3RvcjsKKyAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yOworICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3I7CisgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjsKKyAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgICBpc19QT0RfdHlwZTsKK307CitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9PTERfSFBfSVRFUkFUT1JfUVVFUklFUykKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1RyYWl0cz4KK2lubGluZSBfVHAqIHZhbHVlX3R5cGUoY29uc3QgX1NUTFBfUFJJViBfTGlzdF9pdGVyYXRvcjxfVHAsIF9UcmFpdHM+JikgeyByZXR1cm4gMDsgfQoraW5saW5lIGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5KGNvbnN0IF9TVExQX1BSSVYgX0xpc3RfaXRlcmF0b3JfYmFzZSYpIHsgcmV0dXJuIGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnKCk7fQoraW5saW5lIHB0cmRpZmZfdCogZGlzdGFuY2VfdHlwZShjb25zdCBfU1RMUF9QUklWIF9MaXN0X2l0ZXJhdG9yX2Jhc2UmKSB7IHJldHVybiAwOyB9CitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisjZW5kaWYKKworLy8gQmFzZSBjbGFzcyB0aGF0IGVuY2Fwc3VsYXRlcyBkZXRhaWxzIG9mIGFsbG9jYXRvcnMgYW5kIGhlbHBzCisvLyB0byBzaW1wbGlmeSBFSAorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CitjbGFzcyBfTGlzdF9iYXNlIHsKK3Byb3RlY3RlZDoKKyAgX1NUTFBfRk9SQ0VfQUxMT0NBVE9SUyhfVHAsIF9BbGxvYykKKyAgdHlwZWRlZiBfTGlzdF9ub2RlX2Jhc2UgX05vZGVfYmFzZTsKKyAgdHlwZWRlZiBfTGlzdF9ub2RlPF9UcD4gX05vZGU7CisgIHR5cGVkZWYgX0xpc3RfYmFzZTxfVHAsIF9BbGxvYz4gX1NlbGY7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jX3RyYWl0czxfTm9kZSwgX0FsbG9jPjo6YWxsb2NhdG9yX3R5cGUgX05vZGVfYWxsb2NhdG9yX3R5cGU7CitwdWJsaWM6CisgIHR5cGVkZWYgX1NUTFBfYWxsb2NfcHJveHk8X05vZGVfYmFzZSwgX05vZGUsIF9Ob2RlX2FsbG9jYXRvcl90eXBlPiBfQWxsb2NQcm94eTsKKyAgdHlwZWRlZiBfQWxsb2MgYWxsb2NhdG9yX3R5cGU7CisKKyAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0CisgIHsgcmV0dXJuIF9TVExQX0NPTlZFUlRfQUxMT0NBVE9SKChjb25zdCBfTm9kZV9hbGxvY2F0b3JfdHlwZSYpX01fbm9kZSwgX1RwKTsgfQorCisgIF9MaXN0X2Jhc2UoY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkgOiBfTV9ub2RlKF9TVExQX0NPTlZFUlRfQUxMT0NBVE9SKF9fYSwgX05vZGUpLCBfTm9kZV9iYXNlKCkpCisgIHsgX01fZW1wdHlfaW5pdGlhbGl6ZSgpOyB9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKKyAgX0xpc3RfYmFzZShfX21vdmVfc291cmNlPF9TZWxmPiBzcmMpIDoKKyAgICBfTV9ub2RlKF9fbW92ZV9zb3VyY2U8X0FsbG9jUHJveHk+KHNyYy5nZXQoKS5fTV9ub2RlKSkgeworICAgIGlmIChzcmMuZ2V0KCkuZW1wdHkoKSkKKyAgICAgIC8vV2UgZm9yY2UgdGhpcyB0byBlbXB0eS4KKyAgICAgIF9NX2VtcHR5X2luaXRpYWxpemUoKTsKKyAgICBlbHNlIHsKKyAgICAgIHNyYy5nZXQoKS5fTV9lbXB0eV9pbml0aWFsaXplKCk7CisgICAgICBfTV9ub2RlLl9NX2RhdGEuX01fcHJldi0+X01fbmV4dCA9IF9NX25vZGUuX01fZGF0YS5fTV9uZXh0LT5fTV9wcmV2ID0gJl9NX25vZGUuX01fZGF0YTsKKyAgICB9CisgIH0KKyNlbmRpZgorCisgIH5fTGlzdF9iYXNlKCkKKyAgeyBjbGVhcigpOyB9CisKKyAgdm9pZCBjbGVhcigpOworICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gX01fbm9kZS5fTV9kYXRhLl9NX25leHQgPT0gJl9NX25vZGUuX01fZGF0YTsgfQorCisgIHZvaWQgX01fZW1wdHlfaW5pdGlhbGl6ZSgpIHsKKyAgICBfTV9ub2RlLl9NX2RhdGEuX01fbmV4dCA9ICZfTV9ub2RlLl9NX2RhdGE7CisgICAgX01fbm9kZS5fTV9kYXRhLl9NX3ByZXYgPSBfTV9ub2RlLl9NX2RhdGEuX01fbmV4dDsKKyAgfQorCitwdWJsaWM6CisgIF9BbGxvY1Byb3h5IF9NX25vZGU7Cit9OworCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BUUl9TUEVDSUFMSVpBVElPTlMpCisjICBkZWZpbmUgbGlzdCBfU1RMUF9QVFJfSU1QTF9OQU1FKGxpc3QpCisjZWxpZiBkZWZpbmVkIChfU1RMUF9ERUJVRykKKyMgIGRlZmluZSBsaXN0IF9TVExQX05PTl9EQkdfTkFNRShsaXN0KQorI2Vsc2UKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIF9TVExQX0RGTF9UTVBMX1BBUkFNKF9BbGxvYywgYWxsb2NhdG9yPF9UcD4pID4KK2NsYXNzIGxpc3Q7CisKKyNpZiAhZGVmaW5lZCAobGlzdCkKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKyNlbmRpZgorCisvLyBoZWxwZXIgZnVuY3Rpb25zIHRvIHJlZHVjZSBjb2RlIGR1cGxpY2F0aW9uCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2MsIGNsYXNzIF9QcmVkaWNhdGU+Cit2b2lkIF9TX3JlbW92ZV9pZihsaXN0PF9UcCwgX0FsbG9jPiYgX190aGF0LCBfUHJlZGljYXRlIF9fcHJlZCk7CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYywgY2xhc3MgX0JpbmFyeVByZWRpY2F0ZT4KK3ZvaWQgX1NfdW5pcXVlKGxpc3Q8X1RwLCBfQWxsb2M+JiBfX3RoYXQsIF9CaW5hcnlQcmVkaWNhdGUgX19iaW5hcnlfcHJlZCk7CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYywgY2xhc3MgX1N0cmljdFdlYWtPcmRlcmluZz4KK3ZvaWQgX1NfbWVyZ2UobGlzdDxfVHAsIF9BbGxvYz4mIF9fdGhhdCwgbGlzdDxfVHAsIF9BbGxvYz4mIF9feCwKKyAgICAgICAgICAgICAgX1N0cmljdFdlYWtPcmRlcmluZyBfX2NvbXApOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2MsIGNsYXNzIF9TdHJpY3RXZWFrT3JkZXJpbmc+Cit2b2lkIF9TX3NvcnQobGlzdDxfVHAsIF9BbGxvYz4mIF9fdGhhdCwgX1N0cmljdFdlYWtPcmRlcmluZyBfX2NvbXApOworCisjaWYgIWRlZmluZWQgKGxpc3QpCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CitjbGFzcyBsaXN0IDogcHVibGljIF9TVExQX1BSSVYgX0xpc3RfYmFzZTxfVHAsIF9BbGxvYz4KKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUEFSVElBTF9TUEVDX1dPUktBUk9VTkQpICYmICFkZWZpbmVkIChsaXN0KQorICAgICAgICAgICAsIHB1YmxpYyBfX3N0bHBvcnRfY2xhc3M8bGlzdDxfVHAsIF9BbGxvYz4gPgorI2VuZGlmCit7CisgIHR5cGVkZWYgX1NUTFBfUFJJViBfTGlzdF9iYXNlPF9UcCwgX0FsbG9jPiBfQmFzZTsKKyAgdHlwZWRlZiBsaXN0PF9UcCwgX0FsbG9jPiBfU2VsZjsKKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9MaXN0X25vZGU8X1RwPiBfTm9kZTsKKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9MaXN0X25vZGVfYmFzZSBfTm9kZV9iYXNlOworcHVibGljOgorICB0eXBlZGVmIF9UcCB2YWx1ZV90eXBlOworICB0eXBlZGVmIHZhbHVlX3R5cGUqIHBvaW50ZXI7CisgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSogY29uc3RfcG9pbnRlcjsKKyAgdHlwZWRlZiB2YWx1ZV90eXBlJiByZWZlcmVuY2U7CisgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSYgY29uc3RfcmVmZXJlbmNlOworICB0eXBlZGVmIHNpemVfdCBzaXplX3R5cGU7CisgIHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKKyAgX1NUTFBfRk9SQ0VfQUxMT0NBVE9SUyhfVHAsIF9BbGxvYykKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7CisgIHR5cGVkZWYgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgX0l0ZXJhdG9yX2NhdGVnb3J5OworCitwdWJsaWM6CisgIHR5cGVkZWYgX1NUTFBfUFJJViBfTGlzdF9pdGVyYXRvcjxfVHAsIF9Ob25jb25zdF90cmFpdHM8X1RwPiA+IGl0ZXJhdG9yOworICB0eXBlZGVmIF9TVExQX1BSSVYgX0xpc3RfaXRlcmF0b3I8X1RwLCBfQ29uc3RfdHJhaXRzPF9UcD4gPiAgICBjb25zdF9pdGVyYXRvcjsKKyAgX1NUTFBfREVDTEFSRV9CSURJUkVDVElPTkFMX1JFVkVSU0VfSVRFUkFUT1JTOworCitwcm90ZWN0ZWQ6CisjaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCisgIF9Ob2RlX2Jhc2UqIF9NX2NyZWF0ZV9ub2RlKGNvbnN0X3JlZmVyZW5jZSBfX3ggPSB2YWx1ZV90eXBlKCkpIHsKKyNlbHNlCisgIF9Ob2RlX2Jhc2UqIF9NX2NyZWF0ZV9ub2RlKGNvbnN0X3JlZmVyZW5jZSBfX3gpIHsKKyNlbmRpZgorICAgIF9Ob2RlKiBfX3AgPSB0aGlzLT5fTV9ub2RlLmFsbG9jYXRlKDEpOworICAgIF9TVExQX1RSWSB7CisgICAgICBfQ29weV9Db25zdHJ1Y3QoJl9fcC0+X01fZGF0YSwgX194KTsKKyAgICB9CisgICAgX1NUTFBfVU5XSU5EKHRoaXMtPl9NX25vZGUuZGVhbGxvY2F0ZShfX3AsIDEpKQorICAgIHJldHVybiBfX3A7CisgIH0KKworI2lmIGRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCisgIF9Ob2RlX2Jhc2UqIF9NX2NyZWF0ZV9ub2RlKCkgeworICAgIF9Ob2RlKiBfX3AgPSB0aGlzLT5fTV9ub2RlLmFsbG9jYXRlKDEpOworICAgIF9TVExQX1RSWSB7CisgICAgICBfU1RMUF9TVEQ6Ol9Db25zdHJ1Y3QoJl9fcC0+X01fZGF0YSk7CisgICAgfQorICAgIF9TVExQX1VOV0lORCh0aGlzLT5fTV9ub2RlLmRlYWxsb2NhdGUoX19wLCAxKSkKKyAgICByZXR1cm4gX19wOworICB9CisjZW5kaWYKKworcHVibGljOgorI2lmICFkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorICBleHBsaWNpdCBsaXN0KHNpemVfdHlwZSBfX24sIGNvbnN0X3JlZmVyZW5jZSBfX3ZhbCA9IF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQodmFsdWVfdHlwZSksCisgICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisjZWxzZQorICBleHBsaWNpdCBsaXN0KHNpemVfdHlwZSBfX24pCisgICAgOiBfU1RMUF9QUklWIF9MaXN0X2Jhc2U8X1RwLCBfQWxsb2M+KGFsbG9jYXRvcl90eXBlKCkpCisgICAgeyB0aGlzLT5pbnNlcnQoYmVnaW4oKSwgX19uLCBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKHZhbHVlX3R5cGUpKTsgfQorICBsaXN0KHNpemVfdHlwZSBfX24sIGNvbnN0X3JlZmVyZW5jZSBfX3ZhbCkKKyAgICA6IF9TVExQX1BSSVYgX0xpc3RfYmFzZTxfVHAsIF9BbGxvYz4oYWxsb2NhdG9yX3R5cGUoKSkKKyAgICB7IHRoaXMtPmluc2VydChiZWdpbigpLCBfX24sIF9fdmFsKTsgfQorICBsaXN0KHNpemVfdHlwZSBfX24sIGNvbnN0X3JlZmVyZW5jZSBfX3ZhbCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0qLworICAgIDogX1NUTFBfUFJJViBfTGlzdF9iYXNlPF9UcCwgX0FsbG9jPihfX2EpCisgICAgeyB0aGlzLT5pbnNlcnQoYmVnaW4oKSwgX19uLCBfX3ZhbCk7IH0KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIC8vIFdlIGRvbid0IG5lZWQgYW55IGRpc3BhdGNoaW5nIHRyaWNrcyBoZXJlLCBiZWNhdXNlIGluc2VydCBkb2VzIGFsbCBvZgorICAvLyB0aGF0IGFueXdheS4KKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICBsaXN0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hIF9TVExQX0FMTE9DQVRPUl9UWVBFX0RGTCkKKyAgICA6IF9TVExQX1BSSVYgX0xpc3RfYmFzZTxfVHAsIF9BbGxvYz4oX19hKQorICB7IF9NX2luc2VydChiZWdpbigpLCBfX2ZpcnN0LCBfX2xhc3QpOyB9CisKKyMgIGlmIGRlZmluZWQgKF9TVExQX05FRURTX0VYVFJBX1RFTVBMQVRFX0NPTlNUUlVDVE9SUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICBsaXN0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICA6IF9TVExQX1BSSVYgX0xpc3RfYmFzZTxfVHAsIF9BbGxvYz4oYWxsb2NhdG9yX3R5cGUoKSkKKyAgeyBfTV9pbnNlcnQoYmVnaW4oKSwgX19maXJzdCwgX19sYXN0KTsgfQorIyAgZW5kaWYKKyNlbHNlIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKyAgbGlzdChjb25zdCB2YWx1ZV90eXBlKiBfX2ZpcnN0LCBjb25zdCB2YWx1ZV90eXBlKiBfX2xhc3QsCisgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfU1RMUF9QUklWIF9MaXN0X2Jhc2U8X1RwLCBfQWxsb2M+KF9fYSkKKyAgICB7IF9NX2luc2VydChiZWdpbigpLCBfX2ZpcnN0LCBfX2xhc3QpOyB9CisgIGxpc3QoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0LAorICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX1NUTFBfUFJJViBfTGlzdF9iYXNlPF9UcCwgX0FsbG9jPihfX2EpCisgICAgeyBfTV9pbnNlcnQoYmVnaW4oKSwgX19maXJzdCwgX19sYXN0KTsgfQorI2VuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKworI2lmICFkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorICBleHBsaWNpdCBsaXN0KGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorI2Vsc2UKKyAgbGlzdCgpCisgICAgOiBfU1RMUF9QUklWIF9MaXN0X2Jhc2U8X1RwLCBfQWxsb2M+KGFsbG9jYXRvcl90eXBlKCkpIHt9CisgIGxpc3QoY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyNlbmRpZgorICAgIDogX1NUTFBfUFJJViBfTGlzdF9iYXNlPF9UcCwgX0FsbG9jPihfX2EpIHt9CisKKyAgbGlzdChjb25zdCBfU2VsZiYgX194KSA6IF9TVExQX1BSSVYgX0xpc3RfYmFzZTxfVHAsIF9BbGxvYz4oX194LmdldF9hbGxvY2F0b3IoKSkKKyAgeyBfTV9pbnNlcnQoYmVnaW4oKSwgX194LmJlZ2luKCksIF9feC5lbmQoKSk7IH0KKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19NT1ZFX1NFTUFOVElDKQorICBsaXN0KF9fbW92ZV9zb3VyY2U8X1NlbGY+IHNyYykKKyAgICA6IF9TVExQX1BSSVYgX0xpc3RfYmFzZTxfVHAsIF9BbGxvYz4oX19tb3ZlX3NvdXJjZTxfQmFzZT4oc3JjLmdldCgpKSkge30KKyNlbmRpZgorCisgIH5saXN0KCkge30KKworICBfU2VsZiYgb3BlcmF0b3IgPSAoY29uc3QgX1NlbGYmIF9feCk7CisKKyAgaXRlcmF0b3IgYmVnaW4oKSAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBpdGVyYXRvcih0aGlzLT5fTV9ub2RlLl9NX2RhdGEuX01fbmV4dCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCAgICAgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcih0aGlzLT5fTV9ub2RlLl9NX2RhdGEuX01fbmV4dCk7IH0KKworICBpdGVyYXRvciBlbmQoKSAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKCZ0aGlzLT5fTV9ub2RlLl9NX2RhdGEpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0ICAgICAgICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX19DT05TVF9DQVNUKF9Ob2RlX2Jhc2UqLCAmdGhpcy0+X01fbm9kZS5fTV9kYXRhKSk7IH0KKworICByZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpICAgICAgICAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3QgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICByZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSAgICAgICAgICAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgY29uc3QgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCB7CisgICAgc2l6ZV90eXBlIF9fcmVzdWx0ID0gX1NUTFBfU1REOjpkaXN0YW5jZShiZWdpbigpLCBlbmQoKSk7CisgICAgcmV0dXJuIF9fcmVzdWx0OworICB9CisgIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHNpemVfdHlwZSgtMSk7IH0KKworICByZWZlcmVuY2UgZnJvbnQoKSAgICAgICAgICAgICB7IHJldHVybiAqYmVnaW4oKTsgfQorICBjb25zdF9yZWZlcmVuY2UgZnJvbnQoKSBjb25zdCB7IHJldHVybiAqYmVnaW4oKTsgfQorICByZWZlcmVuY2UgYmFjaygpICAgICAgICAgICAgICB7IHJldHVybiAqKC0tZW5kKCkpOyB9CisgIGNvbnN0X3JlZmVyZW5jZSBiYWNrKCkgY29uc3QgIHsgcmV0dXJuICooLS1lbmQoKSk7IH0KKworcHJpdmF0ZToKKyAgdm9pZCBfTV9zd2FwX2F1eChfU2VsZiYgX194KSB7CisgICAgX194Ll9NX25vZGUuX01fc3dhcF9hbGxvYyh0aGlzLT5fTV9ub2RlKTsKKyAgICBfX3guX01fbm9kZS5fTV9kYXRhLl9NX25leHQgPSB0aGlzLT5fTV9ub2RlLl9NX2RhdGEuX01fbmV4dDsKKyAgICBfX3guX01fbm9kZS5fTV9kYXRhLl9NX25leHQtPl9NX3ByZXYgPSAmX194Ll9NX25vZGUuX01fZGF0YTsKKyAgICBfX3guX01fbm9kZS5fTV9kYXRhLl9NX3ByZXYgPSB0aGlzLT5fTV9ub2RlLl9NX2RhdGEuX01fcHJldjsKKyAgICBfX3guX01fbm9kZS5fTV9kYXRhLl9NX3ByZXYtPl9NX25leHQgPSAmX194Ll9NX25vZGUuX01fZGF0YTsKKyAgICB0aGlzLT5fTV9lbXB0eV9pbml0aWFsaXplKCk7CisgIH0KKworcHVibGljOgorICB2b2lkIHN3YXAoX1NlbGYmIF9feCkgeworICAgIGlmIChfX3guZW1wdHkoKSkgeworICAgICAgaWYgKHRoaXMtPmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgdGhpcy0+X01fc3dhcF9hdXgoX194KTsKKyAgICB9IGVsc2UgaWYgKHRoaXMtPmVtcHR5KCkpIHsKKyAgICAgIF9feC5fTV9zd2FwX2F1eCgqdGhpcyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMtPl9NX25vZGUuc3dhcChfX3guX01fbm9kZSk7CisgICAgICBfU1RMUF9TVEQ6OnN3YXAodGhpcy0+X01fbm9kZS5fTV9kYXRhLl9NX3ByZXYtPl9NX25leHQsIF9feC5fTV9ub2RlLl9NX2RhdGEuX01fcHJldi0+X01fbmV4dCk7CisgICAgICBfU1RMUF9TVEQ6OnN3YXAodGhpcy0+X01fbm9kZS5fTV9kYXRhLl9NX25leHQtPl9NX3ByZXYsIF9feC5fTV9ub2RlLl9NX2RhdGEuX01fbmV4dC0+X01fcHJldik7CisgICAgfQorICB9CisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKSAmJiAhZGVmaW5lZCAoX1NUTFBfRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSKQorICB2b2lkIF9NX3N3YXBfd29ya2Fyb3VuZChfU2VsZiYgX194KSB7IHN3YXAoX194KTsgfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKSAmJiAhZGVmaW5lZChfU1RMUF9OT19BTkFDSFJPTklTTVMpCisgIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBfX3BvcywgY29uc3RfcmVmZXJlbmNlIF9feCA9IHZhbHVlX3R5cGUoKSkKKyNlbHNlCisgIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBfX3BvcywgY29uc3RfcmVmZXJlbmNlIF9feCkKKyNlbmRpZiAvKiFfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNICYmICFfU1RMUF9OT19BTkFDSFJPTklTTVMqLworICB7CisgICAgX05vZGVfYmFzZSogX190bXAgPSBfTV9jcmVhdGVfbm9kZShfX3gpOworICAgIF9Ob2RlX2Jhc2UqIF9fbiA9IF9fcG9zLl9NX25vZGU7CisgICAgX05vZGVfYmFzZSogX19wID0gX19uLT5fTV9wcmV2OworICAgIF9fdG1wLT5fTV9uZXh0ID0gX19uOworICAgIF9fdG1wLT5fTV9wcmV2ID0gX19wOworICAgIF9fcC0+X01fbmV4dCA9IF9fdG1wOworICAgIF9fbi0+X01fcHJldiA9IF9fdG1wOworICAgIHJldHVybiBpdGVyYXRvcihfX3RtcCk7CisgIH0KKworcHJpdmF0ZToKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZvaWQgX01faW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0ludGVncmFsPF9JbnB1dEl0ZXJhdG9yPjo6X1JldCBfSW50ZWdyYWw7CisgICAgX01faW5zZXJ0X2Rpc3BhdGNoKF9fcG9zLCBfX2ZpcnN0LCBfX2xhc3QsIF9JbnRlZ3JhbCgpKTsKKyAgfQorCisgIC8vIENoZWNrIHdoZXRoZXIgaXQncyBhbiBpbnRlZ3JhbCB0eXBlLiAgSWYgc28sIGl0J3Mgbm90IGFuIGl0ZXJhdG9yLgorICB0ZW1wbGF0ZTxjbGFzcyBfSW50ZWdlcj4KKyAgdm9pZCBfTV9pbnNlcnRfZGlzcGF0Y2goaXRlcmF0b3IgX19wb3MsIF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX194LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX3RydWVfdHlwZSYgLypfSXNJbnRlZ3JhbCovKSB7CisgICAgX01fZmlsbF9pbnNlcnQoX19wb3MsIF9fbiwgX194KTsKKyAgfQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcj4KKyAgdm9pZCBfTV9pbnNlcnRfZGlzcGF0Y2goaXRlcmF0b3IgX19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypfSXNJbnRlZ3JhbCovKSB7CisjZWxzZSAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisgIHZvaWQgX01faW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBjb25zdCB2YWx1ZV90eXBlKiBfX2ZpcnN0LCBjb25zdCB2YWx1ZV90eXBlKiBfX2xhc3QpIHsKKyAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKyAgICAgIGluc2VydChfX3BvcywgKl9fZmlyc3QpOworICB9CisgIHZvaWQgX01faW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpIHsKKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisgICAgLy9XZSB1c2UgYSB0ZW1wb3JhcnkgbGlzdCB0byBhdm9pZCB0aGUgYXV0byByZWZlcmVuY2UgdHJvdWJsZXMgKGluZmluaXRlIGxvb3ApCisgICAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisgICAgICBpbnNlcnQoX19wb3MsICpfX2ZpcnN0KTsKKyAgfQorCitwdWJsaWM6CisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICB2b2lkIGluc2VydChpdGVyYXRvciBfX3BvcywgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXNJbnRlZ3JhbDxfSW5wdXRJdGVyYXRvcj46Ol9SZXQgX0ludGVncmFsOworICAgIF9NX3NwbGljZV9pbnNlcnRfZGlzcGF0Y2goX19wb3MsIF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOworICB9CisKK3ByaXZhdGU6CisgIC8vIENoZWNrIHdoZXRoZXIgaXQncyBhbiBpbnRlZ3JhbCB0eXBlLiAgSWYgc28sIGl0J3Mgbm90IGFuIGl0ZXJhdG9yLgorICB0ZW1wbGF0ZTxjbGFzcyBfSW50ZWdlcj4KKyAgdm9pZCBfTV9zcGxpY2VfaW5zZXJ0X2Rpc3BhdGNoKGl0ZXJhdG9yIF9fcG9zLCBfSW50ZWdlciBfX24sIF9JbnRlZ2VyIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX190cnVlX3R5cGUmIC8qX0lzSW50ZWdyYWwqLykgeworICAgIF9NX2ZpbGxfaW5zZXJ0KF9fcG9zLCBfX24sIF9feCk7CisgIH0KKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXI+CisgIHZvaWQgX01fc3BsaWNlX2luc2VydF9kaXNwYXRjaChpdGVyYXRvciBfX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19mYWxzZV90eXBlJiAvKl9Jc0ludGVncmFsKi8pIHsKKyNlbHNlIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKyAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIGNvbnN0IHZhbHVlX3R5cGUqIF9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbGFzdCkgeworICAgIF9TZWxmIF9fdG1wKF9fZmlyc3QsIF9fbGFzdCwgdGhpcy0+Z2V0X2FsbG9jYXRvcigpKTsKKyAgICBfU1RMUF9BU1NFUlQoX190bXAuZ2V0X2FsbG9jYXRvcigpID09IHRoaXMtPmdldF9hbGxvY2F0b3IoKSkKKyAgICBzcGxpY2UoX19wb3MsIF9fdG1wKTsKKyAgfQorICB2b2lkIGluc2VydChpdGVyYXRvciBfX3BvcywgY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KSB7CisjZW5kaWYgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworICAgIC8vV2UgdXNlIGEgdGVtcG9yYXJ5IGxpc3QgdG8gYXZvaWQgdGhlIGF1dG8gcmVmZXJlbmNlIHRyb3VibGVzIChpbmZpbml0ZSBsb29wKQorICAgIF9TZWxmIF9fdG1wKF9fZmlyc3QsIF9fbGFzdCwgdGhpcy0+Z2V0X2FsbG9jYXRvcigpKTsKKyAgICBzcGxpY2UoX19wb3MsIF9fdG1wKTsKKyAgfQorCitwdWJsaWM6CisgIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBzaXplX3R5cGUgX19uLCBjb25zdF9yZWZlcmVuY2UgX194KQorICB7IF9NX2ZpbGxfaW5zZXJ0KF9fcG9zLCBfX24sIF9feCk7IH0KKworcHJpdmF0ZToKKyAgdm9pZCBfTV9maWxsX2luc2VydChpdGVyYXRvciBfX3Bvcywgc2l6ZV90eXBlIF9fbiwgY29uc3RfcmVmZXJlbmNlIF9feCkgeworICAgIGZvciAoIDsgX19uID4gMDsgLS1fX24pCisgICAgICBpbnNlcnQoX19wb3MsIF9feCk7CisgIH0KKworcHVibGljOgorICB2b2lkIHB1c2hfZnJvbnQoY29uc3RfcmVmZXJlbmNlIF9feCkgeyBpbnNlcnQoYmVnaW4oKSwgX194KTsgfQorICB2b2lkIHB1c2hfYmFjayAoY29uc3RfcmVmZXJlbmNlIF9feCkgeyBpbnNlcnQoZW5kKCksIF9feCk7IH0KKworI2lmIGRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pICYmICFkZWZpbmVkIChfU1RMUF9OT19BTkFDSFJPTklTTVMpCisgIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBfX3BvcykKKyAgeyByZXR1cm4gaW5zZXJ0KF9fcG9zLCBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKHZhbHVlX3R5cGUpKTsgfQorICB2b2lkIHB1c2hfZnJvbnQoKSB7aW5zZXJ0KGJlZ2luKCkpO30KKyAgdm9pZCBwdXNoX2JhY2soKSB7aW5zZXJ0KGVuZCgpKTt9CisjIGVuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSAmJiAhX1NUTFBfTk9fQU5BQ0hST05JU01TKi8KKworICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBfX3BvcykgeworICAgIF9Ob2RlX2Jhc2UqIF9fbmV4dF9ub2RlID0gX19wb3MuX01fbm9kZS0+X01fbmV4dDsKKyAgICBfTm9kZV9iYXNlKiBfX3ByZXZfbm9kZSA9IF9fcG9zLl9NX25vZGUtPl9NX3ByZXY7CisgICAgX05vZGUqIF9fbiA9IF9fU1RBVElDX0NBU1QoX05vZGUqLCBfX3Bvcy5fTV9ub2RlKTsKKyAgICBfX3ByZXZfbm9kZS0+X01fbmV4dCA9IF9fbmV4dF9ub2RlOworICAgIF9fbmV4dF9ub2RlLT5fTV9wcmV2ID0gX19wcmV2X25vZGU7CisgICAgX1NUTFBfU1REOjpfRGVzdHJveSgmX19uLT5fTV9kYXRhKTsKKyAgICB0aGlzLT5fTV9ub2RlLmRlYWxsb2NhdGUoX19uLCAxKTsKKyAgICByZXR1cm4gaXRlcmF0b3IoX19uZXh0X25vZGUpOworICB9CisKKyAgaXRlcmF0b3IgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KSB7CisgICAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0KQorICAgICAgZXJhc2UoX19maXJzdCsrKTsKKyAgICByZXR1cm4gX19sYXN0OworICB9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKKyAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9fbmV3X3NpemUsIGNvbnN0X3JlZmVyZW5jZSBfX3ggPSB2YWx1ZV90eXBlKCkpOworI2Vsc2UKKyAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9fbmV3X3NpemUsIGNvbnN0X3JlZmVyZW5jZSBfX3gpOworICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgX19uZXdfc2l6ZSkKKyAgeyB0aGlzLT5yZXNpemUoX19uZXdfc2l6ZSwgX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRCh2YWx1ZV90eXBlKSk7IH0KKyNlbmRpZiAvKiFfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKi8KKworICB2b2lkIHBvcF9mcm9udCgpIHsgZXJhc2UoYmVnaW4oKSk7IH0KKyAgdm9pZCBwb3BfYmFjaygpIHsKKyAgICBpdGVyYXRvciBfX3RtcCA9IGVuZCgpOworICAgIGVyYXNlKC0tX190bXApOworICB9CisKK3B1YmxpYzoKKyAgLy8gYXNzaWduKCksIGEgZ2VuZXJhbGl6ZWQgYXNzaWdubWVudCBtZW1iZXIgZnVuY3Rpb24uICBUd28KKyAgLy8gdmVyc2lvbnM6IG9uZSB0aGF0IHRha2VzIGEgY291bnQsIGFuZCBvbmUgdGhhdCB0YWtlcyBhIHJhbmdlLgorICAvLyBUaGUgcmFuZ2UgdmVyc2lvbiBpcyBhIG1lbWJlciB0ZW1wbGF0ZSwgc28gd2UgZGlzcGF0Y2ggb24gd2hldGhlcgorICAvLyBvciBub3QgdGhlIHR5cGUgaXMgYW4gaW50ZWdlci4KKworICB2b2lkIGFzc2lnbihzaXplX3R5cGUgX19uLCBjb25zdF9yZWZlcmVuY2UgX192YWwpIHsgX01fZmlsbF9hc3NpZ24oX19uLCBfX3ZhbCk7IH0KKworICB2b2lkIF9NX2ZpbGxfYXNzaWduKHNpemVfdHlwZSBfX24sIGNvbnN0X3JlZmVyZW5jZSBfX3ZhbCk7CisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZvaWQgYXNzaWduKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lzSW50ZWdyYWw8X0lucHV0SXRlcmF0b3I+OjpfUmV0IF9JbnRlZ3JhbDsKKyAgICBfTV9hc3NpZ25fZGlzcGF0Y2goX19maXJzdCwgX19sYXN0LCBfSW50ZWdyYWwoKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0ludGVnZXI+CisgIHZvaWQgX01fYXNzaWduX2Rpc3BhdGNoKF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX192YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKl9Jc0ludGVncmFsKi8pIHsKKyAgICBfTV9maWxsX2Fzc2lnbihfX24sIF9fdmFsKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgdm9pZCBfTV9hc3NpZ25fZGlzcGF0Y2goX0lucHV0SXRlcmF0b3IgX19maXJzdDIsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypfSXNJbnRlZ3JhbCovKSB7CisjZWxzZQorICB2b2lkIGFzc2lnbihjb25zdCB2YWx1ZV90eXBlICpfX2ZpcnN0MiwgY29uc3QgdmFsdWVfdHlwZSAqX19sYXN0MikgeworICAgIGl0ZXJhdG9yIF9fZmlyc3QxID0gYmVnaW4oKTsKKyAgICBpdGVyYXRvciBfX2xhc3QxID0gZW5kKCk7CisgICAgZm9yICggOyBfX2ZpcnN0MSAhPSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDI7ICsrX19maXJzdDEsICsrX19maXJzdDIpCisgICAgICAqX19maXJzdDEgPSAqX19maXJzdDI7CisgICAgaWYgKF9fZmlyc3QyID09IF9fbGFzdDIpCisgICAgICBlcmFzZShfX2ZpcnN0MSwgX19sYXN0MSk7CisgICAgZWxzZQorICAgICAgaW5zZXJ0KF9fbGFzdDEsIF9fZmlyc3QyLCBfX2xhc3QyKTsKKyAgfQorICB2b2lkIGFzc2lnbihjb25zdF9pdGVyYXRvciBfX2ZpcnN0MiwgY29uc3RfaXRlcmF0b3IgX19sYXN0MikgeworI2VuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKyAgICBpdGVyYXRvciBfX2ZpcnN0MSA9IGJlZ2luKCk7CisgICAgaXRlcmF0b3IgX19sYXN0MSA9IGVuZCgpOworICAgIGZvciAoIDsgX19maXJzdDEgIT0gX19sYXN0MSAmJiBfX2ZpcnN0MiAhPSBfX2xhc3QyOyArK19fZmlyc3QxLCArK19fZmlyc3QyKQorICAgICAgKl9fZmlyc3QxID0gKl9fZmlyc3QyOworICAgIGlmIChfX2ZpcnN0MiA9PSBfX2xhc3QyKQorICAgICAgZXJhc2UoX19maXJzdDEsIF9fbGFzdDEpOworICAgIGVsc2UKKyAgICAgIGluc2VydChfX2xhc3QxLCBfX2ZpcnN0MiwgX19sYXN0Mik7CisgIH0KKworcHVibGljOgorICB2b2lkIHNwbGljZShpdGVyYXRvciBfX3BvcywgX1NlbGYmIF9feCkgeworICAgIGlmICghX194LmVtcHR5KCkpIHsKKyAgICAgIGlmICh0aGlzLT5nZXRfYWxsb2NhdG9yKCkgPT0gX194LmdldF9hbGxvY2F0b3IoKSkgeworICAgICAgICBfU1RMUF9QUklWIF9MaXN0X2dsb2JhbF9pbnN0OjpfVHJhbnNmZXIoX19wb3MuX01fbm9kZSwgX194LmJlZ2luKCkuX01fbm9kZSwgX194LmVuZCgpLl9NX25vZGUpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGluc2VydChfX3BvcywgX194LmJlZ2luKCksIF9feC5lbmQoKSk7CisgICAgICAgIF9feC5jbGVhcigpOworICAgICAgfQorICAgIH0KKyAgfQorICB2b2lkIHNwbGljZShpdGVyYXRvciBfX3BvcywgX1NlbGYmIF9feCwgaXRlcmF0b3IgX19pKSB7CisgICAgaXRlcmF0b3IgX19qID0gX19pOworICAgICsrX19qOworICAgIGlmIChfX3BvcyA9PSBfX2kgfHwgX19wb3MgPT0gX19qKSByZXR1cm47CisgICAgaWYgKHRoaXMtPmdldF9hbGxvY2F0b3IoKSA9PSBfX3guZ2V0X2FsbG9jYXRvcigpKSB7CisgICAgICBfU1RMUF9QUklWIF9MaXN0X2dsb2JhbF9pbnN0OjpfVHJhbnNmZXIoX19wb3MuX01fbm9kZSwgX19pLl9NX25vZGUsIF9fai5fTV9ub2RlKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBpbnNlcnQoX19wb3MsICpfX2kpOworICAgICAgX194LmVyYXNlKF9faSk7CisgICAgfQorICB9CisgIHZvaWQgc3BsaWNlKGl0ZXJhdG9yIF9fcG9zLCBfU2VsZiYgX194LCBpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpIHsKKyAgICBpZiAoX19maXJzdCAhPSBfX2xhc3QpIHsKKyAgICAgIGlmICh0aGlzLT5nZXRfYWxsb2NhdG9yKCkgPT0gX194LmdldF9hbGxvY2F0b3IoKSkgeworICAgICAgICBfU1RMUF9QUklWIF9MaXN0X2dsb2JhbF9pbnN0OjpfVHJhbnNmZXIoX19wb3MuX01fbm9kZSwgX19maXJzdC5fTV9ub2RlLCBfX2xhc3QuX01fbm9kZSk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgaW5zZXJ0KF9fcG9zLCBfX2ZpcnN0LCBfX2xhc3QpOworICAgICAgICBfX3guZXJhc2UoX19maXJzdCwgX19sYXN0KTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICB2b2lkIHJlbW92ZShjb25zdF9yZWZlcmVuY2UgX192YWwpIHsKKyAgICBpdGVyYXRvciBfX2ZpcnN0ID0gYmVnaW4oKTsKKyAgICBpdGVyYXRvciBfX2xhc3QgPSBlbmQoKTsKKyAgICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QpIHsKKyAgICAgIGl0ZXJhdG9yIF9fbmV4dCA9IF9fZmlyc3Q7CisgICAgICArK19fbmV4dDsKKyAgICAgIGlmIChfX3ZhbCA9PSAqX19maXJzdCkgZXJhc2UoX19maXJzdCk7CisgICAgICBfX2ZpcnN0ID0gX19uZXh0OworICAgIH0KKyAgfQorCisgIHZvaWQgdW5pcXVlKCkKKyAgeyBfU1RMUF9QUklWIF9TX3VuaXF1ZSgqdGhpcywgZXF1YWxfdG88dmFsdWVfdHlwZT4oKSk7IH0KKworICB2b2lkIG1lcmdlKF9TZWxmJiBfX3gpCisgIHsgX1NUTFBfUFJJViBfU19tZXJnZSgqdGhpcywgX194LCBsZXNzPHZhbHVlX3R5cGU+KCkpOyB9CisKKyAgdm9pZCByZXZlcnNlKCkgeworICAgIF9Ob2RlX2Jhc2UqIF9fcCA9ICZ0aGlzLT5fTV9ub2RlLl9NX2RhdGE7CisgICAgX05vZGVfYmFzZSogX190bXAgPSBfX3A7CisgICAgZG8geworICAgICAgX1NUTFBfU1REOjpzd2FwKF9fdG1wLT5fTV9uZXh0LCBfX3RtcC0+X01fcHJldik7CisgICAgICBfX3RtcCA9IF9fdG1wLT5fTV9wcmV2OyAgICAgLy8gT2xkIG5leHQgbm9kZSBpcyBub3cgcHJldi4KKyAgICB9IHdoaWxlIChfX3RtcCAhPSBfX3ApOworICB9CisKKyAgdm9pZCBzb3J0KCkKKyAgeyBfU1RMUF9QUklWIF9TX3NvcnQoKnRoaXMsIGxlc3M8dmFsdWVfdHlwZT4oKSk7IH0KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIHRlbXBsYXRlIDxjbGFzcyBfUHJlZGljYXRlPgorICB2b2lkIHJlbW92ZV9pZihfUHJlZGljYXRlIF9fcHJlZCkKKyAgeyBfU1RMUF9QUklWIF9TX3JlbW92ZV9pZigqdGhpcywgX19wcmVkKTsgfQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0JpbmFyeVByZWRpY2F0ZT4KKyAgdm9pZCB1bmlxdWUoX0JpbmFyeVByZWRpY2F0ZSBfX2JpbmFyeV9wcmVkKQorICB7IF9TVExQX1BSSVYgX1NfdW5pcXVlKCp0aGlzLCBfX2JpbmFyeV9wcmVkKTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfU3RyaWN0V2Vha09yZGVyaW5nPgorICB2b2lkIG1lcmdlKF9TZWxmJiBfX3gsCisgICAgICAgICAgICAgX1N0cmljdFdlYWtPcmRlcmluZyBfX2NvbXApIHsKKyAgICBfU1RMUF9QUklWIF9TX21lcmdlKCp0aGlzLCBfX3gsIF9fY29tcCk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1N0cmljdFdlYWtPcmRlcmluZz4KKyAgdm9pZCBzb3J0KF9TdHJpY3RXZWFrT3JkZXJpbmcgX19jb21wKQorICB7IF9TVExQX1BSSVYgX1Nfc29ydCgqdGhpcywgX19jb21wKTsgfQorI2VuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KK307CisKKyNpZiBkZWZpbmVkIChsaXN0KQorIyAgdW5kZWYgbGlzdAorX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisjZW5kaWYKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjaWYgIWRlZmluZWQgKF9TVExQX0xJTktfVElNRV9JTlNUQU5USUFUSU9OKQorIyAgaW5jbHVkZSA8c3RsL19saXN0LmM+CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QVFJfU1BFQ0lBTElaQVRJT05TKQorIyAgaW5jbHVkZSA8c3RsL3BvaW50ZXJzL19saXN0Lmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHKQorIyAgaW5jbHVkZSA8c3RsL2RlYnVnL19saXN0Lmg+CisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK19TVExQX0lOTElORV9MT09QIGJvb2wgIF9TVExQX0NBTEwKK29wZXJhdG9yPT0oY29uc3QgbGlzdDxfVHAsX0FsbG9jPiYgX194LCBjb25zdCBsaXN0PF9UcCxfQWxsb2M+JiBfX3kpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBsaXN0PF9UcCxfQWxsb2M+Ojpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKyAgY29uc3RfaXRlcmF0b3IgX19lbmQxID0gX194LmVuZCgpOworICBjb25zdF9pdGVyYXRvciBfX2VuZDIgPSBfX3kuZW5kKCk7CisKKyAgY29uc3RfaXRlcmF0b3IgX19pMSA9IF9feC5iZWdpbigpOworICBjb25zdF9pdGVyYXRvciBfX2kyID0gX195LmJlZ2luKCk7CisgIHdoaWxlIChfX2kxICE9IF9fZW5kMSAmJiBfX2kyICE9IF9fZW5kMiAmJiAqX19pMSA9PSAqX19pMikgeworICAgICsrX19pMTsKKyAgICArK19faTI7CisgIH0KKyAgcmV0dXJuIF9faTEgPT0gX19lbmQxICYmIF9faTIgPT0gX19lbmQyOworfQorCisjZGVmaW5lIF9TVExQX0VRVUFMX09QRVJBVE9SX1NQRUNJQUxJWkVECisjZGVmaW5lIF9TVExQX1RFTVBMQVRFX0hFQURFUiAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CisjZGVmaW5lIF9TVExQX1RFTVBMQVRFX0NPTlRBSU5FUiBsaXN0PF9UcCwgX0FsbG9jPgorI2luY2x1ZGUgPHN0bC9fcmVsb3BzX2NvbnQuaD4KKyN1bmRlZiBfU1RMUF9URU1QTEFURV9DT05UQUlORVIKKyN1bmRlZiBfU1RMUF9URU1QTEFURV9IRUFERVIKKyN1bmRlZiBfU1RMUF9FUVVBTF9PUEVSQVRPUl9TUEVDSUFMSVpFRAorCisjaWYgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikgJiYgIWRlZmluZWQgKF9TVExQX05PX01PVkVfU0VNQU5USUMpCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CitzdHJ1Y3QgX19tb3ZlX3RyYWl0czxsaXN0PF9UcCwgX0FsbG9jPiA+IHsKKyAgdHlwZWRlZiBfX3RydWVfdHlwZSBpbXBsZW1lbnRlZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX21vdmVfdHJhaXRzPF9BbGxvYz46OmNvbXBsZXRlIGNvbXBsZXRlOworfTsKKyNlbmRpZgorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9MSVNUX0lNUExfSCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdGwvX2xvY2FsZS5oIGIvc3RscG9ydC9zdGwvX2xvY2FsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNmQ1MzcKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9fbG9jYWxlLmgKQEAgLTAsMCArMSwzNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisvLyBXQVJOSU5HOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBDKysKKy8vIHN0YW5kYXJkIGxpYnJhcnkgaGVhZGVycy4gIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIHRoaXMgaGVhZGVyCisvLyBmaWxlIGRpcmVjdGx5LgorCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfTE9DQUxFX0gKKyNkZWZpbmUgX1NUTFBfSU5URVJOQUxfTE9DQUxFX0gKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DU1RETElCCisjICBpbmNsdWRlIDxzdGwvX2NzdGRsaWIuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NXQ0hBUgorIyAgaW5jbHVkZSA8c3RsL19jd2NoYXIuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX1RIUkVBRFNfSAorIyAgaW5jbHVkZSA8c3RsL190aHJlYWRzLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9TVFJJTkdfRldEX0gKKyMgIGluY2x1ZGUgPHN0bC9fc3RyaW5nX2Z3ZC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGwvX2ZhY2V0c19md2QuaD4KKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKK2NsYXNzIF9Mb2NhbGVfaW1wbDsgICAgICAgIC8vIEZvcndhcmQgZGVjbGFyYXRpb24gb2Ygb3BhcXVlIHR5cGUuCitjbGFzcyBsb2NhbGU7CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK2Jvb2wgX19sb2NhbGVfZG9fb3BlcmF0b3JfY2FsbChjb25zdCBsb2NhbGUmIF9fbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX3kpOworCitfU1RMUF9ERUNMU1BFQyBfTG9jYWxlX2ltcGwgKiBfU1RMUF9DQUxMIF9nZXRfTG9jYWxlX2ltcGwoIF9Mb2NhbGVfaW1wbCAqbG9jaW1wbCApOworX1NUTFBfREVDTFNQRUMgX0xvY2FsZV9pbXBsICogX1NUTFBfQ0FMTCBfY29weV9OYW1lbGVzc19Mb2NhbGVfaW1wbCggX0xvY2FsZV9pbXBsICpsb2NpbXBsICk7CisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9GYWNldD4KK2Jvb2wgX0hhc0ZhY2V0KGNvbnN0IGxvY2FsZSYgX19sb2MsIGNvbnN0IF9GYWNldCogX19mYWNldCkgX1NUTFBfTk9USFJPVzsKKwordGVtcGxhdGUgPGNsYXNzIF9GYWNldD4KK19GYWNldCogX1VzZUZhY2V0KGNvbnN0IGxvY2FsZSYgX19sb2MsIGNvbnN0IF9GYWNldCogX19mYWNldCk7CisKK3RlbXBsYXRlIDxjbGFzcyBfRmFjZXQ+Cit2b2lkIF9JbnNlcnRGYWNldChsb2NhbGUmIF9fbG9jLCBfRmFjZXQqIF9fZmFjZXQpOworCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9NU1ZDNl9NRU1fVF9CVUdfV09SS0FST1VORCkgfHwgXAorICAgIGRlZmluZWQgKF9TVExQX1NJR05BTF9SVU5USU1FX0NPTVBBVElCSUxJVFkpIHx8IGRlZmluZWQgKF9TVExQX0NIRUNLX1JVTlRJTUVfQ09NUEFUSUJJTElUWSkKKyMgIGRlZmluZSBsb2NhbGUgX1NUTFBfTk9fTUVNX1RfTkFNRShsb2MpCisjZW5kaWYKKworY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgbG9jYWxlIHsKK3B1YmxpYzoKKyAgLy8gdHlwZXM6CisgIGNsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIGZhY2V0IDogcHJvdGVjdGVkIF9SZWZjb3VudF9CYXNlIHsKKyAgcHJvdGVjdGVkOgorICAgIC8qIEhlcmUgd2UgZmlsdGVyIF9faW5pdF9jb3VudCB1c2VyIHZhbHVlIHRvIDAgb3IgMSBiZWNhdXNlIF9faW5pdF9jb3VudCBpcyBhCisgICAgICogc2l6ZV90IGluc3RhbmNlIGFuZCBfUmVmY291bnRfQmFzZSB1c2UgX19zdGxfYXRvbWljX3QgaW5zdGFuY2VzIHRoYXQgbWlnaHQKKyAgICAgKiBoYXZlIGxvd2VyIHNpemVvZiBhbmQgZ2VuZXJhdGUgcm9sbCBpc3N1ZXMuIDEgaXMgZW5vdWdoIHRvIGtlZXAgdGhlIGZhY2V0CisgICAgICogYWxpdmUgd2hlbiByZXF1aXJlZC4gKi8KKyAgICBleHBsaWNpdCBmYWNldChzaXplX3QgX19pbml0X2NvdW50ID0gMCkgOiBfUmVmY291bnRfQmFzZSggX19pbml0X2NvdW50ID09IDAgPyAwIDogMSApIHt9CisgICAgdmlydHVhbCB+ZmFjZXQoKTsKKyAgICBmcmllbmQgY2xhc3MgbG9jYWxlOworICAgIGZyaWVuZCBjbGFzcyBfTG9jYWxlX2ltcGw7CisgICAgZnJpZW5kIGZhY2V0ICogX1NUTFBfQ0FMTCBfZ2V0X2ZhY2V0KCBmYWNldCAqICk7CisgICAgZnJpZW5kIHZvaWQgX1NUTFBfQ0FMTCBfcmVsZWFzZV9mYWNldCggZmFjZXQgKiYgKTsKKworICBwcml2YXRlOiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludmFsaWRhdGUgYXNzaWdubWVudCBhbmQgY29weWluZy4KKyAgICBmYWNldChjb25zdCBmYWNldCYgKSAvKiA6IF9SZWZjb3VudF9CYXNlKDEpIHt9ICovOworICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IGZhY2V0Jik7CisgIH07CisKKyNpZiBkZWZpbmVkIChfX01WU19fKSB8fCBkZWZpbmVkIChfX09TNDAwX18pCisgIHN0cnVjdAorI2Vsc2UKKyAgY2xhc3MKKyNlbmRpZgorICBfU1RMUF9DTEFTU19ERUNMU1BFQyBpZCB7CisgIHB1YmxpYzoKKyAgICBzaXplX3QgX01faW5kZXg7CisgICAgc3RhdGljIHNpemVfdCBfU19tYXg7CisgIH07CisKKyAgdHlwZWRlZiBpbnQgY2F0ZWdvcnk7CisgIF9TVExQX1NUQVRJQ19DT05TVEFOVChjYXRlZ29yeSwgbm9uZSA9IDB4MDAwKTsKKyAgX1NUTFBfU1RBVElDX0NPTlNUQU5UKGNhdGVnb3J5LCBjb2xsYXRlID0gMHgwMTApOworICBfU1RMUF9TVEFUSUNfQ09OU1RBTlQoY2F0ZWdvcnksIGN0eXBlID0gMHgwMjApOworICBfU1RMUF9TVEFUSUNfQ09OU1RBTlQoY2F0ZWdvcnksIG1vbmV0YXJ5ID0gMHgwNDApOworICBfU1RMUF9TVEFUSUNfQ09OU1RBTlQoY2F0ZWdvcnksIG51bWVyaWMgPSAweDEwMCk7CisgIF9TVExQX1NUQVRJQ19DT05TVEFOVChjYXRlZ29yeSwgdGltZSA9IDB4MjAwKTsKKyAgX1NUTFBfU1RBVElDX0NPTlNUQU5UKGNhdGVnb3J5LCBtZXNzYWdlcyA9IDB4NDAwKTsKKyAgX1NUTFBfU1RBVElDX0NPTlNUQU5UKGNhdGVnb3J5LCBhbGwgPSBjb2xsYXRlIHwgY3R5cGUgfCBtb25ldGFyeSB8IG51bWVyaWMgfCB0aW1lIHwgbWVzc2FnZXMpOworCisgIC8vIGNvbnN0cnVjdC9jb3B5L2Rlc3Ryb3k6CisgIGxvY2FsZSgpIF9TVExQX05PVEhST1c7CisgIGxvY2FsZShjb25zdCBsb2NhbGUmKSBfU1RMUF9OT1RIUk9XOworICBleHBsaWNpdCBsb2NhbGUoY29uc3QgY2hhciAqKTsKKyAgbG9jYWxlKGNvbnN0IGxvY2FsZSYsIGNvbnN0IGNoYXIqLCBjYXRlZ29yeSk7CisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKSAmJiAhZGVmaW5lZCAoX1NUTFBfVVNFX01TVkM2X01FTV9UX0JVR19XT1JLQVJPVU5EKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZhY2V0PgorICBsb2NhbGUoY29uc3QgbG9jYWxlJiBfX2xvYywgX0ZhY2V0KiBfX2YpIHsKKyAgICBpZiAoIF9fZiAhPSAwICkgeworICAgICAgdGhpcy0+X01faW1wbCA9IF9nZXRfTG9jYWxlX2ltcGwoIF9jb3B5X05hbWVsZXNzX0xvY2FsZV9pbXBsKCBfX2xvYy5fTV9pbXBsICkgKTsKKyAgICAgIF9TVExQX1BSSVYgX0luc2VydEZhY2V0KCp0aGlzLCBfX2YpOworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLT5fTV9pbXBsID0gX2dldF9Mb2NhbGVfaW1wbCggX19sb2MuX01faW1wbCApOworICAgIH0KKyAgfQorI2VuZGlmCisKK3Byb3RlY3RlZDoKKyAgLy8gdGhvc2UgYXJlIGZvciBpbnRlcm5hbCB1c2UKKyAgbG9jYWxlKF9Mb2NhbGVfaW1wbCopOworCitwdWJsaWM6CisgIGxvY2FsZShjb25zdCBsb2NhbGUmLCBjb25zdCBsb2NhbGUmLCBjYXRlZ29yeSk7CisgIGNvbnN0IGxvY2FsZSYgb3BlcmF0b3I9KGNvbnN0IGxvY2FsZSYpIF9TVExQX05PVEhST1c7CisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfTVNWQzZfTUVNX1RfQlVHX1dPUktBUk9VTkQpCitwcm90ZWN0ZWQ6CisjZW5kaWYKKyAgIH5sb2NhbGUoKSBfU1RMUF9OT1RIUk9XOworCitwdWJsaWM6CisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykgJiYgIWRlZmluZWQgKF9TVExQX05PX0VYUExJQ0lUX0ZVTkNUSU9OX1RNUExfQVJHUykgJiYgXAorICAgIWRlZmluZWQoX1NUTFBfVVNFX01TVkM2X01FTV9UX0JVR19XT1JLQVJPVU5EKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZhY2V0PgorICBsb2NhbGUgY29tYmluZShjb25zdCBsb2NhbGUmIF9fbG9jKSBjb25zdCB7CisgICAgX0ZhY2V0ICpfX2ZhY2V0ID0gMDsKKyAgICBpZiAoIV9TVExQX1BSSVYgX0hhc0ZhY2V0KF9fbG9jLCBfX2ZhY2V0KSkKKyAgICAgIF9NX3Rocm93X29uX2NvbWJpbmVfZXJyb3IoX19sb2MubmFtZSgpKTsKKworICAgIHJldHVybiBsb2NhbGUoKnRoaXMsIF9TVExQX1BSSVYgX1VzZUZhY2V0KF9fbG9jLCBfX2ZhY2V0KSk7CisgIH0KKyNlbmRpZgorCisgIC8vIGxvY2FsZSBvcGVyYXRpb25zOgorICBzdHJpbmcgbmFtZSgpIGNvbnN0OworCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBsb2NhbGUmKSBjb25zdDsKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGxvY2FsZSYpIGNvbnN0OworCisjaWYgIWRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpIHx8IGRlZmluZWQgKF9TVExQX0lOTElORV9NRU1CRVJfVEVNUExBVEVTKSB8fCAoZGVmaW5lZChfX01XRVJLU19fKSAmJiBfX01XRVJLU19fIDw9IDB4MjMwMSkKKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IHN0cmluZyYgX194LCBjb25zdCBzdHJpbmcmIF9feSkgY29uc3Q7CisjICBpZm5kZWYgX1NUTFBfTk9fV0NIQVJfVAorICBib29sIG9wZXJhdG9yKCkoY29uc3Qgd3N0cmluZyYgX194LCBjb25zdCB3c3RyaW5nJiBfX3kpIGNvbnN0OworIyAgZW5kaWYKKyNlbGlmICFkZWZpbmVkIChfU1RMUF9VU0VfTVNWQzZfTUVNX1RfQlVHX1dPUktBUk9VTkQpCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9feCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9feSkgY29uc3QKKyAgeyByZXR1cm4gX19sb2NhbGVfZG9fb3BlcmF0b3JfY2FsbCgqdGhpcywgX194LCBfX3kpOyB9CisjZW5kaWYKKworICAvLyBnbG9iYWwgbG9jYWxlIG9iamVjdHM6CisjaWYgIWRlZmluZWQgKF9TVExQX1VTRV9NU1ZDNl9NRU1fVF9CVUdfV09SS0FST1VORCkKKyAgc3RhdGljIGxvY2FsZSBfU1RMUF9DQUxMIGdsb2JhbChjb25zdCBsb2NhbGUmKTsKKyNlbHNlCisgIHN0YXRpYyBfTG9jYWxlX2ltcGwqIF9TVExQX0NBTEwgZ2xvYmFsKGNvbnN0IGxvY2FsZSYpOworI2VuZGlmCisgIHN0YXRpYyBjb25zdCBsb2NhbGUmIF9TVExQX0NBTEwgY2xhc3NpYygpOworCisvL3Byb3RlY3RlZDogICAgICAgICAgICAgICAgICAgICAgICAgLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgbG9jYWxlIGdsb2JhbHMuCisgIGZhY2V0KiBfTV9nZXRfZmFjZXQoY29uc3QgaWQmKSBjb25zdDsKKyAgLy8gc2FtZSwgYnV0IHRocm93cworICBmYWNldCogX01fdXNlX2ZhY2V0KGNvbnN0IGlkJikgY29uc3Q7CisgIHN0YXRpYyB2b2lkIF9TVExQX0ZVTkNUSU9OX1RIUk9XUyBfU1RMUF9DQUxMIF9NX3Rocm93X29uX2NvbWJpbmVfZXJyb3IoY29uc3Qgc3RyaW5nJiBuYW1lKTsKKyAgc3RhdGljIHZvaWQgX1NUTFBfRlVOQ1RJT05fVEhST1dTIF9TVExQX0NBTEwgX01fdGhyb3dfb25fbnVsbF9uYW1lKCk7CisgIHN0YXRpYyB2b2lkIF9TVExQX0ZVTkNUSU9OX1RIUk9XUyBfU1RMUF9DQUxMIF9NX3Rocm93X29uX2NyZWF0aW9uX2ZhaWx1cmUoaW50IF9fZXJyX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogZmFjZXQpOworCisvL3Byb3RlY3RlZDogICAgICAgICAgICAgICAgICAgICAgICAvLyBNb3JlIGhlbHBlciBmdW5jdGlvbnMuCisgIHZvaWQgX01faW5zZXJ0KGZhY2V0KiBfX2YsIGlkJiBfX2lkKTsKKworICAvLyBmcmllbmRzOgorICBmcmllbmQgY2xhc3MgX0xvY2FsZV9pbXBsOworCitwcm90ZWN0ZWQ6ICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGF0YSBtZW1iZXJzCisgIF9Mb2NhbGVfaW1wbCogX01faW1wbDsKKyAgX0xvY2FsZV9pbXBsKiBfTV9nZXRfaW1wbCgpIGNvbnN0IHsgcmV0dXJuIF9NX2ltcGw7IH0KK307CisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfTVNWQzZfTUVNX1RfQlVHX1dPUktBUk9VTkQpIHx8IFwKKyAgICBkZWZpbmVkIChfU1RMUF9TSUdOQUxfUlVOVElNRV9DT01QQVRJQklMSVRZKSB8fCBkZWZpbmVkIChfU1RMUF9DSEVDS19SVU5USU1FX0NPTVBBVElCSUxJVFkpCisjICB1bmRlZiBsb2NhbGUKKyMgIGRlZmluZSBfTG9jYWxlIF9TVExQX05PX01FTV9UX05BTUUobG9jKQorCitjbGFzcyBsb2NhbGUgOiBwdWJsaWMgX0xvY2FsZSB7CitwdWJsaWM6CisKKyAgLy8gY29uc3RydWN0L2NvcHkvZGVzdHJveToKKyAgbG9jYWxlKCkgX1NUTFBfTk9USFJPVyB7CisjaWYgZGVmaW5lZCAoX1NUTFBfQ0hFQ0tfUlVOVElNRV9DT01QQVRJQklMSVRZKQorICAgIF9TVExQX0NIRUNLX1JVTlRJTUVfQ09NUEFUSUJJTElUWSgpOworI2VuZGlmCisgIH0KKyAgbG9jYWxlKGNvbnN0IGxvY2FsZSYgX19sb2MpIF9TVExQX05PVEhST1cgOiBfTG9jYWxlKF9fbG9jKSB7fQorICBleHBsaWNpdCBsb2NhbGUoY29uc3QgY2hhciAqX19zdHIpIDogX0xvY2FsZShfX3N0cikge30KKyAgbG9jYWxlKGNvbnN0IGxvY2FsZSYgX19sb2MsIGNvbnN0IGNoYXIqIF9fc3RyLCBjYXRlZ29yeSBfX2NhdCkKKyAgICA6IF9Mb2NhbGUoX19sb2MsIF9fc3RyLCBfX2NhdCkge30KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZhY2V0PgorICBsb2NhbGUoY29uc3QgbG9jYWxlJiBfX2xvYywgX0ZhY2V0KiBfX2YpIAorICAgIDogX0xvY2FsZShfX2YgIT0gMCA/IF9jb3B5X05hbWVsZXNzX0xvY2FsZV9pbXBsKF9fbG9jLl9NX2ltcGwpIDogX19sb2MuX01faW1wbCkgeworICAgIGlmICggX19mICE9IDAgKSB7CisgICAgICBfU1RMUF9QUklWIF9JbnNlcnRGYWNldCgqdGhpcywgX19mKTsKKyAgICB9CisgIH0KKworcHJpdmF0ZToKKyAgLy8gdGhvc2UgYXJlIGZvciBpbnRlcm5hbCB1c2UKKyAgbG9jYWxlKF9Mb2NhbGVfaW1wbCogX19pbXBsKSA6IF9Mb2NhbGUoX19pbXBsKSB7fQorICBsb2NhbGUoY29uc3QgX0xvY2FsZSYgX19sb2MpIDogX0xvY2FsZShfX2xvYykge30KKworcHVibGljOgorCisgIGxvY2FsZShjb25zdCBsb2NhbGUmIF9fbG9jMSwgY29uc3QgbG9jYWxlJiBfX2xvYzIsIGNhdGVnb3J5IF9fY2F0KQorICAgIDogX0xvY2FsZShfX2xvYzEsIF9fbG9jMiwgX19jYXQpIHt9CisKKyAgY29uc3QgbG9jYWxlJiBvcGVyYXRvcj0oY29uc3QgbG9jYWxlJiBfX2xvYykgX1NUTFBfTk9USFJPVyB7CisgICAgX0xvY2FsZTo6b3BlcmF0b3I9KF9fbG9jKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZhY2V0PgorICBsb2NhbGUgY29tYmluZShjb25zdCBsb2NhbGUmIF9fbG9jKSBjb25zdCB7CisgICAgX0ZhY2V0ICpfX2ZhY2V0ID0gMDsKKyAgICBpZiAoIV9TVExQX1BSSVYgX0hhc0ZhY2V0KF9fbG9jLCBfX2ZhY2V0KSkKKyAgICAgIF9NX3Rocm93X29uX2NvbWJpbmVfZXJyb3IoX19sb2MubmFtZSgpKTsKKworICAgIHJldHVybiBsb2NhbGUoKnRoaXMsIF9TVExQX1BSSVYgX1VzZUZhY2V0KF9fbG9jLCBfX2ZhY2V0KSk7CisgIH0KKworICAvLyBsb2NhbGUgb3BlcmF0aW9uczoKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGxvY2FsZSYgX19sb2MpIGNvbnN0IHsgcmV0dXJuIF9Mb2NhbGU6Om9wZXJhdG9yPT0oX19sb2MpOyB9CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBsb2NhbGUmIF9fbG9jKSBjb25zdCB7IHJldHVybiBfTG9jYWxlOjpvcGVyYXRvciE9KF9fbG9jKTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9feCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9feSkgY29uc3QKKyAgeyByZXR1cm4gX19sb2NhbGVfZG9fb3BlcmF0b3JfY2FsbCgqdGhpcywgX194LCBfX3kpOyB9CisKKyAgLy8gZ2xvYmFsIGxvY2FsZSBvYmplY3RzOgorICBzdGF0aWMgbG9jYWxlIF9TVExQX0NBTEwgZ2xvYmFsKGNvbnN0IGxvY2FsZSYgX19sb2MpIHsKKyAgICByZXR1cm4gX0xvY2FsZTo6Z2xvYmFsKF9fbG9jKTsKKyAgfQorICBzdGF0aWMgY29uc3QgbG9jYWxlJiBfU1RMUF9DQUxMIGNsYXNzaWMoKSB7CisgICAgcmV0dXJuIF9fU1RBVElDX0NBU1QoY29uc3QgbG9jYWxlJiwgX0xvY2FsZTo6Y2xhc3NpYygpKTsKKyAgfQorCisgIC8vIGZyaWVuZHM6CisgIGZyaWVuZCBjbGFzcyBfTG9jYWxlX2ltcGw7Cit9OworCisjICB1bmRlZiBfTG9jYWxlCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbGUgZ2xvYmFscworCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZhY2V0PgoraW5saW5lIGNvbnN0IF9GYWNldCYKKyNpZmRlZiBfU1RMUF9OT19FWFBMSUNJVF9GVU5DVElPTl9UTVBMX0FSR1MKK19Vc2VfZmFjZXQ8X0ZhY2V0Pjo6b3BlcmF0b3IgKigpIGNvbnN0CisjZWxzZQordXNlX2ZhY2V0KGNvbnN0IGxvY2FsZSYgX19sb2MpCisjZW5kaWYKK3sKKyAgX0ZhY2V0ICpfX2ZhY2V0ID0gMDsKKyAgcmV0dXJuICooX1NUTFBfUFJJViBfVXNlRmFjZXQoX19sb2MsIF9fZmFjZXQpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9GYWNldD4KKyNpZmRlZiBfU1RMUF9OT19FWFBMSUNJVF9GVU5DVElPTl9UTVBMX0FSR1MKK3N0cnVjdCBoYXNfZmFjZXQgeworICBjb25zdCBsb2NhbGUmIF9fbG9jOworICBoYXNfZmFjZXQoY29uc3QgbG9jYWxlJiBfX3BfbG9jKSA6IF9fbG9jKF9fcF9sb2MpIHt9CisgIG9wZXJhdG9yIGJvb2woKSBjb25zdCBfU1RMUF9OT1RIUk9XCisjZWxzZQoraW5saW5lIGJvb2wgaGFzX2ZhY2V0KGNvbnN0IGxvY2FsZSYgX19sb2MpIF9TVExQX05PVEhST1cKKyNlbmRpZgoreworICBfRmFjZXQgKl9fZmFjZXQgPSAwOworICByZXR1cm4gX1NUTFBfUFJJViBfSGFzRmFjZXQoX19sb2MsIF9fZmFjZXQpOworfQorCisjaWZkZWYgX1NUTFBfTk9fRVhQTElDSVRfRlVOQ1RJT05fVE1QTF9BUkdTCit9OyAvLyBjbG9zZSBjbGFzcyBkZWZpbml0aW9uCisjZW5kaWYKKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCisvKiBfR2V0RmFjZXRJZCBpcyBhIGhlbHBlciBmdW5jdGlvbiB0aGF0IGFsbG93IGRlbGF5aW5nIGFjY2VzcyB0bworICogZmFjZXQgaWQgc3RhdGljIGluc3RhbmNlIGluIHRoZSBsaWJyYXJ5IHNvdXJjZSBjb2RlIHRvIGF2b2lkCisgKiB0aGUgb3RoZXIgc3RhdGljIGluc3RhbmNlcyB0aGF0IG1hbnkgY29tcGlsZXJzIGFyZSBnZW5lcmF0aW5nCisgKiBpbiBhbGwgZHluYW1pYyBsaWJyYXJ5IG9yIGV4ZWN1dGFibGUgd2hlbiBpbnN0YW5jaWF0aW5nIGZhY2V0CisgKiB0ZW1wbGF0ZSBjbGFzcy4KKyAqLwordGVtcGxhdGUgPGNsYXNzIF9GYWNldD4KK2lubGluZSBsb2NhbGU6OmlkJiBfR2V0RmFjZXRJZChjb25zdCBfRmFjZXQqKQoreyByZXR1cm4gX0ZhY2V0OjppZDsgfQorCitfU1RMUF9ERUNMU1BFQyBsb2NhbGU6OmlkJiBfU1RMUF9DQUxMIF9HZXRGYWNldElkKGNvbnN0IG1vbmV5X2dldDxjaGFyLCBpc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4gPiopOworX1NUTFBfREVDTFNQRUMgbG9jYWxlOjppZCYgX1NUTFBfQ0FMTCBfR2V0RmFjZXRJZChjb25zdCBtb25leV9wdXQ8Y2hhciwgb3N0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+ID4qKTsKK19TVExQX0RFQ0xTUEVDIGxvY2FsZTo6aWQmIF9TVExQX0NBTEwgX0dldEZhY2V0SWQoY29uc3QgbnVtX2dldDxjaGFyLCBpc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4gPiopOworX1NUTFBfREVDTFNQRUMgbG9jYWxlOjppZCYgX1NUTFBfQ0FMTCBfR2V0RmFjZXRJZChjb25zdCBudW1fcHV0PGNoYXIsIG9zdHJlYW1idWZfaXRlcmF0b3I8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiA+Kik7CitfU1RMUF9ERUNMU1BFQyBsb2NhbGU6OmlkJiBfU1RMUF9DQUxMIF9HZXRGYWNldElkKGNvbnN0IHRpbWVfZ2V0PGNoYXIsIGlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiA+Kik7CitfU1RMUF9ERUNMU1BFQyBsb2NhbGU6OmlkJiBfU1RMUF9DQUxMIF9HZXRGYWNldElkKGNvbnN0IHRpbWVfcHV0PGNoYXIsIG9zdHJlYW1idWZfaXRlcmF0b3I8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiA+Kik7CisKKyNpZm5kZWYgX1NUTFBfTk9fV0NIQVJfVAorX1NUTFBfREVDTFNQRUMgbG9jYWxlOjppZCYgX1NUTFBfQ0FMTCBfR2V0RmFjZXRJZChjb25zdCBtb25leV9nZXQ8d2NoYXJfdCwgaXN0cmVhbWJ1Zl9pdGVyYXRvcjx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+ID4qKTsKK19TVExQX0RFQ0xTUEVDIGxvY2FsZTo6aWQmIF9TVExQX0NBTEwgX0dldEZhY2V0SWQoY29uc3QgbW9uZXlfcHV0PHdjaGFyX3QsIG9zdHJlYW1idWZfaXRlcmF0b3I8d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPiA+Kik7CitfU1RMUF9ERUNMU1BFQyBsb2NhbGU6OmlkJiBfU1RMUF9DQUxMIF9HZXRGYWNldElkKGNvbnN0IG51bV9nZXQ8d2NoYXJfdCwgaXN0cmVhbWJ1Zl9pdGVyYXRvcjx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+ID4qKTsKK19TVExQX0RFQ0xTUEVDIGxvY2FsZTo6aWQmIF9TVExQX0NBTEwgX0dldEZhY2V0SWQoY29uc3QgbnVtX3B1dDx3Y2hhcl90LCBvc3RyZWFtYnVmX2l0ZXJhdG9yPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4gPiopOworX1NUTFBfREVDTFNQRUMgbG9jYWxlOjppZCYgX1NUTFBfQ0FMTCBfR2V0RmFjZXRJZChjb25zdCB0aW1lX2dldDx3Y2hhcl90LCBpc3RyZWFtYnVmX2l0ZXJhdG9yPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4gPiopOworX1NUTFBfREVDTFNQRUMgbG9jYWxlOjppZCYgX1NUTFBfQ0FMTCBfR2V0RmFjZXRJZChjb25zdCB0aW1lX3B1dDx3Y2hhcl90LCBvc3RyZWFtYnVmX2l0ZXJhdG9yPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4gPiopOworI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfRmFjZXQ+CitpbmxpbmUgYm9vbCBfSGFzRmFjZXQoY29uc3QgbG9jYWxlJiBfX2xvYywgY29uc3QgX0ZhY2V0KiBfX2ZhY2V0KSBfU1RMUF9OT1RIUk9XCit7IHJldHVybiAoX19sb2MuX01fZ2V0X2ZhY2V0KF9HZXRGYWNldElkKF9fZmFjZXQpKSAhPSAwKTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZhY2V0PgoraW5saW5lIF9GYWNldCogX1VzZUZhY2V0KGNvbnN0IGxvY2FsZSYgX19sb2MsIGNvbnN0IF9GYWNldCogX19mYWNldCkKK3sgcmV0dXJuIF9fU1RBVElDX0NBU1QoX0ZhY2V0KiwgX19sb2MuX01fdXNlX2ZhY2V0KF9HZXRGYWNldElkKF9fZmFjZXQpKSk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9GYWNldD4KK2lubGluZSB2b2lkIF9JbnNlcnRGYWNldChsb2NhbGUmIF9fbG9jLCBfRmFjZXQqIF9fZmFjZXQpCit7IF9fbG9jLl9NX2luc2VydChfX2ZhY2V0LCBfR2V0RmFjZXRJZChfX2ZhY2V0KSk7IH0KKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2VuZGlmIC8qIF9TVExQX0lOVEVSTkFMX0xPQ0FMRV9IICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CisKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL19tYXAuaCBiL3N0bHBvcnQvc3RsL19tYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjQ2YTVkCi0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvX21hcC5oCkBAIC0wLDAgKzEsNDM1IEBACisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworLyogTk9URTogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgU1RMIGhlYWRlcnMuCisgKiAgIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LgorICovCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfTUFQX0gKKyNkZWZpbmUgX1NUTFBfSU5URVJOQUxfTUFQX0gKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9UUkVFX0gKKyMgIGluY2x1ZGUgPHN0bC9fdHJlZS5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisvL1NwZWNpZmljIGl0ZXJhdG9yIHRyYWl0cyBjcmVhdGlvbgorX1NUTFBfQ1JFQVRFX0lURVJBVE9SX1RSQUlUUyhNYXBUcmFpdHNULCB0cmFpdHMpCisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIF9TVExQX0RGTF9UTVBMX1BBUkFNKF9Db21wYXJlLCBsZXNzPF9LZXk+ICksCisgICAgICAgICAgX1NUTFBfREVGQVVMVF9QQUlSX0FMTE9DQVRPUl9TRUxFQ1QoX1NUTFBfQ09OU1QgX0tleSwgX1RwKSA+CitjbGFzcyBtYXAKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUEFSVElBTF9TUEVDX1dPUktBUk9VTkQpCisgICAgICAgICAgOiBwdWJsaWMgX19zdGxwb3J0X2NsYXNzPG1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2M+ID4KKyNlbmRpZgoreworICB0eXBlZGVmIG1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2M+IF9TZWxmOworcHVibGljOgorCisvLyB0eXBlZGVmczoKKworICB0eXBlZGVmIF9LZXkgICAgICAgICAgICAgICAgICBrZXlfdHlwZTsKKyAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICAgICAgZGF0YV90eXBlOworICB0eXBlZGVmIF9UcCAgICAgICAgICAgICAgICAgICBtYXBwZWRfdHlwZTsKKyAgdHlwZWRlZiBwYWlyPF9TVExQX0NPTlNUIF9LZXksIF9UcD4gdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiBfQ29tcGFyZSAgICAgICAgICAgICAga2V5X2NvbXBhcmU7CisKKyAgY2xhc3MgdmFsdWVfY29tcGFyZQorICAgIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjx2YWx1ZV90eXBlLCB2YWx1ZV90eXBlLCBib29sPiB7CisgIGZyaWVuZCBjbGFzcyBtYXA8X0tleSxfVHAsX0NvbXBhcmUsX0FsbG9jPjsKKyAgcHJvdGVjdGVkIDoKKyAgICAvL2MgaXMgYSBTdGFuZGFyZCBuYW1lICgyMy4zLjEpLCBkbyBubyBtYWtlIGl0IFNUTHBvcnQgbmFtaW5nIGNvbnZlbnRpb24gY29tcGxpYW50LgorICAgIF9Db21wYXJlIGNvbXA7CisgICAgdmFsdWVfY29tcGFyZShfQ29tcGFyZSBfX2MpIDogY29tcChfX2MpIHt9CisgIHB1YmxpYzoKKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgdmFsdWVfdHlwZSYgX194LCBjb25zdCB2YWx1ZV90eXBlJiBfX3kpIGNvbnN0CisgICAgeyByZXR1cm4gY29tcChfX3guZmlyc3QsIF9feS5maXJzdCk7IH0KKyAgfTsKKworcHJvdGVjdGVkOgorICB0eXBlZGVmIF9TVExQX1BSSVYgX01hcFRyYWl0c1Q8dmFsdWVfdHlwZT4gX01hcFRyYWl0czsKKworcHVibGljOgorICAvL0ZvbGxvd2luZyB0eXBlZGVmIGhhdmUgdG8gYmUgcHVibGljIGZvciBfX21vdmVfdHJhaXRzIHNwZWNpYWxpemF0aW9uLgorICB0eXBlZGVmIF9TVExQX1BSSVYgX1JiX3RyZWU8a2V5X3R5cGUsIGtleV9jb21wYXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZSwgX1NUTFBfU0VMRUNUMVNUKHZhbHVlX3R5cGUsIF9LZXkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01hcFRyYWl0cywgX0FsbG9jPiBfUmVwX3R5cGU7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OnBvaW50ZXIgcG9pbnRlcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OmNvbnN0X3BvaW50ZXIgY29uc3RfcG9pbnRlcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OnJlZmVyZW5jZSByZWZlcmVuY2U7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlOworICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6aXRlcmF0b3IgaXRlcmF0b3I7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OnJldmVyc2VfaXRlcmF0b3IgcmV2ZXJzZV9pdGVyYXRvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OnNpemVfdHlwZSBzaXplX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7CisKK3ByaXZhdGU6CisgIF9SZXBfdHlwZSBfTV90OyAgLy8gcmVkLWJsYWNrIHRyZWUgcmVwcmVzZW50aW5nIG1hcAorICBfU1RMUF9LRVlfVFlQRV9GT1JfQ09OVF9FWFQoa2V5X3R5cGUpCisKK3B1YmxpYzoKKyAgLy8gYWxsb2NhdGlvbi9kZWFsbG9jYXRpb24KKyAgbWFwKCkgOiBfTV90KF9Db21wYXJlKCksIGFsbG9jYXRvcl90eXBlKCkpIHt9CisjaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCisgIGV4cGxpY2l0IG1hcChjb25zdCBfQ29tcGFyZSYgX19jb21wLAorICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisjZWxzZQorICBleHBsaWNpdCBtYXAoY29uc3QgX0NvbXBhcmUmIF9fY29tcCkKKyAgICA6IF9NX3QoX19jb21wLCBhbGxvY2F0b3JfdHlwZSgpKSB7fQorICBleHBsaWNpdCBtYXAoY29uc3QgX0NvbXBhcmUmIF9fY29tcCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyNlbmRpZgorICAgIDogX01fdChfX2NvbXAsIF9fYSkge30KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICA6IF9NX3QoX0NvbXBhcmUoKSwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICB7IF9NX3QuaW5zZXJ0X3VuaXF1ZShfX2ZpcnN0LCBfX2xhc3QpOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICBtYXAoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LCBjb25zdCBfQ29tcGFyZSYgX19jb21wLAorICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSBfU1RMUF9BTExPQ0FUT1JfVFlQRV9ERkwpCisgICAgOiBfTV90KF9fY29tcCwgX19hKSB7IF9NX3QuaW5zZXJ0X3VuaXF1ZShfX2ZpcnN0LCBfX2xhc3QpOyB9CisKKyMgIGlmIGRlZmluZWQgKF9TVExQX05FRURTX0VYVFJBX1RFTVBMQVRFX0NPTlNUUlVDVE9SUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICBtYXAoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LCBjb25zdCBfQ29tcGFyZSYgX19jb21wKQorICAgIDogX01fdChfX2NvbXAsIGFsbG9jYXRvcl90eXBlKCkpIHsgX01fdC5pbnNlcnRfdW5pcXVlKF9fZmlyc3QsIF9fbGFzdCk7IH0KKyMgIGVuZGlmCisKKyNlbHNlCisgIG1hcChjb25zdCB2YWx1ZV90eXBlKiBfX2ZpcnN0LCBjb25zdCB2YWx1ZV90eXBlKiBfX2xhc3QpCisgICAgOiBfTV90KF9Db21wYXJlKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgeyBfTV90Lmluc2VydF91bmlxdWUoX19maXJzdCwgX19sYXN0KTsgfQorCisgIG1hcChjb25zdCB2YWx1ZV90eXBlKiBfX2ZpcnN0LAorICAgICAgY29uc3QgdmFsdWVfdHlwZSogX19sYXN0LCBjb25zdCBfQ29tcGFyZSYgX19jb21wLAorICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfTV90KF9fY29tcCwgX19hKSB7IF9NX3QuaW5zZXJ0X3VuaXF1ZShfX2ZpcnN0LCBfX2xhc3QpOyB9CisKKyAgbWFwKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKKyAgICA6IF9NX3QoX0NvbXBhcmUoKSwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICB7IF9NX3QuaW5zZXJ0X3VuaXF1ZShfX2ZpcnN0LCBfX2xhc3QpOyB9CisKKyAgbWFwKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCwgY29uc3QgX0NvbXBhcmUmIF9fY29tcCwKKyAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX01fdChfX2NvbXAsIF9fYSkgeyBfTV90Lmluc2VydF91bmlxdWUoX19maXJzdCwgX19sYXN0KTsgfQorI2VuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKworICBtYXAoY29uc3QgX1NlbGYmIF9feCkgOiBfTV90KF9feC5fTV90KSB7fQorCisjaWYgIWRlZmluZWQgKF9TVExQX05PX01PVkVfU0VNQU5USUMpCisgIG1hcChfX21vdmVfc291cmNlPF9TZWxmPiBzcmMpCisgICAgOiBfTV90KF9fbW92ZV9zb3VyY2U8X1JlcF90eXBlPihzcmMuZ2V0KCkuX01fdCkpIHt9CisjZW5kaWYKKworICBfU2VsZiYgb3BlcmF0b3I9KGNvbnN0IF9TZWxmJiBfX3gpIHsKKyAgICBfTV90ID0gX194Ll9NX3Q7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8gYWNjZXNzb3JzOgorICBrZXlfY29tcGFyZSBrZXlfY29tcCgpIGNvbnN0IHsgcmV0dXJuIF9NX3Qua2V5X2NvbXAoKTsgfQorICB2YWx1ZV9jb21wYXJlIHZhbHVlX2NvbXAoKSBjb25zdCB7IHJldHVybiB2YWx1ZV9jb21wYXJlKF9NX3Qua2V5X2NvbXAoKSk7IH0KKyAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IHsgcmV0dXJuIF9NX3QuZ2V0X2FsbG9jYXRvcigpOyB9CisKKyAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBfTV90LmJlZ2luKCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBfTV90LmJlZ2luKCk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gX01fdC5lbmQoKTsgfQorICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBfTV90LmVuZCgpOyB9CisgIHJldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgeyByZXR1cm4gX01fdC5yYmVnaW4oKTsgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0IHsgcmV0dXJuIF9NX3QucmJlZ2luKCk7IH0KKyAgcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgeyByZXR1cm4gX01fdC5yZW5kKCk7IH0KKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgY29uc3QgeyByZXR1cm4gX01fdC5yZW5kKCk7IH0KKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIF9NX3QuZW1wdHkoKTsgfQorICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX3Quc2l6ZSgpOyB9CisgIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX3QubWF4X3NpemUoKTsgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgX1RwJiBvcGVyYXRvcltdKGNvbnN0IF9LVCYgX19rKSB7CisgICAgaXRlcmF0b3IgX19pID0gbG93ZXJfYm91bmQoX19rKTsKKyAgICAvLyBfX2ktPmZpcnN0IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVpdmFsZW50IHRvIF9fay4KKyAgICBpZiAoX19pID09IGVuZCgpIHx8IGtleV9jb21wKCkoX19rLCAoKl9faSkuZmlyc3QpKQorICAgICAgX19pID0gaW5zZXJ0KF9faSwgdmFsdWVfdHlwZShfX2ssIF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQoX1RwKSkpOworICAgIHJldHVybiAoKl9faSkuc2Vjb25kOworICB9CisgIHZvaWQgc3dhcChfU2VsZiYgX194KSB7IF9NX3Quc3dhcChfX3guX01fdCk7IH0KKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUEFSVElBTF9TUEVDX1dPUktBUk9VTkQpICYmICFkZWZpbmVkIChfU1RMUF9GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIpCisgIHZvaWQgX01fc3dhcF93b3JrYXJvdW5kKF9TZWxmJiBfX3gpIHsgc3dhcChfX3gpOyB9CisjZW5kaWYKKworICAvLyBpbnNlcnQvZXJhc2UKKyAgcGFpcjxpdGVyYXRvcixib29sPiBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX194KQorICB7IHJldHVybiBfTV90Lmluc2VydF91bmlxdWUoX194KTsgfQorICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgeyByZXR1cm4gX01fdC5pbnNlcnRfdW5pcXVlKF9fcG9zLCBfX3gpOyB9CisjaWZkZWYgX1NUTFBfTUVNQkVSX1RFTVBMQVRFUworICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZvaWQgaW5zZXJ0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgeyBfTV90Lmluc2VydF91bmlxdWUoX19maXJzdCwgX19sYXN0KTsgfQorI2Vsc2UKKyAgdm9pZCBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSogX19maXJzdCwgY29uc3QgdmFsdWVfdHlwZSogX19sYXN0KQorICB7IF9NX3QuaW5zZXJ0X3VuaXF1ZShfX2ZpcnN0LCBfX2xhc3QpOyB9CisgIHZvaWQgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKKyAgeyBfTV90Lmluc2VydF91bmlxdWUoX19maXJzdCwgX19sYXN0KTsgfQorI2VuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKworICB2b2lkIGVyYXNlKGl0ZXJhdG9yIF9fcG9zKSB7IF9NX3QuZXJhc2UoX19wb3MpOyB9CisgIHNpemVfdHlwZSBlcmFzZShjb25zdCBrZXlfdHlwZSYgX194KSB7IHJldHVybiBfTV90LmVyYXNlX3VuaXF1ZShfX3gpOyB9CisgIHZvaWQgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KSB7IF9NX3QuZXJhc2UoX19maXJzdCwgX19sYXN0KTsgfQorICB2b2lkIGNsZWFyKCkgeyBfTV90LmNsZWFyKCk7IH0KKworICAvLyBtYXAgb3BlcmF0aW9uczoKKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIGl0ZXJhdG9yIGZpbmQoY29uc3QgX0tUJiBfX3gpIHsgcmV0dXJuIF9NX3QuZmluZChfX3gpOyB9CisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBjb25zdF9pdGVyYXRvciBmaW5kKGNvbnN0IF9LVCYgX194KSBjb25zdCB7IHJldHVybiBfTV90LmZpbmQoX194KTsgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgc2l6ZV90eXBlIGNvdW50KGNvbnN0IF9LVCYgX194KSBjb25zdCB7IHJldHVybiBfTV90LmZpbmQoX194KSA9PSBfTV90LmVuZCgpID8gMCA6IDE7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIGl0ZXJhdG9yIGxvd2VyX2JvdW5kKGNvbnN0IF9LVCYgX194KSB7IHJldHVybiBfTV90Lmxvd2VyX2JvdW5kKF9feCk7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIGNvbnN0X2l0ZXJhdG9yIGxvd2VyX2JvdW5kKGNvbnN0IF9LVCYgX194KSBjb25zdCB7IHJldHVybiBfTV90Lmxvd2VyX2JvdW5kKF9feCk7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIGl0ZXJhdG9yIHVwcGVyX2JvdW5kKGNvbnN0IF9LVCYgX194KSB7IHJldHVybiBfTV90LnVwcGVyX2JvdW5kKF9feCk7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIGNvbnN0X2l0ZXJhdG9yIHVwcGVyX2JvdW5kKGNvbnN0IF9LVCYgX194KSBjb25zdCB7IHJldHVybiBfTV90LnVwcGVyX2JvdW5kKF9feCk7IH0KKworICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgcGFpcjxpdGVyYXRvcixpdGVyYXRvcj4gZXF1YWxfcmFuZ2UoY29uc3QgX0tUJiBfX3gpCisgIHsgcmV0dXJuIF9NX3QuZXF1YWxfcmFuZ2VfdW5pcXVlKF9feCk7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIHBhaXI8Y29uc3RfaXRlcmF0b3IsY29uc3RfaXRlcmF0b3I+IGVxdWFsX3JhbmdlKGNvbnN0IF9LVCYgX194KSBjb25zdAorICB7IHJldHVybiBfTV90LmVxdWFsX3JhbmdlX3VuaXF1ZShfX3gpOyB9Cit9OworCisvL1NwZWNpZmljIGl0ZXJhdG9yIHRyYWl0cyBjcmVhdGlvbgorX1NUTFBfQ1JFQVRFX0lURVJBVE9SX1RSQUlUUyhNdWx0aW1hcFRyYWl0c1QsIHRyYWl0cykKKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgX1NUTFBfREZMX1RNUExfUEFSQU0oX0NvbXBhcmUsIGxlc3M8X0tleT4gKSwKKyAgICAgICAgICBfU1RMUF9ERUZBVUxUX1BBSVJfQUxMT0NBVE9SX1NFTEVDVChfU1RMUF9DT05TVCBfS2V5LCBfVHApID4KK2NsYXNzIG11bHRpbWFwCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKQorICAgICAgICAgICAgICAgOiBwdWJsaWMgX19zdGxwb3J0X2NsYXNzPG11bHRpbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvYz4gPgorI2VuZGlmCit7CisgIHR5cGVkZWYgbXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jPiBfU2VsZjsKK3B1YmxpYzoKKworLy8gdHlwZWRlZnM6CisKKyAgdHlwZWRlZiBfS2V5ICAgICAgICAgICAgICAgICAga2V5X3R5cGU7CisgIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAgICAgIGRhdGFfdHlwZTsKKyAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICAgICAgbWFwcGVkX3R5cGU7CisgIHR5cGVkZWYgcGFpcjxfU1RMUF9DT05TVCBfS2V5LCBfVHA+IHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgX0NvbXBhcmUgICAgICAgICAgICAgIGtleV9jb21wYXJlOworCisgIGNsYXNzIHZhbHVlX2NvbXBhcmUgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPHZhbHVlX3R5cGUsIHZhbHVlX3R5cGUsIGJvb2w+IHsKKyAgICBmcmllbmQgY2xhc3MgbXVsdGltYXA8X0tleSxfVHAsX0NvbXBhcmUsX0FsbG9jPjsKKyAgcHJvdGVjdGVkOgorICAgIC8vY29tcCBpcyBhIFN0YW5kYXJkIG5hbWUgKDIzLjMuMiksIGRvIG5vIG1ha2UgaXQgU1RMcG9ydCBuYW1pbmcgY29udmVudGlvbiBjb21wbGlhbnQuCisgICAgX0NvbXBhcmUgY29tcDsKKyAgICB2YWx1ZV9jb21wYXJlKF9Db21wYXJlIF9fYykgOiBjb21wKF9fYykge30KKyAgcHVibGljOgorICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCB2YWx1ZV90eXBlJiBfX3gsIGNvbnN0IHZhbHVlX3R5cGUmIF9feSkgY29uc3QKKyAgICB7IHJldHVybiBjb21wKF9feC5maXJzdCwgX195LmZpcnN0KTsgfQorICB9OworCitwcm90ZWN0ZWQ6CisgIC8vU3BlY2lmaWMgaXRlcmF0b3IgdHJhaXRzIGNyZWF0aW9uCisgIHR5cGVkZWYgX1NUTFBfUFJJViBfTXVsdGltYXBUcmFpdHNUPHZhbHVlX3R5cGU+IF9NdWx0aW1hcFRyYWl0czsKKworcHVibGljOgorICAvL0ZvbGxvd2luZyB0eXBlZGVmIGhhdmUgdG8gYmUgcHVibGljIGZvciBfX21vdmVfdHJhaXRzIHNwZWNpYWxpemF0aW9uLgorICB0eXBlZGVmIF9TVExQX1BSSVYgX1JiX3RyZWU8a2V5X3R5cGUsIGtleV9jb21wYXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZSwgX1NUTFBfU0VMRUNUMVNUKHZhbHVlX3R5cGUsIF9LZXkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX011bHRpbWFwVHJhaXRzLCBfQWxsb2M+IF9SZXBfdHlwZTsKKworICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6cG9pbnRlciBwb2ludGVyOworICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6Y29uc3RfcG9pbnRlciBjb25zdF9wb2ludGVyOworICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6cmVmZXJlbmNlIHJlZmVyZW5jZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9yZWZlcmVuY2U7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjppdGVyYXRvciBpdGVyYXRvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOworICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6cmV2ZXJzZV9pdGVyYXRvciByZXZlcnNlX2l0ZXJhdG9yOworICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6c2l6ZV90eXBlIHNpemVfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKKworcHJpdmF0ZToKKyAgX1JlcF90eXBlIF9NX3Q7ICAvLyByZWQtYmxhY2sgdHJlZSByZXByZXNlbnRpbmcgbXVsdGltYXAKKyAgX1NUTFBfS0VZX1RZUEVfRk9SX0NPTlRfRVhUKGtleV90eXBlKQorCitwdWJsaWM6CisgIC8vIGFsbG9jYXRpb24vZGVhbGxvY2F0aW9uCisgIG11bHRpbWFwKCkgOiBfTV90KF9Db21wYXJlKCksIGFsbG9jYXRvcl90eXBlKCkpIHsgfQorICBleHBsaWNpdCBtdWx0aW1hcChjb25zdCBfQ29tcGFyZSYgX19jb21wLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9NX3QoX19jb21wLCBfX2EpIHsgfQorCisjaWZkZWYgX1NUTFBfTUVNQkVSX1RFTVBMQVRFUworICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIG11bHRpbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICA6IF9NX3QoX0NvbXBhcmUoKSwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICB7IF9NX3QuaW5zZXJ0X2VxdWFsKF9fZmlyc3QsIF9fbGFzdCk7IH0KKyMgaWZkZWYgX1NUTFBfTkVFRFNfRVhUUkFfVEVNUExBVEVfQ09OU1RSVUNUT1JTCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgbXVsdGltYXAoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICBjb25zdCBfQ29tcGFyZSYgX19jb21wKQorICAgIDogX01fdChfX2NvbXAsIGFsbG9jYXRvcl90eXBlKCkpIHsgX01fdC5pbnNlcnRfZXF1YWwoX19maXJzdCwgX19sYXN0KTsgfQorIyAgZW5kaWYKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICBtdWx0aW1hcChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgIGNvbnN0IF9Db21wYXJlJiBfX2NvbXAsCisgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgX1NUTFBfQUxMT0NBVE9SX1RZUEVfREZMKQorICAgIDogX01fdChfX2NvbXAsIF9fYSkgeyBfTV90Lmluc2VydF9lcXVhbChfX2ZpcnN0LCBfX2xhc3QpOyB9CisjZWxzZQorICBtdWx0aW1hcChjb25zdCB2YWx1ZV90eXBlKiBfX2ZpcnN0LCBjb25zdCB2YWx1ZV90eXBlKiBfX2xhc3QpCisgICAgOiBfTV90KF9Db21wYXJlKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgeyBfTV90Lmluc2VydF9lcXVhbChfX2ZpcnN0LCBfX2xhc3QpOyB9CisgIG11bHRpbWFwKGNvbnN0IHZhbHVlX3R5cGUqIF9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbGFzdCwKKyAgICAgICAgICAgY29uc3QgX0NvbXBhcmUmIF9fY29tcCwKKyAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfTV90KF9fY29tcCwgX19hKSB7IF9NX3QuaW5zZXJ0X2VxdWFsKF9fZmlyc3QsIF9fbGFzdCk7IH0KKworICBtdWx0aW1hcChjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpCisgICAgOiBfTV90KF9Db21wYXJlKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgeyBfTV90Lmluc2VydF9lcXVhbChfX2ZpcnN0LCBfX2xhc3QpOyB9CisgIG11bHRpbWFwKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgY29uc3QgX0NvbXBhcmUmIF9fY29tcCwKKyAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfTV90KF9fY29tcCwgX19hKSB7IF9NX3QuaW5zZXJ0X2VxdWFsKF9fZmlyc3QsIF9fbGFzdCk7IH0KKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisKKyAgbXVsdGltYXAoY29uc3QgX1NlbGYmIF9feCkgOiBfTV90KF9feC5fTV90KSB7fQorCisjaWYgIWRlZmluZWQgKF9TVExQX05PX01PVkVfU0VNQU5USUMpCisgIG11bHRpbWFwKF9fbW92ZV9zb3VyY2U8X1NlbGY+IHNyYykKKyAgICA6IF9NX3QoX19tb3ZlX3NvdXJjZTxfUmVwX3R5cGU+KHNyYy5nZXQoKS5fTV90KSkge30KKyNlbmRpZgorCisgIF9TZWxmJiBvcGVyYXRvcj0oY29uc3QgX1NlbGYmIF9feCkgeworICAgIF9NX3QgPSBfX3guX01fdDsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLyBhY2Nlc3NvcnM6CisKKyAga2V5X2NvbXBhcmUga2V5X2NvbXAoKSBjb25zdCB7IHJldHVybiBfTV90LmtleV9jb21wKCk7IH0KKyAgdmFsdWVfY29tcGFyZSB2YWx1ZV9jb21wKCkgY29uc3QgeyByZXR1cm4gdmFsdWVfY29tcGFyZShfTV90LmtleV9jb21wKCkpOyB9CisgIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdCB7IHJldHVybiBfTV90LmdldF9hbGxvY2F0b3IoKTsgfQorCisgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gX01fdC5iZWdpbigpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gX01fdC5iZWdpbigpOyB9CisgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIF9NX3QuZW5kKCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gX01fdC5lbmQoKTsgfQorICByZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIHsgcmV0dXJuIF9NX3QucmJlZ2luKCk7IH0KKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBjb25zdCB7IHJldHVybiBfTV90LnJiZWdpbigpOyB9CisgIHJldmVyc2VfaXRlcmF0b3IgcmVuZCgpIHsgcmV0dXJuIF9NX3QucmVuZCgpOyB9CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0IHsgcmV0dXJuIF9NX3QucmVuZCgpOyB9CisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBfTV90LmVtcHR5KCk7IH0KKyAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCB7IHJldHVybiBfTV90LnNpemUoKTsgfQorICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCB7IHJldHVybiBfTV90Lm1heF9zaXplKCk7IH0KKyAgdm9pZCBzd2FwKF9TZWxmJiBfX3gpIHsgX01fdC5zd2FwKF9feC5fTV90KTsgfQorI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QQVJUSUFMX1NQRUNfV09SS0FST1VORCkgJiYgIWRlZmluZWQgKF9TVExQX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUikKKyAgdm9pZCBfTV9zd2FwX3dvcmthcm91bmQoX1NlbGYmIF9feCkgeyBzd2FwKF9feCk7IH0KKyNlbmRpZgorCisgIC8vIGluc2VydC9lcmFzZQorICBpdGVyYXRvciBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX194KSB7IHJldHVybiBfTV90Lmluc2VydF9lcXVhbChfX3gpOyB9CisgIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBfX3BvcywgY29uc3QgdmFsdWVfdHlwZSYgX194KSB7IHJldHVybiBfTV90Lmluc2VydF9lcXVhbChfX3BvcywgX194KTsgfQorI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgdm9pZCBpbnNlcnQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICB7IF9NX3QuaW5zZXJ0X2VxdWFsKF9fZmlyc3QsIF9fbGFzdCk7IH0KKyNlbHNlCisgIHZvaWQgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUqIF9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbGFzdCkKKyAgeyBfTV90Lmluc2VydF9lcXVhbChfX2ZpcnN0LCBfX2xhc3QpOyB9CisgIHZvaWQgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKKyAgeyBfTV90Lmluc2VydF9lcXVhbChfX2ZpcnN0LCBfX2xhc3QpOyB9CisjZW5kaWYgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworICB2b2lkIGVyYXNlKGl0ZXJhdG9yIF9fcG9zKSB7IF9NX3QuZXJhc2UoX19wb3MpOyB9CisgIHNpemVfdHlwZSBlcmFzZShjb25zdCBrZXlfdHlwZSYgX194KSB7IHJldHVybiBfTV90LmVyYXNlKF9feCk7IH0KKyAgdm9pZCBlcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpIHsgX01fdC5lcmFzZShfX2ZpcnN0LCBfX2xhc3QpOyB9CisgIHZvaWQgY2xlYXIoKSB7IF9NX3QuY2xlYXIoKTsgfQorCisgIC8vIG11bHRpbWFwIG9wZXJhdGlvbnM6CisKKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIGl0ZXJhdG9yIGZpbmQoY29uc3QgX0tUJiBfX3gpIHsgcmV0dXJuIF9NX3QuZmluZChfX3gpOyB9CisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBjb25zdF9pdGVyYXRvciBmaW5kKGNvbnN0IF9LVCYgX194KSBjb25zdCB7IHJldHVybiBfTV90LmZpbmQoX194KTsgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgc2l6ZV90eXBlIGNvdW50KGNvbnN0IF9LVCYgX194KSBjb25zdCB7IHJldHVybiBfTV90LmNvdW50KF9feCk7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIGl0ZXJhdG9yIGxvd2VyX2JvdW5kKGNvbnN0IF9LVCYgX194KSB7IHJldHVybiBfTV90Lmxvd2VyX2JvdW5kKF9feCk7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIGNvbnN0X2l0ZXJhdG9yIGxvd2VyX2JvdW5kKGNvbnN0IF9LVCYgX194KSBjb25zdCB7IHJldHVybiBfTV90Lmxvd2VyX2JvdW5kKF9feCk7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIGl0ZXJhdG9yIHVwcGVyX2JvdW5kKGNvbnN0IF9LVCYgX194KSB7IHJldHVybiBfTV90LnVwcGVyX2JvdW5kKF9feCk7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIGNvbnN0X2l0ZXJhdG9yIHVwcGVyX2JvdW5kKGNvbnN0IF9LVCYgX194KSBjb25zdCB7IHJldHVybiBfTV90LnVwcGVyX2JvdW5kKF9feCk7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIHBhaXI8aXRlcmF0b3IsaXRlcmF0b3I+IGVxdWFsX3JhbmdlKGNvbnN0IF9LVCYgX194KQorICB7IHJldHVybiBfTV90LmVxdWFsX3JhbmdlKF9feCk7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIHBhaXI8Y29uc3RfaXRlcmF0b3IsY29uc3RfaXRlcmF0b3I+IGVxdWFsX3JhbmdlKGNvbnN0IF9LVCYgX194KSBjb25zdAorICB7IHJldHVybiBfTV90LmVxdWFsX3JhbmdlKF9feCk7IH0KK307CisKKyNkZWZpbmUgX1NUTFBfVEVNUExBVEVfSEVBREVSIHRlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2M+CisjZGVmaW5lIF9TVExQX1RFTVBMQVRFX0NPTlRBSU5FUiBtYXA8X0tleSxfVHAsX0NvbXBhcmUsX0FsbG9jPgorI2luY2x1ZGUgPHN0bC9fcmVsb3BzX2NvbnQuaD4KKyN1bmRlZiAgX1NUTFBfVEVNUExBVEVfQ09OVEFJTkVSCisjZGVmaW5lIF9TVExQX1RFTVBMQVRFX0NPTlRBSU5FUiBtdWx0aW1hcDxfS2V5LF9UcCxfQ29tcGFyZSxfQWxsb2M+CisjaW5jbHVkZSA8c3RsL19yZWxvcHNfY29udC5oPgorI3VuZGVmICBfU1RMUF9URU1QTEFURV9DT05UQUlORVIKKyN1bmRlZiAgX1NUTFBfVEVNUExBVEVfSEVBREVSCisKKyNpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2M+CitzdHJ1Y3QgX19tb3ZlX3RyYWl0czxtYXA8X0tleSxfVHAsX0NvbXBhcmUsX0FsbG9jPiA+IDoKKyAgX1NUTFBfUFJJViBfX21vdmVfdHJhaXRzX2F1eDx0eXBlbmFtZSBtYXA8X0tleSxfVHAsX0NvbXBhcmUsX0FsbG9jPjo6X1JlcF90eXBlPgore307CisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2M+CitzdHJ1Y3QgX19tb3ZlX3RyYWl0czxtdWx0aW1hcDxfS2V5LF9UcCxfQ29tcGFyZSxfQWxsb2M+ID4gOgorICBfU1RMUF9QUklWIF9fbW92ZV90cmFpdHNfYXV4PHR5cGVuYW1lIG11bHRpbWFwPF9LZXksX1RwLF9Db21wYXJlLF9BbGxvYz46Ol9SZXBfdHlwZT4KK3t9OworI2VuZGlmCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2VuZGlmIC8qIF9TVExQX0lOVEVSTkFMX01BUF9IICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CisKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL19tYnN0YXRlX3QuaCBiL3N0bHBvcnQvc3RsL19tYnN0YXRlX3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzU2NmE3Ci0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvX21ic3RhdGVfdC5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX01CU1RBVEVfVAorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9NQlNUQVRFX1QKKworI2lmIChkZWZpbmVkIChfX09wZW5CU0RfXykgfHwgZGVmaW5lZCAoX19GcmVlQlNEX18pIHx8IGRlZmluZWQgKF9faHB1eCkpICYmIGRlZmluZWQgKF9fR05VQ19fKSAmJiAhZGVmaW5lZCAoX0dMSUJDUFBfSEFWRV9NQlNUQVRFX1QpCisjICBkZWZpbmUgX1NUTFBfQ1BQX01CU1RBVEVfVCAvKiBtYnN0YXRlX3QgZGVmaW5lZCBpbiBuYXRpdmUgPGN3Y2hhcj4sIHNvIG5vdCBkZWZpbmVkIGluIEMhICovCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX05PX05BVElWRV9NQlNUQVRFX1QpIHx8IGRlZmluZWQgKF9TVExQX0NQUF9NQlNUQVRFX1QpICYmICFkZWZpbmVkIChfTUJTVEFURV9UKQorIyAgZGVmaW5lIF9TVExQX1VTRV9PV05fTUJTVEFURV9UCisjICBkZWZpbmUgX01CU1RBVEVfVAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfT1dOX01CU1RBVEVfVCkKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9DUFBfTUJTVEFURV9UKSB8fCAhZGVmaW5lZCAoX19jcGx1c3BsdXMpIHx8ICFkZWZpbmVkIChfU1RMUF9VU0VfTkVXX0NfSEVBREVSUykKKyMgICAgaWYgIWRlZmluZWQgKEFORFJPSUQpIC8qIG1ic3RhdGVfdCBjb25mbGljdHMgd2l0aCBBbmRyb2lkJ3MgZGVmaW5pdGlvbiAqLwordHlwZWRlZiBpbnQgbWJzdGF0ZV90OworIyAgICBlbmRpZgorIyAgZW5kaWYKKworIyAgaWYgIWRlZmluZWQgKF9TVExQX0NQUF9NQlNUQVRFX1QpICYmIGRlZmluZWQgKF9fY3BsdXNwbHVzKSAmJiBkZWZpbmVkIChfU1RMUF9VU0VfTkFNRVNQQUNFUykKK19TVExQX0JFR0lOX05BTUVTUEFDRQordXNpbmcgOjptYnN0YXRlX3Q7CitfU1RMUF9FTkRfTkFNRVNQQUNFCisjICBlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfVVNFX09XTl9NQlNUQVRFX1QgKi8KKworI2VuZGlmIC8qIF9TVExQX0lOVEVSTkFMX01CU1RBVEVfVCAqLwpkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdGwvX21lc3NhZ2VzX2ZhY2V0cy5oIGIvc3RscG9ydC9zdGwvX21lc3NhZ2VzX2ZhY2V0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYTU1OTYKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9fbWVzc2FnZXNfZmFjZXRzLmgKQEAgLTAsMCArMSwxODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKy8vIFdBUk5JTkc6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIEMrKworLy8gc3RhbmRhcmQgbGlicmFyeSBoZWFkZXJzLiAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgdGhpcyBoZWFkZXIKKy8vIGZpbGUgZGlyZWN0bHkuCisKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9NRVNTQUdFU19ICisjZGVmaW5lIF9TVExQX0lOVEVSTkFMX01FU1NBR0VTX0gKKworI2lmbmRlZiBfU1RMUF9JT1NfQkFTRV9ICisjICBpbmNsdWRlIDxzdGwvX2lvc19iYXNlLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9DX0xPQ0FMRV9ICisjICBpbmNsdWRlIDxzdGwvY19sb2NhbGUuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX1NUUklOR19ICisjICBpbmNsdWRlIDxzdGwvX3N0cmluZy5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisvLyBtZXNzYWdlcyBmYWNldHMKKworY2xhc3MgbWVzc2FnZXNfYmFzZSB7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIGludCBjYXRhbG9nOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4gY2xhc3MgbWVzc2FnZXMge307CisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKK2NsYXNzIF9NZXNzYWdlczsKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCitfU1RMUF9URU1QTEFURV9OVUxMCitjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBtZXNzYWdlczxjaGFyPiA6IHB1YmxpYyBsb2NhbGU6OmZhY2V0LCBwdWJsaWMgbWVzc2FnZXNfYmFzZSB7CitwdWJsaWM6CisgIHR5cGVkZWYgbWVzc2FnZXNfYmFzZTo6Y2F0YWxvZyBjYXRhbG9nOworICB0eXBlZGVmIGNoYXIgICAgICAgICAgICAgICAgICAgY2hhcl90eXBlOworICB0eXBlZGVmIHN0cmluZyAgICAgICAgICAgICAgICAgc3RyaW5nX3R5cGU7CisKKyAgZXhwbGljaXQgbWVzc2FnZXMoc2l6ZV90IF9fcmVmcyA9IDApOworCisgIGNhdGFsb2cgb3Blbihjb25zdCBzdHJpbmcmIF9fZm4sIGNvbnN0IGxvY2FsZSYgX19sb2MpIGNvbnN0CisgIHsgcmV0dXJuIGRvX29wZW4oX19mbiwgX19sb2MpOyB9CisgIHN0cmluZ190eXBlIGdldChjYXRhbG9nIF9fYywgaW50IF9fc2V0LCBpbnQgX19tc2dpZCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZ190eXBlJiBfX2RmYXVsdCkgY29uc3QKKyAgeyByZXR1cm4gZG9fZ2V0KF9fYywgX19zZXQsIF9fbXNnaWQsIF9fZGZhdWx0KTsgfQorICBpbmxpbmUgdm9pZCBjbG9zZShjYXRhbG9nIF9fYykgY29uc3QKKyAgeyBkb19jbG9zZShfX2MpOyB9CisKKyAgc3RhdGljIF9TVExQX1NUQVRJQ19ERUNMU1BFQyBsb2NhbGU6OmlkIGlkOworCitwcm90ZWN0ZWQ6CisgIH5tZXNzYWdlcygpIHt9CisKKyAgdmlydHVhbCBjYXRhbG9nICAgICBkb19vcGVuKGNvbnN0IHN0cmluZyYgX19mbiwgY29uc3QgbG9jYWxlJiBfX2xvYykgY29uc3QKKyAgeyByZXR1cm4gLTE7IH0KKyAgdmlydHVhbCBzdHJpbmdfdHlwZSBkb19nZXQoY2F0YWxvZyBfX2MsIGludCBfX3NldCwgaW50IF9fbXNnaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZ190eXBlJiBfX2RmYXVsdCkgY29uc3QKKyAgeyByZXR1cm4gX19kZmF1bHQ7IH0KKyAgdmlydHVhbCB2b2lkICAgICAgICBkb19jbG9zZShjYXRhbG9nIF9fYykgY29uc3QKKyAge30KK307CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkKKworX1NUTFBfVEVNUExBVEVfTlVMTAorY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgbWVzc2FnZXM8d2NoYXJfdD4gOiBwdWJsaWMgbG9jYWxlOjpmYWNldCwgcHVibGljIG1lc3NhZ2VzX2Jhc2UgeworcHVibGljOgorICB0eXBlZGVmIG1lc3NhZ2VzX2Jhc2U6OmNhdGFsb2cgY2F0YWxvZzsKKyAgdHlwZWRlZiB3Y2hhcl90ICAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKKyAgdHlwZWRlZiB3c3RyaW5nICAgICAgICAgICAgICAgIHN0cmluZ190eXBlOworCisgIGV4cGxpY2l0IG1lc3NhZ2VzKHNpemVfdCBfX3JlZnMgPSAwKTsKKworICBpbmxpbmUgY2F0YWxvZyBvcGVuKGNvbnN0IHN0cmluZyYgX19mbiwgY29uc3QgbG9jYWxlJiBfX2xvYykgY29uc3QKKyAgeyByZXR1cm4gZG9fb3BlbihfX2ZuLCBfX2xvYyk7IH0KKyAgaW5saW5lIHN0cmluZ190eXBlIGdldChjYXRhbG9nIF9fYywgaW50IF9fc2V0LCBpbnQgX19tc2dpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmdfdHlwZSYgX19kZmF1bHQpIGNvbnN0CisgIHsgcmV0dXJuIGRvX2dldChfX2MsIF9fc2V0LCBfX21zZ2lkLCBfX2RmYXVsdCk7IH0KKyAgaW5saW5lIHZvaWQgY2xvc2UoY2F0YWxvZyBfX2MpIGNvbnN0CisgIHsgZG9fY2xvc2UoX19jKTsgfQorCisgIHN0YXRpYyBfU1RMUF9TVEFUSUNfREVDTFNQRUMgbG9jYWxlOjppZCBpZDsKKworcHJvdGVjdGVkOgorICB+bWVzc2FnZXMoKSB7fQorCisgIHZpcnR1YWwgY2F0YWxvZyAgICAgZG9fb3Blbihjb25zdCBzdHJpbmcmIF9fZm4sIGNvbnN0IGxvY2FsZSYgX19sb2MpIGNvbnN0CisgIHsgcmV0dXJuIC0xOyB9CisgIHZpcnR1YWwgc3RyaW5nX3R5cGUgZG9fZ2V0KGNhdGFsb2cgX19jLCBpbnQgX19zZXQsIGludCBfX21zZ2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmdfdHlwZSYgX19kZmF1bHQpIGNvbnN0CisgIHsgcmV0dXJuIF9fZGZhdWx0OyB9CisgIHZpcnR1YWwgdm9pZCAgICAgICAgZG9fY2xvc2UoY2F0YWxvZyBfX2MpIGNvbnN0CisgIHt9Cit9OworCisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4gY2xhc3MgbWVzc2FnZXNfYnluYW1lIHt9OworCitfU1RMUF9URU1QTEFURV9OVUxMCitjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBtZXNzYWdlc19ieW5hbWU8Y2hhcj4gOiBwdWJsaWMgbWVzc2FnZXM8Y2hhcj4geworICBmcmllbmQgY2xhc3MgX0xvY2FsZV9pbXBsOworcHVibGljOgorICB0eXBlZGVmIG1lc3NhZ2VzX2Jhc2U6OmNhdGFsb2cgY2F0YWxvZzsKKyAgdHlwZWRlZiBzdHJpbmcgICAgIHN0cmluZ190eXBlOworCisgIGV4cGxpY2l0IG1lc3NhZ2VzX2J5bmFtZShjb25zdCBjaGFyKiBfX25hbWUsIHNpemVfdCBfX3JlZnMgPSAwKTsKKworcHJvdGVjdGVkOgorICB+bWVzc2FnZXNfYnluYW1lKCk7CisKKyAgdmlydHVhbCBjYXRhbG9nICAgICBkb19vcGVuKGNvbnN0IHN0cmluZyYgX19mbiwgY29uc3QgbG9jYWxlJiBfX2xvYykgY29uc3Q7CisgIHZpcnR1YWwgc3RyaW5nX3R5cGUgZG9fZ2V0KGNhdGFsb2cgX19jLCBpbnQgX19zZXQsIGludCBfX21zZ2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmdfdHlwZSYgX19kZmF1bHQpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgICAgICAgIGRvX2Nsb3NlKGNhdGFsb2cgX19jKSBjb25zdDsKKworcHJpdmF0ZToKKyAgbWVzc2FnZXNfYnluYW1lKF9Mb2NhbGVfbWVzc2FnZXMqKTsKKyAgdHlwZWRlZiBtZXNzYWdlc19ieW5hbWU8Y2hhcj4gX1NlbGY7CisgIC8vZXhwbGljaXRlbHkgZGVmaW5lZCBhcyBwcml2YXRlIHRvIGF2b2lkIHdhcm5pbmdzOgorICBtZXNzYWdlc19ieW5hbWUoX1NlbGYgY29uc3QmKTsKKyAgX1NlbGYmIG9wZXJhdG9yID0gKF9TZWxmIGNvbnN0Jik7CisKKyAgX1NUTFBfUFJJViBfTWVzc2FnZXMqIF9NX2ltcGw7Cit9OworCisjaWYgIWRlZmluZWQgKF9TVExQX05PX1dDSEFSX1QpCitfU1RMUF9URU1QTEFURV9OVUxMCitjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBtZXNzYWdlc19ieW5hbWU8d2NoYXJfdD4gOiBwdWJsaWMgbWVzc2FnZXM8d2NoYXJfdD4geworICBmcmllbmQgY2xhc3MgX0xvY2FsZV9pbXBsOworcHVibGljOgorICB0eXBlZGVmIG1lc3NhZ2VzX2Jhc2U6OmNhdGFsb2cgY2F0YWxvZzsKKyAgdHlwZWRlZiB3c3RyaW5nICAgICAgICAgICAgICAgIHN0cmluZ190eXBlOworCisgIGV4cGxpY2l0IG1lc3NhZ2VzX2J5bmFtZShjb25zdCBjaGFyKiBfX25hbWUsIHNpemVfdCBfX3JlZnMgPSAwKTsKKworcHJvdGVjdGVkOgorICB+bWVzc2FnZXNfYnluYW1lKCk7CisKKyAgdmlydHVhbCBjYXRhbG9nICAgICBkb19vcGVuKGNvbnN0IHN0cmluZyYgX19mbiwgY29uc3QgbG9jYWxlJiBfX2xvYykgY29uc3Q7CisgIHZpcnR1YWwgc3RyaW5nX3R5cGUgZG9fZ2V0KGNhdGFsb2cgX19jLCBpbnQgX19zZXQsIGludCBfX21zZ2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmdfdHlwZSYgX19kZmF1bHQpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgICAgICAgIGRvX2Nsb3NlKGNhdGFsb2cgX19jKSBjb25zdDsKKworcHJpdmF0ZToKKyAgbWVzc2FnZXNfYnluYW1lKF9Mb2NhbGVfbWVzc2FnZXMqKTsKKyAgdHlwZWRlZiBtZXNzYWdlc19ieW5hbWU8d2NoYXJfdD4gX1NlbGY7CisgIC8vZXhwbGljaXRlbHkgZGVmaW5lZCBhcyBwcml2YXRlIHRvIGF2b2lkIHdhcm5pbmdzOgorICBtZXNzYWdlc19ieW5hbWUoX1NlbGYgY29uc3QmKTsKKyAgX1NlbGYmIG9wZXJhdG9yID0gKF9TZWxmIGNvbnN0Jik7CisKKyAgX1NUTFBfUFJJViBfTWVzc2FnZXMqIF9NX2ltcGw7Cit9OworI2VuZGlmIC8qIFdDSEFSX1QgKi8KKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfTUVTU0FHRVNfSCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgorCmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9fbW9uZXRhcnkuYyBiL3N0bHBvcnQvc3RsL19tb25ldGFyeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZTkzN2MKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9fbW9uZXRhcnkuYwpAQCAtMCwwICsxLDUyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKyNpZm5kZWYgX1NUTFBfTU9ORVRBUllfQworI2RlZmluZSBfU1RMUF9NT05FVEFSWV9DCisKKyMgaWZuZGVmIF9TVExQX0lOVEVSTkFMX01PTkVUQVJZX0gKKyMgIGluY2x1ZGUgPHN0bC9fbW9uZXRhcnkuaD4KKyMgZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9JT1NfSAorIyBpbmNsdWRlIDxzdGwvX2lvcy5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfTlVNX1BVVF9ICisjIGluY2x1ZGUgPHN0bC9fbnVtX3B1dC5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfTlVNX0dFVF9ICisjIGluY2x1ZGUgPHN0bC9fbnVtX2dldC5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfSW5wdXRJdGVyYXRvcj4KK2xvY2FsZTo6aWQgbW9uZXlfZ2V0PF9DaGFyVCwgX0lucHV0SXRlcmF0b3I+OjppZDsKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX091dHB1dEl0ZXJhdG9yPgorbG9jYWxlOjppZCBtb25leV9wdXQ8X0NoYXJULCBfT3V0cHV0SXRlcmF0b3I+OjppZDsKKworLy8gbW9uZXlfZ2V0IGZhY2V0cworCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKKy8vIGhlbHBlciBmdW5jdGlvbnMgZm9yIGRvX2dldAordGVtcGxhdGUgPGNsYXNzIF9Jbkl0MSwgY2xhc3MgX0luSXQyPgorcGFpcjxfSW5JdDEsIGJvb2w+IF9fZ2V0X3N0cmluZyggX0luSXQxIF9fZmlyc3QsIF9Jbkl0MSBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5JdDIgX19zdHJfZmlyc3QsIF9Jbkl0MiBfX3N0cl9sYXN0KSB7CisgIHdoaWxlICggX19maXJzdCAhPSBfX2xhc3QgJiYgX19zdHJfZmlyc3QgIT0gX19zdHJfbGFzdCAmJiAqX19maXJzdCA9PSAqX19zdHJfZmlyc3QgKSB7CisgICAgKytfX2ZpcnN0OworICAgICsrX19zdHJfZmlyc3Q7CisgIH0KKyAgcmV0dXJuIG1ha2VfcGFpcihfX2ZpcnN0LCBfX3N0cl9maXJzdCA9PSBfX3N0cl9sYXN0KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Jbkl0LCBjbGFzcyBfT3VJdCwgY2xhc3MgX0NoYXJUPgorYm9vbAorX19nZXRfbW9uZXRhcnlfdmFsdWUoX0luSXQmIF9fZmlyc3QsIF9Jbkl0IF9fbGFzdCwgX091SXQgX19vdXRfaXRlLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3R5cGU8X0NoYXJUPiYgX2NfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIF9DaGFyVCBfX3BvaW50LCBpbnQgX19mcmFjX2RpZ2l0cywgX0NoYXJUIF9fc2VwLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBfX2dyb3VwaW5nLCBib29sICZfX3N5bnRheF9vaykgeworICBpZiAoX19maXJzdCA9PSBfX2xhc3QgfHwgIV9jX3R5cGUuaXMoY3R5cGVfYmFzZTo6ZGlnaXQsICpfX2ZpcnN0KSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgY2hhciBfX2dyb3VwX3NpemVzWzEyOF07CisgIGNoYXIqIF9fZ3JvdXBfc2l6ZXNfZW5kID0gX19ncm91cGluZy5lbXB0eSgpPyAwIDogX19ncm91cF9zaXplczsKKyAgY2hhciAgIF9fY3VycmVudF9ncm91cF9zaXplID0gMDsKKworICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QpIHsKKyAgICBpZiAoX2NfdHlwZS5pcyhjdHlwZV9iYXNlOjpkaWdpdCwgKl9fZmlyc3QpKSB7CisgICAgICArK19fY3VycmVudF9ncm91cF9zaXplOworICAgICAgKl9fb3V0X2l0ZSsrID0gKl9fZmlyc3QrKzsKKyAgICB9CisgICAgZWxzZSBpZiAoX19ncm91cF9zaXplc19lbmQpIHsKKyAgICAgIGlmICgqX19maXJzdCA9PSBfX3NlcCkgeworICAgICAgICAqX19ncm91cF9zaXplc19lbmQrKyA9IF9fY3VycmVudF9ncm91cF9zaXplOworICAgICAgICBfX2N1cnJlbnRfZ3JvdXBfc2l6ZSA9IDA7CisgICAgICAgICsrX19maXJzdDsKKyAgICAgIH0KKyAgICAgIGVsc2UgYnJlYWs7CisgICAgfQorICAgIGVsc2UKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKF9fZ3JvdXBpbmcuZW1wdHkoKSkKKyAgICBfX3N5bnRheF9vayA9IHRydWU7CisgIGVsc2UgeworICAgIGlmIChfX2dyb3VwX3NpemVzX2VuZCAhPSBfX2dyb3VwX3NpemVzKQorICAgICAgKl9fZ3JvdXBfc2l6ZXNfZW5kKysgPSBfX2N1cnJlbnRfZ3JvdXBfc2l6ZTsKKworICAgIF9fc3ludGF4X29rID0gX192YWxpZF9ncm91cGluZyhfX2dyb3VwX3NpemVzLCBfX2dyb3VwX3NpemVzX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19ncm91cGluZy5kYXRhKCksIF9fZ3JvdXBpbmcuZGF0YSgpKyBfX2dyb3VwaW5nLnNpemUoKSk7CisKKyAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QgfHwgKl9fZmlyc3QgIT0gX19wb2ludCkgeworICAgICAgZm9yIChpbnQgX19kaWdpdHMgPSAwOyBfX2RpZ2l0cyAhPSBfX2ZyYWNfZGlnaXRzOyArK19fZGlnaXRzKQorICAgICAgICAqX19vdXRfaXRlKysgPSBfQ2hhclQoJzAnKTsKKyAgICAgIHJldHVybiB0cnVlOyAvLyBPSyBub3QgdG8gaGF2ZSBkZWNpbWFsIHBvaW50CisgICAgfQorICB9CisKKyAgKytfX2ZpcnN0OworCisgIGludCBfX2RpZ2l0cyA9IDA7CisKKyAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0ICYmIF9jX3R5cGUuaXMoY3R5cGVfYmFzZTo6ZGlnaXQsICpfX2ZpcnN0KSkgeworICAgICAgKl9fb3V0X2l0ZSsrID0gKl9fZmlyc3QrKzsKKyAgICAgKytfX2RpZ2l0czsKKyAgfQorCisgIF9fc3ludGF4X29rID0gX19zeW50YXhfb2sgJiYgKF9fZGlnaXRzID09IF9fZnJhY19kaWdpdHMpOworCisgIHJldHVybiB0cnVlOworfQorCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9TdHJUeXBlPgorX0lucHV0SXRlciBfX21vbmV5X2RvX2dldChfSW5wdXRJdGVyIF9fcywgX0lucHV0SXRlciBfX2VuZCwgYm9vbCAgX19pbnRsLAorICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2UmICBfX3N0ciwgaW9zX2Jhc2U6Omlvc3RhdGUmICBfX2VyciwKKyAgICAgICAgICAgICAgICAgICAgIF9TdHJUeXBlJiBfX2RpZ2l0cywgYm9vbCAmX19pc19wb3NpdGl2ZSwgX0NoYXJUKiAvKl9fZHVtbXkqLykgeworICBpZiAoX19zID09IF9fZW5kKSB7CisgICAgX19lcnIgfD0gaW9zX2Jhc2U6OmVvZmJpdDsKKyAgICByZXR1cm4gX19zOworICB9CisKKyAgdHlwZWRlZiBfQ2hhclQgY2hhcl90eXBlOworICB0eXBlZGVmIF9TdHJUeXBlIHN0cmluZ190eXBlOworICB0eXBlZGVmIF9JbnB1dEl0ZXIgaXRlcl90eXBlOworICB0eXBlZGVmIG1vbmV5cHVuY3Q8Y2hhcl90eXBlLCBmYWxzZT4gX1B1bmN0OworICB0eXBlZGVmIG1vbmV5cHVuY3Q8Y2hhcl90eXBlLCB0cnVlPiAgX1B1bmN0X2ludGw7CisgIHR5cGVkZWYgY3R5cGU8Y2hhcl90eXBlPiAgICAgICAgICAgICBfQ3R5cGU7CisKKyAgbG9jYWxlIF9fbG9jID0gX19zdHIuZ2V0bG9jKCk7CisgIGNvbnN0IF9QdW5jdCYgICAgICBfX3B1bmN0ICAgICAgPSB1c2VfZmFjZXQ8X1B1bmN0PihfX2xvYykgOworICBjb25zdCBfUHVuY3RfaW50bCYgX19wdW5jdF9pbnRsID0gdXNlX2ZhY2V0PF9QdW5jdF9pbnRsPihfX2xvYykgOworICBjb25zdCBfQ3R5cGUmICAgICAgX19jX3R5cGUgICAgID0gdXNlX2ZhY2V0PF9DdHlwZT4oX19sb2MpIDsKKworICBtb25leV9iYXNlOjpwYXR0ZXJuIF9fZm9ybWF0ID0gX19pbnRsID8gX19wdW5jdF9pbnRsLm5lZ19mb3JtYXQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX19wdW5jdC5uZWdfZm9ybWF0KCk7CisgIHN0cmluZ190eXBlIF9fbnMgPSBfX2ludGwgPyBfX3B1bmN0X2ludGwubmVnYXRpdmVfc2lnbigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfX3B1bmN0Lm5lZ2F0aXZlX3NpZ24oKTsKKyAgc3RyaW5nX3R5cGUgX19wcyA9IF9faW50bCA/IF9fcHVuY3RfaW50bC5wb3NpdGl2ZV9zaWduKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF9fcHVuY3QucG9zaXRpdmVfc2lnbigpOworICBpbnQgX19pOworICBib29sIF9fc3ltYm9sX3JlcXVpcmVkID0gKF9fc3RyLmZsYWdzKCkgJiBpb3NfYmFzZTo6c2hvd2Jhc2UpICE9IDA7CisgIHN0cmluZ190eXBlIF9fYnVmOworICBiYWNrX2luc2VydF9pdGVyYXRvcjxzdHJpbmdfdHlwZT4gX19vdXRfaXRlKF9fYnVmKTsKKworICBmb3IgKF9faSA9IDA7IF9faSA8IDQ7ICsrX19pKSB7CisgICAgc3dpdGNoIChfX2Zvcm1hdC5maWVsZFtfX2ldKSB7CisgICAgY2FzZSBtb25leV9iYXNlOjpzcGFjZToKKyAgICAgIGlmICghX19jX3R5cGUuaXMoY3R5cGVfYmFzZTo6c3BhY2UsICpfX3MpKSB7CisgICAgICAgIF9fZXJyID0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisgICAgICAgIHJldHVybiBfX3M7CisgICAgICB9CisgICAgICArK19fczsKKyAgICBjYXNlIG1vbmV5X2Jhc2U6Om5vbmU6CisgICAgICB3aGlsZSAoX19zICE9IF9fZW5kICYmIF9fY190eXBlLmlzKGN0eXBlX2Jhc2U6OnNwYWNlLCAqX19zKSkKKyAgICAgICAgKytfX3M7CisgICAgICBicmVhazsKKyAgICBjYXNlIG1vbmV5X2Jhc2U6OnN5bWJvbDogeworICAgICAgc3RyaW5nX3R5cGUgX19jdXJzID0gX19pbnRsID8gX19wdW5jdF9pbnRsLmN1cnJfc3ltYm9sKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF9fcHVuY3QuY3Vycl9zeW1ib2woKTsKKyAgICAgIHBhaXI8aXRlcl90eXBlLCBib29sPgorICAgICAgX19yZXN1bHQgID0gX19nZXRfc3RyaW5nKF9fcywgX19lbmQsIF9fY3Vycy5iZWdpbigpLCBfX2N1cnMuZW5kKCkpOworICAgICAgaWYgKCFfX3Jlc3VsdC5zZWNvbmQgJiYgX19zeW1ib2xfcmVxdWlyZWQpCisgICAgICAgIF9fZXJyID0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisgICAgICBfX3MgPSBfX3Jlc3VsdC5maXJzdDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIG1vbmV5X2Jhc2U6OnNpZ246IHsKKyAgICAgIGlmIChfX3MgPT0gX19lbmQpIHsKKyAgICAgICAgaWYgKF9fcHMuZW1wdHkoKSkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKF9fbnMuZW1wdHkoKSkgeworICAgICAgICAgIF9faXNfcG9zaXRpdmUgPSBmYWxzZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBfX2VyciA9IGlvc19iYXNlOjpmYWlsYml0OworICAgICAgICByZXR1cm4gX19zOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGlmIChfX3BzLmVtcHR5KCkpIHsKKyAgICAgICAgICBpZiAoX19ucy5lbXB0eSgpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgaWYgKCpfX3MgPT0gX19uc1swXSkgeworICAgICAgICAgICAgKytfX3M7CisgICAgICAgICAgICBfX2lzX3Bvc2l0aXZlID0gZmFsc2U7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIGlmICgqX19zID09IF9fcHNbMF0pIHsKKyAgICAgICAgICAgICsrX19zOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChfX25zLmVtcHR5KCkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBpZiAoKl9fcyA9PSBfX25zWzBdKSB7CisgICAgICAgICAgICArK19fczsKKyAgICAgICAgICAgIF9faXNfcG9zaXRpdmUgPSBmYWxzZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBfX2VyciA9IGlvc19iYXNlOjpmYWlsYml0OworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gX19zOworICAgIH0KKyAgICBjYXNlIG1vbmV5X2Jhc2U6OnZhbHVlOiB7CisgICAgICBjaGFyX3R5cGUgX19wb2ludCA9IF9faW50bCA/IF9fcHVuY3RfaW50bC5kZWNpbWFsX3BvaW50KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX19wdW5jdC5kZWNpbWFsX3BvaW50KCk7CisgICAgICBpbnQgX19mcmFjX2RpZ2l0cyA9IF9faW50bCA/IF9fcHVuY3RfaW50bC5mcmFjX2RpZ2l0cygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF9fcHVuY3QuZnJhY19kaWdpdHMoKTsKKyAgICAgIHN0cmluZyBfX2dyb3VwaW5nID0gX19pbnRsID8gX19wdW5jdF9pbnRsLmdyb3VwaW5nKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX19wdW5jdC5ncm91cGluZygpOworICAgICAgYm9vbCBfX3N5bnRheF9vayA9IHRydWU7CisKKyAgICAgIGJvb2wgX19yZXN1bHQ7CisKKyAgICAgIGNoYXJfdHlwZSBfX3NlcCA9IF9fZ3JvdXBpbmcuZW1wdHkoKSA/IGNoYXJfdHlwZSgpIDoKKyAgICAgIF9faW50bCA/IF9fcHVuY3RfaW50bC50aG91c2FuZHNfc2VwKCkgOiBfX3B1bmN0LnRob3VzYW5kc19zZXAoKTsKKworICAgICAgX19yZXN1bHQgPSBfX2dldF9tb25ldGFyeV92YWx1ZShfX3MsIF9fZW5kLCBfX291dF9pdGUsIF9fY190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3BvaW50LCBfX2ZyYWNfZGlnaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3NlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19ncm91cGluZywgX19zeW50YXhfb2spOworCisgICAgICBpZiAoIV9fc3ludGF4X29rKQorICAgICAgICBfX2VyciB8PSBpb3NfYmFzZTo6ZmFpbGJpdDsKKyAgICAgIGlmICghX19yZXN1bHQpIHsKKyAgICAgICAgX19lcnIgPSBpb3NfYmFzZTo6ZmFpbGJpdDsKKyAgICAgICAgcmV0dXJuIF9fczsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsb3NlIG1vbmV5X2Jhc2U6OnZhbHVlIGNhc2UKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2xvc2Ugc3dpdGNoIHN0YXRlbWVudAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDbG9zZSBmb3IgbG9vcAorCisgIGlmIChfX2lzX3Bvc2l0aXZlKSB7CisgICAgaWYgKF9fcHMuc2l6ZSgpID4gMSkgeworICAgICAgcGFpcjxfSW5wdXRJdGVyLCBib29sPgorICAgICAgICBfX3Jlc3VsdCA9IF9fZ2V0X3N0cmluZyhfX3MsIF9fZW5kLCBfX3BzLmJlZ2luKCkgKyAxLCBfX3BzLmVuZCgpKTsKKyAgICAgIF9fcyA9IF9fcmVzdWx0LmZpcnN0OworICAgICAgaWYgKCFfX3Jlc3VsdC5zZWNvbmQpCisgICAgICAgIF9fZXJyIHw9IGlvczo6ZmFpbGJpdDsKKyAgICB9CisgICAgaWYgKCEoX19lcnIgJiBpb3NfYmFzZTo6ZmFpbGJpdCkpCisgICAgICBfX2RpZ2l0cyA9IF9fYnVmOworICB9CisgIGVsc2UgeworICAgIGlmIChfX25zLnNpemUoKSA+IDEpIHsKKyAgICAgIHBhaXI8X0lucHV0SXRlciwgYm9vbD4KKyAgICAgICAgX19yZXN1bHQgPSBfX2dldF9zdHJpbmcoX19zLCBfX2VuZCwgX19ucy5iZWdpbigpICsgMSwgX19ucy5lbmQoKSk7CisgICAgICBfX3MgPSBfX3Jlc3VsdC5maXJzdDsKKyAgICAgIGlmICghX19yZXN1bHQuc2Vjb25kKQorICAgICAgICBfX2VyciB8PSBpb3M6OmZhaWxiaXQ7CisgICAgfQorICAgIGlmICghKF9fZXJyICYgaW9zOjpmYWlsYml0KSkgeworICAgICAgX19kaWdpdHMgPSBfX2NfdHlwZS53aWRlbignLScpOworICAgICAgX19kaWdpdHMgKz0gX19idWY7CisgICAgfQorICB9CisgIGlmIChfX3MgPT0gX19lbmQpCisgICAgX19lcnIgfD0gaW9zOjplb2ZiaXQ7CisKKyAgcmV0dXJuIF9fczsKK30KKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKKy8vPT09PT0gbWV0aG9kcyA9PT09PT0KK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9JbnB1dEl0ZXI+CitfSW5wdXRJdGVyCittb25leV9nZXQ8X0NoYXJULCBfSW5wdXRJdGVyPjo6ZG9fZ2V0KF9JbnB1dEl0ZXIgX19zLCBfSW5wdXRJdGVyICBfX2VuZCwgYm9vbCAgX19pbnRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZSYgIF9fc3RyLCBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX0xPTkdFU1RfRkxPQVRfVFlQRSYgX191bml0cykgY29uc3QgeworICBzdHJpbmdfdHlwZSBfX2J1ZjsKKyAgYm9vbCBfX2lzX3Bvc2l0aXZlID0gdHJ1ZTsKKyAgX19zID0gX1NUTFBfUFJJViBfX21vbmV5X2RvX2dldChfX3MsIF9fZW5kLCBfX2ludGwsIF9fc3RyLCBfX2VyciwgX19idWYsIF9faXNfcG9zaXRpdmUsIChfQ2hhclQqKTApOworCisgIGlmIChfX2VyciA9PSBpb3NfYmFzZTo6Z29vZGJpdCB8fCBfX2VyciA9PSBpb3NfYmFzZTo6ZW9mYml0KSB7CisgICAgdHlwZW5hbWUgc3RyaW5nX3R5cGU6Oml0ZXJhdG9yIF9fYiA9IF9fYnVmLmJlZ2luKCksIF9fZSA9IF9fYnVmLmVuZCgpOworCisgICAgaWYgKCFfX2lzX3Bvc2l0aXZlKSArK19fYjsKKyAgICAvLyBDYW4ndCB1c2UgYXRvbGQsIHNpbmNlIGl0IG1pZ2h0IGJlIHdjaGFyX3QuIERvbid0IGdldCBjb25mdXNlZCBieSBuYW1lIGJlbG93IDoKKyAgICAvLyBpdCdzIHBlcmZlY3RseSBjYXBhYmxlIG9mIHJlYWRpbmcgbG9uZyBkb3VibGUuCisgICAgX1NUTFBfUFJJViBfX2dldF9kZWNpbWFsX2ludGVnZXIoX19iLCBfX2UsIF9fdW5pdHMsIChfQ2hhclQqKTApOworCisgICAgaWYgKCFfX2lzX3Bvc2l0aXZlKSB7CisgICAgICBfX3VuaXRzID0gLV9fdW5pdHM7CisgICAgfQorICB9CisKKyAgcmV0dXJuIF9fczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0lucHV0SXRlcj4KK19JbnB1dEl0ZXIKK21vbmV5X2dldDxfQ2hhclQsIF9JbnB1dEl0ZXI+Ojpkb19nZXQoaXRlcl90eXBlIF9fcywgaXRlcl90eXBlICBfX2VuZCwgYm9vbCAgX19pbnRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZSYgIF9fc3RyLCBpb3NfYmFzZTo6aW9zdGF0ZSYgIF9fZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdHlwZSYgX19kaWdpdHMpIGNvbnN0IHsKKyAgYm9vbCBfX2lzX3Bvc2l0aXZlID0gdHJ1ZTsKKyAgcmV0dXJuIF9TVExQX1BSSVYgX19tb25leV9kb19nZXQoX19zLCBfX2VuZCwgX19pbnRsLCBfX3N0ciwgX19lcnIsIF9fZGlnaXRzLCBfX2lzX3Bvc2l0aXZlLCAoX0NoYXJUKikwKTsKK30KKworLy8gbW9uZXlfcHV0IGZhY2V0cworCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9PdXRwdXRJdGVyLCBjbGFzcyBfU3RyX1R5cGUsIGNsYXNzIF9TdHI+CitfT3V0cHV0SXRlciBfX21vbmV5X2RvX3B1dChfT3V0cHV0SXRlciBfX3MsIGJvb2wgIF9faW50bCwgaW9zX2Jhc2UmICBfX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DaGFyVCBfX2ZpbGwsIGNvbnN0IF9TdHImIF9fZGlnaXRzLCBib29sIF9fY2hlY2tfZGlnaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX1N0cl9UeXBlICogLypfX2R1bW15Ki8pIHsKKyAgdHlwZWRlZiBfQ2hhclQgY2hhcl90eXBlOworICB0eXBlZGVmIF9TdHJfVHlwZSBzdHJpbmdfdHlwZTsKKyAgdHlwZWRlZiBjdHlwZTxjaGFyX3R5cGU+ICAgICAgICAgICAgIF9DdHlwZTsKKyAgdHlwZWRlZiBtb25leXB1bmN0PGNoYXJfdHlwZSwgZmFsc2U+IF9QdW5jdDsKKyAgdHlwZWRlZiBtb25leXB1bmN0PGNoYXJfdHlwZSwgdHJ1ZT4gIF9QdW5jdF9pbnRsOworCisgIGxvY2FsZSBfX2xvYyA9IF9fc3RyLmdldGxvYygpOworICBjb25zdCBfQ3R5cGUmICAgICAgX19jX3R5cGUgICAgID0gdXNlX2ZhY2V0PF9DdHlwZT4oX19sb2MpIDsKKyAgY29uc3QgX1B1bmN0JiAgICAgIF9fcHVuY3QgICAgICA9IHVzZV9mYWNldDxfUHVuY3Q+KF9fbG9jKSA7CisgIGNvbnN0IF9QdW5jdF9pbnRsJiBfX3B1bmN0X2ludGwgPSB1c2VfZmFjZXQ8X1B1bmN0X2ludGw+KF9fbG9jKSA7CisKKyAgLy8gc29tZSBzcGVjaWFsIGNoYXJhY3RlcnMKKyAgY2hhcl90eXBlIF9fbWludXMgPSBfX2NfdHlwZS53aWRlbignLScpOworICBjaGFyX3R5cGUgX19wbHVzICA9IF9fY190eXBlLndpZGVuKCcrJyk7CisgIGNoYXJfdHlwZSBfX3NwYWNlID0gX19jX3R5cGUud2lkZW4oJyAnKTsKKyAgY2hhcl90eXBlIF9femVybyAgPSBfX2NfdHlwZS53aWRlbignMCcpOworICBjaGFyX3R5cGUgX19wb2ludCA9IF9faW50bCA/IF9fcHVuY3RfaW50bC5kZWNpbWFsX3BvaW50KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfX3B1bmN0LmRlY2ltYWxfcG9pbnQoKTsKKworICBjaGFyX3R5cGUgX19zZXAgPSBfX2ludGwgPyBfX3B1bmN0X2ludGwudGhvdXNhbmRzX3NlcCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF9fcHVuY3QudGhvdXNhbmRzX3NlcCgpOworCisgIHN0cmluZyBfX2dyb3VwaW5nID0gX19pbnRsID8gX19wdW5jdF9pbnRsLmdyb3VwaW5nKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfX3B1bmN0Lmdyb3VwaW5nKCk7CisKKyAgaW50IF9fZnJhY19kaWdpdHMgICAgICA9IF9faW50bCA/IF9fcHVuY3RfaW50bC5mcmFjX2RpZ2l0cygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfX3B1bmN0LmZyYWNfZGlnaXRzKCk7CisKKyAgc3RyaW5nX3R5cGUgX19jdXJyX3N5bSA9IF9faW50bCA/IF9fcHVuY3RfaW50bC5jdXJyX3N5bWJvbCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfX3B1bmN0LmN1cnJfc3ltYm9sKCk7CisKKyAgLy8gaWYgdGhlcmUgYXJlIG5vIGRpZ2l0cyB3ZSBhcmUgZ29pbmcgdG8gcmV0dXJuIF9fcy4gIElmIHRoZXJlCisgIC8vIGFyZSBkaWdpdHMsIGJ1dCBub3QgZW5vdWdoIHRvIGZpbGwgdGhlIGZyYWNfZGlnaXRzLCB3ZSBhcmUKKyAgLy8gZ29pbmcgdG8gYWRkIHplcm9zLiAgSSBkb24ndCBrbm93IHdoZXRoZXIgdGhpcyBpcyByaWdodCBvcgorICAvLyBub3QuCisgIGlmIChfX2RpZ2l0cy5lbXB0eSgpKQorICAgIHJldHVybiBfX3M7CisKKyAgdHlwZW5hbWUgc3RyaW5nX3R5cGU6OmNvbnN0X2l0ZXJhdG9yIF9fZGlnaXRzX2ZpcnN0ID0gX19kaWdpdHMuYmVnaW4oKTsKKyAgdHlwZW5hbWUgc3RyaW5nX3R5cGU6OmNvbnN0X2l0ZXJhdG9yIF9fZGlnaXRzX2xhc3QgID0gX19kaWdpdHMuZW5kKCk7CisKKyAgYm9vbCBfX2lzX25lZ2F0aXZlID0gKl9fZGlnaXRzX2ZpcnN0ID09IF9fbWludXM7CisgIGlmIChfX2lzX25lZ2F0aXZlKQorICAgICsrX19kaWdpdHNfZmlyc3Q7CisKKyNpZiAhZGVmaW5lZCAoX19CT1JMQU5EQ19fKQorICBzdHJpbmdfdHlwZSBfX3NpZ24gPSBfX2ludGwgPyBfX2lzX25lZ2F0aXZlID8gX19wdW5jdF9pbnRsLm5lZ2F0aXZlX3NpZ24oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX19wdW5jdF9pbnRsLnBvc2l0aXZlX3NpZ24oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfX2lzX25lZ2F0aXZlID8gX19wdW5jdC5uZWdhdGl2ZV9zaWduKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF9fcHVuY3QucG9zaXRpdmVfc2lnbigpOworI2Vsc2UKKyAgc3RyaW5nX3R5cGUgX19zaWduOworICBpZiAoX19pbnRsKSB7CisgICAgaWYgKF9faXNfbmVnYXRpdmUpCisgICAgICBfX3NpZ24gPSBfX3B1bmN0X2ludGwubmVnYXRpdmVfc2lnbigpOworICAgIGVsc2UKKyAgICAgIF9fc2lnbiA9IF9fcHVuY3RfaW50bC5wb3NpdGl2ZV9zaWduKCk7CisgIH0KKyAgZWxzZSB7CisgICAgaWYgKF9faXNfbmVnYXRpdmUpCisgICAgICBfX3NpZ24gPSBfX3B1bmN0Lm5lZ2F0aXZlX3NpZ24oKTsKKyAgICBlbHNlCisgICAgICBfX3NpZ24gPSBfX3B1bmN0LnBvc2l0aXZlX3NpZ24oKTsKKyAgfQorI2VuZGlmCisKKyAgaWYgKF9fY2hlY2tfZGlnaXRzKSB7CisgICAgdHlwZW5hbWUgc3RyaW5nX3R5cGU6OmNvbnN0X2l0ZXJhdG9yIF9fY3AgPSBfX2RpZ2l0c19maXJzdDsKKyAgICB3aGlsZSAoX19jcCAhPSBfX2RpZ2l0c19sYXN0ICYmIF9fY190eXBlLmlzKGN0eXBlX2Jhc2U6OmRpZ2l0LCAqX19jcCkpCisgICAgICArK19fY3A7CisgICAgaWYgKF9fY3AgPT0gX19kaWdpdHNfZmlyc3QpCisgICAgICByZXR1cm4gX19zOworICAgIF9fZGlnaXRzX2xhc3QgPSBfX2NwOworICB9CisKKyAgLy8gSWYgZ3JvdXBpbmcgaXMgcmVxdWlyZWQsIHdlIG1ha2UgYSBjb3B5IG9mIF9fZGlnaXRzIGFuZAorICAvLyBpbnNlcnQgdGhlIGdyb3VwaW5nLgorICBfU1RMUF9CQVNJQ19JT1NUUklORyhjaGFyX3R5cGUpIF9fbmV3X2RpZ2l0czsKKyAgaWYgKCFfX2dyb3VwaW5nLmVtcHR5KCkpIHsKKyAgICBfX25ld19kaWdpdHMuYXNzaWduKF9fZGlnaXRzX2ZpcnN0LCBfX2RpZ2l0c19sYXN0KTsKKyAgICBfX2luc2VydF9ncm91cGluZyhfX25ld19kaWdpdHMsCisgICAgICAgICAgICAgICAgICAgICAgX19uZXdfZGlnaXRzLnNpemUoKSAtIF9fZnJhY19kaWdpdHMsCisgICAgICAgICAgICAgICAgICAgICAgX19ncm91cGluZywKKyAgICAgICAgICAgICAgICAgICAgICBfX3NlcCwgX19wbHVzLCBfX21pbnVzLCAwKTsKKyAgICBfX2RpZ2l0c19maXJzdCA9IF9fbmV3X2RpZ2l0cy5iZWdpbigpOyAvLyA8PC0tCisgICAgX19kaWdpdHNfbGFzdCAgPSBfX25ld19kaWdpdHMuZW5kKCk7ICAgLy8gPDwtLQorICB9CisKKyAgLy8gRGV0ZXJtaW5lIHRoZSBhbW91bnQgb2YgcGFkZGluZyByZXF1aXJlZCwgaWYgYW55LgorICBzdHJlYW1zaXplIF9fd2lkdGggPSBfX3N0ci53aWR0aCgpOworCisjaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpICYmIChkZWZpbmVkKF9fSFBfYUNDKSAmJiAoX19IUF9hQ0MgPD0gMSkpCisgIHNpemVfdCBfX3ZhbHVlX2xlbmd0aCA9IG9wZXJhdG9yIC0oX19kaWdpdHNfbGFzdCwgX19kaWdpdHNfZmlyc3QpOworI2Vsc2UKKyAgc2l6ZV90IF9fdmFsdWVfbGVuZ3RoID0gX19kaWdpdHNfbGFzdCAtIF9fZGlnaXRzX2ZpcnN0OworI2VuZGlmCisKKyAgc2l6ZV90IF9fbGVuZ3RoID0gX192YWx1ZV9sZW5ndGggKyBfX3NpZ24uc2l6ZSgpOworCisgIGlmIChfX2ZyYWNfZGlnaXRzICE9IDApCisgICAgKytfX2xlbmd0aDsKKworICBib29sIF9fZ2VuZXJhdGVfY3VyciA9IChfX3N0ci5mbGFncygpICYgaW9zX2Jhc2U6OnNob3diYXNlKSAhPTA7CisgIGlmIChfX2dlbmVyYXRlX2N1cnIpCisgICAgX19sZW5ndGggKz0gX19jdXJyX3N5bS5zaXplKCk7CisgIG1vbmV5X2Jhc2U6OnBhdHRlcm4gX19mb3JtYXQgPSBfX2ludGwgPyAoX19pc19uZWdhdGl2ZSA/IF9fcHVuY3RfaW50bC5uZWdfZm9ybWF0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX19wdW5jdF9pbnRsLnBvc19mb3JtYXQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChfX2lzX25lZ2F0aXZlID8gX19wdW5jdC5uZWdfZm9ybWF0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX19wdW5jdC5wb3NfZm9ybWF0KCkpOworICB7CisgICAgLy9Gb3IgdGhlIG1vbWVudCB0aGUgZm9sbG93aW5nIGlzIGNvbW1lbnRlZCBmb3IgZGVjb2RpbmcgcmVhc29uLgorICAgIC8vTm8gcmVhc29uIHRvIGFkZCBhIHNwYWNlIGxhc3QgaWYgdGhlIG1vbmV5IHN5bWJvbCBkbyBub3QgaGF2ZSB0byBiZSBkaXNwbGF5CisgICAgLy9pZiAoX19mb3JtYXQuZmllbGRbM10gPT0gKGNoYXIpIG1vbmV5X2Jhc2U6OnN5bWJvbCAmJiAhX19nZW5lcmF0ZV9jdXJyKSB7CisgICAgLy8gIGlmIChfX2Zvcm1hdC5maWVsZFsyXSA9PSAoY2hhcikgbW9uZXlfYmFzZTo6c3BhY2UpIHsKKyAgICAvLyAgICBfX2Zvcm1hdC5maWVsZFsyXSA9IChjaGFyKSBtb25leV9iYXNlOjpub25lOworICAgIC8vICB9CisgICAgLy99CisgICAgLy9zcGFjZSBjYW4gb25seSBiZSBzZWNvbmQgb3IgdGhpcmQgYW5kIG9ubHkgb25jZSAoMjIuMi42LjMtMSk6CisgICAgaWYgKChfX2Zvcm1hdC5maWVsZFsxXSA9PSAoY2hhcikgbW9uZXlfYmFzZTo6c3BhY2UpIHx8CisgICAgICAgIChfX2Zvcm1hdC5maWVsZFsyXSA9PSAoY2hhcikgbW9uZXlfYmFzZTo6c3BhY2UpKQorICAgICAgKytfX2xlbmd0aDsKKyAgfQorCisgIGNvbnN0IGJvb2wgX19uZWVkX2ZpbGwgPSAoKChzaXplb2Yoc3RyZWFtc2l6ZSkgPiBzaXplb2Yoc2l6ZV90KSkgJiYgKF9fU1RBVElDX0NBU1Qoc3RyZWFtc2l6ZSwgX19sZW5ndGgpIDwgX193aWR0aCkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChzaXplb2Yoc3RyZWFtc2l6ZSkgPD0gc2l6ZW9mKHNpemVfdCkpICYmIChfX2xlbmd0aCA8IF9fU1RBVElDX0NBU1Qoc2l6ZV90LCBfX3dpZHRoKSkpKTsKKyAgc3RyZWFtc2l6ZSBfX2ZpbGxfYW10ID0gX19uZWVkX2ZpbGwgPyBfX3dpZHRoIC0gX19sZW5ndGggOiAwOworCisgIGlvc19iYXNlOjpmbXRmbGFncyBfX2ZpbGxfcG9zID0gX19zdHIuZmxhZ3MoKSAmIGlvc19iYXNlOjphZGp1c3RmaWVsZDsKKworICBpZiAoX19maWxsX2FtdCAhPSAwICYmCisgICAgICAhKF9fZmlsbF9wb3MgJiAoaW9zX2Jhc2U6OmxlZnQgfCBpb3NfYmFzZTo6aW50ZXJuYWwpKSkKKyAgICBfX3MgPSBfU1RMUF9QUklWIF9fZmlsbF9uKF9fcywgX19maWxsX2FtdCwgX19maWxsKTsKKworICBmb3IgKGludCBfX2kgPSAwOyBfX2kgPCA0OyArK19faSkgeworICAgIGNoYXIgX19mZmllbGQgPSBfX2Zvcm1hdC5maWVsZFtfX2ldOworICAgIHN3aXRjaCAoX19mZmllbGQpIHsKKyAgICAgIGNhc2UgbW9uZXlfYmFzZTo6c3BhY2U6CisgICAgICAgICpfX3MrKyA9IF9fc3BhY2U7CisgICAgICBjYXNlIG1vbmV5X2Jhc2U6Om5vbmU6CisgICAgICAgIGlmIChfX2ZpbGxfYW10ICE9IDAgJiYgX19maWxsX3BvcyA9PSBpb3NfYmFzZTo6aW50ZXJuYWwpCisgICAgICAgICAgX19zID0gX1NUTFBfUFJJViBfX2ZpbGxfbihfX3MsIF9fZmlsbF9hbXQsIF9fZmlsbCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBtb25leV9iYXNlOjpzeW1ib2w6CisgICAgICAgIGlmIChfX2dlbmVyYXRlX2N1cnIpCisgICAgICAgICAgX19zID0gX1NUTFBfU1REOjpjb3B5KF9fY3Vycl9zeW0uYmVnaW4oKSwgX19jdXJyX3N5bS5lbmQoKSwgX19zKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIG1vbmV5X2Jhc2U6OnNpZ246CisgICAgICAgIGlmICghX19zaWduLmVtcHR5KCkpCisgICAgICAgICAgKl9fcysrID0gX19zaWduWzBdOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgbW9uZXlfYmFzZTo6dmFsdWU6CisgICAgICAgIGlmIChfX2ZyYWNfZGlnaXRzID09IDApIHsKKyAgICAgICAgICBfX3MgPSBfU1RMUF9TVEQ6OmNvcHkoX19kaWdpdHNfZmlyc3QsIF9fZGlnaXRzX2xhc3QsIF9fcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKChpbnQpX192YWx1ZV9sZW5ndGggPD0gX19mcmFjX2RpZ2l0cykgeworICAgICAgICAgICAgLy8gaWYgd2Ugc2VlICc5JyBoZXJlLCB3ZSBzaG91bGQgb3V0IDAuMDkKKyAgICAgICAgICAgICpfX3MrKyA9IF9femVybzsgIC8vIGludGVnZXIgcGFydCBpcyB6ZXJvCisgICAgICAgICAgICAqX19zKysgPSBfX3BvaW50OyAvLyBkZWNpbWFsIHBvaW50CisgICAgICAgICAgICBfX3MgPSAgX1NUTFBfUFJJViBfX2ZpbGxfbihfX3MsIF9fZnJhY19kaWdpdHMgLSBfX3ZhbHVlX2xlbmd0aCwgX196ZXJvKTsgLy8gemVyb3MKKyAgICAgICAgICAgIF9fcyA9IF9TVExQX1NURDo6Y29weShfX2RpZ2l0c19maXJzdCwgX19kaWdpdHNfbGFzdCwgX19zKTsgLy8gZGlnaXRzCisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9fcyA9IF9TVExQX1NURDo6Y29weShfX2RpZ2l0c19maXJzdCwgX19kaWdpdHNfbGFzdCAtIF9fZnJhY19kaWdpdHMsIF9fcyk7CisgICAgICAgICAgICBpZiAoX19mcmFjX2RpZ2l0cyAhPSAwKSB7CisgICAgICAgICAgICAgICpfX3MrKyA9IF9fcG9pbnQ7CisgICAgICAgICAgICAgIF9fcyA9IF9TVExQX1NURDo6Y29weShfX2RpZ2l0c19sYXN0IC0gX19mcmFjX2RpZ2l0cywgX19kaWdpdHNfbGFzdCwgX19zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfSAvL0Nsb3NlIGZvciBzd2l0Y2gKKyAgfSAvLyBDbG9zZSBmb3IgbG9vcAorCisgIC8vIE91cHV0IHJlc3Qgb2Ygc2lnbiBpZiBuZWNlc3NhcnkuCisgIGlmIChfX3NpZ24uc2l6ZSgpID4gMSkKKyAgICBfX3MgPSBfU1RMUF9TVEQ6OmNvcHkoX19zaWduLmJlZ2luKCkgKyAxLCBfX3NpZ24uZW5kKCksIF9fcyk7CisgIGlmIChfX2ZpbGxfYW10ICE9IDAgJiYKKyAgICAgICEoX19maWxsX3BvcyAmIChpb3NfYmFzZTo6cmlnaHQgfCBpb3NfYmFzZTo6aW50ZXJuYWwpKSkKKyAgICBfX3MgPSBfU1RMUF9QUklWIF9fZmlsbF9uKF9fcywgX19maWxsX2FtdCwgX19maWxsKTsKKworICByZXR1cm4gX19zOworfQorCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX091dHB1dEl0ZXI+CitfT3V0cHV0SXRlcgorbW9uZXlfcHV0PF9DaGFyVCwgX091dHB1dEl0ZXI+CisgOjpkb19wdXQoX091dHB1dEl0ZXIgX19zLCBib29sIF9faW50bCwgaW9zX2Jhc2UmIF9fc3RyLAorICAgICAgICAgIGNoYXJfdHlwZSBfX2ZpbGwsIF9TVExQX0xPTkdFU1RfRkxPQVRfVFlQRSBfX3VuaXRzKSBjb25zdCB7CisgIF9TVExQX0JBU0lDX0lPU1RSSU5HKGNoYXJfdHlwZSkgX19kaWdpdHM7CisgIF9TVExQX1BSSVYgX19nZXRfbW9uZXlfZGlnaXRzKF9fZGlnaXRzLCBfX3N0ciwgX191bml0cyk7CisgIHJldHVybiBfU1RMUF9QUklWIF9fbW9uZXlfZG9fcHV0KF9fcywgX19pbnRsLCBfX3N0ciwgX19maWxsLCBfX2RpZ2l0cywgZmFsc2UsIF9fU1RBVElDX0NBU1Qoc3RyaW5nX3R5cGUqLCAwKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9PdXRwdXRJdGVyPgorX091dHB1dEl0ZXIKK21vbmV5X3B1dDxfQ2hhclQsIF9PdXRwdXRJdGVyPgorIDo6ZG9fcHV0KF9PdXRwdXRJdGVyIF9fcywgYm9vbCBfX2ludGwsIGlvc19iYXNlJiBfX3N0ciwKKyAgICAgICAgICBjaGFyX3R5cGUgX19maWxsLCBjb25zdCBzdHJpbmdfdHlwZSYgX19kaWdpdHMpIGNvbnN0IHsKKyAgcmV0dXJuIF9TVExQX1BSSVYgX19tb25leV9kb19wdXQoX19zLCBfX2ludGwsIF9fc3RyLCBfX2ZpbGwsIF9fZGlnaXRzLCB0cnVlLCBfX1NUQVRJQ19DQVNUKHN0cmluZ190eXBlKiwgMCkpOworfQorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNlbmRpZiAvKiBfU1RMUF9NT05FVEFSWV9DICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9fbW9uZXRhcnkuaCBiL3N0bHBvcnQvc3RsL19tb25ldGFyeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiOTMwMTAKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9fbW9uZXRhcnkuaApAQCAtMCwwICsxLDQzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKy8vIFdBUk5JTkc6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIEMrKworLy8gc3RhbmRhcmQgbGlicmFyeSBoZWFkZXJzLiAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgdGhpcyBoZWFkZXIKKy8vIGZpbGUgZGlyZWN0bHkuCisKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9NT05FVEFSWV9ICisjZGVmaW5lIF9TVExQX0lOVEVSTkFMX01PTkVUQVJZX0gKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9PU1RSRUFNQlVGX0lURVJBVE9SX0gKKyMgIGluY2x1ZGUgPHN0bC9fb3N0cmVhbWJ1Zl9pdGVyYXRvci5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfSVNUUkVBTUJVRl9JVEVSQVRPUl9ICisjICBpbmNsdWRlIDxzdGwvX2lzdHJlYW1idWZfaXRlcmF0b3IuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0ZBQ0VUU19GV0RfSAorIyAgaW5jbHVkZSA8c3RsL19mYWNldHNfZndkLmg+CisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKK2NsYXNzIG1vbmV5X2Jhc2UgeworcHVibGljOgorICBlbnVtIHBhcnQge25vbmUsIHNwYWNlLCBzeW1ib2wsIHNpZ24sIHZhbHVlfTsKKyAgc3RydWN0IHBhdHRlcm4geworICAgIGNoYXIgZmllbGRbNF07CisgIH07Cit9OworCisvLyBtb25leXB1bmN0IGZhY2V0czogZm9yd2FyZCBkZWNsYXJhdGlvbgordGVtcGxhdGUgPGNsYXNzIF9jaGFyVCwgX1NUTFBfREZMX05PTl9UWVBFX1BBUkFNKGJvb2wsIF9JbnRlcm5hdGlvbmFsLCBmYWxzZSkgPiBjbGFzcyBtb25leXB1bmN0IHt9OworCisvLyBtb25leV9nZXQgZmFjZXRzCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9JbnB1dEl0ZXI+CitjbGFzcyBtb25leV9nZXQgOiBwdWJsaWMgbG9jYWxlOjpmYWNldCB7CitwdWJsaWM6CisgIHR5cGVkZWYgX0NoYXJUICAgICAgICAgICAgICAgY2hhcl90eXBlOworICB0eXBlZGVmIF9JbnB1dEl0ZXIgICAgICAgICAgIGl0ZXJfdHlwZTsKKyAgdHlwZWRlZiBiYXNpY19zdHJpbmc8X0NoYXJULCBjaGFyX3RyYWl0czxfQ2hhclQ+LCBhbGxvY2F0b3I8X0NoYXJUPiA+IHN0cmluZ190eXBlOworCisgIGV4cGxpY2l0IG1vbmV5X2dldChzaXplX3QgX19yZWZzID0gMCkgOiBsb2NhbGU6OmZhY2V0KF9fcmVmcykge30KKyAgaXRlcl90eXBlIGdldChpdGVyX3R5cGUgX19zLCBpdGVyX3R5cGUgIF9fZW5kLCBib29sIF9faW50bCwKKyAgICAgICAgICAgICAgICBpb3NfYmFzZSYgIF9fc3RyLCBpb3NfYmFzZTo6aW9zdGF0ZSYgIF9fZXJyLAorICAgICAgICAgICAgICAgIF9TVExQX0xPTkdFU1RfRkxPQVRfVFlQRSYgX191bml0cykgY29uc3QKKyAgeyByZXR1cm4gZG9fZ2V0KF9fcywgIF9fZW5kLCBfX2ludGwsICBfX3N0ciwgIF9fZXJyLCBfX3VuaXRzKTsgfQorICBpdGVyX3R5cGUgZ2V0KGl0ZXJfdHlwZSBfX3MsIGl0ZXJfdHlwZSAgX19lbmQsIGJvb2wgX19pbnRsLAorICAgICAgICAgICAgICAgIGlvc19iYXNlJiAgX19zdHIsIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwKKyAgICAgICAgICAgICAgICBzdHJpbmdfdHlwZSYgX19kaWdpdHMpIGNvbnN0CisgIHsgcmV0dXJuIGRvX2dldChfX3MsICBfX2VuZCwgX19pbnRsLCAgX19zdHIsICBfX2VyciwgX19kaWdpdHMpOyB9CisKKyAgc3RhdGljIGxvY2FsZTo6aWQgaWQ7CisKK3Byb3RlY3RlZDoKKyAgfm1vbmV5X2dldCgpIHt9CisgIHZpcnR1YWwgaXRlcl90eXBlIGRvX2dldChpdGVyX3R5cGUgX19zLCBpdGVyX3R5cGUgIF9fZW5kLCBib29sICBfX2ludGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZSYgIF9fc3RyLCBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9MT05HRVNUX0ZMT0FUX1RZUEUmIF9fdW5pdHMpIGNvbnN0OworICB2aXJ0dWFsIGl0ZXJfdHlwZSBkb19nZXQoaXRlcl90eXBlIF9fcywgaXRlcl90eXBlIF9fZW5kLCBib29sIF9faW50bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlJiAgX19zdHIsIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ190eXBlJiBfX2RpZ2l0cykgY29uc3Q7Cit9OworCisKKy8vIG1vbmV5cHVuY3QgZmFjZXRzOiBkZWZpbml0aW9uIG9mIHNwZWNpYWxpemF0aW9ucworCitfU1RMUF9URU1QTEFURV9OVUxMCitjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBtb25leXB1bmN0PGNoYXIsIHRydWU+IDogcHVibGljIGxvY2FsZTo6ZmFjZXQsIHB1YmxpYyBtb25leV9iYXNlIHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBjaGFyICAgICAgICAgICAgICAgICBjaGFyX3R5cGU7CisgIHR5cGVkZWYgc3RyaW5nICAgICAgICAgICAgICAgc3RyaW5nX3R5cGU7CisgIGV4cGxpY2l0IG1vbmV5cHVuY3QgX1NUTFBfUFNQRUMyKGNoYXIsIHRydWUpIChzaXplX3QgX19yZWZzID0gMCk7CisKKyAgY2hhciAgICAgICAgZGVjaW1hbF9wb2ludCgpIGNvbnN0IHsgcmV0dXJuIGRvX2RlY2ltYWxfcG9pbnQoKTsgfQorICBjaGFyICAgICAgICB0aG91c2FuZHNfc2VwKCkgY29uc3QgeyByZXR1cm4gZG9fdGhvdXNhbmRzX3NlcCgpOyB9CisgIHN0cmluZyAgICAgIGdyb3VwaW5nKCkgICAgICBjb25zdCB7IHJldHVybiBkb19ncm91cGluZygpOyB9CisgIHN0cmluZ190eXBlIGN1cnJfc3ltYm9sKCkgICBjb25zdCB7IHJldHVybiBkb19jdXJyX3N5bWJvbCgpOyB9CisgIHN0cmluZ190eXBlIHBvc2l0aXZlX3NpZ24oKSBjb25zdCB7IHJldHVybiBkb19wb3NpdGl2ZV9zaWduKCk7IH0KKyAgc3RyaW5nX3R5cGUgbmVnYXRpdmVfc2lnbigpIGNvbnN0IHsgcmV0dXJuIGRvX25lZ2F0aXZlX3NpZ24oKTsgfQorICBpbnQgICAgICAgICBmcmFjX2RpZ2l0cygpICAgY29uc3QgeyByZXR1cm4gZG9fZnJhY19kaWdpdHMoKTsgfQorICBwYXR0ZXJuICAgICBwb3NfZm9ybWF0KCkgICAgY29uc3QgeyByZXR1cm4gZG9fcG9zX2Zvcm1hdCgpOyB9CisgIHBhdHRlcm4gICAgIG5lZ19mb3JtYXQoKSAgICBjb25zdCB7IHJldHVybiBkb19uZWdfZm9ybWF0KCk7IH0KKworICBzdGF0aWMgX1NUTFBfU1RBVElDX0RFQ0xTUEVDIGxvY2FsZTo6aWQgaWQ7CisgIF9TVExQX1NUQVRJQ19DT05TVEFOVChib29sLCBpbnRsID0gdHJ1ZSk7CisKK3Byb3RlY3RlZDoKKyAgcGF0dGVybiBfTV9wb3NfZm9ybWF0OworICBwYXR0ZXJuIF9NX25lZ19mb3JtYXQ7CisKKyAgfm1vbmV5cHVuY3QgX1NUTFBfUFNQRUMyKGNoYXIsIHRydWUpICgpOworCisgIHZpcnR1YWwgY2hhciAgICAgICAgZG9fZGVjaW1hbF9wb2ludCgpIGNvbnN0OworICB2aXJ0dWFsIGNoYXIgICAgICAgIGRvX3Rob3VzYW5kc19zZXAoKSBjb25zdDsKKyAgdmlydHVhbCBzdHJpbmcgICAgICBkb19ncm91cGluZygpICAgICAgY29uc3Q7CisKKyAgdmlydHVhbCBzdHJpbmcgICAgICBkb19jdXJyX3N5bWJvbCgpICAgY29uc3Q7CisKKyAgdmlydHVhbCBzdHJpbmcgICAgICBkb19wb3NpdGl2ZV9zaWduKCkgY29uc3Q7CisgIHZpcnR1YWwgc3RyaW5nICAgICAgZG9fbmVnYXRpdmVfc2lnbigpIGNvbnN0OworICB2aXJ0dWFsIGludCAgICAgICAgIGRvX2ZyYWNfZGlnaXRzKCkgICBjb25zdDsKKyAgdmlydHVhbCBwYXR0ZXJuICAgICBkb19wb3NfZm9ybWF0KCkgICAgY29uc3Q7CisgIHZpcnR1YWwgcGF0dGVybiAgICAgZG9fbmVnX2Zvcm1hdCgpICAgIGNvbnN0OworfTsKKworX1NUTFBfVEVNUExBVEVfTlVMTAorY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgbW9uZXlwdW5jdDxjaGFyLCBmYWxzZT4gOiBwdWJsaWMgbG9jYWxlOjpmYWNldCwgcHVibGljIG1vbmV5X2Jhc2UgeworcHVibGljOgorICB0eXBlZGVmIGNoYXIgICAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKKyAgdHlwZWRlZiBzdHJpbmcgICAgICAgICAgICAgICBzdHJpbmdfdHlwZTsKKworICBleHBsaWNpdCBtb25leXB1bmN0IF9TVExQX1BTUEVDMihjaGFyLCBmYWxzZSkgKHNpemVfdCBfX3JlZnMgPSAwKTsKKworICBjaGFyICAgICAgICBkZWNpbWFsX3BvaW50KCkgY29uc3QgeyByZXR1cm4gZG9fZGVjaW1hbF9wb2ludCgpOyB9CisgIGNoYXIgICAgICAgIHRob3VzYW5kc19zZXAoKSBjb25zdCB7IHJldHVybiBkb190aG91c2FuZHNfc2VwKCk7IH0KKyAgc3RyaW5nICAgICAgZ3JvdXBpbmcoKSAgICAgIGNvbnN0IHsgcmV0dXJuIGRvX2dyb3VwaW5nKCk7IH0KKyAgc3RyaW5nX3R5cGUgY3Vycl9zeW1ib2woKSAgIGNvbnN0IHsgcmV0dXJuIGRvX2N1cnJfc3ltYm9sKCk7IH0KKyAgc3RyaW5nX3R5cGUgcG9zaXRpdmVfc2lnbigpIGNvbnN0IHsgcmV0dXJuIGRvX3Bvc2l0aXZlX3NpZ24oKTsgfQorICBzdHJpbmdfdHlwZSBuZWdhdGl2ZV9zaWduKCkgY29uc3QgeyByZXR1cm4gZG9fbmVnYXRpdmVfc2lnbigpOyB9CisgIGludCAgICAgICAgIGZyYWNfZGlnaXRzKCkgICBjb25zdCB7IHJldHVybiBkb19mcmFjX2RpZ2l0cygpOyB9CisgIHBhdHRlcm4gICAgIHBvc19mb3JtYXQoKSAgICBjb25zdCB7IHJldHVybiBkb19wb3NfZm9ybWF0KCk7IH0KKyAgcGF0dGVybiAgICAgbmVnX2Zvcm1hdCgpICAgIGNvbnN0IHsgcmV0dXJuIGRvX25lZ19mb3JtYXQoKTsgfQorCisgIHN0YXRpYyBfU1RMUF9TVEFUSUNfREVDTFNQRUMgbG9jYWxlOjppZCBpZDsKKyAgX1NUTFBfU1RBVElDX0NPTlNUQU5UKGJvb2wsIGludGwgPSBmYWxzZSk7CisKK3Byb3RlY3RlZDoKKyAgcGF0dGVybiBfTV9wb3NfZm9ybWF0OworICBwYXR0ZXJuIF9NX25lZ19mb3JtYXQ7CisKKyAgfm1vbmV5cHVuY3QgX1NUTFBfUFNQRUMyKGNoYXIsIGZhbHNlKSAoKTsKKworICB2aXJ0dWFsIGNoYXIgICAgICAgIGRvX2RlY2ltYWxfcG9pbnQoKSBjb25zdDsKKyAgdmlydHVhbCBjaGFyICAgICAgICBkb190aG91c2FuZHNfc2VwKCkgY29uc3Q7CisgIHZpcnR1YWwgc3RyaW5nICAgICAgZG9fZ3JvdXBpbmcoKSAgICAgIGNvbnN0OworCisgIHZpcnR1YWwgc3RyaW5nICAgICAgZG9fY3Vycl9zeW1ib2woKSAgIGNvbnN0OworCisgIHZpcnR1YWwgc3RyaW5nICAgICAgZG9fcG9zaXRpdmVfc2lnbigpIGNvbnN0OworICB2aXJ0dWFsIHN0cmluZyAgICAgIGRvX25lZ2F0aXZlX3NpZ24oKSBjb25zdDsKKyAgdmlydHVhbCBpbnQgICAgICAgICBkb19mcmFjX2RpZ2l0cygpICAgY29uc3Q7CisgIHZpcnR1YWwgcGF0dGVybiAgICAgZG9fcG9zX2Zvcm1hdCgpICAgIGNvbnN0OworICB2aXJ0dWFsIHBhdHRlcm4gICAgIGRvX25lZ19mb3JtYXQoKSAgICBjb25zdDsKK307CisKKworI2lmbmRlZiBfU1RMUF9OT19XQ0hBUl9UCisKK19TVExQX1RFTVBMQVRFX05VTEwKK2NsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIG1vbmV5cHVuY3Q8d2NoYXJfdCwgdHJ1ZT4gOiBwdWJsaWMgbG9jYWxlOjpmYWNldCwgcHVibGljIG1vbmV5X2Jhc2UgeworcHVibGljOgorICB0eXBlZGVmIHdjaGFyX3QgICAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKKyAgdHlwZWRlZiB3c3RyaW5nICAgICAgICAgICAgICAgICBzdHJpbmdfdHlwZTsKKyAgZXhwbGljaXQgbW9uZXlwdW5jdCBfU1RMUF9QU1BFQzIod2NoYXJfdCwgdHJ1ZSkgKHNpemVfdCBfX3JlZnMgPSAwKTsKKyAgd2NoYXJfdCAgICAgZGVjaW1hbF9wb2ludCgpIGNvbnN0IHsgcmV0dXJuIGRvX2RlY2ltYWxfcG9pbnQoKTsgfQorICB3Y2hhcl90ICAgICB0aG91c2FuZHNfc2VwKCkgY29uc3QgeyByZXR1cm4gZG9fdGhvdXNhbmRzX3NlcCgpOyB9CisgIHN0cmluZyAgICAgIGdyb3VwaW5nKCkgICAgICBjb25zdCB7IHJldHVybiBkb19ncm91cGluZygpOyB9CisgIHN0cmluZ190eXBlIGN1cnJfc3ltYm9sKCkgICBjb25zdCB7IHJldHVybiBkb19jdXJyX3N5bWJvbCgpOyB9CisgIHN0cmluZ190eXBlIHBvc2l0aXZlX3NpZ24oKSBjb25zdCB7IHJldHVybiBkb19wb3NpdGl2ZV9zaWduKCk7IH0KKyAgc3RyaW5nX3R5cGUgbmVnYXRpdmVfc2lnbigpIGNvbnN0IHsgcmV0dXJuIGRvX25lZ2F0aXZlX3NpZ24oKTsgfQorICBpbnQgICAgICAgICBmcmFjX2RpZ2l0cygpICAgY29uc3QgeyByZXR1cm4gZG9fZnJhY19kaWdpdHMoKTsgfQorICBwYXR0ZXJuICAgICBwb3NfZm9ybWF0KCkgICAgY29uc3QgeyByZXR1cm4gZG9fcG9zX2Zvcm1hdCgpOyB9CisgIHBhdHRlcm4gICAgIG5lZ19mb3JtYXQoKSAgICBjb25zdCB7IHJldHVybiBkb19uZWdfZm9ybWF0KCk7IH0KKworICBzdGF0aWMgX1NUTFBfU1RBVElDX0RFQ0xTUEVDIGxvY2FsZTo6aWQgaWQ7CisgIF9TVExQX1NUQVRJQ19DT05TVEFOVChib29sLCBpbnRsID0gdHJ1ZSk7CisKK3Byb3RlY3RlZDoKKyAgcGF0dGVybiBfTV9wb3NfZm9ybWF0OworICBwYXR0ZXJuIF9NX25lZ19mb3JtYXQ7CisKKyAgfm1vbmV5cHVuY3QgX1NUTFBfUFNQRUMyKHdjaGFyX3QsIHRydWUpICgpOworCisgIHZpcnR1YWwgd2NoYXJfdCAgICAgZG9fZGVjaW1hbF9wb2ludCgpIGNvbnN0OworICB2aXJ0dWFsIHdjaGFyX3QgICAgIGRvX3Rob3VzYW5kc19zZXAoKSBjb25zdDsKKyAgdmlydHVhbCBzdHJpbmcgICAgICBkb19ncm91cGluZygpICAgICAgY29uc3Q7CisKKyAgdmlydHVhbCBzdHJpbmdfdHlwZSBkb19jdXJyX3N5bWJvbCgpICAgY29uc3Q7CisKKyAgdmlydHVhbCBzdHJpbmdfdHlwZSBkb19wb3NpdGl2ZV9zaWduKCkgY29uc3Q7CisgIHZpcnR1YWwgc3RyaW5nX3R5cGUgZG9fbmVnYXRpdmVfc2lnbigpIGNvbnN0OworICB2aXJ0dWFsIGludCAgICAgICAgIGRvX2ZyYWNfZGlnaXRzKCkgICBjb25zdDsKKyAgdmlydHVhbCBwYXR0ZXJuICAgICBkb19wb3NfZm9ybWF0KCkgICAgY29uc3Q7CisgIHZpcnR1YWwgcGF0dGVybiAgICAgZG9fbmVnX2Zvcm1hdCgpICAgIGNvbnN0OworfTsKKworCitfU1RMUF9URU1QTEFURV9OVUxMCitjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBtb25leXB1bmN0PHdjaGFyX3QsIGZhbHNlPiA6IHB1YmxpYyBsb2NhbGU6OmZhY2V0LCBwdWJsaWMgbW9uZXlfYmFzZSB7CitwdWJsaWM6CisgIHR5cGVkZWYgd2NoYXJfdCAgICAgICAgICAgICAgICAgY2hhcl90eXBlOworICB0eXBlZGVmIHdzdHJpbmcgICAgICAgICAgICAgICAgIHN0cmluZ190eXBlOworICBleHBsaWNpdCBtb25leXB1bmN0IF9TVExQX1BTUEVDMih3Y2hhcl90LCBmYWxzZSkgKHNpemVfdCBfX3JlZnMgPSAwKTsKKyAgd2NoYXJfdCAgICAgZGVjaW1hbF9wb2ludCgpIGNvbnN0IHsgcmV0dXJuIGRvX2RlY2ltYWxfcG9pbnQoKTsgfQorICB3Y2hhcl90ICAgICB0aG91c2FuZHNfc2VwKCkgY29uc3QgeyByZXR1cm4gZG9fdGhvdXNhbmRzX3NlcCgpOyB9CisgIHN0cmluZyAgICAgIGdyb3VwaW5nKCkgICAgICBjb25zdCB7IHJldHVybiBkb19ncm91cGluZygpOyB9CisgIHN0cmluZ190eXBlIGN1cnJfc3ltYm9sKCkgICBjb25zdCB7IHJldHVybiBkb19jdXJyX3N5bWJvbCgpOyB9CisgIHN0cmluZ190eXBlIHBvc2l0aXZlX3NpZ24oKSBjb25zdCB7IHJldHVybiBkb19wb3NpdGl2ZV9zaWduKCk7IH0KKyAgc3RyaW5nX3R5cGUgbmVnYXRpdmVfc2lnbigpIGNvbnN0IHsgcmV0dXJuIGRvX25lZ2F0aXZlX3NpZ24oKTsgfQorICBpbnQgICAgICAgICBmcmFjX2RpZ2l0cygpICAgY29uc3QgeyByZXR1cm4gZG9fZnJhY19kaWdpdHMoKTsgfQorICBwYXR0ZXJuICAgICBwb3NfZm9ybWF0KCkgICAgY29uc3QgeyByZXR1cm4gZG9fcG9zX2Zvcm1hdCgpOyB9CisgIHBhdHRlcm4gICAgIG5lZ19mb3JtYXQoKSAgICBjb25zdCB7IHJldHVybiBkb19uZWdfZm9ybWF0KCk7IH0KKworICBzdGF0aWMgX1NUTFBfU1RBVElDX0RFQ0xTUEVDIGxvY2FsZTo6aWQgaWQ7CisgIF9TVExQX1NUQVRJQ19DT05TVEFOVChib29sLCBpbnRsID0gZmFsc2UpOworCitwcm90ZWN0ZWQ6CisgIHBhdHRlcm4gX01fcG9zX2Zvcm1hdDsKKyAgcGF0dGVybiBfTV9uZWdfZm9ybWF0OworCisgIH5tb25leXB1bmN0IF9TVExQX1BTUEVDMih3Y2hhcl90LCBmYWxzZSkgKCk7CisKKyAgdmlydHVhbCB3Y2hhcl90ICAgICBkb19kZWNpbWFsX3BvaW50KCkgY29uc3Q7CisgIHZpcnR1YWwgd2NoYXJfdCAgICAgZG9fdGhvdXNhbmRzX3NlcCgpIGNvbnN0OworICB2aXJ0dWFsIHN0cmluZyAgICAgIGRvX2dyb3VwaW5nKCkgICAgICBjb25zdDsKKworICB2aXJ0dWFsIHN0cmluZ190eXBlIGRvX2N1cnJfc3ltYm9sKCkgICBjb25zdDsKKworICB2aXJ0dWFsIHN0cmluZ190eXBlIGRvX3Bvc2l0aXZlX3NpZ24oKSBjb25zdDsKKyAgdmlydHVhbCBzdHJpbmdfdHlwZSBkb19uZWdhdGl2ZV9zaWduKCkgY29uc3Q7CisgIHZpcnR1YWwgaW50ICAgICAgICAgZG9fZnJhY19kaWdpdHMoKSAgIGNvbnN0OworICB2aXJ0dWFsIHBhdHRlcm4gICAgIGRvX3Bvc19mb3JtYXQoKSAgICBjb25zdDsKKyAgdmlydHVhbCBwYXR0ZXJuICAgICBkb19uZWdfZm9ybWF0KCkgICAgY29uc3Q7Cit9OworCisjIGVuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfY2hhclQsIF9TVExQX0RGTF9OT05fVFlQRV9QQVJBTShib29sICwgX0ludGVybmF0aW9uYWwgLCBmYWxzZSkgPiBjbGFzcyBtb25leXB1bmN0X2J5bmFtZSB7fTsKKworX1NUTFBfVEVNUExBVEVfTlVMTAorY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgbW9uZXlwdW5jdF9ieW5hbWU8Y2hhciwgdHJ1ZT4gOiBwdWJsaWMgbW9uZXlwdW5jdDxjaGFyLCB0cnVlPiB7CisgIGZyaWVuZCBjbGFzcyBfTG9jYWxlX2ltcGw7CitwdWJsaWM6CisgIHR5cGVkZWYgbW9uZXlfYmFzZTo6cGF0dGVybiAgIHBhdHRlcm47CisgIHR5cGVkZWYgY2hhciAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKKyAgdHlwZWRlZiBzdHJpbmcgICAgICAgICAgICAgICAgc3RyaW5nX3R5cGU7CisKKyAgZXhwbGljaXQgbW9uZXlwdW5jdF9ieW5hbWUgX1NUTFBfUFNQRUMyKGNoYXIsIHRydWUpIChjb25zdCBjaGFyICogX19uYW1lLCBzaXplX3QgX19yZWZzID0gMCk7CisKK3Byb3RlY3RlZDoKKyAgfm1vbmV5cHVuY3RfYnluYW1lIF9TVExQX1BTUEVDMihjaGFyLCB0cnVlKSAoKTsKKyAgdmlydHVhbCBjaGFyICAgICAgICBkb19kZWNpbWFsX3BvaW50KCkgY29uc3Q7CisgIHZpcnR1YWwgY2hhciAgICAgICAgZG9fdGhvdXNhbmRzX3NlcCgpIGNvbnN0OworICB2aXJ0dWFsIHN0cmluZyAgICAgIGRvX2dyb3VwaW5nKCkgICAgICBjb25zdDsKKworICB2aXJ0dWFsIHN0cmluZ190eXBlIGRvX2N1cnJfc3ltYm9sKCkgICBjb25zdDsKKworICB2aXJ0dWFsIHN0cmluZ190eXBlIGRvX3Bvc2l0aXZlX3NpZ24oKSBjb25zdDsKKyAgdmlydHVhbCBzdHJpbmdfdHlwZSBkb19uZWdhdGl2ZV9zaWduKCkgY29uc3Q7CisgIHZpcnR1YWwgaW50ICAgICAgICAgZG9fZnJhY19kaWdpdHMoKSAgIGNvbnN0OworCitwcml2YXRlOgorICBtb25leXB1bmN0X2J5bmFtZSBfU1RMUF9QU1BFQzIoY2hhciwgdHJ1ZSkgKF9Mb2NhbGVfbW9uZXRhcnkgKl9fbW9uZXRhcnkpOworCisgIHR5cGVkZWYgbW9uZXlwdW5jdF9ieW5hbWU8Y2hhciwgdHJ1ZT4gX1NlbGY7CisgIC8vZXhwbGljaXRlbHkgZGVmaW5lZCBhcyBwcml2YXRlIHRvIGF2b2lkIHdhcm5pbmdzOgorICBtb25leXB1bmN0X2J5bmFtZShfU2VsZiBjb25zdCYpOworICBfU2VsZiYgb3BlcmF0b3IgPSAoX1NlbGYgY29uc3QmKTsKKworICBfTG9jYWxlX21vbmV0YXJ5KiBfTV9tb25ldGFyeTsKK307CisKK19TVExQX1RFTVBMQVRFX05VTEwKK2NsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIG1vbmV5cHVuY3RfYnluYW1lPGNoYXIsIGZhbHNlPiA6IHB1YmxpYyBtb25leXB1bmN0PGNoYXIsIGZhbHNlPiB7CisgIGZyaWVuZCBjbGFzcyBfTG9jYWxlX2ltcGw7CitwdWJsaWM6CisgIHR5cGVkZWYgbW9uZXlfYmFzZTo6cGF0dGVybiAgIHBhdHRlcm47CisgIHR5cGVkZWYgY2hhciAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKKyAgdHlwZWRlZiBzdHJpbmcgICAgICAgICAgICAgICAgc3RyaW5nX3R5cGU7CisKKyAgZXhwbGljaXQgbW9uZXlwdW5jdF9ieW5hbWUgX1NUTFBfUFNQRUMyKGNoYXIsIGZhbHNlKSAoY29uc3QgY2hhciAqIF9fbmFtZSwgc2l6ZV90IF9fcmVmcyA9IDApOworCitwcm90ZWN0ZWQ6CisgIH5tb25leXB1bmN0X2J5bmFtZSBfU1RMUF9QU1BFQzIoY2hhciwgZmFsc2UpICgpOworICB2aXJ0dWFsIGNoYXIgICAgICAgIGRvX2RlY2ltYWxfcG9pbnQoKSBjb25zdDsKKyAgdmlydHVhbCBjaGFyICAgICAgICBkb190aG91c2FuZHNfc2VwKCkgY29uc3Q7CisgIHZpcnR1YWwgc3RyaW5nICAgICAgZG9fZ3JvdXBpbmcoKSAgICAgIGNvbnN0OworCisgIHZpcnR1YWwgc3RyaW5nX3R5cGUgZG9fY3Vycl9zeW1ib2woKSAgIGNvbnN0OworCisgIHZpcnR1YWwgc3RyaW5nX3R5cGUgZG9fcG9zaXRpdmVfc2lnbigpIGNvbnN0OworICB2aXJ0dWFsIHN0cmluZ190eXBlIGRvX25lZ2F0aXZlX3NpZ24oKSBjb25zdDsKKyAgdmlydHVhbCBpbnQgICAgICAgICBkb19mcmFjX2RpZ2l0cygpICAgY29uc3Q7CisKK3ByaXZhdGU6CisgIG1vbmV5cHVuY3RfYnluYW1lIF9TVExQX1BTUEVDMihjaGFyLCBmYWxzZSkgKF9Mb2NhbGVfbW9uZXRhcnkgKl9fbW9uZXRhcnkpOworCisgIHR5cGVkZWYgbW9uZXlwdW5jdF9ieW5hbWU8Y2hhciwgZmFsc2U+IF9TZWxmOworICAvL2V4cGxpY2l0ZWx5IGRlZmluZWQgYXMgcHJpdmF0ZSB0byBhdm9pZCB3YXJuaW5nczoKKyAgbW9uZXlwdW5jdF9ieW5hbWUoX1NlbGYgY29uc3QmKTsKKyAgX1NlbGYmIG9wZXJhdG9yID0gKF9TZWxmIGNvbnN0Jik7CisKKyAgX0xvY2FsZV9tb25ldGFyeSogX01fbW9uZXRhcnk7Cit9OworCisjaWYgIWRlZmluZWQgKF9TVExQX05PX1dDSEFSX1QpCitfU1RMUF9URU1QTEFURV9OVUxMCitjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBtb25leXB1bmN0X2J5bmFtZTx3Y2hhcl90LCB0cnVlPiA6IHB1YmxpYyBtb25leXB1bmN0PHdjaGFyX3QsIHRydWU+IHsKKyAgZnJpZW5kIGNsYXNzIF9Mb2NhbGVfaW1wbDsKK3B1YmxpYzoKKyAgdHlwZWRlZiBtb25leV9iYXNlOjpwYXR0ZXJuICAgcGF0dGVybjsKKyAgdHlwZWRlZiB3Y2hhcl90ICAgICAgICAgICAgICAgY2hhcl90eXBlOworICB0eXBlZGVmIHdzdHJpbmcgICAgICAgICAgICAgICBzdHJpbmdfdHlwZTsKKworICBleHBsaWNpdCBtb25leXB1bmN0X2J5bmFtZSBfU1RMUF9QU1BFQzIod2NoYXJfdCwgdHJ1ZSkgKGNvbnN0IGNoYXIgKiBfX25hbWUsIHNpemVfdCBfX3JlZnMgPSAwKTsKKworcHJvdGVjdGVkOgorICB+bW9uZXlwdW5jdF9ieW5hbWUgX1NUTFBfUFNQRUMyKHdjaGFyX3QsIHRydWUpICgpOworICB2aXJ0dWFsIHdjaGFyX3QgICAgIGRvX2RlY2ltYWxfcG9pbnQoKSBjb25zdDsKKyAgdmlydHVhbCB3Y2hhcl90ICAgICBkb190aG91c2FuZHNfc2VwKCkgY29uc3Q7CisgIHZpcnR1YWwgc3RyaW5nICAgICAgZG9fZ3JvdXBpbmcoKSAgICAgIGNvbnN0OworCisgIHZpcnR1YWwgc3RyaW5nX3R5cGUgZG9fY3Vycl9zeW1ib2woKSAgIGNvbnN0OworCisgIHZpcnR1YWwgc3RyaW5nX3R5cGUgZG9fcG9zaXRpdmVfc2lnbigpIGNvbnN0OworICB2aXJ0dWFsIHN0cmluZ190eXBlIGRvX25lZ2F0aXZlX3NpZ24oKSBjb25zdDsKKyAgdmlydHVhbCBpbnQgICAgICAgICBkb19mcmFjX2RpZ2l0cygpICAgY29uc3Q7CisKK3ByaXZhdGU6CisgIG1vbmV5cHVuY3RfYnluYW1lIF9TVExQX1BTUEVDMih3Y2hhcl90LCB0cnVlKSAoX0xvY2FsZV9tb25ldGFyeSAqX19tb25ldGFyeSk7CisKKyAgdHlwZWRlZiBtb25leXB1bmN0X2J5bmFtZTx3Y2hhcl90LCB0cnVlPiBfU2VsZjsKKyAgLy9leHBsaWNpdGVseSBkZWZpbmVkIGFzIHByaXZhdGUgdG8gYXZvaWQgd2FybmluZ3M6CisgIG1vbmV5cHVuY3RfYnluYW1lKF9TZWxmIGNvbnN0Jik7CisgIF9TZWxmJiBvcGVyYXRvciA9IChfU2VsZiBjb25zdCYpOworCisgIF9Mb2NhbGVfbW9uZXRhcnkqIF9NX21vbmV0YXJ5OworfTsKKworX1NUTFBfVEVNUExBVEVfTlVMTAorY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgbW9uZXlwdW5jdF9ieW5hbWU8d2NoYXJfdCwgZmFsc2U+IDogcHVibGljIG1vbmV5cHVuY3Q8d2NoYXJfdCwgZmFsc2U+IHsKKyAgZnJpZW5kIGNsYXNzIF9Mb2NhbGVfaW1wbDsKK3B1YmxpYzoKKyAgdHlwZWRlZiBtb25leV9iYXNlOjpwYXR0ZXJuICAgcGF0dGVybjsKKyAgdHlwZWRlZiB3Y2hhcl90ICAgICAgICAgICAgICAgY2hhcl90eXBlOworICB0eXBlZGVmIHdzdHJpbmcgICAgICAgICAgICAgICBzdHJpbmdfdHlwZTsKKworICBleHBsaWNpdCBtb25leXB1bmN0X2J5bmFtZSBfU1RMUF9QU1BFQzIod2NoYXJfdCwgZmFsc2UpIChjb25zdCBjaGFyICogX19uYW1lLCBzaXplX3QgX19yZWZzID0gMCk7CisKK3Byb3RlY3RlZDoKKyAgfm1vbmV5cHVuY3RfYnluYW1lIF9TVExQX1BTUEVDMih3Y2hhcl90LCBmYWxzZSkgKCk7CisgIHZpcnR1YWwgd2NoYXJfdCAgICAgZG9fZGVjaW1hbF9wb2ludCgpIGNvbnN0OworICB2aXJ0dWFsIHdjaGFyX3QgICAgIGRvX3Rob3VzYW5kc19zZXAoKSBjb25zdDsKKyAgdmlydHVhbCBzdHJpbmcgICAgICBkb19ncm91cGluZygpICAgICAgY29uc3Q7CisKKyAgdmlydHVhbCBzdHJpbmdfdHlwZSBkb19jdXJyX3N5bWJvbCgpICAgY29uc3Q7CisKKyAgdmlydHVhbCBzdHJpbmdfdHlwZSBkb19wb3NpdGl2ZV9zaWduKCkgY29uc3Q7CisgIHZpcnR1YWwgc3RyaW5nX3R5cGUgZG9fbmVnYXRpdmVfc2lnbigpIGNvbnN0OworICB2aXJ0dWFsIGludCAgICAgICAgIGRvX2ZyYWNfZGlnaXRzKCkgICBjb25zdDsKKworcHJpdmF0ZToKKyAgbW9uZXlwdW5jdF9ieW5hbWUgX1NUTFBfUFNQRUMyKHdjaGFyX3QsIGZhbHNlKSAoX0xvY2FsZV9tb25ldGFyeSAqX19tb25ldGFyeSk7CisKKyAgdHlwZWRlZiBtb25leXB1bmN0X2J5bmFtZTx3Y2hhcl90LCBmYWxzZT4gX1NlbGY7CisgIC8vZXhwbGljaXRlbHkgZGVmaW5lZCBhcyBwcml2YXRlIHRvIGF2b2lkIHdhcm5pbmdzOgorICBtb25leXB1bmN0X2J5bmFtZShfU2VsZiBjb25zdCYpOworICBfU2VsZiYgb3BlcmF0b3IgPSAoX1NlbGYgY29uc3QmKTsKKworICBfTG9jYWxlX21vbmV0YXJ5KiBfTV9tb25ldGFyeTsKK307CisjZW5kaWYKKworLy89PT09PSBtZXRob2RzID09PT09PQorCisKKy8vIG1vbmV5X3B1dCBmYWNldHMKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX091dHB1dEl0ZXI+CitjbGFzcyBtb25leV9wdXQgOiBwdWJsaWMgbG9jYWxlOjpmYWNldCB7CitwdWJsaWM6CisgIHR5cGVkZWYgX0NoYXJUICAgICAgICAgICAgICAgY2hhcl90eXBlOworICB0eXBlZGVmIF9PdXRwdXRJdGVyICAgICAgICAgIGl0ZXJfdHlwZTsKKyAgdHlwZWRlZiBiYXNpY19zdHJpbmc8X0NoYXJULCBjaGFyX3RyYWl0czxfQ2hhclQ+LCBhbGxvY2F0b3I8X0NoYXJUPiA+IHN0cmluZ190eXBlOworCisgIGV4cGxpY2l0IG1vbmV5X3B1dChzaXplX3QgX19yZWZzID0gMCkgOiBsb2NhbGU6OmZhY2V0KF9fcmVmcykge30KKyAgaXRlcl90eXBlIHB1dChpdGVyX3R5cGUgX19zLCBib29sIF9faW50bCwgaW9zX2Jhc2UmIF9fc3RyLAorICAgICAgICAgICAgICAgIGNoYXJfdHlwZSAgX19maWxsLCBfU1RMUF9MT05HRVNUX0ZMT0FUX1RZUEUgX191bml0cykgY29uc3QKKyAgICB7IHJldHVybiBkb19wdXQoX19zLCBfX2ludGwsIF9fc3RyLCBfX2ZpbGwsIF9fdW5pdHMpOyB9CisgIGl0ZXJfdHlwZSBwdXQoaXRlcl90eXBlIF9fcywgYm9vbCBfX2ludGwsIGlvc19iYXNlJiBfX3N0ciwKKyAgICAgICAgICAgICAgICBjaGFyX3R5cGUgIF9fZmlsbCwKKyAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmdfdHlwZSYgX19kaWdpdHMpIGNvbnN0CisgICAgeyByZXR1cm4gZG9fcHV0KF9fcywgX19pbnRsLCBfX3N0ciwgX19maWxsLCBfX2RpZ2l0cyk7IH0KKworICBzdGF0aWMgbG9jYWxlOjppZCBpZDsKKworcHJvdGVjdGVkOgorICB+bW9uZXlfcHV0KCkge30KKyAgdmlydHVhbCBpdGVyX3R5cGUgZG9fcHV0KGl0ZXJfdHlwZSBfX3MsIGJvb2wgIF9faW50bCwgaW9zX2Jhc2UmICBfX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZSBfX2ZpbGwsIF9TVExQX0xPTkdFU1RfRkxPQVRfVFlQRSBfX3VuaXRzKSBjb25zdDsKKyAgdmlydHVhbCBpdGVyX3R5cGUgZG9fcHV0KGl0ZXJfdHlwZSBfX3MsIGJvb2wgIF9faW50bCwgaW9zX2Jhc2UmICBfX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZSBfX2ZpbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmdfdHlwZSYgX19kaWdpdHMpIGNvbnN0OworfTsKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9URU1QTEFURV9FWFBPUlQpCitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgbW9uZXlfZ2V0PGNoYXIsIGlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiA+OworX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIG1vbmV5X3B1dDxjaGFyLCBvc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4gPjsKKyMgIGlmICEgZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBtb25leV9nZXQ8d2NoYXJfdCwgaXN0cmVhbWJ1Zl9pdGVyYXRvcjx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+ID47CitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgbW9uZXlfcHV0PHdjaGFyX3QsIG9zdHJlYW1idWZfaXRlcmF0b3I8d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPiA+OworIyAgZW5kaWYKKyNlbmRpZgorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNpZiBkZWZpbmVkIChfU1RMUF9FWFBPU0VfU1RSRUFNX0lNUExFTUVOVEFUSU9OKSAmJiAhZGVmaW5lZCAoX1NUTFBfTElOS19USU1FX0lOU1RBTlRJQVRJT04pCisjICBpbmNsdWRlIDxzdGwvX21vbmV0YXJ5LmM+CisjZW5kaWYKKworI2VuZGlmIC8qIF9TVExQX0lOVEVSTkFMX01PTkVUQVJZX0ggKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKKworCmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9fbW92ZV9jb25zdHJ1Y3RfZndrLmggYi9zdGxwb3J0L3N0bC9fbW92ZV9jb25zdHJ1Y3RfZndrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE4NWZlMwotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc3RsL19tb3ZlX2NvbnN0cnVjdF9md2suaApAQCAtMCwwICsxLDE1OSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMKKyAqIEZyYW5jb2lzIER1bW9udAorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX01PVkVfQ09OU1RSVUNUX0ZXS19ICisjZGVmaW5lIF9TVExQX01PVkVfQ09OU1RSVUNUX0ZXS19ICisKKyNpZm5kZWYgX1NUTFBfVFlQRV9UUkFJVFNfSAorIyAgaW5jbHVkZSA8c3RsL3R5cGVfdHJhaXRzLmg+CisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNb3ZlIGNvbnN0cnVjdG9yIGZyYW1ld29yaworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKlBhcnRpYWwgbW92ZToKKyAqVGhlIHNvdXJjZSBIQVMgdG8gYmUgYSB2YWxpZCBpbnN0YW5jZSBhZnRlciB0aGUgbW92ZSEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2NsYXNzIF9fbW92ZV9zb3VyY2UgeworcHVibGljOgorICBleHBsaWNpdCBfX21vdmVfc291cmNlIChfVHAgJl9zcmMpIDogX01fZGF0YShfc3JjKQorICB7fQorCisgIF9UcCYgZ2V0KCkgY29uc3QKKyAgeyByZXR1cm4gX01fZGF0YTsgfQorcHJpdmF0ZToKKyAgX1RwICZfTV9kYXRhOworCisgIC8vV2UgZXhwbGljaXRlbHkgZm9yYmlkIGFzc2lnbm1lbnQgdG8gYXZvaWQgd2FybmluZzoKKyAgdHlwZWRlZiBfX21vdmVfc291cmNlPF9UcD4gX1NlbGY7CisgIF9TZWxmJiBvcGVyYXRvciA9IChfU2VsZiBjb25zdCYpOworfTsKKworLy9DbGFzcyB1c2VkIHRvIHNpZ25hbCBtb3ZlIGNvbnN0cnVjdG9yIHN1cHBvcnQsIGltcGxlbWVudGF0aW9uIGFuZCB0eXBlLgordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfX21vdmVfdHJhaXRzIHsKKyAgLyoKKyAgICogaW1wbGVtZW50ZWQgdGVsbHMgaWYgYSB0aGUgc3BlY2lhbCBtb3ZlIGNvbnN0cnVjdG9yIGhhcyB0byBiZSBjYWxsZWQgb3IgdGhlIGNsYXNzaWMKKyAgICogY29weSBjb25zdHJ1Y3RvciBpcyBqdXN0IGZpbmUuIE1vc3Qgb2YgdGhlIHRpbWUgdGhlIGNvcHkgY29uc3RydWN0b3IgaXMgZmluZSBvbmx5CisgICAqIGlmIHRoZSBmb2xsb3dpbmcgaW5mbyBpcyB0cnVlLgorICAgKi8KKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUEFSVElBTF9TUEVDX1dPUktBUk9VTkQpICYmIFwKKyAgICFkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKSAmJiBcCisgICAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSXNTVExwb3J0Q2xhc3M8X1RwPjo6X1JldCBpbXBsZW1lbnRlZDsKKyNlbHNlCisgIHR5cGVkZWYgX19mYWxzZV90eXBlIGltcGxlbWVudGVkOworI2VuZGlmCisgIC8qCisgICAqIGNvbXBsZXRlIHRlbGxzIGlmIHRoZSBtb3ZlIGlzIGNvbXBsZXRlIG9yIHBhcnRpYWwsIHRoYXQgaXMgdG8gc2F5LCBkb2VzIHRoZSBzb3VyY2UKKyAgICogbmVlZHMgdG8gYmUgZGVzdHJveWVkIG9uY2UgaXQgaGFzIGJlZW4gbW92ZWQuCisgICAqLworIyAgaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKSAmJiAoX19CT1JMQU5EQ19fID49IDB4NTY0KQorICB0eXBlZGVmIF9fdHlwZV90cmFpdHM8X1RwPjo6aGFzX3RyaXZpYWxfZGVzdHJ1Y3RvciBfVHBNb3ZlQ29tcGxldGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX19ib29sMnR5cGU8X190eXBlMmJvb2w8X1RwTW92ZUNvbXBsZXRlPjo6X1JldD46Ol9SZXQgY29tcGxldGU7CisjICBlbHNlCisgIHR5cGVkZWYgdHlwZW5hbWUgX190eXBlX3RyYWl0czxfVHA+OjpoYXNfdHJpdmlhbF9kZXN0cnVjdG9yIGNvbXBsZXRlOworIyAgZW5kaWYKK307CisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKworLyoKKyAqIFRoaXMgc3RydWN0IHNob3VsZCBuZXZlciBiZSB1c2VkIGlmIHRoZSB1c2VyIGhhcyBub3QgZXhwbGljaXRlbHkgc3RpcHVsYXRlZAorICogdGhhdCBpdHMgY2xhc3Mgc3VwcG9ydCB0aGUgZnVsbCBtb3ZlIGNvbmNlcHQuIFRvIGNoZWNrIHRoYXQgdGhlIHJldHVybiB0eXBlCisgKiBpbiBzdWNoIGEgY2FzZSB3aWxsIGJlIF9faW52YWxpZF9zb3VyY2U8X1RwPiB0byBnZW5lcmF0ZSBhIGNvbXBpbGUgZXJyb3IKKyAqIHJldmVhbGluZyB0aGUgY29uZmlndXJhdGlvbiBwcm9ibGVtLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9Nb3ZlU291cmNlVHJhaXRzIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX21vdmVfdHJhaXRzPF9UcD46OmltcGxlbWVudGVkIF9NdkltcFJldDsKKyNpZiBkZWZpbmVkIChfX0JPUkxBTkRDX18pCisgIHR5cGVkZWYgdHlwZW5hbWUgX19zZWxlY3RUPF9NdkltcFJldCwKKyNlbHNlCisgIGVudW0ge19NdkltcCA9IF9fdHlwZTJib29sPF9NdkltcFJldD46Ol9SZXR9OworICB0eXBlZGVmIHR5cGVuYW1lIF9fc2VsZWN0PF9NdkltcCwKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbW92ZV9zb3VyY2U8X1RwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVHAgY29uc3QmPjo6X1JldCBfVHlwZTsKK307CisKKy8vVGhlIGhlbHBlciBmdW5jdGlvbgordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfU1RMUF9UWVBFTkFNRV9PTl9SRVRVUk5fVFlQRSBfTW92ZVNvdXJjZVRyYWl0czxfVHA+OjpfVHlwZQorX0FzTW92ZVNvdXJjZSAoX1RwICZzcmMpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfTW92ZVNvdXJjZVRyYWl0czxfVHA+OjpfVHlwZSBfU3JjVHlwZTsKKyAgcmV0dXJuIF9TcmNUeXBlKHNyYyk7Cit9CisKKy8vSGVscGVyIHN0cnVjdHMgdXNlZCBmb3IgbWFueSBjbGFzcy4KK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX19tb3ZlX3RyYWl0c19hdXggeworICB0eXBlZGVmIHR5cGVuYW1lIF9fbW92ZV90cmFpdHM8X1RwPjo6aW1wbGVtZW50ZWQgaW1wbGVtZW50ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgX19tb3ZlX3RyYWl0czxfVHA+Ojpjb21wbGV0ZSBjb21wbGV0ZTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAxLCBjbGFzcyBfVHAyPgorc3RydWN0IF9fbW92ZV90cmFpdHNfYXV4MiB7CisgIHR5cGVkZWYgX19tb3ZlX3RyYWl0czxfVHAxPiBfTW92ZVRyYWl0czE7CisgIHR5cGVkZWYgX19tb3ZlX3RyYWl0czxfVHAyPiBfTW92ZVRyYWl0czI7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBfTG9yMjx0eXBlbmFtZSBfTW92ZVRyYWl0czE6OmltcGxlbWVudGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9Nb3ZlVHJhaXRzMjo6aW1wbGVtZW50ZWQ+OjpfUmV0IGltcGxlbWVudGVkOworICB0eXBlZGVmIHR5cGVuYW1lIF9MYW5kMjx0eXBlbmFtZSBfTW92ZVRyYWl0czE6OmNvbXBsZXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfTW92ZVRyYWl0czI6OmNvbXBsZXRlPjo6X1JldCBjb21wbGV0ZTsKK307CisKKy8qCisgKiBNb3N0IG9mIHRoZSB0aW1lIGEgY2xhc3MgaW1wbGVtZW50IGEgbW92ZSBjb25zdHJ1Y3RvciBidXQgaXRzIHVzZSBkZXBlbmRzCisgKiBvbiBhIHRoaXJkIHBhcnR5LCB0aGlzIGlzIHdoYXQgdGhlIGZvbGxvd2luZyBzdHJ1Y3QgYXJlIGZvci4KKyAqLwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfX21vdmVfdHJhaXRzX2hlbHAgeworICB0eXBlZGVmIF9fdHJ1ZV90eXBlIGltcGxlbWVudGVkOworICB0eXBlZGVmIHR5cGVuYW1lIF9fbW92ZV90cmFpdHM8X1RwPjo6Y29tcGxldGUgY29tcGxldGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwMSwgY2xhc3MgX1RwMj4KK3N0cnVjdCBfX21vdmVfdHJhaXRzX2hlbHAxIHsKKyAgdHlwZWRlZiBfX21vdmVfdHJhaXRzPF9UcDE+IF9Nb3ZlVHJhaXRzMTsKKyAgdHlwZWRlZiBfX21vdmVfdHJhaXRzPF9UcDI+IF9Nb3ZlVHJhaXRzMjsKKworICB0eXBlZGVmIHR5cGVuYW1lIF9Mb3IyPHR5cGVuYW1lIF9Nb3ZlVHJhaXRzMTo6aW1wbGVtZW50ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX01vdmVUcmFpdHMyOjppbXBsZW1lbnRlZD46Ol9SZXQgaW1wbGVtZW50ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0xhbmQyPHR5cGVuYW1lIF9Nb3ZlVHJhaXRzMTo6Y29tcGxldGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9Nb3ZlVHJhaXRzMjo6Y29tcGxldGU+OjpfUmV0IGNvbXBsZXRlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcDEsIGNsYXNzIF9UcDI+CitzdHJ1Y3QgX19tb3ZlX3RyYWl0c19oZWxwMiB7CisgIHR5cGVkZWYgX19tb3ZlX3RyYWl0czxfVHAxPiBfTW92ZVRyYWl0czE7CisgIHR5cGVkZWYgX19tb3ZlX3RyYWl0czxfVHAyPiBfTW92ZVRyYWl0czI7CisKKyAgdHlwZWRlZiBfX3RydWVfdHlwZSBpbXBsZW1lbnRlZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfTGFuZDI8dHlwZW5hbWUgX01vdmVUcmFpdHMxOjpjb21wbGV0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX01vdmVUcmFpdHMyOjpjb21wbGV0ZT46Ol9SZXQgY29tcGxldGU7Cit9OworCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLyogX1NUTFBfTU9WRV9DT05TVFJVQ1RfRldLX0ggKi8KZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL19uZXcuaCBiL3N0bHBvcnQvc3RsL19uZXcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDA5NGNmCi0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvX25ldy5oCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9ORVcKKyNkZWZpbmUgX1NUTFBfSU5URVJOQUxfTkVXCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1NURERFRgorLy8gc2l6ZV90CisjICBpbmNsdWRlIDxzdGwvX2NzdGRkZWYuaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKSAmJiAoX19CT1JMQU5EQ19fIDwgMHg1NzApCisvLyBuZXcuaCB1c2VzIDo6bWFsbG9jIDsoCisjICBpbmNsdWRlIF9TVExQX05BVElWRV9DUFBfQ19IRUFERVIoY3N0ZGxpYikKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjptYWxsb2M7CisjZW5kaWYKKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19ORVdfTkVXX0hFQURFUikKKy8vIGVNYmVkZGVkIFZpc3VhbCBDKysgLk5FVCB1bmZvcnR1bmF0ZWx5IHVzZXMgX0lOQ19ORVcgZm9yIGJvdGggPG5ldy5oPiBhbmQgPG5ldz4KKy8vIHdlIHVuZGVmaW5lIHRoZSBzeW1ib2wgdG8gZ2V0IHRoZSBzdHVmZiBpbiB0aGUgU0RLJ3MgPG5ldz4KKyMgIGlmIGRlZmluZWQgKF9TVExQX1dDRV9ORVQpICYmIGRlZmluZWQgKF9JTkNfTkVXKQorIyAgICB1bmRlZiBfSU5DX05FVworIyAgZW5kaWYKKworIyAgaWYgZGVmaW5lZCAobmV3KQorLyogU1RMcG9ydCBjYW5ub3QgcmVwbGFjZSBuYXRpdmUgU3RkIGxpYnJhcnkgbmV3IGhlYWRlciBpZiBuZXcgaXMgYSBtYWNybywKKyAqIHBsZWFzZSBkZWZpbmUgbmV3IG1hY3JvIGFmdGVyIDxuZXc+IGhlYWRlciBpbmNsdXNpb24uCisgKi8KKyMgICAgZXJyb3IgQ2Fubm90IGluY2x1ZGUgbmF0aXZlIG5ldyBoZWFkZXIgYXMgbmV3IGlzIGEgbWFjcm8uCisjICBlbmRpZgorCisjICBpZiBkZWZpbmVkIChfU1RMUF9IQVNfSU5DTFVERV9ORVhUKQorIyAgICBpbmNsdWRlX25leHQgPG5ldz4KKyMgIGVsc2UKKyMgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ1BQX1JVTlRJTUVfSEVBREVSKG5ldykKKyMgIGVuZGlmCisjZWxzZQorIyAgaW5jbHVkZSA8bmV3Lmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX05PX0JBRF9BTExPQykgJiYgIWRlZmluZWQgKF9TVExQX05FV19ET05UX1RIUk9XX0JBRF9BTExPQykKKyMgIGRlZmluZSBfU1RMUF9ORVdfRE9OVF9USFJPV19CQURfQUxMT0MgMQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfRVhDRVBUSU9OUykgJiYgZGVmaW5lZCAoX1NUTFBfTkVXX0RPTlRfVEhST1dfQkFEX0FMTE9DKQorCisjICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfRVhDRVBUSU9OCisjICAgIGluY2x1ZGUgPHN0bC9fZXhjZXB0aW9uLmg+CisjICBlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfTk9fQkFEX0FMTE9DKQorc3RydWN0IG5vdGhyb3dfdCB7fTsKKyMgICAgZGVmaW5lIG5vdGhyb3cgbm90aHJvd190KCkKKyMgIGVuZGlmCisKKy8qCisgKiBTVExwb3J0IG93biBiYWRfYWxsb2MgZXhjZXB0aW9uIHRvIGJlIHVzZWQgaWYgdGhlIG5hdGl2ZSBDKysgbGlicmFyeQorICogZG8gbm90IGRlZmluZSBpdCBvciB3aGVuIHRoZSBuZXcgb3BlcmF0b3IgZG8gbm90IHRocm93IGl0IHRvIGF2b2lkCisgKiBhIHVzZWxlc3MgbGlicmFyeSBkZXBlbmRlbmN5LgorICovCitjbGFzcyBiYWRfYWxsb2MgOiBwdWJsaWMgZXhjZXB0aW9uIHsKK3B1YmxpYzoKKyAgYmFkX2FsbG9jICgpIF9TVExQX05PVEhST1dfSU5IRVJFTlRMWSB7IH0KKyAgYmFkX2FsbG9jKGNvbnN0IGJhZF9hbGxvYyYpIF9TVExQX05PVEhST1dfSU5IRVJFTlRMWSB7IH0KKyAgYmFkX2FsbG9jJiBvcGVyYXRvcj0oY29uc3QgYmFkX2FsbG9jJikgX1NUTFBfTk9USFJPV19JTkhFUkVOVExZIHtyZXR1cm4gKnRoaXM7fQorICB+YmFkX2FsbG9jICgpIF9TVExQX05PVEhST1dfSU5IRVJFTlRMWSB7IH0KKyAgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IF9TVExQX05PVEhST1dfSU5IRVJFTlRMWSB7IHJldHVybiAiYmFkIGFsbG9jIjsgfQorfTsKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLyogX1NUTFBfVVNFX0VYQ0VQVElPTlMgJiYgKF9TVExQX05PX0JBRF9BTExPQyB8fCBfU1RMUF9ORVdfRE9OVF9USFJPV19CQURfQUxMT0MpICovCisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfT1dOX05BTUVTUEFDRSkKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9ORVdfRE9OVF9USFJPV19CQURfQUxMT0MpCit1c2luZyBfU1RMUF9WRU5ET1JfRVhDRVBUX1NURDo6YmFkX2FsbG9jOworIyAgZW5kaWYKKworIyAgaWYgIWRlZmluZWQgKF9TVExQX05PX0JBRF9BTExPQykKK3VzaW5nIF9TVExQX1ZFTkRPUl9FWENFUFRfU1REOjpub3Rocm93X3Q7Cit1c2luZyBfU1RMUF9WRU5ET1JfRVhDRVBUX1NURDo6bm90aHJvdzsKKyMgICAgaWYgZGVmaW5lZCAoX1NUTFBfR0xPQkFMX05FV19IQU5ETEVSKQordXNpbmcgOjpuZXdfaGFuZGxlcjsKK3VzaW5nIDo6c2V0X25ld19oYW5kbGVyOworIyAgICBlbHNlCit1c2luZyBfU1RMUF9WRU5ET1JfRVhDRVBUX1NURDo6bmV3X2hhbmRsZXI7Cit1c2luZyBfU1RMUF9WRU5ET1JfRVhDRVBUX1NURDo6c2V0X25ld19oYW5kbGVyOworIyAgICBlbmRpZgorIyAgZW5kaWYgLyogIV9TVExQX05PX0JBRF9BTExPQyAqLworCitfU1RMUF9FTkRfTkFNRVNQQUNFCisjZW5kaWYgLyogX1NUTFBfVVNFX09XTl9OQU1FU1BBQ0UgKi8KKworI2lmbmRlZiBfU1RMUF9USFJPV19CQURfQUxMT0MKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9VU0VfRVhDRVBUSU9OUykKKyMgICAgaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NTVERJTworIyAgICAgIGluY2x1ZGUgPHN0bC9fY3N0ZGlvLmg+CisjICAgIGVuZGlmCisjICAgIGRlZmluZSBfU1RMUF9USFJPV19CQURfQUxMT0MgcHV0cygib3V0IG9mIG1lbW9yeVxuIik7IGV4aXQoMSkKKyMgIGVsc2UKKyMgICAgZGVmaW5lIF9TVExQX1RIUk9XX0JBRF9BTExPQyBfU1RMUF9USFJPVyhfU1RMUF9TVEQ6OmJhZF9hbGxvYygpKQorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfTk9fTkVXX05FV19IRUFERVIpIHx8IGRlZmluZWQgKF9TVExQX05FV19ET05UX1RIUk9XX0JBRF9BTExPQykKKyMgIGRlZmluZSBfU1RMUF9DSEVDS19OVUxMX0FMTE9DKF9feCkgdm9pZCogX195ID0gX194OyBpZiAoX195ID09IDApIHsgX1NUTFBfVEhST1dfQkFEX0FMTE9DOyB9IHJldHVybiBfX3kKKyNlbHNlCisjICBkZWZpbmUgX1NUTFBfQ0hFQ0tfTlVMTF9BTExPQyhfX3gpIHJldHVybiBfX3gKKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworI2lmICgoZGVmaW5lZCAoX19JQk1DUFBfXykgfHwgZGVmaW5lZCAoX19PUzQwMF9fKSB8fCBkZWZpbmVkIChfX3hsQ19fKSB8fCBkZWZpbmVkIChxVGlkeUhlYXApKSAmJiBkZWZpbmVkIChfU1RMUF9ERUJVR19BTExPQykpCitpbmxpbmUgdm9pZCogX1NUTFBfQ0FMTCBfX3N0bF9uZXcoc2l6ZV90IF9fbikgICB7IF9TVExQX0NIRUNLX05VTExfQUxMT0MoOjpvcGVyYXRvciBuZXcoX19uLCBfX0ZJTEVfXywgX19MSU5FX18pKTsgfQoraW5saW5lIHZvaWQgIF9TVExQX0NBTEwgX19zdGxfZGVsZXRlKHZvaWQqIF9fcCkgeyA6Om9wZXJhdG9yIGRlbGV0ZShfX3AsIF9fRklMRV9fLCBfX0xJTkVfXyk7IH0KKyNlbHNlCitpbmxpbmUgdm9pZCogX1NUTFBfQ0FMTCBfX3N0bF9uZXcoc2l6ZV90IF9fbikgICB7IF9TVExQX0NIRUNLX05VTExfQUxMT0MoOjpvcGVyYXRvciBuZXcoX19uKSk7IH0KK2lubGluZSB2b2lkICBfU1RMUF9DQUxMIF9fc3RsX2RlbGV0ZSh2b2lkKiBfX3ApIHsgOjpvcGVyYXRvciBkZWxldGUoX19wKTsgfQorI2VuZGlmCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9ORVcgKi8KKworLyoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIG1vZGU6QysrCisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL19udW1fZ2V0LmMgYi9zdGxwb3J0L3N0bC9fbnVtX2dldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlN2QyMzQKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9fbnVtX2dldC5jCkBAIC0wLDAgKzEsNjIzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworI2lmbmRlZiBfU1RMUF9OVU1fR0VUX0MKKyNkZWZpbmUgX1NUTFBfTlVNX0dFVF9DCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfTlVNX0dFVF9ICisjICBpbmNsdWRlIDxzdGwvX251bV9nZXQuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0xJTUlUUworIyAgaW5jbHVkZSA8c3RsL19saW1pdHMuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCitfU1RMUF9ERUNMU1BFQyB1bnNpZ25lZCBjaGFyIF9TVExQX0NBTEwgX19kaWdpdF92YWxfdGFibGUodW5zaWduZWQpOworX1NUTFBfREVDTFNQRUMgY29uc3QgY2hhciogX1NUTFBfQ0FMTCBfX25hcnJvd19hdG9tcygpOworCisvLyBfX2RvX2dldF9pbnRlZ2VyLCBfX2RvX2dldF9mbG9hdCBhbmQgaXRzIGhlbHBlciBmdW5jdGlvbnMuCisKK2lubGluZSBib29sIF9TVExQX0NBTEwgX19nZXRfZmRpZ2l0KGNoYXIgX19jLCBjb25zdCBjaGFyKikKK3sgcmV0dXJuIF9fYyA+PSAnMCcgJiYgX19jIDw9ICc5JzsgfQorCitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMIF9fZ2V0X2ZkaWdpdF9vcl9zZXAoY2hhciYgX19jLCBjaGFyIF9fc2VwLCBjb25zdCBjaGFyICpfX2RpZ2l0cykgeworICBpZiAoX19jID09IF9fc2VwKSB7CisgICAgX19jID0gJywnIDsKKyAgICByZXR1cm4gdHJ1ZSA7CisgIH0KKyAgZWxzZQorICAgIHJldHVybiAgX19nZXRfZmRpZ2l0KF9fYywgX19kaWdpdHMpOworfQorCitpbmxpbmUgaW50IF9TVExQX0NBTEwKK19fZ2V0X2RpZ2l0X2Zyb21fdGFibGUodW5zaWduZWQgX19pbmRleCkKK3sgcmV0dXJuIChfX2luZGV4ID4gMTI3ID8gMHhGRiA6IF9fZGlnaXRfdmFsX3RhYmxlKF9faW5kZXgpKTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX0NoYXJUPgoraW50CitfX2dldF9iYXNlX29yX3plcm8oX0lucHV0SXRlciYgX19pbl9pdGUsIF9JbnB1dEl0ZXImIF9fZW5kLAorICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzLCBjb25zdCBjdHlwZTxfQ2hhclQ+JiBfX2NfdHlwZSkgeworICBfQ2hhclQgX19hdG9tc1s1XTsKKyAgX19jX3R5cGUud2lkZW4oX19uYXJyb3dfYXRvbXMoKSwgX19uYXJyb3dfYXRvbXMoKSArIDUsIF9fYXRvbXMpOworCisgIGJvb2wgX19uZWdhdGl2ZSA9IGZhbHNlOworICBfQ2hhclQgX19jID0gKl9faW5faXRlOworCisgIGlmIChfX2MgPT0gX19hdG9tc1sxXSAvKiBfX3htaW51c19jaGFyICovICkgeworICAgIF9fbmVnYXRpdmUgPSB0cnVlOworICAgICsrX19pbl9pdGU7CisgIH0KKyAgZWxzZSBpZiAoX19jID09IF9fYXRvbXNbMF0gLyogX194cGx1c19jaGFyICovICkKKyAgICArK19faW5faXRlOworCisgIGludCBfX2Jhc2U7CisgIGludCBfX3ZhbGlkX3plcm8gPSAwOworCisgIGlvc19iYXNlOjpmbXRmbGFncyBfX2Jhc2VmaWVsZCA9IF9fZmxhZ3MgJiBpb3NfYmFzZTo6YmFzZWZpZWxkOworCisgIHN3aXRjaCAoX19iYXNlZmllbGQpIHsKKyAgY2FzZSBpb3NfYmFzZTo6b2N0OgorICAgIF9fYmFzZSA9IDg7CisgICAgYnJlYWs7CisgIGNhc2UgaW9zX2Jhc2U6OmRlYzoKKyAgICBfX2Jhc2UgPSAxMDsKKyAgICBicmVhazsKKyAgY2FzZSBpb3NfYmFzZTo6aGV4OgorICAgIF9fYmFzZSA9IDE2OworICAgIGlmIChfX2luX2l0ZSAhPSBfX2VuZCAmJiAqX19pbl9pdGUgPT0gX19hdG9tc1syXSAvKiBfX3plcm9fY2hhciAqLyApIHsKKyAgICAgICsrX19pbl9pdGU7CisgICAgICBpZiAoX19pbl9pdGUgIT0gX19lbmQgJiYKKyAgICAgICAgICAoKl9faW5faXRlID09IF9fYXRvbXNbM10gLyogX194X2NoYXIgKi8gfHwgKl9faW5faXRlID09IF9fYXRvbXNbNF0gLyogX19YX2NoYXIgKi8gKSkKKyAgICAgICAgKytfX2luX2l0ZTsKKyAgICAgIGVsc2UKKyAgICAgICAgX192YWxpZF96ZXJvID0gMTsgLy8gVGhhdCB6ZXJvIGlzIHZhbGlkIGJ5IGl0c2VsZi4KKyAgICB9CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgaWYgKF9faW5faXRlICE9IF9fZW5kICYmICpfX2luX2l0ZSA9PSBfX2F0b21zWzJdIC8qIF9femVyb19jaGFyICovICkgeworICAgICAgKytfX2luX2l0ZTsKKyAgICAgIGlmIChfX2luX2l0ZSAhPSBfX2VuZCAmJgorICAgICAgICAgICgqX19pbl9pdGUgPT0gX19hdG9tc1szXSAvKiBfX3hfY2hhciAqLyB8fCAqX19pbl9pdGUgPT0gX19hdG9tc1s0XSAvKiBfX1hfY2hhciAqLyApKSB7CisgICAgICAgICsrX19pbl9pdGU7CisgICAgICAgIF9fYmFzZSA9IDE2OworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX19iYXNlID0gODsKKyAgICAgICAgICBfX3ZhbGlkX3plcm8gPSAxOyAvLyBUaGF0IHplcm8gaXMgc3RpbGwgdmFsaWQgYnkgaXRzZWxmLgorICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICAgIF9fYmFzZSA9IDEwOworICAgIGJyZWFrOworICB9CisgIHJldHVybiAoX19iYXNlIDw8IDIpIHwgKChpbnQpX19uZWdhdGl2ZSA8PCAxKSB8IF9fdmFsaWRfemVybzsKK30KKworCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX0ludGVnZXIsIGNsYXNzIF9DaGFyVD4KK2Jvb2wgX1NUTFBfQ0FMTAorX19nZXRfaW50ZWdlcihfSW5wdXRJdGVyJiBfX2ZpcnN0LCBfSW5wdXRJdGVyJiBfX2xhc3QsCisgICAgICAgICAgICAgIGludCBfX2Jhc2UsIF9JbnRlZ2VyJiBfX3ZhbCwKKyAgICAgICAgICAgICAgaW50IF9fZ290LCBib29sIF9faXNfbmVnYXRpdmUsIF9DaGFyVCBfX3NlcGFyYXRvciwgY29uc3Qgc3RyaW5nJiBfX2dyb3VwaW5nLCBjb25zdCBfX3RydWVfdHlwZSYgLypfSXNTaWduZWQqLykgeworICBib29sIF9fb3ZmbG93ID0gZmFsc2U7CisgIF9JbnRlZ2VyIF9fcmVzdWx0ID0gMDsKKyAgYm9vbCBfX2lzX2dyb3VwID0gIV9fZ3JvdXBpbmcuZW1wdHkoKTsKKyAgY2hhciBfX2dyb3VwX3NpemVzWzY0XTsKKyAgY2hhciBfX2N1cnJlbnRfZ3JvdXBfc2l6ZSA9IDA7CisgIGNoYXIqIF9fZ3JvdXBfc2l6ZXNfZW5kID0gX19ncm91cF9zaXplczsKKworICBfSW50ZWdlciBfX292ZXJfYmFzZSA9IChudW1lcmljX2xpbWl0czxfSW50ZWdlcj46Om1pbikoKSAvIF9fU1RBVElDX0NBU1QoX0ludGVnZXIsIF9fYmFzZSk7CisKKyAgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3QgOyArK19fZmlyc3QpIHsKKworICAgICBjb25zdCBfQ2hhclQgX19jID0gKl9fZmlyc3Q7CisKKyAgICAgaWYgKF9faXNfZ3JvdXAgJiYgX19jID09IF9fc2VwYXJhdG9yKSB7CisgICAgICAgKl9fZ3JvdXBfc2l6ZXNfZW5kKysgPSBfX2N1cnJlbnRfZ3JvdXBfc2l6ZTsKKyAgICAgICBfX2N1cnJlbnRfZ3JvdXBfc2l6ZSA9IDA7CisgICAgICAgY29udGludWU7CisgICAgIH0KKworICAgICBpbnQgX19uID0gX19nZXRfZGlnaXRfZnJvbV90YWJsZShfX2MpOworCisgICAgIGlmIChfX24gPj0gX19iYXNlKQorICAgICAgIGJyZWFrOworCisgICAgICsrX19nb3Q7CisgICAgICsrX19jdXJyZW50X2dyb3VwX3NpemU7CisKKyAgICAgaWYgKF9fcmVzdWx0IDwgX19vdmVyX2Jhc2UpCisgICAgICAgX19vdmZsb3cgPSB0cnVlOyAgLy8gZG9uJ3QgbmVlZCB0byBrZWVwIGFjY3VtdWxhdGluZworICAgICBlbHNlIHsKKyAgICAgICBfSW50ZWdlciBfX25leHQgPSBfX1NUQVRJQ19DQVNUKF9JbnRlZ2VyLCBfX2Jhc2UgKiBfX3Jlc3VsdCAtIF9fbik7CisgICAgICAgaWYgKF9fcmVzdWx0ICE9IDApCisgICAgICAgICBfX292ZmxvdyA9IF9fb3ZmbG93IHx8IF9fbmV4dCA+PSBfX3Jlc3VsdDsKKyAgICAgICBfX3Jlc3VsdCA9IF9fbmV4dDsKKyAgICAgfQorICAgfQorCisgICBpZiAoX19pc19ncm91cCAmJiBfX2dyb3VwX3NpemVzX2VuZCAhPSBfX2dyb3VwX3NpemVzKSB7CisgICAgICpfX2dyb3VwX3NpemVzX2VuZCsrID0gX19jdXJyZW50X2dyb3VwX3NpemU7CisgICB9CisKKyAgIC8vIGZicCA6IGFkZGVkIHRvIG5vdCBtb2RpZnkgdmFsdWUgaWYgbm90aGluZyB3YXMgcmVhZAorICAgaWYgKF9fZ290ID4gMCkgeworICAgICAgIF9fdmFsID0gX19vdmZsb3cgPyBfX2lzX25lZ2F0aXZlID8gKG51bWVyaWNfbGltaXRzPF9JbnRlZ2VyPjo6bWluKSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAobnVtZXJpY19saW1pdHM8X0ludGVnZXI+OjptYXgpKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDogX19pc19uZWdhdGl2ZSA/IF9fcmVzdWx0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfX1NUQVRJQ19DQVNUKF9JbnRlZ2VyLCAtX19yZXN1bHQpOworICAgfQorICAvLyBvdmVyZmxvdyBpcyBiZWluZyB0cmVhdGVkIGFzIGZhaWx1cmUKKyAgcmV0dXJuICgoX19nb3QgPiAwKSAmJiAhX19vdmZsb3cpICYmCisgICAgICAgICAgKF9faXNfZ3JvdXAgPT0gMCB8fAorICAgICAgICAgICBfX3ZhbGlkX2dyb3VwaW5nKF9fZ3JvdXBfc2l6ZXMsIF9fZ3JvdXBfc2l6ZXNfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZ3JvdXBpbmcuZGF0YSgpLCBfX2dyb3VwaW5nLmRhdGEoKSsgX19ncm91cGluZy5zaXplKCkpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9JbnRlZ2VyLCBjbGFzcyBfQ2hhclQ+Citib29sIF9TVExQX0NBTEwKK19fZ2V0X2ludGVnZXIoX0lucHV0SXRlciYgX19maXJzdCwgX0lucHV0SXRlciYgX19sYXN0LAorICAgICAgICAgICAgICBpbnQgX19iYXNlLCBfSW50ZWdlciYgX192YWwsCisgICAgICAgICAgICAgIGludCBfX2dvdCwgYm9vbCBfX2lzX25lZ2F0aXZlLCBfQ2hhclQgX19zZXBhcmF0b3IsIGNvbnN0IHN0cmluZyYgX19ncm91cGluZywgY29uc3QgX19mYWxzZV90eXBlJiAvKl9Jc1NpZ25lZCovKSB7CisgIGJvb2wgX19vdmZsb3cgPSBmYWxzZTsKKyAgX0ludGVnZXIgX19yZXN1bHQgPSAwOworICBib29sIF9faXNfZ3JvdXAgPSAhX19ncm91cGluZy5lbXB0eSgpOworICBjaGFyIF9fZ3JvdXBfc2l6ZXNbNjRdOworICBjaGFyIF9fY3VycmVudF9ncm91cF9zaXplID0gMDsKKyAgY2hhciogX19ncm91cF9zaXplc19lbmQgPSBfX2dyb3VwX3NpemVzOworCisgIF9JbnRlZ2VyICBfX292ZXJfYmFzZSA9IChudW1lcmljX2xpbWl0czxfSW50ZWdlcj46Om1heCkoKSAvIF9fU1RBVElDX0NBU1QoX0ludGVnZXIsIF9fYmFzZSk7CisKKyAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdCA7ICsrX19maXJzdCkgeworCisgICAgY29uc3QgX0NoYXJUIF9fYyA9ICpfX2ZpcnN0OworCisgICAgaWYgKF9faXNfZ3JvdXAgJiYgX19jID09IF9fc2VwYXJhdG9yKSB7CisgICAgICAqX19ncm91cF9zaXplc19lbmQrKyA9IF9fY3VycmVudF9ncm91cF9zaXplOworICAgICAgX19jdXJyZW50X2dyb3VwX3NpemUgPSAwOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgaW50IF9fbiA9IF9fZ2V0X2RpZ2l0X2Zyb21fdGFibGUoX19jKTsKKworICAgIGlmIChfX24gPj0gX19iYXNlKQorICAgICAgYnJlYWs7CisKKyAgICArK19fZ290OworICAgICsrX19jdXJyZW50X2dyb3VwX3NpemU7CisKKyAgICBpZiAoX19yZXN1bHQgPiBfX292ZXJfYmFzZSkKKyAgICAgIF9fb3ZmbG93ID0gdHJ1ZTsgIC8vZG9uJ3QgbmVlZCB0byBrZWVwIGFjY3VtdWxhdGluZworICAgIGVsc2UgeworICAgICAgX0ludGVnZXIgX19uZXh0ID0gX19TVEFUSUNfQ0FTVChfSW50ZWdlciwgX19iYXNlICogX19yZXN1bHQgKyBfX24pOworICAgICAgaWYgKF9fcmVzdWx0ICE9IDApCisgICAgICAgIF9fb3ZmbG93ID0gX19vdmZsb3cgfHwgX19uZXh0IDw9IF9fcmVzdWx0OworICAgICAgICBfX3Jlc3VsdCA9IF9fbmV4dDsKKyAgICAgIH0KKyAgfQorCisgIGlmIChfX2lzX2dyb3VwICYmIF9fZ3JvdXBfc2l6ZXNfZW5kICE9IF9fZ3JvdXBfc2l6ZXMpIHsKKyAgICAgICpfX2dyb3VwX3NpemVzX2VuZCsrID0gX19jdXJyZW50X2dyb3VwX3NpemU7CisgIH0KKworICAvLyBmYnAgOiBhZGRlZCB0byBub3QgbW9kaWZ5IHZhbHVlIGlmIG5vdGhpbmcgd2FzIHJlYWQKKyAgaWYgKF9fZ290ID4gMCkgeworICAgICAgX192YWwgPSBfX292ZmxvdyA/IChudW1lcmljX2xpbWl0czxfSW50ZWdlcj46Om1heCkoKQorICAgICAgICAgICAgICAgICAgICAgICA6IChfX2lzX25lZ2F0aXZlID8gX19TVEFUSUNfQ0FTVChfSW50ZWdlciwgLV9fcmVzdWx0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX19yZXN1bHQpOworICB9CisKKyAgLy8gb3ZlcmZsb3cgaXMgYmVpbmcgdHJlYXRlZCBhcyBmYWlsdXJlCisgIHJldHVybiAoKF9fZ290ID4gMCkgJiYgIV9fb3ZmbG93KSAmJgorICAgICAgICAgIChfX2lzX2dyb3VwID09IDAgfHwKKyAgICAgICAgICAgX192YWxpZF9ncm91cGluZyhfX2dyb3VwX3NpemVzLCBfX2dyb3VwX3NpemVzX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2dyb3VwaW5nLmRhdGEoKSwgX19ncm91cGluZy5kYXRhKCkrIF9fZ3JvdXBpbmcuc2l6ZSgpKSk7Cit9CisKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9JbnRlZ2VyLCBjbGFzcyBfQ2hhclQ+Citib29sIF9TVExQX0NBTEwKK19fZ2V0X2RlY2ltYWxfaW50ZWdlcihfSW5wdXRJdGVyJiBfX2ZpcnN0LCBfSW5wdXRJdGVyJiBfX2xhc3QsIF9JbnRlZ2VyJiBfX3ZhbCwgX0NoYXJUKiAvKmR1bW15Ki8pIHsKKyAgc3RyaW5nIF9fZ3JwOworICAvL0hlcmUgdGhlcmUgaXMgbm8gZ3JvdXBpbmcgc28gc2VwYXJhdG9yIGlzIG5vdCBpbXBvcnRhbnQsIHdlIGp1c3QgcGFzcyB0aGUgZGVmYXVsdCBjaGFyYWN0ZXIuCisgIHJldHVybiBfX2dldF9pbnRlZ2VyKF9fZmlyc3QsIF9fbGFzdCwgMTAsIF9fdmFsLCAwLCBmYWxzZSwgX0NoYXJUKCkgLypzZXBhcmF0b3IqLywgX19ncnAsIF9fZmFsc2VfdHlwZSgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9JbnRlZ2VyLCBjbGFzcyBfQ2hhclQ+CitfSW5wdXRJdGVyIF9TVExQX0NBTEwKK19fZG9fZ2V0X2ludGVnZXIoX0lucHV0SXRlciYgX19pbl9pdGUsIF9JbnB1dEl0ZXImIF9fZW5kLCBpb3NfYmFzZSYgX19zdHIsCisgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgX0ludGVnZXImIF9fdmFsLCBfQ2hhclQqIC8qX19wYyovKSB7CisgIGxvY2FsZSBfX2xvYyA9IF9fc3RyLmdldGxvYygpOworICBjb25zdCBjdHlwZTxfQ2hhclQ+JiBfX2N0eXBlID0gdXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihfX2xvYyk7CisKKyNpZiBkZWZpbmVkIChfX0hQX2FDQykgJiYgKF9fSFBfYUNDID09IDEpCisgIGJvb2wgX0lzU2lnbmVkID0gISgoX0ludGVnZXIpKC0xKSA+IDApOworI2Vsc2UKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jvb2wydHlwZTxudW1lcmljX2xpbWl0czxfSW50ZWdlcj46OmlzX3NpZ25lZD46Ol9SZXQgX0lzU2lnbmVkOworI2VuZGlmCisKKyAgY29uc3QgaW50IF9fYmFzZV9vcl96ZXJvID0gX19nZXRfYmFzZV9vcl96ZXJvKF9faW5faXRlLCBfX2VuZCwgX19zdHIuZmxhZ3MoKSwgX19jdHlwZSk7CisgIGludCAgX19nb3QgPSBfX2Jhc2Vfb3JfemVybyAmIDE7CisKKyAgYm9vbCBfX3Jlc3VsdDsKKworICBpZiAoX19pbl9pdGUgPT0gX19lbmQpIHsgICAgICAvLyBXZSBtYXkgaGF2ZSBhbHJlYWR5IHJlYWQgYSAwLiAgSWYgc28sCisKKyAgICBpZiAoX19nb3QgPiAwKSB7ICAgICAgIC8vIHRoZSByZXN1bHQgaXMgMCBldmVuIGlmIHdlJ3JlIGF0IGVvZi4KKyAgICAgIF9fdmFsID0gMDsKKyAgICAgIF9fcmVzdWx0ID0gdHJ1ZTsKKyAgICB9CisgICAgZWxzZQorICAgICAgX19yZXN1bHQgPSBmYWxzZTsKKyAgfQorICBlbHNlIHsKKyAgICBjb25zdCBudW1wdW5jdDxfQ2hhclQ+JiBfX25wID0gdXNlX2ZhY2V0PG51bXB1bmN0PF9DaGFyVD4gPihfX2xvYyk7CisgICAgY29uc3QgYm9vbCBfX25lZ2F0aXZlID0gKF9fYmFzZV9vcl96ZXJvICYgMikgIT0gMDsKKyAgICBjb25zdCBpbnQgX19iYXNlID0gX19iYXNlX29yX3plcm8gPj4gMjsKKworI2lmIGRlZmluZWQgKF9fSFBfYUNDKSAmJiAoX19IUF9hQ0MgPT0gMSkKKyAgICBpZiAoX0lzU2lnbmVkKQorICAgICAgX19yZXN1bHQgPSBfX2dldF9pbnRlZ2VyKF9faW5faXRlLCBfX2VuZCwgX19iYXNlLCAgX192YWwsIF9fZ290LCBfX25lZ2F0aXZlLCBfX25wLnRob3VzYW5kc19zZXAoKSwgX19ucC5ncm91cGluZygpLCBfX3RydWVfdHlwZSgpICk7CisgICAgZWxzZQorICAgICAgX19yZXN1bHQgPSBfX2dldF9pbnRlZ2VyKF9faW5faXRlLCBfX2VuZCwgX19iYXNlLCAgX192YWwsIF9fZ290LCBfX25lZ2F0aXZlLCBfX25wLnRob3VzYW5kc19zZXAoKSwgX19ucC5ncm91cGluZygpLCBfX2ZhbHNlX3R5cGUoKSApOworI2Vsc2UKKyAgICBfX3Jlc3VsdCA9IF9fZ2V0X2ludGVnZXIoX19pbl9pdGUsIF9fZW5kLCBfX2Jhc2UsICBfX3ZhbCwgX19nb3QsIF9fbmVnYXRpdmUsIF9fbnAudGhvdXNhbmRzX3NlcCgpLCBfX25wLmdyb3VwaW5nKCksIF9Jc1NpZ25lZCgpKTsKKyMgZW5kaWYKKyAgfQorCisgIF9fZXJyID0gX19TVEFUSUNfQ0FTVChpb3NfYmFzZTo6aW9zdGF0ZSwgX19yZXN1bHQgPyBpb3NfYmFzZTo6Z29vZGJpdCA6IGlvc19iYXNlOjpmYWlsYml0KTsKKworICBpZiAoX19pbl9pdGUgPT0gX19lbmQpCisgICAgX19lcnIgfD0gaW9zX2Jhc2U6OmVvZmJpdDsKKyAgcmV0dXJuIF9faW5faXRlOworfQorCisvLyBfX3JlYWRfZmxvYXQgYW5kIGl0cyBoZWxwZXIgZnVuY3Rpb25zLgordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9DaGFyVD4KK19JbnB1dEl0ZXIgIF9TVExQX0NBTEwKK19fY29weV9zaWduKF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsIF9faW9zdHJpbmcmIF9fdiwKKyAgICAgICAgICAgIF9DaGFyVCBfX3hwbHVzLCBfQ2hhclQgX194bWludXMpIHsKKyAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KSB7CisgICAgX0NoYXJUIF9fYyA9ICpfX2ZpcnN0OworICAgIGlmIChfX2MgPT0gX194cGx1cykKKyAgICAgICsrX19maXJzdDsKKyAgICBlbHNlIGlmIChfX2MgPT0gX194bWludXMpIHsKKyAgICAgIF9fdi5wdXNoX2JhY2soJy0nKTsKKyAgICAgICsrX19maXJzdDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIF9fZmlyc3Q7Cit9CisKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9DaGFyVD4KK2Jvb2wgX1NUTFBfQ0FMTAorX19jb3B5X2RpZ2l0cyhfSW5wdXRJdGVyJiBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgX19pb3N0cmluZyYgX192LCBjb25zdCBfQ2hhclQqIF9fZGlnaXRzKSB7CisgIGJvb2wgX19vayA9IGZhbHNlOworCisgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkgeworICAgIF9DaGFyVCBfX2MgPSAqX19maXJzdDsKKyAgICBpZiAoX19nZXRfZmRpZ2l0KF9fYywgX19kaWdpdHMpKSB7CisgICAgICBfX3YucHVzaF9iYWNrKChjaGFyKV9fYyk7CisgICAgICBfX29rID0gdHJ1ZTsKKyAgICB9CisgICAgZWxzZQorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIF9fb2s7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfQ2hhclQ+Citib29sIF9TVExQX0NBTEwKK19fY29weV9ncm91cGVkX2RpZ2l0cyhfSW5wdXRJdGVyJiBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICBfX2lvc3RyaW5nJiBfX3YsIGNvbnN0IF9DaGFyVCAqIF9fZGlnaXRzLAorICAgICAgICAgICAgICAgICAgICAgIF9DaGFyVCBfX3NlcCwgY29uc3Qgc3RyaW5nJiBfX2dyb3VwaW5nLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wmIF9fZ3JvdXBpbmdfb2spIHsKKyAgYm9vbCBfX29rID0gZmFsc2U7CisgIGNoYXIgX19ncm91cF9zaXplc1s2NF07CisgIGNoYXIqX19ncm91cF9zaXplc19lbmQgPSBfX2dyb3VwX3NpemVzOworICBjaGFyIF9fY3VycmVudF9ncm91cF9zaXplID0gMDsKKworICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpIHsKKyAgICBfQ2hhclQgX19jID0gKl9fZmlyc3Q7CisgICAgYm9vbCBfX3RtcCA9IF9fZ2V0X2ZkaWdpdF9vcl9zZXAoX19jLCBfX3NlcCwgX19kaWdpdHMpOworICAgIGlmIChfX3RtcCkgeworICAgICAgaWYgKF9fYyA9PSAnLCcpIHsKKyAgICAgICAgKl9fZ3JvdXBfc2l6ZXNfZW5kKysgPSBfX2N1cnJlbnRfZ3JvdXBfc2l6ZTsKKyAgICAgICAgX19jdXJyZW50X2dyb3VwX3NpemUgPSAwOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIF9fb2sgPSB0cnVlOworICAgICAgICBfX3YucHVzaF9iYWNrKChjaGFyKV9fYyk7CisgICAgICAgICsrX19jdXJyZW50X2dyb3VwX3NpemU7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKF9fZ3JvdXBfc2l6ZXNfZW5kICE9IF9fZ3JvdXBfc2l6ZXMpCisgICAgKl9fZ3JvdXBfc2l6ZXNfZW5kKysgPSBfX2N1cnJlbnRfZ3JvdXBfc2l6ZTsKKyAgX19ncm91cGluZ19vayA9IF9fdmFsaWRfZ3JvdXBpbmcoX19ncm91cF9zaXplcywgX19ncm91cF9zaXplc19lbmQsIF9fZ3JvdXBpbmcuZGF0YSgpLCBfX2dyb3VwaW5nLmRhdGEoKSArIF9fZ3JvdXBpbmcuc2l6ZSgpKTsKKyAgcmV0dXJuIF9fb2s7Cit9CisKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9DaGFyVD4KK2Jvb2wgX1NUTFBfQ0FMTAorX19yZWFkX2Zsb2F0KF9faW9zdHJpbmcmIF9fYnVmLCBfSW5wdXRJdGVyJiBfX2luX2l0ZSwgX0lucHV0SXRlciYgX19lbmQsCisgICAgICAgICAgICAgY29uc3QgY3R5cGU8X0NoYXJUPiAmX19jdCwgY29uc3QgbnVtcHVuY3Q8X0NoYXJUPiAmX19udW1wdW5jdCkgeworICAvLyBDcmVhdGUgYSBzdHJpbmcsIGNvcHlpbmcgY2hhcmFjdGVycyBvZiB0aGUgZm9ybQorICAvLyBbKy1dPyBbMC05XSogLj8gWzAtOV0qIChbZUVdIFsrLV0/IFswLTldKyk/CisKKyAgc3RyaW5nIF9fZ3JvdXBpbmcgPSBfX251bXB1bmN0Lmdyb3VwaW5nKCk7CisgIGJvb2wgX19kaWdpdHNfYmVmb3JlX2RvdCAvKiA9IGZhbHNlICovOworICBib29sIF9fZGlnaXRzX2FmdGVyX2RvdCA9IGZhbHNlOworICBib29sIF9fb2s7CisKKyAgYm9vbCAgIF9fZ3JvdXBpbmdfb2sgPSB0cnVlOworCisgIF9DaGFyVCBfX2RvdCA9IF9fbnVtcHVuY3QuZGVjaW1hbF9wb2ludCgpOworICBfQ2hhclQgX19zZXAgPSBfX251bXB1bmN0LnRob3VzYW5kc19zZXAoKTsKKworICBfQ2hhclQgX19kaWdpdHNbMTBdOworICBfQ2hhclQgX194cGx1czsKKyAgX0NoYXJUIF9feG1pbnVzOworCisgIF9DaGFyVCBfX3Bvd19lOworICBfQ2hhclQgX19wb3dfRTsKKworICBfSW5pdGlhbGl6ZV9nZXRfZmxvYXQoX19jdCwgX194cGx1cywgX194bWludXMsIF9fcG93X2UsIF9fcG93X0UsIF9fZGlnaXRzKTsKKworICAvLyBHZXQgYW4gb3B0aW9uYWwgc2lnbgorICBfX2luX2l0ZSA9IF9fY29weV9zaWduKF9faW5faXRlLCBfX2VuZCwgX19idWYsIF9feHBsdXMsIF9feG1pbnVzKTsKKworICAvLyBHZXQgYW4gb3B0aW9uYWwgc3RyaW5nIG9mIGRpZ2l0cy4KKyAgaWYgKCFfX2dyb3VwaW5nLmVtcHR5KCkpCisgICAgX19kaWdpdHNfYmVmb3JlX2RvdCA9IF9fY29weV9ncm91cGVkX2RpZ2l0cyhfX2luX2l0ZSwgX19lbmQsIF9fYnVmLCBfX2RpZ2l0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fc2VwLCBfX2dyb3VwaW5nLCBfX2dyb3VwaW5nX29rKTsKKyAgZWxzZQorICAgIF9fZGlnaXRzX2JlZm9yZV9kb3QgPSBfX2NvcHlfZGlnaXRzKF9faW5faXRlLCBfX2VuZCwgX19idWYsIF9fZGlnaXRzKTsKKworICAvLyBHZXQgYW4gb3B0aW9uYWwgZGVjaW1hbCBwb2ludCwgYW5kIGFuIG9wdGlvbmFsIHN0cmluZyBvZiBkaWdpdHMuCisgIGlmIChfX2luX2l0ZSAhPSBfX2VuZCAmJiAqX19pbl9pdGUgPT0gX19kb3QpIHsKKyAgICBfX2J1Zi5wdXNoX2JhY2soJy4nKTsKKyAgICArK19faW5faXRlOworICAgIF9fZGlnaXRzX2FmdGVyX2RvdCA9IF9fY29weV9kaWdpdHMoX19pbl9pdGUsIF9fZW5kLCBfX2J1ZiwgX19kaWdpdHMpOworICB9CisKKyAgLy8gVGhlcmUgaGF2ZSB0byBiZSBzb21lIGRpZ2l0cywgc29tZXdoZXJlLgorICBfX29rID0gX19kaWdpdHNfYmVmb3JlX2RvdCB8fCBfX2RpZ2l0c19hZnRlcl9kb3Q7CisKKyAgLy8gR2V0IGFuIG9wdGlvbmFsIGV4cG9uZW50LgorICBpZiAoX19vayAmJiBfX2luX2l0ZSAhPSBfX2VuZCAmJiAoKl9faW5faXRlID09IF9fcG93X2UgfHwgKl9faW5faXRlID09IF9fcG93X0UpKSB7CisgICAgX19idWYucHVzaF9iYWNrKCdlJyk7CisgICAgKytfX2luX2l0ZTsKKyAgICBfX2luX2l0ZSA9IF9fY29weV9zaWduKF9faW5faXRlLCBfX2VuZCwgX19idWYsIF9feHBsdXMsIF9feG1pbnVzKTsKKyAgICBfX29rID0gX19jb3B5X2RpZ2l0cyhfX2luX2l0ZSwgX19lbmQsIF9fYnVmLCBfX2RpZ2l0cyk7CisgICAgLy8gSWYgd2UgaGF2ZSBhbiBleHBvbmVudCB0aGVuIHRoZSBzaWduCisgICAgLy8gaXMgb3B0aW9uYWwgYnV0IHRoZSBkaWdpdHMgYXJlbid0LgorICB9CisKKyAgcmV0dXJuIF9fb2s7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfRmxvYXQsIGNsYXNzIF9DaGFyVD4KK19JbnB1dEl0ZXIgX1NUTFBfQ0FMTAorX19kb19nZXRfZmxvYXQoX0lucHV0SXRlciYgX19pbl9pdGUsIF9JbnB1dEl0ZXImIF9fZW5kLCBpb3NfYmFzZSYgX19zdHIsCisgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIF9GbG9hdCYgX192YWwsIF9DaGFyVCogLypfX3BjKi8pIHsKKyAgbG9jYWxlIF9fbG9jID0gX19zdHIuZ2V0bG9jKCk7CisgIGNvbnN0IGN0eXBlPF9DaGFyVD4gJl9fY3R5cGUgPSB1c2VfZmFjZXQ8Y3R5cGU8X0NoYXJUPiA+KF9fbG9jKTsKKyAgY29uc3QgbnVtcHVuY3Q8X0NoYXJUPiAmX19udW1wdW5jdCA9IHVzZV9mYWNldDxudW1wdW5jdDxfQ2hhclQ+ID4oX19sb2MpOworCisgIF9faW9zdHJpbmcgX19idWYgOworICBib29sIF9fb2sgPSBfX3JlYWRfZmxvYXQoX19idWYsIF9faW5faXRlLCBfX2VuZCwgX19jdHlwZSwgX19udW1wdW5jdCk7CisgIGlmIChfX29rKSB7CisgICAgX19zdHJpbmdfdG9fZmxvYXQoX19idWYsIF9fdmFsKTsKKyAgICBfX2VyciA9IGlvc19iYXNlOjpnb29kYml0OworICB9CisgIGVsc2UgeworICAgIF9fZXJyID0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisgIH0KKyAgaWYgKF9faW5faXRlID09IF9fZW5kKQorICAgIF9fZXJyIHw9IGlvc19iYXNlOjplb2ZiaXQ7CisgIHJldHVybiBfX2luX2l0ZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9DaGFyVD4KK19JbnB1dEl0ZXIgX1NUTFBfQ0FMTAorX19kb19nZXRfYWxwaGFib29sKF9JbnB1dEl0ZXImIF9faW5faXRlLCBfSW5wdXRJdGVyJiBfX2VuZCwgaW9zX2Jhc2UmIF9fc3RyLAorICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgYm9vbCYgX194LCBfQ2hhclQqIC8qX19wYyovKSB7CisgIGNvbnN0IG51bXB1bmN0PF9DaGFyVD4mIF9fbnAgPSB1c2VfZmFjZXQ8bnVtcHVuY3Q8X0NoYXJUPiA+KF9fc3RyLmdldGxvYygpKTsKKyAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgY2hhcl90cmFpdHM8X0NoYXJUPiwgYWxsb2NhdG9yPF9DaGFyVD4gPiBfX3RydWVuYW1lICA9IF9fbnAudHJ1ZW5hbWUoKTsKKyAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgY2hhcl90cmFpdHM8X0NoYXJUPiwgYWxsb2NhdG9yPF9DaGFyVD4gPiBfX2ZhbHNlbmFtZSA9IF9fbnAuZmFsc2VuYW1lKCk7CisgIGJvb2wgX190cnVlX29rICA9IHRydWU7CisgIGJvb2wgX19mYWxzZV9vayA9IHRydWU7CisKKyAgc2l6ZV90IF9fbiA9IDA7CisgIGZvciAoIDsgX19pbl9pdGUgIT0gX19lbmQ7ICsrX19pbl9pdGUpIHsKKyAgICBfQ2hhclQgX19jID0gKl9faW5faXRlOworICAgIF9fdHJ1ZV9vayAgPSBfX3RydWVfb2sgICYmIChfX2MgPT0gX190cnVlbmFtZVtfX25dKTsKKyAgICBfX2ZhbHNlX29rID0gX19mYWxzZV9vayAmJiAoX19jID09IF9fZmFsc2VuYW1lW19fbl0pOworICAgICsrX19uOworCisgICAgaWYgKCghX190cnVlX29rICYmICFfX2ZhbHNlX29rKSB8fAorICAgICAgICAoX190cnVlX29rICAmJiBfX24gPj0gX190cnVlbmFtZS5zaXplKCkpIHx8CisgICAgICAgIChfX2ZhbHNlX29rICYmIF9fbiA+PSBfX2ZhbHNlbmFtZS5zaXplKCkpKSB7CisgICAgICArK19faW5faXRlOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGlmIChfX3RydWVfb2sgICYmIF9fbiA8IF9fdHJ1ZW5hbWUuc2l6ZSgpKSAgX190cnVlX29rICA9IGZhbHNlOworICBpZiAoX19mYWxzZV9vayAmJiBfX24gPCBfX2ZhbHNlbmFtZS5zaXplKCkpIF9fZmFsc2Vfb2sgPSBmYWxzZTsKKworICBpZiAoX190cnVlX29rIHx8IF9fZmFsc2Vfb2spIHsKKyAgICBfX2VyciA9IGlvc19iYXNlOjpnb29kYml0OworICAgIF9feCA9IF9fdHJ1ZV9vazsKKyAgfQorICBlbHNlCisgICAgX19lcnIgPSBpb3NfYmFzZTo6ZmFpbGJpdDsKKworICBpZiAoX19pbl9pdGUgPT0gX19lbmQpCisgICAgX19lcnIgfD0gaW9zX2Jhc2U6OmVvZmJpdDsKKworICByZXR1cm4gX19pbl9pdGU7Cit9CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCisvLworLy8gbnVtX2dldDw+LCBudW1fcHV0PD4KKy8vCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorbG9jYWxlOjppZCBudW1fZ2V0PF9DaGFyVCwgX0lucHV0SXRlcmF0b3I+OjppZDsKKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19CT09MKQordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0lucHV0SXRlcj4KK19JbnB1dEl0ZXIKK251bV9nZXQ8X0NoYXJULCBfSW5wdXRJdGVyPjo6ZG9fZ2V0KF9JbnB1dEl0ZXIgX19pbl9pdGUsIF9JbnB1dEl0ZXIgX19lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZSYgX19zLCBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIGJvb2wmIF9feCkgY29uc3QgeworICBpZiAoX19zLmZsYWdzKCkgJiBpb3NfYmFzZTo6Ym9vbGFscGhhKSB7CisgICAgcmV0dXJuIF9TVExQX1BSSVYgX19kb19nZXRfYWxwaGFib29sKF9faW5faXRlLCBfX2VuZCwgX19zLCBfX2VyciwgX194LCAoX0NoYXJUKikwKTsKKyAgfQorICBlbHNlIHsKKyAgICBsb25nIF9fbHg7CisgICAgX0lucHV0SXRlciBfX3RtcCA9IF9TVExQX1BSSVYgX19kb19nZXRfaW50ZWdlcihfX2luX2l0ZSwgX19lbmQsIF9fcywgX19lcnIsIF9fbHgsIChfQ2hhclQqKTAgKTsKKyAgICBpZiAoIShfX2VyciAmIGlvc19iYXNlOjpmYWlsYml0KSkgeworICAgICAgaWYgKF9fbHggPT0gMCkKKyAgICAgICAgX194ID0gZmFsc2U7CisgICAgICBlbHNlIGlmIChfX2x4ID09IDEpCisgICAgICAgIF9feCA9IHRydWU7CisgICAgICBlbHNlCisgICAgICAgIF9fZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OworICAgIH0KKyAgICByZXR1cm4gX190bXA7CisgIH0KK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfRklYX0xJQlJBUllfSVNTVUVTKQordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0lucHV0SXRlcj4KK19JbnB1dEl0ZXIKK251bV9nZXQ8X0NoYXJULCBfSW5wdXRJdGVyPjo6ZG9fZ2V0KF9JbnB1dEl0ZXIgX19pbl9pdGUsIF9JbnB1dEl0ZXIgX19lbmQsIGlvc19iYXNlJiBfX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2Vyciwgc2hvcnQmIF9fdmFsKSBjb25zdAoreyByZXR1cm4gX1NUTFBfUFJJViBfX2RvX2dldF9pbnRlZ2VyKF9faW5faXRlLCBfX2VuZCwgX19zdHIsIF9fZXJyLCBfX3ZhbCwgKF9DaGFyVCopMCApOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9JbnB1dEl0ZXI+CitfSW5wdXRJdGVyCitudW1fZ2V0PF9DaGFyVCwgX0lucHV0SXRlcj46OmRvX2dldChfSW5wdXRJdGVyIF9faW5faXRlLCBfSW5wdXRJdGVyIF9fZW5kLCBpb3NfYmFzZSYgX19zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIGludCYgX192YWwpIGNvbnN0Cit7IHJldHVybiBfU1RMUF9QUklWIF9fZG9fZ2V0X2ludGVnZXIoX19pbl9pdGUsIF9fZW5kLCBfX3N0ciwgX19lcnIsIF9fdmFsLCAoX0NoYXJUKikwICk7IH0KKworI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9JbnB1dEl0ZXI+CitfSW5wdXRJdGVyCitudW1fZ2V0PF9DaGFyVCwgX0lucHV0SXRlcj46OmRvX2dldChfSW5wdXRJdGVyIF9faW5faXRlLCBfSW5wdXRJdGVyIF9fZW5kLCBpb3NfYmFzZSYgX19zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIGxvbmcmIF9fdmFsKSBjb25zdAoreyByZXR1cm4gX1NUTFBfUFJJViBfX2RvX2dldF9pbnRlZ2VyKF9faW5faXRlLCBfX2VuZCwgX19zdHIsIF9fZXJyLCBfX3ZhbCwgKF9DaGFyVCopMCApOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9JbnB1dEl0ZXI+CitfSW5wdXRJdGVyCitudW1fZ2V0PF9DaGFyVCwgX0lucHV0SXRlcj46OmRvX2dldChfSW5wdXRJdGVyIF9faW5faXRlLCBfSW5wdXRJdGVyIF9fZW5kLCBpb3NfYmFzZSYgX19zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCYgX192YWwpIGNvbnN0Cit7IHJldHVybiBfU1RMUF9QUklWIF9fZG9fZ2V0X2ludGVnZXIoX19pbl9pdGUsIF9fZW5kLCBfX3N0ciwgX19lcnIsIF9fdmFsLCAoX0NoYXJUKikwICk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0lucHV0SXRlcj4KK19JbnB1dEl0ZXIKK251bV9nZXQ8X0NoYXJULCBfSW5wdXRJdGVyPjo6ZG9fZ2V0KF9JbnB1dEl0ZXIgX19pbl9pdGUsIF9JbnB1dEl0ZXIgX19lbmQsIGlvc19iYXNlJiBfX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCYgX192YWwpIGNvbnN0Cit7IHJldHVybiBfU1RMUF9QUklWIF9fZG9fZ2V0X2ludGVnZXIoX19pbl9pdGUsIF9fZW5kLCBfX3N0ciwgX19lcnIsIF9fdmFsLCAoX0NoYXJUKikwICk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0lucHV0SXRlcj4KK19JbnB1dEl0ZXIKK251bV9nZXQ8X0NoYXJULCBfSW5wdXRJdGVyPjo6ZG9fZ2V0KF9JbnB1dEl0ZXIgX19pbl9pdGUsIF9JbnB1dEl0ZXIgX19lbmQsIGlvc19iYXNlJiBfX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcmIF9fdmFsKSBjb25zdAoreyByZXR1cm4gX1NUTFBfUFJJViBfX2RvX2dldF9pbnRlZ2VyKF9faW5faXRlLCBfX2VuZCwgX19zdHIsIF9fZXJyLCBfX3ZhbCwgKF9DaGFyVCopMCApOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9JbnB1dEl0ZXI+CitfSW5wdXRJdGVyCitudW1fZ2V0PF9DaGFyVCwgX0lucHV0SXRlcj46OmRvX2dldChfSW5wdXRJdGVyIF9faW5faXRlLCBfSW5wdXRJdGVyIF9fZW5kLCBpb3NfYmFzZSYgX19zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCYgX192YWwpIGNvbnN0Cit7IHJldHVybiBfU1RMUF9QUklWIF9fZG9fZ2V0X2Zsb2F0KF9faW5faXRlLCBfX2VuZCwgX19zdHIsIF9fZXJyLCBfX3ZhbCwgKF9DaGFyVCopMCApOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9JbnB1dEl0ZXI+CitfSW5wdXRJdGVyCitudW1fZ2V0PF9DaGFyVCwgX0lucHV0SXRlcj46OmRvX2dldChfSW5wdXRJdGVyIF9faW5faXRlLCBfSW5wdXRJdGVyIF9fZW5kLCBpb3NfYmFzZSYgX19zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUmIF9fdmFsKSBjb25zdAoreyByZXR1cm4gX1NUTFBfUFJJViBfX2RvX2dldF9mbG9hdChfX2luX2l0ZSwgX19lbmQsIF9fc3RyLCBfX2VyciwgX192YWwsIChfQ2hhclQqKTAgKTsgfQorCisjaWYgIWRlZmluZWQgKF9TVExQX05PX0xPTkdfRE9VQkxFKQordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0lucHV0SXRlcj4KK19JbnB1dEl0ZXIKK251bV9nZXQ8X0NoYXJULCBfSW5wdXRJdGVyPjo6ZG9fZ2V0KF9JbnB1dEl0ZXIgX19pbl9pdGUsIF9JbnB1dEl0ZXIgX19lbmQsIGlvc19iYXNlJiBfX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgZG91YmxlJiBfX3ZhbCkgY29uc3QKK3sgcmV0dXJuIF9TVExQX1BSSVYgX19kb19nZXRfZmxvYXQoX19pbl9pdGUsIF9fZW5kLCBfX3N0ciwgX19lcnIsIF9fdmFsLCAoX0NoYXJUKikwICk7IH0KKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfSW5wdXRJdGVyPgorX0lucHV0SXRlcgorbnVtX2dldDxfQ2hhclQsIF9JbnB1dEl0ZXI+Ojpkb19nZXQoX0lucHV0SXRlciBfX2luX2l0ZSwgX0lucHV0SXRlciBfX2VuZCwgaW9zX2Jhc2UmIF9fc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZComIF9fcCkgY29uc3QgeworI2lmIGRlZmluZWQgKF9TVExQX0xPTkdfTE9ORykgJiYgIWRlZmluZWQgKF9fTVJDX18pICAgIC8vKnR5IDEyLzA3LzIwMDEgLSBNckNwcCBjYW4gbm90IGNhc3QgZnJvbSBsb25nIGxvbmcgdG8gdm9pZCoKKyAgdW5zaWduZWQgX1NUTFBfTE9OR19MT05HIF9fdmFsOworI2Vsc2UKKyAgdW5zaWduZWQgbG9uZyBfX3ZhbDsKKyNlbmRpZgorICBpdGVyX3R5cGUgX190bXAgPSBfU1RMUF9QUklWIF9fZG9fZ2V0X2ludGVnZXIoX19pbl9pdGUsIF9fZW5kLCBfX3N0ciwgX19lcnIsIF9fdmFsLCAoX0NoYXJUKikwICk7CisgIGlmICghKF9fZXJyICYgaW9zX2Jhc2U6OmZhaWxiaXQpKQorICAgIF9fcCA9IF9fUkVJTlRFUlBSRVRfQ0FTVCh2b2lkKiwgX192YWwpOworICByZXR1cm4gX190bXA7Cit9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9MT05HX0xPTkcpCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfSW5wdXRJdGVyPgorX0lucHV0SXRlcgorbnVtX2dldDxfQ2hhclQsIF9JbnB1dEl0ZXI+Ojpkb19nZXQoX0lucHV0SXRlciBfX2luX2l0ZSwgX0lucHV0SXRlciBfX2VuZCwgaW9zX2Jhc2UmIF9fc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfTE9OR19MT05HJiBfX3ZhbCkgY29uc3QKK3sgcmV0dXJuIF9TVExQX1BSSVYgX19kb19nZXRfaW50ZWdlcihfX2luX2l0ZSwgX19lbmQsIF9fc3RyLCBfX2VyciwgX192YWwsIChfQ2hhclQqKTAgKTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfSW5wdXRJdGVyPgorX0lucHV0SXRlcgorbnVtX2dldDxfQ2hhclQsIF9JbnB1dEl0ZXI+Ojpkb19nZXQoX0lucHV0SXRlciBfX2luX2l0ZSwgX0lucHV0SXRlciBfX2VuZCwgaW9zX2Jhc2UmIF9fc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgX1NUTFBfTE9OR19MT05HJiBfX3ZhbCkgY29uc3QKK3sgcmV0dXJuIF9TVExQX1BSSVYgX19kb19nZXRfaW50ZWdlcihfX2luX2l0ZSwgX19lbmQsIF9fc3RyLCBfX2VyciwgX192YWwsIChfQ2hhclQqKTAgKTsgfQorI2VuZGlmCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2VuZGlmIC8qIF9TVExQX05VTUVSSUNfRkFDRVRTX0MgKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL19udW1fZ2V0LmggYi9zdGxwb3J0L3N0bC9fbnVtX2dldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1Zjc5MzUKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9fbnVtX2dldC5oCkBAIC0wLDAgKzEsMjM3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworLy8gV0FSTklORzogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgQysrCisvLyBzdGFuZGFyZCBsaWJyYXJ5IGhlYWRlcnMuICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSB0aGlzIGhlYWRlcgorLy8gZmlsZSBkaXJlY3RseS4KKworCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX05VTV9HRVRfSAorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9OVU1fR0VUX0gKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9JU1RSRUFNQlVGX0lURVJBVE9SX0gKKyMgIGluY2x1ZGUgPHN0bC9faXN0cmVhbWJ1Zl9pdGVyYXRvci5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfQ19MT0NBTEVfSAorIyAgaW5jbHVkZSA8c3RsL2NfbG9jYWxlLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9OVU1QVU5DVF9ICisjICBpbmNsdWRlIDxzdGwvX251bXB1bmN0Lmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DVFlQRV9ICisjICBpbmNsdWRlIDxzdGwvX2N0eXBlLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9JT1NUUkVBTV9TVFJJTkdfSAorIyAgaW5jbHVkZSA8c3RsL19pb3N0cmVhbV9zdHJpbmcuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0ZBQ0VUU19GV0RfSAorIyAgaW5jbHVkZSA8c3RsL19mYWNldHNfZndkLmg+CisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbnVtX2dldCBmYWNldHMKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0lucHV0SXRlcj4KK2NsYXNzIG51bV9nZXQ6IHB1YmxpYyBsb2NhbGU6OmZhY2V0IHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBfQ2hhclQgICAgIGNoYXJfdHlwZTsKKyAgdHlwZWRlZiBfSW5wdXRJdGVyIGl0ZXJfdHlwZTsKKworICBleHBsaWNpdCBudW1fZ2V0KHNpemVfdCBfX3JlZnMgPSAwKTogbG9jYWxlOjpmYWNldChfX3JlZnMpIHt9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fQk9PTCkKKyAgX0lucHV0SXRlciBnZXQoX0lucHV0SXRlciBfX2lpLCBfSW5wdXRJdGVyIF9fZW5kLCBpb3NfYmFzZSYgX19zdHIsCisgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgYm9vbCYgX192YWwpIGNvbnN0CisgIHsgcmV0dXJuIGRvX2dldChfX2lpLCBfX2VuZCwgX19zdHIsIF9fZXJyLCBfX3ZhbCk7IH0KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfRklYX0xJQlJBUllfSVNTVUVTKQorICBfSW5wdXRJdGVyIGdldChfSW5wdXRJdGVyIF9faWksIF9JbnB1dEl0ZXIgX19lbmQsIGlvc19iYXNlJiBfX3N0ciwKKyAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCBzaG9ydCYgX192YWwpIGNvbnN0CisgIHsgcmV0dXJuIGRvX2dldChfX2lpLCBfX2VuZCwgX19zdHIsIF9fZXJyLCBfX3ZhbCk7IH0KKworICBfSW5wdXRJdGVyIGdldChfSW5wdXRJdGVyIF9faWksIF9JbnB1dEl0ZXIgX19lbmQsIGlvc19iYXNlJiBfX3N0ciwKKyAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCBpbnQmIF9fdmFsKSBjb25zdAorICB7IHJldHVybiBkb19nZXQoX19paSwgX19lbmQsIF9fc3RyLCBfX2VyciwgX192YWwpOyB9CisjZW5kaWYKKworICBfSW5wdXRJdGVyIGdldChfSW5wdXRJdGVyIF9faWksIF9JbnB1dEl0ZXIgX19lbmQsIGlvc19iYXNlJiBfX3N0ciwKKyAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCBsb25nJiBfX3ZhbCkgY29uc3QKKyAgeyByZXR1cm4gZG9fZ2V0KF9faWksIF9fZW5kLCBfX3N0ciwgX19lcnIsIF9fdmFsKTsgfQorCisgIF9JbnB1dEl0ZXIgZ2V0KF9JbnB1dEl0ZXIgX19paSwgX0lucHV0SXRlciBfX2VuZCwgaW9zX2Jhc2UmIF9fc3RyLAorICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIHVuc2lnbmVkIHNob3J0JiBfX3ZhbCkgY29uc3QKKyAgeyByZXR1cm4gZG9fZ2V0KF9faWksIF9fZW5kLCBfX3N0ciwgX19lcnIsIF9fdmFsKTsgfQorCisgIF9JbnB1dEl0ZXIgZ2V0KF9JbnB1dEl0ZXIgX19paSwgX0lucHV0SXRlciBfX2VuZCwgaW9zX2Jhc2UmIF9fc3RyLAorICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIHVuc2lnbmVkIGludCYgX192YWwpIGNvbnN0CisgIHsgcmV0dXJuIGRvX2dldChfX2lpLCBfX2VuZCwgX19zdHIsIF9fZXJyLCBfX3ZhbCk7IH0KKworICBfSW5wdXRJdGVyIGdldChfSW5wdXRJdGVyIF9faWksIF9JbnB1dEl0ZXIgX19lbmQsIGlvc19iYXNlJiBfX3N0ciwKKyAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCB1bnNpZ25lZCBsb25nJiBfX3ZhbCkgY29uc3QKKyAgeyByZXR1cm4gZG9fZ2V0KF9faWksIF9fZW5kLCBfX3N0ciwgX19lcnIsIF9fdmFsKTsgfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfTE9OR19MT05HKQorICBfSW5wdXRJdGVyIGdldChfSW5wdXRJdGVyIF9faWksIF9JbnB1dEl0ZXIgX19lbmQsIGlvc19iYXNlJiBfX3N0ciwKKyAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCBfU1RMUF9MT05HX0xPTkcmIF9fdmFsKSBjb25zdAorICB7IHJldHVybiBkb19nZXQoX19paSwgX19lbmQsIF9fc3RyLCBfX2VyciwgX192YWwpOyB9CisKKyAgX0lucHV0SXRlciBnZXQoX0lucHV0SXRlciBfX2lpLCBfSW5wdXRJdGVyIF9fZW5kLCBpb3NfYmFzZSYgX19zdHIsCisgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgdW5zaWduZWQgX1NUTFBfTE9OR19MT05HJiBfX3ZhbCkgY29uc3QKKyAgeyByZXR1cm4gZG9fZ2V0KF9faWksIF9fZW5kLCBfX3N0ciwgX19lcnIsIF9fdmFsKTsgfQorI2VuZGlmIC8qIF9TVExQX0xPTkdfTE9ORyAqLworCisgIF9JbnB1dEl0ZXIgZ2V0KF9JbnB1dEl0ZXIgX19paSwgX0lucHV0SXRlciBfX2VuZCwgaW9zX2Jhc2UmIF9fc3RyLAorICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIGZsb2F0JiBfX3ZhbCkgY29uc3QKKyAgeyByZXR1cm4gZG9fZ2V0KF9faWksIF9fZW5kLCBfX3N0ciwgX19lcnIsIF9fdmFsKTsgfQorCisgIF9JbnB1dEl0ZXIgZ2V0KF9JbnB1dEl0ZXIgX19paSwgX0lucHV0SXRlciBfX2VuZCwgaW9zX2Jhc2UmIF9fc3RyLAorICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIGRvdWJsZSYgX192YWwpIGNvbnN0CisgIHsgcmV0dXJuIGRvX2dldChfX2lpLCBfX2VuZCwgX19zdHIsIF9fZXJyLCBfX3ZhbCk7IH0KKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19MT05HX0RPVUJMRSkKKyAgX0lucHV0SXRlciBnZXQoX0lucHV0SXRlciBfX2lpLCBfSW5wdXRJdGVyIF9fZW5kLCBpb3NfYmFzZSYgX19zdHIsCisgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgbG9uZyBkb3VibGUmIF9fdmFsKSBjb25zdAorICB7IHJldHVybiBkb19nZXQoX19paSwgX19lbmQsIF9fc3RyLCBfX2VyciwgX192YWwpOyB9CisjIGVuZGlmCisKKyAgX0lucHV0SXRlciBnZXQoX0lucHV0SXRlciBfX2lpLCBfSW5wdXRJdGVyIF9fZW5kLCBpb3NfYmFzZSYgX19zdHIsCisgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2Vyciwgdm9pZComIF9fdmFsKSBjb25zdAorICB7IHJldHVybiBkb19nZXQoX19paSwgX19lbmQsIF9fc3RyLCBfX2VyciwgX192YWwpOyB9CisKKyAgc3RhdGljIGxvY2FsZTo6aWQgaWQ7CisKK3Byb3RlY3RlZDoKKyAgfm51bV9nZXQoKSB7fQorCisgIHR5cGVkZWYgc3RyaW5nICAgICAgICAgICAgICAgc3RyaW5nX3R5cGU7CisgIHR5cGVkZWYgY3R5cGU8X0NoYXJUPiAgICAgICAgX0N0eXBlOworICB0eXBlZGVmIG51bXB1bmN0PF9DaGFyVD4gICAgIF9OdW1wdW5jdDsKKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19CT09MKQorICB2aXJ0dWFsIF9JbnB1dEl0ZXIgZG9fZ2V0KF9JbnB1dEl0ZXIgX19paSwgX0lucHV0SXRlciBfX2VuZCwgaW9zX2Jhc2UmIF9fc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgYm9vbCYgX192YWwpIGNvbnN0OworI2VuZGlmCisKKyAgdmlydHVhbCBfSW5wdXRJdGVyIGRvX2dldChfSW5wdXRJdGVyIF9faWksIF9JbnB1dEl0ZXIgX19lbmQsIGlvc19iYXNlJiBfX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIGxvbmcmIF9fdmFsKSBjb25zdDsKKyAgdmlydHVhbCBfSW5wdXRJdGVyIGRvX2dldChfSW5wdXRJdGVyIF9faWksIF9JbnB1dEl0ZXIgX19lbmQsIGlvc19iYXNlJiBfX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIHVuc2lnbmVkIHNob3J0JiBfX3ZhbCkgY29uc3Q7CisgIHZpcnR1YWwgX0lucHV0SXRlciBkb19nZXQoX0lucHV0SXRlciBfX2lpLCBfSW5wdXRJdGVyIF9fZW5kLCBpb3NfYmFzZSYgX19zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCB1bnNpZ25lZCBpbnQmIF9fdmFsKSBjb25zdDsKKyAgdmlydHVhbCBfSW5wdXRJdGVyIGRvX2dldChfSW5wdXRJdGVyIF9faWksIF9JbnB1dEl0ZXIgX19lbmQsIGlvc19iYXNlJiBfX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIHVuc2lnbmVkIGxvbmcmIF9fdmFsKSBjb25zdDsKKworI2lmIGRlZmluZWQgKF9TVExQX0ZJWF9MSUJSQVJZX0lTU1VFUykKKyAgLy8gaXNzdWUgMTE4IDogdGhvc2UgYXJlIGFjdHVhbGx5IG5vdCBzdXBwb3NlZCB0byBiZSBoZXJlCisgIHZpcnR1YWwgX0lucHV0SXRlciBkb19nZXQoX0lucHV0SXRlciBfX2lpLCBfSW5wdXRJdGVyIF9fZW5kLCBpb3NfYmFzZSYgX19zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCBzaG9ydCYgX192YWwpIGNvbnN0OworICB2aXJ0dWFsIF9JbnB1dEl0ZXIgZG9fZ2V0KF9JbnB1dEl0ZXIgX19paSwgX0lucHV0SXRlciBfX2VuZCwgaW9zX2Jhc2UmIF9fc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgaW50JiBfX3ZhbCkgY29uc3Q7CisjZW5kaWYKKworICB2aXJ0dWFsIF9JbnB1dEl0ZXIgZG9fZ2V0KF9JbnB1dEl0ZXIgX19paSwgX0lucHV0SXRlciBfX2VuZCwgaW9zX2Jhc2UmIF9fc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgZmxvYXQmIF9fdmFsKSBjb25zdDsKKyAgdmlydHVhbCBfSW5wdXRJdGVyIGRvX2dldChfSW5wdXRJdGVyIF9faWksIF9JbnB1dEl0ZXIgX19lbmQsIGlvc19iYXNlJiBfX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIGRvdWJsZSYgX192YWwpIGNvbnN0OworICB2aXJ0dWFsIF9JbnB1dEl0ZXIgZG9fZ2V0KF9JbnB1dEl0ZXIgX19paSwgX0lucHV0SXRlciBfX2VuZCwgaW9zX2Jhc2UmIF9fc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2Vyciwgdm9pZComIF9fcCkgY29uc3Q7CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTE9OR19ET1VCTEUpCisgIHZpcnR1YWwgX0lucHV0SXRlciBkb19nZXQoX0lucHV0SXRlciBfX2lpLCBfSW5wdXRJdGVyIF9fZW5kLCBpb3NfYmFzZSYgX19zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCBsb25nIGRvdWJsZSYgX192YWwpIGNvbnN0OworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9MT05HX0xPTkcpCisgIHZpcnR1YWwgX0lucHV0SXRlciBkb19nZXQoX0lucHV0SXRlciBfX2lpLCBfSW5wdXRJdGVyIF9fZW5kLCBpb3NfYmFzZSYgX19zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCBfU1RMUF9MT05HX0xPTkcmIF9fdmFsKSBjb25zdDsKKyAgdmlydHVhbCBfSW5wdXRJdGVyIGRvX2dldChfSW5wdXRJdGVyIF9faWksIF9JbnB1dEl0ZXIgX19lbmQsIGlvc19iYXNlJiBfX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIHVuc2lnbmVkIF9TVExQX0xPTkdfTE9ORyYgX192YWwpIGNvbnN0OworI2VuZGlmCisKK307CisKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9URU1QTEFURV9FWFBPUlQpCitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgbnVtX2dldDxjaGFyLCBpc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4gPjsKKy8vIF9TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBudW1fZ2V0PGNoYXIsIGNvbnN0IGNoYXIqPjsKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQorX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIG51bV9nZXQ8d2NoYXJfdCwgaXN0cmVhbWJ1Zl9pdGVyYXRvcjx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+ID47CisvLyBfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgbnVtX2dldDx3Y2hhcl90LCBjb25zdCB3Y2hhcl90Kj47CisjICBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9FWFBPU0VfU1RSRUFNX0lNUExFTUVOVEFUSU9OKQorCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK19TVExQX0RFQ0xTUEVDIGJvb2wgX1NUTFBfQ0FMTCBfX3ZhbGlkX2dyb3VwaW5nKGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9JbnRlZ2VyLCBjbGFzcyBfQ2hhclQ+Citib29sIF9TVExQX0NBTEwKK19fZ2V0X2RlY2ltYWxfaW50ZWdlcihfSW5wdXRJdGVyJiBfX2ZpcnN0LCBfSW5wdXRJdGVyJiBfX2xhc3QsIF9JbnRlZ2VyJiBfX3ZhbCwgX0NoYXJUKik7CisKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQorYm9vbCBfU1RMUF9ERUNMU1BFQyBfU1RMUF9DQUxMIF9fZ2V0X2ZkaWdpdCh3Y2hhcl90JiwgY29uc3Qgd2NoYXJfdCopOworYm9vbCBfU1RMUF9ERUNMU1BFQyBfU1RMUF9DQUxMIF9fZ2V0X2ZkaWdpdF9vcl9zZXAod2NoYXJfdCYsIHdjaGFyX3QsIGNvbnN0IHdjaGFyX3QqKTsKKyMgIGVuZGlmCisKK2lubGluZSB2b2lkICBfU1RMUF9DQUxMCitfSW5pdGlhbGl6ZV9nZXRfZmxvYXQoY29uc3QgY3R5cGU8Y2hhcj4mLAorICAgICAgICAgICAgICAgICAgICAgICBjaGFyJiBQbHVzLCBjaGFyJiBNaW51cywKKyAgICAgICAgICAgICAgICAgICAgICAgY2hhciYgcG93X2UsIGNoYXImIHBvd19FLAorICAgICAgICAgICAgICAgICAgICAgICBjaGFyKikgeworICBQbHVzID0gJysnOworICBNaW51cyA9ICctJzsKKyAgcG93X2UgPSAnZSc7CisgIHBvd19FID0gJ0UnOworfQorCisjICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkKK3ZvaWQgX1NUTFBfREVDTFNQRUMgX1NUTFBfQ0FMTCBfSW5pdGlhbGl6ZV9nZXRfZmxvYXQoY29uc3QgY3R5cGU8d2NoYXJfdD4mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Y2hhcl90Jiwgd2NoYXJfdCYsIHdjaGFyX3QmLCB3Y2hhcl90Jiwgd2NoYXJfdCopOworIyAgZW5kaWYKK3ZvaWQgX1NUTFBfREVDTFNQRUMgX1NUTFBfQ0FMTCBfX3N0cmluZ190b19mbG9hdChjb25zdCBfX2lvc3RyaW5nJiwgZmxvYXQmKTsKK3ZvaWQgX1NUTFBfREVDTFNQRUMgX1NUTFBfQ0FMTCBfX3N0cmluZ190b19mbG9hdChjb25zdCBfX2lvc3RyaW5nJiwgZG91YmxlJik7CisjICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTE9OR19ET1VCTEUpCit2b2lkIF9TVExQX0RFQ0xTUEVDIF9TVExQX0NBTEwgX19zdHJpbmdfdG9fZmxvYXQoY29uc3QgX19pb3N0cmluZyYsIGxvbmcgZG91YmxlJik7CisjICBlbmRpZgorCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKworI2VuZGlmIC8qIF9TVExQX0VYUE9TRV9TVFJFQU1fSU1QTEVNRU5UQVRJT04gKi8KKworCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNpZiBkZWZpbmVkIChfU1RMUF9FWFBPU0VfU1RSRUFNX0lNUExFTUVOVEFUSU9OKSAmJiAhZGVmaW5lZCAoX1NUTFBfTElOS19USU1FX0lOU1RBTlRJQVRJT04pCisjICBpbmNsdWRlIDxzdGwvX251bV9nZXQuYz4KKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfTlVNX0dFVF9IICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CisKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL19udW1fcHV0LmMgYi9zdGxwb3J0L3N0bC9fbnVtX3B1dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMDc4MzgKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9fbnVtX3B1dC5jCkBAIC0wLDAgKzEsNTIyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworI2lmbmRlZiBfU1RMUF9OVU1fUFVUX0MKKyNkZWZpbmUgX1NUTFBfTlVNX1BVVF9DCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfTlVNX1BVVF9ICisjICBpbmNsdWRlIDxzdGwvX251bV9wdXQuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0xJTUlUUworIyAgaW5jbHVkZSA8c3RsL19saW1pdHMuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCisvLyBfX2RvX3B1dF9mbG9hdCBhbmQgaXRzIGhlbHBlciBmdW5jdGlvbnMuICBTdHJhdGVneTogd3JpdGUgdGhlIG91dHB1dAorLy8gdG8gYSBidWZmZXIgb2YgY2hhciwgdHJhbnNmb3JtIHRoZSBidWZmZXIgdG8gX0NoYXJULCBhbmQgdGhlbiBjb3B5CisvLyBpdCB0byB0aGUgb3V0cHV0LgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG51bV9wdXQgZmFjZXQKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX091dHB1dEl0ZXI+CitfT3V0cHV0SXRlciAgX1NUTFBfQ0FMTAorX19jb3B5X2Zsb2F0X2FuZF9maWxsKGNvbnN0IF9DaGFyVCogX19maXJzdCwgY29uc3QgX0NoYXJUKiBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXIgX19vaSwKKyAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1zaXplIF9fd2lkdGgsIF9DaGFyVCBfX2ZpbGwsCisgICAgICAgICAgICAgICAgICAgICAgX0NoYXJUIF9feHBsdXMsIF9DaGFyVCBfX3htaW51cykgeworICBpZiAoX193aWR0aCA8PSBfX2xhc3QgLSBfX2ZpcnN0KQorICAgIHJldHVybiBfU1RMUF9TVEQ6OmNvcHkoX19maXJzdCwgX19sYXN0LCBfX29pKTsKKyAgZWxzZSB7CisgICAgc3RyZWFtc2l6ZSBfX3BhZCA9IF9fd2lkdGggLSAoX19sYXN0IC0gX19maXJzdCk7CisgICAgaW9zX2Jhc2U6OmZtdGZsYWdzIF9fZGlyID0gX19mbGFncyAmIGlvc19iYXNlOjphZGp1c3RmaWVsZDsKKworICAgIGlmIChfX2RpciA9PSBpb3NfYmFzZTo6bGVmdCkgeworICAgICAgX19vaSA9IF9TVExQX1NURDo6Y29weShfX2ZpcnN0LCBfX2xhc3QsIF9fb2kpOworICAgICAgcmV0dXJuIF9TVExQX1BSSVYgX19maWxsX24oX19vaSwgX19wYWQsIF9fZmlsbCk7CisgICAgfQorICAgIGVsc2UgaWYgKF9fZGlyID09IGlvc19iYXNlOjppbnRlcm5hbCAmJiBfX2ZpcnN0ICE9IF9fbGFzdCAmJgorICAgICAgICAgICAgICgqX19maXJzdCA9PSBfX3hwbHVzIHx8ICpfX2ZpcnN0ID09IF9feG1pbnVzKSkgeworICAgICAgKl9fb2krKyA9ICpfX2ZpcnN0Kys7CisgICAgICBfX29pID0gX1NUTFBfUFJJViBfX2ZpbGxfbihfX29pLCBfX3BhZCwgX19maWxsKTsKKyAgICAgIHJldHVybiBfU1RMUF9TVEQ6OmNvcHkoX19maXJzdCwgX19sYXN0LCBfX29pKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBfX29pID0gX1NUTFBfUFJJViBfX2ZpbGxfbihfX29pLCBfX3BhZCwgX19maWxsKTsKKyAgICAgIHJldHVybiBfU1RMUF9TVEQ6OmNvcHkoX19maXJzdCwgX19sYXN0LCBfX29pKTsKKyAgICB9CisgIH0KK30KKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQorLy8gSGVscGVyIHJvdXRpbmUgZm9yIHdjaGFyX3QKK3RlbXBsYXRlIDxjbGFzcyBfT3V0cHV0SXRlcj4KK19PdXRwdXRJdGVyICBfU1RMUF9DQUxMCitfX3B1dF9mbG9hdChfX2lvc3RyaW5nICZfX3N0ciwgX091dHB1dEl0ZXIgX19vaSwKKyAgICAgICAgICAgIGlvc19iYXNlJiBfX2YsIHdjaGFyX3QgX19maWxsLAorICAgICAgICAgICAgd2NoYXJfdCBfX2RlY2ltYWxfcG9pbnQsIHdjaGFyX3QgX19zZXAsCisgICAgICAgICAgICBzaXplX3QgX19ncm91cF9wb3MsIGNvbnN0IHN0cmluZyYgX19ncm91cGluZykgeworICBjb25zdCBjdHlwZTx3Y2hhcl90PiYgX19jdCA9IHVzZV9mYWNldDxjdHlwZTx3Y2hhcl90PiA+KF9fZi5nZXRsb2MoKSk7CisKKyAgX19pb3dzdHJpbmcgX193YnVmOworICBfX2NvbnZlcnRfZmxvYXRfYnVmZmVyKF9fc3RyLCBfX3didWYsIF9fY3QsIF9fZGVjaW1hbF9wb2ludCk7CisKKyAgaWYgKCFfX2dyb3VwaW5nLmVtcHR5KCkpIHsKKyAgICBfX2luc2VydF9ncm91cGluZyhfX3didWYsIF9fZ3JvdXBfcG9zLCBfX2dyb3VwaW5nLAorICAgICAgICAgICAgICAgICAgICAgIF9fc2VwLCBfX2N0LndpZGVuKCcrJyksIF9fY3Qud2lkZW4oJy0nKSwgMCk7CisgIH0KKworICByZXR1cm4gX19jb3B5X2Zsb2F0X2FuZF9maWxsKF9fd2J1Zi5kYXRhKCksIF9fd2J1Zi5kYXRhKCkgKyBfX3didWYuc2l6ZSgpLCBfX29pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZi5mbGFncygpLCBfX2Yud2lkdGgoMCksIF9fZmlsbCwgX19jdC53aWRlbignKycpLCBfX2N0LndpZGVuKCctJykpOworfQorI2VuZGlmIC8qIFdDSEFSX1QgKi8KKworLy8gSGVscGVyIHJvdXRpbmUgZm9yIGNoYXIKK3RlbXBsYXRlIDxjbGFzcyBfT3V0cHV0SXRlcj4KK19PdXRwdXRJdGVyICBfU1RMUF9DQUxMCitfX3B1dF9mbG9hdChfX2lvc3RyaW5nICZfX3N0ciwgX091dHB1dEl0ZXIgX19vaSwKKyAgICAgICAgICAgIGlvc19iYXNlJiBfX2YsIGNoYXIgX19maWxsLAorICAgICAgICAgICAgY2hhciBfX2RlY2ltYWxfcG9pbnQsIGNoYXIgX19zZXAsCisgICAgICAgICAgICBzaXplX3QgX19ncm91cF9wb3MsIGNvbnN0IHN0cmluZyYgX19ncm91cGluZykgeworICBpZiAoKF9fZ3JvdXBfcG9zIDwgX19zdHIuc2l6ZSgpKSAmJiAoX19zdHJbX19ncm91cF9wb3NdID09ICcuJykpIHsKKyAgICBfX3N0cltfX2dyb3VwX3Bvc10gPSBfX2RlY2ltYWxfcG9pbnQ7CisgIH0KKworICBpZiAoIV9fZ3JvdXBpbmcuZW1wdHkoKSkgeworICAgIF9faW5zZXJ0X2dyb3VwaW5nKF9fc3RyLCBfX2dyb3VwX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICBfX2dyb3VwaW5nLCBfX3NlcCwgJysnLCAnLScsIDApOworICB9CisKKyAgcmV0dXJuIF9fY29weV9mbG9hdF9hbmRfZmlsbChfX3N0ci5kYXRhKCksIF9fc3RyLmRhdGEoKSArIF9fc3RyLnNpemUoKSwgX19vaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2YuZmxhZ3MoKSwgX19mLndpZHRoKDApLCBfX2ZpbGwsICcrJywgJy0nKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX091dHB1dEl0ZXIsIGNsYXNzIF9GbG9hdD4KK19PdXRwdXRJdGVyIF9TVExQX0NBTEwKK19fZG9fcHV0X2Zsb2F0KF9PdXRwdXRJdGVyIF9fcywgaW9zX2Jhc2UmIF9fZiwKKyAgICAgICAgICAgICAgICBfQ2hhclQgX19maWxsLCBfRmxvYXQgX194KSB7CisgIF9faW9zdHJpbmcgX19idWY7CisKKyAgc2l6ZV90IF9fZ3JvdXBfcG9zID0gX193cml0ZV9mbG9hdChfX2J1ZiwgX19mLmZsYWdzKCksIChpbnQpX19mLnByZWNpc2lvbigpLCBfX3gpOworCisgIGNvbnN0IG51bXB1bmN0PF9DaGFyVD4mIF9fbnAgPSB1c2VfZmFjZXQ8bnVtcHVuY3Q8X0NoYXJUPiA+KF9fZi5nZXRsb2MoKSk7CisgIHJldHVybiBfX3B1dF9mbG9hdChfX2J1ZiwgX19zLCBfX2YsIF9fZmlsbCwKKyAgICAgICAgICAgICAgICAgICAgIF9fbnAuZGVjaW1hbF9wb2ludCgpLCBfX25wLnRob3VzYW5kc19zZXAoKSwKKyAgICAgICAgICAgICAgICAgICAgIF9fZ3JvdXBfcG9zLCBfX25wLmdyb3VwaW5nKCkpOworfQorCitpbmxpbmUgdm9pZCBfX2dldF9tb25leV9kaWdpdHNfYXV4IChfX2lvc3RyaW5nICZfX2J1ZiwgaW9zX2Jhc2UgJiwgX1NUTFBfTE9OR0VTVF9GTE9BVF9UWVBFIF9feCkKK3sgX19nZXRfZmxvb3JfZGlnaXRzKF9fYnVmLCBfX3gpOyB9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkKK2lubGluZSB2b2lkIF9fZ2V0X21vbmV5X2RpZ2l0c19hdXggKF9faW93c3RyaW5nICZfX3didWYsIGlvc19iYXNlICZfX2YsIF9TVExQX0xPTkdFU1RfRkxPQVRfVFlQRSBfX3gpIHsKKyAgX19pb3N0cmluZyBfX2J1ZjsKKyAgX19nZXRfZmxvb3JfZGlnaXRzKF9fYnVmLCBfX3gpOworCisgIGNvbnN0IGN0eXBlPHdjaGFyX3Q+JiBfX2N0ID0gdXNlX2ZhY2V0PGN0eXBlPHdjaGFyX3Q+ID4oX19mLmdldGxvYygpKTsKKyAgX19jb252ZXJ0X2Zsb2F0X2J1ZmZlcihfX2J1ZiwgX193YnVmLCBfX2N0LCB3Y2hhcl90KDApLCBmYWxzZSk7Cit9CisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK3ZvaWQgX1NUTFBfQ0FMTCBfX2dldF9tb25leV9kaWdpdHMoX1NUTFBfQkFTSUNfSU9TVFJJTkcoX0NoYXJUKSAmX19idWYsIGlvc19iYXNlJiBfX2YsIF9TVExQX0xPTkdFU1RfRkxPQVRfVFlQRSBfX3gpCit7IF9fZ2V0X21vbmV5X2RpZ2l0c19hdXgoX19idWYsIF9fZiwgX194KTsgfQorCisvLyBfTV9kb19wdXRfaW50ZWdlciBhbmQgaXRzIGhlbHBlciBmdW5jdGlvbnMuCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9PdXRwdXRJdGVyPgorX091dHB1dEl0ZXIgX1NUTFBfQ0FMTAorX19jb3B5X2ludGVnZXJfYW5kX2ZpbGwoY29uc3QgX0NoYXJUKiBfX2J1ZiwgcHRyZGlmZl90IF9fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXIgX19vaSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjpmbXRmbGFncyBfX2ZsZywgc3RyZWFtc2l6ZSBfX3dpZCwgX0NoYXJUIF9fZmlsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9DaGFyVCBfX3hwbHVzLCBfQ2hhclQgX194bWludXMpIHsKKyAgaWYgKF9fbGVuID49IF9fd2lkKQorICAgIHJldHVybiBfU1RMUF9TVEQ6OmNvcHkoX19idWYsIF9fYnVmICsgX19sZW4sIF9fb2kpOworICBlbHNlIHsKKyAgICAvL2Nhc3RpbmcgbnVtZXJpY19saW1pdHM8cHRyZGlmZl90Pjo6bWF4IHRvIHN0cmVhbXNpemUgb25seSB3b3JrcyBpcyBwdHJkaWZmX3QgaXMgc2lnbmVkIG9yIHN0cmVhbXNpemUgcmVwcmVzZW50YXRpb24KKyAgICAvL2lzIGxhcmdlciB0aGFuIHB0cmRpZmZfdCBvbmUuCisgICAgX1NUTFBfU1RBVElDX0FTU0VSVCgoc2l6ZW9mKHN0cmVhbXNpemUpID4gc2l6ZW9mKHB0cmRpZmZfdCkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAoKHNpemVvZihzdHJlYW1zaXplKSA9PSBzaXplb2YocHRyZGlmZl90KSkgJiYgbnVtZXJpY19saW1pdHM8cHRyZGlmZl90Pjo6aXNfc2lnbmVkKSkKKyAgICBwdHJkaWZmX3QgX19wYWQgPSBfX1NUQVRJQ19DQVNUKHB0cmRpZmZfdCwgKG1pbikgKF9fU1RBVElDX0NBU1Qoc3RyZWFtc2l6ZSwgKG51bWVyaWNfbGltaXRzPHB0cmRpZmZfdD46Om1heCkoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX1NUQVRJQ19DQVNUKHN0cmVhbXNpemUsIF9fd2lkIC0gX19sZW4pKSk7CisgICAgaW9zX2Jhc2U6OmZtdGZsYWdzIF9fZGlyID0gX19mbGcgJiBpb3NfYmFzZTo6YWRqdXN0ZmllbGQ7CisKKyAgICBpZiAoX19kaXIgPT0gaW9zX2Jhc2U6OmxlZnQpIHsKKyAgICAgIF9fb2kgPSBfU1RMUF9TVEQ6OmNvcHkoX19idWYsIF9fYnVmICsgX19sZW4sIF9fb2kpOworICAgICAgcmV0dXJuIF9TVExQX1BSSVYgX19maWxsX24oX19vaSwgX19wYWQsIF9fZmlsbCk7CisgICAgfQorICAgIGVsc2UgaWYgKF9fZGlyID09IGlvc19iYXNlOjppbnRlcm5hbCAmJiBfX2xlbiAhPSAwICYmCisgICAgICAgICAgICAgKF9fYnVmWzBdID09IF9feHBsdXMgfHwgX19idWZbMF0gPT0gX194bWludXMpKSB7CisgICAgICAqX19vaSsrID0gX19idWZbMF07CisgICAgICBfX29pID0gX19maWxsX24oX19vaSwgX19wYWQsIF9fZmlsbCk7CisgICAgICByZXR1cm4gX1NUTFBfU1REOjpjb3B5KF9fYnVmICsgMSwgX19idWYgKyBfX2xlbiwgX19vaSk7CisgICAgfQorICAgIGVsc2UgaWYgKF9fZGlyID09IGlvc19iYXNlOjppbnRlcm5hbCAmJiBfX2xlbiA+PSAyICYmCisgICAgICAgICAgICAgKF9fZmxnICYgaW9zX2Jhc2U6OnNob3diYXNlKSAmJgorICAgICAgICAgICAgIChfX2ZsZyAmIGlvc19iYXNlOjpiYXNlZmllbGQpID09IGlvc19iYXNlOjpoZXgpIHsKKyAgICAgICpfX29pKysgPSBfX2J1ZlswXTsKKyAgICAgICpfX29pKysgPSBfX2J1ZlsxXTsKKyAgICAgIF9fb2kgPSBfX2ZpbGxfbihfX29pLCBfX3BhZCwgX19maWxsKTsKKyAgICAgIHJldHVybiBfU1RMUF9TVEQ6OmNvcHkoX19idWYgKyAyLCBfX2J1ZiArIF9fbGVuLCBfX29pKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBfX29pID0gX19maWxsX24oX19vaSwgX19wYWQsIF9fZmlsbCk7CisgICAgICByZXR1cm4gX1NUTFBfU1REOjpjb3B5KF9fYnVmLCBfX2J1ZiArIF9fbGVuLCBfX29pKTsKKyAgICB9CisgIH0KK30KKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQorLy8gSGVscGVyIGZ1bmN0aW9uIGZvciB3Y2hhcl90Cit0ZW1wbGF0ZSA8Y2xhc3MgX091dHB1dEl0ZXI+CitfT3V0cHV0SXRlciBfU1RMUF9DQUxMCitfX3B1dF9pbnRlZ2VyKGNoYXIqIF9fYnVmLCBjaGFyKiBfX2llbmQsIF9PdXRwdXRJdGVyIF9fcywKKyAgICAgICAgICAgICAgaW9zX2Jhc2UmIF9fZiwKKyAgICAgICAgICAgICAgaW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MsIHdjaGFyX3QgX19maWxsKSB7CisgIGxvY2FsZSBfX2xvYyA9IF9fZi5nZXRsb2MoKTsKKyAgY29uc3QgY3R5cGU8d2NoYXJfdD4mIF9fY3QgPSB1c2VfZmFjZXQ8Y3R5cGU8d2NoYXJfdD4gPihfX2xvYyk7CisKKyAgd2NoYXJfdCBfX3hwbHVzICA9IF9fY3Qud2lkZW4oJysnKTsKKyAgd2NoYXJfdCBfX3htaW51cyA9IF9fY3Qud2lkZW4oJy0nKTsKKworICB3Y2hhcl90IF9fd2J1Zls2NF07CisgIF9fY3Qud2lkZW4oX19idWYsIF9faWVuZCwgX193YnVmKTsKKyAgcHRyZGlmZl90IF9fbGVuID0gX19pZW5kIC0gX19idWY7CisgIHdjaGFyX3QqIF9fZWVuZCA9IF9fd2J1ZiArIF9fbGVuOworCisgIGNvbnN0IG51bXB1bmN0PHdjaGFyX3Q+JiBfX25wID0gdXNlX2ZhY2V0PG51bXB1bmN0PHdjaGFyX3Q+ID4oX19sb2MpOworICBjb25zdCBzdHJpbmcmIF9fZ3JvdXBpbmcgPSBfX25wLmdyb3VwaW5nKCk7CisKKyAgaWYgKCFfX2dyb3VwaW5nLmVtcHR5KCkpIHsKKyAgICBpbnQgX19iYXNlY2hhcnM7CisgICAgaWYgKF9fZmxhZ3MgJiBpb3NfYmFzZTo6c2hvd2Jhc2UpCisgICAgICBzd2l0Y2ggKF9fZmxhZ3MgJiBpb3NfYmFzZTo6YmFzZWZpZWxkKSB7CisgICAgICAgIGNhc2UgaW9zX2Jhc2U6OmhleDogX19iYXNlY2hhcnMgPSAyOyBicmVhazsKKyAgICAgICAgY2FzZSBpb3NfYmFzZTo6b2N0OiBfX2Jhc2VjaGFycyA9IDE7IGJyZWFrOworICAgICAgICBkZWZhdWx0OiBfX2Jhc2VjaGFycyA9IDA7CisgICAgICB9CisgICAgZWxzZQorICAgICAgX19iYXNlY2hhcnMgPSAwOworCisgICAgX19sZW4gPSBfX2luc2VydF9ncm91cGluZyhfX3didWYsIF9fZWVuZCwgX19ncm91cGluZywgX19ucC50aG91c2FuZHNfc2VwKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3hwbHVzLCBfX3htaW51cywgX19iYXNlY2hhcnMpOworICB9CisKKyAgcmV0dXJuIF9fY29weV9pbnRlZ2VyX2FuZF9maWxsKCh3Y2hhcl90KilfX3didWYsIF9fbGVuLCBfX3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ZsYWdzLCBfX2Yud2lkdGgoMCksIF9fZmlsbCwgX194cGx1cywgX194bWludXMpOworfQorI2VuZGlmCisKKy8vIEhlbHBlciBmdW5jdGlvbiBmb3IgY2hhcgordGVtcGxhdGUgPGNsYXNzIF9PdXRwdXRJdGVyPgorX091dHB1dEl0ZXIgX1NUTFBfQ0FMTAorX19wdXRfaW50ZWdlcihjaGFyKiBfX2J1ZiwgY2hhciogX19pZW5kLCBfT3V0cHV0SXRlciBfX3MsCisgICAgICAgICAgICAgIGlvc19iYXNlJiBfX2YsIGlvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzLCBjaGFyIF9fZmlsbCkgeworICBjaGFyIF9fZ3JwYnVmWzY0XTsKKyAgcHRyZGlmZl90IF9fbGVuID0gX19pZW5kIC0gX19idWY7CisKKyAgY29uc3QgbnVtcHVuY3Q8Y2hhcj4mIF9fbnAgPSB1c2VfZmFjZXQ8bnVtcHVuY3Q8Y2hhcj4gPihfX2YuZ2V0bG9jKCkpOworICBjb25zdCBzdHJpbmcmIF9fZ3JvdXBpbmcgPSBfX25wLmdyb3VwaW5nKCk7CisKKyAgaWYgKCFfX2dyb3VwaW5nLmVtcHR5KCkpIHsKKyAgICBpbnQgX19iYXNlY2hhcnM7CisgICAgaWYgKF9fZmxhZ3MgJiBpb3NfYmFzZTo6c2hvd2Jhc2UpCisgICAgICBzd2l0Y2ggKF9fZmxhZ3MgJiBpb3NfYmFzZTo6YmFzZWZpZWxkKSB7CisgICAgICAgIGNhc2UgaW9zX2Jhc2U6OmhleDogX19iYXNlY2hhcnMgPSAyOyBicmVhazsKKyAgICAgICAgY2FzZSBpb3NfYmFzZTo6b2N0OiBfX2Jhc2VjaGFycyA9IDE7IGJyZWFrOworICAgICAgICBkZWZhdWx0OiBfX2Jhc2VjaGFycyA9IDA7CisgICAgICB9CisgICAgZWxzZQorICAgICAgX19iYXNlY2hhcnMgPSAwOworCisgICAgIC8vIG1ha2Ugc3VyZSB0aGVyZSBpcyByb29tIGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlcgorICAgICAvLyB3ZSBwYXNzIHRvIF9faW5zZXJ0X2dyb3VwaW5nCisgICAgX1NUTFBfU1REOjpjb3B5KF9fYnVmLCBfX2llbmQsIChjaGFyICopIF9fZ3JwYnVmKTsKKyAgICBfX2J1ZiA9IF9fZ3JwYnVmOworICAgIF9faWVuZCA9IF9fZ3JwYnVmICsgX19sZW47CisgICAgX19sZW4gPSBfX2luc2VydF9ncm91cGluZyhfX2J1ZiwgX19pZW5kLCBfX2dyb3VwaW5nLCBfX25wLnRob3VzYW5kc19zZXAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcrJywgJy0nLCBfX2Jhc2VjaGFycyk7CisgIH0KKworICByZXR1cm4gX19jb3B5X2ludGVnZXJfYW5kX2ZpbGwoX19idWYsIF9fbGVuLCBfX3MsIF9fZmxhZ3MsIF9fZi53aWR0aCgwKSwgX19maWxsLCAnKycsICctJyk7Cit9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9MT05HX0xPTkcpCit0eXBlZGVmIF9TVExQX0xPTkdfTE9ORyBfX21heF9pbnRfdDsKK3R5cGVkZWYgdW5zaWduZWQgX1NUTFBfTE9OR19MT05HIF9fdW1heF9pbnRfdDsKKyNlbHNlCit0eXBlZGVmIGxvbmcgX19tYXhfaW50X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgX191bWF4X2ludF90OworI2VuZGlmCisKK19TVExQX0RFQ0xTUEVDIGNvbnN0IGNoYXIqIF9TVExQX0NBTEwgX19oZXhfY2hhcl90YWJsZV9sbygpOworX1NUTFBfREVDTFNQRUMgY29uc3QgY2hhciogX1NUTFBfQ0FMTCBfX2hleF9jaGFyX3RhYmxlX2hpKCk7CisKK3RlbXBsYXRlIDxjbGFzcyBfSW50ZWdlcj4KK2lubGluZSBjaGFyKiBfU1RMUF9DQUxMCitfX3dyaXRlX2RlY2ltYWxfYmFja3dhcmQoY2hhciogX19wdHIsIF9JbnRlZ2VyIF9feCwgaW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MsIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKiBpc19zaWduZWQgKi8pIHsKKyAgY29uc3QgYm9vbCBfX25lZ2F0aXZlID0gX194IDwgMCA7CisgIF9fbWF4X2ludF90IF9fdGVtcCA9IF9feDsKKyAgX191bWF4X2ludF90IF9fdXRlbXAgPSBfX25lZ2F0aXZlPy1fX3RlbXA6X190ZW1wOworCisgIGZvciAoOyBfX3V0ZW1wICE9IDA7IF9fdXRlbXAgLz0gMTApCisgICAgKi0tX19wdHIgPSAoY2hhcikoKGludCkoX191dGVtcCAlIDEwKSArICcwJyk7CisgIC8vIHB1dCBzaWduIGlmIG5lZWRlZCBvciByZXF1ZXN0ZWQKKyAgaWYgKF9fbmVnYXRpdmUpCisgICAgKi0tX19wdHIgPSAnLSc7CisgIGVsc2UgaWYgKF9fZmxhZ3MgJiBpb3NfYmFzZTo6c2hvd3BvcykKKyAgICAqLS1fX3B0ciA9ICcrJzsKKyAgcmV0dXJuIF9fcHRyOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ludGVnZXI+CitpbmxpbmUgY2hhciogX1NUTFBfQ0FMTAorX193cml0ZV9kZWNpbWFsX2JhY2t3YXJkKGNoYXIqIF9fcHRyLCBfSW50ZWdlciBfX3gsIGlvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzLCBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qIGlzX3NpZ25lZCAqLykgeworICBmb3IgKDsgX194ICE9IDA7IF9feCAvPSAxMCkKKyAgICAqLS1fX3B0ciA9IChjaGFyKSgoaW50KShfX3ggJSAxMCkgKyAnMCcpOworICAvLyBwdXQgc2lnbiBpZiByZXF1ZXN0ZWQKKyAgaWYgKF9fZmxhZ3MgJiBpb3NfYmFzZTo6c2hvd3BvcykKKyAgICAqLS1fX3B0ciA9ICcrJzsKKyAgcmV0dXJuIF9fcHRyOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ludGVnZXI+CitjaGFyKiBfU1RMUF9DQUxMCitfX3dyaXRlX2ludGVnZXJfYmFja3dhcmQoY2hhciogX19idWYsIGlvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzLCBfSW50ZWdlciBfX3gpIHsKKyAgY2hhciogX19wdHIgPSBfX2J1ZjsKKworICBpZiAoX194ID09IDApIHsKKyAgICAqLS1fX3B0ciA9ICcwJzsKKyAgICBpZiAoKF9fZmxhZ3MgJiBpb3NfYmFzZTo6c2hvd3BvcykgJiYgKChfX2ZsYWdzICYgKGlvc19iYXNlOjpvY3QgfCBpb3NfYmFzZTo6aGV4KSkgPT0gMCkpCisgICAgICAqLS1fX3B0ciA9ICcrJzsKKyAgICAvLyBvY3Qgb3IgaGV4IGJhc2Ugc2hhbGwgbm90IGJlIGFkZGVkIHRvIHRoZSAwIHZhbHVlIChzZWUgJyMnIGZsYWcgaW4gQyBmb3JtYXRpbmcgc3RyaW5ncykKKyAgfQorICBlbHNlIHsKKyAgICBzd2l0Y2ggKF9fZmxhZ3MgJiBpb3NfYmFzZTo6YmFzZWZpZWxkKSB7CisgICAgICBjYXNlIGlvc19iYXNlOjpvY3Q6CisgICAgICAgIHsKKyAgICAgICAgICBfX3VtYXhfaW50X3QgX190ZW1wID0gX194OworICAgICAgICAgIC8vIGlmIHRoZSBzaXplIG9mIGludGVnZXIgaXMgbGVzcyB0aGFuIDgsIGNsZWFyIHVwcGVyIHBhcnQKKyAgICAgICAgICBpZiAoIHNpemVvZihfX3gpIDwgOCAgJiYgc2l6ZW9mKF9fdW1heF9pbnRfdCkgPj0gOCApCisgICAgICAgICAgICBfX3RlbXAgJj0gMHhGRkZGRkZGRjsKKworICAgICAgICAgIGZvciAoOyBfX3RlbXAgIT0gMDsgX190ZW1wID4+PTMpCisgICAgICAgICAgICAqLS1fX3B0ciA9IChjaGFyKSgoKCh1bnNpZ25lZClfX3RlbXApJiAweDcpICsgJzAnKTsKKworICAgICAgICAgIC8vIHB1dCBsZWFkaW5nICcwJyBpZiBzaG93YmFzZSBpcyBzZXQKKyAgICAgICAgICBpZiAoX19mbGFncyAmIGlvc19iYXNlOjpzaG93YmFzZSkKKyAgICAgICAgICAgICotLV9fcHRyID0gJzAnOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBpb3NfYmFzZTo6aGV4OgorICAgICAgICB7CisgICAgICAgICAgY29uc3QgY2hhciogX190YWJsZV9wdHIgPSAoX19mbGFncyAmIGlvc19iYXNlOjp1cHBlcmNhc2UpID8KKyAgICAgICAgICAgIF9faGV4X2NoYXJfdGFibGVfaGkoKSA6IF9faGV4X2NoYXJfdGFibGVfbG8oKTsKKyAgICAgICAgICBfX3VtYXhfaW50X3QgX190ZW1wID0gX194OworICAgICAgICAgIC8vIGlmIHRoZSBzaXplIG9mIGludGVnZXIgaXMgbGVzcyB0aGFuIDgsIGNsZWFyIHVwcGVyIHBhcnQKKyAgICAgICAgICBpZiAoIHNpemVvZihfX3gpIDwgOCAgJiYgc2l6ZW9mKF9fdW1heF9pbnRfdCkgPj0gOCApCisgICAgICAgICAgICBfX3RlbXAgJj0gMHhGRkZGRkZGRjsKKworICAgICAgICAgIGZvciAoOyBfX3RlbXAgIT0gMDsgX190ZW1wID4+PTQpCisgICAgICAgICAgICAqLS1fX3B0ciA9IF9fdGFibGVfcHRyWygodW5zaWduZWQpX190ZW1wICYgMHhGKV07CisKKyAgICAgICAgICBpZiAoX19mbGFncyAmIGlvc19iYXNlOjpzaG93YmFzZSkgeworICAgICAgICAgICAgKi0tX19wdHIgPSBfX3RhYmxlX3B0clsxNl07CisgICAgICAgICAgICAqLS1fX3B0ciA9ICcwJzsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICAvL2Nhc2UgaW9zX2Jhc2U6OmRlYzoKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHsKKyNpZiBkZWZpbmVkKF9fSFBfYUNDKSAmJiAoX19IUF9hQ0MgPT0gMSkKKyAgICAgICAgICBib29sIF9Jc1NpZ25lZCA9ICEoKF9JbnRlZ2VyKS0xID4gMCk7CisgICAgICAgICAgaWYgKF9Jc1NpZ25lZCkKKyAgICAgICAgICAgIF9fcHRyID0gX193cml0ZV9kZWNpbWFsX2JhY2t3YXJkKF9fcHRyLCBfX3gsIF9fZmxhZ3MsIF9fdHJ1ZV90eXBlKCkgKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBfX3B0ciA9IF9fd3JpdGVfZGVjaW1hbF9iYWNrd2FyZChfX3B0ciwgX194LCBfX2ZsYWdzLCBfX2ZhbHNlX3R5cGUoKSApOworI2Vsc2UKKyAgICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fYm9vbDJ0eXBlPG51bWVyaWNfbGltaXRzPF9JbnRlZ2VyPjo6aXNfc2lnbmVkPjo6X1JldCBfSXNTaWduZWQ7CisgICAgICAgICAgX19wdHIgPSBfX3dyaXRlX2RlY2ltYWxfYmFja3dhcmQoX19wdHIsIF9feCwgX19mbGFncywgX0lzU2lnbmVkKCkpOworI2VuZGlmCisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgLy8gcmV0dXJuIHBvaW50ZXIgdG8gYmVnaW5uaW5nIG9mIHRoZSBzdHJpbmcKKyAgcmV0dXJuIF9fcHRyOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfT3V0cHV0SXRlciwgY2xhc3MgX0ludGVnZXI+CitfT3V0cHV0SXRlciBfU1RMUF9DQUxMCitfX2RvX3B1dF9pbnRlZ2VyKF9PdXRwdXRJdGVyIF9fcywgaW9zX2Jhc2UmIF9fZiwgX0NoYXJUIF9fZmlsbCwgX0ludGVnZXIgX194KSB7CisgIC8vIGJ1ZmZlciBzaXplID0gbnVtYmVyIG9mIGJ5dGVzICogbnVtYmVyIG9mIGRpZ2l0IG5lY2Vzc2FyeSBpbiB0aGUgc21hbGxlc3QgU3RhbmRhcmQgYmFzZSAoYmFzZSA4LCAzIGRpZ2l0cy9ieXRlKQorICAvLyAgICAgICAgICAgICAgIHBsdXMgdGhlIGxvbmdlc3QgYmFzZSByZXByZXNlbnRhdGlvbiAnMHgnCisgIC8vIERvIG5vdCB1c2UgX19idWZfc2l6ZSB0byBkZWZpbmUgX19idWYgc3RhdGljIGJ1ZmZlciwgc29tZSBjb21waWxlcnMgKEhQIGFDQykgZG8gbm90IGFjY2VwdCBjb25zdCB2YXJpYWJsZSBhcworICAvLyB0aGUgc3BlY2lmaWNhdGlvbiBvZiBhIHN0YXRpYyBidWZmZXIgc2l6ZS4KKyAgY2hhciBfX2J1ZltzaXplb2YoX0ludGVnZXIpICogMyArIDJdOworICBjb25zdCBwdHJkaWZmX3QgX19idWZfc2l6ZSA9IHNpemVvZihfX2J1ZikgLyBzaXplb2YoY2hhcik7CisgIGlvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19mLmZsYWdzKCk7CisgIGNoYXIqIF9faWJlZyA9IF9fd3JpdGVfaW50ZWdlcl9iYWNrd2FyZCgoY2hhciopX19idWYgKyBfX2J1Zl9zaXplLCBfX2ZsYWdzLCBfX3gpOworICByZXR1cm4gX19wdXRfaW50ZWdlcihfX2liZWcsIChjaGFyKilfX2J1ZiArIF9fYnVmX3NpemUsIF9fcywgX19mLCBfX2ZsYWdzLCBfX2ZpbGwpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfT3V0cHV0SXRlcj4KK19PdXRwdXRJdGVyIF9TVExQX0NBTEwKK19fZG9fcHV0X2Jvb2woX091dHB1dEl0ZXIgX19zLCBpb3NfYmFzZSYgX19mLCBfQ2hhclQgX19maWxsLCBib29sIF9feCkgeworICBjb25zdCBudW1wdW5jdDxfQ2hhclQ+JiBfX25wID0gdXNlX2ZhY2V0PG51bXB1bmN0PF9DaGFyVD4gPihfX2YuZ2V0bG9jKCkpOworCisgIGJhc2ljX3N0cmluZzxfQ2hhclQsIGNoYXJfdHJhaXRzPF9DaGFyVD4sIGFsbG9jYXRvcjxfQ2hhclQ+ID4gX19zdHIgPSBfX3ggPyBfX25wLnRydWVuYW1lKCkgOiBfX25wLmZhbHNlbmFtZSgpOworCisgIHN0cmVhbXNpemUgX193aWQgPSBfX2Yud2lkdGgoMCk7CisgIGlmIChfX3N0ci5zaXplKCkgPj0gX19TVEFUSUNfQ0FTVChzaXplX3QsIF9fd2lkKSkKKyAgICByZXR1cm4gX1NUTFBfU1REOjpjb3B5KF9fc3RyLmJlZ2luKCksIF9fc3RyLmVuZCgpLCBfX3MpOworICBlbHNlIHsKKyAgICBzdHJlYW1zaXplIF9fcGFkID0gX193aWQgLSBfX3N0ci5zaXplKCk7CisgICAgaW9zX2Jhc2U6OmZtdGZsYWdzIF9fZGlyID0gX19mLmZsYWdzKCkgJiBpb3NfYmFzZTo6YWRqdXN0ZmllbGQ7CisKKyAgICBpZiAoX19kaXIgPT0gaW9zX2Jhc2U6OmxlZnQpIHsKKyAgICAgIF9fcyA9IF9TVExQX1NURDo6Y29weShfX3N0ci5iZWdpbigpLCBfX3N0ci5lbmQoKSwgX19zKTsKKyAgICAgIHJldHVybiBfX2ZpbGxfbihfX3MsIF9fcGFkLCBfX2ZpbGwpOworICAgIH0KKyAgICBlbHNlIC8qIGNvdmVycyByaWdodCBhbmQgaW50ZXJuYWwgcGFkZGluZyAqLyB7CisgICAgICBfX3MgPSBfX2ZpbGxfbihfX3MsIF9fcGFkLCBfX2ZpbGwpOworICAgICAgcmV0dXJuIF9TVExQX1NURDo6Y29weShfX3N0ci5iZWdpbigpLCBfX3N0ci5lbmQoKSwgX19zKTsKKyAgICB9CisgIH0KK30KK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCisvLworLy8gbnVtX3B1dDw+CisvLworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfT3V0cHV0SXRlcmF0b3I+Citsb2NhbGU6OmlkIG51bV9wdXQ8X0NoYXJULCBfT3V0cHV0SXRlcmF0b3I+OjppZDsKKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19CT09MKQordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX091dHB1dEl0ZXI+CitfT3V0cHV0SXRlcgorbnVtX3B1dDxfQ2hhclQsIF9PdXRwdXRJdGVyPjo6ZG9fcHV0KF9PdXRwdXRJdGVyIF9fcywgaW9zX2Jhc2UmIF9fZiwgX0NoYXJUIF9fZmlsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIF9fdmFsKSBjb25zdCB7CisgIGlmICghKF9fZi5mbGFncygpICYgaW9zX2Jhc2U6OmJvb2xhbHBoYSkpCisgICAgLy8gMjIuMi4yLjIuMi4yMzogc2hhbGwgcmV0dXJuIGRvX3B1dCBmb3IgaW50IGFuZCBub3QgZGlyZWN0bHkgX19kb19wdXRfaW50ZWdlci4KKyAgICByZXR1cm4gZG9fcHV0KF9fcywgX19mLCBfX2ZpbGwsIF9fU1RBVElDX0NBU1QobG9uZywgX192YWwpKTsKKworICByZXR1cm4gX1NUTFBfUFJJViBfX2RvX3B1dF9ib29sKF9fcywgX19mLCBfX2ZpbGwsIF9fdmFsKTsKK30KKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfT3V0cHV0SXRlcj4KK19PdXRwdXRJdGVyCitudW1fcHV0PF9DaGFyVCwgX091dHB1dEl0ZXI+Ojpkb19wdXQoX091dHB1dEl0ZXIgX19zLCBpb3NfYmFzZSYgX19mLCBfQ2hhclQgX19maWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgX192YWwpIGNvbnN0Cit7IHJldHVybiBfU1RMUF9QUklWIF9fZG9fcHV0X2ludGVnZXIoX19zLCBfX2YsIF9fZmlsbCwgX192YWwpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9PdXRwdXRJdGVyPgorX091dHB1dEl0ZXIKK251bV9wdXQ8X0NoYXJULCBfT3V0cHV0SXRlcj46OmRvX3B1dChfT3V0cHV0SXRlciBfX3MsIGlvc19iYXNlJiBfX2YsIF9DaGFyVCBfX2ZpbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBfX3ZhbCkgY29uc3QKK3sgcmV0dXJuIF9TVExQX1BSSVYgX19kb19wdXRfaW50ZWdlcihfX3MsIF9fZiwgX19maWxsLCBfX3ZhbCk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX091dHB1dEl0ZXI+CitfT3V0cHV0SXRlcgorbnVtX3B1dDxfQ2hhclQsIF9PdXRwdXRJdGVyPjo6ZG9fcHV0KF9PdXRwdXRJdGVyIF9fcywgaW9zX2Jhc2UmIF9fZiwgX0NoYXJUIF9fZmlsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgX192YWwpIGNvbnN0Cit7IHJldHVybiBfU1RMUF9QUklWIF9fZG9fcHV0X2Zsb2F0KF9fcywgX19mLCBfX2ZpbGwsIF9fdmFsKTsgfQorCisjaWYgIWRlZmluZWQgKF9TVExQX05PX0xPTkdfRE9VQkxFKQordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX091dHB1dEl0ZXI+CitfT3V0cHV0SXRlcgorbnVtX3B1dDxfQ2hhclQsIF9PdXRwdXRJdGVyPjo6ZG9fcHV0KF9PdXRwdXRJdGVyIF9fcywgaW9zX2Jhc2UmIF9fZiwgX0NoYXJUIF9fZmlsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGRvdWJsZSBfX3ZhbCkgY29uc3QKK3sgcmV0dXJuIF9TVExQX1BSSVYgX19kb19wdXRfZmxvYXQoX19zLCBfX2YsIF9fZmlsbCwgX192YWwpOyB9CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX0xPTkdfTE9ORykKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9PdXRwdXRJdGVyPgorX091dHB1dEl0ZXIKK251bV9wdXQ8X0NoYXJULCBfT3V0cHV0SXRlcj46OmRvX3B1dChfT3V0cHV0SXRlciBfX3MsIGlvc19iYXNlJiBfX2YsIF9DaGFyVCBfX2ZpbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfTE9OR19MT05HIF9fdmFsKSBjb25zdAoreyByZXR1cm4gX1NUTFBfUFJJViBfX2RvX3B1dF9pbnRlZ2VyKF9fcywgX19mLCBfX2ZpbGwsIF9fdmFsKTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfT3V0cHV0SXRlcj4KK19PdXRwdXRJdGVyCitudW1fcHV0PF9DaGFyVCwgX091dHB1dEl0ZXI+Ojpkb19wdXQoX091dHB1dEl0ZXIgX19zLCBpb3NfYmFzZSYgX19mLCBfQ2hhclQgX19maWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIF9TVExQX0xPTkdfTE9ORyBfX3ZhbCkgY29uc3QKK3sgcmV0dXJuIF9TVExQX1BSSVYgX19kb19wdXRfaW50ZWdlcihfX3MsIF9fZiwgX19maWxsLCBfX3ZhbCk7IH0KKyNlbmRpZiAvKiBfU1RMUF9MT05HX0xPTkcgKi8KKworCisvLyAyMi4yLjIuMi4yIFN0YWdlIDE6ICJGb3IgY29udmVyc2lvbiBmcm9tIHZvaWQqIHRoZSBzcGVjaWZpZXIgaXMgJXAuIgorLy8gVGhpcyBpcyBub3QgY2xlYXIgYW5kIEknbSByZWFsbHkgZG9uJ3QgZm9sbG93IHRoaXMgKGJlbG93KS4KK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9PdXRwdXRJdGVyPgorX091dHB1dEl0ZXIKK251bV9wdXQ8X0NoYXJULCBfT3V0cHV0SXRlcj46OmRvX3B1dChfT3V0cHV0SXRlciBfX3MsIGlvc19iYXNlJiBfX2YsIF9DaGFyVCAvKl9fZmlsbCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIF9fdmFsKSBjb25zdCB7CisgIGNvbnN0IGN0eXBlPF9DaGFyVD4mIF9fY190eXBlID0gdXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihfX2YuZ2V0bG9jKCkpOworICBpb3NfYmFzZTo6Zm10ZmxhZ3MgX19zYXZlX2ZsYWdzID0gX19mLmZsYWdzKCk7CisKKyAgX19mLnNldGYoaW9zX2Jhc2U6OmhleCwgaW9zX2Jhc2U6OmJhc2VmaWVsZCk7CisgIF9fZi5zZXRmKGlvc19iYXNlOjpzaG93YmFzZSk7CisgIF9fZi5zZXRmKGlvc19iYXNlOjppbnRlcm5hbCwgaW9zX2Jhc2U6OmFkanVzdGZpZWxkKTsKKyAgX19mLndpZHRoKChzaXplb2Yodm9pZCopICogMikgKyAyKTsgLy8gZGlnaXRzIGluIHBvaW50ZXIgdHlwZSBwbHVzICcweCcgcHJlZml4CisgIGlmICggX192YWwgPT0gMCApIHsKKyAgICAvLyBiYXNlICgnMHgnKSBub3Qgc2hvd24gZm9yIG51bGwsIGJ1dCBJIHJlYWxseSB3YW50IHRvIHR5cGUgaXQKKyAgICAvLyBmb3IgcG9pbnRlci4gUHJpbnQgaXQgZmlyc3QgaW4gdGhpcyBjYXNlLgorICAgIGNvbnN0IGNoYXIqIF9fdGFibGVfcHRyID0gKF9fc2F2ZV9mbGFncyAmIGlvc19iYXNlOjp1cHBlcmNhc2UpID8KKyAgICAgICAgICAgIF9TVExQX1BSSVYgX19oZXhfY2hhcl90YWJsZV9oaSgpIDogX1NUTFBfUFJJViBfX2hleF9jaGFyX3RhYmxlX2xvKCk7CisgICAgX19zKysgPSBfX2NfdHlwZS53aWRlbiggJzAnICk7CisgICAgX19zKysgPSBfX2NfdHlwZS53aWRlbiggX190YWJsZV9wdHJbMTZdICk7CisgICAgX19mLndpZHRoKChzaXplb2Yodm9pZCopICogMikpOyAvLyBkaWdpdHMgaW4gcG9pbnRlciB0eXBlCisgIH0gZWxzZSB7CisgICAgX19mLndpZHRoKChzaXplb2Yodm9pZCopICogMikgKyAyKTsgLy8gZGlnaXRzIGluIHBvaW50ZXIgdHlwZSBwbHVzICcweCcgcHJlZml4CisgIH0KKyNpZiBkZWZpbmVkIChfU1RMUF9NU1ZDKQorIyAgcHJhZ21hIHdhcm5pbmcgKHB1c2gpCisjICBwcmFnbWEgd2FybmluZyAoZGlzYWJsZSA6IDQzMTEpIC8vcG9pbnRlciB0cnVuY2F0aW9uIGZyb20gJ2NvbnN0IHZvaWQqJyB0byAndW5zaWduZWQgbG9uZycKKyNlbmRpZgorICBfT3V0cHV0SXRlciByZXN1bHQgPQorI2lmZGVmIF9TVExQX0xPTkdfTE9ORworICAgICggc2l6ZW9mKHZvaWQqKSA9PSBzaXplb2YodW5zaWduZWQgbG9uZykgKSA/CisjZW5kaWYKKyAgICBfU1RMUF9QUklWIF9fZG9fcHV0X2ludGVnZXIoX19zLCBfX2YsIF9fY190eXBlLndpZGVuKCcwJyksIF9fUkVJTlRFUlBSRVRfQ0FTVCh1bnNpZ25lZCBsb25nLF9fdmFsKSkKKyNpZmRlZiBfU1RMUF9MT05HX0xPTkcKKyAgICAgIDogLyogKCBzaXplb2Yodm9pZCopID09IHNpemVvZih1bnNpZ25lZCBfU1RMUF9MT05HX0xPTkcpICkgPyAqLworICAgIF9TVExQX1BSSVYgX19kb19wdXRfaW50ZWdlcihfX3MsIF9fZiwgX19jX3R5cGUud2lkZW4oJzAnKSwgX19SRUlOVEVSUFJFVF9DQVNUKHVuc2lnbmVkIF9TVExQX0xPTkdfTE9ORyxfX3ZhbCkpCisjZW5kaWYKKyAgICAgICAgOworI2lmIGRlZmluZWQgKF9TVExQX01TVkMpCisjICBwcmFnbWEgd2FybmluZyAocG9wKQorI2VuZGlmCisgIF9fZi5mbGFncyhfX3NhdmVfZmxhZ3MpOworICByZXR1cm4gcmVzdWx0OworfQorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNlbmRpZiAvKiBfU1RMUF9OVU1fUFVUX0MgKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL19udW1fcHV0LmggYi9zdGxwb3J0L3N0bC9fbnVtX3B1dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5YmZjMDEKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9fbnVtX3B1dC5oCkBAIC0wLDAgKzEsMTg3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworLy8gV0FSTklORzogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgQysrCisvLyBzdGFuZGFyZCBsaWJyYXJ5IGhlYWRlcnMuICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSB0aGlzIGhlYWRlcgorLy8gZmlsZSBkaXJlY3RseS4KKworCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX05VTV9QVVRfSAorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9OVU1fUFVUX0gKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9OVU1QVU5DVF9ICisjICBpbmNsdWRlIDxzdGwvX251bXB1bmN0Lmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DVFlQRV9ICisjICBpbmNsdWRlIDxzdGwvX2N0eXBlLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9PU1RSRUFNQlVGX0lURVJBVE9SX0gKKyMgIGluY2x1ZGUgPHN0bC9fb3N0cmVhbWJ1Zl9pdGVyYXRvci5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfSU9TVFJFQU1fU1RSSU5HX0gKKyMgIGluY2x1ZGUgPHN0bC9faW9zdHJlYW1fc3RyaW5nLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9GQUNFVFNfRldEX0gKKyMgIGluY2x1ZGUgPHN0bC9fZmFjZXRzX2Z3ZC5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG51bV9wdXQgZmFjZXQKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX091dHB1dEl0ZXI+CitjbGFzcyBudW1fcHV0OiBwdWJsaWMgbG9jYWxlOjpmYWNldCB7CitwdWJsaWM6CisgIHR5cGVkZWYgX0NoYXJUICAgICAgY2hhcl90eXBlOworICB0eXBlZGVmIF9PdXRwdXRJdGVyIGl0ZXJfdHlwZTsKKworICBleHBsaWNpdCBudW1fcHV0KHNpemVfdCBfX3JlZnMgPSAwKSA6IGxvY2FsZTo6ZmFjZXQoX19yZWZzKSB7fQorCisjaWYgIWRlZmluZWQgKF9TVExQX05PX0JPT0wpCisgIGl0ZXJfdHlwZSBwdXQoaXRlcl90eXBlIF9fcywgaW9zX2Jhc2UmIF9fZiwgY2hhcl90eXBlIF9fZmlsbCwKKyAgICAgICAgICAgICAgICBib29sIF9fdmFsKSBjb25zdCB7CisgICAgcmV0dXJuIGRvX3B1dChfX3MsIF9fZiwgX19maWxsLCBfX3ZhbCk7CisgIH0KKyNlbmRpZgorICBpdGVyX3R5cGUgcHV0KGl0ZXJfdHlwZSBfX3MsIGlvc19iYXNlJiBfX2YsIGNoYXJfdHlwZSBfX2ZpbGwsCisgICAgICAgICAgICAgICBsb25nIF9fdmFsKSBjb25zdCB7CisgICAgcmV0dXJuIGRvX3B1dChfX3MsIF9fZiwgX19maWxsLCBfX3ZhbCk7CisgIH0KKworICBpdGVyX3R5cGUgcHV0KGl0ZXJfdHlwZSBfX3MsIGlvc19iYXNlJiBfX2YsIGNoYXJfdHlwZSBfX2ZpbGwsCisgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBfX3ZhbCkgY29uc3QgeworICAgIHJldHVybiBkb19wdXQoX19zLCBfX2YsIF9fZmlsbCwgX192YWwpOworICB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9MT05HX0xPTkcpCisgIGl0ZXJfdHlwZSBwdXQoaXRlcl90eXBlIF9fcywgaW9zX2Jhc2UmIF9fZiwgY2hhcl90eXBlIF9fZmlsbCwKKyAgICAgICAgICAgICAgICBfU1RMUF9MT05HX0xPTkcgX192YWwpIGNvbnN0IHsKKyAgICByZXR1cm4gZG9fcHV0KF9fcywgX19mLCBfX2ZpbGwsIF9fdmFsKTsKKyAgfQorCisgIGl0ZXJfdHlwZSBwdXQoaXRlcl90eXBlIF9fcywgaW9zX2Jhc2UmIF9fZiwgY2hhcl90eXBlIF9fZmlsbCwKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBfU1RMUF9MT05HX0xPTkcgX192YWwpIGNvbnN0IHsKKyAgICByZXR1cm4gZG9fcHV0KF9fcywgX19mLCBfX2ZpbGwsIF9fdmFsKTsKKyAgfQorI2VuZGlmCisKKyAgaXRlcl90eXBlIHB1dChpdGVyX3R5cGUgX19zLCBpb3NfYmFzZSYgX19mLCBjaGFyX3R5cGUgX19maWxsLAorICAgICAgICAgICAgICAgIGRvdWJsZSBfX3ZhbCkgY29uc3QgeworICAgIHJldHVybiBkb19wdXQoX19zLCBfX2YsIF9fZmlsbCwgKGRvdWJsZSlfX3ZhbCk7CisgIH0KKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19MT05HX0RPVUJMRSkKKyAgaXRlcl90eXBlIHB1dChpdGVyX3R5cGUgX19zLCBpb3NfYmFzZSYgX19mLCBjaGFyX3R5cGUgX19maWxsLAorICAgICAgICAgICAgICAgIGxvbmcgZG91YmxlIF9fdmFsKSBjb25zdCB7CisgICAgcmV0dXJuIGRvX3B1dChfX3MsIF9fZiwgX19maWxsLCBfX3ZhbCk7CisgIH0KKyNlbmRpZgorCisgIGl0ZXJfdHlwZSBwdXQoaXRlcl90eXBlIF9fcywgaW9zX2Jhc2UmIF9fZiwgY2hhcl90eXBlIF9fZmlsbCwKKyAgICAgICAgICAgICAgICBjb25zdCB2b2lkICogX192YWwpIGNvbnN0IHsKKyAgICByZXR1cm4gZG9fcHV0KF9fcywgX19mLCBfX2ZpbGwsIF9fdmFsKTsKKyAgfQorCisgIHN0YXRpYyBsb2NhbGU6OmlkIGlkOworCitwcm90ZWN0ZWQ6CisgIH5udW1fcHV0KCkge30KKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fQk9PTCkKKyAgdmlydHVhbCBfT3V0cHV0SXRlciBkb19wdXQoX091dHB1dEl0ZXIgX19zLCBpb3NfYmFzZSYgX19mLCBfQ2hhclQgX19maWxsLCBib29sIF9fdmFsKSBjb25zdDsKKyNlbmRpZgorICB2aXJ0dWFsIF9PdXRwdXRJdGVyIGRvX3B1dChfT3V0cHV0SXRlciBfX3MsIGlvc19iYXNlJiBfX2YsIF9DaGFyVCBfX2ZpbGwsIGxvbmcgX192YWwpIGNvbnN0OworICB2aXJ0dWFsIF9PdXRwdXRJdGVyIGRvX3B1dChfT3V0cHV0SXRlciBfX3MsIGlvc19iYXNlJiBfX2YsIF9DaGFyVCBfX2ZpbGwsIHVuc2lnbmVkIGxvbmcgX192YWwpIGNvbnN0OworICB2aXJ0dWFsIF9PdXRwdXRJdGVyIGRvX3B1dChfT3V0cHV0SXRlciBfX3MsIGlvc19iYXNlJiBfX2YsIF9DaGFyVCBfX2ZpbGwsIGRvdWJsZSBfX3ZhbCkgY29uc3Q7CisjaWYgIWRlZmluZWQgKF9TVExQX05PX0xPTkdfRE9VQkxFKQorICB2aXJ0dWFsIF9PdXRwdXRJdGVyIGRvX3B1dChfT3V0cHV0SXRlciBfX3MsIGlvc19iYXNlJiBfX2YsIF9DaGFyVCBfX2ZpbGwsIGxvbmcgZG91YmxlIF9fdmFsKSBjb25zdDsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfTE9OR19MT05HKQorICB2aXJ0dWFsIF9PdXRwdXRJdGVyIGRvX3B1dChfT3V0cHV0SXRlciBfX3MsIGlvc19iYXNlJiBfX2YsIF9DaGFyVCBfX2ZpbGwsIF9TVExQX0xPTkdfTE9ORyBfX3ZhbCkgY29uc3Q7CisgIHZpcnR1YWwgX091dHB1dEl0ZXIgZG9fcHV0KF9PdXRwdXRJdGVyIF9fcywgaW9zX2Jhc2UmIF9fZiwgX0NoYXJUIF9fZmlsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIF9TVExQX0xPTkdfTE9ORyBfX3ZhbCkgY29uc3QgOworI2VuZGlmCisgIHZpcnR1YWwgX091dHB1dEl0ZXIgZG9fcHV0KF9PdXRwdXRJdGVyIF9fcywgaW9zX2Jhc2UmIF9fZiwgX0NoYXJUIF9fZmlsbCwgY29uc3Qgdm9pZCogX192YWwpIGNvbnN0OworfTsKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9URU1QTEFURV9FWFBPUlQpCitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgbnVtX3B1dDxjaGFyLCBvc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4gPjsKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQorX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIG51bV9wdXQ8d2NoYXJfdCwgb3N0cmVhbWJ1Zl9pdGVyYXRvcjx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+ID47CisjICBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9FWFBPU0VfU1RSRUFNX0lNUExFTUVOVEFUSU9OKQorCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfSW50ZWdlcj4KK2NoYXIqIF9TVExQX0NBTEwKK19fd3JpdGVfaW50ZWdlcl9iYWNrd2FyZChjaGFyKiBfX2J1ZiwgaW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MsIF9JbnRlZ2VyIF9feCk7CisKKy8qCisgKiBSZXR1cm5zIHRoZSBwb3NpdGlvbiBvbiB0aGUgcmlnaHQgb2YgdGhlIGRpZ2l0cyB0aGF0IGhhcyB0byBiZSBjb25zaWRlcmVkCisgKiBmb3IgdGhlIGFwcGxpY2F0aW9uIG9mIHRoZSBncm91cGluZyBwb2xpY3kuCisgKi8KK2V4dGVybiBzaXplX3QgX1NUTFBfQ0FMTCBfX3dyaXRlX2Zsb2F0KF9faW9zdHJpbmcmLCBpb3NfYmFzZTo6Zm10ZmxhZ3MsIGludCwgZG91YmxlKTsKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9OT19MT05HX0RPVUJMRSkKK2V4dGVybiBzaXplX3QgX1NUTFBfQ0FMTCBfX3dyaXRlX2Zsb2F0KF9faW9zdHJpbmcmLCBpb3NfYmFzZTo6Zm10ZmxhZ3MsIGludCwgbG9uZyBkb3VibGUpOworIyAgZW5kaWYKKworLyoKKyAqIEdldHMgdGhlIGRpZ2l0cyBvZiB0aGUgaW50ZWdlciBwYXJ0LgorICovCit2b2lkIF9TVExQX0NBTEwgX19nZXRfZmxvb3JfZGlnaXRzKF9faW9zdHJpbmcmLCBfU1RMUF9MT05HRVNUX0ZMT0FUX1RZUEUpOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgordm9pZCBfU1RMUF9DQUxMIF9fZ2V0X21vbmV5X2RpZ2l0cyhfU1RMUF9CQVNJQ19JT1NUUklORyhfQ2hhclQpJiwgaW9zX2Jhc2UmLCBfU1RMUF9MT05HRVNUX0ZMT0FUX1RZUEUpOworCisjICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkKK2V4dGVybiB2b2lkIF9TVExQX0NBTEwgX19jb252ZXJ0X2Zsb2F0X2J1ZmZlcihfX2lvc3RyaW5nIGNvbnN0JiwgX19pb3dzdHJpbmcmLCBjb25zdCBjdHlwZTx3Y2hhcl90PiYsIHdjaGFyX3QsIGJvb2wgPSB0cnVlKTsKKyMgIGVuZGlmCitleHRlcm4gdm9pZCBfU1RMUF9DQUxMIF9fYWRqdXN0X2Zsb2F0X2J1ZmZlcihfX2lvc3RyaW5nJiwgY2hhcik7CisKK2V4dGVybiBjaGFyKiBfU1RMUF9DQUxMCitfX3dyaXRlX2ludGVnZXIoY2hhciogYnVmLCBpb3NfYmFzZTo6Zm10ZmxhZ3MgZmxhZ3MsIGxvbmcgeCk7CisKK2V4dGVybiBwdHJkaWZmX3QgX1NUTFBfQ0FMTCBfX2luc2VydF9ncm91cGluZyhjaGFyKiBmaXJzdCwgY2hhciogbGFzdCwgY29uc3Qgc3RyaW5nJiwgY2hhciwgY2hhciwgY2hhciwgaW50KTsKK2V4dGVybiB2b2lkIF9TVExQX0NBTEwgX19pbnNlcnRfZ3JvdXBpbmcoX19pb3N0cmluZyYsIHNpemVfdCwgY29uc3Qgc3RyaW5nJiwgY2hhciwgY2hhciwgY2hhciwgaW50KTsKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQorZXh0ZXJuIHB0cmRpZmZfdCBfU1RMUF9DQUxMIF9faW5zZXJ0X2dyb3VwaW5nKHdjaGFyX3QqLCB3Y2hhcl90KiwgY29uc3Qgc3RyaW5nJiwgd2NoYXJfdCwgd2NoYXJfdCwgd2NoYXJfdCwgaW50KTsKK2V4dGVybiB2b2lkIF9TVExQX0NBTEwgX19pbnNlcnRfZ3JvdXBpbmcoX19pb3dzdHJpbmcmLCBzaXplX3QsIGNvbnN0IHN0cmluZyYsIHdjaGFyX3QsIHdjaGFyX3QsIHdjaGFyX3QsIGludCk7CisjICBlbmRpZgorCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKworI2VuZGlmIC8qIF9TVExQX0VYUE9TRV9TVFJFQU1fSU1QTEVNRU5UQVRJT04gKi8KKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjaWYgZGVmaW5lZCAoX1NUTFBfRVhQT1NFX1NUUkVBTV9JTVBMRU1FTlRBVElPTikgJiYgIWRlZmluZWQgKF9TVExQX0xJTktfVElNRV9JTlNUQU5USUFUSU9OKQorIyAgaW5jbHVkZSA8c3RsL19udW1fcHV0LmM+CisjZW5kaWYKKworI2VuZGlmIC8qIF9TVExQX0lOVEVSTkFMX05VTUVSSUNfRkFDRVRTX0ggKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9fbnVtZXJpYy5jIGIvc3RscG9ydC9zdGwvX251bWVyaWMuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3RsL19udW1lcmljLmMKcmVuYW1lIHRvIHN0bHBvcnQvc3RsL19udW1lcmljLmMKZGlmZiAtLWdpdCBhL3N0bC9fbnVtZXJpYy5oIGIvc3RscG9ydC9zdGwvX251bWVyaWMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3RsL19udW1lcmljLmgKcmVuYW1lIHRvIHN0bHBvcnQvc3RsL19udW1lcmljLmgKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL19udW1wdW5jdC5oIGIvc3RscG9ydC9zdGwvX251bXB1bmN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBkMGZmNAotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc3RsL19udW1wdW5jdC5oCkBAIC0wLDAgKzEsMTc2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworLy8gV0FSTklORzogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgQysrCisvLyBzdGFuZGFyZCBsaWJyYXJ5IGhlYWRlcnMuICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSB0aGlzIGhlYWRlcgorLy8gZmlsZSBkaXJlY3RseS4KKworCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX05VTVBVTkNUX0gKKyNkZWZpbmUgX1NUTFBfSU5URVJOQUxfTlVNUFVOQ1RfSAorCisjaWZuZGVmIF9TVExQX0lPU19CQVNFX0gKKyMgaW5jbHVkZSA8c3RsL19pb3NfYmFzZS5oPgorI2VuZGlmCisKKyMgaWZuZGVmIF9TVExQX0NfTE9DQUxFX0gKKyMgIGluY2x1ZGUgPHN0bC9jX2xvY2FsZS5oPgorIyBlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX1NUUklOR19ICisjIGluY2x1ZGUgPHN0bC9fc3RyaW5nLmg+CisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbnVtcHVuY3QgZmFjZXRzCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+IGNsYXNzIG51bXB1bmN0IHt9OwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4gY2xhc3MgbnVtcHVuY3RfYnluYW1lIHt9OwordGVtcGxhdGUgPGNsYXNzIF9DaCwgY2xhc3MgX0luSXQ+IGNsYXNzIG51bV9nZXQ7CisKK19TVExQX1RFTVBMQVRFX05VTEwKK2NsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIG51bXB1bmN0PGNoYXI+IDogcHVibGljIGxvY2FsZTo6ZmFjZXQgeworcHVibGljOgorICB0eXBlZGVmIGNoYXIgICAgICAgICAgICAgICBjaGFyX3R5cGU7CisgIHR5cGVkZWYgc3RyaW5nICAgICAgICAgICAgIHN0cmluZ190eXBlOworCisgIGV4cGxpY2l0IG51bXB1bmN0KHNpemVfdCBfX3JlZnMgPSAwKQorICAgIDogbG9jYWxlOjpmYWNldChfX3JlZnMpIHt9CisKKyAgY2hhciBkZWNpbWFsX3BvaW50KCkgY29uc3QgeyByZXR1cm4gZG9fZGVjaW1hbF9wb2ludCgpOyB9CisgIGNoYXIgdGhvdXNhbmRzX3NlcCgpIGNvbnN0IHsgcmV0dXJuIGRvX3Rob3VzYW5kc19zZXAoKTsgfQorICBzdHJpbmcgZ3JvdXBpbmcoKSBjb25zdCB7IHJldHVybiBkb19ncm91cGluZygpOyB9CisgIHN0cmluZyB0cnVlbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGRvX3RydWVuYW1lKCk7IH0KKyAgc3RyaW5nIGZhbHNlbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGRvX2ZhbHNlbmFtZSgpOyB9CisKKyAgc3RhdGljIF9TVExQX1NUQVRJQ19ERUNMU1BFQyBsb2NhbGU6OmlkIGlkOworCitwcm90ZWN0ZWQ6CisgIH5udW1wdW5jdCgpOworCisgIHZpcnR1YWwgY2hhciBkb19kZWNpbWFsX3BvaW50KCkgY29uc3Q7CisgIHZpcnR1YWwgY2hhciBkb190aG91c2FuZHNfc2VwKCkgY29uc3Q7CisgIHZpcnR1YWwgc3RyaW5nIGRvX2dyb3VwaW5nKCkgY29uc3Q7CisgIHZpcnR1YWwgc3RyaW5nIGRvX3RydWVuYW1lKCkgY29uc3Q7CisgIHZpcnR1YWwgc3RyaW5nIGRvX2ZhbHNlbmFtZSgpICBjb25zdDsKK307CisKKyMgaWYgISBkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQorCitfU1RMUF9URU1QTEFURV9OVUxMCitjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBudW1wdW5jdDx3Y2hhcl90PiA6IHB1YmxpYyBsb2NhbGU6OmZhY2V0IHsKK3B1YmxpYzoKKyAgdHlwZWRlZiB3Y2hhcl90ICAgICAgICAgICAgICAgY2hhcl90eXBlOworICB0eXBlZGVmIHdzdHJpbmcgICAgICAgICAgICAgICBzdHJpbmdfdHlwZTsKKworICBleHBsaWNpdCBudW1wdW5jdChzaXplX3QgX19yZWZzID0gMCkKKyAgICA6IGxvY2FsZTo6ZmFjZXQoX19yZWZzKSB7fQorCisgIHdjaGFyX3QgZGVjaW1hbF9wb2ludCgpIGNvbnN0IHsgcmV0dXJuIGRvX2RlY2ltYWxfcG9pbnQoKTsgfQorICB3Y2hhcl90IHRob3VzYW5kc19zZXAoKSBjb25zdCB7IHJldHVybiBkb190aG91c2FuZHNfc2VwKCk7IH0KKyAgc3RyaW5nIGdyb3VwaW5nKCkgY29uc3QgeyByZXR1cm4gZG9fZ3JvdXBpbmcoKTsgfQorICB3c3RyaW5nIHRydWVuYW1lKCkgY29uc3QgeyByZXR1cm4gZG9fdHJ1ZW5hbWUoKTsgfQorICB3c3RyaW5nIGZhbHNlbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGRvX2ZhbHNlbmFtZSgpOyB9CisKKyAgc3RhdGljIF9TVExQX1NUQVRJQ19ERUNMU1BFQyBsb2NhbGU6OmlkIGlkOworCitwcm90ZWN0ZWQ6CisgIH5udW1wdW5jdCgpOworCisgIHZpcnR1YWwgd2NoYXJfdCBkb19kZWNpbWFsX3BvaW50KCkgY29uc3Q7CisgIHZpcnR1YWwgd2NoYXJfdCBkb190aG91c2FuZHNfc2VwKCkgY29uc3Q7CisgIHZpcnR1YWwgc3RyaW5nIGRvX2dyb3VwaW5nKCkgY29uc3Q7CisgIHZpcnR1YWwgd3N0cmluZyBkb190cnVlbmFtZSgpIGNvbnN0OworICB2aXJ0dWFsIHdzdHJpbmcgZG9fZmFsc2VuYW1lKCkgIGNvbnN0OworfTsKKworIyBlbmRpZiAvKiBXQ0hBUl9UICovCisKK19TVExQX1RFTVBMQVRFX05VTEwKK2NsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIG51bXB1bmN0X2J5bmFtZTxjaGFyPiA6IHB1YmxpYyBudW1wdW5jdDxjaGFyPiB7CisgIGZyaWVuZCBjbGFzcyBfTG9jYWxlX2ltcGw7CitwdWJsaWM6CisgIHR5cGVkZWYgY2hhciAgICAgICAgICAgICAgICBjaGFyX3R5cGU7CisgIHR5cGVkZWYgc3RyaW5nICAgICAgICAgICAgICBzdHJpbmdfdHlwZTsKKworICBleHBsaWNpdCBudW1wdW5jdF9ieW5hbWUoY29uc3QgY2hhciogX19uYW1lLCBzaXplX3QgX19yZWZzID0gMCk7CisKK3Byb3RlY3RlZDoKKworICB+bnVtcHVuY3RfYnluYW1lKCk7CisKKyAgdmlydHVhbCBjaGFyICAgZG9fZGVjaW1hbF9wb2ludCgpIGNvbnN0OworICB2aXJ0dWFsIGNoYXIgICBkb190aG91c2FuZHNfc2VwKCkgY29uc3Q7CisgIHZpcnR1YWwgc3RyaW5nIGRvX2dyb3VwaW5nKCkgICAgICBjb25zdDsKKyAgdmlydHVhbCBzdHJpbmcgZG9fdHJ1ZW5hbWUoKSAgICAgIGNvbnN0OworICB2aXJ0dWFsIHN0cmluZyBkb19mYWxzZW5hbWUoKSAgICAgY29uc3Q7CisKK3ByaXZhdGU6CisgIG51bXB1bmN0X2J5bmFtZShfTG9jYWxlX251bWVyaWMgKl9fbnVtZXJpYykKKyAgICA6IF9NX251bWVyaWMoX19udW1lcmljKSB7fQorCisgIC8vZXhwbGljaXRlbHkgZGVmaW5lZCBhcyBwcml2YXRlIHRvIGF2b2lkIHdhcm5pbmdzOgorICB0eXBlZGVmIG51bXB1bmN0X2J5bmFtZTxjaGFyPiBfU2VsZjsKKyAgbnVtcHVuY3RfYnluYW1lKF9TZWxmIGNvbnN0Jik7CisgIF9TZWxmJiBvcGVyYXRvciA9IChfU2VsZiBjb25zdCYpOworCisgIF9Mb2NhbGVfbnVtZXJpYyogX01fbnVtZXJpYzsKK307CisKKyMgaWZuZGVmIF9TVExQX05PX1dDSEFSX1QKK19TVExQX1RFTVBMQVRFX05VTEwKK2NsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIG51bXB1bmN0X2J5bmFtZTx3Y2hhcl90PjogcHVibGljIG51bXB1bmN0PHdjaGFyX3Q+IHsKKyAgZnJpZW5kIGNsYXNzIF9Mb2NhbGVfaW1wbDsKK3B1YmxpYzoKKyAgdHlwZWRlZiB3Y2hhcl90ICAgICAgICAgICAgICAgY2hhcl90eXBlOworICB0eXBlZGVmIHdzdHJpbmcgICAgICAgICAgICAgICBzdHJpbmdfdHlwZTsKKworICBleHBsaWNpdCBudW1wdW5jdF9ieW5hbWUoY29uc3QgY2hhciogX19uYW1lLCBzaXplX3QgX19yZWZzID0gMCk7CisKK3Byb3RlY3RlZDoKKyAgfm51bXB1bmN0X2J5bmFtZSgpOworCisgIHZpcnR1YWwgd2NoYXJfdCAgIGRvX2RlY2ltYWxfcG9pbnQoKSBjb25zdDsKKyAgdmlydHVhbCB3Y2hhcl90ICAgZG9fdGhvdXNhbmRzX3NlcCgpIGNvbnN0OworICB2aXJ0dWFsIHN0cmluZyBkb19ncm91cGluZygpIGNvbnN0OworICB2aXJ0dWFsIHdzdHJpbmcgZG9fdHJ1ZW5hbWUoKSBjb25zdDsKKyAgdmlydHVhbCB3c3RyaW5nIGRvX2ZhbHNlbmFtZSgpIGNvbnN0OworCitwcml2YXRlOgorICBudW1wdW5jdF9ieW5hbWUoX0xvY2FsZV9udW1lcmljICpfX251bWVyaWMpCisgICAgOiBfTV9udW1lcmljKF9fbnVtZXJpYykge30KKworICAvL2V4cGxpY2l0ZWx5IGRlZmluZWQgYXMgcHJpdmF0ZSB0byBhdm9pZCB3YXJuaW5nczoKKyAgdHlwZWRlZiBudW1wdW5jdF9ieW5hbWU8d2NoYXJfdD4gX1NlbGY7CisgIG51bXB1bmN0X2J5bmFtZShfU2VsZiBjb25zdCYpOworICBfU2VsZiYgb3BlcmF0b3IgPSAoX1NlbGYgY29uc3QmKTsKKworICBfTG9jYWxlX251bWVyaWMqIF9NX251bWVyaWM7Cit9OworCisjIGVuZGlmIC8qIFdDSEFSX1QgKi8KKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLyogX1NUTFBfTlVNUFVOQ1RfSCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgorCmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9fb3N0cmVhbS5jIGIvc3RscG9ydC9zdGwvX29zdHJlYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWJhNmMyCi0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvX29zdHJlYW0uYwpAQCAtMCwwICsxLDQ1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKyNpZm5kZWYgX1NUTFBfT1NUUkVBTV9DCisjZGVmaW5lIF9TVExQX09TVFJFQU1fQworCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX09TVFJFQU1fSAorIyAgaW5jbHVkZSA8c3RsL19vc3RyZWFtLmg+CisjZW5kaWYKKworI2lmICFkZWZpbmVkIChfU1RMUF9JTlRFUk5BTF9OVU1fUFVUX0gpCisjICBpbmNsdWRlIDxzdGwvX251bV9wdXQuaD4gICAgICAgICAgICAvLyBGb3IgYmFzaWNfc3RyZWFtYnVmIGFuZCBpdGVyYXRvcnMKKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEZWZpbml0aW9ucyBvZiBub24taW5saW5lIG1lbWJlciBmdW5jdGlvbnMuCisKKy8vIENvbnN0cnVjdG9yLCBkZXN0cnVjdG9yCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OmJhc2ljX29zdHJlYW0oYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fYnVmKQorICAgIDogYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz4oKSB7CisgIHRoaXMtPmluaXQoX19idWYpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Ojp+YmFzaWNfb3N0cmVhbSgpCit7fQorCisvLyBPdXRwdXQgZGlyZWN0bHkgZnJvbSBhIHN0cmVhbWJ1Zi4KK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Om9wZXJhdG9yPDwoYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fZnJvbSkgeworICBzZW50cnkgX19zZW50cnkoKnRoaXMpOworICBpZiAoX19zZW50cnkpIHsKKyAgICBpZiAoX19mcm9tKSB7CisgICAgICBib29sIF9fYW55X2luc2VydGVkID0gX19mcm9tLT5ncHRyKCkgIT0gX19mcm9tLT5lZ3B0cigpCisgICAgICAgID8gdGhpcy0+X01fY29weV9idWZmZXJlZChfX2Zyb20sIHRoaXMtPnJkYnVmKCkpCisgICAgICAgIDogdGhpcy0+X01fY29weV91bmJ1ZmZlcmVkKF9fZnJvbSwgdGhpcy0+cmRidWYoKSk7CisgICAgICBpZiAoIV9fYW55X2luc2VydGVkKQorICAgICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOworICB9CisKKyAgcmV0dXJuICp0aGlzOworfQorCisvLyBIZWxwZXIgZnVuY3Rpb25zIGZvciB0aGUgc3RyZWFtYnVmIHZlcnNpb24gb2Ygb3BlcmF0b3I8PC4gIFRoZQorLy8gZXhjZXB0aW9uLWhhbmRsaW5nIGNvZGUgaXMgY29tcGxpY2F0ZWQgYmVjYXVzZSBleGNlcHRpb25zIHRocm93bgorLy8gd2hpbGUgZXh0cmFjdGluZyBjaGFyYWN0ZXJzIGFyZSB0cmVhdGVkIGRpZmZlcmVudGx5IHRoYW4gZXhjZXB0aW9ucworLy8gdGhyb3duIHdoaWxlIGluc2VydGluZyBjaGFyYWN0ZXJzLgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYm9vbCBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4KKyAgOjpfTV9jb3B5X2J1ZmZlcmVkKGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX2Zyb20sCisgICAgICAgICAgICAgICAgICAgICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX190bykgeworICBib29sIF9fYW55X2luc2VydGVkID0gZmFsc2U7CisKKyAgd2hpbGUgKF9fZnJvbS0+ZWdwdHIoKSAhPSBfX2Zyb20tPmdwdHIoKSkgeworICAgIGNvbnN0IHB0cmRpZmZfdCBfX2F2YWlsID0gX19mcm9tLT5lZ3B0cigpIC0gX19mcm9tLT5ncHRyKCk7CisKKyAgICBzdHJlYW1zaXplIF9fbndyaXR0ZW47CisgICAgX1NUTFBfVFJZIHsKKyAgICAgIF9fbndyaXR0ZW4gPSBfX3RvLT5zcHV0bihfX2Zyb20tPmdwdHIoKSwgX19hdmFpbCk7CisgICAgICBfX2Zyb20tPmdidW1wKChpbnQpX19ud3JpdHRlbik7CisgICAgfQorICAgIF9TVExQX0NBVENIX0FMTCB7CisgICAgICB0aGlzLT5fTV9oYW5kbGVfZXhjZXB0aW9uKGlvc19iYXNlOjpiYWRiaXQpOworICAgICAgcmV0dXJuIF9fYW55X2luc2VydGVkOworICAgIH0KKworICAgIGlmIChfX253cml0dGVuID09IF9fYXZhaWwpIHsKKyAgICAgIF9TVExQX1RSWSB7CisgICAgICAgIGlmICh0aGlzLT5fU19lb2YoX19mcm9tLT5zZ2V0YygpKSkKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIF9fYW55X2luc2VydGVkID0gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIF9TVExQX0NBVENIX0FMTCB7CisgICAgICAgIHRoaXMtPl9NX2hhbmRsZV9leGNlcHRpb24oaW9zX2Jhc2U6OmZhaWxiaXQpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKF9fbndyaXR0ZW4gIT0gMCkKKyAgICAgIHJldHVybiB0cnVlOworICAgIGVsc2UKKyAgICAgIHJldHVybiBfX2FueV9pbnNlcnRlZDsKKyAgfQorCisgIC8vIE5vIGNoYXJhY3RlcnMgYXJlIGluIHRoZSBidWZmZXIsIGJ1dCB3ZSBhcmVuJ3QgYXQgRU9GLiAgU3dpdGNoIHRvCisgIC8vIHVuYnVmZmVyZWQgbW9kZS4KKyAgcmV0dXJuIF9fYW55X2luc2VydGVkIHx8IHRoaXMtPl9NX2NvcHlfdW5idWZmZXJlZChfX2Zyb20sIF9fdG8pOworfQorCisvKgorICogSGVscGVyIHN0cnVjdCAoZ3VhcmQpIHRvIHB1dCBiYWNrIGEgY2hhcmFjdGVyIGluIGEgc3RyZWFtYnVmCisgKiB3aGVuZXZlciBhbiBleGNlcHRpb24gb3IgYW4gZW9mIG9jY3VyLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorc3RydWN0IF9TUHV0QmFja0MgeworICB0eXBlZGVmIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+IF9TdHJlYW1CdWY7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1N0cmVhbUJ1Zjo6aW50X3R5cGUgaW50X3R5cGU7CisgIF9TUHV0QmFja0MoX1N0cmVhbUJ1ZiAqcGZyb20pCisgICAgOiBfX3Bmcm9tKHBmcm9tKSwgX19jKDApLCBfX2RvX2d1YXJkKGZhbHNlKSB7fQorICB+X1NQdXRCYWNrQygpIHsKKyAgICBpZiAoX19kb19ndWFyZCkgeworICAgICAgX19wZnJvbS0+c3B1dGJhY2tjKF9UcmFpdHM6OnRvX2NoYXJfdHlwZShfX2MpKTsKKyAgICB9CisgIH0KKworICB2b2lkIGd1YXJkKGludF90eXBlIGMpIHsKKyAgICBfX2MgPSBjOworICAgIF9fZG9fZ3VhcmQgPSB0cnVlOworICB9CisgIHZvaWQgcmVsZWFzZSgpIHsKKyAgICBfX2RvX2d1YXJkID0gZmFsc2U7CisgIH0KKworcHJpdmF0ZToKKyAgX1N0cmVhbUJ1ZiAqX19wZnJvbTsKKyAgaW50X3R5cGUgX19jOworICBib29sIF9fZG9fZ3VhcmQ7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYm9vbCBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4KKyAgOjpfTV9jb3B5X3VuYnVmZmVyZWQoYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fZnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fdG8pIHsKKyAgdHlwZWRlZiBfU1B1dEJhY2tDPF9DaGFyVCwgX1RyYWl0cz4gX1NQdXRCYWNrQ0d1YXJkOworICBib29sIF9fYW55X2luc2VydGVkID0gZmFsc2U7CisgIGludF90eXBlIF9fYzsKKworICBfU1RMUF9UUlkgeworICAgIF9TUHV0QmFja0NHdWFyZCBfX2NndWFyZChfX2Zyb20pOworICAgIGZvciAoOzspIHsKKyAgICAgIF9TVExQX1RSWSB7CisgICAgICAgIF9fYyA9IF9fZnJvbS0+c2J1bXBjKCk7CisgICAgICB9CisgICAgICBfU1RMUF9DQVRDSF9BTEwgeworICAgICAgICB0aGlzLT5fTV9oYW5kbGVfZXhjZXB0aW9uKGlvc19iYXNlOjpmYWlsYml0KTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGlmICh0aGlzLT5fU19lb2YoX19jKSkKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIF9fY2d1YXJkLmd1YXJkKF9fYyk7CisjaWYgZGVmaW5lZCAoX19ETUNfXykKKyAgICAgIF9TVExQX1RSWSB7CisjZW5kaWYKKyAgICAgIGlmICh0aGlzLT5fU19lb2YoX190by0+c3B1dGMoX1RyYWl0czo6dG9fY2hhcl90eXBlKF9fYykpKSkKKyAgICAgICAgYnJlYWs7CisKKyNpZiBkZWZpbmVkIChfX0RNQ19fKQorICAgICAgfQorICAgICAgX1NUTFBfQ0FUQ0hfQUxMIHsKKyAgICAgICAgdGhpcy0+X01faGFuZGxlX2V4Y2VwdGlvbihpb3NfYmFzZTo6YmFkYml0KTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisjZW5kaWYKKyAgICAgIF9fY2d1YXJkLnJlbGVhc2UoKTsKKyAgICAgIF9fYW55X2luc2VydGVkID0gdHJ1ZTsKKyAgICB9CisgIH0KKyAgX1NUTFBfQ0FUQ0hfQUxMIHsKKyAgICB0aGlzLT5fTV9oYW5kbGVfZXhjZXB0aW9uKGlvc19iYXNlOjpiYWRiaXQpOworICB9CisgIHJldHVybiBfX2FueV9pbnNlcnRlZDsKK30KKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCisvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIG51bWVyaWMgb3V0cHV0LgordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX051bWJlcj4KK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgIF9TVExQX0NBTEwKK19fcHV0X251bShiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsIF9OdW1iZXIgX194KSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpzZW50cnkgX1NlbnRyeTsKKyAgX1NlbnRyeSBfX3NlbnRyeShfX29zKTsKKyAgYm9vbCBfX2ZhaWxlZCA9IHRydWU7CisKKyAgaWYgKF9fc2VudHJ5KSB7CisgICAgX1NUTFBfVFJZIHsKKyAgICAgIHR5cGVkZWYgbnVtX3B1dDxfQ2hhclQsIG9zdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJULCBfVHJhaXRzPiA+IF9OdW1QdXQ7CisgICAgICBfX2ZhaWxlZCA9ICh1c2VfZmFjZXQ8X051bVB1dD4oX19vcy5nZXRsb2MoKSkpLnB1dChvc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVCwgX1RyYWl0cz4oX19vcy5yZGJ1ZigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fb3MsIF9fb3MuZmlsbCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX194KS5mYWlsZWQoKTsKKyAgICB9CisgICAgX1NUTFBfQ0FUQ0hfQUxMIHsKKyAgICAgIF9fb3MuX01faGFuZGxlX2V4Y2VwdGlvbihpb3NfYmFzZTo6YmFkYml0KTsKKyAgICB9CisgIH0KKyAgaWYgKF9fZmFpbGVkKQorICAgIF9fb3Muc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CisgIHJldHVybiBfX29zOworfQorCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKworLyoKKyAqIEluIHRoZSBmb2xsb3dpbmcgb3BlcmF0b3JzIHdlIHRyeSB0byBsaW1pdCBjb2RlIGJsb2F0IGJ5IGxpbWl0aW5nIHRoZQorICogbnVtYmVyIG9mIF9fcHV0X251bSBpbnN0YW5jaWF0aW9ucy4KKyAqLwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpvcGVyYXRvcjw8KHNob3J0IF9feCkgeworICBfU1RMUF9TVEFUSUNfQVNTRVJUKCBzaXplb2Yoc2hvcnQpIDw9IHNpemVvZihsb25nKSApCisgIGxvbmcgX190bXAgPSAoKHRoaXMtPmZsYWdzKCkgJiBfQmFzaWNfaW9zOjpiYXNlZmllbGQpICE9IGlvc19iYXNlOjpkZWMpID8KKyAgICAgICAgICAgICAgICAgIF9fU1RBVElDX0NBU1QobG9uZywgX19TVEFUSUNfQ0FTVCh1bnNpZ25lZCBzaG9ydCwgX194KSk6IF9feDsKKyAgcmV0dXJuIF9TVExQX1BSSVYgX19wdXRfbnVtKCp0aGlzLCBfX3RtcCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6b3BlcmF0b3I8PCh1bnNpZ25lZCBzaG9ydCBfX3gpIHsKKyAgX1NUTFBfU1RBVElDX0FTU0VSVCggc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSA8PSBzaXplb2YodW5zaWduZWQgbG9uZykgKQorICByZXR1cm4gX1NUTFBfUFJJViBfX3B1dF9udW0oKnRoaXMsIF9fU1RBVElDX0NBU1QodW5zaWduZWQgbG9uZyxfX3gpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpvcGVyYXRvcjw8KGludCBfX3gpIHsKKyAgX1NUTFBfU1RBVElDX0FTU0VSVCggc2l6ZW9mKGludCkgPD0gc2l6ZW9mKGxvbmcpICkKKyAgbG9uZyBfX3RtcCA9ICgodGhpcy0+ZmxhZ3MoKSAmIF9CYXNpY19pb3M6OmJhc2VmaWVsZCkgIT0gaW9zX2Jhc2U6OmRlYykgPworICAgICAgICAgICAgICAgICAgX19TVEFUSUNfQ0FTVChsb25nLCBfX1NUQVRJQ19DQVNUKHVuc2lnbmVkIGludCwgX194KSk6IF9feDsKKyAgcmV0dXJuIF9TVExQX1BSSVYgX19wdXRfbnVtKCp0aGlzLCBfX3RtcCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CisjaWYgZGVmaW5lZCAoX1dJTjY0KSB8fCAhZGVmaW5lZCAoX1NUTFBfTVNWQykgfHwgKF9TVExQX01TVkMgPCAxMzAwKQorYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Om9wZXJhdG9yPDwodW5zaWduZWQgaW50IF9feCkgeworICBfU1RMUF9TVEFUSUNfQVNTRVJUKCBzaXplb2YodW5zaWduZWQgaW50KSA8PSBzaXplb2YodW5zaWduZWQgbG9uZykgKQorI2Vsc2UKKy8qIFdlIGRlZmluZSB0aGlzIG9wZXJhdG9yIHdpdGggc2l6ZV90IHJhdGhlciB0aGFuIHVuc2lnbmVkIGludCB0byBhdm9pZAorICogNjQgYml0cyB3YXJuaW5nLgorICovCitiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6b3BlcmF0b3I8PChzaXplX3QgX194KSB7CisgIF9TVExQX1NUQVRJQ19BU1NFUlQoIHNpemVvZihzaXplX3QpIDw9IHNpemVvZih1bnNpZ25lZCBsb25nKSApCisjZW5kaWYKKyAgcmV0dXJuIF9TVExQX1BSSVYgX19wdXRfbnVtKCp0aGlzLCAgX19TVEFUSUNfQ0FTVCh1bnNpZ25lZCBsb25nLF9feCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Om9wZXJhdG9yPDwobG9uZyBfX3gpCit7IHJldHVybiBfU1RMUF9QUklWIF9fcHV0X251bSgqdGhpcywgIF9feCk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpvcGVyYXRvcjw8KHVuc2lnbmVkIGxvbmcgX194KQoreyByZXR1cm4gX1NUTFBfUFJJViBfX3B1dF9udW0oKnRoaXMsICBfX3gpOyB9CisKKyNpZmRlZiBfU1RMUF9MT05HX0xPTkcKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6b3BlcmF0b3I8PCAoX1NUTFBfTE9OR19MT05HIF9feCkKK3sgcmV0dXJuIF9TVExQX1BSSVYgX19wdXRfbnVtKCp0aGlzLCAgX194KTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Om9wZXJhdG9yPDwgKHVuc2lnbmVkIF9TVExQX0xPTkdfTE9ORyBfX3gpCit7IHJldHVybiBfU1RMUF9QUklWIF9fcHV0X251bSgqdGhpcywgIF9feCk7IH0KKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Om9wZXJhdG9yPDwoZmxvYXQgX194KQoreyByZXR1cm4gX1NUTFBfUFJJViBfX3B1dF9udW0oKnRoaXMsICBfX1NUQVRJQ19DQVNUKGRvdWJsZSxfX3gpKTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Om9wZXJhdG9yPDwoZG91YmxlIF9feCkKK3sgcmV0dXJuIF9TVExQX1BSSVYgX19wdXRfbnVtKCp0aGlzLCAgX194KTsgfQorCisjaWZuZGVmIF9TVExQX05PX0xPTkdfRE9VQkxFCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Om9wZXJhdG9yPDwobG9uZyBkb3VibGUgX194KQoreyByZXR1cm4gX1NUTFBfUFJJViBfX3B1dF9udW0oKnRoaXMsICBfX3gpOyB9CisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpvcGVyYXRvcjw8KGNvbnN0IHZvaWQqIF9feCkKK3sgcmV0dXJuIF9TVExQX1BSSVYgX19wdXRfbnVtKCp0aGlzLCAgX194KTsgfQorCisjaWZuZGVmIF9TVExQX05PX0JPT0wKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6b3BlcmF0b3I8PChib29sIF9feCkKK3sgcmV0dXJuIF9TVExQX1BSSVYgX19wdXRfbnVtKCp0aGlzLCAgX194KTsgfQorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Cit2b2lkIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6X01fcHV0X2NoYXIoX0NoYXJUIF9fYykgeworICBzZW50cnkgX19zZW50cnkoKnRoaXMpOworICBpZiAoX19zZW50cnkpIHsKKyAgICBib29sIF9fZmFpbGVkID0gdHJ1ZTsKKyAgICBfU1RMUF9UUlkgeworICAgICAgc3RyZWFtc2l6ZSBfX25wYWQgPSB0aGlzLT53aWR0aCgpID4gMCA/IHRoaXMtPndpZHRoKCkgLSAxIDogMDsKKyAgICAgIC8vICAgICAgaWYgKF9fbnBhZCA8PSAxKQorICAgICAgaWYgKF9fbnBhZCA9PSAwKQorICAgICAgICBfX2ZhaWxlZCA9IHRoaXMtPl9TX2VvZih0aGlzLT5yZGJ1ZigpLT5zcHV0YyhfX2MpKTsKKyAgICAgIGVsc2UgaWYgKCh0aGlzLT5mbGFncygpICYgaW9zX2Jhc2U6OmFkanVzdGZpZWxkKSA9PSBpb3NfYmFzZTo6bGVmdCkgeworICAgICAgICBfX2ZhaWxlZCA9IHRoaXMtPl9TX2VvZih0aGlzLT5yZGJ1ZigpLT5zcHV0YyhfX2MpKTsKKyAgICAgICAgX19mYWlsZWQgPSBfX2ZhaWxlZCB8fAorICAgICAgICAgICAgICAgICAgIHRoaXMtPnJkYnVmKCktPl9NX3NwdXRuYyh0aGlzLT5maWxsKCksIF9fbnBhZCkgIT0gX19ucGFkOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIF9fZmFpbGVkID0gdGhpcy0+cmRidWYoKS0+X01fc3B1dG5jKHRoaXMtPmZpbGwoKSwgX19ucGFkKSAhPSBfX25wYWQ7CisgICAgICAgIF9fZmFpbGVkID0gX19mYWlsZWQgfHwgdGhpcy0+X1NfZW9mKHRoaXMtPnJkYnVmKCktPnNwdXRjKF9fYykpOworICAgICAgfQorCisgICAgICB0aGlzLT53aWR0aCgwKTsKKyAgICB9CisgICAgX1NUTFBfQ0FUQ0hfQUxMIHsKKyAgICAgIHRoaXMtPl9NX2hhbmRsZV9leGNlcHRpb24oaW9zX2Jhc2U6OmJhZGJpdCk7CisgICAgfQorCisgICAgaWYgKF9fZmFpbGVkKQorICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CisgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK3ZvaWQgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpfTV9wdXRfbm93aWRlbihjb25zdCBfQ2hhclQqIF9fcykgeworICBzZW50cnkgX19zZW50cnkoKnRoaXMpOworICBpZiAoX19zZW50cnkpIHsKKyAgICBib29sIF9fZmFpbGVkID0gdHJ1ZTsKKyAgICBzdHJlYW1zaXplIF9fbiA9IF9UcmFpdHM6Omxlbmd0aChfX3MpOworICAgIHN0cmVhbXNpemUgX19ucGFkID0gdGhpcy0+d2lkdGgoKSA+IF9fbiA/IHRoaXMtPndpZHRoKCkgLSBfX24gOiAwOworCisgICAgX1NUTFBfVFJZIHsKKyAgICAgIGlmIChfX25wYWQgPT0gMCkKKyAgICAgICAgX19mYWlsZWQgPSB0aGlzLT5yZGJ1ZigpLT5zcHV0bihfX3MsIF9fbikgIT0gX19uOworICAgICAgZWxzZSBpZiAoKHRoaXMtPmZsYWdzKCkgJiBpb3NfYmFzZTo6YWRqdXN0ZmllbGQpID09IGlvc19iYXNlOjpsZWZ0KSB7CisgICAgICAgIF9fZmFpbGVkID0gdGhpcy0+cmRidWYoKS0+c3B1dG4oX19zLCBfX24pICE9IF9fbjsKKyAgICAgICAgX19mYWlsZWQgPSBfX2ZhaWxlZCB8fAorICAgICAgICAgICAgICAgICAgIHRoaXMtPnJkYnVmKCktPl9NX3NwdXRuYyh0aGlzLT5maWxsKCksIF9fbnBhZCkgIT0gX19ucGFkOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIF9fZmFpbGVkID0gdGhpcy0+cmRidWYoKS0+X01fc3B1dG5jKHRoaXMtPmZpbGwoKSwgX19ucGFkKSAhPSBfX25wYWQ7CisgICAgICAgIF9fZmFpbGVkID0gX19mYWlsZWQgfHwgdGhpcy0+cmRidWYoKS0+c3B1dG4oX19zLCBfX24pICE9IF9fbjsKKyAgICAgIH0KKworICAgICAgdGhpcy0+d2lkdGgoMCk7CisgICAgfQorICAgIF9TVExQX0NBVENIX0FMTCB7CisgICAgICB0aGlzLT5fTV9oYW5kbGVfZXhjZXB0aW9uKGlvc19iYXNlOjpiYWRiaXQpOworICAgIH0KKworICAgIGlmIChfX2ZhaWxlZCkKKyAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKKyAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgordm9pZCBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Ol9NX3B1dF93aWRlbihjb25zdCBjaGFyKiBfX3MpIHsKKyAgc2VudHJ5IF9fc2VudHJ5KCp0aGlzKTsKKyAgaWYgKF9fc2VudHJ5KSB7CisgICAgYm9vbCBfX2ZhaWxlZCA9IHRydWU7CisgICAgc3RyZWFtc2l6ZSBfX24gPSBjaGFyX3RyYWl0czxjaGFyPjo6bGVuZ3RoKF9fcyk7CisgICAgc3RyZWFtc2l6ZSBfX25wYWQgPSB0aGlzLT53aWR0aCgpID4gX19uID8gdGhpcy0+d2lkdGgoKSAtIF9fbiA6IDA7CisKKyAgICBfU1RMUF9UUlkgeworICAgICAgaWYgKF9fbnBhZCA9PSAwKQorICAgICAgICBfX2ZhaWxlZCA9ICF0aGlzLT5fTV9wdXRfd2lkZW5fYXV4KF9fcywgX19uKTsKKyAgICAgIGVsc2UgaWYgKCh0aGlzLT5mbGFncygpICYgaW9zX2Jhc2U6OmFkanVzdGZpZWxkKSA9PSBpb3NfYmFzZTo6bGVmdCkgeworICAgICAgICBfX2ZhaWxlZCA9ICF0aGlzLT5fTV9wdXRfd2lkZW5fYXV4KF9fcywgX19uKTsKKyAgICAgICAgX19mYWlsZWQgPSBfX2ZhaWxlZCB8fAorICAgICAgICAgICAgICAgICAgIHRoaXMtPnJkYnVmKCktPl9NX3NwdXRuYyh0aGlzLT5maWxsKCksIF9fbnBhZCkgIT0gX19ucGFkOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIF9fZmFpbGVkID0gdGhpcy0+cmRidWYoKS0+X01fc3B1dG5jKHRoaXMtPmZpbGwoKSwgX19ucGFkKSAhPSBfX25wYWQ7CisgICAgICAgIF9fZmFpbGVkID0gX19mYWlsZWQgfHwgIXRoaXMtPl9NX3B1dF93aWRlbl9hdXgoX19zLCBfX24pOworICAgICAgfQorCisgICAgICB0aGlzLT53aWR0aCgwKTsKKyAgICB9CisgICAgX1NUTFBfQ0FUQ0hfQUxMIHsKKyAgICAgIHRoaXMtPl9NX2hhbmRsZV9leGNlcHRpb24oaW9zX2Jhc2U6OmJhZGJpdCk7CisgICAgfQorCisgICAgaWYgKF9fZmFpbGVkKQorICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Citib29sIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6X01fcHV0X3dpZGVuX2F1eChjb25zdCBjaGFyKiBfX3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1zaXplIF9fbikgeworICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19idWYgPSB0aGlzLT5yZGJ1ZigpOworCisgIGZvciAoIDsgX19uID4gMCA7IC0tX19uKQorICAgIGlmICh0aGlzLT5fU19lb2YoX19idWYtPnNwdXRjKHRoaXMtPndpZGVuKCpfX3MrKykpKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFVuZm9ybWF0dGVkIG91dHB1dCBvZiBhIHNpbmdsZSBjaGFyYWN0ZXIuCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpwdXQoY2hhcl90eXBlIF9fYykgeworICBzZW50cnkgX19zZW50cnkoKnRoaXMpOworICBib29sIF9fZmFpbGVkID0gdHJ1ZTsKKworICBpZiAoX19zZW50cnkpIHsKKyAgICBfU1RMUF9UUlkgeworICAgICAgX19mYWlsZWQgPSB0aGlzLT5fU19lb2YodGhpcy0+cmRidWYoKS0+c3B1dGMoX19jKSk7CisgICAgfQorICAgIF9TVExQX0NBVENIX0FMTCB7CisgICAgICB0aGlzLT5fTV9oYW5kbGVfZXhjZXB0aW9uKGlvc19iYXNlOjpiYWRiaXQpOworICAgIH0KKyAgfQorCisgIGlmIChfX2ZhaWxlZCkKKyAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKKworICByZXR1cm4gKnRoaXM7Cit9CisKKy8vIFVuZm9ybWF0dGVkIG91dHB1dCBvZiBhIHNpbmdsZSBjaGFyYWN0ZXIuCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Ojp3cml0ZShjb25zdCBjaGFyX3R5cGUqIF9fcywgc3RyZWFtc2l6ZSBfX24pIHsKKyAgc2VudHJ5IF9fc2VudHJ5KCp0aGlzKTsKKyAgYm9vbCBfX2ZhaWxlZCA9IHRydWU7CisKKyAgaWYgKF9fc2VudHJ5KSB7CisgICAgX1NUTFBfVFJZIHsKKyAgICAgIF9fZmFpbGVkID0gdGhpcy0+cmRidWYoKS0+c3B1dG4oX19zLCBfX24pICE9IF9fbjsKKyAgICB9CisgICAgX1NUTFBfQ0FUQ0hfQUxMIHsKKyAgICAgIHRoaXMtPl9NX2hhbmRsZV9leGNlcHRpb24oaW9zX2Jhc2U6OmJhZGJpdCk7CisgICAgfQorICB9CisKKyAgaWYgKF9fZmFpbGVkKQorICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOworCisgIHJldHVybiAqdGhpczsKK30KKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLyogX1NUTFBfT1NUUkVBTV9DICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9fb3N0cmVhbS5oIGIvc3RscG9ydC9zdGwvX29zdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzM1YjY2Ci0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvX29zdHJlYW0uaApAQCAtMCwwICsxLDM4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX09TVFJFQU1fSAorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9PU1RSRUFNX0gKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9JT1NfSAorIyAgaW5jbHVkZSA8c3RsL19pb3MuaD4gICAgICAgICAgICAgICAgICAvLyBGb3IgYmFzaWNfaW9zPD4uICBJbmNsdWRlcyA8aW9zZndkPi4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX09TVFJFQU1CVUZfSVRFUkFUT1JfSAorIyAgaW5jbHVkZSA8c3RsL19vc3RyZWFtYnVmX2l0ZXJhdG9yLmg+CisjZW5kaWYKKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19VTkNBVUdIVF9FWENFUFRfU1VQUE9SVCkgJiYgIWRlZmluZWQgKF9TVExQX0lOVEVSTkFMX0VYQ0VQVElPTikKKyMgIGluY2x1ZGUgPHN0bC9fZXhjZXB0aW9uLmg+CisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUKQordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2NsYXNzIF9Pc2VudHJ5OworI2VuZGlmCisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jvb2wgX19pbml0X2Jvc3RyKGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19zdHIpOworCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjbGFzcyBiYXNpY19vc3RyZWFtPD4KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2NsYXNzIGJhc2ljX29zdHJlYW0gOiB2aXJ0dWFsIHB1YmxpYyBiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPiB7CisgIHR5cGVkZWYgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+IF9TZWxmOworCisjaWYgZGVmaW5lZCAoX1NUTFBfTVNWQykgJiYgKF9TVExQX01TVkMgPj0gMTMwMCAmJiBfU1RMUF9NU1ZDIDw9IDEzMTApCisgIC8vZXhwbGljaXRlbHkgZGVmaW5lZCBhcyBwcml2YXRlIHRvIGF2b2lkIHdhcm5pbmdzOgorICBiYXNpY19vc3RyZWFtKF9TZWxmIGNvbnN0Jik7CisgIF9TZWxmJiBvcGVyYXRvciA9IChfU2VsZiBjb25zdCYpOworI2VuZGlmCisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHlwZXMKKyAgdHlwZWRlZiBfQ2hhclQgICAgICAgICAgICAgICAgICAgICBjaGFyX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6aW50X3R5cGUgaW50X3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6cG9zX3R5cGUgcG9zX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6b2ZmX3R5cGUgb2ZmX3R5cGU7CisgIHR5cGVkZWYgX1RyYWl0cyAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3R5cGU7CisgIHR5cGVkZWYgYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz4gX0Jhc2ljX2lvczsKKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3Rvci4KKyAgZXhwbGljaXQgYmFzaWNfb3N0cmVhbShiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19idWYpOworICB+YmFzaWNfb3N0cmVhbSgpOworCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhvb2tzIGZvciBtYW5pcHVsYXRvcnMuCisgIHR5cGVkZWYgYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz4mIChfU1RMUF9DQUxMICpfX2lvc19mbikoYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz4mKTsKKyAgdHlwZWRlZiBpb3NfYmFzZSYgKF9TVExQX0NBTEwgKl9faW9zX2Jhc2VfZm4pKGlvc19iYXNlJik7CisgIHR5cGVkZWYgX1NlbGYmIChfU1RMUF9DQUxMICpfX29zdHJlYW1fZm4pKF9TZWxmJik7CisgIF9TZWxmJiBvcGVyYXRvcjw8IChfX29zdHJlYW1fZm4gX19mKSB7IHJldHVybiBfX2YoKnRoaXMpOyB9CisgIF9TZWxmICYgb3BlcmF0b3I8PCAoX19pb3NfYmFzZV9mbiBfX2YpIHsgX19mKCp0aGlzKTsgcmV0dXJuICp0aGlzOyB9CisgIF9TZWxmJiBvcGVyYXRvcjw8IChfX2lvc19mbiBfX2ZmKSB7IF9fZmYoKnRoaXMpOyByZXR1cm4gKnRoaXM7IH0KKworcHJpdmF0ZToKKyAgYm9vbCBfTV9jb3B5X2J1ZmZlcmVkKGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX2Zyb20sCisgICAgICAgICAgICAgICAgICAgICAgICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX190byk7CisgIGJvb2wgX01fY29weV91bmJ1ZmZlcmVkKGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX2Zyb20sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX3RvKTsKKworcHVibGljOgorICB2b2lkIF9NX3B1dF9jaGFyKF9DaGFyVCBfX2MpOworCisgIHZvaWQgX01fcHV0X25vd2lkZW4oY29uc3QgX0NoYXJUKiBfX3MpOworICB2b2lkIF9NX3B1dF93aWRlbihjb25zdCBjaGFyKiBfX3MpOworICBib29sIF9NX3B1dF93aWRlbl9hdXgoY29uc3QgY2hhciogX19zLCBzdHJlYW1zaXplIF9fbik7CisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gVW5mb3JtYXR0ZWQgb3V0cHV0LgorICBfU2VsZiYgcHV0KGNoYXJfdHlwZSBfX2MpOworICBfU2VsZiYgd3JpdGUoY29uc3QgY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uKTsKKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3JtYXR0ZWQgb3V0cHV0LgorICAvLyBGb3JtYXR0ZWQgb3V0cHV0IGZyb20gYSBzdHJlYW1idWYuCisgIF9TZWxmJiBvcGVyYXRvcjw8KGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX2J1Zik7CisjIGlmbmRlZiBfU1RMUF9OT19GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIKKyAgLy8gdGhpcyBpcyBuZWVkZWQgZm9yIGNvbXBpbGluZyB3aXRoIG9wdGlvbiBjaGFyID0gdW5zaWduZWQKKyAgX1NlbGYmIG9wZXJhdG9yPDwodW5zaWduZWQgY2hhciBfX3gpIHsgX01fcHV0X2NoYXIoX194KTsgcmV0dXJuICp0aGlzOyB9CisjIGVuZGlmCisgIF9TZWxmJiBvcGVyYXRvcjw8KHNob3J0IF9feCk7CisgIF9TZWxmJiBvcGVyYXRvcjw8KHVuc2lnbmVkIHNob3J0IF9feCk7CisgIF9TZWxmJiBvcGVyYXRvcjw8KGludCBfX3gpOworI2lmIGRlZmluZWQgKF9XSU42NCkgfHwgIWRlZmluZWQgKF9TVExQX01TVkMpIHx8IChfU1RMUF9NU1ZDIDwgMTMwMCkKKyAgX1NlbGYmIG9wZXJhdG9yPDwodW5zaWduZWQgaW50IF9feCk7CisjZWxzZQorLyogV2UgZGVmaW5lIHRoaXMgb3BlcmF0b3Igd2l0aCBzaXplX3QgcmF0aGVyIHRoYW4gdW5zaWduZWQgaW50IHRvIGF2b2lkCisgKiA2NCBiaXRzIHdhcm5pbmcuCisgKi8KKyAgX1NlbGYmIG9wZXJhdG9yPDwoc2l6ZV90IF9feCk7CisjZW5kaWYKKyAgX1NlbGYmIG9wZXJhdG9yPDwobG9uZyBfX3gpOworICBfU2VsZiYgb3BlcmF0b3I8PCh1bnNpZ25lZCBsb25nIF9feCk7CisjaWZkZWYgX1NUTFBfTE9OR19MT05HCisgIF9TZWxmJiBvcGVyYXRvcjw8IChfU1RMUF9MT05HX0xPTkcgX194KTsKKyAgX1NlbGYmIG9wZXJhdG9yPDwgKHVuc2lnbmVkIF9TVExQX0xPTkdfTE9ORyBfX3gpOworI2VuZGlmCisgIF9TZWxmJiBvcGVyYXRvcjw8KGZsb2F0IF9feCk7CisgIF9TZWxmJiBvcGVyYXRvcjw8KGRvdWJsZSBfX3gpOworIyBpZm5kZWYgX1NUTFBfTk9fTE9OR19ET1VCTEUKKyAgX1NlbGYmIG9wZXJhdG9yPDwobG9uZyBkb3VibGUgX194KTsKKyMgZW5kaWYKKyAgX1NlbGYmIG9wZXJhdG9yPDwoY29uc3Qgdm9pZCogX194KTsKKyMgaWZuZGVmIF9TVExQX05PX0JPT0wKKyAgX1NlbGYmIG9wZXJhdG9yPDwoYm9vbCBfX3gpOworIyBlbmRpZgorCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJ1ZmZlciBwb3NpdGlvbmluZyBhbmQgbWFuaXB1bGF0aW9uLgorICBfU2VsZiYgZmx1c2goKSB7CisgICAgaWYgKHRoaXMtPnJkYnVmKCkpCisgICAgICBpZiAodGhpcy0+cmRidWYoKS0+cHVic3luYygpID09IC0xKQorICAgICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBwb3NfdHlwZSB0ZWxscCgpIHsKKyAgICByZXR1cm4gdGhpcy0+cmRidWYoKSAmJiAhdGhpcy0+ZmFpbCgpCisgICAgICA/IHRoaXMtPnJkYnVmKCktPnB1YnNlZWtvZmYoMCwgaW9zX2Jhc2U6OmN1ciwgaW9zX2Jhc2U6Om91dCkKKyAgICAgIDogcG9zX3R5cGUoLTEpOworICB9CisKKyAgX1NlbGYmIHNlZWtwKHBvc190eXBlIF9fcG9zKSB7CisgICAgaWYgKHRoaXMtPnJkYnVmKCkgJiYgIXRoaXMtPmZhaWwoKSkgeworICAgICAgaWYgKHRoaXMtPnJkYnVmKCktPnB1YnNlZWtwb3MoX19wb3MsIGlvc19iYXNlOjpvdXQpID09IHBvc190eXBlKC0xKSkgeworICAgICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIF9TZWxmJiBzZWVrcChvZmZfdHlwZSBfX29mZiwgaW9zX2Jhc2U6OnNlZWtkaXIgX19kaXIpIHsKKyAgICBpZiAodGhpcy0+cmRidWYoKSAmJiAhdGhpcy0+ZmFpbCgpKQorICAgICAgdGhpcy0+cmRidWYoKS0+cHVic2Vla29mZihfX29mZiwgX19kaXIsIGlvc19iYXNlOjpvdXQpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCkKKyAgLy8gSWYgd2UgYXJlIHVzaW5nIERMTCBzcGVjcywgd2UgaGF2ZSBub3QgdG8gdXNlIGlubmVyIGNsYXNzZXMKKyAgLy8gZW5kIGNsYXNzIGRlY2xhcmF0aW9uIGhlcmUKKyAgdHlwZWRlZiBfT3NlbnRyeTxfQ2hhclQsIF9UcmFpdHM+ICBzZW50cnk7Cit9OworIyAgZGVmaW5lIHNlbnRyeSBfT3NlbnRyeQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorICBjbGFzcyBfT3NlbnRyeSB7CisgICAgdHlwZWRlZiBfT3NlbnRyeTxfQ2hhclQsIF9UcmFpdHM+IF9TZWxmOworI2Vsc2UKKyAgICBjbGFzcyBzZW50cnkgeworICAgICAgdHlwZWRlZiBzZW50cnkgX1NlbGY7CisjZW5kaWYKKyAgICBwcml2YXRlOgorICAgICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfTV9zdHI7CisgICAgICAvLyAgICAgIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfTV9idWY7CisgICAgICBib29sIF9NX29rOworICAgIHB1YmxpYzoKKyAgICAgIGV4cGxpY2l0IHNlbnRyeShiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fc3RyKQorICAgICAgICA6IF9NX3N0cihfX3N0ciksIC8qIF9NX2J1ZihfX3N0ci5yZGJ1ZigpKSwgKi8gX01fb2soX1NUTFBfUFJJViBfX2luaXRfYm9zdHIoX19zdHIpKQorICAgICAge30KKworICAgICAgfnNlbnRyeSgpIHsKKyAgICAgICAgaWYgKF9NX3N0ci5mbGFncygpICYgaW9zX2Jhc2U6OnVuaXRidWYpCisjaWYgIWRlZmluZWQgKF9TVExQX05PX1VOQ0FVR0hUX0VYQ0VQVF9TVVBQT1JUKQorICAgICAgICAgIGlmICghdW5jYXVnaHRfZXhjZXB0aW9uKCkpCisjZW5kaWYKKyAgICAgICAgICAgIF9NX3N0ci5mbHVzaCgpOworICAgICAgfQorCisgICAgICBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gX01fb2s7IH0KKyAgICBwcml2YXRlOiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERpc2FibGUgYXNzaWdubWVudCBhbmQgY29weSBjb25zdHJ1Y3Rvci4KKyAgICAgIC8vSW1wbGVtZW50YXRpb24gaXMgaGVyZSBvbmx5IHRvIGF2b2lkIHdhcm5pbmcgd2l0aCBzb21lIGNvbXBpbGVycy4KKyAgICAgIHNlbnRyeShjb25zdCBfU2VsZiYgX19zKSA6IF9NX3N0cihfX3MuX01fc3RyKSB7fQorICAgICAgX1NlbGYmIG9wZXJhdG9yPShjb25zdCBfU2VsZiYpIHsgcmV0dXJuICp0aGlzOyB9CisgICAgfTsKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUKQorIyAgdW5kZWYgc2VudHJ5CisjZWxzZQorICAvLyBjbG9zZSBiYXNpY19vc3RyZWFtIGNsYXNzIGRlZmluaXRpb24gaGVyZQorfTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCkKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBiYXNpY19vc3RyZWFtPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID47CitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgX09zZW50cnk8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPjsKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQorX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIGJhc2ljX29zdHJlYW08d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPjsKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBfT3NlbnRyeTx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+OworIyAgZW5kaWYKKyNlbmRpZiAvKiBfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUICovCisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKworLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgaXN0cmVhbTw+OjpzZW50cnkgY29uc3RydWN0b3IuCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYm9vbCBfX2luaXRfYm9zdHIoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX3N0cikgeworICBpZiAoX19zdHIuZ29vZCgpKSB7CisgICAgLy8gYm9yaXMgOiBjaGVjayBpZiB0aGlzIGlzIG5lZWRlZCAhCisgICAgaWYgKCFfX3N0ci5yZGJ1ZigpKQorICAgICAgX19zdHIuc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CisgICAgaWYgKF9fc3RyLnRpZSgpKQorICAgICAgX19zdHIudGllKCktPmZsdXNoKCk7CisgICAgcmV0dXJuIF9fc3RyLmdvb2QoKTsKKyAgfQorICBlbHNlCisgICAgcmV0dXJuIGZhbHNlOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgoraW5saW5lIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfU1RMUF9DQUxMCitfX2dldF9vc3RyZWFtYnVmKGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19TdCkKK3sgcmV0dXJuIF9fU3QucmRidWYoKTsgfQorCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKworLy8gTm9uLW1lbWJlciBmdW5jdGlvbnMuCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgoraW5saW5lIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX1NUTFBfQ0FMTAorb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsIF9DaGFyVCBfX2MpeworICBfX29zLl9NX3B1dF9jaGFyKF9fYyk7CisgIHJldHVybiBfX29zOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgoraW5saW5lIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX1NUTFBfQ0FMTAorb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsIGNvbnN0IF9DaGFyVCogX19zKSB7CisgIF9fb3MuX01fcHV0X25vd2lkZW4oX19zKTsKKyAgcmV0dXJuIF9fb3M7Cit9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9OT19GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIpCisvLyBzb21lIHNwZWNpYWxpemF0aW9ucworCitpbmxpbmUgYmFzaWNfb3N0cmVhbTxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+JiBfU1RMUF9DQUxMCitvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiYgX19vcywgY2hhciBfX2MpIHsKKyAgX19vcy5fTV9wdXRfY2hhcihfX2MpOworICByZXR1cm4gX19vczsKK30KKworaW5saW5lIGJhc2ljX29zdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiYgX1NUTFBfQ0FMTAorb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4mIF9fb3MsIHNpZ25lZCBjaGFyIF9fYykgeworICBfX29zLl9NX3B1dF9jaGFyKF9fYyk7CisgIHJldHVybiBfX29zOworfQorCitpbmxpbmUgYmFzaWNfb3N0cmVhbTxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+JiBfU1RMUF9DQUxMCitvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiYgX19vcywgdW5zaWduZWQgY2hhciBfX2MpIHsKKyAgX19vcy5fTV9wdXRfY2hhcihfX2MpOworICByZXR1cm4gX19vczsKK30KKworaW5saW5lIGJhc2ljX29zdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiYgX1NUTFBfQ0FMTAorb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4mIF9fb3MsIGNvbnN0IGNoYXIqIF9fcykgeworICBfX29zLl9NX3B1dF9ub3dpZGVuKF9fcyk7CisgIHJldHVybiBfX29zOworfQorCitpbmxpbmUgYmFzaWNfb3N0cmVhbTxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+JiBfU1RMUF9DQUxMCitvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiYgX19vcywgY29uc3Qgc2lnbmVkIGNoYXIqIF9fcykgeworICBfX29zLl9NX3B1dF9ub3dpZGVuKF9fUkVJTlRFUlBSRVRfQ0FTVChjb25zdCBjaGFyKixfX3MpKTsKKyAgcmV0dXJuIF9fb3M7Cit9CisKK2lubGluZSBiYXNpY19vc3RyZWFtPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4mCitvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiYgX19vcywgY29uc3QgdW5zaWduZWQgY2hhciogX19zKSB7CisgIF9fb3MuX01fcHV0X25vd2lkZW4oX19SRUlOVEVSUFJFVF9DQVNUKGNvbnN0IGNoYXIqLF9fcykpOworICByZXR1cm4gX19vczsKK30KKworI2Vsc2UKKworLy8gYWxzbyBmb3IgY29tcGlsZXJzIHdobyBtaWdodCB1c2UgdGhhdAordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2lubGluZSBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9TVExQX0NBTEwKK29wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLCBjaGFyIF9fYykgeworICBfX29zLl9NX3B1dF9jaGFyKF9fb3Mud2lkZW4oX19jKSk7CisgIHJldHVybiBfX29zOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RyYWl0cz4KK2lubGluZSBiYXNpY19vc3RyZWFtPGNoYXIsIF9UcmFpdHM+JiBfU1RMUF9DQUxMCitvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08Y2hhciwgX1RyYWl0cz4mIF9fb3MsIGNoYXIgX19jKSB7CisgIF9fb3MuX01fcHV0X2NoYXIoX19jKTsKKyAgcmV0dXJuIF9fb3M7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHJhaXRzPgoraW5saW5lIGJhc2ljX29zdHJlYW08Y2hhciwgX1RyYWl0cz4mIF9TVExQX0NBTEwKK29wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxjaGFyLCBfVHJhaXRzPiYgX19vcywgc2lnbmVkIGNoYXIgX19jKSB7CisgIF9fb3MuX01fcHV0X2NoYXIoX19jKTsKKyAgcmV0dXJuIF9fb3M7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHJhaXRzPgoraW5saW5lIGJhc2ljX29zdHJlYW08Y2hhciwgX1RyYWl0cz4mIF9TVExQX0NBTEwKK29wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxjaGFyLCBfVHJhaXRzPiYgX19vcywgdW5zaWduZWQgY2hhciBfX2MpIHsKKyAgX19vcy5fTV9wdXRfY2hhcihfX2MpOworICByZXR1cm4gX19vczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2lubGluZSBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9TVExQX0NBTEwKK29wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLCBjb25zdCBjaGFyKiBfX3MpIHsKKyAgX19vcy5fTV9wdXRfd2lkZW4oX19zKTsKKyAgcmV0dXJuIF9fb3M7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHJhaXRzPgoraW5saW5lIGJhc2ljX29zdHJlYW08Y2hhciwgX1RyYWl0cz4mIF9TVExQX0NBTEwKK29wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxjaGFyLCBfVHJhaXRzPiYgX19vcywgY29uc3QgY2hhciogX19zKSB7CisgIF9fb3MuX01fcHV0X25vd2lkZW4oX19zKTsKKyAgcmV0dXJuIF9fb3M7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHJhaXRzPgoraW5saW5lIGJhc2ljX29zdHJlYW08Y2hhciwgX1RyYWl0cz4mIF9TVExQX0NBTEwKK29wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxjaGFyLCBfVHJhaXRzPiYgX19vcywgY29uc3Qgc2lnbmVkIGNoYXIqIF9fcykgeworICBfX29zLl9NX3B1dF9ub3dpZGVuKF9fUkVJTlRFUlBSRVRfQ0FTVChjb25zdCBjaGFyKixfX3MpKTsKKyAgcmV0dXJuIF9fb3M7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHJhaXRzPgoraW5saW5lIGJhc2ljX29zdHJlYW08Y2hhciwgX1RyYWl0cz4mCitvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08Y2hhciwgX1RyYWl0cz4mIF9fb3MsIGNvbnN0IHVuc2lnbmVkIGNoYXIqIF9fcykgeworICBfX29zLl9NX3B1dF9ub3dpZGVuKF9fUkVJTlRFUlBSRVRfQ0FTVChjb25zdCBjaGFyKixfX3MpKTsKKyAgcmV0dXJuIF9fb3M7Cit9CisjZW5kaWYgLyogX1NUTFBfTk9fRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSICovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gYmFzaWNfb3N0cmVhbSBtYW5pcHVsYXRvcnMuCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfU1RMUF9DQUxMCitlbmRsKGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcykgeworICBfX29zLnB1dChfX29zLndpZGVuKCdcbicpKTsKKyAgX19vcy5mbHVzaCgpOworICByZXR1cm4gX19vczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2lubGluZSBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9TVExQX0NBTEwKK2VuZHMoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zKSB7CisgIF9fb3MucHV0KF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQoX0NoYXJUKSk7CisgIHJldHVybiBfX29zOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgoraW5saW5lIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX1NUTFBfQ0FMTAorZmx1c2goYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zKSB7CisgIF9fb3MuZmx1c2goKTsKKyAgcmV0dXJuIF9fb3M7Cit9CisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2lmIGRlZmluZWQgKF9TVExQX0VYUE9TRV9TVFJFQU1fSU1QTEVNRU5UQVRJT04pICYmICFkZWZpbmVkIChfU1RMUF9MSU5LX1RJTUVfSU5TVEFOVElBVElPTikKKyMgIGluY2x1ZGUgPHN0bC9fb3N0cmVhbS5jPgorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9PU1RSRUFNX0ggKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9fb3N0cmVhbWJ1Zl9pdGVyYXRvci5oIGIvc3RscG9ydC9zdGwvX29zdHJlYW1idWZfaXRlcmF0b3IuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3RsL19vc3RyZWFtYnVmX2l0ZXJhdG9yLmgKcmVuYW1lIHRvIHN0bHBvcnQvc3RsL19vc3RyZWFtYnVmX2l0ZXJhdG9yLmgKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL19wYWlyLmggYi9zdGxwb3J0L3N0bC9fcGFpci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMGIwOGUKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9fcGFpci5oCkBAIC0wLDAgKzEsMTg2IEBACisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworCisvKiBOT1RFOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBTVEwgaGVhZGVycy4KKyAqICAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuCisgKi8KKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9QQUlSX0gKKyNkZWZpbmUgX1NUTFBfSU5URVJOQUxfUEFJUl9ICisKKyNpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQorIyAgaWZuZGVmIF9TVExQX1RZUEVfVFJBSVRTX0gKKyMgICAgaW5jbHVkZSA8c3RsL3R5cGVfdHJhaXRzLmg+CisjICBlbmRpZgorCisjICBpZiAhZGVmaW5lZCAoX1NUTFBfTU9WRV9DT05TVFJVQ1RfRldLX0gpICYmICFkZWZpbmVkIChfU1RMUF9OT19NT1ZFX1NFTUFOVElDKQorIyAgICBpbmNsdWRlIDxzdGwvX21vdmVfY29uc3RydWN0X2Z3ay5oPgorIyAgZW5kaWYKKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworI2lmIGRlZmluZWQgKEFORFJPSUQpCisvKiBBbmRyb2lkIGhhcyBzdGxfcGFpci5oLCBwcmV2ZW50IHVzaW5nIGl0IGJ5IGRlZmluaW5nIHRoZSBoZWFkZXIgZ3VhcmQuICovCisjICBkZWZpbmUgX19TR0lfU1RMX0lOVEVSTkFMX1BBSVJfSAorI2VuZGlmCit0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+CitzdHJ1Y3QgcGFpciB7CisgIHR5cGVkZWYgX1QxIGZpcnN0X3R5cGU7CisgIHR5cGVkZWYgX1QyIHNlY29uZF90eXBlOworCisgIF9UMSBmaXJzdDsKKyAgX1QyIHNlY29uZDsKKyNpZiBkZWZpbmVkIChfU1RMUF9DT05TVF9DT05TVFJVQ1RPUl9CVUcpCisgIHBhaXIoKSB7fQorI2Vsc2UKKyAgcGFpcigpIDogZmlyc3QoX1QxKCkpLCBzZWNvbmQoX1QyKCkpIHt9CisjZW5kaWYKKyAgcGFpcihjb25zdCBfVDEmIF9fYSwgY29uc3QgX1QyJiBfX2IpIDogZmlyc3QoX19hKSwgc2Vjb25kKF9fYikge30KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIHRlbXBsYXRlIDxjbGFzcyBfVTEsIGNsYXNzIF9VMj4KKyAgcGFpcihjb25zdCBwYWlyPF9VMSwgX1UyPiYgX19wKSA6IGZpcnN0KF9fcC5maXJzdCksIHNlY29uZChfX3Auc2Vjb25kKSB7fQorCisgIHBhaXIoY29uc3QgcGFpcjxfVDEsX1QyPiYgX19vKSA6IGZpcnN0KF9fby5maXJzdCksIHNlY29uZChfX28uc2Vjb25kKSB7fQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKKyAgcGFpcihfX21vdmVfc291cmNlPHBhaXI8X1QxLCBfVDI+ID4gc3JjKSA6IGZpcnN0KF9TVExQX1BSSVYgX0FzTW92ZVNvdXJjZShzcmMuZ2V0KCkuZmlyc3QpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZChfU1RMUF9QUklWIF9Bc01vdmVTb3VyY2Uoc3JjLmdldCgpLnNlY29uZCkpCisgIHt9CisjZW5kaWYKKworICBfX1RSSVZJQUxfREVTVFJVQ1RPUihwYWlyKQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgoraW5saW5lIGJvb2wgX1NUTFBfQ0FMTCBvcGVyYXRvcj09KGNvbnN0IHBhaXI8X1QxLCBfVDI+JiBfX3gsIGNvbnN0IHBhaXI8X1QxLCBfVDI+JiBfX3kpCit7IHJldHVybiBfX3guZmlyc3QgPT0gX195LmZpcnN0ICYmIF9feC5zZWNvbmQgPT0gX195LnNlY29uZDsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yPChjb25zdCBwYWlyPF9UMSwgX1QyPiYgX194LCBjb25zdCBwYWlyPF9UMSwgX1QyPiYgX195KSB7CisgIHJldHVybiBfX3guZmlyc3QgPCBfX3kuZmlyc3QgfHwKKyAgICAgICAgICghKF9feS5maXJzdCA8IF9feC5maXJzdCkgJiYgX194LnNlY29uZCA8IF9feS5zZWNvbmQpOworfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1NFUEFSQVRFX1JFTE9QU19OQU1FU1BBQ0UpCit0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yIT0oY29uc3QgcGFpcjxfVDEsIF9UMj4mIF9feCwgY29uc3QgcGFpcjxfVDEsIF9UMj4mIF9feSkKK3sgcmV0dXJuICEoX194ID09IF9feSk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgoraW5saW5lIGJvb2wgX1NUTFBfQ0FMTCBvcGVyYXRvcj4oY29uc3QgcGFpcjxfVDEsIF9UMj4mIF9feCwgY29uc3QgcGFpcjxfVDEsIF9UMj4mIF9feSkKK3sgcmV0dXJuIF9feSA8IF9feDsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yPD0oY29uc3QgcGFpcjxfVDEsIF9UMj4mIF9feCwgY29uc3QgcGFpcjxfVDEsIF9UMj4mIF9feSkKK3sgcmV0dXJuICEoX195IDwgX194KTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yPj0oY29uc3QgcGFpcjxfVDEsIF9UMj4mIF9feCwgY29uc3QgcGFpcjxfVDEsIF9UMj4mIF9feSkKK3sgcmV0dXJuICEoX194IDwgX195KTsgfQorI2VuZGlmIC8qIF9TVExQX1VTRV9TRVBBUkFURV9SRUxPUFNfTkFNRVNQQUNFICovCisKKyNpZiBkZWZpbmVkIChfU1RMUF9GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIpICYmICFkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQordGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyLCBpbnQgX1N6PgoraW5saW5lIHBhaXI8X1QxLCBfVDIgY29uc3QqPiBtYWtlX3BhaXIoX1QxIGNvbnN0JiBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVDIgY29uc3QgKCZfX3kpW19Tel0pCit7IHJldHVybiBwYWlyPF9UMSwgX1QyIGNvbnN0Kj4oX194LCBzdGF0aWNfY2FzdDxfVDIgY29uc3QqPihfX3kpKTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDIsIGludCBfU3o+CitpbmxpbmUgcGFpcjxfVDEgY29uc3QqLCBfVDI+IG1ha2VfcGFpcihfVDEgY29uc3QgKCZfX3gpW19Tel0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVDIgY29uc3QmIF9feSkKK3sgcmV0dXJuIHBhaXI8X1QxIGNvbnN0KiwgX1QyPihzdGF0aWNfY2FzdDxfVDEgY29uc3QqPihfX3gpLCBfX3kpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMiwgaW50IF9TejEsIGludCBfU3oyPgoraW5saW5lIHBhaXI8X1QxIGNvbnN0KiwgX1QyIGNvbnN0Kj4gbWFrZV9wYWlyKF9UMSBjb25zdCAoJl9feClbX1N6MV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1QyIGNvbnN0ICgmX195KVtfU3oyXSkgeworICByZXR1cm4gcGFpcjxfVDEgY29uc3QqLCBfVDIgY29uc3QqPihzdGF0aWNfY2FzdDxfVDEgY29uc3QqPihfX3gpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxfVDIgY29uc3QqPihfX3kpKTsKK30KKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+CitpbmxpbmUgcGFpcjxfVDEsIF9UMj4gX1NUTFBfQ0FMTCBtYWtlX3BhaXIoX1QxIF9feCwgX1QyIF9feSkKK3sgcmV0dXJuIHBhaXI8X1QxLCBfVDI+KF9feCwgX195KTsgfQorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfTkFNRVNQQUNFUykgfHwgIWRlZmluZWQgKF9TVExQX1VTRV9TRVBBUkFURV9SRUxPUFNfTkFNRVNQQUNFKQorX1NUTFBfQkVHSU5fUkVMT1BTX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIGJvb2wgX1NUTFBfQ0FMTCBvcGVyYXRvciE9KGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkKK3sgcmV0dXJuICEoX194ID09IF9feSk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBib29sIF9TVExQX0NBTEwgb3BlcmF0b3I+KGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkKK3sgcmV0dXJuIF9feSA8IF9feDsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIGJvb2wgX1NUTFBfQ0FMTCBvcGVyYXRvcjw9KGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkKK3sgcmV0dXJuICEoX195IDwgX194KTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIGJvb2wgX1NUTFBfQ0FMTCAgb3BlcmF0b3I+PShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpCit7IHJldHVybiAhKF9feCA8IF9feSk7IH0KKworX1NUTFBfRU5EX1JFTE9QU19OQU1FU1BBQ0UKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+CitzdHJ1Y3QgX190eXBlX3RyYWl0czxwYWlyPF9UMSwgX1QyPiA+IHsKKyAgdHlwZWRlZiBfX3R5cGVfdHJhaXRzPF9UMT4gX1QxVHJhaXRzOworICB0eXBlZGVmIF9fdHlwZV90cmFpdHM8X1QyPiBfVDJUcmFpdHM7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0xhbmQyPHR5cGVuYW1lIF9UMVRyYWl0czo6aGFzX3RyaXZpYWxfZGVmYXVsdF9jb25zdHJ1Y3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX1QyVHJhaXRzOjpoYXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yPjo6X1JldCBoYXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yOworICB0eXBlZGVmIHR5cGVuYW1lIF9MYW5kMjx0eXBlbmFtZSBfVDFUcmFpdHM6Omhhc190cml2aWFsX2NvcHlfY29uc3RydWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9UMlRyYWl0czo6aGFzX3RyaXZpYWxfY29weV9jb25zdHJ1Y3Rvcj46Ol9SZXQgaGFzX3RyaXZpYWxfY29weV9jb25zdHJ1Y3RvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfTGFuZDI8dHlwZW5hbWUgX1QxVHJhaXRzOjpoYXNfdHJpdmlhbF9hc3NpZ25tZW50X29wZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfVDJUcmFpdHM6Omhhc190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3I+OjpfUmV0IGhhc190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3I7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0xhbmQyPHR5cGVuYW1lIF9UMVRyYWl0czo6aGFzX3RyaXZpYWxfZGVzdHJ1Y3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX1QyVHJhaXRzOjpoYXNfdHJpdmlhbF9kZXN0cnVjdG9yPjo6X1JldCBoYXNfdHJpdmlhbF9kZXN0cnVjdG9yOworICB0eXBlZGVmIF9fZmFsc2VfdHlwZSBpc19QT0RfdHlwZTsKK307CisKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9OT19NT1ZFX1NFTUFOVElDKQordGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgorc3RydWN0IF9fbW92ZV90cmFpdHM8cGFpcjxfVDEsIF9UMj4gPgorICA6IF9TVExQX1BSSVYgX19tb3ZlX3RyYWl0c19oZWxwMTxfVDEsIF9UMj4ge307CisjICBlbmRpZgorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisjZW5kaWYKKworI2VuZGlmIC8qIF9TVExQX0lOVEVSTkFMX1BBSVJfSCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdGwvX3Byb2xvZy5oIGIvc3RscG9ydC9zdGwvX3Byb2xvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3MDVjMmMKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9fcHJvbG9nLmgKQEAgLTAsMCArMSwxOCBAQAorLyogTk9URSA6IHRoaXMgaGVhZGVyIGhhcyBubyBndWFyZHMgYW5kIGlzIE1FQU5UIGZvciBtdWx0aXBsZSBpbmNsdXNpb24hCisgKiBJZiB5b3UgYXJlIHVzaW5nICJoZWFkZXIgcHJvdGVjdGlvbiIgb3B0aW9uIHdpdGggeW91ciBjb21waWxlciwKKyAqIHBsZWFzZSBhbHNvIGZpbmQgI3ByYWdtYSB3aGljaCBkaXNhYmxlcyBpdCBhbmQgcHV0IGl0IGhlcmUsIHRvCisgKiBhbGxvdyByZWVudHJhbmN5IG9mIHRoaXMgaGVhZGVyLgorICovCisKKyNpbmNsdWRlIDxzdGwvX2Nwcm9sb2cuaD4KKworLyogR2V0IGFsbCBkZWJ1ZyB0aGluZ3MsIHBvdGVudGlhbGx5IG9ubHkgZW1wdHkgbWFjcm9zIGlmIG5vbmUgb2YKKyAqIHRoZSBkZWJ1ZyBmZWF0dXJlcyBhdmFpbGFibGUgaW4gdXNlciBjb25maWcgZmlsZSBpcyBhY3RpdmF0ZWQuICovCisgLyogVGhhbmtzIHRvIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgd2UgaGlkZSBfZGVidWcuaCB3aGVuIEMgc3RhbmRhcmQKKyAgKiBoZWFkZXJzIGFyZSBpbmNsdWRlZCBhcyBzb21lIHBsYXRmb3JtcyAoV2luMzIpIGluY2x1ZGUgQyBzdGFuZGFyZCBoZWFkZXJzCisgICogaW4gYW4gJ2V4dGVybiAiQyInIHNjb3BlIHdoaWNoIGRvIG5vdCBhY2NlcHQgdGhlIHRlbXBsYXRlcyBleHBvc2VkCisgICogaW4gX2RlYnVnLmguICovCisjaWYgZGVmaW5lZCAoX19jcGx1c3BsdXMpICYmICFkZWZpbmVkIChfU1RMUF9ERUJVR19IKSAmJiBcCisgICAhKChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID49IDB4MjAwKSAmJiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA8PSAweDMwMCkpCisjICBpbmNsdWRlIDxzdGwvZGVidWcvX2RlYnVnLmg+CisjZW5kaWYKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL19wdGhyZWFkX2FsbG9jLmggYi9zdGxwb3J0L3N0bC9fcHRocmVhZF9hbGxvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0NWQ5NDkKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9fcHRocmVhZF9hbGxvYy5oCkBAIC0wLDAgKzEsNDYxIEBACisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9QVEhSRUFEX0FMTE9DX0gKKyNkZWZpbmUgX1NUTFBfUFRIUkVBRF9BTExPQ19ICisKKy8qCisgKiBQdGhyZWFkLXNwZWNpZmljIG5vZGUgYWxsb2NhdG9yLgorICogVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSBkZWZhdWx0IGFsbG9jYXRvciwgZXhjZXB0IHRoYXQgZnJlZS1saXN0CisgKiBpbmZvcm1hdGlvbiBpcyBrZXB0IHNlcGFyYXRlbHkgZm9yIGVhY2ggdGhyZWFkLCBhdm9pZGluZyBsb2NraW5nLgorICogVGhpcyBzaG91bGQgYmUgcmVhc29uYWJseSBmYXN0IGV2ZW4gaW4gdGhlIHByZXNlbmNlIG9mIHRocmVhZHMuCisgKiBUaGUgZG93biBzaWRlIGlzIHRoYXQgc3RvcmFnZSBtYXkgbm90IGJlIHdlbGwtdXRpbGl6ZWQuCisgKiBJdCBpcyBub3QgYW4gZXJyb3IgdG8gYWxsb2NhdGUgbWVtb3J5IGluIHRocmVhZCBBIGFuZCBkZWFsbG9jYXRlCisgKiBpdCBpbiB0aHJlYWQgQi4gIEJ1dCB0aGlzIGVmZmVjdGl2ZWx5IHRyYW5zZmVycyBvd25lcnNoaXAgb2YgdGhlIG1lbW9yeSwKKyAqIHNvIHRoYXQgaXQgY2FuIG9ubHkgYmUgcmVhbGxvY2F0ZWQgYnkgdGhyZWFkIEIuICBUaHVzIHRoaXMgY2FuIGVmZmVjdGl2ZWx5CisgKiByZXN1bHQgaW4gYSBzdG9yYWdlIGxlYWsgaWYgaXQncyBkb25lIG9uIGEgcmVndWxhciBiYXNpcy4KKyAqIEl0IGNhbiBhbHNvIHJlc3VsdCBpbiBmcmVxdWVudCBzaGFyaW5nIG9mCisgKiBjYWNoZSBsaW5lcyBhbW9uZyBwcm9jZXNzb3JzLCB3aXRoIHBvdGVudGlhbGx5IHNlcmlvdXMgcGVyZm9ybWFuY2UKKyAqIGNvbnNlcXVlbmNlcy4KKyAqLworCisjaWYgIWRlZmluZWQgKF9TVExQX1BUSFJFQURTKQorIyAgZXJyb3IgUE9TSVggc3BlY2lmaWMgYWxsb2NhdG9yIGltcGxlbWVudGF0aW9uLiBZb3VyIHN5c3RlbSBkbyBub3Qgc2VlbXMgdG8gXAoraGF2ZSB0aGlzIGludGVyZmFjZSBzbyBwbGVhc2UgY29tbWVudCB0aGUgX1NUTFBfVVNFX1BFUlRIUkVBRF9BTExPQyBtYWNybyBcCitvciByZXBvcnQgdG8gdGhlIFNUTHBvcnQgZm9ydW0uCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9OT19JT1NUUkVBTVMpCisjICBlcnJvciBZb3UgY2Fubm90IHVzZSBwZXIgdGhyZWFkIGFsbG9jYXRvciBpbXBsZW1lbnRhdGlvbiB3aXRob3V0IGJ1aWxkaW5nIFwKK1NUTHBvcnQgbGlicmFyaWVzLgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQUxMT0NfSAorIyAgaW5jbHVkZSA8c3RsL19hbGxvYy5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3N0cnVjdCBfUHRocmVhZF9hbGxvY19wZXJfdGhyZWFkX3N0YXRlOworCisvLyBQdGhyZWFkLXNwZWNpZmljIGFsbG9jYXRvci4KK2NsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIF9QdGhyZWFkX2FsbG9jIHsKK3B1YmxpYzogLy8gYnV0IG9ubHkgZm9yIGludGVybmFsIHVzZToKKyAgdHlwZWRlZiBfUHRocmVhZF9hbGxvY19wZXJfdGhyZWFkX3N0YXRlIF9fc3RhdGVfdHlwZTsKKyAgdHlwZWRlZiBjaGFyIHZhbHVlX3R5cGU7CisKK3B1YmxpYzoKKyAgLy8gUmV0dXJuIGEgcmVjeWNsZWQgb3IgbmV3IHBlciB0aHJlYWQgc3RhdGUuCisgIHN0YXRpYyBfX3N0YXRlX3R5cGUgKiBfU1RMUF9DQUxMIF9TX2dldF9wZXJfdGhyZWFkX3N0YXRlKCk7CisKKyAgLyogbiBtdXN0IGJlID4gMCAgICAgICovCisgIHN0YXRpYyB2b2lkICogX1NUTFBfQ0FMTCBhbGxvY2F0ZShzaXplX3QmIF9fbik7CisKKyAgLyogcCBtYXkgbm90IGJlIDAgKi8KKyAgc3RhdGljIHZvaWQgX1NUTFBfQ0FMTCBkZWFsbG9jYXRlKHZvaWQgKl9fcCwgc2l6ZV90IF9fbik7CisKKyAgLy8gYm9yaXMgOiB2ZXJzaW9ucyBmb3IgcGVyX3RocmVhZF9hbGxvY2F0b3IKKyAgLyogbiBtdXN0IGJlID4gMCAgICAgICovCisgIHN0YXRpYyB2b2lkICogX1NUTFBfQ0FMTCBhbGxvY2F0ZShzaXplX3QmIF9fbiwgX19zdGF0ZV90eXBlKiBfX2EpOworCisgIC8qIHAgbWF5IG5vdCBiZSAwICovCisgIHN0YXRpYyB2b2lkIF9TVExQX0NBTEwgZGVhbGxvY2F0ZSh2b2lkICpfX3AsIHNpemVfdCBfX24sIF9fc3RhdGVfdHlwZSogX19hKTsKKworICBzdGF0aWMgdm9pZCAqIF9TVExQX0NBTEwgcmVhbGxvY2F0ZSh2b2lkICpfX3AsIHNpemVfdCBfX29sZF9zeiwgc2l6ZV90JiBfX25ld19zeik7Cit9OworCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKwordHlwZWRlZiBfU1RMUF9QUklWIF9QdGhyZWFkX2FsbG9jIF9fcHRocmVhZF9hbGxvYzsKK3R5cGVkZWYgX19wdGhyZWFkX2FsbG9jIHB0aHJlYWRfYWxsb2M7CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitjbGFzcyBwdGhyZWFkX2FsbG9jYXRvciA6IHB1YmxpYyBfX3N0bHBvcnRfY2xhc3M8cHRocmVhZF9hbGxvY2F0b3I8X1RwPiA+IHsKKyAgdHlwZWRlZiBwdGhyZWFkX2FsbG9jIF9TX0FsbG9jOyAgICAgICAgICAvLyBUaGUgdW5kZXJseWluZyBhbGxvY2F0b3IuCitwdWJsaWM6CisgIHR5cGVkZWYgc2l6ZV90ICAgICBzaXplX3R5cGU7CisgIHR5cGVkZWYgcHRyZGlmZl90ICBkaWZmZXJlbmNlX3R5cGU7CisgIHR5cGVkZWYgX1RwKiAgICAgICBwb2ludGVyOworICB0eXBlZGVmIGNvbnN0IF9UcCogY29uc3RfcG9pbnRlcjsKKyAgdHlwZWRlZiBfVHAmICAgICAgIHJlZmVyZW5jZTsKKyAgdHlwZWRlZiBjb25zdCBfVHAmIGNvbnN0X3JlZmVyZW5jZTsKKyAgdHlwZWRlZiBfVHAgICAgICAgIHZhbHVlX3R5cGU7CisKKyNpZmRlZiBfU1RMUF9NRU1CRVJfVEVNUExBVEVfQ0xBU1NFUworICB0ZW1wbGF0ZSA8Y2xhc3MgX05ld1R5cGU+IHN0cnVjdCByZWJpbmQgeworICAgIHR5cGVkZWYgcHRocmVhZF9hbGxvY2F0b3I8X05ld1R5cGU+IG90aGVyOworICB9OworI2VuZGlmCisKKyAgcHRocmVhZF9hbGxvY2F0b3IoKSBfU1RMUF9OT1RIUk9XIHt9CisgIHB0aHJlYWRfYWxsb2NhdG9yKGNvbnN0IHB0aHJlYWRfYWxsb2NhdG9yPF9UcD4mIGEpIF9TVExQX05PVEhST1cge30KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpIC8qICYmIGRlZmluZWQgKF9TVExQX0ZVTkNUSU9OX1BBUlRJQUxfT1JERVIpICovCisgIHRlbXBsYXRlIDxjbGFzcyBfT3RoZXJUeXBlPiBwdGhyZWFkX2FsbG9jYXRvcihjb25zdCBwdGhyZWFkX2FsbG9jYXRvcjxfT3RoZXJUeXBlPiYpCisgICAgX1NUTFBfTk9USFJPVyB7fQorI2VuZGlmCisKKyAgfnB0aHJlYWRfYWxsb2NhdG9yKCkgX1NUTFBfTk9USFJPVyB7fQorCisgIHBvaW50ZXIgYWRkcmVzcyhyZWZlcmVuY2UgX194KSBjb25zdCB7IHJldHVybiAmX194OyB9CisgIGNvbnN0X3BvaW50ZXIgYWRkcmVzcyhjb25zdF9yZWZlcmVuY2UgX194KSBjb25zdCB7IHJldHVybiAmX194OyB9CisKKyAgLy8gX19uIGlzIHBlcm1pdHRlZCB0byBiZSAwLiAgVGhlIEMrKyBzdGFuZGFyZCBzYXlzIG5vdGhpbmcgYWJvdXQgd2hhdAorICAvLyB0aGUgcmV0dXJuIHZhbHVlIGlzIHdoZW4gX19uID09IDAuCisgIF9UcCogYWxsb2NhdGUoc2l6ZV90eXBlIF9fbiwgY29uc3Qgdm9pZCogPSAwKSB7CisgICAgaWYgKF9fbiA+IG1heF9zaXplKCkpIHsKKyAgICAgIF9TVExQX1RIUk9XX0JBRF9BTExPQzsKKyAgICB9CisgICAgaWYgKF9fbiAhPSAwKSB7CisgICAgICBzaXplX3R5cGUgX19idWZfc2l6ZSA9IF9fbiAqIHNpemVvZih2YWx1ZV90eXBlKTsKKyAgICAgIF9UcCogX19yZXQgPSBfX1JFSU5URVJQUkVUX0NBU1QodmFsdWVfdHlwZSosIF9TX0FsbG9jOjphbGxvY2F0ZShfX2J1Zl9zaXplKSk7CisjaWYgZGVmaW5lZCAoX1NUTFBfREVCVUdfVU5JTklUSUFMSVpFRCkgJiYgIWRlZmluZWQgKF9TVExQX0RFQlVHX0FMTE9DKQorICAgICAgbWVtc2V0KChjaGFyKilfX3JldCwgX1NUTFBfU0hSRURfQllURSwgX19idWZfc2l6ZSk7CisjZW5kaWYKKyAgICAgIHJldHVybiBfX3JldDsKKyAgICB9CisgICAgZWxzZQorICAgICAgcmV0dXJuIDA7CisgIH0KKworICB2b2lkIGRlYWxsb2NhdGUocG9pbnRlciBfX3AsIHNpemVfdHlwZSBfX24pIHsKKyAgICBfU1RMUF9BU1NFUlQoIChfX3AgPT0gMCkgPT0gKF9fbiA9PSAwKSApCisgICAgaWYgKF9fcCAhPSAwKSB7CisjaWYgZGVmaW5lZCAoX1NUTFBfREVCVUdfVU5JTklUSUFMSVpFRCkgJiYgIWRlZmluZWQgKF9TVExQX0RFQlVHX0FMTE9DKQorICAgICAgbWVtc2V0KChjaGFyKilfX3AsIF9TVExQX1NIUkVEX0JZVEUsIF9fbiAqIHNpemVvZih2YWx1ZV90eXBlKSk7CisjZW5kaWYKKyAgICAgIF9TX0FsbG9jOjpkZWFsbG9jYXRlKF9fcCwgX19uICogc2l6ZW9mKHZhbHVlX3R5cGUpKTsKKyAgICB9CisgIH0KKworICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCBfU1RMUF9OT1RIUk9XCisgIHsgcmV0dXJuIHNpemVfdCgtMSkgLyBzaXplb2YoX1RwKTsgfQorCisgIHZvaWQgY29uc3RydWN0KHBvaW50ZXIgX19wLCBjb25zdCBfVHAmIF9fdmFsKSB7IG5ldyhfX3ApIF9UcChfX3ZhbCk7IH0KKyAgdm9pZCBkZXN0cm95KHBvaW50ZXIgX3ApIHsgX3AtPn5fVHAoKTsgfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKKyAgLyogU1RMcG9ydCBleHRlbnNpb24gZ2l2aW5nIHJvdW5kZWQgc2l6ZSBvZiBhbiBhbGxvY2F0ZWQgbWVtb3J5IGJ1ZmZlcgorICAgKiBUaGlzIG1ldGhvZCBkbyBub3QgaGF2ZSB0byBiZSBwYXJ0IG9mIGEgdXNlciBkZWZpbmVkIGFsbG9jYXRvciBpbXBsZW1lbnRhdGlvbgorICAgKiBhbmQgd29uJ3QgZXZlbiBiZSBjYWxsZWQgaWYgc3VjaCBhIGZ1bmN0aW9uIHdhcyBncmFudGVkLgorICAgKi8KK3Byb3RlY3RlZDoKKyNlbmRpZgorICBfVHAqIGFsbG9jYXRlKHNpemVfdHlwZSBfX24sIHNpemVfdHlwZSYgX19hbGxvY2F0ZWRfbikgeworICAgIGlmIChfX24gPiBtYXhfc2l6ZSgpKSB7CisgICAgICBfU1RMUF9USFJPV19CQURfQUxMT0M7CisgICAgfQorICAgIGlmIChfX24gIT0gMCkgeworICAgICAgc2l6ZV90eXBlIF9fYnVmX3NpemUgPSBfX24gKiBzaXplb2YodmFsdWVfdHlwZSk7CisgICAgICBfVHAqIF9fcmV0ID0gX19SRUlOVEVSUFJFVF9DQVNUKHZhbHVlX3R5cGUqLCBfU19BbGxvYzo6YWxsb2NhdGUoX19idWZfc2l6ZSkpOworI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHX1VOSU5JVElBTElaRUQpICYmICFkZWZpbmVkIChfU1RMUF9ERUJVR19BTExPQykKKyAgICAgIG1lbXNldCgoY2hhciopX19yZXQsIF9TVExQX1NIUkVEX0JZVEUsIF9fYnVmX3NpemUpOworI2VuZGlmCisgICAgICBfX2FsbG9jYXRlZF9uID0gX19idWZfc2l6ZSAvIHNpemVvZih2YWx1ZV90eXBlKTsKKyAgICAgIHJldHVybiBfX3JldDsKKyAgICB9CisgICAgZWxzZQorICAgICAgcmV0dXJuIDA7CisgIH0KKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUEFSVElBTF9TUEVDX1dPUktBUk9VTkQpICYmICFkZWZpbmVkIChfU1RMUF9GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIpCisgIHZvaWQgX01fc3dhcF93b3JrYXJvdW5kKHB0aHJlYWRfYWxsb2NhdG9yPF9UcD4mIF9feCkge30KKyNlbmRpZgorfTsKKworX1NUTFBfVEVNUExBVEVfTlVMTAorY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgcHRocmVhZF9hbGxvY2F0b3I8dm9pZD4geworcHVibGljOgorICB0eXBlZGVmIHNpemVfdCAgICAgIHNpemVfdHlwZTsKKyAgdHlwZWRlZiBwdHJkaWZmX3QgICBkaWZmZXJlbmNlX3R5cGU7CisgIHR5cGVkZWYgdm9pZCogICAgICAgcG9pbnRlcjsKKyAgdHlwZWRlZiBjb25zdCB2b2lkKiBjb25zdF9wb2ludGVyOworICB0eXBlZGVmIHZvaWQgICAgICAgIHZhbHVlX3R5cGU7CisjaWZkZWYgX1NUTFBfTUVNQkVSX1RFTVBMQVRFX0NMQVNTRVMKKyAgdGVtcGxhdGUgPGNsYXNzIF9OZXdUeXBlPiBzdHJ1Y3QgcmViaW5kIHsKKyAgICB0eXBlZGVmIHB0aHJlYWRfYWxsb2NhdG9yPF9OZXdUeXBlPiBvdGhlcjsKKyAgfTsKKyNlbmRpZgorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgoraW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBwdGhyZWFkX2FsbG9jYXRvcjxfVDE+JiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHRocmVhZF9hbGxvY2F0b3I8X1QyPiYgYTIpCit7IHJldHVybiB0cnVlOyB9CisKKyNpZmRlZiBfU1RMUF9GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIKK3RlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgcHRocmVhZF9hbGxvY2F0b3I8X1QxPiYsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHB0aHJlYWRfYWxsb2NhdG9yPF9UMj4mKQoreyByZXR1cm4gZmFsc2U7IH0KKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQXR5cGU+CitzdHJ1Y3QgX0FsbG9jX3RyYWl0czxfVHAsIHB0aHJlYWRfYWxsb2NhdG9yPF9BdHlwZT4gPgoreyB0eXBlZGVmIHB0aHJlYWRfYWxsb2NhdG9yPF9UcD4gYWxsb2NhdG9yX3R5cGU7IH07CisKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBQT1JUX1JFQklORF9NRU1CRVJfVEVNUExBVEUpCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAxLCBjbGFzcyBfVHAyPgoraW5saW5lIHB0aHJlYWRfYWxsb2NhdG9yPF9UcDI+JgorX19zdGxfYWxsb2NfcmViaW5kKHB0aHJlYWRfYWxsb2NhdG9yPF9UcDE+JiBfX3gsIGNvbnN0IF9UcDIqKQoreyByZXR1cm4gKHB0aHJlYWRfYWxsb2NhdG9yPF9UcDI+JilfX3g7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9UcDEsIGNsYXNzIF9UcDI+CitpbmxpbmUgcHRocmVhZF9hbGxvY2F0b3I8X1RwMj4KK19fc3RsX2FsbG9jX2NyZWF0ZShwdGhyZWFkX2FsbG9jYXRvcjxfVHAxPiYsIGNvbnN0IF9UcDIqKQoreyByZXR1cm4gcHRocmVhZF9hbGxvY2F0b3I8X1RwMj4oKTsgfQorCisjZW5kaWYKKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9fcHRocmVhZF9hbGxvY190eXBlX3RyYWl0cyB7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0lzU1RMcG9ydENsYXNzPHB0aHJlYWRfYWxsb2NhdG9yPF9UcD4gPjo6X1JldCBfU1RMcG9ydEFsbG9jOworICAvL1RoZSBkZWZhdWx0IGFsbG9jYXRvciBpbXBsZW1lbnRhdGlvbiB3aGljaCBpcyByZWNvZ25pemUgdGhhbmtzIHRvIHRoZQorICAvL19fc3RscG9ydF9jbGFzcyBpbmhlcml0YW5jZSBpcyBhIHN0YXRlbGVzcyBvYmplY3Qgc286CisgIHR5cGVkZWYgX1NUTHBvcnRBbGxvYyBoYXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yOworICB0eXBlZGVmIF9TVExwb3J0QWxsb2MgaGFzX3RyaXZpYWxfY29weV9jb25zdHJ1Y3RvcjsKKyAgdHlwZWRlZiBfU1RMcG9ydEFsbG9jIGhhc190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3I7CisgIHR5cGVkZWYgX1NUTHBvcnRBbGxvYyBoYXNfdHJpdmlhbF9kZXN0cnVjdG9yOworICB0eXBlZGVmIF9TVExwb3J0QWxsb2MgaXNfUE9EX3R5cGU7Cit9OworCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKworI2lmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9fdHlwZV90cmFpdHM8cHRocmVhZF9hbGxvY2F0b3I8X1RwPiA+IDogX1NUTFBfUFJJViBfX3B0aHJlYWRfYWxsb2NfdHlwZV90cmFpdHM8X1RwPiB7fTsKKyNlbHNlCitfU1RMUF9URU1QTEFURV9OVUxMCitzdHJ1Y3QgX190eXBlX3RyYWl0czxwdGhyZWFkX2FsbG9jYXRvcjxjaGFyPiA+IDogX1NUTFBfUFJJViBfX3B0aHJlYWRfYWxsb2NfdHlwZV90cmFpdHM8Y2hhcj4ge307CisjICBpZiBkZWZpbmVkIChfU1RMUF9IQVNfV0NIQVJfVCkKK19TVExQX1RFTVBMQVRFX05VTEwKK3N0cnVjdCBfX3R5cGVfdHJhaXRzPHB0aHJlYWRfYWxsb2NhdG9yPHdjaGFyX3Q+ID4gOiBfU1RMUF9QUklWIF9fcHRocmVhZF9hbGxvY190eXBlX3RyYWl0czx3Y2hhcl90PiB7fTsKKyMgIGVuZGlmCisjICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfUFRSX1NQRUNJQUxJWkFUSU9OUykKK19TVExQX1RFTVBMQVRFX05VTEwKK3N0cnVjdCBfX3R5cGVfdHJhaXRzPHB0aHJlYWRfYWxsb2NhdG9yPHZvaWQqPiA+IDogX1NUTFBfUFJJViBfX3B0aHJlYWRfYWxsb2NfdHlwZV90cmFpdHM8dm9pZCo+IHt9OworIyAgZW5kaWYKKyNlbmRpZgorCisvLworLy8gcGVyX3RocmVhZF9hbGxvY2F0b3I8PiA6IHRoaXMgYWxsb2NhdG9yIGFsd2F5cyByZXR1cm4gbWVtb3J5IHRvIHRoZSBzYW1lIHRocmVhZAorLy8gaXQgd2FzIGFsbG9jYXRlZCBmcm9tLgorLy8KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2NsYXNzIHBlcl90aHJlYWRfYWxsb2NhdG9yIHsKKyAgdHlwZWRlZiBwdGhyZWFkX2FsbG9jIF9TX0FsbG9jOyAgICAgICAgICAvLyBUaGUgdW5kZXJseWluZyBhbGxvY2F0b3IuCisgIHR5cGVkZWYgcHRocmVhZF9hbGxvYzo6X19zdGF0ZV90eXBlIF9fc3RhdGVfdHlwZTsKK3B1YmxpYzoKKyAgdHlwZWRlZiBzaXplX3QgICAgIHNpemVfdHlwZTsKKyAgdHlwZWRlZiBwdHJkaWZmX3QgIGRpZmZlcmVuY2VfdHlwZTsKKyAgdHlwZWRlZiBfVHAqICAgICAgIHBvaW50ZXI7CisgIHR5cGVkZWYgY29uc3QgX1RwKiBjb25zdF9wb2ludGVyOworICB0eXBlZGVmIF9UcCYgICAgICAgcmVmZXJlbmNlOworICB0eXBlZGVmIGNvbnN0IF9UcCYgY29uc3RfcmVmZXJlbmNlOworICB0eXBlZGVmIF9UcCAgICAgICAgdmFsdWVfdHlwZTsKKworI2lmZGVmIF9TVExQX01FTUJFUl9URU1QTEFURV9DTEFTU0VTCisgIHRlbXBsYXRlIDxjbGFzcyBfTmV3VHlwZT4gc3RydWN0IHJlYmluZCB7CisgICAgdHlwZWRlZiBwZXJfdGhyZWFkX2FsbG9jYXRvcjxfTmV3VHlwZT4gb3RoZXI7CisgIH07CisjZW5kaWYKKworICBwZXJfdGhyZWFkX2FsbG9jYXRvcigpIF9TVExQX05PVEhST1cgeworICAgIF9NX3N0YXRlID0gX1NfQWxsb2M6Ol9TX2dldF9wZXJfdGhyZWFkX3N0YXRlKCk7CisgIH0KKyAgcGVyX3RocmVhZF9hbGxvY2F0b3IoY29uc3QgcGVyX3RocmVhZF9hbGxvY2F0b3I8X1RwPiYgX19hKSBfU1RMUF9OT1RIUk9XIDogX01fc3RhdGUoX19hLl9NX3N0YXRlKXt9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKSAvKiAmJiBkZWZpbmVkIChfU1RMUF9GVU5DVElPTl9QQVJUSUFMX09SREVSKSAqLworICB0ZW1wbGF0ZSA8Y2xhc3MgX090aGVyVHlwZT4gcGVyX3RocmVhZF9hbGxvY2F0b3IoY29uc3QgcGVyX3RocmVhZF9hbGxvY2F0b3I8X090aGVyVHlwZT4mIF9fYSkKKyAgICBfU1RMUF9OT1RIUk9XIDogX01fc3RhdGUoX19hLl9NX3N0YXRlKSB7fQorI2VuZGlmCisKKyAgfnBlcl90aHJlYWRfYWxsb2NhdG9yKCkgX1NUTFBfTk9USFJPVyB7fQorCisgIHBvaW50ZXIgYWRkcmVzcyhyZWZlcmVuY2UgX194KSBjb25zdCB7IHJldHVybiAmX194OyB9CisgIGNvbnN0X3BvaW50ZXIgYWRkcmVzcyhjb25zdF9yZWZlcmVuY2UgX194KSBjb25zdCB7IHJldHVybiAmX194OyB9CisKKyAgLy8gX19uIGlzIHBlcm1pdHRlZCB0byBiZSAwLiAgVGhlIEMrKyBzdGFuZGFyZCBzYXlzIG5vdGhpbmcgYWJvdXQgd2hhdAorICAvLyB0aGUgcmV0dXJuIHZhbHVlIGlzIHdoZW4gX19uID09IDAuCisgIF9UcCogYWxsb2NhdGUoc2l6ZV90eXBlIF9fbiwgY29uc3Qgdm9pZCogPSAwKSB7CisgICAgaWYgKF9fbiA+IG1heF9zaXplKCkpIHsKKyAgICAgIF9TVExQX1RIUk9XX0JBRF9BTExPQzsKKyAgICB9CisgICAgaWYgKF9fbiAhPSAwKSB7CisgICAgICBzaXplX3R5cGUgX19idWZfc2l6ZSA9IF9fbiAqIHNpemVvZih2YWx1ZV90eXBlKTsKKyAgICAgIF9UcCogX19yZXQgPSBfX1JFSU5URVJQUkVUX0NBU1QoX1RwKiwgX1NfQWxsb2M6OmFsbG9jYXRlKF9fYnVmX3NpemUsIF9NX3N0YXRlKSk7CisjaWYgZGVmaW5lZCAoX1NUTFBfREVCVUdfVU5JTklUSUFMSVpFRCkgJiYgIWRlZmluZWQgKF9TVExQX0RFQlVHX0FMTE9DKQorICAgICAgbWVtc2V0KChjaGFyKilfX3JldCwgX1NUTFBfU0hSRURfQllURSwgX19idWZfc2l6ZSk7CisjZW5kaWYKKyAgICAgIHJldHVybiBfX3JldDsKKyAgICB9CisgICAgZWxzZQorICAgICAgcmV0dXJuIDA7CisgIH0KKworICB2b2lkIGRlYWxsb2NhdGUocG9pbnRlciBfX3AsIHNpemVfdHlwZSBfX24pIHsKKyAgICBfU1RMUF9BU1NFUlQoIChfX3AgPT0gMCkgPT0gKF9fbiA9PSAwKSApCisgICAgaWYgKF9fcCAhPSAwKSB7CisjaWYgZGVmaW5lZCAoX1NUTFBfREVCVUdfVU5JTklUSUFMSVpFRCkgJiYgIWRlZmluZWQgKF9TVExQX0RFQlVHX0FMTE9DKQorICAgICAgbWVtc2V0KChjaGFyKilfX3AsIF9TVExQX1NIUkVEX0JZVEUsIF9fbiAqIHNpemVvZih2YWx1ZV90eXBlKSk7CisjZW5kaWYKKyAgICAgIF9TX0FsbG9jOjpkZWFsbG9jYXRlKF9fcCwgX19uICogc2l6ZW9mKHZhbHVlX3R5cGUpLCBfTV9zdGF0ZSk7CisgICAgfQorICB9CisKKyAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgX1NUTFBfTk9USFJPVworICB7IHJldHVybiBzaXplX3QoLTEpIC8gc2l6ZW9mKF9UcCk7IH0KKworICB2b2lkIGNvbnN0cnVjdChwb2ludGVyIF9fcCwgY29uc3QgX1RwJiBfX3ZhbCkgeyBuZXcoX19wKSBfVHAoX192YWwpOyB9CisgIHZvaWQgZGVzdHJveShwb2ludGVyIF9wKSB7IF9wLT5+X1RwKCk7IH0KKworICAvLyBzdGF0ZSBpcyBiZWluZyBrZXB0IGhlcmUKKyAgX19zdGF0ZV90eXBlKiBfTV9zdGF0ZTsKKworI2lmIGRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpCisgIC8qIFNUTHBvcnQgZXh0ZW5zaW9uIGdpdmluZyByb3VuZGVkIHNpemUgb2YgYW4gYWxsb2NhdGVkIG1lbW9yeSBidWZmZXIKKyAgICogVGhpcyBtZXRob2QgZG8gbm90IGhhdmUgdG8gYmUgcGFydCBvZiBhIHVzZXIgZGVmaW5lZCBhbGxvY2F0b3IgaW1wbGVtZW50YXRpb24KKyAgICogYW5kIHdvbid0IGV2ZW4gYmUgY2FsbGVkIGlmIHN1Y2ggYSBmdW5jdGlvbiB3YXMgZ3JhbnRlZC4KKyAgICovCitwcm90ZWN0ZWQ6CisjZW5kaWYKKyAgX1RwKiBhbGxvY2F0ZShzaXplX3R5cGUgX19uLCBzaXplX3R5cGUmIF9fYWxsb2NhdGVkX24pIHsKKyAgICBpZiAoX19uID4gbWF4X3NpemUoKSkgeworICAgICAgX1NUTFBfVEhST1dfQkFEX0FMTE9DOworICAgIH0KKyAgICBpZiAoX19uICE9IDApIHsKKyAgICAgIHNpemVfdHlwZSBfX2J1Zl9zaXplID0gX19uICogc2l6ZW9mKHZhbHVlX3R5cGUpOworICAgICAgX1RwKiBfX3JldCA9IF9fUkVJTlRFUlBSRVRfQ0FTVCh2YWx1ZV90eXBlKiwgX1NfQWxsb2M6OmFsbG9jYXRlKF9fYnVmX3NpemUsIF9NX3N0YXRlKSk7CisjaWYgZGVmaW5lZCAoX1NUTFBfREVCVUdfVU5JTklUSUFMSVpFRCkgJiYgIWRlZmluZWQgKF9TVExQX0RFQlVHX0FMTE9DKQorICAgICAgbWVtc2V0KChjaGFyKilfX3JldCwgX1NUTFBfU0hSRURfQllURSwgX19idWZfc2l6ZSk7CisjZW5kaWYKKyAgICAgIF9fYWxsb2NhdGVkX24gPSBfX2J1Zl9zaXplIC8gc2l6ZW9mKHZhbHVlX3R5cGUpOworICAgICAgcmV0dXJuIF9fcmV0OworICAgIH0KKyAgICBlbHNlCisgICAgICByZXR1cm4gMDsKKyAgfQorfTsKKworX1NUTFBfVEVNUExBVEVfTlVMTAorY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgcGVyX3RocmVhZF9hbGxvY2F0b3I8dm9pZD4geworcHVibGljOgorICB0eXBlZGVmIHNpemVfdCAgICAgIHNpemVfdHlwZTsKKyAgdHlwZWRlZiBwdHJkaWZmX3QgICBkaWZmZXJlbmNlX3R5cGU7CisgIHR5cGVkZWYgdm9pZCogICAgICAgcG9pbnRlcjsKKyAgdHlwZWRlZiBjb25zdCB2b2lkKiBjb25zdF9wb2ludGVyOworICB0eXBlZGVmIHZvaWQgICAgICAgIHZhbHVlX3R5cGU7CisjaWZkZWYgX1NUTFBfTUVNQkVSX1RFTVBMQVRFX0NMQVNTRVMKKyAgdGVtcGxhdGUgPGNsYXNzIF9OZXdUeXBlPiBzdHJ1Y3QgcmViaW5kIHsKKyAgICB0eXBlZGVmIHBlcl90aHJlYWRfYWxsb2NhdG9yPF9OZXdUeXBlPiBvdGhlcjsKKyAgfTsKKyNlbmRpZgorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgoraW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBwZXJfdGhyZWFkX2FsbG9jYXRvcjxfVDE+JiBfX2ExLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwZXJfdGhyZWFkX2FsbG9jYXRvcjxfVDI+JiBfX2EyKQoreyByZXR1cm4gX19hMS5fTV9zdGF0ZSA9PSBfX2EyLl9NX3N0YXRlOyB9CisKKyNpZmRlZiBfU1RMUF9GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIKK3RlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgcGVyX3RocmVhZF9hbGxvY2F0b3I8X1QxPiYgX19hMSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGVyX3RocmVhZF9hbGxvY2F0b3I8X1QyPiYgX19hMikKK3sgcmV0dXJuIF9fYTEuX01fc3RhdGUgIT0gX19hMi5fTV9zdGF0ZTsgfQorI2VuZGlmCisKKworI2lmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BdHlwZT4KK3N0cnVjdCBfQWxsb2NfdHJhaXRzPF9UcCwgcGVyX3RocmVhZF9hbGxvY2F0b3I8X0F0eXBlPiA+Cit7IHR5cGVkZWYgcGVyX3RocmVhZF9hbGxvY2F0b3I8X1RwPiBhbGxvY2F0b3JfdHlwZTsgfTsKKworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9ET05UX1NVUFBPUlRfUkVCSU5EX01FTUJFUl9URU1QTEFURSkKKwordGVtcGxhdGUgPGNsYXNzIF9UcDEsIGNsYXNzIF9UcDI+CitpbmxpbmUgcGVyX3RocmVhZF9hbGxvY2F0b3I8X1RwMj4mCitfX3N0bF9hbGxvY19yZWJpbmQocGVyX3RocmVhZF9hbGxvY2F0b3I8X1RwMT4mIF9feCwgY29uc3QgX1RwMiopCit7IHJldHVybiAocGVyX3RocmVhZF9hbGxvY2F0b3I8X1RwMj4mKV9feDsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwMSwgY2xhc3MgX1RwMj4KK2lubGluZSBwZXJfdGhyZWFkX2FsbG9jYXRvcjxfVHAyPgorX19zdGxfYWxsb2NfY3JlYXRlKHBlcl90aHJlYWRfYWxsb2NhdG9yPF9UcDE+JiwgY29uc3QgX1RwMiopCit7IHJldHVybiBwZXJfdGhyZWFkX2FsbG9jYXRvcjxfVHAyPigpOyB9CisKKyNlbmRpZiAvKiBfU1RMUF9ET05UX1NVUFBPUlRfUkVCSU5EX01FTUJFUl9URU1QTEFURSAqLworCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX19wZXJ0aHJlYWRfYWxsb2NfdHlwZV90cmFpdHMgeworICB0eXBlZGVmIHR5cGVuYW1lIF9Jc1NUTHBvcnRDbGFzczxwZXJfdGhyZWFkX2FsbG9jYXRvcjxfVHA+ID46Ol9SZXQgX1NUTHBvcnRBbGxvYzsKKyAgLy9UaGUgZGVmYXVsdCBhbGxvY2F0b3IgaW1wbGVtZW50YXRpb24gd2hpY2ggaXMgcmVjb2duaXplIHRoYW5rcyB0byB0aGUKKyAgLy9fX3N0bHBvcnRfY2xhc3MgaW5oZXJpdGFuY2UgaXMgYSBzdGF0ZWxlc3Mgb2JqZWN0IHNvOgorICB0eXBlZGVmIF9fZmFsc2VfdHlwZSBoYXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yOworICB0eXBlZGVmIF9TVExwb3J0QWxsb2MgaGFzX3RyaXZpYWxfY29weV9jb25zdHJ1Y3RvcjsKKyAgdHlwZWRlZiBfU1RMcG9ydEFsbG9jIGhhc190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3I7CisgIHR5cGVkZWYgX1NUTHBvcnRBbGxvYyBoYXNfdHJpdmlhbF9kZXN0cnVjdG9yOworICB0eXBlZGVmIF9fZmFsc2VfdHlwZSBpc19QT0RfdHlwZTsKK307CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCisjaWYgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX190eXBlX3RyYWl0czxwZXJfdGhyZWFkX2FsbG9jYXRvcjxfVHA+ID4gOiBfU1RMUF9QUklWIF9fcGVydGhyZWFkX2FsbG9jX3R5cGVfdHJhaXRzPF9UcD4ge307CisjZWxzZQorX1NUTFBfVEVNUExBVEVfTlVMTAorc3RydWN0IF9fdHlwZV90cmFpdHM8cGVyX3RocmVhZF9hbGxvY2F0b3I8Y2hhcj4gPiA6IF9TVExQX1BSSVYgX19wZXJ0aHJlYWRfYWxsb2NfdHlwZV90cmFpdHM8Y2hhcj4ge307CisjICBpZiBkZWZpbmVkIChfU1RMUF9IQVNfV0NIQVJfVCkKK19TVExQX1RFTVBMQVRFX05VTEwKK3N0cnVjdCBfX3R5cGVfdHJhaXRzPHBlcl90aHJlYWRfYWxsb2NhdG9yPHdjaGFyX3Q+ID4gOiBfU1RMUF9QUklWIF9fcGVydGhyZWFkX2FsbG9jX3R5cGVfdHJhaXRzPHdjaGFyX3Q+IHt9OworIyAgZW5kaWYKKyMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9QVFJfU1BFQ0lBTElaQVRJT05TKQorX1NUTFBfVEVNUExBVEVfTlVMTAorc3RydWN0IF9fdHlwZV90cmFpdHM8cGVyX3RocmVhZF9hbGxvY2F0b3I8dm9pZCo+ID4gOiBfU1RMUF9QUklWIF9fcGVydGhyZWFkX2FsbG9jX3R5cGVfdHJhaXRzPHZvaWQqPiB7fTsKKyMgIGVuZGlmCisjZW5kaWYKKworCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNlbmRpZiAvKiBfU1RMUF9QVEhSRUFEX0FMTE9DICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9fcHRyc19zcGVjaWFsaXplLmggYi9zdGxwb3J0L3N0bC9fcHRyc19zcGVjaWFsaXplLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjljYjVkOAotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc3RsL19wdHJzX3NwZWNpYWxpemUuaApAQCAtMCwwICsxLDgzIEBACisjaWZuZGVmIF9TVExQX1BUUlNfU1BFQ0lBTElaRV9ICisjZGVmaW5lIF9TVExQX1BUUlNfU1BFQ0lBTElaRV9ICisKKyNpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKSB8fCBcCisgICAoZGVmaW5lZCAoX1NUTFBfU0lNVUxBVEVfUEFSVElBTF9TUEVDX0ZPUl9UWVBFX1RSQUlUUykgJiYgIWRlZmluZWQgKF9TVExQX05PX0FSUk9XX09QRVJBVE9SKSkKKyMgIGRlZmluZSBfU1RMUF9QT0lOVEVSU19TUEVDSUFMSVpFKCBfVHBQICkKKyMgIGRlZmluZSBfU1RMUF9ERUZJTkVfQVJST1dfT1BFUkFUT1IgIHBvaW50ZXIgb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuICYob3BlcmF0b3IqKCkpOyB9CisjZWxzZQorIyAgaWZuZGVmIF9TVExQX1RZUEVfVFJBSVRTX0gKKyMgICAgaW5jbHVkZSA8c3RsL3R5cGVfdHJhaXRzLmg+CisjICBlbmRpZgorCisvLyB0aGUgZm9sbG93aW5nIGlzIGEgd29ya2Fyb3VuZCBmb3IgYXJyb3cgb3BlcmF0b3IgcHJvYmxlbXMKKyMgIGlmIGRlZmluZWQgICggX1NUTFBfTk9fQVJST1dfT1BFUkFUT1IgKQorLy8gVXNlciB3YW50cyB0byBkaXNhYmxlIHByb3h5IC0+IG9wZXJhdG9ycworIyAgICBkZWZpbmUgX1NUTFBfREVGSU5FX0FSUk9XX09QRVJBVE9SCisjICBlbHNlCisvLyBDb21waWxlciBjYW4gaGFuZGxlIGdlbmVyaWMgLT4gb3BlcmF0b3IuCisjICAgIGlmIGRlZmluZWQgKF9fQk9STEFORENfXykKKyMgICAgICBkZWZpbmUgX1NUTFBfREVGSU5FX0FSUk9XX09QRVJBVE9SICBwb2ludGVyIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiAmKCooKnRoaXMpKTsgfQorIyAgICBlbGlmIGRlZmluZWQoX19XQVRDT01DX18pCisjICAgICAgZGVmaW5lIF9TVExQX0RFRklORV9BUlJPV19PUEVSQVRPUiBwb2ludGVyIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJlZmVyZW5jZSB4ID0gb3BlcmF0b3IqKCk7IHJldHVybiAmeDsgfQorIyAgICBlbHNlCisjICAgICAgZGVmaW5lIF9TVExQX0RFRklORV9BUlJPV19PUEVSQVRPUiAgcG9pbnRlciBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gJihvcGVyYXRvciooKSk7IH0KKyMgICAgZW5kaWYKKyMgIGVuZGlmIC8qIF9TVExQX05PX0FSUk9XX09QRVJBVE9SICovCisKKy8vIEltcG9ydGFudCBwb2ludGVycyBzcGVjaWFsaXphdGlvbnMKKworIyAgaWZkZWYgX1NUTFBfU0lNVUxBVEVfUEFSVElBTF9TUEVDX0ZPUl9UWVBFX1RSQUlUUworIyAgICBkZWZpbmUgX1NUTFBfVFlQRV9UUkFJVFNfUE9EX1NQRUNJQUxJWkVfVihfVHlwZSkKKyMgICAgZGVmaW5lIF9TVExQX1RZUEVfVFJBSVRTX1BPRF9TUEVDSUFMSVpFKF9UeXBlKQorIyAgZWxzZQorIyAgICBkZWZpbmUgX1NUTFBfVFlQRV9UUkFJVFNfUE9EX1NQRUNJQUxJWkUoX1R5cGUpIF9TVExQX1RFTVBMQVRFX05VTEwgc3RydWN0IF9fdHlwZV90cmFpdHM8X1R5cGU+IDogX190eXBlX3RyYWl0c19hdXg8X190cnVlX3R5cGU+IHt9OworIyAgICBkZWZpbmUgX1NUTFBfVFlQRV9UUkFJVFNfUE9EX1NQRUNJQUxJWkVfVihfVHlwZSkgXAorX1NUTFBfVFlQRV9UUkFJVFNfUE9EX1NQRUNJQUxJWkUoX1R5cGUqKSBcCitfU1RMUF9UWVBFX1RSQUlUU19QT0RfU1BFQ0lBTElaRShjb25zdCBfVHlwZSopIFwKK19TVExQX1RZUEVfVFJBSVRTX1BPRF9TUEVDSUFMSVpFKF9UeXBlKiopIFwKK19TVExQX1RZUEVfVFJBSVRTX1BPRF9TUEVDSUFMSVpFKF9UeXBlKiBjb25zdCAqKSBcCitfU1RMUF9UWVBFX1RSQUlUU19QT0RfU1BFQ0lBTElaRShjb25zdCBfVHlwZSoqKSBcCitfU1RMUF9UWVBFX1RSQUlUU19QT0RfU1BFQ0lBTElaRShfVHlwZSoqKikgXAorX1NUTFBfVFlQRV9UUkFJVFNfUE9EX1NQRUNJQUxJWkUoY29uc3QgX1R5cGUqKiopCisjICBlbmRpZgorCisjICBkZWZpbmUgX1NUTFBfUE9JTlRFUlNfU1BFQ0lBTElaRShfVHlwZSkgX1NUTFBfVFlQRV9UUkFJVFNfUE9EX1NQRUNJQUxJWkVfVihfVHlwZSkKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKKyMgIGlmICFkZWZpbmVkICggX1NUTFBfTk9fQk9PTCApCitfU1RMUF9QT0lOVEVSU19TUEVDSUFMSVpFKCBib29sICkKKyMgIGVuZGlmCitfU1RMUF9UWVBFX1RSQUlUU19QT0RfU1BFQ0lBTElaRV9WKHZvaWQpCisjICBpZm5kZWYgX1NUTFBfTk9fU0lHTkVEX0JVSUxUSU5TCisgIF9TVExQX1BPSU5URVJTX1NQRUNJQUxJWkUoIHNpZ25lZCBjaGFyICkKKyMgIGVuZGlmCisgIF9TVExQX1BPSU5URVJTX1NQRUNJQUxJWkUoIGNoYXIgKQorICBfU1RMUF9QT0lOVEVSU19TUEVDSUFMSVpFKCB1bnNpZ25lZCBjaGFyICkKKyAgX1NUTFBfUE9JTlRFUlNfU1BFQ0lBTElaRSggc2hvcnQgKQorICBfU1RMUF9QT0lOVEVSU19TUEVDSUFMSVpFKCB1bnNpZ25lZCBzaG9ydCApCisgIF9TVExQX1BPSU5URVJTX1NQRUNJQUxJWkUoIGludCApCisgIF9TVExQX1BPSU5URVJTX1NQRUNJQUxJWkUoIHVuc2lnbmVkIGludCApCisgIF9TVExQX1BPSU5URVJTX1NQRUNJQUxJWkUoIGxvbmcgKQorICBfU1RMUF9QT0lOVEVSU19TUEVDSUFMSVpFKCB1bnNpZ25lZCBsb25nICkKKyAgX1NUTFBfUE9JTlRFUlNfU1BFQ0lBTElaRSggZmxvYXQgKQorICBfU1RMUF9QT0lOVEVSU19TUEVDSUFMSVpFKCBkb3VibGUgKQorIyAgaWYgIWRlZmluZWQgKCBfU1RMUF9OT19MT05HX0RPVUJMRSApCisgIF9TVExQX1BPSU5URVJTX1NQRUNJQUxJWkUoIGxvbmcgZG91YmxlICkKKyMgIGVuZGlmCisjICBpZiBkZWZpbmVkICggX1NUTFBfTE9OR19MT05HKQorICBfU1RMUF9QT0lOVEVSU19TUEVDSUFMSVpFKCBfU1RMUF9MT05HX0xPTkcgKQorICBfU1RMUF9QT0lOVEVSU19TUEVDSUFMSVpFKCB1bnNpZ25lZCBfU1RMUF9MT05HX0xPTkcgKQorIyAgZW5kaWYKKyMgIGlmIGRlZmluZWQgKCBfU1RMUF9IQVNfV0NIQVJfVCApICYmICEgZGVmaW5lZCAoX1NUTFBfV0NIQVJfVF9JU19VU0hPUlQpCisgIF9TVExQX1BPSU5URVJTX1NQRUNJQUxJWkUoIHdjaGFyX3QgKQorIyAgZW5kaWYKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjICB1bmRlZiBfU1RMUF9BUlJPV19TUEVDSUFMSVpFCisjICB1bmRlZiBfU1RMUF9UWVBFX1RSQUlUU19QT0RfU1BFQ0lBTElaRV9WCisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9fcXVldWUuaCBiL3N0bHBvcnQvc3RsL19xdWV1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMzc2M2MKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9fcXVldWUuaApAQCAtMCwwICsxLDI2OCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKy8qIE5PVEU6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIFNUTCBoZWFkZXJzLgorICogICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4KKyAqLworCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX1FVRVVFX0gKKyNkZWZpbmUgX1NUTFBfSU5URVJOQUxfUVVFVUVfSAorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0RFUVVFX0gKKyMgIGluY2x1ZGUgPHN0bC9fZGVxdWUuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX1ZFQ1RPUl9ICisjIGluY2x1ZGUgPHN0bC9fdmVjdG9yLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9IRUFQX0gKKyMgIGluY2x1ZGUgPHN0bC9faGVhcC5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfRlVOQ1RJT05fQkFTRV9ICisjICBpbmNsdWRlIDxzdGwvX2Z1bmN0aW9uX2Jhc2UuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworIyBpZiAhIGRlZmluZWQgKCBfU1RMUF9MSU1JVEVEX0RFRkFVTFRfVEVNUExBVEVTICkKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9TZXF1ZW5jZSA9IGRlcXVlPF9UcD4gPgorIyBlbGlmIGRlZmluZWQgKCBfU1RMUF9NSU5JTVVNX0RFRkFVTFRfVEVNUExBVEVfUEFSQU1TICkKKyMgIGRlZmluZSBfU1RMUF9RVUVVRV9BUkdTIF9UcAordGVtcGxhdGUgPGNsYXNzIF9UcD4KKyMgZWxzZQordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1NlcXVlbmNlPgorIyBlbmRpZgorY2xhc3MgcXVldWUKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUEFSVElBTF9TUEVDX1dPUktBUk9VTkQpCisjICBpZiBkZWZpbmVkIChfU1RMUF9RVUVVRV9BUkdTKQorICAgICAgICAgICAgOiBwdWJsaWMgX19zdGxwb3J0X2NsYXNzPHF1ZXVlPF9UcD4gPgorIyAgZWxzZQorICAgICAgICAgICAgOiBwdWJsaWMgX19zdGxwb3J0X2NsYXNzPHF1ZXVlPF9UcCwgX1NlcXVlbmNlPiA+CisjICBlbmRpZgorI2VuZGlmCit7CisjIGlmIGRlZmluZWQgKCBfU1RMUF9RVUVVRV9BUkdTICkKKyAgdHlwZWRlZiBkZXF1ZTxfVHA+IF9TZXF1ZW5jZTsKKyAgdHlwZWRlZiBxdWV1ZTxfVHA+IF9TZWxmOworIyBlbHNlCisgIHR5cGVkZWYgcXVldWU8X1RwLCBfU2VxdWVuY2U+IF9TZWxmOworIyBlbmRpZgorcHVibGljOgorICB0eXBlZGVmIHR5cGVuYW1lIF9TZXF1ZW5jZTo6dmFsdWVfdHlwZSAgICAgIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1NlcXVlbmNlOjpzaXplX3R5cGUgICAgICAgc2l6ZV90eXBlOworICB0eXBlZGVmICAgICAgICAgIF9TZXF1ZW5jZSAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcl90eXBlOworCisgIHR5cGVkZWYgdHlwZW5hbWUgX1NlcXVlbmNlOjpyZWZlcmVuY2UgICAgICAgcmVmZXJlbmNlOworICB0eXBlZGVmIHR5cGVuYW1lIF9TZXF1ZW5jZTo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZTsKKworcHJvdGVjdGVkOgorICAvL2MgaXMgYSBTdGFuZGFyZCBuYW1lICgyMy4yLjMuMSksIGRvIG5vIG1ha2UgaXQgU1RMcG9ydCBuYW1pbmcgY29udmVudGlvbiBjb21wbGlhbnQuCisgIF9TZXF1ZW5jZSBjOworcHVibGljOgorICBxdWV1ZSgpIDogYygpIHt9CisgIGV4cGxpY2l0IHF1ZXVlKGNvbnN0IF9TZXF1ZW5jZSYgX19jKSA6IGMoX19jKSB7fQorCisjaWYgIWRlZmluZWQgKF9TVExQX05PX01PVkVfU0VNQU5USUMpCisgIHF1ZXVlKF9fbW92ZV9zb3VyY2U8X1NlbGY+IHNyYykKKyAgICA6IGMoX1NUTFBfUFJJViBfQXNNb3ZlU291cmNlKHNyYy5nZXQoKS5jKSkge30KKyNlbmRpZgorCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBjLmVtcHR5KCk7IH0KKyAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCB7IHJldHVybiBjLnNpemUoKTsgfQorICByZWZlcmVuY2UgZnJvbnQoKSB7IHJldHVybiBjLmZyb250KCk7IH0KKyAgY29uc3RfcmVmZXJlbmNlIGZyb250KCkgY29uc3QgeyByZXR1cm4gYy5mcm9udCgpOyB9CisgIHJlZmVyZW5jZSBiYWNrKCkgeyByZXR1cm4gYy5iYWNrKCk7IH0KKyAgY29uc3RfcmVmZXJlbmNlIGJhY2soKSBjb25zdCB7IHJldHVybiBjLmJhY2soKTsgfQorICB2b2lkIHB1c2goY29uc3QgdmFsdWVfdHlwZSYgX194KSB7IGMucHVzaF9iYWNrKF9feCk7IH0KKyAgdm9pZCBwb3AoKSB7IGMucG9wX2Zyb250KCk7IH0KKyAgY29uc3QgX1NlcXVlbmNlJiBfR2V0X3MoKSBjb25zdCB7IHJldHVybiBjOyB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUEFSVElBTF9TUEVDX1dPUktBUk9VTkQpICYmICFkZWZpbmVkIChfU1RMUF9GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIpCisgIHZvaWQgX01fc3dhcF93b3JrYXJvdW5kKF9TZWxmJiBfX3gpIHsKKyAgICBfU2VxdWVuY2UgX190bXAgPSBjOworICAgIGMgPSBfX3guYzsKKyAgICBfX3guYyA9IF9fdG1wOworICB9CisjZW5kaWYKK307CisKKyNpZm5kZWYgX1NUTFBfUVVFVUVfQVJHUworIyAgZGVmaW5lIF9TVExQX1FVRVVFX0FSR1MgX1RwLCBfU2VxdWVuY2UKKyMgIGRlZmluZSBfU1RMUF9RVUVVRV9IRUFERVJfQVJHUyBjbGFzcyBfVHAsIGNsYXNzIF9TZXF1ZW5jZQorI2Vsc2UKKyMgIGRlZmluZSBfU1RMUF9RVUVVRV9IRUFERVJfQVJHUyBjbGFzcyBfVHAKKyNlbmRpZgorCit0ZW1wbGF0ZSA8IF9TVExQX1FVRVVFX0hFQURFUl9BUkdTID4KK2lubGluZSBib29sIF9TVExQX0NBTEwKK29wZXJhdG9yPT0oY29uc3QgcXVldWU8X1NUTFBfUVVFVUVfQVJHUyA+JiBfX3gsIGNvbnN0IHF1ZXVlPF9TVExQX1FVRVVFX0FSR1MgPiYgX195KSB7CisgIHJldHVybiBfX3guX0dldF9zKCkgPT0gX195Ll9HZXRfcygpOworfQorCit0ZW1wbGF0ZSA8IF9TVExQX1FVRVVFX0hFQURFUl9BUkdTID4KK2lubGluZSBib29sIF9TVExQX0NBTEwKK29wZXJhdG9yPChjb25zdCBxdWV1ZTxfU1RMUF9RVUVVRV9BUkdTID4mIF9feCwgY29uc3QgcXVldWU8X1NUTFBfUVVFVUVfQVJHUyA+JiBfX3kpIHsKKyAgcmV0dXJuIF9feC5fR2V0X3MoKSA8IF9feS5fR2V0X3MoKTsKK30KKworX1NUTFBfUkVMT1BTX09QRVJBVE9SUyggdGVtcGxhdGUgPCBfU1RMUF9RVUVVRV9IRUFERVJfQVJHUyA+LCBxdWV1ZTxfU1RMUF9RVUVVRV9BUkdTID4gKQorCisjIGlmICEoZGVmaW5lZCAoIF9TVExQX0xJTUlURURfREVGQVVMVF9URU1QTEFURVMgKSB8fCBkZWZpbmVkICggX1NUTFBfVEVNUExBVEVfUEFSQU1fU1VCVFlQRV9CVUcgKSkKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9TZXF1ZW5jZSA9IHZlY3RvcjxfVHA+LAorICAgICAgICAgIGNsYXNzIF9Db21wYXJlID0gbGVzczxfU1RMUF9IRUFERVJfVFlQRU5BTUUgX1NlcXVlbmNlOjp2YWx1ZV90eXBlPiA+CisjIGVsaWYgZGVmaW5lZCAoIF9TVExQX01JTklNVU1fREVGQVVMVF9URU1QTEFURV9QQVJBTVMgKQordGVtcGxhdGUgPGNsYXNzIF9UcD4KKyMgZWxzZQordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1NlcXVlbmNlLCBjbGFzcyBfQ29tcGFyZT4KKyMgZW5kaWYKK2NsYXNzIHByaW9yaXR5X3F1ZXVlCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfTUlOSU1VTV9ERUZBVUxUX1RFTVBMQVRFX1BBUkFNUykKKyAgICAgICAgICAgIDogcHVibGljIF9fc3RscG9ydF9jbGFzczxwcmlvcml0eV9xdWV1ZTxfVHA+ID4KKyMgIGVsc2UKKyAgICAgICAgICAgIDogcHVibGljIF9fc3RscG9ydF9jbGFzczxwcmlvcml0eV9xdWV1ZTxfVHAsIF9TZXF1ZW5jZT4gPgorIyAgZW5kaWYKKyNlbmRpZgoreworIyBpZmRlZiBfU1RMUF9NSU5JTVVNX0RFRkFVTFRfVEVNUExBVEVfUEFSQU1TCisgIHR5cGVkZWYgdmVjdG9yPF9UcD4gX1NlcXVlbmNlOworICB0eXBlZGVmIGxlc3M8IHR5cGVuYW1lIHZlY3RvcjxfVHA+Ojp2YWx1ZV90eXBlPiBfQ29tcGFyZTsKKyAgdHlwZWRlZiBwcmlvcml0eV9xdWV1ZTxfVHA+IF9TZWxmOworIyBlbHNlCisgIHR5cGVkZWYgcHJpb3JpdHlfcXVldWU8X1RwLCBfU2VxdWVuY2UsIF9Db21wYXJlPiBfU2VsZjsKKyMgZW5kaWYKK3B1YmxpYzoKKyAgdHlwZWRlZiB0eXBlbmFtZSBfU2VxdWVuY2U6OnZhbHVlX3R5cGUgICAgICB2YWx1ZV90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9TZXF1ZW5jZTo6c2l6ZV90eXBlICAgICAgIHNpemVfdHlwZTsKKyAgdHlwZWRlZiAgICAgICAgICBfU2VxdWVuY2UgICAgICAgICAgICAgICAgICBjb250YWluZXJfdHlwZTsKKworICB0eXBlZGVmIHR5cGVuYW1lIF9TZXF1ZW5jZTo6cmVmZXJlbmNlICAgICAgIHJlZmVyZW5jZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfU2VxdWVuY2U6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9yZWZlcmVuY2U7Citwcm90ZWN0ZWQ6CisgIC8vYyBpcyBhIFN0YW5kYXJkIG5hbWUgKDIzLjIuMy4yKSwgZG8gbm8gbWFrZSBpdCBTVExwb3J0IG5hbWluZyBjb252ZW50aW9uIGNvbXBsaWFudC4KKyAgX1NlcXVlbmNlIGM7CisgIF9Db21wYXJlIGNvbXA7CitwdWJsaWM6CisgIHByaW9yaXR5X3F1ZXVlKCkgOiBjKCkge30KKyAgZXhwbGljaXQgcHJpb3JpdHlfcXVldWUoY29uc3QgX0NvbXBhcmUmIF9feCkgOiAgYygpLCBjb21wKF9feCkge30KKyAgcHJpb3JpdHlfcXVldWUoY29uc3QgX0NvbXBhcmUmIF9feCwgY29uc3QgX1NlcXVlbmNlJiBfX3MpCisgICAgOiBjKF9fcyksIGNvbXAoX194KQorICAgIHsgbWFrZV9oZWFwKGMuYmVnaW4oKSwgYy5lbmQoKSwgY29tcCk7IH0KKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19NT1ZFX1NFTUFOVElDKQorICBwcmlvcml0eV9xdWV1ZShfX21vdmVfc291cmNlPF9TZWxmPiBzcmMpCisgICAgOiBjKF9TVExQX1BSSVYgX0FzTW92ZVNvdXJjZShzcmMuZ2V0KCkuYykpLAorICAgICAgY29tcChfU1RMUF9QUklWIF9Bc01vdmVTb3VyY2Uoc3JjLmdldCgpLmNvbXApKSB7fQorI2VuZGlmCisKKyNpZmRlZiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgcHJpb3JpdHlfcXVldWUoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgIDogYyhfX2ZpcnN0LCBfX2xhc3QpIHsgbWFrZV9oZWFwKGMuYmVnaW4oKSwgYy5lbmQoKSwgY29tcCk7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHByaW9yaXR5X3F1ZXVlKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsCisgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgY29uc3QgX0NvbXBhcmUmIF9feCkKKyAgICA6IGMoX19maXJzdCwgX19sYXN0KSwgY29tcChfX3gpCisgICAgeyBtYWtlX2hlYXAoYy5iZWdpbigpLCBjLmVuZCgpLCBjb21wKTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgcHJpb3JpdHlfcXVldWUoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICBjb25zdCBfQ29tcGFyZSYgX194LCBjb25zdCBfU2VxdWVuY2UmIF9fcykKKyAgOiBjKF9fcyksIGNvbXAoX194KQorICB7CisgICAgYy5pbnNlcnQoYy5lbmQoKSwgX19maXJzdCwgX19sYXN0KTsKKyAgICBtYWtlX2hlYXAoYy5iZWdpbigpLCBjLmVuZCgpLCBjb21wKTsKKyAgfQorCisjZWxzZSAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisgIHByaW9yaXR5X3F1ZXVlKGNvbnN0IHZhbHVlX3R5cGUqIF9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbGFzdCkKKyAgICA6IGMoX19maXJzdCwgX19sYXN0KSB7IG1ha2VfaGVhcChjLmJlZ2luKCksIGMuZW5kKCksIGNvbXApOyB9CisKKyAgcHJpb3JpdHlfcXVldWUoY29uc3QgdmFsdWVfdHlwZSogX19maXJzdCwgY29uc3QgdmFsdWVfdHlwZSogX19sYXN0LAorICAgICAgICAgICAgICAgICBjb25zdCBfQ29tcGFyZSYgX194KQorICAgIDogYyhfX2ZpcnN0LCBfX2xhc3QpLCBjb21wKF9feCkKKyAgICB7IG1ha2VfaGVhcChjLmJlZ2luKCksIGMuZW5kKCksIGNvbXApOyB9CisKKyAgcHJpb3JpdHlfcXVldWUoY29uc3QgdmFsdWVfdHlwZSogX19maXJzdCwgY29uc3QgdmFsdWVfdHlwZSogX19sYXN0LAorICAgICAgICAgICAgICAgICBjb25zdCBfQ29tcGFyZSYgX194LCBjb25zdCBfU2VxdWVuY2UmIF9fYykKKyAgICA6IGMoX19jKSwgY29tcChfX3gpCisgIHsKKyAgICBjLmluc2VydChjLmVuZCgpLCBfX2ZpcnN0LCBfX2xhc3QpOworICAgIG1ha2VfaGVhcChjLmJlZ2luKCksIGMuZW5kKCksIGNvbXApOworICB9CisjZW5kaWYgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBjLmVtcHR5KCk7IH0KKyAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCB7IHJldHVybiBjLnNpemUoKTsgfQorICBjb25zdF9yZWZlcmVuY2UgdG9wKCkgY29uc3QgeyByZXR1cm4gYy5mcm9udCgpOyB9CisgIHZvaWQgcHVzaChjb25zdCB2YWx1ZV90eXBlJiBfX3gpIHsKKyAgICBfU1RMUF9UUlkgeworICAgICAgYy5wdXNoX2JhY2soX194KTsKKyAgICAgIHB1c2hfaGVhcChjLmJlZ2luKCksIGMuZW5kKCksIGNvbXApOworICAgIH0KKyAgICBfU1RMUF9VTldJTkQoYy5jbGVhcigpKQorICB9CisgIHZvaWQgcG9wKCkgeworICAgIF9TVExQX1RSWSB7CisgICAgICBwb3BfaGVhcChjLmJlZ2luKCksIGMuZW5kKCksIGNvbXApOworICAgICAgYy5wb3BfYmFjaygpOworICAgIH0KKyAgICBfU1RMUF9VTldJTkQoYy5jbGVhcigpKQorICB9CisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKSAmJiAhZGVmaW5lZCAoX1NUTFBfRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSKQorICB2b2lkIF9NX3N3YXBfd29ya2Fyb3VuZChfU2VsZiYgX194KSB7CisgICAgX1NlcXVlbmNlIF9fdG1wID0gYzsKKyAgICBjID0gX194LmM7CisgICAgX194LmMgPSBfX3RtcDsKKyAgfQorI2VuZGlmCit9OworCisjaWYgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikgJiYgIWRlZmluZWQgKF9TVExQX05PX01PVkVfU0VNQU5USUMpCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfU2VxdWVuY2U+CitzdHJ1Y3QgX19tb3ZlX3RyYWl0czxxdWV1ZTxfVHAsIF9TZXF1ZW5jZT4gPiA6CisgIF9TVExQX1BSSVYgX19tb3ZlX3RyYWl0c19hdXg8X1NlcXVlbmNlPgore307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9TZXF1ZW5jZSwgY2xhc3MgX0NvbXBhcmU+CitzdHJ1Y3QgX19tb3ZlX3RyYWl0czxwcmlvcml0eV9xdWV1ZTxfVHAsIF9TZXF1ZW5jZSwgX0NvbXBhcmU+ID4gOgorICBfU1RMUF9QUklWIF9fbW92ZV90cmFpdHNfYXV4MjxfU2VxdWVuY2UsIF9Db21wYXJlPgore307CisjZW5kaWYKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjdW5kZWYgX1NUTFBfUVVFVUVfQVJHUworI3VuZGVmIF9TVExQX1FVRVVFX0hFQURFUl9BUkdTCisjdW5kZWYgY29tcAorCisjZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfUVVFVUVfSCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdGwvX3JhbmdlX2Vycm9ycy5jIGIvc3RscG9ydC9zdGwvX3JhbmdlX2Vycm9ycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MjkzYmUKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9fcmFuZ2VfZXJyb3JzLmMKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogU2lsaWNvbiBHcmFwaGljcworICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqLworCisjaWYgZGVmaW5lZChfU1RMUF9USFJPV19SQU5HRV9FUlJPUlMpCisjICBpZiBkZWZpbmVkIChfU1RMUF9XSE9MRV9OQVRJVkVfU1REKSAmJiBkZWZpbmVkIChfU1RMUF9ET05UX1JFREVGSU5FX1NURCkKKy8vIEluIHRoaXMgbW9kZSB3ZSBhcmUgZ29pbmcgdG8gdGhyb3cgbmF0aXZlIGV4Y2VwdGlvbiBzbyB0aGF0IGNhdGNoIG9mCisvLyBleGNlcHRpb24gbGlrZSBzdGQ6OnJ1bnRpbWVfZXJyb3IgZm9yIGluc3RhbmNlIHdpbGwgYWxzbyBjYXRjaCBleGNlcHRpb24KKy8vIHRocm93biBieSBTVExwb3J0IGNvbnRhaW5lcnMgbGlrZSBzdGxwb3J0Ojp2ZWN0b3Igb3Igc3RscG9ydDo6c3RyaW5nLgorIyAgICBpbmNsdWRlIDxzdGRleGNlcHQ+CisjICAgIGluY2x1ZGUgPHN0cmluZz4KKyMgICAgZGVmaW5lIF9TVExQX1RIUk9XX01TRyhleCxtc2cpICB0aHJvdyBzdGQ6OmV4KG1zZykKKyMgIGVsc2UKKyMgICAgaWYgZGVmaW5lZCAoX19CVUlMRElOR19TVExQT1JUKQorIyAgICAgIGluY2x1ZGUgPHN0ZGV4Y2VwdD4KKyMgICAgICBpbmNsdWRlIDxzdHJpbmc+CisjICAgIGVsc2UKKyMgICAgICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfU1RERVhDRVBUCisjICAgICAgICBpbmNsdWRlIDxzdGwvX3N0ZGV4Y2VwdC5oPgorIyAgICAgIGVuZGlmCisjICAgICAgaWZuZGVmIF9TVExQX0lOVEVSTkFMX1NUUklOR19ICisjICAgICAgICBpbmNsdWRlIDxzdGwvX3N0cmluZy5oPgorIyAgICAgIGVuZGlmCisjICAgIGVuZGlmCisjICAgIGRlZmluZSBfU1RMUF9USFJPV19NU0coZXgsbXNnKSAgdGhyb3cgZXgobXNnKQorIyAgZW5kaWYKKyNlbHNlCisjICBpZiBkZWZpbmVkIChfX0JVSUxESU5HX1NUTFBPUlQpCisjICAgIGluY2x1ZGUgPGNzdGRsaWI+CisjICAgIGluY2x1ZGUgPGNzdGRpbz4KKyMgIGVsc2UKKyMgICAgaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NTVERMSUIKKyMgICAgICBpbmNsdWRlIDxzdGwvX2NzdGRsaWIuaD4KKyMgICAgZW5kaWYKKyMgICAgaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NTVERJTworIyAgICAgIGluY2x1ZGUgPHN0bC9fY3N0ZGlvLmg+CisjICAgIGVuZGlmCisjICBlbmRpZgorIyAgZGVmaW5lIF9TVExQX1RIUk9XX01TRyhleCxtc2cpICBwdXRzKG1zZyksX1NUTFBfQUJPUlQoKQorI2VuZGlmCisKKy8vIEZvciBtb2RlIHdpdGhvdXQgbGlicmFyeSBhbmQgdGhyb3dpbmcgcmFuZ2UgZXJyb3JzLCBpbmNsdWRlIHRoZQorLy8gc3RkZXhjZXB0IGhlYWRlciBhbmQgdGhyb3cgdGhlIGFwcHJvcHJpYXRlIGV4Y2VwdGlvbnMgZGlyZWN0bHkuCisKKyNpZiBkZWZpbmVkIChfU1RMUF9FWFRFUk5fUkFOR0VfRVJST1JTKQorIyAgZGVmaW5lIF9TVExQX1RIUk9XX0ZVTkNUX1NQRUMgdm9pZCBfU1RMUF9ERUNMU1BFQworI2Vsc2UKKyMgIGRlZmluZSBfU1RMUF9USFJPV19GVU5DVF9TUEVDIGlubGluZSB2b2lkCisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKK19TVExQX1RIUk9XX0ZVTkNUX1NQRUMgX1NUTFBfQ0FMTCBfX3N0bF90aHJvd19ydW50aW1lX2Vycm9yKGNvbnN0IGNoYXIqIF9fbXNnKQoreyBfU1RMUF9USFJPV19NU0cocnVudGltZV9lcnJvciwgX19tc2cpOyB9CisKK19TVExQX1RIUk9XX0ZVTkNUX1NQRUMgX1NUTFBfQ0FMTCBfX3N0bF90aHJvd19yYW5nZV9lcnJvcihjb25zdCBjaGFyKiBfX21zZykKK3sgX1NUTFBfVEhST1dfTVNHKHJhbmdlX2Vycm9yLCBfX21zZyk7IH0KKworX1NUTFBfVEhST1dfRlVOQ1RfU1BFQyBfU1RMUF9DQUxMIF9fc3RsX3Rocm93X291dF9vZl9yYW5nZShjb25zdCBjaGFyKiBfX21zZykKK3sgX1NUTFBfVEhST1dfTVNHKG91dF9vZl9yYW5nZSwgX19tc2cpOyB9CisKK19TVExQX1RIUk9XX0ZVTkNUX1NQRUMgX1NUTFBfQ0FMTCBfX3N0bF90aHJvd19sZW5ndGhfZXJyb3IoY29uc3QgY2hhciogX19tc2cpCit7IF9TVExQX1RIUk9XX01TRyhsZW5ndGhfZXJyb3IsIF9fbXNnKTsgfQorCitfU1RMUF9USFJPV19GVU5DVF9TUEVDIF9TVExQX0NBTEwgX19zdGxfdGhyb3dfaW52YWxpZF9hcmd1bWVudChjb25zdCBjaGFyKiBfX21zZykKK3sgX1NUTFBfVEhST1dfTVNHKGludmFsaWRfYXJndW1lbnQsIF9fbXNnKTsgfQorCitfU1RMUF9USFJPV19GVU5DVF9TUEVDIF9TVExQX0NBTEwgX19zdGxfdGhyb3dfb3ZlcmZsb3dfZXJyb3IoY29uc3QgY2hhciogX19tc2cpCit7IF9TVExQX1RIUk9XX01TRyhvdmVyZmxvd19lcnJvciwgX19tc2cpOyB9CisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI3VuZGVmIF9TVExQX1RIUk9XX0ZVTkNUX1NQRUMKKyN1bmRlZiBfU1RMUF9USFJPV19NU0cKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL19yYW5nZV9lcnJvcnMuaCBiL3N0bHBvcnQvc3RsL19yYW5nZV9lcnJvcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGRmMjZhCi0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvX3JhbmdlX2Vycm9ycy5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9SQU5HRV9FUlJPUlNfSAorI2RlZmluZSBfU1RMUF9SQU5HRV9FUlJPUlNfSAorCisvLyBBIGZldyBwbGFjZXMgaW4gdGhlIFNUTCB0aHJvdyByYW5nZSBlcnJvcnMsIHVzaW5nIHN0YW5kYXJkIGV4Y2VwdGlvbgorLy8gY2xhc3NlcyBkZWZpbmVkIGluIDxzdGRleGNlcHQ+LiAgVGhpcyBoZWFkZXIgZmlsZSBwcm92aWRlcyBmdW5jdGlvbnMKKy8vIHRvIHRocm93IHRob3NlIGV4Y2VwdGlvbiBvYmplY3RzLgorCisvLyBfU1RMUF9ET05UX1RIUk9XX1JBTkdFX0VSUk9SUyBpcyBhIGhvb2sgc28gdGhhdCB1c2VycyBjYW4gZGlzYWJsZQorLy8gdGhpcyBleGNlcHRpb24gdGhyb3dpbmcuCisjaWYgZGVmaW5lZCAoX1NUTFBfQ0FOX1RIUk9XX1JBTkdFX0VSUk9SUykgJiYgZGVmaW5lZCAoX1NUTFBfVVNFX0VYQ0VQVElPTlMpICYmIFwKKyAgICFkZWZpbmVkIChfU1RMUF9ET05UX1RIUk9XX1JBTkdFX0VSUk9SUykKKyMgIGRlZmluZSBfU1RMUF9USFJPV19SQU5HRV9FUlJPUlMKKyNlbmRpZgorCisvLyBGb3IgdGhlIFNUTHBvcnQgaW9zdHJlYW1zLCBvbmx5IGRlY2xhcmF0aW9uIGhlcmUsIGRlZmluaXRpb24gaXMgaW4gdGhlIGxpYgorI2lmICFkZWZpbmVkIChfU1RMUF9VU0VfTk9fSU9TVFJFQU1TKSAmJiAhZGVmaW5lZCAoX1NUTFBfRVhURVJOX1JBTkdFX0VSUk9SUykKKyMgIGRlZmluZSBfU1RMUF9FWFRFUk5fUkFOR0VfRVJST1JTCisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCit2b2lkIF9TVExQX0ZVTkNUSU9OX1RIUk9XUyBfU1RMUF9ERUNMU1BFQyBfU1RMUF9DQUxMIF9fc3RsX3Rocm93X3J1bnRpbWVfZXJyb3IoY29uc3QgY2hhciogX19tc2cpOwordm9pZCBfU1RMUF9GVU5DVElPTl9USFJPV1MgX1NUTFBfREVDTFNQRUMgX1NUTFBfQ0FMTCBfX3N0bF90aHJvd19yYW5nZV9lcnJvcihjb25zdCBjaGFyKiBfX21zZyk7Cit2b2lkIF9TVExQX0ZVTkNUSU9OX1RIUk9XUyBfU1RMUF9ERUNMU1BFQyBfU1RMUF9DQUxMIF9fc3RsX3Rocm93X291dF9vZl9yYW5nZShjb25zdCBjaGFyKiBfX21zZyk7Cit2b2lkIF9TVExQX0ZVTkNUSU9OX1RIUk9XUyBfU1RMUF9ERUNMU1BFQyBfU1RMUF9DQUxMIF9fc3RsX3Rocm93X2xlbmd0aF9lcnJvcihjb25zdCBjaGFyKiBfX21zZyk7Cit2b2lkIF9TVExQX0ZVTkNUSU9OX1RIUk9XUyBfU1RMUF9ERUNMU1BFQyBfU1RMUF9DQUxMIF9fc3RsX3Rocm93X2ludmFsaWRfYXJndW1lbnQoY29uc3QgY2hhciogX19tc2cpOwordm9pZCBfU1RMUF9GVU5DVElPTl9USFJPV1MgX1NUTFBfREVDTFNQRUMgX1NUTFBfQ0FMTCBfX3N0bF90aHJvd19vdmVyZmxvd19lcnJvcihjb25zdCBjaGFyKiBfX21zZyk7CisKKyNpZiBkZWZpbmVkIChfX0RNQ19fKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhDRVBUSU9OUykKKyMgICBwcmFnbWEgbm9yZXR1cm4oX19zdGxfdGhyb3dfcnVudGltZV9lcnJvcikKKyMgICBwcmFnbWEgbm9yZXR1cm4oX19zdGxfdGhyb3dfcmFuZ2VfZXJyb3IpCisjICAgcHJhZ21hIG5vcmV0dXJuKF9fc3RsX3Rocm93X291dF9vZl9yYW5nZSkKKyMgICBwcmFnbWEgbm9yZXR1cm4oX19zdGxfdGhyb3dfbGVuZ3RoX2Vycm9yKQorIyAgIHByYWdtYSBub3JldHVybihfX3N0bF90aHJvd19pbnZhbGlkX2FyZ3VtZW50KQorIyAgIHByYWdtYSBub3JldHVybihfX3N0bF90aHJvd19vdmVyZmxvd19lcnJvcikKKyNlbmRpZgorX1NUTFBfRU5EX05BTUVTUEFDRQorCisjaWYgIWRlZmluZWQgKF9TVExQX0VYVEVSTl9SQU5HRV9FUlJPUlMpCisjICBpbmNsdWRlIDxzdGwvX3JhbmdlX2Vycm9ycy5jPgorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9SQU5HRV9FUlJPUlNfSCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RsL19yYXdfc3RvcmFnZV9pdGVyLmggYi9zdGxwb3J0L3N0bC9fcmF3X3N0b3JhZ2VfaXRlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzdGwvX3Jhd19zdG9yYWdlX2l0ZXIuaApyZW5hbWUgdG8gc3RscG9ydC9zdGwvX3Jhd19zdG9yYWdlX2l0ZXIuaApkaWZmIC0tZ2l0IGEvc3RsL19yZWxvcHNfY29udC5oIGIvc3RscG9ydC9zdGwvX3JlbG9wc19jb250LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHN0bC9fcmVsb3BzX2NvbnQuaApyZW5hbWUgdG8gc3RscG9ydC9zdGwvX3JlbG9wc19jb250LmgKZGlmZiAtLWdpdCBhL3N0bC9fcmVsb3BzX2hhc2hfY29udC5oIGIvc3RscG9ydC9zdGwvX3JlbG9wc19oYXNoX2NvbnQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3RsL19yZWxvcHNfaGFzaF9jb250LmgKcmVuYW1lIHRvIHN0bHBvcnQvc3RsL19yZWxvcHNfaGFzaF9jb250LmgKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL19yb3BlLmMgYi9zdGxwb3J0L3N0bC9fcm9wZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NmVlMjIKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9fcm9wZS5jCkBAIC0wLDAgKzEsMTQwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisvKiBOT1RFOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBTVEwgaGVhZGVycy4KKyAqICAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuCisgKi8KKworLy8gU2V0IGJ1Zl9zdGFydCwgYnVmX2VuZCwgYW5kIGJ1Zl9wdHIgYXBwcm9wcmlhdGVseSwgZmlsbGluZyB0bXBfYnVmCisvLyBpZiBuZWNlc3NhcnkuICBBc3N1bWVzIHBhdGhfZW5kW2xlYWZfaW5kZXhdIGFuZCBsZWFmX3BvcyBhcmUgY29ycmVjdC4KKy8vIFJlc3VsdHMgaW4gYSB2YWxpZCBidWZfcHRyIGlmIHRoZSBpdGVyYXRvciBjYW4gYmUgbGVnaXRpbWF0ZWx5CisvLyBkZXJlZmVyZW5jZWQuCisjaWZuZGVmIF9TVExQX1JPUEVJTVBMX0gKKyNkZWZpbmUgX1NUTFBfUk9QRUlNUExfSAorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX1JPUEVfSAorIyAgaW5jbHVkZSA8c3RsL19yb3BlLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DU1RESU8KKyMgIGluY2x1ZGUgPHN0bC9fY3N0ZGlvLmg+CisjZW5kaWYKKworI2lmICFkZWZpbmVkIChfU1RMUF9VU0VfTk9fSU9TVFJFQU1TKQorIyAgaWZuZGVmIF9TVExQX0lOVEVSTkFMX09TVFJFQU1fSAorIyAgICBpbmNsdWRlIDxzdGwvX29zdHJlYW0uaD4KKyMgIGVuZGlmCisKKyMgIGlmbmRlZiBfU1RMUF9JTlRFUk5BTF9JU1RSRUFNCisjICAgIGluY2x1ZGUgPHN0bC9faXN0cmVhbS5oPgorIyAgZW5kaWYKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RsL19yYW5nZV9lcnJvcnMuaD4KKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKKyNpZiBkZWZpbmVkICggX1NUTFBfTkVTVEVEX1RZUEVfUEFSQU1fQlVHICkKKyMgIGRlZmluZSBfX2FsbG9jYXRvcl9fIF9BbGxvYworI2Vsc2UKKyMgIGRlZmluZSBfX2FsbG9jYXRvcl9fIGFsbG9jYXRvcl90eXBlCisjZW5kaWYKKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CitfUm9wZV9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz46Ol9Sb3BlX2l0ZXJhdG9yKHJvcGU8X0NoYXJULF9BbGxvYz4qIF9fciwgc2l6ZV90IF9fcG9zKQorICA6IF9Sb3BlX2l0ZXJhdG9yX2Jhc2U8X0NoYXJULF9BbGxvYz4oX19yLT5fTV90cmVlX3B0ci5fTV9kYXRhLCBfX3BvcyksCisgIF9NX3Jvb3Rfcm9wZShfX3IpIHsgX1JvcGVSZXA6Ol9TX3JlZih0aGlzLT5fTV9yb290KTsgfQorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK19Sb3BlX2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPjo6X1JvcGVfaXRlcmF0b3Iocm9wZTxfQ2hhclQsX0FsbG9jPiYgX19yLCBzaXplX3QgX19wb3MpOgorICBfUm9wZV9pdGVyYXRvcl9iYXNlPF9DaGFyVCxfQWxsb2M+KF9fci5fTV90cmVlX3B0ci5fTV9kYXRhLCBfX3BvcyksCisgIF9NX3Jvb3Rfcm9wZSgmX19yKSB7CisjaWYgIWRlZmluZWQgKF9fRE1DX18pCisgIF9Sb3BlUmVwOjpfU19yZWYodGhpcy0+X01fcm9vdCk7IGlmICghKF9fci5lbXB0eSgpKSlfU19zZXRjYWNoZSgqdGhpcyk7CisjZWxzZQorICBfUm9wZV9pdGVyYXRvcl9iYXNlPF9DaGFyVCwgX0FsbG9jPiogX194ID0gdGhpczsKKyAgX1JvcGVSZXA6Ol9TX3JlZih0aGlzLT5fTV9yb290KTsgaWYgKCEoX19yLmVtcHR5KCkpKV9TX3NldGNhY2hlKCpfX3gpOworI2VuZGlmCit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgordm9pZCBfUm9wZV9Sb3BlUmVwPF9DaGFyVCwgX0FsbG9jPjo6X01fZnJlZV9jX3N0cmluZygpIHsKKyAgX0NoYXJUKiBfX2NzdHIgPSBfTV9jX3N0cmluZzsKKyAgaWYgKDAgIT0gX19jc3RyKSB7CisgICAgc2l6ZV90IF9wX3NpemUgPSBfTV9zaXplLl9NX2RhdGEgKyAxOworICAgIF9TVExQX1NURDo6X0Rlc3Ryb3lfUmFuZ2UoX19jc3RyLCBfX2NzdHIgKyBfcF9zaXplKTsKKyAgICBfTV9zaXplLmRlYWxsb2NhdGUoX19jc3RyLCBfcF9zaXplKTsKKyAgfQorfQorCisvLyBTZXQgYnVmX3N0YXJ0LCBidWZfZW5kLCBhbmQgYnVmX3B0ciBhcHByb3ByaWF0ZWx5LCBmaWxsaW5nIHRtcF9idWYKKy8vIGlmIG5lY2Vzc2FyeS4gIEFzc3VtZXMgX01fcGF0aF9lbmRbbGVhZl9pbmRleF0gYW5kIGxlYWZfcG9zIGFyZSBjb3JyZWN0LgorLy8gUmVzdWx0cyBpbiBhIHZhbGlkIGJ1Zl9wdHIgaWYgdGhlIGl0ZXJhdG9yIGNhbiBiZSBsZWdpdGltYXRlbHkKKy8vIGRlcmVmZXJlbmNlZC4KK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK3ZvaWQgX1JvcGVfaXRlcmF0b3JfYmFzZTxfQ2hhclQsX0FsbG9jPjo6X1Nfc2V0YnVmKAorICBfUm9wZV9pdGVyYXRvcl9iYXNlPF9DaGFyVCxfQWxsb2M+JiBfX3gpIHsKKyAgY29uc3QgX1JvcGVSZXAqIF9fbGVhZiA9IF9feC5fTV9wYXRoX2VuZC5fTV9kYXRhW19feC5fTV9sZWFmX2luZGV4XTsKKyAgc2l6ZV90IF9fbGVhZl9wb3MgPSBfX3guX01fbGVhZl9wb3M7CisgIHNpemVfdCBfX3BvcyA9IF9feC5fTV9jdXJyZW50X3BvczsKKworICBzd2l0Y2goX19sZWFmLT5fTV90YWcpIHsKKyAgY2FzZSBfUm9wZVJlcDo6X1NfbGVhZjoKKyAgICB0eXBlZGVmIF9Sb3BlX1JvcGVMZWFmPF9DaGFyVCwgX0FsbG9jPiBfUm9wZUxlYWY7CisgICAgX194Ll9NX2J1Zl9zdGFydCA9IF9fU1RBVElDX0NBU1QoY29uc3QgX1JvcGVMZWFmKiwgX19sZWFmKS0+X01fZGF0YTsKKyAgICBfX3guX01fYnVmX3B0ciA9IF9feC5fTV9idWZfc3RhcnQgKyAoX19wb3MgLSBfX2xlYWZfcG9zKTsKKyAgICBfX3guX01fYnVmX2VuZCA9IF9feC5fTV9idWZfc3RhcnQgKyBfX2xlYWYtPl9NX3NpemUuX01fZGF0YTsKKyAgICBicmVhazsKKyAgY2FzZSBfUm9wZVJlcDo6X1NfZnVuY3Rpb246CisgIGNhc2UgX1JvcGVSZXA6Ol9TX3N1YnN0cmluZ2ZuOgorICAgIHsKKyAgICAgIHNpemVfdCBfX2xlbiA9IF9TX2l0ZXJhdG9yX2J1Zl9sZW47CisgICAgICBzaXplX3QgX19idWZfc3RhcnRfcG9zID0gX19sZWFmX3BvczsKKyAgICAgIHNpemVfdCBfX2xlYWZfZW5kID0gX19sZWFmX3BvcyArIF9fbGVhZi0+X01fc2l6ZS5fTV9kYXRhOworICAgICAgdHlwZWRlZiBfUm9wZV9Sb3BlRnVuY3Rpb248X0NoYXJULCBfQWxsb2M+IF9Sb3BlRnVuY3Rpb247CisgICAgICBjaGFyX3Byb2R1Y2VyPF9DaGFyVD4qIF9fZm4gPSBfX1NUQVRJQ19DQVNUKGNvbnN0IF9Sb3BlRnVuY3Rpb24qLCBfX2xlYWYpLT5fTV9mbjsKKworICAgICAgaWYgKF9fYnVmX3N0YXJ0X3BvcyArIF9fbGVuIDw9IF9fcG9zKSB7CisgICAgICAgIF9fYnVmX3N0YXJ0X3BvcyA9IF9fcG9zIC0gX19sZW4vNDsKKyAgICAgICAgaWYgKF9fYnVmX3N0YXJ0X3BvcyArIF9fbGVuID4gX19sZWFmX2VuZCkgeworICAgICAgICAgIF9fYnVmX3N0YXJ0X3BvcyA9IF9fbGVhZl9lbmQgLSBfX2xlbjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKF9fYnVmX3N0YXJ0X3BvcyArIF9fbGVuID4gX19sZWFmX2VuZCkgeworICAgICAgICBfX2xlbiA9IF9fbGVhZl9lbmQgLSBfX2J1Zl9zdGFydF9wb3M7CisgICAgICB9CisgICAgICAoKl9fZm4pKF9fYnVmX3N0YXJ0X3BvcyAtIF9fbGVhZl9wb3MsIF9fbGVuLCBfX3guX01fdG1wX2J1Zi5fTV9kYXRhKTsKKyAgICAgIF9feC5fTV9idWZfcHRyID0gX194Ll9NX3RtcF9idWYuX01fZGF0YSArIChfX3BvcyAtIF9fYnVmX3N0YXJ0X3Bvcyk7CisgICAgICBfX3guX01fYnVmX3N0YXJ0ID0gX194Ll9NX3RtcF9idWYuX01fZGF0YTsKKyAgICAgIF9feC5fTV9idWZfZW5kID0gX194Ll9NX3RtcF9idWYuX01fZGF0YSArIF9fbGVuOworICAgIH0KKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICAgIF9TVExQX0FTU0VSVCgwKQorICAgICAgOworICB9Cit9CisKKy8vIFNldCBwYXRoIGFuZCBidWZmZXIgaW5zaWRlIGEgcm9wZSBpdGVyYXRvci4gIFdlIGFzc3VtZSB0aGF0CisvLyBwb3MgYW5kIHJvb3QgYXJlIGFscmVhZHkgc2V0LgordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgordm9pZCBfUm9wZV9pdGVyYXRvcl9iYXNlPF9DaGFyVCxfQWxsb2M+OjpfU19zZXRjYWNoZSgKKyAgX1JvcGVfaXRlcmF0b3JfYmFzZTxfQ2hhclQsX0FsbG9jPiYgX194KSB7CisgIGNvbnN0IF9Sb3BlUmVwKiBfX3BhdGhbX1JvcGVSZXA6Ol9TX21heF9yb3BlX2RlcHRoKzFdOworICBjb25zdCBfUm9wZVJlcCogX19jdXJyX3JvcGU7CisgIGludCBfX2N1cnJfZGVwdGggPSAtMTsgIC8qIGluZGV4IGludG8gcGF0aCAgICAqLworICBzaXplX3QgX19jdXJyX3N0YXJ0X3BvcyA9IDA7CisgIHNpemVfdCBfX3BvcyA9IF9feC5fTV9jdXJyZW50X3BvczsKKyAgdW5zaWduZWQgY2hhciBfX2Rpcm5zID0gMDsgLy8gQml0IHZlY3RvciBtYXJraW5nIHJpZ2h0IHR1cm5zIGluIHRoZSBwYXRoCisKKyAgX1NUTFBfQVNTRVJUKF9fcG9zIDw9IF9feC5fTV9yb290LT5fTV9zaXplLl9NX2RhdGEpCisgIGlmIChfX3BvcyA+PSBfX3guX01fcm9vdC0+X01fc2l6ZS5fTV9kYXRhKSB7CisgICAgX194Ll9NX2J1Zl9wdHIgPSAwOworICAgIHJldHVybjsKKyAgfQorICBfX2N1cnJfcm9wZSA9IF9feC5fTV9yb290OworICBpZiAoMCAhPSBfX2N1cnJfcm9wZS0+X01fY19zdHJpbmcpIHsKKyAgICAvKiBUcmVhdCB0aGUgcm9vdCBhcyBhIGxlYWYuICovCisgICAgX194Ll9NX2J1Zl9zdGFydCA9IF9fY3Vycl9yb3BlLT5fTV9jX3N0cmluZzsKKyAgICBfX3guX01fYnVmX2VuZCA9IF9fY3Vycl9yb3BlLT5fTV9jX3N0cmluZyArIF9fY3Vycl9yb3BlLT5fTV9zaXplLl9NX2RhdGE7CisgICAgX194Ll9NX2J1Zl9wdHIgPSBfX2N1cnJfcm9wZS0+X01fY19zdHJpbmcgKyBfX3BvczsKKyAgICBfX3guX01fcGF0aF9lbmQuX01fZGF0YVswXSA9IF9fY3Vycl9yb3BlOworICAgIF9feC5fTV9sZWFmX2luZGV4ID0gMDsKKyAgICBfX3guX01fbGVhZl9wb3MgPSAwOworICAgIHJldHVybjsKKyAgfQorICBmb3IoOzspIHsKKyAgICArK19fY3Vycl9kZXB0aDsKKyAgICBfU1RMUF9BU1NFUlQoX19jdXJyX2RlcHRoIDw9IF9Sb3BlUmVwOjpfU19tYXhfcm9wZV9kZXB0aCkKKyAgICBfX3BhdGhbX19jdXJyX2RlcHRoXSA9IF9fY3Vycl9yb3BlOworICAgIHN3aXRjaChfX2N1cnJfcm9wZS0+X01fdGFnKSB7CisgICAgY2FzZSBfUm9wZVJlcDo6X1NfbGVhZjoKKyAgICBjYXNlIF9Sb3BlUmVwOjpfU19mdW5jdGlvbjoKKyAgICBjYXNlIF9Sb3BlUmVwOjpfU19zdWJzdHJpbmdmbjoKKyAgICAgIF9feC5fTV9sZWFmX3BvcyA9IF9fY3Vycl9zdGFydF9wb3M7CisgICAgICBnb3RvIGRvbmU7CisgICAgY2FzZSBfUm9wZVJlcDo6X1NfY29uY2F0OgorICAgICAgeworICAgICAgICBjb25zdCBfUm9wZUNvbmNhdCogX19jID0gX19TVEFUSUNfQ0FTVChjb25zdCBfUm9wZUNvbmNhdCosIF9fY3Vycl9yb3BlKTsKKyAgICAgICAgX1JvcGVSZXAqIF9fbGVmdCA9IF9fYy0+X01fbGVmdDsKKyAgICAgICAgc2l6ZV90IF9fbGVmdF9sZW4gPSBfX2xlZnQtPl9NX3NpemUuX01fZGF0YTsKKworICAgICAgICBfX2Rpcm5zIDw8PSAxOworICAgICAgICBpZiAoX19wb3MgPj0gX19jdXJyX3N0YXJ0X3BvcyArIF9fbGVmdF9sZW4pIHsKKyAgICAgICAgICBfX2Rpcm5zIHw9IDE7CisgICAgICAgICAgX19jdXJyX3JvcGUgPSBfX2MtPl9NX3JpZ2h0OworICAgICAgICAgIF9fY3Vycl9zdGFydF9wb3MgKz0gX19sZWZ0X2xlbjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBfX2N1cnJfcm9wZSA9IF9fbGVmdDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICB9Citkb25lOgorICAgIC8vIENvcHkgbGFzdCBzZWN0aW9uIG9mIHBhdGggaW50byBfTV9wYXRoX2VuZC4KKyAgeworICAgIGludCBfX2kgPSAtMTsKKyAgICBpbnQgX19qID0gX19jdXJyX2RlcHRoICsgMSAtIF9TX3BhdGhfY2FjaGVfbGVuOworCisgICAgaWYgKF9faiA8IDApIF9faiA9IDA7CisgICAgd2hpbGUgKF9faiA8PSBfX2N1cnJfZGVwdGgpIHsKKyAgICAgIF9feC5fTV9wYXRoX2VuZC5fTV9kYXRhWysrX19pXSA9IF9fcGF0aFtfX2orK107CisgICAgfQorICAgIF9feC5fTV9sZWFmX2luZGV4ID0gX19pOworICB9CisgIF9feC5fTV9wYXRoX2RpcmVjdGlvbnMgPSBfX2Rpcm5zOworICBfU19zZXRidWYoX194KTsKK30KKworLy8gU3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiB0aGUgYWJvdmUuICBBc3N1bWVzIHRoYXQKKy8vIHRoZSBwYXRoIGNhY2hlIGlzIHZhbGlkIGZvciB0aGUgcHJldmlvdXMgcG9zaXRpb24uCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+Cit2b2lkIF9Sb3BlX2l0ZXJhdG9yX2Jhc2U8X0NoYXJULF9BbGxvYz46Ol9TX3NldGNhY2hlX2Zvcl9pbmNyKAorX1JvcGVfaXRlcmF0b3JfYmFzZTxfQ2hhclQsX0FsbG9jPiYgX194KSB7CisgIGludCBfX2N1cnJlbnRfaW5kZXggPSBfX3guX01fbGVhZl9pbmRleDsKKyAgY29uc3QgX1JvcGVSZXAqIF9fY3VycmVudF9ub2RlID0gX194Ll9NX3BhdGhfZW5kLl9NX2RhdGFbX19jdXJyZW50X2luZGV4XTsKKyAgc2l6ZV90IF9fbGVuID0gX19jdXJyZW50X25vZGUtPl9NX3NpemUuX01fZGF0YTsKKyAgc2l6ZV90IF9fbm9kZV9zdGFydF9wb3MgPSBfX3guX01fbGVhZl9wb3M7CisgIHVuc2lnbmVkIGNoYXIgX19kaXJucyA9IF9feC5fTV9wYXRoX2RpcmVjdGlvbnM7CisgIGNvbnN0IF9Sb3BlQ29uY2F0KiBfX2M7CisKKyAgX1NUTFBfQVNTRVJUKF9feC5fTV9jdXJyZW50X3BvcyA8PSBfX3guX01fcm9vdC0+X01fc2l6ZS5fTV9kYXRhKQorICBpZiAoX194Ll9NX2N1cnJlbnRfcG9zIC0gX19ub2RlX3N0YXJ0X3BvcyA8IF9fbGVuKSB7CisgICAgLyogTW9yZSBzdHVmZiBpbiB0aGlzIGxlYWYsIHdlIGp1c3QgZGlkbid0IGNhY2hlIGl0LiAqLworICAgIF9TX3NldGJ1ZihfX3gpOworICAgIHJldHVybjsKKyAgfQorICBfU1RMUF9BU1NFUlQoX19ub2RlX3N0YXJ0X3BvcyArIF9fbGVuID09IF9feC5fTV9jdXJyZW50X3BvcykKKyAgICAvLyAgbm9kZV9zdGFydF9wb3MgaXMgc3RhcnRpbmcgcG9zaXRpb24gb2YgbGFzdF9ub2RlLgorICB3aGlsZSAoLS1fX2N1cnJlbnRfaW5kZXggPj0gMCkgeworICAgIGlmICghKF9fZGlybnMgJiAxKSAvKiBQYXRoIHR1cm5lZCBsZWZ0ICovKQorICAgICAgYnJlYWs7CisgICAgX19jdXJyZW50X25vZGUgPSBfX3guX01fcGF0aF9lbmQuX01fZGF0YVtfX2N1cnJlbnRfaW5kZXhdOworICAgIF9fYyA9IF9fU1RBVElDX0NBU1QoY29uc3QgX1JvcGVDb25jYXQqLCBfX2N1cnJlbnRfbm9kZSk7CisgICAgLy8gT3RoZXJ3aXNlIHdlIHdlcmUgaW4gdGhlIHJpZ2h0IGNoaWxkLiAgVGh1cyB3ZSBzaG91bGQgcG9wCisgICAgLy8gdGhlIGNvbmNhdGVuYXRpb24gbm9kZS4KKyAgICBfX25vZGVfc3RhcnRfcG9zIC09IF9fYy0+X01fbGVmdC0+X01fc2l6ZS5fTV9kYXRhOworICAgIF9fZGlybnMgPj49IDE7CisgIH0KKyAgaWYgKF9fY3VycmVudF9pbmRleCA8IDApIHsKKyAgICAvLyBXZSB1bmRlcmZsb3dlZCB0aGUgY2FjaGUuIFB1bnQuCisgICAgX1Nfc2V0Y2FjaGUoX194KTsKKyAgICByZXR1cm47CisgIH0KKyAgX19jdXJyZW50X25vZGUgPSBfX3guX01fcGF0aF9lbmQuX01fZGF0YVtfX2N1cnJlbnRfaW5kZXhdOworICBfX2MgPSBfX1NUQVRJQ19DQVNUKGNvbnN0IF9Sb3BlQ29uY2F0KiwgX19jdXJyZW50X25vZGUpOworICAvLyBjdXJyZW50X25vZGUgaXMgYSBjb25jYXRlbmF0aW9uIG5vZGUuICBXZSBhcmUgcG9zaXRpb25lZCBvbiB0aGUgZmlyc3QKKyAgLy8gY2hhcmFjdGVyIGluIGl0cyByaWdodCBjaGlsZC4KKyAgLy8gbm9kZV9zdGFydF9wb3MgaXMgc3RhcnRpbmcgcG9zaXRpb24gb2YgY3VycmVudF9ub2RlLgorICBfX25vZGVfc3RhcnRfcG9zICs9IF9fYy0+X01fbGVmdC0+X01fc2l6ZS5fTV9kYXRhOworICBfX2N1cnJlbnRfbm9kZSA9IF9fYy0+X01fcmlnaHQ7CisgIF9feC5fTV9wYXRoX2VuZC5fTV9kYXRhWysrX19jdXJyZW50X2luZGV4XSA9IF9fY3VycmVudF9ub2RlOworICBfX2Rpcm5zIHw9IDE7CisgIHdoaWxlIChfUm9wZVJlcDo6X1NfY29uY2F0ID09IF9fY3VycmVudF9ub2RlLT5fTV90YWcpIHsKKyAgICArK19fY3VycmVudF9pbmRleDsKKyAgICBpZiAoX1NfcGF0aF9jYWNoZV9sZW4gPT0gX19jdXJyZW50X2luZGV4KSB7CisgICAgICBpbnQgX19pOworICAgICAgZm9yIChfX2kgPSAwOyBfX2kgPCBfU19wYXRoX2NhY2hlX2xlbi0xOyArK19faSkgeworICAgICAgICBfX3guX01fcGF0aF9lbmQuX01fZGF0YVtfX2ldID0gX194Ll9NX3BhdGhfZW5kLl9NX2RhdGFbX19pKzFdOworICAgICAgfQorICAgICAgLS1fX2N1cnJlbnRfaW5kZXg7CisgICAgfQorICAgIF9fY3VycmVudF9ub2RlID0gX19TVEFUSUNfQ0FTVChjb25zdCBfUm9wZUNvbmNhdCosIF9fY3VycmVudF9ub2RlKS0+X01fbGVmdDsKKyAgICBfX3guX01fcGF0aF9lbmQuX01fZGF0YVtfX2N1cnJlbnRfaW5kZXhdID0gX19jdXJyZW50X25vZGU7CisgICAgX19kaXJucyA8PD0gMTsKKyAgICAvLyBub2RlX3N0YXJ0X3BvcyBpcyB1bmNoYW5nZWQuCisgIH0KKyAgX194Ll9NX2xlYWZfaW5kZXggPSBfX2N1cnJlbnRfaW5kZXg7CisgIF9feC5fTV9sZWFmX3BvcyA9IF9fbm9kZV9zdGFydF9wb3M7CisgIF9feC5fTV9wYXRoX2RpcmVjdGlvbnMgPSBfX2Rpcm5zOworICBfU19zZXRidWYoX194KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgordm9pZCBfUm9wZV9pdGVyYXRvcl9iYXNlPF9DaGFyVCxfQWxsb2M+OjpfTV9pbmNyKHNpemVfdCBfX24pIHsKKyAgX01fY3VycmVudF9wb3MgKz0gX19uOworICBpZiAoMCAhPSBfTV9idWZfcHRyKSB7CisgICAgc2l6ZV90IF9fY2hhcnNfbGVmdCA9IF9NX2J1Zl9lbmQgLSBfTV9idWZfcHRyOworICAgIGlmIChfX2NoYXJzX2xlZnQgPiBfX24pIHsKKyAgICAgIF9NX2J1Zl9wdHIgKz0gX19uOworICAgIH0gZWxzZSBpZiAoX19jaGFyc19sZWZ0ID09IF9fbikgeworICAgICAgX01fYnVmX3B0ciArPSBfX247CisgICAgICBfU19zZXRjYWNoZV9mb3JfaW5jcigqdGhpcyk7CisgICAgfSBlbHNlIHsKKyAgICAgIF9NX2J1Zl9wdHIgPSAwOworICAgIH0KKyAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+Cit2b2lkIF9Sb3BlX2l0ZXJhdG9yX2Jhc2U8X0NoYXJULF9BbGxvYz46Ol9NX2RlY3Ioc2l6ZV90IF9fbikgeworICBpZiAoMCAhPSBfTV9idWZfcHRyKSB7CisgICAgc2l6ZV90IF9fY2hhcnNfbGVmdCA9IF9NX2J1Zl9wdHIgLSBfTV9idWZfc3RhcnQ7CisgICAgaWYgKF9fY2hhcnNfbGVmdCA+PSBfX24pIHsKKyAgICAgIF9NX2J1Zl9wdHIgLT0gX19uOworICAgIH0gZWxzZSB7CisgICAgICBfTV9idWZfcHRyID0gMDsKKyAgICB9CisgIH0KKyAgX01fY3VycmVudF9wb3MgLT0gX19uOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+Cit2b2lkIF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+OjpfTV9jaGVjaygpIHsKKyAgaWYgKF9NX3Jvb3Rfcm9wZS0+X01fdHJlZV9wdHIuX01fZGF0YSAhPSB0aGlzLT5fTV9yb290KSB7CisgICAgLy8gX1JvcGUgd2FzIG1vZGlmaWVkLiAgR2V0IHRoaW5ncyBmaXhlZCB1cC4KKyAgICBfUm9wZVJlcDo6X1NfdW5yZWYodGhpcy0+X01fcm9vdCk7CisgICAgdGhpcy0+X01fcm9vdCA9IF9NX3Jvb3Rfcm9wZS0+X01fdHJlZV9wdHIuX01fZGF0YTsKKyAgICBfUm9wZVJlcDo6X1NfcmVmKHRoaXMtPl9NX3Jvb3QpOworICAgIHRoaXMtPl9NX2J1Zl9wdHIgPSAwOworICB9Cit9CisKKy8vICBUaGVyZSBhcmUgc2V2ZXJhbCByZWFzb25zIGZvciBub3QgZG9pbmcgdGhpcyB3aXRoIHZpcnR1YWwgZGVzdHJ1Y3RvcnMKKy8vICBhbmQgYSBjbGFzcyBzcGVjaWZpYyBkZWxldGUgb3BlcmF0b3I6CisvLyAgLSBBIGNsYXNzIHNwZWNpZmljIGRlbGV0ZSBvcGVyYXRvciBjYW4ndCBlYXNpbHkgZ2V0IGFjY2VzcyB0bworLy8gICAgYWxsb2NhdG9yIGluc3RhbmNlcyBpZiB3ZSBuZWVkIHRoZW0uCisvLyAgLSBBbnkgdmlydHVhbCBmdW5jdGlvbiB3b3VsZCBuZWVkIGEgNCBvciBieXRlIHZ0YWJsZSBwb2ludGVyOworLy8gICAgdGhpcyBvbmx5IHJlcXVpcmVzIGEgb25lIGJ5dGUgdGFnIHBlciBvYmplY3QuCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+Cit2b2lkIF9Sb3BlX1JvcGVSZXA8X0NoYXJULF9BbGxvYz46Ol9NX2ZyZWVfdHJlZSgpIHsKKyAgc3dpdGNoIChfTV90YWcpIHsKKyAgY2FzZSBfU19sZWFmOgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1JvcGVfUm9wZUxlYWY8X0NoYXJULCBfQWxsb2M+IF9Sb3BlTGVhZjsKKyAgICAgIF9Sb3BlTGVhZiogX19sID0gX19TVEFUSUNfQ0FTVChfUm9wZUxlYWYqLCB0aGlzKTsKKyAgICAgIF9TVExQX1NURDo6X0Rlc3Ryb3koX19sKTsgLy8gLT5fUm9wZV9Sb3BlTGVhZjxfQ2hhclQsX0FsbG9jPjo6fl9Sb3BlX1JvcGVMZWFmKCk7CisgICAgICBfU1RMUF9DUkVBVEVfQUxMT0NBVE9SKGFsbG9jYXRvcl90eXBlLChjb25zdCBhbGxvY2F0b3JfdHlwZSYpX01fc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JvcGVMZWFmKS5kZWFsbG9jYXRlKF9fbCwgMSk7CisgICAgICBicmVhazsKKyAgICB9CisgIGNhc2UgX1NfY29uY2F0OgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1JvcGVfUm9wZUNvbmNhdGVuYXRpb248X0NoYXJULCBfQWxsb2M+IF9Sb3BlQ29uY2F0ZW5hdGlvbjsKKyAgICAgIF9Sb3BlQ29uY2F0ZW5hdGlvbiogX19jICA9IF9fU1RBVElDX0NBU1QoX1JvcGVDb25jYXRlbmF0aW9uKiwgdGhpcyk7CisgICAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95KF9fYyk7CisgICAgICBfU1RMUF9DUkVBVEVfQUxMT0NBVE9SKGFsbG9jYXRvcl90eXBlLChjb25zdCBhbGxvY2F0b3JfdHlwZSYpX01fc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JvcGVDb25jYXRlbmF0aW9uKS5kZWFsbG9jYXRlKF9fYywgMSk7CisgICAgICBicmVhazsKKyAgICB9CisgIGNhc2UgX1NfZnVuY3Rpb246CisgICAgeworICAgICAgdHlwZWRlZiBfUm9wZV9Sb3BlRnVuY3Rpb248X0NoYXJULCBfQWxsb2M+IF9Sb3BlRnVuY3Rpb247CisgICAgICBfUm9wZUZ1bmN0aW9uKiBfX2YgPSBfX1NUQVRJQ19DQVNUKF9Sb3BlRnVuY3Rpb24qLCB0aGlzKTsKKyAgICAgIF9TVExQX1NURDo6X0Rlc3Ryb3koX19mKTsKKyAgICAgIF9TVExQX0NSRUFURV9BTExPQ0FUT1IoYWxsb2NhdG9yX3R5cGUsIChjb25zdCBhbGxvY2F0b3JfdHlwZSYpX01fc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JvcGVGdW5jdGlvbikuZGVhbGxvY2F0ZShfX2YsIDEpOworICAgICAgYnJlYWs7CisgICAgfQorICBjYXNlIF9TX3N1YnN0cmluZ2ZuOgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1JvcGVfUm9wZVN1YnN0cmluZzxfQ2hhclQsIF9BbGxvYz4gX1JvcGVTdWJzdHJpbmc7CisgICAgICBfUm9wZVN1YnN0cmluZyogX19yc3MgPSBfX1NUQVRJQ19DQVNUKF9Sb3BlU3Vic3RyaW5nKiwgdGhpcyk7CisgICAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95KF9fcnNzKTsKKyAgICAgIF9TVExQX0NSRUFURV9BTExPQ0FUT1IoYWxsb2NhdG9yX3R5cGUsIChjb25zdCBhbGxvY2F0b3JfdHlwZSYpX01fc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JvcGVTdWJzdHJpbmcpLmRlYWxsb2NhdGUoX19yc3MsIDEpOworICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKKyMgaWYgZGVmaW5lZCAoIF9TVExQX05FU1RFRF9UWVBFX1BBUkFNX0JVRyApCisjICAgZGVmaW5lIF9fUm9wZUxlYWZfXyBfUm9wZV9Sb3BlTGVhZjxfQ2hhclQsX0FsbG9jPgorIyAgIGRlZmluZSBfX1JvcGVSZXBfXyBfUm9wZV9Sb3BlUmVwPF9DaGFyVCxfQWxsb2M+CisjICAgZGVmaW5lIF9Sb3BlTGVhZiBfUm9wZV9Sb3BlTGVhZjxfQ2hhclQsX0FsbG9jPgorIyAgIGRlZmluZSBfUm9wZVJlcCBfUm9wZV9Sb3BlUmVwPF9DaGFyVCxfQWxsb2M+CisjICAgZGVmaW5lIHNpemVfdHlwZSBzaXplX3QKKyMgZWxzZQorIyAgIGRlZmluZSBfX1JvcGVMZWFmX18gX1NUTFBfVFlQRU5BTUVfT05fUkVUVVJOX1RZUEUgcm9wZTxfQ2hhclQsX0FsbG9jPjo6X1JvcGVMZWFmCisjICAgZGVmaW5lIF9fUm9wZVJlcF9fIF9TVExQX1RZUEVOQU1FX09OX1JFVFVSTl9UWVBFIHJvcGU8X0NoYXJULF9BbGxvYz46Ol9Sb3BlUmVwCisjIGVuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK3ZvaWQgcm9wZTxfQ2hhclQsIF9BbGxvYz46Ol9NX3Rocm93X291dF9vZl9yYW5nZSgpIGNvbnN0IHsKKyAgX19zdGxfdGhyb3dfb3V0X29mX3JhbmdlKCJyb3BlIik7Cit9CisKKy8vIENvbmNhdGVuYXRlIGEgQyBzdHJpbmcgb250byBhIGxlYWYgcm9wZSBieSBjb3B5aW5nIHRoZSByb3BlIGRhdGEuCisvLyBVc2VkIGZvciBzaG9ydCByb3Blcy4KK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK19fUm9wZUxlYWZfXyoKK3JvcGU8X0NoYXJULF9BbGxvYz46Ol9TX2xlYWZfY29uY2F0X2NoYXJfaXRlciAoCisgIF9Sb3BlTGVhZiogX19yLCBjb25zdCBfQ2hhclQqIF9faXRlciwgc2l6ZV90IF9fbGVuKSB7CisgIHNpemVfdCBfX29sZF9sZW4gPSBfX3ItPl9NX3NpemUuX01fZGF0YTsKKyAgX0NoYXJUKiBfX25ld19kYXRhID0gX19yLT5fTV9zaXplLmFsbG9jYXRlKF9TX3JvdW5kZWRfdXBfc2l6ZShfX29sZF9sZW4gKyBfX2xlbikpOworICBfUm9wZUxlYWYqIF9fcmVzdWx0OworCisgIF9TVExQX1BSSVYgX191Y29weV9uKF9fci0+X01fZGF0YSwgX19vbGRfbGVuLCBfX25ld19kYXRhKTsKKyAgX1NUTFBfUFJJViBfX3Vjb3B5X24oX19pdGVyLCBfX2xlbiwgX19uZXdfZGF0YSArIF9fb2xkX2xlbik7CisgIF9TX2NvbnN0cnVjdF9udWxsKF9fbmV3X2RhdGEgKyBfX29sZF9sZW4gKyBfX2xlbik7CisgIF9TVExQX1RSWSB7CisgICAgX19yZXN1bHQgPSBfU19uZXdfUm9wZUxlYWYoX19uZXdfZGF0YSwgX19vbGRfbGVuICsgX19sZW4sIF9fci0+Z2V0X2FsbG9jYXRvcigpKTsKKyAgfQorICBfU1RMUF9VTldJTkQoX1JvcGVSZXA6Ol9TX2ZyZWVfc3RyaW5nKF9fbmV3X2RhdGEsIF9fb2xkX2xlbiArIF9fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fci0+Z2V0X2FsbG9jYXRvcigpKSkKKyAgcmV0dXJuIF9fcmVzdWx0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+Cit2b2lkIF9UZXJtaW5hdGVfUm9wZUxlYWYoX1JvcGVfUm9wZUxlYWY8X0NoYXJULF9BbGxvYz4gKl9fciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgX19zaXplLCBjb25zdCBfX3RydWVfdHlwZSYgLypiYXNpYyBjaGFyIHR5cGUqLykgeworICBfU19jb25zdHJ1Y3RfbnVsbChfX3ItPl9NX2RhdGEgKyBfX3NpemUpOworICBfU1RMUF9BU1NFUlQoX19yLT5fTV9jX3N0cmluZyA9PSBfX3ItPl9NX2RhdGEpCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK3ZvaWQgX1Rlcm1pbmF0ZV9Sb3BlTGVhZihfUm9wZV9Sb3BlTGVhZjxfQ2hhclQsX0FsbG9jPiAqX19yLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCwgY29uc3QgX19mYWxzZV90eXBlJiAvKmJhc2ljIGNoYXIgdHlwZSovKSB7CisgIGlmIChfX3ItPl9NX2Nfc3RyaW5nICE9IF9fci0+X01fZGF0YSAmJiAwICE9IF9fci0+X01fY19zdHJpbmcpIHsKKyAgICBfX3ItPl9NX2ZyZWVfY19zdHJpbmcoKTsKKyAgICBfX3ItPl9NX2Nfc3RyaW5nID0gMDsKKyAgfQorfQorCisvLyBBcyBhYm92ZSwgYnV0IGl0J3MgT0sgdG8gY2xvYmJlciBvcmlnaW5hbCBpZiByZWZjb3VudCBpcyAxCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CitfX1JvcGVMZWFmX18qCityb3BlPF9DaGFyVCxfQWxsb2M+OjpfU19kZXN0cl9sZWFmX2NvbmNhdF9jaGFyX2l0ZXIgKF9Sb3BlTGVhZiogX19yLCBjb25zdCBfQ2hhclQqIF9faXRlciwgc2l6ZV90IF9fbGVuKSB7CisgIC8vX1NUTFBfQVNTRVJUKF9fci0+X01fcmVmX2NvdW50ID49IDEpCisgIGlmICggLyogX19yLT5fTV9yZWZfY291bnQgPiAxICovICBfX3ItPl9NX2luY3IoKSA+IDIgKSB7IC8vIC0gcHRyCisgICAgX19yLT5fTV9kZWNyKCk7IC8vIC0gcHRyCisgICAgcmV0dXJuIF9TX2xlYWZfY29uY2F0X2NoYXJfaXRlcihfX3IsIF9faXRlciwgX19sZW4pOworICB9CisgIF9fci0+X01fZGVjcigpOyAvLyAtIHB0ciwgX19yLT5fTV9yZWZfY291bnQgPT0gMSBvciAwCisgIHNpemVfdCBfX29sZF9sZW4gPSBfX3ItPl9NX3NpemUuX01fZGF0YTsKKyAgaWYgKF9TX3JvdW5kZWRfdXBfc2l6ZShfX29sZF9sZW4pID09IF9TX3JvdW5kZWRfdXBfc2l6ZShfX29sZF9sZW4gKyBfX2xlbikpIHsKKyAgICAvLyBUaGUgc3BhY2UgaGFzIGJlZW4gcGFydGlhbGx5IGluaXRpYWxpemVkIGZvciB0aGUgc3RhbmRhcmQKKyAgICAvLyBjaGFyYWN0ZXIgdHlwZXMuICBCdXQgdGhhdCBkb2Vzbid0IG1hdHRlciBmb3IgdGhvc2UgdHlwZXMuCisgICAgX1NUTFBfUFJJViBfX3Vjb3B5X24oX19pdGVyLCBfX2xlbiwgX19yLT5fTV9kYXRhICsgX19vbGRfbGVuKTsKKyAgICBfVGVybWluYXRlX1JvcGVMZWFmKF9fciwgX19vbGRfbGVuICsgX19sZW4sIF9Jc0Jhc2ljQ2hhclR5cGUoKSk7CisgICAgX19yLT5fTV9zaXplLl9NX2RhdGEgPSBfX29sZF9sZW4gKyBfX2xlbjsKKyAgICAvLyBfU1RMUF9BU1NFUlQoX19yLT5fTV9yZWZfY291bnQgPT0gMSkKKyAgICAvLyBfX3ItPl9NX3JlZl9jb3VudCA9IDI7CisgICAgX19yLT5fTV9pbmNyKCk7IC8vIGkuZS4gIF9fci0+X01fcmVmX2NvdW50ID0gMgorICAgIHJldHVybiBfX3I7CisgIH0gZWxzZSB7CisgICAgX1JvcGVMZWFmKiBfX3Jlc3VsdCA9IF9TX2xlYWZfY29uY2F0X2NoYXJfaXRlcihfX3IsIF9faXRlciwgX19sZW4pOworICAgIC8vX1NUTFBfQVNTRVJUKF9fcmVzdWx0LT5fTV9yZWZfY291bnQgPT0gMSkKKyAgICByZXR1cm4gX19yZXN1bHQ7CisgIH0KK30KKworLy8gQXNzdW1lcyBsZWZ0IGFuZCByaWdodCBhcmUgbm90IDAuCisvLyBEb2VzIG5vdCBpbmNyZW1lbnQgKG5vciBkZWNyZW1lbnQgb24gZXhjZXB0aW9uKSBjaGlsZCByZWZlcmVuY2UgY291bnRzLgorLy8gUmVzdWx0IGhhcyByZWYgY291bnQgMS4KK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK19fUm9wZVJlcF9fKgorcm9wZTxfQ2hhclQsX0FsbG9jPjo6X1NfdHJlZV9jb25jYXQgKF9Sb3BlUmVwKiBfX2xlZnQsIF9Sb3BlUmVwKiBfX3JpZ2h0KSB7CisgIF9Sb3BlQ29uY2F0ZW5hdGlvbiogX19yZXN1bHQgPQorICAgIF9TX25ld19Sb3BlQ29uY2F0ZW5hdGlvbihfX2xlZnQsIF9fcmlnaHQsIF9fbGVmdC0+Z2V0X2FsbG9jYXRvcigpKTsKKyAgc2l6ZV90IF9fZGVwdGggPSBfX3Jlc3VsdC0+X01fZGVwdGg7CisKKyAgX1NUTFBfQVNTRVJUKF9fbGVmdC0+Z2V0X2FsbG9jYXRvcigpID09IF9fcmlnaHQtPmdldF9hbGxvY2F0b3IoKSkKKyAgaWYgKF9fZGVwdGggPiAyMCAmJiAoX19yZXN1bHQtPl9NX3NpemUuX01fZGF0YSA8IDEwMDAgfHwKKyAgICAgIF9fZGVwdGggPiBfUm9wZVJlcDo6X1NfbWF4X3JvcGVfZGVwdGgpKSB7CisgICAgX1JvcGVSZXAqIF9fYmFsYW5jZWQ7CisKKyAgICBfU1RMUF9UUlkgeworICAgICAgX19iYWxhbmNlZCA9IF9TX2JhbGFuY2UoX19yZXN1bHQpOworICAgICAvLyBfU1RMUF9BU1NFUlQoX19yZXN1bHQgPT0gX19iYWxhbmNlZCB8fAorICAgICAvLyAgICAgICAgICAgICAgMSA9PSBfX3Jlc3VsdC0+X01fcmVmX2NvdW50ICYmCisgICAgIC8vICAgICAgICAgICAgICAxID09IF9fYmFsYW5jZWQtPl9NX3JlZl9jb3VudCkKKyAgICAgIF9fcmVzdWx0LT5fTV91bnJlZl9ub25uaWwoKTsKKyAgICB9CisgICAgX1NUTFBfVU5XSU5EKChfU1RMUF9DUkVBVEVfQUxMT0NBVE9SKGFsbG9jYXRvcl90eXBlLChhbGxvY2F0b3JfdHlwZSYpX19sZWZ0LT5fTV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUm9wZUNvbmNhdGVuYXRpb24pLmRlYWxsb2NhdGUoX19yZXN1bHQsMSkpKQorICAgIC8vIEluIGNhc2Ugb2YgZXhjZXB0aW9uLCB3ZSBuZWVkIHRvIGRlYWxsb2NhdGUKKyAgICAvLyBvdGhlcndpc2UgZGFuZ2xpbmcgcmVzdWx0IG5vZGUuICBCdXQgY2FsbGVyCisgICAgLy8gc3RpbGwgb3ducyBpdHMgY2hpbGRyZW4uICBUaHVzIHVucmVmIGlzCisgICAgLy8gaW5hcHByb3ByaWF0ZS4KKyAgICByZXR1cm4gX19iYWxhbmNlZDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gX19yZXN1bHQ7CisgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorX19Sb3BlUmVwX18qCityb3BlPF9DaGFyVCxfQWxsb2M+OjpfU19jb25jYXRfY2hhcl9pdGVyIChfUm9wZVJlcCogX19yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0NoYXJUKl9fcywgc2l6ZV90IF9fc2xlbikgeworICBfUm9wZVJlcCogX19yZXN1bHQ7CisgIGlmICgwID09IF9fc2xlbikgeworICAgIF9TX3JlZihfX3IpOworICAgIHJldHVybiBfX3I7CisgIH0KKyAgaWYgKDAgPT0gX19yKQorICAgIHJldHVybiBfU19Sb3BlTGVhZl9mcm9tX3Vub3duZWRfY2hhcl9wdHIoX19zLCBfX3NsZW4sIF9fci0+Z2V0X2FsbG9jYXRvcigpKTsKKyAgaWYgKF9Sb3BlUmVwOjpfU19sZWFmID09IF9fci0+X01fdGFnICYmCisgICAgICBfX3ItPl9NX3NpemUuX01fZGF0YSArIF9fc2xlbiA8PSBfU19jb3B5X21heCkgeworICAgIF9fcmVzdWx0ID0gX1NfbGVhZl9jb25jYXRfY2hhcl9pdGVyKChfUm9wZUxlYWYqKV9fciwgX19zLCBfX3NsZW4pOworICAgIC8vIF9TVExQX0FTU0VSVCgxID09IF9fcmVzdWx0LT5fTV9yZWZfY291bnQpCisgICAgcmV0dXJuIF9fcmVzdWx0OworICB9CisgIGlmIChfUm9wZVJlcDo6X1NfY29uY2F0ID09IF9fci0+X01fdGFnICYmCisgICAgICBfUm9wZVJlcDo6X1NfbGVhZiA9PSAoKF9Sb3BlQ29uY2F0ZW5hdGlvbiopX19yKS0+X01fcmlnaHQtPl9NX3RhZykgeworICAgIF9Sb3BlTGVhZiogX19yaWdodCA9IChfUm9wZUxlYWYqICkoKChfUm9wZUNvbmNhdGVuYXRpb24qIClfX3IpLT5fTV9yaWdodCk7CisgICAgaWYgKF9fcmlnaHQtPl9NX3NpemUuX01fZGF0YSArIF9fc2xlbiA8PSBfU19jb3B5X21heCkgeworICAgICAgX1JvcGVSZXAqIF9fbGVmdCA9ICgoX1JvcGVDb25jYXRlbmF0aW9uKilfX3IpLT5fTV9sZWZ0OworICAgICAgX1JvcGVSZXAqIF9fbnJpZ2h0ID0gX1NfbGVhZl9jb25jYXRfY2hhcl9pdGVyKChfUm9wZUxlYWYqKV9fcmlnaHQsIF9fcywgX19zbGVuKTsKKyAgICAgIF9fbGVmdC0+X01fcmVmX25vbm5pbCgpOworICAgICAgX1NUTFBfVFJZIHsKKyAgICAgICAgX19yZXN1bHQgPSBfU190cmVlX2NvbmNhdChfX2xlZnQsIF9fbnJpZ2h0KTsKKyAgICAgIH0KKyAgICAgIF9TVExQX1VOV0lORChfU191bnJlZihfX2xlZnQpOyBfU191bnJlZihfX25yaWdodCkpCisgICAgICAvLyBfU1RMUF9BU1NFUlQoMSA9PSBfX3Jlc3VsdC0+X01fcmVmX2NvdW50KQorICAgICAgcmV0dXJuIF9fcmVzdWx0OworICAgIH0KKyAgfQorICBfUm9wZVJlcCogX19ucmlnaHQgPQorICAgIF9TX1JvcGVMZWFmX2Zyb21fdW5vd25lZF9jaGFyX3B0cihfX3MsIF9fc2xlbiwgX19yLT5nZXRfYWxsb2NhdG9yKCkpOworICBfU1RMUF9UUlkgeworICAgIF9fci0+X01fcmVmX25vbm5pbCgpOworICAgIF9fcmVzdWx0ID0gX1NfdHJlZV9jb25jYXQoX19yLCBfX25yaWdodCk7CisgIH0KKyAgX1NUTFBfVU5XSU5EKF9TX3VucmVmKF9fcik7IF9TX3VucmVmKF9fbnJpZ2h0KSkKKyAgLy8gX1NUTFBfQVNTRVJUKDEgPT0gX19yZXN1bHQtPl9NX3JlZl9jb3VudCkKKyAgcmV0dXJuIF9fcmVzdWx0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CitfX1JvcGVSZXBfXyoKK3JvcGU8X0NoYXJULF9BbGxvYz46Ol9TX2Rlc3RyX2NvbmNhdF9jaGFyX2l0ZXIoCisgIF9Sb3BlUmVwKiBfX3IsIGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3QgX19zbGVuKSB7CisgIF9Sb3BlUmVwKiBfX3Jlc3VsdDsKKyAgaWYgKDAgPT0gX19yKQorICAgIHJldHVybiBfU19Sb3BlTGVhZl9mcm9tX3Vub3duZWRfY2hhcl9wdHIoX19zLCBfX3NsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3ItPmdldF9hbGxvY2F0b3IoKSk7CisgIC8vIHNpemVfdCBfX2NvdW50ID0gX19yLT5fTV9yZWZfY291bnQ7CisgIHNpemVfdCBfX29yaWdfc2l6ZSA9IF9fci0+X01fc2l6ZS5fTV9kYXRhOworICAvLyBfU1RMUF9BU1NFUlQoX19jb3VudCA+PSAxKQorICBpZiAoIC8qIF9fY291bnQgPiAxICovIF9fci0+X01faW5jcigpID4gMiApIHsKKyAgICBfX3ItPl9NX2RlY3IoKTsKKyAgICByZXR1cm4gX1NfY29uY2F0X2NoYXJfaXRlcihfX3IsIF9fcywgX19zbGVuKTsKKyAgfQorICBpZiAoMCA9PSBfX3NsZW4pIHsKKyAgICByZXR1cm4gX19yOworICB9CisgIF9fci0+X01fZGVjcigpOworICBpZiAoX19vcmlnX3NpemUgKyBfX3NsZW4gPD0gX1NfY29weV9tYXggJiYgX1JvcGVSZXA6Ol9TX2xlYWYgPT0gX19yLT5fTV90YWcpIHsKKyAgICByZXR1cm4gX1NfZGVzdHJfbGVhZl9jb25jYXRfY2hhcl9pdGVyKChfUm9wZUxlYWYqKV9fciwgX19zLCBfX3NsZW4pOworICB9CisgIGlmIChfUm9wZVJlcDo6X1NfY29uY2F0ID09IF9fci0+X01fdGFnKSB7CisgICAgX1JvcGVMZWFmKiBfX3JpZ2h0ID0gX19TVEFUSUNfQ0FTVChfUm9wZUxlYWYqLCBfX1NUQVRJQ19DQVNUKF9Sb3BlQ29uY2F0ZW5hdGlvbiosIF9fciktPl9NX3JpZ2h0KTsKKyAgICBpZiAoX1JvcGVSZXA6Ol9TX2xlYWYgPT0gX19yaWdodC0+X01fdGFnICYmCisgICAgICAgIF9fcmlnaHQtPl9NX3NpemUuX01fZGF0YSArIF9fc2xlbiA8PSBfU19jb3B5X21heCkgeworICAgICAgX1JvcGVSZXAqIF9fbmV3X3JpZ2h0ID0gX1NfZGVzdHJfbGVhZl9jb25jYXRfY2hhcl9pdGVyKF9fcmlnaHQsIF9fcywgX19zbGVuKTsKKyAgICAgIGlmIChfX3JpZ2h0ID09IF9fbmV3X3JpZ2h0KSB7CisgICAgICAgIC8vIF9TVExQX0FTU0VSVChfX25ld19yaWdodC0+X01fcmVmX2NvdW50ID09IDIpCisgICAgICAgIC8vIF9fbmV3X3JpZ2h0LT5fTV9yZWZfY291bnQgPSAxOworICAgICAgICBfX25ld19yaWdodC0+X01fZGVjcigpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gX1NUTFBfQVNTRVJUKF9fbmV3X3JpZ2h0LT5fTV9yZWZfY291bnQgPj0gMSkKKyAgICAgICAgX19yaWdodC0+X01fdW5yZWZfbm9ubmlsKCk7CisgICAgICB9CisgICAgICAvLyBfU1RMUF9BU1NFUlQoX19yLT5fTV9yZWZfY291bnQgPT0gMSkKKyAgICAgIC8vIF9fci0+X01fcmVmX2NvdW50ID0gMjsgICAgLy8gT25lIG1vcmUgdGhhbiBiZWZvcmUuCisgICAgICBfX3ItPl9NX2luY3IoKTsKKyAgICAgIF9fU1RBVElDX0NBU1QoX1JvcGVDb25jYXRlbmF0aW9uKiwgX19yKS0+X01fcmlnaHQgPSBfX25ld19yaWdodDsKKyAgICAgIC8vIEUuTXVzc2VyIDogbW92ZWQgYmVsb3cKKyAgICAgIC8vICAgIF9fci0+X01fc2l6ZS5fTV9kYXRhID0gX19vcmlnX3NpemUgKyBfX3NsZW47CisgICAgICBpZiAoMCAhPSBfX3ItPl9NX2Nfc3RyaW5nKSB7CisgICAgICAgIF9fci0+X01fZnJlZV9jX3N0cmluZygpOworICAgICAgICBfX3ItPl9NX2Nfc3RyaW5nID0gMDsKKyAgICAgIH0KKyAgICAgIF9fci0+X01fc2l6ZS5fTV9kYXRhID0gX19vcmlnX3NpemUgKyBfX3NsZW47CisgICAgICByZXR1cm4gX19yOworICAgIH0KKyAgfQorICBfUm9wZVJlcCogX19yaWdodCA9CisgICAgX1NfUm9wZUxlYWZfZnJvbV91bm93bmVkX2NoYXJfcHRyKF9fcywgX19zbGVuLCBfX3ItPmdldF9hbGxvY2F0b3IoKSk7CisgIF9fci0+X01fcmVmX25vbm5pbCgpOworICBfU1RMUF9UUlkgeworICAgIF9fcmVzdWx0ID0gX1NfdHJlZV9jb25jYXQoX19yLCBfX3JpZ2h0KTsKKyAgfQorICBfU1RMUF9VTldJTkQoX1NfdW5yZWYoX19yKTsgX1NfdW5yZWYoX19yaWdodCkpCisgICAgLy8gX1NUTFBfQVNTRVJUKDEgPT0gX19yZXN1bHQtPl9NX3JlZl9jb3VudCkKKyAgcmV0dXJuIF9fcmVzdWx0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CitfX1JvcGVSZXBfXyoKK3JvcGU8X0NoYXJULF9BbGxvYz46Ol9TX2NvbmNhdF9yZXAoX1JvcGVSZXAqIF9fbGVmdCwgX1JvcGVSZXAqIF9fcmlnaHQpIHsKKyAgaWYgKDAgPT0gX19sZWZ0KSB7CisgICAgX1NfcmVmKF9fcmlnaHQpOworICAgIHJldHVybiBfX3JpZ2h0OworICB9CisgIGlmICgwID09IF9fcmlnaHQpIHsKKyAgICBfX2xlZnQtPl9NX3JlZl9ub25uaWwoKTsKKyAgICByZXR1cm4gX19sZWZ0OworICB9CisgIGlmIChfUm9wZVJlcDo6X1NfbGVhZiA9PSBfX3JpZ2h0LT5fTV90YWcpIHsKKyAgICBpZiAoX1JvcGVSZXA6Ol9TX2xlYWYgPT0gX19sZWZ0LT5fTV90YWcpIHsKKyAgICAgIGlmIChfX3JpZ2h0LT5fTV9zaXplLl9NX2RhdGEgKyBfX2xlZnQtPl9NX3NpemUuX01fZGF0YSA8PSBfU19jb3B5X21heCkgeworICAgICAgICByZXR1cm4gX1NfbGVhZl9jb25jYXRfY2hhcl9pdGVyKF9fU1RBVElDX0NBU1QoX1JvcGVMZWFmKiwgX19sZWZ0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX1NUQVRJQ19DQVNUKF9Sb3BlTGVhZiosIF9fcmlnaHQpLT5fTV9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcmlnaHQtPl9NX3NpemUuX01fZGF0YSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChfUm9wZVJlcDo6X1NfY29uY2F0ID09IF9fbGVmdC0+X01fdGFnICYmCisgICAgICAgICAgICAgICBfUm9wZVJlcDo6X1NfbGVhZiA9PSBfX1NUQVRJQ19DQVNUKF9Sb3BlQ29uY2F0ZW5hdGlvbiosIF9fbGVmdCktPl9NX3JpZ2h0LT5fTV90YWcpIHsKKyAgICAgIF9Sb3BlTGVhZiogX19sZWZ0cmlnaHQgPQorICAgICAgICBfX1NUQVRJQ19DQVNUKF9Sb3BlTGVhZiosIF9fU1RBVElDX0NBU1QoX1JvcGVDb25jYXRlbmF0aW9uKiwgX19sZWZ0KS0+X01fcmlnaHQpOworICAgICAgaWYgKF9fbGVmdHJpZ2h0LT5fTV9zaXplLl9NX2RhdGEgKyBfX3JpZ2h0LT5fTV9zaXplLl9NX2RhdGEgPD0gX1NfY29weV9tYXgpIHsKKyAgICAgICAgX1JvcGVSZXAqIF9fbGVmdGxlZnQgPSBfX1NUQVRJQ19DQVNUKF9Sb3BlQ29uY2F0ZW5hdGlvbiosIF9fbGVmdCktPl9NX2xlZnQ7CisgICAgICAgIF9Sb3BlUmVwKiBfX3Jlc3QgPSBfU19sZWFmX2NvbmNhdF9jaGFyX2l0ZXIoX19sZWZ0cmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19TVEFUSUNfQ0FTVChfUm9wZUxlYWYqLCBfX3JpZ2h0KS0+X01fZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3JpZ2h0LT5fTV9zaXplLl9NX2RhdGEpOworICAgICAgICBfX2xlZnRsZWZ0LT5fTV9yZWZfbm9ubmlsKCk7CisgICAgICAgIF9TVExQX1RSWSB7CisgICAgICAgICAgcmV0dXJuIF9TX3RyZWVfY29uY2F0KF9fbGVmdGxlZnQsIF9fcmVzdCk7CisgICAgICAgIH0KKyAgICAgICAgX1NUTFBfVU5XSU5EKF9TX3VucmVmKF9fbGVmdGxlZnQpOyBfU191bnJlZihfX3Jlc3QpKQorICAgICAgfQorICAgIH0KKyAgfQorICBfX2xlZnQtPl9NX3JlZl9ub25uaWwoKTsKKyAgX19yaWdodC0+X01fcmVmX25vbm5pbCgpOworICBfU1RMUF9UUlkgeworICAgIHJldHVybiBfU190cmVlX2NvbmNhdChfX2xlZnQsIF9fcmlnaHQpOworICB9CisgIF9TVExQX1VOV0lORChfU191bnJlZihfX2xlZnQpOyBfU191bnJlZihfX3JpZ2h0KSkKKyAgX1NUTFBfUkVUX0FGVEVSX1RIUk9XKDApCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK19fUm9wZVJlcF9fKgorcm9wZTxfQ2hhclQsX0FsbG9jPjo6X1Nfc3Vic3RyaW5nKF9Sb3BlUmVwKiBfX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IF9fc3RhcnQsIHNpemVfdCBfX2VuZHAxKSB7CisgIGlmICgwID09IF9fYmFzZSkgcmV0dXJuIDA7CisgIHNpemVfdCBfX2xlbiA9IF9fYmFzZS0+X01fc2l6ZS5fTV9kYXRhOworICBzaXplX3QgX19hZGpfZW5kcDE7CisgIGNvbnN0IHNpemVfdCBfX2xhenlfdGhyZXNob2xkID0gMTI4OworCisgIGlmIChfX2VuZHAxID49IF9fbGVuKSB7CisgICAgaWYgKDAgPT0gX19zdGFydCkgeworICAgICAgX19iYXNlLT5fTV9yZWZfbm9ubmlsKCk7CisgICAgICByZXR1cm4gX19iYXNlOworICAgIH0gZWxzZSB7CisgICAgICBfX2Fkal9lbmRwMSA9IF9fbGVuOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBfX2Fkal9lbmRwMSA9IF9fZW5kcDE7CisgIH0KKyAgc3dpdGNoKF9fYmFzZS0+X01fdGFnKSB7CisgIGNhc2UgX1JvcGVSZXA6Ol9TX2NvbmNhdDoKKyAgeworICAgIF9Sb3BlQ29uY2F0ZW5hdGlvbiogX19jID0gX19TVEFUSUNfQ0FTVChfUm9wZUNvbmNhdGVuYXRpb24qLCBfX2Jhc2UpOworICAgIF9Sb3BlUmVwKiBfX2xlZnQgPSBfX2MtPl9NX2xlZnQ7CisgICAgX1JvcGVSZXAqIF9fcmlnaHQgPSBfX2MtPl9NX3JpZ2h0OworICAgIHNpemVfdCBfX2xlZnRfbGVuID0gX19sZWZ0LT5fTV9zaXplLl9NX2RhdGE7CisgICAgX1JvcGVSZXAqIF9fcmVzdWx0OworCisgICAgaWYgKF9fYWRqX2VuZHAxIDw9IF9fbGVmdF9sZW4pIHsKKyAgICAgIHJldHVybiBfU19zdWJzdHJpbmcoX19sZWZ0LCBfX3N0YXJ0LCBfX2VuZHAxKTsKKyAgICB9IGVsc2UgaWYgKF9fc3RhcnQgPj0gX19sZWZ0X2xlbikgeworICAgICAgcmV0dXJuIF9TX3N1YnN0cmluZyhfX3JpZ2h0LCBfX3N0YXJ0IC0gX19sZWZ0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19hZGpfZW5kcDEgLSBfX2xlZnRfbGVuKTsKKyAgICB9CisgICAgX1NlbGZfZGVzdHJ1Y3RfcHRyIF9fbGVmdF9yZXN1bHQoX1Nfc3Vic3RyaW5nKF9fbGVmdCwgX19zdGFydCwgX19sZWZ0X2xlbikpOworICAgIF9TZWxmX2Rlc3RydWN0X3B0ciBfX3JpZ2h0X3Jlc3VsdChfU19zdWJzdHJpbmcoX19yaWdodCwgMCwgX19lbmRwMSAtIF9fbGVmdF9sZW4pKTsKKyAgICBfU1RMUF9NUFdGSVhfVFJZICAgIC8vKlRZIDA2LzAxLzIwMDAgLSBtcHcgZm9yZ2V0cyB0byBjYWxsIGR0b3Igb24gX19sZWZ0X3Jlc3VsdCBhbmQgX19yaWdodF9yZXN1bHQgd2l0aG91dCB0aGlzIHRyeSBibG9jaworICAgIF9fcmVzdWx0ID0gX1NfY29uY2F0X3JlcChfX2xlZnRfcmVzdWx0LCBfX3JpZ2h0X3Jlc3VsdCk7CisgICAgLy8gX1NUTFBfQVNTRVJUKDEgPT0gX19yZXN1bHQtPl9NX3JlZl9jb3VudCkKKyAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgX1NUTFBfTVBXRklYX0NBVENIICAgIC8vKlRZIDA2LzAxLzIwMDAgLQorICB9CisgIGNhc2UgX1JvcGVSZXA6Ol9TX2xlYWY6CisgIHsKKyAgICBfUm9wZUxlYWYqIF9fbCA9IF9fU1RBVElDX0NBU1QoX1JvcGVMZWFmKiwgX19iYXNlKTsKKyAgICBfUm9wZUxlYWYqIF9fcmVzdWx0OworICAgIHNpemVfdCBfX3Jlc3VsdF9sZW47CisgICAgaWYgKF9fc3RhcnQgPj0gX19hZGpfZW5kcDEpIHJldHVybiAwOworICAgIF9fcmVzdWx0X2xlbiA9IF9fYWRqX2VuZHAxIC0gX19zdGFydDsKKyAgICBpZiAoX19yZXN1bHRfbGVuID4gX19sYXp5X3RocmVzaG9sZCkgZ290byBsYXp5OworICAgIGNvbnN0IF9DaGFyVCogX19zZWN0aW9uID0gX19sLT5fTV9kYXRhICsgX19zdGFydDsKKyAgICAvLyBXZSBzaG91bGQgc29tZXRpbWVzIGNyZWF0ZSBzdWJzdHJpbmcgbm9kZSBpbnN0ZWFkLgorICAgIF9fcmVzdWx0ID0gX1NfUm9wZUxlYWZfZnJvbV91bm93bmVkX2NoYXJfcHRyKF9fc2VjdGlvbiwgX19yZXN1bHRfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYmFzZS0+Z2V0X2FsbG9jYXRvcigpKTsKKyAgICByZXR1cm4gX19yZXN1bHQ7CisgIH0KKyAgY2FzZSBfUm9wZVJlcDo6X1Nfc3Vic3RyaW5nZm46CisgIC8vIEF2b2lkIGludHJvZHVjaW5nIG11bHRpcGxlIGxheWVycyBvZiBzdWJzdHJpbmcgbm9kZXMuCisgIHsKKyAgICBfUm9wZVN1YnN0cmluZyogX19vbGQgPSBfX1NUQVRJQ19DQVNUKF9Sb3BlU3Vic3RyaW5nKiwgX19iYXNlKTsKKyAgICBzaXplX3QgX19yZXN1bHRfbGVuOworICAgIGlmIChfX3N0YXJ0ID49IF9fYWRqX2VuZHAxKSByZXR1cm4gMDsKKyAgICBfX3Jlc3VsdF9sZW4gPSBfX2Fkal9lbmRwMSAtIF9fc3RhcnQ7CisgICAgaWYgKF9fcmVzdWx0X2xlbiA+IF9fbGF6eV90aHJlc2hvbGQpIHsKKyAgICAgIF9Sb3BlU3Vic3RyaW5nKiBfX3Jlc3VsdCA9IF9TX25ld19Sb3BlU3Vic3RyaW5nKF9fb2xkLT5fTV9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19zdGFydCArIF9fb2xkLT5fTV9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYWRqX2VuZHAxIC0gX19zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYmFzZS0+Z2V0X2FsbG9jYXRvcigpKTsKKyAgICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgICB9IC8vICoqKiBlbHNlIGZhbGwgdGhyb3VnaDogKioqCisgIH0KKyAgY2FzZSBfUm9wZVJlcDo6X1NfZnVuY3Rpb246CisgIHsKKyAgICBfUm9wZUZ1bmN0aW9uKiBfX2YgPSBfX1NUQVRJQ19DQVNUKF9Sb3BlRnVuY3Rpb24qLCBfX2Jhc2UpOworICAgIGlmIChfX3N0YXJ0ID49IF9fYWRqX2VuZHAxKSByZXR1cm4gMDsKKyAgICBzaXplX3QgX19yZXN1bHRfbGVuID0gX19hZGpfZW5kcDEgLSBfX3N0YXJ0OworCisgICAgaWYgKF9fcmVzdWx0X2xlbiA+IF9fbGF6eV90aHJlc2hvbGQpIGdvdG8gbGF6eTsKKyAgICBfQ2hhclQqIF9fc2VjdGlvbiA9IF9fYmFzZS0+X01fc2l6ZS5hbGxvY2F0ZShfU19yb3VuZGVkX3VwX3NpemUoX19yZXN1bHRfbGVuKSk7CisgICAgX1NUTFBfVFJZIHsKKyAgICAgICgqKF9fZi0+X01fZm4pKShfX3N0YXJ0LCBfX3Jlc3VsdF9sZW4sIF9fc2VjdGlvbik7CisgICAgfQorICAgIF9TVExQX1VOV0lORChfUm9wZVJlcDo6X1NfZnJlZV9zdHJpbmcoX19zZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19yZXN1bHRfbGVuLCBfX2Jhc2UtPmdldF9hbGxvY2F0b3IoKSkpCisgICAgX1NfY29uc3RydWN0X251bGwoX19zZWN0aW9uICsgX19yZXN1bHRfbGVuKTsKKyAgICByZXR1cm4gX1NfbmV3X1JvcGVMZWFmKF9fc2VjdGlvbiwgX19yZXN1bHRfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX19iYXNlLT5nZXRfYWxsb2NhdG9yKCkpOworICB9CisgIH0KKyAgLypOT1RSRUFDSEVEKi8KKyAgX1NUTFBfQVNTRVJUKGZhbHNlKQorICBsYXp5OgorICB7CisgICAgLy8gQ3JlYXRlIHN1YnN0cmluZyBub2RlLgorICAgIHJldHVybiBfU19uZXdfUm9wZVN1YnN0cmluZyhfX2Jhc2UsIF9fc3RhcnQsIF9fYWRqX2VuZHAxIC0gX19zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19iYXNlLT5nZXRfYWxsb2NhdG9yKCkpOworICB9Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVD4KK2NsYXNzIF9Sb3BlX2ZsYXR0ZW5fY2hhcl9jb25zdW1lciA6IHB1YmxpYyBfUm9wZV9jaGFyX2NvbnN1bWVyPF9DaGFyVD4geworcHJpdmF0ZToKKyAgX0NoYXJUKiBfTV9idWZfcHRyOworcHVibGljOgorICBfUm9wZV9mbGF0dGVuX2NoYXJfY29uc3VtZXIoX0NoYXJUKiBfX2J1ZmZlcikgeworICAgIF9NX2J1Zl9wdHIgPSBfX2J1ZmZlcjsKKyAgfQorICB+X1JvcGVfZmxhdHRlbl9jaGFyX2NvbnN1bWVyKCkge30KKyAgYm9vbCBvcGVyYXRvcigpIChjb25zdCBfQ2hhclQqIF9fbGVhZiwgc2l6ZV90IF9fbikgeworICAgIF9TVExQX1BSSVYgX191Y29weV9uKF9fbGVhZiwgX19uLCBfTV9idWZfcHRyKTsKKyAgICBfTV9idWZfcHRyICs9IF9fbjsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfTsKKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJUPgorY2xhc3MgX1JvcGVfZmluZF9jaGFyX2NoYXJfY29uc3VtZXIgOiBwdWJsaWMgX1JvcGVfY2hhcl9jb25zdW1lcjxfQ2hhclQ+IHsKK3ByaXZhdGU6CisgIF9DaGFyVCBfTV9wYXR0ZXJuOworcHVibGljOgorICBzaXplX3QgX01fY291bnQ7ICAvLyBOdW1iZXIgb2Ygbm9ubWF0Y2hpbmcgY2hhcmFjdGVycworICBfUm9wZV9maW5kX2NoYXJfY2hhcl9jb25zdW1lcihfQ2hhclQgX19wKQorICAgIDogX01fcGF0dGVybihfX3ApLCBfTV9jb3VudCgwKSB7fQorICB+X1JvcGVfZmluZF9jaGFyX2NoYXJfY29uc3VtZXIoKSB7fQorICBib29sIG9wZXJhdG9yKCkgKGNvbnN0IF9DaGFyVCogX19sZWFmLCBzaXplX3QgX19uKSB7CisgICAgc2l6ZV90IF9faTsKKyAgICBmb3IgKF9faSA9IDA7IF9faSA8IF9fbjsgKytfX2kpIHsKKyAgICAgIGlmIChfX2xlYWZbX19pXSA9PSBfTV9wYXR0ZXJuKSB7CisgICAgICAgIF9NX2NvdW50ICs9IF9faTsgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICBfTV9jb3VudCArPSBfX247IHJldHVybiB0cnVlOworICB9Cit9OworCisjaWYgIWRlZmluZWQgKF9TVExQX1VTRV9OT19JT1NUUkVBTVMpCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CisvLyBIZXJlIF9DaGFyVCBpcyBib3RoIHRoZSBzdHJlYW0gYW5kIHJvcGUgY2hhcmFjdGVyIHR5cGUuCitjbGFzcyBfUm9wZV9pbnNlcnRfY2hhcl9jb25zdW1lciA6IHB1YmxpYyBfUm9wZV9jaGFyX2NvbnN1bWVyPF9DaGFyVD4geworcHJpdmF0ZToKKyAgdHlwZWRlZiBiYXNpY19vc3RyZWFtPF9DaGFyVCxfVHJhaXRzPiBfSW5zZXJ0X29zdHJlYW07CisgIHR5cGVkZWYgX1JvcGVfaW5zZXJ0X2NoYXJfY29uc3VtZXI8X0NoYXJULF9UcmFpdHM+IF9TZWxmOworICBfSW5zZXJ0X29zdHJlYW0mIF9NX287CisKKyAgLy9leHBsaWNpdGVseSBkZWZpbmVkIGFzIHByaXZhdGUgdG8gYXZvaWQgd2FybmluZ3M6CisgIF9TZWxmJiBvcGVyYXRvciA9IChfU2VsZiBjb25zdCYpOworcHVibGljOgorICBfUm9wZV9pbnNlcnRfY2hhcl9jb25zdW1lcihfSW5zZXJ0X29zdHJlYW0mIF9fd3JpdGVyKQorICAgIDogX01fbyhfX3dyaXRlcikge30KKyAgfl9Sb3BlX2luc2VydF9jaGFyX2NvbnN1bWVyKCkge30KKyAgLy8gQ2FsbGVyIGlzIHByZXN1bWVkIHRvIG93biB0aGUgb3N0cmVhbQorICBib29sIG9wZXJhdG9yKCkgKGNvbnN0IF9DaGFyVCogX19sZWFmLCBzaXplX3QgX19uKTsKKyAgLy8gUmV0dXJucyB0cnVlIHRvIGNvbnRpbnVlIHRyYXZlcnNhbC4KK307CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jvb2wgX1JvcGVfaW5zZXJ0X2NoYXJfY29uc3VtZXI8X0NoYXJULCBfVHJhaXRzPjo6b3BlcmF0b3IoKQorICAoY29uc3QgX0NoYXJUKiBfX2xlYWYsIHNpemVfdCBfX24pIHsKKyAgc2l6ZV90IF9faTsKKyAgLy8gIFdlIGFzc3VtZSB0aGF0IGZvcm1hdHRpbmcgaXMgc2V0IHVwIGNvcnJlY3RseSBmb3IgZWFjaCBlbGVtZW50LgorICBmb3IgKF9faSA9IDA7IF9faSA8IF9fbjsgKytfX2kpIF9NX28ucHV0KF9fbGVhZltfX2ldKTsKKyAgcmV0dXJuIHRydWU7Cit9CisjZW5kaWYgLyogIV9TVExQX1VTRV9OT19JT1NUUkVBTVMgKi8KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jLCBjbGFzcyBfQ2hhckNvbnN1bWVyPgorYm9vbCBfU19hcHBseV90b19waWVjZXMoX0NoYXJDb25zdW1lciYgX19jLAorICAgICAgICAgICAgICAgICAgICAgICAgX1JvcGVfUm9wZVJlcDxfQ2hhclQsIF9BbGxvYz4gKiBfX3IsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgX19iZWdpbiwgc2l6ZV90IF9fZW5kKSB7CisgIHR5cGVkZWYgX1JvcGVfUm9wZVJlcDxfQ2hhclQsIF9BbGxvYz4gX1JvcGVSZXA7CisgIHR5cGVkZWYgX1JvcGVfUm9wZUNvbmNhdGVuYXRpb248X0NoYXJULF9BbGxvYz4gX1JvcGVDb25jYXRlbmF0aW9uOworICB0eXBlZGVmIF9Sb3BlX1JvcGVMZWFmPF9DaGFyVCxfQWxsb2M+IF9Sb3BlTGVhZjsKKyAgdHlwZWRlZiBfUm9wZV9Sb3BlRnVuY3Rpb248X0NoYXJULF9BbGxvYz4gX1JvcGVGdW5jdGlvbjsKKworICBpZiAoMCA9PSBfX3IpIHJldHVybiB0cnVlOworICBzd2l0Y2goX19yLT5fTV90YWcpIHsKKyAgY2FzZSBfUm9wZVJlcDo6X1NfY29uY2F0OgorICB7CisgICAgX1JvcGVDb25jYXRlbmF0aW9uKiBfX2NvbmMgPSBfX1NUQVRJQ19DQVNUKF9Sb3BlQ29uY2F0ZW5hdGlvbiosIF9fcik7CisgICAgX1JvcGVSZXAqIF9fbGVmdCA9ICBfX2NvbmMtPl9NX2xlZnQ7CisgICAgc2l6ZV90IF9fbGVmdF9sZW4gPSBfX2xlZnQtPl9NX3NpemUuX01fZGF0YTsKKyAgICBpZiAoX19iZWdpbiA8IF9fbGVmdF9sZW4pIHsKKyAgICAgIHNpemVfdCBfX2xlZnRfZW5kID0gKG1pbikgKF9fbGVmdF9sZW4sIF9fZW5kKTsKKyAgICAgIGlmICghX1NfYXBwbHlfdG9fcGllY2VzKF9fYywgX19sZWZ0LCBfX2JlZ2luLCBfX2xlZnRfZW5kKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoX19lbmQgPiBfX2xlZnRfbGVuKSB7CisgICAgICBfUm9wZVJlcCogX19yaWdodCA9ICBfX2NvbmMtPl9NX3JpZ2h0OworICAgICAgc2l6ZV90IF9fcmlnaHRfc3RhcnQgPSAobWF4KShfX2xlZnRfbGVuLCBfX2JlZ2luKTsKKyAgICAgIGlmICghX1NfYXBwbHlfdG9fcGllY2VzKF9fYywgX19yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcmlnaHRfc3RhcnQgLSBfX2xlZnRfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19lbmQgLSBfX2xlZnRfbGVuKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworICBjYXNlIF9Sb3BlUmVwOjpfU19sZWFmOgorICB7CisgICAgX1JvcGVMZWFmKiBfX2wgPSBfX1NUQVRJQ19DQVNUKF9Sb3BlTGVhZiosIF9fcik7CisgICAgcmV0dXJuIF9fYyhfX2wtPl9NX2RhdGEgKyBfX2JlZ2luLCBfX2VuZCAtIF9fYmVnaW4pOworICB9CisgIGNhc2UgX1JvcGVSZXA6Ol9TX2Z1bmN0aW9uOgorICBjYXNlIF9Sb3BlUmVwOjpfU19zdWJzdHJpbmdmbjoKKyAgeworICAgIF9Sb3BlRnVuY3Rpb24qIF9fZiA9IF9fU1RBVElDX0NBU1QoX1JvcGVGdW5jdGlvbiosIF9fcik7CisgICAgc2l6ZV90IF9fbGVuID0gX19lbmQgLSBfX2JlZ2luOworICAgIGJvb2wgX19yZXN1bHQ7CisgICAgX0NoYXJUKiBfX2J1ZmZlciA9IF9fci0+Z2V0X2FsbG9jYXRvcigpLmFsbG9jYXRlKF9fbGVuKTsKKyAgICBfU1RMUF9UUlkgeworICAgICAgKCooX19mLT5fTV9mbikpKF9fYmVnaW4sIF9fbGVuLCBfX2J1ZmZlcik7CisgICAgICBfX3Jlc3VsdCA9IF9fYyhfX2J1ZmZlciwgX19sZW4pOworICAgICAgX19yLT5nZXRfYWxsb2NhdG9yKCkuZGVhbGxvY2F0ZShfX2J1ZmZlciwgX19sZW4pOworICAgIH0KKyAgICBfU1RMUF9VTldJTkQoKF9fci0+Z2V0X2FsbG9jYXRvcigpLmRlYWxsb2NhdGUoX19idWZmZXIsIF9fbGVuKSkpCisgICAgcmV0dXJuIF9fcmVzdWx0OworICB9CisgIGRlZmF1bHQ6CisgICAgX1NUTFBfQVNTRVJUKGZhbHNlKQorICAgIC8qTk9UUkVBQ0hFRCovCisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX05PX0lPU1RSRUFNUykKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2lubGluZSB2b2lkIF9Sb3BlX2ZpbGwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX28sIHN0cmVhbXNpemUgX19uKSB7CisgIGNoYXIgX19mID0gX19vLmZpbGwoKTsKKyAgZm9yIChzdHJlYW1zaXplIF9faSA9IDA7IF9faSA8IF9fbjsgKytfX2kpIF9fby5wdXQoX19mKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9TX2lvX2dldChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvcGU8X0NoYXJULCBfQWxsb2M+JiBfX3IsIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKl9Jc0Jhc2ljQ2hhclR5cGUqLykgeworICBzdHJlYW1zaXplIF9fdyA9IF9fby53aWR0aCgpOworICBjb25zdCBib29sIF9fbGVmdCA9IChfX28uZmxhZ3MoKSAmIGlvczo6bGVmdCkgIT0gMDsKKyAgc2l6ZV90IF9fcm9wZV9sZW4gPSBfX3Iuc2l6ZSgpOworICBfUm9wZV9pbnNlcnRfY2hhcl9jb25zdW1lcjxfQ2hhclQsIF9UcmFpdHM+IF9fYyhfX28pOworCisgIGNvbnN0IGJvb2wgX19uZWVkX3BhZCA9ICgoKHNpemVvZihzdHJlYW1zaXplKSA+IHNpemVvZihzaXplX3QpKSAmJiAoX19TVEFUSUNfQ0FTVChzdHJlYW1zaXplLCBfX3JvcGVfbGVuKSA8IF9fdykpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHNpemVvZihzdHJlYW1zaXplKSA8PSBzaXplb2Yoc2l6ZV90KSkgJiYgKF9fcm9wZV9sZW4gPCBfX1NUQVRJQ19DQVNUKHNpemVfdCwgX193KSkpKTsKKyAgc3RyZWFtc2l6ZSBfX3BhZF9sZW4gPSBfX25lZWRfcGFkID8gX193IC0gX19yb3BlX2xlbiA6IDA7CisKKyAgaWYgKCFfX2xlZnQgJiYgX19wYWRfbGVuID4gMCkgeworICAgIF9Sb3BlX2ZpbGwoX19vLCBfX3BhZF9sZW4pOworICB9CisgIF9fci5hcHBseV90b19waWVjZXMoMCwgX19yb3BlX2xlbiwgX19jKTsKKyAgaWYgKF9fbGVmdCAmJiBfX3BhZF9sZW4gPiAwKSB7CisgICAgX1JvcGVfZmlsbChfX28sIF9fcGFkX2xlbik7CisgIH0KKyAgcmV0dXJuIF9fbzsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9TX2lvX2dldChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm9wZTxfQ2hhclQsIF9BbGxvYz4mIF9fciwgY29uc3QgX19mYWxzZV90eXBlJiAvKl9Jc0Jhc2ljQ2hhclR5cGUqLykgeworICBzdHJlYW1zaXplIF9fdyA9IF9fby53aWR0aCgpOworICBzaXplX3QgX19yb3BlX2xlbiA9IF9fci5zaXplKCk7CisgIF9Sb3BlX2luc2VydF9jaGFyX2NvbnN1bWVyPF9DaGFyVCwgX1RyYWl0cz4gX19jKF9fbyk7CisKKyAgX19vLndpZHRoKF9fdyAvX19yb3BlX2xlbik7CisgIF9TVExQX1RSWSB7CisgICAgX19yLmFwcGx5X3RvX3BpZWNlcygwLCBfX3JvcGVfbGVuLCBfX2MpOworICAgIF9fby53aWR0aChfX3cpOworICB9CisgIF9TVExQX1VOV0lORChfX28ud2lkdGgoX193KSkKKyAgcmV0dXJuIF9fbzsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIG9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX28sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm9wZTxfQ2hhclQsIF9BbGxvYz4mIF9fcikgeworICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0ludGVncmFsPF9DaGFyVD46Ol9SZXQgX0NoYXJfSXNfSW50ZWdyYWw7CisgIHJldHVybiBfU19pb19nZXQoX19vLCBfX3IsIF9DaGFyX0lzX0ludGVncmFsKCkpOworfQorI2VuZGlmIC8qIE5PX0lPU1RSRUFNUyAqLworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CitfQ2hhclQqIHJvcGU8X0NoYXJULF9BbGxvYz46Ol9TX2ZsYXR0ZW4oX1JvcGVSZXAqIF9fciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgX19zdGFydCwgc2l6ZV90IF9fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DaGFyVCogX19idWZmZXIpIHsKKyAgX1JvcGVfZmxhdHRlbl9jaGFyX2NvbnN1bWVyPF9DaGFyVD4gX19jKF9fYnVmZmVyKTsKKyAgX1NfYXBwbHlfdG9fcGllY2VzKF9fYywgX19yLCBfX3N0YXJ0LCBfX3N0YXJ0ICsgX19sZW4pOworICByZXR1cm4oX19idWZmZXIgKyBfX2xlbik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK3NpemVfdCByb3BlPF9DaGFyVCxfQWxsb2M+OjpmaW5kKF9DaGFyVCBfX3BhdHRlcm4sIHNpemVfdCBfX3N0YXJ0KSBjb25zdCB7CisgIF9Sb3BlX2ZpbmRfY2hhcl9jaGFyX2NvbnN1bWVyPF9DaGFyVD4gX19jKF9fcGF0dGVybik7CisgIF9TX2FwcGx5X3RvX3BpZWNlcyhfX2MsIF9NX3RyZWVfcHRyLl9NX2RhdGEsIF9fc3RhcnQsIHNpemUoKSk7CisgIHNpemVfdHlwZSBfX3Jlc3VsdF9wb3MgPSBfX3N0YXJ0ICsgX19jLl9NX2NvdW50OworI2lmbmRlZiBfU1RMUF9PTERfUk9QRV9TRU1BTlRJQ1MKKyAgaWYgKF9fcmVzdWx0X3BvcyA9PSBzaXplKCkpIF9fcmVzdWx0X3BvcyA9IG5wb3M7CisjZW5kaWYKKyAgcmV0dXJuIF9fcmVzdWx0X3BvczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorX0NoYXJUKgorcm9wZTxfQ2hhclQsX0FsbG9jPjo6X1NfZmxhdHRlbihfUm9wZV9Sb3BlUmVwPF9DaGFyVCwgX0FsbG9jPiogX19yLCBfQ2hhclQqIF9fYnVmZmVyKSB7CisgIGlmICgwID09IF9fcikgcmV0dXJuIF9fYnVmZmVyOworICBzd2l0Y2goX19yLT5fTV90YWcpIHsKKyAgY2FzZSBfUm9wZVJlcDo6X1NfY29uY2F0OgorICB7CisgICAgX1JvcGVDb25jYXRlbmF0aW9uKiBfX2MgPSBfX1NUQVRJQ19DQVNUKF9Sb3BlQ29uY2F0ZW5hdGlvbiosIF9fcik7CisgICAgX1JvcGVSZXAqIF9fbGVmdCA9IF9fYy0+X01fbGVmdDsKKyAgICBfUm9wZVJlcCogX19yaWdodCA9IF9fYy0+X01fcmlnaHQ7CisgICAgX0NoYXJUKiBfX3Jlc3QgPSBfU19mbGF0dGVuKF9fbGVmdCwgX19idWZmZXIpOworICAgIHJldHVybiBfU19mbGF0dGVuKF9fcmlnaHQsIF9fcmVzdCk7CisgIH0KKyAgY2FzZSBfUm9wZVJlcDo6X1NfbGVhZjoKKyAgeworICAgIF9Sb3BlTGVhZiogX19sID0gX19TVEFUSUNfQ0FTVChfUm9wZUxlYWYqLCBfX3IpOworICAgIHJldHVybiBfU1RMUF9QUklWIF9fdWNvcHlfbihfX2wtPl9NX2RhdGEsIF9fbC0+X01fc2l6ZS5fTV9kYXRhLCBfX2J1ZmZlcikuc2Vjb25kOworICB9CisgIGNhc2UgX1JvcGVSZXA6Ol9TX2Z1bmN0aW9uOgorICBjYXNlIF9Sb3BlUmVwOjpfU19zdWJzdHJpbmdmbjoKKyAgLy8gV2UgZG9udCB5ZXQgZG8gYW55dGhpbmcgd2l0aCBzdWJzdHJpbmcgbm9kZXMuCisgIC8vIFRoaXMgbmVlZHMgdG8gYmUgZml4ZWQgYmVmb3JlIHJvcGVmaWxlcyB3aWxsIHdvcmsgd2VsbC4KKyAgeworICAgIF9Sb3BlRnVuY3Rpb24qIF9fZiA9IF9fU1RBVElDX0NBU1QoX1JvcGVGdW5jdGlvbiosIF9fcik7CisgICAgKCooX19mLT5fTV9mbikpKDAsIF9fZi0+X01fc2l6ZS5fTV9kYXRhLCBfX2J1ZmZlcik7CisgICAgcmV0dXJuIF9fYnVmZmVyICsgX19mLT5fTV9zaXplLl9NX2RhdGE7CisgIH0KKyAgZGVmYXVsdDoKKyAgICBfU1RMUF9BU1NFUlQoZmFsc2UpCisgICAgLypOT1RSRUFDSEVEKi8KKyAgICByZXR1cm4gMDsKKyAgfQorfQorCisjaWZkZWYgX1NUTFBfREVCVUcKKy8vIFRoaXMgbmVlZHMgd29yayBmb3IgX0NoYXJUICE9IGNoYXIKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK3ZvaWQgcm9wZTxfQ2hhclQsX0FsbG9jPjo6X1NfZHVtcChfUm9wZVJlcCogX19yLCBpbnQgX19pbmRlbnQpIHsKKyAgZm9yIChpbnQgX19pID0gMDsgX19pIDwgX19pbmRlbnQ7ICsrX19pKSBwdXRjaGFyKCcgJyk7CisgIGlmICgwID09IF9fcikgeworICAgIHByaW50ZigiTlVMTFxuIik7IHJldHVybjsKKyAgfQorICBpZiAoX1JvcGVSZXA6Ol9TX2NvbmNhdCA9PSBfX3ItPl9NX3RhZykgeworICAgIF9Sb3BlQ29uY2F0ZW5hdGlvbiogX19jID0gX19TVEFUSUNfQ0FTVChfUm9wZUNvbmNhdGVuYXRpb24qLCBfX3IpOworICAgIF9Sb3BlUmVwKiBfX2xlZnQgPSBfX2MtPl9NX2xlZnQ7CisgICAgX1JvcGVSZXAqIF9fcmlnaHQgPSBfX2MtPl9NX3JpZ2h0OworICAgIHByaW50ZigiQ29uY2F0ZW5hdGlvbiAlcCAocmMgPSAlbGQsIGRlcHRoID0gJWQsIGxlbiA9ICVsZCwgJXMgYmFsYW5jZWQpXG4iLAorICAgICAgX19yLCBfX3ItPl9NX3JlZl9jb3VudCwgX19yLT5fTV9kZXB0aCwgX19yLT5fTV9zaXplLl9NX2RhdGEsCisgICAgICBfX3ItPl9NX2lzX2JhbGFuY2VkPyAiIiA6ICJub3QiKTsKKyAgICBfU19kdW1wKF9fbGVmdCwgX19pbmRlbnQgKyAyKTsKKyAgICBfU19kdW1wKF9fcmlnaHQsIF9faW5kZW50ICsgMik7CisgICAgcmV0dXJuOworICB9CisgIGVsc2UgeworICAgIGNvbnN0IGNoYXIqIF9fa2luZDsKKworICAgIHN3aXRjaCAoX19yLT5fTV90YWcpIHsKKyAgICAgIGNhc2UgX1JvcGVSZXA6Ol9TX2xlYWY6CisgICAgICAgIF9fa2luZCA9ICJMZWFmIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIF9Sb3BlUmVwOjpfU19mdW5jdGlvbjoKKyAgICAgICAgX19raW5kID0gIkZ1bmN0aW9uIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIF9Sb3BlUmVwOjpfU19zdWJzdHJpbmdmbjoKKyAgICAgICAgX19raW5kID0gIkZ1bmN0aW9uIHJlcHJlc2VudGluZyBzdWJzdHJpbmciOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIF9fa2luZCA9ICIoY29ycnVwdGVkIGtpbmQgZmllbGQhKSI7CisgICAgfQorICAgIHByaW50ZigiJXMgJXAgKHJjID0gJWxkLCBkZXB0aCA9ICVkLCBsZW4gPSAlbGQpICIsCisgICAgIF9fa2luZCwgX19yLCBfX3ItPl9NX3JlZl9jb3VudCwgX19yLT5fTV9kZXB0aCwgX19yLT5fTV9zaXplLl9NX2RhdGEpOworICAgIGlmIChzaXplb2YoX0NoYXJUKSA9PSAxKSB7CisgICAgICBjb25zdCBpbnQgX19tYXhfbGVuID0gNDA7CisgICAgICBfU2VsZl9kZXN0cnVjdF9wdHIgX19wcmVmaXgoX1Nfc3Vic3RyaW5nKF9fciwgMCwgX19tYXhfbGVuKSk7CisgICAgICBfQ2hhclQgX19idWZmZXJbX19tYXhfbGVuICsgMV07CisgICAgICBib29sIF9fdG9vX2JpZyA9IF9fci0+X01fc2l6ZS5fTV9kYXRhID4gX19wcmVmaXgtPl9NX3NpemUuX01fZGF0YTsKKworICAgICAgX1NfZmxhdHRlbihfX3ByZWZpeCwgX19idWZmZXIpOworICAgICAgX19idWZmZXJbX19wcmVmaXgtPl9NX3NpemUuX01fZGF0YV0gPSBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKF9DaGFyVCk7CisgICAgICBwcmludGYoIiVzJXNcbiIsIChjaGFyKilfX2J1ZmZlciwgX190b29fYmlnPyAiLi4uXG4iIDogIlxuIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ZigiXG4iKTsKKyAgICB9CisgIH0KK30KKyNlbmRpZiAvKiBfU1RMUF9ERUJVRyAqLworCisjIGRlZmluZSBfX1JPUEVfVEFCTEVfQk9EWSAgPSB7IFwKKy8qIDAgKi8xLCAvKiAxICovMiwgLyogMiAqLzMsIC8qIDMgKi81LCAvKiA0ICovOCwgLyogNSAqLzEzLCAvKiA2ICovMjEsICAgICAgICAgXAorLyogNyAqLzM0LCAvKiA4ICovNTUsIC8qIDkgKi84OSwgLyogMTAgKi8xNDQsIC8qIDExICovMjMzLCAvKiAxMiAqLzM3NywgICAgICAgICBcCisvKiAxMyAqLzYxMCwgLyogMTQgKi85ODcsIC8qIDE1ICovMTU5NywgLyogMTYgKi8yNTg0LCAvKiAxNyAqLzQxODEsICAgICAgICAgICAgIFwKKy8qIDE4ICovNjc2NXVsLCAvKiAxOSAqLzEwOTQ2dWwsIC8qIDIwICovMTc3MTF1bCwgLyogMjEgKi8yODY1N3VsLCAvKiAyMiAqLzQ2MzY4dWwsICAgXAorLyogMjMgKi83NTAyNXVsLCAvKiAyNCAqLzEyMTM5M3VsLCAvKiAyNSAqLzE5NjQxOHVsLCAvKiAyNiAqLzMxNzgxMXVsLCAgICAgICAgICAgICAgICBcCisvKiAyNyAqLzUxNDIyOXVsLCAvKiAyOCAqLzgzMjA0MHVsLCAvKiAyOSAqLzEzNDYyNjl1bCwgLyogMzAgKi8yMTc4MzA5dWwsICAgICAgICAgICAgIFwKKy8qIDMxICovMzUyNDU3OHVsLCAvKiAzMiAqLzU3MDI4ODd1bCwgLyogMzMgKi85MjI3NDY1dWwsIC8qIDM0ICovMTQ5MzAzNTJ1bCwgICAgICAgICAgXAorLyogMzUgKi8yNDE1NzgxN3VsLCAvKiAzNiAqLzM5MDg4MTY5dWwsIC8qIDM3ICovNjMyNDU5ODZ1bCwgLyogMzggKi8xMDIzMzQxNTV1bCwgICAgICBcCisvKiAzOSAqLzE2NTU4MDE0MXVsLCAvKiA0MCAqLzI2NzkxNDI5NnVsLCAvKiA0MSAqLzQzMzQ5NDQzN3VsLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKy8qIDQyICovNzAxNDA4NzMzdWwsIC8qIDQzICovMTEzNDkwMzE3MHVsLCAvKiA0NCAqLzE4MzYzMTE5MDN1bCwgICAgICAgICAgICAgICAgICAgICAgXAorLyogNDUgKi8yOTcxMjE1MDczdWwgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+Citjb25zdCB1bnNpZ25lZCBsb25nCityb3BlPF9DaGFyVCxfQWxsb2M+OjpfU19taW5fbGVuW19fUk9QRV9ERVBUSF9TSVpFXSBfX1JPUEVfVEFCTEVfQk9EWTsKKyMgdW5kZWYgX19ST1BFX0RFUFRIX1NJWkUKKyMgdW5kZWYgX19ST1BFX01BWF9ERVBUSAorIyB1bmRlZiBfX1JPUEVfVEFCTEVfQk9EWQorCisvLyBUaGVzZSBhcmUgRmlib25hY2NpIG51bWJlcnMgPCAyKiozMi4KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorX19Sb3BlUmVwX18qIHJvcGU8X0NoYXJULF9BbGxvYz46Ol9TX2JhbGFuY2UoX1JvcGVSZXAqIF9fcikgeworICBfUm9wZVJlcCogX19mb3Jlc3RbX1JvcGVSZXA6Ol9TX21heF9yb3BlX2RlcHRoICsgMV0gPSB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwwLDAsMCwwLDB9OworICBfUm9wZVJlcCogX19yZXN1bHQgPSAwOworICBpbnQgX19pOworICAvLyBJbnZhcmlhbnQ6CisgIC8vIFRoZSBjb25jYXRlbmF0aW9uIG9mIGZvcmVzdCBpbiBkZXNjZW5kaW5nIG9yZGVyIGlzIGVxdWFsIHRvIF9fci4KKyAgLy8gX19mb3Jlc3RbX19pXS5fTV9zaXplLl9NX2RhdGEgPj0gX1NfbWluX2xlbltfX2ldCisgIC8vIF9fZm9yZXN0W19faV0uX01fZGVwdGggPSBfX2kKKyAgLy8gUmVmZXJlbmNlcyBmcm9tIGZvcmVzdCBhcmUgaW5jbHVkZWQgaW4gcmVmY291bnQuCisKKyAgX1NUTFBfVFJZIHsKKyAgICBfU19hZGRfdG9fZm9yZXN0KF9fciwgX19mb3Jlc3QpOworICAgIGZvciAoX19pID0gMDsgX19pIDw9IF9Sb3BlUmVwOjpfU19tYXhfcm9wZV9kZXB0aDsgKytfX2kpCisgICAgICBpZiAoMCAhPSBfX2ZvcmVzdFtfX2ldKSB7CisgICAgICAgIF9TZWxmX2Rlc3RydWN0X3B0ciBfX29sZChfX3Jlc3VsdCk7CisgICAgICAgIF9fcmVzdWx0ID0gX1NfY29uY2F0X3JlcChfX2ZvcmVzdFtfX2ldLCBfX3Jlc3VsdCk7CisgICAgICAgIF9fZm9yZXN0W19faV0tPl9NX3VucmVmX25vbm5pbCgpOworIyBpZmRlZiBfU1RMUF9VU0VfRVhDRVBUSU9OUworICAgICAgICBfX2ZvcmVzdFtfX2ldID0gMDsKKyMgZW5kaWYKKyAgICAgIH0KKyAgICB9CisgICAgX1NUTFBfVU5XSU5EKGZvcihfX2kgPSAwOyBfX2kgPD0gX1JvcGVSZXA6Ol9TX21heF9yb3BlX2RlcHRoOyArK19faSkKKyAgICBfU191bnJlZihfX2ZvcmVzdFtfX2ldKSkKKyAgICBpZiAoX19yZXN1bHQtPl9NX2RlcHRoID4gX1JvcGVSZXA6Ol9TX21heF9yb3BlX2RlcHRoKSB7CisgICAgICBfX3N0bF90aHJvd19yYW5nZV9lcnJvcigicm9wZSB0b28gbG9uZyIpOworICAgIH0KKyAgICByZXR1cm4oX19yZXN1bHQpOworfQorCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK3ZvaWQKK3JvcGU8X0NoYXJULF9BbGxvYz46Ol9TX2FkZF90b19mb3Jlc3QoX1JvcGVSZXAqIF9fciwgX1JvcGVSZXAqKiBfX2ZvcmVzdCkKK3sKKyAgICBpZiAoX19yIC0+IF9NX2lzX2JhbGFuY2VkKSB7CisgICAgICBfU19hZGRfbGVhZl90b19mb3Jlc3QoX19yLCBfX2ZvcmVzdCk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIF9TVExQX0FTU0VSVChfX3ItPl9NX3RhZyA9PSBfUm9wZVJlcDo6X1NfY29uY2F0KQorICAgIHsKKyAgICAgIF9Sb3BlQ29uY2F0ZW5hdGlvbiogX19jID0gKF9Sb3BlQ29uY2F0ZW5hdGlvbiopX19yOworCisgICAgICBfU19hZGRfdG9fZm9yZXN0KF9fYy0+X01fbGVmdCwgX19mb3Jlc3QpOworICAgICAgX1NfYWRkX3RvX2ZvcmVzdChfX2MtPl9NX3JpZ2h0LCBfX2ZvcmVzdCk7CisgICAgfQorfQorCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK3ZvaWQKK3JvcGU8X0NoYXJULF9BbGxvYz46Ol9TX2FkZF9sZWFmX3RvX2ZvcmVzdChfUm9wZVJlcCogX19yLCBfUm9wZVJlcCoqIF9fZm9yZXN0KQoreworICAgIF9Sb3BlUmVwKiBfX2luc2VydGVlOyAgICAgICAvLyBpbmNsdWRlZCBpbiByZWZjb3VudAorICAgIF9Sb3BlUmVwKiBfX3Rvb190aW55ID0gMDsgICAgICAvLyBpbmNsdWRlZCBpbiByZWZjb3VudAorICAgIGludCBfX2k7ICAgICAgICAgIC8vIGZvcmVzdFswLi5fX2ktMV0gaXMgZW1wdHkKKyAgICBzaXplX3QgX19zID0gX19yLT5fTV9zaXplLl9NX2RhdGE7CisKKyAgICBmb3IgKF9faSA9IDA7IF9fcyA+PSBfU19taW5fbGVuW19faSsxXS8qIG5vdCB0aGlzIGJ1Y2tldCAqLzsgKytfX2kpIHsKKyAgaWYgKDAgIT0gX19mb3Jlc3RbX19pXSkgeworICAgICAgICBfU2VsZl9kZXN0cnVjdF9wdHIgX19vbGQoX190b29fdGlueSk7CisgICAgICBfX3Rvb190aW55ID0gX1NfY29uY2F0X2FuZF9zZXRfYmFsYW5jZWQoX19mb3Jlc3RbX19pXSwgX190b29fdGlueSk7CisgICAgICBfX2ZvcmVzdFtfX2ldLT5fTV91bnJlZl9ub25uaWwoKTsKKyAgICAgIF9fZm9yZXN0W19faV0gPSAwOworICB9CisgICAgfQorICAgIHsKKyAgICBfU2VsZl9kZXN0cnVjdF9wdHIgX19vbGQoX190b29fdGlueSk7CisgIF9faW5zZXJ0ZWUgPSBfU19jb25jYXRfYW5kX3NldF9iYWxhbmNlZChfX3Rvb190aW55LCBfX3IpOworICAgIH0KKyAgICAvLyBUb29fdGlueSBkZWFkLCBhbmQgbm8gbG9uZ2VyIGluY2x1ZGVkIGluIHJlZmNvdW50LgorICAgIC8vIEluc2VydGVlIGlzIGxpdmUgYW5kIGluY2x1ZGVkLgorICAgIF9TVExQX0FTU0VSVChfU19pc19hbG1vc3RfYmFsYW5jZWQoX19pbnNlcnRlZSkpCisgICAgX1NUTFBfQVNTRVJUKF9faW5zZXJ0ZWUtPl9NX2RlcHRoIDw9IF9fci0+X01fZGVwdGggKyAxKQorICAgIGZvciAoOzsgKytfX2kpIHsKKyAgICAgIGlmICgwICE9IF9fZm9yZXN0W19faV0pIHsKKyAgICAgICAgX1NlbGZfZGVzdHJ1Y3RfcHRyIF9fb2xkKF9faW5zZXJ0ZWUpOworICAgICAgX19pbnNlcnRlZSA9IF9TX2NvbmNhdF9hbmRfc2V0X2JhbGFuY2VkKF9fZm9yZXN0W19faV0sIF9faW5zZXJ0ZWUpOworICAgICAgX19mb3Jlc3RbX19pXS0+X01fdW5yZWZfbm9ubmlsKCk7CisgICAgICBfX2ZvcmVzdFtfX2ldID0gMDsKKyAgICAgIF9TVExQX0FTU0VSVChfU19pc19hbG1vc3RfYmFsYW5jZWQoX19pbnNlcnRlZSkpCisgIH0KKyAgX1NUTFBfQVNTRVJUKF9TX21pbl9sZW5bX19pXSA8PSBfX2luc2VydGVlLT5fTV9zaXplLl9NX2RhdGEpCisgIF9TVExQX0FTU0VSVChfX2ZvcmVzdFtfX2ldID09IDApCisgIGlmIChfX2kgPT0gX1JvcGVSZXA6Ol9TX21heF9yb3BlX2RlcHRoIHx8CisgICAgICAgIF9faW5zZXJ0ZWUtPl9NX3NpemUuX01fZGF0YSA8IF9TX21pbl9sZW5bX19pKzFdKSB7CisgICAgICBfX2ZvcmVzdFtfX2ldID0gX19pbnNlcnRlZTsKKyAgICAgIC8vIHJlZmNvdW50IGlzIE9LIHNpbmNlIF9faW5zZXJ0ZWUgaXMgbm93IGRlYWQuCisgICAgICByZXR1cm47CisgIH0KKyAgICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK19DaGFyVAorcm9wZTxfQ2hhclQsX0FsbG9jPjo6X1NfZmV0Y2goX1JvcGVSZXAqIF9fciwgc2l6ZV90eXBlIF9faSkKK3sKKyAgICBfQ2hhclQqIF9fY3N0ciA9IF9fci0+X01fY19zdHJpbmc7CisKKyAgICBfU1RMUF9BU1NFUlQoX19pIDwgX19yLT5fTV9zaXplLl9NX2RhdGEpCisgICAgaWYgKDAgIT0gX19jc3RyKSByZXR1cm4gX19jc3RyW19faV07CisgICAgZm9yKDs7KSB7CisgICAgICBzd2l0Y2goX19yLT5fTV90YWcpIHsKKyAgY2FzZSBfUm9wZVJlcDo6X1NfY29uY2F0OgorICAgICAgeworICAgIF9Sb3BlQ29uY2F0ZW5hdGlvbiogX19jID0gKF9Sb3BlQ29uY2F0ZW5hdGlvbiopX19yOworICAgIF9Sb3BlUmVwKiBfX2xlZnQgPSBfX2MtPl9NX2xlZnQ7CisgICAgc2l6ZV90IF9fbGVmdF9sZW4gPSBfX2xlZnQtPl9NX3NpemUuX01fZGF0YTsKKworICAgIGlmIChfX2kgPj0gX19sZWZ0X2xlbikgeworICAgICAgICBfX2kgLT0gX19sZWZ0X2xlbjsKKyAgICAgICAgX19yID0gX19jLT5fTV9yaWdodDsKKyAgICB9IGVsc2UgeworICAgICAgICBfX3IgPSBfX2xlZnQ7CisgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgIGNhc2UgX1JvcGVSZXA6Ol9TX2xlYWY6CisgICAgICB7CisgICAgX1JvcGVMZWFmKiBfX2wgPSAoX1JvcGVMZWFmKilfX3I7CisgICAgcmV0dXJuIF9fbC0+X01fZGF0YVtfX2ldOworICAgICAgfQorICBjYXNlIF9Sb3BlUmVwOjpfU19mdW5jdGlvbjoKKyAgY2FzZSBfUm9wZVJlcDo6X1Nfc3Vic3RyaW5nZm46CisgICAgICB7CisgICAgX1JvcGVGdW5jdGlvbiogX19mID0gKF9Sb3BlRnVuY3Rpb24qKV9fcjsKKyAgICBfQ2hhclQgX19yZXN1bHQ7CisKKyAgICAoKihfX2YtPl9NX2ZuKSkoX19pLCAxLCAmX19yZXN1bHQpOworICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgICAgIH0KKyAgICAgIH0KKyAgICB9CisjaWYgZGVmaW5lZChfU1RMUF9ORUVEX1VOUkVBQ0hBQkxFX1JFVFVSTikKKyAgICByZXR1cm4gMDsKKyNlbmRpZgorfQorCisvLyBSZXR1cm4gYSB1bmlxdWVseSByZWZlcmVuY2VkIGNoYXJhY3RlciBzbG90IGZvciB0aGUgZ2l2ZW4KKy8vIHBvc2l0aW9uLCBvciAwIGlmIHRoYXQncyBub3QgcG9zc2libGUuCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CitfQ2hhclQqCityb3BlPF9DaGFyVCxfQWxsb2M+OjpfU19mZXRjaF9wdHIoX1JvcGVSZXAqIF9fciwgc2l6ZV90eXBlIF9faSkKK3sKKyAgICBfUm9wZVJlcCogX19jbHJzdGFja1tfUm9wZVJlcDo6X1NfbWF4X3JvcGVfZGVwdGhdOworICAgIHNpemVfdCBfX2NzcHRyID0gMDsKKworICAgIGZvcig7OykgeworICAgICAgLy8gaWYgKF9fci0+X01fcmVmX2NvdW50ID4gMSkgcmV0dXJuIDA7CisgICAgICBpZiAoIF9fci0+X01faW5jcigpID4gMiApIHsKKyAgICAgICAgX19yLT5fTV9kZWNyKCk7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgc3dpdGNoKF9fci0+X01fdGFnKSB7CisgIGNhc2UgX1JvcGVSZXA6Ol9TX2NvbmNhdDoKKyAgICAgIHsKKyAgICBfUm9wZUNvbmNhdGVuYXRpb24qIF9fYyA9IChfUm9wZUNvbmNhdGVuYXRpb24qKV9fcjsKKyAgICBfUm9wZVJlcCogX19sZWZ0ID0gX19jLT5fTV9sZWZ0OworICAgIHNpemVfdCBfX2xlZnRfbGVuID0gX19sZWZ0LT5fTV9zaXplLl9NX2RhdGE7CisKKyAgICBpZiAoX19jLT5fTV9jX3N0cmluZyAhPSAwKSBfX2NscnN0YWNrW19fY3NwdHIrK10gPSBfX2M7CisgICAgaWYgKF9faSA+PSBfX2xlZnRfbGVuKSB7CisgICAgICAgIF9faSAtPSBfX2xlZnRfbGVuOworICAgICAgICBfX3IgPSBfX2MtPl9NX3JpZ2h0OworICAgIH0gZWxzZSB7CisgICAgICAgIF9fciA9IF9fbGVmdDsKKyAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgY2FzZSBfUm9wZVJlcDo6X1NfbGVhZjoKKyAgICAgIHsKKyAgICBfUm9wZUxlYWYqIF9fbCA9IChfUm9wZUxlYWYqKV9fcjsKKyAgICBpZiAoX19sLT5fTV9jX3N0cmluZyAhPSBfX2wtPl9NX2RhdGEgJiYgX19sLT5fTV9jX3N0cmluZyAhPSAwKQorICAgICAgICBfX2NscnN0YWNrW19fY3NwdHIrK10gPSBfX2w7CisgICAgd2hpbGUgKF9fY3NwdHIgPiAwKSB7CisgICAgICAgIC0tIF9fY3NwdHI7CisgICAgICAgIF9Sb3BlUmVwKiBfX2QgPSBfX2NscnN0YWNrW19fY3NwdHJdOworICAgICAgICBfX2QtPl9NX2ZyZWVfY19zdHJpbmcoKTsKKyAgICAgICAgX19kLT5fTV9jX3N0cmluZyA9IDA7CisgICAgfQorICAgIHJldHVybiBfX2wtPl9NX2RhdGEgKyBfX2k7CisgICAgICB9CisgIGNhc2UgX1JvcGVSZXA6Ol9TX2Z1bmN0aW9uOgorICBjYXNlIF9Sb3BlUmVwOjpfU19zdWJzdHJpbmdmbjoKKyAgICAgIHJldHVybiAwOworICAgICAgfQorICAgIH0KKyNpZiBkZWZpbmVkKF9TVExQX05FRURfVU5SRUFDSEFCTEVfUkVUVVJOKQorICAgIHJldHVybiAwOworI2VuZGlmCisKK30KKworLy8gVGhlIGZvbGxvd2luZyBjb3VsZCBiZSBpbXBsZW1lbnRlZCB0cml2aWFsbHkgdXNpbmcKKy8vIGxleGljb2dyYXBoaWNhbF9jb21wYXJlXzN3YXkuCisvLyBXZSBkbyBhIGxpdHRsZSBtb3JlIHdvcmsgdG8gYXZvaWQgZGVhbGluZyB3aXRoIHJvcGUgaXRlcmF0b3JzIGZvcgorLy8gZmxhdCBzdHJpbmdzLgordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgoraW50Cityb3BlPF9DaGFyVCxfQWxsb2M+OjpfU19jb21wYXJlIChjb25zdCBfUm9wZVJlcCogX19sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1JvcGVSZXAqIF9fcmlnaHQpIHsKKyAgc2l6ZV90IF9fbGVmdF9sZW47CisgIHNpemVfdCBfX3JpZ2h0X2xlbjsKKworICBpZiAoMCA9PSBfX3JpZ2h0KSByZXR1cm4gMCAhPSBfX2xlZnQ7CisgIGlmICgwID09IF9fbGVmdCkgcmV0dXJuIC0xOworICBfX2xlZnRfbGVuID0gX19sZWZ0LT5fTV9zaXplLl9NX2RhdGE7CisgIF9fcmlnaHRfbGVuID0gX19yaWdodC0+X01fc2l6ZS5fTV9kYXRhOworICBpZiAoX1JvcGVSZXA6Ol9TX2xlYWYgPT0gX19sZWZ0LT5fTV90YWcpIHsKKyAgICBjb25zdCBfUm9wZUxlYWYqIF9fbCA9IF9fU1RBVElDX0NBU1QoY29uc3QgX1JvcGVMZWFmKiwgX19sZWZ0KTsKKyAgICBpZiAoX1JvcGVSZXA6Ol9TX2xlYWYgPT0gX19yaWdodC0+X01fdGFnKSB7CisgICAgICBjb25zdCBfUm9wZUxlYWYqIF9fciA9IF9fU1RBVElDX0NBU1QoY29uc3QgX1JvcGVMZWFmKiwgX19yaWdodCk7CisgICAgICByZXR1cm4gX1NUTFBfUFJJViBfX2xleGljb2dyYXBoaWNhbF9jb21wYXJlXzN3YXkoX19sLT5fTV9kYXRhLCBfX2wtPl9NX2RhdGEgKyBfX2xlZnRfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fci0+X01fZGF0YSwgX19yLT5fTV9kYXRhICsgX19yaWdodF9sZW4pOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fcnN0YXJ0KF9fcmlnaHQsIDApOworICAgICAgY29uc3RfaXRlcmF0b3IgX19yZW5kKF9fcmlnaHQsIF9fcmlnaHRfbGVuKTsKKyAgICAgIHJldHVybiBfU1RMUF9QUklWIF9fbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmVfM3dheShfX2wtPl9NX2RhdGEsIF9fbC0+X01fZGF0YSArIF9fbGVmdF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19yc3RhcnQsIF9fcmVuZCk7CisgICAgfQorICB9CisgIGVsc2UgeworICAgIGNvbnN0X2l0ZXJhdG9yIF9fbHN0YXJ0KF9fbGVmdCwgMCk7CisgICAgY29uc3RfaXRlcmF0b3IgX19sZW5kKF9fbGVmdCwgX19sZWZ0X2xlbik7CisgICAgaWYgKF9Sb3BlUmVwOjpfU19sZWFmID09IF9fcmlnaHQtPl9NX3RhZykgeworICAgICAgY29uc3QgX1JvcGVMZWFmKiBfX3IgPSBfX1NUQVRJQ19DQVNUKGNvbnN0IF9Sb3BlTGVhZiosIF9fcmlnaHQpOworICAgICAgcmV0dXJuIF9TVExQX1BSSVYgX19sZXhpY29ncmFwaGljYWxfY29tcGFyZV8zd2F5KF9fbHN0YXJ0LCBfX2xlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19yLT5fTV9kYXRhLCBfX3ItPl9NX2RhdGEgKyBfX3JpZ2h0X2xlbik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgY29uc3RfaXRlcmF0b3IgX19yc3RhcnQoX19yaWdodCwgMCk7CisgICAgICBjb25zdF9pdGVyYXRvciBfX3JlbmQoX19yaWdodCwgX19yaWdodF9sZW4pOworICAgICAgcmV0dXJuIF9TVExQX1BSSVYgX19sZXhpY29ncmFwaGljYWxfY29tcGFyZV8zd2F5KF9fbHN0YXJ0LCBfX2xlbmQsIF9fcnN0YXJ0LCBfX3JlbmQpOworICAgIH0KKyAgfQorfQorCisvLyBBc3NpZ25tZW50IHRvIHJlZmVyZW5jZSBwcm94aWVzLgordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorX1JvcGVfY2hhcl9yZWZfcHJveHk8X0NoYXJULCBfQWxsb2M+JgorX1JvcGVfY2hhcl9yZWZfcHJveHk8X0NoYXJULCBfQWxsb2M+OjpvcGVyYXRvcj0gKF9DaGFyVCBfX2MpIHsKKyAgICBfUm9wZVJlcCogX19vbGQgPSBfTV9yb290LT5fTV90cmVlX3B0ci5fTV9kYXRhOworICAvLyBGaXJzdCBjaGVjayBmb3IgdGhlIGNhc2UgaW4gd2hpY2ggZXZlcnl0aGluZyBpcyB1bmlxdWVseQorICAvLyByZWZlcmVuY2VkLiAgSW4gdGhhdCBjYXNlIHdlIGNhbiBkbyB0aGlzIGRlc3RydWN0aXZlbHkuCisgIF9DaGFyVCogX19wdHIgPSBfTXlfcm9wZTo6X1NfZmV0Y2hfcHRyKF9fb2xkLCBfTV9wb3MpOworICBpZiAoMCAhPSBfX3B0cikgeworICAgICAgKl9fcHRyID0gX19jOworICAgICAgcmV0dXJuICp0aGlzOworICB9CisgICAgX1NlbGZfZGVzdHJ1Y3RfcHRyIF9fbGVmdCgKKyAgICAgIF9NeV9yb3BlOjpfU19zdWJzdHJpbmcoX19vbGQsIDAsIF9NX3BvcykpOworICAgIF9TZWxmX2Rlc3RydWN0X3B0ciBfX3JpZ2h0KAorICAgICAgX015X3JvcGU6Ol9TX3N1YnN0cmluZyhfX29sZCwgX01fcG9zKzEsIF9fb2xkLT5fTV9zaXplLl9NX2RhdGEpKTsKKyAgICBfU2VsZl9kZXN0cnVjdF9wdHIgX19yZXN1bHRfbGVmdCgKKyAgICAgIF9NeV9yb3BlOjpfU19kZXN0cl9jb25jYXRfY2hhcl9pdGVyKF9fbGVmdCwgJl9fYywgMSkpOworCisgICAgLy8gX1NUTFBfQVNTRVJUKF9fbGVmdCA9PSBfX3Jlc3VsdF9sZWZ0IHx8IDEgPT0gX19yZXN1bHRfbGVmdC0+X01fcmVmX2NvdW50KQorICAgIF9Sb3BlUmVwKiBfX3Jlc3VsdCA9CisgICAgICBfTXlfcm9wZTo6X1NfY29uY2F0X3JlcChfX3Jlc3VsdF9sZWZ0LCBfX3JpZ2h0KTsKKyAgICAvLyBfU1RMUF9BU1NFUlQoMSA8PSBfX3Jlc3VsdC0+X01fcmVmX2NvdW50KQorICAgIF9Sb3BlUmVwOjpfU191bnJlZihfX29sZCk7CisgICAgX01fcm9vdC0+X01fdHJlZV9wdHIuX01fZGF0YSA9IF9fcmVzdWx0OworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorX1JvcGVfY2hhcl9wdHJfcHJveHk8X0NoYXJULCBfQWxsb2M+CitfUm9wZV9jaGFyX3JlZl9wcm94eTxfQ2hhclQsIF9BbGxvYz46Om9wZXJhdG9yJiAoKSBjb25zdCB7CisgICAgcmV0dXJuIF9Sb3BlX2NoYXJfcHRyX3Byb3h5PF9DaGFyVCwgX0FsbG9jPigqdGhpcyk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorX0NoYXJUIHJvcGU8X0NoYXJULF9BbGxvYz46Ol9TX2VtcHR5X2Nfc3RyWzFdID0geyBfQ2hhclQoKSB9OworLy8gIyBlbmRpZgorCisjaWYgIWRlZmluZWQgKF9TVExQX1NUQVRJQ19DT05TVF9JTklUX0JVRykgJiYgIWRlZmluZWQgKF9TVExQX05PX1NUQVRJQ19DT05TVF9ERUZJTklUSU9OKQordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorY29uc3Qgc2l6ZV90IHJvcGU8X0NoYXJULCBfQWxsb2M+OjpucG9zOworI2VuZGlmCisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorY29uc3QgX0NoYXJUKiByb3BlPF9DaGFyVCxfQWxsb2M+OjpjX3N0cigpIGNvbnN0IHsKKyAgaWYgKDAgPT0gX01fdHJlZV9wdHIuX01fZGF0YSkgeworICAgIC8vIFBvc3NpYmx5IHJlZHVuZGFudCwgYnV0IHByb2JhYmx5IGZhc3QuCisgICAgX1NfZW1wdHlfY19zdHJbMF0gPSBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKF9DaGFyVCk7CisgICAgcmV0dXJuIF9TX2VtcHR5X2Nfc3RyOworICB9CisgIF9DaGFyVCogX19vbGRfY19zdHJpbmcgPSBfTV90cmVlX3B0ci5fTV9kYXRhLT5fTV9jX3N0cmluZzsKKyAgaWYgKDAgIT0gX19vbGRfY19zdHJpbmcpIHJldHVybiBfX29sZF9jX3N0cmluZzsKKyAgc2l6ZV90IF9fcyA9IHNpemUoKTsKKyAgX0NoYXJUKiBfX3Jlc3VsdCA9IF9TVExQX0NSRUFURV9BTExPQ0FUT1IoYWxsb2NhdG9yX3R5cGUsKGNvbnN0IGFsbG9jYXRvcl90eXBlJilfTV90cmVlX3B0ciwgX0NoYXJUKS5hbGxvY2F0ZShfX3MgKyAxKTsKKyAgX1NfZmxhdHRlbihfTV90cmVlX3B0ci5fTV9kYXRhLCBfX3Jlc3VsdCk7CisgIF9TX2NvbnN0cnVjdF9udWxsKF9fcmVzdWx0ICsgX19zKTsKKyAgX19vbGRfY19zdHJpbmcgPSBfX1NUQVRJQ19DQVNUKF9DaGFyVCosIF9BdG9taWNfc3dhcF9wdHIoX19SRUlOVEVSUFJFVF9DQVNUKHZvaWQqIF9TVExQX1ZPTEFUSUxFKiwgJihfTV90cmVlX3B0ci5fTV9kYXRhLT5fTV9jX3N0cmluZykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3Jlc3VsdCkpOworICBpZiAoMCAhPSBfX29sZF9jX3N0cmluZykgeworICAgIC8vIEl0IG11c3QgaGF2ZSBiZWVuIGFkZGVkIGluIHRoZSBpbnRlcmltLiAgSGVuY2UgaXQgaGFkIHRvIGhhdmUgYmVlbgorICAgIC8vIHNlcGFyYXRlbHkgYWxsb2NhdGVkLiAgRGVhbGxvY2F0ZSB0aGUgb2xkIGNvcHksIHNpbmNlIHdlIGp1c3QKKyAgICAvLyByZXBsYWNlZCBpdC4KKyAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95X1JhbmdlKF9fb2xkX2Nfc3RyaW5nLCBfX29sZF9jX3N0cmluZyArIF9fcyArIDEpOworICAgIF9TVExQX0NSRUFURV9BTExPQ0FUT1IoYWxsb2NhdG9yX3R5cGUsKGNvbnN0IGFsbG9jYXRvcl90eXBlJilfTV90cmVlX3B0ciwgX0NoYXJUKS5kZWFsbG9jYXRlKF9fb2xkX2Nfc3RyaW5nLCBfX3MgKyAxKTsKKyAgfQorICByZXR1cm4gX19yZXN1bHQ7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorY29uc3QgX0NoYXJUKiByb3BlPF9DaGFyVCxfQWxsb2M+OjpyZXBsYWNlX3dpdGhfY19zdHIoKSB7CisgIGlmICgwID09IF9NX3RyZWVfcHRyLl9NX2RhdGEpIHsKKyAgICBfU19lbXB0eV9jX3N0clswXSA9IF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQoX0NoYXJUKTsKKyAgICByZXR1cm4gX1NfZW1wdHlfY19zdHI7CisgIH0KKyAgX0NoYXJUKiBfX29sZF9jX3N0cmluZyA9IF9NX3RyZWVfcHRyLl9NX2RhdGEtPl9NX2Nfc3RyaW5nOworICBpZiAoX1JvcGVSZXA6Ol9TX2xlYWYgPT0gX01fdHJlZV9wdHIuX01fZGF0YS0+X01fdGFnICYmIDAgIT0gX19vbGRfY19zdHJpbmcpIHsKKyAgICByZXR1cm4gX19vbGRfY19zdHJpbmc7CisgIH0KKyAgc2l6ZV90IF9fcyA9IHNpemUoKTsKKyAgX0NoYXJUKiBfX3Jlc3VsdCA9IF9NX3RyZWVfcHRyLmFsbG9jYXRlKF9TX3JvdW5kZWRfdXBfc2l6ZShfX3MpKTsKKyAgX1NfZmxhdHRlbihfTV90cmVlX3B0ci5fTV9kYXRhLCBfX3Jlc3VsdCk7CisgIF9TX2NvbnN0cnVjdF9udWxsKF9fcmVzdWx0ICsgX19zKTsKKyAgX01fdHJlZV9wdHIuX01fZGF0YS0+X01fdW5yZWZfbm9ubmlsKCk7CisgIF9NX3RyZWVfcHRyLl9NX2RhdGEgPSBfU19uZXdfUm9wZUxlYWYoX19yZXN1bHQsIF9fcywgX01fdHJlZV9wdHIpOworICByZXR1cm4gX19yZXN1bHQ7Cit9CisKKy8vIEFsZ29yaXRobSBzcGVjaWFsaXphdGlvbnMuICBNb3JlIHNob3VsZCBiZSBhZGRlZC4KKworI2lmICghZGVmaW5lZCAoX1NUTFBfTVNWQykgfHwgKF9TVExQX01TVkMgPj0gMTMxMCkpICYmICFkZWZpbmVkIChfX0RNQ19fKQorLy8gSSBjb3VsZG4ndCBnZXQgdGhpcyB0byB3b3JrIHdpdGggVkMrKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULGNsYXNzIF9BbGxvYz4KK3ZvaWQgX1JvcGVfcm90YXRlKF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+IF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPiBfX21pZGRsZSwKKyAgICAgICAgICAgICAgICAgIF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+IF9fbGFzdCkgeworICBfU1RMUF9BU1NFUlQoX19maXJzdC5jb250YWluZXIoKSA9PSBfX21pZGRsZS5jb250YWluZXIoKSAmJgorICAgICAgICAgICAgICAgX19taWRkbGUuY29udGFpbmVyKCkgPT0gX19sYXN0LmNvbnRhaW5lcigpKQorICByb3BlPF9DaGFyVCxfQWxsb2M+JiBfX3IoX19maXJzdC5jb250YWluZXIoKSk7CisgIHJvcGU8X0NoYXJULF9BbGxvYz4gX19wcmVmaXggPSBfX3Iuc3Vic3RyKDAsIF9fZmlyc3QuaW5kZXgoKSk7CisgIHJvcGU8X0NoYXJULF9BbGxvYz4gX19zdWZmaXggPQorICAgIF9fci5zdWJzdHIoX19sYXN0LmluZGV4KCksIF9fci5zaXplKCkgLSBfX2xhc3QuaW5kZXgoKSk7CisgIHJvcGU8X0NoYXJULF9BbGxvYz4gX19wYXJ0MSA9CisgICAgX19yLnN1YnN0cihfX21pZGRsZS5pbmRleCgpLCBfX2xhc3QuaW5kZXgoKSAtIF9fbWlkZGxlLmluZGV4KCkpOworICByb3BlPF9DaGFyVCxfQWxsb2M+IF9fcGFydDIgPQorICAgIF9fci5zdWJzdHIoX19maXJzdC5pbmRleCgpLCBfX21pZGRsZS5pbmRleCgpIC0gX19maXJzdC5pbmRleCgpKTsKKyAgX19yID0gX19wcmVmaXg7CisgIF9fciArPSBfX3BhcnQxOworICBfX3IgKz0gX19wYXJ0MjsKKyAgX19yICs9IF9fc3VmZml4OworfQorCisKKyMgaWYgMAorLy8gUHJvYmFibHkgbm90IHVzZWZ1bCBmb3Igc2V2ZXJhbCByZWFzb25zOgorLy8gLSBmb3IgU0dJcyA3LjEgY29tcGlsZXIgYW5kIHByb2JhYmx5IHNvbWUgb3RoZXJzLAorLy8gICB0aGlzIGZvcmNlcyBsb3RzIG9mIHJvcGU8d2NoYXJfdCwgLi4uPiBpbnN0YW50aWF0aW9ucywgY3JlYXRpbmcgYQorLy8gICBjb2RlIGJsb2F0IGFuZCBjb21waWxlIHRpbWUgcHJvYmxlbS4gIChGaXhlZCBpbiA3LjIuKQorLy8gLSB3Y2hhcl90IGlzIDQgYnl0ZXMgd2lkZSBvbiBtb3N0IFVOSVggcGxhdGZvcm1zLCBtYWtpbmcgaXQgdW5hdHRyYWN0aXZlCisvLyAgIGZvciB1bmljb2RlIHN0cmluZ3MuICBVbnNpZ25lZCBzaG9ydCBtYXkgYmUgYSBiZXR0ZXIgY2hhcmFjdGVyCisvLyAgIHR5cGUuCitpbmxpbmUgdm9pZCByb3RhdGUoCisgICAgX1JvcGVfaXRlcmF0b3I8d2NoYXJfdCwgYWxsb2NhdG9yPGNoYXI+ID4gX19maXJzdCwKKyAgICAgICAgICAgICAgICBfUm9wZV9pdGVyYXRvcjx3Y2hhcl90LCBhbGxvY2F0b3I8Y2hhcj4gPiBfX21pZGRsZSwKKyAgICAgICAgICAgICAgICBfUm9wZV9pdGVyYXRvcjx3Y2hhcl90LCBhbGxvY2F0b3I8Y2hhcj4gPiBfX2xhc3QpIHsKKyAgICBfUm9wZV9yb3RhdGUoX19maXJzdCwgX19taWRkbGUsIF9fbGFzdCk7Cit9CisjIGVuZGlmCisjZW5kaWYgLyogX1NUTFBfTVNWQyAqLworCisjICAgdW5kZWYgX19Sb3BlTGVhZl9fCisjICAgdW5kZWYgX19Sb3BlUmVwX18KKyMgICB1bmRlZiBfX1JvcGVMZWFmCisjICAgdW5kZWYgX19Sb3BlUmVwCisjICAgdW5kZWYgc2l6ZV90eXBlCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworIyBlbmRpZiAvKiBST1BFSU1QTF9IICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9fcm9wZS5oIGIvc3RscG9ydC9zdGwvX3JvcGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTAwZjY3Ci0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvX3JvcGUuaApAQCAtMCwwICsxLDIzODkgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKy8qIE5PVEU6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIFNUTCBoZWFkZXJzLgorICogICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4KKyAqLworCisvLyByb3BlPF9DaGFyVCxfQWxsb2M+IGlzIGEgc2VxdWVuY2Ugb2YgX0NoYXJULgorLy8gUm9wZXMgYXBwZWFyIHRvIGJlIG11dGFibGUsIGJ1dCB1cGRhdGUgb3BlcmF0aW9ucworLy8gcmVhbGx5IGNvcHkgZW5vdWdoIG9mIHRoZSBkYXRhIHN0cnVjdHVyZSB0byBsZWF2ZSB0aGUgb3JpZ2luYWwKKy8vIHZhbGlkLiAgVGh1cyByb3BlcyBjYW4gYmUgbG9naWNhbGx5IGNvcGllZCBieSBqdXN0IGNvcHlpbmcKKy8vIGEgcG9pbnRlciB2YWx1ZS4KKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9ST1BFX0gKKyNkZWZpbmUgX1NUTFBfSU5URVJOQUxfUk9QRV9ICisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQUxHT0JBU0VfSAorIyAgaW5jbHVkZSA8c3RsL19hbGdvYmFzZS5oPgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX05PX0lPU1RSRUFNUykgJiYgIWRlZmluZWQgKF9TVExQX0lOVEVSTkFMX0lPU0ZXRCkKKyMgIGluY2x1ZGUgPHN0bC9faW9zZndkLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9BTExPQ19ICisjICBpbmNsdWRlIDxzdGwvX2FsbG9jLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9JVEVSQVRPUl9ICisjICBpbmNsdWRlIDxzdGwvX2l0ZXJhdG9yLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9BTEdPX0gKKyMgIGluY2x1ZGUgPHN0bC9fYWxnby5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfRlVOQ1RJT05fQkFTRV9ICisjICBpbmNsdWRlIDxzdGwvX2Z1bmN0aW9uX2Jhc2UuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX05VTUVSSUNfSAorIyAgaW5jbHVkZSA8c3RsL19udW1lcmljLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9IQVNIX0ZVTl9ICisjICBpbmNsdWRlIDxzdGwvX2hhc2hfZnVuLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9DSEFSX1RSQUlUU19ICisjICBpbmNsdWRlIDxzdGwvY2hhcl90cmFpdHMuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX1RIUkVBRFNfSAorIyAgaW5jbHVkZSA8c3RsL190aHJlYWRzLmg+CisjZW5kaWYKKworI2lmZGVmIF9TVExQX1NHSV9USFJFQURTCisjICBpbmNsdWRlIDxtdXRleC5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfRE9OVF9TVVBQT1JUX1JFQklORF9NRU1CRVJfVEVNUExBVEUKKyMgIGRlZmluZSBfU1RMUF9DUkVBVEVfQUxMT0NBVE9SKF9fYXR5cGUsX19hLCBfVHApIChfQWxsb2NfdHJhaXRzPF9UcCxfX2F0eXBlPjo6Y3JlYXRlX2FsbG9jYXRvcihfX2EpKQorI2Vsc2UKKyMgIGRlZmluZSBfU1RMUF9DUkVBVEVfQUxMT0NBVE9SKF9fYXR5cGUsX19hLCBfVHApIF9fc3RsX2FsbG9jX2NyZWF0ZShfX2EsKF9UcCopMCkKKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworLy8gRmlyc3QgYSBsb3Qgb2YgZm9yd2FyZCBkZWNsYXJhdGlvbnMuICBUaGUgc3RhbmRhcmQgc2VlbXMgdG8gcmVxdWlyZQorLy8gbXVjaCBzdHJpY3RlciAiZGVjbGFyYXRpb24gYmVmb3JlIHVzZSIgdGhhbiBtYW55IG9mIHRoZSBpbXBsZW1lbnRhdGlvbnMKKy8vIHRoYXQgcHJlY2VkZWQgaXQuCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIF9TVExQX0RGTF9UTVBMX1BBUkFNKF9BbGxvYywgYWxsb2NhdG9yPF9DaGFyVD4pID4gY2xhc3Mgcm9wZTsKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPiBzdHJ1Y3QgX1JvcGVfUm9wZUNvbmNhdGVuYXRpb247Cit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4gc3RydWN0IF9Sb3BlX1JvcGVSZXA7Cit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4gc3RydWN0IF9Sb3BlX1JvcGVMZWFmOwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+IHN0cnVjdCBfUm9wZV9Sb3BlRnVuY3Rpb247Cit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4gc3RydWN0IF9Sb3BlX1JvcGVTdWJzdHJpbmc7Cit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4gY2xhc3MgX1JvcGVfaXRlcmF0b3I7Cit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4gY2xhc3MgX1JvcGVfY29uc3RfaXRlcmF0b3I7Cit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4gY2xhc3MgX1JvcGVfY2hhcl9yZWZfcHJveHk7Cit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4gY2xhc3MgX1JvcGVfY2hhcl9wdHJfcHJveHk7CisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK3N0cnVjdCBfQmFzaWNDaGFyVHlwZSB7IHR5cGVkZWYgX19mYWxzZV90eXBlIF9SZXQ7IH07CisKK19TVExQX1RFTVBMQVRFX05VTEwKK3N0cnVjdCBfQmFzaWNDaGFyVHlwZTxjaGFyPiB7IHR5cGVkZWYgX190cnVlX3R5cGUgX1JldDsgfTsKKworI2lmZGVmIF9TVExQX0hBU19XQ0hBUl9UCitfU1RMUF9URU1QTEFURV9OVUxMCitzdHJ1Y3QgX0Jhc2ljQ2hhclR5cGU8d2NoYXJfdD4geyB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9SZXQ7IH07CisjZW5kaWYKKworLy8gU29tZSBoZWxwZXJzLCBzbyB3ZSBjYW4gdXNlIHRoZSBwb3dlciBhbGdvcml0aG0gb24gcm9wZXMuCisvLyBTZWUgYmVsb3cgZm9yIHdoeSB0aGlzIGlzbid0IGxvY2FsIHRvIHRoZSBpbXBsZW1lbnRhdGlvbi4KKworLy8gVGhpcyB1c2VzIGEgbm9uc3RhbmRhcmQgcmVmY291bnQgY29udmVudGlvbi4KKy8vIFRoZSByZXN1bHQgaGFzIHJlZmNvdW50IDAuCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK3N0cnVjdCBfUm9wZV9Db25jYXRfZm4KKyAgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPHJvcGU8X0NoYXJULF9BbGxvYz4sIHJvcGU8X0NoYXJULF9BbGxvYz4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICByb3BlPF9DaGFyVCxfQWxsb2M+ID4geworICByb3BlPF9DaGFyVCxfQWxsb2M+IG9wZXJhdG9yKCkgKGNvbnN0IHJvcGU8X0NoYXJULF9BbGxvYz4mIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByb3BlPF9DaGFyVCxfQWxsb2M+JiBfX3kpIHsKKyAgICByZXR1cm4gX194ICsgX195OworICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CitpbmxpbmUKK3JvcGU8X0NoYXJULF9BbGxvYz4KK19faWRlbnRpdHlfZWxlbWVudChfUm9wZV9Db25jYXRfZm48X0NoYXJULCBfQWxsb2M+KQoreyByZXR1cm4gcm9wZTxfQ2hhclQsX0FsbG9jPigpOyB9CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCisvLyBTdG9yZSBhbiBlb3MKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+CitpbmxpbmUgdm9pZCBfU19jb25zdHJ1Y3RfbnVsbF9hdXgoX0NoYXJUICpfX3AsIGNvbnN0IF9fdHJ1ZV90eXBlJikKK3sgKl9fcCA9IDA7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK2lubGluZSB2b2lkIF9TX2NvbnN0cnVjdF9udWxsX2F1eChfQ2hhclQgKl9fcCwgY29uc3QgX19mYWxzZV90eXBlJikKK3sgX1NUTFBfU1REOjpfQ29uc3RydWN0KF9fcCk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK2lubGluZSB2b2lkIF9TX2NvbnN0cnVjdF9udWxsKF9DaGFyVCAqX19wKSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0lzSW50ZWdyYWw8X0NoYXJUPjo6X1JldCBfQ2hhcl9Jc19JbnRlZ3JhbDsKKyAgX1NfY29uc3RydWN0X251bGxfYXV4KF9fcCwgX0NoYXJfSXNfSW50ZWdyYWwoKSk7Cit9CisKKy8vIGNoYXJfcHJvZHVjZXJzIGFyZSBsb2dpY2FsbHkgZnVuY3Rpb25zIHRoYXQgZ2VuZXJhdGUgYSBzZWN0aW9uIG9mCisvLyBhIHN0cmluZy4gIFRoZXNlIGNhbiBiZSBjb252ZXJ0ZWQgdG8gcm9wZXMuICBUaGUgcmVzdWx0aW5nIHJvcGUKKy8vIGludm9rZXMgdGhlIGNoYXJfcHJvZHVjZXIgb24gZGVtYW5kLiAgVGhpcyBhbGxvd3MsIGZvciBleGFtcGxlLAorLy8gZmlsZXMgdG8gYmUgdmlld2VkIGFzIHJvcGVzIHdpdGhvdXQgcmVhZGluZyB0aGUgZW50aXJlIGZpbGUuCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgorY2xhc3MgY2hhcl9wcm9kdWNlciB7CitwdWJsaWM6CisgIHZpcnR1YWwgfmNoYXJfcHJvZHVjZXIoKSB7fQorICB2aXJ0dWFsIHZvaWQgb3BlcmF0b3IoKShzaXplX3QgX19zdGFydF9wb3MsIHNpemVfdCBfX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX0NoYXJUKiBfX2J1ZmZlcikgPSAwOworICAvLyBCdWZmZXIgc2hvdWxkIHJlYWxseSBiZSBhbiBhcmJpdHJhcnkgb3V0cHV0IGl0ZXJhdG9yLgorICAvLyBUaGF0IHdheSB3ZSBjb3VsZCBmbGF0dGVuIGRpcmVjdGx5IGludG8gYW4gb3N0cmVhbSwgZXRjLgorICAvLyBUaGlzIGlzIHRob3JvdWdobHkgaW1wb3NzaWJsZSwgc2luY2UgaXRlcmF0b3IgdHlwZXMgZG9uJ3QKKyAgLy8gaGF2ZSBydW50aW1lIGRlc2NyaXB0aW9ucy4KK307CisKKy8vIFNlcXVlbmNlIGJ1ZmZlcnM6CisvLworLy8gU2VxdWVuY2UgbXVzdCBwcm92aWRlIGFuIGFwcGVuZCBvcGVyYXRpb24gdGhhdCBhcHBlbmRzIGFuCisvLyBhcnJheSB0byB0aGUgc2VxdWVuY2UuICBTZXF1ZW5jZSBidWZmZXJzIGFyZSB1c2VmdWwgb25seSBpZgorLy8gYXBwZW5kaW5nIGFuIGVudGlyZSBhcnJheSBpcyBjaGVhcGVyIHRoYW4gYXBwZW5kaW5nIGVsZW1lbnQgYnkgZWxlbWVudC4KKy8vIFRoaXMgaXMgdHJ1ZSBmb3IgbWFueSBzdHJpbmcgcmVwcmVzZW50YXRpb25zLgorLy8gVGhpcyBzaG91bGQgIHBlcmhhcHMgaW5oZXJpdCBmcm9tIG9zdHJlYW08c2VxdWVuY2U6OnZhbHVlX3R5cGU+CisvLyBhbmQgYmUgaW1wbGVtZW50ZWQgY29ycmVzcG9uZGluZ2x5LCBzbyB0aGF0IHRoZXkgY2FuIGJlIHVzZWQKKy8vIGZvciBmb3JtYXR0ZWQuICBGb3IgdGhlIHNha2Ugb2YgcG9ydGFiaWxpdHksIHdlIGRvbid0IGRvIHRoaXMgeWV0LgorLy8KKy8vIEZvciBub3csIHNlcXVlbmNlIGJ1ZmZlcnMgYmVoYXZlIGFzIG91dHB1dCBpdGVyYXRvcnMuICBCdXQgdGhleSBhbHNvCisvLyBiZWhhdmUgYSBsaXR0bGUgbGlrZSBiYXNpY19vc3RyaW5nc3RyZWFtPHNlcXVlbmNlOjp2YWx1ZV90eXBlPiBhbmQgYQorLy8gbGl0dGxlIGxpa2UgY29udGFpbmVycy4KKwordGVtcGxhdGU8Y2xhc3MgX1NlcXVlbmNlCisjIGlmICEoZGVmaW5lZCAoX1NUTFBfTk9OX1RZUEVfVE1QTF9QQVJBTV9CVUcpIHx8IFwKKyAgICAgICBkZWZpbmVkICggX1NUTFBfTk9fREVGQVVMVF9OT05fVFlQRV9QQVJBTSApKQorICAgICAgICAgLCBzaXplX3QgX0J1Zl9zeiA9IDEwMAorIyAgIGlmIGRlZmluZWQoX19zZ2kpICYmICFkZWZpbmVkKF9fR05VQ19fKQorIyAgIGRlZmluZSBfX1RZUEVERUZfV09SS0FST1VORAorICAgICAgICAgLGNsYXNzIF9WID0gdHlwZW5hbWUgX1NlcXVlbmNlOjp2YWx1ZV90eXBlCisjICAgZW5kaWYgLyogX19zZ2kgKi8KKyMgZW5kaWYgLyogX1NUTFBfTk9OX1RZUEVfVE1QTF9QQVJBTV9CVUcgKi8KKyAgICAgICAgID4KKy8vIFRoZSAzcmQgcGFyYW1ldGVyIHdvcmtzIGFyb3VuZCBhIGNvbW1vbiBjb21waWxlciBidWcuCitjbGFzcyBzZXF1ZW5jZV9idWZmZXIgOiBwdWJsaWMgaXRlcmF0b3IgPG91dHB1dF9pdGVyYXRvcl90YWcsIHZvaWQsIHZvaWQsIHZvaWQsIHZvaWQ+IHsKK3B1YmxpYzoKKyMgaWZuZGVmIF9fVFlQRURFRl9XT1JLQVJPVU5ECisgIHR5cGVkZWYgdHlwZW5hbWUgX1NlcXVlbmNlOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgc2VxdWVuY2VfYnVmZmVyPF9TZXF1ZW5jZQorIyBpZiAhKGRlZmluZWQgKF9TVExQX05PTl9UWVBFX1RNUExfUEFSQU1fQlVHKSB8fCBcCisgICAgICAgZGVmaW5lZCAoIF9TVExQX05PX0RFRkFVTFRfTk9OX1RZUEVfUEFSQU0gKSkKKyAgLCBfQnVmX3N6CisgID4gX1NlbGY7CisjIGVsc2UgLyogX1NUTFBfTk9OX1RZUEVfVE1QTF9QQVJBTV9CVUcgKi8KKyAgPiBfU2VsZjsKKyAgZW51bSB7IF9CdWZfc3ogPSAxMDB9OworIyBlbmRpZiAvKiBfU1RMUF9OT05fVFlQRV9UTVBMX1BBUkFNX0JVRyAqLworICAvLyAjIGVuZGlmCisjIGVsc2UgLyogX19UWVBFREVGX1dPUktBUk9VTkQgKi8KKyAgdHlwZWRlZiBfViB2YWx1ZV90eXBlOworICB0eXBlZGVmIHNlcXVlbmNlX2J1ZmZlcjxfU2VxdWVuY2UsIF9CdWZfc3osIF9WPiBfU2VsZjsKKyMgZW5kaWYgLyogX19UWVBFREVGX1dPUktBUk9VTkQgKi8KK3Byb3RlY3RlZDoKKyAgX1NlcXVlbmNlKiBfTV9wcmVmaXg7CisgIHZhbHVlX3R5cGUgX01fYnVmZmVyW19CdWZfc3pdOworICBzaXplX3QgICAgIF9NX2J1Zl9jb3VudDsKK3B1YmxpYzoKKyAgdm9pZCBmbHVzaCgpIHsKKyAgICBfTV9wcmVmaXgtPmFwcGVuZChfTV9idWZmZXIsIF9NX2J1ZmZlciArIF9NX2J1Zl9jb3VudCk7CisgICAgX01fYnVmX2NvdW50ID0gMDsKKyAgfQorICB+c2VxdWVuY2VfYnVmZmVyKCkgeyBmbHVzaCgpOyB9CisgIHNlcXVlbmNlX2J1ZmZlcigpIDogX01fcHJlZml4KDApLCBfTV9idWZfY291bnQoMCkge30KKyAgc2VxdWVuY2VfYnVmZmVyKGNvbnN0IF9TZWxmJiBfX3gpIHsKKyAgICBfTV9wcmVmaXggPSBfX3guX01fcHJlZml4OworICAgIF9NX2J1Zl9jb3VudCA9IF9feC5fTV9idWZfY291bnQ7CisgICAgX1NUTFBfU1REOjpjb3B5KF9feC5fTV9idWZmZXIsIF9feC5fTV9idWZmZXIgKyBfX3guX01fYnVmX2NvdW50LCBfTV9idWZmZXIpOworICB9CisgIHNlcXVlbmNlX2J1ZmZlcihfU2VsZiYgX194KSB7CisgICAgX194LmZsdXNoKCk7CisgICAgX01fcHJlZml4ID0gX194Ll9NX3ByZWZpeDsKKyAgICBfTV9idWZfY291bnQgPSAwOworICB9CisgIHNlcXVlbmNlX2J1ZmZlcihfU2VxdWVuY2UmIF9fcykgOiBfTV9wcmVmaXgoJl9fcyksIF9NX2J1Zl9jb3VudCgwKSB7fQorICBfU2VsZiYgb3BlcmF0b3I9IChfU2VsZiYgX194KSB7CisgICAgX194LmZsdXNoKCk7CisgICAgX01fcHJlZml4ID0gX194Ll9NX3ByZWZpeDsKKyAgICBfTV9idWZfY291bnQgPSAwOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBfU2VsZiYgb3BlcmF0b3I9IChjb25zdCBfU2VsZiYgX194KSB7CisgICAgX01fcHJlZml4ID0gX194Ll9NX3ByZWZpeDsKKyAgICBfTV9idWZfY291bnQgPSBfX3guX01fYnVmX2NvdW50OworICAgIF9TVExQX1NURDo6Y29weShfX3guX01fYnVmZmVyLCBfX3guX01fYnVmZmVyICsgX194Ll9NX2J1Zl9jb3VudCwgX01fYnVmZmVyKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgdm9pZCBwdXNoX2JhY2sodmFsdWVfdHlwZSBfX3gpIHsKKyAgICBpZiAoX01fYnVmX2NvdW50IDwgX0J1Zl9zeikgeworICAgICAgX01fYnVmZmVyW19NX2J1Zl9jb3VudF0gPSBfX3g7CisgICAgICArK19NX2J1Zl9jb3VudDsKKyAgICB9IGVsc2UgeworICAgICAgZmx1c2goKTsKKyAgICAgIF9NX2J1ZmZlclswXSA9IF9feDsKKyAgICAgIF9NX2J1Zl9jb3VudCA9IDE7CisgICAgfQorICB9CisgIHZvaWQgYXBwZW5kKGNvbnN0IHZhbHVlX3R5cGUgKl9fcywgc2l6ZV90IF9fbGVuKSB7CisgICAgaWYgKF9fbGVuICsgX01fYnVmX2NvdW50IDw9IF9CdWZfc3opIHsKKyAgICAgIHNpemVfdCBfX2kgPSBfTV9idWZfY291bnQ7CisgICAgICBzaXplX3QgX19qID0gMDsKKyAgICAgIGZvciAoOyBfX2ogPCBfX2xlbjsgX19pKyssIF9faisrKSB7CisgICAgICAgIF9NX2J1ZmZlcltfX2ldID0gX19zW19fal07CisgICAgICB9CisgICAgICBfTV9idWZfY291bnQgKz0gX19sZW47CisgICAgfSBlbHNlIGlmICgwID09IF9NX2J1Zl9jb3VudCkgeworICAgICAgX01fcHJlZml4LT5hcHBlbmQoX19zLCBfX3MgKyBfX2xlbik7CisgICAgfSBlbHNlIHsKKyAgICAgIGZsdXNoKCk7CisgICAgICBhcHBlbmQoX19zLCBfX2xlbik7CisgICAgfQorICB9CisgIF9TZWxmJiB3cml0ZShjb25zdCB2YWx1ZV90eXBlICpfX3MsIHNpemVfdCBfX2xlbikgeworICAgIGFwcGVuZChfX3MsIF9fbGVuKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgX1NlbGYmIHB1dCh2YWx1ZV90eXBlIF9feCkgeworICAgIHB1c2hfYmFjayhfX3gpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBfU2VsZiYgb3BlcmF0b3I9KGNvbnN0IHZhbHVlX3R5cGUmIF9fcmhzKSB7CisgICAgcHVzaF9iYWNrKF9fcmhzKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgX1NlbGYmIG9wZXJhdG9yKigpIHsgcmV0dXJuICp0aGlzOyB9CisgIF9TZWxmJiBvcGVyYXRvcisrKCkgeyByZXR1cm4gKnRoaXM7IH0KKyAgX1NlbGYmIG9wZXJhdG9yKysoaW50KSB7IHJldHVybiAqdGhpczsgfQorfTsKKworLy8gVGhlIGZvbGxvd2luZyBzaG91bGQgYmUgdHJlYXRlZCBhcyBwcml2YXRlLCBhdCBsZWFzdCBmb3Igbm93LgordGVtcGxhdGU8Y2xhc3MgX0NoYXJUPgorY2xhc3MgX1JvcGVfY2hhcl9jb25zdW1lciB7CisjaWYgIWRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCitwdWJsaWM6CisgIC8vV2l0aG91dCBtZW1iZXIgdGVtcGxhdGVzIHdlIGhhdmUgdG8gdXNlIHJ1bi10aW1lIHBhcmFtZXRlcml6YXRpb24uCisgIC8vIFRoZSBzeW1tZXRyeSB3aXRoIGNoYXJfcHJvZHVjZXIgaXMgYWNjaWRlbnRhbCBhbmQgdGVtcG9yYXJ5LgorICB2aXJ0dWFsIH5fUm9wZV9jaGFyX2NvbnN1bWVyKCkge30KKyAgdmlydHVhbCBib29sIG9wZXJhdG9yKCkoY29uc3QgX0NoYXJUKiBfX2J1ZmZlciwgc2l6ZV90IF9fbGVuKSA9IDA7CisjZW5kaWYKK307CisKKy8vCisvLyBXaGF0IGZvbGxvd3Mgc2hvdWxkIHJlYWxseSBiZSBsb2NhbCB0byByb3BlLiAgVW5mb3J0dW5hdGVseSwKKy8vIHRoYXQgZG9lc24ndCB3b3JrLCBzaW5jZSBpdCBtYWtlcyBpdCBpbXBvc3NpYmxlIHRvIGRlZmluZSBnZW5lcmljCisvLyBlcXVhbGl0eSBvbiByb3BlIGl0ZXJhdG9ycy4gIEFjY29yZGluZyB0byB0aGUgZHJhZnQgc3RhbmRhcmQsIHRoZQorLy8gdGVtcGxhdGUgcGFyYW1ldGVycyBmb3Igc3VjaCBhbiBlcXVhbGl0eSBvcGVyYXRvciBjYW5ub3QgYmUgaW5mZXJyZWQKKy8vIGZyb20gdGhlIG9jY3VyZW5jZSBvZiBhIG1lbWJlciBjbGFzcyBhcyBhIHBhcmFtZXRlci4KKy8vIChTR0kgY29tcGlsZXJzIGluIGZhY3QgYWxsb3cgdGhpcywgYnV0IHRoZSBfX3Jlc3VsdCB3b3VsZG4ndCBiZQorLy8gcG9ydGFibGUuKQorLy8gU2ltaWxhcmx5LCBzb21lIG9mIHRoZSBzdGF0aWMgbWVtYmVyIGZ1bmN0aW9ucyBhcmUgbWVtYmVyIGZ1bmN0aW9ucworLy8gb25seSB0byBhdm9pZCBwb2xsdXRpbmcgdGhlIGdsb2JhbCBuYW1lc3BhY2UsIGFuZCB0byBjaXJjdW12ZW50CisvLyByZXN0cmljdGlvbnMgb24gdHlwZSBpbmZlcmVuY2UgZm9yIHRlbXBsYXRlIGZ1bmN0aW9ucy4KKy8vCisKKy8vCisvLyBUaGUgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmUgZm9yIHJlcHJlc2VudGluZyBhIHJvcGUuICBUaGlzIGlzCisvLyBwcml2YXRlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbi4gIEEgcm9wZSBpcyByZWFsbHkganVzdCBhIHBvaW50ZXIKKy8vIHRvIG9uZSBvZiB0aGVzZS4KKy8vCisvLyBBIGZldyBiYXNpYyBmdW5jdGlvbnMgZm9yIG1hbmlwdWxhdGluZyB0aGlzIGRhdGEgc3RydWN0dXJlCisvLyBhcmUgbWVtYmVycyBvZiBfUm9wZVJlcC4gIE1vc3Qgb2YgdGhlIG1vcmUgY29tcGxleCBhbGdvcml0aG1zCisvLyBhcmUgaW1wbGVtZW50ZWQgYXMgcm9wZSBtZW1iZXJzLgorLy8KKy8vIFNvbWUgb2YgdGhlIHN0YXRpYyBtZW1iZXIgZnVuY3Rpb25zIG9mIF9Sb3BlUmVwIGhhdmUgaWRlbnRpY2FsbHkKKy8vIG5hbWVkIGZ1bmN0aW9ucyBpbiByb3BlIHRoYXQgc2ltcGx5IGludm9rZSB0aGUgX1JvcGVSZXAgdmVyc2lvbnMuCisvLworCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK3N0cnVjdCBfUm9wZV9Sb3BlUmVwCisgIDogcHVibGljIF9SZWZjb3VudF9CYXNlCit7CisgIHR5cGVkZWYgX1JvcGVfUm9wZVJlcDxfQ2hhclQsIF9BbGxvYz4gX1NlbGY7CitwdWJsaWM6CisgIC8vCisgIC8vIEdBQjogMTEvMDkvMDUKKyAgLy8KKyAgLy8gIl9fUk9QRV9ERVBUSF9TSVpFIiBpcyBzZXQgdG8gb25lIG1vcmUgdGhlbiB0aGUgIl9fUk9QRV9NQVhfREVQVEgiLgorICAvLyBUaGlzIHdhcyBvcmlnaW5hbGx5IGp1c3QgYW4gYWRkaXRpb24gb2YgIl9fUk9QRV9NQVhfREVQVEggKyAxIgorICAvLyBidXQgdGhpcyBhZGRpdGlvbiBjYXVzZXMgdGhlIHN1bnBybyBjb21waWxlciB0byBjb21wbGFpbiBhYm91dAorICAvLyBtdWx0aXBsZSBkZWNsYXJhdGlvbnMgZHVyaW5nIHRoZSBpbml0aWFsaXphdGlvbiBvZiAiX1NfbWluX2xlbiIuCisgIC8vIENoYW5nZWQgdG8gYmUgYSBmaXhlZCB2YWx1ZSBhbmQgdGhlIHN1bnBybyBjb21waWxlciBhcHBlYXJzIHRvCisgIC8vIGJlIGhhcHB5Pz8/CisgIC8vCisjICBkZWZpbmUgX19ST1BFX01BWF9ERVBUSCAgNDUKKyMgIGRlZmluZSBfX1JPUEVfREVQVEhfU0laRSA0NiAvLyBfX1JPUEVfTUFYX0RFUFRIICsgMQorICBlbnVtIHsgX1NfbWF4X3JvcGVfZGVwdGggPSBfX1JPUEVfTUFYX0RFUFRIIH07CisgIGVudW0gX1RhZyB7X1NfbGVhZiwgX1NfY29uY2F0LCBfU19zdWJzdHJpbmdmbiwgX1NfZnVuY3Rpb259OworICAvLyBBcHBhcmVudGx5IG5lZWRlZCBieSBWQysrCisgIC8vIFRoZSBkYXRhIGZpZWxkcyBvZiBsZWF2ZXMgYXJlIGFsbG9jYXRlZCB3aXRoIHNvbWUKKyAgLy8gZXh0cmEgc3BhY2UsIHRvIGFjY29tb2RhdGUgZnV0dXJlIGdyb3d0aCBhbmQgZm9yIGJhc2ljCisgIC8vIGNoYXJhY3RlciB0eXBlcywgdG8gaG9sZCBhIHRyYWlsaW5nIGVvcyBjaGFyYWN0ZXIuCisgIGVudW0geyBfU19hbGxvY19ncmFudWxhcml0eSA9IDggfTsKKworICBfVGFnIF9NX3RhZzo4OworICBib29sIF9NX2lzX2JhbGFuY2VkOjg7CisKKyAgX1NUTFBfRk9SQ0VfQUxMT0NBVE9SUyhfQ2hhclQsIF9BbGxvYykKKyAgdHlwZWRlZiBfQWxsb2MgYWxsb2NhdG9yX3R5cGU7CisKKyAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IHsgcmV0dXJuIGFsbG9jYXRvcl90eXBlKF9NX3NpemUpOyAgfQorCisgIHVuc2lnbmVkIGNoYXIgX01fZGVwdGg7CisgIF9DaGFyVCogX1NUTFBfVk9MQVRJTEUgX01fY19zdHJpbmc7CisgIF9TVExQX1BSSVYgX1NUTFBfYWxsb2NfcHJveHk8c2l6ZV90LCBfQ2hhclQsIGFsbG9jYXRvcl90eXBlPiBfTV9zaXplOworCisjaWZkZWYgX1NUTFBfTk9fQVJST1dfT1BFUkFUT1IKKyAgX1JvcGVfUm9wZVJlcCgpIDogX1JlZmNvdW50X0Jhc2UoMSksIF9NX3NpemUoYWxsb2NhdG9yX3R5cGUoKSwgMCkgeworIyAgaWYgZGVmaW5lZCAoX1NUTFBfQ0hFQ0tfUlVOVElNRV9DT01QQVRJQklMSVRZKQorICAgIF9TVExQX0NIRUNLX1JVTlRJTUVfQ09NUEFUSUJJTElUWSgpOworIyAgZW5kaWYKKyAgfQorI2VuZGlmCisKKyAgLyogRmxhdHRlbmVkIHZlcnNpb24gb2Ygc3RyaW5nLCBpZiBuZWVkZWQuICAqLworICAvKiB0eXBpY2FsbHkgMC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIElmIGl0J3Mgbm90IDAsIHRoZW4gdGhlIG1lbW9yeSBpcyBvd25lZCAgKi8KKyAgLyogYnkgdGhpcyBub2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBJbiB0aGUgY2FzZSBvZiBhIGxlYWYsIHRoaXMgbWF5IHBvaW50IHRvICovCisgIC8qIHRoZSBzYW1lIG1lbW9yeSBhcyB0aGUgZGF0YSBmaWVsZC4gICAgICAgKi8KKyAgX1JvcGVfUm9wZVJlcChfVGFnIF9fdCwgdW5zaWduZWQgY2hhciBfX2QsIGJvb2wgX19iLCBzaXplX3QgX3Bfc2l6ZSwKKyAgICAgICAgICAgICAgICBhbGxvY2F0b3JfdHlwZSBfX2EpIDoKKyAgICBfUmVmY291bnRfQmFzZSgxKSwKKyAgICBfTV90YWcoX190KSwgX01faXNfYmFsYW5jZWQoX19iKSwgX01fZGVwdGgoX19kKSwgX01fY19zdHJpbmcoMCksIF9NX3NpemUoX19hLCBfcF9zaXplKSB7CisjaWYgZGVmaW5lZCAoX1NUTFBfQ0hFQ0tfUlVOVElNRV9DT01QQVRJQklMSVRZKQorICAgIF9TVExQX0NIRUNLX1JVTlRJTUVfQ09NUEFUSUJJTElUWSgpOworI2VuZGlmCisgICAgfQorCisgIHR5cGVkZWYgX1NUTFBfVFlQRU5BTUUgX1NUTFBfUFJJViBfQmFzaWNDaGFyVHlwZTxfQ2hhclQ+OjpfUmV0IF9Jc0Jhc2ljQ2hhclR5cGU7CisKKyNpZiAwCisgIC8qIFBsZWFzZSB0ZWxsIHdoeSB0aGlzIGNvZGUgaXMgbmVjZXNzYXJ5IGlmIHlvdSB1bmNvbW1lbnQgaXQuCisgICAqIFByb2JsZW0gd2l0aCBpdCBpcyB0aGF0IHJvcGUgaW1wbGVtZW50YXRpb24gZXhwZWN0IHRoYXQgX1Nfcm91bmRlZF91cF9zaXplKG4pCisgICAqIHJldHVybnMgYSBzaXplID4gbiBpbiBvcmRlciB0byBzdG9yZSB0aGUgdGVybWluYXRpbmcgbnVsbCBjaGFyYXRlci4gV2hlbgorICAgKiBpbnN0YW5jaWF0aW9uIHR5cGUgaXMgbm90IGEgY2hhciBvciB3Y2hhcl90IHRoaXMgaXMgbm90IGd1YXJhbnR5IHJlc3VsdGluZyBpbgorICAgKiBtZW1vcnkgb3ZlcnJ1bi4KKyAgICovCisgIHN0YXRpYyBzaXplX3QgX1Nfcm91bmRlZF91cF9zaXplX2F1eChzaXplX3QgX19uLCBfX3RydWVfdHlwZSBjb25zdCYgLypfSXNCYXNpY0NoYXJUeXBlKi8pIHsKKyAgICAvLyBBbGxvdyBzbG9wIGZvciBpbi1wbGFjZSBleHBhbnNpb24uCisgICAgcmV0dXJuIChfX24gKyBfU19hbGxvY19ncmFudWxhcml0eSkgJiB+KF9TX2FsbG9jX2dyYW51bGFyaXR5IC0gMSk7CisgIH0KKworICBzdGF0aWMgc2l6ZV90IF9TX3JvdW5kZWRfdXBfc2l6ZV9hdXgoc2l6ZV90IF9fbiwgX19mYWxzZV90eXBlIGNvbnN0JiAvKl9Jc0Jhc2ljQ2hhclR5cGUqLykgeworICAgIC8vIEFsbG93IHNsb3AgZm9yIGluLXBsYWNlIGV4cGFuc2lvbi4KKyAgICByZXR1cm4gKF9fbiArIF9TX2FsbG9jX2dyYW51bGFyaXR5IC0gMSkgJiB+KF9TX2FsbG9jX2dyYW51bGFyaXR5IC0gMSk7CisgIH0KKyNlbmRpZgorICAvLyBmYnAgOiBtb3ZlZCBmcm9tIFJvcGVMZWFmCisgIHN0YXRpYyBzaXplX3QgX1Nfcm91bmRlZF91cF9zaXplKHNpemVfdCBfX24pCisgIC8veyByZXR1cm4gX1Nfcm91bmRlZF91cF9zaXplX2F1eChfX24sIF9Jc0Jhc2ljQ2hhclR5cGUoKSk7IH0KKyAgeyByZXR1cm4gKF9fbiArIF9TX2FsbG9jX2dyYW51bGFyaXR5KSAmIH4oX1NfYWxsb2NfZ3JhbnVsYXJpdHkgLSAxKTsgfQorCisgIHN0YXRpYyB2b2lkIF9TX2ZyZWVfc3RyaW5nKCBfQ2hhclQqIF9fcywgc2l6ZV90IF9fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JfdHlwZSBfX2EpIHsKKyAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95X1JhbmdlKF9fcywgX19zICsgX19sZW4pOworICAgIC8vICBUaGlzIGhhcyB0byBiZSBhIHN0YXRpYyBtZW1iZXIsIHNvIHRoaXMgZ2V0cyBhIGJpdCBtZXNzeQorIyAgIGlmbmRlZiBfU1RMUF9ET05UX1NVUFBPUlRfUkVCSU5EX01FTUJFUl9URU1QTEFURQorICAgIF9fYS5kZWFsbG9jYXRlKF9fcywgX1Nfcm91bmRlZF91cF9zaXplKF9fbGVuKSk7ICAgIC8vKnR5IDAzLzI0LzIwMDEgLSByZXN0b3JlZCBub3QgdG8gdXNlIF9fc3RsX2FsbG9jX3JlYmluZCgpIHNpbmNlIGl0IGlzIG5vdCBkZWZpbmVkIHVuZGVyIF9TVExQX01FTUJFUl9URU1QTEFURV9DTEFTU0VTCisjICAgZWxzZQorICAgIF9fc3RsX2FsbG9jX3JlYmluZCAoX19hLCAoX0NoYXJUKikwKS5kZWFsbG9jYXRlKF9fcywgX1Nfcm91bmRlZF91cF9zaXplKF9fbGVuKSk7CisjICAgZW5kaWYKKyAgfQorCisgIC8vIERlYWxsb2NhdGUgZGF0YSBzZWN0aW9uIG9mIGEgbGVhZi4KKyAgLy8gVGhpcyBzaG91bGRuJ3QgYmUgYSBtZW1iZXIgZnVuY3Rpb24uCisgIC8vIEJ1dCBpdHMgaGFyZCB0byBkbyBhbnl0aGluZyBlbHNlIGF0IHRoZQorICAvLyBtb21lbnQsIGJlY2F1c2UgaXQncyB0ZW1wbGF0aXplZCB3LnIudC4KKyAgLy8gYW4gYWxsb2NhdG9yLgorICAvLyBEb2VzIG5vdGhpbmcgaWYgX19HQyBpcyBkZWZpbmVkLgorICB2b2lkIF9NX2ZyZWVfY19zdHJpbmcoKTsKKyAgdm9pZCBfTV9mcmVlX3RyZWUoKTsKKyAgLy8gRGVhbGxvY2F0ZSB0LiBBc3N1bWVzIHQgaXMgbm90IDAuCisgIHZvaWQgX01fdW5yZWZfbm9ubmlsKCkgeworICAgIGlmIChfTV9kZWNyKCkgPT0gMCkgX01fZnJlZV90cmVlKCk7CisgIH0KKyAgdm9pZCBfTV9yZWZfbm9ubmlsKCkgeworICAgIF9NX2luY3IoKTsKKyAgfQorICBzdGF0aWMgdm9pZCBfU191bnJlZihfU2VsZiogX190KSB7CisgICAgaWYgKDAgIT0gX190KSB7CisgICAgICBfX3QtPl9NX3VucmVmX25vbm5pbCgpOworICAgIH0KKyAgfQorICBzdGF0aWMgdm9pZCBfU19yZWYoX1NlbGYqIF9fdCkgeworICAgIGlmICgwICE9IF9fdCkgX190LT5fTV9pbmNyKCk7CisgIH0KKyAgLy9zdGF0aWMgdm9pZCBfU19mcmVlX2lmX3VucmVmKF9TZWxmKiBfX3QpIHsKKyAgLy8gIGlmICgwICE9IF9fdCAmJiAwID09IF9fdC0+X01fcmVmX2NvdW50KSBfX3QtPl9NX2ZyZWVfdHJlZSgpOworICAvL30KK307CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorc3RydWN0IF9Sb3BlX1JvcGVMZWFmIDogcHVibGljIF9Sb3BlX1JvcGVSZXA8X0NoYXJULF9BbGxvYz4geworcHVibGljOgorICBfQ2hhclQqIF9NX2RhdGE7IC8qIE5vdCBuZWNlc3NhcmlseSAwIHRlcm1pbmF0ZWQuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBhbGxvY2F0ZWQgc2l6ZSBpcyAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIF9TX3JvdW5kZWRfdXBfc2l6ZShzaXplKSwgZXhjZXB0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluIHRoZSBHQyBjYXNlLCBpbiB3aGljaCBpdCAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvZXNuJ3QgbWF0dGVyLiAgICAgICAgICAgICAgICovCitwcml2YXRlOgorICB0eXBlZGVmIF9Sb3BlX1JvcGVSZXA8X0NoYXJULF9BbGxvYz4gX1JvcGVSZXA7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1JvcGVSZXA6Ol9Jc0Jhc2ljQ2hhclR5cGUgX0lzQmFzaWNDaGFyVHlwZTsKKyAgdm9pZCBfTV9pbml0KF9fdHJ1ZV90eXBlIGNvbnN0JiAvKl9Jc0Jhc2ljQ2hhclR5cGUqLykgeworICAgIHRoaXMtPl9NX2Nfc3RyaW5nID0gX01fZGF0YTsKKyAgfQorICB2b2lkIF9NX2luaXQoX19mYWxzZV90eXBlIGNvbnN0JiAvKl9Jc0Jhc2ljQ2hhclR5cGUqLykge30KKworcHVibGljOgorICBfU1RMUF9GT1JDRV9BTExPQ0FUT1JTKF9DaGFyVCwgX0FsbG9jKQorICB0eXBlZGVmIHR5cGVuYW1lIF9Sb3BlUmVwOjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKKworICBfUm9wZV9Sb3BlTGVhZiggX0NoYXJUKiBfX2QsIHNpemVfdCBfcF9zaXplLCBhbGxvY2F0b3JfdHlwZSBfX2EpCisgICAgOiBfUm9wZV9Sb3BlUmVwPF9DaGFyVCxfQWxsb2M+KF9Sb3BlUmVwOjpfU19sZWFmLCAwLCB0cnVlLCBfcF9zaXplLCBfX2EpLAorICAgICAgX01fZGF0YShfX2QpIHsKKyAgICBfU1RMUF9BU1NFUlQoX3Bfc2l6ZSA+IDApCisgICAgX01faW5pdChfSXNCYXNpY0NoYXJUeXBlKCkpOworICB9CisKKyMgaWZkZWYgX1NUTFBfTk9fQVJST1dfT1BFUkFUT1IKKyAgX1JvcGVfUm9wZUxlYWYoKSB7fQorICBfUm9wZV9Sb3BlTGVhZihjb25zdCBfUm9wZV9Sb3BlTGVhZjxfQ2hhclQsIF9BbGxvYz4mICkge30KKyMgZW5kaWYKKworLy8gVGhlIGNvbnN0cnVjdG9yIGFzc3VtZXMgdGhhdCBkIGhhcyBiZWVuIGFsbG9jYXRlZCB3aXRoCisgIC8vIHRoZSBwcm9wZXIgYWxsb2NhdG9yIGFuZCB0aGUgcHJvcGVybHkgcGFkZGVkIHNpemUuCisgIC8vIEluIGNvbnRyYXN0LCB0aGUgZGVzdHJ1Y3RvciBkZWFsbG9jYXRlcyB0aGUgZGF0YToKKyAgfl9Sb3BlX1JvcGVMZWFmKCkgeworICAgIGlmIChfTV9kYXRhICE9IHRoaXMtPl9NX2Nfc3RyaW5nKSB7CisgICAgICB0aGlzLT5fTV9mcmVlX2Nfc3RyaW5nKCk7CisgICAgfQorICAgIF9Sb3BlUmVwOjpfU19mcmVlX3N0cmluZyhfTV9kYXRhLCB0aGlzLT5fTV9zaXplLl9NX2RhdGEsIHRoaXMtPmdldF9hbGxvY2F0b3IoKSk7CisgIH0KK307CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorc3RydWN0IF9Sb3BlX1JvcGVDb25jYXRlbmF0aW9uIDogcHVibGljIF9Sb3BlX1JvcGVSZXA8X0NoYXJULCBfQWxsb2M+IHsKK3ByaXZhdGU6CisgIHR5cGVkZWYgX1JvcGVfUm9wZVJlcDxfQ2hhclQsX0FsbG9jPiBfUm9wZVJlcDsKKworcHVibGljOgorICBfUm9wZVJlcCogX01fbGVmdDsKKyAgX1JvcGVSZXAqIF9NX3JpZ2h0OworICBfU1RMUF9GT1JDRV9BTExPQ0FUT1JTKF9DaGFyVCwgX0FsbG9jKQorICB0eXBlZGVmIHR5cGVuYW1lIF9Sb3BlUmVwOjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKKyAgX1JvcGVfUm9wZUNvbmNhdGVuYXRpb24oX1JvcGVSZXAqIF9fbCwgX1JvcGVSZXAqIF9fciwgYWxsb2NhdG9yX3R5cGUgX19hKQorICAgIDogX1JvcGVfUm9wZVJlcDxfQ2hhclQsX0FsbG9jPihfUm9wZVJlcDo6X1NfY29uY2F0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWF4KShfX2wtPl9NX2RlcHRoLCBfX3ItPl9NX2RlcHRoKSArIDEsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2wtPl9NX3NpemUuX01fZGF0YSArIF9fci0+X01fc2l6ZS5fTV9kYXRhLCBfX2EpLCBfTV9sZWZ0KF9fbCksIF9NX3JpZ2h0KF9fcikKKyAge30KKyMgaWZkZWYgX1NUTFBfTk9fQVJST1dfT1BFUkFUT1IKKyAgX1JvcGVfUm9wZUNvbmNhdGVuYXRpb24oKSB7fQorICBfUm9wZV9Sb3BlQ29uY2F0ZW5hdGlvbihjb25zdCBfUm9wZV9Sb3BlQ29uY2F0ZW5hdGlvbjxfQ2hhclQsIF9BbGxvYz4mKSB7fQorIyBlbmRpZgorCisgIH5fUm9wZV9Sb3BlQ29uY2F0ZW5hdGlvbigpIHsKKyAgICB0aGlzLT5fTV9mcmVlX2Nfc3RyaW5nKCk7CisgICAgX01fbGVmdC0+X01fdW5yZWZfbm9ubmlsKCk7CisgICAgX01fcmlnaHQtPl9NX3VucmVmX25vbm5pbCgpOworICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CitzdHJ1Y3QgX1JvcGVfUm9wZUZ1bmN0aW9uIDogcHVibGljIF9Sb3BlX1JvcGVSZXA8X0NoYXJULCBfQWxsb2M+IHsKK3ByaXZhdGU6CisgIHR5cGVkZWYgX1JvcGVfUm9wZVJlcDxfQ2hhclQsX0FsbG9jPiBfUm9wZVJlcDsKK3B1YmxpYzoKKyAgY2hhcl9wcm9kdWNlcjxfQ2hhclQ+KiBfTV9mbjsKKyAgLyoKKyAgICogQ2hhcl9wcm9kdWNlciBpcyBvd25lZCBieSB0aGUKKyAgICogcm9wZSBhbmQgc2hvdWxkIGJlIGV4cGxpY2l0bHkKKyAgICogZGVsZXRlZCB3aGVuIHRoZSByb3BlIGJlY29tZXMKKyAgICogaW5hY2Nlc3NpYmxlLgorICAgKi8KKyAgYm9vbCBfTV9kZWxldGVfd2hlbl9kb25lOworICBfU1RMUF9GT1JDRV9BTExPQ0FUT1JTKF9DaGFyVCwgX0FsbG9jKQorICB0eXBlZGVmIHR5cGVuYW1lIF9Sb3BlX1JvcGVSZXA8X0NoYXJULF9BbGxvYz46OmFsbG9jYXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOworIyBpZmRlZiBfU1RMUF9OT19BUlJPV19PUEVSQVRPUgorICBfUm9wZV9Sb3BlRnVuY3Rpb24oKSB7fQorICBfUm9wZV9Sb3BlRnVuY3Rpb24oY29uc3QgX1JvcGVfUm9wZUZ1bmN0aW9uPF9DaGFyVCwgX0FsbG9jPiYgKSB7fQorIyBlbmRpZgorCisgIF9Sb3BlX1JvcGVGdW5jdGlvbihjaGFyX3Byb2R1Y2VyPF9DaGFyVD4qIF9fZiwgc2l6ZV90IF9wX3NpemUsCisgICAgICAgICAgICAgICAgICAgICBib29sIF9fZCwgYWxsb2NhdG9yX3R5cGUgX19hKQorICAgIDogX1JvcGVfUm9wZVJlcDxfQ2hhclQsX0FsbG9jPihfUm9wZVJlcDo6X1NfZnVuY3Rpb24sIDAsIHRydWUsIF9wX3NpemUsIF9fYSksIF9NX2ZuKF9fZikKKyAgICAsIF9NX2RlbGV0ZV93aGVuX2RvbmUoX19kKQorICB7IF9TVExQX0FTU0VSVChfcF9zaXplID4gMCkgfQorCisgIH5fUm9wZV9Sb3BlRnVuY3Rpb24oKSB7CisgICAgdGhpcy0+X01fZnJlZV9jX3N0cmluZygpOworICAgIGlmIChfTV9kZWxldGVfd2hlbl9kb25lKSB7CisgICAgICBkZWxldGUgX01fZm47CisgICAgfQorICB9Cit9OworCisvKgorICogU3Vic3RyaW5nIHJlc3VsdHMgYXJlIHVzdWFsbHkgcmVwcmVzZW50ZWQgdXNpbmcganVzdAorICogY29uY2F0ZW5hdGlvbiBub2Rlcy4gIEJ1dCBpbiB0aGUgY2FzZSBvZiB2ZXJ5IGxvbmcgZmxhdCByb3BlcworICogb3Igcm9wZXMgd2l0aCBhIGZ1bmN0aW9uYWwgcmVwcmVzZW50YXRpb24gdGhhdCBpc24ndCBwcmFjdGljYWwuCisgKiBJbiB0aGF0IGNhc2UsIHdlIHJlcHJlc2VudCB0aGUgX19yZXN1bHQgYXMgYSBzcGVjaWFsIGNhc2Ugb2YKKyAqIFJvcGVGdW5jdGlvbiwgd2hvc2UgY2hhcl9wcm9kdWNlciBwb2ludHMgYmFjayB0byB0aGUgcm9wZSBpdHNlbGYuCisgKiBJbiBhbGwgY2FzZXMgZXhjZXB0IHJlcGVhdGVkIHN1YnN0cmluZyBvcGVyYXRpb25zIGFuZAorICogZGVhbGxvY2F0aW9uLCB3ZSB0cmVhdCB0aGUgX19yZXN1bHQgYXMgYSBSb3BlRnVuY3Rpb24uCisgKi8KK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorc3RydWN0IF9Sb3BlX1JvcGVTdWJzdHJpbmcgOiBwdWJsaWMgY2hhcl9wcm9kdWNlcjxfQ2hhclQ+LCBwdWJsaWMgX1JvcGVfUm9wZUZ1bmN0aW9uPF9DaGFyVCxfQWxsb2M+IHsKK3B1YmxpYzoKKyAgLy8gWFhYIHRoaXMgd2hvbGUgY2xhc3Mgc2hvdWxkIGJlIHJld3JpdHRlbi4KKyAgdHlwZWRlZiBfUm9wZV9Sb3BlUmVwPF9DaGFyVCxfQWxsb2M+IF9Sb3BlUmVwOworICBfUm9wZVJlcCAqX01fYmFzZTsgICAgICAvLyBub3QgMAorICBzaXplX3QgX01fc3RhcnQ7CisgIC8qIHZpcnR1YWwgKi8gdm9pZCBvcGVyYXRvcigpKHNpemVfdCBfX3N0YXJ0X3Bvcywgc2l6ZV90IF9fcmVxX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NoYXJUKiBfX2J1ZmZlcikgeworICAgIHR5cGVkZWYgX1JvcGVfUm9wZUZ1bmN0aW9uPF9DaGFyVCxfQWxsb2M+IF9Sb3BlRnVuY3Rpb247CisgICAgdHlwZWRlZiBfUm9wZV9Sb3BlTGVhZjxfQ2hhclQsX0FsbG9jPiBfUm9wZUxlYWY7CisgICAgc3dpdGNoIChfTV9iYXNlLT5fTV90YWcpIHsKKyAgICBjYXNlIF9Sb3BlUmVwOjpfU19mdW5jdGlvbjoKKyAgICBjYXNlIF9Sb3BlUmVwOjpfU19zdWJzdHJpbmdmbjoKKyAgICAgIHsKKyAgICAgICAgY2hhcl9wcm9kdWNlcjxfQ2hhclQ+KiBfX2ZuID0KKyAgICAgICAgICBfX1NUQVRJQ19DQVNUKF9Sb3BlRnVuY3Rpb24qLCBfTV9iYXNlKS0+X01fZm47CisgICAgICAgIF9TVExQX0FTU0VSVChfX3N0YXJ0X3BvcyArIF9fcmVxX2xlbiA8PSB0aGlzLT5fTV9zaXplLl9NX2RhdGEpCisgICAgICAgIF9TVExQX0FTU0VSVChfTV9zdGFydCArIHRoaXMtPl9NX3NpemUuX01fZGF0YSA8PSBfTV9iYXNlLT5fTV9zaXplLl9NX2RhdGEpCisgICAgICAgICgqX19mbikoX19zdGFydF9wb3MgKyBfTV9zdGFydCwgX19yZXFfbGVuLCBfX2J1ZmZlcik7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIF9Sb3BlUmVwOjpfU19sZWFmOgorICAgICAgeworICAgICAgICBfQ2hhclQqIF9fcyA9CisgICAgICAgICAgX19TVEFUSUNfQ0FTVChfUm9wZUxlYWYqLCBfTV9iYXNlKS0+X01fZGF0YTsKKyAgICAgICAgX1NUTFBfUFJJViBfX3Vjb3B5X24oX19zICsgX19zdGFydF9wb3MgKyBfTV9zdGFydCwgX19yZXFfbGVuLCBfX2J1ZmZlcik7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgX1NUTFBfQVNTRVJUKGZhbHNlKQorICAgICAgICA7CisgICAgfQorICB9CisKKyAgX1NUTFBfRk9SQ0VfQUxMT0NBVE9SUyhfQ2hhclQsIF9BbGxvYykKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUm9wZVJlcDo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7CisKKyAgX1JvcGVfUm9wZVN1YnN0cmluZyhfUm9wZVJlcCogX19iLCBzaXplX3QgX19zLCBzaXplX3QgX19sLCBhbGxvY2F0b3JfdHlwZSBfX2EpCisgICAgOiBfUm9wZV9Sb3BlRnVuY3Rpb248X0NoYXJULF9BbGxvYz4odGhpcywgX19sLCBmYWxzZSwgX19hKSwKKyAgICAgIF9NX2Jhc2UoX19iKSwgX01fc3RhcnQoX19zKSB7CisgICAgX1NUTFBfQVNTRVJUKF9fbCA+IDApCisgICAgX1NUTFBfQVNTRVJUKF9fcyArIF9fbCA8PSBfX2ItPl9NX3NpemUuX01fZGF0YSkKKyAgICBfTV9iYXNlLT5fTV9yZWZfbm9ubmlsKCk7CisgICAgdGhpcy0+X01fdGFnID0gX1JvcGVSZXA6Ol9TX3N1YnN0cmluZ2ZuOworICB9CisgIHZpcnR1YWwgfl9Sb3BlX1JvcGVTdWJzdHJpbmcoKQorICB7IF9NX2Jhc2UtPl9NX3VucmVmX25vbm5pbCgpOyB9Cit9OworCisvKgorICogU2VsZi1kZXN0cnVjdGluZyBwb2ludGVycyB0byBSb3BlX3JlcC4KKyAqIFRoZXNlIGFyZSBub3QgY29udmVudGlvbmFsIHNtYXJ0IHBvaW50ZXJzLiAgVGhlaXIKKyAqIG9ubHkgcHVycG9zZSBpbiBsaWZlIGlzIHRvIGVuc3VyZSB0aGF0IHVucmVmIGlzIGNhbGxlZAorICogb24gdGhlIHBvaW50ZXIgZWl0aGVyIGF0IG5vcm1hbCBleGl0IG9yIGlmIGFuIGV4Y2VwdGlvbgorICogaXMgcmFpc2VkLiAgSXQgaXMgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvCisgKiBhZGp1c3QgcmVmZXJlbmNlIGNvdW50cyB3aGVuIHRoZXNlIHBvaW50ZXJzIGFyZSBpbml0aWFsaXplZAorICogb3IgYXNzaWduZWQgdG8uICAoVGhpcyBjb252ZW50aW9uIHNpZ25pZmljYW50bHkgcmVkdWNlcworICogdGhlIG51bWJlciBvZiBwb3RlbnRpYWxseSBleHBlbnNpdmUgcmVmZXJlbmNlIGNvdW50CisgKiB1cGRhdGVzLikKKyAqLwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CitzdHJ1Y3QgX1JvcGVfc2VsZl9kZXN0cnVjdF9wdHIgeworICBfUm9wZV9Sb3BlUmVwPF9DaGFyVCxfQWxsb2M+KiBfTV9wdHI7CisgIH5fUm9wZV9zZWxmX2Rlc3RydWN0X3B0cigpCisgIHsgX1JvcGVfUm9wZVJlcDxfQ2hhclQsX0FsbG9jPjo6X1NfdW5yZWYoX01fcHRyKTsgfQorIyAgIGlmZGVmIF9TVExQX1VTRV9FWENFUFRJT05TCisgIF9Sb3BlX3NlbGZfZGVzdHJ1Y3RfcHRyKCkgOiBfTV9wdHIoMCkge30KKyMgICBlbHNlCisgIF9Sb3BlX3NlbGZfZGVzdHJ1Y3RfcHRyKCkge30KKyMgICBlbmRpZgorICBfUm9wZV9zZWxmX2Rlc3RydWN0X3B0cihfUm9wZV9Sb3BlUmVwPF9DaGFyVCxfQWxsb2M+KiBfX3ApIDogX01fcHRyKF9fcCkge30KKyAgX1JvcGVfUm9wZVJlcDxfQ2hhclQsX0FsbG9jPiYgb3BlcmF0b3IqKCkgeyByZXR1cm4gKl9NX3B0cjsgfQorICBfUm9wZV9Sb3BlUmVwPF9DaGFyVCxfQWxsb2M+KiBvcGVyYXRvci0+KCkgeyByZXR1cm4gX01fcHRyOyB9CisgIG9wZXJhdG9yIF9Sb3BlX1JvcGVSZXA8X0NoYXJULF9BbGxvYz4qKCkgeyByZXR1cm4gX01fcHRyOyB9CisgIF9Sb3BlX3NlbGZfZGVzdHJ1Y3RfcHRyPF9DaGFyVCwgX0FsbG9jPiYKKyAgb3BlcmF0b3I9IChfUm9wZV9Sb3BlUmVwPF9DaGFyVCxfQWxsb2M+KiBfX3gpCisgIHsgX01fcHRyID0gX194OyByZXR1cm4gKnRoaXM7IH0KK307CisKKy8qCisgKiBEZXJlZmVyZW5jaW5nIGEgbm9uY29uc3QgaXRlcmF0b3IgaGFzIHRvIHJldHVybiBzb21ldGhpbmcKKyAqIHRoYXQgYmVoYXZlcyBhbG1vc3QgbGlrZSBhIHJlZmVyZW5jZS4gIEl0J3Mgbm90IHBvc3NpYmxlIHRvCisgKiByZXR1cm4gYW4gYWN0dWFsIHJlZmVyZW5jZSBzaW5jZSBhc3NpZ25tZW50IHJlcXVpcmVzIGV4dHJhCisgKiB3b3JrLiAgQW5kIHdlIHdvdWxkIGdldCBpbnRvIHRoZSBzYW1lIHByb2JsZW1zIGFzIHdpdGggdGhlCisgKiBDRDIgdmVyc2lvbiBvZiBiYXNpY19zdHJpbmcuCisgKi8KK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorY2xhc3MgX1JvcGVfY2hhcl9yZWZfcHJveHkgeworICB0eXBlZGVmIF9Sb3BlX2NoYXJfcmVmX3Byb3h5PF9DaGFyVCwgX0FsbG9jPiBfU2VsZjsKKyAgZnJpZW5kIGNsYXNzIHJvcGU8X0NoYXJULF9BbGxvYz47CisgIGZyaWVuZCBjbGFzcyBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPjsKKyAgZnJpZW5kIGNsYXNzIF9Sb3BlX2NoYXJfcHRyX3Byb3h5PF9DaGFyVCxfQWxsb2M+OworICB0eXBlZGVmIF9Sb3BlX3NlbGZfZGVzdHJ1Y3RfcHRyPF9DaGFyVCxfQWxsb2M+IF9TZWxmX2Rlc3RydWN0X3B0cjsKKyAgdHlwZWRlZiBfUm9wZV9Sb3BlUmVwPF9DaGFyVCxfQWxsb2M+IF9Sb3BlUmVwOworICB0eXBlZGVmIHJvcGU8X0NoYXJULF9BbGxvYz4gX015X3JvcGU7CisgIHNpemVfdCBfTV9wb3M7CisgIF9DaGFyVCBfTV9jdXJyZW50OworICBib29sIF9NX2N1cnJlbnRfdmFsaWQ7CisgIF9NeV9yb3BlKiBfTV9yb290OyAgICAgLy8gVGhlIHdob2xlIHJvcGUuCitwdWJsaWM6CisgIF9Sb3BlX2NoYXJfcmVmX3Byb3h5KF9NeV9yb3BlKiBfX3IsIHNpemVfdCBfX3ApIDoKKyAgICBfTV9wb3MoX19wKSwgX01fY3VycmVudF92YWxpZChmYWxzZSksIF9NX3Jvb3QoX19yKSB7fQorICBfUm9wZV9jaGFyX3JlZl9wcm94eShjb25zdCBfU2VsZiYgX194KSA6CisgICAgX01fcG9zKF9feC5fTV9wb3MpLCBfTV9jdXJyZW50X3ZhbGlkKGZhbHNlKSwgX01fcm9vdChfX3guX01fcm9vdCkge30KKyAgLy8gRG9uJ3QgcHJlc2VydmUgY2FjaGUgaWYgdGhlIHJlZmVyZW5jZSBjYW4gb3V0bGl2ZSB0aGUKKyAgLy8gZXhwcmVzc2lvbi4gIFdlIGNsYWltIHRoYXQncyBub3QgcG9zc2libGUgd2l0aG91dCBjYWxsaW5nCisgIC8vIGEgY29weSBjb25zdHJ1Y3RvciBvciBnZW5lcmF0aW5nIHJlZmVyZW5jZSB0byBhIHByb3h5CisgIC8vIHJlZmVyZW5jZS4gIFdlIGRlY2xhcmUgdGhlIGxhdHRlciB0byBoYXZlIHVuZGVmaW5lZCBzZW1hbnRpY3MuCisgIF9Sb3BlX2NoYXJfcmVmX3Byb3h5KF9NeV9yb3BlKiBfX3IsIHNpemVfdCBfX3AsIF9DaGFyVCBfX2MpCisgICAgOiBfTV9wb3MoX19wKSwgX01fY3VycmVudChfX2MpLCBfTV9jdXJyZW50X3ZhbGlkKHRydWUpLCBfTV9yb290KF9fcikge30KKyAgaW5saW5lIG9wZXJhdG9yIF9DaGFyVCAoKSBjb25zdDsKKyAgX1NlbGYmIG9wZXJhdG9yPSAoX0NoYXJUIF9fYyk7CisgIF9Sb3BlX2NoYXJfcHRyX3Byb3h5PF9DaGFyVCwgX0FsbG9jPiBvcGVyYXRvciYgKCkgY29uc3Q7CisgIF9TZWxmJiBvcGVyYXRvcj0gKGNvbnN0IF9TZWxmJiBfX2MpIHsKKyAgICByZXR1cm4gb3BlcmF0b3I9KChfQ2hhclQpX19jKTsKKyAgfQorfTsKKworI2lmZGVmIF9TVExQX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUgordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfX0FsbG9jPgoraW5saW5lIHZvaWQgc3dhcChfUm9wZV9jaGFyX3JlZl9wcm94eSA8X0NoYXJULCBfX0FsbG9jID4gX19hLAorICAgICAgICAgICAgICAgICBfUm9wZV9jaGFyX3JlZl9wcm94eSA8X0NoYXJULCBfX0FsbG9jID4gX19iKSB7CisgIF9DaGFyVCBfX3RtcCA9IF9fYTsKKyAgX19hID0gX19iOworICBfX2IgPSBfX3RtcDsKK30KKyNlbHNlCisvLyBUaGVyZSBpcyBubyByZWFsbHkgYWNjZXB0YWJsZSB3YXkgdG8gaGFuZGxlIHRoaXMuICBUaGUgZGVmYXVsdAorLy8gZGVmaW5pdGlvbiBvZiBzd2FwIGRvZXNuJ3Qgd29yayBmb3IgcHJveHkgcmVmZXJlbmNlcy4KKy8vIEl0IGNhbid0IHJlYWxseSBiZSBtYWRlIHRvIHdvcmssIGV2ZW4gd2l0aCB1Z2x5IGhhY2tzLCBzaW5jZQorLy8gdGhlIG9ubHkgdW51c3VhbCBvcGVyYXRpb24gaXQgdXNlcyBpcyB0aGUgY29weSBjb25zdHJ1Y3Rvciwgd2hpY2gKKy8vIGlzIG5lZWRlZCBmb3Igb3RoZXIgcHVycG9zZXMuICBXZSBwcm92aWRlIGEgbWFjcm8gZm9yCisvLyBmdWxsIHNwZWNpYWxpemF0aW9ucywgYW5kIGluc3RhbnRpYXRlIHRoZSBtb3N0IGNvbW1vbiBjYXNlLgorIyBkZWZpbmUgX1JPUEVfU1dBUF9TUEVDSUFMSVpBVElPTihfQ2hhclQsIF9fQWxsb2MpIFwKKyAgICBpbmxpbmUgdm9pZCBzd2FwKF9Sb3BlX2NoYXJfcmVmX3Byb3h5IDxfQ2hhclQsIF9fQWxsb2MgPiBfX2EsIFwKKyAgICAgICAgICAgICAgICAgICAgIF9Sb3BlX2NoYXJfcmVmX3Byb3h5IDxfQ2hhclQsIF9fQWxsb2MgPiBfX2IpIHsgXAorICAgICAgICBfQ2hhclQgX190bXAgPSBfX2E7IFwKKyAgICAgICAgX19hID0gX19iOyBcCisgICAgICAgIF9fYiA9IF9fdG1wOyBcCisgICAgfQorCitfUk9QRV9TV0FQX1NQRUNJQUxJWkFUSU9OKGNoYXIsIGFsbG9jYXRvcjxjaGFyPikKKworIyBpZm5kZWYgX1NUTFBfTk9fV0NIQVJfVAorX1JPUEVfU1dBUF9TUEVDSUFMSVpBVElPTih3Y2hhcl90LCBhbGxvY2F0b3I8d2NoYXJfdD4pCisjIGVuZGlmCisKKyNlbmRpZiAvKiAhX1NUTFBfRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSICovCisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorY2xhc3MgX1JvcGVfY2hhcl9wdHJfcHJveHkgeworICAvLyBYWFggdGhpcyBjbGFzcyBzaG91bGQgYmUgcmV3cml0dGVuLgorcHVibGljOgorICB0eXBlZGVmIF9Sb3BlX2NoYXJfcHRyX3Byb3h5PF9DaGFyVCwgX0FsbG9jPiBfU2VsZjsKKyAgZnJpZW5kIGNsYXNzIF9Sb3BlX2NoYXJfcmVmX3Byb3h5PF9DaGFyVCxfQWxsb2M+OworICBzaXplX3QgX01fcG9zOworICByb3BlPF9DaGFyVCxfQWxsb2M+KiBfTV9yb290OyAgICAgLy8gVGhlIHdob2xlIHJvcGUuCisKKyAgX1JvcGVfY2hhcl9wdHJfcHJveHkoY29uc3QgX1JvcGVfY2hhcl9yZWZfcHJveHk8X0NoYXJULF9BbGxvYz4mIF9feCkKKyAgICA6IF9NX3BvcyhfX3guX01fcG9zKSwgX01fcm9vdChfX3guX01fcm9vdCkge30KKyAgX1JvcGVfY2hhcl9wdHJfcHJveHkoY29uc3QgX1NlbGYmIF9feCkKKyAgICA6IF9NX3BvcyhfX3guX01fcG9zKSwgX01fcm9vdChfX3guX01fcm9vdCkge30KKyAgX1JvcGVfY2hhcl9wdHJfcHJveHkoKSB7fQorICBfUm9wZV9jaGFyX3B0cl9wcm94eShfQ2hhclQqIF9feCkgOiBfTV9wb3MoMCksIF9NX3Jvb3QoMCkgeworICAgIF9TVExQX0FTU0VSVCgwID09IF9feCkKKyAgfQorICBfU2VsZiYgb3BlcmF0b3I9IChjb25zdCBfU2VsZiYgX194KSB7CisgICAgX01fcG9zID0gX194Ll9NX3BvczsKKyAgICBfTV9yb290ID0gX194Ll9NX3Jvb3Q7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgX1JvcGVfY2hhcl9yZWZfcHJveHk8X0NoYXJULF9BbGxvYz4gb3BlcmF0b3IqKCkgY29uc3QgeworICAgIHJldHVybiBfUm9wZV9jaGFyX3JlZl9wcm94eTxfQ2hhclQsX0FsbG9jPihfTV9yb290LCBfTV9wb3MpOworICB9Cit9OworCisKKy8qCisgKiBSb3BlIGl0ZXJhdG9yczoKKyAqIFVubGlrZSBpbiB0aGUgQyB2ZXJzaW9uLCB3ZSBjYWNoZSBvbmx5IHBhcnQgb2YgdGhlIHN0YWNrCisgKiBmb3Igcm9wZSBpdGVyYXRvcnMsIHNpbmNlIHRoZXkgbXVzdCBiZSBlZmZpY2llbnRseSBjb3B5YWJsZS4KKyAqIFdoZW4gd2UgcnVuIG91dCBvZiBjYWNoZSwgd2UgaGF2ZSB0byByZWNvbnN0cnVjdCB0aGUgaXRlcmF0b3IKKyAqIHZhbHVlLgorICogUG9pbnRlcnMgZnJvbSBpdGVyYXRvcnMgYXJlIG5vdCBpbmNsdWRlZCBpbiByZWZlcmVuY2UgY291bnRzLgorICogSXRlcmF0b3JzIGFyZSBhc3N1bWVkIHRvIGJlIHRocmVhZCBwcml2YXRlLiAgUm9wZXMgY2FuCisgKiBiZSBzaGFyZWQuCisgKi8KK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorY2xhc3MgX1JvcGVfaXRlcmF0b3JfYmFzZQorLyogICA6IHB1YmxpYyByYW5kb21fYWNjZXNzX2l0ZXJhdG9yPF9DaGFyVCwgcHRyZGlmZl90PiAgKi8KK3sKKyAgZnJpZW5kIGNsYXNzIHJvcGU8X0NoYXJULF9BbGxvYz47CisgIHR5cGVkZWYgX1JvcGVfaXRlcmF0b3JfYmFzZTxfQ2hhclQsIF9BbGxvYz4gX1NlbGY7CisgIHR5cGVkZWYgX1JvcGVfUm9wZUNvbmNhdGVuYXRpb248X0NoYXJULF9BbGxvYz4gX1JvcGVDb25jYXQ7CitwdWJsaWM6CisgIHR5cGVkZWYgX1JvcGVfUm9wZVJlcDxfQ2hhclQsX0FsbG9jPiBfUm9wZVJlcDsKKworICBlbnVtIHsgX1NfcGF0aF9jYWNoZV9sZW4gPSA0IH07IC8vIE11c3QgYmUgPD0gOSBiZWNhdXNlIG9mIF9NX3BhdGhfZGlyZWN0aW9uLgorICBlbnVtIHsgX1NfaXRlcmF0b3JfYnVmX2xlbiA9IDE1IH07CisgIHNpemVfdCBfTV9jdXJyZW50X3BvczsKKyAgLy8gVGhlIHdob2xlIHJvcGUuCisgIF9Sb3BlUmVwKiBfTV9yb290OworICAvLyBTdGFydGluZyBwb3NpdGlvbiBmb3IgY3VycmVudCBsZWFmCisgIHNpemVfdCBfTV9sZWFmX3BvczsKKyAgLy8gQnVmZmVyIHBvc3NpYmx5IGNvbnRhaW5pbmcgY3VycmVudCBjaGFyLgorICBfQ2hhclQqIF9NX2J1Zl9zdGFydDsKKyAgLy8gUG9pbnRlciB0byBjdXJyZW50IGNoYXIgaW4gYnVmZmVyLCAhPSAwID09PiBidWZmZXIgdmFsaWQuCisgIF9DaGFyVCogX01fYnVmX3B0cjsKKyAgLy8gT25lIHBhc3QgX19sYXN0IHZhbGlkIGNoYXIgaW4gYnVmZmVyLgorICBfQ2hhclQqIF9NX2J1Zl9lbmQ7CisKKyAgLy8gV2hhdCBmb2xsb3dzIGlzIHRoZSBwYXRoIGNhY2hlLiAgV2UgZ28gb3V0IG9mIG91cgorICAvLyB3YXkgdG8gbWFrZSB0aGlzIGNvbXBhY3QuCisgIC8vIFBhdGhfZW5kIGNvbnRhaW5zIHRoZSBib3R0b20gc2VjdGlvbiBvZiB0aGUgcGF0aCBmcm9tCisgIC8vIHRoZSByb290IHRvIHRoZSBjdXJyZW50IGxlYWYuCisgIHN0cnVjdCB7CisjICBpZiBkZWZpbmVkIChfX0JPUkxBTkRDX18pICYmIChfX0JPUkxBTkRDX18gPCAweDU2MCkKKyAgICBfUm9wZVJlcCBjb25zdCpfTV9kYXRhWzRdOworIyAgZWxzZQorICAgIF9Sb3BlUmVwIGNvbnN0Kl9NX2RhdGFbX1NfcGF0aF9jYWNoZV9sZW5dOworIyAgZW5kaWYKKyAgfSBfTV9wYXRoX2VuZDsKKyAgLy8gTGFzdCB2YWxpZCBfX3BvcyBpbiBwYXRoX2VuZDsKKyAgLy8gX01fcGF0aF9lbmRbMF0gLi4uIF9NX3BhdGhfZW5kW19NX2xlYWZfaW5kZXgtMV0KKyAgLy8gcG9pbnQgdG8gY29uY2F0ZW5hdGlvbiBub2Rlcy4KKyAgaW50IF9NX2xlYWZfaW5kZXg7CisgIC8vIChfTV9wYXRoX2RpcmVjdGlvbnMgPj4gX19pKSAmIDEgaXMgMQorICAvLyBpZiB3ZSBnb3QgZnJvbSBfTV9wYXRoX2VuZFtsZWFmX2luZGV4IC0gX19pIC0gMV0KKyAgLy8gdG8gX01fcGF0aF9lbmRbbGVhZl9pbmRleCAtIF9faV0gYnkgZ29pbmcgdG8gdGhlCisgIC8vIF9fcmlnaHQuIEFzc3VtZXMgcGF0aF9jYWNoZV9sZW4gPD0gOS4KKyAgdW5zaWduZWQgY2hhciBfTV9wYXRoX2RpcmVjdGlvbnM7CisgIC8vIFNob3J0IGJ1ZmZlciBmb3Igc3Vycm91bmRpbmcgY2hhcnMuCisgIC8vIFRoaXMgaXMgdXNlZnVsIHByaW1hcmlseSBmb3IKKyAgLy8gUm9wZUZ1bmN0aW9ucy4gIFdlIHB1dCB0aGUgYnVmZmVyCisgIC8vIGhlcmUgdG8gYXZvaWQgbG9ja2luZyBpbiB0aGUKKyAgLy8gbXVsdGl0aHJlYWRlZCBjYXNlLgorICAvLyBUaGUgY2FjaGVkIHBhdGggaXMgZ2VuZXJhbGx5IGFzc3VtZWQgdG8gYmUgdmFsaWQKKyAgLy8gb25seSBpZiB0aGUgYnVmZmVyIGlzIHZhbGlkLgorICBzdHJ1Y3QgeworIyAgaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKSAmJiAoX19CT1JMQU5EQ19fIDwgMHg1NjApCisgICAgX0NoYXJUIF9NX2RhdGFbMTVdOworIyAgZWxzZQorICAgIF9DaGFyVCBfTV9kYXRhW19TX2l0ZXJhdG9yX2J1Zl9sZW5dOworIyAgZW5kaWYKKyAgfSBfTV90bXBfYnVmOworCisgIC8vIFNldCBidWZmZXIgY29udGVudHMgZ2l2ZW4gcGF0aCBjYWNoZS4KKyAgc3RhdGljIHZvaWQgX1Nfc2V0YnVmKF9Sb3BlX2l0ZXJhdG9yX2Jhc2U8X0NoYXJULCBfQWxsb2M+JiBfX3gpOworICAvLyBTZXQgYnVmZmVyIGNvbnRlbnRzIGFuZCBwYXRoIGNhY2hlLgorICBzdGF0aWMgdm9pZCBfU19zZXRjYWNoZShfUm9wZV9pdGVyYXRvcl9iYXNlPF9DaGFyVCwgX0FsbG9jPiYgX194KTsKKyAgLy8gQXMgYWJvdmUsIGJ1dCBhc3N1bWVzIHBhdGggY2FjaGUgaXMgdmFsaWQgZm9yIHByZXZpb3VzIHBvc24uCisgIHN0YXRpYyB2b2lkIF9TX3NldGNhY2hlX2Zvcl9pbmNyKF9Sb3BlX2l0ZXJhdG9yX2Jhc2U8X0NoYXJULCBfQWxsb2M+JiBfX3gpOworICBfUm9wZV9pdGVyYXRvcl9iYXNlKCkge30KKyAgX1JvcGVfaXRlcmF0b3JfYmFzZShfUm9wZVJlcCogX19yb290LCBzaXplX3QgX19wb3MpCisgICAgOiBfTV9jdXJyZW50X3BvcyhfX3BvcyksX01fcm9vdChfX3Jvb3QpLCAgX01fYnVmX3B0cigwKSB7fQorICB2b2lkIF9NX2luY3Ioc2l6ZV90IF9fbik7CisgIHZvaWQgX01fZGVjcihzaXplX3QgX19uKTsKK3B1YmxpYzoKKyAgc2l6ZV90IGluZGV4KCkgY29uc3QgeyByZXR1cm4gX01fY3VycmVudF9wb3M7IH0KK3ByaXZhdGU6CisgIHZvaWQgX01fY29weV9idWYoY29uc3QgX1NlbGYmIF9feCkgeworICAgIF9NX3RtcF9idWYgPSBfX3guX01fdG1wX2J1ZjsKKyAgICBpZiAoX194Ll9NX2J1Zl9zdGFydCA9PSBfX3guX01fdG1wX2J1Zi5fTV9kYXRhKSB7CisgICAgICBfTV9idWZfc3RhcnQgPSBfTV90bXBfYnVmLl9NX2RhdGE7CisgICAgICBfTV9idWZfZW5kID0gX01fYnVmX3N0YXJ0ICsgKF9feC5fTV9idWZfZW5kIC0gX194Ll9NX2J1Zl9zdGFydCk7CisgICAgICBfTV9idWZfcHRyID0gX01fYnVmX3N0YXJ0ICsgKF9feC5fTV9idWZfcHRyIC0gX194Ll9NX2J1Zl9zdGFydCk7CisgICAgfSBlbHNlIHsKKyAgICAgIF9NX2J1Zl9lbmQgPSBfX3guX01fYnVmX2VuZDsKKyAgICB9CisgIH0KKworcHVibGljOgorICBfUm9wZV9pdGVyYXRvcl9iYXNlKGNvbnN0IF9TZWxmJiBfX3gpIDogCisgICAgICBfTV9jdXJyZW50X3BvcyhfX3guX01fY3VycmVudF9wb3MpLAorICAgICAgX01fcm9vdChfX3guX01fcm9vdCksCisgICAgICBfTV9sZWFmX3BvcyggX194Ll9NX2xlYWZfcG9zICksCisgICAgICBfTV9idWZfc3RhcnQoX194Ll9NX2J1Zl9zdGFydCksCisgICAgICBfTV9idWZfcHRyKF9feC5fTV9idWZfcHRyKSwKKyAgICAgIF9NX3BhdGhfZW5kKF9feC5fTV9wYXRoX2VuZCksCisgICAgICBfTV9sZWFmX2luZGV4KF9feC5fTV9sZWFmX2luZGV4KSwKKyAgICAgIF9NX3BhdGhfZGlyZWN0aW9ucyhfX3guX01fcGF0aF9kaXJlY3Rpb25zKQorICAgICAgeworICAgICAgICBpZiAoMCAhPSBfX3guX01fYnVmX3B0cikgeworICAgICAgICAgIF9NX2NvcHlfYnVmKF9feCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgX1NlbGYmIG9wZXJhdG9yID0gKGNvbnN0IF9TZWxmJiBfX3gpCisgICAgICB7CisgICAgICAgIF9NX2N1cnJlbnRfcG9zID0gX194Ll9NX2N1cnJlbnRfcG9zOworICAgICAgICBfTV9yb290ID0gX194Ll9NX3Jvb3Q7CisgICAgICAgIF9NX2J1Zl9zdGFydCA9IF9feC5fTV9idWZfc3RhcnQ7CisgICAgICAgIF9NX2J1Zl9wdHIgPSBfX3guX01fYnVmX3B0cjsKKyAgICAgICAgX01fcGF0aF9lbmQgPSBfX3guX01fcGF0aF9lbmQ7CisgICAgICAgIF9NX2xlYWZfaW5kZXggPSBfX3guX01fbGVhZl9pbmRleDsKKyAgICAgICAgX01fcGF0aF9kaXJlY3Rpb25zID0gX194Ll9NX3BhdGhfZGlyZWN0aW9uczsKKyAgICAgICAgX01fbGVhZl9wb3MgPSBfX3guX01fbGVhZl9wb3M7CisgICAgICAgIGlmICgwICE9IF9feC5fTV9idWZfcHRyKSB7CisgICAgICAgICAgX01fY29weV9idWYoX194KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICB9Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4gY2xhc3MgX1JvcGVfaXRlcmF0b3I7CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorY2xhc3MgX1JvcGVfY29uc3RfaXRlcmF0b3IgOiBwdWJsaWMgX1JvcGVfaXRlcmF0b3JfYmFzZTxfQ2hhclQsX0FsbG9jPiB7CisgIGZyaWVuZCBjbGFzcyByb3BlPF9DaGFyVCxfQWxsb2M+OworICB0eXBlZGVmICBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4gX1NlbGY7CisgIHR5cGVkZWYgX1JvcGVfaXRlcmF0b3JfYmFzZTxfQ2hhclQsX0FsbG9jPiBfQmFzZTsKKyAgLy8gIHByb3RlY3RlZDoKK3B1YmxpYzoKKyMgICBpZm5kZWYgX1NUTFBfSEFTX05PX05BTUVTUEFDRVMKKyAgdHlwZWRlZiBfUm9wZV9Sb3BlUmVwPF9DaGFyVCxfQWxsb2M+IF9Sb3BlUmVwOworICAvLyBUaGUgb25lIGZyb20gdGhlIGJhc2UgY2xhc3MgbWF5IG5vdCBiZSBkaXJlY3RseSB2aXNpYmxlLgorIyAgIGVuZGlmCisgIF9Sb3BlX2NvbnN0X2l0ZXJhdG9yKGNvbnN0IF9Sb3BlUmVwKiBfX3Jvb3QsIHNpemVfdCBfX3Bvcyk6CisgICAgX1JvcGVfaXRlcmF0b3JfYmFzZTxfQ2hhclQsX0FsbG9jPihfX0NPTlNUX0NBU1QoX1JvcGVSZXAqLF9fcm9vdCksIF9fcG9zKQorICAgIC8vIE9ubHkgbm9uY29uc3QgaXRlcmF0b3JzIG1vZGlmeSByb290IHJlZiBjb3VudAorICB7fQorcHVibGljOgorICB0eXBlZGVmIF9DaGFyVCByZWZlcmVuY2U7ICAgLy8gUmVhbGx5IGEgdmFsdWUuICBSZXR1cm5pbmcgYSByZWZlcmVuY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdvdWxkIGJlIGEgbWVzcywgc2luY2UgaXQgd291bGQgaGF2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gYmUgaW5jbHVkZWQgaW4gcmVmY291bnQuCisgIHR5cGVkZWYgY29uc3QgX0NoYXJUKiBwb2ludGVyOworICB0eXBlZGVmIF9DaGFyVCB2YWx1ZV90eXBlOworICB0eXBlZGVmIHB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7CisgIHR5cGVkZWYgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CisKK3B1YmxpYzoKKyAgX1JvcGVfY29uc3RfaXRlcmF0b3IoKSB7fQorICBfUm9wZV9jb25zdF9pdGVyYXRvcihjb25zdCBfU2VsZiYgX194KSA6CisgICAgX1JvcGVfaXRlcmF0b3JfYmFzZTxfQ2hhclQsX0FsbG9jPihfX3gpIHsgfQorICBfUm9wZV9jb25zdF9pdGVyYXRvcihjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPiYgX194KToKKyAgICBfUm9wZV9pdGVyYXRvcl9iYXNlPF9DaGFyVCxfQWxsb2M+KF9feCkge30KKyAgX1JvcGVfY29uc3RfaXRlcmF0b3IoY29uc3Qgcm9wZTxfQ2hhclQsX0FsbG9jPiYgX19yLCBzaXplX3QgX19wb3MpIDoKKyAgICBfUm9wZV9pdGVyYXRvcl9iYXNlPF9DaGFyVCxfQWxsb2M+KF9fci5fTV90cmVlX3B0ci5fTV9kYXRhLCBfX3Bvcykge30KKyAgX1NlbGYmIG9wZXJhdG9yPSAoY29uc3QgX1NlbGYmIF9feCkgeworICAgIF9CYXNlOjpvcGVyYXRvcj0oX194KTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgcmVmZXJlbmNlIG9wZXJhdG9yKigpIHsKKyAgICBpZiAoMCA9PSB0aGlzLT5fTV9idWZfcHRyKQorI2lmICFkZWZpbmVkIChfX0RNQ19fKQorICAgICAgX1Nfc2V0Y2FjaGUoKnRoaXMpOworI2Vsc2UKKyAgICB7IF9Sb3BlX2l0ZXJhdG9yX2Jhc2U8X0NoYXJULCBfQWxsb2M+KiBfX3ggPSB0aGlzOyBfU19zZXRjYWNoZSgqX194KTsgfQorI2VuZGlmCisgICAgcmV0dXJuICoodGhpcy0+X01fYnVmX3B0cik7CisgIH0KKyAgX1NlbGYmIG9wZXJhdG9yKysoKQorICAgICAgeworICAgICAgICBpZiAoIHRoaXMtPl9NX2J1Zl9wdHIgIT0gMCApIHsKKyAgICAgICAgICBfQ2hhclQgKl9fbmV4dCA9IHRoaXMtPl9NX2J1Zl9wdHIgKyAxOworICAgICAgICAgIGlmICggX19uZXh0IDwgdGhpcy0+X01fYnVmX2VuZCApIHsKKyAgICAgICAgICAgIHRoaXMtPl9NX2J1Zl9wdHIgPSBfX25leHQ7CisgICAgICAgICAgICArK3RoaXMtPl9NX2N1cnJlbnRfcG9zOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0aGlzLT5fTV9pbmNyKDEpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICB9CisgIF9TZWxmJiBvcGVyYXRvcis9KHB0cmRpZmZfdCBfX24pIHsKKyAgICBpZiAoX19uID49IDApIHsKKyAgICAgIHRoaXMtPl9NX2luY3IoX19uKTsKKyAgICB9IGVsc2UgeworICAgICAgdGhpcy0+X01fZGVjcigtX19uKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIF9TZWxmJiBvcGVyYXRvci0tKCkgeworICAgIHRoaXMtPl9NX2RlY3IoMSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIF9TZWxmJiBvcGVyYXRvci09KHB0cmRpZmZfdCBfX24pIHsKKyAgICBpZiAoX19uID49IDApIHsKKyAgICAgIHRoaXMtPl9NX2RlY3IoX19uKTsKKyAgICB9IGVsc2UgeworICAgICAgdGhpcy0+X01faW5jcigtX19uKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIF9TZWxmIG9wZXJhdG9yKysoaW50KSB7CisgICAgc2l6ZV90IF9fb2xkX3BvcyA9IHRoaXMtPl9NX2N1cnJlbnRfcG9zOworICAgIHRoaXMtPl9NX2luY3IoMSk7CisgICAgcmV0dXJuIF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+KHRoaXMtPl9NX3Jvb3QsIF9fb2xkX3Bvcyk7CisgICAgLy8gVGhpcyBtYWtlcyBhIHN1YnNlcXVlbnQgZGVyZWZlcmVuY2UgZXhwZW5zaXZlLgorICAgIC8vIFBlcmhhcHMgd2Ugc2hvdWxkIGluc3RlYWQgY29weSB0aGUgaXRlcmF0b3IKKyAgICAvLyBpZiBpdCBoYXMgYSB2YWxpZCBjYWNoZT8KKyAgfQorICBfU2VsZiBvcGVyYXRvci0tKGludCkgeworICAgIHNpemVfdCBfX29sZF9wb3MgPSB0aGlzLT5fTV9jdXJyZW50X3BvczsKKyAgICB0aGlzLT5fTV9kZWNyKDEpOworICAgIHJldHVybiBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPih0aGlzLT5fTV9yb290LCBfX29sZF9wb3MpOworICB9CisgIGlubGluZSByZWZlcmVuY2Ugb3BlcmF0b3JbXShzaXplX3QgX19uKTsKK307CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorY2xhc3MgX1JvcGVfaXRlcmF0b3IgOiBwdWJsaWMgX1JvcGVfaXRlcmF0b3JfYmFzZTxfQ2hhclQsX0FsbG9jPiB7CisgIGZyaWVuZCBjbGFzcyByb3BlPF9DaGFyVCxfQWxsb2M+OworICB0eXBlZGVmIF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiBfU2VsZjsKKyAgdHlwZWRlZiBfUm9wZV9pdGVyYXRvcl9iYXNlPF9DaGFyVCxfQWxsb2M+IF9CYXNlOworICB0eXBlZGVmIF9Sb3BlX1JvcGVSZXA8X0NoYXJULF9BbGxvYz4gX1JvcGVSZXA7CisKK3B1YmxpYzoKKyAgcm9wZTxfQ2hhclQsX0FsbG9jPiogX01fcm9vdF9yb3BlOworICAvLyByb290IGlzIHRyZWF0ZWQgYXMgYSBjYWNoZWQgdmVyc2lvbiBvZiB0aGlzLAorICAvLyBhbmQgaXMgdXNlZCB0byBkZXRlY3QgY2hhbmdlcyB0byB0aGUgdW5kZXJseWluZworICAvLyByb3BlLgorICAvLyBSb290IGlzIGluY2x1ZGVkIGluIHRoZSByZWZlcmVuY2UgY291bnQuCisgIC8vIFRoaXMgaXMgbmVjZXNzYXJ5IHNvIHRoYXQgd2UgY2FuIGRldGVjdCBjaGFuZ2VzIHJlbGlhYmx5LgorICAvLyBVbmZvcnR1bmF0ZWx5LCBpdCByZXF1aXJlcyBjYXJlZnVsIGJvb2trZWVwaW5nIGZvciB0aGUKKyAgLy8gbm9uR0MgY2FzZS4KKyAgX1JvcGVfaXRlcmF0b3Iocm9wZTxfQ2hhclQsX0FsbG9jPiogX19yLCBzaXplX3QgX19wb3MpOworCisgIHZvaWQgX01fY2hlY2soKTsKK3B1YmxpYzoKKyAgdHlwZWRlZiBfUm9wZV9jaGFyX3JlZl9wcm94eTxfQ2hhclQsX0FsbG9jPiAgcmVmZXJlbmNlOworICB0eXBlZGVmIF9Sb3BlX2NoYXJfcmVmX3Byb3h5PF9DaGFyVCxfQWxsb2M+KiBwb2ludGVyOworICB0eXBlZGVmIF9DaGFyVCB2YWx1ZV90eXBlOworICB0eXBlZGVmIHB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7CisgIHR5cGVkZWYgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CitwdWJsaWM6CisgIH5fUm9wZV9pdGVyYXRvcigpIHsgIC8vKlRZIDUvNi8wMCAtIGFkZGVkIGR0b3IgdG8gYmFsYW5jZSByZWZlcmVuY2UgY291bnQKKyAgICBfUm9wZVJlcDo6X1NfdW5yZWYodGhpcy0+X01fcm9vdCk7CisgIH0KKworICByb3BlPF9DaGFyVCxfQWxsb2M+JiBjb250YWluZXIoKSB7IHJldHVybiAqX01fcm9vdF9yb3BlOyB9CisgIF9Sb3BlX2l0ZXJhdG9yKCkgeworICAgIHRoaXMtPl9NX3Jvb3QgPSAwOyAgLy8gTmVlZGVkIGZvciByZWZlcmVuY2UgY291bnRpbmcuCisgIH0KKyAgX1JvcGVfaXRlcmF0b3IoY29uc3QgIF9TZWxmJiBfX3gpIDoKKyAgICBfUm9wZV9pdGVyYXRvcl9iYXNlPF9DaGFyVCxfQWxsb2M+KF9feCkgeworICAgIF9NX3Jvb3Rfcm9wZSA9IF9feC5fTV9yb290X3JvcGU7CisgICAgX1JvcGVSZXA6Ol9TX3JlZih0aGlzLT5fTV9yb290KTsKKyAgfQorICBfUm9wZV9pdGVyYXRvcihyb3BlPF9DaGFyVCxfQWxsb2M+JiBfX3IsIHNpemVfdCBfX3Bvcyk7CisgIF9TZWxmJiBvcGVyYXRvcj0gKGNvbnN0ICBfU2VsZiYgX194KSB7CisgICAgX1JvcGVSZXAqIF9fb2xkID0gdGhpcy0+X01fcm9vdDsKKyAgICBfUm9wZVJlcDo6X1NfcmVmKF9feC5fTV9yb290KTsKKyAgICBfQmFzZTo6b3BlcmF0b3I9KF9feCk7CisgICAgX01fcm9vdF9yb3BlID0gX194Ll9NX3Jvb3Rfcm9wZTsKKyAgICBfUm9wZVJlcDo6X1NfdW5yZWYoX19vbGQpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgeworICAgIF9NX2NoZWNrKCk7CisgICAgaWYgKDAgPT0gdGhpcy0+X01fYnVmX3B0cikgeworICAgICAgcmV0dXJuIHJlZmVyZW5jZShfTV9yb290X3JvcGUsIHRoaXMtPl9NX2N1cnJlbnRfcG9zKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHJlZmVyZW5jZShfTV9yb290X3JvcGUsIHRoaXMtPl9NX2N1cnJlbnRfcG9zLCAqKHRoaXMtPl9NX2J1Zl9wdHIpKTsKKyAgICB9CisgIH0KKyAgX1NlbGYmIG9wZXJhdG9yKysoKSB7CisgICAgdGhpcy0+X01faW5jcigxKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgX1NlbGYmIG9wZXJhdG9yKz0ocHRyZGlmZl90IF9fbikgeworICAgIGlmIChfX24gPj0gMCkgeworICAgICAgdGhpcy0+X01faW5jcihfX24pOworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLT5fTV9kZWNyKC1fX24pOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgX1NlbGYmIG9wZXJhdG9yLS0oKSB7CisgICAgdGhpcy0+X01fZGVjcigxKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgX1NlbGYmIG9wZXJhdG9yLT0ocHRyZGlmZl90IF9fbikgeworICAgIGlmIChfX24gPj0gMCkgeworICAgICAgdGhpcy0+X01fZGVjcihfX24pOworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLT5fTV9pbmNyKC1fX24pOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgX1NlbGYgb3BlcmF0b3IrKyhpbnQpIHsKKyAgICBzaXplX3QgX19vbGRfcG9zID0gdGhpcy0+X01fY3VycmVudF9wb3M7CisgICAgdGhpcy0+X01faW5jcigxKTsKKyAgICByZXR1cm4gX1NlbGYoX01fcm9vdF9yb3BlLCBfX29sZF9wb3MpOworICB9CisgIF9TZWxmIG9wZXJhdG9yLS0oaW50KSB7CisgICAgc2l6ZV90IF9fb2xkX3BvcyA9IHRoaXMtPl9NX2N1cnJlbnRfcG9zOworICAgIHRoaXMtPl9NX2RlY3IoMSk7CisgICAgcmV0dXJuIF9TZWxmKF9NX3Jvb3Rfcm9wZSwgX19vbGRfcG9zKTsKKyAgfQorICByZWZlcmVuY2Ugb3BlcmF0b3JbXShwdHJkaWZmX3QgX19uKSB7CisgICAgcmV0dXJuIHJlZmVyZW5jZShfTV9yb290X3JvcGUsIHRoaXMtPl9NX2N1cnJlbnRfcG9zICsgX19uKTsKKyAgfQorfTsKKworIyBpZmRlZiBfU1RMUF9VU0VfT0xEX0hQX0lURVJBVE9SX1FVRVJJRVMKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK2lubGluZSByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZworaXRlcmF0b3JfY2F0ZWdvcnkoY29uc3QgX1JvcGVfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4mKSB7ICByZXR1cm4gcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcoKTt9Cit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgX0NoYXJUKiB2YWx1ZV90eXBlKGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+JikgeyByZXR1cm4gMDsgfQordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgoraW5saW5lIHB0cmRpZmZfdCogZGlzdGFuY2VfdHlwZShjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPiYpIHsgcmV0dXJuIDA7IH0KK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK2lubGluZSByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZworaXRlcmF0b3JfY2F0ZWdvcnkoY29uc3QgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4mKSB7IHJldHVybiByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZygpOyB9Cit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgX0NoYXJUKiB2YWx1ZV90eXBlKGNvbnN0IF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+JikgeyByZXR1cm4gMDsgfQordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgoraW5saW5lIHB0cmRpZmZfdCogZGlzdGFuY2VfdHlwZShjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPiYpIHsgcmV0dXJuIDA7IH0KKyNlbmRpZiAvKiBfU1RMUF9VU0VfT0xEX0hQX0lURVJBVE9SX1FVRVJJRVMgKi8KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jLCBjbGFzcyBfQ2hhckNvbnN1bWVyPgorYm9vbCBfU19hcHBseV90b19waWVjZXMoX0NoYXJDb25zdW1lciYgX19jLAorICAgICAgICAgICAgICAgICAgICAgICAgX1JvcGVfUm9wZVJlcDxfQ2hhclQsIF9BbGxvYz4gKl9fciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBfX2JlZ2luLCBzaXplX3QgX19lbmQpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVnaW4gYW5kIGVuZCBhcmUgYXNzdW1lZCB0byBiZSBpbiByYW5nZS4KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorY2xhc3Mgcm9wZQorI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QQVJUSUFMX1NQRUNfV09SS0FST1VORCkKKyAgICAgICAgICAgOiBwdWJsaWMgX19zdGxwb3J0X2NsYXNzPHJvcGU8X0NoYXJULCBfQWxsb2M+ID4KKyNlbmRpZgoreworICB0eXBlZGVmIHJvcGU8X0NoYXJULF9BbGxvYz4gX1NlbGY7CitwdWJsaWM6CisgIHR5cGVkZWYgX0NoYXJUIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKKyAgdHlwZWRlZiBzaXplX3Qgc2l6ZV90eXBlOworICB0eXBlZGVmIF9DaGFyVCBjb25zdF9yZWZlcmVuY2U7CisgIHR5cGVkZWYgY29uc3QgX0NoYXJUKiBjb25zdF9wb2ludGVyOworICB0eXBlZGVmIF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+IGl0ZXJhdG9yOworICB0eXBlZGVmIF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+IGNvbnN0X2l0ZXJhdG9yOworICB0eXBlZGVmIF9Sb3BlX2NoYXJfcmVmX3Byb3h5PF9DaGFyVCxfQWxsb2M+IHJlZmVyZW5jZTsKKyAgdHlwZWRlZiBfUm9wZV9jaGFyX3B0cl9wcm94eTxfQ2hhclQsX0FsbG9jPiBwb2ludGVyOworCisgIGZyaWVuZCBjbGFzcyBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPjsKKyAgZnJpZW5kIGNsYXNzIF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+OworICBmcmllbmQgc3RydWN0IF9Sb3BlX1JvcGVSZXA8X0NoYXJULF9BbGxvYz47CisgIGZyaWVuZCBjbGFzcyBfUm9wZV9pdGVyYXRvcl9iYXNlPF9DaGFyVCxfQWxsb2M+OworICBmcmllbmQgY2xhc3MgX1JvcGVfY2hhcl9wdHJfcHJveHk8X0NoYXJULF9BbGxvYz47CisgIGZyaWVuZCBjbGFzcyBfUm9wZV9jaGFyX3JlZl9wcm94eTxfQ2hhclQsX0FsbG9jPjsKKyAgZnJpZW5kIHN0cnVjdCBfUm9wZV9Sb3BlU3Vic3RyaW5nPF9DaGFyVCxfQWxsb2M+OworCisgIF9TVExQX0RFQ0xBUkVfUkFORE9NX0FDQ0VTU19SRVZFUlNFX0lURVJBVE9SUzsKKworcHJvdGVjdGVkOgorICB0eXBlZGVmIF9DaGFyVCogX0NzdHJwdHI7CisKKyAgc3RhdGljIF9DaGFyVCBfU19lbXB0eV9jX3N0clsxXTsKKworICBlbnVtIHsgX1NfY29weV9tYXggPSAyMyB9OworICAvLyBGb3Igc3RyaW5ncyBzaG9ydGVyIHRoYW4gX1NfY29weV9tYXgsIHdlIGNvcHkgdG8KKyAgLy8gY29uY2F0ZW5hdGUuCisKKyAgdHlwZWRlZiBfUm9wZV9Sb3BlUmVwPF9DaGFyVCwgX0FsbG9jPiBfUm9wZVJlcDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUm9wZVJlcDo6X0lzQmFzaWNDaGFyVHlwZSBfSXNCYXNpY0NoYXJUeXBlOworCitwdWJsaWM6CisgIF9TVExQX0ZPUkNFX0FMTE9DQVRPUlMoX0NoYXJULCBfQWxsb2MpCisgIHR5cGVkZWYgX0FsbG9jIGFsbG9jYXRvcl90eXBlOworCitwdWJsaWM6CisgIC8vIFRoZSBvbmx5IGRhdGEgbWVtYmVyIG9mIGEgcm9wZToKKyAgX1NUTFBfUFJJViBfU1RMUF9hbGxvY19wcm94eTxfUm9wZVJlcCosIF9DaGFyVCwgYWxsb2NhdG9yX3R5cGU+IF9NX3RyZWVfcHRyOworCitwdWJsaWM6CisgIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdCB7IHJldHVybiBhbGxvY2F0b3JfdHlwZShfTV90cmVlX3B0cik7IH0KKworcHVibGljOgorICB0eXBlZGVmIF9Sb3BlX1JvcGVDb25jYXRlbmF0aW9uPF9DaGFyVCxfQWxsb2M+IF9Sb3BlQ29uY2F0ZW5hdGlvbjsKKyAgdHlwZWRlZiBfUm9wZV9Sb3BlTGVhZjxfQ2hhclQsX0FsbG9jPiBfUm9wZUxlYWY7CisgIHR5cGVkZWYgX1JvcGVfUm9wZUZ1bmN0aW9uPF9DaGFyVCxfQWxsb2M+IF9Sb3BlRnVuY3Rpb247CisgIHR5cGVkZWYgX1JvcGVfUm9wZVN1YnN0cmluZzxfQ2hhclQsX0FsbG9jPiBfUm9wZVN1YnN0cmluZzsKKworICAvLyBSZXRyaWV2ZSBhIGNoYXJhY3RlciBhdCB0aGUgaW5kaWNhdGVkIHBvc2l0aW9uLgorICBzdGF0aWMgX0NoYXJUIF9TX2ZldGNoKF9Sb3BlUmVwKiBfX3IsIHNpemVfdHlwZSBfX3Bvcyk7CisKKyAgLy8gT2J0YWluIGEgcG9pbnRlciB0byB0aGUgY2hhcmFjdGVyIGF0IHRoZSBpbmRpY2F0ZWQgcG9zaXRpb24uCisgIC8vIFRoZSBwb2ludGVyIGNhbiBiZSB1c2VkIHRvIGNoYW5nZSB0aGUgY2hhcmFjdGVyLgorICAvLyBJZiBzdWNoIGEgcG9pbnRlciBjYW5ub3QgYmUgcHJvZHVjZWQsIGFzIGlzIGZyZXF1ZW50bHkgdGhlCisgIC8vIGNhc2UsIDAgaXMgcmV0dXJuZWQgaW5zdGVhZC4KKyAgLy8gKFJldHVybnMgbm9uemVybyBvbmx5IGlmIGFsbCBub2RlcyBpbiB0aGUgcGF0aCBoYXZlIGEgcmVmY291bnQKKyAgLy8gb2YgMS4pCisgIHN0YXRpYyBfQ2hhclQqIF9TX2ZldGNoX3B0cihfUm9wZVJlcCogX19yLCBzaXplX3R5cGUgX19wb3MpOworCisgIHN0YXRpYyB2b2lkIF9TX3VucmVmKF9Sb3BlUmVwKiBfX3QpIHsKKyAgICBfUm9wZVJlcDo6X1NfdW5yZWYoX190KTsKKyAgfQorICBzdGF0aWMgdm9pZCBfU19yZWYoX1JvcGVSZXAqIF9fdCkgeworICAgIF9Sb3BlUmVwOjpfU19yZWYoX190KTsKKyAgfQorCisgIHR5cGVkZWYgX1JvcGVfc2VsZl9kZXN0cnVjdF9wdHI8X0NoYXJULF9BbGxvYz4gX1NlbGZfZGVzdHJ1Y3RfcHRyOworCisgIC8vIF9SZXN1bHQgaXMgY291bnRlZCBpbiByZWZjb3VudC4KKyAgc3RhdGljIF9Sb3BlUmVwKiBfU19zdWJzdHJpbmcoX1JvcGVSZXAqIF9fYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IF9fc3RhcnQsIHNpemVfdCBfX2VuZHAxKTsKKworICBzdGF0aWMgX1JvcGVSZXAqIF9TX2NvbmNhdF9jaGFyX2l0ZXIoX1JvcGVSZXAqIF9fciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9DaGFyVCogX19pdGVyLCBzaXplX3QgX19zbGVuKTsKKyAgLy8gQ29uY2F0ZW5hdGUgcm9wZSBhbmQgY2hhciBwdHIsIGNvcHlpbmcgX19zLgorICAvLyBTaG91bGQgcmVhbGx5IHRha2UgYW4gYXJiaXRyYXJ5IGl0ZXJhdG9yLgorICAvLyBSZXN1bHQgaXMgY291bnRlZCBpbiByZWZjb3VudC4KKyAgc3RhdGljIF9Sb3BlUmVwKiBfU19kZXN0cl9jb25jYXRfY2hhcl9pdGVyKF9Sb3BlUmVwKiBfX3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfQ2hhclQqIF9faXRlciwgc2l6ZV90IF9fc2xlbik7CisgICAgLy8gQXMgYWJvdmUsIGJ1dCBvbmUgcmVmZXJlbmNlIHRvIF9fciBpcyBhYm91dCB0byBiZQorICAgIC8vIGRlc3Ryb3llZC4gIFRodXMgdGhlIHBpZWNlcyBtYXkgYmUgcmVjeWNsZWQgaWYgYWxsCisgICAgLy8gcmVsZXZlbnQgcmVmZXJlbmNlIGNvdW50cyBhcmUgMS4KKworICAvLyBHZW5lcmFsIGNvbmNhdGVuYXRpb24gb24gX1JvcGVSZXAuICBfUmVzdWx0CisgIC8vIGhhcyByZWZjb3VudCBvZiAxLiAgQWRqdXN0cyBhcmd1bWVudCByZWZjb3VudHMuCisgIHN0YXRpYyBfUm9wZVJlcCogX1NfY29uY2F0X3JlcChfUm9wZVJlcCogX19sZWZ0LCBfUm9wZVJlcCogX19yaWdodCk7CisKK3B1YmxpYzoKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJDb25zdW1lcj4KKyNlbHNlCisgIHR5cGVkZWYgX1JvcGVfY2hhcl9jb25zdW1lcjxfQ2hhclQ+IF9DaGFyQ29uc3VtZXI7CisjZW5kaWYKKyAgdm9pZCBhcHBseV90b19waWVjZXMoc2l6ZV90IF9fYmVnaW4sIHNpemVfdCBfX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgX0NoYXJDb25zdW1lciYgX19jKSBjb25zdAorICB7IF9TX2FwcGx5X3RvX3BpZWNlcyhfX2MsIF9NX3RyZWVfcHRyLl9NX2RhdGEsIF9fYmVnaW4sIF9fZW5kKTsgfQorCitwcm90ZWN0ZWQ6CisKKyAgc3RhdGljIHNpemVfdCBfU19yb3VuZGVkX3VwX3NpemUoc2l6ZV90IF9fbikKKyAgeyByZXR1cm4gX1JvcGVSZXA6Ol9TX3JvdW5kZWRfdXBfc2l6ZShfX24pOyB9CisKKyAgLy8gQWxsb2NhdGUgYW5kIGNvbnN0cnVjdCBhIFJvcGVMZWFmIHVzaW5nIHRoZSBzdXBwbGllZCBhbGxvY2F0b3IKKyAgLy8gVGFrZXMgb3duZXJzaGlwIG9mIHMgaW5zdGVhZCBvZiBjb3B5aW5nLgorICBzdGF0aWMgX1JvcGVMZWFmKiBfU19uZXdfUm9wZUxlYWYoX0NoYXJUICpfX3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgX3Bfc2l6ZSwgYWxsb2NhdG9yX3R5cGUgX19hKSB7CisgICAgX1JvcGVMZWFmKiBfX3NwYWNlID0gX1NUTFBfQ1JFQVRFX0FMTE9DQVRPUihhbGxvY2F0b3JfdHlwZSwgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JvcGVMZWFmKS5hbGxvY2F0ZSgxKTsKKyAgICBfU1RMUF9UUlkgeworICAgICAgbmV3KF9fc3BhY2UpIF9Sb3BlTGVhZihfX3MsIF9wX3NpemUsIF9fYSk7CisgICAgfQorICAgX1NUTFBfVU5XSU5EKF9TVExQX0NSRUFURV9BTExPQ0FUT1IoYWxsb2NhdG9yX3R5cGUsX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JvcGVMZWFmKS5kZWFsbG9jYXRlKF9fc3BhY2UsIDEpKQorICAgIHJldHVybiBfX3NwYWNlOworICB9CisKKyAgc3RhdGljIF9Sb3BlQ29uY2F0ZW5hdGlvbiogX1NfbmV3X1JvcGVDb25jYXRlbmF0aW9uKF9Sb3BlUmVwKiBfX2xlZnQsIF9Sb3BlUmVwKiBfX3JpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yX3R5cGUgX19hKSB7CisgICBfUm9wZUNvbmNhdGVuYXRpb24qIF9fc3BhY2UgPSBfU1RMUF9DUkVBVEVfQUxMT0NBVE9SKGFsbG9jYXRvcl90eXBlLCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Sb3BlQ29uY2F0ZW5hdGlvbikuYWxsb2NhdGUoMSk7CisgICAgcmV0dXJuIG5ldyhfX3NwYWNlKSBfUm9wZUNvbmNhdGVuYXRpb24oX19sZWZ0LCBfX3JpZ2h0LCBfX2EpOworICB9CisKKyAgc3RhdGljIF9Sb3BlRnVuY3Rpb24qIF9TX25ld19Sb3BlRnVuY3Rpb24oY2hhcl9wcm9kdWNlcjxfQ2hhclQ+KiBfX2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBfcF9zaXplLCBib29sIF9fZCwgYWxsb2NhdG9yX3R5cGUgX19hKSB7CisgICBfUm9wZUZ1bmN0aW9uKiBfX3NwYWNlID0gX1NUTFBfQ1JFQVRFX0FMTE9DQVRPUihhbGxvY2F0b3JfdHlwZSwgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JvcGVGdW5jdGlvbikuYWxsb2NhdGUoMSk7CisgICAgcmV0dXJuIG5ldyhfX3NwYWNlKSBfUm9wZUZ1bmN0aW9uKF9fZiwgX3Bfc2l6ZSwgX19kLCBfX2EpOworICB9CisKKyAgc3RhdGljIF9Sb3BlU3Vic3RyaW5nKiBfU19uZXdfUm9wZVN1YnN0cmluZyhfUm9wZV9Sb3BlUmVwPF9DaGFyVCxfQWxsb2M+KiBfX2IsIHNpemVfdCBfX3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IF9fbCwgYWxsb2NhdG9yX3R5cGUgX19hKSB7CisgICBfUm9wZVN1YnN0cmluZyogX19zcGFjZSA9IF9TVExQX0NSRUFURV9BTExPQ0FUT1IoYWxsb2NhdG9yX3R5cGUsIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUm9wZVN1YnN0cmluZykuYWxsb2NhdGUoMSk7CisgICAgcmV0dXJuIG5ldyhfX3NwYWNlKSBfUm9wZVN1YnN0cmluZyhfX2IsIF9fcywgX19sLCBfX2EpOworICB9CisKKyAgc3RhdGljCisgIF9Sb3BlTGVhZiogX1NfUm9wZUxlYWZfZnJvbV91bm93bmVkX2NoYXJfcHRyKGNvbnN0IF9DaGFyVCAqX19zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgX3Bfc2l6ZSwgYWxsb2NhdG9yX3R5cGUgX19hKSB7CisgICAgaWYgKDAgPT0gX3Bfc2l6ZSkgcmV0dXJuIDA7CisKKyAgIF9DaGFyVCogX19idWYgPSBfU1RMUF9DUkVBVEVfQUxMT0NBVE9SKGFsbG9jYXRvcl90eXBlLF9fYSwgX0NoYXJUKS5hbGxvY2F0ZShfU19yb3VuZGVkX3VwX3NpemUoX3Bfc2l6ZSkpOworCisgICAgX1NUTFBfUFJJViBfX3Vjb3B5X24oX19zLCBfcF9zaXplLCBfX2J1Zik7CisgICAgX1NfY29uc3RydWN0X251bGwoX19idWYgKyBfcF9zaXplKTsKKworICAgIF9TVExQX1RSWSB7CisgICAgICByZXR1cm4gX1NfbmV3X1JvcGVMZWFmKF9fYnVmLCBfcF9zaXplLCBfX2EpOworICAgIH0KKyAgICBfU1RMUF9VTldJTkQoX1JvcGVSZXA6Ol9TX2ZyZWVfc3RyaW5nKF9fYnVmLCBfcF9zaXplLCBfX2EpKQorICAgIF9TVExQX1JFVF9BRlRFUl9USFJPVygwKQorICB9CisKKworICAvLyBDb25jYXRlbmF0aW9uIG9mIG5vbmVtcHR5IHN0cmluZ3MuCisgIC8vIEFsd2F5cyBidWlsZHMgYSBjb25jYXRlbmF0aW9uIG5vZGUuCisgIC8vIFJlYmFsYW5jZXMgaWYgdGhlIHJlc3VsdCBpcyB0b28gZGVlcC4KKyAgLy8gUmVzdWx0IGhhcyByZWZjb3VudCAxLgorICAvLyBEb2VzIG5vdCBpbmNyZW1lbnQgbGVmdCBhbmQgcmlnaHQgcmVmIGNvdW50cyBldmVuIHRob3VnaAorICAvLyB0aGV5IGFyZSByZWZlcmVuY2VkLgorICBzdGF0aWMgX1JvcGVSZXAqCisgIF9TX3RyZWVfY29uY2F0KF9Sb3BlUmVwKiBfX2xlZnQsIF9Sb3BlUmVwKiBfX3JpZ2h0KTsKKworICAvLyBDb25jYXRlbmF0aW9uIGhlbHBlciBmdW5jdGlvbnMKKyAgc3RhdGljIF9Sb3BlTGVhZioKKyAgX1NfbGVhZl9jb25jYXRfY2hhcl9pdGVyKF9Sb3BlTGVhZiogX19yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0NoYXJUKiBfX2l0ZXIsIHNpemVfdCBfX3NsZW4pOworICAvLyBDb25jYXRlbmF0ZSBieSBjb3B5aW5nIGxlYWYuCisgIC8vIHNob3VsZCB0YWtlIGFuIGFyYml0cmFyeSBpdGVyYXRvcgorICAvLyByZXN1bHQgaGFzIHJlZmNvdW50IDEuCisgIHN0YXRpYyBfUm9wZUxlYWYqIF9TX2Rlc3RyX2xlYWZfY29uY2F0X2NoYXJfaXRlcgorICAoX1JvcGVMZWFmKiBfX3IsIGNvbnN0IF9DaGFyVCogX19pdGVyLCBzaXplX3QgX19zbGVuKTsKKyAgLy8gQSB2ZXJzaW9uIHRoYXQgcG90ZW50aWFsbHkgY2xvYmJlcnMgX19yIGlmIF9fci0+X01fcmVmX2NvdW50ID09IDEuCisKKworICAvLyBBIGhlbHBlciBmdW5jdGlvbiBmb3IgZXhwb25lbnRpYXRpbmcgc3RyaW5ncy4KKyAgLy8gVGhpcyB1c2VzIGEgbm9uc3RhbmRhcmQgcmVmY291bnQgY29udmVudGlvbi4KKyAgLy8gVGhlIHJlc3VsdCBoYXMgcmVmY291bnQgMC4KKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9Sb3BlX0NvbmNhdF9mbjxfQ2hhclQsX0FsbG9jPiBfQ29uY2F0X2ZuOworI2lmICFkZWZpbmVkIChfX0dOVUNfXykgfHwgKF9fR05VQ19fIDwgMykKKyAgZnJpZW5kIF9Db25jYXRfZm47CisjZWxzZQorICBmcmllbmQgc3RydWN0IF9TVExQX1BSSVYgX1JvcGVfQ29uY2F0X2ZuPF9DaGFyVCxfQWxsb2M+OworI2VuZGlmCisKK3B1YmxpYzoKKyAgc3RhdGljIHNpemVfdCBfU19jaGFyX3B0cl9sZW4oY29uc3QgX0NoYXJUKiBfX3MpIHsKKyAgICByZXR1cm4gY2hhcl90cmFpdHM8X0NoYXJUPjo6bGVuZ3RoKF9fcyk7CisgIH0KKworcHVibGljOiAvKiBmb3Igb3BlcmF0b3JzICovCisgIHJvcGUoX1JvcGVSZXAqIF9fdCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfTV90cmVlX3B0cihfX2EsIF9fdCkgeyB9Citwcml2YXRlOgorICAvLyBDb3B5IF9fciB0byB0aGUgX0NoYXJUIGJ1ZmZlci4KKyAgLy8gUmV0dXJucyBfX2J1ZmZlciArIF9fci0+X01fc2l6ZS5fTV9kYXRhLgorICAvLyBBc3N1bWVzIHRoYXQgYnVmZmVyIGlzIHVuaW5pdGlhbGl6ZWQuCisgIHN0YXRpYyBfQ2hhclQqIF9TX2ZsYXR0ZW4oX1JvcGVSZXAqIF9fciwgX0NoYXJUKiBfX2J1ZmZlcik7CisKKyAgLy8gQWdhaW4sIHdpdGggZXhwbGljaXQgc3RhcnRpbmcgcG9zaXRpb24gYW5kIGxlbmd0aC4KKyAgLy8gQXNzdW1lcyB0aGF0IGJ1ZmZlciBpcyB1bmluaXRpYWxpemVkLgorICBzdGF0aWMgX0NoYXJUKiBfU19mbGF0dGVuKF9Sb3BlUmVwKiBfX3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IF9fc3RhcnQsIHNpemVfdCBfX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ2hhclQqIF9fYnVmZmVyKTsKKworICAvLyBmYnAgOiBIUCBhQ0MgcHJvaGliaXRzIGFjY2VzcyB0byBwcm90ZWN0ZWQgbWluX2xlbiBmcm9tIHdpdGhpbiBzdGF0aWMgbWV0aG9kcyAoID8/ICkKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgX1NfbWluX2xlbltfX1JPUEVfREVQVEhfU0laRV07Citwcm90ZWN0ZWQ6CisgIHN0YXRpYyBib29sIF9TX2lzX2JhbGFuY2VkKF9Sb3BlUmVwKiBfX3IpCisgIHsgcmV0dXJuIChfX3ItPl9NX3NpemUuX01fZGF0YSA+PSBfU19taW5fbGVuW19fci0+X01fZGVwdGhdKTsgfQorCisgIHN0YXRpYyBib29sIF9TX2lzX2FsbW9zdF9iYWxhbmNlZChfUm9wZVJlcCogX19yKSB7CisgICAgcmV0dXJuIChfX3ItPl9NX2RlcHRoID09IDAgfHwKKyAgICAgICAgICAgIF9fci0+X01fc2l6ZS5fTV9kYXRhID49IF9TX21pbl9sZW5bX19yLT5fTV9kZXB0aCAtIDFdKTsKKyAgfQorCisgIHN0YXRpYyBib29sIF9TX2lzX3JvdWdobHlfYmFsYW5jZWQoX1JvcGVSZXAqIF9fcikgeworICAgIHJldHVybiAoX19yLT5fTV9kZXB0aCA8PSAxIHx8CisgICAgICAgICAgICBfX3ItPl9NX3NpemUuX01fZGF0YSA+PSBfU19taW5fbGVuW19fci0+X01fZGVwdGggLSAyXSk7CisgIH0KKworICAvLyBBc3N1bWVzIHRoZSByZXN1bHQgaXMgbm90IGVtcHR5LgorICBzdGF0aWMgX1JvcGVSZXAqIF9TX2NvbmNhdF9hbmRfc2V0X2JhbGFuY2VkKF9Sb3BlUmVwKiBfX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JvcGVSZXAqIF9fcmlnaHQpIHsKKyAgICBfUm9wZVJlcCogX19yZXN1bHQgPSBfU19jb25jYXRfcmVwKF9fbGVmdCwgX19yaWdodCk7CisgICAgaWYgKF9TX2lzX2JhbGFuY2VkKF9fcmVzdWx0KSkgX19yZXN1bHQtPl9NX2lzX2JhbGFuY2VkID0gdHJ1ZTsKKyAgICByZXR1cm4gX19yZXN1bHQ7CisgIH0KKworICAvLyBUaGUgYmFzaWMgcmViYWxhbmNpbmcgb3BlcmF0aW9uLiAgTG9naWNhbGx5IGNvcGllcyB0aGUKKyAgLy8gcm9wZS4gIFRoZSByZXN1bHQgaGFzIHJlZmNvdW50IG9mIDEuICBUaGUgY2xpZW50IHdpbGwKKyAgLy8gdXN1YWxseSBkZWNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiBfX3IuCisgIC8vIFRoZSByZXN1bHQgaXMgd2l0aGluIGhlaWdodCAyIG9mIGJhbGFuY2VkIGJ5IHRoZSBhYm92ZQorICAvLyBkZWZpbml0aW9uLgorICBzdGF0aWMgX1JvcGVSZXAqIF9TX2JhbGFuY2UoX1JvcGVSZXAqIF9fcik7CisKKyAgLy8gQWRkIGFsbCB1bmJhbGFuY2VkIHN1YnRyZWVzIHRvIHRoZSBmb3Jlc3Qgb2YgYmFsYW5jZWVkIHRyZWVzLgorICAvLyBVc2VkIG9ubHkgYnkgYmFsYW5jZS4KKyAgc3RhdGljIHZvaWQgX1NfYWRkX3RvX2ZvcmVzdChfUm9wZVJlcCpfX3IsIF9Sb3BlUmVwKiogX19mb3Jlc3QpOworCisgIC8vIEFkZCBfX3IgdG8gZm9yZXN0LCBhc3N1bWluZyBfX3IgaXMgYWxyZWFkeSBiYWxhbmNlZC4KKyAgc3RhdGljIHZvaWQgX1NfYWRkX2xlYWZfdG9fZm9yZXN0KF9Sb3BlUmVwKiBfX3IsIF9Sb3BlUmVwKiogX19mb3Jlc3QpOworCisjaWZkZWYgX1NUTFBfREVCVUcKKyAgLy8gUHJpbnQgdG8gc3Rkb3V0LCBleHBvc2luZyBzdHJ1Y3R1cmUKKyAgc3RhdGljIHZvaWQgX1NfZHVtcChfUm9wZVJlcCogX19yLCBpbnQgX19pbmRlbnQgPSAwKTsKKyNlbmRpZgorCisgIC8vIFJldHVybiAtMSwgMCwgb3IgMSBpZiBfX3ggPCBfX3ksIF9feCA9PSBfX3ksIG9yIF9feCA+IF9feSByZXNwLgorICBzdGF0aWMgaW50IF9TX2NvbXBhcmUoY29uc3QgX1JvcGVSZXAqIF9feCwgY29uc3QgX1JvcGVSZXAqIF9feSk7CisKKyAgdm9pZCBfU1RMUF9GVU5DVElPTl9USFJPV1MgX01fdGhyb3dfb3V0X29mX3JhbmdlKCkgY29uc3Q7CisKKyAgdm9pZCBfTV9yZXNldChfUm9wZVJlcCogX19yKSB7CisgICAgLy9pZiAoX19yICE9IF9NX3RyZWVfcHRyLl9NX2RhdGEpIHsKKyAgICAgIF9TX3VucmVmKF9NX3RyZWVfcHRyLl9NX2RhdGEpOworICAgICAgX01fdHJlZV9wdHIuX01fZGF0YSA9IF9fcjsKKyAgICAvL30KKyAgfQorCitwdWJsaWM6CisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiAwID09IF9NX3RyZWVfcHRyLl9NX2RhdGE7IH0KKworICAvLyBDb21wYXJpc29uIG1lbWJlciBmdW5jdGlvbi4gIFRoaXMgaXMgcHVibGljIG9ubHkgZm9yIHRob3NlCisgIC8vIGNsaWVudHMgdGhhdCBuZWVkIGEgdGVybmFyeSBjb21wYXJpc29uLiAgT3RoZXJzCisgIC8vIHNob3VsZCB1c2UgdGhlIGNvbXBhcmlzb24gb3BlcmF0b3JzIGJlbG93LgorICBpbnQgY29tcGFyZShjb25zdCBfU2VsZiYgX195KSBjb25zdCB7CisgICAgcmV0dXJuIF9TX2NvbXBhcmUoX01fdHJlZV9wdHIuX01fZGF0YSwgX195Ll9NX3RyZWVfcHRyLl9NX2RhdGEpOworICB9CisKKyAgcm9wZShjb25zdCBfQ2hhclQqIF9fcywgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfTV90cmVlX3B0cihfX2EsIF9TX1JvcGVMZWFmX2Zyb21fdW5vd25lZF9jaGFyX3B0cihfX3MsIF9TX2NoYXJfcHRyX2xlbihfX3MpLF9fYSkpCisgIHt9CisKKyAgcm9wZShjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90IF9fbGVuLAorICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX01fdHJlZV9wdHIoX19hLCAoX1NfUm9wZUxlYWZfZnJvbV91bm93bmVkX2NoYXJfcHRyKF9fcywgX19sZW4sIF9fYSkpKQorICB7fQorCisgIC8vIFNob3VsZCBwZXJoYXBzIGJlIHRlbXBsYXRpemVkIHdpdGggcmVzcGVjdCB0byB0aGUgaXRlcmF0b3IgdHlwZQorICAvLyBhbmQgdXNlIFNlcXVlbmNlX2J1ZmZlci4gIChJdCBzaG91bGQgcGVyaGFwcyB1c2Ugc2VxdWVuY2VfYnVmZmVyCisgIC8vIGV2ZW4gbm93LikKKyAgcm9wZShjb25zdCBfQ2hhclQgKl9fcywgY29uc3QgX0NoYXJUICpfX2UsCisgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfTV90cmVlX3B0cihfX2EsIF9TX1JvcGVMZWFmX2Zyb21fdW5vd25lZF9jaGFyX3B0cihfX3MsIF9fZSAtIF9fcywgX19hKSkKKyAge30KKworICByb3BlKGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiBfX3MsIGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiBfX2UsCisgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfTV90cmVlX3B0cihfX2EsIF9TX3N1YnN0cmluZyhfX3MuX01fcm9vdCwgX19zLl9NX2N1cnJlbnRfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19lLl9NX2N1cnJlbnRfcG9zKSkKKyAge30KKworICByb3BlKGNvbnN0IGl0ZXJhdG9yJiBfX3MsIGNvbnN0IGl0ZXJhdG9yJiBfX2UsCisgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfTV90cmVlX3B0cihfX2EsIF9TX3N1YnN0cmluZyhfX3MuX01fcm9vdCwgX19zLl9NX2N1cnJlbnRfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19lLl9NX2N1cnJlbnRfcG9zKSkKKyAge30KKworICByb3BlKF9DaGFyVCBfX2MsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX01fdHJlZV9wdHIoX19hLCAoX1JvcGVSZXAqKTApIHsKKyAgICBfQ2hhclQqIF9fYnVmID0gX01fdHJlZV9wdHIuYWxsb2NhdGUoX1Nfcm91bmRlZF91cF9zaXplKDEpKTsKKworICAgIF9Db3B5X0NvbnN0cnVjdChfX2J1ZiwgX19jKTsKKyAgICBfU19jb25zdHJ1Y3RfbnVsbChfX2J1ZiArIDEpOworCisgICAgX1NUTFBfVFJZIHsKKyAgICAgIF9NX3RyZWVfcHRyLl9NX2RhdGEgPSBfU19uZXdfUm9wZUxlYWYoX19idWYsIDEsIF9fYSk7CisgICAgfQorICAgIF9TVExQX1VOV0lORChfUm9wZVJlcDo6X1NfZnJlZV9zdHJpbmcoX19idWYsIDEsIF9fYSkpCisgIH0KKworICByb3BlKHNpemVfdCBfX24sIF9DaGFyVCBfX2MsCisgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpOgorICAgIF9NX3RyZWVfcHRyKF9fYSwgKF9Sb3BlUmVwKikwKSB7CisgICAgaWYgKDAgPT0gX19uKQorICAgICAgcmV0dXJuOworCisgICAgcm9wZTxfQ2hhclQsX0FsbG9jPiBfX3Jlc3VsdDsKKyMgZGVmaW5lICBfX2V4cG9uZW50aWF0ZV90aHJlc2hvbGQgc2l6ZV90KDMyKQorICAgIF9Sb3BlUmVwKiBfX3JlbWFpbmRlcjsKKyAgICByb3BlPF9DaGFyVCxfQWxsb2M+IF9fcmVtYWluZGVyX3JvcGU7CisKKyAgICAvLyBnY2MtMi43LjIgYnVncworICAgIHR5cGVkZWYgX1NUTFBfUFJJViBfUm9wZV9Db25jYXRfZm48X0NoYXJULF9BbGxvYz4gX0NvbmNhdF9mbjsKKworICAgIHNpemVfdCBfX2V4cG9uZW50ID0gX19uIC8gX19leHBvbmVudGlhdGVfdGhyZXNob2xkOworICAgIHNpemVfdCBfX3Jlc3QgPSBfX24gJSBfX2V4cG9uZW50aWF0ZV90aHJlc2hvbGQ7CisgICAgaWYgKDAgPT0gX19yZXN0KSB7CisgICAgICBfX3JlbWFpbmRlciA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIF9DaGFyVCogX19yZXN0X2J1ZmZlciA9IF9NX3RyZWVfcHRyLmFsbG9jYXRlKF9TX3JvdW5kZWRfdXBfc2l6ZShfX3Jlc3QpKTsKKyAgICAgIHVuaW5pdGlhbGl6ZWRfZmlsbF9uKF9fcmVzdF9idWZmZXIsIF9fcmVzdCwgX19jKTsKKyAgICAgIF9TX2NvbnN0cnVjdF9udWxsKF9fcmVzdF9idWZmZXIgKyBfX3Jlc3QpOworICAgICAgX1NUTFBfVFJZIHsKKyAgICAgICAgX19yZW1haW5kZXIgPSBfU19uZXdfUm9wZUxlYWYoX19yZXN0X2J1ZmZlciwgX19yZXN0LCBfX2EpOworICAgICAgfQorICAgICAgX1NUTFBfVU5XSU5EKF9Sb3BlUmVwOjpfU19mcmVlX3N0cmluZyhfX3Jlc3RfYnVmZmVyLCBfX3Jlc3QsIF9fYSkpCisgICAgfQorICAgIF9fcmVtYWluZGVyX3JvcGUuX01fdHJlZV9wdHIuX01fZGF0YSA9IF9fcmVtYWluZGVyOworICAgIGlmIChfX2V4cG9uZW50ICE9IDApIHsKKyAgICAgIF9DaGFyVCogX19iYXNlX2J1ZmZlciA9IF9NX3RyZWVfcHRyLmFsbG9jYXRlKF9TX3JvdW5kZWRfdXBfc2l6ZShfX2V4cG9uZW50aWF0ZV90aHJlc2hvbGQpKTsKKyAgICAgIF9Sb3BlTGVhZiogX19iYXNlX2xlYWY7CisgICAgICByb3BlPF9DaGFyVCxfQWxsb2M+IF9fYmFzZV9yb3BlOworICAgICAgdW5pbml0aWFsaXplZF9maWxsX24oX19iYXNlX2J1ZmZlciwgX19leHBvbmVudGlhdGVfdGhyZXNob2xkLCBfX2MpOworICAgICAgX1NfY29uc3RydWN0X251bGwoX19iYXNlX2J1ZmZlciArIF9fZXhwb25lbnRpYXRlX3RocmVzaG9sZCk7CisgICAgICBfU1RMUF9UUlkgeworICAgICAgICBfX2Jhc2VfbGVhZiA9IF9TX25ld19Sb3BlTGVhZihfX2Jhc2VfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2V4cG9uZW50aWF0ZV90aHJlc2hvbGQsIF9fYSk7CisgICAgICB9CisgICAgICBfU1RMUF9VTldJTkQoX1JvcGVSZXA6Ol9TX2ZyZWVfc3RyaW5nKF9fYmFzZV9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZXhwb25lbnRpYXRlX3RocmVzaG9sZCwgX19hKSkKKyAgICAgIF9fYmFzZV9yb3BlLl9NX3RyZWVfcHRyLl9NX2RhdGEgPSBfX2Jhc2VfbGVhZjsKKyAgICAgIGlmICgxID09IF9fZXhwb25lbnQpIHsKKyAgICAgICAgX19yZXN1bHQgPSBfX2Jhc2Vfcm9wZTsKKyAgICAgICAgLy8gT25lIGVhY2ggZm9yIGJhc2Vfcm9wZSBhbmQgX19yZXN1bHQKKyAgICAgICAgLy9fU1RMUF9BU1NFUlQoMiA9PSBfX3Jlc3VsdC5fTV90cmVlX3B0ci5fTV9kYXRhLT5fTV9yZWZfY291bnQpCisgICAgICB9IGVsc2UgeworICAgICAgICBfX3Jlc3VsdCA9IF9TVExQX1BSSVYgX19wb3dlcihfX2Jhc2Vfcm9wZSwgX19leHBvbmVudCwgX0NvbmNhdF9mbigpKTsKKyAgICAgIH0KKyAgICAgIGlmICgwICE9IF9fcmVtYWluZGVyKSB7CisgICAgICAgIF9fcmVzdWx0ICs9IF9fcmVtYWluZGVyX3JvcGU7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIF9fcmVzdWx0ID0gX19yZW1haW5kZXJfcm9wZTsKKyAgICB9CisgICAgX01fdHJlZV9wdHIuX01fZGF0YSA9IF9fcmVzdWx0Ll9NX3RyZWVfcHRyLl9NX2RhdGE7CisgICAgX01fdHJlZV9wdHIuX01fZGF0YS0+X01fcmVmX25vbm5pbCgpOworIyB1bmRlZiBfX2V4cG9uZW50aWF0ZV90aHJlc2hvbGQKKyAgfQorCisgIHJvcGUoY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfTV90cmVlX3B0cihfX2EsIChfUm9wZVJlcCopMCkge30KKworICAvLyBDb25zdHJ1Y3QgYSByb3BlIGZyb20gYSBmdW5jdGlvbiB0aGF0IGNhbiBjb21wdXRlIGl0cyBtZW1iZXJzCisgIHJvcGUoY2hhcl9wcm9kdWNlcjxfQ2hhclQ+ICpfX2ZuLCBzaXplX3QgX19sZW4sIGJvb2wgX19kZWxldGVfZm4sCisgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfTV90cmVlX3B0cihfX2EsIChfUm9wZVJlcCopMCkgeworICAgIF9NX3RyZWVfcHRyLl9NX2RhdGEgPSAoMCA9PSBfX2xlbikgPworICAgICAgMCA6IF9TX25ld19Sb3BlRnVuY3Rpb24oX19mbiwgX19sZW4sIF9fZGVsZXRlX2ZuLCBfX2EpOworICB9CisKKyAgcm9wZShjb25zdCBfU2VsZiYgX194KQorICAgIDogX01fdHJlZV9wdHIoX194Ll9NX3RyZWVfcHRyLCBfX3guX01fdHJlZV9wdHIuX01fZGF0YSkgeworICAgIF9TX3JlZihfTV90cmVlX3B0ci5fTV9kYXRhKTsKKyAgfQorCisjaWYgIWRlZmluZWQgKF9TVExQX05PX01PVkVfU0VNQU5USUMpCisgIHJvcGUoX19tb3ZlX3NvdXJjZTxfU2VsZj4gX19zcmMpCisgICAgOiBfTV90cmVlX3B0cihfX3NyYy5nZXQoKS5fTV90cmVlX3B0ciwgX19zcmMuZ2V0KCkuX01fdHJlZV9wdHIuX01fZGF0YSkgeworICAgIF9fc3JjLmdldCgpLl9NX3RyZWVfcHRyLl9NX2RhdGEgPSAwOworICB9CisjZW5kaWYKKworICB+cm9wZSgpIHsKKyAgICBfU191bnJlZihfTV90cmVlX3B0ci5fTV9kYXRhKTsKKyAgfQorCisgIF9TZWxmJiBvcGVyYXRvcj0oY29uc3QgX1NlbGYmIF9feCkgeworICAgIF9TVExQX0FTU0VSVChnZXRfYWxsb2NhdG9yKCkgPT0gX194LmdldF9hbGxvY2F0b3IoKSkKKyAgICBfU19yZWYoX194Ll9NX3RyZWVfcHRyLl9NX2RhdGEpOworICAgIF9NX3Jlc2V0KF9feC5fTV90cmVlX3B0ci5fTV9kYXRhKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB2b2lkIGNsZWFyKCkgeworICAgIF9TX3VucmVmKF9NX3RyZWVfcHRyLl9NX2RhdGEpOworICAgIF9NX3RyZWVfcHRyLl9NX2RhdGEgPSAwOworICB9CisgIHZvaWQgcHVzaF9iYWNrKF9DaGFyVCBfX3gpIHsKKyAgICBfTV9yZXNldChfU19kZXN0cl9jb25jYXRfY2hhcl9pdGVyKF9NX3RyZWVfcHRyLl9NX2RhdGEsICZfX3gsIDEpKTsKKyAgfQorCisgIHZvaWQgcG9wX2JhY2soKSB7CisgICAgX1JvcGVSZXAqIF9fb2xkID0gX01fdHJlZV9wdHIuX01fZGF0YTsKKyAgICBfTV90cmVlX3B0ci5fTV9kYXRhID0KKyAgICAgIF9TX3N1YnN0cmluZyhfTV90cmVlX3B0ci5fTV9kYXRhLCAwLCBfTV90cmVlX3B0ci5fTV9kYXRhLT5fTV9zaXplLl9NX2RhdGEgLSAxKTsKKyAgICBfU191bnJlZihfX29sZCk7CisgIH0KKworICBfQ2hhclQgYmFjaygpIGNvbnN0IHsKKyAgICByZXR1cm4gX1NfZmV0Y2goX01fdHJlZV9wdHIuX01fZGF0YSwgX01fdHJlZV9wdHIuX01fZGF0YS0+X01fc2l6ZS5fTV9kYXRhIC0gMSk7CisgIH0KKworICB2b2lkIHB1c2hfZnJvbnQoX0NoYXJUIF9feCkgeworICAgIF9Sb3BlUmVwKiBfX29sZCA9IF9NX3RyZWVfcHRyLl9NX2RhdGE7CisgICAgX1JvcGVSZXAqIF9fbGVmdCA9CisgICAgICBfU19Sb3BlTGVhZl9mcm9tX3Vub3duZWRfY2hhcl9wdHIoJl9feCwgMSwgX01fdHJlZV9wdHIpOworICAgIF9TVExQX1RSWSB7CisgICAgICBfTV90cmVlX3B0ci5fTV9kYXRhID0gX1NfY29uY2F0X3JlcChfX2xlZnQsIF9NX3RyZWVfcHRyLl9NX2RhdGEpOworICAgICAgX1NfdW5yZWYoX19vbGQpOworICAgICAgX1NfdW5yZWYoX19sZWZ0KTsKKyAgICB9CisgICAgX1NUTFBfVU5XSU5EKF9TX3VucmVmKF9fbGVmdCkpCisgIH0KKworICB2b2lkIHBvcF9mcm9udCgpIHsKKyAgICBfUm9wZVJlcCogX19vbGQgPSBfTV90cmVlX3B0ci5fTV9kYXRhOworICAgIF9NX3RyZWVfcHRyLl9NX2RhdGEgPSBfU19zdWJzdHJpbmcoX01fdHJlZV9wdHIuX01fZGF0YSwgMSwgX01fdHJlZV9wdHIuX01fZGF0YS0+X01fc2l6ZS5fTV9kYXRhKTsKKyAgICBfU191bnJlZihfX29sZCk7CisgIH0KKworICBfQ2hhclQgZnJvbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIF9TX2ZldGNoKF9NX3RyZWVfcHRyLl9NX2RhdGEsIDApOworICB9CisKKyAgdm9pZCBiYWxhbmNlKCkgeworICAgIF9Sb3BlUmVwKiBfX29sZCA9IF9NX3RyZWVfcHRyLl9NX2RhdGE7CisgICAgX01fdHJlZV9wdHIuX01fZGF0YSA9IF9TX2JhbGFuY2UoX01fdHJlZV9wdHIuX01fZGF0YSk7CisgICAgX1NfdW5yZWYoX19vbGQpOworICB9CisKKyAgdm9pZCBjb3B5KF9DaGFyVCogX19idWZmZXIpIGNvbnN0IHsKKyAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95X1JhbmdlKF9fYnVmZmVyLCBfX2J1ZmZlciArIHNpemUoKSk7CisgICAgX1NfZmxhdHRlbihfTV90cmVlX3B0ci5fTV9kYXRhLCBfX2J1ZmZlcik7CisgIH0KKworICAvKgorICAgKiBUaGlzIGlzIHRoZSBjb3B5IGZ1bmN0aW9uIGZyb20gdGhlIHN0YW5kYXJkLCBidXQKKyAgICogd2l0aCB0aGUgYXJndW1lbnRzIHJlb3JkZXJlZCB0byBtYWtlIGl0IGNvbnNpc3RlbnQgd2l0aCB0aGUKKyAgICogcmVzdCBvZiB0aGUgaW50ZXJmYWNlLgorICAgKiBOb3RlIHRoYXQgdGhpcyBndWFyYW50ZWVkIG5vdCB0byBjb21waWxlIGlmIHRoZSBkcmFmdCBzdGFuZGFyZAorICAgKiBvcmRlciBpcyBhc3N1bWVkLgorICAgKi8KKyAgc2l6ZV90eXBlIGNvcHkoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uLCBfQ2hhclQqIF9fYnVmZmVyKSBjb25zdCB7CisgICAgc2l6ZV90IF9wX3NpemUgPSBzaXplKCk7CisgICAgc2l6ZV90IF9fbGVuID0gKF9fcG9zICsgX19uID4gX3Bfc2l6ZT8gX3Bfc2l6ZSAtIF9fcG9zIDogX19uKTsKKworICAgIF9TVExQX1NURDo6X0Rlc3Ryb3lfUmFuZ2UoX19idWZmZXIsIF9fYnVmZmVyICsgX19sZW4pOworICAgIF9TX2ZsYXR0ZW4oX01fdHJlZV9wdHIuX01fZGF0YSwgX19wb3MsIF9fbGVuLCBfX2J1ZmZlcik7CisgICAgcmV0dXJuIF9fbGVuOworICB9CisKKyMgaWZkZWYgX1NUTFBfREVCVUcKKyAgLy8gUHJpbnQgdG8gc3Rkb3V0LCBleHBvc2luZyBzdHJ1Y3R1cmUuICBNYXkgYmUgdXNlZnVsIGZvcgorICAvLyBwZXJmb3JtYW5jZSBkZWJ1Z2dpbmcuCisgIHZvaWQgZHVtcCgpIHsKKyAgICBfU19kdW1wKF9NX3RyZWVfcHRyLl9NX2RhdGEpOworICB9CisjIGVuZGlmCisKKyAgLy8gQ29udmVydCB0byAwIHRlcm1pbmF0ZWQgc3RyaW5nIGluIG5ldyBhbGxvY2F0ZWQgbWVtb3J5LgorICAvLyBFbWJlZGRlZCAwcyBpbiB0aGUgaW5wdXQgZG8gbm90IHRlcm1pbmF0ZSB0aGUgY29weS4KKyAgY29uc3QgX0NoYXJUKiBjX3N0cigpIGNvbnN0OworCisgIC8vIEFzIGFib3ZlLCBidXQgYWxzbyB1c2UgdGhlIGZsYXR0ZW5lZCByZXByZXNlbnRhdGlvbiBhcyB0aGUKKyAgLy8gdGhlIG5ldyByb3BlIHJlcHJlc2VudGF0aW9uLgorICBjb25zdCBfQ2hhclQqIHJlcGxhY2Vfd2l0aF9jX3N0cigpOworCisgIC8vIFJlY2xhaW0gbWVtb3J5IGZvciB0aGUgY19zdHIgZ2VuZXJhdGVkIGZsYXR0ZW5lZCBzdHJpbmcuCisgIC8vIEludGVudGlvbmFsbHkgdW5kb2N1bWVudGVkLCBzaW5jZSBpdCdzIGhhcmQgdG8gc2F5IHdoZW4gdGhpcworICAvLyBpcyBzYWZlIGZvciBtdWx0aXBsZSB0aHJlYWRzLgorICB2b2lkIGRlbGV0ZV9jX3N0ciAoKSB7CisgICAgaWYgKDAgPT0gX01fdHJlZV9wdHIuX01fZGF0YSkgcmV0dXJuOworICAgIGlmIChfUm9wZVJlcDo6X1NfbGVhZiA9PSBfTV90cmVlX3B0ci5fTV9kYXRhLT5fTV90YWcgJiYKKyAgICAgICAgKChfUm9wZUxlYWYqKV9NX3RyZWVfcHRyLl9NX2RhdGEpLT5fTV9kYXRhID09CisgICAgICAgIF9NX3RyZWVfcHRyLl9NX2RhdGEtPl9NX2Nfc3RyaW5nKSB7CisgICAgICAvLyBSZXByZXNlbnRhdGlvbiBzaGFyZWQKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgX01fdHJlZV9wdHIuX01fZGF0YS0+X01fZnJlZV9jX3N0cmluZygpOworICAgIF9NX3RyZWVfcHRyLl9NX2RhdGEtPl9NX2Nfc3RyaW5nID0gMDsKKyAgfQorCisgIF9DaGFyVCBvcGVyYXRvcltdIChzaXplX3R5cGUgX19wb3MpIGNvbnN0IHsKKyAgICByZXR1cm4gX1NfZmV0Y2goX01fdHJlZV9wdHIuX01fZGF0YSwgX19wb3MpOworICB9CisKKyAgX0NoYXJUIGF0KHNpemVfdHlwZSBfX3BvcykgY29uc3QgeworICAgIGlmIChfX3BvcyA+PSBzaXplKCkpIF9NX3Rocm93X291dF9vZl9yYW5nZSgpOworICAgIHJldHVybiAoKnRoaXMpW19fcG9zXTsKKyAgfQorCisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeworICAgIHJldHVybihjb25zdF9pdGVyYXRvcihfTV90cmVlX3B0ci5fTV9kYXRhLCAwKSk7CisgIH0KKworICAvLyBBbiBlYXN5IHdheSB0byBnZXQgYSBjb25zdCBpdGVyYXRvciBmcm9tIGEgbm9uLWNvbnN0IGNvbnRhaW5lci4KKyAgY29uc3RfaXRlcmF0b3IgY29uc3RfYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuKGNvbnN0X2l0ZXJhdG9yKF9NX3RyZWVfcHRyLl9NX2RhdGEsIDApKTsKKyAgfQorCisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4oY29uc3RfaXRlcmF0b3IoX01fdHJlZV9wdHIuX01fZGF0YSwgc2l6ZSgpKSk7CisgIH0KKworICBjb25zdF9pdGVyYXRvciBjb25zdF9lbmQoKSBjb25zdCB7CisgICAgcmV0dXJuKGNvbnN0X2l0ZXJhdG9yKF9NX3RyZWVfcHRyLl9NX2RhdGEsIHNpemUoKSkpOworICB9CisKKyAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuKDAgPT0gX01fdHJlZV9wdHIuX01fZGF0YT8gMCA6IF9NX3RyZWVfcHRyLl9NX2RhdGEtPl9NX3NpemUuX01fZGF0YSk7CisgIH0KKworICBzaXplX3R5cGUgbGVuZ3RoKCkgY29uc3QgeworICAgIHJldHVybiBzaXplKCk7CisgIH0KKworICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIF9TX21pbl9sZW5bX19ST1BFX01BWF9ERVBUSC0xXSAtIDE7CisgICAgLy8gIEd1YXJhbnRlZXMgdGhhdCB0aGUgcmVzdWx0IGNhbiBiZSBzdWZmaWNpZW50bHkKKyAgICAvLyAgYmFsYW5jZWQuICBMb25nZXIgcm9wZXMgd2lsbCBwcm9iYWJseSBzdGlsbCB3b3JrLAorICAgIC8vICBidXQgaXQncyBoYXJkZXIgdG8gbWFrZSBndWFyYW50ZWVzLgorICB9CisKKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOworICB9CisKKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciBjb25zdF9yYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOworICB9CisKKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOworICB9CisKKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciBjb25zdF9yZW5kKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOworICB9CisgIC8vIFRoZSBzeW1tZXRyaWMgY2FzZXMgYXJlIGludGVudGlvbmFsbHkgb21pdHRlZCwgc2luY2UgdGhleSdyZSBwcmVzdW1lZAorICAvLyB0byBiZSBsZXNzIGNvbW1vbiwgYW5kIHdlIGRvbid0IGhhbmRsZSB0aGVtIGFzIHdlbGwuCisKKyAgLy8gVGhlIGZvbGxvd2luZyBzaG91bGQgcmVhbGx5IGJlIHRlbXBsYXRpemVkLgorICAvLyBUaGUgZmlyc3QgYXJndW1lbnQgc2hvdWxkIGJlIGFuIGlucHV0IGl0ZXJhdG9yIG9yCisgIC8vIGZvcndhcmQgaXRlcmF0b3Igd2l0aCB2YWx1ZV90eXBlIF9DaGFyVC4KKyAgX1NlbGYmIGFwcGVuZChjb25zdCBfQ2hhclQqIF9faXRlciwgc2l6ZV90IF9fbikgeworICAgIF9NX3Jlc2V0KF9TX2Rlc3RyX2NvbmNhdF9jaGFyX2l0ZXIoX01fdHJlZV9wdHIuX01fZGF0YSwgX19pdGVyLCBfX24pKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBfU2VsZiYgYXBwZW5kKGNvbnN0IF9DaGFyVCogX19jX3N0cmluZykgeworICAgIHNpemVfdCBfX2xlbiA9IF9TX2NoYXJfcHRyX2xlbihfX2Nfc3RyaW5nKTsKKyAgICBhcHBlbmQoX19jX3N0cmluZywgX19sZW4pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIF9TZWxmJiBhcHBlbmQoY29uc3QgX0NoYXJUKiBfX3MsIGNvbnN0IF9DaGFyVCogX19lKSB7CisgICAgX01fcmVzZXQoX1NfZGVzdHJfY29uY2F0X2NoYXJfaXRlcihfTV90cmVlX3B0ci5fTV9kYXRhLCBfX3MsIF9fZSAtIF9fcykpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIF9TZWxmJiBhcHBlbmQoY29uc3RfaXRlcmF0b3IgX19zLCBjb25zdF9pdGVyYXRvciBfX2UpIHsKKyAgICBfU1RMUF9BU1NFUlQoX19zLl9NX3Jvb3QgPT0gX19lLl9NX3Jvb3QpCisgICAgX1NUTFBfQVNTRVJUKGdldF9hbGxvY2F0b3IoKSA9PSBfX3MuX01fcm9vdC0+Z2V0X2FsbG9jYXRvcigpKQorICAgIF9TZWxmX2Rlc3RydWN0X3B0ciBfX2FwcGVuZGVlKF9TX3N1YnN0cmluZyhfX3MuX01fcm9vdCwgX19zLl9NX2N1cnJlbnRfcG9zLCBfX2UuX01fY3VycmVudF9wb3MpKTsKKyAgICBfTV9yZXNldChfU19jb25jYXRfcmVwKF9NX3RyZWVfcHRyLl9NX2RhdGEsIChfUm9wZVJlcCopX19hcHBlbmRlZSkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIF9TZWxmJiBhcHBlbmQoX0NoYXJUIF9fYykgeworICAgIF9NX3Jlc2V0KF9TX2Rlc3RyX2NvbmNhdF9jaGFyX2l0ZXIoX01fdHJlZV9wdHIuX01fZGF0YSwgJl9fYywgMSkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIF9TZWxmJiBhcHBlbmQoKSB7IHJldHVybiBhcHBlbmQoX0NoYXJUKCkpOyB9ICAvLyBYWFggd2h5PworCisgIF9TZWxmJiBhcHBlbmQoY29uc3QgX1NlbGYmIF9feSkgeworICAgIF9TVExQX0FTU0VSVChfX3kuZ2V0X2FsbG9jYXRvcigpID09IGdldF9hbGxvY2F0b3IoKSkKKyAgICBfTV9yZXNldChfU19jb25jYXRfcmVwKF9NX3RyZWVfcHRyLl9NX2RhdGEsIF9feS5fTV90cmVlX3B0ci5fTV9kYXRhKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgX1NlbGYmIGFwcGVuZChzaXplX3QgX19uLCBfQ2hhclQgX19jKSB7CisgICAgcm9wZTxfQ2hhclQsX0FsbG9jPiBfX2xhc3QoX19uLCBfX2MpOworICAgIHJldHVybiBhcHBlbmQoX19sYXN0KTsKKyAgfQorCisgIHZvaWQgc3dhcChfU2VsZiYgX19iKSB7CisgICAgX01fdHJlZV9wdHIuc3dhcChfX2IuX01fdHJlZV9wdHIpOworICB9CisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKSAmJiAhZGVmaW5lZCAoX1NUTFBfRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSKQorICB2b2lkIF9NX3N3YXBfd29ya2Fyb3VuZChfU2VsZiYgX194KSB7IHN3YXAoX194KTsgfQorI2VuZGlmCisKK3Byb3RlY3RlZDoKKyAgLy8gUmVzdWx0IGlzIGluY2x1ZGVkIGluIHJlZmNvdW50LgorICBzdGF0aWMgX1JvcGVSZXAqIHJlcGxhY2UoX1JvcGVSZXAqIF9fb2xkLCBzaXplX3QgX19wb3MxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IF9fcG9zMiwgX1JvcGVSZXAqIF9fcikgeworICAgIGlmICgwID09IF9fb2xkKSB7IF9TX3JlZihfX3IpOyByZXR1cm4gX19yOyB9CisgICAgX1NlbGZfZGVzdHJ1Y3RfcHRyIF9fbGVmdChfU19zdWJzdHJpbmcoX19vbGQsIDAsIF9fcG9zMSkpOworICAgIF9TZWxmX2Rlc3RydWN0X3B0ciBfX3JpZ2h0KF9TX3N1YnN0cmluZyhfX29sZCwgX19wb3MyLCBfX29sZC0+X01fc2l6ZS5fTV9kYXRhKSk7CisgICAgX1NUTFBfTVBXRklYX1RSWSAgLy8qVFkgMDYvMDEvMjAwMCAtCisgICAgX1JvcGVSZXAqIF9fcmVzdWx0OworCisgICAgaWYgKDAgPT0gX19yKSB7CisgICAgICBfX3Jlc3VsdCA9IF9TX2NvbmNhdF9yZXAoX19sZWZ0LCBfX3JpZ2h0KTsKKyAgICB9IGVsc2UgeworICAgICAgX1NUTFBfQVNTRVJUKF9fb2xkLT5nZXRfYWxsb2NhdG9yKCkgPT0gX19yLT5nZXRfYWxsb2NhdG9yKCkpCisgICAgICBfU2VsZl9kZXN0cnVjdF9wdHIgX19sZWZ0X3Jlc3VsdChfU19jb25jYXRfcmVwKF9fbGVmdCwgX19yKSk7CisgICAgICBfX3Jlc3VsdCA9IF9TX2NvbmNhdF9yZXAoX19sZWZ0X3Jlc3VsdCwgX19yaWdodCk7CisgICAgfQorICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgICBfU1RMUF9NUFdGSVhfQ0FUQ0ggIC8vKlRZIDA2LzAxLzIwMDAgLQorICB9CisKK3B1YmxpYzoKKyAgdm9pZCBpbnNlcnQoc2l6ZV90IF9fcCwgY29uc3QgX1NlbGYmIF9fcikgeworICAgIGlmIChfX3AgPiBzaXplKCkpIF9NX3Rocm93X291dF9vZl9yYW5nZSgpOworICAgIF9TVExQX0FTU0VSVChnZXRfYWxsb2NhdG9yKCkgPT0gX19yLmdldF9hbGxvY2F0b3IoKSkKKyAgICBfTV9yZXNldChyZXBsYWNlKF9NX3RyZWVfcHRyLl9NX2RhdGEsIF9fcCwgX19wLCBfX3IuX01fdHJlZV9wdHIuX01fZGF0YSkpOworICB9CisKKyAgdm9pZCBpbnNlcnQoc2l6ZV90IF9fcCwgc2l6ZV90IF9fbiwgX0NoYXJUIF9fYykgeworICAgIHJvcGU8X0NoYXJULF9BbGxvYz4gX19yKF9fbixfX2MpOworICAgIGluc2VydChfX3AsIF9fcik7CisgIH0KKworICB2b2lkIGluc2VydChzaXplX3QgX19wLCBjb25zdCBfQ2hhclQqIF9faSwgc2l6ZV90IF9fbikgeworICAgIGlmIChfX3AgPiBzaXplKCkpIF9NX3Rocm93X291dF9vZl9yYW5nZSgpOworICAgIF9TZWxmX2Rlc3RydWN0X3B0ciBfX2xlZnQoX1Nfc3Vic3RyaW5nKF9NX3RyZWVfcHRyLl9NX2RhdGEsIDAsIF9fcCkpOworICAgIF9TZWxmX2Rlc3RydWN0X3B0ciBfX3JpZ2h0KF9TX3N1YnN0cmluZyhfTV90cmVlX3B0ci5fTV9kYXRhLCBfX3AsIHNpemUoKSkpOworICAgIF9TZWxmX2Rlc3RydWN0X3B0ciBfX2xlZnRfcmVzdWx0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TX2NvbmNhdF9jaGFyX2l0ZXIoX19sZWZ0LCBfX2ksIF9fbikpOworICAgIC8vIF9TXyBkZXN0cl9jb25jYXRfY2hhcl9pdGVyIHNob3VsZCBiZSBzYWZlIGhlcmUuCisgICAgLy8gQnV0IGFzIGl0IHN0YW5kcyBpdCdzIHByb2JhYmx5IG5vdCBhIHdpbiwgc2luY2UgX19sZWZ0CisgICAgLy8gaXMgbGlrZWx5IHRvIGhhdmUgYWRkaXRpb25hbCByZWZlcmVuY2VzLgorICAgIF9NX3Jlc2V0KF9TX2NvbmNhdF9yZXAoX19sZWZ0X3Jlc3VsdCwgX19yaWdodCkpOworICB9CisKKyAgdm9pZCBpbnNlcnQoc2l6ZV90IF9fcCwgY29uc3QgX0NoYXJUKiBfX2Nfc3RyaW5nKSB7CisgICAgaW5zZXJ0KF9fcCwgX19jX3N0cmluZywgX1NfY2hhcl9wdHJfbGVuKF9fY19zdHJpbmcpKTsKKyAgfQorCisgIHZvaWQgaW5zZXJ0KHNpemVfdCBfX3AsIF9DaGFyVCBfX2MpIHsKKyAgICBpbnNlcnQoX19wLCAmX19jLCAxKTsKKyAgfQorCisgIHZvaWQgaW5zZXJ0KHNpemVfdCBfX3ApIHsKKyAgICBfQ2hhclQgX19jID0gX0NoYXJUKCk7CisgICAgaW5zZXJ0KF9fcCwgJl9fYywgMSk7CisgIH0KKworICB2b2lkIGluc2VydChzaXplX3QgX19wLCBjb25zdCBfQ2hhclQqIF9faSwgY29uc3QgX0NoYXJUKiBfX2opIHsKKyAgICBfU2VsZiBfX3IoX19pLCBfX2opOworICAgIGluc2VydChfX3AsIF9fcik7CisgIH0KKworICB2b2lkIGluc2VydChzaXplX3QgX19wLCBjb25zdCBjb25zdF9pdGVyYXRvciYgX19pLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb25zdF9pdGVyYXRvciYgX19qKSB7CisgICAgX1NlbGYgX19yKF9faSwgX19qKTsKKyAgICBpbnNlcnQoX19wLCBfX3IpOworICB9CisKKyAgdm9pZCBpbnNlcnQoc2l6ZV90IF9fcCwgY29uc3QgaXRlcmF0b3ImIF9faSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlcmF0b3ImIF9faikgeworICAgIF9TZWxmIF9fcihfX2ksIF9faik7CisgICAgaW5zZXJ0KF9fcCwgX19yKTsKKyAgfQorCisgIC8vIChwb3NpdGlvbiwgbGVuZ3RoKSB2ZXJzaW9ucyBvZiByZXBsYWNlIG9wZXJhdGlvbnM6CisgIHZvaWQgcmVwbGFjZShzaXplX3QgX19wLCBzaXplX3QgX19uLCBjb25zdCBfU2VsZiYgX19yKSB7CisgICAgaWYgKF9fcCA+IHNpemUoKSkgX01fdGhyb3dfb3V0X29mX3JhbmdlKCk7CisgICAgX01fcmVzZXQocmVwbGFjZShfTV90cmVlX3B0ci5fTV9kYXRhLCBfX3AsIF9fcCArIF9fbiwgX19yLl9NX3RyZWVfcHRyLl9NX2RhdGEpKTsKKyAgfQorCisgIHZvaWQgcmVwbGFjZShzaXplX3QgX19wLCBzaXplX3QgX19uLAorICAgICAgICAgICAgICAgY29uc3QgX0NoYXJUKiBfX2ksIHNpemVfdCBfX2lfbGVuKSB7CisgICAgX1NlbGYgX19yKF9faSwgX19pX2xlbik7CisgICAgcmVwbGFjZShfX3AsIF9fbiwgX19yKTsKKyAgfQorCisgIHZvaWQgcmVwbGFjZShzaXplX3QgX19wLCBzaXplX3QgX19uLCBfQ2hhclQgX19jKSB7CisgICAgX1NlbGYgX19yKF9fYyk7CisgICAgcmVwbGFjZShfX3AsIF9fbiwgX19yKTsKKyAgfQorCisgIHZvaWQgcmVwbGFjZShzaXplX3QgX19wLCBzaXplX3QgX19uLCBjb25zdCBfQ2hhclQqIF9fY19zdHJpbmcpIHsKKyAgICBfU2VsZiBfX3IoX19jX3N0cmluZyk7CisgICAgcmVwbGFjZShfX3AsIF9fbiwgX19yKTsKKyAgfQorCisgIHZvaWQgcmVwbGFjZShzaXplX3QgX19wLCBzaXplX3QgX19uLAorICAgICAgICAgICAgICAgY29uc3QgX0NoYXJUKiBfX2ksIGNvbnN0IF9DaGFyVCogX19qKSB7CisgICAgX1NlbGYgX19yKF9faSwgX19qKTsKKyAgICByZXBsYWNlKF9fcCwgX19uLCBfX3IpOworICB9CisKKyAgdm9pZCByZXBsYWNlKHNpemVfdCBfX3AsIHNpemVfdCBfX24sCisgICAgICAgICAgICAgICBjb25zdCBjb25zdF9pdGVyYXRvciYgX19pLCBjb25zdCBjb25zdF9pdGVyYXRvciYgX19qKSB7CisgICAgX1NlbGYgX19yKF9faSwgX19qKTsKKyAgICByZXBsYWNlKF9fcCwgX19uLCBfX3IpOworICB9CisKKyAgdm9pZCByZXBsYWNlKHNpemVfdCBfX3AsIHNpemVfdCBfX24sCisgICAgICAgICAgICAgICBjb25zdCBpdGVyYXRvciYgX19pLCBjb25zdCBpdGVyYXRvciYgX19qKSB7CisgICAgX1NlbGYgX19yKF9faSwgX19qKTsKKyAgICByZXBsYWNlKF9fcCwgX19uLCBfX3IpOworICB9CisKKyAgLy8gU2luZ2xlIGNoYXJhY3RlciB2YXJpYW50czoKKyAgdm9pZCByZXBsYWNlKHNpemVfdCBfX3AsIF9DaGFyVCBfX2MpIHsKKyAgICBpZiAoX19wID4gc2l6ZSgpKSBfTV90aHJvd19vdXRfb2ZfcmFuZ2UoKTsKKyAgICBpdGVyYXRvciBfX2kodGhpcywgX19wKTsKKyAgICAqX19pID0gX19jOworICB9CisKKyAgdm9pZCByZXBsYWNlKHNpemVfdCBfX3AsIGNvbnN0IF9TZWxmJiBfX3IpIHsKKyAgICByZXBsYWNlKF9fcCwgMSwgX19yKTsKKyAgfQorCisgIHZvaWQgcmVwbGFjZShzaXplX3QgX19wLCBjb25zdCBfQ2hhclQqIF9faSwgc2l6ZV90IF9faV9sZW4pIHsKKyAgICByZXBsYWNlKF9fcCwgMSwgX19pLCBfX2lfbGVuKTsKKyAgfQorCisgIHZvaWQgcmVwbGFjZShzaXplX3QgX19wLCBjb25zdCBfQ2hhclQqIF9fY19zdHJpbmcpIHsKKyAgICByZXBsYWNlKF9fcCwgMSwgX19jX3N0cmluZyk7CisgIH0KKworICB2b2lkIHJlcGxhY2Uoc2l6ZV90IF9fcCwgY29uc3QgX0NoYXJUKiBfX2ksIGNvbnN0IF9DaGFyVCogX19qKSB7CisgICAgcmVwbGFjZShfX3AsIDEsIF9faSwgX19qKTsKKyAgfQorCisgIHZvaWQgcmVwbGFjZShzaXplX3QgX19wLCBjb25zdCBjb25zdF9pdGVyYXRvciYgX19pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29uc3RfaXRlcmF0b3ImIF9faikgeworICAgIHJlcGxhY2UoX19wLCAxLCBfX2ksIF9faik7CisgIH0KKworICB2b2lkIHJlcGxhY2Uoc2l6ZV90IF9fcCwgY29uc3QgaXRlcmF0b3ImIF9faSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZXJhdG9yJiBfX2opIHsKKyAgICByZXBsYWNlKF9fcCwgMSwgX19pLCBfX2opOworICB9CisKKyAgLy8gRXJhc2UsIChwb3NpdGlvbiwgc2l6ZSkgdmFyaWFudC4KKyAgdm9pZCBlcmFzZShzaXplX3QgX19wLCBzaXplX3QgX19uKSB7CisgICAgaWYgKF9fcCA+IHNpemUoKSkgX01fdGhyb3dfb3V0X29mX3JhbmdlKCk7CisgICAgX01fcmVzZXQocmVwbGFjZShfTV90cmVlX3B0ci5fTV9kYXRhLCBfX3AsIF9fcCArIF9fbiwgMCkpOworICB9CisKKyAgLy8gRXJhc2UsIHNpbmdsZSBjaGFyYWN0ZXIKKyAgdm9pZCBlcmFzZShzaXplX3QgX19wKSB7CisgICAgZXJhc2UoX19wLCBfX3AgKyAxKTsKKyAgfQorCisgIC8vIEluc2VydCwgaXRlcmF0b3IgdmFyaWFudHMuCisgIGl0ZXJhdG9yIGluc2VydChjb25zdCBpdGVyYXRvciYgX19wLCBjb25zdCBfU2VsZiYgX19yKQorICB7IGluc2VydChfX3AuaW5kZXgoKSwgX19yKTsgcmV0dXJuIF9fcDsgfQorICBpdGVyYXRvciBpbnNlcnQoY29uc3QgaXRlcmF0b3ImIF9fcCwgc2l6ZV90IF9fbiwgX0NoYXJUIF9fYykKKyAgeyBpbnNlcnQoX19wLmluZGV4KCksIF9fbiwgX19jKTsgcmV0dXJuIF9fcDsgfQorICBpdGVyYXRvciBpbnNlcnQoY29uc3QgaXRlcmF0b3ImIF9fcCwgX0NoYXJUIF9fYykKKyAgeyBpbnNlcnQoX19wLmluZGV4KCksIF9fYyk7IHJldHVybiBfX3A7IH0KKyAgaXRlcmF0b3IgaW5zZXJ0KGNvbnN0IGl0ZXJhdG9yJiBfX3AgKQorICB7IGluc2VydChfX3AuaW5kZXgoKSk7IHJldHVybiBfX3A7IH0KKyAgaXRlcmF0b3IgaW5zZXJ0KGNvbnN0IGl0ZXJhdG9yJiBfX3AsIGNvbnN0IF9DaGFyVCogY19zdHJpbmcpCisgIHsgaW5zZXJ0KF9fcC5pbmRleCgpLCBjX3N0cmluZyk7IHJldHVybiBfX3A7IH0KKyAgaXRlcmF0b3IgaW5zZXJ0KGNvbnN0IGl0ZXJhdG9yJiBfX3AsIGNvbnN0IF9DaGFyVCogX19pLCBzaXplX3QgX19uKQorICB7IGluc2VydChfX3AuaW5kZXgoKSwgX19pLCBfX24pOyByZXR1cm4gX19wOyB9CisgIGl0ZXJhdG9yIGluc2VydChjb25zdCBpdGVyYXRvciYgX19wLCBjb25zdCBfQ2hhclQqIF9faSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IF9DaGFyVCogX19qKQorICB7IGluc2VydChfX3AuaW5kZXgoKSwgX19pLCBfX2opOyAgcmV0dXJuIF9fcDsgfQorICBpdGVyYXRvciBpbnNlcnQoY29uc3QgaXRlcmF0b3ImIF9fcCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiBfX2ksIGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiBfX2opCisgIHsgaW5zZXJ0KF9fcC5pbmRleCgpLCBfX2ksIF9faik7IHJldHVybiBfX3A7IH0KKyAgaXRlcmF0b3IgaW5zZXJ0KGNvbnN0IGl0ZXJhdG9yJiBfX3AsCisgICAgICAgICAgICAgICAgICBjb25zdCBpdGVyYXRvciYgX19pLCBjb25zdCBpdGVyYXRvciYgX19qKQorICB7IGluc2VydChfX3AuaW5kZXgoKSwgX19pLCBfX2opOyByZXR1cm4gX19wOyB9CisKKyAgLy8gUmVwbGFjZSwgcmFuZ2UgdmFyaWFudHMuCisgIHZvaWQgcmVwbGFjZShjb25zdCBpdGVyYXRvciYgX19wLCBjb25zdCBpdGVyYXRvciYgX19xLAorICAgICAgICAgICAgICAgY29uc3QgX1NlbGYmIF9fcikKKyAgeyByZXBsYWNlKF9fcC5pbmRleCgpLCBfX3EuaW5kZXgoKSAtIF9fcC5pbmRleCgpLCBfX3IpOyB9CisgIHZvaWQgcmVwbGFjZShjb25zdCBpdGVyYXRvciYgX19wLCBjb25zdCBpdGVyYXRvciYgX19xLCBfQ2hhclQgX19jKQorICB7IHJlcGxhY2UoX19wLmluZGV4KCksIF9fcS5pbmRleCgpIC0gX19wLmluZGV4KCksIF9fYyk7IH0KKyAgdm9pZCByZXBsYWNlKGNvbnN0IGl0ZXJhdG9yJiBfX3AsIGNvbnN0IGl0ZXJhdG9yJiBfX3EsCisgICAgICAgICAgICAgICBjb25zdCBfQ2hhclQqIF9fY19zdHJpbmcpCisgIHsgcmVwbGFjZShfX3AuaW5kZXgoKSwgX19xLmluZGV4KCkgLSBfX3AuaW5kZXgoKSwgX19jX3N0cmluZyk7IH0KKyAgdm9pZCByZXBsYWNlKGNvbnN0IGl0ZXJhdG9yJiBfX3AsIGNvbnN0IGl0ZXJhdG9yJiBfX3EsCisgICAgICAgICAgICAgICBjb25zdCBfQ2hhclQqIF9faSwgc2l6ZV90IF9fbikKKyAgeyByZXBsYWNlKF9fcC5pbmRleCgpLCBfX3EuaW5kZXgoKSAtIF9fcC5pbmRleCgpLCBfX2ksIF9fbik7IH0KKyAgdm9pZCByZXBsYWNlKGNvbnN0IGl0ZXJhdG9yJiBfX3AsIGNvbnN0IGl0ZXJhdG9yJiBfX3EsCisgICAgICAgICAgICAgICBjb25zdCBfQ2hhclQqIF9faSwgY29uc3QgX0NoYXJUKiBfX2opCisgIHsgcmVwbGFjZShfX3AuaW5kZXgoKSwgX19xLmluZGV4KCkgLSBfX3AuaW5kZXgoKSwgX19pLCBfX2opOyB9CisgIHZvaWQgcmVwbGFjZShjb25zdCBpdGVyYXRvciYgX19wLCBjb25zdCBpdGVyYXRvciYgX19xLAorICAgICAgICAgICAgICAgY29uc3QgY29uc3RfaXRlcmF0b3ImIF9faSwgY29uc3QgY29uc3RfaXRlcmF0b3ImIF9faikKKyAgeyByZXBsYWNlKF9fcC5pbmRleCgpLCBfX3EuaW5kZXgoKSAtIF9fcC5pbmRleCgpLCBfX2ksIF9faik7IH0KKyAgdm9pZCByZXBsYWNlKGNvbnN0IGl0ZXJhdG9yJiBfX3AsIGNvbnN0IGl0ZXJhdG9yJiBfX3EsCisgICAgICAgICAgICAgICBjb25zdCBpdGVyYXRvciYgX19pLCBjb25zdCBpdGVyYXRvciYgX19qKQorICB7IHJlcGxhY2UoX19wLmluZGV4KCksIF9fcS5pbmRleCgpIC0gX19wLmluZGV4KCksIF9faSwgX19qKTsgfQorCisgIC8vIFJlcGxhY2UsIGl0ZXJhdG9yIHZhcmlhbnRzLgorICB2b2lkIHJlcGxhY2UoY29uc3QgaXRlcmF0b3ImIF9fcCwgY29uc3QgX1NlbGYmIF9fcikKKyAgeyByZXBsYWNlKF9fcC5pbmRleCgpLCBfX3IpOyB9CisgIHZvaWQgcmVwbGFjZShjb25zdCBpdGVyYXRvciYgX19wLCBfQ2hhclQgX19jKQorICB7IHJlcGxhY2UoX19wLmluZGV4KCksIF9fYyk7IH0KKyAgdm9pZCByZXBsYWNlKGNvbnN0IGl0ZXJhdG9yJiBfX3AsIGNvbnN0IF9DaGFyVCogX19jX3N0cmluZykKKyAgeyByZXBsYWNlKF9fcC5pbmRleCgpLCBfX2Nfc3RyaW5nKTsgfQorICB2b2lkIHJlcGxhY2UoY29uc3QgaXRlcmF0b3ImIF9fcCwgY29uc3QgX0NoYXJUKiBfX2ksIHNpemVfdCBfX24pCisgIHsgcmVwbGFjZShfX3AuaW5kZXgoKSwgX19pLCBfX24pOyB9CisgIHZvaWQgcmVwbGFjZShjb25zdCBpdGVyYXRvciYgX19wLCBjb25zdCBfQ2hhclQqIF9faSwgY29uc3QgX0NoYXJUKiBfX2opCisgIHsgcmVwbGFjZShfX3AuaW5kZXgoKSwgX19pLCBfX2opOyB9CisgIHZvaWQgcmVwbGFjZShjb25zdCBpdGVyYXRvciYgX19wLCBjb25zdF9pdGVyYXRvciBfX2ksCisgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvciBfX2opCisgIHsgcmVwbGFjZShfX3AuaW5kZXgoKSwgX19pLCBfX2opOyB9CisgIHZvaWQgcmVwbGFjZShjb25zdCBpdGVyYXRvciYgX19wLCBpdGVyYXRvciBfX2ksIGl0ZXJhdG9yIF9faikKKyAgeyByZXBsYWNlKF9fcC5pbmRleCgpLCBfX2ksIF9faik7IH0KKworICAvLyBJdGVyYXRvciBhbmQgcmFuZ2UgdmFyaWFudHMgb2YgZXJhc2UKKyAgaXRlcmF0b3IgZXJhc2UoY29uc3QgaXRlcmF0b3ImIF9fcCwgY29uc3QgaXRlcmF0b3ImIF9fcSkgeworICAgIHNpemVfdCBfX3BfaW5kZXggPSBfX3AuaW5kZXgoKTsKKyAgICBlcmFzZShfX3BfaW5kZXgsIF9fcS5pbmRleCgpIC0gX19wX2luZGV4KTsKKyAgICByZXR1cm4gaXRlcmF0b3IodGhpcywgX19wX2luZGV4KTsKKyAgfQorICBpdGVyYXRvciBlcmFzZShjb25zdCBpdGVyYXRvciYgX19wKSB7CisgICAgc2l6ZV90IF9fcF9pbmRleCA9IF9fcC5pbmRleCgpOworICAgIGVyYXNlKF9fcF9pbmRleCwgMSk7CisgICAgcmV0dXJuIGl0ZXJhdG9yKHRoaXMsIF9fcF9pbmRleCk7CisgIH0KKworICBfU2VsZiBzdWJzdHIoc2l6ZV90IF9fc3RhcnQsIHNpemVfdCBfX2xlbiA9IDEpIGNvbnN0IHsKKyAgICBpZiAoX19zdGFydCA+IHNpemUoKSkgX01fdGhyb3dfb3V0X29mX3JhbmdlKCk7CisgICAgcmV0dXJuIHJvcGU8X0NoYXJULF9BbGxvYz4oX1Nfc3Vic3RyaW5nKF9NX3RyZWVfcHRyLl9NX2RhdGEsIF9fc3RhcnQsIF9fc3RhcnQgKyBfX2xlbikpOworICB9CisKKyAgX1NlbGYgc3Vic3RyKGl0ZXJhdG9yIF9fc3RhcnQsIGl0ZXJhdG9yIF9fZW5kKSBjb25zdCB7CisgICAgcmV0dXJuIHJvcGU8X0NoYXJULF9BbGxvYz4oX1Nfc3Vic3RyaW5nKF9NX3RyZWVfcHRyLl9NX2RhdGEsIF9fc3RhcnQuaW5kZXgoKSwgX19lbmQuaW5kZXgoKSkpOworICB9CisKKyAgX1NlbGYgc3Vic3RyKGl0ZXJhdG9yIF9fc3RhcnQpIGNvbnN0IHsKKyAgICBzaXplX3QgX19wb3MgPSBfX3N0YXJ0LmluZGV4KCk7CisgICAgcmV0dXJuIHJvcGU8X0NoYXJULF9BbGxvYz4oX1Nfc3Vic3RyaW5nKF9NX3RyZWVfcHRyLl9NX2RhdGEsIF9fcG9zLCBfX3BvcyArIDEpKTsKKyAgfQorCisgIF9TZWxmIHN1YnN0cihjb25zdF9pdGVyYXRvciBfX3N0YXJ0LCBjb25zdF9pdGVyYXRvciBfX2VuZCkgY29uc3QgeworICAgIC8vIFRoaXMgbWlnaHQgZXZlbnR1YWxseSB0YWtlIGFkdmFudGFnZSBvZiB0aGUgY2FjaGUgaW4gdGhlCisgICAgLy8gaXRlcmF0b3IuCisgICAgcmV0dXJuIHJvcGU8X0NoYXJULF9BbGxvYz4oX1Nfc3Vic3RyaW5nKF9NX3RyZWVfcHRyLl9NX2RhdGEsIF9fc3RhcnQuaW5kZXgoKSwgX19lbmQuaW5kZXgoKSkpOworICB9CisKKyAgcm9wZTxfQ2hhclQsX0FsbG9jPiBzdWJzdHIoY29uc3RfaXRlcmF0b3IgX19zdGFydCkgeworICAgIHNpemVfdCBfX3BvcyA9IF9fc3RhcnQuaW5kZXgoKTsKKyAgICByZXR1cm4gcm9wZTxfQ2hhclQsX0FsbG9jPihfU19zdWJzdHJpbmcoX01fdHJlZV9wdHIuX01fZGF0YSwgX19wb3MsIF9fcG9zICsgMSkpOworICB9CisKKyNpbmNsdWRlIDxzdGwvX3N0cmluZ19ucG9zLmg+CisKKyAgc2l6ZV90eXBlIGZpbmQoY29uc3QgX1NlbGYmIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QgeworICAgIGlmIChfX3BvcyA+PSBzaXplKCkpCisjIGlmbmRlZiBfU1RMUF9PTERfUk9QRV9TRU1BTlRJQ1MKKyAgICAgIHJldHVybiBucG9zOworIyBlbHNlCisgICAgICByZXR1cm4gc2l6ZSgpOworIyBlbmRpZgorCisgICAgc2l6ZV90eXBlIF9fcmVzdWx0X3BvczsKKyAgICBjb25zdF9pdGVyYXRvciBfX3Jlc3VsdCA9IF9TVExQX1NURDo6c2VhcmNoKGNvbnN0X2JlZ2luKCkgKyAocHRyZGlmZl90KV9fcG9zLCBjb25zdF9lbmQoKSwgX19zLmJlZ2luKCksIF9fcy5lbmQoKSApOworICAgIF9fcmVzdWx0X3BvcyA9IF9fcmVzdWx0LmluZGV4KCk7CisjIGlmbmRlZiBfU1RMUF9PTERfUk9QRV9TRU1BTlRJQ1MKKyAgICBpZiAoX19yZXN1bHRfcG9zID09IHNpemUoKSkgX19yZXN1bHRfcG9zID0gbnBvczsKKyMgZW5kaWYKKyAgICByZXR1cm4gX19yZXN1bHRfcG9zOworICB9CisgIHNpemVfdHlwZSBmaW5kKF9DaGFyVCBfX2MsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0OworICBzaXplX3R5cGUgZmluZChjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QgeworICAgIHNpemVfdHlwZSBfX3Jlc3VsdF9wb3M7CisgICAgY29uc3RfaXRlcmF0b3IgX19yZXN1bHQgPSBfU1RMUF9TVEQ6OnNlYXJjaChjb25zdF9iZWdpbigpICsgKHB0cmRpZmZfdClfX3BvcywgY29uc3RfZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3MsIF9fcyArIF9TX2NoYXJfcHRyX2xlbihfX3MpKTsKKyAgICBfX3Jlc3VsdF9wb3MgPSBfX3Jlc3VsdC5pbmRleCgpOworIyBpZm5kZWYgX1NUTFBfT0xEX1JPUEVfU0VNQU5USUNTCisgICAgaWYgKF9fcmVzdWx0X3BvcyA9PSBzaXplKCkpIF9fcmVzdWx0X3BvcyA9IG5wb3M7CisjIGVuZGlmCisgICAgcmV0dXJuIF9fcmVzdWx0X3BvczsKKyAgfQorCisgIGl0ZXJhdG9yIG11dGFibGVfYmVnaW4oKSB7CisgICAgcmV0dXJuKGl0ZXJhdG9yKHRoaXMsIDApKTsKKyAgfQorCisgIGl0ZXJhdG9yIG11dGFibGVfZW5kKCkgeworICAgIHJldHVybihpdGVyYXRvcih0aGlzLCBzaXplKCkpKTsKKyAgfQorCisgIHJldmVyc2VfaXRlcmF0b3IgbXV0YWJsZV9yYmVnaW4oKSB7CisgICAgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IobXV0YWJsZV9lbmQoKSk7CisgIH0KKworICByZXZlcnNlX2l0ZXJhdG9yIG11dGFibGVfcmVuZCgpIHsKKyAgICByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihtdXRhYmxlX2JlZ2luKCkpOworICB9CisKKyAgcmVmZXJlbmNlIG11dGFibGVfcmVmZXJlbmNlX2F0KHNpemVfdHlwZSBfX3BvcykgeworICAgIHJldHVybiByZWZlcmVuY2UodGhpcywgX19wb3MpOworICB9CisKKyMgaWZkZWYgX19TVERfU1RVRkYKKyAgcmVmZXJlbmNlIG9wZXJhdG9yW10gKHNpemVfdHlwZSBfX3BvcykgeworICAgIHJldHVybiByZWZlcmVuY2UodGhpcywgX19wb3MpOworICB9CisKKyAgcmVmZXJlbmNlIGF0KHNpemVfdHlwZSBfX3BvcykgeworICAgIGlmIChfX3BvcyA+PSBzaXplKCkpIF9NX3Rocm93X291dF9vZl9yYW5nZSgpOworICAgIHJldHVybiAoKnRoaXMpW19fcG9zXTsKKyAgfQorCisgIHZvaWQgcmVzaXplKHNpemVfdHlwZSwgX0NoYXJUKSB7fQorICB2b2lkIHJlc2l6ZShzaXplX3R5cGUpIHt9CisgIHZvaWQgcmVzZXJ2ZShzaXplX3R5cGUgPSAwKSB7fQorICBzaXplX3R5cGUgY2FwYWNpdHkoKSBjb25zdCB7CisgICAgcmV0dXJuIG1heF9zaXplKCk7CisgIH0KKworICAvLyBTdHVmZiBiZWxvdyB0aGlzIGxpbmUgaXMgZGFuZ2Vyb3VzIGJlY2F1c2UgaXQncyBlcnJvciBwcm9uZS4KKyAgLy8gSSB3b3VsZCByZWFsbHkgbGlrZSB0byBnZXQgcmlkIG9mIGl0LgorICAvLyBjb3B5IGZ1bmN0aW9uIHdpdGggZnVubnkgYXJnIG9yZGVyaW5nLgorICBzaXplX3R5cGUgY29weShfQ2hhclQqIF9fYnVmZmVyLCBzaXplX3R5cGUgX19uLAorICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdCB7CisgICAgcmV0dXJuIGNvcHkoX19wb3MsIF9fbiwgX19idWZmZXIpOworICB9CisKKyAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gbXV0YWJsZV9lbmQoKTsgfQorCisgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gbXV0YWJsZV9iZWdpbigpOyB9CisKKyAgcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgeyByZXR1cm4gbXV0YWJsZV9yZW5kKCk7IH0KKworICByZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIHsgcmV0dXJuIG11dGFibGVfcmJlZ2luKCk7IH0KKworIyBlbHNlCisKKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gY29uc3RfZW5kKCk7IH0KKworICBjb25zdF9pdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIGNvbnN0X2JlZ2luKCk7IH0KKworICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSB7IHJldHVybiBjb25zdF9yZW5kKCk7IH0KKworICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIHsgcmV0dXJuIGNvbnN0X3JiZWdpbigpOyB9CisKKyMgZW5kaWYKK307IC8vY2xhc3Mgcm9wZQorCisjaWYgZGVmaW5lZCAoX19HTlVDX18pICYmIChfX0dOVUNfXyA9PSAyKSAmJiAoX19HTlVDX01JTk9SX18gPT0gOTYpCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+Citjb25zdCBzaXplX3Qgcm9wZTxfQ2hhclQsIF9BbGxvYz46Om5wb3MgPSB+KHNpemVfdCkgMDsKKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgX0NoYXJUCitfUm9wZV9jb25zdF9pdGVyYXRvcjwgX0NoYXJULCBfQWxsb2M+OjpvcGVyYXRvcltdKHNpemVfdCBfX24pCit7IHJldHVybiByb3BlPF9DaGFyVCxfQWxsb2M+OjpfU19mZXRjaCh0aGlzLT5fTV9yb290LCB0aGlzLT5fTV9jdXJyZW50X3BvcyArIF9fbik7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgoraW5saW5lIGJvb2wgb3BlcmF0b3I9PSAoY29uc3QgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4mIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+JiBfX3kpIHsKKyAgcmV0dXJuIChfX3guX01fY3VycmVudF9wb3MgPT0gX195Ll9NX2N1cnJlbnRfcG9zICYmCisgICAgICAgICAgX194Ll9NX3Jvb3QgPT0gX195Ll9NX3Jvb3QpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgYm9vbCBvcGVyYXRvcjwgKGNvbnN0IF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+JiBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+JiBfX3kpCit7IHJldHVybiAoX194Ll9NX2N1cnJlbnRfcG9zIDwgX195Ll9NX2N1cnJlbnRfcG9zKTsgfQorCisjaWZkZWYgX1NUTFBfVVNFX1NFUEFSQVRFX1JFTE9QU19OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgoraW5saW5lIGJvb2wgb3BlcmF0b3IhPSAoY29uc3QgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4mIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+JiBfX3kpCit7IHJldHVybiAhKF9feCA9PSBfX3kpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK2lubGluZSBib29sIG9wZXJhdG9yPiAoY29uc3QgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4mIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4mIF9feSkKK3sgcmV0dXJuIF9feSA8IF9feDsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgYm9vbCBvcGVyYXRvcjw9IChjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPiYgX194LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4mIF9feSkKK3sgcmV0dXJuICEoX195IDwgX194KTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgYm9vbCBvcGVyYXRvcj49IChjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPiYgX194LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4mIF9feSkKK3sgcmV0dXJuICEoX194IDwgX195KTsgfQorCisjZW5kaWYgLyogX1NUTFBfVVNFX1NFUEFSQVRFX1JFTE9QU19OQU1FU1BBQ0UgKi8KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgoraW5saW5lIHB0cmRpZmZfdCBvcGVyYXRvci0oY29uc3QgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4mIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+JiBfX3kpCit7IHJldHVybiAocHRyZGlmZl90KV9feC5fTV9jdXJyZW50X3BvcyAtIChwdHJkaWZmX3QpX195Ll9NX2N1cnJlbnRfcG9zOyB9CisKKyNpZiAhZGVmaW5lZCggX19NV0VSS1NfXyApIHx8IF9fTVdFUktTX18gPj0gMHgyMDAwICAvLyBkd2EgOC8yMS85NyAgLSAiYW1iaWd1b3VzIGFjY2VzcyB0byBvdmVybG9hZGVkIGZ1bmN0aW9uIiBidWcuCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4KK29wZXJhdG9yLShjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPiYgX194LCBwdHJkaWZmX3QgX19uKQoreyByZXR1cm4gX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4oX194Ll9NX3Jvb3QsIF9feC5fTV9jdXJyZW50X3BvcyAtIF9fbik7IH0KKyMgZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgoraW5saW5lIF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+CitvcGVyYXRvcisoY29uc3QgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4mIF9feCwgcHRyZGlmZl90IF9fbikKK3sgcmV0dXJuIF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+KF9feC5fTV9yb290LCBfX3guX01fY3VycmVudF9wb3MgKyBfX24pOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK2lubGluZSBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPgorb3BlcmF0b3IrKHB0cmRpZmZfdCBfX24sIGNvbnN0IF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+JiBfX3gpCit7IHJldHVybiBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPihfX3guX01fcm9vdCwgX194Ll9NX2N1cnJlbnRfcG9zICsgX19uKTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgYm9vbCBvcGVyYXRvcj09IChjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPiYgX194LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1JvcGVfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4mIF9feSkgeworICByZXR1cm4gKF9feC5fTV9jdXJyZW50X3BvcyA9PSBfX3kuX01fY3VycmVudF9wb3MgJiYKKyAgICAgICAgICBfX3guX01fcm9vdF9yb3BlID09IF9feS5fTV9yb290X3JvcGUpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgYm9vbCBvcGVyYXRvcjwgKGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+JiBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+JiBfX3kpCit7IHJldHVybiAoX194Ll9NX2N1cnJlbnRfcG9zIDwgX195Ll9NX2N1cnJlbnRfcG9zKTsgfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1NFUEFSQVRFX1JFTE9QU19OQU1FU1BBQ0UpCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgYm9vbCBvcGVyYXRvciE9IChjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPiYgX194LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1JvcGVfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4mIF9feSkKK3sgcmV0dXJuICEoX194ID09IF9feSk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgoraW5saW5lIGJvb2wgb3BlcmF0b3I+IChjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPiYgX194LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPiYgX195KQoreyByZXR1cm4gX195IDwgX194OyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK2lubGluZSBib29sIG9wZXJhdG9yPD0gKGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+JiBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPiYgX195KQoreyByZXR1cm4gIShfX3kgPCBfX3gpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK2lubGluZSBib29sIG9wZXJhdG9yPj0gKGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+JiBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPiYgX195KQoreyByZXR1cm4gIShfX3ggPCBfX3kpOyB9CisjZW5kaWYgLyogX1NUTFBfVVNFX1NFUEFSQVRFX1JFTE9QU19OQU1FU1BBQ0UgKi8KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgoraW5saW5lIHB0cmRpZmZfdCBvcGVyYXRvci0oY29uc3QgX1JvcGVfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4mIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+JiBfX3kpCit7IHJldHVybiAocHRyZGlmZl90KV9feC5fTV9jdXJyZW50X3BvcyAtIChwdHJkaWZmX3QpX195Ll9NX2N1cnJlbnRfcG9zOyB9CisKKyNpZiAhZGVmaW5lZCggX19NV0VSS1NfXyApIHx8IF9fTVdFUktTX18gPj0gMHgyMDAwICAvLyBkd2EgOC8yMS85NyAgLSAiYW1iaWd1b3VzIGFjY2VzcyB0byBvdmVybG9hZGVkIGZ1bmN0aW9uIiBidWcuCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgX1JvcGVfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4KK29wZXJhdG9yLShjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPiYgX194LAorICAgICAgICAgIHB0cmRpZmZfdCBfX24pIHsKKyAgcmV0dXJuIF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+KF9feC5fTV9yb290X3JvcGUsIF9feC5fTV9jdXJyZW50X3BvcyAtIF9fbik7Cit9CisjIGVuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK2lubGluZSBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPgorb3BlcmF0b3IrKGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+JiBfX3gsCisgICAgICAgICAgcHRyZGlmZl90IF9fbikgeworICByZXR1cm4gX1JvcGVfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4oX194Ll9NX3Jvb3Rfcm9wZSwgX194Ll9NX2N1cnJlbnRfcG9zICsgX19uKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgoraW5saW5lIF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+CitvcGVyYXRvcisocHRyZGlmZl90IF9fbiwgY29uc3QgX1JvcGVfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4mIF9feCkgeworICByZXR1cm4gX1JvcGVfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4oX194Ll9NX3Jvb3Rfcm9wZSwgX194Ll9NX2N1cnJlbnRfcG9zICsgX19uKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgoraW5saW5lIHJvcGU8X0NoYXJULF9BbGxvYz4KK29wZXJhdG9yKyAoY29uc3Qgcm9wZTxfQ2hhclQsX0FsbG9jPiYgX19sZWZ0LAorICAgICAgICAgICBjb25zdCByb3BlPF9DaGFyVCxfQWxsb2M+JiBfX3JpZ2h0KSB7CisgIF9TVExQX0FTU0VSVChfX2xlZnQuZ2V0X2FsbG9jYXRvcigpID09IF9fcmlnaHQuZ2V0X2FsbG9jYXRvcigpKQorICByZXR1cm4gcm9wZTxfQ2hhclQsX0FsbG9jPihyb3BlPF9DaGFyVCxfQWxsb2M+OjpfU19jb25jYXRfcmVwKF9fbGVmdC5fTV90cmVlX3B0ci5fTV9kYXRhLCBfX3JpZ2h0Ll9NX3RyZWVfcHRyLl9NX2RhdGEpKTsKKyAgLy8gSW5saW5pbmcgdGhpcyBzaG91bGQgbWFrZSBpdCBwb3NzaWJsZSB0byBrZWVwIF9fbGVmdCBhbmQgX19yaWdodCBpbiByZWdpc3RlcnMuCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK2lubGluZSByb3BlPF9DaGFyVCxfQWxsb2M+Jgorb3BlcmF0b3IrPSAocm9wZTxfQ2hhclQsX0FsbG9jPiYgX19sZWZ0LAorICAgICAgICAgICAgY29uc3Qgcm9wZTxfQ2hhclQsX0FsbG9jPiYgX19yaWdodCkgeworICBfX2xlZnQuYXBwZW5kKF9fcmlnaHQpOworICByZXR1cm4gX19sZWZ0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgcm9wZTxfQ2hhclQsX0FsbG9jPgorb3BlcmF0b3IrIChjb25zdCByb3BlPF9DaGFyVCxfQWxsb2M+JiBfX2xlZnQsCisgICAgICAgICAgIGNvbnN0IF9DaGFyVCogX19yaWdodCkgeworICBzaXplX3QgX19ybGVuID0gcm9wZTxfQ2hhclQsX0FsbG9jPjo6X1NfY2hhcl9wdHJfbGVuKF9fcmlnaHQpOworICByZXR1cm4gcm9wZTxfQ2hhclQsX0FsbG9jPihyb3BlPF9DaGFyVCxfQWxsb2M+OjpfU19jb25jYXRfY2hhcl9pdGVyKF9fbGVmdC5fTV90cmVlX3B0ci5fTV9kYXRhLCBfX3JpZ2h0LCBfX3JsZW4pKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgoraW5saW5lIHJvcGU8X0NoYXJULF9BbGxvYz4mCitvcGVyYXRvcis9IChyb3BlPF9DaGFyVCxfQWxsb2M+JiBfX2xlZnQsCisgICAgICAgICAgICBjb25zdCBfQ2hhclQqIF9fcmlnaHQpIHsKKyAgX19sZWZ0LmFwcGVuZChfX3JpZ2h0KTsKKyAgcmV0dXJuIF9fbGVmdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgoraW5saW5lIHJvcGU8X0NoYXJULF9BbGxvYz4KK29wZXJhdG9yKyAoY29uc3Qgcm9wZTxfQ2hhclQsX0FsbG9jPiYgX19sZWZ0LCBfQ2hhclQgX19yaWdodCkgeworICByZXR1cm4gcm9wZTxfQ2hhclQsX0FsbG9jPihyb3BlPF9DaGFyVCxfQWxsb2M+OjpfU19jb25jYXRfY2hhcl9pdGVyKF9fbGVmdC5fTV90cmVlX3B0ci5fTV9kYXRhLCAmX19yaWdodCwgMSkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgcm9wZTxfQ2hhclQsX0FsbG9jPiYKK29wZXJhdG9yKz0gKHJvcGU8X0NoYXJULF9BbGxvYz4mIF9fbGVmdCwgX0NoYXJUIF9fcmlnaHQpIHsKKyAgX19sZWZ0LmFwcGVuZChfX3JpZ2h0KTsKKyAgcmV0dXJuIF9fbGVmdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgoraW5saW5lIGJvb2wKK29wZXJhdG9yPCAoY29uc3Qgcm9wZTxfQ2hhclQsX0FsbG9jPiYgX19sZWZ0LAorICAgICAgICAgICBjb25zdCByb3BlPF9DaGFyVCxfQWxsb2M+JiBfX3JpZ2h0KSB7CisgIHJldHVybiBfX2xlZnQuY29tcGFyZShfX3JpZ2h0KSA8IDA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK2lubGluZSBib29sCitvcGVyYXRvcj09IChjb25zdCByb3BlPF9DaGFyVCxfQWxsb2M+JiBfX2xlZnQsCisgICAgICAgICAgICBjb25zdCByb3BlPF9DaGFyVCxfQWxsb2M+JiBfX3JpZ2h0KSB7CisgIHJldHVybiBfX2xlZnQuY29tcGFyZShfX3JpZ2h0KSA9PSAwOworfQorCisjaWZkZWYgX1NUTFBfVVNFX1NFUEFSQVRFX1JFTE9QU19OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgoraW5saW5lIGJvb2wKK29wZXJhdG9yIT0gKGNvbnN0IHJvcGU8X0NoYXJULF9BbGxvYz4mIF9feCwgY29uc3Qgcm9wZTxfQ2hhclQsX0FsbG9jPiYgX195KSB7CisgIHJldHVybiAhKF9feCA9PSBfX3kpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgYm9vbAorb3BlcmF0b3I+IChjb25zdCByb3BlPF9DaGFyVCxfQWxsb2M+JiBfX3gsIGNvbnN0IHJvcGU8X0NoYXJULF9BbGxvYz4mIF9feSkgeworICByZXR1cm4gX195IDwgX194OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgYm9vbAorb3BlcmF0b3I8PSAoY29uc3Qgcm9wZTxfQ2hhclQsX0FsbG9jPiYgX194LCBjb25zdCByb3BlPF9DaGFyVCxfQWxsb2M+JiBfX3kpIHsKKyAgcmV0dXJuICEoX195IDwgX194KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgoraW5saW5lIGJvb2wKK29wZXJhdG9yPj0gKGNvbnN0IHJvcGU8X0NoYXJULF9BbGxvYz4mIF9feCwgY29uc3Qgcm9wZTxfQ2hhclQsX0FsbG9jPiYgX195KSB7CisgIHJldHVybiAhKF9feCA8IF9feSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK2lubGluZSBib29sIG9wZXJhdG9yIT0gKGNvbnN0IF9Sb3BlX2NoYXJfcHRyX3Byb3h5PF9DaGFyVCxfQWxsb2M+JiBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfUm9wZV9jaGFyX3B0cl9wcm94eTxfQ2hhclQsX0FsbG9jPiYgX195KSB7CisgIHJldHVybiAhKF9feCA9PSBfX3kpOworfQorCisjZW5kaWYgLyogX1NUTFBfVVNFX1NFUEFSQVRFX1JFTE9QU19OQU1FU1BBQ0UgKi8KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgoraW5saW5lIGJvb2wgb3BlcmF0b3I9PSAoY29uc3QgX1JvcGVfY2hhcl9wdHJfcHJveHk8X0NoYXJULF9BbGxvYz4mIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9Sb3BlX2NoYXJfcHRyX3Byb3h5PF9DaGFyVCxfQWxsb2M+JiBfX3kpIHsKKyAgcmV0dXJuIChfX3guX01fcG9zID09IF9feS5fTV9wb3MgJiYgX194Ll9NX3Jvb3QgPT0gX195Ll9NX3Jvb3QpOworfQorCisjaWYgIWRlZmluZWQgKF9TVExQX1VTRV9OT19JT1NUUkVBTVMpCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgb3BlcmF0b3I8PCAoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX28sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvcGU8X0NoYXJULCBfQWxsb2M+JiBfX3IpOworI2VuZGlmCisKK3R5cGVkZWYgcm9wZTxjaGFyLCBhbGxvY2F0b3I8Y2hhcj4gPiBjcm9wZTsKKyNpZiBkZWZpbmVkIChfU1RMUF9IQVNfV0NIQVJfVCkKK3R5cGVkZWYgcm9wZTx3Y2hhcl90LCBhbGxvY2F0b3I8d2NoYXJfdD4gPiB3cm9wZTsKKyNlbmRpZgorCitpbmxpbmUgY3JvcGU6OnJlZmVyZW5jZSBfX211dGFibGVfcmVmZXJlbmNlX2F0KGNyb3BlJiBfX2MsIHNpemVfdCBfX2kpCit7IHJldHVybiBfX2MubXV0YWJsZV9yZWZlcmVuY2VfYXQoX19pKTsgfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfSEFTX1dDSEFSX1QpCitpbmxpbmUgd3JvcGU6OnJlZmVyZW5jZSBfX211dGFibGVfcmVmZXJlbmNlX2F0KHdyb3BlJiBfX2MsIHNpemVfdCBfX2kpCit7IHJldHVybiBfX2MubXV0YWJsZV9yZWZlcmVuY2VfYXQoX19pKTsgfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIpCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgdm9pZCBzd2FwKHJvcGU8X0NoYXJULF9BbGxvYz4mIF9feCwgcm9wZTxfQ2hhclQsX0FsbG9jPiYgX195KQoreyBfX3guc3dhcChfX3kpOyB9CisjZWxzZQorCitpbmxpbmUgdm9pZCBzd2FwKGNyb3BlJiBfX3gsIGNyb3BlJiBfX3kpIHsgX194LnN3YXAoX195KTsgfQorIyBpZmRlZiBfU1RMUF9IQVNfV0NIQVJfVCAgLy8gZHdhIDgvMjEvOTcKK2lubGluZSB2b2lkIHN3YXAod3JvcGUmIF9feCwgd3JvcGUmIF9feSkgeyBfX3guc3dhcChfX3kpOyB9CisjIGVuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIgKi8KKworCisvLyBIYXNoIGZ1bmN0aW9ucyBzaG91bGQgcHJvYmFibHkgYmUgcmV2aXNpdGVkIGxhdGVyOgorX1NUTFBfVEVNUExBVEVfTlVMTCBzdHJ1Y3QgaGFzaDxjcm9wZT4geworICBzaXplX3Qgb3BlcmF0b3IoKShjb25zdCBjcm9wZSYgX19zdHIpIGNvbnN0IHsKKyAgICBzaXplX3QgX3Bfc2l6ZSA9IF9fc3RyLnNpemUoKTsKKworICAgIGlmICgwID09IF9wX3NpemUpIHJldHVybiAwOworICAgIHJldHVybiAxMypfX3N0clswXSArIDUqX19zdHJbX3Bfc2l6ZSAtIDFdICsgX3Bfc2l6ZTsKKyAgfQorfTsKKworI2lmIGRlZmluZWQgKF9TVExQX0hBU19XQ0hBUl9UKSAgLy8gZHdhIDgvMjEvOTcKK19TVExQX1RFTVBMQVRFX05VTEwgc3RydWN0IGhhc2g8d3JvcGU+IHsKKyAgc2l6ZV90IG9wZXJhdG9yKCkoY29uc3Qgd3JvcGUmIF9fc3RyKSBjb25zdCB7CisgICAgc2l6ZV90IF9wX3NpemUgPSBfX3N0ci5zaXplKCk7CisKKyAgICBpZiAoMCA9PSBfcF9zaXplKSByZXR1cm4gMDsKKyAgICByZXR1cm4gMTMqX19zdHJbMF0gKyA1Kl9fc3RyW19wX3NpemUgLSAxXSArIF9wX3NpemU7CisgIH0KK307CisjZW5kaWYKKworI2lmICghZGVmaW5lZCAoX1NUTFBfTVNWQykgfHwgKF9TVExQX01TVkMgPj0gMTMxMCkpCisvLyBJIGNvdWxkbid0IGdldCB0aGlzIHRvIHdvcmsgd2l0aCBWQysrCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsY2xhc3MgX0FsbG9jPgorIyAgaWYgZGVmaW5lZCAoX19ETUNfXykKK2V4dGVybgorIyAgZW5kaWYKK3ZvaWQgX1JvcGVfcm90YXRlKF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgX1JvcGVfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+IF9fbWlkZGxlLAorICAgICAgICAgICAgICAgICAgX1JvcGVfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+IF9fbGFzdCk7CisKK2lubGluZSB2b2lkIHJvdGF0ZShfUm9wZV9pdGVyYXRvcjxjaGFyLCBhbGxvY2F0b3I8Y2hhcj4gPiBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgIF9Sb3BlX2l0ZXJhdG9yPGNoYXIsIGFsbG9jYXRvcjxjaGFyPiA+IF9fbWlkZGxlLAorICAgICAgICAgICAgICAgICAgIF9Sb3BlX2l0ZXJhdG9yPGNoYXIsIGFsbG9jYXRvcjxjaGFyPiA+IF9fbGFzdCkKK3sgX1JvcGVfcm90YXRlKF9fZmlyc3QsIF9fbWlkZGxlLCBfX2xhc3QpOyB9CisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgoraW5saW5lIF9Sb3BlX2NoYXJfcmVmX3Byb3h5PF9DaGFyVCwgX0FsbG9jPjo6b3BlcmF0b3IgX0NoYXJUICgpIGNvbnN0IHsKKyAgaWYgKF9NX2N1cnJlbnRfdmFsaWQpIHsKKyAgICByZXR1cm4gX01fY3VycmVudDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gX015X3JvcGU6Ol9TX2ZldGNoKF9NX3Jvb3QtPl9NX3RyZWVfcHRyLl9NX2RhdGEsIF9NX3Bvcyk7CisgIH0KK30KKworI2lmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pICYmICFkZWZpbmVkIChfU1RMUF9OT19NT1ZFX1NFTUFOVElDKQordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorc3RydWN0IF9fbW92ZV90cmFpdHM8cm9wZTxfQ2hhclQsIF9BbGxvYz4gPiB7CisgIHR5cGVkZWYgX190cnVlX3R5cGUgaW1wbGVtZW50ZWQ7CisgIC8vQ29tcGxldG5lc3MgZGVwZW5kcyBvbiB0aGUgYWxsb2NhdG9yOgorICB0eXBlZGVmIHR5cGVuYW1lIF9fbW92ZV90cmFpdHM8X0FsbG9jPjo6Y29tcGxldGUgY29tcGxldGU7Cit9OworI2VuZGlmCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2lmICFkZWZpbmVkIChfU1RMUF9MSU5LX1RJTUVfSU5TVEFOVElBVElPTikKKyMgIGluY2x1ZGUgPHN0bC9fcm9wZS5jPgorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9ST1BFX0ggKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL19zZXQuaCBiL3N0bHBvcnQvc3RsL19zZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGY2ODYyCi0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvX3NldC5oCkBAIC0wLDAgKzEsNDEyIEBACisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworLyogTk9URTogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgU1RMIGhlYWRlcnMuCisgKiAgIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LgorICovCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfU0VUX0gKKyNkZWZpbmUgX1NUTFBfSU5URVJOQUxfU0VUX0gKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9UUkVFX0gKKyMgIGluY2x1ZGUgPHN0bC9fdHJlZS5oPgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX1BUUl9TUEVDSUFMSVpBVElPTlMpCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisvL1NwZWNpZmljIGl0ZXJhdG9yIHRyYWl0cyBjcmVhdGlvbgorX1NUTFBfQ1JFQVRFX0lURVJBVE9SX1RSQUlUUyhTZXRUcmFpdHNULCBDb25zdF90cmFpdHMpCisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBfU1RMUF9ERkxfVE1QTF9QQVJBTShfQ29tcGFyZSwgbGVzczxfS2V5PiksCisgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfREZMX1RNUExfUEFSQU0oX0FsbG9jLCBhbGxvY2F0b3I8X0tleT4pID4KK2NsYXNzIHNldAorI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QQVJUSUFMX1NQRUNfV09SS0FST1VORCkKKyAgICAgICAgICA6IHB1YmxpYyBfX3N0bHBvcnRfY2xhc3M8c2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2M+ID4KKyNlbmRpZgoreworICB0eXBlZGVmIHNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jPiBfU2VsZjsKK3B1YmxpYzoKKy8vIHR5cGVkZWZzOgorICB0eXBlZGVmIF9LZXkgICAgIGtleV90eXBlOworICB0eXBlZGVmIF9LZXkgICAgIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgX0NvbXBhcmUga2V5X2NvbXBhcmU7CisgIHR5cGVkZWYgX0NvbXBhcmUgdmFsdWVfY29tcGFyZTsKKworcHJpdmF0ZToKKyAgLy9TcGVjaWZpYyBpdGVyYXRvciB0cmFpdHMgY3JlYXRpb24KKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9TZXRUcmFpdHNUPHZhbHVlX3R5cGU+IF9TZXRUcmFpdHM7CisKK3B1YmxpYzoKKyAgLy9Gb2xsb3dpbmcgdHlwZWRlZiBoYXZlIHRvIGJlIHB1YmxpYyBmb3IgX19tb3ZlX3RyYWl0cyBzcGVjaWFsaXphdGlvbi4KKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9SYl90cmVlPGtleV90eXBlLCBrZXlfY29tcGFyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGUsIF9TVExQX1BSSVYgX0lkZW50aXR5PHZhbHVlX3R5cGU+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NldFRyYWl0cywgX0FsbG9jPiBfUmVwX3R5cGU7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OnBvaW50ZXIgcG9pbnRlcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OmNvbnN0X3BvaW50ZXIgY29uc3RfcG9pbnRlcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OnJlZmVyZW5jZSByZWZlcmVuY2U7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlOworICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6aXRlcmF0b3IgaXRlcmF0b3I7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OnJldmVyc2VfaXRlcmF0b3IgcmV2ZXJzZV9pdGVyYXRvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OnNpemVfdHlwZSBzaXplX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7CisKK3ByaXZhdGU6CisgIF9SZXBfdHlwZSBfTV90OyAgLy8gcmVkLWJsYWNrIHRyZWUgcmVwcmVzZW50aW5nIHNldAorICBfU1RMUF9LRVlfVFlQRV9GT1JfQ09OVF9FWFQoa2V5X3R5cGUpCisKK3B1YmxpYzoKKworICAvLyBhbGxvY2F0aW9uL2RlYWxsb2NhdGlvbgorI2lmICFkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorICBleHBsaWNpdCBzZXQoY29uc3QgX0NvbXBhcmUmIF9fY29tcCA9IF9Db21wYXJlKCksCisgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyNlbHNlCisgIHNldCgpCisgICAgOiBfTV90KF9Db21wYXJlKCksIGFsbG9jYXRvcl90eXBlKCkpIHt9CisgIGV4cGxpY2l0IHNldChjb25zdCBfQ29tcGFyZSYgX19jb21wKQorICAgIDogX01fdChfX2NvbXAsIGFsbG9jYXRvcl90eXBlKCkpIHt9CisgIHNldChjb25zdCBfQ29tcGFyZSYgX19jb21wLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorI2VuZGlmCisgICAgOiBfTV90KF9fY29tcCwgX19hKSB7fQorCisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICBzZXQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgIDogX01fdChfQ29tcGFyZSgpLCBhbGxvY2F0b3JfdHlwZSgpKQorICAgIHsgX01fdC5pbnNlcnRfdW5pcXVlKF9fZmlyc3QsIF9fbGFzdCk7IH0KKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfTkVFRFNfRVhUUkFfVEVNUExBVEVfQ09OU1RSVUNUT1JTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHNldChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsIGNvbnN0IF9Db21wYXJlJiBfX2NvbXApCisgICAgOiBfTV90KF9fY29tcCwgYWxsb2NhdG9yX3R5cGUoKSkgeyBfTV90Lmluc2VydF91bmlxdWUoX19maXJzdCwgX19sYXN0KTsgfQorIyAgZW5kaWYKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICBzZXQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LCBjb25zdCBfQ29tcGFyZSYgX19jb21wLAorICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSBfU1RMUF9BTExPQ0FUT1JfVFlQRV9ERkwpCisgICAgOiBfTV90KF9fY29tcCwgX19hKSB7IF9NX3QuaW5zZXJ0X3VuaXF1ZShfX2ZpcnN0LCBfX2xhc3QpOyB9CisjZWxzZQorICBzZXQoY29uc3QgdmFsdWVfdHlwZSogX19maXJzdCwgY29uc3QgdmFsdWVfdHlwZSogX19sYXN0KQorICAgIDogX01fdChfQ29tcGFyZSgpLCBhbGxvY2F0b3JfdHlwZSgpKQorICAgIHsgX01fdC5pbnNlcnRfdW5pcXVlKF9fZmlyc3QsIF9fbGFzdCk7IH0KKworICBzZXQoY29uc3QgdmFsdWVfdHlwZSogX19maXJzdCwKKyAgICAgIGNvbnN0IHZhbHVlX3R5cGUqIF9fbGFzdCwgY29uc3QgX0NvbXBhcmUmIF9fY29tcCwKKyAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX01fdChfX2NvbXAsIF9fYSkgeyBfTV90Lmluc2VydF91bmlxdWUoX19maXJzdCwgX19sYXN0KTsgfQorCisgIHNldChjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpCisgICAgOiBfTV90KF9Db21wYXJlKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgeyBfTV90Lmluc2VydF91bmlxdWUoX19maXJzdCwgX19sYXN0KTsgfQorCisgIHNldChjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QsIGNvbnN0IF9Db21wYXJlJiBfX2NvbXAsCisgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9NX3QoX19jb21wLCBfX2EpIHsgX01fdC5pbnNlcnRfdW5pcXVlKF9fZmlyc3QsIF9fbGFzdCk7IH0KKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisKKyAgc2V0KGNvbnN0IF9TZWxmJiBfX3gpIDogX01fdChfX3guX01fdCkge30KKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19NT1ZFX1NFTUFOVElDKQorICBzZXQoX19tb3ZlX3NvdXJjZTxfU2VsZj4gc3JjKQorICAgIDogX01fdChfX21vdmVfc291cmNlPF9SZXBfdHlwZT4oc3JjLmdldCgpLl9NX3QpKSB7fQorI2VuZGlmCisKKyAgX1NlbGYmIG9wZXJhdG9yPShjb25zdCBfU2VsZiYgX194KSB7CisgICAgX01fdCA9IF9feC5fTV90OworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vIGFjY2Vzc29yczoKKyAga2V5X2NvbXBhcmUga2V5X2NvbXAoKSBjb25zdCB7IHJldHVybiBfTV90LmtleV9jb21wKCk7IH0KKyAgdmFsdWVfY29tcGFyZSB2YWx1ZV9jb21wKCkgY29uc3QgeyByZXR1cm4gX01fdC5rZXlfY29tcCgpOyB9CisgIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdCB7IHJldHVybiBfTV90LmdldF9hbGxvY2F0b3IoKTsgfQorCisgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gX01fdC5iZWdpbigpOyB9CisgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIF9NX3QuZW5kKCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBfTV90LmJlZ2luKCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gX01fdC5lbmQoKTsgfQorICByZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIHsgcmV0dXJuIF9NX3QucmJlZ2luKCk7IH0KKyAgcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgeyByZXR1cm4gX01fdC5yZW5kKCk7IH0KKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBjb25zdCB7IHJldHVybiBfTV90LnJiZWdpbigpOyB9CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0IHsgcmV0dXJuIF9NX3QucmVuZCgpOyB9CisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBfTV90LmVtcHR5KCk7IH0KKyAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCB7IHJldHVybiBfTV90LnNpemUoKTsgfQorICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCB7IHJldHVybiBfTV90Lm1heF9zaXplKCk7IH0KKyAgdm9pZCBzd2FwKF9TZWxmJiBfX3gpIHsgX01fdC5zd2FwKF9feC5fTV90KTsgfQorI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QQVJUSUFMX1NQRUNfV09SS0FST1VORCkgJiYgIWRlZmluZWQgKF9TVExQX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUikKKyAgdm9pZCBfTV9zd2FwX3dvcmthcm91bmQoX1NlbGYmIF9feCkgeyBzd2FwKF9feCk7IH0KKyNlbmRpZgorCisgIC8vIGluc2VydC9lcmFzZQorICBwYWlyPGl0ZXJhdG9yLGJvb2w+IGluc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgIHsgcmV0dXJuIF9NX3QuaW5zZXJ0X3VuaXF1ZShfX3gpOyB9CisgIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBfX3BvcywgY29uc3QgdmFsdWVfdHlwZSYgX194KQorICB7IHJldHVybiBfTV90Lmluc2VydF91bmlxdWUoIF9fcG9zICwgX194KTsgfQorI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgdm9pZCBpbnNlcnQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICB7IF9NX3QuaW5zZXJ0X3VuaXF1ZShfX2ZpcnN0LCBfX2xhc3QpOyB9CisjZWxzZQorICB2b2lkIGluc2VydChjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpCisgIHsgX01fdC5pbnNlcnRfdW5pcXVlKF9fZmlyc3QsIF9fbGFzdCk7IH0KKyAgdm9pZCBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSogX19maXJzdCwgY29uc3QgdmFsdWVfdHlwZSogX19sYXN0KQorICB7IF9NX3QuaW5zZXJ0X3VuaXF1ZShfX2ZpcnN0LCBfX2xhc3QpOyB9CisjZW5kaWYgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworICB2b2lkIGVyYXNlKGl0ZXJhdG9yIF9fcG9zKSB7IF9NX3QuZXJhc2UoIF9fcG9zICk7IH0KKyAgc2l6ZV90eXBlIGVyYXNlKGNvbnN0IGtleV90eXBlJiBfX3gpIHsgcmV0dXJuIF9NX3QuZXJhc2VfdW5pcXVlKF9feCk7IH0KKyAgdm9pZCBlcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpIHsgX01fdC5lcmFzZShfX2ZpcnN0LCBfX2xhc3QgKTsgfQorICB2b2lkIGNsZWFyKCkgeyBfTV90LmNsZWFyKCk7IH0KKworICAvLyBzZXQgb3BlcmF0aW9uczoKKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIGNvbnN0X2l0ZXJhdG9yIGZpbmQoY29uc3QgX0tUJiBfX3gpIGNvbnN0IHsgcmV0dXJuIF9NX3QuZmluZChfX3gpOyB9CisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBpdGVyYXRvciBmaW5kKGNvbnN0IF9LVCYgX194KSB7IHJldHVybiBfTV90LmZpbmQoX194KTsgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgc2l6ZV90eXBlIGNvdW50KGNvbnN0IF9LVCYgX194KSBjb25zdAorICB7IHJldHVybiBfTV90LmZpbmQoX194KSA9PSBfTV90LmVuZCgpID8gMCA6IDEgOyB9CisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBpdGVyYXRvciBsb3dlcl9ib3VuZChjb25zdCBfS1QmIF9feCkgeyByZXR1cm4gX01fdC5sb3dlcl9ib3VuZChfX3gpOyB9CisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBjb25zdF9pdGVyYXRvciBsb3dlcl9ib3VuZChjb25zdCBfS1QmIF9feCkgY29uc3QgeyByZXR1cm4gX01fdC5sb3dlcl9ib3VuZChfX3gpOyB9CisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBpdGVyYXRvciB1cHBlcl9ib3VuZChjb25zdCBfS1QmIF9feCkgeyByZXR1cm4gX01fdC51cHBlcl9ib3VuZChfX3gpOyB9CisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBjb25zdF9pdGVyYXRvciB1cHBlcl9ib3VuZChjb25zdCBfS1QmIF9feCkgY29uc3QgeyByZXR1cm4gX01fdC51cHBlcl9ib3VuZChfX3gpOyB9CisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4gZXF1YWxfcmFuZ2UoY29uc3QgX0tUJiBfX3gpCisgIHsgcmV0dXJuIF9NX3QuZXF1YWxfcmFuZ2VfdW5pcXVlKF9feCk7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIHBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPiBlcXVhbF9yYW5nZShjb25zdCBfS1QmIF9feCkgY29uc3QKKyAgeyByZXR1cm4gX01fdC5lcXVhbF9yYW5nZV91bmlxdWUoX194KTsgfQorfTsKKworLy9TcGVjaWZpYyBpdGVyYXRvciB0cmFpdHMgY3JlYXRpb24KK19TVExQX0NSRUFURV9JVEVSQVRPUl9UUkFJVFMoTXVsdGlzZXRUcmFpdHNULCBDb25zdF90cmFpdHMpCisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBfU1RMUF9ERkxfVE1QTF9QQVJBTShfQ29tcGFyZSwgbGVzczxfS2V5PiksCisgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfREZMX1RNUExfUEFSQU0oX0FsbG9jLCBhbGxvY2F0b3I8X0tleT4pID4KK2NsYXNzIG11bHRpc2V0CisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKQorICAgICAgICAgICAgICAgOiBwdWJsaWMgX19zdGxwb3J0X2NsYXNzPG11bHRpc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2M+ID4KKyNlbmRpZgoreworICB0eXBlZGVmIG11bHRpc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2M+IF9TZWxmOworcHVibGljOgorICAvLyB0eXBlZGVmczoKKworICB0eXBlZGVmIF9LZXkgICAgIGtleV90eXBlOworICB0eXBlZGVmIF9LZXkgICAgIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgX0NvbXBhcmUga2V5X2NvbXBhcmU7CisgIHR5cGVkZWYgX0NvbXBhcmUgdmFsdWVfY29tcGFyZTsKKworcHJpdmF0ZToKKyAgLy9TcGVjaWZpYyBpdGVyYXRvciB0cmFpdHMgY3JlYXRpb24KKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9NdWx0aXNldFRyYWl0c1Q8dmFsdWVfdHlwZT4gX011bHRpc2V0VHJhaXRzOworCitwdWJsaWM6CisgIC8vRm9sbG93aW5nIHR5cGVkZWYgaGF2ZSB0byBiZSBwdWJsaWMgZm9yIF9fbW92ZV90cmFpdHMgc3BlY2lhbGl6YXRpb24uCisgIHR5cGVkZWYgX1NUTFBfUFJJViBfUmJfdHJlZTxrZXlfdHlwZSwga2V5X2NvbXBhcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlLCBfU1RMUF9QUklWIF9JZGVudGl0eTx2YWx1ZV90eXBlPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NdWx0aXNldFRyYWl0cywgX0FsbG9jPiBfUmVwX3R5cGU7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OnBvaW50ZXIgcG9pbnRlcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OmNvbnN0X3BvaW50ZXIgY29uc3RfcG9pbnRlcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OnJlZmVyZW5jZSByZWZlcmVuY2U7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlOworICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6aXRlcmF0b3IgaXRlcmF0b3I7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OnJldmVyc2VfaXRlcmF0b3IgcmV2ZXJzZV9pdGVyYXRvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OnNpemVfdHlwZSBzaXplX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7CisKK3ByaXZhdGU6CisgIF9SZXBfdHlwZSBfTV90OyAgLy8gcmVkLWJsYWNrIHRyZWUgcmVwcmVzZW50aW5nIG11bHRpc2V0CisgIF9TVExQX0tFWV9UWVBFX0ZPUl9DT05UX0VYVChrZXlfdHlwZSkKKworcHVibGljOgorI2lmICFkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorICBleHBsaWNpdCBtdWx0aXNldChjb25zdCBfQ29tcGFyZSYgX19jb21wID0gX0NvbXBhcmUoKSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisjZWxzZQorICBtdWx0aXNldCgpCisgICAgOiBfTV90KF9Db21wYXJlKCksIGFsbG9jYXRvcl90eXBlKCkpIHt9CisgIGV4cGxpY2l0IG11bHRpc2V0KGNvbnN0IF9Db21wYXJlJiBfX2NvbXApCisgICAgOiBfTV90KF9fY29tcCwgYWxsb2NhdG9yX3R5cGUoKSkge30KKyAgbXVsdGlzZXQoY29uc3QgX0NvbXBhcmUmIF9fY29tcCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyNlbmRpZgorICAgIDogX01fdChfX2NvbXAsIF9fYSkge30KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgbXVsdGlzZXQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgIDogX01fdChfQ29tcGFyZSgpLCBhbGxvY2F0b3JfdHlwZSgpKQorICAgIHsgX01fdC5pbnNlcnRfZXF1YWwoX19maXJzdCwgX19sYXN0KTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgbXVsdGlzZXQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICBjb25zdCBfQ29tcGFyZSYgX19jb21wLAorICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hIF9TVExQX0FMTE9DQVRPUl9UWVBFX0RGTCkKKyAgICA6IF9NX3QoX19jb21wLCBfX2EpIHsgX01fdC5pbnNlcnRfZXF1YWwoX19maXJzdCwgX19sYXN0KTsgfQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfTkVFRFNfRVhUUkFfVEVNUExBVEVfQ09OU1RSVUNUT1JTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIG11bHRpc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgY29uc3QgX0NvbXBhcmUmIF9fY29tcCkKKyAgICA6IF9NX3QoX19jb21wLCBhbGxvY2F0b3JfdHlwZSgpKSB7IF9NX3QuaW5zZXJ0X2VxdWFsKF9fZmlyc3QsIF9fbGFzdCk7IH0KKyMgIGVuZGlmCisjZWxzZQorICBtdWx0aXNldChjb25zdCB2YWx1ZV90eXBlKiBfX2ZpcnN0LCBjb25zdCB2YWx1ZV90eXBlKiBfX2xhc3QpCisgICAgOiBfTV90KF9Db21wYXJlKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgeyBfTV90Lmluc2VydF9lcXVhbChfX2ZpcnN0LCBfX2xhc3QpOyB9CisKKyAgbXVsdGlzZXQoY29uc3QgdmFsdWVfdHlwZSogX19maXJzdCwgY29uc3QgdmFsdWVfdHlwZSogX19sYXN0LAorICAgICAgICAgICBjb25zdCBfQ29tcGFyZSYgX19jb21wLAorICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9NX3QoX19jb21wLCBfX2EpIHsgX01fdC5pbnNlcnRfZXF1YWwoX19maXJzdCwgX19sYXN0KTsgfQorCisgIG11bHRpc2V0KGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKKyAgICA6IF9NX3QoX0NvbXBhcmUoKSwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICB7IF9NX3QuaW5zZXJ0X2VxdWFsKF9fZmlyc3QsIF9fbGFzdCk7IH0KKworICBtdWx0aXNldChjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgIGNvbnN0IF9Db21wYXJlJiBfX2NvbXAsCisgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX01fdChfX2NvbXAsIF9fYSkgeyBfTV90Lmluc2VydF9lcXVhbChfX2ZpcnN0LCBfX2xhc3QpOyB9CisjZW5kaWYgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworCisgIG11bHRpc2V0KGNvbnN0IF9TZWxmJiBfX3gpIDogX01fdChfX3guX01fdCkge30KKyAgX1NlbGYmIG9wZXJhdG9yPShjb25zdCBfU2VsZiYgX194KSB7CisgICAgX01fdCA9IF9feC5fTV90OworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisjaWYgIWRlZmluZWQgKF9TVExQX05PX01PVkVfU0VNQU5USUMpCisgIG11bHRpc2V0KF9fbW92ZV9zb3VyY2U8X1NlbGY+IHNyYykKKyAgICA6IF9NX3QoX19tb3ZlX3NvdXJjZTxfUmVwX3R5cGU+KHNyYy5nZXQoKS5fTV90KSkge30KKyNlbmRpZgorCisgIC8vIGFjY2Vzc29yczoKKyAga2V5X2NvbXBhcmUga2V5X2NvbXAoKSBjb25zdCB7IHJldHVybiBfTV90LmtleV9jb21wKCk7IH0KKyAgdmFsdWVfY29tcGFyZSB2YWx1ZV9jb21wKCkgY29uc3QgeyByZXR1cm4gX01fdC5rZXlfY29tcCgpOyB9CisgIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdCB7IHJldHVybiBfTV90LmdldF9hbGxvY2F0b3IoKTsgfQorCisgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gX01fdC5iZWdpbigpOyB9CisgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIF9NX3QuZW5kKCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBfTV90LmJlZ2luKCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gX01fdC5lbmQoKTsgfQorICByZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIHsgcmV0dXJuIF9NX3QucmJlZ2luKCk7IH0KKyAgcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgeyByZXR1cm4gX01fdC5yZW5kKCk7IH0KKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBjb25zdCB7IHJldHVybiBfTV90LnJiZWdpbigpOyB9CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0IHsgcmV0dXJuIF9NX3QucmVuZCgpOyB9CisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBfTV90LmVtcHR5KCk7IH0KKyAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCB7IHJldHVybiBfTV90LnNpemUoKTsgfQorICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCB7IHJldHVybiBfTV90Lm1heF9zaXplKCk7IH0KKyAgdm9pZCBzd2FwKF9TZWxmJiBfX3gpIHsgX01fdC5zd2FwKF9feC5fTV90KTsgfQorI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QQVJUSUFMX1NQRUNfV09SS0FST1VORCkgJiYgIWRlZmluZWQgKF9TVExQX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUikKKyAgdm9pZCBfTV9zd2FwX3dvcmthcm91bmQoX1NlbGYmIF9feCkgeyBzd2FwKF9feCk7IH0KKyNlbmRpZgorCisgIC8vIGluc2VydC9lcmFzZQorICBpdGVyYXRvciBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX194KQorICB7IHJldHVybiBfTV90Lmluc2VydF9lcXVhbChfX3gpOyB9CisgIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBfX3BvcywgY29uc3QgdmFsdWVfdHlwZSYgX194KQorICB7IHJldHVybiBfTV90Lmluc2VydF9lcXVhbChfX3BvcywgX194KTsgfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICB2b2lkIGluc2VydChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgIHsgX01fdC5pbnNlcnRfZXF1YWwoX19maXJzdCwgX19sYXN0KTsgfQorI2Vsc2UKKyAgdm9pZCBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSogX19maXJzdCwgY29uc3QgdmFsdWVfdHlwZSogX19sYXN0KQorICB7IF9NX3QuaW5zZXJ0X2VxdWFsKF9fZmlyc3QsIF9fbGFzdCk7IH0KKyAgdm9pZCBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KQorICB7IF9NX3QuaW5zZXJ0X2VxdWFsKF9fZmlyc3QsIF9fbGFzdCk7IH0KKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisgIHZvaWQgZXJhc2UoaXRlcmF0b3IgX19wb3MpIHsgX01fdC5lcmFzZSggX19wb3MgKTsgfQorICBzaXplX3R5cGUgZXJhc2UoY29uc3Qga2V5X3R5cGUmIF9feCkgeyByZXR1cm4gX01fdC5lcmFzZShfX3gpOyB9CisgIHZvaWQgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KSB7IF9NX3QuZXJhc2UoIF9fZmlyc3QsIF9fbGFzdCApOyB9CisgIHZvaWQgY2xlYXIoKSB7IF9NX3QuY2xlYXIoKTsgfQorCisgIC8vIG11bHRpc2V0IG9wZXJhdGlvbnM6CisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBpdGVyYXRvciBmaW5kKGNvbnN0IF9LVCYgX194KSB7IHJldHVybiBfTV90LmZpbmQoX194KTsgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgY29uc3RfaXRlcmF0b3IgZmluZChjb25zdCBfS1QmIF9feCkgY29uc3QgeyByZXR1cm4gX01fdC5maW5kKF9feCk7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIHNpemVfdHlwZSBjb3VudChjb25zdCBfS1QmIF9feCkgY29uc3QgeyByZXR1cm4gX01fdC5jb3VudChfX3gpOyB9CisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBpdGVyYXRvciBsb3dlcl9ib3VuZChjb25zdCBfS1QmIF9feCkgeyByZXR1cm4gX01fdC5sb3dlcl9ib3VuZChfX3gpOyB9CisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBjb25zdF9pdGVyYXRvciBsb3dlcl9ib3VuZChjb25zdCBfS1QmIF9feCkgY29uc3QgeyByZXR1cm4gX01fdC5sb3dlcl9ib3VuZChfX3gpOyB9CisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBpdGVyYXRvciB1cHBlcl9ib3VuZChjb25zdCBfS1QmIF9feCkgeyByZXR1cm4gX01fdC51cHBlcl9ib3VuZChfX3gpOyB9CisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBjb25zdF9pdGVyYXRvciB1cHBlcl9ib3VuZChjb25zdCBfS1QmIF9feCkgY29uc3QgeyByZXR1cm4gX01fdC51cHBlcl9ib3VuZChfX3gpOyB9CisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4gZXF1YWxfcmFuZ2UoY29uc3QgX0tUJiBfX3gpIHsgcmV0dXJuIF9NX3QuZXF1YWxfcmFuZ2UoX194KTsgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgcGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+IGVxdWFsX3JhbmdlKGNvbnN0IF9LVCYgX194KSBjb25zdCB7IHJldHVybiBfTV90LmVxdWFsX3JhbmdlKF9feCk7IH0KK307CisKKyNlbHNlCisjICBpbmNsdWRlIDxzdGwvcG9pbnRlcnMvX3NldC5oPgorX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisjZW5kaWYgLyogX1NUTFBfVVNFX1BUUl9TUEVDSUFMSVpBVElPTlMgKi8KKworI2RlZmluZSBfU1RMUF9URU1QTEFURV9IRUFERVIgdGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2M+CisjZGVmaW5lIF9TVExQX1RFTVBMQVRFX0NPTlRBSU5FUiBzZXQ8X0tleSxfQ29tcGFyZSxfQWxsb2M+CisjaW5jbHVkZSA8c3RsL19yZWxvcHNfY29udC5oPgorI3VuZGVmICBfU1RMUF9URU1QTEFURV9DT05UQUlORVIKKyNkZWZpbmUgX1NUTFBfVEVNUExBVEVfQ09OVEFJTkVSIG11bHRpc2V0PF9LZXksX0NvbXBhcmUsX0FsbG9jPgorI2luY2x1ZGUgPHN0bC9fcmVsb3BzX2NvbnQuaD4KKyN1bmRlZiAgX1NUTFBfVEVNUExBVEVfQ09OVEFJTkVSCisjdW5kZWYgIF9TVExQX1RFTVBMQVRFX0hFQURFUgorCisjaWYgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikgJiYgIWRlZmluZWQgKF9TVExQX05PX01PVkVfU0VNQU5USUMpCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvYz4KK3N0cnVjdCBfX21vdmVfdHJhaXRzPHNldDxfS2V5LF9Db21wYXJlLF9BbGxvYz4gPiA6CisgIF9TVExQX1BSSVYgX19tb3ZlX3RyYWl0c19hdXg8dHlwZW5hbWUgc2V0PF9LZXksX0NvbXBhcmUsX0FsbG9jPjo6X1JlcF90eXBlPgore307CisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX0FsbG9jPgorc3RydWN0IF9fbW92ZV90cmFpdHM8bXVsdGlzZXQ8X0tleSxfQ29tcGFyZSxfQWxsb2M+ID4gOgorICBfU1RMUF9QUklWIF9fbW92ZV90cmFpdHNfYXV4PHR5cGVuYW1lIG11bHRpc2V0PF9LZXksX0NvbXBhcmUsX0FsbG9jPjo6X1JlcF90eXBlPgore307CisjZW5kaWYKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfU0VUX0ggKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9fc2xpc3QuYyBiL3N0bHBvcnQvc3RsL19zbGlzdC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzdGwvX3NsaXN0LmMKcmVuYW1lIHRvIHN0bHBvcnQvc3RsL19zbGlzdC5jCmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9fc2xpc3QuaCBiL3N0bHBvcnQvc3RsL19zbGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNGRhYTQKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9fc2xpc3QuaApAQCAtMCwwICsxLDkxNCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworLyogTk9URTogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgU1RMIGhlYWRlcnMuCisgKiAgIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LgorICovCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfU0xJU1RfSAorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9TTElTVF9ICisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQUxHT0JBU0VfSAorIyAgaW5jbHVkZSA8c3RsL19hbGdvYmFzZS5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQUxMT0NfSAorIyAgaW5jbHVkZSA8c3RsL19hbGxvYy5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfSVRFUkFUT1JfSAorIyAgaW5jbHVkZSA8c3RsL19pdGVyYXRvci5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ09OU1RSVUNUX0gKKyMgIGluY2x1ZGUgPHN0bC9fY29uc3RydWN0Lmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9GVU5DVElPTl9CQVNFX0gKKyMgIGluY2x1ZGUgPHN0bC9fZnVuY3Rpb25fYmFzZS5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfU0xJU1RfQkFTRV9ICisjICBpbmNsdWRlIDxzdGwvX3NsaXN0X2Jhc2UuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorY2xhc3MgX1NsaXN0X25vZGUgOiBwdWJsaWMgX1NsaXN0X25vZGVfYmFzZSB7CitwdWJsaWM6CisgIF9UcCBfTV9kYXRhOworICBfX1RSSVZJQUxfU1RVRkYoX1NsaXN0X25vZGUpCit9OworCitzdHJ1Y3QgX1NsaXN0X2l0ZXJhdG9yX2Jhc2UgeworICB0eXBlZGVmIHNpemVfdCAgICAgICAgICAgICAgIHNpemVfdHlwZTsKKyAgdHlwZWRlZiBwdHJkaWZmX3QgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgIHR5cGVkZWYgZm9yd2FyZF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CisKKyAgX1NsaXN0X25vZGVfYmFzZSAqX01fbm9kZTsKKworICBfU2xpc3RfaXRlcmF0b3JfYmFzZShfU2xpc3Rfbm9kZV9iYXNlICpfX3gpIDogX01fbm9kZShfX3gpIHt9CisKKyAgdm9pZCBfTV9pbmNyKCkgeworICAgIF9NX25vZGUgPSBfTV9ub2RlLT5fTV9uZXh0OworICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVHJhaXRzPgorY2xhc3MgX1NsaXN0X2l0ZXJhdG9yIDogcHVibGljIF9TbGlzdF9pdGVyYXRvcl9iYXNlIHsKK3B1YmxpYzoKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6cG9pbnRlciAgICBwb2ludGVyOworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OnJlZmVyZW5jZSAgcmVmZXJlbmNlOworICB0eXBlZGVmIGZvcndhcmRfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworICB0eXBlZGVmIHNpemVfdCBzaXplX3R5cGU7CisgIHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKKworICB0eXBlZGVmIF9TbGlzdF9pdGVyYXRvcjxfVHAsIF9UcmFpdHM+ICAgICAgICAgX1NlbGY7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6X05vbkNvbnN0VHJhaXRzICAgICBfTm9uQ29uc3RUcmFpdHM7CisgIHR5cGVkZWYgX1NsaXN0X2l0ZXJhdG9yPF9UcCwgX05vbkNvbnN0VHJhaXRzPiBpdGVyYXRvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpfQ29uc3RUcmFpdHMgICAgICAgIF9Db25zdFRyYWl0czsKKyAgdHlwZWRlZiBfU2xpc3RfaXRlcmF0b3I8X1RwLCBfQ29uc3RUcmFpdHM+ICAgIGNvbnN0X2l0ZXJhdG9yOworCisgIHR5cGVkZWYgX1NsaXN0X25vZGU8dmFsdWVfdHlwZT4gX05vZGU7CisKKyAgZXhwbGljaXQgX1NsaXN0X2l0ZXJhdG9yKF9TbGlzdF9ub2RlX2Jhc2UgKl9feCkgOiBfU2xpc3RfaXRlcmF0b3JfYmFzZShfX3gpIHt9CisgIF9TbGlzdF9pdGVyYXRvcigpIDogX1NsaXN0X2l0ZXJhdG9yX2Jhc2UoMCkge30KKyAgLy9jb3B5IGNvbnN0cnVjdG9yIGZvciBpdGVyYXRvciBhbmQgY29uc3RydWN0b3IgZnJvbSBpdGVyYXRvciBmb3IgY29uc3RfaXRlcmF0b3IKKyAgX1NsaXN0X2l0ZXJhdG9yKGNvbnN0IGl0ZXJhdG9yJiBfX3gpIDogX1NsaXN0X2l0ZXJhdG9yX2Jhc2UoX194Ll9NX25vZGUpIHt9CisKKyAgcmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIF9fU1RBVElDX0NBU1QoX05vZGUqLCB0aGlzLT5fTV9ub2RlKS0+X01fZGF0YTsgfQorCisgIF9TVExQX0RFRklORV9BUlJPV19PUEVSQVRPUgorCisgIF9TZWxmJiBvcGVyYXRvcisrKCkgeworICAgIF9NX2luY3IoKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgX1NlbGYgb3BlcmF0b3IrKyhpbnQpIHsKKyAgICBfU2VsZiBfX3RtcCA9ICp0aGlzOworICAgIF9NX2luY3IoKTsKKyAgICByZXR1cm4gX190bXA7CisgIH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3RfaXRlcmF0b3IgX195ICkgY29uc3QgeworICAgIHJldHVybiB0aGlzLT5fTV9ub2RlID09IF9feS5fTV9ub2RlOworICB9CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdF9pdGVyYXRvciBfX3kgKSBjb25zdCB7CisgICAgcmV0dXJuIHRoaXMtPl9NX25vZGUgIT0gX195Ll9NX25vZGU7CisgIH0KK307CisKKyNpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQorX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVHJhaXRzPgorc3RydWN0IF9fdHlwZV90cmFpdHM8X1NUTFBfUFJJViBfU2xpc3RfaXRlcmF0b3I8X1RwLCBfVHJhaXRzPiA+IHsKKyAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgICBoYXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yOworICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2NvcHlfY29uc3RydWN0b3I7CisgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfYXNzaWdubWVudF9vcGVyYXRvcjsKKyAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9kZXN0cnVjdG9yOworICB0eXBlZGVmIF9fZmFsc2VfdHlwZSAgIGlzX1BPRF90eXBlOworfTsKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKyNlbmRpZiAvKiBfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OICovCisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfT0xEX0hQX0lURVJBVE9SX1FVRVJJRVMpCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUgX1RwKiBfU1RMUF9DQUxMIHZhbHVlX3R5cGUoY29uc3QgX1NUTFBfUFJJViBfU2xpc3RfaXRlcmF0b3I8X1RwLCBfVHJhaXRzPiYpIHsgcmV0dXJuIF9fU1RBVElDX0NBU1QoX1RwKiwgMCk7IH0KK2lubGluZSBwdHJkaWZmX3QqIF9TVExQX0NBTEwgZGlzdGFuY2VfdHlwZShjb25zdCBfU1RMUF9QUklWIF9TbGlzdF9pdGVyYXRvcl9iYXNlJikgeyByZXR1cm4gMDsgfQoraW5saW5lIGZvcndhcmRfaXRlcmF0b3JfdGFnIF9TVExQX0NBTEwgaXRlcmF0b3JfY2F0ZWdvcnkoY29uc3QgX1NUTFBfUFJJViBfU2xpc3RfaXRlcmF0b3JfYmFzZSYpIHsgcmV0dXJuIGZvcndhcmRfaXRlcmF0b3JfdGFnKCk7IH0KK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKyNlbmRpZiAvKiBPTERfUVVFUklFUyAqLworCisvLyBCYXNlIGNsYXNzIHRoYXQgZW5jYXBzdWxhdGVzIGRldGFpbHMgb2YgYWxsb2NhdG9ycyBhbmQgc2ltcGxpZmllcyBFSAordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgorY2xhc3MgX1NsaXN0X2Jhc2UgeworcHJvdGVjdGVkOgorICB0eXBlZGVmIF9TbGlzdF9ub2RlPF9UcD4gX05vZGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jX3RyYWl0czxfTm9kZSxfQWxsb2M+OjphbGxvY2F0b3JfdHlwZSBfTV9ub2RlX2FsbG9jYXRvcl90eXBlOworICB0eXBlZGVmIF9TbGlzdF9iYXNlPF9UcCwgX0FsbG9jPiBfU2VsZjsKKworcHVibGljOgorICB0eXBlZGVmIF9TVExQX2FsbG9jX3Byb3h5PF9TbGlzdF9ub2RlX2Jhc2UsIF9Ob2RlLCBfTV9ub2RlX2FsbG9jYXRvcl90eXBlPiBfQWxsb2NQcm94eTsKKworICBfU1RMUF9GT1JDRV9BTExPQ0FUT1JTKF9UcCwgX0FsbG9jKQorICB0eXBlZGVmIF9BbGxvYyBhbGxvY2F0b3JfdHlwZTsKKworICBfU2xpc3RfYmFzZShjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKSA6CisgICAgX01faGVhZChfU1RMUF9DT05WRVJUX0FMTE9DQVRPUihfX2EsIF9Ob2RlKSwgX1NsaXN0X25vZGVfYmFzZSgpICkKKyAgeyBfTV9oZWFkLl9NX2RhdGEuX01fbmV4dCA9IDA7IH0KKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19NT1ZFX1NFTUFOVElDKQorICBfU2xpc3RfYmFzZShfX21vdmVfc291cmNlPF9TZWxmPiBzcmMpIDoKKyAgICBfTV9oZWFkKF9fbW92ZV9zb3VyY2U8X0FsbG9jUHJveHk+KHNyYy5nZXQoKS5fTV9oZWFkKSkKKyAgeyBzcmMuZ2V0KCkuX01faGVhZC5fTV9kYXRhLl9NX25leHQgPSAwOyB9CisjZW5kaWYKKworICB+X1NsaXN0X2Jhc2UoKSB7IF9NX2VyYXNlX2FmdGVyKCZfTV9oZWFkLl9NX2RhdGEsIDApOyB9CisKK3Byb3RlY3RlZDoKKyAgX1NsaXN0X25vZGVfYmFzZSogX01fZXJhc2VfYWZ0ZXIoX1NsaXN0X25vZGVfYmFzZSogX19wb3MpIHsKKyAgICBfTm9kZSogX19uZXh0ID0gX19TVEFUSUNfQ0FTVChfTm9kZSosIF9fcG9zLT5fTV9uZXh0KTsKKyAgICBfU2xpc3Rfbm9kZV9iYXNlKiBfX25leHRfbmV4dCA9IF9fbmV4dC0+X01fbmV4dDsKKyAgICBfX3Bvcy0+X01fbmV4dCA9IF9fbmV4dF9uZXh0OworICAgIF9TVExQX1NURDo6X0Rlc3Ryb3koJl9fbmV4dC0+X01fZGF0YSk7CisgICAgX01faGVhZC5kZWFsbG9jYXRlKF9fbmV4dCwxKTsKKyAgICByZXR1cm4gX19uZXh0X25leHQ7CisgIH0KKyAgX1NsaXN0X25vZGVfYmFzZSogX01fZXJhc2VfYWZ0ZXIoX1NsaXN0X25vZGVfYmFzZSosIF9TbGlzdF9ub2RlX2Jhc2UqKTsKKworcHVibGljOgorICBhbGxvY2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9yKCkgY29uc3QKKyAgeyByZXR1cm4gX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoKGNvbnN0IF9NX25vZGVfYWxsb2NhdG9yX3R5cGUmKV9NX2hlYWQsIF9UcCk7IH0KKyAgX0FsbG9jUHJveHkgX01faGVhZDsKK307CisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUFRSX1NQRUNJQUxJWkFUSU9OUykKKyMgIGRlZmluZSBzbGlzdCBfU1RMUF9QVFJfSU1QTF9OQU1FKHNsaXN0KQorI2VsaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpCisjICBkZWZpbmUgc2xpc3QgX1NUTFBfTk9OX0RCR19OQU1FKHNsaXN0KQorI2Vsc2UKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIF9TVExQX0RGTF9UTVBMX1BBUkFNKF9BbGxvYywgYWxsb2NhdG9yPF9UcD4pID4KK2NsYXNzIHNsaXN0OworCisjaWYgIWRlZmluZWQgKHNsaXN0KQorX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorI2VuZGlmCisKKy8vIGhlbHBlciBmdW5jdGlvbnMgdG8gcmVkdWNlIGNvZGUgZHVwbGljYXRpb24KK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYywgY2xhc3MgX0JpbmFyeVByZWRpY2F0ZT4KK3ZvaWQgX1NsaXN0X3VuaXF1ZShzbGlzdDxfVHAsIF9BbGxvYz4mIF9fdGhhdCwgX0JpbmFyeVByZWRpY2F0ZSBfX2JpbmFyeV9wcmVkKTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jLCBjbGFzcyBfU3RyaWN0V2Vha09yZGVyaW5nPgordm9pZCBfU2xpc3RfbWVyZ2Uoc2xpc3Q8X1RwLCBfQWxsb2M+JiBfX3RoYXQsIHNsaXN0PF9UcCwgX0FsbG9jPiYgX194LAorICAgICAgICAgICAgICAgICAgX1N0cmljdFdlYWtPcmRlcmluZyBfX2NvbXApOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2MsIGNsYXNzIF9TdHJpY3RXZWFrT3JkZXJpbmc+Cit2b2lkIF9TbGlzdF9zb3J0KHNsaXN0PF9UcCwgX0FsbG9jPiYgX190aGF0LCBfU3RyaWN0V2Vha09yZGVyaW5nIF9fY29tcCk7CisKKyNpZiAhZGVmaW5lZCAoc2xpc3QpCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CitjbGFzcyBzbGlzdCA6IHByb3RlY3RlZCBfU1RMUF9QUklWIF9TbGlzdF9iYXNlPF9UcCxfQWxsb2M+CisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKSAmJiAhZGVmaW5lZCAoc2xpc3QpCisgICAgICAgICAgICAsIHB1YmxpYyBfX3N0bHBvcnRfY2xhc3M8c2xpc3Q8X1RwLCBfQWxsb2M+ID4KKyNlbmRpZgoreworcHJpdmF0ZToKKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9TbGlzdF9iYXNlPF9UcCxfQWxsb2M+IF9CYXNlOworICB0eXBlZGVmIHNsaXN0PF9UcCxfQWxsb2M+IF9TZWxmOworcHVibGljOgorICB0eXBlZGVmIF9UcCAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworCisgIHR5cGVkZWYgdmFsdWVfdHlwZSogICAgICAgcG9pbnRlcjsKKyAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlKiBjb25zdF9wb2ludGVyOworICB0eXBlZGVmIHZhbHVlX3R5cGUmICAgICAgIHJlZmVyZW5jZTsKKyAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlJiBjb25zdF9yZWZlcmVuY2U7CisgIHR5cGVkZWYgc2l6ZV90ICAgICAgICAgICAgc2l6ZV90eXBlOworICB0eXBlZGVmIHB0cmRpZmZfdCAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgdHlwZWRlZiBmb3J3YXJkX2l0ZXJhdG9yX3RhZyBfSXRlcmF0b3JfY2F0ZWdvcnk7CisKKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9TbGlzdF9pdGVyYXRvcjxfVHAsIF9Ob25jb25zdF90cmFpdHM8X1RwPiA+IGl0ZXJhdG9yOworICB0eXBlZGVmIF9TVExQX1BSSVYgX1NsaXN0X2l0ZXJhdG9yPF9UcCwgX0NvbnN0X3RyYWl0czxfVHA+ID4gICAgY29uc3RfaXRlcmF0b3I7CisKKyAgX1NUTFBfRk9SQ0VfQUxMT0NBVE9SUyhfVHAsIF9BbGxvYykKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7CisKK3ByaXZhdGU6CisgIHR5cGVkZWYgX1NUTFBfUFJJViBfU2xpc3Rfbm9kZTxfVHA+IF9Ob2RlOworICB0eXBlZGVmIF9TVExQX1BSSVYgX1NsaXN0X25vZGVfYmFzZSBfTm9kZV9iYXNlOworCisjaWYgIWRlZmluZWQoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKKyAgX05vZGUqIF9NX2NyZWF0ZV9ub2RlKGNvbnN0IHZhbHVlX3R5cGUmIF9feCA9IF9UcCgpKSB7CisjZWxzZQorICBfTm9kZSogX01fY3JlYXRlX25vZGUoY29uc3QgdmFsdWVfdHlwZSYgX194KSB7CisjZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKi8KKyAgICBfTm9kZSogX19ub2RlID0gdGhpcy0+X01faGVhZC5hbGxvY2F0ZSgxKTsKKyAgICBfU1RMUF9UUlkgeworICAgICAgX0NvcHlfQ29uc3RydWN0KCZfX25vZGUtPl9NX2RhdGEsIF9feCk7CisgICAgICBfX25vZGUtPl9NX25leHQgPSAwOworICAgIH0KKyAgICBfU1RMUF9VTldJTkQodGhpcy0+X01faGVhZC5kZWFsbG9jYXRlKF9fbm9kZSwgMSkpCisgICAgcmV0dXJuIF9fbm9kZTsKKyAgfQorCisjaWYgZGVmaW5lZChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorICBfTm9kZSogX01fY3JlYXRlX25vZGUoKSB7CisgICAgX05vZGUqIF9fbm9kZSA9IHRoaXMtPl9NX2hlYWQuYWxsb2NhdGUoMSk7CisgICAgX1NUTFBfVFJZIHsKKyAgICAgIF9TVExQX1NURDo6X0NvbnN0cnVjdCgmX19ub2RlLT5fTV9kYXRhKTsKKyAgICAgIF9fbm9kZS0+X01fbmV4dCA9IDA7CisgICAgfQorICAgIF9TVExQX1VOV0lORCh0aGlzLT5fTV9oZWFkLmRlYWxsb2NhdGUoX19ub2RlLCAxKSkKKyAgICByZXR1cm4gX19ub2RlOworICB9CisjZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKi8KKworcHVibGljOgorCisgIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdCB7IHJldHVybiBfQmFzZTo6Z2V0X2FsbG9jYXRvcigpOyB9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKKyAgZXhwbGljaXQgc2xpc3QoY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisjZWxzZQorICBzbGlzdCgpCisgICAgOiBfU1RMUF9QUklWIF9TbGlzdF9iYXNlPF9UcCxfQWxsb2M+KGFsbG9jYXRvcl90eXBlKCkpIHt9CisgIHNsaXN0KGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisjZW5kaWYKKyAgICA6IF9TVExQX1BSSVYgX1NsaXN0X2Jhc2U8X1RwLF9BbGxvYz4oX19hKSB7fQorCisjaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCisgIGV4cGxpY2l0IHNsaXN0KHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCA9IF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQoX1RwKSwKKyAgICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9ICBhbGxvY2F0b3JfdHlwZSgpKQorI2Vsc2UKKyAgZXhwbGljaXQgc2xpc3Qoc2l6ZV90eXBlIF9fbikKKyAgICA6IF9TVExQX1BSSVYgX1NsaXN0X2Jhc2U8X1RwLF9BbGxvYz4oYWxsb2NhdG9yX3R5cGUoKSkKKyAgICB7IF9NX2luc2VydF9hZnRlcl9maWxsKCZ0aGlzLT5fTV9oZWFkLl9NX2RhdGEsIF9fbiwgX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRChfVHApKTsgfQorICBzbGlzdChzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgICAgOiBfU1RMUF9QUklWIF9TbGlzdF9iYXNlPF9UcCxfQWxsb2M+KGFsbG9jYXRvcl90eXBlKCkpCisgICAgeyBfTV9pbnNlcnRfYWZ0ZXJfZmlsbCgmdGhpcy0+X01faGVhZC5fTV9kYXRhLCBfX24sIF9feCk7IH0KKyAgc2xpc3Qoc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX194LCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorI2VuZGlmCisgICAgOiBfU1RMUF9QUklWIF9TbGlzdF9iYXNlPF9UcCxfQWxsb2M+KF9fYSkKKyAgICB7IF9NX2luc2VydF9hZnRlcl9maWxsKCZ0aGlzLT5fTV9oZWFkLl9NX2RhdGEsIF9fbiwgX194KTsgfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyAgLy8gV2UgZG9uJ3QgbmVlZCBhbnkgZGlzcGF0Y2hpbmcgdHJpY2tzIGhlcmUsIGJlY2F1c2UgX01faW5zZXJ0X2FmdGVyX3JhbmdlCisgIC8vIGFscmVhZHkgZG9lcyB0aGVtLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHNsaXN0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSBfU1RMUF9BTExPQ0FUT1JfVFlQRV9ERkwpCisgICAgOiBfU1RMUF9QUklWIF9TbGlzdF9iYXNlPF9UcCxfQWxsb2M+KF9fYSkKKyAgICB7IF9NX2luc2VydF9hZnRlcl9yYW5nZSgmdGhpcy0+X01faGVhZC5fTV9kYXRhLCBfX2ZpcnN0LCBfX2xhc3QpOyB9CisjICBpZiBkZWZpbmVkIChfU1RMUF9ORUVEU19FWFRSQV9URU1QTEFURV9DT05TVFJVQ1RPUlMpCisgIC8vIFZDKysgbmVlZHMgdGhpcyBjcmF6eW5lc3MKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICBzbGlzdChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgOiBfU1RMUF9QUklWIF9TbGlzdF9iYXNlPF9UcCxfQWxsb2M+KGFsbG9jYXRvcl90eXBlKCkpCisgICAgeyBfTV9pbnNlcnRfYWZ0ZXJfcmFuZ2UoJnRoaXMtPl9NX2hlYWQuX01fZGF0YSwgX19maXJzdCwgX19sYXN0KTsgfQorIyBlbmRpZgorI2Vsc2UgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworICBzbGlzdChjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QsCisgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSAgYWxsb2NhdG9yX3R5cGUoKSApCisgICAgOiBfU1RMUF9QUklWIF9TbGlzdF9iYXNlPF9UcCxfQWxsb2M+KF9fYSkKKyAgICB7IF9NX2luc2VydF9hZnRlcl9yYW5nZSgmdGhpcy0+X01faGVhZC5fTV9kYXRhLCBfX2ZpcnN0LCBfX2xhc3QpOyB9CisgIHNsaXN0KGNvbnN0IHZhbHVlX3R5cGUqIF9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbGFzdCwKKyAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9ICBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX1NUTFBfUFJJViBfU2xpc3RfYmFzZTxfVHAsX0FsbG9jPihfX2EpCisgICAgeyBfTV9pbnNlcnRfYWZ0ZXJfcmFuZ2UoJnRoaXMtPl9NX2hlYWQuX01fZGF0YSwgX19maXJzdCwgX19sYXN0KTsgfQorI2VuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKworICBzbGlzdChjb25zdCBfU2VsZiYgX194KQorICAgIDogX1NUTFBfUFJJViBfU2xpc3RfYmFzZTxfVHAsX0FsbG9jPihfX3guZ2V0X2FsbG9jYXRvcigpKQorICAgIHsgX01faW5zZXJ0X2FmdGVyX3JhbmdlKCZ0aGlzLT5fTV9oZWFkLl9NX2RhdGEsIF9feC5iZWdpbigpLCBfX3guZW5kKCkpOyB9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKKyAgc2xpc3QoX19tb3ZlX3NvdXJjZTxfU2VsZj4gc3JjKQorICAgIDogX1NUTFBfUFJJViBfU2xpc3RfYmFzZTxfVHAsIF9BbGxvYz4oX19tb3ZlX3NvdXJjZTxfQmFzZT4oc3JjLmdldCgpKSkge30KKyNlbmRpZgorCisgIF9TZWxmJiBvcGVyYXRvcj0gKGNvbnN0IF9TZWxmJiBfX3gpOworCisgIH5zbGlzdCgpIHt9CisKK3B1YmxpYzoKKyAgLy8gYXNzaWduKCksIGEgZ2VuZXJhbGl6ZWQgYXNzaWdubWVudCBtZW1iZXIgZnVuY3Rpb24uICBUd28KKyAgLy8gdmVyc2lvbnM6IG9uZSB0aGF0IHRha2VzIGEgY291bnQsIGFuZCBvbmUgdGhhdCB0YWtlcyBhIHJhbmdlLgorICAvLyBUaGUgcmFuZ2UgdmVyc2lvbiBpcyBhIG1lbWJlciB0ZW1wbGF0ZSwgc28gd2UgZGlzcGF0Y2ggb24gd2hldGhlcgorICAvLyBvciBub3QgdGhlIHR5cGUgaXMgYW4gaW50ZWdlci4KKworICB2b2lkIGFzc2lnbihzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9fdmFsKSB7IF9NX2ZpbGxfYXNzaWduKF9fbiwgX192YWwpOyB9CisKK3ByaXZhdGU6CisgIHZvaWQgX01fZmlsbF9hc3NpZ24oc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3ZhbCk7CisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorcHVibGljOgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZvaWQgYXNzaWduKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lzSW50ZWdyYWw8X0lucHV0SXRlcmF0b3I+OjpfUmV0IF9JbnRlZ3JhbDsKKyAgICBfTV9hc3NpZ25fZGlzcGF0Y2goX19maXJzdCwgX19sYXN0LCBfSW50ZWdyYWwoKSk7CisgIH0KKworcHJpdmF0ZToKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2VyPgorICB2b2lkIF9NX2Fzc2lnbl9kaXNwYXRjaChfSW50ZWdlciBfX24sIF9JbnRlZ2VyIF9fdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX3RydWVfdHlwZSYgLypfSXNJbnRlZ3JhbCovKSB7CisgICAgX01fZmlsbF9hc3NpZ24oKHNpemVfdHlwZSkgX19uLCAoX1RwKSBfX3ZhbCk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcj4KKyAgdm9pZCBfTV9hc3NpZ25fZGlzcGF0Y2goX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19mYWxzZV90eXBlJiAvKl9Jc0ludGVncmFsKi8pIHsKKyNlbHNlCitwdWJsaWM6CisgIHZvaWQgYXNzaWduKGNvbnN0X3BvaW50ZXIgX19maXJzdCwgY29uc3RfcG9pbnRlciBfX2xhc3QpIHsKKyAgICBfTm9kZV9iYXNlKiBfX3ByZXYgPSAmdGhpcy0+X01faGVhZC5fTV9kYXRhOworICAgIF9Ob2RlX2Jhc2UqIF9fbm9kZSA9IHRoaXMtPl9NX2hlYWQuX01fZGF0YS5fTV9uZXh0OworICAgIHdoaWxlIChfX25vZGUgIT0gMCAmJiBfX2ZpcnN0ICE9IF9fbGFzdCkgeworICAgICAgX19TVEFUSUNfQ0FTVChfTm9kZSosIF9fbm9kZSktPl9NX2RhdGEgPSAqX19maXJzdDsKKyAgICAgIF9fcHJldiA9IF9fbm9kZTsKKyAgICAgIF9fbm9kZSA9IF9fbm9kZS0+X01fbmV4dDsKKyAgICAgICsrX19maXJzdDsKKyAgICB9CisgICAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KQorICAgICAgX01faW5zZXJ0X2FmdGVyX3JhbmdlKF9fcHJldiwgX19maXJzdCwgX19sYXN0KTsKKyAgICBlbHNlCisgICAgICB0aGlzLT5fTV9lcmFzZV9hZnRlcihfX3ByZXYsIDApOworICB9CisgIHZvaWQgYXNzaWduKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkgeworI2VuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKyAgICBfTm9kZV9iYXNlKiBfX3ByZXYgPSAmdGhpcy0+X01faGVhZC5fTV9kYXRhOworICAgIF9Ob2RlX2Jhc2UqIF9fbm9kZSA9IHRoaXMtPl9NX2hlYWQuX01fZGF0YS5fTV9uZXh0OworICAgIHdoaWxlIChfX25vZGUgIT0gMCAmJiBfX2ZpcnN0ICE9IF9fbGFzdCkgeworICAgICAgX19TVEFUSUNfQ0FTVChfTm9kZSosIF9fbm9kZSktPl9NX2RhdGEgPSAqX19maXJzdDsKKyAgICAgIF9fcHJldiA9IF9fbm9kZTsKKyAgICAgIF9fbm9kZSA9IF9fbm9kZS0+X01fbmV4dDsKKyAgICAgICsrX19maXJzdDsKKyAgICB9CisgICAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KQorICAgICAgX01faW5zZXJ0X2FmdGVyX3JhbmdlKF9fcHJldiwgX19maXJzdCwgX19sYXN0KTsKKyAgICBlbHNlCisgICAgICB0aGlzLT5fTV9lcmFzZV9hZnRlcihfX3ByZXYsIDApOworICB9CisKK3B1YmxpYzoKKworICAvLyBFeHBlcmltZW50YWwgbmV3IGZlYXR1cmU6IGJlZm9yZV9iZWdpbigpIHJldHVybnMgYQorICAvLyBub24tZGVyZWZlcmVuY2VhYmxlIGl0ZXJhdG9yIHRoYXQsIHdoZW4gaW5jcmVtZW50ZWQsIHlpZWxkcworICAvLyBiZWdpbigpLiAgVGhpcyBpdGVyYXRvciBtYXkgYmUgdXNlZCBhcyB0aGUgYXJndW1lbnQgdG8KKyAgLy8gaW5zZXJ0X2FmdGVyLCBlcmFzZV9hZnRlciwgZXRjLiAgTm90ZSB0aGF0IGV2ZW4gZm9yIGFuIGVtcHR5CisgIC8vIHNsaXN0LCBiZWZvcmVfYmVnaW4oKSBpcyBub3QgdGhlIHNhbWUgaXRlcmF0b3IgYXMgZW5kKCkuICBJdAorICAvLyBpcyBhbHdheXMgbmVjZXNzYXJ5IHRvIGluY3JlbWVudCBiZWZvcmVfYmVnaW4oKSBhdCBsZWFzdCBvbmNlIHRvCisgIC8vIG9idGFpbiBlbmQoKS4KKyAgaXRlcmF0b3IgYmVmb3JlX2JlZ2luKCkgeyByZXR1cm4gaXRlcmF0b3IoJnRoaXMtPl9NX2hlYWQuX01fZGF0YSk7IH0KKyAgY29uc3RfaXRlcmF0b3IgYmVmb3JlX2JlZ2luKCkgY29uc3QKKyAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfX0NPTlNUX0NBU1QoX05vZGVfYmFzZSosICZ0aGlzLT5fTV9oZWFkLl9NX2RhdGEpKTsgfQorCisgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gaXRlcmF0b3IodGhpcy0+X01faGVhZC5fTV9kYXRhLl9NX25leHQpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QKKyAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcih0aGlzLT5fTV9oZWFkLl9NX2RhdGEuX01fbmV4dCk7fQorCisgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIGl0ZXJhdG9yKCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoKTsgfQorCisgIHNpemVfdHlwZSBzaXplKCkgY29uc3QKKyAgeyByZXR1cm4gX1NUTFBfUFJJViBfU2xfZ2xvYmFsX2luc3Q6OnNpemUodGhpcy0+X01faGVhZC5fTV9kYXRhLl9NX25leHQpOyB9CisKKyAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgeyByZXR1cm4gc2l6ZV90eXBlKC0xKTsgfQorCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiB0aGlzLT5fTV9oZWFkLl9NX2RhdGEuX01fbmV4dCA9PSAwOyB9CisKKyAgdm9pZCBzd2FwKF9TZWxmJiBfX3gpCisgIHsgdGhpcy0+X01faGVhZC5zd2FwKF9feC5fTV9oZWFkKTsgfQorI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QQVJUSUFMX1NQRUNfV09SS0FST1VORCkgJiYgIWRlZmluZWQgKF9TVExQX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUikKKyAgdm9pZCBfTV9zd2FwX3dvcmthcm91bmQoX1NlbGYmIF9feCkgeyBzd2FwKF9feCk7IH0KKyNlbmRpZgorCitwdWJsaWM6CisgIHJlZmVyZW5jZSBmcm9udCgpICAgICAgICAgICAgIHsgcmV0dXJuICpiZWdpbigpOyB9CisgIGNvbnN0X3JlZmVyZW5jZSBmcm9udCgpIGNvbnN0IHsgcmV0dXJuICpiZWdpbigpOyB9CisjaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pICYmICFkZWZpbmVkIChfU1RMUF9OT19BTkFDSFJPTklTTVMpCisgIHZvaWQgcHVzaF9mcm9udChjb25zdCB2YWx1ZV90eXBlJiBfX3ggPSBfVHAoKSkgICB7CisjZWxzZQorICB2b2lkIHB1c2hfZnJvbnQoY29uc3QgdmFsdWVfdHlwZSYgX194KSAgIHsKKyNlbmRpZiAvKiFfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNICYmICFfU1RMUF9OT19BTkFDSFJPTklTTVMqLworICAgIF9TVExQX1BSSVYgX19zbGlzdF9tYWtlX2xpbmsoJnRoaXMtPl9NX2hlYWQuX01fZGF0YSwgX01fY3JlYXRlX25vZGUoX194KSk7CisgIH0KKworI2lmIGRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pICYmICFkZWZpbmVkIChfU1RMUF9OT19BTkFDSFJPTklTTVMpCisgIHZvaWQgcHVzaF9mcm9udCgpIHsgX1NUTFBfUFJJViBfX3NsaXN0X21ha2VfbGluaygmdGhpcy0+X01faGVhZC5fTV9kYXRhLCBfTV9jcmVhdGVfbm9kZSgpKTt9CisjZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNICYmICFfU1RMUF9OT19BTkFDSFJPTklTTVMqLworCisgIHZvaWQgcG9wX2Zyb250KCkgeworICAgIF9Ob2RlKiBfX25vZGUgPSBfX1NUQVRJQ19DQVNUKF9Ob2RlKiwgdGhpcy0+X01faGVhZC5fTV9kYXRhLl9NX25leHQpOworICAgIHRoaXMtPl9NX2hlYWQuX01fZGF0YS5fTV9uZXh0ID0gX19ub2RlLT5fTV9uZXh0OworICAgIF9TVExQX1NURDo6X0Rlc3Ryb3koJl9fbm9kZS0+X01fZGF0YSk7CisgICAgdGhpcy0+X01faGVhZC5kZWFsbG9jYXRlKF9fbm9kZSwgMSk7CisgIH0KKworICBpdGVyYXRvciBwcmV2aW91cyhjb25zdF9pdGVyYXRvciBfX3BvcykgeworICAgIHJldHVybiBpdGVyYXRvcihfU1RMUF9QUklWIF9TbF9nbG9iYWxfaW5zdDo6X19wcmV2aW91cygmdGhpcy0+X01faGVhZC5fTV9kYXRhLCBfX3Bvcy5fTV9ub2RlKSk7CisgIH0KKyAgY29uc3RfaXRlcmF0b3IgcHJldmlvdXMoY29uc3RfaXRlcmF0b3IgX19wb3MpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfaXRlcmF0b3IoX19DT05TVF9DQVNUKF9Ob2RlX2Jhc2UqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfU2xfZ2xvYmFsX2luc3Q6Ol9fcHJldmlvdXMoJnRoaXMtPl9NX2hlYWQuX01fZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3Bvcy5fTV9ub2RlKSkpOworICB9CisKK3ByaXZhdGU6CisjaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCisgIF9Ob2RlKiBfTV9pbnNlcnRfYWZ0ZXIoX05vZGVfYmFzZSogX19wb3MsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCA9IF9UcCgpKSB7CisjZWxzZQorICBfTm9kZSogX01faW5zZXJ0X2FmdGVyKF9Ob2RlX2Jhc2UqIF9fcG9zLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpIHsKKyNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0qLworICAgIHJldHVybiBfX1NUQVRJQ19DQVNUKF9Ob2RlKiwgX1NUTFBfUFJJViBfX3NsaXN0X21ha2VfbGluayhfX3BvcywgX01fY3JlYXRlX25vZGUoX194KSkpOworICB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorICBfTm9kZSogX01faW5zZXJ0X2FmdGVyKF9Ob2RlX2Jhc2UqIF9fcG9zKSB7CisgICAgcmV0dXJuIF9fU1RBVElDX0NBU1QoX05vZGUqLCBfU1RMUF9QUklWIF9fc2xpc3RfbWFrZV9saW5rKF9fcG9zLCBfTV9jcmVhdGVfbm9kZSgpKSk7CisgIH0KKyNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0qLworCisgIHZvaWQgX01faW5zZXJ0X2FmdGVyX2ZpbGwoX05vZGVfYmFzZSogX19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX194KSB7CisgICAgZm9yIChzaXplX3R5cGUgX19pID0gMDsgX19pIDwgX19uOyArK19faSkKKyAgICAgIF9fcG9zID0gX1NUTFBfUFJJViBfX3NsaXN0X21ha2VfbGluayhfX3BvcywgX01fY3JlYXRlX25vZGUoX194KSk7CisgIH0KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIC8vIENoZWNrIHdoZXRoZXIgaXQncyBhbiBpbnRlZ3JhbCB0eXBlLiAgSWYgc28sIGl0J3Mgbm90IGFuIGl0ZXJhdG9yLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0luSXRlcj4KKyAgdm9pZCBfTV9pbnNlcnRfYWZ0ZXJfcmFuZ2UoX05vZGVfYmFzZSogX19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Jbkl0ZXIgX19maXJzdCwgX0luSXRlciBfX2xhc3QpIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0ludGVncmFsPF9Jbkl0ZXI+OjpfUmV0IF9JbnRlZ3JhbDsKKyAgICBfTV9pbnNlcnRfYWZ0ZXJfcmFuZ2UoX19wb3MsIF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2VyPgorICB2b2lkIF9NX2luc2VydF9hZnRlcl9yYW5nZShfTm9kZV9iYXNlKiBfX3BvcywgX0ludGVnZXIgX19uLCBfSW50ZWdlciBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fdHJ1ZV90eXBlJikgeworICAgIF9NX2luc2VydF9hZnRlcl9maWxsKF9fcG9zLCBfX24sIF9feCk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0luSXRlcj4KKyAgdm9pZCBfTV9pbnNlcnRfYWZ0ZXJfcmFuZ2UoX05vZGVfYmFzZSogX19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Jbkl0ZXIgX19maXJzdCwgX0luSXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fZmFsc2VfdHlwZSYpIHsKKyNlbHNlIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKyAgdm9pZCBfTV9pbnNlcnRfYWZ0ZXJfcmFuZ2UoX05vZGVfYmFzZSogX19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlX3R5cGUqIF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlX3R5cGUqIF9fbGFzdCkgeworICAgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkgeworICAgICAgX19wb3MgPSBfU1RMUF9QUklWIF9fc2xpc3RfbWFrZV9saW5rKF9fcG9zLCBfTV9jcmVhdGVfbm9kZSgqX19maXJzdCkpOworICAgICAgKytfX2ZpcnN0OworICAgIH0KKyAgfQorICB2b2lkIF9NX2luc2VydF9hZnRlcl9yYW5nZShfTm9kZV9iYXNlKiBfX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KSB7CisjZW5kaWYgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworICAgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkgeworICAgICAgX19wb3MgPSBfU1RMUF9QUklWIF9fc2xpc3RfbWFrZV9saW5rKF9fcG9zLCBfTV9jcmVhdGVfbm9kZSgqX19maXJzdCkpOworICAgICAgKytfX2ZpcnN0OworICAgIH0KKyAgfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyAgLy8gQ2hlY2sgd2hldGhlciBpdCdzIGFuIGludGVncmFsIHR5cGUuICBJZiBzbywgaXQncyBub3QgYW4gaXRlcmF0b3IuCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5JdGVyPgorICB2b2lkIF9NX3NwbGljZV9hZnRlcl9yYW5nZShfTm9kZV9iYXNlKiBfX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0luSXRlciBfX2ZpcnN0LCBfSW5JdGVyIF9fbGFzdCkgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lzSW50ZWdyYWw8X0luSXRlcj46Ol9SZXQgX0ludGVncmFsOworICAgIF9NX3NwbGljZV9hZnRlcl9yYW5nZShfX3BvcywgX19maXJzdCwgX19sYXN0LCBfSW50ZWdyYWwoKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0ludGVnZXI+CisgIHZvaWQgX01fc3BsaWNlX2FmdGVyX3JhbmdlKF9Ob2RlX2Jhc2UqIF9fcG9zLCBfSW50ZWdlciBfX24sIF9JbnRlZ2VyIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX190cnVlX3R5cGUmKSB7CisgICAgX01faW5zZXJ0X2FmdGVyX2ZpbGwoX19wb3MsIF9fbiwgX194KTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5JdGVyPgorICB2b2lkIF9NX3NwbGljZV9hZnRlcl9yYW5nZShfTm9kZV9iYXNlKiBfX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0luSXRlciBfX2ZpcnN0LCBfSW5JdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19mYWxzZV90eXBlJikgeworI2Vsc2UgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworICB2b2lkIF9NX3NwbGljZV9hZnRlcl9yYW5nZShfTm9kZV9iYXNlKiBfX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWVfdHlwZSogX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWVfdHlwZSogX19sYXN0KSB7CisgICAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0KSB7CisgICAgICBfX3BvcyA9IF9TVExQX1BSSVYgX19zbGlzdF9tYWtlX2xpbmsoX19wb3MsIF9NX2NyZWF0ZV9ub2RlKCpfX2ZpcnN0KSk7CisgICAgICArK19fZmlyc3Q7CisgICAgfQorICB9CisgIHZvaWQgX01fc3BsaWNlX2FmdGVyX3JhbmdlKF9Ob2RlX2Jhc2UqIF9fcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpIHsKKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisgICAgLy9XZSB1c2UgYSB0ZW1wb3Jhcnkgc2xpc3QgdG8gYXZvaWQgdGhlIGF1dG8gcmVmZXJlbmNlIHRyb3VibGVzIChpbmZpbml0ZSBsb29wKQorICAgIF9TZWxmIF9fdG1wKF9fZmlyc3QsIF9fbGFzdCwgdGhpcy0+Z2V0X2FsbG9jYXRvcigpKTsKKyAgICBzcGxpY2VfYWZ0ZXIoaXRlcmF0b3IoX19wb3MpLCBfX3RtcCk7CisgIH0KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIC8vIENoZWNrIHdoZXRoZXIgaXQncyBhbiBpbnRlZ3JhbCB0eXBlLiAgSWYgc28sIGl0J3Mgbm90IGFuIGl0ZXJhdG9yLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0luSXRlcj4KKyAgdm9pZCBfTV9zcGxpY2VfcmFuZ2UoX05vZGVfYmFzZSogX19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgIF9Jbkl0ZXIgX19maXJzdCwgX0luSXRlciBfX2xhc3QpIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0ludGVncmFsPF9Jbkl0ZXI+OjpfUmV0IF9JbnRlZ3JhbDsKKyAgICBfTV9zcGxpY2VfcmFuZ2UoX19wb3MsIF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2VyPgorICB2b2lkIF9NX3NwbGljZV9yYW5nZShfTm9kZV9iYXNlKiBfX3BvcywgX0ludGVnZXIgX19uLCBfSW50ZWdlciBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fdHJ1ZV90eXBlJikgeworICAgIF9NX2luc2VydF9hZnRlcl9maWxsKF9TVExQX1BSSVYgX1NsX2dsb2JhbF9pbnN0OjpfX3ByZXZpb3VzKCZ0aGlzLT5fTV9oZWFkLl9NX2RhdGEsIF9fcG9zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX24sIF9feCk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0luSXRlcj4KKyAgdm9pZCBfTV9zcGxpY2VfcmFuZ2UoX05vZGVfYmFzZSogX19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgIF9Jbkl0ZXIgX19maXJzdCwgX0luSXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fZmFsc2VfdHlwZSYpIHsKKyNlbHNlIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKyAgdm9pZCBfTV9zcGxpY2VfcmFuZ2UoX05vZGVfYmFzZSogX19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlX3R5cGUqIF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlX3R5cGUqIF9fbGFzdCkgeworICAgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkgeworICAgICAgX19wb3MgPSBfU1RMUF9QUklWIF9fc2xpc3RfbWFrZV9saW5rKF9fcG9zLCBfTV9jcmVhdGVfbm9kZSgqX19maXJzdCkpOworICAgICAgKytfX2ZpcnN0OworICAgIH0KKyAgfQorICB2b2lkIF9NX3NwbGljZV9yYW5nZShfTm9kZV9iYXNlKiBfX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KSB7CisjZW5kaWYgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworICAgIC8vV2UgdXNlIGEgdGVtcG9yYXJ5IHNsaXN0IHRvIGF2b2lkIHRoZSBhdXRvIHJlZmVyZW5jZSB0cm91YmxlcyAoaW5maW5pdGUgbG9vcCkKKyAgICBfU2VsZiBfX3RtcChfX2ZpcnN0LCBfX2xhc3QsIHRoaXMtPmdldF9hbGxvY2F0b3IoKSk7CisgICAgc3BsaWNlKGl0ZXJhdG9yKF9fcG9zKSwgX190bXApOworICB9CisKK3B1YmxpYzoKKworI2lmICFkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorICBpdGVyYXRvciBpbnNlcnRfYWZ0ZXIoaXRlcmF0b3IgX19wb3MsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCA9IF9UcCgpKSB7CisjZWxzZQorICBpdGVyYXRvciBpbnNlcnRfYWZ0ZXIoaXRlcmF0b3IgX19wb3MsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkgeworI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCisgICAgcmV0dXJuIGl0ZXJhdG9yKF9NX2luc2VydF9hZnRlcihfX3Bvcy5fTV9ub2RlLCBfX3gpKTsKKyAgfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKKyAgaXRlcmF0b3IgaW5zZXJ0X2FmdGVyKGl0ZXJhdG9yIF9fcG9zKSB7CisgICAgcmV0dXJuIGluc2VydF9hZnRlcihfX3BvcywgX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRChfVHApKTsKKyAgfQorI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCisKKyAgdm9pZCBpbnNlcnRfYWZ0ZXIoaXRlcmF0b3IgX19wb3MsIHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkgeworICAgIF9NX2luc2VydF9hZnRlcl9maWxsKF9fcG9zLl9NX25vZGUsIF9fbiwgX194KTsKKyAgfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyAgLy8gV2UgZG9uJ3QgbmVlZCBhbnkgZGlzcGF0Y2hpbmcgdHJpY2tzIGhlcmUsIGJlY2F1c2UgX01faW5zZXJ0X2FmdGVyX3JhbmdlCisgIC8vIGFscmVhZHkgZG9lcyB0aGVtLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0luSXRlcj4KKyAgdm9pZCBpbnNlcnRfYWZ0ZXIoaXRlcmF0b3IgX19wb3MsIF9Jbkl0ZXIgX19maXJzdCwgX0luSXRlciBfX2xhc3QpIHsKKyNlbHNlIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKyAgdm9pZCBpbnNlcnRfYWZ0ZXIoaXRlcmF0b3IgX19wb3MsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlX3R5cGUqIF9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbGFzdCkgeworICAgIF9NX2luc2VydF9hZnRlcl9yYW5nZShfX3Bvcy5fTV9ub2RlLCBfX2ZpcnN0LCBfX2xhc3QpOworICB9CisgIHZvaWQgaW5zZXJ0X2FmdGVyKGl0ZXJhdG9yIF9fcG9zLAorICAgICAgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpIHsKKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisgICAgX01fc3BsaWNlX2FmdGVyX3JhbmdlKF9fcG9zLl9NX25vZGUsIF9fZmlyc3QsIF9fbGFzdCk7CisgIH0KKworI2lmICFkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCA9IF9UcCgpKSB7CisjZWxzZQorICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkgeworI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCisgICAgcmV0dXJuIGl0ZXJhdG9yKF9NX2luc2VydF9hZnRlcihfU1RMUF9QUklWIF9TbF9nbG9iYWxfaW5zdDo6X19wcmV2aW91cygmdGhpcy0+X01faGVhZC5fTV9kYXRhLCBfX3Bvcy5fTV9ub2RlKSwKKyAgICAgICAgICAgICAgICAgICAgX194KSk7CisgIH0KKworI2lmIGRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCisgIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBfX3BvcykgeworICAgIHJldHVybiBpdGVyYXRvcihfTV9pbnNlcnRfYWZ0ZXIoX1NUTFBfUFJJViBfU2xfZ2xvYmFsX2luc3Q6Ol9fcHJldmlvdXMoJnRoaXMtPl9NX2hlYWQuX01fZGF0YSwgX19wb3MuX01fbm9kZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKF9UcCkpKTsKKyAgfQorI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCisKKyAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkgeworICAgIF9NX2luc2VydF9hZnRlcl9maWxsKF9TVExQX1BSSVYgX1NsX2dsb2JhbF9pbnN0OjpfX3ByZXZpb3VzKCZ0aGlzLT5fTV9oZWFkLl9NX2RhdGEsIF9fcG9zLl9NX25vZGUpLCBfX24sIF9feCk7CisgIH0KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIC8vIFdlIGRvbid0IG5lZWQgYW55IGRpc3BhdGNoaW5nIHRyaWNrcyBoZXJlLCBiZWNhdXNlIF9NX2luc2VydF9hZnRlcl9yYW5nZQorICAvLyBhbHJlYWR5IGRvZXMgdGhlbS4KKyAgdGVtcGxhdGUgPGNsYXNzIF9Jbkl0ZXI+CisgIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBfSW5JdGVyIF9fZmlyc3QsIF9Jbkl0ZXIgX19sYXN0KSB7CisjZWxzZSAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisgIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBjb25zdCB2YWx1ZV90eXBlKiBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWVfdHlwZSogX19sYXN0KSB7CisgICAgX01faW5zZXJ0X2FmdGVyX3JhbmdlKF9TVExQX1BSSVYgX1NsX2dsb2JhbF9pbnN0OjpfX3ByZXZpb3VzKCZ0aGlzLT5fTV9oZWFkLl9NX2RhdGEsIF9fcG9zLl9NX25vZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ZpcnN0LCBfX2xhc3QpOworICB9CisgIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpIHsKKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisgICAgX01fc3BsaWNlX3JhbmdlKF9fcG9zLl9NX25vZGUsIF9fZmlyc3QsIF9fbGFzdCk7CisgIH0KKworcHVibGljOgorICBpdGVyYXRvciBlcmFzZV9hZnRlcihpdGVyYXRvciBfX3BvcykKKyAgeyByZXR1cm4gaXRlcmF0b3IodGhpcy0+X01fZXJhc2VfYWZ0ZXIoX19wb3MuX01fbm9kZSkpOyB9CisgIGl0ZXJhdG9yIGVyYXNlX2FmdGVyKGl0ZXJhdG9yIF9fYmVmb3JlX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpCisgIHsgcmV0dXJuIGl0ZXJhdG9yKHRoaXMtPl9NX2VyYXNlX2FmdGVyKF9fYmVmb3JlX2ZpcnN0Ll9NX25vZGUsIF9fbGFzdC5fTV9ub2RlKSk7IH0KKworICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBfX3BvcykKKyAgeyByZXR1cm4gaXRlcmF0b3IodGhpcy0+X01fZXJhc2VfYWZ0ZXIoX1NUTFBfUFJJViBfU2xfZ2xvYmFsX2luc3Q6Ol9fcHJldmlvdXMoJnRoaXMtPl9NX2hlYWQuX01fZGF0YSwgX19wb3MuX01fbm9kZSkpKTsgfQorICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpCisgIHsgcmV0dXJuIGl0ZXJhdG9yKHRoaXMtPl9NX2VyYXNlX2FmdGVyKF9TVExQX1BSSVYgX1NsX2dsb2JhbF9pbnN0OjpfX3ByZXZpb3VzKCZ0aGlzLT5fTV9oZWFkLl9NX2RhdGEsIF9fZmlyc3QuX01fbm9kZSksIF9fbGFzdC5fTV9ub2RlKSk7IH0KKworI2lmICFkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgbmV3X3NpemUsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCA9IF9UcCgpKTsKKyNlbHNlCisgIHZvaWQgcmVzaXplKHNpemVfdHlwZSBuZXdfc2l6ZSwgY29uc3QgdmFsdWVfdHlwZSYgX194KTsKKyNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0qLworCisjaWYgZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKKyAgdm9pZCByZXNpemUoc2l6ZV90eXBlIG5ld19zaXplKSB7IHJlc2l6ZShuZXdfc2l6ZSwgX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRChfVHApKTsgfQorI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCisKKyAgdm9pZCBjbGVhcigpCisgIHsgdGhpcy0+X01fZXJhc2VfYWZ0ZXIoJnRoaXMtPl9NX2hlYWQuX01fZGF0YSwgMCk7IH0KKworcHVibGljOgorICAvLyBNb3ZlcyB0aGUgcmFuZ2UgW19fYmVmb3JlX2ZpcnN0ICsgMSwgX19iZWZvcmVfbGFzdCArIDEpIHRvICp0aGlzLAorICAvLyAgaW5zZXJ0aW5nIGl0IGltbWVkaWF0ZWx5IGFmdGVyIF9fcG9zLiAgVGhpcyBpcyBjb25zdGFudCB0aW1lLgorICB2b2lkIHNwbGljZV9hZnRlcihpdGVyYXRvciBfX3BvcywgX1NlbGYmIF9feCwKKyAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3IgX19iZWZvcmVfZmlyc3QsIGl0ZXJhdG9yIF9fYmVmb3JlX2xhc3QpIHsKKyAgICBpZiAoX19iZWZvcmVfZmlyc3QgIT0gX19iZWZvcmVfbGFzdCkgeworICAgICAgaWYgKHRoaXMtPmdldF9hbGxvY2F0b3IoKSA9PSBfX3guZ2V0X2FsbG9jYXRvcigpKSB7CisgICAgICAgIF9TVExQX1BSSVYgX1NsX2dsb2JhbF9pbnN0OjpfX3NwbGljZV9hZnRlcihfX3Bvcy5fTV9ub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19iZWZvcmVfZmlyc3QuX01fbm9kZSwgX19iZWZvcmVfbGFzdC5fTV9ub2RlKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICB0aGlzLT5pbnNlcnRfYWZ0ZXIoX19wb3MsIGl0ZXJhdG9yKF9fYmVmb3JlX2ZpcnN0Ll9NX25vZGUtPl9NX25leHQpLCBpdGVyYXRvcihfX2JlZm9yZV9sYXN0Ll9NX25vZGUtPl9NX25leHQpKTsKKyAgICAgICAgX194LmVyYXNlX2FmdGVyKF9fYmVmb3JlX2ZpcnN0LCArK19fYmVmb3JlX2xhc3QpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIE1vdmVzIHRoZSBlbGVtZW50IHRoYXQgZm9sbG93cyBfX3ByZXYgdG8gKnRoaXMsIGluc2VydGluZyBpdCBpbW1lZGlhdGVseQorICAvLyAgYWZ0ZXIgX19wb3MuICBUaGlzIGlzIGNvbnN0YW50IHRpbWUuCisgIHZvaWQgc3BsaWNlX2FmdGVyKGl0ZXJhdG9yIF9fcG9zLCBfU2VsZiYgX194LCBpdGVyYXRvciBfX3ByZXYpIHsKKyAgICBpZiAodGhpcy0+Z2V0X2FsbG9jYXRvcigpID09IF9feC5nZXRfYWxsb2NhdG9yKCkpIHsKKyAgICAgIF9TVExQX1BSSVYgX1NsX2dsb2JhbF9pbnN0OjpfX3NwbGljZV9hZnRlcihfX3Bvcy5fTV9ub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcHJldi5fTV9ub2RlLCBfX3ByZXYuX01fbm9kZS0+X01fbmV4dCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgdGhpcy0+aW5zZXJ0X2FmdGVyKF9fcG9zLCBfX1NUQVRJQ19DQVNUKF9Ob2RlKiwgX19wcmV2Ll9NX25vZGUtPl9NX25leHQpLT5fTV9kYXRhKTsKKyAgICAgIF9feC5lcmFzZV9hZnRlcihfX3ByZXYpOworICAgIH0KKyAgfQorCisgIC8vIFJlbW92ZXMgYWxsIG9mIHRoZSBlbGVtZW50cyBmcm9tIHRoZSBsaXN0IF9feCB0byAqdGhpcywgaW5zZXJ0aW5nCisgIC8vIHRoZW0gaW1tZWRpYXRlbHkgYWZ0ZXIgX19wb3MuICBfX3ggbXVzdCBub3QgYmUgKnRoaXMuICBDb21wbGV4aXR5OgorICAvLyBsaW5lYXIgaW4gX194LnNpemUoKS4KKyAgdm9pZCBzcGxpY2VfYWZ0ZXIoaXRlcmF0b3IgX19wb3MsIF9TZWxmJiBfX3gpIHsKKyAgICBpZiAodGhpcy0+Z2V0X2FsbG9jYXRvcigpID09IF9feC5nZXRfYWxsb2NhdG9yKCkpCisgICAgICBfU1RMUF9QUklWIF9TbF9nbG9iYWxfaW5zdDo6X19zcGxpY2VfYWZ0ZXIoX19wb3MuX01fbm9kZSwgJl9feC5fTV9oZWFkLl9NX2RhdGEpOworICAgIGVsc2UgeworICAgICAgdGhpcy0+aW5zZXJ0X2FmdGVyKF9fcG9zLCBfX3guYmVnaW4oKSwgX194LmVuZCgpKTsKKyAgICAgIF9feC5jbGVhcigpOworICAgIH0KKyAgfQorCisgIC8vIExpbmVhciBpbiBkaXN0YW5jZShiZWdpbigpLCBfX3BvcyksIGFuZCBsaW5lYXIgaW4gX194LnNpemUoKS4KKyAgdm9pZCBzcGxpY2UoaXRlcmF0b3IgX19wb3MsIF9TZWxmJiBfX3gpIHsKKyAgICBpZiAoX194Ll9NX2hlYWQuX01fZGF0YS5fTV9uZXh0KSB7CisgICAgICBpZiAodGhpcy0+Z2V0X2FsbG9jYXRvcigpID09IF9feC5nZXRfYWxsb2NhdG9yKCkpIHsKKyAgICAgICAgX1NUTFBfUFJJViBfU2xfZ2xvYmFsX2luc3Q6Ol9fc3BsaWNlX2FmdGVyKF9TVExQX1BSSVYgX1NsX2dsb2JhbF9pbnN0OjpfX3ByZXZpb3VzKCZ0aGlzLT5fTV9oZWFkLl9NX2RhdGEsIF9fcG9zLl9NX25vZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJl9feC5fTV9oZWFkLl9NX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9TbF9nbG9iYWxfaW5zdDo6X19wcmV2aW91cygmX194Ll9NX2hlYWQuX01fZGF0YSwgMCkpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGluc2VydChfX3BvcywgX194LmJlZ2luKCksIF9feC5lbmQoKSk7CisgICAgICAgIF9feC5jbGVhcigpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIExpbmVhciBpbiBkaXN0YW5jZShiZWdpbigpLCBfX3BvcyksIGFuZCBpbiBkaXN0YW5jZShfX3guYmVnaW4oKSwgX19pKS4KKyAgdm9pZCBzcGxpY2UoaXRlcmF0b3IgX19wb3MsIF9TZWxmJiBfX3gsIGl0ZXJhdG9yIF9faSkgeworICAgIGlmICh0aGlzLT5nZXRfYWxsb2NhdG9yKCkgPT0gX194LmdldF9hbGxvY2F0b3IoKSkgeworICAgICAgX1NUTFBfUFJJViBfU2xfZ2xvYmFsX2luc3Q6Ol9fc3BsaWNlX2FmdGVyKF9TVExQX1BSSVYgX1NsX2dsb2JhbF9pbnN0OjpfX3ByZXZpb3VzKCZ0aGlzLT5fTV9oZWFkLl9NX2RhdGEsIF9fcG9zLl9NX25vZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX1NsX2dsb2JhbF9pbnN0OjpfX3ByZXZpb3VzKCZfX3guX01faGVhZC5fTV9kYXRhLCBfX2kuX01fbm9kZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19pLl9NX25vZGUpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGluc2VydChfX3BvcywgKl9faSk7CisgICAgICBfX3guZXJhc2UoX19pKTsKKyAgICB9CisgIH0KKworICAvLyBMaW5lYXIgaW4gZGlzdGFuY2UoYmVnaW4oKSwgX19wb3MpLCBpbiBkaXN0YW5jZShfX3guYmVnaW4oKSwgX19maXJzdCksCisgIC8vIGFuZCBpbiBkaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QpLgorICB2b2lkIHNwbGljZShpdGVyYXRvciBfX3BvcywgX1NlbGYmIF9feCwgaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KSB7CisgICAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KSB7CisgICAgICBpZiAodGhpcy0+Z2V0X2FsbG9jYXRvcigpID09IF9feC5nZXRfYWxsb2NhdG9yKCkpIHsKKyAgICAgICAgX1NUTFBfUFJJViBfU2xfZ2xvYmFsX2luc3Q6Ol9fc3BsaWNlX2FmdGVyKF9TVExQX1BSSVYgX1NsX2dsb2JhbF9pbnN0OjpfX3ByZXZpb3VzKCZ0aGlzLT5fTV9oZWFkLl9NX2RhdGEsIF9fcG9zLl9NX25vZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfU2xfZ2xvYmFsX2luc3Q6Ol9fcHJldmlvdXMoJl9feC5fTV9oZWFkLl9NX2RhdGEsIF9fZmlyc3QuX01fbm9kZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9TbF9nbG9iYWxfaW5zdDo6X19wcmV2aW91cyhfX2ZpcnN0Ll9NX25vZGUsIF9fbGFzdC5fTV9ub2RlKSk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgaW5zZXJ0KF9fcG9zLCBfX2ZpcnN0LCBfX2xhc3QpOworICAgICAgICBfX3guZXJhc2UoX19maXJzdCwgX19sYXN0KTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworcHVibGljOgorICB2b2lkIHJldmVyc2UoKSB7CisgICAgaWYgKHRoaXMtPl9NX2hlYWQuX01fZGF0YS5fTV9uZXh0KQorICAgICAgdGhpcy0+X01faGVhZC5fTV9kYXRhLl9NX25leHQgPSBfU1RMUF9QUklWIF9TbF9nbG9iYWxfaW5zdDo6X19yZXZlcnNlKHRoaXMtPl9NX2hlYWQuX01fZGF0YS5fTV9uZXh0KTsKKyAgfQorCisgIHZvaWQgcmVtb3ZlKGNvbnN0IF9UcCYgX192YWwpOworCisgIHZvaWQgdW5pcXVlKCkgeyBfU1RMUF9QUklWIF9TbGlzdF91bmlxdWUoKnRoaXMsIGVxdWFsX3RvPHZhbHVlX3R5cGU+KCkpOyB9CisgIHZvaWQgbWVyZ2UoX1NlbGYmIF9feCkgeyBfU1RMUF9QUklWIF9TbGlzdF9tZXJnZSgqdGhpcywgX194LCBsZXNzPHZhbHVlX3R5cGU+KCkpOyB9CisgIHZvaWQgc29ydCgpIHsgX1NUTFBfUFJJViBfU2xpc3Rfc29ydCgqdGhpcywgbGVzczx2YWx1ZV90eXBlPigpKTsgfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9QcmVkaWNhdGU+CisgIHZvaWQgcmVtb3ZlX2lmKF9QcmVkaWNhdGUgX19wcmVkKSB7CisgICAgX05vZGVfYmFzZSogX19jdXIgPSAmdGhpcy0+X01faGVhZC5fTV9kYXRhOworICAgIHdoaWxlIChfX2N1ci0+X01fbmV4dCkgeworICAgICAgaWYgKF9fcHJlZChfX1NUQVRJQ19DQVNUKF9Ob2RlKiwgX19jdXItPl9NX25leHQpLT5fTV9kYXRhKSkKKyAgICAgICAgdGhpcy0+X01fZXJhc2VfYWZ0ZXIoX19jdXIpOworICAgICAgZWxzZQorICAgICAgICBfX2N1ciA9IF9fY3VyLT5fTV9uZXh0OworICAgIH0KKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfQmluYXJ5UHJlZGljYXRlPgorICB2b2lkIHVuaXF1ZShfQmluYXJ5UHJlZGljYXRlIF9fcHJlZCkKKyAgeyBfU1RMUF9QUklWIF9TbGlzdF91bmlxdWUoKnRoaXMsIF9fcHJlZCk7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1N0cmljdFdlYWtPcmRlcmluZz4KKyAgdm9pZCBtZXJnZShfU2VsZiYgX194LCBfU3RyaWN0V2Vha09yZGVyaW5nIF9fY29tcCkKKyAgeyBfU1RMUF9QUklWIF9TbGlzdF9tZXJnZSgqdGhpcywgX194LCBfX2NvbXApOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9TdHJpY3RXZWFrT3JkZXJpbmc+CisgIHZvaWQgc29ydChfU3RyaWN0V2Vha09yZGVyaW5nIF9fY29tcCkKKyAgeyBfU1RMUF9QUklWIF9TbGlzdF9zb3J0KCp0aGlzLCBfX2NvbXApOyB9CisjZW5kaWYgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworfTsKKworI2lmIGRlZmluZWQgKHNsaXN0KQorIyAgdW5kZWYgc2xpc3QKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorI2VuZGlmCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2lmICFkZWZpbmVkIChfU1RMUF9MSU5LX1RJTUVfSU5TVEFOVElBVElPTikKKyMgIGluY2x1ZGUgPHN0bC9fc2xpc3QuYz4KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BUUl9TUEVDSUFMSVpBVElPTlMpCisjICBpbmNsdWRlIDxzdGwvcG9pbnRlcnMvX3NsaXN0Lmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHKQorIyAgaW5jbHVkZSA8c3RsL2RlYnVnL19zbGlzdC5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgYm9vbCAgX1NUTFBfQ0FMTAorb3BlcmF0b3IgPT0gKGNvbnN0IHNsaXN0PF9UcCxfQWxsb2M+JiBfU0wxLCBjb25zdCBzbGlzdDxfVHAsX0FsbG9jPiYgX1NMMikgeworICB0eXBlZGVmIHR5cGVuYW1lIHNsaXN0PF9UcCxfQWxsb2M+Ojpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKyAgY29uc3RfaXRlcmF0b3IgX19lbmQxID0gX1NMMS5lbmQoKTsKKyAgY29uc3RfaXRlcmF0b3IgX19lbmQyID0gX1NMMi5lbmQoKTsKKworICBjb25zdF9pdGVyYXRvciBfX2kxID0gX1NMMS5iZWdpbigpOworICBjb25zdF9pdGVyYXRvciBfX2kyID0gX1NMMi5iZWdpbigpOworICB3aGlsZSAoX19pMSAhPSBfX2VuZDEgJiYgX19pMiAhPSBfX2VuZDIgJiYgKl9faTEgPT0gKl9faTIpIHsKKyAgICArK19faTE7CisgICAgKytfX2kyOworICB9CisgIHJldHVybiBfX2kxID09IF9fZW5kMSAmJiBfX2kyID09IF9fZW5kMjsKK30KKworI2RlZmluZSBfU1RMUF9FUVVBTF9PUEVSQVRPUl9TUEVDSUFMSVpFRAorI2RlZmluZSBfU1RMUF9URU1QTEFURV9IRUFERVIgICAgdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgorI2RlZmluZSBfU1RMUF9URU1QTEFURV9DT05UQUlORVIgc2xpc3Q8X1RwLCBfQWxsb2M+CisjaW5jbHVkZSA8c3RsL19yZWxvcHNfY29udC5oPgorI3VuZGVmIF9TVExQX1RFTVBMQVRFX0NPTlRBSU5FUgorI3VuZGVmIF9TVExQX1RFTVBMQVRFX0hFQURFUgorI3VuZGVmIF9TVExQX0VRVUFMX09QRVJBVE9SX1NQRUNJQUxJWkVECisKKyNpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQorIyAgaWYgIWRlZmluZWQgKF9TVExQX05PX01PVkVfU0VNQU5USUMpCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CitzdHJ1Y3QgX19tb3ZlX3RyYWl0czxzbGlzdDxfVHAsIF9BbGxvYz4gPiB7CisgIHR5cGVkZWYgX190cnVlX3R5cGUgaW1wbGVtZW50ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgX19tb3ZlX3RyYWl0czxfQWxsb2M+Ojpjb21wbGV0ZSBjb21wbGV0ZTsKK307CisjICBlbmRpZgorCisvLyBTcGVjaWFsaXphdGlvbiBvZiBpbnNlcnRfaXRlcmF0b3Igc28gdGhhdCBpbnNlcnRpb25zIHdpbGwgYmUgY29uc3RhbnQKKy8vIHRpbWUgcmF0aGVyIHRoYW4gbGluZWFyIHRpbWUuCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CitjbGFzcyBpbnNlcnRfaXRlcmF0b3I8c2xpc3Q8X1RwLCBfQWxsb2M+ID4geworcHJvdGVjdGVkOgorICB0eXBlZGVmIHNsaXN0PF9UcCwgX0FsbG9jPiBfQ29udGFpbmVyOworICBfQ29udGFpbmVyKiBfTV9jb250YWluZXI7CisgIHR5cGVuYW1lIF9Db250YWluZXI6Oml0ZXJhdG9yIF9NX2l0ZXI7CitwdWJsaWM6CisgIHR5cGVkZWYgX0NvbnRhaW5lciAgICAgICAgICBjb250YWluZXJfdHlwZTsKKyAgdHlwZWRlZiBvdXRwdXRfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisKKyAgaW5zZXJ0X2l0ZXJhdG9yKF9Db250YWluZXImIF9feCwgdHlwZW5hbWUgX0NvbnRhaW5lcjo6aXRlcmF0b3IgX19pKQorICAgIDogX01fY29udGFpbmVyKCZfX3gpIHsKKyAgICBpZiAoX19pID09IF9feC5iZWdpbigpKQorICAgICAgX01faXRlciA9IF9feC5iZWZvcmVfYmVnaW4oKTsKKyAgICBlbHNlCisgICAgICBfTV9pdGVyID0gX194LnByZXZpb3VzKF9faSk7CisgIH0KKworICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mCisgIG9wZXJhdG9yID0gKGNvbnN0IHR5cGVuYW1lIF9Db250YWluZXI6OnZhbHVlX3R5cGUmIF9fdmFsKSB7CisgICAgX01faXRlciA9IF9NX2NvbnRhaW5lci0+aW5zZXJ0X2FmdGVyKF9NX2l0ZXIsIF9fdmFsKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mIG9wZXJhdG9yKigpIHsgcmV0dXJuICp0aGlzOyB9CisgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYgb3BlcmF0b3IrKygpIHsgcmV0dXJuICp0aGlzOyB9CisgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYgb3BlcmF0b3IrKyhpbnQpIHsgcmV0dXJuICp0aGlzOyB9Cit9OworI2VuZGlmIC8qIF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04gKi8KKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfU0xJU1RfSCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RsL19zbGlzdF9iYXNlLmMgYi9zdGxwb3J0L3N0bC9fc2xpc3RfYmFzZS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzdGwvX3NsaXN0X2Jhc2UuYwpyZW5hbWUgdG8gc3RscG9ydC9zdGwvX3NsaXN0X2Jhc2UuYwpkaWZmIC0tZ2l0IGEvc3RsL19zbGlzdF9iYXNlLmggYi9zdGxwb3J0L3N0bC9fc2xpc3RfYmFzZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzdGwvX3NsaXN0X2Jhc2UuaApyZW5hbWUgdG8gc3RscG9ydC9zdGwvX3NsaXN0X2Jhc2UuaApkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdGwvX3NwYXJjX2F0b21pYy5oIGIvc3RscG9ydC9zdGwvX3NwYXJjX2F0b21pYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxY2MwYWQKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9fc3BhcmNfYXRvbWljLmgKQEAgLTAsMCArMSw2MSBAQAorCisvLyBDdXJyZW50bHksIFNVTiBDQyByZXF1aXJlcyBvYmplY3QgZmlsZQorCisjaWYgZGVmaW5lZCAoX19HTlVDX18pCisKKy8qCisqKiAgaW50IF9TVExQX2F0b21pY19leGNoYW5nZSAoX19zdGxfYXRvbWljX3QgKnB2YWx1ZSwgX19zdGxfYXRvbWljX3QgdmFsdWUpCisqLworCisjICBpZiBkZWZpbmVkKF9fc3BhcmNfdjlfXykgfHwgZGVmaW5lZCAoX19zcGFyY3Y5KSAKKworIyAgICBpZmRlZiBfX2FyY2g2NF9fCisKKyMgICAgICBkZWZpbmUgX1NUTFBfRVhDSF9BU00gIGFzbSB2b2xhdGlsZSAoImNhc3ggWyUzXSwgJTQsICUwIDsgIG1lbWJhciAgI0xvYWRMb2FkIHwgI0xvYWRTdG9yZSAiIDogXAorICAgICAgICAgICAgICAgICAgICI9ciIgKF9MX3ZhbHVlMiksICI9bSIgKCpfTF9wdmFsdWUxKSA6IFwKKyAgICAgICAgICAgICAgICAgICAibSIgKCpfTF9wdmFsdWUxKSwgInIiIChfTF9wdmFsdWUxKSwgInIiIChfTF92YWx1ZTEpLCAiMCIgKF9MX3ZhbHVlMikgKQorCisjICAgIGVsc2UgLyogX19hcmNoNjRfXyAqLworCisjICAgICAgZGVmaW5lIF9TVExQX0VYQ0hfQVNNICBhc20gdm9sYXRpbGUgKCJjYXMgWyUzXSwgJTQsICUwIiA6IFwKKyAgICAgICAgICAgICAgICAgICAiPXIiIChfTF92YWx1ZTIpLCAiPW0iICgqX0xfcHZhbHVlMSkgOiBcCisgICAgICAgICAgICAgICAgICAgIm0iICgqX0xfcHZhbHVlMSksICJyIiAoX0xfcHZhbHVlMSksICJyIiAoX0xfdmFsdWUxKSwgIjAiIChfTF92YWx1ZTIpICkKKyMgICAgZW5kaWYKKworIyAgZWxzZSAvKiBfX3NwYXJjX3Y5X18gKi8KKworIyAgICBkZWZpbmUgX1NUTFBfRVhDSF9BU00gYXNtIHZvbGF0aWxlICgic3dhcCBbJTNdLCAlMCAiIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIj1yIiAoX0xfdmFsdWUyKSwgIj1tIiAoKl9MX3B2YWx1ZTEpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm0iICgqX0xfcHZhbHVlMSksICJyIiAoX0xfcHZhbHVlMSksICAiMCIgKF9MX3ZhbHVlMikgKQorIyAgZW5kaWYKKworCisjICBkZWZpbmUgX1NUTFBfQVRPTUlDX0VYQ0hBTkdFKF9fcHZhbHVlMSwgX192YWx1ZTIpIFwKKyAoeyAgcmVnaXN0ZXIgdm9sYXRpbGUgX19zdGxfYXRvbWljX3QgKl9MX3B2YWx1ZTEgPSBfX3B2YWx1ZTE7IFwKKyAgICAgcmVnaXN0ZXIgX19zdGxfYXRvbWljX3QgX0xfdmFsdWUxLCBfTF92YWx1ZTIgPSAgX192YWx1ZTIgOyBcCisgICAgIGRvIHsgX0xfdmFsdWUxID0gKl9MX3B2YWx1ZTE7IF9TVExQX0VYQ0hfQVNNOyB9IHdoaWxlICggX0xfdmFsdWUxICE9IF9MX3ZhbHVlMiApIDsgXAorICAgICBfTF92YWx1ZTE7IH0pCisKKyMgIGRlZmluZSBfU1RMUF9BVE9NSUNfSU5DUkVNRU5UKF9fcHZhbHVlMSkgXAorICh7ICByZWdpc3RlciB2b2xhdGlsZSBfX3N0bF9hdG9taWNfdCAqX0xfcHZhbHVlMSA9IF9fcHZhbHVlMTsgXAorICAgIHJlZ2lzdGVyIF9fc3RsX2F0b21pY190IF9MX3ZhbHVlMSwgX0xfdmFsdWUyOyBcCisgICAgZG8geyBfTF92YWx1ZTEgPSAqX0xfcHZhbHVlMTsgIF9MX3ZhbHVlMiA9IF9MX3ZhbHVlMSsxOyBfU1RMUF9FWENIX0FTTTsgfSB3aGlsZSAoIF9MX3ZhbHVlMSAhPSBfTF92YWx1ZTIgKSA7IFwKKyAgICAoX0xfdmFsdWUyICsgMSk7IH0pCisKKyMgIGRlZmluZSBfU1RMUF9BVE9NSUNfREVDUkVNRU5UKF9fcHZhbHVlMSkgXAorICh7ICByZWdpc3RlciB2b2xhdGlsZSBfX3N0bF9hdG9taWNfdCAqX0xfcHZhbHVlMSA9IF9fcHZhbHVlMTsgXAorICAgIHJlZ2lzdGVyIF9fc3RsX2F0b21pY190IF9MX3ZhbHVlMSwgX0xfdmFsdWUyOyBcCisgICAgZG8geyBfTF92YWx1ZTEgPSAqX0xfcHZhbHVlMTsgIF9MX3ZhbHVlMiA9IF9MX3ZhbHVlMS0xOyBfU1RMUF9FWENIX0FTTTsgfSB3aGlsZSAoIF9MX3ZhbHVlMSAhPSBfTF92YWx1ZTIgKSA7IFwKKyAgICAoX0xfdmFsdWUyIC0gMSk7IH0pCisKKyMgIGVsaWYgISBkZWZpbmVkIChfU1RMUF9OT19FWFRFUk5fSU5MSU5FKQorCitleHRlcm4gIkMiIF9fc3RsX2F0b21pY190IF9TVExQX2F0b21pY19leGNoYW5nZShfX3N0bF9hdG9taWNfdCAqIF9feCwgX19zdGxfYXRvbWljX3QgX192KTsKK2V4dGVybiAiQyIgdm9pZCBfU1RMUF9hdG9taWNfZGVjcmVtZW50KF9fc3RsX2F0b21pY190KiBpKTsKK2V4dGVybiAiQyIgdm9pZCBfU1RMUF9hdG9taWNfaW5jcmVtZW50KF9fc3RsX2F0b21pY190KiBpKTsKKworIyAgICBkZWZpbmUgX1NUTFBfQVRPTUlDX0lOQ1JFTUVOVChfX3gpICAgICAgICAgICBfU1RMUF9hdG9taWNfaW5jcmVtZW50KChfX3N0bF9hdG9taWNfdCopX194KQorIyAgICBkZWZpbmUgX1NUTFBfQVRPTUlDX0RFQ1JFTUVOVChfX3gpICAgICAgICAgICBfU1RMUF9hdG9taWNfZGVjcmVtZW50KChfX3N0bF9hdG9taWNfdCopX194KQorIyAgICBkZWZpbmUgX1NUTFBfQVRPTUlDX0VYQ0hBTkdFKF9feCwgX195KSAgICAgICBfU1RMUF9hdG9taWNfZXhjaGFuZ2UoKF9fc3RsX2F0b21pY190KilfX3gsIChfX3N0bF9hdG9taWNfdClfX3kpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdGwvX3NzdHJlYW0uYyBiL3N0bHBvcnQvc3RsL19zc3RyZWFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY1ODUzNQotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc3RsL19zc3RyZWFtLmMKQEAgLTAsMCArMSw0NjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfU1NUUkVBTV9DCisjZGVmaW5lIF9TVExQX1NTVFJFQU1fQworCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX1NTVFJFQU0KKyMgIGluY2x1ZGUgPHN0bC9fc3N0cmVhbS5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkICggX1NUTFBfTkVTVEVEX1RZUEVfUEFSQU1fQlVHICkKKy8vIG5vIHdpbnRfdCBpcyBzdXBwb3J0ZWQgZm9yIHRoaXMgbW9kZQorIyAgZGVmaW5lIF9fQlNCX2ludF90eXBlX18gaW50CisjICBkZWZpbmUgX19CU0JfcG9zX3R5cGVfXyBzdHJlYW1wb3MKKyNlbHNlCisjICBkZWZpbmUgX19CU0JfaW50X3R5cGVfXyBfU1RMUF9UWVBFTkFNRV9PTl9SRVRVUk5fVFlQRSBiYXNpY19zdHJpbmdidWY8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjppbnRfdHlwZQorIyAgZGVmaW5lIF9fQlNCX3Bvc190eXBlX18gX1NUTFBfVFlQRU5BTUVfT05fUkVUVVJOX1RZUEUgYmFzaWNfc3RyaW5nYnVmPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6cG9zX3R5cGUKKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBOb24taW5saW5lIHN0cmluZ2J1ZiBtZW1iZXIgZnVuY3Rpb25zLgorCisvLyBDb25zdHJ1Y3RvcnMuICBOb3RlIHRoYXQgdGhlIGJhc2UgY2xhc3MgY29uc3RydWN0b3Igc2V0cyBhbGwgb2YgdGhlCisvLyBnZXQgYW5kIGFyZWEgcG9pbnRlcnMgdG8gbnVsbC4KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorYmFzaWNfc3RyaW5nYnVmPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPgorICA6OmJhc2ljX3N0cmluZ2J1Zihpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlKQorICAgIDogYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4oKSwgX01fbW9kZShfX21vZGUpLCBfTV9zdHIoKQore30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorYmFzaWNfc3RyaW5nYnVmPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPgorICA6OmJhc2ljX3N0cmluZ2J1Zihjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX3MsIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUpCisgICAgOiBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPigpLCBfTV9tb2RlKF9fbW9kZSksIF9NX3N0cihfX3MpCit7CisgIF9NX3NldF9wdHJzKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK2Jhc2ljX3N0cmluZ2J1ZjxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46On5iYXNpY19zdHJpbmdidWYoKQore30KKworLy8gU2V0IHRoZSB1bmRlcmx5aW5nIHN0cmluZyB0byBhIG5ldyB2YWx1ZS4KK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK3ZvaWQKK2Jhc2ljX3N0cmluZ2J1ZjxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OnN0cihjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX3MpCit7CisgIF9NX3N0ciA9IF9fczsKKyAgX01fc2V0X3B0cnMoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgordm9pZAorYmFzaWNfc3RyaW5nYnVmPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6X01fc2V0X3B0cnMoKQoreworICBfQ2hhclQqIF9fZGF0YV9wdHIgPSBfU19zdGFydChfTV9zdHIpOworICBfQ2hhclQqIF9fZGF0YV9lbmQgPSBfU19maW5pc2goX01fc3RyKTsKKyAgLy8gVGhlIGluaXRpYWwgcmVhZCBwb3NpdGlvbiBpcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJpbmcuCisgIGlmIChfTV9tb2RlICYgaW9zX2Jhc2U6OmluKSB7CisgICAgdGhpcy0+c2V0ZyhfX2RhdGFfcHRyLCAoX01fbW9kZSAmIGlvc19iYXNlOjphdGUpID8gX19kYXRhX2VuZCA6IF9fZGF0YV9wdHIsIF9fZGF0YV9lbmQpOworICB9CisKKyAgLy8gVGhlIGluaXRpYWwgd3JpdGUgcG9zaXRpb24gaXMgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyaW5nLgorICBpZiAoX01fbW9kZSAmIGlvc19iYXNlOjpvdXQpIHsKKyAgICBpZiAoIF9NX21vZGUgJiAoaW9zX2Jhc2U6OmFwcCB8IGlvc19iYXNlOjphdGUpICkgeworICAgICAgdGhpcy0+c2V0cCggX19kYXRhX2VuZCwgX19kYXRhX2VuZCApOworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLT5zZXRwKCBfX2RhdGFfcHRyLCBfX2RhdGFfZW5kICk7CisgICAgICB0aGlzLT5wYnVtcCgoaW50KV9NX3N0ci5zaXplKCkpOyAvLyBpbml0aWFsIHdyaXRlIHBvc2l0aW9uLCBpZiB3ZSBpbml0aWFsaXplZCB3aXRoIHN0cmluZyAKKyAgICB9CisgICAgLy8gdGhpcy0+c2V0cCgoX01fbW9kZSAmIChpb3NfYmFzZTo6YXBwIHwgaW9zX2Jhc2U6OmF0ZSkpPyBfX2RhdGFfZW5kIDogX19kYXRhX3B0ciwgX19kYXRhX2VuZCk7CisgIH0KK30KKworLy8gUHJlY29uZGl0aW9uOiBncHRyKCkgPj0gZWdwdHIoKS4gIFJldHVybnMgYSBjaGFyYWN0ZXIsIGlmIG9uZSBpcyBhdmFpbGFibGUuCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitfX0JTQl9pbnRfdHlwZV9fCitiYXNpY19zdHJpbmdidWY8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+Ojp1bmRlcmZsb3coKSB7CisgIHJldHVybiB0aGlzLT5ncHRyKCkgIT0gdGhpcy0+ZWdwdHIoKQorICAgID8gX1RyYWl0czo6dG9faW50X3R5cGUoKnRoaXMtPmdwdHIoKSkKKyAgICA6IF9UcmFpdHM6OmVvZigpOworfQorCisvLyBQcmVjb25kaXRpb246IGdwdHIoKSA+PSBlZ3B0cigpLgordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorX19CU0JfaW50X3R5cGVfXworYmFzaWNfc3RyaW5nYnVmPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6dWZsb3coKSB7CisgIGlmICh0aGlzLT5ncHRyKCkgIT0gdGhpcy0+ZWdwdHIoKSkgeworICAgIGludF90eXBlIF9fYyA9IF9UcmFpdHM6OnRvX2ludF90eXBlKCp0aGlzLT5ncHRyKCkpOworICAgIHRoaXMtPmdidW1wKDEpOworICAgIHJldHVybiBfX2M7CisgIH0KKyAgZWxzZQorICAgIHJldHVybiBfVHJhaXRzOjplb2YoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorX19CU0JfaW50X3R5cGVfXworYmFzaWNfc3RyaW5nYnVmPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6cGJhY2tmYWlsKGludF90eXBlIF9fYykgeworICBpZiAodGhpcy0+Z3B0cigpICE9IHRoaXMtPmViYWNrKCkpIHsKKyAgICBpZiAoIV9UcmFpdHM6OmVxX2ludF90eXBlKF9fYywgX1RyYWl0czo6ZW9mKCkpKSB7CisgICAgICBpZiAoX1RyYWl0czo6ZXEoX1RyYWl0czo6dG9fY2hhcl90eXBlKF9fYyksIHRoaXMtPmdwdHIoKVstMV0pKSB7CisgICAgICAgIHRoaXMtPmdidW1wKC0xKTsKKyAgICAgICAgcmV0dXJuIF9fYzsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKF9NX21vZGUgJiBpb3NfYmFzZTo6b3V0KSB7CisgICAgICAgIHRoaXMtPmdidW1wKC0xKTsKKyAgICAgICAgKnRoaXMtPmdwdHIoKSA9IF9UcmFpdHM6OnRvX2NoYXJfdHlwZShfX2MpOworICAgICAgICByZXR1cm4gX19jOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICByZXR1cm4gX1RyYWl0czo6ZW9mKCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgdGhpcy0+Z2J1bXAoLTEpOworICAgICAgcmV0dXJuIF9UcmFpdHM6Om5vdF9lb2YoX19jKTsKKyAgICB9CisgIH0KKyAgZWxzZQorICAgIHJldHVybiBfVHJhaXRzOjplb2YoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorX19CU0JfaW50X3R5cGVfXyBiYXNpY19zdHJpbmdidWY8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjpvdmVyZmxvdyhpbnRfdHlwZSBfX2MpCit7CisgIGlmICghX1RyYWl0czo6ZXFfaW50X3R5cGUoX19jLCBfVHJhaXRzOjplb2YoKSkpIHsKKyAgICBpZiAoX01fbW9kZSAmIGlvc19iYXNlOjpvdXQpIHsKKyAgICAgIGlmICggdGhpcy0+cHB0cigpIDwgdGhpcy0+ZXBwdHIoKSApIHsgLy8ganVzdCBwdXQgYmFjayBpbiBhbnkgY2FzZQorICAgICAgICBfTV9zdHIucHVzaF9iYWNrKCBfVHJhaXRzOjp0b19jaGFyX3R5cGUoX19jKSApOworICAgICAgICB0aGlzLT5wYnVtcCgxKTsKKyAgICAgIH0gZWxzZSBpZiAoIF9NX21vZGUgJiBpb3NfYmFzZTo6aW4gKSB7CisgICAgICAgIHB0cmRpZmZfdCBfX29mZnNldCA9IHRoaXMtPmdwdHIoKSAtIHRoaXMtPmViYWNrKCk7CisgICAgICAgIF9NX3N0ci5wdXNoX2JhY2soX1RyYWl0czo6dG9fY2hhcl90eXBlKF9fYykpOworICAgICAgICBfQ2hhclQqIF9fZGF0YV9wdHIgPSBfU19zdGFydChfTV9zdHIpOworICAgICAgICB0aGlzLT5zZXRnKF9fZGF0YV9wdHIsIF9fZGF0YV9wdHIgKyBfX29mZnNldCwgX1NfZmluaXNoKF9NX3N0cikpOworICAgICAgICB0aGlzLT5zZXRwKF9fZGF0YV9wdHIsIF9TX2ZpbmlzaChfTV9zdHIpKTsKKyAgICAgICAgdGhpcy0+cGJ1bXAoKGludClfTV9zdHIuc2l6ZSgpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIF9NX3N0ci5wdXNoX2JhY2soIF9UcmFpdHM6OnRvX2NoYXJfdHlwZShfX2MpICk7CisgICAgICAgIHRoaXMtPnNldHAoX1Nfc3RhcnQoX01fc3RyKSwgX1NfZmluaXNoKF9NX3N0cikpOworICAgICAgICB0aGlzLT5wYnVtcCgoaW50KV9NX3N0ci5zaXplKCkpOworICAgICAgfQorICAgICAgcmV0dXJuIF9fYzsKKyAgICB9CisgICAgcmV0dXJuIF9UcmFpdHM6OmVvZigpOyAvLyBPdmVyZmxvdyBhbHdheXMgZmFpbHMgaWYgaXQncyByZWFkLW9ubHkKKyAgfQorICByZXR1cm4gX1RyYWl0czo6bm90X2VvZihfX2MpOyAvLyBfX2MgaXMgRU9GLCBzbyB3ZSBkb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK3N0cmVhbXNpemUKK2Jhc2ljX3N0cmluZ2J1ZjxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OnhzcHV0bihjb25zdCBjaGFyX3R5cGUqIF9fcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1zaXplIF9fbikgeworICBzdHJlYW1zaXplIF9fbndyaXR0ZW4gPSAwOworCisgIGlmICgoX01fbW9kZSAmIGlvc19iYXNlOjpvdXQpICYmIF9fbiA+IDApIHsKKyAgICAvLyBJZiB0aGUgcHV0IHBvaW50ZXIgaXMgc29tZXdoZXJlIGluIHRoZSBtaWRkbGUgb2YgdGhlIHN0cmluZywKKyAgICAvLyB0aGVuIG92ZXJ3cml0ZSBpbnN0ZWFkIG9mIGFwcGVuZC4KKyAgICBpZiAoICFfTV9zdHIuZW1wdHkoKSAmJiB0aGlzLT5wYmFzZSgpID09IF9TX3N0YXJ0KF9NX3N0cikpIHsKKyAgICAgIHB0cmRpZmZfdCBfX2F2YWlsID0gX1NfZmluaXNoKF9NX3N0cikgLSB0aGlzLT5wcHRyKCk7CisgICAgICBpZiAoX19hdmFpbCA+IF9fbikgeworICAgICAgICBfVHJhaXRzOjpjb3B5KHRoaXMtPnBwdHIoKSwgX19zLCBfX1NUQVRJQ19DQVNUKHNpemVfdCwgX19uKSk7CisgICAgICAgIHRoaXMtPnBidW1wKChpbnQpX19uKTsKKyAgICAgICAgcmV0dXJuIF9fbjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIF9UcmFpdHM6OmNvcHkodGhpcy0+cHB0cigpLCBfX3MsIF9fYXZhaWwpOworICAgICAgICBfX253cml0dGVuICs9IF9fYXZhaWw7CisgICAgICAgIF9fbiAtPSBfX2F2YWlsOworICAgICAgICBfX3MgKz0gX19hdmFpbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBBdCB0aGlzIHBvaW50IHdlIGtub3cgd2UncmUgYXBwZW5kaW5nLgorICAgIF9DaGFyVCogX19kYXRhX3B0cjsKKyAgICBpZiAoX01fbW9kZSAmIGlvc19iYXNlOjppbikgeworICAgICAgcHRyZGlmZl90IF9fZ2V0X29mZnNldCA9IHRoaXMtPmdwdHIoKSAtIHRoaXMtPmViYWNrKCk7CisgICAgICBfTV9zdHIuYXBwZW5kKF9fcywgX19zICsgX19TVEFUSUNfQ0FTVChwdHJkaWZmX3QsIF9fbikpOworICAgICAgX19kYXRhX3B0ciA9IF9TX3N0YXJ0KF9NX3N0cik7CisgICAgICB0aGlzLT5zZXRnKF9fZGF0YV9wdHIsIF9fZGF0YV9wdHIgKyBfX2dldF9vZmZzZXQsIF9TX2ZpbmlzaChfTV9zdHIpKTsKKyAgICB9IGVsc2UgeworICAgICAgX01fc3RyLmFwcGVuZChfX3MsIF9fcyArIF9fU1RBVElDX0NBU1QocHRyZGlmZl90LCBfX24pKTsKKyAgICAgIF9fZGF0YV9wdHIgPSBfU19zdGFydChfTV9zdHIpOworICAgIH0KKworICAgIHRoaXMtPnNldHAoX19kYXRhX3B0ciwgX1NfZmluaXNoKF9NX3N0cikpOworICAgIHRoaXMtPnBidW1wKChpbnQpX01fc3RyLnNpemUoKSk7CisgICAgX19ud3JpdHRlbiArPSBfX247CisgIH0KKworICByZXR1cm4gX19ud3JpdHRlbjsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorc3RyZWFtc2l6ZQorYmFzaWNfc3RyaW5nYnVmPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6X01feHNwdXRuYyhjaGFyX3R5cGUgX19jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1zaXplIF9fbikgeworICBzdHJlYW1zaXplIF9fbndyaXR0ZW4gPSAwOworCisgIGlmICgoX01fbW9kZSAmIGlvc19iYXNlOjpvdXQpICYmIF9fbiA+IDApIHsKKyAgICAvLyBJZiB0aGUgcHV0IHBvaW50ZXIgaXMgc29tZXdoZXJlIGluIHRoZSBtaWRkbGUgb2YgdGhlIHN0cmluZywKKyAgICAvLyB0aGVuIG92ZXJ3cml0ZSBpbnN0ZWFkIG9mIGFwcGVuZC4KKyAgICBpZiAodGhpcy0+cGJhc2UoKSA9PSBfU19zdGFydChfTV9zdHIpKSB7CisgICAgICBwdHJkaWZmX3QgX19hdmFpbCA9IF9TX2ZpbmlzaChfTV9zdHIpIC0gdGhpcy0+cHB0cigpOworICAgICAgaWYgKF9fYXZhaWwgPiBfX24pIHsKKyAgICAgICAgX1RyYWl0czo6YXNzaWduKHRoaXMtPnBwdHIoKSwgX19TVEFUSUNfQ0FTVChzaXplX3QsIF9fbiksIF9fYyk7CisgICAgICAgIHRoaXMtPnBidW1wKF9fU1RBVElDX0NBU1QoaW50LCBfX24pKTsKKyAgICAgICAgcmV0dXJuIF9fbjsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBfVHJhaXRzOjphc3NpZ24odGhpcy0+cHB0cigpLCBfX2F2YWlsLCBfX2MpOworICAgICAgICBfX253cml0dGVuICs9IF9fYXZhaWw7CisgICAgICAgIF9fbiAtPSBfX2F2YWlsOworICAgICAgfQorICAgIH0KKworICAgIC8vIEF0IHRoaXMgcG9pbnQgd2Uga25vdyB3ZSdyZSBhcHBlbmRpbmcuCisgICAgc2l6ZV90IF9fYXBwX3NpemUgPSBzaXplb2Yoc3RyZWFtc2l6ZSkgPiBzaXplb2Yoc2l6ZV90KSA/IF9fU1RBVElDX0NBU1Qoc2l6ZV90LCAobWluKShfX24sIF9fU1RBVElDX0NBU1Qoc3RyZWFtc2l6ZSwgX01fc3RyLm1heF9zaXplKCkpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX19TVEFUSUNfQ0FTVChzaXplX3QsIF9fbik7CisgICAgX0NoYXJUKiBfX2RhdGFfcHRyOworICAgIGlmICh0aGlzLT5fTV9tb2RlICYgaW9zX2Jhc2U6OmluKSB7CisgICAgICBwdHJkaWZmX3QgX19nZXRfb2Zmc2V0ID0gdGhpcy0+Z3B0cigpIC0gdGhpcy0+ZWJhY2soKTsKKyAgICAgIF9NX3N0ci5hcHBlbmQoX19hcHBfc2l6ZSwgX19jKTsKKyAgICAgIF9fZGF0YV9wdHIgPSBfU19zdGFydChfTV9zdHIpOworICAgICAgdGhpcy0+c2V0ZyhfX2RhdGFfcHRyLCBfX2RhdGFfcHRyICsgX19nZXRfb2Zmc2V0LCBfU19maW5pc2goX01fc3RyKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIF9NX3N0ci5hcHBlbmQoX19hcHBfc2l6ZSwgX19jKTsKKyAgICAgIF9fZGF0YV9wdHIgPSBfU19zdGFydChfTV9zdHIpOworICAgIH0KKworICAgIHRoaXMtPnNldHAoX19kYXRhX3B0ciwgX1NfZmluaXNoKF9NX3N0cikpOworICAgIHRoaXMtPnBidW1wKChpbnQpX01fc3RyLnNpemUoKSk7CisgICAgX19ud3JpdHRlbiArPSBfX2FwcF9zaXplOworICB9CisKKyAgcmV0dXJuIF9fbndyaXR0ZW47Cit9CisKKy8vIEFjY29yZGluZyB0byB0aGUgQysrIHN0YW5kYXJkIHRoZSBlZmZlY3RzIG9mIHNldGJ1ZiBhcmUgaW1wbGVtZW50YXRpb24KKy8vIGRlZmluZWQsIGV4Y2VwdCB0aGF0IHNldGJ1ZigwLCAwKSBoYXMgbm8gZWZmZWN0LiAgSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiwKKy8vIHNldGJ1Zig8YW55dGhpbmc+LCBuKSwgZm9yIG4gPiAwLCBjYWxscyByZXNlcnZlKG4pIG9uIHRoZSB1bmRlcmx5aW5nCisvLyBzdHJpbmcuCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPioKK2Jhc2ljX3N0cmluZ2J1ZjxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OnNldGJ1ZihfQ2hhclQqLCBzdHJlYW1zaXplIF9fbikgeworICBpZiAoX19uID4gMCkgeworICAgIGJvb2wgX19kb19nZXRfYXJlYSA9IGZhbHNlOworICAgIGJvb2wgX19kb19wdXRfYXJlYSA9IGZhbHNlOworICAgIHB0cmRpZmZfdCBfX29mZmcgPSAwOworICAgIHB0cmRpZmZfdCBfX29mZnAgPSAwOworCisgICAgaWYgKHRoaXMtPnBiYXNlKCkgPT0gX1Nfc3RhcnQoX01fc3RyKSkgeworICAgICAgX19kb19wdXRfYXJlYSA9IHRydWU7CisgICAgICBfX29mZnAgPSB0aGlzLT5wcHRyKCkgLSB0aGlzLT5wYmFzZSgpOworICAgIH0KKworICAgIGlmICh0aGlzLT5lYmFjaygpID09IF9TX3N0YXJ0KF9NX3N0cikpIHsKKyAgICAgIF9fZG9fZ2V0X2FyZWEgPSB0cnVlOworICAgICAgX19vZmZnID0gdGhpcy0+Z3B0cigpIC0gdGhpcy0+ZWJhY2soKTsKKyAgICB9CisKKyAgICBfTV9zdHIucmVzZXJ2ZShzaXplb2Yoc3RyZWFtc2l6ZSkgPiBzaXplb2Yoc2l6ZV90KSA/IF9fU1RBVElDX0NBU1Qoc2l6ZV90LCAobWluKShfX24sIF9fU1RBVElDX0NBU1Qoc3RyZWFtc2l6ZSwgX01fc3RyLm1heF9zaXplKCkpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF9fU1RBVElDX0NBU1Qoc2l6ZV90LCBfX24pKTsKKworICAgIF9DaGFyVCogX19kYXRhX3B0ciA9IF9TX3N0YXJ0KF9NX3N0cik7CisKKyAgICBpZiAoX19kb19nZXRfYXJlYSkgeworICAgICAgdGhpcy0+c2V0ZyhfX2RhdGFfcHRyLCBfX2RhdGFfcHRyICsgX19vZmZnLCBfU19maW5pc2goX01fc3RyKSk7CisgICAgfQorCisgICAgaWYgKF9fZG9fcHV0X2FyZWEpIHsKKyAgICAgIHRoaXMtPnNldHAoX19kYXRhX3B0ciwgX1NfZmluaXNoKF9NX3N0cikpOworICAgICAgdGhpcy0+cGJ1bXAoKGludClfX29mZnApOworICAgIH0KKyAgfQorCisgIHJldHVybiB0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitfX0JTQl9wb3NfdHlwZV9fCitiYXNpY19zdHJpbmdidWY8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+CisgIDo6c2Vla29mZihvZmZfdHlwZSBfX29mZiwKKyAgICAgICAgICAgIGlvc19iYXNlOjpzZWVrZGlyIF9fZGlyLAorICAgICAgICAgICAgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSkgeworICBfX21vZGUgJj0gX01fbW9kZTsKKworICBib29sIF9faW1vZGUgID0gKF9fbW9kZSAmIGlvc19iYXNlOjppbikgIT0gMDsKKyAgYm9vbCBfX29tb2RlID0gKF9fbW9kZSAmIGlvc19iYXNlOjpvdXQpICE9IDA7CisKKyAgaWYgKCAhKF9faW1vZGUgfHwgX19vbW9kZSkgKQorICAgIHJldHVybiBwb3NfdHlwZShvZmZfdHlwZSgtMSkpOworCisgIGlmICggKF9faW1vZGUgJiYgKHRoaXMtPmdwdHIoKSA9PSAwKSkgfHwgKF9fb21vZGUgJiYgKHRoaXMtPnBwdHIoKSA9PSAwKSkgKQorICAgIHJldHVybiBwb3NfdHlwZShvZmZfdHlwZSgtMSkpOworCisgIHN0cmVhbW9mZiBfX25ld29mZjsKKyAgc3dpdGNoKF9fZGlyKSB7CisgICAgY2FzZSBpb3NfYmFzZTo6YmVnOgorICAgICAgX19uZXdvZmYgPSAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBpb3NfYmFzZTo6ZW5kOgorICAgICAgX19uZXdvZmYgPSBfTV9zdHIuc2l6ZSgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBpb3NfYmFzZTo6Y3VyOgorICAgICAgX19uZXdvZmYgPSBfX2ltb2RlID8gdGhpcy0+Z3B0cigpIC0gdGhpcy0+ZWJhY2soKSA6IHRoaXMtPnBwdHIoKSAtIHRoaXMtPnBiYXNlKCk7CisgICAgICBpZiAoIF9fb2ZmID09IDAgKSB7CisgICAgICAgIHJldHVybiBwb3NfdHlwZShfX25ld29mZik7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIHBvc190eXBlKG9mZl90eXBlKC0xKSk7CisgIH0KKworICBfX29mZiArPSBfX25ld29mZjsKKworICBpZiAoX19pbW9kZSkgeworICAgIHB0cmRpZmZfdCBfX24gPSB0aGlzLT5lZ3B0cigpIC0gdGhpcy0+ZWJhY2soKTsKKworICAgIGlmIChfX29mZiA8IDAgfHwgX19vZmYgPiBfX24pCisgICAgICByZXR1cm4gcG9zX3R5cGUob2ZmX3R5cGUoLTEpKTsKKyAgICB0aGlzLT5zZXRnKHRoaXMtPmViYWNrKCksIHRoaXMtPmViYWNrKCkgKyBfX1NUQVRJQ19DQVNUKHB0cmRpZmZfdCwgX19vZmYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+ZWJhY2soKSArIF9fU1RBVElDX0NBU1QocHRyZGlmZl90LCBfX24pKTsKKyAgfQorCisgIGlmIChfX29tb2RlKSB7CisgICAgcHRyZGlmZl90IF9fbiA9IHRoaXMtPmVwcHRyKCkgLSB0aGlzLT5wYmFzZSgpOworCisgICAgaWYgKF9fb2ZmIDwgMCB8fCBfX29mZiA+IF9fbikKKyAgICAgIHJldHVybiBwb3NfdHlwZShvZmZfdHlwZSgtMSkpOworICAgIHRoaXMtPnNldHAodGhpcy0+cGJhc2UoKSwgdGhpcy0+cGJhc2UoKSArIF9fbik7CisgICAgdGhpcy0+cGJ1bXAoKGludClfX29mZik7CisgIH0KKworICByZXR1cm4gcG9zX3R5cGUoX19vZmYpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitfX0JTQl9wb3NfdHlwZV9fCitiYXNpY19zdHJpbmdidWY8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+CisgIDo6c2Vla3Bvcyhwb3NfdHlwZSBfX3BvcywgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSkgeworICBfX21vZGUgJj0gX01fbW9kZTsKKworICBib29sIF9faW1vZGUgPSAoX19tb2RlICYgaW9zX2Jhc2U6OmluKSAhPSAwOworICBib29sIF9fb21vZGUgPSAoX19tb2RlICYgaW9zX2Jhc2U6Om91dCkgIT0gMDsKKworICBpZiAoICEoX19pbW9kZSB8fCBfX29tb2RlKSApCisgICAgcmV0dXJuIHBvc190eXBlKG9mZl90eXBlKC0xKSk7CisKKyAgaWYgKCAoX19pbW9kZSAmJiAodGhpcy0+Z3B0cigpID09IDApKSB8fCAoX19vbW9kZSAmJiAodGhpcy0+cHB0cigpID09IDApKSApCisgICAgcmV0dXJuIHBvc190eXBlKG9mZl90eXBlKC0xKSk7CisKKyAgY29uc3Qgb2ZmX3R5cGUgX19uID0gX19wb3MgLSBwb3NfdHlwZShvZmZfdHlwZSgwKSk7CisKKyAgaWYgKF9faW1vZGUpIHsKKyAgICBpZiAoX19uIDwgMCB8fCBfX24gPiB0aGlzLT5lZ3B0cigpIC0gdGhpcy0+ZWJhY2soKSkKKyAgICAgIHJldHVybiBwb3NfdHlwZShvZmZfdHlwZSgtMSkpOworICAgIHRoaXMtPnNldGcodGhpcy0+ZWJhY2soKSwgdGhpcy0+ZWJhY2soKSArIF9fU1RBVElDX0NBU1QocHRyZGlmZl90LCBfX24pLCB0aGlzLT5lZ3B0cigpKTsKKyAgfQorCisgIGlmIChfX29tb2RlKSB7CisgICAgaWYgKF9fbiA8IDAgfHwgc2l6ZV90KF9fbikgPiBfTV9zdHIuc2l6ZSgpKQorICAgICAgcmV0dXJuIHBvc190eXBlKG9mZl90eXBlKC0xKSk7CisKKyAgICB0aGlzLT5zZXRwKF9TX3N0YXJ0KF9NX3N0ciksIF9TX2ZpbmlzaChfTV9zdHIpKTsKKyAgICB0aGlzLT5wYnVtcCgoaW50KV9fbik7CisgIH0KKworICByZXR1cm4gX19wb3M7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTm9uLWlubGluZSBpc3RyaW5nc3RyZWFtIG1lbWJlciBmdW5jdGlvbnMuCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK2Jhc2ljX2lzdHJpbmdzdHJlYW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+CisgIDo6YmFzaWNfaXN0cmluZ3N0cmVhbShpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlKQorICAgIDogYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+KDApLAorICAgICAgX01fYnVmKF9fbW9kZSB8IGlvc19iYXNlOjppbikgeworICB0aGlzLT5pbml0KCZfTV9idWYpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitiYXNpY19pc3RyaW5nc3RyZWFtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPgorICA6OmJhc2ljX2lzdHJpbmdzdHJlYW0oY29uc3QgX1N0cmluZyYgX19zdHIsaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSkKKyAgICA6IGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPigwKSwKKyAgICAgIF9NX2J1ZihfX3N0ciwgX19tb2RlIHwgaW9zX2Jhc2U6OmluKSB7CisgIHRoaXMtPmluaXQoJl9NX2J1Zik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK2Jhc2ljX2lzdHJpbmdzdHJlYW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+Ojp+YmFzaWNfaXN0cmluZ3N0cmVhbSgpCit7fQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE5vbi1pbmxpbmUgb3N0cmluZ3N0cmVhbSBtZW1iZXIgZnVuY3Rpb25zLgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitiYXNpY19vc3RyaW5nc3RyZWFtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPgorICA6OmJhc2ljX29zdHJpbmdzdHJlYW0oaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSkKKyAgICA6IGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPigwKSwKKyAgICAgIF9NX2J1ZihfX21vZGUgfCBpb3NfYmFzZTo6b3V0KSB7CisgIHRoaXMtPmluaXQoJl9NX2J1Zik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK2Jhc2ljX29zdHJpbmdzdHJlYW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+CisgIDo6YmFzaWNfb3N0cmluZ3N0cmVhbShjb25zdCBfU3RyaW5nJiBfX3N0ciwgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSkKKyAgICA6IGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPigwKSwKKyAgICAgIF9NX2J1ZihfX3N0ciwgX19tb2RlIHwgaW9zX2Jhc2U6Om91dCkgeworICB0aGlzLT5pbml0KCZfTV9idWYpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitiYXNpY19vc3RyaW5nc3RyZWFtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6fmJhc2ljX29zdHJpbmdzdHJlYW0oKQore30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBOb24taW5saW5lIHN0cmluZ3N0cmVhbSBtZW1iZXIgZnVuY3Rpb25zLgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitiYXNpY19zdHJpbmdzdHJlYW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+CisgIDo6YmFzaWNfc3RyaW5nc3RyZWFtKGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUpCisgICAgOiBiYXNpY19pb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+KDApLCBfTV9idWYoX19tb2RlKSB7CisgICB0aGlzLT5pbml0KCZfTV9idWYpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitiYXNpY19zdHJpbmdzdHJlYW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+CisgIDo6YmFzaWNfc3RyaW5nc3RyZWFtKGNvbnN0IF9TdHJpbmcmIF9fc3RyLCBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlKQorICAgIDogYmFzaWNfaW9zdHJlYW08X0NoYXJULCBfVHJhaXRzPigwKSwgX01fYnVmKF9fc3RyLCBfX21vZGUpIHsKKyAgdGhpcy0+aW5pdCgmX01fYnVmKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorYmFzaWNfc3RyaW5nc3RyZWFtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6fmJhc2ljX3N0cmluZ3N0cmVhbSgpCit7fQorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyMgdW5kZWYgX19CU0JfaW50X3R5cGVfXworIyB1bmRlZiBfX0JTQl9wb3NfdHlwZV9fCisKKyNlbmRpZiAvKiBfU1RMUF9TU1RSRUFNX0MgKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL19zc3RyZWFtLmggYi9zdGxwb3J0L3N0bC9fc3N0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllOGQwMmEKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9fc3N0cmVhbS5oCkBAIC0wLDAgKzEsMjY2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisKKy8vIFRoaXMgaGVhZGVyIGRlZmluZXMgY2xhc3NlcyBiYXNpY19zdHJpbmdidWYsIGJhc2ljX2lzdHJpbmdzdHJlYW0sCisvLyBiYXNpY19vc3RyaW5nc3RyZWFtLCBhbmQgYmFzaWNfc3RyaW5nc3RyZWFtLiAgVGhlc2UgY2xhc3NlcworLy8gcmVwcmVzZW50IHN0cmVhbXNidWZzIGFuZCBzdHJlYW1zIHdob3NlIHNvdXJjZXMgb3IgZGVzdGluYXRpb25zIGFyZQorLy8gQysrIHN0cmluZ3MuCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfU1NUUkVBTQorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9TU1RSRUFNCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfU1RSRUFNQlVGCisjICBpbmNsdWRlIDxzdGwvX3N0cmVhbWJ1Zi5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfSVNUUkVBTQorIyAgaW5jbHVkZSA8c3RsL19pc3RyZWFtLmg+IC8vIEluY2x1ZGVzIDxvc3RyZWFtPiwgPGlvcz4sIDxpb3Nmd2Q+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9TVFJJTkdfSAorIyAgaW5jbHVkZSA8c3RsL19zdHJpbmcuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUaGlzIHZlcnNpb24gb2YgYmFzaWNfc3RyaW5nYnVmIHJlbGllcyBvbiB0aGUgaW50ZXJuYWwgZGV0YWlscyBvZgorLy8gYmFzaWNfc3RyaW5nLiAgSXQgcmVsaWVzIG9uIHRoZSBmYWN0IHRoYXQsIGluIHRoaXMgaW1wbGVtZW50YXRpb24sCisvLyBiYXNpY19zdHJpbmcncyBpdGVyYXRvcnMgYXJlIHBvaW50ZXJzLiAgSXQgYWxzbyBhc3N1bWVzIChhcyBhbGxvd2VkCisvLyBieSB0aGUgc3RhbmRhcmQpIHRoYXQgX0NoYXJUIGlzIGEgUE9EIHR5cGUuCisKKy8vIFdlIGhhdmUgYSB2ZXJ5IHNtYWxsIGJ1ZmZlciBmb3IgdGhlIHB1dCBhcmVhLCBqdXN0IHNvIHRoYXQgd2UgZG9uJ3QKKy8vIGhhdmUgdG8gdXNlIGFwcGVuZCgpIGZvciBldmVyeSBzcHV0Yy4gIENvbmNlcHR1YWxseSwgdGhlIGJ1ZmZlcgorLy8gaW1tZWRpYXRlbHkgZm9sbG93cyB0aGUgZW5kIG9mIHRoZSB1bmRlcmx5aW5nIHN0cmluZy4gIFdlIHVzZSB0aGlzCisvLyBidWZmZXIgd2hlbiBhcHBlbmRpbmcgdG8gd3JpdGUtb25seSBzdHJlYW1idWZzLCBidXQgd2UgZG9uJ3QgdXNlIGl0CisvLyBmb3IgcmVhZC13cml0ZSBzdHJlYW1idWZzLgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitjbGFzcyBiYXNpY19zdHJpbmdidWYgOiBwdWJsaWMgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4geworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUeXBlZGVmcy4KKyAgdHlwZWRlZiBfQ2hhclQgICAgICAgICAgICAgICAgICAgICBjaGFyX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6aW50X3R5cGUgaW50X3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6cG9zX3R5cGUgcG9zX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6b2ZmX3R5cGUgb2ZmX3R5cGU7CisgIHR5cGVkZWYgX1RyYWl0cyAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3R5cGU7CisKKyAgdHlwZWRlZiBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiAgICAgICAgICBfQmFzZTsKKyAgdHlwZWRlZiBiYXNpY19zdHJpbmdidWY8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+ICBfU2VsZjsKKyAgdHlwZWRlZiBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+ICAgICBfU3RyaW5nOworCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnN0cnVjdG9ycywgZGVzdHJ1Y3Rvci4KKyAgZXhwbGljaXQgYmFzaWNfc3RyaW5nYnVmKGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0KTsKKyAgZXhwbGljaXQgYmFzaWNfc3RyaW5nYnVmKGNvbnN0IF9TdHJpbmcmIF9fcywgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpOworICB2aXJ0dWFsIH5iYXNpY19zdHJpbmdidWYoKTsKKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHZXQgb3Igc2V0IHRoZSBzdHJpbmcuCisgIF9TdHJpbmcgc3RyKCkgY29uc3QgeyByZXR1cm4gX01fc3RyOyB9CisgIHZvaWQgc3RyKGNvbnN0IF9TdHJpbmcmIF9fcyk7CisKK3Byb3RlY3RlZDogICAgICAgICAgICAgICAgICAgICAgLy8gT3ZlcnJpZGRlbiB2aXJ0dWFsIG1lbWJlciBmdW5jdGlvbnMuCisgIHZpcnR1YWwgaW50X3R5cGUgdW5kZXJmbG93KCk7CisgIHZpcnR1YWwgaW50X3R5cGUgdWZsb3coKTsKKyAgdmlydHVhbCBpbnRfdHlwZSBwYmFja2ZhaWwoaW50X3R5cGUgX19jKTsKKyAgdmlydHVhbCBpbnRfdHlwZSBvdmVyZmxvdyhpbnRfdHlwZSBfX2MpOworICBpbnRfdHlwZSBwYmFja2ZhaWwoKSB7cmV0dXJuIHBiYWNrZmFpbChfVHJhaXRzOjplb2YoKSk7fQorICBpbnRfdHlwZSBvdmVyZmxvdygpIHtyZXR1cm4gb3ZlcmZsb3coX1RyYWl0czo6ZW9mKCkpO30KKworICB2aXJ0dWFsIHN0cmVhbXNpemUgeHNwdXRuKGNvbnN0IGNoYXJfdHlwZSogX19zLCBzdHJlYW1zaXplIF9fbik7CisgIHZpcnR1YWwgc3RyZWFtc2l6ZSBfTV94c3B1dG5jKGNoYXJfdHlwZSBfX2MsIHN0cmVhbXNpemUgX19uKTsKKworICB2aXJ0dWFsIF9CYXNlKiBzZXRidWYoX0NoYXJUKiBfX2J1Ziwgc3RyZWFtc2l6ZSBfX24pOworICB2aXJ0dWFsIHBvc190eXBlIHNlZWtvZmYob2ZmX3R5cGUgX19vZmYsIGlvc19iYXNlOjpzZWVrZGlyIF9fZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpOworICB2aXJ0dWFsIHBvc190eXBlIHNlZWtwb3MocG9zX3R5cGUgX19wb3MsIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0KTsKKworcHJpdmF0ZTogICAgICAgICAgICAgICAgICAgICAgICAvLyBIZWxwZXIgZnVuY3Rpb25zLgorICB2b2lkIF9NX3NldF9wdHJzKCk7CisgIHN0YXRpYyBfQ2hhclQqIF9TX3N0YXJ0KGNvbnN0IF9TdHJpbmcmIF9fc3RyKSB7IHJldHVybiBfX0NPTlNUX0NBU1QoX0NoYXJUKiwgX19zdHIuZGF0YSgpKTsgfQorICBzdGF0aWMgX0NoYXJUKiBfU19maW5pc2goY29uc3QgX1N0cmluZyYgX19zdHIpIHsgcmV0dXJuIF9fQ09OU1RfQ0FTVChfQ2hhclQqLCBfX3N0ci5kYXRhKCkpICsgX19zdHIuc2l6ZSgpOyB9CisKK3ByaXZhdGU6CisgIGlvc19iYXNlOjpvcGVubW9kZSBfTV9tb2RlOworICBfU3RyaW5nIF9NX3N0cjsKK307CisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUKQorX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIGJhc2ljX3N0cmluZ2J1ZjxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiwgYWxsb2NhdG9yPGNoYXI+ID47CisjICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBiYXNpY19zdHJpbmdidWY8d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4sIGFsbG9jYXRvcjx3Y2hhcl90PiAgPjsKKyMgIGVuZGlmCisjZW5kaWYgLyogX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCAqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENsYXNzIGJhc2ljX2lzdHJpbmdzdHJlYW0sIGFuIGlucHV0IHN0cmVhbSB0aGF0IHVzZXMgYSBzdHJpbmdidWYuCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK2NsYXNzIGJhc2ljX2lzdHJpbmdzdHJlYW0gOiBwdWJsaWMgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+IHsKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHlwZWRlZnMKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpjaGFyX3R5cGUgICBjaGFyX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6aW50X3R5cGUgICAgaW50X3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6cG9zX3R5cGUgICAgcG9zX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6b2ZmX3R5cGUgICAgb2ZmX3R5cGU7CisgIHR5cGVkZWYgX1RyYWl0cyB0cmFpdHNfdHlwZTsKKworICB0eXBlZGVmIGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+ICAgICAgICAgICAgICAgIF9CYXNpY19pb3M7CisgIHR5cGVkZWYgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICAgICAgICAgICAgX0Jhc2U7CisgIHR5cGVkZWYgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiAgICAgX1N0cmluZzsKKyAgdHlwZWRlZiBiYXNpY19zdHJpbmdidWY8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+ICBfQnVmOworCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnN0cnVjdG9ycywgZGVzdHJ1Y3Rvci4KKyAgYmFzaWNfaXN0cmluZ3N0cmVhbShpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlID0gaW9zX2Jhc2U6OmluKTsKKyAgYmFzaWNfaXN0cmluZ3N0cmVhbShjb25zdCBfU3RyaW5nJiBfX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlID0gaW9zX2Jhc2U6OmluKTsKKyAgfmJhc2ljX2lzdHJpbmdzdHJlYW0oKTsKKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNZW1iZXIgZnVuY3Rpb25zCisKKyAgYmFzaWNfc3RyaW5nYnVmPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiogcmRidWYoKSBjb25zdAorICAgIHsgcmV0dXJuIF9fQ09OU1RfQ0FTVChfQnVmKiwmX01fYnVmKTsgfQorCisgIF9TdHJpbmcgc3RyKCkgY29uc3QgeyByZXR1cm4gX01fYnVmLnN0cigpOyB9CisgIHZvaWQgc3RyKGNvbnN0IF9TdHJpbmcmIF9fcykgeyBfTV9idWYuc3RyKF9fcyk7IH0KKworcHJpdmF0ZToKKyAgYmFzaWNfc3RyaW5nYnVmPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiBfTV9idWY7CisKKyNpZiBkZWZpbmVkIChfU1RMUF9NU1ZDKSAmJiAoX1NUTFBfTVNWQyA+PSAxMzAwICYmIF9TVExQX01TVkMgPD0gMTMxMCkKKyAgdHlwZWRlZiBiYXNpY19pc3RyaW5nc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gX1NlbGY7CisgIC8vZXhwbGljaXRlbHkgZGVmaW5lZCBhcyBwcml2YXRlIHRvIGF2b2lkIHdhcm5pbmdzOgorICBiYXNpY19pc3RyaW5nc3RyZWFtKF9TZWxmIGNvbnN0Jik7CisgIF9TZWxmJiBvcGVyYXRvciA9IChfU2VsZiBjb25zdCYpOworI2VuZGlmCit9OworCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ2xhc3MgYmFzaWNfb3N0cmluZ3N0cmVhbSwgYW4gb3V0cHV0IHN0cmVhbSB0aGF0IHVzZXMgYSBzdHJpbmdidWYuCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK2NsYXNzIGJhc2ljX29zdHJpbmdzdHJlYW0gOiBwdWJsaWMgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+IHsKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHlwZWRlZnMKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpjaGFyX3R5cGUgICBjaGFyX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6aW50X3R5cGUgICAgaW50X3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6cG9zX3R5cGUgICAgcG9zX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6b2ZmX3R5cGUgICAgb2ZmX3R5cGU7CisgIHR5cGVkZWYgX1RyYWl0cyB0cmFpdHNfdHlwZTsKKworICB0eXBlZGVmIGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+ICAgICAgICAgICAgICAgIF9CYXNpY19pb3M7CisgIHR5cGVkZWYgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICAgICAgICAgICAgX0Jhc2U7CisgIHR5cGVkZWYgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiAgICAgX1N0cmluZzsKKyAgdHlwZWRlZiBiYXNpY19zdHJpbmdidWY8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+ICBfQnVmOworCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnN0cnVjdG9ycywgZGVzdHJ1Y3Rvci4KKyAgYmFzaWNfb3N0cmluZ3N0cmVhbShpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlID0gaW9zX2Jhc2U6Om91dCk7CisgIGJhc2ljX29zdHJpbmdzdHJlYW0oY29uc3QgX1N0cmluZyYgX19zdHIsCisgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSA9IGlvc19iYXNlOjpvdXQpOworICB+YmFzaWNfb3N0cmluZ3N0cmVhbSgpOworCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1lbWJlciBmdW5jdGlvbnMuCisKKyAgYmFzaWNfc3RyaW5nYnVmPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiogcmRidWYoKSBjb25zdAorICAgIHsgcmV0dXJuIF9fQ09OU1RfQ0FTVChfQnVmKiwmX01fYnVmKTsgfQorCisgIF9TdHJpbmcgc3RyKCkgY29uc3QgeyByZXR1cm4gX01fYnVmLnN0cigpOyB9CisgICAgdm9pZCBzdHIoY29uc3QgX1N0cmluZyYgX19zKSB7IF9NX2J1Zi5zdHIoX19zKTsgfSAvLyBkd2EgMDIvMDcvMDAgLSBCVUcgU1RPTVBFUiBEQVZFCisKKworcHJpdmF0ZToKKyAgYmFzaWNfc3RyaW5nYnVmPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiBfTV9idWY7CisKKyNpZiBkZWZpbmVkIChfU1RMUF9NU1ZDKSAmJiAoX1NUTFBfTVNWQyA+PSAxMzAwICYmIF9TVExQX01TVkMgPD0gMTMxMCkKKyAgdHlwZWRlZiBiYXNpY19vc3RyaW5nc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gX1NlbGY7CisgIC8vZXhwbGljaXRlbHkgZGVmaW5lZCBhcyBwcml2YXRlIHRvIGF2b2lkIHdhcm5pbmdzOgorICBiYXNpY19vc3RyaW5nc3RyZWFtKF9TZWxmIGNvbnN0Jik7CisgIF9TZWxmJiBvcGVyYXRvciA9IChfU2VsZiBjb25zdCYpOworI2VuZGlmCit9OworCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ2xhc3MgYmFzaWNfc3RyaW5nc3RyZWFtLCBhIGJpZGlyZWN0aW9uYWwgc3RyZWFtIHRoYXQgdXNlcyBhIHN0cmluZ2J1Zi4KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorY2xhc3MgYmFzaWNfc3RyaW5nc3RyZWFtIDogcHVibGljIGJhc2ljX2lvc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4geworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUeXBlZGVmcworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmNoYXJfdHlwZSBjaGFyX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6aW50X3R5cGUgIGludF90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OnBvc190eXBlICBwb3NfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpvZmZfdHlwZSAgb2ZmX3R5cGU7CisgIHR5cGVkZWYgX1RyYWl0cyAgdHJhaXRzX3R5cGU7CisKKyAgdHlwZWRlZiBiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPiAgICAgICAgICAgICAgICAgX0Jhc2ljX2lvczsKKyAgdHlwZWRlZiBiYXNpY19pb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICAgICAgICAgICAgX0Jhc2U7CisgIHR5cGVkZWYgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiAgICAgIF9TdHJpbmc7CisgIHR5cGVkZWYgYmFzaWNfc3RyaW5nYnVmPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiAgX0J1ZjsKKworICB0eXBlZGVmIGlvc19iYXNlOjpvcGVubW9kZSBvcGVubW9kZTsKKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25zdHJ1Y3RvcnMsIGRlc3RydWN0b3IuCisgIGJhc2ljX3N0cmluZ3N0cmVhbShvcGVubW9kZSBfX21vZCA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpOworICBiYXNpY19zdHJpbmdzdHJlYW0oY29uc3QgX1N0cmluZyYgX19zdHIsCisgICAgICAgICAgICAgICAgICAgICBvcGVubW9kZSBfX21vZCA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpOworICB+YmFzaWNfc3RyaW5nc3RyZWFtKCk7CisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWVtYmVyIGZ1bmN0aW9ucy4KKworICBiYXNpY19zdHJpbmdidWY8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+KiByZGJ1ZigpIGNvbnN0CisgICAgeyByZXR1cm4gX19DT05TVF9DQVNUKF9CdWYqLCZfTV9idWYpOyB9CisKKyAgX1N0cmluZyBzdHIoKSBjb25zdCB7IHJldHVybiBfTV9idWYuc3RyKCk7IH0KKyAgICB2b2lkIHN0cihjb25zdCBfU3RyaW5nJiBfX3MpIHsgX01fYnVmLnN0cihfX3MpOyB9CisKK3ByaXZhdGU6CisgIGJhc2ljX3N0cmluZ2J1ZjxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4gX01fYnVmOworCisjaWYgZGVmaW5lZCAoX1NUTFBfTVNWQykgJiYgKF9TVExQX01TVkMgPj0gMTMwMCAmJiBfU1RMUF9NU1ZDIDw9IDEzMTApCisgIHR5cGVkZWYgYmFzaWNfc3RyaW5nc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gX1NlbGY7CisgIC8vZXhwbGljaXRlbHkgZGVmaW5lZCBhcyBwcml2YXRlIHRvIGF2b2lkIHdhcm5pbmdzOgorICBiYXNpY19zdHJpbmdzdHJlYW0oX1NlbGYgY29uc3QmKTsKKyAgX1NlbGYmIG9wZXJhdG9yID0gKF9TZWxmIGNvbnN0Jik7CisjZW5kaWYKK307CisKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9URU1QTEFURV9FWFBPUlQpCitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgYmFzaWNfaXN0cmluZ3N0cmVhbTxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiwgYWxsb2NhdG9yPGNoYXI+ID47CitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgYmFzaWNfb3N0cmluZ3N0cmVhbTxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiwgYWxsb2NhdG9yPGNoYXI+ID47CitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgYmFzaWNfc3RyaW5nc3RyZWFtPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+LCBhbGxvY2F0b3I8Y2hhcj4gPjsKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQorX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIGJhc2ljX2lzdHJpbmdzdHJlYW08d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4sIGFsbG9jYXRvcjx3Y2hhcl90PiAgPjsKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBiYXNpY19vc3RyaW5nc3RyZWFtPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+LCBhbGxvY2F0b3I8d2NoYXJfdD4gID47CitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgYmFzaWNfc3RyaW5nc3RyZWFtPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+LCBhbGxvY2F0b3I8d2NoYXJfdD4gID47CisjICBlbmRpZgorI2VuZGlmIC8qIF9TVExQX1VTRV9URU1QTEFURV9FWFBPUlQgKi8KKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjaWYgZGVmaW5lZCAoX1NUTFBfRVhQT1NFX1NUUkVBTV9JTVBMRU1FTlRBVElPTikgJiYgIWRlZmluZWQgKF9TVExQX0xJTktfVElNRV9JTlNUQU5USUFUSU9OKQorIyAgaW5jbHVkZSA8c3RsL19zc3RyZWFtLmM+CisjZW5kaWYKKworI2VuZGlmIC8qIF9TVExQX0lOVEVSTkFMX1NTVFJFQU0gKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL19zdGFjay5oIGIvc3RscG9ydC9zdGwvX3N0YWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VhOWQ1OQotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc3RsL19zdGFjay5oCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworLyogTk9URTogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgU1RMIGhlYWRlcnMuCisgKiAgIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LgorICovCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfU1RBQ0tfSAorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9TVEFDS19ICisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfREVRVUVfSAorIyAgaW5jbHVkZSA8c3RsL19kZXF1ZS5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisjaWYgIWRlZmluZWQgKCBfU1RMUF9MSU1JVEVEX0RFRkFVTFRfVEVNUExBVEVTICkKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9TZXF1ZW5jZSA9IGRlcXVlPF9UcD4gPgorI2VsaWYgZGVmaW5lZCAoIF9TVExQX01JTklNVU1fREVGQVVMVF9URU1QTEFURV9QQVJBTVMgKQorIyAgZGVmaW5lIF9TVExQX1NUQUNLX0FSR1MgX1RwCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorI2Vsc2UKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9TZXF1ZW5jZT4KKyNlbmRpZgorY2xhc3Mgc3RhY2sKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUEFSVElBTF9TUEVDX1dPUktBUk9VTkQpCisjICBpZiBkZWZpbmVkIChfU1RMUF9TVEFDS19BUkdTKQorICAgICAgICAgICAgOiBwdWJsaWMgX19zdGxwb3J0X2NsYXNzPHN0YWNrPF9UcD4gPgorIyAgZWxzZQorICAgICAgICAgICAgOiBwdWJsaWMgX19zdGxwb3J0X2NsYXNzPHN0YWNrPF9UcCwgX1NlcXVlbmNlPiA+CisjICBlbmRpZgorI2VuZGlmCit7CisjaWZkZWYgX1NUTFBfU1RBQ0tfQVJHUworICB0eXBlZGVmIGRlcXVlPF9UcD4gX1NlcXVlbmNlOworICB0eXBlZGVmIHN0YWNrPF9UcD4gX1NlbGY7CisjZWxzZQorICB0eXBlZGVmIHN0YWNrPF9UcCwgX1NlcXVlbmNlPiBfU2VsZjsKKyNlbmRpZgorCitwdWJsaWM6CisgIHR5cGVkZWYgdHlwZW5hbWUgX1NlcXVlbmNlOjp2YWx1ZV90eXBlICAgICAgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfU2VxdWVuY2U6OnNpemVfdHlwZSAgICAgICBzaXplX3R5cGU7CisgIHR5cGVkZWYgICAgICAgICAgX1NlcXVlbmNlICAgICAgICAgICAgICAgICAgY29udGFpbmVyX3R5cGU7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBfU2VxdWVuY2U6OnJlZmVyZW5jZSAgICAgICByZWZlcmVuY2U7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1NlcXVlbmNlOjpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlOworcHJvdGVjdGVkOgorICAvL2MgaXMgYSBTdGFuZGFyZCBuYW1lICgyMy4yLjMuMyksIGRvIG5vIG1ha2UgaXQgU1RMcG9ydCBuYW1pbmcgY29udmVudGlvbiBjb21wbGlhbnQuCisgIF9TZXF1ZW5jZSBjOworcHVibGljOgorICBzdGFjaygpIDogYygpIHt9CisgIGV4cGxpY2l0IHN0YWNrKGNvbnN0IF9TZXF1ZW5jZSYgX19zKSA6IGMoX19zKSB7fQorCisjaWYgIWRlZmluZWQgKF9TVExQX05PX01PVkVfU0VNQU5USUMpCisgIHN0YWNrKF9fbW92ZV9zb3VyY2U8X1NlbGY+IHNyYykKKyAgICA6IGMoX1NUTFBfUFJJViBfQXNNb3ZlU291cmNlKHNyYy5nZXQoKS5jKSkge30KKyNlbmRpZgorCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBjLmVtcHR5KCk7IH0KKyAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCB7IHJldHVybiBjLnNpemUoKTsgfQorICByZWZlcmVuY2UgdG9wKCkgeyByZXR1cm4gYy5iYWNrKCk7IH0KKyAgY29uc3RfcmVmZXJlbmNlIHRvcCgpIGNvbnN0IHsgcmV0dXJuIGMuYmFjaygpOyB9CisgIHZvaWQgcHVzaChjb25zdCB2YWx1ZV90eXBlJiBfX3gpIHsgYy5wdXNoX2JhY2soX194KTsgfQorICB2b2lkIHBvcCgpIHsgYy5wb3BfYmFjaygpOyB9CisgIGNvbnN0IF9TZXF1ZW5jZSYgX0dldF9zKCkgY29uc3QgeyByZXR1cm4gYzsgfQorI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QQVJUSUFMX1NQRUNfV09SS0FST1VORCkgJiYgIWRlZmluZWQgKF9TVExQX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUikKKyAgdm9pZCBfTV9zd2FwX3dvcmthcm91bmQoX1NlbGYmIF9feCkgeworICAgIF9TZXF1ZW5jZSBfX3RtcCA9IGM7CisgICAgYyA9IF9feC5jOworICAgIF9feC5jID0gX190bXA7CisgIH0KKyNlbmRpZgorfTsKKworI2lmbmRlZiBfU1RMUF9TVEFDS19BUkdTCisjICBkZWZpbmUgX1NUTFBfU1RBQ0tfQVJHUyBfVHAsIF9TZXF1ZW5jZQorIyAgZGVmaW5lIF9TVExQX1NUQUNLX0hFQURFUl9BUkdTIGNsYXNzIF9UcCwgY2xhc3MgX1NlcXVlbmNlCisjZWxzZQorIyAgZGVmaW5lIF9TVExQX1NUQUNLX0hFQURFUl9BUkdTIGNsYXNzIF9UcAorI2VuZGlmCisKK3RlbXBsYXRlIDwgX1NUTFBfU1RBQ0tfSEVBREVSX0FSR1MgPgoraW5saW5lIGJvb2wgX1NUTFBfQ0FMTCAgb3BlcmF0b3I9PShjb25zdCBzdGFjazwgX1NUTFBfU1RBQ0tfQVJHUyA+JiBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YWNrPCBfU1RMUF9TVEFDS19BUkdTID4mIF9feSkKK3sgcmV0dXJuIF9feC5fR2V0X3MoKSA9PSBfX3kuX0dldF9zKCk7IH0KKwordGVtcGxhdGUgPCBfU1RMUF9TVEFDS19IRUFERVJfQVJHUyA+CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMICBvcGVyYXRvcjwoY29uc3Qgc3RhY2s8IF9TVExQX1NUQUNLX0FSR1MgPiYgX194LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YWNrPCBfU1RMUF9TVEFDS19BUkdTID4mIF9feSkKK3sgcmV0dXJuIF9feC5fR2V0X3MoKSA8IF9feS5fR2V0X3MoKTsgfQorCitfU1RMUF9SRUxPUFNfT1BFUkFUT1JTKHRlbXBsYXRlIDwgX1NUTFBfU1RBQ0tfSEVBREVSX0FSR1MgPiwgc3RhY2s8IF9TVExQX1NUQUNLX0FSR1MgPikKKworI3VuZGVmIF9TVExQX1NUQUNLX0FSR1MKKyN1bmRlZiBfU1RMUF9TVEFDS19IRUFERVJfQVJHUworCisjaWYgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikgJiYgIWRlZmluZWQgKF9TVExQX05PX01PVkVfU0VNQU5USUMpCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfU2VxdWVuY2U+CitzdHJ1Y3QgX19tb3ZlX3RyYWl0czxzdGFjazxfVHAsIF9TZXF1ZW5jZT4gPiA6CisgIF9TVExQX1BSSVYgX19tb3ZlX3RyYWl0c19hdXg8X1NlcXVlbmNlPgore307CisjZW5kaWYKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfU1RBQ0tfSCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RsL19zdGRleGNlcHQuaCBiL3N0bHBvcnQvc3RsL19zdGRleGNlcHQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3RsL19zdGRleGNlcHQuaApyZW5hbWUgdG8gc3RscG9ydC9zdGwvX3N0ZGV4Y2VwdC5oCmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9fc3RkZXhjZXB0X2Jhc2UuYyBiL3N0bHBvcnQvc3RsL19zdGRleGNlcHRfYmFzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYjcwNTYKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9fc3RkZXhjZXB0X2Jhc2UuYwpAQCAtMCwwICsxLDk1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKK19fTmFtZWRfZXhjZXB0aW9uOjpfX05hbWVkX2V4Y2VwdGlvbihjb25zdCBzdHJpbmcmIF9fc3RyKSB7CisgIHNpemVfdCBfX3NpemUgPSBzdHJsZW4oX1NUTFBfUFJJViBfX2dldF9jX3N0cmluZyhfX3N0cikpICsgMTsKKyAgaWYgKF9fc2l6ZSA+IF9TX2J1ZnNpemUpIHsKKyAgICBfTV9uYW1lID0gX19TVEFUSUNfQ0FTVChjaGFyKiwgbWFsbG9jKF9fc2l6ZSAqIHNpemVvZihjaGFyKSkpOworICAgIGlmICghX01fbmFtZSkgeworICAgICAgX19zaXplID0gX1NfYnVmc2l6ZTsKKyAgICAgIF9NX25hbWUgPSBfTV9zdGF0aWNfbmFtZTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAqKF9fUkVJTlRFUlBSRVRfQ0FTVChzaXplX3QqLCAmX01fc3RhdGljX25hbWVbMF0pKSA9IF9fc2l6ZSAqIHNpemVvZihjaGFyKTsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgX01fbmFtZSA9IF9NX3N0YXRpY19uYW1lOworICB9CisjaWYgIWRlZmluZWQgKF9TVExQX1VTRV9TQUZFX1NUUklOR19GVU5DVElPTlMpCisgIHN0cm5jcHkoX01fbmFtZSwgX1NUTFBfUFJJViBfX2dldF9jX3N0cmluZyhfX3N0ciksIF9fc2l6ZSAtIDEpOworICBfTV9uYW1lW19fc2l6ZSAtIDFdID0gJ1wwJzsKKyNlbHNlCisgIHN0cm5jcHlfcyhfTV9uYW1lLCBfX3NpemUsIF9TVExQX1BSSVYgX19nZXRfY19zdHJpbmcoX19zdHIpLCBfX3NpemUgLSAxKTsKKyNlbmRpZgorfQorCitfX05hbWVkX2V4Y2VwdGlvbjo6X19OYW1lZF9leGNlcHRpb24oY29uc3QgX19OYW1lZF9leGNlcHRpb24mIF9feCkgeworICBzaXplX3QgX19zaXplID0gc3RybGVuKF9feC5fTV9uYW1lKSArIDE7CisgIGlmIChfX3NpemUgPiBfU19idWZzaXplKSB7CisgICAgX01fbmFtZSA9IF9fU1RBVElDX0NBU1QoY2hhciosIG1hbGxvYyhfX3NpemUgKiBzaXplb2YoY2hhcikpKTsKKyAgICBpZiAoIV9NX25hbWUpIHsKKyAgICAgIF9fc2l6ZSA9IF9TX2J1ZnNpemU7CisgICAgICBfTV9uYW1lID0gX01fc3RhdGljX25hbWU7CisgICAgfQorICAgIGVsc2UgeworICAgICAgKihfX1JFSU5URVJQUkVUX0NBU1Qoc2l6ZV90KiwgJl9NX3N0YXRpY19uYW1lWzBdKSkgPSBfX3NpemUgKiBzaXplb2YoY2hhcik7CisgICAgfQorICB9CisgIGVsc2UgeworICAgIF9NX25hbWUgPSBfTV9zdGF0aWNfbmFtZTsKKyAgfQorI2lmICFkZWZpbmVkIChfU1RMUF9VU0VfU0FGRV9TVFJJTkdfRlVOQ1RJT05TKQorICBzdHJuY3B5KF9NX25hbWUsIF9feC5fTV9uYW1lLCBfX3NpemUgLSAxKTsKKyAgX01fbmFtZVtfX3NpemUgLSAxXSA9ICdcMCc7CisjZWxzZQorICBzdHJuY3B5X3MoX01fbmFtZSwgX19zaXplLCBfX3guX01fbmFtZSwgX19zaXplIC0gMSk7CisjZW5kaWYKK30KKworX19OYW1lZF9leGNlcHRpb24mIF9fTmFtZWRfZXhjZXB0aW9uOjpvcGVyYXRvciA9IChjb25zdCBfX05hbWVkX2V4Y2VwdGlvbiYgX194KSB7CisgIHNpemVfdCBfX3NpemUgPSBzdHJsZW4oX194Ll9NX25hbWUpICsgMTsKKyAgc2l6ZV90IF9fYnVmX3NpemUgPSBfTV9uYW1lICE9IF9NX3N0YXRpY19uYW1lID8gKihfX1JFSU5URVJQUkVUX0NBU1Qoc2l6ZV90KiwgJl9NX3N0YXRpY19uYW1lWzBdKSkgOiBfU19idWZzaXplOworICBpZiAoX19zaXplID4gX19idWZfc2l6ZSkgeworICAgIC8vIEJlaW5nIGhlcmUgbmVjZXNzYXJpbHkgbWVhbiB0aGF0IHdlIG5lZWQgdG8gYWxsb2NhdGUgYSBidWZmZXI6CisgICAgaWYgKF9NX25hbWUgIT0gX01fc3RhdGljX25hbWUpIGZyZWUoX01fbmFtZSk7CisgICAgX01fbmFtZSA9IF9fU1RBVElDX0NBU1QoY2hhciosIG1hbGxvYyhfX3NpemUgKiBzaXplb2YoY2hhcikpKTsKKyAgICBpZiAoIV9NX25hbWUpIHsKKyAgICAgIF9fc2l6ZSA9IF9TX2J1ZnNpemU7CisgICAgICBfTV9uYW1lID0gX01fc3RhdGljX25hbWU7CisgICAgfQorICAgIGVsc2UgeworICAgICAgKihfX1JFSU5URVJQUkVUX0NBU1Qoc2l6ZV90KiwgJl9NX3N0YXRpY19uYW1lWzBdKSkgPSBfX3NpemUgKiBzaXplb2YoY2hhcik7CisgICAgfQorICB9CisjaWYgIWRlZmluZWQgKF9TVExQX1VTRV9TQUZFX1NUUklOR19GVU5DVElPTlMpCisgIHN0cm5jcHkoX01fbmFtZSwgX194Ll9NX25hbWUsIF9fc2l6ZSAtIDEpOworICBfTV9uYW1lW19fc2l6ZSAtIDFdID0gJ1wwJzsKKyNlbHNlCisgIHN0cm5jcHlfcyhfTV9uYW1lLCBfX3NpemUsIF9feC5fTV9uYW1lLCBfX3NpemUgLSAxKTsKKyNlbmRpZgorICByZXR1cm4gKnRoaXM7Cit9CisKK19fTmFtZWRfZXhjZXB0aW9uOjp+X19OYW1lZF9leGNlcHRpb24oKSBfU1RMUF9OT1RIUk9XX0lOSEVSRU5UTFkgeworICBpZiAoX01fbmFtZSAhPSBfTV9zdGF0aWNfbmFtZSkKKyAgICBmcmVlKF9NX25hbWUpOworfQorCitjb25zdCBjaGFyKiBfX05hbWVkX2V4Y2VwdGlvbjo6d2hhdCgpIGNvbnN0IF9TVExQX05PVEhST1dfSU5IRVJFTlRMWQoreyByZXR1cm4gX01fbmFtZTsgfQpkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdGwvX3N0ZGV4Y2VwdF9iYXNlLmggYi9zdGxwb3J0L3N0bC9fc3RkZXhjZXB0X2Jhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWRjMDc3Ci0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvX3N0ZGV4Y2VwdF9iYXNlLmgKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX1NUREVYQ0VQVF9CQVNFCisjZGVmaW5lIF9TVExQX0lOVEVSTkFMX1NUREVYQ0VQVF9CQVNFCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX05BVElWRV9TVERFWENFUFQpIHx8IGRlZmluZWQgKF9TVExQX1VTRV9PV05fTkFNRVNQQUNFKQorCisjICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfRVhDRVBUSU9OCisjICAgIGluY2x1ZGUgPHN0bC9fZXhjZXB0aW9uLmg+CisjICBlbmRpZgorCisjICBpZiBkZWZpbmVkKF9TVExQX1VTRV9FWENFUFRJT05TKSB8fCBcCisgICAgIShkZWZpbmVkKF9NSVBTX1NJTSkgJiYgZGVmaW5lZChfQUJJTzMyKSAmJiAoX01JUFNfU0lNID09IF9BQklPMzIpKQorCisjICAgIGlmbmRlZiBfU1RMUF9JTlRFUk5BTF9DU1RSSU5HCisjICAgICAgaW5jbHVkZSA8c3RsL19jc3RyaW5nLmg+CisjICAgIGVuZGlmCisKKyMgICAgaWZuZGVmIF9TVExQX1NUUklOR19GV0RfSAorIyAgICAgIGluY2x1ZGUgPHN0bC9fc3RyaW5nX2Z3ZC5oPgorIyAgICBlbmRpZgorCisjICAgIGlmbmRlZiBfU1RMUF9VU0VfTk9fSU9TVFJFQU1TCisjICAgICAgZGVmaW5lIF9TVExQX09XTl9TVERFWENFUFQgMQorIyAgICBlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworLyogV2UgZGlzYWJsZSB0aGUgNDI3NSB3YXJuaW5nIGZvcgorICogIC0gV2luQ0Ugd2hlcmUgdGhlcmUgYXJlIG9ubHkgc3RhdGljIHZlcnNpb24gb2YgdGhlIG5hdGl2ZSBDKysgcnVudGltZS4KKyAqICAtIFRoZSBNU1ZDIGNvbXBpbGVycyB3aGVuIHRoZSBTVExwb3J0IHVzZXIgd2FudHMgdG8gbWFrZSBhbiBTVExwb3J0IGRsbCBsaW5rZWQgdG8KKyAqICAgIHRoZSBzdGF0aWMgQysrIG5hdGl2ZSBydW50aW1lLiBJbiB0aGlzIGNhc2UgdGhlIHN0ZDo6ZXhjZXB0aW9uIGJhc2UgY2xhc3MgaXMgbm8gbW9yZQorICogICAgZXhwb3J0ZWQgZnJvbSBuYXRpdmUgZGxsIGJ1dCBpcyB1c2VkIGFzIGEgYmFzZSBjbGFzcyBmb3IgdGhlIGV4cG9ydGVkIF9fTmFtZWRfZXhjZXB0aW9uCisgKiAgICBjbGFzcy4KKyAqLworIyAgICBpZiBkZWZpbmVkIChfU1RMUF9XQ0VfTkVUKSB8fCBcCisgICAgICAgIGRlZmluZWQgKF9TVExQX1VTRV9EWU5BTUlDX0xJQikgJiYgZGVmaW5lZCAoX1NUTFBfVVNJTkdfQ1JPU1NfTkFUSVZFX1JVTlRJTUVfTElCKQorIyAgICAgIGRlZmluZSBfU1RMUF9ET19XQVJOSU5HX1BPUAorIyAgICAgIHByYWdtYSB3YXJuaW5nIChwdXNoKQorIyAgICAgIHByYWdtYSB3YXJuaW5nIChkaXNhYmxlOiA0Mjc1KSAvLyBOb24gZGxsIGludGVyZmFjZSBjbGFzcyAnZXhjZXB0aW9uJyB1c2VkIGFzIGJhc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGRsbC1pbnRlcmZhY2UgY2xhc3MgJ19fTmFtZWRfZXhjZXB0aW9uJworIyAgICBlbmRpZgorCisjICAgIGlmICFkZWZpbmVkIChfU1RMUF9OT19FWENFUFRJT05fSEVBREVSKQorIyAgICAgIGlmICFkZWZpbmVkIChfU1RMUF9FWENFUFRJT05fQkFTRSkgJiYgIWRlZmluZWQgKF9TVExQX0JST0tFTl9FWENFUFRJT05fQ0xBU1MpICYmIFwKKyAgICAgICAgICAgZGVmaW5lZCAoX1NUTFBfVVNFX05BTUVTUEFDRVMpICYmICBkZWZpbmVkIChfU1RMUF9VU0VfT1dOX05BTUVTUEFDRSkKK3VzaW5nIF9TVExQX1ZFTkRPUl9FWENFUFRfU1REOjpleGNlcHRpb247CisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYKKyMgICAgZGVmaW5lIF9TVExQX0VYQ0VQVElPTl9CQVNFIGV4Y2VwdGlvbgorCitjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBfX05hbWVkX2V4Y2VwdGlvbiA6IHB1YmxpYyBfU1RMUF9FWENFUFRJT05fQkFTRSB7CitwdWJsaWM6CisgIF9fTmFtZWRfZXhjZXB0aW9uKGNvbnN0IHN0cmluZyYgX19zdHIpOworICBfX05hbWVkX2V4Y2VwdGlvbihjb25zdCBfX05hbWVkX2V4Y2VwdGlvbiYpOworICBfX05hbWVkX2V4Y2VwdGlvbiYgb3BlcmF0b3IgPSAoY29uc3QgX19OYW1lZF9leGNlcHRpb24mKTsKKworICBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3QgX1NUTFBfTk9USFJPV19JTkhFUkVOVExZOworICB+X19OYW1lZF9leGNlcHRpb24oKSBfU1RMUF9OT1RIUk9XX0lOSEVSRU5UTFk7CisKK3ByaXZhdGU6CisgIGVudW0geyBfU19idWZzaXplID0gMjU2IH07CisgIGNoYXIgX01fc3RhdGljX25hbWVbX1NfYnVmc2l6ZV07CisgIGNoYXIgKl9NX25hbWU7Cit9OworCisjICAgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9OT19JT1NUUkVBTVMpICYmICFkZWZpbmVkIChfX0JVSUxESU5HX1NUTFBPUlQpCisgICAgICAgLy8gaWYgbm90IGxpbmtpbmcgdG8gdGhlIGxpYiwgZXhwb3NlIGltcGxlbWVudGF0aW9uIG9mIG1lbWJlcnMgaGVyZQorIyAgICAgIGluY2x1ZGUgPHN0bC9fc3RkZXhjZXB0X2Jhc2UuYz4KKyMgICAgZW5kaWYKKworIyAgICBpZiBkZWZpbmVkIChfU1RMUF9ET19XQVJOSU5HX1BPUCkKKyMgICAgICBwcmFnbWEgd2FybmluZyAocG9wKQorIyAgICAgIHVuZGVmIF9TVExQX0RPX1dBUk5JTkdfUE9QCisjICAgIGVuZGlmCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworIyAgZW5kaWYgLyogTm90IG8zMiwgYW5kIG5vIGV4Y2VwdGlvbnMgKi8KKyNlbmRpZiAvKiBfU1RMUF9TVERFWENFUFRfU0VFTiAqLworCisjZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfU1RERVhDRVBUX0JBU0UgKi8KZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL19zdGxwb3J0X3ZlcnNpb24uaCBiL3N0bHBvcnQvc3RsL19zdGxwb3J0X3ZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODc2NTFkCi0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvX3N0bHBvcnRfdmVyc2lvbi5oCkBAIC0wLDAgKzEsMzAgQEAKKyAvKgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNQorICogRnJhbmNvaXMgRHVtb250CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfU1RMUE9SVF9WRVJTSU9OX0gKKyNkZWZpbmUgX1NUTFBfU1RMUE9SVF9WRVJTSU9OX0gKKworLyogVGhlIGxhc3QgU0dJIFNUTCByZWxlYXNlIHdlIG1lcmdlZCB3aXRoICovCisjZGVmaW5lIF9fU0dJX1NUTCAweDMzMAorCisvKiBTVExwb3J0IHZlcnNpb24gKi8KKyNkZWZpbmUgX1NUTFBPUlRfTUFKT1IgNQorI2RlZmluZSBfU1RMUE9SVF9NSU5PUiAyCisjZGVmaW5lIF9TVExQT1JUX1BBVENITEVWRUwgMQorCisjZGVmaW5lIF9TVExQT1JUX1ZFUlNJT04gMHg1MjEKKworI2VuZGlmIC8qIF9TVExQX1NUTFBPUlRfVkVSU0lPTl9IICovCmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9fc3RyZWFtX2l0ZXJhdG9yLmggYi9zdGxwb3J0L3N0bC9fc3RyZWFtX2l0ZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWEyNmFlMwotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc3RsL19zdHJlYW1faXRlcmF0b3IuaApAQCAtMCwwICsxLDI1MyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LTE5OTgKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKy8qIE5PVEU6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIFNUTCBoZWFkZXJzLgorICogICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4KKyAqLworCisjaWYgIWRlZmluZWQgKF9TVExQX0lOVEVSTkFMX1NUUkVBTV9JVEVSQVRPUl9IKSAmJiAhZGVmaW5lZCAoX1NUTFBfVVNFX05PX0lPU1RSRUFNUykKKyNkZWZpbmUgX1NUTFBfSU5URVJOQUxfU1RSRUFNX0lURVJBVE9SX0gKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9JVEVSQVRPUl9CQVNFX0gKKyMgIGluY2x1ZGUgPHN0bC9faXRlcmF0b3JfYmFzZS5oPgorI2VuZGlmCisKKy8vIHN0cmVhbWJ1Zl9pdGVyYXRvcnMgcHJlZGVjbGFyYXRpb25zIG11c3QgYXBwZWFyIGZpcnN0CisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0lPU0ZXRAorIyAgaW5jbHVkZSA8c3RsL19pb3Nmd2QuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0FMR09CQVNFX0gKKyMgIGluY2x1ZGUgPHN0bC9fYWxnb2Jhc2UuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX09TVFJFQU1CVUZfSVRFUkFUT1JfSAorIyAgaW5jbHVkZSA8c3RsL19vc3RyZWFtYnVmX2l0ZXJhdG9yLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9JU1RSRUFNQlVGX0lURVJBVE9SX0gKKyMgIGluY2x1ZGUgPHN0bC9faXN0cmVhbWJ1Zl9pdGVyYXRvci5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfSVNUUkVBTQorIyAgaW5jbHVkZSA8c3RsL19pc3RyZWFtLmg+CisjZW5kaWYKKworLy8gaXN0cmVhbV9pdGVyYXRvciBhbmQgb3N0cmVhbV9pdGVyYXRvciBsb29rIHZlcnkgZGlmZmVyZW50IGlmIHdlJ3JlCisvLyB1c2luZyBuZXcsIHRlbXBsYXRpemVkIGlvc3RyZWFtcyB0aGFuIGlmIHdlJ3JlIHVzaW5nIHRoZSBvbGQgY2Zyb250CisvLyB2ZXJzaW9uLgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworI2lmICFkZWZpbmVkIChfU1RMUF9MSU1JVEVEX0RFRkFVTFRfVEVNUExBVEVTKQorIyAgZGVmaW5lIF9fSVNJX1RNUExfSEVBREVSX0FSR1VNRU5UUyBjbGFzcyBfVHAsIGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0Rpc3QKKyMgIGRlZmluZSBfX0lTSV9UTVBMX0FSR1VNRU5UUyBfVHAsIF9DaGFyVCwgX1RyYWl0cywgX0Rpc3QKK3RlbXBsYXRlIDxjbGFzcyBfVHAsCisgICAgICAgICAgY2xhc3MgX0NoYXJUID0gY2hhciwgY2xhc3MgX1RyYWl0cyA9IGNoYXJfdHJhaXRzPF9DaGFyVD4sCisgICAgICAgICAgY2xhc3MgX0Rpc3QgPSBwdHJkaWZmX3Q+CitjbGFzcyBpc3RyZWFtX2l0ZXJhdG9yIDogcHVibGljIGl0ZXJhdG9yPGlucHV0X2l0ZXJhdG9yX3RhZywgX1RwICwgX0Rpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9UcCosIGNvbnN0IF9UcCYgPiB7CisjZWxzZQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfTUlOSU1VTV9ERUZBVUxUX1RFTVBMQVRFX1BBUkFNUykgJiYgIWRlZmluZWQgKF9TVExQX0RFRkFVTFRfVFlQRV9QQVJBTSkKKyMgICAgZGVmaW5lIF9fSVNJX1RNUExfSEVBREVSX0FSR1VNRU5UUyBjbGFzcyBfVHAKKyMgICAgZGVmaW5lIF9fSVNJX1RNUExfQVJHVU1FTlRTICAgICAgICBfVHAKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitjbGFzcyBpc3RyZWFtX2l0ZXJhdG9yIDogcHVibGljIGl0ZXJhdG9yPGlucHV0X2l0ZXJhdG9yX3RhZywgX1RwICwgcHRyZGlmZl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfVHAqLCBjb25zdCBfVHAmID4geworIyAgZWxzZQorIyAgICBkZWZpbmUgX19JU0lfVE1QTF9IRUFERVJfQVJHVU1FTlRTIGNsYXNzIF9UcCwgY2xhc3MgX0Rpc3QKKyMgICAgZGVmaW5lIF9fSVNJX1RNUExfQVJHVU1FTlRTICAgICAgICBfVHAsIF9EaXN0Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBfU1RMUF9ERkxfVFlQRV9QQVJBTShfRGlzdCwgcHRyZGlmZl90KT4KK2NsYXNzIGlzdHJlYW1faXRlcmF0b3IgOiBwdWJsaWMgaXRlcmF0b3I8aW5wdXRfaXRlcmF0b3JfdGFnLCBfVHAsIF9EaXN0ICwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1RwKiwgY29uc3QgX1RwJiA+IHsKKyMgIGVuZGlmIC8qIF9TVExQX01JTklNVU1fREVGQVVMVF9URU1QTEFURV9QQVJBTVMgKi8KKyNlbmRpZiAvKiBfU1RMUF9MSU1JVEVEX0RFRkFVTFRfVEVNUExBVEVTICovCisKKyNpZiBkZWZpbmVkIChfU1RMUF9MSU1JVEVEX0RFRkFVTFRfVEVNUExBVEVTKQorICB0eXBlZGVmIGNoYXIgX0NoYXJUOworICB0eXBlZGVmIGNoYXJfdHJhaXRzPGNoYXI+IF9UcmFpdHM7CisjICBpZiBkZWZpbmVkIChfU1RMUF9NSU5JTVVNX0RFRkFVTFRfVEVNUExBVEVfUEFSQU1TKSAmJiAhZGVmaW5lZCAoX1NUTFBfREVGQVVMVF9UWVBFX1BBUkFNKQorICB0eXBlZGVmIHB0cmRpZmZfdCBfRGlzdDsKKyMgIGVuZGlmCisjZW5kaWYKKworICB0eXBlZGVmIGlzdHJlYW1faXRlcmF0b3I8IF9fSVNJX1RNUExfQVJHVU1FTlRTID4gX1NlbGY7CitwdWJsaWM6CisgIHR5cGVkZWYgX0NoYXJUICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKKyAgdHlwZWRlZiBfVHJhaXRzICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3R5cGU7CisgIHR5cGVkZWYgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+IGlzdHJlYW1fdHlwZTsKKworICB0eXBlZGVmIGlucHV0X2l0ZXJhdG9yX3RhZyAgICAgICAgICAgICBpdGVyYXRvcl9jYXRlZ29yeTsKKyAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiBfRGlzdCAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICB0eXBlZGVmIGNvbnN0IF9UcCogICAgICAgICAgICAgICAgICAgICBwb2ludGVyOworICB0eXBlZGVmIGNvbnN0IF9UcCYgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisKKyAgaXN0cmVhbV9pdGVyYXRvcigpIDogX01fc3RyZWFtKDApLCBfTV9vayhmYWxzZSksIF9NX3JlYWRfZG9uZSh0cnVlKSB7fQorICBpc3RyZWFtX2l0ZXJhdG9yKGlzdHJlYW1fdHlwZSYgX19zKSA6IF9NX3N0cmVhbSgmX19zKSwgX01fb2soZmFsc2UpLCBfTV9yZWFkX2RvbmUoZmFsc2UpIHt9CisKKyAgcmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICBpZiAoIV9NX3JlYWRfZG9uZSkgeworICAgICAgX01fcmVhZCgpOworICAgIH0KKyAgICByZXR1cm4gX01fdmFsdWU7CisgIH0KKworICBfU1RMUF9ERUZJTkVfQVJST1dfT1BFUkFUT1IKKworICBfU2VsZiYgb3BlcmF0b3IrKygpIHsKKyAgICBfTV9yZWFkKCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIF9TZWxmIG9wZXJhdG9yKysoaW50KSAgeworICAgIF9TZWxmIF9fdG1wID0gKnRoaXM7CisgICAgX01fcmVhZCgpOworICAgIHJldHVybiBfX3RtcDsKKyAgfQorCisgIGJvb2wgX01fZXF1YWwoY29uc3QgX1NlbGYmIF9feCkgY29uc3QgeworICAgIGlmICghX01fcmVhZF9kb25lKSB7CisgICAgICBfTV9yZWFkKCk7CisgICAgfQorICAgIGlmICghX194Ll9NX3JlYWRfZG9uZSkgeworICAgICAgX194Ll9NX3JlYWQoKTsKKyAgICB9CisgICAgcmV0dXJuIChfTV9vayA9PSBfX3guX01fb2spICYmICghX01fb2sgfHwgX01fc3RyZWFtID09IF9feC5fTV9zdHJlYW0pOworICB9CisKK3ByaXZhdGU6CisgIGlzdHJlYW1fdHlwZSogX01fc3RyZWFtOworICBtdXRhYmxlIF9UcCBfTV92YWx1ZTsKKyAgbXV0YWJsZSBib29sIF9NX29rOworICBtdXRhYmxlIGJvb2wgX01fcmVhZF9kb25lOworCisgIHZvaWQgX01fcmVhZCgpIGNvbnN0IHsKKyAgICBfU1RMUF9NVVRBQkxFKF9TZWxmLCBfTV9vaykgPSAoKF9NX3N0cmVhbSAhPSAwKSAmJiAhX01fc3RyZWFtLT5mYWlsKCkpOworICAgIGlmIChfTV9vaykgeworICAgICAgKl9NX3N0cmVhbSA+PiBfU1RMUF9NVVRBQkxFKF9TZWxmLCBfTV92YWx1ZSk7CisgICAgICBfU1RMUF9NVVRBQkxFKF9TZWxmLCBfTV9vaykgPSAhX01fc3RyZWFtLT5mYWlsKCk7CisgICAgfQorICAgIF9TVExQX01VVEFCTEUoX1NlbGYsIF9NX3JlYWRfZG9uZSkgPSB0cnVlOworICB9Cit9OworCisjaWYgIWRlZmluZWQgKF9TVExQX0xJTUlURURfREVGQVVMVF9URU1QTEFURVMpCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwUCwKKyAgICAgICAgICBjbGFzcyBfQ2hhclQgPSBjaGFyLCBjbGFzcyBfVHJhaXRzID0gY2hhcl90cmFpdHM8X0NoYXJUPiA+CisjZWxzZQordGVtcGxhdGUgPGNsYXNzIF9UcFA+CisjZW5kaWYKK2NsYXNzIG9zdHJlYW1faXRlcmF0b3I6IHB1YmxpYyBpdGVyYXRvcjxvdXRwdXRfaXRlcmF0b3JfdGFnLCB2b2lkLCB2b2lkLCB2b2lkLCB2b2lkPiB7CisjaWYgZGVmaW5lZCAoX1NUTFBfTElNSVRFRF9ERUZBVUxUX1RFTVBMQVRFUykKKyAgdHlwZWRlZiBjaGFyIF9DaGFyVDsKKyAgdHlwZWRlZiBjaGFyX3RyYWl0czxjaGFyPiBfVHJhaXRzOworICB0eXBlZGVmIG9zdHJlYW1faXRlcmF0b3I8X1RwUD4gX1NlbGY7CisjZWxzZQorICB0eXBlZGVmIG9zdHJlYW1faXRlcmF0b3I8X1RwUCwgX0NoYXJULCBfVHJhaXRzPiBfU2VsZjsKKyNlbmRpZgorcHVibGljOgorICB0eXBlZGVmIF9DaGFyVCAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX3R5cGU7CisgIHR5cGVkZWYgX1RyYWl0cyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190eXBlOworICB0eXBlZGVmIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiBvc3RyZWFtX3R5cGU7CisKKyAgdHlwZWRlZiBvdXRwdXRfaXRlcmF0b3JfdGFnICAgICAgICAgICAgaXRlcmF0b3JfY2F0ZWdvcnk7CisKKyAgb3N0cmVhbV9pdGVyYXRvcihvc3RyZWFtX3R5cGUmIF9fcykgOiBfTV9zdHJlYW0oJl9fcyksIF9NX3N0cmluZygwKSB7fQorICBvc3RyZWFtX2l0ZXJhdG9yKG9zdHJlYW1fdHlwZSYgX19zLCBjb25zdCBfQ2hhclQqIF9fYykKKyAgICA6IF9NX3N0cmVhbSgmX19zKSwgX01fc3RyaW5nKF9fYykgIHt9CisgIF9TZWxmJiBvcGVyYXRvcj0oY29uc3QgX1RwUCYgX192YWwpIHsKKyAgICAqX01fc3RyZWFtIDw8IF9fdmFsOworICAgIGlmIChfTV9zdHJpbmcpICpfTV9zdHJlYW0gPDwgX01fc3RyaW5nOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBfU2VsZiYgb3BlcmF0b3IqKCkgeyByZXR1cm4gKnRoaXM7IH0KKyAgX1NlbGYmIG9wZXJhdG9yKysoKSB7IHJldHVybiAqdGhpczsgfQorICBfU2VsZiYgb3BlcmF0b3IrKyhpbnQpIHsgcmV0dXJuICp0aGlzOyB9Citwcml2YXRlOgorICBvc3RyZWFtX3R5cGUqIF9NX3N0cmVhbTsKKyAgY29uc3QgX0NoYXJUKiBfTV9zdHJpbmc7Cit9OworCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX09MRF9IUF9JVEVSQVRPUl9RVUVSSUVTKQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfTElNSVRFRF9ERUZBVUxUX1RFTVBMQVRFUykKK3RlbXBsYXRlIDxjbGFzcyBfVHBQPgoraW5saW5lIG91dHB1dF9pdGVyYXRvcl90YWcgX1NUTFBfQ0FMTAoraXRlcmF0b3JfY2F0ZWdvcnkoY29uc3Qgb3N0cmVhbV9pdGVyYXRvcjxfVHBQPiYpIHsgcmV0dXJuIG91dHB1dF9pdGVyYXRvcl90YWcoKTsgfQorIyAgZWxzZQordGVtcGxhdGUgPGNsYXNzIF9UcFAsIGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2lubGluZSBvdXRwdXRfaXRlcmF0b3JfdGFnIF9TVExQX0NBTEwKK2l0ZXJhdG9yX2NhdGVnb3J5KGNvbnN0IG9zdHJlYW1faXRlcmF0b3I8X1RwUCwgX0NoYXJULCBfVHJhaXRzPiYpIHsgcmV0dXJuIG91dHB1dF9pdGVyYXRvcl90YWcoKTsgfQorIyAgZW5kaWYKKyNlbmRpZgorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKy8vIGZvcm0taW5kZXBlbmRlbnQgZGVmaW5pb3Rpb24gb2Ygc3RyZWFtIGl0ZXJhdG9ycworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKK3RlbXBsYXRlIDwgX19JU0lfVE1QTF9IRUFERVJfQVJHVU1FTlRTID4KK2lubGluZSBib29sIF9TVExQX0NBTEwKK29wZXJhdG9yPT0oY29uc3QgaXN0cmVhbV9pdGVyYXRvcjwgX19JU0lfVE1QTF9BUkdVTUVOVFMgPiYgX194LAorICAgICAgICAgICBjb25zdCBpc3RyZWFtX2l0ZXJhdG9yPCBfX0lTSV9UTVBMX0FSR1VNRU5UUyA+JiBfX3kpCit7IHJldHVybiBfX3guX01fZXF1YWwoX195KTsgfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1NFUEFSQVRFX1JFTE9QU19OQU1FU1BBQ0UpCit0ZW1wbGF0ZSA8IF9fSVNJX1RNUExfSEVBREVSX0FSR1VNRU5UUyA+CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMCitvcGVyYXRvciE9KGNvbnN0IGlzdHJlYW1faXRlcmF0b3I8IF9fSVNJX1RNUExfQVJHVU1FTlRTID4mIF9feCwKKyAgICAgICAgICAgY29uc3QgaXN0cmVhbV9pdGVyYXRvcjwgX19JU0lfVE1QTF9BUkdVTUVOVFMgPiYgX195KQoreyByZXR1cm4gIV9feC5fTV9lcXVhbChfX3kpOyB9CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9PTERfSFBfSVRFUkFUT1JfUVVFUklFUykKK3RlbXBsYXRlIDwgX19JU0lfVE1QTF9IRUFERVJfQVJHVU1FTlRTID4KK2lubGluZSBpbnB1dF9pdGVyYXRvcl90YWcgX1NUTFBfQ0FMTAoraXRlcmF0b3JfY2F0ZWdvcnkoY29uc3QgaXN0cmVhbV9pdGVyYXRvcjwgX19JU0lfVE1QTF9BUkdVTUVOVFMgPiYpCit7IHJldHVybiBpbnB1dF9pdGVyYXRvcl90YWcoKTsgfQordGVtcGxhdGUgPCBfX0lTSV9UTVBMX0hFQURFUl9BUkdVTUVOVFMgPgoraW5saW5lIF9UcCogX1NUTFBfQ0FMTAordmFsdWVfdHlwZShjb25zdCBpc3RyZWFtX2l0ZXJhdG9yPCBfX0lTSV9UTVBMX0FSR1VNRU5UUyA+JikgeyByZXR1cm4gKF9UcCopIDA7IH0KKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfTUlOSU1VTV9ERUZBVUxUX1RFTVBMQVRFX1BBUkFNUykgJiYgIWRlZmluZWQgKF9TVExQX0RFRkFVTFRfVFlQRV9QQVJBTSkKK3RlbXBsYXRlIDwgX19JU0lfVE1QTF9IRUFERVJfQVJHVU1FTlRTID4KK2lubGluZSBwdHJkaWZmX3QqIF9TVExQX0NBTEwKK2Rpc3RhbmNlX3R5cGUoY29uc3QgaXN0cmVhbV9pdGVyYXRvcjwgX19JU0lfVE1QTF9BUkdVTUVOVFMgPiYpIHsgcmV0dXJuIChwdHJkaWZmX3QqKTA7IH0KKyMgIGVsc2UKK3RlbXBsYXRlIDwgX19JU0lfVE1QTF9IRUFERVJfQVJHVU1FTlRTID4KK2lubGluZSBfRGlzdCogX1NUTFBfQ0FMTAorZGlzdGFuY2VfdHlwZShjb25zdCBpc3RyZWFtX2l0ZXJhdG9yPCBfX0lTSV9UTVBMX0FSR1VNRU5UUyA+JikgeyByZXR1cm4gKF9EaXN0KikwOyB9CisjICBlbmRpZiAvKiBfU1RMUF9NSU5JTVVNX0RFRkFVTFRfVEVNUExBVEVfUEFSQU1TICovCisjZW5kaWYKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjdW5kZWYgX19JU0lfVE1QTF9IRUFERVJfQVJHVU1FTlRTCisjdW5kZWYgX19JU0lfVE1QTF9BUkdVTUVOVFMKKworI2VuZGlmIC8qIF9TVExQX0lOVEVSTkFMX1NUUkVBTV9JVEVSQVRPUl9IICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX3N0cmVhbWJ1Zi5jIGIvc3RscG9ydC9zdGwvX3N0cmVhbWJ1Zi5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzdGwvX3N0cmVhbWJ1Zi5jCnJlbmFtZSB0byBzdGxwb3J0L3N0bC9fc3RyZWFtYnVmLmMKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL19zdHJlYW1idWYuaCBiL3N0bHBvcnQvc3RsL19zdHJlYW1idWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzM2YjBmCi0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvX3N0cmVhbWJ1Zi5oCkBAIC0wLDAgKzEsMjg3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9TVFJFQU1CVUYKKyNkZWZpbmUgX1NUTFBfSU5URVJOQUxfU1RSRUFNQlVGCisKKyNpZm5kZWYgX1NUTFBfSU9TX0JBU0VfSAorIyAgaW5jbHVkZSA8c3RsL19pb3NfYmFzZS5oPiAgICAgIC8vIE5lZWRlZCBmb3IgaW9zX2Jhc2UgYml0ZmllbGQgbWVtYmVycy4KKyNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA8aW9zX2Jhc2U+IGluY2x1ZGVzIDxpb3Nmd2Q+LgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDbGFzcyBiYXNpY19zdHJlYW1idWY8PiwgdGhlIGJhc2UgY2xhc3Mgb2YgdGhlIHN0cmVhbWJ1ZiBoaWVyYXJjaHkuCisKKy8vIEEgYmFzaWNfc3RyZWFtYnVmPD4gbWFuYWdlcyBhbiBpbnB1dCAoZ2V0KSBhcmVhIGFuZCBhbiBvdXRwdXQgKHB1dCkKKy8vIGFyZWEuICBFYWNoIGlzIGRlc2NyaWJlZCBieSB0aHJlZSBwb2ludGVyczogYSBiZWdpbm5pbmcsIGFuIGVuZCwgYW5kIGEKKy8vIGN1cnJlbnQgcG9zaXRpb24uICBiYXNpY19zdHJlYW1idWY8PiBjb250YWlucyBzb21lIHZlcnkgc2ltcGxlIG1lbWJlcgorLy8gZnVuY3Rpb25zIHRoYXQgbWFuaXB1bGF0ZSB0aG9zZSBzaXggcG9pbnRlcnMsIGJ1dCBhbG1vc3QgYWxsIG9mIHRoZSByZWFsCisvLyBmdW5jdGlvbmFsaXR5IGdldHMgZGVsZWdhdGVkIHRvIHByb3RlY3RlZCB2aXJ0dWFsIG1lbWJlciBmdW5jdGlvbnMuCisvLyBBbGwgb2YgdGhlIHB1YmxpYyBtZW1iZXIgZnVuY3Rpb25zIGFyZSBpbmxpbmUsIGFuZCBtb3N0IG9mIHRoZSBwcm90ZWN0ZWQKKy8vIG1lbWJlciBmdW5jdGlvbnMgYXJlIHZpcnR1YWwuCisKKy8vIEFsdGhvdWdoIGJhc2ljX3N0cmVhbWJ1Zjw+IGlzIG5vdCBhYnN0cmFjdCwgaXQgaXMgdXNlZnVsIG9ubHkgYXMgYSBiYXNlCisvLyBjbGFzcy4gIEl0cyB2aXJ0dWFsIG1lbWJlciBmdW5jdGlvbnMgaGF2ZSBkZWZhdWx0IGRlZmluaXRpb25zIHN1Y2ggdGhhdAorLy8gcmVhZGluZyBmcm9tIGEgYmFzaWNfc3RyZWFtYnVmPD4gd2lsbCBhbHdheXMgeWllbGQgRU9GLCBhbmQgd3JpdGluZyB0byBhCisvLyBiYXNpY19zdHJlYW1idWY8PiB3aWxsIGFsd2F5cyBmYWlsLgorCisvLyBUaGUgc2Vjb25kIHRlbXBsYXRlIHBhcmFtZXRlciwgX1RyYWl0cywgZGVmYXVsdHMgdG8gY2hhcl90cmFpdHM8X0NoYXJUPi4KKy8vIFRoZSBkZWZhdWx0IGlzIGRlY2xhcmVkIGluIGhlYWRlciA8aW9zZndkPiwgYW5kIGl0IGlzbid0IGRlY2xhcmVkIGhlcmUKKy8vIGJlY2F1c2UgQysrIGxhbmd1YWdlIHJ1bGVzIGRvIG5vdCBhbGxvdyBpdCB0byBiZSBkZWNsYXJlZCB0d2ljZS4KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2NsYXNzIGJhc2ljX3N0cmVhbWJ1ZiB7CisgIGZyaWVuZCBjbGFzcyBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz47CisgIGZyaWVuZCBjbGFzcyBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz47CisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHlwZWRlZnMuCisgIHR5cGVkZWYgX0NoYXJUICAgICAgICAgICAgICAgICAgICAgY2hhcl90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmludF90eXBlIGludF90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OnBvc190eXBlIHBvc190eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6Om9mZl90eXBlIG9mZl90eXBlOworICB0eXBlZGVmIF9UcmFpdHMgICAgICAgICAgICAgICAgICAgIHRyYWl0c190eXBlOworCitwcml2YXRlOiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERhdGEgbWVtYmVycy4KKworICBjaGFyX3R5cGUqIF9NX2diZWdpbjsgICAgICAgICAvLyBCZWdpbm5pbmcgb2YgZ2V0IGFyZWEKKyAgY2hhcl90eXBlKiBfTV9nbmV4dDsgICAgICAgICAgLy8gQ3VycmVudCBwb3NpdGlvbiB3aXRoaW4gdGhlIGdldCBhcmVhCisgIGNoYXJfdHlwZSogX01fZ2VuZDsgICAgICAgICAgIC8vIEVuZCBvZiBnZXQgYXJlYQorCisgIGNoYXJfdHlwZSogX01fcGJlZ2luOyAgICAgICAgIC8vIEJlZ2lubmluZyBvZiBwdXQgYXJlYQorICBjaGFyX3R5cGUqIF9NX3BuZXh0OyAgICAgICAgICAvLyBDdXJyZW50IHBvc2l0aW9uIHdpdGhpbiB0aGUgcHV0IGFyZWEKKyAgY2hhcl90eXBlKiBfTV9wZW5kOyAgICAgICAgICAgLy8gRW5kIG9mIHB1dCBhcmVhCisKKyAgbG9jYWxlIF9NX2xvY2FsZTsgICAgICAgICAgICAgLy8gVGhlIHN0cmVhbWJ1ZidzIGxvY2FsZSBvYmplY3QKKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEZXN0cnVjdG9yLgorICB2aXJ0dWFsIH5iYXNpY19zdHJlYW1idWYoKTsKKworcHJvdGVjdGVkOiAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgYmFzaWNfc3RyZWFtYnVmKCkKKyNpZiBkZWZpbmVkIChfU1RMUF9NU1ZDKSAmJiAoX1NUTFBfTVNWQyA8IDEzMDApICYmIGRlZmluZWQgKF9TVExQX1VTRV9TVEFUSUNfTElCKQorICAgIC8vV2UgbWFrZSBpdCBpbmxpbmUgdG8gYXZvaWQgdW5yZXNvbHZlZCBzeW1ib2wuCisgICAgOiBfTV9nYmVnaW4oMCksIF9NX2duZXh0KDApLCBfTV9nZW5kKDApLAorICAgICAgX01fcGJlZ2luKDApLCBfTV9wbmV4dCgwKSwgX01fcGVuZCgwKSwKKyAgICAgIF9NX2xvY2FsZSgpCisgIHt9CisjZWxzZQorICA7CisjZW5kaWYKKworcHJvdGVjdGVkOiAgICAgICAgICAgICAgICAgICAgICAvLyBQcm90ZWN0ZWQgaW50ZXJmYWNlIHRvIHRoZSBnZXQgYXJlYS4KKyAgY2hhcl90eXBlKiBlYmFjaygpIGNvbnN0IHsgcmV0dXJuIF9NX2diZWdpbjsgfSAvLyBCZWdpbm5pbmcKKyAgY2hhcl90eXBlKiBncHRyKCkgIGNvbnN0IHsgcmV0dXJuIF9NX2duZXh0OyB9ICAvLyBDdXJyZW50IHBvc2l0aW9uCisgIGNoYXJfdHlwZSogZWdwdHIoKSBjb25zdCB7IHJldHVybiBfTV9nZW5kOyB9ICAgLy8gRW5kCisKKyAgdm9pZCBnYnVtcChpbnQgX19uKSB7IF9NX2duZXh0ICs9IF9fbjsgfQorICB2b2lkIHNldGcoY2hhcl90eXBlKiBfX2diZWdpbiwgY2hhcl90eXBlKiBfX2duZXh0LCBjaGFyX3R5cGUqIF9fZ2VuZCkgeworICAgIF9NX2diZWdpbiA9IF9fZ2JlZ2luOworICAgIF9NX2duZXh0ICA9IF9fZ25leHQ7CisgICAgX01fZ2VuZCAgID0gX19nZW5kOworICB9CisKK3B1YmxpYzoKKyAgLy8gQW4gYWx0ZXJuYXRlIHB1YmxpYyBpbnRlcmZhY2UgdG8gdGhlIGFib3ZlIGZ1bmN0aW9ucworICAvLyB3aGljaCBhbGxvd3MgdXMgdG8gYXZvaWQgdXNpbmcgdGVtcGxhdGVkIGZyaWVuZHMgd2hpY2gKKyAgLy8gYXJlIG5vdCBzdXBwb3J0ZWQgb24gc29tZSBjb21waWxlcnMuCisgIGNoYXJfdHlwZSogX01fZWJhY2soKSBjb25zdCB7IHJldHVybiBlYmFjaygpOyB9CisgIGNoYXJfdHlwZSogX01fZ3B0cigpICBjb25zdCB7IHJldHVybiBncHRyKCk7IH0KKyAgY2hhcl90eXBlKiBfTV9lZ3B0cigpIGNvbnN0IHsgcmV0dXJuIGVncHRyKCk7IH0KKyAgdm9pZCBfTV9nYnVtcChpbnQgX19uKSAgICAgIHsgZ2J1bXAoX19uKTsgfQorICB2b2lkIF9NX3NldGcoY2hhcl90eXBlKiBfX2diZWdpbiwgY2hhcl90eXBlKiBfX2duZXh0LCBjaGFyX3R5cGUqIF9fZ2VuZCkKKyAgeyB0aGlzLT5zZXRnKF9fZ2JlZ2luLCBfX2duZXh0LCBfX2dlbmQpOyB9CisKK3Byb3RlY3RlZDogICAgICAgICAgICAgICAgICAgICAgLy8gUHJvdGVjdGVkIGludGVyZmFjZSB0byB0aGUgcHV0IGFyZWEKKworICBjaGFyX3R5cGUqIHBiYXNlKCkgY29uc3QgeyByZXR1cm4gX01fcGJlZ2luOyB9IC8vIEJlZ2lubmluZworICBjaGFyX3R5cGUqIHBwdHIoKSAgY29uc3QgeyByZXR1cm4gX01fcG5leHQ7IH0gIC8vIEN1cnJlbnQgcG9zaXRpb24KKyAgY2hhcl90eXBlKiBlcHB0cigpIGNvbnN0IHsgcmV0dXJuIF9NX3BlbmQ7IH0gICAvLyBFbmQKKworICB2b2lkIHBidW1wKGludCBfX24pIHsgX01fcG5leHQgKz0gX19uOyB9CisgIHZvaWQgc2V0cChjaGFyX3R5cGUqIF9fcGJlZ2luLCBjaGFyX3R5cGUqIF9fcGVuZCkgeworICAgIF9NX3BiZWdpbiA9IF9fcGJlZ2luOworICAgIF9NX3BuZXh0ICA9IF9fcGJlZ2luOworICAgIF9NX3BlbmQgICA9IF9fcGVuZDsKKyAgfQorCitwcm90ZWN0ZWQ6ICAgICAgICAgICAgICAgICAgICAgIC8vIFZpcnR1YWwgYnVmZmVyIG1hbmFnZW1lbnQgZnVuY3Rpb25zLgorCisgIHZpcnR1YWwgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIHNldGJ1ZihjaGFyX3R5cGUqLCBzdHJlYW1zaXplKTsKKworICAvLyBBbHRlcnMgdGhlIHN0cmVhbSBwb3NpdGlvbiwgdXNpbmcgYW4gaW50ZWdlciBvZmZzZXQuICBJbiB0aGlzCisgIC8vIGNsYXNzIHNlZWtvZmYgZG9lcyBub3RoaW5nOyBzdWJjbGFzc2VzIGFyZSBleHBlY3RlZCB0byBvdmVycmlkZSBpdC4KKyAgdmlydHVhbCBwb3NfdHlwZSBzZWVrb2ZmKG9mZl90eXBlLCBpb3NfYmFzZTo6c2Vla2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjpvcGVubW9kZSA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpOworCisgIC8vIEFsdGVycyB0aGUgc3RyZWFtIHBvc2l0aW9uLCB1c2luZyBhIHByZXZpb3VzbHkgb2J0YWluZWQgc3RyZWFtcG9zLiAgSW4KKyAgLy8gdGhpcyBjbGFzcyBzZWVrcG9zIGRvZXMgbm90aGluZzsgc3ViY2xhc3NlcyBhcmUgZXhwZWN0ZWQgdG8gb3ZlcnJpZGUgaXQuCisgIHZpcnR1YWwgcG9zX3R5cGUKKyAgc2Vla3Bvcyhwb3NfdHlwZSwgaW9zX2Jhc2U6Om9wZW5tb2RlID0gaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6Om91dCk7CisKKyAgLy8gU3luY2hyb25pemVzIChpLmUuIGZsdXNoZXMpIHRoZSBidWZmZXIuICBBbGwgc3ViY2xhc3NlcyBhcmUgZXhwZWN0ZWQgdG8KKyAgLy8gb3ZlcnJpZGUgdGhpcyB2aXJ0dWFsIG1lbWJlciBmdW5jdGlvbi4KKyAgdmlydHVhbCBpbnQgc3luYygpOworCisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gQnVmZmVyIG1hbmFnZW1lbnQuCisgIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBwdWJzZXRidWYoY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uKQorICB7IHJldHVybiB0aGlzLT5zZXRidWYoX19zLCBfX24pOyB9CisKKyAgcG9zX3R5cGUgcHVic2Vla29mZihvZmZfdHlwZSBfX29mZnNldCwgaW9zX2Jhc2U6OnNlZWtkaXIgX193YXksCisgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kID0gaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6Om91dCkKKyAgeyByZXR1cm4gdGhpcy0+c2Vla29mZihfX29mZnNldCwgX193YXksIF9fbW9kKTsgfQorCisgIHBvc190eXBlIHB1YnNlZWtwb3MocG9zX3R5cGUgX19zcCwKKyAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2QgPSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0KQorICB7IHJldHVybiB0aGlzLT5zZWVrcG9zKF9fc3AsIF9fbW9kKTsgfQorCisgIGludCBwdWJzeW5jKCkgeyByZXR1cm4gdGhpcy0+c3luYygpOyB9CisKK3Byb3RlY3RlZDogICAgICAgICAgICAgICAgICAgICAgLy8gVmlydHVhbCBnZXQgYXJlYSBmdW5jdGlvbnMsIGFzIGRlZmluZWQgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTcuNS4yLjQuMyBhbmQgMTcuNS4yLjQuNCBvZiB0aGUgc3RhbmRhcmQuCisgIC8vIFJldHVybnMgYSBsb3dlciBib3VuZCBvbiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdGhhdCB3ZSBjYW4gcmVhZCwKKyAgLy8gd2l0aCB1bmRlcmZsb3csIGJlZm9yZSByZWFjaGluZyBlbmQgb2YgZmlsZS4gICgtMSBpcyBhIHNwZWNpYWwgdmFsdWU6CisgIC8vIGl0IG1lYW5zIHRoYXQgdW5kZXJmbG93IHdpbGwgZmFpbC4pICBNb3N0IHN1YmNsYXNzZXMgc2hvdWxkIHByb2JhYmx5CisgIC8vIG92ZXJyaWRlIHRoaXMgdmlydHVhbCBtZW1iZXIgZnVuY3Rpb24uCisgIHZpcnR1YWwgc3RyZWFtc2l6ZSBzaG93bWFueWMoKTsKKworICAvLyBSZWFkcyB1cCB0byBfX24gY2hhcmFjdGVycy4gIFJldHVybiB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mCisgIC8vIGNoYXJhY3RlcnMgcmVhZC4KKyAgdmlydHVhbCBzdHJlYW1zaXplIHhzZ2V0bihjaGFyX3R5cGUqIF9fcywgc3RyZWFtc2l6ZSBfX24pOworCisgIC8vIENhbGxlZCB3aGVuIHRoZXJlIGlzIG5vIHJlYWQgcG9zaXRpb24sIGkuZS4gd2hlbiBncHRyKCkgaXMgbnVsbAorICAvLyBvciB3aGVuIGdwdHIoKSA+PSBlZ3B0cigpLiAgU3ViY2xhc3NlcyBhcmUgZXhwZWN0ZWQgdG8gb3ZlcnJpZGUKKyAgLy8gdGhpcyB2aXJ0dWFsIG1lbWJlciBmdW5jdGlvbi4KKyAgdmlydHVhbCBpbnRfdHlwZSB1bmRlcmZsb3coKTsKKworICAvLyBTaW1pbGFyIHRvIHVuZGVyZmxvdygpLCBidXQgdXNlZCBmb3IgdW5idWZmZXJlZCBpbnB1dC4gIE1vc3QKKyAgLy8gc3ViY2xhc3NlcyBzaG91bGQgcHJvYmFibHkgb3ZlcnJpZGUgdGhpcyB2aXJ0dWFsIG1lbWJlciBmdW5jdGlvbi4KKyAgdmlydHVhbCBpbnRfdHlwZSB1ZmxvdygpOworCisgIC8vIENhbGxlZCB3aGVuIHRoZXJlIGlzIG5vIHB1dGJhY2sgcG9zaXRpb24sIGkuZS4gd2hlbiBncHRyKCkgaXMgbnVsbAorICAvLyBvciB3aGVuIGdwdHIoKSA9PSBlYmFjaygpLiAgQWxsIHN1YmNsYXNzZXMgYXJlIGV4cGVjdGVkIHRvIG92ZXJyaWRlCisgIC8vIHRoaXMgdmlydHVhbCBtZW1iZXIgZnVuY3Rpb24uCisgIHZpcnR1YWwgaW50X3R5cGUgcGJhY2tmYWlsKGludF90eXBlID0gdHJhaXRzX3R5cGU6OmVvZigpKTsKKworcHJvdGVjdGVkOiAgICAgICAgICAgICAgICAgICAgICAvLyBWaXJ0dWFsIHB1dCBhcmVhIGZ1bmN0aW9ucywgYXMgZGVmaW5lZCBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyNy41LjIuNC41IG9mIHRoZSBzdGFuZGFyZC4KKworICAvLyBXcml0ZXMgdXAgdG8gX19uIGNoYXJhY3RlcnMuICBSZXR1cm4gdmFsdWUgaXMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzCisgIC8vIHdyaXR0ZW4uCisgIHZpcnR1YWwgc3RyZWFtc2l6ZSB4c3B1dG4oY29uc3QgY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uKTsKKworICAvLyBFeHRlbnNpb246IHdyaXRlcyB1cCB0byBfX24gY29waWVzIG9mIF9fYy4gIFJldHVybiB2YWx1ZSBpcyB0aGUgbnVtYmVyCisgIC8vIG9mIGNoYXJhY3RlcnMgd3JpdHRlbi4KKyAgdmlydHVhbCBzdHJlYW1zaXplIF9NX3hzcHV0bmMoY2hhcl90eXBlIF9fYywgc3RyZWFtc2l6ZSBfX24pOworCisgIC8vIENhbGxlZCB3aGVuIHRoZXJlIGlzIG5vIHdyaXRlIHBvc2l0aW9uLiAgQWxsIHN1YmNsYXNzZXMgYXJlIGV4cGVjdGVkIHRvCisgIC8vIG92ZXJyaWRlIHRoaXMgdmlydHVhbCBtZW1iZXIgZnVuY3Rpb24uCisgIHZpcnR1YWwgaW50X3R5cGUgb3ZlcmZsb3coaW50X3R5cGUgPSB0cmFpdHNfdHlwZTo6ZW9mKCkpOworCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFB1YmxpYyBtZW1iZXJzIGZvciB3cml0aW5nIGNoYXJhY3RlcnMuCisgIC8vIFdyaXRlIGEgc2luZ2xlIGNoYXJhY3Rlci4KKyAgaW50X3R5cGUgc3B1dGMoY2hhcl90eXBlIF9fYykgeworICAgIHJldHVybiAoKF9NX3BuZXh0IDwgX01fcGVuZCkgPyBfVHJhaXRzOjp0b19pbnRfdHlwZSgqX01fcG5leHQrKyA9IF9fYykKKyAgICAgIDogdGhpcy0+b3ZlcmZsb3coX1RyYWl0czo6dG9faW50X3R5cGUoX19jKSkpOworICB9CisKKyAgLy8gV3JpdGUgX19uIGNoYXJhY3RlcnMuCisgIHN0cmVhbXNpemUgc3B1dG4oY29uc3QgY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uKQorICB7IHJldHVybiB0aGlzLT54c3B1dG4oX19zLCBfX24pOyB9CisKKyAgLy8gRXh0ZW5zaW9uOiB3cml0ZSBfX24gY29waWVzIG9mIF9fYy4KKyAgc3RyZWFtc2l6ZSBfTV9zcHV0bmMoY2hhcl90eXBlIF9fYywgc3RyZWFtc2l6ZSBfX24pCisgIHsgcmV0dXJuIHRoaXMtPl9NX3hzcHV0bmMoX19jLCBfX24pOyB9CisKK3ByaXZhdGU6ICAgICAgICAgICAgICAgICAgICAgICAgLy8gSGVscGVyIGZ1bmN0aW9ucy4KKyAgaW50X3R5cGUgX01fc25leHRjX2F1eCgpOworCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFB1YmxpYyBtZW1iZXJzIGZvciByZWFkaW5nIGNoYXJhY3RlcnMuCisgIHN0cmVhbXNpemUgaW5fYXZhaWwoKSB7CisgICAgcmV0dXJuIChfTV9nbmV4dCA8IF9NX2dlbmQpID8gKF9NX2dlbmQgLSBfTV9nbmV4dCkgOiB0aGlzLT5zaG93bWFueWMoKTsKKyAgfQorCisgIC8vIEFkdmFuY2UgdG8gdGhlIG5leHQgY2hhcmFjdGVyIGFuZCByZXR1cm4gaXQuCisgIGludF90eXBlIHNuZXh0YygpIHsKKyAgcmV0dXJuICggX01fZ2VuZCAtIF9NX2duZXh0ID4gMSA/CisgICAgICAgICAgICAgX1RyYWl0czo6dG9faW50X3R5cGUoKisrX01fZ25leHQpIDoKKyAgICAgICAgICAgICB0aGlzLT5fTV9zbmV4dGNfYXV4KCkpOworICB9CisKKyAgLy8gUmV0dXJuIHRoZSBjdXJyZW50IGNoYXJhY3RlciBhbmQgYWR2YW5jZSB0byB0aGUgbmV4dC4KKyAgaW50X3R5cGUgc2J1bXBjKCkgeworICAgIHJldHVybiBfTV9nbmV4dCA8IF9NX2dlbmQgPyBfVHJhaXRzOjp0b19pbnRfdHlwZSgqX01fZ25leHQrKykKKyAgICAgIDogdGhpcy0+dWZsb3coKTsKKyAgfQorCisgIC8vIFJldHVybiB0aGUgY3VycmVudCBjaGFyYWN0ZXIgd2l0aG91dCBhZHZhbmNpbmcgdG8gdGhlIG5leHQuCisgIGludF90eXBlIHNnZXRjKCkgeworICAgIHJldHVybiBfTV9nbmV4dCA8IF9NX2dlbmQgPyBfVHJhaXRzOjp0b19pbnRfdHlwZSgqX01fZ25leHQpCisgICAgICA6IHRoaXMtPnVuZGVyZmxvdygpOworICB9CisKKyAgc3RyZWFtc2l6ZSBzZ2V0bihjaGFyX3R5cGUqIF9fcywgc3RyZWFtc2l6ZSBfX24pCisgIHsgcmV0dXJuIHRoaXMtPnhzZ2V0bihfX3MsIF9fbik7IH0KKworICBpbnRfdHlwZSBzcHV0YmFja2MoY2hhcl90eXBlIF9fYykgeworICAgIHJldHVybiAoKF9NX2diZWdpbiA8IF9NX2duZXh0KSAmJiBfVHJhaXRzOjplcShfX2MsICooX01fZ25leHQgLSAxKSkpCisgICAgICA/IF9UcmFpdHM6OnRvX2ludF90eXBlKCotLV9NX2duZXh0KQorICAgICAgOiB0aGlzLT5wYmFja2ZhaWwoX1RyYWl0czo6dG9faW50X3R5cGUoX19jKSk7CisgIH0KKworICBpbnRfdHlwZSBzdW5nZXRjKCkgeworICAgIHJldHVybiAoX01fZ2JlZ2luIDwgX01fZ25leHQpCisgICAgICA/IF9UcmFpdHM6OnRvX2ludF90eXBlKCotLV9NX2duZXh0KQorICAgICAgOiB0aGlzLT5wYmFja2ZhaWwoKTsKKyAgfQorCitwcm90ZWN0ZWQ6ICAgICAgICAgICAgICAgICAgICAgIC8vIFZpcnR1YWwgbG9jYWxlIGZ1bmN0aW9ucy4KKworICAvLyBUaGlzIGlzIGEgaG9vaywgY2FsbGVkIGJ5IHB1YmltYnVlKCkganVzdCBiZWZvcmUgcHViaW1idWUoKQorICAvLyBzZXRzIHRoZSBzdHJlYW1idWYncyBsb2NhbGUgdG8gX19sb2MuICBOb3RlIHRoYXQgaW1idWUgc2hvdWxkCisgIC8vIG5vdCAoYW5kIGNhbm5vdCwgc2luY2UgaXQgaGFzIG5vIGFjY2VzcyB0byBzdHJlYW1idWYncyBwcml2YXRlCisgIC8vIG1lbWJlcnMpIHNldCB0aGUgc3RyZWFtYnVmJ3MgbG9jYWxlIGl0c2VsZi4KKyAgdmlydHVhbCB2b2lkIGltYnVlKGNvbnN0IGxvY2FsZSYpOworCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExvY2FsZS1yZWxhdGVkIGZ1bmN0aW9ucy4KKyAgbG9jYWxlIHB1YmltYnVlKGNvbnN0IGxvY2FsZSYpOworICBsb2NhbGUgZ2V0bG9jKCkgY29uc3QgeyByZXR1cm4gX01fbG9jYWxlOyB9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fQU5BQ0hST05JU01TKQorICB2b2lkIHN0b3NzYygpIHsgdGhpcy0+c2J1bXBjKCk7IH0KKyNlbmRpZgorfTsKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9URU1QTEFURV9FWFBPUlQpCitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgYmFzaWNfc3RyZWFtYnVmPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID47CisjICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBiYXNpY19zdHJlYW1idWY8d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPjsKKyMgIGVuZGlmIC8vIF9TVExQX05PX1dDSEFSX1QKKyNlbmRpZiAvLyBfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2lmIGRlZmluZWQgKF9TVExQX0VYUE9TRV9TVFJFQU1fSU1QTEVNRU5UQVRJT04pICYmICFkZWZpbmVkIChfU1RMUF9MSU5LX1RJTUVfSU5TVEFOVElBVElPTikKKyMgIGluY2x1ZGUgPHN0bC9fc3RyZWFtYnVmLmM+CisjZW5kaWYKKworI2VuZGlmCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9fc3RyaW5nLmMgYi9zdGxwb3J0L3N0bC9fc3RyaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZhNWVjZQotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc3RsL19zdHJpbmcuYwpAQCAtMCwwICsxLDY3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqLworCisjaWZuZGVmIF9TVExQX1NUUklOR19DCisjZGVmaW5lIF9TVExQX1NUUklOR19DCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfU1RSSU5HX0gKKyMgIGluY2x1ZGUgPHN0bC9fc3RyaW5nLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DVFJBSVRTX0ZVTkNUSU9OU19ICisjICBpbmNsdWRlIDxzdGwvX2N0cmFpdHNfZm5zLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9GVU5DVElPTl9ICisjICBpbmNsdWRlIDxzdGwvX2Z1bmN0aW9uLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9NU1ZDNl9NRU1fVF9CVUdfV09SS0FST1VORCkKKyMgIGRlZmluZSBiYXNpY19zdHJpbmcgX1NUTFBfTk9fTUVNX1RfTkFNRShzdHIpCisjZWxpZiBkZWZpbmVkIChfU1RMUF9ERUJVRykKKyMgIGRlZmluZSBiYXNpY19zdHJpbmcgX1NUTFBfTk9OX0RCR19OQU1FKHN0cikKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfTkVTVEVEX1RZUEVfUEFSQU1fQlVHKQorIyAgZGVmaW5lIF9fc2l6ZV90eXBlX18gc2l6ZV90CisjICBkZWZpbmUgc2l6ZV90eXBlIHNpemVfdAorIyAgZGVmaW5lIGl0ZXJhdG9yIF9DaGFyVCoKKyNlbHNlCisjICBkZWZpbmUgX19zaXplX3R5cGVfXyBfU1RMUF9UWVBFTkFNRV9PTl9SRVRVUk5fVFlQRSBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPjo6c2l6ZV90eXBlCisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKworLy8gQSBoZWxwZXIgY2xhc3MgdG8gdXNlIGEgY2hhcl90cmFpdHMgYXMgYSBmdW5jdGlvbiBvYmplY3QuCit0ZW1wbGF0ZSA8Y2xhc3MgX1RyYWl0cz4KK3N0cnVjdCBfTm90X3dpdGhpbl90cmFpdHMgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248dHlwZW5hbWUgX1RyYWl0czo6Y2hhcl90eXBlLCBib29sPiB7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6Y2hhcl90eXBlIF9DaGFyVDsKKyAgY29uc3QgX0NoYXJUKiBfTV9maXJzdDsKKyAgY29uc3QgX0NoYXJUKiBfTV9sYXN0OworCisgIF9Ob3Rfd2l0aGluX3RyYWl0cyhjb25zdCBfQ2hhclQqIF9fZiwgY29uc3QgX0NoYXJUKiBfX2wpCisgICAgOiBfTV9maXJzdChfX2YpLCBfTV9sYXN0KF9fbCkge30KKworICBib29sIG9wZXJhdG9yKCkoY29uc3QgX0NoYXJUJiBfX3gpIGNvbnN0IHsKKyAgICByZXR1cm4gZmluZF9pZihfTV9maXJzdCwgX01fbGFzdCwKKyAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9FcV9jaGFyX2JvdW5kPF9UcmFpdHM+KF9feCkpID09IF9NX2xhc3Q7CisgIH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUgX0lucHV0SXRlciBfX3N0cl9maW5kX2ZpcnN0X29mX2F1eChfSW5wdXRJdGVyIF9fZmlyc3QxLCBfSW5wdXRJdGVyIF9fbGFzdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfQ2hhclQqIF9fZmlyc3QyLCBjb25zdCBfQ2hhclQqIF9fbGFzdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVHJhaXRzKiwgY29uc3QgX190cnVlX3R5cGUmIC8qIF9TVExwb3J0VHJhaXRzICovKQoreyByZXR1cm4gX19maW5kX2ZpcnN0X29mKF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0MiwgX19sYXN0Mik7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2lubGluZSBfSW5wdXRJdGVyIF9fc3RyX2ZpbmRfZmlyc3Rfb2ZfYXV4KF9JbnB1dEl0ZXIgX19maXJzdDEsIF9JbnB1dEl0ZXIgX19sYXN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9DaGFyVCogX19maXJzdDIsIGNvbnN0IF9DaGFyVCogX19sYXN0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9UcmFpdHMqLCBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qIF9TVExwb3J0VHJhaXRzICovKQoreyByZXR1cm4gX19maW5kX2ZpcnN0X29mKF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0MiwgX19sYXN0MiwgX1NUTFBfUFJJViBfRXFfdHJhaXRzPF9UcmFpdHM+KCkpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUgX0lucHV0SXRlciBfX3N0cl9maW5kX2ZpcnN0X29mKF9JbnB1dEl0ZXIgX19maXJzdDEsIF9JbnB1dEl0ZXIgX19sYXN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0NoYXJUKiBfX2ZpcnN0MiwgY29uc3QgX0NoYXJUKiBfX2xhc3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVHJhaXRzKiBfX3RyYWl0cykgeworI2lmICFkZWZpbmVkIChfX0JPUkxBTkRDX18pCisgIHR5cGVkZWYgdHlwZW5hbWUgX0lzU1RMcG9ydENsYXNzPF9UcmFpdHM+OjpfUmV0IF9TVExwb3J0VHJhaXRzOworI2Vsc2UKKyAgZW51bSB7IF9JcyA9IF9Jc1NUTHBvcnRDbGFzczxfVHJhaXRzPjo6X0lzIH07CisgIHR5cGVkZWYgdHlwZW5hbWUgX19ib29sMnR5cGU8X0lzPjo6X1JldCBfU1RMcG9ydFRyYWl0czsKKyNlbmRpZgorICByZXR1cm4gX19zdHJfZmluZF9maXJzdF9vZl9hdXgoX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLCBfX2xhc3QyLCBfX3RyYWl0cywgX1NUTHBvcnRUcmFpdHMoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUgX0lucHV0SXRlciBfX3N0cl9maW5kX2ZpcnN0X25vdF9vZl9hdXgzKF9JbnB1dEl0ZXIgX19maXJzdDEsIF9JbnB1dEl0ZXIgX19sYXN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0NoYXJUKiBfX2ZpcnN0MiwgY29uc3QgX0NoYXJUKiBfX2xhc3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVHJhaXRzKiAvKiBfX3RyYWl0cyAqLywgY29uc3QgX190cnVlX3R5cGUmIF9fdXNlU3RyY3Nwbkxpa2VBbGdvKQoreyByZXR1cm4gX19maW5kX2ZpcnN0X29mX2F1eDIoX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLCBfX2xhc3QyLCBfX2ZpcnN0Miwgbm90MShfSWRlbnRpdHk8Ym9vbD4oKSksIF9fdXNlU3RyY3Nwbkxpa2VBbGdvKTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgoraW5saW5lIF9JbnB1dEl0ZXIgX19zdHJfZmluZF9maXJzdF9ub3Rfb2ZfYXV4MyhfSW5wdXRJdGVyIF9fZmlyc3QxLCBfSW5wdXRJdGVyIF9fbGFzdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9DaGFyVCogX19maXJzdDIsIGNvbnN0IF9DaGFyVCogX19sYXN0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1RyYWl0cyogLyogX190cmFpdHMgKi8sIGNvbnN0IF9fZmFsc2VfdHlwZSYgLyogX1VzZVN0cmNzcG5MaWtlQWxnbyAqLykKK3sgcmV0dXJuIF9TVExQX1NURDo6ZmluZF9pZihfX2ZpcnN0MSwgX19sYXN0MSwgX1NUTFBfUFJJViBfTm90X3dpdGhpbl90cmFpdHM8X1RyYWl0cz4oX19maXJzdDIsIF9fbGFzdDIpKTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX0NoYXJULCBjbGFzcyBfVHAsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUgX0lucHV0SXRlciBfX3N0cl9maW5kX2ZpcnN0X25vdF9vZl9hdXgyKF9JbnB1dEl0ZXIgX19maXJzdDEsIF9JbnB1dEl0ZXIgX19sYXN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0NoYXJUKiBfX2ZpcnN0MiwgY29uc3QgX0NoYXJUKiBfX2xhc3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVHAqIF9fcHQsIF9UcmFpdHMqIF9fdHJhaXRzKSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0lzSW50ZWdyYWw8X1RwPjo6X1JldCBfSXNJbnRlZ3JhbDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSXNDaGFyTGlrZVR5cGU8X0NoYXJUPjo6X1JldCBfSXNDaGFyTGlrZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfTGFuZDI8X0lzSW50ZWdyYWwsIF9Jc0NoYXJMaWtlPjo6X1JldCBfVXNlU3RyY3Nwbkxpa2VBbGdvOworICByZXR1cm4gX19zdHJfZmluZF9maXJzdF9ub3Rfb2ZfYXV4MyhfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIsIF9fbGFzdDIsIF9fdHJhaXRzLCBfVXNlU3RyY3Nwbkxpa2VBbGdvKCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgoraW5saW5lIF9JbnB1dEl0ZXIgX19zdHJfZmluZF9maXJzdF9ub3Rfb2ZfYXV4MShfSW5wdXRJdGVyIF9fZmlyc3QxLCBfSW5wdXRJdGVyIF9fbGFzdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9DaGFyVCogX19maXJzdDIsIGNvbnN0IF9DaGFyVCogX19sYXN0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1RyYWl0cyogX190cmFpdHMsIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKiBfU1RMcG9ydFRyYWl0cyAqLykKK3sgcmV0dXJuIF9fc3RyX2ZpbmRfZmlyc3Rfbm90X29mX2F1eDIoX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLCBfX2xhc3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QxLCBfSW5wdXRJdGVyKSwgX190cmFpdHMpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUgX0lucHV0SXRlciBfX3N0cl9maW5kX2ZpcnN0X25vdF9vZl9hdXgxKF9JbnB1dEl0ZXIgX19maXJzdDEsIF9JbnB1dEl0ZXIgX19sYXN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0NoYXJUKiBfX2ZpcnN0MiwgY29uc3QgX0NoYXJUKiBfX2xhc3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVHJhaXRzKiwgY29uc3QgX19mYWxzZV90eXBlJiAvKiBfU1RMcG9ydFRyYWl0cyAqLykKK3sgcmV0dXJuIF9TVExQX1NURDo6ZmluZF9pZihfX2ZpcnN0MSwgX19sYXN0MSwgX1NUTFBfUFJJViBfTm90X3dpdGhpbl90cmFpdHM8X1RyYWl0cz4oX19maXJzdDIsIF9fbGFzdDIpKTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgoraW5saW5lIF9JbnB1dEl0ZXIgX19zdHJfZmluZF9maXJzdF9ub3Rfb2YoX0lucHV0SXRlciBfX2ZpcnN0MSwgX0lucHV0SXRlciBfX2xhc3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0NoYXJUKiBfX2ZpcnN0MiwgY29uc3QgX0NoYXJUKiBfX2xhc3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1RyYWl0cyogX190cmFpdHMpIHsKKyNpZiAhZGVmaW5lZCAoX19CT1JMQU5EQ19fKQorICB0eXBlZGVmIHR5cGVuYW1lIF9Jc1NUTHBvcnRDbGFzczxfVHJhaXRzPjo6X1JldCBfU1RMcG9ydFRyYWl0czsKKyNlbHNlCisgIGVudW0geyBfSXMgPSBfSXNTVExwb3J0Q2xhc3M8X1RyYWl0cz46Ol9JcyB9OworICB0eXBlZGVmIHR5cGVuYW1lIF9fYm9vbDJ0eXBlPF9Jcz46Ol9SZXQgX1NUTHBvcnRUcmFpdHM7CisjZW5kaWYKKyAgcmV0dXJuIF9fc3RyX2ZpbmRfZmlyc3Rfbm90X29mX2F1eDEoX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLCBfX2xhc3QyLCBfX3RyYWl0cywgX1NUTHBvcnRUcmFpdHMoKSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTm9uLWlubGluZSBkZWNsYXJhdGlvbnMuCisKKyNpZiAhZGVmaW5lZCAoYmFzaWNfc3RyaW5nKQorX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisjZW5kaWYKKworLy8gQ2hhbmdlIHRoZSBzdHJpbmcncyBjYXBhY2l0eSBzbyB0aGF0IGl0IGlzIGxhcmdlIGVub3VnaCB0byBob2xkCisvLyAgYXQgbGVhc3QgX19yZXNfYXJnIGVsZW1lbnRzLCBwbHVzIHRoZSB0ZXJtaW5hdGluZyBfQ2hhclQoKS4gIE5vdGUgdGhhdCwKKy8vICBpZiBfX3Jlc19hcmcgPCBjYXBhY2l0eSgpLCB0aGlzIG1lbWJlciBmdW5jdGlvbiBtYXkgYWN0dWFsbHkgZGVjcmVhc2UKKy8vICB0aGUgc3RyaW5nJ3MgY2FwYWNpdHkuCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+Cit2b2lkIGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+OjpyZXNlcnZlKHNpemVfdHlwZSBfX3Jlc19hcmcpIHsKKyAgaWYgKF9fcmVzX2FyZyA+IG1heF9zaXplKCkpCisgICAgdGhpcy0+X01fdGhyb3dfbGVuZ3RoX2Vycm9yKCk7CisKKyAgc2l6ZV90eXBlIF9fbiA9IChtYXgpKF9fcmVzX2FyZywgc2l6ZSgpKSArIDE7CisgIGlmIChfX24gPCB0aGlzLT5fTV9jYXBhY2l0eSgpKQorICAgIHJldHVybjsKKworICBfTV9yZXNlcnZlKF9fbik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK3ZvaWQgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz46Ol9NX3Jlc2VydmUoc2l6ZV90eXBlIF9fbikgeworICBwb2ludGVyIF9fbmV3X3N0YXJ0ID0gdGhpcy0+X01fc3RhcnRfb2Zfc3RvcmFnZS5hbGxvY2F0ZShfX24sIF9fbik7CisgIHBvaW50ZXIgX19uZXdfZmluaXNoID0gX1NUTFBfUFJJViBfX3Vjb3B5KHRoaXMtPl9NX1N0YXJ0KCksIHRoaXMtPl9NX0ZpbmlzaCgpLCBfX25ld19zdGFydCk7CisgIF9NX2NvbnN0cnVjdF9udWxsKF9fbmV3X2ZpbmlzaCk7CisgIHRoaXMtPl9NX2RlYWxsb2NhdGVfYmxvY2soKTsKKyAgdGhpcy0+X01fcmVzZXQoX19uZXdfc3RhcnQsIF9fbmV3X2ZpbmlzaCwgX19uZXdfc3RhcnQgKyBfX24pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiYKK2Jhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+OjphcHBlbmQoc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYykgeworICBpZiAoX19uID4gMCkgeworICAgIGlmIChfX24gPiBtYXhfc2l6ZSgpIC0gc2l6ZSgpKQorICAgICAgdGhpcy0+X01fdGhyb3dfbGVuZ3RoX2Vycm9yKCk7CisgICAgaWYgKF9fbiA+PSB0aGlzLT5fTV9yZXN0KCkpCisgICAgICBfTV9yZXNlcnZlKF9NX2NvbXB1dGVfbmV4dF9zaXplKF9fbikpOworICAgIF9TVExQX1BSSVYgX191bmluaXRpYWxpemVkX2ZpbGxfbih0aGlzLT5fTV9maW5pc2ggKyAxLCBfX24gLSAxLCBfX2MpOworICAgIF9NX2NvbnN0cnVjdF9udWxsKHRoaXMtPl9NX2ZpbmlzaCArIF9fbik7CisgICAgX1RyYWl0czo6YXNzaWduKCplbmQoKSwgX19jKTsKKyAgICB0aGlzLT5fTV9maW5pc2ggKz0gX19uOworICB9CisgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46Ol9NX2FwcGVuZChjb25zdCBfQ2hhclQqIF9fZmlyc3QsIGNvbnN0IF9DaGFyVCogX19sYXN0KSB7CisgIGlmIChfX2ZpcnN0ICE9IF9fbGFzdCkgeworICAgIHNpemVfdHlwZSBfX24gPSBfX1NUQVRJQ19DQVNUKHNpemVfdHlwZSwgX19sYXN0IC0gX19maXJzdCk7CisgICAgaWYgKF9fbiA+PSB0aGlzLT5fTV9yZXN0KCkpIHsKKyAgICAgIHNpemVfdHlwZSBfX2xlbiA9IF9NX2NvbXB1dGVfbmV4dF9zaXplKF9fbik7CisgICAgICBwb2ludGVyIF9fbmV3X3N0YXJ0ID0gdGhpcy0+X01fc3RhcnRfb2Zfc3RvcmFnZS5hbGxvY2F0ZShfX2xlbiwgX19sZW4pOworICAgICAgcG9pbnRlciBfX25ld19maW5pc2ggPSBfU1RMUF9QUklWIF9fdWNvcHkodGhpcy0+X01fU3RhcnQoKSwgdGhpcy0+X01fRmluaXNoKCksIF9fbmV3X3N0YXJ0KTsKKyAgICAgIF9fbmV3X2ZpbmlzaCA9IF9TVExQX1BSSVYgX191Y29weShfX2ZpcnN0LCBfX2xhc3QsIF9fbmV3X2ZpbmlzaCk7CisgICAgICBfTV9jb25zdHJ1Y3RfbnVsbChfX25ld19maW5pc2gpOworICAgICAgdGhpcy0+X01fZGVhbGxvY2F0ZV9ibG9jaygpOworICAgICAgdGhpcy0+X01fcmVzZXQoX19uZXdfc3RhcnQsIF9fbmV3X2ZpbmlzaCwgX19uZXdfc3RhcnQgKyBfX2xlbik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgY29uc3QgX0NoYXJUKiBfX2YxID0gX19maXJzdDsKKyAgICAgICsrX19mMTsKKyAgICAgIF9TVExQX1BSSVYgX191Y29weShfX2YxLCBfX2xhc3QsIHRoaXMtPl9NX2ZpbmlzaCArIDEpOworICAgICAgX01fY29uc3RydWN0X251bGwodGhpcy0+X01fZmluaXNoICsgX19uKTsKKyAgICAgIF9UcmFpdHM6OmFzc2lnbigqZW5kKCksICpfX2ZpcnN0KTsKKyAgICAgIHRoaXMtPl9NX2ZpbmlzaCArPSBfX247CisgICAgfQorICB9CisgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4mCitiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPjo6YXNzaWduKHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MpIHsKKyAgaWYgKF9fbiA8PSBzaXplKCkpIHsKKyAgICBfVHJhaXRzOjphc3NpZ24odGhpcy0+X01fU3RhcnQoKSwgX19uLCBfX2MpOworICAgIGVyYXNlKGJlZ2luKCkgKyBfX24sIGVuZCgpKTsKKyAgfQorICBlbHNlIHsKKyAgICBpZiAoX19uIDwgY2FwYWNpdHkoKSkgeworICAgICAgX1RyYWl0czo6YXNzaWduKHRoaXMtPl9NX1N0YXJ0KCksIHNpemUoKSwgX19jKTsKKyAgICAgIGFwcGVuZChfX24gLSBzaXplKCksIF9fYyk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgX1NlbGYgX19zdHIoX19uLCBfX2MpOworICAgICAgdGhpcy0+c3dhcChfX3N0cik7CisgICAgfQorICB9CisgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4mCitiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPjo6X01fYXNzaWduKGNvbnN0IF9DaGFyVCogX19mLCBjb25zdCBfQ2hhclQqIF9fbCkgeworICBwdHJkaWZmX3QgX19uID0gX19sIC0gX19mOworICBpZiAoX19TVEFUSUNfQ0FTVChzaXplX3R5cGUsIF9fbikgPD0gc2l6ZSgpKSB7CisgICAgX1RyYWl0czo6Y29weSh0aGlzLT5fTV9TdGFydCgpLCBfX2YsIF9fbik7CisgICAgZXJhc2UoYmVnaW4oKSArIF9fbiwgZW5kKCkpOworICB9CisgIGVsc2UgeworICAgIF9UcmFpdHM6OmNvcHkodGhpcy0+X01fU3RhcnQoKSwgX19mLCBzaXplKCkpOworICAgIF9NX2FwcGVuZChfX2YgKyBzaXplKCksIF9fbCk7CisgIH0KKyAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitfQ2hhclQqIGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+IDo6X01faW5zZXJ0X2F1eChfQ2hhclQqIF9fcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DaGFyVCBfX2MpIHsKKyAgcG9pbnRlciBfX25ld19wb3MgPSBfX3A7CisgIGlmICh0aGlzLT5fTV9yZXN0KCkgPiAxICkgeworICAgIF9NX2NvbnN0cnVjdF9udWxsKHRoaXMtPl9NX2ZpbmlzaCArIDEpOworICAgIF9UcmFpdHM6Om1vdmUoX19wICsgMSwgX19wLCB0aGlzLT5fTV9maW5pc2ggLSBfX3ApOworICAgIF9UcmFpdHM6OmFzc2lnbigqX19wLCBfX2MpOworICAgICsrdGhpcy0+X01fZmluaXNoOworICB9CisgIGVsc2UgeworICAgIHNpemVfdHlwZSBfX2xlbiA9IF9NX2NvbXB1dGVfbmV4dF9zaXplKDEpOworICAgIHBvaW50ZXIgX19uZXdfc3RhcnQgPSB0aGlzLT5fTV9zdGFydF9vZl9zdG9yYWdlLmFsbG9jYXRlKF9fbGVuLCBfX2xlbik7CisgICAgX19uZXdfcG9zID0gX1NUTFBfUFJJViBfX3Vjb3B5KHRoaXMtPl9NX1N0YXJ0KCksIF9fcCwgX19uZXdfc3RhcnQpOworICAgIF9UcmFpdHM6OmFzc2lnbigqX19uZXdfcG9zLCBfX2MpOworICAgIHBvaW50ZXIgX19uZXdfZmluaXNoID0gX19uZXdfcG9zICsgMTsKKyAgICBfX25ld19maW5pc2ggPSBfU1RMUF9QUklWIF9fdWNvcHkoX19wLCB0aGlzLT5fTV9maW5pc2gsIF9fbmV3X2ZpbmlzaCk7CisgICAgX01fY29uc3RydWN0X251bGwoX19uZXdfZmluaXNoKTsKKyAgICB0aGlzLT5fTV9kZWFsbG9jYXRlX2Jsb2NrKCk7CisgICAgdGhpcy0+X01fcmVzZXQoX19uZXdfc3RhcnQsIF9fbmV3X2ZpbmlzaCwgX19uZXdfc3RhcnQgKyBfX2xlbik7CisgIH0KKyAgcmV0dXJuIF9fbmV3X3BvczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgordm9pZCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPjo6aW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBfX24sIF9DaGFyVCBfX2MpIHsKKyAgaWYgKF9fbiAhPSAwKSB7CisgICAgaWYgKHRoaXMtPl9NX3Jlc3QoKSA+IF9fbikgeworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fZWxlbXNfYWZ0ZXIgPSB0aGlzLT5fTV9maW5pc2ggLSBfX3BvczsKKyAgICAgIHBvaW50ZXIgX19vbGRfZmluaXNoID0gdGhpcy0+X01fZmluaXNoOworICAgICAgaWYgKF9fZWxlbXNfYWZ0ZXIgPj0gX19uKSB7CisgICAgICAgIF9TVExQX1BSSVYgX191Y29weSgodGhpcy0+X01fZmluaXNoIC0gX19uKSArIDEsIHRoaXMtPl9NX2ZpbmlzaCArIDEsIHRoaXMtPl9NX2ZpbmlzaCArIDEpOworICAgICAgICB0aGlzLT5fTV9maW5pc2ggKz0gX19uOworICAgICAgICBfVHJhaXRzOjptb3ZlKF9fcG9zICsgX19uLCBfX3BvcywgKF9fZWxlbXNfYWZ0ZXIgLSBfX24pICsgMSk7CisgICAgICAgIF9UcmFpdHM6OmFzc2lnbihfX3BvcywgX19uLCBfX2MpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIF9TVExQX1BSSVYgX191bmluaXRpYWxpemVkX2ZpbGxfbih0aGlzLT5fTV9maW5pc2ggKyAxLCBfX24gLSBfX2VsZW1zX2FmdGVyIC0gMSwgX19jKTsKKyAgICAgICAgdGhpcy0+X01fZmluaXNoICs9IF9fbiAtIF9fZWxlbXNfYWZ0ZXI7CisgICAgICAgIF9TVExQX1BSSVYgX191Y29weShfX3BvcywgX19vbGRfZmluaXNoICsgMSwgdGhpcy0+X01fZmluaXNoKTsKKyAgICAgICAgdGhpcy0+X01fZmluaXNoICs9IF9fZWxlbXNfYWZ0ZXI7CisgICAgICAgIF9UcmFpdHM6OmFzc2lnbihfX3BvcywgX19lbGVtc19hZnRlciArIDEsIF9fYyk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgc2l6ZV90eXBlIF9fbGVuID0gX01fY29tcHV0ZV9uZXh0X3NpemUoX19uKTsKKyAgICAgIHBvaW50ZXIgX19uZXdfc3RhcnQgPSB0aGlzLT5fTV9zdGFydF9vZl9zdG9yYWdlLmFsbG9jYXRlKF9fbGVuLCBfX2xlbik7CisgICAgICBwb2ludGVyIF9fbmV3X2ZpbmlzaCA9IF9TVExQX1BSSVYgX191Y29weSh0aGlzLT5fTV9TdGFydCgpLCBfX3BvcywgX19uZXdfc3RhcnQpOworICAgICAgX19uZXdfZmluaXNoID0gX1NUTFBfUFJJViBfX3VuaW5pdGlhbGl6ZWRfZmlsbF9uKF9fbmV3X2ZpbmlzaCwgX19uLCBfX2MpOworICAgICAgX19uZXdfZmluaXNoID0gX1NUTFBfUFJJViBfX3Vjb3B5KF9fcG9zLCB0aGlzLT5fTV9maW5pc2gsIF9fbmV3X2ZpbmlzaCk7CisgICAgICBfTV9jb25zdHJ1Y3RfbnVsbChfX25ld19maW5pc2gpOworICAgICAgdGhpcy0+X01fZGVhbGxvY2F0ZV9ibG9jaygpOworICAgICAgdGhpcy0+X01fcmVzZXQoX19uZXdfc3RhcnQsIF9fbmV3X2ZpbmlzaCwgX19uZXdfc3RhcnQgKyBfX2xlbik7CisgICAgfQorICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK3ZvaWQgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz46Ol9NX2luc2VydChpdGVyYXRvciBfX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfQ2hhclQqIF9fZmlyc3QsIGNvbnN0IF9DaGFyVCogX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgX19zZWxmX3JlZikgeworICAvL3RoaXMgdmVyc2lvbiBoYXMgdG8gdGFrZSBjYXJlIGFib3V0IHRoZSBhdXRvIHJlZmVyZW5jaW5nCisgIGlmIChfX2ZpcnN0ICE9IF9fbGFzdCkgeworICAgIGNvbnN0IHNpemVfdCBfX24gPSBfX2xhc3QgLSBfX2ZpcnN0OworICAgIGlmICh0aGlzLT5fTV9yZXN0KCkgPiBfX24pIHsKKyAgICAgIGNvbnN0IHNpemVfdCBfX2VsZW1zX2FmdGVyID0gdGhpcy0+X01fZmluaXNoIC0gX19wb3M7CisgICAgICBwb2ludGVyIF9fb2xkX2ZpbmlzaCA9IHRoaXMtPl9NX2ZpbmlzaDsKKyAgICAgIGlmIChfX2VsZW1zX2FmdGVyID49IF9fbikgeworICAgICAgICBfU1RMUF9QUklWIF9fdWNvcHkoKHRoaXMtPl9NX2ZpbmlzaCAtIF9fbikgKyAxLCB0aGlzLT5fTV9maW5pc2ggKyAxLCB0aGlzLT5fTV9maW5pc2ggKyAxKTsKKyAgICAgICAgdGhpcy0+X01fZmluaXNoICs9IF9fbjsKKyAgICAgICAgX1RyYWl0czo6bW92ZShfX3BvcyArIF9fbiwgX19wb3MsIChfX2VsZW1zX2FmdGVyIC0gX19uKSArIDEpOworICAgICAgICBpZiAoIV9fc2VsZl9yZWYgfHwgX19sYXN0IDwgX19wb3MpIHsKKyAgICAgICAgICBfTV9jb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19wb3MpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIC8vV2UgaGF2ZSB0byBjaGVjayB0aGF0IHRoZSBzb3VyY2UgYnVmZmVyIGhhc24ndCBtb3ZlCisgICAgICAgICAgaWYgKF9fZmlyc3QgPj0gX19wb3MpIHsKKyAgICAgICAgICAgIC8vVGhlIHNvdXJjZSBidWZmZXIgaGFzIG1vdmUKKyAgICAgICAgICAgIF9fZmlyc3QgKz0gX19uOworICAgICAgICAgICAgX19sYXN0ICs9IF9fbjsKKyAgICAgICAgICAgIF9NX2NvcHkoX19maXJzdCwgX19sYXN0LCBfX3Bvcyk7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLy9UaGUgc291cmNlIGJ1ZmZlciBoYXNuJ3QgbW92ZSwgaXQgaGFzIGJlZW4gZHVwbGljYXRlZAorICAgICAgICAgICAgX01fbW92ZShfX2ZpcnN0LCBfX2xhc3QsIF9fcG9zKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBjb25zdF9pdGVyYXRvciBfX21pZCA9IF9fZmlyc3Q7CisgICAgICAgIF9fbWlkICs9IF9fZWxlbXNfYWZ0ZXIgKyAxOworICAgICAgICBfU1RMUF9QUklWIF9fdWNvcHkoX19taWQsIF9fbGFzdCwgdGhpcy0+X01fZmluaXNoICsgMSk7CisgICAgICAgIHRoaXMtPl9NX2ZpbmlzaCArPSBfX24gLSBfX2VsZW1zX2FmdGVyOworICAgICAgICBfU1RMUF9QUklWIF9fdWNvcHkoX19wb3MsIF9fb2xkX2ZpbmlzaCArIDEsIHRoaXMtPl9NX2ZpbmlzaCk7CisgICAgICAgIHRoaXMtPl9NX2ZpbmlzaCArPSBfX2VsZW1zX2FmdGVyOworICAgICAgICBpZiAoIV9fc2VsZl9yZWYpCisgICAgICAgICAgX01fY29weShfX2ZpcnN0LCBfX21pZCwgX19wb3MpOworICAgICAgICBlbHNlCisgICAgICAgICAgX01fbW92ZShfX2ZpcnN0LCBfX21pZCwgX19wb3MpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHNpemVfdHlwZSBfX2xlbiA9IF9NX2NvbXB1dGVfbmV4dF9zaXplKF9fbik7CisgICAgICBwb2ludGVyIF9fbmV3X3N0YXJ0ID0gdGhpcy0+X01fc3RhcnRfb2Zfc3RvcmFnZS5hbGxvY2F0ZShfX2xlbiwgX19sZW4pOworICAgICAgcG9pbnRlciBfX25ld19maW5pc2ggPSBfU1RMUF9QUklWIF9fdWNvcHkodGhpcy0+X01fU3RhcnQoKSwgX19wb3MsIF9fbmV3X3N0YXJ0KTsKKyAgICAgIF9fbmV3X2ZpbmlzaCA9IF9TVExQX1BSSVYgX191Y29weShfX2ZpcnN0LCBfX2xhc3QsIF9fbmV3X2ZpbmlzaCk7CisgICAgICBfX25ld19maW5pc2ggPSBfU1RMUF9QUklWIF9fdWNvcHkoX19wb3MsIHRoaXMtPl9NX2ZpbmlzaCwgX19uZXdfZmluaXNoKTsKKyAgICAgIF9NX2NvbnN0cnVjdF9udWxsKF9fbmV3X2ZpbmlzaCk7CisgICAgICB0aGlzLT5fTV9kZWFsbG9jYXRlX2Jsb2NrKCk7CisgICAgICB0aGlzLT5fTV9yZXNldChfX25ld19zdGFydCwgX19uZXdfZmluaXNoLCBfX25ld19zdGFydCArIF9fbGVuKTsKKyAgICB9CisgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4mCitiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiA6OnJlcGxhY2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MpIHsKKyAgc2l6ZV90eXBlIF9fbGVuID0gKHNpemVfdHlwZSkoX19sYXN0IC0gX19maXJzdCk7CisKKyAgaWYgKF9fbGVuID49IF9fbikgeworICAgIF9UcmFpdHM6OmFzc2lnbihfX2ZpcnN0LCBfX24sIF9fYyk7CisgICAgZXJhc2UoX19maXJzdCArIF9fbiwgX19sYXN0KTsKKyAgfQorICBlbHNlIHsKKyAgICBfVHJhaXRzOjphc3NpZ24oX19maXJzdCwgX19sZW4sIF9fYyk7CisgICAgaW5zZXJ0KF9fbGFzdCwgX19uIC0gX19sZW4sIF9fYyk7CisgIH0KKyAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiYKK2Jhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+IDo6X01fcmVwbGFjZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0NoYXJUKiBfX2YsIGNvbnN0IF9DaGFyVCogX19sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgX19zZWxmX3JlZikgeworICBjb25zdCBwdHJkaWZmX3QgICAgICAgX19uID0gX19sIC0gX19mOworICBjb25zdCBkaWZmZXJlbmNlX3R5cGUgX19sZW4gPSBfX2xhc3QgLSBfX2ZpcnN0OworICBpZiAoX19sZW4gPj0gX19uKSB7CisgICAgaWYgKCFfX3NlbGZfcmVmIHx8IF9fbCA8IF9fZmlyc3QgfHwgX19mID49IF9fbGFzdCkKKyAgICAgIF9NX2NvcHkoX19mLCBfX2wsIF9fZmlyc3QpOworICAgIGVsc2UKKyAgICAgIF9NX21vdmUoX19mLCBfX2wsIF9fZmlyc3QpOworICAgIGVyYXNlKF9fZmlyc3QgKyBfX24sIF9fbGFzdCk7CisgIH0gZWxzZSBpZiAoIV9fc2VsZl9yZWYgfHwgKF9fZiA+PSBfX2xhc3QpIHx8IChfX2wgPD0gX19maXJzdCkpIHsgLy8gbm8gb3ZlcmxhcAorICAgIGNvbnN0X2l0ZXJhdG9yIF9fbSA9IF9fZiArIF9fbGVuOworICAgIF9NX2NvcHkoX19mLCBfX20sIF9fZmlyc3QpOworICAgIF9NX2luc2VydChfX2xhc3QsIF9fbSwgX19sLCBfX3NlbGZfcmVmICk7CisgIH0gZWxzZSBpZiAoX19mIDwgX19maXJzdCkgeyAvLyB3ZSBoYXZlIHRvIHRha2UgY2FyZSBvZiBvdmVybGFwaW5nCisgICAgY29uc3RfaXRlcmF0b3IgX19tID0gX19mICsgX19sZW47CisgICAgLy8gV2UgaGF2ZSB0byBkZWFsIHdpdGggcG9zc2libGUgcmVhbGxvY2F0aW9uIGJlY2F1c2Ugd2UgZG8gaW5zZXJ0IGZpcnN0LgorICAgIGNvbnN0IGRpZmZlcmVuY2VfdHlwZSBfX29mZl9kZXN0ID0gX19maXJzdCAtIHRoaXMtPmJlZ2luKCk7CisgICAgY29uc3QgZGlmZmVyZW5jZV90eXBlIF9fb2ZmX3NyYyA9IF9fZiAtIHRoaXMtPmJlZ2luKCk7CisgICAgX01faW5zZXJ0KF9fbGFzdCwgX19tLCBfX2wsIHRydWUpOworICAgIF9UcmFpdHM6Om1vdmUoYmVnaW4oKSArIF9fb2ZmX2Rlc3QsIGJlZ2luKCkgKyBfX29mZl9zcmMsIF9fbGVuKTsKKyAgfSBlbHNlIHsKKyAgICBjb25zdF9pdGVyYXRvciBfX20gPSBfX2YgKyBfX2xlbjsKKyAgICBfVHJhaXRzOjptb3ZlKF9fZmlyc3QsIF9fZiwgX19sZW4pOworICAgIF9NX2luc2VydChfX2xhc3QsIF9fbSwgX19sLCB0cnVlKTsKKyAgfQorICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK19fc2l6ZV90eXBlX18gYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz46OmZpbmQoIGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uKSBjb25zdAoreworICBjb25zdCBzaXplX3QgX19sZW4gPSBzaXplKCk7CisgIGlmIChfX3BvcyA+PSBfX2xlbiB8fCBfX3BvcyArIF9fbiA+IF9fbGVuKSB7CisgICAgaWYgKCBfX24gPT0gMCAmJiBfX3BvcyA8PSBfX2xlbiApIHsgLy8gbWFyZ2luYWwgY2FzZQorICAgICAgcmV0dXJuIF9fcG9zOworICAgIH0KKyAgICByZXR1cm4gbnBvczsKKyAgfQorCisgIGNvbnN0X3BvaW50ZXIgX19yZXN1bHQgPQorICAgIF9TVExQX1NURDo6c2VhcmNoKHRoaXMtPl9NX1N0YXJ0KCkgKyBfX3BvcywgdGhpcy0+X01fRmluaXNoKCksCisgICAgICAgICAgICAgICAgICAgICAgX19zLCBfX3MgKyBfX24sIF9TVExQX1BSSVYgX0VxX3RyYWl0czxfVHJhaXRzPigpKTsKKyAgcmV0dXJuIF9fcmVzdWx0ICE9IHRoaXMtPl9NX0ZpbmlzaCgpID8gX19yZXN1bHQgLSB0aGlzLT5fTV9TdGFydCgpIDogbnBvczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorX19zaXplX3R5cGVfXyBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPjo6ZmluZChfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MpIGNvbnN0Cit7CisgIGlmIChfX3BvcyA+PSBzaXplKCkpIHsgLypfX3BvcyArIDEgPiBzaXplKCkqLworICAgIHJldHVybiBucG9zOworICB9CisKKyAgY29uc3RfcG9pbnRlciBfX3Jlc3VsdCA9CisgICAgX1NUTFBfU1REOjpmaW5kX2lmKHRoaXMtPl9NX1N0YXJ0KCkgKyBfX3BvcywgdGhpcy0+X01fRmluaXNoKCksCisgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX0VxX2NoYXJfYm91bmQ8X1RyYWl0cz4oX19jKSk7CisgIHJldHVybiBfX3Jlc3VsdCAhPSB0aGlzLT5fTV9GaW5pc2goKSA/IF9fcmVzdWx0IC0gdGhpcy0+X01fU3RhcnQoKSA6IG5wb3M7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK19fc2l6ZV90eXBlX18gYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz46OnJmaW5kKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uKSBjb25zdAoreworICBjb25zdCBzaXplX3R5cGUgX19sZW4gPSBzaXplKCk7CisgIGlmICggX19sZW4gPCBfX24gKSB7CisgICAgcmV0dXJuIG5wb3M7CisgIH0KKyAgY29uc3RfcG9pbnRlciBfX2xhc3QgPSB0aGlzLT5fTV9TdGFydCgpICsgKG1pbikoIF9fbGVuIC0gX19uLCBfX3BvcykgKyBfX247CisgIGlmICggX19uID09IDAgKSB7IC8vIG1hcmdpbmFsIGNhc2UKKyAgICByZXR1cm4gX19sYXN0IC0gdGhpcy0+X01fU3RhcnQoKTsKKyAgfQorICBjb25zdF9wb2ludGVyIF9fcmVzdWx0ID0gX1NUTFBfU1REOjpmaW5kX2VuZCh0aGlzLT5fTV9TdGFydCgpLCBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcywgX19zICsgX19uLCBfU1RMUF9QUklWIF9FcV90cmFpdHM8X1RyYWl0cz4oKSk7CisgIHJldHVybiBfX3Jlc3VsdCAhPSBfX2xhc3QgPyBfX3Jlc3VsdCAtIHRoaXMtPl9NX1N0YXJ0KCkgOiBucG9zOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitfX3NpemVfdHlwZV9fIGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+OjpyZmluZChfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MpIGNvbnN0Cit7CisgIGNvbnN0IHNpemVfdHlwZSBfX2xlbiA9IHNpemUoKTsKKyAgaWYgKCBfX2xlbiA8IDEgKSB7CisgICAgcmV0dXJuIG5wb3M7CisgIH0KKyAgY29uc3RfaXRlcmF0b3IgX19sYXN0ID0gYmVnaW4oKSArIChtaW4pKF9fbGVuIC0gMSwgX19wb3MpICsgMTsKKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciBfX3JyZXN1bHQgPQorICAgIF9TVExQX1NURDo6ZmluZF9pZihjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKF9fbGFzdCksIHJlbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfRXFfY2hhcl9ib3VuZDxfVHJhaXRzPihfX2MpKTsKKyAgcmV0dXJuIF9fcnJlc3VsdCAhPSByZW5kKCkgPyAoX19ycmVzdWx0LmJhc2UoKSAtIDEpIC0gYmVnaW4oKSA6IG5wb3M7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4gX19zaXplX3R5cGVfXworYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4gOjpmaW5kX2ZpcnN0X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbikgY29uc3QgeworICBpZiAoX19wb3MgPj0gc2l6ZSgpKSAvKl9fcG9zICsgMSA+IHNpemUoKSovCisgICAgcmV0dXJuIG5wb3M7CisgIGVsc2UgeworICAgIGNvbnN0X2l0ZXJhdG9yIF9fcmVzdWx0ID0gX1NUTFBfUFJJViBfX3N0cl9maW5kX2ZpcnN0X29mKGJlZ2luKCkgKyBfX3BvcywgZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19zLCBfX3MgKyBfX24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19TVEFUSUNfQ0FTVChfVHJhaXRzKiwgMCkpOworICAgIHJldHVybiBfX3Jlc3VsdCAhPSBlbmQoKSA/IF9fcmVzdWx0IC0gYmVnaW4oKSA6IG5wb3M7CisgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorIF9fc2l6ZV90eXBlX18KK2Jhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+IDo6ZmluZF9sYXN0X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uKSBjb25zdAoreworICBjb25zdCBzaXplX3R5cGUgX19sZW4gPSBzaXplKCk7CisgIGlmICggX19sZW4gPCAxICkgeworICAgIHJldHVybiBucG9zOworICB9CisgIGNvbnN0IGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCA9IGJlZ2luKCkgKyAobWluKShfX2xlbiAtIDEsIF9fcG9zKSArIDE7CisgIGNvbnN0IGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgX19ycmVzdWx0ID0KKyAgICBfU1RMUF9QUklWIF9fc3RyX2ZpbmRfZmlyc3Rfb2YoY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihfX2xhc3QpLCByZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcywgX19zICsgX19uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX1NUQVRJQ19DQVNUKF9UcmFpdHMqLCAwKSk7CisgIHJldHVybiBfX3JyZXN1bHQgIT0gcmVuZCgpID8gKF9fcnJlc3VsdC5iYXNlKCkgLSAxKSAtIGJlZ2luKCkgOiBucG9zOworfQorCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4gX19zaXplX3R5cGVfXworYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4gOjpmaW5kX2ZpcnN0X25vdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uKSBjb25zdCB7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6Y2hhcl90eXBlIF9DaGFyVHlwZTsKKyAgaWYgKF9fcG9zID49IHNpemUoKSkgLypfX3BvcyArIDEgPj0gc2l6ZSgpKi8KKyAgICByZXR1cm4gbnBvczsKKyAgZWxzZSB7CisgICAgY29uc3RfcG9pbnRlciBfX3Jlc3VsdCA9IF9TVExQX1BSSVYgX19zdHJfZmluZF9maXJzdF9ub3Rfb2YodGhpcy0+X01fU3RhcnQoKSArIF9fcG9zLCB0aGlzLT5fTV9GaW5pc2goKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX1NUQVRJQ19DQVNUKGNvbnN0IF9DaGFyVHlwZSosIF9fcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19TVEFUSUNfQ0FTVChjb25zdCBfQ2hhclR5cGUqLCBfX3MpICsgX19uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fU1RBVElDX0NBU1QoX1RyYWl0cyosIDApKTsKKyAgICByZXR1cm4gX19yZXN1bHQgIT0gdGhpcy0+X01fZmluaXNoID8gX19yZXN1bHQgLSB0aGlzLT5fTV9TdGFydCgpIDogbnBvczsKKyAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+IF9fc2l6ZV90eXBlX18KK2Jhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+IDo6ZmluZF9maXJzdF9ub3Rfb2YoX0NoYXJUIF9fYywgc2l6ZV90eXBlIF9fcG9zKSBjb25zdCB7CisgIGlmICgxID4gc2l6ZSgpKQorICAgIHJldHVybiBucG9zOworICBlbHNlIHsKKyAgICBjb25zdF9wb2ludGVyIF9fcmVzdWx0ID0gX1NUTFBfU1REOjpmaW5kX2lmKHRoaXMtPl9NX1N0YXJ0KCkgKyBfX3BvcywgdGhpcy0+X01fRmluaXNoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9OZXFfY2hhcl9ib3VuZDxfVHJhaXRzPihfX2MpKTsKKyAgICByZXR1cm4gX19yZXN1bHQgIT0gdGhpcy0+X01fZmluaXNoID8gX19yZXN1bHQgLSB0aGlzLT5fTV9TdGFydCgpIDogbnBvczsKKyAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitfX3NpemVfdHlwZV9fCitiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPjo6ZmluZF9sYXN0X25vdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdAoreworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmNoYXJfdHlwZSBfQ2hhclR5cGU7CisgIGNvbnN0IHNpemVfdHlwZSBfX2xlbiA9IHNpemUoKTsKKyAgaWYgKCBfX2xlbiA8IDEgKSB7CisgICAgcmV0dXJuIG5wb3M7CisgIH0KKyAgY29uc3RfaXRlcmF0b3IgX19sYXN0ID0gYmVnaW4oKSArIChtaW4pKF9fbGVuIC0gMSwgX19wb3MpICsgMTsKKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciBfX3JsYXN0ID0gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihfX2xhc3QpOworICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIF9fcnJlc3VsdCA9CisgICAgX1NUTFBfUFJJViBfX3N0cl9maW5kX2ZpcnN0X25vdF9vZihfX3JsYXN0LCByZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX1NUQVRJQ19DQVNUKGNvbnN0IF9DaGFyVHlwZSosIF9fcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX1NUQVRJQ19DQVNUKGNvbnN0IF9DaGFyVHlwZSosIF9fcykgKyBfX24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX1NUQVRJQ19DQVNUKF9UcmFpdHMqLCAwKSk7CisgIHJldHVybiBfX3JyZXN1bHQgIT0gcmVuZCgpID8gKF9fcnJlc3VsdC5iYXNlKCkgLSAxKSAtIGJlZ2luKCkgOiBucG9zOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitfX3NpemVfdHlwZV9fCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjpmaW5kX2xhc3Rfbm90X29mKF9DaGFyVCBfX2MsIHNpemVfdHlwZSBfX3BvcykgY29uc3QKK3sKKyAgY29uc3Qgc2l6ZV90eXBlIF9fbGVuID0gc2l6ZSgpOworICBpZiAoIF9fbGVuIDwgMSApIHsKKyAgICByZXR1cm4gbnBvczsKKyAgfQorICBjb25zdF9pdGVyYXRvciBfX2xhc3QgPSBiZWdpbigpICsgKG1pbikoX19sZW4gLSAxLCBfX3BvcykgKyAxOworICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIF9fcmxhc3QgPSBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKF9fbGFzdCk7CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgX19ycmVzdWx0ID0KKyAgICBfU1RMUF9TVEQ6OmZpbmRfaWYoX19ybGFzdCwgcmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9OZXFfY2hhcl9ib3VuZDxfVHJhaXRzPihfX2MpKTsKKyAgcmV0dXJuIF9fcnJlc3VsdCAhPSByZW5kKCkgPyAoX19ycmVzdWx0LmJhc2UoKSAtIDEpIC0gYmVnaW4oKSA6IG5wb3M7Cit9CisKKyNpZiAhZGVmaW5lZCAoYmFzaWNfc3RyaW5nKQorX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK3ZvaWQgX1NUTFBfQ0FMTCBfU19zdHJpbmdfY29weShjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiYgX19zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DaGFyVCogX19idWYsIHNpemVfdCBfX24pIHsKKyAgaWYgKF9fbiA+IDApIHsKKyAgICBfX24gPSAobWluKSAoX19uIC0gMSwgX19zLnNpemUoKSk7CisgICAgX1NUTFBfU1REOjpjb3B5KF9fcy5iZWdpbigpLCBfX3MuYmVnaW4oKSArIF9fbiwgX19idWYpOworICAgIF9fYnVmW19fbl0gPSBfQ2hhclQoKTsKKyAgfQorfQorCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjaW5jbHVkZSA8c3RsL19yYW5nZV9lcnJvcnMuaD4KKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKworLy8gX1N0cmluZ19iYXNlIG1ldGhvZHMKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK3ZvaWQgX1N0cmluZ19iYXNlPF9UcCxfQWxsb2M+OjpfTV90aHJvd19sZW5ndGhfZXJyb3IoKSBjb25zdAoreyBfX3N0bF90aHJvd19sZW5ndGhfZXJyb3IoImJhc2ljX3N0cmluZyIpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK3ZvaWQgX1N0cmluZ19iYXNlPF9UcCwgX0FsbG9jPjo6X01fdGhyb3dfb3V0X29mX3JhbmdlKCkgY29uc3QKK3sgX19zdGxfdGhyb3dfb3V0X29mX3JhbmdlKCJiYXNpY19zdHJpbmciKTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Cit2b2lkIF9TdHJpbmdfYmFzZTxfVHAsIF9BbGxvYz46Ol9NX2FsbG9jYXRlX2Jsb2NrKHNpemVfdCBfX24pIHsKKyAgaWYgKChfX24gPD0gKG1heF9zaXplKCkgKyAxKSkgJiYgKF9fbiA+IDApKSB7CisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1NIT1JUX1NUUklOR19PUFRJTSkKKyAgICBpZiAoX19uID4gX0RFRkFVTFRfU0laRSkgeworICAgICAgdGhpcy0+X01fc3RhcnRfb2Zfc3RvcmFnZS5fTV9kYXRhID0gX01fc3RhcnRfb2Zfc3RvcmFnZS5hbGxvY2F0ZShfX24sIF9fbik7CisgICAgICB0aGlzLT5fTV9maW5pc2ggPSB0aGlzLT5fTV9zdGFydF9vZl9zdG9yYWdlLl9NX2RhdGE7CisgICAgICB0aGlzLT5fTV9idWZmZXJzLl9NX2VuZF9vZl9zdG9yYWdlID0gdGhpcy0+X01fc3RhcnRfb2Zfc3RvcmFnZS5fTV9kYXRhICsgX19uOworICAgIH0KKyNlbHNlCisgICAgdGhpcy0+X01fc3RhcnRfb2Zfc3RvcmFnZS5fTV9kYXRhID0gX01fc3RhcnRfb2Zfc3RvcmFnZS5hbGxvY2F0ZShfX24sIF9fbik7CisgICAgdGhpcy0+X01fZmluaXNoID0gdGhpcy0+X01fc3RhcnRfb2Zfc3RvcmFnZS5fTV9kYXRhOworICAgIHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlID0gdGhpcy0+X01fc3RhcnRfb2Zfc3RvcmFnZS5fTV9kYXRhICsgX19uOworI2VuZGlmCisgIH0gZWxzZSB7CisgICAgdGhpcy0+X01fdGhyb3dfbGVuZ3RoX2Vycm9yKCk7CisgIH0KK30KKworI2lmICFkZWZpbmVkIChiYXNpY19zdHJpbmcpCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OmJhc2ljX3N0cmluZyhjb25zdCBfQ2hhclQqIF9fcykKKyAgOiBfU1RMUF9QUklWIF9TdHJpbmdfYmFzZTxfQ2hhclQsX0FsbG9jPihhbGxvY2F0b3JfdHlwZSgpKSB7CisgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgIF9NX3JhbmdlX2luaXRpYWxpemUoX19zLCBfX3MgKyB0cmFpdHNfdHlwZTo6bGVuZ3RoKF9fcykpOworfQorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OmJhc2ljX3N0cmluZyhjb25zdCBfQ2hhclQqIF9fcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICA6IF9TVExQX1BSSVYgX1N0cmluZ19iYXNlPF9DaGFyVCxfQWxsb2M+KF9fYSkgeworICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKQorICBfTV9yYW5nZV9pbml0aWFsaXplKF9fcywgX19zICsgdHJhaXRzX3R5cGU6Omxlbmd0aChfX3MpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6YmFzaWNfc3RyaW5nKGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4gJiBfX3MpCisgIDogX1NUTFBfUFJJViBfU3RyaW5nX2Jhc2U8X0NoYXJULF9BbGxvYz4oX19zLmdldF9hbGxvY2F0b3IoKSkKK3sgX01fcmFuZ2VfaW5pdGlhbGl6ZShfX3MuX01fU3RhcnQoKSwgX19zLl9NX0ZpbmlzaCgpKTsgfQorCisjaWYgZGVmaW5lZCAoYmFzaWNfc3RyaW5nKQorX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisjICB1bmRlZiBiYXNpY19zdHJpbmcKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKF9TVExQX1NUQVRJQ19DT05TVF9JTklUX0JVRykgJiYgIWRlZmluZWQgKF9TVExQX05PX1NUQVRJQ19DT05TVF9ERUZJTklUSU9OKQordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorY29uc3Qgc2l6ZV90IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46Om5wb3M7CisjZW5kaWYKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjdW5kZWYgX19zaXplX3R5cGVfXworI2lmIGRlZmluZWQgKF9TVExQX05FU1RFRF9UWVBFX1BBUkFNX0JVRykKKyMgIHVuZGVmIHNpemVfdHlwZQorIyAgdW5kZWYgaXRlcmF0b3IKKyNlbmRpZgorCisjZW5kaWYgLyogIF9TVExQX1NUUklOR19DICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9fc3RyaW5nLmggYi9zdGxwb3J0L3N0bC9fc3RyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQwODIyYgotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc3RsL19zdHJpbmcuaApAQCAtMCwwICsxLDExODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMTk5OQorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9TVFJJTkdfSAorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9TVFJJTkdfSAorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0FMTE9DX0gKKyMgIGluY2x1ZGUgPHN0bC9fYWxsb2MuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX1NUUklOR19GV0RfSAorIyAgaW5jbHVkZSA8c3RsL19zdHJpbmdfZndkLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9GVU5DVElPTl9CQVNFX0gKKyMgIGluY2x1ZGUgPHN0bC9fZnVuY3Rpb25fYmFzZS5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQUxHT0JBU0VfSAorIyAgaW5jbHVkZSA8c3RsL19hbGdvYmFzZS5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfSVRFUkFUT1JfSAorIyAgaW5jbHVkZSA8c3RsL19pdGVyYXRvci5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfVU5JTklUSUFMSVpFRF9ICisjICBpbmNsdWRlIDxzdGwvX3VuaW5pdGlhbGl6ZWQuaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1RFTVBMQVRFX0VYUFJFU1NJT04pCisjICBpbmNsdWRlIDxzdGwvX3N0cmluZ19zdW0uaD4KKyNlbmRpZiAvKiBfU1RMUF9VU0VfVEVNUExBVEVfRVhQUkVTU0lPTiAqLworCisjaWYgZGVmaW5lZCAoX19NV0VSS1NfXykgJiYgISBkZWZpbmVkIChfU1RMUF9VU0VfT1dOX05BTUVTUEFDRSkKKworLy8gTVNMIGltcGxlbWVudGF0aW9uIGNsYXNzZXMgZXhwZWN0IHRvIHNlZSB0aGUgZGVmaW5pdGlvbiBvZiBzdHJlYW1wb3MKKy8vIHdoZW4gdGhpcyBoZWFkZXIgaXMgaW5jbHVkZWQuIFdlIGV4cGVjdCB0aGlzIHRvIGJlIGZpeGVkIGluIGxhdGVyIE1TTAorLy8gaW1wbGVtZW50YXRpb25zCisjICBpZiAhZGVmaW5lZCggX19NU0xfQ1BQX18gKSB8fCBfX01TTF9DUFBfXyA8IDB4NDEwNQorIyAgICBpbmNsdWRlIDxzdGwvbXNsX3N0cmluZy5oPgorIyAgZW5kaWYKKyNlbmRpZiAvLyBfX01XRVJLU19fCisKKy8qCisgKiBTdGFuZGFyZCBDKysgc3RyaW5nIGNsYXNzLiAgVGhpcyBjbGFzcyBoYXMgcGVyZm9ybWFuY2UKKyAqIGNoYXJhY3RlcmlzdGljcyB2ZXJ5IG11Y2ggbGlrZSB2ZWN0b3I8PiwgbWVhbmluZywgZm9yIGV4YW1wbGUsIHRoYXQKKyAqIGl0IGRvZXMgbm90IHBlcmZvcm0gcmVmZXJlbmNlLWNvdW50IG9yIGNvcHktb24td3JpdGUsIGFuZCB0aGF0CisgKiBjb25jYXRlbmF0aW9uIG9mIHR3byBzdHJpbmdzIGlzIGFuIE8oTikgb3BlcmF0aW9uLgorCisgKiBUaGVyZSBhcmUgdGhyZWUgcmVhc29ucyB3aHkgYmFzaWNfc3RyaW5nIGlzIG5vdCBpZGVudGljYWwgdG8KKyAqIHZlY3Rvci4KKyAqIEZpcnN0LCBiYXNpY19zdHJpbmcgYWx3YXlzIHN0b3JlcyBhIG51bGwgY2hhcmFjdGVyIGF0IHRoZSBlbmQ7CisgKiB0aGlzIG1ha2VzIGl0IHBvc3NpYmxlIGZvciBjX3N0ciB0byBiZSBhIGZhc3Qgb3BlcmF0aW9uLgorICogU2Vjb25kLCB0aGUgQysrIHN0YW5kYXJkIHJlcXVpcmVzIGJhc2ljX3N0cmluZyB0byBjb3B5IGVsZW1lbnRzCisgKiB1c2luZyBjaGFyX3RyYWl0czw+Ojphc3NpZ24sIGNoYXJfdHJhaXRzPD46OmNvcHksIGFuZAorICogY2hhcl90cmFpdHM8Pjo6bW92ZS4gIFRoaXMgbWVhbnMgdGhhdCBhbGwgb2YgdmVjdG9yPD4ncyBsb3ctbGV2ZWwKKyAqIG9wZXJhdGlvbnMgbXVzdCBiZSByZXdyaXR0ZW4uICBUaGlyZCwgYmFzaWNfc3RyaW5nPD4gaGFzIGEgbG90IG9mCisgKiBleHRyYSBmdW5jdGlvbnMgaW4gaXRzIGludGVyZmFjZSB0aGF0IGFyZSBjb252ZW5pZW50IGJ1dCwgc3RyaWN0bHkKKyAqIHNwZWFraW5nLCByZWR1bmRhbnQuCisgKi8KKworI2luY2x1ZGUgPHN0bC9fc3RyaW5nX2Jhc2UuaD4KKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ2xhc3MgYmFzaWNfc3RyaW5nLgorCisvLyBDbGFzcyBpbnZhcmlhbnRzOgorLy8gKDEpIFtzdGFydCwgZmluaXNoKSBpcyBhIHZhbGlkIHJhbmdlLgorLy8gKDIpIEVhY2ggaXRlcmF0b3IgaW4gW3N0YXJ0LCBmaW5pc2gpIHBvaW50cyB0byBhIHZhbGlkIG9iamVjdAorLy8gICAgIG9mIHR5cGUgdmFsdWVfdHlwZS4KKy8vICgzKSAqZmluaXNoIGlzIGEgdmFsaWQgb2JqZWN0IG9mIHR5cGUgdmFsdWVfdHlwZTsgd2hlbgorLy8gICAgIHZhbHVlX3R5cGUgaXMgbm90IGEgUE9EIGl0IGlzIHZhbHVlX3R5cGUoKS4KKy8vICg0KSBbZmluaXNoICsgMSwgZW5kX29mX3N0b3JhZ2UpIGlzIGEgdmFsaWQgcmFuZ2UuCisvLyAoNSkgRWFjaCBpdGVyYXRvciBpbiBbZmluaXNoICsgMSwgZW5kX29mX3N0b3JhZ2UpIHBvaW50cyB0bworLy8gICAgIHVuaW5pbml0aWFsaXplZCBtZW1vcnkuCisKKy8vIE5vdGUgb25lIGltcG9ydGFudCBjb25zZXF1ZW5jZTogYSBzdHJpbmcgb2YgbGVuZ3RoIG4gbXVzdCBtYW5hZ2UKKy8vIGEgYmxvY2sgb2YgbWVtb3J5IHdob3NlIHNpemUgaXMgYXQgbGVhc3QgbiArIDEuCisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKK3N0cnVjdCBfU3RyaW5nX3Jlc2VydmVfdCB7fTsKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX01TVkM2X01FTV9UX0JVR19XT1JLQVJPVU5EKQorIyAgZGVmaW5lIGJhc2ljX3N0cmluZyBfU1RMUF9OT19NRU1fVF9OQU1FKHN0cikKKyNlbGlmIGRlZmluZWQgKF9TVExQX0RFQlVHKQorIyAgZGVmaW5lIGJhc2ljX3N0cmluZyBfU1RMUF9OT05fREJHX05BTUUoc3RyKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChiYXNpY19zdHJpbmcpCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fRE1DX18pCisjICBkZWZpbmUgX1NUTFBfUFJJVkFURSBwdWJsaWMKKyNlbGlmIGRlZmluZWQgKF9TVExQX1VTRV9NU1ZDNl9NRU1fVF9CVUdfV09SS0FST1VORCkKKyMgIGRlZmluZSBfU1RMUF9QUklWQVRFIHByb3RlY3RlZAorI2Vsc2UKKyMgIGRlZmluZSBfU1RMUF9QUklWQVRFIHByaXZhdGUKKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitjbGFzcyBiYXNpY19zdHJpbmcgOiBfU1RMUF9QUklWQVRFIF9TVExQX1BSSVYgX1N0cmluZ19iYXNlPF9DaGFyVCxfQWxsb2M+CisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKSAmJiAhZGVmaW5lZCAoYmFzaWNfc3RyaW5nKQorICAgICAgICAgICAgICAgICAgICwgcHVibGljIF9fc3RscG9ydF9jbGFzczxiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+ID4KKyNlbmRpZgoreworX1NUTFBfUFJJVkFURTogICAgICAgICAgICAgICAgICAgICAgICAvLyBQcml2YXRlIG1lbWJlcnMgaW5oZXJpdGVkIGZyb20gYmFzZS4KKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9TdHJpbmdfYmFzZTxfQ2hhclQsX0FsbG9jPiBfQmFzZTsKKyAgdHlwZWRlZiBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+IF9TZWxmOworCitwdWJsaWM6CisgIHR5cGVkZWYgX0NoYXJUIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgX1RyYWl0cyB0cmFpdHNfdHlwZTsKKworICB0eXBlZGVmIHZhbHVlX3R5cGUqIHBvaW50ZXI7CisgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSogY29uc3RfcG9pbnRlcjsKKyAgdHlwZWRlZiB2YWx1ZV90eXBlJiByZWZlcmVuY2U7CisgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSYgY29uc3RfcmVmZXJlbmNlOworICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpzaXplX3R5cGUgc2l6ZV90eXBlOworICB0eXBlZGVmIHB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7CisgIHR5cGVkZWYgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgX0l0ZXJhdG9yX2NhdGVnb3J5OworCisgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSogY29uc3RfaXRlcmF0b3I7CisgIHR5cGVkZWYgdmFsdWVfdHlwZSogICAgICAgaXRlcmF0b3I7CisKKyAgX1NUTFBfREVDTEFSRV9SQU5ET01fQUNDRVNTX1JFVkVSU0VfSVRFUkFUT1JTOworCisjaW5jbHVkZSA8c3RsL19zdHJpbmdfbnBvcy5oPgorCisgIHR5cGVkZWYgX1NUTFBfUFJJViBfU3RyaW5nX3Jlc2VydmVfdCBfUmVzZXJ2ZV90OworCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnN0cnVjdG9yLCBkZXN0cnVjdG9yLCBhc3NpZ25tZW50LgorICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKKworICBhbGxvY2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9yKCkgY29uc3QKKyAgeyByZXR1cm4gX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoKGNvbnN0IGFsbG9jYXRvcl90eXBlJil0aGlzLT5fTV9zdGFydF9vZl9zdG9yYWdlLCBfQ2hhclQpOyB9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKKyAgZXhwbGljaXQgYmFzaWNfc3RyaW5nKGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorI2Vsc2UKKyAgYmFzaWNfc3RyaW5nKCkKKyAgICAgIDogX1NUTFBfUFJJViBfU3RyaW5nX2Jhc2U8X0NoYXJULF9BbGxvYz4oYWxsb2NhdG9yX3R5cGUoKSwgX0Jhc2U6Ol9ERUZBVUxUX1NJWkUpCisgIHsgX01fdGVybWluYXRlX3N0cmluZygpOyB9CisgIGV4cGxpY2l0IGJhc2ljX3N0cmluZyhjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorI2VuZGlmCisgICAgICA6IF9TVExQX1BSSVYgX1N0cmluZ19iYXNlPF9DaGFyVCxfQWxsb2M+KF9fYSwgX0Jhc2U6Ol9ERUZBVUxUX1NJWkUpCisgIHsgX01fdGVybWluYXRlX3N0cmluZygpOyB9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKKyAgYmFzaWNfc3RyaW5nKF9SZXNlcnZlX3QsIHNpemVfdCBfX24sCisgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyNlbHNlCisgIGJhc2ljX3N0cmluZyhfUmVzZXJ2ZV90LCBzaXplX3QgX19uKQorICAgIDogX1NUTFBfUFJJViBfU3RyaW5nX2Jhc2U8X0NoYXJULF9BbGxvYz4oYWxsb2NhdG9yX3R5cGUoKSwgX19uICsgMSkKKyAgeyBfTV90ZXJtaW5hdGVfc3RyaW5nKCk7IH0KKyAgYmFzaWNfc3RyaW5nKF9SZXNlcnZlX3QsIHNpemVfdCBfX24sIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisjZW5kaWYKKyAgICA6IF9TVExQX1BSSVYgX1N0cmluZ19iYXNlPF9DaGFyVCxfQWxsb2M+KF9fYSwgX19uICsgMSkKKyAgeyBfTV90ZXJtaW5hdGVfc3RyaW5nKCk7IH0KKworICBiYXNpY19zdHJpbmcoY29uc3QgX1NlbGYmKTsKKworI2lmICFkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorICBiYXNpY19zdHJpbmcoY29uc3QgX1NlbGYmIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uID0gbnBvcywKKyAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorI2Vsc2UKKyAgYmFzaWNfc3RyaW5nKGNvbnN0IF9TZWxmJiBfX3MsIHNpemVfdHlwZSBfX3BvcykKKyAgICA6IF9TVExQX1BSSVYgX1N0cmluZ19iYXNlPF9DaGFyVCxfQWxsb2M+KGFsbG9jYXRvcl90eXBlKCkpIHsKKyAgICBpZiAoX19wb3MgPiBfX3Muc2l6ZSgpKQorICAgICAgdGhpcy0+X01fdGhyb3dfb3V0X29mX3JhbmdlKCk7CisgICAgZWxzZQorICAgICAgX01fcmFuZ2VfaW5pdGlhbGl6ZShfX3MuX01fU3RhcnQoKSArIF9fcG9zLCBfX3MuX01fRmluaXNoKCkpOworICB9CisgIGJhc2ljX3N0cmluZyhjb25zdCBfU2VsZiYgX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pCisgICAgOiBfU1RMUF9QUklWIF9TdHJpbmdfYmFzZTxfQ2hhclQsX0FsbG9jPihhbGxvY2F0b3JfdHlwZSgpKSB7CisgICAgaWYgKF9fcG9zID4gX19zLnNpemUoKSkKKyAgICAgIHRoaXMtPl9NX3Rocm93X291dF9vZl9yYW5nZSgpOworICAgIGVsc2UKKyAgICAgIF9NX3JhbmdlX2luaXRpYWxpemUoX19zLl9NX1N0YXJ0KCkgKyBfX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19zLl9NX1N0YXJ0KCkgKyBfX3BvcyArIChtaW4pIChfX24sIF9fcy5zaXplKCkgLSBfX3BvcykpOworICB9CisgIGJhc2ljX3N0cmluZyhjb25zdCBfU2VsZiYgX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24sCisgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorI2VuZGlmCisgICAgOiBfU1RMUF9QUklWIF9TdHJpbmdfYmFzZTxfQ2hhclQsX0FsbG9jPihfX2EpIHsKKyAgICBpZiAoX19wb3MgPiBfX3Muc2l6ZSgpKQorICAgICAgdGhpcy0+X01fdGhyb3dfb3V0X29mX3JhbmdlKCk7CisgICAgZWxzZQorICAgICAgX01fcmFuZ2VfaW5pdGlhbGl6ZShfX3MuX01fU3RhcnQoKSArIF9fcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfX3MuX01fU3RhcnQoKSArIF9fcG9zICsgKG1pbikgKF9fbiwgX19zLnNpemUoKSAtIF9fcG9zKSk7CisgIH0KKworI2lmICFkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorICBiYXNpY19zdHJpbmcoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX24sCisgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyNlbHNlCisgIGJhc2ljX3N0cmluZyhjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbikKKyAgICA6IF9TVExQX1BSSVYgX1N0cmluZ19iYXNlPF9DaGFyVCxfQWxsb2M+KGFsbG9jYXRvcl90eXBlKCkpIHsKKyAgICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgICAgICBfTV9yYW5nZV9pbml0aWFsaXplKF9fcywgX19zICsgX19uKTsKKyAgICB9CisgIGJhc2ljX3N0cmluZyhjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbiwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyNlbmRpZgorICAgIDogX1NUTFBfUFJJViBfU3RyaW5nX2Jhc2U8X0NoYXJULF9BbGxvYz4oX19hKSB7CisgICAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKQorICAgICAgX01fcmFuZ2VfaW5pdGlhbGl6ZShfX3MsIF9fcyArIF9fbik7CisgICAgfQorCisjaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCisgIGJhc2ljX3N0cmluZyhjb25zdCBfQ2hhclQqIF9fcywKKyAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKTsKKyNlbHNlCisgIGJhc2ljX3N0cmluZyhjb25zdCBfQ2hhclQqIF9fcyk7CisgIGJhc2ljX3N0cmluZyhjb25zdCBfQ2hhclQqIF9fcywgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSk7CisjZW5kaWYKKworI2lmICFkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorICBiYXNpY19zdHJpbmcoc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYywKKyAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorI2Vsc2UKKyAgYmFzaWNfc3RyaW5nKHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MpCisgICAgOiBfU1RMUF9QUklWIF9TdHJpbmdfYmFzZTxfQ2hhclQsX0FsbG9jPihhbGxvY2F0b3JfdHlwZSgpLCBfX24gKyAxKSB7CisgICAgdGhpcy0+X01fZmluaXNoID0gX1NUTFBfUFJJViBfX3VuaW5pdGlhbGl6ZWRfZmlsbF9uKHRoaXMtPl9NX1N0YXJ0KCksIF9fbiwgX19jKTsKKyAgICBfTV90ZXJtaW5hdGVfc3RyaW5nKCk7CisgIH0KKyAgYmFzaWNfc3RyaW5nKHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisjZW5kaWYKKyAgICA6IF9TVExQX1BSSVYgX1N0cmluZ19iYXNlPF9DaGFyVCxfQWxsb2M+KF9fYSwgX19uICsgMSkgeworICAgIHRoaXMtPl9NX2ZpbmlzaCA9IF9TVExQX1BSSVYgX191bmluaXRpYWxpemVkX2ZpbGxfbih0aGlzLT5fTV9TdGFydCgpLCBfX24sIF9fYyk7CisgICAgX01fdGVybWluYXRlX3N0cmluZygpOworICB9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKKyAgYmFzaWNfc3RyaW5nKF9fbW92ZV9zb3VyY2U8X1NlbGY+IHNyYykKKyAgICA6IF9TVExQX1BSSVYgX1N0cmluZ19iYXNlPF9DaGFyVCxfQWxsb2M+KF9fbW92ZV9zb3VyY2U8X0Jhc2U+KHNyYy5nZXQoKSkpIHt9CisjZW5kaWYKKworICAvLyBDaGVjayB0byBzZWUgaWYgX0lucHV0SXRlcmF0b3IgaXMgYW4gaW50ZWdlciB0eXBlLiAgSWYgc28sIHRoZW4KKyAgLy8gaXQgY2FuJ3QgYmUgYW4gaXRlcmF0b3IuCisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykgJiYgIWRlZmluZWQgKF9TVExQX1VTRV9NU1ZDNl9NRU1fVF9CVUdfV09SS0FST1VORCkKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICBiYXNpY19zdHJpbmcoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsCisgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSAmIF9fYSBfU1RMUF9BTExPQ0FUT1JfVFlQRV9ERkwpCisgICAgOiBfU1RMUF9QUklWIF9TdHJpbmdfYmFzZTxfQ2hhclQsX0FsbG9jPihfX2EpIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0ludGVncmFsPF9JbnB1dEl0ZXJhdG9yPjo6X1JldCBfSW50ZWdyYWw7CisgICAgX01faW5pdGlhbGl6ZV9kaXNwYXRjaChfX2YsIF9fbCwgX0ludGVncmFsKCkpOworICB9CisjICBpZiBkZWZpbmVkIChfU1RMUF9ORUVEU19FWFRSQV9URU1QTEFURV9DT05TVFJVQ1RPUlMpCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgYmFzaWNfc3RyaW5nKF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sKQorICAgIDogX1NUTFBfUFJJViBfU3RyaW5nX2Jhc2U8X0NoYXJULF9BbGxvYz4oYWxsb2NhdG9yX3R5cGUoKSkgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lzSW50ZWdyYWw8X0lucHV0SXRlcmF0b3I+OjpfUmV0IF9JbnRlZ3JhbDsKKyAgICBfTV9pbml0aWFsaXplX2Rpc3BhdGNoKF9fZiwgX19sLCBfSW50ZWdyYWwoKSk7CisgIH0KKyMgIGVuZGlmCisjZWxzZQorIyAgaWYgIWRlZmluZWQgKF9TVExQX1VTRV9NU1ZDNl9NRU1fVF9CVUdfV09SS0FST1VORCkKKyAgYmFzaWNfc3RyaW5nKGNvbnN0IF9DaGFyVCogX19mLCBjb25zdCBfQ2hhclQqIF9fbCwKKyAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgX1NUTFBfQUxMT0NBVE9SX1RZUEVfREZMKQorICAgIDogX1NUTFBfUFJJViBfU3RyaW5nX2Jhc2U8X0NoYXJULF9BbGxvYz4oX19hKSB7CisgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fZikgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2wpCisgICAgX01fcmFuZ2VfaW5pdGlhbGl6ZShfX2YsIF9fbCk7CisgIH0KKyMgICAgaWYgZGVmaW5lZCAoX1NUTFBfTkVFRFNfRVhUUkFfVEVNUExBVEVfQ09OU1RSVUNUT1JTKQorICBiYXNpY19zdHJpbmcoY29uc3QgX0NoYXJUKiBfX2YsIGNvbnN0IF9DaGFyVCogX19sKQorICAgIDogX1NUTFBfUFJJViBfU3RyaW5nX2Jhc2U8X0NoYXJULF9BbGxvYz4oYWxsb2NhdG9yX3R5cGUoKSkgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2YpICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19sKQorICAgIF9NX3JhbmdlX2luaXRpYWxpemUoX19mLCBfX2wpOworICB9CisjICAgIGVuZGlmCisjICBlbmRpZgorIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX01TVkM2X01FTV9UX0JVR19XT1JLQVJPVU5EKQorICAvKiBXZSBuZWVkIGFuIGFkZGl0aW9ubmFsIGNvbnN0cnVjdG9yIHRvIGJ1aWxkIGFuIGVtcHR5IHN0cmluZyB3aXRob3V0CisgICAqIGFueSBhbGxvY2F0aW9uIG9yIHRlcm1pbmF0aW9uIGNoYXIqLworcHJvdGVjdGVkOgorICBzdHJ1Y3QgX0NhbGxlZEZyb21Xb3JrYXJvdW5kX3Qge307CisgIGJhc2ljX3N0cmluZyhfQ2FsbGVkRnJvbVdvcmthcm91bmRfdCwgY29uc3QgYWxsb2NhdG9yX3R5cGUgJl9fYSkKKyAgICA6IF9TdHJpbmdfYmFzZTxfQ2hhclQsX0FsbG9jPihfX2EpIHt9CisjICBlbmRpZgorI2VuZGlmCisKK19TVExQX1BSSVZBVEU6CisgIHNpemVfdHlwZSBfTV9jb21wdXRlX25leHRfc2l6ZShzaXplX3R5cGUgX19uKSB7CisgICAgY29uc3Qgc2l6ZV90eXBlIF9fc2l6ZSA9IHNpemUoKTsKKyAgICBpZiAoX19uID4gbWF4X3NpemUoKSAtIF9fc2l6ZSkKKyAgICAgIHRoaXMtPl9NX3Rocm93X2xlbmd0aF9lcnJvcigpOworICAgIHNpemVfdHlwZSBfX2xlbiA9IF9fc2l6ZSArIChtYXgpKF9fbiwgX19zaXplKSArIDE7CisgICAgaWYgKF9fbGVuID4gbWF4X3NpemUoKSB8fCBfX2xlbiA8IF9fc2l6ZSkKKyAgICAgIF9fbGVuID0gbWF4X3NpemUoKTsgLy8gb3ZlcmZsb3cKKyAgICByZXR1cm4gX19sZW47CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcj4KKyAgdm9pZCBfTV9yYW5nZV9pbml0aWFsaXplKF9JbnB1dEl0ZXIgX19mLCBfSW5wdXRJdGVyIF9fbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0X2l0ZXJhdG9yX3RhZyAmX190YWcpIHsKKyAgICB0aGlzLT5fTV9hbGxvY2F0ZV9ibG9jaygpOworICAgIF9NX2NvbnN0cnVjdF9udWxsKHRoaXMtPl9NX0ZpbmlzaCgpKTsKKyAgICBfTV9hcHBlbmRUKF9fZiwgX19sLCBfX3RhZyk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyPgorICB2b2lkIF9NX3JhbmdlX2luaXRpYWxpemUoX0ZvcndhcmRJdGVyIF9fZiwgX0ZvcndhcmRJdGVyIF9fbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcndhcmRfaXRlcmF0b3JfdGFnICYpIHsKKyAgICBkaWZmZXJlbmNlX3R5cGUgX19uID0gX1NUTFBfU1REOjpkaXN0YW5jZShfX2YsIF9fbCk7CisgICAgdGhpcy0+X01fYWxsb2NhdGVfYmxvY2soX19uICsgMSk7CisgICAgdGhpcy0+X01fZmluaXNoID0gdW5pbml0aWFsaXplZF9jb3B5KF9fZiwgX19sLCB0aGlzLT5fTV9TdGFydCgpKTsKKyAgICB0aGlzLT5fTV90ZXJtaW5hdGVfc3RyaW5nKCk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcj4KKyAgdm9pZCBfTV9yYW5nZV9pbml0aWFsaXplVChfSW5wdXRJdGVyIF9fZiwgX0lucHV0SXRlciBfX2wpIHsKKyAgICBfTV9yYW5nZV9pbml0aWFsaXplKF9fZiwgX19sLCBfU1RMUF9JVEVSQVRPUl9DQVRFR09SWShfX2YsIF9JbnB1dEl0ZXIpKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfSW50ZWdlcj4KKyAgdm9pZCBfTV9pbml0aWFsaXplX2Rpc3BhdGNoKF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX194LCBjb25zdCBfX3RydWVfdHlwZSYgLypfSW50ZWdyYWwqLykgeworICAgIHRoaXMtPl9NX2FsbG9jYXRlX2Jsb2NrKF9fbiArIDEpOworICAgIHRoaXMtPl9NX2ZpbmlzaCA9IF9TVExQX1BSSVYgX191bmluaXRpYWxpemVkX2ZpbGxfbih0aGlzLT5fTV9TdGFydCgpLCBfX24sIF9feCk7CisgICAgdGhpcy0+X01fdGVybWluYXRlX3N0cmluZygpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXI+CisgIHZvaWQgX01faW5pdGlhbGl6ZV9kaXNwYXRjaChfSW5wdXRJdGVyIF9fZiwgX0lucHV0SXRlciBfX2wsIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypfSW50ZWdyYWwqLykgeworICAgIF9NX3JhbmdlX2luaXRpYWxpemVUKF9fZiwgX19sKTsKKyAgfQorCitwdWJsaWM6CisgIF9TZWxmJiBvcGVyYXRvcj0oY29uc3QgX1NlbGYmIF9fcykgeworICAgIGlmICgmX19zICE9IHRoaXMpCisgICAgICBfTV9hc3NpZ24oX19zLl9NX1N0YXJ0KCksIF9fcy5fTV9GaW5pc2goKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgX1NlbGYmIG9wZXJhdG9yPShjb25zdCBfQ2hhclQqIF9fcykgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgICAgcmV0dXJuIF9NX2Fzc2lnbihfX3MsIF9fcyArIHRyYWl0c190eXBlOjpsZW5ndGgoX19zKSk7CisgIH0KKworICBfU2VsZiYgb3BlcmF0b3I9KF9DaGFyVCBfX2MpCisgIHsgcmV0dXJuIGFzc2lnbihfX1NUQVRJQ19DQVNUKHNpemVfdHlwZSwxKSwgX19jKTsgfQorCitwcml2YXRlOgorICBzdGF0aWMgX0NoYXJUIF9TVExQX0NBTEwgX01fbnVsbCgpCisgIHsgcmV0dXJuIF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQoX0NoYXJUKTsgfQorCitfU1RMUF9QUklWQVRFOiAgICAgICAgICAgICAgICAgICAgIC8vIEhlbHBlciBmdW5jdGlvbnMgdXNlZCBieSBjb25zdHJ1Y3RvcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGVsc2V3aGVyZS4KKyAgdm9pZCBfTV9jb25zdHJ1Y3RfbnVsbChfQ2hhclQqIF9fcCkgY29uc3QKKyAgeyBfU1RMUF9TVEQ6Ol9Db25zdHJ1Y3QoX19wKTsgfQorICB2b2lkIF9NX3Rlcm1pbmF0ZV9zdHJpbmcoKQorICB7IF9NX2NvbnN0cnVjdF9udWxsKHRoaXMtPl9NX0ZpbmlzaCgpKTsgfQorICBib29sIF9NX2luc2lkZShjb25zdCBfQ2hhclQqIF9fcykgY29uc3QgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgICAgcmV0dXJuIChfX3MgPj0gdGhpcy0+X01fU3RhcnQoKSkgJiYgKF9fcyA8IHRoaXMtPl9NX0ZpbmlzaCgpKTsKKyAgfQorCisgIHZvaWQgX01fcmFuZ2VfaW5pdGlhbGl6ZShjb25zdCBfQ2hhclQqIF9fZiwgY29uc3QgX0NoYXJUKiBfX2wpIHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19mKSBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19sKQorICAgIHB0cmRpZmZfdCBfX24gPSBfX2wgLSBfX2Y7CisgICAgdGhpcy0+X01fYWxsb2NhdGVfYmxvY2soX19uICsgMSk7CisgICAgdGhpcy0+X01fZmluaXNoID0gdW5pbml0aWFsaXplZF9jb3B5KF9fZiwgX19sLCB0aGlzLT5fTV9TdGFydCgpKTsKKyAgICBfTV90ZXJtaW5hdGVfc3RyaW5nKCk7CisgIH0KKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJdGVyYXRvcnMuCisgIGl0ZXJhdG9yIGJlZ2luKCkgICAgICAgICAgICAgeyByZXR1cm4gdGhpcy0+X01fU3RhcnQoKTsgfQorICBpdGVyYXRvciBlbmQoKSAgICAgICAgICAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX0ZpbmlzaCgpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gdGhpcy0+X01fU3RhcnQoKTsgfQorICBjb25zdF9pdGVyYXRvciBlbmQoKSAgIGNvbnN0IHsgcmV0dXJuIHRoaXMtPl9NX0ZpbmlzaCgpOyB9CisKKyAgcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKQorICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKHRoaXMtPl9NX0ZpbmlzaCgpKTsgfQorICByZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKQorICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKHRoaXMtPl9NX1N0YXJ0KCkpOyB9CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3QKKyAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcih0aGlzLT5fTV9GaW5pc2goKSk7IH0KKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgICBjb25zdAorICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKHRoaXMtPl9NX1N0YXJ0KCkpOyB9CisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2l6ZSwgY2FwYWNpdHksIGV0Yy4KKyAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCAgICAgeyByZXR1cm4gdGhpcy0+X01fRmluaXNoKCkgLSB0aGlzLT5fTV9TdGFydCgpOyB9CisgIHNpemVfdHlwZSBsZW5ndGgoKSBjb25zdCAgIHsgcmV0dXJuIHNpemUoKTsgfQorICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCB7IHJldHVybiBfQmFzZTo6bWF4X3NpemUoKTsgfQorCisgIHZvaWQgcmVzaXplKHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MpIHsKKyAgICBpZiAoX19uIDw9IHNpemUoKSkKKyAgICAgIGVyYXNlKGJlZ2luKCkgKyBfX24sIGVuZCgpKTsKKyAgICBlbHNlCisgICAgICBhcHBlbmQoX19uIC0gc2l6ZSgpLCBfX2MpOworICB9CisKKyAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9fbikgeyByZXNpemUoX19uLCBfTV9udWxsKCkpOyB9CisKK3ByaXZhdGU6CisgIHZvaWQgX01fcmVzZXJ2ZShzaXplX3R5cGUpOworcHVibGljOgorICB2b2lkIHJlc2VydmUoc2l6ZV90eXBlID0gMCk7CisKKyAgc2l6ZV90eXBlIGNhcGFjaXR5KCkgY29uc3QKKyAgeyByZXR1cm4gdGhpcy0+X01fY2FwYWNpdHkoKSAtIDE7IH0KKworICB2b2lkIGNsZWFyKCkgeworICAgIGlmICghZW1wdHkoKSkgeworICAgICAgX1RyYWl0czo6YXNzaWduKCoodGhpcy0+X01fU3RhcnQoKSksIF9NX251bGwoKSk7CisgICAgICB0aGlzLT5fTV9maW5pc2ggPSB0aGlzLT5fTV9TdGFydCgpOworICAgIH0KKyAgfQorCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiB0aGlzLT5fTV9TdGFydCgpID09IHRoaXMtPl9NX0ZpbmlzaCgpOyB9CisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gRWxlbWVudCBhY2Nlc3MuCisKKyAgY29uc3RfcmVmZXJlbmNlIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgeyByZXR1cm4gKih0aGlzLT5fTV9TdGFydCgpICsgX19uKTsgfQorICByZWZlcmVuY2Ugb3BlcmF0b3JbXShzaXplX3R5cGUgX19uKQorICB7IHJldHVybiAqKHRoaXMtPl9NX1N0YXJ0KCkgKyBfX24pOyB9CisKKyAgY29uc3RfcmVmZXJlbmNlIGF0KHNpemVfdHlwZSBfX24pIGNvbnN0IHsKKyAgICBpZiAoX19uID49IHNpemUoKSkKKyAgICAgIHRoaXMtPl9NX3Rocm93X291dF9vZl9yYW5nZSgpOworICAgIHJldHVybiAqKHRoaXMtPl9NX1N0YXJ0KCkgKyBfX24pOworICB9CisKKyAgcmVmZXJlbmNlIGF0KHNpemVfdHlwZSBfX24pIHsKKyAgICBpZiAoX19uID49IHNpemUoKSkKKyAgICAgIHRoaXMtPl9NX3Rocm93X291dF9vZl9yYW5nZSgpOworICAgIHJldHVybiAqKHRoaXMtPl9NX1N0YXJ0KCkgKyBfX24pOworICB9CisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXBwZW5kLCBvcGVyYXRvcis9LCBwdXNoX2JhY2suCisKKyAgX1NlbGYmIG9wZXJhdG9yKz0oY29uc3QgX1NlbGYmIF9fcykgeyByZXR1cm4gYXBwZW5kKF9fcyk7IH0KKyAgX1NlbGYmIG9wZXJhdG9yKz0oY29uc3QgX0NoYXJUKiBfX3MpIHsgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykgcmV0dXJuIGFwcGVuZChfX3MpOyB9CisgIF9TZWxmJiBvcGVyYXRvcis9KF9DaGFyVCBfX2MpIHsgcHVzaF9iYWNrKF9fYyk7IHJldHVybiAqdGhpczsgfQorCitwcml2YXRlOgorICBfU2VsZiYgX01fYXBwZW5kKGNvbnN0IF9DaGFyVCogX19maXJzdCwgY29uc3QgX0NoYXJUKiBfX2xhc3QpOworCisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykgJiYgIWRlZmluZWQgKF9TVExQX1VTRV9NU1ZDNl9NRU1fVF9CVUdfV09SS0FST1VORCkKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXI+CisgIF9TZWxmJiBfTV9hcHBlbmRUKF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0X2l0ZXJhdG9yX3RhZyAmKSB7CisgICAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdCA7ICsrX19maXJzdCkKKyAgICAgIHB1c2hfYmFjaygqX19maXJzdCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcj4KKyAgX1NlbGYmIF9NX2FwcGVuZFQoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcndhcmRfaXRlcmF0b3JfdGFnICYpIHsKKyAgICBpZiAoX19maXJzdCAhPSBfX2xhc3QpIHsKKyAgICAgIHNpemVfdHlwZSBfX24gPSBfX1NUQVRJQ19DQVNUKHNpemVfdHlwZSwgX1NUTFBfU1REOjpkaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QpKTsKKyAgICAgIGlmIChfX24gPj0gdGhpcy0+X01fcmVzdCgpKSB7CisgICAgICAgIHNpemVfdHlwZSBfX2xlbiA9IF9NX2NvbXB1dGVfbmV4dF9zaXplKF9fbik7CisgICAgICAgIHBvaW50ZXIgX19uZXdfc3RhcnQgPSB0aGlzLT5fTV9zdGFydF9vZl9zdG9yYWdlLmFsbG9jYXRlKF9fbGVuLCBfX2xlbik7CisgICAgICAgIHBvaW50ZXIgX19uZXdfZmluaXNoID0gdW5pbml0aWFsaXplZF9jb3B5KHRoaXMtPl9NX1N0YXJ0KCksIHRoaXMtPl9NX0ZpbmlzaCgpLCBfX25ld19zdGFydCk7CisgICAgICAgIF9fbmV3X2ZpbmlzaCA9IHVuaW5pdGlhbGl6ZWRfY29weShfX2ZpcnN0LCBfX2xhc3QsIF9fbmV3X2ZpbmlzaCk7CisgICAgICAgIF9NX2NvbnN0cnVjdF9udWxsKF9fbmV3X2ZpbmlzaCk7CisgICAgICAgIHRoaXMtPl9NX2RlYWxsb2NhdGVfYmxvY2soKTsKKyAgICAgICAgdGhpcy0+X01fcmVzZXQoX19uZXdfc3RhcnQsIF9fbmV3X2ZpbmlzaCwgX19uZXdfc3RhcnQgKyBfX2xlbik7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgX1RyYWl0czo6YXNzaWduKCp0aGlzLT5fTV9maW5pc2gsICpfX2ZpcnN0KyspOworICAgICAgICB1bmluaXRpYWxpemVkX2NvcHkoX19maXJzdCwgX19sYXN0LCB0aGlzLT5fTV9GaW5pc2goKSArIDEpOworICAgICAgICBfTV9jb25zdHJ1Y3RfbnVsbCh0aGlzLT5fTV9GaW5pc2goKSArIF9fbik7CisgICAgICAgIHRoaXMtPl9NX2ZpbmlzaCArPSBfX247CisgICAgICB9CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfSW50ZWdlcj4KKyAgX1NlbGYmIF9NX2FwcGVuZF9kaXNwYXRjaChfSW50ZWdlciBfX24sIF9JbnRlZ2VyIF9feCwgY29uc3QgX190cnVlX3R5cGUmIC8qSW50ZWdyYWwqLykKKyAgeyByZXR1cm4gYXBwZW5kKChzaXplX3R5cGUpIF9fbiwgKF9DaGFyVCkgX194KTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgorICBfU2VsZiYgX01fYXBwZW5kX2Rpc3BhdGNoKF9JbnB1dEl0ZXIgX19mLCBfSW5wdXRJdGVyIF9fbCwgY29uc3QgX19mYWxzZV90eXBlJiAvKkludGVncmFsKi8pCisgIHsgcmV0dXJuIF9NX2FwcGVuZFQoX19mLCBfX2wsIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9fZiwgX0lucHV0SXRlcikpOyB9CisKK3B1YmxpYzoKKyAgLy8gQ2hlY2sgdG8gc2VlIGlmIF9JbnB1dEl0ZXJhdG9yIGlzIGFuIGludGVnZXIgdHlwZS4gIElmIHNvLCB0aGVuCisgIC8vIGl0IGNhbid0IGJlIGFuIGl0ZXJhdG9yLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcj4KKyAgX1NlbGYmIGFwcGVuZChfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0KSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXNJbnRlZ3JhbDxfSW5wdXRJdGVyPjo6X1JldCBfSW50ZWdyYWw7CisgICAgcmV0dXJuIF9NX2FwcGVuZF9kaXNwYXRjaChfX2ZpcnN0LCBfX2xhc3QsIF9JbnRlZ3JhbCgpKTsKKyAgfQorI2Vsc2UKK3B1YmxpYzoKKyAgX1NlbGYmIGFwcGVuZChjb25zdCBfQ2hhclQqIF9fZmlyc3QsIGNvbnN0IF9DaGFyVCogX19sYXN0KSB7CisgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fZmlyc3QpX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fbGFzdCkKKyAgICByZXR1cm4gX01fYXBwZW5kKF9fZmlyc3QsIF9fbGFzdCk7CisgIH0KKyNlbmRpZgorCitwdWJsaWM6CisgIF9TZWxmJiBhcHBlbmQoY29uc3QgX1NlbGYmIF9fcykKKyAgeyByZXR1cm4gX01fYXBwZW5kKF9fcy5fTV9TdGFydCgpLCBfX3MuX01fRmluaXNoKCkpOyB9CisKKyAgX1NlbGYmIGFwcGVuZChjb25zdCBfU2VsZiYgX19zLAorICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgeworICAgIGlmIChfX3BvcyA+IF9fcy5zaXplKCkpCisgICAgICB0aGlzLT5fTV90aHJvd19vdXRfb2ZfcmFuZ2UoKTsKKyAgICByZXR1cm4gX01fYXBwZW5kKF9fcy5fTV9TdGFydCgpICsgX19wb3MsCisgICAgICAgICAgICAgICAgICAgICBfX3MuX01fU3RhcnQoKSArIF9fcG9zICsgKG1pbikgKF9fbiwgX19zLnNpemUoKSAtIF9fcG9zKSk7CisgIH0KKworICBfU2VsZiYgYXBwZW5kKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uKQorICB7IF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpIHJldHVybiBfTV9hcHBlbmQoX19zLCBfX3MrX19uKTsgfQorICBfU2VsZiYgYXBwZW5kKGNvbnN0IF9DaGFyVCogX19zKQorICB7IF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpIHJldHVybiBfTV9hcHBlbmQoX19zLCBfX3MgKyB0cmFpdHNfdHlwZTo6bGVuZ3RoKF9fcykpOyB9CisgIF9TZWxmJiBhcHBlbmQoc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYyk7CisKK3B1YmxpYzoKKyAgdm9pZCBwdXNoX2JhY2soX0NoYXJUIF9fYykgeworICAgIGlmICh0aGlzLT5fTV9yZXN0KCkgPT0gMSApCisgICAgICBfTV9yZXNlcnZlKF9NX2NvbXB1dGVfbmV4dF9zaXplKDEpKTsKKyAgICBfTV9jb25zdHJ1Y3RfbnVsbCh0aGlzLT5fTV9GaW5pc2goKSArIDEpOworICAgIF9UcmFpdHM6OmFzc2lnbigqKHRoaXMtPl9NX0ZpbmlzaCgpKSwgX19jKTsKKyAgICArK3RoaXMtPl9NX2ZpbmlzaDsKKyAgfQorCisgIHZvaWQgcG9wX2JhY2soKSB7CisgICAgX1RyYWl0czo6YXNzaWduKCoodGhpcy0+X01fRmluaXNoKCkgLSAxKSwgX01fbnVsbCgpKTsKKyAgICAtLXRoaXMtPl9NX2ZpbmlzaDsKKyAgfQorCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFzc2lnbgorICBfU2VsZiYgYXNzaWduKGNvbnN0IF9TZWxmJiBfX3MpCisgIHsgcmV0dXJuIF9NX2Fzc2lnbihfX3MuX01fU3RhcnQoKSwgX19zLl9NX0ZpbmlzaCgpKTsgfQorCisgIF9TZWxmJiBhc3NpZ24oY29uc3QgX1NlbGYmIF9fcywKKyAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIHsKKyAgICBpZiAoX19wb3MgPiBfX3Muc2l6ZSgpKQorICAgICAgdGhpcy0+X01fdGhyb3dfb3V0X29mX3JhbmdlKCk7CisgICAgcmV0dXJuIF9NX2Fzc2lnbihfX3MuX01fU3RhcnQoKSArIF9fcG9zLAorICAgICAgICAgICAgICAgICAgICAgX19zLl9NX1N0YXJ0KCkgKyBfX3BvcyArIChtaW4pIChfX24sIF9fcy5zaXplKCkgLSBfX3BvcykpOworICB9CisKKyAgX1NlbGYmIGFzc2lnbihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbikKKyAgeyBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKSByZXR1cm4gX01fYXNzaWduKF9fcywgX19zICsgX19uKTsgfQorCisgIF9TZWxmJiBhc3NpZ24oY29uc3QgX0NoYXJUKiBfX3MpCisgIHsgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykgcmV0dXJuIF9NX2Fzc2lnbihfX3MsIF9fcyArIF9UcmFpdHM6Omxlbmd0aChfX3MpKTsgfQorCisgIF9TZWxmJiBhc3NpZ24oc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYyk7CisKK3ByaXZhdGU6CisgIF9TZWxmJiBfTV9hc3NpZ24oY29uc3QgX0NoYXJUKiBfX2YsIGNvbnN0IF9DaGFyVCogX19sKTsKKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpICYmICFkZWZpbmVkIChfU1RMUF9VU0VfTVNWQzZfTUVNX1RfQlVHX1dPUktBUk9VTkQpCisgIC8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIGFzc2lnbi4KKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2VyPgorICBfU2VsZiYgX01fYXNzaWduX2Rpc3BhdGNoKF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX194LCBjb25zdCBfX3RydWVfdHlwZSYgLypfSW50ZWdyYWwqLykKKyAgeyByZXR1cm4gYXNzaWduKChzaXplX3R5cGUpIF9fbiwgKF9DaGFyVCkgX194KTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgorICBfU2VsZiYgX01fYXNzaWduX2Rpc3BhdGNoKF9JbnB1dEl0ZXIgX19mLCBfSW5wdXRJdGVyIF9fbCwgY29uc3QgX19mYWxzZV90eXBlJiAvKl9JbnRlZ3JhbCovKSB7CisgICAgcG9pbnRlciBfX2N1ciA9IHRoaXMtPl9NX1N0YXJ0KCk7CisgICAgd2hpbGUgKF9fZiAhPSBfX2wgJiYgX19jdXIgIT0gdGhpcy0+X01fRmluaXNoKCkpIHsKKyAgICAgIF9UcmFpdHM6OmFzc2lnbigqX19jdXIsICpfX2YpOworICAgICAgKytfX2Y7CisgICAgICArK19fY3VyOworICAgIH0KKyAgICBpZiAoX19mID09IF9fbCkKKyAgICAgIGVyYXNlKF9fY3VyLCB0aGlzLT5lbmQoKSk7CisgICAgZWxzZQorICAgICAgX01fYXBwZW5kVChfX2YsIF9fbCwgX1NUTFBfSVRFUkFUT1JfQ0FURUdPUlkoX19mLCBfSW5wdXRJdGVyKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKK3B1YmxpYzoKKyAgLy8gQ2hlY2sgdG8gc2VlIGlmIF9JbnB1dEl0ZXJhdG9yIGlzIGFuIGludGVnZXIgdHlwZS4gIElmIHNvLCB0aGVuCisgIC8vIGl0IGNhbid0IGJlIGFuIGl0ZXJhdG9yLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcj4KKyAgX1NlbGYmIGFzc2lnbihfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0KSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXNJbnRlZ3JhbDxfSW5wdXRJdGVyPjo6X1JldCBfSW50ZWdyYWw7CisgICAgcmV0dXJuIF9NX2Fzc2lnbl9kaXNwYXRjaChfX2ZpcnN0LCBfX2xhc3QsIF9JbnRlZ3JhbCgpKTsKKyAgfQorI2Vsc2UKK3B1YmxpYzoKKyAgX1NlbGYmIGFzc2lnbihjb25zdCBfQ2hhclQqIF9fZiwgY29uc3QgX0NoYXJUKiBfX2wpIHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19mKSBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19sKQorICAgIHJldHVybiBfTV9hc3NpZ24oX19mLCBfX2wpOworICB9CisjZW5kaWYKKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnNlcnQKKyAgX1NlbGYmIGluc2VydChzaXplX3R5cGUgX19wb3MsIGNvbnN0IF9TZWxmJiBfX3MpIHsKKyAgICBpZiAoX19wb3MgPiBzaXplKCkpCisgICAgICB0aGlzLT5fTV90aHJvd19vdXRfb2ZfcmFuZ2UoKTsKKyAgICBpZiAoX19zLnNpemUoKSA+IG1heF9zaXplKCkgLSBzaXplKCkpCisgICAgICB0aGlzLT5fTV90aHJvd19sZW5ndGhfZXJyb3IoKTsKKyAgICBfTV9pbnNlcnQoYmVnaW4oKSArIF9fcG9zLCBfX3MuX01fU3RhcnQoKSwgX19zLl9NX0ZpbmlzaCgpLCAmX19zID09IHRoaXMpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIF9TZWxmJiBpbnNlcnQoc2l6ZV90eXBlIF9fcG9zLCBjb25zdCBfU2VsZiYgX19zLAorICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX2JlZywgc2l6ZV90eXBlIF9fbikgeworICAgIGlmIChfX3BvcyA+IHNpemUoKSB8fCBfX2JlZyA+IF9fcy5zaXplKCkpCisgICAgICB0aGlzLT5fTV90aHJvd19vdXRfb2ZfcmFuZ2UoKTsKKyAgICBzaXplX3R5cGUgX19sZW4gPSAobWluKSAoX19uLCBfX3Muc2l6ZSgpIC0gX19iZWcpOworICAgIGlmIChfX2xlbiA+IG1heF9zaXplKCkgLSBzaXplKCkpCisgICAgICB0aGlzLT5fTV90aHJvd19sZW5ndGhfZXJyb3IoKTsKKyAgICBfTV9pbnNlcnQoYmVnaW4oKSArIF9fcG9zLAorICAgICAgICAgICAgICBfX3MuX01fU3RhcnQoKSArIF9fYmVnLCBfX3MuX01fU3RhcnQoKSArIF9fYmVnICsgX19sZW4sICZfX3MgPT0gdGhpcyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIF9TZWxmJiBpbnNlcnQoc2l6ZV90eXBlIF9fcG9zLCBjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbikgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgICAgaWYgKF9fcG9zID4gc2l6ZSgpKQorICAgICAgdGhpcy0+X01fdGhyb3dfb3V0X29mX3JhbmdlKCk7CisgICAgaWYgKF9fbiA+IG1heF9zaXplKCkgLSBzaXplKCkpCisgICAgICB0aGlzLT5fTV90aHJvd19sZW5ndGhfZXJyb3IoKTsKKyAgICBfTV9pbnNlcnQoYmVnaW4oKSArIF9fcG9zLCBfX3MsIF9fcyArIF9fbiwgX01faW5zaWRlKF9fcykpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIF9TZWxmJiBpbnNlcnQoc2l6ZV90eXBlIF9fcG9zLCBjb25zdCBfQ2hhclQqIF9fcykgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgICAgaWYgKF9fcG9zID4gc2l6ZSgpKQorICAgICAgdGhpcy0+X01fdGhyb3dfb3V0X29mX3JhbmdlKCk7CisgICAgc2l6ZV90eXBlIF9fbGVuID0gX1RyYWl0czo6bGVuZ3RoKF9fcyk7CisgICAgaWYgKF9fbGVuID4gbWF4X3NpemUoKSAtIHNpemUoKSkKKyAgICAgIHRoaXMtPl9NX3Rocm93X2xlbmd0aF9lcnJvcigpOworICAgIF9NX2luc2VydCh0aGlzLT5fTV9TdGFydCgpICsgX19wb3MsIF9fcywgX19zICsgX19sZW4sIF9NX2luc2lkZShfX3MpKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBfU2VsZiYgaW5zZXJ0KHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYykgeworICAgIGlmIChfX3BvcyA+IHNpemUoKSkKKyAgICAgIHRoaXMtPl9NX3Rocm93X291dF9vZl9yYW5nZSgpOworICAgIGlmIChfX24gPiBtYXhfc2l6ZSgpIC0gc2l6ZSgpKQorICAgICAgdGhpcy0+X01fdGhyb3dfbGVuZ3RoX2Vycm9yKCk7CisgICAgaW5zZXJ0KGJlZ2luKCkgKyBfX3BvcywgX19uLCBfX2MpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBfX3AsIF9DaGFyVCBfX2MpIHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19wKQorICAgIGlmIChfX3AgPT0gZW5kKCkpIHsKKyAgICAgIHB1c2hfYmFjayhfX2MpOworICAgICAgcmV0dXJuIHRoaXMtPl9NX0ZpbmlzaCgpIC0gMTsKKyAgICB9CisgICAgZWxzZQorICAgICAgcmV0dXJuIF9NX2luc2VydF9hdXgoX19wLCBfX2MpOworICB9CisKKyAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wLCBzaXplX3QgX19uLCBfQ2hhclQgX19jKTsKKworX1NUTFBfUFJJVkFURTogIC8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIGluc2VydC4KKyAgdm9pZCBfTV9pbnNlcnQoaXRlcmF0b3IgX19wLCBjb25zdCBfQ2hhclQqIF9fZmlyc3QsIGNvbnN0IF9DaGFyVCogX19sYXN0LCBib29sIF9fc2VsZl9yZWYpOworCisgIHBvaW50ZXIgX01faW5zZXJ0X2F1eChwb2ludGVyLCBfQ2hhclQpOworCisgIHZvaWQgX01fY29weShjb25zdCBfQ2hhclQqIF9fZiwgY29uc3QgX0NoYXJUKiBfX2wsIF9DaGFyVCogX19yZXMpIHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19mKSBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19sKQorICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3JlcykKKyAgICBfVHJhaXRzOjpjb3B5KF9fcmVzLCBfX2YsIF9fbCAtIF9fZik7CisgIH0KKworICB2b2lkIF9NX21vdmUoY29uc3QgX0NoYXJUKiBfX2YsIGNvbnN0IF9DaGFyVCogX19sLCBfQ2hhclQqIF9fcmVzKSB7CisgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fZikgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fbCkKKyAgICBfVHJhaXRzOjptb3ZlKF9fcmVzLCBfX2YsIF9fbCAtIF9fZik7CisgIH0KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisjICBpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX01TVkM2X01FTV9UX0JVR19XT1JLQVJPVU5EKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyPgorICB2b2lkIF9NX2luc2VydF9vdmVyZmxvdyhpdGVyYXRvciBfX3BvcywgX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX24pIHsKKyAgICBzaXplX3R5cGUgX19sZW4gPSBfTV9jb21wdXRlX25leHRfc2l6ZShfX24pOworICAgIHBvaW50ZXIgX19uZXdfc3RhcnQgPSB0aGlzLT5fTV9zdGFydF9vZl9zdG9yYWdlLmFsbG9jYXRlKF9fbGVuLCBfX2xlbik7CisgICAgcG9pbnRlciBfX25ld19maW5pc2ggPSB1bmluaXRpYWxpemVkX2NvcHkodGhpcy0+X01fU3RhcnQoKSwgX19wb3MsIF9fbmV3X3N0YXJ0KTsKKyAgICBfX25ld19maW5pc2ggPSB1bmluaXRpYWxpemVkX2NvcHkoX19maXJzdCwgX19sYXN0LCBfX25ld19maW5pc2gpOworICAgIF9fbmV3X2ZpbmlzaCA9IHVuaW5pdGlhbGl6ZWRfY29weShfX3BvcywgdGhpcy0+X01fRmluaXNoKCksIF9fbmV3X2ZpbmlzaCk7CisgICAgX01fY29uc3RydWN0X251bGwoX19uZXdfZmluaXNoKTsKKyAgICB0aGlzLT5fTV9kZWFsbG9jYXRlX2Jsb2NrKCk7CisgICAgdGhpcy0+X01fcmVzZXQoX19uZXdfc3RhcnQsIF9fbmV3X2ZpbmlzaCwgX19uZXdfc3RhcnQgKyBfX2xlbik7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcj4KKyAgdm9pZCBfTV9pbnNlcnRUKGl0ZXJhdG9yIF9fcCwgX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0X2l0ZXJhdG9yX3RhZyAmKSB7CisgICAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KSB7CisgICAgICBfX3AgPSBpbnNlcnQoX19wLCAqX19maXJzdCk7CisgICAgICArK19fcDsKKyAgICB9CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyPgorICB2b2lkIF9NX2luc2VydFQoaXRlcmF0b3IgX19wb3MsIF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgY29uc3QgZm9yd2FyZF9pdGVyYXRvcl90YWcgJikgeworICAgIGlmIChfX2ZpcnN0ICE9IF9fbGFzdCkgeworICAgICAgc2l6ZV90eXBlIF9fbiA9IF9TVExQX1NURDo6ZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KTsKKyAgICAgIGlmIChfX24gPCB0aGlzLT5fTV9yZXN0KCkpIHsKKyAgICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fZWxlbXNfYWZ0ZXIgPSB0aGlzLT5fTV9maW5pc2ggLSBfX3BvczsKKyAgICAgICAgaWYgKF9fZWxlbXNfYWZ0ZXIgPj0gX19uKSB7CisgICAgICAgICAgdW5pbml0aWFsaXplZF9jb3B5KCh0aGlzLT5fTV9GaW5pc2goKSAtIF9fbikgKyAxLCB0aGlzLT5fTV9GaW5pc2goKSArIDEsIHRoaXMtPl9NX0ZpbmlzaCgpICsgMSk7CisgICAgICAgICAgdGhpcy0+X01fZmluaXNoICs9IF9fbjsKKyAgICAgICAgICBfVHJhaXRzOjptb3ZlKF9fcG9zICsgX19uLCBfX3BvcywgKF9fZWxlbXNfYWZ0ZXIgLSBfX24pICsgMSk7CisgICAgICAgICAgX01fY29weVQoX19maXJzdCwgX19sYXN0LCBfX3Bvcyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgcG9pbnRlciBfX29sZF9maW5pc2ggPSB0aGlzLT5fTV9GaW5pc2goKTsKKyAgICAgICAgICBfRm9yd2FyZEl0ZXIgX19taWQgPSBfX2ZpcnN0OworICAgICAgICAgIF9TVExQX1NURDo6YWR2YW5jZShfX21pZCwgX19lbGVtc19hZnRlciArIDEpOworICAgICAgICAgIF9TVExQX1NURDo6dW5pbml0aWFsaXplZF9jb3B5KF9fbWlkLCBfX2xhc3QsIHRoaXMtPl9NX0ZpbmlzaCgpICsgMSk7CisgICAgICAgICAgdGhpcy0+X01fZmluaXNoICs9IF9fbiAtIF9fZWxlbXNfYWZ0ZXI7CisgICAgICAgICAgdW5pbml0aWFsaXplZF9jb3B5KF9fcG9zLCBfX29sZF9maW5pc2ggKyAxLCB0aGlzLT5fTV9GaW5pc2goKSk7CisgICAgICAgICAgdGhpcy0+X01fZmluaXNoICs9IF9fZWxlbXNfYWZ0ZXI7CisgICAgICAgICAgX01fY29weVQoX19maXJzdCwgX19taWQsIF9fcG9zKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIF9NX2luc2VydF9vdmVyZmxvdyhfX3BvcywgX19maXJzdCwgX19sYXN0LCBfX24pOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfSW50ZWdlcj4KKyAgdm9pZCBfTV9pbnNlcnRfZGlzcGF0Y2goaXRlcmF0b3IgX19wLCBfSW50ZWdlciBfX24sIF9JbnRlZ2VyIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX190cnVlX3R5cGUmIC8qSW50ZWdyYWwqLykKKyAgeyBpbnNlcnQoX19wLCAoc2l6ZV90eXBlKSBfX24sIChfQ2hhclQpIF9feCk7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcj4KKyAgdm9pZCBfTV9pbnNlcnRfZGlzcGF0Y2goaXRlcmF0b3IgX19wLCBfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qSW50ZWdyYWwqLykgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3ApCisgICAgLyogV2UgYXJlIGZvcmNlZCB0byBkbyBhIHRlbXBvcmFyeSBzdHJpbmcgdG8gYXZvaWQgdGhlIHNlbGYgcmVmZXJlbmNpbmcgaXNzdWUuICovCisgICAgY29uc3QgX1NlbGYgX19zZWxmKF9fZmlyc3QsIF9fbGFzdCwgZ2V0X2FsbG9jYXRvcigpKTsKKyAgICBfTV9pbnNlcnRUKF9fcCwgX19zZWxmLmJlZ2luKCksIF9fc2VsZi5lbmQoKSwgZm9yd2FyZF9pdGVyYXRvcl90YWcoKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZvaWQgX01fY29weVQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LCBwb2ludGVyIF9fcmVzdWx0KSB7CisgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcmVzdWx0KQorICAgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCwgKytfX3Jlc3VsdCkKKyAgICAgIF9UcmFpdHM6OmFzc2lnbigqX19yZXN1bHQsICpfX2ZpcnN0KTsKKyAgfQorCisjICAgIGlmICFkZWZpbmVkIChfU1RMUF9OT19NRVRIT0RfU1BFQ0lBTElaQVRJT04pCisgIHZvaWQgX01fY29weVQoY29uc3QgX0NoYXJUKiBfX2YsIGNvbnN0IF9DaGFyVCogX19sLCBfQ2hhclQqIF9fcmVzKSB7CisgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fZikgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fbCkKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19yZXMpCisgICAgX1RyYWl0czo6Y29weShfX3JlcywgX19mLCBfX2wgLSBfX2YpOworICB9CisjICAgIGVuZGlmCitwdWJsaWM6CisgIC8vIENoZWNrIHRvIHNlZSBpZiBfSW5wdXRJdGVyYXRvciBpcyBhbiBpbnRlZ2VyIHR5cGUuICBJZiBzbywgdGhlbgorICAvLyBpdCBjYW4ndCBiZSBhbiBpdGVyYXRvci4KKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXI+CisgIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcCwgX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCkgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lzSW50ZWdyYWw8X0lucHV0SXRlcj46Ol9SZXQgX0ludGVncmFsOworICAgIF9NX2luc2VydF9kaXNwYXRjaChfX3AsIF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOworICB9CisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykgfHwgIWRlZmluZWQgKF9TVExQX05PX01FVEhPRF9TUEVDSUFMSVpBVElPTikKK3B1YmxpYzoKKyAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wLCBjb25zdCBfQ2hhclQqIF9fZiwgY29uc3QgX0NoYXJUKiBfX2wpIHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19mKSBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19sKQorICAgIF9NX2luc2VydChfX3AsIF9fZiwgX19sLCBfTV9pbnNpZGUoX19mKSk7CisgIH0KKyNlbmRpZgorCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVyYXNlLgorICBfU2VsZiYgZXJhc2Uoc2l6ZV90eXBlIF9fcG9zID0gMCwgc2l6ZV90eXBlIF9fbiA9IG5wb3MpIHsKKyAgICBpZiAoX19wb3MgPiBzaXplKCkpCisgICAgICB0aGlzLT5fTV90aHJvd19vdXRfb2ZfcmFuZ2UoKTsKKyAgICBlcmFzZShiZWdpbigpICsgX19wb3MsIGJlZ2luKCkgKyBfX3BvcyArIChtaW4pIChfX24sIHNpemUoKSAtIF9fcG9zKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgaXRlcmF0b3IgZXJhc2UoaXRlcmF0b3IgX19wb3MpIHsKKyAgICAvLyBUaGUgbW92ZSBpbmNsdWRlcyB0aGUgdGVybWluYXRpbmcgX0NoYXJUKCkuCisgICAgX1RyYWl0czo6bW92ZShfX3BvcywgX19wb3MgKyAxLCB0aGlzLT5fTV9GaW5pc2goKSAtIF9fcG9zKTsKKyAgICAtLXRoaXMtPl9NX2ZpbmlzaDsKKyAgICByZXR1cm4gX19wb3M7CisgIH0KKworICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpIHsKKyAgICBpZiAoX19maXJzdCAhPSBfX2xhc3QpIHsKKyAgICAgIC8vIFRoZSBtb3ZlIGluY2x1ZGVzIHRoZSB0ZXJtaW5hdGluZyBfQ2hhclQoKS4KKyAgICAgIHRyYWl0c190eXBlOjptb3ZlKF9fZmlyc3QsIF9fbGFzdCwgKHRoaXMtPl9NX0ZpbmlzaCgpIC0gX19sYXN0KSArIDEpOworICAgICAgdGhpcy0+X01fZmluaXNoID0gdGhpcy0+X01fRmluaXNoKCkgLSAoX19sYXN0IC0gX19maXJzdCk7CisgICAgfQorICAgIHJldHVybiBfX2ZpcnN0OworICB9CisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVwbGFjZS4gIChDb25jZXB0dWFsbHkgZXF1aXZhbGVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBlcmFzZSBmb2xsb3dlZCBieSBpbnNlcnQuKQorICBfU2VsZiYgcmVwbGFjZShzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24sIGNvbnN0IF9TZWxmJiBfX3MpIHsKKyAgICBjb25zdCBzaXplX3R5cGUgX19zaXplID0gc2l6ZSgpOworICAgIGlmIChfX3BvcyA+IF9fc2l6ZSkKKyAgICAgIHRoaXMtPl9NX3Rocm93X291dF9vZl9yYW5nZSgpOworICAgIGNvbnN0IHNpemVfdHlwZSBfX2xlbiA9IChtaW4pIChfX24sIF9fc2l6ZSAtIF9fcG9zKTsKKyAgICBpZiAoX19zLnNpemUoKSA+IG1heF9zaXplKCkgLSAoX19zaXplIC0gX19sZW4pKQorICAgICAgdGhpcy0+X01fdGhyb3dfbGVuZ3RoX2Vycm9yKCk7CisgICAgcmV0dXJuIF9NX3JlcGxhY2UoYmVnaW4oKSArIF9fcG9zLCBiZWdpbigpICsgX19wb3MgKyBfX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICBfX3MuX01fU3RhcnQoKSwgX19zLl9NX0ZpbmlzaCgpLCAmX19zID09IHRoaXMpOworICB9CisKKyAgX1NlbGYmIHJlcGxhY2Uoc2l6ZV90eXBlIF9fcG9zMSwgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IF9TZWxmJiBfX3MsCisgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX3BvczIsIHNpemVfdHlwZSBfX24yKSB7CisgICAgY29uc3Qgc2l6ZV90eXBlIF9fc2l6ZTEgPSBzaXplKCk7CisgICAgY29uc3Qgc2l6ZV90eXBlIF9fc2l6ZTIgPSBfX3Muc2l6ZSgpOworICAgIGlmIChfX3BvczEgPiBfX3NpemUxIHx8IF9fcG9zMiA+IF9fc2l6ZTIpCisgICAgICB0aGlzLT5fTV90aHJvd19vdXRfb2ZfcmFuZ2UoKTsKKyAgICBjb25zdCBzaXplX3R5cGUgX19sZW4xID0gKG1pbikgKF9fbjEsIF9fc2l6ZTEgLSBfX3BvczEpOworICAgIGNvbnN0IHNpemVfdHlwZSBfX2xlbjIgPSAobWluKSAoX19uMiwgX19zaXplMiAtIF9fcG9zMik7CisgICAgaWYgKF9fbGVuMiA+IG1heF9zaXplKCkgLSAoX19zaXplMSAtIF9fbGVuMSkpCisgICAgICB0aGlzLT5fTV90aHJvd19sZW5ndGhfZXJyb3IoKTsKKyAgICByZXR1cm4gX01fcmVwbGFjZShiZWdpbigpICsgX19wb3MxLCBiZWdpbigpICsgX19wb3MxICsgX19sZW4xLAorICAgICAgICAgICAgICAgICAgICAgIF9fcy5fTV9TdGFydCgpICsgX19wb3MyLCBfX3MuX01fU3RhcnQoKSArIF9fcG9zMiArIF9fbGVuMiwgJl9fcyA9PSB0aGlzKTsKKyAgfQorCisgIF9TZWxmJiByZXBsYWNlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbjEsCisgICAgICAgICAgICAgICAgIGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uMikgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgICAgY29uc3Qgc2l6ZV90eXBlIF9fc2l6ZSA9IHNpemUoKTsKKyAgICBpZiAoX19wb3MgPiBfX3NpemUpCisgICAgICB0aGlzLT5fTV90aHJvd19vdXRfb2ZfcmFuZ2UoKTsKKyAgICBjb25zdCBzaXplX3R5cGUgX19sZW4gPSAobWluKSAoX19uMSwgX19zaXplIC0gX19wb3MpOworICAgIGlmIChfX24yID4gbWF4X3NpemUoKSAtIChfX3NpemUgLSBfX2xlbikpCisgICAgICB0aGlzLT5fTV90aHJvd19sZW5ndGhfZXJyb3IoKTsKKyAgICByZXR1cm4gX01fcmVwbGFjZShiZWdpbigpICsgX19wb3MsIGJlZ2luKCkgKyBfX3BvcyArIF9fbGVuLAorICAgICAgICAgICAgICAgICAgICAgIF9fcywgX19zICsgX19uMiwgX01faW5zaWRlKF9fcykpOworICB9CisKKyAgX1NlbGYmIHJlcGxhY2Uoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uMSwgY29uc3QgX0NoYXJUKiBfX3MpIHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKQorICAgIHJldHVybiByZXBsYWNlKF9fcG9zLCBfX24xLCBfX3MsIF9UcmFpdHM6Omxlbmd0aChfX3MpKTsKKyAgfQorCisgIF9TZWxmJiByZXBsYWNlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbjEsCisgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX24yLCBfQ2hhclQgX19jKSB7CisgICAgY29uc3Qgc2l6ZV90eXBlIF9fc2l6ZSA9IHNpemUoKTsKKyAgICBpZiAoX19wb3MgPiBfX3NpemUpCisgICAgICB0aGlzLT5fTV90aHJvd19vdXRfb2ZfcmFuZ2UoKTsKKyAgICBjb25zdCBzaXplX3R5cGUgX19sZW4gPSAobWluKSAoX19uMSwgX19zaXplIC0gX19wb3MpOworICAgIGlmIChfX24yID4gbWF4X3NpemUoKSAtIChfX3NpemUgLSBfX2xlbikpCisgICAgICB0aGlzLT5fTV90aHJvd19sZW5ndGhfZXJyb3IoKTsKKyAgICByZXR1cm4gcmVwbGFjZShiZWdpbigpICsgX19wb3MsIGJlZ2luKCkgKyBfX3BvcyArIF9fbGVuLCBfX24yLCBfX2MpOworICB9CisKKyAgX1NlbGYmIHJlcGxhY2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0LCBjb25zdCBfU2VsZiYgX19zKSB7CisgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fZmlyc3QpX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fbGFzdCkKKyAgICByZXR1cm4gX01fcmVwbGFjZShfX2ZpcnN0LCBfX2xhc3QsIF9fcy5fTV9TdGFydCgpLCBfX3MuX01fRmluaXNoKCksICZfX3MgPT0gdGhpcyk7CisgIH0KKworICBfU2VsZiYgcmVwbGFjZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgIGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uKSB7CisgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fZmlyc3QpX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fbGFzdCkKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKQorICAgIHJldHVybiBfTV9yZXBsYWNlKF9fZmlyc3QsIF9fbGFzdCwgX19zLCBfX3MgKyBfX24sIF9NX2luc2lkZShfX3MpKTsKKyAgfQorCisgIF9TZWxmJiByZXBsYWNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgY29uc3QgX0NoYXJUKiBfX3MpIHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19maXJzdClfU1RMUF9GSVhfTElURVJBTF9CVUcoX19sYXN0KQorICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgICAgcmV0dXJuIF9NX3JlcGxhY2UoX19maXJzdCwgX19sYXN0LCBfX3MsIF9fcyArIF9UcmFpdHM6Omxlbmd0aChfX3MpLCBfTV9pbnNpZGUoX19zKSk7CisgIH0KKworICBfU2VsZiYgcmVwbGFjZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QsIHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MpOworCitfU1RMUF9QUklWQVRFOiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIHJlcGxhY2UuCisgIF9TZWxmJiBfTV9yZXBsYWNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgX0NoYXJUKiBfX2YsIGNvbnN0IF9DaGFyVCogX19sLCBib29sIF9fc2VsZl9yZWYpOworCisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykgJiYgIWRlZmluZWQgKF9TVExQX1VTRV9NU1ZDNl9NRU1fVF9CVUdfV09SS0FST1VORCkKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2VyPgorICBfU2VsZiYgX01fcmVwbGFjZV9kaXNwYXRjaChpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX194LCBjb25zdCBfX3RydWVfdHlwZSYgLypJc0ludGVncmFsKi8pIHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19maXJzdCkgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fbGFzdCkKKyAgICByZXR1cm4gcmVwbGFjZShfX2ZpcnN0LCBfX2xhc3QsIChzaXplX3R5cGUpIF9fbiwgKF9DaGFyVCkgX194KTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgorICBfU2VsZiYgX01fcmVwbGFjZV9kaXNwYXRjaChpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIgX19mLCBfSW5wdXRJdGVyIF9fbCwgY29uc3QgX19mYWxzZV90eXBlJiAvKklzSW50ZWdyYWwqLykgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2ZpcnN0KSBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19sYXN0KQorICAgIC8qIFdlIGFyZSBmb3JjZWQgdG8gZG8gYSB0ZW1wb3Jhcnkgc3RyaW5nIHRvIGF2b2lkIHRoZSBzZWxmIHJlZmVyZW5jaW5nIGlzc3VlLiAqLworICAgIGNvbnN0IF9TZWxmIF9fc2VsZihfX2YsIF9fbCwgZ2V0X2FsbG9jYXRvcigpKTsKKyAgICByZXR1cm4gX01fcmVwbGFjZShfX2ZpcnN0LCBfX2xhc3QsIF9fc2VsZi5fTV9TdGFydCgpLCBfX3NlbGYuX01fRmluaXNoKCksIGZhbHNlKTsKKyAgfQorCitwdWJsaWM6CisgIC8vIENoZWNrIHRvIHNlZSBpZiBfSW5wdXRJdGVyIGlzIGFuIGludGVnZXIgdHlwZS4gIElmIHNvLCB0aGVuCisgIC8vIGl0IGNhbid0IGJlIGFuIGl0ZXJhdG9yLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcj4KKyAgX1NlbGYmIHJlcGxhY2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyIF9fZiwgX0lucHV0SXRlciBfX2wpIHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19maXJzdClfU1RMUF9GSVhfTElURVJBTF9CVUcoX19sYXN0KQorICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lzSW50ZWdyYWw8X0lucHV0SXRlcj46Ol9SZXQgX0ludGVncmFsOworICAgIHJldHVybiBfTV9yZXBsYWNlX2Rpc3BhdGNoKF9fZmlyc3QsIF9fbGFzdCwgX19mLCBfX2wsICBfSW50ZWdyYWwoKSk7CisgIH0KKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpIHx8ICFkZWZpbmVkIChfU1RMUF9OT19NRVRIT0RfU1BFQ0lBTElaQVRJT04pCitwdWJsaWM6CisgIF9TZWxmJiByZXBsYWNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgY29uc3QgX0NoYXJUKiBfX2YsIGNvbnN0IF9DaGFyVCogX19sKSB7CisgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fZmlyc3QpX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fbGFzdCkKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19mKSBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19sKQorICAgIHJldHVybiBfTV9yZXBsYWNlKF9fZmlyc3QsIF9fbGFzdCwgX19mLCBfX2wsIF9NX2luc2lkZShfX2YpKTsKKyAgfQorI2VuZGlmCisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXIgbW9kaWZpZXIgbWVtYmVyIGZ1bmN0aW9ucy4KKworICBzaXplX3R5cGUgY29weShfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbiwgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgICAgaWYgKF9fcG9zID4gc2l6ZSgpKQorICAgICAgdGhpcy0+X01fdGhyb3dfb3V0X29mX3JhbmdlKCk7CisgICAgY29uc3Qgc2l6ZV90eXBlIF9fbGVuID0gKG1pbikgKF9fbiwgc2l6ZSgpIC0gX19wb3MpOworICAgIF9UcmFpdHM6OmNvcHkoX19zLCB0aGlzLT5fTV9TdGFydCgpICsgX19wb3MsIF9fbGVuKTsKKyAgICByZXR1cm4gX19sZW47CisgIH0KKworICB2b2lkIHN3YXAoX1NlbGYmIF9fcykgeyB0aGlzLT5fTV9zd2FwKF9fcyk7IH0KKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUEFSVElBTF9TUEVDX1dPUktBUk9VTkQpICYmICFkZWZpbmVkIChfU1RMUF9GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIpCisgIHZvaWQgX01fc3dhcF93b3JrYXJvdW5kKF9TZWxmJiBfX3gpIHsgc3dhcChfX3gpOyB9CisjZW5kaWYKKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb252ZXJzaW9uIHRvIEMgc3RyaW5nLgorCisgIGNvbnN0IF9DaGFyVCogY19zdHIoKSBjb25zdCB7IHJldHVybiB0aGlzLT5fTV9TdGFydCgpOyB9CisgIGNvbnN0IF9DaGFyVCogZGF0YSgpICBjb25zdCB7IHJldHVybiB0aGlzLT5fTV9TdGFydCgpOyB9CisKK3B1YmxpYzogLy8gZmluZC4KKyAgc2l6ZV90eXBlIGZpbmQoY29uc3QgX1NlbGYmIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QKKyAgeyByZXR1cm4gZmluZChfX3MuX01fU3RhcnQoKSwgX19wb3MsIF9fcy5zaXplKCkpOyB9CisKKyAgc2l6ZV90eXBlIGZpbmQoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0CisgIHsgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykgcmV0dXJuIGZpbmQoX19zLCBfX3BvcywgX1RyYWl0czo6bGVuZ3RoKF9fcykpOyB9CisKKyAgc2l6ZV90eXBlIGZpbmQoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgY29uc3Q7CisKKyAgLy8gV0lFOiBWZXJzYW50IHNjaGVtYSBjb21waWxlciA1LjIuMiBJQ0Ugd29ya2Fyb3VuZAorICBzaXplX3R5cGUgZmluZChfQ2hhclQgX19jKSBjb25zdCB7IHJldHVybiBmaW5kKF9fYywgMCk7IH0KKyAgc2l6ZV90eXBlIGZpbmQoX0NoYXJUIF9fYywgc2l6ZV90eXBlIF9fcG9zIC8qID0gMCAqLykgY29uc3Q7CisKK3B1YmxpYzogLy8gcmZpbmQuCisgIHNpemVfdHlwZSByZmluZChjb25zdCBfU2VsZiYgX19zLCBzaXplX3R5cGUgX19wb3MgPSBucG9zKSBjb25zdAorICB7IHJldHVybiByZmluZChfX3MuX01fU3RhcnQoKSwgX19wb3MsIF9fcy5zaXplKCkpOyB9CisKKyAgc2l6ZV90eXBlIHJmaW5kKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MgPSBucG9zKSBjb25zdAorICB7IF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpIHJldHVybiByZmluZChfX3MsIF9fcG9zLCBfVHJhaXRzOjpsZW5ndGgoX19zKSk7IH0KKworICBzaXplX3R5cGUgcmZpbmQoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgY29uc3Q7CisgIHNpemVfdHlwZSByZmluZChfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MgPSBucG9zKSBjb25zdDsKKworcHVibGljOiAvLyBmaW5kX2ZpcnN0X29mCisgIHNpemVfdHlwZSBmaW5kX2ZpcnN0X29mKGNvbnN0IF9TZWxmJiBfX3MsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0CisgIHsgcmV0dXJuIGZpbmRfZmlyc3Rfb2YoX19zLl9NX1N0YXJ0KCksIF9fcG9zLCBfX3Muc2l6ZSgpKTsgfQorCisgIHNpemVfdHlwZSBmaW5kX2ZpcnN0X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdAorICB7IF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpIHJldHVybiBmaW5kX2ZpcnN0X29mKF9fcywgX19wb3MsIF9UcmFpdHM6Omxlbmd0aChfX3MpKTsgfQorCisgIHNpemVfdHlwZSBmaW5kX2ZpcnN0X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIGNvbnN0OworCisgIHNpemVfdHlwZSBmaW5kX2ZpcnN0X29mKF9DaGFyVCBfX2MsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0CisgIHsgcmV0dXJuIGZpbmQoX19jLCBfX3Bvcyk7IH0KKworcHVibGljOiAvLyBmaW5kX2xhc3Rfb2YKKyAgc2l6ZV90eXBlIGZpbmRfbGFzdF9vZihjb25zdCBfU2VsZiYgX19zLCBzaXplX3R5cGUgX19wb3MgPSBucG9zKSBjb25zdAorICB7IHJldHVybiBmaW5kX2xhc3Rfb2YoX19zLl9NX1N0YXJ0KCksIF9fcG9zLCBfX3Muc2l6ZSgpKTsgfQorCisgIHNpemVfdHlwZSBmaW5kX2xhc3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3BvcyA9IG5wb3MpIGNvbnN0CisgIHsgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykgcmV0dXJuIGZpbmRfbGFzdF9vZihfX3MsIF9fcG9zLCBfVHJhaXRzOjpsZW5ndGgoX19zKSk7IH0KKworICBzaXplX3R5cGUgZmluZF9sYXN0X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIGNvbnN0OworCisgIHNpemVfdHlwZSBmaW5kX2xhc3Rfb2YoX0NoYXJUIF9fYywgc2l6ZV90eXBlIF9fcG9zID0gbnBvcykgY29uc3QKKyAgeyByZXR1cm4gcmZpbmQoX19jLCBfX3Bvcyk7IH0KKworcHVibGljOiAvLyBmaW5kX2ZpcnN0X25vdF9vZgorICBzaXplX3R5cGUgZmluZF9maXJzdF9ub3Rfb2YoY29uc3QgX1NlbGYmIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QKKyAgeyByZXR1cm4gZmluZF9maXJzdF9ub3Rfb2YoX19zLl9NX1N0YXJ0KCksIF9fcG9zLCBfX3Muc2l6ZSgpKTsgfQorCisgIHNpemVfdHlwZSBmaW5kX2ZpcnN0X25vdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QKKyAgeyBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKSByZXR1cm4gZmluZF9maXJzdF9ub3Rfb2YoX19zLCBfX3BvcywgX1RyYWl0czo6bGVuZ3RoKF9fcykpOyB9CisKKyAgc2l6ZV90eXBlIGZpbmRfZmlyc3Rfbm90X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIGNvbnN0OworCisgIHNpemVfdHlwZSBmaW5kX2ZpcnN0X25vdF9vZihfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdDsKKworcHVibGljOiAvLyBmaW5kX2xhc3Rfbm90X29mCisgIHNpemVfdHlwZSBmaW5kX2xhc3Rfbm90X29mKGNvbnN0IF9TZWxmJiBfX3MsIHNpemVfdHlwZSBfX3BvcyA9IG5wb3MpIGNvbnN0CisgIHsgcmV0dXJuIGZpbmRfbGFzdF9ub3Rfb2YoX19zLl9NX1N0YXJ0KCksIF9fcG9zLCBfX3Muc2l6ZSgpKTsgfQorCisgIHNpemVfdHlwZSBmaW5kX2xhc3Rfbm90X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MgPSBucG9zKSBjb25zdAorICB7IF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpIHJldHVybiBmaW5kX2xhc3Rfbm90X29mKF9fcywgX19wb3MsIF9UcmFpdHM6Omxlbmd0aChfX3MpKTsgfQorCisgIHNpemVfdHlwZSBmaW5kX2xhc3Rfbm90X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIGNvbnN0OworCisgIHNpemVfdHlwZSBmaW5kX2xhc3Rfbm90X29mKF9DaGFyVCBfX2MsIHNpemVfdHlwZSBfX3BvcyA9IG5wb3MpIGNvbnN0OworCitwdWJsaWM6IC8vIFN1YnN0cmluZy4KKyAgX1NlbGYgc3Vic3RyKHNpemVfdHlwZSBfX3BvcyA9IDAsIHNpemVfdHlwZSBfX24gPSBucG9zKSBjb25zdAorICB7IHJldHVybiBfU2VsZigqdGhpcywgX19wb3MsIF9fbiwgZ2V0X2FsbG9jYXRvcigpKTsgfQorCitwdWJsaWM6IC8vIENvbXBhcmUKKyAgaW50IGNvbXBhcmUoY29uc3QgX1NlbGYmIF9fcykgY29uc3QKKyAgeyByZXR1cm4gX01fY29tcGFyZSh0aGlzLT5fTV9TdGFydCgpLCB0aGlzLT5fTV9GaW5pc2goKSwgX19zLl9NX1N0YXJ0KCksIF9fcy5fTV9GaW5pc2goKSk7IH0KKworICBpbnQgY29tcGFyZShzaXplX3R5cGUgX19wb3MxLCBzaXplX3R5cGUgX19uMSwgY29uc3QgX1NlbGYmIF9fcykgY29uc3QgeworICAgIGlmIChfX3BvczEgPiBzaXplKCkpCisgICAgICB0aGlzLT5fTV90aHJvd19vdXRfb2ZfcmFuZ2UoKTsKKyAgICByZXR1cm4gX01fY29tcGFyZSh0aGlzLT5fTV9TdGFydCgpICsgX19wb3MxLAorICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPl9NX1N0YXJ0KCkgKyBfX3BvczEgKyAobWluKSAoX19uMSwgc2l6ZSgpIC0gX19wb3MxKSwKKyAgICAgICAgICAgICAgICAgICAgICBfX3MuX01fU3RhcnQoKSwgX19zLl9NX0ZpbmlzaCgpKTsKKyAgfQorCisgIGludCBjb21wYXJlKHNpemVfdHlwZSBfX3BvczEsIHNpemVfdHlwZSBfX24xLCBjb25zdCBfU2VsZiYgX19zLAorICAgICAgICAgICAgICBzaXplX3R5cGUgX19wb3MyLCBzaXplX3R5cGUgX19uMikgY29uc3QgeworICAgIGlmIChfX3BvczEgPiBzaXplKCkgfHwgX19wb3MyID4gX19zLnNpemUoKSkKKyAgICAgIHRoaXMtPl9NX3Rocm93X291dF9vZl9yYW5nZSgpOworICAgIHJldHVybiBfTV9jb21wYXJlKHRoaXMtPl9NX1N0YXJ0KCkgKyBfX3BvczEsCisgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+X01fU3RhcnQoKSArIF9fcG9zMSArIChtaW4pIChfX24xLCBzaXplKCkgLSBfX3BvczEpLAorICAgICAgICAgICAgICAgICAgICAgIF9fcy5fTV9TdGFydCgpICsgX19wb3MyLAorICAgICAgICAgICAgICAgICAgICAgIF9fcy5fTV9TdGFydCgpICsgX19wb3MyICsgKG1pbikgKF9fbjIsIF9fcy5zaXplKCkgLSBfX3BvczIpKTsKKyAgfQorCisgIGludCBjb21wYXJlKGNvbnN0IF9DaGFyVCogX19zKSBjb25zdCB7CisgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKKyAgICByZXR1cm4gX01fY29tcGFyZSh0aGlzLT5fTV9TdGFydCgpLCB0aGlzLT5fTV9GaW5pc2goKSwgX19zLCBfX3MgKyBfVHJhaXRzOjpsZW5ndGgoX19zKSk7CisgIH0KKworICBpbnQgY29tcGFyZShzaXplX3R5cGUgX19wb3MxLCBzaXplX3R5cGUgX19uMSwgY29uc3QgX0NoYXJUKiBfX3MpIGNvbnN0IHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKQorICAgIGlmIChfX3BvczEgPiBzaXplKCkpCisgICAgICB0aGlzLT5fTV90aHJvd19vdXRfb2ZfcmFuZ2UoKTsKKyAgICByZXR1cm4gX01fY29tcGFyZSh0aGlzLT5fTV9TdGFydCgpICsgX19wb3MxLAorICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPl9NX1N0YXJ0KCkgKyBfX3BvczEgKyAobWluKSAoX19uMSwgc2l6ZSgpIC0gX19wb3MxKSwKKyAgICAgICAgICAgICAgICAgICAgICBfX3MsIF9fcyArIF9UcmFpdHM6Omxlbmd0aChfX3MpKTsKKyAgfQorCisgIGludCBjb21wYXJlKHNpemVfdHlwZSBfX3BvczEsIHNpemVfdHlwZSBfX24xLCBjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbjIpIGNvbnN0IHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKQorICAgIGlmIChfX3BvczEgPiBzaXplKCkpCisgICAgICB0aGlzLT5fTV90aHJvd19vdXRfb2ZfcmFuZ2UoKTsKKyAgICByZXR1cm4gX01fY29tcGFyZSh0aGlzLT5fTV9TdGFydCgpICsgX19wb3MxLAorICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPl9NX1N0YXJ0KCkgKyBfX3BvczEgKyAobWluKSAoX19uMSwgc2l6ZSgpIC0gX19wb3MxKSwKKyAgICAgICAgICAgICAgICAgICAgICBfX3MsIF9fcyArIF9fbjIpOworICB9CisKK3B1YmxpYzogLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgY29tcGFyZS4KKyAgc3RhdGljIGludCBfU1RMUF9DQUxMIF9NX2NvbXBhcmUoY29uc3QgX0NoYXJUKiBfX2YxLCBjb25zdCBfQ2hhclQqIF9fbDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9DaGFyVCogX19mMiwgY29uc3QgX0NoYXJUKiBfX2wyKSB7CisgICAgY29uc3QgcHRyZGlmZl90IF9fbjEgPSBfX2wxIC0gX19mMTsKKyAgICBjb25zdCBwdHJkaWZmX3QgX19uMiA9IF9fbDIgLSBfX2YyOworICAgIGNvbnN0IGludCBjbXAgPSBfVHJhaXRzOjpjb21wYXJlKF9fZjEsIF9fZjIsIChtaW4pIChfX24xLCBfX24yKSk7CisgICAgcmV0dXJuIGNtcCAhPSAwID8gY21wIDogKF9fbjEgPCBfX24yID8gLTEgOiAoX19uMSA+IF9fbjIgPyAxIDogMCkpOworICB9CisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1RFTVBMQVRFX0VYUFJFU1NJT04pICYmICFkZWZpbmVkIChfU1RMUF9ERUJVRykgJiYgIWRlZmluZWQgKF9TVExQX1VTRV9NU1ZDNl9NRU1fVF9CVUdfV09SS0FST1VORCkKKyMgIGRlZmluZSBfU1RMUF9TVFJJTkdfU1VNX0JBU0UoX19yZXNlcnZlLCBfX3NpemUsIF9fYWxsb2MpIF9TVExQX1BSSVYgX1N0cmluZ19iYXNlPF9DaGFyVCxfQWxsb2M+KF9fYWxsb2MsIF9fc2l6ZSArIDEpCisjICBpbmNsdWRlIDxzdGwvX3N0cmluZ19zdW1fbWV0aG9kcy5oPgorIyAgdW5kZWYgX1NUTFBfU1RSSU5HX1NVTV9CQVNFCisjZW5kaWYKK307CisKKyN1bmRlZiBfU1RMUF9QUklWQVRFCisKKyNpZiBkZWZpbmVkIChfX0dOVUNfXykgJiYgKF9fR05VQ19fID09IDIpICYmIChfX0dOVUNfTUlOT1JfXyA9PSA5NikKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK2NvbnN0IHNpemVfdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjpucG9zID0gfihzaXplX3QpIDA7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9URU1QTEFURV9FWFBPUlQpCitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgYmFzaWNfc3RyaW5nPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+LCBhbGxvY2F0b3I8Y2hhcj4gPjsKKyMgIGlmIGRlZmluZWQgKF9TVExQX0hBU19XQ0hBUl9UKQorX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIGJhc2ljX3N0cmluZzx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiwgYWxsb2NhdG9yPHdjaGFyX3Q+ID47CisjICBlbmRpZgorI2VuZGlmIC8qIF9TVExQX1VTRV9URU1QTEFURV9FWFBPUlQgKi8KKworI2lmIGRlZmluZWQgKGJhc2ljX3N0cmluZykKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorIyAgdW5kZWYgYmFzaWNfc3RyaW5nCisjZW5kaWYKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX01TVkM2X01FTV9UX0JVR19XT1JLQVJPVU5EKQorIyAgaW5jbHVkZSA8c3RsL19zdHJpbmdfd29ya2Fyb3VuZC5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9ERUJVRykKKyMgIGluY2x1ZGUgPHN0bC9kZWJ1Zy9fc3RyaW5nLmg+CisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTm9uLW1lbWJlciBmdW5jdGlvbnMuCisvLyBTd2FwLgorI2lmIGRlZmluZWQgKF9TVExQX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUikKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK2lubGluZSB2b2lkIF9TVExQX0NBTEwKK3N3YXAoYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4mIF9feCwKKyAgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4mIF9feSkKK3sgX194LnN3YXAoX195KTsgfQorI2Vsc2UKK2lubGluZSB2b2lkIF9TVExQX0NBTEwgc3dhcChzdHJpbmcmIF9feCwgc3RyaW5nJiBfX3kpCit7IF9feC5zd2FwKF9feSk7IH0KKyMgIGlmIGRlZmluZWQgKF9TVExQX0hBU19XQ0hBUl9UKQoraW5saW5lIHZvaWQgX1NUTFBfQ0FMTCBzd2FwKHdzdHJpbmcmIF9feCwgd3N0cmluZyYgX195KQoreyBfX3guc3dhcChfX3kpOyB9CisjICBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK3N0cnVjdCBfX21vdmVfdHJhaXRzPGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4gPiB7CisgIHR5cGVkZWYgX190cnVlX3R5cGUgaW1wbGVtZW50ZWQ7CisgIC8vQ29tcGxldG5lc3MgZGVwZW5kcyBvbiB0aGUgYWxsb2NhdG9yOgorICB0eXBlZGVmIHR5cGVuYW1lIF9fbW92ZV90cmFpdHM8X0FsbG9jPjo6Y29tcGxldGUgY29tcGxldGU7Cit9OworLyojZWxzZQorICogVGhlcmUgaXMgbm8gbmVlZCB0byBzcGVjaWFsaXplIGZvciBzdHJpbmcgYW5kIHdzdHJpbmcgaW4gdGhpcyBjYXNlCisgKiBhcyB0aGUgZGVmYXVsdCBfX21vdmVfdHJhaXRzIHdpbGwgYWxyZWFkeSB0ZWxsIHRoYXQgc3RyaW5nIGlzIG1vdmFibGUKKyAqIGJ1dCBub3QgY29tcGxldGUuIFdlIGNhbm5vdCBkZWZpbmUgaXQgYXMgY29tcGxldGUgYXMgbm90aGluZyBndWFyYW50eQorICogdGhhdCB0aGUgU1RMcG9ydCB1c2VyIGhhc24ndCBzcGVjaWFsaXplZCBzdGQ6OmFsbG9jYXRvciBmb3IgY2hhciBvcgorICogd2NoYXJfdC4KKyAqLworI2VuZGlmCisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgordm9pZCBfU1RMUF9DQUxMIF9TX3N0cmluZ19jb3B5KGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+JiBfX3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NoYXJUKiBfX2J1Ziwgc2l6ZV90IF9fbik7CisKKyNpZiBkZWZpbmVkKF9TVExQX1VTRV9XSURFX0lOVEVSRkFDRSkKKy8vIEEgY291cGxlIG9mIGZ1bmN0aW9ucyB0byB0cmFuc2ZlciBiZXR3ZWVuIEFTQ0lJL1VuaWNvZGUKK3dzdHJpbmcgX19BU0NJSVRvV2lkZShjb25zdCBjaGFyICphc2NpaSk7CitzdHJpbmcgX19XaWRlVG9BU0NJSShjb25zdCB3Y2hhcl90ICp3aWRlKTsKKyNlbmRpZgorCitpbmxpbmUgY29uc3QgY2hhciogX1NUTFBfQ0FMTAorX19nZXRfY19zdHJpbmcoY29uc3Qgc3RyaW5nJiBfX3N0cikgeyByZXR1cm4gX19zdHIuY19zdHIoKTsgfQorCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjaW5jbHVkZSA8c3RsL19zdHJpbmdfb3BlcmF0b3JzLmg+CisKKyNpZiBkZWZpbmVkKF9TVExQX1VTRV9OT19JT1NUUkVBTVMpIHx8IFwKKyAgICAoZGVmaW5lZCAoX1NUTFBfRVhQT1NFX1NUUkVBTV9JTVBMRU1FTlRBVElPTikgJiYgIWRlZmluZWQgKF9TVExQX0xJTktfVElNRV9JTlNUQU5USUFUSU9OKSkKKyMgIGluY2x1ZGUgPHN0bC9fc3RyaW5nLmM+CisjZW5kaWYKKworI2VuZGlmIC8qIF9TVExQX0lOVEVSTkFMX1NUUklOR19IICovCisKKy8qCisgKiBMb2NhbCBWYXJpYWJsZXM6CisgKiBtb2RlOkMrKworICogRW5kOgorICovCmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9fc3RyaW5nX2Jhc2UuaCBiL3N0bHBvcnQvc3RsL19zdHJpbmdfYmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNmQ3ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9fc3RyaW5nX2Jhc2UuaApAQCAtMCwwICsxLDIzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5Ny0xOTk5CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMworICogRnJhbmNvaXMgRHVtb250CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfU1RSSU5HX0JBU0VfSAorI2RlZmluZSBfU1RMUF9TVFJJTkdfQkFTRV9ICisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ2xhc3MgX1N0cmluZ19iYXNlLgorCisvLyBfU3RyaW5nX2Jhc2UgaXMgYSBoZWxwZXIgY2xhc3MgdGhhdCBtYWtlcyBpdCBpdCBlYXNpZXIgdG8gd3JpdGUgYW4KKy8vIGV4Y2VwdGlvbi1zYWZlIHZlcnNpb24gb2YgYmFzaWNfc3RyaW5nLiAgVGhlIGNvbnN0cnVjdG9yIGFsbG9jYXRlcywKKy8vIGJ1dCBkb2VzIG5vdCBpbml0aWFsaXplLCBhIGJsb2NrIG9mIG1lbW9yeS4gIFRoZSBkZXN0cnVjdG9yCisvLyBkZWFsbG9jYXRlcywgYnV0IGRvZXMgbm90IGRlc3Ryb3kgZWxlbWVudHMgd2l0aGluLCBhIGJsb2NrIG9mCisvLyBtZW1vcnkuICBUaGUgZGVzdHJ1Y3RvciBhc3N1bWVzIHRoYXQgX01fc3RhcnQgZWl0aGVyIGlzIG51bGwsIG9yIGVsc2UKKy8vIHBvaW50cyB0byBhIGJsb2NrIG9mIG1lbW9yeSB0aGF0IHdhcyBhbGxvY2F0ZWQgdXNpbmcgX1N0cmluZ19iYXNlJ3MKKy8vIGFsbG9jYXRvciBhbmQgd2hvc2Ugc2l6ZSBpcyBfTV9lbmRfb2Zfc3RvcmFnZSAtIF9NX3N0YXJ0X29mX3N0b3JhZ2UuX01fZGF0YS4KKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgorY2xhc3MgX1N0cmluZ19iYXNlIHsKKyAgICB0eXBlZGVmIF9TdHJpbmdfYmFzZTxfVHAsIF9BbGxvYz4gX1NlbGY7Citwcm90ZWN0ZWQ6CisgIF9TVExQX0ZPUkNFX0FMTE9DQVRPUlMoX1RwLCBfQWxsb2MpCitwdWJsaWM6CisgIC8vZHVtczogU29tZSBjb21waWxlcihNU1ZDNikgcmVxdWlyZSBpdCB0byBiZSBwdWJsaWMgbm90IHNpbXBseSBwcm90ZWN0ZWQhCisgIGVudW0ge19ERUZBVUxUX1NJWkUgPSA0ICogc2l6ZW9mKCB2b2lkICogKX07CisgIC8vVGhpcyBpcyBuZWVkZWQgYnkgdGhlIGZ1bGwgbW92ZSBmcmFtZXdvcmsKKyAgdHlwZWRlZiBfQWxsb2MgYWxsb2NhdG9yX3R5cGU7CisgIHR5cGVkZWYgX1NUTFBfYWxsb2NfcHJveHk8X1RwKiwgX1RwLCBhbGxvY2F0b3JfdHlwZT4gX0FsbG9jUHJveHk7CisgIHR5cGVkZWYgc2l6ZV90IHNpemVfdHlwZTsKK3ByaXZhdGU6CisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1NIT1JUX1NUUklOR19PUFRJTSkKKyAgdW5pb24gX0J1ZmZlcnMgeworICAgIF9UcCogIF9NX2VuZF9vZl9zdG9yYWdlOworICAgIF9UcCAgIF9NX3N0YXRpY19idWZbX0RFRkFVTFRfU0laRV07CisgIH0gX01fYnVmZmVyczsKKyNlbHNlCisgIF9UcCogICAgX01fZW5kX29mX3N0b3JhZ2U7CisjZW5kaWYgLyogX1NUTFBfVVNFX1NIT1JUX1NUUklOR19PUFRJTSAqLworcHJvdGVjdGVkOgorI2lmIGRlZmluZWQgKF9TVExQX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0pCisgIGJvb2wgX01fdXNpbmdfc3RhdGljX2J1ZigpIGNvbnN0CisgIHsgcmV0dXJuIChfTV9zdGFydF9vZl9zdG9yYWdlLl9NX2RhdGEgPT0gX01fYnVmZmVycy5fTV9zdGF0aWNfYnVmKTsgfQorICBfVHAgY29uc3QqIF9NX1N0YXJ0KCkgY29uc3QgeyByZXR1cm4gX01fc3RhcnRfb2Zfc3RvcmFnZS5fTV9kYXRhOyB9CisgIF9UcCogX01fU3RhcnQoKSB7IHJldHVybiBfTV9zdGFydF9vZl9zdG9yYWdlLl9NX2RhdGE7IH0KKyAgX1RwIGNvbnN0KiBfTV9FbmQoKSBjb25zdAorICB7IHJldHVybiBfTV91c2luZ19zdGF0aWNfYnVmKCkgPyBfTV9idWZmZXJzLl9NX3N0YXRpY19idWYgKyBfREVGQVVMVF9TSVpFIDogX01fYnVmZmVycy5fTV9lbmRfb2Zfc3RvcmFnZTsgfQorICBfVHAqIF9NX0VuZCgpCisgIHsgcmV0dXJuIF9NX3VzaW5nX3N0YXRpY19idWYoKSA/IF9NX2J1ZmZlcnMuX01fc3RhdGljX2J1ZiArIF9ERUZBVUxUX1NJWkUgOiBfTV9idWZmZXJzLl9NX2VuZF9vZl9zdG9yYWdlOyB9CisgIHNpemVfdHlwZSBfTV9jYXBhY2l0eSgpIGNvbnN0CisgIHsgcmV0dXJuIF9NX3VzaW5nX3N0YXRpY19idWYoKSA/IF9ERUZBVUxUX1NJWkUgOiBfTV9idWZmZXJzLl9NX2VuZF9vZl9zdG9yYWdlIC0gX01fc3RhcnRfb2Zfc3RvcmFnZS5fTV9kYXRhOyB9CisgIHNpemVfdHlwZSBfTV9yZXN0KCkgY29uc3QKKyAgeyByZXR1cm4gIF9NX3VzaW5nX3N0YXRpY19idWYoKSA/IF9ERUZBVUxUX1NJWkUgLSAoX01fZmluaXNoIC0gX01fYnVmZmVycy5fTV9zdGF0aWNfYnVmKSA6IF9NX2J1ZmZlcnMuX01fZW5kX29mX3N0b3JhZ2UgLSBfTV9maW5pc2g7IH0KKyNlbHNlCisgIF9UcCBjb25zdCogX01fU3RhcnQoKSBjb25zdCB7IHJldHVybiBfTV9zdGFydF9vZl9zdG9yYWdlLl9NX2RhdGE7IH0KKyAgX1RwKiBfTV9TdGFydCgpIHsgcmV0dXJuIF9NX3N0YXJ0X29mX3N0b3JhZ2UuX01fZGF0YTsgfQorICBfVHAgY29uc3QqIF9NX0VuZCgpIGNvbnN0IHsgcmV0dXJuIF9NX2VuZF9vZl9zdG9yYWdlOyB9CisgIF9UcCogX01fRW5kKCkgeyByZXR1cm4gX01fZW5kX29mX3N0b3JhZ2U7IH0KKyAgc2l6ZV90eXBlIF9NX2NhcGFjaXR5KCkgY29uc3QKKyAgeyByZXR1cm4gX01fZW5kX29mX3N0b3JhZ2UgLSBfTV9zdGFydF9vZl9zdG9yYWdlLl9NX2RhdGE7IH0KKyAgc2l6ZV90eXBlIF9NX3Jlc3QoKSBjb25zdAorICB7IHJldHVybiBfTV9lbmRfb2Zfc3RvcmFnZSAtIF9NX2ZpbmlzaDsgfQorI2VuZGlmIC8qIF9TVExQX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0gKi8KKworICBfVHAqICAgIF9NX2ZpbmlzaDsKKyAgX0FsbG9jUHJveHkgX01fc3RhcnRfb2Zfc3RvcmFnZTsKKworICBfVHAgY29uc3QqIF9NX0ZpbmlzaCgpIGNvbnN0IHtyZXR1cm4gX01fZmluaXNoO30KKyAgX1RwKiBfTV9GaW5pc2goKSB7cmV0dXJuIF9NX2ZpbmlzaDt9CisKKyAgLy8gUHJlY29uZGl0aW9uOiAwIDwgX19uIDw9IG1heF9zaXplKCkuCisgIHZvaWQgX01fYWxsb2NhdGVfYmxvY2soc2l6ZV90IF9fbiA9IF9ERUZBVUxUX1NJWkUpOworICB2b2lkIF9NX2RlYWxsb2NhdGVfYmxvY2soKSB7CisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1NIT1JUX1NUUklOR19PUFRJTSkKKyAgICBpZiAoIV9NX3VzaW5nX3N0YXRpY19idWYoKSAmJiAoX01fc3RhcnRfb2Zfc3RvcmFnZS5fTV9kYXRhICE9IDApKQorICAgICAgX01fc3RhcnRfb2Zfc3RvcmFnZS5kZWFsbG9jYXRlKF9NX3N0YXJ0X29mX3N0b3JhZ2UuX01fZGF0YSwgX01fYnVmZmVycy5fTV9lbmRfb2Zfc3RvcmFnZSAtIF9NX3N0YXJ0X29mX3N0b3JhZ2UuX01fZGF0YSk7CisjZWxzZQorICAgIGlmIChfTV9zdGFydF9vZl9zdG9yYWdlLl9NX2RhdGEgIT0gMCkKKyAgICAgIF9NX3N0YXJ0X29mX3N0b3JhZ2UuZGVhbGxvY2F0ZShfTV9zdGFydF9vZl9zdG9yYWdlLl9NX2RhdGEsIF9NX2VuZF9vZl9zdG9yYWdlIC0gX01fc3RhcnRfb2Zfc3RvcmFnZS5fTV9kYXRhKTsKKyNlbmRpZiAvKiBfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNICovCisgIH0KKworICBzaXplX3QgbWF4X3NpemUoKSBjb25zdCB7CisgICAgY29uc3Qgc2l6ZV90eXBlIF9fc3RyaW5nX21heF9zaXplID0gc2l6ZV90eXBlKC0xKSAvIHNpemVvZihfVHApOworICAgIHR5cGVuYW1lIGFsbG9jYXRvcl90eXBlOjpzaXplX3R5cGUgX19hbGxvY19tYXhfc2l6ZSA9IF9NX3N0YXJ0X29mX3N0b3JhZ2UubWF4X3NpemUoKTsKKyAgICByZXR1cm4gKG1pbikoX19hbGxvY19tYXhfc2l6ZSwgX19zdHJpbmdfbWF4X3NpemUpIC0gMTsKKyAgfQorCisgIF9TdHJpbmdfYmFzZShjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorI2lmIGRlZmluZWQgKF9TVExQX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0pCisgICAgOiBfTV9maW5pc2goX01fYnVmZmVycy5fTV9zdGF0aWNfYnVmKSwgX01fc3RhcnRfb2Zfc3RvcmFnZShfX2EsIF9NX2J1ZmZlcnMuX01fc3RhdGljX2J1ZikKKyNlbHNlCisgICAgOiBfTV9lbmRfb2Zfc3RvcmFnZSgwKSwgX01fZmluaXNoKDApLCBfTV9zdGFydF9vZl9zdG9yYWdlKF9fYSwgKF9UcCopMCkKKyNlbmRpZgorICAgIHt9CisKKyAgX1N0cmluZ19iYXNlKGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EsIHNpemVfdCBfX24pCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1NIT1JUX1NUUklOR19PUFRJTSkKKyAgICA6IF9NX2ZpbmlzaChfTV9idWZmZXJzLl9NX3N0YXRpY19idWYpLCBfTV9zdGFydF9vZl9zdG9yYWdlKF9fYSwgX01fYnVmZmVycy5fTV9zdGF0aWNfYnVmKSB7CisjZWxzZQorICAgIDogX01fZW5kX29mX3N0b3JhZ2UoMCksIF9NX2ZpbmlzaCgwKSwgX01fc3RhcnRfb2Zfc3RvcmFnZShfX2EsIChfVHAqKTApIHsKKyNlbmRpZgorICAgICAgX01fYWxsb2NhdGVfYmxvY2soX19uKTsKKyAgICB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNKQorICB2b2lkIF9NX21vdmVfc3JjIChfU2VsZiAmc3JjKSB7CisgICAgaWYgKHNyYy5fTV91c2luZ19zdGF0aWNfYnVmKCkpIHsKKyAgICAgIF9NX2J1ZmZlcnMgPSBzcmMuX01fYnVmZmVyczsKKyAgICAgIF9NX2ZpbmlzaCA9IF9NX2J1ZmZlcnMuX01fc3RhdGljX2J1ZiArIChzcmMuX01fZmluaXNoIC0gc3JjLl9NX3N0YXJ0X29mX3N0b3JhZ2UuX01fZGF0YSk7CisgICAgICBfTV9zdGFydF9vZl9zdG9yYWdlLl9NX2RhdGEgPSBfTV9idWZmZXJzLl9NX3N0YXRpY19idWY7CisgICAgfQorICAgIGVsc2UgeworICAgICAgX01fc3RhcnRfb2Zfc3RvcmFnZS5fTV9kYXRhID0gc3JjLl9NX3N0YXJ0X29mX3N0b3JhZ2UuX01fZGF0YTsKKyAgICAgIF9NX2ZpbmlzaCA9IHNyYy5fTV9maW5pc2g7CisgICAgICBfTV9idWZmZXJzLl9NX2VuZF9vZl9zdG9yYWdlID0gc3JjLl9NX2J1ZmZlcnMuX01fZW5kX29mX3N0b3JhZ2U7CisgICAgICBzcmMuX01fc3RhcnRfb2Zfc3RvcmFnZS5fTV9kYXRhID0gMDsKKyAgICB9CisgIH0KKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKF9TVExQX05PX01PVkVfU0VNQU5USUMpCisgIF9TdHJpbmdfYmFzZShfX21vdmVfc291cmNlPF9TZWxmPiBzcmMpCisjICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNKQorICAgIDogX01fc3RhcnRfb2Zfc3RvcmFnZShfX21vdmVfc291cmNlPF9BbGxvY1Byb3h5PihzcmMuZ2V0KCkuX01fc3RhcnRfb2Zfc3RvcmFnZSkpIHsKKyAgICAgIF9NX21vdmVfc3JjKHNyYy5nZXQoKSk7CisjICBlbHNlCisgICAgOiBfTV9lbmRfb2Zfc3RvcmFnZShzcmMuZ2V0KCkuX01fZW5kX29mX3N0b3JhZ2UpLCBfTV9maW5pc2goc3JjLmdldCgpLl9NX2ZpbmlzaCksCisgICAgICBfTV9zdGFydF9vZl9zdG9yYWdlKF9fbW92ZV9zb3VyY2U8X0FsbG9jUHJveHk+KHNyYy5nZXQoKS5fTV9zdGFydF9vZl9zdG9yYWdlKSkgeworICAgICAgc3JjLmdldCgpLl9NX3N0YXJ0X29mX3N0b3JhZ2UuX01fZGF0YSA9IDA7CisjICBlbmRpZgorICAgIH0KKyNlbmRpZgorCisgIH5fU3RyaW5nX2Jhc2UoKSB7IF9NX2RlYWxsb2NhdGVfYmxvY2soKTsgfQorCisgIHZvaWQgX01fcmVzZXQoX1RwICpfX3N0YXJ0LCBfVHAgKl9fZmluaXNoLCBfVHAgKl9fZW5kX29mX3N0b3JhZ2UpIHsKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNKQorICAgIF9NX2J1ZmZlcnMuX01fZW5kX29mX3N0b3JhZ2UgPSBfX2VuZF9vZl9zdG9yYWdlOworI2Vsc2UKKyAgICBfTV9lbmRfb2Zfc3RvcmFnZSA9IF9fZW5kX29mX3N0b3JhZ2U7CisjZW5kaWYKKyAgICBfTV9maW5pc2ggPSBfX2ZpbmlzaDsKKyAgICBfTV9zdGFydF9vZl9zdG9yYWdlLl9NX2RhdGEgPSBfX3N0YXJ0OworICB9CisKKyAgdm9pZCBfTV9zd2FwKF9TZWxmICZfX3MpIHsKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNKQorICAgIGlmIChfTV91c2luZ19zdGF0aWNfYnVmKCkpIHsKKyAgICAgIGlmIChfX3MuX01fdXNpbmdfc3RhdGljX2J1ZigpKSB7CisgICAgICAgIF9TVExQX1NURDo6c3dhcChfTV9idWZmZXJzLCBfX3MuX01fYnVmZmVycyk7CisgICAgICAgIF9UcCAqX190bXAgPSBfTV9maW5pc2g7CisgICAgICAgIF9NX2ZpbmlzaCA9IF9NX3N0YXJ0X29mX3N0b3JhZ2UuX01fZGF0YSArIChfX3MuX01fZmluaXNoIC0gX19zLl9NX3N0YXJ0X29mX3N0b3JhZ2UuX01fZGF0YSk7CisgICAgICAgIF9fcy5fTV9maW5pc2ggPSBfX3MuX01fYnVmZmVycy5fTV9zdGF0aWNfYnVmICsgKF9fdG1wIC0gX01fc3RhcnRfb2Zfc3RvcmFnZS5fTV9kYXRhKTsKKyAgICAgICAgLy9XZSBuZWVkIHRvIHN3YXAgX01fc3RhcnRfb2Zfc3RvcmFnZSBmb3IgYWxsb2NhdG9ycyB3aXRoIHN0YXRlOgorICAgICAgICBfTV9zdGFydF9vZl9zdG9yYWdlLnN3YXAoX19zLl9NX3N0YXJ0X29mX3N0b3JhZ2UpOworICAgICAgICBfTV9zdGFydF9vZl9zdG9yYWdlLl9NX2RhdGEgPSBfTV9idWZmZXJzLl9NX3N0YXRpY19idWY7CisgICAgICAgIF9fcy5fTV9zdGFydF9vZl9zdG9yYWdlLl9NX2RhdGEgPSBfX3MuX01fYnVmZmVycy5fTV9zdGF0aWNfYnVmOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgX19zLl9NX3N3YXAoKnRoaXMpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKF9fcy5fTV91c2luZ19zdGF0aWNfYnVmKCkpIHsKKyAgICAgIF9UcCAqX190bXAgPSBfTV9zdGFydF9vZl9zdG9yYWdlLl9NX2RhdGE7CisgICAgICBfVHAgKl9fdG1wX2ZpbmlzaCA9IF9NX2ZpbmlzaDsKKyAgICAgIF9UcCAqX190bXBfZW5kX2RhdGEgPSBfTV9idWZmZXJzLl9NX2VuZF9vZl9zdG9yYWdlOworICAgICAgX01fYnVmZmVycyA9IF9fcy5fTV9idWZmZXJzOworICAgICAgLy9XZSBuZWVkIHRvIHN3YXAgX01fc3RhcnRfb2Zfc3RvcmFnZSBmb3IgYWxsb2NhdG9ycyB3aXRoIHN0YXRlOgorICAgICAgX01fc3RhcnRfb2Zfc3RvcmFnZS5zd2FwKF9fcy5fTV9zdGFydF9vZl9zdG9yYWdlKTsKKyAgICAgIF9NX3N0YXJ0X29mX3N0b3JhZ2UuX01fZGF0YSA9IF9NX2J1ZmZlcnMuX01fc3RhdGljX2J1ZjsKKyAgICAgIF9NX2ZpbmlzaCA9IF9NX2J1ZmZlcnMuX01fc3RhdGljX2J1ZiArIChfX3MuX01fZmluaXNoIC0gX19zLl9NX2J1ZmZlcnMuX01fc3RhdGljX2J1Zik7CisgICAgICBfX3MuX01fYnVmZmVycy5fTV9lbmRfb2Zfc3RvcmFnZSA9IF9fdG1wX2VuZF9kYXRhOworICAgICAgX19zLl9NX3N0YXJ0X29mX3N0b3JhZ2UuX01fZGF0YSA9IF9fdG1wOworICAgICAgX19zLl9NX2ZpbmlzaCA9IF9fdG1wX2ZpbmlzaDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBfU1RMUF9TVEQ6OnN3YXAoX01fYnVmZmVycy5fTV9lbmRfb2Zfc3RvcmFnZSwgX19zLl9NX2J1ZmZlcnMuX01fZW5kX29mX3N0b3JhZ2UpOworICAgICAgX01fc3RhcnRfb2Zfc3RvcmFnZS5zd2FwKF9fcy5fTV9zdGFydF9vZl9zdG9yYWdlKTsKKyAgICAgIF9TVExQX1NURDo6c3dhcChfTV9maW5pc2gsIF9fcy5fTV9maW5pc2gpOworICAgIH0KKyNlbHNlCisgICAgX1NUTFBfU1REOjpzd2FwKF9NX2VuZF9vZl9zdG9yYWdlLCBfX3MuX01fZW5kX29mX3N0b3JhZ2UpOworICAgIF9NX3N0YXJ0X29mX3N0b3JhZ2Uuc3dhcChfX3MuX01fc3RhcnRfb2Zfc3RvcmFnZSk7CisgICAgX1NUTFBfU1REOjpzd2FwKF9NX2ZpbmlzaCwgX19zLl9NX2ZpbmlzaCk7CisjZW5kaWYKKyAgfQorCisgIHZvaWQgX1NUTFBfRlVOQ1RJT05fVEhST1dTIF9NX3Rocm93X2xlbmd0aF9lcnJvcigpIGNvbnN0OworICB2b2lkIF9TVExQX0ZVTkNUSU9OX1RIUk9XUyBfTV90aHJvd19vdXRfb2ZfcmFuZ2UoKSBjb25zdDsKK307CisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUKQorX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIF9TdHJpbmdfYmFzZTxjaGFyLCBhbGxvY2F0b3I8Y2hhcj4gPjsKKyMgIGlmIGRlZmluZWQgKF9TVExQX0hBU19XQ0hBUl9UKQorX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIF9TdHJpbmdfYmFzZTx3Y2hhcl90LCBhbGxvY2F0b3I8d2NoYXJfdD4gPjsKKyMgIGVuZGlmCisjZW5kaWYgLyogX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCAqLworCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLyogX1NUTFBfU1RSSU5HX0JBU0VfSCAqLworCisvKgorICogTG9jYWwgVmFyaWFibGVzOgorICogbW9kZTpDKysKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdGwvX3N0cmluZ19md2QuaCBiL3N0bHBvcnQvc3RsL19zdHJpbmdfZndkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU2NTM4NQotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc3RsL19zdHJpbmdfZndkLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9TVFJJTkdfRldEX0gKKyNkZWZpbmUgX1NUTFBfU1RSSU5HX0ZXRF9ICisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfSU9TRldECisjICBpbmNsdWRlIDxzdGwvX2lvc2Z3ZC5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisjaWYgIWRlZmluZWQgKF9TVExQX0xJTUlURURfREVGQVVMVF9URU1QTEFURVMpCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULAorICAgICAgICAgIGNsYXNzIF9UcmFpdHMgPSBjaGFyX3RyYWl0czxfQ2hhclQ+LAorICAgICAgICAgIGNsYXNzIF9BbGxvYyA9IGFsbG9jYXRvcjxfQ2hhclQ+ID4KK2NsYXNzIGJhc2ljX3N0cmluZzsKKyNlbHNlCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULAorICAgICAgICAgIGNsYXNzIF9UcmFpdHMsCisgICAgICAgICAgY2xhc3MgX0FsbG9jPgorY2xhc3MgYmFzaWNfc3RyaW5nOworI2VuZGlmIC8qIF9TVExQX0xJTUlURURfREVGQVVMVF9URU1QTEFURVMgKi8KKwordHlwZWRlZiBiYXNpY19zdHJpbmc8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4sIGFsbG9jYXRvcjxjaGFyPiA+IHN0cmluZzsKKworI2lmIGRlZmluZWQgKF9TVExQX0hBU19XQ0hBUl9UKQordHlwZWRlZiBiYXNpY19zdHJpbmc8d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4sIGFsbG9jYXRvcjx3Y2hhcl90PiA+IHdzdHJpbmc7CisjZW5kaWYKKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCisvL1RoaXMgZnVuY3Rpb24gbGltaXRzIGhlYWRlciBkZXBlbmRlbmN5IGJldHdlZW4gZXhjZXB0aW9uIGFuZCBzdHJpbmcKKy8vaW1wbGVtZW50YXRpb24uIEl0IGlzIGltcGxlbWVudGVkIGluIF9zdHJpbmcuaAorY29uc3QgY2hhciogX1NUTFBfQ0FMTCBfX2dldF9jX3N0cmluZyhjb25zdCBzdHJpbmcmIF9fc3RyKTsKKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2VuZGlmIC8qIF9TVExQX1NUUklOR19GV0RfSCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdGwvX3N0cmluZ19oYXNoLmggYi9zdGxwb3J0L3N0bC9fc3RyaW5nX2hhc2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2YyZDlmCi0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvX3N0cmluZ19oYXNoLmgKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5Ny0xOTk5CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX1NUUklOR19IQVNIX0gKKyNkZWZpbmUgX1NUTFBfU1RSSU5HX0hBU0hfSAorCisjaWZuZGVmIF9TVExQX0hBU0hfRlVOX0gKKyMgaW5jbHVkZSA8c3RsL19oYXNoX2Z1bi5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfU1RSSU5HX0gKKyMgaW5jbHVkZSA8c3RsL19zdHJpbmcuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorX1NUTFBfSU5MSU5FX0xPT1Agc2l6ZV90CitfX3N0bF9zdHJpbmdfaGFzaChjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiYgX19zKSB7CisgIHVuc2lnbmVkIGxvbmcgX19oID0gMDsKKyAgc2l6ZV90IF9fbGVuID0gX19zLnNpemUoKTsKKyAgY29uc3QgX0NoYXJUKiBfX2RhdGEgPSBfX3MuZGF0YSgpOworICBmb3IgKCBzaXplX3QgX19pID0gMDsgX19pIDwgX19sZW47ICsrX19pKQorICAgIF9faCA9IC8qIDUgKl9faCAqLyhfX2ggPDwgMikgKyBfX2ggKyBfX2RhdGFbX19pXTsKKyAgcmV0dXJuIHNpemVfdChfX2gpOworfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikgJiYgXAorICAoIWRlZmluZWQoX19CT1JMQU5EQ19fKSB8fCAoX19CT1JMQU5EQ19fID49IDB4NTYwKSkKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK3N0cnVjdCBoYXNoPGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+ID4geworICBzaXplX3Qgb3BlcmF0b3IoKShjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiYgX19zKSBjb25zdAorICAgIHsgcmV0dXJuIF9fc3RsX3N0cmluZ19oYXNoKF9fcyk7IH0KK307CisKKyNlbHNlCisKK19TVExQX1RFTVBMQVRFX05VTEwKK3N0cnVjdCBfU1RMUF9DTEFTU19ERUNMU1BFQyBoYXNoPHN0cmluZz4geworICBzaXplX3Qgb3BlcmF0b3IoKShjb25zdCBzdHJpbmcmIF9fcykgY29uc3QKKyAgICB7IHJldHVybiBfX3N0bF9zdHJpbmdfaGFzaChfX3MpOyB9Cit9OworCisjICBpZiBkZWZpbmVkIChfU1RMUF9IQVNfV0NIQVJfVCkKK19TVExQX1RFTVBMQVRFX05VTEwKK3N0cnVjdCBfU1RMUF9DTEFTU19ERUNMU1BFQyBoYXNoPHdzdHJpbmc+IHsKKyAgc2l6ZV90IG9wZXJhdG9yKCkoY29uc3Qgd3N0cmluZyYgX19zKSBjb25zdAorICAgIHsgcmV0dXJuIF9fc3RsX3N0cmluZ19oYXNoKF9fcyk7IH0KK307CisjICBlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTiAqLworCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3RsL19zdHJpbmdfaW8uYyBiL3N0bHBvcnQvc3RsL19zdHJpbmdfaW8uYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3RsL19zdHJpbmdfaW8uYwpyZW5hbWUgdG8gc3RscG9ydC9zdGwvX3N0cmluZ19pby5jCmRpZmYgLS1naXQgYS9zdGwvX3N0cmluZ19pby5oIGIvc3RscG9ydC9zdGwvX3N0cmluZ19pby5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzdGwvX3N0cmluZ19pby5oCnJlbmFtZSB0byBzdGxwb3J0L3N0bC9fc3RyaW5nX2lvLmgKZGlmZiAtLWdpdCBhL3N0bC9fc3RyaW5nX25wb3MuaCBiL3N0bHBvcnQvc3RsL19zdHJpbmdfbnBvcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzdGwvX3N0cmluZ19ucG9zLmgKcmVuYW1lIHRvIHN0bHBvcnQvc3RsL19zdHJpbmdfbnBvcy5oCmRpZmYgLS1naXQgYS9zdGwvX3N0cmluZ19vcGVyYXRvcnMuaCBiL3N0bHBvcnQvc3RsL19zdHJpbmdfb3BlcmF0b3JzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHN0bC9fc3RyaW5nX29wZXJhdG9ycy5oCnJlbmFtZSB0byBzdGxwb3J0L3N0bC9fc3RyaW5nX29wZXJhdG9ycy5oCmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9fc3RyaW5nX3N1bS5oIGIvc3RscG9ydC9zdGwvX3N0cmluZ19zdW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzlkMjg4Ci0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvX3N0cmluZ19zdW0uaApAQCAtMCwwICsxLDQxNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMworICogRnJhbmNvaXMgRHVtb250CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfU1RSSU5HX1NVTV9ICisjZGVmaW5lIF9TVExQX1NUUklOR19TVU1fSAorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCisvKmNoYXIgd3JhcHBlciB0byBzaW11bGF0ZSBiYXNpY19zdHJpbmcqLwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK3N0cnVjdCBfX2NoYXJfd3JhcHBlciB7CisgIHR5cGVkZWYgY29uc3QgX0NoYXJUJiBjb25zdF9yZWZlcmVuY2U7CisKKyAgX19jaGFyX3dyYXBwZXIoX0NoYXJUIF9fdmFsKSA6IF9WYWwoX192YWwpIHt9CisKKyAgX0NoYXJUIGdldFZhbHVlKCkgY29uc3QgeyByZXR1cm4gX1ZhbDsgfQorICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIDE7IH0KKworICBjb25zdF9yZWZlcmVuY2Ugb3BlcmF0b3JbXSAoc2l6ZV90IF9fbikgY29uc3QgeworICAgIC8vVG8gYXZvaWQgYSBjaGVjayBvbiBfX24gd2UgdXNlIHRoaXMgc3RyYW5nZSBpbXBsZW1lbnRhdGlvbgorICAgIHJldHVybiAoJl9WYWwpW19fbl07CisgIH0KKworcHJpdmF0ZToKKyAgX0NoYXJUIF9WYWw7Cit9OworCisvKkMgc3RyaW5nIHdyYXBwZXIgdG8gc2ltdWxhdGUgYmFzaWNfc3RyaW5nKi8KK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+CitzdHJ1Y3QgX19jc3RyX3dyYXBwZXIgeworICB0eXBlZGVmIGNvbnN0IF9DaGFyVCYgY29uc3RfcmVmZXJlbmNlOworCisgIF9fY3N0cl93cmFwcGVyKGNvbnN0IF9DaGFyVCAqX19jc3RyLCBzaXplX3QgX19zaXplKSA6CisgICAgX0NTdHIoX19jc3RyKSwgX1NpemUoX19zaXplKSB7fQorCisgIGNvbnN0IF9DaGFyVCogY19zdHIoKSBjb25zdCB7IHJldHVybiBfQ1N0cjsgfQorCisgIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gX1NpemU7IH0KKworICBjb25zdF9yZWZlcmVuY2Ugb3BlcmF0b3JbXSAoc2l6ZV90IF9fbikgY29uc3QgeyByZXR1cm4gX0NTdHJbX19uXTsgfQorCitwcml2YXRlOgorICBjb25zdCBfQ2hhclQgKl9DU3RyOworICBzaXplX3QgX1NpemU7Cit9OworCisvKmJhc2ljX3N0cmluZyB3cmFwcGVyIHRvIGVuc3VyZSB0aGF0IHdlIG9ubHkgc3RvcmUgYSByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmFsIHN0cmluZyBhbmQgbm90IGNvcHkgaXQqLwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorc3RydWN0IF9fYnN0cl93cmFwcGVyIHsKKyAgdHlwZWRlZiBjb25zdCBfQ2hhclQmIGNvbnN0X3JlZmVyZW5jZTsKKyAgdHlwZWRlZiBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+IF9CU3RyaW5nOworCisgIF9fYnN0cl93cmFwcGVyIChfQlN0cmluZyBjb25zdCYgX19zKSA6CisgICAgX0JTdHIoX19zKSB7fQorCisgIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gX0JTdHIuc2l6ZSgpOyB9CisKKyAgY29uc3RfcmVmZXJlbmNlIG9wZXJhdG9yW10gKHNpemVfdCBfX24pIGNvbnN0IHsgcmV0dXJuIF9CU3RyW19fbl07IH0KKworICBfQlN0cmluZyBjb25zdCYgYl9zdHIoKSBjb25zdCB7IHJldHVybiBfQlN0cjsgfQorCitwcml2YXRlOgorICBfQlN0cmluZyBjb25zdCYgX0JTdHI7Cit9OworCitzdHJ1Y3QgX19vbl9sZWZ0IHt9Oworc3RydWN0IF9fb25fcmlnaHQge307CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYywKKyAgICAgICAgICBjbGFzcyBfTGVmdCwgY2xhc3MgX1JpZ2h0LAorICAgICAgICAgIGNsYXNzIF9TdG9yYWdlRGlyZWN0aW9uPgorY2xhc3MgX19ic3RyX3N1bSB7CitwdWJsaWM6CisgIHR5cGVkZWYgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiBfQlN0cmluZzsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQlN0cmluZzo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQlN0cmluZzo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0JTdHJpbmc6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQlN0cmluZzo6c2l6ZV90eXBlIHNpemVfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQlN0cmluZzo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7CisgIHR5cGVkZWYgX19ic3RyX3N1bTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0xlZnQsIF9SaWdodCwgX1N0b3JhZ2VEaXJlY3Rpb24+IF9TZWxmOworCisgIF9fYnN0cl9zdW0gKF9MZWZ0IGNvbnN0JiBsaHMsIF9SaWdodCBjb25zdCYgcmhzKSA6CisgICAgX2xocyhsaHMpLCBfcmhzKHJocykge30KKworICBfTGVmdCBjb25zdCYgZ2V0TGhzKCkgY29uc3QgeyByZXR1cm4gX2xoczsgfQorICBfUmlnaHQgY29uc3QmIGdldFJocygpIGNvbnN0IHsgcmV0dXJuIF9yaHM7IH0KKworICBhbGxvY2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9yKCkgY29uc3QgeyByZXR1cm4gX01fZ2V0X3N0b3JhZ2UoZmFsc2UpLmdldF9hbGxvY2F0b3IoKTsgfQorCisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gX01fZ2V0X3N0b3JhZ2UoKS5iZWdpbigpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpICAgY29uc3QgeyByZXR1cm4gX01fZ2V0X3N0b3JhZ2UoKS5lbmQoKTsgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0IHsgcmV0dXJuIF9NX2dldF9zdG9yYWdlKCkucmJlZ2luKCk7IH0KKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgICBjb25zdCB7IHJldHVybiBfTV9nZXRfc3RvcmFnZSgpLnJlbmQoKTsgfQorCisgIHNpemVfdHlwZSBzaXplKCkgY29uc3QgeyByZXR1cm4gX2xocy5zaXplKCkgKyBfcmhzLnNpemUoKTsgfQorICBzaXplX3R5cGUgbGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gc2l6ZSgpOyB9CisKKyAgc2l6ZV90IG1heF9zaXplKCkgY29uc3QgeyByZXR1cm4gX01fZ2V0X3N0b3JhZ2UoKS5tYXhfc2l6ZSgpOyB9CisgIHNpemVfdHlwZSBjYXBhY2l0eSgpIGNvbnN0IHsgcmV0dXJuIHNpemUoKTsgfQorICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gc2l6ZSgpID09IDA7IH0KKworICBjb25zdF9yZWZlcmVuY2Ugb3BlcmF0b3JbXShzaXplX3QgX19uKSBjb25zdAorICB7IHJldHVybiAoX19uIDwgX2xocy5zaXplKCkpP19saHNbX19uXTpfcmhzW19fbiAtIF9saHMuc2l6ZSgpXTsgfQorCisgIGNvbnN0X3JlZmVyZW5jZSBhdChzaXplX3R5cGUgX19uKSBjb25zdAorICB7IHJldHVybiBfTV9nZXRfc3RvcmFnZSgpLmF0KF9fbik7IH0KKworICAvL29wZXJhdG9yICs9CisgIHR5cGVkZWYgX19ic3RyX3N1bTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX1NlbGYsIF9fYnN0cl93cmFwcGVyPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiwgX19vbl9sZWZ0PiBfQlN0ck9uTGVmdDsKKyAgX0JTdHJPbkxlZnQgb3BlcmF0b3IgKz0gKGNvbnN0IF9CU3RyaW5nJiBfX3MpIHsgcmV0dXJuIGFwcGVuZChfX3MpOyB9CisKKyAgdHlwZWRlZiBfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfU2VsZiwgX19jc3RyX3dyYXBwZXI8X0NoYXJUPiwgX19vbl9sZWZ0PiBfQ1N0ck9uTGVmdDsKKyAgX0NTdHJPbkxlZnQgb3BlcmF0b3IgKz0gKGNvbnN0IF9DaGFyVCogX19zKSB7IHJldHVybiBhcHBlbmQoX19zKTsgfQorCisgIHR5cGVkZWYgX19ic3RyX3N1bTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX1NlbGYsIF9fY2hhcl93cmFwcGVyPF9DaGFyVD4sIF9fb25fbGVmdD4gX0NoYXJPbkxlZnQ7CisgIF9DaGFyT25MZWZ0IG9wZXJhdG9yICs9IChfQ2hhclQgX19jKSB7IHJldHVybiBfQ2hhck9uTGVmdCgqdGhpcywgX19jKTsgfQorCisgIC8vYXBwZW5kCisgIF9CU3RyT25MZWZ0IGFwcGVuZCAoY29uc3QgX0JTdHJpbmcmIF9fcykKKyAgeyByZXR1cm4gX0JTdHJPbkxlZnQoKnRoaXMsIF9fcyk7IH0KKyAgX0JTdHJpbmcmIGFwcGVuZChjb25zdCBfQlN0cmluZyYgX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pCisgIHsgcmV0dXJuIF9NX2dldF9zdG9yYWdlKCkuYXBwZW5kKF9fcywgX19wb3MsIF9fbik7IH0KKyAgX0NTdHJPbkxlZnQgYXBwZW5kKGNvbnN0IF9DaGFyVCogX19zKSB7CisgICAgY29uc3Qgc2l6ZV90eXBlIF9fbiA9IF9UcmFpdHM6Omxlbmd0aChfX3MpOworICAgIHJldHVybiBfQ1N0ck9uTGVmdCgqdGhpcywgX19jc3RyX3dyYXBwZXI8X0NoYXJUPihfX3MsIF9fbikpOworICB9CisgIF9DU3RyT25MZWZ0IGFwcGVuZChjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbikKKyAgeyByZXR1cm4gX0NTdHJPbkxlZnQoKnRoaXMsIF9fY3N0cl93cmFwcGVyPF9DaGFyVD4oX19zLCBfX24pKTsgfQorICBfQlN0cmluZyYgYXBwZW5kKHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MpCisgIHtyZXR1cm4gX01fZ2V0X3N0b3JhZ2UoKS5hcHBlbmQoX19uLCBfX2MpO30KKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXI+CisgIF9CU3RyaW5nJiBhcHBlbmQoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCkKKyAge3JldHVybiBfTV9nZXRfc3RvcmFnZSgpLmFwcGVuZChfX2ZpcnN0LCBfX2xhc3QpO30KKworICAvL2Fzc2lnbgorICBfQlN0cmluZyYgYXNzaWduKGNvbnN0IF9CU3RyaW5nJiBfX3MpIHtyZXR1cm4gX01fZ2V0X3N0b3JhZ2UoKS5hc3NpZ24oX19zKTt9CisgIF9CU3RyaW5nJiBhc3NpZ24oY29uc3QgX0JTdHJpbmcmIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSB7cmV0dXJuIF9NX2dldF9zdG9yYWdlKCkuYXNzaWduKF9fcywgX19wb3MsIF9fbik7fQorICBfQlN0cmluZyYgYXNzaWduKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uKSB7cmV0dXJuIF9NX2dldF9zdG9yYWdlKCkuYXNzaWduKF9fcywgX19uKTt9CisgIF9CU3RyaW5nJiBhc3NpZ24oY29uc3QgX0NoYXJUKiBfX3MpIHtyZXR1cm4gX01fZ2V0X3N0b3JhZ2UoKS5hc3NpZ24oX19zKTsgfQorICBfQlN0cmluZyYgYXNzaWduKHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MpIHtyZXR1cm4gX01fZ2V0X3N0b3JhZ2UoKS5hc3NpZ24oX19uLCBfX2MpO30KKworICAvL2luc2VydAorICBfQlN0cmluZyYgaW5zZXJ0KHNpemVfdHlwZSBfX3BvcywgY29uc3QgX0JTdHJpbmcmIF9fcykge3JldHVybiBfTV9nZXRfc3RvcmFnZSgpLmluc2VydChfX3BvcywgX19zKTt9CisgIF9CU3RyaW5nJiBpbnNlcnQoc2l6ZV90eXBlIF9fcG9zLCBjb25zdCBfQlN0cmluZyYgX19zLCBzaXplX3R5cGUgX19iZWcsIHNpemVfdHlwZSBfX24pCisgIHtyZXR1cm4gX01fZ2V0X3N0b3JhZ2UoKS5pbnNlcnQoX19wb3MsIF9fcywgX19iZWcsIF9fbik7fQorICBfQlN0cmluZyYgaW5zZXJ0KHNpemVfdHlwZSBfX3BvcywgY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX24pIHtyZXR1cm4gX01fZ2V0X3N0b3JhZ2UoKS5pbnNlcnQoX19wb3MsIF9fcywgX19uKTt9CisgIF9CU3RyaW5nJiBpbnNlcnQoc2l6ZV90eXBlIF9fcG9zLCBjb25zdCBfQ2hhclQqIF9fcykge3JldHVybiBfTV9nZXRfc3RvcmFnZSgpLmluc2VydChfX3BvcywgX19zKTt9CisgIF9CU3RyaW5nJiBpbnNlcnQoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jKSB7cmV0dXJuIF9NX2dldF9zdG9yYWdlKCkuaW5zZXJ0KF9fcG9zLCBfX24sIF9fYyk7fQorCisgIC8vZXJhc2UKKyAgX0JTdHJpbmcmIGVyYXNlKHNpemVfdHlwZSBfX3BvcyA9IDAsIHNpemVfdHlwZSBfX24gPV9CU3RyaW5nOjpucG9zKSB7cmV0dXJuIF9NX2dldF9zdG9yYWdlKCkuZXJhc2UoX19wb3MsIF9fbik7fQorCisgIC8vcmVwbGFjZQorICBfQlN0cmluZyYgcmVwbGFjZShzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24sIGNvbnN0IF9CU3RyaW5nJiBfX3MpCisgIHtyZXR1cm4gX01fZ2V0X3N0b3JhZ2UoKS5yZXBsYWNlKF9fcG9zLCBfX24sIF9fcyk7fQorICBfQlN0cmluZyYgcmVwbGFjZShzaXplX3R5cGUgX19wb3MxLCBzaXplX3R5cGUgX19uMSwgY29uc3QgX0JTdHJpbmcmIF9fcywgc2l6ZV90eXBlIF9fcG9zMiwgc2l6ZV90eXBlIF9fbjIpCisgIHtyZXR1cm4gX01fZ2V0X3N0b3JhZ2UoKS5yZXBsYWNlKF9fcG9zMSwgX19uMSwgX19zLCBfX3BvczIsIF9fbjIpO30KKyAgX0JTdHJpbmcmIHJlcGxhY2Uoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uMSwgY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX24yKQorICB7cmV0dXJuIF9NX2dldF9zdG9yYWdlKCkucmVwbGFjZShfX3BvcywgX19uMSwgX19zLCBfX24yKTt9CisgIF9CU3RyaW5nJiByZXBsYWNlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IF9DaGFyVCogX19zKQorICB7cmV0dXJuIF9NX2dldF9zdG9yYWdlKCkucmVwbGFjZShfX3BvcywgX19uMSwgX19zKTt9CisgIF9CU3RyaW5nJiByZXBsYWNlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbjEsIHNpemVfdHlwZSBfX24yLCBfQ2hhclQgX19jKQorICB7cmV0dXJuIF9NX2dldF9zdG9yYWdlKCkucmVwbGFjZShfX3BvcywgX19uMSwgX19uMiwgX19jKTt9CisKKyAgc2l6ZV90eXBlIGNvcHkoX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX24sIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0CisgIHtyZXR1cm4gX01fZ2V0X3N0b3JhZ2UoKS5jb3B5KF9fcywgX19uLCBfX3Bvcyk7fQorCisgIHZvaWQgc3dhcChfQlN0cmluZyYgX19zKQorICB7X01fZ2V0X3N0b3JhZ2UoKS5zd2FwKF9fcyk7fQorCisgIGNvbnN0IF9DaGFyVCogY19zdHIoKSBjb25zdCB7IHJldHVybiBfTV9nZXRfc3RvcmFnZSgpLmNfc3RyKCk7IH0KKyAgY29uc3QgX0NoYXJUKiBkYXRhKCkgIGNvbnN0IHsgcmV0dXJuIF9NX2dldF9zdG9yYWdlKCkuZGF0YSgpOyB9CisKKyAgLy9maW5kIGZhbWlseQorICBzaXplX3R5cGUgZmluZChjb25zdCBfQlN0cmluZyYgX19zLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdCB7IHJldHVybiBfTV9nZXRfc3RvcmFnZSgpLmZpbmQoX19zLCBfX3Bvcyk7IH0KKyAgc2l6ZV90eXBlIGZpbmQoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0IHsgcmV0dXJuIF9NX2dldF9zdG9yYWdlKCkuZmluZChfX3MsIF9fcG9zKTsgfQorICBzaXplX3R5cGUgZmluZChjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdCB7IHJldHVybiBfTV9nZXRfc3RvcmFnZSgpLmZpbmQoX19zLCBfX3BvcywgX19uKTsgfQorICBzaXplX3R5cGUgZmluZChfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdCB7IHJldHVybiBfTV9nZXRfc3RvcmFnZSgpLmZpbmQoX19jLCBfX3Bvcyk7IH0KKworICBzaXplX3R5cGUgcmZpbmQoY29uc3QgX0JTdHJpbmcmIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gX0JTdHJpbmc6Om5wb3MpIGNvbnN0IHsgcmV0dXJuIF9NX2dldF9zdG9yYWdlKCkucmZpbmQoX19zLCBfX3Bvcyk7IH0KKyAgc2l6ZV90eXBlIHJmaW5kKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MgPSBfQlN0cmluZzo6bnBvcykgY29uc3QgeyByZXR1cm4gX01fZ2V0X3N0b3JhZ2UoKS5yZmluZChfX3MsIF9fcG9zKTsgfQorICBzaXplX3R5cGUgcmZpbmQoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgY29uc3QgeyByZXR1cm4gX01fZ2V0X3N0b3JhZ2UoKS5yZmluZChfX3MsIF9fcG9zLCBfX24pOyB9CisgIHNpemVfdHlwZSByZmluZChfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MgPSBfQlN0cmluZzo6bnBvcykgY29uc3QgeyByZXR1cm4gX01fZ2V0X3N0b3JhZ2UoKS5yZmluZChfX2MsIF9fcG9zKTsgfQorCisgIHNpemVfdHlwZSBmaW5kX2ZpcnN0X29mKGNvbnN0IF9CU3RyaW5nJiBfX3MsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0CisgIHsgcmV0dXJuIF9NX2dldF9zdG9yYWdlKCkuZmluZF9maXJzdF9vZihfX3MsIF9fcG9zKTsgfQorICBzaXplX3R5cGUgZmluZF9maXJzdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QKKyAgeyByZXR1cm4gX01fZ2V0X3N0b3JhZ2UoKS5maW5kX2ZpcnN0X29mKF9fcywgX19wb3MpOyB9CisgIHNpemVfdHlwZSBmaW5kX2ZpcnN0X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIGNvbnN0CisgIHsgcmV0dXJuIF9NX2dldF9zdG9yYWdlKCkuZmluZF9maXJzdF9vZihfX3MsIF9fcG9zLCBfX24pOyB9CisgIHNpemVfdHlwZSBmaW5kX2ZpcnN0X29mKF9DaGFyVCBfX2MsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0CisgIHsgcmV0dXJuIF9NX2dldF9zdG9yYWdlKCkuZmluZChfX2MsIF9fcG9zKTsgfQorCisgIHNpemVfdHlwZSBmaW5kX2xhc3Rfb2YoY29uc3QgX0JTdHJpbmcmIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gX0JTdHJpbmc6Om5wb3MpIGNvbnN0CisgIHsgcmV0dXJuIF9NX2dldF9zdG9yYWdlKCkuZmluZF9sYXN0X29mKF9fcywgX19wb3MpOyB9CisgIHNpemVfdHlwZSBmaW5kX2xhc3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3BvcyA9IF9CU3RyaW5nOjpucG9zKSBjb25zdAorICB7IHJldHVybiBfTV9nZXRfc3RvcmFnZSgpLmZpbmRfbGFzdF9vZihfX3MsIF9fcG9zKTsgfQorICBzaXplX3R5cGUgZmluZF9sYXN0X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIGNvbnN0CisgIHsgcmV0dXJuIF9NX2dldF9zdG9yYWdlKCkuZmluZF9sYXN0X29mKF9fcywgX19wb3MsIF9fbik7IH0KKyAgc2l6ZV90eXBlIGZpbmRfbGFzdF9vZihfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MgPSBfQlN0cmluZzo6bnBvcykgY29uc3QKKyAgeyByZXR1cm4gX01fZ2V0X3N0b3JhZ2UoKS5yZmluZChfX2MsIF9fcG9zKTsgfQorCisgIHNpemVfdHlwZSBmaW5kX2ZpcnN0X25vdF9vZihjb25zdCBfQlN0cmluZyYgX19zLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdAorICB7IHJldHVybiBfTV9nZXRfc3RvcmFnZSgpLmZpbmRfZmlyc3Rfbm90X29mKF9fcywgX19wb3MpOyB9CisgIHNpemVfdHlwZSBmaW5kX2ZpcnN0X25vdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QKKyAgeyByZXR1cm4gX01fZ2V0X3N0b3JhZ2UoKS5maW5kX2ZpcnN0X25vdF9vZihfX3MsIF9fcG9zKTsgfQorICBzaXplX3R5cGUgZmluZF9maXJzdF9ub3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgeyByZXR1cm4gX01fZ2V0X3N0b3JhZ2UoKS5maW5kX2ZpcnN0X25vdF9vZihfX3MsIF9fcG9zLCBfX24pOyB9CisgIHNpemVfdHlwZSBmaW5kX2ZpcnN0X25vdF9vZihfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdAorICB7IHJldHVybiBfTV9nZXRfc3RvcmFnZSgpLmZpbmRfZmlyc3Rfbm90X29mKF9fYywgX19wb3MpOyB9CisKKyAgc2l6ZV90eXBlIGZpbmRfbGFzdF9ub3Rfb2YoY29uc3QgX0JTdHJpbmcmIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gX0JTdHJpbmc6Om5wb3MpIGNvbnN0CisgIHsgcmV0dXJuIF9NX2dldF9zdG9yYWdlKCkuZmluZF9sYXN0X25vdF9vZihfX3MsIF9fcG9zKTsgfQorICBzaXplX3R5cGUgZmluZF9sYXN0X25vdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zID1fQlN0cmluZzo6IG5wb3MpIGNvbnN0CisgIHsgcmV0dXJuIF9NX2dldF9zdG9yYWdlKCkuZmluZF9sYXN0X25vdF9vZihfX3MsIF9fcG9zKTsgfQorICBzaXplX3R5cGUgZmluZF9sYXN0X25vdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdAorICB7IHJldHVybiBfTV9nZXRfc3RvcmFnZSgpLmZpbmRfbGFzdF9ub3Rfb2YoX19zLCBfX3BvcywgX19uKTsgfQorICBzaXplX3R5cGUgZmluZF9sYXN0X25vdF9vZihfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MgPSBfQlN0cmluZzo6bnBvcykgY29uc3QKKyAgeyByZXR1cm4gX01fZ2V0X3N0b3JhZ2UoKS5maW5kX2xhc3Rfbm90X29mKF9fYywgX19wb3MpOyB9CisKKyAgX0JTdHJpbmcgc3Vic3RyKHNpemVfdHlwZSBfX3BvcyA9IDAsIHNpemVfdHlwZSBfX24gPSBfQlN0cmluZzo6bnBvcykgY29uc3QKKyAgeyByZXR1cm4gX01fZ2V0X3N0b3JhZ2UoKS5zdWJzdHIoX19wb3MsIF9fbik7IH0KKworICAvL2NvbXBhcmUKKyAgaW50IGNvbXBhcmUoY29uc3QgX0JTdHJpbmcmIF9fcykgY29uc3QKKyAgeyByZXR1cm4gX01fZ2V0X3N0b3JhZ2UoKS5jb21wYXJlKF9fcyk7IH0KKyAgaW50IGNvbXBhcmUoc2l6ZV90eXBlIF9fcG9zMSwgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IF9TZWxmJiBfX3MpIGNvbnN0CisgIHsgcmV0dXJuIF9NX2dldF9zdG9yYWdlKCkuY29tcGFyZShfX3BvczEsIF9fbjEsIF9fcyk7IH0KKyAgaW50IGNvbXBhcmUoc2l6ZV90eXBlIF9fcG9zMSwgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IF9TZWxmJiBfX3MsIHNpemVfdHlwZSBfX3BvczIsIHNpemVfdHlwZSBfX24yKSBjb25zdAorICB7IHJldHVybiBfTV9nZXRfc3RvcmFnZSgpLmNvbXBhcmUoX19wb3MxLCBfX24xLCBfX3MsIF9fcG9zMiwgX19uMik7IH0KKyAgaW50IGNvbXBhcmUoY29uc3QgX0NoYXJUKiBfX3MpIGNvbnN0CisgIHsgcmV0dXJuIF9NX2dldF9zdG9yYWdlKCkuY29tcGFyZShfX3MpOyB9CisgIGludCBjb21wYXJlKHNpemVfdHlwZSBfX3BvczEsIHNpemVfdHlwZSBfX24xLCBjb25zdCBfQ2hhclQqIF9fcykgY29uc3QKKyAgeyByZXR1cm4gX01fZ2V0X3N0b3JhZ2UoKS5jb21wYXJlKF9fcG9zMSwgX19uMSwgX19zKTsgfQorICBpbnQgY29tcGFyZShzaXplX3R5cGUgX19wb3MxLCBzaXplX3R5cGUgX19uMSwgY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX24yKSBjb25zdAorICB7IHJldHVybiBfTV9nZXRfc3RvcmFnZSgpLmNvbXBhcmUoX19wb3MxLCBfX24xLCBfX3MsIF9fbjIpOyB9CisKKyAgLy9SZXR1cm5zIHRoZSB1bmRlcmx5aW5nIGJhc2ljX3N0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdGVtcGxhdGUgZXhwcmVzc2lvbgorICAvL1RoZSBub24gY29uc3QgbWV0aG9kIHdpbGwgYWx3YXlzIGluaXRpYWxpc2UgaXQuCisgIF9CU3RyaW5nJiBfTV9nZXRfc3RvcmFnZSgpCisgIHsgcmV0dXJuIF9yaHMuX01fZ2V0X3N0b3JhZ2UoKnRoaXMsIF9TdG9yYWdlRGlyZWN0aW9uKCkpOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9MaHMsIGNsYXNzIF9SaHMsIGNsYXNzIF9TdG9yYWdlRGlyPgorICBfQlN0cmluZyYgX01fZ2V0X3N0b3JhZ2UoX19ic3RyX3N1bTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0xocywgX1JocywgX1N0b3JhZ2VEaXI+ICBjb25zdCYgX19yZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX29uX2xlZnQgY29uc3QmIC8qU3RvcmFnZURpciovKQorICB7IHJldHVybiBfbGhzLl9NX2dldF9zdG9yYWdlKF9fcmVmKTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfTGhzLCBjbGFzcyBfUmhzLCBjbGFzcyBfU3RvcmFnZURpcj4KKyAgX0JTdHJpbmcmIF9NX2dldF9zdG9yYWdlKF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9MaHMsIF9SaHMsIF9TdG9yYWdlRGlyPiAgY29uc3QmIF9fcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX19vbl9yaWdodCBjb25zdCYgLypTdG9yYWdlRGlyKi8pCisgIHsgcmV0dXJuIF9yaHMuX01fZ2V0X3N0b3JhZ2UoX19yZWYpOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9MaHMsIGNsYXNzIF9SaHMsIGNsYXNzIF9TdG9yYWdlRGlyPgorICBfQlN0cmluZyYgX01fZ2V0X3N0b3JhZ2UoX19ic3RyX3N1bTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0xocywgX1JocywgX1N0b3JhZ2VEaXI+ICBjb25zdCYgX19yZWYpCisgIHsgcmV0dXJuIF9NX2dldF9zdG9yYWdlKF9fcmVmLCBfU3RvcmFnZURpcmVjdGlvbigpKTsgfQorCisgIC8vVGhlIGNvbnN0IG1ldGhvZCBjYW4gYmUgaW52b2tlZCB3aXRob3V0IGluaXRpYWxpc2luZyB0aGUgYmFzaWNfc3RyaW5nIHNvIGF2b2lkaW5nIGR5bmFtaWMgYWxsb2NhdGlvbi4KKyAgX0JTdHJpbmcgY29uc3QmIF9NX2dldF9zdG9yYWdlKGJvb2wgX19kb19pbml0ID0gdHJ1ZSkgY29uc3QKKyAgeyByZXR1cm4gX01fZ2V0X3N0b3JhZ2UoKnRoaXMsIF9fZG9faW5pdCwgX1N0b3JhZ2VEaXJlY3Rpb24oKSk7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0xocywgY2xhc3MgX1JocywgY2xhc3MgX1N0b3JhZ2VEaXI+CisgIF9CU3RyaW5nIGNvbnN0JiBfTV9nZXRfc3RvcmFnZShfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfTGhzLCBfUmhzLCBfU3RvcmFnZURpcj4gIGNvbnN0JiBfX3JlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgX19kb19pbml0LCBfX29uX2xlZnQgY29uc3QmIC8qU3RvcmFnZURpciovKSBjb25zdAorICB7IHJldHVybiBfbGhzLl9NX2dldF9zdG9yYWdlKF9fcmVmLCBfX2RvX2luaXQpOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9MaHMsIGNsYXNzIF9SaHMsIGNsYXNzIF9TdG9yYWdlRGlyPgorICBfQlN0cmluZyBjb25zdCYgX01fZ2V0X3N0b3JhZ2UoX19ic3RyX3N1bTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0xocywgX1JocywgX1N0b3JhZ2VEaXI+ICBjb25zdCYgX19yZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIF9fZG9faW5pdCwgX19vbl9yaWdodCBjb25zdCYgLypTdG9yYWdlRGlyKi8pIGNvbnN0CisgIHsgcmV0dXJuIF9yaHMuX01fZ2V0X3N0b3JhZ2UoX19yZWYsIF9fZG9faW5pdCk7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0xocywgY2xhc3MgX1JocywgY2xhc3MgX1N0b3JhZ2VEaXI+CisgIF9CU3RyaW5nIGNvbnN0JiBfTV9nZXRfc3RvcmFnZShfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfTGhzLCBfUmhzLCBfU3RvcmFnZURpcj4gIGNvbnN0JiBfX3JlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgX19kb19pbml0KSBjb25zdAorICB7IHJldHVybiBfTV9nZXRfc3RvcmFnZShfX3JlZiwgX19kb19pbml0LCBfU3RvcmFnZURpcmVjdGlvbigpKTsgfQorCitwcml2YXRlOgorICBfTGVmdCAgX2xoczsKKyAgX1JpZ2h0IF9yaHM7Cit9OworCisvKgorICogRm9yIHRoaXMgb3BlcmF0b3Igd2UgY2hvb3NlIHRvIHVzZSB0aGUgcmlnaHQgcGFydCBhcyB0aGUgc3RvcmFnZSBwYXJ0CisgKi8KK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYywKKyAgICAgICAgICBjbGFzcyBfTGgxLCBjbGFzcyBfUmgxLCBjbGFzcyBfU3RvcmVEaXIxLAorICAgICAgICAgIGNsYXNzIF9MaDIsIGNsYXNzIF9SaDIsIGNsYXNzIF9TdG9yZURpcjI+CitpbmxpbmUgX19ic3RyX3N1bTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywKKyAgICAgICAgICAgICAgICAgIF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9MaDEsIF9SaDEsIF9TdG9yZURpcjE+LAorICAgICAgICAgICAgICAgICAgX19ic3RyX3N1bTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0xoMiwgX1JoMiwgX1N0b3JlRGlyMj4sCisgICAgICAgICAgICAgICAgICBfX29uX3JpZ2h0PiBfU1RMUF9DQUxMCitvcGVyYXRvciArIChjb25zdCBfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfTGgxLCBfUmgxLCBfU3RvcmVEaXIxPiAmX19saHMsCisgICAgICAgICAgICBjb25zdCBfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfTGgyLCBfUmgyLCBfU3RvcmVEaXIyPiAmX19yaHMpIHsKKyAgcmV0dXJuIF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsCisgICAgICAgICAgICAgICAgICAgIF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9MaDEsIF9SaDEsIF9TdG9yZURpcjE+LAorICAgICAgICAgICAgICAgICAgICBfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfTGgyLCBfUmgyLCBfU3RvcmVEaXIyPiwKKyAgICAgICAgICAgICAgICAgICAgX19vbl9yaWdodD4oX19saHMsIF9fcmhzKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jLAorICAgICAgICAgIGNsYXNzIF9MaDEsIGNsYXNzIF9SaDEsIGNsYXNzIF9TdG9yZURpcjEsCisgICAgICAgICAgY2xhc3MgX0xoMiwgY2xhc3MgX1JoMiwgY2xhc3MgX1N0b3JlRGlyMj4KK2lubGluZSBib29sIF9TVExQX0NBTEwKK29wZXJhdG9yID09IChjb25zdCBfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfTGgxLCBfUmgxLCBfU3RvcmVEaXIxPiAmX19saHMsCisgICAgICAgICAgICAgY29uc3QgX19ic3RyX3N1bTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0xoMiwgX1JoMiwgX1N0b3JlRGlyMj4gJl9fcmhzKQoreyByZXR1cm4gKF9fbGhzLnNpemUoKSA9PSBfX3Jocy5zaXplKCkpICYmIChfX2xocy5fTV9nZXRfc3RvcmFnZSgpID09IF9fcmhzLl9NX2dldF9zdG9yYWdlKCkpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYywKKyAgICAgICAgICBjbGFzcyBfTGgxLCBjbGFzcyBfUmgxLCBjbGFzcyBfU3RvcmVEaXIxLAorICAgICAgICAgIGNsYXNzIF9MaDIsIGNsYXNzIF9SaDIsIGNsYXNzIF9TdG9yZURpcjI+CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMCitvcGVyYXRvciA8IChjb25zdCBfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfTGgxLCBfUmgxLCBfU3RvcmVEaXIxPiAmX19saHMsCisgICAgICAgICAgICBjb25zdCBfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfTGgyLCBfUmgyLCBfU3RvcmVEaXIyPiAmX19yaHMpCit7IHJldHVybiBfX2xocy5fTV9nZXRfc3RvcmFnZSgpIDwgX19yaHMuX01fZ2V0X3N0b3JhZ2UoKTsgfQorCisjaWZkZWYgX1NUTFBfVVNFX1NFUEFSQVRFX1JFTE9QU19OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jLAorICAgICAgICAgIGNsYXNzIF9MaDEsIGNsYXNzIF9SaDEsIGNsYXNzIF9TdG9yZURpcjEsCisgICAgICAgICAgY2xhc3MgX0xoMiwgY2xhc3MgX1JoMiwgY2xhc3MgX1N0b3JlRGlyMj4KK2lubGluZSBib29sIF9TVExQX0NBTEwKK29wZXJhdG9yICE9IChjb25zdCBfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfTGgxLCBfUmgxLCBfU3RvcmVEaXIxPiAmX19saHMsCisgICAgICAgICAgICAgY29uc3QgX19ic3RyX3N1bTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0xoMiwgX1JoMiwgX1N0b3JlRGlyMj4gJl9fcmhzKQoreyByZXR1cm4gIShfX2xocyA9PSBfX3Jocyk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jLAorICAgICAgICAgIGNsYXNzIF9MaDEsIGNsYXNzIF9SaDEsIGNsYXNzIF9TdG9yZURpcjEsCisgICAgICAgICAgY2xhc3MgX0xoMiwgY2xhc3MgX1JoMiwgY2xhc3MgX1N0b3JlRGlyMj4KK2lubGluZSBib29sIF9TVExQX0NBTEwKK29wZXJhdG9yID4gKGNvbnN0IF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9MaDEsIF9SaDEsIF9TdG9yZURpcjE+ICZfX2xocywKKyAgICAgICAgICAgIGNvbnN0IF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9MaDIsIF9SaDIsIF9TdG9yZURpcjI+ICZfX3JocykKK3sgcmV0dXJuIF9fcmhzIDwgX19saHM7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jLAorICAgICAgICAgIGNsYXNzIF9MaDEsIGNsYXNzIF9SaDEsIGNsYXNzIF9TdG9yZURpcjEsCisgICAgICAgICAgY2xhc3MgX0xoMiwgY2xhc3MgX1JoMiwgY2xhc3MgX1N0b3JlRGlyMj4KK2lubGluZSBib29sIF9TVExQX0NBTEwKK29wZXJhdG9yIDw9IChjb25zdCBfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfTGgxLCBfUmgxLCBfU3RvcmVEaXIxPiAmX19saHMsCisgICAgICAgICAgICAgY29uc3QgX19ic3RyX3N1bTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0xoMiwgX1JoMiwgX1N0b3JlRGlyMj4gJl9fcmhzKQoreyByZXR1cm4gIShfX3JocyA8IF9fbGhzKTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2MsCisgICAgICAgICAgY2xhc3MgX0xoMSwgY2xhc3MgX1JoMSwgY2xhc3MgX1N0b3JlRGlyMSwKKyAgICAgICAgICBjbGFzcyBfTGgyLCBjbGFzcyBfUmgyLCBjbGFzcyBfU3RvcmVEaXIyPgoraW5saW5lIGJvb2wgX1NUTFBfQ0FMTAorb3BlcmF0b3IgPj0gKGNvbnN0IF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9MaDEsIF9SaDEsIF9TdG9yZURpcjE+ICZfX2xocywKKyAgICAgICAgICAgICBjb25zdCBfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfTGgyLCBfUmgyLCBfU3RvcmVEaXIyPiAmX19yaHMpCit7IHJldHVybiAhKF9fbGhzIDwgX19yaHMpOyB9CisKKyNlbmRpZiAvKiBfU1RMUF9VU0VfU0VQQVJBVEVfUkVMT1BTX05BTUVTUEFDRSAqLworCisKKy8qCisgKiBUaGlzIGNsYXNzIHdpbGwgYmUgdXNlZCB0byBzaW11bGF0ZSBhIHRlbXBvcmFyeSBzdHJpbmcgdGhhdCBpcyByZXF1aXJlZCBmb3IKKyAqIGEgY2FsbCB0byB0aGUgY19zdHIgbWV0aG9kIG9uIHRoZSBfX2JzdHJfc3VtIGNsYXNzLgorICovCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK3N0cnVjdCBfX3N1bV9zdG9yYWdlX2VsZW0geworICB0eXBlZGVmIF9fc3VtX3N0b3JhZ2VfZWxlbTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4gX1NlbGY7CisgIHR5cGVkZWYgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiBfQlN0cmluZzsKKworICBfX3N1bV9zdG9yYWdlX2VsZW0oX0FsbG9jIF9fYWxsb2MpIDogX01faW5pdChmYWxzZSksIF9NX3N0b3JhZ2UoX19hbGxvYykKKyAge30KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0xlZnQsIGNsYXNzIF9SaWdodCwgY2xhc3MgX1N0b3JhZ2VEaXI+CisgIHZvaWQgX01fSW5pdChfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfTGVmdCwgX1JpZ2h0LCBfU3RvcmFnZURpcj4gIGNvbnN0JiBfX3JlZikgY29uc3QgeworICAgIGlmICghX01faW5pdCkgeworICAgICAgX1NUTFBfTVVUQUJMRShfU2VsZiwgX01fc3RvcmFnZSkgPSBfX3JlZjsKKyAgICAgIF9TVExQX01VVEFCTEUoX1NlbGYsIF9NX2luaXQpID0gdHJ1ZTsKKyAgICB9CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0xlZnQsIGNsYXNzIF9SaWdodCwgY2xhc3MgX1N0b3JhZ2VEaXI+CisgIF9CU3RyaW5nIGNvbnN0JiBfTV9nZXRfc3RvcmFnZShfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfTGVmdCwgX1JpZ2h0LCBfU3RvcmFnZURpcj4gIGNvbnN0JiBfX3JlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgX19kb19pbml0KSBjb25zdCB7CisgICAgaWYgKF9fZG9faW5pdCkgeworICAgICAgX01fSW5pdChfX3JlZik7CisgICAgfQorICAgIHJldHVybiBfTV9zdG9yYWdlOworICB9CisgIHRlbXBsYXRlIDxjbGFzcyBfTGVmdCwgY2xhc3MgX1JpZ2h0LCBjbGFzcyBfU3RvcmFnZURpcj4KKyAgX0JTdHJpbmcmIF9NX2dldF9zdG9yYWdlKF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9MZWZ0LCBfUmlnaHQsIF9TdG9yYWdlRGlyPiAgY29uc3QmIF9fcmVmKSB7CisgICAgX01fSW5pdChfX3JlZik7CisgICAgcmV0dXJuIF9NX3N0b3JhZ2U7CisgIH0KKworICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KKyAgX0NoYXJUIGNvbnN0JiBvcGVyYXRvcltdKHNpemVfdCBfX24pIGNvbnN0CisgIHsgcmV0dXJuIF9fU1RBVElDX0NBU1QoX0NoYXJUKiwgMClbX19uXTsgfQorCitwcml2YXRlOgorICBtdXRhYmxlIGJvb2wgX01faW5pdDsKKyAgbXV0YWJsZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+IF9NX3N0b3JhZ2U7Cit9OworCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLypfU1RMUF9TVFJJTkdfU1VNX0gqLwpkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdGwvX3N0cmluZ19zdW1fbWV0aG9kcy5oIGIvc3RscG9ydC9zdGwvX3N0cmluZ19zdW1fbWV0aG9kcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNTYwOGUKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9fc3RyaW5nX3N1bV9tZXRob2RzLmgKQEAgLTAsMCArMSwxNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMKKyAqIEZyYW5jb2lzIER1bW9udAorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisvKgorICogQWxsIHRoZSBuZWNlc3NhcnkgbWV0aG9kcyB1c2VkIGZvciB0ZW1wbGF0ZSBleHByZXNzaW9ucyB3aXRoIGJhc2ljX3N0cmluZworICogVGhpcyBmaWxlIGRvIG5vdCBoYXZlIHRvIGJlIG1hY3JvIGd1YXJkZWQgYXMgaXQgaXMgb25seSB1c2VkIGluIHRoZSBfc3RyaW5nLmgKKyAqIGZpbGUgYW5kIGl0IGlzIGEgcGFydCBvZiB0aGUgYmFzaWNfc3RyaW5nIGRlZmluaXRpb24uCisgKi8KKworcHVibGljOgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0xlZnQsIGNsYXNzIF9SaWdodCwgY2xhc3MgX1N0b3JhZ2VEaXI+CisgIGJhc2ljX3N0cmluZyhfU1RMUF9QUklWIF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9MZWZ0LCBfUmlnaHQsIF9TdG9yYWdlRGlyPiBjb25zdCYgX19zKQorICAgIDogX1NUTFBfU1RSSU5HX1NVTV9CQVNFKF9SZXNlcnZlX3QoKSwgX19zLnNpemUoKSwgX19zLmdldF9hbGxvY2F0b3IoKSkKKyAgeyBfTV9hcHBlbmRfc3VtKF9fcyk7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0xlZnQsIGNsYXNzIF9SaWdodCwgY2xhc3MgX1N0b3JhZ2VEaXI+CisgIGJhc2ljX3N0cmluZyhfU1RMUF9QUklWIF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9MZWZ0LCBfUmlnaHQsIF9TdG9yYWdlRGlyPiBjb25zdCYgX19zLAorICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uID0gbnBvcywKKyAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX1NUTFBfU1RSSU5HX1NVTV9CQVNFKF9SZXNlcnZlX3QoKSwgKF9fcG9zIDw9IF9fcy5zaXplKCkpID8gKChtaW4pIChfX24sIF9fcy5zaXplKCkgLSBfX3BvcykpIDogMCwgX19hKSB7CisgICAgc2l6ZV90eXBlIF9fc2l6ZSA9IF9fcy5zaXplKCk7CisgICAgaWYgKF9fcG9zID4gX19zaXplKQorICAgICAgdGhpcy0+X01fdGhyb3dfb3V0X29mX3JhbmdlKCk7CisgICAgZWxzZQorICAgICAgX01fYXBwZW5kX3N1bV9wb3MoX19zLCBfX3BvcywgKG1pbikgKF9fbiwgX19zaXplIC0gX19wb3MpKTsKKyAgfQorCitwcml2YXRlOgorICBfQ2hhclQqIF9NX2FwcGVuZF9mYXN0KF9TVExQX1BSSVYgX19jaGFyX3dyYXBwZXI8X0NoYXJUPiBfX2MsIF9DaGFyVCAqX19idWYpIHsKKyAgICBfU1RMUF9TVEQ6Ol9Db3B5X0NvbnN0cnVjdChfX2J1ZiwgX19jLmdldFZhbHVlKCkpOworICAgIHJldHVybiBfX2J1ZiArIDE7CisgIH0KKyAgX0NoYXJUKiBfTV9hcHBlbmRfZmFzdChfQ2hhclQgY29uc3QqIF9fcywgc2l6ZV90eXBlIF9fc19zaXplLCBfQ2hhclQgKl9fYnVmKQorICB7IHJldHVybiB1bmluaXRpYWxpemVkX2NvcHkoX19zLCBfX3MgKyBfX3Nfc2l6ZSwgX19idWYpOyB9CisgIF9DaGFyVCogX01fYXBwZW5kX2Zhc3QoX1NUTFBfUFJJViBfX2NzdHJfd3JhcHBlcjxfQ2hhclQ+IGNvbnN0JiBfX3MsIF9DaGFyVCAqX19idWYpCisgIHsgcmV0dXJuIF9NX2FwcGVuZF9mYXN0KF9fcy5jX3N0cigpLCBfX3Muc2l6ZSgpLCBfX2J1Zik7IH0KKyAgX0NoYXJUKiBfTV9hcHBlbmRfZmFzdChfU1RMUF9QUklWIF9fYnN0cl93cmFwcGVyPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiBfX3MsIF9DaGFyVCAqX19idWYpCisgIHsgcmV0dXJuIF9NX2FwcGVuZF9mYXN0KF9fcy5iX3N0cigpLCBfX2J1Zik7IH0KKyAgX0NoYXJUKiBfTV9hcHBlbmRfZmFzdChfU2VsZiBjb25zdCYgX19zLCBfQ2hhclQgKl9fYnVmKQorICB7IHJldHVybiBfTV9hcHBlbmRfZmFzdChfX3MuZGF0YSgpLCBfX3Muc2l6ZSgpLCBfX2J1Zik7IH0KKyAgX0NoYXJUKiBfTV9hcHBlbmRfZmFzdChfU1RMUF9QUklWIF9fc3VtX3N0b3JhZ2VfZWxlbTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4gY29uc3QmLCBfQ2hhclQgKl9fYnVmKQorICB7IHJldHVybiBfX2J1ZjsgfQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0xlZnQsIGNsYXNzIF9SaWdodCwgY2xhc3MgX1N0b3JhZ2VEaXI+CisgIF9DaGFyVCogX01fYXBwZW5kX2Zhc3QoX1NUTFBfUFJJViBfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfTGVmdCwgX1JpZ2h0LCBfU3RvcmFnZURpcj4gY29uc3QmIF9fcywgX0NoYXJUICpfX2J1ZikKKyAgeyByZXR1cm4gX01fYXBwZW5kX2Zhc3QoX19zLmdldFJocygpLCBfTV9hcHBlbmRfZmFzdChfX3MuZ2V0TGhzKCksIF9fYnVmKSk7IH0KKworICBfQ2hhclQqIF9NX2FwcGVuZF9mYXN0X3BvcyhfU1RMUF9QUklWIF9fY2hhcl93cmFwcGVyPF9DaGFyVD4gX19jLCBfQ2hhclQgKl9fYnVmLCBzaXplX3R5cGUgLypfX3BvcyovLCBzaXplX3R5cGUgX19uKSB7CisgICAgaWYgKF9fbiA9PSAwKQorICAgICAgcmV0dXJuIF9fYnVmOworICAgIF9TVExQX1NURDo6X0NvcHlfQ29uc3RydWN0KF9fYnVmLCBfX2MuZ2V0VmFsdWUoKSk7CisgICAgcmV0dXJuIF9fYnVmICsgMTsKKyAgfQorICBfQ2hhclQqIF9NX2FwcGVuZF9mYXN0X3BvcyhfQ2hhclQgY29uc3QqIF9fcywgc2l6ZV90eXBlIF9fc19zaXplLCBfQ2hhclQgKl9fYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pCisgIHsgcmV0dXJuIHVuaW5pdGlhbGl6ZWRfY29weShfX3MgKyBfX3BvcywgX19zICsgX19wb3MgKyAobWluKShfX24sIF9fc19zaXplIC0gX19wb3MpLCBfX2J1Zik7IH0KKyAgX0NoYXJUKiBfTV9hcHBlbmRfZmFzdF9wb3MoX1NUTFBfUFJJViBfX2NzdHJfd3JhcHBlcjxfQ2hhclQ+IGNvbnN0JiBfX3MsIF9DaGFyVCAqX19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikKKyAgeyByZXR1cm4gX01fYXBwZW5kX2Zhc3RfcG9zKF9fcy5jX3N0cigpLCBfX3Muc2l6ZSgpLCBfX2J1ZiwgX19wb3MsIF9fbik7IH0KKyAgX0NoYXJUKiBfTV9hcHBlbmRfZmFzdF9wb3MoX1NUTFBfUFJJViBfX2JzdHJfd3JhcHBlcjxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4gX19zLCBfQ2hhclQgKl9fYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pCisgIHsgcmV0dXJuIF9NX2FwcGVuZF9mYXN0X3BvcyhfX3MuYl9zdHIoKSwgX19idWYsIF9fcG9zLCBfX24pOyB9CisgIF9DaGFyVCogX01fYXBwZW5kX2Zhc3RfcG9zKF9TZWxmIGNvbnN0JiBfX3MsIF9DaGFyVCAqX19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikKKyAgeyByZXR1cm4gX01fYXBwZW5kX2Zhc3RfcG9zKF9fcy5kYXRhKCksIF9fcy5zaXplKCksIF9fYnVmLCBfX3BvcywgX19uKTsgfQorICBfQ2hhclQqIF9NX2FwcGVuZF9mYXN0X3BvcyhfU1RMUF9QUklWIF9fc3VtX3N0b3JhZ2VfZWxlbTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4gY29uc3QmLCBfQ2hhclQgKl9fYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUsIHNpemVfdHlwZSkKKyAgeyByZXR1cm4gX19idWY7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0xlZnQsIGNsYXNzIF9SaWdodCwgY2xhc3MgX1N0b3JhZ2VEaXI+CisgIF9DaGFyVCogX01fYXBwZW5kX2Zhc3RfcG9zKF9TVExQX1BSSVYgX19ic3RyX3N1bTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0xlZnQsIF9SaWdodCwgX1N0b3JhZ2VEaXI+IGNvbnN0JiBfX3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DaGFyVCAqX19idWYsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgeworICAgIGlmIChfX24gPT0gMCkgeworICAgICAgcmV0dXJuIF9fYnVmOworICAgIH0KKyAgICBzaXplX3R5cGUgX19saHNfc2l6ZSA9IF9fcy5nZXRMaHMoKS5zaXplKCk7CisgICAgaWYgKF9fcG9zIDwgX19saHNfc2l6ZSkgeworICAgICAgaWYgKF9fbiA8IChfX2xoc19zaXplIC0gX19wb3MpKSB7CisgICAgICAgIHJldHVybiBfTV9hcHBlbmRfZmFzdF9wb3MoX19zLmdldExocygpLCBfX2J1ZiwgX19wb3MsIF9fbik7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gX01fYXBwZW5kX2Zhc3RfcG9zKF9fcy5nZXRSaHMoKSwgX01fYXBwZW5kX2Zhc3RfcG9zKF9fcy5nZXRMaHMoKSwgX19idWYsIF9fcG9zLCBfX24pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIF9fbiAtIChfX2xoc19zaXplIC0gX19wb3MpKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIF9NX2FwcGVuZF9mYXN0X3BvcyhfX3MuZ2V0UmhzKCksIF9fYnVmLCBfX3BvcyAtIF9fbGhzX3NpemUsIF9fbik7CisgICAgfQorICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9MZWZ0LCBjbGFzcyBfUmlnaHQsIGNsYXNzIF9TdG9yYWdlRGlyPgorICBfU2VsZiYgX01fYXBwZW5kX3N1bSAoX1NUTFBfUFJJViBfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfTGVmdCwgX1JpZ2h0LCBfU3RvcmFnZURpcj4gY29uc3QmIF9fcykgeworICAgIHNpemVfdHlwZSBfX3Nfc2l6ZSA9IF9fcy5zaXplKCk7CisgICAgaWYgKF9fc19zaXplID09IDApCisgICAgICByZXR1cm4gKnRoaXM7CisgICAgY29uc3Qgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSB0aGlzLT5zaXplKCk7CisgICAgaWYgKF9fc19zaXplID4gdGhpcy0+bWF4X3NpemUoKSB8fCBfX29sZF9zaXplID4gKHRoaXMtPm1heF9zaXplKCkgLSBfX3Nfc2l6ZSkpCisgICAgICB0aGlzLT5fTV90aHJvd19sZW5ndGhfZXJyb3IoKTsKKyAgICBpZiAoX19vbGRfc2l6ZSArIF9fc19zaXplID4gdGhpcy0+Y2FwYWNpdHkoKSkgeworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fbGVuID0gX19vbGRfc2l6ZSArIChtYXgpKF9fb2xkX3NpemUsIF9fc19zaXplKSArIDE7CisgICAgICBwb2ludGVyIF9fbmV3X3N0YXJ0ID0gdGhpcy0+X01fc3RhcnRfb2Zfc3RvcmFnZS5hbGxvY2F0ZShfX2xlbik7CisgICAgICBwb2ludGVyIF9fbmV3X2ZpbmlzaCA9IHVuaW5pdGlhbGl6ZWRfY29weSh0aGlzLT5fTV9TdGFydCgpLCB0aGlzLT5fTV9GaW5pc2goKSwgX19uZXdfc3RhcnQpOworICAgICAgX19uZXdfZmluaXNoID0gdGhpcy0+X01fYXBwZW5kX2Zhc3QoX19zLCBfX25ld19maW5pc2gpOworICAgICAgdGhpcy0+X01fY29uc3RydWN0X251bGwoX19uZXdfZmluaXNoKTsKKyAgICAgIHRoaXMtPl9NX2RlYWxsb2NhdGVfYmxvY2soKTsKKyAgICAgIHRoaXMtPl9NX3Jlc2V0KF9fbmV3X3N0YXJ0LCBfX25ld19maW5pc2gsIF9fbmV3X3N0YXJ0ICsgX19sZW4pOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIF9NX2FwcGVuZF9zdW1fbm9fb3ZlcmZsb3coX19zLCAwLCBfX3Nfc2l6ZSk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfTGVmdCwgY2xhc3MgX1JpZ2h0LCBjbGFzcyBfU3RvcmFnZURpcj4KKyAgX1NlbGYmIF9NX2FwcGVuZF9zdW1fcG9zKF9TVExQX1BSSVYgX19ic3RyX3N1bTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0xlZnQsIF9SaWdodCwgX1N0b3JhZ2VEaXI+IGNvbnN0JiBfX3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIHsKKyAgICBzaXplX3R5cGUgX19zX3NpemUgPSAobWluKShfX3Muc2l6ZSgpIC0gX19wb3MsIF9fbik7CisgICAgaWYgKF9fc19zaXplID09IDApCisgICAgICByZXR1cm4gKnRoaXM7CisgICAgY29uc3Qgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSB0aGlzLT5zaXplKCk7CisgICAgaWYgKF9fc19zaXplID4gdGhpcy0+bWF4X3NpemUoKSB8fCBfX29sZF9zaXplID4gKHRoaXMtPm1heF9zaXplKCkgLSBfX3Nfc2l6ZSkpCisgICAgICB0aGlzLT5fTV90aHJvd19sZW5ndGhfZXJyb3IoKTsKKyAgICBpZiAoX19vbGRfc2l6ZSArIF9fc19zaXplID4gdGhpcy0+Y2FwYWNpdHkoKSkgeworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fbGVuID0gX19vbGRfc2l6ZSArIChtYXgpKF9fb2xkX3NpemUsIF9fc19zaXplKSArIDE7CisgICAgICBwb2ludGVyIF9fbmV3X3N0YXJ0ID0gdGhpcy0+X01fc3RhcnRfb2Zfc3RvcmFnZS5hbGxvY2F0ZShfX2xlbik7CisgICAgICBwb2ludGVyIF9fbmV3X2ZpbmlzaCA9IHVuaW5pdGlhbGl6ZWRfY29weSh0aGlzLT5fTV9TdGFydCgpLCB0aGlzLT5fTV9GaW5pc2goKSwgX19uZXdfc3RhcnQpOworICAgICAgX19uZXdfZmluaXNoID0gX01fYXBwZW5kX2Zhc3RfcG9zKF9fcywgX19uZXdfZmluaXNoLCBfX3BvcywgX19zX3NpemUpOworICAgICAgdGhpcy0+X01fY29uc3RydWN0X251bGwoX19uZXdfZmluaXNoKTsKKyAgICAgIHRoaXMtPl9NX2RlYWxsb2NhdGVfYmxvY2soKTsKKyAgICAgIHRoaXMtPl9NX3Jlc2V0KF9fbmV3X3N0YXJ0LCBfX25ld19maW5pc2gsIF9fbmV3X3N0YXJ0ICsgX19sZW4pOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIF9NX2FwcGVuZF9zdW1fbm9fb3ZlcmZsb3coX19zLCBfX3BvcywgX19zX3NpemUpOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0xlZnQsIGNsYXNzIF9SaWdodCwgY2xhc3MgX1N0b3JhZ2VEaXI+CisgIHZvaWQgX01fYXBwZW5kX3N1bV9ub19vdmVyZmxvdyhfU1RMUF9QUklWIF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9MZWZ0LCBfUmlnaHQsIF9TdG9yYWdlRGlyPiBjb25zdCYgX19zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSB7CisgICAgcG9pbnRlciBfX2ZpbmlzaCA9IHRoaXMtPl9NX0ZpbmlzaCgpOworICAgIF9NX2FwcGVuZF9mYXN0X3BvcyhfX3MsIF9fZmluaXNoICsgMSwgX19wb3MgKyAxLCBfX24gLSAxKTsKKyAgICB0aGlzLT5fTV9jb25zdHJ1Y3RfbnVsbChfX2ZpbmlzaCArIF9fbik7CisgICAgX1RyYWl0czo6YXNzaWduKCp0aGlzLT5fTV9maW5pc2gsIF9fc1tfX3Bvc10pOworICAgIHRoaXMtPl9NX2ZpbmlzaCArPSBfX247CisgIH0KZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL19zdHJpbmdfd29ya2Fyb3VuZC5oIGIvc3RscG9ydC9zdGwvX3N0cmluZ193b3JrYXJvdW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc3ZTMyMAotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc3RsL19zdHJpbmdfd29ya2Fyb3VuZC5oCkBAIC0wLDAgKzEsNTk5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA0CisgKiBGcmFuY29pcyBEdW1vbnQKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworLy9JbmNsdWRlZCBmcm9tIF9zdHJpbmcuaCwgbm8gbmVlZCBmb3IgbWFjcm8gZ3VhcmRpbmcuCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisjaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpCisjICBkZWZpbmUgYmFzaWNfc3RyaW5nIF9TVExQX05PTl9EQkdfTkFNRShzdHIpCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisjZW5kaWYKKworI2RlZmluZSBfU1RMUF9OT19NRU1fVF9TVFJJTkdfQkFTRSBfU1RMUF9QUklWIF9TVExQX05PX01FTV9UX05BTUUoc3RyKTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorY2xhc3MgYmFzaWNfc3RyaW5nIDogcHVibGljIF9TVExQX05PX01FTV9UX1NUUklOR19CQVNFCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKSAmJiAhZGVmaW5lZCAoYmFzaWNfc3RyaW5nKQorICAgICAgICAgICAgICAgICAgICwgcHVibGljIF9fc3RscG9ydF9jbGFzczxiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+ID4KKyNlbmRpZgoreworcHJpdmF0ZTogICAgICAgICAgICAgICAgICAgICAgICAvLyBQcm90ZWN0ZWQgbWVtYmVycyBpbmhlcml0ZWQgZnJvbSBiYXNlLgorICB0eXBlZGVmIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4gX1NlbGY7CisgIHR5cGVkZWYgX1NUTFBfTk9fTUVNX1RfU1RSSU5HX0JBU0UgX0Jhc2U7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Ol9DYWxsZWRGcm9tV29ya2Fyb3VuZF90IF9DYWxsZWRGcm9tV29ya2Fyb3VuZF90OworcHVibGljOgorCisgIF9fSU1QT1JUX1dJVEhfUkVWRVJTRV9JVEVSQVRPUlMoX0Jhc2UpCisKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6X0l0ZXJhdG9yX2NhdGVnb3J5IF9JdGVyYXRvcl9jYXRlZ29yeTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6dHJhaXRzX3R5cGUgdHJhaXRzX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Ol9SZXNlcnZlX3QgX1Jlc2VydmVfdDsKKworI2luY2x1ZGUgPHN0bC9fc3RyaW5nX25wb3MuaD4KKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25zdHJ1Y3RvciwgZGVzdHJ1Y3RvciwgYXNzaWdubWVudC4KKyAgZXhwbGljaXQgYmFzaWNfc3RyaW5nKGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX1NUTFBfTk9fTUVNX1RfU1RSSU5HX0JBU0UoX19hKSB7fQorCisgIGJhc2ljX3N0cmluZyhfUmVzZXJ2ZV90IF9fciwgc2l6ZV90IF9fbiwKKyAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX1NUTFBfTk9fTUVNX1RfU1RSSU5HX0JBU0UoX19yLCBfX24sIF9fYSkge30KKworICBiYXNpY19zdHJpbmcoY29uc3QgX1NlbGYmIF9fcykKKyAgICA6IF9TVExQX05PX01FTV9UX1NUUklOR19CQVNFKF9fcykge30KKworICBiYXNpY19zdHJpbmcoY29uc3QgX1NlbGYmIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uID0gbnBvcywKKyAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX1NUTFBfTk9fTUVNX1RfU1RSSU5HX0JBU0UoX19zLCBfX3BvcywgX19uLCBfX2EpIHt9CisKKyAgYmFzaWNfc3RyaW5nKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uLAorICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfU1RMUF9OT19NRU1fVF9TVFJJTkdfQkFTRShfX3MsIF9fbiwgX19hKSB7fQorCisgIGJhc2ljX3N0cmluZyhjb25zdCBfQ2hhclQqIF9fcywKKyAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX1NUTFBfTk9fTUVNX1RfU1RSSU5HX0JBU0UoX19zLCBfX2EpIHt9CisKKyAgYmFzaWNfc3RyaW5nKHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MsCisgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9TVExQX05PX01FTV9UX1NUUklOR19CQVNFKF9fbiwgX19jLCBfX2EpIHt9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKKyAgYmFzaWNfc3RyaW5nKF9fbW92ZV9zb3VyY2U8X1NlbGY+IHNyYykKKyAgICA6IF9TVExQX05PX01FTV9UX1NUUklOR19CQVNFKF9fbW92ZV9zb3VyY2U8X0Jhc2U+KHNyYy5nZXQoKSkpIHt9CisjZW5kaWYKKworICAvLyBDaGVjayB0byBzZWUgaWYgX0lucHV0SXRlcmF0b3IgaXMgYW4gaW50ZWdlciB0eXBlLiAgSWYgc28sIHRoZW4KKyAgLy8gaXQgY2FuJ3QgYmUgYW4gaXRlcmF0b3IuCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgYmFzaWNfc3RyaW5nKF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLAorICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUgJiBfX2EgX1NUTFBfQUxMT0NBVE9SX1RZUEVfREZMKQorICAgIDogX1NUTFBfTk9fTUVNX1RfU1RSSU5HX0JBU0UoX0NhbGxlZEZyb21Xb3JrYXJvdW5kX3QoKSwgX19hKSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXNJbnRlZ3JhbDxfSW5wdXRJdGVyYXRvcj46Ol9SZXQgX0ludGVncmFsOworICAgIF9NX2luaXRpYWxpemVfZGlzcGF0Y2goX19mLCBfX2wsIF9JbnRlZ3JhbCgpKTsKKyAgfQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfTkVFRFNfRVhUUkFfVEVNUExBVEVfQ09OU1RSVUNUT1JTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIGJhc2ljX3N0cmluZyhfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCkKKyAgICA6IF9TVExQX05PX01FTV9UX1NUUklOR19CQVNFKF9DYWxsZWRGcm9tV29ya2Fyb3VuZF90KCksIGFsbG9jYXRvcl90eXBlKCkpIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0ludGVncmFsPF9JbnB1dEl0ZXJhdG9yPjo6X1JldCBfSW50ZWdyYWw7CisgICAgX01faW5pdGlhbGl6ZV9kaXNwYXRjaChfX2YsIF9fbCwgX0ludGVncmFsKCkpOworICB9CisjICBlbmRpZgorCisgIF9TZWxmJiBvcGVyYXRvcj0oY29uc3QgX1NlbGYmIF9fcykgeworICAgIF9CYXNlOjpvcGVyYXRvcj0oX19zKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBfU2VsZiYgb3BlcmF0b3I9KGNvbnN0IF9DaGFyVCogX19zKSB7CisgICAgX0Jhc2U6Om9wZXJhdG9yPShfX3MpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIF9TZWxmJiBvcGVyYXRvcj0oX0NoYXJUIF9fYykgeworICAgIF9CYXNlOjpvcGVyYXRvcj0oX19jKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworcHJpdmF0ZToKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXI+CisgIHZvaWQgX01fcmFuZ2VfaW5pdGlhbGl6ZShfSW5wdXRJdGVyIF9fZiwgX0lucHV0SXRlciBfX2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnB1dF9pdGVyYXRvcl90YWcgJl9fdGFnKSB7CisgICAgdGhpcy0+X01fYWxsb2NhdGVfYmxvY2soKTsKKyAgICB0aGlzLT5fTV9jb25zdHJ1Y3RfbnVsbCh0aGlzLT5fTV9GaW5pc2goKSk7CisgICAgX01fYXBwZW5kVChfX2YsIF9fbCwgX190YWcpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcj4KKyAgdm9pZCBfTV9yYW5nZV9pbml0aWFsaXplKF9Gb3J3YXJkSXRlciBfX2YsIF9Gb3J3YXJkSXRlciBfX2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3J3YXJkX2l0ZXJhdG9yX3RhZyAmKSB7CisgICAgZGlmZmVyZW5jZV90eXBlIF9fbiA9IF9TVExQX1NURDo6ZGlzdGFuY2UoX19mLCBfX2wpOworICAgIHRoaXMtPl9NX2FsbG9jYXRlX2Jsb2NrKF9fbiArIDEpOworICAgIHRoaXMtPl9NX2ZpbmlzaCA9IHVuaW5pdGlhbGl6ZWRfY29weShfX2YsIF9fbCwgdGhpcy0+X01fU3RhcnQoKSk7CisgICAgdGhpcy0+X01fdGVybWluYXRlX3N0cmluZygpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXI+CisgIHZvaWQgX01fcmFuZ2VfaW5pdGlhbGl6ZVQoX0lucHV0SXRlciBfX2YsIF9JbnB1dEl0ZXIgX19sKSB7CisgICAgX01fcmFuZ2VfaW5pdGlhbGl6ZShfX2YsIF9fbCwgX1NUTFBfSVRFUkFUT1JfQ0FURUdPUlkoX19mLCBfSW5wdXRJdGVyKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0ludGVnZXI+CisgIHZvaWQgX01faW5pdGlhbGl6ZV9kaXNwYXRjaChfSW50ZWdlciBfX24sIF9JbnRlZ2VyIF9feCwgY29uc3QgX190cnVlX3R5cGUmIC8qX0ludGVncmFsKi8pIHsKKyAgICB0aGlzLT5fTV9hbGxvY2F0ZV9ibG9jayhfX24gKyAxKTsKKyAgICB0aGlzLT5fTV9maW5pc2ggPSB1bmluaXRpYWxpemVkX2ZpbGxfbih0aGlzLT5fTV9TdGFydCgpLCBfX24sIF9feCk7CisgICAgdGhpcy0+X01fdGVybWluYXRlX3N0cmluZygpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXI+CisgIHZvaWQgX01faW5pdGlhbGl6ZV9kaXNwYXRjaChfSW5wdXRJdGVyIF9fZiwgX0lucHV0SXRlciBfX2wsIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypfSW50ZWdyYWwqLykgeworICAgIF9NX3JhbmdlX2luaXRpYWxpemVUKF9fZiwgX19sKTsKKyAgfQorCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFwcGVuZCwgb3BlcmF0b3IrPSwgcHVzaF9iYWNrLgorICBfU2VsZiYgb3BlcmF0b3IrPShjb25zdCBfU2VsZiYgX19zKSB7CisgICAgX0Jhc2U6Om9wZXJhdG9yKz0oX19zKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgX1NlbGYmIG9wZXJhdG9yKz0oY29uc3QgX0NoYXJUKiBfX3MpIHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKQorICAgIF9CYXNlOjpvcGVyYXRvcis9KF9fcyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIF9TZWxmJiBvcGVyYXRvcis9KF9DaGFyVCBfX2MpIHsKKyAgICBfQmFzZTo6b3BlcmF0b3IrPShfX2MpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIF9TZWxmJiBhcHBlbmQoY29uc3QgX1NlbGYmIF9fcykgeworICAgIF9CYXNlOjphcHBlbmQoX19zKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBfU2VsZiYgYXBwZW5kKGNvbnN0IF9TZWxmJiBfX3MsCisgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSB7CisgICAgX0Jhc2U6OmFwcGVuZChfX3MsIF9fcG9zLCBfX24pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIF9TZWxmJiBhcHBlbmQoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX24pIHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKQorICAgIF9CYXNlOjphcHBlbmQoX19zLCBfX24pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBfU2VsZiYgYXBwZW5kKGNvbnN0IF9DaGFyVCogX19zKSB7CisgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKKyAgICBfQmFzZTo6YXBwZW5kKF9fcyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIF9TZWxmJiBhcHBlbmQoc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYykgeworICAgIF9CYXNlOjphcHBlbmQoX19uLCBfX2MpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vIENoZWNrIHRvIHNlZSBpZiBfSW5wdXRJdGVyYXRvciBpcyBhbiBpbnRlZ2VyIHR5cGUuICBJZiBzbywgdGhlbgorICAvLyBpdCBjYW4ndCBiZSBhbiBpdGVyYXRvci4KKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXI+CisgIF9TZWxmJiBhcHBlbmQoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCkgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lzSW50ZWdyYWw8X0lucHV0SXRlcj46Ol9SZXQgX0ludGVncmFsOworICAgIHJldHVybiBfTV9hcHBlbmRfZGlzcGF0Y2goX19maXJzdCwgX19sYXN0LCBfSW50ZWdyYWwoKSk7CisgIH0KKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19NRVRIT0RfU1BFQ0lBTElaQVRJT04pICYmICFkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQorICAvL1NlZSBlcXVpdmFsZW50IGFzc2lnbiBtZXRob2QgcmVtYXJrLgorICBfU2VsZiYgYXBwZW5kKGNvbnN0IF9DaGFyVCogX19mLCBjb25zdCBfQ2hhclQqIF9fbCkgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2YpX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fbCkKKyAgICBfQmFzZTo6YXBwZW5kKF9fZiwgX19sKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyNlbmRpZgorCitwcml2YXRlOiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIGFwcGVuZC4KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcj4KKyAgX1NlbGYmIF9NX2FwcGVuZFQoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBpbnB1dF9pdGVyYXRvcl90YWcgJikgeworICAgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3QgOyArK19fZmlyc3QpCisgICAgICBfQmFzZTo6cHVzaF9iYWNrKCpfX2ZpcnN0KTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyPgorICBfU2VsZiYgX01fYXBwZW5kVChfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9yd2FyZF9pdGVyYXRvcl90YWcgJikgIHsKKyAgICBpZiAoX19maXJzdCAhPSBfX2xhc3QpIHsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX24gPSBfX1NUQVRJQ19DQVNUKHNpemVfdHlwZSwgX1NUTFBfU1REOjpkaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QpKTsKKyAgICAgIGlmIChfX24gPj0gdGhpcy0+X01fcmVzdCgpKSB7CisgICAgICAgIHNpemVfdHlwZSBfX2xlbiA9IHRoaXMtPl9NX2NvbXB1dGVfbmV4dF9zaXplKF9fbik7CisgICAgICAgIHBvaW50ZXIgX19uZXdfc3RhcnQgPSB0aGlzLT5fTV9zdGFydF9vZl9zdG9yYWdlLmFsbG9jYXRlKF9fbGVuLCBfX2xlbik7CisgICAgICAgIHBvaW50ZXIgX19uZXdfZmluaXNoID0gdW5pbml0aWFsaXplZF9jb3B5KHRoaXMtPl9NX1N0YXJ0KCksIHRoaXMtPl9NX0ZpbmlzaCgpLCBfX25ld19zdGFydCk7CisgICAgICAgIF9fbmV3X2ZpbmlzaCA9IHVuaW5pdGlhbGl6ZWRfY29weShfX2ZpcnN0LCBfX2xhc3QsIF9fbmV3X2ZpbmlzaCk7CisgICAgICAgIHRoaXMtPl9NX2NvbnN0cnVjdF9udWxsKF9fbmV3X2ZpbmlzaCk7CisgICAgICAgIHRoaXMtPl9NX2RlYWxsb2NhdGVfYmxvY2soKTsKKyAgICAgICAgdGhpcy0+X01fcmVzZXQoX19uZXdfc3RhcnQsIF9fbmV3X2ZpbmlzaCwgX19uZXdfc3RhcnQgKyBfX2xlbik7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgX1RyYWl0czo6YXNzaWduKCp0aGlzLT5fTV9maW5pc2gsICpfX2ZpcnN0KyspOworICAgICAgICB1bmluaXRpYWxpemVkX2NvcHkoX19maXJzdCwgX19sYXN0LCB0aGlzLT5fTV9GaW5pc2goKSArIDEpOworICAgICAgICB0aGlzLT5fTV9jb25zdHJ1Y3RfbnVsbCh0aGlzLT5fTV9GaW5pc2goKSArIF9fbik7CisgICAgICAgIHRoaXMtPl9NX2ZpbmlzaCArPSBfX247CisgICAgICB9CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfSW50ZWdlcj4KKyAgX1NlbGYmIF9NX2FwcGVuZF9kaXNwYXRjaChfSW50ZWdlciBfX24sIF9JbnRlZ2VyIF9feCwgY29uc3QgX190cnVlX3R5cGUmIC8qSW50ZWdyYWwqLykKKyAgeyByZXR1cm4gYXBwZW5kKChzaXplX3R5cGUpIF9fbiwgKF9DaGFyVCkgX194KTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgorICBfU2VsZiYgX01fYXBwZW5kX2Rpc3BhdGNoKF9JbnB1dEl0ZXIgX19mLCBfSW5wdXRJdGVyIF9fbCwgY29uc3QgX19mYWxzZV90eXBlJiAvKkludGVncmFsKi8pCisgIHsgcmV0dXJuIF9NX2FwcGVuZFQoX19mLCBfX2wsIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9fZiwgX0lucHV0SXRlcikpOyB9CisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXNzaWduCisgIF9TZWxmJiBhc3NpZ24oY29uc3QgX1NlbGYmIF9fcykgeworICAgIF9CYXNlOjphc3NpZ24oX19zKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBfU2VsZiYgYXNzaWduKGNvbnN0IF9TZWxmJiBfX3MsCisgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSB7CisgICAgX0Jhc2U6OmFzc2lnbihfX3MsIF9fcG9zLCBfX24pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIF9TZWxmJiBhc3NpZ24oY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX24pIHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKQorICAgIF9CYXNlOjphc3NpZ24oX19zLCBfX24pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIF9TZWxmJiBhc3NpZ24oY29uc3QgX0NoYXJUKiBfX3MpIHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKQorICAgIF9CYXNlOjphc3NpZ24oX19zKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBfU2VsZiYgYXNzaWduKHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MpIHsKKyAgICBfQmFzZTo6YXNzaWduKF9fbiwgX19jKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworcHJpdmF0ZTogICAgICAgICAgICAgICAgICAgICAgICAvLyBIZWxwZXIgZnVuY3Rpb25zIGZvciBhc3NpZ24uCisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2VyPgorICBfU2VsZiYgX01fYXNzaWduX2Rpc3BhdGNoKF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX194LCBjb25zdCBfX3RydWVfdHlwZSYgLypfSW50ZWdyYWwqLykKKyAgeyByZXR1cm4gYXNzaWduKChzaXplX3R5cGUpIF9fbiwgKF9DaGFyVCkgX194KTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgorICBfU2VsZiYgX01fYXNzaWduX2Rpc3BhdGNoKF9JbnB1dEl0ZXIgX19mLCBfSW5wdXRJdGVyIF9fbCwgY29uc3QgX19mYWxzZV90eXBlJiAvKl9JbnRlZ3JhbCovKSAgeworICAgIHBvaW50ZXIgX19jdXIgPSB0aGlzLT5fTV9TdGFydCgpOworICAgIHdoaWxlIChfX2YgIT0gX19sICYmIF9fY3VyICE9IHRoaXMtPl9NX0ZpbmlzaCgpKSB7CisgICAgICBfVHJhaXRzOjphc3NpZ24oKl9fY3VyLCAqX19mKTsKKyAgICAgICsrX19mOworICAgICAgKytfX2N1cjsKKyAgICB9CisgICAgaWYgKF9fZiA9PSBfX2wpCisgICAgICBfQmFzZTo6ZXJhc2UoX19jdXIsIHRoaXMtPl9NX0ZpbmlzaCgpKTsKKyAgICBlbHNlCisgICAgICBfTV9hcHBlbmRUKF9fZiwgX19sLCBfU1RMUF9JVEVSQVRPUl9DQVRFR09SWShfX2YsIF9JbnB1dEl0ZXIpKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworcHVibGljOgorICAvLyBDaGVjayB0byBzZWUgaWYgX0lucHV0SXRlcmF0b3IgaXMgYW4gaW50ZWdlciB0eXBlLiAgSWYgc28sIHRoZW4KKyAgLy8gaXQgY2FuJ3QgYmUgYW4gaXRlcmF0b3IuCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgorICBfU2VsZiYgYXNzaWduKF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QpIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0ludGVncmFsPF9JbnB1dEl0ZXI+OjpfUmV0IF9JbnRlZ3JhbDsKKyAgICByZXR1cm4gX01fYXNzaWduX2Rpc3BhdGNoKF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOworICB9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTUVUSE9EX1NQRUNJQUxJWkFUSU9OKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKKyAgLyogVGhpcyBtZXRob2QgaXMgbm90IHBhcnQgb2YgdGhlIHN0YW5kYXJkIGFuZCBpcyBhIHNwZWNpYWxpemF0aW9uIG9mIHRoZQorICAgKiB0ZW1wbGF0ZSBtZXRob2QgYXNzaWduLiBJdCBpcyBvbmx5IGdyYW50ZWQgZm9yIGNvbnZlbmllbmNlIHRvIGNhbGwgYXNzaWduCisgICAqIHdpdGggbWl4ZWQgcGFyYW1ldGVycyBpdGVyYXRvciBhbmQgY29uc3RfaXRlcmF0b3IuCisgICAqLworICBfU2VsZiYgYXNzaWduKGNvbnN0IF9DaGFyVCogX19mLCBjb25zdCBfQ2hhclQqIF9fbCkgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2YpX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fbCkKKyAgICBfQmFzZTo6YXNzaWduKF9fZiwgX19sKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyNlbmRpZgorCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluc2VydAorICBfU2VsZiYgaW5zZXJ0KHNpemVfdHlwZSBfX3BvcywgY29uc3QgX1NlbGYmIF9fcykgeworICAgIF9CYXNlOjppbnNlcnQoX19wb3MsIF9fcyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgX1NlbGYmIGluc2VydChzaXplX3R5cGUgX19wb3MsIGNvbnN0IF9TZWxmJiBfX3MsCisgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fYmVnLCBzaXplX3R5cGUgX19uKSB7CisgICAgX0Jhc2U6Omluc2VydChfX3BvcywgX19zLCBfX2JlZywgX19uKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgX1NlbGYmIGluc2VydChzaXplX3R5cGUgX19wb3MsIGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uKSB7CisgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKKyAgICBfQmFzZTo6aW5zZXJ0KF9fcG9zLCBfX3MsIF9fbik7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgX1NlbGYmIGluc2VydChzaXplX3R5cGUgX19wb3MsIGNvbnN0IF9DaGFyVCogX19zKSB7CisgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKKyAgICBfQmFzZTo6aW5zZXJ0KF9fcG9zLCBfX3MpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIF9TZWxmJiBpbnNlcnQoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jKSB7CisgICAgX0Jhc2U6Omluc2VydChfX3BvcywgX19uLCBfX2MpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBfX3AsIF9DaGFyVCBfX2MpCisgIHsgcmV0dXJuIF9CYXNlOjppbnNlcnQoX19wLCBfX2MpOyB9CisKKyAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wLCBzaXplX3QgX19uLCBfQ2hhclQgX19jKQorICB7IF9CYXNlOjppbnNlcnQoX19wLCBfX24sIF9fYyk7IH0KKworICAvLyBDaGVjayB0byBzZWUgaWYgX0lucHV0SXRlcmF0b3IgaXMgYW4gaW50ZWdlciB0eXBlLiAgSWYgc28sIHRoZW4KKyAgLy8gaXQgY2FuJ3QgYmUgYW4gaXRlcmF0b3IuCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgorICB2b2lkIGluc2VydChpdGVyYXRvciBfX3AsIF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QpIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0ludGVncmFsPF9JbnB1dEl0ZXI+OjpfUmV0IF9JbnRlZ3JhbDsKKyAgICBfTV9pbnNlcnRfZGlzcGF0Y2goX19wLCBfX2ZpcnN0LCBfX2xhc3QsIF9JbnRlZ3JhbCgpKTsKKyAgfQorCisjaWYgIWRlZmluZWQgKF9TVExQX05PX01FVEhPRF9TUEVDSUFMSVpBVElPTikKK3B1YmxpYzoKKyAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wLCBjb25zdCBfQ2hhclQqIF9fZiwgY29uc3QgX0NoYXJUKiBfX2wpIHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19mKSBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19sKQorICAgIF9NX2luc2VydChfX3AsIF9fZiwgX19sLCB0aGlzLT5fTV9pbnNpZGUoX19mKSk7CisgIH0KKyNlbmRpZgorCitwcml2YXRlOiAgLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgaW5zZXJ0LgorICB2b2lkIF9NX2luc2VydChpdGVyYXRvciBfX3AsIGNvbnN0IF9DaGFyVCogX19mLCBjb25zdCBfQ2hhclQqIF9fbCwgYm9vbCBfX3NlbGZfcmVmKSB7CisgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fZilfU1RMUF9GSVhfTElURVJBTF9CVUcoX19sKQorICAgIF9CYXNlOjpfTV9pbnNlcnQoX19wLCBfX2YsIF9fbCwgX19zZWxmX3JlZik7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyPgorICB2b2lkIF9NX2luc2VydF9vdmVyZmxvdyhpdGVyYXRvciBfX3BvcywgX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX24pIHsKKyAgICBzaXplX3R5cGUgX19sZW4gPSB0aGlzLT5fTV9jb21wdXRlX25leHRfc2l6ZShfX24pOworICAgIHBvaW50ZXIgX19uZXdfc3RhcnQgPSB0aGlzLT5fTV9zdGFydF9vZl9zdG9yYWdlLmFsbG9jYXRlKF9fbGVuLCBfX2xlbik7CisgICAgcG9pbnRlciBfX25ld19maW5pc2ggPSB1bmluaXRpYWxpemVkX2NvcHkodGhpcy0+X01fU3RhcnQoKSwgX19wb3MsIF9fbmV3X3N0YXJ0KTsKKyAgICBfX25ld19maW5pc2ggPSB1bmluaXRpYWxpemVkX2NvcHkoX19maXJzdCwgX19sYXN0LCBfX25ld19maW5pc2gpOworICAgIF9fbmV3X2ZpbmlzaCA9IHVuaW5pdGlhbGl6ZWRfY29weShfX3BvcywgdGhpcy0+X01fRmluaXNoKCksIF9fbmV3X2ZpbmlzaCk7CisgICAgdGhpcy0+X01fY29uc3RydWN0X251bGwoX19uZXdfZmluaXNoKTsKKyAgICB0aGlzLT5fTV9kZWFsbG9jYXRlX2Jsb2NrKCk7CisgICAgdGhpcy0+X01fcmVzZXQoX19uZXdfc3RhcnQsIF9fbmV3X2ZpbmlzaCwgX19uZXdfc3RhcnQgKyBfX2xlbik7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcj4KKyAgdm9pZCBfTV9pbnNlcnRUKGl0ZXJhdG9yIF9fcCwgX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0X2l0ZXJhdG9yX3RhZyAmKSB7CisgICAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KSB7CisgICAgICBfX3AgPSBpbnNlcnQoX19wLCAqX19maXJzdCk7CisgICAgICArK19fcDsKKyAgICB9CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyPgorICB2b2lkIF9NX2luc2VydFQoaXRlcmF0b3IgX19wb3MsIF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgY29uc3QgZm9yd2FyZF9pdGVyYXRvcl90YWcgJikgeworICAgIGlmIChfX2ZpcnN0ICE9IF9fbGFzdCkgeworICAgICAgc2l6ZV90eXBlIF9fbiA9IF9fU1RBVElDX0NBU1Qoc2l6ZV90eXBlLCBfU1RMUF9TVEQ6OmRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCkpOworICAgICAgaWYgKF9fbiA8IHRoaXMtPl9NX3Jlc3QoKSkgeworICAgICAgICBjb25zdCBzaXplX3R5cGUgX19lbGVtc19hZnRlciA9IHRoaXMtPl9NX2ZpbmlzaCAtIF9fcG9zOworICAgICAgICBpZiAoX19lbGVtc19hZnRlciA+PSBfX24pIHsKKyAgICAgICAgICB1bmluaXRpYWxpemVkX2NvcHkoKHRoaXMtPl9NX0ZpbmlzaCgpIC0gX19uKSArIDEsIHRoaXMtPl9NX0ZpbmlzaCgpICsgMSwgdGhpcy0+X01fRmluaXNoKCkgKyAxKTsKKyAgICAgICAgICB0aGlzLT5fTV9maW5pc2ggKz0gX19uOworICAgICAgICAgIF9UcmFpdHM6Om1vdmUoX19wb3MgKyBfX24sIF9fcG9zLCAoX19lbGVtc19hZnRlciAtIF9fbikgKyAxKTsKKyAgICAgICAgICBfTV9jb3B5VChfX2ZpcnN0LCBfX2xhc3QsIF9fcG9zKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICBwb2ludGVyIF9fb2xkX2ZpbmlzaCA9IHRoaXMtPl9NX0ZpbmlzaCgpOworICAgICAgICAgIF9Gb3J3YXJkSXRlciBfX21pZCA9IF9fZmlyc3Q7CisgICAgICAgICAgX1NUTFBfU1REOjphZHZhbmNlKF9fbWlkLCBfX2VsZW1zX2FmdGVyICsgMSk7CisgICAgICAgICAgX1NUTFBfU1REOjp1bmluaXRpYWxpemVkX2NvcHkoX19taWQsIF9fbGFzdCwgdGhpcy0+X01fRmluaXNoKCkgKyAxKTsKKyAgICAgICAgICB0aGlzLT5fTV9maW5pc2ggKz0gX19uIC0gX19lbGVtc19hZnRlcjsKKyAgICAgICAgICB1bmluaXRpYWxpemVkX2NvcHkoX19wb3MsIF9fb2xkX2ZpbmlzaCArIDEsIHRoaXMtPl9NX0ZpbmlzaCgpKTsKKyAgICAgICAgICB0aGlzLT5fTV9maW5pc2ggKz0gX19lbGVtc19hZnRlcjsKKyAgICAgICAgICBfTV9jb3B5VChfX2ZpcnN0LCBfX21pZCwgX19wb3MpOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgX01faW5zZXJ0X292ZXJmbG93KF9fcG9zLCBfX2ZpcnN0LCBfX2xhc3QsIF9fbik7CisgICAgICB9CisgICAgfQorICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2VyPgorICB2b2lkIF9NX2luc2VydF9kaXNwYXRjaChpdGVyYXRvciBfX3AsIF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX194LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX3RydWVfdHlwZSYgLypJbnRlZ3JhbCovKQorICB7IGluc2VydChfX3AsIChzaXplX3R5cGUpIF9fbiwgKF9DaGFyVCkgX194KTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgorICB2b2lkIF9NX2luc2VydF9kaXNwYXRjaChpdGVyYXRvciBfX3AsIF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypJbnRlZ3JhbCovKSB7CisgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcCkKKyAgICAvKiBXZSBhcmUgZm9yY2VkIHRvIGRvIGEgdGVtcG9yYXJ5IHN0cmluZyB0byBhdm9pZCB0aGUgc2VsZiByZWZlcmVuY2luZyBpc3N1ZS4gKi8KKyAgICBjb25zdCBfU2VsZiBfX3NlbGYoX19maXJzdCwgX19sYXN0LCB0aGlzLT5nZXRfYWxsb2NhdG9yKCkpOworICAgIF9NX2luc2VydFQoX19wLCBfX3NlbGYuYmVnaW4oKSwgX19zZWxmLmVuZCgpLCBfU1RMUF9JVEVSQVRPUl9DQVRFR09SWShfX2ZpcnN0LCBfSW5wdXRJdGVyKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZvaWQgX01fY29weVQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LCBwb2ludGVyIF9fcmVzdWx0KSB7CisgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcCkKKyAgICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QsICsrX19yZXN1bHQpCisgICAgICBfVHJhaXRzOjphc3NpZ24oKl9fcmVzdWx0LCAqX19maXJzdCk7CisgIH0KKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19NRVRIT0RfU1BFQ0lBTElaQVRJT04pCisgIHZvaWQgX01fY29weVQoY29uc3QgX0NoYXJUKiBfX2YsIGNvbnN0IF9DaGFyVCogX19sLCBfQ2hhclQqIF9fcmVzKSB7CisgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fZikgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fbCkgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcmVzKQorICAgIF9CYXNlOjpfTV9jb3B5KF9fZiwgX19sLCBfX3Jlcyk7CisgIH0KKyNlbmRpZgorCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVyYXNlLgorICBfU2VsZiYgZXJhc2Uoc2l6ZV90eXBlIF9fcG9zID0gMCwgc2l6ZV90eXBlIF9fbiA9IG5wb3MpIHsKKyAgICBfQmFzZTo6ZXJhc2UoX19wb3MsIF9fbik7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgaXRlcmF0b3IgZXJhc2UoaXRlcmF0b3IgX19wb3MpIHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19wb3MpCisgICAgcmV0dXJuIF9CYXNlOjplcmFzZShfX3Bvcyk7CisgIH0KKworICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpIHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19maXJzdCkgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fbGFzdCkKKyAgICByZXR1cm4gX0Jhc2U6OmVyYXNlKF9fZmlyc3QsIF9fbGFzdCk7CisgIH0KKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXBsYWNlLiAgKENvbmNlcHR1YWxseSBlcXVpdmFsZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGVyYXNlIGZvbGxvd2VkIGJ5IGluc2VydC4pCisgIF9TZWxmJiByZXBsYWNlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbiwgY29uc3QgX1NlbGYmIF9fcykgeworICAgIF9CYXNlOjpyZXBsYWNlKF9fcG9zLCBfX24sIF9fcyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgX1NlbGYmIHJlcGxhY2Uoc2l6ZV90eXBlIF9fcG9zMSwgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IF9TZWxmJiBfX3MsCisgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX3BvczIsIHNpemVfdHlwZSBfX24yKSB7CisgICAgX0Jhc2U6OnJlcGxhY2UoX19wb3MxLCBfX24xLCBfX3MsIF9fcG9zMiwgX19uMik7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgX1NlbGYmIHJlcGxhY2Uoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uMSwKKyAgICAgICAgICAgICAgICAgY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX24yKSB7CisgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKKyAgICBfQmFzZTo6cmVwbGFjZShfX3BvcywgX19uMSwgX19zLCBfX24yKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBfU2VsZiYgcmVwbGFjZShzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24xLCBjb25zdCBfQ2hhclQqIF9fcykgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgICAgX0Jhc2U6OnJlcGxhY2UoX19wb3MsIF9fbjEsIF9fcyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgX1NlbGYmIHJlcGxhY2Uoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uMSwKKyAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbjIsIF9DaGFyVCBfX2MpIHsKKyAgICBfQmFzZTo6cmVwbGFjZShfX3BvcywgX19uMSwgX19uMiwgX19jKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBfU2VsZiYgcmVwbGFjZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QsIGNvbnN0IF9TZWxmJiBfX3MpIHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19maXJzdCkgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fbGFzdCkKKyAgICBfQmFzZTo6cmVwbGFjZShfX2ZpcnN0LCBfX2xhc3QsIF9fcyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgX1NlbGYmIHJlcGxhY2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICBjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbikgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2ZpcnN0KSBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19sYXN0KQorICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgICAgX0Jhc2U6OnJlcGxhY2UoX19maXJzdCwgX19sYXN0LCBfX3MsIF9fbik7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgX1NlbGYmIHJlcGxhY2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICBjb25zdCBfQ2hhclQqIF9fcykgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2ZpcnN0KSBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19sYXN0KQorICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgICAgX0Jhc2U6OnJlcGxhY2UoX19maXJzdCwgX19sYXN0LCBfX3MpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIF9TZWxmJiByZXBsYWNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYykgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2ZpcnN0KSBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19sYXN0KQorICAgIF9CYXNlOjpyZXBsYWNlKF9fZmlyc3QsIF9fbGFzdCwgX19uLCBfX2MpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vIENoZWNrIHRvIHNlZSBpZiBfSW5wdXRJdGVyIGlzIGFuIGludGVnZXIgdHlwZS4gIElmIHNvLCB0aGVuCisgIC8vIGl0IGNhbid0IGJlIGFuIGl0ZXJhdG9yLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcj4KKyAgX1NlbGYmIHJlcGxhY2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyIF9fZiwgX0lucHV0SXRlciBfX2wpIHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19maXJzdClfU1RMUF9GSVhfTElURVJBTF9CVUcoX19sYXN0KQorICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lzSW50ZWdyYWw8X0lucHV0SXRlcj46Ol9SZXQgX0ludGVncmFsOworICAgIHJldHVybiBfTV9yZXBsYWNlX2Rpc3BhdGNoKF9fZmlyc3QsIF9fbGFzdCwgX19mLCBfX2wsIF9JbnRlZ3JhbCgpKTsKKyAgfQorCisjaWYgIWRlZmluZWQgKF9TVExQX05PX01FVEhPRF9TUEVDSUFMSVpBVElPTikKKyAgX1NlbGYmIHJlcGxhY2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICBjb25zdCBfQ2hhclQqIF9fZiwgY29uc3QgX0NoYXJUKiBfX2wpIHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19maXJzdCkgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fbGFzdCkKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19mKSBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19sKQorICAgIHJldHVybiBfTV9yZXBsYWNlKF9fZmlyc3QsIF9fbGFzdCwgX19mLCBfX2wsIHRoaXMtPl9NX2luc2lkZShfX2YpKTsKKyAgfQorI2VuZGlmCisKK3ByaXZhdGU6ICAgICAgICAgICAgICAgICAgICAgICAgLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgcmVwbGFjZS4KKyAgX1NlbGYmIF9NX3JlcGxhY2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBfQ2hhclQqIF9fZiwgY29uc3QgX0NoYXJUKiBfX2wsIGJvb2wgX19zZWxmX3JlZikgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2ZpcnN0KSBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19sYXN0KQorICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2YpIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2wpCisgICAgX0Jhc2U6Ol9NX3JlcGxhY2UoX19maXJzdCwgX19sYXN0LCBfX2YsIF9fbCwgX19zZWxmX3JlZik7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2VyPgorICBfU2VsZiYgX01fcmVwbGFjZV9kaXNwYXRjaChpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX194LCBjb25zdCBfX3RydWVfdHlwZSYgLypJc0ludGVncmFsKi8pIHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19maXJzdCkgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fbGFzdCkKKyAgICByZXR1cm4gcmVwbGFjZShfX2ZpcnN0LCBfX2xhc3QsIChzaXplX3R5cGUpIF9fbiwgKF9DaGFyVCkgX194KTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgorICBfU2VsZiYgX01fcmVwbGFjZV9kaXNwYXRjaChpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIgX19mLCBfSW5wdXRJdGVyIF9fbCwgY29uc3QgX19mYWxzZV90eXBlJiAvKklzSW50ZWdyYWwqLykgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2ZpcnN0KSBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19sYXN0KQorICAgIC8qIFdlIGFyZSBmb3JjZWQgdG8gZG8gYSB0ZW1wb3Jhcnkgc3RyaW5nIHRvIGF2b2lkIHRoZSBzZWxmIHJlZmVyZW5jaW5nIGlzc3VlLiAqLworICAgIGNvbnN0IF9TZWxmIF9fc2VsZihfX2YsIF9fbCwgdGhpcy0+Z2V0X2FsbG9jYXRvcigpKTsKKyAgICByZXR1cm4gX01fcmVwbGFjZShfX2ZpcnN0LCBfX2xhc3QsIF9fc2VsZi5fTV9TdGFydCgpLCBfX3NlbGYuX01fRmluaXNoKCksIGZhbHNlKTsKKyAgfQorCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE90aGVyIG1vZGlmaWVyIG1lbWJlciBmdW5jdGlvbnMuCisgIHZvaWQgc3dhcChfU2VsZiYgX19zKSB7IF9CYXNlOjpzd2FwKF9fcyk7IH0KKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUEFSVElBTF9TUEVDX1dPUktBUk9VTkQpICYmICFkZWZpbmVkIChfU1RMUF9GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIpCisgIHZvaWQgX01fc3dhcF93b3JrYXJvdW5kKF9TZWxmJiBfX3gpIHsgc3dhcChfX3gpOyB9CisjZW5kaWYKKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdWJzdHJpbmcuCisgIF9TZWxmIHN1YnN0cihzaXplX3R5cGUgX19wb3MgPSAwLCBzaXplX3R5cGUgX19uID0gbnBvcykgY29uc3QKKyAgeyByZXR1cm4gX1NlbGYoKnRoaXMsIF9fcG9zLCBfX24sIHRoaXMtPmdldF9hbGxvY2F0b3IoKSk7IH0KKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9URU1QTEFURV9FWFBSRVNTSU9OKSAmJiAhZGVmaW5lZCAoX1NUTFBfREVCVUcpCisjICBkZWZpbmUgX1NUTFBfU1RSSU5HX1NVTV9CQVNFIF9TVExQX05PX01FTV9UX1NUUklOR19CQVNFCisjICBpbmNsdWRlIDxzdGwvX3N0cmluZ19zdW1fbWV0aG9kcy5oPgorIyAgdW5kZWYgX1NUTFBfU1RSSU5HX1NVTV9CQVNFCisjZW5kaWYKK307CisKKyN1bmRlZiBfU1RMUF9OT19NRU1fVF9TVFJJTkdfQkFTRQorCisjaWYgZGVmaW5lZCAoYmFzaWNfc3RyaW5nKQorX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisjICB1bmRlZiBiYXNpY19zdHJpbmcKKyNlbmRpZgorCitfU1RMUF9FTkRfTkFNRVNQQUNFCmRpZmYgLS1naXQgYS9zdGwvX3N0cnN0cmVhbS5oIGIvc3RscG9ydC9zdGwvX3N0cnN0cmVhbS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzdGwvX3N0cnN0cmVhbS5oCnJlbmFtZSB0byBzdGxwb3J0L3N0bC9fc3Ryc3RyZWFtLmgKZGlmZiAtLWdpdCBhL3N0bC9fdGVtcGJ1Zi5jIGIvc3RscG9ydC9zdGwvX3RlbXBidWYuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3RsL190ZW1wYnVmLmMKcmVuYW1lIHRvIHN0bHBvcnQvc3RsL190ZW1wYnVmLmMKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL190ZW1wYnVmLmggYi9zdGxwb3J0L3N0bC9fdGVtcGJ1Zi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMGE3NDcKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9fdGVtcGJ1Zi5oCkBAIC0wLDAgKzEsMTY3IEBACisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworLyogTk9URTogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgU1RMIGhlYWRlcnMuCisgKiAgIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LgorICovCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfVEVNUEJVRl9ICisjZGVmaW5lIF9TVExQX0lOVEVSTkFMX1RFTVBCVUZfSAorCisjaWZuZGVmIF9TVExQX0NMSU1JVFMKKyMgIGluY2x1ZGUgPGNsaW1pdHM+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DU1RETElCCisjICBpbmNsdWRlIDxzdGwvX2NzdGRsaWIuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX1VOSU5JVElBTElaRURfSAorIyAgaW5jbHVkZSA8c3RsL191bmluaXRpYWxpemVkLmg+CisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitwYWlyPF9UcCosIHB0cmRpZmZfdD4gIF9TVExQX0NBTEwKK19fZ2V0X3RlbXBvcmFyeV9idWZmZXIocHRyZGlmZl90IF9fbGVuLCBfVHAqKTsKKworI2lmbmRlZiBfU1RMUF9OT19FWFBMSUNJVF9GVU5DVElPTl9UTVBMX0FSR1MKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBwYWlyPF9UcCosIHB0cmRpZmZfdD4gIF9TVExQX0NBTEwgZ2V0X3RlbXBvcmFyeV9idWZmZXIocHRyZGlmZl90IF9fbGVuKSB7CisgIHJldHVybiBfX2dldF90ZW1wb3JhcnlfYnVmZmVyKF9fbGVuLCAoX1RwKikgMCk7Cit9CisKKyMgaWYgISBkZWZpbmVkKF9TVExQX05PX0VYVEVOU0lPTlMpCisvLyBUaGlzIG92ZXJsb2FkIGlzIG5vdCByZXF1aXJlZCBieSB0aGUgc3RhbmRhcmQ7IGl0IGlzIGFuIGV4dGVuc2lvbi4KKy8vIEl0IGlzIHN1cHBvcnRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBIUCBTVEwsIGFuZAorLy8gYmVjYXVzZSBub3QgYWxsIGNvbXBpbGVycyBzdXBwb3J0IHRoZSBsYW5ndWFnZSBmZWF0dXJlIChleHBsaWNpdAorLy8gZnVuY3Rpb24gdGVtcGxhdGUgYXJndW1lbnRzKSB0aGF0IGlzIHJlcXVpcmVkIGZvciB0aGUgc3RhbmRhcmQKKy8vIHZlcnNpb24gb2YgZ2V0X3RlbXBvcmFyeV9idWZmZXIuCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIHBhaXI8X1RwKiwgcHRyZGlmZl90PiAgX1NUTFBfQ0FMTAorZ2V0X3RlbXBvcmFyeV9idWZmZXIocHRyZGlmZl90IF9fbGVuLCBfVHAqKSB7CisgIHJldHVybiBfX2dldF90ZW1wb3JhcnlfYnVmZmVyKF9fbGVuLCAoX1RwKikgMCk7Cit9CisjIGVuZGlmCisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSB2b2lkICBfU1RMUF9DQUxMIHJldHVybl90ZW1wb3JhcnlfYnVmZmVyKF9UcCogX19wKSB7CisvLyBTdW5Qcm8gYnJhaW4gZGFtYWdlCisgIGZyZWUoKGNoYXIqKV9fcCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yLCBjbGFzcyBfVHA+CitjbGFzcyBfVGVtcG9yYXJ5X2J1ZmZlciB7Citwcml2YXRlOgorICBwdHJkaWZmX3QgIF9NX29yaWdpbmFsX2xlbjsKKyAgcHRyZGlmZl90ICBfTV9sZW47CisgIF9UcCogICAgICAgX01fYnVmZmVyOworCisgIHZvaWQgX01fYWxsb2NhdGVfYnVmZmVyKCkgeworICAgIF9NX29yaWdpbmFsX2xlbiA9IF9NX2xlbjsKKyAgICBfTV9idWZmZXIgPSAwOworCisgICAgaWYgKF9NX2xlbiA+IChwdHJkaWZmX3QpKElOVF9NQVggLyBzaXplb2YoX1RwKSkpCisgICAgICBfTV9sZW4gPSBJTlRfTUFYIC8gc2l6ZW9mKF9UcCk7CisKKyAgICB3aGlsZSAoX01fbGVuID4gMCkgeworICAgICAgX01fYnVmZmVyID0gKF9UcCopIG1hbGxvYyhfTV9sZW4gKiBzaXplb2YoX1RwKSk7CisgICAgICBpZiAoX01fYnVmZmVyKQorICAgICAgICBicmVhazsKKyAgICAgIF9NX2xlbiAvPSAyOworICAgIH0KKyAgfQorCisgIHZvaWQgX01faW5pdGlhbGl6ZV9idWZmZXIoY29uc3QgX1RwJiwgY29uc3QgX190cnVlX3R5cGUmKSB7fQorICB2b2lkIF9NX2luaXRpYWxpemVfYnVmZmVyKGNvbnN0IF9UcCYgdmFsLCBjb25zdCBfX2ZhbHNlX3R5cGUmKSB7CisgICAgdW5pbml0aWFsaXplZF9maWxsX24oX01fYnVmZmVyLCBfTV9sZW4sIHZhbCk7CisgIH0KKworcHVibGljOgorICBwdHJkaWZmX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX2xlbjsgfQorICBwdHJkaWZmX3QgcmVxdWVzdGVkX3NpemUoKSBjb25zdCB7IHJldHVybiBfTV9vcmlnaW5hbF9sZW47IH0KKyAgX1RwKiBiZWdpbigpIHsgcmV0dXJuIF9NX2J1ZmZlcjsgfQorICBfVHAqIGVuZCgpIHsgcmV0dXJuIF9NX2J1ZmZlciArIF9NX2xlbjsgfQorCisgIF9UZW1wb3JhcnlfYnVmZmVyKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpIHsKKyAgICAvLyBXb3JrYXJvdW5kIGZvciBhIF9fdHlwZV90cmFpdHMgYnVnIGluIHRoZSBwcmUtNy4zIGNvbXBpbGVyLgorIyAgIGlmIGRlZmluZWQoX19zZ2kpICYmICFkZWZpbmVkKF9fR05VQ19fKSAmJiBfQ09NUElMRVJfVkVSU0lPTiA8IDczMAorICAgIHR5cGVkZWYgdHlwZW5hbWUgX190eXBlX3RyYWl0czxfVHA+Ojppc19QT0RfdHlwZSBfVHJpdmlhbDsKKyMgICBlbHNlCisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3R5cGVfdHJhaXRzPF9UcD46Omhhc190cml2aWFsX2RlZmF1bHRfY29uc3RydWN0b3IgIF9Ucml2aWFsOworIyAgIGVuZGlmCisgICAgX1NUTFBfVFJZIHsKKyAgICAgIF9NX2xlbiA9IF9TVExQX1NURDo6ZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KTsKKyAgICAgIF9NX2FsbG9jYXRlX2J1ZmZlcigpOworICAgICAgaWYgKF9NX2xlbiA+IDApCisgICAgICAgIF9NX2luaXRpYWxpemVfYnVmZmVyKCpfX2ZpcnN0LCBfVHJpdmlhbCgpKTsKKyAgICB9CisgICAgX1NUTFBfVU5XSU5EKGZyZWUoX01fYnVmZmVyKTsgX01fYnVmZmVyID0gMDsgX01fbGVuID0gMCkKKyAgfQorCisgIH5fVGVtcG9yYXJ5X2J1ZmZlcigpIHsKKyAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95X1JhbmdlKF9NX2J1ZmZlciwgX01fYnVmZmVyICsgX01fbGVuKTsKKyAgICBmcmVlKF9NX2J1ZmZlcik7CisgIH0KKworcHJpdmF0ZToKKyAgLy8gRGlzYWJsZSBjb3B5IGNvbnN0cnVjdG9yIGFuZCBhc3NpZ25tZW50IG9wZXJhdG9yLgorICBfVGVtcG9yYXJ5X2J1ZmZlcihjb25zdCBfVGVtcG9yYXJ5X2J1ZmZlcjxfRm9yd2FyZEl0ZXJhdG9yLCBfVHA+Jikge30KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgX1RlbXBvcmFyeV9idWZmZXI8X0ZvcndhcmRJdGVyYXRvciwgX1RwPiYpIHt9Cit9OworCisjIGlmbmRlZiBfU1RMUF9OT19FWFRFTlNJT05TCisKKy8vIENsYXNzIHRlbXBvcmFyeV9idWZmZXIgaXMgbm90IHBhcnQgb2YgdGhlIHN0YW5kYXJkLiAgSXQgaXMgYW4gZXh0ZW5zaW9uLgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvciwKKyAgICAgICAgICBjbGFzcyBfVHAKKyNpZmRlZiBfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OCisgICAgICAgICAgICAgICAgICAgID0gdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlCisjZW5kaWYgLyogX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTiAqLworICAgICAgICAgPgorc3RydWN0IHRlbXBvcmFyeV9idWZmZXIgOiBwdWJsaWMgX1RlbXBvcmFyeV9idWZmZXI8X0ZvcndhcmRJdGVyYXRvciwgX1RwPgoreworICB0ZW1wb3JhcnlfYnVmZmVyKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpCisgICAgOiBfVGVtcG9yYXJ5X2J1ZmZlcjxfRm9yd2FyZEl0ZXJhdG9yLCBfVHA+KF9fZmlyc3QsIF9fbGFzdCkge30KKyAgfnRlbXBvcmFyeV9idWZmZXIoKSB7fQorfTsKKworIyBlbmRpZiAvKiBfU1RMUF9OT19FWFRFTlNJT05TICovCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworIyBpZm5kZWYgX1NUTFBfTElOS19USU1FX0lOU1RBTlRJQVRJT04KKyMgIGluY2x1ZGUgPHN0bC9fdGVtcGJ1Zi5jPgorIyBlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfVEVNUEJVRl9IICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9fdGhyZWFkcy5jIGIvc3RscG9ydC9zdGwvX3RocmVhZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTNjMGI5Ci0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvX3RocmVhZHMuYwpAQCAtMCwwICsxLDE2NyBAQAorLyoKKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworI2lmbmRlZiBfU1RMUF9USFJFQURTX0MKKyNkZWZpbmUgX1NUTFBfVEhSRUFEU19DCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfVEhSRUFEU19ICisjICBpbmNsdWRlIDxzdGwvX3RocmVhZHMuaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfRVhQT1NFX0dMT0JBTFNfSU1QTEVNRU5UQVRJT04pCisKKyNpZiBkZWZpbmVkIChfU1RMUF9TR0lfVEhSRUFEUykKKyMgIGluY2x1ZGUgPHRpbWUuaD4KKyNlbGlmIGRlZmluZWQgKF9TVExQX1VOSVgpCisjICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1RJTUUKKyMgICAgaW5jbHVkZSA8c3RsL19jdGltZS5oPgorIyAgZW5kaWYKKyMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9OQU1FU1BBQ0VTKSAmJiAhZGVmaW5lZCAoX1NUTFBfVkVORE9SX0dMT0JBTF9DU1REKQordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnRpbWVfdDsKKyMgIGVuZGlmCisjICBpbmNsdWRlIDxzeXMvdGltZS5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX0FUT01JQ19TV0FQX01VVEVYKQordGVtcGxhdGU8aW50IF9fMzJiaXRzPgorX1NUTFBfU1RBVElDX01VVEVYCitfQXRvbWljX3N3YXBfc3RydWN0PF9fMzJiaXRzPjo6X1Nfc3dhcF9sb2NrIF9TVExQX01VVEVYX0lOSVRJQUxJWkVSOworIyAgdW5kZWYgX1NUTFBfVVNFX0FUT01JQ19TV0FQX01VVEVYCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX1RIUkVBRFMpICYmICFkZWZpbmVkIChfU1RMUF9VU0VfUFRIUkVBRF9TUElOTE9DSykKK3RlbXBsYXRlIDxpbnQgX19pbnN0PgordW5zaWduZWQgX1NUTFBfbXV0ZXhfc3BpbjxfX2luc3Q+OjpfX21heCA9IF9TVExQX211dGV4X3NwaW48X19pbnN0Pjo6X19sb3dfbWF4OworCit0ZW1wbGF0ZSA8aW50IF9faW5zdD4KK3Vuc2lnbmVkIF9TVExQX211dGV4X3NwaW48X19pbnN0Pjo6X19sYXN0ID0gMDsKKyNlbmRpZiAvLyBfU1RMUF9VU0VfUFRIUkVBRF9TUElOTE9DSworCisjaWYgZGVmaW5lZCAoX1NUTFBfVEhSRUFEUykgJiYgIWRlZmluZWQgKF9TVExQX1VTRV9QVEhSRUFEX1NQSU5MT0NLKQorCisjICBpZiBkZWZpbmVkIChfU1RMUF9TUEFSQ19TT0xBUklTX1RIUkVBRFMpCisvLyB1bmRlcmdyb3VuZCBmdW5jdGlvbiBpbiBsaWJjLnNvOyB3ZSBkbyBub3Qgd2FudCBkZXBlbmRhbmNlIG9uIGxpYnJ0CitleHRlcm4gIkMiIGludCBfX25hbm9zbGVlcChjb25zdCBzdHJ1Y3QgdGltZXNwZWMqLCBzdHJ1Y3QgdGltZXNwZWMqKTsKKyMgICAgZGVmaW5lIF9TVExQX05BTk9TTEVFUCBfX25hbm9zbGVlcAorIyAgZWxzZQorIyAgICBkZWZpbmUgX1NUTFBfTkFOT1NMRUVQIG5hbm9zbGVlcAorIyAgZW5kaWYKKwordGVtcGxhdGUgPGludCBfX2luc3Q+Cit2b2lkIF9TVExQX0NBTEwKK19TVExQX211dGV4X3NwaW48X19pbnN0Pjo6X1NfbnNlY19zbGVlcChpbnQgX19sb2dfbnNlYywgdW5zaWduZWQgaW50JiBfX2l0ZXJhdGlvbikgeworIyAgaWYgZGVmaW5lZCAoX1NUTFBfV0lOMzJUSFJFQURTKQorIyAgICBpZiBkZWZpbmVkIChfV0lOMzJfV0lOTlQpICYmIChfV0lOMzJfV0lOTlQgPj0gMHgwNDAwKQorICBpZiAoX19pdGVyYXRpb24gPD0gNDAwMCkgeworICAgIC8vIFVzZSBTd2l0Y2hUb1RocmVhZCBiZWNhdXNlIAorICAgIC8vIDEpIFNsZWVwKDEpIG9mdGVuIHRha2VzIH4xNSBtcworICAgIC8vIDIpIFN3aXRjaFRvVGhyZWFkIHlpZWxkcyB0byBsb3dlci1wcmlvcml0eSB0aHJlYWRzCisgICAgLy8gNDAwMCBpcyBlbm91Z2ggdG8gYXZvaWQgU2xlZXAgYW5kIGlzIHVzZWQganVzdCB0byBwcmV2ZW50IGluZmluaXRlIGxvb3BpbmcKKyAgICAvLyBUaGlzIG51bWJlciBpcyBhZHZpc2VkIHNwaW4gY291bnQgZm9yIEhlYXAgbWFuYWdlbWVudCBieSBNaWNyb3NvZnQKKyAgICAgU3dpdGNoVG9UaHJlYWQoKTsgCisgIH0gZWxzZSB7CisjICAgIGVuZGlmCisgICAgaWYgKF9fbG9nX25zZWMgPD0gMjEpIHsKKyAgICAgIC8qIE5vdGUgZnJvbSBib29zdCAod3d3LmJvb3N0Lm9yZyk6CisgICAgICAgKiBDaGFuZ2VkIGZyb20gU2xlZXAoMCkgdG8gU2xlZXAoMSkuCisgICAgICAgKiBBY2NvcmRpbmcgdG8gTVNETiwgU2xlZXAoMCkgd2lsbCBuZXZlciB5aWVsZCB0byBhIGxvd2VyLXByaW9yaXR5IHRocmVhZCwKKyAgICAgICAqIHdoZXJlYXMgU2xlZXAoMSkgd2lsbC4gUGVyZm9ybWFuY2Ugc2VlbXMgbm90IHRvIGJlIGFmZmVjdGVkLiAqLworICAgICAgU2xlZXAoMSk7CisgICAgfSBlbHNlIHsKKyAgICAgIFNsZWVwKDEgPDwgKF9fbG9nX25zZWMgLSAyMCkpOworICAgIH0KKyMgICAgaWYgZGVmaW5lZCAoX1dJTjMyX1dJTk5UKSAmJiAoX1dJTjMyX1dJTk5UID49IDB4MDQwMCkKKyAgICBfX2l0ZXJhdGlvbiA9IDA7IC8vcmVzZXQgdG8gYXZvaWQgc2xlZXBzIHNlcXVlbmNlCisgIH0KKyMgICAgZW5kaWYKKyMgIGVsaWYgZGVmaW5lZChfU1RMUF9PUzJUSFJFQURTKQorICBpZiAoX19sb2dfbnNlYyA8PSAyMCkgeworICAgIERvc1NsZWVwKDApOworICB9IGVsc2UgeworICAgIERvc1NsZWVwKDEgPDwgKF9fbG9nX25zZWMgLSAyMCkpOworICB9CisjICBlbGlmIGRlZmluZWQgKF9TVExQX1VOSVgpCisgIHRpbWVzcGVjIF9fdHM7CisgIC8qIE1heCBzbGVlcCBpcyAyKioyN25zZWMgfiA2MG1zZWMgICAgICAqLworICBfX3RzLnR2X3NlYyA9IDA7CisgIF9fdHMudHZfbnNlYyA9IDEgPDwgX19sb2dfbnNlYzsKKyAgX1NUTFBfTkFOT1NMRUVQKCZfX3RzLCAwKTsKKyMgIGVuZGlmCit9CisKK3RlbXBsYXRlIDxpbnQgX19pbnN0Pgordm9pZCAgX1NUTFBfQ0FMTAorX1NUTFBfbXV0ZXhfc3BpbjxfX2luc3Q+OjpfTV9kb19sb2NrKHZvbGF0aWxlIF9fc3RsX2F0b21pY190KiBfX2xvY2spIHsKKyMgIGlmIGRlZmluZWQoX1NUTFBfQVRPTUlDX0VYQ0hBTkdFKQorICBpZiAoX0F0b21pY19zd2FwKF9fbG9jaywgMSkpIHsKKyAgICB1bnNpZ25lZCBfX215X3NwaW5fbWF4ID0gX1NUTFBfbXV0ZXhfc3BpbjwwPjo6X19tYXg7CisgICAgdW5zaWduZWQgX19teV9sYXN0X3NwaW5zID0gX1NUTFBfbXV0ZXhfc3BpbjwwPjo6X19sYXN0OworICAgIHZvbGF0aWxlIHVuc2lnbmVkIF9fanVuayA9IDE3OyAgIC8vIFZhbHVlIGRvZXNuJ3QgbWF0dGVyLgorICAgIHVuc2lnbmVkICBfX2k7CisKKyAgICBmb3IgKF9faSA9IDA7IF9faSA8IF9fbXlfc3Bpbl9tYXg7ICsrX19pKSB7CisgICAgICBpZiAoX19pIDwgX19teV9sYXN0X3NwaW5zLzIgfHwgKl9fbG9jaykgeworICAgICAgICBfX2p1bmsgKj0gX19qdW5rOyBfX2p1bmsgKj0gX19qdW5rOworICAgICAgICBfX2p1bmsgKj0gX19qdW5rOyBfX2p1bmsgKj0gX19qdW5rOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFfQXRvbWljX3N3YXAoX19sb2NrLCAxKSkgeworICAgICAgICAgIC8vIGdvdCBpdCEKKyAgICAgICAgICAvLyBTcGlubmluZyB3b3JrZWQuICBUaHVzIHdlJ3JlIHByb2JhYmx5IG5vdCBiZWluZyBzY2hlZHVsZWQKKyAgICAgICAgICAvLyBhZ2FpbnN0IHRoZSBvdGhlciBwcm9jZXNzIHdpdGggd2hpY2ggd2Ugd2VyZSBjb250ZW5kaW5nLgorICAgICAgICAgIC8vIFRodXMgaXQgbWFrZXMgc2Vuc2UgdG8gc3BpbiBsb25nZXIgdGhlIG5leHQgdGltZS4KKyAgICAgICAgICBfU1RMUF9tdXRleF9zcGluPDA+OjpfX2xhc3QgPSBfX2k7CisgICAgICAgICAgX1NUTFBfbXV0ZXhfc3BpbjwwPjo6X19tYXggPSBfU1RMUF9tdXRleF9zcGluPDA+OjpfX2hpZ2hfbWF4OworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8vIFdlIGFyZSBwcm9iYWJseSBiZWluZyBzY2hlZHVsZWQgYWdhaW5zdCB0aGUgb3RoZXIgcHJvY2Vzcy4gIFNsZWVwLgorICAgIF9TVExQX211dGV4X3NwaW48MD46Ol9fbWF4ID0gX1NUTFBfbXV0ZXhfc3BpbjwwPjo6X19sb3dfbWF4OworCisgICAgZm9yIChfX2kgPSAwIDs7ICsrX19pKSB7CisgICAgICBpbnQgX19sb2dfbnNlYyA9IF9faSArIDY7CisKKyAgICAgIGlmIChfX2xvZ19uc2VjID4gMjcpIF9fbG9nX25zZWMgPSAyNzsKKyAgICAgIGlmICghX0F0b21pY19zd2FwKF9fbG9jaywgMSkpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBfU19uc2VjX3NsZWVwKF9fbG9nX25zZWMsIF9faSk7CisgICAgfQorICB9IC8qIGZpcnN0IF9BdG9taWNfc3dhcCAqLworIyAgZW5kaWYKK30KKyNlbmRpZiAvLyBfU1RMUF9VU0VfUFRIUkVBRF9TUElOTE9DSworCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNlbmRpZiAvKiBfU1RMUF9FWFBPU0VfR0xPQkFMU19JTVBMRU1FTlRBVElPTiAqLworI2VuZGlmIC8qICBfU1RMUF9USFJFQURTX0MgKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL190aHJlYWRzLmggYi9zdGxwb3J0L3N0bC9fdGhyZWFkcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMzgxZDgKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9fdGhyZWFkcy5oCkBAIC0wLDAgKzEsNjg3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk3LTE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKy8vIFdBUk5JTkc6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIEMrKworLy8gc3RhbmRhcmQgbGlicmFyeSBoZWFkZXJzLiAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgdGhpcyBoZWFkZXIKKy8vIGZpbGUgZGlyZWN0bHkuCisKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9USFJFQURTX0gKKyNkZWZpbmUgX1NUTFBfSU5URVJOQUxfVEhSRUFEU19ICisKKy8vIFN1cHBvcnRlZCB0aHJlYWRpbmcgbW9kZWxzIGFyZSBuYXRpdmUgU0dJLCBwdGhyZWFkcywgdWl0aHJlYWRzCisvLyAoc2ltaWxhciB0byBwdGhyZWFkcywgYnV0IGJhc2VkIG9uIGFuIGVhcmxpZXIgZHJhZnQgb2YgdGhlIFBvc2l4CisvLyB0aHJlYWRzIHN0YW5kYXJkKSwgYW5kIFdpbjMyIHRocmVhZHMuICBVaXRocmVhZCBzdXBwb3J0IGJ5IEpvY2hlbgorLy8gU2NobGljaywgMTk5OSwgYW5kIFNvbGFyaXMgdGhyZWFkcyBnZW5lcmFsaXplZCB0byB0aGVtLgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NTVERERUYKKyMgIGluY2x1ZGUgPHN0bC9fY3N0ZGRlZi5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1NURExJQgorIyAgaW5jbHVkZSA8c3RsL19jc3RkbGliLmg+CisjZW5kaWYKKworLy8gT24gU1VOIGFuZCBNYWMgT1MgWCBnY2MsIHplcm8taW5pdGlhbGl6YXRpb24gd29ya3MganVzdCBmaW5lLi4uCisjaWYgZGVmaW5lZCAoX19zdW4pIHx8IChkZWZpbmVkIChfX0dOVUNfXykgJiYgZGVmaW5lZChfX0FQUExFX18pKQorIyAgZGVmaW5lIF9TVExQX01VVEVYX0lOSVRJQUxJWkVSCisjZW5kaWYKKworLyogVGhpcyBoZWFkZXIgZGVmaW5lcyB0aGUgZm9sbG93aW5nIGF0b21pYyBvcGVyYXRpb24gdGhhdCBwbGF0Zm9ybSBzaG91bGQKKyAqIHRyeSB0byBzdXBwb3J0IGFzIG11Y2ggYXMgcG9zc2libGUuIEF0b21pYyBvcGVyYXRpb24gYXJlIGV4cG9zZWQgYXMgbWFjcm8KKyAqIGluIG9yZGVyIHRvIGVhc2lseSB0ZXN0IGZvciB0aGVpciBleGlzdGFuY2UuIFRoZXkgYXJlOgorICogX19zdGxfYXRvbWljX3QgX1NUTFBfQVRPTUlDX0lOQ1JFTUVOVCh2b2xhdGlsZSBfX3N0bF9hdG9taWNfdCogX19wdHIpIDoKKyAqIGluY3JlbWVudCAqX19wdHIgYnkgMSBhbmQgcmV0dXJucyB0aGUgbmV3IHZhbHVlCisgKiBfX3N0bF9hdG9taWNfdCBfU1RMUF9BVE9NSUNfREVDUkVNRU5UKHZvbGF0aWxlIF9fc3RsX2F0b21pY190KiBfX3B0cikgOgorICogZGVjcmVtZW50ICAqX19wdHIgYnkgMSBhbmQgcmV0dXJucyB0aGUgbmV3IHZhbHVlCisgKiBfX3N0bF9hdG9taWNfdCBfU1RMUF9BVE9NSUNfRVhDSEFOR0Uodm9sYXRpbGUgX19zdGxfYXRvbWljX3QqIF9fdGFyZ2V0LCBfX3N0bF9hdG9taWNfdCBfX3ZhbCkgOgorICogYXNzaWduIF9fdmFsIHRvICpfX3RhcmdldCBhbmQgcmV0dXJucyBmb3JtZXIgKl9fdGFyZ2V0IHZhbHVlCisgKiB2b2lkKiBfU1RMUF9BVE9NSUNfRVhDSEFOR0VfUFRSKHZvaWQqIHZvbGF0aWxlKiBfX3RhcmdldCwgdm9pZCogX19wdHIpIDoKKyAqIGFzc2lnbiBfX3B0ciB0byAqX190YXJnZXQgYW5kIHJldHVybnMgZm9ybWVyICpfX3RhcmdldCB2YWx1ZQorICovCisKKyNpZiBkZWZpbmVkIChfU1RMUF9USFJFQURTKQorCisjICBpZiBkZWZpbmVkIChfU1RMUF9TR0lfVEhSRUFEUykKKworIyAgICBpbmNsdWRlIDxtdXRleC5oPgorLy8gSGFjayBmb3IgU0dJIG8zMiBjb21waWxlcnMuCisjICAgIGlmICFkZWZpbmVkKF9fYWRkX2FuZF9mZXRjaCkgJiYgXAorICAgICAgICAoX19taXBzIDwgMyB8fCAhKGRlZmluZWQgKF9BQklOMzIpIHx8IGRlZmluZWQoX0FCSTY0KSkpCisjICAgICAgZGVmaW5lIF9fYWRkX2FuZF9mZXRjaChfX2wsX192KSBhZGRfdGhlbl90ZXN0KCh1bnNpZ25lZCBsb25nKilfX2wsX192KQorIyAgICAgIGRlZmluZSBfX3Rlc3RfYW5kX3NldChfX2wsX192KSAgdGVzdF9hbmRfc2V0KF9fbCxfX3YpCisjICAgIGVuZGlmIC8qIG8zMiAqLworCisjICAgIGlmIF9fbWlwcyA8IDMgfHwgIShkZWZpbmVkIChfQUJJTjMyKSB8fCBkZWZpbmVkKF9BQkk2NCkpCisjICAgICAgZGVmaW5lIF9TVExQX0FUT01JQ19FWENIQU5HRShfX3AsIF9fcSkgdGVzdF9hbmRfc2V0KF9fcCwgX19xKQorIyAgICBlbHNlCisjICAgICAgZGVmaW5lIF9TVExQX0FUT01JQ19FWENIQU5HRShfX3AsIF9fcSkgX190ZXN0X2FuZF9zZXQoKHVuc2lnbmVkIGxvbmcqKV9fcCwgKHVuc2lnbmVkIGxvbmcpX19xKQorIyAgICBlbmRpZgorCisjICAgIGRlZmluZSBfU1RMUF9BVE9NSUNfSU5DUkVNRU5UKF9feCkgX19hZGRfYW5kX2ZldGNoKF9feCwgMSkKKyMgICAgZGVmaW5lIF9TVExQX0FUT01JQ19ERUNSRU1FTlQoX194KSBfX2FkZF9hbmRfZmV0Y2goX194LCAoc2l6ZV90KSAtMSkKK3R5cGVkZWYgbG9uZyBfX3N0bF9hdG9taWNfdDsKKworIyAgZWxpZiBkZWZpbmVkIChfU1RMUF9QVEhSRUFEUykKKworIyAgICBpbmNsdWRlIDxwdGhyZWFkLmg+CisjICAgIGlmICFkZWZpbmVkIChfU1RMUF9VU0VfUFRIUkVBRF9TUElOTE9DSykKKyMgICAgICBpZiBkZWZpbmVkIChQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSKSAmJiAhZGVmaW5lZCAoX1NUTFBfTVVURVhfSU5JVElBTElaRVIpICYmIGRlZmluZWQgKF9SRUVOVFJBTlQpCisjICAgICAgICBkZWZpbmUgX1NUTFBfTVVURVhfSU5JVElBTElaRVIgPSB7IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVIgfQorIyAgICAgIGVuZGlmCisvL0hQVVggdmFyaWFudHMgaGF2ZSAob24gc29tZSBwbGF0Zm9ybXMgb3B0aW9uYWwpIG5vbi1zdGFuZGFyZCAiRENFIiBwdGhyZWFkcyBpbXBsCisjICAgICAgaWYgZGVmaW5lZCAoX0RFQ1RIUkVBRFNfKSAmJiAoZGVmaW5lZCAoX1BUSFJFQURfVVNFX0Q0KSB8fCBkZWZpbmVkIChfX2hwdXgpKSAmJiAhZGVmaW5lZCAoX0NNQV9TVVBQUkVTU19FWFRFUk5BTFNfKQorIyAgICAgICAgZGVmaW5lIF9TVExQX1BUSFJFQURfQVRUUl9ERUZBVUxUIHB0aHJlYWRfbXV0ZXhhdHRyX2RlZmF1bHQKKyMgICAgICBlbHNlCisjICAgICAgICBkZWZpbmUgX1NUTFBfUFRIUkVBRF9BVFRSX0RFRkFVTFQgMAorIyAgICAgIGVuZGlmCisjICAgIGVsc2UKKyMgICAgICBpZiBkZWZpbmVkIChfX09wZW5CU0RfXykKKyMgICAgICAgIGluY2x1ZGUgPHNwaW5sb2NrLmg+CisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYKKworIyAgICBpZiBkZWZpbmVkIChfX0dOVUNfXykgJiYgZGVmaW5lZCAoX19pMzg2X18pCisjICAgICAgaWYgIWRlZmluZWQgKF9TVExQX0FUT01JQ19JTkNSRU1FTlQpCitpbmxpbmUgbG9uZyBfU1RMUF9hdG9taWNfaW5jcmVtZW50X2djY194ODYobG9uZyB2b2xhdGlsZSogcCkgeworICBsb25nIHJlc3VsdDsKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18KKyAgICAoImxvY2s7IHhhZGRsICAlMSwgJTA7IgorICAgIDoiPW0iICgqcCksICI9ciIgKHJlc3VsdCkKKyAgICA6Im0iICgqcCksICAiMSIgICgxKQorICAgIDoiY2MiKTsKKyAgcmV0dXJuIHJlc3VsdCArIDE7Cit9CisjICAgICAgICBkZWZpbmUgX1NUTFBfQVRPTUlDX0lOQ1JFTUVOVChfX3gpIChfU1RMUF9hdG9taWNfaW5jcmVtZW50X2djY194ODYoKGxvbmcgdm9sYXRpbGUqKV9feCkpCisjICAgICAgZW5kaWYKKworIyAgICAgIGlmICFkZWZpbmVkIChfU1RMUF9BVE9NSUNfREVDUkVNRU5UKQoraW5saW5lIGxvbmcgX1NUTFBfYXRvbWljX2RlY3JlbWVudF9nY2NfeDg2KGxvbmcgdm9sYXRpbGUqIHApIHsKKyAgbG9uZyByZXN1bHQ7CisgIF9fYXNtX18gX192b2xhdGlsZV9fCisgICAgKCJsb2NrOyB4YWRkbCAgJTEsICUwOyIKKyAgICA6Ij1tIiAoKnApLCAiPXIiIChyZXN1bHQpCisgICAgOiJtIiAoKnApLCAgIjEiICAoLTEpCisgICAgOiJjYyIpOworICByZXR1cm4gcmVzdWx0IC0gMTsKK30KKyMgICAgICAgIGRlZmluZSBfU1RMUF9BVE9NSUNfREVDUkVNRU5UKF9feCkgKF9TVExQX2F0b21pY19kZWNyZW1lbnRfZ2NjX3g4NigobG9uZyB2b2xhdGlsZSopX194KSkKKyMgICAgICBlbmRpZgordHlwZWRlZiBsb25nIF9fc3RsX2F0b21pY190OworIyAgICBlbHNlCit0eXBlZGVmIHNpemVfdCBfX3N0bF9hdG9taWNfdDsKKyMgICAgZW5kaWYgLyogaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX2kzODZfXykgKi8KKworIyAgZWxpZiBkZWZpbmVkIChfU1RMUF9XSU4zMlRIUkVBRFMpCisKKyMgICAgaWYgIWRlZmluZWQgKF9TVExQX0FUT01JQ19JTkNSRU1FTlQpCisjICAgICAgaWYgIWRlZmluZWQgKF9TVExQX05FV19QTEFURk9STV9TREspCisjICAgICAgICBkZWZpbmUgX1NUTFBfQVRPTUlDX0lOQ1JFTUVOVChfX3gpICAgICAgICAgICBJbnRlcmxvY2tlZEluY3JlbWVudChfX0NPTlNUX0NBU1QobG9uZyosIF9feCkpCisjICAgICAgICBkZWZpbmUgX1NUTFBfQVRPTUlDX0RFQ1JFTUVOVChfX3gpICAgICAgICAgICBJbnRlcmxvY2tlZERlY3JlbWVudChfX0NPTlNUX0NBU1QobG9uZyosIF9feCkpCisjICAgICAgICBkZWZpbmUgX1NUTFBfQVRPTUlDX0VYQ0hBTkdFKF9feCwgX195KSAgICAgICBJbnRlcmxvY2tlZEV4Y2hhbmdlKF9fQ09OU1RfQ0FTVChsb25nKiwgX194KSwgX195KQorIyAgICAgIGVsc2UKKyMgICAgICAgIGRlZmluZSBfU1RMUF9BVE9NSUNfSU5DUkVNRU5UKF9feCkgICAgICAgICAgIEludGVybG9ja2VkSW5jcmVtZW50KF9feCkKKyMgICAgICAgIGRlZmluZSBfU1RMUF9BVE9NSUNfREVDUkVNRU5UKF9feCkgICAgICAgICAgIEludGVybG9ja2VkRGVjcmVtZW50KF9feCkKKyMgICAgICAgIGRlZmluZSBfU1RMUF9BVE9NSUNfRVhDSEFOR0UoX194LCBfX3kpICAgICAgIEludGVybG9ja2VkRXhjaGFuZ2UoX194LCBfX3kpCisjICAgICAgZW5kaWYKKyMgICAgICBkZWZpbmUgX1NUTFBfQVRPTUlDX0VYQ0hBTkdFX1BUUihfX3gsIF9feSkgICAgIFNUTFBJbnRlcmxvY2tlZEV4Y2hhbmdlUG9pbnRlcihfX3gsIF9feSkKKyMgICAgZW5kaWYKK3R5cGVkZWYgbG9uZyBfX3N0bF9hdG9taWNfdDsKKworIyAgZWxpZiBkZWZpbmVkIChfX0RFQ0MpIHx8IGRlZmluZWQgKF9fREVDQ1hYKQorCisjICAgIGluY2x1ZGUgPG1hY2hpbmUvYnVpbHRpbnMuaD4KKyMgICAgZGVmaW5lIF9TVExQX0FUT01JQ19FWENIQU5HRSBfX0FUT01JQ19FWENIX0xPTkcKKyMgICAgZGVmaW5lIF9TVExQX0FUT01JQ19JTkNSRU1FTlQoX194KSBfX0FUT01JQ19BRERfTE9ORyhfX3gsIDEpCisjICAgIGRlZmluZSBfU1RMUF9BVE9NSUNfREVDUkVNRU5UKF9feCkgX19BVE9NSUNfQUREX0xPTkcoX194LCAtMSkKK3R5cGVkZWYgbG9uZyBfX3N0bF9hdG9taWNfdDsKKworIyAgZWxpZiBkZWZpbmVkIChfU1RMUF9TUEFSQ19TT0xBUklTX1RIUkVBRFMpCisKK3R5cGVkZWYgbG9uZyBfX3N0bF9hdG9taWNfdDsKKyMgICAgaW5jbHVkZSA8c3RsL19zcGFyY19hdG9taWMuaD4KKworIyAgZWxpZiBkZWZpbmVkIChfU1RMUF9VSVRIUkVBRFMpCisKKy8vIHRoaXMgaW5jbHVzaW9uIGlzIHBvdGVudGlhbCBoYXphcmQgdG8gYnJpbmcgdXAgYWxsIHNvcnRzCisvLyBvZiBvbGQtc3R5bGUgaGVhZGVycy4gTGV0J3MgYXNzdW1lIHZlbmRvciBhbHJlYWR5IGtub3cgaG93CisvLyB0byBkZWFsIHdpdGggdGhhdC4KKyMgICAgaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NUSU1FCisjICAgICAgaW5jbHVkZSA8c3RsL19jdGltZS5oPgorIyAgICBlbmRpZgorIyAgICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfTkFNRVNQQUNFUykgJiYgISBkZWZpbmVkIChfU1RMUF9WRU5ET1JfR0xPQkFMX0NTVEQpCit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6dGltZV90OworIyAgICBlbmRpZgorIyAgICBpbmNsdWRlIDxzeW5jaC5oPgorIyAgICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1NURElPCisjICAgICAgaW5jbHVkZSA8c3RsL19jc3RkaW8uaD4KKyMgICAgZW5kaWYKKyMgICAgaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NXQ0hBUgorIyAgICAgIGluY2x1ZGUgPHN0bC9fY3djaGFyLmg+CisjICAgIGVuZGlmCit0eXBlZGVmIHNpemVfdCBfX3N0bF9hdG9taWNfdDsKKworIyAgZWxpZiBkZWZpbmVkIChfU1RMUF9CRVRIUkVBRFMpCisKKyMgICAgaW5jbHVkZSA8T1MuaD4KKyMgICAgaW5jbHVkZSA8Y2Fzc2VydD4KKyMgICAgaW5jbHVkZSA8c3RkaW8uaD4KKyMgICAgZGVmaW5lIF9TVExQX01VVEVYX0lOSVRJQUxJWkVSID0geyAwIH0KK3R5cGVkZWYgc2l6ZV90IF9fc3RsX2F0b21pY190OworCisjICBlbGlmIGRlZmluZWQgKF9TVExQX05XVEhSRUFEUykKKworIyAgICBpbmNsdWRlIDxud3RocmVhZC5oPgorIyAgICBpbmNsdWRlIDxud3NlbWFwaC5oPgordHlwZWRlZiBzaXplX3QgX19zdGxfYXRvbWljX3Q7CisKKyMgIGVsaWYgZGVmaW5lZChfU1RMUF9PUzJUSFJFQURTKQorCisjICAgIGlmIGRlZmluZWQgKF9fR05VQ19fKQorIyAgICAgIGRlZmluZSBJTkNMX0RPU1NFTUFQSE9SRVMKKyMgICAgICBpbmNsdWRlIDxvczIuaD4KKyMgICAgZWxzZQorLy8gVGhpcyBzZWN0aW9uIHNlcnZlcyB0byByZXBsYWNlIG9zMi5oIGZvciBWaXN1YWxBZ2UgQysrCisgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBVTE9ORzsKKyMgICAgICBpZiAhZGVmaW5lZCAoX19IRVZfXykgIC8qIElOQ0xfU0VNQVBIT1JFIG1heSBhbHNvIGRlZmluZSBIRVYgKi8KKyMgICAgICAgIGRlZmluZSBfX0hFVl9fCisgIHR5cGVkZWYgVUxPTkcgSEVWOworICB0eXBlZGVmIEhFViogIFBIRVY7CisjICAgICAgZW5kaWYKKyAgdHlwZWRlZiBVTE9ORyBBUElSRVQ7CisgIHR5cGVkZWYgVUxPTkcgSE1UWDsKKyAgdHlwZWRlZiBITVRYKiAgUEhNVFg7CisgIHR5cGVkZWYgY29uc3QgY2hhciogIFBDU1o7CisgIHR5cGVkZWYgVUxPTkcgQk9PTDMyOworICBBUElSRVQgX1N5c3RlbSBEb3NDcmVhdGVNdXRleFNlbShQQ1NaIHBzek5hbWUsIFBIRVYgcGhldiwgVUxPTkcgZmxBdHRyLCBCT09MMzIgZlN0YXRlKTsKKyAgQVBJUkVUIF9TeXN0ZW0gRG9zUmVxdWVzdE11dGV4U2VtKEhNVFggaG10eCwgVUxPTkcgdWxUaW1lb3V0KTsKKyAgQVBJUkVUIF9TeXN0ZW0gRG9zUmVsZWFzZU11dGV4U2VtKEhNVFggaG10eCk7CisgIEFQSVJFVCBfU3lzdGVtIERvc0Nsb3NlTXV0ZXhTZW0oSE1UWCBobXR4KTsKKyMgICAgICBkZWZpbmUgX1NUTFBfTVVURVhfSU5JVElBTElaRVIgPSB7IDAgfQorIyAgICBlbmRpZiAvKiBHTlVDICovCit0eXBlZGVmIHNpemVfdCBfX3N0bF9hdG9taWNfdDsKKworIyAgZWxzZQorCit0eXBlZGVmIHNpemVfdCBfX3N0bF9hdG9taWNfdDsKKworIyAgZW5kaWYKKworI2Vsc2UKKy8qIG5vIHRocmVhZHMgKi8KKyMgIGRlZmluZSBfU1RMUF9BVE9NSUNfSU5DUkVNRU5UKF9feCkgKysoKl9feCkKKyMgIGRlZmluZSBfU1RMUF9BVE9NSUNfREVDUkVNRU5UKF9feCkgLS0oKl9feCkKKy8qIFdlIGRvIG5vdCBncmFudCBvdGhlciBhdG9taWMgb3BlcmF0aW9ucyBhcyB0aGV5IGFyZSB1c2VsZXNzIGlmIFNUTHBvcnQgZG8gbm90IGhhdmUKKyAqIHRvIGJlIHRocmVhZCBzYWZlCisgKi8KK3R5cGVkZWYgc2l6ZV90IF9fc3RsX2F0b21pY190OworI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTVVURVhfSU5JVElBTElaRVIpCisjICBpZiBkZWZpbmVkKF9TVExQX0FUT01JQ19FWENIQU5HRSkKKyMgICAgZGVmaW5lIF9TVExQX01VVEVYX0lOSVRJQUxJWkVSID0geyAwIH0KKyMgIGVsaWYgZGVmaW5lZChfU1RMUF9VSVRIUkVBRFMpCisjICAgIGRlZmluZSBfU1RMUF9NVVRFWF9JTklUSUFMSVpFUiA9IHsgREVGQVVMVE1VVEVYIH0KKyMgIGVsc2UKKyMgICAgZGVmaW5lIF9TVExQX01VVEVYX0lOSVRJQUxJWkVSCisjICBlbmRpZgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisjaWYgZGVmaW5lZCAoX1NUTFBfVEhSRUFEUykgJiYgIWRlZmluZWQgKF9TVExQX1VTRV9QVEhSRUFEX1NQSU5MT0NLKQorLy8gSGVscGVyIHN0cnVjdC4gIFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciB2YXJpb3VzIGNvbXBpbGVycyB0aGF0IGRvbid0CisvLyBoYW5kbGUgc3RhdGljIHZhcmlhYmxlcyBpbiBpbmxpbmUgZnVuY3Rpb25zIHByb3Blcmx5LgordGVtcGxhdGUgPGludCBfX2luc3Q+CitzdHJ1Y3QgX1NUTFBfbXV0ZXhfc3BpbiB7CisgIGVudW0geyBfX2xvd19tYXggPSAzMCwgX19oaWdoX21heCA9IDEwMDAgfTsKKyAgLy8gTG93IGlmIHdlIHN1c3BlY3QgdW5pcHJvY2Vzc29yLCBoaWdoIGZvciBtdWx0aXByb2Nlc3Nvci4KKyAgc3RhdGljIHVuc2lnbmVkIF9fbWF4OworICBzdGF0aWMgdW5zaWduZWQgX19sYXN0OworICBzdGF0aWMgdm9pZCBfU1RMUF9DQUxMIF9NX2RvX2xvY2sodm9sYXRpbGUgX19zdGxfYXRvbWljX3QqIF9fbG9jayk7CisgIHN0YXRpYyB2b2lkIF9TVExQX0NBTEwgX1NfbnNlY19zbGVlcChpbnQgX19sb2dfbnNlYywgdW5zaWduZWQgaW50JiBfX2l0ZXJhdGlvbik7Cit9OworI2VuZGlmIC8vICFfU1RMUF9VU0VfUFRIUkVBRF9TUElOTE9DSworCisvLyBMb2NraW5nIGNsYXNzLiAgTm90ZSB0aGF0IHRoaXMgY2xhc3MgKmRvZXMgbm90IGhhdmUgYSBjb25zdHJ1Y3RvciouCisvLyBJdCBtdXN0IGJlIGluaXRpYWxpemVkIGVpdGhlciBzdGF0aWNhbGx5LCB3aXRoIF9TVExQX01VVEVYX0lOSVRJQUxJWkVSLAorLy8gb3IgZHluYW1pY2FsbHksIGJ5IGV4cGxpY2l0bHkgY2FsbGluZyB0aGUgX01faW5pdGlhbGl6ZSBtZW1iZXIgZnVuY3Rpb24uCisvLyAoVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSB3YXlzIHRoYXQgYSBwdGhyZWFkcyBtdXRleCBjYW4gYmUgaW5pdGlhbGl6ZWQuKQorLy8gVGhlcmUgYXJlIGV4cGxpY2l0IG1lbWJlciBmdW5jdGlvbnMgZm9yIGFjcXVpcmluZyBhbmQgcmVsZWFzaW5nIHRoZSBsb2NrLgorCisvLyBUaGVyZSBpcyBubyBjb25zdHJ1Y3RvciBiZWNhdXNlIHN0YXRpYyBpbml0aWFsaXphdGlvbiBpcyBlc3NlbnRpYWwgZm9yCisvLyBzb21lIHVzZXMsIGFuZCBvbmx5IGEgY2xhc3MgYWdncmVnYXRlIChzZWUgc2VjdGlvbiA4LjUuMSBvZiB0aGUgQysrCisvLyBzdGFuZGFyZCkgY2FuIGJlIGluaXRpYWxpemVkIHRoYXQgd2F5LiAgVGhhdCBtZWFucyB3ZSBtdXN0IGhhdmUgbm8KKy8vIGNvbnN0cnVjdG9ycywgbm8gYmFzZSBjbGFzc2VzLCBubyB2aXJ0dWFsIGZ1bmN0aW9ucywgYW5kIG5vIHByaXZhdGUgb3IKKy8vIHByb3RlY3RlZCBtZW1iZXJzLgorCisvLyBGb3Igbm9uLXN0YXRpYyBjYXNlcywgY2xpZW50cyBzaG91bGQgdXNlICBfU1RMUF9tdXRleC4KKworc3RydWN0IF9TVExQX0NMQVNTX0RFQ0xTUEVDIF9TVExQX211dGV4X2Jhc2UgeworI2lmIGRlZmluZWQgKF9TVExQX0FUT01JQ19FWENIQU5HRSkgfHwgZGVmaW5lZCAoX1NUTFBfU0dJX1RIUkVBRFMpCisgIC8vIEl0IHNob3VsZCBiZSByZWxhdGl2ZWx5IGVhc3kgdG8gZ2V0IHRoaXMgdG8gd29yayBvbiBhbnkgbW9kZXJuIFVuaXguCisgIHZvbGF0aWxlIF9fc3RsX2F0b21pY190IF9NX2xvY2s7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX1RIUkVBRFMpCisjICBpZiBkZWZpbmVkIChfU1RMUF9BVE9NSUNfRVhDSEFOR0UpCisgIGlubGluZSB2b2lkIF9NX2luaXRpYWxpemUoKSB7IF9NX2xvY2sgPSAwOyB9CisgIGlubGluZSB2b2lkIF9NX2Rlc3Ryb3koKSB7fQorCisgIHZvaWQgX01fYWNxdWlyZV9sb2NrKCkgeworICAgIF9TVExQX211dGV4X3NwaW48MD46Ol9NX2RvX2xvY2soJl9NX2xvY2spOworICB9CisKKyAgaW5saW5lIHZvaWQgX01fcmVsZWFzZV9sb2NrKCkgeworICAgIHZvbGF0aWxlIF9fc3RsX2F0b21pY190KiBfX2xvY2sgPSAmX01fbG9jazsKKyMgICAgaWYgZGVmaW5lZChfU1RMUF9TR0lfVEhSRUFEUykgJiYgZGVmaW5lZChfX0dOVUNfXykgJiYgX19taXBzID49IDMKKyAgICBhc20oInN5bmMiKTsKKyAgICAqX19sb2NrID0gMDsKKyMgICAgZWxpZiBkZWZpbmVkKF9TVExQX1NHSV9USFJFQURTKSAmJiBfX21pcHMgPj0gMyAmJiBcCisgICAgICAgICAoZGVmaW5lZCAoX0FCSU4zMikgfHwgZGVmaW5lZChfQUJJNjQpKQorICAgIF9fbG9ja19yZWxlYXNlKF9fbG9jayk7CisjICAgIGVsaWYgZGVmaW5lZCAoX1NUTFBfU1BBUkNfU09MQVJJU19USFJFQURTKQorIyAgICAgIGlmIGRlZmluZWQgKF9fV09SRDY0KSB8fCBkZWZpbmVkIChfX2FyY2g2NF9fKSB8fCBkZWZpbmVkIChfX3NwYXJjdjkpIHx8IGRlZmluZWQgKF9fc3BhcmN2OHBsdXMpCisgICAgYXNtKCJtZW1iYXIgI1N0b3JlU3RvcmUgOyBtZW1iYXIgI0xvYWRTdG9yZSIpOworIyAgICAgIGVsc2UKKyAgICBhc20oIiBzdGJhciAiKTsKKyMgICAgICBlbmRpZgorICAgICpfX2xvY2sgPSAwOworIyAgICBlbHNlCisgICAgKl9fbG9jayA9IDA7CisgICAgLy8gVGhpcyBpcyBub3Qgc3VmZmljaWVudCBvbiBtYW55IG11bHRpcHJvY2Vzc29ycywgc2luY2UKKyAgICAvLyB3cml0ZXMgdG8gcHJvdGVjdGVkIHZhcmlhYmxlcyBhbmQgdGhlIGxvY2sgbWF5IGJlIHJlb3JkZXJlZC4KKyMgICAgZW5kaWYKKyAgfQorIyAgZWxpZiBkZWZpbmVkIChfU1RMUF9QVEhSRUFEUykKKyMgICAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BUSFJFQURfU1BJTkxPQ0spCisjICAgICAgaWYgIWRlZmluZWQgKF9fT3BlbkJTRF9fKQorICBwdGhyZWFkX3NwaW5sb2NrX3QgX01fbG9jazsKKyAgaW5saW5lIHZvaWQgX01faW5pdGlhbGl6ZSgpIHsgcHRocmVhZF9zcGluX2luaXQoICZfTV9sb2NrLCAwICk7IH0KKyAgaW5saW5lIHZvaWQgX01fZGVzdHJveSgpIHsgcHRocmVhZF9zcGluX2Rlc3Ryb3koICZfTV9sb2NrICk7IH0KKworICAvLyBzb3JyeSwgYnV0IG5vIHN0YXRpYyBpbml0aWFsaXplciBmb3IgcHRocmVhZF9zcGlubG9ja190OworICAvLyB0aGlzIHdpbGwgbm90IHdvcmsgZm9yIGNvbXBpbGVycyB0aGF0IGhhcyBwcm9ibGVtcyB3aXRoIGNhbGwKKyAgLy8gY29uc3RydWN0b3Igb2Ygc3RhdGljIG9iamVjdC4uLgorCisgIC8vIF9TVExQX211dGV4X2Jhc2UoKQorICAvLyAgIHsgcHRocmVhZF9zcGluX2luaXQoICZfTV9sb2NrLCAwICk7IH0KKworICAvLyB+X1NUTFBfbXV0ZXhfYmFzZSgpCisgIC8vICAgeyBwdGhyZWFkX3NwaW5fZGVzdHJveSggJl9NX2xvY2sgKTsgfQorCisgIGlubGluZSB2b2lkIF9NX2FjcXVpcmVfbG9jaygpIHsgcHRocmVhZF9zcGluX2xvY2soICZfTV9sb2NrICk7IH0KKyAgaW5saW5lIHZvaWQgX01fcmVsZWFzZV9sb2NrKCkgeyBwdGhyZWFkX3NwaW5fdW5sb2NrKCAmX01fbG9jayApOyB9CisjICAgICAgZWxzZSAvLyBfX09wZW5CU0RfXworICBzcGlubG9ja190IF9NX2xvY2s7CisgIGlubGluZSB2b2lkIF9NX2luaXRpYWxpemUoKSB7IF9TUElOTE9DS19JTklUKCAmX01fbG9jayApOyB9CisgIGlubGluZSB2b2lkIF9NX2Rlc3Ryb3koKSB7IH0KKyAgaW5saW5lIHZvaWQgX01fYWNxdWlyZV9sb2NrKCkgeyBfU1BJTkxPQ0soICZfTV9sb2NrICk7IH0KKyAgaW5saW5lIHZvaWQgX01fcmVsZWFzZV9sb2NrKCkgeyBfU1BJTlVOTE9DSyggJl9NX2xvY2sgKTsgfQorIyAgICAgIGVuZGlmIC8vIF9fT3BlbkJTRF9fCisjICAgIGVsc2UgLy8gIV9TVExQX1VTRV9QVEhSRUFEX1NQSU5MT0NLCisgIHB0aHJlYWRfbXV0ZXhfdCBfTV9sb2NrOworICBpbmxpbmUgdm9pZCBfTV9pbml0aWFsaXplKCkKKyAgeyBwdGhyZWFkX211dGV4X2luaXQoJl9NX2xvY2ssX1NUTFBfUFRIUkVBRF9BVFRSX0RFRkFVTFQpOyB9CisgIGlubGluZSB2b2lkIF9NX2Rlc3Ryb3koKQorICB7IHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmX01fbG9jayk7IH0KKyAgaW5saW5lIHZvaWQgX01fYWNxdWlyZV9sb2NrKCkgeworIyAgICAgIGlmIGRlZmluZWQgKCBfX2hwdXggKSAmJiAhIGRlZmluZWQgKFBUSFJFQURfTVVURVhfSU5JVElBTElaRVIpCisgICAgaWYgKCFfTV9sb2NrLmZpZWxkMSkgIF9NX2luaXRpYWxpemUoKTsKKyMgICAgICBlbmRpZgorICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmX01fbG9jayk7CisgIH0KKyAgaW5saW5lIHZvaWQgX01fcmVsZWFzZV9sb2NrKCkgeyBwdGhyZWFkX211dGV4X3VubG9jaygmX01fbG9jayk7IH0KKyMgICAgZW5kaWYgLy8gIV9TVExQX1VTRV9QVEhSRUFEX1NQSU5MT0NLCisKKyMgIGVsaWYgZGVmaW5lZCAoX1NUTFBfVUlUSFJFQURTKQorICBtdXRleF90IF9NX2xvY2s7CisgIGlubGluZSB2b2lkIF9NX2luaXRpYWxpemUoKQorICB7IG11dGV4X2luaXQoJl9NX2xvY2ssIDAsIE5VTEwpOyB9CisgIGlubGluZSB2b2lkIF9NX2Rlc3Ryb3koKQorICB7IG11dGV4X2Rlc3Ryb3koJl9NX2xvY2spOyB9CisgIGlubGluZSB2b2lkIF9NX2FjcXVpcmVfbG9jaygpIHsgbXV0ZXhfbG9jaygmX01fbG9jayk7IH0KKyAgaW5saW5lIHZvaWQgX01fcmVsZWFzZV9sb2NrKCkgeyBtdXRleF91bmxvY2soJl9NX2xvY2spOyB9CisKKyMgIGVsaWYgZGVmaW5lZCAoX1NUTFBfT1MyVEhSRUFEUykKKyAgSE1UWCBfTV9sb2NrOworICBpbmxpbmUgdm9pZCBfTV9pbml0aWFsaXplKCkgeyBEb3NDcmVhdGVNdXRleFNlbShOVUxMLCAmX01fbG9jaywgMCwgZmFsc2UpOyB9CisgIGlubGluZSB2b2lkIF9NX2Rlc3Ryb3koKSB7IERvc0Nsb3NlTXV0ZXhTZW0oX01fbG9jayk7IH0KKyAgaW5saW5lIHZvaWQgX01fYWNxdWlyZV9sb2NrKCkgeworICAgIGlmICghX01fbG9jaykgX01faW5pdGlhbGl6ZSgpOworICAgIERvc1JlcXVlc3RNdXRleFNlbShfTV9sb2NrLCBTRU1fSU5ERUZJTklURV9XQUlUKTsKKyAgfQorICBpbmxpbmUgdm9pZCBfTV9yZWxlYXNlX2xvY2soKSB7IERvc1JlbGVhc2VNdXRleFNlbShfTV9sb2NrKTsgfQorIyAgZWxpZiBkZWZpbmVkIChfU1RMUF9CRVRIUkVBRFMpCisgIHNlbV9pZCBzZW07CisgIGlubGluZSB2b2lkIF9NX2luaXRpYWxpemUoKSB7CisgICAgc2VtID0gY3JlYXRlX3NlbSgxLCAiU1RMUG9ydCIpOworICAgIGFzc2VydChzZW0gPiAwKTsKKyAgfQorICBpbmxpbmUgdm9pZCBfTV9kZXN0cm95KCkgeworICAgIGludCB0ID0gZGVsZXRlX3NlbShzZW0pOworICAgIGFzc2VydCh0ID09IEJfTk9fRVJST1IpOworICB9CisgIGlubGluZSB2b2lkIF9NX2FjcXVpcmVfbG9jaygpOworICBpbmxpbmUgdm9pZCBfTV9yZWxlYXNlX2xvY2soKSB7CisgICAgc3RhdHVzX3QgdCA9IHJlbGVhc2Vfc2VtKHNlbSk7CisgICAgYXNzZXJ0KHQgPT0gQl9OT19FUlJPUik7CisgIH0KKyMgIGVsaWYgZGVmaW5lZCAoX1NUTFBfTldUSFJFQURTKQorICBMT05HIF9NX2xvY2s7CisgIGlubGluZSB2b2lkIF9NX2luaXRpYWxpemUoKQorICB7IF9NX2xvY2sgPSBPcGVuTG9jYWxTZW1hcGhvcmUoMSk7IH0KKyAgaW5saW5lIHZvaWQgX01fZGVzdHJveSgpCisgIHsgQ2xvc2VMb2NhbFNlbWFwaG9yZShfTV9sb2NrKTsgfQorICBpbmxpbmUgdm9pZCBfTV9hY3F1aXJlX2xvY2soKQorICB7IFdhaXRPbkxvY2FsU2VtYXBob3JlKF9NX2xvY2spOyB9CisgIGlubGluZSB2b2lkIF9NX3JlbGVhc2VfbG9jaygpIHsgU2lnbmFsTG9jYWxTZW1hcGhvcmUoX01fbG9jayk7IH0KKyMgIGVsc2UgICAgICAvLyp0eSAxMS8yNC8yMDAxIC0gYWRkZWQgY29uZmlndXJhdGlvbiBjaGVjaworIyAgICBlcnJvciAiVW5rbm93biB0aHJlYWQgZmFjaWxpdHkgY29uZmlndXJhdGlvbiIKKyMgIGVuZGlmCisjZWxzZSAvKiBObyB0aHJlYWRzICovCisgIGlubGluZSB2b2lkIF9NX2luaXRpYWxpemUoKSB7fQorICBpbmxpbmUgdm9pZCBfTV9kZXN0cm95KCkge30KKyAgaW5saW5lIHZvaWQgX01fYWNxdWlyZV9sb2NrKCkge30KKyAgaW5saW5lIHZvaWQgX01fcmVsZWFzZV9sb2NrKCkge30KKyNlbmRpZiAvLyBfU1RMUF9QVEhSRUFEUworfTsKKworLy8gTG9ja2luZyBjbGFzcy4gIFRoZSBjb25zdHJ1Y3RvciBpbml0aWFsaXplcyB0aGUgbG9jaywgdGhlIGRlc3RydWN0b3IgZGVzdHJveXMgaXQuCisvLyBXZWxsIC0gYmVoYXZpbmcgY2xhc3MsIGRvZXMgbm90IG5lZWQgc3RhdGljIGluaXRpYWxpemVyCisKK2NsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIF9TVExQX211dGV4IDogcHVibGljIF9TVExQX211dGV4X2Jhc2UgeworICBwdWJsaWM6CisgICAgaW5saW5lIF9TVExQX211dGV4ICgpIHsgX01faW5pdGlhbGl6ZSgpOyB9CisgICAgaW5saW5lIH5fU1RMUF9tdXRleCAoKSB7IF9NX2Rlc3Ryb3koKTsgfQorICBwcml2YXRlOgorICAgIF9TVExQX211dGV4KGNvbnN0IF9TVExQX211dGV4Jik7CisgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgX1NUTFBfbXV0ZXgmKTsKK307CisKKy8vIEEgbG9ja2luZyBjbGFzcyB0aGF0IHVzZXMgX1NUTFBfU1RBVElDX01VVEVYLiAgVGhlIGNvbnN0cnVjdG9yIHRha2VzCisvLyBhIHJlZmVyZW5jZSB0byBhbiBfU1RMUF9TVEFUSUNfTVVURVgsIGFuZCBhY3F1aXJlcyBhIGxvY2suICBUaGUgZGVzdHJ1Y3RvcgorLy8gcmVsZWFzZXMgdGhlIGxvY2suCisvLyBJdCdzIG5vdCBjbGVhciB0aGF0IHRoaXMgaXMgZXhhY3RseSB0aGUgcmlnaHQgZnVuY3Rpb25hbGl0eS4KKy8vIEl0IHdpbGwgcHJvYmFibHkgY2hhbmdlIGluIHRoZSBmdXR1cmUuCisKK3N0cnVjdCBfU1RMUF9DTEFTU19ERUNMU1BFQyBfU1RMUF9hdXRvX2xvY2sgeworICBfU1RMUF9hdXRvX2xvY2soX1NUTFBfU1RBVElDX01VVEVYJiBfX2xvY2spIDogX01fbG9jayhfX2xvY2spCisgIHsgX01fbG9jay5fTV9hY3F1aXJlX2xvY2soKTsgfQorICB+X1NUTFBfYXV0b19sb2NrKCkKKyAgeyBfTV9sb2NrLl9NX3JlbGVhc2VfbG9jaygpOyB9CisKK3ByaXZhdGU6CisgIF9TVExQX1NUQVRJQ19NVVRFWCYgX01fbG9jazsKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgX1NUTFBfYXV0b19sb2NrJik7CisgIF9TVExQX2F1dG9fbG9jayhjb25zdCBfU1RMUF9hdXRvX2xvY2smKTsKK307CisKKy8qCisgKiBDbGFzcyBfUmVmY291bnRfQmFzZSBwcm92aWRlcyBhIHR5cGUsIF9fc3RsX2F0b21pY190LCBhIGRhdGEgbWVtYmVyLAorICogX01fcmVmX2NvdW50LCBhbmQgbWVtYmVyIGZ1bmN0aW9ucyBfTV9pbmNyIGFuZCBfTV9kZWNyLCB3aGljaCBwZXJmb3JtCisgKiBhdG9taWMgcHJlaW5jcmVtZW50L3ByZWRlY3JlbWVudC4gIFRoZSBjb25zdHJ1Y3RvciBpbml0aWFsaXplcworICogX01fcmVmX2NvdW50LgorICovCitjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBfUmVmY291bnRfQmFzZSB7CisgIC8vIFRoZSBkYXRhIG1lbWJlciBfTV9yZWZfY291bnQKKyNpZiBkZWZpbmVkIChfX0RNQ19fKQorcHVibGljOgorI2VuZGlmCisgIF9TVExQX1ZPTEFUSUxFIF9fc3RsX2F0b21pY190IF9NX3JlZl9jb3VudDsKKworI2lmIGRlZmluZWQgKF9TVExQX1RIUkVBRFMpICYmIFwKKyAgICghZGVmaW5lZCAoX1NUTFBfQVRPTUlDX0lOQ1JFTUVOVCkgfHwgIWRlZmluZWQgKF9TVExQX0FUT01JQ19ERUNSRU1FTlQpIHx8IFwKKyAgICBkZWZpbmVkIChfU1RMUF9XSU45NV9MSUtFKSkKKyMgIGRlZmluZSBfU1RMUF9VU0VfTVVURVgKKyAgX1NUTFBfbXV0ZXggX01fbXV0ZXg7CisjZW5kaWYKKworICBwdWJsaWM6CisgIC8vIENvbnN0cnVjdG9yCisgIF9SZWZjb3VudF9CYXNlKF9fc3RsX2F0b21pY190IF9fbikgOiBfTV9yZWZfY291bnQoX19uKSB7fQorI2lmIGRlZmluZWQgKF9fQk9STEFORENfXykKKyAgfl9SZWZjb3VudF9CYXNlKCl7fTsKKyNlbmRpZgorCisgIC8vIF9NX2luY3IgYW5kIF9NX2RlY3IKKyNpZiBkZWZpbmVkIChfU1RMUF9USFJFQURTKQorIyAgaWYgIWRlZmluZWQgKF9TVExQX1VTRV9NVVRFWCkKKyAgIF9fc3RsX2F0b21pY190IF9NX2luY3IoKSB7IHJldHVybiBfU1RMUF9BVE9NSUNfSU5DUkVNRU5UKCZfTV9yZWZfY291bnQpOyB9CisgICBfX3N0bF9hdG9taWNfdCBfTV9kZWNyKCkgeyByZXR1cm4gX1NUTFBfQVRPTUlDX0RFQ1JFTUVOVCgmX01fcmVmX2NvdW50KTsgfQorIyAgZWxzZQorIyAgICB1bmRlZiBfU1RMUF9VU0VfTVVURVgKKyAgX19zdGxfYXRvbWljX3QgX01faW5jcigpIHsKKyAgICBfU1RMUF9hdXRvX2xvY2sgbChfTV9tdXRleCk7CisgICAgcmV0dXJuICsrX01fcmVmX2NvdW50OworICB9CisgIF9fc3RsX2F0b21pY190IF9NX2RlY3IoKSB7CisgICAgX1NUTFBfYXV0b19sb2NrIGwoX01fbXV0ZXgpOworICAgIHJldHVybiAtLV9NX3JlZl9jb3VudDsKKyAgfQorIyAgZW5kaWYKKyNlbHNlICAvKiBObyB0aHJlYWRzICovCisgIF9fc3RsX2F0b21pY190IF9NX2luY3IoKSB7IHJldHVybiArK19NX3JlZl9jb3VudDsgfQorICBfX3N0bF9hdG9taWNfdCBfTV9kZWNyKCkgeyByZXR1cm4gLS1fTV9yZWZfY291bnQ7IH0KKyNlbmRpZgorfTsKKworLyogQXRvbWljIHN3YXAgb24gX19zdGxfYXRvbWljX3QKKyAqIFRoaXMgaXMgZ3VhcmFudGVlZCB0byBiZWhhdmUgYXMgdGhvdWdoIGl0IHdlcmUgYXRvbWljIG9ubHkgaWYgYWxsCisgKiBwb3NzaWJseSBjb25jdXJyZW50IHVwZGF0ZXMgdXNlIF9BdG9taWNfc3dhcC4KKyAqIEluIHNvbWUgY2FzZXMgdGhlIG9wZXJhdGlvbiBpcyBlbXVsYXRlZCB3aXRoIGEgbG9jay4KKyAqIElkZW0gZm9yIF9BdG9taWNfc3dhcF9wdHIKKyAqLworLyogSGVscGVyIHN0cnVjdCB0byBoYW5kbGUgZm9sbG93aW5nIGNhc2VzOgorICogLSBvbiBwbGF0Zm9ybXMgd2hlcmUgc2l6ZW9mKF9fc3RsX2F0b21pY190KSA9PSBzaXplb2Yodm9pZCopIGF0b21pYworICogICBleGNoYW5nZSBjYW4gYmUgZG9uZSBvbiBwb2ludGVycworICogLSBvbiBwbGF0Zm9ybSB3aXRob3V0IGF0b21pYyBvcGVyYXRpb24gc3dhcCBpcyBkb25lIGluIGEgY3JpdGljYWwgc2VjdGlvbiwKKyAqICAgcG9ydGFibGUgYnV0IGluZWZmaWNpZW50LgorICovCit0ZW1wbGF0ZSA8aW50IF9fdXNlX3B0cl9hdG9taWNfc3dhcD4KK2NsYXNzIF9BdG9taWNfc3dhcF9zdHJ1Y3QgeworcHVibGljOgorI2lmIGRlZmluZWQgKF9TVExQX1RIUkVBRFMpICYmIFwKKyAgICAhZGVmaW5lZCAoX1NUTFBfQVRPTUlDX0VYQ0hBTkdFKSAmJiBcCisgICAgKGRlZmluZWQgKF9TVExQX1BUSFJFQURTKSB8fCBkZWZpbmVkIChfU1RMUF9VSVRIUkVBRFMpIHx8IGRlZmluZWQgKF9TVExQX09TMlRIUkVBRFMpIHx8IFwKKyAgICAgZGVmaW5lZCAoX1NUTFBfVVNFX1BUSFJFQURfU1BJTkxPQ0spIHx8IGRlZmluZWQgKF9TVExQX05XVEhSRUFEUykpCisjICBkZWZpbmUgX1NUTFBfVVNFX0FUT01JQ19TV0FQX01VVEVYCisgIHN0YXRpYyBfU1RMUF9TVEFUSUNfTVVURVggX1Nfc3dhcF9sb2NrOworI2VuZGlmCisKKyAgc3RhdGljIF9fc3RsX2F0b21pY190IF9TX3N3YXAoX1NUTFBfVk9MQVRJTEUgX19zdGxfYXRvbWljX3QqIF9fcCwgX19zdGxfYXRvbWljX3QgX19xKSB7CisjaWYgZGVmaW5lZCAoX1NUTFBfVEhSRUFEUykKKyMgIGlmIGRlZmluZWQgKF9TVExQX0FUT01JQ19FWENIQU5HRSkKKyAgcmV0dXJuIF9TVExQX0FUT01JQ19FWENIQU5HRShfX3AsIF9fcSk7CisjICBlbGlmIGRlZmluZWQgKF9TVExQX1VTRV9BVE9NSUNfU1dBUF9NVVRFWCkKKyAgX1Nfc3dhcF9sb2NrLl9NX2FjcXVpcmVfbG9jaygpOworICBfX3N0bF9hdG9taWNfdCBfX3Jlc3VsdCA9ICpfX3A7CisgICpfX3AgPSBfX3E7CisgIF9TX3N3YXBfbG9jay5fTV9yZWxlYXNlX2xvY2soKTsKKyAgcmV0dXJuIF9fcmVzdWx0OworIyAgZWxzZQorIyAgICBlcnJvciBNaXNzaW5nIGF0b21pYyBzd2FwIGltcGxlbWVudGF0aW9uCisjICBlbmRpZgorI2Vsc2UKKyAgLyogbm8gdGhyZWFkcyAqLworICBfX3N0bF9hdG9taWNfdCBfX3Jlc3VsdCA9ICpfX3A7CisgICpfX3AgPSBfX3E7CisgIHJldHVybiBfX3Jlc3VsdDsKKyNlbmRpZiAvLyBfU1RMUF9USFJFQURTCisgIH0KKworICBzdGF0aWMgdm9pZCogX1Nfc3dhcF9wdHIodm9pZCogX1NUTFBfVk9MQVRJTEUqIF9fcCwgdm9pZCogX19xKSB7CisjaWYgZGVmaW5lZCAoX1NUTFBfVEhSRUFEUykKKyMgIGlmIGRlZmluZWQgKF9TVExQX0FUT01JQ19FWENIQU5HRV9QVFIpCisgIHJldHVybiBfU1RMUF9BVE9NSUNfRVhDSEFOR0VfUFRSKF9fcCwgX19xKTsKKyMgIGVsaWYgZGVmaW5lZCAoX1NUTFBfQVRPTUlDX0VYQ0hBTkdFKQorICBfU1RMUF9TVEFUSUNfQVNTRVJUKHNpemVvZihfX3N0bF9hdG9taWNfdCkgPT0gc2l6ZW9mKHZvaWQqKSkKKyAgcmV0dXJuIF9fUkVJTlRFUlBSRVRfQ0FTVCh2b2lkKiwgX1NUTFBfQVRPTUlDX0VYQ0hBTkdFKF9fUkVJTlRFUlBSRVRfQ0FTVCh2b2xhdGlsZSBfX3N0bF9hdG9taWNfdCosIF9fcCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX1JFSU5URVJQUkVUX0NBU1QoX19zdGxfYXRvbWljX3QsIF9fcSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyMgIGVsaWYgZGVmaW5lZCAoX1NUTFBfVVNFX0FUT01JQ19TV0FQX01VVEVYKQorICBfU19zd2FwX2xvY2suX01fYWNxdWlyZV9sb2NrKCk7CisgIHZvaWQgKl9fcmVzdWx0ID0gKl9fcDsKKyAgKl9fcCA9IF9fcTsKKyAgX1Nfc3dhcF9sb2NrLl9NX3JlbGVhc2VfbG9jaygpOworICByZXR1cm4gX19yZXN1bHQ7CisjICBlbHNlCisjICAgIGVycm9yIE1pc3NpbmcgcG9pbnRlciBhdG9taWMgc3dhcCBpbXBsZW1lbnRhdGlvbgorIyAgZW5kaWYKKyNlbHNlCisgIC8qIG5vIHRocmVhZCAqLworICB2b2lkICpfX3Jlc3VsdCA9ICpfX3A7CisgICpfX3AgPSBfX3E7CisgIHJldHVybiBfX3Jlc3VsdDsKKyNlbmRpZgorICB9Cit9OworCitfU1RMUF9URU1QTEFURV9OVUxMCitjbGFzcyBfQXRvbWljX3N3YXBfc3RydWN0PDA+IHsKK3B1YmxpYzoKKyNpZiBkZWZpbmVkIChfU1RMUF9USFJFQURTKSAmJiBcCisgICAgKCFkZWZpbmVkIChfU1RMUF9BVE9NSUNfRVhDSEFOR0UpIHx8ICFkZWZpbmVkIChfU1RMUF9BVE9NSUNfRVhDSEFOR0VfUFRSKSkgJiYgXAorICAgIChkZWZpbmVkIChfU1RMUF9QVEhSRUFEUykgfHwgZGVmaW5lZCAoX1NUTFBfVUlUSFJFQURTKSB8fCBkZWZpbmVkIChfU1RMUF9PUzJUSFJFQURTKSB8fCBcCisgICAgIGRlZmluZWQgKF9TVExQX1VTRV9QVEhSRUFEX1NQSU5MT0NLKSB8fCBkZWZpbmVkIChfU1RMUF9OV1RIUkVBRFMpKQorIyAgZGVmaW5lIF9TVExQX1VTRV9BVE9NSUNfU1dBUF9NVVRFWAorICBzdGF0aWMgX1NUTFBfU1RBVElDX01VVEVYIF9TX3N3YXBfbG9jazsKKyNlbmRpZgorCisgIHN0YXRpYyBfX3N0bF9hdG9taWNfdCBfU19zd2FwKF9TVExQX1ZPTEFUSUxFIF9fc3RsX2F0b21pY190KiBfX3AsIF9fc3RsX2F0b21pY190IF9fcSkgeworI2lmIGRlZmluZWQgKF9TVExQX1RIUkVBRFMpCisjICBpZiBkZWZpbmVkIChfU1RMUF9BVE9NSUNfRVhDSEFOR0UpCisgIHJldHVybiBfU1RMUF9BVE9NSUNfRVhDSEFOR0UoX19wLCBfX3EpOworIyAgZWxpZiBkZWZpbmVkIChfU1RMUF9VU0VfQVRPTUlDX1NXQVBfTVVURVgpCisgIC8qIFRoaXMgc2hvdWxkIGJlIHBvcnRhYmxlLCBidXQgcGVyZm9ybWFuY2UgaXMgZXhwZWN0ZWQKKyAgICogdG8gYmUgcXVpdGUgYXdmdWwuICBUaGlzIHJlYWxseSBuZWVkcyBwbGF0Zm9ybSBzcGVjaWZpYworICAgKiBjb2RlLgorICAgKi8KKyAgX1Nfc3dhcF9sb2NrLl9NX2FjcXVpcmVfbG9jaygpOworICBfX3N0bF9hdG9taWNfdCBfX3Jlc3VsdCA9ICpfX3A7CisgICpfX3AgPSBfX3E7CisgIF9TX3N3YXBfbG9jay5fTV9yZWxlYXNlX2xvY2soKTsKKyAgcmV0dXJuIF9fcmVzdWx0OworIyAgZWxzZQorIyAgICBlcnJvciBNaXNzaW5nIGF0b21pYyBzd2FwIGltcGxlbWVudGF0aW9uCisjICBlbmRpZgorI2Vsc2UKKyAgLyogbm8gdGhyZWFkcyAqLworICBfX3N0bF9hdG9taWNfdCBfX3Jlc3VsdCA9ICpfX3A7CisgICpfX3AgPSBfX3E7CisgIHJldHVybiBfX3Jlc3VsdDsKKyNlbmRpZiAvLyBfU1RMUF9USFJFQURTCisgIH0KKworICBzdGF0aWMgdm9pZCogX1Nfc3dhcF9wdHIodm9pZCogX1NUTFBfVk9MQVRJTEUqIF9fcCwgdm9pZCogX19xKSB7CisjaWYgZGVmaW5lZCAoX1NUTFBfVEhSRUFEUykKKyMgIGlmIGRlZmluZWQgKF9TVExQX0FUT01JQ19FWENIQU5HRV9QVFIpCisgIHJldHVybiBfU1RMUF9BVE9NSUNfRVhDSEFOR0VfUFRSKF9fcCwgX19xKTsKKyMgIGVsaWYgZGVmaW5lZCAoX1NUTFBfQVRPTUlDX0VYQ0hBTkdFKQorICBfU1RMUF9TVEFUSUNfQVNTRVJUKHNpemVvZihfX3N0bF9hdG9taWNfdCkgPT0gc2l6ZW9mKHZvaWQqKSkKKyAgcmV0dXJuIF9fUkVJTlRFUlBSRVRfQ0FTVCh2b2lkKiwgX1NUTFBfQVRPTUlDX0VYQ0hBTkdFKF9fUkVJTlRFUlBSRVRfQ0FTVCh2b2xhdGlsZSBfX3N0bF9hdG9taWNfdCosIF9fcCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX1JFSU5URVJQUkVUX0NBU1QoX19zdGxfYXRvbWljX3QsIF9fcSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyMgIGVsaWYgZGVmaW5lZCAoX1NUTFBfVVNFX0FUT01JQ19TV0FQX01VVEVYKQorICBfU19zd2FwX2xvY2suX01fYWNxdWlyZV9sb2NrKCk7CisgIHZvaWQgKl9fcmVzdWx0ID0gKl9fcDsKKyAgKl9fcCA9IF9fcTsKKyAgX1Nfc3dhcF9sb2NrLl9NX3JlbGVhc2VfbG9jaygpOworICByZXR1cm4gX19yZXN1bHQ7CisjICBlbHNlCisjICAgIGVycm9yIE1pc3NpbmcgcG9pbnRlciBhdG9taWMgc3dhcCBpbXBsZW1lbnRhdGlvbgorIyAgZW5kaWYKKyNlbHNlCisgIC8qIG5vIHRocmVhZCAqLworICB2b2lkICpfX3Jlc3VsdCA9ICpfX3A7CisgICpfX3AgPSBfX3E7CisgIHJldHVybiBfX3Jlc3VsdDsKKyNlbmRpZgorICB9Cit9OworCisjaWYgZGVmaW5lZCAoX1NUTFBfTVNWQykgJiYgKF9TVExQX01TVkMgPT0gMTMwMCkKKyMgIHByYWdtYSB3YXJuaW5nIChwdXNoKQorIyAgcHJhZ21hIHdhcm5pbmcgKGRpc2FibGUgOiA0MTg5KSAvL19fdXNlX3B0cl9hdG9taWNfc3dhcCBpbml0aWFsaXplZCBidXQgbm90IHVzZWQKKyNlbmRpZgorCitpbmxpbmUgX19zdGxfYXRvbWljX3QgX1NUTFBfQ0FMTCBfQXRvbWljX3N3YXAoX1NUTFBfVk9MQVRJTEUgX19zdGxfYXRvbWljX3QgKiBfX3AsIF9fc3RsX2F0b21pY190IF9fcSkgeworICBjb25zdCBpbnQgX191c2VfcHRyX2F0b21pY19zd2FwID0gc2l6ZW9mKF9fc3RsX2F0b21pY190KSA9PSBzaXplb2Yodm9pZCopOworICByZXR1cm4gX0F0b21pY19zd2FwX3N0cnVjdDxfX3VzZV9wdHJfYXRvbWljX3N3YXA+OjpfU19zd2FwKF9fcCwgX19xKTsKK30KKworaW5saW5lIHZvaWQqIF9TVExQX0NBTEwgX0F0b21pY19zd2FwX3B0cih2b2lkKiBfU1RMUF9WT0xBVElMRSogX19wLCB2b2lkKiBfX3EpIHsKKyAgY29uc3QgaW50IF9fdXNlX3B0cl9hdG9taWNfc3dhcCA9IHNpemVvZihfX3N0bF9hdG9taWNfdCkgPT0gc2l6ZW9mKHZvaWQqKTsKKyAgcmV0dXJuIF9BdG9taWNfc3dhcF9zdHJ1Y3Q8X191c2VfcHRyX2F0b21pY19zd2FwPjo6X1Nfc3dhcF9wdHIoX19wLCBfX3EpOworfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfTVNWQykgJiYgKF9TVExQX01TVkMgPT0gMTMwMCkKKyMgIHByYWdtYSB3YXJuaW5nIChwb3ApCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX0JFVEhSRUFEUykKK3RlbXBsYXRlIDxpbnQgX19pbnN0Pgorc3RydWN0IF9TVExQX2Jlb3Nfc3RhdGljX2xvY2tfZGF0YSB7CisgIHN0YXRpYyBib29sIGlzX2luaXQ7CisgIHN0cnVjdCBtdXRleF90IDogcHVibGljIF9TVExQX211dGV4IHsKKyAgICBtdXRleF90KCkKKyAgICB7IF9TVExQX2Jlb3Nfc3RhdGljX2xvY2tfZGF0YTwwPjo6aXNfaW5pdCA9IHRydWU7IH0KKyAgICB+bXV0ZXhfdCgpCisgICAgeyBfU1RMUF9iZW9zX3N0YXRpY19sb2NrX2RhdGE8MD46OmlzX2luaXQgPSBmYWxzZTsgfQorICB9OworICBzdGF0aWMgbXV0ZXhfdCBtdXQ7Cit9OworCit0ZW1wbGF0ZSA8aW50IF9faW5zdD4KK2Jvb2wgX1NUTFBfYmVvc19zdGF0aWNfbG9ja19kYXRhPF9faW5zdD46OmlzX2luaXQgPSBmYWxzZTsKK3RlbXBsYXRlIDxpbnQgX19pbnN0PgordHlwZW5hbWUgX1NUTFBfYmVvc19zdGF0aWNfbG9ja19kYXRhPF9faW5zdD46Om11dGV4X3QgX1NUTFBfYmVvc19zdGF0aWNfbG9ja19kYXRhPF9faW5zdD46Om11dDsKKworaW5saW5lIHZvaWQgX1NUTFBfbXV0ZXhfYmFzZTo6X01fYWNxdWlyZV9sb2NrKCkgeworICBpZiAoc2VtID09IDApIHsKKyAgICAvLyB3ZSBuZWVkIHRvIGluaXRpYWxpc2Ugb24gZGVtYW5kIGhlcmUKKyAgICAvLyB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9ucyB1c2Ugb3VyIGdsb2JhbAorICAgIC8vIG11dGV4IGlmIGl0J3MgYXZhaWxhYmxlOgorICAgIGlmIChfU1RMUF9iZW9zX3N0YXRpY19sb2NrX2RhdGE8MD46OmlzX2luaXQpIHsKKyAgICAgIF9TVExQX2F1dG9fbG9jayBhbChfU1RMUF9iZW9zX3N0YXRpY19sb2NrX2RhdGE8MD46Om11dCk7CisgICAgICBpZiAoc2VtID09IDApIF9NX2luaXRpYWxpemUoKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAvLyBubyBsb2NrIGF2YWlsYWJsZSwgd2UgbXVzdCBzdGlsbCBiZQorICAgICAgLy8gaW4gc3RhcnR1cCBjb2RlLCBUSEVSRSBNVVNUIEJFIE9ORSBUSFJFQUQKKyAgICAgIC8vIE9OTFkgYWN0aXZlIGF0IHRoaXMgcG9pbnQuCisgICAgICBfTV9pbml0aWFsaXplKCk7CisgICAgfQorICB9CisgIHN0YXR1c190IHQ7CisgIHQgPSBhY3F1aXJlX3NlbShzZW0pOworICBhc3NlcnQodCA9PSBCX05PX0VSUk9SKTsKK30KKyNlbmRpZgorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTElOS19USU1FX0lOU1RBTlRJQVRJT04pCisjICBpbmNsdWRlIDxzdGwvX3RocmVhZHMuYz4KKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfVEhSRUFEU19IICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9fdGltZV9mYWNldHMuYyBiL3N0bHBvcnQvc3RsL190aW1lX2ZhY2V0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MDM4MTcKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9fdGltZV9mYWNldHMuYwpAQCAtMCwwICsxLDQ0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKyNpZm5kZWYgX1NUTFBfVElNRV9GQUNFVFNfQworI2RlZmluZSBfU1RMUF9USU1FX0ZBQ0VUU19DCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfVElNRV9GQUNFVFNfSAorIyAgaW5jbHVkZSA8c3RsL190aW1lX2ZhY2V0cy5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfTlVNX1BVVF9ICisjICBpbmNsdWRlIDxzdGwvX251bV9wdXQuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX05VTV9HRVRfSAorIyAgaW5jbHVkZSA8c3RsL19udW1fZ2V0Lmg+CisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRGVjbGFyYXRpb25zIG9mIHN0YXRpYyB0ZW1wbGF0ZSBtZW1iZXJzLgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfSW5wdXRJdGVyYXRvcj4KK2xvY2FsZTo6aWQgdGltZV9nZXQ8X0NoYXJULCBfSW5wdXRJdGVyYXRvcj46OmlkOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfT3V0cHV0SXRlcmF0b3I+Citsb2NhbGU6OmlkIHRpbWVfcHV0PF9DaGFyVCwgX091dHB1dEl0ZXJhdG9yPjo6aWQ7CisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKworLyogTWF0Y2hpbmcgaW5wdXQgYWdhaW5zdCBhIGxpc3Qgb2YgbmFtZXMKKworICogQWxwaGFiZXRpYyBpbnB1dCBvZiB0aGUgbmFtZXMgb2YgbW9udGhzIGFuZCB0aGUgbmFtZXMKKyAqIG9mIHdlZWtkYXlzIHJlcXVpcmVzIG1hdGNoaW5nIGlucHV0IGFnYWluc3QgYSBsaXN0IG9mIG5hbWVzLgorICogV2UgdXNlIGEgc2ltcGxlIGdlbmVyaWMgYWxnb3JpdGhtIHRvIGFjY29tcGxpc2ggdGhpcy4gIFRoaXMKKyAqIGFsZ29yaXRobSBpcyBub3QgdmVyeSBlZmZpY2llbnQsIGVzcGVjaWFsbHkgZm9yIGxvbmdlciBsaXN0cworICogb2YgbmFtZXMsIGJ1dCBpdCBwcm9iYWJseSBkb2VzIG5vdCBtYXR0ZXIgZm9yIHRoZSBpbml0aWFsCisgKiBpbXBsZW1lbnRhdGlvbiBhbmQgaXQgbWF5IG5ldmVyIG1hdHRlciwgc2luY2Ugd2UgZG8gbm90IGV4cGVjdAorICogdGhpcyBraW5kIG9mIGlucHV0IHRvIGJlIHVzZWQgdmVyeSBvZnRlbi4gIFRoZSBhbGdvcml0aG0KKyAqIGNvdWxkIGJlIGltcHJvdmVkIGZhaXJseSBzaW1wbHkgYnkgY3JlYXRpbmcgYSBuZXcgbGlzdCBvZgorICogbmFtZXMgc3RpbGwgaW4gdGhlIHJ1bm5pbmcgYXQgZWFjaCBpdGVyYXRpb24uICBBIG1vcmUgc29waGlzdGljYXRlZAorICogYXBwcm9hY2ggd291bGQgYmUgdG8gYnVpbGQgYSB0cmVlIHRvIGRvIHRoZSBtYXRjaGluZy4KKyAqCisgKiBXZSBjb21wYXJlIGVhY2ggY2hhcmFjdGVyIG9mIHRoZSBpbnB1dCB0byB0aGUgY29ycmVzcG9uZGluZworICogY2hhcmFjdGVyIG9mIGVhY2ggbmFtZSBvbiB0aGUgbGlzdCB0aGF0IGhhcyBub3QgYmVlbiBlbGltaW5hdGVkLAorICogZWl0aGVyIGJlY2F1c2UgZXZlcnkgY2hhcmFjdGVyIGluIHRoZSBuYW1lIGhhcyBhbHJlYWR5IGJlZW4KKyAqIG1hdGNoZWQsIG9yIGJlY2F1c2Ugc29tZSBjaGFyYWN0ZXIgaGFzIG5vdCBiZWVuIG1hdGNoZWQuICBXZQorICogY29udGludWUgb25seSBhcyBsb25nIGFzIHRoZXJlIGFyZSBzb21lIG5hbWVzIHRoYXQgaGF2ZSBub3QgYmVlbgorICogZWxpbWluYXRlZC4KKworICogV2UgZG8gbm90IHJlYWxseSBuZWVkIGEgcmFuZG9tIGFjY2VzcyBpdGVyYXRvciAoYSBmb3J3YXJkIGl0ZXJhdG9yCisgKiB3b3VsZCBkbyksIGJ1dCB0aGUgZXh0cmEgZ2VuZXJhbGl0eSBtYWtlcyB0aGUgbm90YXRpb24gY2x1bXNpZXIsCisgKiBhbmQgd2UgZG9uJ3QgcmVhbGx5IG5lZWQgaXQuCisKKyAqIFdlIGNhbiByZWNvZ25pemUgYSBmYWlsZWQgbWF0Y2ggYnkgdGhlIGZhY3QgdGhhdCB0aGUgcmV0dXJuIHZhbHVlCisgKiB3aWxsIGJlIF9fbmFtZV9lbmQuCisgKi8KKworI2RlZmluZSBfTUFYTkFNRVMgICAgICAgIDI0CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5JdCwgY2xhc3MgX05hbWVJdD4KK3NpemVfdCBfU1RMUF9DQUxMCitfX21hdGNoKF9Jbkl0JiBfX2ZpcnN0LCBfSW5JdCYgX19sYXN0LCBfTmFtZUl0IF9fbmFtZSwgX05hbWVJdCBfX25hbWVfZW5kKSB7CisgIHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKKyAgZGlmZmVyZW5jZV90eXBlIF9fbiA9IF9fbmFtZV9lbmQgLSBfX25hbWU7CisgIGRpZmZlcmVuY2VfdHlwZSBfX2ksIF9fc3RhcnQgPSAwOworICBzaXplX3QgX19wb3MgPSAwOworICBkaWZmZXJlbmNlX3R5cGUgX19jaGVja19jb3VudCA9IF9fbjsKKyAgYm9vbCBfX2RvX25vdF9jaGVja1tfTUFYTkFNRVNdOworICBzaXplX3QgX19tYXRjaGluZ19uYW1lX2luZGV4ID0gX19uOworCisgIG1lbXNldChfX2RvX25vdF9jaGVjaywgMCwgc2l6ZW9mKF9fZG9fbm90X2NoZWNrKSk7CisKKyAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0KSB7CisgICAgZGlmZmVyZW5jZV90eXBlIF9fbmV3X24gPSBfX247CisgICAgZm9yIChfX2kgPSBfX3N0YXJ0OyBfX2kgPCBfX247ICsrX19pKSB7CisgICAgICBpZiAoIV9fZG9fbm90X2NoZWNrW19faV0pIHsKKyAgICAgICAgaWYgKCpfX2ZpcnN0ID09IF9fbmFtZVtfX2ldW19fcG9zXSkgeworICAgICAgICAgIGlmIChfX3BvcyA9PSAoX19uYW1lW19faV0uc2l6ZSgpIC0gMSkpIHsKKyAgICAgICAgICAgIF9fbWF0Y2hpbmdfbmFtZV9pbmRleCA9IF9faTsKKyAgICAgICAgICAgIF9fZG9fbm90X2NoZWNrW19faV0gPSB0cnVlOworICAgICAgICAgICAgaWYgKF9faSA9PSBfX3N0YXJ0KSArK19fc3RhcnQ7CisgICAgICAgICAgICAtLV9fY2hlY2tfY291bnQ7CisgICAgICAgICAgICBpZiAoX19jaGVja19jb3VudCA9PSAwKSB7CisgICAgICAgICAgICAgICsrX19maXJzdDsKKyAgICAgICAgICAgICAgcmV0dXJuIF9fbWF0Y2hpbmdfbmFtZV9pbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgX19uZXdfbiA9IF9faSArIDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgX19kb19ub3RfY2hlY2tbX19pXSA9IHRydWU7CisgICAgICAgICAgaWYgKF9faSA9PSBfX3N0YXJ0KSArK19fc3RhcnQ7CisgICAgICAgICAgLS1fX2NoZWNrX2NvdW50OworICAgICAgICAgIGlmIChfX2NoZWNrX2NvdW50ID09IDApCisgICAgICAgICAgICByZXR1cm4gX19tYXRjaGluZ19uYW1lX2luZGV4OworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgaWYgKF9faSA9PSBfX3N0YXJ0KSArKyBfX3N0YXJ0OworICAgICAgfQorICAgIH0KKworICAgIF9fbiA9IF9fbmV3X247CisgICAgKytfX2ZpcnN0OyArK19fcG9zOworICB9CisKKyAgcmV0dXJuIF9fbWF0Y2hpbmdfbmFtZV9pbmRleDsKK30KKworLy8gX19nZXRfZm9ybWF0dGVkX3RpbWUgcmVhZHMgaW5wdXQgdGhhdCBpcyBhc3N1bWVkIHRvIGJlIGZvcm1hdHRlZAorLy8gYWNjb3JkaW5nIHRvIHRoZSBydWxlcyBmb3IgdGhlIEMgc3RyZnRpbWUgZnVuY3Rpb24gKEMgc3RhbmRhcmQsCisvLyA3LjEyLjMuNSkuICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBkb19nZXRfdGltZQorLy8gYW5kIGRvX2dldF9kYXRlIHZpcnR1YWwgZnVuY3Rpb25zLCB3aGljaCBkZXBlbmQgb24gdGhlIGxvY2FsZQorLy8gc3BlY2lmaWNhdGlvbnMgZm9yIHRoZSB0aW1lIGFuZCBkYXkgZm9ybWF0cyByZXNwZWN0aXZlbHkuCisvLyBOb3RlIHRoZSBjYXRjaGFsbCBkZWZhdWx0IGNhc2UsIGludGVuZGVkIG1haW5seSBmb3IgdGhlICclWicKKy8vIGZvcm1hdCBkZXNpZ25hdG9yLCB3aGljaCBkb2VzIG5vdCBtYWtlIHNlbnNlIGhlcmUgc2luY2UgdGhlCisvLyByZXByZXNlbnRhdGlvbiBvZiB0aW1lem9uZXMgaXMgbm90IHBhcnQgb2YgdGhlIGxvY2FsZS4KKy8vCisvLyBUaGUgY2FzZSBicmFuY2hlcyBhcmUgaW1wbGVtZW50ZWQgZWl0aGVyIGJ5IGRvaW5nIGEgbWF0Y2ggdXNpbmcKKy8vIHRoZSBhcHBvcHJpYXRlIG5hbWUgdGFibGUgb3IgYnkgZG9pbmcgYSBfX2dldF9pbnRlZ2VyX25vZ3JvdXAuCisvLworLy8gJ3knIGZvcm1hdCBpcyBhc3N1bWVkIHRvIG1lYW4gdGhhdCB0aGUgaW5wdXQgcmVwcmVzZW50cyB5ZWFycworLy8gc2luY2UgMTkwMC4gIFRoYXQgaXMsIDIwMDIgc2hvdWxkIGJlIHJlcHJlc2VudGVkIGFzIDEwMi4gIFRoZXJlCisvLyBpcyBubyBjZW50dXJ5LWd1ZXNzaW5nLgorLy8KKy8vIFRoZSBtYXRjaCBpcyBzdWNjZXNzZnVsIGlmIGFuZCBvbmx5IGlmIHRoZSBzZWNvbmQgY29tcG9uZW50IG9mIHRoZQorLy8gcmV0dXJuIHZhbHVlIGlzIGZvcm1hdF9lbmQuCisKKy8vIE5vdGUgdGhhdCB0aGUgYW50ZXBlbnVsdGltYXRlIHBhcmFtZXRlciBpcyBiZWluZyB1c2VkIG9ubHkgdG8gZGV0ZXJtaW5lCisvLyB0aGUgY29ycmVjdCBvdmVybG9hZGluZyBmb3IgdGhlIGNhbGxzIHRvIF9fZ2V0X2ludGVnZXJfbm9ncm91cC4KK3RlbXBsYXRlIDxjbGFzcyBfSW5JdDEsIGNsYXNzIF9DaCwgY2xhc3MgX1RpbWVJbmZvPgorc3RyaW5nOjpjb25zdF9pdGVyYXRvciBfU1RMUF9DQUxMCitfX2dldF9mb3JtYXR0ZWRfdGltZSBfU1RMUF9XRUFLIChfSW5JdDEgX19maXJzdCwgIF9Jbkl0MSBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIF9fZm9ybWF0LCBzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIF9fZm9ybWF0X2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DaCosIGNvbnN0IF9UaW1lSW5mbyYgX190YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlvc19iYXNlJiBfX3MsIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgdG0qIF9fdCkgeworICBjb25zdCBjdHlwZTxfQ2g+JiBfX2N0ID0gdXNlX2ZhY2V0PGN0eXBlPF9DaD4gPihfX3MuZ2V0bG9jKCkpOworICB0eXBlZGVmIGJhc2ljX3N0cmluZzxfQ2gsIGNoYXJfdHJhaXRzPF9DaD4sIGFsbG9jYXRvcjxfQ2g+ID4gc3RyaW5nX3R5cGU7CisgIHNpemVfdCBvZmZzZXQ7CisKKyAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0ICYmIF9fZm9ybWF0ICE9IF9fZm9ybWF0X2VuZCkgeworICAgIG9mZnNldCA9IDA7CisgICAgaWYgKCpfX2Zvcm1hdCA9PSAnJScpIHsKKyAgICAgICsrX19mb3JtYXQ7CisgICAgICBjaGFyIF9fYyA9ICpfX2Zvcm1hdDsKKyAgICAgIGlmIChfX2MgPT0gJyMnKSB7IC8vTVMgZXh0ZW5zaW9uCisgICAgICAgICsrX19mb3JtYXQ7CisgICAgICAgIF9fYyA9ICpfX2Zvcm1hdDsKKyAgICAgIH0KKworICAgICAgc3dpdGNoIChfX2MpIHsKKyAgICAgICAgY2FzZSAnQSc6CisgICAgICAgICAgb2Zmc2V0ID0gNzsKKyAgICAgICAgY2FzZSAnYSc6IHsKKyAgICAgICAgICBzaXplX3QgX19pbmRleCA9IF9fbWF0Y2goX19maXJzdCwgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3RhYmxlLl9NX2RheW5hbWUgKyBvZmZzZXQsIF9fdGFibGUuX01fZGF5bmFtZSArIG9mZnNldCArIDcpOworICAgICAgICAgIGlmIChfX2luZGV4ID09IDcpCisgICAgICAgICAgICByZXR1cm4gX19mb3JtYXQ7CisgICAgICAgICAgX190LT50bV93ZGF5ID0gX19TVEFUSUNfQ0FTVChpbnQsIF9faW5kZXgpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSAnQic6CisgICAgICAgICAgb2Zmc2V0ID0gMTI7CisgICAgICAgIGNhc2UgJ2InOiB7CisgICAgICAgICAgc2l6ZV90IF9faW5kZXggPSBfX21hdGNoKF9fZmlyc3QsIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX190YWJsZS5fTV9tb250aG5hbWUgKyBvZmZzZXQsIF9fdGFibGUuX01fbW9udGhuYW1lICsgb2Zmc2V0ICsgMTIpOworICAgICAgICAgIGlmIChfX2luZGV4ID09IDEyKQorICAgICAgICAgICAgcmV0dXJuIF9fZm9ybWF0OworICAgICAgICAgIF9fdC0+dG1fbW9uID0gX19TVEFUSUNfQ0FTVChpbnQsIF9faW5kZXgpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSAnZCc6IHsKKyAgICAgICAgICBib29sIF9fcHIgPSBfX2dldF9kZWNpbWFsX2ludGVnZXIoX19maXJzdCwgX19sYXN0LCBfX3QtPnRtX21kYXksIF9fU1RBVElDX0NBU1QoX0NoKiwgMCkpOworICAgICAgICAgIGlmICghX19wciB8fCBfX3QtPnRtX21kYXkgPCAxIHx8IF9fdC0+dG1fbWRheSA+IDMxKSB7CisgICAgICAgICAgICBfX2VyciB8PSBpb3NfYmFzZTo6ZmFpbGJpdDsKKyAgICAgICAgICAgIHJldHVybiBfX2Zvcm1hdDsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlICdIJzogY2FzZSAnSSc6IHsKKyAgICAgICAgICBib29sIF9fcHIgPSBfX2dldF9kZWNpbWFsX2ludGVnZXIoX19maXJzdCwgX19sYXN0LCBfX3QtPnRtX2hvdXIsIF9fU1RBVElDX0NBU1QoX0NoKiwgMCkpOworICAgICAgICAgIGlmICghX19wcikKKyAgICAgICAgICAgIHJldHVybiBfX2Zvcm1hdDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgJ2onOiB7CisgICAgICAgICAgYm9vbCBfX3ByID0gX19nZXRfZGVjaW1hbF9pbnRlZ2VyKF9fZmlyc3QsIF9fbGFzdCwgX190LT50bV95ZGF5LCBfX1NUQVRJQ19DQVNUKF9DaCosIDApKTsKKyAgICAgICAgICBpZiAoIV9fcHIpCisgICAgICAgICAgICByZXR1cm4gX19mb3JtYXQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlICdtJzogeworICAgICAgICAgIGJvb2wgX19wciA9IF9fZ2V0X2RlY2ltYWxfaW50ZWdlcihfX2ZpcnN0LCBfX2xhc3QsIF9fdC0+dG1fbW9uLCBfX1NUQVRJQ19DQVNUKF9DaCosIDApKTsKKyAgICAgICAgICAtLV9fdC0+dG1fbW9uOworICAgICAgICAgIGlmICghX19wciB8fCBfX3QtPnRtX21vbiA8IDAgfHwgX190LT50bV9tb24gPiAxMSkgeworICAgICAgICAgICAgX19lcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisgICAgICAgICAgICByZXR1cm4gX19mb3JtYXQ7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSAnTSc6IHsKKyAgICAgICAgICBib29sIF9fcHIgPSBfX2dldF9kZWNpbWFsX2ludGVnZXIoX19maXJzdCwgX19sYXN0LCBfX3QtPnRtX21pbiwgX19TVEFUSUNfQ0FTVChfQ2gqLCAwKSk7CisgICAgICAgICAgaWYgKCFfX3ByKQorICAgICAgICAgICAgcmV0dXJuIF9fZm9ybWF0OworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSAncCc6IHsKKyAgICAgICAgICBzaXplX3QgX19pbmRleCA9IF9fbWF0Y2goX19maXJzdCwgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3RhYmxlLl9NX2FtX3BtICsgMCwgX190YWJsZS5fTV9hbV9wbSArIDIpOworICAgICAgICAgIGlmIChfX2luZGV4ID09IDIpCisgICAgICAgICAgICByZXR1cm4gX19mb3JtYXQ7CisgICAgICAgICAgLy8gMTI6MDAgUE0gPD0+IDEyOjAwLCAxMjowMCBBTSA8PT4gMDA6MDAKKyAgICAgICAgICBpZiAoX19pbmRleCA9PSAxICYmIF9fdC0+dG1faG91ciAhPSAxMiApCisgICAgICAgICAgICBfX3QtPnRtX2hvdXIgKz0gMTI7CisgICAgICAgICAgaWYgKF9faW5kZXggPT0gMCAmJiBfX3QtPnRtX2hvdXIgPT0gMTIgKQorICAgICAgICAgICAgX190LT50bV9ob3VyID0gMDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgJ1MnOiB7CisgICAgICAgICAgYm9vbCBfX3ByID0gX19nZXRfZGVjaW1hbF9pbnRlZ2VyKF9fZmlyc3QsIF9fbGFzdCwgX190LT50bV9zZWMsIF9fU1RBVElDX0NBU1QoX0NoKiwgMCkpOworICAgICAgICAgIGlmICghX19wcikKKyAgICAgICAgICAgIHJldHVybiBfX2Zvcm1hdDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgJ3knOiB7CisgICAgICAgICAgYm9vbCBfX3ByID0gX19nZXRfZGVjaW1hbF9pbnRlZ2VyKF9fZmlyc3QsIF9fbGFzdCwgX190LT50bV95ZWFyLCBfX1NUQVRJQ19DQVNUKF9DaCosIDApKTsKKyAgICAgICAgICBpZiAoIV9fcHIpCisgICAgICAgICAgICByZXR1cm4gX19mb3JtYXQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlICdZJzogeworICAgICAgICAgIGJvb2wgX19wciA9IF9fZ2V0X2RlY2ltYWxfaW50ZWdlcihfX2ZpcnN0LCBfX2xhc3QsIF9fdC0+dG1feWVhciwgX19TVEFUSUNfQ0FTVChfQ2gqLCAwKSk7CisgICAgICAgICAgX190LT50bV95ZWFyIC09IDE5MDA7CisgICAgICAgICAgaWYgKCFfX3ByKQorICAgICAgICAgICAgcmV0dXJuIF9fZm9ybWF0OworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICBpZiAoKl9fZmlyc3QrKyAhPSBfX2N0LndpZGVuKCpfX2Zvcm1hdCkpIGJyZWFrOworICAgIH0KKworICAgICsrX19mb3JtYXQ7CisgIH0KKworICByZXR1cm4gX19mb3JtYXQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5JdCwgY2xhc3MgX1RpbWVJbmZvPgorYm9vbCBfU1RMUF9DQUxMCitfX2dldF9zaG9ydF9vcl9sb25nX2RheW5hbWUoX0luSXQmIF9fZmlyc3QsIF9Jbkl0JiBfX2xhc3QsIGNvbnN0IF9UaW1lSW5mbyYgX190YWJsZSwgdG0qIF9fdCkgeworICBzaXplX3QgX19pbmRleCA9IF9fbWF0Y2goX19maXJzdCwgX19sYXN0LCBfX3RhYmxlLl9NX2RheW5hbWUgKyAwLCBfX3RhYmxlLl9NX2RheW5hbWUgKyAxNCk7CisgIGlmIChfX2luZGV4ICE9IDE0KSB7CisgICAgX190LT50bV93ZGF5ID0gX19TVEFUSUNfQ0FTVChpbnQsIF9faW5kZXggJSA3KTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5JdCwgY2xhc3MgX1RpbWVJbmZvPgorYm9vbCBfU1RMUF9DQUxMCitfX2dldF9zaG9ydF9vcl9sb25nX21vbnRobmFtZShfSW5JdCYgX19maXJzdCwgX0luSXQmIF9fbGFzdCwgY29uc3QgX1RpbWVJbmZvJiBfX3RhYmxlLCB0bSogX190KSB7CisgIHNpemVfdCBfX2luZGV4ID0gX19tYXRjaChfX2ZpcnN0LCBfX2xhc3QsIF9fdGFibGUuX01fbW9udGhuYW1lICsgMCwgX190YWJsZS5fTV9tb250aG5hbWUgKyAyNCk7CisgIGlmIChfX2luZGV4ICE9IDI0KSB7CisgICAgX190LT50bV9tb24gPSBfX1NUQVRJQ19DQVNUKGludCwgX19pbmRleCAlIDEyKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoLCBjbGFzcyBfSW5JdD4KK19Jbkl0Cit0aW1lX2dldDxfQ2gsIF9Jbkl0Pjo6ZG9fZ2V0X2RhdGUoX0luSXQgX19zLCBfSW5JdCAgX19lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2UmIF9fc3RyLCBpb3NfYmFzZTo6aW9zdGF0ZSYgIF9fZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtKiBfX3QpIGNvbnN0IHsKKyAgdHlwZWRlZiBzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIHN0cmluZ19pdGVyYXRvcjsKKworICBzdHJpbmdfaXRlcmF0b3IgX19mb3JtYXQgPSB0aGlzLT5fTV90aW1laW5mby5fTV9kYXRlX2Zvcm1hdC5iZWdpbigpOworICBzdHJpbmdfaXRlcmF0b3IgX19mb3JtYXRfZW5kID0gdGhpcy0+X01fdGltZWluZm8uX01fZGF0ZV9mb3JtYXQuZW5kKCk7CisKKyAgc3RyaW5nX2l0ZXJhdG9yIF9fcmVzdWx0CisgICAgPSBfU1RMUF9QUklWIF9fZ2V0X2Zvcm1hdHRlZF90aW1lKF9fcywgX19lbmQsIF9fZm9ybWF0LCBfX2Zvcm1hdF9lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fU1RBVElDX0NBU1QoX0NoKiwgMCksIHRoaXMtPl9NX3RpbWVpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3N0ciwgX19lcnIsIF9fdCk7CisgIGlmIChfX3Jlc3VsdCA9PSBfX2Zvcm1hdF9lbmQpCisgICAgX19lcnIgPSBpb3NfYmFzZTo6Z29vZGJpdDsKKyAgZWxzZSB7CisgICAgX19lcnIgPSBpb3NfYmFzZTo6ZmFpbGJpdDsKKyAgICBpZiAoX19zID09IF9fZW5kKQorICAgICAgX19lcnIgfD0gaW9zX2Jhc2U6OmVvZmJpdDsKKyAgfQorICByZXR1cm4gX19zOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoLCBjbGFzcyBfSW5JdD4KK19Jbkl0Cit0aW1lX2dldDxfQ2gsIF9Jbkl0Pjo6ZG9fZ2V0X3RpbWUoX0luSXQgX19zLCBfSW5JdCAgX19lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2UmIF9fc3RyLCBpb3NfYmFzZTo6aW9zdGF0ZSYgIF9fZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtKiBfX3QpIGNvbnN0IHsKKyAgdHlwZWRlZiBzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIHN0cmluZ19pdGVyYXRvcjsKKyAgc3RyaW5nX2l0ZXJhdG9yIF9fZm9ybWF0ID0gdGhpcy0+X01fdGltZWluZm8uX01fdGltZV9mb3JtYXQuYmVnaW4oKTsKKyAgc3RyaW5nX2l0ZXJhdG9yIF9fZm9ybWF0X2VuZCA9IHRoaXMtPl9NX3RpbWVpbmZvLl9NX3RpbWVfZm9ybWF0LmVuZCgpOworCisgIHN0cmluZ19pdGVyYXRvciBfX3Jlc3VsdAorICAgID0gX1NUTFBfUFJJViBfX2dldF9mb3JtYXR0ZWRfdGltZShfX3MsIF9fZW5kLCBfX2Zvcm1hdCwgX19mb3JtYXRfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX1NUQVRJQ19DQVNUKF9DaCosIDApLCB0aGlzLT5fTV90aW1laW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19zdHIsIF9fZXJyLCBfX3QpOworICBfX2VyciA9IF9fcmVzdWx0ID09IF9fZm9ybWF0X2VuZCA/IGlvc19iYXNlOjpnb29kYml0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaW9zX2Jhc2U6OmZhaWxiaXQ7CisgIGlmIChfX3MgPT0gX19lbmQpCisgICAgX19lcnIgfD0gaW9zX2Jhc2U6OmVvZmJpdDsKKyAgcmV0dXJuIF9fczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaCwgY2xhc3MgX0luSXQ+CitfSW5JdAordGltZV9nZXQ8X0NoLCBfSW5JdD46OmRvX2dldF95ZWFyKF9Jbkl0IF9fcywgX0luSXQgIF9fZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlJiwgaW9zX2Jhc2U6Omlvc3RhdGUmICBfX2VyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bSogX190KSBjb25zdCB7CisgIGlmIChfX3MgPT0gX19lbmQpIHsKKyAgICBfX2VyciA9IGlvc19iYXNlOjpmYWlsYml0IHwgaW9zX2Jhc2U6OmVvZmJpdDsKKyAgICByZXR1cm4gX19zOworICB9CisKKyAgYm9vbCBfX3ByID0gIF9TVExQX1BSSVYgX19nZXRfZGVjaW1hbF9pbnRlZ2VyKF9fcywgX19lbmQsIF9fdC0+dG1feWVhciwgX19TVEFUSUNfQ0FTVChfQ2gqLCAwKSk7CisgIF9fdC0+dG1feWVhciAtPSAxOTAwOworICBfX2VyciA9IF9fcHIgPyBpb3NfYmFzZTo6Z29vZGJpdCA6IGlvc19iYXNlOjpmYWlsYml0OworICBpZiAoX19zID09IF9fZW5kKQorICAgIF9fZXJyIHw9IGlvc19iYXNlOjplb2ZiaXQ7CisKKyAgcmV0dXJuIF9fczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaCwgY2xhc3MgX0luSXQ+CitfSW5JdAordGltZV9nZXQ8X0NoLCBfSW5JdD46OmRvX2dldF93ZWVrZGF5KF9Jbkl0IF9fcywgX0luSXQgIF9fZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlICZfX3N0ciwgaW9zX2Jhc2U6Omlvc3RhdGUgJl9fZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtICpfX3QpIGNvbnN0IHsKKyAgYm9vbCBfX3Jlc3VsdCA9CisgICAgX1NUTFBfUFJJViBfX2dldF9zaG9ydF9vcl9sb25nX2RheW5hbWUoX19zLCBfX2VuZCwgdGhpcy0+X01fdGltZWluZm8sIF9fdCk7CisgIGlmIChfX3Jlc3VsdCkKKyAgICBfX2VyciA9IGlvc19iYXNlOjpnb29kYml0OworICBlbHNlIHsKKyAgICBfX2VyciA9IGlvc19iYXNlOjpmYWlsYml0OworICAgIGlmIChfX3MgPT0gX19lbmQpCisgICAgICBfX2VyciB8PSBpb3NfYmFzZTo6ZW9mYml0OworICB9CisgIHJldHVybiBfX3M7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2gsIGNsYXNzIF9Jbkl0PgorX0luSXQKK3RpbWVfZ2V0PF9DaCwgX0luSXQ+Ojpkb19nZXRfbW9udGhuYW1lKF9Jbkl0IF9fcywgX0luSXQgIF9fZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2UgJl9fc3RyLCBpb3NfYmFzZTo6aW9zdGF0ZSAmX19lcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bSAqX190KSBjb25zdCB7CisgIGJvb2wgX19yZXN1bHQgPQorICAgIF9TVExQX1BSSVYgX19nZXRfc2hvcnRfb3JfbG9uZ19tb250aG5hbWUoX19zLCBfX2VuZCwgdGhpcy0+X01fdGltZWluZm8sIF9fdCk7CisgIGlmIChfX3Jlc3VsdCkKKyAgICBfX2VyciA9IGlvc19iYXNlOjpnb29kYml0OworICBlbHNlIHsKKyAgICBfX2VyciA9IGlvc19iYXNlOjpmYWlsYml0OworICAgIGlmIChfX3MgPT0gX19lbmQpCisgICAgICBfX2VyciB8PSBpb3NfYmFzZTo6ZW9mYml0OworICB9CisgIHJldHVybiBfX3M7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaCwgY2xhc3MgX091dHB1dEl0ZXI+CitfT3V0cHV0SXRlcgordGltZV9wdXQ8X0NoLF9PdXRwdXRJdGVyPjo6cHV0KF9PdXRwdXRJdGVyIF9fcywgaW9zX2Jhc2UmIF9fZiwgX0NoIF9fZmlsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0bSogX190bWIsIGNvbnN0IF9DaCogX19wYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0NoKiBfX3BhdF9lbmQpIGNvbnN0IHsKKyAgY29uc3QgY3R5cGU8X0NoPiYgX0N0ID0gdXNlX2ZhY2V0PGN0eXBlPF9DaD4gPihfX2YuZ2V0bG9jKCkpOworICB3aGlsZSAoX19wYXQgIT0gX19wYXRfZW5kKSB7CisgICAgY2hhciBfX2MgPSBfQ3QubmFycm93KCpfX3BhdCwgMCk7CisgICAgaWYgKF9fYyA9PSAnJScpIHsKKyAgICAgIGNoYXIgX19tb2QgPSAwOworICAgICAgKytfX3BhdDsKKyAgICAgIF9fYyA9IF9DdC5uYXJyb3coKl9fcGF0KyssIDApOworICAgICAgaWYgKF9fYyA9PSAnIycpIHsgLy8gTVMgZXh0ZW5zaW9uCisgICAgICAgIF9fbW9kID0gX19jOworICAgICAgICBfX2MgPSBfQ3QubmFycm93KCpfX3BhdCsrLCAwKTsKKyAgICAgIH0KKyAgICAgIF9fcyA9IGRvX3B1dChfX3MsIF9fZiwgX19maWxsLCBfX3RtYiwgX19jLCBfX21vZCk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICpfX3MrKyA9ICpfX3BhdCsrOworICB9CisgIHJldHVybiBfX3M7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaCwgY2xhc3MgX091dHB1dEl0ZXI+CitfT3V0cHV0SXRlcgordGltZV9wdXQ8X0NoLF9PdXRwdXRJdGVyPjo6ZG9fcHV0KF9PdXRwdXRJdGVyIF9fcywgaW9zX2Jhc2UmIF9fZiwgX0NoIC8qIF9fZmlsbCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0bSogX190bWIsIGNoYXIgX19mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBfX21vZGlmaWVyICkgY29uc3QgeworICBjb25zdCBjdHlwZTxfQ2g+JiBfX2N0ID0gdXNlX2ZhY2V0PGN0eXBlPF9DaD4gPihfX2YuZ2V0bG9jKCkpOworICBfU1RMUF9CQVNJQ19JT1NUUklORyhfQ2gpIF9fYnVmOworICBfU1RMUF9QUklWIF9fd3JpdGVfZm9ybWF0dGVkX3RpbWUoX19idWYsIF9fY3QsIF9fZm9ybWF0LCBfX21vZGlmaWVyLCB0aGlzLT5fTV90aW1laW5mbywgX190bWIpOworICByZXR1cm4gY29weShfX2J1Zi5iZWdpbigpLCBfX2J1Zi5lbmQoKSwgX19zKTsKK30KKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLyogX1NUTFBfVElNRV9GQUNFVFNfQyAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdGwvX3RpbWVfZmFjZXRzLmggYi9zdGxwb3J0L3N0bC9fdGltZV9mYWNldHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjdjMmY0Ci0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvX3RpbWVfZmFjZXRzLmgKQEAgLTAsMCArMSwzMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisvLyBXQVJOSU5HOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBDKysKKy8vIHN0YW5kYXJkIGxpYnJhcnkgaGVhZGVycy4gIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIHRoaXMgaGVhZGVyCisvLyBmaWxlIGRpcmVjdGx5LgorCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfVElNRV9GQUNFVFNfSAorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9USU1FX0ZBQ0VUU19ICisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1RJTUUKKyMgIGluY2x1ZGUgPHN0bC9fY3RpbWUuaD4gICAgICAgICAgICAgICAgLy8gTmVlZGVkIChmb3Igc3RydWN0IHRtKSBieSB0aW1lIGZhY2V0cworI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfQ19MT0NBTEVfSAorIyAgaW5jbHVkZSA8c3RsL2NfbG9jYWxlLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JT1NfQkFTRV9ICisjICBpbmNsdWRlIDxzdGwvX2lvc19iYXNlLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9JT1NUUkVBTV9TVFJJTkdfSAorIyAgaW5jbHVkZSA8c3RsL19pb3N0cmVhbV9zdHJpbmcuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0ZBQ0VUU19GV0RfSAorIyAgaW5jbHVkZSA8c3RsL19mYWNldHNfZndkLmg+CisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKworLy8gVGVtcGxhdGUgZnVuY3Rpb25zIHVzZWQgYnkgdGltZV9nZXQKKworLyogQm90aCB0aW1lX2dldCBhbmQgdGltZV9wdXQgbmVlZCBhIHN0cnVjdHVyZSBvZiB0eXBlIF9UaW1lX0luZm8KKyAqIHRvIHByb3ZpZGUgbmFtZXMgYW5kIGFiYnJldmlhdGVkIG5hbWVzIGZvciBtb250aHMgYW5kIGRheXMsCisgKiBhcyB3ZWxsIGFzIHRoZSBhbS9wbSBkZXNpZ25hdG9yLiAgVGhlIG1vbnRoIGFuZCB3ZWVrZGF5IHRhYmxlcworICogaGF2ZSB0aGUgYWxsIHRoZSBhYmJyZXZpYXRlZCBuYW1lcyBiZWZvcmUgYWxsIHRoZSBmdWxsIG5hbWVzLgorICogVGhlIF9UaW1lX0luZm8gdGFibGVzIGFyZSBpbml0aWFsaXplZCB1c2luZyB0aGUgbm9uLXRlbXBsYXRlCisgKiB0aW1lX2Jhc2UgY2xhc3MsIHdoaWNoIGhhcyBhIGRlZmF1bHQgY29uc3RydWN0b3IgYW5kIHR3byBwcm90ZWN0ZWQuCisgKiBUaGUgZGVmYXVsdCBvbmUgaW5pdGlhbGl6ZSBfVGltZV9JbmZvIHdpdGggIkMiIHRpbWUgaW5mby4gVGhlCisgKiBwcm90ZWN0ZWQgaW5pdGlhbGl6ZSBfdGltZV9JbmZvIHVzaW5nIGEgX0xvY2FsZV90aW1lIGluc3RhbmNlCisgKiBvciB1c2luZyBhIG5hbWUoIGluIGZhY3QgdGhlIG5hbWUgaXMgdXNlZCB0byBidWlsZCBhIF9Mb2NhbGVfdGltZQorICogaW5zdGFuY2UgdGhhdCBpcyB0aGVuIHVzZWQgZm9yIGluaXRpYWxpemF0aW9uKS4gKi8KKworY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgX1RpbWVfSW5mb19CYXNlIHsKK3B1YmxpYzoKKyAgc3RyaW5nIF9NX3RpbWVfZm9ybWF0OworICBzdHJpbmcgX01fZGF0ZV9mb3JtYXQ7CisgIHN0cmluZyBfTV9kYXRlX3RpbWVfZm9ybWF0OworICBzdHJpbmcgX01fbG9uZ19kYXRlX2Zvcm1hdDsKKyAgc3RyaW5nIF9NX2xvbmdfZGF0ZV90aW1lX2Zvcm1hdDsKK307CisKK2NsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIF9UaW1lX0luZm8gOiBwdWJsaWMgX1RpbWVfSW5mb19CYXNlIHsKK3B1YmxpYzoKKyAgc3RyaW5nIF9NX2RheW5hbWVbMTRdOworICBzdHJpbmcgX01fbW9udGhuYW1lWzI0XTsKKyAgc3RyaW5nIF9NX2FtX3BtWzJdOworfTsKKworI2lmbmRlZiBfU1RMUF9OT19XQ0hBUl9UCitjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBfV1RpbWVfSW5mbyA6IHB1YmxpYyBfVGltZV9JbmZvX0Jhc2UgeworcHVibGljOgorICB3c3RyaW5nIF9NX2RheW5hbWVbMTRdOworICB3c3RyaW5nIF9NX21vbnRobmFtZVsyNF07CisgIHdzdHJpbmcgX01fYW1fcG1bMl07Cit9OworI2VuZGlmCisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCitjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyB0aW1lX2Jhc2UgeworcHVibGljOgorICBlbnVtIGRhdGVvcmRlciB7bm9fb3JkZXIsIGRteSwgbWR5LCB5bWQsIHlkbX07Cit9OworCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2g+CitjbGFzcyB0aW1lX2luaXQ7CisKK19TVExQX1RFTVBMQVRFX05VTEwKK2NsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIHRpbWVfaW5pdDxjaGFyPiB7Citwcm90ZWN0ZWQ6CisgIHRpbWVfaW5pdCgpOworICB0aW1lX2luaXQoY29uc3QgY2hhciAqbmFtZSk7CisgIHRpbWVfaW5pdChfTG9jYWxlX3RpbWUqKTsKKyNpZiBkZWZpbmVkIChfX0JPUkxBTkRDX18pCisgIHN0YXRpYworI2VuZGlmCisgIF9UaW1lX0luZm8gX01fdGltZWluZm87CisgIHRpbWVfYmFzZTo6ZGF0ZW9yZGVyIF9NX2RhdGVvcmRlcjsKK307CisKKyNpZm5kZWYgX1NUTFBfTk9fV0NIQVJfVAorX1NUTFBfVEVNUExBVEVfTlVMTAorY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgdGltZV9pbml0PHdjaGFyX3Q+IHsKK3Byb3RlY3RlZDoKKyAgdGltZV9pbml0KCk7CisgIHRpbWVfaW5pdChjb25zdCBjaGFyICpuYW1lKTsKKyAgdGltZV9pbml0KF9Mb2NhbGVfdGltZSopOworI2lmIGRlZmluZWQgKF9fQk9STEFORENfXykKKyAgc3RhdGljCisjZW5kaWYKKyAgX1dUaW1lX0luZm8gX01fdGltZWluZm87CisgIHRpbWVfYmFzZTo6ZGF0ZW9yZGVyIF9NX2RhdGVvcmRlcjsKK307CisjZW5kaWYKKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2gsIGNsYXNzIF9Jbkl0PgorY2xhc3MgdGltZV9nZXQgOiBwdWJsaWMgbG9jYWxlOjpmYWNldCwgcHVibGljIHRpbWVfYmFzZSwgcHVibGljIF9TVExQX1BSSVYgdGltZV9pbml0PF9DaD4geworcHVibGljOgorICB0eXBlZGVmIF9DaCAgIGNoYXJfdHlwZTsKKyAgdHlwZWRlZiBfSW5JdCBpdGVyX3R5cGU7CisKKyAgZXhwbGljaXQgdGltZV9nZXQoc2l6ZV90IF9fcmVmcyA9IDApIDogbG9jYWxlOjpmYWNldChfX3JlZnMpCisgIHt9CisKKyAgZGF0ZW9yZGVyIGRhdGVfb3JkZXIoKSBjb25zdCB7IHJldHVybiBkb19kYXRlX29yZGVyKCk7IH0KKyAgaXRlcl90eXBlIGdldF90aW1lKGl0ZXJfdHlwZSBfX3MsIGl0ZXJfdHlwZSAgX19lbmQsIGlvc19iYXNlJiAgX19zdHIsCisgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgIF9fZXJyLCB0bSogX190KSBjb25zdAorICB7IHJldHVybiBkb19nZXRfdGltZShfX3MsICBfX2VuZCwgIF9fc3RyLCAgX19lcnIsIF9fdCk7IH0KKyAgaXRlcl90eXBlIGdldF9kYXRlKGl0ZXJfdHlwZSBfX3MsIGl0ZXJfdHlwZSAgX19lbmQsIGlvc19iYXNlJiAgX19zdHIsCisgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgIF9fZXJyLCB0bSogX190KSBjb25zdAorICB7IHJldHVybiBkb19nZXRfZGF0ZShfX3MsICBfX2VuZCwgIF9fc3RyLCAgX19lcnIsIF9fdCk7IH0KKyAgaXRlcl90eXBlIGdldF93ZWVrZGF5KGl0ZXJfdHlwZSBfX3MsIGl0ZXJfdHlwZSAgX19lbmQsIGlvc19iYXNlJiAgX19zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgIF9fZXJyLCB0bSogX190KSBjb25zdAorICB7IHJldHVybiBkb19nZXRfd2Vla2RheShfX3MsICBfX2VuZCwgIF9fc3RyLCAgX19lcnIsIF9fdCk7IH0KKyAgaXRlcl90eXBlIGdldF9tb250aG5hbWUoaXRlcl90eXBlIF9fcywgaXRlcl90eXBlICBfX2VuZCwgaW9zX2Jhc2UmICBfX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmICBfX2VyciwgdG0qIF9fdCkgY29uc3QKKyAgeyByZXR1cm4gZG9fZ2V0X21vbnRobmFtZShfX3MsICBfX2VuZCwgIF9fc3RyLCAgX19lcnIsIF9fdCk7IH0KKyAgaXRlcl90eXBlIGdldF95ZWFyKGl0ZXJfdHlwZSBfX3MsIGl0ZXJfdHlwZSAgX19lbmQsIGlvc19iYXNlJiAgX19zdHIsCisgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgIF9fZXJyLCB0bSogX190KSBjb25zdAorICB7IHJldHVybiBkb19nZXRfeWVhcihfX3MsICBfX2VuZCwgIF9fc3RyLCAgX19lcnIsIF9fdCk7IH0KKworICBzdGF0aWMgbG9jYWxlOjppZCBpZDsKKworcHJvdGVjdGVkOgorICB0aW1lX2dldChjb25zdCBjaGFyKiBfX25hbWUsIHNpemVfdCBfX3JlZnMpCisgICAgOiBsb2NhbGU6OmZhY2V0KF9fcmVmcyksIF9TVExQX1BSSVYgdGltZV9pbml0PF9DaD4oX19uYW1lKQorICB7fQorICB0aW1lX2dldChfTG9jYWxlX3RpbWUgKl9fdGltZSkKKyAgICA6IF9TVExQX1BSSVYgdGltZV9pbml0PF9DaD4oX190aW1lKQorICB7fQorCisgIH50aW1lX2dldCgpIHt9CisKKyAgdmlydHVhbCBkYXRlb3JkZXIgZG9fZGF0ZV9vcmRlcigpIGNvbnN0IHsgcmV0dXJuIHRoaXMtPl9NX2RhdGVvcmRlcjsgfQorCisgIHZpcnR1YWwgaXRlcl90eXBlIGRvX2dldF90aW1lKGl0ZXJfdHlwZSBfX3MsIGl0ZXJfdHlwZSAgX19lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlJiwgaW9zX2Jhc2U6Omlvc3RhdGUmICBfX2VyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG0qIF9fdCkgY29uc3Q7CisKKyAgdmlydHVhbCBpdGVyX3R5cGUgZG9fZ2V0X2RhdGUoaXRlcl90eXBlIF9fcywgaXRlcl90eXBlICBfX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2UmLCBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtKiBfX3QpIGNvbnN0OworCisgIHZpcnR1YWwgaXRlcl90eXBlIGRvX2dldF93ZWVrZGF5KGl0ZXJfdHlwZSBfX3MsIGl0ZXJfdHlwZSAgX19lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bSogX190KSBjb25zdDsKKyAgdmlydHVhbCBpdGVyX3R5cGUgZG9fZ2V0X21vbnRobmFtZShpdGVyX3R5cGUgX19zLCBpdGVyX3R5cGUgIF9fZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG0qIF9fdCkgY29uc3Q7CisKKyAgdmlydHVhbCBpdGVyX3R5cGUgZG9fZ2V0X3llYXIoaXRlcl90eXBlIF9fcywgaXRlcl90eXBlICBfX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2UmLCBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtKiBfX3QpIGNvbnN0OworfTsKKworI2lmIGRlZmluZWQgKF9TVExQX0xJTUlURURfREVGQVVMVF9URU1QTEFURVMpCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoLCBjbGFzcyBfSW5JdD4KKyNlbHNlCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoLCBjbGFzcyBfSW5JdCA9IGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoLCBjaGFyX3RyYWl0czxfQ2g+ID4gPgorI2VuZGlmCitjbGFzcyB0aW1lX2dldF9ieW5hbWUgOiBwdWJsaWMgdGltZV9nZXQ8X0NoLCBfSW5JdD4geworICBmcmllbmQgY2xhc3MgX0xvY2FsZV9pbXBsOworcHVibGljOgorICB0eXBlZGVmICB0aW1lX2Jhc2U6OmRhdGVvcmRlciBkYXRlb3JkZXI7CisgIHR5cGVkZWYgX0luSXQgICAgICAgICAgICAgICAgIGl0ZXJfdHlwZTsKKworICBleHBsaWNpdCB0aW1lX2dldF9ieW5hbWUoY29uc3QgY2hhciogX19uYW1lLCBzaXplX3QgX19yZWZzID0gMCkKKyAgICA6IHRpbWVfZ2V0PF9DaCwgX0luSXQ+KF9fbmFtZSwgX19yZWZzKSB7fQorCitwcm90ZWN0ZWQ6CisgIH50aW1lX2dldF9ieW5hbWUoKSB7fQorICBkYXRlb3JkZXIgZG9fZGF0ZV9vcmRlcigpIGNvbnN0IHsgcmV0dXJuIHRoaXMtPl9NX2RhdGVvcmRlcjsgfQorCitwcml2YXRlOgorICB0aW1lX2dldF9ieW5hbWUoX0xvY2FsZV90aW1lICpfX3RpbWUpCisgICAgOiB0aW1lX2dldDxfQ2gsIF9Jbkl0PihfX3RpbWUpCisgIHt9CisKKyAgdHlwZWRlZiB0aW1lX2dldF9ieW5hbWU8X0NoLCBfSW5JdD4gX1NlbGY7CisgIC8vZXhwbGljaXRlbHkgZGVmaW5lZCBhcyBwcml2YXRlIHRvIGF2b2lkIHdhcm5pbmdzOgorICB0aW1lX2dldF9ieW5hbWUoX1NlbGYgY29uc3QmKTsKKyAgX1NlbGYmIG9wZXJhdG9yID0gKF9TZWxmIGNvbnN0Jik7Cit9OworCisvLyB0aW1lX3B1dCBmYWNldAorCisvLyBGb3IgdGhlIGZvcm1hdHMgJ3gsICdYJywgYW5kICdjJywgZG9fcHV0IGNhbGxzIHRoZSBmaXJzdCBmb3JtIG9mCisvLyBwdXQgd2l0aCB0aGUgcGF0dGVybiBvYnRhaW5lZCBmcm9tIF9NX3RpbWVpbmZvLl9NX2RhdGVfZm9ybWF0IG9yCisvLyBfTV90aW1laW5mby5fTV90aW1lX2Zvcm1hdC4KKworLy8gSGVscGVyIGZ1bmN0aW9uOiAgX18gIHRha2VzIGEgc2luZ2xlLWNoYXJhY3RlcgorLy8gZm9ybWF0LiAgQXMgaW5kaWNhdGVkIGJ5IHRoZSBmb3JlZ29pbmcgcmVtYXJrLCB0aGlzIHdpbGwgbmV2ZXIgYmUKKy8vICd4JywgJ1gnLCBvciAnYycuCisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKworX1NUTFBfREVDTFNQRUMgdm9pZCBfU1RMUF9DQUxMCitfX3dyaXRlX2Zvcm1hdHRlZF90aW1lKF9faW9zdHJpbmcmLCBjb25zdCBjdHlwZTxjaGFyPiYgX19jdCwKKyAgICAgICAgICAgICAgICAgICAgICAgY2hhciBfX2Zvcm1hdCwgY2hhciBfX21vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfVGltZV9JbmZvJiBfX3RhYmxlLCBjb25zdCB0bSogX190KTsKKworI2lmbmRlZiBfU1RMUF9OT19XQ0hBUl9UCitfU1RMUF9ERUNMU1BFQyB2b2lkIF9TVExQX0NBTEwKK19fd3JpdGVfZm9ybWF0dGVkX3RpbWUoX19pb3dzdHJpbmcmLCBjb25zdCBjdHlwZTx3Y2hhcl90PiYgX19jdCwKKyAgICAgICAgICAgICAgICAgICAgICAgY2hhciBfX2Zvcm1hdCwgY2hhciBfX21vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfV1RpbWVfSW5mbyYgX190YWJsZSwgY29uc3QgdG0qIF9fdCk7CisjZW5kaWYKKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2gsIGNsYXNzIF9PdXRJdD4KK2NsYXNzIHRpbWVfcHV0IDogcHVibGljIGxvY2FsZTo6ZmFjZXQsIHB1YmxpYyB0aW1lX2Jhc2UsIHB1YmxpYyBfU1RMUF9QUklWIHRpbWVfaW5pdDxfQ2g+IHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBfQ2ggICAgICBjaGFyX3R5cGU7CisgIHR5cGVkZWYgX091dEl0IGl0ZXJfdHlwZTsKKworICBleHBsaWNpdCB0aW1lX3B1dChzaXplX3QgX19yZWZzID0gMCkgOiBsb2NhbGU6OmZhY2V0KF9fcmVmcykKKyAge30KKworICBfT3V0SXQgcHV0KGl0ZXJfdHlwZSBfX3MsIGlvc19iYXNlJiBfX2YsIF9DaCBfX2ZpbGwsCisgICAgICAgICAgICAgICAgICBjb25zdCB0bSogX190bWIsCisgICAgICAgICAgICAgICAgICBjb25zdCBfQ2gqIF9fcGF0LCBjb25zdCBfQ2gqIF9fcGF0X2VuZCkgY29uc3Q7CisKKyAgX091dEl0IHB1dChpdGVyX3R5cGUgX19zLCBpb3NfYmFzZSYgX19mLCBfQ2ggIF9fZmlsbCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHRtKiBfX3RtYiwgY2hhciBfX2Zvcm1hdCwgY2hhciBfX21vZGlmaWVyID0gMCkgY29uc3QKKyAgeyByZXR1cm4gZG9fcHV0KF9fcywgX19mLCAgX19maWxsLCBfX3RtYiwgX19mb3JtYXQsIF9fbW9kaWZpZXIpOyB9CisKKyAgc3RhdGljIGxvY2FsZTo6aWQgaWQ7CisKK3Byb3RlY3RlZDoKKyAgdGltZV9wdXQoY29uc3QgY2hhciogX19uYW1lLCBzaXplX3QgX19yZWZzKQorICAgIDogbG9jYWxlOjpmYWNldChfX3JlZnMpLCBfU1RMUF9QUklWIHRpbWVfaW5pdDxfQ2g+KF9fbmFtZSkKKyAge30KKyAgdGltZV9wdXQoX0xvY2FsZV90aW1lICpfX3RpbWUpCisgICAgOiBfU1RMUF9QUklWIHRpbWVfaW5pdDxfQ2g+KF9fdGltZSkKKyAge30KKyAgfnRpbWVfcHV0KCkge30KKyAgdmlydHVhbCBpdGVyX3R5cGUgZG9fcHV0KGl0ZXJfdHlwZSBfX3MsIGlvc19iYXNlJiBfX2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX3R5cGUgIC8qIF9fZmlsbCAqLywgY29uc3QgdG0qIF9fdG1iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBfX2Zvcm1hdCwgY2hhciAvKiBfX21vZGlmaWVyICovKSBjb25zdDsKK307CisKKyNpZiBkZWZpbmVkIChfU1RMUF9MSU1JVEVEX0RFRkFVTFRfVEVNUExBVEVTKQordGVtcGxhdGUgPGNsYXNzIF9DaCwgY2xhc3MgX091dEl0PgorI2Vsc2UKK3RlbXBsYXRlIDxjbGFzcyBfQ2gsIGNsYXNzIF9PdXRJdCA9IG9zdHJlYW1idWZfaXRlcmF0b3I8X0NoLCBjaGFyX3RyYWl0czxfQ2g+ID4gPgorI2VuZGlmCitjbGFzcyB0aW1lX3B1dF9ieW5hbWUgOiBwdWJsaWMgdGltZV9wdXQ8X0NoLCBfT3V0SXQ+IHsKKyAgZnJpZW5kIGNsYXNzIF9Mb2NhbGVfaW1wbDsKK3B1YmxpYzoKKyAgdHlwZWRlZiB0aW1lX2Jhc2U6OmRhdGVvcmRlciBkYXRlb3JkZXI7CisgIHR5cGVkZWYgX091dEl0IGl0ZXJfdHlwZTsKKyAgdHlwZWRlZiBfQ2ggICBjaGFyX3R5cGU7CisKKyAgZXhwbGljaXQgdGltZV9wdXRfYnluYW1lKGNvbnN0IGNoYXIgKiBfX25hbWUsIHNpemVfdCBfX3JlZnMgPSAwKQorICAgIDogdGltZV9wdXQ8X0NoLCBfT3V0SXQ+KF9fbmFtZSwgX19yZWZzKQorICB7fQorCitwcm90ZWN0ZWQ6CisgIH50aW1lX3B1dF9ieW5hbWUoKSB7fQorCitwcml2YXRlOgorICB0aW1lX3B1dF9ieW5hbWUoX0xvY2FsZV90aW1lICpfX3RpbWUpCisgICAgOiB0aW1lX3B1dDxfQ2gsIF9PdXRJdD4oX190aW1lKQorICB7fQorCisgIHR5cGVkZWYgdGltZV9wdXRfYnluYW1lPF9DaCwgX091dEl0PiBfU2VsZjsKKyAgLy9leHBsaWNpdGVseSBkZWZpbmVkIGFzIHByaXZhdGUgdG8gYXZvaWQgd2FybmluZ3M6CisgIHRpbWVfcHV0X2J5bmFtZShfU2VsZiBjb25zdCYpOworICBfU2VsZiYgb3BlcmF0b3IgPSAoX1NlbGYgY29uc3QmKTsKK307CisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUKQorX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIHRpbWVfZ2V0PGNoYXIsIGlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiA+OworX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIHRpbWVfcHV0PGNoYXIsIG9zdHJlYW1idWZfaXRlcmF0b3I8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiA+OworIyAgaWYgIWRlZmluZWQgKF9TVExQX05PX1dDSEFSX1QpCitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgdGltZV9nZXQ8d2NoYXJfdCwgaXN0cmVhbWJ1Zl9pdGVyYXRvcjx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+ID47CitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgdGltZV9wdXQ8d2NoYXJfdCwgb3N0cmVhbWJ1Zl9pdGVyYXRvcjx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+ID47CisjICBlbmRpZgorCisjZW5kaWYKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjaWYgZGVmaW5lZCAoX1NUTFBfRVhQT1NFX1NUUkVBTV9JTVBMRU1FTlRBVElPTikgJiYgIWRlZmluZWQgKF9TVExQX0xJTktfVElNRV9JTlNUQU5USUFUSU9OKQorIyAgaW5jbHVkZSA8c3RsL190aW1lX2ZhY2V0cy5jPgorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9USU1FX0ZBQ0VUU19IICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX3RyZWUuYyBiL3N0bHBvcnQvc3RsL190cmVlLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHN0bC9fdHJlZS5jCnJlbmFtZSB0byBzdGxwb3J0L3N0bC9fdHJlZS5jCmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9fdHJlZS5oIGIvc3RscG9ydC9zdGwvX3RyZWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjA1OTAxCi0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvX3RyZWUuaApAQCAtMCwwICsxLDY4NCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKy8qIE5PVEU6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIFNUTCBoZWFkZXJzLgorICogICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4KKyAqLworCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX1RSRUVfSAorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9UUkVFX0gKKworLyoKKworUmVkLWJsYWNrIHRyZWUgY2xhc3MsIGRlc2lnbmVkIGZvciB1c2UgaW4gaW1wbGVtZW50aW5nIFNUTAorYXNzb2NpYXRpdmUgY29udGFpbmVycyAoc2V0LCBtdWx0aXNldCwgbWFwLCBhbmQgbXVsdGltYXApLiBUaGUKK2luc2VydGlvbiBhbmQgZGVsZXRpb24gYWxnb3JpdGhtcyBhcmUgYmFzZWQgb24gdGhvc2UgaW4gQ29ybWVuLAorTGVpc2Vyc29uLCBhbmQgUml2ZXN0LCBJbnRyb2R1Y3Rpb24gdG8gQWxnb3JpdGhtcyAoTUlUIFByZXNzLCAxOTkwKSwKK2V4Y2VwdCB0aGF0CisKKygxKSB0aGUgaGVhZGVyIGNlbGwgaXMgbWFpbnRhaW5lZCB3aXRoIGxpbmtzIG5vdCBvbmx5IHRvIHRoZSByb290CitidXQgYWxzbyB0byB0aGUgbGVmdG1vc3Qgbm9kZSBvZiB0aGUgdHJlZSwgdG8gZW5hYmxlIGNvbnN0YW50IHRpbWUKK2JlZ2luKCksIGFuZCB0byB0aGUgcmlnaHRtb3N0IG5vZGUgb2YgdGhlIHRyZWUsIHRvIGVuYWJsZSBsaW5lYXIgdGltZQorcGVyZm9ybWFuY2Ugd2hlbiB1c2VkIHdpdGggdGhlIGdlbmVyaWMgc2V0IGFsZ29yaXRobXMgKHNldF91bmlvbiwKK2V0Yy4pOworCisoMikgd2hlbiBhIG5vZGUgYmVpbmcgZGVsZXRlZCBoYXMgdHdvIGNoaWxkcmVuIGl0cyBzdWNjZXNzb3Igbm9kZSBpcworcmVsaW5rZWQgaW50byBpdHMgcGxhY2UsIHJhdGhlciB0aGFuIGNvcGllZCwgc28gdGhhdCB0aGUgb25seQoraXRlcmF0b3JzIGludmFsaWRhdGVkIGFyZSB0aG9zZSByZWZlcnJpbmcgdG8gdGhlIGRlbGV0ZWQgbm9kZS4KKworKi8KKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9BTEdPQkFTRV9ICisjICBpbmNsdWRlIDxzdGwvX2FsZ29iYXNlLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9BTExPQ19ICisjICBpbmNsdWRlIDxzdGwvX2FsbG9jLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9JVEVSQVRPUl9ICisjICBpbmNsdWRlIDxzdGwvX2l0ZXJhdG9yLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DT05TVFJVQ1RfSAorIyAgaW5jbHVkZSA8c3RsL19jb25zdHJ1Y3QuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0ZVTkNUSU9OX0JBU0VfSAorIyAgaW5jbHVkZSA8c3RsL19mdW5jdGlvbl9iYXNlLmg+CisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordHlwZWRlZiBib29sIF9SYl90cmVlX0NvbG9yX3R5cGU7CisvL2NvbnN0IF9SYl90cmVlX0NvbG9yX3R5cGUgX1NfcmJfdHJlZV9yZWQgPSBmYWxzZTsKKy8vY29uc3QgX1JiX3RyZWVfQ29sb3JfdHlwZSBfU19yYl90cmVlX2JsYWNrID0gdHJ1ZTsKKworI2RlZmluZSBfU19yYl90cmVlX3JlZCBmYWxzZQorI2RlZmluZSBfU19yYl90cmVlX2JsYWNrIHRydWUKKworc3RydWN0IF9SYl90cmVlX25vZGVfYmFzZSB7CisgIHR5cGVkZWYgX1JiX3RyZWVfQ29sb3JfdHlwZSBfQ29sb3JfdHlwZTsKKyAgdHlwZWRlZiBfUmJfdHJlZV9ub2RlX2Jhc2UqIF9CYXNlX3B0cjsKKworICBfQ29sb3JfdHlwZSBfTV9jb2xvcjsKKyAgX0Jhc2VfcHRyIF9NX3BhcmVudDsKKyAgX0Jhc2VfcHRyIF9NX2xlZnQ7CisgIF9CYXNlX3B0ciBfTV9yaWdodDsKKworICBzdGF0aWMgX0Jhc2VfcHRyIF9TVExQX0NBTEwgX1NfbWluaW11bShfQmFzZV9wdHIgX194KSB7CisgICAgd2hpbGUgKF9feC0+X01fbGVmdCAhPSAwKSBfX3ggPSBfX3gtPl9NX2xlZnQ7CisgICAgcmV0dXJuIF9feDsKKyAgfQorCisgIHN0YXRpYyBfQmFzZV9wdHIgX1NUTFBfQ0FMTCBfU19tYXhpbXVtKF9CYXNlX3B0ciBfX3gpIHsKKyAgICB3aGlsZSAoX194LT5fTV9yaWdodCAhPSAwKSBfX3ggPSBfX3gtPl9NX3JpZ2h0OworICAgIHJldHVybiBfX3g7CisgIH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsdWU+CitzdHJ1Y3QgX1JiX3RyZWVfbm9kZSA6IHB1YmxpYyBfUmJfdHJlZV9ub2RlX2Jhc2UgeworICBfVmFsdWUgX01fdmFsdWVfZmllbGQ7CisgIF9fVFJJVklBTF9TVFVGRihfUmJfdHJlZV9ub2RlKQorfTsKKworc3RydWN0IF9SYl90cmVlX2Jhc2VfaXRlcmF0b3I7CisKK3RlbXBsYXRlIDxjbGFzcyBfRHVtbXk+CitjbGFzcyBfUmJfZ2xvYmFsIHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBfUmJfdHJlZV9ub2RlX2Jhc2UqIF9CYXNlX3B0cjsKKyAgLy8gdGhvc2UgdXNlZCB0byBiZSBnbG9iYWwgZnVuY3Rpb25zCisgIHN0YXRpYyB2b2lkIF9TVExQX0NBTEwgX1JlYmFsYW5jZShfQmFzZV9wdHIgX194LCBfQmFzZV9wdHImIF9fcm9vdCk7CisgIHN0YXRpYyBfQmFzZV9wdHIgX1NUTFBfQ0FMTCBfUmViYWxhbmNlX2Zvcl9lcmFzZShfQmFzZV9wdHIgX196LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0Jhc2VfcHRyJiBfX3Jvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmFzZV9wdHImIF9fbGVmdG1vc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmFzZV9wdHImIF9fcmlnaHRtb3N0KTsKKyAgLy8gdGhvc2UgYXJlIGZyb20gX1JiX3RyZWVfYmFzZV9pdGVyYXRvciAtIG1vdmVkIGhlcmUgdG8gcmVkdWNlIGNvZGUgYmxvYXQKKyAgLy8gbW92ZWQgaGVyZSB0byByZWR1Y2UgY29kZSBibG9hdCB3aXRob3V0IHRlbXBsYXRpemluZyBfUmJfdHJlZV9iYXNlX2l0ZXJhdG9yCisgIHN0YXRpYyBfQmFzZV9wdHIgIF9TVExQX0NBTEwgX01faW5jcmVtZW50IChfQmFzZV9wdHIpOworICBzdGF0aWMgX0Jhc2VfcHRyICBfU1RMUF9DQUxMIF9NX2RlY3JlbWVudCAoX0Jhc2VfcHRyKTsKKyAgc3RhdGljIHZvaWQgICAgICAgX1NUTFBfQ0FMTCBfUm90YXRlX2xlZnQgKF9CYXNlX3B0ciBfX3gsIF9CYXNlX3B0ciYgX19yb290KTsKKyAgc3RhdGljIHZvaWQgICAgICAgX1NUTFBfQ0FMTCBfUm90YXRlX3JpZ2h0KF9CYXNlX3B0ciBfX3gsIF9CYXNlX3B0ciYgX19yb290KTsKK307CisKKyMgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCkKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBfUmJfZ2xvYmFsPGJvb2w+OworIyBlbmRpZgorCit0eXBlZGVmIF9SYl9nbG9iYWw8Ym9vbD4gX1JiX2dsb2JhbF9pbnN0OworCitzdHJ1Y3QgX1JiX3RyZWVfYmFzZV9pdGVyYXRvciB7CisgIHR5cGVkZWYgX1JiX3RyZWVfbm9kZV9iYXNlKiAgICAgICAgX0Jhc2VfcHRyOworICB0eXBlZGVmIGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworICB0eXBlZGVmIHB0cmRpZmZfdCAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgX0Jhc2VfcHRyIF9NX25vZGU7CisgIF9SYl90cmVlX2Jhc2VfaXRlcmF0b3IoKSA6IF9NX25vZGUoMCkge30KKyAgX1JiX3RyZWVfYmFzZV9pdGVyYXRvcihfQmFzZV9wdHIgX194KSA6IF9NX25vZGUoX194KSB7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9WYWx1ZSwgY2xhc3MgX1RyYWl0cz4KK3N0cnVjdCBfUmJfdHJlZV9pdGVyYXRvciA6IHB1YmxpYyBfUmJfdHJlZV9iYXNlX2l0ZXJhdG9yIHsKKyAgdHlwZWRlZiBfVmFsdWUgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpyZWZlcmVuY2UgIHJlZmVyZW5jZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpwb2ludGVyICAgIHBvaW50ZXI7CisgIHR5cGVkZWYgX1JiX3RyZWVfaXRlcmF0b3I8X1ZhbHVlLCBfVHJhaXRzPiBfU2VsZjsKKyAgdHlwZWRlZiBfUmJfdHJlZV9ub2RlX2Jhc2UqICAgIF9CYXNlX3B0cjsKKyAgdHlwZWRlZiBfUmJfdHJlZV9ub2RlPF9WYWx1ZT4qIF9MaW5rX3R5cGU7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpfTm9uQ29uc3RUcmFpdHMgX05vbkNvbnN0VHJhaXRzOworICB0eXBlZGVmIF9SYl90cmVlX2l0ZXJhdG9yPF9WYWx1ZSwgX05vbkNvbnN0VHJhaXRzPiBpdGVyYXRvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpfQ29uc3RUcmFpdHMgX0NvbnN0VHJhaXRzOworICB0eXBlZGVmIF9SYl90cmVlX2l0ZXJhdG9yPF9WYWx1ZSwgX0NvbnN0VHJhaXRzPiBjb25zdF9pdGVyYXRvcjsKKworICBfUmJfdHJlZV9pdGVyYXRvcigpIHt9CisjaWYgIWRlZmluZWQgKF9TVExQX0RFQlVHKQorICAvKiBJbiBTVEwgZGVidWcgbW9kZSB3ZSBuZWVkIHRoaXMgY29uc3RydWN0b3IgaW1wbGljaXQgZm9yIHRoZSBwb2ludGVyCisgICAqIHNwZWNpYWxpemF0aW9uIGltcGxlbWVudGF0aW9uLgorICAgKi8KKyAgZXhwbGljaXQKKyNlbmRpZgorICBfUmJfdHJlZV9pdGVyYXRvcihfQmFzZV9wdHIgX194KSA6IF9SYl90cmVlX2Jhc2VfaXRlcmF0b3IoX194KSB7fQorICAvL2NvcHkgY29uc3RydWN0b3IgZm9yIGl0ZXJhdG9yIGFuZCBjb25zdHJ1Y3RvciBmcm9tIGl0ZXJhdG9yIGZvciBjb25zdF9pdGVyYXRvcgorICBfUmJfdHJlZV9pdGVyYXRvcihjb25zdCBpdGVyYXRvciYgX19pdCkgOiBfUmJfdHJlZV9iYXNlX2l0ZXJhdG9yKF9faXQuX01fbm9kZSkge30KKworICByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3QgeworICAgIHJldHVybiBfX1NUQVRJQ19DQVNUKF9MaW5rX3R5cGUsIF9NX25vZGUpLT5fTV92YWx1ZV9maWVsZDsKKyAgfQorCisgIF9TVExQX0RFRklORV9BUlJPV19PUEVSQVRPUgorCisgIF9TZWxmJiBvcGVyYXRvcisrKCkgeworICAgIF9NX25vZGUgPSBfUmJfZ2xvYmFsX2luc3Q6Ol9NX2luY3JlbWVudChfTV9ub2RlKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgX1NlbGYgb3BlcmF0b3IrKyhpbnQpIHsKKyAgICBfU2VsZiBfX3RtcCA9ICp0aGlzOworICAgICsrKCp0aGlzKTsKKyAgICByZXR1cm4gX190bXA7CisgIH0KKworICBfU2VsZiYgb3BlcmF0b3ItLSgpIHsKKyAgICBfTV9ub2RlID0gX1JiX2dsb2JhbF9pbnN0OjpfTV9kZWNyZW1lbnQoX01fbm9kZSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIF9TZWxmIG9wZXJhdG9yLS0oaW50KSB7CisgICAgX1NlbGYgX190bXAgPSAqdGhpczsKKyAgICAtLSgqdGhpcyk7CisgICAgcmV0dXJuIF9fdG1wOworICB9CisKKyAgYm9vbCBvcGVyYXRvciA9PSAoY29uc3RfaXRlcmF0b3IgX19yaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gX01fbm9kZSA9PSBfX3Jocy5fTV9ub2RlOworICB9CisgIGJvb2wgb3BlcmF0b3IgIT0gKGNvbnN0X2l0ZXJhdG9yIF9fcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIF9NX25vZGUgIT0gX19yaHMuX01fbm9kZTsKKyAgfQorfTsKKworI2lmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKK3RlbXBsYXRlIDxjbGFzcyBfVmFsdWUsIGNsYXNzIF9UcmFpdHM+CitzdHJ1Y3QgX190eXBlX3RyYWl0czxfU1RMUF9QUklWIF9SYl90cmVlX2l0ZXJhdG9yPF9WYWx1ZSwgX1RyYWl0cz4gPiB7CisgIHR5cGVkZWYgX19mYWxzZV90eXBlICAgaGFzX3RyaXZpYWxfZGVmYXVsdF9jb25zdHJ1Y3RvcjsKKyAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yOworICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3I7CisgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjsKKyAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgICBpc19QT0RfdHlwZTsKK307CitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisjZW5kaWYgLyogX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTiAqLworCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX09MRF9IUF9JVEVSQVRPUl9RVUVSSUVTKQorX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfVHJhaXRzPgoraW5saW5lIF9WYWx1ZSogdmFsdWVfdHlwZShjb25zdCBfU1RMUF9QUklWIF9SYl90cmVlX2l0ZXJhdG9yPF9WYWx1ZSwgX1RyYWl0cz4mKQoreyByZXR1cm4gKF9WYWx1ZSopMDsgfQoraW5saW5lIGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5KGNvbnN0IF9TVExQX1BSSVYgX1JiX3RyZWVfYmFzZV9pdGVyYXRvciYpCit7IHJldHVybiBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZygpOyB9CitpbmxpbmUgcHRyZGlmZl90KiBkaXN0YW5jZV90eXBlKGNvbnN0IF9TVExQX1BSSVYgX1JiX3RyZWVfYmFzZV9pdGVyYXRvciYpCit7IHJldHVybiAocHRyZGlmZl90KikgMDsgfQorX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorI2VuZGlmIC8qIF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04gKi8KKworLy8gQmFzZSBjbGFzcyB0byBoZWxwIEVICisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK2NsYXNzIF9SYl90cmVlX2Jhc2UgeworcHVibGljOgorICB0eXBlZGVmIF9SYl90cmVlX25vZGVfYmFzZSBfTm9kZV9iYXNlOworICB0eXBlZGVmIF9SYl90cmVlX25vZGU8X1RwPiBfTm9kZTsKKyAgX1NUTFBfRk9SQ0VfQUxMT0NBVE9SUyhfVHAsIF9BbGxvYykKKyAgdHlwZWRlZiBfQWxsb2MgYWxsb2NhdG9yX3R5cGU7Citwcml2YXRlOgorICB0eXBlZGVmIF9SYl90cmVlX2Jhc2U8X1RwLCBfQWxsb2M+IF9TZWxmOworICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY190cmFpdHM8X05vZGUsIF9BbGxvYz46OmFsbG9jYXRvcl90eXBlIF9NX25vZGVfYWxsb2NhdG9yX3R5cGU7CisgIHR5cGVkZWYgX1NUTFBfYWxsb2NfcHJveHk8X05vZGVfYmFzZSwgX05vZGUsIF9NX25vZGVfYWxsb2NhdG9yX3R5cGU+IF9BbGxvY1Byb3h5OworCitwdWJsaWM6CisgIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIF9TVExQX0NPTlZFUlRfQUxMT0NBVE9SKF9NX2hlYWRlciwgX1RwKTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIF9SYl90cmVlX2Jhc2UoY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkgOgorICAgIF9NX2hlYWRlcihfU1RMUF9DT05WRVJUX0FMTE9DQVRPUihfX2EsIF9Ob2RlKSwgX05vZGVfYmFzZSgpICkgeworICAgIF9NX2VtcHR5X2luaXRpYWxpemUoKTsKKyAgfQorCisjaWYgIWRlZmluZWQgKF9TVExQX05PX01PVkVfU0VNQU5USUMpCisgIF9SYl90cmVlX2Jhc2UoX19tb3ZlX3NvdXJjZTxfU2VsZj4gc3JjKSA6CisgICAgX01faGVhZGVyKF9fbW92ZV9zb3VyY2U8X0FsbG9jUHJveHk+KHNyYy5nZXQoKS5fTV9oZWFkZXIpKSB7CisgICAgX01fcmViaW5kKCZzcmMuZ2V0KCkuX01faGVhZGVyLl9NX2RhdGEpOworICAgIHNyYy5nZXQoKS5fTV9lbXB0eV9pbml0aWFsaXplKCk7CisgIH0KKyNlbmRpZgorCisgIHZvaWQgX01fZW1wdHlfaW5pdGlhbGl6ZSgpIHsKKyAgICBfTV9oZWFkZXIuX01fZGF0YS5fTV9jb2xvciA9IF9TX3JiX3RyZWVfcmVkOyAvLyB1c2VkIHRvIGRpc3Rpbmd1aXNoIGhlYWRlciBmcm9tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gX19yb290LCBpbiBpdGVyYXRvci5vcGVyYXRvcisrCisgICAgX01faGVhZGVyLl9NX2RhdGEuX01fcGFyZW50ID0gMDsKKyAgICBfTV9oZWFkZXIuX01fZGF0YS5fTV9sZWZ0ID0gJl9NX2hlYWRlci5fTV9kYXRhOworICAgIF9NX2hlYWRlci5fTV9kYXRhLl9NX3JpZ2h0ID0gJl9NX2hlYWRlci5fTV9kYXRhOworICB9CisKKyAgdm9pZCBfTV9yZWJpbmQoX05vZGVfYmFzZSAqX19zdGF0aWNfbm9kZSkgeworICAgIGlmIChfTV9oZWFkZXIuX01fZGF0YS5fTV9wYXJlbnQgIT0gMCkgeworICAgICAgX01faGVhZGVyLl9NX2RhdGEuX01fcGFyZW50LT5fTV9wYXJlbnQgPSAmX01faGVhZGVyLl9NX2RhdGE7CisgICAgfQorICAgIGlmIChfTV9oZWFkZXIuX01fZGF0YS5fTV9yaWdodCA9PSBfX3N0YXRpY19ub2RlKSB7CisgICAgICBfTV9oZWFkZXIuX01fZGF0YS5fTV9yaWdodCA9ICZfTV9oZWFkZXIuX01fZGF0YTsKKyAgICB9CisgICAgaWYgKF9NX2hlYWRlci5fTV9kYXRhLl9NX2xlZnQgPT0gX19zdGF0aWNfbm9kZSkgeworICAgICAgX01faGVhZGVyLl9NX2RhdGEuX01fbGVmdCA9ICZfTV9oZWFkZXIuX01fZGF0YTsKKyAgICB9CisgIH0KKworICBfQWxsb2NQcm94eSBfTV9oZWFkZXI7Cit9OworCisjaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpCisjICBkZWZpbmUgX1JiX3RyZWUgX1NUTFBfTk9OX0RCR19OQU1FKFJiX3RyZWUpCisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9Db21wYXJlLAorICAgICAgICAgIGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0tleU9mVmFsdWUsIGNsYXNzIF9UcmFpdHMsCisgICAgICAgICAgX1NUTFBfREZMX1RNUExfUEFSQU0oX0FsbG9jLCBhbGxvY2F0b3I8X1ZhbHVlPikgPgorY2xhc3MgX1JiX3RyZWUgOiBwdWJsaWMgX1JiX3RyZWVfYmFzZTxfVmFsdWUsIF9BbGxvYz4geworICB0eXBlZGVmIF9SYl90cmVlX2Jhc2U8X1ZhbHVlLCBfQWxsb2M+IF9CYXNlOworICB0eXBlZGVmIF9SYl90cmVlPF9LZXksIF9Db21wYXJlLCBfVmFsdWUsIF9LZXlPZlZhbHVlLCBfVHJhaXRzLCBfQWxsb2M+IF9TZWxmOworcHJvdGVjdGVkOgorICB0eXBlZGVmIF9SYl90cmVlX25vZGVfYmFzZSAqIF9CYXNlX3B0cjsKKyAgdHlwZWRlZiBfUmJfdHJlZV9ub2RlPF9WYWx1ZT4gX05vZGU7CisgIHR5cGVkZWYgX05vZGUqIF9MaW5rX3R5cGU7CisgIHR5cGVkZWYgX1JiX3RyZWVfQ29sb3JfdHlwZSBfQ29sb3JfdHlwZTsKK3B1YmxpYzoKKyAgdHlwZWRlZiBfS2V5IGtleV90eXBlOworICB0eXBlZGVmIF9WYWx1ZSB2YWx1ZV90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OnBvaW50ZXIgcG9pbnRlcjsKKyAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlKiBjb25zdF9wb2ludGVyOworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OnJlZmVyZW5jZSByZWZlcmVuY2U7CisgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSYgY29uc3RfcmVmZXJlbmNlOworICB0eXBlZGVmIHNpemVfdCBzaXplX3R5cGU7CisgIHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKKyAgdHlwZWRlZiBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZyBfSXRlcmF0b3JfY2F0ZWdvcnk7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmFsbG9jYXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOworCitwcm90ZWN0ZWQ6CisKKyAgX1NUTFBfS0VZX1RZUEVfRk9SX0NPTlRfRVhUKGtleV90eXBlKQorICBfQmFzZV9wdHIgX01fY3JlYXRlX25vZGUoY29uc3QgdmFsdWVfdHlwZSYgX194KSB7CisgICAgX0xpbmtfdHlwZSBfX3RtcCA9IHRoaXMtPl9NX2hlYWRlci5hbGxvY2F0ZSgxKTsKKyAgICBfU1RMUF9UUlkgeworICAgICAgX0NvcHlfQ29uc3RydWN0KCZfX3RtcC0+X01fdmFsdWVfZmllbGQsIF9feCk7CisgICAgfQorICAgIF9TVExQX1VOV0lORCh0aGlzLT5fTV9oZWFkZXIuZGVhbGxvY2F0ZShfX3RtcCwxKSkKKyAgICBfU19sZWZ0KF9fdG1wKSA9IDA7CisgICAgX1NfcmlnaHQoX190bXApID0gMDsKKyAgICByZXR1cm4gX190bXA7CisgIH0KKworICBfQmFzZV9wdHIgX01fY2xvbmVfbm9kZShfQmFzZV9wdHIgX194KSB7CisgICAgX0Jhc2VfcHRyIF9fdG1wID0gX01fY3JlYXRlX25vZGUoX1NfdmFsdWUoX194KSk7CisgICAgX1NfY29sb3IoX190bXApID0gX1NfY29sb3IoX194KTsKKyAgICByZXR1cm4gX190bXA7CisgIH0KKworICBzaXplX3R5cGUgX01fbm9kZV9jb3VudDsgLy8ga2VlcHMgdHJhY2sgb2Ygc2l6ZSBvZiB0cmVlCisgIF9Db21wYXJlIF9NX2tleV9jb21wYXJlOworCisgIF9CYXNlX3B0ciBfTV9yb290KCkgY29uc3QKKyAgeyByZXR1cm4gdGhpcy0+X01faGVhZGVyLl9NX2RhdGEuX01fcGFyZW50OyB9CisgIF9CYXNlX3B0ciBfTV9sZWZ0bW9zdCgpIGNvbnN0CisgIHsgcmV0dXJuIHRoaXMtPl9NX2hlYWRlci5fTV9kYXRhLl9NX2xlZnQ7IH0KKyAgX0Jhc2VfcHRyIF9NX3JpZ2h0bW9zdCgpIGNvbnN0CisgIHsgcmV0dXJuIHRoaXMtPl9NX2hlYWRlci5fTV9kYXRhLl9NX3JpZ2h0OyB9CisKKyAgX0Jhc2VfcHRyJiBfTV9yb290KCkKKyAgeyByZXR1cm4gdGhpcy0+X01faGVhZGVyLl9NX2RhdGEuX01fcGFyZW50OyB9CisgIF9CYXNlX3B0ciYgX01fbGVmdG1vc3QoKQorICB7IHJldHVybiB0aGlzLT5fTV9oZWFkZXIuX01fZGF0YS5fTV9sZWZ0OyB9CisgIF9CYXNlX3B0ciYgX01fcmlnaHRtb3N0KCkKKyAgeyByZXR1cm4gdGhpcy0+X01faGVhZGVyLl9NX2RhdGEuX01fcmlnaHQ7IH0KKworICBzdGF0aWMgX0Jhc2VfcHRyJiBfU1RMUF9DQUxMIF9TX2xlZnQoX0Jhc2VfcHRyIF9feCkKKyAgeyByZXR1cm4gX194LT5fTV9sZWZ0OyB9CisgIHN0YXRpYyBfQmFzZV9wdHImIF9TVExQX0NBTEwgX1NfcmlnaHQoX0Jhc2VfcHRyIF9feCkKKyAgeyByZXR1cm4gX194LT5fTV9yaWdodDsgfQorICBzdGF0aWMgX0Jhc2VfcHRyJiBfU1RMUF9DQUxMIF9TX3BhcmVudChfQmFzZV9wdHIgX194KQorICB7IHJldHVybiBfX3gtPl9NX3BhcmVudDsgfQorICBzdGF0aWMgdmFsdWVfdHlwZSYgX1NUTFBfQ0FMTCBfU192YWx1ZShfQmFzZV9wdHIgX194KQorICB7IHJldHVybiBfX1NUQVRJQ19DQVNUKF9MaW5rX3R5cGUsIF9feCktPl9NX3ZhbHVlX2ZpZWxkOyB9CisgIHN0YXRpYyBjb25zdCBfS2V5JiBfU1RMUF9DQUxMIF9TX2tleShfQmFzZV9wdHIgX194KQorICB7IHJldHVybiBfS2V5T2ZWYWx1ZSgpKF9TX3ZhbHVlKF9feCkpO30KKyAgc3RhdGljIF9Db2xvcl90eXBlJiBfU1RMUF9DQUxMIF9TX2NvbG9yKF9CYXNlX3B0ciBfX3gpCisgIHsgcmV0dXJuIChfQ29sb3JfdHlwZSYpKF9feC0+X01fY29sb3IpOyB9CisKKyAgc3RhdGljIF9CYXNlX3B0ciBfU1RMUF9DQUxMIF9TX21pbmltdW0oX0Jhc2VfcHRyIF9feCkKKyAgeyByZXR1cm4gX1JiX3RyZWVfbm9kZV9iYXNlOjpfU19taW5pbXVtKF9feCk7IH0KKworICBzdGF0aWMgX0Jhc2VfcHRyIF9TVExQX0NBTEwgX1NfbWF4aW11bShfQmFzZV9wdHIgX194KQorICB7IHJldHVybiBfUmJfdHJlZV9ub2RlX2Jhc2U6Ol9TX21heGltdW0oX194KTsgfQorCitwdWJsaWM6CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6X05vbkNvbnN0VHJhaXRzIF9Ob25Db25zdFRyYWl0czsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpfQ29uc3RUcmFpdHMgX0NvbnN0VHJhaXRzOworICB0eXBlZGVmIF9SYl90cmVlX2l0ZXJhdG9yPHZhbHVlX3R5cGUsIF9Ob25Db25zdFRyYWl0cz4gaXRlcmF0b3I7CisgIHR5cGVkZWYgX1JiX3RyZWVfaXRlcmF0b3I8dmFsdWVfdHlwZSwgX0NvbnN0VHJhaXRzPiBjb25zdF9pdGVyYXRvcjsKKyAgX1NUTFBfREVDTEFSRV9CSURJUkVDVElPTkFMX1JFVkVSU0VfSVRFUkFUT1JTOworCitwcml2YXRlOgorICBpdGVyYXRvciBfTV9pbnNlcnQoX0Jhc2VfcHRyIF9fcGFyZW50LCBjb25zdCB2YWx1ZV90eXBlJiBfX3ZhbCwgX0Jhc2VfcHRyIF9fb25fbGVmdCA9IDAsIF9CYXNlX3B0ciBfX29uX3JpZ2h0ID0gMCk7CisgIF9CYXNlX3B0ciBfTV9jb3B5KF9CYXNlX3B0ciBfX3gsIF9CYXNlX3B0ciBfX3ApOworICB2b2lkIF9NX2VyYXNlKF9CYXNlX3B0ciBfX3gpOworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRpb24vZGVhbGxvY2F0aW9uCisgIF9SYl90cmVlKCkKKyAgICA6IF9SYl90cmVlX2Jhc2U8X1ZhbHVlLCBfQWxsb2M+KGFsbG9jYXRvcl90eXBlKCkpLCBfTV9ub2RlX2NvdW50KDApLCBfTV9rZXlfY29tcGFyZShfQ29tcGFyZSgpKQorICAgIHt9CisKKyAgX1JiX3RyZWUoY29uc3QgX0NvbXBhcmUmIF9fY29tcCkKKyAgICA6IF9SYl90cmVlX2Jhc2U8X1ZhbHVlLCBfQWxsb2M+KGFsbG9jYXRvcl90eXBlKCkpLCBfTV9ub2RlX2NvdW50KDApLCBfTV9rZXlfY29tcGFyZShfX2NvbXApCisgICAge30KKworICBfUmJfdHJlZShjb25zdCBfQ29tcGFyZSYgX19jb21wLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgIDogX1JiX3RyZWVfYmFzZTxfVmFsdWUsIF9BbGxvYz4oX19hKSwgX01fbm9kZV9jb3VudCgwKSwgX01fa2V5X2NvbXBhcmUoX19jb21wKQorICAgIHt9CisKKyAgX1JiX3RyZWUoY29uc3QgX1NlbGYmIF9feCkKKyAgICA6IF9SYl90cmVlX2Jhc2U8X1ZhbHVlLCBfQWxsb2M+KF9feC5nZXRfYWxsb2NhdG9yKCkpLAorICAgICAgX01fbm9kZV9jb3VudCgwKSwgX01fa2V5X2NvbXBhcmUoX194Ll9NX2tleV9jb21wYXJlKSB7CisgICAgaWYgKF9feC5fTV9yb290KCkgIT0gMCkgeworICAgICAgX1NfY29sb3IoJnRoaXMtPl9NX2hlYWRlci5fTV9kYXRhKSA9IF9TX3JiX3RyZWVfcmVkOworICAgICAgX01fcm9vdCgpID0gX01fY29weShfX3guX01fcm9vdCgpLCAmdGhpcy0+X01faGVhZGVyLl9NX2RhdGEpOworICAgICAgX01fbGVmdG1vc3QoKSA9IF9TX21pbmltdW0oX01fcm9vdCgpKTsKKyAgICAgIF9NX3JpZ2h0bW9zdCgpID0gX1NfbWF4aW11bShfTV9yb290KCkpOworICAgIH0KKyAgICBfTV9ub2RlX2NvdW50ID0gX194Ll9NX25vZGVfY291bnQ7CisgIH0KKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19NT1ZFX1NFTUFOVElDKQorICBfUmJfdHJlZShfX21vdmVfc291cmNlPF9TZWxmPiBzcmMpCisgICAgOiBfUmJfdHJlZV9iYXNlPF9WYWx1ZSwgX0FsbG9jPihfX21vdmVfc291cmNlPF9CYXNlPihzcmMuZ2V0KCkpKSwKKyAgICAgIF9NX25vZGVfY291bnQoc3JjLmdldCgpLl9NX25vZGVfY291bnQpLAorICAgICAgX01fa2V5X2NvbXBhcmUoX0FzTW92ZVNvdXJjZShzcmMuZ2V0KCkuX01fa2V5X2NvbXBhcmUpKQorICB7IHNyYy5nZXQoKS5fTV9ub2RlX2NvdW50ID0gMDsgfQorI2VuZGlmCisKKyAgfl9SYl90cmVlKCkgeyBjbGVhcigpOyB9CisgIF9TZWxmJiBvcGVyYXRvcj0oY29uc3QgX1NlbGYmIF9feCk7CisKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWNjZXNzb3JzOgorICBfQ29tcGFyZSBrZXlfY29tcCgpIGNvbnN0IHsgcmV0dXJuIF9NX2tleV9jb21wYXJlOyB9CisKKyAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBpdGVyYXRvcihfTV9sZWZ0bW9zdCgpKTsgfQorICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9NX2xlZnRtb3N0KCkpOyB9CisgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIGl0ZXJhdG9yKCZ0aGlzLT5fTV9oZWFkZXIuX01fZGF0YSk7IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX19DT05TVF9DQVNUKF9CYXNlX3B0ciwgJnRoaXMtPl9NX2hlYWRlci5fTV9kYXRhKSk7IH0KKworICByZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3QKKyAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKyAgcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSBjb25zdAorICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBfTV9ub2RlX2NvdW50ID09IDA7IH0KKyAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCB7IHJldHVybiBfTV9ub2RlX2NvdW50OyB9CisgIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHNpemVfdHlwZSgtMSk7IH0KKworICB2b2lkIHN3YXAoX1NlbGYmIF9fdCkgeworICAgIGlmIChfX3QuZW1wdHkoKSkgeworICAgICAgaWYgKHRoaXMtPmVtcHR5KCkpIHJldHVybjsKKyAgICAgIF9fdC5fTV9oZWFkZXIuc3dhcCh0aGlzLT5fTV9oZWFkZXIpOworICAgICAgX190Ll9NX3JlYmluZCgmdGhpcy0+X01faGVhZGVyLl9NX2RhdGEpOworICAgICAgdGhpcy0+X01fZW1wdHlfaW5pdGlhbGl6ZSgpOworICAgIH0KKyAgICBlbHNlIGlmICh0aGlzLT5lbXB0eSgpKSB7CisgICAgICBfX3Quc3dhcCgqdGhpcyk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGVsc2UgeworICAgICAgdGhpcy0+X01faGVhZGVyLnN3YXAoX190Ll9NX2hlYWRlcik7CisgICAgICB0aGlzLT5fTV9yZWJpbmQoJl9fdC5fTV9oZWFkZXIuX01fZGF0YSk7CisgICAgICBfX3QuX01fcmViaW5kKCZ0aGlzLT5fTV9oZWFkZXIuX01fZGF0YSk7CisgICAgfQorICAgIF9TVExQX1NURDo6c3dhcChfTV9ub2RlX2NvdW50LCBfX3QuX01fbm9kZV9jb3VudCk7CisgICAgX1NUTFBfU1REOjpzd2FwKF9NX2tleV9jb21wYXJlLCBfX3QuX01fa2V5X2NvbXBhcmUpOworICB9CisKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5zZXJ0L2VyYXNlCisgIHBhaXI8aXRlcmF0b3IsYm9vbD4gaW5zZXJ0X3VuaXF1ZShjb25zdCB2YWx1ZV90eXBlJiBfX3gpOworICBpdGVyYXRvciBpbnNlcnRfZXF1YWwoY29uc3QgdmFsdWVfdHlwZSYgX194KTsKKworICBpdGVyYXRvciBpbnNlcnRfdW5pcXVlKGl0ZXJhdG9yIF9fcG9zLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpOworICBpdGVyYXRvciBpbnNlcnRfZXF1YWwoaXRlcmF0b3IgX19wb3MsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCk7CisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZTxjbGFzcyBfSUk+IHZvaWQgaW5zZXJ0X2VxdWFsKF9JSSBfX2ZpcnN0LCBfSUkgX19sYXN0KSB7CisgICAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorICAgICAgaW5zZXJ0X2VxdWFsKCpfX2ZpcnN0KTsKKyAgfQorICB0ZW1wbGF0ZTxjbGFzcyBfSUk+IHZvaWQgaW5zZXJ0X3VuaXF1ZShfSUkgX19maXJzdCwgX0lJIF9fbGFzdCkgeworICAgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKyAgICAgIGluc2VydF91bmlxdWUoKl9fZmlyc3QpOworICB9CisjZWxzZQorICB2b2lkIGluc2VydF91bmlxdWUoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KSB7CisgICAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorICAgICAgaW5zZXJ0X3VuaXF1ZSgqX19maXJzdCk7CisgIH0KKyAgdm9pZCBpbnNlcnRfdW5pcXVlKGNvbnN0IHZhbHVlX3R5cGUqIF9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbGFzdCkgeworICAgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKyAgICAgIGluc2VydF91bmlxdWUoKl9fZmlyc3QpOworICB9CisgIHZvaWQgaW5zZXJ0X2VxdWFsKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkgeworICAgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKyAgICAgIGluc2VydF9lcXVhbCgqX19maXJzdCk7CisgIH0KKyAgdm9pZCBpbnNlcnRfZXF1YWwoY29uc3QgdmFsdWVfdHlwZSogX19maXJzdCwgY29uc3QgdmFsdWVfdHlwZSogX19sYXN0KSB7CisgICAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorICAgICAgaW5zZXJ0X2VxdWFsKCpfX2ZpcnN0KTsKKyAgfQorI2VuZGlmCisKKyAgdm9pZCBlcmFzZShpdGVyYXRvciBfX3BvcykgeworICAgIF9CYXNlX3B0ciBfX3ggPSBfUmJfZ2xvYmFsX2luc3Q6Ol9SZWJhbGFuY2VfZm9yX2VyYXNlKF9fcG9zLl9NX25vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+X01faGVhZGVyLl9NX2RhdGEuX01fcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPl9NX2hlYWRlci5fTV9kYXRhLl9NX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+X01faGVhZGVyLl9NX2RhdGEuX01fcmlnaHQpOworICAgIF9TVExQX1NURDo6X0Rlc3Ryb3koJl9TX3ZhbHVlKF9feCkpOworICAgIHRoaXMtPl9NX2hlYWRlci5kZWFsbG9jYXRlKF9fU1RBVElDX0NBU1QoX0xpbmtfdHlwZSwgX194KSwgMSk7CisgICAgLS1fTV9ub2RlX2NvdW50OworICB9CisKKyAgc2l6ZV90eXBlIGVyYXNlKGNvbnN0IGtleV90eXBlJiBfX3gpIHsKKyAgICBwYWlyPGl0ZXJhdG9yLGl0ZXJhdG9yPiBfX3AgPSBlcXVhbF9yYW5nZShfX3gpOworICAgIHNpemVfdHlwZSBfX24gPSBfU1RMUF9TVEQ6OmRpc3RhbmNlKF9fcC5maXJzdCwgX19wLnNlY29uZCk7CisgICAgZXJhc2UoX19wLmZpcnN0LCBfX3Auc2Vjb25kKTsKKyAgICByZXR1cm4gX19uOworICB9CisKKyAgc2l6ZV90eXBlIGVyYXNlX3VuaXF1ZShjb25zdCBrZXlfdHlwZSYgX194KSB7CisgICAgaXRlcmF0b3IgX19pID0gZmluZChfX3gpOworICAgIGlmIChfX2kuX01fbm9kZSAhPSAmdGhpcy0+X01faGVhZGVyLl9NX2RhdGEpIHsKKyAgICAgIGVyYXNlKF9faSk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7CisgIH0KKworICB2b2lkIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkgeworICAgIGlmIChfX2ZpcnN0Ll9NX25vZGUgPT0gdGhpcy0+X01faGVhZGVyLl9NX2RhdGEuX01fbGVmdCAmJiAvLyBiZWdpbigpCisgICAgICAgIF9fbGFzdC5fTV9ub2RlID09ICZ0aGlzLT5fTV9oZWFkZXIuX01fZGF0YSkgICAgICAgICAgIC8vIGVuZCgpCisgICAgICBjbGVhcigpOworICAgIGVsc2UKKyAgICAgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkgZXJhc2UoX19maXJzdCsrKTsKKyAgfQorCisgIHZvaWQgZXJhc2UoY29uc3Qga2V5X3R5cGUqIF9fZmlyc3QsIGNvbnN0IGtleV90eXBlKiBfX2xhc3QpIHsKKyAgICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QpIGVyYXNlKCpfX2ZpcnN0KyspOworICB9CisKKyAgdm9pZCBjbGVhcigpIHsKKyAgICBpZiAoX01fbm9kZV9jb3VudCAhPSAwKSB7CisgICAgICBfTV9lcmFzZShfTV9yb290KCkpOworICAgICAgX01fbGVmdG1vc3QoKSA9ICZ0aGlzLT5fTV9oZWFkZXIuX01fZGF0YTsKKyAgICAgIF9NX3Jvb3QoKSA9IDA7CisgICAgICBfTV9yaWdodG1vc3QoKSA9ICZ0aGlzLT5fTV9oZWFkZXIuX01fZGF0YTsKKyAgICAgIF9NX25vZGVfY291bnQgPSAwOworICAgIH0KKyAgfQorCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBvcGVyYXRpb25zOgorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgaXRlcmF0b3IgZmluZChjb25zdCBfS1QmIF9faykgeyByZXR1cm4gaXRlcmF0b3IoX01fZmluZChfX2spKTsgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgY29uc3RfaXRlcmF0b3IgZmluZChjb25zdCBfS1QmIF9faykgY29uc3QgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX01fZmluZChfX2spKTsgfQorcHJpdmF0ZToKKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIF9CYXNlX3B0ciBfTV9maW5kKGNvbnN0IF9LVCYgX19rKSBjb25zdCB7CisgICAgX0Jhc2VfcHRyIF9feSA9IF9fQ09OU1RfQ0FTVChfQmFzZV9wdHIsICZ0aGlzLT5fTV9oZWFkZXIuX01fZGF0YSk7ICAgICAgLy8gTGFzdCBub2RlIHdoaWNoIGlzIG5vdCBsZXNzIHRoYW4gX19rLgorICAgIF9CYXNlX3B0ciBfX3ggPSBfTV9yb290KCk7ICAgICAgLy8gQ3VycmVudCBub2RlLgorCisgICAgd2hpbGUgKF9feCAhPSAwKQorICAgICAgaWYgKCFfTV9rZXlfY29tcGFyZShfU19rZXkoX194KSwgX19rKSkKKyAgICAgICAgX195ID0gX194LCBfX3ggPSBfU19sZWZ0KF9feCk7CisgICAgICBlbHNlCisgICAgICAgIF9feCA9IF9TX3JpZ2h0KF9feCk7CisKKyAgICBpZiAoX195ICE9ICZ0aGlzLT5fTV9oZWFkZXIuX01fZGF0YSkgeworICAgICAgaWYgKF9NX2tleV9jb21wYXJlKF9faywgX1Nfa2V5KF9feSkpKSB7CisgICAgICAgIF9feSA9IF9fQ09OU1RfQ0FTVChfQmFzZV9wdHIsICZ0aGlzLT5fTV9oZWFkZXIuX01fZGF0YSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBfX3k7CisgIH0KKworICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgX0Jhc2VfcHRyIF9NX2xvd2VyX2JvdW5kKGNvbnN0IF9LVCYgX19rKSBjb25zdCB7CisgICAgX0Jhc2VfcHRyIF9feSA9IF9fQ09OU1RfQ0FTVChfQmFzZV9wdHIsICZ0aGlzLT5fTV9oZWFkZXIuX01fZGF0YSk7IC8qIExhc3Qgbm9kZSB3aGljaCBpcyBub3QgbGVzcyB0aGFuIF9fay4gKi8KKyAgICBfQmFzZV9wdHIgX194ID0gX01fcm9vdCgpOyAvKiBDdXJyZW50IG5vZGUuICovCisKKyAgICB3aGlsZSAoX194ICE9IDApCisgICAgICBpZiAoIV9NX2tleV9jb21wYXJlKF9TX2tleShfX3gpLCBfX2spKQorICAgICAgICBfX3kgPSBfX3gsIF9feCA9IF9TX2xlZnQoX194KTsKKyAgICAgIGVsc2UKKyAgICAgICAgX194ID0gX1NfcmlnaHQoX194KTsKKworICAgIHJldHVybiBfX3k7CisgIH0KKworICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgX0Jhc2VfcHRyIF9NX3VwcGVyX2JvdW5kKGNvbnN0IF9LVCYgX19rKSBjb25zdCB7CisgICAgX0Jhc2VfcHRyIF9feSA9IF9fQ09OU1RfQ0FTVChfQmFzZV9wdHIsICZ0aGlzLT5fTV9oZWFkZXIuX01fZGF0YSk7IC8qIExhc3Qgbm9kZSB3aGljaCBpcyBncmVhdGVyIHRoYW4gX19rLiAqLworICAgIF9CYXNlX3B0ciBfX3ggPSBfTV9yb290KCk7IC8qIEN1cnJlbnQgbm9kZS4gKi8KKworICAgIHdoaWxlIChfX3ggIT0gMCkKKyAgICAgIGlmIChfTV9rZXlfY29tcGFyZShfX2ssIF9TX2tleShfX3gpKSkKKyAgICAgICAgX195ID0gX194LCBfX3ggPSBfU19sZWZ0KF9feCk7CisgICAgICBlbHNlCisgICAgICAgIF9feCA9IF9TX3JpZ2h0KF9feCk7CisKKyAgICByZXR1cm4gX195OworICB9CisKK3B1YmxpYzoKKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIHNpemVfdHlwZSBjb3VudChjb25zdCBfS1QmIF9feCkgY29uc3QgeworICAgIHBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPiBfX3AgPSBlcXVhbF9yYW5nZShfX3gpOworICAgIHJldHVybiBfU1RMUF9TVEQ6OmRpc3RhbmNlKF9fcC5maXJzdCwgX19wLnNlY29uZCk7CisgIH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIGl0ZXJhdG9yIGxvd2VyX2JvdW5kKGNvbnN0IF9LVCYgX194KSB7IHJldHVybiBpdGVyYXRvcihfTV9sb3dlcl9ib3VuZChfX3gpKTsgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgY29uc3RfaXRlcmF0b3IgbG93ZXJfYm91bmQoY29uc3QgX0tUJiBfX3gpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9NX2xvd2VyX2JvdW5kKF9feCkpOyB9CisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBpdGVyYXRvciB1cHBlcl9ib3VuZChjb25zdCBfS1QmIF9feCkgeyByZXR1cm4gaXRlcmF0b3IoX01fdXBwZXJfYm91bmQoX194KSk7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIGNvbnN0X2l0ZXJhdG9yIHVwcGVyX2JvdW5kKGNvbnN0IF9LVCYgX194KSBjb25zdCB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfTV91cHBlcl9ib3VuZChfX3gpKTsgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgcGFpcjxpdGVyYXRvcixpdGVyYXRvcj4gZXF1YWxfcmFuZ2UoY29uc3QgX0tUJiBfX3gpCisgIHsgcmV0dXJuIHBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPihsb3dlcl9ib3VuZChfX3gpLCB1cHBlcl9ib3VuZChfX3gpKTsgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgcGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+IGVxdWFsX3JhbmdlKGNvbnN0IF9LVCYgX194KSBjb25zdAorICB7IHJldHVybiBwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4obG93ZXJfYm91bmQoX194KSwgdXBwZXJfYm91bmQoX194KSk7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIHBhaXI8aXRlcmF0b3IsaXRlcmF0b3I+IGVxdWFsX3JhbmdlX3VuaXF1ZShjb25zdCBfS1QmIF9feCkgeworICAgIHBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPiBfX3A7CisgICAgX19wLnNlY29uZCA9IGxvd2VyX2JvdW5kKF9feCk7CisgICAgaWYgKF9fcC5zZWNvbmQuX01fbm9kZSAhPSAmdGhpcy0+X01faGVhZGVyLl9NX2RhdGEgJiYKKyAgICAgICAgIV9NX2tleV9jb21wYXJlKF9feCwgX1Nfa2V5KF9fcC5zZWNvbmQuX01fbm9kZSkpKSB7CisgICAgICBfX3AuZmlyc3QgPSBfX3Auc2Vjb25kKys7CisgICAgfQorICAgIGVsc2UgeworICAgICAgX19wLmZpcnN0ID0gX19wLnNlY29uZDsKKyAgICB9CisgICAgcmV0dXJuIF9fcDsKKyAgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgcGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+IGVxdWFsX3JhbmdlX3VuaXF1ZShjb25zdCBfS1QmIF9feCkgY29uc3QgeworICAgIHBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPiBfX3A7CisgICAgX19wLnNlY29uZCA9IGxvd2VyX2JvdW5kKF9feCk7CisgICAgaWYgKF9fcC5zZWNvbmQuX01fbm9kZSAhPSAmdGhpcy0+X01faGVhZGVyLl9NX2RhdGEgJiYKKyAgICAgICAgIV9NX2tleV9jb21wYXJlKF9feCwgX1Nfa2V5KF9fcC5zZWNvbmQuX01fbm9kZSkpKSB7CisgICAgICBfX3AuZmlyc3QgPSBfX3Auc2Vjb25kKys7CisgICAgfQorICAgIGVsc2UgeworICAgICAgX19wLmZpcnN0ID0gX19wLnNlY29uZDsKKyAgICB9CisgICAgcmV0dXJuIF9fcDsKKyAgfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpCitwdWJsaWM6CisgIC8vIERlYnVnZ2luZy4KKyAgYm9vbCBfX3JiX3ZlcmlmeSgpIGNvbnN0OworI2VuZGlmIC8vX1NUTFBfREVCVUcKK307CisKKyNpZiBkZWZpbmVkIChfU1RMUF9ERUJVRykKKyMgIHVuZGVmIF9SYl90cmVlCisjZW5kaWYKKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2lmICFkZWZpbmVkIChfU1RMUF9MSU5LX1RJTUVfSU5TVEFOVElBVElPTikKKyMgIGluY2x1ZGUgPHN0bC9fdHJlZS5jPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9ERUJVRykKKyMgIGluY2x1ZGUgPHN0bC9kZWJ1Zy9fdHJlZS5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisjZGVmaW5lIF9TVExQX1RFTVBMQVRFX0hFQURFUiB0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0tleU9mVmFsdWUsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KKyNkZWZpbmUgX1NUTFBfVEVNUExBVEVfQ09OVEFJTkVSIF9TVExQX1BSSVYgX1JiX3RyZWU8X0tleSxfQ29tcGFyZSxfVmFsdWUsX0tleU9mVmFsdWUsX1RyYWl0cyxfQWxsb2M+CisjaW5jbHVkZSA8c3RsL19yZWxvcHNfY29udC5oPgorI3VuZGVmIF9TVExQX1RFTVBMQVRFX0NPTlRBSU5FUgorI3VuZGVmIF9TVExQX1RFTVBMQVRFX0hFQURFUgorCisjaWYgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikgJiYgIWRlZmluZWQgKF9TVExQX05PX01PVkVfU0VNQU5USUMpCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0tleU9mVmFsdWUsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK3N0cnVjdCBfX21vdmVfdHJhaXRzPF9TVExQX1BSSVYgX1JiX3RyZWU8X0tleSwgX0NvbXBhcmUsIF9WYWx1ZSwgX0tleU9mVmFsdWUsIF9UcmFpdHMsIF9BbGxvYz4gPgorICA6IF9TVExQX1BSSVYgX19tb3ZlX3RyYWl0c19oZWxwMjxfQ29tcGFyZSwgX0FsbG9jPiB7fTsKKyNlbmRpZgorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9UUkVFX0ggKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL190eXBlaW5mby5oIGIvc3RscG9ydC9zdGwvX3R5cGVpbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQzYmE1NgotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc3RsL190eXBlaW5mby5oCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX1RZUEVJTkZPCisjZGVmaW5lIF9TVExQX0lOVEVSTkFMX1RZUEVJTkZPCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fVFlQRUlORk8pCisKKyMgIGlmIGRlZmluZWQgKF9TVExQX05PX05FV19ORVdfSEVBREVSKQorIyAgICBpbmNsdWRlIDx0eXBlaW5mby5oPgorIyAgZWxzZQorIyAgICBpZiBkZWZpbmVkIChfU1RMUF9IQVNfSU5DTFVERV9ORVhUKQorIyAgICAgIGluY2x1ZGVfbmV4dCA8dHlwZWluZm8+CisjICAgIGVsc2UKKyMgICAgICBpbmNsdWRlIF9TVExQX05BVElWRV9DUFBfUlVOVElNRV9IRUFERVIodHlwZWluZm8pCisjICAgIGVuZGlmCisjICBlbmRpZgorCisjICBpZiAoZGVmaW5lZChfU1RMUF9NU1ZDKSAmJiAoX1NUTFBfTVNWQyA+PSAxMzAwKSkgfHwgKGRlZmluZWQoX19JTlRFTF9DT01QSUxFUikgJiYgKF9fSU5URUxfQ09NUElMRVIgPj0gODAwKSkKKy8vIEluIC5ORVQsIDx0eXBlaW5mbz4gYWN0dWFsbHkgaW5jbHVkZXMgPHR5cGVpbmZvLmg+CisjICAgIHVuZGVmIF9TVExQX09MRFNURF90eXBlaW5mbworIyAgZW5kaWYKKworLy8gaWYgPHR5cGVpbmZvLmg+IGFscmVhZHkgaW5jbHVkZWQsIGRvIG5vdCBpbXBvcnQgYW55dGhpbmcKKyMgIGlmIGRlZmluZWQoX1NUTFBfVVNFX05BTUVTUEFDRVMpICYmICFkZWZpbmVkKF9TVExQX09MRFNURF90eXBlaW5mbykgJiYgXAorICAgICAgKGRlZmluZWQoX1NUTFBfVkVORE9SX0dMT0JBTF9FWENFUFRfU1REKSB8fCBcCisgICAgICAgZGVmaW5lZChfU1RMUF9VU0VfT1dOX05BTUVTUEFDRSkgfHwgZGVmaW5lZCAoX1NUTFBfREVCVUcpKQorIyAgICBpZiBkZWZpbmVkKF9TVExQX01TVkMpICYmIChfU1RMUF9NU1ZDIDwgMTMwMCkgJiYgIWRlZmluZWQoX1NUTFBfV0NFX05FVCkKK2NsYXNzIGJhZF9jYXN0IDogcHVibGljIGV4Y2VwdGlvbiB7fTsKKyMgICAgZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisvLyBWQyA2IGFuZCBlVkMgNCBoYXZlIHR5cGVfaW5mbyBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZQorIyAgICBpZiAoZGVmaW5lZChfU1RMUF9NU1ZDKSAmJiAoX1NUTFBfTVNWQyA8IDEzMDApKSB8fCBkZWZpbmVkKF9TVExQX1dDRV9ORVQpCit1c2luZyA6OnR5cGVfaW5mbzsKKyMgICAgZWxzZQordXNpbmcgX1NUTFBfVkVORE9SX0VYQ0VQVF9TVEQ6OnR5cGVfaW5mbzsKKyMgICAgZW5kaWYKKworIyAgICBpZiAhZGVmaW5lZCAoX19ETUNfXykKK3VzaW5nIF9TVExQX1ZFTkRPUl9FWENFUFRfU1REOjpiYWRfdHlwZWlkOworIyAgICBlbmRpZgorCisjICAgIGlmIGRlZmluZWQgKF9TVExQX01TVkMpICYmIChfU1RMUF9NU1ZDIDwgMTMwMCkgJiYgIWRlZmluZWQgKF9TVExQX1dDRV9ORVQpCit1c2luZyA6OmJhZF9jYXN0OworIyAgICBlbHNlCit1c2luZyBfU1RMUF9WRU5ET1JfRVhDRVBUX1NURDo6YmFkX2Nhc3Q7CisjICAgIGVuZGlmCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworIyAgZW5kaWYKKworI2Vsc2UKKworIyAgaWZuZGVmIF9TVExQX0lOVEVSTkFMX0VYQ0VQVElPTgorIyAgICBpbmNsdWRlIDxzdGwvX2V4Y2VwdGlvbi5oPgorIyAgZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisjICBpZiAhZGVmaW5lZCAoX19ETUNfXykKK3N0cnVjdCBiYWRfY2FzdCA6IGV4Y2VwdGlvbiB7fTsKKyMgIGVuZGlmCitfU1RMUF9FTkRfTkFNRVNQQUNFCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9fdW5pbml0aWFsaXplZC5oIGIvc3RscG9ydC9zdGwvX3VuaW5pdGlhbGl6ZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDg5YTk0Ci0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvX3VuaW5pdGlhbGl6ZWQuaApAQCAtMCwwICsxLDQ0MyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKy8qIE5PVEU6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIFNUTCBoZWFkZXJzLgorICogICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4KKyAqLworCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX1VOSU5JVElBTElaRURfSAorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9VTklOSVRJQUxJWkVEX0gKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DU1RSSU5HCisjICBpbmNsdWRlIDxzdGwvX2NzdHJpbmcuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0FMR09CQVNFX0gKKyMgIGluY2x1ZGUgPHN0bC9fYWxnb2Jhc2UuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NPTlNUUlVDVF9ICisjICBpbmNsdWRlIDxzdGwvX2NvbnN0cnVjdC5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKKy8vIHVuaW5pdGlhbGl6ZWRfY29weQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX091dHB1dEl0ZXIsIGNsYXNzIF9EaXN0YW5jZT4KK2lubGluZSBfT3V0cHV0SXRlciBfX3Vjb3B5KF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlciBfX3Jlc3VsdCwgX0Rpc3RhbmNlKikgeworICBfT3V0cHV0SXRlciBfX2N1ciA9IF9fcmVzdWx0OworICBfU1RMUF9UUlkgeworICAgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCwgKytfX2N1cikKKyAgICAgIF9QYXJhbV9Db25zdHJ1Y3QoJipfX2N1ciwgKl9fZmlyc3QpOworICAgIHJldHVybiBfX2N1cjsKKyAgfQorICBfU1RMUF9VTldJTkQoX1NUTFBfU1REOjpfRGVzdHJveV9SYW5nZShfX3Jlc3VsdCwgX19jdXIpKQorICBfU1RMUF9SRVRfQUZURVJfVEhST1coX19jdXIpCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfT3V0cHV0SXRlciwgY2xhc3MgX0Rpc3RhbmNlPgoraW5saW5lIF9PdXRwdXRJdGVyIF9fdWNvcHkoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0LCBjb25zdCBpbnB1dF9pdGVyYXRvcl90YWcgJiwgX0Rpc3RhbmNlKiBfX2QpCit7IHJldHVybiBfX3Vjb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQsIF9fZCk7IH0KKworI2lmIGRlZmluZWQgKF9TVExQX05PTlRFTVBMX0JBU0VfTUFUQ0hfQlVHKQordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9PdXRwdXRJdGVyLCBjbGFzcyBfRGlzdGFuY2U+CitpbmxpbmUgX091dHB1dEl0ZXIgX191Y29weShfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXIgX19yZXN1bHQsIGNvbnN0IGZvcndhcmRfaXRlcmF0b3JfdGFnICYsIF9EaXN0YW5jZSogX19kKQoreyByZXR1cm4gX191Y29weShfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0LCBfX2QpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfT3V0cHV0SXRlciwgY2xhc3MgX0Rpc3RhbmNlPgoraW5saW5lIF9PdXRwdXRJdGVyIF9fdWNvcHkoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0LCBjb25zdCBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZyAmLCBfRGlzdGFuY2UqIF9fZCkKK3sgcmV0dXJuIF9fdWNvcHkoX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCwgX19kKTsgfQorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX091dHB1dEl0ZXIsIGNsYXNzIF9EaXN0YW5jZT4KK2lubGluZSBfT3V0cHV0SXRlciBfX3Vjb3B5KF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0LCBjb25zdCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyAmLCBfRGlzdGFuY2UqKSB7CisgIF9PdXRwdXRJdGVyIF9fY3VyID0gX19yZXN1bHQ7CisgIF9TVExQX1RSWSB7CisgICAgZm9yIChfRGlzdGFuY2UgX19uID0gX19sYXN0IC0gX19maXJzdDsgX19uID4gMDsgLS1fX24pIHsKKyAgICAgIF9QYXJhbV9Db25zdHJ1Y3QoJipfX2N1ciwgKl9fZmlyc3QpOworICAgICAgKytfX2ZpcnN0OworICAgICAgKytfX2N1cjsKKyAgICB9CisgICAgcmV0dXJuIF9fY3VyOworICB9CisgIF9TVExQX1VOV0lORChfU1RMUF9TVEQ6Ol9EZXN0cm95X1JhbmdlKF9fcmVzdWx0LCBfX2N1cikpCisgIF9TVExQX1JFVF9BRlRFUl9USFJPVyhfX2N1cikKK30KKworLy9Vc2VkIGludGVybmFseQordGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBjbGFzcyBfT3V0cHV0SXRlcj4KK2lubGluZSBfT3V0cHV0SXRlciBfX3Vjb3B5KF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwgX091dHB1dEl0ZXIgX19yZXN1bHQpCit7IHJldHVybiBfX3Vjb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQsIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKCksIChwdHJkaWZmX3QqKTApOyB9CisKK2lubGluZSB2b2lkKgorX191Y29weV90cml2aWFsKGNvbnN0IHZvaWQqIF9fZmlyc3QsIGNvbnN0IHZvaWQqIF9fbGFzdCwgdm9pZCogX19yZXN1bHQpIHsKKyAgLy9kdW1zOiB0aGlzIHZlcnNpb24gY2FuIHVzZSBtZW1jcHkgKF9fY29weV90cml2aWFsIGNhbid0KQorICByZXR1cm4gKF9fbGFzdCA9PSBfX2ZpcnN0KSA/IF9fcmVzdWx0IDoKKyAgICAoKGNoYXIqKW1lbWNweShfX3Jlc3VsdCwgX19maXJzdCwgKChjb25zdCBjaGFyKilfX2xhc3QgLSAoY29uc3QgY2hhciopX19maXJzdCkpKSArCisgICAgKChjb25zdCBjaGFyKilfX2xhc3QgLSAoY29uc3QgY2hhciopX19maXJzdCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfT3V0cHV0SXRlcj4KK2lubGluZSBfT3V0cHV0SXRlciBfX3Vjb3B5X3B0cnMoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwgX091dHB1dEl0ZXIgX19yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypUcml2aWFsVUNvcHkqLykKK3sgcmV0dXJuIF9fdWNvcHkoX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCwgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcoKSwgKHB0cmRpZmZfdCopMCk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9PdXRwdXRJdGVyPgoraW5saW5lIF9PdXRwdXRJdGVyIF9fdWNvcHlfcHRycyhfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LCBfT3V0cHV0SXRlciBfX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX190cnVlX3R5cGUmIC8qVHJpdmlhbFVDb3B5Ki8pIHsKKyAgLy8gd2Uga25vdyB0aGV5IGFsbCBwb2ludGVycywgc28gdGhpcyBjYXN0IGlzIE9LCisgIC8vICByZXR1cm4gKF9PdXRwdXRJdGVyKV9fY29weV90cml2aWFsKCYoKl9fZmlyc3QpLCAmKCpfX2xhc3QpLCAmKCpfX3Jlc3VsdCkpOworICByZXR1cm4gKF9PdXRwdXRJdGVyKV9fdWNvcHlfdHJpdmlhbChfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9PdXRwdXRJdGVyPgoraW5saW5lIF9PdXRwdXRJdGVyIF9fdWNvcHlfYXV4KF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsIF9PdXRwdXRJdGVyIF9fcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKkJvdGhQdHJUeXBlKi8pIHsKKyAgcmV0dXJuIF9fdWNvcHlfcHRycyhfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgIF9Vc2VUcml2aWFsVUNvcHkoX1NUTFBfVkFMVUVfVFlQRShfX2ZpcnN0LCBfSW5wdXRJdGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1ZBTFVFX1RZUEUoX19yZXN1bHQsIF9PdXRwdXRJdGVyKSkuX0Fuc3dlcigpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9PdXRwdXRJdGVyPgoraW5saW5lIF9PdXRwdXRJdGVyIF9fdWNvcHlfYXV4KF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsIF9PdXRwdXRJdGVyIF9fcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypCb3RoUHRyVHlwZSovKSB7CisgIHJldHVybiBfX3Vjb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQsCisgICAgICAgICAgICAgICAgIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9fZmlyc3QsIF9JbnB1dEl0ZXIpLAorICAgICAgICAgICAgICAgICBfU1RMUF9ESVNUQU5DRV9UWVBFKF9fZmlyc3QsIF9JbnB1dEl0ZXIpKTsKK30KKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfRm9yd2FyZEl0ZXI+CitpbmxpbmUgX0ZvcndhcmRJdGVyCit1bmluaXRpYWxpemVkX2NvcHkoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwgX0ZvcndhcmRJdGVyIF9fcmVzdWx0KQoreyByZXR1cm4gX1NUTFBfUFJJViBfX3Vjb3B5X2F1eChfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0LCBfQm90aFB0clR5cGU8IF9JbnB1dEl0ZXIsIF9Gb3J3YXJkSXRlcj46Ol9BbnN3ZXIoKSk7IH0KKworaW5saW5lIGNoYXIqCit1bmluaXRpYWxpemVkX2NvcHkoY29uc3QgY2hhciogX19maXJzdCwgY29uc3QgY2hhciogX19sYXN0LCBjaGFyKiBfX3Jlc3VsdCkKK3sgcmV0dXJuICAoY2hhciopX1NUTFBfUFJJViBfX3Vjb3B5X3RyaXZpYWwoX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCk7IH0KKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfSEFTX1dDSEFSX1QpIC8vIGR3YSA4LzE1Lzk3CitpbmxpbmUgd2NoYXJfdCoKK3VuaW5pdGlhbGl6ZWRfY29weShjb25zdCB3Y2hhcl90KiBfX2ZpcnN0LCBjb25zdCB3Y2hhcl90KiBfX2xhc3QsIHdjaGFyX3QqIF9fcmVzdWx0KQoreyByZXR1cm4gICh3Y2hhcl90KilfU1RMUF9QUklWIF9fdWNvcHlfdHJpdmlhbCAoX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCk7IH0KKyMgIGVuZGlmCisKKy8vIHVuaW5pdGlhbGl6ZWRfY29weV9uIChub3QgcGFydCBvZiB0aGUgQysrIHN0YW5kYXJkKQorX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX1NpemUsIGNsYXNzIF9Gb3J3YXJkSXRlcj4KK19TVExQX0lOTElORV9MT09QCitwYWlyPF9JbnB1dEl0ZXIsIF9Gb3J3YXJkSXRlcj4KK19fdWNvcHlfbihfSW5wdXRJdGVyIF9fZmlyc3QsIF9TaXplIF9fY291bnQsIF9Gb3J3YXJkSXRlciBfX3Jlc3VsdCwKKyAgICAgICAgICBjb25zdCBpbnB1dF9pdGVyYXRvcl90YWcgJikgeworICBfRm9yd2FyZEl0ZXIgX19jdXIgPSBfX3Jlc3VsdDsKKyAgX1NUTFBfVFJZIHsKKyAgICBmb3IgKCA7IF9fY291bnQgPiAwIDsgLS1fX2NvdW50LCArK19fZmlyc3QsICsrX19jdXIpCisgICAgICBfUGFyYW1fQ29uc3RydWN0KCYqX19jdXIsICpfX2ZpcnN0KTsKKyAgICByZXR1cm4gcGFpcjxfSW5wdXRJdGVyLCBfRm9yd2FyZEl0ZXI+KF9fZmlyc3QsIF9fY3VyKTsKKyAgfQorICBfU1RMUF9VTldJTkQoX1NUTFBfU1REOjpfRGVzdHJveV9SYW5nZShfX3Jlc3VsdCwgX19jdXIpKQorICBfU1RMUF9SRVRfQUZURVJfVEhST1coKHBhaXI8X0lucHV0SXRlciwgX0ZvcndhcmRJdGVyPihfX2ZpcnN0LCBfX2N1cikpKQorfQorCisjICBpZiBkZWZpbmVkIChfU1RMUF9OT05URU1QTF9CQVNFX01BVENIX0JVRykKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfU2l6ZSwgY2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KK2lubGluZSBwYWlyPF9JbnB1dEl0ZXIsIF9Gb3J3YXJkSXRlcmF0b3I+CitfX3Vjb3B5X24oX0lucHV0SXRlciBfX2ZpcnN0LCBfU2l6ZSBfX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3J3YXJkX2l0ZXJhdG9yX3RhZyAmKQoreyByZXR1cm4gX191Y29weV9uKF9fZmlyc3QsIF9fY291bnQsIF9fcmVzdWx0LCBpbnB1dF9pdGVyYXRvcl90YWcoKSk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9TaXplLCBjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgoraW5saW5lIHBhaXI8X0lucHV0SXRlciwgX0ZvcndhcmRJdGVyYXRvcj4KK19fdWNvcHlfbihfSW5wdXRJdGVyIF9fZmlyc3QsIF9TaXplIF9fY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnICYpCit7IHJldHVybiBfX3Vjb3B5X24oX19maXJzdCwgX19jb3VudCwgX19yZXN1bHQsIGlucHV0X2l0ZXJhdG9yX3RhZygpKTsgfQorIyAgZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBjbGFzcyBfU2l6ZSwgY2xhc3MgX0ZvcndhcmRJdGVyPgoraW5saW5lIHBhaXI8X1JhbmRvbUFjY2Vzc0l0ZXIsIF9Gb3J3YXJkSXRlcj4KK19fdWNvcHlfbihfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LCBfU2l6ZSBfX2NvdW50LCBfRm9yd2FyZEl0ZXIgX19yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnICYpIHsKKyAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0ID0gX19maXJzdCArIF9fY291bnQ7CisgIHJldHVybiBwYWlyPF9SYW5kb21BY2Nlc3NJdGVyLCBfRm9yd2FyZEl0ZXI+KF9fbGFzdCwgdW5pbml0aWFsaXplZF9jb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQpKTsKK30KKworLy8gVGhpcyBpcyB1c2VkIGludGVybmFsbHkgaW4gPHJvcGU+ICwgd2hpY2ggaXMgZXh0ZW5zaW9uIGl0c2VsZi4KK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfU2l6ZSwgY2xhc3MgX0ZvcndhcmRJdGVyPgoraW5saW5lIHBhaXI8X0lucHV0SXRlciwgX0ZvcndhcmRJdGVyPgorX191Y29weV9uKF9JbnB1dEl0ZXIgX19maXJzdCwgX1NpemUgX19jb3VudCwgX0ZvcndhcmRJdGVyIF9fcmVzdWx0KQoreyByZXR1cm4gX1NUTFBfUFJJViBfX3Vjb3B5X24oX19maXJzdCwgX19jb3VudCwgX19yZXN1bHQsIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9fZmlyc3QsIF9JbnB1dEl0ZXIpKTsgfQorCisjaWYgIWRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpCisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX1NpemUsIGNsYXNzIF9Gb3J3YXJkSXRlcj4KK2lubGluZSBwYWlyPF9JbnB1dEl0ZXIsIF9Gb3J3YXJkSXRlcj4KK3VuaW5pdGlhbGl6ZWRfY29weV9uKF9JbnB1dEl0ZXIgX19maXJzdCwgX1NpemUgX19jb3VudCwgX0ZvcndhcmRJdGVyIF9fcmVzdWx0KQoreyByZXR1cm4gX1NUTFBfUFJJViBfX3Vjb3B5X24oX19maXJzdCwgX19jb3VudCwgX19yZXN1bHQpOyB9CisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKworI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9UcCwgY2xhc3MgX0Rpc3RhbmNlPgoraW5saW5lIHZvaWQgX191ZmlsbChfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwgY29uc3QgX1RwJiBfX3gsIF9EaXN0YW5jZSopIHsKKyAgX0ZvcndhcmRJdGVyIF9fY3VyID0gX19maXJzdDsKKyAgX1NUTFBfVFJZIHsKKyAgICBmb3IgKCA7IF9fY3VyICE9IF9fbGFzdDsgKytfX2N1cikKKyAgICAgIF9QYXJhbV9Db25zdHJ1Y3QoJipfX2N1ciwgX194KTsKKyAgfQorICBfU1RMUF9VTldJTkQoX1NUTFBfU1REOjpfRGVzdHJveV9SYW5nZShfX2ZpcnN0LCBfX2N1cikpCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9UcCwgY2xhc3MgX0Rpc3RhbmNlPgoraW5saW5lIHZvaWQgX191ZmlsbChfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgX1RwJiBfX3gsIGNvbnN0IGlucHV0X2l0ZXJhdG9yX3RhZyAmLCBfRGlzdGFuY2UqIF9fZCkKK3sgX191ZmlsbChfX2ZpcnN0LCBfX2xhc3QsIF9feCwgX19kKTsgfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfTk9OVEVNUExfQkFTRV9NQVRDSF9CVUcpCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfVHAsIGNsYXNzIF9EaXN0YW5jZT4KK2lubGluZSB2b2lkIF9fdWZpbGwoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9UcCYgX194LCBjb25zdCBmb3J3YXJkX2l0ZXJhdG9yX3RhZyAmLCBfRGlzdGFuY2UqIF9fZCkKK3sgX191ZmlsbChfX2ZpcnN0LCBfX2xhc3QsIF9feCwgX19kKTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfVHAsIGNsYXNzIF9EaXN0YW5jZT4KK2lubGluZSB2b2lkIF9fdWZpbGwoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9UcCYgX194LCBjb25zdCBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZyAmLCBfRGlzdGFuY2UqIF9fZCkKK3sgX191ZmlsbChfX2ZpcnN0LCBfX2xhc3QsIF9feCwgX19kKTsgfQorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9UcCwgY2xhc3MgX0Rpc3RhbmNlPgoraW5saW5lIHZvaWQgX191ZmlsbChfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgX1RwJiBfX3gsIGNvbnN0IHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnICYsIF9EaXN0YW5jZSopIHsKKyAgX0ZvcndhcmRJdGVyIF9fY3VyID0gX19maXJzdDsKKyAgX1NUTFBfVFJZIHsKKyAgICBmb3IgKF9EaXN0YW5jZSBfX24gPSBfX2xhc3QgLSBfX2ZpcnN0OyBfX24gPiAwOyAtLV9fbiwgKytfX2N1cikKKyAgICAgIF9QYXJhbV9Db25zdHJ1Y3QoJipfX2N1ciwgX194KTsKKyAgfQorICBfU1RMUF9VTldJTkQoX1NUTFBfU1REOjpfRGVzdHJveV9SYW5nZShfX2ZpcnN0LCBfX2N1cikpCit9CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfVHA+CitpbmxpbmUgdm9pZCB1bmluaXRpYWxpemVkX2ZpbGwoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsICBjb25zdCBfVHAmIF9feCkgeworICBfU1RMUF9QUklWIF9fdWZpbGwoX19maXJzdCwgX19sYXN0LCBfX3gsCisgICAgICAgICAgICAgICAgICAgICBfU1RMUF9JVEVSQVRPUl9DQVRFR09SWShfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIpLAorICAgICAgICAgICAgICAgICAgICAgX1NUTFBfRElTVEFOQ0VfVFlQRShfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIpKTsKK30KKworLy8gU3BlY2lhbGl6YXRpb246IGZvciBvbmUtYnl0ZSB0eXBlcyB3ZSBjYW4gdXNlIG1lbXNldC4KK2lubGluZSB2b2lkIHVuaW5pdGlhbGl6ZWRfZmlsbCh1bnNpZ25lZCBjaGFyKiBfX2ZpcnN0LCB1bnNpZ25lZCBjaGFyKiBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciYgX192YWwpIHsKKyAgdW5zaWduZWQgY2hhciBfX3RtcCA9IF9fdmFsOworICBtZW1zZXQoX19maXJzdCwgX190bXAsIF9fbGFzdCAtIF9fZmlyc3QpOworfQorI2lmICFkZWZpbmVkIChfU1RMUF9OT19TSUdORURfQlVJTFRJTlMpCitpbmxpbmUgdm9pZCB1bmluaXRpYWxpemVkX2ZpbGwoc2lnbmVkIGNoYXIqIF9fZmlyc3QsIHNpZ25lZCBjaGFyKiBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2lnbmVkIGNoYXImIF9fdmFsKSB7CisgIHNpZ25lZCBjaGFyIF9fdG1wID0gX192YWw7CisgIG1lbXNldChfX2ZpcnN0LCBfX1NUQVRJQ19DQVNUKHVuc2lnbmVkIGNoYXIsX190bXApLCBfX2xhc3QgLSBfX2ZpcnN0KTsKK30KKyNlbmRpZgoraW5saW5lIHZvaWQgdW5pbml0aWFsaXplZF9maWxsKGNoYXIqIF9fZmlyc3QsIGNoYXIqIF9fbGFzdCwgY29uc3QgY2hhciYgX192YWwpIHsKKyAgY2hhciBfX3RtcCA9IF9fdmFsOworICBtZW1zZXQoX19maXJzdCwgX19TVEFUSUNfQ0FTVCh1bnNpZ25lZCBjaGFyLF9fdG1wKSwgX19sYXN0IC0gX19maXJzdCk7Cit9CisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1NpemUsIGNsYXNzIF9UcD4KK2lubGluZSBfRm9yd2FyZEl0ZXIgX191ZmlsbF9uKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfU2l6ZSBfX24sIGNvbnN0IF9UcCYgX194KSB7CisgIF9Gb3J3YXJkSXRlciBfX2N1ciA9IF9fZmlyc3Q7CisgIF9TVExQX1RSWSB7CisgICAgZm9yICggOyBfX24gPiAwOyAtLV9fbiwgKytfX2N1cikKKyAgICAgIF9QYXJhbV9Db25zdHJ1Y3QoJipfX2N1ciwgX194KTsKKyAgfQorICBfU1RMUF9VTldJTkQoX1NUTFBfU1REOjpfRGVzdHJveV9SYW5nZShfX2ZpcnN0LCBfX2N1cikpCisgIHJldHVybiBfX2N1cjsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1NpemUsIGNsYXNzIF9UcD4KK2lubGluZSBfRm9yd2FyZEl0ZXIgX191ZmlsbF9uKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfU2l6ZSBfX24sIGNvbnN0IF9UcCYgX194LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5wdXRfaXRlcmF0b3JfdGFnICYpCit7IHJldHVybiBfX3VmaWxsX24oX19maXJzdCwgX19uLCBfX3gpOyB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9OT05URU1QTF9CQVNFX01BVENIX0JVRykKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9TaXplLCBjbGFzcyBfVHA+CitpbmxpbmUgX0ZvcndhcmRJdGVyIF9fdWZpbGxfbihfRm9yd2FyZEl0ZXIgX19maXJzdCwgX1NpemUgX19uLCBjb25zdCBfVHAmIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcndhcmRfaXRlcmF0b3JfdGFnICYpCit7IHJldHVybiBfX3VmaWxsX24oX19maXJzdCwgX19uLCBfX3gpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9TaXplLCBjbGFzcyBfVHA+CitpbmxpbmUgX0ZvcndhcmRJdGVyIF9fdWZpbGxfbihfRm9yd2FyZEl0ZXIgX19maXJzdCwgX1NpemUgX19uLCBjb25zdCBfVHAmIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnICYpCit7IHJldHVybiBfX3VmaWxsX24oX19maXJzdCwgX19uLCBfX3gpOyB9CisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1NpemUsIGNsYXNzIF9UcD4KK2lubGluZSBfRm9yd2FyZEl0ZXIgX191bmluaXRpYWxpemVkX2ZpbGxfbihfRm9yd2FyZEl0ZXIgX19maXJzdCwgX1NpemUgX19uLCBjb25zdCBfVHAmIF9feCkgeworICBfRm9yd2FyZEl0ZXIgX19sYXN0ID0gX19maXJzdCArIF9fbjsKKyAgX191ZmlsbChfX2ZpcnN0LCBfX2xhc3QsIF9feCwgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcoKSwgKHB0cmRpZmZfdCopMCk7CisgIHJldHVybiBfX2xhc3Q7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9TaXplLCBjbGFzcyBfVHA+CitpbmxpbmUgX0ZvcndhcmRJdGVyIF9fdWZpbGxfbihfRm9yd2FyZEl0ZXIgX19maXJzdCwgX1NpemUgX19uLCBjb25zdCBfVHAmIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnICYpCit7IHJldHVybiBfX3VuaW5pdGlhbGl6ZWRfZmlsbF9uKF9fZmlyc3QsIF9fbiwgX194KTsgfQorCisvKiBfX3VuaW5pdGlhbGl6ZWRfaW5pdCBpcyBhbiBpbnRlcm5hbCBhbGdvIHRvIGluaXQgYSByYW5nZSB3aXRoIGEgdmFsdWUKKyAqIGJ1aWx0IHVzaW5nIGRlZmF1bHQgY29uc3RydWN0b3IuIEl0IGlzIG9ubHkgY2FsbGVkIHdpdGggcG9pbnRlciBhcworICogaXRlcmF0b3IuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9TaXplLCBjbGFzcyBfVHA+CitpbmxpbmUgX0ZvcndhcmRJdGVyIF9fdWluaXRfYXV4X2F1eChfRm9yd2FyZEl0ZXIgX19maXJzdCwgX1NpemUgX19uLCBjb25zdCBfVHAmIF9fdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19mYWxzZV90eXBlJiAvKl9IYXNEZWZhdWx0WmVybyovKQoreyByZXR1cm4gX191bmluaXRpYWxpemVkX2ZpbGxfbihfX2ZpcnN0LCBfX24sIF9fdmFsKTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfU2l6ZSwgY2xhc3MgX1RwPgoraW5saW5lIF9Gb3J3YXJkSXRlciBfX3Vpbml0X2F1eF9hdXgoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9TaXplIF9fbiwgY29uc3QgX1RwJiAvKiBfX3ZhbCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKl9IYXNEZWZhdWx0WmVybyovKSB7CisgIG1lbXNldCgodW5zaWduZWQgY2hhciopX19maXJzdCwgMCwgX19uICogc2l6ZW9mKF9UcCkpOworICByZXR1cm4gX19maXJzdCArIF9fbjsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1NpemUsIGNsYXNzIF9UcD4KK2lubGluZSBfRm9yd2FyZEl0ZXIgX191aW5pdF9hdXgoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9TaXplIF9fbiwgY29uc3QgX1RwJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX190cnVlX3R5cGUmIC8qX1RyaXZpYWxJbml0Ki8pCit7IHJldHVybiBfX2ZpcnN0ICsgX19uOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9TaXplLCBjbGFzcyBfVHA+CitpbmxpbmUgX0ZvcndhcmRJdGVyIF9fdWluaXRfYXV4KF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfU2l6ZSBfX24sIGNvbnN0IF9UcCYgX192YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypfVHJpdmlhbEluaXQqLykKK3sgcmV0dXJuIF9fdWluaXRfYXV4X2F1eChfX2ZpcnN0LCBfX24sIF9fdmFsLCBfSGFzRGVmYXVsdFplcm9WYWx1ZShfX2ZpcnN0KS5fQW5zd2VyKCkpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9TaXplLCBjbGFzcyBfVHA+CitpbmxpbmUgX0ZvcndhcmRJdGVyIF9fdW5pbml0aWFsaXplZF9pbml0KF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfU2l6ZSBfX24sIGNvbnN0IF9UcCYgX192YWwpCit7IHJldHVybiBfX3Vpbml0X2F1eChfX2ZpcnN0LCBfX24sIF9fdmFsLCBfVXNlVHJpdmlhbEluaXQoX19maXJzdCkuX0Fuc3dlcigpKTsgfQorCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1NpemUsIGNsYXNzIF9UcD4KK2lubGluZSB2b2lkCit1bmluaXRpYWxpemVkX2ZpbGxfbihfRm9yd2FyZEl0ZXIgX19maXJzdCwgX1NpemUgX19uLCBjb25zdCBfVHAmIF9feCkKK3sgX1NUTFBfUFJJViBfX3VmaWxsX24oX19maXJzdCwgX19uLCBfX3gsIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9fZmlyc3QsIF9Gb3J3YXJkSXRlcikpOyB9CisKKy8vIEV4dGVuc2lvbnM6IF9fdW5pbml0aWFsaXplZF9jb3B5X2NvcHksIF9fdW5pbml0aWFsaXplZF9jb3B5X2ZpbGwsCisvLyBfX3VuaW5pdGlhbGl6ZWRfZmlsbF9jb3B5LgorCisvLyBfX3VuaW5pdGlhbGl6ZWRfY29weV9jb3B5CisvLyBDb3BpZXMgW2ZpcnN0MSwgbGFzdDEpIGludG8gW3Jlc3VsdCwgcmVzdWx0ICsgKGxhc3QxIC0gZmlyc3QxKSksIGFuZAorLy8gIGNvcGllcyBbZmlyc3QyLCBsYXN0MikgaW50bworLy8gIFtyZXN1bHQgKyAobGFzdDEgLSBmaXJzdDEpLCByZXN1bHQgKyAobGFzdDEgLSBmaXJzdDEpICsgKGxhc3QyIC0gZmlyc3QyKSkuCisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMiwgY2xhc3MgX0ZvcndhcmRJdGVyPgoraW5saW5lIF9Gb3J3YXJkSXRlcgorX191bmluaXRpYWxpemVkX2NvcHlfY29weShfSW5wdXRJdGVyMSBfX2ZpcnN0MSwgX0lucHV0SXRlcjEgX19sYXN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIsIF9JbnB1dEl0ZXIyIF9fbGFzdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlciBfX3Jlc3VsdCkgeworICBfRm9yd2FyZEl0ZXIgX19uZXdfcmVzdWx0ID0gdW5pbml0aWFsaXplZF9jb3B5KF9fZmlyc3QxLCBfX2xhc3QxLCBfX3Jlc3VsdCk7CisgIF9TVExQX1RSWSB7CisgICAgcmV0dXJuIHVuaW5pdGlhbGl6ZWRfY29weShfX2ZpcnN0MiwgX19sYXN0MiwgX19uZXdfcmVzdWx0KTsKKyAgfQorICBfU1RMUF9VTldJTkQoX1NUTFBfU1REOjpfRGVzdHJveV9SYW5nZShfX3Jlc3VsdCwgX19uZXdfcmVzdWx0KSkKKyAgX1NUTFBfUkVUX0FGVEVSX1RIUk9XKF9fcmVzdWx0KQorfQorCisvLyBfX3VuaW5pdGlhbGl6ZWRfZmlsbF9jb3B5CisvLyBGaWxscyBbcmVzdWx0LCBtaWQpIHdpdGggeCwgYW5kIGNvcGllcyBbZmlyc3QsIGxhc3QpIGludG8KKy8vICBbbWlkLCBtaWQgKyAobGFzdCAtIGZpcnN0KSkuCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfVHAsIGNsYXNzIF9JbnB1dEl0ZXI+CitpbmxpbmUgX0ZvcndhcmRJdGVyCitfX3VuaW5pdGlhbGl6ZWRfZmlsbF9jb3B5KF9Gb3J3YXJkSXRlciBfX3Jlc3VsdCwgX0ZvcndhcmRJdGVyIF9fbWlkLCBjb25zdCBfVHAmIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCkgeworICB1bmluaXRpYWxpemVkX2ZpbGwoX19yZXN1bHQsIF9fbWlkLCBfX3gpOworICBfU1RMUF9UUlkgeworICAgIHJldHVybiB1bmluaXRpYWxpemVkX2NvcHkoX19maXJzdCwgX19sYXN0LCBfX21pZCk7CisgIH0KKyAgX1NUTFBfVU5XSU5EKF9TVExQX1NURDo6X0Rlc3Ryb3lfUmFuZ2UoX19yZXN1bHQsIF9fbWlkKSkKKyAgX1NUTFBfUkVUX0FGVEVSX1RIUk9XKF9fcmVzdWx0KQorfQorCisvLyBfX3VuaW5pdGlhbGl6ZWRfY29weV9maWxsCisvLyBDb3BpZXMgW2ZpcnN0MSwgbGFzdDEpIGludG8gW2ZpcnN0MiwgZmlyc3QyICsgKGxhc3QxIC0gZmlyc3QxKSksIGFuZAorLy8gIGZpbGxzIFtmaXJzdDIgKyAobGFzdDEgLSBmaXJzdDEpLCBsYXN0Mikgd2l0aCB4LgordGVtcGxhdGUgPGNsYXNzIF9JdGVyLCBjbGFzcyBfVHA+CitpbmxpbmUgdm9pZAorX191bmluaXRpYWxpemVkX2NvcHlfZmlsbChfSXRlciBfX2ZpcnN0MSwgX0l0ZXIgX19sYXN0MSwgX0l0ZXIgX19maXJzdDIsIF9JdGVyIF9fbGFzdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9UcCYgX194KSB7CisgIF9JdGVyIF9fbWlkMiA9IHVuaW5pdGlhbGl6ZWRfY29weShfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIpOworICBfU1RMUF9UUlkgeworICAgIHVuaW5pdGlhbGl6ZWRfZmlsbChfX21pZDIsIF9fbGFzdDIsIF9feCk7CisgIH0KKyAgX1NUTFBfVU5XSU5EKF9TVExQX1NURDo6X0Rlc3Ryb3lfUmFuZ2UoX19maXJzdDIsIF9fbWlkMikpCit9CisKKy8qIF9fdW5pbml0aWFsaXplZF9tb3ZlOgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGludGVybmFseSBhbmQgb25seSB3aXRoIHBvaW50ZXJzIGFzIGl0ZXJhdG9ycy4KKyAqLwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1RyaXZpYWxVQ3B5PgoraW5saW5lIF9Gb3J3YXJkSXRlcgorX191bmluaXRpYWxpemVkX21vdmUoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwgX0ZvcndhcmRJdGVyIF9fcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgX1RyaXZpYWxVQ3B5IF9fdHJpdmlhbF91Y3B5LCBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qX01vdmFibGUqLykKK3sgcmV0dXJuIF9fdWNvcHlfcHRycyhfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0LCBfX3RyaXZpYWxfdWNweSk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1RyaXZpYWxVQ3B5PgorX1NUTFBfSU5MSU5FX0xPT1AKK19Gb3J3YXJkSXRlcgorX191bmluaXRpYWxpemVkX21vdmUoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwgX0ZvcndhcmRJdGVyIF9fcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgX1RyaXZpYWxVQ3B5ICwgY29uc3QgX190cnVlX3R5cGUmIC8qX01vdmFibGUqLykgeworICAvL01vdmUgY29uc3RydWN0b3Igc2hvdWxkIG5vdCB0aHJvdyBzbyB3ZSBkbyBub3QgbmVlZCB0byB0YWtlIGNhcmUgb2YgZXhjZXB0aW9ucyBoZXJlLgorICBmb3IgKHB0cmRpZmZfdCBfX24gPSBfX2xhc3QgLSBfX2ZpcnN0IDsgX19uID4gMDsgLS1fX24pIHsKKyAgICBfTW92ZV9Db25zdHJ1Y3QoJipfX3Jlc3VsdCwgKl9fZmlyc3QpOworICAgICsrX19maXJzdDsgKytfX3Jlc3VsdDsKKyAgfQorICByZXR1cm4gX19yZXN1bHQ7Cit9CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9VTklOSVRJQUxJWkVEX0ggKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL191bm9yZGVyZWRfbWFwLmggYi9zdGxwb3J0L3N0bC9fdW5vcmRlcmVkX21hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyYjAxN2QKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9fdW5vcmRlcmVkX21hcC5oCkBAIC0wLDAgKzEsNDQzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA0CisgKiBGcmFuY29pcyBEdW1vbnQKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworLyogTk9URTogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgU1RMIGhlYWRlcnMuCisgKiAgIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LgorICovCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfVU5PUkRFUkVEX01BUF9ICisjZGVmaW5lIF9TVExQX0lOVEVSTkFMX1VOT1JERVJFRF9NQVBfSAorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0hBU0hUQUJMRV9ICisjICBpbmNsdWRlIDxzdGwvX2hhc2h0YWJsZS5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisvL1NwZWNpZmljIGl0ZXJhdG9yIHRyYWl0cyBjcmVhdGlvbgorX1NUTFBfQ1JFQVRFX0hBU0hfSVRFUkFUT1JfVFJBSVRTKFVub3JkZXJlZE1hcFRyYWl0c1QsIHRyYWl0cykKKworX1NUTFBfQkVHSU5fVFIxX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBfU1RMUF9ERkxfVE1QTF9QQVJBTShfSGFzaEZjbixoYXNoPF9LZXk+KSwKKyAgICAgICAgICBfU1RMUF9ERkxfVE1QTF9QQVJBTShfRXF1YWxLZXksIGVxdWFsX3RvPF9LZXk+KSwKKyAgICAgICAgICBfU1RMUF9ERUZBVUxUX1BBSVJfQUxMT0NBVE9SX1NFTEVDVChfU1RMUF9DT05TVCBfS2V5LCBfVHApID4KK2NsYXNzIHVub3JkZXJlZF9tYXAKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUEFSVElBTF9TUEVDX1dPUktBUk9VTkQpCisgICAgICAgICAgICAgICA6IHB1YmxpYyBfX3N0bHBvcnRfY2xhc3M8dW5vcmRlcmVkX21hcDxfS2V5LCBfVHAsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4gPgorI2VuZGlmCit7Citwcml2YXRlOgorICB0eXBlZGVmIHVub3JkZXJlZF9tYXA8X0tleSwgX1RwLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+IF9TZWxmOworcHVibGljOgorICB0eXBlZGVmIF9LZXkga2V5X3R5cGU7CisgIHR5cGVkZWYgX1RwIGRhdGFfdHlwZTsKKyAgdHlwZWRlZiBfVHAgbWFwcGVkX3R5cGU7CisgIHR5cGVkZWYgcGFpcjxfU1RMUF9DT05TVCBrZXlfdHlwZSwgZGF0YV90eXBlPiB2YWx1ZV90eXBlOworcHJpdmF0ZToKKyAgLy9TcGVjaWZpYyBpdGVyYXRvciB0cmFpdHMgY3JlYXRpb24KKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9Vbm9yZGVyZWRNYXBUcmFpdHNUPHZhbHVlX3R5cGU+IF9Vbm9yZGVyZWRNYXBUcmFpdHM7CisKK3B1YmxpYzoKKyAgdHlwZWRlZiBoYXNodGFibGU8dmFsdWVfdHlwZSwga2V5X3R5cGUsIF9IYXNoRmNuLCBfVW5vcmRlcmVkTWFwVHJhaXRzLAorICAgICAgICAgICAgICAgICAgICBfU1RMUF9TRUxFQ1QxU1QodmFsdWVfdHlwZSwgIF9LZXkpLCBfRXF1YWxLZXksIF9BbGxvYyA+IF9IdDsKKworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6aGFzaGVyIGhhc2hlcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmtleV9lcXVhbCBrZXlfZXF1YWw7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OnNpemVfdHlwZSBzaXplX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6cG9pbnRlciBwb2ludGVyOworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6Y29uc3RfcG9pbnRlciBjb25zdF9wb2ludGVyOworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6cmVmZXJlbmNlIHJlZmVyZW5jZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9yZWZlcmVuY2U7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6Oml0ZXJhdG9yIGl0ZXJhdG9yOworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpsb2NhbF9pdGVyYXRvciBsb2NhbF9pdGVyYXRvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmNvbnN0X2xvY2FsX2l0ZXJhdG9yIGNvbnN0X2xvY2FsX2l0ZXJhdG9yOworCisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKKworICBoYXNoZXIgaGFzaF9mdW5jdGlvbigpIGNvbnN0IHsgcmV0dXJuIF9NX2h0Lmhhc2hfZnVuY3QoKTsgfQorICBrZXlfZXF1YWwga2V5X2VxKCkgY29uc3QgeyByZXR1cm4gX01faHQua2V5X2VxKCk7IH0KKyAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmdldF9hbGxvY2F0b3IoKTsgfQorCitwcml2YXRlOgorICBfSHQgX01faHQ7CisgIF9TVExQX0tFWV9UWVBFX0ZPUl9DT05UX0VYVChrZXlfdHlwZSkKKworcHVibGljOgorICBleHBsaWNpdCB1bm9yZGVyZWRfbWFwKHNpemVfdHlwZSBfX24gPSAwLCBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBfX2EpIHt9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKKyAgdW5vcmRlcmVkX21hcChfX21vdmVfc291cmNlPF9TZWxmPiBzcmMpCisgICAgOiBfTV9odChfX21vdmVfc291cmNlPF9IdD4oc3JjLmdldCgpLl9NX2h0KSkge30KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICB1bm9yZGVyZWRfbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLAorICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX24gPSAwLCBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKyAgICAgICAgICAgICAgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisgICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBfX2EpCisgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7IH0KKyNlbHNlCisgIHVub3JkZXJlZF9tYXAoY29uc3QgdmFsdWVfdHlwZSogX19mLCBjb25zdCB2YWx1ZV90eXBlKiBfX2wsCisgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbiA9IDAsIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorICAgICAgICAgICAgICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKyAgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9NX2h0KF9fbiwgX19oZiwgX19lcWwsIF9fYSkKKyAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQorCisgIHVub3JkZXJlZF9tYXAoY29uc3RfaXRlcmF0b3IgX19mLCBjb25zdF9pdGVyYXRvciBfX2wsCisgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbiA9IDAsIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorICAgICAgICAgICAgICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKyAgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9NX2h0KF9fbiwgX19oZiwgX19lcWwsIF9fYSkKKyAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQorI2VuZGlmIC8qX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworCisgIF9TZWxmJiBvcGVyYXRvciA9IChjb25zdCBfU2VsZiYgX19vdGhlcikKKyAgeyBfTV9odCA9IF9fb3RoZXIuX01faHQ7IHJldHVybiAqdGhpczsgfQorCisgIHNpemVfdHlwZSBzaXplKCkgY29uc3QgeyByZXR1cm4gX01faHQuc2l6ZSgpOyB9CisgIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0Lm1heF9zaXplKCk7IH0KKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmVtcHR5KCk7IH0KKyAgdm9pZCBzd2FwKF9TZWxmJiBfX2hzKSB7IF9NX2h0LnN3YXAoX19ocy5fTV9odCk7IH0KKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUEFSVElBTF9TUEVDX1dPUktBUk9VTkQpICYmICFkZWZpbmVkIChfU1RMUF9GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIpCisgIHZvaWQgX01fc3dhcF93b3JrYXJvdW5kKF9TZWxmJiBfX3gpIHsgc3dhcChfX3gpOyB9CisjZW5kaWYKKworICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIF9NX2h0LmJlZ2luKCk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gX01faHQuZW5kKCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBfTV9odC5iZWdpbigpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmVuZCgpOyB9CisKKyAgcGFpcjxpdGVyYXRvcixib29sPiBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCisgIHsgcmV0dXJuIF9NX2h0Lmluc2VydF91bmlxdWUoX19vYmopOyB9CisgIGl0ZXJhdG9yIGluc2VydChjb25zdF9pdGVyYXRvciAvKl9faGludCovLCBjb25zdCB2YWx1ZV90eXBlJiBfX29iaikKKyAgeyByZXR1cm4gX01faHQuaW5zZXJ0X3VuaXF1ZShfX29iaik7IH0KKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZvaWQgaW5zZXJ0KF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sKQorI2Vsc2UKKyAgdm9pZCBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSogX19mLCBjb25zdCB2YWx1ZV90eXBlKiBfX2wpCisgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsX19sKTsgfQorICB2b2lkIGluc2VydChjb25zdF9pdGVyYXRvciBfX2YsIGNvbnN0X2l0ZXJhdG9yIF9fbCkKKyNlbmRpZiAvKl9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKyAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQorCisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBpdGVyYXRvciBmaW5kKGNvbnN0IF9LVCYgX19rZXkpIHsgcmV0dXJuIF9NX2h0LmZpbmQoX19rZXkpOyB9CisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBjb25zdF9pdGVyYXRvciBmaW5kKGNvbnN0IF9LVCYgX19rZXkpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmZpbmQoX19rZXkpOyB9CisKKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIF9UcCYgb3BlcmF0b3JbXShjb25zdCBfS1QmIF9fa2V5KSB7CisgICAgaXRlcmF0b3IgX19pdCA9IF9NX2h0LmZpbmQoX19rZXkpOworICAgIHJldHVybiAoX19pdCA9PSBfTV9odC5lbmQoKSA/CisgICAgICBfTV9odC5fTV9pbnNlcnQodmFsdWVfdHlwZShfX2tleSwgX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRChfVHApKSkuc2Vjb25kIDoKKyAgICAgICgqX19pdCkuc2Vjb25kICk7CisgIH0KKworICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgc2l6ZV90eXBlIGNvdW50KGNvbnN0IF9LVCYgX19rZXkpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmNvdW50KF9fa2V5KTsgfQorCisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4gZXF1YWxfcmFuZ2UoY29uc3QgX0tUJiBfX2tleSkKKyAgeyByZXR1cm4gX01faHQuZXF1YWxfcmFuZ2UoX19rZXkpOyB9CisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4gZXF1YWxfcmFuZ2UoY29uc3QgX0tUJiBfX2tleSkgY29uc3QKKyAgeyByZXR1cm4gX01faHQuZXF1YWxfcmFuZ2UoX19rZXkpOyB9CisKKyAgc2l6ZV90eXBlIGVyYXNlKGNvbnN0IGtleV90eXBlJiBfX2tleSkge3JldHVybiBfTV9odC5lcmFzZShfX2tleSk7IH0KKyAgdm9pZCBlcmFzZShjb25zdF9pdGVyYXRvciBfX2l0KSB7IF9NX2h0LmVyYXNlKF9faXQpOyB9CisgIHZvaWQgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19mLCBjb25zdF9pdGVyYXRvciBfX2wpIHsgX01faHQuZXJhc2UoX19mLCBfX2wpOyB9CisgIHZvaWQgY2xlYXIoKSB7IF9NX2h0LmNsZWFyKCk7IH0KKworICBzaXplX3R5cGUgYnVja2V0X2NvdW50KCkgY29uc3QgeyByZXR1cm4gX01faHQuYnVja2V0X2NvdW50KCk7IH0KKyAgc2l6ZV90eXBlIG1heF9idWNrZXRfY291bnQoKSBjb25zdCB7IHJldHVybiBfTV9odC5tYXhfYnVja2V0X2NvdW50KCk7IH0KKyAgc2l6ZV90eXBlIGJ1Y2tldF9zaXplKHNpemVfdHlwZSBfX24pIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmVsZW1zX2luX2J1Y2tldChfX24pOyB9CisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBzaXplX3R5cGUgYnVja2V0KGNvbnN0IF9LVCYgX19rKSBjb25zdCB7IHJldHVybiBfTV9odC5idWNrZXQoX19rKTsgfQorICBsb2NhbF9pdGVyYXRvciBiZWdpbihzaXplX3R5cGUgX19uKSB7IHJldHVybiBfTV9odC5iZWdpbihfX24pOyB9CisgIGxvY2FsX2l0ZXJhdG9yIGVuZChzaXplX3R5cGUgX19uKSB7IHJldHVybiBfTV9odC5lbmQoX19uKTsgfQorICBjb25zdF9sb2NhbF9pdGVyYXRvciBiZWdpbihzaXplX3R5cGUgX19uKSBjb25zdCB7IHJldHVybiBfTV9odC5iZWdpbihfX24pOyB9CisgIGNvbnN0X2xvY2FsX2l0ZXJhdG9yIGVuZChzaXplX3R5cGUgX19uKSBjb25zdCB7IHJldHVybiBfTV9odC5lbmQoX19uKTsgfQorCisgIGZsb2F0IGxvYWRfZmFjdG9yKCkgY29uc3QgeyByZXR1cm4gX01faHQubG9hZF9mYWN0b3IoKTsgfQorICBmbG9hdCBtYXhfbG9hZF9mYWN0b3IoKSBjb25zdCB7IHJldHVybiBfTV9odC5tYXhfbG9hZF9mYWN0b3IoKTsgfQorICB2b2lkIG1heF9sb2FkX2ZhY3RvcihmbG9hdCBfX3ZhbCkgeyBfTV9odC5tYXhfbG9hZF9mYWN0b3IoX192YWwpOyB9CisgIHZvaWQgcmVoYXNoKHNpemVfdHlwZSBfX2hpbnQpIHsgX01faHQucmVoYXNoKF9faGludCk7IH0KKworI2lmIGRlZmluZWQgKF9fRE1DX18pIC8vIGRpc2FibGUgb3BlcmF0b3I9PShwYWlyPHgsdW5vcmRlcmVkX21hcD4sIHBhaXI8eCx1bm9yZGVyZWRfbWFwPikKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IF9TZWxmJikgY29uc3Q7CisjZW5kaWYKK307CisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworLy9TcGVjaWZpYyBpdGVyYXRvciB0cmFpdHMgY3JlYXRpb24KK19TVExQX0NSRUFURV9IQVNIX0lURVJBVE9SX1RSQUlUUyhVbm9yZGVyZWRNdWx0aW1hcFRyYWl0c1QsIHRyYWl0cykKKworX1NUTFBfQkVHSU5fVFIxX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBfU1RMUF9ERkxfVE1QTF9QQVJBTShfSGFzaEZjbixoYXNoPF9LZXk+KSwKKyAgICAgICAgICBfU1RMUF9ERkxfVE1QTF9QQVJBTShfRXF1YWxLZXksIGVxdWFsX3RvPF9LZXk+KSwKKyAgICAgICAgICBfU1RMUF9ERUZBVUxUX1BBSVJfQUxMT0NBVE9SX1NFTEVDVChfU1RMUF9DT05TVCBfS2V5LCBfVHApID4KK2NsYXNzIHVub3JkZXJlZF9tdWx0aW1hcAorI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QQVJUSUFMX1NQRUNfV09SS0FST1VORCkKKyAgICAgICAgICAgICAgICAgICAgOiBwdWJsaWMgX19zdGxwb3J0X2NsYXNzPHVub3JkZXJlZF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4gPgorI2VuZGlmCit7Citwcml2YXRlOgorICB0eXBlZGVmIHVub3JkZXJlZF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4gX1NlbGY7CitwdWJsaWM6CisgIHR5cGVkZWYgX0tleSBrZXlfdHlwZTsKKyAgdHlwZWRlZiBfVHAgZGF0YV90eXBlOworICB0eXBlZGVmIF9UcCBtYXBwZWRfdHlwZTsKKyAgdHlwZWRlZiBwYWlyPF9TVExQX0NPTlNUIGtleV90eXBlLCBkYXRhX3R5cGU+IHZhbHVlX3R5cGU7Citwcml2YXRlOgorICAvL1NwZWNpZmljIGl0ZXJhdG9yIHRyYWl0cyBjcmVhdGlvbgorICB0eXBlZGVmIF9TVExQX1BSSVYgX1Vub3JkZXJlZE11bHRpbWFwVHJhaXRzVDx2YWx1ZV90eXBlPiBfVW5vcmRlcmVkTXVsdGltYXBUcmFpdHM7CisKK3B1YmxpYzoKKyAgdHlwZWRlZiBoYXNodGFibGU8dmFsdWVfdHlwZSwga2V5X3R5cGUsIF9IYXNoRmNuLCBfVW5vcmRlcmVkTXVsdGltYXBUcmFpdHMsCisgICAgICAgICAgICAgICAgICAgIF9TVExQX1NFTEVDVDFTVCh2YWx1ZV90eXBlLCAgX0tleSksIF9FcXVhbEtleSwgX0FsbG9jID4gX0h0OworCisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpoYXNoZXIgaGFzaGVyOworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6a2V5X2VxdWFsIGtleV9lcXVhbDsKKworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6c2l6ZV90eXBlIHNpemVfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpwb2ludGVyIHBvaW50ZXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpjb25zdF9wb2ludGVyIGNvbnN0X3BvaW50ZXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpyZWZlcmVuY2UgcmVmZXJlbmNlOworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZTsKKworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6aXRlcmF0b3IgaXRlcmF0b3I7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmxvY2FsX2l0ZXJhdG9yIGxvY2FsX2l0ZXJhdG9yOworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6Y29uc3RfbG9jYWxfaXRlcmF0b3IgY29uc3RfbG9jYWxfaXRlcmF0b3I7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmFsbG9jYXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOworCisgIGhhc2hlciBoYXNoX2Z1bmN0aW9uKCkgY29uc3QgeyByZXR1cm4gX01faHQuaGFzaF9mdW5jdCgpOyB9CisgIGtleV9lcXVhbCBrZXlfZXEoKSBjb25zdCB7IHJldHVybiBfTV9odC5rZXlfZXEoKTsgfQorICBhbGxvY2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9yKCkgY29uc3QgeyByZXR1cm4gX01faHQuZ2V0X2FsbG9jYXRvcigpOyB9CisKK3ByaXZhdGU6CisgIF9IdCBfTV9odDsKKyAgX1NUTFBfS0VZX1RZUEVfRk9SX0NPTlRfRVhUKGtleV90eXBlKQorCitwdWJsaWM6CisgIGV4cGxpY2l0IHVub3JkZXJlZF9tdWx0aW1hcChzaXplX3R5cGUgX19uID0gMCwgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9NX2h0KF9fbiwgX19oZiwgX19lcWwsIF9fYSkge30KKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19NT1ZFX1NFTUFOVElDKQorICB1bm9yZGVyZWRfbXVsdGltYXAoX19tb3ZlX3NvdXJjZTxfU2VsZj4gc3JjKQorICAgIDogX01faHQoX19tb3ZlX3NvdXJjZTxfSHQ+KHNyYy5nZXQoKS5fTV9odCkpIHt9CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgdW5vcmRlcmVkX211bHRpbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLAorICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbiA9IDAsIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBfX2EpCisgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZiwgX19sKTsgfQorI2Vsc2UKKyAgdW5vcmRlcmVkX211bHRpbWFwKGNvbnN0IHZhbHVlX3R5cGUqIF9fZiwgY29uc3QgdmFsdWVfdHlwZSogX19sLAorICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbiA9IDAsIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBfX2EpCisgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZiwgX19sKTsgfQorCisgIHVub3JkZXJlZF9tdWx0aW1hcChjb25zdF9pdGVyYXRvciBfX2YsIGNvbnN0X2l0ZXJhdG9yIF9fbCwKKyAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX24gPSAwLCBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgX19hKQorICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsIF9fbCk7IH0KKyNlbmRpZiAvKl9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKworICBfU2VsZiYgb3BlcmF0b3IgPSAoY29uc3QgX1NlbGYmIF9fb3RoZXIpCisgIHsgX01faHQgPSBfX290aGVyLl9NX2h0OyByZXR1cm4gKnRoaXM7IH0KKworICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LnNpemUoKTsgfQorICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCB7IHJldHVybiBfTV9odC5tYXhfc2l6ZSgpOyB9CisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBfTV9odC5lbXB0eSgpOyB9CisgIHZvaWQgc3dhcChfU2VsZiYgX19ocykgeyBfTV9odC5zd2FwKF9faHMuX01faHQpOyB9CisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKSAmJiAhZGVmaW5lZCAoX1NUTFBfRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSKQorICB2b2lkIF9NX3N3YXBfd29ya2Fyb3VuZChfU2VsZiYgX194KSB7IHN3YXAoX194KTsgfQorI2VuZGlmCisKKyAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBfTV9odC5iZWdpbigpOyB9CisgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIF9NX2h0LmVuZCgpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gX01faHQuYmVnaW4oKTsgfQorICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBfTV9odC5lbmQoKTsgfQorCisgIGl0ZXJhdG9yIGluc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX29iaikKKyAgeyByZXR1cm4gX01faHQuaW5zZXJ0X2VxdWFsKF9fb2JqKTsgfQorICBpdGVyYXRvciBpbnNlcnQoY29uc3RfaXRlcmF0b3IgLypfX2hpbnQqLywgY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCisgIHsgcmV0dXJuIF9NX2h0Lmluc2VydF9lcXVhbChfX29iaik7IH0KKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZvaWQgaW5zZXJ0KF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sKQorI2Vsc2UKKyAgdm9pZCBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSogX19mLCBjb25zdCB2YWx1ZV90eXBlKiBfX2wpCisgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZixfX2wpOyB9CisgIHZvaWQgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fZiwgY29uc3RfaXRlcmF0b3IgX19sKQorI2VuZGlmIC8qX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsIF9fbCk7IH0KKworICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgaXRlcmF0b3IgZmluZChjb25zdCBfS1QmIF9fa2V5KSB7IHJldHVybiBfTV9odC5maW5kKF9fa2V5KTsgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgY29uc3RfaXRlcmF0b3IgZmluZChjb25zdCBfS1QmIF9fa2V5KSBjb25zdCB7IHJldHVybiBfTV9odC5maW5kKF9fa2V5KTsgfQorCisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBzaXplX3R5cGUgY291bnQoY29uc3QgX0tUJiBfX2tleSkgY29uc3QgeyByZXR1cm4gX01faHQuY291bnQoX19rZXkpOyB9CisKKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIHBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPiBlcXVhbF9yYW5nZShjb25zdCBfS1QmIF9fa2V5KQorICB7IHJldHVybiBfTV9odC5lcXVhbF9yYW5nZShfX2tleSk7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIHBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPiBlcXVhbF9yYW5nZShjb25zdCBfS1QmIF9fa2V5KSBjb25zdAorICB7IHJldHVybiBfTV9odC5lcXVhbF9yYW5nZShfX2tleSk7IH0KKworICBzaXplX3R5cGUgZXJhc2UoY29uc3Qga2V5X3R5cGUmIF9fa2V5KSB7cmV0dXJuIF9NX2h0LmVyYXNlKF9fa2V5KTsgfQorICB2b2lkIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9faXQpIHsgX01faHQuZXJhc2UoX19pdCk7IH0KKyAgdm9pZCBlcmFzZShjb25zdF9pdGVyYXRvciBfX2YsIGNvbnN0X2l0ZXJhdG9yIF9fbCkgeyBfTV9odC5lcmFzZShfX2YsIF9fbCk7IH0KKyAgdm9pZCBjbGVhcigpIHsgX01faHQuY2xlYXIoKTsgfQorCisgIHNpemVfdHlwZSBidWNrZXRfY291bnQoKSBjb25zdCB7IHJldHVybiBfTV9odC5idWNrZXRfY291bnQoKTsgfQorICBzaXplX3R5cGUgbWF4X2J1Y2tldF9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0Lm1heF9idWNrZXRfY291bnQoKTsgfQorICBzaXplX3R5cGUgYnVja2V0X3NpemUoc2l6ZV90eXBlIF9fbikgY29uc3QgeyByZXR1cm4gX01faHQuZWxlbXNfaW5fYnVja2V0KF9fbik7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIHNpemVfdHlwZSBidWNrZXQoY29uc3QgX0tUJiBfX2spIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmJ1Y2tldChfX2spOyB9CisgIGxvY2FsX2l0ZXJhdG9yIGJlZ2luKHNpemVfdHlwZSBfX24pIHsgcmV0dXJuIF9NX2h0LmJlZ2luKF9fbik7IH0KKyAgbG9jYWxfaXRlcmF0b3IgZW5kKHNpemVfdHlwZSBfX24pIHsgcmV0dXJuIF9NX2h0LmVuZChfX24pOyB9CisgIGNvbnN0X2xvY2FsX2l0ZXJhdG9yIGJlZ2luKHNpemVfdHlwZSBfX24pIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmJlZ2luKF9fbik7IH0KKyAgY29uc3RfbG9jYWxfaXRlcmF0b3IgZW5kKHNpemVfdHlwZSBfX24pIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmVuZChfX24pOyB9CisKKyAgZmxvYXQgbG9hZF9mYWN0b3IoKSBjb25zdCB7IHJldHVybiBfTV9odC5sb2FkX2ZhY3RvcigpOyB9CisgIGZsb2F0IG1heF9sb2FkX2ZhY3RvcigpIGNvbnN0IHsgcmV0dXJuIF9NX2h0Lm1heF9sb2FkX2ZhY3RvcigpOyB9CisgIHZvaWQgbWF4X2xvYWRfZmFjdG9yKGZsb2F0IF9fdmFsKSB7IF9NX2h0Lm1heF9sb2FkX2ZhY3RvcihfX3ZhbCk7IH0KKyAgdm9pZCByZWhhc2goc2l6ZV90eXBlIF9faGludCkgeyBfTV9odC5yZWhhc2goX19oaW50KTsgfQorfTsKKworI2RlZmluZSBfU1RMUF9URU1QTEFURV9IRUFERVIgdGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2hGY24sIGNsYXNzIF9FcWxLZXksIGNsYXNzIF9BbGxvYz4KKyNkZWZpbmUgX1NUTFBfVEVNUExBVEVfQ09OVEFJTkVSIHVub3JkZXJlZF9tYXA8X0tleSxfVHAsX0hhc2hGY24sX0VxbEtleSxfQWxsb2M+CisKKyNpbmNsdWRlIDxzdGwvX3JlbG9wc19oYXNoX2NvbnQuaD4KKworI3VuZGVmIF9TVExQX1RFTVBMQVRFX0NPTlRBSU5FUgorI2RlZmluZSBfU1RMUF9URU1QTEFURV9DT05UQUlORVIgdW5vcmRlcmVkX211bHRpbWFwPF9LZXksX1RwLF9IYXNoRmNuLF9FcWxLZXksX0FsbG9jPgorCisjaW5jbHVkZSA8c3RsL19yZWxvcHNfaGFzaF9jb250Lmg+CisKKyN1bmRlZiBfU1RMUF9URU1QTEFURV9DT05UQUlORVIKKyN1bmRlZiBfU1RMUF9URU1QTEFURV9IRUFERVIKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisvLyBTcGVjaWFsaXphdGlvbiBvZiBpbnNlcnRfaXRlcmF0b3Igc28gdGhhdCBpdCB3aWxsIHdvcmsgZm9yIHVub3JkZXJlZF9tYXAKKy8vIGFuZCB1bm9yZGVyZWRfbXVsdGltYXAuCisKKyNpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQorIyAgaWYgIWRlZmluZWQgKF9TVExQX05PX01PVkVfU0VNQU5USUMpCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaEZuLCAgY2xhc3MgX0VxS2V5LCBjbGFzcyBfQWxsb2M+CitzdHJ1Y3QgX19tb3ZlX3RyYWl0czxfU1RMUF9UUjEgdW5vcmRlcmVkX21hcDxfS2V5LCBfVHAsIF9IYXNoRm4sIF9FcUtleSwgX0FsbG9jPiA+IDoKKyAgX1NUTFBfUFJJViBfX21vdmVfdHJhaXRzX2hlbHA8dHlwZW5hbWUgX1NUTFBfVFIxIHVub3JkZXJlZF9tYXA8X0tleSwgX1RwLCBfSGFzaEZuLCBfRXFLZXksIF9BbGxvYz46Ol9IdD4KK3t9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaEZuLCAgY2xhc3MgX0VxS2V5LCBjbGFzcyBfQWxsb2M+CitzdHJ1Y3QgX19tb3ZlX3RyYWl0czxfU1RMUF9UUjEgdW5vcmRlcmVkX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2hGbiwgX0VxS2V5LCBfQWxsb2M+ID4gOgorICBfU1RMUF9QUklWIF9fbW92ZV90cmFpdHNfaGVscDx0eXBlbmFtZSBfU1RMUF9UUjEgdW5vcmRlcmVkX21hcDxfS2V5LCBfVHAsIF9IYXNoRm4sIF9FcUtleSwgX0FsbG9jPjo6X0h0Pgore307CisjICBlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaEZuLCAgY2xhc3MgX0VxS2V5LCBjbGFzcyBfQWxsb2M+CitjbGFzcyBpbnNlcnRfaXRlcmF0b3I8X1NUTFBfVFIxIHVub3JkZXJlZF9tYXA8X0tleSwgX1RwLCBfSGFzaEZuLCBfRXFLZXksIF9BbGxvYz4gPiB7Citwcm90ZWN0ZWQ6CisgIHR5cGVkZWYgX1NUTFBfVFIxIHVub3JkZXJlZF9tYXA8X0tleSwgX1RwLCBfSGFzaEZuLCBfRXFLZXksIF9BbGxvYz4gX0NvbnRhaW5lcjsKKyAgX0NvbnRhaW5lciogY29udGFpbmVyOworcHVibGljOgorICB0eXBlZGVmIF9Db250YWluZXIgICAgICAgICAgY29udGFpbmVyX3R5cGU7CisgIHR5cGVkZWYgb3V0cHV0X2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKKyAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICBwb2ludGVyOworICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworCisgIGluc2VydF9pdGVyYXRvcihfQ29udGFpbmVyJiBfX3gpIDogY29udGFpbmVyKCZfX3gpIHt9CisgIGluc2VydF9pdGVyYXRvcihfQ29udGFpbmVyJiBfX3gsIHR5cGVuYW1lIF9Db250YWluZXI6Oml0ZXJhdG9yKQorICAgIDogY29udGFpbmVyKCZfX3gpIHt9CisgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYKKyAgb3BlcmF0b3I9KGNvbnN0IHR5cGVuYW1lIF9Db250YWluZXI6OnZhbHVlX3R5cGUmIF9fdmFsKSB7CisgICAgY29udGFpbmVyLT5pbnNlcnQoX192YWwpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mIG9wZXJhdG9yKigpIHsgcmV0dXJuICp0aGlzOyB9CisgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYgb3BlcmF0b3IrKygpIHsgcmV0dXJuICp0aGlzOyB9CisgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYgb3BlcmF0b3IrKyhpbnQpIHsgcmV0dXJuICp0aGlzOyB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaEZuLCAgY2xhc3MgX0VxS2V5LCBjbGFzcyBfQWxsb2M+CitjbGFzcyBpbnNlcnRfaXRlcmF0b3I8X1NUTFBfVFIxIHVub3JkZXJlZF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoRm4sIF9FcUtleSwgX0FsbG9jPiA+IHsKK3Byb3RlY3RlZDoKKyAgdHlwZWRlZiBfU1RMUF9UUjEgdW5vcmRlcmVkX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2hGbiwgX0VxS2V5LCBfQWxsb2M+IF9Db250YWluZXI7CisgIF9Db250YWluZXIqIGNvbnRhaW5lcjsKKyAgdHlwZW5hbWUgX0NvbnRhaW5lcjo6aXRlcmF0b3IgaXRlcjsKK3B1YmxpYzoKKyAgdHlwZWRlZiBfQ29udGFpbmVyICAgICAgICAgIGNvbnRhaW5lcl90eXBlOworICB0eXBlZGVmIG91dHB1dF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CisgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKworICBpbnNlcnRfaXRlcmF0b3IoX0NvbnRhaW5lciYgX194KSA6IGNvbnRhaW5lcigmX194KSB7fQorICBpbnNlcnRfaXRlcmF0b3IoX0NvbnRhaW5lciYgX194LCB0eXBlbmFtZSBfQ29udGFpbmVyOjppdGVyYXRvcikKKyAgICA6IGNvbnRhaW5lcigmX194KSB7fQorICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mCisgIG9wZXJhdG9yPShjb25zdCB0eXBlbmFtZSBfQ29udGFpbmVyOjp2YWx1ZV90eXBlJiBfX3ZhbCkgeworICAgIGNvbnRhaW5lci0+aW5zZXJ0KF9fdmFsKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JiBvcGVyYXRvciooKSB7IHJldHVybiAqdGhpczsgfQorICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mIG9wZXJhdG9yKysoKSB7IHJldHVybiAqdGhpczsgfQorICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mIG9wZXJhdG9yKysoaW50KSB7IHJldHVybiAqdGhpczsgfQorfTsKKworI2VuZGlmIC8qIF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04gKi8KKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfVU5PUkRFUkVEX01BUF9IICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9fdW5vcmRlcmVkX3NldC5oIGIvc3RscG9ydC9zdGwvX3Vub3JkZXJlZF9zZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjVmNWZlCi0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvX3Vub3JkZXJlZF9zZXQuaApAQCAtMCwwICsxLDQxOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNAorICogRnJhbmNvaXMgRHVtb250CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKy8qIE5PVEU6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIFNUTCBoZWFkZXJzLgorICogICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4KKyAqLworCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX1VOT1JERVJFRF9TRVRfSAorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9VTk9SREVSRURfU0VUX0gKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9IQVNIVEFCTEVfSAorIyAgaW5jbHVkZSA8c3RsL19oYXNodGFibGUuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworLy9TcGVjaWZpYyBpdGVyYXRvciB0cmFpdHMgY3JlYXRpb24KK19TVExQX0NSRUFURV9IQVNIX0lURVJBVE9SX1RSQUlUUyhVbm9yZGVyZWRTZXRUcmFpdHNULCBDb25zdF90cmFpdHMpCisKK19TVExQX0JFR0lOX1RSMV9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9WYWx1ZSwgX1NUTFBfREZMX1RNUExfUEFSQU0oX0hhc2hGY24saGFzaDxfVmFsdWU+KSwKKyAgICAgICAgICBfU1RMUF9ERkxfVE1QTF9QQVJBTShfRXF1YWxLZXksIGVxdWFsX3RvPF9WYWx1ZT4pLAorICAgICAgICAgIF9TVExQX0RGTF9UTVBMX1BBUkFNKF9BbGxvYywgYWxsb2NhdG9yPF9WYWx1ZT4pID4KK2NsYXNzIHVub3JkZXJlZF9zZXQKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUEFSVElBTF9TUEVDX1dPUktBUk9VTkQpCisgICAgICAgICAgICAgICA6IHB1YmxpYyBfX3N0bHBvcnRfY2xhc3M8dW5vcmRlcmVkX3NldDxfVmFsdWUsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4gPgorI2VuZGlmCit7CisgIHR5cGVkZWYgdW5vcmRlcmVkX3NldDxfVmFsdWUsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4gX1NlbGY7CisgIC8vU3BlY2lmaWMgaXRlcmF0b3IgdHJhaXRzIGNyZWF0aW9uCisgIHR5cGVkZWYgX1NUTFBfUFJJViBfVW5vcmRlcmVkU2V0VHJhaXRzVDxfVmFsdWU+IF9Vbm9yZGVyZWRTZXRUcmFpdHM7CitwdWJsaWM6CisgIHR5cGVkZWYgaGFzaHRhYmxlPF9WYWx1ZSwgX1ZhbHVlLCBfSGFzaEZjbiwKKyAgICAgICAgICAgICAgICAgICAgX1Vub3JkZXJlZFNldFRyYWl0cywgX1NUTFBfUFJJViBfSWRlbnRpdHk8X1ZhbHVlPiwgX0VxdWFsS2V5LCBfQWxsb2M+IF9IdDsKK3B1YmxpYzoKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmtleV90eXBlIGtleV90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6aGFzaGVyIGhhc2hlcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmtleV9lcXVhbCBrZXlfZXF1YWw7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OnNpemVfdHlwZSBzaXplX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6cG9pbnRlciAgICAgICAgIHBvaW50ZXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpjb25zdF9wb2ludGVyICAgY29uc3RfcG9pbnRlcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OnJlZmVyZW5jZSAgICAgICByZWZlcmVuY2U7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlOworCisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjppdGVyYXRvciBpdGVyYXRvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6bG9jYWxfaXRlcmF0b3IgbG9jYWxfaXRlcmF0b3I7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpjb25zdF9sb2NhbF9pdGVyYXRvciBjb25zdF9sb2NhbF9pdGVyYXRvcjsKKworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7CisKKyAgaGFzaGVyIGhhc2hfZnVuY3Rpb24oKSBjb25zdCB7IHJldHVybiBfTV9odC5oYXNoX2Z1bmN0KCk7IH0KKyAga2V5X2VxdWFsIGtleV9lcSgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmtleV9lcSgpOyB9CisgIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdCB7IHJldHVybiBfTV9odC5nZXRfYWxsb2NhdG9yKCk7IH0KKworcHJpdmF0ZToKKyAgX0h0IF9NX2h0OworICBfU1RMUF9LRVlfVFlQRV9GT1JfQ09OVF9FWFQoa2V5X3R5cGUpCisKK3B1YmxpYzoKKyAgZXhwbGljaXQgdW5vcmRlcmVkX3NldChzaXplX3R5cGUgX19uID0gMCwgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgX19hKSB7fQorCisjaWYgIWRlZmluZWQgKF9TVExQX05PX01PVkVfU0VNQU5USUMpCisgIHVub3JkZXJlZF9zZXQoX19tb3ZlX3NvdXJjZTxfU2VsZj4gc3JjKQorICAgIDogX01faHQoX19tb3ZlX3NvdXJjZTxfSHQ+KHNyYy5nZXQoKS5fTV9odCkpIHt9CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgdW5vcmRlcmVkX3NldChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwKKyAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uID0gMCwgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisgICAgICAgICAgICAgICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorICAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgX19hKQorICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9CisjZWxzZQorICB1bm9yZGVyZWRfc2V0KGNvbnN0IHZhbHVlX3R5cGUqIF9fZiwgY29uc3QgdmFsdWVfdHlwZSogX19sLAorICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX24gPSAwLCBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKyAgICAgICAgICAgICAgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisgICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBfX2EpCisgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7IH0KKworICB1bm9yZGVyZWRfc2V0KGNvbnN0X2l0ZXJhdG9yIF9fZiwgY29uc3RfaXRlcmF0b3IgX19sLAorICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX24gPSAwLCBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKyAgICAgICAgICAgICAgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisgICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBfX2EpCisgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7IH0KKyNlbmRpZiAvKl9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKworICBfU2VsZiYgb3BlcmF0b3IgPSAoY29uc3QgX1NlbGYmIF9fb3RoZXIpCisgIHsgX01faHQgPSBfX290aGVyLl9NX2h0OyByZXR1cm4gKnRoaXM7IH0KKworICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LnNpemUoKTsgfQorICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCB7IHJldHVybiBfTV9odC5tYXhfc2l6ZSgpOyB9CisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBfTV9odC5lbXB0eSgpOyB9CisgIHZvaWQgc3dhcChfU2VsZiYgX19ocykgeyBfTV9odC5zd2FwKF9faHMuX01faHQpOyB9CisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKSAmJiAhZGVmaW5lZCAoX1NUTFBfRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSKQorICB2b2lkIF9NX3N3YXBfd29ya2Fyb3VuZChfU2VsZiYgX194KSB7IHN3YXAoX194KTsgfQorI2VuZGlmCisKKyAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBfTV9odC5iZWdpbigpOyB9CisgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIF9NX2h0LmVuZCgpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gX01faHQuYmVnaW4oKTsgfQorICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBfTV9odC5lbmQoKTsgfQorCisgIHBhaXI8aXRlcmF0b3IsIGJvb2w+IGluc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX29iaikKKyAgeyByZXR1cm4gX01faHQuaW5zZXJ0X3VuaXF1ZShfX29iaik7IH0KKyAgaXRlcmF0b3IgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIC8qX19oaW50Ki8sIGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKQorICB7IHJldHVybiBfTV9odC5pbnNlcnRfdW5pcXVlKF9fb2JqKTsgfQorI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgdm9pZCBpbnNlcnQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wpCisjZWxzZQorICB2b2lkIGluc2VydChjb25zdF9pdGVyYXRvciBfX2YsIGNvbnN0X2l0ZXJhdG9yIF9fbCkKKyAge19NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9CisgIHZvaWQgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUqIF9fZiwgY29uc3QgdmFsdWVfdHlwZSogX19sKQorI2VuZGlmCisgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsX19sKTsgfQorCisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBpdGVyYXRvciBmaW5kKGNvbnN0IF9LVCYgX19rZXkpIHsgcmV0dXJuIF9NX2h0LmZpbmQoX19rZXkpOyB9CisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBjb25zdF9pdGVyYXRvciBmaW5kKGNvbnN0IF9LVCYgX19rZXkpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmZpbmQoX19rZXkpOyB9CisKKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIHNpemVfdHlwZSBjb3VudChjb25zdCBfS1QmIF9fa2V5KSBjb25zdCB7IHJldHVybiBfTV9odC5jb3VudChfX2tleSk7IH0KKworICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgcGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+IGVxdWFsX3JhbmdlKGNvbnN0IF9LVCYgX19rZXkpCisgIHsgcmV0dXJuIF9NX2h0LmVxdWFsX3JhbmdlKF9fa2V5KTsgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgcGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+IGVxdWFsX3JhbmdlKGNvbnN0IF9LVCYgX19rZXkpIGNvbnN0CisgIHsgcmV0dXJuIF9NX2h0LmVxdWFsX3JhbmdlKF9fa2V5KTsgfQorCisgIHNpemVfdHlwZSBlcmFzZShjb25zdCBrZXlfdHlwZSYgX19rZXkpIHtyZXR1cm4gX01faHQuZXJhc2UoX19rZXkpOyB9CisgIHZvaWQgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19pdCkgeyBfTV9odC5lcmFzZShfX2l0KTsgfQorICB2b2lkIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fZiwgY29uc3RfaXRlcmF0b3IgX19sKSB7IF9NX2h0LmVyYXNlKF9fZiwgX19sKTsgfQorICB2b2lkIGNsZWFyKCkgeyBfTV9odC5jbGVhcigpOyB9CisKKyAgc2l6ZV90eXBlIGJ1Y2tldF9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmJ1Y2tldF9jb3VudCgpOyB9CisgIHNpemVfdHlwZSBtYXhfYnVja2V0X2NvdW50KCkgY29uc3QgeyByZXR1cm4gX01faHQubWF4X2J1Y2tldF9jb3VudCgpOyB9CisgIHNpemVfdHlwZSBidWNrZXRfc2l6ZShzaXplX3R5cGUgX19uKSBjb25zdCB7IHJldHVybiBfTV9odC5lbGVtc19pbl9idWNrZXQoX19uKTsgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgc2l6ZV90eXBlIGJ1Y2tldChjb25zdCBfS1QmIF9faykgY29uc3QgeyByZXR1cm4gX01faHQuYnVja2V0KF9fayk7IH0KKyAgbG9jYWxfaXRlcmF0b3IgYmVnaW4oc2l6ZV90eXBlIF9fbikgeyByZXR1cm4gX01faHQuYmVnaW4oX19uKTsgfQorICBsb2NhbF9pdGVyYXRvciBlbmQoc2l6ZV90eXBlIF9fbikgeyByZXR1cm4gX01faHQuZW5kKF9fbik7IH0KKyAgY29uc3RfbG9jYWxfaXRlcmF0b3IgYmVnaW4oc2l6ZV90eXBlIF9fbikgY29uc3QgeyByZXR1cm4gX01faHQuYmVnaW4oX19uKTsgfQorICBjb25zdF9sb2NhbF9pdGVyYXRvciBlbmQoc2l6ZV90eXBlIF9fbikgY29uc3QgeyByZXR1cm4gX01faHQuZW5kKF9fbik7IH0KKworICBmbG9hdCBsb2FkX2ZhY3RvcigpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmxvYWRfZmFjdG9yKCk7IH0KKyAgZmxvYXQgbWF4X2xvYWRfZmFjdG9yKCkgY29uc3QgeyByZXR1cm4gX01faHQubWF4X2xvYWRfZmFjdG9yKCk7IH0KKyAgdm9pZCBtYXhfbG9hZF9mYWN0b3IoZmxvYXQgX192YWwpIHsgX01faHQubWF4X2xvYWRfZmFjdG9yKF9fdmFsKTsgfQorICB2b2lkIHJlaGFzaChzaXplX3R5cGUgX19oaW50KSB7IF9NX2h0LnJlaGFzaChfX2hpbnQpOyB9Cit9OworCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKy8vU3BlY2lmaWMgaXRlcmF0b3IgdHJhaXRzIGNyZWF0aW9uCitfU1RMUF9DUkVBVEVfSEFTSF9JVEVSQVRPUl9UUkFJVFMoVW5vcmRlcmVkTXVsdGlzZXRUcmFpdHNULCBDb25zdF90cmFpdHMpCisKK19TVExQX0JFR0lOX1RSMV9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9WYWx1ZSwgX1NUTFBfREZMX1RNUExfUEFSQU0oX0hhc2hGY24saGFzaDxfVmFsdWU+KSwKKyAgICAgICAgICBfU1RMUF9ERkxfVE1QTF9QQVJBTShfRXF1YWxLZXksIGVxdWFsX3RvPF9WYWx1ZT4pLAorICAgICAgICAgIF9TVExQX0RGTF9UTVBMX1BBUkFNKF9BbGxvYywgYWxsb2NhdG9yPF9WYWx1ZT4pID4KK2NsYXNzIHVub3JkZXJlZF9tdWx0aXNldAorI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QQVJUSUFMX1NQRUNfV09SS0FST1VORCkKKyAgICAgICAgICAgICAgIDogcHVibGljIF9fc3RscG9ydF9jbGFzczx1bm9yZGVyZWRfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+ID4KKyNlbmRpZgoreworICB0eXBlZGVmIHVub3JkZXJlZF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4gX1NlbGY7CisgIC8vU3BlY2lmaWMgaXRlcmF0b3IgdHJhaXRzIGNyZWF0aW9uCisgIHR5cGVkZWYgX1NUTFBfUFJJViBfVW5vcmRlcmVkTXVsdGlzZXRUcmFpdHNUPF9WYWx1ZT4gX1Vub3JkZXJlZE11bHRpc2V0VHJhaXRzOworcHVibGljOgorICB0eXBlZGVmIGhhc2h0YWJsZTxfVmFsdWUsIF9WYWx1ZSwgX0hhc2hGY24sCisgICAgICAgICAgICAgICAgICAgIF9Vbm9yZGVyZWRNdWx0aXNldFRyYWl0cywgX1NUTFBfUFJJViBfSWRlbnRpdHk8X1ZhbHVlPiwgX0VxdWFsS2V5LCBfQWxsb2M+IF9IdDsKKworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6a2V5X3R5cGUga2V5X3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpoYXNoZXIgaGFzaGVyOworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6a2V5X2VxdWFsIGtleV9lcXVhbDsKKworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6c2l6ZV90eXBlIHNpemVfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpwb2ludGVyICAgICAgIHBvaW50ZXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpjb25zdF9wb2ludGVyIGNvbnN0X3BvaW50ZXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpyZWZlcmVuY2UgcmVmZXJlbmNlOworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZTsKKworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6aXRlcmF0b3IgaXRlcmF0b3I7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmxvY2FsX2l0ZXJhdG9yIGxvY2FsX2l0ZXJhdG9yOworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6Y29uc3RfbG9jYWxfaXRlcmF0b3IgY29uc3RfbG9jYWxfaXRlcmF0b3I7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmFsbG9jYXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOworCisgIGhhc2hlciBoYXNoX2Z1bmN0aW9uKCkgY29uc3QgeyByZXR1cm4gX01faHQuaGFzaF9mdW5jdCgpOyB9CisgIGtleV9lcXVhbCBrZXlfZXEoKSBjb25zdCB7IHJldHVybiBfTV9odC5rZXlfZXEoKTsgfQorICBhbGxvY2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9yKCkgY29uc3QgeyByZXR1cm4gX01faHQuZ2V0X2FsbG9jYXRvcigpOyB9CisKK3ByaXZhdGU6CisgIF9IdCBfTV9odDsKKyAgX1NUTFBfS0VZX1RZUEVfRk9SX0NPTlRfRVhUKGtleV90eXBlKQorCitwdWJsaWM6CisgIGV4cGxpY2l0IHVub3JkZXJlZF9tdWx0aXNldChzaXplX3R5cGUgX19uID0gMCwgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9NX2h0KF9fbiwgX19oZiwgX19lcWwsIF9fYSkge30KKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19NT1ZFX1NFTUFOVElDKQorICB1bm9yZGVyZWRfbXVsdGlzZXQoX19tb3ZlX3NvdXJjZTxfU2VsZj4gc3JjKQorICAgIDogX01faHQoX19tb3ZlX3NvdXJjZTxfSHQ+KHNyYy5nZXQoKS5fTV9odCkpIHt9CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgdW5vcmRlcmVkX211bHRpc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLAorICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbiA9IDAsIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBfX2EpCisgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZiwgX19sKTsgfQorI2Vsc2UKKyAgdW5vcmRlcmVkX211bHRpc2V0KGNvbnN0IHZhbHVlX3R5cGUqIF9fZiwgY29uc3QgdmFsdWVfdHlwZSogX19sLAorICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbiA9IDAsIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBfX2EpCisgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZiwgX19sKTsgfQorCisgIHVub3JkZXJlZF9tdWx0aXNldChjb25zdF9pdGVyYXRvciBfX2YsIGNvbnN0X2l0ZXJhdG9yIF9fbCwKKyAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX24gPSAwLCBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgX19hKQorICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsIF9fbCk7IH0KKyNlbmRpZiAvKl9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKworICBfU2VsZiYgb3BlcmF0b3IgPSAoY29uc3QgX1NlbGYmIF9fb3RoZXIpCisgIHsgX01faHQgPSBfX290aGVyLl9NX2h0OyByZXR1cm4gKnRoaXM7IH0KKworICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LnNpemUoKTsgfQorICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCB7IHJldHVybiBfTV9odC5tYXhfc2l6ZSgpOyB9CisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBfTV9odC5lbXB0eSgpOyB9CisgIHZvaWQgc3dhcChfU2VsZiYgaHMpIHsgX01faHQuc3dhcChocy5fTV9odCk7IH0KKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUEFSVElBTF9TUEVDX1dPUktBUk9VTkQpICYmICFkZWZpbmVkIChfU1RMUF9GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIpCisgIHZvaWQgX01fc3dhcF93b3JrYXJvdW5kKF9TZWxmJiBfX3gpIHsgc3dhcChfX3gpOyB9CisjZW5kaWYKKworICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIF9NX2h0LmJlZ2luKCk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gX01faHQuZW5kKCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBfTV9odC5iZWdpbigpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmVuZCgpOyB9CisKKyAgaXRlcmF0b3IgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKQorICB7IHJldHVybiBfTV9odC5pbnNlcnRfZXF1YWwoX19vYmopOyB9CisgIGl0ZXJhdG9yIGluc2VydChjb25zdF9pdGVyYXRvciAvKl9faGludCovLCBjb25zdCB2YWx1ZV90eXBlJiBfX29iaikKKyAgeyByZXR1cm4gX01faHQuaW5zZXJ0X2VxdWFsKF9fb2JqKTsgfQorI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgdm9pZCBpbnNlcnQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wpCisjZWxzZQorICB2b2lkIGluc2VydChjb25zdCB2YWx1ZV90eXBlKiBfX2YsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbCkKKyAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLF9fbCk7IH0KKyAgdm9pZCBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19mLCBjb25zdF9pdGVyYXRvciBfX2wpCisjZW5kaWYgLypfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZiwgX19sKTsgfQorCisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBpdGVyYXRvciBmaW5kKGNvbnN0IF9LVCYgX19rZXkpIHsgcmV0dXJuIF9NX2h0LmZpbmQoX19rZXkpOyB9CisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBjb25zdF9pdGVyYXRvciBmaW5kKGNvbnN0IF9LVCYgX19rZXkpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmZpbmQoX19rZXkpOyB9CisKKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIHNpemVfdHlwZSBjb3VudChjb25zdCBfS1QmIF9fa2V5KSBjb25zdCB7IHJldHVybiBfTV9odC5jb3VudChfX2tleSk7IH0KKworICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgcGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+IGVxdWFsX3JhbmdlKGNvbnN0IF9LVCYgX19rZXkpCisgIHsgcmV0dXJuIF9NX2h0LmVxdWFsX3JhbmdlKF9fa2V5KTsgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgcGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+IGVxdWFsX3JhbmdlKGNvbnN0IF9LVCYgX19rZXkpIGNvbnN0CisgIHsgcmV0dXJuIF9NX2h0LmVxdWFsX3JhbmdlKF9fa2V5KTsgfQorCisgIHNpemVfdHlwZSBlcmFzZShjb25zdCBrZXlfdHlwZSYgX19rZXkpIHtyZXR1cm4gX01faHQuZXJhc2UoX19rZXkpOyB9CisgIHZvaWQgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19pdCkgeyBfTV9odC5lcmFzZShfX2l0KTsgfQorICB2b2lkIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fZiwgY29uc3RfaXRlcmF0b3IgX19sKSB7IF9NX2h0LmVyYXNlKF9fZiwgX19sKTsgfQorICB2b2lkIGNsZWFyKCkgeyBfTV9odC5jbGVhcigpOyB9CisKKyAgc2l6ZV90eXBlIGJ1Y2tldF9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmJ1Y2tldF9jb3VudCgpOyB9CisgIHNpemVfdHlwZSBtYXhfYnVja2V0X2NvdW50KCkgY29uc3QgeyByZXR1cm4gX01faHQubWF4X2J1Y2tldF9jb3VudCgpOyB9CisgIHNpemVfdHlwZSBidWNrZXRfc2l6ZShzaXplX3R5cGUgX19uKSBjb25zdCB7IHJldHVybiBfTV9odC5lbGVtc19pbl9idWNrZXQoX19uKTsgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgc2l6ZV90eXBlIGJ1Y2tldChjb25zdCBfS1QmIF9faykgY29uc3QgeyByZXR1cm4gX01faHQuYnVja2V0KF9fayk7IH0KKyAgbG9jYWxfaXRlcmF0b3IgYmVnaW4oc2l6ZV90eXBlIF9fbikgeyByZXR1cm4gX01faHQuYmVnaW4oX19uKTsgfQorICBsb2NhbF9pdGVyYXRvciBlbmQoc2l6ZV90eXBlIF9fbikgeyByZXR1cm4gX01faHQuZW5kKF9fbik7IH0KKyAgY29uc3RfbG9jYWxfaXRlcmF0b3IgYmVnaW4oc2l6ZV90eXBlIF9fbikgY29uc3QgeyByZXR1cm4gX01faHQuYmVnaW4oX19uKTsgfQorICBjb25zdF9sb2NhbF9pdGVyYXRvciBlbmQoc2l6ZV90eXBlIF9fbikgY29uc3QgeyByZXR1cm4gX01faHQuZW5kKF9fbik7IH0KKworICBmbG9hdCBsb2FkX2ZhY3RvcigpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmxvYWRfZmFjdG9yKCk7IH0KKyAgZmxvYXQgbWF4X2xvYWRfZmFjdG9yKCkgY29uc3QgeyByZXR1cm4gX01faHQubWF4X2xvYWRfZmFjdG9yKCk7IH0KKyAgdm9pZCBtYXhfbG9hZF9mYWN0b3IoZmxvYXQgX192YWwpIHsgX01faHQubWF4X2xvYWRfZmFjdG9yKF9fdmFsKTsgfQorICB2b2lkIHJlaGFzaChzaXplX3R5cGUgX19oaW50KSB7IF9NX2h0LnJlaGFzaChfX2hpbnQpOyB9Cit9OworCisjZGVmaW5lIF9TVExQX1RFTVBMQVRFX0hFQURFUiB0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaEZjbiwgY2xhc3MgX0VxdWFsS2V5LCBjbGFzcyBfQWxsb2M+CisjZGVmaW5lIF9TVExQX1RFTVBMQVRFX0NPTlRBSU5FUiB1bm9yZGVyZWRfc2V0PF9WYWx1ZSxfSGFzaEZjbixfRXF1YWxLZXksX0FsbG9jPgorCisjaW5jbHVkZSA8c3RsL19yZWxvcHNfaGFzaF9jb250Lmg+CisKKyN1bmRlZiBfU1RMUF9URU1QTEFURV9DT05UQUlORVIKKyNkZWZpbmUgX1NUTFBfVEVNUExBVEVfQ09OVEFJTkVSIHVub3JkZXJlZF9tdWx0aXNldDxfVmFsdWUsX0hhc2hGY24sX0VxdWFsS2V5LF9BbGxvYz4KKyNpbmNsdWRlIDxzdGwvX3JlbG9wc19oYXNoX2NvbnQuaD4KKworI3VuZGVmIF9TVExQX1RFTVBMQVRFX0NPTlRBSU5FUgorI3VuZGVmIF9TVExQX1RFTVBMQVRFX0hFQURFUgorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKy8vIFNwZWNpYWxpemF0aW9uIG9mIGluc2VydF9pdGVyYXRvciBzbyB0aGF0IGl0IHdpbGwgd29yayBmb3IgdW5vcmRlcmVkX3NldAorLy8gYW5kIHVub3JkZXJlZF9tdWx0aXNldC4KKworI2lmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pCisjICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKK3RlbXBsYXRlIDxjbGFzcyBfVmFsdWUsIGNsYXNzIF9IYXNoRmNuLCBjbGFzcyBfRXF1YWxLZXksIGNsYXNzIF9BbGxvYz4KK3N0cnVjdCBfX21vdmVfdHJhaXRzPF9TVExQX1RSMSB1bm9yZGVyZWRfc2V0PF9WYWx1ZSwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPiA+IDoKKyAgX1NUTFBfUFJJViBfX21vdmVfdHJhaXRzX2F1eDx0eXBlbmFtZSBfU1RMUF9UUjEgdW5vcmRlcmVkX3NldDxfVmFsdWUsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz46Ol9IdD4KK3t9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaEZjbiwgY2xhc3MgX0VxdWFsS2V5LCBjbGFzcyBfQWxsb2M+CitzdHJ1Y3QgX19tb3ZlX3RyYWl0czxfU1RMUF9UUjEgdW5vcmRlcmVkX211bHRpc2V0PF9WYWx1ZSwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPiA+IDoKKyAgX1NUTFBfUFJJViBfX21vdmVfdHJhaXRzX2F1eDx0eXBlbmFtZSBfU1RMUF9UUjEgdW5vcmRlcmVkX211bHRpc2V0PF9WYWx1ZSwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPjo6X0h0Pgore307CisjICBlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaEZjbiwgY2xhc3MgX0VxdWFsS2V5LCBjbGFzcyBfQWxsb2M+CitjbGFzcyBpbnNlcnRfaXRlcmF0b3I8X1NUTFBfVFIxIHVub3JkZXJlZF9zZXQ8X1ZhbHVlLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+ID4geworcHJvdGVjdGVkOgorICB0eXBlZGVmIF9TVExQX1RSMSB1bm9yZGVyZWRfc2V0PF9WYWx1ZSwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPiBfQ29udGFpbmVyOworICBfQ29udGFpbmVyKiBjb250YWluZXI7CitwdWJsaWM6CisgIHR5cGVkZWYgX0NvbnRhaW5lciAgICAgICAgICBjb250YWluZXJfdHlwZTsKKyAgdHlwZWRlZiBvdXRwdXRfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisKKyAgaW5zZXJ0X2l0ZXJhdG9yKF9Db250YWluZXImIF9feCkgOiBjb250YWluZXIoJl9feCkge30KKyAgaW5zZXJ0X2l0ZXJhdG9yKF9Db250YWluZXImIF9feCwgdHlwZW5hbWUgX0NvbnRhaW5lcjo6aXRlcmF0b3IpCisgICAgOiBjb250YWluZXIoJl9feCkge30KKyAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JgorICBvcGVyYXRvcj0oY29uc3QgdHlwZW5hbWUgX0NvbnRhaW5lcjo6dmFsdWVfdHlwZSYgX192YWwpIHsKKyAgICBjb250YWluZXItPmluc2VydChfX3ZhbCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYgb3BlcmF0b3IqKCkgeyByZXR1cm4gKnRoaXM7IH0KKyAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JiBvcGVyYXRvcisrKCkgeyByZXR1cm4gKnRoaXM7IH0KKyAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JiBvcGVyYXRvcisrKGludCkgeyByZXR1cm4gKnRoaXM7IH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsdWUsIGNsYXNzIF9IYXNoRmNuLCBjbGFzcyBfRXF1YWxLZXksIGNsYXNzIF9BbGxvYz4KK2NsYXNzIGluc2VydF9pdGVyYXRvcjxfU1RMUF9UUjEgdW5vcmRlcmVkX211bHRpc2V0PF9WYWx1ZSwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPiA+IHsKK3Byb3RlY3RlZDoKKyAgdHlwZWRlZiBfU1RMUF9UUjEgdW5vcmRlcmVkX211bHRpc2V0PF9WYWx1ZSwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPiBfQ29udGFpbmVyOworICBfQ29udGFpbmVyKiBjb250YWluZXI7CisgIHR5cGVuYW1lIF9Db250YWluZXI6Oml0ZXJhdG9yIGl0ZXI7CitwdWJsaWM6CisgIHR5cGVkZWYgX0NvbnRhaW5lciAgICAgICAgICBjb250YWluZXJfdHlwZTsKKyAgdHlwZWRlZiBvdXRwdXRfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisKKyAgaW5zZXJ0X2l0ZXJhdG9yKF9Db250YWluZXImIF9feCkgOiBjb250YWluZXIoJl9feCkge30KKyAgaW5zZXJ0X2l0ZXJhdG9yKF9Db250YWluZXImIF9feCwgdHlwZW5hbWUgX0NvbnRhaW5lcjo6aXRlcmF0b3IpCisgICAgOiBjb250YWluZXIoJl9feCkge30KKyAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JgorICBvcGVyYXRvcj0oY29uc3QgdHlwZW5hbWUgX0NvbnRhaW5lcjo6dmFsdWVfdHlwZSYgX192YWwpIHsKKyAgICBjb250YWluZXItPmluc2VydChfX3ZhbCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYgb3BlcmF0b3IqKCkgeyByZXR1cm4gKnRoaXM7IH0KKyAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JiBvcGVyYXRvcisrKCkgeyByZXR1cm4gKnRoaXM7IH0KKyAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JiBvcGVyYXRvcisrKGludCkgeyByZXR1cm4gKnRoaXM7IH0KK307CisjZW5kaWYgLyogX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTiAqLworCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9VTk9SREVSRURfU0VUX0ggKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKKwpkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdGwvX3ZhbGFycmF5LmMgYi9zdGxwb3J0L3N0bC9fdmFsYXJyYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTUzNGE5Ci0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvX3ZhbGFycmF5LmMKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKyNpZm5kZWYgX1NUTFBfVkFMQVJSQVlfQworI2RlZmluZSBfU1RMUF9WQUxBUlJBWV9DCisKKyNpZm5kZWYgX1NUTFBfVkFMQVJSQVlfSAorIyBpbmNsdWRlIDxzdGwvX3ZhbGFycmF5Lmg+CisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitfVmFsYXJyYXlfYm9vbCB2YWxhcnJheTxfVHA+Ojogb3BlcmF0b3IhKCkgY29uc3QgeworICBfVmFsYXJyYXlfYm9vbCBfX3RtcCh0aGlzLT5zaXplKCksIF9WYWxhcnJheV9ib29sOjpfTm9Jbml0KCkpOworICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCB0aGlzLT5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSAhKCp0aGlzKVtfX2ldOworICByZXR1cm4gX190bXA7Cit9CisKKy8vIEJlaGF2aW9yIGlzIHVuZGVmaW5lZCBpZiBfX3ggYW5kICp0aGlzIGhhdmUgZGlmZmVyZW50IHNpemVzCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgordmFsYXJyYXk8X1RwPiYgdmFsYXJyYXk8X1RwPjo6b3BlcmF0b3I9KGNvbnN0IHNsaWNlX2FycmF5PF9UcD4mIF9feCkgeworICBfU1RMUF9BU1NFUlQoX194Ll9NX3NsaWNlLnNpemUoKSA9PSB0aGlzLT5zaXplKCkpCisgIHNpemVfdCBfX2luZGV4ID0gX194Ll9NX3NsaWNlLnN0YXJ0KCk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7CisgICAgICAgX19pIDwgX194Ll9NX3NsaWNlLnNpemUoKTsKKyAgICAgICArK19faSwgX19pbmRleCArPSBfX3guX01fc2xpY2Uuc3RyaWRlKCkpCisgICAgKCp0aGlzKVtfX2ldID0gX194Ll9NX2FycmF5W19faW5kZXhdOworICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+Cit2YWxhcnJheTxfVHA+IHZhbGFycmF5PF9UcD46Om9wZXJhdG9yW10oc2xpY2UgX19zbGljZSkgY29uc3QgeworICB2YWxhcnJheTxfVHA+IF9fdG1wKF9fc2xpY2Uuc2l6ZSgpLCBfTm9Jbml0KCkpOworICBzaXplX3QgX19pbmRleCA9IF9fc2xpY2Uuc3RhcnQoKTsKKyAgZm9yIChzaXplX3QgX19pID0gMDsKKyAgICAgICBfX2kgPCBfX3NsaWNlLnNpemUoKTsKKyAgICAgICArK19faSwgX19pbmRleCArPSBfX3NsaWNlLnN0cmlkZSgpKQorICAgIF9fdG1wW19faV0gPSAoKnRoaXMpW19faW5kZXhdOworICByZXR1cm4gX190bXA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfU2l6ZT4KK2Jvb2wgX0dzbGljZV9JdGVyX3RtcGw8X1NpemU+OjpfTV9pbmNyKCkgeworICBzaXplX3QgX19kaW0gPSBfTV9pbmRpY2VzLnNpemUoKSAtIDE7CisgICsrX01fc3RlcDsKKyAgZm9yICg7OykgeworICAgIF9NXzFkX2lkeCArPSBfTV9nc2xpY2UuX01fc3RyaWRlc1tfX2RpbV07CisgICAgaWYgKCsrX01faW5kaWNlc1tfX2RpbV0gIT0gX01fZ3NsaWNlLl9NX2xlbmd0aHNbX19kaW1dKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgZWxzZSBpZiAoX19kaW0gIT0gMCkgeworICAgICAgX01fMWRfaWR4IC09IF9NX2dzbGljZS5fTV9zdHJpZGVzW19fZGltXSAqIF9NX2dzbGljZS5fTV9sZW5ndGhzW19fZGltXTsKKyAgICAgIF9NX2luZGljZXNbX19kaW1dID0gMDsKKyAgICAgIC0tX19kaW07CisgICAgfQorICAgIGVsc2UKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCisvLyBCZWhhdmlvciBpcyB1bmRlZmluZWQgaWYgX194IGFuZCAqdGhpcyBoYXZlIGRpZmZlcmVudCBzaXplcywgb3IgaWYKKy8vIF9feCB3YXMgY29uc3RydWN0ZWQgZnJvbSBhIGRlZ2VuZXJhdGUgZ3NsaWNlLgordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3ZhbGFycmF5PF9UcD4mIHZhbGFycmF5PF9UcD46Om9wZXJhdG9yPShjb25zdCBnc2xpY2VfYXJyYXk8X1RwPiYgX194KSB7CisgIGlmICh0aGlzLT5zaXplKCkgIT0gMCkgeworICAgIF9Hc2xpY2VfSXRlciBfX2koX194Ll9NX2dzbGljZSk7CisgICAgZG8KKyAgICAgICgqdGhpcylbX19pLl9NX3N0ZXBdID0gX194Ll9NX2FycmF5W19faS5fTV8xZF9pZHhdOworICAgIHdoaWxlKF9faS5fTV9pbmNyKCkpOworICB9CisgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3ZhbGFycmF5PF9UcD4gdmFsYXJyYXk8X1RwPjo6b3BlcmF0b3JbXShjb25zdCBnc2xpY2UmIF9fc2xpY2UpIGNvbnN0IHsKKyAgdmFsYXJyYXk8X1RwPiBfX3RtcChfX3NsaWNlLl9NX3NpemUoKSwgX05vSW5pdCgpKTsKKyAgaWYgKF9fdG1wLnNpemUoKSAhPSAwKSB7CisgICAgX0dzbGljZV9JdGVyIF9faShfX3NsaWNlKTsKKyAgICBkbyBfX3RtcFtfX2kuX01fc3RlcF0gPSAoKnRoaXMpW19faS5fTV8xZF9pZHhdOyB3aGlsZShfX2kuX01faW5jcigpKTsKKyAgfQorICByZXR1cm4gX190bXA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+Cit2YWxhcnJheTxfVHA+IHZhbGFycmF5PF9UcD46Om9wZXJhdG9yW10oY29uc3QgX1ZhbGFycmF5X2Jvb2wmIF9fbWFzaykgY29uc3QgeworICBzaXplX3QgX3Bfc2l6ZSA9IDA7CisgIHsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX21hc2suc2l6ZSgpOyArK19faSkKKyAgICAgIGlmIChfX21hc2tbX19pXSkgKytfcF9zaXplOworICB9CisKKyAgdmFsYXJyYXk8X1RwPiBfX3RtcChfcF9zaXplLCBfTm9Jbml0KCkpOworICBzaXplX3QgX19pZHggPSAwOworICB7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19tYXNrLnNpemUoKTsgKytfX2kpCisgICAgICBpZiAoX19tYXNrW19faV0pIF9fdG1wW19faWR4KytdID0gKCp0aGlzKVtfX2ldOworICB9CisKKyAgcmV0dXJuIF9fdG1wOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgordmFsYXJyYXk8X1RwPiYgdmFsYXJyYXk8X1RwPjo6b3BlcmF0b3I9KGNvbnN0IGluZGlyZWN0X2FycmF5PF9UcD4mIF9feCkgeworICBfU1RMUF9BU1NFUlQoX194Ll9NX2FkZHIuc2l6ZSgpID09IHRoaXMtPnNpemUoKSkKKyAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194Ll9NX2FkZHIuc2l6ZSgpOyArK19faSkKKyAgICAoKnRoaXMpW19faV0gPSBfX3guX01fYXJyYXlbX194Ll9NX2FkZHJbX19pXV07CisgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3ZhbGFycmF5PF9UcD4KK3ZhbGFycmF5PF9UcD46Om9wZXJhdG9yW10oY29uc3QgX1ZhbGFycmF5X3NpemVfdCYgX19hZGRyKSBjb25zdCB7CisgIHZhbGFycmF5PF9UcD4gX190bXAoX19hZGRyLnNpemUoKSwgX05vSW5pdCgpKTsKKyAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19hZGRyLnNpemUoKTsgKytfX2kpCisgICAgX190bXBbX19pXSA9ICgqdGhpcylbX19hZGRyW19faV1dOworICByZXR1cm4gX190bXA7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT3RoZXIgdmFsYXJyYXkgbm9uaW5saW5lIG1lbWJlciBmdW5jdGlvbnMKKworLy8gU2hpZnQgYW5kIGNzaGlmdAorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgordmFsYXJyYXk8X1RwPiB2YWxhcnJheTxfVHA+OjpzaGlmdChpbnQgX19uKSBjb25zdCB7CisgIHZhbGFycmF5PF9UcD4gX190bXAodGhpcy0+c2l6ZSgpKTsKKworICBpZiAoX19uID49IDApIHsKKyAgICBpZiAoX19uIDwgdGhpcy0+c2l6ZSgpKQorICAgICAgY29weSh0aGlzLT5fTV9maXJzdCArIF9fbiwgdGhpcy0+X01fZmlyc3QgKyB0aGlzLT5zaXplKCksCisgICAgICAgICAgIF9fdG1wLl9NX2ZpcnN0KTsKKyAgfQorICBlbHNlIHsKKyAgICBpZiAoLV9fbiA8IHRoaXMtPnNpemUoKSkKKyAgICAgIGNvcHkodGhpcy0+X01fZmlyc3QsIHRoaXMtPl9NX2ZpcnN0ICsgdGhpcy0+c2l6ZSgpICsgX19uLAorICAgICAgICAgICBfX3RtcC5fTV9maXJzdCAtIF9fbik7CisgIH0KKyAgcmV0dXJuIF9fdG1wOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgordmFsYXJyYXk8X1RwPiB2YWxhcnJheTxfVHA+Ojpjc2hpZnQoaW50IF9fbSkgY29uc3QgeworICB2YWxhcnJheTxfVHA+IF9fdG1wKHRoaXMtPnNpemUoKSk7CisKKyAgLy8gUmVkdWNlIF9fbSB0byBhbiBlcXVpdmFsZW50IG51bWJlciBpbiB0aGUgcmFuZ2UgWzAsIHNpemUoKSkuICBXZQorICAvLyBoYXZlIHRvIGJlIGNhcmVmdWwgd2l0aCBuZWdhdGl2ZSBudW1iZXJzLCBzaW5jZSB0aGUgc2lnbiBvZiBhICUgYgorICAvLyBpcyB1bnNwZWNpZmllZCB3aGVuIGEgPCAwLgorICBsb25nIF9fbiA9IF9fbTsKKyAgaWYgKHRoaXMtPnNpemUoKSA8IChudW1lcmljX2xpbWl0czxsb25nPjo6bWF4KSgpKQorICAgIF9fbiAlPSBsb25nKHRoaXMtPnNpemUoKSk7CisgIGlmIChfX24gPCAwKQorICAgIF9fbiArPSB0aGlzLT5zaXplKCk7CisKKyAgY29weSh0aGlzLT5fTV9maXJzdCwgICAgICAgdGhpcy0+X01fZmlyc3QgKyBfX24sCisgICAgICAgX190bXAuX01fZmlyc3QgKyAodGhpcy0+c2l6ZSgpIC0gX19uKSk7CisgIGNvcHkodGhpcy0+X01fZmlyc3QgKyBfX24sIHRoaXMtPl9NX2ZpcnN0ICsgdGhpcy0+c2l6ZSgpLAorICAgICAgIF9fdG1wLl9NX2ZpcnN0KTsKKworICByZXR1cm4gX190bXA7Cit9CisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2VuZGlmIC8qICBfU1RMUF9WQUxBUlJBWV9DICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9fdmFsYXJyYXkuaCBiL3N0bHBvcnQvc3RsL192YWxhcnJheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkOTY0MWEKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9fdmFsYXJyYXkuaApAQCAtMCwwICsxLDE2ODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfVkFMQVJSQVlfSAorI2RlZmluZSBfU1RMUF9WQUxBUlJBWV9ICisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ01BVEgKKyMgIGluY2x1ZGUgPHN0bC9fY21hdGguaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX05FVworIyAgaW5jbHVkZSA8c3RsL19uZXcuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0FMR09fSAorIyAgaW5jbHVkZSA8c3RsL19hbGdvLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9OVU1FUklDX0gKKyMgIGluY2x1ZGUgPHN0bC9fbnVtZXJpYy5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfTElNSVRTCisjICBpbmNsdWRlIDxzdGwvX2xpbWl0cy5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCitjbGFzcyBzbGljZTsKK2NsYXNzIGdzbGljZTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4gY2xhc3MgdmFsYXJyYXk7Cit0eXBlZGVmIHZhbGFycmF5PGJvb2w+ICAgIF9WYWxhcnJheV9ib29sOwordHlwZWRlZiB2YWxhcnJheTxzaXplX3Q+ICBfVmFsYXJyYXlfc2l6ZV90OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBjbGFzcyBzbGljZV9hcnJheTsKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IGNsYXNzIGdzbGljZV9hcnJheTsKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IGNsYXNzIG1hc2tfYXJyYXk7Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBjbGFzcyBpbmRpcmVjdF9hcnJheTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjbGFzcyB2YWxhcnJheQorCisvLyBCYXNlIGNsYXNzIHRvIGhhbmRsZSBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgZGVhbGxvY2F0aW9uLiAgV2UgY2FuJ3QganVzdAorLy8gdXNlIHZlY3Rvcjw+LCBiZWNhdXNlIHZlY3Rvcjxib29sPiB3b3VsZCBiZSB1bnN1aXRhYmxlIGFzIGFuIGludGVybmFsCisvLyByZXByZXNlbnRhdGlvbiBmb3IgdmFsYXJyYXk8Ym9vbD4uCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX1ZhbGFycmF5X2Jhc2UgeworICBfVHAqICAgX01fZmlyc3Q7CisgIHNpemVfdCBfTV9zaXplOworCisgIF9WYWxhcnJheV9iYXNlKCkgOiBfTV9maXJzdCgwKSwgX01fc2l6ZSgwKSB7fQorICBfVmFsYXJyYXlfYmFzZShzaXplX3QgX19uKSA6IF9NX2ZpcnN0KDApLCBfTV9zaXplKDApIHsgX01fYWxsb2NhdGUoX19uKTsgfQorICB+X1ZhbGFycmF5X2Jhc2UoKSB7IF9NX2RlYWxsb2NhdGUoKTsgfQorCisgIHZvaWQgX01fYWxsb2NhdGUoc2l6ZV90IF9fbikgeworICAgIGlmIChfX24gIT0gMCkgeworICAgICAgX01fZmlyc3QgPSBfX1NUQVRJQ19DQVNUKF9UcCosIF9fc3RsX25ldyhfX24gKiBzaXplb2YoX1RwKSkpOworICAgICAgX01fc2l6ZSAgPSBfX247CisgICAgfQorICAgIGVsc2UgeworICAgICAgX01fZmlyc3QgPSAwOworICAgICAgX01fc2l6ZSA9IDA7CisgICAgfQorICB9CisKKyAgdm9pZCBfTV9kZWFsbG9jYXRlKCkgeworICAgIF9fc3RsX2RlbGV0ZShfTV9maXJzdCk7CisgICAgX01fZmlyc3QgPSAwOworICAgIF9NX3NpemUgPSAwOworICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorY2xhc3MgdmFsYXJyYXkgOiBwcml2YXRlIF9WYWxhcnJheV9iYXNlPF9UcD4KK3sKKyAgZnJpZW5kIGNsYXNzIGdzbGljZTsKKworcHVibGljOgorICB0eXBlZGVmIF9UcCB2YWx1ZV90eXBlOworCisgIC8vIEJhc2ljIGNvbnN0cnVjdG9ycworICB2YWxhcnJheSgpIDogX1ZhbGFycmF5X2Jhc2U8X1RwPigpIHt9CisgIGV4cGxpY2l0IHZhbGFycmF5KHNpemVfdCBfX24pIDogX1ZhbGFycmF5X2Jhc2U8X1RwPihfX24pCisgICAgeyB1bmluaXRpYWxpemVkX2ZpbGxfbih0aGlzLT5fTV9maXJzdCwgdGhpcy0+X01fc2l6ZSwgX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRCh2YWx1ZV90eXBlKSk7IH0KKyAgdmFsYXJyYXkoY29uc3QgdmFsdWVfdHlwZSYgX194LCBzaXplX3QgX19uKSA6IF9WYWxhcnJheV9iYXNlPF9UcD4oX19uKQorICAgIHsgdW5pbml0aWFsaXplZF9maWxsX24odGhpcy0+X01fZmlyc3QsIHRoaXMtPl9NX3NpemUsIF9feCk7IH0KKyAgdmFsYXJyYXkoY29uc3QgdmFsdWVfdHlwZSogX19wLCBzaXplX3QgX19uKSA6IF9WYWxhcnJheV9iYXNlPF9UcD4oX19uKQorICAgIHsgdW5pbml0aWFsaXplZF9jb3B5KF9fcCwgX19wICsgX19uLCB0aGlzLT5fTV9maXJzdCk7IH0KKyAgdmFsYXJyYXkoY29uc3QgdmFsYXJyYXk8X1RwPiYgX194KSA6IF9WYWxhcnJheV9iYXNlPF9UcD4oX194Ll9NX3NpemUpIHsKKyAgICB1bmluaXRpYWxpemVkX2NvcHkoX194Ll9NX2ZpcnN0LCBfX3guX01fZmlyc3QgKyBfX3guX01fc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+X01fZmlyc3QpOworICB9CisKKyAgLy8gQ29uc3RydWN0b3JzIGZyb20gYXV4aWxpYXJ5IGFycmF5IHR5cGVzCisgIHZhbGFycmF5KGNvbnN0IHNsaWNlX2FycmF5PF9UcD4mKTsKKyAgdmFsYXJyYXkoY29uc3QgZ3NsaWNlX2FycmF5PF9UcD4mKTsKKyAgdmFsYXJyYXkoY29uc3QgbWFza19hcnJheTxfVHA+Jik7CisgIHZhbGFycmF5KGNvbnN0IGluZGlyZWN0X2FycmF5PF9UcD4mKTsKKworICAvLyBEZXN0cnVjdG9yCisgIH52YWxhcnJheSgpIHsgX1NUTFBfU1REOjpfRGVzdHJveV9SYW5nZSh0aGlzLT5fTV9maXJzdCwgdGhpcy0+X01fZmlyc3QgKyB0aGlzLT5fTV9zaXplKTsgfQorCisgIC8vIEV4dGVuc2lvbjogY29uc3RydWN0b3IgdGhhdCBkb2Vzbid0IGluaXRpYWxpemUgdmFsYXJyYXkgZWxlbWVudHMgdG8gYQorICAvLyBzcGVjaWZpYyB2YWx1ZS4gIFRoaXMgaXMgZmFzdGVyIGZvciB0eXBlcyBzdWNoIGFzIGludCBhbmQgZG91YmxlLgorcHJpdmF0ZToKKyAgdm9pZCBfTV9pbml0aWFsaXplKGNvbnN0IF9fdHJ1ZV90eXBlJikge30KKyAgdm9pZCBfTV9pbml0aWFsaXplKGNvbnN0IF9fZmFsc2VfdHlwZSYpCisgICAgeyB1bmluaXRpYWxpemVkX2ZpbGxfbih0aGlzLT5fTV9maXJzdCwgdGhpcy0+X01fc2l6ZSwgX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRChfVHApKTsgfQorCitwdWJsaWM6CisgIHN0cnVjdCBfTm9Jbml0IHt9OworICB2YWxhcnJheShzaXplX3QgX19uLCBfTm9Jbml0KSA6IF9WYWxhcnJheV9iYXNlPF9UcD4oX19uKSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3R5cGVfdHJhaXRzPF9UcD46Omhhc190cml2aWFsX2RlZmF1bHRfY29uc3RydWN0b3IgX0lzX1RyaXZpYWw7CisgICAgX01faW5pdGlhbGl6ZShfSXNfVHJpdmlhbCgpKTsKKyAgfQorCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFzc2lnbm1lbnQKKyAgLy8gQmFzaWMgYXNzaWdubWVudC4gIE5vdGUgdGhhdCAneCA9IHknIGlzIHVuZGVmaW5lZCBpZiB4LnNpemUoKSAhPSB5LnNpemUoKQorICB2YWxhcnJheTxfVHA+JiBvcGVyYXRvcj0oY29uc3QgdmFsYXJyYXk8X1RwPiYgX194KSB7CisgICAgX1NUTFBfQVNTRVJUKF9feC5zaXplKCkgPT0gdGhpcy0+c2l6ZSgpKQorICAgIGlmICh0aGlzICE9ICZfX3gpCisgICAgICBjb3B5KF9feC5fTV9maXJzdCwgX194Ll9NX2ZpcnN0ICsgX194Ll9NX3NpemUsIHRoaXMtPl9NX2ZpcnN0KTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLyBTY2FsYXIgYXNzaWdubWVudAorICB2YWxhcnJheTxfVHA+JiBvcGVyYXRvcj0oY29uc3QgdmFsdWVfdHlwZSYgX194KSB7CisgICAgZmlsbF9uKHRoaXMtPl9NX2ZpcnN0LCB0aGlzLT5fTV9zaXplLCBfX3gpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vIEFzc2lnbm1lbnQgb2YgYXV4aWxpYXJ5IGFycmF5IHR5cGVzCisgIHZhbGFycmF5PF9UcD4mIG9wZXJhdG9yPShjb25zdCBzbGljZV9hcnJheTxfVHA+Jik7CisgIHZhbGFycmF5PF9UcD4mIG9wZXJhdG9yPShjb25zdCBnc2xpY2VfYXJyYXk8X1RwPiYpOworICB2YWxhcnJheTxfVHA+JiBvcGVyYXRvcj0oY29uc3QgbWFza19hcnJheTxfVHA+Jik7CisgIHZhbGFycmF5PF9UcD4mIG9wZXJhdG9yPShjb25zdCBpbmRpcmVjdF9hcnJheTxfVHA+Jik7CisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gRWxlbWVudCBhY2Nlc3MKKyAgdmFsdWVfdHlwZSAgb3BlcmF0b3JbXShzaXplX3QgX19uKSBjb25zdCB7CisgICAgX1NUTFBfQVNTRVJUKF9fbiA8IHRoaXMtPnNpemUoKSkKKyAgICByZXR1cm4gdGhpcy0+X01fZmlyc3RbX19uXTsKKyAgfQorICB2YWx1ZV90eXBlJiBvcGVyYXRvcltdKHNpemVfdCBfX24pIHsKKyAgICBfU1RMUF9BU1NFUlQoX19uIDwgdGhpcy0+c2l6ZSgpKQorICAgIHJldHVybiB0aGlzLT5fTV9maXJzdFtfX25dOworICB9CisgIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gdGhpcy0+X01fc2l6ZTsgfQorCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN1YnNldHRpbmcgb3BlcmF0aW9ucyB3aXRoIGF1eGlsaWFyeSB0eXBlCisgIHZhbGFycmF5PF9UcD4gICAgICAgb3BlcmF0b3JbXShzbGljZSkgY29uc3Q7CisgIHNsaWNlX2FycmF5PF9UcD4gICAgb3BlcmF0b3JbXShzbGljZSk7CisgIHZhbGFycmF5PF9UcD4gICAgICAgb3BlcmF0b3JbXShjb25zdCBnc2xpY2UmKSBjb25zdDsKKyAgZ3NsaWNlX2FycmF5PF9UcD4gICBvcGVyYXRvcltdKGNvbnN0IGdzbGljZSYpOworICB2YWxhcnJheTxfVHA+ICAgICAgIG9wZXJhdG9yW10oY29uc3QgX1ZhbGFycmF5X2Jvb2wmKSBjb25zdDsKKyAgbWFza19hcnJheTxfVHA+ICAgICBvcGVyYXRvcltdKGNvbnN0IF9WYWxhcnJheV9ib29sJik7CisgIHZhbGFycmF5PF9UcD4gICAgICAgb3BlcmF0b3JbXShjb25zdCBfVmFsYXJyYXlfc2l6ZV90JikgY29uc3Q7CisgIGluZGlyZWN0X2FycmF5PF9UcD4gb3BlcmF0b3JbXShjb25zdCBfVmFsYXJyYXlfc2l6ZV90Jik7CisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gVW5hcnkgb3BlcmF0b3JzLgorICB2YWxhcnJheTxfVHA+IG9wZXJhdG9yKygpIGNvbnN0IHsgcmV0dXJuICp0aGlzOyB9CisKKyAgdmFsYXJyYXk8X1RwPiBvcGVyYXRvci0oKSBjb25zdCB7CisgICAgdmFsYXJyYXk8X1RwPiBfX3RtcCh0aGlzLT5zaXplKCksIF9Ob0luaXQoKSk7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgdGhpcy0+c2l6ZSgpOyArK19faSkKKyAgICAgIF9fdG1wW19faV0gPSAtKCp0aGlzKVtfX2ldOworICAgIHJldHVybiBfX3RtcDsKKyAgfQorCisgIHZhbGFycmF5PF9UcD4gb3BlcmF0b3J+KCkgY29uc3QgeworICAgIHZhbGFycmF5PF9UcD4gX190bXAodGhpcy0+c2l6ZSgpLCBfTm9Jbml0KCkpOworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IHRoaXMtPnNpemUoKTsgKytfX2kpCisgICAgICBfX3RtcFtfX2ldID0gfigqdGhpcylbX19pXTsKKyAgICByZXR1cm4gX190bXA7CisgIH0KKworICBfVmFsYXJyYXlfYm9vbCBvcGVyYXRvciEoKSBjb25zdDsKKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTY2FsYXIgY29tcHV0ZWQgYXNzaWdubWVudC4KKyAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3IqPSAoY29uc3QgdmFsdWVfdHlwZSYgX194KSB7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgdGhpcy0+c2l6ZSgpOyArK19faSkKKyAgICAgICgqdGhpcylbX19pXSAqPSBfX3g7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3IvPSAoY29uc3QgdmFsdWVfdHlwZSYgX194KSB7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgdGhpcy0+c2l6ZSgpOyArK19faSkKKyAgICAgICgqdGhpcylbX19pXSAvPSBfX3g7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3IlPSAoY29uc3QgdmFsdWVfdHlwZSYgX194KSB7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgdGhpcy0+c2l6ZSgpOyArK19faSkKKyAgICAgICgqdGhpcylbX19pXSAlPSBfX3g7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3IrPSAoY29uc3QgdmFsdWVfdHlwZSYgX194KSB7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgdGhpcy0+c2l6ZSgpOyArK19faSkKKyAgICAgICgqdGhpcylbX19pXSArPSBfX3g7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3ItPSAoY29uc3QgdmFsdWVfdHlwZSYgX194KSB7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgdGhpcy0+c2l6ZSgpOyArK19faSkKKyAgICAgICgqdGhpcylbX19pXSAtPSBfX3g7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3JePSAoY29uc3QgdmFsdWVfdHlwZSYgX194KSB7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgdGhpcy0+c2l6ZSgpOyArK19faSkKKyAgICAgICgqdGhpcylbX19pXSBePSBfX3g7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3ImPSAoY29uc3QgdmFsdWVfdHlwZSYgX194KSB7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgdGhpcy0+c2l6ZSgpOyArK19faSkKKyAgICAgICgqdGhpcylbX19pXSAmPSBfX3g7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3J8PSAoY29uc3QgdmFsdWVfdHlwZSYgX194KSB7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgdGhpcy0+c2l6ZSgpOyArK19faSkKKyAgICAgICgqdGhpcylbX19pXSB8PSBfX3g7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3I8PD0gKGNvbnN0IHZhbHVlX3R5cGUmIF9feCkgeworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IHRoaXMtPnNpemUoKTsgKytfX2kpCisgICAgICAoKnRoaXMpW19faV0gPDw9IF9feDsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB2YWxhcnJheTxfVHA+JiBvcGVyYXRvcj4+PSAoY29uc3QgdmFsdWVfdHlwZSYgX194KSB7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgdGhpcy0+c2l6ZSgpOyArK19faSkKKyAgICAgICgqdGhpcylbX19pXSA+Pj0gX194OworICAgIHJldHVybiAqdGhpczsKKyAgfQorCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFycmF5IGNvbXB1dGVkIGFzc2lnbm1lbnQuCisgIHZhbGFycmF5PF9UcD4mIG9wZXJhdG9yKj0gKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCkgeworICAgIF9TVExQX0FTU0VSVChfX3guc2l6ZSgpID09IHRoaXMtPnNpemUoKSkKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCB0aGlzLT5zaXplKCk7ICsrX19pKQorICAgICAgKCp0aGlzKVtfX2ldICo9IF9feFtfX2ldOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHZhbGFycmF5PF9UcD4mIG9wZXJhdG9yLz0gKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCkgeworICAgIF9TVExQX0FTU0VSVChfX3guc2l6ZSgpID09IHRoaXMtPnNpemUoKSkKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCB0aGlzLT5zaXplKCk7ICsrX19pKQorICAgICAgKCp0aGlzKVtfX2ldIC89IF9feFtfX2ldOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHZhbGFycmF5PF9UcD4mIG9wZXJhdG9yJT0gKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCkgeworICAgIF9TVExQX0FTU0VSVChfX3guc2l6ZSgpID09IHRoaXMtPnNpemUoKSkKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCB0aGlzLT5zaXplKCk7ICsrX19pKQorICAgICAgKCp0aGlzKVtfX2ldICU9IF9feFtfX2ldOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHZhbGFycmF5PF9UcD4mIG9wZXJhdG9yKz0gKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCkgeworICAgIF9TVExQX0FTU0VSVChfX3guc2l6ZSgpID09IHRoaXMtPnNpemUoKSkKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCB0aGlzLT5zaXplKCk7ICsrX19pKQorICAgICAgKCp0aGlzKVtfX2ldICs9IF9feFtfX2ldOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHZhbGFycmF5PF9UcD4mIG9wZXJhdG9yLT0gKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCkgeworICAgIF9TVExQX0FTU0VSVChfX3guc2l6ZSgpID09IHRoaXMtPnNpemUoKSkKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCB0aGlzLT5zaXplKCk7ICsrX19pKQorICAgICAgKCp0aGlzKVtfX2ldIC09IF9feFtfX2ldOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHZhbGFycmF5PF9UcD4mIG9wZXJhdG9yXj0gKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCkgeworICAgIF9TVExQX0FTU0VSVChfX3guc2l6ZSgpID09IHRoaXMtPnNpemUoKSkKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCB0aGlzLT5zaXplKCk7ICsrX19pKQorICAgICAgKCp0aGlzKVtfX2ldIF49IF9feFtfX2ldOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHZhbGFycmF5PF9UcD4mIG9wZXJhdG9yJj0gKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCkgeworICAgIF9TVExQX0FTU0VSVChfX3guc2l6ZSgpID09IHRoaXMtPnNpemUoKSkKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCB0aGlzLT5zaXplKCk7ICsrX19pKQorICAgICAgKCp0aGlzKVtfX2ldICY9IF9feFtfX2ldOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHZhbGFycmF5PF9UcD4mIG9wZXJhdG9yfD0gKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCkgeworICAgIF9TVExQX0FTU0VSVChfX3guc2l6ZSgpID09IHRoaXMtPnNpemUoKSkKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCB0aGlzLT5zaXplKCk7ICsrX19pKQorICAgICAgKCp0aGlzKVtfX2ldIHw9IF9feFtfX2ldOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHZhbGFycmF5PF9UcD4mIG9wZXJhdG9yPDw9IChjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gpIHsKKyAgICBfU1RMUF9BU1NFUlQoX194LnNpemUoKSA9PSB0aGlzLT5zaXplKCkpCisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgdGhpcy0+c2l6ZSgpOyArK19faSkKKyAgICAgICgqdGhpcylbX19pXSA8PD0gX194W19faV07CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3I+Pj0gKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCkgeworICAgIF9TVExQX0FTU0VSVChfX3guc2l6ZSgpID09IHRoaXMtPnNpemUoKSkKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCB0aGlzLT5zaXplKCk7ICsrX19pKQorICAgICAgKCp0aGlzKVtfX2ldID4+PSBfX3hbX19pXTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPdGhlciBtZW1iZXIgZnVuY3Rpb25zLgorCisgIC8vIFRoZSByZXN1bHQgaXMgdW5kZWZpbmVkIGZvciB6ZXJvLWxlbmd0aCBhcnJheXMKKyAgdmFsdWVfdHlwZSBzdW0oKSBjb25zdCB7CisgICAgX1NUTFBfQVNTRVJUKHRoaXMtPnNpemUoKSAhPSAwKQorICAgIHJldHVybiBhY2N1bXVsYXRlKHRoaXMtPl9NX2ZpcnN0ICsgMSwgdGhpcy0+X01fZmlyc3QgKyB0aGlzLT5fTV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICgqdGhpcylbMF0pOworICB9CisKKyAgLy8gVGhlIHJlc3VsdCBpcyB1bmRlZmluZWQgZm9yIHplcm8tbGVuZ3RoIGFycmF5cworICB2YWx1ZV90eXBlIChtaW4pICgpIGNvbnN0IHsKKyAgICBfU1RMUF9BU1NFUlQodGhpcy0+c2l6ZSgpICE9IDApCisgICAgcmV0dXJuICptaW5fZWxlbWVudCh0aGlzLT5fTV9maXJzdCArIDAsIHRoaXMtPl9NX2ZpcnN0ICsgdGhpcy0+X01fc2l6ZSk7CisgIH0KKworICB2YWx1ZV90eXBlIChtYXgpICgpIGNvbnN0IHsKKyAgICBfU1RMUF9BU1NFUlQodGhpcy0+c2l6ZSgpICE9IDApCisgICAgcmV0dXJuICptYXhfZWxlbWVudCh0aGlzLT5fTV9maXJzdCArIDAsIHRoaXMtPl9NX2ZpcnN0ICsgdGhpcy0+X01fc2l6ZSk7CisgIH0KKworICB2YWxhcnJheTxfVHA+IHNoaWZ0KGludCBfX24pIGNvbnN0OworICB2YWxhcnJheTxfVHA+IGNzaGlmdChpbnQgX19uKSBjb25zdDsKKworICB2YWxhcnJheTxfVHA+IGFwcGx5KHZhbHVlX3R5cGUgX19mKHZhbHVlX3R5cGUpKSBjb25zdCB7CisgICAgdmFsYXJyYXk8X1RwPiBfX3RtcCh0aGlzLT5zaXplKCkpOworICAgIHRyYW5zZm9ybSh0aGlzLT5fTV9maXJzdCArIDAsIHRoaXMtPl9NX2ZpcnN0ICsgdGhpcy0+X01fc2l6ZSwgX190bXAuX01fZmlyc3QsCisgICAgICAgICAgICAgIF9fZik7CisgICAgcmV0dXJuIF9fdG1wOworICB9CisgIHZhbGFycmF5PF9UcD4gYXBwbHkodmFsdWVfdHlwZSBfX2YoY29uc3QgdmFsdWVfdHlwZSYpKSBjb25zdCB7CisgICAgdmFsYXJyYXk8X1RwPiBfX3RtcCh0aGlzLT5zaXplKCkpOworICAgIHRyYW5zZm9ybSh0aGlzLT5fTV9maXJzdCArIDAsIHRoaXMtPl9NX2ZpcnN0ICsgdGhpcy0+X01fc2l6ZSwgX190bXAuX01fZmlyc3QsCisgICAgICAgICAgICAgIF9fZik7CisgICAgcmV0dXJuIF9fdG1wOworICB9CisKKyAgdm9pZCByZXNpemUoc2l6ZV90IF9fbiwgdmFsdWVfdHlwZSBfX3ggPSB2YWx1ZV90eXBlKCkpIHsKKyAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95X1JhbmdlKHRoaXMtPl9NX2ZpcnN0LCB0aGlzLT5fTV9maXJzdCArIHRoaXMtPl9NX3NpemUpOworICAgIF9WYWxhcnJheV9iYXNlPF9UcD46Ol9NX2RlYWxsb2NhdGUoKTsKKyAgICBfVmFsYXJyYXlfYmFzZTxfVHA+OjpfTV9hbGxvY2F0ZShfX24pOworICAgIHVuaW5pdGlhbGl6ZWRfZmlsbF9uKHRoaXMtPl9NX2ZpcnN0LCB0aGlzLT5fTV9zaXplLCBfX3gpOworICB9Cit9OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHZhbGFycmF5IG5vbi1tZW1iZXIgZnVuY3Rpb25zLgorCisvLyBCaW5hcnkgYXJpdGhtZXRpYyBvcGVyYXRpb25zIGJldHdlZW4gdHdvIGFycmF5cy4gIEJlaGF2aW9yIGlzCisvLyB1bmRlZmluZWQgaWYgdGhlIHR3byBhcnJheXMgZG8gbm90IGhhdmUgdGhlIHNhbWUgbGVuZ3RoLgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIHZhbGFycmF5PF9UcD4gIF9TVExQX0NBTEwgb3BlcmF0b3IqKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWxhcnJheTxfVHA+JiBfX3kpIHsKKyAgX1NUTFBfQVNTRVJUKF9feC5zaXplKCkgPT0gX195LnNpemUoKSkKKyAgdHlwZWRlZiB0eXBlbmFtZSB2YWxhcnJheTxfVHA+OjpfTm9Jbml0IF9Ob0luaXQ7CisgIHZhbGFycmF5PF9UcD4gX190bXAoX194LnNpemUoKSwgX05vSW5pdCgpKTsKKyAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCisgICAgX190bXBbX19pXSA9IF9feFtfX2ldICogX195W19faV07CisgIHJldHVybiBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSB2YWxhcnJheTxfVHA+ICBfU1RMUF9DQUxMIG9wZXJhdG9yLyhjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsYXJyYXk8X1RwPiYgX195KSB7CisgIF9TVExQX0FTU0VSVChfX3guc2l6ZSgpID09IF9feS5zaXplKCkpCisgIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OworICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSBfX3hbX19pXSAvIF9feVtfX2ldOworICByZXR1cm4gX190bXA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgdmFsYXJyYXk8X1RwPiAgX1NUTFBfQ0FMTCBvcGVyYXRvciUoY29uc3QgdmFsYXJyYXk8X1RwPiYgX194LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feSkgeworICBfU1RMUF9BU1NFUlQoX194LnNpemUoKSA9PSBfX3kuc2l6ZSgpKQorICB0eXBlZGVmIHR5cGVuYW1lIHZhbGFycmF5PF9UcD46Ol9Ob0luaXQgX05vSW5pdDsKKyAgdmFsYXJyYXk8X1RwPiBfX3RtcChfX3guc2l6ZSgpLCBfTm9Jbml0KCkpOworICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKKyAgICBfX3RtcFtfX2ldID0gX194W19faV0gJSBfX3lbX19pXTsKKyAgcmV0dXJuIF9fdG1wOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIHZhbGFycmF5PF9UcD4gIF9TVExQX0NBTEwgb3BlcmF0b3IrKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWxhcnJheTxfVHA+JiBfX3kpIHsKKyAgX1NUTFBfQVNTRVJUKF9feC5zaXplKCkgPT0gX195LnNpemUoKSkKKyAgdHlwZWRlZiB0eXBlbmFtZSB2YWxhcnJheTxfVHA+OjpfTm9Jbml0IF9Ob0luaXQ7CisgIHZhbGFycmF5PF9UcD4gX190bXAoX194LnNpemUoKSwgX05vSW5pdCgpKTsKKyAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCisgICAgX190bXBbX19pXSA9IF9feFtfX2ldICsgX195W19faV07CisgIHJldHVybiBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSB2YWxhcnJheTxfVHA+ICBfU1RMUF9DQUxMIG9wZXJhdG9yLShjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsYXJyYXk8X1RwPiYgX195KSB7CisgIF9TVExQX0FTU0VSVChfX3guc2l6ZSgpID09IF9feS5zaXplKCkpCisgIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OworICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSBfX3hbX19pXSAtIF9feVtfX2ldOworICByZXR1cm4gX190bXA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgdmFsYXJyYXk8X1RwPiBfU1RMUF9DQUxMIG9wZXJhdG9yXihjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWxhcnJheTxfVHA+JiBfX3kpIHsKKyAgX1NUTFBfQVNTRVJUKF9feC5zaXplKCkgPT0gX195LnNpemUoKSkKKyAgdHlwZWRlZiB0eXBlbmFtZSB2YWxhcnJheTxfVHA+OjpfTm9Jbml0IF9Ob0luaXQ7CisgIHZhbGFycmF5PF9UcD4gX190bXAoX194LnNpemUoKSwgX05vSW5pdCgpKTsKKyAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCisgICAgX190bXBbX19pXSA9IF9feFtfX2ldIF4gX195W19faV07CisgIHJldHVybiBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSB2YWxhcnJheTxfVHA+IF9TVExQX0NBTEwgb3BlcmF0b3ImKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feSkgeworICBfU1RMUF9BU1NFUlQoX194LnNpemUoKSA9PSBfX3kuc2l6ZSgpKQorICB0eXBlZGVmIHR5cGVuYW1lIHZhbGFycmF5PF9UcD46Ol9Ob0luaXQgX05vSW5pdDsKKyAgdmFsYXJyYXk8X1RwPiBfX3RtcChfX3guc2l6ZSgpLCBfTm9Jbml0KCkpOworICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKKyAgICBfX3RtcFtfX2ldID0gX194W19faV0gJiBfX3lbX19pXTsKKyAgcmV0dXJuIF9fdG1wOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIHZhbGFycmF5PF9UcD4gX1NUTFBfQ0FMTCBvcGVyYXRvcnwoY29uc3QgdmFsYXJyYXk8X1RwPiYgX194LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsYXJyYXk8X1RwPiYgX195KSB7CisgIF9TVExQX0FTU0VSVChfX3guc2l6ZSgpID09IF9feS5zaXplKCkpCisgIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OworICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSBfX3hbX19pXSB8IF9feVtfX2ldOworICByZXR1cm4gX190bXA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgdmFsYXJyYXk8X1RwPiBfU1RMUF9DQUxMIG9wZXJhdG9yPDwoY29uc3QgdmFsYXJyYXk8X1RwPiYgX194LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feSkgeworICBfU1RMUF9BU1NFUlQoX194LnNpemUoKSA9PSBfX3kuc2l6ZSgpKQorICB0eXBlZGVmIHR5cGVuYW1lIHZhbGFycmF5PF9UcD46Ol9Ob0luaXQgX05vSW5pdDsKKyAgdmFsYXJyYXk8X1RwPiBfX3RtcChfX3guc2l6ZSgpLCBfTm9Jbml0KCkpOworICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKKyAgICBfX3RtcFtfX2ldID0gX194W19faV0gPDwgX195W19faV07CisgIHJldHVybiBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSB2YWxhcnJheTxfVHA+IF9TVExQX0NBTEwgb3BlcmF0b3I+Pihjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsYXJyYXk8X1RwPiYgX195KSB7CisgIF9TVExQX0FTU0VSVChfX3guc2l6ZSgpID09IF9feS5zaXplKCkpCisgIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OworICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSBfX3hbX19pXSA+PiBfX3lbX19pXTsKKyAgcmV0dXJuIF9fdG1wOworfQorCisvLyBCaW5hcnkgYXJpdGhtZXRpYyBvcGVyYXRpb25zIGJldHdlZW4gYW4gYXJyYXkgYW5kIGEgc2NhbGFyLgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIHZhbGFycmF5PF9UcD4gX1NUTFBfQ0FMTCBvcGVyYXRvciooY29uc3QgdmFsYXJyYXk8X1RwPiYgX194LCBjb25zdCBfVHAmIF9fYykgeworICB0eXBlZGVmIHR5cGVuYW1lIHZhbGFycmF5PF9UcD46Ol9Ob0luaXQgX05vSW5pdDsKKyAgdmFsYXJyYXk8X1RwPiBfX3RtcChfX3guc2l6ZSgpLCBfTm9Jbml0KCkpOworICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKKyAgICBfX3RtcFtfX2ldID0gX194W19faV0gICogX19jOworICByZXR1cm4gX190bXA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgdmFsYXJyYXk8X1RwPiBfU1RMUF9DQUxMIG9wZXJhdG9yKihjb25zdCBfVHAmIF9fYywgY29uc3QgdmFsYXJyYXk8X1RwPiYgX194KSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OworICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSBfX2MgKiBfX3hbX19pXTsKKyAgcmV0dXJuIF9fdG1wOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIHZhbGFycmF5PF9UcD4gX1NUTFBfQ0FMTCBvcGVyYXRvci8oY29uc3QgdmFsYXJyYXk8X1RwPiYgX194LCBjb25zdCBfVHAmIF9fYykgeworICB0eXBlZGVmIHR5cGVuYW1lIHZhbGFycmF5PF9UcD46Ol9Ob0luaXQgX05vSW5pdDsKKyAgdmFsYXJyYXk8X1RwPiBfX3RtcChfX3guc2l6ZSgpLCBfTm9Jbml0KCkpOworICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKKyAgICBfX3RtcFtfX2ldID0gX194W19faV0gIC8gX19jOworICByZXR1cm4gX190bXA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgdmFsYXJyYXk8X1RwPiBfU1RMUF9DQUxMIG9wZXJhdG9yLyhjb25zdCBfVHAmIF9fYywgY29uc3QgdmFsYXJyYXk8X1RwPiYgX194KSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OworICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSBfX2MgLyBfX3hbX19pXTsKKyAgcmV0dXJuIF9fdG1wOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIHZhbGFycmF5PF9UcD4gX1NUTFBfQ0FMTCBvcGVyYXRvciUoY29uc3QgdmFsYXJyYXk8X1RwPiYgX194LCBjb25zdCBfVHAmIF9fYykgeworICB0eXBlZGVmIHR5cGVuYW1lIHZhbGFycmF5PF9UcD46Ol9Ob0luaXQgX05vSW5pdDsKKyAgdmFsYXJyYXk8X1RwPiBfX3RtcChfX3guc2l6ZSgpLCBfTm9Jbml0KCkpOworICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKKyAgICBfX3RtcFtfX2ldID0gX194W19faV0gICUgX19jOworICByZXR1cm4gX190bXA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgdmFsYXJyYXk8X1RwPiBfU1RMUF9DQUxMIG9wZXJhdG9yJShjb25zdCBfVHAmIF9fYywgY29uc3QgdmFsYXJyYXk8X1RwPiYgX194KSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OworICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSBfX2MgJSBfX3hbX19pXTsKKyAgcmV0dXJuIF9fdG1wOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIHZhbGFycmF5PF9UcD4gX1NUTFBfQ0FMTCBvcGVyYXRvcisoY29uc3QgdmFsYXJyYXk8X1RwPiYgX194LCBjb25zdCBfVHAmIF9fYykgeworICB0eXBlZGVmIHR5cGVuYW1lIHZhbGFycmF5PF9UcD46Ol9Ob0luaXQgX05vSW5pdDsKKyAgdmFsYXJyYXk8X1RwPiBfX3RtcChfX3guc2l6ZSgpLCBfTm9Jbml0KCkpOworICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKKyAgICBfX3RtcFtfX2ldID0gX194W19faV0gICsgX19jOworICByZXR1cm4gX190bXA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgdmFsYXJyYXk8X1RwPiBfU1RMUF9DQUxMIG9wZXJhdG9yKyhjb25zdCBfVHAmIF9fYywgY29uc3QgdmFsYXJyYXk8X1RwPiYgX194KSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OworICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSBfX2MgKyBfX3hbX19pXTsKKyAgcmV0dXJuIF9fdG1wOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIHZhbGFycmF5PF9UcD4gX1NUTFBfQ0FMTCBvcGVyYXRvci0oY29uc3QgdmFsYXJyYXk8X1RwPiYgX194LCBjb25zdCBfVHAmIF9fYykgeworICB0eXBlZGVmIHR5cGVuYW1lIHZhbGFycmF5PF9UcD46Ol9Ob0luaXQgX05vSW5pdDsKKyAgdmFsYXJyYXk8X1RwPiBfX3RtcChfX3guc2l6ZSgpLCBfTm9Jbml0KCkpOworICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKKyAgICBfX3RtcFtfX2ldID0gX194W19faV0gIC0gX19jOworICByZXR1cm4gX190bXA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgdmFsYXJyYXk8X1RwPiBfU1RMUF9DQUxMIG9wZXJhdG9yLShjb25zdCBfVHAmIF9fYywgY29uc3QgdmFsYXJyYXk8X1RwPiYgX194KSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OworICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSBfX2MgLSBfX3hbX19pXTsKKyAgcmV0dXJuIF9fdG1wOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIHZhbGFycmF5PF9UcD4gX1NUTFBfQ0FMTCBvcGVyYXRvcl4oY29uc3QgdmFsYXJyYXk8X1RwPiYgX194LCBjb25zdCBfVHAmIF9fYykgeworICB0eXBlZGVmIHR5cGVuYW1lIHZhbGFycmF5PF9UcD46Ol9Ob0luaXQgX05vSW5pdDsKKyAgdmFsYXJyYXk8X1RwPiBfX3RtcChfX3guc2l6ZSgpLCBfTm9Jbml0KCkpOworICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKKyAgICBfX3RtcFtfX2ldID0gX194W19faV0gIF4gX19jOworICByZXR1cm4gX190bXA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgdmFsYXJyYXk8X1RwPiBfU1RMUF9DQUxMIG9wZXJhdG9yXihjb25zdCBfVHAmIF9fYywgY29uc3QgdmFsYXJyYXk8X1RwPiYgX194KSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OworICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSBfX2MgXiBfX3hbX19pXTsKKyAgcmV0dXJuIF9fdG1wOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIHZhbGFycmF5PF9UcD4gX1NUTFBfQ0FMTCBvcGVyYXRvciYoY29uc3QgdmFsYXJyYXk8X1RwPiYgX194LCBjb25zdCBfVHAmIF9fYykgeworICB0eXBlZGVmIHR5cGVuYW1lIHZhbGFycmF5PF9UcD46Ol9Ob0luaXQgX05vSW5pdDsKKyAgdmFsYXJyYXk8X1RwPiBfX3RtcChfX3guc2l6ZSgpLCBfTm9Jbml0KCkpOworICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKKyAgICBfX3RtcFtfX2ldID0gX194W19faV0gICYgX19jOworICByZXR1cm4gX190bXA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgdmFsYXJyYXk8X1RwPiBfU1RMUF9DQUxMIG9wZXJhdG9yJihjb25zdCBfVHAmIF9fYywgY29uc3QgdmFsYXJyYXk8X1RwPiYgX194KSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OworICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSBfX2MgJiBfX3hbX19pXTsKKyAgcmV0dXJuIF9fdG1wOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIHZhbGFycmF5PF9UcD4gX1NUTFBfQ0FMTCBvcGVyYXRvcnwoY29uc3QgdmFsYXJyYXk8X1RwPiYgX194LCBjb25zdCBfVHAmIF9fYykgeworICB0eXBlZGVmIHR5cGVuYW1lIHZhbGFycmF5PF9UcD46Ol9Ob0luaXQgX05vSW5pdDsKKyAgdmFsYXJyYXk8X1RwPiBfX3RtcChfX3guc2l6ZSgpLCBfTm9Jbml0KCkpOworICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKKyAgICBfX3RtcFtfX2ldID0gX194W19faV0gIHwgX19jOworICByZXR1cm4gX190bXA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgdmFsYXJyYXk8X1RwPiBfU1RMUF9DQUxMIG9wZXJhdG9yfChjb25zdCBfVHAmIF9fYywgY29uc3QgdmFsYXJyYXk8X1RwPiYgX194KSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OworICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSBfX2MgfCBfX3hbX19pXTsKKyAgcmV0dXJuIF9fdG1wOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIHZhbGFycmF5PF9UcD4gX1NUTFBfQ0FMTCBvcGVyYXRvcjw8KGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCwgY29uc3QgX1RwJiBfX2MpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSB2YWxhcnJheTxfVHA+OjpfTm9Jbml0IF9Ob0luaXQ7CisgIHZhbGFycmF5PF9UcD4gX190bXAoX194LnNpemUoKSwgX05vSW5pdCgpKTsKKyAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCisgICAgX190bXBbX19pXSA9IF9feFtfX2ldICA8PCBfX2M7CisgIHJldHVybiBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSB2YWxhcnJheTxfVHA+IF9TVExQX0NBTEwgb3BlcmF0b3I8PChjb25zdCBfVHAmIF9fYywgY29uc3QgdmFsYXJyYXk8X1RwPiYgX194KSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OworICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSBfX2MgPDwgX194W19faV07CisgIHJldHVybiBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSB2YWxhcnJheTxfVHA+IF9TVExQX0NBTEwgb3BlcmF0b3I+Pihjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gsIGNvbnN0IF9UcCYgX19jKSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OworICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSBfX3hbX19pXSAgPj4gX19jOworICByZXR1cm4gX190bXA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgdmFsYXJyYXk8X1RwPiBfU1RMUF9DQUxMIG9wZXJhdG9yPj4oY29uc3QgX1RwJiBfX2MsIGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCkgeworICB0eXBlZGVmIHR5cGVuYW1lIHZhbGFycmF5PF9UcD46Ol9Ob0luaXQgX05vSW5pdDsKKyAgdmFsYXJyYXk8X1RwPiBfX3RtcChfX3guc2l6ZSgpLCBfTm9Jbml0KCkpOworICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKKyAgICBfX3RtcFtfX2ldID0gX19jID4+IF9feFtfX2ldOworICByZXR1cm4gX190bXA7Cit9CisKKy8vIEJpbmFyeSBsb2dpY2FsIG9wZXJhdGlvbnMgYmV0d2VlbiB0d28gYXJyYXlzLiAgQmVoYXZpb3IgaXMgdW5kZWZpbmVkCisvLyBpZiB0aGUgdHdvIGFycmF5cyBoYXZlIGRpZmZlcmVudCBsZW5ndGhzLiAgTm90ZSB0aGF0IG9wZXJhdG9yPT0gZG9lcworLy8gbm90IGRvIHdoYXQgeW91IG1pZ2h0IGF0IGZpcnN0IGV4cGVjdC4KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfVmFsYXJyYXlfYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yPT0oY29uc3QgdmFsYXJyYXk8X1RwPiYgX194LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWxhcnJheTxfVHA+JiBfX3kpIHsKKyAgX1NUTFBfQVNTRVJUKF9feC5zaXplKCkgPT0gX195LnNpemUoKSkKKyAgX1ZhbGFycmF5X2Jvb2wgX190bXAoX194LnNpemUoKSwgX1ZhbGFycmF5X2Jvb2w6Ol9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSBfX3hbX19pXSA9PSBfX3lbX19pXTsKKyAgcmV0dXJuIF9fdG1wOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIF9WYWxhcnJheV9ib29sIF9TVExQX0NBTEwgb3BlcmF0b3I8KGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWxhcnJheTxfVHA+JiBfX3kpIHsKKyAgX1NUTFBfQVNTRVJUKF9feC5zaXplKCkgPT0gX195LnNpemUoKSkKKyAgX1ZhbGFycmF5X2Jvb2wgX190bXAoX194LnNpemUoKSwgX1ZhbGFycmF5X2Jvb2w6Ol9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSBfX3hbX19pXSA8IF9feVtfX2ldOworICByZXR1cm4gX190bXA7Cit9CisKKyNpZmRlZiBfU1RMUF9VU0VfU0VQQVJBVEVfUkVMT1BTX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIF9WYWxhcnJheV9ib29sIF9TVExQX0NBTEwgb3BlcmF0b3IhPShjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feSkgeworICBfU1RMUF9BU1NFUlQoX194LnNpemUoKSA9PSBfX3kuc2l6ZSgpKQorICBfVmFsYXJyYXlfYm9vbCBfX3RtcChfX3guc2l6ZSgpLCBfVmFsYXJyYXlfYm9vbDo6X05vSW5pdCgpKTsKKyAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCisgICAgX190bXBbX19pXSA9IF9feFtfX2ldICE9IF9feVtfX2ldOworICByZXR1cm4gX190bXA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX1ZhbGFycmF5X2Jvb2wgX1NUTFBfQ0FMTCBvcGVyYXRvcj4oY29uc3QgdmFsYXJyYXk8X1RwPiYgX194LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feSkgeworICBfU1RMUF9BU1NFUlQoX194LnNpemUoKSA9PSBfX3kuc2l6ZSgpKQorICBfVmFsYXJyYXlfYm9vbCBfX3RtcChfX3guc2l6ZSgpLCBfVmFsYXJyYXlfYm9vbDo6X05vSW5pdCgpKTsKKyAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCisgICAgX190bXBbX19pXSA9IF9feFtfX2ldID4gX195W19faV07CisgIHJldHVybiBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfVmFsYXJyYXlfYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yPD0oY29uc3QgdmFsYXJyYXk8X1RwPiYgX194LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWxhcnJheTxfVHA+JiBfX3kpIHsKKyAgX1NUTFBfQVNTRVJUKF9feC5zaXplKCkgPT0gX195LnNpemUoKSkKKyAgX1ZhbGFycmF5X2Jvb2wgX190bXAoX194LnNpemUoKSwgX1ZhbGFycmF5X2Jvb2w6Ol9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSBfX3hbX19pXSA8PSBfX3lbX19pXTsKKyAgcmV0dXJuIF9fdG1wOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIF9WYWxhcnJheV9ib29sIF9TVExQX0NBTEwgb3BlcmF0b3I+PShjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feSkgeworICBfU1RMUF9BU1NFUlQoX194LnNpemUoKSA9PSBfX3kuc2l6ZSgpKQorICBfVmFsYXJyYXlfYm9vbCBfX3RtcChfX3guc2l6ZSgpLCBfVmFsYXJyYXlfYm9vbDo6X05vSW5pdCgpKTsKKyAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCisgICAgX190bXBbX19pXSA9IF9feFtfX2ldID49IF9feVtfX2ldOworICByZXR1cm4gX190bXA7Cit9CisKKyNlbmRpZiAvKiBfU1RMUF9VU0VfU0VQQVJBVEVfUkVMT1BTX05BTUVTUEFDRSAqLworLy8gZmJwIDogc3dhcCA/CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX1ZhbGFycmF5X2Jvb2wgX1NUTFBfQ0FMTCBvcGVyYXRvciYmKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsYXJyYXk8X1RwPiYgX195KSB7CisgIF9TVExQX0FTU0VSVChfX3guc2l6ZSgpID09IF9feS5zaXplKCkpCisgIF9WYWxhcnJheV9ib29sIF9fdG1wKF9feC5zaXplKCksIF9WYWxhcnJheV9ib29sOjpfTm9Jbml0KCkpOworICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKKyAgICBfX3RtcFtfX2ldID0gX194W19faV0gJiYgX195W19faV07CisgIHJldHVybiBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfVmFsYXJyYXlfYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yfHwoY29uc3QgdmFsYXJyYXk8X1RwPiYgX194LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWxhcnJheTxfVHA+JiBfX3kpIHsKKyAgX1NUTFBfQVNTRVJUKF9feC5zaXplKCkgPT0gX195LnNpemUoKSkKKyAgX1ZhbGFycmF5X2Jvb2wgX190bXAoX194LnNpemUoKSwgX1ZhbGFycmF5X2Jvb2w6Ol9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSBfX3hbX19pXSB8fCBfX3lbX19pXTsKKyAgcmV0dXJuIF9fdG1wOworfQorCisvLyBMb2dpY2FsIG9wZXJhdGlvbnMgYmV0d2VlbiBhbiBhcnJheSBhbmQgYSBzY2FsYXIuCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX1ZhbGFycmF5X2Jvb2wgX1NUTFBfQ0FMTCBvcGVyYXRvcj09KGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCwgY29uc3QgX1RwJiBfX2MpIHsKKyAgX1ZhbGFycmF5X2Jvb2wgX190bXAoX194LnNpemUoKSwgX1ZhbGFycmF5X2Jvb2w6Ol9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSBfX3hbX19pXSA9PSBfX2M7CisgIHJldHVybiBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfVmFsYXJyYXlfYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yPT0oY29uc3QgX1RwJiBfX2MsIGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCkgeworICBfVmFsYXJyYXlfYm9vbCBfX3RtcChfX3guc2l6ZSgpLCBfVmFsYXJyYXlfYm9vbDo6X05vSW5pdCgpKTsKKyAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCisgICAgX190bXBbX19pXSA9IF9fYyA9PSBfX3hbX19pXTsKKyAgcmV0dXJuIF9fdG1wOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIF9WYWxhcnJheV9ib29sIF9TVExQX0NBTEwgb3BlcmF0b3IhPShjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gsIGNvbnN0IF9UcCYgX19jKSB7CisgIF9WYWxhcnJheV9ib29sIF9fdG1wKF9feC5zaXplKCksIF9WYWxhcnJheV9ib29sOjpfTm9Jbml0KCkpOworICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKKyAgICBfX3RtcFtfX2ldID0gX194W19faV0gIT0gX19jOworICByZXR1cm4gX190bXA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX1ZhbGFycmF5X2Jvb2wgX1NUTFBfQ0FMTCBvcGVyYXRvciE9KGNvbnN0IF9UcCYgX19jLCBjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gpIHsKKyAgX1ZhbGFycmF5X2Jvb2wgX190bXAoX194LnNpemUoKSwgX1ZhbGFycmF5X2Jvb2w6Ol9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSBfX2MgIT0gX194W19faV07CisgIHJldHVybiBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfVmFsYXJyYXlfYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yPChjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gsIGNvbnN0IF9UcCYgX19jKSB7CisgIF9WYWxhcnJheV9ib29sIF9fdG1wKF9feC5zaXplKCksIF9WYWxhcnJheV9ib29sOjpfTm9Jbml0KCkpOworICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKKyAgICBfX3RtcFtfX2ldID0gX194W19faV0gPCBfX2M7CisgIHJldHVybiBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfVmFsYXJyYXlfYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yPChjb25zdCBfVHAmIF9fYywgY29uc3QgdmFsYXJyYXk8X1RwPiYgX194KSB7CisgIF9WYWxhcnJheV9ib29sIF9fdG1wKF9feC5zaXplKCksIF9WYWxhcnJheV9ib29sOjpfTm9Jbml0KCkpOworICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKKyAgICBfX3RtcFtfX2ldID0gX19jIDwgX194W19faV07CisgIHJldHVybiBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfVmFsYXJyYXlfYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yPihjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gsIGNvbnN0IF9UcCYgX19jKSB7CisgIF9WYWxhcnJheV9ib29sIF9fdG1wKF9feC5zaXplKCksIF9WYWxhcnJheV9ib29sOjpfTm9Jbml0KCkpOworICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKKyAgICBfX3RtcFtfX2ldID0gX194W19faV0gPiBfX2M7CisgIHJldHVybiBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfVmFsYXJyYXlfYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yPihjb25zdCBfVHAmIF9fYywgY29uc3QgdmFsYXJyYXk8X1RwPiYgX194KSB7CisgIF9WYWxhcnJheV9ib29sIF9fdG1wKF9feC5zaXplKCksIF9WYWxhcnJheV9ib29sOjpfTm9Jbml0KCkpOworICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKKyAgICBfX3RtcFtfX2ldID0gX19jID4gX194W19faV07CisgIHJldHVybiBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfVmFsYXJyYXlfYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yPD0oY29uc3QgdmFsYXJyYXk8X1RwPiYgX194LCBjb25zdCBfVHAmIF9fYykgeworICBfVmFsYXJyYXlfYm9vbCBfX3RtcChfX3guc2l6ZSgpLCBfVmFsYXJyYXlfYm9vbDo6X05vSW5pdCgpKTsKKyAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCisgICAgX190bXBbX19pXSA9IF9feFtfX2ldICA8PSBfX2M7CisgIHJldHVybiBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfVmFsYXJyYXlfYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yPD0oY29uc3QgX1RwJiBfX2MsIGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCkgeworICBfVmFsYXJyYXlfYm9vbCBfX3RtcChfX3guc2l6ZSgpLCBfVmFsYXJyYXlfYm9vbDo6X05vSW5pdCgpKTsKKyAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCisgICAgX190bXBbX19pXSA9IF9fYyA8PSBfX3hbX19pXTsKKyAgcmV0dXJuIF9fdG1wOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIF9WYWxhcnJheV9ib29sIF9TVExQX0NBTEwgb3BlcmF0b3I+PShjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gsIGNvbnN0IF9UcCYgX19jKSB7CisgIF9WYWxhcnJheV9ib29sIF9fdG1wKF9feC5zaXplKCksIF9WYWxhcnJheV9ib29sOjpfTm9Jbml0KCkpOworICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKKyAgICBfX3RtcFtfX2ldID0gX194W19faV0gPj0gX19jOworICByZXR1cm4gX190bXA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX1ZhbGFycmF5X2Jvb2wgX1NUTFBfQ0FMTCBvcGVyYXRvcj49KGNvbnN0IF9UcCYgX19jLCBjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gpIHsKKyAgX1ZhbGFycmF5X2Jvb2wgX190bXAoX194LnNpemUoKSwgX1ZhbGFycmF5X2Jvb2w6Ol9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSBfX2MgPj0gX194W19faV07CisgIHJldHVybiBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfVmFsYXJyYXlfYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yJiYoY29uc3QgdmFsYXJyYXk8X1RwPiYgX194LCBjb25zdCBfVHAmIF9fYykgeworICBfVmFsYXJyYXlfYm9vbCBfX3RtcChfX3guc2l6ZSgpLCBfVmFsYXJyYXlfYm9vbDo6X05vSW5pdCgpKTsKKyAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCisgICAgX190bXBbX19pXSA9IF9feFtfX2ldICYmIF9fYzsKKyAgcmV0dXJuIF9fdG1wOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIF9WYWxhcnJheV9ib29sIF9TVExQX0NBTEwgb3BlcmF0b3ImJihjb25zdCBfVHAmIF9fYywgY29uc3QgdmFsYXJyYXk8X1RwPiYgX194KSB7CisgIF9WYWxhcnJheV9ib29sIF9fdG1wKF9feC5zaXplKCksIF9WYWxhcnJheV9ib29sOjpfTm9Jbml0KCkpOworICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKKyAgICBfX3RtcFtfX2ldID0gX19jICYmIF9feFtfX2ldOworICByZXR1cm4gX190bXA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX1ZhbGFycmF5X2Jvb2wgX1NUTFBfQ0FMTCBvcGVyYXRvcnx8KGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCwgY29uc3QgX1RwJiBfX2MpIHsKKyAgX1ZhbGFycmF5X2Jvb2wgX190bXAoX194LnNpemUoKSwgX1ZhbGFycmF5X2Jvb2w6Ol9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSBfX3hbX19pXSB8fCBfX2M7CisgIHJldHVybiBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfVmFsYXJyYXlfYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yfHwoY29uc3QgX1RwJiBfX2MsIGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCkgeworICBfVmFsYXJyYXlfYm9vbCBfX3RtcChfX3guc2l6ZSgpLCBfVmFsYXJyYXlfYm9vbDo6X05vSW5pdCgpKTsKKyAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCisgICAgX190bXBbX19pXSA9IF9fYyB8fCBfX3hbX19pXTsKKyAgcmV0dXJuIF9fdG1wOworfQorCisvLyB2YWxhcnJheSAidHJhbnNjZW5kZW50YWxzIiAodGhlIGxpc3QgaW5jbHVkZXMgYWJzIGFuZCBzcXJ0LCB3aGljaCwKKy8vIG9mIGNvdXJzZSwgYXJlIG5vdCB0cmFuc2NlbmRlbnRhbCkuCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgdmFsYXJyYXk8X1RwPiBhYnMoY29uc3QgdmFsYXJyYXk8X1RwPiYgX194KSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OworICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSA6OmFicyhfX3hbX19pXSk7CisgIHJldHVybiBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSB2YWxhcnJheTxfVHA+IGFjb3MoY29uc3QgdmFsYXJyYXk8X1RwPiYgX194KSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OworICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSA6OmFjb3MoX194W19faV0pOworICByZXR1cm4gX190bXA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgdmFsYXJyYXk8X1RwPiBhc2luKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCkgeworICB0eXBlZGVmIHR5cGVuYW1lIHZhbGFycmF5PF9UcD46Ol9Ob0luaXQgX05vSW5pdDsKKyAgdmFsYXJyYXk8X1RwPiBfX3RtcChfX3guc2l6ZSgpLCBfTm9Jbml0KCkpOworICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKKyAgICBfX3RtcFtfX2ldID0gOjphc2luKF9feFtfX2ldKTsKKyAgcmV0dXJuIF9fdG1wOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIHZhbGFycmF5PF9UcD4gYXRhbihjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSB2YWxhcnJheTxfVHA+OjpfTm9Jbml0IF9Ob0luaXQ7CisgIHZhbGFycmF5PF9UcD4gX190bXAoX194LnNpemUoKSwgX05vSW5pdCgpKTsKKyAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCisgICAgX190bXBbX19pXSA9IDo6YXRhbihfX3hbX19pXSk7CisgIHJldHVybiBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSB2YWxhcnJheTxfVHA+IGF0YW4yKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feSkgeworICB0eXBlZGVmIHR5cGVuYW1lIHZhbGFycmF5PF9UcD46Ol9Ob0luaXQgX05vSW5pdDsKKyAgdmFsYXJyYXk8X1RwPiBfX3RtcChfX3guc2l6ZSgpLCBfTm9Jbml0KCkpOworICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKKyAgICBfX3RtcFtfX2ldID0gOjphdGFuMihfX3hbX19pXSwgX195W19faV0pOworICByZXR1cm4gX190bXA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgdmFsYXJyYXk8X1RwPiBhdGFuMihjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gsIGNvbnN0IF9UcCYgX19jKSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OworICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSA6OmF0YW4yKF9feFtfX2ldLCBfX2MpOworICByZXR1cm4gX190bXA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgdmFsYXJyYXk8X1RwPiBhdGFuMihjb25zdCBfVHAmIF9fYywgY29uc3QgdmFsYXJyYXk8X1RwPiYgX194KSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OworICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSA6OmF0YW4yKF9fYywgX194W19faV0pOworICByZXR1cm4gX190bXA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgdmFsYXJyYXk8X1RwPiBjb3MoY29uc3QgdmFsYXJyYXk8X1RwPiYgX194KSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OworICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSA6OmNvcyhfX3hbX19pXSk7CisgIHJldHVybiBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSB2YWxhcnJheTxfVHA+IGNvc2goY29uc3QgdmFsYXJyYXk8X1RwPiYgX194KSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OworICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSA6OmNvc2goX194W19faV0pOworICByZXR1cm4gX190bXA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgdmFsYXJyYXk8X1RwPiBleHAoY29uc3QgdmFsYXJyYXk8X1RwPiYgX194KSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OworICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSA6OmV4cChfX3hbX19pXSk7CisgIHJldHVybiBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSB2YWxhcnJheTxfVHA+IGxvZyhjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSB2YWxhcnJheTxfVHA+OjpfTm9Jbml0IF9Ob0luaXQ7CisgIHZhbGFycmF5PF9UcD4gX190bXAoX194LnNpemUoKSwgX05vSW5pdCgpKTsKKyAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCisgICAgX190bXBbX19pXSA9IDo6bG9nKF9feFtfX2ldKTsKKyAgcmV0dXJuIF9fdG1wOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIHZhbGFycmF5PF9UcD4gbG9nMTAoY29uc3QgdmFsYXJyYXk8X1RwPiYgX194KSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OworICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSA6OmxvZzEwKF9feFtfX2ldKTsKKyAgcmV0dXJuIF9fdG1wOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIHZhbGFycmF5PF9UcD4gcG93KGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWxhcnJheTxfVHA+JiBfX3kpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSB2YWxhcnJheTxfVHA+OjpfTm9Jbml0IF9Ob0luaXQ7CisgIHZhbGFycmF5PF9UcD4gX190bXAoX194LnNpemUoKSwgX05vSW5pdCgpKTsKKyAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCisgICAgX190bXBbX19pXSA9IDo6cG93KF9feFtfX2ldLCBfX3lbX19pXSk7CisgIHJldHVybiBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSB2YWxhcnJheTxfVHA+IHBvdyhjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gsIGNvbnN0IF9UcCYgX19jKSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OworICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSA6OnBvdyhfX3hbX19pXSwgX19jKTsKKyAgcmV0dXJuIF9fdG1wOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIHZhbGFycmF5PF9UcD4gcG93KGNvbnN0IF9UcCYgX19jLCBjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSB2YWxhcnJheTxfVHA+OjpfTm9Jbml0IF9Ob0luaXQ7CisgIHZhbGFycmF5PF9UcD4gX190bXAoX194LnNpemUoKSwgX05vSW5pdCgpKTsKKyAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCisgICAgX190bXBbX19pXSA9IDo6cG93KF9fYywgX194W19faV0pOworICByZXR1cm4gX190bXA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgdmFsYXJyYXk8X1RwPiBzaW4oY29uc3QgdmFsYXJyYXk8X1RwPiYgX194KSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OworICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSA6OnNpbihfX3hbX19pXSk7CisgIHJldHVybiBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSB2YWxhcnJheTxfVHA+IHNpbmgoY29uc3QgdmFsYXJyYXk8X1RwPiYgX194KSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OworICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSA6OnNpbmgoX194W19faV0pOworICByZXR1cm4gX190bXA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgdmFsYXJyYXk8X1RwPiBzcXJ0KGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCkgeworICB0eXBlZGVmIHR5cGVuYW1lIHZhbGFycmF5PF9UcD46Ol9Ob0luaXQgX05vSW5pdDsKKyAgdmFsYXJyYXk8X1RwPiBfX3RtcChfX3guc2l6ZSgpLCBfTm9Jbml0KCkpOworICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKKyAgICBfX3RtcFtfX2ldID0gOjpzcXJ0KF9feFtfX2ldKTsKKyAgcmV0dXJuIF9fdG1wOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIHZhbGFycmF5PF9UcD4gdGFuKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCkgeworICB0eXBlZGVmIHR5cGVuYW1lIHZhbGFycmF5PF9UcD46Ol9Ob0luaXQgX05vSW5pdDsKKyAgdmFsYXJyYXk8X1RwPiBfX3RtcChfX3guc2l6ZSgpLCBfTm9Jbml0KCkpOworICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKKyAgICBfX3RtcFtfX2ldID0gOjp0YW4oX194W19faV0pOworICByZXR1cm4gX190bXA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgdmFsYXJyYXk8X1RwPiB0YW5oKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCkgeworICB0eXBlZGVmIHR5cGVuYW1lIHZhbGFycmF5PF9UcD46Ol9Ob0luaXQgX05vSW5pdDsKKyAgdmFsYXJyYXk8X1RwPiBfX3RtcChfX3guc2l6ZSgpLCBfTm9Jbml0KCkpOworICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKKyAgICBfX3RtcFtfX2ldID0gOjp0YW5oKF9feFtfX2ldKTsKKyAgcmV0dXJuIF9fdG1wOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHNsaWNlIGFuZCBzbGljZV9hcnJheQorCitjbGFzcyBzbGljZSB7CitwdWJsaWM6CisgIHNsaWNlKCkgOiBfTV9zdGFydCgwKSwgX01fbGVuZ3RoKDApLCBfTV9zdHJpZGUoMCkge30KKyAgc2xpY2Uoc2l6ZV90IF9fc3RhcnQsIHNpemVfdCBfX2xlbmd0aCwgc2l6ZV90IF9fc3RyaWRlKQorICAgIDogX01fc3RhcnQoX19zdGFydCksIF9NX2xlbmd0aChfX2xlbmd0aCksIF9NX3N0cmlkZShfX3N0cmlkZSkKKyAgICB7fQorICBfX1RSSVZJQUxfREVTVFJVQ1RPUihzbGljZSkKKworICBzaXplX3Qgc3RhcnQoKSAgY29uc3QgeyByZXR1cm4gX01fc3RhcnQ7IH0KKyAgc2l6ZV90IHNpemUoKSAgIGNvbnN0IHsgcmV0dXJuIF9NX2xlbmd0aDsgfQorICBzaXplX3Qgc3RyaWRlKCkgY29uc3QgeyByZXR1cm4gX01fc3RyaWRlOyB9CisKK3ByaXZhdGU6CisgIHNpemVfdCBfTV9zdGFydDsKKyAgc2l6ZV90IF9NX2xlbmd0aDsKKyAgc2l6ZV90IF9NX3N0cmlkZTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitjbGFzcyBzbGljZV9hcnJheSB7CisgIGZyaWVuZCBjbGFzcyB2YWxhcnJheTxfVHA+OworcHVibGljOgorICB0eXBlZGVmIF9UcCB2YWx1ZV90eXBlOworCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHZhbGFycmF5PHZhbHVlX3R5cGU+JiBfX3gpIGNvbnN0IHsKKyAgICBzaXplX3QgX19pbmRleCA9IF9NX3NsaWNlLnN0YXJ0KCk7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsKKyAgICAgICAgIF9faSA8IF9NX3NsaWNlLnNpemUoKTsKKyAgICAgICAgICsrX19pLCBfX2luZGV4ICs9IF9NX3NsaWNlLnN0cmlkZSgpKQorICAgICAgX01fYXJyYXlbX19pbmRleF0gPSBfX3hbX19pXTsKKyAgfQorCisgIHZvaWQgb3BlcmF0b3IqPShjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgX194KSBjb25zdCB7CisgICAgc2l6ZV90IF9faW5kZXggPSBfTV9zbGljZS5zdGFydCgpOworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7CisgICAgICAgICBfX2kgPCBfTV9zbGljZS5zaXplKCk7CisgICAgICAgICArK19faSwgX19pbmRleCArPSBfTV9zbGljZS5zdHJpZGUoKSkKKyAgICAgIF9NX2FycmF5W19faW5kZXhdICo9IF9feFtfX2ldOworICB9CisKKyAgdm9pZCBvcGVyYXRvci89KGNvbnN0IHZhbGFycmF5PHZhbHVlX3R5cGU+JiBfX3gpIGNvbnN0IHsKKyAgICBzaXplX3QgX19pbmRleCA9IF9NX3NsaWNlLnN0YXJ0KCk7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsKKyAgICAgICAgIF9faSA8IF9NX3NsaWNlLnNpemUoKTsKKyAgICAgICAgICsrX19pLCBfX2luZGV4ICs9IF9NX3NsaWNlLnN0cmlkZSgpKQorICAgICAgX01fYXJyYXlbX19pbmRleF0gLz0gX194W19faV07CisgIH0KKworICB2b2lkIG9wZXJhdG9yJT0oY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIF9feCkgY29uc3QgeworICAgIHNpemVfdCBfX2luZGV4ID0gX01fc2xpY2Uuc3RhcnQoKTsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOworICAgICAgICAgX19pIDwgX01fc2xpY2Uuc2l6ZSgpOworICAgICAgICAgKytfX2ksIF9faW5kZXggKz0gX01fc2xpY2Uuc3RyaWRlKCkpCisgICAgICBfTV9hcnJheVtfX2luZGV4XSAlPSBfX3hbX19pXTsKKyAgfQorCisgIHZvaWQgb3BlcmF0b3IrPShjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgX194KSBjb25zdCB7CisgICAgc2l6ZV90IF9faW5kZXggPSBfTV9zbGljZS5zdGFydCgpOworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7CisgICAgICAgICBfX2kgPCBfTV9zbGljZS5zaXplKCk7CisgICAgICAgICArK19faSwgX19pbmRleCArPSBfTV9zbGljZS5zdHJpZGUoKSkKKyAgICAgIF9NX2FycmF5W19faW5kZXhdICs9IF9feFtfX2ldOworICB9CisKKyAgdm9pZCBvcGVyYXRvci09KGNvbnN0IHZhbGFycmF5PHZhbHVlX3R5cGU+JiBfX3gpIGNvbnN0IHsKKyAgICBzaXplX3QgX19pbmRleCA9IF9NX3NsaWNlLnN0YXJ0KCk7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsKKyAgICAgICAgIF9faSA8IF9NX3NsaWNlLnNpemUoKTsKKyAgICAgICAgICsrX19pLCBfX2luZGV4ICs9IF9NX3NsaWNlLnN0cmlkZSgpKQorICAgICAgX01fYXJyYXlbX19pbmRleF0gLT0gX194W19faV07CisgIH0KKworICB2b2lkIG9wZXJhdG9yXj0oY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIF9feCkgY29uc3QgeworICAgIHNpemVfdCBfX2luZGV4ID0gX01fc2xpY2Uuc3RhcnQoKTsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOworICAgICAgICAgX19pIDwgX01fc2xpY2Uuc2l6ZSgpOworICAgICAgICAgKytfX2ksIF9faW5kZXggKz0gX01fc2xpY2Uuc3RyaWRlKCkpCisgICAgICBfTV9hcnJheVtfX2luZGV4XSBePSBfX3hbX19pXTsKKyAgfQorCisgIHZvaWQgb3BlcmF0b3ImPShjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgX194KSBjb25zdCB7CisgICAgc2l6ZV90IF9faW5kZXggPSBfTV9zbGljZS5zdGFydCgpOworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7CisgICAgICAgICBfX2kgPCBfTV9zbGljZS5zaXplKCk7CisgICAgICAgICArK19faSwgX19pbmRleCArPSBfTV9zbGljZS5zdHJpZGUoKSkKKyAgICAgIF9NX2FycmF5W19faW5kZXhdICY9IF9feFtfX2ldOworICB9CisKKyAgdm9pZCBvcGVyYXRvcnw9KGNvbnN0IHZhbGFycmF5PHZhbHVlX3R5cGU+JiBfX3gpIGNvbnN0IHsKKyAgICBzaXplX3QgX19pbmRleCA9IF9NX3NsaWNlLnN0YXJ0KCk7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsKKyAgICAgICAgIF9faSA8IF9NX3NsaWNlLnNpemUoKTsKKyAgICAgICAgICsrX19pLCBfX2luZGV4ICs9IF9NX3NsaWNlLnN0cmlkZSgpKQorICAgICAgX01fYXJyYXlbX19pbmRleF0gfD0gX194W19faV07CisgIH0KKworICB2b2lkIG9wZXJhdG9yPDw9KGNvbnN0IHZhbGFycmF5PHZhbHVlX3R5cGU+JiBfX3gpIGNvbnN0IHsKKyAgICBzaXplX3QgX19pbmRleCA9IF9NX3NsaWNlLnN0YXJ0KCk7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsKKyAgICAgICAgIF9faSA8IF9NX3NsaWNlLnNpemUoKTsKKyAgICAgICAgICsrX19pLCBfX2luZGV4ICs9IF9NX3NsaWNlLnN0cmlkZSgpKQorICAgICAgX01fYXJyYXlbX19pbmRleF0gPDw9IF9feFtfX2ldOworICB9CisKKyAgdm9pZCBvcGVyYXRvcj4+PShjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgX194KSBjb25zdCB7CisgICAgc2l6ZV90IF9faW5kZXggPSBfTV9zbGljZS5zdGFydCgpOworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7CisgICAgICAgICBfX2kgPCBfTV9zbGljZS5zaXplKCk7CisgICAgICAgICArK19faSwgX19pbmRleCArPSBfTV9zbGljZS5zdHJpZGUoKSkKKyAgICAgIF9NX2FycmF5W19faW5kZXhdID4+PSBfX3hbX19pXTsKKyAgfQorCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHZhbHVlX3R5cGUmIF9fYykgLypjb25zdCBjb3VsZCBiZSBjb25zdCBidXQgc3RhbmRhcmQgc2F5cyBOTyAoMjYuMy41LjQtMSkqLyB7CisgICAgc2l6ZV90IF9faW5kZXggPSBfTV9zbGljZS5zdGFydCgpOworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7CisgICAgICAgICBfX2kgPCBfTV9zbGljZS5zaXplKCk7CisgICAgICAgICArK19faSwgX19pbmRleCArPSBfTV9zbGljZS5zdHJpZGUoKSkKKyAgICAgIF9NX2FycmF5W19faW5kZXhdID0gX19jOworICB9CisKKyAgLy8gQysrIFN0YW5kYXJkIGRlZmVjdCAyNTMsIGNvcHkgY29uc3RydWN0b3IgbXVzdCBiZSBwdWJsaWMuCisgIHNsaWNlX2FycmF5KGNvbnN0IHNsaWNlX2FycmF5ICZfX3gpCisgICAgOiBfTV9zbGljZShfX3guX01fc2xpY2UpLCBfTV9hcnJheShfX3guX01fYXJyYXkpCisgICAge30KKworICB+c2xpY2VfYXJyYXkoKSB7fQorCitwcml2YXRlOgorICBzbGljZV9hcnJheShjb25zdCBzbGljZSYgX19zbGljZSwgdmFsYXJyYXk8X1RwPiAmX19hcnJheSkKKyAgICA6IF9NX3NsaWNlKF9fc2xpY2UpLCBfTV9hcnJheShfX2FycmF5KQorICAgIHt9CisKKyAgc2xpY2UgICAgICAgICAgX01fc2xpY2U7CisgIHZhbGFycmF5PF9UcD4mIF9NX2FycmF5OworCitwcml2YXRlOgorICAvLyBEaXNhYmxlIGRlZmF1bHQgY29uc3RydWN0b3IgYW5kIGFzc2lnbm1lbnQKKyAgc2xpY2VfYXJyYXkoKTsKKyAgc2xpY2VfYXJyYXkmIG9wZXJhdG9yPShjb25zdCBzbGljZV9hcnJheSYpOworfTsKKworLy8gdmFsYXJyYXkgbWVtYmVyIGZ1bmN0aW9ucyBkZWFsaW5nIHdpdGggc2xpY2UgYW5kIHNsaWNlX2FycmF5CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgdmFsYXJyYXk8X1RwPjo6dmFsYXJyYXkoY29uc3Qgc2xpY2VfYXJyYXk8X1RwPiYgX194KQorICA6IF9WYWxhcnJheV9iYXNlPF9UcD4oX194Ll9NX3NsaWNlLnNpemUoKSkgeworICB0eXBlZGVmIHR5cGVuYW1lIF9fdHlwZV90cmFpdHM8X1RwPjo6aGFzX3RyaXZpYWxfZGVmYXVsdF9jb25zdHJ1Y3RvcgorICAgICAgICAgIF9Jc19Ucml2aWFsOworICBfTV9pbml0aWFsaXplKF9Jc19Ucml2aWFsKCkpOworICAqdGhpcyA9IF9feDsKK30KKworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIHNsaWNlX2FycmF5PF9UcD4gdmFsYXJyYXk8X1RwPjo6b3BlcmF0b3JbXShzbGljZSBfX3NsaWNlKQoreyByZXR1cm4gc2xpY2VfYXJyYXk8X1RwPihfX3NsaWNlLCAqdGhpcyk7IH0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBnc2xpY2UgYW5kIGdzbGljZV9hcnJheQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1NpemU+CitzdHJ1Y3QgX0dzbGljZV9JdGVyX3RtcGw7CisKK2NsYXNzIGdzbGljZSB7CisgIGZyaWVuZCBzdHJ1Y3QgX0dzbGljZV9JdGVyX3RtcGw8c2l6ZV90PjsKK3B1YmxpYzoKKyAgZ3NsaWNlKCkgOiBfTV9zdGFydCgwKSwgX01fbGVuZ3RocygpLCBfTV9zdHJpZGVzKCkge30KKyAgZ3NsaWNlKHNpemVfdCBfX3N0YXJ0LAorICAgICAgICAgY29uc3QgX1ZhbGFycmF5X3NpemVfdCYgX19sZW5ndGhzLCBjb25zdCBfVmFsYXJyYXlfc2l6ZV90JiBfX3N0cmlkZXMpCisgICAgOiBfTV9zdGFydChfX3N0YXJ0KSwgX01fbGVuZ3RocyhfX2xlbmd0aHMpLCBfTV9zdHJpZGVzKF9fc3RyaWRlcykKKyAgICB7fQorICBfX1RSSVZJQUxfREVTVFJVQ1RPUihnc2xpY2UpCisKKyAgc2l6ZV90IHN0YXJ0KCkgICAgICAgICAgICBjb25zdCB7IHJldHVybiBfTV9zdGFydDsgfQorICBfVmFsYXJyYXlfc2l6ZV90IHNpemUoKSAgIGNvbnN0IHsgcmV0dXJuIF9NX2xlbmd0aHM7IH0KKyAgX1ZhbGFycmF5X3NpemVfdCBzdHJpZGUoKSBjb25zdCB7IHJldHVybiBfTV9zdHJpZGVzOyB9CisKKyAgLy8gRXh0ZW5zaW9uOiBjaGVjayBmb3IgYW4gZW1wdHkgZ3NsaWNlLgorICBib29sIF9NX2VtcHR5KCkgY29uc3QgeyByZXR1cm4gX01fbGVuZ3Rocy5zaXplKCkgPT0gMDsgfQorCisgIC8vIEV4dGVuc2lvbjogbnVtYmVyIG9mIGluZGljZXMgdGhpcyBnc2xpY2UgcmVwcmVzZW50cy4gIChGb3IgYSBkZWdlbmVyYXRlCisgIC8vIGdzbGljZSwgdGhleSdyZSBub3QgbmVjZXNzYXJpbHkgYWxsIGRpc3RpbmN0LikKKyAgc2l6ZV90IF9NX3NpemUoKSBjb25zdCB7CisgICAgcmV0dXJuICF0aGlzLT5fTV9lbXB0eSgpCisgICAgICA/IGFjY3VtdWxhdGUoX01fbGVuZ3Rocy5fTV9maXJzdCArIDEsCisgICAgICAgICAgICAgICAgICAgX01fbGVuZ3Rocy5fTV9maXJzdCArIF9NX2xlbmd0aHMuX01fc2l6ZSwKKyAgICAgICAgICAgICAgICAgICBfTV9sZW5ndGhzWzBdLAorICAgICAgICAgICAgICAgICAgIG11bHRpcGxpZXM8c2l6ZV90PigpKQorICAgICAgOiAwOworICB9CisKKyMgaWZuZGVmIF9fSFBfYUNDCitwcml2YXRlOgorIyBlbmRpZgorCisgIHNpemVfdCBfTV9zdGFydDsKKyAgX1ZhbGFycmF5X3NpemVfdCBfTV9sZW5ndGhzOworICBfVmFsYXJyYXlfc2l6ZV90IF9NX3N0cmlkZXM7Cit9OworCisvLyBUaGlzIGlzIG5vdCBhbiBTVEwgaXRlcmF0b3IuICBJdCBpcyBjb25zdHJ1Y3RlZCBmcm9tIGEgZ3NsaWNlLCBhbmQgaXQKKy8vIHN0ZXBzIHRocm91Z2ggdGhlIGdzbGljZSBpbmRpY2VzIGluIHNlcXVlbmNlLiAgU2VlIDIzLjMuNiBvZiB0aGUgQysrCisvLyBzdGFuZGFyZCwgcGFyYWdyYXBocyAyLTMsIGZvciBhbiBleHBsYW5hdGlvbiBvZiB0aGUgc2VxdWVuY2UuICBBdAorLy8gZWFjaCBzdGVwIHdlIGdldCB0d28gdGhpbmdzOiB0aGUgb3JkaW5hbCAoaS5lLiBudW1iZXIgb2Ygc3RlcHMgdGFrZW4pLAorLy8gYW5kIHRoZSBvbmUtZGltZW5zaW9uYWwgaW5kZXguCisKK3RlbXBsYXRlIDxjbGFzcyBfU2l6ZT4KK3N0cnVjdCBfR3NsaWNlX0l0ZXJfdG1wbCB7CisgIF9Hc2xpY2VfSXRlcl90bXBsKGNvbnN0IGdzbGljZSYgX19nc2xpY2UpCisgICAgOiBfTV9zdGVwKDApLCBfTV8xZF9pZHgoX19nc2xpY2Uuc3RhcnQoKSksCisgICAgICBfTV9pbmRpY2VzKHNpemVfdCgwKSwgX19nc2xpY2UuX01fbGVuZ3Rocy5zaXplKCkpLAorICAgICAgX01fZ3NsaWNlKF9fZ3NsaWNlKQorICAgIHt9CisKKyAgYm9vbCBfTV9kb25lKCkgY29uc3QgeyByZXR1cm4gX01faW5kaWNlc1swXSA9PSBfTV9nc2xpY2UuX01fbGVuZ3Roc1swXTsgfQorCisgIGJvb2wgX01faW5jcigpOworCisgIF9TaXplIF9NX3N0ZXA7CisgIF9TaXplIF9NXzFkX2lkeDsKKworICB2YWxhcnJheTxfU2l6ZT4gX01faW5kaWNlczsKKyAgY29uc3QgZ3NsaWNlJiBfTV9nc2xpY2U7Cit9OworCit0eXBlZGVmIF9Hc2xpY2VfSXRlcl90bXBsPHNpemVfdD4gX0dzbGljZV9JdGVyOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorY2xhc3MgZ3NsaWNlX2FycmF5IHsKKyAgZnJpZW5kIGNsYXNzIHZhbGFycmF5PF9UcD47CitwdWJsaWM6CisgIHR5cGVkZWYgX1RwIHZhbHVlX3R5cGU7CisKKyAgdm9pZCBvcGVyYXRvcj0gKGNvbnN0IHZhbGFycmF5PHZhbHVlX3R5cGU+JiBfX3gpIGNvbnN0IHsKKyAgICBpZiAoIV9NX2dzbGljZS5fTV9lbXB0eSgpKSB7CisgICAgICBfR3NsaWNlX0l0ZXIgX19pKF9NX2dzbGljZSk7CisgICAgICBkbyBfTV9hcnJheVtfX2kuX01fMWRfaWR4XSA9IF9feFtfX2kuX01fc3RlcF07IHdoaWxlKF9faS5fTV9pbmNyKCkpOworICAgIH0KKyAgfQorCisgIHZvaWQgb3BlcmF0b3IqPSAoY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIF9feCkgY29uc3QgeworICAgIGlmICghX01fZ3NsaWNlLl9NX2VtcHR5KCkpIHsKKyAgICAgIF9Hc2xpY2VfSXRlciBfX2koX01fZ3NsaWNlKTsKKyAgICAgIGRvIF9NX2FycmF5W19faS5fTV8xZF9pZHhdICo9IF9feFtfX2kuX01fc3RlcF07IHdoaWxlKF9faS5fTV9pbmNyKCkpOworICAgIH0KKyAgfQorCisgIHZvaWQgb3BlcmF0b3IvPSAoY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIF9feCkgY29uc3QgeworICAgIGlmICghX01fZ3NsaWNlLl9NX2VtcHR5KCkpIHsKKyAgICAgIF9Hc2xpY2VfSXRlciBfX2koX01fZ3NsaWNlKTsKKyAgICAgIGRvIF9NX2FycmF5W19faS5fTV8xZF9pZHhdIC89IF9feFtfX2kuX01fc3RlcF07IHdoaWxlKF9faS5fTV9pbmNyKCkpOworICAgIH0KKyAgfQorCisgIHZvaWQgb3BlcmF0b3IlPSAoY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIF9feCkgY29uc3QgeworICAgIGlmICghX01fZ3NsaWNlLl9NX2VtcHR5KCkpIHsKKyAgICAgIF9Hc2xpY2VfSXRlciBfX2koX01fZ3NsaWNlKTsKKyAgICAgIGRvIF9NX2FycmF5W19faS5fTV8xZF9pZHhdICU9IF9feFtfX2kuX01fc3RlcF07IHdoaWxlKF9faS5fTV9pbmNyKCkpOworICAgIH0KKyAgfQorCisgIHZvaWQgb3BlcmF0b3IrPSAoY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIF9feCkgY29uc3QgeworICAgIGlmICghX01fZ3NsaWNlLl9NX2VtcHR5KCkpIHsKKyAgICAgIF9Hc2xpY2VfSXRlciBfX2koX01fZ3NsaWNlKTsKKyAgICAgIGRvIF9NX2FycmF5W19faS5fTV8xZF9pZHhdICs9IF9feFtfX2kuX01fc3RlcF07IHdoaWxlKF9faS5fTV9pbmNyKCkpOworICAgIH0KKyAgfQorCisgIHZvaWQgb3BlcmF0b3ItPSAoY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIF9feCkgY29uc3QgeworICAgIGlmICghX01fZ3NsaWNlLl9NX2VtcHR5KCkpIHsKKyAgICAgIF9Hc2xpY2VfSXRlciBfX2koX01fZ3NsaWNlKTsKKyAgICAgIGRvIF9NX2FycmF5W19faS5fTV8xZF9pZHhdIC09IF9feFtfX2kuX01fc3RlcF07IHdoaWxlKF9faS5fTV9pbmNyKCkpOworICAgIH0KKyAgfQorCisgIHZvaWQgb3BlcmF0b3JePSAoY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIF9feCkgY29uc3QgeworICAgIGlmICghX01fZ3NsaWNlLl9NX2VtcHR5KCkpIHsKKyAgICAgIF9Hc2xpY2VfSXRlciBfX2koX01fZ3NsaWNlKTsKKyAgICAgIGRvIF9NX2FycmF5W19faS5fTV8xZF9pZHhdIF49IF9feFtfX2kuX01fc3RlcF07IHdoaWxlKF9faS5fTV9pbmNyKCkpOworICAgIH0KKyAgfQorCisgIHZvaWQgb3BlcmF0b3ImPSAoY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIF9feCkgY29uc3QgeworICAgIGlmICghX01fZ3NsaWNlLl9NX2VtcHR5KCkpIHsKKyAgICAgIF9Hc2xpY2VfSXRlciBfX2koX01fZ3NsaWNlKTsKKyAgICAgIGRvIF9NX2FycmF5W19faS5fTV8xZF9pZHhdICY9IF9feFtfX2kuX01fc3RlcF07IHdoaWxlKF9faS5fTV9pbmNyKCkpOworICAgIH0KKyAgfQorCisgIHZvaWQgb3BlcmF0b3J8PSAoY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIF9feCkgY29uc3QgeworICAgIGlmICghX01fZ3NsaWNlLl9NX2VtcHR5KCkpIHsKKyAgICAgIF9Hc2xpY2VfSXRlciBfX2koX01fZ3NsaWNlKTsKKyAgICAgIGRvIF9NX2FycmF5W19faS5fTV8xZF9pZHhdIHw9IF9feFtfX2kuX01fc3RlcF07IHdoaWxlKF9faS5fTV9pbmNyKCkpOworICAgIH0KKyAgfQorCisgIHZvaWQgb3BlcmF0b3I8PD0gKGNvbnN0IHZhbGFycmF5PHZhbHVlX3R5cGU+JiBfX3gpIGNvbnN0IHsKKyAgICBpZiAoIV9NX2dzbGljZS5fTV9lbXB0eSgpKSB7CisgICAgICBfR3NsaWNlX0l0ZXIgX19pKF9NX2dzbGljZSk7CisgICAgICBkbyBfTV9hcnJheVtfX2kuX01fMWRfaWR4XSA8PD0gX194W19faS5fTV9zdGVwXTsgd2hpbGUoX19pLl9NX2luY3IoKSk7CisgICAgfQorICB9CisKKyAgdm9pZCBvcGVyYXRvcj4+PSAoY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIF9feCkgY29uc3QgeworICAgIGlmICghX01fZ3NsaWNlLl9NX2VtcHR5KCkpIHsKKyAgICAgIF9Hc2xpY2VfSXRlciBfX2koX01fZ3NsaWNlKTsKKyAgICAgIGRvIF9NX2FycmF5W19faS5fTV8xZF9pZHhdID4+PSBfX3hbX19pLl9NX3N0ZXBdOyB3aGlsZShfX2kuX01faW5jcigpKTsKKyAgICB9CisgIH0KKworICB2b2lkIG9wZXJhdG9yPSAoY29uc3QgdmFsdWVfdHlwZSYgX19jKSAvKmNvbnN0IGNvdWxkIGJlIGNvbnN0IGJ1dCBzdGFuZGFyZCBzYXlzIE5PICgyNi4zLjcuNC0xKSovIHsKKyAgICBpZiAoIV9NX2dzbGljZS5fTV9lbXB0eSgpKSB7CisgICAgICBfR3NsaWNlX0l0ZXIgX19pKF9NX2dzbGljZSk7CisgICAgICBkbyBfTV9hcnJheVtfX2kuX01fMWRfaWR4XSA9IF9fYzsgd2hpbGUoX19pLl9NX2luY3IoKSk7CisgICAgfQorICB9CisKKyAgLy8gQysrIFN0YW5kYXJkIGRlZmVjdCAyNTMsIGNvcHkgY29uc3RydWN0b3IgbXVzdCBiZSBwdWJsaWMuCisgIGdzbGljZV9hcnJheShjb25zdCBnc2xpY2VfYXJyYXkmIF9feCkKKyAgICA6IF9NX2dzbGljZShfX3guX01fZ3NsaWNlKSwgX01fYXJyYXkoX194Ll9NX2FycmF5KQorICAgIHt9CisKKyAgfmdzbGljZV9hcnJheSgpIHt9CisKK3ByaXZhdGU6CisgIGdzbGljZV9hcnJheShjb25zdCBnc2xpY2UgJl9fZ3NsaWNlLCB2YWxhcnJheTxfVHA+ICZfX2FycmF5KQorICAgIDogX01fZ3NsaWNlKF9fZ3NsaWNlKSwgX01fYXJyYXkoX19hcnJheSkKKyAgICB7fQorCisgIGdzbGljZSAgICAgICAgICAgICAgICBfTV9nc2xpY2U7CisgIHZhbGFycmF5PHZhbHVlX3R5cGU+JiBfTV9hcnJheTsKKworcHJpdmF0ZToKKyAgLy8gRGlzYWJsZSBkZWZhdWx0IGNvbnN0cnVjdG9yIGFuZCBhc3NpZ25tZW50CisgIGdzbGljZV9hcnJheSgpOworICB2b2lkIG9wZXJhdG9yPShjb25zdCBnc2xpY2VfYXJyYXk8X1RwPiYpOworfTsKKworLy8gdmFsYXJyYXkgbWVtYmVyIGZ1bmN0aW9ucyBkZWFsaW5nIHdpdGggZ3NsaWNlIGFuZCBnc2xpY2VfYXJyYXkuICBOb3RlCisvLyB0aGF0IGl0IGlzIGlsbGVnYWwgKGJlaGF2aW9yIGlzIHVuZGVmaW5lZCkgdG8gY29uc3RydWN0IGEgZ3NsaWNlX2FycmF5CisvLyBmcm9tIGEgZGVnZW5lcmF0ZSBnc2xpY2UuCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgdmFsYXJyYXk8X1RwPjo6dmFsYXJyYXkoY29uc3QgZ3NsaWNlX2FycmF5PF9UcD4mIF9feCkKKyAgOiBfVmFsYXJyYXlfYmFzZTxfVHA+KF9feC5fTV9nc2xpY2UuX01fc2l6ZSgpKSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgX190eXBlX3RyYWl0czxfVHA+OjpoYXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yCisgICAgICAgICAgX0lzX1RyaXZpYWw7CisgIF9NX2luaXRpYWxpemUoX0lzX1RyaXZpYWwoKSk7CisgICp0aGlzID0gX194OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIGdzbGljZV9hcnJheTxfVHA+IHZhbGFycmF5PF9UcD46Om9wZXJhdG9yW10oY29uc3QgZ3NsaWNlJiBfX3NsaWNlKQoreyByZXR1cm4gZ3NsaWNlX2FycmF5PF9UcD4oX19zbGljZSwgKnRoaXMpOyB9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtYXNrX2FycmF5CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitjbGFzcyBtYXNrX2FycmF5IHsKKyAgZnJpZW5kIGNsYXNzIHZhbGFycmF5PF9UcD47CitwdWJsaWM6CisgIHR5cGVkZWYgX1RwIHZhbHVlX3R5cGU7CisKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIF9feCkgY29uc3QgeworICAgIHNpemVfdCBfX2lkeCA9IDA7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX01fYXJyYXkuc2l6ZSgpOyArK19faSkKKyAgICAgIGlmIChfTV9tYXNrW19faV0pIF9NX2FycmF5W19faV0gPSBfX3hbX19pZHgrK107CisgIH0KKworICB2b2lkIG9wZXJhdG9yKj0oY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIF9feCkgY29uc3QgeworICAgIHNpemVfdCBfX2lkeCA9IDA7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX01fYXJyYXkuc2l6ZSgpOyArK19faSkKKyAgICAgIGlmIChfTV9tYXNrW19faV0pIF9NX2FycmF5W19faV0gKj0gX194W19faWR4KytdOworICB9CisKKyAgdm9pZCBvcGVyYXRvci89KGNvbnN0IHZhbGFycmF5PHZhbHVlX3R5cGU+JiBfX3gpIGNvbnN0IHsKKyAgICBzaXplX3QgX19pZHggPSAwOworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9NX2FycmF5LnNpemUoKTsgKytfX2kpCisgICAgICBpZiAoX01fbWFza1tfX2ldKSBfTV9hcnJheVtfX2ldIC89IF9feFtfX2lkeCsrXTsKKyAgfQorCisgIHZvaWQgb3BlcmF0b3IlPShjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgX194KSBjb25zdCB7CisgICAgc2l6ZV90IF9faWR4ID0gMDsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfTV9hcnJheS5zaXplKCk7ICsrX19pKQorICAgICAgaWYgKF9NX21hc2tbX19pXSkgX01fYXJyYXlbX19pXSAlPSBfX3hbX19pZHgrK107CisgIH0KKworICB2b2lkIG9wZXJhdG9yKz0oY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIF9feCkgY29uc3QgeworICAgIHNpemVfdCBfX2lkeCA9IDA7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX01fYXJyYXkuc2l6ZSgpOyArK19faSkKKyAgICAgIGlmIChfTV9tYXNrW19faV0pIF9NX2FycmF5W19faV0gKz0gX194W19faWR4KytdOworICB9CisKKyAgdm9pZCBvcGVyYXRvci09KGNvbnN0IHZhbGFycmF5PHZhbHVlX3R5cGU+JiBfX3gpIGNvbnN0IHsKKyAgICBzaXplX3QgX19pZHggPSAwOworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9NX2FycmF5LnNpemUoKTsgKytfX2kpCisgICAgICBpZiAoX01fbWFza1tfX2ldKSBfTV9hcnJheVtfX2ldIC09IF9feFtfX2lkeCsrXTsKKyAgfQorCisgIHZvaWQgb3BlcmF0b3JePShjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgX194KSBjb25zdCB7CisgICAgc2l6ZV90IF9faWR4ID0gMDsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfTV9hcnJheS5zaXplKCk7ICsrX19pKQorICAgICAgaWYgKF9NX21hc2tbX19pXSkgX01fYXJyYXlbX19pXSBePSBfX3hbX19pZHgrK107CisgIH0KKworICB2b2lkIG9wZXJhdG9yJj0oY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIF9feCkgY29uc3QgeworICAgIHNpemVfdCBfX2lkeCA9IDA7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX01fYXJyYXkuc2l6ZSgpOyArK19faSkKKyAgICAgIGlmIChfTV9tYXNrW19faV0pIF9NX2FycmF5W19faV0gJj0gX194W19faWR4KytdOworICB9CisKKyAgdm9pZCBvcGVyYXRvcnw9KGNvbnN0IHZhbGFycmF5PHZhbHVlX3R5cGU+JiBfX3gpIGNvbnN0IHsKKyAgICBzaXplX3QgX19pZHggPSAwOworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9NX2FycmF5LnNpemUoKTsgKytfX2kpCisgICAgICBpZiAoX01fbWFza1tfX2ldKSBfTV9hcnJheVtfX2ldIHw9IF9feFtfX2lkeCsrXTsKKyAgfQorCisgIHZvaWQgb3BlcmF0b3I8PD0oY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIF9feCkgY29uc3QgeworICAgIHNpemVfdCBfX2lkeCA9IDA7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX01fYXJyYXkuc2l6ZSgpOyArK19faSkKKyAgICAgIGlmIChfTV9tYXNrW19faV0pIF9NX2FycmF5W19faV0gPDw9IF9feFtfX2lkeCsrXTsKKyAgfQorCisgIHZvaWQgb3BlcmF0b3I+Pj0oY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIF9feCkgY29uc3QgeworICAgIHNpemVfdCBfX2lkeCA9IDA7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX01fYXJyYXkuc2l6ZSgpOyArK19faSkKKyAgICAgIGlmIChfTV9tYXNrW19faV0pIF9NX2FycmF5W19faV0gPj49IF9feFtfX2lkeCsrXTsKKyAgfQorCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHZhbHVlX3R5cGUmIF9fYykgY29uc3QgeworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9NX2FycmF5LnNpemUoKTsgKytfX2kpCisgICAgICBpZiAoX01fbWFza1tfX2ldKSBfTV9hcnJheVtfX2ldID0gX19jOworICB9CisKKyAgLy8gRXh0ZW5zaW9uOiBudW1iZXIgb2YgdHJ1ZSB2YWx1ZXMgaW4gdGhlIG1hc2sKKyAgc2l6ZV90IF9NX251bV90cnVlKCkgY29uc3QgeworICAgIHNpemVfdCBfX3Jlc3VsdCA9IDA7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX01fbWFzay5zaXplKCk7ICsrX19pKQorICAgICAgaWYgKF9NX21hc2tbX19pXSkgKytfX3Jlc3VsdDsKKyAgICByZXR1cm4gX19yZXN1bHQ7CisgIH0KKworICAvLyBDKysgU3RhbmRhcmQgZGVmZWN0IDI1MywgY29weSBjb25zdHJ1Y3RvciBtdXN0IGJlIHB1YmxpYy4KKyAgbWFza19hcnJheShjb25zdCBtYXNrX2FycmF5JiBfX3gpCisgICAgOiBfTV9tYXNrKF9feC5fTV9tYXNrKSwgX01fYXJyYXkoX194Ll9NX2FycmF5KQorICAgIHt9CisKKyAgfm1hc2tfYXJyYXkoKSB7fQorCitwcml2YXRlOgorICBtYXNrX2FycmF5KGNvbnN0IF9WYWxhcnJheV9ib29sJiBfX21hc2ssIHZhbGFycmF5PF9UcD4mIF9fYXJyYXkpCisgICAgOiBfTV9tYXNrKF9fbWFzayksIF9NX2FycmF5KF9fYXJyYXkpCisgICAge30KKyAgX1ZhbGFycmF5X2Jvb2wgX01fbWFzazsKKyAgdmFsYXJyYXk8X1RwPiYgX01fYXJyYXk7CisKK3ByaXZhdGU6CisgIC8vIERpc2FibGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBhbmQgYXNzaWdubWVudAorICBtYXNrX2FycmF5KCk7CisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IG1hc2tfYXJyYXk8X1RwPiYpOworfTsKKworLy8gdmFsYXJyYXkgbWVtYmVyIGZ1bmN0aW9ucyBkZWFsaW5nIHdpdGggbWFza19hcnJheQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIHZhbGFycmF5PF9UcD46OnZhbGFycmF5KGNvbnN0IG1hc2tfYXJyYXk8X1RwPiYgX194KQorICA6IF9WYWxhcnJheV9iYXNlPF9UcD4oX194Ll9NX251bV90cnVlKCkpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX3R5cGVfdHJhaXRzPF9UcD46Omhhc190cml2aWFsX2RlZmF1bHRfY29uc3RydWN0b3IKKyAgICAgICAgICBfSXNfVHJpdmlhbDsKKyAgX01faW5pdGlhbGl6ZShfSXNfVHJpdmlhbCgpKTsKKyAgKnRoaXMgPSBfX3g7Cit9CisKKy8vIEJlaGF2aW9yIGlzIHVuZGVmaW5lZCBpZiBfX3guX01fbnVtX3RydWUoKSAhPSB0aGlzLT5zaXplKCkKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgdmFsYXJyYXk8X1RwPiYgdmFsYXJyYXk8X1RwPjo6b3BlcmF0b3I9KGNvbnN0IG1hc2tfYXJyYXk8X1RwPiYgX194KSB7CisgIHNpemVfdCBfX2lkeCA9IDA7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5fTV9hcnJheS5zaXplKCk7ICsrX19pKQorICAgIGlmIChfX3guX01fbWFza1tfX2ldKSAoKnRoaXMpW19faWR4KytdID0gX194Ll9NX2FycmF5W19faV07CisgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBtYXNrX2FycmF5PF9UcD4gdmFsYXJyYXk8X1RwPjo6b3BlcmF0b3JbXShjb25zdCBfVmFsYXJyYXlfYm9vbCYgX19tYXNrKSB7CisgIF9TVExQX0FTU0VSVChfX21hc2suc2l6ZSgpID09IHRoaXMtPnNpemUoKSkKKyAgcmV0dXJuIG1hc2tfYXJyYXk8X1RwPihfX21hc2ssICp0aGlzKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBpbmRpcmVjdF9hcnJheQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorY2xhc3MgaW5kaXJlY3RfYXJyYXkgeworICBmcmllbmQgY2xhc3MgdmFsYXJyYXk8X1RwPjsKK3B1YmxpYzoKKyAgdHlwZWRlZiBfVHAgdmFsdWVfdHlwZTsKKworICB2b2lkIG9wZXJhdG9yPShjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgX194KSBjb25zdCB7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX01fYWRkci5zaXplKCk7ICsrX19pKQorICAgICAgX01fYXJyYXlbX01fYWRkcltfX2ldXSA9IF9feFtfX2ldOworICB9CisKKyAgdm9pZCBvcGVyYXRvcio9KGNvbnN0IHZhbGFycmF5PHZhbHVlX3R5cGU+JiBfX3gpIGNvbnN0IHsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfTV9hZGRyLnNpemUoKTsgKytfX2kpCisgICAgICBfTV9hcnJheVtfTV9hZGRyW19faV1dICo9IF9feFtfX2ldOworICB9CisKKyAgdm9pZCBvcGVyYXRvci89KGNvbnN0IHZhbGFycmF5PHZhbHVlX3R5cGU+JiBfX3gpIGNvbnN0IHsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfTV9hZGRyLnNpemUoKTsgKytfX2kpCisgICAgICBfTV9hcnJheVtfTV9hZGRyW19faV1dIC89IF9feFtfX2ldOworICB9CisKKyAgdm9pZCBvcGVyYXRvciU9KGNvbnN0IHZhbGFycmF5PHZhbHVlX3R5cGU+JiBfX3gpIGNvbnN0IHsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfTV9hZGRyLnNpemUoKTsgKytfX2kpCisgICAgICBfTV9hcnJheVtfTV9hZGRyW19faV1dICU9IF9feFtfX2ldOworICB9CisKKyAgdm9pZCBvcGVyYXRvcis9KGNvbnN0IHZhbGFycmF5PHZhbHVlX3R5cGU+JiBfX3gpIGNvbnN0IHsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfTV9hZGRyLnNpemUoKTsgKytfX2kpCisgICAgICBfTV9hcnJheVtfTV9hZGRyW19faV1dICs9IF9feFtfX2ldOworICB9CisKKyAgdm9pZCBvcGVyYXRvci09KGNvbnN0IHZhbGFycmF5PHZhbHVlX3R5cGU+JiBfX3gpIGNvbnN0IHsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfTV9hZGRyLnNpemUoKTsgKytfX2kpCisgICAgICBfTV9hcnJheVtfTV9hZGRyW19faV1dIC09IF9feFtfX2ldOworICB9CisKKyAgdm9pZCBvcGVyYXRvcl49KGNvbnN0IHZhbGFycmF5PHZhbHVlX3R5cGU+JiBfX3gpIGNvbnN0IHsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfTV9hZGRyLnNpemUoKTsgKytfX2kpCisgICAgICBfTV9hcnJheVtfTV9hZGRyW19faV1dIF49IF9feFtfX2ldOworICB9CisKKyAgdm9pZCBvcGVyYXRvciY9KGNvbnN0IHZhbGFycmF5PHZhbHVlX3R5cGU+JiBfX3gpIGNvbnN0IHsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfTV9hZGRyLnNpemUoKTsgKytfX2kpCisgICAgICBfTV9hcnJheVtfTV9hZGRyW19faV1dICY9IF9feFtfX2ldOworICB9CisKKyAgdm9pZCBvcGVyYXRvcnw9KGNvbnN0IHZhbGFycmF5PHZhbHVlX3R5cGU+JiBfX3gpIGNvbnN0IHsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfTV9hZGRyLnNpemUoKTsgKytfX2kpCisgICAgICBfTV9hcnJheVtfTV9hZGRyW19faV1dIHw9IF9feFtfX2ldOworICB9CisKKyAgdm9pZCBvcGVyYXRvcjw8PShjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgX194KSBjb25zdCB7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX01fYWRkci5zaXplKCk7ICsrX19pKQorICAgICAgX01fYXJyYXlbX01fYWRkcltfX2ldXSA8PD0gX194W19faV07CisgIH0KKworICB2b2lkIG9wZXJhdG9yPj49KGNvbnN0IHZhbGFycmF5PHZhbHVlX3R5cGU+JiBfX3gpIGNvbnN0IHsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfTV9hZGRyLnNpemUoKTsgKytfX2kpCisgICAgICBfTV9hcnJheVtfTV9hZGRyW19faV1dID4+PSBfX3hbX19pXTsKKyAgfQorCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHZhbHVlX3R5cGUmIF9fYykgY29uc3QgeworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9NX2FkZHIuc2l6ZSgpOyArK19faSkKKyAgICAgIF9NX2FycmF5W19NX2FkZHJbX19pXV0gPSBfX2M7CisgIH0KKworICAvLyBDKysgU3RhbmRhcmQgZGVmZWN0IDI1MywgY29weSBjb25zdHJ1Y3RvciBtdXN0IGJlIHB1YmxpYy4KKyAgaW5kaXJlY3RfYXJyYXkoY29uc3QgaW5kaXJlY3RfYXJyYXkmIF9feCkKKyAgICA6IF9NX2FkZHIoX194Ll9NX2FkZHIpLCBfTV9hcnJheShfX3guX01fYXJyYXkpCisgICAge30KKworICB+aW5kaXJlY3RfYXJyYXkoKSB7fQorCitwcml2YXRlOgorICBpbmRpcmVjdF9hcnJheShjb25zdCBfVmFsYXJyYXlfc2l6ZV90JiBfX2FkZHIsIHZhbGFycmF5PF9UcD4mIF9fYXJyYXkpCisgICAgOiBfTV9hZGRyKF9fYWRkciksIF9NX2FycmF5KF9fYXJyYXkpCisgIHt9CisKKyAgX1ZhbGFycmF5X3NpemVfdCBfTV9hZGRyOworICB2YWxhcnJheTxfVHA+JiAgIF9NX2FycmF5OworCitwcml2YXRlOgorICAvLyBEaXNhYmxlIGRlZmF1bHQgY29uc3RydWN0b3IgYW5kIGFzc2lnbm1lbnQKKyAgaW5kaXJlY3RfYXJyYXkoKTsKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgaW5kaXJlY3RfYXJyYXk8X1RwPiYpOworfTsKKworLy8gdmFsYXJyYXkgbWVtYmVyIGZ1bmN0aW9ucyBkZWFsaW5nIHdpdGggaW5kaXJlY3RfYXJyYXkKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSB2YWxhcnJheTxfVHA+Ojp2YWxhcnJheShjb25zdCBpbmRpcmVjdF9hcnJheTxfVHA+JiBfX3gpCisgIDogX1ZhbGFycmF5X2Jhc2U8X1RwPihfX3guX01fYWRkci5zaXplKCkpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX3R5cGVfdHJhaXRzPF9UcD46Omhhc190cml2aWFsX2RlZmF1bHRfY29uc3RydWN0b3IKKyAgICAgICAgICBfSXNfVHJpdmlhbDsKKyAgX01faW5pdGlhbGl6ZShfSXNfVHJpdmlhbCgpKTsKKyAgKnRoaXMgPSBfX3g7Cit9CisKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBpbmRpcmVjdF9hcnJheTxfVHA+Cit2YWxhcnJheTxfVHA+OjpvcGVyYXRvcltdKGNvbnN0IF9WYWxhcnJheV9zaXplX3QmIF9fYWRkcikKK3sgcmV0dXJuIGluZGlyZWN0X2FycmF5PF9UcD4oX19hZGRyLCAqdGhpcyk7IH0KKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjIGlmICFkZWZpbmVkIChfU1RMUF9MSU5LX1RJTUVfSU5TVEFOVElBVElPTikKKyMgIGluY2x1ZGUgPHN0bC9fdmFsYXJyYXkuYz4KKyMgZW5kaWYKKworI2VuZGlmIC8qIF9TVExQX1ZBTEFSUkFZICovCisKKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL192ZWN0b3IuYyBiL3N0bHBvcnQvc3RsL192ZWN0b3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDVmNzg2Ci0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvX3ZlY3Rvci5jCkBAIC0wLDAgKzEsMjQyIEBACisvKgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisjaWZuZGVmIF9TVExQX1ZFQ1RPUl9DCisjZGVmaW5lIF9TVExQX1ZFQ1RPUl9DCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfSU5URVJOQUxfVkVDVE9SX0gpCisjICBpbmNsdWRlIDxzdGwvX3ZlY3Rvci5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGwvX3JhbmdlX2Vycm9ycy5oPgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Cit2b2lkIF9WZWN0b3JfYmFzZTxfVHAsX0FsbG9jPjo6X01fdGhyb3dfbGVuZ3RoX2Vycm9yKCkgY29uc3QKK3sgX19zdGxfdGhyb3dfbGVuZ3RoX2Vycm9yKCJ2ZWN0b3IiKTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Cit2b2lkIF9WZWN0b3JfYmFzZTxfVHAsIF9BbGxvYz46Ol9NX3Rocm93X291dF9vZl9yYW5nZSgpIGNvbnN0Cit7IF9fc3RsX3Rocm93X291dF9vZl9yYW5nZSgidmVjdG9yIik7IH0KKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QVFJfU1BFQ0lBTElaQVRJT05TKQorIyAgZGVmaW5lIHZlY3RvciBfU1RMUF9QVFJfSU1QTF9OQU1FKHZlY3RvcikKKyNlbGlmIGRlZmluZWQgKF9TVExQX0RFQlVHKQorIyAgZGVmaW5lIHZlY3RvciBfU1RMUF9OT05fREJHX05BTUUodmVjdG9yKQorI2Vsc2UKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9ORVNURURfVFlQRV9QQVJBTV9CVUcpCisjICBkZWZpbmUgX19pdGVyYXRvcl9fICBfVHAqCisjZWxzZQorIyAgZGVmaW5lIF9faXRlcmF0b3JfXyAgX1NUTFBfVFlQRU5BTUVfT05fUkVUVVJOX1RZUEUgdmVjdG9yPF9UcCwgX0FsbG9jPjo6aXRlcmF0b3IKKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Cit2b2lkIHZlY3RvcjxfVHAsIF9BbGxvYz46OnJlc2VydmUoc2l6ZV90eXBlIF9fbikgeworICBpZiAoY2FwYWNpdHkoKSA8IF9fbikgeworICAgIGlmIChtYXhfc2l6ZSgpIDwgX19uKSB7CisgICAgICB0aGlzLT5fTV90aHJvd19sZW5ndGhfZXJyb3IoKTsKKyAgICB9CisKKyAgICBjb25zdCBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IHNpemUoKTsKKyAgICBwb2ludGVyIF9fdG1wOworICAgIGlmICh0aGlzLT5fTV9zdGFydCkgeworICAgICAgX190bXAgPSBfTV9hbGxvY2F0ZV9hbmRfY29weShfX24sIHRoaXMtPl9NX3N0YXJ0LCB0aGlzLT5fTV9maW5pc2gpOworICAgICAgX01fY2xlYXIoKTsKKyAgICB9IGVsc2UgeworICAgICAgX190bXAgPSB0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5hbGxvY2F0ZShfX24sIF9fbik7CisgICAgfQorICAgIF9NX3NldChfX3RtcCwgX190bXAgKyBfX29sZF9zaXplLCBfX3RtcCArIF9fbik7CisgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgordm9pZCB2ZWN0b3I8X1RwLCBfQWxsb2M+OjpfTV9pbnNlcnRfb3ZlcmZsb3dfYXV4KHBvaW50ZXIgX19wb3MsIGNvbnN0IF9UcCYgX194LCBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qRE8gTk9UIFVTRSEhKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fZmlsbF9sZW4sIGJvb2wgX19hdGVuZCApIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX3R5cGVfdHJhaXRzPF9UcD46Omhhc190cml2aWFsX2NvcHlfY29uc3RydWN0b3IgX1RyaXZpYWxVQ29weTsKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX21vdmVfdHJhaXRzPF9UcD46OmltcGxlbWVudGVkIF9Nb3ZhYmxlOworI2VuZGlmCisgIHNpemVfdHlwZSBfX2xlbiA9IF9NX2NvbXB1dGVfbmV4dF9zaXplKF9fZmlsbF9sZW4pOworICBwb2ludGVyIF9fbmV3X3N0YXJ0ID0gdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuYWxsb2NhdGUoX19sZW4sIF9fbGVuKTsKKyAgcG9pbnRlciBfX25ld19maW5pc2ggPSBfX25ld19zdGFydDsKKyAgX1NUTFBfVFJZIHsKKyAgICBfX25ld19maW5pc2ggPSBfU1RMUF9QUklWIF9fdW5pbml0aWFsaXplZF9tb3ZlKHRoaXMtPl9NX3N0YXJ0LCBfX3BvcywgX19uZXdfc3RhcnQsIF9Ucml2aWFsVUNvcHkoKSwgX01vdmFibGUoKSk7CisgICAgLy8gaGFuZGxlIGluc2VydGlvbgorICAgIGlmIChfX2ZpbGxfbGVuID09IDEpIHsKKyAgICAgIF9Db3B5X0NvbnN0cnVjdChfX25ld19maW5pc2gsIF9feCk7CisgICAgICArK19fbmV3X2ZpbmlzaDsKKyAgICB9IGVsc2UKKyAgICAgIF9fbmV3X2ZpbmlzaCA9IF9TVExQX1BSSVYgX191bmluaXRpYWxpemVkX2ZpbGxfbihfX25ld19maW5pc2gsIF9fZmlsbF9sZW4sIF9feCk7CisgICAgaWYgKCFfX2F0ZW5kKQorICAgICAgX19uZXdfZmluaXNoID0gX1NUTFBfUFJJViBfX3VuaW5pdGlhbGl6ZWRfbW92ZShfX3BvcywgdGhpcy0+X01fZmluaXNoLCBfX25ld19maW5pc2gsIF9Ucml2aWFsVUNvcHkoKSwgX01vdmFibGUoKSk7IC8vIGNvcHkgcmVtYWluZGVyCisgIH0KKyAgX1NUTFBfVU5XSU5EKChfU1RMUF9TVEQ6Ol9EZXN0cm95X1JhbmdlKF9fbmV3X3N0YXJ0LF9fbmV3X2ZpbmlzaCksCisgICAgICAgICAgICAgICB0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5kZWFsbG9jYXRlKF9fbmV3X3N0YXJ0LF9fbGVuKSkpCisgIF9NX2NsZWFyX2FmdGVyX21vdmUoKTsKKyAgX01fc2V0KF9fbmV3X3N0YXJ0LCBfX25ld19maW5pc2gsIF9fbmV3X3N0YXJ0ICsgX19sZW4pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Cit2b2lkIHZlY3RvcjxfVHAsIF9BbGxvYz46Ol9NX2luc2VydF9vdmVyZmxvdyhwb2ludGVyIF9fcG9zLCBjb25zdCBfVHAmIF9feCwgY29uc3QgX190cnVlX3R5cGUmIC8qX1RyaXZpYWxDb3B5Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19maWxsX2xlbiwgYm9vbCBfX2F0ZW5kICkgeworICBzaXplX3R5cGUgX19sZW4gPSBfTV9jb21wdXRlX25leHRfc2l6ZShfX2ZpbGxfbGVuKTsKKyAgcG9pbnRlciBfX25ld19zdGFydCA9IHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLmFsbG9jYXRlKF9fbGVuLCBfX2xlbik7CisgIHBvaW50ZXIgX19uZXdfZmluaXNoID0gX19TVEFUSUNfQ0FTVChwb2ludGVyLCBfU1RMUF9QUklWIF9fY29weV90cml2aWFsKHRoaXMtPl9NX3N0YXJ0LCBfX3BvcywgX19uZXdfc3RhcnQpKTsKKyAgLy8gaGFuZGxlIGluc2VydGlvbgorICBfX25ld19maW5pc2ggPSBfU1RMUF9QUklWIF9fZmlsbF9uKF9fbmV3X2ZpbmlzaCwgX19maWxsX2xlbiwgX194KTsKKyAgaWYgKCFfX2F0ZW5kKQorICAgIF9fbmV3X2ZpbmlzaCA9IF9fU1RBVElDX0NBU1QocG9pbnRlciwgX1NUTFBfUFJJViBfX2NvcHlfdHJpdmlhbChfX3BvcywgdGhpcy0+X01fZmluaXNoLCBfX25ld19maW5pc2gpKTsgLy8gY29weSByZW1haW5kZXIKKyAgX01fY2xlYXIoKTsKKyAgX01fc2V0KF9fbmV3X3N0YXJ0LCBfX25ld19maW5pc2gsIF9fbmV3X3N0YXJ0ICsgX19sZW4pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Cit2b2lkIHZlY3RvcjxfVHAsIF9BbGxvYz46Ol9NX2ZpbGxfaW5zZXJ0X2F1eChpdGVyYXRvciBfX3Bvcywgc2l6ZV90eXBlIF9fbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9UcCYgX194LCBjb25zdCBfX3RydWVfdHlwZSYgLypfTW92YWJsZSovKSB7CisgIGlmIChfTV9pc19pbnNpZGUoX194KSkgeworICAgIF9UcCBfX3hfY29weSA9IF9feDsKKyAgICBfTV9maWxsX2luc2VydF9hdXgoX19wb3MsIF9fbiwgX194X2NvcHksIF9fdHJ1ZV90eXBlKCkpOworICAgIHJldHVybjsKKyAgfQorICBpdGVyYXRvciBfX3NyYyA9IHRoaXMtPl9NX2ZpbmlzaCAtIDE7CisgIGl0ZXJhdG9yIF9fZHN0ID0gX19zcmMgKyBfX247CisgIGZvciAoOyBfX3NyYyA+PSBfX3BvczsgLS1fX2RzdCwgLS1fX3NyYykgeworICAgIF9TVExQX1NURDo6X01vdmVfQ29uc3RydWN0KF9fZHN0LCAqX19zcmMpOworICAgIF9TVExQX1NURDo6X0Rlc3Ryb3lfTW92ZWQoX19zcmMpOworICB9CisgIF9TVExQX1BSSVYgX191bmluaXRpYWxpemVkX2ZpbGxfbihfX3BvcywgX19uLCBfX3gpOworICB0aGlzLT5fTV9maW5pc2ggKz0gX19uOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Cit2b2lkIHZlY3RvcjxfVHAsIF9BbGxvYz46Ol9NX2ZpbGxfaW5zZXJ0X2F1eCAoaXRlcmF0b3IgX19wb3MsIHNpemVfdHlwZSBfX24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypfTW92YWJsZSovKSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgX190eXBlX3RyYWl0czxfVHA+OjpoYXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yIF9Ucml2aWFsVUNvcHk7CisgIHR5cGVkZWYgdHlwZW5hbWUgX190eXBlX3RyYWl0czxfVHA+OjpoYXNfdHJpdmlhbF9hc3NpZ25tZW50X29wZXJhdG9yIF9Ucml2aWFsQ29weTsKKyAgLy9IZXJlIHNlbGYgcmVmZXJlbmNpbmcgbmVlZHMgdG8gYmUgY2hlY2tlZCBldmVuIGZvciBub24gbW92YWJsZSB0eXBlcy4KKyAgaWYgKF9NX2lzX2luc2lkZShfX3gpKSB7CisgICAgX1RwIF9feF9jb3B5ID0gX194OworICAgIF9NX2ZpbGxfaW5zZXJ0X2F1eChfX3BvcywgX19uLCBfX3hfY29weSwgX19mYWxzZV90eXBlKCkpOworICAgIHJldHVybjsKKyAgfQorICBjb25zdCBzaXplX3R5cGUgX19lbGVtc19hZnRlciA9IHRoaXMtPl9NX2ZpbmlzaCAtIF9fcG9zOworICBwb2ludGVyIF9fb2xkX2ZpbmlzaCA9IHRoaXMtPl9NX2ZpbmlzaDsKKyAgaWYgKF9fZWxlbXNfYWZ0ZXIgPiBfX24pIHsKKyAgICBfU1RMUF9QUklWIF9fdWNvcHlfcHRycyh0aGlzLT5fTV9maW5pc2ggLSBfX24sIHRoaXMtPl9NX2ZpbmlzaCwgdGhpcy0+X01fZmluaXNoLCBfVHJpdmlhbFVDb3B5KCkpOworICAgIHRoaXMtPl9NX2ZpbmlzaCArPSBfX247CisgICAgX1NUTFBfUFJJViBfX2NvcHlfYmFja3dhcmRfcHRycyhfX3BvcywgX19vbGRfZmluaXNoIC0gX19uLCBfX29sZF9maW5pc2gsIF9Ucml2aWFsQ29weSgpKTsKKyAgICBfU1RMUF9TVEQ6OmZpbGwoX19wb3MsIF9fcG9zICsgX19uLCBfX3gpOworICB9IGVsc2UgeworICAgIHRoaXMtPl9NX2ZpbmlzaCA9IF9TVExQX1BSSVYgX191bmluaXRpYWxpemVkX2ZpbGxfbih0aGlzLT5fTV9maW5pc2gsIF9fbiAtIF9fZWxlbXNfYWZ0ZXIsIF9feCk7CisgICAgX1NUTFBfUFJJViBfX3Vjb3B5X3B0cnMoX19wb3MsIF9fb2xkX2ZpbmlzaCwgdGhpcy0+X01fZmluaXNoLCBfVHJpdmlhbFVDb3B5KCkpOworICAgIHRoaXMtPl9NX2ZpbmlzaCArPSBfX2VsZW1zX2FmdGVyOworICAgIF9TVExQX1NURDo6ZmlsbChfX3BvcywgX19vbGRfZmluaXNoLCBfX3gpOworICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK3ZvaWQgdmVjdG9yPF9UcCwgX0FsbG9jPjo6X01fZmlsbF9pbnNlcnQoaXRlcmF0b3IgX19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX194KSB7CisjaWYgIWRlZmluZWQgKF9TVExQX05PX01PVkVfU0VNQU5USUMpCisgIHR5cGVkZWYgdHlwZW5hbWUgX19tb3ZlX3RyYWl0czxfVHA+OjppbXBsZW1lbnRlZCBfTW92YWJsZTsKKyNlbmRpZgorICBpZiAoX19uICE9IDApIHsKKyAgICBpZiAoc2l6ZV90eXBlKHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLl9NX2RhdGEgLSB0aGlzLT5fTV9maW5pc2gpID49IF9fbikgeworICAgICAgX01fZmlsbF9pbnNlcnRfYXV4KF9fcG9zLCBfX24sIF9feCwgX01vdmFibGUoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX190eXBlX3RyYWl0czxfVHA+OjpoYXNfdHJpdmlhbF9hc3NpZ25tZW50X29wZXJhdG9yIF9Ucml2aWFsQ29weTsKKyAgICAgIF9NX2luc2VydF9vdmVyZmxvdyhfX3BvcywgX194LCBfVHJpdmlhbENvcHkoKSwgX19uKTsKKyAgICB9CisgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgordmVjdG9yPF9UcCwgX0FsbG9jPiYgdmVjdG9yPF9UcCwgX0FsbG9jPjo6b3BlcmF0b3IgPSAoY29uc3QgdmVjdG9yPF9UcCwgX0FsbG9jPiYgX194KSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgX190eXBlX3RyYWl0czxfVHA+OjpoYXNfdHJpdmlhbF9hc3NpZ25tZW50X29wZXJhdG9yIF9Ucml2aWFsQ29weTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX3R5cGVfdHJhaXRzPF9UcD46Omhhc190cml2aWFsX2NvcHlfY29uc3RydWN0b3IgX1RyaXZpYWxVQ29weTsKKyAgaWYgKCZfX3ggIT0gdGhpcykgeworICAgIGNvbnN0IHNpemVfdHlwZSBfX3hsZW4gPSBfX3guc2l6ZSgpOworICAgIGlmIChfX3hsZW4gPiBjYXBhY2l0eSgpKSB7CisgICAgICBzaXplX3R5cGUgX19sZW4gPSBfX3hsZW47CisgICAgICBwb2ludGVyIF9fdG1wID0gX01fYWxsb2NhdGVfYW5kX2NvcHkoX19sZW4sIF9fQ09OU1RfQ0FTVChjb25zdF9wb2ludGVyLCBfX3guX01fc3RhcnQpICsgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19DT05TVF9DQVNUKGNvbnN0X3BvaW50ZXIsIF9feC5fTV9maW5pc2gpICsgMCk7CisgICAgICBfTV9jbGVhcigpOworICAgICAgdGhpcy0+X01fc3RhcnQgPSBfX3RtcDsKKyAgICAgIHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLl9NX2RhdGEgPSB0aGlzLT5fTV9zdGFydCArIF9fbGVuOworICAgIH0gZWxzZSBpZiAoc2l6ZSgpID49IF9feGxlbikgeworICAgICAgcG9pbnRlciBfX2kgPSBfU1RMUF9QUklWIF9fY29weV9wdHJzKF9fQ09OU1RfQ0FTVChjb25zdF9wb2ludGVyLCBfX3guX01fc3RhcnQpICsgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0NPTlNUX0NBU1QoY29uc3RfcG9pbnRlciwgX194Ll9NX2ZpbmlzaCkgKyAwLCB0aGlzLT5fTV9zdGFydCwgX1RyaXZpYWxDb3B5KCkpOworICAgICAgX1NUTFBfU1REOjpfRGVzdHJveV9SYW5nZShfX2ksIHRoaXMtPl9NX2ZpbmlzaCk7CisgICAgfSBlbHNlIHsKKyAgICAgIF9TVExQX1BSSVYgX19jb3B5X3B0cnMoX19DT05TVF9DQVNUKGNvbnN0X3BvaW50ZXIsIF9feC5fTV9zdGFydCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fQ09OU1RfQ0FTVChjb25zdF9wb2ludGVyLCBfX3guX01fc3RhcnQpICsgc2l6ZSgpLCB0aGlzLT5fTV9zdGFydCwgX1RyaXZpYWxDb3B5KCkpOworICAgICAgX1NUTFBfUFJJViBfX3Vjb3B5X3B0cnMoX19DT05TVF9DQVNUKGNvbnN0X3BvaW50ZXIsIF9feC5fTV9zdGFydCkgKyBzaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0NPTlNUX0NBU1QoY29uc3RfcG9pbnRlciwgX194Ll9NX2ZpbmlzaCkgKyAwLCB0aGlzLT5fTV9maW5pc2gsIF9Ucml2aWFsVUNvcHkoKSk7CisgICAgfQorICAgIHRoaXMtPl9NX2ZpbmlzaCA9IHRoaXMtPl9NX3N0YXJ0ICsgX194bGVuOworICB9CisgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgordm9pZCB2ZWN0b3I8X1RwLCBfQWxsb2M+OjpfTV9maWxsX2Fzc2lnbihzaXplX3QgX19uLCBjb25zdCBfVHAmIF9fdmFsKSB7CisgIGlmIChfX24gPiBjYXBhY2l0eSgpKSB7CisgICAgdmVjdG9yPF9UcCwgX0FsbG9jPiBfX3RtcChfX24sIF9fdmFsLCBnZXRfYWxsb2NhdG9yKCkpOworICAgIF9fdG1wLnN3YXAoKnRoaXMpOworICB9IGVsc2UgaWYgKF9fbiA+IHNpemUoKSkgeworICAgIGZpbGwoYmVnaW4oKSwgZW5kKCksIF9fdmFsKTsKKyAgICB0aGlzLT5fTV9maW5pc2ggPSBfU1RMUF9QUklWIF9fdW5pbml0aWFsaXplZF9maWxsX24odGhpcy0+X01fZmluaXNoLCBfX24gLSBzaXplKCksIF9fdmFsKTsKKyAgfSBlbHNlCisgICAgZXJhc2UoX1NUTFBfUFJJViBfX2ZpbGxfbihiZWdpbigpLCBfX24sIF9fdmFsKSwgZW5kKCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CitfX2l0ZXJhdG9yX18KK3ZlY3RvcjxfVHAsIF9BbGxvYz46Omluc2VydChpdGVyYXRvciBfX3BvcywgY29uc3QgX1RwJiBfX3gpIHsKKyAgc2l6ZV90eXBlIF9fbiA9IF9fcG9zIC0gYmVnaW4oKTsKKyAgX01fZmlsbF9pbnNlcnQoX19wb3MsIDEsIF9feCk7CisgIHJldHVybiBiZWdpbigpICsgX19uOworfQorCisjdW5kZWYgX19pdGVyYXRvcl9fCisKKyNpZiBkZWZpbmVkICh2ZWN0b3IpCisjICB1bmRlZiB2ZWN0b3IKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorI2VuZGlmCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2VuZGlmIC8qICBfU1RMUF9WRUNUT1JfQyAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdGwvX3ZlY3Rvci5oIGIvc3RscG9ydC9zdGwvX3ZlY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMjQzZWYKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9fdmVjdG9yLmgKQEAgLTAsMCArMSw3NzMgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisvKiBOT1RFOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBTVEwgaGVhZGVycy4KKyAqICAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuCisgKi8KKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9WRUNUT1JfSAorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9WRUNUT1JfSAorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0FMR09CQVNFX0gKKyMgIGluY2x1ZGUgPHN0bC9fYWxnb2Jhc2UuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0FMTE9DX0gKKyMgIGluY2x1ZGUgPHN0bC9fYWxsb2MuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0lURVJBVE9SX0gKKyMgIGluY2x1ZGUgPHN0bC9faXRlcmF0b3IuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX1VOSU5JVElBTElaRURfSAorIyAgaW5jbHVkZSA8c3RsL191bmluaXRpYWxpemVkLmg+CisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKKy8vIFRoZSB2ZWN0b3IgYmFzZSBjbGFzcyBzZXJ2ZXMgb25lIHB1cnBvc2UsIGl0cyBjb25zdHJ1Y3RvciBhbmQKKy8vIGRlc3RydWN0b3IgYWxsb2NhdGUgKGJ1dCBkb24ndCBpbml0aWFsaXplKSBzdG9yYWdlLiAgVGhpcyBtYWtlcworLy8gZXhjZXB0aW9uIHNhZmV0eSBlYXNpZXIuCisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgorY2xhc3MgX1ZlY3Rvcl9iYXNlIHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBfVmVjdG9yX2Jhc2U8X1RwLCBfQWxsb2M+IF9TZWxmOworICBfU1RMUF9GT1JDRV9BTExPQ0FUT1JTKF9UcCwgX0FsbG9jKQorICB0eXBlZGVmIF9BbGxvYyBhbGxvY2F0b3JfdHlwZTsKKyAgdHlwZWRlZiBfVHAqIHBvaW50ZXI7CisgIHR5cGVkZWYgX1NUTFBfYWxsb2NfcHJveHk8cG9pbnRlciwgX1RwLCBhbGxvY2F0b3JfdHlwZT4gX0FsbG9jUHJveHk7CisKKyAgX1ZlY3Rvcl9iYXNlKGNvbnN0IF9BbGxvYyYgX19hKQorICAgIDogX01fc3RhcnQoMCksIF9NX2ZpbmlzaCgwKSwgX01fZW5kX29mX3N0b3JhZ2UoX19hLCAwKSB7fQorCisgIF9WZWN0b3JfYmFzZShzaXplX3QgX19uLCBjb25zdCBfQWxsb2MmIF9fYSkKKyAgICA6IF9NX3N0YXJ0KDApLCBfTV9maW5pc2goMCksIF9NX2VuZF9vZl9zdG9yYWdlKF9fYSwgMCkgeworICAgIF9NX3N0YXJ0ID0gX01fZW5kX29mX3N0b3JhZ2UuYWxsb2NhdGUoX19uLCBfX24pOworICAgIF9NX2ZpbmlzaCA9IF9NX3N0YXJ0OworICAgIF9NX2VuZF9vZl9zdG9yYWdlLl9NX2RhdGEgPSBfTV9zdGFydCArIF9fbjsKKyAgICBfU1RMUF9NUFdGSVhfVFJZIF9TVExQX01QV0ZJWF9DQVRDSAorICB9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKKyAgX1ZlY3Rvcl9iYXNlKF9fbW92ZV9zb3VyY2U8X1NlbGY+IHNyYykKKyAgICA6IF9NX3N0YXJ0KHNyYy5nZXQoKS5fTV9zdGFydCksIF9NX2ZpbmlzaChzcmMuZ2V0KCkuX01fZmluaXNoKSwKKyAgICAgIF9NX2VuZF9vZl9zdG9yYWdlKF9fbW92ZV9zb3VyY2U8X0FsbG9jUHJveHk+KHNyYy5nZXQoKS5fTV9lbmRfb2Zfc3RvcmFnZSkpIHsKKyAgICAvL1NldCB0aGUgc291cmNlIGFzIGVtcHR5OgorICAgIHNyYy5nZXQoKS5fTV9maW5pc2ggPSBzcmMuZ2V0KCkuX01fZW5kX29mX3N0b3JhZ2UuX01fZGF0YSA9IHNyYy5nZXQoKS5fTV9zdGFydCA9IDA7CisgIH0KKyNlbmRpZgorCisgIH5fVmVjdG9yX2Jhc2UoKSB7CisgICAgaWYgKF9NX3N0YXJ0ICE9IF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQocG9pbnRlcikpCisgICAgICBfTV9lbmRfb2Zfc3RvcmFnZS5kZWFsbG9jYXRlKF9NX3N0YXJ0LCBfTV9lbmRfb2Zfc3RvcmFnZS5fTV9kYXRhIC0gX01fc3RhcnQpOworICB9CisKK3Byb3RlY3RlZDoKKyAgdm9pZCBfU1RMUF9GVU5DVElPTl9USFJPV1MgX01fdGhyb3dfbGVuZ3RoX2Vycm9yKCkgY29uc3Q7CisgIHZvaWQgX1NUTFBfRlVOQ1RJT05fVEhST1dTIF9NX3Rocm93X291dF9vZl9yYW5nZSgpIGNvbnN0OworCisgIHBvaW50ZXIgX01fc3RhcnQ7CisgIHBvaW50ZXIgX01fZmluaXNoOworICBfQWxsb2NQcm94eSBfTV9lbmRfb2Zfc3RvcmFnZTsKK307CisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUFRSX1NQRUNJQUxJWkFUSU9OUykKKyMgIGRlZmluZSB2ZWN0b3IgX1NUTFBfUFRSX0lNUExfTkFNRSh2ZWN0b3IpCisjZWxpZiBkZWZpbmVkIChfU1RMUF9ERUJVRykKKyMgIGRlZmluZSB2ZWN0b3IgX1NUTFBfTk9OX0RCR19OQU1FKHZlY3RvcikKKyNlbHNlCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBfU1RMUF9ERkxfVE1QTF9QQVJBTShfQWxsb2MsIGFsbG9jYXRvcjxfVHA+KSA+CitjbGFzcyB2ZWN0b3IgOiBwcm90ZWN0ZWQgX1NUTFBfUFJJViBfVmVjdG9yX2Jhc2U8X1RwLCBfQWxsb2M+CisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKSAmJiAhZGVmaW5lZCAodmVjdG9yKQorICAgICAgICAgICAgICwgcHVibGljIF9fc3RscG9ydF9jbGFzczx2ZWN0b3I8X1RwLCBfQWxsb2M+ID4KKyNlbmRpZgoreworcHJpdmF0ZToKKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9WZWN0b3JfYmFzZTxfVHAsIF9BbGxvYz4gX0Jhc2U7CisgIHR5cGVkZWYgdmVjdG9yPF9UcCwgX0FsbG9jPiBfU2VsZjsKK3B1YmxpYzoKKyAgX1NUTFBfRk9SQ0VfQUxMT0NBVE9SUyhfVHAsIF9BbGxvYykKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7CisKKyAgdHlwZWRlZiBfVHAgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiB2YWx1ZV90eXBlKiBwb2ludGVyOworICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUqIGNvbnN0X3BvaW50ZXI7CisgIHR5cGVkZWYgdmFsdWVfdHlwZSogaXRlcmF0b3I7CisgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSogY29uc3RfaXRlcmF0b3I7CisKKyAgdHlwZWRlZiB2YWx1ZV90eXBlJiByZWZlcmVuY2U7CisgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSYgY29uc3RfcmVmZXJlbmNlOworICB0eXBlZGVmIHNpemVfdCBzaXplX3R5cGU7CisgIHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKKyAgdHlwZWRlZiByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyBfSXRlcmF0b3JfY2F0ZWdvcnk7CisKKyAgX1NUTFBfREVDTEFSRV9SQU5ET01fQUNDRVNTX1JFVkVSU0VfSVRFUkFUT1JTOworCisgIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdAorICB7IHJldHVybiBfU1RMUF9DT05WRVJUX0FMTE9DQVRPUigoY29uc3QgYWxsb2NhdG9yX3R5cGUmKXRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLCBfVHApOyB9CisKK3ByaXZhdGU6CisjaWYgZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKKyAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgX01vdmFibGU7CisjZW5kaWYKKworICAvLyBoYW5kbGVzIGluc2VydGlvbnMgb24gb3ZlcmZsb3cKKyAgdm9pZCBfTV9pbnNlcnRfb3ZlcmZsb3dfYXV4KHBvaW50ZXIgX19wb3MsIGNvbnN0IF9UcCYgX194LCBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qX01vdmFibGUqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX2ZpbGxfbGVuLCBib29sIF9fYXRlbmQpOworICB2b2lkIF9NX2luc2VydF9vdmVyZmxvd19hdXgocG9pbnRlciBfX3BvcywgY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKl9Nb3ZhYmxlKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19maWxsX2xlbiwgYm9vbCBfX2F0ZW5kKSB7CisgICAgLy9XZSBuZWVkIHRvIHRha2UgY2FyZSBvZiBzZWxmIHJlZmVyZW5jaW5nIGhlcmU6CisgICAgaWYgKF9NX2lzX2luc2lkZShfX3gpKSB7CisgICAgICB2YWx1ZV90eXBlIF9feF9jb3B5ID0gX194OworICAgICAgX01faW5zZXJ0X292ZXJmbG93X2F1eChfX3BvcywgX194X2NvcHksIF9fZmFsc2VfdHlwZSgpLCBfX2ZpbGxfbGVuLCBfX2F0ZW5kKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgX01faW5zZXJ0X292ZXJmbG93X2F1eChfX3BvcywgX194LCBfX2ZhbHNlX3R5cGUoKSwgX19maWxsX2xlbiwgX19hdGVuZCk7CisgIH0KKworICB2b2lkIF9NX2luc2VydF9vdmVyZmxvdyhwb2ludGVyIF9fcG9zLCBjb25zdCBfVHAmIF9feCwgY29uc3QgX19mYWxzZV90eXBlJiAvKl9Ucml2aWFsQ29weSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19maWxsX2xlbiwgYm9vbCBfX2F0ZW5kID0gZmFsc2UpIHsKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fbW92ZV90cmFpdHM8X1RwPjo6aW1wbGVtZW50ZWQgX01vdmFibGU7CisjZW5kaWYKKyAgICBfTV9pbnNlcnRfb3ZlcmZsb3dfYXV4KF9fcG9zLCBfX3gsIF9Nb3ZhYmxlKCksIF9fZmlsbF9sZW4sIF9fYXRlbmQpOworICB9CisgIHZvaWQgX01faW5zZXJ0X292ZXJmbG93KHBvaW50ZXIgX19wb3MsIGNvbnN0IF9UcCYgX194LCBjb25zdCBfX3RydWVfdHlwZSYgLypfVHJpdmlhbENvcHkqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fZmlsbF9sZW4sIGJvb2wgX19hdGVuZCA9IGZhbHNlKTsKKyAgdm9pZCBfTV9yYW5nZV9jaGVjayhzaXplX3R5cGUgX19uKSBjb25zdCB7CisgICAgaWYgKF9fbiA+PSBzaXplX3R5cGUodGhpcy0+X01fZmluaXNoIC0gdGhpcy0+X01fc3RhcnQpKQorICAgICAgdGhpcy0+X01fdGhyb3dfb3V0X29mX3JhbmdlKCk7CisgIH0KKworICBzaXplX3R5cGUgX01fY29tcHV0ZV9uZXh0X3NpemUoc2l6ZV90eXBlIF9fbikgeworICAgIGNvbnN0IHNpemVfdHlwZSBfX3NpemUgPSBzaXplKCk7CisgICAgaWYgKF9fbiA+IG1heF9zaXplKCkgLSBfX3NpemUpCisgICAgICB0aGlzLT5fTV90aHJvd19sZW5ndGhfZXJyb3IoKTsKKyAgICBzaXplX3R5cGUgX19sZW4gPSBfX3NpemUgKyAobWF4KShfX24sIF9fc2l6ZSk7CisgICAgaWYgKF9fbGVuID4gbWF4X3NpemUoKSB8fCBfX2xlbiA8IF9fc2l6ZSkKKyAgICAgIF9fbGVuID0gbWF4X3NpemUoKTsgLy8gb3ZlcmZsb3cKKyAgICByZXR1cm4gX19sZW47CisgIH0KKworcHVibGljOgorICBpdGVyYXRvciBiZWdpbigpICAgICAgICAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX3N0YXJ0OyB9CisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gdGhpcy0+X01fc3RhcnQ7IH0KKyAgaXRlcmF0b3IgZW5kKCkgICAgICAgICAgICAgICB7IHJldHVybiB0aGlzLT5fTV9maW5pc2g7IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgICB7IHJldHVybiB0aGlzLT5fTV9maW5pc2g7IH0KKworICByZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpICAgICAgICAgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0ICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorICByZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSAgICAgICAgICAgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0ICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKworICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0ICAgICAgICB7IHJldHVybiBzaXplX3R5cGUodGhpcy0+X01fZmluaXNoIC0gdGhpcy0+X01fc3RhcnQpOyB9CisgIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IHsKKyAgICBzaXplX3R5cGUgX192ZWN0b3JfbWF4X3NpemUgPSBzaXplX3R5cGUoLTEpIC8gc2l6ZW9mKF9UcCk7CisgICAgdHlwZW5hbWUgYWxsb2NhdG9yX3R5cGU6OnNpemVfdHlwZSBfX2FsbG9jX21heF9zaXplID0gdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UubWF4X3NpemUoKTsKKyAgICByZXR1cm4gKF9fYWxsb2NfbWF4X3NpemUgPCBfX3ZlY3Rvcl9tYXhfc2l6ZSk/X19hbGxvY19tYXhfc2l6ZTpfX3ZlY3Rvcl9tYXhfc2l6ZTsKKyAgfQorCisgIHNpemVfdHlwZSBjYXBhY2l0eSgpIGNvbnN0ICAgIHsgcmV0dXJuIHNpemVfdHlwZSh0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5fTV9kYXRhIC0gdGhpcy0+X01fc3RhcnQpOyB9CisgIGJvb2wgZW1wdHkoKSBjb25zdCAgICAgICAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX3N0YXJ0ID09IHRoaXMtPl9NX2ZpbmlzaDsgfQorCisgIHJlZmVyZW5jZSBvcGVyYXRvcltdKHNpemVfdHlwZSBfX24pIHsgcmV0dXJuICooYmVnaW4oKSArIF9fbik7IH0KKyAgY29uc3RfcmVmZXJlbmNlIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fbikgY29uc3QgeyByZXR1cm4gKihiZWdpbigpICsgX19uKTsgfQorCisgIHJlZmVyZW5jZSBmcm9udCgpICAgICAgICAgICAgIHsgcmV0dXJuICpiZWdpbigpOyB9CisgIGNvbnN0X3JlZmVyZW5jZSBmcm9udCgpIGNvbnN0IHsgcmV0dXJuICpiZWdpbigpOyB9CisgIHJlZmVyZW5jZSBiYWNrKCkgICAgICAgICAgICAgIHsgcmV0dXJuICooZW5kKCkgLSAxKTsgfQorICBjb25zdF9yZWZlcmVuY2UgYmFjaygpIGNvbnN0ICB7IHJldHVybiAqKGVuZCgpIC0gMSk7IH0KKworICByZWZlcmVuY2UgYXQoc2l6ZV90eXBlIF9fbikgeyBfTV9yYW5nZV9jaGVjayhfX24pOyByZXR1cm4gKCp0aGlzKVtfX25dOyB9CisgIGNvbnN0X3JlZmVyZW5jZSBhdChzaXplX3R5cGUgX19uKSBjb25zdCB7IF9NX3JhbmdlX2NoZWNrKF9fbik7IHJldHVybiAoKnRoaXMpW19fbl07IH0KKworI2lmICFkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorICBleHBsaWNpdCB2ZWN0b3IoY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisjZWxzZQorICB2ZWN0b3IoKQorICAgIDogX1NUTFBfUFJJViBfVmVjdG9yX2Jhc2U8X1RwLCBfQWxsb2M+KGFsbG9jYXRvcl90eXBlKCkpIHt9CisgIHZlY3Rvcihjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorI2VuZGlmCisgICAgOiBfU1RMUF9QUklWIF9WZWN0b3JfYmFzZTxfVHAsIF9BbGxvYz4oX19hKSB7fQorCisjaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCitwcml2YXRlOgorICAvL1dlIGFsd2F5cyBjYWxsIF9NX2luaXRpYWxpemUgd2l0aCBvbmx5IDEgcGFyYW1ldGVyLiBEZWZhdWx0IHBhcmFtZXRlcgorICAvL2lzIHVzZWQgdG8gYWxsb3cgZXhwbGljaXQgaW5zdGFuY2lhdGlvbiBvZiB2ZWN0b3Igd2l0aCB0eXBlcyB3aXRoIG5vCisgIC8vZGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgdm9pZCBfTV9pbml0aWFsaXplKHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX192YWwgPSBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKF9UcCkpCisgIHsgdGhpcy0+X01fZmluaXNoID0gX1NUTFBfUFJJViBfX3VuaW5pdGlhbGl6ZWRfaW5pdCh0aGlzLT5fTV9zdGFydCwgX19uLCBfX3ZhbCk7IH0KK3B1YmxpYzoKKyAgZXhwbGljaXQgdmVjdG9yKHNpemVfdHlwZSBfX24pCisgICAgOiBfU1RMUF9QUklWIF9WZWN0b3JfYmFzZTxfVHAsIF9BbGxvYz4oX19uLCBhbGxvY2F0b3JfdHlwZSgpKQorICB7IF9NX2luaXRpYWxpemUoX19uKTsgfQorICB2ZWN0b3Ioc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3ZhbCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisjZWxzZQorICBleHBsaWNpdCB2ZWN0b3Ioc2l6ZV90eXBlIF9fbikKKyAgICA6IF9TVExQX1BSSVYgX1ZlY3Rvcl9iYXNlPF9UcCwgX0FsbG9jPihfX24sIGFsbG9jYXRvcl90eXBlKCkpCisgIHsgdGhpcy0+X01fZmluaXNoID0gX1NUTFBfUFJJViBfX3VuaW5pdGlhbGl6ZWRfaW5pdCh0aGlzLT5fTV9zdGFydCwgX19uLCBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKF9UcCkpOyB9CisgIHZlY3RvcihzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9fdmFsKQorICAgIDogX1NUTFBfUFJJViBfVmVjdG9yX2Jhc2U8X1RwLCBfQWxsb2M+KF9fbiwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgeyB0aGlzLT5fTV9maW5pc2ggPSBfU1RMUF9QUklWIF9fdW5pbml0aWFsaXplZF9maWxsX24odGhpcy0+X01fc3RhcnQsIF9fbiwgX192YWwpOyB9CisgIHZlY3RvcihzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9fdmFsLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorI2VuZGlmCisgICAgOiBfU1RMUF9QUklWIF9WZWN0b3JfYmFzZTxfVHAsIF9BbGxvYz4oX19uLCBfX2EpCisgIHsgdGhpcy0+X01fZmluaXNoID0gX1NUTFBfUFJJViBfX3VuaW5pdGlhbGl6ZWRfZmlsbF9uKHRoaXMtPl9NX3N0YXJ0LCBfX24sIF9fdmFsKTsgfQorCisgIHZlY3Rvcihjb25zdCBfU2VsZiYgX194KQorICAgIDogX1NUTFBfUFJJViBfVmVjdG9yX2Jhc2U8X1RwLCBfQWxsb2M+KF9feC5zaXplKCksIF9feC5nZXRfYWxsb2NhdG9yKCkpIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fdHlwZV90cmFpdHM8X1RwPjo6aGFzX3RyaXZpYWxfY29weV9jb25zdHJ1Y3RvciBfVHJpdmlhbFVDb3B5OworICAgIHRoaXMtPl9NX2ZpbmlzaCA9IF9TVExQX1BSSVYgX191Y29weV9wdHJzKF9feC5iZWdpbigpLCBfX3guZW5kKCksIHRoaXMtPl9NX3N0YXJ0LCBfVHJpdmlhbFVDb3B5KCkpOworICB9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKKyAgdmVjdG9yKF9fbW92ZV9zb3VyY2U8X1NlbGY+IHNyYykKKyAgICA6IF9TVExQX1BSSVYgX1ZlY3Rvcl9iYXNlPF9UcCwgX0FsbG9jPihfX21vdmVfc291cmNlPF9CYXNlPihzcmMuZ2V0KCkpKQorICB7fQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorcHJpdmF0ZToKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2VyPgorICB2b2lkIF9NX2luaXRpYWxpemVfYXV4KF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX192YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX190cnVlX3R5cGUmIC8qX0lzSW50ZWdyYWwqLykgeworICAgIHNpemVfdHlwZSBfX3JlYWxfbiA9IF9fbjsKKyAgICB0aGlzLT5fTV9zdGFydCA9IHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLmFsbG9jYXRlKF9fbiwgX19yZWFsX24pOworICAgIHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLl9NX2RhdGEgPSB0aGlzLT5fTV9zdGFydCArIF9fcmVhbF9uOworICAgIHRoaXMtPl9NX2ZpbmlzaCA9IF9TVExQX1BSSVYgX191bmluaXRpYWxpemVkX2ZpbGxfbih0aGlzLT5fTV9zdGFydCwgX19uLCBfX3ZhbCk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZvaWQgX01faW5pdGlhbGl6ZV9hdXgoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypfSXNJbnRlZ3JhbCovKQorICB7IF9NX3JhbmdlX2luaXRpYWxpemUoX19maXJzdCwgX19sYXN0LCBfU1RMUF9JVEVSQVRPUl9DQVRFR09SWShfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvcikpOyB9CisKK3B1YmxpYzoKKyAgLy8gQ2hlY2sgd2hldGhlciBpdCdzIGFuIGludGVncmFsIHR5cGUuICBJZiBzbywgaXQncyBub3QgYW4gaXRlcmF0b3IuCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgdmVjdG9yKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgX1NUTFBfQUxMT0NBVE9SX1RZUEVfREZMICkKKyAgICA6IF9TVExQX1BSSVYgX1ZlY3Rvcl9iYXNlPF9UcCwgX0FsbG9jPihfX2EpIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0ludGVncmFsPF9JbnB1dEl0ZXJhdG9yPjo6X1JldCBfSW50ZWdyYWw7CisgICAgX01faW5pdGlhbGl6ZV9hdXgoX19maXJzdCwgX19sYXN0LCBfSW50ZWdyYWwoKSk7CisgIH0KKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfTkVFRFNfRVhUUkFfVEVNUExBVEVfQ09OU1RSVUNUT1JTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZlY3RvcihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgOiBfU1RMUF9QUklWIF9WZWN0b3JfYmFzZTxfVHAsIF9BbGxvYz4oYWxsb2NhdG9yX3R5cGUoKSkgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lzSW50ZWdyYWw8X0lucHV0SXRlcmF0b3I+OjpfUmV0IF9JbnRlZ3JhbDsKKyAgICBfTV9pbml0aWFsaXplX2F1eChfX2ZpcnN0LCBfX2xhc3QsIF9JbnRlZ3JhbCgpKTsKKyAgfQorIyAgZW5kaWYgLyogX1NUTFBfTkVFRFNfRVhUUkFfVEVNUExBVEVfQ09OU1RSVUNUT1JTICovCisKKyNlbHNlIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKyAgdmVjdG9yKGNvbnN0IF9UcCogX19maXJzdCwgY29uc3QgX1RwKiBfX2xhc3QsCisgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9TVExQX1BSSVYgX1ZlY3Rvcl9iYXNlPF9UcCwgX0FsbG9jPihfX2xhc3QgLSBfX2ZpcnN0LCBfX2EpIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fdHlwZV90cmFpdHM8X1RwPjo6aGFzX3RyaXZpYWxfY29weV9jb25zdHJ1Y3RvciBfVHJpdmlhbFVDb3B5OworICAgIHRoaXMtPl9NX2ZpbmlzaCA9IF9TVExQX1BSSVYgX191Y29weV9wdHJzKF9fZmlyc3QsIF9fbGFzdCwgdGhpcy0+X01fc3RhcnQsIF9Ucml2aWFsVUNvcHkoKSk7CisgIH0KKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisKKyAgLy9BcyB0aGUgdmVjdG9yIGNvbnRhaW5lciBpcyBhIGJhY2sgaW5zZXJ0IG9yaWVudGVkIGNvbnRhaW5lciBpdAorICAvL3NlZW1zIHJhdGhlciBsb2dpY2FsIHRvIGRlc3Ryb3kgZWxlbWVudHMgaW4gcmV2ZXJzZSBvcmRlci4KKyAgfnZlY3RvcigpIHsgX1NUTFBfU1REOjpfRGVzdHJveV9SYW5nZShyYmVnaW4oKSwgcmVuZCgpKTsgfQorCisgIF9TZWxmJiBvcGVyYXRvcj0oY29uc3QgX1NlbGYmIF9feCk7CisKKyAgdm9pZCByZXNlcnZlKHNpemVfdHlwZSBfX24pOworCisgIC8vIGFzc2lnbigpLCBhIGdlbmVyYWxpemVkIGFzc2lnbm1lbnQgbWVtYmVyIGZ1bmN0aW9uLiAgVHdvCisgIC8vIHZlcnNpb25zOiBvbmUgdGhhdCB0YWtlcyBhIGNvdW50LCBhbmQgb25lIHRoYXQgdGFrZXMgYSByYW5nZS4KKyAgLy8gVGhlIHJhbmdlIHZlcnNpb24gaXMgYSBtZW1iZXIgdGVtcGxhdGUsIHNvIHdlIGRpc3BhdGNoIG9uIHdoZXRoZXIKKyAgLy8gb3Igbm90IHRoZSB0eXBlIGlzIGFuIGludGVnZXIuCisKKyAgdm9pZCBhc3NpZ24oc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3ZhbCkgeyBfTV9maWxsX2Fzc2lnbihfX24sIF9fdmFsKTsgfQorICB2b2lkIF9NX2ZpbGxfYXNzaWduKHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX192YWwpOworCisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcj4KKyAgdm9pZCBfTV9hc3NpZ25fYXV4KF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LCBjb25zdCBmb3J3YXJkX2l0ZXJhdG9yX3RhZyAmKSB7CisjZWxzZQorICB2b2lkIGFzc2lnbihjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpIHsKKyAgICB0eXBlZGVmIGNvbnN0X2l0ZXJhdG9yIF9Gb3J3YXJkSXRlcjsKKyNlbmRpZgorICAgIGNvbnN0IHNpemVfdHlwZSBfX2xlbiA9IF9TVExQX1NURDo6ZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KTsKKyAgICBpZiAoX19sZW4gPiBjYXBhY2l0eSgpKSB7CisgICAgICBzaXplX3R5cGUgX19uID0gX19sZW47CisgICAgICBpdGVyYXRvciBfX3RtcCA9IF9NX2FsbG9jYXRlX2FuZF9jb3B5KF9fbiwgX19maXJzdCwgX19sYXN0KTsKKyAgICAgIF9NX2NsZWFyKCk7CisgICAgICBfTV9zZXQoX190bXAsIF9fdG1wICsgX19sZW4sIF9fdG1wICsgX19uKTsKKyAgICB9CisgICAgZWxzZSBpZiAoc2l6ZSgpID49IF9fbGVuKSB7CisgICAgICBpdGVyYXRvciBfX25ld19maW5pc2ggPSBjb3B5KF9fZmlyc3QsIF9fbGFzdCwgdGhpcy0+X01fc3RhcnQpOworICAgICAgX1NUTFBfU1REOjpfRGVzdHJveV9SYW5nZShfX25ld19maW5pc2gsIHRoaXMtPl9NX2ZpbmlzaCk7CisgICAgICB0aGlzLT5fTV9maW5pc2ggPSBfX25ld19maW5pc2g7CisgICAgfQorICAgIGVsc2UgeworICAgICAgX0ZvcndhcmRJdGVyIF9fbWlkID0gX19maXJzdDsKKyAgICAgIF9TVExQX1NURDo6YWR2YW5jZShfX21pZCwgc2l6ZSgpKTsKKyAgICAgIF9TVExQX1NURDo6Y29weShfX2ZpcnN0LCBfX21pZCwgdGhpcy0+X01fc3RhcnQpOworICAgICAgdGhpcy0+X01fZmluaXNoID0gX1NUTFBfU1REOjp1bmluaXRpYWxpemVkX2NvcHkoX19taWQsIF9fbGFzdCwgdGhpcy0+X01fZmluaXNoKTsKKyAgICB9CisgIH0KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgorICB2b2lkIF9NX2Fzc2lnbl9hdXgoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0X2l0ZXJhdG9yX3RhZyAmKSB7CisgICAgaXRlcmF0b3IgX19jdXIgPSBiZWdpbigpOworICAgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3QgJiYgX19jdXIgIT0gZW5kKCk7ICsrX19jdXIsICsrX19maXJzdCkKKyAgICAgICpfX2N1ciA9ICpfX2ZpcnN0OworICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKyAgICAgIGVyYXNlKF9fY3VyLCBlbmQoKSk7CisgICAgZWxzZQorICAgICAgaW5zZXJ0KGVuZCgpLCBfX2ZpcnN0LCBfX2xhc3QpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2VyPgorICB2b2lkIF9NX2Fzc2lnbl9kaXNwYXRjaChfSW50ZWdlciBfX24sIF9JbnRlZ2VyIF9fdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX3RydWVfdHlwZSYgLypfSXNJbnRlZ3JhbCovKQorICB7IF9NX2ZpbGxfYXNzaWduKF9fbiwgX192YWwpOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXI+CisgIHZvaWQgX01fYXNzaWduX2Rpc3BhdGNoKF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypfSXNJbnRlZ3JhbCovKQorICB7IF9NX2Fzc2lnbl9hdXgoX19maXJzdCwgX19sYXN0LCBfU1RMUF9JVEVSQVRPUl9DQVRFR09SWShfX2ZpcnN0LCBfSW5wdXRJdGVyKSk7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZvaWQgYXNzaWduKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lzSW50ZWdyYWw8X0lucHV0SXRlcmF0b3I+OjpfUmV0IF9JbnRlZ3JhbDsKKyAgICBfTV9hc3NpZ25fZGlzcGF0Y2goX19maXJzdCwgX19sYXN0LCBfSW50ZWdyYWwoKSk7CisgIH0KKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pICYmICFkZWZpbmVkIChfU1RMUF9OT19BTkFDSFJPTklTTVMpCisgIHZvaWQgcHVzaF9iYWNrKGNvbnN0IF9UcCYgX194ID0gX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRChfVHApKSB7CisjZWxzZQorICB2b2lkIHB1c2hfYmFjayhjb25zdCBfVHAmIF9feCkgeworI2VuZGlmCisgICAgaWYgKHRoaXMtPl9NX2ZpbmlzaCAhPSB0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5fTV9kYXRhKSB7CisgICAgICBfQ29weV9Db25zdHJ1Y3QodGhpcy0+X01fZmluaXNoLCBfX3gpOworICAgICAgKyt0aGlzLT5fTV9maW5pc2g7CisgICAgfQorICAgIGVsc2UgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3R5cGVfdHJhaXRzPF9UcD46Omhhc190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3IgX1RyaXZpYWxDb3B5OworICAgICAgX01faW5zZXJ0X292ZXJmbG93KHRoaXMtPl9NX2ZpbmlzaCwgX194LCBfVHJpdmlhbENvcHkoKSwgMSwgdHJ1ZSk7CisgICAgfQorICB9CisKKyNpZiAhZGVmaW5lZChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKSAmJiAhZGVmaW5lZChfU1RMUF9OT19BTkFDSFJPTklTTVMpCisgIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBfX3BvcywgY29uc3QgX1RwJiBfX3ggPSBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKF9UcCkpOworI2Vsc2UKKyAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBjb25zdCBfVHAmIF9feCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkgJiYgIWRlZmluZWQoX1NUTFBfTk9fQU5BQ0hST05JU01TKQorICB2b2lkIHB1c2hfYmFjaygpIHsgcHVzaF9iYWNrKF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQoX1RwKSk7IH0KKyAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zKSB7IHJldHVybiBpbnNlcnQoX19wb3MsIF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQoX1RwKSk7IH0KKyNlbmRpZgorCisgIHZvaWQgc3dhcChfU2VsZiYgX194KSB7CisgICAgX1NUTFBfU1REOjpzd2FwKHRoaXMtPl9NX3N0YXJ0LCBfX3guX01fc3RhcnQpOworICAgIF9TVExQX1NURDo6c3dhcCh0aGlzLT5fTV9maW5pc2gsIF9feC5fTV9maW5pc2gpOworICAgIHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLnN3YXAoX194Ll9NX2VuZF9vZl9zdG9yYWdlKTsKKyAgfQorI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QQVJUSUFMX1NQRUNfV09SS0FST1VORCkgJiYgIWRlZmluZWQgKF9TVExQX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUikKKyAgdm9pZCBfTV9zd2FwX3dvcmthcm91bmQoX1NlbGYmIF9feCkgeyBzd2FwKF9feCk7IH0KKyNlbmRpZgorCitwcml2YXRlOgorICB2b2lkIF9NX2ZpbGxfaW5zZXJ0X2F1eCAoaXRlcmF0b3IgX19wb3MsIHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX194LCBjb25zdCBfX3RydWVfdHlwZSYgLypfTW92YWJsZSovKTsKKyAgdm9pZCBfTV9maWxsX2luc2VydF9hdXggKGl0ZXJhdG9yIF9fcG9zLCBzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9feCwgY29uc3QgX19mYWxzZV90eXBlJiAvKl9Nb3ZhYmxlKi8pOworICB2b2lkIF9NX2ZpbGxfaW5zZXJ0IChpdGVyYXRvciBfX3Bvcywgc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3gpOworCisgIGJvb2wgX01faXNfaW5zaWRlKGNvbnN0IHZhbHVlX3R5cGUmIF9feCkgY29uc3QgeworICAgIHJldHVybiAoJl9feCA+PSB0aGlzLT5fTV9zdGFydCAmJiAmX194IDwgdGhpcy0+X01fZmluaXNoKTsKKyAgfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CisgIHZvaWQgX01fcmFuZ2VfaW5zZXJ0X3JlYWxsb2MoaXRlcmF0b3IgX19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKyNlbHNlCisgIHZvaWQgX01fcmFuZ2VfaW5zZXJ0X3JlYWxsb2MoaXRlcmF0b3IgX19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0LAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbikgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgX190eXBlX3RyYWl0czxfVHA+OjpoYXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yIF9Ucml2aWFsVUNvcHk7CisjaWYgIWRlZmluZWQgKF9TVExQX05PX01PVkVfU0VNQU5USUMpCisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX21vdmVfdHJhaXRzPF9UcD46OmltcGxlbWVudGVkIF9Nb3ZhYmxlOworI2VuZGlmCisgICAgc2l6ZV90eXBlIF9fbGVuID0gX01fY29tcHV0ZV9uZXh0X3NpemUoX19uKTsKKyAgICBwb2ludGVyIF9fbmV3X3N0YXJ0ID0gdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuYWxsb2NhdGUoX19sZW4sIF9fbGVuKTsKKyAgICBwb2ludGVyIF9fbmV3X2ZpbmlzaCA9IF9fbmV3X3N0YXJ0OworICAgIF9TVExQX1RSWSB7CisgICAgICBfX25ld19maW5pc2ggPSBfU1RMUF9QUklWIF9fdW5pbml0aWFsaXplZF9tb3ZlKHRoaXMtPl9NX3N0YXJ0LCBfX3BvcywgX19uZXdfc3RhcnQsIF9Ucml2aWFsVUNvcHkoKSwgX01vdmFibGUoKSk7CisgICAgICBfX25ld19maW5pc2ggPSB1bmluaXRpYWxpemVkX2NvcHkoX19maXJzdCwgX19sYXN0LCBfX25ld19maW5pc2gpOworICAgICAgX19uZXdfZmluaXNoID0gX1NUTFBfUFJJViBfX3VuaW5pdGlhbGl6ZWRfbW92ZShfX3BvcywgdGhpcy0+X01fZmluaXNoLCBfX25ld19maW5pc2gsIF9Ucml2aWFsVUNvcHkoKSwgX01vdmFibGUoKSk7CisgICAgfQorICAgIF9TVExQX1VOV0lORCgoX1NUTFBfU1REOjpfRGVzdHJveV9SYW5nZShfX25ld19zdGFydCxfX25ld19maW5pc2gpLAorICAgICAgICAgICAgICAgICAgdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuZGVhbGxvY2F0ZShfX25ld19zdGFydCxfX2xlbikpKQorICAgIF9NX2NsZWFyX2FmdGVyX21vdmUoKTsKKyAgICBfTV9zZXQoX19uZXdfc3RhcnQsIF9fbmV3X2ZpbmlzaCwgX19uZXdfc3RhcnQgKyBfX2xlbik7CisgIH0KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorICB2b2lkIF9NX3JhbmdlX2luc2VydF9hdXgoaXRlcmF0b3IgX19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorI2Vsc2UKKyAgdm9pZCBfTV9yYW5nZV9pbnNlcnRfYXV4KGl0ZXJhdG9yIF9fcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0LAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uLCBjb25zdCBfX3RydWVfdHlwZSYgLypfTW92YWJsZSovKSB7CisgICAgaXRlcmF0b3IgX19zcmMgPSB0aGlzLT5fTV9maW5pc2ggLSAxOworICAgIGl0ZXJhdG9yIF9fZHN0ID0gX19zcmMgKyBfX247CisgICAgZm9yICg7IF9fc3JjID49IF9fcG9zOyAtLV9fZHN0LCAtLV9fc3JjKSB7CisgICAgICBfU1RMUF9TVEQ6Ol9Nb3ZlX0NvbnN0cnVjdChfX2RzdCwgKl9fc3JjKTsKKyAgICAgIF9TVExQX1NURDo6X0Rlc3Ryb3lfTW92ZWQoX19zcmMpOworICAgIH0KKyAgICB1bmluaXRpYWxpemVkX2NvcHkoX19maXJzdCwgX19sYXN0LCBfX3Bvcyk7CisgICAgdGhpcy0+X01fZmluaXNoICs9IF9fbjsKKyAgfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CisgIHZvaWQgX01fcmFuZ2VfaW5zZXJ0X2F1eChpdGVyYXRvciBfX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisjZWxzZQorICB2b2lkIF9NX3JhbmdlX2luc2VydF9hdXgoaXRlcmF0b3IgX19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QsCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX24sIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypfTW92YWJsZSovKSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3R5cGVfdHJhaXRzPF9UcD46Omhhc190cml2aWFsX2NvcHlfY29uc3RydWN0b3IgX1RyaXZpYWxVQ29weTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fdHlwZV90cmFpdHM8X1RwPjo6aGFzX3RyaXZpYWxfYXNzaWdubWVudF9vcGVyYXRvciBfVHJpdmlhbENvcHk7CisgICAgY29uc3Qgc2l6ZV90eXBlIF9fZWxlbXNfYWZ0ZXIgPSB0aGlzLT5fTV9maW5pc2ggLSBfX3BvczsKKyAgICBwb2ludGVyIF9fb2xkX2ZpbmlzaCA9IHRoaXMtPl9NX2ZpbmlzaDsKKyAgICBpZiAoX19lbGVtc19hZnRlciA+IF9fbikgeworICAgICAgX1NUTFBfUFJJViBfX3Vjb3B5X3B0cnModGhpcy0+X01fZmluaXNoIC0gX19uLCB0aGlzLT5fTV9maW5pc2gsIHRoaXMtPl9NX2ZpbmlzaCwgX1RyaXZpYWxVQ29weSgpKTsKKyAgICAgIHRoaXMtPl9NX2ZpbmlzaCArPSBfX247CisgICAgICBfU1RMUF9QUklWIF9fY29weV9iYWNrd2FyZF9wdHJzKF9fcG9zLCBfX29sZF9maW5pc2ggLSBfX24sIF9fb2xkX2ZpbmlzaCwgX1RyaXZpYWxDb3B5KCkpOworICAgICAgY29weShfX2ZpcnN0LCBfX2xhc3QsIF9fcG9zKTsKKyAgICB9CisgICAgZWxzZSB7CisjaWYgZGVmaW5lZCAoIF9TVExQX01FTUJFUl9URU1QTEFURVMgKQorICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX21pZCA9IF9fZmlyc3Q7CisgICAgICBfU1RMUF9TVEQ6OmFkdmFuY2UoX19taWQsIF9fZWxlbXNfYWZ0ZXIpOworI2Vsc2UKKyAgICAgIGNvbnN0X3BvaW50ZXIgX19taWQgPSBfX2ZpcnN0ICsgX19lbGVtc19hZnRlcjsKKyNlbmRpZgorICAgICAgdW5pbml0aWFsaXplZF9jb3B5KF9fbWlkLCBfX2xhc3QsIHRoaXMtPl9NX2ZpbmlzaCk7CisgICAgICB0aGlzLT5fTV9maW5pc2ggKz0gX19uIC0gX19lbGVtc19hZnRlcjsKKyAgICAgIF9TVExQX1BSSVYgX191Y29weV9wdHJzKF9fcG9zLCBfX29sZF9maW5pc2gsIHRoaXMtPl9NX2ZpbmlzaCwgX1RyaXZpYWxVQ29weSgpKTsKKyAgICAgIHRoaXMtPl9NX2ZpbmlzaCArPSBfX2VsZW1zX2FmdGVyOworICAgICAgY29weShfX2ZpcnN0LCBfX21pZCwgX19wb3MpOworICAgIH0gLyogZWxlbXNfYWZ0ZXIgKi8KKyAgfQorCisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0ludGVnZXI+CisgIHZvaWQgX01faW5zZXJ0X2Rpc3BhdGNoKGl0ZXJhdG9yIF9fcG9zLCBfSW50ZWdlciBfX24sIF9JbnRlZ2VyIF9fdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX3RydWVfdHlwZSYpCisgIHsgX01fZmlsbF9pbnNlcnQoX19wb3MsIChzaXplX3R5cGUpIF9fbiwgKF9UcCkgX192YWwpOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICB2b2lkIF9NX2luc2VydF9kaXNwYXRjaChpdGVyYXRvciBfX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2ZhbHNlX3R5cGUmKQorICB7IF9NX3JhbmdlX2luc2VydChfX3BvcywgX19maXJzdCwgX19sYXN0LCBfU1RMUF9JVEVSQVRPUl9DQVRFR09SWShfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvcikpOyB9CisKK3B1YmxpYzoKKyAgLy8gQ2hlY2sgd2hldGhlciBpdCdzIGFuIGludGVncmFsIHR5cGUuICBJZiBzbywgaXQncyBub3QgYW4gaXRlcmF0b3IuCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lzSW50ZWdyYWw8X0lucHV0SXRlcmF0b3I+OjpfUmV0IF9JbnRlZ3JhbDsKKyAgICBfTV9pbnNlcnRfZGlzcGF0Y2goX19wb3MsIF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOworICB9CisKK3ByaXZhdGU6CisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgdm9pZCBfTV9yYW5nZV9pbnNlcnQoaXRlcmF0b3IgX19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5wdXRfaXRlcmF0b3JfdGFnICYpIHsKKyAgICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpIHsKKyAgICAgIF9fcG9zID0gaW5zZXJ0KF9fcG9zLCAqX19maXJzdCk7CisgICAgICArK19fcG9zOworICAgIH0KKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorICB2b2lkIF9NX3JhbmdlX2luc2VydChpdGVyYXRvciBfX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9yd2FyZF9pdGVyYXRvcl90YWcgJikgeworI2Vsc2UKK3B1YmxpYzoKKyAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3MsCisgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkgeworI2VuZGlmCisjaWYgIWRlZmluZWQgKF9TVExQX05PX01PVkVfU0VNQU5USUMpCisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX21vdmVfdHJhaXRzPF9UcD46OmltcGxlbWVudGVkIF9Nb3ZhYmxlOworI2VuZGlmCisgICAgLyogVGhpcyBtZXRob2QgZG8gbm90IGNoZWNrIHNlbGYgcmVmZXJlbmNpbmcuCisgICAgICogU3RhbmRhcmQgZm9yYmlkcyBpdCwgY2hlY2tlZCBieSB0aGUgZGVidWcgbW9kZS4KKyAgICAgKi8KKyAgICBpZiAoX19maXJzdCAhPSBfX2xhc3QpIHsKKyAgICAgIHNpemVfdHlwZSBfX24gPSBfU1RMUF9TVEQ6OmRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIGlmIChzaXplX3R5cGUodGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuX01fZGF0YSAtIHRoaXMtPl9NX2ZpbmlzaCkgPj0gX19uKSB7CisgICAgICAgIF9NX3JhbmdlX2luc2VydF9hdXgoX19wb3MsIF9fZmlyc3QsIF9fbGFzdCwgX19uLCBfTW92YWJsZSgpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBfTV9yYW5nZV9pbnNlcnRfcmVhbGxvYyhfX3BvcywgX19maXJzdCwgX19sYXN0LCBfX24pOworICAgICAgfQorICAgIH0KKyAgfQorCitwdWJsaWM6CisgIHZvaWQgaW5zZXJ0IChpdGVyYXRvciBfX3Bvcywgc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3gpCisgIHsgX01fZmlsbF9pbnNlcnQoX19wb3MsIF9fbiwgX194KTsgfQorCisgIHZvaWQgcG9wX2JhY2soKSB7CisgICAgLS10aGlzLT5fTV9maW5pc2g7CisgICAgX1NUTFBfU1REOjpfRGVzdHJveSh0aGlzLT5fTV9maW5pc2gpOworICB9CisKK3ByaXZhdGU6CisgIGl0ZXJhdG9yIF9NX2VyYXNlKGl0ZXJhdG9yIF9fcG9zLCBjb25zdCBfX3RydWVfdHlwZSYgLypfTW92YWJsZSovKSB7CisgICAgX1NUTFBfU1REOjpfRGVzdHJveShfX3Bvcyk7CisgICAgaXRlcmF0b3IgX19kc3QgPSBfX3BvcywgX19zcmMgPSBfX2RzdCArIDE7CisgICAgaXRlcmF0b3IgX19lbmQgPSBlbmQoKTsKKyAgICBmb3IgKDsgX19zcmMgIT0gX19lbmQ7ICsrX19kc3QsICsrX19zcmMpIHsKKyAgICAgIF9TVExQX1NURDo6X01vdmVfQ29uc3RydWN0KF9fZHN0LCAqX19zcmMpOworICAgICAgX1NUTFBfU1REOjpfRGVzdHJveV9Nb3ZlZChfX3NyYyk7CisgICAgfQorICAgIHRoaXMtPl9NX2ZpbmlzaCA9IF9fZHN0OworICAgIHJldHVybiBfX3BvczsKKyAgfQorICBpdGVyYXRvciBfTV9lcmFzZShpdGVyYXRvciBfX3BvcywgY29uc3QgX19mYWxzZV90eXBlJiAvKl9Nb3ZhYmxlKi8pIHsKKyAgICBpZiAoX19wb3MgKyAxICE9IGVuZCgpKSB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fdHlwZV90cmFpdHM8X1RwPjo6aGFzX3RyaXZpYWxfYXNzaWdubWVudF9vcGVyYXRvciBfVHJpdmlhbENvcHk7CisgICAgICBfU1RMUF9QUklWIF9fY29weV9wdHJzKF9fcG9zICsgMSwgdGhpcy0+X01fZmluaXNoLCBfX3BvcywgX1RyaXZpYWxDb3B5KCkpOworICAgIH0KKyAgICAtLXRoaXMtPl9NX2ZpbmlzaDsKKyAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95KHRoaXMtPl9NX2ZpbmlzaCk7CisgICAgcmV0dXJuIF9fcG9zOworICB9CisgIGl0ZXJhdG9yIF9NX2VyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCwgY29uc3QgX190cnVlX3R5cGUmIC8qX01vdmFibGUqLykgeworICAgIGl0ZXJhdG9yIF9fZHN0ID0gX19maXJzdCwgX19zcmMgPSBfX2xhc3Q7CisgICAgaXRlcmF0b3IgX19lbmQgPSBlbmQoKTsKKyAgICBmb3IgKDsgX19kc3QgIT0gX19sYXN0ICYmIF9fc3JjICE9IF9fZW5kOyArK19fZHN0LCArK19fc3JjKSB7CisgICAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95KF9fZHN0KTsKKyAgICAgIF9TVExQX1NURDo6X01vdmVfQ29uc3RydWN0KF9fZHN0LCAqX19zcmMpOworICAgIH0KKyAgICBpZiAoX19kc3QgIT0gX19sYXN0KSB7CisgICAgICAvL1RoZXJlIGlzIG1vcmUgZWxlbWVudHMgdG8gZXJhc2UgdGhhbiBlbGVtZW50IHRvIG1vdmU6CisgICAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95X1JhbmdlKF9fZHN0LCBfX2xhc3QpOworICAgICAgX1NUTFBfU1REOjpfRGVzdHJveV9Nb3ZlZF9SYW5nZShfX2xhc3QsIF9fZW5kKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAvL1RoZXJlIGlzIG1vcmUgZWxlbWVudCB0byBtb3ZlIHRoYW4gZWxlbWVudCB0byBlcmFzZToKKyAgICAgIGZvciAoOyBfX3NyYyAhPSBfX2VuZDsgKytfX2RzdCwgKytfX3NyYykgeworICAgICAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95X01vdmVkKF9fZHN0KTsKKyAgICAgICAgX1NUTFBfU1REOjpfTW92ZV9Db25zdHJ1Y3QoX19kc3QsICpfX3NyYyk7CisgICAgICB9CisgICAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95X01vdmVkX1JhbmdlKF9fZHN0LCBfX2VuZCk7CisgICAgfQorICAgIHRoaXMtPl9NX2ZpbmlzaCA9IF9fZHN0OworICAgIHJldHVybiBfX2ZpcnN0OworICB9CisgIGl0ZXJhdG9yIF9NX2VyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCwgY29uc3QgX19mYWxzZV90eXBlJiAvKl9Nb3ZhYmxlKi8pIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fdHlwZV90cmFpdHM8X1RwPjo6aGFzX3RyaXZpYWxfYXNzaWdubWVudF9vcGVyYXRvciBfVHJpdmlhbENvcHk7CisgICAgcG9pbnRlciBfX2kgPSBfU1RMUF9QUklWIF9fY29weV9wdHJzKF9fbGFzdCwgdGhpcy0+X01fZmluaXNoLCBfX2ZpcnN0LCBfVHJpdmlhbENvcHkoKSk7CisgICAgX1NUTFBfU1REOjpfRGVzdHJveV9SYW5nZShfX2ksIHRoaXMtPl9NX2ZpbmlzaCk7CisgICAgdGhpcy0+X01fZmluaXNoID0gX19pOworICAgIHJldHVybiBfX2ZpcnN0OworICB9CisKK3B1YmxpYzoKKyAgaXRlcmF0b3IgZXJhc2UoaXRlcmF0b3IgX19wb3MpIHsKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fbW92ZV90cmFpdHM8X1RwPjo6aW1wbGVtZW50ZWQgX01vdmFibGU7CisjZW5kaWYKKyAgICByZXR1cm4gX01fZXJhc2UoX19wb3MsIF9Nb3ZhYmxlKCkpOworICB9CisgIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkgeworI2lmICFkZWZpbmVkIChfU1RMUF9OT19NT1ZFX1NFTUFOVElDKQorICAgIHR5cGVkZWYgdHlwZW5hbWUgX19tb3ZlX3RyYWl0czxfVHA+OjppbXBsZW1lbnRlZCBfTW92YWJsZTsKKyNlbmRpZgorICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKyAgICAgIHJldHVybiBfX2ZpcnN0OworICAgIHJldHVybiBfTV9lcmFzZShfX2ZpcnN0LCBfX2xhc3QsIF9Nb3ZhYmxlKCkpOworICB9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKKyAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9fbmV3X3NpemUsIGNvbnN0IF9UcCYgX194ID0gX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRChfVHApKSB7CisjZWxzZQorICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgX19uZXdfc2l6ZSwgY29uc3QgX1RwJiBfX3gpIHsKKyNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0qLworICAgIGlmIChfX25ld19zaXplIDwgc2l6ZSgpKQorICAgICAgZXJhc2UoYmVnaW4oKSArIF9fbmV3X3NpemUsIGVuZCgpKTsKKyAgICBlbHNlCisgICAgICBpbnNlcnQoZW5kKCksIF9fbmV3X3NpemUgLSBzaXplKCksIF9feCk7CisgIH0KKworI2lmIGRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCisgIHZvaWQgcmVzaXplKHNpemVfdHlwZSBfX25ld19zaXplKSB7IHJlc2l6ZShfX25ld19zaXplLCBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKF9UcCkpOyB9CisjZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKi8KKworICB2b2lkIGNsZWFyKCkgeworICAgIGVyYXNlKGJlZ2luKCksIGVuZCgpKTsKKyAgfQorCitwcml2YXRlOgorICB2b2lkIF9NX2NsZWFyKCkgeworICAgIF9TVExQX1NURDo6X0Rlc3Ryb3lfUmFuZ2UocmJlZ2luKCksIHJlbmQoKSk7CisgICAgdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuZGVhbGxvY2F0ZSh0aGlzLT5fTV9zdGFydCwgdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuX01fZGF0YSAtIHRoaXMtPl9NX3N0YXJ0KTsKKyAgfQorCisgIHZvaWQgX01fY2xlYXJfYWZ0ZXJfbW92ZSgpIHsKKyAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95X01vdmVkX1JhbmdlKHJiZWdpbigpLCByZW5kKCkpOworICAgIHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLmRlYWxsb2NhdGUodGhpcy0+X01fc3RhcnQsIHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLl9NX2RhdGEgLSB0aGlzLT5fTV9zdGFydCk7CisgIH0KKworICB2b2lkIF9NX3NldChwb2ludGVyIF9fcywgcG9pbnRlciBfX2YsIHBvaW50ZXIgX19lKSB7CisgICAgdGhpcy0+X01fc3RhcnQgPSBfX3M7CisgICAgdGhpcy0+X01fZmluaXNoID0gX19mOworICAgIHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLl9NX2RhdGEgPSBfX2U7CisgIH0KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorICBwb2ludGVyIF9NX2FsbG9jYXRlX2FuZF9jb3B5KHNpemVfdHlwZSYgX19uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpCisjZWxzZSAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisgIHBvaW50ZXIgX01fYWxsb2NhdGVfYW5kX2NvcHkoc2l6ZV90eXBlJiBfX24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfcG9pbnRlciBfX2ZpcnN0LCBjb25zdF9wb2ludGVyIF9fbGFzdCkKKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisgIHsKKyAgICBwb2ludGVyIF9fcmVzdWx0ID0gdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuYWxsb2NhdGUoX19uLCBfX24pOworICAgIF9TVExQX1RSWSB7CisgICAgICB1bmluaXRpYWxpemVkX2NvcHkoX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCk7CisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorICAgIF9TVExQX1VOV0lORCh0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5kZWFsbG9jYXRlKF9fcmVzdWx0LCBfX24pKQorICAgIF9TVExQX1JFVF9BRlRFUl9USFJPVyhfX3Jlc3VsdCkKKyAgfQorCisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZvaWQgX01fcmFuZ2VfaW5pdGlhbGl6ZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnB1dF9pdGVyYXRvcl90YWcgJikgeworICAgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKyAgICAgIHB1c2hfYmFjaygqX19maXJzdCk7CisgIH0KKyAgLy8gVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBieSB0aGUgY29uc3RydWN0b3IuCisgIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorICB2b2lkIF9NX3JhbmdlX2luaXRpYWxpemUoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcndhcmRfaXRlcmF0b3JfdGFnICYpIHsKKyAgICBzaXplX3R5cGUgX19uID0gX1NUTFBfU1REOjpkaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QpOworICAgIHRoaXMtPl9NX3N0YXJ0ID0gdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuYWxsb2NhdGUoX19uLCBfX24pOworICAgIHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLl9NX2RhdGEgPSB0aGlzLT5fTV9zdGFydCArIF9fbjsKKyAgICB0aGlzLT5fTV9maW5pc2ggPSB1bmluaXRpYWxpemVkX2NvcHkoX19maXJzdCwgX19sYXN0LCB0aGlzLT5fTV9zdGFydCk7CisgIH0KKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCit9OworCisjaWYgZGVmaW5lZCAodmVjdG9yKQorIyAgdW5kZWYgdmVjdG9yCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKyNlbmRpZgorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTElOS19USU1FX0lOU1RBTlRJQVRJT04pCisjICBpbmNsdWRlIDxzdGwvX3ZlY3Rvci5jPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUFRSX1NQRUNJQUxJWkFUSU9OUykKKyMgIGluY2x1ZGUgPHN0bC9wb2ludGVycy9fdmVjdG9yLmg+CisjZW5kaWYKKworLy9XZSBkZWZpbmUgdGhlIGJvb2wgc3BlY2lhbGl6YXRpb24gYmVmb3JlIHRoZSBkZWJ1ZyBpbnRlcmZhdmUKKy8vdG8gYmVuZWZpdCBvZiB0aGUgZGVidWcgdmVyc2lvbiBvZiB2ZWN0b3IgZXZlbiBmb3IgdGhlIGJvb2wKKy8vc3BlY2lhbGl6YXRpb24uCisjaWYgIWRlZmluZWQgKF9TVExQX05PX0JPT0wpIHx8ICFkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQorIyAgaWYgIWRlZmluZWQgKF9TVExQX0lOVEVSTkFMX0JWRUNUT1JfSCkKKyMgICAgaW5jbHVkZSA8c3RsL19idmVjdG9yLmg+CisjICBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9ERUJVRykKKyMgIGluY2x1ZGUgPHN0bC9kZWJ1Zy9fdmVjdG9yLmg+CisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fQk9PTCkgJiYgIWRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpCisvLyBUaGlzIHR5cGVkZWYgaXMgbm9uLXN0YW5kYXJkLiAgSXQgaXMgcHJvdmlkZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCit0eXBlZGVmIHZlY3Rvcjxib29sLCBhbGxvY2F0b3I8Ym9vbD4gPiBiaXRfdmVjdG9yOworI2VuZGlmCisKKyNkZWZpbmUgX1NUTFBfVEVNUExBVEVfSEVBREVSIHRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KKyNkZWZpbmUgX1NUTFBfVEVNUExBVEVfQ09OVEFJTkVSIHZlY3RvcjxfVHAsIF9BbGxvYz4KKyNpbmNsdWRlIDxzdGwvX3JlbG9wc19jb250Lmg+CisjdW5kZWYgX1NUTFBfVEVNUExBVEVfQ09OVEFJTkVSCisjdW5kZWYgX1NUTFBfVEVNUExBVEVfSEVBREVSCisKKyNpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQorIyAgaWYgIWRlZmluZWQgKF9TVExQX05PX01PVkVfU0VNQU5USUMpCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CitzdHJ1Y3QgX19tb3ZlX3RyYWl0czx2ZWN0b3I8X1RwLCBfQWxsb2M+ID4geworICB0eXBlZGVmIF9fdHJ1ZV90eXBlIGltcGxlbWVudGVkOworICB0eXBlZGVmIHR5cGVuYW1lIF9fbW92ZV90cmFpdHM8X0FsbG9jPjo6Y29tcGxldGUgY29tcGxldGU7Cit9OworIyAgZW5kaWYKKworIyAgaWYgIWRlZmluZWQgKF9TVExQX0RFQlVHKQordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgorc3RydWN0IF9EZWZhdWx0WmVyb1ZhbHVlPHZlY3RvcjxfVHAsIF9BbGxvYz4gPgoreyB0eXBlZGVmIHR5cGVuYW1lIF9fdHlwZV90cmFpdHM8X0FsbG9jPjo6aGFzX3RyaXZpYWxfZGVmYXVsdF9jb25zdHJ1Y3RvciBfUmV0OyB9OworIyAgZW5kaWYKKworI2VuZGlmIC8qIF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04gKi8KKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLyogX1NUTFBfVkVDVE9SX0ggKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL2Jvb3N0X3R5cGVfdHJhaXRzLmggYi9zdGxwb3J0L3N0bC9ib29zdF90eXBlX3RyYWl0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlM2EzZjYKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9ib29zdF90eXBlX3RyYWl0cy5oCkBAIC0wLDAgKzEsMTUwIEBACisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNAorICogRnJhbmNvaXMgRHVtb250CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfQk9PU1RfVFlQRV9UUkFJVFNfSAorI2RlZmluZSBfU1RMUF9CT09TVF9UWVBFX1RSQUlUU19ICisKKyNpZm5kZWYgQk9PU1RfQ09ORklHX1NVRkZJWF9IUFAKKyMgIGlmZGVmIEJPT1NUX0NPTkZJR19IUFAKKyMgICAgdW5kZWYgQk9PU1RfQ09ORklHX0hQUAorIyAgZW5kaWYKKyMgIGluY2x1ZGUgPGJvb3N0L2NvbmZpZy5ocHA+CisjZW5kaWYKKworI2luY2x1ZGUgPGJvb3N0L3R5cGVfdHJhaXRzL2lzX2ludGVncmFsLmhwcD4KKyNpbmNsdWRlIDxib29zdC90eXBlX3RyYWl0cy9pc19mbG9hdC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvdHlwZV90cmFpdHMvaGFzX3RyaXZpYWxfY29uc3RydWN0b3IuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3R5cGVfdHJhaXRzL2hhc190cml2aWFsX2NvcHkuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3R5cGVfdHJhaXRzL2hhc190cml2aWFsX2Fzc2lnbi5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvdHlwZV90cmFpdHMvaGFzX3RyaXZpYWxfZGVzdHJ1Y3Rvci5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvdHlwZV90cmFpdHMvaXNfcG9kLmhwcD4KKyNpbmNsdWRlIDxib29zdC90eXBlX3RyYWl0cy9pc19wb2ludGVyLmhwcD4KKyNpbmNsdWRlIDxib29zdC90eXBlX3RyYWl0cy9pc19yZWZlcmVuY2UuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3R5cGVfdHJhaXRzL3JlbW92ZV9jdi5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvdHlwZV90cmFpdHMvaXNfc2FtZS5ocHA+CisKKy8qCisgKiBUaGlzIGZpbGUgbW9zdGx5IHdyYXBzIGJvb3N0IHR5cGVfdHJhaXRzIGluIHRoZSBTVExwb3J0IHR5cGVfdHJhaXRzLgorICogV2hlbiBjaGVja2luZyBhIHR5cGUgdHJhaXRzIGxpa2UgdHJpdmlhbCBhc3NpZ24gb3BlcmF0b3IgZm9yIGluc3RhbmNlCisgKiBib3RoIHRoZSBib29zdCB2YWx1ZSBhbmQgU1RMcG9ydCB2YWx1ZXMgaGFzIHRvIGJlIHRha2VuIGludG8gYWNjb3VudAorICogYXMgd2UgZG9uJ3Qga25vdyB3aGF0IHRoZSB1c2VyIG1pZ2h0IGhhdmUgcHJlZmVyLCBzcGVjaWFsaXppbmcgdGhlIGJvb3N0CisgKiB0eXBlIHRyYWl0cyBvciB0aGUgU1RMcG9ydCBvbmUuCisgKi8KK19TVExQX0JFR0lOX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX0lzUmVmIHsKKyAgZW51bSB7IF9JcyA9IDo6Ym9vc3Q6OmlzX3JlZmVyZW5jZTxfVHA+Ojp2YWx1ZSB9OworICB0eXBlZGVmIHR5cGVuYW1lIF9fYm9vbDJ0eXBlPF9Jcz46Ol9SZXQgX1JldDsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBfSXNQdHIgeworICBlbnVtIHsgaXNfcG9pbnRlciA9IDo6Ym9vc3Q6OmlzX3BvaW50ZXI8X1RwPjo6dmFsdWUgfTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jvb2wydHlwZTxpc19wb2ludGVyPjo6X1JldCBfUmV0OworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9Jc0ludGVncmFsIHsKKyAgZW51bSB7IGlzX2ludGVncmFsID0gOjpib29zdDo6aXNfaW50ZWdyYWw8X1RwPjo6dmFsdWUgfTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jvb2wydHlwZTxpc19pbnRlZ3JhbD46Ol9SZXQgX1JldDsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBfSXNSYXRpb25hbCB7CisgIGVudW0geyBpc19mbG9hdCA9IDo6Ym9vc3Q6OmlzX2Zsb2F0PF9UcD46OnZhbHVlIH07CisgIHR5cGVkZWYgdHlwZW5hbWUgX19ib29sMnR5cGU8aXNfZmxvYXQ+OjpfUmV0IF9SZXQ7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9fdHlwZV90cmFpdHMgeworICBlbnVtIHsgdHJpdmlhbF9jb25zdHJ1Y3RvciA9IDo6Ym9vc3Q6Omhhc190cml2aWFsX2NvbnN0cnVjdG9yPF9UcD46OnZhbHVlIH07CisgIHR5cGVkZWYgdHlwZW5hbWUgX19ib29sMnR5cGU8dHJpdmlhbF9jb25zdHJ1Y3Rvcj46Ol9SZXQgaGFzX3RyaXZpYWxfZGVmYXVsdF9jb25zdHJ1Y3RvcjsKKworICBlbnVtIHsgdHJpdmlhbF9jb3B5ID0gOjpib29zdDo6aGFzX3RyaXZpYWxfY29weTxfVHA+Ojp2YWx1ZSB9OworICB0eXBlZGVmIHR5cGVuYW1lIF9fYm9vbDJ0eXBlPHRyaXZpYWxfY29weT46Ol9SZXQgaGFzX3RyaXZpYWxfY29weV9jb25zdHJ1Y3RvcjsKKworICBlbnVtIHsgdHJpdmlhbF9hc3NpZ24gPSA6OmJvb3N0OjpoYXNfdHJpdmlhbF9hc3NpZ248X1RwPjo6dmFsdWUgfTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jvb2wydHlwZTx0cml2aWFsX2Fzc2lnbj46Ol9SZXQgaGFzX3RyaXZpYWxfYXNzaWdubWVudF9vcGVyYXRvcjsKKworICBlbnVtIHsgdHJpdmlhbF9kZXN0cnVjdG9yID0gOjpib29zdDo6aGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjxfVHA+Ojp2YWx1ZSB9OworICB0eXBlZGVmIHR5cGVuYW1lIF9fYm9vbDJ0eXBlPHRyaXZpYWxfZGVzdHJ1Y3Rvcj46Ol9SZXQgaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjsKKworICBlbnVtIHsgcG9kID0gOjpib29zdDo6aXNfcG9kPF9UcD46OnZhbHVlIH07CisgIHR5cGVkZWYgdHlwZW5hbWUgX19ib29sMnR5cGU8cG9kPjo6X1JldCBpc19QT0RfdHlwZTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAxLCBjbGFzcyBfVHAyPgorc3RydWN0IF9Ucml2aWFsQ29weSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgOjpib29zdDo6cmVtb3ZlX2N2PF9UcDE+Ojp0eXBlIHVuY3YxOworICB0eXBlZGVmIHR5cGVuYW1lIDo6Ym9vc3Q6OnJlbW92ZV9jdjxfVHAyPjo6dHlwZSB1bmN2MjsKKworICBlbnVtIHsgc2FtZSA9IDo6Ym9vc3Q6OmlzX3NhbWU8dW5jdjEsIHVuY3YyPjo6dmFsdWUgfTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jvb2wydHlwZTxzYW1lPjo6X1JldCBfU2FtZTsKKworICBlbnVtIHsgYm9vc3RfdHJpdmlhbF9hc3NpZ24gPSA6OmJvb3N0OjpoYXNfdHJpdmlhbF9hc3NpZ248dW5jdjE+Ojp2YWx1ZSB9OworICB0eXBlZGVmIHR5cGVuYW1lIF9fYm9vbDJ0eXBlPGJvb3N0X3RyaXZpYWxfYXNzaWduPjo6X1JldCBfQm9vc3RUcml2aWFsQXNzaWduOworICB0eXBlZGVmIHR5cGVuYW1lIF9fdHlwZV90cmFpdHM8dW5jdjE+OjpoYXNfdHJpdmlhbF9hc3NpZ25tZW50X29wZXJhdG9yIF9TVExQVHJpdmlhbEFzc2lnbjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfTG9yMjxfQm9vc3RUcml2aWFsQXNzaWduLCBfU1RMUFRyaXZpYWxBc3NpZ24+OjpfUmV0IF9Ucml2aWFsQXNzaWduOworCisgIHR5cGVkZWYgdHlwZW5hbWUgX0xhbmQyPF9TYW1lLCBfVHJpdmlhbEFzc2lnbj46Ol9SZXQgX1R5cGU7CisgIHN0YXRpYyBfVHlwZSBfQW5zd2VyKCkgeyByZXR1cm4gX1R5cGUoKTsgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcDEsIGNsYXNzIF9UcDI+CitzdHJ1Y3QgX1RyaXZpYWxVQ29weSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgOjpib29zdDo6cmVtb3ZlX2N2PF9UcDE+Ojp0eXBlIHVuY3YxOworICB0eXBlZGVmIHR5cGVuYW1lIDo6Ym9vc3Q6OnJlbW92ZV9jdjxfVHAyPjo6dHlwZSB1bmN2MjsKKworICBlbnVtIHsgc2FtZSA9IDo6Ym9vc3Q6OmlzX3NhbWU8dW5jdjEsIHVuY3YyPjo6dmFsdWUgfTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jvb2wydHlwZTxzYW1lPjo6X1JldCBfU2FtZTsKKworICBlbnVtIHsgYm9vc3RfdHJpdmlhbF9jb3B5ID0gOjpib29zdDo6aGFzX3RyaXZpYWxfY29weTx1bmN2MT46OnZhbHVlIH07CisgIHR5cGVkZWYgdHlwZW5hbWUgX19ib29sMnR5cGU8Ym9vc3RfdHJpdmlhbF9jb3B5Pjo6X1JldCBfQm9vc3RUcml2aWFsQ29weTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX3R5cGVfdHJhaXRzPHVuY3YxPjo6aGFzX3RyaXZpYWxfY29weV9jb25zdHJ1Y3RvciBfU1RMUFRyaXZpYWxDb3B5OworICB0eXBlZGVmIHR5cGVuYW1lIF9Mb3IyPF9Cb29zdFRyaXZpYWxDb3B5LCBfU1RMUFRyaXZpYWxDb3B5Pjo6X1JldCBfVHJpdmlhbENvcHk7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBfTGFuZDI8X1NhbWUsIF9Ucml2aWFsQ29weT46Ol9SZXQgX1R5cGU7CisgIHN0YXRpYyBfVHlwZSBfQW5zd2VyKCkgeyByZXR1cm4gX1R5cGUoKTsgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfRGVmYXVsdFplcm9WYWx1ZSB7CisgIGVudW0geyBpc19pbnRlZ3JhbCA9IDo6Ym9vc3Q6OmlzX2ludGVncmFsPF9UcD46OnZhbHVlIH07CisgIHR5cGVkZWYgdHlwZW5hbWUgX19ib29sMnR5cGU8aXNfaW50ZWdyYWw+OjpfUmV0IF9Jc0ludGVncmFsOworICBlbnVtIHsgaXNfZmxvYXQgPSA6OmJvb3N0Ojppc19mbG9hdDxfVHA+Ojp2YWx1ZSB9OworICB0eXBlZGVmIHR5cGVuYW1lIF9fYm9vbDJ0eXBlPGlzX2Zsb2F0Pjo6X1JldCBfSXNGbG9hdDsKKyAgZW51bSB7IGlzX3BvaW50ZXIgPSA6OmJvb3N0Ojppc19wb2ludGVyPF9UcD46OnZhbHVlIH07CisgIHR5cGVkZWYgdHlwZW5hbWUgX19ib29sMnR5cGU8aXNfcG9pbnRlcj46Ol9SZXQgX0lzUG9pbnRlcjsKKworICB0eXBlZGVmIHR5cGVuYW1lIF9Mb3IzPF9Jc0ludGVncmFsLCBfSXNGbG9hdCwgX0lzUG9pbnRlcj46Ol9SZXQgX1JldDsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX1RyaXZpYWxJbml0IHsKKyAgdHlwZWRlZiB0eXBlbmFtZSA6OmJvb3N0OjpyZW1vdmVfY3Y8X1RwPjo6dHlwZSB1bmN2OworCisgIGVudW0geyBib29zdF90cml2aWFsX2NvbnN0cnVjdG9yID0gOjpib29zdDo6aGFzX3RyaXZpYWxfY29uc3RydWN0b3I8dW5jdj46OnZhbHVlIH07CisgIHR5cGVkZWYgdHlwZW5hbWUgX19ib29sMnR5cGU8Ym9vc3RfdHJpdmlhbF9jb25zdHJ1Y3Rvcj46Ol9SZXQgX0Jvb3N0VHJpdmlhbEluaXQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgX190eXBlX3RyYWl0czx1bmN2Pjo6aGFzX3RyaXZpYWxfZGVmYXVsdF9jb25zdHJ1Y3RvciBfU1RMUFRyaXZpYWxJbml0OworICB0eXBlZGVmIHR5cGVuYW1lIF9Mb3IyPF9Cb29zdFRyaXZpYWxJbml0LCBfU1RMUFRyaXZpYWxJbml0Pjo6X1JldCBfVHIxOworCisgIHR5cGVkZWYgdHlwZW5hbWUgX0RlZmF1bHRaZXJvVmFsdWU8X1RwPjo6X1JldCBfVHIyOworICB0eXBlZGVmIHR5cGVuYW1lIF9Ob3Q8X1RyMj46Ol9SZXQgX1RyMzsKKworICB0eXBlZGVmIHR5cGVuYW1lIF9MYW5kMjxfVHIxLCBfVHIzPjo6X1JldCBfUmV0OworICBzdGF0aWMgX1JldCBfQW5zd2VyKCkgeyByZXR1cm4gX1JldCgpOyB9Cit9OworCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNlbmRpZiAvKiBfU1RMUF9CT09TVF9UWVBFX1RSQUlUU19IICovCmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9jX2xvY2FsZS5oIGIvc3RscG9ydC9zdGwvY19sb2NhbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWRkMmJjCi0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvY19sb2NhbGUuaApAQCAtMCwwICsxLDEzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9DX0xPQ0FMRV9ICisjZGVmaW5lIF9TVExQX0NfTE9DQUxFX0gKKworLyoKKyAqIEltcGxlbWVudGF0aW9uIGRlcGVuZGVudCBkZWZpbml0aW9ucy4KKyAqIEJld2FyZTogVGhpcyBoZWFkZXIgaXMgbm90IGEgcHVyZWx5IGludGVybmFsIGhlYWRlciwgaXQgaXMgYWxzbyBpbmNsdWRlZAorICogZnJvbSB0aGUgb3V0c2lkZSB3b3JsZCB3aGVuIGJ1aWxkaW5nIHRoZSBTVExwb3J0IGxpYnJhcnkuIFNvIHRoaXMgaGVhZGVyCisgKiBzaG91bGQgbm90IHJlZmVyZW5jZSBpbnRlcm5hbCBoZWFkZXJzIChzdGxwb3J0L3N0bC9fKi5oKSBkaXJlY3RseS4KKyAqLworI2lmIGRlZmluZWQgKF9fc2dpKQorIyAgaWYgZGVmaW5lZCAoUk9PVF82NSkgLyogSVJJWCA2LjUueCAqLworIyAgICBpbmNsdWRlIDxzZ2lkZWZzLmg+CisjICAgIGluY2x1ZGUgPHN0YW5kYXJkcy5oPgorIyAgICBpbmNsdWRlIDx3Y2hhci5oPgorIyAgICBpbmNsdWRlIDxjdHlwZS5oPgorIyAgZWxzZSAvKiBJUklYIHByZS02LjUgKi8KKyMgICAgaW5jbHVkZSA8c2dpZGVmcy5oPgorIyAgICBpbmNsdWRlIDxzdGFuZGFyZHMuaD4KKyMgICAgaWYgIWRlZmluZWQoX1NJWkVfVCkgJiYgIWRlZmluZWQoX1NJWkVfVF8pCisjICAgICAgZGVmaW5lIF9TSVpFX1QKKyMgICAgICBpZiAoX01JUFNfU1pMT05HID09IDMyKQordHlwZWRlZiB1bnNpZ25lZCBpbnQgc2l6ZV90OworIyAgICAgIGVuZGlmCisjICAgICAgaWYgKF9NSVBTX1NaTE9ORyA9PSA2NCkKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBzaXplX3Q7CisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYKKyMgICAgaWYgIWRlZmluZWQgKF9XQ0hBUl9UKQorIyAgICAgIGRlZmluZSBfV0NIQVJfVAorIyAgICAgIGlmIChfTUlQU19TWkxPTkcgPT0gMzIpCit0eXBlZGVmIGxvbmcgd2NoYXJfdDsKKyMgICAgICBlbmRpZgorIyAgICAgIGlmIChfTUlQU19TWkxPTkcgPT0gNjQpCit0eXBlZGVmIF9faW50MzJfdCB3Y2hhcl90OworIyAgICAgIGVuZGlmCisjICAgIGVuZGlmIC8qIF9XQ0hBUl9UICovCisjICAgIGlmICFkZWZpbmVkIChfV0lOVF9UKQorIyAgICAgIGRlZmluZSBfV0lOVF9UCisjICAgICAgaWYgKF9NSVBTX1NaTE9ORyA9PSAzMikKK3R5cGVkZWYgbG9uZyB3aW50X3Q7CisjICAgICAgZW5kaWYKKyMgICAgICBpZiAoX01JUFNfU1pMT05HID09IDY0KQordHlwZWRlZiBfX2ludDMyX3Qgd2ludF90OworIyAgICAgIGVuZGlmCisjICAgIGVuZGlmIC8qIF9XSU5UX1QgKi8KKyMgICAgaWYgIWRlZmluZWQgKF9NQlNUQVRFX1QpCisjICAgICAgZGVmaW5lIF9NQlNUQVRFX1QKKy8qIF9NU0NfVkVSIGNoZWNrIGlzIGhlcmUgZm9yIGhpc3RvcmljYWwgcmVhc29uIGFuZCBzZWVtcyB3cm9uZyBhcyBpdCBpcyB0aGUgbWFjcm8gZGVmaW5lZAorICogYnkgTWljcm9zb2Z0IGNvbXBpbGVycyB0byBnaXZlIHRoZWlyIHZlcnNpb24uIEJ1dCB3ZSBhcmUgaW4gYSBTR0kgcGxhdGZvcm0gc2VjdGlvbiBzbyBpdAorICogaXMgd2VpcmQuIEhvd2V2ZXIgX01TQ19WRVIgbWlnaHQgYWxzbyBiZSBhIFNHSSBjb21waWxlciBtYWNybyBzbyB3ZSBrZWVwIGl0IHRoaXMgd2F5LiovCisjICAgICAgaWYgZGVmaW5lZCAoX01TQ19WRVIpCit0eXBlZGVmIGludCBtYnN0YXRlX3Q7CisjICAgICAgZWxzZQordHlwZWRlZiBjaGFyIG1ic3RhdGVfdDsKKyMgICAgICBlbmRpZgorIyAgICBlbmRpZiAvKiBfTUJTVEFURV9UICovCisjICBlbmRpZiAvKiBST09UNjUgKi8KKyNlbGlmIGRlZmluZWQgKF9TVExQX1VTRV9HTElCQykKKyMgIGluY2x1ZGUgPGN0eXBlLmg+CisjZW5kaWYKKworLyoKKyAqIEdFTkVSQUwgRlJBTUVXT1JLCisgKi8KKworLyoKKyAqIE9wYXF1ZSB0eXBlcywgaW1wbGVtZW50YXRpb24gKGlmIHRoZXJlIGlzIG9uZSkgZGVwZW5kcworICogb24gcGxhdGZvcm0gbG9jYWxpc2F0aW9uIEFQSS4KKyAqLworc3RydWN0IF9Mb2NhbGVfY3R5cGU7CitzdHJ1Y3QgX0xvY2FsZV9jb2RlY3Z0Oworc3RydWN0IF9Mb2NhbGVfbnVtZXJpYzsKK3N0cnVjdCBfTG9jYWxlX3RpbWU7CitzdHJ1Y3QgX0xvY2FsZV9jb2xsYXRlOworc3RydWN0IF9Mb2NhbGVfbW9uZXRhcnk7CitzdHJ1Y3QgX0xvY2FsZV9tZXNzYWdlczsKKworLyoKKyAgQml0bWFzayBtYWNyb3MuCisqLworCisvKgorICogRm9yIG5hcnJvdyBjaGFyYWN0ZXJzLCB3ZSBleHBvc2UgdGhlIGxvb2t1cCB0YWJsZSBpbnRlcmZhY2UuCisgKi8KKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9HTElCQykKKy8qIFRoaXMgc2VjdGlvbiB1c2VzIG1hY3JvcyBkZWZpbmVkIGluIHRoZSBnbnUgbGliYyBjdHlwZS5oIGhlYWRlciAqLworIyAgZGVmaW5lIF9Mb2NhbGVfQ05UUkwgIF9JU2NudHJsCisjICBkZWZpbmUgX0xvY2FsZV9VUFBFUiAgX0lTdXBwZXIKKyMgIGRlZmluZSBfTG9jYWxlX0xPV0VSICBfSVNsb3dlcgorIyAgZGVmaW5lIF9Mb2NhbGVfRElHSVQgIF9JU2RpZ2l0CisjICBkZWZpbmUgX0xvY2FsZV9YRElHSVQgX0lTeGRpZ2l0CisjICBkZWZpbmUgX0xvY2FsZV9QVU5DVCAgX0lTcHVuY3QKKyMgIGRlZmluZSBfTG9jYWxlX1NQQUNFICBfSVNzcGFjZQorIyAgZGVmaW5lIF9Mb2NhbGVfUFJJTlQgIF9JU3ByaW50CisjICBkZWZpbmUgX0xvY2FsZV9BTFBIQSAgX0lTYWxwaGEKKyNlbHNlCisvKiBEZWZhdWx0IHZhbHVlcyBiYXNlZCBvbiBDKysgU3RhbmRhcmQgMjIuMi4xLgorICogVW5kZXIgV2luZG93cyB0aGUgbG9jYWxpc2F0aW9uIGltcGxlbWVudGF0aW9uIHRha2UgY2FyZSBvZiBtYXBwaW5nIGl0cworICogbWFzayB2YWx1ZXMgdG8gdGhvc2UgaW50ZXJuYWwgdmFsdWVzLiBGb3Igb3RoZXIgcGxhdGZvcm1zIHdpdGhvdXQgcmVhbAorICogbG9jYWxpemF0aW9uIHN1cHBvcnQgd2UgYXJlIGZyZWUgdG8gdXNlIHRoZSBtb3N0IHN1aXRhYmxlIHZhbHVlcy4qLworIyAgZGVmaW5lIF9Mb2NhbGVfU1BBQ0UgIDB4MDAwMQorIyAgZGVmaW5lIF9Mb2NhbGVfUFJJTlQgIDB4MDAwMgorIyAgZGVmaW5lIF9Mb2NhbGVfQ05UUkwgIDB4MDAwNAorIyAgZGVmaW5lIF9Mb2NhbGVfVVBQRVIgIDB4MDAwOAorIyAgZGVmaW5lIF9Mb2NhbGVfTE9XRVIgIDB4MDAxMAorIyAgZGVmaW5lIF9Mb2NhbGVfQUxQSEEgIDB4MDAyMAorIyAgZGVmaW5lIF9Mb2NhbGVfRElHSVQgIDB4MDA0MAorIyAgZGVmaW5lIF9Mb2NhbGVfUFVOQ1QgIDB4MDA4MAorIyAgZGVmaW5lIF9Mb2NhbGVfWERJR0lUIDB4MDEwMAorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9DX0xPQ0FMRV9IICovCmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9jaGFyX3RyYWl0cy5oIGIvc3RscG9ydC9zdGwvY2hhcl90cmFpdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDA0YTcwCi0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvY2hhcl90cmFpdHMuaApAQCAtMCwwICsxLDI3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX0NIQVJfVFJBSVRTX0gKKyNkZWZpbmUgX1NUTFBfQ0hBUl9UUkFJVFNfSAorCisvLyBEZWZpbmUgY2hhcl90cmFpdHMKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DU1REREVGCisjICBpbmNsdWRlIDxzdGwvX2NzdGRkZWYuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NTVFJJTkcKKyMgIGluY2x1ZGUgPHN0bC9fY3N0cmluZy5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX3VuaXgpCisjICBpbmNsdWRlIDxzeXMvdHlwZXMuaD4gICAgICAgICAvLyBGb3Igb2ZmX3QKKyNlbmRpZiAvKiBfX3VuaXggKi8KKworI2lmIGRlZmluZWQgKF9fQk9STEFORENfXykKKyMgIGluY2x1ZGUgPG1lbS5oPgorIyAgaW5jbHVkZSA8c3RyaW5nLmg+CisjICBpbmNsdWRlIDxfc3RkZGVmLmg+CisjICBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NPTlNUUlVDVF9ICisjICBpbmNsdWRlIDxzdGwvX2NvbnN0cnVjdC5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1dDSEFSCisjICBpbmNsdWRlIDxzdGwvX2N3Y2hhci5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBjbGFzcyBhbGxvY2F0b3I7CisKKyNkZWZpbmUgX1NUTFBfTlVMTF9DSEFSX0lOSVQoX0NoVCkgX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRChfQ2hUKQorCisjaWYgZGVmaW5lZChfU1RMUF9XQ0UpCit0eXBlZGVmIGxvbmcgc3RyZWFtb2ZmOworI2VsaWYgZGVmaW5lZCAoX1NUTFBfV0lOMzIpCisjICBpZiBkZWZpbmVkIChfU1RMUF9MT05HX0xPTkcpICYmICFkZWZpbmVkIChfX0NZR1dJTl9fKQorLy9UaGUgV2luMzIgZmlsZSBpbyBBUEkgc3VwcG9ydCA2NCBiaXRzIGFjY2VzcyBzbyBzdHJlYW1vZmYgYW5kIHN0cmVhbXNpemUKKy8vaGFzIHRvIHJlZmxlY3QgdGhhdC4gRG8gbm90IGNoYW5nZSB0aGUgc3RyaW5nYnVmIGJlaGF2aW9yLgordHlwZWRlZiBfU1RMUF9MT05HX0xPTkcgc3RyZWFtb2ZmOworIyAgZWxzZQordHlwZWRlZiBwdHJkaWZmX3Qgc3RyZWFtb2ZmOworIyAgZW5kaWYKKyNlbHNlIC8vIF9fdW5peAorIyAgaWZkZWYgX1NUTFBfVVNFX0RFRkFVTFRfRklMRV9PRkZTRVQKK3R5cGVkZWYgb2ZmX3Qgc3RyZWFtb2ZmOworIyAgZWxpZiBkZWZpbmVkKF9MQVJHRUZJTEVfU09VUkNFKSB8fCBkZWZpbmVkKF9MQVJHRUZJTEU2NF9TT1VSQ0UpIC8qIHx8IGRlZmluZWQoX19VU0VfRklMRV9PRkZTRVQ2NCkgKi8gXAorICAgICAgIC8qIHx8IChkZWZpbmVkKF9GSUxFX09GRlNFVF9CSVRTKSAmJiAoX0ZJTEVfT0ZGU0VUX0JJVFMgPT0gNjQpKSAqLyAvKiB8fCBkZWZpbmVkIChfX3NnaSkgJiYgZGVmaW5lZCAoX1NUTFBfSEFTX05PX05FV19DX0hFQURFUlMpICovCit0eXBlZGVmIG9mZjY0X3Qgc3RyZWFtb2ZmOworIyAgZWxzZQordHlwZWRlZiBvZmZfdCBzdHJlYW1vZmY7CisjICBlbmRpZgorI2VuZGlmIC8qIF9fdW5peCAqLworCisjaWYgZGVmaW5lZCAoX1NUTFBfV0lOMzIpCit0eXBlZGVmIHN0cmVhbW9mZiBzdHJlYW1zaXplOworI2Vsc2UKK3R5cGVkZWYgcHRyZGlmZl90IHN0cmVhbXNpemU7CisjZW5kaWYKKworLy8gQ2xhc3MgZnBvcywgd2hpY2ggcmVwcmVzZW50cyBhIHBvc2l0aW9uIHdpdGhpbiBhIGZpbGUuICAoVGhlIEMrKworLy8gc3RhbmRhcmQgY2FsbHMgZm9yIGl0IHRvIGJlIGRlZmluZWQgaW4gPGlvcz4uICBUaGlzIGltcGxlbWVudGF0aW9uCisvLyBtb3ZlcyBpdCB0byA8aW9zZndkPiwgd2hpY2ggaXMgaW5jbHVkZWQgYnkgPGlvcz4uKQordGVtcGxhdGUgPGNsYXNzIF9TdGF0ZVQ+IGNsYXNzIGZwb3MgeworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGcm9tIHRhYmxlIDg4IG9mIHRoZSBDKysgc3RhbmRhcmQuCisgIGZwb3Moc3RyZWFtb2ZmIF9fcG9zKSA6IF9NX3BvcyhfX3BvcyksIF9NX3N0KF9TVExQX05VTExfQ0hBUl9JTklUKF9TdGF0ZVQpKSB7fQorICBmcG9zKCkgOiBfTV9wb3MoMCksIF9NX3N0KF9TVExQX05VTExfQ0hBUl9JTklUKF9TdGF0ZVQpKSB7fQorCisgIG9wZXJhdG9yIHN0cmVhbW9mZigpIGNvbnN0IHsgcmV0dXJuIF9NX3BvczsgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBmcG9zJiBfX3kpIGNvbnN0CisgIHsgcmV0dXJuIF9NX3BvcyA9PSBfX3kuX01fcG9zOyB9CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBmcG9zJiBfX3kpIGNvbnN0CisgIHsgcmV0dXJuIF9NX3BvcyAhPSBfX3kuX01fcG9zOyB9CisKKyAgZnBvcyYgb3BlcmF0b3IrPShzdHJlYW1vZmYgX19vZmYpIHsKKyAgICBfTV9wb3MgKz0gX19vZmY7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIGZwb3MmIG9wZXJhdG9yLT0oc3RyZWFtb2ZmIF9fb2ZmKSB7CisgICAgX01fcG9zIC09IF9fb2ZmOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGZwb3Mgb3BlcmF0b3IrKHN0cmVhbW9mZiBfX29mZikgeworICAgIGZwb3MgX190bXAoKnRoaXMpOworICAgIF9fdG1wICs9IF9fb2ZmOworICAgIHJldHVybiBfX3RtcDsKKyAgfQorICBmcG9zIG9wZXJhdG9yLShzdHJlYW1vZmYgX19vZmYpIHsKKyAgICBmcG9zIF9fdG1wKCp0aGlzKTsKKyAgICBfX3RtcCAtPSBfX29mZjsKKyAgICByZXR1cm4gX190bXA7CisgIH0KKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNYW5pcHVsYXRpb24gb2YgdGhlIHN0YXRlIG1lbWJlci4KKyAgX1N0YXRlVCBzdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX3N0OyB9CisgIHZvaWQgc3RhdGUoX1N0YXRlVCBfX3N0KSB7IF9NX3N0ID0gX19zdDsgfQorcHJpdmF0ZToKKyAgc3RyZWFtb2ZmIF9NX3BvczsKKyAgX1N0YXRlVCBfTV9zdDsKK307CisKK3R5cGVkZWYgZnBvczxtYnN0YXRlX3Q+IHN0cmVhbXBvczsKK3R5cGVkZWYgZnBvczxtYnN0YXRlX3Q+IHdzdHJlYW1wb3M7CisKKy8vIENsYXNzIF9fY2hhcl90cmFpdHNfYmFzZS4KK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9JbnRUPgorY2xhc3MgX19jaGFyX3RyYWl0c19iYXNlIHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBfQ2hhclQgY2hhcl90eXBlOworICB0eXBlZGVmIF9JbnRUIGludF90eXBlOworICB0eXBlZGVmIHN0cmVhbW9mZiBvZmZfdHlwZTsKKyAgdHlwZWRlZiBzdHJlYW1wb3MgcG9zX3R5cGU7CisgIHR5cGVkZWYgbWJzdGF0ZV90IHN0YXRlX3R5cGU7CisKKyAgc3RhdGljIHZvaWQgX1NUTFBfQ0FMTCBhc3NpZ24oY2hhcl90eXBlJiBfX2MxLCBjb25zdCBjaGFyX3R5cGUmIF9fYzIpIHsgX19jMSA9IF9fYzI7IH0KKyAgc3RhdGljIGJvb2wgX1NUTFBfQ0FMTCBlcShjb25zdCBjaGFyX3R5cGUmIF9fYzEsIGNvbnN0IGNoYXJfdHlwZSYgX19jMikKKyAgeyByZXR1cm4gX19jMSA9PSBfX2MyOyB9CisgIHN0YXRpYyBib29sIF9TVExQX0NBTEwgbHQoY29uc3QgY2hhcl90eXBlJiBfX2MxLCBjb25zdCBjaGFyX3R5cGUmIF9fYzIpCisgIHsgcmV0dXJuIF9fYzEgPCBfX2MyOyB9CisKKyAgc3RhdGljIGludCBfU1RMUF9DQUxMIGNvbXBhcmUoY29uc3QgY2hhcl90eXBlKiBfX3MxLCBjb25zdCBjaGFyX3R5cGUqIF9fczIsIHNpemVfdCBfX24pIHsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX247ICsrX19pKQorICAgICAgaWYgKCFlcShfX3MxW19faV0sIF9fczJbX19pXSkpCisgICAgICAgIHJldHVybiBfX3MxW19faV0gPCBfX3MyW19faV0gPyAtMSA6IDE7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBzdGF0aWMgc2l6ZV90IF9TVExQX0NBTEwgbGVuZ3RoKGNvbnN0IGNoYXJfdHlwZSogX19zKSB7CisgICAgY29uc3QgY2hhcl90eXBlIF9OdWxsQ2hhciA9IF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQoY2hhcl90eXBlKTsKKyAgICBzaXplX3QgX19pKDApOworICAgIGZvciAoOyAhZXEoX19zW19faV0sIF9OdWxsQ2hhcik7ICsrX19pKSB7fQorICAgIHJldHVybiBfX2k7CisgIH0KKworICBzdGF0aWMgY29uc3QgY2hhcl90eXBlKiBfU1RMUF9DQUxMIGZpbmQoY29uc3QgY2hhcl90eXBlKiBfX3MsIHNpemVfdCBfX24sIGNvbnN0IGNoYXJfdHlwZSYgX19jKSB7CisgICAgZm9yICggOyBfX24gPiAwIDsgKytfX3MsIC0tX19uKQorICAgICAgaWYgKGVxKCpfX3MsIF9fYykpCisgICAgICAgIHJldHVybiBfX3M7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBzdGF0aWMgY2hhcl90eXBlKiBfU1RMUF9DQUxMIG1vdmUoY2hhcl90eXBlKiBfX3MxLCBjb25zdCBjaGFyX3R5cGUqIF9fczIsIHNpemVfdCBfU3opCisgIHsgcmV0dXJuIChfU3ogPT0gMCA/IF9fczEgOiAoY2hhcl90eXBlKiltZW1tb3ZlKF9fczEsIF9fczIsIF9TeiAqIHNpemVvZihjaGFyX3R5cGUpKSk7IH0KKworICBzdGF0aWMgY2hhcl90eXBlKiBfU1RMUF9DQUxMIGNvcHkoY2hhcl90eXBlKiBfX3MxLCBjb25zdCBjaGFyX3R5cGUqIF9fczIsIHNpemVfdCBfX24pIHsKKyAgICByZXR1cm4gKF9fbiA9PSAwID8gX19zMSA6CisgICAgICAoY2hhcl90eXBlKiltZW1jcHkoX19zMSwgX19zMiwgX19uICogc2l6ZW9mKGNoYXJfdHlwZSkpKTsKKyAgfQorCisgIHN0YXRpYyBjaGFyX3R5cGUqIF9TVExQX0NBTEwgYXNzaWduKGNoYXJfdHlwZSogX19zLCBzaXplX3QgX19uLCBjaGFyX3R5cGUgX19jKSB7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19uOyArK19faSkKKyAgICAgIF9fc1tfX2ldID0gX19jOworICAgIHJldHVybiBfX3M7CisgIH0KKworICBzdGF0aWMgaW50X3R5cGUgX1NUTFBfQ0FMTCBub3RfZW9mKGNvbnN0IGludF90eXBlJiBfX2MpCisgIHsgcmV0dXJuICFlcV9pbnRfdHlwZShfX2MsIGVvZigpKSA/IF9fYyA6IF9fU1RBVElDX0NBU1QoaW50X3R5cGUsIDApOyB9CisKKyAgc3RhdGljIGNoYXJfdHlwZSBfU1RMUF9DQUxMIHRvX2NoYXJfdHlwZShjb25zdCBpbnRfdHlwZSYgX19jKQorICB7IHJldHVybiAoY2hhcl90eXBlKV9fYzsgfQorCisgIHN0YXRpYyBpbnRfdHlwZSBfU1RMUF9DQUxMIHRvX2ludF90eXBlKGNvbnN0IGNoYXJfdHlwZSYgX19jKQorICB7IHJldHVybiAoaW50X3R5cGUpX19jOyB9CisKKyAgc3RhdGljIGJvb2wgX1NUTFBfQ0FMTCBlcV9pbnRfdHlwZShjb25zdCBpbnRfdHlwZSYgX19jMSwgY29uc3QgaW50X3R5cGUmIF9fYzIpCisgIHsgcmV0dXJuIF9fYzEgPT0gX19jMjsgfQorCisgIHN0YXRpYyBpbnRfdHlwZSBfU1RMUF9DQUxMIGVvZigpCisgIHsgcmV0dXJuIChpbnRfdHlwZSktMTsgfQorfTsKKworLy8gR2VuZXJpYyBjaGFyX3RyYWl0cyBjbGFzcy4gIE5vdGUgdGhhdCB0aGlzIGNsYXNzIGlzIHByb3ZpZGVkIG9ubHkKKy8vICBhcyBhIGJhc2UgZm9yIGV4cGxpY2l0IHNwZWNpYWxpemF0aW9uOyBpdCBpcyB1bmxpa2VseSB0byBiZSB1c2VmdWwKKy8vICBhcyBpcyBmb3IgYW55IHBhcnRpY3VsYXIgdXNlci1kZWZpbmVkIHR5cGUuICBJbiBwYXJ0aWN1bGFyLCBpdAorLy8gICp3aWxsIG5vdCB3b3JrKiBmb3IgYSBub24tUE9EIHR5cGUuCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+CitjbGFzcyBjaGFyX3RyYWl0cworICA6IHB1YmxpYyBfX2NoYXJfdHJhaXRzX2Jhc2U8X0NoYXJULCBfQ2hhclQ+IHt9OworCisvLyBTcGVjaWFsaXphdGlvbiBmb3IgY2hhci4KKworX1NUTFBfVEVNUExBVEVfTlVMTAorY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgY2hhcl90cmFpdHM8Y2hhcj4KKyAgOiBwdWJsaWMgX19jaGFyX3RyYWl0c19iYXNlPGNoYXIsIGludD4sCisgICAgcHVibGljIF9fc3RscG9ydF9jbGFzczxjaGFyX3RyYWl0czxjaGFyPiA+IHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBjaGFyIGNoYXJfdHlwZTsKKyAgdHlwZWRlZiBpbnQgaW50X3R5cGU7CisgIHR5cGVkZWYgc3RyZWFtb2ZmIG9mZl90eXBlOworICB0eXBlZGVmIHN0cmVhbXBvcyBwb3NfdHlwZTsKKyAgdHlwZWRlZiBtYnN0YXRlX3Qgc3RhdGVfdHlwZTsKKworICBzdGF0aWMgY2hhciBfU1RMUF9DQUxMIHRvX2NoYXJfdHlwZShjb25zdCBpbnQmIF9fYykKKyAgeyByZXR1cm4gKGNoYXIpKHVuc2lnbmVkIGNoYXIpX19jOyB9CisKKyAgc3RhdGljIGludCBfU1RMUF9DQUxMIHRvX2ludF90eXBlKGNvbnN0IGNoYXImIF9fYykKKyAgeyByZXR1cm4gKHVuc2lnbmVkIGNoYXIpX19jOyB9CisKKyAgc3RhdGljIGludCBfU1RMUF9DQUxMIGNvbXBhcmUoY29uc3QgY2hhciogX19zMSwgY29uc3QgY2hhciogX19zMiwgc2l6ZV90IF9fbikKKyAgeyByZXR1cm4gbWVtY21wKF9fczEsIF9fczIsIF9fbik7IH0KKworICBzdGF0aWMgc2l6ZV90IF9TVExQX0NBTEwgbGVuZ3RoKGNvbnN0IGNoYXIqIF9fcykKKyAgeyByZXR1cm4gc3RybGVuKF9fcyk7IH0KKworICBzdGF0aWMgdm9pZCBfU1RMUF9DQUxMIGFzc2lnbihjaGFyJiBfX2MxLCBjb25zdCBjaGFyJiBfX2MyKQorICB7IF9fYzEgPSBfX2MyOyB9CisKKyAgc3RhdGljIGNoYXIqIF9TVExQX0NBTEwgYXNzaWduKGNoYXIqIF9fcywgc2l6ZV90IF9fbiwgY2hhciBfX2MpIHsKKyAgICBtZW1zZXQoX19zLCBfX2MsIF9fbik7CisgICAgcmV0dXJuIF9fczsKKyAgfQorfTsKKworI2lmIGRlZmluZWQgKF9TVExQX0hBU19XQ0hBUl9UKQorLy8gU3BlY2lhbGl6YXRpb24gZm9yIHdjaGFyX3QuCitfU1RMUF9URU1QTEFURV9OVUxMCitjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBjaGFyX3RyYWl0czx3Y2hhcl90PgorICA6IHB1YmxpYyBfX2NoYXJfdHJhaXRzX2Jhc2U8d2NoYXJfdCwgd2ludF90PiB7CisjICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTkFUSVZFX1dJREVfRlVOQ1RJT05TKSAmJiAhZGVmaW5lZCAoX1NUTFBfV0NIQVJfSFBBQ0NfRVhDTFVERSkKK3B1YmxpYzoKKyMgICAgaWYgIWRlZmluZWQgKF9fQk9STEFORENfXykKKyAgc3RhdGljIHdjaGFyX3QqIF9TVExQX0NBTEwgbW92ZSh3Y2hhcl90KiBfX2Rlc3QsIGNvbnN0IHdjaGFyX3QqIF9fc3JjLCBzaXplX3QgX19uKQorICB7IHJldHVybiB3bWVtbW92ZShfX2Rlc3QsIF9fc3JjLCBfX24pOyB9CisjICAgIGVuZGlmCisKKyAgc3RhdGljIHdjaGFyX3QqIF9TVExQX0NBTEwgY29weSh3Y2hhcl90KiBfX2Rlc3QsIGNvbnN0IHdjaGFyX3QqIF9fc3JjLCBzaXplX3QgX19uKQorICB7IHJldHVybiB3bWVtY3B5KF9fZGVzdCwgX19zcmMsIF9fbik7IH0KKworIyAgICBpZiAhZGVmaW5lZCAoX19ETUNfXykgJiYgIWRlZmluZWQgKF9fQk9STEFORENfXykKKyAgc3RhdGljIGludCBfU1RMUF9DQUxMIGNvbXBhcmUoY29uc3Qgd2NoYXJfdCogX19zMSwgY29uc3Qgd2NoYXJfdCogX19zMiwgc2l6ZV90IF9fbikKKyAgeyByZXR1cm4gd21lbWNtcChfX3MxLCBfX3MyLCBfX24pOyB9CisjICAgIGVuZGlmCisKKyAgc3RhdGljIHdjaGFyX3QqIF9TVExQX0NBTEwgYXNzaWduKHdjaGFyX3QqIF9fcywgc2l6ZV90IF9fbiwgd2NoYXJfdCBfX2MpCisgIHsgcmV0dXJuIHdtZW1zZXQoX19zLCBfX2MsIF9fbik7IH0KKworICBzdGF0aWMgc2l6ZV90IF9TVExQX0NBTEwgbGVuZ3RoKGNvbnN0IHdjaGFyX3QqIF9fcykKKyAgeyByZXR1cm4gd2NzbGVuKF9fcyk7IH0KKworICBzdGF0aWMgdm9pZCBfU1RMUF9DQUxMIGFzc2lnbih3Y2hhcl90JiBfX2MxLCBjb25zdCB3Y2hhcl90JiBfX2MyKQorICB7IF9fYzEgPSBfX2MyOyB9CisjICBlbmRpZgorfTsKKyNlbmRpZgorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNlbmRpZiAvKiBfU1RMUF9DSEFSX1RSQUlUU19IICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvY29uY2VwdF9jaGVja3MuaCBiL3N0bHBvcnQvc3RsL2NvbmNlcHRfY2hlY2tzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHN0bC9jb25jZXB0X2NoZWNrcy5oCnJlbmFtZSB0byBzdGxwb3J0L3N0bC9jb25jZXB0X2NoZWNrcy5oCmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9jb25maWcvX2FpeC5oIGIvc3RscG9ydC9zdGwvY29uZmlnL19haXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWVhOGI2Ci0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvY29uZmlnL19haXguaApAQCAtMCwwICsxLDMgQEAKKyNkZWZpbmUgX1NUTFBfUExBVEZPUk0gIkFJWCIKKworI2RlZmluZSBfU1RMUF9VU0VfVU5JWF9JTwpkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdGwvY29uZmlnL19hbmRyb2lkLmggYi9zdGxwb3J0L3N0bC9jb25maWcvX2FuZHJvaWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWQ5NGJhCi0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvY29uZmlnL19hbmRyb2lkLmgKQEAgLTAsMCArMSw3NyBAQAorI2lmbmRlZiBfX3N0bF9jb25maWdfX2FuZHJvaWRfaAorI2RlZmluZSBfX3N0bF9jb25maWdfX2FuZHJvaWRfaAorCisjZGVmaW5lIF9TVExQX1BMQVRGT1JNICJBbmRyb2lkIgorCisvLyBNb3N0bHkgVW5peC1saWtlLgorI2RlZmluZSBfU1RMUF9VTklYIDEKKworLy8gSGF2ZSBwdGhyZWFkcyBzdXBwb3J0LgorI2RlZmluZSBfUFRIUkVBRFMKKworLy8gRG9uJ3QgaGF2ZSBuYXRpdmUgPGNwbHVzcGx1cz4gaGVhZGVycworI2RlZmluZSBfU1RMUF9IQVNfTk9fTkVXX0NfSEVBREVSUyAxCisKKy8vIFVzZSB1bml4IGZvciBzdHJlYW1zCisjZGVmaW5lIF9TVExQX1VTRV9VTklYX0lPIDEKKworLy8gTm8gcnR0aSBzdXBwb3J0CisjZGVmaW5lIF9TVExQX05PX1JUVEkgMQorCisvLyBDIGxpYnJhcnkgaXMgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuCisjZGVmaW5lIF9TVExQX1ZFTkRPUl9HTE9CQUxfQ1NURCAxCisKKy8vIERvbid0IGhhdmUgdW5kZXJseWluZyBsb2NhbCBzdXBwb3J0LgorI3VuZGVmIF9TVExQX1JFQUxfTE9DQUxFX0lNUExFTUVOVEVECisKKy8vIE5vIHB0aHJlYWRfc3BpbmxvY2tfdCBpbiBBbmRyb2lkCisjZGVmaW5lIF9TVExQX0RPTlRfVVNFX1BUSFJFQURfU1BJTkxPQ0sgMQorCisvLyBEbyBub3QgZW5hYmxlIHRocmVhZCBzdXBwb3J0CisjZGVmaW5lIF9OT1RIUkVBRFMgMQorCisvLyBMaXR0bGUgZW5kaWFuIHBsYXRmb3JtLgorI2RlZmluZSBfU1RMUF9MSVRUTEVfRU5ESUFOIDEKKworLy8gTm8gPGV4Y2VwdGlvbj4gaGVhZGVycworI2RlZmluZSBfU1RMUF9OT19FWENFUFRJT05fSEVBREVSIDEKKworLy8gTm8gdGhyb3dpbmcgZXhjZXB0aW9ucworI2RlZmluZSBfU1RMUF9OT19FWENFUFRJT05TIDEKKworLy8gTm8gbmVlZCB0byBkZWZpbmUgb3VyIG93biBuYW1lc3BhY2UKKyNkZWZpbmUgX1NUTFBfTk9fT1dOX05BTUVTUEFDRSAxCisKKy8vIFVzZSBfX25ld19hbGxvYyBpbnN0ZWFkIG9mIF9fbm9kZV9hbGxvYywgc28gd2UgZG9uJ3QgbmVlZCBzdGF0aWMgZnVuY3Rpb25zLgorI2RlZmluZSBfU1RMUF9VU0VfU0lNUExFX05PREVfQUxMT0MgMQorCisvLyBEb24ndCB1c2UgZXh0ZXJuIHZlcnNpb25zIG9mIHJhbmdlIGVycm9ycywgc28gd2UgZG9uJ3QgbmVlZCB0bworLy8gY29tcGlsZSBhcyBhIGxpYnJhcnkuCisjZGVmaW5lIF9TVExQX1VTRV9OT19FWFRFUk5fUkFOR0VfRVJST1JTIDEKKworLy8gVGhlIHN5c3RlbSBtYXRoIGxpYnJhcnkgZG9lc24ndCBoYXZlIGxvbmcgZG91YmxlIHZhcmlhbnRzLCBlLmcKKy8vIHNpbmwsIGNvc2wsIGV0YworI2RlZmluZSBfU1RMUF9OT19WRU5ET1JfTUFUSF9MIDEKKworLy8gRGVmaW5lIGhvdyB0byBpbmNsdWRlIG91ciBuYXRpdmUgaGVhZGVycy4KKyNkZWZpbmUgX1NUTFBfTkFUSVZFX0hFQURFUihoZWFkZXIpIDxsaWJzdGRjKysvaW5jbHVkZS9oZWFkZXI+CisjZGVmaW5lIF9TVExQX05BVElWRV9DX0hFQURFUihoZWFkZXIpIDwuLi9pbmNsdWRlL2hlYWRlcj4KKyNkZWZpbmUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUihoZWFkZXIpIDxsaWJzdGRjKysvaW5jbHVkZS9oZWFkZXI+CisjZGVmaW5lIF9TVExQX05BVElWRV9DUFBfUlVOVElNRV9IRUFERVIoaGVhZGVyKSA8bGlic3RkYysrL2luY2x1ZGUvaGVhZGVyPgorI2RlZmluZSBfU1RMUF9OQVRJVkVfT0xEX1NUUkVBTVNfSEVBREVSKGhlYWRlcikgPGxpYnN0ZGMrKy9pbmNsdWRlL2hlYWRlcj4KKyNkZWZpbmUgX1NUTFBfTkFUSVZFX0NQUF9SVU5USU1FX0hFQURFUihoZWFkZXIpIDxsaWJzdGRjKysvaW5jbHVkZS9oZWFkZXI+CisKKy8vIEluY2x1ZGUgbW9zdCBvZiB0aGUgZ2NjIHNldHRpbmdzLgorI2luY2x1ZGUgPHN0bC9jb25maWcvX2djYy5oPgorCisvLyBEbyBub3QgdXNlIGdsaWJjLCBBbmRyb2lkIGlzIG1pc3Npbmcgc29tZSB0aGluZ3MuCisjdW5kZWYgX1NUTFBfVVNFX0dMSUJDCisKKy8vIE5vIGV4Y2VwdGlvbnMuCisjZGVmaW5lIF9TVExQX05PX1VOQ0FVR0hUX0VYQ0VQVF9TVVBQT1JUIDEKKyNkZWZpbmUgX1NUTFBfTk9fVU5FWFBFQ1RFRF9FWENFUFRfU1VQUE9SVCAxCisKKy8vIEFuZHJvaWQgZG9lcyBoYXZlIGluY2x1ZGVfbmV4dCBidXQgaXQgZG9lc24ndCB3b3JrIHdlbGwgaW4gb3VyIGJ1aWxkIHN5c3RlbS4KKyN1bmRlZiBfU1RMUF9IQVNfSU5DTFVERV9ORVhUCisKKyNlbmRpZiAvKiBfX3N0bF9jb25maWdfX2FuZHJvaWRfaCAqLwpkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdGwvY29uZmlnL19hcGNjLmggYi9zdGxwb3J0L3N0bC9jb25maWcvX2FwY2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjRlMTM5Ci0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvY29uZmlnL19hcGNjLmgKQEAgLTAsMCArMSwzMCBAQAorLy8gU1RMcG9ydCBjb25maWcgZmlsZSBmb3IgQXBvZ2VlIDQueAorCisjZGVmaW5lIF9TVExQX0NPTVBJTEVSICJBcG9nZWUiCisKKyNkZWZpbmUgX1NUTFBfTk9fTkVXX05FV19IRUFERVIgMQorI2RlZmluZSBfU1RMUF9IQVNfTk9fTkVXX0NfSEVBREVSUyAxCisKKyNpZiBkZWZpbmVkKF9YT1BFTl9TT1VSQ0UpICYmIChfWE9QRU5fVkVSU0lPTiAtIDAgPj0gNCkKKyMgZGVmaW5lIF9TVExQX1JBTkQ0OCAxCisjZW5kaWYKKy8vICMgIGRlZmluZSBfU1RMUF9SQU5ENDggMQorI2RlZmluZSBfU1RMUF9MT05HX0xPTkcgbG9uZyBsb25nCisjZGVmaW5lIF9TVExQX05PX0JBRF9BTExPQyAxCisjZGVmaW5lIF9TVExQX05PX01FTUJFUl9URU1QTEFURV9LRVlXT1JEIDEKKyNkZWZpbmUgX1NUTFBfTk9OX1RZUEVfVE1QTF9QQVJBTV9CVUcgMQorLy8gIyAgZGVmaW5lIF9TVExQX05PX0VYUExJQ0lUX0ZVTkNUSU9OX1RNUExfQVJHUyAxCisjZGVmaW5lIF9TVExQX05PX0VYQ0VQVElPTl9IRUFERVIgMQorCisjdW5kZWYgIF9TVExQX0xJTktfVElNRV9JTlNUQU5USUFUSU9OCisjZGVmaW5lIF9TVExQX0xJTktfVElNRV9JTlNUQU5USUFUSU9OIDEKKworI2lmZGVmIF9fU1RETElCCisjICB1bmRlZiBfU1RMUF9OT19ORVdfQ19IRUFERVJTCisjICB1bmRlZiBfU1RMUF9OT19ORVdfTkVXX0hFQURFUgorIyAgdW5kZWYgX1NUTFBfTk9fQkFEX0FMTE9DCisjICB1bmRlZiBfU1RMUF9MT05HX0xPTkcKKyNlbHNlCisjICB1bmRlZiAgX1NUTFBfTk9fRVhDRVBUSU9OX1NQRUMKKyMgIGRlZmluZSBfU1RMUF9OT19FWENFUFRJT05fU1BFQyAxCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL2NvbmZpZy9fYXBwbGUuaCBiL3N0bHBvcnQvc3RsL2NvbmZpZy9fYXBwbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTllZDE0Ci0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvY29uZmlnL19hcHBsZS5oCkBAIC0wLDAgKzEsMTE4IEBACisvKiBTVExwb3J0IGNvbmZpZ3VyYXRpb24gZmlsZQorICogSXQgaXMgaW50ZXJuYWwgU1RMcG9ydCBoZWFkZXIgLSBETyBOT1QgaW5jbHVkZSBpdCBkaXJlY3RseQorICovCisKKy8qIGNvbW1vbiBjb25maWd1cmF0aW9uIHNldHRpbmdzIGZvciBBcHBsZSBNUFcgTXJDcHAgLyBTQ3BwICovCisKKyNkZWZpbmUgX1NUTFBfQ09NUElMRVIgInNwZWMgbWUhIgorCisjaWYgZGVmaW5lZChfX01SQ19fKSAmJiBfX01SQ19fIDwgMHg1MDAKKyMgZXJyb3IgQXBwbGUncyBNUFcgTXJDcHAgdi41LjAuMCBvciBiZXR0ZXIgY29tcGlsZXIgcmVxdWlyZWQKKyNlbmRpZgorI2lmIGRlZmluZWQoX19TQ19fKSAmJiBfX1NDX18gPCAweDg5MAorIyBlcnJvciBBcHBsZSdzIE1QVyBTQ3BwIHYuOC45LjAgb3IgYmV0dGVyIGNvbXBpbGVyIHJlcXVpcmVkCisjZW5kaWYKKworLyogVE9ETzogQ2hlY2sgdGhhdCB0aGlzIGNvbmZpZyBpcyBuZWNlc3NhcnkgZm9yIGFsbCBjb21waWxlciB2ZXJzaW9ucy4KKyAqIEl0IGlzIGhlcmUgZm9yIGhpc3RvcmljYWwgcmVhc29ucyBmb3IgdGhlIG1vbWVudC4KKyAqLworI2RlZmluZSBfU1RMUF9OT19DT05UQUlORVJTX0VYVEVOU0lPTgorCisjaWZkZWYgcU1hY0FwcAorIyBpZm5kZWYgX19DT05ESVRJT05BTE1BQ1JPU19fIC8qIHNraXAgaW5jbHVkaW5nIENvbmRpdGlvbmFsTWFjcm9zX0FDLmggaWYgQ29uZGl0aW9uYWxNYWNyb3MuaCBpcyBhbHJlYWR5IGluY2x1ZGVkICovCisjIGluY2x1ZGUgPENvcmVTd2l0Y2hlc19BQy5oPgorIyBpbmNsdWRlIDxDb25kaXRpb25hbE1hY3Jvc19BQy5oPgorIyBpbmNsdWRlIDxUeXBlc19BQy5oPgorIyBkZWZpbmUgX1NUTFBfRklMRV9fIF9GSUxFX0FDCisjIGRlZmluZSBfU1RMUF9ERUJVR19NRVNTQUdFCisjIGRlZmluZSBfX3N0bF9kZWJ1Z19tZXNzYWdlIFByb2dyYW1CcmVha19BQworIyBpbmNsdWRlIDxDb25kaXRpb25hbE1hY3Jvcy5oPgorIyBlbmRpZgorIyBpbmNsdWRlIDxUeXBlcy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8Q29uZGl0aW9uYWxNYWNyb3MuaD4KKyMgaW5jbHVkZSA8VHlwZXMuaD4KKyNlbmRpZgorCisjZGVmaW5lIF9TVExQX1VJTlQzMl9UIFVJbnQzMgordHlwZWRlZiBpbnQgd2ludF90OworCisjaWZuZGVmIFRZUEVfQk9PTAorIyBlcnJvciA8Q29uZGl0aW9uYWxNYWNyb3MuaD4gbXVzdCBiZSBpbmNsdWRlZC4gKFRZUEVfQk9PTCkKKyNlbmRpZgorI2lmICFUWVBFX0JPT0wKKyMgZGVmaW5lIF9TVExQX05PX0JPT0wKKyMgZGVmaW5lIF9TVExQX0RPTlRfVVNFX0JPT0xfVFlQRURFRgorI2VuZGlmCisKKyNpZm5kZWYgVFlQRV9MT05HTE9ORworIyBlcnJvciA8Q29uZGl0aW9uYWxNYWNyb3MuaD4gbXVzdCBiZSBpbmNsdWRlZC4gKFRZUEVfTE9OR0xPTkcpCisjZW5kaWYKKyNpZiBUWVBFX0xPTkdMT05HCisjIGRlZmluZSBfU1RMUF9MT05HX0xPTkcgbG9uZyBsb25nCisjZW5kaWYKKworI2lmICFfX29wdGlvbihleGNlcHRpb25zKQorIyBkZWZpbmUgX1NUTFBfSEFTX05PX0VYQ0VQVElPTlMKKyNlbmRpZgorCisjZGVmaW5lIF9TVExQX0RFQlVHX01FU1NBR0VfUE9TVCBEZWJ1Z1N0cigiXHBTVEwgZGlhZ25vc2lzIGlzc3VlZC4gU2VlICdzdGRlcnInIGZvciBkZXRhaWwuIik7CisjZGVmaW5lIF9TVExQX0FTU0VSVF9NU0dfVFJBSUxFUiAiICIKKworI2lmZGVmIF9TVExQX0RFQlVHCisjICAgZGVmaW5lIF9TVExQX1RIUk9XKHgpIChEZWJ1Z1N0cigiXHBTVEwgaXMgYWJvdXQgdG8gdGhyb3cgZXhjZXB0aW9uOiAiI3gpLHRocm93IHgpCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19NUkNfXykKKyMgaWZuZGVmIF9fc3BpbGxhcmdzCisjICBkZWZpbmUgX19zcGlsbGFyZ3MgMSAvLyBNckNwcCByZXF1aXJlcyB0aGlzIHN5bWJvbCB0byBiZSBkZWZpbmVkIGFzIDEgdG8gcHJvcGVybHkgaGFuZGxlIHZhX3N0YXJ0OyByZWYuWyBmaWxlIHN0ZGFyZy5oOyBsaW5lIDI2IF0KKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX1NDX18pCisjZGVmaW5lIF9TVExQX1ZFTkRPUl9MT05HX0RPVUJMRV9NQVRIICAgICAgICAvLypUWSAxMi8wMy8yMDAwIC0gU0NwcCdzIG5hdGl2ZSBtYXRoIHR5cGUgaXMgbG9uZyBkb3VibGUKKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEgKKyMgaWYgX19vcHRpb24odW5peF9pbmNsdWRlcykKKyMgIGRlZmluZSBfU1RMUF9OQVRJVkVfSU5DTFVERV9QQVRIIC4uL0NJbmNsdWRlcyAgIC8vIGV4cGVjdHMgdGhlIGFsaWFzIHRvIHtDSW5jbHVkZXN9IHVuZGVyIHRoZSBzYW1lIGZvbGRlciBhcyB7U1RMfQorIyBlbHNlCisjICBkZWZpbmUgX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSCA6OkNJbmNsdWRlcyAgIC8vIGV4cGVjdHMgdGhlIGFsaWFzIHRvIHtDSW5jbHVkZXN9IHVuZGVyIHRoZSBzYW1lIGZvbGRlciBhcyB7U1RMfQorIyBlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQoX1NUTFBfTUFLRV9IRUFERVIpCisjIGlmICFfX29wdGlvbih1bml4X2luY2x1ZGVzKQorIyAgZGVmaW5lIF9TVExQX01BS0VfSEVBREVSKHBhdGgsIGhlYWRlcikgPHBhdGg6aGVhZGVyPiAvLyBNYWMgdXNlcyAiOiIgZm9yIGRpcmVjdG9yeSBkZWxpbWl0ZXIKKyMgZW5kaWYKKyNlbmRpZgorCisjIGRlZmluZSBfU1RMRCBfREJHICAvLyB0byBrZWVwIHRoZSBsZW5ndGggb2YgZ2VuZXJhdGVkIHN5bWJvbHMgd2l0aGluIHRoZSBjb21waWxlciBsaW1pdGF0aW9uCisKKyNkZWZpbmUgX1NUTFBfVVNFX1NURElPX0lPIDEgICAgICAgLy8qVFkgMDIvMjQvMjAwMCAtIHNlZSBhbHNvIDsgcmVmLlsgZmlsZSBfZnN0cmVhbS5oOyBsaW5lIDM2IF0KKyNkZWZpbmUgX1NUTFBfTk9fVEhSRUFEUyAgICAgICAgICAgLy8qVFkgMTIvMTcvMjAwMCAtIG11bHRpLXRocmVhZCBjYXBhYmlsaXR5IG5vdCBleHBsb3JlZCwgeWV0LgorI3VuZGVmIF9SRUVOVFJBTlQgICAgICAgICAgICAgICAgICAvLyp0eSAxMS8yNC8yMDAxIC0gdG8gbWFrZSBzdXJlIG5vIHRocmVhZCBmYWNpbGl0eSBpcyBhY3RpdmF0ZWQKKyNkZWZpbmUgX05PVEhSRUFEUyAgICAgICAgICAgICAgICAgLy8qdHkgMTIvMDcvMjAwMSAtCisKKy8vIG5hdGl2ZSBsaWJyYXJ5IGxpbWl0YXRpb25zCisjZGVmaW5lIF9TVExQX1ZFTkRPUl9HTE9CQUxfU1REICAgICAgICAgIC8vIG1wdydzIGMrKyBsaWJzIGRvIG5vdCB1dGlsaXplIG5hbWVzcGFjZSBzdGQgeWV0CisjZGVmaW5lIF9TVExQX05PX0JBRF9BTExPQyAgICAgICAgICAgICAgIC8vIGtub3duIGxpbWl0YXRpb24KKyNkZWZpbmUgX1NUTFBfSEFTX05PX05FV19DX0hFQURFUlMgICAgICAgLy8ga25vd24gbGltaXRhdGlvbgorI2RlZmluZSBfU1RMUF9OT19ORVdfTkVXX0hFQURFUiAgICAgICAgICAvLyBrbm93biBsaW1pdGF0aW9uCisjZGVmaW5lIF9TVExQX05PX05BVElWRV9NQlNUQVRFX1QgICAgICAgIC8vIGtub3duIGxpbWl0YXRpb24KKyNkZWZpbmUgX1NUTFBfTk9fTkFUSVZFX1dJREVfRlVOQ1RJT05TICAgLy8ga25vd24gbGltaXRhdGlvbgorI2RlZmluZSBfU1RMUF9OT19OQVRJVkVfV0lERV9TVFJFQU1TICAgICAvLyBrbm93biBsaW1pdGF0aW9uCisjZGVmaW5lIF9TVExQX05PX1VOQ0FVR0hUX0VYQ0VQVF9TVVBQT1JUIC8vIGtub3duIGxpbWl0YXRpb24KKyNkZWZpbmUgX1NUTFBfQlJPS0VOX0VYQ0VQVElPTl9DTEFTUyAgICAgLy8ga25vd24gbGltaXRhdGlvbgorCisvLyBjb21waWxlciBsaW1pdGF0aW9ucworIyBkZWZpbmUgX1NUTFBfRE9OVF9TSU1VTEFURV9QQVJUSUFMX1NQRUNfRk9SX1RZUEVfVFJBSVRTCisKKyMgZGVmaW5lIF9TVExQX01QV0ZJWF9UUlkgdHJ5eyAgICAgICAgICAgICAgICAgICAgICAvLypUWSAwNi8wMS8yMDAwIC0gZXhjZXB0aW9uIGhhbmRsaW5nIGJ1ZyB3b3JrYXJvdW5kCisjIGRlZmluZSBfU1RMUF9NUFdGSVhfQ0FUQ0ggfWNhdGNoKC4uLil7dGhyb3c7fSAgICAgICAgICAgICAgLy8qVFkgMDYvMDEvMjAwMCAtIGV4Y2VwdGlvbiBoYW5kbGluZyBidWcgd29ya2Fyb3VuZAorIyBkZWZpbmUgX1NUTFBfTVBXRklYX0NBVENIX0FDVElPTihhY3Rpb24pIH1jYXRjaCguLi4pe2FjdGlvbjt0aHJvdzt9ICAvLypUWSAwNi8wMS8yMDAwIC0gZXhjZXB0aW9uIGhhbmRsaW5nIGJ1ZyB3b3JrYXJvdW5kCisjIGRlZmluZSBfU1RMUF9USFJPV19SRVRVUk5fQlVHICAgICAgICAgICAgLy8ga25vd24gbGltaXRhdGlvbgorIyBkZWZpbmUgX1NUTFBfTk9fQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTiAgICAvLyBrbm93biBsaW1pdGF0aW9uCisjIGRlZmluZSBfU1RMUF9OT19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OX1NZTlRBWCAgICAvLyBrbm93biBsaW1pdGF0aW9uCisjIGRlZmluZSBfU1RMUF9OT19GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIgICAgLy8ga25vd24gbGltaXRhdGlvbgorIyBkZWZpbmUgX1NUTFBfTk9fUkVMT1BTX05BTUVTUEFDRSAgICAgICAgICAvLyBrbm93biBsaW1pdGF0aW9uCisvLyBlbmQgb2Ygc3RsX2FwcGxlLmgKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL2NvbmZpZy9fYXM0MDAuaCBiL3N0bHBvcnQvc3RsL2NvbmZpZy9fYXM0MDAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGQ5NjBiCi0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvY29uZmlnL19hczQwMC5oCkBAIC0wLDAgKzEsNTUgQEAKKy8vIFNUTHBvcnQgY29uZmlndXJhdGlvbiBmaWxlCisvLyBJdCBpcyBpbnRlcm5hbCBTVExwb3J0IGhlYWRlciAtIERPIE5PVCBpbmNsdWRlIGl0IGRpcmVjdGx5CisKKy8vIEFTLzQwMCBDKysgY29uZmlnCisKKyMgaWZkZWYgX1JFRU5UUkFOVAorIyAgZGVmaW5lIF9QVEhSRUFEUworIyBlbmRpZgorCisjICBkZWZpbmUgX1NUTFBfTk9fTkVXX05FV19IRUFERVIgMQorCisjICBkZWZpbmUgX1NUTFBfTk9fQk9PTAorIyAgZGVmaW5lIF9TVExQX0xJTUlURURfREVGQVVMVF9URU1QTEFURVMKKworIyAgZGVmaW5lIF9TVExQX0hBU19OT19OQU1FU1BBQ0VTCisjICBkZWZpbmUgX1NUTFBfTkVFRF9UWVBFTkFNRQorIyAgZGVmaW5lIF9TVExQX05FRURfRVhQTElDSVQKKyMgIGRlZmluZSBfU1RMUF9IQVNfTk9fRVhDRVBUSU9OUworIyAgZGVmaW5lIF9TVExQX05PX0VYQ0VQVElPTl9TUEVDCisjICBkZWZpbmUgX1NUTFBfTk9fQVJST1dfT1BFUkFUT1IKKyMgIGRlZmluZSBfU1RMUF9OT19ORVdfU1RZTEVfQ0FTVFMKKworIyAgZGVmaW5lIF9TVExQX05FRURfTVVUQUJMRQorIyAgZGVmaW5lIF9TVExQX05PX1BBUlRJQUxfU1BFQ0lBTElaQVRJT05fU1lOVEFYCisjICBkZWZpbmUgX1NUTFBfTk9fQkFEX0FMTE9DCisjICBkZWZpbmUgX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFUworIyAgZGVmaW5lIF9TVExQX05PX01FTUJFUl9URU1QTEFURV9DTEFTU0VTCisjICBkZWZpbmUgX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFX0tFWVdPUkQKKyMgIGRlZmluZSBfU1RMUF9OT19RVUFMSUZJRURfRlJJRU5EUworIyAgZGVmaW5lIF9TVExQX05PX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04KKyMgIGRlZmluZSBfU1RMUF9OT19GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIKKworIyAgZGVmaW5lIF9TVExQX05PX01FVEhPRF9TUEVDSUFMSVpBVElPTgorIyAgZGVmaW5lIF9TVExQX05PX0VYUExJQ0lUX0ZVTkNUSU9OX1RNUExfQVJHUworCisvLyAjICBkZWZpbmUgX1NUTFBfTk9fRVhDRVBUSU9OX0hFQURFUgorCisjICBkZWZpbmUgX1NUTFBfSEFTX05PX05FV19DX0hFQURFUlMKKworIyAgZGVmaW5lIF9TVExQX1NUQVRJQ19DT05TVF9JTklUX0JVRworIyAgZGVmaW5lIF9TVExQX1RIUk9XX1JFVFVSTl9CVUcKKyMgIGRlZmluZSBfU1RMUF9MSU5LX1RJTUVfSU5TVEFOVElBVElPTgorIyAgZGVmaW5lIF9TVExQX05PX1RFTVBMQVRFX0NPTlZFUlNJT05TCisKKyMgIGRlZmluZSBfU1RMUF9OT05fVFlQRV9UTVBMX1BBUkFNX0JVRyAxCisjICBkZWZpbmUgX1NUTFBfVFJJVklBTF9ERVNUUlVDVE9SX0JVRyAgMQorCisjICBpZiBkZWZpbmVkKF9MT05HX0xPTkcpCisjICAgIGRlZmluZSBfU1RMUF9MT05HX0xPTkcgbG9uZyBsb25nCisjICBlbmRpZgorIyAgaWYgZGVmaW5lZChfUFRIUkVBRFMpCisjICAgIGRlZmluZSBfTVVMVElfVEhSRUFERUQKKyMgIGVuZGlmCisvLyBmYnAgOiB0byBmaXggX19wYXJ0aXRpb24oKSBwcm9ibGVtCisjIGRlZmluZSBfU1RMUF9OT05URU1QTF9CQVNFX01BVENIX0JVRyAxCmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9jb25maWcvX2F1dG9fbGluay5oIGIvc3RscG9ydC9zdGwvY29uZmlnL19hdXRvX2xpbmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODk4YzU1Ci0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvY29uZmlnL19hdXRvX2xpbmsuaApAQCAtMCwwICsxLDYxIEBACisvKiBXZSBkbyBub3QgdXNlIGF1dG8gbGluayBmZWF0dXJlIHdoZW46CisgKiAgLSB1c2VyIGFza2VkIG5vdCB0byB1c2UgaXQgKF9TVExQX0RPTlRfVVNFX0FVVE9fTElOSykKKyAqICAtIFNUTHBvcnQgaXMgdXNlZCBvbmx5IGFzIGEgU1RMIGxpYnJhcnkgKF9TVExQX05PX0lPU1RSRUFNUyB8fCBfU1RMUF9VU0VfTk9fSU9TVFJFQU1TKQorICogIC0gd2UgYXJlIGJ1aWxkaW5nIGEgQyB0cmFuc2xhdGlvbiB1bml0LCBTVExwb3J0IGlzIGEgQysrIFN0YW5kYXJkIGxpYnJhcnkgaW1wbGVtZW50YXRpb24KKyAqLworI2lmICFkZWZpbmVkIChfX0JVSUxESU5HX1NUTFBPUlQpICYmICFkZWZpbmVkIChfU1RMUF9ET05UX1VTRV9BVVRPX0xJTkspICYmIFwKKyAgICAhZGVmaW5lZCAoX1NUTFBfTk9fSU9TVFJFQU1TKSAmJiAhZGVmaW5lZCAoX1NUTFBfVVNFX05PX0lPU1RSRUFNUykgJiYgXAorICAgIGRlZmluZWQgKF9fY3BsdXNwbHVzKQorCisjICBkZWZpbmUgX1NUTFBfU1RSSU5HSVpFKFgpIF9TVExQX1NUUklOR0laRV9BVVgoWCkKKyMgIGRlZmluZSBfU1RMUF9TVFJJTkdJWkVfQVVYKFgpICNYCisKKyMgIGlmIGRlZmluZWQgKF9TVExQX0RFQlVHKQorIyAgICBkZWZpbmUgX1NUTFBfTElCX09QVElNX01PREUgInN0bGQiCisjICBlbGlmIGRlZmluZWQgKF9ERUJVRykKKyMgICAgZGVmaW5lIF9TVExQX0xJQl9PUFRJTV9NT0RFICJkIgorIyAgZWxzZQorIyAgICBkZWZpbmUgX1NUTFBfTElCX09QVElNX01PREUgIiIKKyMgIGVuZGlmCisKKyMgIGlmIGRlZmluZWQgKF9TVExQX0xJQl9OQU1FX01PVElGKQorIyAgICBkZWZpbmUgX1NUTFBfTElCX01PVElGICJfIl9TVExQX0xJQl9OQU1FX01PVElGCisjICBlbHNlCisjICAgIGRlZmluZSBfU1RMUF9MSUJfTU9USUYgIiIKKyMgIGVuZGlmCisKKyMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9EWU5BTUlDX0xJQikKKyMgICAgaWYgZGVmaW5lZCAoX1NUTFBfVVNJTkdfQ1JPU1NfTkFUSVZFX1JVTlRJTUVfTElCKQorIyAgICAgIGRlZmluZSBfU1RMUF9MSUJfVFlQRSAiX3giCisjICAgIGVsc2UKKyMgICAgICBkZWZpbmUgX1NUTFBfTElCX1RZUEUgIiIKKyMgICAgZW5kaWYKKyMgIGVsc2UKKyMgICAgaWYgZGVmaW5lZCAoX1NUTFBfVVNJTkdfQ1JPU1NfTkFUSVZFX1JVTlRJTUVfTElCKQorIyAgICAgIGRlZmluZSBfU1RMUF9MSUJfVFlQRSAiX3N0YXRpeCIKKyMgICAgZWxzZQorIyAgICAgIGRlZmluZSBfU1RMUF9MSUJfVFlQRSAiX3N0YXRpYyIKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisKKyMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9EWU5BTUlDX0xJQikKKyMgICAgZGVmaW5lIF9TVExQX1ZFUlNJT05fU1RSICIuIl9TVExQX1NUUklOR0laRShfU1RMUE9SVF9NQUpPUikiLiJfU1RMUF9TVFJJTkdJWkUoX1NUTFBPUlRfTUlOT1IpCisjICBlbHNlCisjICAgIGRlZmluZSBfU1RMUF9WRVJTSU9OX1NUUiAiIgorIyAgZW5kaWYKKworIyAgZGVmaW5lIF9TVExQX1NUTFBPUlRfTElCICJzdGxwb3J0Il9TVExQX0xJQl9PUFRJTV9NT0RFIiJfU1RMUF9MSUJfVFlQRSIiX1NUTFBfTElCX01PVElGIiJfU1RMUF9WRVJTSU9OX1NUUiIubGliIgorCisjICBpZiBkZWZpbmVkIChfU1RMUF9WRVJCT1NFKQorIyAgICBwcmFnbWEgbWVzc2FnZSAoIlNUTHBvcnQ6IEF1dG8gbGlua2luZyB0byAiX1NUTFBfU1RMUE9SVF9MSUIpCisjICBlbmRpZgorIyAgcHJhZ21hIGNvbW1lbnQgKGxpYiwgX1NUTFBfU1RMUE9SVF9MSUIpCisKKyMgIHVuZGVmIF9TVExQX1NUTFBPUlRfTElCCisjICB1bmRlZiBfU1RMUF9MSUJfT1BUSU1fTU9ERQorIyAgdW5kZWYgX1NUTFBfTElCX1RZUEUKKyMgIHVuZGVmIF9TVExQX1NUUklOR0laRV9BVVgKKyMgIHVuZGVmIF9TVExQX1NUUklOR0laRQorCisjZW5kaWYgLyogX1NUTFBfRE9OVF9VU0VfQVVUT19MSU5LICovCisKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL2NvbmZpZy9fYmMuaCBiL3N0bHBvcnQvc3RsL2NvbmZpZy9fYmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzgwMmRjCi0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvY29uZmlnL19iYy5oCkBAIC0wLDAgKzEsMTM4IEBACisvKiBTVExwb3J0IGNvbmZpZ3VyYXRpb24gZmlsZQorICogSXQgaXMgaW50ZXJuYWwgU1RMcG9ydCBoZWFkZXIgLSBETyBOT1QgaW5jbHVkZSBpdCBkaXJlY3RseSAqLworCisjZGVmaW5lIF9TVExQX0NPTVBJTEVSICJCb3JsYW5kIgorCisjaWYgKF9fQk9STEFORENfXyA8IDB4NTUxKQorIyAgZXJyb3IgLSBCb3JsYW5kIGNvbXBpbGVycyBiZWxvdyB2ZXJzaW9uIDUuNS4xIG5vdCBzdXBwb3J0ZWQuCisjZW5kaWYKKworI3ByYWdtYSBkZWZpbmVvbm9wdGlvbiBfU1RMUF9OT19SVFRJIC1SVC0KKworI2RlZmluZSBfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNCisKKyNpZiAoX19CT1JMQU5EQ19fID49IDB4NTgwKQorIyAgZGVmaW5lIF9TVExQX0hBU19JTkNMVURFX05FWFQKKyMgIGRlZmluZSBfU1RMUF9OQVRJVkVfSEVBREVSKGhlYWRlcikgPC4uL2luY2x1ZGUvIyNoZWFkZXI+CisjICBkZWZpbmUgX1NUTFBfTkFUSVZFX0NQUF9SVU5USU1FX0hFQURFUihoZWFkZXIpIDwuLi9pbmNsdWRlL2Rpbmt1bXdhcmUvIyNoZWFkZXI+CisjICBkZWZpbmUgX1NUTFBfTk9fTkVXX0NfSEVBREVSUworIyAgZGVmaW5lIF9TVExQX05PX0ZPUkNFX0lOU1RBTlRJQVRFCisjZW5kaWYKKworI2lmIChfX0JPUkxBTkRDX18gPj0gMHg1NzApICYmIChfX0JPUkxBTkRDX18gPCAweDU4MCkKKyMgIGRlZmluZSBfU1RMUF9OT19ORVdfQ19IRUFERVJTCisjICBkZWZpbmUgX1NUTFBfTk9fRk9SQ0VfSU5TVEFOVElBVEUKKyMgIGRlZmluZSBfU1RMUF9ERUZfQ09OU1RfREVGX1BBUkFNX0JVRworIyAgZGVmaW5lIF9TVExQX1VTRV9ERUZBVUxUX0ZJTEVfT0ZGU0VUCisKKyMgIGlmIGRlZmluZWQgKF9fY3BsdXNwbHVzKQorIyAgICBkZWZpbmUgX1NUTFBfTkFUSVZFX0NQUF9DX0lOQ0xVREVfUEFUSCAuLi9pbmNsdWRlL2MrKy8gIyMgR0NDX1ZFUlNJT04KKyMgICAgZGVmaW5lIF9TVExQX05BVElWRV9DUFBfUlVOVElNRV9JTkNMVURFX1BBVEggLi4vaW5jbHVkZS9jKysvICMjIEdDQ19WRVJTSU9OCisjICBlbmRpZgorCisjICB1bmRlZiBfU1lTX0NERUZTX0gKKyMgIGluY2x1ZGUgPC91c3IvaW5jbHVkZS9zeXMvY2RlZnMuaD4KKworIyAgaWZkZWYgX19NVF9fCisjICAgIGRlZmluZSBfUFRIUkVBRFMKKyMgICAgaWYgIWRlZmluZWQgKF9SVExETEwpCisjICAgICAgZGVmaW5lIF9TVExQX0RPTlRfVVNFX1BUSFJFQURfU1BJTkxPQ0sKKyMgICAgZW5kaWYKKyMgIGVsc2UKKyMgICAgZGVmaW5lIF9OT1RIUkVBRFMKKyMgIGVuZGlmCisKKyMgIHByYWdtYSBkZWZpbmVvbm9wdGlvbiBfQ1BQVU5XSU5EIC14ZAorIyAgZGVmaW5lIF9TVExQX05PX0VYQ0VQVElPTl9IRUFERVIKKyMgIGRlZmluZSBfU1RMUF9ET05UX1VTRV9FWENFUFRJT05TCisjZW5kaWYgCisKKyNpZiAoX19CT1JMQU5EQ19fID49IDB4NTYwKSAmJiAoX19CT1JMQU5EQ19fIDwgMHg1NzApCisjICBkZWZpbmUgX1VTRV9PTERfUldfU1RMCisjZW5kaWYKKworI2lmIChfX0JPUkxBTkRDX18gPj0gMHg1NjApCisjICBpZiAhZGVmaW5lZCAoX19CVUlMRElOR19TVExQT1JUKQorIyAgICBkZWZpbmUgTk9XSU5CQVNFSU5URVJMT0NLICAKKyMgIGVuZGlmCisjICBkZWZpbmUgX1NUTFBfTEFOR19JTlZBUklBTlRfREVGSU5FRAorI2VuZGlmCisKKyNpZiAoX19CT1JMQU5EQ19fIDwgMHg1OTApCisjICBkZWZpbmUgX1NUTFBfTk9fRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSCisjICBkZWZpbmUgX1NUTFBfRExMRVhQT1JUX05FRURTX1BSRURFQ0xBUkFUSU9OCisgICAvLyA8Yml0c2V0PiBwcm9ibGVtcworIyAgZGVmaW5lIF9TVExQX01FTUJFUl9TUEVDSUFMSVpBVElPTl9CVUcgMQorIyAgaWZkZWYgX19jcGx1c3BsdXMKKyMgICAgZGVmaW5lIF9TVExQX1RSMSBfU1RMUF9TVERfTkFNRTo6dHIxOjoKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIChfX0JPUkxBTkRDX18gPCAweDU2NCkKKyMgIGRlZmluZSBfU1RMUF9RVUFMSUZJRURfU1BFQ0lBTElaQVRJT05fQlVHCisjICBkZWZpbmUgX1NUTFBfTk9fTU9WRV9TRU1BTlRJQworI2VuZGlmCisKKyNkZWZpbmUgX1NUTFBfRE9OVF9VU0VfUFJJVl9OQU1FU1BBQ0UKKyNkZWZpbmUgX1NUTFBfTk9fVFlQRU5BTUVfQkVGT1JFX05BTUVTUEFDRQorI2RlZmluZSBfU1RMUF9OT19WRU5ET1JfU1RETElCX0wKKyNkZWZpbmUgX1NUTFBfTk9fVkVORE9SX01BVEhfRgorI2RlZmluZSBfU1RMUF9ET05UX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0gMQorCisjaWYgKF9fQk9STEFORENfXyA8IDB4NTcwKSB8fCAoX19CT1JMQU5EQ19fID49IDB4NTgwKQorI2RlZmluZSBfU1RMUF9OT19OQVRJVkVfTUJTVEFURV9UCisjdW5kZWYgX1NUTFBfTk9fVU5FWFBFQ1RFRF9FWENFUFRfU1VQUE9SVAorI2VuZGlmCisKKyNpZiAoX19CT1JMQU5EQ19fIDwgMHg1ODApICYmICFkZWZpbmVkIChfUlRMRExMKQorIyAgZGVmaW5lIF9VTkNBVUdIVF9FWENFUFRJT04gMQorI2VuZGlmCisKKy8vIDxsaW1pdHM+IHByb2JsZW0KKyNkZWZpbmUgX1NUTFBfU1RBVElDX0NPTlNUX0lOSVRfQlVHCisKKyNkZWZpbmUgX1NUTFBfSEFTX1NQRUNJRklDX1BST0xPR19FUElMT0cgMQorCisjZGVmaW5lIF9TVExQX0xPTkdfTE9ORyAgX19pbnQ2NAorCisvLyBhdXRvIGVuYWJsZSB0aHJlYWQgc2FmZXR5IGFuZCBleGNlcHRpb25zOgorI2lmbmRlZiBfQ1BQVU5XSU5ECisjICBkZWZpbmUgX1NUTFBfSEFTX05PX0VYQ0VQVElPTlMKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19NVF9fKSAmJiAhZGVmaW5lZCAoX05PVEhSRUFEUykKKyMgIGRlZmluZSBfU1RMUF9USFJFQURTCisjZW5kaWYKKworI2RlZmluZSBfU1RMUF9FWFBPUlRfREVDTFNQRUMgX19kZWNsc3BlYyhkbGxleHBvcnQpCisjZGVmaW5lIF9TVExQX0lNUE9SVF9ERUNMU1BFQyBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKworI2RlZmluZSBfU1RMUF9DTEFTU19FWFBPUlRfREVDTFNQRUMgX19kZWNsc3BlYyhkbGxleHBvcnQpCisjZGVmaW5lIF9TVExQX0NMQVNTX0lNUE9SVF9ERUNMU1BFQyBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKworI2lmIGRlZmluZWQgKF9ETEwpCisjICBkZWZpbmUgX1NUTFBfRExMCisjZW5kaWYKKyNpZiBkZWZpbmVkIChfUlRMRExMKQorIyAgZGVmaW5lIF9TVExQX1JVTlRJTUVfRExMCisjZW5kaWYKKyNpbmNsdWRlIDxzdGwvY29uZmlnL19kZXRlY3RfZGxsX29yX2xpYi5oPgorI3VuZGVmIF9TVExQX1JVTlRJTUVfRExMCisjdW5kZWYgX1NUTFBfRExMCisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfRFlOQU1JQ19MSUIpCisjICBkZWZpbmUgX1NUTFBfVVNFX0RFQ0xTUEVDIDEKKyMgIGlmIGRlZmluZWQgKF9fQlVJTERJTkdfU1RMUE9SVCkKKyMgICAgZGVmaW5lIF9TVExQX0NBTEwgX19jZGVjbCBfX2V4cG9ydAorIyAgZWxzZQorIyAgICAgIGRlZmluZSAgX1NUTFBfQ0FMTCBfX2NkZWNsCisjICAgIGVuZGlmCisjZWxzZQorIyAgZGVmaW5lICBfU1RMUF9DQUxMIF9fY2RlY2wKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKF9fbGludXhfXykKKyMgIGluY2x1ZGUgPHN0bC9jb25maWcvX2F1dG9fbGluay5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGwvY29uZmlnL19mZWVkYmFjay5oPgpkaWZmIC0tZ2l0IGEvc3RsL2NvbmZpZy9fY29tby5oIGIvc3RscG9ydC9zdGwvY29uZmlnL19jb21vLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHN0bC9jb25maWcvX2NvbW8uaApyZW5hbWUgdG8gc3RscG9ydC9zdGwvY29uZmlnL19jb21vLmgKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL2NvbmZpZy9fY3JheS5oIGIvc3RscG9ydC9zdGwvY29uZmlnL19jcmF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUzMjdjMQotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc3RsL2NvbmZpZy9fY3JheS5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjZGVmaW5lIF9TVExQX0NPTVBJTEVSICJDQyIKKworLy8gTW9zdGx5IGNvcnJlY3QgZ3Vlc3MsIGNoYW5nZSBpdCBmb3IgQWxwaGEgKGFuZCBvdGhlciBlbnZpcm9ubWVudHMKKy8vIHRoYXQgaGFzIDY0LWJpdCAibG9uZyIpCisjICBkZWZpbmUgX1NUTFBfVUlOVDMyX1QgdW5zaWduZWQgbG9uZworCisvLyBVbmNvbW1lbnQgaWYgbG9uZyBsb25nIGlzIGF2YWlsYWJsZQorIyAgZGVmaW5lIF9TVExQX0xPTkdfTE9ORyBsb25nIGxvbmcKKworLy8gVW5jb21tZW50IHRoaXMgaWYgeW91ciBjb21waWxlciBjYW4ndCBpbmxpbmUgd2hpbGUoKSwgZm9yKCkKKyMgIGRlZmluZSBfU1RMUF9MT09QX0lOTElORV9QUk9CTEVNUyAxCisKKy8vIFVuY29tbWVudCB0aGlzIGlmIHlvdXIgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCBleGNlcHRpb25zCisvLyBDcmF5IEMrKyBzdXBwb3J0cyBleGNlcHRpb25zIHdoZW4gJy1oIGV4Y2VwdGlvbnMnIG9wdGlvbiBpcyB1c2VyOworLy8gdGhlcmVmb3JlICctRF9TVExQX0hBU19OT19FWENFUFRJT05TJyBtdXN0IGJlIHVzZWQgd2hlbiAnLWggZXhjZXB0aW9ucycKKy8vIGlzIE5PVCB1c2VkLgorLy8jICBkZWZpbmUgX1NUTFBfSEFTX05PX0VYQ0VQVElPTlMgMQorCisvLyBEZWxldGU/CisvLyBEZWZpbmUgdGhpcyBpZiBjb21waWxlciBsYWNrcyA8ZXhjZXB0aW9uPiBoZWFkZXIKKy8vIyAgZGVmaW5lIF9TVExQX05PX0VYQ0VQVElPTl9IRUFERVIgMQorCisvLyBVbmNvbW1lbnQgdGhpcyBpZiB5b3VyIEMgbGlicmFyeSBoYXMgbHJhbmQ0OCgpIGZ1bmN0aW9uCisjICBkZWZpbmUgX1NUTFBfUkFORDQ4IDEKKworLy8gVW5jb21tZW50IGlmIG5hdGl2ZSBuZXctc3R5bGUgQyBsaWJyYXJ5IGhlYWRlcnMgbGlsZSA8Y3N0ZGRlZj4sIGV0YyBhcmUgbm90IGF2YWlsYWJsZS4KKyMgICBkZWZpbmUgX1NUTFBfSEFTX05PX05FV19DX0hFQURFUlMgMQorCisvLyB1bmNvbW1lbnQgaWYgbmV3LXN0eWxlIGhlYWRlcnMgPG5ldz4gaXMgYXZhaWxhYmxlCisjICAgZGVmaW5lIF9TVExQX05PX05FV19ORVdfSEVBREVSIDEKKworLy8gdW5jb21tZW50IHRoaXMgaWYgPGlvc3RyZWFtPiBhbmQgb3RoZXIgU1REIGhlYWRlcnMgcHV0IHRoZWlyIHN0dWZmIGluIDo6bmFtZXNwYWNlLAorLy8gbm90IHN0ZDo6CisjICBkZWZpbmUgX1NUTFBfVkVORE9SX0dMT0JBTF9TVEQKKworLy8gdW5jb21tZW50IHRoaXMgaWYgPGNzdGRpbz4gYW5kIHRoZSBsaWtlIHB1dCBzdHVmZiBpbiA6Om5hbWVzcGFjZSwKKy8vIG5vdCBzdGQ6OgorIyAgZGVmaW5lIF9TVExQX1ZFTkRPUl9HTE9CQUxfQ1NURAorCisjIGRlZmluZSBfU1RMUF9OQVRJVkVfQ19IRUFERVIoX194KSA8L3Vzci9pbmNsdWRlLyMjX194PgorLy8gV0FSTklORzogRm9sbG93aW5nIGlzIGhhcmRjb2RlZCB0byB0aGUgc3lzdGVtIGRlZmF1bHQgQysrIGluY2x1ZGUgZmlsZXMKKyMgZGVmaW5lIF9TVExQX05BVElWRV9DUFBfUlVOVElNRV9IRUFERVIoX194KSA8L29wdC9jdGwvQ0MvQ0MvaW5jbHVkZS8jI19feD4KKworCisjIGRlZmluZSBfU1RMUF9OT19OQVRJVkVfTUJTVEFURV9UCisjIGRlZmluZSBfU1RMUF9OT19VU0lOR19GT1JfR0xPQkFMX0ZVTkNUSU9OUworLy8jIGRlZmluZSBfU1RMUF9WRU5ET1JfR0xPQkFMX0VYQ0VQVF9TVEQKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL2NvbmZpZy9fY3lnd2luLmggYi9zdGxwb3J0L3N0bC9jb25maWcvX2N5Z3dpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MTA3NDMKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9jb25maWcvX2N5Z3dpbi5oCkBAIC0wLDAgKzEsOSBAQAorI2RlZmluZSBfU1RMUF9QTEFURk9STSAiQ3lnd2luIgorCisjZGVmaW5lIF9TVExQX1VOSVgKKworI2lmbmRlZiBfU1RMUF9VU0VfU1RESU9fSU8KKyMgIGRlZmluZSBfU1RMUF9VU0VfVU5JWF9JTworI2VuZGlmCisKKyNkZWZpbmUgX1NUTFBfTERPVUJMRV85NgpkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdGwvY29uZmlnL19kZWMuaCBiL3N0bHBvcnQvc3RsL2NvbmZpZy9fZGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM4YWNlNwotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc3RsL2NvbmZpZy9fZGVjLmgKQEAgLTAsMCArMSwxMTMgQEAKKyNkZWZpbmUgX1NUTFBfQ09NUElMRVIgIkRlYyIKKworIyBkZWZpbmUgX1NUTFBfSEFTX1NQRUNJRklDX1BST0xPR19FUElMT0cKKworIyBkZWZpbmUgX1NUTFBfTkFUSVZFX0hFQURFUihoZWFkZXIpIDwuLi9jeHgvIyNoZWFkZXI+CisjIGRlZmluZSBfU1RMUF9OQVRJVkVfQ19IRUFERVIoeCkgPC4uL2luY2x1ZGUvIyN4PgorCisjaWYgKF9fREVDQ1hYX1ZFUiA8IDYwMzAwMDAwKQorIyBkZWZpbmUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUihoZWFkZXIpIDwuLi9jeHgvIyNoZWFkZXI+CisjZWxzZQorIyBkZWZpbmUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUihoZWFkZXIpIDwvdXNyL2luY2x1ZGUvY3h4X2NuYW1lLyMjaGVhZGVyPgorI2VuZGlmCisKKyMgZGVmaW5lIF9TVExQX05BVElWRV9PTERfU1RSRUFNU19IRUFERVIoaGVhZGVyKSA8Li4vY3h4LyMjaGVhZGVyPgorIyBkZWZpbmUgX1NUTFBfTkFUSVZFX0NQUF9SVU5USU1FX0hFQURFUihoZWFkZXIpIDwuLi9jeHgvIyNoZWFkZXI+CisKKy8qIEFscGhhIGlzIGxpdHRsZS1lbmRpYW4gKi8KKyMgZGVmaW5lIF9TVExQX0xJVFRMRV9FTkRJQU4KKworLy8gY29sbGlzaW9ucworIyBkZWZpbmUgX1NUTFBfRE9OVF9QVVRfU1RMUE9SVF9JTl9TVEQKKworI2lmIChfX0RFQ0NYWF9WRVIgPCA2MDAwMDAwMCkKKworLyoKKyBhdXRvbWF0aWMgdGVtcGxhdGUgaW5zdGFudGlhdGlvbiBkb2VzIG5vdAorIHdvcmsgd2l0aCBuYW1lc3BhY2VzIDsoCisqLworIyBkZWZpbmUgX1NUTFBfSEFTX05PX05BTUVTUEFDRVMgMQorCisjIGRlZmluZSBfU1RMUF9OT19ORVdfTkVXX0hFQURFUiAxCisKKyMgZGVmaW5lIF9TVExQX05PX1dDSEFSX1QgIDEKKyMgZGVmaW5lIF9TVExQX05FRURfRVhQTElDSVQgIDEKKworIyBkZWZpbmUgX1NUTFBfTk9fQk9PTCAgMQorIyBkZWZpbmUgX1NUTFBfTkVFRF9UWVBFTkFNRSAxCisjIGRlZmluZSBfU1RMUF9OT19ORVdfU1RZTEVfQ0FTVFMgMQorIyBkZWZpbmUgX1NUTFBfTkVFRF9NVVRBQkxFIDEKKyMgZGVmaW5lIF9TVExQX05PX0JBRF9BTExPQyAxCisKKworIyBkZWZpbmUgX1NUTFBfTk9fUEFSVElBTF9TUEVDSUFMSVpBVElPTl9TWU5UQVggMQorCisjIGRlZmluZSBfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVTIDEKKyMgZGVmaW5lIF9TVExQX05PX01FTUJFUl9URU1QTEFURV9DTEFTU0VTIDEKKyMgZGVmaW5lIF9TVExQX05PX01FTUJFUl9URU1QTEFURV9LRVlXT1JEIDEKKyMgZGVmaW5lIF9TVExQX05PX1FVQUxJRklFRF9GUklFTkRTIDEKKyMgZGVmaW5lIF9TVExQX05PX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04gMQorIyBkZWZpbmUgX1NUTFBfTk9fRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSIDEKKyMgZGVmaW5lIF9TVExQX05PTl9UWVBFX1RNUExfUEFSQU1fQlVHIDEKKyMgZGVmaW5lIF9TVExQX0JST0tFTl9VU0lOR19ESVJFQ1RJVkUgMQorIyBkZWZpbmUgX1NUTFBfTk9fRVhDRVBUSU9OX0hFQURFUiAxCisjIGRlZmluZSBfU1RMUF9ERUZfQ09OU1RfUExDVF9ORVdfQlVHIDEKKyMgZGVmaW5lIF9TVExQX0RFRl9DT05TVF9ERUZfUEFSQU1fQlVHIDEKKworI2VuZGlmCisKKworI2lmbmRlZiBfX05PX1VTRV9TVERfSU9TVFJFQU0KKy8qIGRlZmF1bHQgaXMgdG8gdXNlIG5ldyBpb3N0cmVhbXMsIGFueXdheSAqLworIyBpZm5kZWYgX19VU0VfU1REX0lPU1RSRUFNCisjICBkZWZpbmUgX19VU0VfU1REX0lPU1RSRUFNCisjIGVuZGlmCisjZW5kaWYKKworLyoKKyMgaWZuZGVmIF9fU1REX1NUUklDVF9BTlNJX0VSUk9SUworIyBlbmRpZgorKi8KKworI2lmbmRlZiBfX0VYQ0VQVElPTlMKKyMgZGVmaW5lIF9TVExQX0hBU19OT19FWENFUFRJT05TIDEKKyNlbmRpZgorCisjIGlmZGVmIF9fSU1QTElDSVRfSU5DTFVERV9FTkFCTEVECisKKy8qIGJ1dCwgd29ya3Mgd2l0aCBvdXJzIDspLiAqLworIyAgZGVmaW5lIF9TVExQX0xJTktfVElNRV9JTlNUQU5USUFUSU9OIDEKKyMgZWxzZQorIyAgdW5kZWYgX1NUTFBfTElOS19USU1FX0lOU1RBTlRJQVRJT04KKyMgZW5kaWYKKworIyBpZiBkZWZpbmVkIChfX0lNUExJQ0lUX1VTSU5HX1NURCkgJiYgIWRlZmluZWQgKF9fTk9fVVNFX1NURF9JT1NUUkVBTSkKKy8qCisgd2Ugc2hvdWxkIGJhbiB0aGF0ICEKKyAjICBlcnJvciAiU1RMcG9ydCB3b24ndCB3b3JrIHdpdGggbmV3IGlvc3RyZWFtcyBhbmQgc3RkOjogYmVpbmcgaW1wbGljaXRseSBpbmNsdWRlZC4gUGxlYXNlIHVzZSAtc3RkIHN0cmljdF9hbnNpW19lcnJvcnNdIG9yIHNwZWNpZnkgX19OT19VU0VfU1REX0lPU1RSRUFNIgorKi8KKyMgZW5kaWYKKworIyBpZiAoZGVmaW5lZCAoX19TVERfU1RSSUNUX0FOU0kpIHx8IGRlZmluZWQgKF9fU1REX1NUUklDVF9BTlNJX0VSUk9SUykpCisjICBkZWZpbmUgX1NUTFBfU1RSSUNUX0FOU0kgMQorIyBlbHNlCisvKiB3ZSB3YW50IHRvIGVuZm9yY2UgaXQgKi8KKyMgIGRlZmluZSBfU1RMUF9MT05HX0xPTkcgbG9uZyBsb25nCisjIGVuZGlmCisKKy8qIHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyIHR5cGUgKi8KKyMgIGRlZmluZSBfU1RMUF9VSU5UMzJfVCB1bnNpZ25lZCBpbnQKKyNpZiBkZWZpbmVkKF9YT1BFTl9TT1VSQ0UpICYmIChfWE9QRU5fVkVSU0lPTiAtIDAgPj0gNCkKKyMgZGVmaW5lIF9TVExQX1JBTkQ0OCAxCisjZW5kaWYKKy8qICMgIGRlZmluZSBfU1RMUF9SQU5ENDggMSAqLworCisjICBkZWZpbmUgX1NUTFBfTk9fRVhQTElDSVRfRlVOQ1RJT05fVE1QTF9BUkdTIDEKKworIyBpZiAoX19ERUNDWFhfVkVSIDw9IDYwNjAwMDAwKQorIyAgZGVmaW5lIF9TVExQX0hBU19OT19ORVdfQ19IRUFERVJTIDEKKyMgZW5kaWYKKworI2lmICFkZWZpbmVkIChfTk9USFJFQURTKSAmJiAhZGVmaW5lZCAoX1NUTFBfVEhSRUFEU19ERUZJTkVEKQorIyAgZGVmaW5lIF9TVExQX0RFQ19USFJFQURTCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL2NvbmZpZy9fZGVjX3Ztcy5oIGIvc3RscG9ydC9zdGwvY29uZmlnL19kZWNfdm1zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRhMGZiOAotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc3RsL2NvbmZpZy9fZGVjX3Ztcy5oCkBAIC0wLDAgKzEsODkgQEAKKy8vIE9wZW5WTVMgdmVyc2lvbgorCisjZGVmaW5lIF9TVExQX0NPTVBJTEVSICJEZWMgVm1zIgorCisjIGRlZmluZSBfU1RMUF9OQVRJVkVfSEVBREVSKGhlYWRlcikgPHN5cyRsaWJyYXJ5OiMjaGVhZGVyPgorIyBkZWZpbmUgX1NUTFBfTkFUSVZFX0NfSEVBREVSKHgpIDxzeXMkbGlicmFyeTojI3g+CisjIGRlZmluZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSEVBREVSKGhlYWRlcikgPHN5cyRsaWJyYXJ5OiMjaGVhZGVyPgorIyBkZWZpbmUgX1NUTFBfTkFUSVZFX0NQUF9SVU5USU1FX0hFQURFUihoZWFkZXIpIDxzeXMkbGlicmFyeTojI2hlYWRlcj4KKworI2lmIChfX0RFQ0NYWF9WRVIgPCA2MDAwMDAwMCkKKworLy8gYXV0b21hdGljIHRlbXBsYXRlIGluc3RhbnRpYXRpb24gZG9lcyBub3QKKy8vIHdvcmsgd2l0aCBuYW1lc3BhY2VzIDsoCisjIGRlZmluZSBfU1RMUF9IQVNfTk9fTkFNRVNQQUNFUyAxCisKKyMgZGVmaW5lIF9TVExQX05PX1dDSEFSX1QgIDEKKyMgZGVmaW5lIF9TVExQX05FRURfRVhQTElDSVQgIDEKKworIyBkZWZpbmUgX1NUTFBfTk9fQk9PTCAgMQorIyBkZWZpbmUgX1NUTFBfTkVFRF9UWVBFTkFNRSAxCisjIGRlZmluZSBfU1RMUF9OT19ORVdfU1RZTEVfQ0FTVFMgMQorIyBkZWZpbmUgX1NUTFBfTkVFRF9NVVRBQkxFIDEKKyMgZGVmaW5lIF9TVExQX05PX0JBRF9BTExPQyAxCisKKyMgZGVmaW5lIF9TVExQX05PX05FV19ORVdfSEVBREVSIDEKKyMgZGVmaW5lIF9TVExQX05PX1BBUlRJQUxfU1BFQ0lBTElaQVRJT05fU1lOVEFYIDEKKworIyBkZWZpbmUgX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFUyAxCisjIGRlZmluZSBfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVfQ0xBU1NFUyAxCisjIGRlZmluZSBfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVfS0VZV09SRCAxCisjIGRlZmluZSBfU1RMUF9OT19RVUFMSUZJRURfRlJJRU5EUyAxCisjIGRlZmluZSBfU1RMUF9OT19DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OIDEKKyMgZGVmaW5lIF9TVExQX05PX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUiAxCisjIGRlZmluZSBfU1RMUF9OT05fVFlQRV9UTVBMX1BBUkFNX0JVRyAxCisjIGRlZmluZSBfU1RMUF9CUk9LRU5fVVNJTkdfRElSRUNUSVZFIDEKKyMgZGVmaW5lIF9TVExQX05PX0VYQ0VQVElPTl9IRUFERVIgMQorIyBkZWZpbmUgX1NUTFBfREVGX0NPTlNUX1BMQ1RfTkVXX0JVRyAxCisjIGRlZmluZSBfU1RMUF9ERUZfQ09OU1RfREVGX1BBUkFNX0JVRyAxCisKKyNlbmRpZgorCisKKyNpZmRlZiBfX05PX1VTRV9TVERfSU9TVFJFQU0KKyMgIGRlZmluZSBfU1RMUF9VU0VfTk9fSU9TVFJFQU1TIDEKKyMgZWxzZQorLy8gZGVmYXVsdCBpcyB0byB1c2UgbmV3IGlvc3RyZWFtcywgYW55d2F5CisjIGlmbmRlZiBfX1VTRV9TVERfSU9TVFJFQU0KKyMgIGRlZmluZSBfX1VTRV9TVERfSU9TVFJFQU0KKyMgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIF9fRVhDRVBUSU9OUworIyBkZWZpbmUgX1NUTFBfSEFTX05PX0VYQ0VQVElPTlMgMQorI2VuZGlmCisKKyMgaWZkZWYgX19JTVBMSUNJVF9JTkNMVURFX0VOQUJMRUQKKworI2lmZGVmIF9TVExQX1VTRV9OT19JT1NUUkVBTVMKKy8vIGltcGxpY2l0IGluY2x1ZGUgaW50cm9kdWNlcyBjb25mbGljdHMKKy8vIGJldHdlZW4gc3RscG9ydCBhbmQgbmF0aXZlIGxpYi4KKyMgdW5kZWYgX19JTVBMSUNJVF9JTkNMVURFX0VOQUJMRUQKKyNlbmRpZgorCisvLyBidXQsIHdvcmtzIHdpdGggb3VycyA7KS4KKyMgIGRlZmluZSBfU1RMUF9MSU5LX1RJTUVfSU5TVEFOVElBVElPTiAxCisKKyMgZW5kaWYKKworIyBpZiBkZWZpbmVkIChfX0lNUExJQ0lUX1VTSU5HX1NURCkgJiYgIWRlZmluZWQgKF9fTk9fVVNFX1NURF9JT1NUUkVBTSkKKy8vIHdlIHNob3VsZCBiYW4gdGhhdCAhCisjICBlcnJvciAiU1RMcG9ydCB3b24ndCB3b3JrIHdpdGggbmV3IGlvc3RyZWFtcyBhbmQgc3RkOjogYmVpbmcgaW1wbGljaXRseSBpbmNsdWRlZC4gUGxlYXNlIHVzZSAtc3RkIHN0cmljdF9hbnNpW19lcnJvcnNdIG9yIHNwZWNpZnkgX19OT19VU0VfU1REX0lPU1RSRUFNIgorIyBlbmRpZgorCisjIGlmICEoZGVmaW5lZCAoX19TVERfU1RSSUNUX0FOU0kpIHx8IGRlZmluZWQgKF9fU1REX1NUUklDVF9BTlNJX0VSUk9SUykpCisvLyB3ZSB3YW50IHRvIGVuZm9yY2UgaXQKKyMgIGRlZmluZSBfU1RMUF9MT05HX0xPTkcgbG9uZyBsb25nCisjIGVuZGlmCisKKy8vIHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyIHR5cGUKKyMgIGRlZmluZSBfU1RMUF9VSU5UMzJfVCB1bnNpZ25lZCBpbnQKKyNpZiBkZWZpbmVkKF9YT1BFTl9TT1VSQ0UpICYmIChfWE9QRU5fVkVSU0lPTiAtIDAgPj0gNCkKKyMgZGVmaW5lIF9TVExQX1JBTkQ0OCAxCisjZW5kaWYKKy8vICMgIGRlZmluZSBfU1RMUF9SQU5ENDggMQorCisjICBkZWZpbmUgX1NUTFBfTk9fRVhQTElDSVRfRlVOQ1RJT05fVE1QTF9BUkdTIDEKKworI2RlZmluZSBfU1RMUF9IQVNfTk9fTkVXX0NfSEVBREVSUyAxCisKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL2NvbmZpZy9fZGV0ZWN0X2RsbF9vcl9saWIuaCBiL3N0bHBvcnQvc3RsL2NvbmZpZy9fZGV0ZWN0X2RsbF9vcl9saWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDYyZTY5Ci0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvY29uZmlnL19kZXRlY3RfZGxsX29yX2xpYi5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qIEZpbGUgdXNlZCB0byBkZWZpbmUgbWFjcm9zOgorICogX1NUTFBfVVNFX0RZTkFNSUNfTElCOiBUbyBzaWduYWwgdXNlIFNUTHBvcnQgYXMgYSBkbGwgb3IgYnVpbGQgb2YgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgIFNUTHBvcnQgZGxscy4KKyAqIF9TVExQX1VTRV9TVEFUSUNfTElCOiBUbyBzaWduYWwgdXNlIG9mIFNUTHBvcnQgYXMgYSBzdGF0aWMgbGliIG9yIGJ1aWxkIG9mCisgKiAgICAgICAgICAgICAgICAgICAgICAgdGhlIFNUTHBvcnQgc3RhdGljIGxpYnMuCisgKiBfU1RMUF9VU0lOR19DUk9TU19OQVRJVkVfUlVOVElNRV9MSUI6IFNpZ25hbCB0aGF0IHdlIGFyZSB1c2luZyBhIG5hdGl2ZSBydW50aW1lCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGEgdmVyc2lvbiBkaWZmZXJlbnQgZnJvbSB0aGUgU1RMcG9ydCBvbmUuCisgKiBJZiBfU1RMUF9VU0VfRFlOQU1JQ19MSUIgb3IgX1NUTFBfVVNFX1NUQVRJQ19MSUIgaXMgYWxyZWRheSBkZWZpbmVkIGl0IG1lYW5zIHRoYXQKKyAqIHVzZXIgZm9yY2VzIHVzZSBvZiBhIHNwZWNpZmljIHZlcnNpb24uIEluIHRoaXMgY2FzZSBfU1RMUF9VU0lOR19DUk9TU19OQVRJVkVfUlVOVElNRV9MSUIKKyAqIHdpbGwgc3VyZWx5IGJlIGRlZmluZWQgb3RoZXJ3aXNlIHRoZXJlIGlzIG5vIG5lZWQgdG8gZm9yY2UgbWFjcm8gZGVmaW5lcy4KKyAqCisgKiBCZWZvcmUgaW5jbHVkaW5nIHRoaXMgZmlsZSB0aGUgY29tcGlsZXIgbXVzdCBkZWZpbmU6CisgKiBfU1RMUF9ETEw6IElmIHdlIGFyZSBidWlsZGluZyBhIGRsbAorICogX1NUTFBfUlVOVElNRV9ETEw6IElmIHdlIGFyZSB1c2luZyBuYXRpdmUgcnVudGltZSBhcyBhIGRsbAorICovCisjaWYgZGVmaW5lZCAoX19CVUlMRElOR19TVExQT1JUKQorIyAgdW5kZWYgX1NUTFBfVVNFX0RZTkFNSUNfTElCCisjICB1bmRlZiBfU1RMUF9VU0VfU1RBVElDX0xJQgorIyAgaWYgZGVmaW5lZCAoX1NUTFBfRExMKQorLyogV2UgYXJlIGJ1aWxkaW5nIHRoZSBTVExwb3J0IGRsbCAqLworIyAgICBkZWZpbmUgX1NUTFBfVVNFX0RZTkFNSUNfTElCCisjICAgIGlmICFkZWZpbmVkIChfU1RMUF9SVU5USU1FX0RMTCkKKyMgICAgICBkZWZpbmUgX1NUTFBfVVNJTkdfQ1JPU1NfTkFUSVZFX1JVTlRJTUVfTElCCisjICAgIGVuZGlmCisjICBlbHNlCisjICAgIGRlZmluZSBfU1RMUF9VU0VfU1RBVElDX0xJQgorIyAgICBpZiBkZWZpbmVkIChfU1RMUF9SVU5USU1FX0RMTCkKKyMgICAgICBkZWZpbmUgX1NUTFBfVVNJTkdfQ1JPU1NfTkFUSVZFX1JVTlRJTUVfTElCCisjICAgIGVuZGlmCisjICBlbmRpZgorI2Vsc2UKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9OT19JT1NUUkVBTVMpCisvKiBTVExwb3J0IHVzZSBvbmx5IGRlcGVuZCBvbiBfU1RMUF9SVU5USU1FX0RMTCBhcyB3ZSBhcmUgcmVwbGFjaW5nCisgKiB0aGUgbmF0aXZlIHJ1bnRpbWUuCisgKi8KKyMgICAgaWYgZGVmaW5lZCAoX1NUTFBfUlVOVElNRV9ETEwpCisjICAgICAgaWYgIWRlZmluZWQgKF9TVExQX1VTRV9TVEFUSUNfTElCKQorIyAgICAgICAgaWYgIWRlZmluZWQgKF9TVExQX1VTRV9EWU5BTUlDX0xJQikKKyMgICAgICAgICAgZGVmaW5lIF9TVExQX1VTRV9EWU5BTUlDX0xJQgorIyAgICAgICAgZW5kaWYKKyMgICAgICBlbHNlCisvKiBUaGUgdXNlciBpcyBmb3JjaW5nIHVzZSBvZiBTVExwb3J0IGFzIGEgZHluYW1pYyBsaWJyYXJ5LiBXZSBzaWduYWwgaXQgc28KKyAqIHRoYXQgdGhlIFNUTHBvcnQgbmFtZXNwYWNlIHdpbGwgYmUgbW9kaWZ5IHRvIHJlcG9ydCBzdWNoIGEgY29tYmluYXRpb24KKyAqIGFuZCBmb3JjZSB0aGUgdXNlciB0byBsaW5rIHdpdGggdGhlIHJlYnVpbHQgU1RMcG9ydCBsaWJyYXJ5LgorICovCisjICAgICAgICBkZWZpbmUgX1NUTFBfVVNJTkdfQ1JPU1NfTkFUSVZFX1JVTlRJTUVfTElCCisjICAgICAgZW5kaWYKKyMgICAgZWxzZQorIyAgICAgIGlmICFkZWZpbmVkKF9TVExQX1VTRV9EWU5BTUlDX0xJQikKKyMgICAgICAgIGlmICFkZWZpbmVkIChfU1RMUF9VU0VfU1RBVElDX0xJQikKKyMgICAgICAgICAgZGVmaW5lIF9TVExQX1VTRV9TVEFUSUNfTElCCisjICAgICAgICBlbmRpZgorIyAgICAgIGVsc2UKKy8qIElkZW0gcHJldmlvdXMgcmVtYXJrIGJ1dCB0aGUgdXNlciBmb3JjZXMgdXNlIG9mIHRoZSBzdGF0aWMgbmF0aXZlIHJ1bnRpbWUuCisgKi8KKyMgICAgICAgIGRlZmluZSBfU1RMUF9VU0lOR19DUk9TU19OQVRJVkVfUlVOVElNRV9MSUIKKyMgICAgICBlbmRpZgorIyAgICBlbmRpZgorIyAgZWxzZQorLyogSWYgd2UgZG8gbm90IGJ1aWxkIGFuZCB1c2UgU1RMcG9ydCBsaWJzIHdlIGNvbnNpZGVyIHRoYXQgd2UgYXJlIGluIGEgc3RhdGljIGxpYgorICogbW9kZSBhcyBvbmx5IGR5bmFtaWMgbGliIG5lZWRzIGFkZGl0aW9uYWwgZXhwb3J0L2ltcG9ydCBzcGVjaWZpZXIuCisgKi8KKyMgICAgZGVmaW5lIF9TVExQX1VTRV9TVEFUSUNfTElCCisjICBlbmRpZgorI2VuZGlmCisKKy8qIHdlIGRvbid0IGhhdmUgYSBzdGF0aWMgbmF0aXZlIHJ1bnRpbWUgbGlicmFyeSBvbiBldmMzL2V2YzQgKi8KKyNpZmRlZiBfU1RMUF9XQ0UKKyMgIHVuZGVmIF9TVExQX1VTSU5HX0NST1NTX05BVElWRV9SVU5USU1FX0xJQgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX0RZTkFNSUNfTElCKSAmJiAhZGVmaW5lZCAoX1NUTFBfVVNFX1NUQVRJQ19MSUIpCisjICBlcnJvciBVbmtub3duIFNUTHBvcnQgdXNhZ2UgY29uZmlnIChkbGwvbGliPykKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdGwvY29uZmlnL19kbS5oIGIvc3RscG9ydC9zdGwvY29uZmlnL19kbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmNzA3MzIKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9jb25maWcvX2RtLmgKQEAgLTAsMCArMSwxMjEgQEAKKy8vIFNUTHBvcnQgY29uZmlndXJhdGlvbiBmaWxlIGZvciBEaWdpdGFsIE1hcnMgQysrCisKKyNkZWZpbmUgX1NUTFBfQ09NUElMRVIgX19ETUNfVkVSU0lPTl9TVFJJTkdfXworCisjaWYgKF9fRE1DX18gPCAweDg0OSkKKyMgIGVycm9yICJEaWdpdGFsIE1hcnMgQysrIGNvbXBpbGVycyBiZWZvcmUgdmVyc2lvbiA4LjQ5IGFyZSBub3Qgc3VwcG9ydGVkISIKKyNlbmRpZgorCisvKiBETUMgZ29lcyB0b28gZmFyIGluIHRlbXBsYXRlIGluc3RhbmNpYXRpb24gYW5kIHRyaWVzIHRvIGZ1bGx5IGluc3RhbmNpYXRlCisgKiBzbGlzdDxwYWlyPGNvbnN0IGludCwgc3RyaW5nPiA+IGZvciBpbnN0YW5jZS4gVGhlIGdlbmVyYXRpb24gb2YgYXNzaWdubWVudAorICogb3BlcmF0b3IgZmFpbHMgb2YgY291cnNlIHNvIHdlIGFyZSBmb3JjZSB0byB1c2UgbXV0YWJsZSBrZXkgZm9yIHRoaXMgY29tcGlsZXIuCisgKi8KKyNkZWZpbmUgX1NUTFBfTk9fQ09OU1RfSU5fUEFJUgorI2RlZmluZSBfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNCisKKyNpZm5kZWYgX0NQUFVOV0lORAorIyAgZGVmaW5lIF9TVExQX05PX0VYQ0VQVElPTlMKKyNlbmRpZgorCisjaWZuZGVmIF9DUFBSVFRJCisjICBkZWZpbmUgX1NUTFBfTk9fUlRUSQorI2VuZGlmCisKKyNkZWZpbmUgX1NUTFBfVkVORE9SX0dMT0JBTF9DU1RECisKKy8vRE1DIHByZWZlciBlbnVtIHRvIHJlYWwgc3RhdGljIGNvbnN0IHZhcmlhYmxlIGJlY2F1c2UgaXQgZG8gbm90IGNvbnNpZGVyCisvL3N0YXRpYyBjb25zdCBhcyBjb25zdCBlbm91Z2ggdG8gYmUgdXNlZCBpbiBzd2l0Y2ggZGVjbGFyYXRpb24uLi4KKyNkZWZpbmUgX1NUTFBfU1RBVElDX0NPTlNUX0lOSVRfQlVHCisKKyNpZiAhZGVmaW5lZCAoX1dJTjMyKQorLy8gaXQncyBub3QgZnVsbHkgc3VwcG9ydGVkIG9uIG5vbi1XaW4zMiBwbGF0Zm9ybXMKKyMgIGRlZmluZSBfU1RMUF9OT19OQVRJVkVfV0lERV9GVU5DVElPTlMKKyNlbmRpZgorCisvKiBfU1RMUF9OT19PV05fTkFNRVNQQUNFIGlzIGRlZmluZWQgYmVjYXVzZSBEaWdpdGFsIE1hcnMnIGxpbmtlciBhbmQgbGliYXJpYW4KKyAgIGFwcGVhciB0byBoYXZlIHByb2JsZW1zIHdpdGggU1RMcG9ydCBuYW1lc3BhY2VzLiBTdW1tYXJ5IG9mIHRoZSBpc3N1ZXM6CisKKyAgIFNUQVRJQzogRGlnaXRhbCBNYXJzJyBsaWJyYXJpYW4gKGxpYi5leGUpIG1heSBmYWlsIHdpdGggImxlbiA8PSBJRE1BWCIgZXJyb3IKKyAgIGlmIF9TVExQX0RFQlVHIGlzIGRlZmluZWQuICBUaGlzIGlzIGJlY2F1c2UgRGlnaXRhbCBNYXJzJyBsaWJyYXJpYW4gdXNlcworICAgTWljcm9zb2Z0IE9NRiBmb3JtYXQsIHdoaWNoIGxpbWl0cyBpZGVudGlmaWVyIGxlbmd0aCB0byBhYm91dCA1MTIgYnl0ZXMuCisgICBXaXRoIFNUTHBvcnQgbmFtZXNwYWNlcywgc29tZSBpZGVudGlmaWVycyBzdWNoIGFzIENhdGVnb3J5X01hcCBpbgorICAgc3JjL2xvY2FsZV9jYXRhbG9nLmNwcCBtYXkgZXhjZWVkIHRoZSBtYXhpbXVtIE9NRiBpZGVudGlmaWVyIGxlbmd0aC4KKworICAgRFlOQU1JQzogRXhwb3J0IGlzc3VlcyB3aXRoIGNpbiwgY291dCwgY2VyciwgY2xvZyBpbiBzcmMvaW9zdHJlYW0uY3BwLgorICAgRXhwb3J0cyBpbiBEaWdpdGFsIE1hcnMgJ2RlZicgZmlsZSBtdXN0IG1hdGNoIG1hbmdsZWQgbmFtZXMgaW4gaW9zdHJlYW0uY3BwLgorICAgV2l0aCBTVExwb3J0IG5hbWVzcGFjZXMsIHRoZSBtYW5nbGVkIG5hbWVzIGluIHRoZSBpbnRlcm1lZGlhdGUgZmlsZXMgbm8KKyAgIGxvbmdlciBtYXRjaCB0aGVzZSBwcmUtZGVmaW5lZCBleHBvcnRzLiBUbyB1c2UgU1RMcG9ydCBkeW5hbWljIGxpYnJhcmllcworICAgYW5kIFNUTHBvcnQgbmFtZXNwYWNlcyB3aXRoIERpZ2l0YWwgTWFycywgdGhlIHByZS1kZWZpbmVkIGV4cG9ydHMgaW4KKyAgIHNyYy9pb3N0cmVhbS5jcHAgYW5kIHRoZSByZWxhdGVkIERpZ2l0YWwgTWFycyAnZGVmJyBmaWxlcyB3b3VsZCBuZWVkIHRvIGJlCisgICByZXZpc2VkLiAqLworI2RlZmluZSBfU1RMUF9OT19PV05fTkFNRVNQQUNFIDEKKworLy8gc2VsZWN0IHRocmVhZHMgc3RyYXRlZ3kKKyNpZiBkZWZpbmVkIChfTVQpICYmICFkZWZpbmVkIChfU1RMUF9OT19USFJFQURTKQorIyAgZGVmaW5lIF9TVExQX1RIUkVBRFMKKyNlbmRpZgorCisjaWZuZGVmIF9CT09MX0RFRklORUQKKyMgIGRlZmluZSBfU1RMUF9OT19CT09MCisjZWxzZQorIyAgZGVmaW5lIF9TVExQX0RPTlRfVVNFX0JPT0xfVFlQRURFRgorI2VuZGlmCisKKyNpZiBfSU5URUdSQUxfTUFYX0JJVFMgPj0gNjQKKyMgIGRlZmluZSBfU1RMUF9MT05HX0xPTkcgbG9uZyBsb25nCisjZW5kaWYKKworI2RlZmluZSBfU1RMUF9NQVJLX1BBUkFNRVRFUl9BU19VTlVTRUQoWCkKKyNkZWZpbmUgX1NUTFBfRE9OVF9VU0VfUFJJVl9OQU1FU1BBQ0UKKyNkZWZpbmUgX1NUTFBfUFJJVgorI2RlZmluZSBfU1RMUF9USFJPV19SRVRVUk5fQlVHCisKKyNpZiAhZGVmaW5lZCAoX0RMTCkKKyMgIHVuZGVmIF9TVExQX05PX1VORVhQRUNURURfRVhDRVBUX1NVUFBPUlQKKyNlbmRpZgorCisjaWYgKF9fRE1DX18gPCAweDg0OSkKKyMgIGRlZmluZSBfU1RMUF9OT19CQURfQUxMT0MKKyNlbmRpZgorCisjZGVmaW5lIF9TVExQX1VTRV9BQkJSRVZTCisjZGVmaW5lIF9TVExQX05PX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUgorCisjZGVmaW5lIF9TVExQX1VTRV9NU1ZDNl9NRU1fVF9CVUdfV09SS0FST1VORAorI2RlZmluZSBfU1RMUF9FWFBPUlRfREVDTFNQRUMgX19kZWNsc3BlYyhkbGxleHBvcnQpCisjZGVmaW5lIF9TVExQX0lNUE9SVF9ERUNMU1BFQyBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKworI2RlZmluZSBfU1RMUF9DTEFTU19FWFBPUlRfREVDTFNQRUMgX19kZWNsc3BlYyhkbGxleHBvcnQpCisjZGVmaW5lIF9TVExQX0NMQVNTX0lNUE9SVF9ERUNMU1BFQyBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKworI2RlZmluZSBfU1RMUF9ORUVEX0FERElUSU9OQUxfU1RBVElDX0RFQ0xTUEVDCisKKy8vI2RlZmluZSBfU1RMUF9JTVBPUlRfVEVNUExBVEVfS0VZV09SRCBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKy8vI2RlZmluZSBfU1RMUF9FWFBPUlRfVEVNUExBVEVfS0VZV09SRCBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKworI2lmIGRlZmluZWQgKF9XSU5ETEwpCisjICBkZWZpbmUgX1NUTFBfRExMCisjZW5kaWYKKyNpZiBkZWZpbmVkIChfRExMKQorIyAgZGVmaW5lIF9TVExQX1JVTlRJTUVfRExMCisjZW5kaWYKKyNpbmNsdWRlIDxzdGwvY29uZmlnL19kZXRlY3RfZGxsX29yX2xpYi5oPgorI3VuZGVmIF9TVExQX1JVTlRJTUVfRExMCisjdW5kZWYgX1NUTFBfRExMCisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfRFlOQU1JQ19MSUIpCisjICBkZWZpbmUgX1NUTFBfVVNFX0RFQ0xTUEVDIDEKKyMgIGlmIGRlZmluZWQgKF9fQlVJTERJTkdfU1RMUE9SVCkKKyMgICAgZGVmaW5lIF9TVExQX0NBTEwgX19leHBvcnQKKyMgIGVsc2UKKyMgICAgZGVmaW5lIF9TVExQX0NBTEwKKyMgIGVuZGlmCisjZWxzZQorIyAgZGVmaW5lIF9TVExQX0NBTEwKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RsL2NvbmZpZy9fYXV0b19saW5rLmg+CisKKyN1bmRlZiBfX1NDX18KKworI2luY2x1ZGUgPHN0bC9jb25maWcvX2ZlZWRiYWNrLmg+CmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9jb25maWcvX2VwaWxvZy5oIGIvc3RscG9ydC9zdGwvY29uZmlnL19lcGlsb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGQxZTI0Ci0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvY29uZmlnL19lcGlsb2cuaApAQCAtMCwwICsxLDI5IEBACisjaWYgZGVmaW5lZCAoX1NUTFBfTVNWQykgfHwgZGVmaW5lZCAoX19JQ0wpCisKKyMgIHByYWdtYSB3YXJuaW5nIChwb3ApCisjICBwcmFnbWEgcGFjayAocG9wKQorCisjZWxpZiBkZWZpbmVkIChfX0JPUkxBTkRDX18pCisKKyMgIHByYWdtYSBvcHRpb24gcG9wCisjICBwcmFnbWEgb3B0aW9uIC13LXBvdyAgICAgLy8gLXctODA2MiBQcmV2aW91cyBvcHRpb25zIGFuZCB3YXJuaW5ncyBub3QgcmVzdG9yZWQKKworI2VsaWYgZGVmaW5lZCAoX19zZ2kpICYmICFkZWZpbmVkIChfX0dOVUNfXykgJiYgKF9NSVBTX1NJTSAhPSBfTUlQU19TSU1fQUJJMzIpCisKKyMgIHByYWdtYSByZXNldCB3b2ZmIDExNzQKKyMgIHByYWdtYSByZXNldCB3b2ZmIDEzNzUKKyMgIHByYWdtYSByZXNldCB3b2ZmIDEyMDkKKy8qIGZyb20gaXRlcmF0b3JfYmFzZS5oICovCisjICBwcmFnbWEgcmVzZXQgd29mZiAxMTgzCisKKyNlbGlmIGRlZmluZWQgKF9fREVDQ1hYKQorCisjICBpZmRlZiBfX1BSQUdNQV9FTlZJUk9OTUVOVAorIyAgICBwcmFnbWEgX19lbnZpcm9ubWVudCBfX3Jlc3RvcmUKKyMgIGVuZGlmCisKKyNlbGlmIGRlZmluZWQgKF9fSUJNQ1BQX18pCisKKyMgIHByYWdtYSBpbmZvKHJlc3RvcmUpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdGwvY29uZmlnL19ldmMuaCBiL3N0bHBvcnQvc3RsL2NvbmZpZy9fZXZjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ2MDQ1MAotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc3RsL2NvbmZpZy9fZXZjLmgKQEAgLTAsMCArMSwzMzMgQEAKKy8qCisgKiBGaWxlIHRvIGhhdmUgTWljcm9zb2Z0IGVNYmVkZGVkIFZpc3VhbCBDKysgMy4wIGFuZCAuTkVUIHdvcmtpbmcgd2l0aCBTVExwb3J0CisgKiBNYXkgMjAwNAorICogT3JpZ2luIDogWmRlbmVrIE5lbWVjIC0gemVyb0BtYXBmYWN0b3IuY29tCisgKiAgICAgICAgICBNaWNoYWVsIEZpbmsgLSB2aXZpZG9zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldAorICovCisKKyNpZm5kZWYgX1NUTFBfRVZDX0gKKyNkZWZpbmUgX1NUTFBfRVZDX0gKKworI2RlZmluZSBfU1RMUF9DT01QSUxFUiAiZU1iZWRkZWQgVmlzdWFsIEMrKyIKKworLy8gVGhpcyBmbGFnIGlzIGJlaW5nIHVzZWQgYnkgU1RMcG9ydCB0byBzdXBwb3J0CisvLyBvbGQtZmFzaGlvbmVkIFdpbmRvd3MgQ0UgU0RLIChzZWUgc3RsX3dpbmNlLmgpCisvLyBkbyBub3QgdXNlIHdpdGggZU1lYmVkZGVkIFZpc3VhbCBDKysgMyBvciA0IQorI2lmZGVmIF9TVExQX1dJTkNFCisjICB1bmRlZiBfU1RMUF9XSU5DRQorI2VuZGlmCisKKy8qIENvbXBpbGVyIGRlcGVuZGVudCBkZWZpbmUuIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBtYXkgYmUgYXZhaWxhYmxlOgorICogX1NUTFBfV0NFX0VWQzMgd2hlbiBjb21waWxpbmcgdW5kZXIgZU1iZWRkZWQgVmlzdWFsIEMrKyAzCisgKiBfU1RMUF9XQ0VfTkVUICB3aGVuIGNvbXBpbGluZyB1bmRlciBlTWJlZGRlZCBWaXN1YWwgQysrIC5ORVQKKyAqIF9TVExQX1dDRSAgICAgIGFsd2F5cyBkZWZpbmVkIHdoZW4gY29tcGlsaW5nIHdpdGggb25lIG9mIHRoZSBhYm92ZQorICovCisjdW5kZWYgX1NUTFBfV0NFX0VWQzMKKyN1bmRlZiBfU1RMUF9XQ0VfTkVUCisKKyNpZiAoX1dJTjMyX1dDRSA+IDMwMCkKKyMgIGRlZmluZSBfU1RMUF9XQ0VfTkVUIFVOREVSX0NFCisjZWxpZiAoX1dJTjMyX1dDRSA9PSAzMDApCisjICBkZWZpbmUgX1NUTFBfV0NFX0VWQzMgVU5ERVJfQ0UKKyNlbHNlCisjICBlcnJvciBObyBzdXBwb3J0IGZvciBXaW5kb3dzIENFIGJlbG93IDMuMCEKKyNlbmRpZgorCisvLyBUaGlzIGlzIGRlZmluZWQgZm9yIGFsbCBwbGF0Zm9ybXMgdXNpbmcgV2luZG93cyBDRQorI2RlZmluZSBfU1RMUF9XQ0UKKworLyogQWxsIFdpbmRvd3MgQ0UgdmVyc2lvbnMgdXAgdG8gYXQgbGVhc3QgdmVyc2lvbiA1IGFyZSBsaXR0bGUtZW5kaWFuLCBldmVuCisgKiBpZiB0aGUgaGFyZHdhcmUgKGxpa2UgZS5nLiBNSVBTKSBjYW4gYmUgY29uZmlndXJlZCBmb3IgYmlnLWVuZGlhbiwgdG9vLiAqLworI2RlZmluZSBfU1RMUF9MSVRUTEVfRU5ESUFOCisKKy8vIEVuc3VyZSBfREVCVUcgaXMgZGVmaW5lZC4KKyNpZiBkZWZpbmVkIChERUJVRykgJiYgIWRlZmluZWQgKF9ERUJVRykKKyMgIGRlZmluZSBfREVCVUcKKyNlbmRpZgorCisvLyBpbmhlcml0IGFsbCBtc3ZjNiBvcHRpb25zCisjaW5jbHVkZSA8c3RsL2NvbmZpZy9fbXN2Yy5oPgorCisvLyBDRSB1cCB0byBhdCBsZWFzdCB2ZXJzaW9uIDUgaGFzIG5vIEMgbG9jYWxlIHN1cHBvcnQKKyNkZWZpbmUgX1NUTFBfTk9fTE9DQUxFX1NVUFBPUlQKKworI2lmIF9XSU4zMl9XQ0UgPj0gNDIwCisgICAvLyBTREtzIGJ1aWx0IHdpdGggUEI1IGhhdmUgdGVybWluYXRlJmNvIGluIG5hbWVzcGFjZSBzdGQuLi4KKyMgIGRlZmluZSBfU1RMUF9WRU5ET1JfVEVSTUlOQVRFX1NURCBfU1RMUF9WRU5ET1JfU1RECisjICBkZWZpbmUgX1NUTFBfVkVORE9SX1VOQ0FVR0hUX0VYQ0VQVElPTl9TVEQgX1NUTFBfVkVORE9SX1NURAorICAgLy8gLi4uYW5kIG5ld19oYW5kbGVyL3NldF9uZXdfaGFuZGxlciBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4KKyMgIGRlZmluZSBfU1RMUF9HTE9CQUxfTkVXX0hBTkRMRVIgMQorI2VuZGlmCisKKy8vIEFsd2F5cyB0aHJlYWRlZCBpbiBlTWJlZGRlZCBWaXN1YWwgQysrIDMuMCBhbmQgLk5FVAorI2lmbmRlZiBfTVQKKyMgIGRlZmluZSBfTVQKKyNlbmRpZgorCisvLyB3ZSBkb24ndCBoYXZlIGEgc3RhdGljIG5hdGl2ZSBydW50aW1lIGxpYnJhcnkKKyN1bmRlZiBfU1RMUF9VU0lOR19DUk9TU19OQVRJVkVfUlVOVElNRV9MSUIKKworI2lmIF9XSU4zMl9XQ0UgPCA0MDAKKy8vIG5vIGxvbmcgZG91YmxlIHVuZGVyIENFMyBhbmQgb2xkZXIKKyMgIGRlZmluZSBfU1RMUF9OT19MT05HX0RPVUJMRQorI2VuZGlmCisKKy8vIG5vICpmIGFuZCAqbCBtYXRoIGZ1bmN0aW9ucyBhdmFpbGFibGUKKyNkZWZpbmUgX1NUTFBfTk9fVkVORE9SX01BVEhfRgorI2RlZmluZSBfU1RMUF9OT19WRU5ET1JfTUFUSF9MCisKKy8qCisgKiBSZWRpcmVjdCBjb3V0LCBjZXJyIGFuZCBjbG9nOgorICogSWYgZGVmaW5lZCByZWRpcmVjdCBjb3V0LCBjZXJyIGFuZCBjbG9nIHRvCisgKiBmaWxlcyBzdGRvdXQudHh0LCBzdGRlcnIudHh0IGFuZCBzdGRsb2cudHh0CisgKi8KKy8vIyBkZWZpbmUgX1NUTFBfUkVESVJFQ1RfU1REU1RSRUFNUworCisvKgorICogU3RhdGljIGNsYXNzIG1lbWJlcnMgbWF5IGdlbmVyYXRlIExOSzExNzk6CisgKiBXcm9uZyBDT01EQVQgcGFja2luZyBtYXkgY2F1c2UgTE5LMTE3OSBlcnJvci4KKyAqIEZvciBkZXRhaWxzIHNlZSBodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXBzP3RoPThhMDVjODJjNGZmZWUyODAKKyAqIGV4YW1wbGUgUDc4LiBUaGlzIGRlZmluZSBpcyBub3QgdXNlZC9uZWVkZWQgYXQgdGhpcyBtb21lbnQKKyAqIGJ1dCBtYXkgY2FtZSBoYW5keSBpbiBmdXR1cmUuLi4KKyAqLworLy8jIGRlZmluZSBfU1RMUF9TVEFUSUNfTUVNQkVSU19CVUcKKworLy8gVXNlIHdpZGUtc3RyaW5nIGludGVyZmFjZSBvZiB3aW5kb3dzIG5hdGl2ZSBmdW5jdGlvbnMgKENyZWF0ZUZpbGUuLi4pLgorLy8gTm90ZSB0aGF0IHRoaXMgc2hvdWxkIGJlIGRlZmluZWQgYWxsIHRoZSB0aW1lIHdoaWxlIHVuZGVyIENFLgorI2lmIGRlZmluZWQgKFVOSUNPREUpCisjICBkZWZpbmUgX1NUTFBfVVNFX1dJREVfSU5URVJGQUNFCisjZW5kaWYKKworLy8gRm9yY2UgZXhjZXB0aW9uIHN0ZCB0byBzdGQgaW5zdGVhZCBvZiBfX3N0ZF9hbGlhcy4KKyNpZiBkZWZpbmVkIChfX2NwbHVzcGx1cykgJiYgIWRlZmluZWQgKF9TVExQX0hBU19OT19OQU1FU1BBQ0VTKQorIyAgaWZkZWYgX1NUTFBfVkVORE9SX0VYQ0VQVF9TVEQKKyMgICAgdW5kZWYgX1NUTFBfVkVORE9SX0VYQ0VQVF9TVEQKKyMgIGVuZGlmCisjICBkZWZpbmUgX1NUTFBfVkVORE9SX0VYQ0VQVF9TVEQgc3RkCisjZW5kaWYKKworLy8gc2hvcnQgc3RyaW5nIG9wdGltaXphdGlvbiBidWcgdW5kZXIgZXZjMywgZXZjNCB1c2luZyBBUk0gY29tcGlsZXIKKyNpZiBfTVNDX1ZFUiA8IDE0MDAgJiYgKGRlZmluZWQgKEFSTSkgfHwgZGVmaW5lZCAoX0FSTV8pKQorIyAgZGVmaW5lIF9TVExQX0RPTlRfVVNFX1NIT1JUX1NUUklOR19PUFRJTQorI2VuZGlmCisKKy8vIHdoZW4gdXNpbmcgTUZDLCBkaXNhYmxlIGFub3RoZXIgcGxhY2VtZW50IG5ldyBkZWNsYXJhdGlvbiwgc2luY2UgdGhlcmUgaXMgb25lIGluIHdjZWFsdC5oCisjaWYgIWRlZmluZWQgKF9fQlVJTERJTkdfU1RMUE9SVCkgJiYgZGVmaW5lZCAoX01GQ19WRVIpCisjICBkZWZpbmUgX19QTEFDRU1FTlRfTkVXX0lOTElORQorI2VuZGlmCisKKy8vIHRocmVhZHMKKyN1bmRlZiBfUkVFTlRSQU5UCisjZGVmaW5lIF9SRUVOVFJBTlQKKyN1bmRlZiBfTk9USFJFQURTCisKKy8vIFVzZSBvbGQgZmFzaGlvbmVkIGhlYWRlcnMgKGN0aW1lIHZzLiB0aW1lLmgpLgorI3VuZGVmIF9TVExQX05PX05FV19DX0hFQURFUlMKKyNkZWZpbmUgX1NUTFBfTk9fTkVXX0NfSEVBREVSUworCisvLyBleGNlcHRpb24gaGFuZGxpbmcgc3VwcG9ydDogb25seSBvbiBldmM0IGFuZCB1c2VyIGFkZGVkIC9HWCB0byBwcm9qZWN0IHNldHRpbmdzCisjaWYgZGVmaW5lZCAoX1NUTFBfV0NFX0VWQzMpIHx8ICFkZWZpbmVkIChfQ1BQVU5XSU5EKQorIyAgZGVmaW5lIF9TVExQX05PX0VYQ0VQVElPTl9IRUFERVIKKyMgIGRlZmluZSBfU1RMUF9OT19FWENFUFRJT05TCisjICB1bmRlZiBfU1RMUF9VU0VfRVhDRVBUSU9OUworIyAgaWZuZGVmIF9TVExQX1RIUk9XX0JBRF9BTExPQworIyAgICBkZWZpbmUgX1NUTFBfVEhST1dfQkFEX0FMTE9DIHsgX1NUTFBfV0lOQ0VfVFJBQ0UoTCJvdXQgb2YgbWVtb3J5Iik7IEV4aXRUaHJlYWQoMSk7IH0KKyMgIGVuZGlmCisjZW5kaWYKKworI2RlZmluZSBfU1RMUF9XSU5DRV9UUkFDRShtc2cpIE91dHB1dERlYnVnU3RyaW5nKG1zZykKKworLyoKKyAqIGVNYmVkZGVkIFZpc3VhbCBDKysgLk5FVCBzcGVjaWZpYyBzZXR0aW5ncworICovCisjaWYgZGVmaW5lZCAoX1NUTFBfV0NFX05FVCkKKworLy8gZXZjNCBoYXMgbm8gbG9jYWxlIGFuZCB0aW1lIHN1cHBvcnQKKyMgIGRlZmluZSBfU1RMUF9OT19MT0NBTEVfU1VQUE9SVAorIyAgZGVmaW5lIF9TVExQX05PX1RJTUVfU1VQUE9SVAorCisvLyBwdHJkaWZmX3QgaXMgbm90IGRlZmluZWQgaW4gZXZjNCBoZWFkZXJzCisjICBpZm5kZWYgX1BUUkRJRkZfVF9ERUZJTkVECisgICB0eXBlZGVmIGludCBwdHJkaWZmX3Q7CisjICAgIGRlZmluZSBfUFRSRElGRl9UX0RFRklORUQKKyMgIGVuZGlmCisKKy8qCisgKiBIZWxwZXIgbWFjcm9zIGZvciBpbmNsdWRpbmcgdGhlIG5hdGl2ZSBoZWFkZXJzIGluIGNhc2VzIHdoZXJlIGEgZmlsZSB3aXRoCisgKiB0aGUgc2FtZSBuYW1lIGFsc28gZXhpc3RzIGluIHRoZSBTVExwb3J0IGluY2x1ZGUgZm9sZGVyLiBUaGUgaWRlYSBiZWhpbmQKKyAqIHRoaXMgaXMgdGhhdCB3ZSBmaXJzdCBnbyB1cCBvbmUgZGlyZWN0b3J5IGFuZCB0aGVuIGRvd24gaW50byBhIGRpciB0aGF0CisgKiBpcyBvbmx5IHByZXNlbnQgaW4gdGhlIG5hdGl2ZSBpbnN0YWxsIGJ1dCBub3QgaW4gU1RMcG9ydC4KKyAqCisgKi8KKyMgIGlmICFkZWZpbmVkIChfU1RMUF9OQVRJVkVfSU5DTFVERV9QQVRIKQorIyAgICBpZiBkZWZpbmVkIChfWDg2XykKKyMgICAgICBpZiBkZWZpbmVkIChfU1RMUF9XQ0VfVEFSR0VUX1BST0NfU1VCVFlQRV9FTVVMQVRPUikKKyMgICAgICAgIGRlZmluZSBfU1RMUF9OQVRJVkVfSU5DTFVERV9QQVRIIC4uL0VtdWxhdG9yCisjICAgICAgZWxzZQorIyAgICAgICAgZGVmaW5lIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEggLi4vWDg2CisjICAgICAgZW5kaWYKKyMgICAgZWxpZiBkZWZpbmVkIChfQVJNXykKKyMgICAgICBpZiBfTVNDX1ZFUiA8IDE0MDAKKyAgICAgICAgIC8vIGVWQzMvNAorIyAgICAgICAgaWYgZGVmaW5lZCAoQVJNVjQpCisjICAgICAgICAgIGRlZmluZSBfU1RMUF9OQVRJVkVfSU5DTFVERV9QQVRIIC4uL0FybXY0CisjICAgICAgICBlbGlmIGRlZmluZWQgKEFSTVY0SSkKKyMgICAgICAgICAgZGVmaW5lIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEggLi4vQXJtdjRpCisjICAgICAgICBlbGlmIGRlZmluZWQgKEFSTVY0VCkKKyMgICAgICAgICAgZGVmaW5lIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEggLi4vQXJtdjR0CisjICAgICAgICBlbHNlCisjICAgICAgICAgIGVycm9yIFVua25vd24gQVJNIFNESy4KKyMgICAgICAgIGVuZGlmCisjICAgICAgZWxzZQorICAgICAgICAgLy8gVkM4IGNyb3NzY29tcGlsaW5nIGZvciBDRQorIyAgICAgICAgaWYgZGVmaW5lZCAoQVJNVjQpCisgICAgICAgICAgIC8vIFZDOCBidW5kbGVkIFBvY2tldCBQQyAyMDAzIFNESyBkb24ndCBoYXZlIGEgdGFyZ2V0IENQVSBzdWJmb2xkZXIuCisjICAgICAgICAgIGlmIGRlZmluZWQoV0lOMzJfUExBVEZPUk1fUFNQQykKKyMgICAgICAgICAgICBkZWZpbmUgX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSCAuLi9JbmNsdWRlCisjICAgICAgICAgIGVsc2UKKyMgICAgICAgICAgICBkZWZpbmUgX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSCAuLi9Bcm12NAorIyAgICAgICAgICBlbmRpZgorIyAgICAgICAgZWxpZiBkZWZpbmVkKEFSTVY0SSkgfHwgZGVmaW5lZChBUk1WNFQpCisjICAgICAgICAgIGRlZmluZSBfU1RMUF9OQVRJVkVfSU5DTFVERV9QQVRIIC4uL0FybXY0aQorIyAgICAgICAgZWxzZQorIyAgICAgICAgICBlcnJvciBVbmtub3duIEFSTSBTREsuCisjICAgICAgICBlbmRpZgorIyAgICAgIGVuZGlmCisjICAgIGVsaWYgZGVmaW5lZCAoX01JUFNfKQorIyAgICAgIGlmIGRlZmluZWQgKE1JUFMxNikKKyMgICAgICAgIGRlZmluZSBfU1RMUF9OQVRJVkVfSU5DTFVERV9QQVRIIC4uL21pcHMxNgorIyAgICAgIGVsaWYgZGVmaW5lZCAoTUlQU0lJKQorIyAgICAgICAgZGVmaW5lIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEggLi4vbWlwc0lJCisjICAgICAgZWxpZiBkZWZpbmVkIChNSVBTSUlfRlApCisjICAgICAgICBkZWZpbmUgX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSCAuLi9taXBzSUlfZnAKKyMgICAgICBlbGlmIGRlZmluZWQgKE1JUFNJVikKKyMgICAgICAgIGRlZmluZSBfU1RMUF9OQVRJVkVfSU5DTFVERV9QQVRIIC4uL21pcHNJVgorIyAgICAgIGVsaWYgZGVmaW5lZCAoTUlQU0lWX0ZQKQorIyAgICAgICAgZGVmaW5lIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEggLi4vbWlwc0lWX2ZwCisjICAgICAgZWxzZQorIyAgICAgICAgZXJyb3IgVW5rbm93biBNSVBTIFNESy4KKyMgICAgICBlbmRpZgorIyAgICBlbGlmIGRlZmluZWQgKFNIeCkKKyMgICAgICBpZiBkZWZpbmVkIChTSDMpCisjICAgICAgICBkZWZpbmUgX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSCAuLi9zaDMKKyMgICAgICBlbGlmIGRlZmluZWQgKFNINCkKKyMgICAgICAgIGRlZmluZSBfU1RMUF9OQVRJVkVfSU5DTFVERV9QQVRIIC4uL3NoNAorIyAgICAgIGVsc2UKKyMgICAgICAgIGVycm9yIFVua25vd24gU0h4IFNESy4KKyMgICAgICBlbmRpZgorIyAgICBlbHNlCisjICAgICAgZXJyb3IgVW5rbm93biBTREsuCisjICAgIGVuZGlmCisjICBlbmRpZiAvKiAhX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSCAqLworCisvKiBXb3JrYXJvdW5kIHdoZW4gdXNpbmcgTUZDQ0UgYW5kIHVzaW5nIDxuZXc+IHRvZ2V0aGVyOiBNRkNDRSdzIHdjZWFsdC5oIGRvZXNuJ3QKKyAqIGNoZWNrIGZvciBfX1BMQUNFTUVOVF9ORVdfSU5MSU5FIGJlZm9yZSBkZWZpbmluZyBvcGVyYXRvciBuZXcsIHNvIHdoZW4gPG5ldz4KKyAqIGRlZmluZXMgdGhlIG9wZXJhdG9yZSBiZWZvcmUsIHRoZXJlIHdpbGwgYmUgYW4gZXJyb3IgQzIwODQ6CisgKiAiZnVuY3Rpb24gJ3ZvaWQgKl9fY2RlY2wgb3BlcmF0b3IgbmV3KHVuc2lnbmVkIGludCx2b2lkICopJyBhbHJlYWR5IGhhcyBhIGJvZHkiLgorICovCisjICBpZmRlZiBfU1RMUF9VU0VfTUZDCisjICAgIGRlZmluZSBfX1BMQUNFTUVOVF9ORVdfSU5MSU5FCisjICBlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfV0NFX05FVCAqLworCisvKgorICogZU1iZWRkZWQgVmlzdWFsIEMrKyAzLjAgc3BlY2lmaWMgc2V0dGluZ3MKKyAqLworI2lmIGRlZmluZWQgKF9TVExQX1dDRV9FVkMzKQorCisjICBkZWZpbmUgX1NUTFBfTk9fTkFUSVZFX01CU1RBVEVfVAorCisvLyBldmMzIGhhcyBubyBsb2NhbGUgYW5kIHRpbWUgc3VwcG9ydAorIyAgZGVmaW5lIF9TVExQX05PX0xPQ0FMRV9TVVBQT1JUCisjICBkZWZpbmUgX1NUTFBfTk9fVElNRV9TVVBQT1JUCisKKy8vIGV2YzMgaGFzIG5ldywgYnV0IG5vIGV4cGxpY2l0IGhlYWRlcgorIyAgZGVmaW5lIF9TVExQX05PX05FV19IRUFERVIKKyMgIGRlZmluZSBfU1RMUF9OT19ORVdfTkVXX0hFQURFUgorCisvLyBldmMzIGhhcyBubyBiYWRfYWxsb2MgYW5kIG5vIHR5cGVpbmZvCisjICB1bmRlZiBfU1RMUF9OT19CQURfQUxMT0MKKyMgIGRlZmluZSBfU1RMUF9OT19CQURfQUxMT0MKKworIyAgdW5kZWYgX1NUTFBfTk9fVFlQRUlORk8KKyMgIGRlZmluZSBfU1RMUF9OT19UWVBFSU5GTworCisvLyBtaXNzaW5nIHRoaW5ncyBpbiBlTWJlZGRlZCBWaXN1YWwgQysrIDMuMCBoZWFkZXJzCisjICBpZm5kZWYgX1NJWkVfVF9ERUZJTkVECisgICB0eXBlZGVmIHVuc2lnbmVkIGludCBzaXplX3Q7CisjICAgIGRlZmluZSBfU0laRV9UX0RFRklORUQKKyMgIGVuZGlmCisKKyMgIGlmbmRlZiBfV0NIQVJfVF9ERUZJTkVECisgICB0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHdjaGFyX3Q7CisjICAgIGRlZmluZSBfV0NIQVJfVF9ERUZJTkVECisjICBlbmRpZgorCisvLyBwdHJkaWZmX3QgaXMgbm90IGRlZmluZWQgaW4gZXZjMyBoZWFkZXJzCisjICBpZm5kZWYgX1BUUkRJRkZfVF9ERUZJTkVECisgICB0eXBlZGVmIGludCBwdHJkaWZmX3Q7CisjICAgIGRlZmluZSBfUFRSRElGRl9UX0RFRklORUQKKyMgIGVuZGlmCisKKy8vIGNsb2NrX3QgaXMgbm90IGRlZmluZWQgaW4gZXZjMyBoZWFkZXJzCisjICBpZm5kZWYgX0NMT0NLX1RfREVGSU5FRAorICAgdHlwZWRlZiBsb25nIGNsb2NrX3Q7CisjICAgIGRlZmluZSBfQ0xPQ0tfVF9ERUZJTkVECisjICBlbmRpZgorCisvLyBTdHJ1Y3QgdG0gaXMgbm90IGRlZmluZWQgaW4gZXZjMyBoZWFkZXJzCisjICBpZm5kZWYgX1RNX0RFRklORUQKK3N0cnVjdCB0bSB7CisgICBpbnQgdG1fc2VjOyAgICAgLyogc2Vjb25kcyBhZnRlciB0aGUgbWludXRlIC0gWzAsNTldICovCisgICBpbnQgdG1fbWluOyAgICAgLyogbWludXRlcyBhZnRlciB0aGUgaG91ciAtIFswLDU5XSAqLworICAgaW50IHRtX2hvdXI7ICAgIC8qIGhvdXJzIHNpbmNlIG1pZG5pZ2h0IC0gWzAsMjNdICovCisgICBpbnQgdG1fbWRheTsgICAgLyogZGF5IG9mIHRoZSBtb250aCAtIFsxLDMxXSAqLworICAgaW50IHRtX21vbjsgICAgIC8qIG1vbnRocyBzaW5jZSBKYW51YXJ5IC0gWzAsMTFdICovCisgICBpbnQgdG1feWVhcjsgICAgLyogeWVhcnMgc2luY2UgMTkwMCAqLworICAgaW50IHRtX3dkYXk7ICAgIC8qIGRheXMgc2luY2UgU3VuZGF5IC0gWzAsNl0gKi8KKyAgIGludCB0bV95ZGF5OyAgICAvKiBkYXlzIHNpbmNlIEphbnVhcnkgMSAtIFswLDM2NV0gKi8KKyAgIGludCB0bV9pc2RzdDsgICAvKiBkYXlsaWdodCBzYXZpbmdzIHRpbWUgZmxhZyAqLworfTsKKyMgICAgZGVmaW5lIF9UTV9ERUZJTkVECisjICBlbmRpZgorCisvLyBkZWZpbmUgcGxhY2VtZW50IG5ldyBhbmQgZGVsZXRlIG9wZXJhdG9yCisvLyBub3RlOiB3aGVuIE1GQ0NFIGhlYWRlcnMgYXJlIGluY2x1ZGVkIGZpcnN0LCBkb24ndCBkZWZpbmUgdGhlIG5ldyBvcGVyYXRvciwKKy8vICAgICAgIHNpbmNlIGl0IHdhcyBhbHJlYWR5IGRlZmluZWQgaW4gd2NlYWx0LmgKKyMgIGlmZGVmIF9fY3BsdXNwbHVzCisjICAgIGlmbmRlZiBfX1BMQUNFTUVOVF9ORVdfSU5MSU5FCisjICAgICAgaWZuZGVmIF9NRkNfVkVSCitpbmxpbmUgdm9pZCAqX19jZGVjbCBvcGVyYXRvciBuZXcoc2l6ZV90LCB2b2lkICpfUCkgeyByZXR1cm4gKF9QKTsgfQorIyAgICAgIGVuZGlmIC8qIF9NRkNfVkVSICovCitpbmxpbmUgdm9pZCBfX2NkZWNsIG9wZXJhdG9yIGRlbGV0ZSh2b2lkICosIHZvaWQgKikgeyByZXR1cm47IH0KKyMgICAgICBkZWZpbmUgX19QTEFDRU1FTlRfTkVXX0lOTElORQorIyAgICBlbmRpZgorIyAgZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworLy8gZXZjMyBkb2Vzbid0IGhhdmUgbmF0aXZlIHdpZGUgZnVuY3Rpb25zLCBlLmcuIGZnZXR3Yywgd21lbW1vdmUKKyMgIGRlZmluZSBfU1RMUF9OT19OQVRJVkVfV0lERV9GVU5DVElPTlMKKworLy8gZXZjMyBkb2Vzbid0IGhhdmUgYXNzZXJ0LmgKKyMgIGlmbmRlZiBfQVNTRVJUX0RFRklORUQKKyMgICAgZGVmaW5lIGFzc2VydChleHByKSBfU1RMUF9BU1NFUlQoZXhwcikKKyMgICAgZGVmaW5lIF9BU1NFUlRfREVGSU5FRAorIyAgZW5kaWYKKworI2VuZGlmIC8qIF9TVExQX1dDRV9FVkMzICovCisKKy8qCisgKiBvcmlnaW5hbCBjYWxsOiBUZXJtaW5hdGVQcm9jZXNzKEdldEN1cnJlbnRQcm9jZXNzKCksIDApOworICogd2Ugc3Vic3RpdHV0ZSB0aGUgR2V0Q3VycmVudFByb2Nlc3MoKSB3aXRoIHRoZSByZXN1bHQgb2YgdGhlIGlubGluZSBmdW5jdGlvbgorICogZGVmaW5lZCBpbiBrZnVuY3MuaCwgc2luY2Ugd2UgdGhlbiBjYW4gYXZvaWQgaW5jbHVkaW5nIDx3aW5kb3dzLmg+IGF0IGFsbC4KKyAqIGFsbCBuZWVkZWQgV2luMzIgQVBJIGZ1bmN0aW9ucyBhcmUgZGVmaW5lZCBpbiA8c3RsL193aW5kb3dzLmg+CisgKi8KKyNpZm5kZWYgX0FCT1JUX0RFRklORUQKKyMgIGRlZmluZSBfU1RMUF9BQk9SVCgpIFRlcm1pbmF0ZVByb2Nlc3MocmVpbnRlcnByZXRfY2FzdDxIQU5ETEU+KDY2KSwgMCkKKyMgIGRlZmluZSBfQUJPUlRfREVGSU5FRAorI2VuZGlmCisKKy8vIE5vdGljZTogd2luZG93cy5oIGlzbid0IGluY2x1ZGVkIGhlcmUgYW55bW9yZTsgYWxsIG5lZWRlZCBkZWZpbmVzIGFyZSBpbgorLy8gc3RsL193aW5kb3dzLmggbm93CisKKyNlbmRpZiAvKiBfU1RMUF9FVkNfSCAqLwpkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdGwvY29uZmlnL19mZWVkYmFjay5oIGIvc3RscG9ydC9zdGwvY29uZmlnL19mZWVkYmFjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNzFjYTUKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9jb25maWcvX2ZlZWRiYWNrLmgKQEAgLTAsMCArMSw0MyBAQAorLyogSGVscGVyIGhlYWRlciB0byBnaXZlIGZlZWRiYWNrIGFib3V0IGJ1aWxkIGVudmlyb25tZW50IGNvbmZpZ3VyYXRpb24KKyAqIHRoYW5rcyB0byAjcHJhZ21hIG1lc3NhZ2UgZGlyZWN0aXZlcy4KKyAqLworCisjaWYgZGVmaW5lZCAoX1NUTFBfVkVSQk9TRSkKKyMgIGRlZmluZSBfU1RMUF9WRVJCT1NFX01PREVfU1VQUE9SVEVECisKKyMgIGlmIGRlZmluZWQgKF9TVExQX0NPTVBJTEVSKQorIyAgICBwcmFnbWEgbWVzc2FnZSAoX1NUTFBfQ09NUElMRVIpCisjICBlbmRpZgorCisjICBpZiBkZWZpbmVkIChfU1RMUF9OT19SVFRJKQorIyAgICBwcmFnbWEgbWVzc2FnZSAoIlNUTHBvcnQ6IFJUVEkgc3VwcG9ydCAgICAgICAgIC0+IERpc2FibGVkIikKKyMgIGVsc2UKKyMgICAgcHJhZ21hIG1lc3NhZ2UgKCJTVExwb3J0OiBSVFRJIHN1cHBvcnQgICAgICAgICAtPiBFbmFibGVkIikKKyMgIGVuZGlmCisKKyMgIGlmIGRlZmluZWQgKF9TVExQX0hBU19OT19FWENFUFRJT05TKQorIyAgICBwcmFnbWEgbWVzc2FnZSAoIlNUTHBvcnQ6IEV4Y2VwdGlvbiBzdXBwb3J0ICAgIC0+IERpc2FibGVkIikKKyMgIGVsc2UKKyMgICAgcHJhZ21hIG1lc3NhZ2UgKCJTVExwb3J0OiBFeGNlcHRpb24gc3VwcG9ydCAgICAtPiBFbmFibGVkIikKKyMgIGVuZGlmCisKKyMgIGlmIGRlZmluZWQgKF9TVExQX1RIUkVBRFMpCisjICAgIHByYWdtYSBtZXNzYWdlICgiU1RMcG9ydDogVGhyZWFkaW5nIG1vZGVsICAgICAgLT4gTXVsdGkiKQorIyAgZWxzZQorIyAgICBwcmFnbWEgbWVzc2FnZSAoIlNUTHBvcnQ6IFRocmVhZGluZyBtb2RlbCAgICAgIC0+IE1vbm8iKQorIyAgZW5kaWYKKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX0RZTkFNSUNfTElCKQorIyAgICBwcmFnbWEgbWVzc2FnZSAoIlNUTHBvcnQ6IExpYnJhcnkgbW9kZWwgICAgICAgIC0+IER5bmFtaWMiKQorIyAgZWxzZQorIyAgICBwcmFnbWEgbWVzc2FnZSAoIlNUTHBvcnQ6IExpYnJhcnkgbW9kZWwgICAgICAgIC0+IFN0YXRpYyIpCisjICBlbmRpZgorCisjICBpZiBkZWZpbmVkIChfU1RMUF9VU0lOR19DUk9TU19OQVRJVkVfUlVOVElNRV9MSUIpCisjICAgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9EWU5BTUlDX0xJQikKKyMgICAgcHJhZ21hIG1lc3NhZ2UgKCJTVExwb3J0OiBOYXRpdmUgbGlicmFyeSBtb2RlbCAtPiBTdGF0aWMiKQorIyAgICBlbHNlCisjICAgIHByYWdtYSBtZXNzYWdlICgiU1RMcG9ydDogTmF0aXZlIGxpYnJhcnkgbW9kZWwgLT4gRHluYW1pYyIpCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9jb25maWcvX2ZyZWVic2QuaCBiL3N0bHBvcnQvc3RsL2NvbmZpZy9fZnJlZWJzZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiOTMzOWIKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9jb25maWcvX2ZyZWVic2QuaApAQCAtMCwwICsxLDMgQEAKKyNkZWZpbmUgX1NUTFBfUExBVEZPUk0gIkZyZWUgQlNEIgorCisjZGVmaW5lIF9TVExQX1VTRV9VTklYX0lPCmRpZmYgLS1naXQgYS9zdGwvY29uZmlnL19mdWppdHN1LmggYi9zdGxwb3J0L3N0bC9jb25maWcvX2Z1aml0c3UuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3RsL2NvbmZpZy9fZnVqaXRzdS5oCnJlbmFtZSB0byBzdGxwb3J0L3N0bC9jb25maWcvX2Z1aml0c3UuaApkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdGwvY29uZmlnL19nY2MuaCBiL3N0bHBvcnQvc3RsL2NvbmZpZy9fZ2NjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ0MTg2MwotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc3RsL2NvbmZpZy9fZ2NjLmgKQEAgLTAsMCArMSwxOTggQEAKKy8qIFNUTHBvcnQgY29uZmlndXJhdGlvbiBmaWxlCisgKiBJdCBpcyBpbnRlcm5hbCBTVExwb3J0IGhlYWRlciAtIERPIE5PVCBpbmNsdWRlIGl0IGRpcmVjdGx5CisgKi8KKworI2RlZmluZSBfU1RMUF9DT01QSUxFUiAiZ2NjIgorCisjZGVmaW5lIF9TVExQX0hBU19JTkNMVURFX05FWFQgMQorCisjaWYgKF9fR05VQ19fIDwgMikgfHwgKChfX0dOVUNfXyA8IDMpICYmICgoX19HTlVDX01JTk9SX18gPCA5NSkgfHwgKF9fR05VQ19NSU5PUl9fID09IDk2KSkpCisvKiBXZSBkbyBub3Qgc3VwcG9ydCBuZWl0aGVyIHRoZSB1bm9mZmljaWFsIDIuOTYgZ2NjIHZlcnNpb24uICovCisjICBlcnJvciBHTlUgY29tcGlsZXJzIGJlZm9yZSAyLjk1IGFyZSBub3Qgc3VwcG9ydGVkIGFueW1vcmUuCisjZW5kaWYKKworLyogU3lzdGVtcyBoYXZpbmcgR0xJQkMgaW5zdGFsbGVkIGhhdmUgZGlmZmVyZW50IHRyYWl0cyAqLworI2lmIGRlZmluZWQgKF9fbGludXhfXykKKyMgIGlmbmRlZiBfU1RMUF9VU0VfR0xJQkMKKyMgICAgZGVmaW5lIF9TVExQX1VTRV9HTElCQyAxCisjICBlbmRpZgorIyAgaWYgZGVmaW5lZCAoX19VQ0xJQkNfXykgJiYgIWRlZmluZWQgKF9TVExQX1VTRV9VQ0xJQkMpCisjICAgIGRlZmluZSBfU1RMUF9VU0VfVUNMSUJDIDEKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fQ1lHV0lOX18pICYmIFwKKyAgICAgKF9fR05VQ19fID49IDMpICYmIChfX0dOVUNfTUlOT1JfXyA+PSAzKSAmJiAhZGVmaW5lZCAoX0dMSUJDUFBfVVNFX0M5OSkKKyMgIGRlZmluZSBfU1RMUF9OT19WRU5ET1JfTUFUSF9MCisjICBkZWZpbmUgX1NUTFBfTk9fVkVORE9SX1NURExJQl9MCisjZW5kaWYKKworI2lmIChfX0dOVUNfXyA8IDMpCisjICBkZWZpbmUgX1NUTFBfTk9fVkVORE9SX1NURExJQl9MCisjZW5kaWYKKworI2lmIChfX0dOVUNfXyA8IDMpIHx8ICgoX19HTlVDX18gPT0gMykgJiYgKF9fR05VQ19NSU5PUl9fIDwgNCkpCisvKiBkZWZpbmUgZm9yIGdjYyB2ZXJzaW9ucyBiZWZvcmUgMy40LjAuICovCisjICBkZWZpbmUgX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFX0tFWVdPUkQKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKF9SRUVOVFJBTlQpICYmIChkZWZpbmVkIChfVEhSRUFEX1NBRkUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmluZWQgKF9fT3BlbkJTRF9fKSAmJiBkZWZpbmVkIChfUE9TSVhfVEhSRUFEUykpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmluZWQgKF9fTUlOR1czMl9fKSAmJiBkZWZpbmVkIChfTVQpKSkKKyMgIGRlZmluZSBfUkVFTlRSQU5UCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fREpHUFApCisjICBkZWZpbmUgX1NUTFBfUkFORDQ4ICAgIDEKKyMgIGRlZmluZSBfTk9USFJFQURTICAgIDEKKyMgIHVuZGVmICBfUFRIUkVBRFMKKyMgIGRlZmluZSBfU1RMUF9MSVRUTEVfRU5ESUFOCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fTUlOR1czMl9fKQorLyogTWluZ3czMiwgZWdjcyBjb21waWxlciB1c2luZyB0aGUgTWljcm9zb2Z0IEMgcnVudGltZSAqLworIyAgaWYgKF9fR05VQ19fID49IDMpCisvKiBGb3IgZ2NjIGJlZm9yZSB2ZXJzaW9uIDMgdGhpcyBtYWNybyBpcyBkZWZpbmVkIGJlbG93ICovCisjICAgIGRlZmluZSBfU1RMUF9WRU5ET1JfR0xPQkFMX0NTVEQKKyMgIGVuZGlmCisjICB1bmRlZiAgX1NUTFBfTk9fRFJBTkQ0OAorIyAgZGVmaW5lIF9TVExQX05PX0RSQU5ENDgKKyMgIGRlZmluZSBfU1RMUF9DQUxMCisjZW5kaWYgLyogX19NSU5HVzMyX18gKi8KKworI2lmIGRlZmluZWQgKF9fQ1lHV0lOX18pIHx8IGRlZmluZWQgKF9fTUlOR1czMl9fKQorIyAgaWYgIWRlZmluZWQgKF9TVExQX1VTRV9TVEFUSUNfTElCKQorIyAgICBkZWZpbmUgX1NUTFBfVVNFX0RFQ0xTUEVDIDEKKyMgICAgaWYgIWRlZmluZWQgKF9TVExQX1VTRV9EWU5BTUlDX0xJQikKKyMgICAgICBkZWZpbmUgX1NUTFBfVVNFX0RZTkFNSUNfTElCCisjICAgIGVuZGlmCisjICAgIGRlZmluZSBfU1RMUF9FWFBPUlRfREVDTFNQRUMgX19kZWNsc3BlYyhkbGxleHBvcnQpCisjICAgIGRlZmluZSBfU1RMUF9DTEFTU19FWFBPUlRfREVDTFNQRUMgX19kZWNsc3BlYyhkbGxleHBvcnQpCisjICAgIGRlZmluZSBfU1RMUF9DTEFTU19JTVBPUlRfREVDTFNQRUMgX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjICBlbmRpZgorLyogVGhlIGZvbGxvd2luZyBpcyBkZWZpbmVkIGluZGVwZW5kZW50bHkgb2YgX1NUTFBfVVNFX1NUQVRJQ19MSUIgYmVjYXVzZSBpdCBpcyBhbHNvCisgKiB1c2VkIHRvIGltcG9ydCBzeW1ib2xzIGZyb20gUFNESyB1bmRlciBNaW5HVworICovCisjICBkZWZpbmUgX1NUTFBfSU1QT1JUX0RFQ0xTUEVDIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorI2Vsc2UKKyMgIGlmIChfX0dOVUNfXyA+PSA0KQorIyAgICBpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX1NUQVRJQ19MSUIpCisjICAgICAgaWYgIWRlZmluZWQgKF9TVExQX1VTRV9EWU5BTUlDX0xJQikKKyMgICAgICAgIGRlZmluZSBfU1RMUF9VU0VfRFlOQU1JQ19MSUIKKyMgICAgICBlbmRpZgorIyAgICAgIGRlZmluZSBfU1RMUF9VU0VfREVDTFNQRUMgMQorIyAgICAgIGRlZmluZSBfU1RMUF9FWFBPUlRfREVDTFNQRUMgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSkKKyMgICAgICBkZWZpbmUgX1NUTFBfSU1QT1JUX0RFQ0xTUEVDIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpCisjICAgICAgZGVmaW5lIF9TVExQX0NMQVNTX0VYUE9SVF9ERUNMU1BFQyBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKQorIyAgICAgIGRlZmluZSBfU1RMUF9DTEFTU19JTVBPUlRfREVDTFNQRUMgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSkKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fQ1lHV0lOX18pIHx8IGRlZmluZWQgKF9fTUlOR1czMl9fKSB8fCAhKGRlZmluZWQgKF9TVExQX1VTRV9HTElCQykgfHwgZGVmaW5lZCAoX19zdW4pIHx8IGRlZmluZWQoX19BUFBMRV9fKSkKKyMgIGlmICFkZWZpbmVkIChfX01JTkdXMzJfXykgJiYgIWRlZmluZWQgKF9fQ1lHV0lOX18pCisjICAgIGRlZmluZSBfU1RMUF9OT19OQVRJVkVfTUJTVEFURV9UICAgIDEKKyMgIGVuZGlmCisjICBpZiAhZGVmaW5lZCAoX19NSU5HVzMyX18pIHx8IChfX0dOVUNfXyA8IDMpIHx8IChfX0dOVUNfXyA9PSAzKSAmJiAoX19HTlVDX01JTk9SX18gPCA0KQorIyAgICBkZWZpbmUgX1NUTFBfTk9fTkFUSVZFX1dJREVfRlVOQ1RJT05TIDEKKyMgIGVuZGlmCisjICBkZWZpbmUgX1NUTFBfTk9fTkFUSVZFX1dJREVfU1RSRUFNUyAgIDEKKyNlbmRpZgorCisjZGVmaW5lIF9TVExQX05PUkVUVVJOX0ZVTkNUSU9OIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSkKKworLyogTWFjIE9TIFggaXMgYSBsaXR0bGUgZGlmZmVyZW50IHdpdGggbmFtZXNwYWNlcyBhbmQgY2Fubm90IGluc3RhbnRpYXRlCisgKiBzdGF0aWMgZGF0YSBtZW1iZXJzIGluIHRlbXBsYXRlIGNsYXNzZXMgKi8KKyNpZiBkZWZpbmVkIChfX0FQUExFX18pCisjICBpZiAoKF9fR05VQ19fIDwgMykgfHwgKChfX0dOVUNfXyA9PSAzKSAmJiAoX19HTlVDX01JTk9SX18gPCAzKSkpCisvKiBNYWMgT1MgWCBpcyBtaXNzaW5nIGEgcmVxdWlyZWQgdHlwZWRlZiBhbmQgc3RhbmRhcmQgbWFjcm8gKi8KK3R5cGVkZWYgdW5zaWduZWQgaW50IHdpbnRfdDsKKyMgIGVuZGlmCisKKyMgIGRlZmluZSBfX3VuaXgKKworIyAgZGVmaW5lIF9TVExQX05PX0xPTkdfRE9VQkxFCisKKy8qIE1hYyBPUyBYIG5lZWRzIGFsbCAiOjoiIHNjb3BlIHJlZmVyZW5jZXMgdG8gYmUgInN0ZDo6IiAqLworIyAgZGVmaW5lIF9TVExQX1VTRV9ORVdfQ19IRUFERVJTCisKKyMgIGRlZmluZSBfU1RMUF9OT19WRU5ET1JfU1RETElCX0wKKworI2VuZGlmIC8qIF9fQVBQTEVfXyAqLworCisvKiBnKysgMi43LnggYW5kIGFib3ZlICovCisjZGVmaW5lIF9TVExQX0xPTkdfTE9ORyBsb25nIGxvbmcKKworI2lmZGVmIF9TVExQX1VTRV9VQ0xJQkMKKyAgLyogTm8gKmYgbWF0aCBmdWN0aW9ucyB2YXJpYW50cyAoaS5lLiBzcXJ0ZiwgZmFic2YsIGV0Yy4pICovCisjICBkZWZpbmUgX1NUTFBfTk9fVkVORE9SX01BVEhfRgorICAvKiBObyAqbCBtYXRoIGZ1Y3Rpb25zIHZhcmlhbnRzIChpLmUuIHNxcnRsLCBmYWJzbCwgZXRjLikgKi8KKyMgIGRlZmluZSBfU1RMUF9OT19WRU5ET1JfTUFUSF9MCisjICBkZWZpbmUgX1NUTFBfTk9fTE9OR19ET1VCTEUKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19PcGVuQlNEX18pIHx8IGRlZmluZWQgKF9fRnJlZUJTRF9fKQorIyAgZGVmaW5lIF9TVExQX05PX1ZFTkRPUl9NQVRIX0wKKyMgIGRlZmluZSBfU1RMUF9OT19WRU5ET1JfU1RETElCX0wgLyogbm8gbGxhYnMgKi8KKyMgIGlmbmRlZiBfX3VuaXgKKyMgICAgZGVmaW5lIF9fdW5peAorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19hbHBoYV9fKQorIyAgZGVmaW5lIF9TVExQX05PX1ZFTkRPUl9NQVRIX0wKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19ocHV4KQorIyAgZGVmaW5lIF9TVExQX1ZFTkRPUl9HTE9CQUxfQ1NURCAxCisjICBkZWZpbmUgX1NUTFBfTk9fVkVORE9SX1NURExJQl9MIC8qIG5vIGxsYWJzICovCisgIC8qIE5vICpmIG1hdGggZnVjdGlvbnMgdmFyaWFudHMgKGkuZS4gc3FydGYsIGZhYnNmLCBldGMuKSAqLworIyAgZGVmaW5lIF9TVExQX05PX1ZFTkRPUl9NQVRIX0YKKyNlbmRpZgorCisjaWYgKF9fR05VQ19fID49IDMpCisjICBpZm5kZWYgX1NUTFBfSEFTX05PX05FV19DX0hFQURFUlMKKy8qCisjICAgIGlmbmRlZiBfU1RMUF9VU0VfVUNMSUJDCisqLworIyAgICBkZWZpbmUgX1NUTFBfSEFTX05BVElWRV9GTE9BVF9BQlMKKy8qCisjICAgIGVuZGlmCisqLworIyAgZWxzZQorIyAgICBpZmRlZiBfU1RMUF9VU0VfR0xJQkMKKyMgICAgICBkZWZpbmUgX1NUTFBfVkVORE9SX0xPTkdfRE9VQkxFX01BVEggIDEKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIChfX0dOVUNfXyA8IDMpCisjICBkZWZpbmUgX1NUTFBfSEFTX05PX05FV19DX0hFQURFUlMgICAgIDEKKyMgIGRlZmluZSBfU1RMUF9WRU5ET1JfR0xPQkFMX0NTVEQgICAgICAgMQorIyAgZGVmaW5lIF9TVExQX0RPTlRfVVNFX1BUSFJFQURfU1BJTkxPQ0sgMQorIyAgaWZuZGVmIF9fSE9OT1JfU1RECisjICAgIGRlZmluZSBfU1RMUF9WRU5ET1JfR0xPQkFMX0VYQ0VQVF9TVEQgMQorIyAgZW5kaWYKKy8qIGVnY3MgZmFpbHMgdG8gaW5pdGlhbGl6ZSBidWlsdGluIHR5cGVzIGluIGV4cHIuIGxpa2UgdGhpcyA6IG5ldyhwKSBjaGFyKCk7ICAqLworIyAgZGVmaW5lIF9TVExQX0RFRl9DT05TVF9QTENUX05FV19CVUcgMQorI2VuZGlmCisKKyN1bmRlZiBfU1RMUF9OT19VTkNBVUdIVF9FWENFUFRfU1VQUE9SVAorI3VuZGVmIF9TVExQX05PX1VORVhQRUNURURfRVhDRVBUX1NVUFBPUlQKKworLyogc3RyaWN0IEFOU0kgcHJvaGliaXRzICJsb25nIGxvbmciICggZ2NjKSAqLworI2lmIGRlZmluZWQgKCBfX1NUUklDVF9BTlNJX18gKQorIyAgdW5kZWYgX1NUTFBfTE9OR19MT05HIAorI2VuZGlmCisKKyNpZm5kZWYgX19FWENFUFRJT05TCisjICB1bmRlZiAgX1NUTFBfRE9OVF9VU0VfRVhDRVBUSU9OUworIyAgZGVmaW5lIF9TVExQX0RPTlRfVVNFX0VYQ0VQVElPTlMgMQorI2VuZGlmCisKKyNpZiAoX19HTlVDX18gPj0gMykKKy8qIEluc3RhbnRpYXRpb24gc2NoZW1lIHRoYXQgdXNlZCAoZGVmYXVsdCkgaW4gZ2NjIDMgbWFkZSB2b2lkIG9mIHNlbnNlIGV4cGxpY2l0CisgICBpbnN0YW50aWF0aW9uIHdpdGhpbiBsaWJyYXJ5OiBub3RoaW5nIGV4Y2VwdCBpbmNyZWFzZWQgbGlicmFyeSBzaXplLiAtIHB0cgorICovCisjICBkZWZpbmUgX1NUTFBfTk9fRk9SQ0VfSU5TVEFOVElBVEUKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdGwvY29uZmlnL19ocGFjYy5oIGIvc3RscG9ydC9zdGwvY29uZmlnL19ocGFjYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMGI4YjQKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9jb25maWcvX2hwYWNjLmgKQEAgLTAsMCArMSwxMjkgQEAKKy8qIFNUTHBvcnQgY29uZmlndXJhdGlvbiBmaWxlCisgKiBJdCBpcyBpbnRlcm5hbCBTVExwb3J0IGhlYWRlciAtIERPIE5PVCBpbmNsdWRlIGl0IGRpcmVjdGx5CisgKi8KKworI2RlZmluZSBfU1RMUF9DT01QSUxFUiAiYUNDIgorCisvKiBzeXN0ZW0gQy1saWJyYXJ5IGRlcGVuZGVudCAqLworI2lmIGRlZmluZWQgKF9YT1BFTl9TT1VSQ0UpICYmIChfWE9QRU5fVkVSU0lPTiAtIDAgPj0gNCkKKyMgIGRlZmluZSBfU1RMUF9SQU5ENDggMQorI2VuZGlmCisvKiAjICBkZWZpbmUgX1NUTFBfUkFORDQ4IDEgKi8KKy8qICNkZWZpbmUgX1NUTFBfTk9fTkFUSVZFX01CU1RBVEVfVCAgICAgIDEgKi8KKyNkZWZpbmUgX1NUTFBfSFBBQ0NfQlJPS0VOX0JVRkVORCAgICAgICAxCisjZGVmaW5lIF9TVExQX1dDSEFSX0hQQUNDX0VYQ0xVREUgICAgICAxCisKKy8qIHRoaXMgd2FzIHJlcG9ydGVkIHRvIGhlbHAsIGp1c3QgYXMgd2l0aCBTVU4gQ0MgNC4yICovCisjZGVmaW5lIF9TVExQX0lOTElORV9TVFJJTkdfTElURVJBTF9CVUcKKworLyogc3BlY2lmaWMgcHJvbG9nIGlzIG5lZWRlZCB0byBzZWxlY3QgY29ycmVjdCB0aHJlYWRzIGltcGwgKi8KKyNkZWZpbmUgX1NUTFBfSEFTX1NQRUNJRklDX1BST0xPR19FUElMT0cKKworLyogSFAgYUNDIHdpdGggK25vZWggKi8KKyNpZmRlZiBfX0hQQUNDX05PRUgKKyMgIGRlZmluZSBfU1RMUF9IQVNfTk9fRVhDRVBUSU9OUyAxCisjZW5kaWYKKworI2RlZmluZSBfU1RMUF9OT19GT1JDRV9JTlNUQU5USUFURQorI2RlZmluZSBfU1RMUF9MT05HX0xPTkcgbG9uZyBsb25nCisjZGVmaW5lIF9TVExQX05PX1ZFTkRPUl9TVERMSUJfTAorCisvKiBUaGUgYUNDNiBjb21waWxlciBpcyB1c2luZyB0aGUgRURHIEZyb250IEVuZC4gVW5mb3J0dW5hdGVseSwgcHJpb3IgdG8KKyAqIHZlcnNpb24gQS4wNi4xMiwgZGVmaW5pbmcgdGhlIF9fRURHX18gYW5kIF9fRURHX1ZFUlNJT05fXyBtYWNyb3Mgd2FzCisgKiBkaXNhYmxlZC4gSXQgd2FzIGNvcnJlY3RlZCBpbiBBLjA2LjEyLgorICovCisjaWYgKChfX0hQX2FDQyA+IDYwMDAwKSAmJiAoX19IUF9hQ0MgPCA2MTIwMCkpCisjICBkZWZpbmUgX19FREdfXworIyAgZGVmaW5lIF9fRURHX1ZFUlNJT05fXyAzMDYKKyNlbmRpZiAKKworI2lmIChfX0hQX2FDQyA+PSAzMjUwMCApCisjICBkZWZpbmUgX1NUTFBfVVNFX05FV19DX0hFQURFUlMKKworIyAgZGVmaW5lIF9TVExQX0ZPUkNFX0FMTE9DQVRPUlModCxhKSBcCisgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jX3RyYWl0czx0LGE+OjpfT3JpZyBfU1RMUF9kdW1teV90eXBlMTtcCisgIHR5cGVkZWYgdHlwZW5hbWUgX1NUTFBfZHVtbXlfdHlwZTE6OiBfU1RMUF9URU1QTEFURSByZWJpbmQ8dD46Om90aGVyIF9TVExQX2R1bW15X3R5cGUyOworCisjICBpZiBkZWZpbmVkIChfSFBfTkFNRVNQQUNFX1NURCkgLy8gb3B0aW9uIC1BQQorLyogZnJvbSBub3csIHdlIGhhdmUgYSBmdWxsIHN0YW5kYXJkIGxpYiBpbiBuYW1lc3BhY2Ugc3RkCisgKgorICogLUFBIGluZGljYXRlcyB0aGF0IHdlIGFyZSBjb21waWxpbmcgYWdhaW5zdCBSb2d1ZSBXYXZlIDIuMi4xCisgKiBTVEwgc2hpcHBlZCB3aXRoIHRoZSBIUCBhQ0MgY29tcGlsZXIuIC1BQSB0ZWxscyB0aGUgY29tcGlsZXIKKyAqIHRvIHVzZSB0aGUgU1RMIGRlZmluZWQgaW4gdGhlIGluY2x1ZGVfc3RkIGRpcmVjdG9yeS4KKyAqLworIyAgICBkZWZpbmUgX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSCAuLi9pbmNsdWRlX3N0ZAorIyAgZWxzZSAvLyBvcHRpb24gLUFhCisjICAgIGRlZmluZSBfU1RMUF9WRU5ET1JfR0xPQkFMX1NURCAgICAgICAgIDEKKyMgICAgZGVmaW5lIF9TVExQX1ZFTkRPUl9HTE9CQUxfQ1NURCAgICAgICAgMQorIyAgICBkZWZpbmUgX1NUTFBfRE9OVF9USFJPV19SQU5HRV9FUlJPUlMgICAxCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAoX19IUF9hQ0MgPj0gMzE0MDAgJiYgX19IUF9hQ0MgPCAzMjUwMCkKKyMgIGRlZmluZSBfU1RMUF9GT1JDRV9BTExPQ0FUT1JTKHQsYSkgXAordHlwZWRlZiB0eXBlbmFtZSBfQWxsb2NfdHJhaXRzPHQsYT46Ol9PcmlnIF9TVExQX2R1bW15X3R5cGUxO1wKK3R5cGVkZWYgdHlwZW5hbWUgX1NUTFBfZHVtbXlfdHlwZTE6OiBfU1RMUF9URU1QTEFURSByZWJpbmQ8dD46Om90aGVyIF9TVExQX2R1bW15X3R5cGUyOworIyAgZGVmaW5lIF9TVExQX05PX0NXQ0hBUgorIyAgaWYgZGVmaW5lZCAoX05BTUVTUEFDRV9TVEQpIC8vIG9wdGlvbiAtQUEKKy8qIGZyb20gbm93LCB3ZSBoYXZlIGEgZnVsbCBzdGFuZGFyZCBsaWIgaW4gbmFtZXNwYWNlIHN0ZCAqLworIyAgICBkZWZpbmUgX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSCAgICAgICAuLi9pbmNsdWRlX3N0ZAorIyAgZWxzZSAvKiBraW5kIG9mIGNvbXBhdGliaWxpdHkgbW9kZSAqLworIyAgICBkZWZpbmUgX1NUTFBfVkVORE9SX0dMT0JBTF9TVEQgICAgICAgICAxCisjICAgIGRlZmluZSBfU1RMUF9WRU5ET1JfR0xPQkFMX0NTVEQgICAgICAgIDEKKyMgICAgZGVmaW5lIF9TVExQX0RPTlRfVEhST1dfUkFOR0VfRVJST1JTICAgMQorIyAgICBkZWZpbmUgX1NUTFBfTk9fUk9QRSAgICAgICAgICAgICAgICAgICAxCisjICBlbmRpZgorI2VuZGlmIC8qIDMxNCAqLworCisjaWYgKChfX0hQX2FDQyA+PSAzMDAwMCAmJiBfX0hQX2FDQyA8IDMxNDAwKSB8fCAoX19IUF9hQ0MgPT0gMSkpIC8vIEEuMDMuMTM6IF9fSFBfYUNDID09IDEKKworIyAgaWYgKF9fSFBfYUNDICE9IDEpCisjICAgIGRlZmluZSBfU1RMUF9IQVNfTk9fTkVXX0NfSEVBREVSUyAxCisjICBlbmRpZgorCisjICBkZWZpbmUgX1NUTFBfTk9fUVVBTElGSUVEX0ZSSUVORFMgICAgICAgMQorLyogYUNDIGJ1ZyA/IG5lZWQgZXhwbGljaXQgYXJncyBvbiBjb25zdHJ1Y3RvcnMgb2YgcGFydGlhbCBzcGVjaWFsaXplZAorICogY2xhc3NlcworICovCisjICBkZWZpbmUgX1NUTFBfUEFSVElBTF9TUEVDX05FRURTX1RFTVBMQVRFX0FSR1MgMQorLyogPz8gZmJwIDogbWF5YmUgcHJlc2VudCBpbiBzb21lIHZlcnNpb25zID8gKi8KKyMgIGRlZmluZSBfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVfQ0xBU1NFUyAxCisjICBkZWZpbmUgX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFX0tFWVdPUkQgMQorLyogPGV4Y2VwdGlvbj4gYW5kIHN0dWZmIGlzIGluIGdsb2JhbCBuYW1lc3BhY2UgKi8KKyMgIGRlZmluZSBfU1RMUF9WRU5ET1JfR0xPQkFMX0VYQ0VQVF9TVEQKKy8qIGZicCA6IG1vdmVkIGhlcmUgKi8KKyMgIGRlZmluZSBfU1RMUF9WRU5ET1JfR0xPQkFMX0NTVEQgICAgICAgIDEKKy8qICMgICAgIGRlZmluZSBfSU5DTFVERV9IUFVYX1NPVVJDRSAqLworIyAgZGVmaW5lIF9YUEc0CisjICBkZWZpbmUgX0lOQ0xVREVfWE9QRU5fU09VUkNFCisjICBkZWZpbmUgX0lOQ0xVREVfQUVTX1NPVVJDRQorI2VuZGlmCisKKyNpZiAoX19IUF9hQ0MgPD0gMzAwMDAgJiYgX19IUF9hQ0MgPj0gMTIxMDApCisvKiBTcGVjaWFsIGtsdWRnZSB0byB3b3JrYXJvdW5kIGJ1ZyBpbiBhQ0MgQS4wMS4yMywgQ1IgSkFHYWM0MDYzNCAqLworIyAgaWZkZWYgX1NUTFBfREVCVUcKK3N0YXRpYyB2b2lkIF9TVExQX2R1bW15X2xpdGVyYWwoKSB7IGNvbnN0IGNoYXIgKnAgPSAieCI7fQorc3RhdGljIHZvaWQgX1NUTFBfZHVtbXlfbGl0ZXJhbF8yKCkgeyBjb25zdCBjaGFyICpwID0gIjEyMzQ1Njc4OSI7IH0KK3N0YXRpYyB2b2lkIF9TVExQX2R1bW15X2xpdGVyYWxfMygpIHsgY29uc3QgY2hhciAqcCA9ICIxMjM0NTY3MDAwMDAwMDAwMDAwMDAwODkiO30KKyMgIGVuZGlmCisKKyMgIGRlZmluZSBfU1RMUF9WRU5ET1JfR0xPQkFMX1NURCAgICAgICAgIDEKKyMgIGRlZmluZSBfU1RMUF9WRU5ET1JfR0xPQkFMX0NTVEQgICAgICAgIDEKKyMgIGRlZmluZSBfU1RMUF9ET05UX1RIUk9XX1JBTkdFX0VSUk9SUyAgIDEKKyMgIGRlZmluZSBfU1RMUF9TVEFUSUNfQ09OU1RfSU5JVF9CVUcgMQorIyAgaWYgKF9fSFBfYUNDICA8IDEyNzAwKQorLyogbmV3IGZsYWc6IG9uIG1vc3QgSFAgY29tcGlsZXJzIGN3Y2hhciBpcyBtaXNzaW5nICovCisjICAgIGRlZmluZSBfU1RMUF9OT19DV0NIQVIKKyMgIGVuZGlmCisKKyMgIGRlZmluZSBfU1RMUF9GT1JDRV9BTExPQ0FUT1JTKHQsYSkgXAorICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY190cmFpdHM8dCxhPjo6X09yaWcgX1NUTFBfZHVtbXlfdHlwZTE7XAorICB0eXBlZGVmIHR5cGVuYW1lIF9TVExQX2R1bW15X3R5cGUxOjogX1NUTFBfVEVNUExBVEUgcmViaW5kPHQ+OjpvdGhlciBfU1RMUF9kdW1teV90eXBlMjsKKyNlbmRpZgorCisjaWYgX19IUF9hQ0MgPT0gMQorIyAgZGVmaW5lIF9TVExQX0JST0tFTl9VU0lOR19JTl9DTEFTUworIyAgZGVmaW5lIF9TVExQX1VTSU5HX0JBU0VfTUVNQkVSCisjICBkZWZpbmUgX1NUTFBfTk9fQ1dDSEFSCisvKiAjICAgICBkZWZpbmUgX1NUTFBfTk9fV0NIQVJfVCAxICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL2NvbmZpZy9faHB1eC5oIGIvc3RscG9ydC9zdGwvY29uZmlnL19ocHV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg1YzUxNAotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc3RsL2NvbmZpZy9faHB1eC5oCkBAIC0wLDAgKzEsMTcgQEAKKyNpZm5kZWYgX19zdGxfY29uZmlnX19ocHV4X2gKKyNkZWZpbmUgX19zdGxfY29uZmlnX19ocHV4X2gKKworI2RlZmluZSBfU1RMUF9QTEFURk9STSAiSFAgVW5peCIKKworI2RlZmluZSBfU1RMUF9VU0VfVU5JWF9JTworCisjaWZkZWYgX19HTlVDX18KKyMgIGRlZmluZSBfU1RMUF9OT19XQ0hBUl9UCisjICBkZWZpbmUgX1NUTFBfTk9fQ1dDSEFSCisjICBkZWZpbmUgX1NUTFBfTk9fTE9OR19ET1VCTEUKKyMgIGlmbmRlZiBfUE9TSVhfQ19TT1VSQ0UKKyMgICAgZGVmaW5lIF9QT1NJWF9DX1NPVVJDRSAxOTk1MDYKKyMgIGVuZGlmCisjZW5kaWYKKworI2VuZGlmIC8qIF9fc3RsX2NvbmZpZ19faHB1eF9oICovCmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9jb25maWcvX2libS5oIGIvc3RscG9ydC9zdGwvY29uZmlnL19pYm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzRmNmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvY29uZmlnL19pYm0uaApAQCAtMCwwICsxLDE0NCBAQAorLyogU1RMcG9ydCBjb25maWd1cmF0aW9uIGZpbGUKKyAqIEl0IGlzIGludGVybmFsIFNUTHBvcnQgaGVhZGVyIC0gRE8gTk9UIGluY2x1ZGUgaXQgZGlyZWN0bHkKKyAqLworCisjaWYgZGVmaW5lZCAoX19JQk1DUFBfXykgfHwgZGVmaW5lZCAoX19JQk1DX18pCisjICBkZWZpbmUgX1NUTFBfQ09NUElMRVIgIlZpc3VhbCBBZ2UgQysrIgorI2VsaWYgZGVmaW5lZCAoX194bENfXykKKyMgIGRlZmluZSBfU1RMUF9DT01QSUxFUiAieGxjIgorI2Vsc2UKKyMgIGVycm9yICJVbmtub3duIGNvbXBpbGVyIgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChfX0lCTUNQUF9fKSB8fCAoX19JQk1DUFBfXyA8IDUwMCkKKyMgZGVmaW5lIF9TVExQX0hBU19OT19ORVdfQ19IRUFERVJTIDEKKyNlbmRpZgorCisvKiBzdHJpbmcgbGl0ZXJhbCBwcm9ibGVtLCBzYW1lIGFzIHdpdGggU1VOIGFuZCBhQ0MgKi8KKyMgZGVmaW5lIF9TVExQX0lOTElORV9TVFJJTkdfTElURVJBTF9CVUcgMQorIyBkZWZpbmUgX1NUTFBfSEFTX05BVElWRV9GTE9BVF9BQlMKKworIyBkZWZpbmUgX1NUTFBfREVGX0NPTlNUX1BMQ1RfTkVXX0JVRyAxCisjIGRlZmluZSBfU1RMUF9ERUZfQ09OU1RfREVGX1BBUkFNX0JVRyAxCisKKworIyBpZmRlZiBfX0lCTUNQUF9fCisjICBkZWZpbmUgX1NUTFBfSEFTX1NQRUNJRklDX1BST0xPR19FUElMT0cKKyMgZW5kaWYKKworLyogIyAgaWYgKCBkZWZpbmVkIChfX01VTFRJX18pICYmIGRlZmluZWQgKF9fV0lORE9XU19fKSkKKyAqICMgICBkZWZpbmUgIF9TVExQX1dJTjMyVEhSRUFEUyAxICAgICAgICAgICBPbmx5IFZpc3VhbCBBZ2UgMy41IGZvciBXaW5kb3dzCisgKiAjICBlbmRpZgorICovCisKKyMgIGlmICggZGVmaW5lZCAoX19NVUxUSV9fKSAmJiBkZWZpbmVkIChfX09TMl9fKSkKKyMgICBkZWZpbmUgX1NUTFBfT1MyVEhSRUFEUyAxCisjICBlbmRpZgorCisvKiBfX1RFTVBJTkNfXyBpcyBzZXQgd2hlbiAvRnQrIG9wdGlvbiBpcyB1c2VkICovCisjICBpZmRlZiBfX1RFTVBJTkNfXworIyAgICBkZWZpbmUgX1NUTFBfTElOS19USU1FX0lOU1RBTlRJQVRJT04gMQorIyAgZW5kaWYKKworIyBpZiBkZWZpbmVkIChfX01WU19fKQorLyogbG9uZyBsb25nIHN1cHBvcnQgaXMgYnVnZ3kgLSByZXBvcnRlZCBieSBUaW5ueSBOZworICogIyAgaWYgX19FWFRFTkRFRF9fICYmIF9fQ09NUElMRVJfVkVSX18gPj0gMHgyMjA2MDAwMAorICogIyAgIGRlZmluZSBfU1RMUF9MT05HX0xPTkcgbG9uZyBsb25nCisgKiAjICBlbmRpZgorICovCisvKiBib3JpcyA6IGhzdGFzaCByZXBvcnRlZCBpdCBjYW4gYmUgdHJlYXRlZCBsaWtlIFVOSVggKi8KKyMgIGRlZmluZSBfU1RMUF9OT19UWVBFSU5GTyAxCisjICB1bmRlZiBfU1RMUF9OQVRJVkVfSU5DTFVERV9QQVRICisjICBkZWZpbmUgX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSCAvdXNyL2xwcC9pb2NsaWIvaW5jbHVkZQorLyogc2FtZSBmb3IgQyBoZWFkZXJzIGxpa2UgPHN0cmluZy5oPiAqLworIyAgdW5kZWYgX1NUTFBfTkFUSVZFX0NfSU5DTFVERV9QQVRICisjICBkZWZpbmUgX1NUTFBfTkFUSVZFX0NfSU5DTFVERV9QQVRIIC91c3IvaW5jbHVkZQorIyAgZGVmaW5lIF9TVExQX05BVElWRV9DUFBfUlVOVElNRV9JTkNMVURFX1BBVEggL3Vzci9pbmNsdWRlCisKKyMgZWxpZiAoZGVmaW5lZCAoX19XSU5ET1dTX18pIHx8IGRlZmluZWQgKF9BSVgpIHx8IGRlZmluZWQgKF9fT1MyX18pICkgJiYgKF9fSUJNQ1BQX18gPj0gMzUwKQorCisjICBkZWZpbmUgX1NUTFBfTE9OR19MT05HIGxvbmcgbG9uZworCisjZW5kaWYKKworI2lmICEoIGRlZmluZWQoIF9feGxDX18gKSAmJiBfX3hsQ19fID49IDB4NTAwICkKKworLyogQUlYIHhsQyAzLjEgLCAzLjAuMSA9PTB4MzAxCisgKiBWaXN1YWwgQWdlIEMrKyAzLngKKyAqIE9TLTM5MCBDKysKKyAqIGZicCA6IHNob3VsZCBiZSBtb3JlIHZlcnNpb24tc3BlY2lmaWMhCisgKi8KKworIyAgZGVmaW5lIF9TVExQX05PX0JPT0wgMQorIyAgZGVmaW5lIF9TVExQX0RPTlRfVVNFX0JPT0xfVFlQRURFRiAxCisjICBkZWZpbmUgX1NUTFBfTElNSVRFRF9ERUZBVUxUX1RFTVBMQVRFUyAxCisjICBkZWZpbmUgX1NUTFBfSEFTX05PX05BTUVTUEFDRVMgMQorIyAgZGVmaW5lIF9TVExQX05FRURfVFlQRU5BTUUgMQorIyAgZGVmaW5lIF9TVExQX05FRURfRVhQTElDSVQgMQorIyAgZGVmaW5lIF9TVExQX05PX0FSUk9XX09QRVJBVE9SIDEKKyMgIGRlZmluZSBfU1RMUF9OT19ORVdfU1RZTEVfQ0FTVFMgMQorIyAgZGVmaW5lIF9TVExQX05PX1dDSEFSX1QgMQorIyAgZGVmaW5lIF9TVExQX05FRURfTVVUQUJMRSAxCisjICBkZWZpbmUgX1NUTFBfTk9fUEFSVElBTF9TUEVDSUFMSVpBVElPTl9TWU5UQVggMQorIyAgZGVmaW5lIF9TVExQX05PX0JBRF9BTExPQyAxCisKKyMgIGRlZmluZSBfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVTIDEKKyMgIGRlZmluZSBfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVfQ0xBU1NFUyAxCisjICBkZWZpbmUgX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFX0tFWVdPUkQgMQorIyAgZGVmaW5lIF9TVExQX05PX1FVQUxJRklFRF9GUklFTkRTIDEKKyMgIGRlZmluZSBfU1RMUF9OT19DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OIDEKKyMgIGRlZmluZSBfU1RMUF9OT19GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIgMQorCisjICBkZWZpbmUgX1NUTFBfTk9fREVGQVVMVF9OT05fVFlQRV9QQVJBTSAxCisjICBkZWZpbmUgX1NUTFBfTk9fTUVUSE9EX1NQRUNJQUxJWkFUSU9OIDEKKyMgIGRlZmluZSBfU1RMUF9OT19FWFBMSUNJVF9GVU5DVElPTl9UTVBMX0FSR1MgMQorIyAgZGVmaW5lIF9TVExQX05PX0VYQ0VQVElPTl9IRUFERVIgMQorCisjICBkZWZpbmUgX1NUTFBfTk9fTkVXX05FV19IRUFERVIgMQorCisjICBpZiBkZWZpbmVkIChfX09TMl9fKSAmJiAoX19JQk1DUFBfXyA8PSAzNTApCisjICAgZGVmaW5lIF9TVExQX05PX1RZUEVJTkZPIDEKKyMgIGVuZGlmCisjICBkZWZpbmUgX1NUTFBfTk9fTkVXX05FV19IRUFERVIgMQorCisjICBkZWZpbmUgX1NUTFBfU1RBVElDX0NPTlNUX0lOSVRfQlVHIDEKKy8qICMgIGRlZmluZSBfU1RMUF9USFJPV19SRVRVUk5fQlVHIDEgKi8KKworCisjICBkZWZpbmUgX1NUTFBfTk9fVEVNUExBVEVfQ09OVkVSU0lPTlMgMQorIyAgZGVmaW5lIF9TVExQX0JBU0VfVFlQRURFRl9PVVRTSURFX0JVRyAxCisKKy8qIEFJWCB4bEMsIFZpc3VhbCBBZ2UgMy4wIGZvciBPUy8yIGFuZCBNUyAqLworIyAgZGVmaW5lIF9TVExQX1RSSVZJQUxfREVTVFJVQ1RPUl9CVUcKKworIyAgZGVmaW5lIF9TVExQX05PTl9UWVBFX1RNUExfUEFSQU1fQlVHIDEKKyMgIGRlZmluZSBfU1RMUF9OT05URU1QTF9CQVNFX01BVENIX0JVRyAxCisKKyNpZiBfX0lCTUNQUF9fIDw9IDM1MAorIyAgZGVmaW5lIF9TVExQX05FRURfVU5SRUFDSEFCTEVfUkVUVVJOIDEKKyNlbmRpZgorCisjaWYgX19JQk1DUFBfXyA8IDM1MAorIyAgZGVmaW5lIF9TVExQX05PX0xPTkdfRE9VQkxFIDEKKyNlbmRpZgorCisjaWYgX19JQk1DUFBfXyA+PSAzNjUKKy8qIGRvZXMgbm90IGhhdmUgbmV3IEMgaGVhZGVycywgYnV0IGhhcyBkaXYoKSAqLworIyAgZGVmaW5lIF9TVExQX0xESVYKKyNlbmRpZgorCisjZW5kaWYgLyogeGxDIDUgKi8KKworLyogZGV0ZWN0IHhsQzUgYnk6ICovCisjaWYgZGVmaW5lZChfX0lCTUNQUF9fKSAmJiAoNTAwIDw9IF9fSUJNQ1BQX18pICYmIChfX0lCTUNQUF9fIDwgNzAwKQorIyAgZGVmaW5lIF9TVExQX1VTRV9FWENFUFRJT05TIDEKKyMgIGRlZmluZSBfU1RMUF9TVEFUSUNfQ09OU1RfSU5JVF9CVUcgMQorLyogI3ByYWdtYSByZXBvcnQoZGlzYWJsZSxDUFBDMTUwMDAyOSkKKyAqIHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyIHR5cGUKKyAqLworIyAgZGVmaW5lIF9TVExQX1VJTlQzMl9UIHVuc2lnbmVkIGludAorIyAgaWYgZGVmaW5lZChfWE9QRU5fU09VUkNFKSAmJiAoX1hPUEVOX1ZFUlNJT04gLSAwID49IDQpCisjICAgIGRlZmluZSBfU1RMUF9SQU5ENDggMQorIyAgZW5kaWYKKy8qICMgIGRlZmluZSBfU1RMUF9SQU5ENDggMSAqLworI2VuZGlmIC8qIF9fSUJNQ1BQX18gPT0gNTAwICovCmRpZmYgLS1naXQgYS9zdGwvY29uZmlnL19pY2MuaCBiL3N0bHBvcnQvc3RsL2NvbmZpZy9faWNjLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHN0bC9jb25maWcvX2ljYy5oCnJlbmFtZSB0byBzdGxwb3J0L3N0bC9jb25maWcvX2ljYy5oCmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9jb25maWcvX2ludGVsLmggYi9zdGxwb3J0L3N0bC9jb25maWcvX2ludGVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFlMDlkNgotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc3RsL2NvbmZpZy9faW50ZWwuaApAQCAtMCwwICsxLDcyIEBACisvLyBTVExwb3J0IGNvbmZpZ3VyYXRpb24gZmlsZQorLy8gSXQgaXMgaW50ZXJuYWwgU1RMcG9ydCBoZWFkZXIgLSBETyBOT1QgaW5jbHVkZSBpdCBkaXJlY3RseQorCisjZGVmaW5lIF9TVExQX0NPTVBJTEVSICJJbnRlbCBJQ0wiCisKKyNkZWZpbmUgX1NUTFBfSU1QT1JUX1RFTVBMQVRFX0tFWVdPUkQgZXh0ZXJuCisKKy8qIFlvdSBuZWVkIHRvIHVuZGVmIGZvbGxvd2luZyBtYWNybyBpZiB5b3VyIGljbCBpbnN0YWxsIGlzIGJpbmRlZCB0byBNU1ZDIDYKKyAqIG5hdGl2ZSBsaWIgYW5kIHlvdSBhcmUgYnVpbGRpbmcgd2l0aCAvUXZjNyBvciAvUXZjNy4xIG9yIC9RdmM4IG9wdGlvbi4KKyAqLworLyogI2RlZmluZSBfU1RMUF9NU1ZDX0xJQiAxMjAwICovCisvKiBZb3UgbmVlZCB0byB1bmRlZiBmb2xsb3dpbmcgbWFjcm8gaWYgeW91ciBpY2wgaW5zdGFsbCBpcyBiaW5kZWQgdG8gTVNWQyAuTmV0IDIwMDIKKyAqIG5hdGl2ZSBsaWIgYW5kIHlvdSBhcmUgYnVpbGRpbmcgd2l0aG91dCBhbnkgL1F2Yyogb3B0aW9uIG9yIHdpdGggL1F2YzYgb3IgL1F2YzcuMQorICogb3IgL1F2Yzggb3B0aW9uLgorICovCisvKiAjZGVmaW5lIF9TVExQX01TVkNfTElCIDEzMDAgKi8KKy8qIFlvdSBuZWVkIHRvIHVuZGVmIGZvbGxvd2luZyBtYWNybyBpZiB5b3VyIGljbCBpbnN0YWxsIGlzIGJpbmRlZCB0byBNU1ZDIC5OZXQgMjAwMworICogbmF0aXZlIGxpYiBhbmQgeW91IGFyZSBidWlsZGluZyB3aXRob3V0IGFueSAvUXZjKiBvcHRpb24gb3Igd2l0aCAvUXZjNiBvciAvUXZjNworICogb3IgL1F2Yzggb3B0aW9uLgorICovCisvKiAjZGVmaW5lIF9TVExQX01TVkNfTElCIDEzMTAgKi8KKy8qIFlvdSBuZWVkIHRvIHVuZGVmIGZvbGxvd2luZyBtYWNybyBpZiB5b3VyIGljbCBpbnN0YWxsIGlzIGJpbmRlZCB0byBNU1ZDIDIwMDUKKyAqIG5hdGl2ZSBsaWIgYW5kIHlvdSBhcmUgYnVpbGRpbmcgd2l0aG91dCBhbnkgL1F2Yyogb3B0aW9uIG9yIHdpdGggL1F2YzYgb3IgL1F2YzcKKyAqIG9yIC9RdmM3LjEgb3B0aW9uLgorICovCisvKiAjZGVmaW5lIF9TVExQX01TVkNfTElCIDE0MDAgKi8KKworI2luY2x1ZGUgPHN0bC9jb25maWcvX21zdmMuaD4KKworI2lmIGRlZmluZWQgKF9TVExQX0RPTlRfUkVUVVJOX1ZPSUQpCisjICB1bmRlZiBfU1RMUF9ET05UX1JFVFVSTl9WT0lECisjZW5kaWYKKworI2lmIChfX0lDTCA8IDkwMCkKKyMgIGRlZmluZSBfU1RMUF9OT1RIUk9XCisjZW5kaWYKKworI2lmIChfX0lDTCA8PSA4MTApCisvKiBJZiBtZXRob2Qgc3BlY2lhbGl6YXRpb24gaXMgYWN0aXZhdGVkLCBjb21waWxlciBkbyBub3QgZXhwb3J0IHNvbWUKKyAqIHN5bWJvbHMgYW55bW9yZS4KKyAqLworIyAgZGVmaW5lIF9TVExQX05PX01FVEhPRF9TUEVDSUFMSVpBVElPTiAxCisjZW5kaWYKKworI2lmIChfX0lDTCA+PSA4MDAgJiYgX19JQ0wgPCA5MDApCisjICBkZWZpbmUgX1NUTFBfU1RBVElDX0NPTlNUX0lOSVRfQlVHIDEKKyNlbmRpZgorCisjaWYgKF9fSUNMID49IDQ1MCkKKyMgIGRlZmluZSBfU1RMUF9ETExFWFBPUlRfTkVFRFNfUFJFREVDTEFSQVRJT04gMQorI2VuZGlmCisKKyNpZiAoX19JQ0wgPCA0NTApCisvKiAgICBvbmx5IHN0YXRpYyBTVExwb3J0IGxpYiB3b3JrcyBmb3IgSUNMICovCisjICB1bmRlZiAgX1NUTFBfVVNFX1NUQVRJQ19MSUIKKyMgIHVuZGVmICBfU1RMUF9VU0VfRFlOQU1JQ19MSUIKKyMgIGRlZmluZSBfU1RMUF9VU0VfU1RBVElDX0xJQgorLyogICAgZGlzYWJsZSBob29rIHdoaWNoIG1ha2VzIHRlbXBsYXRlIHN5bWJvbHMgdG8gYmUgc2VhcmNoZWQgZm9yIGluIHRoZSBsaWJyYXJ5ICovCisjICB1bmRlZiBfU1RMUF9OT19DVVNUT01fSU8KKyNlbmRpZgorCisjdW5kZWYgIF9TVExQX0xPTkdfTE9ORworI2RlZmluZSBfU1RMUF9MT05HX0xPTkcgbG9uZyBsb25nCisKKyNpZiBkZWZpbmVkIChfX2NwbHVzcGx1cykgJiYgKF9fSUNMID49IDkwMCkgJiYgKF9TVExQX01TVkNfTElCIDwgMTMwMCkKK25hbWVzcGFjZSBzdGQKK3sKKyAgdm9pZCBfU1RMUF9DQUxMIHVuZXhwZWN0ZWQoKTsKK30KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RsL2NvbmZpZy9fZmVlZGJhY2suaD4KZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL2NvbmZpZy9fa2FpLmggYi9zdGxwb3J0L3N0bC9jb25maWcvX2thaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NzE1OGYKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9jb25maWcvX2thaS5oCkBAIC0wLDAgKzEsNDMgQEAKKy8vIFNUTHBvcnQgY29uZmlnIGZpbGUgZm9yIEtBSSBDKysgY29tcGlsZXIKKworI2lmIGRlZmluZWQoX1hPUEVOX1NPVVJDRSkgJiYgKF9YT1BFTl9WRVJTSU9OIC0gMCA+PSA0KQorIyBkZWZpbmUgX1NUTFBfUkFORDQ4IDEKKyNlbmRpZgorCisjICBpZm5kZWYgX19LQUlfU1RSSUNUIC8qIF9OT19MT05HTE9ORyAqLworIyAgIGRlZmluZSBfU1RMUF9MT05HX0xPTkcgbG9uZyBsb25nCisjICBlbmRpZgorCisjICBpZiAhZGVmaW5lZCAoX19FWENFUFRJT05TKSAmJiAhIGRlZmluZWQgKF9FWENFUFRJT05TKQorIyAgICBkZWZpbmUgX1NUTFBfSEFTX05PX0VYQ0VQVElPTlMKKyMgIGVuZGlmCisKKyMgaWZuZGVmIF9fQlVJTERJTkdfU1RMUE9SVAorIyAgZGVmaW5lIF9TVExQX0xJTktfVElNRV9JTlNUQU5USUFUSU9OIDEKKyMgZW5kaWYKKworLy8gdHdvIGxldmVscyBvZiBtYWNyb3MgZG8gbm90IHdvcmsgZ29vZCB3aXRoIGtjYy4KKyMgICBkZWZpbmUgX1NUTFBfTkFUSVZFX0hFQURFUihoZWFkZXIpICAgIDwuLi9pbmNsdWRlLyMjaGVhZGVyPgorIyAgIGRlZmluZSBfU1RMUF9OQVRJVkVfQ19IRUFERVIoaGVhZGVyKSAgICA8Li4vaW5jbHVkZS8jI2hlYWRlcj4KKyMgICBkZWZpbmUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUihoZWFkZXIpICAgIDwuLi9pbmNsdWRlLyMjaGVhZGVyPgorIyAgIGRlZmluZSBfU1RMUF9OQVRJVkVfQ1BQX1JVTlRJTUVfSEVBREVSKGhlYWRlcikgPC4uL2luY2x1ZGUvIyNoZWFkZXI+CisKKy8vIEtBSSBDKysgdXNlcyBFREcgZnJvbnQtZW5kLCBidXQgYXBwYXJlbnRseSBkaWZmZXJlbnQgc3dpdGNoZXMKKy8vICMgIGRlZmluZSBfX0VER19TV0lUQ0hFUyAxCisKKyMgIGRlZmluZSBfU1RMUF9WRU5ET1JfR0xPQkFMX0NTVEQgMQorIyAgZGVmaW5lIF9TVExQX1ZFTkRPUl9NQl9OQU1FU1BBQ0Ugc3RkCisKKy8vIGJvcmlzIDogc29tZSBvZiB0aG9zZSBtYXkgYWxzbyBhcHBseSB0byBLQ0MgMy40CisjIGlmIF9fS0NDX1ZFUlNJT04gPCA0MDAwCisjICBkZWZpbmUgX1NUTFBfVkVORE9SX0dMT0JBTF9FWENFUFRfU1REIDEKKworIyBlbmRpZgorCisjIGlmIGRlZmluZWQgKF9fc2dpKQorLy8gdGhpcyByZXF1aXJlcyBzb21lIGRpc2NyaW1pbmF0aW9uIG9uIHdoZXRoZXIgd2UgYXJlIGFjdHVhbGx5IG9uCisvLyBhIHN5c3RlbSBvZmZpY2lhbGx5IHN1cHBvcnRlZCBieSBLQUkuCisjICBkZWZpbmUgX1NUTFBfSEFTX05PX05FV19DX0hFQURFUlMgMQorIyAgaW5jbHVkZSA8c3RhbmRhcmRzLmg+CisjIGVuZGlmCisKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL2NvbmZpZy9fbGludXguaCBiL3N0bHBvcnQvc3RsL2NvbmZpZy9fbGludXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzZhNzY2Ci0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvY29uZmlnL19saW51eC5oCkBAIC0wLDAgKzEsMTI1IEBACisjaWZuZGVmIF9fc3RsX2NvbmZpZ19fbGludXhfaAorI2RlZmluZSBfX3N0bF9jb25maWdfX2xpbnV4X2gKKworI2RlZmluZSBfU1RMUF9QTEFURk9STSAiTGludXgiCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisvKiBUaGlzIGlzIGRlZmluZWQgd2V0aGVyIGxpYnJhcnkgaW4gdXNlIGlzIGdsaWJjIG9yIG5vdC4KKyAgIFRoaXMgbWF5IGJlIHRyZWF0ZWQgYXMgcHJlc2VuY2Ugb2YgR05VIGxpYmMgY29tcGF0aWJsZQorICAgaGVhZGVyIGZpbGVzICh0aGVzZSBkZWZpbmUgaXMgbm90IHJlYWxseSBpbnRlbmRlZCB0byBjaGVjaworICAgZm9yIHRoZSBwcmVzZW5jZSBvZiBhIHBhcnRpY3VsYXIgbGlicmFyeSwgYnV0IHJhdGhlciBpcyB1c2VkCisgICB0byBkZWZpbmUgYW4gSU5URVJGQUNFLikgKi8KKyNpZm5kZWYgX1NUTFBfVVNFX0dMSUJDCisjICBkZWZpbmUgX1NUTFBfVVNFX0dMSUJDIDEKKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX1VTRV9TVERJT19JTworIyAgZGVmaW5lIF9TVExQX1VTRV9VTklYX0lPCisjZW5kaWYKKworLyogI2RlZmluZSBfU1RMUF9VU0VfU1RESU9fSU8gKi8KKworLyogSWYgbm90IGV4cGxpY2l0bHkgc3BlY2lmaWVkIG90aGVyd2lzZSwgd29yayB3aXRoIHRocmVhZHMKKyAqLworI2lmICFkZWZpbmVkKF9TVExQX05PX1RIUkVBRFMpICYmICFkZWZpbmVkKF9SRUVOVFJBTlQpCisjICBkZWZpbmUgX1JFRU5UUkFOVAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9SRUVOVFJBTlQpICYmICFkZWZpbmVkKF9QVEhSRUFEUykKKyMgZGVmaW5lIF9QVEhSRUFEUworI2VuZGlmCisKKyNpZmRlZiBfX1VDTElCQ19fIC8qIHVDbGliYyAwLjkuMjcgKi8KKyMgIGRlZmluZSBfU1RMUF9VU0VfVUNMSUJDIDEKKyMgIGlmICFkZWZpbmVkKF9fVUNMSUJDX0hBU19XQ0hBUl9fKQorIyAgICBpZm5kZWYgX1NUTFBfTk9fV0NIQVJfVAorIyAgICAgIGRlZmluZSBfU1RMUF9OT19XQ0hBUl9UCisjICAgIGVuZGlmCisjICAgIGlmbmRlZiBfU1RMUF9OT19OQVRJVkVfTUJTVEFURV9UCisjICAgICAgZGVmaW5lIF9TVExQX05PX05BVElWRV9NQlNUQVRFX1QKKyMgICAgZW5kaWYKKyMgICAgaWZuZGVmIF9TVExQX05PX05BVElWRV9XSURFX1NUUkVBTVMKKyMgICAgICBkZWZpbmUgX1NUTFBfTk9fTkFUSVZFX1dJREVfU1RSRUFNUworIyAgICBlbmRpZgorIyAgZW5kaWYgLyogX19VQ0xJQkNfSEFTX1dDSEFSX18gKi8KKyAgIC8qIEhtbSwgYm9ndXMgX0dMSUJDUFBfVVNFX05BTUVTUEFDRVMgc2VlbXMgdW5kZWZpbmVkLi4uICovCisjICBkZWZpbmUgX1NUTFBfVkVORE9SX0dMT0JBTF9DU1REIDEKKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkKF9QVEhSRUFEUykKKyMgIGRlZmluZSBfU1RMUF9USFJFQURTCisjICBkZWZpbmUgX1NUTFBfUFRIUkVBRFMKKy8qCisjICBpZm5kZWYgX19VU0VfVU5JWDk4CisjICAgIGRlZmluZSBfX1VTRV9VTklYOTgKKyMgIGVuZGlmCisqLworLyogVGhpcyBmZWF0dXJlIGV4aXN0IGF0IGxlYXN0IHNpbmNlIGdsaWJjIDIuMi40ICovCisvKiAjICBkZWZpbmUgX19GSVRfWFNJX1RIUiAqLyAvKiBVbml4IDk4IG9yIFgvT3BlbiBTeXN0ZW0gSW50ZXJmYWNlcyBFeHRlbnRpb24gKi8KKyMgIGlmZGVmIF9fVVNFX1hPUEVOMksKKy8qIFRoZSBJRUVFIFN0ZC4gMTAwMy4xai0yMDAwIGludHJvZHVjZXMgZnVuY3Rpb25zIHRvIGltcGxlbWVudCBzcGlubG9ja3MuICovCisjICAgaWZuZGVmIF9fVUNMSUJDX18gLyogVGhlcmUgYXJlIG5vIHNwaW5sb2NrcyBpbiB1Q2xpYmMgMC45LjI3ICovCisjICAgICBkZWZpbmUgX1NUTFBfVVNFX1BUSFJFQURfU1BJTkxPQ0sKKyMgICBlbHNlCisjICAgICBpZm5kZWYgX1NUTFBfRE9OVF9VU0VfUFRIUkVBRF9TUElOTE9DSworICAgICAgICAvKiBpbiB1Q2xpYmMgKDAuOS4yNikgcHRocmVhZF9zcGlubG9jayogZGVjbGFyZWQgaW4gaGVhZGVycworICAgICAgICAgKiBidXQgYWJzZW50IGluIGxpYnJhcnkgKi8KKyMgICAgICAgZGVmaW5lIF9TVExQX0RPTlRfVVNFX1BUSFJFQURfU1BJTkxPQ0sKKyMgICAgIGVuZGlmCisjICAgZW5kaWYKKyMgICBpZm5kZWYgX1NUTFBfRE9OVF9VU0VfUFRIUkVBRF9TUElOTE9DSworIyAgICAgZGVmaW5lIF9TVExQX1VTRV9QVEhSRUFEX1NQSU5MT0NLCisjICAgICBkZWZpbmUgX1NUTFBfU1RBVElDX01VVEVYIF9TVExQX211dGV4CisjICAgZW5kaWYKKy8qICMgICBkZWZpbmUgX19GSVRfUFNIQVJFRF9NVVRFWCAqLworIyAgZW5kaWYKKyNlbmRpZgorCisvKiBFbmRpYW5uZXMgKi8KKyNpbmNsdWRlIDxlbmRpYW4uaD4KKyNpZiAhZGVmaW5lZChfX0JZVEVfT1JERVIpIHx8ICFkZWZpbmVkKF9fTElUVExFX0VORElBTikgfHwgIWRlZmluZWQoX19CSUdfRU5ESUFOKQorIyAgZXJyb3IgIk9uZSBvZiBfX0JZVEVfT1JERVIsIF9fTElUVExFX0VORElBTiBhbmQgX19CSUdfRU5ESUFOIHVuZGVmaW5lZDsgRml4IG1lISIKKyNlbmRpZgorCisjaWYgKCBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOICkKKyMgIGRlZmluZSBfU1RMUF9MSVRUTEVfRU5ESUFOIDEKKyNlbGlmICggX19CWVRFX09SREVSID09IF9fQklHX0VORElBTiApCisjICBkZWZpbmUgX1NUTFBfQklHX0VORElBTiAxCisjZWxzZQorIyAgZXJyb3IgIl9fQllURV9PUkRFUiBuZWl0aGVyIF9fQklHX0VORElBTiBub3IgX19MSVRUTEVfRU5ESUFOOyBGaXggbWUhIgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoX19HTlVDX18gPCAzKQorIyAgZGVmaW5lIF9TVExQX05PX05BVElWRV9XSURFX0ZVTkNUSU9OUyAxCisjZW5kaWYKKworI2lmZGVmIF9fR0xJQkNfXworIyAgaWYgKF9fR0xJQkNfXyA9PSAyICYmIF9fR0xJQkNfTUlOT1JfXyA+PSAzKSB8fCAoX19HTElCQ19fID4gMikKKy8qIEZyb20gZ2xpYmMgMi4zLnggZGVmYXVsdCBhbGxvY2F0b3IgaXMgbWFsbG9jX2FsbG9jLCBpZiB3YXMgbm90IGRlZmluZWQgb3RoZXIgKi8KKyMgICAgaWYgIWRlZmluZWQoX1NUTFBfVVNFX01BTExPQykgJiYgIWRlZmluZWQoX1NUTFBfVVNFX05FV0FMTE9DKSAmJiAhZGVmaW5lZChfU1RMUF9VU0VfUEVSVEhSRUFEX0FMTE9DKSAmJiAhZGVmaW5lZChfU1RMUF9VU0VfTk9ERV9BTExPQykKKyMgICAgICBkZWZpbmUgX1NUTFBfVVNFX01BTExPQyAxCisjICAgIGVuZGlmCisjICBlbmRpZgorLyogRm9sbG93aW5nIHBsYXRmb3JtcyBoYXMgbm8gbG9uZyBkb3VibGU6CisgKiAgIC0gQWxwaGEKKyAqICAgLSBQb3dlclBDCisgKiAgIC0gU1BBUkMsIDMyLWJpdHMgKDY0LWJpdHMgcGxhdGZvcm0gaGFzIGxvbmcgZG91YmxlKQorICogICAtIE1JUFMsIDMyLWJpdHMKKyAqICAgLSBBUk0KKyAqICAgLSBTSDQKKyAqLworIyAgaWYgZGVmaW5lZChfX2FscGhhX18pIHx8IFwKKyAgICAgIGRlZmluZWQoX19wcGNfXykgfHwgZGVmaW5lZChQUEMpIHx8IGRlZmluZWQoX19wb3dlcnBjX18pIHx8IFwKKyAgICAgICgoZGVmaW5lZChfX3NwYXJjKSB8fCBkZWZpbmVkKF9fc3BhcmN2OSkgfHwgZGVmaW5lZChfX3NwYXJjdjhwbHVzKSkgJiYgIWRlZmluZWQgKCBfX1dPUkQ2NCApICYmICFkZWZpbmVkKF9fYXJjaDY0X18pKSAvKiA/ICovIHx8IFwKKyAgICAgIChkZWZpbmVkKF9NSVBTX1NJTSkgJiYgKF9NSVBTX1NJTSA9PSBfQUJJTzMyKSkgfHwgXAorICAgICAgZGVmaW5lZChfX2FybV9fKSB8fCBcCisgICAgICBkZWZpbmVkKF9fc2hfXykKKyAvKiAjICBpZiBkZWZpbmVkKF9fTk9fTE9OR19ET1VCTEVfTUFUSCkgKi8KKyMgICAgZGVmaW5lIF9TVExQX05PX0xPTkdfRE9VQkxFCisjICBlbmRpZgorI2VuZGlmCisKKworI2VuZGlmIC8qIF9fc3RsX2NvbmZpZ19fbGludXhfaCAqLwpkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdGwvY29uZmlnL19tYWMuaCBiL3N0bHBvcnQvc3RsL2NvbmZpZy9fbWFjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc1YzE4MwotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc3RsL2NvbmZpZy9fbWFjLmgKQEAgLTAsMCArMSw2IEBACisjZGVmaW5lIF9TVExQX1BMQVRGT1JNICJNYWMiCisKKyNkZWZpbmUgX1NUTFBfTUFDICAxCisKKyNlcnJvciBMb29rcyBsaWtlIHVuc3VwcG9ydGVkIHBsYXRmb3JtCisjZGVmaW5lIF9TVExQX1VTRV9VTklYX0VNVUxBVElPTl9JTwpkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdGwvY29uZmlnL19tYWNvc3guaCBiL3N0bHBvcnQvc3RsL2NvbmZpZy9fbWFjb3N4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRhOTIyMgotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc3RsL2NvbmZpZy9fbWFjb3N4LmgKQEAgLTAsMCArMSw5IEBACisjZGVmaW5lIF9TVExQX1BMQVRGT1JNICJNYWMgT1MgWCIKKworI2lmIGRlZmluZWQgKF9fQklHX0VORElBTl9fKQorIyAgZGVmaW5lIF9TVExQX0JJR19FTkRJQU4gMQorI2VsaWYgZGVmaW5lZCAoX19MSVRUTEVfRU5ESUFOX18pCisjICBkZWZpbmUgX1NUTFBfTElUVExFX0VORElBTiAxCisjZW5kaWYKKworI2RlZmluZSBfU1RMUF9VU0VfVU5JWF9JTwpkaWZmIC0tZ2l0IGEvc3RsL2NvbmZpZy9fbWxjLmggYi9zdGxwb3J0L3N0bC9jb25maWcvX21sYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzdGwvY29uZmlnL19tbGMuaApyZW5hbWUgdG8gc3RscG9ydC9zdGwvY29uZmlnL19tbGMuaApkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdGwvY29uZmlnL19tc3ZjLmggYi9zdGxwb3J0L3N0bC9jb25maWcvX21zdmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MThkMDE4Ci0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvY29uZmlnL19tc3ZjLmgKQEAgLTAsMCArMSwyNjUgQEAKKy8qIFNUTHBvcnQgY29uZmlndXJhdGlvbiBmaWxlCisgKiBJdCBpcyBpbnRlcm5hbCBTVExwb3J0IGhlYWRlciAtIERPIE5PVCBpbmNsdWRlIGl0IGRpcmVjdGx5CisgKiBNaWNyb3NvZnQgVmlzdWFsIEMrKyA2LjAsIDcuMCwgNy4xLCA4LjAsIElDTAorICovCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfQ09NUElMRVIpCisjICBkZWZpbmUgX1NUTFBfQ09NUElMRVIgIk1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIEMrKyIKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKF9fSUNMKSAmJiAhZGVmaW5lZCAoX1NUTFBfTVNWQykKKyMgIGRlZmluZSBfU1RMUF9NU1ZDIF9NU0NfVkVSCisjZW5kaWYKKworI2lmICFkZWZpbmVkIChfU1RMUF9NU1ZDX0xJQikKKyMgIGRlZmluZSBfU1RMUF9NU1ZDX0xJQiBfTVNDX1ZFUgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX0JVSUxESU5HX1NUTFBPUlQpICYmIGRlZmluZWQgKF9NQU5BR0VEKQorLyogQnVpbGRpbmcgYSBtYW5hZ2VkIHZlcnNpb24gb2YgU1RMcG9ydCBpcyBub3Qgc3VwcG9ydGVkIGJlY2F1c2Ugd2UgaGF2ZW4ndAorICogZm91bmQgYSBnb29kIHJlYXNvbiB0byBzdXBwb3J0IGl0LiBIb3dldmVyLCBidWlsZGluZyBhIG1hbmFnZWQgdHJhbnNsYXRpb24KKyAqIHVuaXQgdXNpbmcgU1RMcG9ydCBfaXNfIHN1cHBvcnRlZC4KKyAqLworIyAgZXJyb3IgU29ycnkgYnV0IGJ1aWxkaW5nIGEgbWFuYWdlZCB2ZXJzaW9uIG9mIFNUTHBvcnQgaXMgbm90IHN1cHBvcnRlZC4KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNJTkdfUExBVEZPUk1fU0RLX0NPTVBJTEVSKQorLyogVGhpcyBpcyBhIHNwZWNpZmljIHNlY3Rpb24gZm9yIGNvbXBpbGVycyBjb21pbmcgd2l0aCBwbGF0Zm9ybSBTREtzLiBOYXRpdmUKKyAqIGxpYnJhcnkgY29taW5nIHdpdGggaXQgaXMgZGlmZmVyZW50IGZyb20gdGhlIG9uZSBjb21pbmcgd2l0aCBjb21tZXJjaWFsCisgKiBNU1ZDIGNvbXBpbGVycyBzbyB0aGVyZSBpcyBzb21lIHNwZWNpZmljIHNldHRpbmdzLgorICovCisjICBkZWZpbmUgX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSCAuLi9jcnQKKyMgIGRlZmluZSBfU1RMUF9WRU5ET1JfR0xPQkFMX0NTVEQKKyMgIGRlZmluZSBfU1RMUF9WRU5ET1JfVEVSTUlOQVRFX1NURAorIyAgZGVmaW5lIF9TVExQX0dMT0JBTF9ORVdfSEFORExFUgorIyAgaWYgKF9TVExQX01TVkNfTElCIDw9IDE0MDApCisvKiBXZSBob3BlIHRoaXMgYnVnIHdpbGwgYmUgZml4ZWQgaW4gZnV0dXJlIHZlcnNpb25zLiAqLworIyAgICBkZWZpbmUgX1NUTFBfTkVXX0RPTlRfVEhST1dfQkFEX0FMTE9DIDEKKyMgIGVuZGlmCisjZW5kaWYKKworI2RlZmluZSBfU1RMUF9DQUxMIF9fY2RlY2wKKworI2lmbmRlZiBfU1RMUF9MT05HX0xPTkcKKyMgIGRlZmluZSBfU1RMUF9MT05HX0xPTkcgX19pbnQ2NAorI2VuZGlmCisKKyNkZWZpbmUgX1NUTFBfUFJBR01BX09OQ0UKKworLyogVGhlc2Ugc3dpdGNoZXMgZGVwZW5kIG9uIGNvbXBpbGVyIGZsYWdzLiBXZSBhcmUgaG9waW5nIGhlcmUgdGhhdCBjb21waWxlcnMKKyAqIHNpbXVsYXRpbmcgTVNWQyBiZWhhdmlvciB1c2UgaWRlbnRpY2FsIG1hY3JvcyB0byByZXBvcnQgY29tcGlsYXRpb24gY29udGV4dC4KKyAqIE90aGVyd2lzZSB0aG9zZSBtYWNyb3Mgd2lsbCBoYXZlIHRvIGJlIHVuZGVmIGluIHNwZWNpZmljIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24KKyAqIGZpbGVzLgorICovCisjaWZuZGVmIF9DUFBVTldJTkQKKyMgIGRlZmluZSBfU1RMUF9ET05UX1VTRV9FWENFUFRJT05TIDEKKyNlbmRpZgorCisjaWZuZGVmIF9DUFBSVFRJCisjICBkZWZpbmUgX1NUTFBfTk9fUlRUSSAxCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9NVCkgJiYgIWRlZmluZWQgKF9TVExQX05PX1RIUkVBRFMpCisjICBkZWZpbmUgX1NUTFBfVEhSRUFEUyAxCisjZW5kaWYKKworI2lmICFkZWZpbmVkIChfTkFUSVZFX1dDSEFSX1RfREVGSU5FRCkKKyMgIGRlZmluZSBfU1RMUF9XQ0hBUl9UX0lTX1VTSE9SVCAxCisjZW5kaWYKKworI2RlZmluZSBfU1RMUF9OT19WRU5ET1JfU1RETElCX0wgMQorCisjaWYgZGVmaW5lZCAoX1NUTFBfTVNWQykKKworIyAgaWYgKF9TVExQX01TVkMgPCAxMjAwKQorIyAgICBlcnJvciBNaWNyb3NvZnQgVmlzdWFsIEMrKyBjb21waWxlcnMgYmVmb3JlIHZlcnNpb24gNiAoU1A1KSBhcmUgbm90IHN1cHBvcnRlZC4KKyMgIGVuZGlmCisKKyMgIGRlZmluZSBfU1RMUF9OT1JFVFVSTl9GVU5DVElPTiBfX2RlY2xzcGVjKG5vcmV0dXJuKQorCisvKiBGdWxsIGNvbXBpbGVyIHZlcnNpb24gY29tZXMgZnJvbSBib29zdCBsaWJyYXJ5IGludHJpbnNpY3MuaHBwIGhlYWRlci4gKi8KKyMgIGlmIGRlZmluZWQgKF9NU0NfRlVMTF9WRVIpICYmIChfTVNDX0ZVTExfVkVSID49IDE0MDA1MDIxNSkKKyMgICAgZGVmaW5lIF9TVExQX0hBU19UUklWSUFMX0NPTlNUUlVDVE9SKFQpIF9faGFzX3RyaXZpYWxfY29uc3RydWN0b3IoVCkKKyMgICAgZGVmaW5lIF9TVExQX0hBU19UUklWSUFMX0NPUFkoVCkgX19oYXNfdHJpdmlhbF9jb3B5KFQpCisjICAgIGRlZmluZSBfU1RMUF9IQVNfVFJJVklBTF9BU1NJR04oVCkgX19oYXNfdHJpdmlhbF9hc3NpZ24oVCkKKyMgICAgZGVmaW5lIF9TVExQX0hBU19UUklWSUFMX0RFU1RSVUNUT1IoVCkgX19oYXNfdHJpdmlhbF9kZXN0cnVjdG9yKFQpCisjICAgIGRlZmluZSBfU1RMUF9JU19QT0QoVCkgX19pc19wb2QoVCkKKyMgICAgZGVmaW5lIF9TVExQX0hBU19UWVBFX1RSQUlUU19JTlRSSU5TSUNTCisjICBlbmRpZgorCisjICBpZm5kZWYgX1NUTFBfTVNWQzUwX0NPTVBBVElCSUxJVFkKKyMgICAgZGVmaW5lIF9TVExQX01TVkM1MF9DT01QQVRJQklMSVRZICAgMQorIyAgZW5kaWYKKworIyAgZGVmaW5lIF9TVExQX0RMTEVYUE9SVF9ORUVEU19QUkVERUNMQVJBVElPTiAxCisjICBkZWZpbmUgX1NUTFBfSEFTX1NQRUNJRklDX1BST0xPR19FUElMT0cgMQorIyAgZGVmaW5lIF9TVExQX05PX1NUQVRJQ19DT05TVF9ERUZJTklUSU9OIDEKKworLyogIyBpZm5kZWYgX19CVUlMRElOR19TVExQT1JUCisgKiAjICBkZWZpbmUgX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCAxCisgKiAjIGVuZGlmCisgKi8KKworLyoqIE5vdGU6IHRoZSBtYWNybyBfU1RMUF9OT19VTkNBVUdIVF9FWENFUFRfU1VQUE9SVCBpcyBkZWZpbmVkCit1bmNvbmRpdGlvbmFsbHkgYW5kIHVuZGVmJ2VkIGhlcmUgd2hlbiBhcHBsaWNhYmxlLiAqLworIyAgaWYgZGVmaW5lZCAoVU5ERVJfQ0UpCisvKiBlVkN4OgordW5jYXVnaHRfZXhjZXB0aW9uIGlzIGRlY2xhcmVkIGluIHRoZSBTREtzIGRlbGl2ZXJlZCB3aXRoIGVWQzQgKGVWQzMgaXMKK3Vua25vd24pIGFuZCB0aGV5IGFsbCByZXNpZGUgaW4gbmFtZXNwYWNlICdzdGQnIHRoZXJlLiBIb3dldmVyLCB0aGV5IGFyZSBub3QKK3BhcnQgb2YgYW55IGxpYiBzbyBsaW5raW5nIGZhaWxzLiBXaGVuIHVzaW5nIFZDOCB0byBjcm9zc2NvbXBpbGUgZm9yIENFIDUgb24KK2FuIEFSTVY0SSwgdGhlIHVuY2F1Z2h0X2V4Y2VwdGlvbiB0ZXN0IGZhaWxzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgd3JvbmcKK3ZhbHVlLiAqLworLyogQWxsIGVWQ3MgdXAgdG8gYXQgbGVhc3QgVkM4L0NFNSBoYXZlIGEgYnJva2VuIG5ldyBvcGVyYXRvciB0aGF0CisgICByZXR1cm5zIG51bGwgaW5zdGVhZCBvZiB0aHJvd2luZyBiYWRfYWxsb2MuICovCisjICAgIGRlZmluZSBfU1RMUF9ORVdfRE9OVF9USFJPV19CQURfQUxMT0MgMQorIyAgZWxzZQorLyogVkN4OgorVGhlc2UgYXJlIHByZXNlbnQgYXQgbGVhc3Qgc2luY2UgVkM2LCBidXQgdGhlIHVuY2F1Z2h0X2V4Y2VwdGlvbigpIG9mIFZDNiBpcworYnJva2VuLCBpdCByZXR1cm5zIHRoZSB3cm9uZyB2YWx1ZSBpbiB0aGUgdW5pdHRlc3RzLiA3LjEgYW5kIGxhdGVyIHNlZW0gdG8KK3dvcmssIDcuMCBpcyBzdGlsbCB1bmtub3duICh3ZSBhc3N1bWUgaXQgd29ya3MgdW50aWwgbmVnYXRpdmUgcmVwb3J0KS4gKi8KKyMgICAgaWYgKF9TVExQX01TVkMgPj0gMTMwMCkvLyBWQzcgYW5kIGxhdGVyCisjICAgICAgdW5kZWYgX1NUTFBfTk9fVU5DQVVHSFRfRVhDRVBUX1NVUFBPUlQKKyMgICAgZW5kaWYKKyMgICAgaWYgKF9TVExQX01TVkMgPCAxMzAwKQorIyAgICAgIGRlZmluZSBfU1RMUF9OT1RIUk9XCisjICAgIGVuZGlmCisjICBlbmRpZgorCisjICBpZiAoX1NUTFBfTVNWQyA8PSAxMzAwKQorIyAgICBkZWZpbmUgX1NUTFBfU1RBVElDX0NPTlNUX0lOSVRfQlVHICAgMQorIyAgICBkZWZpbmUgX1NUTFBfTk9fQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTiAxCisjICAgIGRlZmluZSBfU1RMUF9OT19GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIgMQorLyogVGhlcmUgaXMgbm8gcGFydGlhbCBzcGVjLCBhbmQgTVNWQyBicmVha3Mgb24gc2ltdWxhdGluZyBpdCBmb3IgaXRlcmF0b3JfdHJhaXRzIHF1ZXJpZXMgKi8KKyMgICAgZGVmaW5lIF9TVExQX1VTRV9PTERfSFBfSVRFUkFUT1JfUVVFUklFUworIyAgICBkZWZpbmUgX1NUTFBfTk9fVFlQRU5BTUVfSU5fVEVNUExBVEVfSEVBREVSCisjICAgIGRlZmluZSBfU1RMUF9OT19NRVRIT0RfU1BFQ0lBTElaQVRJT04gMQorIyAgICBkZWZpbmUgX1NUTFBfREVGX0NPTlNUX1BMQ1RfTkVXX0JVRyAxCisjICAgIGRlZmluZSBfU1RMUF9OT19UWVBFTkFNRV9PTl9SRVRVUk5fVFlQRSAxCisvKiBWQysrIGNhbm5vdCBoYW5kbGUgZGVmYXVsdCBhbGxvY2F0b3IgYXJndW1lbnQgaW4gdGVtcGxhdGUgY29uc3RydWN0b3JzICovCisjICAgIGRlZmluZSBfU1RMUF9ORUVEU19FWFRSQV9URU1QTEFURV9DT05TVFJVQ1RPUlMKKyMgICAgZGVmaW5lIF9TVExQX05PX1FVQUxJRklFRF9GUklFTkRTICAgIDEKKyMgIGVuZGlmCisKKyMgIGlmIChfU1RMUF9NU1ZDIDwgMTMwMCkgLyogaW5jbHVkaW5nIE1TVkMgNi4wICovCisjICAgIGRlZmluZSBfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVfS0VZV09SRCAxCisjICAgIGRlZmluZSBfU1RMUF9ET05UX1NVUFBPUlRfUkVCSU5EX01FTUJFUl9URU1QTEFURSAxCisjICBlbmRpZgorCisjICBkZWZpbmUgX1NUTFBfSEFTX05BVElWRV9GTE9BVF9BQlMgMQorCisvLyBUT0RPOiBzb21lIGVWQzQgY29tcGlsZXJzIHJlcG9ydCBfTVNDX1ZFUiAxMjAxIG9yIDEyMDIsIHdoaWNoIGNhdGVnb3J5IGRvIHRoZXkgYmVsb25nIHRvPworIyAgaWYgKF9TVExQX01TVkMgPiAxMjAwKSAmJiAoX1NUTFBfTVNWQyA8IDEzMTApCisjICAgIGRlZmluZSBfU1RMUF9OT19NT1ZFX1NFTUFOVElDCisjICBlbmRpZgorCisjICBpZiAoX1NUTFBfTVNWQyA8IDEzMDApCisvKiBUT0RPOiByZW1vdmUgdGhpcyBpZiBpdCBpcyBoYW5kbGVkIGFuZCBkb2N1bWVudGVkIGVsc2V3aGVyZQorICogZHVtczogVkM2IGRvIG5vdCBoYW5kbGUgY29ycmVjdGx5IG1lbWJlciB0ZW1wbGF0ZXMgb2YgY2xhc3MgdGhhdCBhcmUgZXhwbGljaXRlbHkKKyAqIGluc3RhbmNpYXRlZCB0byBiZSBleHBvcnRlZC4gVGhlcmUgaXMgYSB3b3JrYXJvdW5kLCBzZXBlcmF0ZSB0aGUgbm9uIHRlbXBsYXRlIG1ldGhvZHMKKyAqIGZyb20gdGhlIHRlbXBsYXRlIG9uZXMgd2l0aGluIDIgZGlmZmVyZW50IGNsYXNzZXMgYW5kIG9ubHkgZXhwb3J0IHRoZSBub24gdGVtcGxhdGUgb25lLgorICogSXQgaXMgaW1wbGVtZW50ZWQgZm9yIGJhc2ljX3N0cmluZyBhbmQgbG9jYWxlIGF0IHRoZSB3cml0aW5nIG9mIHRoaXMgbm90ZS4KKyAqIEhvd2V2ZXIgdGhpcyBwcm9ibGVtIGhvcyBub3QgIGJlZW4gY29uc2lkZXJlZCBhcyBpbXBvcnRhbnQgZW5vdWdoIHRvIHJlbW92ZSB0ZW1wbGF0ZSBtZW1iZXIKKyAqIG1ldGhvZHMgZm9yIG90aGVyIGNsYXNzZXMuIE1vcmVvdmVyIEJvb3N0ICh3d3cuYm9vc3Qub3JnKSByZXF1aXJlZCBpdCB0byBiZSBncmFudGVkLgorICogVGhlIHdvcmthcm91bmQgaXMgYWN0aXZhdGVkIHRoYW5rcyB0byB0aGUgX1NUTFBfVVNFX01TVkM2X01FTV9UX0JVR19XT1JLQVJPVU5EIG1hY3JvIGRlZmluZWQKKyAqIGxhdGVyIGluIHRoaXMgY29uZmlnIGZpbGUuCisgKi8KKy8qCisjICAgIGlmIGRlZmluZWQgKF9ETEwpCisjICAgICAgZGVmaW5lIF9TVExQX05PX01FTUJFUl9URU1QTEFURVMgMQorIyAgICBlbmRpZgorKi8KKworLyogQm9yaXMgOiBub3QgZGVmaW5pbmcgdGhpcyBtYWNybyBmb3IgU1A1IGNhdXNlcyBvdGhlciBwcm9ibGVtcyAqLworLyojICAgIGlmICFkZWZpbmVkIChfTVNDX0ZVTExfVkVSKSB8fCAoX01TQ19GVUxMX1ZFUiA8IDEyMDA4ODA0ICkgKi8KKyMgICAgZGVmaW5lIF9TVExQX05PX1VTSU5HX0ZPUl9HTE9CQUxfRlVOQ1RJT05TIDEKKy8qIyAgICBlbmRpZiAqLworIyAgICBkZWZpbmUgX1NUTFBfRE9OVF9VU0VfQk9PTF9UWVBFREVGIDEKKyMgICAgZGVmaW5lIF9TVExQX0RPTlRfUkVUVVJOX1ZPSUQgMQorIyAgZW5kaWYKKworIyAgaWYgKF9TVExQX01TVkMgPCAxMzAwKSAvKiBNU1ZDIDYuMCBhbmQgZWFybGllciAqLworIyAgICBkZWZpbmUgX1NUTFBfTk9fRVhQTElDSVRfRlVOQ1RJT05fVE1QTF9BUkdTIDEKKy8qIGRlZmluZWQgZm9yIERFQlVHIGFuZCBOREVCVUcgdG9vLCB0byBhbGxvdyB1c2VyIG1peCBvd24gZGVidWcgYnVpbGQgd2l0aCBTVExQIHJlbGVhc2UgbGlicmFyeSAqLworIyAgICBkZWZpbmUgX1NUTFBfVVNFX0FCQlJFVlMKKyMgIGVuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9NU1ZDICovCisKKy8qIFRoZSBkZXNrdG9wIHZhcmlhbnRzIHN0YXJ0aW5nIHdpdGggVkM4IGhhdmUgYSBzZXQgb2YgbW9yZSBzZWN1cmUgcmVwbGFjZW1lbnRzCisgKiBmb3IgdGhlIGVycm9yLXByb25lIHN0cmluZyBoYW5kbGluZyBmdW5jdGlvbnMgb2YgdGhlIEMgc3RhbmRhcmQgbGliLiAqLworLyogV2hlbiB1c2VyIGRvIG5vdCBjb25zaWRlciAndW5zYWZlJyBzdHJpbmcgZnVuY3Rpb25zIGFzIGRlcHJlY2F0ZWQgdXNpbmcgX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFCisgKiBtYWNybyB3ZSB1c2UgJ3Vuc2FmZScgZnVuY3Rpb25zIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLiAqLworI2lmIChfU1RMUF9NU1ZDX0xJQiA+PSAxNDAwKSAmJiAhZGVmaW5lZCAoX1NUTFBfVVNJTkdfUExBVEZPUk1fU0RLX0NPTVBJTEVSKSAmJiAhZGVmaW5lZCAoVU5ERVJfQ0UpICYmIFwKKyAgICAhZGVmaW5lZCAoX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFKQorIyAgZGVmaW5lIF9TVExQX1VTRV9TQUZFX1NUUklOR19GVU5DVElPTlMgMQorI2VuZGlmCisKKyNpZiAoX1NUTFBfTVNWQ19MSUIgPD0gMTMxMCkKKyMgIGRlZmluZSBfU1RMUF9WRU5ET1JfR0xPQkFMX0NTVEQKKyNlbmRpZgorCisjaWYgKF9TVExQX01TVkNfTElCID49IDEzMDApICYmICFkZWZpbmVkKFVOREVSX0NFKQorLyogU3RhcnRpbmcgd2l0aCBNU1ZDIDcuMCBhbmQgY29tcGlsZXJzIHNpbXVsYXRpbmcgaXQsCisgKiB3ZSBhc3N1bWUgdGhhdCB0aGUgbmV3IFNESyBpcyBncmFudGVkOgorICovCisjICBkZWZpbmUgX1NUTFBfTkVXX1BMQVRGT1JNX1NESyAxCisjZW5kaWYKKworI2lmIChfU1RMUF9NU1ZDX0xJQiA8IDEzMDApIC8qIGluY2x1ZGluZyBNU1ZDIDYuMCAqLworIyAgZGVmaW5lIF9TVExQX0dMT0JBTF9ORVdfSEFORExFUiAxCisjICBkZWZpbmUgX1NUTFBfVkVORE9SX1VORVhQRUNURURfU1RECisjICBkZWZpbmUgX1NUTFBfTkVXX0RPTlRfVEhST1dfQkFEX0FMTE9DIDEKKyNlbmRpZgorCisjZGVmaW5lIF9TVExQX0VYUE9SVF9ERUNMU1BFQyBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyNkZWZpbmUgX1NUTFBfSU1QT1JUX0RFQ0xTUEVDIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorI2RlZmluZSBfU1RMUF9DTEFTU19FWFBPUlRfREVDTFNQRUMgX19kZWNsc3BlYyhkbGxleHBvcnQpCisjZGVmaW5lIF9TVExQX0NMQVNTX0lNUE9SVF9ERUNMU1BFQyBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKworI2lmIGRlZmluZWQgKF9fRExMKSB8fCBkZWZpbmVkIChfRExMKSB8fCBkZWZpbmVkIChfUlRMRExMKSB8fCBkZWZpbmVkIChfQUZYRExMKQorIyAgZGVmaW5lIF9TVExQX1JVTlRJTUVfRExMCisjZW5kaWYKKyNpZiBkZWZpbmVkIChfX0JVSUxESU5HX1NUTFBPUlQpICYmIFwKKyAgIChkZWZpbmVkIChfU1RMUF9VU0VfRFlOQU1JQ19MSUIpIHx8IFwKKyAgICBkZWZpbmVkIChfU1RMUF9SVU5USU1FX0RMTCkgJiYgIWRlZmluZWQgKF9TVExQX1VTRV9TVEFUSUNfTElCKSkKKyMgIGRlZmluZSBfU1RMUF9ETEwKKyNlbmRpZgorI2luY2x1ZGUgPHN0bC9jb25maWcvX2RldGVjdF9kbGxfb3JfbGliLmg+CisjdW5kZWYgX1NUTFBfUlVOVElNRV9ETEwKKyN1bmRlZiBfU1RMUF9ETEwKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9EWU5BTUlDX0xJQikKKyMgIHVuZGVmICBfU1RMUF9VU0VfREVDTFNQRUMKKyMgIGRlZmluZSBfU1RMUF9VU0VfREVDTFNQRUMgMQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfTVNWQykgJiYgKF9TVExQX01TVkMgPCAxMzAwKQorIyAgICBkZWZpbmUgX1NUTFBfVVNFX01TVkM2X01FTV9UX0JVR19XT1JLQVJPVU5EIDEKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmICFkZWZpbmVkIChfU1RMUF9JTVBPUlRfVEVNUExBVEVfS0VZV09SRCkKKyMgIGlmICFkZWZpbmVkIChfTVNDX0VYVEVOU0lPTlMpIHx8IGRlZmluZWQgKF9TVExQX01TVkMpICYmIChfU1RMUF9NU1ZDID49IDEzMDApCisjICAgIGRlZmluZSBfU1RMUF9JTVBPUlRfVEVNUExBVEVfS0VZV09SRAorIyAgZWxzZQorIyAgICBkZWZpbmUgX1NUTFBfSU1QT1JUX1RFTVBMQVRFX0tFWVdPUkQgZXh0ZXJuCisjICBlbmRpZgorI2VuZGlmCisjZGVmaW5lIF9TVExQX0VYUE9SVF9URU1QTEFURV9LRVlXT1JECisKKyNpbmNsdWRlIDxzdGwvY29uZmlnL19hdXRvX2xpbmsuaD4KKworI2lmIGRlZmluZWQgKF9TVExQX1VTSU5HX1BMQVRGT1JNX1NES19DT01QSUxFUikKKy8qIFRoZSBXaW5kb3dzIDY0IGJpdHMgU0RLIHJlcXVpcmVkIGZvciB0aGUgbW9tZW50IGxpbmsgdG8gYnVmZmVyb3ZlcmZsb3dVLmxpYiBmb3IKKyAqIGFkZGl0aW9uYWwgYnVmZmVyIG92ZXJydW4gY2hlY2tzLiBSYXRoZXIgdGhhbiByZXF1aXJlIHRoZSBTVExwb3J0IGJ1aWxkIHN5c3RlbSBhbmQKKyAqIHVzZXJzIHRvIGV4cGxpY2l0ZWx5IGxpbmsgd2l0aCBpdCB3ZSB1c2UgdGhlIE1TVkMgYXV0byBsaW5rIGZlYXR1cmUuCisgKi8KKyMgIGlmICFkZWZpbmVkIChfU1RMUF9ET05UX1VTRV9BVVRPX0xJTkspIHx8IGRlZmluZWQgKF9fQlVJTERJTkdfU1RMUE9SVCkKKyMgICAgcHJhZ21hIGNvbW1lbnQgKGxpYiwgImJ1ZmZlcm92ZXJmbG93VS5saWIiKQorIyAgICBpZiBkZWZpbmVkIChfU1RMUF9WRVJCT1NFKQorIyAgICAgIHByYWdtYSBtZXNzYWdlICgiU1RMcG9ydDogQXV0byBsaW5raW5nIHRvIGJ1ZmZlcm92ZXJmbG93VS5saWIiKQorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfTVNWQykKKyMgIGluY2x1ZGUgPHN0bC9jb25maWcvX2ZlZWRiYWNrLmg+CisjZW5kaWYKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL2NvbmZpZy9fbXdlcmtzLmggYi9zdGxwb3J0L3N0bC9jb25maWcvX213ZXJrcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MWYzYjEKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9jb25maWcvX213ZXJrcy5oCkBAIC0wLDAgKzEsMTU5IEBACisvLyBTVExwb3J0IGNvbmZpZ3VyYXRpb24gZmlsZQorLy8gSXQgaXMgaW50ZXJuYWwgU1RMcG9ydCBoZWFkZXIgLSBETyBOT1QgaW5jbHVkZSBpdCBkaXJlY3RseQorCisjZGVmaW5lIF9TVExQX0NPTVBJTEVSICJNZXRyb3dlcmsgQ29kZXdhcnJpb3IiCisKKy8vIEJyaW5nIGluIGRlZmluaXRpb24gb2YgX19NU0xfXyBhbmQgcmVsYXRlZCBpdGVtcworI2luY2x1ZGUgPG1zbEdsb2JhbHMuaD4KKyNpbmNsdWRlIDxhbnNpX3Bhcm1zLmg+CisKKy8vCisvLyAgQ29tcGlsZXIgZmVhdHVyZXMKKy8vCisKKworLy8gKioqIENvZGVXYXJyaW9yIENvbXBpbGVyIENvbW1vbiBGZWF0dXJlcyAqKioKKyMgIGlmIF9fb3B0aW9uKGxvbmdsb25nKQorIyAgIGRlZmluZSBfU1RMUF9MT05HX0xPTkcgIGxvbmcgbG9uZworIyAgZW5kaWYKKworIyAgZGVmaW5lIF9TVExQX1VTRV9VTklYX0VNVUxBVElPTl9JTyAgMQorCisjICBkZWZpbmUgX1NUTFBfVVNFX0FVVE9fUFRSX0NPTlZFUlNJT05TICAxCisKKyMgaWZkZWYgX19JTlRFTF9fCisjICBkZWZpbmUgX1NUTFBfTElUVExFX0VORElBTgorIyBlbHNlCisjICBkZWZpbmUgX1NUTFBfQklHX0VORElBTgorIyBlbmRpZgorCisjaWYgZGVmaW5lZChfTVNMX05PX0xPQ0FMRSkKKyNkZWZpbmUgX1NUTFBfTk9fSU1QT1JUX0xPQ0FMRQorI2VuZGlmCisjaWYgIV9fb3B0aW9uKCB3Y2hhcl90eXBlICkKKyMgZGVmaW5lIF9TVExQX1dDSEFSX1RfSVNfVVNIT1JUCisjZW5kaWYKKworIyAgaWYgX19NV0VSS1NfXyA8IDB4MzAwMAorLy8gKioqIENvZGVXYXJyaW9yIENvbXBpbGVyIENvbW1vbiBCdWdzICoqKgorIyAgIGRlZmluZSBfX01TTF9GSVhfSVRFUkFUT1JTX18obXlUeXBlKSAgICAvLyBTb21lIE1TTCBoZWFkZXJzIHJlbHkgb24gdGhpcworIyAgIGRlZmluZSBfU1RMUF9USFJPV19SRVRVUk5fQlVHICAxCisjICBlbmRpZgorCisvLyAgKioqIFZlcnNpb24tc3BlY2lmaWMgc2V0dGluZ3MgKioqCisKKyMgIGlmIF9fTVdFUktTX18gPj0gMHgyNDA1CisjICAgZGVmaW5lIF9TVExQX0hBU19OQVRJVkVfRkxPQVRfQUJTCisjICBlbmRpZgorCisjICBpZiBfX01XRVJLU19fIDwgMHgyNDA1CisjICAgZGVmaW5lIF9TVExQX1NUQVRJQ19DT05TVF9JTklUX0JVRworIyAgZW5kaWYKKworIyAgaWYgX19NV0VSS1NfXyA8PSAweDIzMDMKKyMgICBkZWZpbmUgX1NUTFBfTk9fVEVNUExBVEVfQ09OVkVSU0lPTlMgIDEKKyMgICBkZWZpbmUgX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFX0tFWVdPUkQgIDEKKyMgIGVuZGlmCisKKyMgIGlmIF9fTVdFUktTX18gPCAweDIzMDEKKyMgICBkZWZpbmUgX1NUTFBfTUVNQkVSX1NQRUNJQUxJWkFUSU9OX0JVRyAgMQorIyAgZW5kaWYKKworIyAgaWYgX19NV0VSS1NfXyA8IDB4MjMwMCAgICAvLyBDVyBQcm81IGZlYXR1cmVzCisjICAgZGVmaW5lIF9TVExQX0lOTElORV9NRU1CRVJfVEVNUExBVEVTIDEKKyMgICBkZWZpbmUgX1NUTFBfUkVMT1BTX0lOX1NURF9CVUcgICAxCisjICAgZGVmaW5lIF9TVExQX0RFRl9DT05TVF9QTENUX05FV19CVUcgMQorIyAgIGRlZmluZSBfU1RMUF9ERUZfQ09OU1RfREVGX1BBUkFNX0JVRyAxCisjICAgZGVmaW5lIF9TVExQX05PX1RZUEVOQU1FX09OX1JFVFVSTl9UWVBFCisjICBlbmRpZgorCisjICBpZiBfX01XRVJLU19fIDwgMHgyMjAwICAgIC8vIENXIFBybzQgZmVhdHVyZXMKKyMgICBkZWZpbmUgX1NUTFBfQlJPS0VOX1VTSU5HX0RJUkVDVElWRSAgMQorIyAgIGRlZmluZSBfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVTIDEKKyMgICBkZWZpbmUgX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFX0NMQVNTRVMgMQorIyAgIGRlZmluZSBfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVfS0VZV09SRCAxCisjICAgZGVmaW5lIF9TVExQX05PX1FVQUxJRklFRF9GUklFTkRTIDEKKyMgICBkZWZpbmUgX1NUTFBfTk9fRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSIDEKKyMgIGVuZGlmCisKKyMgIGlmIF9fTVdFUktTX18gPCAweDIxMDAgICAgICAvLyBDVyBQcm8zIGZlYXR1cmVzCisjICAgZGVmaW5lIF9TVExQX05PX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04gMQorIyAgIGRlZmluZSBfU1RMUF9IQVNfTk9fTkFNRVNQQUNFUyAxCisjICAgZGVmaW5lIF9TVExQX05PX0VYUExJQ0lUX0ZVTkNUSU9OX1RNUExfQVJHUyAxCisKKyMgICBkZWZpbmUgX1NUTFBfTkVFRF9UWVBFTkFNRSAgICAgICAgMQorIyAgIGRlZmluZSBfU1RMUF9OT19BUlJPV19PUEVSQVRPUiAxCisjICAgZGVmaW5lIF9TVExQX1RFTVBMQVRFX1BBUkFNX1NVQlRZUEVfQlVHICAxCisjICAgZGVmaW5lIF9TVExQX0ZPUkNFRF9JTkxJTkVfSU5TVEFOVElBVElPTl9CVUcgIDEKKyMgICBkZWZpbmUgX1NUTFBfTVVMVElfQ09OU1RfVEVNUExBVEVfQVJHX0JVRyAgMQorIyAgIGRlZmluZSBfU1RMUF9JTkxJTkVfTkFNRV9SRVNPTFVUSU9OX0JVRyAgMQorLy8gKioqIE1ldHJvd2Vya3MgU3RhbmRhcmQgTGlicmFyeSBCdWcgKioqCisjICAgZGVmaW5lIF9TVExQX01TVkM1MF9DT01QQVRJQklMSVRZIDEKKyMgIGVuZGlmCisKKyMgIGlmIF9fTVdFUktTX18gPCAweDIwMDAgICAgICAvLyB2LiAyLjAgZmVhdHVyZXMKKyMgICBkZWZpbmUgX1NUTFBfTk9fV0NIQVJfVCAxCisjICAgZGVmaW5lIF9TVExQX05PX0RFRkFVTFRfTk9OX1RZUEVfUEFSQU0gMQorIyAgIGRlZmluZSBfU1RMUF9OT05fVFlQRV9UTVBMX1BBUkFNX0JVRyAgMSAgLy8gZHdhIDgvMjEvOTcgLSB0aGlzIGJ1ZyBmaXhlZCBmb3IgQ1dQcm8yCisjICBlbmRpZgorCisjICBpZiBfX01XRVJLU19fIDwgMHgxOTAwICAgICAgICAgICAgICAgICAvLyBkd2EgOC8xOS85NyAtIDEuOSBDb21waWxlciBmZWF0dXJlIGRlZmluZXMKKyMgICBkZWZpbmUgX1NUTFBfTElNSVRFRF9ERUZBVUxUX1RFTVBMQVRFUyAxCisjICAgZGVmaW5lIF9TVExQX0JBU0VfVFlQRURFRl9CVUcgICAgICAgIDEKKyMgICBkZWZpbmUgX1NUTFBfQkFTRV9NQVRDSF9CVUcgICAxCisjICAgZGVmaW5lIF9TVExQX05PTlRFTVBMX0JBU0VfTUFUQ0hfQlVHIDEKKyMgICBkZWZpbmUgX1NUTFBfREVGQVVMVF9UWVBFX1BBUkFNICAxICAgICAgLy8gTW9yZSBsaW1pdGVkIHRlbXBsYXRlIHBhcmFtZXRlcnMKKworIyAgIGlmIF9fTVdFUktTX18gPCAweDE4MDAKKyAgICBfX0dJVkVfVVBfV0lUSF9TVEwoQ1dfMTgpCisjICAgZW5kaWYKKworIyAgZW5kaWYKKworCisvLyBmaXhlcyB0byBuYXRpdmUgaW5jbHVzaW9uIHdyYXBwZXJzLgorIyBpZiBfX01XRVJLU19fID49IDB4MjMwMCAgLy8gQ1dQcm81IGNoYW5nZXMgcGF0aHMgLSBkd2EgMi8yOC85OQorIyAgZGVmaW5lIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEggIC4uL2luY2x1ZGUKKyMgIGRlZmluZSBfU1RMUF9OQVRJVkVfQ19JTkNMVURFX1BBVEggIC4uL2luY2x1ZGUKKyMgIGRlZmluZSBfU1RMUF9OQVRJVkVfSEVBREVSKGhlYWRlcikgICAgIDwuLi9pbmNsdWRlLyMjaGVhZGVyPgorIyAgZGVmaW5lIF9TVExQX05BVElWRV9DUFBfQ19IRUFERVIoaGVhZGVyKSAgICAgPC4uL2luY2x1ZGUvIyNoZWFkZXI+CisjICBkZWZpbmUgX1NUTFBfTkFUSVZFX0NfSEVBREVSKGhlYWRlcikgICAgIDwuLi9pbmNsdWRlLyMjaGVhZGVyPgorIyAgZGVmaW5lIF9TVExQX05BVElWRV9DUFBfUlVOVElNRV9IRUFERVIoaGVhZGVyKSA8Li4vaW5jbHVkZS8jI2hlYWRlcj4KKyMgZWxzZQorCisjICBkZWZpbmUgX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSCAgTWFjaW50b3NoIEhEOkNvZGV3YXJyaW9yIFBybyA0Ok1ldHJvd2Vya3MgQ29kZVdhcnJpb3I6TWV0cm93ZXJrcyBTdGFuZGFyZCBMaWJyYXJ5Ok1TTCBDKys6SW5jbHVkZQorIyAgZGVmaW5lIF9TVExQX05BVElWRV9DX0lOQ0xVREVfUEFUSCAgTWFjaW50b3NoIEhEOkNvZGV3YXJyaW9yIFBybyA0Ok1ldHJvd2Vya3MgQ29kZVdhcnJpb3I6TWV0cm93ZXJrcyBTdGFuZGFyZCBMaWJyYXJ5Ok1TTCBDOk1TTCBDb21tb246UHVibGljIEluY2x1ZGVzCisjICBkZWZpbmUgX1NUTFBfTkFUSVZFX0hFQURFUihoZWFkZXIpICAgICA8TWFjaW50b3NoIEhEOkNvZGV3YXJyaW9yIFBybyA0Ok1ldHJvd2Vya3MgQ29kZVdhcnJpb3I6TWV0cm93ZXJrcyBTdGFuZGFyZCBMaWJyYXJ5Ok1TTCBDKys6SW5jbHVkZTojI2hlYWRlcj4KKyMgIGRlZmluZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSEVBREVSKGhlYWRlcikgICAgIDxNYWNpbnRvc2ggSEQ6Q29kZXdhcnJpb3IgUHJvIDQ6TWV0cm93ZXJrcyBDb2RlV2FycmlvcjpNZXRyb3dlcmtzIFN0YW5kYXJkIExpYnJhcnk6TVNMIEMrKzpJbmNsdWRlOiMjaGVhZGVyPgorIyAgZGVmaW5lIF9TVExQX05BVElWRV9DX0hFQURFUihoZWFkZXIpICAgICA8TWFjaW50b3NoIEhEOkNvZGV3YXJyaW9yIFBybyA0Ok1ldHJvd2Vya3MgQ29kZVdhcnJpb3I6TWV0cm93ZXJrcyBTdGFuZGFyZCBMaWJyYXJ5Ok1TTCBDOk1TTCBDb21tb246UHVibGljIEluY2x1ZGVzOiMjaGVhZGVyPgorIyAgZGVmaW5lIF9TVExQX05BVElWRV9DUFBfUlVOVElNRV9IRUFERVIoaGVhZGVyKSA8TWFjaW50b3NoIEhEOkNvZGV3YXJyaW9yIFBybyA0Ok1ldHJvd2Vya3MgQ29kZVdhcnJpb3I6TWV0cm93ZXJrcyBTdGFuZGFyZCBMaWJyYXJ5Ok1TTCBDOk1TTCBDb21tb246UHVibGljIEluY2x1ZGVzOiMjaGVhZGVyPgorCisjIGVuZGlmCisKKy8vRm9sbG93aW5nIGJsb2NrIGNvbWUgZnJvbSBib29zdCBpbnRyaW5zaWNzLmhwcCBmaWxlOgorI2lmIGRlZmluZWQgKF9fTVNMX0NQUF9fKSAmJiAoX19NU0xfQ1BQX18gPj0gMHg4MDAwKQorICAgIC8vIE1ldHJvd2Vya3MgY29tcGlsZXIgaXMgYWNxdWlyaW5nIGludHJpbnNpYyB0eXBlIHRyYWl0cyBzdXBwb3J0CisgICAgLy8gcG9zdCB2ZXJzaW9uIDguICBXZSBob29rIGludG8gdGhlIHB1Ymxpc2hlZCBpbnRlcmZhY2UgdG8gcGljayB1cAorICAgIC8vIHVzZXIgZGVmaW5lZCBzcGVjaWFsaXphdGlvbnMgYXMgd2VsbCBhcyBjb21waWxlciBpbnRyaW5zaWNzIGFzCisgICAgLy8gYW5kIHdoZW4gdGhleSBiZWNvbWUgYXZhaWxhYmxlOgorIyAgIGluY2x1ZGUgPG1zbF91dGlsaXR5PgorIyAgIGRlZmluZSBfU1RMUF9IQVNfVFJJVklBTF9DT05TVFJVQ1RPUihUKSBNZXRyb3dlcmtzOjpoYXNfdHJpdmlhbF9kZWZhdWx0X2N0b3I8VD46OnZhbHVlCisjICAgZGVmaW5lIF9TVExQX0hBU19UUklWSUFMX0NPUFkoVCkgTWV0cm93ZXJrczo6aGFzX3RyaXZpYWxfY29weV9jdG9yPFQ+Ojp2YWx1ZQorIyAgIGRlZmluZSBfU1RMUF9IQVNfVFJJVklBTF9BU1NJR04oVCkgTWV0cm93ZXJrczo6aGFzX3RyaXZpYWxfYXNzaWdubWVudDxUPjo6dmFsdWUKKyMgICBkZWZpbmUgX1NUTFBfSEFTX1RSSVZJQUxfREVTVFJVQ1RPUihUKSBNZXRyb3dlcmtzOjpoYXNfdHJpdmlhbF9kdG9yPFQ+Ojp2YWx1ZQorIyAgIGRlZmluZSBfU1RMUF9JU19QT0QoVCkgTWV0cm93ZXJrczo6aXNfUE9EPFQ+Ojp2YWx1ZQorIyAgIGRlZmluZSBfU1RMUF9IQVNfVFlQRV9UUkFJVFNfSU5UUklOU0lDUworI2VuZGlmCisKKy8vIGZicAorIyBpZiAhZGVmaW5lZCggX19NU0xfQ1BQX18gKSB8fCBfX01TTF9DUFBfXyA8PSAweDQxMDUKKyMgICBkZWZpbmUgX1NUTFBfTk9fTkFUSVZFX1dJREVfU1RSRUFNUyAxCisjICBlbmRpZgorCisjIGlmIGRlZmluZWQoX19NQUNIX18pCisjICBkZWZpbmUgX1NUTFBfTUFDCisjICBkZWZpbmUgT19CSU5BUlkgMAorIyBlbGlmIGRlZmluZWQobWFjaW50b3NoKQorIyAgZGVmaW5lIF9OT1RIUkVBRFMKKyMgZW5kaWYKKyMgZGVmaW5lIF9TVExQX0RMTEVYUE9SVF9ORUVEU19QUkVERUNMQVJBVElPTiAxCmRpZmYgLS1naXQgYS9zdGwvY29uZmlnL19uYXRpdmVfaGVhZGVycy5oIGIvc3RscG9ydC9zdGwvY29uZmlnL19uYXRpdmVfaGVhZGVycy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzdGwvY29uZmlnL19uYXRpdmVfaGVhZGVycy5oCnJlbmFtZSB0byBzdGxwb3J0L3N0bC9jb25maWcvX25hdGl2ZV9oZWFkZXJzLmgKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL2NvbmZpZy9fb3BlbmJzZC5oIGIvc3RscG9ydC9zdGwvY29uZmlnL19vcGVuYnNkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZhMTlkMQotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc3RsL2NvbmZpZy9fb3BlbmJzZC5oCkBAIC0wLDAgKzEsMTIgQEAKKyNkZWZpbmUgX1NUTFBfUExBVEZPUk0gIk9wZW4gQlNEIgorCisjZGVmaW5lIF9TVExQX1VTRV9VTklYX0lPCisKKyNpZiBkZWZpbmVkIChfUE9TSVhfVEhSRUFEUykgJiYgIWRlZmluZWQgKF9TVExQX1RIUkVBRFMpCisjICBkZWZpbmUgX1NUTFBfVEhSRUFEUworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfUE9TSVhfVEhSRUFEUykgJiYgIWRlZmluZWQgKF9TVExQX0RPTlRfVVNFX1BUSFJFQURfU1BJTkxPQ0spCisjICBkZWZpbmUgX1NUTFBfVVNFX1BUSFJFQURfU1BJTkxPQ0sKKyMgIGRlZmluZSBfU1RMUF9TVEFUSUNfTVVURVggX1NUTFBfbXV0ZXgKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdGwvY29uZmlnL19wcm9sb2cuaCBiL3N0bHBvcnQvc3RsL2NvbmZpZy9fcHJvbG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE2YTc5NAotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc3RsL2NvbmZpZy9fcHJvbG9nLmgKQEAgLTAsMCArMSw0MyBAQAorCisjaWYgZGVmaW5lZCAoX1NUTFBfTVNWQykgfHwgZGVmaW5lZCAoX19JQ0wpCisKKyMgIHByYWdtYSB3YXJuaW5nIChwdXNoKQorIyAgaW5jbHVkZSA8c3RsL2NvbmZpZy9fd2FybmluZ3Nfb2ZmLmg+CisvKiBXZSBhcmUgZm9yY2luZyB0aGUgYWxpZ25tZW50IHRvIGd1YXJhbnR5IHRoYXQgbGlicmFyaWVzIGFyZSB1c2UKKyAqIHdpdGggdGhlIHNhbWUgYWxpZ25tZW50IGFzIHRoZSBvbmUgdXNlIHRvIGJ1aWxkIHRoZW0uCisgKi8KKyMgIGlmICFkZWZpbmVkIChfV0lONjQpCisjICAgIHByYWdtYSBwYWNrKHB1c2gsIDgpCisjICBlbHNlCisjICAgIHByYWdtYSBwYWNrKHB1c2gsIDE2KQorIyAgZW5kaWYKKworI2VsaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKQorCisjICBwcmFnbWEgb3B0aW9uIHB1c2gKKyMgIHByYWdtYSBvcHRpb24gLVZ4LSAtVmUtIC1hOCAtYiAtcGMKKyMgIGluY2x1ZGUgPHN0bC9jb25maWcvX3dhcm5pbmdzX29mZi5oPgorCisjZWxpZiBkZWZpbmVkIChfX3NnaSkgJiYgIWRlZmluZWQgKF9fR05VQ19fKSAmJiAoX01JUFNfU0lNICE9IF9NSVBTX1NJTV9BQkkzMikKKworIyAgcHJhZ21hIHNldCB3b2ZmIDEyMDkKKyMgIHByYWdtYSBzZXQgd29mZiAxMTc0CisjICBwcmFnbWEgc2V0IHdvZmYgMTM3NQorLyogZnJvbSBpdGVyYXRvcl9iYXNlLmggKi8KKyMgIHByYWdtYSBzZXQgd29mZiAxMTgzCisKKyNlbGlmIGRlZmluZWQgKF9fREVDQ1hYKQorCisjICBpZmRlZiBfX1BSQUdNQV9FTlZJUk9OTUVOVAorIyAgICBwcmFnbWEgX19lbnZpcm9ubWVudCBfX3NhdmUKKyMgICAgcHJhZ21hIF9fZW52aXJvbm1lbnQgX19oZWFkZXJfZGVmYXVsdHMKKyMgIGVuZGlmCisKKyNlbGlmIGRlZmluZWQgKF9fSUJNQ1BQX18pCisvKiBzdXByZXNzIEVEQzMxMzA6IEEgY29uc3RhbnQgaXMgYmVpbmcgdXNlZCBhcyBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gKi8KKyMgIHByYWdtYSBpbmZvKG5vY25kKQorI2VsaWYgZGVmaW5lZCAoX19XQVRDT01DUExVU1BMVVNfXykKKyMgIHByYWdtYSB3YXJuaW5nIDYwNCAxMCAvKiBtdXN0IGxvb2thaGVhZCB0byBkZXRlcm1pbmUuLi4gKi8KKyMgIHByYWdtYSB3YXJuaW5nIDU5NCAxMCAvKiByZXNvbHZlZCBhcyBkZWNsYXJhdGlvbi90eXBlICovCisjICBwcmFnbWEgd2FybmluZyA1OTUgMTAgLyogcmVzb2x2ZWQgYXMgYW4gZXhwcmVzc2lvbiAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9jb25maWcvX3NnaS5oIGIvc3RscG9ydC9zdGwvY29uZmlnL19zZ2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTAwZjNkCi0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvY29uZmlnL19zZ2kuaApAQCAtMCwwICsxLDk0IEBACisvLyBTVExwb3J0IGNvbmZpZ3VyYXRpb24gZmlsZQorLy8gSXQgaXMgaW50ZXJuYWwgU1RMcG9ydCBoZWFkZXIgLSBETyBOT1QgaW5jbHVkZSBpdCBkaXJlY3RseQorCisjZGVmaW5lIF9TVExQX0NPTVBJTEVSICJDQyIKKworI2RlZmluZSBfU1RMUF9IQVNfU1BFQ0lGSUNfUFJPTE9HX0VQSUxPRworCisvLyBkZWZpbmUgbmF0aXZlIGluY2x1ZGUgcGF0aCBiZWZvcmUgdHJ5aW5nIHRvIGluY2x1ZGUgYW55dGhpbmcKKworI2RlZmluZSBfU1RMUF9OQVRJVkVfSEVBREVSKF9feCkgPC91c3IvaW5jbHVkZS9DQy8jI19feD4KKyNkZWZpbmUgX1NUTFBfTkFUSVZFX0NfSEVBREVSKF9feCkgPC91c3IvaW5jbHVkZS8jI19feD4KKyNkZWZpbmUgX1NUTFBfTkFUSVZFX09MRF9TVFJFQU1TX0hFQURFUihfX3gpIDwvdXNyL2luY2x1ZGUvQ0MvIyNfX3g+CisjZGVmaW5lIF9TVExQX05BVElWRV9DUFBfQ19IRUFERVIoX194KSA8L3Vzci9pbmNsdWRlL0NDLyMjX194PgorI2RlZmluZSBfU1RMUF9OQVRJVkVfQ1BQX1JVTlRJTUVfSEVBREVSKF9feCkgPC91c3IvaW5jbHVkZS9DQy8jI19feD4KKworI2RlZmluZSBfU1RMUF9OT19OQVRJVkVfTUJTVEFURV9UCisKKyNkZWZpbmUgX1NUTFBfTk9fVVNJTkdfRk9SX0dMT0JBTF9GVU5DVElPTlMKKyNkZWZpbmUgX1NUTFBfTk9fTkFUSVZFX1dJREVfRlVOQ1RJT05TCisjZGVmaW5lIF9TVExQX05PX01FTUJFUl9URU1QTEFURV9DTEFTU0VTCisKKy8vICNkZWZpbmUgX1NUTFBfTk9fQkFEX0FMTE9DCisKKyNkZWZpbmUgX1NUTF9IQVNfTkFNRVNQQUNFUworCisjaWYgISBkZWZpbmVkIChfX0VYQ0VQVElPTlMpICYmICEgZGVmaW5lZCAoX1NUTFBfTk9fRVhDRVBUSU9OUykKKyMgIGRlZmluZSBfU1RMUF9OT19FWENFUFRJT05TCisjZW5kaWYKKworI2RlZmluZSBfX0VER19TV0lUQ0hFUworCisjZGVmaW5lIF9TVExQX1VTRV9TR0lfU1RSSU5HICAgICAgICAgMQorCisjZGVmaW5lIF9TVExQX0hBU19OT19ORVdfQ19IRUFERVJTIDEKKy8vICMgIGRlZmluZSBfU1RMUF9WRU5ET1JfR0xPQkFMX0VYQ0VQVF9TVEQKKworI2RlZmluZSBfU1RMUF9OT19QT1NUX0NPTVBBVElCTEVfU0VDVElPTgorCisjaW5jbHVkZSA8c3RhbmRhcmRzLmg+CisKKyNpZiAhKF9DT01QSUxFUl9WRVJTSU9OID49IDczMCkKKyMgIGRlZmluZSBfU1RMUF9OT19ORVdfTkVXX0hFQURFUiAxCisjZW5kaWYKKworI2lmIChfQ09NUElMRVJfVkVSU0lPTiA+PSA3MzAgJiYgZGVmaW5lZChfU1RBTkRBUkRfQ19QTFVTX1BMVVMpKQorIyAgZGVmaW5lIF9TVExQX0VYVEVSTl9SQU5HRV9FUlJPUlMKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX0JPT0wpCisjICBkZWZpbmUgX1NUTFBfTk9fQk9PTAorI2VuZGlmCisjaWYgZGVmaW5lZChfTUlQU19TSU0pICYmIF9NSVBTX1NJTSA9PSBfQUJJTzMyCisjICBkZWZpbmUgX1NUTFBfU1RBVElDX0NPTlNUX0lOSVRfQlVHCisjZW5kaWYKKworI2lmIChfQ09NUElMRVJfVkVSU0lPTiA8IDcyMCkgfHwgKGRlZmluZWQoX01JUFNfU0lNKSAmJiBfTUlQU19TSU0gPT0gX0FCSU8zMikKKyMgIGRlZmluZSBfU1RMUF9ERUZfQ09OU1RfUExDVF9ORVdfQlVHCisjICBkZWZpbmUgX1NUTFBfREVGX0NPTlNUX0RFRl9QQVJBTV9CVUcKKyNlbmRpZgorI2lmICEoKF9DT01QSUxFUl9WRVJTSU9OID49IDczMCkgJiYgZGVmaW5lZChfTUlQU19TSU0pICYmIF9NSVBTX1NJTSAhPSBfQUJJTzMyKQorIyAgZGVmaW5lIF9TVExQX05PX01FTUJFUl9URU1QTEFURV9LRVlXT1JECisjZW5kaWYKKyNpZiAhZGVmaW5lZChfU1RBTkRBUkRfQ19QTFVTX1BMVVMpCisjICBkZWZpbmUgX1NUTFBfTk9fRVhQTElDSVRfRlVOQ1RJT05fVE1QTF9BUkdTCisjZW5kaWYKKyNpZiAhKChfQ09NUElMRVJfVkVSU0lPTiA+PSA3MjEpICYmIGRlZmluZWQoX05BTUVTUEFDRVMpKQorIyAgZGVmaW5lIF9TVExQX0hBU19OT19OQU1FU1BBQ0VTCisjZW5kaWYKKyNpZiAoX0NPTVBJTEVSX1ZFUlNJT04gPCA3MjEpIHx8ICFkZWZpbmVkKF9TVExfSEFTX05BTUVTUEFDRVMpIHx8IGRlZmluZWQoX1NUTFBfTk9fTkFNRVNQQUNFUykKKyMgIGRlZmluZSBfU1RMUF9OT19FWENFUFRJT05fSEVBREVSCisjZW5kaWYKKyNpZiBfQ09NUElMRVJfVkVSU0lPTiA8IDczMCB8fCAhZGVmaW5lZChfU1RBTkRBUkRfQ19QTFVTX1BMVVMpIHx8ICFkZWZpbmVkKF9OQU1FU1BBQ0VTKQorIyAgZGVmaW5lIF9TVExQX05PX0JBRF9BTExPQworI2VuZGlmCisjaWYgZGVmaW5lZChfTE9OR0xPTkcpICYmIGRlZmluZWQoX1NHSUFQSSkgJiYgX1NHSUFQSQorIyAgZGVmaW5lIF9TVExQX0xPTkdfTE9ORyBsb25nIGxvbmcKKyNlbmRpZgorI2lmICEoX0NPTVBJTEVSX1ZFUlNJT04gPj0gNzMwICYmIGRlZmluZWQoX1NUQU5EQVJEX0NfUExVU19QTFVTKSkKKyMgIGRlZmluZSBfU1RMUF9VU0VfTk9fSU9TVFJFQU1TCisjZW5kaWYKKyNpZiAhKF9DT01QSUxFUl9WRVJTSU9OID49IDczMCAmJiBkZWZpbmVkKF9TVEFOREFSRF9DX1BMVVNfUExVUykpCisjICBkZWZpbmUgX1NUTFBfTk9fQVRfTUVNQkVSX0ZVTkNUSU9OCisjZW5kaWYKKy8vICMgICBpZiAhKF9DT01QSUxFUl9WRVJTSU9OID49IDczMCAmJiBkZWZpbmVkKF9TVEFOREFSRF9DX1BMVVNfUExVUykpCisjaWYgIShfQ09NUElMRVJfVkVSU0lPTiA+PSA3MjEgJiYgZGVmaW5lZChfU1RBTkRBUkRfQ19QTFVTX1BMVVMpKQorIyAgZGVmaW5lIF9TVExQX05PX1RFTVBMQVRFX0NPTlZFUlNJT05TCisjZW5kaWYKKyNpZiAhKChfQ09NUElMRVJfVkVSU0lPTiA+PSA3MzApICYmIGRlZmluZWQoX01JUFNfU0lNKSAmJiBfTUlQU19TSU0gIT0gX0FCSU8zMikKKyMgIGRlZmluZSBfU1RMUF9OT19GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKF9OT1RIUkVBRFMpICYmICFkZWZpbmVkIChfU1RMUF9USFJFQURTX0RFRklORUQpICYmICFkZWZpbmVkIChfX0dOVUNfXykKKyMgIGRlZmluZSBfU1RMUF9TR0lfVEhSRUFEUworI2VuZGlmCmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9jb25maWcvX3NvbGFyaXMuaCBiL3N0bHBvcnQvc3RsL2NvbmZpZy9fc29sYXJpcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NTZhMDYKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9jb25maWcvX3NvbGFyaXMuaApAQCAtMCwwICsxLDc3IEBACisjaWZuZGVmIF9fc3RsX2NvbmZpZ19fc29sYXJpc19oCisjZGVmaW5lIF9fc3RsX2NvbmZpZ19fc29sYXJpc19oCisKKyNkZWZpbmUgX1NUTFBfUExBVEZPUk0gIlN1biBTb2xhcmlzIgorCisvKiBpbmNsdWRlIHN5c3RlbSBmZWF0dXJlcyBmaWxlICovCisjaW5jbHVkZSA8c3lzL2ZlYXR1cmVfdGVzdHMuaD4KKworLyogc3lzdGVtLWRlcGVuZGVudCBkZWZpbmVzICovCisjZGVmaW5lIF9TVExQX1VTRV9VTklYX0lPCisKKyNpZmRlZiBfX0dOVUNfXworLyogCisgKiBTZWUgY29tbWVudHMgKGFuZCBjb25maWd1cmF0aW9uIGRlZmluZXMpIGluIHRoZSBob3N0LmgKKyAqLworIyAgaWYgIShkZWZpbmVkKF9fU3VuT1NfNV81XzEpIHx8IGRlZmluZWQoX19TdW5PU181XzYpIHx8IGRlZmluZWQoX19TdW5PU181XzcpIHx8IFwKKyAgICAgICAgZGVmaW5lZChfX1N1bk9TXzVfOCkgfHwgZGVmaW5lZChfX1N1bk9TXzVfOSkgfHwgZGVmaW5lZChfX1N1bk9TXzVfMTApKQorIyAgICBlcnJvciBVbmNvbW1lbnQgb25lIG9mIHRoZSBkZWZpbmVzIChfX1N1bk9TXzVfeCkgaW4gdGhlIGZpbGUgc3RscG9ydC9zdGwvY29uZmlnL2hvc3QuaAorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19TdW5PU181XzgpICYmICEgZGVmaW5lZCAoX1NUTFBfSEFTX05PX05FV19DX0hFQURFUlMpICYmICggX19jcGx1c3BsdXMgPj0gMTk5NzExTCkKKyMgIGRlZmluZSBfU1RMUF9IQVNfTkFUSVZFX0ZMT0FUX0FCUworI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9YT1BFTl9TT1VSQ0UpICYmIChfWE9QRU5fVkVSU0lPTiAtIDAgPj0gNCkKKyMgZGVmaW5lIF9TVExQX1JBTkQ0OCAxCisjZW5kaWYKKworI2lmIChkZWZpbmVkKF9YT1BFTl9TT1VSQ0UpICYmIChfWE9QRU5fVkVSU0lPTiAtIDAgPT0gNCkpIHx8IGRlZmluZWQgKF9fU3VuT1NfNV82KQorIyBkZWZpbmUgX1NUTFBfV0NIQVJfU1VOUFJPX0VYQ0xVREUgMQorIyBkZWZpbmUgX1NUTFBfTk9fTkFUSVZFX1dJREVfRlVOQ1RJT05TIDEKKyNlbmRpZgorCisvKiBib3JpcyA6IHRoaXMgc2hvdWxkIGFsd2F5cyBiZSBkZWZpbmVkIGZvciBTb2xhcmlzIDUgJiA2LiBBbnkgaWRlYXMgaG93IHRvIGRvIGl0PyAqLworI2lmICEoZGVmaW5lZCAoIF9fS0NDICkgJiYgX19LQ0NfVkVSU0lPTiA+IDM0MDAgKSAmJiBcCisgICgoZGVmaW5lZChfX1N1bk9TXzVfNV8xKSB8fCBkZWZpbmVkKF9fU3VuT1NfNV82KSApKQorIyAgaWZuZGVmIF9TVExQX05PX05BVElWRV9NQlNUQVRFX1QKKyMgICAgZGVmaW5lIF9TVExQX05PX05BVElWRV9NQlNUQVRFX1QgMQorIyAgZW5kaWYKKyNlbmRpZiAvKiBLQ0MgKi8KKworLyogRm9yIFNQQVJDIHdlIHVzZSBsaWdodHdlaWdodCBzeW5jaHJvbml6YXRpb24gKi8KKyNpZiBkZWZpbmVkIChfX3NwYXJjKSAvKiAmJiAoZGVmaW5lZCAoX1JFRU5UUkFOVCkgfHwgZGVmaW5lZCAoX1BUSFJFQURTKSkgKi8KKyMgIGlmICggKGRlZmluZWQgKF9fR05VQ19fKSAmJiBkZWZpbmVkIChfX3NwYXJjX3Y5X18pKSB8fCBcCisgICAgICAgIGRlZmluZWQgKF9fc3BhcmN2OSkgKSBcCisgICAgICAgJiYgIWRlZmluZWQoX05PVEhSRUFEUykgJiYgIWRlZmluZWQgKF9TVExQX05PX1NQQVJDX1NPTEFSSVNfVEhSRUFEUykKKyMgICAgZGVmaW5lIF9TVExQX1NQQVJDX1NPTEFSSVNfVEhSRUFEUworIyAgICBkZWZpbmUgX1NUTFBfVEhSRUFEU19ERUZJTkVECisjICBlbmRpZgorI2VuZGlmCisKKy8qIGdjYyBkb2VzIG5vdCBzdXBwb3J0IEVMRjY0IHlldCA7IGhvd2V2ZXI7IGl0IHN1cHBvcnRzIHVsdHJhc3BhcmMgKyB2OHBsdXMuCisgKiBsaW1pdHMuaCBjb250YWlucyBpbnZhbGlkIHZhbHVlcyBmb3IgdGhpcyBjb21iaW5hdGlvbgorICovCisjaWZkZWYgX19HTlVDX18KKyMgIGlmIChkZWZpbmVkICAoX19zcGFyY192OV9fKSB8fCBkZWZpbmVkIChfX3NwYXJjdjkpKSAmJiAhZGVmaW5lZCAoIF9fV09SRDY0ICkgJiYgIWRlZmluZWQoX19hcmNoNjRfXykKKyMgICAgZGVmaW5lIF9fTE9OR19NQVhfXyAyMTQ3NDgzNjQ3TAorIyAgZW5kaWYKKyNlbmRpZgorCisvKiAKKyAqIEF0dGVudGlvbiEgU2VlIGNvbW1lbnRzIChhbmQgY29uZmlndXJhdGlvbiBkZWZpbmVzKSBpbiB0aGUgaG9zdC5oCisgKiAoeW91IGhvc3QgbWF5IGhhcyBNQVRIX0YgYW5kIE1BVEhfTCBmdW5jdGlvbnMpCisgKgorICovCisjaWYgIWRlZmluZWQoX19TdW5PU181XzEwKSAmJiAhZGVmaW5lZChfU1RMUF9TT0xBUklTX01BVEhfUEFUQ0gpCisjICBkZWZpbmUgX1NUTFBfTk9fVkVORE9SX01BVEhfRgorIyAgZGVmaW5lIF9TVExQX05PX1ZFTkRPUl9NQVRIX0wKKyNlbmRpZgorCisjaWZkZWYgX19HTlVDX18KKyMgIGRlZmluZSBfU1RMUF9XQ0hBUl9CT1JMQU5EX0VYQ0xVREUKKyMgIGRlZmluZSBfU1RMUF9OT19OQVRJVkVfV0lERV9GVU5DVElPTlMgMQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX3N0bF9jb25maWdfX3NvbGFyaXNfaCAqLwpkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdGwvY29uZmlnL19zdW5wcm9jYy5oIGIvc3RscG9ydC9zdGwvY29uZmlnL19zdW5wcm9jYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZmU1Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9jb25maWcvX3N1bnByb2NjLmgKQEAgLTAsMCArMSwxNjYgQEAKKy8vIFNUTHBvcnQgY29uZmlndXJhdGlvbiBmaWxlCisvLyBJdCBpcyBpbnRlcm5hbCBTVExwb3J0IGhlYWRlciAtIERPIE5PVCBpbmNsdWRlIGl0IGRpcmVjdGx5CisKKyNkZWZpbmUgX1NUTFBfQ09NUElMRVIgIlN1bnBybyBDQyIKKworI2RlZmluZSBfU1RMUF9MT05HX0xPTkcgIGxvbmcgbG9uZworCisvLyBHQUI6IDExLzA5LzA1CisvLyBTdGFydGluZyB3aXRoIDUuMCB0aGUgU1RMcG9ydCBjb2RlIGV4cGVjdHMgdG8gYmUKKy8vIGluc3RhbnRpYXRlZCBkdXJpbmcgY29tcGlsZSB0aW1lLiBUaGlzIGlzIGR1ZSB0byB1bmRlZmluZworLy8gYSBudW1iZXIgb2YgZGVmaW5lcyB0aGF0IGFyZSBhbHNvIHVzZWQgaW4gdGhlIGMgdmVyc2lvbnMKKy8vIG9mIHRoZSBmaWxlLiBXaGVuIHRoZXkgYXJlIHVuZGVmZWQgdGhlIGMgdmVyc2lvbiBmYWlscyB0bworLy8gY29tcGlsZS4KKy8vICMgIGRlZmluZSBfU1RMUF9MSU5LX1RJTUVfSU5TVEFOVElBVElPTiAxCisKKyNpZiAhIGRlZmluZWQoX0JPT0wpCisjICBkZWZpbmUgX1NUTFBfTk9fQk9PTCAxCisjZW5kaWYKKworLy8gY29tcGF0aWJpbGl0eSBtb2RlIHN0dWZmCisjaWYgKF9fU1VOUFJPX0NDID49IDB4NTEwKSAmJiAoIWRlZmluZWQgKF9fU1VOUFJPX0NDX0NPTVBBVCkgfHwgKF9fU1VOUFJPX0NDX0NPTVBBVCA9PSA1ICkpCisjICBkZWZpbmUgX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSCAuLi9DQy9Dc3RkCisjICBkZWZpbmUgX1NUTFBfTkFUSVZFX0NQUF9SVU5USU1FX0lOQ0xVREVfUEFUSCAuLi9DQworI2VsaWYgKF9fU1VOUFJPX0NDID49IDB4NTAwKSAmJiAoIWRlZmluZWQgKF9fU1VOUFJPX0NDX0NPTVBBVCkgfHwgKF9fU1VOUFJPX0NDX0NPTVBBVCA9PSA1ICkpCisjICBkZWZpbmUgX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSCAuLi9DQworI2VsaWYgKGRlZmluZWQgKF9fU1VOUFJPX0NDX0NPTVBBVCkgJiYgX19TVU5QUk9fQ0NfQ09NUEFUID09IDQpCisjICBkZWZpbmUgX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSCAuLi9DQzQKKyNlbHNlCisjICBkZWZpbmUgX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSCAuLi9DQworI2VuZGlmCisKKyNkZWZpbmUgX1NUTFBfU1RBVElDX0NPTlNUX0lOSVRfQlVHIDEKKworI2lmIChfX1NVTlBST19DQyA8IDB4NTMwKQorLy8gdGhvc2UgYXJlIHRlc3RlZCBhbmQgcHJvdmVkIG5vdCB0byB3b3JrLi4uCisjICBkZWZpbmUgX1NUTFBfTk9fQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTiAxCisjICBkZWZpbmUgX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFX0NMQVNTRVMgMQorIyAgZGVmaW5lIF9TVExQX1VTRV9PTERfSFBfSVRFUkFUT1JfUVVFUklFUworI2VuZGlmCisKKyNpZmRlZiBfU1RMUF9VU0VfTk9fSU9TVFJFQU1TCisjICBkZWZpbmUgX1NUTFBfSEFTX05PX05FV19DX0hFQURFUlMgMQorI2VuZGlmCisKKy8vIHRob3NlIGRvIG5vdCBkZXBlbmQgb24gY29tcGF0aWJpbGl0eQorI2lmIChfX1NVTlBST19DQyA8IDB4NTEwKQorIyAgZGVmaW5lIF9TVExQX05PX1RZUEVOQU1FX09OX1JFVFVSTl9UWVBFIDEKKyMgIGRlZmluZSBfU1RMUF9OT05URU1QTF9CQVNFX01BVENIX0JVRyAxCisjZW5kaWYKKworI2lmIChfX1NVTlBST19DQyA8IDB4NTEwKSB8fCAoZGVmaW5lZCAoX19TVU5QUk9fQ0NfQ09NUEFUKSAmJiAoX19TVU5QUk9fQ0NfQ09NUEFUIDwgNSkpCisKKyMgIGRlZmluZSBfU1RMUF9OT19RVUFMSUZJRURfRlJJRU5EUyAxCisKKy8vIG5vIHBhcnRpYWwgLCBqdXN0IGZvciBleHBsaWNpdCBvbmUKKyMgIGRlZmluZSBfU1RMUF9QQVJUSUFMX1NQRUNfTkVFRFNfVEVNUExBVEVfQVJHUworIyAgZGVmaW5lIF9TVExQX05PTl9UWVBFX1RNUExfUEFSQU1fQlVHIDEKKworIyAgZGVmaW5lIF9TVExQX05PX01FTUJFUl9URU1QTEFURVMgMQorCisjICBkZWZpbmUgX1NUTFBfTk9fRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSIDEKKyMgIGRlZmluZSBfU1RMUF9OT19FWFBMSUNJVF9GVU5DVElPTl9UTVBMX0FSR1MKKyMgIGRlZmluZSBfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVfS0VZV09SRCAxCisjZW5kaWYKKworLy8gRmVhdHVyZXMgdGhhdCBkZXBlbmQgb24gY29tcGF0aWJpbGl0eSBzd2l0Y2gKKyNpZiAoIF9fU1VOUFJPX0NDIDwgMHg1MDAgKSB8fCAoZGVmaW5lZCAoX19TVU5QUk9fQ0NfQ09NUEFUKSAmJiAoX19TVU5QUk9fQ0NfQ09NUEFUIDwgNSkpCisKKyMgIGlmbmRlZiBfU1RMUF9VU0VfTk9fSU9TVFJFQU1TCisjICAgIGRlZmluZSBfU1RMUF9VU0VfTk9fSU9TVFJFQU1TIDEKKyMgIGVuZGlmCisjICBkZWZpbmUgX1NUTFBfTk9fTkVXX05FV19IRUFERVIgMQorLy8gIyAgZGVmaW5lIF9TVExQX05PX1JFTE9QU19OQU1FU1BBQ0UKKyMgIGRlZmluZSBfU1RMUF9IQVNfTk9fTkFNRVNQQUNFUyAxCisjICBkZWZpbmUgX1NUTFBfTkVFRF9NVVRBQkxFICAxCisjICBkZWZpbmUgX1NUTFBfTk9fQkFEX0FMTE9DIDEKKyMgIGRlZmluZSBfU1RMUF9OT19FWENFUFRJT05fSEVBREVSIDEKKyMgIGRlZmluZSBfU1RMUF9OQVRJVkVfQ19JTkNMVURFX1BBVEggLi4vaW5jbHVkZQorI2VsaWYgKF9fU1VOUFJPX0NDIDwgMHg1MTApCisvLyAjICBkZWZpbmUgX1NUTFBfTkFUSVZFX0NfSEVBREVSKGhlYWRlcikgPC4uL0NDLyMjaGVhZGVyIyMuU1VOV0NDaD4KKyMgIGRlZmluZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSEVBREVSKGhlYWRlcikgPC4uL0NDLyMjaGVhZGVyIyMuU1VOV0NDaD4KKyMgIGRlZmluZSBfU1RMUF9OQVRJVkVfQ19JTkNMVURFX1BBVEggL3Vzci9pbmNsdWRlCisjZWxpZiBkZWZpbmVkKCBfX1N1bk9TXzVfNV8xICkgfHwgZGVmaW5lZCggX19TdW5PU181XzYgKSB8fCBkZWZpbmVkKCBfX1N1bk9TXzVfNyApCisjICBkZWZpbmUgX1NUTFBfTkFUSVZFX0NfSU5DTFVERV9QQVRIIC4uL0NDL3N0ZAorIyAgZGVmaW5lIF9TVExQX05BVElWRV9DUFBfQ19JTkNMVURFX1BBVEggLi4vQ0Mvc3RkCisjZWxzZQorIyAgZGVmaW5lIF9TVExQX05BVElWRV9DX0lOQ0xVREVfUEFUSCAvdXNyL2luY2x1ZGUKKyMgIGRlZmluZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSU5DTFVERV9QQVRIIC4uL0NDL3N0ZAorI2VuZGlmCisKKyNpZiAoIF9fU1VOUFJPX0NDIDwgMHg1MDAgKQorCisjICB1bmRlZiBfU1RMUF9OQVRJVkVfQ19IRUFERVIKKyMgIHVuZGVmIF9TVExQX05BVElWRV9DUFBfQ19IRUFERVIKKworIyAgZGVmaW5lIHdpbnRfdCBfX3dpbnRfdAorLy8gZmFtb3VzIENDIDQuMiBidWcKKyMgIGRlZmluZSBfU1RMUF9JTkxJTkVfU1RSSU5HX0xJVEVSQUxfQlVHIDEKKy8vIC91c3IvaW5jbHVkZQorIyAgZGVmaW5lIF9TVExQX05BVElWRV9DX0lOQ0xVREVfUEFUSCAuLi9pbmNsdWRlCisKKy8vIDQuMiBjYW5ub3QgaGFuZGxlIGl0ZXJhdG9yX3RyYWl0czxfVHA+OjppdGVyYXRvcl9jYXRlZ29yeSBhcyBhIHJldHVybiB0eXBlIDsoCisjICBkZWZpbmUgX1NUTFBfVVNFX09MRF9IUF9JVEVSQVRPUl9RVUVSSUVTCisKKy8vIDQuMiBkb2VzIG5vdCBsaWtlIGl0CisjICB1bmRlZiAgX1NUTFBfUEFSVElBTF9TUEVDX05FRURTX1RFTVBMQVRFX0FSR1MKKworIyAgZGVmaW5lIF9TVExQX0xJTUlURURfREVGQVVMVF9URU1QTEFURVMgMQorCisjICBkZWZpbmUgX1NUTFBfTkVFRF9UWVBFTkFNRSAxCisjICBkZWZpbmUgX1NUTFBfTkVFRF9FWFBMSUNJVCAxCisjICBkZWZpbmUgX1NUTFBfTk9fQkFEX0FMTE9DIDEKKyMgIGRlZmluZSBfU1RMUF9OT19BUlJPV19PUEVSQVRPUiAxCisKKyMgIGRlZmluZSBfU1RMUF9ERUZfQ09OU1RfUExDVF9ORVdfQlVHIDEKKyMgIGRlZmluZSBfU1RMUF9ERUZfQ09OU1RfREVGX1BBUkFNX0JVRyAxCisjICBkZWZpbmUgX1NUTFBfR0xPQkFMX05FU1RFRF9SRVRVUk5fVFlQRV9QQVJBTV9CVUcgMQorIyAgdW5kZWYgIF9TVExQX0hBU19OT19ORVdfQ19IRUFERVJTCisjICBkZWZpbmUgX1NUTFBfSEFTX05PX05FV19DX0hFQURFUlMgMQorLy8gIyAgZGVmaW5lIF9TVExQX0RPTlRfU0lNVUxBVEVfUEFSVElBTF9TUEVDX0ZPUl9UWVBFX1RSQUlUUworCisjICBpZiAoIF9fU1VOUFJPX0NDIDwgMHg0MjAgKQorIyAgICBkZWZpbmUgX1NUTFBfTk9fUEFSVElBTF9TUEVDSUFMSVpBVElPTl9TWU5UQVggMQorIyAgICBkZWZpbmUgX1NUTFBfTk9fTkVXX1NUWUxFX0NBU1RTIDEKKyMgICAgZGVmaW5lIF9TVExQX05PX01FVEhPRF9TUEVDSUFMSVpBVElPTiAxCisjICAgIGlmICggX19TVU5QUk9fQ0MgPiAweDQwMSApCisjICAgICAgaWYgKF9fU1VOUFJPX0NDPT0weDQxMCkKKyMgICAgICAgIGRlZmluZSBfU1RMUF9CQVNFX1RZUEVERUZfT1VUU0lERV9CVUcgIDEKKyMgICAgICBlbmRpZgorIyAgICBlbHNlCisgICAvLyBTVU5Qcm8gQysrIDQuMC4xCisjICAgICAgZGVmaW5lIF9TVExQX0JBU0VfTUFUQ0hfQlVHICAgICAgICAgIDEKKyMgICAgICBkZWZpbmUgX1NUTFBfQkFTRV9UWVBFREVGX0JVRyAgICAgICAgMQorIyAgICAgIGlmICgoIF9fU1VOUFJPX0NDIDwgMHg0MDEgKSAmJiAhZGVmaW5lZChfX1NVTlBST19DKSkKKyAgICAgICAgIF9fR0lWRV9VUF9XSVRIX1NUTChTVU5QUk9fNDAxKQorIyAgICAgIGVuZGlmCisjICAgIGVuZGlmIC8qIDQuMC4xICovCisjICBlbmRpZiAvKiA0LjIgKi8KKyNlbmRpZiAvKiA8ICA1LjAgKi8KKworI2lmbmRlZiBfTUJTVEFURVRfSAorIyAgZGVmaW5lIF9NQlNUQVRFVF9ICisjICB1bmRlZiBfTUJTVEFURV9UCisjICBkZWZpbmUgX01CU1RBVEVfVAordHlwZWRlZiBzdHJ1Y3QgX19tYnN0YXRlX3QgeworIyAgaWYgZGVmaW5lZChfTFA2NCkKKyAgbG9uZyAgICBfX2ZpbGxlcls0XTsKKyMgIGVsc2UKKyAgaW50ICAgICBfX2ZpbGxlcls2XTsKKyMgIGVuZGlmCit9IF9fbWJzdGF0ZV90OworIyAgaWZuZGVmIF9TVExQX0hBU19OT19OQU1FU1BBQ0VTCituYW1lc3BhY2Ugc3RkIHsKKyAgdHlwZWRlZiBfX21ic3RhdGVfdCBtYnN0YXRlX3Q7Cit9Cit1c2luZyBzdGQ6Om1ic3RhdGVfdDsKKyMgIGVsc2UKK3R5cGVkZWYgX19tYnN0YXRlX3QgbWJzdGF0ZV90OworIyAgZW5kaWYKKyNlbmRpZiAgLyogX19NQlNUQVRFVF9IICovCisKKyNpZiAhZGVmaW5lZChfU1RMUF9IQVNfTk9fTkVXX0NfSEVBREVSUykgJiYgIWRlZmluZWQoX1NUTFBfTk9fTkVXX0NfSEVBREVSUykKKy8qIFNpbmNlIFN1biBTdHVkaW8gdXNlcyA8aXNvL3N0ZGxpYl9pc28uaD4sIHdlIGFyZSBhdCBpdHMKKyAqIG1lcmN5LiAgR0NDIGlzIGJ1aWx0IG9uIHRvcCBvZiA8c3RkbGliLmg+LiAqLworI2RlZmluZSBfU1RMUF9OT19WRU5ET1JfU1RETElCX0wKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdGwvY29uZmlnL19zeXN0ZW0uaCBiL3N0bHBvcnQvc3RsL2NvbmZpZy9fc3lzdGVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBiNGFkZAotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc3RsL2NvbmZpZy9fc3lzdGVtLmgKQEAgLTAsMCArMSwxNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisvKgorICogUHVycG9zZSBvZiB0aGlzIGZpbGUgOgorICoKKyAqIFRvIGhvbGQgQ09NUElMRVItU1BFQ0lGSUMgcG9ydGlvbiBvZiBTVExwb3J0IHNldHRpbmdzLgorICogSW4gZ2VuZXJhbCwgdXNlciBzaG91bGQgbm90IGVkaXQgdGhpcyBmaWxlIHVubGVzcworICogdXNpbmcgdGhlIGNvbXBpbGVyIG5vdCByZWNvZ25pemVkIGJlbG93LgorICoKKyAqIElmIHlvdXIgY29tcGlsZXIgaXMgbm90IGJlaW5nIHJlY29nbml6ZWQgeWV0LAorICogcGxlYXNlIGxvb2sgZm9yIGRlZmluaXRpb25zIG9mIG1hY3JvcyBpbiBzdGxfbXljb21wLmgsCisgKiBjb3B5IHN0bF9teWNvbXAuaCB0byBzdGxfWU9VUl9DT01QSUxFUl9OQU1FLAorICogYWRqdXN0IGZsYWdzIGZvciB5b3VyIGNvbXBpbGVyLCBhbmQgYWRkICA8aW5jbHVkZSBjb25maWcvc3RsX1lPVVJfQ09NUElMRVJfTkFNRT4KKyAqIHRvIHRoZSBzZWN0b24gY29udHJvbGxlZCBieSB1bmlxdWUgbWFjcm8gZGVmaW5lZCBpbnRlcm5hbHkgYnkgeW91ciBjb21waWxlci4KKyAqCisgKiBUbyBjaGFuZ2UgdXNlci1kZWZpbmFibGUgc2V0dGluZ3MsIHBsZWFzZSBlZGl0IDx1c2VyX2NvbmZpZy5oPgorICoKKyAqLworCisjaWZuZGVmIF9fc3RsX2NvbmZpZ19fc3lzdGVtX2gKKyNkZWZpbmUgX19zdGxfY29uZmlnX19zeXN0ZW1faAorCisjaWYgZGVmaW5lZCAoX19zdW4pCisjICBpbmNsdWRlIDxzdGwvY29uZmlnL19zb2xhcmlzLmg+CisjICBpZiBkZWZpbmVkIChfX0dOVUNfXykKKyMgICAgaW5jbHVkZSA8c3RsL2NvbmZpZy9fZ2NjLmg+CisjICBlbGlmIGRlZmluZWQgKF9fU1VOUFJPX0NDKSB8fCBkZWZpbmVkIChfX1NVTlBST19DKQorIyAgICBpbmNsdWRlIDxzdGwvY29uZmlnL19zdW5wcm9jYy5oPgorLyoKKyMgIGlmZGVmIF9fS0NDCisjICAgIGluY2x1ZGUgPHN0bC9jb25maWcvX2thaS5oPgorIyAgZW5kaWYKKyovCisjICBlbGlmIGRlZmluZWQgKF9fQVBPR0VFX18pICAvKiBBcG9nZWUgNC54ICovCisjICAgIGluY2x1ZGUgPHN0bC9jb25maWcvX2FwY2MuaD4KKyMgIGVsaWYgZGVmaW5lZCAoX19GQ0NfVkVSU0lPTikgLyogRnVqaXRzdSBDb21waWxlciwgdjQuMCBhc3N1bWVkICovCisjICAgIGluY2x1ZGUgPHN0bC9jb25maWcvX2Z1aml0c3UuaD4KKyMgIGVuZGlmCisjZWxpZiBkZWZpbmVkIChfX2hwdXgpCisjICBpbmNsdWRlIDxzdGwvY29uZmlnL19ocHV4Lmg+CisjICBpZiBkZWZpbmVkIChfX0dOVUNfXykKKyMgICAgaW5jbHVkZSA8c3RsL2NvbmZpZy9fZ2NjLmg+CisjICBlbGlmIGRlZmluZWQgKF9fSFBfYUNDKQorIyAgICBpbmNsdWRlIDxzdGwvY29uZmlnL19ocGFjYy5oPgorIyAgZW5kaWYKKyNlbGlmIGRlZmluZWQgKEFORFJPSUQpCisvKiBBbmRyb2lkIG1vYmlsZSBwaG9uZSBwbGF0Zm9ybS4gU29tZXdoYXQgYnV0IG5vdCBlbnRpcmVseSBHTlUvTGludXgtbGlrZSAqLworIyAgaW5jbHVkZSA8c3RsL2NvbmZpZy9fYW5kcm9pZC5oPgorI2VsaWYgZGVmaW5lZCAobGludXgpIHx8IGRlZmluZWQgKF9fbGludXhfXykKKyMgIGluY2x1ZGUgPHN0bC9jb25maWcvX2xpbnV4Lmg+CisjICBpZiBkZWZpbmVkIChfX0JPUkxBTkRDX18pCisjICAgIGluY2x1ZGUgPHN0bC9jb25maWcvX2JjLmg+IC8qIEJvcmxhbmQgQysrIDB4NTcwICovCisvKiBJbnRlbCdzIGljYyBkZWZpbmUgX19HTlVDX18hICovCisjICBlbGlmIGRlZmluZWQgKF9fSU5URUxfQ09NUElMRVIpCisjICAgIGluY2x1ZGUgPHN0bC9jb25maWcvX2ljYy5oPgorIyAgZWxpZiBkZWZpbmVkIChfX0dOVUNfXykKKyMgICAgaW5jbHVkZSA8c3RsL2NvbmZpZy9fZ2NjLmg+CisjICBlbmRpZgorLyoKKyMgIGlmZGVmIF9fS0NDCisjICAgIGluY2x1ZGUgPHN0bC9jb25maWcvX2thaS5oPgorIyAgZW5kaWYKKyovCisjZWxpZiBkZWZpbmVkIChfX0ZyZWVCU0RfXykKKyMgIGluY2x1ZGUgPHN0bC9jb25maWcvX2ZyZWVic2QuaD4KKyMgIGlmIGRlZmluZWQgKF9fR05VQ19fKQorIyAgICBpbmNsdWRlIDxzdGwvY29uZmlnL19nY2MuaD4KKyMgIGVuZGlmCisjZWxpZiBkZWZpbmVkIChfX09wZW5CU0RfXykKKyMgIGluY2x1ZGUgPHN0bC9jb25maWcvX29wZW5ic2QuaD4KKyMgIGlmIGRlZmluZWQgKF9fR05VQ19fKQorIyAgICBpbmNsdWRlIDxzdGwvY29uZmlnL19nY2MuaD4KKyMgIGVuZGlmCisjZWxpZiBkZWZpbmVkIChfX3NnaSkgLyogSVJJWD8gKi8KKyMgIGRlZmluZSBfU1RMUF9QTEFURk9STSAiU0dJIElyaXgiCisjICBpZiBkZWZpbmVkIChfX0dOVUNfXykKKyMgICAgaW5jbHVkZSA8c3RsL2NvbmZpZy9fZ2NjLmg+CisjICBlbHNlCisjICAgIGluY2x1ZGUgPHN0bC9jb25maWcvX3NnaS5oPgorIyAgZW5kaWYKKyNlbGlmIGRlZmluZWQgKF9fT1M0MDBfXykgLyogQVMvNDAwIEMrKyAqLworIyAgZGVmaW5lIF9TVExQX1BMQVRGT1JNICJPUyA0MDAiCisjICBpZiBkZWZpbmVkIChfX0dOVUNfXykKKyMgICAgaW5jbHVkZSA8c3RsL2NvbmZpZy9fZ2NjLmg+CisjICBlbHNlCisjICAgIGluY2x1ZGUgPHN0bC9jb25maWcvX2FzNDAwLmg+CisjICBlbmRpZgorI2VsaWYgZGVmaW5lZCAoX0FJWCkKKyMgIGluY2x1ZGUgPHN0bC9jb25maWcvX2FpeC5oPgorIyAgaWYgZGVmaW5lZCAoX194bENfXykgfHwgZGVmaW5lZCAoX19JQk1DX18pIHx8IGRlZmluZWQgKCBfX0lCTUNQUF9fICkKKyAgICAgLyogQUlYIHhsQywgVmlzdWFsIEFnZSBDKysgLCBPUy0zOTAgQysrICovCisjICAgIGluY2x1ZGUgPHN0bC9jb25maWcvX2libS5oPgorIyAgZW5kaWYKKyNlbGlmIGRlZmluZWQgKF9DUkFZKSAvKiBDcmF5IEMrKyAzLjQgb3IgMy41ICovCisjICBkZWZpbmUgX1NUTFBfUExBVEZPUk0gIkNyYXkiCisjICBpbmNsdWRlIDxjb25maWcvX2NyYXkuaD4KKyNlbGlmIGRlZmluZWQgKF9fREVDQ1hYKSB8fCBkZWZpbmVkIChfX0RFQ0MpCisjICBkZWZpbmUgX1NUTFBfUExBVEZPUk0gIkRFQ0MiCisjICBpZmRlZiBfX3ZtcworIyAgICBpbmNsdWRlIDxzdGwvY29uZmlnL19kZWNfdm1zLmg+CisjICBlbHNlCisjICAgIGluY2x1ZGUgPHN0bC9jb25maWcvX2RlYy5oPgorIyAgZW5kaWYKKyNlbGlmIGRlZmluZWQgKG1hY2ludG9zaCkgfHwgZGVmaW5lZCAoX01BQykKKyMgIGluY2x1ZGUgPHN0bC9jb25maWcvX21hYy5oPgorIyAgaWYgZGVmaW5lZCAoX19NV0VSS1NfXykKKyMgICAgaW5jbHVkZSA8c3RsL2NvbmZpZy9fbXdlcmtzLmg+CisjICBlbmRpZgorI2VsaWYgZGVmaW5lZCAoX19BUFBMRV9fKQorIyAgaW5jbHVkZSA8c3RsL2NvbmZpZy9fbWFjb3N4Lmg+CisjICBpZmRlZiBfX0dOVUNfXworIyAgICBpbmNsdWRlIDxzdGwvY29uZmlnL19nY2MuaD4KKyMgIGVuZGlmCisjZWxpZiBkZWZpbmVkIChfX0NZR1dJTl9fKQorIyAgaW5jbHVkZSA8c3RsL2NvbmZpZy9fY3lnd2luLmg+CisjICBpZiBkZWZpbmVkIChfX0dOVUNfXykKKyMgICAgaW5jbHVkZSA8c3RsL2NvbmZpZy9fZ2NjLmg+CisjICBlbmRpZgorI2VsaWYgZGVmaW5lZCAoX19NSU5HVzMyX18pCisjICBkZWZpbmUgX1NUTFBfUExBVEZPUk0gIk1pbkdXIgorIyAgaWYgZGVmaW5lZCAoX19HTlVDX18pCisjICAgIGluY2x1ZGUgPHN0bC9jb25maWcvX2djYy5oPgorIyAgZW5kaWYKKyMgIGluY2x1ZGUgPHN0bC9jb25maWcvX3dpbmRvd3MuaD4KKyNlbGlmIGRlZmluZWQgKF9XSU4zMikgfHwgZGVmaW5lZCAoX19XSU4zMikgfHwgZGVmaW5lZCAoV0lOMzIpIHx8IGRlZmluZWQgKF9fV0lOMzJfXykgfHwgXAorICAgICAgZGVmaW5lZCAoX19XSU4xNikgfHwgZGVmaW5lZCAoV0lOMTYpIHx8IGRlZmluZWQgKF9XSU4xNikKKyMgIGlmIGRlZmluZWQgKCBfX0JPUkxBTkRDX18gKSAgLyogQm9ybGFuZCBDKysgLyBDb2RlR2VhciBDKysgKi8KKyMgICAgaW5jbHVkZSA8c3RsL2NvbmZpZy9fYmMuaD4KKyMgIGVsaWYgZGVmaW5lZCAoX19XQVRDT01fQ1BMVVNQTFVTX18pIHx8IGRlZmluZWQgKF9fV0FUQ09NQ19fKSAgLyogV2F0Y29tIEMrKyAqLworIyAgICBpbmNsdWRlIDxzdGwvY29uZmlnL193YXRjb20uaD4KKyMgIGVsaWYgZGVmaW5lZCAoX19DT01PX18pIHx8IGRlZmluZWQgKF9fQ09NT19WRVJTSU9OXykKKyMgICAgaW5jbHVkZSA8c3RsL2NvbmZpZy9fY29tby5oPgorIyAgZWxpZiBkZWZpbmVkIChfX0RNQ19fKSAgIC8qIERpZ2l0YWwgTWFycyBDKysgKi8KKyMgICAgaW5jbHVkZSA8c3RsL2NvbmZpZy9fZG0uaD4KKyMgIGVsaWYgZGVmaW5lZCAoX19JQ0wpIC8qIEludGVsIHJlZmVyZW5jZSBjb21waWxlciBmb3IgV2luICovCisjICAgIGluY2x1ZGUgPHN0bC9jb25maWcvX2ludGVsLmg+CisjICBlbGlmIGRlZmluZWQgKF9fTVdFUktTX18pCisjICAgIGluY2x1ZGUgPHN0bC9jb25maWcvX213ZXJrcy5oPgorIyAgZWxpZiBkZWZpbmVkIChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApICYmIGRlZmluZWQgKFVOREVSX0NFKQorICAgICAvKiBNaWNyb3NvZnQgZU1iZWRkZWQgVmlzdWFsIEMrKyAzLjAsIDQuMCAoLk5FVCkgKi8KKyMgICAgaW5jbHVkZSA8c3RsL2NvbmZpZy9fZXZjLmg+CisjICBlbGlmIGRlZmluZWQgKF9NU0NfVkVSKQorICAgIC8qIE1pY3Jvc29mdCBWaXN1YWwgQysrIDYuMCwgNy4wLCA3LjEsIDguMCAqLworIyAgICBpbmNsdWRlIDxzdGwvY29uZmlnL19tc3ZjLmg+CisjICBlbmRpZgorCisjICBpbmNsdWRlIDxzdGwvY29uZmlnL193aW5kb3dzLmg+CisjZWxzZQorIyAgZXJyb3IgVW5rbm93biBwbGF0Zm9ybSAhIQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfQ09NUElMRVIpCisvKiBVbmFibGUgdG8gaWRlbnRpZnkgdGhlIGNvbXBpbGVyLCBpc3N1ZSBlcnJvciBkaWFnbm9zdGljLgorICogRWRpdCA8Y29uZmlnL3N0bF9teWNvbXAuaD4gdG8gc2V0IFNUTHBvcnQgdXAgZm9yIHlvdXIgY29tcGlsZXIuICovCisjICBpbmNsdWRlIDxzdGwvY29uZmlnL3N0bF9teWNvbXAuaD4KKyNlbmRpZgorCisjZW5kaWYgLyogX19zdGxfY29uZmlnX19zeXN0ZW1faCAqLwpkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdGwvY29uZmlnL193YXJuaW5nc19vZmYuaCBiL3N0bHBvcnQvc3RsL2NvbmZpZy9fd2FybmluZ3Nfb2ZmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdlOTgxNQotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc3RsL2NvbmZpZy9fd2FybmluZ3Nfb2ZmLmgKQEAgLTAsMCArMSw1MSBAQAorLyogVGhpcyBoZWFkZXIgdHVybnMgb2ZmIHdhcm5pbmdzIHRoYXQgU1RMcG9ydCBoZWFkZXJzIGdlbmVyYXRlIGZvciBjb21waWxlZAorICogdXNlciBjb2RlLgorICovCisKKyNpZiBkZWZpbmVkIChfU1RMUF9NU1ZDKQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX01TVkM2X01FTV9UX0JVR19XT1JLQVJPVU5EKSB8fCBcCisgICAgICBkZWZpbmVkIChfU1RMUF9TSUdOQUxfUlVOVElNRV9DT01QQVRJQklMSVRZKSB8fCBkZWZpbmVkIChfU1RMUF9DSEVDS19SVU5USU1FX0NPTVBBVElCSUxJVFkpCisvKgorICogMzEvMDcvMjAwNDogZHVtcyAtIG5vdyB0aGF0IHdlIGRvIG5vdCBleHBvcnQgdGhlIGJhc2ljX3N0cmluZyBjbGFzcyBhbnltb3JlIGJ1dCBvbmx5IGEgYmFzZSBjbGFzcworICogd2UgaGF2ZSB0byBkaXNhYmxlIHRoaXMgd2FybmluZyBhcyB0aGUgc3RyaW5nIGFyZSB1c2VkIGFzIGRhdGEgbWVtYmVycyB0eXBlIG9mIG1hbnkgaW9zdHJlYW0gY2xhc3Nlcy4KKyAqLworIyAgICBwcmFnbWEgd2FybmluZyAoIGRpc2FibGUgOiA0MjUxICkgIC8vIGlnbm9yZSB0ZW1wbGF0ZSBjbGFzc2VzIGJlaW5nIGV4cG9ydGVkIGluIC5kbGwncworIyAgZW5kaWYKKworIyAgaWYgKF9TVExQX01TVkMgPCAxMzAwKSAvLyBWQzYsIGVWQzMsIGVWQzQKKyMgICAgcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0MDk3ICkgLy8gdHlwZWRlZi1uYW1lIHVzZWQgYXMgYmFzZWQgY2xhc3Mgb2YgKC4uLikKKyMgICAgcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0MjMxICkgLy8gbm9uIHN0YW5kYXJkIGV4dGVuc2lvbiA6ICdleHRlcm4nIGJlZm9yZSB0ZW1wbGF0ZSBpbnN0YW5jaWF0aW9uCisjICAgIHByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDI0NCApIC8vIGltcGxpY2l0IGNvbnZlcnNpb246IHBvc3NpYmxlIGxvc3Mgb2YgZGF0YQorIyAgICBwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQyODQgKSAvLyBmb3IgLT4gb3BlcmF0b3IKKy8vVGhpcyB3YXJuaW5nIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIG9mIHRoZSBuYXRpdmUgcGxhdGZvcm0gaGVhZGVyczoKKyMgICAgcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0MjkwICkgLy8gYysrIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uIGlnbm9yZWQKKyMgICAgcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0NTE0ICkgLy8gdW5yZWZlcmVuY2VkIGlubGluZSBmdW5jdGlvbiBoYXMgYmVlbiByZW1vdmVkCisjICAgIHByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDY2MCApIC8vIHRlbXBsYXRlLWNsYXNzIHNwZWNpYWxpemF0aW9uICcuLi4nIGlzIGFscmVhZHkgaW5zdGFudGlhdGVkCisjICAgIHByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDcwMSApIC8vIGxvY2FsIHZhcmlhYmxlICcuLi4nIG1heSBiZSB1c2VkIHdpdGhvdXQgaGF2aW5nIGJlZW4gaW5pdGlhbGl6ZWQKKyMgICAgcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0NzEwICkgLy8gZnVuY3Rpb24gKC4uLikgbm90IGlubGluZWQKKyMgICAgcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0Nzg2ICkgLy8gaWRlbnRpZmllciB0cnVuY2F0ZWQgdG8gMjU1IGNoYXJhY3RlcnMKKyMgIGVuZGlmCisKKyMgIGlmIChfU1RMUF9NU1ZDIDwgMTQwMCkKKyMgICAgcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0NTExICkgLy8gY29weSBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgZ2VuZXJhdGVkCisjICBlbmRpZgorCisvL1Bvb2wgb2YgY29tbW9uIHdhcm5pbmdzIGZvciBhbGwgTVNWQyBzdXBwb3J0ZWQgdmVyc2lvbnM6CisvL01hbnkgYXJlIG9ubHkgdXNlZnVsIGlmIHdhcm5pbmcgbGV2ZWwgaXMgc2V0IHRvIDQuCisjICBwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQxMDAgKSAvLyB1bnJlZmVyZW5jZWQgZm9ybWFsIHBhcmFtZXRlcgorIyAgcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0MTI3ICkgLy8gY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBpcyBjb25zdGFudAorIyAgcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0MTQ2ICkgLy8gdW5hcnkgbWludXMgb3BlcmF0b3IgYXBwbGllZCB0byB1bnNpZ25lZCB0eXBlLCByZXN1bHQgc3RpbGwgdW5zaWduZWQKKyMgIHByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDI0NSApIC8vIGNvbnZlcnNpb24gZnJvbSAnZW51bSAnIHRvICd1bnNpZ25lZCBpbnQnLCBzaWduZWQvdW5zaWduZWQgbWlzbWF0Y2gKKyMgIHByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDM1NSApIC8vIHRoaXMgdXNlZCBpbiBiYXNlIG1lbWJlciBpbml0aWFsaXplciBsaXN0ICh1c2VkIGluIHJvcGUgaW1wbGVtZW50YXRpb24pCisjICBwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQ1MTAgKSAvLyBkZWZhdWx0IGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBnZW5lcmF0ZWQKKyMgIHByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDUxMiApIC8vIGFzc2lnbm1lbnQgb3BlcmF0b3IgY291bGQgbm90IGJlIGdlbmVyYXRlZAorIyAgcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0NTcxICkgLy8gY2F0Y2goLi4uKSBibG9ja3MgY29tcGlsZWQgd2l0aCAvRUhzIGRvIG5vdCBjYXRjaCBvciByZS10aHJvdyBTdHJ1Y3R1cmVkIEV4Y2VwdGlvbnMKKyMgIHByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDYxMCApIC8vIHN0cnVjdCAnLi4uJyBjYW4gbmV2ZXIgYmUgaW5zdGFudGlhdGVkIC0gdXNlciBkZWZpbmVkIGNvbnN0cnV0b3IgcmVxdWlyZWQKKyNlbGlmIGRlZmluZWQgKF9fQk9STEFORENfXykKKyMgIHByYWdtYSBvcHRpb24gLXctY2NjIC8vIC13LTgwMDggQ29uZGl0aW9uIGlzIGFsd2F5cyB0cnVlIE9SIENvbmRpdGlvbiBpcyBhbHdheXMgZmFsc2UKKyMgIHByYWdtYSBvcHRpb24gLXctaW5sIC8vIC13LTgwMjcgRnVuY3Rpb25zIGNvbnRhaW5pbmcgcmVzZXJ2ZWQgd29yZHMgYXJlIG5vdCBleHBhbmRlZCBpbmxpbmUKKyMgIHByYWdtYSBvcHRpb24gLXctbmd1IC8vIC13LTgwNDEgTmVnYXRpbmcgdW5zaWduZWQgdmFsdWUKKyMgIHByYWdtYSBvcHRpb24gLXctcG93IC8vIC13LTgwNjIgUHJldmlvdXMgb3B0aW9ucyBhbmQgd2FybmluZ3Mgbm90IHJlc3RvcmVkCisjICBwcmFnbWEgb3B0aW9uIC13LXJjaCAvLyAtdy04MDY2IFVucmVhY2hhYmxlIGNvZGUKKyMgIHByYWdtYSBvcHRpb24gLXctcGFyIC8vIC13LTgwNTcgUGFyYW1ldGVyICdwYXJhbWV0ZXInIGlzIG5ldmVyIHVzZWQKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdGwvY29uZmlnL193YXRjb20uaCBiL3N0bHBvcnQvc3RsL2NvbmZpZy9fd2F0Y29tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBkMmRlZgotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc3RsL2NvbmZpZy9fd2F0Y29tLmgKQEAgLTAsMCArMSwxNTEgQEAKKy8vIFNUTHBvcnQgY29uZmlndXJhdGlvbiBmaWxlCisvLyBJdCBpcyBpbnRlcm5hbCBTVExwb3J0IGhlYWRlciAtIERPIE5PVCBpbmNsdWRlIGl0IGRpcmVjdGx5CisKKyNkZWZpbmUgX1NUTFBfQ09NUElMRVIgIldhdGNvbSIKKworI2lmIChfX1dBVENPTUNfXyA8IDEyNTApCisjICBlcnJvciBOb3Qgc3VwcG9ydGVkIQorI2VuZGlmCisKKyNpZm5kZWYgX0NQUFJUVEkKKyMgIGRlZmluZSBfU1RMUF9OT19SVFRJIDEKKyNlbmRpZgorCisvLyBmb3Igc3dpdGNoZXMgKC14cywgIC14c3MsICAteHN0KQorI2lmICEoZGVmaW5lZCAoX19TV19YUykgfHwgZGVmaW5lZCAoX19TV19YU1MpIHx8IGRlZmluZWQoX19TV19YU1QpKQorIyAgZGVmaW5lIF9TVExQX0hBU19OT19FWENFUFRJT05TIDEKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX01UKSAmJiAhZGVmaW5lZCAoX05PVEhSRUFEUykKKyMgIGRlZmluZSBfU1RMUF9USFJFQURTIDEKKyNlbmRpZgorCisjZGVmaW5lIF9TVExQX05PX1ZFTkRPUl9TVERMSUJfTAorI2RlZmluZSBfU1RMUF9OT19WRU5ET1JfTUFUSF9GCisjZGVmaW5lIF9TVExQX05PX1ZFTkRPUl9NQVRIX0wKKworI2RlZmluZSBfU1RMUF9MT05HX0xPTkcgbG9uZyBsb25nCisKKyNkZWZpbmUgX1NUTFBfQ0FMTCBfX2NkZWNsCisjZGVmaW5lIF9TVExQX0lNUE9SVF9ERUNMU1BFQyBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKworI2RlZmluZSBfU1RMUF9OT19DT05TVF9JTl9QQUlSCisKKy8vI2RlZmluZSBfU1RMUF9ET05UX1VTRV9QUklWX05BTUVTUEFDRQorLy8jZGVmaW5lIF9TVExQX05PX01PVkVfU0VNQU5USUMKKy8vI2RlZmluZSBfU1RMUF9OT19UWVBFTkFNRV9JTl9URU1QTEFURV9IRUFERVIKKyNkZWZpbmUgX1NUTFBfRE9OVF9TVVBQT1JUX1JFQklORF9NRU1CRVJfVEVNUExBVEUKKworI2RlZmluZSBfU1RMUF9OT19SRUxPUFNfTkFNRVNQQUNFCisKKyNkZWZpbmUgX1NUTFBfTkVFRFNfRVhUUkFfVEVNUExBVEVfQ09OU1RSVUNUT1JTCisjZGVmaW5lIF9TVExQX05PX1NUQVRJQ19DT05TVF9ERUZJTklUSU9OCisKKy8vI2RlZmluZSBfU1RMUF9IQVNfU1BFQ0lGSUNfUFJPTE9HX0VQSUxPRworI2RlZmluZSBfU1RMUF9ET05UX1NJTVVMQVRFX1BBUlRJQUxfU1BFQ19GT1JfVFlQRV9UUkFJVFMKKy8vI2RlZmluZSBfU1RMUF9VU0VfT0xEX0hQX0lURVJBVE9SX1FVRVJJRVMKKworI2RlZmluZSBfU1RMUF9OT19GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIgMQorI2RlZmluZSBfU1RMUF9OT19DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OIDEKKy8vI2RlZmluZSBfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVfS0VZV09SRCAxCisvLyNkZWZpbmUgX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFUyAxCisvLyNkZWZpbmUgX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFX0NMQVNTRVMgMQorCisvLyNkZWZpbmUgX1NUTFBfTElNSVRFRF9ERUZBVUxUX1RFTVBMQVRFUyAxCisvLyNkZWZpbmUgX1NUTFBfSEFTX05PX05BTUVTUEFDRVMgMQorLy8jZGVmaW5lIF9TVExQX05FRURfVFlQRU5BTUUgMQorCisjZGVmaW5lIF9TVExQX05PX0VYUExJQ0lUX0ZVTkNUSU9OX1RNUExfQVJHUyAxCisKKy8vI2RlZmluZSBfU1RMUF9TVEFUSUNfQ09OU1RfSU5JVF9CVUcgMQorLy8gI2RlZmluZSBfU1RMUF9USFJPV19SRVRVUk5fQlVHIDEKKy8vI2RlZmluZSBfU1RMUF9OT19URU1QTEFURV9DT05WRVJTSU9OUyAxCisKKyNkZWZpbmUgX1NUTFBfQkFTRV9UWVBFREVGX09VVFNJREVfQlVHIDEKKworI2RlZmluZSBfU1RMUF9OT19ERUZBVUxUX05PTl9UWVBFX1BBUkFNIDEKKyNkZWZpbmUgX1NUTFBfTk9OX1RZUEVfVE1QTF9QQVJBTV9CVUcgMQorCisvLyNkZWZpbmUgX1NUTFBfTk9OVEVNUExfQkFTRV9NQVRDSF9CVUcKKy8vI2RlZmluZSBfU1RMUF9OT19FWENFUFRJT05fSEVBREVSIDEKKyNkZWZpbmUgX1NUTFBfTk9fQkFEX0FMTE9DIDEKKworLy8jZGVmaW5lIF9TVExQX05PX1RZUEVOQU1FX09OX1JFVFVSTl9UWVBFCisvLyNkZWZpbmUgX1NUTFBfTkVTVEVEX1RZUEVfUEFSQU1fQlVHIDEKKworLy8jZGVmaW5lIF9TVExQX05PX1VTSU5HX0ZPUl9HTE9CQUxfRlVOQ1RJT05TIDEKKworI2RlZmluZSBfU1RMUF9OT19BUlJPV19PUEVSQVRPUiAxCisvLyBUaGlzIG9uZSBpcyBwcmVzZW50IGluIDExLCBidXQgYXBwYXJlbnRseSBoYXMgYnVncyAod2l0aCBhdXRvX3B0cikuCisvLyNkZWZpbmUgX1NUTFBfTk9fTkVXX1NUWUxFX0NBU1RTIDEKKworLy8gR2V0IHJpZCBvZiBXYXRjb20ncyBtaW4gYW5kIG1heCBtYWNyb3MKKyN1bmRlZiBtaW4KKyN1bmRlZiBtYXgKKworLy8gT24gUU5YLCBoZWFkZXJzIGFyZSBzdXBwb3NlZCB0byBiZSBmb3VuZCBpbiAvdXNyL2luY2x1ZGUsCisvLyBzbyBkZWZhdWx0ICIuLi9pbmNsdWRlIiBzaG91bGQgd29yay4KKyNpZm5kZWYgX19RTlhfXworIyAgZGVmaW5lIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEggLi4vaAorI2Vsc2UKKy8vIGJvcmlzIDogaXMgdGhpcyB0cnVlIG9yIGp1c3QgdGhlIGhlYWRlciBpcyBub3QgaW4gL3Vzci9pbmNsdWRlID8KKyMgIGRlZmluZSBfU1RMUF9OT19UWVBFSU5GTyAxCisjZW5kaWYKKworLy8gSW5saW5lIHJlcGxhY2VtZW50cyBmb3IgbG9ja2luZyBjYWxscyB1bmRlciBXYXRjb20KKy8vIERlZmluZSBfU1RMUF9OT19XQVRDT01fSU5MSU5FX0lOVEVSTE9DSyB0byBrZWVwIHVzaW5nCisvLyBzdGFuZGFyZCBXSU4zMiBjYWxscworLy8gRGVmaW5lIF9TVExfTVVMVElQUk9DRVNTT1IgdG8gZW5hYmxlIGxvY2sKKyNkZWZpbmUgX1NUTFBfTk9fV0FUQ09NX0lOTElORV9JTlRFUkxPQ0sKKyNpZiAhZGVmaW5lZChfU1RMUF9OT19XQVRDT01fSU5MSU5FX0lOVEVSTE9DSykKKworbG9uZyAgICBfX3N0bF9JbnRlcmxvY2tlZEluY3JlbWVudCggbG9uZyAqdmFyICk7Citsb25nICAgIF9fc3RsX0ludGVybG9ja2VkRGVjcmVtZW50KCBsb25nICp2YXIgKTsKKworI2lmZGVmIF9TVExfTVVMVElQUk9DRVNTT1IKKy8vIE11bHRpcGxlIFByb2Nlc3NvcnMsIGFkZCBsb2NrIHByZWZpeAorI3ByYWdtYSBhdXggX19zdGxfSW50ZXJsb2NrZWRJbmNyZW1lbnQgcGFybSBbIGVjeCBdID0gXAorICAgICAgICAiLjU4NiIgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJtb3YgZWF4LCAxIiAgICAgICAgICAgIFwKKyAgICAgICAgImxvY2sgeGFkZCBbZWN4XSwgZWF4IiAgICAgICBcCisgICAgICAgICJpbmMgZWF4IiAgICAgICAgICAgICAgIFwKKyAgICAgICAgdmFsdWUgW2VheF07CisKKworI3ByYWdtYSBhdXggX19zdGxfSW50ZXJsb2NrZWREZWNyZW1lbnQgcGFybSBbIGVjeCBdID0gXAorICAgICAgICAiLjU4NiIgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJtb3YgZWF4LCAwRkZGRkZGRkZoIiAgIFwKKyAgICAgICAgImxvY2sgeGFkZCBbZWN4XSwgZWF4IiAgICAgICBcCisgICAgICAgICJkZWMgZWF4IiAgICAgICAgICAgICAgIFwKKyAgICAgICAgdmFsdWUgW2VheF07CisjZWxzZQorLy8gU2luZ2xlIFByb2Nlc3NvciwgbG9jayBwcmVmaXggbm90IG5lZWRlZAorI3ByYWdtYSBhdXggX19zdGxfSW50ZXJsb2NrZWRJbmNyZW1lbnQgcGFybSBbIGVjeCBdID0gXAorICAgICAgICAiLjU4NiIgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJtb3YgZWF4LCAxIiAgICAgICAgICAgIFwKKyAgICAgICAgInhhZGQgW2VjeF0sIGVheCIgICAgICAgXAorICAgICAgICAiaW5jIGVheCIgICAgICAgICAgICAgICBcCisgICAgICAgIHZhbHVlIFtlYXhdOworCisjcHJhZ21hIGF1eCBfX3N0bF9JbnRlcmxvY2tlZERlY3JlbWVudCBwYXJtIFsgZWN4IF0gPSBcCisgICAgICAgICIuNTg2IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIm1vdiBlYXgsIDBGRkZGRkZGRmgiICAgXAorICAgICAgICAieGFkZCBbZWN4XSwgZWF4IiAgICAgICBcCisgICAgICAgICJkZWMgZWF4IiAgICAgICAgICAgICAgIFwKKyAgICAgICAgdmFsdWUgW2VheF07CisjZW5kaWYgLy8gX1NUTF9NVUxUSVBST0NFU1NPUgorCitsb25nICAgIF9fc3RsX0ludGVybG9ja2VkRXhjaGFuZ2UoIGxvbmcgKkRlc3RpbmF0aW9uLCBsb25nIFZhbHVlICk7CisKKy8vIHhjaGcgaGFzIGF1dG8tbG9jaworI3ByYWdtYSBhdXggX19zdGxfSW50ZXJsb2NrZWRFeGNoYW5nZSBwYXJtIFtlY3hdIFtlYXhdID0gXAorICAgICAgICAiLjU4NiIgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJ4Y2hnIGVheCwgW2VjeF0iICAgICAgIFwKKyAgICAgICAgdmFsdWUgW2VheF07CisKKyMgIGRlZmluZSBfU1RMUF9BVE9NSUNfSU5DUkVNRU5UKF9feCkgX19zdGxfSW50ZXJsb2NrZWRJbmNyZW1lbnQoKGxvbmcqKV9feCkKKyMgIGRlZmluZSBfU1RMUF9BVE9NSUNfREVDUkVNRU5UKF9feCkgX19zdGxfSW50ZXJsb2NrZWREZWNyZW1lbnQoKGxvbmcqKV9feCkKKyMgIGRlZmluZSBfU1RMUF9BVE9NSUNfRVhDSEFOR0UoX194LCBfX3kpIF9fc3RsX0ludGVybG9ja2VkRXhjaGFuZ2UoKGxvbmcqKV9feCwgKGxvbmcpX195KQorIyAgZGVmaW5lIF9TVExQX0FUT01JQ19FWENIQU5HRV9QVFIoX194LCBfX3kpIF9fc3RsX0ludGVybG9ja2VkRXhjaGFuZ2UoKGxvbmcqKV9feCwgKGxvbmcpX195KQorI2VuZGlmIC8qIElOTElORSBJTlRFUkxPQ0sgKi8KKwpkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdGwvY29uZmlnL193aW5kb3dzLmggYi9zdGxwb3J0L3N0bC9jb25maWcvX3dpbmRvd3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjQyZTExCi0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvY29uZmlnL193aW5kb3dzLmgKQEAgLTAsMCArMSwyOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMTk5OQorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMKKyAqIEZyYW5jb2lzIER1bW9udAorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9XSU5ET1dTX0gKKyNkZWZpbmUgX1NUTFBfSU5URVJOQUxfV0lORE9XU19ICisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfUExBVEZPUk0pCisjICBkZWZpbmUgX1NUTFBfUExBVEZPUk0gIldpbmRvd3MiCisjZW5kaWYKKworI2lmICFkZWZpbmVkIChfU1RMUF9CSUdfRU5ESUFOKSAmJiAhZGVmaW5lZCAoX1NUTFBfTElUVExFX0VORElBTikKKyMgIGlmIGRlZmluZWQgKF9NSVBTRUIpCisjICAgIGRlZmluZSBfU1RMUF9CSUdfRU5ESUFOIDEKKyMgIGVuZGlmCisjICBpZiBkZWZpbmVkIChfX2kzODYpIHx8IGRlZmluZWQgKF9NX0lYODYpIHx8IGRlZmluZWQgKF9NX0FSTSkgfHwgXAorICAgICAgZGVmaW5lZCAoX19hbWQ2NF9fKSB8fCBkZWZpbmVkIChfTV9BTUQ2NCkgfHwgZGVmaW5lZCAoX194ODZfNjRfXykgfHwgXAorICAgICAgZGVmaW5lZCAoX19hbHBoYV9fKQorIyAgICBkZWZpbmUgX1NUTFBfTElUVExFX0VORElBTiAxCisjICBlbmRpZgorIyAgaWYgZGVmaW5lZCAoX19pYTY0X18pCisgICAgLyogaXRhbml1bSBhbGxvd3MgYm90aCBzZXR0aW5ncyAoZm9yIGluc3RhbmNlIHZpYSBnY2MgLW1iaWctZW5kaWFuKSAtIGhlbmNlIGEgc2VwZXJhdGUgY2hlY2sgaXMgcmVxdWlyZWQgKi8KKyMgICAgaWYgZGVmaW5lZCAoX19CSUdfRU5ESUFOX18pCisjICAgICAgZGVmaW5lIF9TVExQX0JJR19FTkRJQU4gMQorIyAgICBlbHNlCisjICAgICAgZGVmaW5lIF9TVExQX0xJVFRMRV9FTkRJQU4gMQorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZiAvKiBfU1RMUF9CSUdfRU5ESUFOICovCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfV0lORE9XU19IX0lOQ0xVREVEKQorIyAgZGVmaW5lIF9TVExQX1dJTkRPV1NfSF9JTkNMVURFRAorIyAgaWYgZGVmaW5lZCAoX19CVUlMRElOR19TVExQT1JUKQorIyAgICBpbmNsdWRlIDxzdGwvY29uZmlnL19uYXRpdmVfaGVhZGVycy5oPgorLyogSGVyZSB3ZSBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCB0byBhdm9pZCBpbmRpcmVjdCBpbmNsdXNpb24KKyAqIG9mIFNUTHBvcnQgc3R1ZmZzIGZyb20gQy9DKysgU3RhbmRhcmQgaGVhZGVycyBleHBvc2VkIGJ5IFNUTHBvcnQKKyAqIGFzIGNvbmZpZ3VyYXRpb24gaXMgbm90IHlldCBjb21wbGV0ZWQuICovCisjICAgIGlmICFkZWZpbmVkIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEKQorIyAgICAgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MTAwCisjICAgIGVuZGlmCisjICAgIGlmICFkZWZpbmVkIChXSU4zMl9MRUFOX0FORF9NRUFOKQorIyAgICAgIGRlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCisjICAgIGVuZGlmCisjICAgIGlmICFkZWZpbmVkIChWQ19FWFRSQUxFQU4pCisjICAgICAgZGVmaW5lIFZDX0VYVFJBTEVBTgorIyAgICBlbmRpZgorLyogRG9uJ3QgbGV0IHdpbmRvd3MuaCBkZWZpbmUgaXRzIG1pbiBhbmQgbWF4IG1hY3Jvcy4gKi8KKyMgICAgaWYgIWRlZmluZWQgKE5PTUlOTUFYKQorIyAgICAgIGRlZmluZSBOT01JTk1BWAorIyAgICBlbmRpZgorIyAgICBpZiAhZGVmaW5lZCAoU1RSSUNUKQorIyAgICAgIGRlZmluZSBTVFJJQ1QKKyMgICAgZW5kaWYKKyMgICAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX01GQykKKyMgICAgICBpbmNsdWRlIDxhZnguaD4KKyMgICAgZWxzZQorIyAgICAgIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyMgICAgZW5kaWYKKyMgICAgaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgxMDApCisjICAgICAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgICBlbmRpZgorIyAgZWxzZQorLyogVGhpcyBzZWN0aW9uIHNlcnZlcyBhcyBhIHJlcGxhY2VtZW50IGZvciB3aW5kb3dzLmggaGVhZGVyLiAqLworIyAgICBpZiBkZWZpbmVkIChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworIyAgICBlbmRpZgorIyAgICBpZiAoZGVmaW5lZCAoX01fQU1ENjQpIHx8IGRlZmluZWQgKF9NX0lBNjQpIHx8ICghZGVmaW5lZCAoX1NUTFBfV0NFKSAmJiBkZWZpbmVkIChfTV9NUlgwMDApKSB8fCBkZWZpbmVkIChfTV9BTFBIQSkgfHwgXAorICAgICAgICAoZGVmaW5lZCAoX01fUFBDKSAmJiAoX1NUTFBfTVNWQ19MSUIgPj0gMTAwMCkpKSAmJiAhZGVmaW5lZCAoUkNfSU5WT0tFRCkKKyMgICAgICBkZWZpbmUgSW50ZXJsb2NrZWRJbmNyZW1lbnQgICAgICAgX0ludGVybG9ja2VkSW5jcmVtZW50CisjICAgICAgZGVmaW5lIEludGVybG9ja2VkRGVjcmVtZW50ICAgICAgIF9JbnRlcmxvY2tlZERlY3JlbWVudAorIyAgICAgIGRlZmluZSBJbnRlcmxvY2tlZEV4Y2hhbmdlICAgICAgICBfSW50ZXJsb2NrZWRFeGNoYW5nZQorIyAgICAgIGRlZmluZSBfU1RMUF9TVERDQUxMCisjICAgIGVsc2UKKyMgICAgICBpZiBkZWZpbmVkIChfTUFDKQorIyAgICAgICAgZGVmaW5lIF9TVExQX1NURENBTEwgX2NkZWNsCisjICAgICAgZWxzZQorIyAgICAgICAgZGVmaW5lIF9TVExQX1NURENBTEwgX19zdGRjYWxsCisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYKKworIyAgICBpZiBkZWZpbmVkIChfU1RMUF9ORVdfUExBVEZPUk1fU0RLKQorX1NUTFBfSU1QT1JUX0RFQ0xTUEVDIGxvbmcgX1NUTFBfU1REQ0FMTCBJbnRlcmxvY2tlZEluY3JlbWVudChsb25nIHZvbGF0aWxlICopOworX1NUTFBfSU1QT1JUX0RFQ0xTUEVDIGxvbmcgX1NUTFBfU1REQ0FMTCBJbnRlcmxvY2tlZERlY3JlbWVudChsb25nIHZvbGF0aWxlICopOworX1NUTFBfSU1QT1JUX0RFQ0xTUEVDIGxvbmcgX1NUTFBfU1REQ0FMTCBJbnRlcmxvY2tlZEV4Y2hhbmdlKGxvbmcgdm9sYXRpbGUgKiwgbG9uZyk7CisjICAgICAgaWYgZGVmaW5lZCAoX1dJTjY0KQorX1NUTFBfSU1QT1JUX0RFQ0xTUEVDIHZvaWQqIF9TVExQX1NURENBTEwgX0ludGVybG9ja2VkRXhjaGFuZ2VQb2ludGVyKHZvaWQqIHZvbGF0aWxlICosIHZvaWQqKTsKKyMgICAgICBlbmRpZgorIyAgICBlbGlmICFkZWZpbmVkIChfU1RMUF9XQ0UpCisvKiBib3JpcyA6IGZvciB0aGUgbGF0ZXN0IFNESywgeW91IG1heSBhY3R1YWxseSBuZWVkIHRoZSBvdGhlciB2ZXJzaW9uIG9mIHRoZSBkZWNsYXJhdGlvbiAoYWJvdmUpCisgKiBldmVuIGZvciBlYXJsaWVyIFZDKysgdmVyc2lvbnMuIFRoZXJlIGlzIG5vIHdheSB0byB0ZWxsIFNESyB2ZXJzaW9ucyBhcGFydCwgc29ycnkgLi4uCisgKi8KK19TVExQX0lNUE9SVF9ERUNMU1BFQyBsb25nIF9TVExQX1NURENBTEwgSW50ZXJsb2NrZWRJbmNyZW1lbnQobG9uZyopOworX1NUTFBfSU1QT1JUX0RFQ0xTUEVDIGxvbmcgX1NUTFBfU1REQ0FMTCBJbnRlcmxvY2tlZERlY3JlbWVudChsb25nKik7CitfU1RMUF9JTVBPUlRfREVDTFNQRUMgbG9uZyBfU1RMUF9TVERDQUxMIEludGVybG9ja2VkRXhjaGFuZ2UobG9uZyosIGxvbmcpOworIyAgICBlbHNlCisvKiBzdGFydCBvZiBlTWJlZGRlZCBWaXN1YWwgQysrIHNwZWNpZmljIHNlY3Rpb24gKi8KKyMgICAgICBpbmNsdWRlIDxzdGwvY29uZmlnL19uYXRpdmVfaGVhZGVycy5oPgorCisvKiBEb24ndCBsZXQgd2luZGVmLmggZGVmaW5lIGl0cyBtaW4gYW5kIG1heCBtYWNyb3MuICovCisjICAgICAgaWYgIWRlZmluZWQgKE5PTUlOTUFYKQorIyAgICAgICAgZGVmaW5lIE5PTUlOTUFYCisjICAgICAgZW5kaWYKKyMgICAgICBpbmNsdWRlIDx3aW5kZWYuaD4gLyogbmVlZGVkIGZvciBiYXNpYyB3aW5kb3dzIHR5cGVzICovCisKKyAgICAgICAvKiogaW4gU0RLcyBnZW5lcmF0ZWQgd2l0aCBQQjUsIHdpbmRlZi5oIHNvbWVob3cgaW5jbHVkZXMgaGVhZGVycyB3aGljaCB0aGVuCisgICAgICAgZGVmaW5lIHNldGptcC4gKi8KKyMgICAgICBpZiAoX1dJTjMyX1dDRSA+PSAweDUwMCkKKyMgICAgICAgIGRlZmluZSBfU1RMUF9OQVRJVkVfU0VUSk1QX0hfSU5DTFVERUQKKyMgICAgICBlbmRpZgorCisjICAgICAgaWZuZGVmIF9XSU5CQVNFXyAvKiB3aW5iYXNlLmggYWxyZWFkeSBpbmNsdWRlZD8gKi8KK2xvbmcgV0lOQVBJIEludGVybG9ja2VkSW5jcmVtZW50KGxvbmcqKTsKK2xvbmcgV0lOQVBJIEludGVybG9ja2VkRGVjcmVtZW50KGxvbmcqKTsKK2xvbmcgV0lOQVBJIEludGVybG9ja2VkRXhjaGFuZ2UobG9uZyosIGxvbmcpOworIyAgICAgIGVuZGlmCisKKyMgICAgICBpZm5kZWYgX19XSU5ET1dTX18gLyogd2luZG93cy5oIGFscmVhZHkgaW5jbHVkZWQ/ICovCisKKyMgICAgICAgIGlmIGRlZmluZWQgKHg4NikKKyMgICAgICAgICAgaW5jbHVkZSA8d2luYmFzZS5oPiAvKiBuZWVkZWQgZm9yIGlubGluZSB2ZXJzaW9ucyBvZiBJbnRlcmxvY2tlZCogZnVuY3Rpb25zICovCisjICAgICAgICBlbmRpZgorCisjICAgICAgICBpZm5kZWYgX01GQ19WRVIKKworIyAgICAgICAgICBkZWZpbmUgTWVzc2FnZUJveCBNZXNzYWdlQm94VworaW50IFdJTkFQSSBNZXNzYWdlQm94VyhIV05EIGhXbmQsIExQQ1dTVFIgbHBUZXh0LCBMUENXU1RSIGxwQ2FwdGlvbiwgVUlOVCB1VHlwZSk7CisKKyMgICAgICAgICAgZGVmaW5lIHd2c3ByaW50ZiB3dnNwcmludGZXCitpbnQgV0lOQVBJIHd2c3ByaW50ZlcoTFBXU1RSLCBMUENXU1RSLCB2YV9saXN0IEFyZ0xpc3QpOworCit2b2lkIFdJTkFQSSBFeGl0VGhyZWFkKERXT1JEIGR3RXhpdENvZGUpOworCisjICAgICAgICAgIGlmICFkZWZpbmVkIChDT1JFRExMKQorIyAgICAgICAgICAgIGRlZmluZSBfU1RMUF9XQ0VfV0lOQkFTRUFQSSBERUNMU1BFQ19JTVBPUlQKKyMgICAgICAgICAgZWxzZQorIyAgICAgICAgICAgIGRlZmluZSBfU1RMUF9XQ0VfV0lOQkFTRUFQSQorIyAgICAgICAgICBlbmRpZgorCitfU1RMUF9XQ0VfV0lOQkFTRUFQSSBpbnQgV0lOQVBJCitNdWx0aUJ5dGVUb1dpZGVDaGFyKFVJTlQgQ29kZVBhZ2UsIERXT1JEIGR3RmxhZ3MsIExQQ1NUUiBscE11bHRpQnl0ZVN0ciwKKyAgICAgICAgICAgICAgICAgICAgaW50IGNiTXVsdGlCeXRlLCBMUFdTVFIgbHBXaWRlQ2hhclN0ciwgaW50IGNjaFdpZGVDaGFyKTsKKworX1NUTFBfV0NFX1dJTkJBU0VBUEkgVUlOVCBXSU5BUEkgR2V0QUNQKCk7CisKK19TVExQX1dDRV9XSU5CQVNFQVBJIEJPT0wgV0lOQVBJIFRlcm1pbmF0ZVByb2Nlc3MoSEFORExFIGhQcm9jZXNzLCBEV09SRCB1RXhpdENvZGUpOworCisjICAgICAgICAgIGRlZmluZSBPdXRwdXREZWJ1Z1N0cmluZyBPdXRwdXREZWJ1Z1N0cmluZ1cKK3ZvaWQgV0lOQVBJIE91dHB1dERlYnVnU3RyaW5nVyhMUENXU1RSKTsKKworX1NUTFBfV0NFX1dJTkJBU0VBUEkgdm9pZCBXSU5BUEkgU2xlZXAoRFdPUkQpOworCisjICAgICAgICAgIHVuZGVmIF9TVExQX1dDRV9XSU5CQVNFQVBJCisKKyMgICAgICAgIGVuZGlmIC8qICFfTUZDX1ZFUiAqLworCisjICAgICAgZW5kaWYgLyogIV9fV0lORE9XU19fICovCisKKy8qIGVuZCBvZiBlTWJlZGRlZCBWaXN1YWwgQysrIHNwZWNpZmljIHNlY3Rpb24gKi8KKyMgICAgZW5kaWYKKworIyAgICBpZiAhZGVmaW5lZCAoX1NUTFBfV0NFKQorX1NUTFBfSU1QT1JUX0RFQ0xTUEVDIHZvaWQgX1NUTFBfU1REQ0FMTCBTbGVlcCh1bnNpZ25lZCBsb25nKTsKK19TVExQX0lNUE9SVF9ERUNMU1BFQyB2b2lkIF9TVExQX1NURENBTEwgT3V0cHV0RGVidWdTdHJpbmdBKGNvbnN0IGNoYXIqIGxwT3V0cHV0U3RyaW5nKTsKKyMgICAgZW5kaWYKKworIyAgICBpZiBkZWZpbmVkIChJbnRlcmxvY2tlZEluY3JlbWVudCkKKyMgICAgICBwcmFnbWEgaW50cmluc2ljKF9JbnRlcmxvY2tlZEluY3JlbWVudCkKKyMgICAgICBwcmFnbWEgaW50cmluc2ljKF9JbnRlcmxvY2tlZERlY3JlbWVudCkKKyMgICAgICBwcmFnbWEgaW50cmluc2ljKF9JbnRlcmxvY2tlZEV4Y2hhbmdlKQorIyAgICAgIGlmIGRlZmluZWQgKF9XSU42NCkKKyMgICAgICAgIHByYWdtYSBpbnRyaW5zaWMoX0ludGVybG9ja2VkRXhjaGFuZ2VQb2ludGVyKQorIyAgICAgIGVuZGlmCisjICAgIGVuZGlmCisjICAgIGlmIGRlZmluZWQgKF9fY3BsdXNwbHVzKQorfSAvKiBleHRlcm4gIkMiICovCisjICAgIGVuZGlmCisKKyMgIGVuZGlmCisKKy8qIEhlcmUgd2UgdXNlIGEgbWFjcm8gZGlmZmVyZW50IHRoYW4gdGhlIEludGVybG9ja2VkRXhjaGFuZ2VQb2ludGVyIFNESyBvbmUKKyAqIHRvIGF2b2lkIG1hY3JvIGRlZmluaXRpb24gY29uZmxpY3QuICovCisjICBpZiAhZGVmaW5lZCAoX1dJTjY0KQorLyogVW5kZXIgMzIgYml0cyBwbGF0Zm9ybSB3ZSByZWx5IG9uIGEgc2ltcGxlIEludGVybG9ja2VkRXhjaGFuZ2UgY2FsbC4gKi8KKyMgICAgaWYgZGVmaW5lZCAoX19jcGx1c3BsdXMpCisvKiBXZSBkbyBub3QgZGVmaW5lIHRoaXMgZnVuY3Rpb24gaWYgd2UgYXJlIG5vdCBpbiBhIEMrKyB0cmFuc2xhdGlvbiB1bml0IGp1c3QKKyAqIGJlY2F1c2Ugb2YgdGhlICdpbmxpbmUnIGtleXdvcmQgcG9ydGFiaWxpdHkgaXNzdWUgaXQgd291bGQgaW50cm9kdWNlLiBXZSB3aWxsCisgKiBoYXZlIHRvIGZpeCBpdCB0aGUgZGF5IHdlIG5lZWQgdGhpcyBmdW5jdGlvbiBmb3IgYSBDIHRyYW5zbGF0aW9uIHVuaXQuCisgKi8KK2lubGluZQordm9pZCogX1NUTFBfQ0FMTCBTVExQSW50ZXJsb2NrZWRFeGNoYW5nZVBvaW50ZXIodm9pZCogdm9sYXRpbGUqIF9fYSwgdm9pZCogX19iKSB7CisjICAgICAgaWYgZGVmaW5lZCAoX1NUTFBfTVNWQykKKy8qIEhlcmUgTVNWQyBwcm9kdWNlcyB3YXJuaW5nIGlmIDY0IGJpdHMgcG9ydGFiaWxpdHkgaXNzdWUgaXMgYWN0aXZhdGVkLgorICogTVNWQyBkbyBub3Qgc2VlIHRoYXQgX1NUTFBfQVRPTUlDX0VYQ0hBTkdFX1BUUiBpcyBhIG1hY3JvIHdoaWNoIGNvbnRlbnQKKyAqIGlzIGJhc2VkIG9uIHRoZSBwbGF0Zm9ybSwgV2luMzIgb3IgV2luNjQKKyAqLworIyAgICAgICAgcHJhZ21hIHdhcm5pbmcgKHB1c2gpCisjICAgICAgICBwcmFnbWEgd2FybmluZyAoZGlzYWJsZSA6IDQzMTEpIC8vIHBvaW50ZXIgdHJ1bmNhdGlvbiBmcm9tIHZvaWQqIHRvIGxvbmcKKyMgICAgICAgIHByYWdtYSB3YXJuaW5nIChkaXNhYmxlIDogNDMxMikgLy8gY29udmVyc2lvbiBmcm9tIGxvbmcgdG8gdm9pZCogb2YgZ3JlYXRlciBzaXplCisjICAgICAgZW5kaWYKKyMgICAgICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTkVXX1NUWUxFX0NBU1RTKQorICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oSW50ZXJsb2NrZWRFeGNoYW5nZShyZWludGVycHJldF9jYXN0PGxvbmcqPihjb25zdF9jYXN0PHZvaWQqKj4oX19hKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8bG9uZz4oX19iKSkpOworIyAgICAgIGVsc2UKKyAgcmV0dXJuICh2b2lkKilJbnRlcmxvY2tlZEV4Y2hhbmdlKChsb25nKilfX2EsIChsb25nKV9fYik7CisjICAgICAgZW5kaWYKKyMgICAgICBpZiBkZWZpbmVkIChfU1RMUF9NU1ZDKQorIyAgICAgICAgcHJhZ21hIHdhcm5pbmcgKHBvcCkKKyMgICAgICBlbmRpZgorfQorIyAgICBlbmRpZgorIyAgZWxzZQorIyAgICBkZWZpbmUgU1RMUEludGVybG9ja2VkRXhjaGFuZ2VQb2ludGVyIF9JbnRlcmxvY2tlZEV4Y2hhbmdlUG9pbnRlcgorIyAgZW5kaWYKKworI2VuZGlmIC8qIF9TVExQX1dJTkRPV1NfSF9JTkNMVURFRCAqLworCisvKiBfU1RMUF9XSU45NV9MSUtFIHNpZ25hbCB0aGUgV2luZG93cyA5NSBPUyBvciBhc3NpbWlsYXRlZCBXaW5kb3dzIE9TIHZlcnNpb24gdGhhdAorICogaGFzIEludGVybG9ja2VkZWRbSW5jcmVtZW50LCBEZWNyZW1lbnRdIFdpbjMyIEFQSSBmdW5jdGlvbnMgbm90IHJldHVybmluZyBtb2RpZmllZAorICogdmFsdWUuCisgKi8KKyNpZiAoZGVmaW5lZCAoV0lOVkVSKSAmJiAoV0lOVkVSIDwgMHgwNDEwKSAmJiAoIWRlZmluZWQgKF9XSU4zMl9XSU5OVCkgfHwgKF9XSU4zMl9XSU5OVCA8IDB4NDAwKSkpIHx8IFwKKyAgICAoIWRlZmluZWQgKFdJTlZFUikgJiYgKGRlZmluZWQgKF9XSU4zMl9XSU5ET1dTKSAmJiAoX1dJTjMyX1dJTkRPV1MgPCAweDA0MTApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmluZWQgKF9XSU4zMl9XSU5OVCkgJiYgKF9XSU4zMl9XSU5OVCA8IDB4NDAwKSkpKQorIyAgZGVmaW5lIF9TVExQX1dJTjk1X0xJS0UKKyNlbmRpZgorCisvKiBCZXR3ZWVuIFdpbmRvd3MgOTUgKDB4NDAwKSBhbmQgbGF0ZXIgV2luZG93cyBPU2VzIGFuIEFQSSBlbmhhbmNlbWVudCBmb3JjZXMgdXMKKyAqIHRvIGNoYW5nZSBfUmVmY291bnRfQmFzZSBpbnRlcm5hbCBzdHJ1Y3QuIEFzIF9SZWZjb3VudF9iYXNlIG1lbWJlciBtZXRob2RzIG1pZ2h0CisgKiBiZSBwYXJ0aWFsbHkgaW5saW5lZCB3ZSBuZWVkIHRvIGNoZWNrIHRoYXQgU1RMcG9ydCBidWlsZC91c2UgYXJlIGNvaGVyZW50LiBUbyBkbworICogc28gd2UgdHJ5IHRvIGdlbmVyYXRlIGEgbGluayB0aW1lIGVycm9yIHRoYW5rcyB0byB0aGUgZm9sbG93aW5nIG1hY3JvLgorICogVGhpcyBhZGRpdGlvbmFsIGNoZWNrIGlzIGxpbWl0ZWQgdG8gb2xkIGNvbXBpbGVycyB0aGF0IG1pZ2h0IHN0aWxsIGJlIHVzZWQgd2l0aAorICogV2luZG93cyA5NS4gKi8KKyNpZiAoZGVmaW5lZCAoX0RFQlVHKSB8fCBkZWZpbmVkIChfU1RMUF9ERUJVRykpICYmIFwKKyAgICAoZGVmaW5lZCAoX1NUTFBfTVNWQykgJiYgKF9TVExQX01TVkMgPCAxMzEwKSB8fCBcCisgICAgIGRlZmluZWQgKF9fR05VQ19fKSAmJiAoX19HTlVDX18gPCAzKSkKKy8qIFdlIGludmVydCBzeW1ib2wgbmFtZXMgYmFzZWQgb24gbWFjcm8gZGV0ZWN0aW9uLCB3aGVuIGJ1aWxkaW5nIGZvciBXaW5kb3dzCisgKiA5NSB3ZSBleHBvc2UgYQorICogYnVpbGRpbmdfZm9yX3dpbmRvd3M5NV9vcl9wcmV2aW91c19idXRfbGlicmFyeV9idWlsdF9mb3Jfd2luZG93czk4X29yX2xhdGVyCisgKiBmdW5jdGlvbiBpbiBvcmRlciB0byBoYXZlIGEgbW9yZSBvYnZpb3VzIGxpbmsgZXJyb3IgbWVzc2FnZSBzaWduYWxpbmcgaG93CisgKiB0aGUgbGliIGhhcyBiZWVuIGJ1aWx0IGFuZCBob3cgaXQgaXMgdXNlZC4gKi8KKyMgIGlmIGRlZmluZWQgKF9fQlVJTERJTkdfU1RMUE9SVCkKKyMgICAgaWYgZGVmaW5lZCAoX1NUTFBfV0lOOTVfTElLRSkKKyMgICAgICBkZWZpbmUgX1NUTFBfU0lHTkFMX1JVTlRJTUVfQ09NUEFUSUJJTElUWSBidWlsZGluZ19mb3Jfd2luZG93czk1X2J1dF9saWJyYXJ5X2J1aWx0X2Zvcl9hdF9sZWFzdF93aW5kb3dzOTgKKyMgICAgZWxzZQorIyAgICAgIGRlZmluZSBfU1RMUF9TSUdOQUxfUlVOVElNRV9DT01QQVRJQklMSVRZIGJ1aWxkaW5nX2Zvcl9hdF9sZWFzdF93aW5kb3dzOThfYnV0X2xpYnJhcnlfYnVpbHRfZm9yX3dpbmRvd3M5NQorIyAgICBlbmRpZgorIyAgZWxzZQorIyAgICBpZiBkZWZpbmVkIChfU1RMUF9XSU45NV9MSUtFKQorIyAgICAgIGRlZmluZSBfU1RMUF9DSEVDS19SVU5USU1FX0NPTVBBVElCSUxJVFkgYnVpbGRpbmdfZm9yX3dpbmRvd3M5NV9idXRfbGlicmFyeV9idWlsdF9mb3JfYXRfbGVhc3Rfd2luZG93czk4CisjICAgIGVsc2UKKyMgICAgICBkZWZpbmUgX1NUTFBfQ0hFQ0tfUlVOVElNRV9DT01QQVRJQklMSVRZIGJ1aWxkaW5nX2Zvcl9hdF9sZWFzdF93aW5kb3dzOThfYnV0X2xpYnJhcnlfYnVpbHRfZm9yX3dpbmRvd3M5NQorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19XSU4xNikgfHwgZGVmaW5lZCAoV0lOMTYpIHx8IGRlZmluZWQgKF9XSU4xNikKKyMgIGRlZmluZSBfU1RMUF9XSU4xNgorI2Vsc2UKKyMgIGRlZmluZSBfU1RMUF9XSU4zMgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9TVExQX1dJTjMyKQorIyAgZGVmaW5lIF9TVExQX1VTRV9XSU4zMl9JTyAvKiBDcmVhdGVGaWxlL1JlYWRGaWxlL1dyaXRlRmlsZSAqLworI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fTUlOR1czMl9fKSAmJiAhZGVmaW5lZChfU1RMUF9VU0VfU1RESU9fSU8pCisjICBkZWZpbmUgX1NUTFBfVVNFX1dJTjMyX0lPIC8qIENyZWF0ZUZpbGUvUmVhZEZpbGUvV3JpdGVGaWxlICovCisjZW5kaWYgLyogX19NSU5HVzMyX18gKi8KKworI2lmZGVmIF9TVExQX1dJTjE2CisjICBkZWZpbmUgX1NUTFBfVVNFX1VOSVhfRU1VTEFUSU9OX0lPIC8qIF9vcGVuL19yZWFkL193cml0ZSAqLworIyAgZGVmaW5lIF9TVExQX0xET1VCTEVfODAKKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfV0lORE9XU19IICovCmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9jb25maWcvY29tcGF0LmggYi9zdGxwb3J0L3N0bC9jb25maWcvY29tcGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM0ZjMxNAotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc3RsL2NvbmZpZy9jb21wYXQuaApAQCAtMCwwICsxLDgwIEBACisKKy8qCisgKiBDb21wYXRpYmlsaXR5IHNlY3Rpb24KKyAqIFRoaXMgc2VjdGlvbiBzZXRzIG5ldy1zdHlsZSBtYWNyb3MgYmFzZWQgb24gb2xkLXN0eWxlIG9uZXMsIGZvciBjb21wYXRpYmlsaXR5CisgKi8KKworI2lmIGRlZmluZWQgKF9fU1RMX0RFQlVHKSAmJiAhZGVmaW5lZCAoX1NUTFBfREVCVUcpCisjICBkZWZpbmUgX1NUTFBfREVCVUcgX19TVExfREVCVUcKKyNlbmRpZgorI2lmIGRlZmluZWQgKF9fU1RMX05PX0FOQUNIUk9OSVNNUykgJiYgIWRlZmluZWQgKF9TVExQX05PX0FOQUNIUk9OSVNNUykKKyMgIGRlZmluZSBfU1RMUF9OT19BTkFDSFJPTklTTVMgX19TVExfTk9fQU5BQ0hST05JU01TCisjZW5kaWYKKyNpZiBkZWZpbmVkIChfX1NUTF9OT19FWFRFTlNJT05TKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKKyMgIGRlZmluZSBfU1RMUF9OT19FWFRFTlNJT05TIF9fU1RMX05PX0VYVEVOU0lPTlMKKyNlbmRpZgorI2lmIGRlZmluZWQgKF9fU1RMX05PX0VYQ0VQVElPTlMpICYmICFkZWZpbmVkIChfU1RMUF9OT19FWENFUFRJT05TKQorIyAgZGVmaW5lIF9TVExQX05PX0VYQ0VQVElPTlMgX19TVExfTk9fRVhDRVBUSU9OUworI2VuZGlmCisjaWYgZGVmaW5lZCAoX19TVExfTk9fTkFNRVNQQUNFUykgJiYgIWRlZmluZWQgKF9TVExQX05PX05BTUVTUEFDRVMpCisjICBkZWZpbmUgX1NUTFBfTk9fTkFNRVNQQUNFUyBfX1NUTF9OT19OQU1FU1BBQ0VTCisjZW5kaWYKKyNpZiBkZWZpbmVkIChfX1NUTF9NSU5JTVVNX0RFRkFVTFRfVEVNUExBVEVfUEFSQU1TKSAmJiAhZGVmaW5lZCAoX1NUTFBfTUlOSU1VTV9ERUZBVUxUX1RFTVBMQVRFX1BBUkFNUykKKyMgIGRlZmluZSBfU1RMUF9NSU5JTVVNX0RFRkFVTFRfVEVNUExBVEVfUEFSQU1TIF9fU1RMX01JTklNVU1fREVGQVVMVF9URU1QTEFURV9QQVJBTVMKKyNlbmRpZgorI2lmIGRlZmluZWQgKF9fU1RMX05PX09XTl9OQU1FU1BBQ0UpICYmICFkZWZpbmVkIChfU1RMUF9OT19PV05fTkFNRVNQQUNFKQorIyAgZGVmaW5lIF9TVExQX05PX09XTl9OQU1FU1BBQ0UgX19TVExfTk9fT1dOX05BTUVTUEFDRQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX1NUTF9OT19SRUxPUFNfTkFNRVNQQUNFKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fUkVMT1BTX05BTUVTUEFDRSkKKyMgIGRlZmluZSBfU1RMUF9OT19SRUxPUFNfTkFNRVNQQUNFIF9fU1RMX05PX1JFTE9QU19OQU1FU1BBQ0UKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19TVExfREVCVUdfVU5JTklUSUFMSVpFRCkgJiYgIWRlZmluZWQgKF9TVExQX0RFQlVHX1VOSU5JVElBTElaRUQpCisjICBkZWZpbmUgX1NUTFBfREVCVUdfVU5JTklUSUFMSVpFRCBfX1NUTF9ERUJVR19VTklOSVRJQUxJWkVECisjZW5kaWYKKyNpZiBkZWZpbmVkIChfX1NUTF9TSFJFRF9CWVRFKSAmJiAhZGVmaW5lZCAoX1NUTFBfU0hSRURfQllURSkKKyMgIGRlZmluZSBfU1RMUF9TSFJFRF9CWVRFIF9fU1RMX1NIUkVEX0JZVEUKKyNlbmRpZgorI2lmIGRlZmluZWQgKF9fU1RMX1VTRV9NRkMpICYmICFkZWZpbmVkIChfU1RMUF9VU0VfTUZDKQorIyAgZGVmaW5lIF9TVExQX1VTRV9NRkMgX19TVExfVVNFX01GQworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX1NUTF9VU0VfTkVXQUxMT0MpICYmICFkZWZpbmVkIChfU1RMUF9VU0VfTkVXQUxMT0MpCisjICBkZWZpbmUgX1NUTFBfVVNFX05FV0FMTE9DIF9fU1RMX1VTRV9ORVdBTExPQworI2VuZGlmCisjaWYgZGVmaW5lZCAoX19TVExfVVNFX01BTExPQykgJiYgIWRlZmluZWQgKF9TVExQX1VTRV9NQUxMT0MpCisjICBkZWZpbmUgX1NUTFBfVVNFX01BTExPQyBfX1NUTF9VU0VfTUFMTE9DCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fU1RMX0RFQlVHX0FMTE9DKSAmJiAhZGVmaW5lZCAoX1NUTFBfREVCVUdfQUxMT0MpCisjICBkZWZpbmUgX1NUTFBfREVCVUdfQUxMT0MgX19TVExfREVCVUdfQUxMT0MKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19TVExfREVCVUdfTUVTU0FHRSkgJiYgIWRlZmluZWQgKF9TVExQX0RFQlVHX01FU1NBR0UpCisjICBkZWZpbmUgX1NUTFBfREVCVUdfTUVTU0FHRSBfX1NUTF9ERUJVR19NRVNTQUdFCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fU1RMX0RFQlVHX1RFUk1JTkFURSkgJiYgIWRlZmluZWQgKF9TVExQX0RFQlVHX1RFUk1JTkFURSkKKyMgIGRlZmluZSBfU1RMUF9ERUJVR19URVJNSU5BVEUgX19TVExfREVCVUdfVEVSTUlOQVRFCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fU1RMX1VTRV9BQkJSRVZTKSAmJiAhZGVmaW5lZCAoX1NUTFBfVVNFX0FCQlJFVlMpCisjICBkZWZpbmUgX1NUTFBfVVNFX0FCQlJFVlMgX19TVExfVVNFX0FCQlJFVlMKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19TVExfTk9fTVNWQzUwX0NPTVBBVElCSUxJVFkpICYmICFkZWZpbmVkIChfU1RMUF9OT19NU1ZDNTBfQ09NUEFUSUJJTElUWSkKKyMgIGRlZmluZSBfU1RMUF9OT19NU1ZDNTBfQ09NUEFUSUJJTElUWSBfX1NUTF9OT19NU1ZDNTBfQ09NUEFUSUJJTElUWQorI2VuZGlmCisKKy8qIFNUTHBvcnQgZG8gbm90IHN1cHBvcnQgYW55bW9yZSB0aGUgaW9zdHJlYW0gd3JhcHBlciBtb2RlIHNvIHRoaXMgbWFjcm8gc2hvdWxkCisgKiBhbHdheXMgYmVlbiBkZWZpbmUgZm9yIG90aGVyIGxpYnJhcmllcyB0aGF0IHdhcyB1c2luZyBpdDoKKyAqLworI2lmICFkZWZpbmVkIChfU1RMUF9PV05fSU9TVFJFQU1TKQorIyAgZGVmaW5lIF9TVExQX09XTl9JT1NUUkVBTVMKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfTk9fT1dOX0lPU1RSRUFNUykKKyMgIGVycm9yIFNUTHBvcnQgZG8gbm90IHN1cHBvcnQgYW55bW9yZSB0aGUgd3JhcHBlciBtb2RlLiBJZiB5b3Ugd2FudCB0byB1c2UgU1RMcG9ydCBcCit1c2UgaXRzIGlvc3RyZWFtcyBpbXBsZW1lbnRhdGlvbiBvciBubyBpb3N0cmVhbXMgYXQgYWxsLgorI2VuZGlmCmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9jb25maWcvZmVhdHVyZXMuaCBiL3N0bHBvcnQvc3RsL2NvbmZpZy9mZWF0dXJlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YjRlM2EKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9jb25maWcvZmVhdHVyZXMuaApAQCAtMCwwICsxLDEwNzkgQEAKKyAvKgorICAqCisgICogQ29weXJpZ2h0IChjKSAxOTk0CisgICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAgKgorICAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgICoKKyAgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAgKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5CisgICoKKyAgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAgKiBCb3JpcyBGb21pdGNoZXYKKyAgKgorICAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAgKgorICAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAgKgorICAqLworCisjaWZuZGVmIF9TVExQX0ZFQVRVUkVTX0gKKyNkZWZpbmUgX1NUTFBfRkVBVFVSRVNfSAorCisvKgorICogUHVycG9zZSBvZiB0aGlzIGZpbGU6CisgKgorICogRGVmaW5lcyBhbGwgU1RMcG9ydCBzZXR0aW5ncy4KKyAqIFRoaXMgZmlsZSBpcyBhY3R1YWxseSBhIHdyYXBwZXIgOiBpdCBpbmNsdWRlcyBjb21waWxlci1zcGVjaWZpYworICogc2V0dGluZ3MgZnJvbSA8Y29uZmlnL3N0bGNvbXAuaD4KKyAqIGFuZCB1c2VyLWRlZmluZWQgc2V0dGluZ3MgZnJvbSA8Y29uZmlnL3VzZXJfY29uZmlnLmg+LgorICogU2VlIDxjb25maWcvc3RsX215Y29tcC5oPiBhbmQgPGNvbmZpZy91c2VyX2NvbmZpZy5oPiBmb3IgdGhlIGRlc2NyaXB0aW9uCisgKiBvZiB0aG9zZSBtYWNyb3MKKyAqCisgKi8KKworLyogRGVmaW5pdGlvbiBvZiB0aGUgU1RMcG9ydCB2ZXJzaW9uIGluZm9ybWF0aW9ucyAqLworI2luY2x1ZGUgPHN0bC9fc3RscG9ydF92ZXJzaW9uLmg+CisKKy8qIE90aGVyIG1hY3JvcyBkZWZpbmVkIGJ5IHRoaXMgZmlsZToKKworICogYm9vbCwgdHJ1ZSwgYW5kIGZhbHNlLCBpZiBfU1RMUF9OT19CT09MIGlzIGRlZmluZWQuCisgKiB0eXBlbmFtZSwgYXMgYSBudWxsIG1hY3JvIGlmIGl0J3Mgbm90IGFscmVhZHkgYSBrZXl3b3JkLgorICogZXhwbGljaXQsIGFzIGEgbnVsbCBtYWNybyBpZiBpdCdzIG5vdCBhbHJlYWR5IGEga2V5d29yZC4KKyAqIG5hbWVzcGFjZS1yZWxhdGVkIG1hY3JvcyAoX1NUTFBfU1RELCBfU1RMUF9CRUdJTl9OQU1FU1BBQ0UsIGV0Yy4pCisgKiBleGNlcHRpb24tcmVsYXRlZCBtYWNyb3MgKF9TVExQX1RSWSwgX1NUTFBfVU5XSU5ELCBldGMuKQorICogX1NUTFBfQVNTRVJULCBlaXRoZXIgYXMgYSB0ZXN0IG9yIGFzIGEgbnVsbCBtYWNybywgZGVwZW5kaW5nIG9uCisgICB3aGV0aGVyIG9yIG5vdCBfU1RMUF9BU1NFUlRJT05TIGlzIGRlZmluZWQuCisqLworCisvKiBEZWZpbml0aW9uIG9mIHRoZSAyIFNUTHBvcnQgZGVidWcgbGV2ZWxzICovCisjZGVmaW5lIF9TVExQX1NUTFBPUlRfREJHX0xFVkVMIDEKKyNkZWZpbmUgX1NUTFBfU1RBTkRBUkRfREJHX0xFVkVMIDIKKworLyogUGxhY2Vob2xkZXIgZm9yIHVzZXIgdG8gb3ZlcnJpZGUgc2V0dGluZ3MuCisgKiBJdCBjb3VsZCBiZSBhbHNvIHVzZWQgdG8gbWFzayBzZXR0aW5ncyBmcm9tCisgKiBkaWZmZXJlbnQgZGlyZWN0b3JpZXMuCisgKi8KKyNpbmNsdWRlIDxzdGwvY29uZmlnL3VzZXJfY29uZmlnLmg+CisKKyNpZiBkZWZpbmVkIChfU1RMUF9ERUJVRykgJiYgIWRlZmluZWQgKF9TVExQX0RFQlVHX0xFVkVMKQorIyAgZGVmaW5lIF9TVExQX0RFQlVHX0xFVkVMIF9TVExQX1NUTFBPUlRfREJHX0xFVkVMCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fQlVJTERJTkdfU1RMUE9SVCkKKy8qIEZvciB0aGUgU1RMcG9ydCBpbXBsZW1lbnRhdGlvbiB3ZSBjYW4gdXNlIGV2ZXJ5dGhpbmc6CisgKi8KKyMgIGlmIGRlZmluZWQgKF9TVExQX05PX0FOQUNIUk9OSVNNUykKKyMgICAgdW5kZWYgX1NUTFBfTk9fQU5BQ0hST05JU01TCisjICBlbmRpZgorIyAgaWYgZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKKyMgICAgdW5kZWYgX1NUTFBfTk9fRVhURU5TSU9OUworIyAgZW5kaWYKKy8qIE1vcmVvdmVyIHRoZXJlIGFyZSB0aGluZ3MgdGhhdCBoYXZlIG5vIHNlbnM6CisgKi8KKyMgIGlmIGRlZmluZWQgKF9TVExQX05PX0lPU1RSRUFNUykKKyMgICAgZXJyb3IgSWYgeW91IGRvIG5vdCB1c2UgaW9zdHJlYW1zIHlvdSBkbyBub3QgbmVlZCB0byBidWlsZCB0aGUgU1RMcG9ydCBsaWJyYXJ5LgorIyAgZW5kaWYKKyNlbmRpZgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qIFRoaXMgZmlsZSBpcyB1c2VkIGZvciBjb21wYXRpYmlsaXR5OyBpdCBhY2NlcHRzIG9sZC1zdHlsZSBjb25maWcKKyAgIHN3aXRjaGVzICovCisjaW5jbHVkZSA8c3RsL2NvbmZpZy9jb21wYXQuaD4KKworLyogQ29tbW9uIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgdGhpcyBwYXJ0aWN1bGFyIGluc3RhbGxhdGlvbi4gKi8KKyNpbmNsdWRlIDxzdGwvY29uZmlnL2hvc3QuaD4KKworLyogT3BlcmF0aW9uYWwgRW52aXJvbm1lbnQgc3BlY2lmaWMgKi8KKyNpbmNsdWRlIDxzdGwvY29uZmlnL19zeXN0ZW0uaD4KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qIHNvbWUgZml4ZXMgdG8gY29uZmlndXJhdGlvbi4gVGhpcyBhbHNvIGluY2x1ZGVzIG1vZGlmaWNhdGlvbnMKKyAqIG9mIFNUTHBvcnQgc3dpdGNoZXMgZGVwZW5kaW5nIG9uIGNvbXBpbGVyIGZsYWdzLAorICogb3Igc2V0dGluZ3MgYXBwbGljYWJsZSB0byBhIGdyb3VwIG9mIGNvbXBpbGVycywgc3VjaCBhcworICogdG8gYWxsIHdobyB1c2UgRURHIGZyb250LWVuZC4KKyAqLworI2luY2x1ZGUgPHN0bC9jb25maWcvc3RsX2NvbmZpeC5oPgorCisjaWYgIWRlZmluZWQgKF9TVExQX05PX01FTUJFUl9URU1QTEFURVMpICYmICFkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorIyAgZGVmaW5lIF9TVExQX01FTUJFUl9URU1QTEFURVMgMQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFX0NMQVNTRVMpICYmICFkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVfQ0xBU1NFUykKKyMgIGRlZmluZSBfU1RMUF9NRU1CRVJfVEVNUExBVEVfQ0xBU1NFUyAxCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX05PX01FTUJFUl9URU1QTEFURV9DTEFTU0VTKSAmJiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBQT1JUX1JFQklORF9NRU1CRVJfVEVNUExBVEUpCisjICBkZWZpbmUgX1NUTFBfRE9OVF9TVVBQT1JUX1JFQklORF9NRU1CRVJfVEVNUExBVEUgMQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikgJiYgIWRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pCisjICBkZWZpbmUgX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTiAxCisjZW5kaWYKKworI2lmICFkZWZpbmVkIChfU1RMUF9GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIpICYmICFkZWZpbmVkIChfU1RMUF9OT19GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIpCisjICBkZWZpbmUgX1NUTFBfRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSIDEKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfVVNFX1NIT1JUX1NUUklOR19PUFRJTSkgJiYgIWRlZmluZWQgKF9TVExQX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0pCisjICBkZWZpbmUgX1NUTFBfVVNFX1NIT1JUX1NUUklOR19PUFRJTSAxCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpICYmICFkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKSAmJiBcCisgICAhZGVmaW5lZCAoX1NUTFBfTk9fQ09OVEFJTkVSU19FWFRFTlNJT04pICYmICFkZWZpbmVkIChfU1RMUF9VU0VfQ09OVEFJTkVSU19FWFRFTlNJT04pCisjICBkZWZpbmUgX1NUTFBfVVNFX0NPTlRBSU5FUlNfRVhURU5TSU9OCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9DT05UQUlORVJTX0VYVEVOU0lPTikKKyMgIGRlZmluZSBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQgdGVtcGxhdGUgPGNsYXNzIF9LVD4KKyNlbHNlCisjICBkZWZpbmUgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QVFJfU1BFQ0lBTElaQVRJT05TKSAmJiBcCisgICAgKGRlZmluZWQgKF9TVExQX05PX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pICYmIGRlZmluZWQgKF9TVExQX0RPTlRfU0lNVUxBVEVfUEFSVElBTF9TUEVDX0ZPUl9UWVBFX1RSQUlUUykpCisjICBlcnJvciBTb3JyeSBidXQgYWNjb3JkaW5nIHRoZSBTVExwb3J0IHNldHRpbmdzIHlvdXIgY29tcGlsZXIgY2FuIG5vdCBzdXBwb3J0IHRoZSBwb2ludGVyIHNwZWNpYWxpemF0aW9uIGZlYXR1cmUuCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX1dIT0xFX05BVElWRV9TVEQpICYmIGRlZmluZWQgKF9TVExQX05PX09XTl9OQU1FU1BBQ0UpCisjICBlcnJvciBTb3JyeSBidXQgYXNraW5nIGZvciBib3RoIFNUTHBvcnQgdG8gYmUgaW4gdGhlIHJlYWwgc3RkIG5hbWVzcGFjZSBhbmQgYWxzbyBoYXZpbmcgU1RMcG9ydCBpbXBvcnQgYWxsIG5hdGl2ZSBzdGQgc3R1ZmYgXAorICBpcyBpbnZhbGlkLCBjaG9zZSBvbmUgb3Igbm9uZS4KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfVkVSQk9TRSkgJiYgIWRlZmluZWQgKF9TVExQX1ZFUkJPU0VfTU9ERV9TVVBQT1JURUQpCisjICBlcnJvciBTb3JyeSBidXQgdGhlIHZlcmJvc2UgbW9kZSBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIHlvdXIgY29tcGlsZXIuCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX05PX0lPU1RSRUFNUykgJiYgXAorICAgIWRlZmluZWQgKF9TVExQX1VTRV9ORVdBTExPQykgJiYgIWRlZmluZWQgKF9TVExQX1VTRV9NQUxMT0MpCisjICBkZWZpbmUgX1NUTFBfVVNFX05FV0FMTE9DCisjZW5kaWYKKworI2lmICFkZWZpbmVkIChfU1RMUF9CSUdfRU5ESUFOKSAmJiAhZGVmaW5lZCAoX1NUTFBfTElUVExFX0VORElBTikKKyMgIGlmIGRlZmluZWQgKF9NSVBTRUIpIHx8IGRlZmluZWQgKF9fc3BhcmMpIHx8IGRlZmluZWQgKF9BSVgpIHx8IFwKKyAgICAgIGRlZmluZWQgKF9faHB1eCkgfHwgZGVmaW5lZCAobWFjaW50b3NoKSB8fCBkZWZpbmVkIChfTUFDKQorIyAgICBkZWZpbmUgX1NUTFBfQklHX0VORElBTiAxCisjICBlbGlmIGRlZmluZWQgKF9faTM4NikgfHwgZGVmaW5lZCAoX01fSVg4NikgfHwgZGVmaW5lZCAoX01fQVJNKSB8fCBcCisgICAgICAgIGRlZmluZWQgKF9fYW1kNjRfXykgfHwgZGVmaW5lZCAoX01fQU1ENjQpIHx8IGRlZmluZWQgKF9feDg2XzY0X18pIHx8IFwKKyAgICAgICAgZGVmaW5lZCAoX19hbHBoYV9fKQorIyAgICBkZWZpbmUgX1NUTFBfTElUVExFX0VORElBTiAxCisjICBlbGlmIGRlZmluZWQgKF9faWE2NF9fKQorICAgIC8qIGl0YW5pdW0gYWxsb3dzIGJvdGggc2V0dGluZ3MgKGZvciBpbnN0YW5jZSB2aWEgZ2NjIC1tYmlnLWVuZGlhbikgLSBoZW5jZSBhIHNlcGVyYXRlIGNoZWNrIGlzIHJlcXVpcmVkICovCisjICAgIGlmIGRlZmluZWQgKF9fQklHX0VORElBTl9fKQorIyAgICAgIGRlZmluZSBfU1RMUF9CSUdfRU5ESUFOIDEKKyMgICAgZWxzZQorIyAgICAgIGRlZmluZSBfU1RMUF9MSVRUTEVfRU5ESUFOIDEKKyMgICAgZW5kaWYKKyMgIGVsc2UKKyMgICAgZXJyb3IgImNhbid0IGRldGVybWluZSBlbmRpYW5lc3MiCisjICBlbmRpZgorI2VuZGlmIC8qIF9TVExQX0JJR19FTkRJQU4gKi8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogZmluYWwgd29ya2Fyb3VuZCB0dW5pbmcgYmFzZWQgb24gZ2l2ZW4gZmxhZ3MKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworI2lmbmRlZiBfU1RMUF9VSU5UMzJfVAorIyAgZGVmaW5lIF9TVExQX1VJTlQzMl9UIHVuc2lnbmVkIGxvbmcKKyNlbmRpZgorI2lmbmRlZiBfU1RMUF9BQk9SVAorIyAgZGVmaW5lIF9TVExQX0FCT1JUKCkgYWJvcnQoKQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfSEFTX05PX05BTUVTUEFDRVMpCisjICBpZiBkZWZpbmVkIF9TVExQX05PX05BTUVTUEFDRVMKKyMgICAgdW5kZWYgX1NUTFBfVVNFX05BTUVTUEFDRVMKKyMgIGVsc2UKKy8qIGFzc3VtZSBpdCBhcyB0aGUgZGVmYXVsdCwgdHVybiBpdCBvZmYgbGF0ZXIgaWYgTk9fTkFNRVNQQUNFUyBzZWxlY3RlZCAqLworIyAgICB1bmRlZiBfU1RMUF9VU0VfTkFNRVNQQUNFUworIyAgICBkZWZpbmUgX1NUTFBfVVNFX05BTUVTUEFDRVMgMQorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfTk9fSU9TVFJFQU1TKQorIyAgZGVmaW5lIF9TVExQX1VTRV9OT19JT1NUUkVBTVMKKyNlbmRpZgorCisvKiBPcGVyYXRpbmcgc3lzdGVtIHJlY29nbml0aW9uIChiYXNpYykgKi8KKyNpZiAoZGVmaW5lZChfX3VuaXgpIHx8IGRlZmluZWQoX19saW51eF9fKSB8fCBkZWZpbmVkKF9fUU5YX18pIHx8IGRlZmluZWQoX0FJWCkgIHx8IGRlZmluZWQoX19OZXRCU0RfXykgfHwgZGVmaW5lZChfX09wZW5CU0RfXykgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykgfHwgZGVmaW5lZChfX0x5bnhfXykgfHwgZGVmaW5lZChfX2hwdXgpIHx8IGRlZmluZWQoX19zZ2kpKSAmJiBcCisgICAgICFkZWZpbmVkIChfU1RMUF9VTklYKQorIyAgZGVmaW5lIF9TVExQX1VOSVggMQorI2VuZGlmIC8qIF9fdW5peCAqLworCisjaWYgIWRlZmluZWQgKF9TVExQX05PX0xPTkdfRE9VQkxFKQorIyAgZGVmaW5lIF9TVExQX0xPTkdFU1RfRkxPQVRfVFlQRSBsb25nIGRvdWJsZQorI2Vsc2UKKyMgIGRlZmluZSBfU1RMUF9MT05HRVNUX0ZMT0FUX1RZUEUgZG91YmxlCisjZW5kaWYKKworLyogTmF0aXZlIGhlYWRlcnMgYWNjZXNzIG1hY3JvcyAqLworI2lmICFkZWZpbmVkIChfU1RMUF9IQVNfSU5DTFVERV9ORVhUKQorIyAgaW5jbHVkZSA8c3RsL2NvbmZpZy9fbmF0aXZlX2hlYWRlcnMuaD4KKyNlbmRpZgorCisvKiAgc2hhcmVkIGxpYnJhcnkgdHVuZS11cCAqLworCisjaWYgZGVmaW5lZCAoX19CVUlMRElOR19TVExQT1JUKQorLyogIGlmIHdlIGFyZSByZWJ1aWxkaW5nIHJpZ2h0IG5vdywgcGxhY2UgZXZlcnl0aGluZyBoZXJlICovCisjICB1bmRlZiAgX1NUTFBfREVTSUdOQVRFRF9ETEwKKyMgIGRlZmluZSBfU1RMUF9ERVNJR05BVEVEX0RMTCAxCisjZW5kaWYKKworLyogVXNlIG93biBuYW1lc3BhY2UgYWx3YXlzIGlmIHBvc3NpYmxlIGFuZCBub3QgZXhwbGljaXRseSBpbnN0cnVjdGVkIG90aGVyd2lzZSAqLworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9OQU1FU1BBQ0VTKSAmJiAhZGVmaW5lZCAoX1NUTFBfQlJPS0VOX1VTSU5HX0RJUkVDVElWRSkgJiYgXAorICAgIWRlZmluZWQgKF9TVExQX05PX09XTl9OQU1FU1BBQ0UpCisjICB1bmRlZiAgX1NUTFBfVVNFX09XTl9OQU1FU1BBQ0UKKyMgIGRlZmluZSBfU1RMUF9VU0VfT1dOX05BTUVTUEFDRSAgMQorI2Vsc2UKKyMgIHVuZGVmIF9TVExQX1dIT0xFX05BVElWRV9TVEQKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKF9OT1RIUkVBRFMpICYmICFkZWZpbmVkIChfU1RMUF9USFJFQURTX0RFRklORUQpCisKKyMgIGlmIGRlZmluZWQgKF9QVEhSRUFEUykKKyMgICAgZGVmaW5lIF9TVExQX1BUSFJFQURTCisjICAgIGRlZmluZSBfU1RMUF9USFJFQURTCisjICBlbmRpZgorIyAgaWYgZGVmaW5lZCAoX1VJVEhSRUFEUykKKyMgICAgZGVmaW5lIF9TVExQX1VJVEhSRUFEUworIyAgICBkZWZpbmUgX1NUTFBfVEhSRUFEUworIyAgZW5kaWYKKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfV0lOMzIpICYmICFkZWZpbmVkIChfU1RMUF9QVEhSRUFEUykKKyMgICAgZGVmaW5lIF9TVExQX1dJTjMyVEhSRUFEUyAxCisjICBlbGlmICgoZGVmaW5lZCAoX19zdW4pICYmICFkZWZpbmVkIChfX2xpbnV4X18pKSB8fCBkZWZpbmVkIChfVUlUSFJFQURTKSApICYmIFwKKyAgICAgICAgIWRlZmluZWQoX1NUTFBfUFRIUkVBRFMpCisjICAgIGRlZmluZSBfU1RMUF9VSVRIUkVBRFMKKyMgIGVsc2UKKyMgICAgZGVmaW5lIF9TVExQX1BUSFJFQURTCisjICBlbmRpZiAvKiBfX3NnaSAqLworIyAgZGVmaW5lIF9TVExQX1RIUkVBRFNfREVGSU5FRAorI2VuZGlmCisKKyNpZiAoZGVmaW5lZCAoX1JFRU5UUkFOVCkgfHwgZGVmaW5lZCAoX1RIUkVBRF9TQUZFKSkgJiYgIWRlZmluZWQgKF9TVExQX1RIUkVBRFMpCisjICBkZWZpbmUgX1NUTFBfVEhSRUFEUworI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfU1RBVElDX01VVEVYCisjICBkZWZpbmUgX1NUTFBfU1RBVElDX01VVEVYIF9TVExQX211dGV4X2Jhc2UKKyNlbmRpZgorCisjaWYgKGRlZmluZWQgKF9NRkNfVkVSKSB8fCBkZWZpbmVkIChfQUZYRExMKSkgJiYgIWRlZmluZWQgKF9TVExQX1VTRV9NRkMpCisjICBkZWZpbmUgX1NUTFBfVVNFX01GQyAxCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX1RIUkVBRFMpCisjICBkZWZpbmUgX1NUTFBfVk9MQVRJTEUgdm9sYXRpbGUKKyNlbHNlCisjICBkZWZpbmUgX1NUTFBfVk9MQVRJTEUKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKF9TVExQX1VTRV9ORVdfQ19IRUFERVJTKSAmJiAhZGVmaW5lZCAoX1NUTFBfSEFTX05PX05FV19DX0hFQURFUlMpCisjICBkZWZpbmUgX1NUTFBfVVNFX05FV19DX0hFQURFUlMKKyNlbmRpZgorLyogZGlzYWJsZSBuZXctc3R5bGUgaGVhZGVycyBpZiByZXF1ZXN0ZWQgKi8KKyNpZiBkZWZpbmVkIChfU1RMUF9OT19ORVdfQ19IRUFERVJTKQorIyAgdW5kZWYgX1NUTFBfVVNFX05FV19DX0hFQURFUlMKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfQkFTRV9UWVBFREVGX0JVRykKKyMgIHVuZGVmICBfU1RMUF9CQVNFX1RZUEVERUZfT1VUU0lERV9CVUcKKyMgIGRlZmluZSBfU1RMUF9CQVNFX1RZUEVERUZfT1VUU0lERV9CVUcgMQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9ORVNURURfVFlQRV9QQVJBTV9CVUcpCisjICBkZWZpbmUgX1NUTFBfR0xPQkFMX05FU1RFRF9SRVRVUk5fVFlQRV9QQVJBTV9CVUcKKyNlbmRpZgorCisvKiBTVU5wcm8gNC4yIGlubGluZSBzdHJpbmcgbGl0ZXJhbCBidWcgKi8KKyNpZmRlZiBfU1RMUF9JTkxJTkVfU1RSSU5HX0xJVEVSQUxfQlVHCisjICBkZWZpbmUgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9feCkgX194ID0gX194OworI2Vsc2UKKyMgIGRlZmluZSBfU1RMUF9GSVhfTElURVJBTF9CVUcoX194KQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9OT05fVFlQRV9UTVBMX1BBUkFNX0JVRykKKyMgIHVuZGVmICBfU1RMUF9OT19ERUZBVUxUX05PTl9UWVBFX1BBUkFNCisjICBkZWZpbmUgX1NUTFBfTk9fREVGQVVMVF9OT05fVFlQRV9QQVJBTSAxCisjZW5kaWYKKworI2lmICFkZWZpbmVkIChfU1RMUF9TVEFUSUNfQVNTRVJUKQorLyogU29tZSBjb21waWxlciBzdXBwb3J0IDAgc2l6ZSBhcnJheSBzbyB3ZSB1c2UgbmVnYXRpdmUgc2l6ZSBhcnJheSB0byBnZW5lcmF0ZQorICogYSBjb21waWxhdGlvbiB0aW1lIGVycm9yLgorICovCisjICBkZWZpbmUgX1NUTFBfU1RBVElDX0FTU0VSVChleHByKSB0eXBlZGVmIGNoYXIgX19zdGF0aWNfYXNzZXJ0W2V4cHIgPyAxIDogLTFdOworI2VuZGlmCisKKy8qIGFwcGxlIG1wdyBleGNlcHRpb24gaGFuZGxpbmcgYnVnICovCisjaWZuZGVmIF9TVExQX01QV0ZJWF9UUlkKKyMgIGRlZmluZSBfU1RMUF9NUFdGSVhfVFJZCisjZW5kaWYKKyNpZm5kZWYgX1NUTFBfTVBXRklYX0NBVENICisjICBkZWZpbmUgX1NUTFBfTVBXRklYX0NBVENICisjZW5kaWYKKyNpZm5kZWYgX1NUTFBfTVBXRklYX0NBVENIX0FDVElPTgorIyAgZGVmaW5lIF9TVExQX01QV0ZJWF9DQVRDSF9BQ1RJT04oYWN0aW9uKQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfV0VBSykKKyMgIGRlZmluZSBfU1RMUF9XRUFLCisjZW5kaWYKKworLyogZGVmYXVsdCBwYXJhbWV0ZXJzIGFzIHRlbXBsYXRlIHR5cGVzIGRlcml2ZWQgZnJvbSBhcmd1bWVudHMgKCBub3QgYWx3YXlzIHN1cHBvcnRlZCApICovCisjaWYgZGVmaW5lZCAoX1NUTFBfTElNSVRFRF9ERUZBVUxUX1RFTVBMQVRFUykKKyMgIGRlZmluZSBfU1RMUF9ERkxfVE1QTF9QQVJBTSggY2xhc3NuYW1lLCBkZWZ2YWwgKSBjbGFzcyBjbGFzc25hbWUKKyNlbHNlCisjICBpZiAhZGVmaW5lZCAoX1NUTFBfREVGQVVMVF9UWVBFX1BBUkFNKQorIyAgICBkZWZpbmUgX1NUTFBfREVGQVVMVF9UWVBFX1BBUkFNIDEKKyMgIGVuZGlmCisjICBkZWZpbmUgX1NUTFBfREZMX1RNUExfUEFSQU0oIGNsYXNzbmFtZSwgZGVmdmFsICkgY2xhc3MgY2xhc3NuYW1lID0gZGVmdmFsCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX0xJTUlURURfREVGQVVMVF9URU1QTEFURVMpCisjICBkZWZpbmUgX1NUTFBfREVGQVVMVF9QQUlSX0FMTE9DQVRPUl9TRUxFQ1QoX0tleSwgX1RwICkgY2xhc3MgX0FsbG9jCisjZWxzZQorIyAgZGVmaW5lIF9TVExQX0RFRkFVTFRfUEFJUl9BTExPQ0FUT1JfU0VMRUNUKF9LZXksIF9UcCApIFwKKyAgICAgICAgICAgIGNsYXNzIF9BbGxvYyA9IGFsbG9jYXRvcjwgcGFpciA8IF9LZXksIF9UcCA+ID4KKyNlbmRpZgorCisvKiBkZWZhdWx0IHBhcmFtZXRlcnMgYXMgY29tcGxldGUgdHlwZXMgKi8KKyNpZiBkZWZpbmVkIChfU1RMUF9ERUZBVUxUX1RZUEVfUEFSQU0pCisjICBkZWZpbmUgX1NUTFBfREZMX1RZUEVfUEFSQU0oIGNsYXNzbmFtZSwgZGVmdmFsICkgY2xhc3MgY2xhc3NuYW1lID0gZGVmdmFsCisjICBkZWZpbmUgX1NUTFBfREZMX05PTl9UWVBFX1BBUkFNKHR5cGUsbmFtZSx2YWwpIHR5cGUgbmFtZSA9IHZhbAorI2Vsc2UKKyMgIGRlZmluZSBfU1RMUF9ERkxfVFlQRV9QQVJBTSggY2xhc3NuYW1lLCBkZWZ2YWwgKSBjbGFzcyBjbGFzc25hbWUKKyMgIGRlZmluZSBfU1RMUF9ERkxfTk9OX1RZUEVfUEFSQU0odHlwZSxuYW1lLHZhbCkgdHlwZSBuYW1lCisjZW5kaWYKKworLyogU0dJIGNvbXBhdGliaWxpdHkgKi8KKworI2lmZGVmIF9TVExQX05PX1dDSEFSX1QKKyMgIGlmbmRlZiBfU1RMUF9OT19OQVRJVkVfV0lERV9TVFJFQU1TCisjICAgIGRlZmluZSAgX1NUTFBfTk9fTkFUSVZFX1dJREVfU1RSRUFNUyAxCisjICBlbmRpZgorI2Vsc2UKKyMgIGRlZmluZSBfU1RMUF9IQVNfV0NIQVJfVCAxCisjZW5kaWYKKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19BVF9NRU1CRVJfRlVOQ1RJT04pCisjICBkZWZpbmUgX1NUTFBfQ0FOX1RIUk9XX1JBTkdFX0VSUk9SUyAxCisjZW5kaWYKKworLyogZGVidWcgbW9kZSB0b29sICovCisjaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpCisjICBkZWZpbmUgX1NUTFBfTk9OX0RCR19OQU1FKFgpIF9Ob25EYmdfIyNYCisjZW5kaWYKKworLyogcG9pbnRlciBzcGVjaWFsaXphdGlvbiB0b29sICovCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BUUl9TUEVDSUFMSVpBVElPTlMpCisjICBkZWZpbmUgX1NUTFBfUFRSX0lNUExfTkFNRShYKSBfSW1wbF8jI1gKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX01TVkM2X01FTV9UX0JVR19XT1JLQVJPVU5EKSB8fCBcCisgICAgZGVmaW5lZCAoX1NUTFBfU0lHTkFMX1JVTlRJTUVfQ09NUEFUSUJJTElUWSkgfHwgZGVmaW5lZCAoX1NUTFBfQ0hFQ0tfUlVOVElNRV9DT01QQVRJQklMSVRZKQorIyAgZGVmaW5lIF9TVExQX05PX01FTV9UX05BTUUoWCkgX05vTWVtVF8jI1gKKyNlbmRpZgorCisvKiB0aGlzIGFsd2F5cyBtZWFuIHRoZSBDIGxpYnJhcnkgaXMgaW4gZ2xvYmFsIG5hbWVzcGFjZSAqLworI2lmIGRlZmluZWQgKF9TVExQX0hBU19OT19ORVdfQ19IRUFERVJTKSAmJiAhZGVmaW5lZCAoX1NUTFBfVkVORE9SX0dMT0JBTF9DU1REKQorIyAgZGVmaW5lIF9TVExQX1ZFTkRPUl9HTE9CQUxfQ1NURCAxCisjZW5kaWYKKworLyogRGVwZW5kaW5nIG9mIHdoZXRoZXIgY29tcGlsZXIgc3VwcG9ydHMgbmFtZXNwYWNlcywKKyAqIHR1bmUgdGhlIHBhcmFtZXRlcnMgZm9yIHZlbmRvci1zdXBwbGllZCBsaWJyYXJpZXMuCisgKiBUaGlzIHNlY3Rpb24gaXMgZ3VhcmRlZCBieSBfU1RMUF9IQVNfTk9fTkFNRVNQQUNFUywgbm90IGJ5IF9TVExQX1VTRV9OQU1FU1BBQ0VTLAorICogc2luY2UgaXQgZGVwZW5kcyBvbmx5IG9uIHRoZSBuYXRpdmUgZmVhdHVyZXMsIG5vdCBvbiB1c2VyJ3MgcHJlZmVyZW5jZSB3aGV0aGVyCisgKiB0byB1c2UgbmFtZXNwYWNlIGZvciBTVExwb3J0IG9yIG5vdC4KKyAqLworI2lmICFkZWZpbmVkIChfU1RMUF9IQVNfTk9fTkFNRVNQQUNFUykKKy8qIEltcG9ydCBzb21lIHZlbmRvcidzIGhlYWRlcnMgaW50byBjb3JyZXNwb25kaW5nIFNUTHBvcnQgb25lcyBpZiB0aGV5IG1pZ2h0IGJlIG5lZWRlZAorICogKGlmIHdlIHdyYXAgbmF0aXZlIGlvc3RyZWFtcyBhbmQgdXNlIG5hbWVwYWNlIG90aGVyIHRoYW4gc3RkOjopICovCisjICBpZiBkZWZpbmVkIChfU1RMUF9XSE9MRV9OQVRJVkVfU1REKQorIyAgICBkZWZpbmUgIF9TVExQX0lNUE9SVF9WRU5ET1JfU1REIDEKKyMgIGVuZGlmCisKKy8qIGlmIHVzaW5nIHN0bHBvcnQ6OiBuYW1lc3BhY2Ugb3IgaWYgQyBsaWJyYXJ5IHN0dWZmIGlzIG5vdCBpbiB2ZW5kb3IncyBzdGQ6OiwKKyAqIHRyeSBpbXBvcnRpbmcgJ2VtLgorICogTVNWQyBoYXMgYW1iaWd1aXR5IHByb2JsZW0gd2hlbiB3ZSB0cnkgdG8gaW1wb3J0IEMtc3R5bGUgc3RkOjogc3R1ZmYgYmFjayBpbnRvIGdsb2JhbCBuYW1lc3BhY2UgKi8KKyMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9OQU1FU1BBQ0VTKSAmJiAoZGVmaW5lZChfU1RMUF9VU0VfT1dOX05BTUVTUEFDRSkgfHwgZGVmaW5lZCAoX1NUTFBfVkVORE9SX0dMT0JBTF9DU1REKSkKKyMgICAgZGVmaW5lICBfU1RMUF9JTVBPUlRfVkVORE9SX0NTVEQgMQorIyAgZW5kaWYKKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfTk9fVVNJTkdfRk9SX0dMT0JBTF9GVU5DVElPTlMpICYmICFkZWZpbmVkIChfU1RMUF9ET19JTVBPUlRfQ1NURF9GVU5DVElPTlMpCisjICAgIGRlZmluZSBfU1RMUF9OT19DU1REX0ZVTkNUSU9OX0lNUE9SVFMKKyMgIGVuZGlmCisKKyMgIGRlZmluZSBfU1RMUF9VU0lOR19OQU1FU1BBQ0UoeCkgdXNpbmcgbmFtZXNwYWNlIHggOworCituYW1lc3BhY2Ugc3RkIHsgfQorbmFtZXNwYWNlIF9fc3RkX2FsaWFzID0gc3RkOworCisvKiBhc3N1bWUgc3RkOjogbmFtZXNwYWNlIGZvciBDKysgc3RkIGxpYnJhcnkgaWYgbm90IGJlaW5nIHRvbGQgb3RoZXJ3aXNlICovCisjICBpZiBkZWZpbmVkIChfU1RMUF9WRU5ET1JfR0xPQkFMX1NURCkKKyMgICAgZGVmaW5lIF9TVExQX1ZFTkRPUl9TVEQKKyMgIGVsc2UKKyMgICAgZGVmaW5lIF9TVExQX1ZFTkRPUl9TVEQgc3RkCisjICBlbmRpZgorCisvKiB0dW5lIHRoaW5ncyB0aGF0IGNvbWUgZnJvbSBDIGxpYnJhcnkgKi8KKyMgIGlmICBkZWZpbmVkIChfU1RMUF9WRU5ET1JfR0xPQkFMX0NTVEQpIHx8ICFkZWZpbmVkKF9TVExQX1VTRV9ORVdfQ19IRUFERVJTKQorLyogIGluIG9sZC1zdHlsZSBoZWFkZXJzLCBDIGZ1bmN0aW9ucyBnbyB0byBnbG9iYWwgc2NvcGUuICovCisjICAgIGRlZmluZSBfU1RMUF9WRU5ET1JfQ1NURAorIyAgICBkZWZpbmUgX1NUTFBfVVNJTkdfVkVORE9SX0NTVEQKKyMgIGVsc2UKKyMgICAgZGVmaW5lIF9TVExQX1ZFTkRPUl9DU1REICBfU1RMUF9WRU5ET1JfU1RECisjICAgIGRlZmluZSBfU1RMUF9VU0lOR19WRU5ET1JfQ1NURCBfU1RMUF9VU0lOR19OQU1FU1BBQ0UoX1NUTFBfVkVORE9SX0NTVEQpCisjICBlbmRpZiAvKiBfU1RMUF9WRU5ET1JfQ1NURCAqLworLyogZXhjZXB0aW9uLCB0eXBlaW5mbywgbmV3IC0gYWx3YXlzIGNvbWUgZnJvbSB0aGUgdmVuZG9yICovCisjICBpZiAhZGVmaW5lZCAoX1NUTFBfVkVORE9SX0VYQ0VQVF9TVEQpCisjICAgIGlmIGRlZmluZWQgKF9TVExQX1ZFTkRPUl9HTE9CQUxfRVhDRVBUX1NURCkKKyMgICAgICBkZWZpbmUgX1NUTFBfVkVORE9SX0VYQ0VQVF9TVEQKKyMgICAgZWxzZQorIyAgICAgIGRlZmluZSBfU1RMUF9WRU5ET1JfRVhDRVBUX1NURCBfU1RMUF9WRU5ET1JfU1RECisjICAgIGVuZGlmCisjICBlbmRpZgorIyAgZGVmaW5lIF9TVExQX09MRF9JT19OQU1FU1BBQ0UKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9WRU5ET1JfTUJfTkFNRVNQQUNFKQorIyAgICBkZWZpbmUgX1NUTFBfVkVORE9SX01CX05BTUVTUEFDRSBfU1RMUF9WRU5ET1JfQ1NURAorIyAgZW5kaWYKKyNlbHNlCisvKiBjb21waWxlciBoYXMgbm8gbmFtZXNwYWNlIHN1cHBvcnQgKi8KKyMgIGRlZmluZSBfU1RMUF9WRU5ET1JfU1RECisjICBkZWZpbmUgX1NUTFBfVkVORE9SX0NTVEQKKyMgIGRlZmluZSBfU1RMUF9VU0lOR19OQU1FU1BBQ0UoeCkKKyMgIGRlZmluZSBfU1RMUF9VU0lOR19WRU5ET1JfQ1NURAorIyAgZGVmaW5lIF9TVExQX1ZFTkRPUl9FWENFUFRfU1RECisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9OQU1FU1BBQ0VTKQorCisjICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfT1dOX05BTUVTUEFDRSkKKyMgICAgaWYgIWRlZmluZWQgKF9TVExQX1NURF9OQU1FKQorIyAgICAgIGlmICFkZWZpbmVkIChfU1RMUF9ERUJVRykKKyMgICAgICAgIGlmICFkZWZpbmVkIChfU1RMUF9VU0lOR19DUk9TU19OQVRJVkVfUlVOVElNRV9MSUIpCisjICAgICAgICAgIGlmbmRlZiBfU1RMUF9USFJFQURTCisjICAgICAgICAgICAgZGVmaW5lIF9TVExQX1NURF9OQU1FICBzdGxwbXR4X3N0ZAorIyAgICAgICAgICBlbHNlCisjICAgICAgICAgICAgZGVmaW5lIF9TVExQX1NURF9OQU1FICBzdGxwX3N0ZAorIyAgICAgICAgICBlbmRpZgorIyAgICAgICAgZWxzZQorIyAgICAgICAgICBpZm5kZWYgX1NUTFBfVEhSRUFEUworIyAgICAgICAgICAgIGRlZmluZSBfU1RMUF9TVERfTkFNRSAgc3RscHhtdHhfc3RkCisjICAgICAgICAgIGVsc2UKKyMgICAgICAgICAgICBkZWZpbmUgX1NUTFBfU1REX05BTUUgIHN0bHB4X3N0ZAorIyAgICAgICAgICBlbmRpZgorIyAgICAgICAgZW5kaWYKKyMgICAgICBlbHNlCisvKgorICogVGhlIFNUTHBvcnQgZGVidWcgbW9kZSBpcyBiaW5hcnkgaW5jb21wYXRpYmxlIHdpdGggdGhlIG90aGVyIG1vZGVzLAorICogbGV0cyBtYWtlIGl0IGNsZWFyIG9uIHRoZSBTVExwb3J0IG5hbWVzcGFjZSB0byBnZW5lcmF0ZSBsaW5rIGVycm9ycyByYXRoZXIKKyAqIHRoYW4gcnVudGltZSBvbmVzLgorICovCisjICAgICAgICBpZiAhZGVmaW5lZCAoX1NUTFBfVVNJTkdfQ1JPU1NfTkFUSVZFX1JVTlRJTUVfTElCKQorIyAgICAgICAgICBpZm5kZWYgX1NUTFBfVEhSRUFEUworIyAgICAgICAgICAgIGRlZmluZSBfU1RMUF9TVERfTkFNRSAgc3RscGRtdHhfc3RkCisjICAgICAgICAgIGVsc2UKKyMgICAgICAgICAgICBkZWZpbmUgX1NUTFBfU1REX05BTUUgIHN0bHBkX3N0ZAorIyAgICAgICAgICBlbmRpZgorIyAgICAgICAgZWxzZQorIyAgICAgICAgICBpZm5kZWYgX1NUTFBfVEhSRUFEUworIyAgICAgICAgICAgIGRlZmluZSBfU1RMUF9TVERfTkFNRSAgc3RscGR4bXR4X3N0ZAorIyAgICAgICAgICBlbHNlCisjICAgICAgICAgICAgZGVmaW5lIF9TVExQX1NURF9OQU1FICBzdGxwZHhfc3RkCisjICAgICAgICAgIGVuZGlmCisjICAgICAgICBlbmRpZgorIyAgICAgIGVuZGlmCisjICAgIGVuZGlmCituYW1lc3BhY2UgX1NUTFBfU1REX05BTUUgeyB9CisjICBlbHNlCisjICAgIGRlZmluZSBfU1RMUF9TVERfTkFNRSBzdGQKKyMgIGVuZGlmIC8qIF9TVExQX1VTRV9PV05fTkFNRVNQQUNFICovCisKKyMgIGRlZmluZSBfU1RMUF9CRUdJTl9OQU1FU1BBQ0UgbmFtZXNwYWNlIF9TVExQX1NURF9OQU1FIHsKKyMgIGRlZmluZSBfU1RMUF9CRUdJTl9UUjFfTkFNRVNQQUNFIG5hbWVzcGFjZSB0cjEgeworIyAgZGVmaW5lIF9TVExQX0VORF9OQU1FU1BBQ0UgfQorCisvKiBkZWNpZGUgd2hldGhlciBvciBub3Qgd2UgdXNlIHNlcGFyYXRlIG5hbWVzcGFjZSBmb3IgcmVsIG9wcyAqLworIyAgaWYgZGVmaW5lZCAoX1NUTFBfTk9fUkVMT1BTX05BTUVTUEFDRSkKKyMgICAgZGVmaW5lIF9TVExQX0JFR0lOX1JFTE9QU19OQU1FU1BBQ0UgX1NUTFBfQkVHSU5fTkFNRVNQQUNFIG5hbWVzcGFjZSByZWxfb3BzIHt9CisjICAgIGRlZmluZSBfU1RMUF9FTkRfUkVMT1BTX05BTUVTUEFDRSB9CisjICBlbHNlCisvKiBVc2Ugc3RkOjpyZWxfb3BzIG5hbWVzcGFjZSAqLworIyAgICBkZWZpbmUgX1NUTFBfQkVHSU5fUkVMT1BTX05BTUVTUEFDRSBfU1RMUF9CRUdJTl9OQU1FU1BBQ0UgbmFtZXNwYWNlIHJlbF9vcHMgeworIyAgICBkZWZpbmUgX1NUTFBfRU5EX1JFTE9QU19OQU1FU1BBQ0UgfSB9CisjICAgIGRlZmluZSBfU1RMUF9VU0VfU0VQQVJBVEVfUkVMT1BTX05BTUVTUEFDRQorIyAgZW5kaWYgLyogVXNlIHN0ZDo6cmVsX29wcyBuYW1lc3BhY2UgKi8KKworIyAgZGVmaW5lIF9TVExQX1NURCA6Ol9TVExQX1NURF9OQU1FCisjICBpZiAhZGVmaW5lZCAoX1NUTFBfVFIxKQorIyAgICBkZWZpbmUgX1NUTFBfVFIxIF9TVExQX1NURDo6dHIxOjoKKyMgIGVuZGlmCisKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9ET05UX1VTRV9QUklWX05BTUVTUEFDRSkKKyMgICAgZGVmaW5lIF9TVExQX1BSSVZfTkFNRSBwcml2CisjICAgIGRlZmluZSBfU1RMUF9QUklWIF9TVExQX1NURDo6X1NUTFBfUFJJVl9OQU1FOjoKKyMgICAgZGVmaW5lIF9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UgbmFtZXNwYWNlIF9TVExQX1BSSVZfTkFNRSB7CisjICAgIGRlZmluZSBfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UgfQorIyAgZWxzZQorIyAgICAgIGlmICFkZWZpbmVkIChfU1RMUF9QUklWKQorIyAgICAgICAgZGVmaW5lIF9TVExQX1BSSVYgX1NUTFBfU1REOjoKKyMgICAgICBlbmRpZgorIyAgICBkZWZpbmUgX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorIyAgICBkZWZpbmUgX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisjICBlbmRpZgorCisvKiBPZmZpY2lhbCBTVExwb3J0IG5hbWVzcGFjZSB3aGVuIHN0ZCBpcyBub3QgcmVkZWZpbmVkLgorICogSGVyZSB3ZSBkb24ndCB1c2UgYSBtYWNybyBiZWNhdXNlIHdlIGRvIG5vdCBuZWVkIGl0IGFuZCBiZWNhdXNlCisgKiBzdGxwb3J0IGlzIHVzZWQgYXMgZmlsZSBuYW1lIGJ5IGJvb3N0IGFuZCBmb2xkZXIgbmFtZSB1bmRlciBiZW9zOgorICovCituYW1lc3BhY2Ugc3RscG9ydCA9IF9TVExQX1NURF9OQU1FOworCisvKiBCYWNrd2FyZCBjb21wYXRpYmlsaXR5OgorICovCituYW1lc3BhY2UgX1NUTCA9IF9TVExQX1NURF9OQU1FOworI3VuZGVmIF9fU1RMUE9SVF9OQU1FU1BBQ0UKKyNkZWZpbmUgX19TVExQT1JUX05BTUVTUEFDRSBfU1RMUF9TVERfTkFNRQorCisjZWxzZSAvKiBfU1RMUF9VU0VfTkFNRVNQQUNFUyAqLworLyogU1RMcG9ydCBpcyBiZWluZyBwdXQgaW50byBnbG9iYWwgbmFtZXNwYWNlICovCisjICBkZWZpbmUgX1NUTFBfU1RECisjICBkZWZpbmUgX1NUTFBfUFJJVgorIyAgZGVmaW5lIF9TVExQX1RSMQorIyAgZGVmaW5lIF9TVExQX0JFR0lOX05BTUVTUEFDRQorIyAgZGVmaW5lIF9TVExQX0JFR0lOX1RSMV9OQU1FU1BBQ0UKKyMgIGRlZmluZSBfU1RMUF9FTkRfTkFNRVNQQUNFCisjICBkZWZpbmUgX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorIyAgZGVmaW5lIF9TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCisvKiBib3JpcyA6IGl0IHdhcyBmb3VuZCBvdXQgdGhhdCBfU1RMUF9VU0VfU0VQQVJBVEVfUkVMT1BTX05BTUVTUEFDRQorICAgY2F1c2VzIGxlc3MgcHJvYmxlbXMgdGhhbiBoYXZpbmcgcmVsYXRpb25hbCBvcGVyYXRvciB0ZW1wbGF0ZXMgaW4gZ2xvYmFsIG5hbWVzcGFjZQorICAgUGxlYXNlIGRlZmluZSBfU1RMUF9OT19SRUxPUFNfTkFNRVNQQUNFIGluIGNvbmZpZy91c2VyX2NvbmZpZy5oIGlmIHlvdXIgY29kZSByZWx5IG9uIHRoZW0uICovCisjICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fUkVMT1BTX05BTUVTUEFDRSkKKyMgICAgZGVmaW5lIF9TVExQX1VTRV9TRVBBUkFURV9SRUxPUFNfTkFNRVNQQUNFCisjICBlbmRpZgorIyAgZGVmaW5lIF9TVExQX0JFR0lOX1JFTE9QU19OQU1FU1BBQ0UKKyMgIGRlZmluZSBfU1RMUF9FTkRfUkVMT1BTX05BTUVTUEFDRQorIyAgdW5kZWYgIF9TVExQX1VTRV9PV05fTkFNRVNQQUNFCisjZW5kaWYgIC8qIF9TVExQX1VTRV9OQU1FU1BBQ0VTICovCisKKyNkZWZpbmUgU1RMUE9SVF9DU1REIF9TVExQX1ZFTkRPUl9DU1RECisjZGVmaW5lIFNUTFBPUlQgICAgICBfU1RMUF9TVERfTkFNRQorCisjaWYgZGVmaW5lZChfU1RMUF9CT0dVU19URU1QTEFURV9UWVBFX01BVENISU5HX0JVRykKKyMgIGRlZmluZSBfU1RMUF9TSU1QTEVfVFlQRShUKSBfc3RsX3RyaXZpYWxfcHJveHk8VD4KKyNlbHNlCisjICBkZWZpbmUgX1NUTFBfU0lNUExFX1RZUEUoVCkgVAorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfUkFORDQ4CisjICBkZWZpbmUgX1NUTFBfTk9fRFJBTkQ0OAorI2VuZGlmCisKKy8qIGFkdmFuY2VkIGtleXdvcmRzIHVzYWdlICovCisjZGVmaW5lIF9fQ19DQVNUKF9feCwgX195KSAoKF9feCkoX195KSkKKyNpZm5kZWYgIF9TVExQX05PX05FV19TVFlMRV9DQVNUUworIyAgZGVmaW5lIF9fQ09OU1RfQ0FTVChfX3gsX195KSBjb25zdF9jYXN0PF9feD4oX195KQorIyAgZGVmaW5lIF9fU1RBVElDX0NBU1QoX194LF9feSkgc3RhdGljX2Nhc3Q8X194PihfX3kpCisjICBkZWZpbmUgX19SRUlOVEVSUFJFVF9DQVNUKF9feCxfX3kpIHJlaW50ZXJwcmV0X2Nhc3Q8X194PihfX3kpCisjZWxzZQorIyAgZGVmaW5lIF9fU1RBVElDX0NBU1QoX194LF9feSkgX19DX0NBU1QoX194LCBfX3kpCisjICBkZWZpbmUgX19DT05TVF9DQVNUKF9feCxfX3kpIF9fQ19DQVNUKF9feCwgX195KQorIyAgZGVmaW5lIF9fUkVJTlRFUlBSRVRfQ0FTVChfX3gsX195KSBfX0NfQ0FTVChfX3gsIF9feSkKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfTkVFRF9UWVBFTkFNRSkgJiYgISBkZWZpbmVkICh0eXBlbmFtZSkKKyMgIGRlZmluZSB0eXBlbmFtZQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9ORUVEX1RZUEVOQU1FKSB8fCBkZWZpbmVkIChfU1RMUF9OT19UWVBFTkFNRV9PTl9SRVRVUk5fVFlQRSApCisjICBkZWZpbmUgX1NUTFBfVFlQRU5BTUVfT05fUkVUVVJOX1RZUEUKKyNlbHNlCisjICBkZWZpbmUgX1NUTFBfVFlQRU5BTUVfT05fUkVUVVJOX1RZUEUgdHlwZW5hbWUKKyNlbmRpZgorCisjaWZkZWYgX1NUTFBfTk9fVFlQRU5BTUVfSU5fVEVNUExBVEVfSEVBREVSCisjICBkZWZpbmUgX1NUTFBfSEVBREVSX1RZUEVOQU1FCisjZWxzZQorIyAgZGVmaW5lIF9TVExQX0hFQURFUl9UWVBFTkFNRSB0eXBlbmFtZQorI2VuZGlmCisKKyNpZmRlZiBfU1RMUF9OT19UWVBFTkFNRV9CRUZPUkVfTkFNRVNQQUNFCisjICBkZWZpbmUgX1NUTFBfVFlQRU5BTUUKKyNlbHNlCisjICBkZWZpbmUgX1NUTFBfVFlQRU5BTUUgdHlwZW5hbWUKKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX05PX01FTUJFUl9URU1QTEFURV9LRVlXT1JECisjICBkZWZpbmUgX1NUTFBfVEVNUExBVEUgdGVtcGxhdGUKKyNlbHNlCisjICBkZWZpbmUgX1NUTFBfVEVNUExBVEUKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX0NPTlRBSU5FUlNfRVhURU5TSU9OKQorIyAgZGVmaW5lIF9TVExQX0tFWV9UWVBFX0ZPUl9DT05UX0VYVCh0eXBlKQorIyAgZGVmaW5lIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVCB0ZW1wbGF0ZSA8Y2xhc3MgX0tUPgorI2Vsc2UKKyMgIGRlZmluZSBfU1RMUF9LRVlfVFlQRV9GT1JfQ09OVF9FWFQodHlwZSkgdHlwZWRlZiB0eXBlIF9LVDsKKyMgIGRlZmluZSBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfTkVFRF9FWFBMSUNJVCkgJiYgIWRlZmluZWQgKGV4cGxpY2l0KQorIyAgZGVmaW5lIGV4cGxpY2l0CisjZW5kaWYKKworI2lmICFkZWZpbmVkIChfU1RMUF9ORUVEX01VVEFCTEUpCisjICBkZWZpbmUgX1NUTFBfTVVUQUJMRSh0eXBlLCB4KSB4CisjZWxzZQorIyAgZGVmaW5lIF9TVExQX01VVEFCTEUodHlwZSwgeCkgX19DT05TVF9DQVNUKHR5cGUqLCB0aGlzKS0+eAorIyAgZGVmaW5lIG11dGFibGUKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfTk9fU0lHTkVEX0JVSUxUSU5TKQorLyogb2xkIEhQLVVYIGRvZXNuJ3QgdW5kZXJzdGFuZCAic2lnbmVkIiBrZXl3b3JkICovCisjICBkZWZpbmUgc2lnbmVkCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX0xPT1BfSU5MSU5FX1BST0JMRU1TKQorIyAgZGVmaW5lIF9TVExQX0lOTElORV9MT09QCisjZWxzZQorIyAgZGVmaW5lIF9TVExQX0lOTElORV9MT09QIGlubGluZQorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfTk9fUEFSVElBTF9TUEVDSUFMSVpBVElPTl9TWU5UQVgKKyMgIGRlZmluZSBfU1RMUF9URU1QTEFURV9OVUxMIHRlbXBsYXRlPD4KKyNlbHNlCisjICBkZWZpbmUgX1NUTFBfVEVNUExBVEVfTlVMTAorI2VuZGlmCisKKyNpZmRlZiBfU1RMUF9GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIKKyMgIGRlZmluZSBfU1RMUF9PUEVSQVRPUl9URU1QTEFURQorI2Vsc2UKKyMgIGRlZmluZSBfU1RMUF9PUEVSQVRPUl9URU1QTEFURSBfU1RMUF9URU1QTEFURV9OVUxMCisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OCisvKiB1bmxlc3Mgd2UgaGF2ZSBvdGhlciBjb21waWxlciBwcm9ibGVtLCB0cnkgc2ltdWxhdGluZyBwYXJ0aWFsIHNwZWMgaGVyZSAqLworIyAgaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfU0lNVUxBVEVfUEFSVElBTF9TUEVDX0ZPUl9UWVBFX1RSQUlUUykKKyMgICAgZGVmaW5lIF9TVExQX1NJTVVMQVRFX1BBUlRJQUxfU1BFQ19GT1JfVFlQRV9UUkFJVFMKKyMgIGVuZGlmCisvKiBGb3IgeW91ciBvd24gaXRlcmF0b3JzLCBwbGVhc2UgdXNlIGluaGVyaXRhbmNlIGZyb20gaXRlcmF0b3I8PiBpbnN0ZWFkIG9mIHRoZXNlIG9ic29sZXRlIHF1ZXJpZXMuICovCisjICBpZiAgKGRlZmluZWQgKF9TVExQX05FU1RFRF9UWVBFX1BBUkFNX0JVRykgfHwgIWRlZmluZWQgKF9TVExQX1NJTVVMQVRFX1BBUlRJQUxfU1BFQ19GT1JfVFlQRV9UUkFJVFMpKQorIyAgICBpZiAhIGRlZmluZWQgKCBfU1RMUF9VU0VfT0xEX0hQX0lURVJBVE9SX1FVRVJJRVMgKQorIyAgICAgIGRlZmluZSBfU1RMUF9VU0VfT0xEX0hQX0lURVJBVE9SX1FVRVJJRVMKKyMgICAgZW5kaWYKKyMgIGVsaWYgZGVmaW5lZCAoIF9TVExQX05PX0FOQUNIUk9OSVNNUyApCisjICAgIHVuZGVmIF9TVExQX1VTRV9PTERfSFBfSVRFUkFUT1JfUVVFUklFUworIyAgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX05PX0VYUExJQ0lUX0ZVTkNUSU9OX1RNUExfQVJHUworIyAgZGVmaW5lIF9TVExQX05VTExfVE1QTF9BUkdTIDw+CisjIGVsc2UKKyMgIGRlZmluZSBfU1RMUF9OVUxMX1RNUExfQVJHUworI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfQUxMT0NBVE9SX1RZUEVfREZMKQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKKyMgICAgZGVmaW5lIF9TVExQX05FRURTX0VYVFJBX1RFTVBMQVRFX0NPTlNUUlVDVE9SUworIyAgZW5kaWYKKyMgIGlmIGRlZmluZWQgKF9TVExQX05FRURTX0VYVFJBX1RFTVBMQVRFX0NPTlNUUlVDVE9SUykKKyMgICAgZGVmaW5lIF9TVExQX0FMTE9DQVRPUl9UWVBFX0RGTAorIyAgZWxzZQorIyAgICBkZWZpbmUgX1NUTFBfQUxMT0NBVE9SX1RZUEVfREZMID0gYWxsb2NhdG9yX3R5cGUoKQorIyAgZW5kaWYKKyNlbmRpZgorCisvKiBXaGVuIHRoZSBjb21waWxlciBkbyBub3QgY29ycmVjdGx5IGluaXRpYWxpemVkIHRoZSBiYXNpYyB0eXBlcyB2YWx1ZSBpbiBkZWZhdWx0IHBhcmFtZXRlcnMgd2UgcHJlZmVyCisgKiB0byBhdm9pZCB0aGVtIHRvIGJlIGFibGUgdG8gY29ycmVjdCB0aGlzIGJ1Zy4KKyAqLworI2lmIGRlZmluZWQgKF9TVExQX0RFRl9DT05TVF9ERUZfUEFSQU1fQlVHKQorIyAgZGVmaW5lIF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0gMQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX1NHSV9TVExfTk9fQVJST1dfT1BFUkFUT1IpICYmICEgZGVmaW5lZCAoX1NUTFBfTk9fQVJST1dfT1BFUkFUT1IpCisjICBkZWZpbmUgX1NUTFBfTk9fQVJST1dfT1BFUkFUT1IKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pCisjICBpZiAhKGRlZmluZWQgKF9TVExQX05PX0FSUk9XX09QRVJBVE9SKSkgJiYgXAorICAgICAgICFkZWZpbmVkIChfU1RMUF9OT19NU1ZDNTBfQ09NUEFUSUJJTElUWSkgJiYgIWRlZmluZWQgKF9TVExQX01TVkM1MF9DT01QQVRJQklMSVRZKQorLyogdGhpcyBvbmUgaXMgbmVlZGVkIGZvciBwcm9wZXIgcmV2ZXJzZV9pdGVyYXRvcjw+IG9wZXJhdG9yIC0+KCkgaGFuZGxpbmcgKi8KKyMgICAgZGVmaW5lIF9TVExQX01TVkM1MF9DT01QQVRJQklMSVRZIDEKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKCBfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OICkKKyMgIGlmIChkZWZpbmVkKF9fSUJNQ1BQX18pICYmICg1MDAgPD0gX19JQk1DUFBfXykgJiYgKF9fSUJNQ1BQX18gPCA2MDApICkKKyMgICAgZGVmaW5lIF9TVExQX0RFQ0xBUkVfUkVWRVJTRV9JVEVSQVRPUlMoX19yZXZlcnNlX2l0ZXJhdG9yKSBcCisgICB0eXBlZGVmIHR5cGVuYW1lIF9TVExQX1NURCA6OiByZXZlcnNlX2l0ZXJhdG9yPGNvbnN0X2l0ZXJhdG9yPiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOyBcCisgICB0eXBlZGVmIHR5cGVuYW1lIF9TVExQX1NURCA6OiByZXZlcnNlX2l0ZXJhdG9yPGl0ZXJhdG9yPiByZXZlcnNlX2l0ZXJhdG9yCisjICBlbGlmIChkZWZpbmVkIChfX3NnaSkgJiYgISBkZWZpbmVkIChfX0dOVUNfXykpIHx8IGRlZmluZWQgKF9fU1VOUFJPX0NDKSB8fCBkZWZpbmVkIChfX3hsQ19fKQorIyAgICBkZWZpbmUgX1NUTFBfREVDTEFSRV9SRVZFUlNFX0lURVJBVE9SUyhfX3JldmVyc2VfaXRlcmF0b3IpIFwKKyAgIHR5cGVkZWYgX1NUTFBfU1REOjogX1NUTFBfVEVNUExBVEUgcmV2ZXJzZV9pdGVyYXRvcjxjb25zdF9pdGVyYXRvcj4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsgXAorICAgdHlwZWRlZiBfU1RMUF9TVEQ6OiBfU1RMUF9URU1QTEFURSByZXZlcnNlX2l0ZXJhdG9yPGl0ZXJhdG9yPiByZXZlcnNlX2l0ZXJhdG9yCisjICBlbHNlCisjICAgIGRlZmluZSBfU1RMUF9ERUNMQVJFX1JFVkVSU0VfSVRFUkFUT1JTKF9fcmV2ZXJzZV9pdGVyYXRvcikgXAorICAgdHlwZWRlZiBfU1RMUF9TVEQ6OnJldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3I+IGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7IFwKKyAgIHR5cGVkZWYgX1NUTFBfU1REOjpyZXZlcnNlX2l0ZXJhdG9yPGl0ZXJhdG9yPiByZXZlcnNlX2l0ZXJhdG9yCisjICBlbmRpZgorI2Vsc2UgLyogX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTiAqLworIyAgaWYgZGVmaW5lZCAoX1NUTFBfTVNWQzUwX0NPTVBBVElCSUxJVFkpCisjICAgIGRlZmluZSBfU1RMUF9ERUNMQVJFX1JFVkVSU0VfSVRFUkFUT1JTKF9fcmV2ZXJzZV9pdGVyYXRvcikgXAorICB0eXBlZGVmIF9TVExQX1NURDo6X19yZXZlcnNlX2l0ZXJhdG9yPGNvbnN0X2l0ZXJhdG9yLCB2YWx1ZV90eXBlLCBjb25zdF9yZWZlcmVuY2UsIFwKKyAgICBjb25zdF9wb2ludGVyLCBkaWZmZXJlbmNlX3R5cGU+ICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOyBcCisgIHR5cGVkZWYgX1NUTFBfU1REOjpfX3JldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3IsIHZhbHVlX3R5cGUsIHJlZmVyZW5jZSwgcG9pbnRlciwgZGlmZmVyZW5jZV90eXBlPiBcCisgICAgcmV2ZXJzZV9pdGVyYXRvcgorIyAgZWxzZQorIyAgICBkZWZpbmUgX1NUTFBfREVDTEFSRV9SRVZFUlNFX0lURVJBVE9SUyhfX3JldmVyc2VfaXRlcmF0b3IpIFwKKyAgdHlwZWRlZiBfU1RMUF9TVEQ6Ol9fcmV2ZXJzZV9pdGVyYXRvcjxjb25zdF9pdGVyYXRvciwgdmFsdWVfdHlwZSwgY29uc3RfcmVmZXJlbmNlLCBcCisgICAgZGlmZmVyZW5jZV90eXBlPiAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsgXAorICB0eXBlZGVmIF9TVExQX1NURDo6X19yZXZlcnNlX2l0ZXJhdG9yPGl0ZXJhdG9yLCB2YWx1ZV90eXBlLCBcCisgICAgcmVmZXJlbmNlLCBkaWZmZXJlbmNlX3R5cGU+IFwKKyAgICByZXZlcnNlX2l0ZXJhdG9yCisjICBlbmRpZgorI2VuZGlmIC8qIF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04gKi8KKworI2RlZmluZSBfU1RMUF9ERUNMQVJFX0JJRElSRUNUSU9OQUxfUkVWRVJTRV9JVEVSQVRPUlMgXAorICAgICAgICBfU1RMUF9ERUNMQVJFX1JFVkVSU0VfSVRFUkFUT1JTKHJldmVyc2VfYmlkaXJlY3Rpb25hbF9pdGVyYXRvcikKKyNkZWZpbmUgX1NUTFBfREVDTEFSRV9SQU5ET01fQUNDRVNTX1JFVkVSU0VfSVRFUkFUT1JTIFwKKyAgICAgICAgX1NUTFBfREVDTEFSRV9SRVZFUlNFX0lURVJBVE9SUyhyZXZlcnNlX2l0ZXJhdG9yKQorCisjZGVmaW5lIF9fSU1QT1JUX0NPTlRBSU5FUl9UWVBFREVGUyhfU3VwZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHR5cGVkZWYgdHlwZW5hbWUgX1N1cGVyOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9TdXBlcjo6c2l6ZV90eXBlIHNpemVfdHlwZTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdHlwZWRlZiB0eXBlbmFtZSBfU3VwZXI6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7ICAgICAgICAgICAgXAorICAgIHR5cGVkZWYgdHlwZW5hbWUgX1N1cGVyOjpyZWZlcmVuY2UgcmVmZXJlbmNlOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9TdXBlcjo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZTsgICAgICAgICAgICBcCisgICAgdHlwZWRlZiB0eXBlbmFtZSBfU3VwZXI6OnBvaW50ZXIgcG9pbnRlcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHR5cGVkZWYgdHlwZW5hbWUgX1N1cGVyOjpjb25zdF9wb2ludGVyIGNvbnN0X3BvaW50ZXI7ICAgICAgICAgICAgICAgIFwKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9TdXBlcjo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7CisKKworI2RlZmluZSBfX0lNUE9SVF9JVEVSQVRPUlMoX1N1cGVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9TdXBlcjo6aXRlcmF0b3IgaXRlcmF0b3I7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdHlwZWRlZiB0eXBlbmFtZSBfU3VwZXI6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOworCisjZGVmaW5lIF9fSU1QT1JUX1JFVkVSU0VfSVRFUkFUT1JTKF9TdXBlcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9TdXBlcjo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsgXAorICAgIHR5cGVkZWYgdHlwZW5hbWUgX1N1cGVyOjpyZXZlcnNlX2l0ZXJhdG9yIHJldmVyc2VfaXRlcmF0b3I7CisKKyNkZWZpbmUgIF9fSU1QT1JUX1NVUEVSX0NPUFlfQVNTSUdOTUVOVChfX2Rlcml2ZWRfbmFtZSwgX1NlbGYsIF9TVVBFUikgICAgICAgXAorICAgIF9fZGVyaXZlZF9uYW1lKGNvbnN0IF9TdXBlciYgX194KSA6IF9TVVBFUihfX3gpIHt9ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX1NlbGYmIG9wZXJhdG9yPShjb25zdCBfU3VwZXImIF9feCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKihfU3VwZXIqKXRoaXMgPSBfX3g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gKnRoaXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2Rlcml2ZWRfbmFtZShjb25zdCBfU2VsZiYgX194KSA6IF9TVVBFUihfX3gpIHt9ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9TZWxmJiBvcGVyYXRvcj0oY29uc3QgX1NlbGYmIF9feCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICooX1N1cGVyKil0aGlzID0gX194OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuICp0aGlzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworI2RlZmluZSBfX0lNUE9SVF9XSVRIX0lURVJBVE9SUyhfU3VwZXIpIFwKKyAgX19JTVBPUlRfQ09OVEFJTkVSX1RZUEVERUZTKF9TdXBlcikgX19JTVBPUlRfSVRFUkFUT1JTKF9TdXBlcikKKworI2RlZmluZSBfX0lNUE9SVF9XSVRIX1JFVkVSU0VfSVRFUkFUT1JTKF9TdXBlcikgXAorICBfX0lNUE9SVF9XSVRIX0lURVJBVE9SUyhfU3VwZXIpIF9fSU1QT1JUX1JFVkVSU0VfSVRFUkFUT1JTKF9TdXBlcikKKworI2lmIGRlZmluZWQgKF9TVExQX1RSSVZJQUxfQ09OU1RSVUNUT1JfQlVHKQorIyAgZGVmaW5lIF9fVFJJVklBTF9DT05TVFJVQ1RPUihfX3R5cGUpIF9fdHlwZSgpIHt9CisjZWxzZQorIyAgZGVmaW5lIF9fVFJJVklBTF9DT05TVFJVQ1RPUihfX3R5cGUpCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX1RSSVZJQUxfREVTVFJVQ1RPUl9CVUcpCisjICBkZWZpbmUgX19UUklWSUFMX0RFU1RSVUNUT1IoX190eXBlKSB+X190eXBlKCkge30KKyNlbHNlCisjICBkZWZpbmUgX19UUklWSUFMX0RFU1RSVUNUT1IoX190eXBlKQorI2VuZGlmCisKKyNkZWZpbmUgX19UUklWSUFMX1NUVUZGKF9fdHlwZSkgIFwKKyAgX19UUklWSUFMX0NPTlNUUlVDVE9SKF9fdHlwZSkgX19UUklWSUFMX0RFU1RSVUNUT1IoX190eXBlKQorCisjaWYgZGVmaW5lZCAoX1NUTFBfU1RBVElDX0NPTlNUX0lOSVRfQlVHKQorIyAgZGVmaW5lIF9TVExQX1NUQVRJQ19DT05TVEFOVChfX3R5cGUsIF9fYXNzaWdubWVudCkgZW51bSB7IF9fYXNzaWdubWVudCB9CisjZWxzZQorIyAgZGVmaW5lIF9TVExQX1NUQVRJQ19DT05TVEFOVChfX3R5cGUsIF9fYXNzaWdubWVudCkgc3RhdGljIGNvbnN0IF9fdHlwZSBfX2Fzc2lnbm1lbnQKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfSEFTX05PX0VYQ0VQVElPTlMpCisjICBkZWZpbmUgX1NUTFBfTk9fRVhDRVBUSU9OUworI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9VU0VfRVhDRVBUSU9OUykgJiYgIWRlZmluZWQgKF9TVExQX05PX0VYQ0VQVElPTlMpICYmICFkZWZpbmVkIChfU1RMUF9VU0VfRVhDRVBUSU9OUykKKyMgIGRlZmluZSBfU1RMUF9VU0VfRVhDRVBUSU9OUworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfRVhDRVBUSU9OUykKKyMgIGRlZmluZSBfU1RMUF9UUlkgdHJ5CisjICBkZWZpbmUgX1NUTFBfQ0FUQ0hfQUxMIGNhdGNoKC4uLikKKyMgIGlmbmRlZiBfU1RMUF9USFJPVworIyAgICBkZWZpbmUgX1NUTFBfVEhST1coeCkgdGhyb3cgeAorIyAgZW5kaWYKKyMgIGRlZmluZSBfU1RMUF9SRVRIUk9XIHRocm93CisKKyMgIGRlZmluZSBfU1RMUF9VTldJTkQoYWN0aW9uKSBjYXRjaCguLi4pIHsgYWN0aW9uOyB0aHJvdzsgfQorCisjICBpZmRlZiBfU1RMUF9USFJPV19SRVRVUk5fQlVHCisjICAgIGRlZmluZSBfU1RMUF9SRVRfQUZURVJfVEhST1coZGF0YSkgcmV0dXJuIGRhdGE7CisjICBlbHNlCisjICAgIGRlZmluZSBfU1RMUF9SRVRfQUZURVJfVEhST1coZGF0YSkKKyMgIGVuZGlmCisKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9USFJPV1MpCisjICAgIGRlZmluZSBfU1RMUF9USFJPV1MoeCkgdGhyb3coeCkKKyMgIGVuZGlmCisjICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9USFJPVykKKyMgICAgZGVmaW5lIF9TVExQX05PVEhST1cgdGhyb3coKQorIyAgZW5kaWYKKyNlbHNlCisjICBkZWZpbmUgX1NUTFBfVFJZCisjICBkZWZpbmUgX1NUTFBfQ0FUQ0hfQUxMIGlmIChmYWxzZSkKKyMgIGlmbmRlZiBfU1RMUF9USFJPVworIyAgICBkZWZpbmUgX1NUTFBfVEhST1coeCkKKyMgIGVuZGlmCisjICBkZWZpbmUgX1NUTFBfUkVUSFJPVyB7fQorIyAgZGVmaW5lIF9TVExQX1VOV0lORChhY3Rpb24pCisjICBkZWZpbmUgX1NUTFBfVEhST1dTKHgpCisjICBkZWZpbmUgX1NUTFBfTk9USFJPVworIyAgZGVmaW5lIF9TVExQX1JFVF9BRlRFUl9USFJPVyhkYXRhKQorI2VuZGlmCisKKy8qCisgKiBIZXJlIHdlIGNoZWNrIF9TVExQX05PX0VYQ0VQVElPTlMgd2hpY2ggbWVhbnMgdGhhdCB0aGUgY29tcGlsZXIgaGFzIG5vCisgKiBleGNlcHRpb24gc3VwcG9ydCBidXQgbm90IHRoZSBfU1RMUF9VU0VfRVhDRVBUSU9OUyB3aGljaCBzaW1wbHkgbWVhbnMKKyAqIHRoYXQgdGhlIHVzZXIgZG8gbm90IHdhbnQgdG8gdXNlIHRoZW0uCisgKi8KKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhDRVBUSU9OUykgJiYgIWRlZmluZWQgKF9TVExQX05PX0VYQ0VQVElPTl9TUEVDKQorIyAgZGVmaW5lIF9TVExQX1RIUk9XU19JTkhFUkVOVExZKHgpIHRocm93IHgKKyMgIGRlZmluZSBfU1RMUF9OT1RIUk9XX0lOSEVSRU5UTFkgdGhyb3coKQorI2Vsc2UKKyMgIGRlZmluZSBfU1RMUF9USFJPV1NfSU5IRVJFTlRMWSh4KQorIyAgZGVmaW5lIF9TVExQX05PVEhST1dfSU5IRVJFTlRMWQorI2VuZGlmCisKKy8qIFNUTHBvcnQgZnVuY3Rpb24gbm90IHJldHVybmluZyBhcmUgZnVuY3Rpb25zIHRoYXQgdGhyb3cgc28gd2UgdHJhbnNsYXRlCisgKiB0aGUgbm9yZXR1cm4gZnVuY3Rpb25zIGluIHRocm93aW5nIGZ1bmN0aW9ucyB0YWtpbmcgYWxzbyBpbnRvIGFjY291bnQKKyAqIGV4Y2VwdGlvbiBzdXBwb3J0IGFjdGl2YXRpb24uCisgKi8KKyNpZiBkZWZpbmVkIChfU1RMUF9OT1JFVFVSTl9GVU5DVElPTikgJiYgIWRlZmluZWQgKF9TVExQX05PX0VYQ0VQVElPTlMpICYmIFwKKyAgICFkZWZpbmVkIChfU1RMUF9GVU5DVElPTl9USFJPV1MpCisjICBkZWZpbmUgX1NUTFBfRlVOQ1RJT05fVEhST1dTIF9TVExQX05PUkVUVVJOX0ZVTkNUSU9OCisjZWxzZQorIyAgZGVmaW5lIF9TVExQX0ZVTkNUSU9OX1RIUk9XUworI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9TVExQX05PX0JPT0wpCisjICBpZiAoZGVmaW5lZCAoX19JQk1DUFBfXykgJiYgKF9fSUJNQ1BQX18gPCA0MDApKSAmJiAhIGRlZmluZWQgKF9BSVgpCisjICAgIGluY2x1ZGUgPGlzeW5vbnltLmhwcD4KKyMgICAgaWYgZGVmaW5lZCAoX19PUzQwMF9fKQordHlwZWRlZiBpbnQgYm9vbDsKKyMgICAgZWxpZiAhKCBkZWZpbmVkIChfX3hsQ19fKSB8fCBkZWZpbmVkIChfQUlYKSkKK3R5cGVkZWYgQm9vbGVhbiBib29sOworIyAgICBlbmRpZgorIyAgZWxzZQorIyAgICBpZiBkZWZpbmVkKF9TVExQX1lWQUxTX0gpCisjICAgICAgaW5jbHVkZSA8eXZhbHMuaD4KKyMgICAgZWxzZQorIyAgICAgIGlmIGRlZmluZWQgKF9TVExQX0RPTlRfVVNFX0JPT0xfVFlQRURFRikKKyMgICAgICAgIGRlZmluZSBib29sIGludAorIyAgICAgIGVsc2UKK3R5cGVkZWYgaW50IGJvb2w7CisjICAgICAgZW5kaWYKKyMgICAgICBkZWZpbmUgdHJ1ZSAxCisjICAgICAgZGVmaW5lIGZhbHNlIDAKKyMgICAgZW5kaWYKKyMgIGVuZGlmIC8qIF9fSUJNQ1BQX18gKi8KKyNlbHNlCisjICBkZWZpbmUgX1NUTFBfQk9PTF9LRVlXT1JEIDEKKyNlbmRpZiAvKiBfU1RMUF9OT19CT09MICovCisKKy8qIHVuaW5pdGlhbGl6ZWQgdmFsdWUgZmlsbGVyICovCisjaWZuZGVmIF9TVExQX1NIUkVEX0JZVEUKKy8qIFRoaXMgdmFsdWUgaXMgZGVzaWduZWQgdG8gY2F1c2UgcHJvYmxlbXMgaWYgYW4gZXJyb3Igb2NjdXJzICovCisjICBkZWZpbmUgX1NUTFBfU0hSRURfQllURSAweEEzCisjZW5kaWYgLyogX1NUTFBfU0hSRURfQllURSAqLworCisvKiBzaGFyZWQgbGlicmFyeSB0dW5lLXVwICovCisjaWZuZGVmIF9TVExQX0lNUE9SVF9ERUNMU1BFQworIyAgZGVmaW5lIF9TVExQX0lNUE9SVF9ERUNMU1BFQworI2VuZGlmCisKKy8qIGEga2V5d29yZCB1c2VkIHRvIGluc3RhbnRpYXRlIGV4cG9ydCB0ZW1wbGF0ZSAqLworI2lmbmRlZiBfU1RMUF9FWFBPUlRfVEVNUExBVEVfS0VZV09SRAorIyAgZGVmaW5lIF9TVExQX0VYUE9SVF9URU1QTEFURV9LRVlXT1JECisjZW5kaWYKKyNpZm5kZWYgX1NUTFBfSU1QT1JUX1RFTVBMQVRFX0tFWVdPUkQKKyMgIGRlZmluZSBfU1RMUF9JTVBPUlRfVEVNUExBVEVfS0VZV09SRAorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fQ09OU1RfSU5fUEFJUikKKyMgIGRlZmluZSBfU1RMUF9DT05TVCBjb25zdAorI2Vsc2UKKyMgIGRlZmluZSBfU1RMUF9DT05TVAorI2VuZGlmCisKKyNpZmRlZiBfU1RMUF9VU0VfTk9fSU9TVFJFQU1TCisvKgorICogSWYgd2UgZG8gbm90IHVzZSBpb3N0cmVhbXMgd2UgZG8gbm90IHVzZSB0aGUgZXhwb3J0L2ltcG9ydAorICogdGVjaG5pcXVlcyB0byBhdm9pZCBidWlsZCBvZiB0aGUgU1RMcG9ydCBsaWJyYXJ5LgorICovCisjICB1bmRlZiBfU1RMUF9VU0VfREVDTFNQRUMKKy8qIFdlIGFsc28gdW5kZWYgVVNFX0RZTkFNSUNfTElCIG1hY3JvIGFzIHRoaXMgbWFjcm8gYWRkIHNvbWUgY29kZQorICogdG8gdXNlIHRoZSBkeW5hbWljIChzaGFyZWQpIFNUTHBvcnQgbGlicmFyeSBmb3Igc29tZSBwbGF0Zm9ybS9jb21waWxlcgorICogY29uZmlndXJhdGlvbiBsZWFkaW5nIHRvIHByb2JsZW0gd2hlbiBub3QgbGlua2luZyB0byB0aGUgU1RMcG9ydCBsaWIuCisgKi8KKyMgIHVuZGVmIF9TVExQX1VTRV9EWU5BTUlDX0xJQgorI2VuZGlmCisKKyNpZiAgZGVmaW5lZCAoX1NUTFBfRExMRVhQT1JUX05FRURTX1BSRURFQ0xBUkFUSU9OKSAmJiBkZWZpbmVkIChfU1RMUF9VU0VfREVDTFNQRUMpCisjICBpZiAhIGRlZmluZWQgKF9TVExQX1VTRV9URU1QTEFURV9FWFBPUlQpCisvKiB0aGlzIHNldHRpbmcgdHVybnMgb24gImV4dGVybiB0ZW1wbGF0ZSIgZXh0ZW5zaW9uIHVzZSAqLworIyAgICBkZWZpbmUgX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVAorIyAgZW5kaWYKKyMgIGlmIGRlZmluZWQgKF9TVExQX0RFU0lHTkFURURfRExMKSAmJiAhIGRlZmluZWQgKF9TVExQX05PX0ZPUkNFX0lOU1RBTlRJQVRFKQorIyAgICBkZWZpbmUgX1NUTFBfTk9fRk9SQ0VfSU5TVEFOVElBVEUKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX0RFU0lHTkFURURfRExMKSAvKiBUaGlzIGlzIGEgbGliIHdoaWNoIHdpbGwgY29udGFpbiBTVExwb3J0IGV4cG9ydHMgKi8KKyMgIGRlZmluZSAgX1NUTFBfRVhQT1JUIF9TVExQX0VYUE9SVF9URU1QTEFURV9LRVlXT1JECisjZWxzZQorIyAgZGVmaW5lICBfU1RMUF9FWFBPUlQgX1NUTFBfSU1QT1JUX1RFTVBMQVRFX0tFWVdPUkQKKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0VYUE9SVF9URU1QTEFURQorIyAgZGVmaW5lICBfU1RMUF9FWFBPUlRfVEVNUExBVEUgX1NUTFBfRVhQT1JUIHRlbXBsYXRlCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9ERUNMU1BFQykgLyogdXNpbmcgZXhwb3J0L2ltcG9ydCB0ZWNobmlxdWUgKi8KKworIyAgaWZuZGVmIF9TVExQX0VYUE9SVF9ERUNMU1BFQworIyAgICBkZWZpbmUgX1NUTFBfRVhQT1JUX0RFQ0xTUEVDCisjICBlbmRpZgorIyAgaWZuZGVmIF9TVExQX0lNUE9SVF9ERUNMU1BFQworIyAgICBkZWZpbmUgX1NUTFBfSU1QT1JUX0RFQ0xTUEVDCisjICBlbmRpZgorIyAgaWZuZGVmIF9TVExQX0NMQVNTX0VYUE9SVF9ERUNMU1BFQworIyAgICBkZWZpbmUgX1NUTFBfQ0xBU1NfRVhQT1JUX0RFQ0xTUEVDCisjICBlbmRpZgorIyAgaWZuZGVmIF9TVExQX0NMQVNTX0lNUE9SVF9ERUNMU1BFQworIyAgICBkZWZpbmUgX1NUTFBfQ0xBU1NfSU1QT1JUX0RFQ0xTUEVDCisjICBlbmRpZgorIyAgaWYgZGVmaW5lZCAoX1NUTFBfREVTSUdOQVRFRF9ETEwpIC8qIFRoaXMgaXMgYSBsaWIgd2hpY2ggd2lsbCBjb250YWluIFNUTHBvcnQgZXhwb3J0cyAqLworIyAgICBkZWZpbmUgIF9TVExQX0RFQ0xTUEVDICAgICAgICBfU1RMUF9FWFBPUlRfREVDTFNQRUMKKyMgICAgZGVmaW5lICBfU1RMUF9DTEFTU19ERUNMU1BFQyAgX1NUTFBfQ0xBU1NfRVhQT1JUX0RFQ0xTUEVDCisjICBlbHNlCisjICAgIGRlZmluZSAgX1NUTFBfREVDTFNQRUMgICAgICAgIF9TVExQX0lNUE9SVF9ERUNMU1BFQyAgIC8qIE90aGVyIG1vZHVsZXMsIGltcG9ydGluZyBTVExwb3J0IGV4cG9ydHMgKi8KKyMgICAgZGVmaW5lICBfU1RMUF9DTEFTU19ERUNMU1BFQyAgX1NUTFBfQ0xBU1NfSU1QT1JUX0RFQ0xTUEVDCisjICBlbmRpZgorCisjZWxzZSAvKiBOb3QgdXNpbmcgRExMIGV4cG9ydC9pbXBvcnQgc3BlY2lmaWNhdGlvbnMgKi8KKworIyAgZGVmaW5lIF9TVExQX0RFQ0xTUEVDCisjICBkZWZpbmUgX1NUTFBfQ0xBU1NfREVDTFNQRUMKKworI2VuZGlmCisKKyNkZWZpbmUgX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIF9TVExQX0VYUE9SVCB0ZW1wbGF0ZSBjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQworCisjaWYgZGVmaW5lZCAoX1NUTFBfTkVFRF9BRERJVElPTkFMX1NUQVRJQ19ERUNMU1BFQykKKyMgIGRlZmluZSBfU1RMUF9TVEFUSUNfREVDTFNQRUMgX1NUTFBfREVDTFNQRUMKKyNlbHNlCisjICBkZWZpbmUgX1NUTFBfU1RBVElDX0RFQ0xTUEVDCisjZW5kaWYKKworI2lmICFkZWZpbmVkIChfU1RMUF9DQUxMKQorIyAgZGVmaW5lIF9TVExQX0NBTEwKKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX1VTRV9OT19JT1NUUkVBTVMKKworIyAgaWYgZGVmaW5lZCAoX19ERUNDWFgpICYmICEgZGVmaW5lZCAoX19VU0VfU1REX0lPU1RSRUFNKQorIyAgICBkZWZpbmUgX19VU0VfU1REX0lPU1RSRUFNCisjICBlbmRpZgorCisvKiBXZSBvbmx5IG5lZWQgdG8gZXhwb3NlIGRldGFpbHMgb2Ygc3RyZWFtcyBpbXBsZW1lbnRhdGlvbgorICAgaWYgd2UgdXNlIG5vbi1zdGFuZGFyZCBpL28gb3IgYXJlIGJ1aWxkaW5nIFNUTHBvcnQqLworIyAgaWYgZGVmaW5lZCAoX19CVUlMRElOR19TVExQT1JUKSB8fCBkZWZpbmVkIChfU1RMUF9OT19GT1JDRV9JTlNUQU5USUFURSkgfHwgIWRlZmluZWQoX1NUTFBfTk9fQ1VTVE9NX0lPKQorIyAgICBkZWZpbmUgX1NUTFBfRVhQT1NFX1NUUkVBTV9JTVBMRU1FTlRBVElPTiAxCisjICBlbmRpZgorCisvKiBXZSBvbmx5IG5lZWQgdG8gZXhwb3NlIGRldGFpbHMgb2YgZ2xvYmFsIGltcGxlbWVudGF0aW9uIGlmIHdlIGFyZSBidWlsZGluZyBTVExwb3J0CisgICBvciBoYXZlIG5vdCBpbnN0YW50aWF0ZWQgZXZlcnl0aGluZyBpbiB0aGUgbGliICovCisjICBpZiBkZWZpbmVkIChfX0JVSUxESU5HX1NUTFBPUlQpIHx8IGRlZmluZWQgKF9TVExQX05PX0ZPUkNFX0lOU1RBTlRJQVRFKQorIyAgICB1bmRlZiAgX1NUTFBfRVhQT1NFX0dMT0JBTFNfSU1QTEVNRU5UQVRJT04KKyMgICAgZGVmaW5lIF9TVExQX0VYUE9TRV9HTE9CQUxTX0lNUExFTUVOVEFUSU9OIDEKKyMgIGVuZGlmCisKKyNlbHNlIC8qIF9TVExQX1VTRV9OT19JT1NUUkVBTVMgKi8KKy8qIHdoZW4gd2UgYXJlIG5vdCB1c2luZyBTR0kgaW9zdHJlYW1zLCB3ZSBtdXN0IGV4cG9zZSBnbG9iYWxzLCBidXQgbm90IHN0cmVhbXMgaW1wbGVtZW50YXRpb24gKi8KKyMgIGRlZmluZSBfU1RMUF9FWFBPU0VfR0xPQkFMU19JTVBMRU1FTlRBVElPTgorI2VuZGlmIC8qIF9TVExQX1VTRV9OT19JT1NUUkVBTVMgKi8KKworI2lmZGVmIF9TVExQX1BBUlRJQUxfU1BFQ19ORUVEU19URU1QTEFURV9BUkdTCisjICBkZWZpbmUgX1NUTFBfUFNQRUMyKHQxLHQyKSA8IHQxLHQyID4KKyMgIGRlZmluZSBfU1RMUF9QU1BFQzModDEsdDIsdDMpIDwgdDEsdDIsdDMgPgorI2Vsc2UKKyMgIGRlZmluZSBfU1RMUF9QU1BFQzIodDEsdDIpICAvKiBub3RoaW5nICovCisjICBkZWZpbmUgX1NUTFBfUFNQRUMzKHQxLHQyLHQzKSAgLyogbm90aGluZyAqLworI2VuZGlmCisKKy8qIEFjdGl2YXRpb24gb2YgdGhlIHBhcnRpYWwgdGVtcGxhdGUgd29ya2Fyb3VuZDoKKyAqLworI2lmICFkZWZpbmVkKF9TVExQX0RPTlRfVVNFX1BBUlRJQUxfU1BFQ19XUktEKSAmJlwKKyAgICghZGVmaW5lZChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKSB8fCAhZGVmaW5lZChfU1RMUF9GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIpKQorIyAgZGVmaW5lIF9TVExQX1VTRV9QQVJUSUFMX1NQRUNfV09SS0FST1VORAorI2VuZGlmCisKKyNpZmRlZiBfU1RMUF9VU0VfU0VQQVJBVEVfUkVMT1BTX05BTUVTUEFDRQorIyAgZGVmaW5lIF9TVExQX1JFTE9QU19PUEVSQVRPUlMoX1RNUEwsIF9UUCkgXAorX1RNUEwgaW5saW5lIGJvb2wgX1NUTFBfQ0FMTCBvcGVyYXRvciE9KGNvbnN0IF9UUCYgX194LCBjb25zdCBfVFAmIF9feSkge3JldHVybiAhKF9feCA9PSBfX3kpO31cCitfVE1QTCBpbmxpbmUgYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yPihjb25zdCBfVFAmIF9feCwgY29uc3QgX1RQJiBfX3kpICB7cmV0dXJuIF9feSA8IF9feDt9XAorX1RNUEwgaW5saW5lIGJvb2wgX1NUTFBfQ0FMTCBvcGVyYXRvcjw9KGNvbnN0IF9UUCYgX194LCBjb25zdCBfVFAmIF9feSkgeyByZXR1cm4gIShfX3kgPCBfX3gpO31cCitfVE1QTCBpbmxpbmUgYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yPj0oY29uc3QgX1RQJiBfX3gsIGNvbnN0IF9UUCYgX195KSB7IHJldHVybiAhKF9feCA8IF9feSk7fQorI2Vsc2UKKyMgIGRlZmluZSBfU1RMUF9SRUxPUFNfT1BFUkFUT1JTKF9UTVBMLCBfVFApCisjZW5kaWYKKworI2lmIGRlZmluZWQgKCBfU1RMUF9VU0VfQUJCUkVWUyApCisjICBpbmNsdWRlIDxzdGwvX2FiYnJldnMuaD4KKyNlbmRpZgorCisvKiBTb21lIHJlYWxseSB1c2VmdWwgbWFjcm8gKi8KKyNkZWZpbmUgX1NUTFBfQVJSQVlfU0laRShBKSBzaXplb2YoQSkgLyBzaXplb2YoQVswXSkKKyNkZWZpbmUgX1NUTFBfQVJSQVlfQU5EX1NJWkUoQSkgQSwgc2l6ZW9mKEEpIC8gc2l6ZW9mKEFbMF0pCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTUFSS19QQVJBTUVURVJfQVNfVU5VU0VEKQorIyAgZGVmaW5lIF9TVExQX01BUktfUEFSQU1FVEVSX0FTX1VOVVNFRChYKSAodm9pZCopWDsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfQ0hFQ0tfUlVOVElNRV9DT01QQVRJQklMSVRZKQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX05PX0lPU1RSRUFNUykKKyMgICAgdW5kZWYgX1NUTFBfQ0hFQ0tfUlVOVElNRV9DT01QQVRJQklMSVRZCisjICBlbHNlCisvKiBUaGUgZXh0ZXJuICJDIiBzaW1wbHkgbWFrZXMgdGhlIHN5bWJvbCBzaW1wbGVyLiAqLworI2lmIGRlZmluZWQgKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIgorI2VuZGlmCit2b2lkIF9TVExQX0RFQ0xTUEVDIF9TVExQX0NBTEwgX1NUTFBfQ0hFQ0tfUlVOVElNRV9DT01QQVRJQklMSVRZKCk7CisjICBlbmRpZgorI2VuZGlmCisKKy8qIHNvbWUgY2xlYW51cCAqLworI3VuZGVmIF9TVExQX0RPTlRfVVNFX0JPT0xfVFlQRURFRgorI3VuZGVmIF9TVExQX1lWQUxTX0gKKyN1bmRlZiBfU1RMUF9MT09QX0lOTElORV9QUk9CTEVNUworI3VuZGVmIF9TVExQX05FRURfRVhQTElDSVQKKyN1bmRlZiBfU1RMUF9ORUVEX1RZUEVOQU1FCisjdW5kZWYgX1NUTFBfTk9fTkVXX1NUWUxFX0NBU1RTCisjdW5kZWYgX19BVVRPX0NPTkZJR1VSRUQKKworI2VuZGlmIC8qIF9TVExQX0ZFQVRVUkVTX0ggKi8KZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL2NvbmZpZy9ob3N0LmggYi9zdGxwb3J0L3N0bC9jb25maWcvaG9zdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YjYwODkKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9jb25maWcvaG9zdC5oCkBAIC0wLDAgKzEsMzQyIEBACisvKgorICogVGhpcyBmaWxlIGRlZmluZXMgc2l0ZSBjb25maWd1cmF0aW9uLgorICovCisKKy8qCisgKiBfU1RMUF9OT19USFJFQURTOiBpZiBkZWZpbmVkLCBTVExwb3J0IGRvbid0IHVzZSBhbnkKKyAqIG11bHRpdGhyZWFkaW5nIHN1cHBvcnQuIFN5bm9ueW0gaXMgX05PVEhSRUFEUworICovCisvKgorI2RlZmluZSBfTk9USFJFQURTCisjZGVmaW5lIF9TVExQX05PX1RIUkVBRFMKKyovCisKKy8qIF9QVEhSRUFEUzogaWYgZGVmaW5lZCwgdXNlIFBPU0lYIHRocmVhZHMgZm9yIG11bHRpdGhyZWFkaW5nIHN1cHBvcnQuICovCisvKgorI2RlZmluZSBfUFRIUkVBRFMKKyovCisKKy8qIGNvbXBhdGliaWxpdHkgc2VjdGlvbgorICovCisKKyNpZiAoZGVmaW5lZCAoX1NUTFBfTk9USFJFQURTKSB8fCBkZWZpbmVkIChfU1RMUF9OT19USFJFQURTKSB8fCBkZWZpbmVkIChOT1RIUkVBRFMpKQorIyAgaWYgIWRlZmluZWQgKF9OT1RIUkVBRFMpCisjICAgIGRlZmluZSBfTk9USFJFQURTCisjICBlbmRpZgorIyAgaWYgIWRlZmluZWQgKF9TVExQX05PX1RIUkVBRFMpCisjICAgIGRlZmluZSBfU1RMUF9OT19USFJFQURTCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChfU1RMUF9VU0VfRFlOQU1JQ19MSUIpICYmICFkZWZpbmVkKF9TVExQX1VTRV9TVEFUSUNfTElCKQorLyoKKyAqIFR1cm4gX1NUTFBfVVNFX0RZTkFNSUNfTElCIHRvIGVuZm9yY2UgdXNlIG9mIC5kbGwgdmVyc2lvbiBvZiBTVExwb3J0IGxpYnJhcnkuCisgKiBOT1RFOiBwbGVhc2UgZG8gdGhhdCBvbmx5IGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZyEKKyAqIENoYW5naW5nIGRlZmF1bHQgd2lsbCByZXF1aXJlIHlvdSB0byBjaGFuZ2UgbWFrZWZpbGVzIGluICJidWlsZCIgYWNjb3JkaW5nbHkKKyAqIGFuZCB0byByZWJ1aWxkIFNUTFBvcnQgbGlicmFyeSEKKyAqIE9uIFVOSVgsIHRoaXMgaGFzIG5vIGVmZmVjdCwgc2VlIGJ1aWxkL2xpYi9SRUFETUUgZm9yIG1ha2UgdGFncy4KKyAqIFNlZSBTVExwb3J0IGNvbmZpZ3VyYXRpb24gZmlsZSAoYnVpbGQvbGliL2NvbmZpZ3VyZS5iYXQpIGZvciBoZWxwIGluIGJ1aWxkaW5nCisgKiB0aGUgcmVxdWlyZSBsaWJyYXJ5IHZlcnNpb25zLgorICovCisvKgorI2RlZmluZSBfU1RMUF9VU0VfRFlOQU1JQ19MSUIKKyovCisKKy8qCisgKiBUdXJuIF9TVExQX1VTRV9TVEFUSUNfTElCIHRvIGVuZm9yY2UgdXNlIG9mIHN0YXRpYyB2ZXJzaW9uIG9mIFNUTHBvcnQgbGlicmFyeS4KKyAqIE5PVEU6IHBsZWFzZSBkbyB0aGF0IG9ubHkgaWYgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nIQorICogQ2hhbmdpbmcgZGVmYXVsdCB3aWxsIHJlcXVpcmUgeW91IHRvIGNoYW5nZSBtYWtlZmlsZSBpbiAiYnVpbGQiIGFjY29yZGluZ2x5CisgKiBhbmQgdG8gcmVidWlsZCBTVExQb3J0IGxpYnJhcnkhCisgKiBPbiBVTklYLCB0aGlzIGhhcyBubyBlZmZlY3QsIHNlZSBidWlsZC9saWIvUkVBRE1FIGZvciBtYWtlIHRhZ3MuCisgKiBTZWUgU1RMcG9ydCBjb25maWd1cmF0aW9uIGZpbGUgKGJ1aWxkL2xpYi9jb25maWd1cmUuYmF0KSBmb3IgaGVscCBpbiBidWlsZGluZworICogdGhlIHJlcXVpcmUgbGlicmFyeSB2ZXJzaW9ucy4KKyAqLworLyoKKyNkZWZpbmUgX1NUTFBfVVNFX1NUQVRJQ19MSUIKKyovCisjZW5kaWYKKworLyoKKyAqIEVkaXQgcmVsYXRpdmUgcGF0aCBiZWxvdyAob3IgcHV0IGZ1bGwgcGF0aCkgdG8gZ2V0IG5hdGl2ZQorICogY29tcGlsZXIgdmVuZG9yJ3MgaGVhZGVycyBpbmNsdWRlZC4gRGVmYXVsdCBpcyAiLi4vaW5jbHVkZSIKKyAqIGZvciBfU1RMUF9OQVRJVkVfSU5DTFVERV9QQVRILCBkZWZhdWx0IGZvciBvdGhlciBtYWNyb3MgaXMKKyAqIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEguCisgKiBIaW50OiBuZXZlciBpbnN0YWxsIFNUTHBvcnQgaW4gdGhlIGRpcmVjdG9yeSB0aGF0IGVuZHMgd2l0aCAiaW5jbHVkZSIKKyAqLworLyoKKyN1bmRlZiBfU1RMUF9OQVRJVkVfSU5DTFVERV9QQVRICisjZGVmaW5lIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEggLi4vaW5jbHVkZQorKi8KKy8qIHNhbWUgZm9yIEMgbGlicmFyeSBoZWFkZXJzIGxpa2UgPGNzdHJpbmc+ICovCisvKgorI3VuZGVmIF9TVExQX05BVElWRV9DUFBfQ19JTkNMVURFX1BBVEgKKyNkZWZpbmUgX1NUTFBfTkFUSVZFX0NQUF9DX0lOQ0xVREVfUEFUSCBfU1RMUF9OQVRJVkVfSU5DTFVERV9QQVRICisqLworLyogc2FtZSBmb3IgQyBoZWFkZXJzIGxpa2UgPHN0cmluZy5oPiAqLworLyoKKyN1bmRlZiBfU1RMUF9OQVRJVkVfQ19JTkNMVURFX1BBVEgKKyNkZWZpbmUgX1NUTFBfTkFUSVZFX0NfSU5DTFVERV9QQVRIIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEgKKyovCisvKiBTb21lIGNvbXBpbGVycyBsb2NhdGUgYmFzaWMgQysrIHJ1bnRpbWUgc3VwcG9ydCBoZWFkZXJzICg8bmV3PiwgPHR5cGVpbmZvPiwgPGV4Y2VwdGlvbj4pIGluIHNlcGFyYXRlIGRpcmVjdG9yeSAqLworLyoKKyN1bmRlZiBfU1RMUF9OQVRJVkVfQ1BQX1JVTlRJTUVfSU5DTFVERV9QQVRICisjZGVmaW5lIF9TVExQX05BVElWRV9DUFBfUlVOVElNRV9JTkNMVURFX1BBVEggX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSAorKi8KKworLyoKKyAqIElmIG5hbWVzcGFzZXMgYXZhaWxhYmxlLCBTVExwb3J0IHVzZSBvd24gbmFtZXNwYWNlIChhbmQgbWFzcXVlcmFkZQorICogaXQgYXMgc3RkKS4gRGlzYWJsZSBvd24gbmFtZXNwYWNlIG1heSBjYXVzZSB1bmRlZmluZWQgYmVoYXZpb3VyLgorICovCisvKgorI2RlZmluZSBfU1RMUF9OT19PV05fTkFNRVNQQUNFICAxCisqLworCisvKgorICogVW5jb21tZW50IF9TVExQX0xFQUtTX1BFREFOVElDIHRvIGZvcmNlIGRlYWxsb2NhdGlvbiBvZiBBTEwgYWxsb2NhdGVkCisgKiBtZW1vcnkgY2h1bmtzLiBOb3JtYWxseSBub3QgcmVxdWlyZWQuIEJ1dCBpZiB5b3Ugd29ycnkgYWJvdXQgcXVhemktbGVha3MKKyAqIChtYXkgYmUgcmVwb3J0ZWQgYnkgc29tZSBsZWFrcyBkZXRlY3Rpb24gdG9vbHMpLCB1c2UKKyAqIF9TVExQX0xFQUtTX1BFREFOVElDLiBJdCBzaG91bGQgYmUgdXNlZCB3aXRoIF9TVExQX1VTRV9ORVdBTExPQyBvcgorICogX1NUTFBfVVNFX01BTExPQyAoc2VlIGJlbG93KSwgdGhlIGRlZmF1bHQgbm9kZV9hbGxvYyBhbGxvY2F0b3IgYWxzbyBjbGVhbgorICogaXRzIGludGVybmFsIG1lbW9yeSBwb29sIGJ1dCBvbmx5IGlmIFNUTHBvcnQgaXMgdXNlZCBhcyBhIGR5bmFtaWMgbGlicmFyeQorICogdW5kZXIgV2luMzIgKHVzaW5nIE1TVkMgbGlrZSBjb21waWxlcnMpLgorICovCisvKgorI2RlZmluZSBfU1RMUF9MRUFLU19QRURBTlRJQyAxCisqLworCisvKgorICogVW5jb21tZW50IF9TVExQX1VTRV9ORVdBTExPQyB0byBmb3JjZSBhbGxvY2F0b3I8VD4gdG8gdXNlIHBsYWluICJuZXciCisgKiBpbnN0ZWFkIG9mIFNUTHBvcnQgb3B0aW1pemVkIG5vZGUgYWxsb2NhdG9yIGVuZ2luZS4KKyAqLworLyoKKyNkZWZpbmUgX1NUTFBfVVNFX05FV0FMTE9DIDEKKyovCisKKy8qCisgKiBVbmNvbW1lbnQgX1NUTFBfVVNFX01BTExPQyB0byBmb3JjZSBhbGxvY2F0b3I8VD4gdG8gdXNlIHBsYWluICJtYWxsb2MiCisgKiBpbnN0ZWFkIG9mIFNUTHBvcnQgb3B0aW1pemVkIG5vZGUgYWxsb2NhdG9yIGVuZ2luZS4KKyAqCisgKiBUaGlzIGlzIGRlZmF1bHQgYWxsb2NhdG9yIGZvciBnbGliYyAyLjMueCBhbmQgbGF0ZXIsIGlmIG5vdCBtZW50aW9uZWQgb3RoZXIKKyAqLworLyoKKyNkZWZpbmUgX1NUTFBfVVNFX01BTExPQyAxCisqLworCisvKgorICogVW5jb21tZW50IF9TVExQX1VTRV9QRVJUSFJFQURfQUxMT0MgdG8gZm9yY2UgYWxsb2NhdG9yPFQ+IHRvIHVzZQorICogYSBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiB0YXJnZXR0aW5nIHRoZSBtYXNzaXZlbHkgbXVsdGktdGhyZWFkZWQKKyAqIGVudmlyb25tZW50LiBUaGUgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gdGhlIFBPU0lYIHB0aHJlYWQKKyAqIGludGVyZmFjZS4KKyAqLworLyoKKyNkZWZpbmUgX1NUTFBfVVNFX1BFUlRIUkVBRF9BTExPQyAxCisqLworCisvKgorICogVW5jb21tZW50IF9TVExQX1VTRV9OT0RFX0FMTE9DIGlmIHlvdSB3YW50IHRvIGZvcmNlIGFsbG9jYXRvcjxUPiB0byB1c2UKKyAqICJub2RlX2FsbG9jIiBhbGxvY2F0b3IgKHRoaXMgaXMgZGVmYXVsdCBhbGxvY2F0b3IgZm9yIFNUTHBvcnQsIGlmIG5vdAorICogdXNlZCBvdGhlciBhYm92ZSwgZXhjZXB0IGdsaWJjIDIuMy54IGFuZCBsYXRlciwgd2hlcmUgZGVmYXVsdCBpcworICogIm1hbGxvYyIsIGR1ZSB0byBiZXR0ZXIgcmVzdWx0cykKKyAqLworLyoKKyNkZWZpbmUgX1NUTFBfVVNFX05PREVfQUxMT0MgMQorKi8KKworLyoKKyAqIFNldCBfU1RMUF9ERUJVR19BTExPQyB0byB1c2UgYWxsb2NhdG9ycyB0aGF0IHBlcmZvcm0gbWVtb3J5IGRlYnVnZ2luZywKKyAqIHN1Y2ggYXMgcGFkZGluZy9jaGVja2luZyBmb3IgbWVtb3J5IGNvbnNpc3RlbmN5CisgKi8KKy8qCisjZGVmaW5lIF9TVExQX0RFQlVHX0FMTE9DIDEKKyovCisKKy8qCisgKiBGb3IgY29tcGlsZXIgbm90IHN1cHBvcnRpbmcgcGFydGlhbCB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBvciBvcmRlcmluZyBvZgorICogdGVtcGxhdGUgZnVuY3Rpb25zIFNUTHBvcnQgaW1wbGVtZW50IGEgd29ya2Fyb3VuZCBiYXNlZCBvbiBpbmhlcml0YW5jZQorICogZGV0ZWN0aW9uLiBUaGlzIGluaGVyaXRhbmNlIGNhbiBpbnRyb2R1Y2UgdHJvdWJsZSBpbiBjbGllbnQgY29kZSB3aGVuCisgKiBhIHVzZXIgY2xhc3MgZGVyaXZlZCBhIFNUTCBjb250YWluZXIgKHdoaWNoIGlzIG5vdCBhZHZpc2VkIGFzIFNUTCBjb250YWluZXJzCisgKiBkbyBub3QgaGF2ZSB2aXJ0dWFsIGRlc3RydWN0b3JzKS4gVG8gZGlzYWJsZSB0aGlzIHdvcmthcm91bmQgdHVybiB0aGlzIG1hY3JvIG9uOgorICovCisvKgorI2RlZmluZSBfU1RMUF9ET05UX1VTRV9QQVJUSUFMX1NQRUNfV1JLRCAxCisqLworCisvKgorICogVW5jb21tZW50IHRoaXMgdG8gZm9yY2UgYWxsIGRlYnVnIGRpYWdub3N0aWMgdG8gYmUgZGlyZWN0ZWQgdGhyb3VnaCBhCisgKiB1c2VyLWRlZmluZWQgZ2xvYmFsIGZ1bmN0aW9uOgorICogIHZvaWQgX19zdGxfZGVidWdfbWVzc2FnZShjb25zdCBjaGFyICogZm9ybWF0X3N0ciwgLi4uKQorICogaW5zdGVhZCBvZiBwcmVkZWZpbmVkIFNUTHBvcnQgcm91dGluZS4KKyAqIFRoaXMgYWxsb3dzIHlvdSB0byB0YWtlIGNvbnRyb2wgb2YgZGVidWcgbWVzc2FnZSBvdXRwdXQuCisgKiBEZWZhdWx0IHJvdXRpbmUgY2FsbHMgZnByaW50ZihzdGRlcnIsLi4uKQorICogTm90ZSA6IElmIHlvdSBzZXQgdGhpcyBtYWNybywgeW91IG11c3Qgc3VwcGx5IF9fc3RsX2RlYnVnX21lc3NhZ2UKKyAqIGZ1bmN0aW9uIGRlZmluaXRpb24gc29tZXdoZXJlLgorICovCisvKgorI2RlZmluZSBfU1RMUF9ERUJVR19NRVNTQUdFIDEKKyovCisKKy8qCisgKiBVbmNvbW1lbnQgdGhpcyB0byBmb3JjZSBhbGwgZmFpbGVkIGFzc2VydGlvbnMgdG8gYmUgZXhlY3V0ZWQgdGhyb3VnaAorICogdXNlci1kZWZpbmVkIGdsb2JhbCBmdW5jdGlvbjoKKyAqICB2b2lkIF9fc3RsX2RlYnVnX3Rlcm1pbmF0ZSh2b2lkKS4gVGhpcyBhbGxvd3MKKyAqIHlvdSB0byB0YWtlIGNvbnRyb2wgb2YgYXNzZXJ0aW9uIGJlaGF2aW91ciBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgorICogRGVmYXVsdCByb3V0aW5lIGNhbGxzIF9TVExQX0FCT1JUKCkuCisgKiBOb3RlIDogSWYgeW91IHNldCB0aGlzIG1hY3JvLCB5b3UgbXVzdCBzdXBwbHkgX19zdGxfZGVidWdfdGVybWluYXRlCisgKiBmdW5jdGlvbiBkZWZpbml0aW9uIHNvbWV3aGVyZS4KKyAqLworLyoKKyNkZWZpbmUgX1NUTFBfREVCVUdfVEVSTUlOQVRFIDEKKyovCisKKy8qCisgKiBVbmNvbW1lbnQgdGhhdCB0byBkaXNhYmxlIGV4Y2VwdGlvbiBoYW5kbGluZyBjb2RlCisgKi8KKy8qCisjZGVmaW5lIF9TVExQX0RPTlRfVVNFX0VYQ0VQVElPTlMgMQorKi8KKworLyoKKyAqIF9TVExQX05PX05BTUVTUEFDRVM6IGlmIGRlZmluZWQsIGRvbid0IHB1dCB0aGUgbGlicmFyeSBpbiBuYW1lc3BhY2UKKyAqIHN0bHBvcnQ6OiBvciBzdGQ6OiwgZXZlbiBpZiB0aGUgY29tcGlsZXIgc3VwcG9ydHMgbmFtZXNwYWNlcworICovCisvKgorI2RlZmluZSBfU1RMUF9OT19OQU1FU1BBQ0VTIDEKKyovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29tcGF0aWJpbGl0eSBzZWN0aW9uCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKgorICogVXNlIGFiYnJldmlhdGVkIGNsYXNzIG5hbWVzIGZvciBsaW5rZXIgYmVuZWZpdCAoZG9uJ3QgYWZmZWN0IGludGVyZmFjZSkuCisgKiBUaGlzIG9wdGlvbiBpcyBvYnNvbGV0ZSwgYnV0IHNob3VsZCB3b3JrIGluIHRoaXMgcmVsZWFzZS4KKyAqCisgKi8KKy8qCisjZGVmaW5lIF9TVExQX1VTRV9BQkJSRVZTCisqLworCisvKgorICogVGhpcyBkZWZpbml0aW9uIHByZWNsdWRlcyBTVExwb3J0IHJldmVyc2VfaXRlcmF0b3IgdG8gYmUgY29tcGF0aWJsZSB3aXRoCisgKiBvdGhlciBwYXJ0cyBvZiBNU1ZDIGxpYnJhcnkuIChXaXRoIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24sIGl0IGp1c3QKKyAqIGhhcyBubyBlZmZlY3QpLgorICogVXNlIGl0IF9PTkxZXyBpZiB5b3UgdXNlIFNHSS1zdHlsZSByZXZlcnNlX2l0ZXJhdG9yPD4gdGVtcGxhdGUgZXhwbGljaXRseQorICovCisvKgorI2RlZmluZSBfU1RMUF9OT19NU1ZDNTBfQ09NUEFUSUJJTElUWSAxCisqLworCisvKgorICogVXNlIG9ic29sZXRlIG92ZXJsb2FkZWQgdGVtcGxhdGUgZnVuY3Rpb25zIGl0ZXJhdG9yX2NhdGVnb3J5KCksIHZhbHVlX3R5cGUoKSwgZGlzdGFuY2VfdHlwZSgpCisgKiBmb3IgcXVlcnlpbmcgaXRlcmF0b3IgcHJvcGVydGllcy4gUGxlYXNlIG5vdGUgdGhvc2UgbmFtZXMgYXJlIG5vbi1zdGFuZGFyZCBhbmQgYXJlIG5vdCBndWFyYW50ZWVkCisgKiB0byBiZSB1c2VkIGJ5IGV2ZXJ5IGltcGxlbWVudGF0aW9uLiBIb3dldmVyLCB0aGlzIHNldHRpbmcgaXMgb24gYnkgZGVmYXVsdCB3aGVuIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24KKyAqIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGUgY29tcGlsZXIgYW5kIGNhbm5vdCBiZSBzaW11bGF0ZWQgKG9ubHkgaWYgX1NUTFBfTk9fQU5BQ0hST05JU01TIGlzIG5vdCBzZXQpLgorICogVXNlIG9mIHRob3NlIGludGVyZmFjZXMgZm9yIHVzZXItZGVmaW5lZCBpdGVyYXRvcnMgaXMgc3Ryb25nbHkgZGlzY291cmFnZWQ6CisgKiBwbGVhc2UgdXNlIHB1YmxpYyBpbmhlcml0YW5jZSBmcm9tIGl0ZXJhdG9yPD4gdGVtcGxhdGUgdG8gYWNoaWV2ZSBkZXNpcmVkIGVmZmVjdC4KKyAqIFNlY29uZCBmb3JtIGlzIHRvIGRpc2FibGUgb2xkLXN0eWxlIHF1ZXJpZXMgaW4gYW55IGNhc2UuCisgKi8KKy8qCisjZGVmaW5lIF9TVExQX1VTRV9PTERfSFBfSVRFUkFUT1JfUVVFUklFUworI2RlZmluZSBfU1RMUF9OT19PTERfSFBfSVRFUkFUT1JfUVVFUklFUworKi8KKworCisvKgorICogT24gc3lzdGVtcyB3aXRoIHN1cHBvcnQgb2YgbGFyZ2UgZmlsZXMgKF9MQVJHRUZJTEVfU09VUkNFLAorICogX0xBUkdFRklMRTY0X1NPVVJDRSBkZWZpbmVkKSB3ZSB3aWxsIHVzZSA2NC1iaXQgZmlsZSBvZmZzZXQsIGV2ZW4gaWYKKyAqIF9fVVNFX0ZJTEVfT0ZGU0VUNjQgb3IgX0ZJTEVfT0ZGU0VUX0JJVFMgbm90IGRlZmluZWQgb3IgX0ZJTEVfT0ZGU0VUX0JJVFMKKyAqIGxlc3MgdGhhbiA2NC4gSW4gdGhlIGxhc3QgY2FzZSBzaXplb2Yoc3RkOjpzdHJlYW1vZmYpIG1heSBub3QgYmUgZXF1YWwgdG8KKyAqIHNpemVvZihvZmZfdCk7IGlmIHlvdSB3YW50IHRvIGZvcmNlIGVxdWFsIHNpemUgb2Ygb2ZmX3QgYW5kIHN0cmVhbW9mZiwKKyAqIHVuY29tbWVudCBtYWNybyBiZWxvdy4gQnV0IHBheSBhdHRlbnRpb24sIHRoaXMgaGFzIGluZmx1ZW5jZSBvbiBsaWJzdGxwb3J0CisgKiBhbmQgaW4gZnV0dXJlIHVzYWdlIGl0IG1heSBjYXVzZSBjb25mbGljdCB3aXRoIGRlZmluZWQgX0ZJTEVfT0ZGU0VUX0JJVFMgbWFjcm8uCisgKi8KKworLyoKKyNkZWZpbmUgX1NUTFBfVVNFX0RFRkFVTFRfRklMRV9PRkZTRVQKKyovCisKKy8qCisgKiBfU1RMUF9VU0VfU1RESU9fSU8sIF9TVExQX1VTRV9VTklYX0lPOiBmb3JjZSBzZWxlY3Rpb24gb2Ygc3RkaW8gY2FsbHMKKyAqIChmb3Blbi9mbG9zZS9mcmVhZC9md3JpdGUpIHVuZGVyIGZzdHJlYW0gYnVmZmVycyBvciB1bmlzdGQgY2FsbHMKKyAqIChvcGVuL2Nsb3NlL3JlYWQvd3JpdGUgKyBtbWFwKS4gT24gc3lzdGVtcyB0aGF0IGhhdmUgYm90aCAoaS5lLiBtb3N0IFVuaXhlcykKKyAqIF9TVExQX1VTRV9VTklYX0lPIGlzIHVzZWQuIAorICoKKyAqIFRoZXJlIGlzIGEgdGhpcmQgdmFyaWFudCBmb3IgV2luZG93czogX1NUTFBfVVNFX1dJTjMyX0lPLCB0aGF0IGJhc2VkCisgKiBvbiBXaW5kb3dzIGNhbGxzIChDcmVhdGVGaWxlL0Nsb3NlSGFuZGxlL1JlYWRGaWxlL1dyaXRlRmlsZSArIENyZWF0ZUZpbGVNYXBwaW5nLAorICogTWFwVmlld09mRmlsZSkKKyAqCisgKiBVbmNvbW1lbnQgb25seSBvbmUgZGVmaW5lIGhlcmUhCisgKi8KKy8qCisjZGVmaW5lIF9TVExQX1VTRV9VTklYX0lPCisqLworLyoKKyNkZWZpbmUgX1NUTFBfVVNFX1NURElPX0lPCisqLworLyoKKyNkZWZpbmUgX1NUTFBfVVNFX1dJTjMyX0lPCisgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qIFRoaXMgc2VjdGlvbiBjb250YWlucyBzd2l0aGVzIHdoaWNoIHNob3VsZCBiZSBvZmYgYnkgZGVmYXVsdCwKKyAqIGJ1dCBzbyBmZXcgY29tcGlsZXJzIHdvdWxkIGhhdmUgaXQgdW5kZWZpbmVkLCBzbyB0aGF0IHdlIHNldCB0aGVtIGhlcmUsCisgKiB3aXRoIHRoZSBvcHRpb24gdG8gYmUgdHVybmVkIG9mZiBsYXRlciBpbiBjb21waWxlci1zcGVjaWZpYyBmaWxlCisgKi8KKworI2RlZmluZSBfU1RMUF9OT19VTkNBVUdIVF9FWENFUFRfU1VQUE9SVAorI2RlZmluZSBfU1RMUF9OT19VTkVYUEVDVEVEX0VYQ0VQVF9TVVBQT1JUCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjaWYgZGVmaW5lZChfX3N1bikgJiYgZGVmaW5lZChfX0dOVUNfXykKKy8qIF9fU3VuT1NfNV94IGlzIG5vdCBkZWZpbmVkIGluIGhlYWRlcnMsIGFuZCB0aGVyZSBpcyBubyB3YXkgdG8gZGVyaXZlIGl0IGZyb20gaGVhZGVycyBvbmx5OworICogbmV2ZXJ0aGVsZXNzIHRoaXMgbWFjcm8gZGVmaW5lZCBhdXRvbWFnaWNhbGx5IGJ5IFN1blBybyBjb21waWxlcnMgZmFtaWx5OworICoKKyAqIGdjYyBrbm93IG5vdGhpbmcgYWJvdXQgaXQsIGJ1dCBkZWZpbmluZyBpdCB3aXRoIC1EIG9uIGNvbXBpbGVyIGNvbW1hbmQgbGluZQorICogaXMgYSBiYWQgaWRlYSBmcm9tIG9uZSBzaWRlLCBhbmQgdGhpcyBpbmZvIHN0aWxsIHVzZWZ1bCB3aGVuIHdlIHdhbnQgdG8gdXNlCisgKiAob3IgZG9uJ3QgdXNlKSBzb21lIFNvbGFyaXMgdmVyc2lvbi1zcGVjaWZpYyBmZWF0dXJlcyBmcm9tIG90aGVyIHNpZGUuCisgKiBPZiBjb3Vyc2UsIHRoZSBiZXN0IHdheSBpcyB0byBkZWZpbmUgaXQgaW4gc3BlYyBmaWxlLCBidXQgdGhpcyBpcyBiZXlvbmQgb3VyIHNjb3BlLgorICoKKyAqIFVuY29tbWVudCBPTkUgb2YgdGhlIGZvbGxvd2luZywgZGVwZW5kcyBvbiB3aGF0IFNvbGFyaXMgdmVyc2lvbiB5b3UgdXNlLgorICovCisKKy8qCisjZGVmaW5lIF9fU3VuT1NfNV81XzEKKyAqLworLyoKKyNkZWZpbmUgX19TdW5PU181XzYKKyAqLworLyoKKyNkZWZpbmUgX19TdW5PU181XzcKKyAqLworLyoKKyNkZWZpbmUgX19TdW5PU181XzgKKyAqLworLyoKKyNkZWZpbmUgX19TdW5PU181XzkKKyAqLworLyoKKyNkZWZpbmUgX19TdW5PU181XzEwCisgKi8KKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX3N1bikKKy8qIFdpdGggZm9sbG93aW5nIHBhdGNoZXMgU29sYXJpcyA4IGFuZCA5IHdpbGwgaGF2ZSAqbCBhbmQgKmYgKGxvbmcgZG91YmxlIGFuZCBmbG9hdCkKKyAqIHZhcmlhbnRzIG9mIG1hdGggZnVuY3Rpb25zOgorICogICBTdW5PUyA1LjggcGF0Y2ggMTExNzIxLTA0IChNYXkvMDgvMjAwMykKKyAqICAgICA8aHR0cDovL3N1bnNvbHZlLnN1bi5jb20vc2VhcmNoL2RvY3VtZW50LmRvP2Fzc2V0a2V5PTEtMjEtMTExNzIxLTA0LTE+CisgKiAgIFN1bk9TIDUuOSBwYXRjaCAxMTE3MjItMDQgKE1heS8wOC8yMDAzKQorICogICAgIDxodHRwOi8vc3Vuc29sdmUuc3VuLmNvbS9zZWFyY2gvZG9jdW1lbnQuZG8/YXNzZXRrZXk9MS0yMS0xMTE3MjItMDQtMT4KKyAqIFNvbGFyaXMgMTAgaGFzIHRoaXMgZnVuY3Rpb25zIGZyb20gYm94LgorICovCisvKgorI2RlZmluZSBfU1RMUF9TT0xBUklTX01BVEhfUEFUQ0gKKyAqLworI2VuZGlmCisKKy8qCisgIExvY2FsIFZhcmlhYmxlczoKKyAgbW9kZTpDKysKKyAgRW5kOgorKi8KZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL2NvbmZpZy9zdGxfY29uZml4LmggYi9zdGxwb3J0L3N0bC9jb25maWcvc3RsX2NvbmZpeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkY2RmMWQKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9jb25maWcvc3RsX2NvbmZpeC5oCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisvKgorICogU1RMcG9ydCBjb25maWd1cmF0aW9uIGZpbGUKKyAqIEl0IGlzIGludGVybmFsIFNUTHBvcnQgaGVhZGVyIC0gRE8gTk9UIGluY2x1ZGUgaXQgZGlyZWN0bHkKKyAqIFB1cnBvc2Ugb2YgdGhpcyBmaWxlIDogdG8gZGVmaW5lIFNUTHBvcnQgc2V0dGluZ3MgdGhhdCBkZXBlbmQgb24KKyAqIGNvbXBpbGVyIGZsYWdzIG9yIGNhbiBiZSBvdGhlcndpc2UgbWlzc2VkCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfQ09ORklYX0gKKyNkZWZpbmUgX1NUTFBfQ09ORklYX0gKKworLyogSWYsIGJ5IGFueSBjaGFuY2UsIEMgY29tcGlsZXIgZ2V0cyB0aGVyZSwgdHJ5IHRvIGhlbHAgaXQgdG8gcGFzcyBzbW9vdGhseSAqLworI2lmICEgZGVmaW5lZCAoX19jcGx1c3BsdXMpICYmICEgZGVmaW5lZCAoX1NUTFBfSEFTX05PX05BTUVTUEFDRVMpCisjICBkZWZpbmUgX1NUTFBfSEFTX05PX05BTUVTUEFDRVMKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19NSU5HVzMyX18pCisjICBkZWZpbmUgX1NUTFBfTk9fRFJBTkQ0OAorI2VuZGlmCisKKy8qIE1vZGVuYSBDKysgbGlicmFyeSAgKi8KKyNpZiBkZWZpbmVkIChfX01XRVJLU19fKSAmJiBfX01XRVJLU19fIDw9IDB4MjMwMyB8fCAoZGVmaW5lZCAoX19LQ0MpICYmIF9fS0NDX1ZFUlNJT04gPCAzNDAwKQorIyAgaW5jbHVkZSA8bWNvbXBpbGUuaD4KKyMgIGRlZmluZSBfU1RMUF9VU0VfTVNJUEwgMQorIyAgaWYgZGVmaW5lZCAoX19LQ0MpIHx8IChkZWZpbmVkKF9fTVNMX0NQUF9fKSAmJiBcCisgICAgICAgKCAoX19NU0xfQ1BQX18gPj0gMHg1MDAwICYmIGRlZmluZWQoIF9NU0xfTk9fTUVTU0FHRV9GQUNFVCApKSB8fCBcCisgICAgICAgKF9fTVNMX0NQUF9fIDwgMHg1MDAwICYmIGRlZmluZWQoIE1TSVBMX05MX1RZUEVTICkpKSkKKyMgICAgZGVmaW5lIF9TVExQX05PX05BVElWRV9NRVNTQUdFX0ZBQ0VUIDEKKyMgIGVuZGlmCisjZW5kaWYKKworLyogY29tbW9uIHN3aXRjaGVzIGZvciBFREcgZnJvbnQtZW5kICovCisvKiBfX0VER19TV0lUQ0hFUyBkbyBub3Qgc2VlbSB0byBiZSBhbiBvZmZpY2lhbCBFREcgbWFjcm8uCisgKiBXZSBrZWVwIGl0IGZvciBoaXN0b3JpY2FsIHJlYXNvbi4gKi8KKyNpZiBkZWZpbmVkIChfX0VER19TV0lUQ0hFUykKKyMgIGlmICEoZGVmaW5lZChfVFlQRU5BTUUpIHx8IGRlZmluZWQgKF9UWVBFTkFNRV9JU19LRVlXT1JEKSkKKyMgICAgdW5kZWYgIF9TVExQX05FRURfVFlQRU5BTUUKKyMgICAgZGVmaW5lIF9TVExQX05FRURfVFlQRU5BTUUgMQorIyAgZW5kaWYKKyMgIGlmbmRlZiBfV0NIQVJfVF9JU19LRVlXT1JECisjICAgIHVuZGVmIF9TVExQX05PX1dDSEFSX1QKKyMgICAgZGVmaW5lIF9TVExQX05PX1dDSEFSX1QgMQorIyAgZW5kaWYKKyMgIGlmbmRlZiBfUEFSVElBTF9TUEVDSUFMSVpBVElPTl9PRl9DTEFTU19URU1QTEFURVMKKyMgICAgdW5kZWYgX1NUTFBfTk9fQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTgorIyAgICBkZWZpbmUgX1NUTFBfTk9fQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTiAxCisjICBlbmRpZgorIyAgaWZuZGVmIF9NRU1CRVJfVEVNUExBVEVTCisjICAgIHVuZGVmIF9TVExQX05PX01FTUJFUl9URU1QTEFURVMKKyMgICAgZGVmaW5lIF9TVExQX05PX01FTUJFUl9URU1QTEFURVMgMQorIyAgICB1bmRlZiBfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVfQ0xBU1NFUworIyAgICBkZWZpbmUgX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFX0NMQVNTRVMgMQorIyAgZW5kaWYKKyMgIGlmbmRlZiBfTUVNQkVSX1RFTVBMQVRFX0tFWVdPUkQKKyMgICAgdW5kZWYgIF9TVExQX05PX01FTUJFUl9URU1QTEFURV9LRVlXT1JECisjICAgIGRlZmluZSBfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVfS0VZV09SRCAxCisjICBlbmRpZgorIyAgaWYgIWRlZmluZWQgKF9fRVhDRVBUSU9OUykgJiYgISBkZWZpbmVkIChfRVhDRVBUSU9OUykKKyMgICAgdW5kZWYgIF9TVExQX0hBU19OT19FWENFUFRJT05TCisjICAgIGRlZmluZSBfU1RMUF9IQVNfTk9fRVhDRVBUSU9OUworIyAgZW5kaWYKKyMgIHVuZGVmIF9fRURHX1NXSVRDSEVTCisjZW5kaWYgLyogRURHICovCisKKy8qIF9fRURHX1ZFUlNJT05fXyBpcyBhbiBvZmZpY2lhbCBFREcgbWFjcm8sIGNvbXBpbGVycyBiYXNlZAorICogb24gRURHIGhhdmUgdG8gZGVmaW5lIGl0LiAqLworI2lmIGRlZmluZWQgKF9fRURHX1ZFUlNJT05fXykKKyMgIGlmIChfX0VER19WRVJTSU9OX18gPj0gMjQ0KSAmJiAhZGVmaW5lZCAoX1NUTFBfSEFTX0lOQ0xVREVfTkVYVCkKKyMgICAgZGVmaW5lIF9TVExQX0hBU19JTkNMVURFX05FWFQKKyMgIGVuZGlmCisjICBpZiAoX19FREdfVkVSU0lPTl9fIDw9IDI0MCkgJiYgIWRlZmluZWQgKF9TVExQX0RPTlRfUkVUVVJOX1ZPSUQpCisjICAgIGRlZmluZSBfU1RMUF9ET05UX1JFVFVSTl9WT0lECisjICBlbmRpZgorIyAgaWYgIWRlZmluZWQgKF9fRVhDRVBUSU9OUykgJiYgIWRlZmluZWQgKF9TVExQX0hBU19OT19FWENFUFRJT05TKQorIyAgICBkZWZpbmUgX1NUTFBfSEFTX05PX0VYQ0VQVElPTlMKKyMgIGVuZGlmCisjICBpZiAhZGVmaW5lZCAoX19OT19MT05HX0xPTkcpICYmICFkZWZpbmVkIChfU1RMUF9MT05HX0xPTkcpCisjICAgIGRlZmluZSBfU1RMUF9MT05HX0xPTkcgbG9uZyBsb25nCisjICBlbmRpZgorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdGwvY29uZmlnL3N0bF9teWNvbXAuaCBiL3N0bHBvcnQvc3RsL2NvbmZpZy9zdGxfbXljb21wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkyOTAyZgotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc3RsL2NvbmZpZy9zdGxfbXljb21wLmgKQEAgLTAsMCArMSwyODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisvKgorICogUHVycG9zZSBvZiB0aGlzIGZpbGUgOgorICoKKyAqIEEgbGlzdCBvZiBDT01QSUxFUi1TUEVDSUZJQyBwb3J0aW9uIG9mIFNUTHBvcnQgc2V0dGluZ3MuCisgKiBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgdG8gaGVscCBpbiBtYW51YWwgY29uZmlndXJhdGlvbgorICogb2YgU1RMcG9ydC4gVGhpcyBmaWxlIGlzIGJlaW5nIGluY2x1ZGVkIGJ5IHN0bGNvbXAuaAorICogd2hlbiBTVExwb3J0IGlzIHVuYWJsZSB0byBpZGVudGlmeSB5b3VyIGNvbXBpbGVyLgorICogUGxlYXNlIHJlbW92ZSB0aGUgZXJyb3IgZGlhZ25vc3RpYyBiZWxvdyBiZWZvcmUgYWRqdXN0aW5nCisgKiBtYWNyb3MuCisgKgorICovCisjaWZuZGVmIF9TVExQX01ZQ09NUF9ICisjZGVmaW5lICBfU1RMUF9NWUNPTVBfSAorCisjZXJyb3IgIllvdXIgY29tcGlsZXIgdmVyc2lvbiBpcyBub3QgcmVjb2duaXplZCBieSBTVExwb3J0LiBQbGVhc2UgZWRpdCA8c3RscG9ydC9zdGwvY29uZmlnL3N0bF9teWNvbXAuaD4iCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyB0aGUgdmFsdWVzIGNob29zZW4gaGVyZSBhcyBkZWZhdWx0cyB0cnkgdG8gZ2l2ZQorLy8gbWF4aW11bSBmdW5jdGlvbmFsaXR5IG9uIHRoZSBtb3N0IGNvbnNlcnZhdGl2ZSBzZXR0aW5ncworCisvLyBNb3N0bHkgY29ycmVjdCBndWVzcywgY2hhbmdlIGl0IGZvciBBbHBoYSAoYW5kIG90aGVyIGVudmlyb25tZW50cworLy8gdGhhdCBoYXMgNjQtYml0ICJsb25nIikKKy8vICMgIGRlZmluZSBfU1RMUF9VSU5UMzJfVCB1bnNpZ25lZCBsb25nCisKKy8vIERpc2FibGVzIHdjaGFyX3QgZnVuY3Rpb25hbGl0eQorLy8gIyAgZGVmaW5lIF9TVExQX05PX1dDSEFSX1QgIDEKKworLy8gRGVmaW5lIGlmIHdjaGFyX3QgaXMgbm90IGFuIGludHJpbnNpYyB0eXBlLCBhbmQgaXMgYWN0dWFsbHkgYSB0eXBlZGVmIHRvIHVuc2lnbmVkIHNob3J0LgorLy8gIyAgZGVmaW5lIF9TVExQX1dDSEFSX1RfSVNfVVNIT1JUIDEKKworLy8gVW5jb21tZW50IGlmIGxvbmcgbG9uZyBpcyBhdmFpbGFibGUKKy8vICMgIGRlZmluZSBfU1RMUF9MT05HX0xPTkcgbG9uZyBsb25nCisKKy8vIFVuY29tbWVudCBpZiBsb25nIGRvdWJsZSBpcyBub3QgYXZhaWxhYmxlCisvLyAjICBkZWZpbmUgX1NUTFBfTk9fTE9OR19ET1VCTEUgMQorCisvLyBVbmNvbW1lbnQgdGhpcyBpZiB5b3VyIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgInR5cGVuYW1lIiBrZXl3b3JkCisvLyAjICBkZWZpbmUgX1NUTFBfTkVFRF9UWVBFTkFNRSAxCisKKy8vIFVuY29tbWVudCB0aGlzIGlmIHlvdXIgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCAibXV0YWJsZSIga2V5d29yZAorLy8gIyAgZGVmaW5lIF9TVExQX05FRURfTVVUQUJMRSAxCisKKy8vIFVuY29tbWVudCB0aGlzIGlmIHlvdXIgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCAiZXhwbGljaXQiIGtleXdvcmQKKy8vICMgIGRlZmluZSBfU1RMUF9ORUVEX0VYUExJQ0lUIDEKKworLy8gVW5jb21tZW50IGlmIG5ldy1zdHlsZS1jYXN0cyBsaWtlIGNvbnN0X2Nhc3Q8PiBhcmUgbm90IGF2YWlsYWJsZQorLy8gIyAgZGVmaW5lIF9TVExQX05PX05FV19TVFlMRV9DQVNUUyAxCisKKy8vIFVuY29tbWVudCB0aGlzIGlmIHlvdXIgY29tcGlsZXIgZG9lcyBub3QgaGF2ZSAiYm9vbCIgdHlwZQorLy8gIyAgZGVmaW5lICBfU1RMUF9OT19CT09MIDEKKworLy8gVW5jb21tZW50IHRoaXMgaWYgeW91ciBjb21waWxlciBkb2VzIG5vdCBoYXZlICJib29sIiB0eXBlLCBidXQgaGFzICJib29sIiBrZXl3b3JkIHJlc2VydmVkCisvLyAjICBkZWZpbmUgIF9TVExQX0RPTlRfVVNFX0JPT0xfVFlQRURFRiAxCisKKy8vIFVuY29tbWVudCB0aGlzIGlmIHlvdXIgY29tcGlsZXIgZG9lcyBub3QgaGF2ZSAiYm9vbCIgdHlwZSwgYnV0IGRlZmluZXMgImJvb2wiIGluIDx5dmFscy5oPgorLy8gIyAgZGVmaW5lICBfU1RMUF9ZVkFMU19IIDEKKworLy8gVW5jb21tZW50IHRoaXMgaWYgeW91ciBjb21waWxlciBoYXMgbGltaXRlZCBvciBubyBkZWZhdWx0IHRlbXBsYXRlIGFyZ3VtZW50cyBmb3IgY2xhc3NlcworLy8gIyAgZGVmaW5lIF9TVExQX0xJTUlURURfREVGQVVMVF9URU1QTEFURVMgMQorCisvLyBVbmNvbW1lbnQgdGhpcyBpZiB5b3VyIGNvbXBpbGVyIHN1cHBvcnQgb25seSBjb21wbGV0ZSAobm90IGRlcGVuZGVudCBvbiBvdGhlciBwYXJhbWV0ZXJzKQorLy8gdHlwZXMgYXMgZGVmYXVsdCBwYXJhbWV0ZXJzIGZvciBjbGFzcyB0ZW1wbGF0ZXMKKy8vICMgIGRlZmluZSBfU1RMUF9ERUZBVUxUX1RZUEVfUEFSQU0gMQorCisvLyBVbmNvbW1lbnQgdGhpcyBpZiB5b3VyIGNvbXBpbGVyIGRvIG5vdCBzdXBwb3J0IGRlZmF1bHQgcGFyYW1ldGVycyBpbiB0ZW1wbGF0ZSBjbGFzcyBtZXRob2RzCisvLyAjICBkZWZpbmUgX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSAxCisKKy8vIFVuY29tbWVudCB0aGlzIGlmIHlvdXIgY29tcGlsZXIgaGFzIHByb2JsZW0gd2l0aCBub3QtdHlwZQorLy8gZGVmYXVsdCB0ZW1wbGF0ZSBwYXJhbWV0ZXJzCisvLyAjICBkZWZpbmUgX1NUTFBfTk9fREVGQVVMVF9OT05fVFlQRV9QQVJBTSAxCisKKy8vIERlZmluZSBpZiBjb21waWxlciBoYXMKKy8vIHRyb3VibGUgd2l0aCBmdW5jdGlvbnMgZ2V0dGluZyBub24tdHlwZS1wYXJhbWV0ZXJpemVkIGNsYXNzZXMgYXMgcGFyYW1ldGVycworLy8gIyAgZGVmaW5lIF9TVExQX05PTl9UWVBFX1RNUExfUEFSQU1fQlVHIDEKKworLy8gVW5jb21tZW50IHRoaXMgaWYgeW91ciBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IG5hbWVzcGFjZXMKKy8vICMgIGRlZmluZSBfU1RMUF9IQVNfTk9fTkFNRVNQQUNFUyAxCisKKy8vIFVuY29tbWVudCBpZiAidXNpbmciIGtleXdvcmQgZG9lcyBub3Qgd29yayB3aXRoIHRlbXBsYXRlIHR5cGVzCisvLyAjIGRlZmluZSBfU1RMUF9CUk9LRU5fVVNJTkdfRElSRUNUSVZFIDEKKworLy8gVW5jb21tZW50IHRoaXMgaWYgeW91ciBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IGV4Y2VwdGlvbnMKKy8vICMgIGRlZmluZSBfU1RMUF9IQVNfTk9fRVhDRVBUSU9OUyAxCisKKy8vIFVuY29tbWVudCB0aGlzIHdoZW4geW91IGFyZSBhYmxlIHRvIGRldGVjdCB0aGF0IHRoZSB1c2VyIGRvIG5vdAorLy8gd2FudCB0byB1c2UgdGhlIGV4Y2VwdGlvbnMgZmVhdHVyZS4KKy8vICMgIGRlZmluZSBfU1RMUF9ET05UX1VTRV9FWENFUFRJT05TIDEKKworLy8gVW5jb21tZW50IHRoaXMgaWYgeW91ciBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9ucworLy8gIyAgZGVmaW5lIF9TVExQX05PX0VYQ0VQVElPTl9TUEVDCisKKy8vIERlZmluZSB0aGlzIGlmIHlvdXIgY29tcGlsZXIgcmVxdWlyZXMgcmV0dXJuIHN0YXRlbWVudCBhZnRlciB0aHJvdygpCisvLyAjIGRlZmluZSBfU1RMUF9USFJPV19SRVRVUk5fQlVHIDEKKworLy8gRGVmaW5lIHRoaXMgaWYgeW91ciBjb21waWxlciBkbyBub3Qgc3VwcG9ydCByZXR1cm4gb2Ygdm9pZAorLy8gIyBkZWZpbmUgX1NUTFBfRE9OVF9SRVRVUk5fVk9JRCAxCisKKy8vIEhlYWRlciA8bmV3PiB0aGF0IGNvbWVzIHdpdGggdGhlIGNvbXBpbGVyCisvLyBkb2VzIG5vdCBkZWZpbmUgYmFkX2FsbG9jIGV4Y2VwdGlvbgorLy8gIyAgZGVmaW5lIF9TVExQX05PX0JBRF9BTExPQyAgMQorCisvLyBEZWZpbmUgdGhpcyBpZiB5b3VyIGNvbXBpbGVyIGRvIG5vdCB0aHJvdyBiYWRfYWxsb2MgZnJvbSB0aGUgbmV3IG9wZXJhdG9yCisvLyAjICBkZWZpbmUgX1NUTFBfTkVXX0RPTlRfVEhST1dfQkFEX0FMTE9DICAxCisKKy8vIERlZmluZSB0aGlzIGlmIHlvdXIgY29tcGlsZXIgaGFzIG5vIHJ0dGkgc3VwcG9ydCBvciBpZiBpdCBoYXMgYmVlbiBkaXNhYmxlZAorLy8gIyAgZGVmaW5lIF9TVExQX05PX1JUVEkgMQorCisvLyBEZWZpbmUgdGhpcyBpZiB0aGVyZSBpcyBubyBuYXRpdmUgdHlwZV9pbmZvIGRlZmluaXRpb24KKy8vICMgIGRlZmluZSBfU1RMUF9OT19UWVBFSU5GTyAxCisKKy8vIFVuY29tbWVudCBpZiBtZW1iZXIgdGVtcGxhdGUgbWV0aG9kcyBhcmUgbm90IGF2YWlsYWJsZQorLy8gIyAgZGVmaW5lIF9TVExQX05PX01FTUJFUl9URU1QTEFURVMgICAxCisKKy8vIFVuY29tbWVudCBpZiBtZW1iZXIgdGVtcGxhdGUgY2xhc3NlcyBhcmUgbm90IGF2YWlsYWJsZQorLy8gIyAgZGVmaW5lIF9TVExQX05PX01FTUJFUl9URU1QTEFURV9DTEFTU0VTICAgMQorCisvLyBVbmNvbW1lbnQgaWYgeW91ciBjb21waWxlciBkbyBub3Qgc3VwcG9ydCB0aGUgc3RkOjphbGxvY2F0b3IgcmViaW5kIHRlY2huaXF1ZQorLy8gVGhpcyBpcyBhIHNwZWNpYWwgY2FzZSBvZiBiYWQgbWVtYmVyIHRlbXBsYXRlIGNsYXNzZXMgc3VwcG9ydCwgaXQgaXMgYXV0b21hdGljYWxseQorLy8gZGVmaW5lZCBpZiBfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVfQ0xBU1NFUyBpcyBkZWZpbmVkLgorLy8gIyBkZWZpbmUgX1NUTFBfRE9OVF9TVVBQT1JUX1JFQklORF9NRU1CRVJfVEVNUExBVEUgMQorCisvLyBVbmNvbW1lbnQgaWYgbm8gInRlbXBsYXRlIiBrZXl3b3JkIHNob3VsZCBiZSB1c2VkIHdpdGggbWVtYmVyIHRlbXBsYXRlIGNsYXNzZXMKKy8vICMgIGRlZmluZSBfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVfS0VZV09SRCAgIDEKKworLy8gQ29tcGlsZXIgZG9lcyBub3QgYWNjZXB0IGZyaWVuZCBkZWNsYXJhdGlvbiBxdWFsaWZpZWQgd2l0aCBuYW1lc3BhY2UgbmFtZS4KKy8vICMgIGRlZmluZSBfU1RMUF9OT19RVUFMSUZJRURfRlJJRU5EUyAxCisKKy8vIFVuY29tbWVudCBpZiBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGlzIG5vdCBhdmFpbGFibGUKKy8vICMgIGRlZmluZSBfU1RMUF9OT19DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OIDEKKworLy8gRGVmaW5lIGlmIGNsYXNzIGJlaW5nIHBhcnRpYWxseSBzcGVjaWFsaXplZCByZXF1aXJlIGZ1bGwgbmFtZSAodGVtcGxhdGUgcGFyYW1ldGVycykKKy8vIG9mIGl0c2VsZiBmb3IgbWV0aG9kIGRlY2xhcmF0aW9ucworLy8gIyAgZGVmaW5lIF9TVExQX1BBUlRJQUxfU1BFQ19ORUVEU19URU1QTEFURV9BUkdTCisKKy8vIENvbXBpbGVyIGhhcyBwcm9ibGVtIHdpdGggcXVhbGlmaWVkIHNwZWNpYWxpemF0aW9ucyAoY29udCBpbnQsIHZvbGF0aWxlIGludC4uLikKKy8vICMgIGRlZmluZSBfU1RMUF9RVUFMSUZJRURfU1BFQ0lBTElaQVRJT05fQlVHCisKKy8vIENvbXBpbGVyIGhhcyBwcm9ibGVtcyBzcGVjaWFsaXppbmcgbWVtYmVycyBvZiBwYXJ0aWFsbHkKKy8vIHNwZWNpYWxpemVkIGNsYXNzCisvLyAjICBkZWZpbmUgX1NUTFBfTUVNQkVSX1NQRUNJQUxJWkFUSU9OX0JVRworCisvLyBVbmNvbW1lbnQgaWYgcGFydGlhbCBvcmRlciBvZiB0ZW1wbGF0ZSBmdW5jdGlvbnMgaXMgbm90IGF2YWlsYWJsZQorLy8gIyAgZGVmaW5lIF9TVExQX05PX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUiAxCisKKy8vIFVuY29tbWVudCBpZiBzcGVjaWFsaXphdGlvbiBvZiBtZXRob2RzIGlzIG5vdCBhbGxvd2VkCisvLyAjICBkZWZpbmUgX1NUTFBfTk9fTUVUSE9EX1NQRUNJQUxJWkFUSU9OICAxCisKKy8vIFVuY29tbWVudCBpZiBmdWxsICBzcGVjaWFsaXphdGlvbiBkb2VzIG5vdCB1c2UgcGFydGlhbCBzcGVjLiBzeW50YXggOiB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgLi4uLgorLy8gIyAgZGVmaW5lIF9TVExQX05PX1BBUlRJQUxfU1BFQ0lBTElaQVRJT05fU1lOVEFYICAxCisKKy8vIFVuY29tbWVudCBpZiBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IGV4cGxpY2l0IHRlbXBsYXRlIGFyZ3VtZW50cyBmb3IgZnVuY3Rpb25zCisvLyAjIGRlZmluZSBfU1RMUF9OT19FWFBMSUNJVF9GVU5DVElPTl9UTVBMX0FSR1MKKworLy8gVW5jb21tZW50IHRoaXMgaWYgeW91ciBjb21waWxlciBjYW4ndCBpbmxpbmUgd2hpbGUoKSwgZm9yKCkKKy8vICMgIGRlZmluZSBfU1RMUF9MT09QX0lOTElORV9QUk9CTEVNUyAxCisKKy8vIERlZmluZSBpZiB0aGUgY29tcGlsZXIgZmFpbHMgdG8gbWF0Y2ggYSB0ZW1wbGF0ZSBmdW5jdGlvbiBhcmd1bWVudCBvZiBiYXNlCisvLyAjICBkZWZpbmUgX1NUTFBfQkFTRV9NQVRDSF9CVUcgICAgICAgICAgMQorCisvLyBEZWZpbmUgaWYgdGhlIGNvbXBpbGVyIGZhaWxzIHRvIG1hdGNoIGEgdGVtcGxhdGUgZnVuY3Rpb24gYXJndW1lbnQgb2YgYmFzZQorLy8gKG5vbi10ZW1wbGF0ZSkKKy8vIyAgZGVmaW5lICBfU1RMUF9OT05URU1QTF9CQVNFX01BVENIX0JVRyAxCisKKy8vIERlZmluZSBpZiB0aGUgY29tcGlsZXIgcmVqZWN0cyBvdXRsaW5lIG1ldGhvZCBkZWZpbml0aW9uCisvLyBleHBsaWNpdGx5IHRha2luZyBuZXN0ZWQgdHlwZXMvdHlwZWRlZnMKKy8vICMgIGRlZmluZSBfU1RMUF9ORVNURURfVFlQRV9QQVJBTV9CVUcgICAxCisKKy8vIENvbXBpbGVyIHJlcXVpcmVzIHR5cGVuYW1lIGtleXdvcmQgb24gb3V0bGluZSBtZXRob2QgZGVmaW5pdGlvbgorLy8gZXhwbGljaXRseSB0YWtpbmcgbmVzdGVkIHR5cGVzL3R5cGVkZWZzCisvLyAjZGVmaW5lICBfU1RMUF9UWVBFTkFNRV9PTl9SRVRVUk5fVFlQRQorCisvLyBEZWZpbmUgaWYgdGhlIGJhc2VjbGFzcyB0eXBlZGVmcyBub3QgdmlzaWJsZSBmcm9tIG91dHNpZGUKKy8vICMgIGRlZmluZSBfU1RMUF9CQVNFX1RZUEVERUZfT1VUU0lERV9CVUcgMQorCisvLyBpZiB5b3VyIGNvbXBpbGVyIGhhdmUgc2VyaW91cyBwcm9ibGVtcyB3aXRoIHR5cGVkZWZzLCB0cnkgdGhpcyBvbmUKKy8vICMgIGRlZmluZSBfU1RMUF9CQVNFX1RZUEVERUZfQlVHICAgICAgICAgIDEKKworLy8gVW5jb21tZW50IGlmIGdldHRpbmcgZXJyb3JzIGNvbXBpbGluZyBtZW1fZnVuKiBhZGFwdG9ycworLy8gIyAgZGVmaW5lIF9TVExQX01FTUJFUl9QT0lOVEVSX1BBUkFNX0JVRyAxCisKKy8vIFVuY29tbWVudCBpZiB0aGUgY29tcGlsZXIgY2FuJ3QgaGFuZGxlIGEgY29uc3RhbnQtaW5pdGlhbGl6ZXIgaW4gdGhlCisvLyBkZWNsYXJhdGlvbiBvZiBhIHN0YXRpYyBjb25zdCBkYXRhIG1lbWJlciBvZiBpbnRlZ2VyIHR5cGUuCisvLyAoU2VlIHNlY3Rpb24gOS40LjIsIHBhcmFncmFwaCA0LCBvZiB0aGUgQysrIHN0YW5kYXJkLikKKy8vICMgZGVmaW5lIF9TVExQX1NUQVRJQ19DT05TVF9JTklUX0JVRworCisvLyBVbmNvbW1lbnQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgY29tcGlsZXIgZG8gbm90IGxpa2Ugc3RhdGljIGNvbnN0YW50CisvLyBkZWZpbml0aW9uLgorLy8gTWVhbmluZ2Z1bGwgb25seSBpZiAgX1NUTFBfU1RBVElDX0NPTlNUX0lOSVRfQlVHIGlzIG5vdCBkZWZpbmVkLgorLy8gIyBkZWZpbmUgX1NUTFBfTk9fU1RBVElDX0NPTlNUX0RFRklOSVRJT04KKworLy8gRGVmaW5lIGlmIGRlZmF1bHQgY29uc3RydWN0b3IgZm9yIGJ1aWx0aW4gaW50ZWdlciB0eXBlIGZhaWxzIHRvIGluaXRpYWxpemUgaXQgdG8gMAorLy8gSW4gZXhwcmVzc2lvbiBsaWtlIG5ldygmY2hhcikgY2hhcigpOgorLy8jIGRlZmluZSBfU1RMUF9ERUZfQ09OU1RfUExDVF9ORVdfQlVHIDEKKy8vIEluIGRlZmF1bHQgZnVuY3Rpb24gcGFyYW1ldGVyIGxpa2UgX01fbWV0aG9kKF9UcCBfX3ggPSBfVHAoKSkKKy8vIyBkZWZpbmUgX1NUTFBfREVGX0NPTlNUX0RFRl9QQVJBTV9CVUcgMQorCisvLyBEZWZpbmVkIGlmIGNvbnN0cnVjdG9yCisvLyByZXF1aXJlZCB0byBleHBsaWNpdGx5IGNhbGwgbWVtYmVyJ3MgZGVmYXVsdCBjb25zdHJ1Y3RvcnMgZm9yIGNvbnN0IG9iamVjdHMKKy8vICMgIGRlZmluZSBfU1RMUF9DT05TVF9DT05TVFJVQ1RPUl9CVUcgICAgMQorCisvLyBEZWZpbmVkIGlmIHRoZSBjb21waWxlciBoYXMgdHJvdWJsZSBjYWxsaW5nIFBPRC10eXBlcyBjb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcnMKKy8vICMgIGRlZmluZSBfU1RMUF9UUklWSUFMX0NPTlNUUlVDVE9SX0JVRyAgICAxCisvLyAjICBkZWZpbmUgX1NUTFBfVFJJVklBTF9ERVNUUlVDVE9SX0JVRyAgICAxCisKKy8vIERlZmluZSBpZiBoYXZpbmcgcHJvYmxlbXMgc3BlY2lhbGl6aW5nIG1hcHMvc2V0cyB3aXRoCisvLyBrZXkgdHlwZSBiZWluZyBjb25zdAorLy8gIyAgZGVmaW5lIF9TVExQX01VTFRJX0NPTlNUX1RFTVBMQVRFX0FSR19CVUcKKworLy8gVW5jb21tZW50IHRoaXMgdG8gZGlzYWJsZSAtPiBvcGVyYXRvcnMgb24gYWxsIGl0ZXJhdG9ycworLy8gIyAgZGVmaW5lICAgX1NUTFBfTk9fQVJST1dfT1BFUkFUT1IgMQorCisvLyBVbmNvbW1lbnQgdGhpcyB0byBkaXNibGUgYXQoKSBtZW1iZXIgZnVuY3Rpb25zIGZvciBjb250YWluZXJzCisvLyAjICBkZWZpbmUgICBfU1RMUF9OT19BVF9NRU1CRVJfRlVOQ1RJT04gMQorCisvLyBEZWZpbmUgdGhpcyBpZiBjb21waWxlciBsYWNrcyA8ZXhjZXB0aW9uPiBoZWFkZXIKKy8vICMgIGRlZmluZSBfU1RMUF9OT19FWENFUFRJT05fSEVBREVSIDEKKworLy8gVW5jb21tZW50IHRoaXMgaWYgeW91ciBDIGxpYnJhcnkgaGFzIGxyYW5kNDgoKSBmdW5jdGlvbgorLy8gIyAgZGVmaW5lIF9TVExQX1JBTkQ0OCAxCisKKy8vIFVuY29tbWVudCBpZiBuYXRpdmUgbmV3LXN0eWxlIEMgbGlicmFyeSBoZWFkZXJzIGxpbGUgPGNzdGRkZWY+LCBldGMgYXJlIG5vdCBhdmFpbGFibGUuCisvLyAjICAgZGVmaW5lIF9TVExQX0hBU19OT19ORVdfQ19IRUFERVJTIDEKKworLy8gdW5jb21tZW50IGlmIG5ldy1zdHlsZSBoZWFkZXJzIDxuZXc+IGlzIGF2YWlsYWJsZQorLy8gIyAgZGVmaW5lIF9TVExQX0hBU19ORVdfTkVXX0hFQURFUiAxCisKKy8vIHVuY29tbWVudCB0aGlzIGlmIDxpb3N0cmVhbT4gYW5kIG90aGVyIFNURCBoZWFkZXJzIHB1dCB0aGVpciBzdHVmZiBpbiA6Om5hbWVzcGFjZSwKKy8vIG5vdCBzdGQ6OgorLy8gIyAgZGVmaW5lIF9TVExQX1ZFTkRPUl9HTE9CQUxfU1RECisKKy8vIHVuY29tbWVudCB0aGlzIGlmIDxjc3RkaW8+IGFuZCB0aGUgbGlrZSBwdXQgc3R1ZmYgaW4gOjpuYW1lc3BhY2UsCisvLyBub3Qgc3RkOjoKKy8vICMgIGRlZmluZSBfU1RMUF9WRU5ET1JfR0xPQkFMX0NTVEQKKworLy8gdW5jb21tZW50IHRoaXMgaWYgeW91ciBjb21waWxlciBjb25zaWRlciBhcyBhbWJpZ3VvdXMgYSBmdW5jdGlvbiBpbXBvcnRlZCB3aXRoaW4KKy8vIHRoZSBzdGxwb3J0IG5hbWVzcGFjZSBhbmQgY2FsbGVkIHdpdGhvdXQgc2NvcGUgKDo6IG9yIHN0ZDo6KQorLy8gIyAgZGVmaW5lIF9TVExQX05PX1VTSU5HX0ZPUl9HTE9CQUxfRlVOQ1RJT05TIDEKKworLy8gdW5jb21tZW50IHRoaXMgaWYgeW91ciBjb21waWxlciBkZWZpbmUgYWxsIHRoZSBDIG1hdGggZnVuY3Rpb25zIEMrKyBhZGRpdGlvbmFsCisvLyBvdmVybG9hZHMgaW4gOjpuYW1lc3BhY2UgYW5kIG5vdCBvbmx5IGluIHN0ZDo6LgorLy8gIyAgZGVmaW5lIF9TVExQX0hBU19HTE9CQUxfQ19NQVRIX0ZVTkNUSU9OUyAxCisKKy8vIEVkaXQgcmVsYXRpdmUgcGF0aCBiZWxvdyAob3IgcHV0IGZ1bGwgcGF0aCkgdG8gZ2V0IG5hdGl2ZQorLy8gY29tcGlsZXIgaGVhZGVycyBpbmNsdWRlZC4gRGVmYXVsdCBpcyAiLi4vaW5jbHVkZSIuCisvLyBDIGhlYWRlcnMgbWF5IHJlc2lkZSBpbiBkaWZmZXJlbnQgZGlyZWN0b3J5LCBzbyBzZXBhcmF0ZSBtYWNybyBpcyBwcm92aWRlZC4KKy8vIEhpbnQgOiBuZXZlciBpbnN0YWxsIFNUTHBvcnQgaW4gdGhlIGRpcmVjdG9yeSB0aGF0IGVuZHMgd2l0aCAiaW5jbHVkZSIKKy8vICMgZGVmaW5lIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEggLi4vaW5jbHVkZQorLy8gIyBkZWZpbmUgX1NUTFBfTkFUSVZFX0NfSU5DTFVERV9QQVRIIC4uL2luY2x1ZGUKKy8vICMgZGVmaW5lIF9TVExQX05BVElWRV9DUFBfQ19JTkNMVURFX1BBVEggLi4vaW5jbHVkZQorCisvLyBUaGlzIG1hY3JvIGNvbnN0cnVjdHMgaGVhZGVyIHBhdGggZnJvbSBkaXJlY3RvcnkgYW5kIG5hbWUuCisvLyBZb3UgbWF5IGNoYW5nZSBpdCBpZiB5b3VyIGNvbXBpbGVyIGRvZXMgbm90IHVuZGVyc3RhbmQgIi8iLgorLy8gIyAgZGVmaW5lIF9TVExQX01BS0VfSEVBREVSKHBhdGgsIGhlYWRlcikgPHBhdGgvaGVhZGVyPgorCisvLyBUaGlzIG1hY3JvIGNvbnN0cnVjdHMgbmF0aXZlIGluY2x1ZGUgaGVhZGVyIHBhdGggZnJvbSBpbmNsdWRlIHBhdGggYW5kIG5hbWUuCisvLyBZb3UgbWF5IGhhdmUgZG8gZGVmaW5lIGl0IGlmIGV4cGVyaW1lbnRpbmcgcHJvYmxlbXMgd2l0aCBwcmVwcm9jZXNzb3IKKy8vICMgZGVmaW5lIF9TVExQX05BVElWRV9IRUFERVIoaGVhZGVyKSBfU1RMUF9NQUtFX0hFQURFUihfU1RMUF9OQVRJVkVfSU5DTFVERV9QQVRILGhlYWRlcikKKworLy8gU2FtZSBmb3IgQyBoZWFkZXJzCisvLyAjZGVmaW5lIF9TVExQX05BVElWRV9DX0hFQURFUihoZWFkZXIpCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorI2VuZGlmCmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9jb25maWcvdXNlcl9jb25maWcuaCBiL3N0bHBvcnQvc3RsL2NvbmZpZy91c2VyX2NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlZmQ3MjcKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9jb25maWcvdXNlcl9jb25maWcuaApAQCAtMCwwICsxLDMyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKi8KKworLyoKKyAqIFB1cnBvc2Ugb2YgdGhpcyBmaWxlIDoKKyAqCisgKiBUbyBob2xkIHVzZXItZGVmaW5hYmxlIHBvcnRpb24gb2YgU1RMcG9ydCBzZXR0aW5ncyB3aGljaCBtYXkgYmUgb3ZlcnJpZGRlbgorICogb24gcGVyLXByb2plY3QgYmFzaXMuCisgKiBQbGVhc2Ugbm90ZSB0aGF0IGlmIHlvdSB1c2UgU1RMcG9ydCBpb3N0cmVhbXMgKGNvbXBpbGVkIGxpYnJhcnkpIHRoZW4geW91IGhhdmUKKyAqIHRvIHVzZSBjb25zaXN0ZW50IHNldHRpbmdzIHdoZW4geW91IGNvbXBpbGUgU1RMcG9ydCBsaWJyYXJ5IGFuZCB5b3VyIHByb2plY3QuCisgKiBUaG9zZSBzZXR0aW5ncyBhcmUgZGVmaW5lZCBpbiBob3N0LmggYW5kIGhhdmUgdG8gYmUgdGhlIHNhbWUgZm9yIGEgZ2l2ZW4KKyAqIFNUTHBvcnQgaW5zdGFsbGF0aW9uLgorICovCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBVc2VyLXNldHRhYmxlIG1hY3JvcyB0aGF0IGNvbnRyb2wgY29tcGlsYXRpb246CisgKiAgICAgICAgICAgICAgRmVhdHVyZXMgc2VsZWN0aW9uCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKgorICogVXNlIHRoaXMgc3dpdGNoIGZvciBlbWJlZGRlZCBzeXN0ZW1zIHdoZXJlIG5vIGlvc3RyZWFtcyBhcmUgYXZhaWxhYmxlCisgKiBhdCBhbGwuIFNUTHBvcnQgb3duIGlvc3RyZWFtcyB3aWxsIGFsc28gZ2V0IGRpc2FibGVkIGF1dG9tYXRpY2FsbHkgdGhlbi4KKyAqIFlvdSBjYW4gZWl0aGVyIHVzZSBTVExwb3J0IGlvc3RyZWFtcywgb3Igbm8gaW9zdHJlYW1zLgorICogSWYgeW91IHdhbnQgaW9zdHJlYW1zLCB5b3UgaGF2ZSB0byBjb21waWxlIGxpYnJhcnkgaW4gLi4vYnVpbGQvbGliCisgKiBhbmQgc3VwcGx5IHJlc3VsdGluZyBsaWJyYXJ5IGF0IGxpbmsgdGltZS4KKyAqLworLyoKKyNkZWZpbmUgX1NUTFBfTk9fSU9TVFJFQU1TIDEKKyovCisKKy8qCisgKiBTZXQgX1NUTFBfREVCVUcgdG8gdHVybiB0aGUgIkRlYnVnIE1vZGUiIG9uLgorICogVGhhdCBnZXRzIHlvdSBjaGVja2VkIGl0ZXJhdG9ycy9yYW5nZXMgaW4gdGhlIG1hbm5lcgorICogb2YgIlNhZmUgU1RMIi4gVmVyeSB1c2VmdWwgZm9yIGRlYnVnZ2luZy4gVGhyZWFkLXNhZmUuCisgKiBQbGVhc2UgZG8gbm90IGZvcmdldCB0byBsaW5rIHByb3BlciBTVExwb3J0IGxpYnJhcnkgZmxhdm9yCisgKiAoZS5nIGxpYnN0bHBvcnRzdGxnLnNvIG9yIGxpYnN0bHBvcnRzdGxnLmEpIHdoZW4geW91IHNldCB0aGlzIGZsYWcKKyAqIGluIFNUTHBvcnQgaW9zdHJlYW1zIG1vZGUsIG5hbWVzcGFjZSBjdXN0b21pemF0aW9uIGd1YXJhbnR5IHRoYXQgeW91CisgKiBsaW5rIHRvIHRoZSByaWdodCBsaWJyYXJ5LgorICovCisvKgorI2RlZmluZSBfU1RMUF9ERUJVRyAxCisqLworLyoKKyAqIFlvdSBjYW4gYWxzbyBjaG9vc2UgdGhlIGRlYnVnIGxldmVsOgorICogU1RMcG9ydCBkZWJ1ZyBsZXZlbDogRGVmYXVsdCB2YWx1ZQorICogICAgICAgICAgICAgICAgICAgICAgQ2hlY2sgb25seSB3aGF0IHRoZSBTVExwb3J0IGltcGxlbWVudGF0aW9uIGNvbnNpZGVyIGFzIGludmFsaWQuCisgKiAgICAgICAgICAgICAgICAgICAgICBJdCBhbHNvIGNoYW5nZSB0aGUgaXRlcmF0b3IgaW52YWxpZGF0aW9uIHNjaGVtYS4KKyAqIFN0YW5kYXJkIGRlYnVnIGxldmVsOiBDaGVjayBmb3IgYWxsIG9wZXJhdGlvbnMgdGhlIHN0YW5kYXJkIGNvbnNpZGVyIGFzICJ1bmRlZmluZWQgYmVoYXZpb3IiCisgKiAgICAgICAgICAgICAgICAgICAgICAgZXZlbiBpZiBTVGxwb3J0IGltcGxlbWVudCBpdCBjb3JyZWN0bHkuIEl0IGFsc28gaW52YWxpZGF0ZXMgaXRlcmF0b3JzCisgKiAgICAgICAgICAgICAgICAgICAgICAgbW9yZSBvZnRlbi4KKyAqLworLyoKKyNkZWZpbmUgICBfU1RMUF9ERUJVR19MRVZFTCBfU1RMUF9TVExQT1JUX0RCR19MRVZFTAorI2RlZmluZSAgIF9TVExQX0RFQlVHX0xFVkVMIF9TVExQX1NUQU5EQVJEX0RCR19MRVZFTAorKi8KKy8qIFdoZW4gYW4gaW5jb25zaXN0ZW5jeSBpcyBkZXRlY3RlZCBieSB0aGUgJ3NhZmUgU1RMJyB0aGUgcHJvZ3JhbSB3aWxsIGFib3J0LgorICogSWYgeW91IHByZWZlciBhbiBleGNlcHRpb24gZGVmaW5lIHRoZSBmb2xsb3dpbmcgbWFjcm8uIFRoZSB0aHJvd24gZXhjZXB0aW9uCisgKiB3aWxsIGJlIHRoZSBTdGFuZGFyZCBydW50aW1lX2Vycm9yIGV4Y2VwdGlvbi4KKyAqLworLyoKKyNkZWZpbmUgX1NUTFBfREVCVUdfTU9ERV9USFJPV1MKKyAqLworCisvKgorICogX1NUTFBfTk9fQ1VTVE9NX0lPIDogZGVmaW5lIHRoaXMgaWYgeW91IGRvIG5vdCBpbnN0YW50aWF0ZSBiYXNpY194eHggaW9zdHJlYW0KKyAqIGNsYXNzZXMgd2l0aCBjdXN0b20gdHlwZXMgKHdoaWNoIGlzIG1vc3QgbGlrZWx5IHRoZSBjYXNlKS4gQ3VzdG9tIG1lYW5zIHR5cGVzCisgKiBvdGhlciB0aGFuIGNoYXIsIHdjaGFyX3QsIGNoYXJfdHJhaXRzPD4gYW5kIGFsbG9jYXRvcjw+IGxpa2UKKyAqIGJhc2ljX29zdHJlYW08bXlfY2hhcl90eXBlLCBteV90cmFpdHM8bXlfY2hhcl90eXBlPiA+IG9yCisgKiBiYXNpY19zdHJpbmc8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4sIG15X2FsbG9jYXRvciA+CisgKiBXaGVuIHRoaXMgb3B0aW9uIGlzIG9uLCBtb3N0IG5vbi1pbmxpbmUgdGVtcGxhdGUgZnVuY3Rpb25zIGRlZmluaXRpb25zIGZvciBpb3N0cmVhbXMKKyAqIGFyZSBub3Qgc2VlbiBieSB0aGUgY2xpZW50IHdoaWNoIHNhdmVzIGEgbG90IG9mIGNvbXBpbGUgdGltZSBmb3IgbW9zdCBjb21waWxlcnMsCisgKiBhbHNvIG9iamVjdCBhbmQgZXhlY3V0YWJsZSBzaXplIGZvciBzb21lLgorICogRGVmYXVsdCBpcyBvZmYsIGp1c3Qgbm90IHRvIGJyZWFrIGNvbXBpbGF0aW9uIGZvciB0aG9zZSB3aG8gZG8gdXNlIHRob3NlIHR5cGVzLgorICogVGhhdCBhbHNvIGd1YXJhbnRlZXMgdGhhdCB5b3Ugc3RpbGwgdXNlIG9wdGltaXplZCBzdGFuZGFyZCBpL28gd2hlbiB5b3UgY29tcGlsZQorICogeW91ciBwcm9ncmFtIHdpdGhvdXQgb3B0aW1pemF0aW9uLiBPcHRpb24gZG9lcyBub3QgYWZmZWN0IFNUTHBvcnQgbGlicmFyeSBidWlsZDsgeW91CisgKiBtYXkgdXNlIHRoZSBzYW1lIGJpbmFyeSBsaWJyYXJ5IHdpdGggYW5kIHdpdGhvdXQgdGhpcyBvcHRpb24sIG9uIHBlci1wcm9qZWN0IGJhc2lzLgorICovCisvKgorI2RlZmluZSBfU1RMUF9OT19DVVNUT01fSU8KKyovCisKKy8qCisgKiBfU1RMUF9OT19SRUxPUFNfTkFNRVNQQUNFOiBpZiBkZWZpbmVkLCBkb24ndCBwdXQgdGhlIHJlbGF0aW9uYWwKKyAqIG9wZXJhdG9yIHRlbXBsYXRlcyAoPiwgPD0sID49LCAhPSkgaW4gbmFtZXNwYWNlIHN0ZDo6cmVsX29wcywgZXZlbgorICogaWYgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIG5hbWVzcGFjZXMuCisgKiBOb3RlIDogaWYgdGhlIGNvbXBpbGVyIGRvIG5vdCBzdXBwb3J0IG5hbWVzcGFjZXMsIHRob3NlIG9wZXJhdG9ycyBhcmUgbm90IGJlIHByb3ZpZGVkIGJ5IGRlZmF1bHQsCisgKiB0byBzaW11bGF0ZSBoaWRpbmcgdGhlbSBpbnRvIHJlbF9vcHMuIFRoaXMgd2FzIHByb3ZlZCB0byByZXNvbHZlIG1hbnkgY29tcGlsZXIgYnVncyB3aXRoIGFtYmlndWl0eS4KKyAqLworLyoKKyNkZWZpbmUgX1NUTFBfTk9fUkVMT1BTX05BTUVTUEFDRSAxCisqLworCisvKgorICogSWYgU1RMcG9ydCB1c2UgaXRzIG93biBuYW1lc3BhY2UsIHNlZSBfU1RMUF9OT19PV05fTkFNRVNQQUNFIGluIGhvc3QuaCwgaXQgd2lsbCB0cnkKKyAqIGJ5IGRlZmF1bHQgdG8gcmVuYW1lIHN0ZDo6IGZvciB0aGUgdXNlciB0byBzdGxwb3J0OjouIElmIHlvdSBkbyBub3Qgd2FudCB0aGlzIGZlYXR1cmUsCisgKiBwbGVhc2UgZGVmaW5lIHRoZSBmb2xsb3dpbmcgc3dpdGNoIGFuZCB0aGVuIHVzZSBzdGxwb3J0OjoKKyAqLworLyoKKyNkZWZpbmUgX1NUTFBfRE9OVF9SRURFRklORV9TVEQgMQorKi8KKworLyoKKyAqIF9TVExQX1dIT0xFX05BVElWRV9TVEQgOiBvbmx5IG1lYW5pbmdmdWwgaWYgU1RMcG9ydCB1c2VzIGl0cyBvd24gbmFtZXNwYWNlLgorICogTm9ybWFsbHksIFNUTHBvcnQgb25seSBpbXBvcnRzIG5lY2Vzc2FyeSBjb21wb25lbnRzIGZyb20gbmF0aXZlIHN0ZDo6IG5hbWVzcGFjZS4KKyAqIFlvdSBtaWdodCB3YW50IGV2ZXJ5dGhpbmcgZnJvbSBzdGQ6OiBiZWluZyBhdmFpbGFibGUgaW4gc3RkOjogbmFtZXNwYWNlIHdoZW4geW91CisgKiBpbmNsdWRlIGNvcnJlc3BvbmRpbmcgU1RMcG9ydCBoZWFkZXIgKGxpa2UgU1RMcG9ydCA8bWFwPiBwcm92aWRlcyBzdGQ6Om1hcCBhcyB3ZWxsLCBldGMuKSwKKyAqIGlmIHlvdSBhcmUgZ29pbmcgdG8gdXNlIGJvdGggc3RscG9ydDo6IGFuZCBzdGQ6OiBjb21wb25lbnRzIGluIHlvdXIgY29kZS4KKyAqIE90aGVyd2lzZSB0aGlzIG9wdGlvbiBpcyBub3QgcmVjb21tZW5kZWQgYXMgaXQgaW5jcmVhc2VzIHRoZSBzaXplIG9mIHlvdXIgb2JqZWN0IGZpbGVzCisgKiBhbmQgc2xvd3MgZG93biBjb21waWxhdGlvbi4KKyAqIEJld2FyZSwgaWYgeW91IGRvIG5vdCB1c2UgU1RMcG9ydCBpb3N0cmVhbSAoX1NUTFBfTk9fSU9TVFJFQU1TIGFib3ZlKSwgYXNrIFNUTHBvcnQgdG8KKyAqIG5vdCByZW5hbWUgc3RkOjogaW4gc3RscG9ydDo6IGFuZCB0cnkgdG8gaGF2ZSBhY2Nlc3MgdG8gd2hvbGUgbmF0aXZlIFN0YW5kYXJkIHN0dWZmIHRoZW4KKyAqIFNUTHBvcnQgd2lsbCBvbmx5IHRocm93IGV4Y2VwdGlvbnMgZnJvbSB0aGUgc3RkIG5hbWVzcGFjZSBhbmQgbm90IGZyb20gc3RscG9ydC4KKyAqIEZvciBpbnN0YW5jZSBhIHByb2JsZW0gaW4gc3RscG9ydDo6dmVjdG9yOjphdCB3aWxsIHRocm93IGEgc3RkOjpvdXRfb2ZfcmFuZ2UgZXhjZXB0aW9uCisgKiBhbmQgbm90IGEgc3RscG9ydDo6b3V0X29mX3JhbmdlLgorICogTm90aWNlIHRoYXQgU1RMcG9ydCBleGNlcHRpb25zIGluaGVyaXRzIGZyb20gc3RkOjpleGNlcHRpb24uCisgKi8KKy8qCisjZGVmaW5lIF9TVExQX1dIT0xFX05BVElWRV9TVEQKKyovCisKKy8qCisgKiBVc2UgdGhpcyBvcHRpb24gdG8gY2F0Y2ggdW5pbml0aWFsaXplZCBtZW1iZXJzIGluIHlvdXIgY2xhc3Nlcy4KKyAqIFdoZW4gaXQgaXMgc2V0LCBjb25zdHJ1Y3QoKSBhbmQgZGVzdHJveSgpIGZpbGwgdGhlIGNsYXNzIHN0b3JhZ2UKKyAqIHdpdGggX1NUTFBfU0hSRURfQllURSAoc2VlIGJlbG93KS4KKyAqIE5vdGUgOiBfU1RMUF9ERUJVRyBhbmQgX1NUTFBfREVCVUdfQUxMT0MgZG9uJ3Qgc2V0IHRoaXMgb3B0aW9uIGF1dG9tYXRpY2FsbHkuCisgKi8KKy8qCisjZGVmaW5lIF9TVExQX0RFQlVHX1VOSU5JVElBTElaRUQgMQorI2RlZmluZSBfU1RMUF9ERUJVR19BTExPQyAxCisqLworCisvKgorICogVW5jb21tZW50IGFuZCBwcm92aWRlIGEgZGVmaW5pdGlvbiBmb3IgdGhlIGJ5dGUgd2l0aCB3aGljaCByYXcgbWVtb3J5CisgKiB3aWxsIGJlIGZpbGxlZCBpZiBfU1RMUF9ERUJVR19BTExPQyBvciBfU1RMUF9ERUJVR19VTklOSVRJQUxJWkVEIGlzIGRlZmluZWQuCisgKiBDaG9vc2UgYSB2YWx1ZSB3aGljaCBpcyBsaWtlbHkgdG8gY2F1c2UgYSBub3RpY2VhYmxlIHByb2JsZW0gaWYgZGVyZWZlcmVuY2VkCisgKiBvciBvdGhlcndpc2UgYWJ1c2VkLiBBIGdvb2QgdmFsdWUgbWF5IGFscmVhZHkgYmUgZGVmaW5lZCBmb3IgeW91ciBwbGF0Zm9ybS4KKyAqLworLyoKKyNkZWZpbmUgX1NUTFBfU0hSRURfQllURSAweEEzCisqLworCisvKgorICogIFRoaXMgb3B0aW9uIGlzIGZvciBnY2MgdXNlcnMgb25seSBhbmQgb25seSBhZmZlY3RzIHN5c3RlbXMgd2hlcmUgbmF0aXZlIGxpbmtlcgorICogIGRvZXMgbm90IGxldCBnY2MgdG8gaW1wbGVtZW50IGF1dG9tYXRpYyBpbnN0YW50aWF0aW9uIG9mIHN0YXRpYyB0ZW1wbGF0ZSBkYXRhIG1lbWJlcnMvCisgKiAgSXQgaXMgYmVpbmcgcHV0IGluIHRoaXMgZmlsZSBhcyB0aGVyZSBpcyBubyB3YXkgdG8gY2hlY2sgaWYgd2UgYXJlIHVzaW5nIEdOVSBsZCBhdXRvbWF0aWNhbGx5LAorICogIHNvIGl0IGJlY29tZXMgdXNlcidzIHJlc3BvbnNpYmlsaXR5LgorICovCisvKgorI2RlZmluZSBfU1RMUF9HQ0NfVVNFU19HTlVfTEQKKyovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29tcGF0aWJpbGl0eSBzZWN0aW9uCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKgorICogIERlZmluZSB0aGlzIG1hY3JvIHRvIGRpc2FibGUgYW5hY2hyb25pc3RpYyBjb25zdHJ1Y3RzIChsaWtlIHRoZSBvbmVzIHVzZWQgaW4gSFAgU1RMIGFuZAorICogIG5vdCBpbmNsdWRlZCBpbiBmaW5hbCBzdGFuZGFyZCwgZXRjLgorICovCisvKgorI2RlZmluZSBfU1RMUF9OT19BTkFDSFJPTklTTVMgMQorKi8KKworLyoKKyAqICBEZWZpbmUgdGhpcyBtYWNybyB0byBkaXNhYmxlIFNUTHBvcnQgZXh0ZW5zaW9ucyAoZm9yIGV4YW1wbGUsIHRvIG1ha2Ugc3VyZSB5b3VyIGNvZGUgd2lsbAorICogIGNvbXBpbGUgd2l0aCBzb21lIG90aGVyIGltcGxlbWVudGF0aW9uICkKKyAqLworLyoKKyNkZWZpbmUgX1NUTFBfTk9fRVhURU5TSU9OUyAxCisqLworCisvKgorICogWW91IHNob3VsZCBkZWZpbmUgdGhpcyBtYWNybyBpZiBjb21waWxpbmcgd2l0aCBNRkMgLSBTVExwb3J0IDxzdGwvY29uZmlnL193aW5kb3dzLmg+CisgKiB0aGVuIGluY2x1ZGUgPGFmeC5oPiBpbnN0ZWFkIG9mIDx3aW5kb3dzLmg+IHRvIGdldCBzeW5jaHJvbmlzYXRpb24gcHJpbWl0aXZlcworICovCisvKgorI2RlZmluZSBfU1RMUF9VU0VfTUZDIDEKKyovCisKKy8qCisgKiBib3JpcyA6IHRoaXMgc2V0dGluZyBpcyBoZXJlIGFzIHdlIGNhbm5vdCBkZXRlY3QgcHJlY2Vuc2Ugb2YgbmV3IFBsYXRmb3JtIFNESyBhdXRvbWF0aWNhbGx5CisgKiBJZiB5b3UgYXJlIHVzaW5nIG5ldyBQU0RLIHdpdGggVkMrKyA2LjAgb3IgbG93ZXIsCisgKiBwbGVhc2UgZGVmaW5lIHRoaXMgdG8gZ2V0IGNvcnJlY3QgcHJvdG90eXBlcyBmb3IgSW50ZXJsb2NrZWRYWFggZnVuY3Rpb25zCisgKi8KKy8qCisjZGVmaW5lIF9TVExQX05FV19QTEFURk9STV9TREsgMQorKi8KKworLyoKKyAqIEZvciB0aGUgc2FtZSByZWFzb24gYXMgdGhlIG9uZSBhYm92ZSB3ZSBhcmUgbm90IGFibGUgdG8gZGV0ZWN0IGVhc2lseSB1c2UKKyAqIG9mIHRoZSBjb21waWxlciBjb21pbmcgd2l0aCB0aGUgUGxhdGZvcm0gU0RLIGluc3RlYWQgb2YgdGhlIG9uZSBjb21pbmcgd2l0aAorICogYSBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyByZWxlYXNlLiBUaGlzIGNoYW5nZSBuYXRpdmUgQy9DKysgbGlicmFyeSBsb2NhdGlvbgorICogYW5kIGltcGxlbWVudGF0aW9uLCBwbGVhc2UgZGVmaW5lIHRoaXMgdG8gZ2V0IGNvcnJlY3QgU1RMcG9ydCBjb25maWd1cmF0aW9uLgorICovCisvKgorI2RlZmluZSBfU1RMUF9VU0lOR19QTEFURk9STV9TREtfQ09NUElMRVIgMQorKi8KKworLyoKKyAqIFNvbWUgY29tcGlsZXJzIHN1cHBvcnQgdGhlIGF1dG9tYXRpYyBsaW5raW5nIGZlYXR1cmUuCisgKiBVbmNvbW1lbnQgdGhlIGZvbGxvd2luZyBpZiB5b3UgcHJlZmVyIHRvIHNwZWNpZnkgdGhlIFNUTHBvcnQgbGlicmFyeQorICogdG8gbGluayB3aXRoIHlvdXJzZWxmLgorICogRm9yIHRoZSBtb21lbnQsIHRoaXMgZmVhdHVyZSBpcyBvbmx5IHN1cHBvcnRlZCBhbmQgaW1wbGVtZW50ZWQgd2l0aGluIFNUTHBvcnQKKyAqIGJ5IHRoZSBNaWNyb3NvZnQgY29tcGlsZXJzLgorICovCisvKgorI2RlZmluZSBfU1RMUF9ET05UX1VTRV9BVVRPX0xJTksgMQorKi8KKworLyoKKyAqIElmIHlvdSBjdXN0b21pemUgdGhlIFNUTHBvcnQgZ2VuZXJhdGVkIGxpYnJhcnkgbmFtZXMgZG9uJ3QgZm9yZ2V0IHRvIGdpdmUKKyAqIHRoZSBtb3RpZiB5b3UgdXNlZCBkdXJpbmcgY29uZmlndXJhdGlvbiBoZXJlIGlmIHlvdSBzdGlsbCB3YW50IHRoZSBhdXRvIGxpbmsKKyAqIHRvIHdvcmsuIChEbyBub3QgcmVtb3ZlIGRvdWJsZSBxdW90ZXMgaW4gdGhlIG1hY3JvIHZhbHVlKQorICovCisvKgorI2RlZmluZSBfU1RMUF9MSUJfTkFNRV9NT1RJRiAiPz8/IgorICovCisKKy8qCisgKiBVbmNvbW1lbnQgdG8gZ2V0IGZlZWRiYWNrIGF0IGNvbXBpbGF0aW9uIHRpbWUgYWJvdXQgcmVzdWx0IG9mIGJ1aWxkIGVudmlyb25tZW50CisgKiBpbnRyb3NwZWN0aW9uLgorICovCisvKgorI2RlZmluZSBfU1RMUF9WRVJCT1NFIDEKKyovCisKKy8qCisgKiBVc2UgbWluaW11bSBzZXQgb2YgZGVmYXVsdCBhcmd1bWVudHMgb24gdGVtcGxhdGUgY2xhc3NlcyB0aGF0IGhhdmUgbW9yZQorICogdGhhbiBvbmUgLSBmb3IgZXhhbXBsZSBtYXA8Piwgc2V0PD4uCisgKiBUaGlzIGhhcyBlZmZlY3Qgb25seSBpZiBfU1RMUF9MSU1JVEVEX0RFRkFVTFRfVEVNUExBVEVTIGlzIG9uLgorICogSWYgX1NUTFBfTUlOSU1VTV9ERUZBVUxUX1RFTVBMQVRFX1BBUkFNUyBpcyBzZXQsIHlvdSdsbCBiZSBhYmxlIHRvIGNvbXBpbGUKKyAqIHNldDxUPiB3aXRoIHRob3NlIGNvbXBpbGVycywgYnV0IHlvdSdsbCBoYXZlIHRvIHVzZSBfX3NldF9fPFQsIGxlc3M8VD4+CisgKgorICogQWZmZWN0cyA6IG1hcDw+LCBtdWx0aW1hcDw+LCBzZXQ8PiwgbXVsdGlzZXQ8PiwgaGFzaF8qPD4sCisgKiBxdWV1ZTw+LCBwcmlvcml0eV9xdWV1ZTw+LCBzdGFjazw+LCBpc3RyZWFtX2l0ZXJhdG9yPD4KKyAqLworLyoKKyNkZWZpbmUgX1NUTFBfTUlOSU1VTV9ERUZBVUxUX1RFTVBMQVRFX1BBUkFNUyAxCisqLworCisvKgorICogVGhlIGFncmVnYXRpb24gb2Ygc3RyaW5ncyB1c2luZyB0aGUgKyBvcGVyYXRvciBpcyBhbiBleHBlbnNpdmUgb3BlcmF0aW9uCisgKiBhcyBpdCByZXF1aXJlcyBjb25zdHJ1Y3Rpb24gb2YgdGVtcG9yYXJ5IG9iamVjdHMgdGhhdCBuZWVkIG1lbW9yeSBhbGxvY2F0aW9uCisgKiBhbmQgZGVhbGxvY2F0aW9uLiBUaGUgcHJvYmxlbSBjYW4gYmUgZXZlbiBtb3JlIGltcG9ydGFudCBpZiB5b3UgYXJlIGFkZGluZworICogc2V2ZXJhbCBzdHJpbmdzIHRvZ2V0aGVyIGluIGEgc2luZ2xlIGV4cHJlc3Npb24uIFRvIGF2b2lkIHRoaXMgcHJvYmxlbSBTVExwb3J0CisgKiBpbXBsZW1lbnQgZXhwcmVzc2lvbiB0ZW1wbGF0ZS4gV2l0aCB0aGlzIHRlY2huaXF1ZSBhZGRpdGlvbiBvZiAyIHN0cmluZ3MgaXMgbm90CisgKiBhIHN0cmluZyBhbnltb3JlIGJ1dCBhIHRlbXBvcmFyeSBvYmplY3QgaGF2aW5nIGEgcmVmZXJlbmNlIHRvIGVhY2ggb2YgdGhlCisgKiBvcmlnaW5hbCBzdHJpbmdzIGludm9sdmVkIGluIHRoZSBleHByZXNzaW9uLiBUaGlzIG9iamVjdCBjYXJyeSBpbmZvcm1hdGlvbgorICogZGlyZWN0bHkgdG8gdGhlIGRlc3RpbmF0aW9uIHN0cmluZyB0byBzZXQgaXRzIHNpemUgY29ycmVjdGx5IGFuZCBvbmx5IG1ha2UKKyAqIGEgc2luZ2xlIGNhbGwgdG8gdGhlIGFsbG9jYXRvci4gVGhpcyB0ZWNobmlxdWUgYWxzbyB3b3JrcyBmb3IgdGhlIGFkZGl0aW9uIG9mCisgKiBOIGVsZW1lbnRzIHdoZXJlIGVsZW1lbnRzIGFyZSBiYXNpY19zdHJpbmcsIEMgc3RyaW5nIG9yIGEgc2luZ2xlIGNoYXJhY3Rlci4KKyAqIFRoZSBkcmF3YmFjayBjYW4gYmUgbG9uZ2VyIGNvbXBpbGF0aW9uIHRpbWUgYW5kIGJpZ2dlciBleGVjdXRhYmxlIHNpemUuCisgKiBBbm90aGVyIHByb2JsZW0gaXMgdGhhdCBzb21lIGNvbXBpbGVycyAoZ2NjKSBmYWlsIHRvIHVzZSBzdHJpbmcgcHJveHkgb2JqZWN0CisgKiBpZiBkbyB3aXRoIGNsYXNzIGRlcml2ZWQgZnJvbSBzdHJpbmcgKHNlZSB1bml0IHRlc3RzIGZvciBkZXRhaWxzKS4KKyAqIFNUTHBvcnQgcmVidWlsZDogWWVzCisgKi8KKy8qCisjZGVmaW5lIF9TVExQX1VTRV9URU1QTEFURV9FWFBSRVNTSU9OIDEKKyovCisKKworLyoKKyAqIEJ5IGRlZmF1bHQgdGhlIFNUTHBvcnQgYmFzaWNfc3RyaW5nIGltcGxlbWVudGF0aW9uIHVzZSBhIGxpdHRsZSBzdGF0aWMgYnVmZmVyCisgKiAob2YgMTYgY2hhcnMgd2hlbiB3cml0aW5nIHRoaXMgZG9jKSB0byBhdm9pZCBzeXN0ZW1hdGljYWxseSBtZW1vcnkgYWxsb2NhdGlvbgorICogaW4gY2FzZSBvZiBsaXR0bGUgYmFzaWNfc3RyaW5nLiBUaGUgZHJhd2JhY2sgb2Ygc3VjaCBhIG1ldGhvZCBpcyBiaWdnZXIKKyAqIGJhc2ljX3N0cmluZyBzaXplIGFuZCBzb21lIHBlcmZvcm1hbmNlIHBlbmFsdHkgZm9yIG1ldGhvZCBsaWtlIHN3YXAuIElmIHlvdQorICogcHJlZmVyIHN5c3RlbWF0aWNhbCBkeW5hbWljIGFsbG9jYXRpb24gdHVybiBvbiB0aGlzIG1hY3JvLgorICogU1RMcG9ydCByZWJ1aWxkOiBZZXMKKyAqLworLyoKKyNkZWZpbmUgX1NUTFBfRE9OVF9VU0VfU0hPUlRfU1RSSU5HX09QVElNIDEKKyovCisKKy8qCisgKiBUbyByZWR1Y2UgdGhlIGZhbW91cyBjb2RlIGJsb2F0IHRyb3VibGUgZHVlIHRvIHRoZSB1c2Ugb2YgdGVtcGxhdGVzIFNUTHBvcnQgZ3JhbnQKKyAqIGEgc3BlY2lhbGl6YXRpb24gb2Ygc29tZSBjb250YWluZXJzIGZvciBwb2ludGVyIHR5cGVzLiBTbyBhbGwgaW5zdGFuY2lhdGlvbnMKKyAqIG9mIHRob3NlIGNvbnRhaW5lcnMgd2l0aCBhIHBvaW50ZXIgdHlwZSB3aWxsIHVzZSB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbiBiYXNlZCBvbgorICogYSBjb250YWluZXIgb2Ygdm9pZCouIFRoaXMgZmVhdHVyZSBoYXMgc2hvd24gdmVyeSBnb29kIHJlc3VsdCBvbiBvYmplY3QgZmlsZXMgc2l6ZQorICogYnV0IGFmdGVyIGxpbmsgcGhhc2UgYW5kIG9wdGltaXphdGlvbiB5b3Ugd2lsbCBvbmx5IGV4cGVyaW1lbnQgYmVuZWZpdCBpZiB5b3UgdXNlCisgKiBtYW55IGNvbnRhaW5lciB3aXRoIHBvaW50ZXIgdHlwZXMuCisgKiBUaGVyZSBhcmUgaG93ZXZlciBhIG51bWJlciBvZiBsaW1pdGF0aW9uIHRvIHVzZSB0aGlzIG9wdGlvbjoKKyAqICAgLSB3aXRoIGNvbXBpbGVycyBub3Qgc3VwcG9ydGluZyBwYXJ0aWFsIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGZlYXR1cmUsIHlvdSB3b24ndAorICogICAgIGJlIGFibGUgdG8gYWNjZXNzIHNvbWUgbmVzdGVkIGNvbnRhaW5lciB0eXBlcyBsaWtlIGl0ZXJhdG9yIGFzIGxvbmcgYXMgdGhlCisgKiAgICAgZGVmaW5pdGlvbiBvZiB0aGUgdHlwZSB1c2VkIHRvIGluc3RhbmNpYXRlIHRoZSBjb250YWluZXIgd2lsbCBiZSBpbmNvbXBsZXRlCisgKiAgICAgKHNlZSBJbmNvbXBsZXRlQ2xhc3MgZGVmaW5pdGlvbiBpbiB0ZXN0L3VuaXQvdmVjdG9yX3Rlc3QuY3BwKS4KKyAqICAgLSB5b3Ugd29uJ3QgYmUgYWJsZSB0byB1c2UgY29tcGxleCBTdGFuZGFyZCBhbGxvY2F0b3IgaW1wbGVtZW50YXRpb25zIHdoaWNoIGFyZQorICogICAgIGFsbG9jYXRvcnMgaGF2aW5nIHBvaW50ZXIgbmVzdGVkIHR5cGUgbm90IGJlaW5nIGEgcmVhbCBDIHBvaW50ZXIuCisgKi8KKy8qCisjZGVmaW5lIF9TVExQX1VTRV9QVFJfU1BFQ0lBTElaQVRJT05TIDEKKyovCisKKy8qCisgKiBUbyBhY2hpZXZlIG1hbnkgZGlmZmVyZW50IG9wdGltaXphdGlvbnMgd2l0aGluIHRoZSB0ZW1wbGF0ZSBpbXBsZW1lbnRhdGlvbnMgU1RMcG9ydAorICogdXNlcyBzb21lIHR5cGUgdHJhaXRzIHRlY2huaXF1ZS4gV2l0aCB0aGlzIG1hY3JvIHlvdSBjYW4gYXNrIFNUTHBvcnQgdG8gdXNlIHRoZSBmYW1vdXMKKyAqIGJvb3N0IHR5cGUgdHJhaXRzIHJhdGhlciB0aGFuIHRoZSBpbnRlcm5hbCBvbmUuIFRoZSBhZHZhbnRhZ2VzIGFyZSBtb3JlIGNvbXBpbGVyCisgKiBpbnRlZ3JhdGlvbiBhbmQgYSBiZXR0ZXIgc3VwcG9ydC4gSWYgeW91IG9ubHkgZGVmaW5lIHRoaXMgbWFjcm8gb25jZSB0aGUgU1RMcG9ydCBoYXMgYmVlbgorICogYnVpbHQgeW91IGp1c3QgaGF2ZSB0byBhZGQgdGhlIGJvb3N0IGluc3RhbGwgcGF0aCB3aXRoaW4geW91ciBpbmNsdWRlIHBhdGguIElmIHlvdSB3YW50CisgKiB0byB1c2UgdGhpcyBmZWF0dXJlIGF0IFNUTHBvcnQgYnVpbHQgdGltZSB5b3Ugd2lsbCBoYXZlIHRvIGRlZmluZSB0aGUKKyAqIFNUTFBfQlVJTERfQk9PU1RfUEFUSCBlbnJpcm9ubWVudCB2YXJpYWJsZSB3aXRoIHRoZSB2YWx1ZSBvZiB0aGUgYm9vc3QgbGlicmFyeSBwYXRoLgorICovCisKKy8qCisjZGVmaW5lIF9TVExQX1VTRV9CT09TVF9TVVBQT1JUIDEKKyovCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoKKyAgTG9jYWwgVmFyaWFibGVzOgorICBtb2RlOiBDKysKKyAgRW5kOgorKi8KZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL2RlYnVnL19kZWJ1Zy5jIGIvc3RscG9ydC9zdGwvZGVidWcvX2RlYnVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlkNWM2YgotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc3RsL2RlYnVnL19kZWJ1Zy5jCkBAIC0wLDAgKzEsNjI4IEBACisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfREVCVUdfQworI2RlZmluZSBfU1RMUF9ERUJVR19DCisKKyNpZiBkZWZpbmVkIChfU1RMUF9ERUJVRykKKyNpZiBkZWZpbmVkIChfU1RMUF9USFJFQURTKQorIyAgaWYgIWRlZmluZWQgKF9TVExQX05FRURfTVVUQUJMRSkKKyMgICAgZGVmaW5lIF9TVExQX0FDUVVJUkVfTE9DSyhfTG9jaykgX0xvY2suX01fYWNxdWlyZV9sb2NrKCk7CisjICAgIGRlZmluZSBfU1RMUF9SRUxFQVNFX0xPQ0soX0xvY2spIF9Mb2NrLl9NX3JlbGVhc2VfbG9jaygpOworIyAgZWxzZQorIyAgICBkZWZpbmUgX1NUTFBfQUNRVUlSRV9MT0NLKF9Mb2NrKSAoKF9TVExQX211dGV4JilfTG9jaykuX01fYWNxdWlyZV9sb2NrKCk7CisjICAgIGRlZmluZSBfU1RMUF9SRUxFQVNFX0xPQ0soX0xvY2spICgoX1NUTFBfbXV0ZXgmKV9Mb2NrKS5fTV9yZWxlYXNlX2xvY2soKTsKKyMgIGVuZGlmIC8qIF9TVExQX05FRURfTVVUQUJMRSAqLworI2Vsc2UKKyMgIGRlZmluZSBfU1RMUF9BQ1FVSVJFX0xPQ0soX0xvY2spCisjICBkZWZpbmUgX1NUTFBfUkVMRUFTRV9MT0NLKF9Mb2NrKQorI2VuZGlmIC8qIF9TVExQX1RIUkVBRFMgKi8KKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIGdsb2JhbCBub24taW5saW5lIGZ1bmN0aW9ucworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBbIGkxLCBpMikKKyNpZiAhZGVmaW5lZCAoX19ETUNfXykKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+CitpbmxpbmUgYm9vbCAgX1NUTFBfQ0FMTAorc3RscF9pbl9yYW5nZV9hdXgoY29uc3QgX0l0ZXJhdG9yJiBfX2l0LCBjb25zdCBfSXRlcmF0b3ImIF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICBjb25zdCBfSXRlcmF0b3ImIF9fbGFzdCwgY29uc3QgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgJikgeworICAgIHJldHVybiAoIF9faXQgPj0gX19maXJzdCAmJgorICAgICAgICAgICAgIF9faXQgPCBfX2xhc3QpOworfQorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3IxLCBjbGFzcyBfSXRlcmF0b3I+CisjaWYgZGVmaW5lZCAoX1NUTFBfTVNWQykKK2lubGluZSBib29sIF9TVExQX0NBTEwgIHN0bHBfaW5fcmFuZ2VfYXV4KF9JdGVyYXRvcjEgX19pdCwgY29uc3QgX0l0ZXJhdG9yJiBfX2ZpcnN0LAorI2Vsc2UKK2lubGluZSBib29sIF9TVExQX0NBTEwgIHN0bHBfaW5fcmFuZ2VfYXV4KGNvbnN0IF9JdGVyYXRvcjEmIF9faXQsIGNvbnN0IF9JdGVyYXRvciYgX19maXJzdCwKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0l0ZXJhdG9yJiBfX2xhc3QsIGNvbnN0IGZvcndhcmRfaXRlcmF0b3JfdGFnICYpIHsKKyAgX0l0ZXJhdG9yMSBfX2koX19maXJzdCk7CisgIGZvciAoOyAgX19pICE9IF9fbGFzdCAmJiBfX2kgIT0gX19pdDsgKytfX2kpOworICByZXR1cm4gKF9faSAhPSBfX2xhc3QpOworfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfTk9OVEVNUExfQkFTRV9NQVRDSF9CVUcpCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yMSwgY2xhc3MgX0l0ZXJhdG9yPgoraW5saW5lIGJvb2wgIF9TVExQX0NBTEwKK3N0bHBfaW5fcmFuZ2VfYXV4KGNvbnN0IF9JdGVyYXRvcjEmIF9faXQsIGNvbnN0IF9JdGVyYXRvciYgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IF9JdGVyYXRvciYgX19sYXN0LCBjb25zdCBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZyAmKSB7CisgIF9JdGVyYXRvcjEgX19pKF9fZmlyc3QpOworICBmb3IgKDsgIF9faSAhPSBfX2xhc3QgJiYgX19pICE9IF9faXQ7ICsrX19pKTsKKyAgcmV0dXJuIChfX2kgIT0gX19sYXN0KTsKK30KKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgorYm9vbCBfU1RMUF9DQUxMIF9fY2hlY2tfcmFuZ2VfYXV4KGNvbnN0IF9JdGVyYXRvciYgX19maXJzdCwgY29uc3QgX0l0ZXJhdG9yJiBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19mYWxzZV90eXBlJiAvKl9Jc0ludGVncmFsKi8pIHsKKyAgX1NUTFBfVkVSQk9TRV9SRVRVUk4oX192YWxpZF9yYW5nZShfX2ZpcnN0LF9fbGFzdCksIF9TdGxNc2dfSU5WQUxJRF9SQU5HRSApCisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ludGVncmFsPgorYm9vbCBfU1RMUF9DQUxMIF9fY2hlY2tfcmFuZ2VfYXV4KF9JbnRlZ3JhbCAvKl9fZmlyc3QqLywgX0ludGVncmFsIC8qX19sYXN0Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX190cnVlX3R5cGUmIC8qX0lzSW50ZWdyYWwqLykKK3sgcmV0dXJuIHRydWU7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KK2Jvb2wgX1NUTFBfQ0FMTCAgX19jaGVja19yYW5nZShjb25zdCBfSXRlcmF0b3ImIF9fZmlyc3QsIGNvbnN0IF9JdGVyYXRvciYgX19sYXN0KSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0lzSW50ZWdyYWw8X0l0ZXJhdG9yPjo6X1JldCBfSW50ZWdyYWw7CisgIHJldHVybiBfX2NoZWNrX3JhbmdlX2F1eChfX2ZpcnN0LCBfX2xhc3QsIF9JbnRlZ3JhbCgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KK2Jvb2wgX1NUTFBfQ0FMTCAgX19jaGVja19yYW5nZShjb25zdCBfSXRlcmF0b3ImIF9faXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0l0ZXJhdG9yJiBfX3N0YXJ0LCBjb25zdCBfSXRlcmF0b3ImIF9fZmluaXNoKSB7CisgIF9TVExQX1ZFUkJPU0VfUkVUVVJOKHN0bHBfaW5fcmFuZ2UoX19pdCwgX19zdGFydCwgX19maW5pc2gpLAorICAgICAgICAgICAgICAgICAgICAgICBfU3RsTXNnX05PVF9JTl9SQU5HRV8xKQorICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KK2Jvb2wgX1NUTFBfQ0FMTCAgX19jaGVja19yYW5nZShjb25zdCBfSXRlcmF0b3ImIF9fZmlyc3QsIGNvbnN0IF9JdGVyYXRvciYgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9JdGVyYXRvciYgX19zdGFydCwgY29uc3QgX0l0ZXJhdG9yJiBfX2ZpbmlzaCkgeworICBfU1RMUF9WRVJCT1NFX1JFVFVSTihzdGxwX2luX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCwgX19zdGFydCwgX19maW5pc2gpLAorICAgICAgICAgICAgICAgICAgICAgICBfU3RsTXNnX05PVF9JTl9SQU5HRV8yKQorICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2Jvb2wgX1NUTFBfQ0FMTCBfX2NoZWNrX3B0cl9yYW5nZShjb25zdCBfVHAqIF9fZmlyc3QsIGNvbnN0IF9UcCogX19sYXN0KSB7CisgIF9TVExQX1ZFUkJPU0VfUkVUVVJOKChfX2ZpcnN0ICE9IDAgfHwgX19sYXN0ID09IDApLCBfU3RsTXNnX0lOVkFMSURfQVJHVU1FTlQpCisgIF9TVExQX1ZFUkJPU0VfUkVUVVJOKF9fdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0LCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZygpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgX1N0bE1zZ19JTlZBTElEX1JBTkdFKQorICByZXR1cm4gdHJ1ZTsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3RlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+Cit2b2lkIF9TVExQX0NBTEwgX19pbnZhbGlkYXRlX3JhbmdlKGNvbnN0IF9fb3duZWRfbGlzdCogX19iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfSXRlcmF0b3ImIF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9JdGVyYXRvciYgX19sYXN0KSB7CisgIHR5cGVkZWYgX19vd25lZF9saW5rIF9MX3R5cGU7CisgIF9TVExQX0FDUVVJUkVfTE9DSyhfX2Jhc2UtPl9NX2xvY2spCisgIF9MX3R5cGUqIF9fcHJldiA9IF9fQ09OU1RfQ0FTVChfTF90eXBlKiwgJl9fYmFzZS0+X01fbm9kZSk7CisgIF9MX3R5cGUqIF9fcG9zID0gX19wcmV2LT5fTV9uZXh0OworCisgIHdoaWxlIChfX3BvcyAhPSAwKSB7CisgICAgaWYgKCEoJl9fZmlyc3QgPT0gX19TVEFUSUNfQ0FTVChfSXRlcmF0b3IqLCBfX3BvcykgfHwgJl9fbGFzdCA9PSBfX1NUQVRJQ19DQVNUKF9JdGVyYXRvciosIF9fcG9zKSkgJiYKKyAgICAgICAgc3RscF9pbl9yYW5nZV9hdXgoX19TVEFUSUNfQ0FTVChfSXRlcmF0b3IqLCBfX3BvcyktPl9NX2l0ZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ZpcnN0Ll9NX2l0ZXJhdG9yLCBfX2xhc3QuX01faXRlcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9fZmlyc3QsIF9JdGVyYXRvcikpKSB7CisgICAgICBfX3Bvcy0+X01fb3duZXIgPSAwOworICAgICAgX19wcmV2LT5fTV9uZXh0ID0gX19wb3MtPl9NX25leHQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgX19wcmV2ID0gX19wb3M7CisgICAgfQorICAgIF9fcG9zID0gX19wcmV2LT5fTV9uZXh0OworICB9CisgIF9TVExQX1JFTEVBU0VfTE9DSyhfX2Jhc2UtPl9NX2xvY2spCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+Cit2b2lkIF9TVExQX0NBTEwgX19pbnZhbGlkYXRlX2l0ZXJhdG9yKGNvbnN0IF9fb3duZWRfbGlzdCogX19iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfSXRlcmF0b3ImIF9faXQpIHsKKyAgdHlwZWRlZiBfX293bmVkX2xpbmsgICBfTF90eXBlOworICBfU1RMUF9BQ1FVSVJFX0xPQ0soX19iYXNlLT5fTV9sb2NrKQorICBfTF90eXBlKiBfX3ByZXYgPSBfX0NPTlNUX0NBU1QoX0xfdHlwZSosICZfX2Jhc2UtPl9NX25vZGUpOworICBfTF90eXBlKiBfX3BvcyA9IF9fcHJldi0+X01fbmV4dDsKKyAgd2hpbGUgKF9fcG9zICE9IDApIHsKKyAgICAvLyB0aGlzIHJlcXVpcmVzIHNhZmUgaXRlcmF0b3JzIHRvIGJlIGRlcml2ZWQgZnJvbSBfX293bmVkX2xpbmsKKyAgICBpZiAoKF9fcG9zICE9IF9fU1RBVElDX0NBU1QoY29uc3QgX0xfdHlwZSosICZfX2l0KSkgJiYKKyAgICAgICAgKF9fU1RBVElDX0NBU1QoX0l0ZXJhdG9yKiwgX19wb3MpLT5fTV9pdGVyYXRvciA9PSBfX2l0Ll9NX2l0ZXJhdG9yKSkgeworICAgICAgX19wb3MtPl9NX293bmVyID0gMDsKKyAgICAgIF9fcHJldi0+X01fbmV4dCA9IF9fcG9zLT5fTV9uZXh0OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIF9fcHJldiA9IF9fcG9zOworICAgIH0KKyAgICBfX3BvcyA9IF9fcHJldi0+X01fbmV4dDsKKyAgfQorICBfU1RMUF9SRUxFQVNFX0xPQ0soX19iYXNlLT5fTV9sb2NrKQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgordm9pZCBfU1RMUF9DQUxMICBfX2NoYW5nZV9yYW5nZV9vd25lcihjb25zdCBfSXRlcmF0b3ImIF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9JdGVyYXRvciYgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX293bmVkX2xpc3QqIF9fZHN0KSB7CisgIGlmIChfX2ZpcnN0Ll9Pd25lcigpID09IF9fZHN0KQorICAgIHJldHVybjsKKworICB0eXBlZGVmIF9fb3duZWRfbGluayBfTF90eXBlOworICAvLyBDaGVjayBfX3N0bF9kZWJ1Z19lbmdpbmU8X0R1bW15Pjo6X1N3YXBfb3duZXJzIGNvbW1lbnRzIHRvIHNlZSB3aHkgdGhlcmUgaXMgbm8gbG9jayBoZXJlCisgIC8vX1NUTFBfQUNRVUlSRV9MT0NLKF9fYmFzZS0+X01fbG9jaykKKyAgX19vd25lZF9saXN0ICpfX2Jhc2UgPSBfX0NPTlNUX0NBU1QoX19vd25lZF9saXN0KiwgX19maXJzdC5fT3duZXIoKSk7CisgIF9MX3R5cGUqIF9fc3JjX3ByZXYgPSAmX19iYXNlLT5fTV9ub2RlOworICBfTF90eXBlKiBfX3BvcyA9IF9fc3JjX3ByZXYtPl9NX25leHQ7CisgIF9MX3R5cGUqIF9fZHN0X3ByZXYgPSBfX0NPTlNUX0NBU1QoX0xfdHlwZSosICZfX2RzdC0+X01fbm9kZSk7CisKKyAgd2hpbGUgKF9fcG9zICE9IDApIHsKKyAgICBpZiAoISgmX19maXJzdCA9PSBfX1NUQVRJQ19DQVNUKF9JdGVyYXRvciosIF9fcG9zKSB8fCAmX19sYXN0ID09IF9fU1RBVElDX0NBU1QoX0l0ZXJhdG9yKiwgX19wb3MpKSAmJgorICAgICAgICBzdGxwX2luX3JhbmdlX2F1eChfX1NUQVRJQ19DQVNUKF9JdGVyYXRvciosIF9fcG9zKS0+X01faXRlcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZmlyc3QuX01faXRlcmF0b3IsIF9fbGFzdC5fTV9pdGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfSVRFUkFUT1JfQ0FURUdPUlkoX19maXJzdCwgX0l0ZXJhdG9yKSkpIHsKKyAgICAgIF9fcG9zLT5fTV9vd25lciA9IF9fQ09OU1RfQ0FTVChfX293bmVkX2xpc3QqLCBfX2RzdCk7CisgICAgICAvL3JlbW92ZSBfX3BvcyBmcm9tIF9fYmFzZToKKyAgICAgIF9fc3JjX3ByZXYtPl9NX25leHQgPSBfX3Bvcy0+X01fbmV4dDsKKyAgICAgIC8vYWRkIF9fcG9zIHRvIF9fZHN0OgorICAgICAgX19wb3MtPl9NX25leHQgPSBfX2RzdF9wcmV2LT5fTV9uZXh0OworICAgICAgX19kc3RfcHJldi0+X01fbmV4dCA9IF9fcG9zOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIF9fc3JjX3ByZXYgPSBfX3BvczsKKyAgICB9CisgICAgX19wb3MgPSBfX3NyY19wcmV2LT5fTV9uZXh0OworICB9CisKKyNpZiBkZWZpbmVkKF9TVExQX1dDRSkgJiYgZGVmaW5lZChfQVJNXykKKyAgLy8gTm90ZTogVGhpcyBwYXJ0IGlzIG5lZWRlZCBmb3IgY29tcGlsaW5nIHVuZGVyIFdpbmRvd3MgQ0UgdW5kZXIgQVJNIGFuZCBjb3JyZWN0bHkgdXNpbmcKKyAgLy8gX1NUTFBfREVCVUcgbW9kZS4gVGhpcyBjb21lcyBmcm9tIGEgYnVnIGluIHRoZSBBUk0gY29tcGlsZXIgd2hlcmUgY2hlY2tlZCBpdGVyYXRvcnMgdGhhdAorICAvLyBhcmUgcGFzc2VkIGJ5IHZhbHVlIGFyZSBub3QgY29waWVkIG92ZXIgY29ycmVjdGx5LiBXaGVuIF9fY2hhbmdlX3JhbmdlX293bmVyIGlzIGNhbGxlZCwKKyAgLy8gZS5nLiBpbiBzdGQ6Omxpc3Q6OnNwbGljZSgpIHRoZSB3cm9uZyBfTV9vd25lciBmaWVsZCBnZXRzIG1vZGlmaWVkIGFuZCB0aGUgX19maXJzdAorICAvLyBpdGVyYXRvciBoYXMgdGhlIG9sZCBfTV9vd25lciBmaWVsZCwgYnV0IHdhcyBtb3ZlZCB0byB0aGUgbmV3IF9fb3duZWRfbGlzdC4gU2V0dGluZworICAvLyB0aGUgZmlyc3QgaXRlcmF0b3IncyBfTV9vd25lciBmaWVsZCBmaXhlcyB0aGlzLiBVZ2x5IGJ1dCB3b3Jrcy4KKyAgX19wb3MgPSBfX0NPTlNUX0NBU1QoX0l0ZXJhdG9yKiwgJl9fZmlyc3QpOworICBfX3Bvcy0+X01fb3duZXIgPSBfX0NPTlNUX0NBU1QoX19vd25lZF9saXN0KiwgX19kc3QpOworI2VuZGlmCisgIC8vX1NUTFBfUkVMRUFTRV9MT0NLKF9fYmFzZS0+X01fbG9jaykKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KK3ZvaWQgX1NUTFBfQ0FMTCBfX2NoYW5nZV9pdGVfb3duZXIoY29uc3QgX0l0ZXJhdG9yJiBfX2l0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX293bmVkX2xpc3QqIF9fZHN0KSB7CisgIGlmIChfX2l0Ll9Pd25lcigpID09IF9fZHN0KQorICAgIHJldHVybjsKKworICB0eXBlZGVmIF9fb3duZWRfbGluayBfTF90eXBlOworICAvLyBDaGVjayBfX3N0bF9kZWJ1Z19lbmdpbmU8X0R1bW15Pjo6X1N3YXBfb3duZXJzIGNvbW1lbnRzIHRvIHNlZSB3aHkgdGhlcmUgaXMgbm8gbG9jayBoZXJlCisgIC8vX1NUTFBfQUNRVUlSRV9MT0NLKF9fYmFzZS0+X01fbG9jaykKKyAgX19vd25lZF9saXN0ICpfX2Jhc2UgPSBfX0NPTlNUX0NBU1QoX19vd25lZF9saXN0KiwgX19pdC5fT3duZXIoKSk7CisgIF9MX3R5cGUqIF9fcHJldiA9ICZfX2Jhc2UtPl9NX25vZGU7CisgIF9MX3R5cGUqIF9fcG9zID0gX19wcmV2LT5fTV9uZXh0OworICBfTF90eXBlKiBfX2RzdF9wcmV2ID0gX19DT05TVF9DQVNUKF9MX3R5cGUqLCAmX19kc3QtPl9NX25vZGUpOworCisgIHdoaWxlIChfX3BvcyAhPSAwKSB7CisgICAgLy8gdGhpcyByZXF1aXJlcyBzYWZlIGl0ZXJhdG9ycyB0byBiZSBkZXJpdmVkIGZyb20gX19vd25lZF9saW5rCisgICAgaWYgKChfX3BvcyAhPSBfX1NUQVRJQ19DQVNUKGNvbnN0IF9MX3R5cGUqLCAmX19pdCkpICYmCisgICAgICAgIChfX1NUQVRJQ19DQVNUKF9JdGVyYXRvciosIF9fcG9zKS0+X01faXRlcmF0b3IgPT0gX19pdC5fTV9pdGVyYXRvcikpIHsKKyAgICAgIF9fcG9zLT5fTV9vd25lciA9IF9fQ09OU1RfQ0FTVChfX293bmVkX2xpc3QqLCBfX2RzdCk7CisgICAgICAvL3JlbW92ZSBfX3BvcyBmcm9tIF9fYmFzZToKKyAgICAgIF9fcHJldi0+X01fbmV4dCA9IF9fcG9zLT5fTV9uZXh0OworICAgICAgLy9hZGQgX19wb3MgdG8gX19kc3Q6CisgICAgICBfX3Bvcy0+X01fbmV4dCA9IF9fZHN0X3ByZXYtPl9NX25leHQ7CisgICAgICBfX2RzdF9wcmV2LT5fTV9uZXh0ID0gX19wb3M7CisgICAgfQorICAgIGVsc2UgeworICAgICAgX19wcmV2ID0gX19wb3M7CisgICAgfQorICAgIF9fcG9zID0gX19wcmV2LT5fTV9uZXh0OworICB9CisgIC8vX1NUTFBfUkVMRUFTRV9MT0NLKF9fYmFzZS0+X01fbG9jaykKK30KKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNlbmRpZiAvKiBfU1RMUF9ERUJVRyAqLworCisjaWYgZGVmaW5lZCAoX1NUTFBfRVhQT1NFX0dMT0JBTFNfSU1QTEVNRU5UQVRJT04pCisKKyMgIGlmbmRlZiBfU1RMUF9JTlRFUk5BTF9DU1RETElCCisjICAgIGluY2x1ZGUgPHN0bC9fY3N0ZGxpYi5oPgorIyAgZW5kaWYKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAuYyBzZWN0aW9uCisvLyAgb3duZWRfbGlzdCBub24taW5saW5lIG1ldGhvZHMgYW5kIGdsb2JhbCBmdW5jdGlvbnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjICBpZiBkZWZpbmVkIChfU1RMUF9BU1NFUlRJT05TKQorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKworIyAgICBpZiAhZGVmaW5lZCAoX1NUTFBfU1RSSU5HX0xJVEVSQUwpCisjICAgICAgZGVmaW5lIF9TVExQX1NUUklOR19MSVRFUkFMKF9feCkgX194CisjICAgIGVuZGlmCisKKyMgICAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1dJREVfSU5URVJGQUNFKQorLy8gbm90ZTogV2luQ0UgbmVlZHMgdGhpcyB0byBmb3JtYXQgc2luZ2xlLWJ5dGUgc3RyaW5ncyBpbiBfX3N0bF9kZWJ1Z19lbmdpbmU6Ol9NZXNzYWdlCisjICAgICAgZGVmaW5lIF9TVExQX1BFUkNFTlRfUyAiJWhzIgorIyAgICBlbHNlCisjICAgICAgZGVmaW5lIF9TVExQX1BFUkNFTlRfUyAiJXMiCisjICAgIGVuZGlmIC8qIF9TVExQX1VTRV9XSURFX0lOVEVSRkFDRSAqLworCisjICAgIGRlZmluZSBfU1RMUF9NRVNTQUdFX1RBQkxFX0JPRFkgPSB7IFwKK19TVExQX1NUUklOR19MSVRFUkFMKCJcbiIgX1NUTFBfUEVSQ0VOVF9TICIoJWQpOiBTVEwgZXJyb3I6ICIgX1NUTFBfUEVSQ0VOVF9TICJcbiIpLCBcCitfU1RMUF9TVFJJTkdfTElURVJBTChfU1RMUF9QRVJDRU5UX1MgIiglZCk6IFNUTCBhc3NlcnRpb24gZmFpbHVyZSA6ICIgX1NUTFBfUEVSQ0VOVF9TICJcbiIgX1NUTFBfQVNTRVJUX01TR19UUkFJTEVSKSwgXAorX1NUTFBfU1RSSU5HX0xJVEVSQUwoIlxuIiBfU1RMUF9QRVJDRU5UX1MgIiglZCk6IFNUTCBlcnJvciA6ICIgX1NUTFBfUEVSQ0VOVF9TICJcbiIgX1NUTFBfUEVSQ0VOVF9TICIoJWQpOiBTVEwgYXNzZXJ0aW9uIGZhaWx1cmU6ICAgICAiIF9TVExQX1BFUkNFTlRfUyAiIFxuIiBfU1RMUF9BU1NFUlRfTVNHX1RSQUlMRVIpLCBcCitfU1RMUF9TVFJJTkdfTElURVJBTCgiSW52YWxpZCBhcmd1bWVudCB0byBvcGVyYXRpb24gKHNlZSBvcGVyYXRpb24gZG9jdW1lbnRhdGlvbikiKSwgICAgICAgICAgICAgICAgICBcCitfU1RMUF9TVFJJTkdfTElURVJBTCgiVGFraW5nIGFuIGl0ZXJhdG9yIG91dCBvZiBkZXN0cm95ZWQgKG9yIG90aGVyd2lzZSBjb3JydXB0ZWQpIGNvbnRhaW5lciIpLCAgICAgICBcCitfU1RMUF9TVFJJTkdfTElURVJBTCgiVHJ5aW5nIHRvIGV4dHJhY3QgYW4gb2JqZWN0IG91dCBmcm9tIGVtcHR5IGNvbnRhaW5lciIpLFwKK19TVExQX1NUUklOR19MSVRFUkFMKCJQYXN0LXRoZS1lbmQgaXRlcmF0b3IgY291bGQgbm90IGJlIGVyYXNlZCIpLCAgXAorX1NUTFBfU1RSSU5HX0xJVEVSQUwoIkluZGV4IG91dCBvZiBib3VuZHMiKSwgIFwKK19TVExQX1NUUklOR19MSVRFUkFMKCJDb250YWluZXIgZG9lc24ndCBvd24gdGhlIGl0ZXJhdG9yIiksICBcCitfU1RMUF9TVFJJTkdfTElURVJBTCgiQ29udGFpbmVyIGlzIG93bmVyIG9mIHRoZSBpdGVyYXRvciwgYnV0IHNob3VsZCBub3QiKSwgIFwKK19TVExQX1NUUklOR19MSVRFUkFMKCJVbmluaXRpYWxpemVkIG9yIGludmFsaWRhdGVkIChieSBtdXRhdGluZyBvcGVyYXRpb24pIGl0ZXJhdG9yIHVzZWQiKSwgIFwKK19TVExQX1NUUklOR19MSVRFUkFMKCJVbmluaXRpYWxpemVkIG9yIGludmFsaWRhdGVkIChieSBtdXRhdGluZyBvcGVyYXRpb24pIGxlZnRoYW5kIGl0ZXJhdG9yIGluIGV4cHJlc3Npb24iKSwgIFwKK19TVExQX1NUUklOR19MSVRFUkFMKCJVbmluaXRpYWxpemVkIG9yIGludmFsaWRhdGVkIChieSBtdXRhdGluZyBvcGVyYXRpb24pIHJpZ2h0aGFuZCBpdGVyYXRvciBpbiBleHByZXNzaW9uIiksICBcCitfU1RMUF9TVFJJTkdfTElURVJBTCgiSXRlcmF0b3JzIHVzZWQgaW4gZXhwcmVzc2lvbiBhcmUgZnJvbSBkaWZmZXJlbnQgb3duZXJzIiksICBcCitfU1RMUF9TVFJJTkdfTElURVJBTCgiSXRlcmF0b3IgY291bGQgbm90IGJlIGRlcmVmZXJlbmNlZCAocGFzdC10aGUtZW5kID8pIiksICBcCitfU1RMUF9TVFJJTkdfTElURVJBTCgiUmFuZ2UgW2ZpcnN0LGxhc3QpIGlzIGludmFsaWQiKSwgIFwKK19TVExQX1NUUklOR19MSVRFUkFMKCJJdGVyYXRvciBpcyBub3QgaW4gcmFuZ2UgW2ZpcnN0LGxhc3QpIiksICBcCitfU1RMUF9TVFJJTkdfTElURVJBTCgiUmFuZ2UgW2ZpcnN0LGxhc3QpIGlzIG5vdCBpbiByYW5nZSBbc3RhcnQsZmluaXNoKSIpLCAgXAorX1NUTFBfU1RSSU5HX0xJVEVSQUwoIlRoZSBhZHZhbmNlIHdvdWxkIHByb2R1Y2UgaW52YWxpZCBpdGVyYXRvciIpLCAgXAorX1NUTFBfU1RSSU5HX0xJVEVSQUwoIkl0ZXJhdG9yIGlzIHNpbmd1bGFyIChhZHZhbmNlZCBiZXlvbmQgdGhlIGJvdW5kcyA/KSIpLCAgXAorX1NUTFBfU1RSSU5HX0xJVEVSQUwoIkludmFsaWQgc3RyaWN0IHdlYWsgb3JkZXJpbmcgcHJlZGljYXRlLCBpZiBwcmVkKGEsIGIpIHRoZW4gd2Ugc2hvdWxkIGhhdmUgIXByZWQoYiwgYSkiKSwgXAorX1NUTFBfU1RSSU5HX0xJVEVSQUwoIkludmFsaWQgZXF1aXZhbGVudCBwcmVkaWNhdGUsIGlmIHByZWQoYSwgYikgdGhlbiB3ZSBzaG91bGQgaGF2ZSBwcmVkKGIsIGEpIiksIFwKK19TVExQX1NUUklOR19MSVRFUkFMKCJNZW1vcnkgYmxvY2sgZGVhbGxvY2F0ZWQgdHdpY2UiKSwgIFwKK19TVExQX1NUUklOR19MSVRFUkFMKCJEZWFsbG9jYXRpbmcgYSBibG9jayB0aGF0IHdhcyBuZXZlciBhbGxvY2F0ZWQiKSwgIFwKK19TVExQX1NUUklOR19MSVRFUkFMKCJEZWFsbG9jYXRpbmcgYSBtZW1vcnkgYmxvY2sgYWxsb2NhdGVkIGZvciBhbm90aGVyIHR5cGUiKSwgIFwKK19TVExQX1NUUklOR19MSVRFUkFMKCJTaXplIG9mIGJsb2NrIHBhc3NlZCB0byBkZWFsbG9jYXRlKCkgZG9lc24ndCBtYXRjaCBibG9jayBzaXplIiksICBcCitfU1RMUF9TVFJJTkdfTElURVJBTCgiUG9pbnRlciB1bmRlcnJ1biAtIHNhZmV0eSBtYXJnaW4gYXQgZnJvbnQgb2YgbWVtb3J5IGJsb2NrIG92ZXJ3cml0dGVuIiksICBcCitfU1RMUF9TVFJJTkdfTElURVJBTCgiUG9pbnRlciBvdmVycnJ1biAtIHNhZmV0eSBtYXJnaW4gYXQgYmFjayBvZiBtZW1vcnkgYmxvY2sgb3ZlcndyaXR0ZW4iKSwgICBcCitfU1RMUF9TVFJJTkdfTElURVJBTCgiQXR0ZW1wdCB0byBkZXJlZmVyZW5jZSBudWxsIHBvaW50ZXIgcmV0dXJuZWQgYnkgYXV0b19wdHI6OmdldCgpIiksICAgXAorX1NUTFBfU1RSSU5HX0xJVEVSQUwoIk1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9uIHJldHVybmVkIGEgd3JvbmdseSBhbGlnbiBtZW1vcnkgYmxvY2siKSwgICBcCitfU1RMUF9TVFJJTkdfTElURVJBTCgiVW5rbm93biBwcm9ibGVtIikgXAorICB9CisKK3RlbXBsYXRlIDxjbGFzcyBfRHVtbXk+Citjb25zdCBjaGFyKiBfX3N0bF9kZWJ1Z19lbmdpbmU8X0R1bW15Pjo6X01lc3NhZ2VfdGFibGVbX1N0bE1zZ19NQVhdIF9TVExQX01FU1NBR0VfVEFCTEVfQk9EWTsKKworIyAgICB1bmRlZiBfU1RMUF9TVFJJTkdfTElURVJBTAorIyAgICB1bmRlZiBfU1RMUF9QRVJDRU5UX1MKKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9ERUJVR19NRVNTQUdFKQorIyAgICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1NUREFSRworIyAgICAgIGluY2x1ZGUgPHN0bC9fY3N0ZGFyZy5oPgorIyAgICBlbmRpZgorIyAgICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1NURElPCisjICAgICAgaW5jbHVkZSA8c3RsL19jc3RkaW8uaD4KKyMgICAgZW5kaWYKKyMgICAgaWYgZGVmaW5lZCAoX1NUTFBfREVCVUdfTU9ERV9USFJPV1MpICYmICFkZWZpbmVkIChfU1RMUF9SQU5HRV9FUlJPUlNfSCkKKyMgICAgICBpbmNsdWRlIDxzdGwvX3JhbmdlX2Vycm9ycy5oPgorIyAgICBlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9EdW1teT4KK3ZvaWQgX1NUTFBfQ0FMTAorX19zdGxfZGVidWdfZW5naW5lPF9EdW1teT46Ol9NZXNzYWdlKGNvbnN0IGNoYXIgKiBfX2Zvcm1hdF9zdHIsIC4uLikgeworICBTVExQT1JUX0NTVEQ6OnZhX2xpc3QgX19hcmdzOworICB2YV9zdGFydCggX19hcmdzLCBfX2Zvcm1hdF9zdHIgKTsKKworIyAgICAgIGlmICFkZWZpbmVkIChfU1RMUF9ERUJVR19NT0RFX1RIUk9XUykKKyMgICAgICAgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9XSURFX0lOVEVSRkFDRSkKKyAgVENIQVIgX19idWZmZXJbNTEyXTsKKyAgaW50IF9jb252ZXJ0ID0gc3RybGVuKF9fZm9ybWF0X3N0cikgKyAxOworICBMUFdTVFIgX2xwdyA9IChMUFdTVFIpYWxsb2NhKF9jb252ZXJ0ICogc2l6ZW9mKHdjaGFyX3QpKTsKKyAgX2xwd1swXSA9ICdcMCc7CisgIE11bHRpQnl0ZVRvV2lkZUNoYXIoR2V0QUNQKCksIDAsIF9fZm9ybWF0X3N0ciwgLTEsIF9scHcsIF9jb252ZXJ0KTsKKyAgd3ZzcHJpbnRmKF9fYnVmZmVyLCBfbHB3LCBfX2FyZ3MpOworICBfU1RMUF9XSU5DRV9UUkFDRShfX2J1ZmZlcik7CisjICAgICAgICBlbGlmIGRlZmluZWQgKF9TVExQX1dJTjMyKSAmJiAoZGVmaW5lZChfU1RMUF9NU1ZDKSB8fCBkZWZpbmVkIChfX0lDTCkpCisgIGNoYXIgX19idWZmZXIgWzQwOTZdOworCisjICAgICAgICAgIGlmICFkZWZpbmVkIChfU1RMUF9VU0VfU0FGRV9TVFJJTkdfRlVOQ1RJT05TKQorICB2c25wcmludGYoX19idWZmZXIsIF9TVExQX0FSUkFZX1NJWkUoX19idWZmZXIpLCBfX2Zvcm1hdF9zdHIsIF9fYXJncyk7CisjICAgICAgICAgIGVsc2UKKyAgdnNucHJpbnRmX3MoX19idWZmZXIsIF9TVExQX0FSUkFZX1NJWkUoX19idWZmZXIpLCBfVFJVTkNBVEUsIF9fZm9ybWF0X3N0ciwgX19hcmdzKTsKKyMgICAgICAgICAgZW5kaWYKKworICBPdXRwdXREZWJ1Z1N0cmluZ0EoX19idWZmZXIpOworCisjICAgICAgICBlbGlmIGRlZmluZWQgKF9fYW1pZ2Fvc19fKQorICBTVExQT1JUX0NTVEQ6OnZmcHJpbnRmKHN0ZGVyciwgX19mb3JtYXRfc3RyLCAoY2hhciAqKV9fYXJncyk7CisjICAgICAgICBlbHNlCisgIFNUTFBPUlRfQ1NURDo6dmZwcmludGYoc3RkZXJyLCBfX2Zvcm1hdF9zdHIsIF9fYXJncyk7CisjICAgICAgICBlbmRpZgorIyAgICAgIGVsc2UKKyAgY2hhciBfX2J1ZmZlcls0MDk2XTsKKworIyAgICAgICAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1NBRkVfU1RSSU5HX0ZVTkNUSU9OUykKKyAgdnNucHJpbnRmX3MoX19idWZmZXIsIF9TVExQX0FSUkFZX1NJWkUoX19idWZmZXIpLCBfVFJVTkNBVEUsIF9fZm9ybWF0X3N0ciwgX19hcmdzKTsKKyMgICAgICAgIGVsaWYgZGVmaW5lZCAoX1NUTFBfV0lOMzIpICYmIChkZWZpbmVkKF9TVExQX01TVkMpIHx8IGRlZmluZWQgKF9fSUNMKSkKKyAgdnNucHJpbnRmKF9fYnVmZmVyLCBfU1RMUF9BUlJBWV9TSVpFKF9fYnVmZmVyKSwgX19mb3JtYXRfc3RyLCBfX2FyZ3MpOworIyAgICAgICAgZWxzZQorICB2c3ByaW50ZihfX2J1ZmZlciwgX19mb3JtYXRfc3RyLCBfX2FyZ3MpOworIyAgICAgICAgZW5kaWYKKyMgICAgICBlbmRpZgorCisjICAgICAgaWZkZWYgX1NUTFBfREVCVUdfTUVTU0FHRV9QT1NUCisgIF9TVExQX0RFQlVHX01FU1NBR0VfUE9TVAorIyAgICAgIGVuZGlmCisKKyAgdmFfZW5kKF9fYXJncyk7CisKKyMgICAgICBpZiBkZWZpbmVkIChfU1RMUF9ERUJVR19NT0RFX1RIUk9XUykKKyAgX19zdGxfdGhyb3dfcnVudGltZV9lcnJvcihfX2J1ZmZlcik7CisjICAgICAgZW5kaWYKK30KKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyMgICAgZWxzZQorX1NUTFBfQkVHSU5fTkFNRVNQQUNFCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCit0ZW1wbGF0ZSA8Y2xhc3MgX0R1bW15Pgordm9pZCBfU1RMUF9DQUxMCitfX3N0bF9kZWJ1Z19lbmdpbmU8X0R1bW15Pjo6X01lc3NhZ2UoY29uc3QgY2hhciAqIF9fZm9ybWF0X3N0ciwgLi4uKQore30KK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorX1NUTFBfRU5EX05BTUVTUEFDRQorIyAgICBlbmRpZiAvKiBfU1RMUF9ERUJVR19NRVNTQUdFICovCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0R1bW15Pgordm9pZCBfU1RMUF9DQUxMCitfX3N0bF9kZWJ1Z19lbmdpbmU8X0R1bW15Pjo6X0luZGV4ZWRFcnJvcihpbnQgX19lcnJvcl9pbmQsIGNvbnN0IGNoYXIqIF9fZiwgaW50IF9fbCkgeworICBfX3N0bF9kZWJ1Z19tZXNzYWdlKF9NZXNzYWdlX3RhYmxlW19TdGxGb3JtYXRfRVJST1JfUkVUVVJOXSwKKyAgICAgICAgICAgICAgICAgICAgICBfX2YsIF9fbCwgX01lc3NhZ2VfdGFibGVbX19lcnJvcl9pbmRdKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9EdW1teT4KK3ZvaWQgX1NUTFBfQ0FMTAorX19zdGxfZGVidWdfZW5naW5lPF9EdW1teT46Ol9WZXJib3NlQXNzZXJ0KGNvbnN0IGNoYXIqIF9fZXhwciwgaW50IF9fZXJyb3JfaW5kLCBjb25zdCBjaGFyKiBfX2YsIGludCBfX2wpIHsKKyAgX19zdGxfZGVidWdfbWVzc2FnZShfTWVzc2FnZV90YWJsZVtfU3RsRm9ybWF0X1ZFUkJPU0VfQVNTRVJUSU9OX0ZBSUxVUkVdLAorICAgICAgICAgICAgICAgICAgICAgIF9fZiwgX19sLCBfTWVzc2FnZV90YWJsZVtfX2Vycm9yX2luZF0sIF9fZiwgX19sLCBfX2V4cHIpOworICBfX3N0bF9kZWJ1Z190ZXJtaW5hdGUoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9EdW1teT4KK3ZvaWQgX1NUTFBfQ0FMTAorX19zdGxfZGVidWdfZW5naW5lPF9EdW1teT46Ol9Bc3NlcnQoY29uc3QgY2hhciogX19leHByLCBjb25zdCBjaGFyKiBfX2YsIGludCBfX2wpIHsKKyAgX19zdGxfZGVidWdfbWVzc2FnZShfTWVzc2FnZV90YWJsZVtfU3RsRm9ybWF0X0FTU0VSVElPTl9GQUlMVVJFXSxfX2YsIF9fbCwgX19leHByKTsKKyAgX19zdGxfZGVidWdfdGVybWluYXRlKCk7Cit9CisKKy8vIGlmIGV4Y2VwdGlvbnMgYXJlIHByZXNlbnQsIHNlbmRzIHVuaXF1ZSBleGNlcHRpb24KKy8vIGlmIG5vdCwgY2FsbHMgYWJvcnQoKSB0byB0ZXJtaW5hdGUKK3RlbXBsYXRlIDxjbGFzcyBfRHVtbXk+Cit2b2lkIF9TVExQX0NBTEwKK19fc3RsX2RlYnVnX2VuZ2luZTxfRHVtbXk+OjpfVGVybWluYXRlKCkKK3sgX1NUTFBfQUJPUlQoKTsgfQorCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKK19TVExQX0VORF9OQU1FU1BBQ0UKKworIyAgZW5kaWYgLyogX1NUTFBfQVNTRVJUSU9OUyAqLworCisjICBpZiBkZWZpbmVkIChfU1RMUF9ERUJVRykKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIG93bmVkX2xpc3Qgbm9uLWlubGluZSBtZXRob2RzCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwordGVtcGxhdGUgPGNsYXNzIF9EdW1teT4KK3ZvaWQgIF9TVExQX0NBTEwKK19fc3RsX2RlYnVnX2VuZ2luZTxfRHVtbXk+OjpfSW52YWxpZGF0ZV9hbGwoX19vd25lZF9saXN0KiBfX2wpIHsKKyAgX1NUTFBfQUNRVUlSRV9MT0NLKF9fbC0+X01fbG9jayk7CisgIF9TdGFtcF9hbGwoX19sLCAwKTsKKyAgX19sLT5fTV9ub2RlLl9NX25leHQgPTA7CisgIF9TVExQX1JFTEVBU0VfTE9DSyhfX2wtPl9NX2xvY2spOworfQorCisvLyBib3JpcyA6IHRoaXMgaXMgdW5hc2FmZSByb3V0aW5lOyBzaG91bGQgYmUgdXNlZCBmcm9tIHdpdGhpbiBjcml0aWNhbCBzZWN0aW9uIG9ubHkgIQordGVtcGxhdGUgPGNsYXNzIF9EdW1teT4KK3ZvaWQgIF9TVExQX0NBTEwKK19fc3RsX2RlYnVnX2VuZ2luZTxfRHVtbXk+OjpfU3RhbXBfYWxsKF9fb3duZWRfbGlzdCogX19sLCBfX293bmVkX2xpc3QqIF9fbykgeworICAvLyBjcnVjaWFsCisgIGlmIChfX2wtPl9NX25vZGUuX01fb3duZXIpIHsKKyAgICBmb3IgKF9fb3duZWRfbGluayogIF9fcG9zID0gKF9fb3duZWRfbGluayopX19sLT5fTV9ub2RlLl9NX25leHQ7CisgICAgICBfX3BvcyAhPSAwOyBfX3BvcyA9IChfX293bmVkX2xpbmsqKV9fcG9zLT5fTV9uZXh0KSB7CisgICAgICBfU1RMUF9BU1NFUlQoX19wb3MtPl9Pd25lcigpPT0gX19sKQorICAgICAgX19wb3MtPl9NX293bmVyPV9fbzsKKyAgICB9CisgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9EdW1teT4KK3ZvaWQgIF9TVExQX0NBTEwKK19fc3RsX2RlYnVnX2VuZ2luZTxfRHVtbXk+OjpfVmVyaWZ5KGNvbnN0IF9fb3duZWRfbGlzdCogX19sKSB7CisgIF9TVExQX0FDUVVJUkVfTE9DSyhfX2wtPl9NX2xvY2spOworICBpZiAoX19sKSB7CisgICAgX1NUTFBfQVNTRVJUKF9fbC0+X01fbm9kZS5fT3duZXIoKSAhPSAwKQorICAgIGZvciAoX19vd25lZF9saW5rKiBfX3BvcyA9IChfX293bmVkX2xpbmsqKV9fbC0+X01fbm9kZS5fTV9uZXh0OworICAgICAgICAgX19wb3MgIT0gMDsgX19wb3MgPSAoX19vd25lZF9saW5rKilfX3Bvcy0+X01fbmV4dCkgeworICAgICAgX1NUTFBfQVNTRVJUKF9fcG9zLT5fT3duZXIoKT09IF9fbCkKKyAgICB9CisgIH0KKyAgX1NUTFBfUkVMRUFTRV9MT0NLKF9fbC0+X01fbG9jayk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRHVtbXk+Cit2b2lkIF9TVExQX0NBTEwKK19fc3RsX2RlYnVnX2VuZ2luZTxfRHVtbXk+OjpfU3dhcF9vd25lcnMoX19vd25lZF9saXN0JiBfX3gsIF9fb3duZWRfbGlzdCYgX195KSB7CisgIC8qCisgICAqICBhY2NvcmRpbmcgdG8gdGhlIHN0YW5kYXJkIDogLS1ubyBzd2FwKCkgZnVuY3Rpb24gaW52YWxpZGF0ZXMgYW55IHJlZmVyZW5jZXMsCisgICAqICBwb2ludGVycywgIG9yICBpdGVyYXRvcnMgcmVmZXJyaW5nIHRvIHRoZSBlbGVtZW50cyBvZiB0aGUgY29udGFpbmVycyBiZWluZyBzd2FwcGVkLgorICAgKi8KKworICBfX293bmVkX2xpbmsqIF9fdG1wOworCisgIC8qCisgICAqIGJvcmlzIDogdGhlcmUgaXMgYSBkZWFkbG9jayBwb3RlbnRpYWwgc2l0dWF0aW9uIGhlcmUgaWYgd2UgbG9jayB0d28gY29udGFpbmVycyBzZXF1ZW50aWFsbHkuCisgICAqIEFzIHVzZXIgaXMgc3VwcG9zZWQgdG8gcHJvdmlkZSBpdHMgb3duIHN5bmNocm9uaXphdGlvbiBhcm91bmQgc3dhcCgpICggaXQgaXMgdW5zYWZlIHRvIGRvIGFueSBjb250YWluZXIvaXRlcmF0b3IgYWNjZXNzCisgICAqIGluIHBhcmFsbGVsIHdpdGggc3dhcCgpKSwgd2UganVzdCBkbyBub3QgdXNlIGFueSBsb2NraW5nIGF0IGFsbCAtLSB0aGF0IGJlaGF2aW91ciBpcyBjbG9zZXIgdG8gbm9uLWRlYnVnIHZlcnNpb24KKyAgICovCisKKyAgX190bXAgPSBfX3guX01fbm9kZS5fTV9uZXh0OworCisgIF9TdGFtcF9hbGwoJl9feCwgJl9feSk7CisgIF9TdGFtcF9hbGwoJl9feSwgJl9feCk7CisKKyAgX194Ll9NX25vZGUuX01fbmV4dCA9IF9feS5fTV9ub2RlLl9NX25leHQ7CisgIF9feS5fTV9ub2RlLl9NX25leHQgPSBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9EdW1teT4KK3ZvaWQgX1NUTFBfQ0FMTAorX19zdGxfZGVidWdfZW5naW5lPF9EdW1teT46Ol9TZXRfb3duZXIoX19vd25lZF9saXN0JiBfX3NyYywgX19vd25lZF9saXN0JiBfX2RzdCkgeworICBpZiAoJl9fc3JjID09ICZfX2RzdCkKKyAgICByZXR1cm47CisKKyAgLy8gQ2hlY2sgX19zdGxfZGVidWdfZW5naW5lPF9EdW1teT46Ol9Td2FwX293bmVycyBjb21tZW50cyB0byBzZWUgd2h5IHRoZXJlIGlzIG5vIGxvY2sgaGVyZQorICB0eXBlZGVmIF9fb3duZWRfbGluayBfTF90eXBlOworICBfTF90eXBlKiBfX3ByZXYgPSAmX19zcmMuX01fbm9kZTsKKyAgX0xfdHlwZSogX19wb3MgPSBfX3ByZXYtPl9NX25leHQ7CisKKyAgd2hpbGUgKF9fcG9zICE9IDApIHsKKyAgICBfX3Bvcy0+X01fb3duZXIgPSAmX19kc3Q7CisgICAgX19wcmV2ID0gX19wb3M7CisgICAgX19wb3MgPSBfX3ByZXYtPl9NX25leHQ7CisgIH0KKyAgX19wcmV2LT5fTV9uZXh0ID0gX19kc3QuX01fbm9kZS5fTV9uZXh0OworICBfX2RzdC5fTV9ub2RlLl9NX25leHQgPSBfX3NyYy5fTV9ub2RlLl9NX25leHQ7CisgIF9fc3JjLl9NX25vZGUuX01fbmV4dCA9IDA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRHVtbXk+Cit2b2lkIF9TVExQX0NBTEwKK19fc3RsX2RlYnVnX2VuZ2luZTxfRHVtbXk+OjpfTV9kZXRhY2goX19vd25lZF9saXN0KiBfX2wsIF9fb3duZWRfbGluayogX19jX25vZGUpIHsKKyAgaWYgKF9fbCAgIT0gMCkgeworCisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoX19sLT5fT3duZXIoKSE9MCwgX1N0bE1zZ19JTlZBTElEX0NPTlRBSU5FUikKKworICAgIF9TVExQX0FDUVVJUkVfTE9DSyhfX2wtPl9NX2xvY2spCisgICAgICAvLyBib3JpcyA6IHJlLXRlc3QgdGhlIGNvbmRpdGlvbiBpbiBjYXNlIHNvbWVvbmUgZWxzZSBhbHJlYWR5IGRlbGV0ZWQgdXMKKyAgICAgIGlmKF9fY19ub2RlLT5fTV9vd25lciAhPSAwKSB7CisgICAgICAgIF9fb3duZWRfbGluayogX19wcmV2LCAqX19uZXh0OworCisgICAgICAgIGZvciAoX19wcmV2ID0gJl9fbC0+X01fbm9kZTsgKF9fbmV4dCA9IF9fcHJldi0+X01fbmV4dCkgIT0gX19jX25vZGU7CisgICAgICAgICAgICAgX19wcmV2ID0gX19uZXh0KSB7CisgICAgICAgICAgX1NUTFBfQVNTRVJUKF9fbmV4dCAmJiBfX25leHQtPl9Pd25lcigpID09IF9fbCkKKyAgICAgICAgICAgIH0KKworICAgICAgICBfX3ByZXYtPl9NX25leHQgPSBfX2Nfbm9kZS0+X01fbmV4dDsKKyAgICAgICAgX19jX25vZGUtPl9NX293bmVyPTA7CisgICAgICB9CisgICAgX1NUTFBfUkVMRUFTRV9MT0NLKF9fbC0+X01fbG9jaykKKyAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0R1bW15Pgordm9pZCBfU1RMUF9DQUxMCitfX3N0bF9kZWJ1Z19lbmdpbmU8X0R1bW15Pjo6X01fYXR0YWNoKF9fb3duZWRfbGlzdCogX19sLCBfX293bmVkX2xpbmsqIF9fY19ub2RlKSB7CisgIGlmIChfX2wgPT0wKSB7CisgICAgKF9fY19ub2RlKS0+X01fb3duZXIgPSAwOworICB9IGVsc2UgeworICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKF9fbC0+X093bmVyKCkhPTAsIF9TdGxNc2dfSU5WQUxJRF9DT05UQUlORVIpCisgICAgX1NUTFBfQUNRVUlSRV9MT0NLKF9fbC0+X01fbG9jaykKKyAgICBfX2Nfbm9kZS0+X01fb3duZXIgPSBfX2w7CisgICAgX19jX25vZGUtPl9NX25leHQgPSBfX2wtPl9NX25vZGUuX01fbmV4dDsKKyAgICBfX2wtPl9NX25vZGUuX01fbmV4dCA9IF9fY19ub2RlOworICAgIF9TVExQX1JFTEVBU0VfTE9DSyhfX2wtPl9NX2xvY2spCisgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9EdW1teT4KK3ZvaWQqIF9TVExQX0NBTEwKK19fc3RsX2RlYnVnX2VuZ2luZTxfRHVtbXk+OjpfR2V0X2NvbnRhaW5lcl9wdHIoY29uc3QgX19vd25lZF9saW5rKiBfX2wpIHsKKyAgY29uc3QgX19vd25lZF9saXN0KiBfX293bmVyICAgID0gX19sLT5fT3duZXIoKTsKKyAgX1NUTFBfVkVSQk9TRV9SRVRVUk5fMChfX293bmVyICE9IDAsIF9TdGxNc2dfSU5WQUxJRF9JVEVSQVRPUikKKyAgdm9pZCogX19yZXQgPSBfX0NPTlNUX0NBU1Qodm9pZCosX19vd25lci0+X093bmVyKCkpOworICBfU1RMUF9WRVJCT1NFX1JFVFVSTl8wKF9fcmV0ICE9MCwgX1N0bE1zZ19JTlZBTElEX0NPTlRBSU5FUikKKyAgcmV0dXJuIF9fcmV0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0R1bW15PgorYm9vbCBfU1RMUF9DQUxMCitfX3N0bF9kZWJ1Z19lbmdpbmU8X0R1bW15Pjo6X0NoZWNrX3NhbWVfb3duZXIoY29uc3QgX19vd25lZF9saW5rJiBfX2kxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fb3duZWRfbGluayYgX19pMikgeworICBfU1RMUF9WRVJCT1NFX1JFVFVSTihfX2kxLl9WYWxpZCgpLCBfU3RsTXNnX0lOVkFMSURfTEVGVEhBTkRfSVRFUkFUT1IpCisgIF9TVExQX1ZFUkJPU0VfUkVUVVJOKF9faTIuX1ZhbGlkKCksIF9TdGxNc2dfSU5WQUxJRF9SSUdIVEhBTkRfSVRFUkFUT1IpCisgIF9TVExQX1ZFUkJPU0VfUkVUVVJOKChfX2kxLl9Pd25lcigpID09IF9faTIuX093bmVyKCkpLCBfU3RsTXNnX0RJRkZFUkVOVF9PV05FUlMpCisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0R1bW15PgorYm9vbCBfU1RMUF9DQUxMCitfX3N0bF9kZWJ1Z19lbmdpbmU8X0R1bW15Pjo6X0NoZWNrX3NhbWVfb3JfbnVsbF9vd25lcihjb25zdCBfX293bmVkX2xpbmsmIF9faTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX293bmVkX2xpbmsmIF9faTIpIHsKKyAgX1NUTFBfVkVSQk9TRV9SRVRVUk4oX19pMS5fT3duZXIoKSA9PSBfX2kyLl9Pd25lcigpLCBfU3RsTXNnX0RJRkZFUkVOVF9PV05FUlMpCisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0R1bW15PgorYm9vbCBfU1RMUF9DQUxMCitfX3N0bF9kZWJ1Z19lbmdpbmU8X0R1bW15Pjo6X0NoZWNrX2lmX293bmVyKCBjb25zdCBfX293bmVkX2xpc3QgKiBfX2wsIGNvbnN0IF9fb3duZWRfbGluayYgX19pdCkgeworICBjb25zdCBfX293bmVkX2xpc3QqIF9fb3duZXJfcHRyID0gX19pdC5fT3duZXIoKTsKKyAgX1NUTFBfVkVSQk9TRV9SRVRVUk4oX19vd25lcl9wdHIgIT0gMCwgX1N0bE1zZ19JTlZBTElEX0lURVJBVE9SKQorICBfU1RMUF9WRVJCT1NFX1JFVFVSTihfX2wgPT0gX19vd25lcl9wdHIsIF9TdGxNc2dfTk9UX09XTkVSKQorICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9EdW1teT4KK2Jvb2wgX1NUTFBfQ0FMTAorX19zdGxfZGVidWdfZW5naW5lPF9EdW1teT46Ol9DaGVja19pZl9ub3Rfb3duZXIoIGNvbnN0IF9fb3duZWRfbGlzdCAqIF9fbCwgY29uc3QgX19vd25lZF9saW5rJiBfX2l0KSB7CisgIGNvbnN0IF9fb3duZWRfbGlzdCogX19vd25lcl9wdHIgPSBfX2l0Ll9Pd25lcigpOworICBfU1RMUF9WRVJCT1NFX1JFVFVSTihfX293bmVyX3B0ciAhPSAwLCBfU3RsTXNnX0lOVkFMSURfSVRFUkFUT1IpCisgIF9TVExQX1ZFUkJPU0VfUkVUVVJOKF9fbCAhPSBfX293bmVyX3B0ciwgX1N0bE1zZ19TSE9VTERfTk9UX09XTkVSKQorICByZXR1cm4gdHJ1ZTsKK30KKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyMgIGVuZGlmIC8qIF9TVExQX0RFQlVHICovCisKKyNlbmRpZiAvKiBpZiBkZWZpbmVkIChFWFBPU0VfR0xPQkFMU19JTVBMRU1FTlRBVElPTikgKi8KKworI2VuZGlmIC8qIGhlYWRlciBndWFyZCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdGwvZGVidWcvX2RlYnVnLmggYi9zdGxwb3J0L3N0bC9kZWJ1Zy9fZGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTJhOGNlCi0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvZGVidWcvX2RlYnVnLmgKQEAgLTAsMCArMSw0NzMgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9ERUJVR19ICisjZGVmaW5lIF9TVExQX0RFQlVHX0gKKworI2lmIChkZWZpbmVkIChfU1RMUF9ERUJVRykgfHwgZGVmaW5lZCAoX1NUTFBfREVCVUdfQUxMT0MpKSAmJiBcCisgICAgIWRlZmluZWQgKF9TVExQX0FTU0VSVElPTlMpCisjICBkZWZpbmUgX1NUTFBfQVNTRVJUSU9OUyAxCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX0FTU0VSVElPTlMpCisKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9GSUxFX18pCisjICAgIGRlZmluZSBfU1RMUF9GSUxFX18gX19GSUxFX18KKyMgIGVuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK2VudW0geworICAvL0dlbmVyYWwgZXJyb3JzCisgIF9TdGxGb3JtYXRfRVJST1JfUkVUVVJOLAorICBfU3RsRm9ybWF0X0FTU0VSVElPTl9GQUlMVVJFLAorICBfU3RsRm9ybWF0X1ZFUkJPU0VfQVNTRVJUSU9OX0ZBSUxVUkUsCisgIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCwKKyAgLy9Db250YWluZXIvSXRlcmF0b3IgcmVsYXRlZCBlcnJvcnMKKyAgX1N0bE1zZ19JTlZBTElEX0NPTlRBSU5FUiwKKyAgX1N0bE1zZ19FTVBUWV9DT05UQUlORVIsCisgIF9TdGxNc2dfRVJBU0VfUEFTVF9USEVfRU5ELAorICBfU3RsTXNnX09VVF9PRl9CT1VORFMsCisgIF9TdGxNc2dfTk9UX09XTkVSLAorICBfU3RsTXNnX1NIT1VMRF9OT1RfT1dORVIsCisgIF9TdGxNc2dfSU5WQUxJRF9JVEVSQVRPUiwKKyAgX1N0bE1zZ19JTlZBTElEX0xFRlRIQU5EX0lURVJBVE9SLAorICBfU3RsTXNnX0lOVkFMSURfUklHSFRIQU5EX0lURVJBVE9SLAorICBfU3RsTXNnX0RJRkZFUkVOVF9PV05FUlMgICAgICwKKyAgX1N0bE1zZ19OT1RfREVSRUZFUkVOQ0VBQkxFICAsCisgIF9TdGxNc2dfSU5WQUxJRF9SQU5HRSAgICAgICAgLAorICBfU3RsTXNnX05PVF9JTl9SQU5HRV8xICAgICAgICwKKyAgX1N0bE1zZ19OT1RfSU5fUkFOR0VfMiAgICAgICAsCisgIF9TdGxNc2dfSU5WQUxJRF9BRFZBTkNFICAgICAgLAorICBfU3RsTXNnX1NJTkdVTEFSX0lURVJBVE9SICAgICwKKyAgLy9CYWQgcHJlZGljYXRlIGZvciBzb3J0aW5nCisgIF9TdGxNc2dfSU5WQUxJRF9TVFJJQ1RfV0VBS19QUkVESUNBVEUsCisgIF9TdGxNc2dfSU5WQUxJRF9FUVVJVkFMRU5UX1BSRURJQ0FURSwKKyAgLy8gZGVidWcgYWxsb2MgbWVzc2FnZXMKKyAgX1N0bE1zZ19EQkFfREVMRVRFRF9UV0lDRSAgICAsCisgIF9TdGxNc2dfREJBX05FVkVSX0FMTE9DQVRFRCAgLAorICBfU3RsTXNnX0RCQV9UWVBFX01JU01BVENIICAgICwKKyAgX1N0bE1zZ19EQkFfU0laRV9NSVNNQVRDSCAgICAsCisgIF9TdGxNc2dfREJBX1VOREVSUlVOICAgICAgICAgLAorICBfU3RsTXNnX0RCQV9PVkVSUlVOICAgICAgICAgICwKKyAgLy8gYXV0b19wdHIgbWVzc2FnZXMKKyAgX1N0bE1zZ19BVVRPX1BUUl9OVUxMICAgICwKKyAgLy9NZW1vcnkgYWxpZ25lbnQgbWVzc2FnZQorICBfU3RsTXNnX1dST05HX01FTU9SWV9BTElHTk1FTlQsCisgIF9TdGxNc2dfVU5LTk9XTgorICAvKiBfU3RsTXNnX01BWCAqLworfTsKKworLyogaGF2ZSB0byBoYXJkY29kZSB0aGF0IDsoKSAqLworIyAgZGVmaW5lIF9TdGxNc2dfTUFYIDMxCisKK2NsYXNzIF9fb3duZWRfbGluazsKK2NsYXNzIF9fb3duZWRfbGlzdDsKKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfREVCVUdfTU9ERV9USFJPV1MpCisjICAgIGRlZmluZSBfU1RMUF9NRVNTQUdFX05PUkVUVVJOIF9TVExQX0ZVTkNUSU9OX1RIUk9XUworIyAgZWxzZQorIyAgICBkZWZpbmUgX1NUTFBfTUVTU0FHRV9OT1JFVFVSTgorIyAgZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9EdW1teT4KK2NsYXNzIF9fc3RsX2RlYnVnX2VuZ2luZSB7CitwdWJsaWM6CisgIC8vIEJhc2ljIHJvdXRpbmUgdG8gcmVwb3J0IGFueSBkZWJ1ZyBtZXNzYWdlCisgIC8vIFVzZSBfU1RMUF9ERUJVR19NRVNTQUdFIHRvIG92ZXJyaWRlCisgIHN0YXRpYyB2b2lkIF9TVExQX01FU1NBR0VfTk9SRVRVUk4gX1NUTFBfQ0FMTCBfTWVzc2FnZShjb25zdCBjaGFyICogZm9ybWF0X3N0ciwgLi4uKTsKKworICAvLyBNaWNzZWxsYW5vdXMgZnVuY3Rpb24gdG8gcmVwb3J0IGluZGV4ZWQgZXJyb3IgbWVzc2FnZQorICBzdGF0aWMgdm9pZCBfU1RMUF9DQUxMICBfSW5kZXhlZEVycm9yKGludCBfX2luZCwgY29uc3QgY2hhciogX19mLCBpbnQgX19sKTsKKworICAvLyBCYXNpYyBhc3NlcnRpb24gcmVwb3J0IG1lY2hhbmlzbS4KKyAgLy8gUmVwb3J0cyBmYWlsZWQgYXNzZXJ0aW9uIHZpYSBfX3N0bF9kZWJ1Z19tZXNzYWdlIGFuZCBjYWxscyBfVGVybWluYXRlCisgIC8vIGlmIF9TVExQX0RFQlVHX1RFUk1JTkFURSBpcyBzcGVjaWZpZWQsIGNhbGxzIF9fc3RsX2RlYnVnX3Rlcm1pbmF0ZSBpbnN0ZWFkCisgIHN0YXRpYyB2b2lkIF9TVExQX0NBTEwgIF9Bc3NlcnQoY29uc3QgY2hhciogX19leHByLCBjb25zdCBjaGFyKiBfX2YsIGludCBfX2wpOworCisgIC8vIFRoZSBzYW1lLCB3aXRoIGFkZGl0aW9uYWwgZGlhZ25vc3RpY3MKKyAgc3RhdGljIHZvaWQgX1NUTFBfQ0FMTCAgX1ZlcmJvc2VBc3NlcnQoY29uc3QgY2hhciogX19leHByLCBpbnQgX19lcnJvcl9pbmQsIGNvbnN0IGNoYXIqIF9fZiwgaW50IF9fbCk7CisKKyAgLy8gSWYgZXhjZXB0aW9ucyBhcmUgcHJlc2VudCwgc2VuZHMgdW5pcXVlIGV4Y2VwdGlvbgorICAvLyBJZiBub3QsIGNhbGxzIF9TVExQX0FCT1JUKCkgdG8gdGVybWluYXRlCisgIC8vIFVzZSBfU1RMUF9ERUJVR19URVJNSU5BVEUgdG8gb3ZlcnJpZGUKKyAgc3RhdGljIHZvaWQgX1NUTFBfQ0FMTCAgX1Rlcm1pbmF0ZSgpOworCisjICBpZiBkZWZpbmVkIChfU1RMUF9ERUJVRykKKyAgLy8gb3duZWRfbGlzdC9saW5rIGRlbGVnYXRlIG5vbi1pbmxpbmUgZnVuY3Rpb25zIGhlcmUKKworICBzdGF0aWMgYm9vbCBfU1RMUF9DQUxMICBfQ2hlY2tfc2FtZV9vd25lciggY29uc3QgX19vd25lZF9saW5rJiBfX2kxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19vd25lZF9saW5rJiBfX2kyKTsKKyAgc3RhdGljIGJvb2wgX1NUTFBfQ0FMTCAgX0NoZWNrX3NhbWVfb3JfbnVsbF9vd25lciggY29uc3QgX19vd25lZF9saW5rJiBfX2kxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX293bmVkX2xpbmsmIF9faTIpOworICBzdGF0aWMgYm9vbCBfU1RMUF9DQUxMICBfQ2hlY2tfaWZfb3duZXIoIGNvbnN0IF9fb3duZWRfbGlzdCosIGNvbnN0IF9fb3duZWRfbGluayYpOworCisgIHN0YXRpYyBib29sIF9TVExQX0NBTEwgIF9DaGVja19pZl9ub3Rfb3duZXIoIGNvbnN0IF9fb3duZWRfbGlzdCosIGNvbnN0IF9fb3duZWRfbGluayYpOworCisgIHN0YXRpYyB2b2lkIF9TVExQX0NBTEwgIF9WZXJpZnkoY29uc3QgX19vd25lZF9saXN0Kik7CisKKyAgc3RhdGljIHZvaWQgX1NUTFBfQ0FMTCAgX1N3YXBfb3duZXJzKF9fb3duZWRfbGlzdCYsIF9fb3duZWRfbGlzdCYpOworCisgIHN0YXRpYyB2b2lkIF9TVExQX0NBTEwgIF9JbnZhbGlkYXRlX2FsbChfX293bmVkX2xpc3QqKTsKKworICBzdGF0aWMgdm9pZCBfU1RMUF9DQUxMICBfU2V0X293bmVyKF9fb3duZWRfbGlzdCYgLypzcmMqLywgX19vd25lZF9saXN0JiAvKmRzdCovKTsKKworICBzdGF0aWMgdm9pZCBfU1RMUF9DQUxMICBfU3RhbXBfYWxsKF9fb3duZWRfbGlzdCosIF9fb3duZWRfbGlzdCopOworCisgIHN0YXRpYyB2b2lkIF9TVExQX0NBTEwgIF9NX2RldGFjaChfX293bmVkX2xpc3QqLCBfX293bmVkX2xpbmsqKTsKKworICBzdGF0aWMgdm9pZCBfU1RMUF9DQUxMICBfTV9hdHRhY2goX19vd25lZF9saXN0KiwgX19vd25lZF9saW5rKik7CisKKyAgLy8gYWNjZXNzb3IgOiBjaGVjayBhbmQgZ2V0IHBvaW50ZXIgdG8gdGhlIGNvbnRhaW5lcgorICBzdGF0aWMgdm9pZCogX1NUTFBfQ0FMTCAgX0dldF9jb250YWluZXJfcHRyKGNvbnN0IF9fb3duZWRfbGluayopOworIyAgZW5kaWYKKworICAvLyBkZWJ1ZyBtZXNzYWdlcyBhbmQgZm9ybWF0cworICBzdGF0aWMgY29uc3QgY2hhciogX01lc3NhZ2VfdGFibGVbX1N0bE1zZ19NQVhdOworfTsKKworIyAgdW5kZWYgX1NUTFBfTUVTU0FHRV9OT1JFVFVSTgorCisjICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUKQorX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIF9fc3RsX2RlYnVnX2VuZ2luZTxib29sPjsKKyMgIGVuZGlmCisKK3R5cGVkZWYgX19zdGxfZGVidWdfZW5naW5lPGJvb2w+IF9fc3RsX2RlYnVnZ2VyOworCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjICBpZiAhZGVmaW5lZCAoX1NUTFBfQVNTRVJUKQorIyAgICBkZWZpbmUgX1NUTFBfQVNTRVJUKGV4cHIpIFwKKyAgICAgICBpZiAoIShleHByKSkgeyBfU1RMUF9QUklWIF9fc3RsX2RlYnVnZ2VyOjpfQXNzZXJ0KCAjIGV4cHIsIF9TVExQX0ZJTEVfXywgX19MSU5FX18pOyB9CisjICBlbmRpZgorCisjZWxzZQorIyAgZGVmaW5lIF9TVExQX0FTU0VSVChleHByKQorI2VuZGlmCisKKy8vIHRoaXMgc2VjdGlvbiBpcyBmb3IgX1NUTFBfREVCVUcgb25seQorI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHKQorCisjICBpZiAhZGVmaW5lZCAoX1NUTFBfVkVSQk9TRV9BU1NFUlQpCisvLyBmYnAgOiBuZXcgZm9ybSBub3QgcmVxdWlyaW5nICI7IgorIyAgICBkZWZpbmUgX1NUTFBfVkVSQk9TRV9BU1NFUlQoZXhwciwgX19kaWFnX251bSkgXAorICAgICAgIGlmICghKGV4cHIpKSB7IF9TVExQX1BSSVYgX19zdGxfZGVidWdnZXI6Ol9WZXJib3NlQXNzZXJ0XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggIyBleHByLCAgX1NUTFBfUFJJViBfX2RpYWdfbnVtLCBfU1RMUF9GSUxFX18sIF9fTElORV9fICk7IFwKKyAgICAgICAgICB9CisjICBlbmRpZgorCisjICBkZWZpbmUgX1NUTFBfREVCVUdfQ0hFQ0soZXhwcikgX1NUTFBfQVNTRVJUKGV4cHIpCisKKyMgIGlmIChfU1RMUF9ERUJVR19MRVZFTCA9PSBfU1RMUF9TVEFOREFSRF9EQkdfTEVWRUwpCisjICAgIGRlZmluZSBfU1RMUF9TVERfREVCVUdfQ0hFQ0soZXhwcikgX1NUTFBfREVCVUdfQ0hFQ0soZXhwcikKKyMgIGVsc2UKKyMgICAgZGVmaW5lIF9TVExQX1NURF9ERUJVR19DSEVDSyhleHByKQorIyAgZW5kaWYKKworIyAgaWYgIWRlZmluZWQgKF9TVExQX1ZFUkJPU0VfUkVUVVJOKQorIyAgICBkZWZpbmUgX1NUTFBfVkVSQk9TRV9SRVRVUk4oX19leHByLF9fZGlhZ19udW0pIGlmICghKF9fZXhwcikpIHsgXAorICAgICAgICAgX1NUTFBfUFJJViBfX3N0bF9kZWJ1Z2dlcjo6X0luZGV4ZWRFcnJvcihfX2RpYWdfbnVtLCBfU1RMUF9GSUxFX18gLCBfX0xJTkVfXyk7IFwKKyAgICAgICAgIHJldHVybiBmYWxzZTsgfQorIyAgZW5kaWYKKworIyAgaWYgIWRlZmluZWQgKF9TVExQX1ZFUkJPU0VfUkVUVVJOXzApCisjICAgIGRlZmluZSBfU1RMUF9WRVJCT1NFX1JFVFVSTl8wKF9fZXhwcixfX2RpYWdfbnVtKSBpZiAoIShfX2V4cHIpKSB7IFwKKyAgICAgICAgIF9TVExQX1BSSVYgX19zdGxfZGVidWdnZXI6Ol9JbmRleGVkRXJyb3IoX19kaWFnX251bSwgX1NUTFBfRklMRV9fLCBfX0xJTkVfXyk7IFwKKyAgICAgICAgIHJldHVybiAwOyB9CisjICBlbmRpZgorCisjICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfVEhSRUFEU19ICisjICAgIGluY2x1ZGUgPHN0bC9fdGhyZWFkcy5oPgorIyAgZW5kaWYKKworIyAgaWZuZGVmIF9TVExQX0lOVEVSTkFMX0lURVJBVE9SX0JBU0VfSAorIyAgICBpbmNsdWRlIDxzdGwvX2l0ZXJhdG9yX2Jhc2UuaD4KKyMgIGVuZGlmCisKKyMgIGlmbmRlZiBfU1RMUF9UWVBFX1RSQUlUU19ICisjICAgIGluY2x1ZGUgPHN0bC90eXBlX3RyYWl0cy5oPgorIyAgZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKworLyoKKyAqIFNwZWNpYWwgZGVidWcgaXRlcmF0b3IgdHJhaXRzIGhhdmluZyBhbiBhZGRpdGlvbm5hbCBzdGF0aWMgbWVtYmVyCisgKiBtZXRob2QgX0NoZWNrLiBJdCBpcyB1c2VkIGJ5IHRoZSBzbGlzdCBkZWJ1ZyBpbXBsZW1lbnRhdGlvbiB0byBjaGVjaworICogdGhlIHNwZWNpYWwgYmVmb3JlX2JlZ2luIGl0ZXJhdG9yLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgX1RyYWl0cz4KK3N0cnVjdCBfRGJnVHJhaXRzIDogX1RyYWl0cyB7CisgIHR5cGVkZWYgX0RiZ1RyYWl0czx0eXBlbmFtZSBfVHJhaXRzOjpfQ29uc3RUcmFpdHM+IF9Db25zdFRyYWl0czsKKyAgdHlwZWRlZiBfRGJnVHJhaXRzPHR5cGVuYW1lIF9UcmFpdHM6Ol9Ob25Db25zdFRyYWl0cz4gX05vbkNvbnN0VHJhaXRzOworCisgIHRlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+CisgIHN0YXRpYyBib29sIF9DaGVjayhjb25zdCBfSXRlcmF0b3ImKSB7cmV0dXJuIHRydWU7fQorfTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgoraW5saW5lIGJvb2wgIF9TVExQX0NBTEwgX192YWxpZF9yYW5nZShjb25zdCBfSXRlcmF0b3ImIF9faTEgLGNvbnN0IF9JdGVyYXRvciYgX19pMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcmKQoreyByZXR1cm4gKF9faTEgPCBfX2kyKSB8fCAoX19pMSA9PSBfX2kyKTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgoraW5saW5lIGJvb2wgIF9TVExQX0NBTEwgX192YWxpZF9yYW5nZShjb25zdCBfSXRlcmF0b3ImIF9faTEgLGNvbnN0IF9JdGVyYXRvciYgX19pMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcmKSB7CisgIC8vIGNoZWNrIGlmIGNvbXBhcmFibGUKKyAgYm9vbCBfX2R1bW15KF9faTE9PV9faTIpOworICByZXR1cm4gKF9fZHVtbXk9PV9fZHVtbXkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgoraW5saW5lIGJvb2wgIF9TVExQX0NBTEwgX192YWxpZF9yYW5nZShjb25zdCBfSXRlcmF0b3ImIF9faTEgLGNvbnN0IF9JdGVyYXRvciYgX19pMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9yd2FyZF9pdGVyYXRvcl90YWcmKSB7CisgIC8vIGNoZWNrIGlmIGNvbXBhcmFibGUKKyAgYm9vbCBfX2R1bW15KF9faTE9PV9faTIpOworICByZXR1cm4gKF9fZHVtbXk9PV9fZHVtbXkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgoraW5saW5lIGJvb2wgIF9TVExQX0NBTEwgX192YWxpZF9yYW5nZShjb25zdCBfSXRlcmF0b3ImLGNvbnN0IF9JdGVyYXRvciYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0X2l0ZXJhdG9yX3RhZyYpCit7IHJldHVybiB0cnVlOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+CitpbmxpbmUgYm9vbCAgX1NUTFBfQ0FMTCBfX3ZhbGlkX3JhbmdlKGNvbnN0IF9JdGVyYXRvciYsY29uc3QgX0l0ZXJhdG9yJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3V0cHV0X2l0ZXJhdG9yX3RhZyYpCit7IHJldHVybiB0cnVlOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMIF9fdmFsaWRfcmFuZ2UoY29uc3QgX0l0ZXJhdG9yJiBfX2kxLCBjb25zdCBfSXRlcmF0b3ImIF9faTIpCit7IHJldHVybiBfX3ZhbGlkX3JhbmdlKF9faTEsX19pMixfU1RMUF9JVEVSQVRPUl9DQVRFR09SWShfX2kxLCBfSXRlcmF0b3IpKTsgfQorCisvLyBOb3RlIDogdGhhdCBtZWFucyBpbiByYW5nZSBbaTEsIGkyXS4KK3RlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+CitpbmxpbmUgYm9vbCAgX1NUTFBfQ0FMTCBzdGxwX2luX3JhbmdlKGNvbnN0IF9JdGVyYXRvciYgX0l0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfSXRlcmF0b3ImIF9faTEsIGNvbnN0IF9JdGVyYXRvciYgX19pMikKK3sgcmV0dXJuIF9fdmFsaWRfcmFuZ2UoX19pMSxfSXQpICYmIF9fdmFsaWRfcmFuZ2UoX0l0LF9faTIpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+CitpbmxpbmUgYm9vbCAgX1NUTFBfQ0FMTCBzdGxwX2luX3JhbmdlKGNvbnN0IF9JdGVyYXRvciYgX19maXJzdCwgY29uc3QgX0l0ZXJhdG9yJiBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9JdGVyYXRvciYgX19zdGFydCwgY29uc3QgX0l0ZXJhdG9yJiBfX2ZpbmlzaCkKK3sgcmV0dXJuIF9fdmFsaWRfcmFuZ2UoX19maXJzdCxfX2xhc3QpICYmIF9fdmFsaWRfcmFuZ2UoX19zdGFydCxfX2ZpcnN0KSAmJiBfX3ZhbGlkX3JhbmdlKF9fbGFzdCxfX2ZpbmlzaCk7IH0KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBfX293bmVkX2xpbmsgeworcHVibGljOgorICAvLyBOb3RlOiBUaGlzIGFuZCB0aGUgZm9sbG93aW5nIHNwZWNpYWwgZGVmaW5lcyBmb3IgY29tcGlsaW5nIHVuZGVyIFdpbmRvd3MgQ0UgdW5kZXIgQVJNCisgIC8vIGlzIG5lZWRlZCBmb3IgY29ycmVjdGx5IHVzaW5nIF9TVExQX0RFQlVHIG1vZGUuIFRoaXMgY29tZXMgZnJvbSBhIGJ1ZyBpbiB0aGUgQVJNCisgIC8vIGNvbXBpbGVyIHdoZXJlIGNoZWNrZWQgaXRlcmF0b3JzIHRoYXQgYXJlIHBhc3NlZCBieSB2YWx1ZSBjYWxsIF9NX2F0dGFjaCB3aXRoIHRoZSB3cm9uZworICAvLyB0aGlzIHBvaW50ZXIgYW5kIGNhbGxpbmcgX01fZGV0YWNoIGNhbid0IGZpbmQgdGhlIGNvcnJlY3QgcG9pbnRlciB0byB0aGUgX19vd25lZF9saW5rLgorICAvLyBUaGlzIGlzIGNpcmN1bXZlbnRlZCBieSBtYW5hZ2luZyBhIF9NX3NlbGYgcG9pbnRlciB0aGF0IHBvaW50cyB0byB0aGUgY29ycmVjdCB2YWx1ZS4KKyAgLy8gVWdseSBidXQgd29ya3MuCisjaWYgZGVmaW5lZChfU1RMUF9XQ0UpICYmIGRlZmluZWQoX0FSTV8pCisgIF9fb3duZWRfbGluaygpIDogX01fc2VsZih0aGlzKSwgX01fb3duZXIoMCkge30KKyAgX19vd25lZF9saW5rKGNvbnN0IF9fb3duZWRfbGlzdCogX19jKSA6IF9NX3NlbGYodGhpcyksIF9NX293bmVyKDApLCBfTV9uZXh0KDApCisgIHsgX19zdGxfZGVidWdnZXI6Ol9NX2F0dGFjaChfX0NPTlNUX0NBU1QoX19vd25lZF9saXN0KixfX2MpLCB0aGlzKTsgfQorICBfX293bmVkX2xpbmsoY29uc3QgX19vd25lZF9saW5rJiBfX3Jocyk6IF9NX3NlbGYodGhpcyksIF9NX293bmVyKDApCisgIHsgX19zdGxfZGVidWdnZXI6Ol9NX2F0dGFjaChfX0NPTlNUX0NBU1QoX19vd25lZF9saXN0KixfX3Jocy5fTV9vd25lciksIHRoaXMpOyB9CisjZWxzZQorICBfX293bmVkX2xpbmsoKSA6IF9NX293bmVyKDApIHt9CisgIF9fb3duZWRfbGluayhjb25zdCBfX293bmVkX2xpc3QqIF9fYykgOiBfTV9vd25lcigwKSwgX01fbmV4dCgwKQorICB7IF9fc3RsX2RlYnVnZ2VyOjpfTV9hdHRhY2goX19DT05TVF9DQVNUKF9fb3duZWRfbGlzdCosX19jKSwgdGhpcyk7IH0KKyAgX19vd25lZF9saW5rKGNvbnN0IF9fb3duZWRfbGluayYgX19yaHMpOiBfTV9vd25lcigwKQorICB7IF9fc3RsX2RlYnVnZ2VyOjpfTV9hdHRhY2goX19DT05TVF9DQVNUKF9fb3duZWRfbGlzdCosX19yaHMuX01fb3duZXIpLCB0aGlzKTsgfQorI2VuZGlmCisgIF9fb3duZWRfbGluayYgb3BlcmF0b3I9KGNvbnN0IF9fb3duZWRfbGluayYgX19yaHMpIHsKKyAgICBfX293bmVkX2xpc3QqIF9fbmV3X293bmVyID0gX19DT05TVF9DQVNUKF9fb3duZWRfbGlzdCosX19yaHMuX01fb3duZXIpOworICAgIF9fb3duZWRfbGlzdCogX19vbGRfb3duZXIgPSBfTV9vd25lcjsKKyAgICBpZiAoIF9fb2xkX293bmVyICE9IF9fbmV3X293bmVyICkgeworICAgICAgX19zdGxfZGVidWdnZXI6Ol9NX2RldGFjaChfX29sZF9vd25lciwgdGhpcyk7CisgICAgICBfX3N0bF9kZWJ1Z2dlcjo6X01fYXR0YWNoKF9fbmV3X293bmVyLCB0aGlzKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisjaWYgZGVmaW5lZChfU1RMUF9XQ0UpICYmIGRlZmluZWQoX0FSTV8pCisgIH5fX293bmVkX2xpbmsoKSB7CisgICAgX19zdGxfZGVidWdnZXI6Ol9NX2RldGFjaChfTV9vd25lciwgX01fc2VsZik7CisgICAgX0ludmFsaWRhdGUoKTsKKyAgfQorI2Vsc2UKKyAgfl9fb3duZWRfbGluaygpIHsKKyAgICBfX3N0bF9kZWJ1Z2dlcjo6X01fZGV0YWNoKF9NX293bmVyLCB0aGlzKTsKKyAgICBfSW52YWxpZGF0ZSgpOworICB9CisjZW5kaWYKKworICBjb25zdCBfX293bmVkX2xpc3QqIF9Pd25lcigpIGNvbnN0IHsgcmV0dXJuIF9NX293bmVyOyB9CisgIF9fb3duZWRfbGlzdCogX093bmVyKCkgeyByZXR1cm4gX01fb3duZXI7IH0KKyAgdm9pZCBfU2V0X293bmVyKGNvbnN0IF9fb3duZWRfbGlzdCogX19vKSB7IF9NX293bmVyPSBfX0NPTlNUX0NBU1QoX19vd25lZF9saXN0KixfX28pOyB9CisgIGJvb2wgX1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gX01fb3duZXIgIT0gMDsgfQorICB2b2lkIF9JbnZhbGlkYXRlKCkgeyBfTV9vd25lciA9IDA7IF9NX25leHQgPSAwOyB9CisgIHZvaWQgX0xpbmtfdG9fc2VsZigpIHsgX01fbmV4dCA9IDA7IH0KKworICBfX293bmVkX2xpbmsqIF9OZXh0KCkgeyByZXR1cm4gX01fbmV4dDsgfQorICBjb25zdCBfX293bmVkX2xpbmsqIF9OZXh0KCkgY29uc3QgeyByZXR1cm4gX01fbmV4dDsgfQorCitwdWJsaWM6CisjaWYgZGVmaW5lZChfU1RMUF9XQ0UpICYmIGRlZmluZWQoX0FSTV8pCisgIF9fb3duZWRfbGluayogX01fc2VsZjsKKyNlbmRpZgorCisgIF9fb3duZWRfbGlzdCogX01fb3duZXI7CisgIF9fb3duZWRfbGluayogX01fbmV4dDsKK307CisKKworY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgX19vd25lZF9saXN0IHsKK3B1YmxpYzoKKyAgX19vd25lZF9saXN0KHZvaWQqIF9fbykgeworICAgIC8vICAgIGZwcmludGYoc3RkZXJyLCAiX19vd25lZF9saXN0KCk6ICVwXG4iLCh2b2lkKil0aGlzKTsKKyAgICBfTV9ub2RlLl9NX293bmVyID0gX19SRUlOVEVSUFJFVF9DQVNUKF9fb3duZWRfbGlzdCosX19vKTsKKyAgICBfTV9ub2RlLl9NX25leHQgPSAwOworICB9CisgIH5fX293bmVkX2xpc3QoKSB7CisgICAgLy8gICAgZnByaW50ZihzdGRlcnIsICJ+X19vd25lZF9saXN0KCk6ICVwXG4iLCh2b2lkKil0aGlzKTsKKyAgICBfSW52YWxpZGF0ZV9hbGwoKTsKKyAgICAvLyB0aGF0IHByZXZlbnRzIGRldGFjaAorICAgIF9NX25vZGUuX0ludmFsaWRhdGUoKTsKKyAgfQorICBjb25zdCB2b2lkKiBfT3duZXIoKSBjb25zdCB7IHJldHVybiAoY29uc3Qgdm9pZCopX01fbm9kZS5fTV9vd25lcjsgfQorICB2b2lkKiBfT3duZXIoKSB7IHJldHVybiAodm9pZCopX01fbm9kZS5fTV9vd25lcjsgfQorICBib29sICBfVmFsaWQoKSBjb25zdCB7IHJldHVybiBfTV9ub2RlLl9NX293bmVyICE9IDA7IH0KKyAgdm9pZCBfSW52YWxpZGF0ZSgpIHsgX01fbm9kZS5fTV9vd25lciA9IDA7IH0KKworICBfX293bmVkX2xpbmsqIF9GaXJzdCgpIHsgcmV0dXJuIF9NX25vZGUuX05leHQoKTsgfQorICBfX293bmVkX2xpbmsqIF9MYXN0KCkgeyByZXR1cm4gMCA7IH0KKworICBjb25zdCBfX293bmVkX2xpbmsqIF9GaXJzdCgpIGNvbnN0IHsgcmV0dXJuIChfX293bmVkX2xpbmsqKV9NX25vZGUuX01fbmV4dDsgfQorICBjb25zdCBfX293bmVkX2xpbmsqIF9MYXN0KCkgY29uc3QgeyByZXR1cm4gMCA7fQorCisgIHZvaWQgX1ZlcmlmeSgpIGNvbnN0IHsgX19zdGxfZGVidWdnZXI6Ol9WZXJpZnkodGhpcyk7IH0KKyAgdm9pZCBfU3dhcF9vd25lcnMoX19vd25lZF9saXN0JiBfX3kpIHsgX19zdGxfZGVidWdnZXI6Ol9Td2FwX293bmVycygqdGhpcywgX195KTsgfQorICB2b2lkIF9JbnZhbGlkYXRlX2FsbCgpIHsgX19zdGxfZGVidWdnZXI6Ol9JbnZhbGlkYXRlX2FsbCh0aGlzKTsgfQorICB2b2lkIF9TZXRfb3duZXIoX19vd25lZF9saXN0JiBfX3kpIHsgX19zdGxfZGVidWdnZXI6Ol9TZXRfb3duZXIoKnRoaXMsIF9feSk7IH0KKworICBtdXRhYmxlIF9fb3duZWRfbGluayBfTV9ub2RlOworICBtdXRhYmxlIF9TVExQX211dGV4ICBfTV9sb2NrOworCitwcml2YXRlOgorICAvLyBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkLCBzaG91bGQgYmUgbGVmdCBub3QgaW1wbGVtZW50ZWQsCisgIC8vIGJ1dCBzb21lIGNvbXBpbGVycyBjb21wbGFpbiBhYm91dCBpdCA7KAorICBfX293bmVkX2xpc3QoY29uc3QgX19vd25lZF9saXN0Jil7fQorICBfX293bmVkX2xpc3QmIG9wZXJhdG9yID0gKGNvbnN0IF9fb3duZWRfbGlzdCYpIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgZnJpZW5kIGNsYXNzIF9fb3duZWRfbGluazsKKyAgZnJpZW5kIGNsYXNzIF9fc3RsX2RlYnVnX2VuZ2luZTxib29sPjsKK307CisKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIGZvcndhcmQgZGVjbGFyYXRpb2lucworCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgorYm9vbCBfU1RMUF9DQUxMIF9fY2hlY2tfcmFuZ2UoY29uc3QgX0l0ZXJhdG9yJiwgY29uc3QgX0l0ZXJhdG9yJik7Cit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgorYm9vbCBfU1RMUF9DQUxMIF9fY2hlY2tfcmFuZ2UoY29uc3QgX0l0ZXJhdG9yJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9JdGVyYXRvciYsIGNvbnN0IF9JdGVyYXRvciYpOwordGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KK2Jvb2wgX1NUTFBfQ0FMTCBfX2NoZWNrX3JhbmdlKGNvbnN0IF9JdGVyYXRvciYsIGNvbnN0IF9JdGVyYXRvciYgLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0l0ZXJhdG9yJiwgY29uc3QgX0l0ZXJhdG9yJiApOwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2Jvb2wgX1NUTFBfQ0FMTCBfX2NoZWNrX3B0cl9yYW5nZShjb25zdCBfVHAqLCBjb25zdCBfVHAqKTsKKwordGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KK3ZvaWQgX1NUTFBfQ0FMTCBfX2ludmFsaWRhdGVfcmFuZ2UoY29uc3QgX19vd25lZF9saXN0KiBfX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9JdGVyYXRvciYgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0l0ZXJhdG9yJiBfX2xhc3QpOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgordm9pZCBfU1RMUF9DQUxMIF9faW52YWxpZGF0ZV9pdGVyYXRvcihjb25zdCBfX293bmVkX2xpc3QqIF9fYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0l0ZXJhdG9yJiBfX2l0KTsKKwordGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KK3ZvaWQgX1NUTFBfQ0FMTCBfX2NoYW5nZV9yYW5nZV9vd25lcihjb25zdCBfSXRlcmF0b3ImIF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0l0ZXJhdG9yJiBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19vd25lZF9saXN0KiBfX2RzdCk7CisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+Cit2b2lkICBfU1RMUF9DQUxMIF9fY2hhbmdlX2l0ZV9vd25lcihjb25zdCBfSXRlcmF0b3ImIF9faXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX293bmVkX2xpc3QqIF9fZHN0KTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK2lubGluZSBib29sIF9TVExQX0NBTEwKK19fY2hlY2tfc2FtZV9vd25lcihjb25zdCBfX293bmVkX2xpbmsmIF9faTEsIGNvbnN0IF9fb3duZWRfbGluayYgX19pMikKK3sgcmV0dXJuIF9fc3RsX2RlYnVnZ2VyOjpfQ2hlY2tfc2FtZV9vd25lcihfX2kxLF9faTIpOyB9CisKK2lubGluZSBib29sIF9TVExQX0NBTEwKK19fY2hlY2tfc2FtZV9vcl9udWxsX293bmVyKGNvbnN0IF9fb3duZWRfbGluayYgX19pMSwgY29uc3QgX19vd25lZF9saW5rJiBfX2kyKQoreyByZXR1cm4gX19zdGxfZGVidWdnZXI6Ol9DaGVja19zYW1lX29yX251bGxfb3duZXIoX19pMSxfX2kyKTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgoraW5saW5lIGJvb2wgX1NUTFBfQ0FMTCAgX19jaGVja19pZl9vd25lciggY29uc3QgX19vd25lZF9saXN0KiBfX293bmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0l0ZXJhdG9yJiBfX2l0KQoreyByZXR1cm4gX19zdGxfZGVidWdnZXI6Ol9DaGVja19pZl9vd25lcihfX293bmVyLCAoY29uc3QgX19vd25lZF9saW5rJilfX2l0KTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgoraW5saW5lIGJvb2wgX1NUTFBfQ0FMTCBfX2NoZWNrX2lmX25vdF9vd25lciggY29uc3QgX19vd25lZF9saXN0KiBfX293bmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0l0ZXJhdG9yJiBfX2l0KQoreyByZXR1cm4gX19zdGxfZGVidWdnZXI6Ol9DaGVja19pZl9ub3Rfb3duZXIoX19vd25lciwgKGNvbnN0IF9fb3duZWRfbGluayYpX19pdCk7IH0KKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2Vsc2UKKyMgIGRlZmluZSBfU1RMUF9WRVJCT1NFX0FTU0VSVChleHByLCBkaWFnbm9zdGljKQorIyAgZGVmaW5lIF9TVExQX0RFQlVHX0NIRUNLKGV4cHIpCisjZW5kaWYgLyogX1NUTFBfREVCVUcgKi8KKworI2lmIGRlZmluZWQgKF9TVExQX0FTU0VSVElPTlMpCisKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9BU1NFUlRfTVNHX1RSQUlMRVIpCisjICAgIGRlZmluZSBfU1RMUF9BU1NFUlRfTVNHX1RSQUlMRVIKKyMgIGVuZGlmCisKKy8vIGR3YSAxMi8zMC85OCAtIGlmIF9TVExQX0RFQlVHX01FU1NBR0UgaXMgZGVmaW5lZCwgdGhlIHVzZXIgY2FuIHN1cHBseSBvd24gZGVmaW5pdGlvbi4KKyMgIGlmICFkZWZpbmVkIChfU1RMUF9ERUJVR19NRVNTQUdFKQorIyAgICBkZWZpbmUgX19zdGxfZGVidWdfbWVzc2FnZSBfX3N0bF9kZWJ1Z2dlcjo6X01lc3NhZ2UKKyMgIGVsc2UKK2V4dGVybiAgdm9pZCBfX3N0bF9kZWJ1Z19tZXNzYWdlKGNvbnN0IGNoYXIgKiBmb3JtYXRfc3RyLCAuLi4pOworIyAgZW5kaWYKKworLy8gZmJwOiBpZiBfU1RMUF9ERUJVR19URVJNSU5BVEUgaXMgZGVmaW5lZCwgdGhlIHVzZXIgY2FuIHN1cHBseSBvd24gZGVmaW5pdGlvbi4KKyMgIGlmICFkZWZpbmVkIChfU1RMUF9ERUJVR19URVJNSU5BVEUpCisjICAgIGRlZmluZSBfX3N0bF9kZWJ1Z190ZXJtaW5hdGUgX19zdGxfZGVidWdnZXI6Ol9UZXJtaW5hdGUKKyMgIGVsc2UKK2V4dGVybiAgdm9pZCBfX3N0bF9kZWJ1Z190ZXJtaW5hdGUoKTsKKyMgIGVuZGlmCisKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfQVNTRVJUSU9OUykgJiYgIWRlZmluZWQgKF9TVExQX0xJTktfVElNRV9JTlNUQU5USUFUSU9OKQorIyAgaW5jbHVkZSA8c3RsL2RlYnVnL19kZWJ1Zy5jPgorI2VuZGlmCisKKyNlbmRpZiAvKiBERUJVR19IICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9kZWJ1Zy9fZGVxdWUuaCBiL3N0bHBvcnQvc3RsL2RlYnVnL19kZXF1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1YzVmZjUKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9kZWJ1Zy9fZGVxdWUuaApAQCAtMCwwICsxLDQxNCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKy8qIE5PVEU6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIFNUTCBoZWFkZXJzLgorICogICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4KKyAqLworCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0RCR19ERVFVRV9ICisjZGVmaW5lIF9TVExQX0lOVEVSTkFMX0RCR19ERVFVRV9ICisKKyNpZm5kZWYgX1NUTFBfREJHX0lURVJBVE9SX0gKKyMgIGluY2x1ZGUgPHN0bC9kZWJ1Zy9faXRlcmF0b3IuaD4KKyNlbmRpZgorCisjZGVmaW5lIF9TVExQX05PTl9EQkdfREVRVUUgX1NUTFBfUFJJViBfU1RMUF9OT05fREJHX05BTUUoZGVxdWUpIDxfVHAsX0FsbG9jPgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHX1VTRV9ESVNUSU5DVF9WQUxVRV9UWVBFX0hFTFBFUlMpCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgX1RwKiB2YWx1ZV90eXBlKGNvbnN0IF9TVExQX1BSSVYgX0RCR19pdGVyX2Jhc2U8IF9TVExQX05PTl9EQkdfREVRVUUgPiYpCit7IHJldHVybiAoX1RwKikwOyB9Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnkoY29uc3QgX1NUTFBfUFJJViBfREJHX2l0ZXJfYmFzZTwgX1NUTFBfTk9OX0RCR19ERVFVRSA+JikKK3sgcmV0dXJuIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKCk7IH0KKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBfU1RMUF9ERkxfVE1QTF9QQVJBTShfQWxsb2MsIGFsbG9jYXRvcjxfVHA+KSA+CitjbGFzcyBkZXF1ZSA6CisjaWYgIWRlZmluZWQgKF9fRE1DX18pCisgICAgICAgICAgICAgcHJpdmF0ZQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fY29uc3RydWN0X2NoZWNrZXI8X1NUTFBfTk9OX0RCR19ERVFVRSA+CisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKQorICAgICAgICAgICAgLCBwdWJsaWMgX19zdGxwb3J0X2NsYXNzPGRlcXVlPF9UcCwgX0FsbG9jPiA+CisjZW5kaWYKK3sKKyAgdHlwZWRlZiBkZXF1ZTxfVHAsX0FsbG9jPiBfU2VsZjsKKyAgdHlwZWRlZiBfU1RMUF9OT05fREJHX0RFUVVFIF9CYXNlOworICB0eXBlZGVmIF9TVExQX1BSSVYgX19jb25zdHJ1Y3RfY2hlY2tlcjxfU1RMUF9OT05fREJHX0RFUVVFID4gX0NvbnN0cnVjdENoZWNrOworCitwdWJsaWM6CisgIC8vIEJhc2ljIHR5cGVzCisgIF9fSU1QT1JUX0NPTlRBSU5FUl9UWVBFREVGUyhfQmFzZSkKKworICAvLyBJdGVyYXRvcnMKKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9EQkdfaXRlcjxfQmFzZSwgX1NUTFBfUFJJViBfRGJnVHJhaXRzPF9Ob25jb25zdF90cmFpdHM8dmFsdWVfdHlwZT4gPiA+IGl0ZXJhdG9yOworICB0eXBlZGVmIF9TVExQX1BSSVYgX0RCR19pdGVyPF9CYXNlLCBfU1RMUF9QUklWIF9EYmdUcmFpdHM8X0NvbnN0X3RyYWl0czx2YWx1ZV90eXBlPiA+ID4gICAgY29uc3RfaXRlcmF0b3I7CisKKyAgX1NUTFBfREVDTEFSRV9SQU5ET01fQUNDRVNTX1JFVkVSU0VfSVRFUkFUT1JTOworCitwcm90ZWN0ZWQ6CisgIF9CYXNlIF9NX25vbl9kYmdfaW1wbDsKKyAgX1NUTFBfUFJJViBfX293bmVkX2xpc3QgX01faXRlcl9saXN0OworCisgIHZvaWQgX0ludmFsaWRhdGVfYWxsKCkKKyAgeyBfTV9pdGVyX2xpc3QuX0ludmFsaWRhdGVfYWxsKCk7IH0KKyAgdm9pZCBfSW52YWxpZGF0ZV9pdGVyYXRvcihjb25zdCBpdGVyYXRvciYgX19pdCkKKyAgeyBfU1RMUF9QUklWIF9faW52YWxpZGF0ZV9pdGVyYXRvcigmX01faXRlcl9saXN0LF9faXQpOyB9CisgIHZvaWQgX0ludmFsaWRhdGVfaXRlcmF0b3JzKGNvbnN0IGl0ZXJhdG9yJiBfX2ZpcnN0LCBjb25zdCBpdGVyYXRvciYgX19sYXN0KQorICB7IF9TVExQX1BSSVYgX19pbnZhbGlkYXRlX3JhbmdlKCZfTV9pdGVyX2xpc3QsIF9fZmlyc3QsIF9fbGFzdCk7IH0KKworcHVibGljOgorICAvLyBCYXNpYyBhY2Nlc3NvcnMKKyAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5nZXRfYWxsb2NhdG9yKCk7IH0KKworICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5iZWdpbigpKTsgfQorICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBpdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuZW5kKCkpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLmJlZ2luKCkpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5lbmQoKSk7IH0KKworICByZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisgIHJldmVyc2VfaXRlcmF0b3IgcmVuZCgpIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBjb25zdCB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSBjb25zdCB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyAgcmVmZXJlbmNlIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fbikgeworICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKF9fbiA8IHNpemUoKSwgX1N0bE1zZ19PVVRfT0ZfQk9VTkRTKQorICAgIHJldHVybiBfTV9ub25fZGJnX2ltcGxbX19uXTsKKyAgfQorICBjb25zdF9yZWZlcmVuY2Ugb3BlcmF0b3JbXShzaXplX3R5cGUgX19uKSBjb25zdCB7CisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoX19uIDwgc2l6ZSgpLCBfU3RsTXNnX09VVF9PRl9CT1VORFMpCisgICAgcmV0dXJuIF9NX25vbl9kYmdfaW1wbFtfX25dOworICB9CisKKyAgcmVmZXJlbmNlIGF0KHNpemVfdHlwZSBfX24pIHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5hdChfX24pOyB9CisgIGNvbnN0X3JlZmVyZW5jZSBhdChzaXplX3R5cGUgX19uKSBjb25zdCB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwuYXQoX19uKTsgfQorCisgIHJlZmVyZW5jZSBmcm9udCgpIHsKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghZW1wdHkoKSwgX1N0bE1zZ19FTVBUWV9DT05UQUlORVIpCisgICAgcmV0dXJuICpiZWdpbigpOworICB9CisgIGNvbnN0X3JlZmVyZW5jZSBmcm9udCgpIGNvbnN0IHsKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghZW1wdHkoKSwgX1N0bE1zZ19FTVBUWV9DT05UQUlORVIpCisgICAgcmV0dXJuICpiZWdpbigpOworICB9CisgIHJlZmVyZW5jZSBiYWNrKCkgeworICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFlbXB0eSgpLCBfU3RsTXNnX0VNUFRZX0NPTlRBSU5FUikKKyAgICByZXR1cm4gKigtLWVuZCgpKTsKKyAgfQorICBjb25zdF9yZWZlcmVuY2UgYmFjaygpIGNvbnN0IHsKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghZW1wdHkoKSwgX1N0bE1zZ19FTVBUWV9DT05UQUlORVIpCisgICAgcmV0dXJuICooLS1lbmQoKSk7CisgIH0KKworICAvLyBDb25zdHJ1Y3RvciwgZGVzdHJ1Y3Rvci4KKyAgZXhwbGljaXQgZGVxdWUoY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpIDoKKyAgICBfTV9ub25fZGJnX2ltcGwoX19hKSwgX01faXRlcl9saXN0KCZfTV9ub25fZGJnX2ltcGwpIHt9CisgIGRlcXVlKGNvbnN0IF9TZWxmJiBfX3gpIDoKKyAgICBfQ29uc3RydWN0Q2hlY2soX194KSwgX01fbm9uX2RiZ19pbXBsKF9feC5fTV9ub25fZGJnX2ltcGwpLAorICAgIF9NX2l0ZXJfbGlzdCgmX01fbm9uX2RiZ19pbXBsKSB7fQorCisjaWYgIWRlZmluZWQoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKKyAgZXhwbGljaXQgZGVxdWUoc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX194ID0gX1RwKCksCisjZWxzZQorICBkZXF1ZShzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gsCisjZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKi8KKyAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKSA6CisgICAgX01fbm9uX2RiZ19pbXBsKF9fbiwgX194LCBfX2EpLCBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KKyNpZiBkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorICBleHBsaWNpdCBkZXF1ZShzaXplX3R5cGUgX19uKSA6CisgICAgX01fbm9uX2RiZ19pbXBsKF9fbiksIF9NX2l0ZXJfbGlzdCgmX01fbm9uX2RiZ19pbXBsKSB7fQorI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKKyAgZGVxdWUoX19tb3ZlX3NvdXJjZTxfU2VsZj4gc3JjKQorICAgIDogX01fbm9uX2RiZ19pbXBsKF9fbW92ZV9zb3VyY2U8X0Jhc2U+KHNyYy5nZXQoKS5fTV9ub25fZGJnX2ltcGwpKSwKKyAgICAgIF9NX2l0ZXJfbGlzdCgmX01fbm9uX2RiZ19pbXBsKSB7CisjICBpZiBkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKSB8fCAoX1NUTFBfREVCVUdfTEVWRUwgPT0gX1NUTFBfU1RBTkRBUkRfREJHX0xFVkVMKQorICAgIHNyYy5nZXQoKS5fTV9pdGVyX2xpc3QuX0ludmFsaWRhdGVfYWxsKCk7CisjICBlbHNlCisgICAgc3JjLmdldCgpLl9NX2l0ZXJfbGlzdC5fU2V0X293bmVyKF9NX2l0ZXJfbGlzdCk7CisjICBlbmRpZgorICB9CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgZGVxdWUoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hIF9TVExQX0FMTE9DQVRPUl9UWVBFX0RGTCkKKyAgICA6IF9Db25zdHJ1Y3RDaGVjayhfX2ZpcnN0LCBfX2xhc3QpLAorICAgICAgX01fbm9uX2RiZ19pbXBsKF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2ZpcnN0KSwgX1NUTFBfUFJJViBfTm9uX0RiZ19pdGVyKF9fbGFzdCksIF9fYSksCisgICAgICBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkgeworICAgIH0KKyMgIGlmIGRlZmluZWQgKF9TVExQX05FRURTX0VYVFJBX1RFTVBMQVRFX0NPTlNUUlVDVE9SUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICBkZXF1ZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgOiBfQ29uc3RydWN0Q2hlY2soX19maXJzdCwgX19sYXN0KSwKKyAgICAgIF9NX25vbl9kYmdfaW1wbChfU1RMUF9QUklWIF9Ob25fRGJnX2l0ZXIoX19maXJzdCksIF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2xhc3QpKSwKKyAgICAgIF9NX2l0ZXJfbGlzdCgmX01fbm9uX2RiZ19pbXBsKSB7CisgICAgfQorIyAgZW5kaWYKKyNlbHNlCisgIGRlcXVlKGNvbnN0IHZhbHVlX3R5cGUqIF9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbGFzdCwKKyAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfQ29uc3RydWN0Q2hlY2soX19maXJzdCwgX19sYXN0KSwKKyAgICAgIF9NX25vbl9kYmdfaW1wbChfX2ZpcnN0LCBfX2xhc3QsIF9fYSksCisgICAgICBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkgeworICAgIH0KKworICBkZXF1ZShjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QsCisgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX0NvbnN0cnVjdENoZWNrKF9fZmlyc3QsIF9fbGFzdCksCisgICAgICBfTV9ub25fZGJnX2ltcGwoX19maXJzdC5fTV9pdGVyYXRvciwgX19sYXN0Ll9NX2l0ZXJhdG9yLCBfX2EpLAorICAgICAgX01faXRlcl9saXN0KCZfTV9ub25fZGJnX2ltcGwpIHsKKyAgICB9CisjZW5kaWYKKworICBfU2VsZiYgb3BlcmF0b3I9KGNvbnN0IF9TZWxmJiBfX3gpIHsKKyAgICBpZiAodGhpcyAhPSAmX194KSB7CisgICAgICBfSW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIF9NX25vbl9kYmdfaW1wbCA9IF9feC5fTV9ub25fZGJnX2ltcGw7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwuZW1wdHkoKTsgfQorICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5zaXplKCk7IH0KKyAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLm1heF9zaXplKCk7IH0KKworICB2b2lkIHN3YXAoX1NlbGYmIF9feCkgeworICAgIF9NX2l0ZXJfbGlzdC5fU3dhcF9vd25lcnMoX194Ll9NX2l0ZXJfbGlzdCk7CisgICAgX01fbm9uX2RiZ19pbXBsLnN3YXAoX194Ll9NX25vbl9kYmdfaW1wbCk7CisgIH0KKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUEFSVElBTF9TUEVDX1dPUktBUk9VTkQpICYmICFkZWZpbmVkIChfU1RMUF9GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIpCisgIHZvaWQgX01fc3dhcF93b3JrYXJvdW5kKF9TZWxmJiBfX3gpIHsgc3dhcChfX3gpOyB9CisjZW5kaWYKKworcHVibGljOgorICB2b2lkIGFzc2lnbihzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9fdmFsKSB7CisgICAgX0ludmFsaWRhdGVfYWxsKCk7CisgICAgX01fbm9uX2RiZ19pbXBsLmFzc2lnbihfX24sIF9fdmFsKTsKKyAgfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICB2b2lkIGFzc2lnbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpIHsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKKyAgICBfSW52YWxpZGF0ZV9hbGwoKTsKKyAgICBfTV9ub25fZGJnX2ltcGwuYXNzaWduKF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2ZpcnN0KSwgX1NUTFBfUFJJViBfTm9uX0RiZ19pdGVyKF9fbGFzdCkpOworICB9CisjZWxzZQorICB2b2lkIGFzc2lnbihjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpIHsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKKyAgICBfSW52YWxpZGF0ZV9hbGwoKTsKKyAgICBfTV9ub25fZGJnX2ltcGwuYXNzaWduKF9fZmlyc3QuX01faXRlcmF0b3IsIF9fbGFzdC5fTV9pdGVyYXRvcik7CisgIH0KKyAgdm9pZCBhc3NpZ24oY29uc3QgdmFsdWVfdHlwZSAqX19maXJzdCwgY29uc3QgdmFsdWVfdHlwZSAqX19sYXN0KSB7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3B0cl9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICAgIF9JbnZhbGlkYXRlX2FsbCgpOworICAgIF9NX25vbl9kYmdfaW1wbC5hc3NpZ24oX19maXJzdCwgX19sYXN0KTsKKyAgfQorI2VuZGlmCisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHVzaF8qIGFuZCBwb3BfKgorCisjaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pICYmICFkZWZpbmVkIChfU1RMUF9OT19BTkFDSFJPTklTTVMpCisgIHZvaWQgcHVzaF9iYWNrKGNvbnN0IHZhbHVlX3R5cGUmIF9fdCA9IF9UcCgpKSB7CisjZWxzZQorICB2b2lkIHB1c2hfYmFjayhjb25zdCB2YWx1ZV90eXBlJiBfX3QpIHsKKyNlbmRpZgorICAgIF9JbnZhbGlkYXRlX2FsbCgpOworICAgIF9NX25vbl9kYmdfaW1wbC5wdXNoX2JhY2soX190KTsKKyAgfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkgJiYgIWRlZmluZWQgKF9TVExQX05PX0FOQUNIUk9OSVNNUykKKyAgdm9pZCBwdXNoX2JhY2soKSB7CisgICAgX0ludmFsaWRhdGVfYWxsKCk7CisgICAgX01fbm9uX2RiZ19pbXBsLnB1c2hfYmFjaygpOworICB9CisjZW5kaWYKKworI2lmICFkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fQU5BQ0hST05JU01TKQorICB2b2lkIHB1c2hfZnJvbnQoY29uc3QgdmFsdWVfdHlwZSYgX190ID0gX1RwKCkpIHsKKyNlbHNlCisgIHZvaWQgcHVzaF9mcm9udChjb25zdCB2YWx1ZV90eXBlJiBfX3QpIHsKKyNlbmRpZgorICAgIF9JbnZhbGlkYXRlX2FsbCgpOworICAgIF9NX25vbl9kYmdfaW1wbC5wdXNoX2Zyb250KF9fdCk7CisgIH0KKworI2lmIGRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pICYmICFkZWZpbmVkIChfU1RMUF9OT19BTkFDSFJPTklTTVMpCisgIHZvaWQgcHVzaF9mcm9udCgpIHsKKyAgICBfSW52YWxpZGF0ZV9hbGwoKTsKKyAgICBfTV9ub25fZGJnX2ltcGwucHVzaF9mcm9udCgpOworICB9CisjZW5kaWYKKworICB2b2lkIHBvcF9iYWNrKCkgeworICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFlbXB0eSgpLCBfU3RsTXNnX0VNUFRZX0NPTlRBSU5FUikKKyAgICBfSW52YWxpZGF0ZV9pdGVyYXRvcihlbmQoKSk7CisgICAgX01fbm9uX2RiZ19pbXBsLnBvcF9iYWNrKCk7CisgIH0KKworICB2b2lkIHBvcF9mcm9udCgpIHsKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghZW1wdHkoKSwgX1N0bE1zZ19FTVBUWV9DT05UQUlORVIpCisgICAgX0ludmFsaWRhdGVfaXRlcmF0b3IoYmVnaW4oKSk7CisgICAgX01fbm9uX2RiZ19pbXBsLnBvcF9mcm9udCgpOworICB9CisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5zZXJ0CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkgJiYgIWRlZmluZWQgKF9TVExQX05PX0FOQUNIUk9OSVNNUykKKyAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ggPSBfVHAoKSkgeworI2Vsc2UKKyAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpIHsKKyNlbmRpZgorICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LCBfX3BvcykpCisgICAgX0ludmFsaWRhdGVfYWxsKCk7CisgICAgcmV0dXJuIGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5pbnNlcnQoX19wb3MuX01faXRlcmF0b3IsIF9feCkpOworICB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fQU5BQ0hST05JU01TKQorICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgX19wb3MpIHsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfb3duZXIoJl9NX2l0ZXJfbGlzdCwgX19wb3MpKQorICAgIF9JbnZhbGlkYXRlX2FsbCgpOworICAgIHJldHVybiBpdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0KF9fcG9zLl9NX2l0ZXJhdG9yKSk7CisgIH0KKyNlbmRpZgorCisgIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpIHsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfb3duZXIoJl9NX2l0ZXJfbGlzdCwgX19wb3MpKQorICAgIGlmIChfX24gIT0gMCkgX0ludmFsaWRhdGVfYWxsKCk7CisgICAgX01fbm9uX2RiZ19pbXBsLmluc2VydChfX3Bvcy5fTV9pdGVyYXRvciwgX19uLCBfX3gpOworICB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpIHsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfb3duZXIoJl9NX2l0ZXJfbGlzdCwgX19wb3MpKQorICAgIC8vIFdlIHBlcmZvcm0gaW52YWxpZGF0ZSBmaXJzdCB0byBkZXRlY3Qgc2VsZiByZWZlcmVuY2luZyBpbiBfX2NoZWNrX3JhbmdlIGFzIF9fZmlyc3QgYW5kIF9fbGFzdAorICAgIC8vIHdpbGwgaGF2ZSBiZWVuIGludmFsaWRhdGVkLgorICAgIGlmIChfX2ZpcnN0ICE9IF9fbGFzdCkgX0ludmFsaWRhdGVfYWxsKCk7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgICAgX01fbm9uX2RiZ19pbXBsLmluc2VydChfX3Bvcy5fTV9pdGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2ZpcnN0KSwgX1NUTFBfUFJJViBfTm9uX0RiZ19pdGVyKF9fbGFzdCkpOworICB9CisjZW5kaWYKKworI2lmICFkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB2b2lkIGluc2VydChpdGVyYXRvciBfX3BvcywKKyAgICAgICAgICAgICAgY29uc3QgdmFsdWVfdHlwZSogX19maXJzdCwgY29uc3QgdmFsdWVfdHlwZSogX19sYXN0KSB7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX2lmX293bmVyKCZfTV9pdGVyX2xpc3QsIF9fcG9zKSkKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcHRyX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgICAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KSBfSW52YWxpZGF0ZV9hbGwoKTsKKyAgICBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0KF9fcG9zLl9NX2l0ZXJhdG9yLCBfX2ZpcnN0LCBfX2xhc3QpOworICB9CisjZW5kaWYKKworI2lmICFkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKSB8fCAhZGVmaW5lZCAoX1NUTFBfTk9fTUVUSE9EX1NQRUNJQUxJWkFUSU9OKQorICB2b2lkIGluc2VydChpdGVyYXRvciBfX3BvcywKKyAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KSB7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX2lmX293bmVyKCZfTV9pdGVyX2xpc3QsIF9fcG9zKSkKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKKyAgICAvL1NlcXVlbmNlIHJlcXVpcmVtZW50cyAyMy4xLjEgVGFibGUgNjc6CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX2lmX25vdF9vd25lcigmX01faXRlcl9saXN0LCBfX2ZpcnN0KSk7CisgICAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KSBfSW52YWxpZGF0ZV9hbGwoKTsKKyAgICBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0KF9fcG9zLl9NX2l0ZXJhdG9yLCBfX2ZpcnN0Ll9NX2l0ZXJhdG9yLCBfX2xhc3QuX01faXRlcmF0b3IpOworICB9CisKKyAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3MsCisgICAgICAgICAgICAgIGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LCBfX3BvcykpCisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgICAgLy9TZXF1ZW5jZSByZXF1aXJlbWVudHMgMjMuMS4xIFRhYmxlIDY3OgorICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9ub3Rfb3duZXIoJl9NX2l0ZXJfbGlzdCwgX19maXJzdCkpOworICAgIGlmIChfX2ZpcnN0ICE9IF9fbGFzdCkgX0ludmFsaWRhdGVfYWxsKCk7CisgICAgX01fbm9uX2RiZ19pbXBsLmluc2VydChfX3Bvcy5fTV9pdGVyYXRvciwgX19maXJzdC5fTV9pdGVyYXRvciwgX19sYXN0Ll9NX2l0ZXJhdG9yKTsKKyAgfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKKyAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9fbmV3X3NpemUsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCA9IF9UcCgpKSB7CisjZWxzZQorICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgX19uZXdfc2l6ZSwgY29uc3QgdmFsdWVfdHlwZSYgX194KSB7CisjZW5kaWYKKyAgICBpZiAoX19uZXdfc2l6ZSAhPSBzaXplKCkpIHsKKyAgICAgIGlmICgoX19uZXdfc2l6ZSA+IHNpemUoKSkgfHwgKF9fbmV3X3NpemUgPCBzaXplKCkgLSAxKSkKKyAgICAgICAgX0ludmFsaWRhdGVfYWxsKCk7CisgICAgICBlbHNlCisgICAgICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9yKGVuZCgpKTsKKyAgICB9CisgICAgX01fbm9uX2RiZ19pbXBsLnJlc2l6ZShfX25ld19zaXplLCBfX3gpOworICB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgbmV3X3NpemUpIHsgcmVzaXplKG5ld19zaXplLCBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKF9UcCkpOyB9CisjZW5kaWYKKworICAvLyBFcmFzZQorICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBfX3BvcykgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LCBfX3BvcykpCisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfRGVyZWZlcmVuY2VhYmxlKF9fcG9zKSkKKyAgICBpZiAoX19wb3MuX01faXRlcmF0b3IgPT0gX01fbm9uX2RiZ19pbXBsLmJlZ2luKCkpIHsKKyAgICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9yKF9fcG9zKTsKKyAgICB9IGVsc2UgeworICAgICAgdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yIHRtcCA9IC0tKF9NX25vbl9kYmdfaW1wbC5lbmQoKSk7CisgICAgICBpZiAoX19wb3MuX01faXRlcmF0b3IgPT0gdG1wKQorICAgICAgICBfSW52YWxpZGF0ZV9pdGVyYXRvcihfX3Bvcyk7CisgICAgICBlbHNlCisgICAgICAgIF9JbnZhbGlkYXRlX2FsbCgpOworICAgIH0KKyAgICByZXR1cm4gaXRlcmF0b3IgKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5lcmFzZShfX3Bvcy5fTV9pdGVyYXRvcikpOworICB9CisKKyAgaXRlcmF0b3IgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KSB7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCwgYmVnaW4oKSwgZW5kKCkpKQorICAgIGlmICghZW1wdHkoKSkgeworICAgICAgaWYgKF9fZmlyc3QuX01faXRlcmF0b3IgPT0gX01fbm9uX2RiZ19pbXBsLmJlZ2luKCkgfHwKKyAgICAgICAgICBfX2xhc3QuX01faXRlcmF0b3IgPT0gX01fbm9uX2RiZ19pbXBsLmVuZCgpKQorICAgICAgICBfSW52YWxpZGF0ZV9pdGVyYXRvcnMoX19maXJzdCwgX19sYXN0KTsKKyAgICAgIGVsc2UKKyAgICAgICAgX0ludmFsaWRhdGVfYWxsKCk7CisgICAgfQorICAgIHJldHVybiBpdGVyYXRvciAoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLmVyYXNlKF9fZmlyc3QuX01faXRlcmF0b3IsIF9fbGFzdC5fTV9pdGVyYXRvcikpOworICB9CisKKyAgdm9pZCBjbGVhcigpIHsKKyAgICBfSW52YWxpZGF0ZV9hbGwoKTsKKyAgICBfTV9ub25fZGJnX2ltcGwuY2xlYXIoKTsKKyAgfQorfTsKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjdW5kZWYgX1NUTFBfTk9OX0RCR19ERVFVRQorCisjZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfREVRVUVfSCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdGwvZGVidWcvX2hhc2h0YWJsZS5oIGIvc3RscG9ydC9zdGwvZGVidWcvX2hhc2h0YWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyM2Y3ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9kZWJ1Zy9faGFzaHRhYmxlLmgKQEAgLTAsMCArMSwzNDAgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisvKiBOT1RFOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBTVEwgaGVhZGVycy4KKyAqICAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuCisgKi8KKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9EQkdfSEFTSFRBQkxFX0gKKyNkZWZpbmUgX1NUTFBfSU5URVJOQUxfREJHX0hBU0hUQUJMRV9ICisKKy8vIEhhc2h0YWJsZSBjbGFzcywgdXNlZCB0byBpbXBsZW1lbnQgdGhlIGhhc2hlZCBhc3NvY2lhdGl2ZSBjb250YWluZXJzCisvLyBoYXNoX3NldCwgaGFzaF9tYXAsIGhhc2hfbXVsdGlzZXQsIGFuZCBoYXNoX211bHRpbWFwLAorLy8gdW5vcmRlcmVkX3NldCwgdW5vcmRlcmVkX21hcCwgdW5vcmRlcmVkX211bHRpc2V0LCB1bm9yZGVyZWRfbXVsdGltYXAKKworI2lmbmRlZiBfU1RMUF9EQkdfSVRFUkFUT1JfSAorIyAgaW5jbHVkZSA8c3RsL2RlYnVnL19pdGVyYXRvci5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfRXF1YWw+CitjbGFzcyBfRGJnRXF1YWwgeworcHVibGljOgorICBfRGJnRXF1YWwoKSB7fQorICBfRGJnRXF1YWwoY29uc3QgX0VxdWFsJiBfX2VxKSA6IF9NX25vbl9kYmdfZXEoX19lcSkge30KKyAgX0RiZ0VxdWFsKGNvbnN0IF9EYmdFcXVhbCYgX19lcSkgOiBfTV9ub25fZGJnX2VxKF9fZXEuX01fbm9uX2RiZ19lcSkge30KKworI2lmICFkZWZpbmVkIChfU1RMUF9VU0VfQ09OVEFJTkVSU19FWFRFTlNJT04pCisgIGJvb2wgb3BlcmF0b3IgKCkgKGNvbnN0IF9LZXkmIF9fbGhzLCBjb25zdCBfS2V5JiBfX3JocykgY29uc3QKKyNlbHNlCisgIHRlbXBsYXRlIDxjbGFzcyBfS3AxLCBjbGFzcyBfS3AyPgorICBib29sIG9wZXJhdG9yICgpIChjb25zdCBfS3AxJiBfX2xocywgY29uc3QgX0twMiYgX19yaHMpIGNvbnN0CisjZW5kaWYKKyAgICAgIHsKKyNpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX0NPTlRBSU5FUlNfRVhURU5TSU9OKQorICAgICAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVChfTV9ub25fZGJnX2VxKF9fcmhzLCBfX2xocykgPT0gX01fbm9uX2RiZ19lcShfX2xocywgX19yaHMpLCBfU3RsTXNnX0lOVkFMSURfRVFVSVZBTEVOVF9QUkVESUNBVEUpCisjZW5kaWYKKyAgICAgICAgcmV0dXJuIF9NX25vbl9kYmdfZXEoX19saHMsIF9fcmhzKSA/IHRydWUgOiBmYWxzZTsKKyAgICAgIH0KKworICBfRXF1YWwgbm9uX2RiZ19rZXlfZXEoKSBjb25zdCB7IHJldHVybiBfTV9ub25fZGJnX2VxOyB9Citwcml2YXRlOgorICBfRXF1YWwgX01fbm9uX2RiZ19lcTsKK307CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCisjZGVmaW5lIF9TVExQX05PTl9EQkdfSFQgXAorX1NUTFBfUFJJViBfU1RMUF9OT05fREJHX05BTUUoaGFzaHRhYmxlKSA8X1ZhbCwgX0tleSwgX0hGLCBfVHJhaXRzLCBfRXhLLCBfU1RMUF9QUklWIF9EYmdFcXVhbDxfS2V5LCBfRXFLPiwgX0FsbD4KKworI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHX1VTRV9ESVNUSU5DVF9WQUxVRV9UWVBFX0hFTFBFUlMpCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hGLAorICAgICAgICAgIGNsYXNzIF9FeEssIGNsYXNzIF9FcUssIGNsYXNzIF9BbGw+CitpbmxpbmUgX1ZhbCoKK3ZhbHVlX3R5cGUoY29uc3QgX1NUTFBfUFJJViBfREJHX2l0ZXJfYmFzZTwgX1NUTFBfTk9OX0RCR19IVCA+JikKK3sgcmV0dXJuIChfVmFsKikwOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSEYsCisgICAgICAgICAgY2xhc3MgX0V4SywgY2xhc3MgX0VxSywgY2xhc3MgX0FsbD4KK2lubGluZSBmb3J3YXJkX2l0ZXJhdG9yX3RhZworaXRlcmF0b3JfY2F0ZWdvcnkoY29uc3QgX1NUTFBfUFJJViBfREJHX2l0ZXJfYmFzZTwgX1NUTFBfTk9OX0RCR19IVCA+JikKK3sgcmV0dXJuIGZvcndhcmRfaXRlcmF0b3JfdGFnKCk7IH0KKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hGLAorICAgICAgICAgIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9FeEssIGNsYXNzIF9FcUssIGNsYXNzIF9BbGw+CitjbGFzcyBoYXNodGFibGUgeworICB0eXBlZGVmIGhhc2h0YWJsZTxfVmFsLCBfS2V5LCBfSEYsIF9UcmFpdHMsIF9FeEssIF9FcUssIF9BbGw+IF9TZWxmOworICB0eXBlZGVmIF9TVExQX05PTl9EQkdfSFQgX0Jhc2U7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpfTm9uQ29uc3RUcmFpdHMgX05vbkNvbnN0VHJhaXRzOworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6Ol9Db25zdFRyYWl0cyBfQ29uc3RUcmFpdHM7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6X05vbkNvbnN0TG9jYWxUcmFpdHMgX05vbkNvbnN0TG9jYWxUcmFpdHM7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6X0NvbnN0TG9jYWxUcmFpdHMgX0NvbnN0TG9jYWxUcmFpdHM7CisKKyAgX0Jhc2UgX01fbm9uX2RiZ19pbXBsOworICBfU1RMUF9QUklWIF9fb3duZWRfbGlzdCBfTV9pdGVyX2xpc3Q7CisKK3B1YmxpYzoKKyAgdHlwZWRlZiBfS2V5IGtleV90eXBlOworICB0eXBlZGVmIF9IRiBoYXNoZXI7CisgIHR5cGVkZWYgX0VxSyBrZXlfZXF1YWw7CisKKyAgX19JTVBPUlRfQ09OVEFJTkVSX1RZUEVERUZTKF9CYXNlKQorCisgIHR5cGVkZWYgX1NUTFBfUFJJViBfREJHX2l0ZXI8X0Jhc2UsIF9TVExQX1BSSVYgX0RiZ1RyYWl0czxfTm9uQ29uc3RUcmFpdHM+ID4gaXRlcmF0b3I7CisgIHR5cGVkZWYgX1NUTFBfUFJJViBfREJHX2l0ZXI8X0Jhc2UsIF9TVExQX1BSSVYgX0RiZ1RyYWl0czxfQ29uc3RUcmFpdHM+ID4gICAgY29uc3RfaXRlcmF0b3I7CisgIC8vdHlwZWRlZiBfU1RMUF9QUklWIF9EQkdfaXRlcjxfQmFzZSwgX0RiZ1RyYWl0czxfTm9uQ29uc3RMb2NhbFRyYWl0cz4gPiBsb2NhbF9pdGVyYXRvcjsKKyAgdHlwZWRlZiBpdGVyYXRvciBsb2NhbF9pdGVyYXRvcjsKKyAgLy90eXBlZGVmIF9TVExQX1BSSVYgX0RCR19pdGVyPF9CYXNlLCBfRGJnVHJhaXRzPF9Db25zdExvY2FsVHJhaXRzPiA+ICAgIGNvbnN0X2xvY2FsX2l0ZXJhdG9yOworICB0eXBlZGVmIGNvbnN0X2l0ZXJhdG9yIGNvbnN0X2xvY2FsX2l0ZXJhdG9yOworCisgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yIF9CYXNlX2l0ZXJhdG9yOworICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9pdGVyYXRvciBfQmFzZV9jb25zdF9pdGVyYXRvcjsKKworICBoYXNoZXIgaGFzaF9mdW5jdCgpIGNvbnN0IHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5oYXNoX2Z1bmN0KCk7IH0KKyAga2V5X2VxdWFsIGtleV9lcSgpIGNvbnN0IHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5rZXlfZXEoKS5ub25fZGJnX2tleV9lcSgpOyB9CisKK3ByaXZhdGU6CisgIHZvaWQgX0ludmFsaWRhdGVfaXRlcmF0b3IoY29uc3QgY29uc3RfaXRlcmF0b3ImIF9faXQpCisgIHsgX1NUTFBfUFJJViBfX2ludmFsaWRhdGVfaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX19pdCk7IH0KKyAgdm9pZCBfSW52YWxpZGF0ZV9pdGVyYXRvcnMoY29uc3QgY29uc3RfaXRlcmF0b3ImIF9fZmlyc3QsIGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiBfX2xhc3QpCisgIHsgX1NUTFBfUFJJViBfX2ludmFsaWRhdGVfcmFuZ2UoJl9NX2l0ZXJfbGlzdCwgX19maXJzdCwgX19sYXN0KTsgfQorCisgIF9TVExQX0tFWV9UWVBFX0ZPUl9DT05UX0VYVChrZXlfdHlwZSkKKworcHVibGljOgorICBhbGxvY2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9yKCkgY29uc3QgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLmdldF9hbGxvY2F0b3IoKTsgfQorCisgIGhhc2h0YWJsZShzaXplX3R5cGUgX19uLAorICAgICAgICAgICAgY29uc3QgX0hGJiAgX19oZiwKKyAgICAgICAgICAgIGNvbnN0IF9FcUsmIF9fZXFsLAorICAgICAgICAgICAgY29uc3QgX0V4SyYgX19leHQsCisgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9NX25vbl9kYmdfaW1wbChfX24sIF9faGYsIF9fZXFsLCBfX2V4dCwgX19hKSwKKyAgICAgIF9NX2l0ZXJfbGlzdCgmX01fbm9uX2RiZ19pbXBsKSB7fQorCisgIGhhc2h0YWJsZShzaXplX3R5cGUgX19uLAorICAgICAgICAgICAgY29uc3QgX0hGJiAgICBfX2hmLAorICAgICAgICAgICAgY29uc3QgX0VxSyYgICBfX2VxbCwKKyAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX01fbm9uX2RiZ19pbXBsKF9fbiwgX19oZiwgX19lcWwsIF9fYSksCisgICAgICBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KKworICBoYXNodGFibGUoY29uc3QgX1NlbGYmIF9faHQpCisgICAgOiBfTV9ub25fZGJnX2ltcGwoX19odC5fTV9ub25fZGJnX2ltcGwpLAorICAgICAgX01faXRlcl9saXN0KCZfTV9ub25fZGJnX2ltcGwpIHt9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKKyAgaGFzaHRhYmxlKF9fbW92ZV9zb3VyY2U8X1NlbGY+IHNyYykKKyAgICA6IF9NX25vbl9kYmdfaW1wbChfX21vdmVfc291cmNlPF9CYXNlPihzcmMuZ2V0KCkuX01fbm9uX2RiZ19pbXBsKSksCisgICAgICBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkgeworIyAgaWYgZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykgfHwgKF9TVExQX0RFQlVHX0xFVkVMID09IF9TVExQX1NUQU5EQVJEX0RCR19MRVZFTCkKKyAgICBzcmMuZ2V0KCkuX01faXRlcl9saXN0Ll9JbnZhbGlkYXRlX2FsbCgpOworIyAgZWxzZQorICAgIHNyYy5nZXQoKS5fTV9pdGVyX2xpc3QuX1NldF9vd25lcihfTV9pdGVyX2xpc3QpOworIyAgZW5kaWYKKyAgfQorI2VuZGlmCisKKyAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwuc2l6ZSgpOyB9CisgIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5tYXhfc2l6ZSgpOyB9CisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwuZW1wdHkoKTsgfQorCisgIF9TZWxmJiBvcGVyYXRvcj0oY29uc3QgX1NlbGYmIF9faHQpIHsKKyAgICBpZiAodGhpcyAhPSAmX19odCkgeworICAgICAgLy9TaG91bGQgbm90IGludmFsaWRhdGUgZW5kIGl0ZXJhdG9yCisgICAgICBfSW52YWxpZGF0ZV9pdGVyYXRvcnMoYmVnaW4oKSwgZW5kKCkpOworICAgICAgX01fbm9uX2RiZ19pbXBsID0gX19odC5fTV9ub25fZGJnX2ltcGw7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHZvaWQgc3dhcChfU2VsZiYgX19odCkgeworICAgX01faXRlcl9saXN0Ll9Td2FwX293bmVycyhfX2h0Ll9NX2l0ZXJfbGlzdCk7CisgICBfTV9ub25fZGJnX2ltcGwuc3dhcChfX2h0Ll9NX25vbl9kYmdfaW1wbCk7CisgIH0KKworICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5iZWdpbigpKTsgfQorICBpdGVyYXRvciBlbmQoKSAgIHsgcmV0dXJuIGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5lbmQoKSk7IH0KKyAgbG9jYWxfaXRlcmF0b3IgYmVnaW4oc2l6ZV90eXBlIF9fbikgeworICAgIC8vVE9ETzogQWRkIGNoZWNrcyBmb3IgaXRlcmF0b3IgbG9jYWxpdHkgLT4gYXZvaWRzIGNvbXBhcmlzb24gYmV0d2VlbiBkaWZmZXJlbnQgYnVja2V0IGl0ZXJhdG9ycworICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKChfX24gPCBidWNrZXRfY291bnQoKSksIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKKyAgICByZXR1cm4gbG9jYWxfaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLmJlZ2luKF9fbikpOworICB9CisgIGxvY2FsX2l0ZXJhdG9yIGVuZChzaXplX3R5cGUgX19uKSB7CisgICAgLy9UT0RPOiBBZGQgY2hlY2tzIGZvciBpdGVyYXRvciBsb2NhbGl0eSAtPiBhdm9pZHMgY29tcGFyaXNvbiBiZXR3ZWVuIGRpZmZlcmVudCBidWNrZXQgaXRlcmF0b3JzCisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoKF9fbiA8IGJ1Y2tldF9jb3VudCgpKSwgX1N0bE1zZ19JTlZBTElEX0FSR1VNRU5UKQorICAgIHJldHVybiBsb2NhbF9pdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuZW5kKF9fbikpOworICB9CisKKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBjb25zdF9pdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuYmVnaW4oKSk7IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLmVuZCgpKTsgfQorICBjb25zdF9sb2NhbF9pdGVyYXRvciBiZWdpbihzaXplX3R5cGUgX19uKSBjb25zdCB7CisgICAgLy9UT0RPOiBBZGQgY2hlY2tzIGZvciBpdGVyYXRvciBsb2NhbGl0eSAtPiBhdm9pZHMgY29tcGFyaXNvbiBiZXR3ZWVuIGRpZmZlcmVudCBidWNrZXQgaXRlcmF0b3JzCisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoKF9fbiA8IGJ1Y2tldF9jb3VudCgpKSwgX1N0bE1zZ19JTlZBTElEX0FSR1VNRU5UKQorICAgIHJldHVybiBjb25zdF9sb2NhbF9pdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuYmVnaW4oX19uKSk7CisgIH0KKyAgY29uc3RfbG9jYWxfaXRlcmF0b3IgZW5kKHNpemVfdHlwZSBfX24pIGNvbnN0IHsKKyAgICAvL1RPRE86IEFkZCBjaGVja3MgZm9yIGl0ZXJhdG9yIGxvY2FsaXR5IC0+IGF2b2lkcyBjb21wYXJpc29uIGJldHdlZW4gZGlmZmVyZW50IGJ1Y2tldCBpdGVyYXRvcnMKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCgoX19uIDwgYnVja2V0X2NvdW50KCkpLCBfU3RsTXNnX0lOVkFMSURfQVJHVU1FTlQpCisgICAgcmV0dXJuIGNvbnN0X2xvY2FsX2l0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5lbmQoX19uKSk7CisgIH0KKworICBwYWlyPGl0ZXJhdG9yLCBib29sPiBpbnNlcnRfdW5pcXVlKGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKSB7CisgICAgcGFpcjxfQmFzZV9pdGVyYXRvciwgYm9vbD4gX19yZXMgPSBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0X3VuaXF1ZShfX29iaik7CisgICAgcmV0dXJuIHBhaXI8aXRlcmF0b3IsIGJvb2w+KGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9fcmVzLmZpcnN0KSwgX19yZXMuc2Vjb25kKTsKKyAgfQorCisgIGl0ZXJhdG9yIGluc2VydF9lcXVhbChjb25zdCB2YWx1ZV90eXBlJiBfX29iaikKKyAgeyByZXR1cm4gaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLmluc2VydF9lcXVhbChfX29iaikpOyB9CisKKyAgcGFpcjxpdGVyYXRvciwgYm9vbD4gaW5zZXJ0X3VuaXF1ZV9ub3Jlc2l6ZShjb25zdCB2YWx1ZV90eXBlJiBfX29iaikgeworICAgIHBhaXI8X0Jhc2VfaXRlcmF0b3IsIGJvb2w+IF9fcmVzID0gX01fbm9uX2RiZ19pbXBsLmluc2VydF91bmlxdWVfbm9yZXNpemUoX19vYmopOworICAgIHJldHVybiBwYWlyPGl0ZXJhdG9yLCBib29sPihpdGVyYXRvcigmX01faXRlcl9saXN0LCBfX3Jlcy5maXJzdCksIF9fcmVzLnNlY29uZCk7CisgIH0KKworICBpdGVyYXRvciBpbnNlcnRfZXF1YWxfbm9yZXNpemUoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCisgIHsgcmV0dXJuIGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5pbnNlcnRfZXF1YWxfbm9yZXNpemUoX19vYmopKTsgfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICB2b2lkIGluc2VydF91bmlxdWUoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wpIHsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19mLCBfX2wpKQorICAgIF9NX25vbl9kYmdfaW1wbC5pbnNlcnRfdW5pcXVlKF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2YpLCBfU1RMUF9QUklWIF9Ob25fRGJnX2l0ZXIoX19sKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZvaWQgaW5zZXJ0X2VxdWFsKF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sKXsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19mLCBfX2wpKQorICAgIF9NX25vbl9kYmdfaW1wbC5pbnNlcnRfZXF1YWwoX1NUTFBfUFJJViBfTm9uX0RiZ19pdGVyKF9fZiksIF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2wpKTsKKyAgfQorCisjZWxzZQorICB2b2lkIGluc2VydF91bmlxdWUoY29uc3QgdmFsdWVfdHlwZSogX19mLCBjb25zdCB2YWx1ZV90eXBlKiBfX2wpIHsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcHRyX3JhbmdlKF9fZiwgX19sKSkKKyAgICBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7CisgIH0KKworICB2b2lkIGluc2VydF9lcXVhbChjb25zdCB2YWx1ZV90eXBlKiBfX2YsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbCkgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19wdHJfcmFuZ2UoX19mLCBfX2wpKQorICAgIF9NX25vbl9kYmdfaW1wbC5pbnNlcnRfZXF1YWwoX19mLCBfX2wpOworICB9CisKKyAgdm9pZCBpbnNlcnRfdW5pcXVlKGNvbnN0X2l0ZXJhdG9yIF9fZiwgY29uc3RfaXRlcmF0b3IgX19sKSB7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZiwgX19sKSkKKyAgICBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0X3VuaXF1ZShfX2YuX01faXRlcmF0b3IsIF9fbC5fTV9pdGVyYXRvcik7CisgIH0KKworICB2b2lkIGluc2VydF9lcXVhbChjb25zdF9pdGVyYXRvciBfX2YsIGNvbnN0X2l0ZXJhdG9yIF9fbCkgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2YsIF9fbCkpCisgICAgX01fbm9uX2RiZ19pbXBsLmluc2VydF9lcXVhbChfX2YuX01faXRlcmF0b3IsIF9fbC5fTV9pdGVyYXRvcik7CisgIH0KKyNlbmRpZgorCisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBpdGVyYXRvciBmaW5kKGNvbnN0IF9LVCYgX19rZXkpCisgIHsgcmV0dXJuIGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5maW5kKF9fa2V5KSk7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIGNvbnN0X2l0ZXJhdG9yIGZpbmQoY29uc3QgX0tUJiBfX2tleSkgY29uc3QKKyAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLmZpbmQoX19rZXkpKTsgfQorCisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBzaXplX3R5cGUgY291bnQoY29uc3QgX0tUJiBfX2tleSkgY29uc3QgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLmNvdW50KF9fa2V5KTsgfQorCisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4gZXF1YWxfcmFuZ2UoY29uc3QgX0tUJiBfX2tleSkgeworICAgIHBhaXI8X0Jhc2VfaXRlcmF0b3IsIF9CYXNlX2l0ZXJhdG9yPiBfX3JlcyA9IF9NX25vbl9kYmdfaW1wbC5lcXVhbF9yYW5nZShfX2tleSk7CisgICAgcmV0dXJuIHBhaXI8aXRlcmF0b3IsaXRlcmF0b3I+IChpdGVyYXRvcigmX01faXRlcl9saXN0LF9fcmVzLmZpcnN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsX19yZXMuc2Vjb25kKSk7CisgIH0KKworICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgcGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+IGVxdWFsX3JhbmdlKGNvbnN0IF9LVCYgX19rZXkpIGNvbnN0IHsKKyAgICBwYWlyIDxfQmFzZV9jb25zdF9pdGVyYXRvciwgX0Jhc2VfY29uc3RfaXRlcmF0b3I+IF9fcmVzID0gX01fbm9uX2RiZ19pbXBsLmVxdWFsX3JhbmdlKF9fa2V5KTsKKyAgICByZXR1cm4gcGFpcjxjb25zdF9pdGVyYXRvcixjb25zdF9pdGVyYXRvcj4gKGNvbnN0X2l0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsX19yZXMuZmlyc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCxfX3Jlcy5zZWNvbmQpKTsKKyAgfQorCisgIHNpemVfdHlwZSBlcmFzZShjb25zdCBrZXlfdHlwZSYgX19rZXkpIHsKKyAgICBwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4gX19wID0gZXF1YWxfcmFuZ2UoX19rZXkpOworICAgIHNpemVfdHlwZSBfX24gPSBfU1RMUF9TVEQ6OmRpc3RhbmNlKF9fcC5maXJzdCwgX19wLnNlY29uZCk7CisgICAgX0ludmFsaWRhdGVfaXRlcmF0b3JzKF9fcC5maXJzdCwgX19wLnNlY29uZCk7CisgICAgX01fbm9uX2RiZ19pbXBsLmVyYXNlKF9fcC5maXJzdC5fTV9pdGVyYXRvciwgX19wLnNlY29uZC5fTV9pdGVyYXRvcik7CisgICAgcmV0dXJuIF9fbjsKKyAgfQorCisgIHZvaWQgZXJhc2UoY29uc3QgY29uc3RfaXRlcmF0b3ImIF9faXQpIHsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9EZXJlZmVyZW5jZWFibGUoX19pdCkpCisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX2lmX293bmVyKCZfTV9pdGVyX2xpc3QsIF9faXQpKQorICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9yKF9faXQpOworICAgIF9NX25vbl9kYmdfaW1wbC5lcmFzZShfX2l0Ll9NX2l0ZXJhdG9yKTsKKyAgfQorICB2b2lkIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yKGJlZ2luKCkpLCBjb25zdF9pdGVyYXRvcihlbmQoKSkpKQorICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9ycyhfX2ZpcnN0LCBfX2xhc3QpOworICAgIF9NX25vbl9kYmdfaW1wbC5lcmFzZShfX2ZpcnN0Ll9NX2l0ZXJhdG9yLCBfX2xhc3QuX01faXRlcmF0b3IpOworICB9CisKKyAgdm9pZCByZWhhc2goc2l6ZV90eXBlIF9fbnVtX2J1Y2tldHNfaGludCkgeyBfTV9ub25fZGJnX2ltcGwucmVoYXNoKF9fbnVtX2J1Y2tldHNfaGludCk7IH0KKyAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9fbnVtX2VsZW1lbnRzX2hpbnQpIHsgX01fbm9uX2RiZ19pbXBsLnJlc2l6ZShfX251bV9lbGVtZW50c19oaW50KTsgfQorCisgIHZvaWQgY2xlYXIoKSB7CisgICAgX0ludmFsaWRhdGVfaXRlcmF0b3JzKGJlZ2luKCksIGVuZCgpKTsKKyAgICBfTV9ub25fZGJnX2ltcGwuY2xlYXIoKTsKKyAgfQorCisgIHJlZmVyZW5jZSBfTV9pbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopIHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5fTV9pbnNlcnQoX19vYmopOyB9CisKKyAgc2l6ZV90eXBlIGJ1Y2tldF9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5idWNrZXRfY291bnQoKTsgfQorICBzaXplX3R5cGUgbWF4X2J1Y2tldF9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5tYXhfYnVja2V0X2NvdW50KCk7IH0KKyAgc2l6ZV90eXBlIGVsZW1zX2luX2J1Y2tldChzaXplX3R5cGUgX19uKSBjb25zdCB7CisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoKF9fbiA8IGJ1Y2tldF9jb3VudCgpKSwgX1N0bE1zZ19JTlZBTElEX0FSR1VNRU5UKQorICAgIHJldHVybiBfTV9ub25fZGJnX2ltcGwuZWxlbXNfaW5fYnVja2V0KF9fbik7CisgIH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIHNpemVfdHlwZSBidWNrZXQoY29uc3QgX0tUJiBfX2spIGNvbnN0IHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5idWNrZXQoX19rKTsgfQorCisgIGZsb2F0IGxvYWRfZmFjdG9yKCkgY29uc3QgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLmxvYWRfZmFjdG9yKCk7IH0KKyAgZmxvYXQgbWF4X2xvYWRfZmFjdG9yKCkgY29uc3QgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLm1heF9sb2FkX2ZhY3RvcigpOyB9CisgIHZvaWQgbWF4X2xvYWRfZmFjdG9yKGZsb2F0IF9feikgeworICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKChfX3ogPiAwLjBmKSwgX1N0bE1zZ19JTlZBTElEX0FSR1VNRU5UKQorICAgIF9NX25vbl9kYmdfaW1wbC5tYXhfbG9hZF9mYWN0b3IoX196KTsKKyAgfQorfTsKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjdW5kZWYgX1NUTFBfTk9OX0RCR19IVAorCisjZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfSEFTSFRBQkxFX0ggKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL2RlYnVnL19pdGVyYXRvci5oIGIvc3RscG9ydC9zdGwvZGVidWcvX2l0ZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJjODk1NgotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc3RsL2RlYnVnL19pdGVyYXRvci5oCkBAIC0wLDAgKzEsNDU3IEBACisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfREJHX0lURVJBVE9SX0gKKyNkZWZpbmUgX1NUTFBfREJHX0lURVJBVE9SX0gKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9QQUlSX0gKKyMgIGluY2x1ZGUgPHN0bC9fcGFpci5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQUxMT0NfSAorIyAgaW5jbHVkZSA8c3RsL19hbGxvYy5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgordm9pZCBfRGVjcmVtZW50KF9JdGVyYXRvciYgX19pdCwgY29uc3QgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgJikKK3sgLS1fX2l0OyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+Cit2b2lkIF9EZWNyZW1lbnQoX0l0ZXJhdG9yJiBfX2l0LCBjb25zdCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyAmKQoreyAtLV9faXQ7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KK3ZvaWQgX0RlY3JlbWVudChfSXRlcmF0b3ImIF9faXQsIGNvbnN0IGZvcndhcmRfaXRlcmF0b3JfdGFnICYpCit7IF9TVExQX0FTU0VSVCgwKSB9CisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+Cit2b2lkIF9BZHZhbmNlKF9JdGVyYXRvciYsIHB0cmRpZmZfdCwgY29uc3QgZm9yd2FyZF9pdGVyYXRvcl90YWcgJikKK3sgX1NUTFBfQVNTRVJUKDApIH0KKwordGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KK3ZvaWQgX0FkdmFuY2UoX0l0ZXJhdG9yJiBfX2l0LCBwdHJkaWZmX3QsIGNvbnN0IGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnICYpCit7IF9TVExQX0FTU0VSVCgwKSB9CisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+Cit2b2lkIF9BZHZhbmNlKF9JdGVyYXRvciYgX19pdCwgcHRyZGlmZl90IF9fbiwgY29uc3QgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgJikKK3sgX19pdCArPSBfX247IH0KKwordGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KK3B0cmRpZmZfdCBfREJHX2Rpc3RhbmNlKGNvbnN0IF9JdGVyYXRvciYgX194LCBjb25zdCBfSXRlcmF0b3ImIF9feSwgY29uc3QgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgJikKK3sgcmV0dXJuIF9feCAtIF9feTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgorcHRyZGlmZl90IF9EQkdfZGlzdGFuY2UoY29uc3QgX0l0ZXJhdG9yJiwgY29uc3QgX0l0ZXJhdG9yJiwgY29uc3QgZm9yd2FyZF9pdGVyYXRvcl90YWcgJikgeworICBfU1RMUF9BU1NFUlQoMCkKKyAgcmV0dXJuIDA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+CitwdHJkaWZmX3QgX0RCR19kaXN0YW5jZShjb25zdCBfSXRlcmF0b3ImLCBjb25zdCBfSXRlcmF0b3ImLCBjb25zdCBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZyAmKSB7CisgIF9TVExQX0FTU0VSVCgwKQorICByZXR1cm4gMDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KK2Jvb2wgX0NvbXBhcmVJdChjb25zdCBfSXRlcmF0b3ImLCBjb25zdCBfSXRlcmF0b3ImLCBjb25zdCBmb3J3YXJkX2l0ZXJhdG9yX3RhZyAmKSB7CisgIF9TVExQX0FTU0VSVCgwKQorICByZXR1cm4gZmFsc2U7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+Citib29sIF9Db21wYXJlSXQoY29uc3QgX0l0ZXJhdG9yJiwgY29uc3QgX0l0ZXJhdG9yJiwgY29uc3QgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgJikgeworICBfU1RMUF9BU1NFUlQoMCkKKyAgcmV0dXJuIGZhbHNlOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgorYm9vbCBfQ29tcGFyZUl0KGNvbnN0IF9JdGVyYXRvciYgX194LCBjb25zdCBfSXRlcmF0b3ImIF9feSwgY29uc3QgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgJikKK3sgcmV0dXJuIF9feCA8IF9feTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgorYm9vbCBfRGVyZWZlcmVuY2VhYmxlKGNvbnN0IF9JdGVyYXRvciYgX19pdCkKK3sgcmV0dXJuIChfX2l0Ll9HZXRfY29udGFpbmVyX3B0cigpICE9IDApICYmICEoX19pdC5fTV9pdGVyYXRvciA9PSAoX19pdC5fR2V0X2NvbnRhaW5lcl9wdHIoKSktPmVuZCgpKTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgorYm9vbCBfSW5jcmVtZW50YWJsZShjb25zdCBfSXRlcmF0b3ImIF9faXQsIHB0cmRpZmZfdCBfX24sIGNvbnN0IGZvcndhcmRfaXRlcmF0b3JfdGFnICYpCit7IHJldHVybiAoX19uID09IDEpICYmIF9EZXJlZmVyZW5jZWFibGUoX19pdCk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KK2Jvb2wgX0luY3JlbWVudGFibGUoY29uc3QgX0l0ZXJhdG9yJiBfX2l0LCBwdHJkaWZmX3QgX19uLCBjb25zdCBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZyAmKSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0l0ZXJhdG9yOjpfQ29udGFpbmVyX3R5cGUgX19jb250YWluZXJfdHlwZTsKKyAgX19jb250YWluZXJfdHlwZSogX19jID0gX19pdC5fR2V0X2NvbnRhaW5lcl9wdHIoKTsKKyAgcmV0dXJuIChfX2MgIT0gMCkgJiYgKChfX24gPT0gMSAmJiBfX2l0Ll9NX2l0ZXJhdG9yICE9IF9fYy0+ZW5kKCkgKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKF9fbiA9PSAtMSAmJiBfX2l0Ll9NX2l0ZXJhdG9yICE9IF9fYy0+YmVnaW4oKSkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgorYm9vbCBfSW5jcmVtZW50YWJsZShjb25zdCBfSXRlcmF0b3ImIF9faXQsIHB0cmRpZmZfdCBfX24sIGNvbnN0IHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnICYpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSXRlcmF0b3I6Ol9Db250YWluZXJfdHlwZSBfX2NvbnRhaW5lcl90eXBlOworICBfX2NvbnRhaW5lcl90eXBlKiBfX2MgPSBfX2l0Ll9HZXRfY29udGFpbmVyX3B0cigpOworICBpZiAoX19jID09IDApIHJldHVybiBmYWxzZTsKKyAgcHRyZGlmZl90IF9fbmV3X3BvcyA9IChfX2l0Ll9NX2l0ZXJhdG9yIC0gX19jLT5iZWdpbigpKSArIF9fbjsKKyAgcmV0dXJuICAoX19uZXdfcG9zID49IDApICYmIChfX1NUQVRJQ19DQVNUKHR5cGVuYW1lIF9fY29udGFpbmVyX3R5cGU6OnNpemVfdHlwZSwgX19uZXdfcG9zKSA8PSBfX2MtPnNpemUoKSk7Cit9CisKKwordGVtcGxhdGUgPGNsYXNzIF9Db250YWluZXI+CitzdHJ1Y3QgX0RCR19pdGVyX2Jhc2UgOiBwdWJsaWMgX19vd25lZF9saW5rIHsKK3B1YmxpYzoKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQ29udGFpbmVyOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0NvbnRhaW5lcjo6cmVmZXJlbmNlICByZWZlcmVuY2U7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0NvbnRhaW5lcjo6cG9pbnRlciAgICBwb2ludGVyOworICB0eXBlZGVmIHB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7CisgIC8vcHJpdmF0ZToKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQ29udGFpbmVyOjppdGVyYXRvciAgICAgICAgX05vbmNvbnN0X2l0ZXJhdG9yOworICB0eXBlZGVmIHR5cGVuYW1lIF9Db250YWluZXI6OmNvbnN0X2l0ZXJhdG9yICBfQ29uc3RfaXRlcmF0b3I7CisgIHR5cGVkZWYgX0NvbnRhaW5lciAgICAgICAgICAgICAgICAgICAgIF9Db250YWluZXJfdHlwZTsKKworI2lmZGVmIF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04KKyAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0NvbnN0X2l0ZXJhdG9yPjo6aXRlcmF0b3JfY2F0ZWdvcnkgX0l0ZXJhdG9yX2NhdGVnb3J5OworI2Vsc2UKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQ29udGFpbmVyOjpfSXRlcmF0b3JfY2F0ZWdvcnkgIF9JdGVyYXRvcl9jYXRlZ29yeTsKKyNlbmRpZgorICB0eXBlZGVmIF9JdGVyYXRvcl9jYXRlZ29yeSBpdGVyYXRvcl9jYXRlZ29yeTsKKworICBfREJHX2l0ZXJfYmFzZSgpIDogX19vd25lZF9saW5rKDApICB7fQorICBfREJHX2l0ZXJfYmFzZShjb25zdCBfX293bmVkX2xpc3QqIF9fYywgY29uc3QgX0NvbnN0X2l0ZXJhdG9yJiBfX2l0KSA6CisjaWYgZGVmaW5lZChfX0hQX2FDQykgJiYgKF9fSFBfYUNDIDwgNjAwMDApCisgIF9fb3duZWRfbGluayhfX2MpLCBfTV9pdGVyYXRvcigqX19SRUlOVEVSUFJFVF9DQVNUKGNvbnN0IF9Ob25jb25zdF9pdGVyYXRvciAqLCAmX19pdCkpIHt9CisjZWxzZQorICAgIF9fb3duZWRfbGluayhfX2MpLCBfTV9pdGVyYXRvcigqKGNvbnN0IF9Ob25jb25zdF9pdGVyYXRvciopJl9faXQpIHt9CisjZW5kaWYKKyAgX0NvbnRhaW5lciogX0dldF9jb250YWluZXJfcHRyKCkgY29uc3QgeworICAgIHJldHVybiAoX0NvbnRhaW5lciopX19zdGxfZGVidWdnZXI6Ol9HZXRfY29udGFpbmVyX3B0cih0aGlzKTsKKyAgfQorCisgIHZvaWQgX19pbmNyZW1lbnQoKTsKKyAgdm9pZCBfX2RlY3JlbWVudCgpOworICB2b2lkIF9fYWR2YW5jZShwdHJkaWZmX3QgX19uKTsKKworLy8gcHJvdGVjdGVkOgorICBfTm9uY29uc3RfaXRlcmF0b3IgX01faXRlcmF0b3I7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NvbnRhaW5lcj4KK2lubGluZSB2b2lkIF9EQkdfaXRlcl9iYXNlPF9Db250YWluZXI+OjpfX2luY3JlbWVudCgpIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX0luY3JlbWVudGFibGUoKnRoaXMsIDEsIF9JdGVyYXRvcl9jYXRlZ29yeSgpKSkKKyAgKytfTV9pdGVyYXRvcjsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Db250YWluZXI+CitpbmxpbmUgdm9pZCBfREJHX2l0ZXJfYmFzZTxfQ29udGFpbmVyPjo6X19kZWNyZW1lbnQoKSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9JbmNyZW1lbnRhYmxlKCp0aGlzLCAtMSwgX0l0ZXJhdG9yX2NhdGVnb3J5KCkpKQorICBfRGVjcmVtZW50KF9NX2l0ZXJhdG9yLCBfSXRlcmF0b3JfY2F0ZWdvcnkoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ29udGFpbmVyPgoraW5saW5lIHZvaWQgX0RCR19pdGVyX2Jhc2U8X0NvbnRhaW5lcj46Ol9fYWR2YW5jZShwdHJkaWZmX3QgX19uKSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9JbmNyZW1lbnRhYmxlKCp0aGlzLCBfX24sIF9JdGVyYXRvcl9jYXRlZ29yeSgpKSkKKyAgX0FkdmFuY2UoX01faXRlcmF0b3IsIF9fbiwgX0l0ZXJhdG9yX2NhdGVnb3J5KCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NvbnRhaW5lcj4KK3B0cmRpZmZfdCBvcGVyYXRvci0oY29uc3QgX0RCR19pdGVyX2Jhc2U8X0NvbnRhaW5lcj4mIF9feCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgX0RCR19pdGVyX2Jhc2U8X0NvbnRhaW5lcj4mIF9feSApIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfREJHX2l0ZXJfYmFzZTxfQ29udGFpbmVyPjo6X0l0ZXJhdG9yX2NhdGVnb3J5ICBfSXRlcmF0b3JfY2F0ZWdvcnk7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9fY2hlY2tfc2FtZV9vd25lcihfX3gsIF9feSkpCisgIHJldHVybiBfREJHX2Rpc3RhbmNlKF9feC5fTV9pdGVyYXRvcixfX3kuX01faXRlcmF0b3IsIF9JdGVyYXRvcl9jYXRlZ29yeSgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Db250YWluZXIsIGNsYXNzIF9UcmFpdHM+CitzdHJ1Y3QgX0RCR19pdGVyX21pZCA6IHB1YmxpYyBfREJHX2l0ZXJfYmFzZTxfQ29udGFpbmVyPiB7CisgIHR5cGVkZWYgX0RCR19pdGVyX21pZDxfQ29udGFpbmVyLCB0eXBlbmFtZSBfVHJhaXRzOjpfTm9uQ29uc3RUcmFpdHM+IF9Ob25jb25zdF9zZWxmOworICB0eXBlZGVmIHR5cGVuYW1lIF9Db250YWluZXI6Oml0ZXJhdG9yICAgICAgICBfTm9uY29uc3RfaXRlcmF0b3I7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0NvbnRhaW5lcjo6Y29uc3RfaXRlcmF0b3IgIF9Db25zdF9pdGVyYXRvcjsKKworICBfREJHX2l0ZXJfbWlkKCkge30KKworICBleHBsaWNpdCBfREJHX2l0ZXJfbWlkKGNvbnN0IF9Ob25jb25zdF9zZWxmJiBfX2l0KSA6CisgICAgICBfREJHX2l0ZXJfYmFzZTxfQ29udGFpbmVyPihfX2l0KSB7fQorCisgIF9EQkdfaXRlcl9taWQoY29uc3QgX19vd25lZF9saXN0KiBfX2MsIGNvbnN0IF9Db25zdF9pdGVyYXRvciYgX19pdCkgOgorICAgICAgX0RCR19pdGVyX2Jhc2U8X0NvbnRhaW5lcj4oX19jLCBfX2l0KSB7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9Db250YWluZXIsIGNsYXNzIF9UcmFpdHM+CitzdHJ1Y3QgX0RCR19pdGVyIDogcHVibGljIF9EQkdfaXRlcl9taWQ8X0NvbnRhaW5lciwgX1RyYWl0cz4geworICB0eXBlZGVmIF9EQkdfaXRlcl9iYXNlPF9Db250YWluZXI+ICAgICAgICAgIF9CYXNlOworcHVibGljOgorICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6cmVmZXJlbmNlICByZWZlcmVuY2U7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6cG9pbnRlciAgICBwb2ludGVyOworCisgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Ol9Ob25jb25zdF9pdGVyYXRvciBfTm9uY29uc3RfaXRlcmF0b3I7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Ol9Db25zdF9pdGVyYXRvciBfQ29uc3RfaXRlcmF0b3I7CisKK3ByaXZhdGU6CisgIHR5cGVkZWYgX0RCR19pdGVyPF9Db250YWluZXIsIF9UcmFpdHM+ICAgICBfU2VsZjsKKyAgdHlwZWRlZiBfREJHX2l0ZXJfbWlkPF9Db250YWluZXIsIHR5cGVuYW1lIF9UcmFpdHM6Ol9Ob25Db25zdFRyYWl0cz4gX05vbmNvbnN0X21pZDsKKworcHVibGljOgorCisjaWZkZWYgX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTgorICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjppdGVyYXRvcl9jYXRlZ29yeSBpdGVyYXRvcl9jYXRlZ29yeTsKKyNlbmRpZgorICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpfSXRlcmF0b3JfY2F0ZWdvcnkgIF9JdGVyYXRvcl9jYXRlZ29yeTsKKworcHVibGljOgorICBfREJHX2l0ZXIoKSB7fQorICAgIC8vIGJvcmlzIDogcmVhbCB0eXBlIG9mIGl0ZXIgd291bGQgYmUgbmljZQorICBfREJHX2l0ZXIoY29uc3QgX19vd25lZF9saXN0KiBfX2MsIGNvbnN0IF9Db25zdF9pdGVyYXRvciYgX19pdCkgOgorICAgIF9EQkdfaXRlcl9taWQ8X0NvbnRhaW5lciwgX1RyYWl0cz4oX19jLCBfX2l0KSB7fQorCisgIC8vIFRoaXMgYWxsb3dzIGNvbnZlcnNpb25zIGZyb20gaXRlcmF0b3IgdG8gY29uc3RfaXRlcmF0b3Igd2l0aG91dCBiZWluZworICAvLyByZWR1bmRhbnQgd2l0aCB0aGUgY29weSBjb25zdHJ1Y3RvciBiZWxvdy4KKyAgX0RCR19pdGVyKGNvbnN0IF9Ob25jb25zdF9taWQmIF9fcmhzKSA6CisgICAgX0RCR19pdGVyX21pZDxfQ29udGFpbmVyLCBfVHJhaXRzPihfX3Jocykge30KKworICBfREJHX2l0ZXIoY29uc3QgIF9TZWxmJiBfX3JocykgOgorICAgIF9EQkdfaXRlcl9taWQ8X0NvbnRhaW5lciwgX1RyYWl0cz4oX19yaHMpIHt9CisKKyAgLy8gVGhpcyBhbGxvd3MgY29udmVyc2lvbnMgZnJvbSBpdGVyYXRvciB0byBjb25zdF9pdGVyYXRvciB3aXRob3V0IGJlaW5nCisgIC8vIHJlZHVuZGFudCB3aXRoIHRoZSBjb3B5IGFzc2lnbm1lbnQgb3BlcmF0b3IgYmVsb3cuCisgIF9TZWxmJiBvcGVyYXRvcj0oY29uc3QgX05vbmNvbnN0X21pZCYgX19yaHMpIHsKKyAgICAoX0Jhc2UmKSp0aGlzID0gX19yaHM7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgX1NlbGYmIG9wZXJhdG9yPShjb25zdCAgX1NlbGYmIF9fcmhzKSB7CisgICAgKF9CYXNlJikqdGhpcyA9IF9fcmhzOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHJlZmVyZW5jZSBvcGVyYXRvciooKSBjb25zdDsKKworICBfU1RMUF9ERUZJTkVfQVJST1dfT1BFUkFUT1IKKworICBfU2VsZiYgb3BlcmF0b3IrKygpIHsKKyAgICB0aGlzLT5fX2luY3JlbWVudCgpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBfU2VsZiBvcGVyYXRvcisrKGludCkgeworICAgIF9TZWxmIF9fdG1wID0gKnRoaXM7CisgICAgdGhpcy0+X19pbmNyZW1lbnQoKTsKKyAgICByZXR1cm4gX190bXA7CisgIH0KKyAgX1NlbGYmIG9wZXJhdG9yLS0oKSB7CisgICAgdGhpcy0+X19kZWNyZW1lbnQoKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgX1NlbGYgb3BlcmF0b3ItLShpbnQpIHsKKyAgICBfU2VsZiBfX3RtcCA9ICp0aGlzOworICAgIHRoaXMtPl9fZGVjcmVtZW50KCk7CisgICAgcmV0dXJuIF9fdG1wOworICB9CisKKyAgX1NlbGYmIG9wZXJhdG9yKz0oZGlmZmVyZW5jZV90eXBlIF9fbikgeworICAgIHRoaXMtPl9fYWR2YW5jZShfX24pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIF9TZWxmJiBvcGVyYXRvci09KGRpZmZlcmVuY2VfdHlwZSBfX24pIHsKKyAgICB0aGlzLT5fX2FkdmFuY2UoLV9fbik7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIF9TZWxmIG9wZXJhdG9yKyhkaWZmZXJlbmNlX3R5cGUgX19uKSBjb25zdCB7CisgICAgX1NlbGYgX190bXAoKnRoaXMpOworICAgIF9fdG1wLl9fYWR2YW5jZShfX24pOworICAgIHJldHVybiBfX3RtcDsKKyAgfQorICBfU2VsZiBvcGVyYXRvci0oZGlmZmVyZW5jZV90eXBlIF9fbikgY29uc3QgeworICAgIF9TZWxmIF9fdG1wKCp0aGlzKTsKKyAgICBfX3RtcC5fX2FkdmFuY2UoLV9fbik7CisgICAgcmV0dXJuIF9fdG1wOworICB9CisgIHJlZmVyZW5jZSBvcGVyYXRvcltdKGRpZmZlcmVuY2VfdHlwZSBfX24pIGNvbnN0IHsgcmV0dXJuICooKnRoaXMgKyBfX24pOyB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NvbnRhaW5lciwgY2xhc3MgX1RyYWl0cz4KK2lubGluZQorI2lmIGRlZmluZWQgKF9TVExQX05FU1RFRF9UWVBFX1BBUkFNX0JVRykKK19TVExQX1RZUEVOQU1FX09OX1JFVFVSTl9UWVBFIF9UcmFpdHM6OnJlZmVyZW5jZQorI2Vsc2UKK19TVExQX1RZUEVOQU1FX09OX1JFVFVSTl9UWVBFIF9EQkdfaXRlcjxfQ29udGFpbmVyLCBfVHJhaXRzPjo6cmVmZXJlbmNlCisjZW5kaWYKK19EQkdfaXRlcjxfQ29udGFpbmVyLCBfVHJhaXRzPjo6b3BlcmF0b3IqKCkgY29uc3QgeworICBfU1RMUF9ERUJVR19DSEVDSyhfRGVyZWZlcmVuY2VhYmxlKCp0aGlzKSkKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1RyYWl0czo6X0NoZWNrKCp0aGlzKSkKKyAgcmV0dXJuICp0aGlzLT5fTV9pdGVyYXRvcjsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Db250YWluZXI+CitpbmxpbmUgYm9vbAorb3BlcmF0b3I9PShjb25zdCBfREJHX2l0ZXJfYmFzZTxfQ29udGFpbmVyPiYgX194LCBjb25zdCBfREJHX2l0ZXJfYmFzZTxfQ29udGFpbmVyPiYgX195KSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9fY2hlY2tfc2FtZV9vcl9udWxsX293bmVyKF9feCwgX195KSkKKyAgcmV0dXJuIF9feC5fTV9pdGVyYXRvciA9PSBfX3kuX01faXRlcmF0b3I7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ29udGFpbmVyPgoraW5saW5lIGJvb2wKK29wZXJhdG9yPChjb25zdCBfREJHX2l0ZXJfYmFzZTxfQ29udGFpbmVyPiYgX194LCBjb25zdCBfREJHX2l0ZXJfYmFzZTxfQ29udGFpbmVyPiYgX195KSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9fY2hlY2tfc2FtZV9vcl9udWxsX293bmVyKF9feCwgX195KSkKKyAgdHlwZWRlZiB0eXBlbmFtZSBfREJHX2l0ZXJfYmFzZTxfQ29udGFpbmVyPjo6X0l0ZXJhdG9yX2NhdGVnb3J5IF9DYXRlZ29yeTsKKyAgcmV0dXJuIF9Db21wYXJlSXQoX194Ll9NX2l0ZXJhdG9yICwgX195Ll9NX2l0ZXJhdG9yLCBfQ2F0ZWdvcnkoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ29udGFpbmVyPgoraW5saW5lIGJvb2wKK29wZXJhdG9yPihjb25zdCBfREJHX2l0ZXJfYmFzZTxfQ29udGFpbmVyPiYgX194LAorICAgICAgIGNvbnN0IF9EQkdfaXRlcl9iYXNlPF9Db250YWluZXI+JiBfX3kpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfREJHX2l0ZXJfYmFzZTxfQ29udGFpbmVyPjo6X0l0ZXJhdG9yX2NhdGVnb3J5IF9DYXRlZ29yeTsKKyAgcmV0dXJuIF9Db21wYXJlSXQoX195Ll9NX2l0ZXJhdG9yICwgX194Ll9NX2l0ZXJhdG9yLCBfQ2F0ZWdvcnkoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ29udGFpbmVyPgoraW5saW5lIGJvb2wKK29wZXJhdG9yPj0oY29uc3QgX0RCR19pdGVyX2Jhc2U8X0NvbnRhaW5lcj4mIF9feCwgY29uc3QgX0RCR19pdGVyX2Jhc2U8X0NvbnRhaW5lcj4mIF9feSkgeworICBfU1RMUF9ERUJVR19DSEVDSyhfX2NoZWNrX3NhbWVfb3JfbnVsbF9vd25lcihfX3gsIF9feSkpCisgIHR5cGVkZWYgdHlwZW5hbWUgX0RCR19pdGVyX2Jhc2U8X0NvbnRhaW5lcj46Ol9JdGVyYXRvcl9jYXRlZ29yeSBfQ2F0ZWdvcnk7CisgIHJldHVybiAhX0NvbXBhcmVJdChfX3guX01faXRlcmF0b3IgLCBfX3kuX01faXRlcmF0b3IsIF9DYXRlZ29yeSgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Db250YWluZXI+CitpbmxpbmUgYm9vbAorb3BlcmF0b3I8PShjb25zdCBfREJHX2l0ZXJfYmFzZTxfQ29udGFpbmVyPiYgX194LAorICAgICAgIGNvbnN0IF9EQkdfaXRlcl9iYXNlPF9Db250YWluZXI+JiBfX3kpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfREJHX2l0ZXJfYmFzZTxfQ29udGFpbmVyPjo6X0l0ZXJhdG9yX2NhdGVnb3J5IF9DYXRlZ29yeTsKKyAgcmV0dXJuICFfQ29tcGFyZUl0KF9feS5fTV9pdGVyYXRvciAsIF9feC5fTV9pdGVyYXRvciwgX0NhdGVnb3J5KCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NvbnRhaW5lcj4KK2lubGluZSBib29sCitvcGVyYXRvciE9KGNvbnN0IF9EQkdfaXRlcl9iYXNlPF9Db250YWluZXI+JiBfX3gsCisgICAgICAgIGNvbnN0IF9EQkdfaXRlcl9iYXNlPF9Db250YWluZXI+JiBfX3kpIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX19jaGVja19zYW1lX29yX251bGxfb3duZXIoX194LCBfX3kpKQorICByZXR1cm4gX194Ll9NX2l0ZXJhdG9yICE9IF9feS5fTV9pdGVyYXRvcjsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordGVtcGxhdGUgPGNsYXNzIF9Db250YWluZXIsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUgX0RCR19pdGVyPF9Db250YWluZXIsIF9UcmFpdHM+CitvcGVyYXRvcisocHRyZGlmZl90IF9fbiwgY29uc3QgX0RCR19pdGVyPF9Db250YWluZXIsIF9UcmFpdHM+JiBfX2l0KSB7CisgIF9EQkdfaXRlcjxfQ29udGFpbmVyLCBfVHJhaXRzPiBfX3RtcChfX2l0KTsKKyAgcmV0dXJuIF9fdG1wICs9IF9fbjsKK30KKworCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgoraW5saW5lIF9JdGVyYXRvciBfTm9uX0RiZ19pdGVyKF9JdGVyYXRvciBfX2l0KQoreyByZXR1cm4gX19pdDsgfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSKQordGVtcGxhdGUgPGNsYXNzIF9Db250YWluZXIsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUgdHlwZW5hbWUgX0RCR19pdGVyPF9Db250YWluZXIsIF9UcmFpdHM+OjpfTm9uY29uc3RfaXRlcmF0b3IKK19Ob25fRGJnX2l0ZXIoY29uc3QgX0RCR19pdGVyPF9Db250YWluZXIsIF9UcmFpdHM+JiBfX2l0KQoreyByZXR1cm4gX19pdC5fTV9pdGVyYXRvcjsgfQorI2VuZGlmCisKKy8qCisgKiBIZWxwZXIgY2xhc3NlcyB0byBjaGVjayBpdGVyYXRvciByYW5nZSBvciBwb2ludGVyIHZhbGlkaXR5CisgKiBhdCBjb25zdHJ1Y3Rpb24gdGltZS4KKyAqLwordGVtcGxhdGUgPGNsYXNzIF9Db250YWluZXI+CitjbGFzcyBfX2NvbnN0cnVjdF9jaGVja2VyIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQ29udGFpbmVyOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7Citwcm90ZWN0ZWQ6CisgIF9fY29uc3RydWN0X2NoZWNrZXIoKSB7fQorCisgIF9fY29uc3RydWN0X2NoZWNrZXIoY29uc3QgdmFsdWVfdHlwZSogX19wKSB7CisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoKF9fcCAhPSAwKSwgX1N0bE1zZ19JTlZBTElEX0FSR1VNRU5UKQorICB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcj4KKyAgX19jb25zdHJ1Y3RfY2hlY2tlcihjb25zdCBfSW5wdXRJdGVyJiBfX2YsIGNvbnN0IF9JbnB1dEl0ZXImIF9fbCkgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lzSW50ZWdyYWw8X0lucHV0SXRlcj46Ol9SZXQgX0ludGVncmFsOworICAgIF9NX2NoZWNrX2Rpc3BhdGNoKF9fZiwgX19sLCBfSW50ZWdyYWwoKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0ludGVnZXI+CisgIHZvaWQgX01fY2hlY2tfZGlzcGF0Y2goX0ludGVnZXIgLCBfSW50ZWdlciwgY29uc3QgX190cnVlX3R5cGUmIC8qSXNJbnRlZ3JhbCovKSB7fQorCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgorICB2b2lkIF9NX2NoZWNrX2Rpc3BhdGNoKGNvbnN0IF9JbnB1dEl0ZXImIF9fZiwgY29uc3QgX0lucHV0SXRlciYgX19sLCBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qSXNJbnRlZ3JhbCovKSB7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX19jaGVja19yYW5nZShfX2YsX19sKSkKKyAgfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykgfHwgIWRlZmluZWQgKF9TVExQX05PX01FVEhPRF9TUEVDSUFMSVpBVElPTikKKyAgX19jb25zdHJ1Y3RfY2hlY2tlcihjb25zdCB2YWx1ZV90eXBlKiBfX2YsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbCkgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9fY2hlY2tfcHRyX3JhbmdlKF9fZixfX2wpKQorICB9CisKKyAgdHlwZWRlZiBfREJHX2l0ZXJfYmFzZTxfQ29udGFpbmVyPiBfSXRlVHlwZTsKKyAgX19jb25zdHJ1Y3RfY2hlY2tlcihjb25zdCBfSXRlVHlwZSYgX19mLCBjb25zdCBfSXRlVHlwZSYgX19sKSB7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX19jaGVja19yYW5nZShfX2YsX19sKSkKKyAgfQorI2VuZGlmCisjaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKQorICB+X19jb25zdHJ1Y3RfY2hlY2tlcigpe30KKyNlbmRpZgorfTsKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9PTERfSFBfSVRFUkFUT1JfUVVFUklFUykKKyMgIGlmIGRlZmluZWQgKF9TVExQX05FU1RFRF9UWVBFX1BBUkFNX0JVRykgfHxcCisgICAgIChkZWZpbmVkIChfX1NVTlBST19DQykgJiYgX19TVU5QUk9fQ0MgPCAweDYwMCkKKyMgICAgZGVmaW5lIF9TVExQX0RFQlVHX1VTRV9ESVNUSU5DVF9WQUxVRV9UWVBFX0hFTFBFUlMgMQorIyAgZW5kaWYKKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfQ29udGFpbmVyPgoraW5saW5lIHB0cmRpZmZfdCoKK2Rpc3RhbmNlX3R5cGUoY29uc3QgX1NUTFBfUFJJViBfREJHX2l0ZXJfYmFzZTxfQ29udGFpbmVyPiYpIHsgcmV0dXJuIChwdHJkaWZmX3QqKSAwOyB9CisKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9ERUJVR19VU0VfRElTVElOQ1RfVkFMVUVfVFlQRV9IRUxQRVJTKQordGVtcGxhdGUgPGNsYXNzIF9Db250YWluZXI+CitpbmxpbmUgX1NUTFBfVFlQRU5BTUVfT05fUkVUVVJOX1RZUEUgX1NUTFBfUFJJViBfREJHX2l0ZXJfYmFzZTxfQ29udGFpbmVyPjo6dmFsdWVfdHlwZSoKK3ZhbHVlX3R5cGUoY29uc3QgX1NUTFBfUFJJViBfREJHX2l0ZXJfYmFzZTxfQ29udGFpbmVyPiYpIHsKKyAgdHlwZWRlZiBfU1RMUF9UWVBFTkFNRSBfU1RMUF9QUklWIF9EQkdfaXRlcl9iYXNlPF9Db250YWluZXI+Ojp2YWx1ZV90eXBlIF9WYWw7CisgIHJldHVybiAoX1ZhbCopMDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Db250YWluZXI+CitpbmxpbmUgX1NUTFBfVFlQRU5BTUVfT05fUkVUVVJOX1RZUEUgX1NUTFBfUFJJViBfREJHX2l0ZXJfYmFzZTxfQ29udGFpbmVyPjo6X0l0ZXJhdG9yX2NhdGVnb3J5CitpdGVyYXRvcl9jYXRlZ29yeShjb25zdCBfU1RMUF9QUklWIF9EQkdfaXRlcl9iYXNlPF9Db250YWluZXI+JikgeworICB0eXBlZGVmIF9TVExQX1RZUEVOQU1FIF9TVExQX1BSSVYgX0RCR19pdGVyX2Jhc2U8X0NvbnRhaW5lcj46Ol9JdGVyYXRvcl9jYXRlZ29yeSBfQ2F0ZWdvcnk7CisgIHJldHVybiBfQ2F0ZWdvcnkoKTsKK30KKyMgIGVuZGlmCisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKworI2VuZGlmIC8qIF9TVExQX1VTRV9PTERfSFBfSVRFUkFUT1JfUVVFUklFUyAqLworCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLyogSU5URVJOQUxfSCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdGwvZGVidWcvX2xpc3QuaCBiL3N0bHBvcnQvc3RsL2RlYnVnL19saXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ1ZTFlNwotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc3RsL2RlYnVnL19saXN0LmgKQEAgLTAsMCArMSw0OTUgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisvKiBOT1RFOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBTVEwgaGVhZGVycy4KKyAqICAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuCisgKi8KKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9EQkdfTElTVF9ICisjZGVmaW5lIF9TVExQX0lOVEVSTkFMX0RCR19MSVNUX0gKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9BTEdPX0gKKyMgIGluY2x1ZGUgPHN0bC9fYWxnby5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfREJHX0lURVJBVE9SX0gKKyMgIGluY2x1ZGUgPHN0bC9kZWJ1Zy9faXRlcmF0b3IuaD4KKyNlbmRpZgorCisjZGVmaW5lIF9TVExQX05PTl9EQkdfTElTVCBfU1RMUF9QUklWIF9TVExQX05PTl9EQkdfTkFNRShsaXN0KSA8X1RwLCBfQWxsb2M+CisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisjaWYgZGVmaW5lZCAoX1NUTFBfREVCVUdfVVNFX0RJU1RJTkNUX1ZBTFVFX1RZUEVfSEVMUEVSUykKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK2lubGluZSBfVHAqCit2YWx1ZV90eXBlKGNvbnN0IF9TVExQX1BSSVYgX0RCR19pdGVyX2Jhc2U8IF9TVExQX05PTl9EQkdfTElTVCA+JikKK3sgcmV0dXJuIChfVHAqKTA7IH0KK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK2lubGluZSBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZworaXRlcmF0b3JfY2F0ZWdvcnkoY29uc3QgX1NUTFBfUFJJViBfREJHX2l0ZXJfYmFzZTwgX1NUTFBfTk9OX0RCR19MSVNUID4mKQoreyByZXR1cm4gYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcoKTsgfQorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIF9TVExQX0RGTF9UTVBMX1BBUkFNKF9BbGxvYywgYWxsb2NhdG9yPF9UcD4pID4KK2NsYXNzIGxpc3QgOgorI2lmICFkZWZpbmVkIChfX0RNQ19fKQorICAgICAgICAgICAgIHByaXZhdGUKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfX2NvbnN0cnVjdF9jaGVja2VyPF9TVExQX05PTl9EQkdfTElTVCA+CisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKQorICAgICAgICAgICAsIHB1YmxpYyBfX3N0bHBvcnRfY2xhc3M8bGlzdDxfVHAsIF9BbGxvYz4gPgorI2VuZGlmCit7CisgIHR5cGVkZWYgX1NUTFBfTk9OX0RCR19MSVNUIF9CYXNlOworICB0eXBlZGVmIGxpc3Q8X1RwLCBfQWxsb2M+IF9TZWxmOworICB0eXBlZGVmIF9TVExQX1BSSVYgX19jb25zdHJ1Y3RfY2hlY2tlcjxfU1RMUF9OT05fREJHX0xJU1QgPiBfQ29uc3RydWN0Q2hlY2s7CisKK3B1YmxpYzoKKyAgX19JTVBPUlRfQ09OVEFJTkVSX1RZUEVERUZTKF9CYXNlKQorCitwdWJsaWM6CisgIHR5cGVkZWYgX1NUTFBfUFJJViBfREJHX2l0ZXI8X0Jhc2UsIF9TVExQX1BSSVYgX0RiZ1RyYWl0czxfTm9uY29uc3RfdHJhaXRzPHZhbHVlX3R5cGU+ID4gPiBpdGVyYXRvcjsKKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9EQkdfaXRlcjxfQmFzZSwgX1NUTFBfUFJJViBfRGJnVHJhaXRzPF9Db25zdF90cmFpdHM8dmFsdWVfdHlwZT4gPiA+ICAgIGNvbnN0X2l0ZXJhdG9yOworCisgIF9TVExQX0RFQ0xBUkVfQklESVJFQ1RJT05BTF9SRVZFUlNFX0lURVJBVE9SUzsKKworcHJpdmF0ZToKKyAgX0Jhc2UgX01fbm9uX2RiZ19pbXBsOworICBfU1RMUF9QUklWIF9fb3duZWRfbGlzdCBfTV9pdGVyX2xpc3Q7CisKKyAgdm9pZCBfSW52YWxpZGF0ZV9pdGVyYXRvcihjb25zdCBpdGVyYXRvciYgX19pdCkKKyAgeyBfU1RMUF9QUklWIF9faW52YWxpZGF0ZV9pdGVyYXRvcigmX01faXRlcl9saXN0LCBfX2l0KTsgfQorICB2b2lkIF9JbnZhbGlkYXRlX2l0ZXJhdG9ycyhjb25zdCBpdGVyYXRvciYgX19maXJzdCwgY29uc3QgaXRlcmF0b3ImIF9fbGFzdCkKKyAgeyBfU1RMUF9QUklWIF9faW52YWxpZGF0ZV9yYW5nZSgmX01faXRlcl9saXN0LCBfX2ZpcnN0LCBfX2xhc3QpOyB9CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IgX0Jhc2VfaXRlcmF0b3I7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgbGlzdChjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkgOgorICAgIF9NX25vbl9kYmdfaW1wbChfX2EpLCBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KKworI2lmICFkZWZpbmVkKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCisgIGV4cGxpY2l0IGxpc3Qoc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3ggPSBfVHAoKSwKKyNlbHNlCisgIGxpc3Qoc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3gsCisjZW5kaWYgLyohX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCisgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9NX25vbl9kYmdfaW1wbChfX24sIF9feCwgX19hKSwgX01faXRlcl9saXN0KCZfTV9ub25fZGJnX2ltcGwpIHt9CisKKyNpZiBkZWZpbmVkKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCisgIGV4cGxpY2l0IGxpc3Qoc2l6ZV90eXBlIF9fbikKKyAgICA6IF9NX25vbl9kYmdfaW1wbChfX24pLCBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KKyNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0qLworCisjaWYgIWRlZmluZWQgKF9TVExQX05PX01PVkVfU0VNQU5USUMpCisgIGxpc3QoX19tb3ZlX3NvdXJjZTxfU2VsZj4gc3JjKQorICAgIDogX01fbm9uX2RiZ19pbXBsKF9fbW92ZV9zb3VyY2U8X0Jhc2U+KHNyYy5nZXQoKS5fTV9ub25fZGJnX2ltcGwpKSwKKyAgICAgIF9NX2l0ZXJfbGlzdCgmX01fbm9uX2RiZ19pbXBsKSB7CisjICBpZiBkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKSB8fCAoX1NUTFBfREVCVUdfTEVWRUwgPT0gX1NUTFBfU1RBTkRBUkRfREJHX0xFVkVMKQorICAgIHNyYy5nZXQoKS5fTV9pdGVyX2xpc3QuX0ludmFsaWRhdGVfYWxsKCk7CisjICBlbHNlCisgICAgc3JjLmdldCgpLl9NX2l0ZXJfbGlzdC5fU2V0X293bmVyKF9NX2l0ZXJfbGlzdCk7CisjICBlbmRpZgorICB9CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgbGlzdChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSBfU1RMUF9BTExPQ0FUT1JfVFlQRV9ERkwpCisgICAgOiBfQ29uc3RydWN0Q2hlY2soX19maXJzdCwgX19sYXN0KSwKKyAgICAgIF9NX25vbl9kYmdfaW1wbChfU1RMUF9QUklWIF9Ob25fRGJnX2l0ZXIoX19maXJzdCksIF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2xhc3QpLCBfX2EpLAorICAgICAgX01faXRlcl9saXN0KCZfTV9ub25fZGJnX2ltcGwpIHt9CisjICBpZiBkZWZpbmVkIChfU1RMUF9ORUVEU19FWFRSQV9URU1QTEFURV9DT05TVFJVQ1RPUlMpCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgbGlzdChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgOiBfQ29uc3RydWN0Q2hlY2soX19maXJzdCwgX19sYXN0KSwKKyAgICAgIF9NX25vbl9kYmdfaW1wbChfU1RMUF9QUklWIF9Ob25fRGJnX2l0ZXIoX19maXJzdCksIF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2xhc3QpKSwKKyAgICAgIF9NX2l0ZXJfbGlzdCgmX01fbm9uX2RiZ19pbXBsKSB7fQorIyAgZW5kaWYKKyNlbHNlCisKKyAgbGlzdChjb25zdCB2YWx1ZV90eXBlKiBfX2ZpcnN0LCBjb25zdCB2YWx1ZV90eXBlKiBfX2xhc3QsCisgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfQ29uc3RydWN0Q2hlY2soX19maXJzdCwgX19sYXN0KSwKKyAgICAgIF9NX25vbl9kYmdfaW1wbChfX2ZpcnN0LCBfX2xhc3QsIF9fYSksCisgICAgICBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KKyAgbGlzdChjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QsCisgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfQ29uc3RydWN0Q2hlY2soX19maXJzdCwgX19sYXN0KSwKKyAgICAgIF9NX25vbl9kYmdfaW1wbChfX2ZpcnN0Ll9NX2l0ZXJhdG9yLCBfX2xhc3QuX01faXRlcmF0b3IsIF9fYSksCisgICAgICBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KKworI2VuZGlmCisKKyAgbGlzdChjb25zdCBfU2VsZiYgX194KSA6CisgICAgX0NvbnN0cnVjdENoZWNrKF9feCksCisgICAgX01fbm9uX2RiZ19pbXBsKF9feC5fTV9ub25fZGJnX2ltcGwpICwgX01faXRlcl9saXN0KCZfTV9ub25fZGJnX2ltcGwpIHt9CisKKyAgX1NlbGYmIG9wZXJhdG9yPShjb25zdCBfU2VsZiYgX194KSB7CisgICAgaWYgKHRoaXMgIT0gJl9feCkgeworICAgICAgLy9TaG91bGQgbm90IGludmFsaWRhdGUgZW5kIGl0ZXJhdG9yCisgICAgICBfSW52YWxpZGF0ZV9pdGVyYXRvcnMoYmVnaW4oKSwgZW5kKCkpOworICAgICAgX01fbm9uX2RiZ19pbXBsID0gX194Ll9NX25vbl9kYmdfaW1wbDsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5nZXRfYWxsb2NhdG9yKCk7IH0KKworICBpdGVyYXRvciBiZWdpbigpICAgICAgICAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5iZWdpbigpKTsgfQorICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5iZWdpbigpKTsgfQorCisgIGl0ZXJhdG9yIGVuZCgpICAgICAgICAgICAgICAgeyByZXR1cm4gaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLmVuZCgpKTsgfQorICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5lbmQoKSk7IH0KKworICByZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisgIHJldmVyc2VfaXRlcmF0b3IgcmVuZCgpICAgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorCisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3QgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgY29uc3QgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorCisgIHNpemVfdHlwZSBzaXplKCkgY29uc3QgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLnNpemUoKTsgfQorICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwubWF4X3NpemUoKTsgfQorICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLmVtcHR5KCk7IH0KKworICAvLyB0aG9zZSBhcmUgaGVyZSB0byBlbmZvcmNlIGNoZWNraW5nCisgIHJlZmVyZW5jZSBmcm9udCgpIHsKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghZW1wdHkoKSwgX1N0bE1zZ19FTVBUWV9DT05UQUlORVIpCisgICAgcmV0dXJuICpiZWdpbigpOworICB9CisgIGNvbnN0X3JlZmVyZW5jZSBmcm9udCgpIGNvbnN0IHsKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghZW1wdHkoKSwgX1N0bE1zZ19FTVBUWV9DT05UQUlORVIpCisgICAgcmV0dXJuICpiZWdpbigpOworICB9CisgIHJlZmVyZW5jZSBiYWNrKCkgeworICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFlbXB0eSgpLCBfU3RsTXNnX0VNUFRZX0NPTlRBSU5FUikKKyAgICByZXR1cm4gKigtLWVuZCgpKTsKKyAgfQorICBjb25zdF9yZWZlcmVuY2UgYmFjaygpIGNvbnN0IHsKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghZW1wdHkoKSwgX1N0bE1zZ19FTVBUWV9DT05UQUlORVIpCisgICAgcmV0dXJuICooLS1lbmQoKSk7CisgIH0KKworICB2b2lkIHN3YXAoX1NlbGYmIF9feCkgeworICAgIF9NX2l0ZXJfbGlzdC5fU3dhcF9vd25lcnMoX194Ll9NX2l0ZXJfbGlzdCk7CisgICAgX01fbm9uX2RiZ19pbXBsLnN3YXAoX194Ll9NX25vbl9kYmdfaW1wbCk7CisgIH0KKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUEFSVElBTF9TUEVDX1dPUktBUk9VTkQpICYmICFkZWZpbmVkIChfU1RMUF9GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIpCisgIHZvaWQgX01fc3dhcF93b3JrYXJvdW5kKF9TZWxmJiBfX3gpIHsgc3dhcChfX3gpOyB9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pICYmICFkZWZpbmVkKF9TVExQX05PX0FOQUNIUk9OSVNNUykKKyAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBjb25zdCBfVHAmIF9feCA9IF9UcCgpKSB7CisjZWxzZQorICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIGNvbnN0IF9UcCYgX194KSB7CisjZW5kaWYgLyohX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSAmJiAhX1NUTFBfTk9fQU5BQ0hST05JU01TKi8KKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfb3duZXIoJl9NX2l0ZXJfbGlzdCxfX3BvcykpCisgICAgcmV0dXJuIGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsX01fbm9uX2RiZ19pbXBsLmluc2VydChfX3Bvcy5fTV9pdGVyYXRvciwgX194KSApOworICB9CisKKyNpZiBkZWZpbmVkKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pICYmICFkZWZpbmVkKF9TVExQX05PX0FOQUNIUk9OSVNNUykKKyAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zKSB7IHJldHVybiBpbnNlcnQoX19wb3MsIF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQoX1RwKSk7IH0KKyNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0gJiYgIV9TVExQX05PX0FOQUNIUk9OSVNNUyovCisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpIHsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfb3duZXIoJl9NX2l0ZXJfbGlzdCwgX19wb3MpKQorICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICAgIF9NX25vbl9kYmdfaW1wbC5pbnNlcnQoX19wb3MuX01faXRlcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9Ob25fRGJnX2l0ZXIoX19maXJzdCksIF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2xhc3QpKTsKKyAgfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIGNvbnN0IF9UcCogX19maXJzdCwgY29uc3QgX1RwKiBfX2xhc3QpIHsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfb3duZXIoJl9NX2l0ZXJfbGlzdCxfX3BvcykpCisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3B0cl9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICAgIF9NX25vbl9kYmdfaW1wbC5pbnNlcnQoX19wb3MuX01faXRlcmF0b3IsIF9fZmlyc3QsIF9fbGFzdCk7CisgIH0KKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpIHx8ICFkZWZpbmVkIChfU1RMUF9OT19NRVRIT0RfU1BFQ0lBTElaQVRJT04pCisgIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLAorICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpIHsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfb3duZXIoJl9NX2l0ZXJfbGlzdCwgX19wb3MpKQorICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorIyAgaWYgKF9TVExQX0RFQlVHX0xFVkVMID09IF9TVExQX1NUQU5EQVJEX0RCR19MRVZFTCkKKyAgICBfU1RMUF9TVERfREVCVUdfQ0hFQ0soX19jaGVja19pZl9ub3Rfb3duZXIoJl9NX2l0ZXJfbGlzdCwgX19maXJzdCkpCisjICBlbmRpZgorICAgIF9NX25vbl9kYmdfaW1wbC5pbnNlcnQoX19wb3MuX01faXRlcmF0b3IsIF9fZmlyc3QuX01faXRlcmF0b3IsIF9fbGFzdC5fTV9pdGVyYXRvcik7CisgIH0KKyAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3MsCisgICAgICAgICAgICAgIGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LCBfX3BvcykpCisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisjICBpZiAoX1NUTFBfREVCVUdfTEVWRUwgPT0gX1NUTFBfU1RBTkRBUkRfREJHX0xFVkVMKQorICAgIF9TVExQX1NURF9ERUJVR19DSEVDSyhfX2NoZWNrX2lmX25vdF9vd25lcigmX01faXRlcl9saXN0LCBfX2ZpcnN0KSkKKyMgIGVuZGlmCisgICAgX01fbm9uX2RiZ19pbXBsLmluc2VydChfX3Bvcy5fTV9pdGVyYXRvciwgX19maXJzdC5fTV9pdGVyYXRvciwgX19sYXN0Ll9NX2l0ZXJhdG9yKTsKKyAgfQorI2VuZGlmCisKKyAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX194KSB7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX2lmX293bmVyKCZfTV9pdGVyX2xpc3QsX19wb3MpKQorICAgIF9NX25vbl9kYmdfaW1wbC5pbnNlcnQoX19wb3MuX01faXRlcmF0b3IsIF9fbiwgX194KTsKKyAgfQorCisgIHZvaWQgcHVzaF9iYWNrKGNvbnN0X3JlZmVyZW5jZSBfX3gpIHsgX01fbm9uX2RiZ19pbXBsLnB1c2hfYmFjayhfX3gpOyB9CisgIHZvaWQgcG9wX2JhY2soKSB7CisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoIWVtcHR5KCksIF9TdGxNc2dfRU1QVFlfQ09OVEFJTkVSKQorICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9yKGVuZCgpKTsKKyAgICBfTV9ub25fZGJnX2ltcGwucG9wX2JhY2soKTsKKyAgfQorCisgIHZvaWQgcHVzaF9mcm9udChjb25zdF9yZWZlcmVuY2UgX194KSB7IF9NX25vbl9kYmdfaW1wbC5wdXNoX2Zyb250KF9feCk7IH0KKyAgdm9pZCBwb3BfZnJvbnQoKSB7CisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoIWVtcHR5KCksIF9TdGxNc2dfRU1QVFlfQ09OVEFJTkVSKQorICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9yKGJlZ2luKCkpOworICAgIF9NX25vbl9kYmdfaW1wbC5wb3BfZnJvbnQoKTsKKyAgfQorCisgIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIF9fcG9zKSB7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfRGVyZWZlcmVuY2VhYmxlKF9fcG9zKSkKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfb3duZXIoJl9NX2l0ZXJfbGlzdCxfX3BvcykpCisgICAgX0ludmFsaWRhdGVfaXRlcmF0b3IoX19wb3MpOworICAgIHJldHVybiBpdGVyYXRvcigmX01faXRlcl9saXN0LF9NX25vbl9kYmdfaW1wbC5lcmFzZShfX3Bvcy5fTV9pdGVyYXRvcikpOworICB9CisgIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QsIGJlZ2luKCksIGVuZCgpKSkKKyAgICBfSW52YWxpZGF0ZV9pdGVyYXRvcnMoX19maXJzdCwgX19sYXN0KTsKKyAgICByZXR1cm4gaXRlcmF0b3IgKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5lcmFzZShfX2ZpcnN0Ll9NX2l0ZXJhdG9yLCBfX2xhc3QuX01faXRlcmF0b3IpKTsKKyAgfQorCisjaWYgIWRlZmluZWQoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKKyAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9fbmV3X3NpemUsIGNvbnN0IF9UcCYgX194ID0gX1RwKCkpIHsKKyNlbHNlCisgIHZvaWQgcmVzaXplKHNpemVfdHlwZSBfX25ld19zaXplLCBjb25zdCBfVHAmIF9feCkgeworI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCisgICAgX0Jhc2VfaXRlcmF0b3IgX19pID0gX01fbm9uX2RiZ19pbXBsLmJlZ2luKCk7CisgICAgc2l6ZV90eXBlIF9fbGVuID0gMDsKKyAgICBmb3IgKCA7IF9faSAhPSBfTV9ub25fZGJnX2ltcGwuZW5kKCkgJiYgX19sZW4gPCBfX25ld19zaXplOyArK19faSwgKytfX2xlbik7CisKKyAgICBpZiAoX19sZW4gPT0gX19uZXdfc2l6ZSkKKyAgICAgIGVyYXNlKGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9faSksIGVuZCgpKTsKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBfX2kgPT0gZW5kKCkKKyAgICAgIF9NX25vbl9kYmdfaW1wbC5pbnNlcnQoX01fbm9uX2RiZ19pbXBsLmVuZCgpLCBfX25ld19zaXplIC0gX19sZW4sIF9feCk7CisgIH0KKworI2lmIGRlZmluZWQoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKKyAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9fbmV3X3NpemUpIHsgcmVzaXplKF9fbmV3X3NpemUsIF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQoX1RwKSk7IH0KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICB2b2lkIGFzc2lnbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpIHsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKKyAgICBfTV9ub25fZGJnX2ltcGwuYXNzaWduKF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2ZpcnN0KSwgX1NUTFBfUFJJViBfTm9uX0RiZ19pdGVyKF9fbGFzdCkpOworICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9ycyhiZWdpbigpLCBlbmQoKSk7CisgIH0KKyNlbHNlCisgIHZvaWQgYXNzaWduKGNvbnN0IF9UcCogX19maXJzdCwgY29uc3QgX1RwKiBfX2xhc3QpIHsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcHRyX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgICAgX01fbm9uX2RiZ19pbXBsLmFzc2lnbihfX2ZpcnN0LCBfX2xhc3QpOworICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9ycyhiZWdpbigpLCBlbmQoKSk7CisgIH0KKworICB2b2lkIGFzc2lnbihpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpIHsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKKyAgICBfTV9ub25fZGJnX2ltcGwuYXNzaWduKF9fZmlyc3QuX01faXRlcmF0b3IsIF9fbGFzdC5fTV9pdGVyYXRvcik7CisgICAgX0ludmFsaWRhdGVfaXRlcmF0b3JzKGJlZ2luKCksIGVuZCgpKTsKKyAgfQorCisgIHZvaWQgYXNzaWduKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICAgIF9NX25vbl9kYmdfaW1wbC5hc3NpZ24oX19maXJzdC5fTV9pdGVyYXRvciwgX19sYXN0Ll9NX2l0ZXJhdG9yKTsKKyAgICBfSW52YWxpZGF0ZV9pdGVyYXRvcnMoYmVnaW4oKSwgZW5kKCkpOworICB9CisjZW5kaWYKKworICB2b2lkIGFzc2lnbihzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9fdmFsKSB7CisgICAgX0ludmFsaWRhdGVfaXRlcmF0b3JzKGJlZ2luKCksIGVuZCgpKTsKKyAgICBfTV9ub25fZGJnX2ltcGwuYXNzaWduKF9fbiwgX192YWwpOworICB9CisKKyAgdm9pZCByZW1vdmUoY29uc3QgX1RwJiBfX3gpIHsKKyAgICBfQmFzZV9pdGVyYXRvciBfX2ZpcnN0ID0gX01fbm9uX2RiZ19pbXBsLmJlZ2luKCksIF9fbGFzdCA9IF9NX25vbl9kYmdfaW1wbC5lbmQoKTsKKyAgICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QpIHsKKyAgICAgIF9CYXNlX2l0ZXJhdG9yIF9fbmV4dCA9IF9fZmlyc3Q7CisgICAgICArK19fbmV4dDsKKyAgICAgIGlmIChfX3ggPT0gKl9fZmlyc3QpIHsKKyAgICAgICAgX0ludmFsaWRhdGVfaXRlcmF0b3IoaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX19maXJzdCkpOworICAgICAgICBfTV9ub25fZGJnX2ltcGwuZXJhc2UoX19maXJzdCk7CisgICAgICB9CisgICAgICBfX2ZpcnN0ID0gX19uZXh0OworICAgIH0KKyAgfQorCisgIHZvaWQgY2xlYXIoKSB7CisgICAgX0ludmFsaWRhdGVfaXRlcmF0b3JzKGJlZ2luKCksIGVuZCgpKTsKKyAgICBfTV9ub25fZGJnX2ltcGwuY2xlYXIoKTsKKyAgfQorCitwdWJsaWM6CisgIHZvaWQgc3BsaWNlKGl0ZXJhdG9yIF9fcG9zLCBfU2VsZiYgX194KSB7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX2lmX293bmVyKCZfTV9pdGVyX2xpc3QsX19wb3MpKQorICAgIF9NX25vbl9kYmdfaW1wbC5zcGxpY2UoX19wb3MuX01faXRlcmF0b3IsIF9feC5fTV9ub25fZGJnX2ltcGwpOworI2lmIChfU1RMUF9ERUJVR19MRVZFTCAhPSBfU1RMUF9TVEFOREFSRF9EQkdfTEVWRUwpCisgICAgaWYgKGdldF9hbGxvY2F0b3IoKSA9PSBfX3guZ2V0X2FsbG9jYXRvcigpKQorICAgICAgX194Ll9NX2l0ZXJfbGlzdC5fU2V0X293bmVyKF9NX2l0ZXJfbGlzdCk7CisgICAgZWxzZQorI2VuZGlmCisgICAgICAvLyBTdGQ6IDIzLjIuMi40OjQKKyAgICAgIC8vIGVuZCBpdGVyYXRvciBpcyBub3QgaW52YWxpZGF0ZWQ6CisgICAgICBfX3guX0ludmFsaWRhdGVfaXRlcmF0b3JzKF9feC5iZWdpbigpLCBfX3guZW5kKCkpOworICB9CisKKyAgdm9pZCBzcGxpY2UoaXRlcmF0b3IgX19wb3MsIF9TZWxmJiBfX3gsIGl0ZXJhdG9yIF9faSkgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LF9fcG9zKSkKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9EZXJlZmVyZW5jZWFibGUoX19pKSkKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfb3duZXIoJihfX3guX01faXRlcl9saXN0KSxfX2kpKQorICAgIF9NX25vbl9kYmdfaW1wbC5zcGxpY2UoX19wb3MuX01faXRlcmF0b3IsIF9feC5fTV9ub25fZGJnX2ltcGwsIF9faS5fTV9pdGVyYXRvcik7CisjaWYgKF9TVExQX0RFQlVHX0xFVkVMICE9IF9TVExQX1NUQU5EQVJEX0RCR19MRVZFTCkKKyAgICBpZiAoZ2V0X2FsbG9jYXRvcigpID09IF9feC5nZXRfYWxsb2NhdG9yKCkpCisgICAgICBfU1RMUF9QUklWIF9fY2hhbmdlX2l0ZV9vd25lcihfX2ksICZfTV9pdGVyX2xpc3QpOworICAgIGVsc2UKKyNlbmRpZgorICAgICAgLy8gU3RkOiAyMy4yLjIuNDo3CisgICAgICBfX3guX0ludmFsaWRhdGVfaXRlcmF0b3IoX19pKTsKKyAgfQorCisgIHZvaWQgc3BsaWNlKGl0ZXJhdG9yIF9fcG9zLCBfU2VsZiYgX194LCBpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpIHsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfb3duZXIoJl9NX2l0ZXJfbGlzdCwgX19wb3MpKQorICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QsIF9feC5iZWdpbigpLCBfX3guZW5kKCkpKQorICAgIF9TVExQX0RFQlVHX0NIRUNLKHRoaXMgPT0gJl9feCA/ICFfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19wb3MsIF9fZmlyc3QsIF9fbGFzdCkgOiB0cnVlKQorI2lmIChfU1RMUF9ERUJVR19MRVZFTCAhPSBfU1RMUF9TVEFOREFSRF9EQkdfTEVWRUwpCisgICAgaWYgKHRoaXMtPmdldF9hbGxvY2F0b3IoKSA9PSBfX3guZ2V0X2FsbG9jYXRvcigpKQorICAgICAgX1NUTFBfUFJJViBfX2NoYW5nZV9yYW5nZV9vd25lcihfX2ZpcnN0LCBfX2xhc3QsICZfTV9pdGVyX2xpc3QpOworICAgIGVsc2UKKyNlbmRpZgorICAgICAgLy8gU3RkOiAyMy4yLjIuNDoxMgorICAgICAgX194Ll9JbnZhbGlkYXRlX2l0ZXJhdG9ycyhfX2ZpcnN0LCBfX2xhc3QpOworICAgIF9NX25vbl9kYmdfaW1wbC5zcGxpY2UoX19wb3MuX01faXRlcmF0b3IsIF9feC5fTV9ub25fZGJnX2ltcGwsIF9fZmlyc3QuX01faXRlcmF0b3IsIF9fbGFzdC5fTV9pdGVyYXRvcik7CisgIH0KKworICB2b2lkIG1lcmdlKF9TZWxmJiBfX3gpIHsKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9TVEQ6OmlzX3NvcnRlZChiZWdpbigpLl9NX2l0ZXJhdG9yLCBlbmQoKS5fTV9pdGVyYXRvcikpCisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfU1REOjppc19zb3J0ZWQoX194LmJlZ2luKCkuX01faXRlcmF0b3IsIF9feC5lbmQoKS5fTV9pdGVyYXRvcikpCisjZW5kaWYKKyAgICBfTV9ub25fZGJnX2ltcGwubWVyZ2UoX194Ll9NX25vbl9kYmdfaW1wbCk7CisgICAgaWYgKHRoaXMtPmdldF9hbGxvY2F0b3IoKSA9PSBfX3guZ2V0X2FsbG9jYXRvcigpKSB7CisgICAgICBfX3guX01faXRlcl9saXN0Ll9TZXRfb3duZXIoX01faXRlcl9saXN0KTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBfX3guX0ludmFsaWRhdGVfaXRlcmF0b3JzKF9feC5iZWdpbigpLCBfX3guZW5kKCkpOworICAgIH0KKyAgfQorICB2b2lkIHJldmVyc2UoKSB7CisgICAgX01fbm9uX2RiZ19pbXBsLnJldmVyc2UoKTsKKyAgfQorICB2b2lkIHVuaXF1ZSgpIHsKKyAgICBfQmFzZV9pdGVyYXRvciBfX2ZpcnN0ID0gX01fbm9uX2RiZ19pbXBsLmJlZ2luKCksIF9fbGFzdCA9IF9NX25vbl9kYmdfaW1wbC5lbmQoKTsKKyAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QpIHJldHVybjsKKyAgICBfQmFzZV9pdGVyYXRvciBfX25leHQgPSBfX2ZpcnN0OworICAgIHdoaWxlICgrK19fbmV4dCAhPSBfX2xhc3QpIHsKKyAgICAgIGlmICgqX19maXJzdCA9PSAqX19uZXh0KSB7CisgICAgICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9yKGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9fbmV4dCkpOworICAgICAgICBfTV9ub25fZGJnX2ltcGwuZXJhc2UoX19uZXh0KTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgX19maXJzdCA9IF9fbmV4dDsKKyAgICAgIF9fbmV4dCA9IF9fZmlyc3Q7CisgICAgfQorICB9CisgIHZvaWQgc29ydCgpIHsKKyAgICBfTV9ub25fZGJnX2ltcGwuc29ydCgpOworICB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX1ByZWRpY2F0ZT4KKyAgdm9pZCByZW1vdmVfaWYoX1ByZWRpY2F0ZSBfX3ByZWQpIHsKKyAgICBfQmFzZV9pdGVyYXRvciBfX2ZpcnN0ID0gX01fbm9uX2RiZ19pbXBsLmJlZ2luKCksIF9fbGFzdCA9IF9NX25vbl9kYmdfaW1wbC5lbmQoKTsKKyAgICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QpIHsKKyAgICAgIF9CYXNlX2l0ZXJhdG9yIF9fbmV4dCA9IF9fZmlyc3Q7CisgICAgICArK19fbmV4dDsKKyAgICAgIGlmIChfX3ByZWQoKl9fZmlyc3QpKSB7CisgICAgICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9yKGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9fZmlyc3QpKTsKKyAgICAgICAgX01fbm9uX2RiZ19pbXBsLmVyYXNlKF9fZmlyc3QpOworICAgICAgfQorICAgICAgX19maXJzdCA9IF9fbmV4dDsKKyAgICB9CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0JpbmFyeVByZWRpY2F0ZT4KKyAgdm9pZCB1bmlxdWUoX0JpbmFyeVByZWRpY2F0ZSBfX2JpbmFyeV9wcmVkKSB7CisgICAgX0Jhc2VfaXRlcmF0b3IgX19maXJzdCA9IF9NX25vbl9kYmdfaW1wbC5iZWdpbigpLCBfX2xhc3QgPSBfTV9ub25fZGJnX2ltcGwuZW5kKCk7CisgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KSByZXR1cm47CisgICAgX0Jhc2VfaXRlcmF0b3IgX19uZXh0ID0gX19maXJzdDsKKyAgICB3aGlsZSAoKytfX25leHQgIT0gX19sYXN0KSB7CisgICAgICBpZiAoX19iaW5hcnlfcHJlZCgqX19maXJzdCwgKl9fbmV4dCkpIHsKKyAgICAgICAgX0ludmFsaWRhdGVfaXRlcmF0b3IoaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX19uZXh0KSk7CisgICAgICAgIF9NX25vbl9kYmdfaW1wbC5lcmFzZShfX25leHQpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBfX2ZpcnN0ID0gX19uZXh0OworICAgICAgX19uZXh0ID0gX19maXJzdDsKKyAgICB9CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1N0cmljdFdlYWtPcmRlcmluZz4KKyAgdm9pZCBtZXJnZShfU2VsZiYgX194LCBfU3RyaWN0V2Vha09yZGVyaW5nIF9fY29tcCkgeworI2lmICFkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQorICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1NURDo6aXNfc29ydGVkKF9NX25vbl9kYmdfaW1wbC5iZWdpbigpLCBfTV9ub25fZGJnX2ltcGwuZW5kKCksIF9fY29tcCkpCisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfU1REOjppc19zb3J0ZWQoX194LmJlZ2luKCkuX01faXRlcmF0b3IsIF9feC5lbmQoKS5fTV9pdGVyYXRvciwgX19jb21wKSkKKyNlbmRpZgorICAgIF9NX25vbl9kYmdfaW1wbC5tZXJnZShfX3guX01fbm9uX2RiZ19pbXBsLCBfX2NvbXApOworICAgIGlmICh0aGlzLT5nZXRfYWxsb2NhdG9yKCkgPT0gX194LmdldF9hbGxvY2F0b3IoKSkgeworICAgICAgX194Ll9NX2l0ZXJfbGlzdC5fU2V0X293bmVyKF9NX2l0ZXJfbGlzdCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgX194Ll9JbnZhbGlkYXRlX2l0ZXJhdG9ycyhfX3guYmVnaW4oKSwgX194LmVuZCgpKTsKKyAgICB9CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1N0cmljdFdlYWtPcmRlcmluZz4KKyAgdm9pZCBzb3J0KF9TdHJpY3RXZWFrT3JkZXJpbmcgX19jb21wKSB7CisgICAgX01fbm9uX2RiZ19pbXBsLnNvcnQoX19jb21wKTsKKyAgfQorI2VuZGlmCit9OworCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI3VuZGVmIF9TVExQX05PTl9EQkdfTElTVAorCisjZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfTElTVF9IICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9kZWJ1Zy9fc2xpc3QuaCBiL3N0bHBvcnQvc3RsL2RlYnVnL19zbGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZWFmMzYKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9kZWJ1Zy9fc2xpc3QuaApAQCAtMCwwICsxLDYxMyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworLyogTk9URTogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgU1RMIGhlYWRlcnMuCisgKiAgIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LgorICovCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfREJHX1NMSVNUX0gKKyNkZWZpbmUgX1NUTFBfSU5URVJOQUxfREJHX1NMSVNUX0gKKworI2lmbmRlZiBfU1RMUF9EQkdfSVRFUkFUT1JfSAorIyAgaW5jbHVkZSA8c3RsL2RlYnVnL19pdGVyYXRvci5oPgorI2VuZGlmCisKKyNkZWZpbmUgX1NUTFBfTk9OX0RCR19TTElTVCBfU1RMUF9QUklWIF9TVExQX05PTl9EQkdfTkFNRShzbGlzdCkgPF9UcCwgX0FsbG9jPgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHX1VTRV9ESVNUSU5DVF9WQUxVRV9UWVBFX0hFTFBFUlMpCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgX1RwKgordmFsdWVfdHlwZShjb25zdCBfU1RMUF9QUklWIF9EQkdfaXRlcl9iYXNlPCBfU1RMUF9OT05fREJHX1NMSVNUID4mKQoreyByZXR1cm4gKF9UcCopMDsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgZm9yd2FyZF9pdGVyYXRvcl90YWcKK2l0ZXJhdG9yX2NhdGVnb3J5KGNvbnN0IF9TVExQX1BSSVYgX0RCR19pdGVyX2Jhc2U8IF9TVExQX05PTl9EQkdfU0xJU1QgPiYpCit7IHJldHVybiBmb3J3YXJkX2l0ZXJhdG9yX3RhZygpOyB9CisjZW5kaWYKKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCisvKgorICogc2xpc3Qgc3BlY2lhbCBkZWJ1ZyB0cmFpdHMgdmVyc2lvbi4KKyAqLwordGVtcGxhdGUgPGNsYXNzIF9UcmFpdHM+CitzdHJ1Y3QgX1NsaXN0RGJnVHJhaXRzIDogX1RyYWl0cyB7CisgIHR5cGVkZWYgX1NsaXN0RGJnVHJhaXRzPHR5cGVuYW1lIF9UcmFpdHM6Ol9Db25zdFRyYWl0cz4gX0NvbnN0VHJhaXRzOworICB0eXBlZGVmIF9TbGlzdERiZ1RyYWl0czx0eXBlbmFtZSBfVHJhaXRzOjpfTm9uQ29uc3RUcmFpdHM+IF9Ob25Db25zdFRyYWl0czsKKworICAvKgorICAgKiBXZSBkb24ndCB3YW50IHRoZSBiZWZvcmVfYmVnaW4gaXRlcmF0b3IgdG8gcmV0dXJuIGZhbHNlIGF0IF9EZXJlZmVyZW5jZWFibGUKKyAgICogY2FsbCB0byBkbyBub3QgYnJlYWsgdGhlIGN1cnJlbnQgZGVidWcgZnJhbWV3b3JrIGJ1dCBjYWxsaW5nICogb3BlcmF0b3Igc2hvdWxkCisgICAqIGZhaWwuCisgICAqLworICB0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgorICBzdGF0aWMgYm9vbCBfQ2hlY2soY29uc3QgX0l0ZXJhdG9yJiBfX2l0KQorICB7IHJldHVybiAhKF9faXQuX01faXRlcmF0b3IgPT0gKF9faXQuX0dldF9jb250YWluZXJfcHRyKCkpLT5iZWZvcmVfYmVnaW4oKSk7IH0KK307CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBfU1RMUF9ERkxfVE1QTF9QQVJBTShfQWxsb2MsIGFsbG9jYXRvcjxfVHA+KSA+CitjbGFzcyBzbGlzdCA6CisjaWYgIWRlZmluZWQgKF9fRE1DX18pCisgICAgICAgICAgICAgcHJpdmF0ZQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fY29uc3RydWN0X2NoZWNrZXI8X1NUTFBfTk9OX0RCR19TTElTVCA+CisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKQorICAgICAgICAgICAgLCBwdWJsaWMgX19zdGxwb3J0X2NsYXNzPHNsaXN0PF9UcCwgX0FsbG9jPiA+CisjZW5kaWYKK3sKK3ByaXZhdGU6CisgIHR5cGVkZWYgX1NUTFBfTk9OX0RCR19TTElTVCBfQmFzZTsKKyAgdHlwZWRlZiBzbGlzdDxfVHAsX0FsbG9jPiBfU2VsZjsKKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9fY29uc3RydWN0X2NoZWNrZXI8X1NUTFBfTk9OX0RCR19TTElTVCA+IF9Db25zdHJ1Y3RDaGVjazsKKworcHVibGljOgorCisgIF9fSU1QT1JUX0NPTlRBSU5FUl9UWVBFREVGUyhfQmFzZSkKKworICB0eXBlZGVmIF9TVExQX1BSSVYgX0RCR19pdGVyPF9CYXNlLCBfU1RMUF9QUklWIF9TbGlzdERiZ1RyYWl0czxfTm9uY29uc3RfdHJhaXRzPHZhbHVlX3R5cGU+ID4gPiBpdGVyYXRvcjsKKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9EQkdfaXRlcjxfQmFzZSwgX1NUTFBfUFJJViBfU2xpc3REYmdUcmFpdHM8X0NvbnN0X3RyYWl0czx2YWx1ZV90eXBlPiA+ID4gICAgY29uc3RfaXRlcmF0b3I7CisKKyAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5nZXRfYWxsb2NhdG9yKCk7IH0KK3ByaXZhdGU6CisgIF9CYXNlIF9NX25vbl9kYmdfaW1wbDsKKyAgX1NUTFBfUFJJViBfX293bmVkX2xpc3QgX01faXRlcl9saXN0OworCisgIHZvaWQgX0ludmFsaWRhdGVfaXRlcmF0b3IoY29uc3QgaXRlcmF0b3ImIF9faXQpCisgIHsgX1NUTFBfUFJJViBfX2ludmFsaWRhdGVfaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX19pdCk7IH0KKyAgdm9pZCBfSW52YWxpZGF0ZV9pdGVyYXRvcnMoY29uc3QgaXRlcmF0b3ImIF9fZmlyc3QsIGNvbnN0IGl0ZXJhdG9yJiBfX2xhc3QpCisgIHsgX1NUTFBfUFJJViBfX2ludmFsaWRhdGVfcmFuZ2UoJl9NX2l0ZXJfbGlzdCwgX19maXJzdCwgX19sYXN0KTsgfQorCisgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yIF9CYXNlX2l0ZXJhdG9yOworCitwdWJsaWM6CisgIGV4cGxpY2l0IHNsaXN0KGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX01fbm9uX2RiZ19pbXBsKF9fYSkgLCBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KKworI2lmICFkZWZpbmVkKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCisgIGV4cGxpY2l0IHNsaXN0KHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCA9IF9UcCgpLAorI2Vsc2UKKyAgc2xpc3Qoc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX194LAorI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCisgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSAgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9NX25vbl9kYmdfaW1wbChfX24sIF9feCwgX19hKSwgX01faXRlcl9saXN0KCZfTV9ub25fZGJnX2ltcGwpIHt9CisKKyNpZiBkZWZpbmVkKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCisgIGV4cGxpY2l0IHNsaXN0KHNpemVfdHlwZSBfX24pIDogX01fbm9uX2RiZ19pbXBsKF9fbikgLCBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KKyNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0qLworCisjaWYgIWRlZmluZWQgKF9TVExQX05PX01PVkVfU0VNQU5USUMpCisgIHNsaXN0KF9fbW92ZV9zb3VyY2U8X1NlbGY+IHNyYykKKyAgICA6IF9NX25vbl9kYmdfaW1wbChfX21vdmVfc291cmNlPF9CYXNlPihzcmMuZ2V0KCkuX01fbm9uX2RiZ19pbXBsKSksCisgICAgICBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkgeworIyAgaWYgZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykgfHwgKF9TVExQX0RFQlVHX0xFVkVMID09IF9TVExQX1NUQU5EQVJEX0RCR19MRVZFTCkKKyAgICBzcmMuZ2V0KCkuX01faXRlcl9saXN0Ll9JbnZhbGlkYXRlX2FsbCgpOworIyAgZWxzZQorICAgIHNyYy5nZXQoKS5fTV9pdGVyX2xpc3QuX1NldF9vd25lcihfTV9pdGVyX2xpc3QpOworIyAgZW5kaWYKKyAgfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICAvLyBXZSBkb24ndCBuZWVkIGFueSBkaXNwYXRjaGluZyB0cmlja3MgaGVyZSwgYmVjYXVzZSBfTV9pbnNlcnRfYWZ0ZXJfcmFuZ2UKKyAgLy8gYWxyZWFkeSBkb2VzIHRoZW0uCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgc2xpc3QoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hIF9TVExQX0FMTE9DQVRPUl9UWVBFX0RGTCkKKyAgICA6IF9Db25zdHJ1Y3RDaGVjayhfX2ZpcnN0LCBfX2xhc3QpLAorICAgICAgX01fbm9uX2RiZ19pbXBsKF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2ZpcnN0KSwgX1NUTFBfUFJJViBfTm9uX0RiZ19pdGVyKF9fbGFzdCksIF9fYSksCisgICAgICBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KKyMgIGlmIGRlZmluZWQgKF9TVExQX05FRURTX0VYVFJBX1RFTVBMQVRFX0NPTlNUUlVDVE9SUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICBzbGlzdChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgOiBfQ29uc3RydWN0Q2hlY2soX19maXJzdCwgX19sYXN0KSwKKyAgICAgIF9NX25vbl9kYmdfaW1wbChfU1RMUF9QUklWIF9Ob25fRGJnX2l0ZXIoX19maXJzdCksIF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2xhc3QpKSwKKyAgICAgIF9NX2l0ZXJfbGlzdCgmX01fbm9uX2RiZ19pbXBsKSB7fQorIyAgZW5kaWYKKyNlbHNlCisKKyAgc2xpc3QoY29uc3QgdmFsdWVfdHlwZSogX19maXJzdCwgY29uc3QgdmFsdWVfdHlwZSogX19sYXN0LAorICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gIGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfQ29uc3RydWN0Q2hlY2soX19maXJzdCwgX19sYXN0KSwKKyAgICAgIF9NX25vbl9kYmdfaW1wbChfX2ZpcnN0LCBfX2xhc3QsIF9fYSksCisgICAgICBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KKworICBzbGlzdChjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QsCisgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpICkKKyAgICA6IF9Db25zdHJ1Y3RDaGVjayhfX2ZpcnN0LCBfX2xhc3QpLAorICAgICAgX01fbm9uX2RiZ19pbXBsKF9fZmlyc3QuX01faXRlcmF0b3IsIF9fbGFzdC5fTV9pdGVyYXRvciwgX19hKSwKKyAgICAgIF9NX2l0ZXJfbGlzdCgmX01fbm9uX2RiZ19pbXBsKSB7fQorI2VuZGlmCisKKyAgc2xpc3QoY29uc3QgX1NlbGYmIF9feCkgOgorICAgIF9Db25zdHJ1Y3RDaGVjayhfX3gpLAorICAgIF9NX25vbl9kYmdfaW1wbChfX3guX01fbm9uX2RiZ19pbXBsKSwgX01faXRlcl9saXN0KCZfTV9ub25fZGJnX2ltcGwpIHt9CisKKyAgX1NlbGYmIG9wZXJhdG9yPSAoY29uc3QgX1NlbGYmIF9feCkgeworICAgIGlmICh0aGlzICE9ICZfX3gpIHsKKyAgICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9ycyhiZWdpbigpLCBlbmQoKSk7CisgICAgICBfTV9ub25fZGJnX2ltcGwgPSBfX3guX01fbm9uX2RiZ19pbXBsOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB+c2xpc3QoKSB7fQorCisgIHZvaWQgYXNzaWduKHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9fdmFsKSB7CisgICAgX0ludmFsaWRhdGVfaXRlcmF0b3JzKGJlZ2luKCksIGVuZCgpKTsKKyAgICBfTV9ub25fZGJnX2ltcGwuYXNzaWduKF9fbiwgX192YWwpOworICB9CisKKyAgaXRlcmF0b3IgYmVmb3JlX2JlZ2luKCkKKyAgeyByZXR1cm4gaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLmJlZm9yZV9iZWdpbigpKTsgfQorICBjb25zdF9pdGVyYXRvciBiZWZvcmVfYmVnaW4oKSBjb25zdAorICB7IHJldHVybiBjb25zdF9pdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuYmVmb3JlX2JlZ2luKCkpOyB9CisKKyAgaXRlcmF0b3IgYmVnaW4oKQorICB7IHJldHVybiBpdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuYmVnaW4oKSk7IH0KKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdAorICB7IHJldHVybiBjb25zdF9pdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuYmVnaW4oKSk7fQorCisgIGl0ZXJhdG9yIGVuZCgpCisgIHsgcmV0dXJuIGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5lbmQoKSk7IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QKKyAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLmVuZCgpKTsgfQorCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwuZW1wdHkoKTsgfQorICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5zaXplKCk7IH0KKyAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLm1heF9zaXplKCk7IH0KKworICB2b2lkIHN3YXAoX1NlbGYmIF9feCkgeworICAgIF9NX2l0ZXJfbGlzdC5fU3dhcF9vd25lcnMoX194Ll9NX2l0ZXJfbGlzdCk7CisgICAgX01fbm9uX2RiZ19pbXBsLnN3YXAoX194Ll9NX25vbl9kYmdfaW1wbCk7CisgIH0KKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUEFSVElBTF9TUEVDX1dPUktBUk9VTkQpICYmICFkZWZpbmVkIChfU1RMUF9GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIpCisgIHZvaWQgX01fc3dhcF93b3JrYXJvdW5kKF9TZWxmJiBfX3gpIHsgc3dhcChfX3gpOyB9CisjZW5kaWYKKworICByZWZlcmVuY2UgZnJvbnQoKSB7CisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoIWVtcHR5KCksIF9TdGxNc2dfRU1QVFlfQ09OVEFJTkVSKQorICAgIHJldHVybiBfTV9ub25fZGJnX2ltcGwuZnJvbnQoKTsKKyAgfQorICBjb25zdF9yZWZlcmVuY2UgZnJvbnQoKSBjb25zdCB7CisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoIWVtcHR5KCksIF9TdGxNc2dfRU1QVFlfQ09OVEFJTkVSKQorICAgIHJldHVybiBfTV9ub25fZGJnX2ltcGwuZnJvbnQoKTsKKyAgfQorICB2b2lkIHB1c2hfZnJvbnQoY29uc3RfcmVmZXJlbmNlIF9feCkgeyBfTV9ub25fZGJnX2ltcGwucHVzaF9mcm9udChfX3gpOyB9CisgIHZvaWQgcG9wX2Zyb250KCkgeworICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFlbXB0eSgpLCBfU3RsTXNnX0VNUFRZX0NPTlRBSU5FUikKKyAgICBfTV9ub25fZGJnX2ltcGwucG9wX2Zyb250KCk7CisgIH0KKyAgaXRlcmF0b3IgcHJldmlvdXMoY29uc3RfaXRlcmF0b3IgX19wb3MpIHsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfb3duZXIoJl9NX2l0ZXJfbGlzdCwgX19wb3MpKQorICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCEoX19wb3MuX01faXRlcmF0b3IgPT0gX01fbm9uX2RiZ19pbXBsLmJlZm9yZV9iZWdpbigpKSwgX1N0bE1zZ19JTlZBTElEX0FSR1VNRU5UKQorICAgIHJldHVybiBpdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwucHJldmlvdXMoX19wb3MuX01faXRlcmF0b3IpKTsKKyAgfQorICBjb25zdF9pdGVyYXRvciBwcmV2aW91cyhjb25zdF9pdGVyYXRvciBfX3BvcykgY29uc3QgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LCBfX3BvcykpCisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoIShfX3Bvcy5fTV9pdGVyYXRvciA9PSBfTV9ub25fZGJnX2ltcGwuYmVmb3JlX2JlZ2luKCkpLCBfU3RsTXNnX0lOVkFMSURfQVJHVU1FTlQpCisgICAgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5wcmV2aW91cyhfX3Bvcy5fTV9pdGVyYXRvcikpOworICB9CisKK3B1YmxpYzoKKworI2lmICFkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorICBpdGVyYXRvciBpbnNlcnRfYWZ0ZXIoaXRlcmF0b3IgX19wb3MsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCA9IF9UcCgpKSB7CisjZWxzZQorICBpdGVyYXRvciBpbnNlcnRfYWZ0ZXIoaXRlcmF0b3IgX19wb3MsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkgeworI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfRGVyZWZlcmVuY2VhYmxlKF9fcG9zKSkKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfb3duZXIoJl9NX2l0ZXJfbGlzdCwgX19wb3MpKQorICAgIHJldHVybiBpdGVyYXRvcigmX01faXRlcl9saXN0LF9NX25vbl9kYmdfaW1wbC5pbnNlcnRfYWZ0ZXIoX19wb3MuX01faXRlcmF0b3IsIF9feCkpOworICB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorICBpdGVyYXRvciBpbnNlcnRfYWZ0ZXIoaXRlcmF0b3IgX19wb3MpIHsKKyAgICByZXR1cm4gaW5zZXJ0X2FmdGVyKF9fcG9zLCBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKF9UcCkpOworICB9CisjZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKi8KKworICB2b2lkIGluc2VydF9hZnRlcihpdGVyYXRvciBfX3Bvcywgc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX194KSB7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfRGVyZWZlcmVuY2VhYmxlKF9fcG9zKSkKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfb3duZXIoJl9NX2l0ZXJfbGlzdCwgX19wb3MpKQorICAgIF9NX25vbl9kYmdfaW1wbC5pbnNlcnRfYWZ0ZXIoX19wb3MuX01faXRlcmF0b3IsIF9fbiwgX194KTsKKyAgfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICB2b2lkIGFzc2lnbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpIHsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKKyAgICBfSW52YWxpZGF0ZV9pdGVyYXRvcnMoYmVnaW4oKSwgZW5kKCkpOworICAgIF9NX25vbl9kYmdfaW1wbC5hc3NpZ24oX1NUTFBfUFJJViBfTm9uX0RiZ19pdGVyKF9fZmlyc3QpLCBfU1RMUF9QUklWIF9Ob25fRGJnX2l0ZXIoX19sYXN0KSk7CisgIH0KKyNlbHNlCisgIHZvaWQgYXNzaWduKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9ycyhiZWdpbigpLCBlbmQoKSk7CisgICAgX01fbm9uX2RiZ19pbXBsLmFzc2lnbihfX2ZpcnN0Ll9NX2l0ZXJhdG9yLCBfX2xhc3QuX01faXRlcmF0b3IpOworICB9CisgIHZvaWQgYXNzaWduKGNvbnN0IHZhbHVlX3R5cGUgKl9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUgKl9fbGFzdCkgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19wdHJfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKKyAgICBfSW52YWxpZGF0ZV9pdGVyYXRvcnMoYmVnaW4oKSwgZW5kKCkpOworICAgIF9NX25vbl9kYmdfaW1wbC5hc3NpZ24oX19maXJzdCwgX19sYXN0KTsKKyAgfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0luSXRlcj4KKyAgdm9pZCBpbnNlcnRfYWZ0ZXIoaXRlcmF0b3IgX19wb3MsIF9Jbkl0ZXIgX19maXJzdCwgX0luSXRlciBfX2xhc3QpIHsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9EZXJlZmVyZW5jZWFibGUoX19wb3MpKQorICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LCBfX3BvcykpCisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgICAgX01fbm9uX2RiZ19pbXBsLmluc2VydF9hZnRlcihfX3Bvcy5fTV9pdGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2ZpcnN0KSwgX1NUTFBfUFJJViBfTm9uX0RiZ19pdGVyKF9fbGFzdCkpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9Jbkl0ZXI+CisgIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBfSW5JdGVyIF9fZmlyc3QsIF9Jbkl0ZXIgX19sYXN0KSB7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX2lmX293bmVyKCZfTV9pdGVyX2xpc3QsIF9fcG9zKSkKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghKF9fcG9zLl9NX2l0ZXJhdG9yID09IF9NX25vbl9kYmdfaW1wbC5iZWZvcmVfYmVnaW4oKSksIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKKyAgICBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0KF9fcG9zLl9NX2l0ZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfTm9uX0RiZ19pdGVyKF9fZmlyc3QpLCBfU1RMUF9QUklWIF9Ob25fRGJnX2l0ZXIoX19sYXN0KSk7CisgIH0KKyNlbHNlCisgIHZvaWQgaW5zZXJ0X2FmdGVyKGl0ZXJhdG9yIF9fcG9zLAorICAgICAgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpIHsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9EZXJlZmVyZW5jZWFibGUoX19wb3MpKQorICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LCBfX3BvcykpCisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgICAgX01fbm9uX2RiZ19pbXBsLmluc2VydF9hZnRlcihfX3Bvcy5fTV9pdGVyYXRvciwgX19maXJzdC5fTV9pdGVyYXRvciwgX19sYXN0Ll9NX2l0ZXJhdG9yKTsKKyAgfQorICB2b2lkIGluc2VydF9hZnRlcihpdGVyYXRvciBfX3BvcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWVfdHlwZSogX19maXJzdCwgY29uc3QgdmFsdWVfdHlwZSogX19sYXN0KSB7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfRGVyZWZlcmVuY2VhYmxlKF9fcG9zKSkKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfb3duZXIoJl9NX2l0ZXJfbGlzdCwgX19wb3MpKQorICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19wdHJfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKKyAgICBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0X2FmdGVyKF9fcG9zLl9NX2l0ZXJhdG9yLCBfX2ZpcnN0LCBfX2xhc3QpOworICB9CisKKyAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LCBfX3BvcykpCisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoIShfX3Bvcy5fTV9pdGVyYXRvciA9PSBfTV9ub25fZGJnX2ltcGwuYmVmb3JlX2JlZ2luKCkpLCBfU3RsTXNnX0lOVkFMSURfQVJHVU1FTlQpCisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgICAgX01fbm9uX2RiZ19pbXBsLmluc2VydChfX3Bvcy5fTV9pdGVyYXRvciwgX19maXJzdC5fTV9pdGVyYXRvciwgX19sYXN0Ll9NX2l0ZXJhdG9yKTsKKyAgfQorICB2b2lkIGluc2VydChpdGVyYXRvciBfX3BvcywgY29uc3QgdmFsdWVfdHlwZSogX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlX3R5cGUqIF9fbGFzdCkgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LF9fcG9zKSkKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghKF9fcG9zLl9NX2l0ZXJhdG9yID09IF9NX25vbl9kYmdfaW1wbC5iZWZvcmVfYmVnaW4oKSksIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcHRyX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgICAgX01fbm9uX2RiZ19pbXBsLmluc2VydChfX3Bvcy5fTV9pdGVyYXRvciwgX19maXJzdCwgX19sYXN0KTsKKyAgfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKKyAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ggPSBfVHAoKSkgeworI2Vsc2UKKyAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpIHsKKyNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0qLworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LCBfX3BvcykpCisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoIShfX3Bvcy5fTV9pdGVyYXRvciA9PSBfTV9ub25fZGJnX2ltcGwuYmVmb3JlX2JlZ2luKCkpLCBfU3RsTXNnX0lOVkFMSURfQVJHVU1FTlQpCisgICAgcmV0dXJuIGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5pbnNlcnQoX19wb3MuX01faXRlcmF0b3IsIF9feCkpOworICB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgX19wb3MpIHsKKyAgICByZXR1cm4gaW5zZXJ0KF9fcG9zLCBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKF9UcCkpOworICB9CisjZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKi8KKworICB2b2lkIGluc2VydChpdGVyYXRvciBfX3Bvcywgc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX194KSB7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX2lmX293bmVyKCZfTV9pdGVyX2xpc3QsIF9fcG9zKSkKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghKF9fcG9zLl9NX2l0ZXJhdG9yID09IF9NX25vbl9kYmdfaW1wbC5iZWZvcmVfYmVnaW4oKSksIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKKyAgICBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0KF9fcG9zLl9NX2l0ZXJhdG9yLCBfX24sIF9feCk7CisgIH0KKworcHVibGljOgorICBpdGVyYXRvciBlcmFzZV9hZnRlcihpdGVyYXRvciBfX3BvcykgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX0RlcmVmZXJlbmNlYWJsZShfX3BvcykpCisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX2lmX293bmVyKCZfTV9pdGVyX2xpc3QsX19wb3MpKQorICAgIGl0ZXJhdG9yIF9fdG1wID0gX19wb3M7ICsrX190bXA7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfRGVyZWZlcmVuY2VhYmxlKF9fdG1wKSkKKyAgICBfSW52YWxpZGF0ZV9pdGVyYXRvcihfX3RtcCk7CisgICAgcmV0dXJuIGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5lcmFzZV9hZnRlcihfX3Bvcy5fTV9pdGVyYXRvcikpOworICB9CisgIGl0ZXJhdG9yIGVyYXNlX2FmdGVyKGl0ZXJhdG9yIF9fYmVmb3JlX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpIHsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9EZXJlZmVyZW5jZWFibGUoX19iZWZvcmVfZmlyc3QpKQorICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2JlZm9yZV9maXJzdCwgX19sYXN0LCBiZWdpbigpLCBlbmQoKSkpCisgICAgaXRlcmF0b3IgX190bXAgPSBfX2JlZm9yZV9maXJzdDsgKytfX3RtcDsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9EZXJlZmVyZW5jZWFibGUoX190bXApKQorICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9ycyhfX3RtcCwgX19sYXN0KTsKKyAgICByZXR1cm4gaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLmVyYXNlX2FmdGVyKF9fYmVmb3JlX2ZpcnN0Ll9NX2l0ZXJhdG9yLCBfX2xhc3QuX01faXRlcmF0b3IpKTsKKyAgfQorCisgIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIF9fcG9zKSB7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfRGVyZWZlcmVuY2VhYmxlKF9fcG9zKSkKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVChfX3Bvcy5fTV9pdGVyYXRvciAhPSBfTV9ub25fZGJnX2ltcGwuYmVmb3JlX2JlZ2luKCksIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfb3duZXIoJl9NX2l0ZXJfbGlzdCwgX19wb3MpKQorICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9yKF9fcG9zKTsKKyAgICByZXR1cm4gaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLmVyYXNlKF9fcG9zLl9NX2l0ZXJhdG9yKSk7CisgIH0KKyAgaXRlcmF0b3IgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KSB7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCwgYmVnaW4oKSwgZW5kKCkpKQorICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9ycyhfX2ZpcnN0LCBfX2xhc3QpOworICAgIHJldHVybiBpdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuZXJhc2UoX19maXJzdC5fTV9pdGVyYXRvciwgX19sYXN0Ll9NX2l0ZXJhdG9yKSk7CisgIH0KKworI2lmICFkZWZpbmVkKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCisgIHZvaWQgcmVzaXplKHNpemVfdHlwZSBfX25ld19zaXplLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ggPSBfVHAoKSkgeworI2Vsc2UKKyAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9fbmV3X3NpemUsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkgeworI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCisgICAgX01fbm9uX2RiZ19pbXBsLnJlc2l6ZShfX25ld19zaXplLCBfX3gpOworICB9CisKKyNpZiBkZWZpbmVkKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCisgIHZvaWQgcmVzaXplKHNpemVfdHlwZSBfX25ld19zaXplKSB7IHJlc2l6ZShfX25ld19zaXplLCBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKF9UcCkpOyB9CisjZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKi8KKworICB2b2lkIGNsZWFyKCkgeworICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9ycyhiZWdpbigpLCBlbmQoKSk7CisgICAgX01fbm9uX2RiZ19pbXBsLmNsZWFyKCk7CisgIH0KKworcHVibGljOgorICAvLyBSZW1vdmVzIGFsbCBvZiB0aGUgZWxlbWVudHMgZnJvbSB0aGUgbGlzdCBfX3ggdG8gKnRoaXMsIGluc2VydGluZworICAvLyB0aGVtIGltbWVkaWF0ZWx5IGFmdGVyIF9fcG9zLiAgX194IG11c3Qgbm90IGJlICp0aGlzLiAgQ29tcGxleGl0eToKKyAgLy8gbGluZWFyIGluIF9feC5zaXplKCkuCisgIHZvaWQgc3BsaWNlX2FmdGVyKGl0ZXJhdG9yIF9fcG9zLCBfU2VsZiYgX194KSB7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfRGVyZWZlcmVuY2VhYmxlKF9fcG9zKSkKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfb3duZXIoJl9NX2l0ZXJfbGlzdCxfX3BvcykpCisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoISgmX194ID09IHRoaXMpLCBfU3RsTXNnX0lOVkFMSURfQVJHVU1FTlQpCisgICAgX01fbm9uX2RiZ19pbXBsLnNwbGljZV9hZnRlcihfX3Bvcy5fTV9pdGVyYXRvciwgX194Ll9NX25vbl9kYmdfaW1wbCk7CisgICAgaWYgKGdldF9hbGxvY2F0b3IoKSA9PSBfX3guZ2V0X2FsbG9jYXRvcigpKSB7CisgICAgICBfX3guX01faXRlcl9saXN0Ll9TZXRfb3duZXIoX01faXRlcl9saXN0KTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBfX3guX0ludmFsaWRhdGVfaXRlcmF0b3JzKF9feC5iZWdpbigpLCBfX3guZW5kKCkpOworICAgIH0KKyAgfQorCisgIC8vIE1vdmVzIHRoZSBlbGVtZW50IHRoYXQgZm9sbG93cyBfX3ByZXYgdG8gKnRoaXMsIGluc2VydGluZyBpdCBpbW1lZGlhdGVseQorICAvLyAgYWZ0ZXIgX19wb3MuICBUaGlzIGlzIGNvbnN0YW50IHRpbWUuCisgIHZvaWQgc3BsaWNlX2FmdGVyKGl0ZXJhdG9yIF9fcG9zLCBfU2VsZiYgX194LCBpdGVyYXRvciBfX3ByZXYpIHsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9EZXJlZmVyZW5jZWFibGUoX19wb3MpKQorICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LCBfX3BvcykpCisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfRGVyZWZlcmVuY2VhYmxlKF9fcHJldikpCisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX2lmX293bmVyKCZfX3guX01faXRlcl9saXN0LCBfX3ByZXYpKQorICAgIGl0ZXJhdG9yIF9fZWxlbSA9IF9fcHJldjsgKytfX2VsZW07CisgICAgX01fbm9uX2RiZ19pbXBsLnNwbGljZV9hZnRlcihfX3Bvcy5fTV9pdGVyYXRvciwgX194Ll9NX25vbl9kYmdfaW1wbCwgX19wcmV2Ll9NX2l0ZXJhdG9yKTsKKyAgICBpZiAoZ2V0X2FsbG9jYXRvcigpID09IF9feC5nZXRfYWxsb2NhdG9yKCkpIHsKKyAgICAgIF9TVExQX1BSSVYgX19jaGFuZ2VfaXRlX293bmVyKF9fZWxlbSwgJl9NX2l0ZXJfbGlzdCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgX194Ll9JbnZhbGlkYXRlX2l0ZXJhdG9yKF9fZWxlbSk7CisgICAgfQorICB9CisKKyAgLy8gTW92ZXMgdGhlIHJhbmdlIFtfX2JlZm9yZV9maXJzdCArIDEsIF9fYmVmb3JlX2xhc3QgKyAxKSB0byAqdGhpcywKKyAgLy8gIGluc2VydGluZyBpdCBpbW1lZGlhdGVseSBhZnRlciBfX3Bvcy4gIFRoaXMgaXMgY29uc3RhbnQgdGltZS4KKyAgdm9pZCBzcGxpY2VfYWZ0ZXIoaXRlcmF0b3IgX19wb3MsIF9TZWxmJiBfX3gsCisgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yIF9fYmVmb3JlX2ZpcnN0LCBpdGVyYXRvciBfX2JlZm9yZV9sYXN0KSB7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfRGVyZWZlcmVuY2VhYmxlKF9fcG9zKSkKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfb3duZXIoJl9NX2l0ZXJfbGlzdCxfX3BvcykpCisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fYmVmb3JlX2ZpcnN0LCBfX2JlZm9yZV9sYXN0KSkKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfb3duZXIoJl9feC5fTV9pdGVyX2xpc3QsIF9fYmVmb3JlX2ZpcnN0KSkKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9EZXJlZmVyZW5jZWFibGUoX19iZWZvcmVfZmlyc3QpKQorICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX0RlcmVmZXJlbmNlYWJsZShfX2JlZm9yZV9sYXN0KSkKKyAgICBpdGVyYXRvciBfX2ZpcnN0ID0gX19iZWZvcmVfZmlyc3Q7ICsrX19maXJzdDsKKyAgICBpdGVyYXRvciBfX2xhc3QgPSBfX2JlZm9yZV9sYXN0OyArK19fbGFzdDsKKyAgICBpZiAoZ2V0X2FsbG9jYXRvcigpID09IF9feC5nZXRfYWxsb2NhdG9yKCkpIHsKKyAgICAgIF9TVExQX1BSSVYgX19jaGFuZ2VfcmFuZ2Vfb3duZXIoX19maXJzdCwgX19sYXN0LCAmX01faXRlcl9saXN0KTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBfX3guX0ludmFsaWRhdGVfaXRlcmF0b3JzKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgfQorICAgIF9NX25vbl9kYmdfaW1wbC5zcGxpY2VfYWZ0ZXIoX19wb3MuX01faXRlcmF0b3IsIF9feC5fTV9ub25fZGJnX2ltcGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2JlZm9yZV9maXJzdC5fTV9pdGVyYXRvciwgX19iZWZvcmVfbGFzdC5fTV9pdGVyYXRvcik7CisgIH0KKworICB2b2lkIHNwbGljZShpdGVyYXRvciBfX3BvcywgX1NlbGYmIF9feCkgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LF9fcG9zKSkKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghKF9fcG9zLl9NX2l0ZXJhdG9yID09IF9NX25vbl9kYmdfaW1wbC5iZWZvcmVfYmVnaW4oKSksIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghKCZfX3ggPT0gdGhpcyksIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKKyAgICBfTV9ub25fZGJnX2ltcGwuc3BsaWNlKF9fcG9zLl9NX2l0ZXJhdG9yLCBfX3guX01fbm9uX2RiZ19pbXBsKTsKKyAgICBpZiAoZ2V0X2FsbG9jYXRvcigpID09IF9feC5nZXRfYWxsb2NhdG9yKCkpIHsKKyAgICAgIF9feC5fTV9pdGVyX2xpc3QuX1NldF9vd25lcihfTV9pdGVyX2xpc3QpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIF9feC5fSW52YWxpZGF0ZV9pdGVyYXRvcnMoX194LmJlZ2luKCksIF9feC5lbmQoKSk7CisgICAgfQorICB9CisKKyAgdm9pZCBzcGxpY2UoaXRlcmF0b3IgX19wb3MsIF9TZWxmJiBfX3gsIGl0ZXJhdG9yIF9faSkgeworICAgIC8vX19wb3Mgc2hvdWxkIGJlIG93bmVkIGJ5ICp0aGlzIGFuZCBub3QgYmUgdGhlIGJlZm9yZV9iZWdpbiBpdGVyYXRvcgorICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LF9fcG9zKSkKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghKF9fcG9zLl9NX2l0ZXJhdG9yID09IF9NX25vbl9kYmdfaW1wbC5iZWZvcmVfYmVnaW4oKSksIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKKyAgICAvL19faSBzaG91bGQgYmUgZGVyZWZlcmVuY2VhYmxlLCBub3QgYmVmb3JlX2JlZ2luIGFuZCBiZSBvd25lZCBieSBfX3gKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9EZXJlZmVyZW5jZWFibGUoX19pKSkKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfb3duZXIoJl9feC5fTV9pdGVyX2xpc3QgLF9faSkpCisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoIShfX2kgPT0gX194LmJlZm9yZV9iZWdpbigpKSwgX1N0bE1zZ19JTlZBTElEX0FSR1VNRU5UKQorICAgIGlmIChnZXRfYWxsb2NhdG9yKCkgPT0gX194LmdldF9hbGxvY2F0b3IoKSkgeworICAgICAgX1NUTFBfUFJJViBfX2NoYW5nZV9pdGVfb3duZXIoX19pLCAmX01faXRlcl9saXN0KTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBfX3guX0ludmFsaWRhdGVfaXRlcmF0b3IoX19pKTsKKyAgICB9CisgICAgX01fbm9uX2RiZ19pbXBsLnNwbGljZShfX3Bvcy5fTV9pdGVyYXRvciwgX194Ll9NX25vbl9kYmdfaW1wbCwgX19pLl9NX2l0ZXJhdG9yKTsKKyAgfQorCisgIHZvaWQgc3BsaWNlKGl0ZXJhdG9yIF9fcG9zLCBfU2VsZiYgX194LCBpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpIHsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfb3duZXIoJl9NX2l0ZXJfbGlzdCxfX3BvcykpCisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoIShfX3Bvcy5fTV9pdGVyYXRvciA9PSBfTV9ub25fZGJnX2ltcGwuYmVmb3JlX2JlZ2luKCkpLCBfU3RsTXNnX0lOVkFMSURfQVJHVU1FTlQpCisgICAgLy9fU1RMUF9WRVJCT1NFX0FTU0VSVCgmX194ICE9IHRoaXMsIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0LCBfX3guYmVnaW4oKSwgX194LmVuZCgpKSkKKyAgICBpZiAoZ2V0X2FsbG9jYXRvcigpID09IF9feC5nZXRfYWxsb2NhdG9yKCkpIHsKKyAgICAgIF9TVExQX1BSSVYgX19jaGFuZ2VfcmFuZ2Vfb3duZXIoX19maXJzdCwgX19sYXN0LCAmX01faXRlcl9saXN0KTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBfX3guX0ludmFsaWRhdGVfaXRlcmF0b3JzKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgfQorICAgIF9NX25vbl9kYmdfaW1wbC5zcGxpY2UoX19wb3MuX01faXRlcmF0b3IsIF9feC5fTV9ub25fZGJnX2ltcGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ZpcnN0Ll9NX2l0ZXJhdG9yLCBfX2xhc3QuX01faXRlcmF0b3IpOworICB9CisKKyAgdm9pZCByZXZlcnNlKCkKKyAgeyBfTV9ub25fZGJnX2ltcGwucmV2ZXJzZSgpOyB9CisKKyAgdm9pZCByZW1vdmUoY29uc3QgdmFsdWVfdHlwZSYgX192YWwpIHsKKyAgICBfQmFzZV9pdGVyYXRvciBfX2ZpcnN0ID0gX01fbm9uX2RiZ19pbXBsLmJlZ2luKCksIF9fbGFzdCA9IF9NX25vbl9kYmdfaW1wbC5lbmQoKTsKKyAgICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QpIHsKKyAgICAgIF9CYXNlX2l0ZXJhdG9yIF9fbmV4dCA9IF9fZmlyc3Q7CisgICAgICArK19fbmV4dDsKKyAgICAgIGlmIChfX3ZhbCA9PSAqX19maXJzdCkgeworICAgICAgICBfSW52YWxpZGF0ZV9pdGVyYXRvcihpdGVyYXRvcigmX01faXRlcl9saXN0LCBfX2ZpcnN0KSk7CisgICAgICAgIF9NX25vbl9kYmdfaW1wbC5lcmFzZShfX2ZpcnN0KTsKKyAgICAgIH0KKyAgICAgIF9fZmlyc3QgPSBfX25leHQ7CisgICAgfQorICB9CisgIHZvaWQgdW5pcXVlKCkgeworICAgIF9CYXNlX2l0ZXJhdG9yIF9fZmlyc3QgPSBfTV9ub25fZGJnX2ltcGwuYmVnaW4oKSwgX19sYXN0ID0gX01fbm9uX2RiZ19pbXBsLmVuZCgpOworICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkgcmV0dXJuOworICAgIF9CYXNlX2l0ZXJhdG9yIF9fbmV4dCA9IF9fZmlyc3Q7CisgICAgd2hpbGUgKCsrX19uZXh0ICE9IF9fbGFzdCkgeworICAgICAgaWYgKCpfX2ZpcnN0ID09ICpfX25leHQpIHsKKyAgICAgICAgX0ludmFsaWRhdGVfaXRlcmF0b3IoaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX19uZXh0KSk7CisgICAgICAgIF9NX25vbl9kYmdfaW1wbC5lcmFzZShfX25leHQpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBfX2ZpcnN0ID0gX19uZXh0OworICAgICAgX19uZXh0ID0gX19maXJzdDsKKyAgICB9CisgIH0KKyAgdm9pZCBtZXJnZShfU2VsZiYgX194KSB7CisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoJl9feCAhPSB0aGlzLCBfU3RsTXNnX0lOVkFMSURfQVJHVU1FTlQpCisjaWYgIWRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpCisgICAgLyogY29tbWVudHMgYmVsb3cgZHVlIHRvIGJ1ZyBpbiBHQ0MgY29tcGlsZXJzOiBvbmVzIGVhdCBhbGwgbWVtb3J5ICBhbmQgZGllIGlmIHNlZQorICAgICAqIHNvbWV0aGluZyBsaWtlIG5hbWVzcGFjZV9uYW1lOjpmdW5jX25hbWUoKSAtIHB0cgorICAgICAqLworICAgIF9TVExQX0RFQlVHX0NIRUNLKCAvKiBfU1RMUF9TVEQ6OiAqLyBpc19zb3J0ZWQoX01fbm9uX2RiZ19pbXBsLmJlZ2luKCksIF9NX25vbl9kYmdfaW1wbC5lbmQoKSkpCisgICAgX1NUTFBfREVCVUdfQ0hFQ0soIC8qIF9TVExQX1NURDo6ICovIGlzX3NvcnRlZChfX3guYmVnaW4oKS5fTV9pdGVyYXRvciwgX194LmVuZCgpLl9NX2l0ZXJhdG9yKSkKKyNlbmRpZgorICAgIF9NX25vbl9kYmdfaW1wbC5tZXJnZShfX3guX01fbm9uX2RiZ19pbXBsKTsKKyAgICBpZiAoZ2V0X2FsbG9jYXRvcigpID09IF9feC5nZXRfYWxsb2NhdG9yKCkpIHsKKyAgICAgIF9feC5fTV9pdGVyX2xpc3QuX1NldF9vd25lcihfTV9pdGVyX2xpc3QpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIF9feC5fSW52YWxpZGF0ZV9pdGVyYXRvcnMoX194LmJlZ2luKCksIF9feC5lbmQoKSk7CisgICAgfQorICB9CisgIHZvaWQgc29ydCgpIHsKKyAgICBfTV9ub25fZGJnX2ltcGwuc29ydCgpOworICB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX1ByZWRpY2F0ZT4KKyAgdm9pZCByZW1vdmVfaWYoX1ByZWRpY2F0ZSBfX3ByZWQpIHsKKyAgICBfQmFzZV9pdGVyYXRvciBfX2ZpcnN0ID0gX01fbm9uX2RiZ19pbXBsLmJlZ2luKCksIF9fbGFzdCA9IF9NX25vbl9kYmdfaW1wbC5lbmQoKTsKKyAgICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QpIHsKKyAgICAgIF9CYXNlX2l0ZXJhdG9yIF9fbmV4dCA9IF9fZmlyc3Q7CisgICAgICArK19fbmV4dDsKKyAgICAgIGlmIChfX3ByZWQoKl9fZmlyc3QpKSB7CisgICAgICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9yKGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9fZmlyc3QpKTsKKyAgICAgICAgX01fbm9uX2RiZ19pbXBsLmVyYXNlKF9fZmlyc3QpOworICAgICAgfQorICAgICAgX19maXJzdCA9IF9fbmV4dDsKKyAgICB9CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0JpbmFyeVByZWRpY2F0ZT4KKyAgdm9pZCB1bmlxdWUoX0JpbmFyeVByZWRpY2F0ZSBfX3ByZWQpIHsKKyAgICBfQmFzZV9pdGVyYXRvciBfX2ZpcnN0ID0gX01fbm9uX2RiZ19pbXBsLmJlZ2luKCksIF9fbGFzdCA9IF9NX25vbl9kYmdfaW1wbC5lbmQoKTsKKyAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QpIHJldHVybjsKKyAgICBfQmFzZV9pdGVyYXRvciBfX25leHQgPSBfX2ZpcnN0OworICAgIHdoaWxlICgrK19fbmV4dCAhPSBfX2xhc3QpIHsKKyAgICAgIGlmIChfX2JpbmFyeV9wcmVkKCpfX2ZpcnN0LCAqX19uZXh0KSkgeworICAgICAgICBfSW52YWxpZGF0ZV9pdGVyYXRvcihpdGVyYXRvcigmX01faXRlcl9saXN0LCBfX25leHQpKTsKKyAgICAgICAgX01fbm9uX2RiZ19pbXBsLmVyYXNlKF9fbmV4dCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIF9fZmlyc3QgPSBfX25leHQ7CisgICAgICBfX25leHQgPSBfX2ZpcnN0OworICAgIH0KKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfU3RyaWN0V2Vha09yZGVyaW5nPgorICB2b2lkIG1lcmdlKF9TZWxmJiBfX3gsIF9TdHJpY3RXZWFrT3JkZXJpbmcgX19vcmQpIHsKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCgmX194ICE9IHRoaXMsIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKKyAgICAvKiBjb21tZW50cyBiZWxvdyBkdWUgdG8gYnVnIGluIEdDQyBjb21waWxlcnM6IG9uZXMgZWF0IGFsbCBtZW1vcnkgIGFuZCBkaWUgaWYgc2VlCisgICAgICogc29tZXRoaW5nIGxpa2UgbmFtZXNwYWNlX25hbWU6OmZ1bmNfbmFtZSgpIC0gcHRyCisgICAgICovCisgICAgX1NUTFBfREVCVUdfQ0hFQ0soIC8qIF9TVExQX1NURDo6ICovIGlzX3NvcnRlZChfTV9ub25fZGJnX2ltcGwuYmVnaW4oKSwgX01fbm9uX2RiZ19pbXBsLmVuZCgpLCBfX29yZCkpCisgICAgX1NUTFBfREVCVUdfQ0hFQ0soIC8qIF9TVExQX1NURDo6ICovIGlzX3NvcnRlZChfX3guYmVnaW4oKS5fTV9pdGVyYXRvciwgX194LmVuZCgpLl9NX2l0ZXJhdG9yLCBfX29yZCkpCisjZW5kaWYKKyAgICBfTV9ub25fZGJnX2ltcGwubWVyZ2UoX194Ll9NX25vbl9kYmdfaW1wbCwgX19vcmQpOworICAgIGlmIChnZXRfYWxsb2NhdG9yKCkgPT0gX194LmdldF9hbGxvY2F0b3IoKSkgeworICAgICAgX194Ll9NX2l0ZXJfbGlzdC5fU2V0X293bmVyKF9NX2l0ZXJfbGlzdCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgX194Ll9JbnZhbGlkYXRlX2l0ZXJhdG9ycyhfX3guYmVnaW4oKSwgX194LmVuZCgpKTsKKyAgICB9CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1N0cmljdFdlYWtPcmRlcmluZz4KKyAgdm9pZCBzb3J0KF9TdHJpY3RXZWFrT3JkZXJpbmcgX19jb21wKQorICB7IF9NX25vbl9kYmdfaW1wbC5zb3J0KF9fY29tcCk7IH0KKyNlbmRpZgorfTsKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjdW5kZWYgX1NUTFBfTk9OX0RCR19TTElTVAorCisjZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfREJHX1NMSVNUX0ggKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL2RlYnVnL19zdHJpbmcuaCBiL3N0bHBvcnQvc3RsL2RlYnVnL19zdHJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWY3YWIyCi0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvZGVidWcvX3N0cmluZy5oCkBAIC0wLDAgKzEsODI4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk3LTE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKi8KKworI2lmbmRlZiBfU1RMUF9EQkdfU1RSSU5HX0gKKyNkZWZpbmUgX1NUTFBfREJHX1NUUklOR19ICisKKyNpZm5kZWYgX1NUTFBfREJHX0lURVJBVE9SX0gKKyMgIGluY2x1ZGUgPHN0bC9kZWJ1Zy9faXRlcmF0b3IuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworI2RlZmluZSBfU1RMUF9OT05fREJHX1NUUklOR19OQU1FIF9TVExQX05PTl9EQkdfTkFNRShzdHIpCisjZGVmaW5lIF9TVExQX05PTl9EQkdfU1RSSU5HIF9TVExQX1BSSVYgX1NUTFBfTk9OX0RCR19TVFJJTkdfTkFNRSA8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+CisKKyNpZiBkZWZpbmVkIChfU1RMUF9ERUJVR19VU0VfRElTVElOQ1RfVkFMVUVfVFlQRV9IRUxQRVJTKQordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCxjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgX0NoYXJUKgordmFsdWVfdHlwZShjb25zdCBfU1RMUF9QUklWIF9EQkdfaXRlcl9iYXNlPCBfU1RMUF9OT05fREJHX1NUUklORyA+JikKK3sgcmV0dXJuIChfQ2hhclQqKTA7IH0KK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK2lubGluZSByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZworaXRlcmF0b3JfY2F0ZWdvcnkoY29uc3QgX1NUTFBfUFJJViBfREJHX2l0ZXJfYmFzZTwgX1NUTFBfTk9OX0RCR19TVFJJTkcgPiYpCit7IHJldHVybiByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZygpOyB9CisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorY2xhc3MgYmFzaWNfc3RyaW5nIDoKKyNpZiAhZGVmaW5lZCAoX19ETUNfXykKKyAgICAgICAgICAgICAgICAgICAgIHByaXZhdGUKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICBwdWJsaWMKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fY29uc3RydWN0X2NoZWNrZXI8X1NUTFBfTk9OX0RCR19TVFJJTkcgPgorI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QQVJUSUFMX1NQRUNfV09SS0FST1VORCkgJiYgIWRlZmluZWQgKGJhc2ljX3N0cmluZykKKyAgICAgICAgICAgICAgICAgICAsIHB1YmxpYyBfX3N0bHBvcnRfY2xhc3M8YmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiA+CisjZW5kaWYKK3sKK3Byb3RlY3RlZDoKKyAgdHlwZWRlZiBfU1RMUF9OT05fREJHX1NUUklORyBfQmFzZTsKKyAgdHlwZWRlZiBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+IF9TZWxmOworICB0eXBlZGVmIF9TVExQX1BSSVYgX19jb25zdHJ1Y3RfY2hlY2tlcjxfU1RMUF9OT05fREJHX1NUUklORyA+IF9Db25zdHJ1Y3RDaGVjazsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSXNQT0Q8X0NoYXJUPjo6X1R5cGUgX0NoYXJfSXNfUE9EOworCitwdWJsaWM6CisgIF9fSU1QT1JUX0NPTlRBSU5FUl9UWVBFREVGUyhfQmFzZSkKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6dHJhaXRzX3R5cGUgdHJhaXRzX3R5cGU7CisgIHR5cGVkZWYgX1NUTFBfUFJJViBfREJHX2l0ZXI8X0Jhc2UsIF9TVExQX1BSSVYgX0RiZ1RyYWl0czxfTm9uY29uc3RfdHJhaXRzPHZhbHVlX3R5cGU+ID4gPiBpdGVyYXRvcjsKKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9EQkdfaXRlcjxfQmFzZSwgX1NUTFBfUFJJViBfRGJnVHJhaXRzPF9Db25zdF90cmFpdHM8dmFsdWVfdHlwZT4gPiA+IGNvbnN0X2l0ZXJhdG9yOworICBfU1RMUF9ERUNMQVJFX1JBTkRPTV9BQ0NFU1NfUkVWRVJTRV9JVEVSQVRPUlM7CisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29uc3RydWN0b3IsIGRlc3RydWN0b3IsIGFzc2lnbm1lbnQuCisgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Ol9SZXNlcnZlX3QgX1Jlc2VydmVfdDsKKworcHJpdmF0ZToKKyAgX0Jhc2UgX01fbm9uX2RiZ19pbXBsOworICBfU1RMUF9QUklWIF9fb3duZWRfbGlzdCBfTV9pdGVyX2xpc3Q7CisKKyAgdm9pZCBfSW52YWxpZGF0ZV9hbGwoKQorICB7IF9NX2l0ZXJfbGlzdC5fSW52YWxpZGF0ZV9hbGwoKTsgfQorICB2b2lkIF9Db21wYXJlX0NhcGFjaXR5IChzaXplX3R5cGUgX19vbGRfY2FwYWNpdHkpIHsKKyAgICBpZiAodGhpcy0+Y2FwYWNpdHkoKSA+IF9fb2xkX2NhcGFjaXR5KSB7CisgICAgICBfSW52YWxpZGF0ZV9hbGwoKTsKKyAgICB9CisgIH0KKyAgdm9pZCBfSW52YWxpZGF0ZV9pdGVyYXRvcihjb25zdCBpdGVyYXRvciYgX19pdCkKKyAgeyBfU1RMUF9QUklWIF9faW52YWxpZGF0ZV9pdGVyYXRvcigmX01faXRlcl9saXN0LCBfX2l0KTsgfQorICB2b2lkIF9JbnZhbGlkYXRlX2l0ZXJhdG9ycyhjb25zdCBpdGVyYXRvciYgX19mLCBjb25zdCBpdGVyYXRvciYgX19sKQorICB7IF9TVExQX1BSSVYgX19pbnZhbGlkYXRlX3JhbmdlKCZfTV9pdGVyX2xpc3QsIF9fZiwgX19sKTsgfQorCitwdWJsaWM6CisjaW5jbHVkZSA8c3RsL19zdHJpbmdfbnBvcy5oPgorCisgIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdCB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwuZ2V0X2FsbG9jYXRvcigpOyB9CisKKyAgZXhwbGljaXQgYmFzaWNfc3RyaW5nKGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX01fbm9uX2RiZ19pbXBsKF9fYSksIF9NX2l0ZXJfbGlzdCgmX01fbm9uX2RiZ19pbXBsKSB7fQorCisgIGJhc2ljX3N0cmluZyhfUmVzZXJ2ZV90IF9fciwgc2l6ZV90IF9fbiwKKyAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX01fbm9uX2RiZ19pbXBsKF9fciwgX19uLCBfX2EpLCBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KKworICBiYXNpY19zdHJpbmcoY29uc3QgX1NlbGYmIF9fcykKKyAgICA6IF9Db25zdHJ1Y3RDaGVjayhfX3MpLAorICAgICAgX01fbm9uX2RiZ19pbXBsKF9fcy5fTV9ub25fZGJnX2ltcGwpLCBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KKworICBiYXNpY19zdHJpbmcoY29uc3QgX1NlbGYmIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uID0gbnBvcywKKyAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX01fbm9uX2RiZ19pbXBsKF9fcy5fTV9ub25fZGJnX2ltcGwsIF9fcG9zLCBfX24sIF9fYSksCisgICAgICBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KKworICBiYXNpY19zdHJpbmcoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX24sCisgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9Db25zdHJ1Y3RDaGVjayhfX3MpLCBfTV9ub25fZGJnX2ltcGwoX19zLCBfX24sIF9fYSksCisgICAgICBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KKworICBiYXNpY19zdHJpbmcoY29uc3QgX0NoYXJUKiBfX3MsCisgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9Db25zdHJ1Y3RDaGVjayhfX3MpLAorICAgICAgX01fbm9uX2RiZ19pbXBsKF9fcywgX19hKSwgX01faXRlcl9saXN0KCZfTV9ub25fZGJnX2ltcGwpIHt9CisKKyAgYmFzaWNfc3RyaW5nKHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MsCisgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9NX25vbl9kYmdfaW1wbChfX24sIF9fYywgX19hKSwgX01faXRlcl9saXN0KCZfTV9ub25fZGJnX2ltcGwpIHt9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKKyAgYmFzaWNfc3RyaW5nKF9fbW92ZV9zb3VyY2U8X1NlbGY+IHNyYykKKyAgICA6IF9NX25vbl9kYmdfaW1wbChfX21vdmVfc291cmNlPF9CYXNlID4oc3JjLmdldCgpLl9NX25vbl9kYmdfaW1wbCkpLAorICAgICAgX01faXRlcl9saXN0KCZfTV9ub25fZGJnX2ltcGwpIHsKKyMgIGlmIGRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpIHx8IChfU1RMUF9ERUJVR19MRVZFTCA9PSBfU1RMUF9TVEFOREFSRF9EQkdfTEVWRUwpCisgICAgc3JjLmdldCgpLl9NX2l0ZXJfbGlzdC5fSW52YWxpZGF0ZV9hbGwoKTsKKyMgIGVsc2UKKyAgICBzcmMuZ2V0KCkuX01faXRlcl9saXN0Ll9TZXRfb3duZXIoX01faXRlcl9saXN0KTsKKyMgIGVuZGlmCisgIH0KKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIGJhc2ljX3N0cmluZyhjb25zdCBfQ2hhclQqIF9fZiwgY29uc3QgX0NoYXJUKiBfX2wsCisgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9Db25zdHJ1Y3RDaGVjayhfX2YsIF9fbCksCisgICAgICBfTV9ub25fZGJnX2ltcGwoX19mLCBfX2wsIF9fYSksIF9NX2l0ZXJfbGlzdCgmX01fbm9uX2RiZ19pbXBsKSB7CisgIH0KKyAgYmFzaWNfc3RyaW5nKGNvbnN0X2l0ZXJhdG9yIF9fZiwgY29uc3RfaXRlcmF0b3IgX19sLAorICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUgJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX0NvbnN0cnVjdENoZWNrKF9fZiwgX19sKSwKKyAgICAgIF9NX25vbl9kYmdfaW1wbChfX2YuX01faXRlcmF0b3IsIF9fbC5fTV9pdGVyYXRvciwgX19hKSwgX01faXRlcl9saXN0KCZfTV9ub25fZGJnX2ltcGwpIHsKKyAgfQorI2Vsc2UKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICBiYXNpY19zdHJpbmcoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsCisgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSAmIF9fYSBfU1RMUF9BTExPQ0FUT1JfVFlQRV9ERkwpCisgICAgOiBfQ29uc3RydWN0Q2hlY2soX19mLCBfX2wpLAorICAgICAgX01fbm9uX2RiZ19pbXBsKF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2YpLCBfU1RMUF9QUklWIF9Ob25fRGJnX2l0ZXIoX19sKSwgX19hKSwKKyAgICAgIF9NX2l0ZXJfbGlzdCgmX01fbm9uX2RiZ19pbXBsKSB7fQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfTkVFRFNfRVhUUkFfVEVNUExBVEVfQ09OU1RSVUNUT1JTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIGJhc2ljX3N0cmluZyhfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCkKKyAgICA6IF9Db25zdHJ1Y3RDaGVjayhfX2YsIF9fbCksCisgICAgICBfTV9ub25fZGJnX2ltcGwoX1NUTFBfUFJJViBfTm9uX0RiZ19pdGVyKF9fZiksIF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2wpKSwKKyAgICAgIF9NX2l0ZXJfbGlzdCgmX01fbm9uX2RiZ19pbXBsKSB7fQorIyAgZW5kaWYKKyNlbmRpZgorCitwcml2YXRlOgorICAvLyBjb25zdHJ1Y3RvciBmcm9tIG5vbi1kZWJ1ZyB2ZXJzaW9uIGZvciBzdWJzdHIKKyAgYmFzaWNfc3RyaW5nIChjb25zdCBfQmFzZSYgX194KQorICAgIDogX01fbm9uX2RiZ19pbXBsKF9feCksIF9NX2l0ZXJfbGlzdCgmX01fbm9uX2RiZ19pbXBsKSB7fQorCitwdWJsaWM6CisgIF9TZWxmJiBvcGVyYXRvcj0oY29uc3QgX1NlbGYmIF9fcykgeworICAgIGlmICh0aGlzICE9ICZfX3MpIHsKKyAgICAgIGFzc2lnbihfX3MpOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBfU2VsZiYgb3BlcmF0b3I9KGNvbnN0IF9DaGFyVCogX19zKSB7CisgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCgoX19zICE9IDApLCBfU3RsTXNnX0lOVkFMSURfQVJHVU1FTlQpCisgICAgcmV0dXJuIGFzc2lnbihfX3MpOworICB9CisKKyAgX1NlbGYmIG9wZXJhdG9yPShfQ2hhclQgX19jKSB7CisgICAgcmV0dXJuIGFzc2lnbigxLCBfX2MpOworICB9CisKKyAgLy8gSXRlcmF0b3JzLgorICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5iZWdpbigpKTsgfQorICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5iZWdpbigpKTsgfQorICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBpdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuZW5kKCkpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5lbmQoKSk7IH0KKworICByZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpICAgICAgICAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3QgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKyAgcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgICAgICAgICAgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0ICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorCisgIC8vIFNpemUsIGNhcGFjaXR5LCBldGMuCisgIHNpemVfdHlwZSBzaXplKCkgY29uc3QgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLnNpemUoKTsgfQorICBzaXplX3R5cGUgbGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLmxlbmd0aCgpOyB9CisgIHNpemVfdCBtYXhfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5tYXhfc2l6ZSgpOyB9CisKKyAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYykgeworICAgIGlmIChfX24gPiBjYXBhY2l0eSgpKQorICAgICAgX0ludmFsaWRhdGVfYWxsKCk7CisgICAgZWxzZSBpZiAoX19uIDwgc2l6ZSgpKQorICAgICAgX0ludmFsaWRhdGVfaXRlcmF0b3JzKGJlZ2luKCkgKyBfX24sIGVuZCgpKTsKKyAgICBfTV9ub25fZGJnX2ltcGwucmVzaXplKF9fbiwgX19jKTsKKyAgfQorICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgX19uKSB7IHJlc2l6ZShfX24sIF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQoX0NoYXJUKSk7IH0KKyAgc2l6ZV90eXBlIGNhcGFjaXR5KCkgY29uc3QgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLmNhcGFjaXR5KCk7IH0KKworICB2b2lkIHJlc2VydmUoc2l6ZV90eXBlIF9fcyA9IDApIHsKKyAgICBpZiAoX19zID4gY2FwYWNpdHkoKSkgX0ludmFsaWRhdGVfYWxsKCk7CisgICAgX01fbm9uX2RiZ19pbXBsLnJlc2VydmUoX19zKTsKKyAgfQorCisgIHZvaWQgY2xlYXIoKSB7CisgICAgX0ludmFsaWRhdGVfYWxsKCk7CisgICAgX01fbm9uX2RiZ19pbXBsLmNsZWFyKCk7CisgIH0KKworICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLmVtcHR5KCk7IH0KKworICBjb25zdF9yZWZlcmVuY2Ugb3BlcmF0b3JbXShzaXplX3R5cGUgX19uKSBjb25zdCB7CisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoX19uIDw9IHRoaXMtPnNpemUoKSwgX1N0bE1zZ19PVVRfT0ZfQk9VTkRTKTsKKyAgICByZXR1cm4gX01fbm9uX2RiZ19pbXBsW19fbl07CisgIH0KKworICByZWZlcmVuY2Ugb3BlcmF0b3JbXShzaXplX3R5cGUgX19uKSB7CisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoX19uIDwgdGhpcy0+c2l6ZSgpLCBfU3RsTXNnX09VVF9PRl9CT1VORFMpCisgICAgcmV0dXJuIF9NX25vbl9kYmdfaW1wbFtfX25dOworICB9CisKKyAgY29uc3RfcmVmZXJlbmNlIGF0KHNpemVfdHlwZSBfX24pIGNvbnN0IHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5hdChfX24pOyB9CisgIHJlZmVyZW5jZSBhdChzaXplX3R5cGUgX19uKSB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwuYXQoX19uKTsgfQorCisgIC8vIEFwcGVuZCwgb3BlcmF0b3IrPSwgcHVzaF9iYWNrLgorICBfU2VsZiYgb3BlcmF0b3IrPShjb25zdCBfU2VsZiYgX19zKSB7IHJldHVybiBhcHBlbmQoX19zKTsgfQorICBfU2VsZiYgb3BlcmF0b3IrPShjb25zdCBfQ2hhclQqIF9fcykgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoKF9fcyAhPSAwKSwgX1N0bE1zZ19JTlZBTElEX0FSR1VNRU5UKQorICAgIHJldHVybiBhcHBlbmQoX19zKTsKKyAgfQorICBfU2VsZiYgb3BlcmF0b3IrPShfQ2hhclQgX19jKSB7IHJldHVybiBhcHBlbmQoMSwgX19jKTsgfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXI+CisgIF9TZWxmJiBhcHBlbmQoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCkgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICAgIHNpemVfdHlwZSBfX29sZF9jYXBhY2l0eSA9IGNhcGFjaXR5KCk7CisgICAgX01fbm9uX2RiZ19pbXBsLmFwcGVuZChfU1RMUF9QUklWIF9Ob25fRGJnX2l0ZXIoX19maXJzdCksIF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2xhc3QpKTsKKyAgICBfQ29tcGFyZV9DYXBhY2l0eShfX29sZF9jYXBhY2l0eSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisjZW5kaWYKKworI2lmICFkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKSB8fCBcCisgICAgIWRlZmluZWQgKF9TVExQX05PX01FVEhPRF9TUEVDSUFMSVpBVElPTikgJiYgIWRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpCisgIF9TZWxmJiBhcHBlbmQoY29uc3QgX0NoYXJUKiBfX2YsIGNvbnN0IF9DaGFyVCogX19sKSB7CisgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fZikgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fbCkKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcHRyX3JhbmdlKF9fZiwgX19sKSkKKyAgICBzaXplX3R5cGUgX19vbGRfY2FwYWNpdHkgPSBjYXBhY2l0eSgpOworICAgIF9NX25vbl9kYmdfaW1wbC5hcHBlbmQoX19mLCBfX2wpOworICAgIF9Db21wYXJlX0NhcGFjaXR5KF9fb2xkX2NhcGFjaXR5KTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBfU2VsZiYgYXBwZW5kKGNvbnN0X2l0ZXJhdG9yIF9fZiwgY29uc3RfaXRlcmF0b3IgX19sKSB7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZiwgX19sKSkKKyAgICBzaXplX3R5cGUgX19vbGRfY2FwYWNpdHkgPSBjYXBhY2l0eSgpOworICAgIF9NX25vbl9kYmdfaW1wbC5hcHBlbmQoX19mLl9NX2l0ZXJhdG9yLCBfX2wuX01faXRlcmF0b3IpOworICAgIF9Db21wYXJlX0NhcGFjaXR5KF9fb2xkX2NhcGFjaXR5KTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyNlbmRpZgorCisgIF9TZWxmJiBhcHBlbmQoY29uc3QgX1NlbGYmIF9fcykgeworICAgIHNpemVfdHlwZSBfX29sZF9jYXBhY2l0eSA9IGNhcGFjaXR5KCk7CisgICAgX01fbm9uX2RiZ19pbXBsLmFwcGVuZChfX3MuX01fbm9uX2RiZ19pbXBsKTsKKyAgICBfQ29tcGFyZV9DYXBhY2l0eShfX29sZF9jYXBhY2l0eSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgX1NlbGYmIGFwcGVuZChjb25zdCBfU2VsZiYgX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIHsKKyAgICBzaXplX3R5cGUgX19vbGRfY2FwYWNpdHkgPSBjYXBhY2l0eSgpOworICAgIF9NX25vbl9kYmdfaW1wbC5hcHBlbmQoX19zLl9NX25vbl9kYmdfaW1wbCwgX19wb3MsIF9fbik7CisgICAgX0NvbXBhcmVfQ2FwYWNpdHkoX19vbGRfY2FwYWNpdHkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIF9TZWxmJiBhcHBlbmQoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX24pIHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKQorICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKChfX3MgIT0gMCksIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKKyAgICBzaXplX3R5cGUgX19vbGRfY2FwYWNpdHkgPSBjYXBhY2l0eSgpOworICAgIF9NX25vbl9kYmdfaW1wbC5hcHBlbmQoX19zLCBfX24pOworICAgIF9Db21wYXJlX0NhcGFjaXR5KF9fb2xkX2NhcGFjaXR5KTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBfU2VsZiYgYXBwZW5kKGNvbnN0IF9DaGFyVCogX19zKSB7CisgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCgoX19zICE9IDApLCBfU3RsTXNnX0lOVkFMSURfQVJHVU1FTlQpCisgICAgc2l6ZV90eXBlIF9fb2xkX2NhcGFjaXR5ID0gY2FwYWNpdHkoKTsKKyAgICBfTV9ub25fZGJnX2ltcGwuYXBwZW5kKF9fcyk7CisgICAgX0NvbXBhcmVfQ2FwYWNpdHkoX19vbGRfY2FwYWNpdHkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIF9TZWxmJiBhcHBlbmQoc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYykgeworICAgIHNpemVfdHlwZSBfX29sZF9jYXBhY2l0eSA9IHRoaXMtPmNhcGFjaXR5KCk7CisgICAgX01fbm9uX2RiZ19pbXBsLmFwcGVuZChfX24sIF9fYyk7CisgICAgX0NvbXBhcmVfQ2FwYWNpdHkoX19vbGRfY2FwYWNpdHkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHZvaWQgcHVzaF9iYWNrKF9DaGFyVCBfX2MpIHsKKyAgICBzaXplX3R5cGUgX19vbGRfY2FwYWNpdHkgPSB0aGlzLT5jYXBhY2l0eSgpOworICAgIF9NX25vbl9kYmdfaW1wbC5wdXNoX2JhY2soX19jKTsKKyAgICBfQ29tcGFyZV9DYXBhY2l0eShfX29sZF9jYXBhY2l0eSk7CisgIH0KKworICB2b2lkIHBvcF9iYWNrKCkgeworICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9yKHRoaXMtPmVuZCgpKTsKKyAgICBfTV9ub25fZGJnX2ltcGwucG9wX2JhY2soKTsKKyAgfQorCisgIC8vIEFzc2lnbgorICBfU2VsZiYgYXNzaWduKGNvbnN0IF9TZWxmJiBfX3MpIHsKKyAgICBfSW52YWxpZGF0ZV9hbGwoKTsKKyAgICBfTV9ub25fZGJnX2ltcGwuYXNzaWduKF9fcy5fTV9ub25fZGJnX2ltcGwpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIF9TZWxmJiBhc3NpZ24oY29uc3QgX1NlbGYmIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSB7CisgICAgaWYgKF9fcG9zIDwgX19zLnNpemUoKSkgeworICAgICAgX0ludmFsaWRhdGVfYWxsKCk7CisgICAgfQorICAgIF9NX25vbl9kYmdfaW1wbC5hc3NpZ24oX19zLl9NX25vbl9kYmdfaW1wbCwgX19wb3MsIF9fbik7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgX1NlbGYmIGFzc2lnbihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbikgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoKF9fcyAhPSAwKSwgX1N0bE1zZ19JTlZBTElEX0FSR1VNRU5UKQorICAgIF9JbnZhbGlkYXRlX2FsbCgpOworICAgIF9NX25vbl9kYmdfaW1wbC5hc3NpZ24oX19zLCBfX3MgKyBfX24pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIF9TZWxmJiBhc3NpZ24oY29uc3QgX0NoYXJUKiBfX3MpIHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKQorICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKChfX3MgIT0gMCksIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKKyAgICBfSW52YWxpZGF0ZV9hbGwoKTsKKyAgICBfTV9ub25fZGJnX2ltcGwuYXNzaWduKF9fcyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgX1NlbGYmIGFzc2lnbihzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jKSB7CisgICAgX0ludmFsaWRhdGVfYWxsKCk7CisgICAgX01fbm9uX2RiZ19pbXBsLmFzc2lnbihfX24sIF9fYyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyNpZiBkZWZpbmVkKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgorICBpbmxpbmUgX1NlbGYmIGFzc2lnbihfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0KSB7CisgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fZmlyc3QpIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2xhc3QpCisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgICAgX0ludmFsaWRhdGVfYWxsKCk7CisgICAgX01fbm9uX2RiZ19pbXBsLmFzc2lnbihfU1RMUF9QUklWIF9Ob25fRGJnX2l0ZXIoX19maXJzdCksIF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2xhc3QpKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpIHx8IFwKKyAgICAhZGVmaW5lZCAoX1NUTFBfTk9fTUVUSE9EX1NQRUNJQUxJWkFUSU9OKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKKyAgX1NlbGYmIGFzc2lnbihjb25zdCBfQ2hhclQqIF9fZiwgY29uc3QgX0NoYXJUKiBfX2wpIHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19mKSBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19sKQorICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19wdHJfcmFuZ2UoX19mLCBfX2wpKQorICAgIF9JbnZhbGlkYXRlX2FsbCgpOworICAgIF9NX25vbl9kYmdfaW1wbC5hc3NpZ24oX19mLCBfX2wpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBfU2VsZiYgYXNzaWduKGNvbnN0X2l0ZXJhdG9yIF9fZiwgY29uc3RfaXRlcmF0b3IgX19sKSB7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZiwgX19sKSkKKyAgICBfSW52YWxpZGF0ZV9hbGwoKTsKKyAgICBfTV9ub25fZGJnX2ltcGwuYXNzaWduKF9fZi5fTV9pdGVyYXRvciwgX19sLl9NX2l0ZXJhdG9yKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyNlbmRpZgorCisgIC8vIEluc2VydAorICBfU2VsZiYgaW5zZXJ0KHNpemVfdHlwZSBfX3BvcywgY29uc3QgX1NlbGYmIF9fcykgeworICAgIHNpemVfdHlwZSBfX29sZF9jYXBhY2l0eSA9IGNhcGFjaXR5KCk7CisgICAgX01fbm9uX2RiZ19pbXBsLmluc2VydChfX3BvcywgX19zLl9NX25vbl9kYmdfaW1wbCk7CisgICAgX0NvbXBhcmVfQ2FwYWNpdHkoX19vbGRfY2FwYWNpdHkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIF9TZWxmJiBpbnNlcnQoc2l6ZV90eXBlIF9fcG9zLCBjb25zdCBfU2VsZiYgX19zLAorICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX2JlZywgc2l6ZV90eXBlIF9fbikgeworICAgIHNpemVfdHlwZSBfX29sZF9jYXBhY2l0eSA9IGNhcGFjaXR5KCk7CisgICAgX01fbm9uX2RiZ19pbXBsLmluc2VydChfX3BvcywgX19zLl9NX25vbl9kYmdfaW1wbCwgX19iZWcsIF9fbik7CisgICAgX0NvbXBhcmVfQ2FwYWNpdHkoX19vbGRfY2FwYWNpdHkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIF9TZWxmJiBpbnNlcnQoc2l6ZV90eXBlIF9fcG9zLCBjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbikgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoKF9fcyAhPSAwKSwgX1N0bE1zZ19JTlZBTElEX0FSR1VNRU5UKQorICAgIHNpemVfdHlwZSBfX29sZF9jYXBhY2l0eSA9IGNhcGFjaXR5KCk7CisgICAgX01fbm9uX2RiZ19pbXBsLmluc2VydChfX3BvcywgX19zLCBfX24pOworICAgIF9Db21wYXJlX0NhcGFjaXR5KF9fb2xkX2NhcGFjaXR5KTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBfU2VsZiYgaW5zZXJ0KHNpemVfdHlwZSBfX3BvcywgY29uc3QgX0NoYXJUKiBfX3MpIHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKQorICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKChfX3MgIT0gMCksIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKKyAgICByZXR1cm4gaW5zZXJ0KF9fcG9zLCBfX3MsIF9UcmFpdHM6Omxlbmd0aChfX3MpKTsKKyAgfQorCisgIF9TZWxmJiBpbnNlcnQoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jKSB7CisgICAgc2l6ZV90eXBlIF9fb2xkX2NhcGFjaXR5ID0gY2FwYWNpdHkoKTsKKyAgICBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0KF9fcG9zLCBfX24sIF9fYyk7CisgICAgX0NvbXBhcmVfQ2FwYWNpdHkoX19vbGRfY2FwYWNpdHkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBfX3AsIF9DaGFyVCBfX2MpIHsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfb3duZXIoJl9NX2l0ZXJfbGlzdCxfX3ApKQorICAgIHNpemVfdHlwZSBfX29sZF9jYXBhY2l0eSA9IGNhcGFjaXR5KCk7CisgICAgdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yIF9fcmV0ID0gX01fbm9uX2RiZ19pbXBsLmluc2VydChfX3AuX01faXRlcmF0b3IsIF9fYyk7CisgICAgX0NvbXBhcmVfQ2FwYWNpdHkoX19vbGRfY2FwYWNpdHkpOworICAgIHJldHVybiBpdGVyYXRvcigmX01faXRlcl9saXN0LCBfX3JldCk7CisgIH0KKworICB2b2lkIGluc2VydChpdGVyYXRvciBfX3AsIHNpemVfdCBfX24sIF9DaGFyVCBfX2MpIHsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfb3duZXIoJl9NX2l0ZXJfbGlzdCxfX3ApKQorICAgIHNpemVfdHlwZSBfX29sZF9jYXBhY2l0eSA9IGNhcGFjaXR5KCk7CisgICAgX01fbm9uX2RiZ19pbXBsLmluc2VydChfX3AuX01faXRlcmF0b3IsIF9fbiwgX19jKTsKKyAgICBfQ29tcGFyZV9DYXBhY2l0eShfX29sZF9jYXBhY2l0eSk7CisgIH0KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgorICB2b2lkIGluc2VydChpdGVyYXRvciBfX3AsIF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QpIHsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfb3duZXIoJl9NX2l0ZXJfbGlzdCxfX3ApKQorICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LF9fbGFzdCkpCisKKyAgICBzaXplX3R5cGUgX19vbGRfY2FwYWNpdHkgPSB0aGlzLT5jYXBhY2l0eSgpOworICAgIF9NX25vbl9kYmdfaW1wbC5pbnNlcnQoX19wLl9NX2l0ZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfTm9uX0RiZ19pdGVyKF9fZmlyc3QpLCBfU1RMUF9QUklWIF9Ob25fRGJnX2l0ZXIoX19sYXN0KSk7CisgICAgX0NvbXBhcmVfQ2FwYWNpdHkoX19vbGRfY2FwYWNpdHkpOworICB9CisjZW5kaWYKKworI2lmICFkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB2b2lkIGluc2VydChpdGVyYXRvciBfX3AsIGNvbnN0IF9DaGFyVCogX19mLCBjb25zdCBfQ2hhclQqIF9fbCkgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2YpX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fbCkKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfb3duZXIoJl9NX2l0ZXJfbGlzdCxfX3ApKQorICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19wdHJfcmFuZ2UoX19mLF9fbCkpCisgICAgc2l6ZV90eXBlIF9fb2xkX2NhcGFjaXR5ID0gY2FwYWNpdHkoKTsKKyAgICBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0KF9fcC5fTV9pdGVyYXRvciwgX19mLCBfX2wpOworICAgIF9Db21wYXJlX0NhcGFjaXR5KF9fb2xkX2NhcGFjaXR5KTsKKyAgfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykgfHwgIWRlZmluZWQgKF9TVExQX05PX01FVEhPRF9TUEVDSUFMSVpBVElPTikKKyAgLy8gVGhvc2Ugb3ZlcmxvYWRzIGFyZSBuZWNlc3NhcnkgdG8gY2hlY2sgc2VsZiByZWZlcmVuY2luZyBjb3JyZWN0bHkgaW4gbm9uIGRlYnVnCisgIC8vIGJhc2ljX3N0cmluZyBpbXBsZW1lbnRhdGlvbgorICB2b2lkIGluc2VydChpdGVyYXRvciBfX3AsIGNvbnN0X2l0ZXJhdG9yIF9fZiwgY29uc3RfaXRlcmF0b3IgX19sKSB7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX2lmX293bmVyKCZfTV9pdGVyX2xpc3QsX19wKSkKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19mLF9fbCkpCisjICBpZiAoX1NUTFBfREVCVUdfTEVWRUwgPT0gX1NUTFBfU1RBTkRBUkRfREJHX0xFVkVMKQorICAgIF9TVExQX1NURF9ERUJVR19DSEVDSyhfX2NoZWNrX2lmX25vdF9vd25lcigmX01faXRlcl9saXN0LCBfX2YpKQorIyAgZW5kaWYKKyAgICBzaXplX3R5cGUgX19vbGRfY2FwYWNpdHkgPSBjYXBhY2l0eSgpOworICAgIF9NX25vbl9kYmdfaW1wbC5pbnNlcnQoX19wLl9NX2l0ZXJhdG9yLCBfX2YuX01faXRlcmF0b3IsIF9fbC5fTV9pdGVyYXRvcik7CisgICAgX0NvbXBhcmVfQ2FwYWNpdHkoX19vbGRfY2FwYWNpdHkpOworICB9CisgIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcCwgaXRlcmF0b3IgX19mLCBpdGVyYXRvciBfX2wpIHsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfb3duZXIoJl9NX2l0ZXJfbGlzdCxfX3ApKQorICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2YsX19sKSkKKyMgIGlmIChfU1RMUF9ERUJVR19MRVZFTCA9PSBfU1RMUF9TVEFOREFSRF9EQkdfTEVWRUwpCisgICAgX1NUTFBfU1REX0RFQlVHX0NIRUNLKF9fY2hlY2tfaWZfbm90X293bmVyKCZfTV9pdGVyX2xpc3QsIF9fZikpCisjICBlbmRpZgorICAgIHNpemVfdHlwZSBfX29sZF9jYXBhY2l0eSA9IGNhcGFjaXR5KCk7CisgICAgX01fbm9uX2RiZ19pbXBsLmluc2VydChfX3AuX01faXRlcmF0b3IsIF9fZi5fTV9pdGVyYXRvciwgX19sLl9NX2l0ZXJhdG9yKTsKKyAgICBfQ29tcGFyZV9DYXBhY2l0eShfX29sZF9jYXBhY2l0eSk7CisgIH0KKyNlbmRpZgorCisgIC8vIEVyYXNlLgorICBfU2VsZiYgZXJhc2Uoc2l6ZV90eXBlIF9fcG9zID0gMCwgc2l6ZV90eXBlIF9fbiA9IG5wb3MpIHsKKyAgICBpZiAoX19wb3MgPCBzaXplKCkpIHsKKyAgICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9ycyhiZWdpbigpICsgX19wb3MsIGVuZCgpKTsKKyAgICB9CisgICAgX01fbm9uX2RiZ19pbXBsLmVyYXNlKF9fcG9zLCBfX24pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBfX3BvcykgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX0RlcmVmZXJlbmNlYWJsZShfX3BvcykpCisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX2lmX293bmVyKCZfTV9pdGVyX2xpc3QsX19wb3MpKQorICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9ycyhfX3BvcywgZW5kKCkpOworICAgIHJldHVybiBpdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuZXJhc2UoX19wb3MuX01faXRlcmF0b3IpKTsKKyAgfQorICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBfX2YsIGl0ZXJhdG9yIF9fbCkgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2YsIF9fbCwgYmVnaW4oKSwgZW5kKCkpKQorICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9ycyhfX2YsIGVuZCgpKTsKKyAgICByZXR1cm4gaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLmVyYXNlKF9fZi5fTV9pdGVyYXRvciwgX19sLl9NX2l0ZXJhdG9yKSk7CisgIH0KKworICAvLyBTdWJzdHJpbmcuCisgIF9TZWxmIHN1YnN0cihzaXplX3R5cGUgX19wb3MgPSAwLCBzaXplX3R5cGUgX19uID0gbnBvcykgY29uc3QKKyAgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLnN1YnN0cihfX3BvcywgX19uKTsgfQorCisgIC8vIFJlcGxhY2UuICAoQ29uY2VwdHVhbGx5IGVxdWl2YWxlbnQgdG8gZXJhc2UgZm9sbG93ZWQgYnkgaW5zZXJ0LikKKyAgX1NlbGYmIHJlcGxhY2Uoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uLCBjb25zdCBfU2VsZiYgX19zKSB7CisgICAgc2l6ZV90eXBlIF9fb2xkX2NhcGFjaXR5ID0gY2FwYWNpdHkoKTsKKyAgICBfTV9ub25fZGJnX2ltcGwucmVwbGFjZShfX3BvcywgX19uLCBfX3MuX01fbm9uX2RiZ19pbXBsKTsKKyAgICBfQ29tcGFyZV9DYXBhY2l0eShfX29sZF9jYXBhY2l0eSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgX1NlbGYmIHJlcGxhY2Uoc2l6ZV90eXBlIF9fcG9zMSwgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IF9TZWxmJiBfX3MsCisgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX3BvczIsIHNpemVfdHlwZSBfX24yKSB7CisgICAgc2l6ZV90eXBlIF9fb2xkX2NhcGFjaXR5ID0gY2FwYWNpdHkoKTsKKyAgICBfTV9ub25fZGJnX2ltcGwucmVwbGFjZShfX3BvczEsIF9fbjEsIF9fcy5fTV9ub25fZGJnX2ltcGwsIF9fcG9zMiwgX19uMik7CisgICAgX0NvbXBhcmVfQ2FwYWNpdHkoX19vbGRfY2FwYWNpdHkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIF9TZWxmJiByZXBsYWNlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uMikgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoKF9fcyAhPSAwKSwgX1N0bE1zZ19JTlZBTElEX0FSR1VNRU5UKQorICAgIHNpemVfdHlwZSBfX29sZF9jYXBhY2l0eSA9IGNhcGFjaXR5KCk7CisgICAgX01fbm9uX2RiZ19pbXBsLnJlcGxhY2UoX19wb3MsIF9fbjEsIF9fcywgX19uMik7CisgICAgX0NvbXBhcmVfQ2FwYWNpdHkoX19vbGRfY2FwYWNpdHkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIF9TZWxmJiByZXBsYWNlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IF9DaGFyVCogX19zKSB7CisgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCgoX19zICE9IDApLCBfU3RsTXNnX0lOVkFMSURfQVJHVU1FTlQpCisgICAgc2l6ZV90eXBlIF9fb2xkX2NhcGFjaXR5ID0gY2FwYWNpdHkoKTsKKyAgICBfTV9ub25fZGJnX2ltcGwucmVwbGFjZShfX3BvcywgX19uMSwgX19zKTsKKyAgICBfQ29tcGFyZV9DYXBhY2l0eShfX29sZF9jYXBhY2l0eSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgX1NlbGYmIHJlcGxhY2Uoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uMSwgc2l6ZV90eXBlIF9fbjIsIF9DaGFyVCBfX2MpIHsKKyAgICBzaXplX3R5cGUgX19vbGRfY2FwYWNpdHkgPSBjYXBhY2l0eSgpOworICAgIF9NX25vbl9kYmdfaW1wbC5yZXBsYWNlKF9fcG9zLCBfX24xLCBfX24yLCBfX2MpOworICAgIF9Db21wYXJlX0NhcGFjaXR5KF9fb2xkX2NhcGFjaXR5KTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBfU2VsZiYgcmVwbGFjZShpdGVyYXRvciBfX2YsIGl0ZXJhdG9yIF9fbCwgY29uc3QgX1NlbGYmIF9fcykgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2YsIF9fbCwgYmVnaW4oKSwgZW5kKCkpKQorICAgIHNpemVfdHlwZSBfX29sZF9jYXBhY2l0eSA9IGNhcGFjaXR5KCk7CisgICAgX01fbm9uX2RiZ19pbXBsLnJlcGxhY2UoX19mLl9NX2l0ZXJhdG9yLCBfX2wuX01faXRlcmF0b3IsIF9fcy5fTV9ub25fZGJnX2ltcGwpOworICAgIF9Db21wYXJlX0NhcGFjaXR5KF9fb2xkX2NhcGFjaXR5KTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBfU2VsZiYgcmVwbGFjZShpdGVyYXRvciBfX2YsIGl0ZXJhdG9yIF9fbCwgY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX24pIHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKQorICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2YsIF9fbCwgYmVnaW4oKSwgZW5kKCkpKQorICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKChfX3MgIT0gMCksIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKKyAgICBzaXplX3R5cGUgX19vbGRfY2FwYWNpdHkgPSBjYXBhY2l0eSgpOworICAgIF9NX25vbl9kYmdfaW1wbC5yZXBsYWNlKF9fZi5fTV9pdGVyYXRvciwgX19sLl9NX2l0ZXJhdG9yLCBfX3MsIF9fbik7CisgICAgX0NvbXBhcmVfQ2FwYWNpdHkoX19vbGRfY2FwYWNpdHkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIF9TZWxmJiByZXBsYWNlKGl0ZXJhdG9yIF9fZiwgaXRlcmF0b3IgX19sLCBjb25zdCBfQ2hhclQqIF9fcykgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZiwgX19sLCBiZWdpbigpLCBlbmQoKSkpCisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoKF9fcyAhPSAwKSwgX1N0bE1zZ19JTlZBTElEX0FSR1VNRU5UKQorICAgIHNpemVfdHlwZSBfX29sZF9jYXBhY2l0eSA9IGNhcGFjaXR5KCk7CisgICAgX01fbm9uX2RiZ19pbXBsLnJlcGxhY2UoX19mLl9NX2l0ZXJhdG9yLCBfX2wuX01faXRlcmF0b3IsIF9fcyk7CisgICAgX0NvbXBhcmVfQ2FwYWNpdHkoX19vbGRfY2FwYWNpdHkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIF9TZWxmJiByZXBsYWNlKGl0ZXJhdG9yIF9fZiwgaXRlcmF0b3IgX19sLCBzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jKSB7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZiwgX19sLCBiZWdpbigpLCBlbmQoKSkpCisgICAgc2l6ZV90eXBlIF9fb2xkX2NhcGFjaXR5ID0gY2FwYWNpdHkoKTsKKyAgICBfTV9ub25fZGJnX2ltcGwucmVwbGFjZShfX2YuX01faXRlcmF0b3IsIF9fbC5fTV9pdGVyYXRvciwgX19uLCBfX2MpOworICAgIF9Db21wYXJlX0NhcGFjaXR5KF9fb2xkX2NhcGFjaXR5KTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgorICBfU2VsZiYgcmVwbGFjZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIgX19mLCBfSW5wdXRJdGVyIF9fbCkgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QsIGJlZ2luKCksIGVuZCgpKSkKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19mLCBfX2wpKQorCisgICAgc2l6ZV90eXBlIF9fb2xkX2NhcGFjaXR5ID0gY2FwYWNpdHkoKTsKKyAgICBfTV9ub25fZGJnX2ltcGwucmVwbGFjZShfX2ZpcnN0Ll9NX2l0ZXJhdG9yLCBfX2xhc3QuX01faXRlcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfTm9uX0RiZ19pdGVyKF9fZiksIF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2wpKTsKKyAgICBfQ29tcGFyZV9DYXBhY2l0eShfX29sZF9jYXBhY2l0eSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisjZW5kaWYKKworI2lmICFkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICBfU2VsZiYgcmVwbGFjZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgIGNvbnN0IF9DaGFyVCogX19mLCBjb25zdCBfQ2hhclQqIF9fbCkgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2YpX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fbCkKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0LCBiZWdpbigpLCBlbmQoKSkpCisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3B0cl9yYW5nZShfX2YsIF9fbCkpCisgICAgc2l6ZV90eXBlIF9fb2xkX2NhcGFjaXR5ID0gY2FwYWNpdHkoKTsKKyAgICBfTV9ub25fZGJnX2ltcGwucmVwbGFjZShfX2ZpcnN0Ll9NX2l0ZXJhdG9yLCBfX2xhc3QuX01faXRlcmF0b3IsIF9fZiwgX19sKTsKKyAgICBfQ29tcGFyZV9DYXBhY2l0eShfX29sZF9jYXBhY2l0eSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisjZW5kaWYKKworI2lmICFkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKSB8fCAhZGVmaW5lZCAoX1NUTFBfTk9fTUVUSE9EX1NQRUNJQUxJWkFUSU9OKQorICBfU2VsZiYgcmVwbGFjZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fZiwgY29uc3RfaXRlcmF0b3IgX19sKSB7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCwgYmVnaW4oKSwgZW5kKCkpKQorICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2YsIF9fbCkpCisgICAgc2l6ZV90eXBlIF9fb2xkX2NhcGFjaXR5ID0gY2FwYWNpdHkoKTsKKyAgICBfTV9ub25fZGJnX2ltcGwucmVwbGFjZShfX2ZpcnN0Ll9NX2l0ZXJhdG9yLCBfX2xhc3QuX01faXRlcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mLl9NX2l0ZXJhdG9yLCBfX2wuX01faXRlcmF0b3IpOworICAgIF9Db21wYXJlX0NhcGFjaXR5KF9fb2xkX2NhcGFjaXR5KTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgX1NlbGYmIHJlcGxhY2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICBpdGVyYXRvciBfX2YsIGl0ZXJhdG9yIF9fbCkgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QsIGJlZ2luKCksIGVuZCgpKSkKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19mLCBfX2wpKQorICAgIHNpemVfdHlwZSBfX29sZF9jYXBhY2l0eSA9IGNhcGFjaXR5KCk7CisgICAgX01fbm9uX2RiZ19pbXBsLnJlcGxhY2UoX19maXJzdC5fTV9pdGVyYXRvciwgX19sYXN0Ll9NX2l0ZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZi5fTV9pdGVyYXRvciwgX19sLl9NX2l0ZXJhdG9yKTsKKyAgICBfQ29tcGFyZV9DYXBhY2l0eShfX29sZF9jYXBhY2l0eSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisjZW5kaWYKKworICAvLyBPdGhlciBtb2RpZmllciBtZW1iZXIgZnVuY3Rpb25zLgorICB2b2lkIHN3YXAoX1NlbGYmIF9fcykgeworICAgIF9NX2l0ZXJfbGlzdC5fU3dhcF9vd25lcnMoX19zLl9NX2l0ZXJfbGlzdCk7CisgICAgX01fbm9uX2RiZ19pbXBsLnN3YXAoX19zLl9NX25vbl9kYmdfaW1wbCk7CisgIH0KKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUEFSVElBTF9TUEVDX1dPUktBUk9VTkQpICYmICFkZWZpbmVkIChfU1RMUF9GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIpCisgIHZvaWQgX01fc3dhcF93b3JrYXJvdW5kKF9TZWxmJiBfX3gpIHsgc3dhcChfX3gpOyB9CisjZW5kaWYKKworICBpbnQgY29tcGFyZShjb25zdCBfU2VsZiYgX19zKSBjb25zdAorICB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwuY29tcGFyZShfX3MuX01fbm9uX2RiZ19pbXBsKTsgfQorICBpbnQgY29tcGFyZShzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24sIGNvbnN0IF9TZWxmJiBfX3MpIGNvbnN0CisgIHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5jb21wYXJlKF9fcG9zLCBfX24sIF9fcy5fTV9ub25fZGJnX2ltcGwpOyB9CisgIGludCBjb21wYXJlKHNpemVfdHlwZSBfX3BvczEsIHNpemVfdHlwZSBfX24xLCBjb25zdCBfU2VsZiYgX19zLAorICAgICAgICAgICAgICBzaXplX3R5cGUgX19wb3MyLCBzaXplX3R5cGUgX19uMikgY29uc3QKKyAgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLmNvbXBhcmUoX19wb3MxLCBfX24xLCBfX3MuX01fbm9uX2RiZ19pbXBsLCBfX3BvczIsIF9fbjIpOyB9CisgIGludCBjb21wYXJlKGNvbnN0IF9DaGFyVCogX19zKSBjb25zdCB7CisgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKKyAgICByZXR1cm4gX01fbm9uX2RiZ19pbXBsLmNvbXBhcmUoX19zKTsKKyAgfQorICBpbnQgY29tcGFyZShzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24sIGNvbnN0IF9DaGFyVCogX19zKSBjb25zdCB7CisgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKKyAgICByZXR1cm4gX01fbm9uX2RiZ19pbXBsLmNvbXBhcmUoX19wb3MsIF9fbiwgX19zKTsKKyAgfQorICBpbnQgY29tcGFyZShzaXplX3R5cGUgX19wb3MxLCBzaXplX3R5cGUgX19uMSwgY29uc3QgX0NoYXJUKiBfX3MsCisgICAgICAgICAgICAgIHNpemVfdHlwZSBfX24yKSBjb25zdCB7CisgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKKyAgICByZXR1cm4gX01fbm9uX2RiZ19pbXBsLmNvbXBhcmUoX19wb3MxLCBfX24xLCBfX3MsIF9fbjIpOworICB9CisKKyAgLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgY29tcGFyZS4KKyAgc3RhdGljIGludCBfU1RMUF9DQUxMIF9NX2NvbXBhcmUoY29uc3QgX0NoYXJUKiBfX2YxLCBjb25zdCBfQ2hhclQqIF9fbDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9DaGFyVCogX19mMiwgY29uc3QgX0NoYXJUKiBfX2wyKQorICB7IHJldHVybiBfQmFzZTo6X01fY29tcGFyZShfX2YxLCBfX2wxLCBfX2YyLCBfX2wyKTsgfQorICBzdGF0aWMgaW50IF9TVExQX0NBTEwgX01fY29tcGFyZShjb25zdF9pdGVyYXRvciBfX2YxLCBjb25zdF9pdGVyYXRvciBfX2wxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfQ2hhclQqIF9fZjIsIGNvbnN0IF9DaGFyVCogX19sMikKKyAgeyByZXR1cm4gX0Jhc2U6Ol9NX2NvbXBhcmUoX19mMS5fTV9pdGVyYXRvciwgX19sMS5fTV9pdGVyYXRvciwgX19mMiwgX19sMik7IH0KKyAgc3RhdGljIGludCBfU1RMUF9DQUxMIF9NX2NvbXBhcmUoY29uc3QgX0NoYXJUKiBfX2YxLCBjb25zdCBfQ2hhclQqIF9fbDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fZjIsIGNvbnN0X2l0ZXJhdG9yIF9fbDIpCisgIHsgcmV0dXJuIF9CYXNlOjpfTV9jb21wYXJlKF9fZjEsIF9fbDEsIF9fZjIuX01faXRlcmF0b3IsIF9fbDIuX01faXRlcmF0b3IpOyB9CisgIHN0YXRpYyBpbnQgX1NUTFBfQ0FMTCBfTV9jb21wYXJlKGNvbnN0X2l0ZXJhdG9yIF9fZjEsIGNvbnN0X2l0ZXJhdG9yIF9fbDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fZjIsIGNvbnN0X2l0ZXJhdG9yIF9fbDIpCisgIHsgcmV0dXJuIF9CYXNlOjpfTV9jb21wYXJlKF9fZjEuX01faXRlcmF0b3IsIF9fbDEuX01faXRlcmF0b3IsIF9fZjIuX01faXRlcmF0b3IsIF9fbDIuX01faXRlcmF0b3IpOyB9CisKKyAgY29uc3QgX0NoYXJUKiBjX3N0cigpIGNvbnN0IHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5jX3N0cigpOyB9CisgIGNvbnN0IF9DaGFyVCogZGF0YSgpICBjb25zdCB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwuZGF0YSgpOyB9CisKKyAgc2l6ZV90eXBlIGNvcHkoX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX24sIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0CisgIHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5jb3B5KF9fcywgX19uLCBfX3Bvcyk7IH0KKworICAvLyBmaW5kLgorICBzaXplX3R5cGUgZmluZChjb25zdCBfU2VsZiYgX19zLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdAorICB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwuZmluZChfX3MuX01fbm9uX2RiZ19pbXBsLCBfX3Bvcyk7IH0KKyAgc2l6ZV90eXBlIGZpbmQoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0IHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKQorICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKChfX3MgIT0gMCksIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKKyAgICByZXR1cm4gX01fbm9uX2RiZ19pbXBsLmZpbmQoX19zLCBfX3Bvcyk7CisgIH0KKyAgc2l6ZV90eXBlIGZpbmQoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgY29uc3QgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoKF9fcyAhPSAwKSwgX1N0bE1zZ19JTlZBTElEX0FSR1VNRU5UKQorICAgIHJldHVybiBfTV9ub25fZGJnX2ltcGwuZmluZChfX3MsIF9fcG9zLCBfX24pOworICB9CisgIC8vIFdJRTogVmVyc2FudCBzY2hlbWEgY29tcGlsZXIgNS4yLjIgSUNFIHdvcmthcm91bmQKKyAgc2l6ZV90eXBlIGZpbmQoX0NoYXJUIF9fYykgY29uc3QgeyByZXR1cm4gZmluZChfX2MsIDApOyB9CisgIHNpemVfdHlwZSBmaW5kKF9DaGFyVCBfX2MsIHNpemVfdHlwZSBfX3BvcyAvKiA9IDAgKi8pIGNvbnN0CisgIHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5maW5kKF9fYywgX19wb3MpOyB9CisKKyAgLy8gcmZpbmQuCisgIHNpemVfdHlwZSByZmluZChjb25zdCBfU2VsZiYgX19zLCBzaXplX3R5cGUgX19wb3MgPSBucG9zKSBjb25zdAorICB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwucmZpbmQoX19zLl9NX25vbl9kYmdfaW1wbCwgX19wb3MpOyB9CisgIHNpemVfdHlwZSByZmluZChjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gbnBvcykgY29uc3QgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoKF9fcyAhPSAwKSwgX1N0bE1zZ19JTlZBTElEX0FSR1VNRU5UKQorICAgIHJldHVybiBfTV9ub25fZGJnX2ltcGwucmZpbmQoX19zLCBfX3Bvcyk7CisgIH0KKyAgc2l6ZV90eXBlIHJmaW5kKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIGNvbnN0IHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKQorICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKChfX3MgIT0gMCksIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKKyAgICByZXR1cm4gX01fbm9uX2RiZ19pbXBsLnJmaW5kKF9fcywgX19wb3MsIF9fbik7CisgIH0KKyAgc2l6ZV90eXBlIHJmaW5kKF9DaGFyVCBfX2MsIHNpemVfdHlwZSBfX3BvcyA9IG5wb3MpIGNvbnN0CisgIHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5yZmluZChfX2MsIF9fcG9zKTsgfQorCisgIC8vIGZpbmRfZmlyc3Rfb2YKKyAgc2l6ZV90eXBlIGZpbmRfZmlyc3Rfb2YoY29uc3QgX1NlbGYmIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QKKyAgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLmZpbmRfZmlyc3Rfb2YoX19zLl9NX25vbl9kYmdfaW1wbCwgX19wb3MpOyB9CisgIHNpemVfdHlwZSBmaW5kX2ZpcnN0X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdCB7CisgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCgoX19zICE9IDApLCBfU3RsTXNnX0lOVkFMSURfQVJHVU1FTlQpCisgICAgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5maW5kX2ZpcnN0X29mKF9fcywgX19wb3MpOworICB9CisgIHNpemVfdHlwZSBmaW5kX2ZpcnN0X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIGNvbnN0IHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKQorICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKChfX3MgIT0gMCksIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKKyAgICByZXR1cm4gX01fbm9uX2RiZ19pbXBsLmZpbmRfZmlyc3Rfb2YoX19zLCBfX3BvcywgX19uKTsKKyAgfQorICBzaXplX3R5cGUgZmluZF9maXJzdF9vZihfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdAorICB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwuZmluZF9maXJzdF9vZihfX2MsIF9fcG9zKTsgfQorCisgIC8vIGZpbmRfbGFzdF9vZgorICBzaXplX3R5cGUgZmluZF9sYXN0X29mKGNvbnN0IF9TZWxmJiBfX3MsIHNpemVfdHlwZSBfX3BvcyA9IG5wb3MpIGNvbnN0CisgIHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5maW5kX2xhc3Rfb2YoX19zLl9NX25vbl9kYmdfaW1wbCwgX19wb3MpOyB9CisgIHNpemVfdHlwZSBmaW5kX2xhc3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3BvcyA9IG5wb3MpIGNvbnN0IHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKQorICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKChfX3MgIT0gMCksIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKKyAgICByZXR1cm4gX01fbm9uX2RiZ19pbXBsLmZpbmRfbGFzdF9vZihfX3MsIF9fcG9zKTsKKyAgfQorICBzaXplX3R5cGUgZmluZF9sYXN0X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIGNvbnN0IHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKQorICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKChfX3MgIT0gMCksIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKKyAgICByZXR1cm4gX01fbm9uX2RiZ19pbXBsLmZpbmRfbGFzdF9vZihfX3MsIF9fcG9zLCBfX24pOworICB9CisgIHNpemVfdHlwZSBmaW5kX2xhc3Rfb2YoX0NoYXJUIF9fYywgc2l6ZV90eXBlIF9fcG9zID0gbnBvcykgY29uc3QKKyAgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLnJmaW5kKF9fYywgX19wb3MpOyB9CisKKyAgLy8gZmluZF9maXJzdF9ub3Rfb2YKKyAgc2l6ZV90eXBlIGZpbmRfZmlyc3Rfbm90X29mKGNvbnN0IF9TZWxmJiBfX3MsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0CisgIHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5maW5kX2ZpcnN0X25vdF9vZihfX3MuX01fbm9uX2RiZ19pbXBsLCBfX3Bvcyk7IH0KKyAgc2l6ZV90eXBlIGZpbmRfZmlyc3Rfbm90X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdCB7CisgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCgoX19zICE9IDApLCBfU3RsTXNnX0lOVkFMSURfQVJHVU1FTlQpCisgICAgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5maW5kX2ZpcnN0X25vdF9vZihfX3MsIF9fcG9zKTsKKyAgfQorICBzaXplX3R5cGUgZmluZF9maXJzdF9ub3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgY29uc3QgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoKF9fcyAhPSAwKSwgX1N0bE1zZ19JTlZBTElEX0FSR1VNRU5UKQorICAgIHJldHVybiBfTV9ub25fZGJnX2ltcGwuZmluZF9maXJzdF9ub3Rfb2YoX19zLCBfX3BvcywgX19uKTsKKyAgfQorICBzaXplX3R5cGUgZmluZF9maXJzdF9ub3Rfb2YoX0NoYXJUIF9fYywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QKKyAgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLmZpbmRfZmlyc3Rfbm90X29mKF9fYywgX19wb3MpOyB9CisKKyAgLy8gZmluZF9sYXN0X25vdF9vZgorICBzaXplX3R5cGUgZmluZF9sYXN0X25vdF9vZihjb25zdCBfU2VsZiYgX19zLCBzaXplX3R5cGUgX19wb3MgPSBucG9zKSBjb25zdAorICB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwuZmluZF9sYXN0X25vdF9vZihfX3MuX01fbm9uX2RiZ19pbXBsLCBfX3Bvcyk7IH0KKyAgc2l6ZV90eXBlIGZpbmRfbGFzdF9ub3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3BvcyA9IG5wb3MpIGNvbnN0IHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKQorICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKChfX3MgIT0gMCksIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKKyAgICByZXR1cm4gX01fbm9uX2RiZ19pbXBsLmZpbmRfbGFzdF9ub3Rfb2YoX19zLCBfX3Bvcyk7CisgIH0KKyAgc2l6ZV90eXBlIGZpbmRfbGFzdF9ub3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgY29uc3QgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoKF9fcyAhPSAwKSwgX1N0bE1zZ19JTlZBTElEX0FSR1VNRU5UKQorICAgIHJldHVybiBfTV9ub25fZGJnX2ltcGwuZmluZF9sYXN0X25vdF9vZihfX3MsIF9fcG9zLCBfX24pOworICB9CisgIHNpemVfdHlwZSBmaW5kX2xhc3Rfbm90X29mKF9DaGFyVCBfX2MsIHNpemVfdHlwZSBfX3BvcyA9IG5wb3MpIGNvbnN0CisgIHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5maW5kX2xhc3Rfbm90X29mKF9fYywgX19wb3MpOyB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfVEVNUExBVEVfRVhQUkVTU0lPTikKKyMgIGluY2x1ZGUgPHN0bC9kZWJ1Zy9fc3RyaW5nX3N1bV9tZXRob2RzLmg+CisjZW5kaWYKK307CisKKy8vIFRoaXMgaXMgYSBob29rIHRvIGluc3RhbnRpYXRlIFNUTHBvcnQgZXhwb3J0cyBpbiBhIGRlc2lnbmF0ZWQgRExMCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCkgJiYgIWRlZmluZWQgKF9TVExQX1VTRV9NU1ZDNl9NRU1fVF9CVUdfV09SS0FST1VORCkKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBfX2NvbnN0cnVjdF9jaGVja2VyPF9TVExQX05PTl9EQkdfU1RSSU5HX05BTUUgPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+LCBhbGxvY2F0b3I8Y2hhcj4gPiA+OworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgYmFzaWNfc3RyaW5nPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+LCBhbGxvY2F0b3I8Y2hhcj4gPjsKKyMgIGlmIGRlZmluZWQgKF9TVExQX0hBU19XQ0hBUl9UKQorX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIF9fY29uc3RydWN0X2NoZWNrZXI8X1NUTFBfTk9OX0RCR19TVFJJTkdfTkFNRSA8d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4sIGFsbG9jYXRvcjx3Y2hhcl90PiA+ID47CitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBiYXNpY19zdHJpbmc8d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4sIGFsbG9jYXRvcjx3Y2hhcl90PiA+OworIyAgZW5kaWYKKyNlbmRpZgorCisjdW5kZWYgX1NUTFBfTk9OX0RCR19TVFJJTkcKKyN1bmRlZiBfU1RMUF9OT05fREJHX1NUUklOR19OQU1FCisKKyNpZiBkZWZpbmVkIChfX0dOVUNfXykgJiYgKF9fR05VQ19fID09IDIpICYmIChfX0dOVUNfTUlOT1JfXyA9PSA5NikKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK2NvbnN0IHNpemVfdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjpucG9zID0gfihzaXplX3QpIDA7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKGJhc2ljX3N0cmluZykKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorI3VuZGVmIGJhc2ljX3N0cmluZworI2VuZGlmCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2VuZGlmIC8qIF9TVExQX0RCR19TVFJJTkcgKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9kZWJ1Zy9fc3RyaW5nX3N1bV9tZXRob2RzLmggYi9zdGxwb3J0L3N0bC9kZWJ1Zy9fc3RyaW5nX3N1bV9tZXRob2RzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHN0bC9kZWJ1Zy9fc3RyaW5nX3N1bV9tZXRob2RzLmgKcmVuYW1lIHRvIHN0bHBvcnQvc3RsL2RlYnVnL19zdHJpbmdfc3VtX21ldGhvZHMuaApkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdGwvZGVidWcvX3RyZWUuaCBiL3N0bHBvcnQvc3RsL2RlYnVnL190cmVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMyZWRhMgotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc3RsL2RlYnVnL190cmVlLmgKQEAgLTAsMCArMSwzMTcgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisvKiBOT1RFOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBTVEwgaGVhZGVycy4KKyAqICAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuCisgKi8KKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9EQkdfVFJFRV9ICisjZGVmaW5lIF9TVExQX0lOVEVSTkFMX0RCR19UUkVFX0gKKworI2lmbmRlZiBfU1RMUF9EQkdfSVRFUkFUT1JfSAorIyAgaW5jbHVkZSA8c3RsL2RlYnVnL19pdGVyYXRvci5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfRlVOQ1RJT05fQkFTRV9ICisjICBpbmNsdWRlIDxzdGwvX2Z1bmN0aW9uX2Jhc2UuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0FMTE9DX0gKKyMgIGluY2x1ZGUgPHN0bC9fYWxsb2MuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX0NvbXBhcmU+CitjbGFzcyBfRGJnQ29tcGFyZSB7CitwdWJsaWM6CisgIF9EYmdDb21wYXJlKCkge30KKyAgX0RiZ0NvbXBhcmUoY29uc3QgX0NvbXBhcmUmIF9fY21wKSA6IF9NX25vbl9kYmdfY21wKF9fY21wKSB7fQorICBfRGJnQ29tcGFyZShjb25zdCBfRGJnQ29tcGFyZSYgX19jbXApIDogX01fbm9uX2RiZ19jbXAoX19jbXAuX01fbm9uX2RiZ19jbXApIHt9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX0NPTlRBSU5FUlNfRVhURU5TSU9OKQorICBib29sIG9wZXJhdG9yICgpIChjb25zdCBfS2V5JiBfX2xocywgY29uc3QgX0tleSYgX19yaHMpIGNvbnN0IHsKKyNlbHNlCisgIHRlbXBsYXRlIDxjbGFzcyBfS3AxLCBjbGFzcyBfS3AyPgorICBib29sIG9wZXJhdG9yICgpIChjb25zdCBfS3AxJiBfX2xocywgY29uc3QgX0twMiYgX19yaHMpIGNvbnN0IHsKKyNlbmRpZgorICAgIGlmIChfTV9ub25fZGJnX2NtcChfX2xocywgX19yaHMpKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgX0NvbXBhcmUgbm9uX2RiZ19rZXlfY29tcCgpIGNvbnN0IHsgcmV0dXJuIF9NX25vbl9kYmdfY21wOyB9Citwcml2YXRlOgorICBfQ29tcGFyZSBfTV9ub25fZGJnX2NtcDsKK307CisKKyNkZWZpbmUgX1NUTFBfTk9OX0RCR19UUkVFIF9TVExQX1BSSVYgX1NUTFBfTk9OX0RCR19OQU1FKFJiX3RyZWUpIDxfS2V5LCBfU1RMUF9QUklWIF9EYmdDb21wYXJlPF9LZXksIF9Db21wYXJlPiwgX1ZhbHVlLCBfS2V5T2ZWYWx1ZSwgX1RyYWl0cywgX0FsbG9jPgorCisjaWYgZGVmaW5lZCAoX1NUTFBfREVCVUdfVVNFX0RJU1RJTkNUX1ZBTFVFX1RZUEVfSEVMUEVSUykKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9Db21wYXJlLAorICAgICAgICAgIGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0tleU9mVmFsdWUsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYyA+CitpbmxpbmUgX1ZhbHVlKgordmFsdWVfdHlwZShjb25zdCBfU1RMUF9QUklWIF9EQkdfaXRlcl9iYXNlPCBfU1RMUF9OT05fREJHX1RSRUUgPiYpCit7IHJldHVybiAoX1ZhbHVlKikwOyB9Cit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX0NvbXBhcmUsCisgICAgICAgICAgY2xhc3MgX1ZhbHVlLCBjbGFzcyBfS2V5T2ZWYWx1ZSwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jID4KK2lubGluZSBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZworaXRlcmF0b3JfY2F0ZWdvcnkoY29uc3QgX1NUTFBfUFJJViBfREJHX2l0ZXJfYmFzZTwgX1NUTFBfTk9OX0RCR19UUkVFID4mKQoreyByZXR1cm4gYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcoKTsgfQorX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfQ29tcGFyZSwKKyAgICAgICAgICBjbGFzcyBfVmFsdWUsIGNsYXNzIF9LZXlPZlZhbHVlLCBjbGFzcyBfVHJhaXRzLAorICAgICAgICAgIF9TVExQX0RGTF9UTVBMX1BBUkFNKF9BbGxvYywgYWxsb2NhdG9yPF9WYWx1ZT4pID4KK2NsYXNzIF9SYl90cmVlIHsKKyAgdHlwZWRlZiBfU1RMUF9OT05fREJHX1RSRUUgX0Jhc2U7CisgIHR5cGVkZWYgX1JiX3RyZWU8X0tleSwgX0NvbXBhcmUsIF9WYWx1ZSwgX0tleU9mVmFsdWUsIF9UcmFpdHMsIF9BbGxvYz4gX1NlbGY7CisgIF9CYXNlIF9NX25vbl9kYmdfaW1wbDsKKyAgX1NUTFBfUFJJViBfX293bmVkX2xpc3QgX01faXRlcl9saXN0OworCitwdWJsaWM6CisgIF9fSU1QT1JUX0NPTlRBSU5FUl9UWVBFREVGUyhfQmFzZSkKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6a2V5X3R5cGUga2V5X3R5cGU7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpfTm9uQ29uc3RUcmFpdHMgX05vbkNvbnN0SXRlVHJhaXRzOworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6Ol9Db25zdFRyYWl0cyAgICBfQ29uc3RJdGVUcmFpdHM7CisgIHR5cGVkZWYgX1NUTFBfUFJJViBfREJHX2l0ZXI8X0Jhc2UsIF9TVExQX1BSSVYgX0RiZ1RyYWl0czxfTm9uQ29uc3RJdGVUcmFpdHM+ID4gaXRlcmF0b3I7CisgIHR5cGVkZWYgX1NUTFBfUFJJViBfREJHX2l0ZXI8X0Jhc2UsIF9TVExQX1BSSVYgX0RiZ1RyYWl0czxfQ29uc3RJdGVUcmFpdHM+ID4gICAgY29uc3RfaXRlcmF0b3I7CisKKyAgX1NUTFBfREVDTEFSRV9CSURJUkVDVElPTkFMX1JFVkVSU0VfSVRFUkFUT1JTOworCitwcml2YXRlOgorICBfU1RMUF9LRVlfVFlQRV9GT1JfQ09OVF9FWFQoa2V5X3R5cGUpCisgIHZvaWQgX0ludmFsaWRhdGVfaXRlcmF0b3IoY29uc3QgaXRlcmF0b3ImIF9faXQpCisgIHsgX1NUTFBfUFJJViBfX2ludmFsaWRhdGVfaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCxfX2l0KTsgfQorICB2b2lkIF9JbnZhbGlkYXRlX2l0ZXJhdG9ycyhjb25zdCBpdGVyYXRvciYgX19maXJzdCwgY29uc3QgaXRlcmF0b3ImIF9fbGFzdCkKKyAgeyBfU1RMUF9QUklWIF9faW52YWxpZGF0ZV9yYW5nZSgmX01faXRlcl9saXN0LCBfX2ZpcnN0LCBfX2xhc3QpOyB9CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IgX0Jhc2VfaXRlcmF0b3I7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X2l0ZXJhdG9yIF9CYXNlX2NvbnN0X2l0ZXJhdG9yOworCitwdWJsaWM6CisgIF9SYl90cmVlKCkKKyAgICA6IF9NX25vbl9kYmdfaW1wbCgpLCBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KKyAgX1JiX3RyZWUoY29uc3QgX0NvbXBhcmUmIF9fY29tcCkKKyAgICA6IF9NX25vbl9kYmdfaW1wbChfX2NvbXApLCBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KKyAgX1JiX3RyZWUoY29uc3QgX0NvbXBhcmUmIF9fY29tcCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICA6IF9NX25vbl9kYmdfaW1wbChfX2NvbXAsIF9fYSksIF9NX2l0ZXJfbGlzdCgmX01fbm9uX2RiZ19pbXBsKSB7fQorICBfUmJfdHJlZShjb25zdCBfU2VsZiYgX194KQorICAgIDogX01fbm9uX2RiZ19pbXBsKF9feC5fTV9ub25fZGJnX2ltcGwpLCBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19NT1ZFX1NFTUFOVElDKQorICBfUmJfdHJlZShfX21vdmVfc291cmNlPF9TZWxmPiBzcmMpOgorICAgIF9NX25vbl9kYmdfaW1wbChfX21vdmVfc291cmNlPF9CYXNlPihzcmMuZ2V0KCkuX01fbm9uX2RiZ19pbXBsKSksCisgICAgX01faXRlcl9saXN0KCZfTV9ub25fZGJnX2ltcGwpIHsKKyMgIGlmIGRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpIHx8IChfU1RMUF9ERUJVR19MRVZFTCA9PSBfU1RMUF9TVEFOREFSRF9EQkdfTEVWRUwpCisgICAgc3JjLmdldCgpLl9NX2l0ZXJfbGlzdC5fSW52YWxpZGF0ZV9hbGwoKTsKKyMgIGVsc2UKKyAgICBzcmMuZ2V0KCkuX01faXRlcl9saXN0Ll9TZXRfb3duZXIoX01faXRlcl9saXN0KTsKKyMgIGVuZGlmCisgIH0KKyNlbmRpZgorCisgIH5fUmJfdHJlZSgpIHt9CisKKyAgX1NlbGYmIG9wZXJhdG9yPShjb25zdCBfU2VsZiYgX194KSB7CisgICAgaWYgKHRoaXMgIT0gJl9feCkgeworICAgICAgLy9TaG91bGQgbm90IGludmFsaWRhdGUgZW5kIGl0ZXJhdG9yOgorICAgICAgX0ludmFsaWRhdGVfaXRlcmF0b3JzKGJlZ2luKCksIGVuZCgpKTsKKyAgICAgIF9NX25vbl9kYmdfaW1wbCA9IF9feC5fTV9ub25fZGJnX2ltcGw7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdCB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwuZ2V0X2FsbG9jYXRvcigpOyB9CisgIF9Db21wYXJlIGtleV9jb21wKCkgY29uc3QgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLmtleV9jb21wKCkubm9uX2RiZ19rZXlfY29tcCgpOyB9CisKKyAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBpdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuYmVnaW4oKSk7IH0KKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBjb25zdF9pdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuYmVnaW4oKSk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLmVuZCgpKTsgfQorICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBjb25zdF9pdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuZW5kKCkpOyB9CisKKyAgcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisgIHJldmVyc2VfaXRlcmF0b3IgcmVuZCgpIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgY29uc3QgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwuZW1wdHkoKTsgfQorICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5zaXplKCk7IH0KKyAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLm1heF9zaXplKCk7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIHNpemVfdHlwZSBjb3VudChjb25zdCBfS1QmIF9feCkgY29uc3QgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLmNvdW50KF9feCk7IH0KKworICB2b2lkIHN3YXAoX1NlbGYmIF9fdCkgeworICAgIF9NX25vbl9kYmdfaW1wbC5zd2FwKF9fdC5fTV9ub25fZGJnX2ltcGwpOworICAgIF9NX2l0ZXJfbGlzdC5fU3dhcF9vd25lcnMoX190Ll9NX2l0ZXJfbGlzdCk7CisgIH0KKworICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgaXRlcmF0b3IgZmluZChjb25zdCBfS1QmIF9faykKKyAgeyByZXR1cm4gaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLmZpbmQoX19rKSk7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIGNvbnN0X2l0ZXJhdG9yIGZpbmQoY29uc3QgX0tUJiBfX2spIGNvbnN0CisgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5maW5kKF9faykpOyB9CisKKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIGl0ZXJhdG9yIGxvd2VyX2JvdW5kKGNvbnN0IF9LVCYgX194KQorICB7IHJldHVybiBpdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwubG93ZXJfYm91bmQoX194KSk7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIGNvbnN0X2l0ZXJhdG9yIGxvd2VyX2JvdW5kKGNvbnN0IF9LVCYgX194KSBjb25zdAorICB7IHJldHVybiBjb25zdF9pdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwubG93ZXJfYm91bmQoX194KSk7IH0KKworICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgaXRlcmF0b3IgdXBwZXJfYm91bmQoY29uc3QgX0tUJiBfX3gpCisgIHsgcmV0dXJuIGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC51cHBlcl9ib3VuZChfX3gpKTsgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgY29uc3RfaXRlcmF0b3IgdXBwZXJfYm91bmQoY29uc3QgX0tUJiBfX3gpIGNvbnN0CisgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC51cHBlcl9ib3VuZChfX3gpKTsgfQorCisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBwYWlyPGl0ZXJhdG9yLGl0ZXJhdG9yPiBlcXVhbF9yYW5nZShjb25zdCBfS1QmIF9feCkgeworICAgIHJldHVybiBwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4oaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLmxvd2VyX2JvdW5kKF9feCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLnVwcGVyX2JvdW5kKF9feCkpKTsKKyAgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgcGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+IGVxdWFsX3JhbmdlKGNvbnN0IF9LVCYgX194KSBjb25zdCB7CisgICAgcmV0dXJuIHBhaXI8Y29uc3RfaXRlcmF0b3IsY29uc3RfaXRlcmF0b3I+KGNvbnN0X2l0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5sb3dlcl9ib3VuZChfX3gpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLnVwcGVyX2JvdW5kKF9feCkpKTsKKyAgfQorCisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBwYWlyPGl0ZXJhdG9yLGl0ZXJhdG9yPiBlcXVhbF9yYW5nZV91bmlxdWUoY29uc3QgX0tUJiBfX3gpIHsKKyAgICBfU1RMUF9TVEQ6OnBhaXI8X0Jhc2VfaXRlcmF0b3IsIF9CYXNlX2l0ZXJhdG9yPiBfX3A7CisgICAgX19wID0gX01fbm9uX2RiZ19pbXBsLmVxdWFsX3JhbmdlX3VuaXF1ZShfX3gpOworICAgIHJldHVybiBwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4oaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX19wLmZpcnN0KSwgaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX19wLnNlY29uZCkpOworICB9CisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4gZXF1YWxfcmFuZ2VfdW5pcXVlKGNvbnN0IF9LVCYgX194KSBjb25zdCB7CisgICAgX1NUTFBfU1REOjpwYWlyPF9CYXNlX2NvbnN0X2l0ZXJhdG9yLCBfQmFzZV9jb25zdF9pdGVyYXRvcj4gX19wOworICAgIF9fcCA9IF9NX25vbl9kYmdfaW1wbC5lcXVhbF9yYW5nZV91bmlxdWUoX194KTsKKyAgICByZXR1cm4gcGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+KGNvbnN0X2l0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9fcC5maXJzdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvcigmX01faXRlcl9saXN0LCBfX3Auc2Vjb25kKSk7CisgIH0KKworICBwYWlyPGl0ZXJhdG9yLGJvb2w+IGluc2VydF91bmlxdWUoY29uc3QgdmFsdWVfdHlwZSYgX194KSB7CisgICAgX1NUTFBfU1REOjpwYWlyPF9CYXNlX2l0ZXJhdG9yLCBib29sPiBfX3JlcyA9IF9NX25vbl9kYmdfaW1wbC5pbnNlcnRfdW5pcXVlKF9feCk7CisgICAgcmV0dXJuIHBhaXI8aXRlcmF0b3IsIGJvb2w+KGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9fcmVzLmZpcnN0KSwgX19yZXMuc2Vjb25kKTsKKyAgfQorICBpdGVyYXRvciBpbnNlcnRfZXF1YWwoY29uc3QgdmFsdWVfdHlwZSYgX194KQorICB7IHJldHVybiBpdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0X2VxdWFsKF9feCkpOyB9CisKKyAgaXRlcmF0b3IgaW5zZXJ0X3VuaXF1ZShpdGVyYXRvciBfX3BvcywgY29uc3QgdmFsdWVfdHlwZSYgX194KSB7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LF9fcG9zKSkKKyAgICByZXR1cm4gaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLmluc2VydF91bmlxdWUoX19wb3MuX01faXRlcmF0b3IsIF9feCkpOworICB9CisgIGl0ZXJhdG9yIGluc2VydF9lcXVhbChpdGVyYXRvciBfX3BvcywgY29uc3QgdmFsdWVfdHlwZSYgX194KSB7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LCBfX3BvcykpCisgICAgcmV0dXJuIGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5pbnNlcnRfZXF1YWwoX19wb3MuX01faXRlcmF0b3IsIF9feCkpOworICB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgdm9pZCBpbnNlcnRfZXF1YWwoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KSB7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX19jaGVja19yYW5nZShfX2ZpcnN0LF9fbGFzdCkpCisgICAgX01fbm9uX2RiZ19pbXBsLmluc2VydF9lcXVhbChfU1RMUF9QUklWIF9Ob25fRGJnX2l0ZXIoX19maXJzdCksIF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2xhc3QpKTsKKyAgfQorICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgdm9pZCBpbnNlcnRfdW5pcXVlKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9fY2hlY2tfcmFuZ2UoX19maXJzdCxfX2xhc3QpKQorICAgIF9NX25vbl9kYmdfaW1wbC5pbnNlcnRfdW5pcXVlKF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2ZpcnN0KSwgX1NUTFBfUFJJViBfTm9uX0RiZ19pdGVyKF9fbGFzdCkpOworICB9CisjZWxzZQorICB2b2lkIGluc2VydF91bmlxdWUoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KSB7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX19jaGVja19yYW5nZShfX2ZpcnN0LF9fbGFzdCkpCisgICAgX01fbm9uX2RiZ19pbXBsLmluc2VydF91bmlxdWUoX19maXJzdC5fTV9pdGVyYXRvciwgX19sYXN0Ll9NX2l0ZXJhdG9yKTsKKyAgfQorICB2b2lkIGluc2VydF91bmlxdWUoY29uc3QgdmFsdWVfdHlwZSogX19maXJzdCwgY29uc3QgdmFsdWVfdHlwZSogX19sYXN0KSB7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX19jaGVja19wdHJfcmFuZ2UoX19maXJzdCxfX2xhc3QpKQorICAgIF9NX25vbl9kYmdfaW1wbC5pbnNlcnRfdW5pcXVlKF9fZmlyc3QsIF9fbGFzdCk7CisgIH0KKyAgdm9pZCBpbnNlcnRfZXF1YWwoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KSB7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX19jaGVja19yYW5nZShfX2ZpcnN0LF9fbGFzdCkpCisgICAgX01fbm9uX2RiZ19pbXBsLmluc2VydF9lcXVhbChfX2ZpcnN0Ll9NX2l0ZXJhdG9yLCBfX2xhc3QuX01faXRlcmF0b3IpOworICB9CisgIHZvaWQgaW5zZXJ0X2VxdWFsKGNvbnN0IHZhbHVlX3R5cGUqIF9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbGFzdCkgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9fY2hlY2tfcHRyX3JhbmdlKF9fZmlyc3QsX19sYXN0KSkKKyAgICBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0X2VxdWFsKF9fZmlyc3QsIF9fbGFzdCk7CisgIH0KKyNlbmRpZgorCisgIHZvaWQgZXJhc2UoaXRlcmF0b3IgX19wb3MpIHsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfX2NoZWNrX2lmX293bmVyKCZfTV9pdGVyX2xpc3QsX19wb3MpKQorICAgIF9TVExQX0RFQlVHX0NIRUNLKF9EZXJlZmVyZW5jZWFibGUoX19wb3MpKQorICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9yKF9fcG9zKTsKKyAgICBfTV9ub25fZGJnX2ltcGwuZXJhc2UoX19wb3MuX01faXRlcmF0b3IpOworICB9CisgIHNpemVfdHlwZSBlcmFzZShjb25zdCBrZXlfdHlwZSYgX194KSB7CisgICAgcGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+IF9fcCA9IGVxdWFsX3JhbmdlKF9feCk7CisgICAgc2l6ZV90eXBlIF9fbiA9IF9TVExQX1NURDo6ZGlzdGFuY2UoX19wLmZpcnN0Ll9NX2l0ZXJhdG9yLCBfX3Auc2Vjb25kLl9NX2l0ZXJhdG9yKTsKKyAgICBfSW52YWxpZGF0ZV9pdGVyYXRvcnMoX19wLmZpcnN0LCBfX3Auc2Vjb25kKTsKKyAgICBfTV9ub25fZGJnX2ltcGwuZXJhc2UoX19wLmZpcnN0Ll9NX2l0ZXJhdG9yLCBfX3Auc2Vjb25kLl9NX2l0ZXJhdG9yKTsKKyAgICByZXR1cm4gX19uOworICB9CisgIHNpemVfdHlwZSBlcmFzZV91bmlxdWUoY29uc3Qga2V5X3R5cGUmIF9feCkgeworICAgIF9CYXNlX2l0ZXJhdG9yIF9faSA9IF9NX25vbl9kYmdfaW1wbC5maW5kKF9feCk7CisgICAgaWYgKF9faSAhPSBfTV9ub25fZGJnX2ltcGwuZW5kKCkpIHsKKyAgICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9yKGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9faSkpOworICAgICAgX01fbm9uX2RiZ19pbXBsLmVyYXNlKF9faSk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7CisgIH0KKworICB2b2lkIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0LCBiZWdpbigpLCBlbmQoKSkpCisgICAgX0ludmFsaWRhdGVfaXRlcmF0b3JzKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgX01fbm9uX2RiZ19pbXBsLmVyYXNlKF9fZmlyc3QuX01faXRlcmF0b3IsIF9fbGFzdC5fTV9pdGVyYXRvcik7CisgIH0KKyAgdm9pZCBlcmFzZShjb25zdCBrZXlfdHlwZSogX19maXJzdCwgY29uc3Qga2V5X3R5cGUqIF9fbGFzdCkgeworICAgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkgZXJhc2UoKl9fZmlyc3QrKyk7CisgIH0KKworICB2b2lkIGNsZWFyKCkgeworICAgIC8vc2hvdWxkIG5vdCBpbnZhbGlkYXRlIGVuZDoKKyAgICBfSW52YWxpZGF0ZV9pdGVyYXRvcnMoYmVnaW4oKSwgZW5kKCkpOworICAgIF9NX25vbl9kYmdfaW1wbC5jbGVhcigpOworICB9Cit9OworCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI3VuZGVmIF9TVExQX05PTl9EQkdfVFJFRQorCisjZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfREJHX1RSRUVfSCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdGwvZGVidWcvX3ZlY3Rvci5oIGIvc3RscG9ydC9zdGwvZGVidWcvX3ZlY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ODAwZTkKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9kZWJ1Zy9fdmVjdG9yLmgKQEAgLTAsMCArMSw0MjUgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisvKiBOT1RFOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBTVEwgaGVhZGVycy4KKyAqICAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuCisgKi8KKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9EQkdfVkVDVE9SX0gKKyNkZWZpbmUgX1NUTFBfSU5URVJOQUxfREJHX1ZFQ1RPUl9ICisKKyNpZm5kZWYgX1NUTFBfREJHX0lURVJBVE9SX0gKKyMgIGluY2x1ZGUgPHN0bC9kZWJ1Zy9faXRlcmF0b3IuaD4KKyNlbmRpZgorCisjZGVmaW5lIF9TVExQX05PTl9EQkdfVkVDVE9SIF9TVExQX1BSSVYgX1NUTFBfTk9OX0RCR19OQU1FKHZlY3RvcikgPF9UcCwgX0FsbG9jPgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHX1VTRV9ESVNUSU5DVF9WQUxVRV9UWVBFX0hFTFBFUlMpCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgX1RwKgordmFsdWVfdHlwZShjb25zdCBfU1RMUF9QUklWIF9EQkdfaXRlcl9iYXNlPCBfU1RMUF9OT05fREJHX1ZFQ1RPUiA+JikKK3sgcmV0dXJuIChfVHAqKTA7IH0KK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK2lubGluZSByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZworaXRlcmF0b3JfY2F0ZWdvcnkoY29uc3QgX1NUTFBfUFJJViBfREJHX2l0ZXJfYmFzZTwgX1NUTFBfTk9OX0RCR19WRUNUT1IgPiYpCit7IHJldHVybiByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZygpOyB9CisjZW5kaWYKKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfTmNJdD4KK3N0cnVjdCBfVmVjdG9yX2NvbnN0X3RyYWl0czsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX05jSXQ+CitzdHJ1Y3QgX1ZlY3Rvcl9ub25jb25zdF90cmFpdHMgeworICB0eXBlZGVmIF9Ob25jb25zdF90cmFpdHM8X1RwPiBfQmFzZVQ7CisgIHR5cGVkZWYgX1RwIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgX1RwJiByZWZlcmVuY2U7CisgIHR5cGVkZWYgX1RwKiBwb2ludGVyOworICB0eXBlZGVmIF9WZWN0b3JfY29uc3RfdHJhaXRzPF9UcCwgX05jSXQ+IF9Db25zdFRyYWl0czsKKyAgdHlwZWRlZiBfVmVjdG9yX25vbmNvbnN0X3RyYWl0czxfVHAsIF9OY0l0PiBfTm9uQ29uc3RUcmFpdHM7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfTmNJdD4KK3N0cnVjdCBfVmVjdG9yX2NvbnN0X3RyYWl0cyB7CisgIHR5cGVkZWYgX0NvbnN0X3RyYWl0czxfVHA+IF9CYXNlVDsKKyAgdHlwZWRlZiBfVHAgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiBjb25zdCBfVHAmIHJlZmVyZW5jZTsKKyAgdHlwZWRlZiBjb25zdCBfVHAqIHBvaW50ZXI7CisgIHR5cGVkZWYgX1ZlY3Rvcl9jb25zdF90cmFpdHM8X1RwLCBfTmNJdD4gX0NvbnN0VHJhaXRzOworICB0eXBlZGVmIF9WZWN0b3Jfbm9uY29uc3RfdHJhaXRzPF9UcCwgX05jSXQ+IF9Ob25Db25zdFRyYWl0czsKK307CisKK19TVExQX1RFTVBMQVRFX05VTEwKK3N0cnVjdCBfVmVjdG9yX25vbmNvbnN0X3RyYWl0czxib29sLCBfQml0X2l0ZXJhdG9yPiB7CisgIHR5cGVkZWYgX0JpdF9pdGVyYXRvcjo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICB0eXBlZGVmIF9CaXRfaXRlcmF0b3I6OnJlZmVyZW5jZSByZWZlcmVuY2U7CisgIHR5cGVkZWYgX0JpdF9pdGVyYXRvcjo6cG9pbnRlciBwb2ludGVyOworICB0eXBlZGVmIF9WZWN0b3JfY29uc3RfdHJhaXRzPGJvb2wsIF9CaXRfaXRlcmF0b3I+IF9Db25zdFRyYWl0czsKKyAgdHlwZWRlZiBfVmVjdG9yX25vbmNvbnN0X3RyYWl0czxib29sLCBfQml0X2l0ZXJhdG9yPiBfTm9uQ29uc3RUcmFpdHM7Cit9OworCitfU1RMUF9URU1QTEFURV9OVUxMCitzdHJ1Y3QgX1ZlY3Rvcl9jb25zdF90cmFpdHM8Ym9vbCwgX0JpdF9pdGVyYXRvcj4geworICB0eXBlZGVmIF9CaXRfY29uc3RfaXRlcmF0b3I6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiBfQml0X2NvbnN0X2l0ZXJhdG9yOjpyZWZlcmVuY2UgcmVmZXJlbmNlOworICB0eXBlZGVmIF9CaXRfY29uc3RfaXRlcmF0b3I6OnBvaW50ZXIgcG9pbnRlcjsKKyAgdHlwZWRlZiBfVmVjdG9yX2NvbnN0X3RyYWl0czxib29sLCBfQml0X2l0ZXJhdG9yPiBfQ29uc3RUcmFpdHM7CisgIHR5cGVkZWYgX1ZlY3Rvcl9ub25jb25zdF90cmFpdHM8Ym9vbCwgX0JpdF9pdGVyYXRvcj4gX05vbkNvbnN0VHJhaXRzOworfTsKKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIF9TVExQX0RGTF9UTVBMX1BBUkFNKF9BbGxvYywgYWxsb2NhdG9yPF9UcD4pID4KK2NsYXNzIHZlY3RvciA6CisjaWYgIWRlZmluZWQgKF9fRE1DX18pCisgICAgICAgICAgICAgcHJpdmF0ZQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fY29uc3RydWN0X2NoZWNrZXI8IF9TVExQX05PTl9EQkdfVkVDVE9SID4KKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUEFSVElBTF9TUEVDX1dPUktBUk9VTkQpCisgICAgICAgICAgICAgLCBwdWJsaWMgX19zdGxwb3J0X2NsYXNzPHZlY3RvcjxfVHAsIF9BbGxvYz4gPgorI2VuZGlmCit7Citwcml2YXRlOgorICB0eXBlZGVmIF9TVExQX05PTl9EQkdfVkVDVE9SIF9CYXNlOworICB0eXBlZGVmIHZlY3RvcjxfVHAsIF9BbGxvYz4gX1NlbGY7CisgIHR5cGVkZWYgX1NUTFBfUFJJViBfX2NvbnN0cnVjdF9jaGVja2VyPF9TVExQX05PTl9EQkdfVkVDVE9SID4gX0NvbnN0cnVjdENoZWNrOworICBfQmFzZSBfTV9ub25fZGJnX2ltcGw7CisgIF9TVExQX1BSSVYgX19vd25lZF9saXN0IF9NX2l0ZXJfbGlzdDsKKworcHVibGljOgorICBfX0lNUE9SVF9DT05UQUlORVJfVFlQRURFRlMoX0Jhc2UpCisKKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9EQkdfaXRlcjxfQmFzZSwKKyAgICBfU1RMUF9QUklWIF9EYmdUcmFpdHM8X1NUTFBfUFJJViBfVmVjdG9yX25vbmNvbnN0X3RyYWl0czx2YWx1ZV90eXBlLCB0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3I+ID4gPiBpdGVyYXRvcjsKKworICB0eXBlZGVmIF9TVExQX1BSSVYgX0RCR19pdGVyPF9CYXNlLAorICAgIF9TVExQX1BSSVYgX0RiZ1RyYWl0czxfU1RMUF9QUklWIF9WZWN0b3JfY29uc3RfdHJhaXRzPHZhbHVlX3R5cGUsIHR5cGVuYW1lIF9CYXNlOjppdGVyYXRvcj4gPiA+IGNvbnN0X2l0ZXJhdG9yOworCitwcml2YXRlOgorICB2b2lkIF9JbnZhbGlkYXRlX2FsbCgpCisgIHsgX01faXRlcl9saXN0Ll9JbnZhbGlkYXRlX2FsbCgpOyB9CisgIHZvaWQgX0ludmFsaWRhdGVfaXRlcmF0b3IoY29uc3QgaXRlcmF0b3ImIF9faXQpCisgIHsgX1NUTFBfUFJJViBfX2ludmFsaWRhdGVfaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX19pdCk7IH0KKyAgdm9pZCBfSW52YWxpZGF0ZV9pdGVyYXRvcnMoY29uc3QgaXRlcmF0b3ImIF9fZmlyc3QsIGNvbnN0IGl0ZXJhdG9yJiBfX2xhc3QpCisgIHsgX1NUTFBfUFJJViBfX2ludmFsaWRhdGVfcmFuZ2UoJl9NX2l0ZXJfbGlzdCwgX19maXJzdCwgX19sYXN0KTsgfQorCisgIHZvaWQgX0NoZWNrX092ZXJmbG93KHNpemVfdHlwZSBfX25iKSB7CisgICAgaWYgKHNpemUoKSArIF9fbmIgPiBjYXBhY2l0eSgpKQorICAgICAgX0ludmFsaWRhdGVfYWxsKCk7CisgIH0KKyAgdm9pZCBfQ29tcGFyZV9DYXBhY2l0eSAoc2l6ZV90eXBlIF9fb2xkX2NhcGFjaXR5KSB7CisgICAgaWYgKGNhcGFjaXR5KCkgPiBfX29sZF9jYXBhY2l0eSkgeworICAgICAgX0ludmFsaWRhdGVfYWxsKCk7CisgICAgfQorICB9CisKK3B1YmxpYzoKKyAgX1NUTFBfREVDTEFSRV9SQU5ET01fQUNDRVNTX1JFVkVSU0VfSVRFUkFUT1JTOworCisgIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdCB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwuZ2V0X2FsbG9jYXRvcigpOyB9CisKKyAgaXRlcmF0b3IgYmVnaW4oKSAgICAgICAgICAgICB7IHJldHVybiBpdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuYmVnaW4oKSk7IH0KKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBjb25zdF9pdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuYmVnaW4oKSk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgICAgICAgICAgICAgICB7IHJldHVybiBpdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuZW5kKCkpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0ICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLmVuZCgpKTsgfQorCisgIHJldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgICAgICAgICAgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBjb25zdCB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorICByZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSAgICAgICAgICAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgY29uc3QgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCAgICAgICAgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLnNpemUoKTsgfQorICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCAgICB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwubWF4X3NpemUoKTsgfQorICBzaXplX3R5cGUgY2FwYWNpdHkoKSBjb25zdCAgICB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwuY2FwYWNpdHkoKTsgfQorICBib29sIGVtcHR5KCkgY29uc3QgICAgICAgICAgICB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwuZW1wdHkoKTsgfQorCisgIHJlZmVyZW5jZSBvcGVyYXRvcltdKHNpemVfdHlwZSBfX24pIHsKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVChfX24gPCBzaXplKCksIF9TdGxNc2dfT1VUX09GX0JPVU5EUykKKyAgICByZXR1cm4gX01fbm9uX2RiZ19pbXBsW19fbl07CisgIH0KKworICBjb25zdF9yZWZlcmVuY2Ugb3BlcmF0b3JbXShzaXplX3R5cGUgX19uKSBjb25zdCB7CisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoX19uIDwgc2l6ZSgpLCBfU3RsTXNnX09VVF9PRl9CT1VORFMpCisgICAgcmV0dXJuIF9NX25vbl9kYmdfaW1wbFtfX25dOworICB9CisKKyAgcmVmZXJlbmNlIGF0KHNpemVfdHlwZSBfX24pIHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5hdChfX24pOyB9CisgIGNvbnN0X3JlZmVyZW5jZSBhdChzaXplX3R5cGUgX19uKSBjb25zdCB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwuYXQoX19uKTsgfQorCisgIGV4cGxpY2l0IHZlY3Rvcihjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9NX25vbl9kYmdfaW1wbChfX2EpLCBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkgIHt9CisKKyNpZiAhZGVmaW5lZChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorICBleHBsaWNpdCB2ZWN0b3Ioc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3ggPSBfVHAoKSwKKyNlbHNlCisgIHZlY3RvcihzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9feCwKKyNlbmRpZgorICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfTV9ub25fZGJnX2ltcGwoX19uLCBfX3gsIF9fYSksIF9NX2l0ZXJfbGlzdCgmX01fbm9uX2RiZ19pbXBsKSB7fQorCisjaWYgZGVmaW5lZChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorICBleHBsaWNpdCB2ZWN0b3Ioc2l6ZV90eXBlIF9fbikKKyAgICA6IF9NX25vbl9kYmdfaW1wbChfX24pLCBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KKyNlbmRpZgorCisgIHZlY3Rvcihjb25zdCBfU2VsZiYgX194KQorICAgIDogX0NvbnN0cnVjdENoZWNrKF9feCksIF9NX25vbl9kYmdfaW1wbChfX3guX01fbm9uX2RiZ19pbXBsKSwgX01faXRlcl9saXN0KCZfTV9ub25fZGJnX2ltcGwpIHt9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKKyAgdmVjdG9yKF9fbW92ZV9zb3VyY2U8X1NlbGY+IHNyYykKKyAgICA6IF9NX25vbl9kYmdfaW1wbChfX21vdmVfc291cmNlPF9CYXNlPihzcmMuZ2V0KCkuX01fbm9uX2RiZ19pbXBsKSksCisgICAgICBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkgeworIyAgaWYgZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykgfHwgKF9TVExQX0RFQlVHX0xFVkVMID09IF9TVExQX1NUQU5EQVJEX0RCR19MRVZFTCkKKyAgICBzcmMuZ2V0KCkuX01faXRlcl9saXN0Ll9JbnZhbGlkYXRlX2FsbCgpOworIyAgZWxzZQorICAgIHNyYy5nZXQoKS5fTV9pdGVyX2xpc3QuX1NldF9vd25lcihfTV9pdGVyX2xpc3QpOworIyAgZW5kaWYKKyAgfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZlY3RvcihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hIF9TVExQX0FMTE9DQVRPUl9UWVBFX0RGTCkKKyAgICA6IF9Db25zdHJ1Y3RDaGVjayhfX2ZpcnN0LCBfX2xhc3QpLAorICAgICAgX01fbm9uX2RiZ19pbXBsKF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2ZpcnN0KSwgX1NUTFBfUFJJViBfTm9uX0RiZ19pdGVyKF9fbGFzdCksIF9fYSksCisgICAgICBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfTkVFRFNfRVhUUkFfVEVNUExBVEVfQ09OU1RSVUNUT1JTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZlY3RvcihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgOiBfQ29uc3RydWN0Q2hlY2soX19maXJzdCwgX19sYXN0KSwKKyAgICAgIF9NX25vbl9kYmdfaW1wbChfU1RMUF9QUklWIF9Ob25fRGJnX2l0ZXIoX19maXJzdCksIF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2xhc3QpKSwKKyAgICAgIF9NX2l0ZXJfbGlzdCgmX01fbm9uX2RiZ19pbXBsKSB7fQorIyAgZW5kaWYKKyNlbHNlCisgIHZlY3Rvcihjb25zdCBfVHAqIF9fZmlyc3QsIGNvbnN0IF9UcCogX19sYXN0LAorICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfQ29uc3RydWN0Q2hlY2soX19maXJzdCwgX19sYXN0KSwgX01fbm9uX2RiZ19pbXBsKF9fZmlyc3QsIF9fbGFzdCwgX19hKSwKKyAgICBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KKworICAvLyBteXN0ZXJpb3VzIFZDKysgYnVnID8KKyAgdmVjdG9yKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCAsCisgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9Db25zdHJ1Y3RDaGVjayhfX2ZpcnN0LCBfX2xhc3QpLAorICAgICAgX01fbm9uX2RiZ19pbXBsKF9fZmlyc3QuX01faXRlcmF0b3IsIF9fbGFzdC5fTV9pdGVyYXRvciwgX19hKSwKKyAgICBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisKKyAgX1NlbGYmIG9wZXJhdG9yPShjb25zdCBfU2VsZiYgX194KSB7CisgICAgaWYgKHRoaXMgIT0gJl9feCkgeworICAgICAgX0ludmFsaWRhdGVfYWxsKCk7CisgICAgICBfTV9ub25fZGJnX2ltcGwgPSBfX3guX01fbm9uX2RiZ19pbXBsOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB2b2lkIHJlc2VydmUoc2l6ZV90eXBlIF9fbikgeworICAgIGlmIChjYXBhY2l0eSgpIDwgX19uKQorICAgICAgX0ludmFsaWRhdGVfYWxsKCk7CisgICAgX01fbm9uX2RiZ19pbXBsLnJlc2VydmUoX19uKTsKKyAgfQorCisgIHJlZmVyZW5jZSBmcm9udCgpIHsKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghZW1wdHkoKSwgX1N0bE1zZ19FTVBUWV9DT05UQUlORVIpCisgICAgcmV0dXJuICpiZWdpbigpOworICB9CisgIGNvbnN0X3JlZmVyZW5jZSBmcm9udCgpIGNvbnN0IHsKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghZW1wdHkoKSwgX1N0bE1zZ19FTVBUWV9DT05UQUlORVIpCisgICAgcmV0dXJuICpiZWdpbigpOworICB9CisgIHJlZmVyZW5jZSBiYWNrKCkgeworICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFlbXB0eSgpLCBfU3RsTXNnX0VNUFRZX0NPTlRBSU5FUikKKyAgICByZXR1cm4gKigtLWVuZCgpKTsKKyAgfQorICBjb25zdF9yZWZlcmVuY2UgYmFjaygpIGNvbnN0IHsKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghZW1wdHkoKSwgX1N0bE1zZ19FTVBUWV9DT05UQUlORVIpCisgICAgcmV0dXJuICooLS1lbmQoKSk7CisgIH0KKworICB2b2lkIHN3YXAoX1NlbGYmIF9feCkgeworICAgIF9NX2l0ZXJfbGlzdC5fU3dhcF9vd25lcnMoX194Ll9NX2l0ZXJfbGlzdCk7CisgICAgX01fbm9uX2RiZ19pbXBsLnN3YXAoX194Ll9NX25vbl9kYmdfaW1wbCk7CisgIH0KKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUEFSVElBTF9TUEVDX1dPUktBUk9VTkQpICYmICFkZWZpbmVkIChfU1RMUF9GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIpCisgIHZvaWQgX01fc3dhcF93b3JrYXJvdW5kKF9TZWxmJiBfX3gpIHsgc3dhcChfX3gpOyB9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCisgIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBfX3BvcywgY29uc3QgX1RwJiBfX3ggPSBfVHAoKSkgeworI2Vsc2UKKyAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBjb25zdCBfVHAmIF9feCkgeworI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX2lmX293bmVyKCZfTV9pdGVyX2xpc3QsIF9fcG9zKSkKKyAgICBfQ2hlY2tfT3ZlcmZsb3coMSk7CisgICAgcmV0dXJuIGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5pbnNlcnQoX19wb3MuX01faXRlcmF0b3IsIF9feCkpOworICB9CisKKyNpZiBkZWZpbmVkKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCisgIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBfX3BvcykKKyAgeyByZXR1cm4gaW5zZXJ0KF9fcG9zLCBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKF9UcCkpOyB9CisjZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKi8KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIC8vIENoZWNrIHdoZXRoZXIgaXQncyBhbiBpbnRlZ3JhbCB0eXBlLiAgSWYgc28sIGl0J3Mgbm90IGFuIGl0ZXJhdG9yLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLAorICAgICAgICAgICAgICBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpIHsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfb3duZXIoJl9NX2l0ZXJfbGlzdCwgX19wb3MpKQorICAgIHNpemVfdHlwZSBfX29sZF9jYXBhY2l0eSA9IGNhcGFjaXR5KCk7CisgICAgX01fbm9uX2RiZ19pbXBsLmluc2VydChfX3Bvcy5fTV9pdGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2ZpcnN0KSwgX1NUTFBfUFJJViBfTm9uX0RiZ19pdGVyKF9fbGFzdCkpOworICAgIF9Db21wYXJlX0NhcGFjaXR5KF9fb2xkX2NhcGFjaXR5KTsKKyAgfQorI2VuZGlmCisjaWYgIWRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIHZvaWQgaW5zZXJ0IChpdGVyYXRvciBfX3BvcywKKyAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlX3R5cGUgKl9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUgKl9fbGFzdCkgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19wdHJfcmFuZ2UoX19maXJzdCxfX2xhc3QpKQorICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LCBfX3BvcykpCisgICAgc2l6ZV90eXBlIF9fb2xkX2NhcGFjaXR5ID0gY2FwYWNpdHkoKTsKKyAgICBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0KF9fcG9zLl9NX2l0ZXJhdG9yLCBfX2ZpcnN0LCBfX2xhc3QpOworICAgIF9Db21wYXJlX0NhcGFjaXR5KF9fb2xkX2NhcGFjaXR5KTsKKyAgfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykgfHwgIWRlZmluZWQgKF9TVExQX05PX01FVEhPRF9TUEVDSUFMSVpBVElPTikKKyAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3MsCisgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LF9fbGFzdCkpCisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX2lmX293bmVyKCZfTV9pdGVyX2xpc3QsIF9fcG9zKSkKKyAgICAvL1NlcXVlbmNlIHJlcXVpcmVtZW50cyAyMy4xLjEgVGFibGUgNjc6CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX2lmX25vdF9vd25lcigmX01faXRlcl9saXN0LCBfX2ZpcnN0KSk7CisgICAgc2l6ZV90eXBlIF9fb2xkX2NhcGFjaXR5ID0gY2FwYWNpdHkoKTsKKyAgICBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0KF9fcG9zLl9NX2l0ZXJhdG9yLCBfX2ZpcnN0Ll9NX2l0ZXJhdG9yLCBfX2xhc3QuX01faXRlcmF0b3IpOworICAgIF9Db21wYXJlX0NhcGFjaXR5KF9fb2xkX2NhcGFjaXR5KTsKKyAgfQorICB2b2lkIGluc2VydChpdGVyYXRvciBfX3BvcywKKyAgICAgICAgICAgICAgaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KSB7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsX19sYXN0KSkKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfb3duZXIoJl9NX2l0ZXJfbGlzdCwgX19wb3MpKQorICAgIC8vU2VxdWVuY2UgcmVxdWlyZW1lbnRzIDIzLjEuMSBUYWJsZSA2NzoKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfbm90X293bmVyKCZfTV9pdGVyX2xpc3QsIF9fZmlyc3QpKTsKKyAgICBzaXplX3R5cGUgX19vbGRfY2FwYWNpdHkgPSBjYXBhY2l0eSgpOworICAgIF9NX25vbl9kYmdfaW1wbC5pbnNlcnQoX19wb3MuX01faXRlcmF0b3IsIF9fZmlyc3QuX01faXRlcmF0b3IsIF9fbGFzdC5fTV9pdGVyYXRvcik7CisgICAgX0NvbXBhcmVfQ2FwYWNpdHkoX19vbGRfY2FwYWNpdHkpOworICB9CisjZW5kaWYKKworICB2b2lkIGluc2VydCAoaXRlcmF0b3IgX19wb3MsIHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX194KXsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfb3duZXIoJl9NX2l0ZXJfbGlzdCwgX19wb3MpKQorICAgIF9DaGVja19PdmVyZmxvdyhfX24pOworICAgIF9NX25vbl9kYmdfaW1wbC5pbnNlcnQoX19wb3MuX01faXRlcmF0b3IsIF9fbiwgX194KTsKKyAgfQorCisgIHZvaWQgcG9wX2JhY2soKSB7CisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoIWVtcHR5KCksIF9TdGxNc2dfRU1QVFlfQ09OVEFJTkVSKQorICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9yKGVuZCgpKTsKKyAgICBfTV9ub25fZGJnX2ltcGwucG9wX2JhY2soKTsKKyAgfQorICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBfX3BvcykgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX0RlcmVmZXJlbmNlYWJsZShfX3BvcykpCisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX2lmX293bmVyKCZfTV9pdGVyX2xpc3QsIF9fcG9zKSkKKyAgICBfSW52YWxpZGF0ZV9pdGVyYXRvcnMoX19wb3MsIGVuZCgpKTsKKyAgICByZXR1cm4gaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLmVyYXNlKF9fcG9zLl9NX2l0ZXJhdG9yKSk7CisgIH0KKyAgaXRlcmF0b3IgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KSB7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCwgYmVnaW4oKSwgZW5kKCkpKQorICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9ycyhfX2ZpcnN0LCBlbmQoKSk7CisgICAgcmV0dXJuIGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5lcmFzZShfX2ZpcnN0Ll9NX2l0ZXJhdG9yLCBfX2xhc3QuX01faXRlcmF0b3IpKTsKKyAgfQorCisjaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCisgIHZvaWQgcmVzaXplKHNpemVfdHlwZSBfX25ld19zaXplLCBjb25zdCBfVHAmIF9feCA9IF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQoX1RwKSkgeworI2Vsc2UKKyAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9fbmV3X3NpemUsIGNvbnN0IF9UcCYgX194KSB7CisjZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKi8KKyAgICBpZiAoX19uZXdfc2l6ZSA+IGNhcGFjaXR5KCkpIHsKKyAgICAgIF9JbnZhbGlkYXRlX2FsbCgpOworICAgIH0KKyAgICBlbHNlIGlmIChfX25ld19zaXplIDwgc2l6ZSgpKSB7CisgICAgICBfSW52YWxpZGF0ZV9pdGVyYXRvcnMoYmVnaW4oKSArIF9fbmV3X3NpemUsIGVuZCgpKTsKKyAgICB9CisgICAgX01fbm9uX2RiZ19pbXBsLnJlc2l6ZShfX25ld19zaXplLCBfX3gpOworICB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgX19uZXdfc2l6ZSkgeyByZXNpemUoX19uZXdfc2l6ZSwgX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRChfVHApKTsgfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZvaWQgYXNzaWduKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LF9fbGFzdCkpCisgICAgX0ludmFsaWRhdGVfYWxsKCk7CisgICAgX01fbm9uX2RiZ19pbXBsLmFzc2lnbihfU1RMUF9QUklWIF9Ob25fRGJnX2l0ZXIoX19maXJzdCksIF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2xhc3QpKTsKKyAgfQorI2Vsc2UKK3ByaXZhdGU6CisgIHZvaWQgX01fYXNzaWduKGNvbnN0IHZhbHVlX3R5cGUgKl9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUgKl9fbGFzdCkgeworICAgIF9JbnZhbGlkYXRlX2FsbCgpOworICAgIF9NX25vbl9kYmdfaW1wbC5hc3NpZ24oX19maXJzdCwgX19sYXN0KTsKKyAgfQorcHVibGljOgorICB2b2lkIGFzc2lnbihjb25zdCB2YWx1ZV90eXBlICpfX2ZpcnN0LCBjb25zdCB2YWx1ZV90eXBlICpfX2xhc3QpIHsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcHRyX3JhbmdlKF9fZmlyc3QsX19sYXN0KSkKKyAgICBfTV9hc3NpZ24oX19maXJzdCwgX19sYXN0KTsKKyAgfQorCisgIHZvaWQgYXNzaWduKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LF9fbGFzdCkpCisgICAgX01fYXNzaWduKF9fZmlyc3QuX01faXRlcmF0b3IsIF9fbGFzdC5fTV9pdGVyYXRvcik7CisgIH0KKyNlbmRpZgorCitwdWJsaWM6CisgIHZvaWQgYXNzaWduKHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX192YWwpIHsKKyAgICBfSW52YWxpZGF0ZV9hbGwoKTsKKyAgICBfTV9ub25fZGJnX2ltcGwuYXNzaWduKF9fbiwgX192YWwpOworICB9CisKKyAgdm9pZCBjbGVhcigpIHsKKyAgICBfSW52YWxpZGF0ZV9hbGwoKTsKKyAgICBfTV9ub25fZGJnX2ltcGwuY2xlYXIoKTsKKyAgfQorICB2b2lkIHB1c2hfYmFjayhjb25zdCBfVHAmIF9feCkgeworICAgIF9DaGVja19PdmVyZmxvdygxKTsKKyAgICBfTV9ub25fZGJnX2ltcGwucHVzaF9iYWNrKF9feCk7CisgIH0KK307CisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI3VuZGVmIF9TVExQX05PTl9EQkdfVkVDVE9SCisKKyNlbmRpZiAvKiBfU1RMUF9EQkdfVkVDVE9SX0ggKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL21zbF9zdHJpbmcuaCBiL3N0bHBvcnQvc3RsL21zbF9zdHJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmE0OTMxCi0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvbXNsX3N0cmluZy5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgKKyAqIE1hcmsgb2YgdGhlIFVuaWNvcm4sIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIE1hcmsgb2YgdGhlIFVuaWNvcm4sIEluYy4gbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKi8KKyNpZiBkZWZpbmVkKCBfU1RMUF9VU0VfTVNJUEwgKSAmJiAhZGVmaW5lZCggX1NUTFBfTVNMX1NUUklOR19IXyApCisjZGVmaW5lIF9TVExQX01TTF9TVFJJTkdfSF8KKworLy8jIGRlZmluZSBjaGFyX3RyYWl0cyBfX21zbF9jaGFyX3RyYWl0cworIyBkZWZpbmUgYmFzaWNfc3RyaW5nIF9fbXNsX2Jhc2ljX3N0cmluZworIyBkZWZpbmUgYl9zdHJfcmVmIF9fbXNsX2Jfc3RyX3JlZgorIyBkZWZpbmUgYmFzaWNfaXN0cmVhbSBfX21zbF9iYXNpY19pc3RyZWFtCisjIGRlZmluZSBiYXNpY19vc3RyZWFtIF9fbXNsX2Jhc2ljX29zdHJlYW0KKyMgZGVmaW5lIHN0cmluZyBfX21zbF9zdHJpbmcKKyMgZGVmaW5lIHdzdHJpbmcgX19tc2xfd3N0cmluZworIyBkZWZpbmUgaXRlcmF0b3JfdHJhaXRzIF9fbXNsX2l0ZXJhdG9yX3RyYWl0cworCituYW1lc3BhY2Ugc3RkCit7CisgIHRlbXBsYXRlPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHM+IGNsYXNzIGJhc2ljX2lzdHJlYW07CisgIHRlbXBsYXRlPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHM+IGNsYXNzIGJhc2ljX29zdHJlYW07Cit9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9IQVNfSU5DTFVERV9ORVhUKQorIyAgaW5jbHVkZV9uZXh0IDxzdHJpbmc+CisjZWxzZQorIyAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfSEVBREVSKHN0cmluZykKKyNlbmRpZgorCisvLyAjIHVuZGVmIGNoYXJfdHJhaXRzCisjIHVuZGVmIGJhc2ljX3N0cmluZworIyB1bmRlZiBiX3N0cl9yZWYKKyMgdW5kZWYgYmFzaWNfaXN0cmVhbQorIyB1bmRlZiBiYXNpY19vc3RyZWFtCisjIHVuZGVmIHN0cmluZworIyB1bmRlZiB3c3RyaW5nCisjIHVuZGVmIGl0ZXJhdG9yX3RyYWl0cworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL3BvaW50ZXJzL19kZXF1ZS5oIGIvc3RscG9ydC9zdGwvcG9pbnRlcnMvX2RlcXVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgyYTU1OQotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc3RsL3BvaW50ZXJzL19kZXF1ZS5oCkBAIC0wLDAgKzEsMzkwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA0CisgKiBGcmFuY29pcyBEdW1vbnQKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworLyogTk9URTogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgU1RMIGhlYWRlcnMuCisgKiAgIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LgorICovCisKKyNpZm5kZWYgX1NUTFBfU1BFQ0lBTElaRURfREVRVUVfSAorI2RlZmluZSBfU1RMUF9TUEVDSUFMSVpFRF9ERVFVRV9ICisKKyNpZm5kZWYgX1NUTFBfUE9JTlRFUlNfU1BFQ19UT09MU19ICisjICBpbmNsdWRlIDxzdGwvcG9pbnRlcnMvX3Rvb2xzLmg+CisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKKy8qCisgKiBzdHJ1Y3QgaGVscGVyIHRvIGNhc3QgZGVxdWUgaXRlcmF0b3JzOgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgX1N0b3JhZ2VULCBjbGFzcyBfVmFsdWVUPgorc3RydWN0IF9EZXF1ZUl0ZUNhc3QgeworICB0eXBlZGVmIF9EZXF1ZV9pdGVyYXRvcjxfVmFsdWVULCBfTm9uY29uc3RfdHJhaXRzPF9WYWx1ZVQ+ID4gaXRlcmF0b3I7CisgIHR5cGVkZWYgX0RlcXVlX2l0ZXJhdG9yPF9WYWx1ZVQsIF9Db25zdF90cmFpdHM8X1ZhbHVlVD4gPiAgICBjb25zdF9pdGVyYXRvcjsKKyAgdHlwZWRlZiBfRGVxdWVfaXRlcmF0b3I8X1N0b3JhZ2VULCBfTm9uY29uc3RfdHJhaXRzPF9TdG9yYWdlVD4gPiBzdG9yYWdlX2l0ZXJhdG9yOworICB0eXBlZGVmIF9EZXF1ZV9pdGVyYXRvcjxfU3RvcmFnZVQsIF9Db25zdF90cmFpdHM8X1N0b3JhZ2VUPiA+IGNvbnN0X3N0b3JhZ2VfaXRlcmF0b3I7CisgIHR5cGVkZWYgX0Nhc3RUcmFpdHM8X1N0b3JhZ2VULCBfVmFsdWVUPiBjYXN0X3RyYWl0czsKKworICBzdGF0aWMgaXRlcmF0b3IgdG9fdmFsdWVfdHlwZV9pdGUgKHN0b3JhZ2VfaXRlcmF0b3IgY29uc3QmIF9faXRlKSB7CisgICAgaXRlcmF0b3IgdG1wOworICAgIHRtcC5fTV9jdXIgPSBjYXN0X3RyYWl0czo6dG9fdmFsdWVfdHlwZV9wdHIoX19pdGUuX01fY3VyKTsKKyAgICB0bXAuX01fZmlyc3QgPSBjYXN0X3RyYWl0czo6dG9fdmFsdWVfdHlwZV9wdHIoX19pdGUuX01fZmlyc3QpOworICAgIHRtcC5fTV9sYXN0ID0gY2FzdF90cmFpdHM6OnRvX3ZhbHVlX3R5cGVfcHRyKF9faXRlLl9NX2xhc3QpOworICAgIHRtcC5fTV9ub2RlID0gY2FzdF90cmFpdHM6OnRvX3ZhbHVlX3R5cGVfcHB0cihfX2l0ZS5fTV9ub2RlKTsKKyAgICByZXR1cm4gdG1wOworICB9CisgIHN0YXRpYyBzdG9yYWdlX2l0ZXJhdG9yIHRvX3N0b3JhZ2VfdHlwZV9pdGUgKGl0ZXJhdG9yIGNvbnN0JiBfX2l0ZSkgeworICAgIHN0b3JhZ2VfaXRlcmF0b3IgdG1wOworICAgIHRtcC5fTV9jdXIgPSBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX3B0cihfX2l0ZS5fTV9jdXIpOworICAgIHRtcC5fTV9maXJzdCA9IGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfcHRyKF9faXRlLl9NX2ZpcnN0KTsKKyAgICB0bXAuX01fbGFzdCA9IGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfcHRyKF9faXRlLl9NX2xhc3QpOworICAgIHRtcC5fTV9ub2RlID0gY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9wcHRyKF9faXRlLl9NX25vZGUpOworICAgIHJldHVybiB0bXA7CisgIH0KKworICBzdGF0aWMgY29uc3RfaXRlcmF0b3IgdG9fdmFsdWVfdHlwZV9jaXRlIChjb25zdF9zdG9yYWdlX2l0ZXJhdG9yIGNvbnN0JiBfX2l0ZSkgeworICAgIGNvbnN0X2l0ZXJhdG9yIHRtcDsKKyAgICB0bXAuX01fY3VyID0gY2FzdF90cmFpdHM6OnRvX3ZhbHVlX3R5cGVfcHRyKF9faXRlLl9NX2N1cik7CisgICAgdG1wLl9NX2ZpcnN0ID0gY2FzdF90cmFpdHM6OnRvX3ZhbHVlX3R5cGVfcHRyKF9faXRlLl9NX2ZpcnN0KTsKKyAgICB0bXAuX01fbGFzdCA9IGNhc3RfdHJhaXRzOjp0b192YWx1ZV90eXBlX3B0cihfX2l0ZS5fTV9sYXN0KTsKKyAgICB0bXAuX01fbm9kZSA9IGNhc3RfdHJhaXRzOjp0b192YWx1ZV90eXBlX3BwdHIoX19pdGUuX01fbm9kZSk7CisgICAgcmV0dXJuIHRtcDsKKyAgfQorCisgIHN0YXRpYyBjb25zdF9zdG9yYWdlX2l0ZXJhdG9yIHRvX3N0b3JhZ2VfdHlwZV9jaXRlIChjb25zdF9pdGVyYXRvciBjb25zdCYgX19pdGUpIHsKKyAgICBjb25zdF9zdG9yYWdlX2l0ZXJhdG9yIHRtcDsKKyAgICB0bXAuX01fY3VyID0gY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9wdHIoX19pdGUuX01fY3VyKTsKKyAgICB0bXAuX01fZmlyc3QgPSBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX3B0cihfX2l0ZS5fTV9maXJzdCk7CisgICAgdG1wLl9NX2xhc3QgPSBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX3B0cihfX2l0ZS5fTV9sYXN0KTsKKyAgICB0bXAuX01fbm9kZSA9IGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfcHB0cihfX2l0ZS5fTV9ub2RlKTsKKyAgICByZXR1cm4gdG1wOworICB9Cit9OworCisjZGVmaW5lIERFUVVFX0lNUEwgX1NUTFBfUFRSX0lNUExfTkFNRShkZXF1ZSkKKyNpZiBkZWZpbmVkIChfX0JPUkxBTkRDX18pIHx8IGRlZmluZWQgKF9fRE1DX18pCisjICBkZWZpbmUgdHlwZW5hbWUKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCkgJiYgIWRlZmluZWQgKF9TVExQX1VTRV9NU1ZDNl9NRU1fVF9CVUdfV09SS0FST1VORCkKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBfU1RMUF9hbGxvY19wcm94eTxzaXplX3QsIHZvaWQqLCAgYWxsb2NhdG9yPHZvaWQqPiA+OworX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIF9TVExQX2FsbG9jX3Byb3h5PHZvaWQqKiosIHZvaWQqKiwgIGFsbG9jYXRvcjx2b2lkKio+ID47CitfU1RMUF9FWFBPUlQgdGVtcGxhdGUgc3RydWN0IF9TVExQX0NMQVNTX0RFQ0xTUEVDIF9EZXF1ZV9pdGVyYXRvcjx2b2lkKiwgX05vbmNvbnN0X3RyYWl0czx2b2lkKj4gPjsKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBfRGVxdWVfYmFzZTx2b2lkKixhbGxvY2F0b3I8dm9pZCo+ID47CitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgREVRVUVfSU1QTDx2b2lkKixhbGxvY2F0b3I8dm9pZCo+ID47CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHKQorIyAgZGVmaW5lIGRlcXVlIF9TVExQX05PTl9EQkdfTkFNRShkZXF1ZSkKKyNlbHNlCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBfU1RMUF9ERkxfVE1QTF9QQVJBTShfQWxsb2MsIGFsbG9jYXRvcjxfVHA+KSA+CitjbGFzcyBkZXF1ZQorI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QQVJUSUFMX1NQRUNfV09SS0FST1VORCkgJiYgIWRlZmluZWQgKGRlcXVlKQorICAgICAgICAgICAgOiBwdWJsaWMgX19zdGxwb3J0X2NsYXNzPGRlcXVlPF9UcCwgX0FsbG9jPiA+CisjZW5kaWYKK3sKKyAgdHlwZWRlZiBfU1RMUF9UWVBFTkFNRSBfU1RMUF9QUklWIF9TdG9yYWdlVHlwZTxfVHA+OjpfVHlwZSBfU3RvcmFnZVR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jX3RyYWl0czxfU3RvcmFnZVR5cGUsIF9BbGxvYz46OmFsbG9jYXRvcl90eXBlIF9TdG9yYWdlVHlwZUFsbG9jOworICB0eXBlZGVmIF9TVExQX1BSSVYgREVRVUVfSU1QTDxfU3RvcmFnZVR5cGUsIF9TdG9yYWdlVHlwZUFsbG9jPiBfQmFzZTsKKyAgdHlwZWRlZiBkZXF1ZTxfVHAsIF9BbGxvYz4gX1NlbGY7CisKKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9DYXN0VHJhaXRzPF9TdG9yYWdlVHlwZSwgX1RwPiBjYXN0X3RyYWl0czsKKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9EZXF1ZUl0ZUNhc3Q8X1N0b3JhZ2VUeXBlLCBfVHA+IGl0ZV9jYXN0X3RyYWl0czsKKworcHVibGljOgorICB0eXBlZGVmIF9UcCB2YWx1ZV90eXBlOworICB0eXBlZGVmIHZhbHVlX3R5cGUqIHBvaW50ZXI7CisgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSogY29uc3RfcG9pbnRlcjsKKyAgdHlwZWRlZiB2YWx1ZV90eXBlJiByZWZlcmVuY2U7CisgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSYgY29uc3RfcmVmZXJlbmNlOworICB0eXBlZGVmIHNpemVfdCBzaXplX3R5cGU7CisgIHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKKyAgdHlwZWRlZiByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyBfSXRlcmF0b3JfY2F0ZWdvcnk7CisgIF9TVExQX0ZPUkNFX0FMTE9DQVRPUlModmFsdWVfdHlwZSwgX0FsbG9jKQorICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY190cmFpdHM8dmFsdWVfdHlwZSwgX0FsbG9jPjo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7CisgIHR5cGVkZWYgX1NUTFBfUFJJViBfRGVxdWVfaXRlcmF0b3I8dmFsdWVfdHlwZSwgX05vbmNvbnN0X3RyYWl0czx2YWx1ZV90eXBlPiA+IGl0ZXJhdG9yOworICB0eXBlZGVmIF9TVExQX1BSSVYgX0RlcXVlX2l0ZXJhdG9yPHZhbHVlX3R5cGUsIF9Db25zdF90cmFpdHM8dmFsdWVfdHlwZT4gPiAgICBjb25zdF9pdGVyYXRvcjsKKworICBfU1RMUF9ERUNMQVJFX1JBTkRPTV9BQ0NFU1NfUkVWRVJTRV9JVEVSQVRPUlM7CisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gQmFzaWMgYWNjZXNzb3JzCisgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gaXRlX2Nhc3RfdHJhaXRzOjp0b192YWx1ZV90eXBlX2l0ZShfTV9pbXBsLmJlZ2luKCkpOyB9CisgIGl0ZXJhdG9yIGVuZCgpICAgeyByZXR1cm4gaXRlX2Nhc3RfdHJhaXRzOjp0b192YWx1ZV90eXBlX2l0ZShfTV9pbXBsLmVuZCgpKTsgfQorICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGl0ZV9jYXN0X3RyYWl0czo6dG9fdmFsdWVfdHlwZV9jaXRlKF9NX2ltcGwuYmVnaW4oKSk7IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgICB7IHJldHVybiBpdGVfY2FzdF90cmFpdHM6OnRvX3ZhbHVlX3R5cGVfY2l0ZShfTV9pbXBsLmVuZCgpKTsgfQorCisgIHJldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKyAgcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3QKKyAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgY29uc3QKKyAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorCisgIHJlZmVyZW5jZSBvcGVyYXRvcltdKHNpemVfdHlwZSBfX24pCisgIHsgcmV0dXJuIGNhc3RfdHJhaXRzOjp0b192YWx1ZV90eXBlX3JlZihfTV9pbXBsW19fbl0pOyB9CisgIGNvbnN0X3JlZmVyZW5jZSBvcGVyYXRvcltdKHNpemVfdHlwZSBfX24pIGNvbnN0CisgIHsgcmV0dXJuIGNhc3RfdHJhaXRzOjp0b192YWx1ZV90eXBlX2NyZWYoX01faW1wbFtfX25dKTsgfQorCisgIHJlZmVyZW5jZSBhdChzaXplX3R5cGUgX19uKQorICB7IHJldHVybiBjYXN0X3RyYWl0czo6dG9fdmFsdWVfdHlwZV9yZWYoX01faW1wbC5hdChfX24pKTsgfQorICBjb25zdF9yZWZlcmVuY2UgYXQoc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgeyByZXR1cm4gY2FzdF90cmFpdHM6OnRvX3ZhbHVlX3R5cGVfY3JlZihfTV9pbXBsLmF0KF9fbikpOyB9CisKKyAgcmVmZXJlbmNlIGZyb250KCkgeyByZXR1cm4gY2FzdF90cmFpdHM6OnRvX3ZhbHVlX3R5cGVfcmVmKF9NX2ltcGwuZnJvbnQoKSk7IH0KKyAgcmVmZXJlbmNlIGJhY2soKSAgeyByZXR1cm4gY2FzdF90cmFpdHM6OnRvX3ZhbHVlX3R5cGVfcmVmKF9NX2ltcGwuYmFjaygpKTsgfQorICBjb25zdF9yZWZlcmVuY2UgZnJvbnQoKSBjb25zdCB7IHJldHVybiBjYXN0X3RyYWl0czo6dG9fdmFsdWVfdHlwZV9jcmVmKF9NX2ltcGwuZnJvbnQoKSk7IH0KKyAgY29uc3RfcmVmZXJlbmNlIGJhY2soKSBjb25zdCAgeyByZXR1cm4gY2FzdF90cmFpdHM6OnRvX3ZhbHVlX3R5cGVfY3JlZihfTV9pbXBsLmJhY2soKSk7IH0KKworICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0ICAgICB7IHJldHVybiBfTV9pbXBsLnNpemUoKTsgfQorICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCB7IHJldHVybiBfTV9pbXBsLm1heF9zaXplKCk7IH0KKyAgYm9vbCBlbXB0eSgpIGNvbnN0ICAgICAgICAgeyByZXR1cm4gX01faW1wbC5lbXB0eSgpOyB9CisgIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdCB7IHJldHVybiBfU1RMUF9DT05WRVJUX0FMTE9DQVRPUihfTV9pbXBsLmdldF9hbGxvY2F0b3IoKSwgdmFsdWVfdHlwZSk7IH0KKworICBleHBsaWNpdCBkZXF1ZShjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9NX2ltcGwoX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoX19hLCBfU3RvcmFnZVR5cGUpKSB7fQorCisgIGRlcXVlKGNvbnN0IF9TZWxmJiBfX3gpIDogX01faW1wbChfX3guX01faW1wbCkge30KKworI2lmICFkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorICBleHBsaWNpdCBkZXF1ZShzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ZhbCA9IF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQodmFsdWVfdHlwZSksCisjZWxzZQorICBkZXF1ZShzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ZhbCwKKyNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0qLworICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9NX2ltcGwoX19uLCBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWYoX192YWwpLCBfU1RMUF9DT05WRVJUX0FMTE9DQVRPUihfX2EsIF9TdG9yYWdlVHlwZSkpIHt9CisgIC8vIGludCxsb25nIHZhcmlhbnRzIG1heSBiZSBuZWVkZWQKKyNpZiBkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorICBleHBsaWNpdCBkZXF1ZShzaXplX3R5cGUgX19uKSA6IF9NX2ltcGwoX19uKSB7fQorI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIGRlcXVlKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSBfU1RMUF9BTExPQ0FUT1JfVFlQRV9ERkwpCisjaWYgIWRlZmluZWQgKF9TVExQX1VTRV9JVEVSQVRPUl9XUkFQUEVSKQorICA6IF9NX2ltcGwoX19maXJzdCwgX19sYXN0LAorICAgICAgICAgICAgX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoX19hLCBfU3RvcmFnZVR5cGUpKSB7CisjZWxzZQorICA6IF9NX2ltcGwoX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoX19hLCBfU3RvcmFnZVR5cGUpKSB7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfSVRFUkFUT1JfV1JBUFBFUikKKyAgICBpbnNlcnQoZW5kKCksIF9fZmlyc3QsIF9fbGFzdCk7CisjZW5kaWYKKyAgfQorCisjICBpZiBkZWZpbmVkIChfU1RMUF9ORUVEU19FWFRSQV9URU1QTEFURV9DT05TVFJVQ1RPUlMpCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgZGVxdWUoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorIyAgICBpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX0lURVJBVE9SX1dSQVBQRVIpCisgICAgOiBfTV9pbXBsKF9fZmlyc3QsIF9fbGFzdCkge30KKyMgICAgZWxzZQorICB7IGluc2VydChlbmQoKSwgX19maXJzdCwgX19sYXN0KTsgfQorIyAgICBlbmRpZgorIyAgZW5kaWYKKworI2Vsc2UKKyAgZGVxdWUoY29uc3RfcG9pbnRlciBfX2ZpcnN0LCBjb25zdF9wb2ludGVyIF9fbGFzdCwKKyAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkgKQorICAgIDogX01faW1wbChjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NwdHIoX19maXJzdCksCisgICAgICAgICAgICAgIGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3B0cihfX2xhc3QpLAorICAgICAgICAgICAgICBfU1RMUF9DT05WRVJUX0FMTE9DQVRPUihfX2EsIF9TdG9yYWdlVHlwZSkpIHt9CisKKyAgZGVxdWUoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0LAorICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSApCisgICAgOiBfTV9pbXBsKGl0ZV9jYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NpdGUoX19maXJzdCksCisgICAgICAgICAgICAgIGl0ZV9jYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NpdGUoX19sYXN0KSwKKyAgICAgICAgICAgICAgX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoX19hLCBfU3RvcmFnZVR5cGUpKSB7fQorI2VuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19NT1ZFX1NFTUFOVElDKQorICBkZXF1ZShfX21vdmVfc291cmNlPF9TZWxmPiBzcmMpCisgICAgOiBfTV9pbXBsKF9fbW92ZV9zb3VyY2U8X0Jhc2U+KHNyYy5nZXQoKS5fTV9pbXBsKSkge30KKyNlbmRpZgorCisgIF9TZWxmJiBvcGVyYXRvcj0gKGNvbnN0IF9TZWxmJiBfX3gpIHsgX01faW1wbCA9IF9feC5fTV9pbXBsOyByZXR1cm4gKnRoaXM7IH0KKworICB2b2lkIHN3YXAoX1NlbGYmIF9feCkgeyBfTV9pbXBsLnN3YXAoX194Ll9NX2ltcGwpOyB9CisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKSAmJiAhZGVmaW5lZCAoX1NUTFBfRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSKQorICB2b2lkIF9NX3N3YXBfd29ya2Fyb3VuZChfU2VsZiYgX194KSB7IHN3YXAoX194KTsgfQorI2VuZGlmCisKKyAgdm9pZCBhc3NpZ24oc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX192YWwpIHsKKyAgICBfTV9pbXBsLmFzc2lnbihfX24sIGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3JlZihfX3ZhbCkpOworICB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX0lURVJBVE9SX1dSQVBQRVIpCitwcml2YXRlOgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0ludGVnZXI+CisgIHZvaWQgX01fYXNzaWduX2Rpc3BhdGNoKF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX192YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fdHJ1ZV90eXBlJikKKyAgeyBfTV9pbXBsLmFzc2lnbihfX24sIF9fdmFsKTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgdm9pZCBfTV9hc3NpZ25fZGlzcGF0Y2goX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2ZhbHNlX3R5cGUmKSB7CisgICAgX01faW1wbC5hc3NpZ24oX1NUTFBfVFlQRU5BTUUgX1NUTFBfUFJJViBfSXRlV3JhcHBlcjxfU3RvcmFnZVR5cGUsIF9UcCwgX0lucHV0SXRlcmF0b3I+OjpfSXRlKF9fZmlyc3QpLAorICAgICAgICAgICAgICAgICAgIF9TVExQX1RZUEVOQU1FIF9TVExQX1BSSVYgX0l0ZVdyYXBwZXI8X1N0b3JhZ2VUeXBlLCBfVHAsIF9JbnB1dEl0ZXJhdG9yPjo6X0l0ZShfX2xhc3QpKTsKKyAgfQorCitwdWJsaWM6CisjICBlbmRpZgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZvaWQgYXNzaWduKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkgeworIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX0lURVJBVE9SX1dSQVBQRVIpCisgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXNJbnRlZ3JhbDxfSW5wdXRJdGVyYXRvcj46Ol9SZXQgX0ludGVncmFsOworICAgIF9NX2Fzc2lnbl9kaXNwYXRjaChfX2ZpcnN0LCBfX2xhc3QsIF9JbnRlZ3JhbCgpKTsKKyMgIGVsc2UKKyAgICBfTV9pbXBsLmFzc2lnbihfX2ZpcnN0LCBfX2xhc3QpOworIyAgZW5kaWYKKyAgfQorI2Vsc2UKKyAgdm9pZCBhc3NpZ24oY29uc3RfcG9pbnRlciBfX2ZpcnN0LCBjb25zdF9wb2ludGVyIF9fbGFzdCkKKyAgeyBfTV9pbXBsLmFzc2lnbihjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NwdHIoX19maXJzdCksCisgICAgICAgICAgICAgICAgICAgY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcHRyKF9fbGFzdCkpOyB9CisgIHZvaWQgYXNzaWduKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKKyAgeyBfTV9pbXBsLmFzc2lnbihpdGVfY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jaXRlKF9fZmlyc3QpLAorICAgICAgICAgICAgICAgICAgIGl0ZV9jYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NpdGUoX19sYXN0KSk7IH0KKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkgJiYgIWRlZmluZWQgKF9TVExQX05PX0FOQUNIUk9OSVNNUykKKyAgdm9pZCBwdXNoX2JhY2soY29uc3QgdmFsdWVfdHlwZSYgX190ID0gX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRCh2YWx1ZV90eXBlKSkKKyNlbHNlCisgIHZvaWQgcHVzaF9iYWNrKGNvbnN0IHZhbHVlX3R5cGUmIF9fdCkKKyNlbmRpZiAvKiFfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNICYmICFfU1RMUF9OT19BTkFDSFJPTklTTVMqLworICB7IF9NX2ltcGwucHVzaF9iYWNrKGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3JlZihfX3QpKTsgfQorCisjaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pICYmICFkZWZpbmVkIChfU1RMUF9OT19BTkFDSFJPTklTTVMpCisgIHZvaWQgcHVzaF9mcm9udChjb25zdCB2YWx1ZV90eXBlJiBfX3QgPSBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKHZhbHVlX3R5cGUpKQorI2Vsc2UKKyAgdm9pZCBwdXNoX2Zyb250KGNvbnN0IHZhbHVlX3R5cGUmIF9fdCkKKyNlbmRpZiAvKiFfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNICYmICFfU1RMUF9OT19BTkFDSFJPTklTTVMqLworICB7IF9NX2ltcGwucHVzaF9mcm9udChjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWYoX190KSk7IH0KKworIyBpZiBkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fQU5BQ0hST05JU01TKQorICB2b2lkIHB1c2hfYmFjaygpICB7IF9NX2ltcGwucHVzaF9iYWNrKCk7IH0KKyAgdm9pZCBwdXNoX2Zyb250KCkgeyBfTV9pbXBsLnB1c2hfZnJvbnQoKTsgfQorIyBlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0gJiYgIV9TVExQX05PX0FOQUNIUk9OSVNNUyovCisKKyAgdm9pZCBwb3BfYmFjaygpICB7IF9NX2ltcGwucG9wX2JhY2soKTsgfQorICB2b2lkIHBvcF9mcm9udCgpIHsgX01faW1wbC5wb3BfZnJvbnQoKTsgfQorCisjaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pICYmICFkZWZpbmVkIChfU1RMUF9OT19BTkFDSFJPTklTTVMpCisgIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBfX3BvcywgY29uc3QgdmFsdWVfdHlwZSYgX194ID0gX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRCh2YWx1ZV90eXBlKSkKKyNlbHNlCisgIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBfX3BvcywgY29uc3QgdmFsdWVfdHlwZSYgX194KQorI2VuZGlmIC8qIV9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0gJiYgIV9TVExQX05PX0FOQUNIUk9OSVNNUyovCisgIHsgcmV0dXJuIGl0ZV9jYXN0X3RyYWl0czo6dG9fdmFsdWVfdHlwZV9pdGUoX01faW1wbC5pbnNlcnQoaXRlX2Nhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfaXRlKF9fcG9zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWYoX194KSkpOyB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fQU5BQ0hST05JU01TKQorICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgX19wb3MpIHsgcmV0dXJuIGluc2VydChfX3BvcywgX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRCh2YWx1ZV90eXBlKSk7IH0KKyNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0gJiYgIV9TVExQX05PX0FOQUNIUk9OSVNNUyovCisKKyAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgeyBfTV9pbXBsLmluc2VydChpdGVfY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9pdGUoX19wb3MpLCBfX24sIGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3JlZihfX3gpKTsgfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9JVEVSQVRPUl9XUkFQUEVSKQorcHJpdmF0ZToKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2VyPgorICB2b2lkIF9NX2luc2VydF9kaXNwYXRjaChpdGVyYXRvciBfX3BvcywgX0ludGVnZXIgX19uLCBfSW50ZWdlciBfX3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX190cnVlX3R5cGUmKSB7CisgICAgX01faW1wbC5pbnNlcnQoaXRlX2Nhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfaXRlKF9fcG9zKSwgX19uLCBfX3ZhbCk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZvaWQgX01faW5zZXJ0X2Rpc3BhdGNoKGl0ZXJhdG9yIF9fcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fZmFsc2VfdHlwZSYpIHsKKyAgICBfTV9pbXBsLmluc2VydChpdGVfY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9pdGUoX19wb3MpLAorICAgICAgICAgICAgICAgICAgIF9TVExQX1RZUEVOQU1FIF9TVExQX1BSSVYgX0l0ZVdyYXBwZXI8X1N0b3JhZ2VUeXBlLCBfVHAsIF9JbnB1dEl0ZXJhdG9yPjo6X0l0ZShfX2ZpcnN0KSwKKyAgICAgICAgICAgICAgICAgICBfU1RMUF9UWVBFTkFNRSBfU1RMUF9QUklWIF9JdGVXcmFwcGVyPF9TdG9yYWdlVHlwZSwgX1RwLCBfSW5wdXRJdGVyYXRvcj46Ol9JdGUoX19sYXN0KSk7CisgIH0KKworcHVibGljOgorIyAgZW5kaWYKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpIHsKKyMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9JVEVSQVRPUl9XUkFQUEVSKQorICAgIC8vIENoZWNrIHdoZXRoZXIgaXQncyBhbiBpbnRlZ3JhbCB0eXBlLiAgSWYgc28sIGl0J3Mgbm90IGFuIGl0ZXJhdG9yLgorICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lzSW50ZWdyYWw8X0lucHV0SXRlcmF0b3I+OjpfUmV0IF9JbnRlZ3JhbDsKKyAgICBfTV9pbnNlcnRfZGlzcGF0Y2goX19wb3MsIF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOworIyAgZWxzZQorICAgIF9NX2ltcGwuaW5zZXJ0KGl0ZV9jYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2l0ZShfX3BvcyksIF9fZmlyc3QsIF9fbGFzdCk7CisjICBlbmRpZgorICB9CisKKyNlbHNlIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKyAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3MsCisgICAgICAgICAgICAgIGNvbnN0X3BvaW50ZXIgX19maXJzdCwgY29uc3RfcG9pbnRlciBfX2xhc3QpIHsKKyAgICBfTV9pbXBsLmluc2VydChpdGVfY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9pdGUoX19wb3MpLAorICAgICAgICAgICAgICAgICAgIGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3B0cihfX2ZpcnN0KSwKKyAgICAgICAgICAgICAgICAgICBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NwdHIoX19sYXN0KSk7CisgIH0KKyAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3MsCisgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkgeworICAgIF9NX2ltcGwuaW5zZXJ0KGl0ZV9jYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2l0ZShfX3BvcyksCisgICAgICAgICAgICAgICAgICAgaXRlX2Nhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY2l0ZShfX2ZpcnN0KSwKKyAgICAgICAgICAgICAgICAgICBpdGVfY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jaXRlKF9fbGFzdCkpOworICB9CisKKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKKyAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9fbmV3X3NpemUsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCA9IF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQodmFsdWVfdHlwZSkpCisjZWxzZQorICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgX19uZXdfc2l6ZSwgY29uc3QgdmFsdWVfdHlwZSYgX194KQorI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCisgIHsgX01faW1wbC5yZXNpemUoX19uZXdfc2l6ZSwgY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcmVmKF9feCkpOyB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgX19uZXdfc2l6ZSkgeyBfTV9pbXBsLnJlc2l6ZShfX25ld19zaXplKTsgfQorI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCisKKyAgaXRlcmF0b3IgZXJhc2UoaXRlcmF0b3IgX19wb3MpCisgIHsgcmV0dXJuIGl0ZV9jYXN0X3RyYWl0czo6dG9fdmFsdWVfdHlwZV9pdGUoX01faW1wbC5lcmFzZShpdGVfY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9pdGUoX19wb3MpKSk7IH0KKworICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpCisgIHsgcmV0dXJuIGl0ZV9jYXN0X3RyYWl0czo6dG9fdmFsdWVfdHlwZV9pdGUoX01faW1wbC5lcmFzZShpdGVfY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9pdGUoX19maXJzdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVfY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9pdGUoX19sYXN0KSkpOyB9CisgIHZvaWQgY2xlYXIoKSB7IF9NX2ltcGwuY2xlYXIoKTsgfQorCitwcml2YXRlOgorICBfQmFzZSBfTV9pbXBsOworfTsKKworI2lmIGRlZmluZWQgKGRlcXVlKQorIyAgdW5kZWYgZGVxdWUKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorI2VuZGlmCisKKyN1bmRlZiBERVFVRV9JTVBMCisjaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKSB8fCBkZWZpbmVkIChfX0RNQ19fKQorIyAgdW5kZWYgdHlwZW5hbWUKKyNlbmRpZgorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNlbmRpZiAvKiBfU1RMUF9TUEVDSUFMSVpFRF9ERVFVRV9IICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9wb2ludGVycy9fbGlzdC5oIGIvc3RscG9ydC9zdGwvcG9pbnRlcnMvX2xpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmE5MjYyCi0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvcG9pbnRlcnMvX2xpc3QuaApAQCAtMCwwICsxLDM0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMworICogRnJhbmNvaXMgRHVtb250CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKy8qIE5PVEU6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIFNUTCBoZWFkZXJzLgorICogICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4KKyAqLworCisjaWZuZGVmIF9TVExQX1BUUl9TUEVDSUFMSVpFRF9MSVNUX0gKKyNkZWZpbmUgX1NUTFBfUFRSX1NQRUNJQUxJWkVEX0xJU1RfSAorCisjaWZuZGVmIF9TVExQX1BPSU5URVJTX1NQRUNfVE9PTFNfSAorIyAgaW5jbHVkZSA8c3RsL3BvaW50ZXJzL190b29scy5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisjZGVmaW5lIExJU1RfSU1QTCBfU1RMUF9QVFJfSU1QTF9OQU1FKGxpc3QpCisjaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKSB8fCBkZWZpbmVkIChfX0RNQ19fKQorIyAgZGVmaW5lIHR5cGVuYW1lCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9URU1QTEFURV9FWFBPUlQpICYmICFkZWZpbmVkIChfU1RMUF9VU0VfTVNWQzZfTUVNX1RfQlVHX1dPUktBUk9VTkQpCisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKworX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIF9MaXN0X25vZGU8dm9pZCo+OworCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKworX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIGFsbG9jYXRvcjxfU1RMUF9QUklWIF9MaXN0X25vZGU8dm9pZCo+ID47CisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKworX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIF9TVExQX2FsbG9jX3Byb3h5PF9MaXN0X25vZGVfYmFzZSwgX0xpc3Rfbm9kZTx2b2lkKj4sIGFsbG9jYXRvcjxfTGlzdF9ub2RlPHZvaWQqPiA+ID47CitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgX0xpc3RfYmFzZTx2b2lkKiwgYWxsb2NhdG9yPHZvaWQqPiA+OworX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIExJU1RfSU1QTDx2b2lkKiwgYWxsb2NhdG9yPHZvaWQqPiA+OworCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpCisjICBkZWZpbmUgbGlzdCBfU1RMUF9OT05fREJHX05BTUUobGlzdCkKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBfU1RMUF9ERkxfVE1QTF9QQVJBTShfQWxsb2MsIGFsbG9jYXRvcjxfVHA+KSA+CitjbGFzcyBsaXN0CisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKSAmJiAhZGVmaW5lZCAobGlzdCkKKyAgICAgICAgICAgOiBwdWJsaWMgX19zdGxwb3J0X2NsYXNzPGxpc3Q8X1RwLCBfQWxsb2M+ID4KKyNlbmRpZgoreworICB0eXBlZGVmIF9TVExQX1RZUEVOQU1FIF9TVExQX1BSSVYgX1N0b3JhZ2VUeXBlPF9UcD46Ol9UeXBlIF9TdG9yYWdlVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2NfdHJhaXRzPF9TdG9yYWdlVHlwZSwgX0FsbG9jPjo6YWxsb2NhdG9yX3R5cGUgX1N0b3JhZ2VUeXBlQWxsb2M7CisgIHR5cGVkZWYgX1NUTFBfUFJJViBMSVNUX0lNUEw8X1N0b3JhZ2VUeXBlLCBfU3RvcmFnZVR5cGVBbGxvYz4gX0Jhc2U7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yIF9CYXNlSXRlOworICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9pdGVyYXRvciBfQmFzZUNvbnN0SXRlOworICB0eXBlZGVmIF9TVExQX1BSSVYgX0Nhc3RUcmFpdHM8X1N0b3JhZ2VUeXBlLCBfVHA+IGNhc3RfdHJhaXRzOworICB0eXBlZGVmIGxpc3Q8X1RwLCBfQWxsb2M+IF9TZWxmOworCitwdWJsaWM6CisgIHR5cGVkZWYgX1RwIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgdmFsdWVfdHlwZSogcG9pbnRlcjsKKyAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlKiBjb25zdF9wb2ludGVyOworICB0eXBlZGVmIHZhbHVlX3R5cGUmIHJlZmVyZW5jZTsKKyAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlJiBjb25zdF9yZWZlcmVuY2U7CisgIHR5cGVkZWYgc2l6ZV90IHNpemVfdHlwZTsKKyAgdHlwZWRlZiBwdHJkaWZmX3QgZGlmZmVyZW5jZV90eXBlOworICBfU1RMUF9GT1JDRV9BTExPQ0FUT1JTKHZhbHVlX3R5cGUsIF9BbGxvYykKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2NfdHJhaXRzPHZhbHVlX3R5cGUsIF9BbGxvYz46OmFsbG9jYXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOworICB0eXBlZGVmIGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnIF9JdGVyYXRvcl9jYXRlZ29yeTsKKworICB0eXBlZGVmIF9TVExQX1BSSVYgX0xpc3RfaXRlcmF0b3I8dmFsdWVfdHlwZSwgX05vbmNvbnN0X3RyYWl0czx2YWx1ZV90eXBlPiA+IGl0ZXJhdG9yOworICB0eXBlZGVmIF9TVExQX1BSSVYgX0xpc3RfaXRlcmF0b3I8dmFsdWVfdHlwZSwgX0NvbnN0X3RyYWl0czx2YWx1ZV90eXBlPiA+ICAgIGNvbnN0X2l0ZXJhdG9yOworCisgIF9TVExQX0RFQ0xBUkVfQklESVJFQ1RJT05BTF9SRVZFUlNFX0lURVJBVE9SUzsKKworICBhbGxvY2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9yKCkgY29uc3QKKyAgeyByZXR1cm4gX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoX01faW1wbC5nZXRfYWxsb2NhdG9yKCksIHZhbHVlX3R5cGUpOyB9CisKKyAgZXhwbGljaXQgbGlzdChjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9NX2ltcGwoX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoX19hLCBfU3RvcmFnZVR5cGUpKSB7fQorCisjaWYgIWRlZmluZWQoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKKyAgZXhwbGljaXQgbGlzdChzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ZhbCA9IF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQodmFsdWVfdHlwZSksCisjZWxzZQorICBsaXN0KHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9fdmFsLAorI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCisgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfTV9pbXBsKF9fbiwgY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcmVmKF9fdmFsKSwKKyAgICAgICAgICAgICAgX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoX19hLCBfU3RvcmFnZVR5cGUpKSB7fQorCisjaWYgZGVmaW5lZChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorICBleHBsaWNpdCBsaXN0KHNpemVfdHlwZSBfX24pCisgICAgOiBfTV9pbXBsKF9fbikge30KKyNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0qLworCisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICBsaXN0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hIF9TVExQX0FMTE9DQVRPUl9UWVBFX0RGTCkKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9VU0VfSVRFUkFUT1JfV1JBUFBFUikKKyAgICA6IF9NX2ltcGwoX19maXJzdCwgX19sYXN0LCBfU1RMUF9DT05WRVJUX0FMTE9DQVRPUihfX2EsIF9TdG9yYWdlVHlwZSkpIHt9CisjICBlbHNlCisgICAgOiBfTV9pbXBsKF9TVExQX0NPTlZFUlRfQUxMT0NBVE9SKF9fYSwgX1N0b3JhZ2VUeXBlKSkgeworICAgIGluc2VydChiZWdpbigpLCBfX2ZpcnN0LCBfX2xhc3QpOworICB9CisjICBlbmRpZgorCisjICBpZiBkZWZpbmVkIChfU1RMUF9ORUVEU19FWFRSQV9URU1QTEFURV9DT05TVFJVQ1RPUlMpCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgbGlzdChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisjICAgIGlmICFkZWZpbmVkIChfU1RMUF9VU0VfV1JBUFBFUl9JVEVSQVRPUikKKyAgICA6IF9NX2ltcGwoX19maXJzdCwgX19sYXN0KSB7fQorIyAgICBlbHNlCisgIHsgaW5zZXJ0KGJlZ2luKCksIF9fZmlyc3QsIF9fbGFzdCk7IH0KKyMgICAgZW5kaWYKKyMgIGVuZGlmCisKKyNlbHNlIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKworICBsaXN0KGNvbnN0IHZhbHVlX3R5cGUgKl9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUgKl9fbGFzdCwKKyAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9NX2ltcGwoY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcHRyKF9fZmlyc3QpLAorICAgICAgICAgICAgICBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NwdHIoX19sYXN0KSwKKyAgICAgICAgICAgICAgIF9TVExQX0NPTlZFUlRfQUxMT0NBVE9SKF9fYSwgX1N0b3JhZ2VUeXBlKSkge30KKyAgbGlzdChjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QsCisgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfTV9pbXBsKF9CYXNlQ29uc3RJdGUoX19maXJzdC5fTV9ub2RlKSwgX0Jhc2VDb25zdEl0ZShfX2xhc3QuX01fbm9kZSksCisgICAgICAgICAgICAgIF9TVExQX0NPTlZFUlRfQUxMT0NBVE9SKF9fYSwgX1N0b3JhZ2VUeXBlKSkge30KKworI2VuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKworICBsaXN0KGNvbnN0IF9TZWxmJiBfX3gpIDogX01faW1wbChfX3guX01faW1wbCkge30KKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19NT1ZFX1NFTUFOVElDKQorICBsaXN0KF9fbW92ZV9zb3VyY2U8X1NlbGY+IHNyYykKKyAgICA6IF9NX2ltcGwoX19tb3ZlX3NvdXJjZTxfQmFzZT4oc3JjLmdldCgpLl9NX2ltcGwpKSB7fQorI2VuZGlmCisKKyAgaXRlcmF0b3IgYmVnaW4oKSAgICAgICAgICAgICB7IHJldHVybiBpdGVyYXRvcihfTV9pbXBsLmJlZ2luKCkuX01fbm9kZSk7IH0KKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfTV9pbXBsLmJlZ2luKCkuX01fbm9kZSk7IH0KKworICBpdGVyYXRvciBlbmQoKSAgICAgICAgICAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9NX2ltcGwuZW5kKCkuX01fbm9kZSk7IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfTV9pbXBsLmVuZCgpLl9NX25vZGUpOyB9CisKKyAgcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSAgICAgICAgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgICAgICAgICAgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0ICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorCisgIGJvb2wgZW1wdHkoKSBjb25zdCAgICAgICAgIHsgcmV0dXJuIF9NX2ltcGwuZW1wdHkoKTsgfQorICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0ICAgICB7IHJldHVybiBfTV9pbXBsLnNpemUoKTsgfQorICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCB7IHJldHVybiBfTV9pbXBsLm1heF9zaXplKCk7IH0KKworICByZWZlcmVuY2UgZnJvbnQoKSAgICAgICAgICAgICB7IHJldHVybiAqYmVnaW4oKTsgfQorICBjb25zdF9yZWZlcmVuY2UgZnJvbnQoKSBjb25zdCB7IHJldHVybiAqYmVnaW4oKTsgfQorICByZWZlcmVuY2UgYmFjaygpICAgICAgICAgICAgICB7IHJldHVybiAqKC0tZW5kKCkpOyB9CisgIGNvbnN0X3JlZmVyZW5jZSBiYWNrKCkgY29uc3QgIHsgcmV0dXJuICooLS1lbmQoKSk7IH0KKworICB2b2lkIHN3YXAoX1NlbGYgJl9feCkgeyBfTV9pbXBsLnN3YXAoX194Ll9NX2ltcGwpOyB9CisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKSAmJiAhZGVmaW5lZCAoX1NUTFBfRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSKQorICB2b2lkIF9NX3N3YXBfd29ya2Fyb3VuZChfU2VsZiYgX194KSB7IHN3YXAoX194KTsgfQorI2VuZGlmCisgIHZvaWQgY2xlYXIoKSB7IF9NX2ltcGwuY2xlYXIoKTsgfQorCisjaWYgIWRlZmluZWQoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkgJiYgIWRlZmluZWQoX1NUTFBfTk9fQU5BQ0hST05JU01TKQorICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIGNvbnN0X3JlZmVyZW5jZSBfX3ggPSBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKHZhbHVlX3R5cGUpKQorI2Vsc2UKKyAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBjb25zdF9yZWZlcmVuY2UgX194KQorI2VuZGlmIC8qIV9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0gJiYgIV9TVExQX05PX0FOQUNIUk9OSVNNUyovCisgIHsgcmV0dXJuIGl0ZXJhdG9yKF9NX2ltcGwuaW5zZXJ0KF9CYXNlSXRlKF9fcG9zLl9NX25vZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWYoX194KSkuX01fbm9kZSk7IH0KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisjICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfSVRFUkFUT1JfV1JBUFBFUikKK3ByaXZhdGU6CisgIHRlbXBsYXRlIDxjbGFzcyBfSW50ZWdlcj4KKyAgdm9pZCBfTV9pbnNlcnRfZGlzcGF0Y2goaXRlcmF0b3IgX19wb3MsIF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX192YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fdHJ1ZV90eXBlJikKKyAgeyBfTV9pbXBsLmluc2VydChfQmFzZUl0ZShfX3Bvcy5fTV9ub2RlKSwgX19uLCBfX3ZhbCk7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZvaWQgX01faW5zZXJ0X2Rpc3BhdGNoKGl0ZXJhdG9yIF9fcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fZmFsc2VfdHlwZSYpIHsKKyAgICBfTV9pbXBsLmluc2VydChfQmFzZUl0ZShfX3Bvcy5fTV9ub2RlKSwKKyAgICAgICAgICAgICAgICAgICBfU1RMUF9UWVBFTkFNRSBfU1RMUF9QUklWIF9JdGVXcmFwcGVyPF9TdG9yYWdlVHlwZSwgX1RwLCBfSW5wdXRJdGVyYXRvcj46Ol9JdGUoX19maXJzdCksCisgICAgICAgICAgICAgICAgICAgX1NUTFBfVFlQRU5BTUUgX1NUTFBfUFJJViBfSXRlV3JhcHBlcjxfU3RvcmFnZVR5cGUsIF9UcCwgX0lucHV0SXRlcmF0b3I+OjpfSXRlKF9fbGFzdCkpOworICB9CisKK3B1YmxpYzoKKyMgIGVuZGlmCisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICB2b2lkIGluc2VydChpdGVyYXRvciBfX3BvcywgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KSB7CisjICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfSVRFUkFUT1JfV1JBUFBFUikKKyAgICAvLyBDaGVjayB3aGV0aGVyIGl0J3MgYW4gaW50ZWdyYWwgdHlwZS4gIElmIHNvLCBpdCdzIG5vdCBhbiBpdGVyYXRvci4KKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0ludGVncmFsPF9JbnB1dEl0ZXJhdG9yPjo6X1JldCBfSW50ZWdyYWw7CisgICAgX01faW5zZXJ0X2Rpc3BhdGNoKF9fcG9zLCBfX2ZpcnN0LCBfX2xhc3QsIF9JbnRlZ3JhbCgpKTsKKyMgIGVsc2UKKyAgICBfTV9pbXBsLmluc2VydChfQmFzZUl0ZShfX3Bvcy5fTV9ub2RlKSwgX19maXJzdCwgX19sYXN0KTsKKyMgIGVuZGlmCisgIH0KKyNlbHNlIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKyAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIGNvbnN0IHZhbHVlX3R5cGUgKl9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUgKl9fbGFzdCkKKyAgeyBfTV9pbXBsLmluc2VydChfQmFzZUl0ZShfX3Bvcy5fTV9ub2RlKSwgY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcHRyKF9fZmlyc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NwdHIoX19sYXN0KSk7IH0KKyAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKKyAgeyBfTV9pbXBsLmluc2VydChfQmFzZUl0ZShfX3Bvcy5fTV9ub2RlKSwgX0Jhc2VDb25zdEl0ZShfX2ZpcnN0Ll9NX25vZGUpLCBfQmFzZUNvbnN0SXRlKF9fbGFzdC5fTV9ub2RlKSk7IH0KKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisKKyAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgeyBfTV9pbXBsLmluc2VydChfQmFzZUl0ZShfX3Bvcy5fTV9ub2RlKSwgX19uLCBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWYoX194KSk7IH0KKworICB2b2lkIHB1c2hfZnJvbnQoY29uc3QgdmFsdWVfdHlwZSYgX194KSB7IF9NX2ltcGwucHVzaF9mcm9udChjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWYoX194KSk7IH0KKyAgdm9pZCBwdXNoX2JhY2soY29uc3QgdmFsdWVfdHlwZSYgX194KSAgeyBfTV9pbXBsLnB1c2hfYmFjayhjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWYoX194KSk7IH0KKworI2lmIGRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pICYmICFkZWZpbmVkIChfU1RMUF9OT19BTkFDSFJPTklTTVMpCisgIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBfX3BvcykgeyByZXR1cm4gaXRlcmF0b3IoX01faW1wbC5pbnNlcnQoX19wb3MuX01fbm9kZSkuX01fbm9kZSk7IH0KKyAgdm9pZCBwdXNoX2Zyb250KCkgeyBfTV9pbXBsLnB1c2hfZnJvbnQoKTt9CisgIHZvaWQgcHVzaF9iYWNrKCkgIHsgX01faW1wbC5wdXNoX2JhY2soKTt9CisjIGVuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSAmJiAhX1NUTFBfTk9fQU5BQ0hST05JU01TKi8KKworICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBfX3BvcykKKyAgeyByZXR1cm4gaXRlcmF0b3IoX01faW1wbC5lcmFzZShfQmFzZUl0ZShfX3Bvcy5fTV9ub2RlKSkuX01fbm9kZSk7IH0KKyAgaXRlcmF0b3IgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KQorICB7IHJldHVybiBpdGVyYXRvcihfTV9pbXBsLmVyYXNlKF9CYXNlSXRlKF9fZmlyc3QuX01fbm9kZSksIF9CYXNlSXRlKF9fbGFzdC5fTV9ub2RlKSkuX01fbm9kZSk7IH0KKworI2lmICFkZWZpbmVkKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCisgIHZvaWQgcmVzaXplKHNpemVfdHlwZSBfX25ld19zaXplLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ggPSBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKHZhbHVlX3R5cGUpKQorI2Vsc2UKKyAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9fbmV3X3NpemUpIHsgX01faW1wbC5yZXNpemUoX19uZXdfc2l6ZSk7IH0KKyAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9fbmV3X3NpemUsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyNlbmRpZiAvKiFfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKi8KKyAge19NX2ltcGwucmVzaXplKF9fbmV3X3NpemUsIGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3JlZihfX3gpKTt9CisKKyAgdm9pZCBwb3BfZnJvbnQoKSB7IF9NX2ltcGwucG9wX2Zyb250KCk7IH0KKyAgdm9pZCBwb3BfYmFjaygpICB7IF9NX2ltcGwucG9wX2JhY2soKTsgfQorCisgIF9TZWxmJiBvcGVyYXRvcj0oY29uc3QgX1NlbGYmIF9feCkKKyAgeyBfTV9pbXBsID0gX194Ll9NX2ltcGw7IHJldHVybiAqdGhpczsgfQorICB2b2lkIGFzc2lnbihzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ZhbCkKKyAgeyBfTV9pbXBsLmFzc2lnbihfX24sIGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3JlZihfX3ZhbCkpOyB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX0lURVJBVE9SX1dSQVBQRVIpCitwcml2YXRlOgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0ludGVnZXI+CisgIHZvaWQgX01fYXNzaWduX2Rpc3BhdGNoKF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX192YWwsIGNvbnN0IF9fdHJ1ZV90eXBlJikKKyAgeyBfTV9pbXBsLmFzc2lnbihfX24sIF9fdmFsKTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgdm9pZCBfTV9hc3NpZ25fZGlzcGF0Y2goX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2ZhbHNlX3R5cGUmKSB7CisgICAgX01faW1wbC5hc3NpZ24oX1NUTFBfVFlQRU5BTUUgX1NUTFBfUFJJViBfSXRlV3JhcHBlcjxfU3RvcmFnZVR5cGUsIF9UcCwgX0lucHV0SXRlcmF0b3I+OjpfSXRlKF9fZmlyc3QpLAorICAgICAgICAgICAgICAgICAgIF9TVExQX1RZUEVOQU1FIF9TVExQX1BSSVYgX0l0ZVdyYXBwZXI8X1N0b3JhZ2VUeXBlLCBfVHAsIF9JbnB1dEl0ZXJhdG9yPjo6X0l0ZShfX2xhc3QpKTsKKyAgfQorCitwdWJsaWM6CisjICBlbmRpZgorCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgdm9pZCBhc3NpZ24oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KSB7CisjICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfSVRFUkFUT1JfV1JBUFBFUikKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0ludGVncmFsPF9JbnB1dEl0ZXJhdG9yPjo6X1JldCBfSW50ZWdyYWw7CisgICAgX01fYXNzaWduX2Rpc3BhdGNoKF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOworIyAgZWxzZQorICAgIF9NX2ltcGwuYXNzaWduKF9fZmlyc3QsIF9fbGFzdCk7CisjICBlbmRpZgorICB9CisjZWxzZQorICB2b2lkIGFzc2lnbihjb25zdCB2YWx1ZV90eXBlICpfX2ZpcnN0LCBjb25zdCB2YWx1ZV90eXBlICpfX2xhc3QpIHsKKyAgICBfTV9pbXBsLmFzc2lnbihjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NwdHIoX19maXJzdCksCisgICAgICAgICAgICAgICAgICAgY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcHRyKF9fbGFzdCkpOworICB9CisgIHZvaWQgYXNzaWduKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKKyAgeyBfTV9pbXBsLmFzc2lnbihfQmFzZUNvbnN0SXRlKF9fZmlyc3QuX01fbm9kZSksIF9CYXNlQ29uc3RJdGUoX19sYXN0Ll9NX25vZGUpKTsgfQorI2VuZGlmCisKKyAgdm9pZCBzcGxpY2UoaXRlcmF0b3IgX19wb3MsIF9TZWxmJiBfX3gpCisgIHsgX01faW1wbC5zcGxpY2UoX0Jhc2VJdGUoX19wb3MuX01fbm9kZSksIF9feC5fTV9pbXBsKTsgfQorICB2b2lkIHNwbGljZShpdGVyYXRvciBfX3BvcywgX1NlbGYmIF9feCwgaXRlcmF0b3IgX19pKQorICB7IF9NX2ltcGwuc3BsaWNlKF9CYXNlSXRlKF9fcG9zLl9NX25vZGUpLCBfX3guX01faW1wbCwgX0Jhc2VJdGUoX19pLl9NX25vZGUpKTsgfQorICB2b2lkIHNwbGljZShpdGVyYXRvciBfX3BvcywgX1NlbGYmIF9feCwgaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KQorICB7IF9NX2ltcGwuc3BsaWNlKF9CYXNlSXRlKF9fcG9zLl9NX25vZGUpLCBfX3guX01faW1wbCwKKyAgICAgICAgICAgICAgICAgICBfQmFzZUl0ZShfX2ZpcnN0Ll9NX25vZGUpLCBfQmFzZUl0ZShfX2xhc3QuX01fbm9kZSkpOyB9CisKKyAgdm9pZCByZW1vdmUoY29uc3RfcmVmZXJlbmNlIF9fdmFsKQorICB7IF9NX2ltcGwucmVtb3ZlKGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3JlZihfX3ZhbCkpOyB9CisgIHZvaWQgdW5pcXVlKCkgeyBfTV9pbXBsLnVuaXF1ZSgpOyB9CisgIHZvaWQgbWVyZ2UoX1NlbGYmIF9feCkgeyBfTV9pbXBsLm1lcmdlKF9feC5fTV9pbXBsKTsgfQorICB2b2lkIHJldmVyc2UoKSB7IF9NX2ltcGwucmV2ZXJzZSgpOyB9CisgIHZvaWQgc29ydCgpIHsgX01faW1wbC5zb3J0KCk7IH0KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIHRlbXBsYXRlIDxjbGFzcyBfUHJlZGljYXRlPgorICB2b2lkIHJlbW92ZV9pZihfUHJlZGljYXRlIF9fcHJlZCkKKyAgeyBfTV9pbXBsLnJlbW92ZV9pZihfU1RMUF9QUklWIF9VbmFyeVByZWRXcmFwcGVyPF9TdG9yYWdlVHlwZSwgX1RwLCBfUHJlZGljYXRlPihfX3ByZWQpKTsgfQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0JpbmFyeVByZWRpY2F0ZT4KKyAgdm9pZCB1bmlxdWUoX0JpbmFyeVByZWRpY2F0ZSBfX2Jpbl9wcmVkKQorICB7IF9NX2ltcGwudW5pcXVlKF9TVExQX1BSSVYgX0JpbmFyeVByZWRXcmFwcGVyPF9TdG9yYWdlVHlwZSwgX1RwLCBfQmluYXJ5UHJlZGljYXRlPihfX2Jpbl9wcmVkKSk7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1N0cmljdFdlYWtPcmRlcmluZz4KKyAgdm9pZCBtZXJnZShfU2VsZiAmX194LCBfU3RyaWN0V2Vha09yZGVyaW5nIF9fY29tcCkKKyAgeyBfTV9pbXBsLm1lcmdlKF9feC5fTV9pbXBsLCBfU1RMUF9QUklWIF9CaW5hcnlQcmVkV3JhcHBlcjxfU3RvcmFnZVR5cGUsIF9UcCwgX1N0cmljdFdlYWtPcmRlcmluZz4oX19jb21wKSk7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1N0cmljdFdlYWtPcmRlcmluZz4KKyAgdm9pZCBzb3J0KF9TdHJpY3RXZWFrT3JkZXJpbmcgX19jb21wKQorICB7IF9NX2ltcGwuc29ydChfU1RMUF9QUklWIF9CaW5hcnlQcmVkV3JhcHBlcjxfU3RvcmFnZVR5cGUsIF9UcCwgX1N0cmljdFdlYWtPcmRlcmluZz4oX19jb21wKSk7IH0KKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisKK3ByaXZhdGU6CisgIF9CYXNlIF9NX2ltcGw7Cit9OworCisjaWYgZGVmaW5lZCAobGlzdCkKKyMgIHVuZGVmIGxpc3QKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorI2VuZGlmCisKKyN1bmRlZiBMSVNUX0lNUEwKKyNpZiBkZWZpbmVkIChfX0JPUkxBTkRDX18pIHx8IGRlZmluZWQgKF9fRE1DX18pCisjICB1bmRlZiB0eXBlbmFtZQorI2VuZGlmCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2VuZGlmIC8qIF9TVExQX1BUUl9TUEVDSUFMSVpFRF9MSVNUX0ggKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL3BvaW50ZXJzL19zZXQuaCBiL3N0bHBvcnQvc3RsL3BvaW50ZXJzL19zZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTk3YTVhCi0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvcG9pbnRlcnMvX3NldC5oCkBAIC0wLDAgKzEsNTY0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1CisgKiBGcmFuY29pcyBEdW1vbnQKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqLworCisvKiBOT1RFOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBTVEwgaGVhZGVycy4KKyAqICAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuCisgKi8KKworI2lmbmRlZiBfU1RMUF9QVFJfU1BFQ0lBTElaRURfU0VUX0gKKyNkZWZpbmUgX1NUTFBfUFRSX1NQRUNJQUxJWkVEX1NFVF9ICisKKyNpZm5kZWYgX1NUTFBfUE9JTlRFUlNfU1BFQ19UT09MU19ICisjICBpbmNsdWRlIDxzdGwvcG9pbnRlcnMvX3Rvb2xzLmg+CisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKKyNpZiBkZWZpbmVkIChfX0JPUkxBTkRDX18pIHx8IGRlZmluZWQgKF9fRE1DX18pCisjICBkZWZpbmUgdHlwZW5hbWUKKyNlbmRpZgorCisvL1NwZWNpZmljIGl0ZXJhdG9yIHRyYWl0cyBjcmVhdGlvbgorX1NUTFBfQ1JFQVRFX0lURVJBVE9SX1RSQUlUUyhTZXRUcmFpdHNULCBDb25zdF90cmFpdHMpCisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUKSAmJiAhZGVmaW5lZCAoX1NUTFBfVVNFX01TVkM2X01FTV9UX0JVR19XT1JLQVJPVU5EKQorX1NUTFBfRVhQT1JUIHRlbXBsYXRlIHN0cnVjdCBfU1RMUF9DTEFTU19ERUNMU1BFQyBsZXNzPHZvaWQqPjsKKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCit0eXBlZGVmIF9SYl90cmVlX25vZGU8dm9pZCo+IF9Ob2RlOworX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIF9TVExQX2FsbG9jX3Byb3h5PF9SYl90cmVlX25vZGVfYmFzZSwgX05vZGUsICBhbGxvY2F0b3I8X05vZGU+ID47CitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgX1JiX3RyZWVfYmFzZTx2b2lkKiwgYWxsb2NhdG9yPHZvaWQqPiA+OworIyAgaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpCitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgX0RiZ0NvbXBhcmU8dm9pZCosIGxlc3M8dm9pZCo+ID47CisjICAgIGRlZmluZSBfUmJfdHJlZSBfU1RMUF9OT05fREJHX05BTUUoUmJfdHJlZSkKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBfUmJfdHJlZTx2b2lkKiwgX0RiZ0NvbXBhcmU8dm9pZCosIGxlc3M8dm9pZCo+ID4sIHZvaWQqLCBfSWRlbnRpdHk8dm9pZCo+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TZXRUcmFpdHNUPHZvaWQqPiwgYWxsb2NhdG9yPHZvaWQqPiA+OworIyAgICB1bmRlZiBfUmJfdHJlZQorIyAgZW5kaWYKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBfUmJfdHJlZTx2b2lkKiwgbGVzczx2b2lkKj4sIHZvaWQqLCBfSWRlbnRpdHk8dm9pZCo+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TZXRUcmFpdHNUPHZvaWQqPiwgYWxsb2NhdG9yPHZvaWQqPiA+OworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIF9TVExQX0RGTF9UTVBMX1BBUkFNKF9Db21wYXJlLCBsZXNzPF9LZXk+KSwKKyAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9ERkxfVE1QTF9QQVJBTShfQWxsb2MsIGFsbG9jYXRvcjxfS2V5PikgPgorY2xhc3Mgc2V0CisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKQorICAgICAgICAgIDogcHVibGljIF9fc3RscG9ydF9jbGFzczxzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvYz4gPgorI2VuZGlmCit7CisjaWYgIWRlZmluZWQgKF9fQk9STEFORENfXykKKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9Bc3NvY1N0b3JhZ2VUeXBlczxfS2V5LCBfQ29tcGFyZT4gX0Fzc29jU3RvcmFnZVR5cGVzOworICB0eXBlZGVmIHR5cGVuYW1lIF9Bc3NvY1N0b3JhZ2VUeXBlczo6X0tleVN0b3JhZ2VUeXBlIF9LZXlTdG9yYWdlVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQXNzb2NTdG9yYWdlVHlwZXM6Ol9Db21wYXJlU3RvcmFnZVR5cGUgX0NvbXBhcmVTdG9yYWdlVHlwZTsKKyNlbHNlCisgIHR5cGVkZWYgX1NUTFBfUFJJViBfQXNzb2NTdG9yYWdlVHlwZXM8X0tleSwgX0NvbXBhcmU+OjpfS2V5U3RvcmFnZVR5cGUgX0tleVN0b3JhZ2VUeXBlOworICB0eXBlZGVmIF9TVExQX1BSSVYgX0Fzc29jU3RvcmFnZVR5cGVzPF9LZXksIF9Db21wYXJlPjo6X0NvbXBhcmVTdG9yYWdlVHlwZSBfQ29tcGFyZVN0b3JhZ2VUeXBlOworI2VuZGlmCisgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jX3RyYWl0czxfS2V5U3RvcmFnZVR5cGUsIF9BbGxvYz46OmFsbG9jYXRvcl90eXBlIF9TdG9yYWdlVHlwZUFsbG9jOworICB0eXBlZGVmIF9TVExQX1BSSVYgX0Nhc3RUcmFpdHM8X0tleVN0b3JhZ2VUeXBlLCBfS2V5PiBjYXN0X3RyYWl0czsKKworICB0eXBlZGVmIHNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jPiBfU2VsZjsKK3B1YmxpYzoKKyAgdHlwZWRlZiBfS2V5ICAgICBrZXlfdHlwZTsKKyAgdHlwZWRlZiBfS2V5ICAgICB2YWx1ZV90eXBlOworICB0eXBlZGVmIF9Db21wYXJlIGtleV9jb21wYXJlOworICB0eXBlZGVmIF9Db21wYXJlIHZhbHVlX2NvbXBhcmU7CisKK3Byb3RlY3RlZDoKKyAgLy9TcGVjaWZpYyBpdGVyYXRvciB0cmFpdHMgY3JlYXRpb24KKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9TZXRUcmFpdHNUPHZhbHVlX3R5cGU+IF9TZXRUcmFpdHM7CisgIHR5cGVkZWYgX1NUTFBfUFJJViBfUmJfdHJlZTxrZXlfdHlwZSwga2V5X2NvbXBhcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlLCBfU1RMUF9QUklWIF9JZGVudGl0eTx2YWx1ZV90eXBlPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TZXRUcmFpdHMsIF9BbGxvYz4gX1ByaXZfUmVwX3R5cGU7CisKKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9TZXRUcmFpdHNUPF9LZXlTdG9yYWdlVHlwZT4gX1NldFN0b3JhZ2VUcmFpdHM7CisKK3B1YmxpYzoKKyAgLy9kdW1zOiBuZWVkIHRoZSBmb2xsb3dpbmcgcHVibGljIGZvciB0aGUgX19tb3ZlX3RyYWl0cyBmcmFtZXdvcmsKKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9SYl90cmVlPF9LZXlTdG9yYWdlVHlwZSwgX0NvbXBhcmVTdG9yYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9LZXlTdG9yYWdlVHlwZSwgX1NUTFBfUFJJViBfSWRlbnRpdHk8X0tleVN0b3JhZ2VUeXBlPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TZXRTdG9yYWdlVHJhaXRzLCBfU3RvcmFnZVR5cGVBbGxvYz4gX1JlcF90eXBlOworCitwcml2YXRlOgorICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6aXRlcmF0b3IgYmFzZV9pdGVyYXRvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2Jhc2VfaXRlcmF0b3I7CisKK3B1YmxpYzoKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUHJpdl9SZXBfdHlwZTo6cG9pbnRlciBwb2ludGVyOworICB0eXBlZGVmIHR5cGVuYW1lIF9Qcml2X1JlcF90eXBlOjpjb25zdF9wb2ludGVyIGNvbnN0X3BvaW50ZXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1ByaXZfUmVwX3R5cGU6OnJlZmVyZW5jZSByZWZlcmVuY2U7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1ByaXZfUmVwX3R5cGU6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9yZWZlcmVuY2U7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1ByaXZfUmVwX3R5cGU6Oml0ZXJhdG9yIGl0ZXJhdG9yOworICB0eXBlZGVmIHR5cGVuYW1lIF9Qcml2X1JlcF90eXBlOjpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUHJpdl9SZXBfdHlwZTo6cmV2ZXJzZV9pdGVyYXRvciByZXZlcnNlX2l0ZXJhdG9yOworICB0eXBlZGVmIHR5cGVuYW1lIF9Qcml2X1JlcF90eXBlOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1ByaXZfUmVwX3R5cGU6OnNpemVfdHlwZSBzaXplX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1ByaXZfUmVwX3R5cGU6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1ByaXZfUmVwX3R5cGU6OmFsbG9jYXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOworCitwcml2YXRlOgorICBfUmVwX3R5cGUgX01fdDsgIC8vIHJlZC1ibGFjayB0cmVlIHJlcHJlc2VudGluZyBzZXQKKyAgX1NUTFBfS0VZX1RZUEVfRk9SX0NPTlRfRVhUKGtleV90eXBlKQorCisjaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpCisgIHN0YXRpYyBpdGVyYXRvciBfU190b192YWx1ZV9pdGUoY29uc3RfYmFzZV9pdGVyYXRvciBfX2l0ZSkKKyAgeyByZXR1cm4gaXRlcmF0b3IoX19pdGUuX093bmVyKCksIF9faXRlLl9NX2l0ZXJhdG9yLl9NX25vZGUpOyB9CisgIHN0YXRpYyBiYXNlX2l0ZXJhdG9yIF9TX3RvX3N0b3JhZ2VfaXRlKGNvbnN0X2l0ZXJhdG9yIF9faXRlKQorICB7IHJldHVybiBiYXNlX2l0ZXJhdG9yKF9faXRlLl9Pd25lcigpLCBfX2l0ZS5fTV9pdGVyYXRvci5fTV9ub2RlKTsgfQorI2Vsc2UKKyAgc3RhdGljIGl0ZXJhdG9yIF9TX3RvX3ZhbHVlX2l0ZShjb25zdF9iYXNlX2l0ZXJhdG9yIF9faXRlKQorICB7IHJldHVybiBpdGVyYXRvcihfX2l0ZS5fTV9ub2RlKTsgfQorICBzdGF0aWMgYmFzZV9pdGVyYXRvciBfU190b19zdG9yYWdlX2l0ZShjb25zdF9pdGVyYXRvciBfX2l0ZSkKKyAgeyByZXR1cm4gYmFzZV9pdGVyYXRvcihfX2l0ZS5fTV9ub2RlKTsgfQorI2VuZGlmCisKK3B1YmxpYzoKKyAgc2V0KCkgOiBfTV90KF9Db21wYXJlU3RvcmFnZVR5cGUoKSwgX1N0b3JhZ2VUeXBlQWxsb2MoKSkge30KKyAgZXhwbGljaXQgc2V0KGNvbnN0IF9Db21wYXJlJiBfX2NvbXAsCisgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9NX3QoX19jb21wLCBfU1RMUF9DT05WRVJUX0FMTE9DQVRPUihfX2EsIF9LZXlTdG9yYWdlVHlwZSkpIHt9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHNldChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgOiBfTV90KF9Db21wYXJlKCksIF9TdG9yYWdlVHlwZUFsbG9jKCkpIHsKKyMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9JVEVSQVRPUl9XUkFQUEVSKQorICAgIF9NX3QuaW5zZXJ0X3VuaXF1ZShfU1RMUF9UWVBFTkFNRSBfU1RMUF9QUklWIF9JdGVXcmFwcGVyPF9LZXlTdG9yYWdlVHlwZSwgX0tleSwgX0lucHV0SXRlcmF0b3I+OjpfSXRlKF9fZmlyc3QpLAorICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9UWVBFTkFNRSBfU1RMUF9QUklWIF9JdGVXcmFwcGVyPF9LZXlTdG9yYWdlVHlwZSwgX0tleSwgX0lucHV0SXRlcmF0b3I+OjpfSXRlKF9fbGFzdCkpOworIyAgZWxzZQorICAgIF9NX3QuaW5zZXJ0X3VuaXF1ZShfX2ZpcnN0LCBfX2xhc3QpOworIyAgZW5kaWYKKyAgfQorCisjICBpZiBkZWZpbmVkIChfU1RMUF9ORUVEU19FWFRSQV9URU1QTEFURV9DT05TVFJVQ1RPUlMpCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgY29uc3QgX0NvbXBhcmUmIF9fY29tcCkKKyAgICA6IF9NX3QoX19jb21wLCBfU3RvcmFnZVR5cGVBbGxvYygpKSB7CisjICAgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9JVEVSQVRPUl9XUkFQUEVSKQorICAgIF9NX3QuaW5zZXJ0X3VuaXF1ZShfU1RMUF9UWVBFTkFNRSBfU1RMUF9QUklWIF9JdGVXcmFwcGVyPF9LZXlTdG9yYWdlVHlwZSwgX0tleSwgX0lucHV0SXRlcmF0b3I+OjpfSXRlKF9fZmlyc3QpLAorICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9UWVBFTkFNRSBfU1RMUF9QUklWIF9JdGVXcmFwcGVyPF9LZXlTdG9yYWdlVHlwZSwgX0tleSwgX0lucHV0SXRlcmF0b3I+OjpfSXRlKF9fbGFzdCkpOworIyAgICBlbHNlCisgICAgX01fdC5pbnNlcnRfdW5pcXVlKF9fZmlyc3QsIF9fbGFzdCk7CisjICAgIGVuZGlmCisgIH0KKyMgIGVuZGlmCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgY29uc3QgX0NvbXBhcmUmIF9fY29tcCwKKyAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgX1NUTFBfQUxMT0NBVE9SX1RZUEVfREZMKQorICAgIDogX01fdChfX2NvbXAsIF9TVExQX0NPTlZFUlRfQUxMT0NBVE9SKF9fYSwgX0tleVN0b3JhZ2VUeXBlKSkgeworIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX0lURVJBVE9SX1dSQVBQRVIpCisgICAgX01fdC5pbnNlcnRfdW5pcXVlKF9TVExQX1RZUEVOQU1FIF9TVExQX1BSSVYgX0l0ZVdyYXBwZXI8X0tleVN0b3JhZ2VUeXBlLCBfS2V5LCBfSW5wdXRJdGVyYXRvcj46Ol9JdGUoX19maXJzdCksCisgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1RZUEVOQU1FIF9TVExQX1BSSVYgX0l0ZVdyYXBwZXI8X0tleVN0b3JhZ2VUeXBlLCBfS2V5LCBfSW5wdXRJdGVyYXRvcj46Ol9JdGUoX19sYXN0KSk7CisjICBlbHNlCisgICAgX01fdC5pbnNlcnRfdW5pcXVlKF9fZmlyc3QsIF9fbGFzdCk7CisjICBlbmRpZgorICB9CisjZWxzZQorICBzZXQoY29uc3QgdmFsdWVfdHlwZSogX19maXJzdCwgY29uc3QgdmFsdWVfdHlwZSogX19sYXN0KQorICAgIDogX01fdChfQ29tcGFyZSgpLCBfU3RvcmFnZVR5cGVBbGxvYygpKSB7CisgICAgX01fdC5pbnNlcnRfdW5pcXVlKGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3B0cihfX2ZpcnN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcHRyKF9fbGFzdCkpOworICB9CisKKyAgc2V0KGNvbnN0IHZhbHVlX3R5cGUqIF9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbGFzdCwKKyAgICAgIGNvbnN0IF9Db21wYXJlJiBfX2NvbXAsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX01fdChfX2NvbXAsIF9TVExQX0NPTlZFUlRfQUxMT0NBVE9SKF9fYSwgX0tleVN0b3JhZ2VUeXBlKSkgeworICAgIF9NX3QuaW5zZXJ0X3VuaXF1ZShjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NwdHIoX19maXJzdCksCisgICAgICAgICAgICAgICAgICAgICAgIGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3B0cihfX2xhc3QpKTsKKyAgfQorCisgIHNldChjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpCisgICAgOiBfTV90KF9Db21wYXJlKCksIF9TdG9yYWdlVHlwZUFsbG9jKCkpCisgIHsgX01fdC5pbnNlcnRfdW5pcXVlKF9TX3RvX3N0b3JhZ2VfaXRlKF9fZmlyc3QpLCBfU190b19zdG9yYWdlX2l0ZShfX2xhc3QpKTsgfQorCisgIHNldChjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QsCisgICAgICBjb25zdCBfQ29tcGFyZSYgX19jb21wLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9NX3QoX19jb21wLCBfU1RMUF9DT05WRVJUX0FMTE9DQVRPUihfX2EsIF9LZXlTdG9yYWdlVHlwZSkpCisgIHsgX01fdC5pbnNlcnRfdW5pcXVlKF9TX3RvX3N0b3JhZ2VfaXRlKF9fZmlyc3QpLCBfU190b19zdG9yYWdlX2l0ZShfX2xhc3QpKTsgfQorI2VuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKworICBzZXQoY29uc3QgX1NlbGYmIF9feCkgOiBfTV90KF9feC5fTV90KSB7fQorCisjaWYgIWRlZmluZWQgKF9TVExQX05PX01PVkVfU0VNQU5USUMpCisgIHNldChfX21vdmVfc291cmNlPF9TZWxmPiBzcmMpCisgICAgOiBfTV90KF9fbW92ZV9zb3VyY2U8X1JlcF90eXBlPihzcmMuZ2V0KCkuX01fdCkpIHt9CisjZW5kaWYKKworICBfU2VsZiYgb3BlcmF0b3I9KGNvbnN0IF9TZWxmJiBfX3gpIHsKKyAgICBfTV90ID0gX194Ll9NX3Q7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8gYWNjZXNzb3JzOgorICBrZXlfY29tcGFyZSBrZXlfY29tcCgpIGNvbnN0IHsgcmV0dXJuIF9NX3Qua2V5X2NvbXAoKTsgfQorICB2YWx1ZV9jb21wYXJlIHZhbHVlX2NvbXAoKSBjb25zdCB7IHJldHVybiBfTV90LmtleV9jb21wKCk7IH0KKyAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0CisgIHsgcmV0dXJuIF9TVExQX0NPTlZFUlRfQUxMT0NBVE9SKF9NX3QuZ2V0X2FsbG9jYXRvcigpLCB2YWx1ZV90eXBlKTsgfQorCisgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gX1NfdG9fdmFsdWVfaXRlKF9NX3QuYmVnaW4oKSk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gX1NfdG9fdmFsdWVfaXRlKF9NX3QuZW5kKCkpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gX1NfdG9fdmFsdWVfaXRlKF9NX3QuYmVnaW4oKSk7IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gX1NfdG9fdmFsdWVfaXRlKF9NX3QuZW5kKCkpOyB9CisgIHJldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKyAgcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIF9NX3QuZW1wdHkoKTsgfQorICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX3Quc2l6ZSgpOyB9CisgIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX3QubWF4X3NpemUoKTsgfQorICB2b2lkIHN3YXAoX1NlbGYmIF9feCkgeyBfTV90LnN3YXAoX194Ll9NX3QpOyB9CisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKSAmJiAhZGVmaW5lZCAoX1NUTFBfRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSKQorICB2b2lkIF9NX3N3YXBfd29ya2Fyb3VuZChfU2VsZiYgX194KSB7IHN3YXAoX194KTsgfQorI2VuZGlmCisKKyAgLy8gaW5zZXJ0L2VyYXNlCisgIHBhaXI8aXRlcmF0b3IsYm9vbD4gaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9feCkgeworICAgIHBhaXI8YmFzZV9pdGVyYXRvciwgYm9vbD4gcmV0ID0gX01fdC5pbnNlcnRfdW5pcXVlKGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3JlZihfX3gpKTsKKyAgICByZXR1cm4gcGFpcjxpdGVyYXRvciwgYm9vbD4oX1NfdG9fdmFsdWVfaXRlKHJldC5maXJzdCksIHJldC5zZWNvbmQpOworICB9CisgIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBfX3BvcywgY29uc3QgdmFsdWVfdHlwZSYgX194KQorICB7IHJldHVybiBfU190b192YWx1ZV9pdGUoX01fdC5pbnNlcnRfdW5pcXVlKF9TX3RvX3N0b3JhZ2VfaXRlKF9fcG9zKSwgY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcmVmKF9feCkpKTsgfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICB2b2lkIGluc2VydChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpIHsKKyMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9JVEVSQVRPUl9XUkFQUEVSKQorICAgIF9NX3QuaW5zZXJ0X3VuaXF1ZShfU1RMUF9UWVBFTkFNRSBfU1RMUF9QUklWIF9JdGVXcmFwcGVyPF9LZXlTdG9yYWdlVHlwZSwgX0tleSwgX0lucHV0SXRlcmF0b3I+OjpfSXRlKF9fZmlyc3QpLAorICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9UWVBFTkFNRSBfU1RMUF9QUklWIF9JdGVXcmFwcGVyPF9LZXlTdG9yYWdlVHlwZSwgX0tleSwgX0lucHV0SXRlcmF0b3I+OjpfSXRlKF9fbGFzdCkpOworIyAgZWxzZQorICAgIF9NX3QuaW5zZXJ0X3VuaXF1ZShfX2ZpcnN0LCBfX2xhc3QpOworIyAgZW5kaWYKKyAgfQorI2Vsc2UKKyAgdm9pZCBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KQorICB7IF9NX3QuaW5zZXJ0X3VuaXF1ZShfU190b19zdG9yYWdlX2l0ZShfX2ZpcnN0KSwgX1NfdG9fc3RvcmFnZV9pdGUoX19sYXN0KSk7IH0KKyAgdm9pZCBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSogX19maXJzdCwgY29uc3QgdmFsdWVfdHlwZSogX19sYXN0KSB7CisgICAgX01fdC5pbnNlcnRfdW5pcXVlKGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3B0cihfX2ZpcnN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcHRyKF9fbGFzdCkpOworICB9CisjZW5kaWYKKyAgdm9pZCBlcmFzZShpdGVyYXRvciBfX3BvcykKKyAgeyBfTV90LmVyYXNlKF9TX3RvX3N0b3JhZ2VfaXRlKF9fcG9zKSk7IH0KKyAgc2l6ZV90eXBlIGVyYXNlKGNvbnN0IGtleV90eXBlJiBfX3gpCisgIHsgcmV0dXJuIF9NX3QuZXJhc2VfdW5pcXVlKGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3JlZihfX3gpKTsgfQorICB2b2lkIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkKKyAgeyBfTV90LmVyYXNlKF9TX3RvX3N0b3JhZ2VfaXRlKF9fZmlyc3QpLCBfU190b19zdG9yYWdlX2l0ZShfX2xhc3QpKTsgfQorICB2b2lkIGNsZWFyKCkgeyBfTV90LmNsZWFyKCk7IH0KKworICAvLyBzZXQgb3BlcmF0aW9uczoKKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIGNvbnN0X2l0ZXJhdG9yIGZpbmQoY29uc3QgX0tUJiBfX3gpIGNvbnN0CisgIHsgcmV0dXJuIF9TX3RvX3ZhbHVlX2l0ZShfTV90LmZpbmQoY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcmVmVChfX3gpKSk7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIGl0ZXJhdG9yIGZpbmQoY29uc3QgX0tUJiBfX3gpCisgIHsgcmV0dXJuIF9TX3RvX3ZhbHVlX2l0ZShfTV90LmZpbmQoY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcmVmVChfX3gpKSk7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIHNpemVfdHlwZSBjb3VudChjb25zdCBfS1QmIF9feCkgY29uc3QKKyAgeyByZXR1cm4gX01fdC5maW5kKGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3JlZlQoX194KSkgPT0gX01fdC5lbmQoKSA/IDAgOiAxOyB9CisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBpdGVyYXRvciBsb3dlcl9ib3VuZChjb25zdCBfS1QmIF9feCkKKyAgeyByZXR1cm4gX1NfdG9fdmFsdWVfaXRlKF9NX3QubG93ZXJfYm91bmQoY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcmVmVChfX3gpKSk7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIGNvbnN0X2l0ZXJhdG9yIGxvd2VyX2JvdW5kKGNvbnN0IF9LVCYgX194KSBjb25zdAorICB7IHJldHVybiBfU190b192YWx1ZV9pdGUoX01fdC5sb3dlcl9ib3VuZChjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWZUKF9feCkpKTsgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgaXRlcmF0b3IgdXBwZXJfYm91bmQoY29uc3QgX0tUJiBfX3gpCisgIHsgcmV0dXJuIF9TX3RvX3ZhbHVlX2l0ZShfTV90LnVwcGVyX2JvdW5kKGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3JlZlQoX194KSkpOyB9CisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBjb25zdF9pdGVyYXRvciB1cHBlcl9ib3VuZChjb25zdCBfS1QmIF9feCkgY29uc3QKKyAgeyByZXR1cm4gX1NfdG9fdmFsdWVfaXRlKF9NX3QudXBwZXJfYm91bmQoY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcmVmVChfX3gpKSk7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIHBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPiBlcXVhbF9yYW5nZShjb25zdCBfS1QmIF9feCkgeworICAgIHBhaXI8YmFzZV9pdGVyYXRvciwgYmFzZV9pdGVyYXRvcj4gX19yZXQ7CisgICAgX19yZXQgPSBfTV90LmVxdWFsX3JhbmdlKGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3JlZlQoX194KSk7CisgICAgcmV0dXJuIHBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPihfU190b192YWx1ZV9pdGUoX19yZXQuZmlyc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NfdG9fdmFsdWVfaXRlKF9fcmV0LnNlY29uZCkpOworICB9CisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4gZXF1YWxfcmFuZ2UoY29uc3QgX0tUJiBfX3gpIGNvbnN0IHsKKyAgICBwYWlyPGNvbnN0X2Jhc2VfaXRlcmF0b3IsIGNvbnN0X2Jhc2VfaXRlcmF0b3I+IF9fcmV0OworICAgIF9fcmV0ID0gX01fdC5lcXVhbF9yYW5nZV91bmlxdWUoY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcmVmVChfX3gpKTsKKyAgICByZXR1cm4gcGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+KF9TX3RvX3ZhbHVlX2l0ZShfX3JldC5maXJzdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU190b192YWx1ZV9pdGUoX19yZXQuc2Vjb25kKSk7CisgIH0KK307CisKKy8vU3BlY2lmaWMgaXRlcmF0b3IgdHJhaXRzIGNyZWF0aW9uCitfU1RMUF9DUkVBVEVfSVRFUkFUT1JfVFJBSVRTKE11bHRpc2V0VHJhaXRzVCwgQ29uc3RfdHJhaXRzKQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgX1NUTFBfREZMX1RNUExfUEFSQU0oX0NvbXBhcmUsIGxlc3M8X0tleT4pLAorICAgICAgICAgICAgICAgICAgICAgX1NUTFBfREZMX1RNUExfUEFSQU0oX0FsbG9jLCBhbGxvY2F0b3I8X0tleT4pID4KK2NsYXNzIG11bHRpc2V0CisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKQorICAgICAgICAgICAgICAgOiBwdWJsaWMgX19zdGxwb3J0X2NsYXNzPG11bHRpc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2M+ID4KKyNlbmRpZgoreworI2lmICFkZWZpbmVkIChfX0JPUkxBTkRDX18pCisgIHR5cGVkZWYgX1NUTFBfUFJJViBfQXNzb2NTdG9yYWdlVHlwZXM8X0tleSwgX0NvbXBhcmU+IF9Bc3NvY1N0b3JhZ2VUeXBlczsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQXNzb2NTdG9yYWdlVHlwZXM6Ol9LZXlTdG9yYWdlVHlwZSBfS2V5U3RvcmFnZVR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0Fzc29jU3RvcmFnZVR5cGVzOjpfQ29tcGFyZVN0b3JhZ2VUeXBlIF9Db21wYXJlU3RvcmFnZVR5cGU7CisjZWxzZQorICB0eXBlZGVmIF9TVExQX1BSSVYgX0Fzc29jU3RvcmFnZVR5cGVzPF9LZXksIF9Db21wYXJlPjo6X0tleVN0b3JhZ2VUeXBlIF9LZXlTdG9yYWdlVHlwZTsKKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9Bc3NvY1N0b3JhZ2VUeXBlczxfS2V5LCBfQ29tcGFyZT46Ol9Db21wYXJlU3RvcmFnZVR5cGUgX0NvbXBhcmVTdG9yYWdlVHlwZTsKKyNlbmRpZgorICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY190cmFpdHM8X0tleVN0b3JhZ2VUeXBlLCBfQWxsb2M+OjphbGxvY2F0b3JfdHlwZSBfU3RvcmFnZVR5cGVBbGxvYzsKKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9DYXN0VHJhaXRzPF9LZXlTdG9yYWdlVHlwZSwgX0tleT4gY2FzdF90cmFpdHM7CisKKyAgdHlwZWRlZiBtdWx0aXNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jPiBfU2VsZjsKK3B1YmxpYzoKKyAgLy8gdHlwZWRlZnM6CisgIHR5cGVkZWYgX0tleSAgICAga2V5X3R5cGU7CisgIHR5cGVkZWYgX0tleSAgICAgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiBfQ29tcGFyZSBrZXlfY29tcGFyZTsKKyAgdHlwZWRlZiBfQ29tcGFyZSB2YWx1ZV9jb21wYXJlOworCitwcm90ZWN0ZWQ6CisgIC8vU3BlY2lmaWMgaXRlcmF0b3IgdHJhaXRzIGNyZWF0aW9uCisgIHR5cGVkZWYgX1NUTFBfUFJJViBfTXVsdGlzZXRUcmFpdHNUPHZhbHVlX3R5cGU+IF9NdWx0aXNldFRyYWl0czsKKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9SYl90cmVlPGtleV90eXBlLCBrZXlfY29tcGFyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGUsIF9TVExQX1BSSVYgX0lkZW50aXR5PHZhbHVlX3R5cGU+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX011bHRpc2V0VHJhaXRzLCBfQWxsb2M+IF9Qcml2X1JlcF90eXBlOworCisgIHR5cGVkZWYgX1NUTFBfUFJJViBfTXVsdGlzZXRUcmFpdHNUPF9LZXlTdG9yYWdlVHlwZT4gX011bHRpc2V0U3RvcmFnZVRyYWl0czsKK3B1YmxpYzoKKyAgLy9kdW1zOiBuZWVkIHRoZSBmb2xsb3dpbmcgcHVibGljIGZvciB0aGUgX19tb3ZlX3RyYWl0cyBmcmFtZXdvcmsKKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9SYl90cmVlPF9LZXlTdG9yYWdlVHlwZSwgX0NvbXBhcmVTdG9yYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9LZXlTdG9yYWdlVHlwZSwgX1NUTFBfUFJJViBfSWRlbnRpdHk8X0tleVN0b3JhZ2VUeXBlPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NdWx0aXNldFN0b3JhZ2VUcmFpdHMsIF9TdG9yYWdlVHlwZUFsbG9jPiBfUmVwX3R5cGU7CisKK3ByaXZhdGU6CisgIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjppdGVyYXRvciBiYXNlX2l0ZXJhdG9yOworICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6Y29uc3RfaXRlcmF0b3IgY29uc3RfYmFzZV9pdGVyYXRvcjsKKworcHVibGljOgorICB0eXBlZGVmIHR5cGVuYW1lIF9Qcml2X1JlcF90eXBlOjpwb2ludGVyIHBvaW50ZXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1ByaXZfUmVwX3R5cGU6OmNvbnN0X3BvaW50ZXIgY29uc3RfcG9pbnRlcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUHJpdl9SZXBfdHlwZTo6cmVmZXJlbmNlIHJlZmVyZW5jZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUHJpdl9SZXBfdHlwZTo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUHJpdl9SZXBfdHlwZTo6aXRlcmF0b3IgaXRlcmF0b3I7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1ByaXZfUmVwX3R5cGU6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOworICB0eXBlZGVmIHR5cGVuYW1lIF9Qcml2X1JlcF90eXBlOjpyZXZlcnNlX2l0ZXJhdG9yIHJldmVyc2VfaXRlcmF0b3I7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1ByaXZfUmVwX3R5cGU6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUHJpdl9SZXBfdHlwZTo6c2l6ZV90eXBlIHNpemVfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUHJpdl9SZXBfdHlwZTo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUHJpdl9SZXBfdHlwZTo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7CisKK3ByaXZhdGU6CisgIF9SZXBfdHlwZSBfTV90OyAgLy8gcmVkLWJsYWNrIHRyZWUgcmVwcmVzZW50aW5nIG11bHRpc2V0CisgIF9TVExQX0tFWV9UWVBFX0ZPUl9DT05UX0VYVChrZXlfdHlwZSkKKworI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHKQorICBzdGF0aWMgaXRlcmF0b3IgX1NfdG9fdmFsdWVfaXRlKGNvbnN0X2Jhc2VfaXRlcmF0b3IgX19pdGUpCisgIHsgcmV0dXJuIGl0ZXJhdG9yKF9faXRlLl9Pd25lcigpLCBfX2l0ZS5fTV9pdGVyYXRvci5fTV9ub2RlKTsgfQorICBzdGF0aWMgYmFzZV9pdGVyYXRvciBfU190b19zdG9yYWdlX2l0ZShjb25zdF9pdGVyYXRvciBfX2l0ZSkKKyAgeyByZXR1cm4gYmFzZV9pdGVyYXRvcihfX2l0ZS5fT3duZXIoKSwgX19pdGUuX01faXRlcmF0b3IuX01fbm9kZSk7IH0KKyNlbHNlCisgIHN0YXRpYyBpdGVyYXRvciBfU190b192YWx1ZV9pdGUoY29uc3RfYmFzZV9pdGVyYXRvciBfX2l0ZSkKKyAgeyByZXR1cm4gaXRlcmF0b3IoX19pdGUuX01fbm9kZSk7IH0KKyAgc3RhdGljIGJhc2VfaXRlcmF0b3IgX1NfdG9fc3RvcmFnZV9pdGUoY29uc3RfaXRlcmF0b3IgX19pdGUpCisgIHsgcmV0dXJuIGJhc2VfaXRlcmF0b3IoX19pdGUuX01fbm9kZSk7IH0KKyNlbmRpZgorCitwdWJsaWM6CisgIG11bHRpc2V0KCkgOiBfTV90KF9Db21wYXJlKCksIF9TdG9yYWdlVHlwZUFsbG9jKCkpIHt9CisgIGV4cGxpY2l0IG11bHRpc2V0KGNvbnN0IF9Db21wYXJlJiBfX2NvbXAsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX01fdChfX2NvbXAsIF9TVExQX0NPTlZFUlRfQUxMT0NBVE9SKF9fYSwgX0tleVN0b3JhZ2VUeXBlKSkge30KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgbXVsdGlzZXQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgIDogX01fdChfQ29tcGFyZSgpLCBfU3RvcmFnZVR5cGVBbGxvYygpKSB7CisjICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfSVRFUkFUT1JfV1JBUFBFUikKKyAgICBfTV90Lmluc2VydF9lcXVhbChfU1RMUF9UWVBFTkFNRSBfU1RMUF9QUklWIF9JdGVXcmFwcGVyPF9LZXlTdG9yYWdlVHlwZSwgX0tleSwgX0lucHV0SXRlcmF0b3I+OjpfSXRlKF9fZmlyc3QpLAorICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1RZUEVOQU1FIF9TVExQX1BSSVYgX0l0ZVdyYXBwZXI8X0tleVN0b3JhZ2VUeXBlLCBfS2V5LCBfSW5wdXRJdGVyYXRvcj46Ol9JdGUoX19sYXN0KSk7CisjICBlbHNlCisgICAgX01fdC5pbnNlcnRfZXF1YWwoX19maXJzdCwgX19sYXN0KTsKKyMgIGVuZGlmCisgIH0KKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfTkVFRFNfRVhUUkFfVEVNUExBVEVfQ09OU1RSVUNUT1JTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIG11bHRpc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgY29uc3QgX0NvbXBhcmUmIF9fY29tcCkKKyAgICA6IF9NX3QoX19jb21wLCBfU3RvcmFnZVR5cGVBbGxvYygpKSB7CisjICAgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9JVEVSQVRPUl9XUkFQUEVSKQorICAgIF9NX3QuaW5zZXJ0X2VxdWFsKF9TVExQX1RZUEVOQU1FIF9TVExQX1BSSVYgX0l0ZVdyYXBwZXI8X0tleVN0b3JhZ2VUeXBlLCBfS2V5LCBfSW5wdXRJdGVyYXRvcj46Ol9JdGUoX19maXJzdCksCisgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfVFlQRU5BTUUgX1NUTFBfUFJJViBfSXRlV3JhcHBlcjxfS2V5U3RvcmFnZVR5cGUsIF9LZXksIF9JbnB1dEl0ZXJhdG9yPjo6X0l0ZShfX2xhc3QpKTsKKyMgICAgZWxzZQorICAgIF9NX3QuaW5zZXJ0X2VxdWFsKF9fZmlyc3QsIF9fbGFzdCk7CisjICAgIGVuZGlmCisgIH0KKyMgIGVuZGlmCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgbXVsdGlzZXQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICBjb25zdCBfQ29tcGFyZSYgX19jb21wLAorICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hIF9TVExQX0FMTE9DQVRPUl9UWVBFX0RGTCkKKyAgICA6IF9NX3QoX19jb21wLCBfU1RMUF9DT05WRVJUX0FMTE9DQVRPUihfX2EsIF9LZXlTdG9yYWdlVHlwZSkpIHsKKyMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9JVEVSQVRPUl9XUkFQUEVSKQorICAgIF9NX3QuaW5zZXJ0X2VxdWFsKF9TVExQX1RZUEVOQU1FIF9TVExQX1BSSVYgX0l0ZVdyYXBwZXI8X0tleVN0b3JhZ2VUeXBlLCBfS2V5LCBfSW5wdXRJdGVyYXRvcj46Ol9JdGUoX19maXJzdCksCisgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfVFlQRU5BTUUgX1NUTFBfUFJJViBfSXRlV3JhcHBlcjxfS2V5U3RvcmFnZVR5cGUsIF9LZXksIF9JbnB1dEl0ZXJhdG9yPjo6X0l0ZShfX2xhc3QpKTsKKyMgIGVsc2UKKyAgICBfTV90Lmluc2VydF9lcXVhbChfX2ZpcnN0LCBfX2xhc3QpOworIyAgZW5kaWYKKyAgfQorCisjZWxzZQorICBtdWx0aXNldChjb25zdCB2YWx1ZV90eXBlKiBfX2ZpcnN0LCBjb25zdCB2YWx1ZV90eXBlKiBfX2xhc3QpCisgICAgOiBfTV90KF9Db21wYXJlKCksIF9TdG9yYWdlVHlwZUFsbG9jKCkpIHsKKyAgICBfTV90Lmluc2VydF9lcXVhbChjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NwdHIoX19maXJzdCksCisgICAgICAgICAgICAgICAgICAgICAgY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcHRyKF9fbGFzdCkpOworICB9CisKKyAgbXVsdGlzZXQoY29uc3QgdmFsdWVfdHlwZSogX19maXJzdCwgY29uc3QgdmFsdWVfdHlwZSogX19sYXN0LAorICAgICAgICAgICBjb25zdCBfQ29tcGFyZSYgX19jb21wLAorICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9NX3QoX19jb21wLCBfU1RMUF9DT05WRVJUX0FMTE9DQVRPUihfX2EsIF9LZXlTdG9yYWdlVHlwZSkpIHsKKyAgICBfTV90Lmluc2VydF9lcXVhbChjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NwdHIoX19maXJzdCksCisgICAgICAgICAgICAgICAgICAgICAgY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcHRyKF9fbGFzdCkpOworICB9CisKKyAgbXVsdGlzZXQoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KQorICAgIDogX01fdChfQ29tcGFyZSgpLCBfU3RvcmFnZVR5cGVBbGxvYygpKQorICB7IF9NX3QuaW5zZXJ0X2VxdWFsKF9TX3RvX3N0b3JhZ2VfaXRlKF9fZmlyc3QpLCBfU190b19zdG9yYWdlX2l0ZShfX2xhc3QpKTsgfQorCisgIG11bHRpc2V0KGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgY29uc3QgX0NvbXBhcmUmIF9fY29tcCwKKyAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfTV90KF9fY29tcCwgX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoX19hLCBfS2V5U3RvcmFnZVR5cGUpKQorICB7IF9NX3QuaW5zZXJ0X2VxdWFsKF9TX3RvX3N0b3JhZ2VfaXRlKF9fZmlyc3QpLCBfU190b19zdG9yYWdlX2l0ZShfX2xhc3QpKTsgfQorI2VuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKworICBtdWx0aXNldChjb25zdCBfU2VsZiYgX194KQorICAgIDogX01fdChfX3guX01fdCkge30KKworICBfU2VsZiYgb3BlcmF0b3I9KGNvbnN0IF9TZWxmJiBfX3gpIHsKKyAgICBfTV90ID0gX194Ll9NX3Q7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKKyAgbXVsdGlzZXQoX19tb3ZlX3NvdXJjZTxfU2VsZj4gc3JjKQorICAgIDogX01fdChfX21vdmVfc291cmNlPF9SZXBfdHlwZT4oc3JjLmdldCgpLl9NX3QpKSB7fQorI2VuZGlmCisKKyAgLy8gYWNjZXNzb3JzOgorICBrZXlfY29tcGFyZSBrZXlfY29tcCgpIGNvbnN0IHsgcmV0dXJuIF9NX3Qua2V5X2NvbXAoKTsgfQorICB2YWx1ZV9jb21wYXJlIHZhbHVlX2NvbXAoKSBjb25zdCB7IHJldHVybiBfTV90LmtleV9jb21wKCk7IH0KKyAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0CisgIHsgcmV0dXJuIF9TVExQX0NPTlZFUlRfQUxMT0NBVE9SKF9NX3QuZ2V0X2FsbG9jYXRvcigpLCB2YWx1ZV90eXBlKTsgfQorCisgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gX1NfdG9fdmFsdWVfaXRlKF9NX3QuYmVnaW4oKSk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gX1NfdG9fdmFsdWVfaXRlKF9NX3QuZW5kKCkpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gX1NfdG9fdmFsdWVfaXRlKF9NX3QuYmVnaW4oKSk7IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gX1NfdG9fdmFsdWVfaXRlKF9NX3QuZW5kKCkpOyB9CisgIHJldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKyAgcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIF9NX3QuZW1wdHkoKTsgfQorICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX3Quc2l6ZSgpOyB9CisgIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX3QubWF4X3NpemUoKTsgfQorICB2b2lkIHN3YXAoX1NlbGYmIF9feCkgeyBfTV90LnN3YXAoX194Ll9NX3QpOyB9CisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKSAmJiAhZGVmaW5lZCAoX1NUTFBfRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSKQorICB2b2lkIF9NX3N3YXBfd29ya2Fyb3VuZChfU2VsZiYgX194KSB7IHN3YXAoX194KTsgfQorI2VuZGlmCisKKyAgLy8gaW5zZXJ0L2VyYXNlCisgIGl0ZXJhdG9yIGluc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgIHsgcmV0dXJuIF9TX3RvX3ZhbHVlX2l0ZShfTV90Lmluc2VydF9lcXVhbChjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWYoX194KSkpOyB9CisgIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBfX3BvcywgY29uc3QgdmFsdWVfdHlwZSYgX194KSB7CisgICAgcmV0dXJuIF9TX3RvX3ZhbHVlX2l0ZShfTV90Lmluc2VydF9lcXVhbChfU190b19zdG9yYWdlX2l0ZShfX3BvcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWYoX194KSkpOworICB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZvaWQgaW5zZXJ0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkgeworIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX0lURVJBVE9SX1dSQVBQRVIpCisgICAgX01fdC5pbnNlcnRfZXF1YWwoX1NUTFBfVFlQRU5BTUUgX1NUTFBfUFJJViBfSXRlV3JhcHBlcjxfS2V5U3RvcmFnZVR5cGUsIF9LZXksIF9JbnB1dEl0ZXJhdG9yPjo6X0l0ZShfX2ZpcnN0KSwKKyAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9UWVBFTkFNRSBfU1RMUF9QUklWIF9JdGVXcmFwcGVyPF9LZXlTdG9yYWdlVHlwZSwgX0tleSwgX0lucHV0SXRlcmF0b3I+OjpfSXRlKF9fbGFzdCkpOworIyAgZWxzZQorICAgIF9NX3QuaW5zZXJ0X2VxdWFsKF9fZmlyc3QsIF9fbGFzdCk7CisjICBlbmRpZgorICB9CisjZWxzZQorICB2b2lkIGluc2VydChjb25zdCB2YWx1ZV90eXBlKiBfX2ZpcnN0LCBjb25zdCB2YWx1ZV90eXBlKiBfX2xhc3QpIHsKKyAgICBfTV90Lmluc2VydF9lcXVhbChjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NwdHIoX19maXJzdCksCisgICAgICAgICAgICAgICAgICAgICAgY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcHRyKF9fbGFzdCkpOworICB9CisgIHZvaWQgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKKyAgeyBfTV90Lmluc2VydF9lcXVhbChfU190b19zdG9yYWdlX2l0ZShfX2ZpcnN0KSwgX1NfdG9fc3RvcmFnZV9pdGUoX19sYXN0KSk7IH0KKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisKKyAgdm9pZCBlcmFzZShpdGVyYXRvciBfX3BvcykKKyAgeyBfTV90LmVyYXNlKF9TX3RvX3N0b3JhZ2VfaXRlKF9fcG9zKSk7IH0KKyAgc2l6ZV90eXBlIGVyYXNlKGNvbnN0IGtleV90eXBlJiBfX3gpCisgIHsgcmV0dXJuIF9NX3QuZXJhc2UoY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcmVmKF9feCkpOyB9CisgIHZvaWQgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KQorICB7IF9NX3QuZXJhc2UoX1NfdG9fc3RvcmFnZV9pdGUoX19maXJzdCksIF9TX3RvX3N0b3JhZ2VfaXRlKF9fbGFzdCkpOyB9CisgIHZvaWQgY2xlYXIoKSB7IF9NX3QuY2xlYXIoKTsgfQorCisgIC8vIG11bHRpc2V0IG9wZXJhdGlvbnM6CisKKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIGl0ZXJhdG9yIGZpbmQoY29uc3QgX0tUJiBfX3gpCisgIHsgcmV0dXJuIF9TX3RvX3ZhbHVlX2l0ZShfTV90LmZpbmQoY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcmVmVChfX3gpKSk7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIGNvbnN0X2l0ZXJhdG9yIGZpbmQoY29uc3QgX0tUJiBfX3gpIGNvbnN0CisgIHsgcmV0dXJuIF9TX3RvX3ZhbHVlX2l0ZShfTV90LmZpbmQoY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcmVmVChfX3gpKSk7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIHNpemVfdHlwZSBjb3VudChjb25zdCBfS1QmIF9feCkgY29uc3QKKyAgeyByZXR1cm4gX01fdC5jb3VudChjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWZUKF9feCkpOyB9CisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBpdGVyYXRvciBsb3dlcl9ib3VuZChjb25zdCBfS1QmIF9feCkKKyAgeyByZXR1cm4gX1NfdG9fdmFsdWVfaXRlKF9NX3QubG93ZXJfYm91bmQoY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcmVmVChfX3gpKSk7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIGNvbnN0X2l0ZXJhdG9yIGxvd2VyX2JvdW5kKGNvbnN0IF9LVCYgX194KSBjb25zdAorICB7IHJldHVybiBfU190b192YWx1ZV9pdGUoX01fdC5sb3dlcl9ib3VuZChjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWZUKF9feCkpKTsgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgaXRlcmF0b3IgdXBwZXJfYm91bmQoY29uc3QgX0tUJiBfX3gpCisgIHsgcmV0dXJuIF9TX3RvX3ZhbHVlX2l0ZShfTV90LnVwcGVyX2JvdW5kKGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3JlZlQoX194KSkpOyB9CisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBjb25zdF9pdGVyYXRvciB1cHBlcl9ib3VuZChjb25zdCBfS1QmIF9feCkgY29uc3QKKyAgeyByZXR1cm4gX1NfdG9fdmFsdWVfaXRlKF9NX3QudXBwZXJfYm91bmQoY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcmVmVChfX3gpKSk7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIHBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPiBlcXVhbF9yYW5nZShjb25zdCBfS1QmIF9feCkgeworICAgIHBhaXI8YmFzZV9pdGVyYXRvciwgYmFzZV9pdGVyYXRvcj4gX19yZXQ7CisgICAgX19yZXQgPSBfTV90LmVxdWFsX3JhbmdlKGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3JlZlQoX194KSk7CisgICAgcmV0dXJuIHBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPihfU190b192YWx1ZV9pdGUoX19yZXQuZmlyc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NfdG9fdmFsdWVfaXRlKF9fcmV0LnNlY29uZCkpOworICB9CisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4gZXF1YWxfcmFuZ2UoY29uc3QgX0tUJiBfX3gpIGNvbnN0IHsKKyAgICBwYWlyPGNvbnN0X2Jhc2VfaXRlcmF0b3IsIGNvbnN0X2Jhc2VfaXRlcmF0b3I+IF9fcmV0OworICAgIF9fcmV0ID0gX01fdC5lcXVhbF9yYW5nZShjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWZUKF9feCkpOworICAgIHJldHVybiBwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4oX1NfdG9fdmFsdWVfaXRlKF9fcmV0LmZpcnN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TX3RvX3ZhbHVlX2l0ZShfX3JldC5zZWNvbmQpKTsKKyAgfQorfTsKKworI2lmIGRlZmluZWQgKF9fQk9STEFORENfXykgfHwgZGVmaW5lZCAoX19ETUNfXykKKyMgIHVuZGVmIHR5cGVuYW1lCisjZW5kaWYKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLyogX1NUTFBfUFRSX1NQRUNJQUxJWkVEX1NFVF9IICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0bC9wb2ludGVycy9fc2xpc3QuaCBiL3N0bHBvcnQvc3RsL3BvaW50ZXJzL19zbGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MTg5ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9wb2ludGVycy9fc2xpc3QuaApAQCAtMCwwICsxLDQyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMworICogRnJhbmNvaXMgRHVtb250CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKy8qIE5PVEU6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIFNUTCBoZWFkZXJzLgorICogICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4KKyAqLworCisjaWZuZGVmIF9TVExQX1NQRUNJQUxJWkVEX1NMSVNUX0gKKyNkZWZpbmUgX1NUTFBfU1BFQ0lBTElaRURfU0xJU1RfSAorCisjaWZuZGVmIF9TVExQX1BPSU5URVJTX1NQRUNfVE9PTFNfSAorIyAgaW5jbHVkZSA8c3RsL3BvaW50ZXJzL190b29scy5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisjZGVmaW5lIFNMSVNUX0lNUEwgX1NUTFBfUFRSX0lNUExfTkFNRShzbGlzdCkKKworI2lmIGRlZmluZWQgKF9fQk9STEFORENfXykgfHwgZGVmaW5lZCAoX19ETUNfXykKKyMgIGRlZmluZSB0eXBlbmFtZQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUKSAmJiAhZGVmaW5lZCAoX1NUTFBfVVNFX01TVkM2X01FTV9UX0JVR19XT1JLQVJPVU5EKQorX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgX1NsaXN0X25vZGU8dm9pZCo+OwordHlwZWRlZiBfU2xpc3Rfbm9kZTx2b2lkKj4gX1ZvaWRQdHJTTm9kZTsKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBfU1RMUF9hbGxvY19wcm94eTxfU2xpc3Rfbm9kZV9iYXNlLCBfVm9pZFB0clNOb2RlLCBhbGxvY2F0b3I8X1ZvaWRQdHJTTm9kZT4gPjsKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBfU2xpc3RfYmFzZTx2b2lkKiwgYWxsb2NhdG9yPHZvaWQqPiA+OworX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIFNMSVNUX0lNUEw8dm9pZCosIGFsbG9jYXRvcjx2b2lkKj4gPjsKKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHKQorIyAgZGVmaW5lIHNsaXN0IF9TVExQX05PTl9EQkdfTkFNRShzbGlzdCkKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBfU1RMUF9ERkxfVE1QTF9QQVJBTShfQWxsb2MsIGFsbG9jYXRvcjxfVHA+KSA+CitjbGFzcyBzbGlzdAorI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QQVJUSUFMX1NQRUNfV09SS0FST1VORCkgJiYgIWRlZmluZWQgKHNsaXN0KQorICAgICAgICAgICAgIDogcHVibGljIF9fc3RscG9ydF9jbGFzczxzbGlzdDxfVHAsIF9BbGxvYz4gPgorI2VuZGlmCit7CisgIHR5cGVkZWYgX1NUTFBfVFlQRU5BTUUgX1NUTFBfUFJJViBfU3RvcmFnZVR5cGU8X1RwPjo6X1R5cGUgX1N0b3JhZ2VUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY190cmFpdHM8X1N0b3JhZ2VUeXBlLCBfQWxsb2M+OjphbGxvY2F0b3JfdHlwZSBfU3RvcmFnZVR5cGVBbGxvYzsKKyAgdHlwZWRlZiBfU1RMUF9QUklWIFNMSVNUX0lNUEw8X1N0b3JhZ2VUeXBlLCBfU3RvcmFnZVR5cGVBbGxvYz4gX0Jhc2U7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yIF9CYXNlSXRlOworICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9pdGVyYXRvciBfQmFzZUNvbnN0SXRlOworICB0eXBlZGVmIHNsaXN0PF9UcCwgX0FsbG9jPiBfU2VsZjsKKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9DYXN0VHJhaXRzPF9TdG9yYWdlVHlwZSwgX1RwPiBjYXN0X3RyYWl0czsKKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9TbGlzdF9ub2RlX2Jhc2UgX05vZGVfYmFzZTsKKworcHVibGljOgorICB0eXBlZGVmIF9UcCAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgdmFsdWVfdHlwZSogICAgICAgcG9pbnRlcjsKKyAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlKiBjb25zdF9wb2ludGVyOworICB0eXBlZGVmIHZhbHVlX3R5cGUmICAgICAgIHJlZmVyZW5jZTsKKyAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlJiBjb25zdF9yZWZlcmVuY2U7CisgIHR5cGVkZWYgc2l6ZV90ICAgICAgICAgICAgc2l6ZV90eXBlOworICB0eXBlZGVmIHB0cmRpZmZfdCAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgdHlwZWRlZiBmb3J3YXJkX2l0ZXJhdG9yX3RhZyBfSXRlcmF0b3JfY2F0ZWdvcnk7CisKKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9TbGlzdF9pdGVyYXRvcjx2YWx1ZV90eXBlLCBfTm9uY29uc3RfdHJhaXRzPHZhbHVlX3R5cGU+ID4gIGl0ZXJhdG9yOworICB0eXBlZGVmIF9TVExQX1BSSVYgX1NsaXN0X2l0ZXJhdG9yPHZhbHVlX3R5cGUsIF9Db25zdF90cmFpdHM8dmFsdWVfdHlwZT4gPiAgICAgY29uc3RfaXRlcmF0b3I7CisKKyAgX1NUTFBfRk9SQ0VfQUxMT0NBVE9SUyh2YWx1ZV90eXBlLCBfQWxsb2MpCisgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jX3RyYWl0czx2YWx1ZV90eXBlLCBfQWxsb2M+OjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKKworcHVibGljOgorICBhbGxvY2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9yKCkgY29uc3QKKyAgeyByZXR1cm4gX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoX01faW1wbC5nZXRfYWxsb2NhdG9yKCksIHZhbHVlX3R5cGUpOyB9CisKKyAgZXhwbGljaXQgc2xpc3QoY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfTV9pbXBsKF9TVExQX0NPTlZFUlRfQUxMT0NBVE9SKF9fYSwgX1N0b3JhZ2VUeXBlKSkge30KKworI2lmICFkZWZpbmVkKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCisgIGV4cGxpY2l0IHNsaXN0KHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCA9IF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQodmFsdWVfdHlwZSksCisjZWxzZQorICBzbGlzdChzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gsCisjZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKi8KKyAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9ICBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX01faW1wbChfX24sIGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3JlZihfX3gpLCBfU1RMUF9DT05WRVJUX0FMTE9DQVRPUihfX2EsIF9TdG9yYWdlVHlwZSkpIHt9CisKKyNpZiBkZWZpbmVkKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCisgIGV4cGxpY2l0IHNsaXN0KHNpemVfdHlwZSBfX24pIDogX01faW1wbChfX24pIHt9CisjZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKi8KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIC8vIFdlIGRvbid0IG5lZWQgYW55IGRpc3BhdGNoaW5nIHRyaWNrcyBoZXJlLCBiZWNhdXNlIF9NX2luc2VydF9hZnRlcl9yYW5nZQorICAvLyBhbHJlYWR5IGRvZXMgdGhlbS4KKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICBzbGlzdChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgX1NUTFBfQUxMT0NBVE9SX1RZUEVfREZMKQorIyAgaWYgIWRlZmluZWQgKF9TVExQX1VTRV9JVEVSQVRPUl9XUkFQUEVSKQorICAgIDogX01faW1wbChfX2ZpcnN0LCBfX2xhc3QsIF9TVExQX0NPTlZFUlRfQUxMT0NBVE9SKF9fYSwgX1N0b3JhZ2VUeXBlKSkge30KKyMgIGVsc2UKKyAgICA6IF9NX2ltcGwoX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoX19hLCBfU3RvcmFnZVR5cGUpKSB7CisgICAgaW5zZXJ0X2FmdGVyKGJlZm9yZV9iZWdpbigpLCBfX2ZpcnN0LCBfX2xhc3QpOworICB9CisjICBlbmRpZgorIyAgaWYgZGVmaW5lZCAoX1NUTFBfTkVFRFNfRVhUUkFfVEVNUExBVEVfQ09OU1RSVUNUT1JTKQorICAvLyBWQysrIG5lZWRzIHRoaXMgY3JhenluZXNzCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgc2xpc3QoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorIyAgICBpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX1dSQVBQRVJfSVRFUkFUT1IpCisgICAgOiBfTV9pbXBsKF9fZmlyc3QsIF9fbGFzdCkge30KKyMgICAgZWxzZQorICB7IGluc2VydF9hZnRlcihiZWZvcmVfYmVnaW4oKSwgX19maXJzdCwgX19sYXN0KTsgfQorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbHNlIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKyAgc2xpc3QoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0LAorICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gIGFsbG9jYXRvcl90eXBlKCkgKQorICAgIDogX01faW1wbChfQmFzZUNvbnN0SXRlKF9fZmlyc3QuX01fbm9kZSksIF9CYXNlQ29uc3RJdGUoX19sYXN0Ll9NX25vZGUpLAorICAgICAgICAgICAgICBfU1RMUF9DT05WRVJUX0FMTE9DQVRPUihfX2EsIF9TdG9yYWdlVHlwZSkpIHt9CisgIHNsaXN0KGNvbnN0IHZhbHVlX3R5cGUqIF9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbGFzdCwKKyAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9ICBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX01faW1wbChjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NwdHIoX19maXJzdCksIGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3B0cihfX2xhc3QpLAorICAgICAgICAgICAgICBfU1RMUF9DT05WRVJUX0FMTE9DQVRPUihfX2EsIF9TdG9yYWdlVHlwZSkpIHt9CisjZW5kaWYgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworCisgIHNsaXN0KGNvbnN0IF9TZWxmJiBfX3gpIDogX01faW1wbChfX3guX01faW1wbCkge30KKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19NT1ZFX1NFTUFOVElDKQorICBzbGlzdChfX21vdmVfc291cmNlPF9TZWxmPiBzcmMpCisgICAgOiBfTV9pbXBsKF9fbW92ZV9zb3VyY2U8X0Jhc2U+KHNyYy5nZXQoKS5fTV9pbXBsKSkge30KKyNlbmRpZgorCisgIF9TZWxmJiBvcGVyYXRvcj0gKGNvbnN0IF9TZWxmJiBfX3gpIHsgX01faW1wbCA9IF9feC5fTV9pbXBsOyByZXR1cm4gKnRoaXM7IH0KKworICB2b2lkIGFzc2lnbihzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ZhbCkKKyAgeyBfTV9pbXBsLmFzc2lnbihfX24sIGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3JlZihfX3ZhbCkpOyB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX0lURVJBVE9SX1dSQVBQRVIpCitwcml2YXRlOgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0ludGVnZXI+CisgIHZvaWQgX01fYXNzaWduX2Rpc3BhdGNoKF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX192YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fdHJ1ZV90eXBlJikKKyAgeyBfTV9pbXBsLmFzc2lnbihfX24sIF9fdmFsKTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgdm9pZCBfTV9hc3NpZ25fZGlzcGF0Y2goX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2ZhbHNlX3R5cGUmKSB7CisgICAgX01faW1wbC5hc3NpZ24oX1NUTFBfVFlQRU5BTUUgX1NUTFBfUFJJViBfSXRlV3JhcHBlcjxfU3RvcmFnZVR5cGUsIF9UcCwgX0lucHV0SXRlcmF0b3I+OjpfSXRlKF9fZmlyc3QpLAorICAgICAgICAgICAgICAgICAgIF9TVExQX1RZUEVOQU1FIF9TVExQX1BSSVYgX0l0ZVdyYXBwZXI8X1N0b3JhZ2VUeXBlLCBfVHAsIF9JbnB1dEl0ZXJhdG9yPjo6X0l0ZShfX2xhc3QpKTsKKyAgfQorCitwdWJsaWM6CisjICBlbmRpZgorCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgdm9pZCBhc3NpZ24oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KSB7CisjICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfSVRFUkFUT1JfV1JBUFBFUikKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0ludGVncmFsPF9JbnB1dEl0ZXJhdG9yPjo6X1JldCBfSW50ZWdyYWw7CisgICAgX01fYXNzaWduX2Rpc3BhdGNoKF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOworIyAgZWxzZQorICAgIF9NX2ltcGwuYXNzaWduKF9fZmlyc3QsIF9fbGFzdCk7CisjICBlbmRpZgorICB9CisjZWxzZQorICB2b2lkIGFzc2lnbihjb25zdCB2YWx1ZV90eXBlICpfX2ZpcnN0LCBjb25zdCB2YWx1ZV90eXBlICpfX2xhc3QpIHsKKyAgICBfTV9pbXBsLmFzc2lnbihjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NwdHIoX19maXJzdCksCisgICAgICAgICAgICAgICAgICAgY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcHRyKF9fbGFzdCkpOworICB9CisgIHZvaWQgYXNzaWduKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkgeworICAgIF9NX2ltcGwuYXNzaWduKF9CYXNlQ29uc3RJdGUoX19maXJzdC5fTV9ub2RlKSwKKyAgICAgICAgICAgICAgICAgICBfQmFzZUNvbnN0SXRlKF9fbGFzdC5fTV9ub2RlKSk7CisgIH0KKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisKKyAgaXRlcmF0b3IgYmVmb3JlX2JlZ2luKCkgICAgICAgICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX01faW1wbC5iZWZvcmVfYmVnaW4oKS5fTV9ub2RlKTsgfQorICBjb25zdF9pdGVyYXRvciBiZWZvcmVfYmVnaW4oKSBjb25zdCB7IHJldHVybiBjb25zdF9pdGVyYXRvcihjb25zdF9jYXN0PF9Ob2RlX2Jhc2UqPihfTV9pbXBsLmJlZm9yZV9iZWdpbigpLl9NX25vZGUpKTsgfQorCisgIGl0ZXJhdG9yIGJlZ2luKCkgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9NX2ltcGwuYmVnaW4oKS5fTV9ub2RlKTsgfQorICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0ICAgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihjb25zdF9jYXN0PF9Ob2RlX2Jhc2UqPihfTV9pbXBsLmJlZ2luKCkuX01fbm9kZSkpO30KKworICBpdGVyYXRvciBlbmQoKSAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBpdGVyYXRvcihfTV9pbXBsLmVuZCgpLl9NX25vZGUpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0ICAgICAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9NX2ltcGwuZW5kKCkuX01fbm9kZSk7IH0KKworICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0ICAgICAgeyByZXR1cm4gX01faW1wbC5zaXplKCk7IH0KKyAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgIHsgcmV0dXJuIF9NX2ltcGwubWF4X3NpemUoKTsgfQorICBib29sIGVtcHR5KCkgY29uc3QgICAgICAgICAgeyByZXR1cm4gX01faW1wbC5lbXB0eSgpOyB9CisKKyAgdm9pZCBzd2FwKF9TZWxmJiBfX3gpIHsgX01faW1wbC5zd2FwKF9feC5fTV9pbXBsKTsgfQorI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QQVJUSUFMX1NQRUNfV09SS0FST1VORCkgJiYgIWRlZmluZWQgKF9TVExQX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUikKKyAgdm9pZCBfTV9zd2FwX3dvcmthcm91bmQoX1NlbGYmIF9feCkgeyBzd2FwKF9feCk7IH0KKyNlbmRpZgorCitwdWJsaWM6CisgIHJlZmVyZW5jZSBmcm9udCgpICAgICAgICAgICAgIHsgcmV0dXJuICpiZWdpbigpOyB9CisgIGNvbnN0X3JlZmVyZW5jZSBmcm9udCgpIGNvbnN0IHsgcmV0dXJuICpiZWdpbigpOyB9CisjaWYgIWRlZmluZWQoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkgJiYgIWRlZmluZWQoX1NUTFBfTk9fQU5BQ0hST05JU01TKQorICB2b2lkIHB1c2hfZnJvbnQoY29uc3QgdmFsdWVfdHlwZSYgX194ID0gX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRCh2YWx1ZV90eXBlKSkKKyNlbHNlCisgIHZvaWQgcHVzaF9mcm9udChjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisjZW5kaWYgLyohX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSAmJiAhX1NUTFBfTk9fQU5BQ0hST05JU01TKi8KKyAgeyBfTV9pbXBsLnB1c2hfZnJvbnQoY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcmVmKF9feCkpOyB9CisKKyMgaWYgZGVmaW5lZChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKSAmJiAhZGVmaW5lZChfU1RMUF9OT19BTkFDSFJPTklTTVMpCisgIHZvaWQgcHVzaF9mcm9udCgpIHsgX01faW1wbC5wdXNoX2Zyb250KCk7fQorIyBlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0gJiYgIV9TVExQX05PX0FOQUNIUk9OSVNNUyovCisKKyAgdm9pZCBwb3BfZnJvbnQoKSB7IF9NX2ltcGwucG9wX2Zyb250KCk7IH0KKworICBpdGVyYXRvciBwcmV2aW91cyhjb25zdF9pdGVyYXRvciBfX3BvcykKKyAgeyByZXR1cm4gaXRlcmF0b3IoX01faW1wbC5wcmV2aW91cyhfQmFzZUNvbnN0SXRlKF9fcG9zLl9NX25vZGUpKS5fTV9ub2RlKTsgfQorICBjb25zdF9pdGVyYXRvciBwcmV2aW91cyhjb25zdF9pdGVyYXRvciBfX3BvcykgY29uc3QKKyAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoY29uc3RfY2FzdDxfTm9kZV9iYXNlKj4oX01faW1wbC5wcmV2aW91cyhfQmFzZUNvbnN0SXRlKF9fcG9zLl9NX25vZGUpKS5fTV9ub2RlKSk7IH0KKworI2lmICFkZWZpbmVkKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCisgIGl0ZXJhdG9yIGluc2VydF9hZnRlcihpdGVyYXRvciBfX3BvcywgY29uc3QgdmFsdWVfdHlwZSYgX194ID0gX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRCh2YWx1ZV90eXBlKSkKKyNlbHNlCisgIGl0ZXJhdG9yIGluc2VydF9hZnRlcihpdGVyYXRvciBfX3BvcywgY29uc3QgdmFsdWVfdHlwZSYgX194KQorI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCisgIHsgcmV0dXJuIGl0ZXJhdG9yKF9NX2ltcGwuaW5zZXJ0X2FmdGVyKF9CYXNlSXRlKF9fcG9zLl9NX25vZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWYoX194KSkuX01fbm9kZSk7IH0KKworI2lmIGRlZmluZWQoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKKyAgaXRlcmF0b3IgaW5zZXJ0X2FmdGVyKGl0ZXJhdG9yIF9fcG9zKQorICB7IHJldHVybiBpdGVyYXRvcihfTV9pbXBsLmluc2VydF9hZnRlcihfQmFzZUl0ZShfX3Bvcy5fTV9ub2RlKSkuX01fbm9kZSk7fQorI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCisKKyAgdm9pZCBpbnNlcnRfYWZ0ZXIoaXRlcmF0b3IgX19wb3MsIHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgeyBfTV9pbXBsLmluc2VydF9hZnRlcihfQmFzZUl0ZShfX3Bvcy5fTV9ub2RlKSwgX19uLCBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWYoX194KSk7IH0KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisjICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfSVRFUkFUT1JfV1JBUFBFUikKK3ByaXZhdGU6CisgIHRlbXBsYXRlIDxjbGFzcyBfSW50ZWdlcj4KKyAgdm9pZCBfTV9pbnNlcnRfYWZ0ZXJfZGlzcGF0Y2goaXRlcmF0b3IgX19wb3MsIF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX192YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fdHJ1ZV90eXBlJikgeworICAgIF9NX2ltcGwuaW5zZXJ0X2FmdGVyKF9CYXNlSXRlKF9fcG9zLl9NX25vZGUpLCBfX24sIF9fdmFsKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgdm9pZCBfTV9pbnNlcnRfYWZ0ZXJfZGlzcGF0Y2goaXRlcmF0b3IgX19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19mYWxzZV90eXBlJikgeworICAgIF9NX2ltcGwuaW5zZXJ0X2FmdGVyKF9CYXNlSXRlKF9fcG9zLl9NX25vZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1RZUEVOQU1FIF9TVExQX1BSSVYgX0l0ZVdyYXBwZXI8X1N0b3JhZ2VUeXBlLCBfVHAsIF9JbnB1dEl0ZXJhdG9yPjo6X0l0ZShfX2ZpcnN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9UWVBFTkFNRSBfU1RMUF9QUklWIF9JdGVXcmFwcGVyPF9TdG9yYWdlVHlwZSwgX1RwLCBfSW5wdXRJdGVyYXRvcj46Ol9JdGUoX19sYXN0KSk7CisgIH0KKworcHVibGljOgorIyAgZW5kaWYKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZvaWQgaW5zZXJ0X2FmdGVyKGl0ZXJhdG9yIF9fcG9zLCBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpIHsKKyMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9JVEVSQVRPUl9XUkFQUEVSKQorICAgIC8vIENoZWNrIHdoZXRoZXIgaXQncyBhbiBpbnRlZ3JhbCB0eXBlLiAgSWYgc28sIGl0J3Mgbm90IGFuIGl0ZXJhdG9yLgorICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lzSW50ZWdyYWw8X0lucHV0SXRlcmF0b3I+OjpfUmV0IF9JbnRlZ3JhbDsKKyAgICBfTV9pbnNlcnRfYWZ0ZXJfZGlzcGF0Y2goX19wb3MsIF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOworIyAgZWxzZQorICAgIF9NX2ltcGwuaW5zZXJ0X2FmdGVyKF9CYXNlSXRlKF9fcG9zLl9NX25vZGUpLCBfX2ZpcnN0LCBfX2xhc3QpOworIyAgZW5kaWYKKyAgfQorCisjZWxzZSAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisgIHZvaWQgaW5zZXJ0X2FmdGVyKGl0ZXJhdG9yIF9fcG9zLAorICAgICAgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpCisgIHsgX01faW1wbC5pbnNlcnRfYWZ0ZXIoX0Jhc2VJdGUoX19wb3MuX01fbm9kZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgX0Jhc2VDb25zdEl0ZShfX2ZpcnN0Ll9NX25vZGUpLCBfQmFzZUNvbnN0SXRlKF9fbGFzdC5fTV9ub2RlKSk7IH0KKyAgdm9pZCBpbnNlcnRfYWZ0ZXIoaXRlcmF0b3IgX19wb3MsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlX3R5cGUqIF9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbGFzdCkgeworICAgIF9NX2ltcGwuaW5zZXJ0X2FmdGVyKF9CYXNlSXRlKF9fcG9zLl9NX25vZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3B0cihfX2ZpcnN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NwdHIoX19sYXN0KSk7CisgIH0KKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisKKyNpZiAhZGVmaW5lZChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCA9IF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQodmFsdWVfdHlwZSkpCisjZWxzZQorICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0qLworICB7IHJldHVybiBpdGVyYXRvcihfTV9pbXBsLmluc2VydChfQmFzZUl0ZShfX3Bvcy5fTV9ub2RlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcmVmKF9feCkpLl9NX25vZGUpOyB9CisKKyNpZiBkZWZpbmVkKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCisgIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBfX3BvcykKKyAgeyByZXR1cm4gaXRlcmF0b3IoX01faW1wbC5pbnNlcnQoX0Jhc2VJdGUoX19wb3MuX01fbm9kZSkpLl9NX25vZGUpOyB9CisjZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKi8KKworICB2b2lkIGluc2VydChpdGVyYXRvciBfX3Bvcywgc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX194KQorICB7IF9NX2ltcGwuaW5zZXJ0KF9CYXNlSXRlKF9fcG9zLl9NX25vZGUpLCBfX24sIGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3JlZihfX3gpKTsgfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9JVEVSQVRPUl9XUkFQUEVSKQorcHJpdmF0ZToKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2VyPgorICB2b2lkIF9NX2luc2VydF9kaXNwYXRjaChpdGVyYXRvciBfX3BvcywgX0ludGVnZXIgX19uLCBfSW50ZWdlciBfX3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX190cnVlX3R5cGUmKSB7CisgICAgX01faW1wbC5pbnNlcnQoX0Jhc2VJdGUoX19wb3MuX01fbm9kZSksIF9fbiwgX192YWwpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICB2b2lkIF9NX2luc2VydF9kaXNwYXRjaChpdGVyYXRvciBfX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2ZhbHNlX3R5cGUmKSB7CisgICAgX01faW1wbC5pbnNlcnQoX0Jhc2VJdGUoX19wb3MuX01fbm9kZSksIF9TVExQX1RZUEVOQU1FIF9TVExQX1BSSVYgX0l0ZVdyYXBwZXI8X1N0b3JhZ2VUeXBlLCBfVHAsIF9JbnB1dEl0ZXJhdG9yPjo6X0l0ZShfX2ZpcnN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfVFlQRU5BTUUgX1NUTFBfUFJJViBfSXRlV3JhcHBlcjxfU3RvcmFnZVR5cGUsIF9UcCwgX0lucHV0SXRlcmF0b3I+OjpfSXRlKF9fbGFzdCkpOworICB9CisKK3B1YmxpYzoKKyMgIGVuZGlmCisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICB2b2lkIGluc2VydChpdGVyYXRvciBfX3BvcywgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KSB7CisjICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfSVRFUkFUT1JfV1JBUFBFUikKKyAgICAvLyBDaGVjayB3aGV0aGVyIGl0J3MgYW4gaW50ZWdyYWwgdHlwZS4gIElmIHNvLCBpdCdzIG5vdCBhbiBpdGVyYXRvci4KKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0ludGVncmFsPF9JbnB1dEl0ZXJhdG9yPjo6X1JldCBfSW50ZWdyYWw7CisgICAgX01faW5zZXJ0X2Rpc3BhdGNoKF9fcG9zLCBfX2ZpcnN0LCBfX2xhc3QsIF9JbnRlZ3JhbCgpKTsKKyMgIGVsc2UKKyAgICBfTV9pbXBsLmluc2VydChfQmFzZUl0ZShfX3Bvcy5fTV9ub2RlKSwgX19maXJzdCwgX19sYXN0KTsKKyMgIGVuZGlmCisgIH0KKworI2Vsc2UgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworICB2b2lkIGluc2VydChpdGVyYXRvciBfX3BvcywgY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KQorICB7IF9NX2ltcGwuaW5zZXJ0KF9CYXNlSXRlKF9fcG9zLl9NX25vZGUpLCBfQmFzZUNvbnN0SXRlKF9fZmlyc3QuX01fbm9kZSksIF9CYXNlQ29uc3RJdGUoX19sYXN0Ll9NX25vZGUpKTsgfQorICB2b2lkIGluc2VydChpdGVyYXRvciBfX3BvcywgY29uc3QgdmFsdWVfdHlwZSogX19maXJzdCwgY29uc3QgdmFsdWVfdHlwZSogX19sYXN0KQorICB7IF9NX2ltcGwuaW5zZXJ0KF9CYXNlSXRlKF9fcG9zLl9NX25vZGUpLCBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NwdHIoX19maXJzdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3B0cihfX2xhc3QpKTsgfQorI2VuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKworICBpdGVyYXRvciBlcmFzZV9hZnRlcihpdGVyYXRvciBfX3BvcykKKyAgeyByZXR1cm4gaXRlcmF0b3IoX01faW1wbC5lcmFzZV9hZnRlcihfQmFzZUl0ZShfX3Bvcy5fTV9ub2RlKSkuX01fbm9kZSk7IH0KKyAgaXRlcmF0b3IgZXJhc2VfYWZ0ZXIoaXRlcmF0b3IgX19iZWZvcmVfZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkKKyAgeyByZXR1cm4gaXRlcmF0b3IoX01faW1wbC5lcmFzZV9hZnRlcihfQmFzZUl0ZShfX2JlZm9yZV9maXJzdC5fTV9ub2RlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmFzZUl0ZShfX2xhc3QuX01fbm9kZSkpLl9NX25vZGUpOyB9CisKKyAgaXRlcmF0b3IgZXJhc2UoaXRlcmF0b3IgX19wb3MpCisgIHsgcmV0dXJuIGl0ZXJhdG9yKF9NX2ltcGwuZXJhc2UoX0Jhc2VJdGUoX19wb3MuX01fbm9kZSkpLl9NX25vZGUpOyB9CisgIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkKKyAgeyByZXR1cm4gaXRlcmF0b3IoX01faW1wbC5lcmFzZShfQmFzZUl0ZShfX2ZpcnN0Ll9NX25vZGUpLCBfQmFzZUl0ZShfX2xhc3QuX01fbm9kZSkpLl9NX25vZGUpOyB9CisKKyNpZiAhZGVmaW5lZChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgX19uZXdfc2l6ZSwgY29uc3QgdmFsdWVfdHlwZSYgX194ID0gX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRCh2YWx1ZV90eXBlKSkKKyNlbHNlCisgIHZvaWQgcmVzaXplKHNpemVfdHlwZSBfX25ld19zaXplLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisjZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKi8KKyAgeyBfTV9pbXBsLnJlc2l6ZShfX25ld19zaXplLCBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWYoX194KSk7fQorCisjaWYgZGVmaW5lZChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgX19uZXdfc2l6ZSkgeyBfTV9pbXBsLnJlc2l6ZShfX25ld19zaXplKTsgfQorI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCisKKyAgdm9pZCBjbGVhcigpIHsgX01faW1wbC5jbGVhcigpOyB9CisKKyAgdm9pZCBzcGxpY2VfYWZ0ZXIoaXRlcmF0b3IgX19wb3MsIF9TZWxmJiBfX3gsCisgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yIF9fYmVmb3JlX2ZpcnN0LCBpdGVyYXRvciBfX2JlZm9yZV9sYXN0KQorICB7IF9NX2ltcGwuc3BsaWNlX2FmdGVyKF9CYXNlSXRlKF9fcG9zLl9NX25vZGUpLCBfX3guX01faW1wbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfQmFzZUl0ZShfX2JlZm9yZV9maXJzdC5fTV9ub2RlKSwgX0Jhc2VJdGUoX19iZWZvcmVfbGFzdC5fTV9ub2RlKSk7IH0KKyAgdm9pZCBzcGxpY2VfYWZ0ZXIoaXRlcmF0b3IgX19wb3MsIF9TZWxmJiBfX3gsIGl0ZXJhdG9yIF9fcHJldikKKyAgeyBfTV9pbXBsLnNwbGljZV9hZnRlcihfQmFzZUl0ZShfX3Bvcy5fTV9ub2RlKSwgX194Ll9NX2ltcGwsIF9CYXNlSXRlKF9fcHJldi5fTV9ub2RlKSk7IH0KKyAgdm9pZCBzcGxpY2VfYWZ0ZXIoaXRlcmF0b3IgX19wb3MsIF9TZWxmJiBfX3gpCisgIHsgX01faW1wbC5zcGxpY2VfYWZ0ZXIoX0Jhc2VJdGUoX19wb3MuX01fbm9kZSksIF9feC5fTV9pbXBsKTsgfQorICB2b2lkIHNwbGljZShpdGVyYXRvciBfX3BvcywgX1NlbGYmIF9feCkKKyAgeyBfTV9pbXBsLnNwbGljZShfQmFzZUl0ZShfX3Bvcy5fTV9ub2RlKSwgX194Ll9NX2ltcGwpOyB9CisgIHZvaWQgc3BsaWNlKGl0ZXJhdG9yIF9fcG9zLCBfU2VsZiYgX194LCBpdGVyYXRvciBfX2kpCisgIHsgX01faW1wbC5zcGxpY2UoX0Jhc2VJdGUoX19wb3MuX01fbm9kZSksIF9feC5fTV9pbXBsLCBfQmFzZUl0ZShfX2kuX01fbm9kZSkpOyB9CisgIHZvaWQgc3BsaWNlKGl0ZXJhdG9yIF9fcG9zLCBfU2VsZiYgX194LCBpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpCisgIHsgX01faW1wbC5zcGxpY2UoX0Jhc2VJdGUoX19wb3MuX01fbm9kZSksIF9feC5fTV9pbXBsLAorICAgICAgICAgICAgICAgICAgIF9CYXNlSXRlKF9fZmlyc3QuX01fbm9kZSksIF9CYXNlSXRlKF9fbGFzdC5fTV9ub2RlKSk7IH0KKworICB2b2lkIHJldmVyc2UoKSB7IF9NX2ltcGwucmV2ZXJzZSgpOyB9CisKKyAgdm9pZCByZW1vdmUoY29uc3QgdmFsdWVfdHlwZSYgX192YWwpIHsgX01faW1wbC5yZW1vdmUoY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcmVmKF9fdmFsKSk7IH0KKyAgdm9pZCB1bmlxdWUoKSAgICAgICAgICAgICAgICAgeyBfTV9pbXBsLnVuaXF1ZSgpOyB9CisgIHZvaWQgbWVyZ2UoX1NlbGYmIF9feCkgICAgICAgIHsgX01faW1wbC5tZXJnZShfX3guX01faW1wbCk7IH0KKyAgdm9pZCBzb3J0KCkgICAgICAgICAgICAgICAgICAge19NX2ltcGwuc29ydCgpOyB9CisKKyNpZmRlZiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTCisgIHRlbXBsYXRlIDxjbGFzcyBfUHJlZGljYXRlPgorICB2b2lkIHJlbW92ZV9pZihfUHJlZGljYXRlIF9fcHJlZCkKKyAgeyBfTV9pbXBsLnJlbW92ZV9pZihfU1RMUF9QUklWIF9VbmFyeVByZWRXcmFwcGVyPF9TdG9yYWdlVHlwZSwgX1RwLCBfUHJlZGljYXRlPihfX3ByZWQpKTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfQmluYXJ5UHJlZGljYXRlPgorICB2b2lkIHVuaXF1ZShfQmluYXJ5UHJlZGljYXRlIF9fcHJlZCkKKyAgeyBfTV9pbXBsLnVuaXF1ZShfU1RMUF9QUklWIF9CaW5hcnlQcmVkV3JhcHBlcjxfU3RvcmFnZVR5cGUsIF9UcCwgX0JpbmFyeVByZWRpY2F0ZT4oX19wcmVkKSk7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1N0cmljdFdlYWtPcmRlcmluZz4KKyAgdm9pZCBtZXJnZShfU2VsZiYgX194LCBfU3RyaWN0V2Vha09yZGVyaW5nIF9fY29tcCkKKyAgeyBfTV9pbXBsLm1lcmdlKF9feC5fTV9pbXBsLCBfU1RMUF9QUklWIF9CaW5hcnlQcmVkV3JhcHBlcjxfU3RvcmFnZVR5cGUsIF9UcCwgX1N0cmljdFdlYWtPcmRlcmluZz4oX19jb21wKSk7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1N0cmljdFdlYWtPcmRlcmluZz4KKyAgdm9pZCBzb3J0KF9TdHJpY3RXZWFrT3JkZXJpbmcgX19jb21wKQorICB7IF9NX2ltcGwuc29ydChfU1RMUF9QUklWIF9CaW5hcnlQcmVkV3JhcHBlcjxfU3RvcmFnZVR5cGUsIF9UcCwgX1N0cmljdFdlYWtPcmRlcmluZz4oX19jb21wKSk7IH0KKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisKK3ByaXZhdGU6CisgIF9CYXNlIF9NX2ltcGw7Cit9OworCisjaWYgZGVmaW5lZCAoc2xpc3QpCisjICB1bmRlZiBzbGlzdAorX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisjZW5kaWYKKworI3VuZGVmIFNMSVNUX0lNUEwKKworI2lmIGRlZmluZWQgKF9fQk9STEFORENfXykgfHwgZGVmaW5lZCAoX19ETUNfXykKKyMgIHVuZGVmIHR5cGVuYW1lCisjZW5kaWYKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLyogX1NUTFBfU1BFQ0lBTElaRURfU0xJU1RfSCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdGwvcG9pbnRlcnMvX3Rvb2xzLmggYi9zdGxwb3J0L3N0bC9wb2ludGVycy9fdG9vbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzk0ODA2Ci0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdGwvcG9pbnRlcnMvX3Rvb2xzLmgKQEAgLTAsMCArMSw0NzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMKKyAqIEZyYW5jb2lzIER1bW9udAorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisvKiBOT1RFOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBTVEwgaGVhZGVycy4KKyAqICAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuCisgKi8KKworI2lmbmRlZiBfU1RMUF9QT0lOVEVSU19TUEVDX1RPT0xTX0gKKyNkZWZpbmUgX1NUTFBfUE9JTlRFUlNfU1BFQ19UT09MU19ICisKKyNpZm5kZWYgX1NUTFBfVFlQRV9UUkFJVFNfSAorIyAgaW5jbHVkZSA8c3RsL3R5cGVfdHJhaXRzLmg+CisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKKy8vU29tZSB1c2VmdWxsIGRlY2xhcmF0aW9uczoKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBsZXNzOworCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfU3RvcmFnZVQsIGNsYXNzIF9WYWx1ZVQsIGNsYXNzIF9CaW5hcnlQcmVkaWNhdGU+CitzdHJ1Y3QgX0JpbmFyeVByZWRXcmFwcGVyOworCisvKgorICogU2luY2UgdGhlIGNvbXBpbGVyIG9ubHkgYWxsb3dzIGF0IG1vc3Qgb25lIG5vbi10cml2aWFsCisgKiBpbXBsaWNpdCBjb252ZXJzaW9uIHdlIGNhbiBtYWtlIHVzZSBvZiBhIHNoaW0gY2xhc3MgdG8KKyAqIGJlIHN1cmUgdGhhdCBmdW5jdGlvbnMgYmVsb3cgZG9lc24ndCBhY2NlcHQgY2xhc3NlcyB3aXRoCisgKiBpbXBsaWNpdCBwb2ludGVyIGNvbnZlcnNpb24gb3BlcmF0b3JzCisgKi8KK3N0cnVjdCBfVm9pZFBvaW50ZXJTaGltCit7IF9Wb2lkUG9pbnRlclNoaW0odm9pZCopOyB9Oworc3RydWN0IF9Db25zdFZvaWRQb2ludGVyU2hpbQoreyBfQ29uc3RWb2lkUG9pbnRlclNoaW0oY29uc3Qgdm9pZCopOyB9Oworc3RydWN0IF9Wb2xhdGlsZVZvaWRQb2ludGVyU2hpbQoreyBfVm9sYXRpbGVWb2lkUG9pbnRlclNoaW0odm9sYXRpbGUgdm9pZCopOyB9Oworc3RydWN0IF9Db25zdFZvbGF0aWxlVm9pZFBvaW50ZXJTaGltCit7IF9Db25zdFZvbGF0aWxlVm9pZFBvaW50ZXJTaGltKGNvbnN0IHZvbGF0aWxlIHZvaWQqKTsgfTsKKworLy9UaGUgZGlzcGF0Y2ggZnVuY3Rpb25zOgordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2NoYXIgX1VzZVZvaWRQdHJTdG9yYWdlVHlwZShjb25zdCBfX2ZhbHNlX3R5cGUmIC8qUE9EKi8sIGNvbnN0IF9UcCYpOworY2hhciBfVXNlVm9pZFB0clN0b3JhZ2VUeXBlKGNvbnN0IF9fdHJ1ZV90eXBlJiAvKlBPRCovLCAuLi4pOworY2hhciogX1VzZVZvaWRQdHJTdG9yYWdlVHlwZShjb25zdCBfX3RydWVfdHlwZSYgLypQT0QqLywgX1ZvaWRQb2ludGVyU2hpbSk7CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitjaGFyIF9Vc2VDb25zdFZvaWRQdHJTdG9yYWdlVHlwZShjb25zdCBfX2ZhbHNlX3R5cGUmIC8qUE9EKi8sIGNvbnN0IF9UcCYpOworY2hhciBfVXNlQ29uc3RWb2lkUHRyU3RvcmFnZVR5cGUoY29uc3QgX190cnVlX3R5cGUmIC8qUE9EKi8sIC4uLik7CitjaGFyKiBfVXNlQ29uc3RWb2lkUHRyU3RvcmFnZVR5cGUoY29uc3QgX190cnVlX3R5cGUmIC8qUE9EKi8sIF9Db25zdFZvaWRQb2ludGVyU2hpbSk7CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitjaGFyIF9Vc2VWb2xhdGlsZVZvaWRQdHJTdG9yYWdlVHlwZShjb25zdCBfX2ZhbHNlX3R5cGUmIC8qUE9EKi8sIGNvbnN0IF9UcCYpOworY2hhciBfVXNlVm9sYXRpbGVWb2lkUHRyU3RvcmFnZVR5cGUoY29uc3QgX190cnVlX3R5cGUmIC8qUE9EKi8sIC4uLik7CitjaGFyKiBfVXNlVm9sYXRpbGVWb2lkUHRyU3RvcmFnZVR5cGUoY29uc3QgX190cnVlX3R5cGUmIC8qUE9EKi8sIF9Wb2xhdGlsZVZvaWRQb2ludGVyU2hpbSk7CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitjaGFyIF9Vc2VDb25zdFZvbGF0aWxlVm9pZFB0clN0b3JhZ2VUeXBlKGNvbnN0IF9fZmFsc2VfdHlwZSYgLypQT0QqLywgY29uc3QgX1RwJik7CitjaGFyIF9Vc2VDb25zdFZvbGF0aWxlVm9pZFB0clN0b3JhZ2VUeXBlKGNvbnN0IF9fdHJ1ZV90eXBlJiAvKlBPRCovLCAuLi4pOworY2hhciogX1VzZUNvbnN0Vm9sYXRpbGVWb2lkUHRyU3RvcmFnZVR5cGUoY29uc3QgX190cnVlX3R5cGUmIC8qUE9EKi8sIF9Db25zdFZvbGF0aWxlVm9pZFBvaW50ZXJTaGltKTsKKworI2lmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pCisvKiBUaGFua3MgdG8gY2xhc3MgcGFydGlhbCBzcGVjaWFsaXphdGlvbiB0aGUgcG9pbnRlciBzcGVjaWFsaXphdGlvbiBmZWF0dXJlIGNhbiBldmVuIGJlIHVzZWQgaW4KKyAqIHByZXNlbmNlIG9mIGluY29tcGxldGUgdHlwZToKKyAqIHN0cnVjdCBNeVN0cnVjdCB7CisgKiAgIHR5cGVkZWYgdmVjdG9yPE15U3RydWN0PiBNeVN0cnVjdENvbnRhaW5lcjsKKyAqICAgdHlwZWRlZiBNeVN0cnVjdENvbnRhaW5lcjo6aXRlcmF0b3IgTXlTdHJ1Y3RJdGVyYXRvcjsKKyAqIH07CisgKi8KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfU3RvcmFnZVR5cGUgeworICB0eXBlZGVmIF9UcCBfUXVhbGlmaWVkVHlwZTsKKyAgdHlwZWRlZiBfVHAgX1R5cGU7CisgIGVudW0geyB1c2VfY29uc3Rfdm9sYXRpbGVfdm9pZF9wdHIgPSAwIH07Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9TdG9yYWdlVHlwZTxfVHAqPiB7CisgIC8vIEV2ZW4gaWYgd2UgZGV0ZWN0IGEgcG9pbnRlciB0eXBlIHdlIHVzZSBkaXNwYXRjaCBmdW5jdGlvbiB0byBjb25zaWRlciBpZiBpdCBjYW4gYmUgc3RvcmVkIGFzIGEgdm9pZCouCisgIC8vIEZvciBpbnN0YW5jZSBmdW5jdGlvbiBwb2ludGVyIG1pZ2h0IG5vdCBuZWNlc3NhcmlseSBiZSBjb252ZXJ0aWJsZSB0byB2b2lkKi4KKyAgZW51bSB7IHVzZV92b2lkX3B0ciA9IChzaXplb2YoX1VzZVZvaWRQdHJTdG9yYWdlVHlwZShfX3RydWVfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fU1RBVElDX0NBU1QoX1RwKiwgMCkpKSA9PSBzaXplb2YoY2hhciopKSB9OworICBlbnVtIHsgdXNlX2NvbnN0X3ZvbGF0aWxlX3ZvaWRfcHRyID0gdXNlX3ZvaWRfcHRyIH07CisgIHR5cGVkZWYgdHlwZW5hbWUgX19zZWxlY3Q8dXNlX3ZvaWRfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9UcCo+OjpfUmV0IF9RdWFsaWZpZWRUeXBlOworICB0eXBlZGVmIF9RdWFsaWZpZWRUeXBlIF9UeXBlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfU3RvcmFnZVR5cGU8X1RwIGNvbnN0Kj4geworICBlbnVtIHsgdXNlX3ZvaWRfcHRyID0gKHNpemVvZihfVXNlQ29uc3RWb2lkUHRyU3RvcmFnZVR5cGUoX190cnVlX3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fU1RBVElDX0NBU1QoY29uc3QgX1RwKiwgMCkpKSA9PSBzaXplb2YoY2hhciopKSB9OworICBlbnVtIHsgdXNlX2NvbnN0X3ZvbGF0aWxlX3ZvaWRfcHRyID0gdXNlX3ZvaWRfcHRyIH07CisgIHR5cGVkZWYgdHlwZW5hbWUgX19zZWxlY3Q8dXNlX3ZvaWRfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9UcCo+OjpfUmV0IF9RdWFsaWZpZWRUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9fc2VsZWN0PHVzZV92b2lkX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfVHAqPjo6X1JldCBfVHlwZTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX1N0b3JhZ2VUeXBlPF9UcCB2b2xhdGlsZSo+IHsKKyAgZW51bSB7IHVzZV92b2lkX3B0ciA9IChzaXplb2YoX1VzZVZvbGF0aWxlVm9pZFB0clN0b3JhZ2VUeXBlKF9fdHJ1ZV90eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX1NUQVRJQ19DQVNUKF9UcCB2b2xhdGlsZSosIDApKSkgPT0gc2l6ZW9mKGNoYXIqKSkgfTsKKyAgZW51bSB7IHVzZV9jb25zdF92b2xhdGlsZV92b2lkX3B0ciA9IHVzZV92b2lkX3B0ciB9OworICB0eXBlZGVmIHR5cGVuYW1lIF9fc2VsZWN0PHVzZV92b2lkX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2xhdGlsZSB2b2lkKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2xhdGlsZSBfVHAqPjo6X1JldCBfUXVhbGlmaWVkVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX3NlbGVjdDx1c2Vfdm9pZF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sYXRpbGUgX1RwKj46Ol9SZXQgX1R5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9TdG9yYWdlVHlwZTxfVHAgY29uc3Qgdm9sYXRpbGUqPiB7CisgIGVudW0geyB1c2Vfdm9pZF9wdHIgPSAoc2l6ZW9mKF9Vc2VDb25zdFZvbGF0aWxlVm9pZFB0clN0b3JhZ2VUeXBlKF9fdHJ1ZV90eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fU1RBVElDX0NBU1QoX1RwIGNvbnN0IHZvbGF0aWxlKiwgMCkpKSA9PSBzaXplb2YoY2hhciopKSB9OworICBlbnVtIHsgdXNlX2NvbnN0X3ZvbGF0aWxlX3ZvaWRfcHRyID0gdXNlX3ZvaWRfcHRyIH07CisgIHR5cGVkZWYgdHlwZW5hbWUgX19zZWxlY3Q8dXNlX3ZvaWRfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvbGF0aWxlIHZvaWQqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvbGF0aWxlIF9UcCo+OjpfUmV0IF9RdWFsaWZpZWRUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9fc2VsZWN0PHVzZV92b2lkX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2xhdGlsZSBfVHAqPjo6X1JldCBfVHlwZTsKK307CisjZWxzZQordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfU3RvcmFnZVR5cGUgeworICB0eXBlZGVmIHR5cGVuYW1lIF9fdHlwZV90cmFpdHM8X1RwPjo6aXNfUE9EX3R5cGUgX1BPRFR5cGU7CisKKyNpZiAhZGVmaW5lZCAoX19CT1JMQU5EQ19fKSB8fCAoX19CT1JMQU5EQ19fICE9IDB4NTYwKQorICBzdGF0aWMgX1RwIF9fbnVsbF9yZXAoKTsKKyNlbHNlCisgIHN0YXRpYyBfVHAgX19udWxsX3JlcDsKKyNlbmRpZgorICBlbnVtIHsgdXNlX3ZvaWRfcHRyID0gKHNpemVvZihfVXNlVm9pZFB0clN0b3JhZ2VUeXBlKF9QT0RUeXBlKCksIF9fbnVsbF9yZXAoKSkpID09IHNpemVvZihjaGFyKikpIH07CisgIGVudW0geyB1c2VfY29uc3Rfdm9pZF9wdHIgPSAoc2l6ZW9mKF9Vc2VDb25zdFZvaWRQdHJTdG9yYWdlVHlwZShfUE9EVHlwZSgpLCBfX251bGxfcmVwKCkpKSA9PSBzaXplb2YoY2hhciopKSB9OworICBlbnVtIHsgdXNlX3ZvbGF0aWxlX3ZvaWRfcHRyID0gKHNpemVvZihfVXNlVm9sYXRpbGVWb2lkUHRyU3RvcmFnZVR5cGUoX1BPRFR5cGUoKSwgX19udWxsX3JlcCgpKSkgPT0gc2l6ZW9mKGNoYXIqKSkgfTsKKyAgZW51bSB7IHVzZV9jb25zdF92b2xhdGlsZV92b2lkX3B0ciA9IChzaXplb2YoX1VzZUNvbnN0Vm9sYXRpbGVWb2lkUHRyU3RvcmFnZVR5cGUoX1BPRFR5cGUoKSwgX19udWxsX3JlcCgpKSkgPT0gc2l6ZW9mKGNoYXIqKSkgfTsKKworICB0eXBlZGVmIHR5cGVuYW1lIF9fc2VsZWN0PCF1c2VfY29uc3Rfdm9sYXRpbGVfdm9pZF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1RwLAorICAgICAgICAgIHR5cGVuYW1lIF9fc2VsZWN0PHVzZV92b2lkX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiwKKyAgICAgICAgICB0eXBlbmFtZSBfX3NlbGVjdDx1c2VfY29uc3Rfdm9pZF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCosCisgICAgICAgICAgdHlwZW5hbWUgX19zZWxlY3Q8dXNlX3ZvbGF0aWxlX3ZvaWRfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbGF0aWxlIHZvaWQqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvbGF0aWxlIHZvaWQqPjo6X1JldCA+OjpfUmV0ID46Ol9SZXQgPjo6X1JldCBfUXVhbGlmaWVkVHlwZTsKKworI2lmICFkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQorICAvKiBJZiB0aGUgY29tcGlsZXIgZG8gbm90IHN1cHBvcnQgdGhlIGl0ZXJhdG9yX3RyYWl0cyBzdHJ1Y3R1cmUgd2UgY2Fubm90IHdyYXAKKyAgICogaXRlcmF0b3JzIHBhc3MgdG8gY29udGFpbmVyIHRlbXBsYXRlIG1ldGhvZHMuIFRoZSBpdGVyYXRvciBkZXJlZmVyZW5jZWQgdmFsdWUKKyAgICogaGFzIHRvIGJlIHN0b3JhYmxlIHdpdGhvdXQgYW55IGNhc3QgaW4gdGhlIGNob3NlbiBzdG9yYWdlIHR5cGUuIFRvIGd1YXJhbnR5CisgICAqIHRoYXQgdGhlIHZvaWQgcG9pbnRlciBoYXMgdG8gYmUgY29ycmVjdGx5IHF1YWxpZmllZC4KKyAgICovCisgIHR5cGVkZWYgX1F1YWxpZmllZFR5cGUgX1R5cGU7CisjZWxzZQorICAvKiBXaXRoIGl0ZXJhdG9yX3RyYWl0cyB3ZSBjYW4gd3JhcCBwYXNzZWQgaXRlcmF0b3JzIGFuZCBtYWtlIHRoZSBuZWNlc3NhcnkgY2FzdHMuCisgICAqIFdlIGNhbiBhbHdheXMgdXNlIGEgc2ltcGxlIHZvaWQqIHN0b3JhZ2UgdHlwZToKKyAgICovCisgIHR5cGVkZWYgdHlwZW5hbWUgX19zZWxlY3Q8dXNlX2NvbnN0X3ZvbGF0aWxlX3ZvaWRfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9UcD46Ol9SZXQgX1R5cGU7CisjZW5kaWYKK307CisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmU+CitzdHJ1Y3QgX0Fzc29jU3RvcmFnZVR5cGVzIHsKKyAgdHlwZWRlZiBfU3RvcmFnZVR5cGU8X1RwPiBfU3RvcmFnZVR5cGVJbmZvOworICB0eXBlZGVmIHR5cGVuYW1lIF9TdG9yYWdlVHlwZUluZm86Ol9UeXBlIF9TVHlwZTsKKworICAvL1dlIG5lZWQgdG8gYWxzbyBjaGVjayB0aGF0IHRoZSBjb21wYXJpc29uIGZ1bmN0b3IgdXNlZCB0byBpbnN0YW5jaWF0ZSB0aGUgYXNzb2MgY29udGFpbmVyCisgIC8vaXMgdGhlIGRlZmF1bHQgU3RhbmRhcmQgbGVzcyBpbXBsZW1lbnRhdGlvbjoKKyAgZW51bSB7IHB0cl90eXBlID0gX1N0b3JhZ2VUeXBlSW5mbzo6dXNlX2NvbnN0X3ZvbGF0aWxlX3ZvaWRfcHRyIH07CisgIHR5cGVkZWYgdHlwZW5hbWUgX0lzU1RMcG9ydENsYXNzPF9Db21wYXJlPjo6X1JldCBfU1RMcG9ydExlc3M7CisgIGVudW0geyBpc19kZWZhdWx0X2xlc3MgPSBfX3R5cGUyYm9vbDxfU1RMcG9ydExlc3M+OjpfUmV0IH07CisgIHR5cGVkZWYgdHlwZW5hbWUgX19zZWxlY3Q8aXNfZGVmYXVsdF9sZXNzLCBfU1R5cGUsIF9UcD46Ol9SZXQgX0tleVN0b3JhZ2VUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9fc2VsZWN0PGlzX2RlZmF1bHRfbGVzcyAmJiBwdHJfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmluYXJ5UHJlZFdyYXBwZXI8X0tleVN0b3JhZ2VUeXBlLCBfVHAsIF9Db21wYXJlPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ29tcGFyZT46Ol9SZXQgX0NvbXBhcmVTdG9yYWdlVHlwZTsKK307CisKKworI2lmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pCisvKgorICogQmFzZSBzdHJ1Y3QgdG8gZGVhbCB3aXRoIHF1YWxpZmllcnMKKyAqLwordGVtcGxhdGUgPGNsYXNzIF9TdG9yYWdlVCwgY2xhc3MgX1F1YWxpZmllZFN0b3JhZ2VUPgorc3RydWN0IF9Wb2lkQ2FzdFRyYWl0c0F1eCB7CisgIHR5cGVkZWYgX1F1YWxpZmllZFN0b3JhZ2VUIHZvaWRfY3ZfdHlwZTsKKyAgdHlwZWRlZiBfU3RvcmFnZVQgdm9pZF90eXBlOworCisgIHN0YXRpYyB2b2lkX3R5cGUgKiB1bmN2X3B0cih2b2lkX2N2X3R5cGUgKl9fcHRyKQorICB7IHJldHVybiBfX3B0cjsgfQorICBzdGF0aWMgdm9pZF90eXBlIGNvbnN0KiB1bmN2X2NwdHIodm9pZF9jdl90eXBlIGNvbnN0Kl9fcHRyKQorICB7IHJldHVybiBfX3B0cjsgfQorICBzdGF0aWMgdm9pZF90eXBlICoqIHVuY3ZfcHB0cih2b2lkX2N2X3R5cGUgKipfX3B0cikKKyAgeyByZXR1cm4gX19wdHI7IH0KKyAgc3RhdGljIHZvaWRfdHlwZSAmIHVuY3ZfcmVmKHZvaWRfY3ZfdHlwZSAmIF9fcmVmKQorICB7IHJldHVybiBfX3JlZjsgfQorICBzdGF0aWMgdm9pZF90eXBlIGNvbnN0JiB1bmN2X2NyZWYodm9pZF9jdl90eXBlIGNvbnN0JiBfX3JlZikKKyAgeyByZXR1cm4gX19yZWY7IH0KKyAgc3RhdGljIHZvaWRfY3ZfdHlwZSogY3ZfcHRyKHZvaWRfdHlwZSAqX19wdHIpCisgIHsgcmV0dXJuIF9fcHRyOyB9CisgIHN0YXRpYyB2b2lkX2N2X3R5cGUgY29uc3QqIGN2X2NwdHIodm9pZF90eXBlIGNvbnN0Kl9fcHRyKQorICB7IHJldHVybiBfX3B0cjsgfQorICBzdGF0aWMgdm9pZF9jdl90eXBlICoqIGN2X3BwdHIodm9pZF90eXBlICoqX19wdHIpCisgIHsgcmV0dXJuIF9fcHRyOyB9CisgIHN0YXRpYyB2b2lkX2N2X3R5cGUgJiBjdl9yZWYodm9pZF90eXBlICYgX19yZWYpCisgIHsgcmV0dXJuIF9fcmVmOyB9CisgIHN0YXRpYyB2b2lkX2N2X3R5cGUgY29uc3QmIGN2X2NyZWYodm9pZF90eXBlIGNvbnN0JiBfX3JlZikKKyAgeyByZXR1cm4gX19yZWY7IH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVm9pZENWVHlwZT4KK3N0cnVjdCBfVm9pZENhc3RUcmFpdHNBdXhCYXNlIHsKKyAgdHlwZWRlZiBfVm9pZENWVHlwZSogdm9pZF9jdl90eXBlOworICB0eXBlZGVmIHZvaWQqIHZvaWRfdHlwZTsKKworICBzdGF0aWMgdm9pZF90eXBlKiB1bmN2X3B0cih2b2lkX2N2X3R5cGUgKl9fcHRyKQorICB7IHJldHVybiBfX0NPTlNUX0NBU1Qodm9pZF90eXBlKiwgX19wdHIpOyB9CisgIHN0YXRpYyB2b2lkX3R5cGUgY29uc3QqIHVuY3ZfY3B0cih2b2lkX2N2X3R5cGUgY29uc3QqX19wdHIpCisgIHsgcmV0dXJuIF9fQ09OU1RfQ0FTVCh2b2lkX3R5cGUgY29uc3QqLCBfX3B0cik7IH0KKyAgc3RhdGljIHZvaWRfdHlwZSoqIHVuY3ZfcHB0cih2b2lkX2N2X3R5cGUgKipfX3B0cikKKyAgeyByZXR1cm4gX19DT05TVF9DQVNUKHZvaWRfdHlwZSoqLCBfX3B0cik7IH0KKyAgc3RhdGljIHZvaWRfdHlwZSYgdW5jdl9yZWYodm9pZF9jdl90eXBlICZfX3JlZikKKyAgeyByZXR1cm4gX19DT05TVF9DQVNUKHZvaWRfdHlwZSYsIF9fcmVmKTsgfQorICBzdGF0aWMgdm9pZF90eXBlIGNvbnN0JiB1bmN2X2NyZWYodm9pZF9jdl90eXBlIGNvbnN0JiBfX3B0cikKKyAgeyByZXR1cm4gX19DT05TVF9DQVNUKHZvaWRfdHlwZSBjb25zdCYsIF9fcHRyKTsgfQorICAvLyBUaGUgcmV2ZXJzZSB2ZXJzaW9ucworICBzdGF0aWMgdm9pZF9jdl90eXBlICogY3ZfcHRyKHZvaWRfdHlwZSAqX19wdHIpCisgIHsgcmV0dXJuIF9fQ09OU1RfQ0FTVCh2b2lkX2N2X3R5cGUgKiwgX19wdHIpOyB9CisgIHN0YXRpYyB2b2lkX2N2X3R5cGUgY29uc3QqIGN2X2NwdHIodm9pZF90eXBlIGNvbnN0Kl9fcHRyKQorICB7IHJldHVybiBfX0NPTlNUX0NBU1Qodm9pZF9jdl90eXBlIGNvbnN0KiwgX19wdHIpOyB9CisgIHN0YXRpYyB2b2lkX2N2X3R5cGUgKiogY3ZfcHB0cih2b2lkX3R5cGUgKipfX3B0cikKKyAgeyByZXR1cm4gX19DT05TVF9DQVNUKHZvaWRfY3ZfdHlwZSoqLCBfX3B0cik7IH0KKyAgc3RhdGljIHZvaWRfY3ZfdHlwZSAmIGN2X3JlZih2b2lkX3R5cGUgJl9fcmVmKQorICB7IHJldHVybiBfX0NPTlNUX0NBU1Qodm9pZF9jdl90eXBlICYsIF9fcmVmKTsgfQorICBzdGF0aWMgdm9pZF9jdl90eXBlIGNvbnN0JiBjdl9jcmVmKHZvaWRfdHlwZSBjb25zdCYgX19yZWYpCisgIHsgcmV0dXJuIF9fQ09OU1RfQ0FTVCh2b2lkX2N2X3R5cGUgY29uc3QmLCBfX3JlZik7IH0KK307CisKK19TVExQX1RFTVBMQVRFX05VTEwKK3N0cnVjdCBfVm9pZENhc3RUcmFpdHNBdXg8dm9pZCosIGNvbnN0IHZvaWQqPiA6IF9Wb2lkQ2FzdFRyYWl0c0F1eEJhc2U8dm9pZCBjb25zdD4KK3t9OworX1NUTFBfVEVNUExBVEVfTlVMTAorc3RydWN0IF9Wb2lkQ2FzdFRyYWl0c0F1eDx2b2lkKiwgdm9sYXRpbGUgdm9pZCo+IDogX1ZvaWRDYXN0VHJhaXRzQXV4QmFzZTx2b2lkIHZvbGF0aWxlPgore307CitfU1RMUF9URU1QTEFURV9OVUxMCitzdHJ1Y3QgX1ZvaWRDYXN0VHJhaXRzQXV4PHZvaWQqLCBjb25zdCB2b2xhdGlsZSB2b2lkKj4gOiBfVm9pZENhc3RUcmFpdHNBdXhCYXNlPHZvaWQgY29uc3Qgdm9sYXRpbGU+Cit7fTsKKwordGVtcGxhdGUgPGNsYXNzIF9TdG9yYWdlVCwgY2xhc3MgX1ZhbHVlVD4KK3N0cnVjdCBfQ2FzdFRyYWl0cyB7CisgIHR5cGVkZWYgX1ZhbHVlVCB2YWx1ZV90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9TdG9yYWdlVHlwZTxfVmFsdWVUPjo6X1F1YWxpZmllZFR5cGUgX1F1YWxpZmllZFN0b3JhZ2VUOworICB0eXBlZGVmIF9Wb2lkQ2FzdFRyYWl0c0F1eDxfU3RvcmFnZVQsIF9RdWFsaWZpZWRTdG9yYWdlVD4gY3ZfdHJhaXRzOworICB0eXBlZGVmIHR5cGVuYW1lIGN2X3RyYWl0czo6dm9pZF90eXBlIHZvaWRfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBjdl90cmFpdHM6OnZvaWRfY3ZfdHlwZSB2b2lkX2N2X3R5cGU7CisKKyAgc3RhdGljIHZhbHVlX3R5cGUgKiB0b192YWx1ZV90eXBlX3B0cih2b2lkX3R5cGUgKl9fcHRyKQorICB7IHJldHVybiBfX1JFSU5URVJQUkVUX0NBU1QodmFsdWVfdHlwZSAqLCBjdl90cmFpdHM6OmN2X3B0cihfX3B0cikpOyB9CisgIHN0YXRpYyB2YWx1ZV90eXBlIGNvbnN0KiB0b192YWx1ZV90eXBlX2NwdHIodm9pZF90eXBlIGNvbnN0Kl9fcHRyKQorICB7IHJldHVybiBfX1JFSU5URVJQUkVUX0NBU1QodmFsdWVfdHlwZSBjb25zdCosIGN2X3RyYWl0czo6Y3ZfY3B0cihfX3B0cikpOyB9CisgIHN0YXRpYyB2YWx1ZV90eXBlICoqIHRvX3ZhbHVlX3R5cGVfcHB0cih2b2lkX3R5cGUgKipfX3B0cikKKyAgeyByZXR1cm4gX19SRUlOVEVSUFJFVF9DQVNUKHZhbHVlX3R5cGUgKiosIGN2X3RyYWl0czo6Y3ZfcHB0cihfX3B0cikpOyB9CisgIHN0YXRpYyB2YWx1ZV90eXBlICYgdG9fdmFsdWVfdHlwZV9yZWYodm9pZF90eXBlICZfX3JlZikKKyAgeyByZXR1cm4gX19SRUlOVEVSUFJFVF9DQVNUKHZhbHVlX3R5cGUgJiwgY3ZfdHJhaXRzOjpjdl9yZWYoX19yZWYpKTsgfQorICBzdGF0aWMgdmFsdWVfdHlwZSBjb25zdCYgdG9fdmFsdWVfdHlwZV9jcmVmKHZvaWRfdHlwZSBjb25zdCYgX19wdHIpCisgIHsgcmV0dXJuIF9fUkVJTlRFUlBSRVRfQ0FTVCh2YWx1ZV90eXBlIGNvbnN0JiwgY3ZfdHJhaXRzOjpjdl9jcmVmKF9fcHRyKSk7IH0KKyAgLy8gUmV2ZXJzZSB2ZXJzaW9ucworICBzdGF0aWMgdm9pZF90eXBlICogdG9fc3RvcmFnZV90eXBlX3B0cih2YWx1ZV90eXBlICpfX3B0cikKKyAgeyByZXR1cm4gY3ZfdHJhaXRzOjp1bmN2X3B0cihfX1JFSU5URVJQUkVUX0NBU1Qodm9pZF9jdl90eXBlICosIF9fcHRyKSk7IH0KKyAgc3RhdGljIHZvaWRfdHlwZSBjb25zdCogdG9fc3RvcmFnZV90eXBlX2NwdHIodmFsdWVfdHlwZSBjb25zdCpfX3B0cikKKyAgeyByZXR1cm4gY3ZfdHJhaXRzOjp1bmN2X2NwdHIoX19SRUlOVEVSUFJFVF9DQVNUKHZvaWRfY3ZfdHlwZSBjb25zdCosIF9fcHRyKSk7IH0KKyAgc3RhdGljIHZvaWRfdHlwZSAqKiB0b19zdG9yYWdlX3R5cGVfcHB0cih2YWx1ZV90eXBlICoqX19wdHIpCisgIHsgcmV0dXJuIGN2X3RyYWl0czo6dW5jdl9wcHRyKF9fUkVJTlRFUlBSRVRfQ0FTVCh2b2lkX2N2X3R5cGUgKiosIF9fcHRyKSk7IH0KKyAgc3RhdGljIHZvaWRfdHlwZSBjb25zdCYgdG9fc3RvcmFnZV90eXBlX2NyZWYodmFsdWVfdHlwZSBjb25zdCYgX19yZWYpCisgIHsgcmV0dXJuIGN2X3RyYWl0czo6dW5jdl9jcmVmKF9fUkVJTlRFUlBSRVRfQ0FTVCh2b2lkX2N2X3R5cGUgY29uc3QmLCBfX3JlZikpOyB9CisKKyAgLy9NZXRob2QgdXNlZCB0byB0cmVhdCBzZXQgY29udGFpbmVyIHRlbXBsYXRlIG1ldGhvZCBleHRlbnNpb24KKyAgc3RhdGljIHZvaWRfdHlwZSBjb25zdCYgdG9fc3RvcmFnZV90eXBlX2NyZWZUKHZhbHVlX3R5cGUgY29uc3QmIF9fcmVmKQorICB7IHJldHVybiB0b19zdG9yYWdlX3R5cGVfY3JlZihfX3JlZik7IH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX0Nhc3RUcmFpdHM8X1RwLCBfVHA+IHsKKyAgdHlwZWRlZiBfVHAgc3RvcmFnZV90eXBlOworICB0eXBlZGVmIF9UcCB2YWx1ZV90eXBlOworCisgIHN0YXRpYyB2YWx1ZV90eXBlICogdG9fdmFsdWVfdHlwZV9wdHIoc3RvcmFnZV90eXBlICpfX3B0cikKKyAgeyByZXR1cm4gX19wdHI7IH0KKyAgc3RhdGljIHZhbHVlX3R5cGUgY29uc3QqIHRvX3ZhbHVlX3R5cGVfY3B0cihzdG9yYWdlX3R5cGUgY29uc3QqX19wdHIpCisgIHsgcmV0dXJuIF9fcHRyOyB9CisgIHN0YXRpYyB2YWx1ZV90eXBlICoqIHRvX3ZhbHVlX3R5cGVfcHB0cihzdG9yYWdlX3R5cGUgKipfX3B0cikKKyAgeyByZXR1cm4gX19wdHI7IH0KKyAgc3RhdGljIHZhbHVlX3R5cGUgJiB0b192YWx1ZV90eXBlX3JlZihzdG9yYWdlX3R5cGUgJl9fcmVmKQorICB7IHJldHVybiBfX3JlZjsgfQorICBzdGF0aWMgdmFsdWVfdHlwZSBjb25zdCYgdG9fdmFsdWVfdHlwZV9jcmVmKHN0b3JhZ2VfdHlwZSBjb25zdCZfX3JlZikKKyAgeyByZXR1cm4gX19yZWY7IH0KKyAgLy8gUmV2ZXJzZSB2ZXJzaW9ucworICBzdGF0aWMgc3RvcmFnZV90eXBlICogdG9fc3RvcmFnZV90eXBlX3B0cih2YWx1ZV90eXBlICpfX3B0cikKKyAgeyByZXR1cm4gX19wdHI7IH0KKyAgc3RhdGljIHN0b3JhZ2VfdHlwZSBjb25zdCogdG9fc3RvcmFnZV90eXBlX2NwdHIodmFsdWVfdHlwZSBjb25zdCpfX3B0cikKKyAgeyByZXR1cm4gX19wdHI7IH0KKyAgc3RhdGljIHN0b3JhZ2VfdHlwZSAqKiB0b19zdG9yYWdlX3R5cGVfcHB0cih2YWx1ZV90eXBlICoqX19wdHIpCisgIHsgcmV0dXJuIF9fcHRyOyB9CisgIHN0YXRpYyBzdG9yYWdlX3R5cGUgY29uc3QmIHRvX3N0b3JhZ2VfdHlwZV9jcmVmKHZhbHVlX3R5cGUgY29uc3QmIF9fcmVmKQorICB7IHJldHVybiBfX3JlZjsgfQorCisgIC8vTWV0aG9kIHVzZWQgdG8gdHJlYXQgc2V0IGNvbnRhaW5lciB0ZW1wbGF0ZSBtZXRob2QgZXh0ZW5zaW9uCisgIHRlbXBsYXRlIDxjbGFzcyBfVHAxPgorICBzdGF0aWMgX1RwMSBjb25zdCYgdG9fc3RvcmFnZV90eXBlX2NyZWZUKF9UcDEgY29uc3QmIF9fcmVmKQorICB7IHJldHVybiBfX3JlZjsgfQorfTsKKworI2RlZmluZSBfU1RMUF9VU0VfSVRFUkFUT1JfV1JBUFBFUgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1N0b3JhZ2VULCBjbGFzcyBfVmFsdWVULCBjbGFzcyBfSXRlcmF0b3I+CitzdHJ1Y3QgX0l0ZVdyYXBwZXIgeworICB0eXBlZGVmIF9DYXN0VHJhaXRzPF9TdG9yYWdlVCwgX1ZhbHVlVD4gY2FzdF90cmFpdHM7CisgIHR5cGVkZWYgaXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcj4gX0l0ZVRyYWl0czsKKworICB0eXBlZGVmIHR5cGVuYW1lIF9JdGVUcmFpdHM6Oml0ZXJhdG9yX2NhdGVnb3J5IGl0ZXJhdG9yX2NhdGVnb3J5OworICB0eXBlZGVmIF9TdG9yYWdlVCB2YWx1ZV90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9JdGVUcmFpdHM6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisgIHR5cGVkZWYgdmFsdWVfdHlwZSogcG9pbnRlcjsKKyAgdHlwZWRlZiB2YWx1ZV90eXBlIGNvbnN0JiBjb25zdF9yZWZlcmVuY2U7CisgIC8vVGhpcyB3cmFwcGVyIHdvbid0IGJlIHVzZWQgZm9yIGlucHV0IHNvIHRvIGF2b2lkIHN1cnByaXNlCisgIC8vdGhlIHJlZmVyZW5jZSB0eXBlIHdpbGwgYmUgYSBjb25zdCByZWZlcmVuY2U6CisgIHR5cGVkZWYgY29uc3RfcmVmZXJlbmNlIHJlZmVyZW5jZTsKKworICB0eXBlZGVmIF9JdGVXcmFwcGVyPF9TdG9yYWdlVCwgX1ZhbHVlVCwgX0l0ZXJhdG9yPiBfU2VsZjsKKyAgdHlwZWRlZiBfU2VsZiBfSXRlOworCisgIF9JdGVXcmFwcGVyKF9JdGVyYXRvciAmX19pdGUpIDogX01faXRlKF9faXRlKSB7fQorCisgIGNvbnN0X3JlZmVyZW5jZSBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWYoKl9NX2l0ZSk7IH0KKworICBfU2VsZiYgb3BlcmF0b3I9IChfU2VsZiBjb25zdCYgX19yaHMpIHsKKyAgICBfTV9pdGUgPSBfX3Jocy5fTV9pdGU7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgX1NlbGYmIG9wZXJhdG9yKysoKSB7CisgICAgKytfTV9pdGU7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgX1NlbGYmIG9wZXJhdG9yLS0oKSB7CisgICAgLS1fTV9pdGU7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgX1NlbGYmIG9wZXJhdG9yICs9IChkaWZmZXJlbmNlX3R5cGUgX19vZmZzZXQpIHsKKyAgICBfTV9pdGUgKz0gX19vZmZzZXQ7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIGRpZmZlcmVuY2VfdHlwZSBvcGVyYXRvciAtKF9TZWxmIGNvbnN0JiBfX290aGVyKSBjb25zdAorICB7IHJldHVybiBfTV9pdGUgLSBfX290aGVyLl9NX2l0ZTsgfQorCisgIGJvb2wgb3BlcmF0b3IgPT0gKF9TZWxmIGNvbnN0JiBfX290aGVyKSBjb25zdAorICB7IHJldHVybiBfTV9pdGUgPT0gX19vdGhlci5fTV9pdGU7IH0KKworICBib29sIG9wZXJhdG9yICE9IChfU2VsZiBjb25zdCYgX19vdGhlcikgY29uc3QKKyAgeyByZXR1cm4gX01faXRlICE9IF9fb3RoZXIuX01faXRlOyB9CisKKyAgYm9vbCBvcGVyYXRvciA8IChfU2VsZiBjb25zdCYgX19yaHMpIGNvbnN0CisgIHsgcmV0dXJuIF9NX2l0ZSA8IF9fcmhzLl9NX2l0ZTsgfQorCitwcml2YXRlOgorICBfSXRlcmF0b3IgX01faXRlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0l0ZXJhdG9yPgorc3RydWN0IF9JdGVXcmFwcGVyPF9UcCwgX1RwLCBfSXRlcmF0b3I+Cit7IHR5cGVkZWYgX0l0ZXJhdG9yIF9JdGU7IH07CisKKyNlbHNlCisKKy8qCisgKiBJbiB0aGlzIGNvbmZpZyB0aGUgc3RvcmFnZSB0eXBlIGlzIHF1YWxpZmllZCBpbiByZXNwZWN0IG9mIHRoZQorICogdmFsdWVfdHlwZSBxdWFsaWZpY2F0aW9uLiBTaW1wbGUgcmVpbnRlcnByZXRfY2FzdCBpcyBlbm91Z2guCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBfU3RvcmFnZVQsIGNsYXNzIF9WYWx1ZVQ+CitzdHJ1Y3QgX0Nhc3RUcmFpdHMgeworICB0eXBlZGVmIF9TdG9yYWdlVCBzdG9yYWdlX3R5cGU7CisgIHR5cGVkZWYgX1ZhbHVlVCB2YWx1ZV90eXBlOworCisgIHN0YXRpYyB2YWx1ZV90eXBlICogdG9fdmFsdWVfdHlwZV9wdHIoc3RvcmFnZV90eXBlICpfX3B0cikKKyAgeyByZXR1cm4gX19SRUlOVEVSUFJFVF9DQVNUKHZhbHVlX3R5cGUqLCBfX3B0cik7IH0KKyAgc3RhdGljIHZhbHVlX3R5cGUgY29uc3QqIHRvX3ZhbHVlX3R5cGVfY3B0cihzdG9yYWdlX3R5cGUgY29uc3QqX19wdHIpCisgIHsgcmV0dXJuIF9fUkVJTlRFUlBSRVRfQ0FTVCh2YWx1ZV90eXBlIGNvbnN0KiwgX19wdHIpOyB9CisgIHN0YXRpYyB2YWx1ZV90eXBlICoqIHRvX3ZhbHVlX3R5cGVfcHB0cihzdG9yYWdlX3R5cGUgKipfX3B0cikKKyAgeyByZXR1cm4gX19SRUlOVEVSUFJFVF9DQVNUKHZhbHVlX3R5cGUgKiosIF9fcHRyKTsgfQorICBzdGF0aWMgdmFsdWVfdHlwZSAmIHRvX3ZhbHVlX3R5cGVfcmVmKHN0b3JhZ2VfdHlwZSAmX19yZWYpCisgIHsgcmV0dXJuIF9fUkVJTlRFUlBSRVRfQ0FTVCh2YWx1ZV90eXBlJiwgX19yZWYpOyB9CisgIHN0YXRpYyB2YWx1ZV90eXBlIGNvbnN0JiB0b192YWx1ZV90eXBlX2NyZWYoc3RvcmFnZV90eXBlIGNvbnN0Jl9fcmVmKQorICB7IHJldHVybiBfX1JFSU5URVJQUkVUX0NBU1QodmFsdWVfdHlwZSBjb25zdCYsIF9fcmVmKTsgfQorICAvLyBSZXZlcnNlIHZlcnNpb25zCisgIHN0YXRpYyBzdG9yYWdlX3R5cGUgKiB0b19zdG9yYWdlX3R5cGVfcHRyKHZhbHVlX3R5cGUgKl9fcHRyKQorICB7IHJldHVybiBfX1JFSU5URVJQUkVUX0NBU1Qoc3RvcmFnZV90eXBlKiwgX19wdHIpOyB9CisgIHN0YXRpYyBzdG9yYWdlX3R5cGUgY29uc3QqIHRvX3N0b3JhZ2VfdHlwZV9jcHRyKHZhbHVlX3R5cGUgY29uc3QqX19wdHIpCisgIHsgcmV0dXJuIF9fUkVJTlRFUlBSRVRfQ0FTVChzdG9yYWdlX3R5cGUgY29uc3QqLCBfX3B0cik7IH0KKyAgc3RhdGljIHN0b3JhZ2VfdHlwZSAqKiB0b19zdG9yYWdlX3R5cGVfcHB0cih2YWx1ZV90eXBlICoqX19wdHIpCisgIHsgcmV0dXJuIF9fUkVJTlRFUlBSRVRfQ0FTVChzdG9yYWdlX3R5cGUgKiosIF9fcHRyKTsgfQorICBzdGF0aWMgc3RvcmFnZV90eXBlIGNvbnN0JiB0b19zdG9yYWdlX3R5cGVfY3JlZih2YWx1ZV90eXBlIGNvbnN0Jl9fcmVmKQorICB7IHJldHVybiBfX1JFSU5URVJQUkVUX0NBU1Qoc3RvcmFnZV90eXBlIGNvbnN0JiwgX19yZWYpOyB9CisgIHRlbXBsYXRlIDxjbGFzcyBfVHAxPgorICBzdGF0aWMgX1RwMSBjb25zdCYgdG9fc3RvcmFnZV90eXBlX2NyZWZUKF9UcDEgY29uc3QmIF9fcmVmKQorICB7IHJldHVybiBfX3JlZjsgfQorfTsKKworI2VuZGlmCisKKy8vV3JhcHBlciBmdW5jdG9yczoKK3RlbXBsYXRlIDxjbGFzcyBfU3RvcmFnZVQsIGNsYXNzIF9WYWx1ZVQsIGNsYXNzIF9VbmFyeVByZWRpY2F0ZT4KK3N0cnVjdCBfVW5hcnlQcmVkV3JhcHBlciB7CisgIHR5cGVkZWYgX0Nhc3RUcmFpdHM8X1N0b3JhZ2VULCBfVmFsdWVUPiBjYXN0X3RyYWl0czsKKworICBfVW5hcnlQcmVkV3JhcHBlciAoX1VuYXJ5UHJlZGljYXRlIGNvbnN0JiBfX3ByZWQpIDogX01fcHJlZChfX3ByZWQpIHt9CisKKyAgYm9vbCBvcGVyYXRvciAoKSAoX1N0b3JhZ2VUIGNvbnN0JiBfX3JlZikgY29uc3QKKyAgeyByZXR1cm4gX01fcHJlZChjYXN0X3RyYWl0czo6dG9fdmFsdWVfdHlwZV9jcmVmKF9fcmVmKSk7IH0KKworcHJpdmF0ZToKKyAgX1VuYXJ5UHJlZGljYXRlIF9NX3ByZWQ7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1N0b3JhZ2VULCBjbGFzcyBfVmFsdWVULCBjbGFzcyBfQmluYXJ5UHJlZGljYXRlPgorc3RydWN0IF9CaW5hcnlQcmVkV3JhcHBlciB7CisgIHR5cGVkZWYgX0Nhc3RUcmFpdHM8X1N0b3JhZ2VULCBfVmFsdWVUPiBjYXN0X3RyYWl0czsKKworICBfQmluYXJ5UHJlZFdyYXBwZXIgKCkge30KKyAgX0JpbmFyeVByZWRXcmFwcGVyIChfQmluYXJ5UHJlZGljYXRlIGNvbnN0JiBfX3ByZWQpIDogX01fcHJlZChfX3ByZWQpIHt9CisKKyAgX0JpbmFyeVByZWRpY2F0ZSBnZXRfcHJlZCgpIGNvbnN0IHsgcmV0dXJuIF9NX3ByZWQ7IH0KKworICBib29sIG9wZXJhdG9yICgpIChfU3RvcmFnZVQgY29uc3QmIF9fZnN0LCBfU3RvcmFnZVQgY29uc3QmIF9fc25kKSBjb25zdAorICB7IHJldHVybiBfTV9wcmVkKGNhc3RfdHJhaXRzOjp0b192YWx1ZV90eXBlX2NyZWYoX19mc3QpLCBjYXN0X3RyYWl0czo6dG9fdmFsdWVfdHlwZV9jcmVmKF9fc25kKSk7IH0KKworICAvL0Nhc3Qgb3BlcmF0b3IgdXNlZCB0byB0cmFuc3BhcmVudGx5IGFjY2VzcyB1bmRlcmx5aW5nIHByZWRpY2F0ZQorICAvL2luIHNldDo6a2V5X2NvbXAoKSBtZXRob2QKKyAgb3BlcmF0b3IgX0JpbmFyeVByZWRpY2F0ZSgpIGNvbnN0CisgIHsgcmV0dXJuIF9NX3ByZWQ7IH0KKworcHJpdmF0ZToKKyAgX0JpbmFyeVByZWRpY2F0ZSBfTV9wcmVkOworfTsKKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2VuZGlmIC8qIF9TVExQX1BPSU5URVJTX1NQRUNfVE9PTFNfSCAqLwpkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdGwvcG9pbnRlcnMvX3ZlY3Rvci5oIGIvc3RscG9ydC9zdGwvcG9pbnRlcnMvX3ZlY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NzA1YmYKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC9wb2ludGVycy9fdmVjdG9yLmgKQEAgLTAsMCArMSwyNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMKKyAqIEZyYW5jb2lzIER1bW9udAorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisvKiBOT1RFOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBTVEwgaGVhZGVycy4KKyAqICAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuCisgKi8KKworI2lmbmRlZiBfU1RMUF9TUEVDSUFMSVpFRF9WRUNUT1JfSAorI2RlZmluZSBfU1RMUF9TUEVDSUFMSVpFRF9WRUNUT1JfSAorCisjaWZuZGVmIF9TVExQX1BPSU5URVJTX1NQRUNfVE9PTFNfSAorIyAgaW5jbHVkZSA8c3RsL3BvaW50ZXJzL190b29scy5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisjZGVmaW5lIFZFQ1RPUl9JTVBMIF9TVExQX1BUUl9JTVBMX05BTUUodmVjdG9yKQorCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCkgJiYgIWRlZmluZWQgKF9TVExQX1VTRV9NU1ZDNl9NRU1fVF9CVUdfV09SS0FST1VORCkKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBfU1RMUF9QUklWIF9WZWN0b3JfYmFzZTx2b2lkKixhbGxvY2F0b3I8dm9pZCo+ID47CitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgX1NUTFBfUFJJViBWRUNUT1JfSU1QTDx2b2lkKiwgYWxsb2NhdG9yPHZvaWQqPiA+OworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9ERUJVRykKKyMgIGRlZmluZSB2ZWN0b3IgX1NUTFBfTk9OX0RCR19OQU1FKHZlY3RvcikKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBfU1RMUF9ERkxfVE1QTF9QQVJBTShfQWxsb2MsIGFsbG9jYXRvcjxfVHA+KSA+CitjbGFzcyB2ZWN0b3IKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUEFSVElBTF9TUEVDX1dPUktBUk9VTkQpICYmICFkZWZpbmVkICh2ZWN0b3IpCisgICAgICAgICAgICAgOiBwdWJsaWMgX19zdGxwb3J0X2NsYXNzPHZlY3RvcjxfVHAsIF9BbGxvYz4gPgorI2VuZGlmCit7CisgIC8qIEluIHRoZSB2ZWN0b3IgaW1wbGVtZW50YXRpb24gaXRlcmF0b3JzIGFyZSBwb2ludGVyIHdoaWNoIGdpdmUgYSBudW1iZXIKKyAgICogb2Ygb3Bwb3J0dW5pdGllcyBmb3Igb3B0aW1pemF0aW9uLiBUbyBub3QgYnJlYWsgdGhvc2Ugb3B0aW1pemF0aW9ucworICAgKiBpdGVyYXRvcnMgcGFzc2VkIHRvIHRlbXBsYXRlIHNob3VsZCBub3QgYmUgd3JhcHBlZCBmb3IgY2FzdGluZyBwdXJwb3NlLgorICAgKiBTbyB2ZWN0b3IgaW1wbGVtZW50YXRpb24gd2lsbCBhbHdheXMgdXNlIGEgcXVhbGlmaWVkIHZvaWQgcG9pbnRlciB0eXBlIGFuZAorICAgKiB3b24ndCB1c2UgaXRlcmF0b3Igd3JhcHBpbmcuCisgICAqLworICB0eXBlZGVmIF9TVExQX1RZUEVOQU1FIF9TVExQX1BSSVYgX1N0b3JhZ2VUeXBlPF9UcD46Ol9RdWFsaWZpZWRUeXBlIF9TdG9yYWdlVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2NfdHJhaXRzPF9TdG9yYWdlVHlwZSwgX0FsbG9jPjo6YWxsb2NhdG9yX3R5cGUgX1N0b3JhZ2VUeXBlQWxsb2M7CisgIHR5cGVkZWYgX1NUTFBfUFJJViBWRUNUT1JfSU1QTDxfU3RvcmFnZVR5cGUsIF9TdG9yYWdlVHlwZUFsbG9jPiBfQmFzZTsKKyAgdHlwZWRlZiB2ZWN0b3I8X1RwLCBfQWxsb2M+IF9TZWxmOworCisgIHR5cGVkZWYgX1NUTFBfUFJJViBfQ2FzdFRyYWl0czxfU3RvcmFnZVR5cGUsIF9UcD4gY2FzdF90cmFpdHM7CisKK3B1YmxpYzoKKyAgdHlwZWRlZiBfVHAgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiB2YWx1ZV90eXBlKiBwb2ludGVyOworICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUqIGNvbnN0X3BvaW50ZXI7CisgIHR5cGVkZWYgdmFsdWVfdHlwZSogaXRlcmF0b3I7CisgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSogY29uc3RfaXRlcmF0b3I7CisgIHR5cGVkZWYgdmFsdWVfdHlwZSYgcmVmZXJlbmNlOworICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmIGNvbnN0X3JlZmVyZW5jZTsKKyAgdHlwZWRlZiBzaXplX3Qgc2l6ZV90eXBlOworICB0eXBlZGVmIHB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7CisgIHR5cGVkZWYgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgX0l0ZXJhdG9yX2NhdGVnb3J5OworCisgIF9TVExQX0RFQ0xBUkVfUkFORE9NX0FDQ0VTU19SRVZFUlNFX0lURVJBVE9SUzsKKyAgX1NUTFBfRk9SQ0VfQUxMT0NBVE9SUyh2YWx1ZV90eXBlLCBfQWxsb2MpCisgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jX3RyYWl0czx2YWx1ZV90eXBlLCBfQWxsb2M+OjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKKworICBhbGxvY2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9yKCkgY29uc3QKKyAgeyByZXR1cm4gX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoX01faW1wbC5nZXRfYWxsb2NhdG9yKCksIHZhbHVlX3R5cGUpOyB9CisKKyAgaXRlcmF0b3IgYmVnaW4oKSAgICAgICAgICAgICB7IHJldHVybiBjYXN0X3RyYWl0czo6dG9fdmFsdWVfdHlwZV9wdHIoX01faW1wbC5iZWdpbigpKTsgfQorICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGNhc3RfdHJhaXRzOjp0b192YWx1ZV90eXBlX2NwdHIoX01faW1wbC5iZWdpbigpKTsgfQorICBpdGVyYXRvciBlbmQoKSAgICAgICAgICAgICAgIHsgcmV0dXJuIGNhc3RfdHJhaXRzOjp0b192YWx1ZV90eXBlX3B0cihfTV9pbXBsLmVuZCgpKTsgfQorICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCAgIHsgcmV0dXJuIGNhc3RfdHJhaXRzOjp0b192YWx1ZV90eXBlX2NwdHIoX01faW1wbC5lbmQoKSk7IH0KKworICByZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpICAgICAgICAgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0ICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorICByZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSAgICAgICAgICAgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0ICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKworICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0ICAgICAgICB7IHJldHVybiBfTV9pbXBsLnNpemUoKTsgfQorICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCAgICB7IHJldHVybiBfTV9pbXBsLm1heF9zaXplKCk7IH0KKworICBzaXplX3R5cGUgY2FwYWNpdHkoKSBjb25zdCAgICB7IHJldHVybiBfTV9pbXBsLmNhcGFjaXR5KCk7IH0KKyAgYm9vbCBlbXB0eSgpIGNvbnN0ICAgICAgICAgICAgeyByZXR1cm4gX01faW1wbC5lbXB0eSgpOyB9CisKKyAgcmVmZXJlbmNlIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fbikgeyByZXR1cm4gY2FzdF90cmFpdHM6OnRvX3ZhbHVlX3R5cGVfcmVmKF9NX2ltcGxbX19uXSk7IH0KKyAgY29uc3RfcmVmZXJlbmNlIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fbikgY29uc3QgeyByZXR1cm4gY2FzdF90cmFpdHM6OnRvX3ZhbHVlX3R5cGVfY3JlZihfTV9pbXBsW19fbl0pOyB9CisKKyAgcmVmZXJlbmNlIGZyb250KCkgICAgICAgICAgICAgeyByZXR1cm4gY2FzdF90cmFpdHM6OnRvX3ZhbHVlX3R5cGVfcmVmKF9NX2ltcGwuZnJvbnQoKSk7IH0KKyAgY29uc3RfcmVmZXJlbmNlIGZyb250KCkgY29uc3QgeyByZXR1cm4gY2FzdF90cmFpdHM6OnRvX3ZhbHVlX3R5cGVfY3JlZihfTV9pbXBsLmZyb250KCkpOyB9CisgIHJlZmVyZW5jZSBiYWNrKCkgICAgICAgICAgICAgIHsgcmV0dXJuIGNhc3RfdHJhaXRzOjp0b192YWx1ZV90eXBlX3JlZihfTV9pbXBsLmJhY2soKSk7IH0KKyAgY29uc3RfcmVmZXJlbmNlIGJhY2soKSBjb25zdCAgeyByZXR1cm4gY2FzdF90cmFpdHM6OnRvX3ZhbHVlX3R5cGVfY3JlZihfTV9pbXBsLmJhY2soKSk7IH0KKworICByZWZlcmVuY2UgYXQoc2l6ZV90eXBlIF9fbikgeyByZXR1cm4gY2FzdF90cmFpdHM6OnRvX3ZhbHVlX3R5cGVfcmVmKF9NX2ltcGwuYXQoX19uKSk7IH0KKyAgY29uc3RfcmVmZXJlbmNlIGF0KHNpemVfdHlwZSBfX24pIGNvbnN0IHsgcmV0dXJuIGNhc3RfdHJhaXRzOjp0b192YWx1ZV90eXBlX2NyZWYoX01faW1wbC5hdChfX24pKTsgfQorCisgIGV4cGxpY2l0IHZlY3Rvcihjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9NX2ltcGwoX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoX19hLCBfU3RvcmFnZVR5cGUpKSB7fQorCisjaWYgIWRlZmluZWQoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKKyAgZXhwbGljaXQgdmVjdG9yKHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9fdmFsID0gX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRCh2YWx1ZV90eXBlKSwKKyNlbHNlCisgIHZlY3RvcihzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ZhbCwKKyNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0qLworICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfTV9pbXBsKF9fbiwgY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcmVmKF9fdmFsKSwKKyAgICAgIF9TVExQX0NPTlZFUlRfQUxMT0NBVE9SKF9fYSwgX1N0b3JhZ2VUeXBlKSkge30KKworI2lmIGRlZmluZWQoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKKyAgZXhwbGljaXQgdmVjdG9yKHNpemVfdHlwZSBfX24pCisgICAgOiBfTV9pbXBsKF9fbiwgYWxsb2NhdG9yX3R5cGUoKSApIHt9CisjZW5kaWYKKworICB2ZWN0b3IoY29uc3QgX1NlbGYmIF9feCkKKyAgICA6IF9NX2ltcGwoX194Ll9NX2ltcGwpIHt9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKKyAgZXhwbGljaXQgdmVjdG9yKF9fbW92ZV9zb3VyY2U8X1NlbGY+IHNyYykKKyAgICA6IF9NX2ltcGwoX19tb3ZlX3NvdXJjZTxfQmFzZT4oc3JjLmdldCgpLl9NX2ltcGwpKSB7fQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZlY3RvcihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hIF9TVExQX0FMTE9DQVRPUl9UWVBFX0RGTCApCisgIDogX01faW1wbChfX2ZpcnN0LCBfX2xhc3QsCisgICAgICAgICAgICBfU1RMUF9DT05WRVJUX0FMTE9DQVRPUihfX2EsIF9TdG9yYWdlVHlwZSkpIHt9CisKKyMgIGlmIGRlZmluZWQgKF9TVExQX05FRURTX0VYVFJBX1RFTVBMQVRFX0NPTlNUUlVDVE9SUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICB2ZWN0b3IoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgIDogX01faW1wbChfX2ZpcnN0LCBfX2xhc3QpIHt9CisjICBlbmRpZgorCisjZWxzZQorICB2ZWN0b3IoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfTV9pbXBsKGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3B0cihfX2ZpcnN0KSwgY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcHRyKF9fbGFzdCksCisgICAgICAgICAgICAgIF9TVExQX0NPTlZFUlRfQUxMT0NBVE9SKF9fYSwgX1N0b3JhZ2VUeXBlKSkge30KKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisKKyAgX1NlbGYmIG9wZXJhdG9yPShjb25zdCBfU2VsZiYgX194KSB7IF9NX2ltcGwgPSBfX3guX01faW1wbDsgcmV0dXJuICp0aGlzOyB9CisKKyAgdm9pZCByZXNlcnZlKHNpemVfdHlwZSBfX24pIHtfTV9pbXBsLnJlc2VydmUoX19uKTt9CisgIHZvaWQgYXNzaWduKHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9fdmFsKQorICB7IF9NX2ltcGwuYXNzaWduKF9fbiwgY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcmVmKF9fdmFsKSk7IH0KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgdm9pZCBhc3NpZ24oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICB7IF9NX2ltcGwuYXNzaWduKF9fZmlyc3QsIF9fbGFzdCk7IH0KKyNlbHNlCisgIHZvaWQgYXNzaWduKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkgeworICAgIF9NX2ltcGwuYXNzaWduKGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3B0cihfX2ZpcnN0KSwKKyAgICAgICAgICAgICAgICAgICBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NwdHIoX19sYXN0KSk7CisgIH0KKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisKKyNpZiAhZGVmaW5lZChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKSAmJiAhZGVmaW5lZChfU1RMUF9OT19BTkFDSFJPTklTTVMpCisgIHZvaWQgcHVzaF9iYWNrKGNvbnN0IHZhbHVlX3R5cGUmIF9feCA9IF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQodmFsdWVfdHlwZSkpCisjZWxzZQorICB2b2lkIHB1c2hfYmFjayhjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisjZW5kaWYgLyohX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSAmJiAhX1NUTFBfTk9fQU5BQ0hST05JU01TKi8KKyAgeyBfTV9pbXBsLnB1c2hfYmFjayhjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWYoX194KSk7IH0KKworI2lmICFkZWZpbmVkKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pICYmICFkZWZpbmVkKF9TVExQX05PX0FOQUNIUk9OSVNNUykKKyAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ggPSBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKHZhbHVlX3R5cGUpKQorI2Vsc2UKKyAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisjZW5kaWYgLyohX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSAmJiAhX1NUTFBfTk9fQU5BQ0hST05JU01TKi8KKyAgeyByZXR1cm4gY2FzdF90cmFpdHM6OnRvX3ZhbHVlX3R5cGVfcHRyKF9NX2ltcGwuaW5zZXJ0KGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfcHRyKF9fcG9zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3JlZihfX3gpKSk7IH0KKworI2lmIGRlZmluZWQoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkgJiYgIWRlZmluZWQoX1NUTFBfTk9fQU5BQ0hST05JU01TKQorICB2b2lkIHB1c2hfYmFjaygpIHsgX01faW1wbC5wdXNoX2JhY2soKTsgfQorICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgX19wb3MpCisgIHsgcmV0dXJuIF9NX2ltcGwuaW5zZXJ0KGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfcHRyKF9fcG9zKSk7IH0KKyNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0gJiYgIV9TVExQX05PX0FOQUNIUk9OSVNNUyovCisKKyAgdm9pZCBzd2FwKF9TZWxmJiBfX3gpIHsgX01faW1wbC5zd2FwKF9feC5fTV9pbXBsKTsgfQorI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QQVJUSUFMX1NQRUNfV09SS0FST1VORCkgJiYgIWRlZmluZWQgKF9TVExQX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUikKKyAgdm9pZCBfTV9zd2FwX3dvcmthcm91bmQoX1NlbGYmIF9feCkgeyBzd2FwKF9feCk7IH0KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICB2b2lkIGluc2VydChpdGVyYXRvciBfX3BvcywgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICB7IF9NX2ltcGwuaW5zZXJ0KGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfcHRyKF9fcG9zKSwgX19maXJzdCwgX19sYXN0KTsgfQorI2Vsc2UKKyAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkgeworICAgIF9NX2ltcGwuaW5zZXJ0KGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfcHRyKF9fcG9zKSwgY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcHRyKF9fZmlyc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcHRyKF9fbGFzdCkpOworICB9CisjZW5kaWYKKworICB2b2lkIGluc2VydCAoaXRlcmF0b3IgX19wb3MsIHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkgeworICAgIF9NX2ltcGwuaW5zZXJ0KGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfcHRyKF9fcG9zKSwgX19uLCBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWYoX194KSk7CisgIH0KKworICB2b2lkIHBvcF9iYWNrKCkge19NX2ltcGwucG9wX2JhY2soKTt9CisgIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIF9fcG9zKQorICB7cmV0dXJuIGNhc3RfdHJhaXRzOjp0b192YWx1ZV90eXBlX3B0cihfTV9pbXBsLmVyYXNlKGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfcHRyKF9fcG9zKSkpO30KKyAgaXRlcmF0b3IgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KSB7CisgICAgcmV0dXJuIGNhc3RfdHJhaXRzOjp0b192YWx1ZV90eXBlX3B0cihfTV9pbXBsLmVyYXNlKGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfcHRyKF9fZmlyc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX3B0cihfX2xhc3QpKSk7CisgIH0KKworI2lmICFkZWZpbmVkKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCisgIHZvaWQgcmVzaXplKHNpemVfdHlwZSBfX25ld19zaXplLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ggPSBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKHZhbHVlX3R5cGUpKQorI2Vsc2UKKyAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9fbmV3X3NpemUsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0qLworICB7IF9NX2ltcGwucmVzaXplKF9fbmV3X3NpemUsIGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3JlZihfX3gpKTsgfQorCisjaWYgZGVmaW5lZChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgX19uZXdfc2l6ZSkgeyBfTV9pbXBsLnJlc2l6ZShfX25ld19zaXplKTsgfQorI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCisKKyAgdm9pZCBjbGVhcigpIHsgX01faW1wbC5jbGVhcigpOyB9CisKK3ByaXZhdGU6CisgIF9CYXNlIF9NX2ltcGw7Cit9OworCisjaWYgZGVmaW5lZCAodmVjdG9yKQorIyAgdW5kZWYgdmVjdG9yCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKyNlbmRpZgorCisjdW5kZWYgVkVDVE9SX0lNUEwKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLyogX1NUTFBfU1BFQ0lBTElaRURfVkVDVE9SX0ggKi8KZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL3R5cGVfbWFuaXBzLmggYi9zdGxwb3J0L3N0bC90eXBlX21hbmlwcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMGI1OWQKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC90eXBlX21hbmlwcy5oCkBAIC0wLDAgKzEsMzIxIEBACisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMworICogRnJhbmNvaXMgRHVtb250CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKworI2lmbmRlZiBfU1RMUF9UWVBFX01BTklQU19ICisjZGVmaW5lIF9TVExQX1RZUEVfTUFOSVBTX0gKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKK3N0cnVjdCBfX3RydWVfdHlwZSB7fTsKK3N0cnVjdCBfX2ZhbHNlX3R5cGUge307CisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfTkFNRVNQQUNFUykgJiYgIWRlZmluZWQgKF9TVExQX0RPTlRfVVNFX1BSSVZfTkFNRVNQQUNFKQorX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQordXNpbmcgX1NUTFBfU1REOjpfX3RydWVfdHlwZTsKK3VzaW5nIF9TVExQX1NURDo6X19mYWxzZV90eXBlOworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisjZW5kaWYKKworLy9ib29sIHRvIHR5cGUKK3RlbXBsYXRlIDxpbnQgX0lzPgorc3RydWN0IF9fYm9vbDJ0eXBlCit7IHR5cGVkZWYgX190cnVlX3R5cGUgX1JldDsgfTsKKworX1NUTFBfVEVNUExBVEVfTlVMTAorc3RydWN0IF9fYm9vbDJ0eXBlPDE+IHsgdHlwZWRlZiBfX3RydWVfdHlwZSBfUmV0OyB9OworCitfU1RMUF9URU1QTEFURV9OVUxMCitzdHJ1Y3QgX19ib29sMnR5cGU8MD4geyB0eXBlZGVmIF9fZmFsc2VfdHlwZSBfUmV0OyB9OworCisvL3R5cGUgdG8gYm9vbAordGVtcGxhdGUgPGNsYXNzIF9fYm9vbF90eXBlPgorc3RydWN0IF9fdHlwZTJib29sIHsgZW51bSB7X1JldCA9IDF9OyB9OworCitfU1RMUF9URU1QTEFURV9OVUxMCitzdHJ1Y3QgX190eXBlMmJvb2w8X190cnVlX3R5cGU+IHsgZW51bSB7X1JldCA9IDF9OyB9OworCitfU1RMUF9URU1QTEFURV9OVUxMCitzdHJ1Y3QgX190eXBlMmJvb2w8X19mYWxzZV90eXBlPiB7IGVudW0ge19SZXQgPSAwfTsgfTsKKworLy9OZWdhdGlvbgordGVtcGxhdGUgPGNsYXNzIF9Cb29sVHlwZT4KK3N0cnVjdCBfTm90IHsgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgX1JldDsgfTsKKworX1NUTFBfVEVNUExBVEVfTlVMTAorc3RydWN0IF9Ob3Q8X19mYWxzZV90eXBlPiB7IHR5cGVkZWYgX190cnVlX3R5cGUgX1JldDsgfTsKKworLy8gbG9naWNhbCBhbmQgb2YgMiBwcmVkaWNhdGVkCit0ZW1wbGF0ZSA8Y2xhc3MgX1AxLCBjbGFzcyBfUDI+CitzdHJ1Y3QgX0xhbmQyIHsgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgX1JldDsgfTsKKworX1NUTFBfVEVNUExBVEVfTlVMTAorc3RydWN0IF9MYW5kMjxfX3RydWVfdHlwZSwgX190cnVlX3R5cGU+IHsgdHlwZWRlZiBfX3RydWVfdHlwZSBfUmV0OyB9OworCisvLyBsb2dpY2FsIGFuZCBvZiAzIHByZWRpY2F0ZWQKK3RlbXBsYXRlIDxjbGFzcyBfUDEsIGNsYXNzIF9QMiwgY2xhc3MgX1AzPgorc3RydWN0IF9MYW5kMyB7IHR5cGVkZWYgX19mYWxzZV90eXBlIF9SZXQ7IH07CisKK19TVExQX1RFTVBMQVRFX05VTEwKK3N0cnVjdCBfTGFuZDM8X190cnVlX3R5cGUsIF9fdHJ1ZV90eXBlLCBfX3RydWVfdHlwZT4geyB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9SZXQ7IH07CisKKy8vbG9naWNhbCBvciBvZiAyIHByZWRpY2F0ZWQKK3RlbXBsYXRlIDxjbGFzcyBfUDEsIGNsYXNzIF9QMj4KK3N0cnVjdCBfTG9yMiB7IHR5cGVkZWYgX190cnVlX3R5cGUgX1JldDsgfTsKKworX1NUTFBfVEVNUExBVEVfTlVMTAorc3RydWN0IF9Mb3IyPF9fZmFsc2VfdHlwZSwgX19mYWxzZV90eXBlPiB7IHR5cGVkZWYgX19mYWxzZV90eXBlIF9SZXQ7IH07CisKKy8vIGxvZ2ljYWwgb3Igb2YgMyBwcmVkaWNhdGVkCit0ZW1wbGF0ZSA8Y2xhc3MgX1AxLCBjbGFzcyBfUDIsIGNsYXNzIF9QMz4KK3N0cnVjdCBfTG9yMyB7IHR5cGVkZWYgX190cnVlX3R5cGUgX1JldDsgfTsKKworX1NUTFBfVEVNUExBVEVfTlVMTAorc3RydWN0IF9Mb3IzPF9fZmFsc2VfdHlwZSwgX19mYWxzZV90eXBlLCBfX2ZhbHNlX3R5cGU+IHsgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgX1JldDsgfTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIGNsYXNzIHRlbXBsYXRlIF9fc2VsZWN0CisvLyBTZWxlY3RzIG9uZSBvZiB0d28gdHlwZXMgYmFzZWQgdXBvbiBhIGJvb2xlYW4gY29uc3RhbnQKKy8vIEludm9jYXRpb246IF9fc2VsZWN0PF9Db25kLCBULCBVPjo6UmVzdWx0CisvLyB3aGVyZToKKy8vIGZsYWcgaXMgYSBjb21waWxlLXRpbWUgYm9vbGVhbiBjb25zdGFudAorLy8gVCBhbmQgVSBhcmUgdHlwZXMKKy8vIFJlc3VsdCBldmFsdWF0ZXMgdG8gVCBpZiBmbGFnIGlzIHRydWUsIGFuZCB0byBVIG90aGVyd2lzZS4KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBCRVdBUkU6IElmIHRoZSBjb21waWxlciBkbyBub3Qgc3VwcG9ydCBwYXJ0aWFsIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIG9yIG5lc3RlZCB0ZW1wbGF0ZQorLy9jbGFzc2VzIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoZSBfX3NlbGVjdCBpcyB0byBjb25zaWRlciB0aGUgY29uZGl0aW9uIGFzIGZhbHNlIGFuZCBzbyByZXR1cm4KKy8vdGhlIHNlY29uZCB0ZW1wbGF0ZSB0eXBlISEKKworI2lmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pCisjICBpZiBkZWZpbmVkIChfX0JPUkxBTkRDX18pIAordGVtcGxhdGUgPGNsYXNzIF9Db25kVCwgY2xhc3MgX1RwMSwgY2xhc3MgX1RwMj4KK3N0cnVjdCBfX3NlbGVjdFQgeyB0eXBlZGVmIF9UcDEgX1JldDsgfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcDEsIGNsYXNzIF9UcDI+CitzdHJ1Y3QgX19zZWxlY3RUPF9fZmFsc2VfdHlwZSwgX1RwMSwgX1RwMj4geyB0eXBlZGVmIF9UcDIgX1JldDsgfTsKKyMgIGVuZGlmCisKKyMgIGlmICFkZWZpbmVkIChfX0JPUkxBTkRDX18pIHx8IChfX0JPUkxBTkRDX18gPj0gMHg1OTApCit0ZW1wbGF0ZSA8Ym9vbCBfQ29uZCwgY2xhc3MgX1RwMSwgY2xhc3MgX1RwMj4KK3N0cnVjdCBfX3NlbGVjdCB7IHR5cGVkZWYgX1RwMSBfUmV0OyB9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwMSwgY2xhc3MgX1RwMj4KK3N0cnVjdCBfX3NlbGVjdDxmYWxzZSwgX1RwMSwgX1RwMj4geyB0eXBlZGVmIF9UcDIgX1JldDsgfTsKKyMgIGVsc2UKK3RlbXBsYXRlIDxib29sIF9Db25kLCBjbGFzcyBfVHAxLCBjbGFzcyBfVHAyPgorc3RydWN0IF9fc2VsZWN0IAoreyB0eXBlZGVmIF9fc2VsZWN0VDx0eXBlbmFtZSBfX2Jvb2wydHlwZTxfQ29uZD46Ol9SZXQsIF9UcDEsIF9UcDI+OjpfUmV0IF9SZXQ7IH07CisjICBlbmRpZgorCisjZWxzZQorCisjICBpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVfQ0xBU1NFUykKK3RlbXBsYXRlIDxpbnQgX0NvbmQ+CitzdHJ1Y3QgX19zZWxlY3RfYXV4IHsKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcDEsIGNsYXNzIF9UcDI+CisgIHN0cnVjdCBfSW4geworICAgIHR5cGVkZWYgX1RwMSBfUmV0OworICB9OworfTsKKworX1NUTFBfVEVNUExBVEVfTlVMTAorc3RydWN0IF9fc2VsZWN0X2F1eDwwPiB7CisgIHRlbXBsYXRlIDxjbGFzcyBfVHAxLCBjbGFzcyBfVHAyPgorICBzdHJ1Y3QgX0luIHsKKyAgICB0eXBlZGVmIF9UcDIgX1JldDsKKyAgfTsKK307CisKK3RlbXBsYXRlIDxpbnQgX0NvbmQsIGNsYXNzIF9UcDEsIGNsYXNzIF9UcDI+CitzdHJ1Y3QgX19zZWxlY3QgeworICB0eXBlZGVmIHR5cGVuYW1lIF9fc2VsZWN0X2F1eDxfQ29uZD46Ol9TVExQX1RFTVBMQVRFIF9JbjxfVHAxLCBfVHAyPjo6X1JldCBfUmV0OworfTsKKyMgIGVsc2UgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFX0NMQVNTRVMgKi8KKy8vZGVmYXVsdCBiZWhhdmlvcgordGVtcGxhdGUgPGludCBfQ29uZCwgY2xhc3MgX1RwMSwgY2xhc3MgX1RwMj4KK3N0cnVjdCBfX3NlbGVjdCB7CisgIHR5cGVkZWYgX1RwMiBfUmV0OworfTsKKyMgIGVuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURV9DTEFTU0VTICovCisKKyNlbmRpZiAvKiBfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OICovCisKKy8qIFJhdGhlciB0aGFuIGludHJvZHVjaW5nIGEgbmV3IG1hY3JvIGZvciB0aGUgZm9sbG93aW5nIGNvbnN0cnV0aW9uIHdlIHVzZQorICogYW4gZXhpc3Rpbmcgb25lIChfU1RMUF9ET05UX1NJTVVMQVRFX1BBUlRJQUxfU1BFQ19GT1JfVFlQRV9UUkFJVFMpIHRoYXQKKyAqIGlzIHVzZWQgZm9yIGEgc2ltaWxhciBmZWF0dXJlLgorICovCisjaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfU0lNVUxBVEVfUEFSVElBTF9TUEVDX0ZPUl9UWVBFX1RSQUlUUykgJiYgXAorICAgICghZGVmaW5lZCAoX19HTlVDX18pIHx8IChfX0dOVUNfXyA+IDIpKQorLy8gSGVscGVyIHN0cnVjdCB0aGF0IHdpbGwgZm9yYmlkIHZvbGF0aWxlIHF1YWxpZmllZCB0eXBlczoKKyMgIGlmICFkZWZpbmVkIChfX0JPUkxBTkRDX18pCitzdHJ1Y3QgX05vVm9sYXRpbGVQb2ludGVyU2hpbSB7IF9Ob1ZvbGF0aWxlUG9pbnRlclNoaW0oY29uc3Qgdm9pZCopOyB9OwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2NoYXIgX1NUTFBfQ0FMTCBfSXNDb3B5YWJsZUZ1bihib29sLCBfTm9Wb2xhdGlsZVBvaW50ZXJTaGltLCBfVHAgY29uc3QqLCBfVHAqKTsgLy8gbm8gaW1wbGVtZW50YXRpb24gaXMgcmVxdWlyZWQKK2NoYXIqIF9TVExQX0NBTEwgX0lzQ29weWFibGVGdW4oYm9vbCwgLi4uKTsgICAgICAgLy8gbm8gaW1wbGVtZW50YXRpb24gaXMgcmVxdWlyZWQKKwordGVtcGxhdGUgPGNsYXNzIF9TcmMsIGNsYXNzIF9Ec3Q+CitzdHJ1Y3QgX0NvcHlhYmxlIHsKKyAgc3RhdGljIF9TcmMqIF9fbnVsbF9zcmMoKTsKKyAgc3RhdGljIF9Ec3QqIF9fbnVsbF9kc3QoKTsKKyAgZW51bSB7IF9SZXQgPSAoc2l6ZW9mKF9Jc0NvcHlhYmxlRnVuKGZhbHNlLCBfX251bGxfc3JjKCksIF9fbnVsbF9zcmMoKSwgX19udWxsX2RzdCgpKSkgPT0gc2l6ZW9mKGNoYXIpKSB9OworICB0eXBlZGVmIHR5cGVuYW1lIF9fYm9vbDJ0eXBlPF9SZXQ+OjpfUmV0IF9SZXRUOworfTsKKyMgIGVsc2UKK3RlbXBsYXRlIDxjbGFzcyBfVHAxLCBjbGFzcyBfVHAyPiBzdHJ1Y3QgX0FyZVNhbWVUeXBlczsKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBfSXNVblF1YWw7Cit0ZW1wbGF0ZSA8Y2xhc3MgX1NyYywgY2xhc3MgX0RzdD4KK3N0cnVjdCBfQ29weWFibGUgeworICB0eXBlZGVmIHR5cGVuYW1lIF9BcmVTYW1lVHlwZXM8X1NyYywgX0RzdD46Ol9SZXQgX1RyMTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSXNVblF1YWw8X0RzdD46Ol9SZXQgX1RyMjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfTGFuZDI8X1RyMSwgX1RyMj46Ol9SZXQgX1JldFQ7CisgIGVudW0geyBfUmV0ID0gX190eXBlMmJvb2w8X1JldFQ+OjpfUmV0IH07Cit9OworIyAgZW5kaWYKKyNlbHNlCit0ZW1wbGF0ZSA8Y2xhc3MgX1NyYywgY2xhc3MgX0RzdD4KK3N0cnVjdCBfQ29weWFibGUgeworICBlbnVtIHsgX1JldCA9IDAgfTsKKyAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgX1JldFQ7Cit9OworI2VuZGlmCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIHN0cnVjdCB3aWxsIHRlbGwgeW91IGlmIDIgdHlwZXMgYXJlIHRoZSBzYW1lIGFuZCBpZiBjb3B5aW5nIG1lbW9yeQorICogZnJvbSB0aGUgX1NyYyB0eXBlIHRvIHRoZSBfRHN0IHR5cGUgaXMgcmlnaHQgY29uc2lkZXJpbmcgcXVhbGlmaWVycy4gSWYgX1NyYyBhbmQKKyAqIF9Ec3QgdHlwZXMgYXJlIHRoZSBzYW1lIHVucXVhbGlmaWVkIHR5cGVzIF9SZXQgd2lsbCBiZSBmYWxzZSBpZjoKKyAqICAtIGFueSBvZiB0aGUgdHlwZSBoYXMgdGhlIHZvbGF0aWxlIHF1YWxpZmllcgorICogIC0gX0RzdCBpcyBjb25zdCBxdWFsaWZpZWQKKyAqLwordGVtcGxhdGUgPGNsYXNzIF9TcmMsIGNsYXNzIF9Ec3Q+CitzdHJ1Y3QgX0FyZUNvcHlhYmxlIHsKKyAgZW51bSB7IF9TYW1lID0gX0NvcHlhYmxlPF9TcmMsIF9Ec3Q+OjpfUmV0IH07CisgIHR5cGVkZWYgdHlwZW5hbWUgX0NvcHlhYmxlPF9TcmMsIF9Ec3Q+OjpfUmV0VCBfUmV0OworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcDEsIGNsYXNzIF9UcDI+CitzdHJ1Y3QgX0FyZVNhbWVUeXBlcyB7CisgIGVudW0geyBfU2FtZSA9IDAgfTsKKyAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgX1JldDsKK307CisKKyNpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfQXJlU2FtZVR5cGVzPF9UcCwgX1RwPiB7CisgIGVudW0geyBfU2FtZSA9IDEgfTsKKyAgdHlwZWRlZiBfX3RydWVfdHlwZSBfUmV0OworfTsKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfU0lNVUxBVEVfUEFSVElBTF9TUEVDX0ZPUl9UWVBFX1RSQUlUUykKK3RlbXBsYXRlIDxjbGFzcyBfU3JjLCBjbGFzcyBfRHN0Pgorc3RydWN0IF9Db252ZXJzaW9uSGVscGVyIHsKKyAgc3RhdGljIGNoYXIgX1Rlc3QoYm9vbCwgX0RzdCk7CisgIHN0YXRpYyBjaGFyKiBfVGVzdChib29sLCAuLi4pOworICBzdGF0aWMgX1NyYyBfTWFrZVNvdXJjZSgpOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9TcmMsIGNsYXNzIF9Ec3Q+CitzdHJ1Y3QgX0lzQ29udmVydGlibGUgeworICB0eXBlZGVmIF9Db252ZXJzaW9uSGVscGVyPF9TcmMqLCBjb25zdCB2b2xhdGlsZSBfRHN0Kj4gX0g7CisgIGVudW0geyB2YWx1ZSA9IChzaXplb2YoY2hhcikgPT0gc2l6ZW9mKF9IOjpfVGVzdChmYWxzZSwgX0g6Ol9NYWtlU291cmNlKCkpKSkgfTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jvb2wydHlwZTx2YWx1ZT46Ol9SZXQgX1JldDsKK307CisKKyMgIGlmIGRlZmluZWQgKF9fQk9STEFORENfXykKKyMgICAgaWYgKF9fQk9STEFORENfXyA8IDB4NTkwKQordGVtcGxhdGU8Y2xhc3MgX1RwPgorc3RydWN0IF9VbkNvbnN0UHRyIHsgdHlwZWRlZiBfVHAgX1R5cGU7IH07CisKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK3N0cnVjdCBfVW5Db25zdFB0cjxfVHAqPiB7IHR5cGVkZWYgX1RwIF9UeXBlOyB9OworCit0ZW1wbGF0ZTxjbGFzcyBfVHA+CitzdHJ1Y3QgX1VuQ29uc3RQdHI8Y29uc3QgX1RwKj4geyB0eXBlZGVmIF9UcCBfVHlwZTsgfTsKKyMgICAgZW5kaWYKKworIyAgICBpZiAhZGVmaW5lZCAoX1NUTFBfUVVBTElGSUVEX1NQRUNJQUxJWkFUSU9OX0JVRykKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX0lzQ29uc3QgeyB0eXBlZGVmIF9fZmFsc2VfdHlwZSBfUmV0OyB9OworIyAgICBlbHNlCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9Jc0NvbnN0IHsgdHlwZWRlZiBfQXJlU2FtZVR5cGVzPF9UcCwgY29uc3QgX1RwPjo6X1JldCBfUmV0OyB9OworIyAgICBlbmRpZgorCisjICAgIGlmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pICYmICFkZWZpbmVkIChfU1RMUF9RVUFMSUZJRURfU1BFQ0lBTElaQVRJT05fQlVHKQordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfSXNDb25zdCA8Y29uc3QgX1RwPiB7IHR5cGVkZWYgX190cnVlX3R5cGUgX1JldDsgfTsKKyMgICAgZW5kaWYKKworIyAgICBpZiAoX19CT1JMQU5EQ19fIDwgMHg1OTApCit0ZW1wbGF0ZTxjbGFzcyBfVHA+CitzdHJ1Y3QgX0lzQ29uc3Q8X1RwKj4geyB0eXBlZGVmIF9BcmVTYW1lVHlwZXM8X1RwKiwgY29uc3QgX1RwKj46Ol9SZXQgX1JldDsgfTsKKyMgICAgZW5kaWYKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX0lzVm9sYXRpbGUgeyB0eXBlZGVmIF9BcmVTYW1lVHlwZXM8X1RwLCB2b2xhdGlsZSBfVHA+OjpfUmV0IF9SZXQ7IH07CisKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK3N0cnVjdCBfSXNVblF1YWwgeworICB0eXBlZGVmIF9Jc0NvbnN0PF9UcD46Ol9SZXQgX1RyMTsKKyAgdHlwZWRlZiBfSXNWb2xhdGlsZTxfVHA+OjpfUmV0IF9UcjI7CisgIHR5cGVkZWYgX05vdDxfVHIxPjo6X1JldCBfTm90Q29uOworICB0eXBlZGVmIF9Ob3Q8X1RyMj46Ol9SZXQgX05vdFZvbDsKKyAgdHlwZWRlZiBfTGFuZDI8X05vdENvbiwgX05vdFZvbD46Ol9SZXQgX1JldDsKK307CisKKyMgICAgaWYgIWRlZmluZWQgKF9TVExQX1FVQUxJRklFRF9TUEVDSUFMSVpBVElPTl9CVUcpCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX1VuUXVhbCB7IHR5cGVkZWYgX1RwIF9UeXBlOyB9OwordGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9VblF1YWw8Y29uc3QgX1RwPiB7IHR5cGVkZWYgX1RwIF9UeXBlOyB9OwordGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9VblF1YWw8dm9sYXRpbGUgX1RwPiB7IHR5cGVkZWYgX1RwIF9UeXBlOyB9OwordGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9VblF1YWw8Y29uc3Qgdm9sYXRpbGUgX1RwPiB7IHR5cGVkZWYgX1RwIF9UeXBlOyB9OworIyAgICBlbmRpZgorIyAgZW5kaWYKKworLyogVGhpcyBzdHJ1Y3QgaXMgaW50ZW5kZWQgdG8gc2F5IGlmIGEgcG9pbnRlciBjYW4gYmUgY29udmVydGlibGUgdG8gYW4gb3RoZXIKKyAqIHRha2luZyBpbnRvIGFjY291bnQgY3YgcXVhbGlmaWNhdGlvbnMuIEl0IHNob3VsZG4ndCBiZSBpbnN0YW5jaWF0ZWQgd2l0aAorICogc29tZXRoaW5nIGVsc2UgdGhhbiBwb2ludGVyIHR5cGUgYXMgaXQgdXNlcyBwYXNzIGJ5IHZhbHVlIHBhcmFtZXRlciB0aGF0CisgKiByZXN1bHRzIGluIGNvbXBpbGF0aW9uIGVycm9yIHdoZW4gcGFyYW1ldGVyIHR5cGUgaGFzIGEgc3BlY2lhbCBtZW1vcnkKKyAqIGFsaWdubWVudAorICovCit0ZW1wbGF0ZSA8Y2xhc3MgX1NyYywgY2xhc3MgX0RzdD4KK3N0cnVjdCBfSXNDVkNvbnZlcnRpYmxlIHsKKyMgIGlmICFkZWZpbmVkIChfX0JPUkxBTkRDX18pIHx8IChfX0JPUkxBTkRDX18gPj0gMHg1OTApCisgIHR5cGVkZWYgX0NvbnZlcnNpb25IZWxwZXI8X1NyYywgX0RzdD4gX0g7CisgIGVudW0geyB2YWx1ZSA9IChzaXplb2YoY2hhcikgPT0gc2l6ZW9mKF9IOjpfVGVzdChmYWxzZSwgX0g6Ol9NYWtlU291cmNlKCkpKSkgfTsKKyMgIGVsc2UKKyAgZW51bSB7IF9JczEgPSBfX3R5cGUyYm9vbDxfSXNDb25zdDxfU3JjPjo6X1JldD46Ol9SZXQgfTsKKyAgZW51bSB7IF9JczIgPSBfSXNDb252ZXJ0aWJsZTxfVW5Db25zdFB0cjxfU3JjPjo6X1R5cGUsIF9VbkNvbnN0UHRyPF9Ec3Q+OjpfVHlwZT46OnZhbHVlIH07CisgIGVudW0geyB2YWx1ZSA9IF9JczEgPyAwIDogX0lzMiB9OworIyAgZW5kaWYKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jvb2wydHlwZTx2YWx1ZT46Ol9SZXQgX1JldDsKK307CisKKyNlbHNlCit0ZW1wbGF0ZSA8Y2xhc3MgX1NyYywgY2xhc3MgX0RzdD4KK3N0cnVjdCBfSXNDb252ZXJ0aWJsZSB7CisgIGVudW0geyB2YWx1ZSA9IDAgfTsKKyAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgX1JldDsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfU3JjLCBjbGFzcyBfRHN0Pgorc3RydWN0IF9Jc0NWQ29udmVydGlibGUgeworICBlbnVtIHsgdmFsdWUgPSAwIH07CisgIHR5cGVkZWYgX19mYWxzZV90eXBlIF9SZXQ7Cit9OworI2VuZGlmCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2VuZGlmIC8qIF9TVExQX1RZUEVfTUFOSVBTX0ggKi8KZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RsL3R5cGVfdHJhaXRzLmggYi9zdGxwb3J0L3N0bC90eXBlX3RyYWl0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMDkyM2QKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0bC90eXBlX3RyYWl0cy5oCkBAIC0wLDAgKzEsNjI2IEBACisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX1RZUEVfVFJBSVRTX0gKKyNkZWZpbmUgX1NUTFBfVFlQRV9UUkFJVFNfSAorCisvKgorVGhpcyBoZWFkZXIgZmlsZSBwcm92aWRlcyBhIGZyYW1ld29yayBmb3IgYWxsb3dpbmcgY29tcGlsZSB0aW1lIGRpc3BhdGNoCitiYXNlZCBvbiB0eXBlIGF0dHJpYnV0ZXMuIFRoaXMgaXMgdXNlZnVsIHdoZW4gd3JpdGluZyB0ZW1wbGF0ZSBjb2RlLgorRm9yIGV4YW1wbGUsIHdoZW4gbWFraW5nIGEgY29weSBvZiBhbiBhcnJheSBvZiBhbiB1bmtub3duIHR5cGUsIGl0IGhlbHBzCit0byBrbm93IGlmIHRoZSB0eXBlIGhhcyBhIHRyaXZpYWwgY29weSBjb25zdHJ1Y3RvciBvciBub3QsIHRvIGhlbHAgZGVjaWRlCitpZiBhIG1lbWNweSBjYW4gYmUgdXNlZC4KKworVGhlIGNsYXNzIHRlbXBsYXRlIF9fdHlwZV90cmFpdHMgcHJvdmlkZXMgYSBzZXJpZXMgb2YgdHlwZWRlZnMgZWFjaCBvZgord2hpY2ggaXMgZWl0aGVyIF9fdHJ1ZV90eXBlIG9yIF9fZmFsc2VfdHlwZS4gVGhlIGFyZ3VtZW50IHRvCitfX3R5cGVfdHJhaXRzIGNhbiBiZSBhbnkgdHlwZS4gVGhlIHR5cGVkZWZzIHdpdGhpbiB0aGlzIHRlbXBsYXRlIHdpbGwKK2F0dGFpbiB0aGVpciBjb3JyZWN0IHZhbHVlcyBieSBvbmUgb2YgdGhlc2UgbWVhbnM6CisgICAgMS4gVGhlIGdlbmVyYWwgaW5zdGFudGlhdGlvbiBjb250YWluIGNvbnNlcnZhdGl2ZSB2YWx1ZXMgd2hpY2ggd29yaworICAgICAgIGZvciBhbGwgdHlwZXMuCisgICAgMi4gU3BlY2lhbGl6YXRpb25zIG1heSBiZSBkZWNsYXJlZCB0byBtYWtlIGRpc3RpbmN0aW9ucyBiZXR3ZWVuIHR5cGVzLgorICAgIDMuIFNvbWUgY29tcGlsZXJzIChzdWNoIGFzIHRoZSBTaWxpY29uIEdyYXBoaWNzIE4zMiBhbmQgTjY0IGNvbXBpbGVycykKKyAgICAgICB3aWxsIGF1dG9tYXRpY2FsbHkgcHJvdmlkZSB0aGUgYXBwcm9wcmlhdGUgc3BlY2lhbGl6YXRpb25zIGZvciBhbGwKKyAgICAgICB0eXBlcy4KKworRVhBTVBMRToKKworLy9Db3B5IGFuIGFycmF5IG9mIGVsZW1lbnRzIHdoaWNoIGhhdmUgbm9uLXRyaXZpYWwgY29weSBjb25zdHJ1Y3RvcnMKK3RlbXBsYXRlIDxjbGFzcyBUPiB2b2lkIGNvcHkoVCogc291cmNlLCBUKiBkZXN0aW5hdGlvbiwgaW50IG4sIF9fZmFsc2VfdHlwZSk7CisvL0NvcHkgYW4gYXJyYXkgb2YgZWxlbWVudHMgd2hpY2ggaGF2ZSB0cml2aWFsIGNvcHkgY29uc3RydWN0b3JzLiBVc2UgbWVtY3B5LgordGVtcGxhdGUgPGNsYXNzIFQ+IHZvaWQgY29weShUKiBzb3VyY2UsIFQqIGRlc3RpbmF0aW9uLCBpbnQgbiwgX190cnVlX3R5cGUpOworCisvL0NvcHkgYW4gYXJyYXkgb2YgYW55IHR5cGUgYnkgdXNpbmcgdGhlIG1vc3QgZWZmaWNpZW50IGNvcHkgbWVjaGFuaXNtCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gaW5saW5lIHZvaWQgY29weShUKiBzb3VyY2UsVCogZGVzdGluYXRpb24saW50IG4pIHsKKyAgIGNvcHkoc291cmNlLCBkZXN0aW5hdGlvbiwgbiwKKyAgICAgICAgdHlwZW5hbWUgX190eXBlX3RyYWl0czxUPjo6aGFzX3RyaXZpYWxfY29weV9jb25zdHJ1Y3RvcigpKTsKK30KKyovCisKKyNpZmRlZiBfX1dBVENPTUNfXworIyAgaW5jbHVkZSA8c3RsL19jd2NoYXIuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX1RZUEVfTUFOSVBTX0gKKyMgIGluY2x1ZGUgPHN0bC90eXBlX21hbmlwcy5oPgorI2VuZGlmCisKKyNpZmRlZiBfU1RMUF9VU0VfQk9PU1RfU1VQUE9SVAorIyAgaW5jbHVkZSA8c3RsL2Jvb3N0X3R5cGVfdHJhaXRzLmg+CisjICBpbmNsdWRlIDxib29zdC90eXBlX3RyYWl0cy9hZGRfcmVmZXJlbmNlLmhwcD4KKyMgIGluY2x1ZGUgPGJvb3N0L3R5cGVfdHJhaXRzL2FkZF9jb25zdC5ocHA+CisjZW5kaWYgLyogX1NUTFBfVVNFX0JPT1NUX1NVUFBPUlQgKi8KKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX0JPT1NUX1NVUFBPUlQpCisKKy8vIFRoZSBmb2xsb3dpbmcgY291bGQgYmUgd3JpdHRlbiBpbiB0ZXJtcyBvZiBudW1lcmljX2xpbWl0cy4KKy8vIFdlJ3JlIGRvaW5nIGl0IHNlcGFyYXRlbHkgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgZGVwZW5kZW5jaWVzLgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX0lzSW50ZWdyYWwKK3sgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgX1JldDsgfTsKKworIyAgaWZuZGVmIF9TVExQX05PX0JPT0wKK19TVExQX1RFTVBMQVRFX05VTEwgc3RydWN0IF9Jc0ludGVncmFsPGJvb2w+Cit7IHR5cGVkZWYgX190cnVlX3R5cGUgX1JldDsgfTsKKyMgIGVuZGlmIC8qIF9TVExQX05PX0JPT0wgKi8KKworX1NUTFBfVEVNUExBVEVfTlVMTCBzdHJ1Y3QgX0lzSW50ZWdyYWw8Y2hhcj4KK3sgdHlwZWRlZiBfX3RydWVfdHlwZSBfUmV0OyB9OworCisjICBpZm5kZWYgX1NUTFBfTk9fU0lHTkVEX0JVSUxUSU5TCitfU1RMUF9URU1QTEFURV9OVUxMIHN0cnVjdCBfSXNJbnRlZ3JhbDxzaWduZWQgY2hhcj4KK3sgdHlwZWRlZiBfX3RydWVfdHlwZSBfUmV0OyB9OworIyAgZW5kaWYKKworX1NUTFBfVEVNUExBVEVfTlVMTCBzdHJ1Y3QgX0lzSW50ZWdyYWw8dW5zaWduZWQgY2hhcj4KK3sgdHlwZWRlZiBfX3RydWVfdHlwZSBfUmV0OyB9OworCisjICBpZiBkZWZpbmVkICggX1NUTFBfSEFTX1dDSEFSX1QgKSAmJiAhIGRlZmluZWQgKF9TVExQX1dDSEFSX1RfSVNfVVNIT1JUKQorX1NUTFBfVEVNUExBVEVfTlVMTCBzdHJ1Y3QgX0lzSW50ZWdyYWw8d2NoYXJfdD4KK3sgdHlwZWRlZiBfX3RydWVfdHlwZSBfUmV0OyB9OworIyAgZW5kaWYgLyogX1NUTFBfSEFTX1dDSEFSX1QgKi8KKworX1NUTFBfVEVNUExBVEVfTlVMTCBzdHJ1Y3QgX0lzSW50ZWdyYWw8c2hvcnQ+Cit7IHR5cGVkZWYgX190cnVlX3R5cGUgX1JldDsgfTsKKworX1NUTFBfVEVNUExBVEVfTlVMTCBzdHJ1Y3QgX0lzSW50ZWdyYWw8dW5zaWduZWQgc2hvcnQ+Cit7IHR5cGVkZWYgX190cnVlX3R5cGUgX1JldDsgfTsKKworX1NUTFBfVEVNUExBVEVfTlVMTCBzdHJ1Y3QgX0lzSW50ZWdyYWw8aW50PgoreyB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9SZXQ7IH07CisKK19TVExQX1RFTVBMQVRFX05VTEwgc3RydWN0IF9Jc0ludGVncmFsPHVuc2lnbmVkIGludD4KK3sgdHlwZWRlZiBfX3RydWVfdHlwZSBfUmV0OyB9OworCitfU1RMUF9URU1QTEFURV9OVUxMIHN0cnVjdCBfSXNJbnRlZ3JhbDxsb25nPgoreyB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9SZXQ7IH07CisKK19TVExQX1RFTVBMQVRFX05VTEwgc3RydWN0IF9Jc0ludGVncmFsPHVuc2lnbmVkIGxvbmc+Cit7IHR5cGVkZWYgX190cnVlX3R5cGUgX1JldDsgfTsKKworIyAgaWZkZWYgX1NUTFBfTE9OR19MT05HCitfU1RMUF9URU1QTEFURV9OVUxMIHN0cnVjdCBfSXNJbnRlZ3JhbDxfU1RMUF9MT05HX0xPTkc+Cit7IHR5cGVkZWYgX190cnVlX3R5cGUgX1JldDsgfTsKKworX1NUTFBfVEVNUExBVEVfTlVMTCBzdHJ1Y3QgX0lzSW50ZWdyYWw8dW5zaWduZWQgX1NUTFBfTE9OR19MT05HPgoreyB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9SZXQ7IH07CisjICBlbmRpZiAvKiBfU1RMUF9MT05HX0xPTkcgKi8KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9Jc1JhdGlvbmFsCit7IHR5cGVkZWYgX19mYWxzZV90eXBlIF9SZXQ7IH07CisKK19TVExQX1RFTVBMQVRFX05VTEwgc3RydWN0IF9Jc1JhdGlvbmFsPGZsb2F0PgoreyB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9SZXQ7IH07CisKK19TVExQX1RFTVBMQVRFX05VTEwgc3RydWN0IF9Jc1JhdGlvbmFsPGRvdWJsZT4KK3sgdHlwZWRlZiBfX3RydWVfdHlwZSBfUmV0OyB9OworCisjICBpZiAhZGVmaW5lZCAoIF9TVExQX05PX0xPTkdfRE9VQkxFICkKK19TVExQX1RFTVBMQVRFX05VTEwgc3RydWN0IF9Jc1JhdGlvbmFsPGxvbmcgZG91YmxlPgoreyB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9SZXQ7IH07CisjICBlbmRpZgorCisvLyBGb3J3YXJkIGRlY2xhcmF0aW9ucy4KK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBfX3R5cGVfdHJhaXRzOwordGVtcGxhdGUgPGNsYXNzIF9Jc1BPRD4gc3RydWN0IF9fdHlwZV90cmFpdHNfYXV4IHsKKyAgIHR5cGVkZWYgX19mYWxzZV90eXBlICAgIGhhc190cml2aWFsX2RlZmF1bHRfY29uc3RydWN0b3I7CisgICB0eXBlZGVmIF9fZmFsc2VfdHlwZSAgICBoYXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yOworICAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgICAgaGFzX3RyaXZpYWxfYXNzaWdubWVudF9vcGVyYXRvcjsKKyAgIHR5cGVkZWYgX19mYWxzZV90eXBlICAgIGhhc190cml2aWFsX2Rlc3RydWN0b3I7CisgICB0eXBlZGVmIF9fZmFsc2VfdHlwZSAgICBpc19QT0RfdHlwZTsKK307CisKK19TVExQX1RFTVBMQVRFX05VTEwKK3N0cnVjdCBfX3R5cGVfdHJhaXRzX2F1eDxfX2ZhbHNlX3R5cGU+IHsKKyAgIHR5cGVkZWYgX19mYWxzZV90eXBlICAgIGhhc190cml2aWFsX2RlZmF1bHRfY29uc3RydWN0b3I7CisgICB0eXBlZGVmIF9fZmFsc2VfdHlwZSAgICBoYXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yOworICAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgICAgaGFzX3RyaXZpYWxfYXNzaWdubWVudF9vcGVyYXRvcjsKKyAgIHR5cGVkZWYgX19mYWxzZV90eXBlICAgIGhhc190cml2aWFsX2Rlc3RydWN0b3I7CisgICB0eXBlZGVmIF9fZmFsc2VfdHlwZSAgICBpc19QT0RfdHlwZTsKK307CisKK19TVExQX1RFTVBMQVRFX05VTEwKK3N0cnVjdCBfX3R5cGVfdHJhaXRzX2F1eDxfX3RydWVfdHlwZT4geworICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2RlZmF1bHRfY29uc3RydWN0b3I7CisgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfY29weV9jb25zdHJ1Y3RvcjsKKyAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9hc3NpZ25tZW50X29wZXJhdG9yOworICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2Rlc3RydWN0b3I7CisgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaXNfUE9EX3R5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9Jc1JlZiB7CisgIHR5cGVkZWYgX19mYWxzZV90eXBlIF9SZXQ7Cit9OworCisjICBpZiBkZWZpbmVkIChfU1RMUF9TSU1VTEFURV9QQVJUSUFMX1NQRUNfRk9SX1RZUEVfVFJBSVRTKQorLyoKKyAqIEJvcmlzIDogc2ltdWxhdGlvbiB0ZWNobmlxdWUgaXMgdXNlZCBoZXJlIGFjY29yZGluZyB0byBBZG9iZSBPcGVuIFNvdXJjZSBMaWNlbnNlIFZlcnNpb24gMS4wLgorICogQ29weXJpZ2h0IDIwMDAgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQgYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIEF1dGhvcnM6IE1hdCBNYXJjdXMgYW5kIEplc3NlIEpvbmVzCisgKiBUaGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGlzIHNvdXJjZSBjb2RlIG1heSBiZSBmb3VuZCBhdAorICogaHR0cDovL29wZW5zb3VyY2UuYWRvYmUuY29tLgorICovCisKK3N0cnVjdCBfUG9pbnRlclNoaW0geworICAvKgorICAgKiBTaW5jZSB0aGUgY29tcGlsZXIgb25seSBhbGxvd3MgYXQgbW9zdCBvbmUgbm9uLXRyaXZpYWwKKyAgICogaW1wbGljaXQgY29udmVyc2lvbiB3ZSBjYW4gbWFrZSB1c2Ugb2YgYSBzaGltIGNsYXNzIHRvCisgICAqIGJlIHN1cmUgdGhhdCBJc1B0ciBiZWxvdyBkb2Vzbid0IGFjY2VwdCBjbGFzc2VzIHdpdGgKKyAgICogaW1wbGljaXQgcG9pbnRlciBjb252ZXJzaW9uIG9wZXJhdG9ycworICAgKi8KKyAgX1BvaW50ZXJTaGltKGNvbnN0IHZvbGF0aWxlIHZvaWQqKTsgLy8gbm8gaW1wbGVtZW50YXRpb24KK307CisKKy8vIFRoZXNlIGFyZSB0aGUgZGlzY3JpbWluYXRpbmcgZnVuY3Rpb25zCitjaGFyIF9TVExQX0NBTEwgX0lzUChib29sLCBfUG9pbnRlclNoaW0pOyAgLy8gbm8gaW1wbGVtZW50YXRpb24gaXMgcmVxdWlyZWQKK2NoYXIqIF9TVExQX0NBTEwgX0lzUChib29sLCAuLi4pOyAgICAgICAgICAvLyBubyBpbXBsZW1lbnRhdGlvbiBpcyByZXF1aXJlZAorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9Jc1B0ciB7CisgIC8qCisgICAqIFRoaXMgdGVtcGxhdGUgbWV0YSBmdW5jdGlvbiB0YWtlcyBhIHR5cGUgVAorICAgKiBhbmQgcmV0dXJucyB0cnVlIGV4YWN0bHkgd2hlbiBUIGlzIGEgcG9pbnRlci4KKyAgICogT25lIGNhbiBpbWFnaW5lIG1ldGEtZnVuY3Rpb25zIGRpc2NyaW1pbmF0aW5nIG9uCisgICAqIG90aGVyIGNyaXRlcmlhLgorICAgKi8KKyAgc3RhdGljIF9UcCYgX19udWxsX3JlcCgpOworICBlbnVtIHsgX1B0ciA9IChzaXplb2YoX0lzUChmYWxzZSxfX251bGxfcmVwKCkpKSA9PSBzaXplb2YoY2hhcikpIH07CisgIHR5cGVkZWYgdHlwZW5hbWUgX19ib29sMnR5cGU8X1B0cj46Ol9SZXQgX1JldDsKKworfTsKKworLy8gd2UgbWFrZSBnZW5lcmFsIGNhc2UgZGVwZW5kYW50IG9uIHRoZSBmYWN0IHRoZSB0eXBlIGlzIGFjdHVhbGx5IGEgcG9pbnRlci4KK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX190eXBlX3RyYWl0cyA6IF9fdHlwZV90cmFpdHNfYXV4PHR5cGVuYW1lIF9Jc1B0cjxfVHA+OjpfUmV0PiB7fTsKKworIyAgZWxzZSAvKiBfU1RMUF9TSU1VTEFURV9QQVJUSUFMX1NQRUNfRk9SX1RZUEVfVFJBSVRTICovCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+ICBzdHJ1Y3QgX0lzUHRyIHsKKyAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgX1JldDsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX190eXBlX3RyYWl0cyB7CisgICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgICB0aGlzX2R1bW15X21lbWJlcl9tdXN0X2JlX2ZpcnN0OworICAgICAgICAgICAgICAgICAgIC8qIERvIG5vdCByZW1vdmUgdGhpcyBtZW1iZXIuIEl0IGluZm9ybXMgYSBjb21waWxlciB3aGljaAorICAgICAgICAgICAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgc3BlY2lhbGl6ZXMgX190eXBlX3RyYWl0cyB0aGF0IHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICBfX3R5cGVfdHJhaXRzIHRlbXBsYXRlIGlzIHNwZWNpYWwuIEl0IGp1c3QgbWFrZXMgc3VyZSB0aGF0CisgICAgICAgICAgICAgICAgICAgICAgdGhpbmdzIHdvcmsgaWYgYW4gaW1wbGVtZW50YXRpb24gaXMgdXNpbmcgYSB0ZW1wbGF0ZQorICAgICAgICAgICAgICAgICAgICAgIGNhbGxlZCBfX3R5cGVfdHJhaXRzIGZvciBzb21ldGhpbmcgdW5yZWxhdGVkLiAqLworCisgICAvKiBUaGUgZm9sbG93aW5nIHJlc3RyaWN0aW9ucyBzaG91bGQgYmUgb2JzZXJ2ZWQgZm9yIHRoZSBzYWtlIG9mCisgICAgICBjb21waWxlcnMgd2hpY2ggYXV0b21hdGljYWxseSBwcm9kdWNlIHR5cGUgc3BlY2lmaWMgc3BlY2lhbGl6YXRpb25zCisgICAgICBvZiB0aGlzIGNsYXNzOgorICAgICAgICAgIC0gWW91IG1heSByZW9yZGVyIHRoZSBtZW1iZXJzIGJlbG93IGlmIHlvdSB3aXNoCisgICAgICAgICAgLSBZb3UgbWF5IHJlbW92ZSBhbnkgb2YgdGhlIG1lbWJlcnMgYmVsb3cgaWYgeW91IHdpc2gKKyAgICAgICAgICAtIFlvdSBtdXN0IG5vdCByZW5hbWUgbWVtYmVycyB3aXRob3V0IG1ha2luZyB0aGUgY29ycmVzcG9uZGluZworICAgICAgICAgICAgbmFtZSBjaGFuZ2UgaW4gdGhlIGNvbXBpbGVyCisgICAgICAgICAgLSBNZW1iZXJzIHlvdSBhZGQgd2lsbCBiZSB0cmVhdGVkIGxpa2UgcmVndWxhciBtZW1iZXJzIHVubGVzcworCisgICAgICAgICAgICB5b3UgYWRkIHRoZSBhcHByb3ByaWF0ZSBzdXBwb3J0IGluIHRoZSBjb21waWxlci4gKi8KKyMgICAgaWYgIWRlZmluZWQgKF9TVExQX0hBU19UWVBFX1RSQUlUU19JTlRSSU5TSUNTKQorICAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgICAgaGFzX3RyaXZpYWxfZGVmYXVsdF9jb25zdHJ1Y3RvcjsKKyAgIHR5cGVkZWYgX19mYWxzZV90eXBlICAgIGhhc190cml2aWFsX2NvcHlfY29uc3RydWN0b3I7CisgICB0eXBlZGVmIF9fZmFsc2VfdHlwZSAgICBoYXNfdHJpdmlhbF9hc3NpZ25tZW50X29wZXJhdG9yOworICAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgICAgaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjsKKyAgIHR5cGVkZWYgX19mYWxzZV90eXBlICAgIGlzX1BPRF90eXBlOworIyAgICBlbHNlCisgICB0eXBlZGVmIHR5cGVuYW1lIF9fYm9vbDJ0eXBlPF9TVExQX0hBU19UUklWSUFMX0NPTlNUUlVDVE9SKF9UcCk+OjpfUmV0IGhhc190cml2aWFsX2RlZmF1bHRfY29uc3RydWN0b3I7CisgICB0eXBlZGVmIHR5cGVuYW1lIF9fYm9vbDJ0eXBlPF9TVExQX0hBU19UUklWSUFMX0NPUFkoX1RwKT46Ol9SZXQgaGFzX3RyaXZpYWxfY29weV9jb25zdHJ1Y3RvcjsKKyAgIHR5cGVkZWYgdHlwZW5hbWUgX19ib29sMnR5cGU8X1NUTFBfSEFTX1RSSVZJQUxfQVNTSUdOKF9UcCk+OjpfUmV0IGhhc190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3I7CisgICB0eXBlZGVmIHR5cGVuYW1lIF9fYm9vbDJ0eXBlPF9TVExQX0hBU19UUklWSUFMX0RFU1RSVUNUT1IoX1RwKT46Ol9SZXQgaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjsKKyAgIHR5cGVkZWYgdHlwZW5hbWUgX19ib29sMnR5cGU8X1NUTFBfSVNfUE9EKF9UcCk+OjpfUmV0IGlzX1BPRF90eXBlOworIyAgICBlbmRpZgorfTsKKworIyAgICBpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQordGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9Jc1B0cjxfVHAqPgoreyB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9SZXQ7IH07Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX0lzUmVmPF9UcCY+Cit7IHR5cGVkZWYgX190cnVlX3R5cGUgX1JldDsgfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9fdHlwZV90cmFpdHM8X1RwKj4gOiBfX3R5cGVfdHJhaXRzX2F1eDxfX3RydWVfdHlwZT4KK3t9OworIyAgICBlbmRpZiAvKiBfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OICovCisKKyMgIGVuZGlmIC8qIF9TVExQX1NJTVVMQVRFX1BBUlRJQUxfU1BFQ19GT1JfVFlQRV9UUkFJVFMgKi8KKworLy8gUHJvdmlkZSBzb21lIHNwZWNpYWxpemF0aW9ucy4gIFRoaXMgaXMgaGFybWxlc3MgZm9yIGNvbXBpbGVycyB0aGF0CisvLyAgaGF2ZSBidWlsdC1pbiBfX3R5cGVzX3RyYWl0cyBzdXBwb3J0LCBhbmQgZXNzZW50aWFsIGZvciBjb21waWxlcnMKKy8vICB0aGF0IGRvbid0LgorIyAgaWYgIWRlZmluZWQgKF9TVExQX1FVQUxJRklFRF9TUEVDSUFMSVpBVElPTl9CVUcpCisjICAgIGRlZmluZSBfU1RMUF9ERUZJTkVfVFlQRV9UUkFJVFNfRk9SKFR5cGUpIFwKK19TVExQX1RFTVBMQVRFX05VTEwgc3RydWN0IF9fdHlwZV90cmFpdHM8IFR5cGUgPiA6IF9fdHlwZV90cmFpdHNfYXV4PF9fdHJ1ZV90eXBlPiB7fTsgXAorX1NUTFBfVEVNUExBVEVfTlVMTCBzdHJ1Y3QgX190eXBlX3RyYWl0czwgY29uc3QgVHlwZSA+IDogX190eXBlX3RyYWl0c19hdXg8X190cnVlX3R5cGU+IHt9OyBcCitfU1RMUF9URU1QTEFURV9OVUxMIHN0cnVjdCBfX3R5cGVfdHJhaXRzPCB2b2xhdGlsZSBUeXBlID4gOiBfX3R5cGVfdHJhaXRzX2F1eDxfX3RydWVfdHlwZT4ge307IFwKK19TVExQX1RFTVBMQVRFX05VTEwgc3RydWN0IF9fdHlwZV90cmFpdHM8IGNvbnN0IHZvbGF0aWxlIFR5cGUgPiA6IF9fdHlwZV90cmFpdHNfYXV4PF9fdHJ1ZV90eXBlPiB7fQorIyAgZWxzZQorIyAgICBkZWZpbmUgX1NUTFBfREVGSU5FX1RZUEVfVFJBSVRTX0ZPUihUeXBlKSBcCitfU1RMUF9URU1QTEFURV9OVUxMIHN0cnVjdCBfX3R5cGVfdHJhaXRzPCBUeXBlID4gOiBfX3R5cGVfdHJhaXRzX2F1eDxfX3RydWVfdHlwZT4ge307CisjICBlbmRpZgorCisjICBpZm5kZWYgX1NUTFBfTk9fQk9PTAorX1NUTFBfREVGSU5FX1RZUEVfVFJBSVRTX0ZPUihib29sKTsKKyMgIGVuZGlmIC8qIF9TVExQX05PX0JPT0wgKi8KK19TVExQX0RFRklORV9UWVBFX1RSQUlUU19GT1IoY2hhcik7CisjICBpZm5kZWYgX1NUTFBfTk9fU0lHTkVEX0JVSUxUSU5TCitfU1RMUF9ERUZJTkVfVFlQRV9UUkFJVFNfRk9SKHNpZ25lZCBjaGFyKTsKKyMgIGVuZGlmCitfU1RMUF9ERUZJTkVfVFlQRV9UUkFJVFNfRk9SKHVuc2lnbmVkIGNoYXIpOworIyAgaWYgZGVmaW5lZCAoIF9TVExQX0hBU19XQ0hBUl9UICkgJiYgISBkZWZpbmVkIChfU1RMUF9XQ0hBUl9UX0lTX1VTSE9SVCkKK19TVExQX0RFRklORV9UWVBFX1RSQUlUU19GT1Iod2NoYXJfdCk7CisjICBlbmRpZiAvKiBfU1RMUF9IQVNfV0NIQVJfVCAqLworCitfU1RMUF9ERUZJTkVfVFlQRV9UUkFJVFNfRk9SKHNob3J0KTsKK19TVExQX0RFRklORV9UWVBFX1RSQUlUU19GT1IodW5zaWduZWQgc2hvcnQpOworX1NUTFBfREVGSU5FX1RZUEVfVFJBSVRTX0ZPUihpbnQpOworX1NUTFBfREVGSU5FX1RZUEVfVFJBSVRTX0ZPUih1bnNpZ25lZCBpbnQpOworX1NUTFBfREVGSU5FX1RZUEVfVFJBSVRTX0ZPUihsb25nKTsKK19TVExQX0RFRklORV9UWVBFX1RSQUlUU19GT1IodW5zaWduZWQgbG9uZyk7CisKKyMgIGlmZGVmIF9TVExQX0xPTkdfTE9ORworX1NUTFBfREVGSU5FX1RZUEVfVFJBSVRTX0ZPUihfU1RMUF9MT05HX0xPTkcpOworX1NUTFBfREVGSU5FX1RZUEVfVFJBSVRTX0ZPUih1bnNpZ25lZCBfU1RMUF9MT05HX0xPTkcpOworIyAgZW5kaWYgLyogX1NUTFBfTE9OR19MT05HICovCisKK19TVExQX0RFRklORV9UWVBFX1RSQUlUU19GT1IoZmxvYXQpOworX1NUTFBfREVGSU5FX1RZUEVfVFJBSVRTX0ZPUihkb3VibGUpOworCisjICBpZiAhZGVmaW5lZCAoIF9TVExQX05PX0xPTkdfRE9VQkxFICkKK19TVExQX0RFRklORV9UWVBFX1RSQUlUU19GT1IobG9uZyBkb3VibGUpOworIyAgZW5kaWYKKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikKK3RlbXBsYXRlIDxjbGFzcyBfQXJlUHRycywgY2xhc3MgX1NyYywgY2xhc3MgX0RzdD4KK3N0cnVjdCBfSXNDVkNvbnZlcnRpYmxlSWYKK3sgdHlwZWRlZiB0eXBlbmFtZSBfSXNDVkNvbnZlcnRpYmxlPF9TcmMsIF9Ec3Q+OjpfUmV0IF9SZXQ7IH07CisKK3RlbXBsYXRlIDxjbGFzcyBfU3JjLCBjbGFzcyBfRHN0Pgorc3RydWN0IF9Jc0NWQ29udmVydGlibGVJZjxfX2ZhbHNlX3R5cGUsIF9TcmMsIF9Ec3Q+Cit7IHR5cGVkZWYgX19mYWxzZV90eXBlIF9SZXQ7IH07CisjICBlbHNlCisjICAgIGlmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURV9DTEFTU0VTKQordGVtcGxhdGUgPGNsYXNzIF9BcmVQdHJzPgorc3RydWN0IF9Jc0NWQ29udmVydGlibGVJZkF1eCB7CisgIHRlbXBsYXRlIDxjbGFzcyBfU3JjLCBjbGFzcyBfRHN0PgorICBzdHJ1Y3QgX0luCisgIHsgdHlwZWRlZiB0eXBlbmFtZSBfSXNDVkNvbnZlcnRpYmxlPF9TcmMsIF9Ec3Q+OjpfUmV0IF9SZXQ7IH07Cit9OworCitfU1RMUF9URU1QTEFURV9OVUxMCitzdHJ1Y3QgX0lzQ1ZDb252ZXJ0aWJsZUlmQXV4PF9fZmFsc2VfdHlwZT4geworICB0ZW1wbGF0ZSA8Y2xhc3MgX1NyYywgY2xhc3MgX0RzdD4KKyAgc3RydWN0IF9JbgorICB7IHR5cGVkZWYgX19mYWxzZV90eXBlIF9SZXQ7IH07Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0FyZVB0cnMsIGNsYXNzIF9TcmMsIGNsYXNzIF9Ec3Q+CitzdHJ1Y3QgX0lzQ1ZDb252ZXJ0aWJsZUlmIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSXNDVkNvbnZlcnRpYmxlSWZBdXg8X0FyZVB0cnM+OjpfU1RMUF9URU1QTEFURSBfSW48X1NyYywgX0RzdD46Ol9SZXQgX1JldDsKK307CisjICAgIGVsc2UKKy8qIGRlZmF1bHQgYmVoYXZpb3I6IHdlIHByZWZlciB0byBtaXNzIGFuIG9wdGltaXphdGlvbiByYXRoZXIgdGhhbiB0YWtpbmcgdGhlIHJpc2sgb2YKKyAqIGEgY29tcGlsYXRpb24gZXJyb3IgaWYgcGxheWluZyB3aXRoIHR5cGVzIHdpdGggZXhvdGljIG1lbW9yeSBhbGlnbm1lbnQuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBfQXJlUHRycywgY2xhc3MgX1NyYywgY2xhc3MgX0RzdD4KK3N0cnVjdCBfSXNDVkNvbnZlcnRpYmxlSWYKK3sgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgX1JldDsgfTsKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfU3JjLCBjbGFzcyBfRHN0Pgorc3RydWN0IF9Ucml2aWFsTmF0aXZlVHlwZUNvcHkgeworICB0eXBlZGVmIHR5cGVuYW1lIF9Jc1B0cjxfU3JjPjo6X1JldCBfUHRyMTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSXNQdHI8X0RzdD46Ol9SZXQgX1B0cjI7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0xhbmQyPF9QdHIxLCBfUHRyMj46Ol9SZXQgX0JvdGhQdHJzOworICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0NWQ29udmVydGlibGVJZjxfQm90aFB0cnMsIF9TcmMsIF9Ec3Q+OjpfUmV0IF9Db252ZXJ0aWJsZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfTGFuZDI8X0JvdGhQdHJzLCBfQ29udmVydGlibGU+OjpfUmV0IF9Ucml2aWFsMTsKKworICB0eXBlZGVmIHR5cGVuYW1lIF9fYm9vbDJ0eXBlPChzaXplb2YoX1NyYykgPT0gc2l6ZW9mKF9Ec3QpKT46Ol9SZXQgX1NhbWVTaXplOworCisjaWYgIWRlZmluZWQgKF9fQk9STEFORENfXykgfHwgKF9fQk9STEFORENfXyA8IDB4NTY0KQorICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0ludGVncmFsPF9TcmM+OjpfUmV0IF9JbnQxOworI2Vsc2UKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVW5RdWFsPF9TcmM+OjpfVHlwZSBfVW5RdVNyYzsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSXNJbnRlZ3JhbDxfVW5RdVNyYz46Ol9SZXQgX0ludDE7CisjZW5kaWYKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSXNJbnRlZ3JhbDxfRHN0Pjo6X1JldCBfSW50MjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfTGFuZDI8X0ludDEsIF9JbnQyPjo6X1JldCBfQm90aEludHM7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSXNSYXRpb25hbDxfU3JjPjo6X1JldCBfUmF0MTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSXNSYXRpb25hbDxfRHN0Pjo6X1JldCBfUmF0MjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfTGFuZDI8X1JhdDEsIF9SYXQyPjo6X1JldCBfQm90aFJhdHM7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBfTG9yMjxfQm90aEludHMsIF9Cb3RoUmF0cz46Ol9SZXQgX0JvdGhOYXRpdmVzOworI2lmICFkZWZpbmVkIChfX0JPUkxBTkRDX18pIHx8IChfX0JPUkxBTkRDX18gPj0gMHg1NjQpCisgIHR5cGVkZWYgdHlwZW5hbWUgX0xhbmQyPF9Cb3RoTmF0aXZlcywgX1NhbWVTaXplPjo6X1JldCBfVHJpdmlhbDI7CisjZWxzZQorICB0eXBlZGVmIHR5cGVuYW1lIF9Jc1VuUXVhbDxfRHN0Pjo6X1JldCBfVW5RdWFsRHN0OworICB0eXBlZGVmIHR5cGVuYW1lIF9MYW5kMzxfQm90aE5hdGl2ZXMsIF9TYW1lU2l6ZSwgX1VuUXVhbERzdD46Ol9SZXQgX1RyaXZpYWwyOworI2VuZGlmCisgIHR5cGVkZWYgdHlwZW5hbWUgX0xvcjI8X1RyaXZpYWwxLCBfVHJpdmlhbDI+OjpfUmV0IF9SZXQ7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1NyYywgY2xhc3MgX0RzdD4KK3N0cnVjdCBfVHJpdmlhbENvcHkgeworICB0eXBlZGVmIHR5cGVuYW1lIF9Ucml2aWFsTmF0aXZlVHlwZUNvcHk8X1NyYywgX0RzdD46Ol9SZXQgX05hdGl2ZVJldDsKKyMgIGlmICFkZWZpbmVkIChfX0JPUkxBTkRDX18pIHx8IChfX0JPUkxBTkRDX18gIT0gMHg1NjApCisgIHR5cGVkZWYgdHlwZW5hbWUgX190eXBlX3RyYWl0czxfU3JjPjo6aGFzX3RyaXZpYWxfYXNzaWdubWVudF9vcGVyYXRvciBfVHIxOworIyAgZWxzZQorICB0eXBlZGVmIHR5cGVuYW1lIF9VbkNvbnN0UHRyPF9TcmMqPjo6X1R5cGUgX1VuQ29uc3RTcmM7CisgIHR5cGVkZWYgdHlwZW5hbWUgX190eXBlX3RyYWl0czxfVW5Db25zdFNyYz46Omhhc190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3IgX1RyMTsKKyMgIGVuZGlmCisgIHR5cGVkZWYgdHlwZW5hbWUgX0FyZUNvcHlhYmxlPF9TcmMsIF9Ec3Q+OjpfUmV0IF9UcjI7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0xhbmQyPF9UcjEsIF9UcjI+OjpfUmV0IF9Vc2VyUmV0OworICB0eXBlZGVmIHR5cGVuYW1lIF9Mb3IyPF9OYXRpdmVSZXQsIF9Vc2VyUmV0Pjo6X1JldCBfUmV0OworICBzdGF0aWMgX1JldCBfQW5zd2VyKCkgeyByZXR1cm4gX1JldCgpOyB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1NyYywgY2xhc3MgX0RzdD4KK3N0cnVjdCBfVHJpdmlhbFVDb3B5IHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVHJpdmlhbE5hdGl2ZVR5cGVDb3B5PF9TcmMsIF9Ec3Q+OjpfUmV0IF9OYXRpdmVSZXQ7CisjICBpZiAhZGVmaW5lZCAoX19CT1JMQU5EQ19fKSB8fCAoX19CT1JMQU5EQ19fICE9IDB4NTYwKQorICB0eXBlZGVmIHR5cGVuYW1lIF9fdHlwZV90cmFpdHM8X1NyYz46Omhhc190cml2aWFsX2NvcHlfY29uc3RydWN0b3IgX1RyMTsKKyMgIGVsc2UKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVW5Db25zdFB0cjxfU3JjKj46Ol9UeXBlIF9VbkNvbnN0U3JjOworICB0eXBlZGVmIHR5cGVuYW1lIF9fdHlwZV90cmFpdHM8X1VuQ29uc3RTcmM+OjpoYXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yIF9UcjE7CisjICBlbmRpZgorICB0eXBlZGVmIHR5cGVuYW1lIF9BcmVDb3B5YWJsZTxfU3JjLCBfRHN0Pjo6X1JldCBfVHIyOworICB0eXBlZGVmIHR5cGVuYW1lIF9MYW5kMjxfVHIxLCBfVHIyPjo6X1JldCBfVXNlclJldDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfTG9yMjxfTmF0aXZlUmV0LCBfVXNlclJldD46Ol9SZXQgX1JldDsKKyAgc3RhdGljIF9SZXQgX0Fuc3dlcigpIHsgcmV0dXJuIF9SZXQoKTsgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfRGVmYXVsdFplcm9WYWx1ZSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0lzSW50ZWdyYWw8X1RwPjo6X1JldCBfVHIxOworICB0eXBlZGVmIHR5cGVuYW1lIF9Jc1JhdGlvbmFsPF9UcD46Ol9SZXQgX1RyMjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSXNQdHI8X1RwPjo6X1JldCBfVHIzOworICB0eXBlZGVmIHR5cGVuYW1lIF9Mb3IzPF9UcjEsIF9UcjIsIF9UcjM+OjpfUmV0IF9SZXQ7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9Ucml2aWFsSW5pdCB7CisjICBpZiAhZGVmaW5lZCAoX19CT1JMQU5EQ19fKSB8fCAoX19CT1JMQU5EQ19fICE9IDB4NTYwKQorICB0eXBlZGVmIHR5cGVuYW1lIF9fdHlwZV90cmFpdHM8X1RwPjo6aGFzX3RyaXZpYWxfZGVmYXVsdF9jb25zdHJ1Y3RvciBfVHIxOworIyAgZWxzZQorICB0eXBlZGVmIHR5cGVuYW1lIF9VbkNvbnN0UHRyPF9UcCo+OjpfVHlwZSBfVHAxOworICB0eXBlZGVmIHR5cGVuYW1lIF9fdHlwZV90cmFpdHM8X1RwMT46Omhhc190cml2aWFsX2NvcHlfY29uc3RydWN0b3IgX1RyMTsKKyMgIGVuZGlmCisgIHR5cGVkZWYgdHlwZW5hbWUgX0RlZmF1bHRaZXJvVmFsdWU8X1RwPjo6X1JldCBfVHIyOworICB0eXBlZGVmIHR5cGVuYW1lIF9Ob3Q8X1RyMj46Ol9SZXQgX1RyMzsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfTGFuZDI8X1RyMSwgX1RyMz46Ol9SZXQgX1JldDsKKyAgc3RhdGljIF9SZXQgX0Fuc3dlcigpIHsgcmV0dXJuIF9SZXQoKTsgfQorfTsKKworI2VuZGlmIC8qICFfU1RMUF9VU0VfQk9PU1RfU1VQUE9SVCAqLworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9Jc1B0clR5cGUgeworICB0eXBlZGVmIHR5cGVuYW1lIF9Jc1B0cjxfVHA+OjpfUmV0IF9UeXBlOworICBzdGF0aWMgX1R5cGUgX1JldCgpIHsgcmV0dXJuIF9UeXBlKCk7IH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX0lzUmVmVHlwZSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0lzUmVmPF9UcD46Ol9SZXQgX1R5cGU7CisgIHN0YXRpYyBfVHlwZSBfUmV0KCkgeyByZXR1cm4gX1R5cGUoKTt9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9fY2FsbF90cmFpdHMgeworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9CT09TVF9TVVBQT1JUKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX3NlbGVjdDwgOjpib29zdDo6aXNfcmVmZXJlbmNlPF9UcD46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSA6OmJvb3N0OjphZGRfY29uc3Q8X1RwPjo6dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgOjpib29zdDo6YWRkX3JlZmVyZW5jZTwgdHlwZW5hbWUgOjpib29zdDo6YWRkX2NvbnN0PF9UcD46OnR5cGUgPjo6dHlwZT46Ol9SZXQgY29uc3RfcGFyYW1fdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX3NlbGVjdDwgOjpib29zdDo6aXNfcmVmZXJlbmNlPF9UcD46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSA6OmJvb3N0OjpyZW1vdmVfY29uc3Q8X1RwPjo6dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgOjpib29zdDo6YWRkX3JlZmVyZW5jZTxfVHA+Ojp0eXBlPjo6X1JldCBwYXJhbV90eXBlOworI2Vsc2UKKyAgdHlwZWRlZiBjb25zdCBfVHAmIGNvbnN0X3BhcmFtX3R5cGU7CisgIHR5cGVkZWYgX1RwJiBwYXJhbV90eXBlOworI2VuZGlmCit9OworCisjaWYgIWRlZmluZWQgKF9TVExQX1VTRV9CT09TVF9TVVBQT1JUKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykgJiYgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX19jYWxsX3RyYWl0czxfVHAmPiB7CisgIHR5cGVkZWYgX1RwJiBwYXJhbV90eXBlOworICB0eXBlZGVmIGNvbnN0IF9UcCYgY29uc3RfcGFyYW1fdHlwZTsKK307Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9fY2FsbF90cmFpdHM8Y29uc3QgX1RwJj4geworICB0eXBlZGVmIF9UcCYgcGFyYW1fdHlwZTsKKyAgdHlwZWRlZiBjb25zdCBfVHAmIGNvbnN0X3BhcmFtX3R5cGU7Cit9OworI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAxLCBjbGFzcyBfVHAyPgorc3RydWN0IF9Cb3RoUHRyVHlwZSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0lzUHRyPF9UcDE+OjpfUmV0IF9Jc1B0cjE7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0lzUHRyPF9UcDI+OjpfUmV0IF9Jc1B0cjI7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBfTGFuZDI8X0lzUHRyMSwgX0lzUHRyMj46Ol9SZXQgX1JldDsKKyAgc3RhdGljIF9SZXQgX0Fuc3dlcigpIHsgcmV0dXJuIF9SZXQoKTsgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcDEsIGNsYXNzIF9UcDIsIGNsYXNzIF9Jc1JlZjEsIGNsYXNzIF9Jc1JlZjI+CitzdHJ1Y3QgX09LVG9Td2FwIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQXJlU2FtZVR5cGVzPF9UcDEsIF9UcDI+OjpfUmV0IF9TYW1lOworICB0eXBlZGVmIHR5cGVuYW1lIF9MYW5kMzxfU2FtZSwgX0lzUmVmMSwgX0lzUmVmMj46Ol9SZXQgX1R5cGU7CisgIHN0YXRpYyBfVHlwZSBfQW5zd2VyKCkgeyByZXR1cm4gX1R5cGUoKTsgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcDEsIGNsYXNzIF9UcDIsIGNsYXNzIF9Jc1JlZjEsIGNsYXNzIF9Jc1JlZjI+CitpbmxpbmUgX09LVG9Td2FwPF9UcDEsIF9UcDIsIF9Jc1JlZjEsIF9Jc1JlZjI+CitfSXNPS1RvU3dhcChfVHAxKiwgX1RwMiosIGNvbnN0IF9Jc1JlZjEmLCBjb25zdCBfSXNSZWYyJikKK3sgcmV0dXJuIF9PS1RvU3dhcDxfVHAxLCBfVHAyLCBfSXNSZWYxLCBfSXNSZWYyPigpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfU3JjLCBjbGFzcyBfRHN0PgoraW5saW5lIF9Ucml2aWFsQ29weTxfU3JjLCBfRHN0PiBfVXNlVHJpdmlhbENvcHkoX1NyYyosIF9Ec3QqKQoreyByZXR1cm4gX1RyaXZpYWxDb3B5PF9TcmMsIF9Ec3Q+KCk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9TcmMsIGNsYXNzIF9Ec3Q+CitpbmxpbmUgX1RyaXZpYWxVQ29weTxfU3JjLCBfRHN0PiBfVXNlVHJpdmlhbFVDb3B5KF9TcmMqLCBfRHN0KikKK3sgcmV0dXJuIF9Ucml2aWFsVUNvcHk8X1NyYywgX0RzdD4oKTsgfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSKSB8fCBkZWZpbmVkIChfX0JPUkxBTkRDX18pIHx8IFwKKyAgICBkZWZpbmVkIChfX0RNQ19fKQorc3RydWN0IF9OZWdhdGl2ZUFuc3dlciB7CisgIHR5cGVkZWYgX19mYWxzZV90eXBlIF9SZXQ7CisgIHN0YXRpYyBfUmV0IF9BbnN3ZXIoKSB7IHJldHVybiBfUmV0KCk7IH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfU3JjLCBjbGFzcyBfRHN0PgoraW5saW5lIF9OZWdhdGl2ZUFuc3dlciBfVXNlVHJpdmlhbENvcHkoX1NyYyosIGNvbnN0IF9Ec3QqKQoreyByZXR1cm4gX05lZ2F0aXZlQW5zd2VyKCk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9TcmMsIGNsYXNzIF9Ec3Q+CitpbmxpbmUgX05lZ2F0aXZlQW5zd2VyIF9Vc2VUcml2aWFsQ29weShfU3JjKiwgdm9sYXRpbGUgX0RzdCopCit7IHJldHVybiBfTmVnYXRpdmVBbnN3ZXIoKTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1NyYywgY2xhc3MgX0RzdD4KK2lubGluZSBfTmVnYXRpdmVBbnN3ZXIgX1VzZVRyaXZpYWxDb3B5KF9TcmMqLCBjb25zdCB2b2xhdGlsZSBfRHN0KikKK3sgcmV0dXJuIF9OZWdhdGl2ZUFuc3dlcigpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfU3JjLCBjbGFzcyBfRHN0PgoraW5saW5lIF9OZWdhdGl2ZUFuc3dlciBfVXNlVHJpdmlhbFVDb3B5KF9TcmMqLCBjb25zdCBfRHN0KikKK3sgcmV0dXJuIF9OZWdhdGl2ZUFuc3dlcigpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfU3JjLCBjbGFzcyBfRHN0PgoraW5saW5lIF9OZWdhdGl2ZUFuc3dlciBfVXNlVHJpdmlhbFVDb3B5KF9TcmMqLCB2b2xhdGlsZSBfRHN0KikKK3sgcmV0dXJuIF9OZWdhdGl2ZUFuc3dlcigpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfU3JjLCBjbGFzcyBfRHN0PgoraW5saW5lIF9OZWdhdGl2ZUFuc3dlciBfVXNlVHJpdmlhbFVDb3B5KF9TcmMqLCBjb25zdCB2b2xhdGlsZSBfRHN0KikKK3sgcmV0dXJuIF9OZWdhdGl2ZUFuc3dlcigpOyB9CisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfVHJpdmlhbEluaXQ8X1RwPiBfVXNlVHJpdmlhbEluaXQoX1RwKikKK3sgcmV0dXJuIF9Ucml2aWFsSW5pdDxfVHA+KCk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfSXNQT0QgeworICB0eXBlZGVmIHR5cGVuYW1lIF9fdHlwZV90cmFpdHM8X1RwPjo6aXNfUE9EX3R5cGUgX1R5cGU7CisgIHN0YXRpYyBfVHlwZSBfQW5zd2VyKCkgeyByZXR1cm4gX1R5cGUoKTsgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfSXNQT0Q8X1RwPiBfSXNfUE9EKF9UcCopCit7IHJldHVybiBfSXNQT0Q8X1RwPigpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX0RlZmF1bHRaZXJvVmFsdWVRdWVzdGlvbiB7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0RlZmF1bHRaZXJvVmFsdWU8X1RwPjo6X1JldCBfUmV0OworICBzdGF0aWMgX1JldCBfQW5zd2VyKCkgeyByZXR1cm4gX1JldCgpOyB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIF9EZWZhdWx0WmVyb1ZhbHVlUXVlc3Rpb248X1RwPiBfSGFzRGVmYXVsdFplcm9WYWx1ZShfVHAqKQoreyByZXR1cm4gX0RlZmF1bHRaZXJvVmFsdWVRdWVzdGlvbjxfVHA+KCk7IH0KKworLyoKKyAqIEJhc2UgY2xhc3MgdXNlZDoKKyAqIC0gdG8gc2ltdWxhdGUgcGFydGlhbCB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbgorICogLSB0byBzaW11bGF0ZSBwYXJ0aWFsIGZ1bmN0aW9uIG9yZGVyaW5nCisgKiAtIHRvIHJlY29nbml6ZSBTVExwb3J0IGNsYXNzIGZyb20gdXNlciBzcGVjaWFsaXplZCBvbmUKKyAqLwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfX3N0bHBvcnRfY2xhc3MKK3sgdHlwZWRlZiBfVHAgX1R5cGU7IH07CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX0lzU1RMcG9ydENsYXNzIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSXNDb252ZXJ0aWJsZTxfVHAsIF9fc3RscG9ydF9jbGFzczxfVHA+ID46Ol9SZXQgX1JldDsKKyNpZiBkZWZpbmVkIChfX0JPUkxBTkRDX18pCisgIGVudW0geyBfSXMgPSBfSXNDb252ZXJ0aWJsZTxfVHAsIF9fc3RscG9ydF9jbGFzczxfVHA+ID46OnZhbHVlIH07CisjZW5kaWYKK307CisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUEFSVElBTF9TUEVDX1dPUktBUk9VTkQpICYmICFkZWZpbmVkIChfU1RMUF9GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIpCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9Td2FwSW1wbGVtZW50ZWQgeworICB0eXBlZGVmIHR5cGVuYW1lIF9Jc1NUTHBvcnRDbGFzczxfVHA+OjpfUmV0IF9SZXQ7CisjICBpZiBkZWZpbmVkIChfX0JPUkxBTkRDX18pCisgIGVudW0geyBfSXMgPSBfSXNTVExwb3J0Q2xhc3M8X1RwPjo6X0lzIH07CisjICBlbmRpZgorfTsKKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorY2xhc3MgX1RwV2l0aFN0YXRlIDogcHJpdmF0ZSBfVHAgeworICBfVHBXaXRoU3RhdGUoKTsKKyAgaW50IF9zdGF0ZTsKK307CisKKy8qIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVscGVyIHN0cnVjdCB1c2VkIHRvIGd1ZXNzIGlmIHdlIGFyZSB3b3JraW5nCisgKiBvbiBhIHN0YXRlbGVzcyBjbGFzcy4gSXQgY2FuIG9ubHkgYmUgaW5zdGFuY2lhdGVkIHdpdGggYSBjbGFzcyB0eXBlLiAqLwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfSXNTdGF0ZWxlc3MgeworICBlbnVtIHsgX0lzID0gc2l6ZW9mKF9UcFdpdGhTdGF0ZTxfVHA+KSA9PSBzaXplb2YoaW50KSB9OworICB0eXBlZGVmIHR5cGVuYW1lIF9fYm9vbDJ0eXBlPF9Jcz46Ol9SZXQgX1JldDsKK307CisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2lmZGVmIF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04KKyMgIGlmIGRlZmluZWQgKF9fQk9STEFORENfXykgfHwgXAorICAgICAgZGVmaW5lZCAoX19TVU5QUk9fQ0MpIHx8ICBcCisgICAgIChkZWZpbmVkIChfX01XRVJLU19fKSAmJiAoX19NV0VSS1NfXyA8PSAweDIzMDMpKSB8fCBcCisgICAgIChkZWZpbmVkIChfX3NnaSkgJiYgZGVmaW5lZCAoX0NPTVBJTEVSX1ZFUlNJT04pKSB8fCBcCisgICAgICBkZWZpbmVkIChfX0RNQ19fKQorIyAgICBkZWZpbmUgX1NUTFBfSVNfUE9EX0lURVIoX0l0LCBfVHApIF9fdHlwZV90cmFpdHM8IHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czwgX1RwID46OnZhbHVlX3R5cGUgPjo6aXNfUE9EX3R5cGUoKQorIyAgZWxzZQorIyAgICBkZWZpbmUgX1NUTFBfSVNfUE9EX0lURVIoX0l0LCBfVHApIHR5cGVuYW1lIF9fdHlwZV90cmFpdHM8IHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czwgX1RwID46OnZhbHVlX3R5cGUgPjo6aXNfUE9EX3R5cGUoKQorIyAgZW5kaWYKKyNlbHNlCisjICBkZWZpbmUgX1NUTFBfSVNfUE9EX0lURVIoX0l0LCBfVHApIF9Jc19QT0QoIF9TVExQX1ZBTFVFX1RZUEUoIF9JdCwgX1RwICkgKS5fQW5zd2VyKCkKKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfVFlQRV9UUkFJVFNfSCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdHJlYW1idWYgYi9zdGxwb3J0L3N0cmVhbWJ1ZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGRjMjUzCi0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC9zdHJlYW1idWYKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKyNpZm5kZWYgX1NUTFBfU1RSRUFNQlVGCisKKyNpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHgxMDY2CisjICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgorIyAgZGVmaW5lIF9TVExQX1NUUkVBTUJVRgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDEwNjYpICYmIFwKKyAgICEoZGVmaW5lZCAoX1NUTFBfTk9fSU9TVFJFQU1TKSAmJiBkZWZpbmVkIChfU1RMUF9JTVBPUlRfVkVORE9SX1NURCkpCisjICBpbmNsdWRlIDxzdGwvX2lvc2Vyci5oPgorCisjICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfU1RSRUFNQlVGCisjICAgIGluY2x1ZGUgPHN0bC9fc3RyZWFtYnVmLmg+CisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAhPSAweDEwNjYpIHx8IGRlZmluZWQgKF9TVExQX0lNUE9SVF9WRU5ET1JfU1REKQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfSEFTX0lOQ0xVREVfTkVYVCkKKyMgICAgaW5jbHVkZV9uZXh0IDxzdHJlYW1idWY+CisjICBlbHNlCisjICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0hFQURFUihzdHJlYW1idWYpCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDEwNjYpCisjICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9TVFJFQU1CVUYgKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0cmVhbWJ1Zi5oIGIvc3RscG9ydC9zdHJlYW1idWYuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3RyZWFtYnVmLmgKcmVuYW1lIHRvIHN0bHBvcnQvc3RyZWFtYnVmLmgKZGlmZiAtLWdpdCBhL3N0bHBvcnQvc3RyaW5nIGIvc3RscG9ydC9zdHJpbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRkNDU4OQotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc3RyaW5nCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMTk5OQorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9TVFJJTkcKKworI2lmbmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDY4CisjICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgorIyAgZGVmaW5lIF9TVExQX1NUUklORworI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDY4KQorIyAgaWZuZGVmIF9TVExQX0lOVEVSTkFMX1NUUklOR19ICisjICAgIGluY2x1ZGUgPHN0bC9fc3RyaW5nLmg+CisjICBlbmRpZgorCisjICBpZm5kZWYgX1NUTFBfU1RSSU5HX0hBU0hfSAorIyAgICBpbmNsdWRlIDxzdGwvX3N0cmluZ19oYXNoLmg+CisjICBlbmRpZgorCisjICBpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX05PX0lPU1RSRUFNUykgJiYgIWRlZmluZWQgKF9TVExQX1NUUklOR19JT19IKQorIyAgICBpbmNsdWRlIDxzdGwvX3N0cmluZ19pby5oPgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgIT0gMHg2OCkgfHwgZGVmaW5lZCAoX1NUTFBfSU1QT1JUX1ZFTkRPUl9TVEQpCisjICBpZiBkZWZpbmVkIChfU1RMUF9IQVNfSU5DTFVERV9ORVhUKQorIyAgICBpbmNsdWRlX25leHQgPHN0cmluZz4KKyMgIGVsc2UKKyMgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfSEVBREVSKHN0cmluZykKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4NjgpCisjICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9TVFJJTkcgKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKKwpkaWZmIC0tZ2l0IGEvc3RscG9ydC9zdHJpbmcuaCBiL3N0bHBvcnQvc3RyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIwMTNjZgotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvc3RyaW5nLmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKy8qIFdvcmthcm91bmQgZm9yIGEgIm1pc2JlaGF2aW91ciIgd2hlbiBjb21waWxpbmcgcmVzb3VyY2Ugc2NyaXB0cyB1c2luZworICogZU1iZWRkZWQgVmlzdWFsIEMrKy4gVGhlIHN0YW5kYXJkIC5yYyBmaWxlIGluY2x1ZGVzIHdpbmRvd3MgaGVhZGVyIGZpbGVzLAorICogd2hpY2ggaW4gdHVybiBpbmNsdWRlIHN0cmluZy5oLCB3aGljaCByZXN1bHRzIGluIHdhcm5pbmdzIGFuZCBlcnJvcnMKKyAqLworI2lmbmRlZiBfU1RMUF9TVFJJTkdfSAorCisjaWYgIWRlZmluZWQgKFJDX0lOVk9LRUQpCisKKyMgIGlmbmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjICAgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MjY5CisjICAgIGluY2x1ZGUgPHN0bC9fY3Byb2xvZy5oPgorIyAgZWxpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDI2OSkgJiYgIWRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKKyMgICAgZGVmaW5lIF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRAorIyAgICBkZWZpbmUgX1NUTFBfU1RSSU5HX0gKKyMgIGVuZGlmCisKKyMgIGlmIGRlZmluZWQoX1NUTFBfV0NFX0VWQzMpCitzdHJ1Y3QgX2V4Y2VwdGlvbjsKKyMgIGVuZGlmCisjICBpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAhPSAweDI2OSkgfHwgZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQorIyAgICBpZiBkZWZpbmVkIChfU1RMUF9IQVNfSU5DTFVERV9ORVhUKQorIyAgICAgIGluY2x1ZGVfbmV4dCA8c3RyaW5nLmg+CisjICAgIGVsc2UKKyMgICAgICBpbmNsdWRlIF9TVExQX05BVElWRV9DX0hFQURFUihzdHJpbmcuaCkKKyMgICAgZW5kaWYKKyMgIGVsc2UKKyMgICAgaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKSAmJiAhZGVmaW5lZCAoX19saW51eF9fKQorIyAgICAgIGlmIGRlZmluZWQgKF9TVExQX0hBU19JTkNMVURFX05FWFQpCisjICAgICAgICBpbmNsdWRlX25leHQgPF9zdHIuaD4KKyMgICAgICBlbHNlCisjICAgICAgICBpbmNsdWRlIF9TVExQX05BVElWRV9DUFBfQ19IRUFERVIoX3N0ci5oKQorIyAgICAgIGVuZGlmCisjICAgIGVsc2UKKyMgICAgICBpZiBkZWZpbmVkIChfU1RMUF9IQVNfSU5DTFVERV9ORVhUKQorIyAgICAgICAgaW5jbHVkZV9uZXh0IDxzdHJpbmcuaD4KKyMgICAgICBlbHNlCisjICAgICAgICBpbmNsdWRlIF9TVExQX05BVElWRV9DX0hFQURFUihzdHJpbmcuaCkKKyMgICAgICBlbmRpZgorIyAgICBlbmRpZgorIyAgZW5kaWYKKworIyAgaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgyNjkpCisjICAgIGlmICFkZWZpbmVkIChfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQpCisjICAgICAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgICAgICB1bmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjICAgIGVsc2UKKyMgICAgICB1bmRlZiBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYgLyogUkNfSU5WT0tFRCAqLworI2VuZGlmIC8qIF9TVExQX1NUUklOR19IICovCmRpZmYgLS1naXQgYS9zdGxwb3J0L3N0cnN0cmVhbSBiL3N0bHBvcnQvc3Ryc3RyZWFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NzU3NGYKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3N0cnN0cmVhbQpAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworLy8gV0FSTklORzogVGhlIGNsYXNzZXMgZGVmaW5lZCBpbiB0aGlzIGhlYWRlciBhcmUgREVQUkVDQVRFRC4gIFRoaXMKKy8vIGhlYWRlciBpcyBkZWZpbmVkIGluIHNlY3Rpb24gRC43LjEgb2YgdGhlIEMrKyBzdGFuZGFyZCwgYW5kIGl0CisvLyBNQVkgQkUgUkVNT1ZFRCBpbiBhIGZ1dHVyZSBzdGFuZGFyZCByZXZpc2lvbi4gIFlvdSBzaG91bGQgdXNlIHRoZQorLy8gaGVhZGVyIDxzc3RyZWFtPiBpbnN0ZWFkLgorCisKKyNpZm5kZWYgX1NUTFBfU1RSU1RSRUFNCisKKyNpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHgxMDcwCisjICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgorIyAgZGVmaW5lIF9TVExQX1NUUlNUUkVBTQorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDEwNzApICYmIFwKKyAgICEoZGVmaW5lZCAoX1NUTFBfTk9fSU9TVFJFQU1TKSAmJiBkZWZpbmVkIChfU1RMUF9JTVBPUlRfVkVORE9SX1NURCkpCisjICBpbmNsdWRlIDxzdGwvX2lvc2Vyci5oPgorCisjICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfU1RSU1RSRUFNCisjICAgIGluY2x1ZGUgPHN0bC9fc3Ryc3RyZWFtLmg+CisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAhPSAweDEwNzApIHx8IGRlZmluZWQgKF9TVExQX0lNUE9SVF9WRU5ET1JfU1REKQorLyogRXZlbiBpZiBkZXByZWNhdGVkIHN0cnN0cmVhbSBoZWFkZXIgaXMgc3RpbGwgcGFydCBvZiB0aGUgU3RhbmRhcmQuIFJlbW92ZQorICogX1NUTFBfSU1QT1JUX1ZFTkRPUl9TVEQgY2hlY2sgaWYgdGhlIG5hdGl2ZSBjb21waWxlciBsaWJyYXJ5IGRvIG5vdCBncmFudAorICogaXQgYW55bW9yZS4gKi8KKyMgIGlmIGRlZmluZWQgKF9TVExQX0hBU19JTkNMVURFX05FWFQpCisjICAgIGluY2x1ZGVfbmV4dCA8c3Ryc3RyZWFtPgorIyAgZWxzZQorIyAgICBpbmNsdWRlIF9TVExQX05BVElWRV9IRUFERVIoc3Ryc3RyZWFtKQorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgxMDcwKQorIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfU1RSU1RSRUFNICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdHJzdHJlYW0uaCBiL3N0bHBvcnQvc3Ryc3RyZWFtLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHN0cnN0cmVhbS5oCnJlbmFtZSB0byBzdGxwb3J0L3N0cnN0cmVhbS5oCmRpZmYgLS1naXQgYS9zdGxwb3J0L3RpbWUuaCBiL3N0bHBvcnQvdGltZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3M2FhODUKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3RpbWUuaApAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmICFkZWZpbmVkIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEKQorIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHgyNzIKKyMgIGluY2x1ZGUgPHN0bC9fY3Byb2xvZy5oPgorI2VsaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgyNzIpICYmICEgZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQorIyAgZGVmaW5lIF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRAorI2VuZGlmCisKKyNpZmRlZiBfU1RMUF9XQ0VfRVZDMworLyogb25seSBzaG93IG1lc3NhZ2Ugd2hlbiBkaXJlY3RseSBpbmNsdWRpbmcgdGhpcyBmaWxlIGluIGEgbm9uLWxpYnJhcnkgYnVpbGQgKi8KKyMgIGlmICFkZWZpbmVkKF9fQlVJTERJTkdfU1RMUE9SVCkgJiYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgyNzIpCisjICAgIHByYWdtYSBtZXNzYWdlKCJlTWJlZGRlZCBWaXN1YWwgQysrIDMgZG9lc24ndCBoYXZlIGEgdGltZS5oIGhlYWRlcjsgU1RMcG9ydCB3b24ndCBpbmNsdWRlIG5hdGl2ZSB0aW1lLmggaGVyZSIpCisjICBlbmRpZgorI2Vsc2UKKyMgIGlmIGRlZmluZWQgKF9TVExQX0hBU19JTkNMVURFX05FWFQpCisjICAgIGluY2x1ZGVfbmV4dCA8dGltZS5oPgorIyAgZWxzZQorIyAgICBpbmNsdWRlIF9TVExQX05BVElWRV9DX0hFQURFUih0aW1lLmgpCisjICBlbmRpZgorI2VuZGlmCisKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MjcyKQorIyAgaWYgISBkZWZpbmVkIChfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQpCisjICAgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+CisjICAgIHVuZGVmICBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjICBlbHNlCisjICAgIHVuZGVmICBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKKyMgIGVuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N0bHBvcnQvdHlwZV90cmFpdHMgYi9zdGxwb3J0L3R5cGVfdHJhaXRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZmUyMzQKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3R5cGVfdHJhaXRzCkBAIC0wLDAgKzEsNzk4IEBACisvLyAtKi0gQysrIC0qLSBUaW1lLXN0YW1wOiA8MDgvMDcvMjAgMTk6MTA6MTUgcHRyPgorCisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4CisgKiBQZXRyIE92dGNoZW5rb3YKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMy4wCisgKgorICogRGVyaXZlZCBmcm9tIG9yaWdpbmFsIDxtaXNjL3R5cGVfdHJhaXRzLmg+IG9mICdjb21wbGVtZW50JyBwcm9qZWN0CisgKiBbaHR0cDovL2NvbXBsZW1lbnQuc291cmNlZm9yZ2UubmV0XQorICogdG8gbWFrZSBpdCBjbG9zZSB0byBKVEMxL1NDMjIvV0cyMSBDKysgMHggd29ya2luZyBkcmFmdAorICogW2h0dHA6Ly93d3cub3Blbi1zdGQub3JnL0p0YzEvc2MyMi93ZzIxL2RvY3MvcGFwZXJzLzIwMDgvbjI1MjEucGRmXQorICovCisKKyNpZm5kZWYgX19TVExQX1RZUEVfVFJBSVRTCisjZGVmaW5lIF9fU1RMUF9UWVBFX1RSQUlUUworCisjaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MworIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KKyNlbmRpZgorCisvLyBsaWJzdGRjKysgdjMsIHRpbWVzdGFtcCAyMDA1MDUxOSAoMy40LjQpIGhhcyBfX3R5cGVfdHJhaXRzLAorLy8gbGlic3RkYysrIHYzLCB0aW1lc3RhbXAgMjAwNjAzMDYgKDMuNC42KSBoYXMgX190eXBlX3RyYWl0cywKKy8vIHdoaWxlIGxpYnN0ZGMrKyB2MywgMjAwNTA5MjEgKDQuMC4yKSBub3Q7IHVzZSBsaWJzdGRjKysgaW5zdGVhZAorLy8gIyBpZiBkZWZpbmVkKFNUTFBPUlQpIHx8IChkZWZpbmVkKF9fR05VQ19fKSAmJiAoX19HTlVDX18gPCA0KSkgLyogIWRlZmluZWQoX19HTElCQ1hYX18pIHx8IChkZWZpbmVkKF9fR05VQ19fKSAmJiAoX19HTlVDX18gPCA0KSkgKi8KKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKK19TVExQX0JFR0lOX1RSMV9OQU1FU1BBQ0UKKworbmFtZXNwYWNlIGRldGFpbCB7CisKK3N0cnVjdCBfX3NlbGVjdF90eXBlcworeworICAgIHR5cGVkZWYgY2hhciBfX3QxOworICAgIHN0cnVjdCBfX3QyCisgICAgeworICAgICAgICBjaGFyIF9fdHdvWzJdOworICAgIH07Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9faW5zdGFuY2UgOgorICAgIHB1YmxpYyBfX3NlbGVjdF90eXBlcworeworICBwcml2YXRlOgorICAgIHRlbXBsYXRlIDxjbGFzcyBfVXA+CisgICAgc3RhdGljIF9fdDEgX190ZXN0KF9VcCgqKVsxXSk7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3M+CisgICAgc3RhdGljIF9fdDIgX190ZXN0KC4uLik7CisgICAgCisgIHB1YmxpYzoKKyNpZmRlZiBfU1RMUF9TVEFUSUNfQ09OU1RfSU5JVF9CVUcKKyAgICBzdGF0aWMgY29uc3QgYm9vbCBfX3ZhbHVlOworI2Vsc2UKKyAgICBzdGF0aWMgY29uc3QgYm9vbCBfX3ZhbHVlID0gc2l6ZW9mKF9fdGVzdDxfVHA+KDApKSA9PSBzaXplb2YoX19zZWxlY3RfdHlwZXM6Ol9fdDEpOworI2VuZGlmCisKK307CisKKyNpZmRlZiBfU1RMUF9TVEFUSUNfQ09OU1RfSU5JVF9CVUcKK3RlbXBsYXRlIDxjbGFzcyBfVHA+Citjb25zdCBib29sIF9faW5zdGFuY2U8X1RwPjo6X192YWx1ZSA9IHNpemVvZihfX2luc3RhbmNlPF9UcD46Ol9fdGVzdDxfVHA+KDApKSA9PSBzaXplb2YoX19zZWxlY3RfdHlwZXM6Ol9fdDEpOworI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBUPgorc3RydWN0IF9fdW9jX2F1eCA6IC8vIHVuaW9uIG9yIGNsYXNzCisgICAgcHVibGljIF9fc2VsZWN0X3R5cGVzCit7CisgIHByaXZhdGU6CisgICAgdGVtcGxhdGUgPGNsYXNzIF9VcD4KKyAgICBzdGF0aWMgX190MSBfX3Rlc3QoIGludCBfVXA6OiogKTsKKworICAgIHRlbXBsYXRlIDxjbGFzcz4KKyAgICBzdGF0aWMgX190MiBfX3Rlc3QoLi4uKTsKKyAgICAKKyAgcHVibGljOgorI2lmZGVmIF9fRklUX05PX0lOTElORV9URU1QTEFURV9TVEFUSUNfSU5JVElBTElTQVRJT04KKyAgICBzdGF0aWMgY29uc3QgYm9vbCBfX3ZhbHVlOworI2Vsc2UKKyAgICBzdGF0aWMgY29uc3QgYm9vbCBfX3ZhbHVlID0gc2l6ZW9mKF9fdGVzdDxUPigwKSkgPT0gc2l6ZW9mKF9fc2VsZWN0X3R5cGVzOjpfX3QxKTsKKyNlbmRpZgorfTsKKworI2lmZGVmIF9fRklUX05PX0lOTElORV9URU1QTEFURV9TVEFUSUNfSU5JVElBTElTQVRJT04KK3RlbXBsYXRlIDxjbGFzcyBUPgorY29uc3QgYm9vbCBfX3VvY19hdXg8VD46Ol9fdmFsdWUgPSBzaXplb2YoX191b2NfYXV4PFQ+OjpfX3Rlc3Q8VD4oMCkpID09IHNpemVvZihfX3NlbGVjdF90eXBlczo6X190MSk7CisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIFQ+CitjbGFzcyBfX2VtcHR5Cit7IH07CisKK3RlbXBsYXRlIDxjbGFzcyBULCBib29sIEI+CitjbGFzcyBfX2luaGVyaXRhbmNlX2F1eAore307CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorY2xhc3MgX19pbmhlcml0YW5jZV9hdXg8VCx0cnVlPiA6CisgICAgcHVibGljIFQKK3sKKyAgcHVibGljOgorICAgIHZpcnR1YWwgfl9faW5oZXJpdGFuY2VfYXV4KCkKKyAgICAgIHsgfQorfTsKKworI2lmIDAKK3RlbXBsYXRlIDxjbGFzcyBULCBib29sIEI+CitzdHJ1Y3QgX192aXJ0dWFsX2F1eAoreworICBwdWJsaWM6CisjaWZkZWYgX1NUTFBfU1RBVElDX0NPTlNUX0lOSVRfQlVHCisgICAgc3RhdGljIGNvbnN0IGJvb2wgX192YWx1ZTsKKyNlbHNlCisgICAgc3RhdGljIGNvbnN0IGJvb2wgX192YWx1ZSA9IEIgPyAoc2l6ZW9mKF9faW5oZXJpdGFuY2VfYXV4PFQsQj4pID09IHNpemVvZihUKSkgOiBmYWxzZTsKKyNlbmRpZgorfTsKKworI2lmZGVmIF9TVExQX1NUQVRJQ19DT05TVF9JTklUX0JVRwordGVtcGxhdGUgPGNsYXNzIFQsIGJvb2wgQj4KK2NvbnN0IGJvb2wgX192aXJ0dWFsX2F1eDxULEI+OjpfX3ZhbHVlID0gQiA/IChzaXplb2YoX19pbmhlcml0YW5jZV9hdXg8VCxCPikgPT0gc2l6ZW9mKFQpKSA6IGZhbHNlOworI2VuZGlmCisjZW5kaWYKKworfSAvLyBuYW1lc3BhY2UgZGV0YWlsCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIF9UcCBfX3Y+CitzdHJ1Y3QgaW50ZWdyYWxfY29uc3RhbnQKK3sKKyAgICBzdGF0aWMgY29uc3QgX1RwICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IF9fdjsKKyAgICAvLyBlbnVtIHsgdmFsdWUgPSBfX3YgfTsgPworCisgICAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIGludGVncmFsX2NvbnN0YW50PF9UcCwgX192PiB0eXBlOworfTsKKwordHlwZWRlZiBpbnRlZ3JhbF9jb25zdGFudDxib29sLCB0cnVlPiAgIHRydWVfdHlwZTsKK3R5cGVkZWYgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgZmFsc2U+ICBmYWxzZV90eXBlOworCituYW1lc3BhY2UgZGV0YWlsIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIF9UcD4KK3N0cnVjdCBfX2lzX3VuaW9uX29yX2NsYXNzIDoKKyAgICBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgX191b2NfYXV4PF9UcD46Ol9fdmFsdWU+Cit7IH07CisKKyNpZiAwCit0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CitzdHJ1Y3QgX19pc192dGJsIDogLy8gaGFzIHZpcnR1YWwgdGFibGU/CisgICAgcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9fdmlydHVhbF9hdXg8X1RwLF9faXNfdW5pb25fb3JfY2xhc3M8X1RwPjo6dmFsdWUgPjo6X192YWx1ZT4KK3sgfTsKKyNlbmRpZgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwPgorc3RydWN0IF9faXNfdnRibCA6IC8vIGhhcyB2aXJ0dWFsIHRhYmxlPworICAgIHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBfX2lzX3VuaW9uX29yX2NsYXNzPF9UcD46OnZhbHVlID8gKHNpemVvZihfX2luaGVyaXRhbmNlX2F1eDxfVHAsX19pc191bmlvbl9vcl9jbGFzczxfVHA+Ojp2YWx1ZT4pID09IHNpemVvZihfVHApKSA6IGZhbHNlID4KK3sgfTsKKworfSAvLyBuYW1lc3BhY2UgZGV0YWlsCisKKyNkZWZpbmUgIF9fU1BFQ18oQyxULEIpICAgICAgICAgICAgICAgXAordGVtcGxhdGUgPD4gICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdHJ1Y3QgQzxUPiA6ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgQj4gXAoreyB9CisKKyNkZWZpbmUgX19DVl9TUEVDKEMsVCxCKSBcCitfX1NQRUNfKEMsVCxCKTsgICAgICAgICAgICBcCitfX1NQRUNfKEMsY29uc3QgVCxCKTsgICAgICBcCitfX1NQRUNfKEMsdm9sYXRpbGUgVCxCKTsgICBcCitfX1NQRUNfKEMsY29uc3Qgdm9sYXRpbGUgVCxCKQorCisjZGVmaW5lICBfX1NQRUNfMShDLFQsQikgICAgICAgICAgICAgIFwKK3RlbXBsYXRlIDxjbGFzcyBfVHA+ICAgICAgICAgICAgICAgICAgXAorc3RydWN0IEM8VD4gOiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIEI+IFwKK3sgfQorCisjZGVmaW5lIF9fQ1ZfU1BFQ18xKEMsVCxCKSBcCitfX1NQRUNfMShDLFQsQik7ICAgICAgICAgICAgXAorX19TUEVDXzEoQyxUIGNvbnN0LEIpOyAgICAgIFwKK19fU1BFQ18xKEMsVCB2b2xhdGlsZSxCKTsgICBcCitfX1NQRUNfMShDLFQgY29uc3Qgdm9sYXRpbGUsQikKKworI2RlZmluZSAgX19TUEVDXzIoQyxULEIpICAgICAgICAgICAgICBcCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwMSwgY2xhc3MgX1RwMj4gICAgIFwKK3N0cnVjdCBDPFQ+IDogICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBCPiBcCit7IH0KKworI2RlZmluZSBfX0NWX1NQRUNfMihDLFQsQikgXAorX19TUEVDXzIoQyxULEIpOyAgICAgICAgICAgIFwKK19fU1BFQ18yKEMsVCBjb25zdCxCKTsgICAgICBcCitfX1NQRUNfMihDLFQgdm9sYXRpbGUsQik7ICAgXAorX19TUEVDXzIoQyxUIGNvbnN0IHZvbGF0aWxlLEIpCisKKy8vIFs0LjUuMV0gcHJpbWFyeSB0eXBlIGNhdGVnb3JpZXM6CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgaXNfdm9pZCA6CisgICAgcHVibGljIGZhbHNlX3R5cGUKK3sgfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBpc192b2lkPHZvaWQ+IDoKKyAgICBwdWJsaWMgdHJ1ZV90eXBlCit7IH07CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgaXNfaW50ZWdyYWwgOgorICAgIHB1YmxpYyBmYWxzZV90eXBlCit7IH07CisKK19fQ1ZfU1BFQyhpc19pbnRlZ3JhbCxib29sLHRydWUpOworX19DVl9TUEVDKGlzX2ludGVncmFsLGNoYXIsdHJ1ZSk7CitfX0NWX1NQRUMoaXNfaW50ZWdyYWwsc2lnbmVkIGNoYXIsdHJ1ZSk7CitfX0NWX1NQRUMoaXNfaW50ZWdyYWwsdW5zaWduZWQgY2hhcix0cnVlKTsKK19fQ1ZfU1BFQyhpc19pbnRlZ3JhbCx3Y2hhcl90LHRydWUpOworX19DVl9TUEVDKGlzX2ludGVncmFsLHNob3J0LHRydWUpOworX19DVl9TUEVDKGlzX2ludGVncmFsLHVuc2lnbmVkIHNob3J0LHRydWUpOworX19DVl9TUEVDKGlzX2ludGVncmFsLGludCx0cnVlKTsKK19fQ1ZfU1BFQyhpc19pbnRlZ3JhbCx1bnNpZ25lZCBpbnQsdHJ1ZSk7CitfX0NWX1NQRUMoaXNfaW50ZWdyYWwsbG9uZyx0cnVlKTsKK19fQ1ZfU1BFQyhpc19pbnRlZ3JhbCx1bnNpZ25lZCBsb25nLHRydWUpOworX19DVl9TUEVDKGlzX2ludGVncmFsLGxvbmcgbG9uZyx0cnVlKTsKK19fQ1ZfU1BFQyhpc19pbnRlZ3JhbCx1bnNpZ25lZCBsb25nIGxvbmcsdHJ1ZSk7CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgaXNfZmxvYXRpbmdfcG9pbnQgOgorICAgIHB1YmxpYyBmYWxzZV90eXBlCit7IH07CisKK19fQ1ZfU1BFQyhpc19mbG9hdGluZ19wb2ludCxmbG9hdCx0cnVlKTsKK19fQ1ZfU1BFQyhpc19mbG9hdGluZ19wb2ludCxkb3VibGUsdHJ1ZSk7CitfX0NWX1NQRUMoaXNfZmxvYXRpbmdfcG9pbnQsbG9uZyBkb3VibGUsdHJ1ZSk7CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgaXNfYXJyYXkgOgorICAgIHB1YmxpYyBmYWxzZV90eXBlCit7IH07CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIHN0ZDo6c2l6ZV90IF9Tej4KK3N0cnVjdCBpc19hcnJheTxfVHBbX1N6XT4gOgorICAgIHB1YmxpYyB0cnVlX3R5cGUKK3sgfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBpc19hcnJheTxfVHBbXT4gOgorICAgIHB1YmxpYyB0cnVlX3R5cGUKK3sgfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBpc19wb2ludGVyIDoKKyAgICBwdWJsaWMgZmFsc2VfdHlwZQoreyB9OworCitfX0NWX1NQRUNfMShpc19wb2ludGVyLF9UcCAqLHRydWUpOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IGlzX2x2YWx1ZV9yZWZlcmVuY2UgOgorICAgIHB1YmxpYyBmYWxzZV90eXBlCit7IH07CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgaXNfbHZhbHVlX3JlZmVyZW5jZTxfVHAmPiA6CisgICAgcHVibGljIHRydWVfdHlwZQoreyB9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IGlzX3J2YWx1ZV9yZWZlcmVuY2UgOgorICAgIHB1YmxpYyBmYWxzZV90eXBlCit7IH07CisKKy8vIHRlbXBsYXRlIDxjbGFzcyBfVHA+CisvLyBzdHJ1Y3QgaXNfcnZhbHVlX3JlZmVyZW5jZTxfVHAmJj4gOgorLy8gICAgIHB1YmxpYyB0cnVlX3R5cGUKKy8vIHsgfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBpc19yZWZlcmVuY2UgOgorICAgIHB1YmxpYyBmYWxzZV90eXBlCit7IH07CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgaXNfcmVmZXJlbmNlPF9UcCY+IDoKKyAgICBwdWJsaWMgdHJ1ZV90eXBlCit7IH07CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgaXNfZnVuY3Rpb24gOgorICAgIHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCAhKGRldGFpbDo6X19pbnN0YW5jZTxfVHA+OjpfX3ZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgZGV0YWlsOjpfX2lzX3VuaW9uX29yX2NsYXNzPF9UcD46OnZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgaXNfcmVmZXJlbmNlPF9UcD46OnZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgaXNfdm9pZDxfVHA+Ojp2YWx1ZSk+Cit7IH07CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgaXNfbWVtYmVyX29iamVjdF9wb2ludGVyIDoKKyAgICBwdWJsaWMgZmFsc2VfdHlwZQoreyB9OworCisvLyBfU1BFQ19GVUxMMihpc19tZW1iZXJfb2JqZWN0X3BvaW50ZXIsIF9UcDEgX1RwMjo6KiwhaXNfZnVuY3Rpb248X1RwMT46OnZhbHVlKTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcDEsIGNsYXNzIF9UcDI+CitzdHJ1Y3QgaXNfbWVtYmVyX29iamVjdF9wb2ludGVyPF9UcDEgX1RwMjo6Kj4gOgorICAgIHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCAhaXNfZnVuY3Rpb248X1RwMT46OnZhbHVlPgoreyB9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwMSwgY2xhc3MgX1RwMj4KK3N0cnVjdCBpc19tZW1iZXJfb2JqZWN0X3BvaW50ZXI8X1RwMSBfVHAyOjoqIGNvbnN0PiA6CisgICAgcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsICFpc19mdW5jdGlvbjxfVHAxPjo6dmFsdWU+Cit7IH07CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAxLCBjbGFzcyBfVHAyPgorc3RydWN0IGlzX21lbWJlcl9vYmplY3RfcG9pbnRlcjxfVHAxIF9UcDI6Oiogdm9sYXRpbGU+IDoKKyAgICBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgIWlzX2Z1bmN0aW9uPF9UcDE+Ojp2YWx1ZT4KK3sgfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcDEsIGNsYXNzIF9UcDI+CitzdHJ1Y3QgaXNfbWVtYmVyX29iamVjdF9wb2ludGVyPF9UcDEgX1RwMjo6KiBjb25zdCB2b2xhdGlsZT4gOgorICAgIHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCAhaXNfZnVuY3Rpb248X1RwMT46OnZhbHVlPgoreyB9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IGlzX21lbWJlcl9mdW5jdGlvbl9wb2ludGVyIDoKKyAgICBwdWJsaWMgZmFsc2VfdHlwZQoreyB9OworCisvLyBfU1BFQ19GVUxMMihpc19tZW1iZXJfZnVuY3Rpb25fcG9pbnRlcixfVHAxIF9UcDI6OiosaXNfZnVuY3Rpb248X1RwMT46OnZhbHVlKTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcDEsIGNsYXNzIF9UcDI+CitzdHJ1Y3QgaXNfbWVtYmVyX2Z1bmN0aW9uX3BvaW50ZXI8X1RwMSBfVHAyOjoqPiA6ICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBpc19mdW5jdGlvbjxfVHAxPjo6dmFsdWU+IAoreyB9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwMSwgY2xhc3MgX1RwMj4KK3N0cnVjdCBpc19tZW1iZXJfZnVuY3Rpb25fcG9pbnRlcjxfVHAxIF9UcDI6OiogY29uc3Q+IDoKKyAgICBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgaXNfZnVuY3Rpb248X1RwMT46OnZhbHVlPgoreyB9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwMSwgY2xhc3MgX1RwMj4KK3N0cnVjdCBpc19tZW1iZXJfZnVuY3Rpb25fcG9pbnRlcjxfVHAxIF9UcDI6Oiogdm9sYXRpbGU+IDoKKyAgICBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgaXNfZnVuY3Rpb248X1RwMT46OnZhbHVlPgoreyB9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwMSwgY2xhc3MgX1RwMj4KK3N0cnVjdCBpc19tZW1iZXJfZnVuY3Rpb25fcG9pbnRlcjxfVHAxIF9UcDI6OiogY29uc3Qgdm9sYXRpbGU+IDoKKyAgICBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgaXNfZnVuY3Rpb248X1RwMT46OnZhbHVlPgoreyB9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IGlzX21lbWJlcl9wb2ludGVyIDoKKyAgICBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgKGlzX21lbWJlcl9vYmplY3RfcG9pbnRlcjxfVHA+Ojp2YWx1ZSB8fCBpc19tZW1iZXJfZnVuY3Rpb25fcG9pbnRlcjxfVHA+Ojp2YWx1ZSk+Cit7IH07CisKKy8vIDQuNS4yIGNvbXBvc2l0ZSB0eXBlIGNhdGVnb3JpZXMKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBpc19hcml0aG1ldGljIDoKKyAgICBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgKGlzX2ludGVncmFsPF9UcD46OnZhbHVlIHx8IGlzX2Zsb2F0aW5nX3BvaW50PF9UcD46OnZhbHVlKT4KK3sgfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBpc19mdW5kYW1lbnRhbCA6CisgICAgcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIChpc19hcml0aG1ldGljPF9UcD46OnZhbHVlIHx8IGlzX3ZvaWQ8X1RwPjo6dmFsdWUpPgoreyB9OworCisvLyBbNC41LjFdIHByaW1hcnkgdHlwZSBjYXRlZ29yaWVzIChjb250aW51ZWQpOgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IGlzX2VudW0gOgorICAgIHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCAhKGlzX2Z1bmRhbWVudGFsPF9UcD46OnZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgaXNfYXJyYXk8X1RwPjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBpc19wb2ludGVyPF9UcD46OnZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgaXNfcmVmZXJlbmNlPF9UcD46OnZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgaXNfbWVtYmVyX3BvaW50ZXI8X1RwPjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBpc19mdW5jdGlvbjxfVHA+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGRldGFpbDo6X19pc191bmlvbl9vcl9jbGFzczxfVHA+Ojp2YWx1ZSkgPgoreyB9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3N0cnVjdCBpc191bmlvbgoreyB9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3N0cnVjdCBpc19jbGFzcworeyB9OworCisvLyBpc19mdW5jdGlvbiAoYWJvdmUpCisKKy8vIDQuNS4yIGNvbXBvc2l0ZSB0eXBlIGNhdGVnb3JpZXMgKGNvbnRpbnVlZCkKKworLy8gaXNfYXJpdGhtZXRpYyAoYWJvdmUpCisvLyBpc19mdW5kYW1lbnRhbCAoYWJvdmUpCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgaXNfb2JqZWN0IDoKKyAgICBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgKGlzX2FyaXRobWV0aWM8X1RwPjo6dmFsdWUgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2FycmF5PF9UcD46OnZhbHVlIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19wb2ludGVyPF9UcD46OnZhbHVlIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19tZW1iZXJfcG9pbnRlcjxfVHA+Ojp2YWx1ZSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsOjpfX2lzX3VuaW9uX29yX2NsYXNzPF9UcD46OnZhbHVlKT4KK3sgfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBpc19zY2FsYXIgOgorICAgIHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCAoaXNfYXJpdGhtZXRpYzxfVHA+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgaXNfZW51bTxfVHA+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgaXNfcG9pbnRlcjxfVHA+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgaXNfbWVtYmVyX3BvaW50ZXI8X1RwPjo6dmFsdWUpPgoreyB9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IGlzX2NvbXBvdW5kIDoKKyAgICBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgIWlzX2Z1bmRhbWVudGFsPF9UcD46OnZhbHVlPgoreyB9OworCisvLyBpc19tZW1iZXJfcG9pbnRlcgorCisvLyA0LjUuMyB0eXBlIHByb3BlcnRpZXM6CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgaXNfY29uc3QgOgorICAgIHB1YmxpYyBmYWxzZV90eXBlCit7IH07CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgaXNfY29uc3Q8X1RwIGNvbnN0PiA6CisgICAgcHVibGljIHRydWVfdHlwZQoreyB9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IGlzX3ZvbGF0aWxlIDoKKyAgICBwdWJsaWMgZmFsc2VfdHlwZQoreyB9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IGlzX3ZvbGF0aWxlPF9UcCB2b2xhdGlsZT4gOgorICAgIHB1YmxpYyB0cnVlX3R5cGUKK3sgfTsKKworCisvLyA0LjcuMyBhcnJheSBtb2RpZmljYXRpb25zOgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IHJlbW92ZV9leHRlbnQKK3sKKyAgICB0eXBlZGVmIF9UcCB0eXBlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgc3RkOjpzaXplX3QgX1N6Pgorc3RydWN0IHJlbW92ZV9leHRlbnQ8X1RwW19Tel0+Cit7CisgICAgdHlwZWRlZiBfVHAgdHlwZTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgcmVtb3ZlX2V4dGVudDxfVHBbXT4KK3sKKyAgICB0eXBlZGVmIF9UcCB0eXBlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCByZW1vdmVfYWxsX2V4dGVudHMKK3sKKyAgICB0eXBlZGVmIF9UcCB0eXBlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgc3RkOjpzaXplX3QgX1NpemU+CitzdHJ1Y3QgcmVtb3ZlX2FsbF9leHRlbnRzPF9UcFtfU2l6ZV0+Cit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfYWxsX2V4dGVudHM8X1RwPjo6dHlwZSB0eXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorc3RydWN0IHJlbW92ZV9hbGxfZXh0ZW50czxfVHBbXT4KK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9hbGxfZXh0ZW50czxfVHA+Ojp0eXBlIHR5cGU7Cit9OworCisvLyA0LjUuMyB0eXBlIHByb3BlcnRpZXMgKGNvbnRpbnVlZCk6CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgaXNfdHJpdmlhbCA6CisgICAgcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIChpc192b2lkPF9UcD46OnZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBpc19zY2FsYXI8dHlwZW5hbWUgcmVtb3ZlX2FsbF9leHRlbnRzPF9UcD46OnR5cGU+Ojp2YWx1ZSk+Cit7IH07CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgaXNfc3RhbmRhcmRfbGF5b3V0IDoKKyAgICBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgKGlzX3ZvaWQ8X1RwPjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGlzX3NjYWxhcjx0eXBlbmFtZSByZW1vdmVfYWxsX2V4dGVudHM8X1RwPjo6dHlwZT46OnZhbHVlKT4KK3sgfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBpc19wb2QgOgorICAgIHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCAoaXNfdm9pZDxfVHA+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgaXNfc2NhbGFyPHR5cGVuYW1lIHJlbW92ZV9hbGxfZXh0ZW50czxfVHA+Ojp0eXBlPjo6dmFsdWUpPgoreyB9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CitzdHJ1Y3QgaXNfZW1wdHkKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCAoZGV0YWlsOjpfX2lzX3VuaW9uX29yX2NsYXNzPF9UcD46OnZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChzaXplb2YoZGV0YWlsOjpfX2VtcHR5PF9UcD4pID09IHNpemVvZihfVHApKSk+Cit7IH07CisKKy8vIGlzX3BvbGltb3JwaGljCisvLyBpc19hYnN0cmFjdAorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IGhhc190cml2aWFsX2NvbnN0cnVjdG9yIDoKKyAgICBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgaXNfcG9kPF9UcD46OnZhbHVlPgoreyB9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IGhhc190cml2aWFsX2NvcHkgOgorICAgIHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBpc19wb2Q8X1RwPjo6dmFsdWU+Cit7IH07CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgaGFzX3RyaXZpYWxfYXNzaWduIDoKKyAgICBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgaXNfcG9kPF9UcD46OnZhbHVlPgoreyB9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IGhhc190cml2aWFsX2Rlc3RydWN0b3IgOgorICAgIHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBpc19wb2Q8X1RwPjo6dmFsdWU+Cit7IH07CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgaGFzX25vdGhyb3dfY29uc3RydWN0b3IgOgorICAgIHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBpc19wb2Q8X1RwPjo6dmFsdWU+Cit7IH07CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgaGFzX25vdGhyb3dfY29weSA6CisgICAgcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIGlzX3BvZDxfVHA+Ojp2YWx1ZT4KK3sgfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBoYXNfbm90aHJvd19hc3NpZ24gOgorICAgIHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBpc19wb2Q8X1RwPjo6dmFsdWU+Cit7IH07CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgaGFzX3ZpcnR1YWxfZGVzdHJ1Y3RvciA6CisgICAgcHVibGljIGZhbHNlX3R5cGUKK3sgfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBpc19zaWduZWQgOgorICAgIHB1YmxpYyBmYWxzZV90eXBlCit7IH07CisKK19fQ1ZfU1BFQyhpc19zaWduZWQsc2lnbmVkIGNoYXIsdHJ1ZSk7CitfX0NWX1NQRUMoaXNfc2lnbmVkLHNob3J0LHRydWUpOworX19DVl9TUEVDKGlzX3NpZ25lZCxpbnQsdHJ1ZSk7CitfX0NWX1NQRUMoaXNfc2lnbmVkLGxvbmcsdHJ1ZSk7CitfX0NWX1NQRUMoaXNfc2lnbmVkLGxvbmcgbG9uZyx0cnVlKTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBpc191bnNpZ25lZCA6CisgICAgcHVibGljIGZhbHNlX3R5cGUKK3sgfTsKKworX19DVl9TUEVDKGlzX3Vuc2lnbmVkLHVuc2lnbmVkIGNoYXIsdHJ1ZSk7CitfX0NWX1NQRUMoaXNfdW5zaWduZWQsdW5zaWduZWQgc2hvcnQsdHJ1ZSk7CitfX0NWX1NQRUMoaXNfdW5zaWduZWQsdW5zaWduZWQgaW50LHRydWUpOworX19DVl9TUEVDKGlzX3Vuc2lnbmVkLHVuc2lnbmVkIGxvbmcsdHJ1ZSk7CitfX0NWX1NQRUMoaXNfdW5zaWduZWQsdW5zaWduZWQgbG9uZyBsb25nLHRydWUpOworCisvLyBhbGlnbm1lbnRfb2YKKy8vIHJhbmsKKy8vIGV4dGVudAorCisvLyA0LjYgdHlwZSByZWxhdGlvbnM6CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAxLCBjbGFzcyBfVHAyPgorc3RydWN0IGlzX3NhbWUgOgorICAgIHB1YmxpYyBmYWxzZV90eXBlCit7IH07CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgaXNfc2FtZTxfVHAsIF9UcD4gOgorICAgIHB1YmxpYyB0cnVlX3R5cGUKK3sgfTsKKworLy8gaXNfYmFzZV9vZgorLy8gaXNfY29udmVydGlibGUKKworLy8gNC43LjEgY29uc3Qtdm9sYXRpbGUgbW9kaWZpY2F0aW9ucworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IHJlbW92ZV9jb25zdAoreworICAgIHR5cGVkZWYgX1RwIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IHJlbW92ZV9jb25zdDxfVHAgY29uc3Q+Cit7CisgICAgdHlwZWRlZiBfVHAgdHlwZTsKK307CisgIAordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCByZW1vdmVfdm9sYXRpbGUKK3sKKyAgICB0eXBlZGVmIF9UcCB0eXBlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCByZW1vdmVfdm9sYXRpbGU8X1RwIHZvbGF0aWxlPgoreworICAgIHR5cGVkZWYgX1RwIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IHJlbW92ZV9jdgoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX2NvbnN0PHR5cGVuYW1lIHJlbW92ZV92b2xhdGlsZTxfVHA+Ojp0eXBlPjo6dHlwZSB0eXBlOworfTsKKyAgCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IGFkZF9jb25zdAoreworICAgIHR5cGVkZWYgX1RwIGNvbnN0IHR5cGU7Cit9OworICAgCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IGFkZF92b2xhdGlsZQoreworICAgIHR5cGVkZWYgX1RwIHZvbGF0aWxlIHR5cGU7Cit9OworICAKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgYWRkX2N2Cit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBhZGRfY29uc3Q8dHlwZW5hbWUgYWRkX3ZvbGF0aWxlPF9UcD46OnR5cGU+Ojp0eXBlIHR5cGU7Cit9OworCisvLyA0LjcuMiByZWZlcmVuY2UgbW9kaWZpY2F0aW9uczoKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCByZW1vdmVfcmVmZXJlbmNlCit7CisgICAgdHlwZWRlZiBfVHAgdHlwZTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgcmVtb3ZlX3JlZmVyZW5jZTxfVHAmPgoreworICAgIHR5cGVkZWYgX1RwIHR5cGU7Cit9OworICAKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgYWRkX3JlZmVyZW5jZQoreworICAgIHR5cGVkZWYgX1RwJiB0eXBlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBhZGRfcmVmZXJlbmNlPF9UcCY+Cit7CisgICAgdHlwZWRlZiBfVHAmIHR5cGU7Cit9OworCisvLyA0LjcuMyBhcnJheSBtb2RpZmljYXRpb25zIChzZWUgYWJvdmUpCisKKy8vIDQuNy40IHBvaW50ZXIgbW9kaWZpY2F0aW9uczoKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCByZW1vdmVfcG9pbnRlcgoreworICAgIHR5cGVkZWYgX1RwIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IHJlbW92ZV9wb2ludGVyPF9UcCAqPgoreworICAgIHR5cGVkZWYgX1RwIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IHJlbW92ZV9wb2ludGVyPF9UcCAqIGNvbnN0PgoreworICAgIHR5cGVkZWYgX1RwIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IHJlbW92ZV9wb2ludGVyPF9UcCAqIHZvbGF0aWxlPgoreworICAgIHR5cGVkZWYgX1RwIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IHJlbW92ZV9wb2ludGVyPF9UcCAqIGNvbnN0IHZvbGF0aWxlPgoreworICAgIHR5cGVkZWYgX1RwIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IGFkZF9wb2ludGVyCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPF9UcD46OnR5cGUgKiB0eXBlOworfTsKKworLy8gMjAuNS43IG90aGVyIHRyYW5zZm9ybWF0aW9uczoKKworLy8gdGVtcGxhdGUgPHN0ZDo6c2l6ZV90IExlbiwgc3RkOjpzaXplX3QgQWxpZ24+IHN0cnVjdCBhbGlnbmVkX3N0b3JhZ2U7CisvLyB0ZW1wbGF0ZSA8c3RkOjpzaXplX3QgTGVuLCBjbGFzcy4uLiBUeXBlcz4gc3RydWN0IGFsaWduZWRfdW5pb247CisKK25hbWVzcGFjZSBkZXRhaWwgeworCit0ZW1wbGF0ZSA8Ym9vbCxjbGFzcyBfVT4KK3N0cnVjdCBfZGVjYXlfYXV4MgoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX2N2PF9VPjo6dHlwZSB0eXBlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9VPgorc3RydWN0IF9kZWNheV9hdXgyPHRydWUsX1U+Cit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBhZGRfcG9pbnRlcjxfVT46OnR5cGUgdHlwZTsKK307CisKK3RlbXBsYXRlIDxib29sLCBjbGFzcyBfVT4KK3N0cnVjdCBfZGVjYXlfYXV4MQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgX2RlY2F5X2F1eDI8aXNfZnVuY3Rpb248X1U+Ojp2YWx1ZSxfVT46OnR5cGUgdHlwZTsgCit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1U+CitzdHJ1Y3QgX2RlY2F5X2F1eDE8dHJ1ZSxfVT4KK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9leHRlbnQ8X1U+Ojp0eXBlKiB0eXBlOworfTsKKworfSAvLyBuYW1lc3BhY2UgZGV0YWlsCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitjbGFzcyBkZWNheQoreworICBwcml2YXRlOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxfVHA+Ojp0eXBlIF9VOworCisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGRldGFpbDo6X2RlY2F5X2F1eDE8aXNfYXJyYXk8X1U+Ojp2YWx1ZSxfVT46OnR5cGUgdHlwZTsKK307CisKK3RlbXBsYXRlIDxib29sLCBjbGFzcyBfVHAgPSB2b2lkPgorc3RydWN0IGVuYWJsZV9pZgoreworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBlbmFibGVfaWY8dHJ1ZSxfVHA+Cit7CisgICAgdHlwZWRlZiBfVHAgdHlwZTsKK307CisKK3RlbXBsYXRlIDxib29sLCBjbGFzcyBfVHAxLCBjbGFzcyBfVHAyPgorc3RydWN0IGNvbmRpdGlvbmFsCit7CisgICAgdHlwZWRlZiBfVHAyIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwMSwgY2xhc3MgX1RwMj4KK3N0cnVjdCBjb25kaXRpb25hbDx0cnVlLF9UcDEsX1RwMj4KK3sKKyAgICB0eXBlZGVmIF9UcDEgdHlwZTsKK307CisKKy8vIHRlbXBsYXRlIDxjbGFzcy4uLiBfVHA+IHN0cnVjdCBjb21tb25fdHlwZTsKKworI3VuZGVmIF9fQ1ZfU1BFQworI3VuZGVmIF9fU1BFQ18KKyN1bmRlZiBfX0NWX1NQRUNfMQorI3VuZGVmIF9fU1BFQ18xCisjdW5kZWYgX19DVl9TUEVDXzIKKyN1bmRlZiBfX1NQRUNfMgorCitfU1RMUF9FTkRfTkFNRVNQQUNFIC8vIHRyMQorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKy8vICMgZWxzZSAvLyBfX0dMSUJDWFhfXyAmJiAoX19HTlVDX18gPj0gNCkgJiYgIVNUTFBPUlQKKy8vICMgIGluY2x1ZGUgPHRyMS90eXBlX3RyYWl0cz4KKy8vICMgZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MykKKyMgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+CisjICB1bmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjZW5kaWYKKworI2VuZGlmIC8vIF9fU1RMUF9UWVBFX1RSQUlUUworCmRpZmYgLS1naXQgYS9zdGxwb3J0L3R5cGVpbmZvIGIvc3RscG9ydC90eXBlaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjkxMjNmCi0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC90eXBlaW5mbwpAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9UWVBFSU5GTworCisjaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4NDczCisjICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgorI2VsaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHg0NzMpICYmICFkZWZpbmVkIChfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQpCisjICBkZWZpbmUgX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lECisjICBkZWZpbmUgX1NUTFBfVFlQRUlORk8KKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHg0NzMpICYmICFkZWZpbmVkIChfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQpCisjICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfVFlQRUlORk8KKyMgICAgaW5jbHVkZSA8c3RsL190eXBlaW5mby5oPgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgIT0gMHg0NzMpIHx8IGRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkgfHwgZGVmaW5lZCAoX1NUTFBfSU1QT1JUX1ZFTkRPUl9TVEQpCisjICBpZiBkZWZpbmVkIChfU1RMUF9IQVNfSU5DTFVERV9ORVhUKQorIyAgICBpbmNsdWRlX25leHQgPHR5cGVpbmZvPgorIyAgZWxzZQorIyAgICBpbmNsdWRlIF9TVExQX05BVElWRV9DUFBfUlVOVElNRV9IRUFERVIodHlwZWluZm8pCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDQ3MykKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQpCisjICAgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+CisjICAgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGVsc2UKKyMgICAgdW5kZWYgX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lECisjICBlbmRpZgorI2VuZGlmCisKKyNlbmRpZgorCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RscG9ydC90eXBlaW5mby5oIGIvc3RscG9ydC90eXBlaW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZWE3MWEKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3R5cGVpbmZvLmgKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKy8vIERNQyBoYXMgaGFyZGNvZGVkIGluY2x1c2lvbiBvZiB0eXBlaW5mby5oIGF0IHRoZSBiZWdpbmluZyBvZiBhbnkgdHJhbnNsYXRpb24gdW5pdC4KKy8vIFNvIGluY2x1c2lvbiBvZiB0aGlzIGhlYWRlciB3aWxsIGRpcmVjdGx5IHJlZmVyZW5jZSB0aGUgbmF0aXZlIGhlYWRlci4gVGhpcyBpcyBub3QKKy8vIGEgcHJvYmxlbSBhcyB0eXBlaW5mby5oIGlzIG5laXRoZXIgYSBDIG5vciBDKysgU3RhbmRhcmQgaGVhZGVyLCB0aGlzIGhlYWRlciBzaG91bGQKKy8vIG5ldmVyIGJlIHVzZWQgaW4gdXNlciBjb2RlLgorI2lmIGRlZmluZWQgKF9fRE1DX18pCisvLyBXZSBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCB0byBzaWduYWwgdG8gb3RoZXIgU1RMcG9ydCBoZWFkZXJzIHRoYXQgaW5jbHVzaW9uCisvLyBpcyBkb25lIGZyb20gbmF0aXZlIHR5cGVpbmZvLmggKHNlZSBleGNlcHRpb24gaGVhZGVyKS4KKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4ODc0CisjICBpbmNsdWRlIDwuLi9pbmNsdWRlL3R5cGVpbmZvLmg+CisjICB1bmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjZWxzZQorIyAgaWZuZGVmIF9TVExQX09MRFNURF90eXBlaW5mbworIyAgZGVmaW5lIF9TVExQX09MRFNURF90eXBlaW5mbworCisjICBpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDg3NAorIyAgICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgorIyAgZW5kaWYKKworIyAgaWZuZGVmIF9TVExQX05PX1RZUEVJTkZPCisKKyMgICAgaWYgZGVmaW5lZCAoX19HTlVDX18pCisjICAgICAgdW5kZWYgX1NUTFBfT0xEU1REX3R5cGVpbmZvCisjICAgICAgaW5jbHVkZSA8dHlwZWluZm8+CisjICAgICAgZGVmaW5lIF9TVExQX09MRFNURF90eXBlaW5mbworIyAgICBlbHNlCisjICAgICAgaWYgZGVmaW5lZCAoX1NUTFBfSEFTX0lOQ0xVREVfTkVYVCkKKyMgICAgICAgIGluY2x1ZGVfbmV4dCA8dHlwZWluZm8uaD4KKyMgICAgICBlbGlmICFkZWZpbmVkIChfX0JPUkxBTkRDX18pIHx8IChfX0JPUkxBTkRDX18gPCAweDU4MCkKKyMgICAgICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9SVU5USU1FX0hFQURFUih0eXBlaW5mby5oKQorIyAgICAgIGVsc2UKKyMgICAgICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUih0eXBlaW5mby5oKQorIyAgICAgIGVuZGlmCisjICAgICAgaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKSAmJiAoX19CT1JMQU5EQ19fID49IDB4NTgwKSB8fCBcCisgICAgICAgICAgZGVmaW5lZCAoX19ETUNfXykKK3VzaW5nIHN0ZDo6dHlwZV9pbmZvOwordXNpbmcgc3RkOjpiYWRfdHlwZWlkOwordXNpbmcgc3RkOjpiYWRfY2FzdDsKKyMgICAgICBlbmRpZgorIyAgICBlbmRpZgorCisvLyBpZiA8dHlwZWluZm8+IGFscmVhZHkgaW5jbHVkZWQsIGRvIG5vdCBpbXBvcnQgYW55dGhpbmcKKworIyAgICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfT1dOX05BTUVTUEFDRSkgJiYgIShkZWZpbmVkIChfU1RMUF9UWVBFSU5GTykgJiYgIWRlZmluZWQgKF9TVExQX05PX05FV19ORVdfSEVBREVSKSkKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKK3VzaW5nIC8qX1NUTFBfVkVORE9SX0VYQ0VQVF9TVEQgKi8gOjogdHlwZV9pbmZvOworIyAgICAgIGlmICEoZGVmaW5lZChfX01SQ19fKSB8fCAoZGVmaW5lZChfX1NDX18pICYmICFkZWZpbmVkKF9fRE1DX18pKSkKK3VzaW5nIC8qIF9TVExQX1ZFTkRPUl9FWENFUFRfU1REICovIDo6IGJhZF90eXBlaWQ7CisjICAgICAgZW5kaWYKKwordXNpbmcgLyogX1NUTFBfVkVORE9SX0VYQ0VQVF9TVEQgKi8gOjogYmFkX2Nhc3Q7CisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworIyAgICBlbmRpZiAvKiBfU1RMUF9PV05fTkFNRVNQQUNFICovCisKKyMgIGVuZGlmIC8qIF9TVExQX05PX1RZUEVJTkZPICovCisKKyMgIGlmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4ODc0KQorIyAgICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgICB1bmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjICBlbmRpZgorCisjICBlbmRpZiAvKiBfU1RMUF9PTERTVERfdHlwZWluZm8gKi8KKworI2VuZGlmIC8qIF9fRE1DX18gKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3Vub3JkZXJlZF9tYXAgYi9zdGxwb3J0L3Vub3JkZXJlZF9tYXAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHVub3JkZXJlZF9tYXAKcmVuYW1lIHRvIHN0bHBvcnQvdW5vcmRlcmVkX21hcApkaWZmIC0tZ2l0IGEvdW5vcmRlcmVkX3NldCBiL3N0bHBvcnQvdW5vcmRlcmVkX3NldApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdW5vcmRlcmVkX3NldApyZW5hbWUgdG8gc3RscG9ydC91bm9yZGVyZWRfc2V0CmRpZmYgLS1naXQgYS9zdGxwb3J0L3VzaW5nL2NzdHJpbmcgYi9zdGxwb3J0L3VzaW5nL2NzdHJpbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJjNTY2MAotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvdXNpbmcvY3N0cmluZwpAQCAtMCwwICsxLDYwIEBACit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6c2l6ZV90OworCisjaWYgIWRlZmluZWQgKF9TVExQX05PX0NTVERfRlVOQ1RJT05fSU1QT1JUUykKKyMgIGlmIGRlZmluZWQgKF9fTVNMX18pICYmIF9fTUM2OEtfXyAmJiAhX05vX0Jsb2NrTW92ZSAmJiBfX2Rlc3Rfb3MgPT0gX19tYWNfb3MKKyMgICAgdW5kZWYgbWVtY3B5CisjICAgIHVuZGVmIG1lbW1vdmUKK2lubGluZSB2b2lkKiBtZW1jcHkodm9pZCogZHN0LCBjb25zdCB2b2lkKiBzcmMsIHNpemVfdCBsZW4pCit7CXJldHVybiBfU1RMUF9WRU5ET1JfQ1NURDo6X19tZW1jcHkoZHN0LCBzcmMsIGxlbik7IH0KK2lubGluZSB2b2lkKiBtZW1tb3ZlKHZvaWQqIGRzdCwgY29uc3Qgdm9pZCogc3JjLCBzaXplX3QgbGVuKQorewlyZXR1cm4gX1NUTFBfVkVORE9SX0NTVEQ6Ol9fbWVtbW92ZShkc3QsIHNyYywgbGVuKTsgfQorIyAgZWxzZQordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6Om1lbW1vdmU7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6bWVtY3B5OworIyAgZW5kaWYKKworIyAgaWYgIWRlZmluZWQgKF9TVExQX1dDRSkKKy8vIHRoZXNlIGZ1bmN0aW9ucyBqdXN0IGRvbid0IGV4aXN0IG9uIFdpbmRvd3MgQ0UKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpzdHJjb2xsOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnN0cmVycm9yOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnN0cnhmcm07CisjICBlbmRpZgorCisjICBpZiBkZWZpbmVkIChfX0JPUkxBTkRDX18pCitleHRlcm4gIkMrKyIgeworIyAgZW5kaWYKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjptZW1jaHI7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6c3RyY2hyOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnN0cnBicms7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6c3RycmNocjsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpzdHJzdHI7CisjICBpZiBkZWZpbmVkIChfX0JPUkxBTkRDX18pCit9CisjICBlbmRpZgorCit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6bWVtY21wOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6Om1lbXNldDsKKwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnN0cmNhdDsKKworIyAgaWYgIWRlZmluZWQgKHN0cmNtcCkgfHwgIWRlZmluZWQgKF9fQk9STEFORENfXykKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpzdHJjbXA7CisjICBlbHNlCit1c2luZyA6OnN0cmNtcDsKKyMgIGVuZGlmCisKKyMgIGlmICFkZWZpbmVkIChzdHJjcHkpIHx8ICFkZWZpbmVkIChfX0JPUkxBTkRDX18pCit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6c3RyY3B5OworIyAgZWxzZQordXNpbmcgOjpzdHJjcHk7CisjICBlbmRpZgordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnN0cmNzcG47Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6c3RybGVuOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnN0cm5jYXQ7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6c3RybmNtcDsKKwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnN0cm5jcHk7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6c3Ryc3BuOworCit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6c3RydG9rOworI2VuZGlmIC8qIF9TVExQX05PX0NTVERfRlVOQ1RJT05fSU1QT1JUUyAqLwpkaWZmIC0tZ2l0IGEvdXNpbmcvZXhwb3J0IGIvc3RscG9ydC91c2luZy9leHBvcnQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHVzaW5nL2V4cG9ydApyZW5hbWUgdG8gc3RscG9ydC91c2luZy9leHBvcnQKZGlmZiAtLWdpdCBhL3VzaW5nL2ZzdHJlYW0gYi9zdGxwb3J0L3VzaW5nL2ZzdHJlYW0Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHVzaW5nL2ZzdHJlYW0KcmVuYW1lIHRvIHN0bHBvcnQvdXNpbmcvZnN0cmVhbQpkaWZmIC0tZ2l0IGEvdXNpbmcvaC9mc3RyZWFtLmggYi9zdGxwb3J0L3VzaW5nL2gvZnN0cmVhbS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB1c2luZy9oL2ZzdHJlYW0uaApyZW5hbWUgdG8gc3RscG9ydC91c2luZy9oL2ZzdHJlYW0uaApkaWZmIC0tZ2l0IGEvdXNpbmcvaC9pb21hbmlwLmggYi9zdGxwb3J0L3VzaW5nL2gvaW9tYW5pcC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB1c2luZy9oL2lvbWFuaXAuaApyZW5hbWUgdG8gc3RscG9ydC91c2luZy9oL2lvbWFuaXAuaApkaWZmIC0tZ2l0IGEvdXNpbmcvaC9pb3N0cmVhbS5oIGIvc3RscG9ydC91c2luZy9oL2lvc3RyZWFtLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHVzaW5nL2gvaW9zdHJlYW0uaApyZW5hbWUgdG8gc3RscG9ydC91c2luZy9oL2lvc3RyZWFtLmgKZGlmZiAtLWdpdCBhL3VzaW5nL2gvb3N0cmVhbS5oIGIvc3RscG9ydC91c2luZy9oL29zdHJlYW0uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdXNpbmcvaC9vc3RyZWFtLmgKcmVuYW1lIHRvIHN0bHBvcnQvdXNpbmcvaC9vc3RyZWFtLmgKZGlmZiAtLWdpdCBhL3VzaW5nL2gvc3RyZWFtYnVmLmggYi9zdGxwb3J0L3VzaW5nL2gvc3RyZWFtYnVmLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHVzaW5nL2gvc3RyZWFtYnVmLmgKcmVuYW1lIHRvIHN0bHBvcnQvdXNpbmcvaC9zdHJlYW1idWYuaApkaWZmIC0tZ2l0IGEvdXNpbmcvaC9zdHJzdHJlYW0uaCBiL3N0bHBvcnQvdXNpbmcvaC9zdHJzdHJlYW0uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdXNpbmcvaC9zdHJzdHJlYW0uaApyZW5hbWUgdG8gc3RscG9ydC91c2luZy9oL3N0cnN0cmVhbS5oCmRpZmYgLS1naXQgYS91c2luZy9pb21hbmlwIGIvc3RscG9ydC91c2luZy9pb21hbmlwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB1c2luZy9pb21hbmlwCnJlbmFtZSB0byBzdGxwb3J0L3VzaW5nL2lvbWFuaXAKZGlmZiAtLWdpdCBhL3VzaW5nL2lvcyBiL3N0bHBvcnQvdXNpbmcvaW9zCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB1c2luZy9pb3MKcmVuYW1lIHRvIHN0bHBvcnQvdXNpbmcvaW9zCmRpZmYgLS1naXQgYS91c2luZy9pb3Nmd2QgYi9zdGxwb3J0L3VzaW5nL2lvc2Z3ZApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdXNpbmcvaW9zZndkCnJlbmFtZSB0byBzdGxwb3J0L3VzaW5nL2lvc2Z3ZApkaWZmIC0tZ2l0IGEvdXNpbmcvaW9zdHJlYW0gYi9zdGxwb3J0L3VzaW5nL2lvc3RyZWFtCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB1c2luZy9pb3N0cmVhbQpyZW5hbWUgdG8gc3RscG9ydC91c2luZy9pb3N0cmVhbQpkaWZmIC0tZ2l0IGEvdXNpbmcvaXN0cmVhbSBiL3N0bHBvcnQvdXNpbmcvaXN0cmVhbQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdXNpbmcvaXN0cmVhbQpyZW5hbWUgdG8gc3RscG9ydC91c2luZy9pc3RyZWFtCmRpZmYgLS1naXQgYS91c2luZy9sb2NhbGUgYi9zdGxwb3J0L3VzaW5nL2xvY2FsZQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdXNpbmcvbG9jYWxlCnJlbmFtZSB0byBzdGxwb3J0L3VzaW5nL2xvY2FsZQpkaWZmIC0tZ2l0IGEvdXNpbmcvb3N0cmVhbSBiL3N0bHBvcnQvdXNpbmcvb3N0cmVhbQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdXNpbmcvb3N0cmVhbQpyZW5hbWUgdG8gc3RscG9ydC91c2luZy9vc3RyZWFtCmRpZmYgLS1naXQgYS91c2luZy9zc3RyZWFtIGIvc3RscG9ydC91c2luZy9zc3RyZWFtCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB1c2luZy9zc3RyZWFtCnJlbmFtZSB0byBzdGxwb3J0L3VzaW5nL3NzdHJlYW0KZGlmZiAtLWdpdCBhL3VzaW5nL3N0cmVhbWJ1ZiBiL3N0bHBvcnQvdXNpbmcvc3RyZWFtYnVmCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB1c2luZy9zdHJlYW1idWYKcmVuYW1lIHRvIHN0bHBvcnQvdXNpbmcvc3RyZWFtYnVmCmRpZmYgLS1naXQgYS91c2luZy9zdHJzdHJlYW0gYi9zdGxwb3J0L3VzaW5nL3N0cnN0cmVhbQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdXNpbmcvc3Ryc3RyZWFtCnJlbmFtZSB0byBzdGxwb3J0L3VzaW5nL3N0cnN0cmVhbQpkaWZmIC0tZ2l0IGEvc3RscG9ydC91dGlsaXR5IGIvc3RscG9ydC91dGlsaXR5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhYWFhNTkKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3V0aWxpdHkKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfVVRJTElUWQorCisjaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4NzUKKyMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+CisjZWxpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDc1KSAmJiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQorIyAgZGVmaW5lIF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRAorIyAgZGVmaW5lIF9TVExQX1VUSUxJVFkKKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHg3NSkgJiYgIWRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKKyMgIGlmbmRlZiBfU1RMUF9JTlRFUk5BTF9QQUlSX0gKKyMgICAgaW5jbHVkZSA8c3RsL19wYWlyLmg+CisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAhPSAweDc1KSB8fCBkZWZpbmVkIChfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQpIHx8IGRlZmluZWQgKF9TVExQX0lNUE9SVF9WRU5ET1JfU1REKQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfSEFTX0lOQ0xVREVfTkVYVCkKKyMgICAgaW5jbHVkZV9uZXh0IDx1dGlsaXR5PgorIyAgZWxzZQorIyAgICBpbmNsdWRlIF9TVExQX05BVElWRV9IRUFERVIodXRpbGl0eSkKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4NzUpCisjICBpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQorIyAgICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgICB1bmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjICBlbHNlCisjICAgIHVuZGVmIF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRAorIyAgZW5kaWYKKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfVVRJTElUWSAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RscG9ydC92YWxhcnJheSBiL3N0bHBvcnQvdmFsYXJyYXkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNiMDc3NgotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvdmFsYXJyYXkKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9WQUxBUlJBWQorCisjaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4NzYKKyMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+CisjICBkZWZpbmUgX1NUTFBfVkFMQVJSQVkKKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHg3NikKKyMgIGlmbmRlZiBfU1RMUF9WQUxBUlJBWV9ICisjICAgIGluY2x1ZGUgPHN0bC9fdmFsYXJyYXkuaD4KKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEICE9IDB4NzYpIHx8IGRlZmluZWQgKF9TVExQX0lNUE9SVF9WRU5ET1JfU1REKQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfSEFTX0lOQ0xVREVfTkVYVCkKKyMgICAgaW5jbHVkZV9uZXh0IDx2YWxhcnJheT4KKyMgIGVsc2UKKyMgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfSEVBREVSKHZhbGFycmF5KQorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHg3NikKKyMgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+CisjICB1bmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjZW5kaWYKKworI2VuZGlmIC8qIF9TVExQX1ZBTEFSUkFZICovCisKKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bHBvcnQvdmVjdG9yIGIvc3RscG9ydC92ZWN0b3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJjNDFiNwotLS0gL2Rldi9udWxsCisrKyBiL3N0bHBvcnQvdmVjdG9yCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX1ZFQ1RPUgorCisjaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4NzcKKyMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+CisjICBkZWZpbmUgX1NUTFBfVkVDVE9SCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4NzcpCisjICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfQUxHT0JBU0VfSAorIyAgICBpbmNsdWRlIDxzdGwvX2FsZ29iYXNlLmg+CisjICBlbmRpZgorCisjICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfVkVDVE9SX0gKKyMgICAgaW5jbHVkZSA8c3RsL192ZWN0b3IuaD4KKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEICE9IDB4NzcpIHx8IGRlZmluZWQgKF9TVExQX0lNUE9SVF9WRU5ET1JfU1REKQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfSEFTX0lOQ0xVREVfTkVYVCkKKyMgICAgaW5jbHVkZV9uZXh0IDx2ZWN0b3I+CisjICBlbHNlCisjICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0hFQURFUih2ZWN0b3IpCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDc3KQorIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfVkVDVE9SICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CisKZGlmZiAtLWdpdCBhL3N0bHBvcnQvd2NoYXIuaCBiL3N0bHBvcnQvd2NoYXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDY2Nzk5Ci0tLSAvZGV2L251bGwKKysrIGIvc3RscG9ydC93Y2hhci5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWYgIWRlZmluZWQgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQpCisjICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDI3OAorIyAgaW5jbHVkZSA8c3RsL19jcHJvbG9nLmg+CisjZWxpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDI3OCkgJiYgIWRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKKyMgIGRlZmluZSBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKF9TVExQX1dDRV9FVkMzKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkKKworIyAgaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKSAmJiAhZGVmaW5lZCAoX19saW51eF9fKQorIyAgICBpZiBkZWZpbmVkIChfU1RMUF9IQVNfSU5DTFVERV9ORVhUKQorIyAgICAgIGluY2x1ZGVfbmV4dCA8X3N0ci5oPgorIyAgICBlbHNlCisjICAgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSEVBREVSKF9zdHIuaCkKKyMgICAgZW5kaWYKKyMgICAgaWZkZWYgX19jcGx1c3BsdXMKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpzdHJsZW47Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6c3Ryc3BuOworIyAgICBlbmRpZgorIyAgZW5kaWYKKworIyAgaWYgKCgoX19HTlVDX18gPCAzKSB8fCAoKF9fR05VQ19fID09IDMpICYmIChfX0dOVUNfTUlOT1JfXyA8IDMpKSkgJiYgZGVmaW5lZCAoX19BUFBMRV9fKSkgfHwgZGVmaW5lZCAoX19PcGVuQlNEX18pCisjICAgIGlmIGRlZmluZWQgKF9TVExQX0hBU19JTkNMVURFX05FWFQpCisjICAgICAgaW5jbHVkZV9uZXh0IDxzdGRkZWYuaD4KKyMgICAgZWxzZQorIyAgICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NfSEVBREVSKHN0ZGRlZi5oKQorIyAgICBlbmRpZgorIyAgZWxzZQorIyAgICBpZiBkZWZpbmVkIChfU1RMUF9IQVNfSU5DTFVERV9ORVhUKQorIyAgICAgIGluY2x1ZGVfbmV4dCA8d2NoYXIuaD4KKyMgICAgZWxzZQorIyAgICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NfSEVBREVSKHdjaGFyLmgpCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmIC8qICFkZWZpbmVkIChfU1RMUF9XQ0VfRVZDMykgJiYgIWRlZmluZWQgKF9TVExQX05PX1dDSEFSX1QpICovCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfTUJTVEFURV9UCisjICBpbmNsdWRlIDxzdGwvX21ic3RhdGVfdC5oPgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDI3OCkKKyMgIGlmICEgZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQorIyAgICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgICB1bmRlZiAgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZWxzZQorIyAgICB1bmRlZiAgX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lECisjICBlbmRpZgorI2VuZGlmCisKZGlmZiAtLWdpdCBhL3N0bHBvcnQvd2N0eXBlLmggYi9zdGxwb3J0L3djdHlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NGFiOWIKLS0tIC9kZXYvbnVsbAorKysgYi9zdGxwb3J0L3djdHlwZS5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWYgIWRlZmluZWQgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQpCisjICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDI3OQorIyAgaW5jbHVkZSA8c3RsL19jcHJvbG9nLmg+CisjZWxpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDI3OSkgJiYgIWRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKKyMgIGRlZmluZSBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKKyNlbmRpZgorCisvKiBldmMzIGRvZXNuJ3QgaGF2ZSB3Y3R5cGUuaCAqLworI2lmICFkZWZpbmVkKF9TVExQX1dDRV9FVkMzKQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfSEFTX0lOQ0xVREVfTkVYVCkKKyMgICAgaWYgZGVmaW5lZCAoX19ocHV4KQorIyAgICAgIGluY2x1ZGVfbmV4dCA8c3RkYXJnLmg+CisjICAgICAgaW5jbHVkZV9uZXh0IDx3Y2hhci5oPgorIyAgICBlbmRpZgorIyAgICBpbmNsdWRlX25leHQgPHdjdHlwZS5oPgorIyAgZWxzZQorIyAgICBpZiBkZWZpbmVkIChfX2hwdXgpCisjICAgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ19IRUFERVIoc3RkYXJnLmgpCisjICAgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ19IRUFERVIod2NoYXIuaCkKKyMgICAgZW5kaWYKKyMgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ19IRUFERVIod2N0eXBlLmgpCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDI3OSkKKyMgIGlmICEgZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQorIyAgICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgICB1bmRlZiAgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZWxzZQorIyAgICB1bmRlZiAgX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lECisjICBlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9zdHJlYW1idWYgYi9zdHJlYW1idWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZDU3YzkuLjAwMDAwMDAKLS0tIGEvc3RyZWFtYnVmCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLSNpZm5kZWYgX1NUTFBfU1RSRUFNQlVGCi0jZGVmaW5lIF9TVExQX1NUUkVBTUJVRgotCi0jIGlmbmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECi0jICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDEwNjYKLSMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+Ci0jIGVuZGlmCi0KLSMgaWZkZWYgX1NUTFBfUFJBR01BX09OQ0UKLSMgIHByYWdtYSBvbmNlCi0jIGVuZGlmCi0KLSMgaW5jbHVkZSA8c3RsL19pb3NlcnIuaD4KLSMgaW5jbHVkZSA8c3RsL19zdHJlYW1idWYuaD4KLQotIyBpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDEwNjYpCi0jICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgotIyAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAotIyBlbmRpZgotCi0jZW5kaWYgLyogX1NUTFBfU1RSRUFNQlVGICovCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6CmRpZmYgLS1naXQgYS9zdHJpbmcgYi9zdHJpbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1M2Q2N2YuLjAwMDAwMDAKLS0tIGEvc3RyaW5nCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0xOTk5Ci0gKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0jaWZuZGVmIF9TVExQX1NUUklORwotIyBkZWZpbmUgX1NUTFBfU1RSSU5HCi0KLSNpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAotIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHg2OAotIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KLSNlbmRpZgotCi0jaWZkZWYgX1NUTFBfUFJBR01BX09OQ0UKLSMgIHByYWdtYSBvbmNlCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9TVExQX1VTRV9PV05fTkFNRVNQQUNFKQotIyAgaW5jbHVkZSA8c3RsL19zdHJpbmcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RsL19zdHJpbmdfaGFzaC5oPgotCi0jaWYgIWRlZmluZWQgKF9TVExQX1VTRV9OT19JT1NUUkVBTVMpCi0jICBpbmNsdWRlIDxzdGwvX3N0cmluZ19pby5oPgotI2VuZGlmCi0KLSNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDY4KQotIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KLSMgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKLSNlbmRpZgotCi0jZW5kaWYgLyogX1NUTFBfU1RSSU5HICovCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6Ci0KZGlmZiAtLWdpdCBhL3N0cmluZy5oIGIvc3RyaW5nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczN2JkYjYuLjAwMDAwMDAKLS0tIGEvc3RyaW5nLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBCb3JpcyBGb21pdGNoZXYKLSAqCi0gKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKLSAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCi0gKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCi0gKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwotICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKi8KLQotLyogV29ya2Fyb3VuZCBmb3IgYSAibWlzYmVoYXZpb3VyIiB3aGVuIGNvbXBpbGluZyByZXNvdXJjZSBzY3JpcHRzIHVzaW5nCi0gKiBlTWJlZGRlZCBWaXN1YWwgQysrLiBUaGUgc3RhbmRhcmQgLnJjIGZpbGUgaW5jbHVkZXMgd2luZG93cyBoZWFkZXIgZmlsZXMsCi0gKiB3aGljaCBpbiB0dXJuIGluY2x1ZGUgc3RyaW5nLmgsIHdoaWNoIHJlc3VsdHMgaW4gd2FybmluZ3MgYW5kIGVycm9ycwotICovCi0jaWZuZGVmIF9TVExQX1NUUklOR19ICi0KLSNpZiAhZGVmaW5lZCAoUkNfSU5WT0tFRCkKLQotIyAgaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKLSMgICAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHgyNjkKLSMgICAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KLSMgIGVsaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgyNjkpICYmICFkZWZpbmVkIChfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQpCi0jICAgIGRlZmluZSBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKLSMgICAgZGVmaW5lIF9TVExQX1NUUklOR19ICi0jICBlbmRpZgotCi0jICBpZiBkZWZpbmVkKF9TVExQX1dDRV9FVkMzKQotc3RydWN0IF9leGNlcHRpb247Ci0jICBlbmRpZgotIyAgaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgIT0gMHgyNjkpIHx8IGRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKLSMgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ19IRUFERVIoc3RyaW5nLmgpCi0jICBlbHNlCi0jICAgIGlmIGRlZmluZWQgKF9fQk9STEFORENfXykKLSMgICAgICBpbmNsdWRlIF9TVExQX05BVElWRV9DUFBfQ19IRUFERVIoX3N0ci5oKQotIyAgICBlbHNlCi0jICAgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ19IRUFERVIoc3RyaW5nLmgpCi0jICAgIGVuZGlmCi0KLSMgICAgaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgyNjkpCi0jICAgICAgaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKSAmJiBkZWZpbmVkIChfU1RMUF9JTVBPUlRfVkVORE9SX0NTVEQpCi0jICAgICAgICBpbmNsdWRlIDx1c2luZy9jc3RyaW5nPgotIyAgICAgIGVuZGlmIC8qIEJPUkxBTkQgKi8KLSMgICAgZW5kaWYKLSMgIGVuZGlmCi0KLSMgIGlmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MjY5KQotIyAgICBpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQotIyAgICAgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+Ci0jICAgICAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAotIyAgICBlbHNlCi0jICAgICAgdW5kZWYgX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lECi0jICAgIGVuZGlmCi0jICBlbmRpZgotI2VuZGlmIC8qIFJDX0lOVk9LRUQgKi8KLSNlbmRpZiAvKiBfU1RMUF9TVFJJTkdfSCAqLwpkaWZmIC0tZ2l0IGEvc3Ryc3RyZWFtIGIvc3Ryc3RyZWFtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjNiNWNkLi4wMDAwMDAwCi0tLSBhL3N0cnN0cmVhbQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogQm9yaXMgRm9taXRjaGV2Ci0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICovCi0vLyBXQVJOSU5HOiBUaGUgY2xhc3NlcyBkZWZpbmVkIGluIHRoaXMgaGVhZGVyIGFyZSBERVBSRUNBVEVELiAgVGhpcwotLy8gaGVhZGVyIGlzIGRlZmluZWQgaW4gc2VjdGlvbiBELjcuMSBvZiB0aGUgQysrIHN0YW5kYXJkLCBhbmQgaXQKLS8vIE1BWSBCRSBSRU1PVkVEIGluIGEgZnV0dXJlIHN0YW5kYXJkIHJldmlzaW9uLiAgWW91IHNob3VsZCB1c2UgdGhlCi0vLyBoZWFkZXIgPHNzdHJlYW0+IGluc3RlYWQuCi0KLQotI2lmbmRlZiBfU1RMUF9TVFJTVFJFQU0KLSNkZWZpbmUgX1NUTFBfU1RSU1RSRUFNCi0KLSNpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAotIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHgxMDcwCi0jICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgotI2VuZGlmCi0KLSNpZmRlZiBfU1RMUF9QUkFHTUFfT05DRQotIyAgcHJhZ21hIG9uY2UKLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RsL19pb3NlcnIuaD4KLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9TVFJTVFJFQU0KLSMgIGluY2x1ZGUgPHN0bC9fc3Ryc3RyZWFtLmg+Ci0jZW5kaWYKLQotI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MTA3MCkKLSMgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+Ci0jICB1bmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECi0jZW5kaWYKLQotI2VuZGlmIC8qIF9TVExQX1NUUlNUUkVBTSAqLwotCi0vLyBMb2NhbCBWYXJpYWJsZXM6Ci0vLyBtb2RlOkMrKwotLy8gRW5kOgpkaWZmIC0tZ2l0IGEvdGVzdC9jb21waWxlci9NYWtlZmlsZS5pbmMgYi90ZXN0L2NvbXBpbGVyL01ha2VmaWxlLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDcwZTYyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb21waWxlci9NYWtlZmlsZS5pbmMKQEAgLTAsMCArMSw2IEBACisjIC0qLSBtYWtlZmlsZSAtKi0gVGltZS1zdGFtcDogPDA0LzEwLzE3IDIxOjE2OjM4IHB0cj4KKworUFJHTkFNRSA9IGNvbXBpbGVyX3Rlc3QKK1NSQ19DUFAgPSB0dGVpMS5jcHAgdHRlaTIuY3BwIHR0ZWkzLmNwcCB0dGVpNC5jcHAgdHRlaTUuY3BwIHR0ZWk2LmNwcCB0dGVpNy5jcHAgXAorICAgICAgICAgIHBhcnRpYWxfc3BlYy5jcHAgbW92YWJsZS5jcHAKK1NSQ19DQyA9IGVoLmNjCmRpZmYgLS1naXQgYS90ZXN0L2NvbXBpbGVyL1JFQURNRSBiL3Rlc3QvY29tcGlsZXIvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NDJlZjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvbXBpbGVyL1JFQURNRQpAQCAtMCwwICsxLDI5IEBACisxLiBBYm91dCB0aGlzIHRlc3RzCisKK1RoaXMgaXMgdGVzdHMgdG8gY2hlY2sgd2hldGhlciBjb21waWxlciB1bmRlcnN0YW5kIG9yIG5vdCBzb21lIGxhbmd1YWdlCitjb25zdHJ1Y3Rpb24uIEl0IGlzIE5PVCB0ZXN0cyBmb3IgbGFuZ3VhZ2Ugc3VwcG9ydCBsaWJyYXJpZXMsIG9ubHkgdGVzdHMgZm9yCitjb21waWxlciEKKworVGhlIG1haW4gcHVycG9zZXMgb2YgdGhpcyB0ZXN0cyBpcyB0byBoZWxwIGZvciBkZXZlbG9wZXJzIHRvIGZpbmQgY29ycmVjdAord29ya2Fyb3VuZHMsIGlmIGNvbXBpbGVyIGRvbid0IHVuZGVyc3RhbmQgc29tZSAoY29ycmVjdCkgbGFuZ3VhZ2UgY29uc3RydWN0aW9ucy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworMi4gQ29tcGlsYXRpb24KKworQ29tcGlsYXRpb24gd2l0aCBHTlUgTWFrZSB1dGlsaXR5IGFuZCBnY2MgY29tcGlsZXI6CisKK21ha2UgLWYgZ2NjLm1hayAtaworCisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTm90ZXMgYWJvdXQgdGVzdHMuCisKK3R0ZWkxLmNwcCwgdHRlaTIuY3BwLCB0dGVpMy5jcHAsIHR0ZWk0LmNwcCwgdHRlaTUuY3BwOgorCit0ZXN0cyBmb3IgdGVtcGxhdGUtaW4tdGhlLXRlbXBsYXRlIGV4cGxpY2l0IHNwZWNpYWxpemF0aW9uLgorSW5kZWVkIHR0ZWkzLmNwcCwgdHRlaTQuY3BwLCB0dGVpNS5jcHAgc3VnZ2VzdCBzeW50YXggbm90IGFwcHJvdmVkIGJ5IHN0YW5kYXJkCisoMTQuNy4zLCBwYXJhZ3JhcGhzIDE2LS0xOCksIGJ1dCB0dGVpMy5jcHAsIHR0ZWk0LmNwcCBhY2NlcHRlZCAocmVjaGVjayEpIGJ5IFZDNiwKK3doaWxlIHR0ZWk1LmNwcCBhY2NlcHRlZCBieSBnY2MgYmVmb3JlIDMuNC4wLgpkaWZmIC0tZ2l0IGEvdGVzdC9jb21waWxlci9TdFRlcm0tb3JkZXIvTWFrZWZpbGUgYi90ZXN0L2NvbXBpbGVyL1N0VGVybS1vcmRlci9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWZjNzk3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb21waWxlci9TdFRlcm0tb3JkZXIvTWFrZWZpbGUKQEAgLTAsMCArMSwxMiBAQAorIyAtKi0gTWFrZWZpbGUgLSotIFRpbWUtc3RhbXA6IDwwMy8wNy8wOSAxODowODo0NyBwdHI+CisKK1NSQ1JPT1QgOj0gLi4vLi4vLi4vYnVpbGQKK0NPTVBJTEVSX05BTUUgOj0gZ2NjCisKKyMgV0lUSE9VVF9TVExQT1JUID0gMQorIyBTVExQT1JUX0RJUiA6PSAuLi8uLi8uLgoraW5jbHVkZSBNYWtlZmlsZS5pbmMKK2luY2x1ZGUgJHtTUkNST09UfS9NYWtlZmlsZXMvdG9wLm1haworCisjQ1hYRkxBR1MgKz0gLWZ1c2UtY3hhLWF0ZXhpdAorTERGTEFHUyArPSAtV2wsLXJwYXRoPSR7U1RMUE9SVF9MSUJfRElSfQpkaWZmIC0tZ2l0IGEvdGVzdC9jb21waWxlci9TdFRlcm0tb3JkZXIvTWFrZWZpbGUuaW5jIGIvdGVzdC9jb21waWxlci9TdFRlcm0tb3JkZXIvTWFrZWZpbGUuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1OTcwMzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvbXBpbGVyL1N0VGVybS1vcmRlci9NYWtlZmlsZS5pbmMKQEAgLTAsMCArMSw0IEBACisjIC0qLSBtYWtlZmlsZSAtKi0gVGltZS1zdGFtcDogPDAyLzA3LzE0IDE0OjAzOjEzIHB0cj4KKworUFJHTkFNRSA9IHN0dGVybS10ZXN0CitTUkNfQ0MgPSBzdHRlcm0tdGVzdC5jYwpkaWZmIC0tZ2l0IGEvdGVzdC9jb21waWxlci9TdFRlcm0tb3JkZXIvc3R0ZXJtLXRlc3QuY2MgYi90ZXN0L2NvbXBpbGVyL1N0VGVybS1vcmRlci9zdHRlcm0tdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDU0ZjdkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb21waWxlci9TdFRlcm0tb3JkZXIvc3R0ZXJtLXRlc3QuY2MKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBUaGUgY29udmVyc2F0aW9uIHdpdGggTWF0dGkgUmludGFsYSBvbiBTVExwb3J0IGZvcnVtIDIwMDUtMDgtMjQ6CisgKgorICogRG8geW91IG1lYW4gSVNPL0lFQyAxNDg4MiAzLjYuMyBbYmFzaWMuc3RhcnQudGVybV0/CisgKgorICogWWVzLiAiRGVzdHJ1Y3RvcnMgKDEyLjQpIGZvciBpbml0aWFsaXplZCBvYmplY3RzIG9mIHN0YXRpYyBzdG9yYWdlIGR1cmF0aW9uCisgKiAoZGVjbGFyZWQgYXQgYmxvY2sgc2NvcGUgb3IgYXQgbmFtZXNwYWNlIHNjb3BlKSBhcmUgY2FsbGVkIGFzIGEgcmVzdWx0CisgKiBvZiByZXR1cm5pbmcgZnJvbSBtYWluIGFuZCBhcyBhIHJlc3VsdCBvZiBjYWxsaW5nIGV4aXQgKDE4LjMpLiBUaGVzZSBvYmplY3RzCisgKiBhcmUgZGVzdHJveWVkIGluIHRoZSByZXZlcnNlIG9yZGVyIG9mIHRoZSBjb21wbGV0aW9uIG9mIHRoZWlyIGNvbnN0cnVjdG9yCisgKiBvciBvZiB0aGUgY29tcGxldGlvbiBvZiB0aGVpciBkeW5hbWljIGluaXRpYWxpemF0aW9uLiIKKyAqCisgKiBJIGZvdW5kIGEgY29uZmlybWF0aW9uIG9uIHRoZSB3ZWIgdGhhdCBnY2MgbWF5IG5vdCBzdHJpY3RseSBjb25mb3JtCisgKiB0byB0aGlzIGJlaGF2aW91ciBpbiBjZXJ0YWlucyBjYXNlcyB1bmxlc3MgLWZ1c2UtY3hhLWF0ZXhpdCBpcyB1c2VkLgorICoKKyAqIFRlc3QgYmVsb3cgZ2l2ZSAod2l0aG91dCAtZnVzZS1jeGEtYXRleGl0KQorCitJbml0OjpJbml0KCkKK0luaXQ6OnVzZV9pdAorSXQgY3RvciBkb25lICAgIDwtLSAwCitJbml0Ojp1c2VfaXQgZG9uZQorSW5pdCBjdG9yIGRvbmUgIDwtLSAxCitJbml0MiBjdG9yIGRvbmUgPC0tIDIKK0l0IGR0b3IgZG9uZSAgICA8LS0gMAorSW5pdDIgZHRvciBkb25lIDwtLSAyCitJbml0IGR0b3IgZG9uZSAgPC0tIDEKKworCisgKiBidXQgc2hvdWxkOgorCitJbml0OjpJbml0KCkKK0luaXQ6OnVzZV9pdAorSXQgY3RvciBkb25lICAgIDwtLSAwCitJbml0Ojp1c2VfaXQgZG9uZQorSW5pdCBjdG9yIGRvbmUgIDwtLSAxCitJbml0MiBjdG9yIGRvbmUgPC0tIDIKK0luaXQyIGR0b3IgZG9uZSA8LS0gMgorSW5pdCBkdG9yIGRvbmUgIDwtLSAxCitJdCBkdG9yIGRvbmUgICAgPC0tIDAKKworCisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCitjbGFzcyBJbml0Cit7CisgIHB1YmxpYzoKKyAgICBJbml0KCk7CisgICAgfkluaXQoKTsKKworICAgIHN0YXRpYyB2b2lkIHVzZV9pdCgpOworfTsKKworY2xhc3MgSW5pdDIKK3sKKyAgcHVibGljOgorICAgIEluaXQyKCk7CisgICAgfkluaXQyKCk7CisKK307CisKK3N0YXRpYyBJbml0IGluaXQ7CitzdGF0aWMgSW5pdDIgaW5pdDI7CisKK2NsYXNzIEl0Cit7CisgIHB1YmxpYzoKKyAgICBJdCgpOworICAgIH5JdCgpOworfTsKKworSW5pdDo6SW5pdCgpCit7CisgIHByaW50ZiggIkluaXQ6OkluaXQoKVxuIiApOworICB1c2VfaXQoKTsKKyAgcHJpbnRmKCAiSW5pdCBjdG9yIGRvbmVcbiIgKTsKK30KKworSW5pdDo6fkluaXQoKQoreworICBwcmludGYoICJJbml0IGR0b3IgZG9uZVxuIiApOworfQorCit2b2lkIEluaXQ6OnVzZV9pdCgpCit7CisgIHByaW50ZiggIkluaXQ6OnVzZV9pdFxuIiApOworCisgIHN0YXRpYyBJdCBpdDsKKworICBwcmludGYoICJJbml0Ojp1c2VfaXQgZG9uZVxuIiApOworfQorCitJbml0Mjo6SW5pdDIoKQoreworICBwcmludGYoICJJbml0MiBjdG9yIGRvbmVcbiIgKTsKK30KKworSW5pdDI6On5Jbml0MigpCit7CisgIHByaW50ZiggIkluaXQyIGR0b3IgZG9uZVxuIiApOworfQorCitJdDo6SXQoKQoreworICBwcmludGYoICJJdCBjdG9yIGRvbmVcbiIgKTsKK30KKworSXQ6On5JdCgpCit7CisgIHByaW50ZiggIkl0IGR0b3IgZG9uZVxuIiApOworfQorCitpbnQgbWFpbigpCit7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9jb21waWxlci9laC5jYyBiL3Rlc3QvY29tcGlsZXIvZWguY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhkYzkyMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29tcGlsZXIvZWguY2MKQEAgLTAsMCArMSw2MCBAQAorI2luY2x1ZGUgPGxpc3Q+IC8qIHJlcXVpcmVkLCB0byBleHBvc2UgYWxsb2NhdG9yICovCisjaW5jbHVkZSA8c3RkZXhjZXB0PgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK3N0cnVjdCBCaWdTdHJ1Y3QKK3sKKyAgY2hhciBfZGF0YVs0MDk2XTsKK307CisKK3ZvaWQgYmFkX2FsbG9jX3Rlc3QoKQoreworICB0eXBlZGVmIGFsbG9jYXRvcjxCaWdTdHJ1Y3Q+IEJpZ1N0cnVjdEFsbG9jVHlwZTsKKyAgQmlnU3RydWN0QWxsb2NUeXBlIGJpZ1N0cnVjdEFsbG9jOworCisgIHRyeSB7CisgICAgLy9MZXRzIHRyeSB0byBhbGxvY2F0ZSBhbG1vc3QgNDA5NiBHbyAob24gbW9zdCBvZiB0aGUgcGxhdGZvcm1zKSBvZiBtZW1vcnk6CisgICAgQmlnU3RydWN0QWxsb2NUeXBlOjpwb2ludGVyIHBiaWdTdHJ1Y3QgPSBiaWdTdHJ1Y3RBbGxvYy5hbGxvY2F0ZSgxMDI0ICogMTAyNCAqIDEwMjQpOworCisgICAgLy8gQ1BQVU5JVF9BU1NFUlQoIHBiaWdTdHJ1Y3QgIT0gMCAmJiAiQWxsb2NhdGlvbiBmYWlsZWQgYnV0IG5vIGV4Y2VwdGlvbiB0aHJvd24iICk7CisgIH0KKyAgY2F0Y2ggKGJhZF9hbGxvYyBjb25zdCYpIHsKKyAgICBwcmludGYoICJPa1xuIiApOworICB9CisgIGNhdGNoICguLi4pIHsKKyAgICAvL1dlIHNob3VsZG4ndCBiZSB0aGVyZToKKyAgICAvLyBDUFBVTklUX0FTU0VSVCggZmFsc2UgJiYgIk5vdCBiYWRfYWxsb2MgZXhjZXB0aW9uIHRocm93bi4iICk7CisgIH0KK30KKwordm9pZCBiYWRfYWxsb2NfdGVzdDEoKQoreworICB0cnkgeworICAgIGFsbG9jYXRvcjxCaWdTdHJ1Y3Q+IGFsbDsKKyAgICBCaWdTdHJ1Y3QgKmJzID0gYWxsLmFsbG9jYXRlKDEwMjQqMTAyNCoxMDI0KTsKKworICAgIC8vIHRocm93IGJhZF9hbGxvYygpOworICB9CisgIGNhdGNoICggYmFkX2FsbG9jIGNvbnN0ICYgKSB7CisgICAgcHJpbnRmKCAiSSBhbSBoZXJlXG4iICk7CisgIH0KKyAgY2F0Y2ggKCAuLi4gKSB7CisgIH0KK30KKworaW50IG1haW4oKQoreworICBiYWRfYWxsb2NfdGVzdCgpOworI2lmIDAKKyAgdHJ5IHsKKyAgICB0aHJvdyBiYWRfYWxsb2MoKTsKKyAgfQorICBjYXRjaCAoIGJhZF9hbGxvYyYgKSB7CisgIH0KKyAgY2F0Y2ggKCAuLi4gKSB7CisgIH0KKyNlbmRpZgorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvY29tcGlsZXIvZ2NjLm1hayBiL3Rlc3QvY29tcGlsZXIvZ2NjLm1hawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTFlZGVkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb21waWxlci9nY2MubWFrCkBAIC0wLDAgKzEsMTIgQEAKKyMgLSotIE1ha2VmaWxlIC0qLSBUaW1lLXN0YW1wOiA8MDQvMDMvMTQgMjM6NTA6NTcgcHRyPgorCitTUkNST09UIDo9IC4uLy4uL2J1aWxkCitDT01QSUxFUl9OQU1FIDo9IGdjYworCitBTExfVEFHUyA6PSBjb21waWxlLW9ubHkKK1NUTFBPUlRfRElSIDo9IC4uLy4uCitpbmNsdWRlIE1ha2VmaWxlLmluYworaW5jbHVkZSAke1NSQ1JPT1R9L01ha2VmaWxlcy90b3AubWFrCisKK2NvbXBpbGUtb25seToJJChPVVRQVVRfRElSUykgJChPQkopCisKZGlmZiAtLWdpdCBhL3Rlc3QvY29tcGlsZXIvbW92YWJsZS5jcHAgYi90ZXN0L2NvbXBpbGVyL21vdmFibGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NTkwYjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvbXBpbGVyL21vdmFibGUuY3BwCkBAIC0wLDAgKzEsMjAgQEAKKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK3N0cnVjdCBTIDoKKyAgICBwdWJsaWMgc3RyaW5nCit7Cit9OworCit2b2lkIHRlc3QoKQoreworICBsaXN0PFM+IGw7CisgIGwucHVzaF9iYWNrKCBTKCkgKTsKKworICB2ZWN0b3I8Uz4gdjsKKyAgdi5wdXNoX2JhY2soIFMoKSApOworfQorCmRpZmYgLS1naXQgYS90ZXN0L2NvbXBpbGVyL3BhcnRpYWxfc3BlYy5jcHAgYi90ZXN0L2NvbXBpbGVyL3BhcnRpYWxfc3BlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU3MmNkNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29tcGlsZXIvcGFydGlhbF9zcGVjLmNwcApAQCAtMCwwICsxLDM0IEBACisvKgorICogSXQgaXMga25vd24gdGhhdCB0aGlzIGNvZGUgbm90IGNvbXBpbGVkIGJ5IGZvbGxvd2luZyBjb21waWxlcnM6CisgKgorICogICBNU1ZDIDYKKyAqCisgKiBJdCBpcyBrbm93biB0aGF0IHRoaXMgY29kZSBjb21waWxlZCBieSBmb2xsb3dpbmcgY29tcGlsZXJzOgorICoKKyAqICAgTVNWQyA4CisgKiAgIGdjYyA0LjEuMQorICovCisKKy8qCisgKiBUaGlzIGNvZGUgcmVwcmVzZW50IHdoYXQgU1RMcG9ydCB3YWl0cyBmcm9tIGEgY29tcGlsZXIgd2hpY2ggc3VwcG9ydAorICogdGhlIHBhcnRpYWwgdGVtcGxhdGUgZnVuY3Rpb24gb3JkZXJpbmcgKCFfU1RMUF9OT19GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIpCisgKi8KKwordGVtcGxhdGUgPGNsYXNzIFQxPgorc3RydWN0IHRlbXBsYXRlX3N0cnVjdCB7fTsKKwordGVtcGxhdGUgPGNsYXNzIFQxPgoraW50IGZ1bmMoVDEgcDEpOworCit0ZW1wbGF0ZSA8Y2xhc3MgVDE+CitpbnQgZnVuYyh0ZW1wbGF0ZV9zdHJ1Y3Q8VDE+KTsKKworCitpbnQgZm9vKCkKK3sKKyAgaW50IHRtcDEgPSAwOworICB0ZW1wbGF0ZV9zdHJ1Y3Q8aW50PiB0bXAyOworICBmdW5jKHRtcDEpOworICBmdW5jKHRtcDIpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvY29tcGlsZXIvdHRlaTEuY3BwIGIvdGVzdC9jb21waWxlci90dGVpMS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQzMGQ5NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29tcGlsZXIvdHRlaTEuY3BwCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBJdCBpcyBrbm93biB0aGF0IHRoaXMgY29kZSBub3QgY29tcGlsZWQgYnkgZm9sbG93aW5nIGNvbXBpbGVyczoKKyAqICAgZ2NjIDIuOTUuMworICogICBNU1ZDIDYKKyAqCisgKiBJdCBpcyBrbm93biB0aGF0IHRoaXMgY29kZSBjb21waWxlZCBieSBmb2xsb3dpbmcgY29tcGlsZXJzOgorICogICBnY2MgMy4zLjMKKyAqICAgZ2NjIDMuNC4xCisgKiAgIE1TVkMgOCBCZXRhCisgKi8KKworc3RydWN0IEEKK3sKKyAgcHJpdmF0ZToKKyAgICBzdHJ1Y3QgQgorICAgIHsKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgICAgICAgIHN0YXRpYyB2b2lkIGYoIFQmICkge30KKworICAgICAgICB0ZW1wbGF0ZSA8Ym9vbCBWPgorICAgICAgICBzdHJ1Y3QgQworICAgICAgICB7CisgICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICAgICAgICAgIHN0YXRpYyB2b2lkIGYoIFQmICkge30KKyAgICAgICAgfTsKKyAgICB9OworfTsKKwordGVtcGxhdGUgPD4gdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIEE6OkI6OkM8dHJ1ZT46OmYoIFQmICkge30KKwpkaWZmIC0tZ2l0IGEvdGVzdC9jb21waWxlci90dGVpMi5jcHAgYi90ZXN0L2NvbXBpbGVyL3R0ZWkyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGY4YTE4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb21waWxlci90dGVpMi5jcHAKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIEl0IGlzIGtub3duIHRoYXQgdGhpcyBjb2RlIG5vdCBjb21waWxlZCBieSBmb2xsb3dpbmcgY29tcGlsZXJzOgorICoKKyAqIEl0IGlzIGtub3duIHRoYXQgdGhpcyBjb2RlIGNvbXBpbGVkIGJ5IGZvbGxvd2luZyBjb21waWxlcnM6CisgKiAgIGdjYyAyLjk1LjMKKyAqICAgZ2NjIDMuMy4zCisgKiAgIGdjYyAzLjQuMQorICogICBNU1ZDIDYKKyAqICAgTVNWQyA4CisgKi8KKworc3RydWN0IEEKK3sKKyAgcHJpdmF0ZToKKyAgICBzdHJ1Y3QgQgorICAgIHsKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgICAgICAgIHN0YXRpYyB2b2lkIGYoIFQmICkge30KKworICAgICAgICB0ZW1wbGF0ZSA8Ym9vbCBWPgorICAgICAgICBzdHJ1Y3QgQworICAgICAgICB7CisgICAgICAgIH07CisgICAgfTsKK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgQTo6Qjo6Qzx0cnVlPgoreworfTsKKwpkaWZmIC0tZ2l0IGEvdGVzdC9jb21waWxlci90dGVpMy5jcHAgYi90ZXN0L2NvbXBpbGVyL3R0ZWkzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2NkY2EyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb21waWxlci90dGVpMy5jcHAKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIEl0IGlzIGtub3duIHRoYXQgdGhpcyBjb2RlIG5vdCBjb21waWxlZCBieSBmb2xsb3dpbmcgY29tcGlsZXJzOgorICogICBnY2MgMi45NS4zCisgKiAgIGdjYyAzLjMuMworICogICBnY2MgMy40LjEKKyAqICAgZ2NjIDQuMS4xCisgKgorICogSXQgaXMga25vd24gdGhhdCB0aGlzIGNvZGUgY29tcGlsZWQgYnkgZm9sbG93aW5nIGNvbXBpbGVyczoKKyAqCisgKiAgIE1TVkMgNgorICogICBNU1ZDIDggQmV0YQorICovCisKKy8qCisgKiBJbmRlZWQgdGhpcyBjb2RlIGlzIHdyb25nOiBleHBsaWNpdCB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbgorICogaGF2ZSB0byBhcHBlYXIgb3V0LW9mLWNsYXNzLgorICoKKyAqLworCitzdHJ1Y3QgQQoreworICBwcml2YXRlOgorICAgIHN0cnVjdCBCCisgICAgeworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICAgICAgc3RhdGljIHZvaWQgZiggVCYgKSB7fQorCisgICAgICAgIHRlbXBsYXRlIDxib29sIFY+CisgICAgICAgIHN0cnVjdCBDCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgICAgICAgICAgc3RhdGljIHZvaWQgZiggVCYgKSB7fQorICAgICAgICB9OworCisgICAgICAgIHRlbXBsYXRlIDw+CisgICAgICAgIHN0cnVjdCBDPHRydWU+CisgICAgICAgIHsKKyAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgICAgICAgICAgc3RhdGljIHZvaWQgZiggVCYgKSB7fQorICAgICAgICB9OworICAgIH07Cit9OworCmRpZmYgLS1naXQgYS90ZXN0L2NvbXBpbGVyL3R0ZWk0LmNwcCBiL3Rlc3QvY29tcGlsZXIvdHRlaTQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNTZlMGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvbXBpbGVyL3R0ZWk0LmNwcApAQCAtMCwwICsxLDQyIEBACisvKgorICogSXQgaXMga25vd24gdGhhdCB0aGlzIGNvZGUgbm90IGNvbXBpbGVkIGJ5IGZvbGxvd2luZyBjb21waWxlcnM6CisgKiAgIGdjYyAyLjk1LjMKKyAqICAgZ2NjIDMuMy4zCisgKiAgIGdjYyAzLjQuMQorICogICBnY2MgNC4xLjEKKyAqCisgKiBJdCBpcyBrbm93biB0aGF0IHRoaXMgY29kZSBjb21waWxlZCBieSBmb2xsb3dpbmcgY29tcGlsZXJzOgorICoKKyAqICAgTVNWQyA2CisgKiAgIE1TVkMgOCBCZXRhCisgKi8KKworLyoKKyAqIEluZGVlZCB0aGlzIGNvZGUgaXMgd3Jvbmc6IDEuIGV4cGxpY2l0IHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uCisgKiBoYXZlIHRvIGFwcGVhciBvdXQtb2YtY2xhc3M7IDIuIHNwZWNpYWxpemVkIHN0cnVjdCBDIGhhdmUgdG8KKyAqIGhhdmUgZnVuY3Rpb24gZi4KKyAqCisgKi8KKworc3RydWN0IEEKK3sKKyAgcHJpdmF0ZToKKyAgICBzdHJ1Y3QgQgorICAgIHsKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgICAgICAgIHN0YXRpYyB2b2lkIGYoIFQmICkge30KKworICAgICAgICB0ZW1wbGF0ZSA8Ym9vbCBWPgorICAgICAgICBzdHJ1Y3QgQworICAgICAgICB7CisgICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICAgICAgICAgIHN0YXRpYyB2b2lkIGYoIFQmICkge30KKyAgICAgICAgfTsKKworICAgICAgICB0ZW1wbGF0ZSA8PgorICAgICAgICBzdHJ1Y3QgQzx0cnVlPgorICAgICAgICB7CisgICAgICAgIH07CisgICAgfTsKK307CisKZGlmZiAtLWdpdCBhL3Rlc3QvY29tcGlsZXIvdHRlaTUuY3BwIGIvdGVzdC9jb21waWxlci90dGVpNS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJjOTE2ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29tcGlsZXIvdHRlaTUuY3BwCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBJdCBpcyBrbm93biB0aGF0IHRoaXMgY29kZSBub3QgY29tcGlsZWQgYnkgZm9sbG93aW5nIGNvbXBpbGVyczoKKyAqICAgZ2NjIDMuNC4xCisgKiAgIGdjYyA0LjEuMQorICoKKyAqIEl0IGlzIGtub3duIHRoYXQgdGhpcyBjb2RlIGNvbXBpbGVkIGJ5IGZvbGxvd2luZyBjb21waWxlcnM6CisgKiAgIGdjYyAyLjk1LjMKKyAqICAgZ2NjIDMuMy4zCisgKgorICogICBNU1ZDIDYKKyAqICAgTVNWQyA4IEJldGEKKyAqLworCisvKgorICogSW5kZWVkIHRoaXMgY29kZSBpcyB3cm9uZzogZXhwbGljaXQgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24KKyAqIGhhdmUgdG8gYXBwZWFyIG91dC1vZi1jbGFzcy4KKyAqCisgKi8KKworc3RydWN0IEEKK3sKKyAgcHJpdmF0ZToKKyAgICBzdHJ1Y3QgQgorICAgIHsKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgICAgICAgIHN0YXRpYyB2b2lkIGYoIFQmICkge30KKworICAgICAgICB0ZW1wbGF0ZSA8Ym9vbCBWPgorICAgICAgICBzdHJ1Y3QgQworICAgICAgICB7CisgICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICAgICAgICAgIHN0YXRpYyB2b2lkIGYoIFQmICkge30KKyAgICAgICAgfTsKKworICAgICAgICB0ZW1wbGF0ZSA8PgorICAgICAgICBzdHJ1Y3QgQzx0cnVlPgorICAgICAgICB7CisgICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICAgICAgICAgIHN0YXRpYyB2b2lkIGYoIFQmICkge30KKyAgICAgICAgfTsKKyAgICB9OworfTsKKwpkaWZmIC0tZ2l0IGEvdGVzdC9jb21waWxlci90dGVpNi5jcHAgYi90ZXN0L2NvbXBpbGVyL3R0ZWk2LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTUxZTIyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb21waWxlci90dGVpNi5jcHAKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIEl0IGlzIGtub3duIHRoYXQgdGhpcyBjb2RlIG5vdCBjb21waWxlZCBieSBmb2xsb3dpbmcgY29tcGlsZXJzOgorICoKKyAqIEl0IGlzIGtub3duIHRoYXQgdGhpcyBjb2RlIGNvbXBpbGVkIGJ5IGZvbGxvd2luZyBjb21waWxlcnM6CisgKgorICogICBNU1ZDIDYKKyAqICAgTVNWQyA4IEJldGEKKyAqLworCisvKgorICogVGhpcyBjb2RlIHJlcHJlc2VudCB3aGF0IFNUTHBvcnQgd2FpdHMgZnJvbSBhIGNvbXBpbGVyIHdoaWNoIHN1cHBvcnQKKyAqIG1lbWJlciB0ZW1wbGF0ZSBjbGFzc2VzICghX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFX0NMQVNTRVMpCisgKi8KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxPgorc3RydWN0IEEKK3sKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQyPgorICBzdHJ1Y3QgQgorICB7CisgICAgdHlwZWRlZiBUMiBfVHlwZTsKKyAgfTsKK307CisKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK3N0cnVjdCBDCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgQTxUMT46OiB0ZW1wbGF0ZSBCPFQyPjo6X1R5cGUgQUJUeXBlOworfTsKZGlmZiAtLWdpdCBhL3Rlc3QvY29tcGlsZXIvdHRlaTcuY3BwIGIvdGVzdC9jb21waWxlci90dGVpNy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg3NDJlMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29tcGlsZXIvdHRlaTcuY3BwCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBJdCBpcyBrbm93biB0aGF0IHRoaXMgY29kZSBub3QgY29tcGlsZWQgYnkgZm9sbG93aW5nIGNvbXBpbGVyczoKKyAqCisgKiAgIE1TVkMgNgorICoKKyAqIEl0IGlzIGtub3duIHRoYXQgdGhpcyBjb2RlIGNvbXBpbGVkIGJ5IGZvbGxvd2luZyBjb21waWxlcnM6CisgKgorICogICBNU1ZDIDggQmV0YQorICovCisKKy8qCisgKiBUaGlzIGNvZGUgcmVwcmVzZW50IHdoYXQgU1RMcG9ydCB3YWl0cyBmcm9tIGEgY29tcGlsZXIgd2hpY2ggc3VwcG9ydAorICogdGhlIHJlYmluZCBtZW1iZXIgdGVtcGxhdGUgY2xhc3MgdGVjaG5pcXVlICghX1NUTFBfRE9OVF9TVVBQT1JUX1JFQklORF9NRU1CRVJfVEVNUExBVEUpCisgKi8KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxPgorc3RydWN0IEEKK3sKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQyPgorICBzdHJ1Y3QgQgorICB7CisgICAgdHlwZWRlZiBBPFQyPiBfVHlwZTsKKyAgfTsKK307CisKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEE+CitzdHJ1Y3QgQworeworICB0eXBlZGVmIHR5cGVuYW1lIEE6OiB0ZW1wbGF0ZSBCPFQ+OjpfVHlwZSBfQVRUeXBlOworfTsKZGlmZiAtLWdpdCBhL3Rlc3QvZWgvTGVha0NoZWNrLmggYi90ZXN0L2VoL0xlYWtDaGVjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZTcyNjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2VoL0xlYWtDaGVjay5oCkBAIC0wLDAgKzEsMTk4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBNYXJrIG9mIHRoZSBVbmljb3JuLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBNYXJrIG9mIHRoZSBVbmljb3JuIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICBMZWFrQ2hlY2suaAorCisgICAgU1VNTUFSWTogQSBzdWl0ZSBvZiB0ZW1wbGF0ZSBmdW5jdGlvbnMgZm9yIHZlcmlmeWluZyB0aGUgYmVoYXZpb3Igb2YKKyAgICAgIG9wZXJhdGlvbnMgaW4gdGhlIHByZXNlbmNlIG9mIGV4Y2VwdGlvbnMuIFJlcXVpcmVzIHRoYXQgdGhlIG9wZXJhdGlvbnMKKyAgICAgIGJlIHdyaXR0ZW4gc28gdGhhdCBlYWNoIG9wZXJhdGlvbiB0aGF0IGNvdWxkIGNhdXNlIGFuIGV4Y2VwdGlvbiBjYXVzZXMKKyAgICAgIHNpbXVsYXRlX3Bvc3NpYmxlX2ZhaWx1cmUoKSB0byBiZSBjYWxsZWQgKHNlZSAibmNfYWxsb2MuaCIpLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgSU5DTFVERURfTU9UVV9MZWFrQ2hlY2sKKyNkZWZpbmUgSU5DTFVERURfTU9UVV9MZWFrQ2hlY2sgMQorCisjaW5jbHVkZSAiUHJlZml4LmgiCisKKyNpbmNsdWRlICJuY19hbGxvYy5oIgorCisjaW5jbHVkZSA8Y3N0ZGlvPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworRUhfQkVHSU5fTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBUMSwgY2xhc3MgVDI+CitpbmxpbmUgb3N0cmVhbSYgb3BlcmF0b3IgPDwgKAorb3N0cmVhbSYgcywKK2NvbnN0IHBhaXIgPFQxLCBUMj4mIHApIHsKKyAgICByZXR1cm4gczw8J1snPDxwLmZpcnN0PDwiOiI8PHAuc2Vjb25kPDwnXSc7Cit9CitFSF9FTkRfTkFNRVNQQUNFCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQ2hlY2tJbnZhcmlhbnQKKworICBFRkZFQ1RTOiAgR2VuZXJhbGl6ZWQgZnVuY3Rpb24gdG8gY2hlY2sgYW4gaW52YXJpYW50IG9uIGEgY29udGFpbmVyLiBTcGVjaWFsaXplCisgICAgdGhpcyBmb3IgcGFydGljdWxhciBjb250YWluZXJzIGlmIHN1Y2ggYSBjaGVjayBpcyBhdmFpbGFibGUuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordGVtcGxhdGUgPGNsYXNzIEM+Cit2b2lkIENoZWNrSW52YXJpYW50KGNvbnN0IEMmKQore30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBXZWFrQ2hlY2sKKworICBFRkZFQ1RTOiBHaXZlbiBhIHZhbHVlIGFuZCBhbiBvcGVyYXRpb24sIHJlcGVhdGVkbHkgYXBwbGllcyB0aGUgb3BlcmF0aW9uIHRvIGEKKyAgICBjb3B5IG9mIHRoZSB2YWx1ZSB0cmlnZ2VyaW5nIHRoZSBudGggcG9zc2libGUgZXhjZXB0aW9uLCB3aGVyZSBuIGluY3JlbWVudHMKKyAgICB3aXRoIGVhY2ggcmVwZXRpdGlvbiB1bnRpbCBubyBleGNlcHRpb24gaXMgdGhyb3duIG9yIG1heF9pdGVycyBpcyByZWFjaGVkLgorICAgIFJlcG9ydHMgYW55IGRldGVjdGVkIG1lbW9yeSBsZWFrcyBhbmQgY2hlY2tzIGFueSBpbnZhcmlhbnQgZGVmaW5lZCBmb3IgdGhlCisgICAgdmFsdWUgdHlwZSB3aGV0aGVyIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMgb3IgZmFpbHMuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordGVtcGxhdGUgPGNsYXNzIFZhbHVlLCBjbGFzcyBPcGVyYXRpb24+Cit2b2lkIFdlYWtDaGVjayhjb25zdCBWYWx1ZSYgdiwgY29uc3QgT3BlcmF0aW9uJiBvcCwgbG9uZyBtYXhfaXRlcnMgPSAyMDAwMDAwKSB7CisgIGJvb2wgc3VjY2VlZGVkID0gZmFsc2U7CisgIGJvb2wgZmFpbGVkID0gZmFsc2U7CisgIGdUZXN0Q29udHJvbGxlci5TZXRDdXJyZW50VGVzdENhdGVnb3J5KCJ3ZWFrIik7CisgIGZvciAobG9uZyBjb3VudCA9IDA7ICFzdWNjZWVkZWQgJiYgIWZhaWxlZCAmJiBjb3VudCA8IG1heF9pdGVyczsgKytjb3VudCkgeworICAgIGdUZXN0Q29udHJvbGxlci5CZWdpbkxlYWtEZXRlY3Rpb24oKTsKKyAgICB7CisgICAgICBWYWx1ZSBkdXAgPSB2OworI2lmbmRlZiBFSF9OT19FWENFUFRJT05TCisgICAgICB0cnkgeworI2VuZGlmCisgICAgICAgIGdUZXN0Q29udHJvbGxlci5TZXRGYWlsdXJlQ291bnRkb3duKGNvdW50KTsKKyAgICAgICAgb3AoIGR1cCApOworICAgICAgICBzdWNjZWVkZWQgPSB0cnVlOworI2lmbmRlZiBFSF9OT19FWENFUFRJT05TCisgICAgICB9CisgICAgICBjYXRjaCAoLi4uKSB7fSAgLy8gSnVzdCB0cnkgYWdhaW4uCisjZW5kaWYKKyAgICAgIGdUZXN0Q29udHJvbGxlci5DYW5jZWxGYWlsdXJlQ291bnRkb3duKCk7CisgICAgICBDaGVja0ludmFyaWFudChkdXApOworICAgIH0KKyAgICBmYWlsZWQgPSBnVGVzdENvbnRyb2xsZXIuUmVwb3J0TGVha2VkKCk7CisgICAgRUhfQVNTRVJUKCAhZmFpbGVkICk7CisKKyAgICBpZiAoIHN1Y2NlZWRlZCApCisgICAgICBnVGVzdENvbnRyb2xsZXIuUmVwb3J0U3VjY2Vzcyhjb3VudCk7CisgIH0KKyAgRUhfQVNTRVJUKCBzdWNjZWVkZWQgfHwgZmFpbGVkICk7ICAvLyBNYWtlIHN1cmUgdGhlIGNvdW50IGhhc24ndCBnb25lIG92ZXIKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBDb25zdENoZWNrCisKKyAgRUZGRUNUUzogIFNpbWlsYXIgdG8gV2Vha0NoZWNrIChhYm92ZSksIGJ1dCBmb3Igb3BlcmF0aW9ucyB3aGljaCBtYXkgbm90IG1vZGlmeQorICAgIHRoZWlyIGFyZ3VtZW50cy4gVGhlIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgb24gdGhlIHZhbHVlIGl0c2VsZiwgYW5kIG5vCisgICAgaW52YXJpYW50IGNoZWNraW5nIGlzIHBlcmZvcm1lZC4gTGVhayBjaGVja2luZyBzdGlsbCBvY2N1cnMuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordGVtcGxhdGUgPGNsYXNzIFZhbHVlLCBjbGFzcyBPcGVyYXRpb24+Cit2b2lkIENvbnN0Q2hlY2soY29uc3QgVmFsdWUmIHYsIGNvbnN0IE9wZXJhdGlvbiYgb3AsIGxvbmcgbWF4X2l0ZXJzID0gMjAwMDAwMCkgeworICBib29sIHN1Y2NlZWRlZCA9IGZhbHNlOworICBib29sIGZhaWxlZCA9IGZhbHNlOworICBnVGVzdENvbnRyb2xsZXIuU2V0Q3VycmVudFRlc3RDYXRlZ29yeSgiY29uc3QiKTsKKyAgZm9yIChsb25nIGNvdW50ID0gMDsgIXN1Y2NlZWRlZCAmJiAhZmFpbGVkICYmIGNvdW50IDwgbWF4X2l0ZXJzOyArK2NvdW50KSB7CisgICAgZ1Rlc3RDb250cm9sbGVyLkJlZ2luTGVha0RldGVjdGlvbigpOworICAgIHsKKyNpZm5kZWYgRUhfTk9fRVhDRVBUSU9OUworICAgICAgdHJ5IHsKKyNlbmRpZgorICAgICAgICBnVGVzdENvbnRyb2xsZXIuU2V0RmFpbHVyZUNvdW50ZG93bihjb3VudCk7CisgICAgICAgIG9wKCB2ICk7CisgICAgICAgIHN1Y2NlZWRlZCA9IHRydWU7CisjaWZuZGVmIEVIX05PX0VYQ0VQVElPTlMKKyAgICAgIH0KKyAgICAgIGNhdGNoKC4uLikge30gIC8vIEp1c3QgdHJ5IGFnYWluLgorIyBlbmRpZgorICAgICAgZ1Rlc3RDb250cm9sbGVyLkNhbmNlbEZhaWx1cmVDb3VudGRvd24oKTsKKyAgICB9CisgICAgZmFpbGVkID0gZ1Rlc3RDb250cm9sbGVyLlJlcG9ydExlYWtlZCgpOworICAgIEVIX0FTU0VSVCggIWZhaWxlZCApOworCisgICAgaWYgKCBzdWNjZWVkZWQgKQorICAgICAgZ1Rlc3RDb250cm9sbGVyLlJlcG9ydFN1Y2Nlc3MoY291bnQpOworICB9CisgIEVIX0FTU0VSVCggc3VjY2VlZGVkIHx8IGZhaWxlZCApOyAgLy8gTWFrZSBzdXJlIHRoZSBjb3VudCBoYXNuJ3QgZ29uZSBvdmVyCit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgU3Ryb25nQ2hlY2sKKworICBFRkZFQ1RTOiAgU2ltaWxhciB0byBXZWFrQ2hlY2sgKGFib3ZlKSwgYnV0IGFkZGl0aW9uYWxseSBjaGVja3MgYSBjb21wb25lbnQgb2YKKyAgICB0aGUgInN0cm9uZyBndWFyYW50ZWUiOiBpZiB0aGUgb3BlcmF0aW9uIGZhaWxzIGR1ZSB0byBhbiBleGNlcHRpb24sIHRoZQorICAgIHZhbHVlIGJlaW5nIG9wZXJhdGVkIG9uIG11c3QgYmUgdW5jaGFuZ2VkLCBhcyBjaGVja2VkIHdpdGggb3BlcmF0b3I9PSgpLgorCisgIENBVkVBVFM6IE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IGNoZWNrIGV2ZXJ5dGhpbmcgcmVxdWlyZWQgZm9yIHRoZSBzdHJvbmcKKyAgICBndWFyYW50ZWUsIHdoaWNoIHNheXMgdGhhdCBpZiBhbiBleGNlcHRpb24gaXMgdGhyb3duLCB0aGUgb3BlcmF0aW9uIGhhcyBubworICAgIGVmZmVjdHMuIERvIGRvIHRoYXQgd2Ugd291bGQgaGF2ZSB0byBjaGVjayB0aGF0IG5vIHRoZXJlIHdlcmUgbm8gc2lkZS1lZmZlY3RzCisgICAgb24gb2JqZWN0cyB3aGljaCBhcmUgbm90IHBhcnQgb2YgdiAoZS5nLiBpdGVyYXRvciB2YWxpZGl0eSBtdXN0IGJlIHByZXNlcnZlZCkuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit0ZW1wbGF0ZSA8Y2xhc3MgVmFsdWUsIGNsYXNzIE9wZXJhdGlvbj4KK3ZvaWQgU3Ryb25nQ2hlY2soY29uc3QgVmFsdWUmIHYsIGNvbnN0IE9wZXJhdGlvbiYgb3AsIGxvbmcgbWF4X2l0ZXJzID0gMjAwMDAwMCkgeworICBib29sIHN1Y2NlZWRlZCA9IGZhbHNlOworICBib29sIGZhaWxlZCA9IGZhbHNlOworICBnVGVzdENvbnRyb2xsZXIuU2V0Q3VycmVudFRlc3RDYXRlZ29yeSgic3Ryb25nIik7CisgIGZvciAoIGxvbmcgY291bnQgPSAwOyAhc3VjY2VlZGVkICYmICFmYWlsZWQgJiYgY291bnQgPCBtYXhfaXRlcnM7IGNvdW50KysgKSB7CisgICAgZ1Rlc3RDb250cm9sbGVyLkJlZ2luTGVha0RldGVjdGlvbigpOworCisgICAgeworICAgICAgVmFsdWUgZHVwID0gdjsKKyAgICAgIHsKKyNpZm5kZWYgRUhfTk9fRVhDRVBUSU9OUworICAgICAgICB0cnkgeworI2VuZGlmCisgICAgICAgICAgZ1Rlc3RDb250cm9sbGVyLlNldEZhaWx1cmVDb3VudGRvd24oY291bnQpOworICAgICAgICAgIG9wKCBkdXAgKTsKKyAgICAgICAgICBzdWNjZWVkZWQgPSB0cnVlOworICAgICAgICAgIGdUZXN0Q29udHJvbGxlci5DYW5jZWxGYWlsdXJlQ291bnRkb3duKCk7CisjIGlmbmRlZiBFSF9OT19FWENFUFRJT05TCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKC4uLikgeworICAgICAgICAgIGdUZXN0Q29udHJvbGxlci5DYW5jZWxGYWlsdXJlQ291bnRkb3duKCk7CisgICAgICAgICAgYm9vbCB1bmNoYW5nZWQgPSAoZHVwID09IHYpOworICAgICAgICAgIEVIX0FTU0VSVCggdW5jaGFuZ2VkICk7CisKKyAgICAgICAgICBpZiAoICF1bmNoYW5nZWQgKSB7CisjaWYgMAorICAgICAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSBWYWx1ZTo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICAgICAgICAgICAgRUhfU1REOjpvc3RyZWFtX2l0ZXJhdG9yPHZhbHVlX3R5cGU+IG8oRUhfU1REOjpjZXJyLCAiICIpOworICAgICAgICAgICAgRUhfU1REOjpjZXJyPDwiRUggdGVzdCBGQUlMRUQ6XG5TdHJvbmcgZ3VhcmFuZWUgZmFpbGVkICFcbiI7CisgICAgICAgICAgICBFSF9TVEQ6OmNvcHkoZHVwLmJlZ2luKCksIGR1cC5lbmQoKSwgbyk7CisgICAgICAgICAgICBFSF9TVEQ6OmNlcnI8PCJcbk9yaWdpbmFsIGlzOlxuIjsKKyAgICAgICAgICAgIEVIX1NURDo6Y29weSh2LmJlZ2luKCksIHYuZW5kKCksIG8pOworICAgICAgICAgICAgRUhfU1REOjpjZXJyPDxFSF9TVEQ6OmVuZGw7CisjZW5kaWYKKyAgICAgICAgICAgIGZhaWxlZCA9IHRydWU7CisgICAgICAgICAgfQorICAgICAgICB9ICAvLyBKdXN0IHRyeSBhZ2Fpbi4KKyMgZW5kaWYKKyAgICAgICAgQ2hlY2tJbnZhcmlhbnQodik7CisgICAgICB9CisgICAgfQorCisgICAgYm9vbCBsZWFrZWQgPSBnVGVzdENvbnRyb2xsZXIuUmVwb3J0TGVha2VkKCk7CisgICAgRUhfQVNTRVJUKCAhbGVha2VkICk7CisgICAgaWYgKCBsZWFrZWQgKQorICAgICAgZmFpbGVkID0gdHJ1ZTsKKworICAgIGlmICggc3VjY2VlZGVkICkKKyAgICAgIGdUZXN0Q29udHJvbGxlci5SZXBvcnRTdWNjZXNzKGNvdW50KTsKKyAgfQorICBFSF9BU1NFUlQoIHN1Y2NlZWRlZCB8fCBmYWlsZWQgKTsgIC8vIE1ha2Ugc3VyZSB0aGUgY291bnQgaGFzbid0IGdvbmUgb3ZlcgorfQorCisjZW5kaWYgLy8gSU5DTFVERURfTU9UVV9MZWFrQ2hlY2sKZGlmZiAtLWdpdCBhL3Rlc3QvZWgvUHJlZml4LmggYi90ZXN0L2VoL1ByZWZpeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ZmZkMzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2VoL1ByZWZpeC5oCkBAIC0wLDAgKzEsMzEzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgUHJlZml4LmgKKworICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBNYXJrIG9mIHRoZSBVbmljb3JuLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBNYXJrIG9mIHRoZSBVbmljb3JuIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisKKyAgICBTVU1NQVJZOiBDb25maWd1cmF0aW9uICNkZWZpbmVzIGZvciBTVEwgRUggdGVzdCBzdWl0ZQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBJTkNMVURFRF9NT1RVX1ByZWZpeAorI2RlZmluZSBJTkNMVURFRF9NT1RVX1ByZWZpeCAxCisKKy8vIEdpdmVzIG11Y2ggbW9yZSB0aG9yb3VnaCBjaGVja2luZywgYnV0IG1heSBzbG93IHRoZSB0ZXN0cworLy8gY29uc2lkZXJhYmx5IGlmIHlvdXIgbWFsbG9jIGlzIHNsb3cuCisjZGVmaW5lIFRFU1RDTEFTU19ERUVQX0RBVEEgMQorCisjIGlmbmRlZiBOT19GQVNUX0FMTE9DQVRPUgorLy8gIyAgZGVmaW5lIE5PX0ZBU1RfQUxMT0NBVE9SCisjIGVuZGlmCisKKy8vIERlZmluZSB0aGlzIHRvIHVzZSB0aGUgU0dJIFNUTC4gVW5kZWZpbmUgaXQgdG8gdGVzdCBhIGRpZmZlcmVudCBpbnN0YWxsYXRpb24KKyNpZm5kZWYgRUhfTk9fU0dJX1NUTAorIyBkZWZpbmUgRUhfVVNFX1NHSV9TVEwgMQorI2VuZGlmCisKKyNpZiBFSF9VU0VfU0dJX1NUTAorCisjZGVmaW5lIEVIX0FTU0VSVCBfU1RMUF9BU1NFUlQKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBTR0kgU1RMLXNwZWNpZmljICNkZWZpbmVzCisvLyAgVGhlc2UgY29udHJvbCB0aGUgYmVoYXZpb3Igb2YgdGhlIHRlc3Qgc3VpdGUgd2hlbiB1c2VkIHdpdGggdGhlIFNHSQorLy8gIFNUTC4gVGhleSBoYXZlIG5vIGVmZmVjdCB3aGVuIHRlc3Rpbmcgb3RoZXIgU1RMIGltcGxlbWVudGF0aW9ucy4KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaWZuZGVmIF9TVExQX1VTRV9ORVdBTExPQworIyAgZGVmaW5lIF9TVExQX1VTRV9ORVdBTExPQworI2VuZGlmCisKKyNpZiAwIC8vICFkZWZpbmVkICAoX1NUTFBfTk9fQ1VTVE9NX0lPKSAmJiAhIGRlZmluZWQgKF9fQk9STEFORENfXykKKyMgIGRlZmluZSBfU1RMUF9OT19DVVNUT01fSU8KKyNlbmRpZgorCisvLyBKdXN0IGluY2x1ZGUgc29tZXRoaW5nIHRvIGdldCB3aGF0ZXZlciBjb25maWd1cmF0aW9uIGhlYWRlciB3ZSdyZSB1c2luZy4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaWZuZGVmIF9TVExQX0NBTEwKKyMgIGRlZmluZSBfU1RMUF9DQUxMCisjZW5kaWYKKworI2lmIGRlZmluZWQoX1NUTFBfVVNFX05BTUVTUEFDRVMpCisjICBkZWZpbmUgRUhfVVNFX05BTUVTUEFDRVMgX1NUTFBfVVNFX05BTUVTUEFDRVMKKyNlbmRpZgorCisjZGVmaW5lIEVIX0JFR0lOX05BTUVTUEFDRSBfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKyNkZWZpbmUgRUhfRU5EX05BTUVTUEFDRSBfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNkZWZpbmUgRUhfTkVXX0hFQURFUlMgMQorCisvLyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfTkVXX0lPU1RSRUFNUykKKyNkZWZpbmUgRUhfTkVXX0lPU1RSRUFNUyAxCisvLyNlbmRpZgorCisjaWYgIWRlZmluZWQgKF9TVExQX1VTRV9FWENFUFRJT05TKQorIyAgZGVmaW5lIEVIX05PX0VYQ0VQVElPTlMKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfVEVNUExBVEVfUEFSQU1fU1VCVFlQRV9CVUcpCisjICBkZWZpbmUgRUhfVEVNUExBVEVfUEFSQU1fU1VCVFlQRV9CVUcgX1NUTFBfVEVNUExBVEVfUEFSQU1fU1VCVFlQRV9CVUcKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfU1RMUF9NVUxUSV9DT05TVF9URU1QTEFURV9BUkdfQlVHKQorIyAgZGVmaW5lIEVIX01VTFRJX0NPTlNUX1RFTVBMQVRFX0FSR19CVUcgX1NUTFBfTVVMVElfQ09OU1RfVEVNUExBVEVfQVJHX0JVRworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChTVExQT1JUKQorIyAgZGVmaW5lIEVIX1NURCBTVExQT1JUCisjZWxpZiBkZWZpbmVkKF9fU1REKQorIyAgZGVmaW5lIEVIX1NURCBfX1NURAorI2VuZGlmCisKKy8vIHdlIHdhbnQgdG8gYmUgcG9ydGFibGUgaGVyZSwgc28gc3RkOjogd29uJ3Qgd29yay4KKyNpZiBkZWZpbmVkKFNUTFBPUlRfQ1NURCkKKyMgIGRlZmluZSBFSF9DU1REIFNUTFBPUlRfQ1NURAorI2Vsc2UKKyMgIGRlZmluZSBFSF9DU1REIHN0ZAorI2VuZGlmCisKKyNkZWZpbmUgRUhfRElTVEFOQ0UoYSwgYiwgcmVzdWx0KSBFSF9TVEQ6OmRpc3RhbmNlKGEsIGIsIHJlc3VsdCkKKworI2RlZmluZSBFSF9IQVNIRURfQ09OVEFJTkVSU19JTVBMRU1FTlRFRCAxCisjZGVmaW5lIEVIX0hBU0hfQ09OVEFJTkVSU19TVVBQT1JUX1JFU0laRSAxCisjZGVmaW5lIEVIX0hBU0hfQ09OVEFJTkVSU19TVVBQT1JUX0lURVJBVE9SX0NPTlNUUlVDVElPTiAxCisjZGVmaW5lIEVIX1NMSVNUX0lNUExFTUVOVEVEIDEKKyNkZWZpbmUgRUhfU0VMRUNUMVNUX0hJTlQgX19zZWxlY3Qxc3RfaGludAorLy8gZmJwIDogREVDIGN4eCBpcyB1bmFibGUgdG8gY29tcGlsZSBpdCBmb3Igc29tZSByZWFzb24KKyNpZiAhKGRlZmluZWQgKF9fREVDQ1hYKSAgfHwgZGVmaW5lZCAoX19hbWlnYW9zX18pIHx8IFwKKyAgICAgIChkZWZpbmVkIChfX0dOVUNfXykgJiYgKF9fR05VQ19fIDw9IDIpICYmIChfX0dOVUNfTUlOT1JfXyA8IDgpKSkKKyMgIGRlZmluZSBFSF9ST1BFX0lNUExFTUVOVEVEIDEKKyNlbmRpZgorI2RlZmluZSBFSF9TVFJJTkdfSU1QTEVNRU5URUQgMQorLy8gIyBkZWZpbmUgRUhfQklUU0VUX0lNUExFTUVOVEVEIDEKKy8vIyBkZWZpbmUgRUhfVkFMQVJSQVlfSU1QTEVNRU5URUQgMSAgLSB3ZSBoYXZlIG5vIHRlc3RzIHlldCBmb3IgdmFsYXJyYXkKKworI2RlZmluZSBzdGxfZGVzdHJveSBFSF9TVEQ6OmRlc3Ryb3kKKyNpbmNsdWRlIDxtZW1vcnk+CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitjbGFzcyAvKl9TVExQX0NMQVNTX0RFQ0xTUEVDKi8gRUhfYWxsb2NhdG9yOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorY2xhc3MgLypfU1RMUF9DTEFTU19ERUNMU1BFQyovIEVIX2FsbG9jYXRvciB7CitwdWJsaWM6CisKKyAgdHlwZWRlZiBfVHAgICAgICAgIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgdmFsdWVfdHlwZSAqICAgICAgIHBvaW50ZXI7CisgIHR5cGVkZWYgY29uc3QgX1RwKiBjb25zdF9wb2ludGVyOworICB0eXBlZGVmIF9UcCYgICAgICAgcmVmZXJlbmNlOworICB0eXBlZGVmIGNvbnN0IF9UcCYgY29uc3RfcmVmZXJlbmNlOworICB0eXBlZGVmIEVIX0NTVEQ6OnNpemVfdCAgICAgc2l6ZV90eXBlOworICB0eXBlZGVmIEVIX0NTVEQ6OnB0cmRpZmZfdCAgZGlmZmVyZW5jZV90eXBlOworIyBpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVfQ0xBU1NFUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcDE+IHN0cnVjdCByZWJpbmQgeworICAgIHR5cGVkZWYgRUhfYWxsb2NhdG9yPF9UcDE+IG90aGVyOworICB9OworIyBlbmRpZgorICBFSF9hbGxvY2F0b3IoKSBfU1RMUF9OT1RIUk9XIHt9CisgIyBpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwMT4gRUhfYWxsb2NhdG9yKGNvbnN0IEVIX2FsbG9jYXRvcjxfVHAxPiYpIF9TVExQX05PVEhST1cge30KKyAjIGVuZGlmCisgIEVIX2FsbG9jYXRvcihjb25zdCBFSF9hbGxvY2F0b3I8X1RwPiYpIF9TVExQX05PVEhST1cge30KKyAgfkVIX2FsbG9jYXRvcigpIF9TVExQX05PVEhST1cge30KKyAgcG9pbnRlciBhZGRyZXNzKHJlZmVyZW5jZSBfX3gpIHsgcmV0dXJuICZfX3g7IH0KKyAgY29uc3RfcG9pbnRlciBhZGRyZXNzKGNvbnN0X3JlZmVyZW5jZSBfX3gpIGNvbnN0IHsgcmV0dXJuICZfX3g7IH0KKyAgLy8gX19uIGlzIHBlcm1pdHRlZCB0byBiZSAwLiAgVGhlIEMrKyBzdGFuZGFyZCBzYXlzIG5vdGhpbmcgYWJvdXQgd2hhdCB0aGUgcmV0dXJuIHZhbHVlIGlzIHdoZW4gX19uID09IDAuCisgIF9UcCogYWxsb2NhdGUoc2l6ZV90eXBlIF9fbiwgY29uc3Qgdm9pZCogPSAwKSBjb25zdCB7CisgICAgcmV0dXJuIF9fbiAhPSAwID8gX19SRUlOVEVSUFJFVF9DQVNUKHZhbHVlX3R5cGUqLEVIX1NURDo6X19uZXdfYWxsb2M6OmFsbG9jYXRlKF9fbiAqIHNpemVvZih2YWx1ZV90eXBlKSkpIDogMDsKKyAgfQorICAvLyBfX3AgaXMgcGVybWl0dGVkIHRvIGJlIGEgbnVsbCBwb2ludGVyLCBvbmx5IGlmIG49PTAuCisgIHZvaWQgZGVhbGxvY2F0ZShwb2ludGVyIF9fcCwgc2l6ZV90eXBlIF9fbikgY29uc3QgeworICAgIF9TVExQX0FTU0VSVCggKF9fcCA9PSAwKSA9PSAoX19uID09IDApICkKKyAgICAgIGlmIChfX3AgIT0gMCkgRUhfU1REOjpfX25ld19hbGxvYzo6ZGVhbGxvY2F0ZSgodm9pZCopX19wLCBfX24gKiBzaXplb2YodmFsdWVfdHlwZSkpOworICB9CisgIC8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CisgIHZvaWQgZGVhbGxvY2F0ZShwb2ludGVyIF9fcCkgY29uc3QgeyAgaWYgKF9fcCAhPSAwKSBFSF9TVEQ6Ol9fbmV3X2FsbG9jOjpkZWFsbG9jYXRlKCh2b2lkKilfX3AsIHNpemVvZih2YWx1ZV90eXBlKSk7IH0KKyAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgX1NUTFBfTk9USFJPVyAgeyByZXR1cm4gc2l6ZV90KC0xKSAvIHNpemVvZih2YWx1ZV90eXBlKTsgfQorICB2b2lkIGNvbnN0cnVjdChwb2ludGVyIF9fcCwgY29uc3QgX1RwJiBfX3ZhbCkgY29uc3QgeyBzdGxwb3J0Ojpjb25zdHJ1Y3QoX19wLCBfX3ZhbCk7IH0KKyAgdm9pZCBkZXN0cm95KHBvaW50ZXIgX19wKSBjb25zdCB7IHN0bHBvcnQ6OmRlc3Ryb3koX19wKTsgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UMT4gaW5saW5lIGJvb2wgIF9TVExQX0NBTEwgb3BlcmF0b3I9PShjb25zdCBFSF9hbGxvY2F0b3I8X1QxPiYsIGNvbnN0IEVIX2FsbG9jYXRvcjxfVDE+JikgIHsgcmV0dXJuIHRydWU7IH0KK3RlbXBsYXRlIDxjbGFzcyBfVDE+IGlubGluZSBib29sICBfU1RMUF9DQUxMIG9wZXJhdG9yIT0oY29uc3QgRUhfYWxsb2NhdG9yPF9UMT4mLCBjb25zdCBFSF9hbGxvY2F0b3I8X1QxPiYpIHsgcmV0dXJuIGZhbHNlOyB9CisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorLy8gSWYgY3VzdG9tIGFsbG9jYXRvcnMgYXJlIGJlaW5nIHVzZWQgd2l0aG91dCBtZW1iZXIgdGVtcGxhdGUgY2xhc3NlcyBzdXBwb3J0IDoKKy8vIHVzZXIgKG9uIHB1cnBvc2UpIGlzIGZvcmNlZCB0byBkZWZpbmUgcmViaW5kL2dldCBvcGVyYXRpb25zICEhIQordGVtcGxhdGUgPGNsYXNzIF9UcDEsIGNsYXNzIF9UcDI+CitpbmxpbmUgRUhfYWxsb2NhdG9yPF9UcDI+JiBfU1RMUF9DQUxMCitfX3N0bF9hbGxvY19yZWJpbmQoRUhfYWxsb2NhdG9yPF9UcDE+JiBfX2EsIGNvbnN0IF9UcDIqKSB7ICByZXR1cm4gKEVIX2FsbG9jYXRvcjxfVHAyPiYpKF9fYSk7IH0KK3RlbXBsYXRlIDxjbGFzcyBfVHAxLCBjbGFzcyBfVHAyPgoraW5saW5lIEVIX2FsbG9jYXRvcjxfVHAyPiBfU1RMUF9DQUxMCitfX3N0bF9hbGxvY19jcmVhdGUoY29uc3QgRUhfYWxsb2NhdG9yPF9UcDE+JiwgY29uc3QgX1RwMiopIHsgcmV0dXJuIEVIX2FsbG9jYXRvcjxfVHAyPigpOyB9CitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyMgZGVmaW5lIGVoX2FsbG9jYXRvcihUKSA6OkVIX2FsbG9jYXRvcjxUPgorCisjIGRlZmluZSBFSF9CSVRfVkVDVE9SX0lNUExFTUVOVEVECisKKyMgaWYgZGVmaW5lZChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKSAmJiAhZGVmaW5lZChfU1RMUF9OT19CT09MKQorIyAgZGVmaW5lIEVIX0JJVF9WRUNUT1IgRUhfU1REOjp2ZWN0b3I8Ym9vbCwgZWhfYWxsb2NhdG9yKGJvb2wpID4KKyMgZWxzZQorIyAgaWZkZWYgX1NUTFBfTk9fQk9PTAorIyAgdW5kZWYgICBFSF9CSVRfVkVDVE9SX0lNUExFTUVOVEVECisjICBlbHNlCisjICAgZGVmaW5lIEVIX0JJVF9WRUNUT1IgRUhfU1REOjp2ZWN0b3I8Ym9vbCwgZWhfYWxsb2NhdG9yKGJvb2wpID4KKyMgIGVuZGlmCisjIGVuZGlmCisKKyNlbHNlIC8vICFVU0VfU0dJX1NUTAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBDb25maWd1cmF0aW9uIGZvciB0ZXN0aW5nIG90aGVyIG5vbi1TR0kgU1RMIGltcGxlbWVudGF0aW9ucworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIE1ldHJvd2Vya3MgY29uZmlndXJhdGlvbgorIyBpZmRlZiBfX01XRVJLU19fCisKKyMgZGVmaW5lIEVIX0FTU0VSVCBhc3NlcnQKKy8vIEdldCBNU0wgY29uZmlndXJhdGlvbiBoZWFkZXIKKyMgIGluY2x1ZGUgPGFuc2lfcGFybXMuaD4KKworIyAgaWYgX19NU0xfXyA+PSAyNAorCisjICAgZGVmaW5lIEVIX05FV19IRUFERVJTIDEKKyMgICBpZiBkZWZpbmVkIChfTVNMX1VTSU5HX05BTUVTUEFDRSkKKyMgICAgZGVmaW5lIEVIX1VTRV9OQU1FU1BBQ0VTIDEKKyMgICBlbmRpZgorIyAgZGVmaW5lIEVIX0JJVF9WRUNUT1IgdmVjdG9yPGJvb2w+CisjICAgZGVmaW5lIEVIX0RJU1RBTkNFKCBhLCBiLCByZXN1bHQgKSBkbyB7IHJlc3VsdCA9IGRpc3RhbmNlKCBhLCBiICk7IH0gd2hpbGUgKDApCisKKyMgIGVsc2UKKworIyAgIGVycm9yIE5vIGNvbmZpZ3VyYXRpb24gZm9yIGVhcmxpZXIgdmVyc2lvbnMgb2YgTVNMCisKKyMgIGVuZGlmICAvLyBfX01TTF9fID49IDI0CisKKy8vIEJ1Z3MgZml4ZWQgaW4gQ1dQcm8zCisjICBpZiBfX01XRVJLU19fIDwgMHgyMTAwCisjICAgZGVmaW5lIEVIX1RFTVBMQVRFX1BBUkFNX1NVQlRZUEVfQlVHIDEKKyMgIGVuZGlmCisKKy8vIEJ1Z3MgaW4gQ1dQcm8zCisjICBpZiBfX01XRVJLU19fIDw9IDB4MjExMAorIyAgIGRlZmluZSBFSF9NVUxUSV9DT05TVF9URU1QTEFURV9BUkdfQlVHIDEKKyMgIGVsc2UKKyMgICBwcmFnbWEgd2FybmluZyBub3Qgc3VyZSB0aGUgYWJvdmUgYnVnIGlzIGZpeGVkIHlldAorIyAgZW5kaWYKKworIyAgZGVmaW5lIEVIX1NMSVNUX0lNUExFTUVOVEVEIDEKKy8vIyAgZGVmaW5lIEVIX0hBU0hFRF9DT05UQUlORVJTX0lNUExFTUVOVEVEIDEKKworIyAgZGVmaW5lIEVIX05FV19JT1NUUkVBTVMgMQorIyAgZGVmaW5lIEVIX1VTRV9OT1RIUk9XIDEKKyMgZW5kaWYgLy8gTWV0cm93ZXJrcyBjb25maWd1cmF0aW9uCisKKyNpZiBkZWZpbmVkIChfX1NVTlBST19DQykKKyMgZGVmaW5lIHN0bF9kZXN0cm95IF9fUldTVEQ6Ol9fZGVzdHJveQorIyBkZWZpbmUgRUhfRElTVEFOQ0UoIGEsIGIsIHJlc3VsdCApIGRpc3RhbmNlKCBhLCBiLCByZXN1bHQgKQorIyBkZWZpbmUgRUhfQklUX1ZFQ1RPUiBFSF9TVEQ6OnZlY3Rvcjxib29sPgorIyBkZWZpbmUgRUhfTkVXX0hFQURFUlMgMQorIyBkZWZpbmUgRUhfVVNFX05BTUVTUEFDRVMgMQorIyBkZWZpbmUgRUhfTkVXX0lPU1RSRUFNUyAxCisjIGRlZmluZSBFSF9BU1NFUlQgYXNzZXJ0CisjIGRlZmluZSBFSF9TVFJJTkdfSU1QTEVNRU5URUQgMQorIyBlbGlmIGRlZmluZWQgKF9fS0NDKQorIyBkZWZpbmUgc3RsX2Rlc3Ryb3kgRUhfU1REOjpkZXN0cm95CisjIGRlZmluZSBFSF9ESVNUQU5DRSggYSwgYiwgcmVzdWx0ICkgZG8geyByZXN1bHQgPSBkaXN0YW5jZSggYSwgYiApOyB9IHdoaWxlICgwKQorIyBkZWZpbmUgRUhfQklUX1ZFQ1RPUiBFSF9TVEQ6OnZlY3Rvcjxib29sPgorIyBkZWZpbmUgRUhfTkVXX0hFQURFUlMgMQorIyBkZWZpbmUgRUhfVVNFX05BTUVTUEFDRVMgMQorIyBkZWZpbmUgRUhfTkVXX0lPU1RSRUFNUyAxCisjIGRlZmluZSBFSF9BU1NFUlQgYXNzZXJ0CisjIGRlZmluZSBFSF9DU1RECisjIGRlZmluZSBFSF9TVFJJTkdfSU1QTEVNRU5URUQgMQorIyBkZWZpbmUgRUhfTVVMVElfQ09OU1RfVEVNUExBVEVfQVJHX0JVRyAxCisjIGRlZmluZSBFSF9TRUxFQ1QxU1RfSElOVCBzZWxlY3Qxc3QKKyMgZWxzZQorIyBkZWZpbmUgc3RsX2Rlc3Ryb3kgZGVzdHJveQorI2VuZGlmCisKKy8vCisvLyBDb21waWxlci1pbmRlcGVuZGVudCBjb25maWd1cmF0aW9uCisvLworIyBpZmRlZiBFSF9VU0VfTkFNRVNQQUNFUworIyBpZmRlZiBTVExQT1JUCisjICBkZWZpbmUgRUhfU1REIFNUTFBPUlQKKyMgZWxzZQorIyAgZGVmaW5lIEVIX1NURCBzdGQKKyMgZW5kaWYKKyMgaWZkZWYgU1RMUE9SVF9DU1RECisjICBkZWZpbmUgRUhfU1REIFNUTFBPUlRfQ1NURAorIyBlbHNlCisjICBkZWZpbmUgRUhfU1REIHN0ZAorIyBlbmRpZgorIyAgZGVmaW5lIEVIX0JFR0lOX05BTUVTUEFDRSBuYW1lc3BhY2UgRUhfU1REIHsKKyMgIGRlZmluZSBFSF9FTkRfTkFNRVNQQUNFICAgfQorIyBlbHNlCisjICBkZWZpbmUgRUhfQkVHSU5fTkFNRVNQQUNFCisjICBkZWZpbmUgRUhfRU5EX05BTUVTUEFDRQorIyAgZGVmaW5lIEVIX1NURAorIyBlbmRpZgorCisjIGlmbmRlZiBFSF9DU1RECisjICBkZWZpbmUgRUhfQ1NURCBFSF9TVEQKKyMgZW5kaWYKKworI2VuZGlmIC8vICFVU0VfU0dJX1NUTAorCisKKy8vCisvLyBMaWJyYXJ5LWluZGVwZW5kZW50IGNvbmZpZ3VyYXRpb24uCisvLworI2lmIGRlZmluZWQoIEVIX01VTFRJX0NPTlNUX1RFTVBMQVRFX0FSR19CVUcpICYmICFkZWZpbmVkKCBFSF9TRUxFQ1QxU1RfSElOVCApCit0ZW1wbGF0ZSA8Y2xhc3MgUGFpciwgY2xhc3MgVT4KKy8vIEpESiAoQ1cgUHJvMSBkb2Vzbid0IGxpa2UgY29uc3Qgd2hlbiBmaXJzdF90eXBlIGlzIGFsc28gY29uc3QpCitzdHJ1Y3QgZWhfc2VsZWN0MXN0X2hpbnQgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248UGFpciwgVT4geworICAgIGNvbnN0IFUmIG9wZXJhdG9yICgpIChjb25zdCBQYWlyJiB4KSBjb25zdCB7IHJldHVybiB4LmZpcnN0OyB9Cit9OworIyBkZWZpbmUgRUhfU0VMRUNUMVNUX0hJTlQgZWhfc2VsZWN0MXN0X2hpbnQKKyNlbmRpZgorCisKKyNpZiBFSF9VU0VfTkFNRVNQQUNFUworIyBkZWZpbmUgRUhfVVNFX1NURCB1c2luZyBuYW1lc3BhY2UgRUhfU1REOworI2Vsc2UKKyMgZGVmaW5lIEVIX1VTRV9TVEQKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoRUhfVVNFX05BTUVTUEFDRVMpICYmICFkZWZpbmVkKF9TVExQX1ZFTkRPUl9HTE9CQUxfQ1NURCkKKyMgZGVmaW5lIFVTSU5HX0NTVERfTkFNRShuYW1lKSB1c2luZyBFSF9DU1REIDo6IG5hbWU7CisjZWxzZQorIyBkZWZpbmUgVVNJTkdfQ1NURF9OQU1FKG5hbWUpCisjZW5kaWYKKworI2VuZGlmIC8vIElOQ0xVREVEX01PVFVfUHJlZml4CmRpZmYgLS1naXQgYS90ZXN0L2VoL1NvcnRDbGFzcy5oIGIvdGVzdC9laC9Tb3J0Q2xhc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjAzMDBlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9laC9Tb3J0Q2xhc3MuaApAQCAtMCwwICsxLDgxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgU29ydENsYXNzLmgKKworICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBNYXJrIG9mIHRoZSBVbmljb3JuLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBNYXJrIG9mIHRoZSBVbmljb3JuIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisKKyAgICBTVU1NQVJZOiBBIGNsYXNzIGRlc2lnbmVkIHRvIHRlc3Qgb3BlcmF0aW9ucyB0aGF0IGNvbXBhcmVzIG9iamVjdHMuIEFsbAorICAgICAgY29tcGFyaXNvbnMgb24gU29ydENsYXNzIG1heSBmYWlsLiBBbHNvIHJlY29yZHMgaXRzIG93biBhZGRyZXNzIGZvcgorICAgICAgdGhlIHNha2Ugb2YgdGVzdGluZyB0aGUgc3RhYmlsaXR5IG9mIHNvcnRpbmcgYWxnb3JpdGhtcy4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgISBkZWZpbmVkIChJTkNMVURFRF9NT1RVX1NvcnRDbGFzcykKKyNkZWZpbmUgSU5DTFVERURfTU9UVV9Tb3J0Q2xhc3MgMQorCisjIGluY2x1ZGUgIlByZWZpeC5oIgorIyBpbmNsdWRlICJUZXN0Q2xhc3MuaCIKKworY2xhc3MgU29ydENsYXNzIDogcHVibGljIFRlc3RDbGFzcworeworcHVibGljOgorICBlbnVtIHsga1JhbmdlID0gMTAwIH07CisKKyAgU29ydENsYXNzKCBpbnQgdiApIDogVGVzdENsYXNzKCB2ICksIGFkZHIoMCkgeworICAgICBSZXNldEFkZHJlc3MoKTsKKyAgfQorCisgIFNvcnRDbGFzcygpIDogVGVzdENsYXNzKCAoaW50KWdldF9yYW5kb20oa1JhbmdlKSApLCBhZGRyKDApIHsKKyAgICAgUmVzZXRBZGRyZXNzKCk7CisgIH0KKworICBib29sIG9wZXJhdG9yPCggY29uc3QgVGVzdENsYXNzJiByaHMgKSBjb25zdAorICB7CisgICAgc2ltdWxhdGVfcG9zc2libGVfZmFpbHVyZSgpOworICAgIHJldHVybiAoY29uc3QgVGVzdENsYXNzJikqdGhpcyA8ICggcmhzICk7CisgIH0KKworICBib29sIG9wZXJhdG9yPT0oIGNvbnN0IFRlc3RDbGFzcyYgcmhzICkgY29uc3QKKyAgeworICAgIHNpbXVsYXRlX3Bvc3NpYmxlX2ZhaWx1cmUoKTsKKyAgICByZXR1cm4gKGNvbnN0IFRlc3RDbGFzcyYpKnRoaXMgPT0gKCByaHMgKTsKKyAgfQorCisgIFNvcnRDbGFzcyogR2V0QWRkcmVzcygpIGNvbnN0IHsgcmV0dXJuIGFkZHI7IH0KKyAgdm9pZCBSZXNldEFkZHJlc3MoKSB7IGFkZHIgPSB0aGlzOyB9CisKK3ByaXZhdGU6CisgIFNvcnRDbGFzcyogYWRkcjsKK307CisKK2lubGluZSBib29sIG9wZXJhdG9yPiggY29uc3QgU29ydENsYXNzJiBsaHMsIGNvbnN0IFNvcnRDbGFzcyYgcmhzICkgeworICAgIHJldHVybiByaHMgPCBsaHM7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPD0oIGNvbnN0IFNvcnRDbGFzcyYgbGhzLCBjb25zdCBTb3J0Q2xhc3MmIHJocyApIHsKKyAgICByZXR1cm4gIShyaHMgPCBsaHMpOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcj49KCBjb25zdCBTb3J0Q2xhc3MmIGxocywgY29uc3QgU29ydENsYXNzJiByaHMgKSB7CisgICAgcmV0dXJuICEobGhzIDwgcmhzKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3IgIT0gKCBjb25zdCBTb3J0Q2xhc3MmIGxocywgY29uc3QgU29ydENsYXNzJiByaHMgKSB7CisgICAgcmV0dXJuICEobGhzID09IHJocyk7Cit9CisKKyNpZiBkZWZpbmVkKCBfX01XRVJLU19fICkgJiYgX19NV0VSS1NfXyA8PSAweDMwMDAgJiYgIV9fU0dJX1NUTAorIyBpZiBkZWZpbmVkKCBfX01TTF9fICkgJiYgX19NU0xfXyA8IDB4MjQwNgorX19NU0xfRklYX0lURVJBVE9SU19fKFNvcnRDbGFzcyk7CitfX01TTF9GSVhfSVRFUkFUT1JTX18oY29uc3QgU29ydENsYXNzKTsKKyMgZW5kaWYKKyNlbmRpZgorCisjZW5kaWYgLy8gSU5DTFVERURfTU9UVV9Tb3J0Q2xhc3MKZGlmZiAtLWdpdCBhL3Rlc3QvZWgvVGVzdENsYXNzLmNwcCBiL3Rlc3QvZWgvVGVzdENsYXNzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzMyYzRmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9laC9UZXN0Q2xhc3MuY3BwCkBAIC0wLDAgKzEsMjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICBUZXN0Q2xhc3MuY3BwCisKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogTWFyayBvZiB0aGUgVW5pY29ybiwgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgTWFyayBvZiB0aGUgVW5pY29ybiBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJUZXN0Q2xhc3MuaCIKKworI2luY2x1ZGUgPGlvc3RyZWFtPgorCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8IChzdGQ6Om9zdHJlYW0mIHMsIGNvbnN0IFRlc3RDbGFzcyYgdCkgeworICByZXR1cm4gcyA8PCB0LnZhbHVlKCk7Cit9CisKKwpkaWZmIC0tZ2l0IGEvdGVzdC9laC9UZXN0Q2xhc3MuaCBiL3Rlc3QvZWgvVGVzdENsYXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlmNWMwOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZWgvVGVzdENsYXNzLmgKQEAgLTAsMCArMSwxNjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICBUZXN0Q2xhc3MuaAorCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMTk5OAorICogTWFyayBvZiB0aGUgVW5pY29ybiwgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgTWFyayBvZiB0aGUgVW5pY29ybiBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorCisgICAgU1VNTUFSWTogVGVzdENsYXNzIHNpbXVsYXRlcyBhIGNsYXNzIHRoYXQgdXNlcyByZXNvdXJjZXMuIEl0IGlzIGRlc2lnbmVkIHRvCisgICAgICBjYXVzZSBleGNlcHRpb25zIHdoZW4gaXQgaXMgY29uc3RydWN0ZWQgb3IgY29waWVkLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgSU5DTFVERURfTU9UVV9UZXN0Q2xhc3MKKyNkZWZpbmUgSU5DTFVERURfTU9UVV9UZXN0Q2xhc3MgMQorCisjIGluY2x1ZGUgIlByZWZpeC5oIgorCisjICBpbmNsdWRlIDxmdW5jdGlvbmFsPgorIyAgaW5jbHVkZSA8dXRpbGl0eT4KKyMgIGluY2x1ZGUgPGNsaW1pdHM+CisKKyNpbmNsdWRlIDxpb3Nmd2Q+CisjaW5jbHVkZSAicmFuZG9tX251bWJlci5oIgorI2luY2x1ZGUgIm5jX2FsbG9jLmgiCisKK2NsYXNzIFRlc3RDbGFzcworeworcHVibGljOgorICAgIGlubGluZSBUZXN0Q2xhc3MoKTsKKyAgICBpbmxpbmUgVGVzdENsYXNzKCBpbnQgdmFsdWUgKTsKKyAgICBpbmxpbmUgVGVzdENsYXNzKCBjb25zdCBUZXN0Q2xhc3MmIHJocyApOworICAgIGlubGluZSB+VGVzdENsYXNzKCk7CisKKyAgICBpbmxpbmUgVGVzdENsYXNzJiBvcGVyYXRvcj0oIGNvbnN0IFRlc3RDbGFzcyYgcmhzICk7CisgICAgaW5saW5lIGludCB2YWx1ZSgpIGNvbnN0OworCisgICAgaW5saW5lIFRlc3RDbGFzcyBvcGVyYXRvciEoKSBjb25zdDsKKworICAgIGJvb2wgb3BlcmF0b3I9PSggY29uc3QgVGVzdENsYXNzJiByaHMgKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiB2YWx1ZSgpID09IHJocy52YWx1ZSgpOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I8KCBjb25zdCBUZXN0Q2xhc3MmIHJocyApIGNvbnN0IHsKKyAgICAgIHJldHVybiB2YWx1ZSgpIDwgcmhzLnZhbHVlKCk7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZ2V0X3JhbmRvbSh1bnNpZ25lZCByYW5nZSA9IFVJTlRfTUFYKTsKK3ByaXZhdGU6CisgIGlubGluZSB2b2lkIEluaXQoIGludCB2YWx1ZSApOworCisjaWYgVEVTVENMQVNTX0RFRVBfREFUQQorICAgIGludCAqcDsKKyNlbHNlCisgIGludCB2OworI2VuZGlmCit9OworCisjaWYgZGVmaW5lZCggX19NV0VSS1NfXyApICYmIF9fTVdFUktTX18gPD0gMHgzMDAwICYmICFfX1NHSV9TVEwKKyMgaWYgZGVmaW5lZCggX19NU0xfXyApICYmIF9fTVNMX18gPCAweDI0MDYKKyMgIGluY2x1ZGUgPGl0ZXJhdG9yLmg+CitfX01TTF9GSVhfSVRFUkFUT1JTX18oVGVzdENsYXNzKTsKK19fTVNMX0ZJWF9JVEVSQVRPUlNfXyhjb25zdCBUZXN0Q2xhc3MpOwordHlwZWRlZiBFSF9TVEQ6OnBhaXI8Y29uc3QgVGVzdENsYXNzLCBUZXN0Q2xhc3M+IHBhaXJfdGVzdGNsYXNzX3Rlc3RjbGFzczsKK19fTVNMX0ZJWF9JVEVSQVRPUlNfXyggcGFpcl90ZXN0Y2xhc3NfdGVzdGNsYXNzICk7CitfX01TTF9GSVhfSVRFUkFUT1JTX18oIGNvbnN0IHBhaXJfdGVzdGNsYXNzX3Rlc3RjbGFzcyApOworIyBlbmRpZgorI2VuZGlmCisKK2lubGluZSB2b2lkIFRlc3RDbGFzczo6SW5pdCggaW50IHZhbHVlICkKK3sKKyNpZiBURVNUQ0xBU1NfREVFUF9EQVRBCisgIHAgPSBuZXcgaW50KCB2YWx1ZSApOworI2Vsc2UKKyAgc2ltdWxhdGVfY29uc3RydWN0b3IoKTsKKyAgdiA9IHZhbHVlOworI2VuZGlmCit9CisKK2lubGluZSBUZXN0Q2xhc3M6OlRlc3RDbGFzcygpCit7CisgIEluaXQoIGludChnZXRfcmFuZG9tKCkpICk7Cit9CisKK2lubGluZSBUZXN0Q2xhc3M6OlRlc3RDbGFzcyggaW50IHZhbHVlICkKK3sKKyAgSW5pdCggdmFsdWUgKTsKK30KKworaW5saW5lIFRlc3RDbGFzczo6VGVzdENsYXNzKCBjb25zdCBUZXN0Q2xhc3MmIHJocyApCit7CisgIEluaXQoIHJocy52YWx1ZSgpICk7Cit9CisKK2lubGluZSBUZXN0Q2xhc3M6On5UZXN0Q2xhc3MoKQoreworI2lmIFRFU1RDTEFTU19ERUVQX0RBVEEKKyAgZGVsZXRlIHA7CisjZWxzZQorICBzaW11bGF0ZV9kZXN0cnVjdG9yKCk7CisjZW5kaWYKK30KKworaW5saW5lIFRlc3RDbGFzcyYgVGVzdENsYXNzOjpvcGVyYXRvcj0oIGNvbnN0IFRlc3RDbGFzcyYgcmhzICkKK3sKKyNpZiBURVNUQ0xBU1NfREVFUF9EQVRBCisgIGludCAqbmV3UCA9IG5ldyBpbnQoIHJocy52YWx1ZSgpICk7CisgIGRlbGV0ZSBwOworICBwID0gbmV3UDsKKyNlbHNlCisgIHNpbXVsYXRlX3Bvc3NpYmxlX2ZhaWx1cmUoKTsKKyAgICB2ID0gcmhzLnZhbHVlKCk7CisjZW5kaWYKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK2lubGluZSBpbnQgVGVzdENsYXNzOjp2YWx1ZSgpIGNvbnN0Cit7CisjaWYgVEVTVENMQVNTX0RFRVBfREFUQQorICByZXR1cm4gKnA7CisjZWxzZQorICByZXR1cm4gdjsKKyNlbmRpZgorfQorCitpbmxpbmUgVGVzdENsYXNzIFRlc3RDbGFzczo6b3BlcmF0b3IhKCkgY29uc3QKK3sKKyAgICByZXR1cm4gVGVzdENsYXNzKCB2YWx1ZSgpKzEgKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3I+KCBjb25zdCBUZXN0Q2xhc3MmIGxocywgY29uc3QgVGVzdENsYXNzJiByaHMgKSB7CisgICAgcmV0dXJuIHJocyA8IGxoczsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3I+PSggY29uc3QgVGVzdENsYXNzJiBsaHMsIGNvbnN0IFRlc3RDbGFzcyYgcmhzICkgeworICAgIHJldHVybiAhKGxocyA8IHJocyk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPD0oIGNvbnN0IFRlc3RDbGFzcyYgbGhzLCBjb25zdCBUZXN0Q2xhc3MmIHJocyApIHsKKyAgICByZXR1cm4gIShyaHMgPCBsaHMpOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvciAhPSAoIGNvbnN0IFRlc3RDbGFzcyYgbGhzLCBjb25zdCBUZXN0Q2xhc3MmIHJocyApIHsKKyAgICByZXR1cm4gbGhzLnZhbHVlKCkgIT0gcmhzLnZhbHVlKCk7Cit9CisKK2lubGluZSB1bnNpZ25lZCBpbnQgVGVzdENsYXNzOjpnZXRfcmFuZG9tKCB1bnNpZ25lZCByYW5nZSApCit7CisgICAgcmV0dXJuIHJhbmRvbV9udW1iZXIoIHJhbmdlICk7Cit9CisKK2V4dGVybiBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8ICggc3RkOjpvc3RyZWFtJiBzLCBjb25zdCBUZXN0Q2xhc3MmKTsKKworI2VuZGlmIC8vIElOQ0xVREVEX01PVFVfVGVzdENsYXNzCmRpZmYgLS1naXQgYS90ZXN0L2VoL1Rlc3RzLmggYi90ZXN0L2VoL1Rlc3RzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEwMmZiMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZWgvVGVzdHMuaApAQCAtMCwwICsxLDU5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgVGVzdHMuaAorCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1hcmsgb2YgdGhlIFVuaWNvcm4sIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIE1hcmsgb2YgdGhlIFVuaWNvcm4gbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKworICAgIFNVTU1BUlk6IERlY2xhcmF0aW9ucyBvZiBhbGwgb2YgdGhlIHRlc3RzIGluIHRoZSBleGNlcHRpb24gdGVzdCBzdWl0ZS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgISBkZWZpbmVkIChJTkNMVURFRF9NT1RVX1Rlc3RzKQorI2RlZmluZSBJTkNMVURFRF9NT1RVX1Rlc3RzIDEKKworI2luY2x1ZGUgIlByZWZpeC5oIgorCit2b2lkIHRlc3RfYWxnb2Jhc2UoKTsKK3ZvaWQgdGVzdF9hbGdvKCk7Cit2b2lkIHRlc3RfbGlzdCgpOwordm9pZCB0ZXN0X21hcCgpOwordm9pZCB0ZXN0X211bHRpbWFwKCk7Cit2b2lkIHRlc3Rfc2V0KCk7Cit2b2lkIHRlc3RfbXVsdGlzZXQoKTsKK3ZvaWQgdGVzdF92ZWN0b3IoKTsKK3ZvaWQgdGVzdF9kZXF1ZSgpOwordm9pZCB0ZXN0X2JpdF92ZWN0b3IoKTsKKworI2lmIGRlZmluZWQgKEVIX0hBU0hFRF9DT05UQUlORVJTX0lNUExFTUVOVEVEKQordm9pZCB0ZXN0X2hhc2hfbWFwKCk7Cit2b2lkIHRlc3RfaGFzaF9tdWx0aW1hcCgpOwordm9pZCB0ZXN0X2hhc2hfc2V0KCk7Cit2b2lkIHRlc3RfaGFzaF9tdWx0aXNldCgpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChFSF9ST1BFX0lNUExFTUVOVEVEKQordm9pZCB0ZXN0X3JvcGUoKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCggRUhfU0xJU1RfSU1QTEVNRU5URUQgKQordm9pZCB0ZXN0X3NsaXN0KCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoIEVIX1NUUklOR19JTVBMRU1FTlRFRCApCit2b2lkIHRlc3Rfc3RyaW5nKCk7CisjZW5kaWYKKyNpZiBkZWZpbmVkKCBFSF9CSVRTRVRfSU1QTEVNRU5URUQgKQordm9pZCB0ZXN0X2JpdHNldCgpOworI2VuZGlmCisjaWYgZGVmaW5lZCggRUhfVkFMQVJSQVlfSU1QTEVNRU5URUQgKQordm9pZCB0ZXN0X3ZhbGFycmF5KCk7CisjZW5kaWYKKworI2VuZGlmIC8vIElOQ0xVREVEX01PVFVfVGVzdHMKZGlmZiAtLWdpdCBhL3Rlc3QvZWgvVGhyb3dDb21wYXJlLmggYi90ZXN0L2VoL1Rocm93Q29tcGFyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ODExYjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2VoL1Rocm93Q29tcGFyZS5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICBUaHJvd0NvbXBhcmUuaAorCisgICAgSW50ZXJmYWNlIGZvciB0aGUgVGhyb3dDb21wYXJlIGNsYXNzCisKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogTWFyayBvZiB0aGUgVW5pY29ybiwgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgTWFyayBvZiB0aGUgVW5pY29ybiBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgVGhyb3dDb21wYXJlX0hfCisjZGVmaW5lIFRocm93Q29tcGFyZV9IXworCisjaW5jbHVkZSAiUHJlZml4LmgiCisjaW5jbHVkZSAiVGVzdENsYXNzLmgiCisKK3N0cnVjdCBUaHJvd0NvbXBhcmUgeworICBib29sIG9wZXJhdG9yKCkoIGNvbnN0IFRlc3RDbGFzcyYgYSwgY29uc3QgVGVzdENsYXNzJiBiICkgY29uc3QgeworICAgIHNpbXVsYXRlX3Bvc3NpYmxlX2ZhaWx1cmUoKTsKKyAgICByZXR1cm4gYSA8IGI7CisgIH0KK307CisKKworc3RydWN0IFRocm93RXF1YWwgeworICBpbmxpbmUgYm9vbCBvcGVyYXRvcigpKCBjb25zdCBUZXN0Q2xhc3MmIGEsIGNvbnN0IFRlc3RDbGFzcyYgYiApIGNvbnN0IHsKKyAgICBzaW11bGF0ZV9wb3NzaWJsZV9mYWlsdXJlKCk7CisgICAgcmV0dXJuIGEgPT0gYjsKKyAgfQorfTsKKworc3RydWN0IFRocm93SGFzaCB7IC8vIDogcHJpdmF0ZSBUaHJvd0NvbXBhcmUKKyAgaW5saW5lIEVIX0NTVEQ6OnNpemVfdCBvcGVyYXRvcigpKCBjb25zdCBUZXN0Q2xhc3MmIGEgKSBjb25zdCB7CisgICAgc2ltdWxhdGVfcG9zc2libGVfZmFpbHVyZSgpOworICAgIHJldHVybiBFSF9DU1REOjpzaXplX3QoYS52YWx1ZSgpKTsKKyAgfQorfTsKKworI2VuZGlmIC8vIFRocm93Q29tcGFyZV9IXwpkaWZmIC0tZ2l0IGEvdGVzdC9laC9iY2IubWFrIGIvdGVzdC9laC9iY2IubWFrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMTMzMTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2VoL2JjYi5tYWsKQEAgLTAsMCArMSw3OCBAQAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0JDQzMyPWJjYzMyCitDUFAzMj1jcHAzMgorCishaWYgISRkKEJDQikKK0JDQiA9ICQoTUFLRURJUilcLi4KKyFlbmRpZgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBJREUgU0VDVElPTgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGhlIGZvbGxvd2luZyBzZWN0aW9uIG9mIHRoZSBwcm9qZWN0IG1ha2VmaWxlIGlzIG1hbmFnZWQgYnkgdGhlIEJDQiBJREUuCisjIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSB0aGUgSURFIHRvIGNoYW5nZSBhbnkgb2YgdGhlIHZhbHVlcyBpbiB0aGlzCisjIHNlY3Rpb24uCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUFJPSkVDVCA9IGVoX3Rlc3QuZXhlCitPQkpGSUxFUyA9IFRlc3RDbGFzcy5vYmogXAorICBuY19hbGxvYy5vYmogXAorICByYW5kb21fbnVtYmVyLm9iaiBcCisgIHRlc3RfYWxnby5vYmogXAorICB0ZXN0X2FsZ29iYXNlLm9iaiBcCisgIHRlc3RfYml0X3ZlY3Rvci5vYmogXAorICB0ZXN0X2JpdHNldC5vYmogXAorICB0ZXN0X2RlcXVlLm9iaiBcCisgIHRlc3RfaGFzaF9tYXAub2JqIFwKKyAgdGVzdF9oYXNoX3NldC5vYmogXAorICB0ZXN0X2xpc3Qub2JqIFwKKyAgdGVzdF9tYXAub2JqIFwKKyAgdGVzdF9yb3BlLm9iaiBcCisgIHRlc3Rfc2V0Lm9iaiBcCisgIHRlc3Rfc2xpc3Qub2JqIFwKKyAgdGVzdF9zdHJpbmcub2JqIFwKKyAgdGVzdF92YWxhcnJheS5vYmogXAorICB0ZXN0X3ZlY3Rvci5vYmogbWFpbi5vYmoKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1BBVEhDUFAgPSAuOworUEFUSFBBUyA9IC47CitQQVRIQVNNID0gLjsKK1BBVEhSQyA9IC47CisKKyMgVVNFUkRFRklORVMgPSBfU1RMUF9OT19PV05fSU9TVFJFQU1TCisKK1VTRVJERUZJTkVTID0gX0RFQlVHCisKK1NZU0RFRklORVMgPSBfUlRMRExMO05PX1NUUklDVDtVU0VQQUNLQUdFUworIyBTWVNERUZJTkVTID0gTk9fU1RSSUNUO1VTRVBBQ0tBR0VTCisgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0NGTEFHMSA9IC13LSAtamIgLWoxICAtSS47Li5cLi5cc3RscG9ydDskKEJDQilcaW5jbHVkZTsgLU9kIC12IC1OIC14IC14cCAtdFdDIC1EJChTWVNERUZJTkVTKTskKFVTRVJERUZJTkVTKQorCitMREZMQUdTID0gLUwuLlwuLlxsaWI7JChCQ0IpXC4uXGxpYiBjdzMyaS5saWIgc3RscC40LjUubGliCisKKy5hdXRvZGVwZW5kCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCithbGwgOiAkKFBST0pFQ1QpCisgICAgICAgIGNkIC4uXC4uXGxpYgorCS4uXHRlc3RcZWhcZWhfdGVzdC5leGUgLXMgMTAwCisKKyQoUFJPSkVDVCkgOiAkKE9CSkZJTEVTKQorCSQoQkNDMzIpIC1lJChQUk9KRUNUKSAkKENGTEFHMSkgJChMREZMQUdTKSAkKE9CSkZJTEVTKQorCitjbGVhbjoKKwlkZWwgKi5vYmogKi5leGUgKi5jb3JlICoudGRzCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisuY3BwLm9iajoKKyAgICAkKEJDQzMyKSAkKENGTEFHMSkgLW4kKEBEKSAtYyAkPAorCisuY3BwLmV4ZToKKyAgICAkKEJDQzMyKSAkKENGTEFHMSkgJChMREZMQUdTKSAtbiQoQEQpICQ8CisKKy5jcHAuaToKKyAgICAkKENQUDMyKSAkKENGTEFHMSkgLW4uIC1TciAtU3MgLVNkIHskPCB9CisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCmRpZmYgLS1naXQgYS90ZXN0L2VoL2J1Zy5jcHAgYi90ZXN0L2VoL2J1Zy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjcyM2Q1YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZWgvYnVnLmNwcApAQCAtMCwwICsxLDM5IEBACisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxib29zdC90aW1lci5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvbGV4aWNhbF9jYXN0LmhwcD4KKworc3RydWN0IGNvbXBhcmUKK3sKKyAgICBib29sIG9wZXJhdG9yKCkoaW50KiB4LCBpbnQqIHkpCisgICAgICAgIHsgcmV0dXJuICp4IDwgKnk7IH0KKworfTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgY29uc3QqIGNvbnN0IGFyZ3ZbXSkKK3sKKyAgICBzdGQ6OnNpemVfdCBuaXRlcnMgPSBhcmdjIDwgMiA/IDEwMDAgOiBib29zdDo6bGV4aWNhbF9jYXN0PHN0ZDo6c2l6ZV90Pihhcmd2WzFdKTsKKworICAgIGJvb3N0Ojp0aW1lciB0OworCisgICAgc3RkOjp2ZWN0b3I8aW50PiB2OworICAgIGZvciAoaW50IG4gPSAwOyBuIDwgbml0ZXJzOyArK24pCisgICAgeworICAgICAgICB2Lmluc2VydCh2LmJlZ2luKCkgKyB2LnNpemUoKS8yLCBuKTsKKyAgICB9CisKKyAgICBzdGQ6OmNvdXQgPDwgInZlY3RvciBmaWxsOiAiIDw8IHQuZWxhcHNlZCgpIDw8IHN0ZDo6ZW5kbDsKKworICAgIHN0ZDo6bXVsdGlzZXQ8aW50Kixjb21wYXJlPiBtOworICAgIGZvciAoaW50IG4gPSAwOyBuIDwgbml0ZXJzOyArK24pCisgICAgeworICAgICAgICBtLmluc2VydCgmdltuXSk7CisgICAgfQorICAgIHN0ZDo6Y291dCA8PCAibWFwIGZpbGwgMTogIiA8PCB0LmVsYXBzZWQoKSA8PCBzdGQ6OmVuZGw7CisgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBuaXRlcnM7ICsrbikKKyAgICB7CisgICAgICAgIG0uaW5zZXJ0KCZ2W25dKTsKKyAgICB9CisgICAgc3RkOjpjb3V0IDw8ICJtYXAgZmlsbCAyOiAiIDw8IHQuZWxhcHNlZCgpIDw8IHN0ZDo6ZW5kbDsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvZWgvY29tby1saW51eC5tYWsgYi90ZXN0L2VoL2NvbW8tbGludXgubWFrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMGE2MmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2VoL2NvbW8tbGludXgubWFrCkBAIC0wLDAgKzEsNjkgQEAKKyMKKyMgTm90ZSA6IHRoaXMgbWFrZWZpbGUgaGFzIGJlZW4gdGVzdGVkIGZvciBjb21vLTQuMy4wLjErZ2NjLTIuOTYgb24gUmVkaGF0IDcuMworIworCisuU1VGRklYRVM6CisuU1VGRklYRVM6IC5jYyAuY3BwIC5vIC5leGUgLm91dAorCitzcmNkaXIgPSAuCitWUEFUSCA9IC4KKworIyBwb2ludCB0aGlzIHRvIHByb3BlciBsb2NhdGlvbgorU1RMX0lOQ0w9Li4vLi4vc3RscG9ydAorCitBVVhfTElTVD1UZXN0Q2xhc3MuY3BwIG1haW4uY3BwIG5jX2FsbG9jLmNwcCByYW5kb21fbnVtYmVyLmNwcAorCitURVNUX0xJU1Q9dGVzdF9hbGdvLmNwcCAgXAordGVzdF9hbGdvYmFzZS5jcHAgICAgIHRlc3RfbGlzdC5jcHAgdGVzdF9zbGlzdC5jcHAgXAordGVzdF9iaXRfdmVjdG9yLmNwcCAgIHRlc3RfdmVjdG9yLmNwcCBcCit0ZXN0X2RlcXVlLmNwcCB0ZXN0X3NldC5jcHAgdGVzdF9tYXAuY3BwIFwKK3Rlc3RfaGFzaF9tYXAuY3BwICB0ZXN0X2hhc2hfc2V0LmNwcCB0ZXN0X3JvcGUuY3BwIFwKK3Rlc3Rfc3RyaW5nLmNwcCB0ZXN0X2JpdHNldC5jcHAgdGVzdF92YWxhcnJheS5jcHAKKworTElTVD0ke0FVWF9MSVNUfSAke1RFU1RfTElTVH0KKworT0JKRUNUUyA9ICQoTElTVDolLmNwcD0lLm8pICQoU1RBVF9NT0RVTEUpCitFWEVDUyA9ICQoTElTVDolLmNwcD0lKQorVEVTVFMgPSAkKExJU1Q6JS5jcHA9JS5vdXQpCitURVNUX0VYRSAgPSAuL2VoX3Rlc3QKK1RFU1QgID0gLi9laF90ZXN0Lm91dAorCitDQyA9IGNvbW8KK0NYWCA9ICQoQ0MpIAorCitDWFhGTEFHUyA9IC1ETElCQ0lPPSAtLWRpYWdfc3VwcHJlc3M9NjggLURfX251bGw9MEwgLURfX0dOVUdfXyAtRF9TVExQX0RFQlVHIC1JJHtTVExfSU5DTH0gIC1JLiAke0NYWF9FWFRSQV9GTEFHU30KKworTElCUyA9IC1MLi4vLi4vbGliIC1sc3RscG9ydF9jb21vX3N0bGRlYnVnIC1scHRocmVhZCAtbG0gCitMSUJTVERDWFggPSAKKworY2hlY2s6ICQoVEVTVCkKKworJChURVNUX0VYRSkgOiAkKE9CSkVDVFMpCisJJChDWFgpICQoQ1hYRkxBR1MpICQoT0JKRUNUUykgJChMSUJTKSAtbyAkKFRFU1RfRVhFKQorCisKKyQoVEVTVCkgOiAkKFRFU1RfRVhFKQorCSQoVEVTVF9FWEUpCisKK1NVRkZJWEVTOiAuY3BwLm8uZXhlLm91dC5yZXMKKworJS5vIDogJS5jcHAKKwkkKENYWCkgJChDWFhGTEFHUykgJDwgLWMgLW8gJEAKKworJS5pIDogJS5jcHAKKwkkKENYWCkgJChDWFhGTEFHUykgJDwgLUUgLUggLW8gJEAKKworJS5vdXQ6ICUuY3BwCisJJChDWFgpICQoQ1hYRkxBR1MpICQ8IC1jIC1VU0lOR0xFIC1ETUFJTiAtZyAtbyAkKi5vCisJJChDWFgpICQoQ1hYRkxBR1MpICQqLm8gJChMSUJTKSAtbyAkKgorCS4vJCogPiAkQAorCS1ybSAtZiAkKgorCislLnM6ICUuY3BwCisJJChDWFgpICQoQ1hYRkxBR1MpIC1PNCAtUyAtcHRvICQ8ICAtbyAkQAorCislLkU6ICUuY3BwCisJJChDWFgpICQoQ1hYRkxBR1MpIC1FICQ8ICAtbyAkQAorCitjbGVhbjoKKwktcm0gLWZyICR7VEVTVF9FWEV9ICoub3V0ICoubyAqLmlpICoudGkKZGlmZiAtLWdpdCBhL3Rlc3QvZWgvY29tby5tYWsgYi90ZXN0L2VoL2NvbW8ubWFrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZWMyMGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2VoL2NvbW8ubWFrCkBAIC0wLDAgKzEsNjcgQEAKKyMgOzs7IC0qLSBNb2RlOm1ha2VmaWxlOy0qLSAKKyMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBNYWtlZmlsZS5pbiBieSBjb25maWd1cmUuCisjIFRoaXMgcmVxdWlyZXMgR05VIG1ha2UuCisKK3NyY2RpciA9IC4KK1ZQQVRIID0gLgorCisjIHBvaW50IHRoaXMgdG8gcHJvcGVyIGxvY2F0aW9uCitTVExfSU5DTD0uLi8uLi9zdGxwb3J0CisKK0FVWF9MSVNUPVRlc3RDbGFzcy5jcHAgbWFpbi5jcHAgbmNfYWxsb2MuY3BwIHJhbmRvbV9udW1iZXIuY3BwCisKK1RFU1RfTElTVD10ZXN0X2FsZ28uY3BwICBcCit0ZXN0X2FsZ29iYXNlLmNwcCAgICAgdGVzdF9saXN0LmNwcCB0ZXN0X3NsaXN0LmNwcCBcCit0ZXN0X2JpdF92ZWN0b3IuY3BwICAgdGVzdF92ZWN0b3IuY3BwIFwKK3Rlc3RfZGVxdWUuY3BwIHRlc3Rfc2V0LmNwcCB0ZXN0X21hcC5jcHAgXAordGVzdF9oYXNoX21hcC5jcHAgIHRlc3RfaGFzaF9zZXQuY3BwIHRlc3Rfcm9wZS5jcHAgXAordGVzdF9zdHJpbmcuY3BwIHRlc3RfYml0c2V0LmNwcCB0ZXN0X3ZhbGFycmF5LmNwcAorCitMSVNUPSR7QVVYX0xJU1R9ICR7VEVTVF9MSVNUfQorCitPQkpFQ1RTID0gJChMSVNUOiUuY3BwPSUubykgJChTVEFUX01PRFVMRSkKK0VYRUNTID0gJChMSVNUOiUuY3BwPSUpCitURVNUUyA9ICQoTElTVDolLmNwcD0lLm91dCkKK1RFU1RfRVhFICA9IC4vZWhfdGVzdAorVEVTVCAgPSAuL2VoX3Rlc3Qub3V0CisKK0NDID0gZTpcbGFuZ1xjb21vXGJpblxjb21vCitDWFggPSAkKENDKSAKKworIyBfX0NPTU9fXyBhcHBlYXJzIG5vdCB0byBiZSBkZWZpbmVkIGF1dG9tYXRpY2FsbHkgOygKK0NYWEZMQUdTID0gLURfX0NPTU9fXyAtRF9NU0NfVkVSPTEyMDAgLS1leGNlcHRpb25zIC0tbWljcm9zb2Z0IC1EX1NUTFBfREVCVUcgLUkke1NUTF9JTkNMfSAgLUkuICR7Q1hYX0VYVFJBX0ZMQUdTfQorCitMSUJTID0gLWxtIAorTElCU1REQ1hYID0gCisKK2NoZWNrOiAkKFRFU1QpCisKKyQoVEVTVF9FWEUpIDogJChPQkpFQ1RTKQorCSQoQ1hYKSAkKENYWEZMQUdTKSAkKE9CSkVDVFMpICQoTElCUykgLW8gJChURVNUX0VYRSkKKworCiskKFRFU1QpIDogJChURVNUX0VYRSkKKwkkKFRFU1RfRVhFKQorCitTVUZGSVhFUzogLmNwcC5vLmV4ZS5vdXQucmVzCisKKyUubyA6ICUuY3BwCisJJChDWFgpICQoQ1hYRkxBR1MpICQ8IC1jIC1vICRACisKKyUuaSA6ICUuY3BwCisJJChDWFgpICQoQ1hYRkxBR1MpICQ8IC1FIC1IIC1vICRACisKKyUub3V0OiAlLmNwcAorCSQoQ1hYKSAkKENYWEZMQUdTKSAkPCAtYyAtVVNJTkdMRSAtRE1BSU4gLWcgLW8gJCoubworCSQoQ1hYKSAkKENYWEZMQUdTKSAkKi5vICQoTElCUykgLW8gJCoKKwkuLyQqID4gJEAKKwktcm0gLWYgJCoKKworJS5zOiAlLmNwcAorCSQoQ1hYKSAkKENYWEZMQUdTKSAtTzQgLVMgLXB0byAkPCAgLW8gJEAKKworJS5FOiAlLmNwcAorCSQoQ1hYKSAkKENYWEZMQUdTKSAtRSAkPCAgLW8gJEAKKworY2xlYW46CisJLXJtIC1mciAke1RFU1RfRVhFfSAqLm8gKi5ycG8gKi5vYmogKi5vdXQgY29yZSAqfiBUZW1wbGF0ZXMuREIKZGlmZiAtLWdpdCBhL3Rlc3QvZWgvY3JheS5tYWsgYi90ZXN0L2VoL2NyYXkubWFrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxOGE0Y2EKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2VoL2NyYXkubWFrCkBAIC0wLDAgKzEsNTYgQEAKKworU0hFTEw9L2Jpbi9zaAorCisjIHNyY2RpciA9IC4KKyMgVlBBVEggPSAuCisKK1NUTF9JTkNMPS1JJHtQV0R9Ly4uLy4uL3N0bHBvcnQvCisKK0FVWF9MSVNUPVRlc3RDbGFzcy5vIG1haW4ubyBuY19hbGxvYy5vIHJhbmRvbV9udW1iZXIubworCitURVNUX0xJU1Q9dGVzdF9hbGdvLm8gIFwKK3Rlc3RfYWxnb2Jhc2UubyAgICAgdGVzdF9saXN0Lm8gdGVzdF9zbGlzdC5vIFwKK3Rlc3RfYml0X3ZlY3Rvci5vICAgdGVzdF92ZWN0b3IubyBcCit0ZXN0X2RlcXVlX2NyYXkubyB0ZXN0X3NldC5vIHRlc3RfbWFwLm8gXAordGVzdF9oYXNoX21hcC5vICB0ZXN0X2hhc2hfc2V0Lm8gdGVzdF9yb3BlLm8gXAordGVzdF9zdHJpbmcubyB0ZXN0X2JpdHNldC5vIHRlc3RfdmFsYXJyYXkubworCitMSVNUPSR7QVVYX0xJU1R9ICR7VEVTVF9MSVNUfQorCitPQkpFQ1RTID0gJChMSVNUKQorRVhFQ1MgPSAkKExJU1Q6JS5vPSUpCitURVNUUyA9ICQoTElTVDolLm89JS5vdXQpCitURVNUX0VYRSAgPSBlaF90ZXN0CitURVNUICA9IGVoX3Rlc3Qub3V0CisKK0NDID0gQ0MKK0NYWCA9ICQoQ0MpCisKKyNDWFhGTEFHUyA9IC1oZXhjZXB0aW9ucyAtREVIX0RFTEVURV9IQVNfVEhST1dfU1BFQyAtSS4gJHtTVExfSU5DTH0gJHtERUJVR19GTEFHU30KK0NYWEZMQUdTID0gLURfU1RMUF9IQVNfTk9fRVhDRVBUSU9OUyAtSS4gJHtTVExfSU5DTH0gJHtERUJVR19GTEFHU30KKworI0xJQlMgPSAtTC4uLy4uL2xpYiAtbHN0bHBvcnR4IC1scHRocmVhZAorTElCUyA9IC1MLi4vLi4vbGliIC1sc3RscG9ydCAtbHB0aHJlYWQKKworLlNVRkZJWEVTOiAuY3BwIC5pIC5vIC5vdXQKKworY2hlY2s6ICQoVEVTVCkKKworJChURVNUKSA6ICQoT0JKRUNUUykKKwkkKENYWCkgJChDWFhGTEFHUykgJChMSUJTKSAkKE9CSkVDVFMpIC1vICQoVEVTVF9FWEUpCisJLi8kKFRFU1RfRVhFKSAtcyAxMDAKKworLmNwcC5vOgorCSQoQ1hYKSAkKENYWEZMQUdTKSAkPCAtYyAtbyAkQAorCisuY3BwLmk6CisJJChDWFgpICQoQ1hYRkxBR1MpICQ8IC1FID4gJEAKKworJS5vdXQ6ICUuY3BwCisJJChDWFgpICQoQ1hYRkxBR1MpICQqLmNwcCAtYyAtVVNJTkdMRSAtRE1BSU4gLWcgLW8gJCoubworCSQoQ1hYKSAkKENYWEZMQUdTKSAkKExJQlMpICQqLm8gLW8gJCoKKwkuLyQqIC1xCisJLXJtIC1mICQqCisKK2NsZWFuOgorCS1ybSAtZnIgJHtURVNUX0VYRX0gKi5vICouaWkgKi5vdXQgY29yZQpkaWZmIC0tZ2l0IGEvdGVzdC9laC9jeWd3aW4ubWFrIGIvdGVzdC9laC9jeWd3aW4ubWFrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MmMyMTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2VoL2N5Z3dpbi5tYWsKQEAgLTAsMCArMSwxMjMgQEAKKyMgOzs7IC0qLSBNb2RlOm1ha2VmaWxlOy0qLSAKKyMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBNYWtlZmlsZS5pbiBieSBjb25maWd1cmUuCisjIFRoaXMgcmVxdWlyZXMgR05VIG1ha2UuCisKK3NyY2RpciA9IC4KK1ZQQVRIID0gLgorCisjIHBvaW50IHRoaXMgdG8gcHJvcGVyIGxvY2F0aW9uCitTVExfSU5DTD0tSS4uLy4uL3N0bHBvcnQKKworQVVYX0xJU1Q9VGVzdENsYXNzLmNwcCBtYWluLmNwcCBuY19hbGxvYy5jcHAgcmFuZG9tX251bWJlci5jcHAKKworVEVTVF9MSVNUPXRlc3RfYWxnby5jcHAgIFwKK3Rlc3RfYWxnb2Jhc2UuY3BwICAgICB0ZXN0X2xpc3QuY3BwIHRlc3Rfc2xpc3QuY3BwIFwKK3Rlc3RfYml0X3ZlY3Rvci5jcHAgICB0ZXN0X3ZlY3Rvci5jcHAgXAordGVzdF9kZXF1ZS5jcHAgdGVzdF9zZXQuY3BwIHRlc3RfbWFwLmNwcCBcCit0ZXN0X2hhc2hfbWFwLmNwcCAgdGVzdF9oYXNoX3NldC5jcHAgdGVzdF9yb3BlLmNwcCBcCit0ZXN0X3N0cmluZy5jcHAgdGVzdF9iaXRzZXQuY3BwIHRlc3RfdmFsYXJyYXkuY3BwCisKK0xJU1Q9JHtBVVhfTElTVH0gJHtURVNUX0xJU1R9CisKK09CSkVDVFMgPSAkKExJU1Q6JS5jcHA9b2JqLyUubykgJChTVEFUX01PRFVMRSkKK0RfT0JKRUNUUyA9ICQoTElTVDolLmNwcD1kX29iai8lLm8pICQoU1RBVF9NT0RVTEUpCitOT1NHSV9PQkpFQ1RTID0gJChMSVNUOiUuY3BwPW5vc2dpX29iai8lLm8pICQoU1RBVF9NT0RVTEUpCisKK0VYRUNTID0gJChMSVNUOiUuY3BwPSUpCitURVNUUyA9ICQoTElTVDolLmNwcD0lLm91dCkKK1RFU1RfRVhFICA9IC4vZWhfdGVzdAorRF9URVNUX0VYRSA9IC4vZWhfdGVzdF9kCitOT1NHSV9URVNUX0VYRSA9IC4vZWhfdGVzdF9ub3NnaQorCitURVNUICA9IC4vZWhfdGVzdC5vdXQKK0RfVEVTVCA9IC4vZWhfdGVzdF9kLm91dAorTk9TR0lfVEVTVCA9IC4vZWhfdGVzdF9ub3NnaS5vdXQKKworQ0MgPSBjKysKK0NYWCA9ICQoQ0MpCisKKyMgZHdhIDEyLzIyLzk5IC0tIGhhZCB0byB0dXJuIG9mZiAtYW5zaSBmbGFnIHNvIHdlIGNvdWxkIHVzZSBTR0kgSU9TVFJFQU1TCisjIGFsc28sIHRlc3Rfc2xpc3Qgd29uJ3QgY29tcGlsZSB3aXRoIC1PMy8tTzIgd2hlbiB0YXJnZXRpbmcgUFBDLiBJdCBmYWlscyAKKyMgaW4gdGhlIGFzc2VtYmxlciB3aXRoICdpbnZhbGlkIHJlbG9jYXRpb24gdHlwZScKK0NYWEZMQUdTID0gLVdhbGwgLWcgLU8gJHtTVExfSU5DTH0gLUkuICR7Q1hYX0VYVFJBX0ZMQUdTfSAtREVIX1ZFQ1RPUl9PUEVSQVRPUl9ORVcKK0RfQ1hYRkxBR1MgPSAtV2FsbCAtZyAtTyAke1NUTF9JTkNMfSAtSS4gJHtDWFhfRVhUUkFfRkxBR1N9IC1ERUhfVkVDVE9SX09QRVJBVE9SX05FVyAtRF9TVExQX0RFQlVHIC1EX1NUTFBfVVNFX1NUQVRJQ19MSUIKK05PU0dJX0NYWEZMQUdTID0gLVdhbGwgLWcgLU8yICR7U1RMX0lOQ0x9IC1JLiAke0NYWF9FWFRSQV9GTEFHU30gLURfU1RMUF9OT19PV05fSU9TVFJFQU1TIC1EX1NUTFBfREVCVUdfVU5JTklUSUFMSVpFRCAtREVIX1ZFQ1RPUl9PUEVSQVRPUl9ORVcKKworY2hlY2s6ICQoVEVTVCkKKworTElCUyA9IC1sbSAKK0RfTElCU1RMUE9SVCA9IC1MLi4vLi4vbGliIC1sc3RscG9ydF9jeWd3aW5fc3RsZGVidWcKK0xJQlNUTFBPUlQgPSAtTC4uLy4uL2xpYiAtbHN0bHBvcnRfY3lnd2luCisKK2FsbDogJChURVNUX0VYRSkgJChEX1RFU1RfRVhFKSAkKE5PU0dJX1RFU1RfRVhFKQorCitjaGVja19ub3NnaTogJChOT1NHSV9URVNUKQorY2hlY2tfZDogJChEX1RFU1QpCisKK09CSkRJUj1vYmoKK0RfT0JKRElSPWRfb2JqCitOT1NHSV9PQkpESVI9bm9zZ2lfb2JqCisKKyQoT0JKRElSKToKKwlta2RpciBvYmoKKyQoRF9PQkpESVIpOgorCW1rZGlyIGRfb2JqCiskKE5PU0dJX09CSkRJUik6CisJbWtkaXIgbm9zZ2lfb2JqCisKKyQoVEVTVF9FWEUpIDogJChPQkpESVIpICQoT0JKRUNUUykKKwkkKENYWCkgJChDWFhGTEFHUykgJChPQkpFQ1RTKSAkKExJQlNUTFBPUlQpICQoTElCUykgLW8gJChURVNUX0VYRSkKKworJChEX1RFU1RfRVhFKSA6ICQoRF9PQkpESVIpICQoRF9PQkpFQ1RTKQorCSQoQ1hYKSAkKERfQ1hYRkxBR1MpICQoRF9PQkpFQ1RTKSAkKERfTElCU1RMUE9SVCkgJChMSUJTKSAtbyAkKERfVEVTVF9FWEUpCisKKyQoTk9TR0lfVEVTVF9FWEUpIDogJChOT1NHSV9PQkpESVIpICQoTk9TR0lfT0JKRUNUUykKKwkkKENYWCkgJChOT1NHSV9DWFhGTEFHUykgJChOT1NHSV9PQkpFQ1RTKSAkKExJQlMpIC1vICQoTk9TR0lfVEVTVF9FWEUpCisKKworJChURVNUKSA6ICQoVEVTVF9FWEUpCisJZWNobyAiQ3lnd2luIGhhcyBidWdzIGluIGV4Y2VwdGlvbiBoYW5kbGluZywgcnVubm5pbmcgdy9vIHRocm93aW5nIGV4Y2VwdGlvbnMuLi4iCisJLi8kKFRFU1RfRVhFKSAtZQorCiskKERfVEVTVCkgOiAkKERfVEVTVF9FWEUpCisJZWNobyAiQ3lnd2luIGhhcyBidWdzIGluIGV4Y2VwdGlvbiBoYW5kbGluZywgcnVubm5pbmcgdy9vIHRocm93aW5nIGV4Y2VwdGlvbnMuLi4iCisJLi8kKERfVEVTVF9FWEUpIC1lCisKKyQoTk9TR0lfVEVTVCkgOiAkKE5PU0dJX1RFU1RfRVhFKQorCWVjaG8gIkN5Z3dpbiBoYXMgYnVncyBpbiBleGNlcHRpb24gaGFuZGxpbmcsIHJ1bm5uaW5nIHcvbyB0aHJvd2luZyBleGNlcHRpb25zLi4uIgorCS4vJChOT1NHSV9URVNUX0VYRSkgLWUKKworU1VGRklYRVM6IC5jcHAuby5leGUub3V0LnJlcworCitub3NnaV9vYmovJS5vIDogJS5jcHAKKwkkKENYWCkgJChOT1NHSV9DWFhGTEFHUykgJDwgLWMgLW8gJEAKKworZF9vYmovJS5vIDogJS5jcHAKKwkkKENYWCkgJChEX0NYWEZMQUdTKSAkPCAtYyAtbyAkQAorCitvYmovJS5vIDogJS5jcHAKKwkkKENYWCkgJChDWFhGTEFHUykgJDwgLWMgLW8gJEAKKworbm9zZ2lfb2JqLyUuaSA6ICUuY3BwCisJJChDWFgpICQoTk9TR0lfQ1hYRkxBR1MpICQ8IC1FIC1IID4gJEAKKworZF9vYmovJS5pIDogJS5jcHAKKwkkKENYWCkgJChEX0NYWEZMQUdTKSAkPCAtRSAtSCA+ICRACisKK29iai8lLmkgOiAlLmNwcAorCSQoQ1hYKSAkKENYWEZMQUdTKSAkPCAtRSAtSCA+ICRACisKKyUub3V0OiAlLmNwcAorCSQoQ1hYKSAkKENYWEZMQUdTKSAkPCAtYyAtVVNJTkdMRSAtRE1BSU4gLWcgLURfU1RMUF9ERUJVRyAtRF9SRUVOVFJBTlQgLW8gJCoubworCSQoQ1hYKSAkKENYWEZMQUdTKSAkKi5vICQoRF9MSUJTVExQT1JUKSAkKExJQlMpIC1vICQqCisJLi8kKiA+ICRACisJLXJtIC1mICQqCisKKyUuczogJS5jcHAKKwkkKENYWCkgJChDWFhGTEFHUykgLU80IC1TIC1wdG8gJDwgIC1vICRACisKKyUuRTogJS5jcHAKKwkkKENYWCkgJChDWFhGTEFHUykgLUUgJDwgIC1vICRACisKK2NsZWFuOgorCS1ybSAtZnIgJHtURVNUX0VYRX0gKi5vICovKi5vICoucnBvICoub2JqICoub3V0IGNvcmUgKn4gVGVtcGxhdGVzLkRCCmRpZmYgLS1naXQgYS90ZXN0L2VoL2RlY2N4eC5tYWsgYi90ZXN0L2VoL2RlY2N4eC5tYWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI5ODZlOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZWgvZGVjY3h4Lm1hawpAQCAtMCwwICsxLDczIEBACisjIDs7OyAtKi0gTW9kZTptYWtlZmlsZTstKi0gCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gTWFrZWZpbGUuaW4gYnkgY29uZmlndXJlLgorIyBUaGlzIHJlcXVpcmVzIEdOVSBtYWtlLgorCitTSEVMTD0vYmluL3NoCisKKyMgc3JjZGlyID0gLgorIyBWUEFUSCA9IC4KKworCisjIHBvaW50IHRoaXMgdG8gcHJvcGVyIGxvY2F0aW9uCitTVExfSU5DTD0gLUkuLi8uLi9zdGxwb3J0CisKKyMgU1RMX0lOQ0w9IC1ERUhfTk9fU0dJX1NUTAorCitBVVhfTElTVD1UZXN0Q2xhc3MubyBtYWluLm8gbmNfYWxsb2MubyByYW5kb21fbnVtYmVyLm8KKworVEVTVF9MSVNUPXRlc3RfYWxnby5vICBcCit0ZXN0X2FsZ29iYXNlLm8gICAgIHRlc3RfbGlzdC5vIHRlc3Rfc2xpc3QubyBcCit0ZXN0X2JpdF92ZWN0b3IubyAgIHRlc3RfdmVjdG9yLm8gXAordGVzdF9kZXF1ZS5vIHRlc3Rfc2V0Lm8gdGVzdF9tYXAubyBcCit0ZXN0X2hhc2hfbWFwLm8gIHRlc3RfaGFzaF9zZXQubyB0ZXN0X3JvcGUubyBcCit0ZXN0X3N0cmluZy5vIHRlc3RfYml0c2V0Lm8gdGVzdF92YWxhcnJheS5vCisKK0xJU1Q9JHtBVVhfTElTVH0gJHtURVNUX0xJU1R9CisKK09CSkVDVFMgPSAkKExJU1QpCitFWEVDUyA9ICQoTElTVDolLm89JSkKK1RFU1RTID0gJChMSVNUOiUubz0lLm91dCkKK1RFU1RfRVhFICA9IGVoX3Rlc3QKK1RFU1QgID0gZWhfdGVzdC5vdXQKKworQ0MgPSBjeHgKK0NYWCA9ICQoQ0MpCisKKyMgLXN0ZCBzdHJpY3RfYW5zaV9lcnJvcnMKKworQ1hYRkxBR1MgPSAke1NUTF9JTkNMfSAtc3RkIHN0cmljdF9hbnNpX2Vycm9ycyAtREVIX1ZFQ1RPUl9PUEVSQVRPUl9ORVcgLURFSF9ERUxFVEVfSEFTX1RIUk9XX1NQRUMgLWdhbGwKKworIyBDWFhGTEFHUyA9ICR7U1RMX0lOQ0x9IC1zdGQgc3RyaWN0X2Fuc2lfZXJyb3JzIC1ERUhfVkVDVE9SX09QRVJBVE9SX05FVyAtREVIX0RFTEVURV9IQVNfVEhST1dfU1BFQworCisjIFRoaXMgaXMgdG8gdGVzdCB3aXRoIG5hdGl2ZSBTVEwKKyMgQ1hYRkxBR1MgPSArdzIgLXhpbGRvZmYgLURfU1RMUF9VU0VfTkVXQUxMT0MgLURFSF9OT19TR0lfU1RMIC1ERUhfTkVXX0hFQURFUlMgLURFSF9WRUNUT1JfT1BFUkFUT1JfTkVXIC1ERUhfREVMRVRFX0hBU19USFJPV19TUEVDCisKKworTElCUyA9IC1MLi4vLi4vbGliIC1sc3RscG9ydF9kZWMgLWxtIAorTElCU1REQ1hYID0gCisKKy5TVUZGSVhFUzogLmNwcCAuaSAubyAub3V0IC5yZXMKKworY2hlY2s6ICQoVEVTVCkKKworJChURVNUKSA6ICQoT0JKRUNUUykKKwkkKENYWCkgJChDWFhGTEFHUykgJChPQkpFQ1RTKSAkKExJQlMpIC1vICQoVEVTVF9FWEUpCisJTERfTElCUkFSWV9QQVRIPSIuLi8uLi9saWI6JChMRF9MSUJSQVJZX1BBVEgpIiAuLyQoVEVTVF9FWEUpIC1zIDEwMAorCisuY3BwLm86CisJJChDWFgpICQoQ1hYRkxBR1MpICQ8IC1jIC1vICRACisKKy5jcHAuaToKKwkkKENYWCkgJChDWFhGTEFHUykgJDwgLUUgPiAkQAorCislLm91dDogJS5jcHAKKwkkKENYWCkgJChDWFhGTEFHUykgJCouY3BwIC1jIC1VU0lOR0xFIC1ETUFJTiAtZyAtbyAkKi5vCisJJChDWFgpICQoQ1hYRkxBR1MpICQqLm8gJChMSUJTKSAtbyAkKgorCS4vJCogLXEKKwktcm0gLWYgJCoKKworJS5zOiAlLmNwcAorCSQoQ1hYKSAkKENYWEZMQUdTKSAtTzQgLVMgLXB0byAkKi5jcHAgIC1vICRACisKK2NsZWFuOgorCS1ybSAtZnIgJHtURVNUX0VYRX0gKi5vICoucnBvICoub2JqICoub3V0IGNvcmUgKn4gVGVtcGxhdGVzLkRCIFN1bldTX2NhY2hlIGN4eF9yZXBvc2l0b3J5CmRpZmYgLS1naXQgYS90ZXN0L2VoL2Rlc2NyaXAubW1zIGIvdGVzdC9laC9kZXNjcmlwLm1tcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDhkNDhiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9laC9kZXNjcmlwLm1tcwpAQCAtMCwwICsxLDU0IEBACisjIDs7OyAtKi0gTW9kZTptYWtlZmlsZTstKi0gCisjIEdlbmVyYXRlZCBtYW51YWxseSBmb3IgTU1TCisKKyMgcG9pbnQgdGhpcyB0byBwcm9wZXIgbG9jYXRpb24KK1NUTF9JTkNMPSAvaW5jbHVkZT0iLi4vLi4vc3RscG9ydCIKKworCisjIFNUTF9JTkNMPSAtREVIX05PX1NHSV9TVEwKKworLlNVRkZJWEVTIC5vYmogLmNwcAorCithbGwgOiBjaGVjaworCitBVVhfTElTVD1UZXN0Q2xhc3Mub2JqLG1haW4ub2JqLG5jX2FsbG9jLm9iaixyYW5kb21fbnVtYmVyLm9iagorCitURVNUX0xJU1Q9dGVzdF9hbGdvLm9iaiwtCit0ZXN0X2FsZ29iYXNlLm9iaix0ZXN0X2xpc3Qub2JqLHRlc3Rfc2xpc3Qub2JqLC0KK3Rlc3RfYml0X3ZlY3Rvci5vYmosdGVzdF92ZWN0b3Iub2JqLC0KK3Rlc3RfZGVxdWUub2JqLHRlc3Rfc2V0Lm9iaix0ZXN0X21hcC5vYmosLQordGVzdF9oYXNoX21hcC5vYmosdGVzdF9oYXNoX3NldC5vYmosdGVzdF9yb3BlLm9iaiwtCit0ZXN0X3N0cmluZy5vYmosdGVzdF9iaXRzZXQub2JqLHRlc3RfdmFsYXJyYXkub2JqCisKK0xJU1Q9JChBVVhfTElTVCksJChURVNUX0xJU1QpCisKK09CSkVDVFMgPSAkKExJU1QpCitFWEVDUyA9ICQoTElTVDolLm9iaj0lLmV4ZSkKK1RFU1RTID0gJChMSVNUOiUub2JqPSUub3V0KQorVEVTVF9FWEUgID0gZWhfdGVzdC5leGUKK1RFU1QgID0gZWhfdGVzdC5vdXQKKworQ0MgPSBjeHgKK0NYWCA9ICQoQ0MpCitMSU5LID0gY3h4bGluaworCisjIC1zdGQgc3RyaWN0X2Fuc2lfZXJyb3JzCisKK0NYWEZMQUdTID0gJChTVExfSU5DTCkgL2RlZmluZT0oX19OT19VU0VfU1REX0lPU1RSRUFNLEVIX1ZFQ1RPUl9PUEVSQVRPUl9ORVcsRUhfREVMRVRFX0hBU19USFJPV19TUEVDKQorCisjIFRoaXMgaXMgdG8gdGVzdCB3aXRoIG5hdGl2ZSBTVEwKKyMgQ1hYRkxBR1MgPSArdzIgLXhpbGRvZmYgLURfX1NUTF9VU0VfTkVXQUxMT0MgLURFSF9OT19TR0lfU1RMIC1ERUhfTkVXX0hFQURFUlMgLURFSF9WRUNUT1JfT1BFUkFUT1JfTkVXIC1ERUhfREVMRVRFX0hBU19USFJPV19TUEVDCisKKworTElCUyA9IAorTElCU1REQ1hYID0gCisKK2NoZWNrIDogJChURVNUKQorCiskKFRFU1QpIDogJChPQkpFQ1RTKQorCSQoTElOSykvZXhlPSQoVEVTVF9FWEUpICQoT0JKRUNUUykgJChMSUJTKQorCXJ1biAkKFRFU1RfRVhFKQorCisuY3BwLm9iaiA6CisJJChDWFgpICQoQ1hYRkxBR1MpIC9vYmo9JEAgJDwgCisKZGlmZiAtLWdpdCBhL3Rlc3QvZWgvZGpncHAubWFrIGIvdGVzdC9laC9kamdwcC5tYWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNmNjM4YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZWgvZGpncHAubWFrCkBAIC0wLDAgKzEsMTIxIEBACisjIDs7OyAtKi0gTW9kZTptYWtlZmlsZTstKi0gCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gTWFrZWZpbGUuaW4gYnkgY29uZmlndXJlLgorIyBUaGlzIHJlcXVpcmVzIEdOVSBtYWtlLgorCitzcmNkaXIgPSAuCitWUEFUSCA9IC4KKworIyBwb2ludCB0aGlzIHRvIHByb3BlciBsb2NhdGlvbgorU1RMX0lOQ0w9LUkuLi8uLi9zdGxwb3J0CisKK0FVWF9MSVNUPVRlc3RDbGFzcy5jcHAgbWFpbi5jcHAgbmNfYWxsb2MuY3BwIHJhbmRvbV9udW1iZXIuY3BwCisKK1RFU1RfTElTVD10ZXN0X2FsZ28uY3BwICBcCit0ZXN0X2FsZ29iYXNlLmNwcCAgICAgdGVzdF9saXN0LmNwcCB0ZXN0X3NsaXN0LmNwcCBcCit0ZXN0X2JpdF92ZWN0b3IuY3BwICAgdGVzdF92ZWN0b3IuY3BwIFwKK3Rlc3RfZGVxdWUuY3BwIHRlc3Rfc2V0LmNwcCB0ZXN0X21hcC5jcHAgXAordGVzdF9oYXNoX21hcC5jcHAgIHRlc3RfaGFzaF9zZXQuY3BwIHRlc3Rfcm9wZS5jcHAgXAordGVzdF9zdHJpbmcuY3BwIHRlc3RfYml0c2V0LmNwcCB0ZXN0X3ZhbGFycmF5LmNwcAorCitMSVNUPSR7QVVYX0xJU1R9ICR7VEVTVF9MSVNUfQorCitPQkpFQ1RTID0gJChMSVNUOiUuY3BwPW9iai8lLm8pICQoU1RBVF9NT0RVTEUpCitEX09CSkVDVFMgPSAkKExJU1Q6JS5jcHA9ZF9vYmovJS5vKSAkKFNUQVRfTU9EVUxFKQorTk9TR0lfT0JKRUNUUyA9ICQoTElTVDolLmNwcD1ub3NnaV9vYmovJS5vKSAkKFNUQVRfTU9EVUxFKQorCitFWEVDUyA9ICQoTElTVDolLmNwcD0lKQorVEVTVFMgPSAkKExJU1Q6JS5jcHA9JS5vdXQpCitURVNUX0VYRSAgPSAuL2VoX3Rlc3QKK0RfVEVTVF9FWEUgPSAuL2VoX3Rlc3RfZAorTk9TR0lfVEVTVF9FWEUgPSAuL2VoX3Rlc3Rfbm9zZ2kKKworVEVTVCAgPSAuL2VoX3Rlc3Qub3V0CitEX1RFU1QgPSAuL2VoX3Rlc3RfZC5vdXQKK05PU0dJX1RFU1QgPSAuL2VoX3Rlc3Rfbm9zZ2kub3V0CisKK0NDID0gZ2NjCitDWFggPSAkKENDKQorCisjIGR3YSAxMi8yMi85OSAtLSBoYWQgdG8gdHVybiBvZmYgLWFuc2kgZmxhZyBzbyB3ZSBjb3VsZCB1c2UgU0dJIElPU1RSRUFNUworIyBhbHNvLCB0ZXN0X3NsaXN0IHdvbid0IGNvbXBpbGUgd2l0aCAtTzMvLU8yIHdoZW4gdGFyZ2V0aW5nIFBQQy4gSXQgZmFpbHMgCisjIGluIHRoZSBhc3NlbWJsZXIgd2l0aCAnaW52YWxpZCByZWxvY2F0aW9uIHR5cGUnCitDWFhGTEFHUyA9IC1XYWxsIC1mdGVtcGxhdGUtZGVwdGgtMzIgLW1ibnUyMTAgLU8gJHtTVExfSU5DTH0gLUkuICR7Q1hYX0VYVFJBX0ZMQUdTfSAtREVIX1ZFQ1RPUl9PUEVSQVRPUl9ORVcgLURfU1RMUF9OT19TR0lfSU9TVFJFQU1TCitEX0NYWEZMQUdTID0gLVdhbGwgLWcgLU8gJHtTVExfSU5DTH0gLUkuICR7Q1hYX0VYVFJBX0ZMQUdTfSAtREVIX1ZFQ1RPUl9PUEVSQVRPUl9ORVcgLURfU1RMUF9ERUJVRyAtRF9TVExQX1VTRV9TVEFUSUNfTElCCitOT1NHSV9DWFhGTEFHUyA9IC1XYWxsIC1nIC1PMiAke1NUTF9JTkNMfSAtSS4gJHtDWFhfRVhUUkFfRkxBR1N9IC1EX1NUTFBfTk9fU0dJX0lPU1RSRUFNUyAtRF9TVExQX0RFQlVHX1VOSU5JVElBTElaRUQgLURFSF9WRUNUT1JfT1BFUkFUT1JfTkVXCisKK2NoZWNrOiAkKFRFU1QpCisKK0xJQlMgPSAtbHN0ZGN4eCAtbG0gCitEX0xJQlNUTFBPUlQgPSAuLi8uLi9saWIvbGlic3RscG9ydF9kamdwcF9kZWJ1Z19zdGF0aWMuYQorTElCU1RMUE9SVCA9IC4uLy4uL2xpYi9saWJzdGxwb3J0X2RqZ3BwX3N0bGRlYnVnX3N0YXRpYy5hCisKK2FsbDogJChURVNUX0VYRSkgJChEX1RFU1RfRVhFKSAkKE5PU0dJX1RFU1RfRVhFKQorCitjaGVja19ub3NnaTogJChOT1NHSV9URVNUKQorY2hlY2tfZDogJChEX1RFU1QpCisKKworT0JKRElSPW9iagorRF9PQkpESVI9ZF9vYmoKK05PU0dJX09CSkRJUj1ub3NnaV9vYmoKKworJChPQkpESVIpOgorCW1rZGlyIG9iagorJChEX09CSkRJUik6CisJbWtkaXIgZF9vYmoKKyQoTk9TR0lfT0JKRElSKToKKwlta2RpciBub3NnaV9vYmoKKworJChURVNUX0VYRSkgOiAkKE9CSkRJUikgJChPQkpFQ1RTKQorCSQoQ1hYKSAkKENYWEZMQUdTKSAkKE9CSkVDVFMpICQoTElCU1RMUE9SVCkgJChMSUJTKSAtbyAkKFRFU1RfRVhFKQorCiskKERfVEVTVF9FWEUpIDogJChEX09CSkRJUikgJChEX09CSkVDVFMpCisJJChDWFgpICQoRF9DWFhGTEFHUykgJChEX09CSkVDVFMpICQoRF9MSUJTVExQT1JUKSAkKExJQlMpIC1vICQoRF9URVNUX0VYRSkKKworJChOT1NHSV9URVNUX0VYRSkgOiAkKE5PU0dJX09CSkRJUikgJChOT1NHSV9PQkpFQ1RTKQorCSQoQ1hYKSAkKE5PU0dJX0NYWEZMQUdTKSAkKE5PU0dJX09CSkVDVFMpICQoTElCUykgLW8gJChOT1NHSV9URVNUX0VYRSkKKworCiskKFRFU1QpIDogJChURVNUX0VYRSkKKwkkKFRFU1RfRVhFKQorCiskKERfVEVTVCkgOiAkKERfVEVTVF9FWEUpCisJJChEX1RFU1RfRVhFKQorCiskKE5PU0dJX1RFU1QpIDogJChOT1NHSV9URVNUX0VYRSkKKwkkKE5PU0dJX1RFU1RfRVhFKQorCitTVUZGSVhFUzogLmNwcC5vLmV4ZS5vdXQucmVzCisKK25vc2dpX29iai8lLm8gOiAlLmNwcAorCSQoQ1hYKSAkKE5PU0dJX0NYWEZMQUdTKSAkPCAtYyAtbyAkQAorCitkX29iai8lLm8gOiAlLmNwcAorCSQoQ1hYKSAkKERfQ1hYRkxBR1MpICQ8IC1jIC1vICRACisKK29iai8lLm8gOiAlLmNwcAorCSQoQ1hYKSAkKENYWEZMQUdTKSAkPCAtYyAtbyAkQAorCitub3NnaV9vYmovJS5pIDogJS5jcHAKKwkkKENYWCkgJChOT1NHSV9DWFhGTEFHUykgJDwgLUUgLUggPiAkQAorCitkX29iai8lLmkgOiAlLmNwcAorCSQoQ1hYKSAkKERfQ1hYRkxBR1MpICQ8IC1FIC1IID4gJEAKKworb2JqLyUuaSA6ICUuY3BwCisJJChDWFgpICQoQ1hYRkxBR1MpICQ8IC1FIC1IID4gJEAKKworJS5vdXQ6ICUuY3BwCisJJChDWFgpICQoQ1hYRkxBR1MpICQ8IC1jIC1VU0lOR0xFIC1ETUFJTiAtZyAtbyAkKi5vCisJJChDWFgpICQoQ1hYRkxBR1MpICQqLm8gJChMSUJTKSAtbyAkKgorCS4vJCogPiAkQAorCS1ybSAtZiAkKgorCislLnM6ICUuY3BwCisJJChDWFgpICQoQ1hYRkxBR1MpIC1PNCAtUyAtcHRvICQ8ICAtbyAkQAorCislLkU6ICUuY3BwCisJJChDWFgpICQoQ1hYRkxBR1MpIC1FICQ8ICAtbyAkQAorCitjbGVhbjoKKwktcm0gLWZyICR7VEVTVF9FWEV9ICoubyAqLyoubyAqLnJwbyAqLm9iaiAqLm91dCBjb3JlICp+IFRlbXBsYXRlcy5EQgpkaWZmIC0tZ2l0IGEvdGVzdC9laC9lZ2NzLm1hayBiL3Rlc3QvZWgvZWdjcy5tYWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYyMjgzNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZWgvZWdjcy5tYWsKQEAgLTAsMCArMSw3NSBAQAorIyA7OzsgLSotIE1vZGU6bWFrZWZpbGU7LSotIAorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIE1ha2VmaWxlLmluIGJ5IGNvbmZpZ3VyZS4KKyMgVGhpcyByZXF1aXJlcyBHTlUgbWFrZS4KKworc3JjZGlyID0gLgorVlBBVEggPSAuCisKKyMgcG9pbnQgdGhpcyB0byBwcm9wZXIgbG9jYXRpb24KK1NUTF9JTkNMPS4uLy4uL3N0bHBvcnQKKworQVVYX0xJU1Q9VGVzdENsYXNzLmNwcCBtYWluLmNwcCBuY19hbGxvYy5jcHAgcmFuZG9tX251bWJlci5jcHAKKworVEVTVF9MSVNUPXRlc3RfYWxnby5jcHAgIFwKK3Rlc3RfYWxnb2Jhc2UuY3BwICAgICB0ZXN0X2xpc3QuY3BwIHRlc3Rfc2xpc3QuY3BwIFwKK3Rlc3RfYml0X3ZlY3Rvci5jcHAgICB0ZXN0X3ZlY3Rvci5jcHAgXAordGVzdF9kZXF1ZS5jcHAgdGVzdF9zZXQuY3BwIHRlc3RfbWFwLmNwcCBcCit0ZXN0X2hhc2hfbWFwLmNwcCAgdGVzdF9oYXNoX3NldC5jcHAgdGVzdF9yb3BlLmNwcCBcCit0ZXN0X3N0cmluZy5jcHAgdGVzdF9iaXRzZXQuY3BwIHRlc3RfdmFsYXJyYXkuY3BwCisKK0xJU1Q9JHtBVVhfTElTVH0gJHtURVNUX0xJU1R9CisKK09CSkVDVFMgPSAkKExJU1Q6JS5jcHA9JS5vKSAkKFNUQVRfTU9EVUxFKQorRVhFQ1MgPSAkKExJU1Q6JS5jcHA9JSkKK1RFU1RTID0gJChMSVNUOiUuY3BwPSUub3V0KQorVEVTVF9FWEUgID0gLi9laF90ZXN0CitURVNUICA9IC4vZWhfdGVzdC5vdXQKKworQ0MgPSBlZ2NzLWMrKworQ1hYID0gJChDQykKKworIyBmb3IgZWdjcworUkVQT19GTEFHUyA9CisKKyMgQ1hYRkxBR1MgPSAtZyAtV2FsbCAtSSR7U1RMX0lOQ0x9ICAtSS4gLURfU1RMUF9VU0VfTkVXQUxMT0MgLURfU1RMUF9ERUJVR19BTExPQyAke1JFUE9fRkxBR1N9IC1ERUhfTkVXX0hFQURFUlMgCisKKyMgQ1hYRkxBR1MgPSAtV2FsbCAtYW5zaSAtSSR7U1RMX0lOQ0x9ICAtSS4gLURfU1RMUF9ERUJVRyAke1JFUE9fRkxBR1N9ICR7Q1hYX0VYVFJBX0ZMQUdTfQorQ1hYRkxBR1MgPSAtV2FsbCAtZyAgLURfU1RMUF9VU0VfTkVXQUxMT0MgLUROT19GQVNUX0FMTE9DQVRPUiAtYW5zaSAtSSR7U1RMX0lOQ0x9ICAtSS4gJHtSRVBPX0ZMQUdTfSAke0NYWF9FWFRSQV9GTEFHU30gLURFSF9WRUNUT1JfT1BFUkFUT1JfTkVXIC1EX1NUTFBfREVCVUcgLURfU1RMUF9OT19ERUJVR19FWENFUFRJT05TCisKKyMgQ1hYRkxBR1MgPSAtV2FsbCAtSSR7U1RMX0lOQ0x9ICAtSS4gLURfU1RMUF9VU0VfTkVXQUxMT0MgJHtSRVBPX0ZMQUdTfSAke0NYWF9FWFRSQV9GTEFHU30KKworCitMSUJTID0gLWxtIAorTElCU1REQ1hYID0gCisKK2NoZWNrOiAkKFRFU1QpCisKKyQoVEVTVF9FWEUpIDogJChPQkpFQ1RTKQorCSQoQ1hYKSAkKENYWEZMQUdTKSAkKE9CSkVDVFMpICQoTElCUykgLW8gJChURVNUX0VYRSkKKworCiskKFRFU1QpIDogJChURVNUX0VYRSkKKwkkKFRFU1RfRVhFKQorCitTVUZGSVhFUzogLmNwcC5vLmV4ZS5vdXQucmVzCisKKyUubyA6ICUuY3BwCisJJChDWFgpICQoQ1hYRkxBR1MpICQ8IC1jIC1vICRACisKKyUuaSA6ICUuY3BwCisJJChDWFgpICQoQ1hYRkxBR1MpICQ8IC1FIC1IIC1vICRACisKKyUub3V0OiAlLmNwcAorCSQoQ1hYKSAkKENYWEZMQUdTKSAkPCAtYyAtVVNJTkdMRSAtRE1BSU4gLWcgLW8gJCoubworCSQoQ1hYKSAkKENYWEZMQUdTKSAkKi5vICQoTElCUykgLW8gJCoKKwkuLyQqID4gJEAKKwktcm0gLWYgJCoKKworJS5zOiAlLmNwcAorCSQoQ1hYKSAkKENYWEZMQUdTKSAtTzQgLVMgLXB0byAkPCAgLW8gJEAKKworJS5FOiAlLmNwcAorCSQoQ1hYKSAkKENYWEZMQUdTKSAtRSAkPCAgLW8gJEAKKworY2xlYW46CisJLXJtIC1mciAke1RFU1RfRVhFfSAkKE9CSkRJUikgJChEX09CSkRJUikgJChOT1NHSV9PQkpESVIpICoubyAqLnJwbyAqLm9iaiAqLm91dCBjb3JlICp+IFRlbXBsYXRlcy5EQgpkaWZmIC0tZ2l0IGEvdGVzdC9laC9leHBvcnQgYi90ZXN0L2VoL2V4cG9ydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjBhYjFhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9laC9leHBvcnQKQEAgLTAsMCArMSwzNyBAQAorTGVha0NoZWNrLmgKK1ByZWZpeC5oCitTb3J0Q2xhc3MuaAorVGVzdENsYXNzLmNwcAorVGVzdENsYXNzLmgKK1Rlc3RzLmgKK1Rocm93Q29tcGFyZS5oCitleHBvcnQKK2djYy5tYWsKK21haW4uY3BwCituY19hbGxvYy5jcHAKK25jX2FsbG9jLmgKK3JhbmRvbV9udW1iZXIuY3BwCityYW5kb21fbnVtYmVyLmgKK3N1bnByby5tYWsKK3Rlc3RfYWxnby5jcHAKK3Rlc3RfYWxnb2Jhc2UuY3BwCit0ZXN0X2Fzc2lnbl9vcC5oCit0ZXN0X2JpdF92ZWN0b3IuY3BwCit0ZXN0X2JpdHNldC5jcHAKK3Rlc3RfY29uc3RydWN0LmgKK3Rlc3RfZGVxdWUuY3BwCit0ZXN0X2hhc2hfbWFwLmNwcAordGVzdF9oYXNoX3Jlc2l6ZS5oCit0ZXN0X2hhc2hfc2V0LmNwcAordGVzdF9pbnNlcnQuaAordGVzdF9saXN0LmNwcAordGVzdF9tYXAuY3BwCit0ZXN0X3B1c2hfYmFjay5oCit0ZXN0X3B1c2hfZnJvbnQuaAordGVzdF9yb3BlLmNwcAordGVzdF9zZXQuY3BwCit0ZXN0X3NsaXN0LmNwcAordGVzdF9zdHJpbmcuY3BwCit0ZXN0X3ZhbGFycmF5LmNwcAordGVzdF92ZWN0b3IuY3BwCit2Yy5tYWsKZGlmZiAtLWdpdCBhL3Rlc3QvZWgvZ2NjLTk5cjEubWFrIGIvdGVzdC9laC9nY2MtOTlyMS5tYWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgyNzYzZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZWgvZ2NjLTk5cjEubWFrCkBAIC0wLDAgKzEsMTA5IEBACisjIDs7OyAtKi0gTW9kZTptYWtlZmlsZTstKi0gCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gTWFrZWZpbGUuaW4gYnkgY29uZmlndXJlLgorIyBUaGlzIHJlcXVpcmVzIEdOVSBtYWtlLgorCitzcmNkaXIgPSAuCitWUEFUSCA9IC4KKworIyBwb2ludCB0aGlzIHRvIHByb3BlciBsb2NhdGlvbgorU1RMX0lOQ0w9LUkuLi8uLi9zdGxwb3J0CisKK0FVWF9MSVNUPVRlc3RDbGFzcy5jcHAgbWFpbi5jcHAgbmNfYWxsb2MuY3BwIHJhbmRvbV9udW1iZXIuY3BwCisKK1RFU1RfTElTVD10ZXN0X2FsZ28uY3BwICBcCit0ZXN0X2FsZ29iYXNlLmNwcCAgICAgdGVzdF9saXN0LmNwcCB0ZXN0X3NsaXN0LmNwcCBcCit0ZXN0X2JpdF92ZWN0b3IuY3BwICAgdGVzdF92ZWN0b3IuY3BwIFwKK3Rlc3RfZGVxdWUuY3BwIHRlc3Rfc2V0LmNwcCB0ZXN0X21hcC5jcHAgXAordGVzdF9oYXNoX21hcC5jcHAgIHRlc3RfaGFzaF9zZXQuY3BwIHRlc3Rfcm9wZS5jcHAgXAordGVzdF9zdHJpbmcuY3BwIHRlc3RfYml0c2V0LmNwcCB0ZXN0X3ZhbGFycmF5LmNwcAorCitMSVNUPSR7QVVYX0xJU1R9ICR7VEVTVF9MSVNUfQorCitPQkpFQ1RTID0gJChMSVNUOiUuY3BwPW9iai8lLm8pICQoU1RBVF9NT0RVTEUpCitEX09CSkVDVFMgPSAkKExJU1Q6JS5jcHA9ZF9vYmovJS5vKSAkKFNUQVRfTU9EVUxFKQorTk9TR0lfT0JKRUNUUyA9ICQoTElTVDolLmNwcD1ub3NnaV9vYmovJS5vKSAkKFNUQVRfTU9EVUxFKQorCitFWEVDUyA9ICQoTElTVDolLmNwcD0lKQorVEVTVFMgPSAkKExJU1Q6JS5jcHA9JS5vdXQpCitURVNUX0VYRSAgPSAuL2VoX3Rlc3QKK0RfVEVTVF9FWEUgPSAuL2VoX3Rlc3RfZAorTk9TR0lfVEVTVF9FWEUgPSAuL2VoX3Rlc3Rfbm9zZ2kKKworVEVTVCAgPSAuL2VoX3Rlc3Qub3V0CitEX1RFU1QgPSAuL2VoX3Rlc3RfZC5vdXQKK05PU0dJX1RFU1QgPSAuL2VoX3Rlc3Rfbm9zZ2kub3V0CisKK0NDID1jKysKK0NYWCA9ICQoQ0MpCisKKyMgZHdhIDEyLzIyLzk5IC0tIGhhZCB0byB0dXJuIG9mZiAtYW5zaSBmbGFnIHNvIHdlIGNvdWxkIHVzZSBTR0kgSU9TVFJFQU1TCisjIGFsc28sIHRlc3Rfc2xpc3Qgd29uJ3QgY29tcGlsZSB3aXRoIC1PMy8tTzIgd2hlbiB0YXJnZXRpbmcgUFBDLiBJdCBmYWlscyAKKyMgaW4gdGhlIGFzc2VtYmxlciB3aXRoICdpbnZhbGlkIHJlbG9jYXRpb24gdHlwZScKK0NYWEZMQUdTID0gLVdhbGwgLU8gJHtTVExfSU5DTH0gLUkuICR7Q1hYX0VYVFJBX0ZMQUdTfSAtREVIX1ZFQ1RPUl9PUEVSQVRPUl9ORVcgLWcgLURfU1RMUF9IQVNfTk9fTkFNRVNQQUNFUworRF9DWFhGTEFHUyA9IC1XYWxsIC1nIC1PICR7U1RMX0lOQ0x9IC1JLiAke0NYWF9FWFRSQV9GTEFHU30gLURFSF9WRUNUT1JfT1BFUkFUT1JfTkVXIC1EX1NUTFBfREVCVUcKK05PU0dJX0NYWEZMQUdTID0gLVdhbGwgLWcgLU8gJHtTVExfSU5DTH0gLUkuICR7Q1hYX0VYVFJBX0ZMQUdTfSAtRF9TVExQX05PX09XTl9JT1NUUkVBTVMgLURFSF9WRUNUT1JfT1BFUkFUT1JfTkVXCisKK2NoZWNrOiAkKFRFU1QpCisKK0xJQlMgPSAtbG0gCitEX0xJQlNUTFBPUlQgPSAtTC4uLy4uL2xpYiAtbHN0bHBvcnRfZ2NjX3N0bGRlYnVnCitMSUJTVExQT1JUID0gLUwuLi8uLi9saWIgLWxzdGxwb3J0X2djYworCithbGw6ICQoVEVTVF9FWEUpICQoRF9URVNUX0VYRSkgJChOT1NHSV9URVNUX0VYRSkKKworY2hlY2tfbm9zZ2k6ICQoTk9TR0lfVEVTVCkKK2NoZWNrX2Q6ICQoRF9URVNUKQorCisKKyQoVEVTVF9FWEUpIDogJChPQkpFQ1RTKQorCSQoQ1hYKSAkKENYWEZMQUdTKSAkKE9CSkVDVFMpICQoTElCU1RMUE9SVCkgJChMSUJTKSAtbyAkKFRFU1RfRVhFKQorCiskKERfVEVTVF9FWEUpIDogJChEX09CSkVDVFMpCisJJChDWFgpICQoRF9DWFhGTEFHUykgJChEX09CSkVDVFMpICQoRF9MSUJTVExQT1JUKSAkKExJQlMpIC1vICQoRF9URVNUX0VYRSkKKworJChOT1NHSV9URVNUX0VYRSkgOiAkKE5PU0dJX09CSkVDVFMpCisJJChDWFgpICQoTk9TR0lfQ1hYRkxBR1MpICQoTk9TR0lfT0JKRUNUUykgJChMSUJTKSAtbyAkKE5PU0dJX1RFU1RfRVhFKQorCisKKyQoVEVTVCkgOiAkKFRFU1RfRVhFKQorCUxEX0xJQlJBUllfUEFUSD0iLi4vLi4vbGliOiQoTERfTElCUkFSWV9QQVRIKSIgdGltZSAuLyQoVEVTVF9FWEUpIC1zIDEwMAorCiskKERfVEVTVCkgOiAkKERfVEVTVF9FWEUpCisJJChEX1RFU1RfRVhFKQorCiskKE5PU0dJX1RFU1QpIDogJChOT1NHSV9URVNUX0VYRSkKKwkkKE5PU0dJX1RFU1RfRVhFKQorCitTVUZGSVhFUzogLmNwcC5vLmV4ZS5vdXQucmVzCisKK25vc2dpX29iai8lLm8gOiAlLmNwcAorCSQoQ1hYKSAkKE5PU0dJX0NYWEZMQUdTKSAkPCAtYyAtbyAkQAorCitkX29iai8lLm8gOiAlLmNwcAorCSQoQ1hYKSAkKERfQ1hYRkxBR1MpICQ8IC1jIC1vICRACisKK29iai8lLm8gOiAlLmNwcAorCSQoQ1hYKSAkKENYWEZMQUdTKSAkPCAtYyAtbyAkQAorCitub3NnaV9vYmovJS5pIDogJS5jcHAKKwkkKENYWCkgJChOT1NHSV9DWFhGTEFHUykgJDwgLUUgLUggPiAkQAorCitkX29iai8lLmkgOiAlLmNwcAorCSQoQ1hYKSAkKERfQ1hYRkxBR1MpICQ8IC1FIC1IID4gJEAKKworb2JqLyUuaSA6ICUuY3BwCisJJChDWFgpICQoQ1hYRkxBR1MpICQ8IC1FIC1IID4gJEAKKworJS5vdXQ6ICUuY3BwCisJJChDWFgpICQoQ1hYRkxBR1MpICQ8IC1jIC1VU0lOR0xFIC1ETUFJTiAtTzIgLW8gJCoubworCSQoQ1hYKSAkKENYWEZMQUdTKSAkKi5vICQoTElCU1RMUE9SVCkgJChMSUJTKSAtbyAkKgorCS4vJCogPiAkQAorCislLnM6ICUuY3BwCisJJChDWFgpICQoQ1hYRkxBR1MpIC1PNCAtUyAtcHRvICQ8ICAtbyAkQAorCislLkU6ICUuY3BwCisJJChDWFgpICQoQ1hYRkxBR1MpIC1FICQ8ICAtbyAkQAorCitjbGVhbjoKKwktcm0gLWZyICR7VEVTVF9FWEV9ICQoRF9URVNUX0VYRSkgKi5vICovKi5vICoucnBvICoub2JqICoub3V0IGNvcmUgKn4gVGVtcGxhdGVzLkRCCmRpZmYgLS1naXQgYS90ZXN0L2VoL2djYy1hbWlnYW9zLW02OGsubWFrIGIvdGVzdC9laC9nY2MtYW1pZ2Fvcy1tNjhrLm1hawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzFlMmFiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9laC9nY2MtYW1pZ2Fvcy1tNjhrLm1hawpAQCAtMCwwICsxLDExOSBAQAorIworIyBUaGlzIHJlcXVpcmVzIEdOVSBtYWtlLgorIworCitzcmNkaXIgPSAuCitWUEFUSCA9IC4KK1NIRUxMID0gL2Jpbi9zaAorCisjIHBvaW50IHRoaXMgdG8gcHJvcGVyIGxvY2F0aW9uCitTVExfSU5DTCA9IC1JLi4vLi4vc3RscG9ydAorCitBVVhfTElTVCA9IFRlc3RDbGFzcy5jcHAgbWFpbi5jcHAgbmNfYWxsb2MuY3BwIHJhbmRvbV9udW1iZXIuY3BwCisKK1RFU1RfTElTVCA9IHRlc3RfYWxnby5jcHAgIFwKKwl0ZXN0X2FsZ29iYXNlLmNwcCB0ZXN0X2xpc3QuY3BwIHRlc3Rfc2xpc3QuY3BwIFwKKwl0ZXN0X2JpdF92ZWN0b3IuY3BwIHRlc3RfdmVjdG9yLmNwcCBcCisJdGVzdF9kZXF1ZS5jcHAgdGVzdF9zZXQuY3BwIHRlc3RfbWFwLmNwcCBcCisJdGVzdF9oYXNoX21hcC5jcHAgIHRlc3RfaGFzaF9zZXQuY3BwIHRlc3Rfcm9wZS5jcHAgXAorCXRlc3Rfc3RyaW5nLmNwcCB0ZXN0X2JpdHNldC5jcHAgdGVzdF92YWxhcnJheS5jcHAKKworTElTVCA9ICR7QVVYX0xJU1R9ICR7VEVTVF9MSVNUfQorCitPQkpFQ1RTID0gJChMSVNUOiUuY3BwPW9iai8lLm8pICQoU1RBVF9NT0RVTEUpCitEX09CSkVDVFMgPSAkKExJU1Q6JS5jcHA9ZF9vYmovJS5vKSAkKFNUQVRfTU9EVUxFKQorTk9TR0lfT0JKRUNUUyA9ICQoTElTVDolLmNwcD1ub3NnaV9vYmovJS5vKSAkKFNUQVRfTU9EVUxFKQorCitFWEVDUyA9ICQoTElTVDolLmNwcD0lKQorVEVTVFMgPSAkKExJU1Q6JS5jcHA9JS5vdXQpCitURVNUX0VYRSAgPSAuL2VoX3Rlc3QKK0RfVEVTVF9FWEUgPSAuL2VoX3Rlc3RfZAorTk9TR0lfVEVTVF9FWEUgPSAuL2VoX3Rlc3Rfbm9zZ2kKKworVEVTVCAgPSAuL2VoX3Rlc3Qub3V0CitEX1RFU1QgPSAuL2VoX3Rlc3RfZC5vdXQKK05PU0dJX1RFU1QgPSAuL2VoX3Rlc3Rfbm9zZ2kub3V0CisKK0NDID0gZ2NjCitDWFggPSBnKysKKworQ1hYRkxBR1MgPSAtcyAtbm9peGVtdWwgLW02ODAyMCAtV2FsbCAtTzIgJHtTVExfSU5DTH0gLUkuIC1ERUhfVkVDVE9SX09QRVJBVE9SX05FVworRF9DWFhGTEFHUyA9IC1XYWxsIC1nIC1PICR7U1RMX0lOQ0x9IC1JLiAtREVIX1ZFQ1RPUl9PUEVSQVRPUl9ORVcgLURfU1RMUF9ERUJVRyAtRF9TVExQX1VTRV9TVEFUSUNfTElCCitOT1NHSV9DWFhGTEFHUyA9IC1XYWxsIC1nIC1PMiAke1NUTF9JTkNMfSAtSS4gLURfU1RMUF9OT19PV05fSU9TVFJFQU1TIC1EX1NUTFBfREVCVUdfVU5JTklUSUFMSVpFRCAtREVIX1ZFQ1RPUl9PUEVSQVRPUl9ORVcKKworY2hlY2s6ICQoVEVTVCkKKworTElCUyA9IC1sbQorRF9MSUJTVExQT1JUID0gLUwuLi8uLi9saWIgLWxzdGxwb3J0X2djY19zdGxkZWJ1ZworTElCU1RMUE9SVCA9IC1MLi4vLi4vbGliIC1sc3RscG9ydF9nY2MKKworYWxsOiAkKFRFU1RfRVhFKQorCitjaGVja19ub3NnaTogJChOT1NHSV9URVNUKQorY2hlY2tfZDogJChEX1RFU1QpCisKKworT0JKRElSPW9iagorRF9PQkpESVI9ZF9vYmoKK05PU0dJX09CSkRJUj1ub3NnaV9vYmoKKworJChPQkpESVIpOgorCW1rZGlyIG9iagorJChEX09CSkRJUik6CisJbWtkaXIgZF9vYmoKKyQoTk9TR0lfT0JKRElSKToKKwlta2RpciBub3NnaV9vYmoKKworJChURVNUX0VYRSkgOiAkKE9CSkRJUikgJChPQkpFQ1RTKQorCSQoQ1hYKSAkKENYWEZMQUdTKSAkKE9CSkVDVFMpICQoTElCU1RMUE9SVCkgJChMSUJTKSAtbyAkKFRFU1RfRVhFKQorCiskKERfVEVTVF9FWEUpIDogJChEX09CSkRJUikgJChEX09CSkVDVFMpCisJJChDWFgpICQoRF9DWFhGTEFHUykgJChEX09CSkVDVFMpICQoRF9MSUJTVExQT1JUKSAkKExJQlMpIC1vICQoRF9URVNUX0VYRSkKKworJChOT1NHSV9URVNUX0VYRSkgOiAkKE5PU0dJX09CSkRJUikgJChOT1NHSV9PQkpFQ1RTKQorCSQoQ1hYKSAkKE5PU0dJX0NYWEZMQUdTKSAkKE5PU0dJX09CSkVDVFMpICQoTElCUykgLW8gJChOT1NHSV9URVNUX0VYRSkKKworJChURVNUKSA6ICQoVEVTVF9FWEUpCisJJChURVNUX0VYRSkgLXMgMTAwCisKKyQoRF9URVNUKSA6ICQoRF9URVNUX0VYRSkKKwlMRF9MSUJSQVJZX1BBVEg9Ii4uLy4uL2xpYjokKExEX0xJQlJBUllfUEFUSCkiIC4vJChEX1RFU1RfRVhFKSAtcyAxMDAKKworCiskKE5PU0dJX1RFU1QpIDogJChOT1NHSV9URVNUX0VYRSkKKwkkKE5PU0dJX1RFU1RfRVhFKQorCitTVUZGSVhFUzogLmNwcC5vLmV4ZS5vdXQucmVzCisKK25vc2dpX29iai8lLm8gOiAlLmNwcAorCSQoQ1hYKSAkKE5PU0dJX0NYWEZMQUdTKSAkPCAtYyAtbyAkQAorCitkX29iai8lLm8gOiAlLmNwcAorCSQoQ1hYKSAkKERfQ1hYRkxBR1MpICQ8IC1jIC1vICRACisKK29iai8lLm8gOiAlLmNwcAorCSQoQ1hYKSAkKENYWEZMQUdTKSAkPCAtYyAtbyAkQAorCitub3NnaV9vYmovJS5pIDogJS5jcHAKKwkkKENYWCkgJChOT1NHSV9DWFhGTEFHUykgJDwgLUUgLUggPiAkQAorCitkX29iai8lLmkgOiAlLmNwcAorCSQoQ1hYKSAkKERfQ1hYRkxBR1MpICQ8IC1FIC1IID4gJEAKKworb2JqLyUuaSA6ICUuY3BwCisJJChDWFgpICQoQ1hYRkxBR1MpICQ8IC1FIC1IID4gJEAKKworJS5vdXQ6ICUuY3BwCisJJChDWFgpICQoQ1hYRkxBR1MpICQ8IC1jIC1VU0lOR0xFIC1ETUFJTiAtZyAtbyAkKi5vCisJJChDWFgpICQoQ1hYRkxBR1MpICQqLm8gJChMSUJTKSAtbyAkKgorCS4vJCogPiAkQAorCS1ybSAtZiAkKgorCislLnM6ICUuY3BwCisJJChDWFgpICQoQ1hYRkxBR1MpIC1PNCAtUyAtcHRvICQ8ICAtbyAkQAorCislLkU6ICUuY3BwCisJJChDWFgpICQoQ1hYRkxBR1MpIC1FICQ8ICAtbyAkQAorCitjbGVhbjoKKwktcm0gLWZyICR7VEVTVF9FWEV9ICoubyAqLyoubyAqLnJwbyAqLm9iaiAqLm91dCBjb3JlICp+IFRlbXBsYXRlcy5EQgpkaWZmIC0tZ2l0IGEvdGVzdC9laC9nY2MtYXBwbGUtbWFjb3N4Lm1hayBiL3Rlc3QvZWgvZ2NjLWFwcGxlLW1hY29zeC5tYWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI0MGFiZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZWgvZ2NjLWFwcGxlLW1hY29zeC5tYWsKQEAgLTAsMCArMSwxMjIgQEAKKyMgOzs7IC0qLSBNb2RlOm1ha2VmaWxlOy0qLSAKKyMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBNYWtlZmlsZS5pbiBieSBjb25maWd1cmUuCisjIFRoaXMgcmVxdWlyZXMgR05VIG1ha2UuCisKK3NyY2RpciA9IC4KK1ZQQVRIID0gLgorU0hFTEw9L2Jpbi9zaAorCisjIHBvaW50IHRoaXMgdG8gcHJvcGVyIGxvY2F0aW9uCitTVExfSU5DTD0tSS4uLy4uL3N0bHBvcnQKKworQVVYX0xJU1Q9VGVzdENsYXNzLmNwcCBtYWluLmNwcCBuY19hbGxvYy5jcHAgcmFuZG9tX251bWJlci5jcHAKKworVEVTVF9MSVNUPXRlc3RfYWxnby5jcHAgIFwKK3Rlc3RfYWxnb2Jhc2UuY3BwICAgICB0ZXN0X2xpc3QuY3BwIHRlc3Rfc2xpc3QuY3BwIFwKK3Rlc3RfYml0X3ZlY3Rvci5jcHAgICB0ZXN0X3ZlY3Rvci5jcHAgXAordGVzdF9kZXF1ZS5jcHAgdGVzdF9zZXQuY3BwIHRlc3RfbWFwLmNwcCBcCit0ZXN0X2hhc2hfbWFwLmNwcCAgdGVzdF9oYXNoX3NldC5jcHAgdGVzdF9yb3BlLmNwcCBcCit0ZXN0X3N0cmluZy5jcHAgdGVzdF9iaXRzZXQuY3BwIHRlc3RfdmFsYXJyYXkuY3BwCisKK0xJU1Q9JHtBVVhfTElTVH0gJHtURVNUX0xJU1R9CisKK09CSkVDVFMgPSAkKExJU1Q6JS5jcHA9b2JqLyUubykgJChTVEFUX01PRFVMRSkKK0RfT0JKRUNUUyA9ICQoTElTVDolLmNwcD1kX29iai8lLm8pICQoU1RBVF9NT0RVTEUpCitOT1NHSV9PQkpFQ1RTID0gJChMSVNUOiUuY3BwPW5vc2dpX29iai8lLm8pICQoU1RBVF9NT0RVTEUpCisKK0VYRUNTID0gJChMSVNUOiUuY3BwPSUpCitURVNUUyA9ICQoTElTVDolLmNwcD0lLm91dCkKK1RFU1RfRVhFICA9IC4vZWhfdGVzdAorRF9URVNUX0VYRSA9IC4vZWhfdGVzdF9kCitOT1NHSV9URVNUX0VYRSA9IC4vZWhfdGVzdF9ub3NnaQorCitURVNUICA9IC4vZWhfdGVzdC5vdXQKK0RfVEVTVCA9IC4vZWhfdGVzdF9kLm91dAorTk9TR0lfVEVTVCA9IC4vZWhfdGVzdF9ub3NnaS5vdXQKKworQ0MgPSBnKysKK0NYWCA9ICQoQ0MpCisKKyMgZHdhIDEyLzIyLzk5IC0tIGhhZCB0byB0dXJuIG9mZiAtYW5zaSBmbGFnIHNvIHdlIGNvdWxkIHVzZSBTR0kgSU9TVFJFQU1TCisjIGFsc28sIHRlc3Rfc2xpc3Qgd29uJ3QgY29tcGlsZSB3aXRoIC1PMy8tTzIgd2hlbiB0YXJnZXRpbmcgUFBDLiBJdCBmYWlscyAKKyMgaW4gdGhlIGFzc2VtYmxlciB3aXRoICdpbnZhbGlkIHJlbG9jYXRpb24gdHlwZScKK0NYWEZMQUdTID0gLVdhbGwgLU8gJHtTVExfSU5DTH0gLUkuICR7Q1hYX0VYVFJBX0ZMQUdTfSAtREVIX1ZFQ1RPUl9PUEVSQVRPUl9ORVcKK0RfQ1hYRkxBR1MgPSAtV2FsbCAtZyAtTyAke1NUTF9JTkNMfSAtSS4gJHtDWFhfRVhUUkFfRkxBR1N9IC1ERUhfVkVDVE9SX09QRVJBVE9SX05FVyAtRF9TVExQX0RFQlVHIC1EX1NUTFBfVVNFX1NUQVRJQ19MSUIKK05PU0dJX0NYWEZMQUdTID0gLVdhbGwgLWcgLU8yICR7U1RMX0lOQ0x9IC1JLiAke0NYWF9FWFRSQV9GTEFHU30gLURfU1RMUF9OT19PV05fSU9TVFJFQU1TIC1EX1NUTFBfREVCVUdfVU5JTklUSUFMSVpFRCAtREVIX1ZFQ1RPUl9PUEVSQVRPUl9ORVcKKworY2hlY2s6ICQoVEVTVCkKKworTElCUyA9IC1sbSAKK0RfTElCU1RMUE9SVCA9IC1MLi4vLi4vbGliIC1sc3RscG9ydF9nY2NfZGVidWcKK0xJQlNUTFBPUlQgPSAtTC4uLy4uL2xpYiAtbHN0bHBvcnRfZ2NjCisKK2FsbDogJChURVNUX0VYRSkgJChEX1RFU1RfRVhFKSAkKE5PU0dJX1RFU1RfRVhFKQorCitjaGVja19ub3NnaTogJChOT1NHSV9URVNUKQorY2hlY2tfZDogJChEX1RFU1QpCisKKworT0JKRElSPW9iagorRF9PQkpESVI9ZF9vYmoKK05PU0dJX09CSkRJUj1ub3NnaV9vYmoKKworJChPQkpESVIpOgorCW1rZGlyIG9iagorJChEX09CSkRJUik6CisJbWtkaXIgZF9vYmoKKyQoTk9TR0lfT0JKRElSKToKKwlta2RpciBub3NnaV9vYmoKKworJChURVNUX0VYRSkgOiAkKE9CSkRJUikgJChPQkpFQ1RTKQorCSQoQ1hYKSAkKENYWEZMQUdTKSAkKE9CSkVDVFMpICQoTElCU1RMUE9SVCkgJChMSUJTKSAtbyAkKFRFU1RfRVhFKQorCiskKERfVEVTVF9FWEUpIDogJChEX09CSkRJUikgJChEX09CSkVDVFMpCisJJChDWFgpICQoRF9DWFhGTEFHUykgJChEX09CSkVDVFMpICQoRF9MSUJTVExQT1JUKSAkKExJQlMpIC1vICQoRF9URVNUX0VYRSkKKworJChOT1NHSV9URVNUX0VYRSkgOiAkKE5PU0dJX09CSkRJUikgJChOT1NHSV9PQkpFQ1RTKQorCSQoQ1hYKSAkKE5PU0dJX0NYWEZMQUdTKSAkKE5PU0dJX09CSkVDVFMpICQoTElCUykgLW8gJChOT1NHSV9URVNUX0VYRSkKKworJChURVNUKSA6ICQoVEVTVF9FWEUpCisJTERfTElCUkFSWV9QQVRIPSIuLi8uLi9saWI6JChMRF9MSUJSQVJZX1BBVEgpIiB0aW1lIC4vJChURVNUX0VYRSkgLXMgMTAwCisKKyQoRF9URVNUKSA6ICQoRF9URVNUX0VYRSkKKwlMRF9MSUJSQVJZX1BBVEg9Ii4uLy4uL2xpYjokKExEX0xJQlJBUllfUEFUSCkiIC4vJChEX1RFU1RfRVhFKSAtcyAxMDAKKworCiskKE5PU0dJX1RFU1QpIDogJChOT1NHSV9URVNUX0VYRSkKKwkkKE5PU0dJX1RFU1RfRVhFKQorCitTVUZGSVhFUzogLmNwcC5vLmV4ZS5vdXQucmVzCisKK25vc2dpX29iai8lLm8gOiAlLmNwcAorCSQoQ1hYKSAkKE5PU0dJX0NYWEZMQUdTKSAkPCAtYyAtbyAkQAorCitkX29iai8lLm8gOiAlLmNwcAorCSQoQ1hYKSAkKERfQ1hYRkxBR1MpICQ8IC1jIC1vICRACisKK29iai8lLm8gOiAlLmNwcAorCSQoQ1hYKSAkKENYWEZMQUdTKSAkPCAtYyAtbyAkQAorCitub3NnaV9vYmovJS5pIDogJS5jcHAKKwkkKENYWCkgJChOT1NHSV9DWFhGTEFHUykgJDwgLUUgLUggPiAkQAorCitkX29iai8lLmkgOiAlLmNwcAorCSQoQ1hYKSAkKERfQ1hYRkxBR1MpICQ8IC1FIC1IID4gJEAKKworb2JqLyUuaSA6ICUuY3BwCisJJChDWFgpICQoQ1hYRkxBR1MpICQ8IC1FIC1IID4gJEAKKworJS5vdXQ6ICUuY3BwCisJJChDWFgpICQoQ1hYRkxBR1MpICQ8IC1jIC1VU0lOR0xFIC1ETUFJTiAtZyAtbyAkKi5vCisJJChDWFgpICQoQ1hYRkxBR1MpICQqLm8gJChMSUJTVExQT1JUKSAkKExJQlMpIC1vICQqCisJLi8kKiA+ICRACisjCS1ybSAtZiAkKgorCislLnM6ICUuY3BwCisJJChDWFgpICQoQ1hYRkxBR1MpIC1PNCAtUyAtcHRvICQ8ICAtbyAkQAorCislLkU6ICUuY3BwCisJJChDWFgpICQoQ1hYRkxBR1MpIC1FICQ8ICAtbyAkQAorCitjbGVhbjoKKwktcm0gLWZyICR7VEVTVF9FWEV9ICoubyAqLyoubyAqLnJwbyAqLm9iaiAqLm91dCBjb3JlICp+IFRlbXBsYXRlcy5EQgpkaWZmIC0tZ2l0IGEvdGVzdC9laC9nY2MtZnJlZWJzZC5tYWsgYi90ZXN0L2VoL2djYy1mcmVlYnNkLm1hawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTVhZGQyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9laC9nY2MtZnJlZWJzZC5tYWsKQEAgLTAsMCArMSwxMjMgQEAKKyMgOzs7IC0qLSBNb2RlOm1ha2VmaWxlOy0qLSAKKyMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBNYWtlZmlsZS5pbiBieSBjb25maWd1cmUuCisjIFRoaXMgcmVxdWlyZXMgR05VIG1ha2UuCisKK3NyY2RpciA9IC4KK1ZQQVRIID0gLgorU0hFTEw9L2Jpbi9zaAorCisjIHBvaW50IHRoaXMgdG8gcHJvcGVyIGxvY2F0aW9uCitTVExfSU5DTD0tSS4uLy4uL3N0bHBvcnQKKworQVVYX0xJU1Q9VGVzdENsYXNzLmNwcCBtYWluLmNwcCBuY19hbGxvYy5jcHAgcmFuZG9tX251bWJlci5jcHAKKworVEVTVF9MSVNUPXRlc3RfYWxnby5jcHAgIFwKK3Rlc3RfYWxnb2Jhc2UuY3BwICAgICB0ZXN0X2xpc3QuY3BwIHRlc3Rfc2xpc3QuY3BwIFwKK3Rlc3RfYml0X3ZlY3Rvci5jcHAgICB0ZXN0X3ZlY3Rvci5jcHAgXAordGVzdF9kZXF1ZS5jcHAgdGVzdF9zZXQuY3BwIHRlc3RfbWFwLmNwcCBcCit0ZXN0X2hhc2hfbWFwLmNwcCAgdGVzdF9oYXNoX3NldC5jcHAgdGVzdF9yb3BlLmNwcCBcCit0ZXN0X3N0cmluZy5jcHAgdGVzdF9iaXRzZXQuY3BwIHRlc3RfdmFsYXJyYXkuY3BwCisKK0xJU1Q9JHtBVVhfTElTVH0gJHtURVNUX0xJU1R9CisKK09CSkVDVFMgPSAkKExJU1Q6JS5jcHA9b2JqLyUubykgJChTVEFUX01PRFVMRSkKK0RfT0JKRUNUUyA9ICQoTElTVDolLmNwcD1kX29iai8lLm8pICQoU1RBVF9NT0RVTEUpCitOT1NHSV9PQkpFQ1RTID0gJChMSVNUOiUuY3BwPW5vc2dpX29iai8lLm8pICQoU1RBVF9NT0RVTEUpCisKK0VYRUNTID0gJChMSVNUOiUuY3BwPSUpCitURVNUUyA9ICQoTElTVDolLmNwcD0lLm91dCkKK1RFU1RfRVhFICA9IC4vZWhfdGVzdAorRF9URVNUX0VYRSA9IC4vZWhfdGVzdF9kCitOT1NHSV9URVNUX0VYRSA9IC4vZWhfdGVzdF9ub3NnaQorCitURVNUICA9IC4vZWhfdGVzdC5vdXQKK0RfVEVTVCA9IC4vZWhfdGVzdF9kLm91dAorTk9TR0lfVEVTVCA9IC4vZWhfdGVzdF9ub3NnaS5vdXQKKworQ0MgPSBjKysgLXB0aHJlYWQKK0NYWCA9ICQoQ0MpCisKKyMgZHdhIDEyLzIyLzk5IC0tIGhhZCB0byB0dXJuIG9mZiAtYW5zaSBmbGFnIHNvIHdlIGNvdWxkIHVzZSBTR0kgSU9TVFJFQU1TCisjIGFsc28sIHRlc3Rfc2xpc3Qgd29uJ3QgY29tcGlsZSB3aXRoIC1PMy8tTzIgd2hlbiB0YXJnZXRpbmcgUFBDLiBJdCBmYWlscyAKKyMgaW4gdGhlIGFzc2VtYmxlciB3aXRoICdpbnZhbGlkIHJlbG9jYXRpb24gdHlwZScKK0NYWEZMQUdTID0gLVdhbGwgLWcgLU8gJHtTVExfSU5DTH0gLUkuICR7Q1hYX0VYVFJBX0ZMQUdTfSAtREVIX1ZFQ1RPUl9PUEVSQVRPUl9ORVcKKworRF9DWFhGTEFHUyA9IC1XYWxsIC1nIC1PICR7U1RMX0lOQ0x9IC1JLiAke0NYWF9FWFRSQV9GTEFHU30gLURFSF9WRUNUT1JfT1BFUkFUT1JfTkVXIC1EX1NUTFBfREVCVUcgLURfU1RMUF9VU0VfU1RBVElDX0xJQgorTk9TR0lfQ1hYRkxBR1MgPSAtV2FsbCAtZyAtTzIgJHtTVExfSU5DTH0gLUkuICR7Q1hYX0VYVFJBX0ZMQUdTfSAtRF9TVExQX05PX09XTl9JT1NUUkVBTVMgLURfU1RMUF9ERUJVR19VTklOSVRJQUxJWkVEIC1ERUhfVkVDVE9SX09QRVJBVE9SX05FVworCitjaGVjazogJChURVNUKQorCitMSUJTID0gLWxtIAorRF9MSUJTVExQT1JUID0gLUwuLi8uLi9saWIgLWxzdGxwb3J0X2djY19zdGxkZWJ1ZworTElCU1RMUE9SVCA9IC1MLi4vLi4vbGliIC1sc3RscG9ydF9nY2MKKworYWxsOiAkKFRFU1RfRVhFKSAkKERfVEVTVF9FWEUpICQoTk9TR0lfVEVTVF9FWEUpCisKK2NoZWNrX25vc2dpOiAkKE5PU0dJX1RFU1QpCitjaGVja19kOiAkKERfVEVTVCkKKworT0JKRElSPW9iagorRF9PQkpESVI9ZF9vYmoKK05PU0dJX09CSkRJUj1ub3NnaV9vYmoKKworJChPQkpESVIpOgorCW1rZGlyIG9iagorJChEX09CSkRJUik6CisJbWtkaXIgZF9vYmoKKyQoTk9TR0lfT0JKRElSKToKKwlta2RpciBub3NnaV9vYmoKKworCiskKFRFU1RfRVhFKSA6ICQoT0JKRElSKSAkKE9CSkVDVFMpCisJJChDWFgpICQoQ1hYRkxBR1MpICQoT0JKRUNUUykgJChMSUJTVExQT1JUKSAkKExJQlMpIC1vICQoVEVTVF9FWEUpCisKKyQoRF9URVNUX0VYRSkgOiAkKERfT0JKRElSKSAkKERfT0JKRUNUUykKKwkkKENYWCkgJChEX0NYWEZMQUdTKSAkKERfT0JKRUNUUykgJChEX0xJQlNUTFBPUlQpICQoTElCUykgLW8gJChEX1RFU1RfRVhFKQorCiskKE5PU0dJX1RFU1RfRVhFKSA6ICQoTk9TR0lfT0JKRElSKSAkKE5PU0dJX09CSkVDVFMpCisJJChDWFgpICQoTk9TR0lfQ1hYRkxBR1MpICQoTk9TR0lfT0JKRUNUUykgJChMSUJTKSAtbyAkKE5PU0dJX1RFU1RfRVhFKQorCisKKyQoVEVTVCkgOiAkKFRFU1RfRVhFKQorCUxEX0xJQlJBUllfUEFUSD0iLi4vLi4vbGliOiQoTERfTElCUkFSWV9QQVRIKSIgLi8kKFRFU1RfRVhFKSAtcyAxMDAKKworJChEX1RFU1QpIDogJChEX1RFU1RfRVhFKQorCUxEX0xJQlJBUllfUEFUSD0iLi4vLi4vbGliOiQoTERfTElCUkFSWV9QQVRIKSIgLi8kKERfVEVTVF9FWEUpIC1zIDEwMAorCiskKE5PU0dJX1RFU1QpIDogJChOT1NHSV9URVNUX0VYRSkKKwkkKE5PU0dJX1RFU1RfRVhFKQorCitTVUZGSVhFUzogLmNwcC5vLmV4ZS5vdXQucmVzCisKK25vc2dpX29iai8lLm8gOiAlLmNwcAorCSQoQ1hYKSAkKE5PU0dJX0NYWEZMQUdTKSAkPCAtYyAtbyAkQAorCitkX29iai8lLm8gOiAlLmNwcAorCSQoQ1hYKSAkKERfQ1hYRkxBR1MpICQ8IC1jIC1vICRACisKK29iai8lLm8gOiAlLmNwcAorCSQoQ1hYKSAkKENYWEZMQUdTKSAkPCAtYyAtbyAkQAorCitub3NnaV9vYmovJS5pIDogJS5jcHAKKwkkKENYWCkgJChOT1NHSV9DWFhGTEFHUykgJDwgLUUgLUggPiAkQAorCitkX29iai8lLmkgOiAlLmNwcAorCSQoQ1hYKSAkKERfQ1hYRkxBR1MpICQ8IC1FIC1IID4gJEAKKworb2JqLyUuaSA6ICUuY3BwCisJJChDWFgpICQoQ1hYRkxBR1MpICQ8IC1FIC1IID4gJEAKKworJS5vdXQ6ICUuY3BwCisJJChDWFgpICQoQ1hYRkxBR1MpICQ8IC1jIC1VU0lOR0xFIC1ETUFJTiAtZyAtbyAkKi5vCisJJChDWFgpICQoQ1hYRkxBR1MpICQqLm8gJChMSUJTKSAtbyAkKgorCS4vJCogPiAkQAorCS1ybSAtZiAkKgorCislLnM6ICUuY3BwCisJJChDWFgpICQoQ1hYRkxBR1MpIC1PNCAtUyAtcHRvICQ8ICAtbyAkQAorCislLkU6ICUuY3BwCisJJChDWFgpICQoQ1hYRkxBR1MpIC1FICQ8ICAtbyAkQAorCitjbGVhbjoKKwktcm0gLWZyICR7VEVTVF9FWEV9ICoubyAqLyoubyAqLnJwbyAqLm9iaiAqLm91dCBjb3JlICp+IFRlbXBsYXRlcy5EQgpkaWZmIC0tZ2l0IGEvdGVzdC9laC9nY2MtaHAxMS5tYWsgYi90ZXN0L2VoL2djYy1ocDExLm1hawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzZiMGE5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9laC9nY2MtaHAxMS5tYWsKQEAgLTAsMCArMSwxMjMgQEAKKyMgOzs7IC0qLSBNb2RlOm1ha2VmaWxlOy0qLSAKKyMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBNYWtlZmlsZS5pbiBieSBjb25maWd1cmUuCisjIFRoaXMgcmVxdWlyZXMgR05VIG1ha2UuCisKK3NyY2RpciA9IC4KK1ZQQVRIID0gLgorU0hFTEw9L2Jpbi9zaAorCisjIHBvaW50IHRoaXMgdG8gcHJvcGVyIGxvY2F0aW9uCitTVExfSU5DTD0tSS4uLy4uL3N0bHBvcnQKKworQVVYX0xJU1Q9VGVzdENsYXNzLmNwcCBtYWluLmNwcCBuY19hbGxvYy5jcHAgcmFuZG9tX251bWJlci5jcHAKKworVEVTVF9MSVNUPXRlc3RfYWxnby5jcHAgIFwKK3Rlc3RfYWxnb2Jhc2UuY3BwICAgICB0ZXN0X2xpc3QuY3BwIHRlc3Rfc2xpc3QuY3BwIFwKK3Rlc3RfYml0X3ZlY3Rvci5jcHAgICB0ZXN0X3ZlY3Rvci5jcHAgXAordGVzdF9kZXF1ZS5jcHAgdGVzdF9zZXQuY3BwIHRlc3RfbWFwLmNwcCBcCit0ZXN0X2hhc2hfbWFwLmNwcCAgdGVzdF9oYXNoX3NldC5jcHAgdGVzdF9yb3BlLmNwcCBcCit0ZXN0X3N0cmluZy5jcHAgdGVzdF9iaXRzZXQuY3BwIHRlc3RfdmFsYXJyYXkuY3BwCisKK0xJU1Q9JHtBVVhfTElTVH0gJHtURVNUX0xJU1R9CisKK09CSkVDVFMgPSAkKExJU1Q6JS5jcHA9b2JqLyUubykgJChTVEFUX01PRFVMRSkKK0RfT0JKRUNUUyA9ICQoTElTVDolLmNwcD1kX29iai8lLm8pICQoU1RBVF9NT0RVTEUpCitOT1NHSV9PQkpFQ1RTID0gJChMSVNUOiUuY3BwPW5vc2dpX29iai8lLm8pICQoU1RBVF9NT0RVTEUpCisKK0VYRUNTID0gJChMSVNUOiUuY3BwPSUpCitURVNUUyA9ICQoTElTVDolLmNwcD0lLm91dCkKK1RFU1RfRVhFICA9IC4vZWhfdGVzdAorRF9URVNUX0VYRSA9IC4vZWhfdGVzdF9kCitOT1NHSV9URVNUX0VYRSA9IC4vZWhfdGVzdF9ub3NnaQorCitURVNUICA9IC4vZWhfdGVzdC5vdXQKK0RfVEVTVCA9IC4vZWhfdGVzdF9kLm91dAorTk9TR0lfVEVTVCA9IC4vZWhfdGVzdF9ub3NnaS5vdXQKKworIyBDQyA9IGcrKyAtcHRocmVhZHMKK0NDID0gZysrIC1EX1JFRU5UUkFOVCAtRF9QT1NJWF9DX1NPVVJDRT0xOTk1MDZMIC1EX19FWFRFTlNJT05TX18KK0NYWCA9ICQoQ0MpCisKKyMgZHdhIDEyLzIyLzk5IC0tIGhhZCB0byB0dXJuIG9mZiAtYW5zaSBmbGFnIHNvIHdlIGNvdWxkIHVzZSBTR0kgSU9TVFJFQU1TCisjIGFsc28sIHRlc3Rfc2xpc3Qgd29uJ3QgY29tcGlsZSB3aXRoIC1PMy8tTzIgd2hlbiB0YXJnZXRpbmcgUFBDLiBJdCBmYWlscyAKKyMgaW4gdGhlIGFzc2VtYmxlciB3aXRoICdpbnZhbGlkIHJlbG9jYXRpb24gdHlwZScKK0NYWEZMQUdTID0gLVdhbGwgLU8gJHtTVExfSU5DTH0gLUkuICR7Q1hYX0VYVFJBX0ZMQUdTfSAtREVIX1ZFQ1RPUl9PUEVSQVRPUl9ORVcKK0RfQ1hYRkxBR1MgPSAtV2FsbCAtZyAtTyAke1NUTF9JTkNMfSAtSS4gJHtDWFhfRVhUUkFfRkxBR1N9IC1ERUhfVkVDVE9SX09QRVJBVE9SX05FVyAtRF9TVExQX0RFQlVHIC1EX1NUTFBfVVNFX1NUQVRJQ19MSUIKK05PU0dJX0NYWEZMQUdTID0gLVdhbGwgLWcgLU8yICR7U1RMX0lOQ0x9IC1JLiAke0NYWF9FWFRSQV9GTEFHU30gLURfU1RMUF9OT19PV05fSU9TVFJFQU1TIC1EX1NUTFBfREVCVUdfVU5JTklUSUFMSVpFRCAtREVIX1ZFQ1RPUl9PUEVSQVRPUl9ORVcKKworY2hlY2s6ICQoVEVTVCkKKworTElCUyA9IC1scHRocmVhZCAtbG0gCitEX0xJQlNUTFBPUlQgPSAtTC4uLy4uL2xpYiAtbHN0bHBvcnRfZ2NjX2RlYnVnCitMSUJTVExQT1JUID0gLUwuLi8uLi9saWIgLWxzdGxwb3J0X2djYworCithbGw6ICQoVEVTVF9FWEUpICQoRF9URVNUX0VYRSkgJChOT1NHSV9URVNUX0VYRSkKKworY2hlY2tfbm9zZ2k6ICQoTk9TR0lfVEVTVCkKK2NoZWNrX2Q6ICQoRF9URVNUKQorCitPQkpESVI9b2JqCitEX09CSkRJUj1kX29iagorTk9TR0lfT0JKRElSPW5vc2dpX29iagorCiskKE9CSkRJUik6CisJbWtkaXIgb2JqCiskKERfT0JKRElSKToKKwlta2RpciBkX29iagorJChOT1NHSV9PQkpESVIpOgorCW1rZGlyIG5vc2dpX29iagorCiskKFRFU1RfRVhFKSA6ICQoT0JKRElSKSAkKE9CSkVDVFMpCisJJChDWFgpICQoQ1hYRkxBR1MpICQoT0JKRUNUUykgJChMSUJTVExQT1JUKSAkKExJQlMpIC1vICQoVEVTVF9FWEUpCisKKyQoRF9URVNUX0VYRSkgOiAkKERfT0JKRElSKSAkKERfT0JKRUNUUykKKwkkKENYWCkgJChEX0NYWEZMQUdTKSAkKERfT0JKRUNUUykgJChEX0xJQlNUTFBPUlQpICQoTElCUykgLW8gJChEX1RFU1RfRVhFKQorCiskKE5PU0dJX1RFU1RfRVhFKSA6ICQoTk9TR0lfT0JKRElSKSAkKE5PU0dJX09CSkVDVFMpCisJJChDWFgpICQoTk9TR0lfQ1hYRkxBR1MpICQoTk9TR0lfT0JKRUNUUykgJChMSUJTKSAtbyAkKE5PU0dJX1RFU1RfRVhFKQorCisKKyQoVEVTVCkgOiAkKFRFU1RfRVhFKQorCUxEX0xJQlJBUllfUEFUSD0iLi4vLi4vbGliOiQoTERfTElCUkFSWV9QQVRIKSIgdGltZSAuLyQoVEVTVF9FWEUpIC1zIDEwMAorCiskKERfVEVTVCkgOiAkKERfVEVTVF9FWEUpCisJTERfTElCUkFSWV9QQVRIPSIuLi8uLi9saWI6JChMRF9MSUJSQVJZX1BBVEgpIiAuLyQoRF9URVNUX0VYRSkgLXMgMTAwCisKKworJChOT1NHSV9URVNUKSA6ICQoTk9TR0lfVEVTVF9FWEUpCisJJChOT1NHSV9URVNUX0VYRSkKKworU1VGRklYRVM6IC5jcHAuby5leGUub3V0LnJlcworCitub3NnaV9vYmovJS5vIDogJS5jcHAKKwkkKENYWCkgJChOT1NHSV9DWFhGTEFHUykgJDwgLWMgLW8gJEAKKworZF9vYmovJS5vIDogJS5jcHAKKwkkKENYWCkgJChEX0NYWEZMQUdTKSAkPCAtYyAtbyAkQAorCitvYmovJS5vIDogJS5jcHAKKwkkKENYWCkgJChDWFhGTEFHUykgJDwgLWMgLW8gJEAKKworbm9zZ2lfb2JqLyUuaSA6ICUuY3BwCisJJChDWFgpICQoTk9TR0lfQ1hYRkxBR1MpICQ8IC1FIC1IID4gJEAKKworZF9vYmovJS5pIDogJS5jcHAKKwkkKENYWCkgJChEX0NYWEZMQUdTKSAkPCAtRSAtSCA+ICRACisKK29iai8lLmkgOiAlLmNwcAorCSQoQ1hYKSAkKENYWEZMQUdTKSAkPCAtRSAtSCA+ICRACisKKyUub3V0OiAlLmNwcAorCSQoQ1hYKSAkKENYWEZMQUdTKSAkPCAtYyAtVVNJTkdMRSAtRE1BSU4gLURfU1RMUF9ERUJVRyAtRF9TVExQX05PX09XTl9JT1NUUkVBTVMgLWcgLW8gJCoubworCSQoQ1hYKSAkKENYWEZMQUdTKSAkKi5vICQoTElCU1RMUE9SVCkgJChMSUJTKSAtbyAkKgorCS4vJCogPiAkQAorIwktcm0gLWYgJCoKKworJS5zOiAlLmNwcAorCSQoQ1hYKSAkKENYWEZMQUdTKSAtTzQgLVMgLXB0byAkPCAgLW8gJEAKKworJS5FOiAlLmNwcAorCSQoQ1hYKSAkKENYWEZMQUdTKSAtRSAkPCAgLW8gJEAKKworY2xlYW46CisJLXJtIC1mciAke1RFU1RfRVhFfSAqLm8gKi8qLm8gKi5ycG8gKi5vYmogKi5vdXQgY29yZSAqfiBUZW1wbGF0ZXMuREIKZGlmZiAtLWdpdCBhL3Rlc3QvZWgvZ2NjLWlyaXgubWFrIGIvdGVzdC9laC9nY2MtaXJpeC5tYWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk2ODhlYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZWgvZ2NjLWlyaXgubWFrCkBAIC0wLDAgKzEsMTIyIEBACisjIDs7OyAtKi0gTW9kZTptYWtlZmlsZTstKi0gCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gTWFrZWZpbGUuaW4gYnkgY29uZmlndXJlLgorIyBUaGlzIHJlcXVpcmVzIEdOVSBtYWtlLgorCitzcmNkaXIgPSAuCitWUEFUSCA9IC4KK1NIRUxMPS9iaW4vc2gKKworIyBwb2ludCB0aGlzIHRvIHByb3BlciBsb2NhdGlvbgorU1RMX0lOQ0w9LUkuLi8uLi9zdGxwb3J0CisKK0FVWF9MSVNUPVRlc3RDbGFzcy5jcHAgbWFpbi5jcHAgbmNfYWxsb2MuY3BwIHJhbmRvbV9udW1iZXIuY3BwCisKK1RFU1RfTElTVD10ZXN0X2FsZ28uY3BwICBcCit0ZXN0X2FsZ29iYXNlLmNwcCAgICAgdGVzdF9saXN0LmNwcCB0ZXN0X3NsaXN0LmNwcCBcCit0ZXN0X2JpdF92ZWN0b3IuY3BwICAgdGVzdF92ZWN0b3IuY3BwIFwKK3Rlc3RfZGVxdWUuY3BwIHRlc3Rfc2V0LmNwcCB0ZXN0X21hcC5jcHAgXAordGVzdF9oYXNoX21hcC5jcHAgIHRlc3RfaGFzaF9zZXQuY3BwIHRlc3Rfcm9wZS5jcHAgXAordGVzdF9zdHJpbmcuY3BwIHRlc3RfYml0c2V0LmNwcCB0ZXN0X3ZhbGFycmF5LmNwcAorCitMSVNUPSR7QVVYX0xJU1R9ICR7VEVTVF9MSVNUfQorCitPQkpFQ1RTID0gJChMSVNUOiUuY3BwPW9iai8lLm8pICQoU1RBVF9NT0RVTEUpCitEX09CSkVDVFMgPSAkKExJU1Q6JS5jcHA9ZF9vYmovJS5vKSAkKFNUQVRfTU9EVUxFKQorTk9TR0lfT0JKRUNUUyA9ICQoTElTVDolLmNwcD1ub3NnaV9vYmovJS5vKSAkKFNUQVRfTU9EVUxFKQorCitFWEVDUyA9ICQoTElTVDolLmNwcD0lKQorVEVTVFMgPSAkKExJU1Q6JS5jcHA9JS5vdXQpCitURVNUX0VYRSAgPSAuL2VoX3Rlc3QKK0RfVEVTVF9FWEUgPSAuL2VoX3Rlc3RfZAorTk9TR0lfVEVTVF9FWEUgPSAuL2VoX3Rlc3Rfbm9zZ2kKKworVEVTVCAgPSAuL2VoX3Rlc3Qub3V0CitEX1RFU1QgPSAuL2VoX3Rlc3RfZC5vdXQKK05PU0dJX1RFU1QgPSAuL2VoX3Rlc3Rfbm9zZ2kub3V0CisKK0NDID0gZysrCitDWFggPSAkKENDKQorCisjIGR3YSAxMi8yMi85OSAtLSBoYWQgdG8gdHVybiBvZmYgLWFuc2kgZmxhZyBzbyB3ZSBjb3VsZCB1c2UgU0dJIElPU1RSRUFNUworIyBhbHNvLCB0ZXN0X3NsaXN0IHdvbid0IGNvbXBpbGUgd2l0aCAtTzMvLU8yIHdoZW4gdGFyZ2V0aW5nIFBQQy4gSXQgZmFpbHMgCisjIGluIHRoZSBhc3NlbWJsZXIgd2l0aCAnaW52YWxpZCByZWxvY2F0aW9uIHR5cGUnCitDWFhGTEFHUyA9IC1XYWxsIC1PICR7U1RMX0lOQ0x9IC1JLiAke0NYWF9FWFRSQV9GTEFHU30gLURFSF9WRUNUT1JfT1BFUkFUT1JfTkVXCitEX0NYWEZMQUdTID0gLVdhbGwgLWcgLU8gJHtTVExfSU5DTH0gLUkuICR7Q1hYX0VYVFJBX0ZMQUdTfSAtREVIX1ZFQ1RPUl9PUEVSQVRPUl9ORVcgLURfU1RMUF9ERUJVRyAtRF9TVExQX1VTRV9TVEFUSUNfTElCCitOT1NHSV9DWFhGTEFHUyA9IC1XYWxsIC1nIC1PMiAke1NUTF9JTkNMfSAtSS4gJHtDWFhfRVhUUkFfRkxBR1N9IC1EX1NUTFBfTk9fT1dOX0lPU1RSRUFNUyAtRF9TVExQX0RFQlVHX1VOSU5JVElBTElaRUQgLURFSF9WRUNUT1JfT1BFUkFUT1JfTkVXCisKK2NoZWNrOiAkKFRFU1QpCisKK0xJQlMgPSAtbG0gCitEX0xJQlNUTFBPUlQgPSAtTC4uLy4uL2xpYiAtbHN0bHBvcnRfZ2NjX2RlYnVnCitMSUJTVExQT1JUID0gLUwuLi8uLi9saWIgLWxzdGxwb3J0X2djYworCithbGw6ICQoVEVTVF9FWEUpICQoRF9URVNUX0VYRSkgJChOT1NHSV9URVNUX0VYRSkKKworY2hlY2tfbm9zZ2k6ICQoTk9TR0lfVEVTVCkKK2NoZWNrX2Q6ICQoRF9URVNUKQorCisKK09CSkRJUj1vYmoKK0RfT0JKRElSPWRfb2JqCitOT1NHSV9PQkpESVI9bm9zZ2lfb2JqCisKKyQoT0JKRElSKToKKwlta2RpciBvYmoKKyQoRF9PQkpESVIpOgorCW1rZGlyIG9iagorJChOT1NHSV9PQkpESVIpOgorCW1rZGlyIG9iagorCiskKFRFU1RfRVhFKSA6ICQoT0JKRElSKSAkKE9CSkVDVFMpCisJJChDWFgpICQoQ1hYRkxBR1MpICQoT0JKRUNUUykgJChMSUJTVExQT1JUKSAkKExJQlMpIC1vICQoVEVTVF9FWEUpCisKKyQoRF9URVNUX0VYRSkgOiAkKERfT0JKRElSKSAkKERfT0JKRUNUUykKKwkkKENYWCkgJChEX0NYWEZMQUdTKSAkKERfT0JKRUNUUykgJChEX0xJQlNUTFBPUlQpICQoTElCUykgLW8gJChEX1RFU1RfRVhFKQorCiskKE5PU0dJX1RFU1RfRVhFKSA6ICQoTk9TR0lfT0JKRElSKSAkKE5PU0dJX09CSkVDVFMpCisJJChDWFgpICQoTk9TR0lfQ1hYRkxBR1MpICQoTk9TR0lfT0JKRUNUUykgJChMSUJTKSAtbyAkKE5PU0dJX1RFU1RfRVhFKQorCiskKFRFU1QpIDogJChURVNUX0VYRSkKKwlMRF9MSUJSQVJZX1BBVEg9Ii4uLy4uL2xpYjokKExEX0xJQlJBUllfUEFUSCkiIHRpbWUgLi8kKFRFU1RfRVhFKSAtcyAxMDAKKworJChEX1RFU1QpIDogJChEX1RFU1RfRVhFKQorCUxEX0xJQlJBUllfUEFUSD0iLi4vLi4vbGliOiQoTERfTElCUkFSWV9QQVRIKSIgLi8kKERfVEVTVF9FWEUpIC1zIDEwMAorCisKKyQoTk9TR0lfVEVTVCkgOiAkKE5PU0dJX1RFU1RfRVhFKQorCSQoTk9TR0lfVEVTVF9FWEUpCisKK1NVRkZJWEVTOiAuY3BwLm8uZXhlLm91dC5yZXMKKworbm9zZ2lfb2JqLyUubyA6ICUuY3BwCisJJChDWFgpICQoTk9TR0lfQ1hYRkxBR1MpICQ8IC1jIC1vICRACisKK2Rfb2JqLyUubyA6ICUuY3BwCisJJChDWFgpICQoRF9DWFhGTEFHUykgJDwgLWMgLW8gJEAKKworb2JqLyUubyA6ICUuY3BwCisJJChDWFgpICQoQ1hYRkxBR1MpICQ8IC1jIC1vICRACisKK25vc2dpX29iai8lLmkgOiAlLmNwcAorCSQoQ1hYKSAkKE5PU0dJX0NYWEZMQUdTKSAkPCAtRSAtSCA+ICRACisKK2Rfb2JqLyUuaSA6ICUuY3BwCisJJChDWFgpICQoRF9DWFhGTEFHUykgJDwgLUUgLUggPiAkQAorCitvYmovJS5pIDogJS5jcHAKKwkkKENYWCkgJChDWFhGTEFHUykgJDwgLUUgLUggPiAkQAorCislLm91dDogJS5jcHAKKwkkKENYWCkgJChDWFhGTEFHUykgJDwgLWMgLVVTSU5HTEUgLURNQUlOIC1EX1NUTFBfREVCVUcgLURfU1RMUF9OT19PV05fSU9TVFJFQU1TIC1nIC1vICQqLm8KKwkkKENYWCkgJChDWFhGTEFHUykgJCoubyAkKExJQlNUTFBPUlQpICQoTElCUykgLW8gJCoKKwkuLyQqID4gJEAKKyMJLXJtIC1mICQqCisKKyUuczogJS5jcHAKKwkkKENYWCkgJChDWFhGTEFHUykgLU80IC1TIC1wdG8gJDwgLW8gJEAKKworJS5FOiAlLmNwcAorCSQoQ1hYKSAkKENYWEZMQUdTKSAtRSAkPCAtbyAkQAorCitjbGVhbjoKKwktcm0gLWZyICR7VEVTVF9FWEV9ICoubyAqLyoubyAqLnJwbyAqLm9iaiAqLm91dCBjb3JlICp+IFRlbXBsYXRlcy5EQgpkaWZmIC0tZ2l0IGEvdGVzdC9laC9nY2MtbGludXgubWFrIGIvdGVzdC9laC9nY2MtbGludXgubWFrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NjZkMzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2VoL2djYy1saW51eC5tYWsKQEAgLTAsMCArMSwxMjAgQEAKKyMgOzs7IC0qLSBNb2RlOm1ha2VmaWxlOy0qLSAKKyMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBNYWtlZmlsZS5pbiBieSBjb25maWd1cmUuCisjIFRoaXMgcmVxdWlyZXMgR05VIG1ha2UuCitTSEVMTD0vYmluL3NoCisKK3NyY2RpciA9IC4KK1ZQQVRIID0gLgorCisjIHBvaW50IHRoaXMgdG8gcHJvcGVyIGxvY2F0aW9uCitTVExfSU5DTD0tSS4uLy4uL3N0bHBvcnQKKworQVVYX0xJU1Q9VGVzdENsYXNzLmNwcCBtYWluLmNwcCBuY19hbGxvYy5jcHAgcmFuZG9tX251bWJlci5jcHAKKworVEVTVF9MSVNUPXRlc3RfYWxnby5jcHAgIFwKK3Rlc3RfYWxnb2Jhc2UuY3BwICAgICB0ZXN0X2xpc3QuY3BwIHRlc3Rfc2xpc3QuY3BwIFwKK3Rlc3RfYml0X3ZlY3Rvci5jcHAgICB0ZXN0X3ZlY3Rvci5jcHAgXAordGVzdF9kZXF1ZS5jcHAgdGVzdF9zZXQuY3BwIHRlc3RfbWFwLmNwcCBcCit0ZXN0X2hhc2hfbWFwLmNwcCAgdGVzdF9oYXNoX3NldC5jcHAgdGVzdF9yb3BlLmNwcCBcCit0ZXN0X3N0cmluZy5jcHAgdGVzdF9iaXRzZXQuY3BwIHRlc3RfdmFsYXJyYXkuY3BwCisKK0xJU1Q9JHtBVVhfTElTVH0gJHtURVNUX0xJU1R9CisKK09CSkVDVFMgPSAkKExJU1Q6JS5jcHA9b2JqLyUubykgJChTVEFUX01PRFVMRSkKK0RfT0JKRUNUUyA9ICQoTElTVDolLmNwcD1kX29iai8lLm8pICQoU1RBVF9NT0RVTEUpCitOT1NHSV9PQkpFQ1RTID0gJChMSVNUOiUuY3BwPW5vc2dpX29iai8lLm8pICQoU1RBVF9NT0RVTEUpCisKK0VYRUNTID0gJChMSVNUOiUuY3BwPSUpCitURVNUUyA9ICQoTElTVDolLmNwcD0lLm91dCkKK1RFU1RfRVhFICA9IC4vZWhfdGVzdAorRF9URVNUX0VYRSA9IC4vZWhfdGVzdF9kCitOT1NHSV9URVNUX0VYRSA9IC4vZWhfdGVzdF9ub3NnaQorCitURVNUICA9IC4vZWhfdGVzdC5vdXQKK0RfVEVTVCA9IC4vZWhfdGVzdF9kLm91dAorTk9TR0lfVEVTVCA9IC4vZWhfdGVzdF9ub3NnaS5vdXQKKworQ0MgPSBjKysgLXB0aHJlYWQKK0NYWCA9ICQoQ0MpCisKKyMgZHdhIDEyLzIyLzk5IC0tIGhhZCB0byB0dXJuIG9mZiAtYW5zaSBmbGFnIHNvIHdlIGNvdWxkIHVzZSBTR0kgSU9TVFJFQU1TCisjIGFsc28sIHRlc3Rfc2xpc3Qgd29uJ3QgY29tcGlsZSB3aXRoIC1PMy8tTzIgd2hlbiB0YXJnZXRpbmcgUFBDLiBJdCBmYWlscyAKKyMgaW4gdGhlIGFzc2VtYmxlciB3aXRoICdpbnZhbGlkIHJlbG9jYXRpb24gdHlwZScKK0NYWEZMQUdTID0gLVdhbGwgJHtTVExfSU5DTH0gLUkuICR7Q1hYX0VYVFJBX0ZMQUdTfSAtREVIX1ZFQ1RPUl9PUEVSQVRPUl9ORVcKK0RfQ1hYRkxBR1MgPSAtV2FsbCAtZyAke1NUTF9JTkNMfSAtSS4gJHtDWFhfRVhUUkFfRkxBR1N9IC1ERUhfVkVDVE9SX09QRVJBVE9SX05FVyAtRF9TVExQX0RFQlVHIC1EX1NUTFBfVVNFX1NUQVRJQ19MSUIKK05PU0dJX0NYWEZMQUdTID0gLVdhbGwgLWcgLU8yICR7U1RMX0lOQ0x9IC1JLiAke0NYWF9FWFRSQV9GTEFHU30gLURfU1RMUF9OT19PV05fSU9TVFJFQU1TIC1EX1NUTFBfREVCVUdfVU5JTklUSUFMSVpFRCAtREVIX1ZFQ1RPUl9PUEVSQVRPUl9ORVcKKworY2hlY2s6ICQoVEVTVCkKKworTElCUyA9IC1sbSAKK0RfTElCU1RMUE9SVCA9IC1MLi4vLi4vbGliIC1sc3RscG9ydF9nY2Nfc3RsZGVidWcKK0xJQlNUTFBPUlQgPSAtTC4uLy4uL2xpYiAtbHN0bHBvcnRfZ2NjCisKK2FsbDogJChURVNUX0VYRSkgJChEX1RFU1RfRVhFKSAkKE5PU0dJX1RFU1RfRVhFKQorCitjaGVja19ub3NnaTogJChOT1NHSV9URVNUKQorY2hlY2tfZDogJChEX1RFU1QpCisKK09CSkRJUj1vYmoKK0RfT0JKRElSPWRfb2JqCitOT1NHSV9PQkpESVI9bm9zZ2lfb2JqCisKKyQoT0JKRElSKToKKwlta2RpciBvYmoKKyQoRF9PQkpESVIpOgorCW1rZGlyIGRfb2JqCiskKE5PU0dJX09CSkRJUik6CisJbWtkaXIgbm9zZ2lfb2JqCisKKyQoVEVTVF9FWEUpIDogJChPQkpESVIpICQoT0JKRUNUUykgCisJJChDWFgpICQoQ1hYRkxBR1MpICQoT0JKRUNUUykgJChMSUJTVExQT1JUKSAkKExJQlMpIC1vICQoVEVTVF9FWEUpCisKKyQoRF9URVNUX0VYRSkgOiAkKERfT0JKRElSKSAkKERfT0JKRUNUUykKKwkkKENYWCkgJChEX0NYWEZMQUdTKSAkKERfT0JKRUNUUykgJChEX0xJQlNUTFBPUlQpICQoTElCUykgLW8gJChEX1RFU1RfRVhFKQorCiskKE5PU0dJX1RFU1RfRVhFKSA6ICQoTk9TR0lfT0JKRElSKSAkKE5PU0dJX09CSkVDVFMpCisJJChDWFgpICQoTk9TR0lfQ1hYRkxBR1MpICQoTk9TR0lfT0JKRUNUUykgJChMSUJTKSAtbyAkKE5PU0dJX1RFU1RfRVhFKQorCiskKFRFU1QpIDogJChURVNUX0VYRSkKKwlMRF9MSUJSQVJZX1BBVEg9Ii4uLy4uL2xpYjokKExEX0xJQlJBUllfUEFUSCkiIC4vJChURVNUX0VYRSkgLXMgMTAwCisKKyQoRF9URVNUKSA6ICQoRF9URVNUX0VYRSkKKwlMRF9MSUJSQVJZX1BBVEg9Ii4uLy4uL2xpYjokKExEX0xJQlJBUllfUEFUSCkiIC4vJChEX1RFU1RfRVhFKSAtcyAxMDAKKworJChOT1NHSV9URVNUKSA6ICQoTk9TR0lfVEVTVF9FWEUpCisJJChOT1NHSV9URVNUX0VYRSkKKworU1VGRklYRVM6IC5jcHAuby5leGUub3V0LnJlcworCitub3NnaV9vYmovJS5vIDogJS5jcHAKKwkkKENYWCkgJChOT1NHSV9DWFhGTEFHUykgJDwgLWMgLW8gJEAKKworZF9vYmovJS5vIDogJS5jcHAKKwkkKENYWCkgJChEX0NYWEZMQUdTKSAkPCAtYyAtbyAkQAorCitvYmovJS5vIDogJS5jcHAKKwkkKENYWCkgJChDWFhGTEFHUykgJDwgLWMgLW8gJEAKKworbm9zZ2lfb2JqLyUuaSA6ICUuY3BwCisJJChDWFgpICQoTk9TR0lfQ1hYRkxBR1MpICQ8IC1FIC1IID4gJEAKKworZF9vYmovJS5pIDogJS5jcHAKKwkkKENYWCkgJChEX0NYWEZMQUdTKSAkPCAtRSAtSCA+ICRACisKK29iai8lLmkgOiAlLmNwcAorCSQoQ1hYKSAkKENYWEZMQUdTKSAkPCAtRSAtSCA+ICRACisKKyUub3V0OiAlLmNwcAorCSQoQ1hYKSAkKERfQ1hYRkxBR1MpICQ8IC1jIC1VU0lOR0xFIC1ETUFJTiAtbyAkKi5vCisJJChDWFgpICQoRF9DWFhGTEFHUykgJCoubyAkKExJQlMpICQoRF9MSUJTVExQT1JUKSAgLW8gJCoKKwkuLyQqID4gJEAKKyMJLXJtIC1mICQqCisKKyUuczogJS5jcHAKKwkkKENYWCkgJChDWFhGTEFHUykgLU80IC1TIC1wdG8gJDwgIC1vICRACisKKyUuRTogJS5jcHAKKwkkKENYWCkgJChDWFhGTEFHUykgLUUgJDwgIC1vICRACisKK2NsZWFuOgorCS1ybSAtZnIgJHtURVNUX0VYRX0gKi5vICovKi5vICoucnBvICoub2JqICoub3V0IGNvcmUgKn4gVGVtcGxhdGVzLkRCCmRpZmYgLS1naXQgYS90ZXN0L2VoL2djYy1uZXRic2QubWFrIGIvdGVzdC9laC9nY2MtbmV0YnNkLm1hawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Zjk1MDRlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9laC9nY2MtbmV0YnNkLm1hawpAQCAtMCwwICsxLDEyMiBAQAorIyA7OzsgLSotIE1vZGU6bWFrZWZpbGU7LSotIAorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIE1ha2VmaWxlLmluIGJ5IGNvbmZpZ3VyZS4KKyMgVGhpcyByZXF1aXJlcyBHTlUgbWFrZS4KKworc3JjZGlyID0gLgorVlBBVEggPSAuCitTSEVMTD0vYmluL3NoCisKKyMgcG9pbnQgdGhpcyB0byBwcm9wZXIgbG9jYXRpb24KK1NUTF9JTkNMPS1JLi4vLi4vc3RscG9ydAorCitBVVhfTElTVD1UZXN0Q2xhc3MuY3BwIG1haW4uY3BwIG5jX2FsbG9jLmNwcCByYW5kb21fbnVtYmVyLmNwcAorCitURVNUX0xJU1Q9dGVzdF9hbGdvLmNwcCAgXAordGVzdF9hbGdvYmFzZS5jcHAgICAgIHRlc3RfbGlzdC5jcHAgdGVzdF9zbGlzdC5jcHAgXAordGVzdF9iaXRfdmVjdG9yLmNwcCAgIHRlc3RfdmVjdG9yLmNwcCBcCit0ZXN0X2RlcXVlLmNwcCB0ZXN0X3NldC5jcHAgdGVzdF9tYXAuY3BwIFwKK3Rlc3RfaGFzaF9tYXAuY3BwICB0ZXN0X2hhc2hfc2V0LmNwcCB0ZXN0X3JvcGUuY3BwIFwKK3Rlc3Rfc3RyaW5nLmNwcCB0ZXN0X2JpdHNldC5jcHAgdGVzdF92YWxhcnJheS5jcHAKKworTElTVD0ke0FVWF9MSVNUfSAke1RFU1RfTElTVH0KKworT0JKRUNUUyA9ICQoTElTVDolLmNwcD1vYmovJS5vKSAkKFNUQVRfTU9EVUxFKQorRF9PQkpFQ1RTID0gJChMSVNUOiUuY3BwPWRfb2JqLyUubykgJChTVEFUX01PRFVMRSkKK05PU0dJX09CSkVDVFMgPSAkKExJU1Q6JS5jcHA9bm9zZ2lfb2JqLyUubykgJChTVEFUX01PRFVMRSkKKworRVhFQ1MgPSAkKExJU1Q6JS5jcHA9JSkKK1RFU1RTID0gJChMSVNUOiUuY3BwPSUub3V0KQorVEVTVF9FWEUgID0gLi9laF90ZXN0CitEX1RFU1RfRVhFID0gLi9laF90ZXN0X2QKK05PU0dJX1RFU1RfRVhFID0gLi9laF90ZXN0X25vc2dpCisKK1RFU1QgID0gLi9laF90ZXN0Lm91dAorRF9URVNUID0gLi9laF90ZXN0X2Qub3V0CitOT1NHSV9URVNUID0gLi9laF90ZXN0X25vc2dpLm91dAorCitDQyA9IGMrKyAKK0NYWCA9ICQoQ0MpCisKKyMgZHdhIDEyLzIyLzk5IC0tIGhhZCB0byB0dXJuIG9mZiAtYW5zaSBmbGFnIHNvIHdlIGNvdWxkIHVzZSBTR0kgSU9TVFJFQU1TCisjIGFsc28sIHRlc3Rfc2xpc3Qgd29uJ3QgY29tcGlsZSB3aXRoIC1PMy8tTzIgd2hlbiB0YXJnZXRpbmcgUFBDLiBJdCBmYWlscyAKKyMgaW4gdGhlIGFzc2VtYmxlciB3aXRoICdpbnZhbGlkIHJlbG9jYXRpb24gdHlwZScKK0NYWEZMQUdTID0gLVdhbGwgLWcgLU8gJHtTVExfSU5DTH0gLUkuICR7Q1hYX0VYVFJBX0ZMQUdTfSAtREVIX1ZFQ1RPUl9PUEVSQVRPUl9ORVcKK0RfQ1hYRkxBR1MgPSAtV2FsbCAtZyAtTyAke1NUTF9JTkNMfSAtSS4gJHtDWFhfRVhUUkFfRkxBR1N9IC1ERUhfVkVDVE9SX09QRVJBVE9SX05FVyAtRF9TVExQX0RFQlVHIC1EX1NUTFBfVVNFX1NUQVRJQ19MSUIKK05PU0dJX0NYWEZMQUdTID0gLVdhbGwgLWcgLU8yICR7U1RMX0lOQ0x9IC1JLiAke0NYWF9FWFRSQV9GTEFHU30gLURfU1RMUF9OT19PV05fSU9TVFJFQU1TIC1EX1NUTFBfREVCVUdfVU5JTklUSUFMSVpFRCAtREVIX1ZFQ1RPUl9PUEVSQVRPUl9ORVcKKworY2hlY2s6ICQoVEVTVCkKKworTElCUyA9IC1sbSAtbHB0aHJlYWQKK0RfTElCU1RMUE9SVCA9IC1MLi4vLi4vbGliIC1SLi4vLi4vbGliIC1sc3RscG9ydF9nY2Nfc3RsZGVidWcKK0xJQlNUTFBPUlQgPSAtTC4uLy4uL2xpYiAtUi4uLy4uL2xpYiAtbHN0bHBvcnRfZ2NjCisKK2FsbDogJChURVNUX0VYRSkgJChEX1RFU1RfRVhFKSAkKE5PU0dJX1RFU1RfRVhFKQorCitjaGVja19ub3NnaTogJChOT1NHSV9URVNUKQorY2hlY2tfZDogJChEX1RFU1QpCisKK09CSkRJUj1vYmoKK0RfT0JKRElSPWRfb2JqCitOT1NHSV9PQkpESVI9bm9zZ2lfb2JqCisKKyQoT0JKRElSKToKKwlta2RpciBvYmoKKyQoRF9PQkpESVIpOgorCW1rZGlyIGRfb2JqCiskKE5PU0dJX09CSkRJUik6CisJbWtkaXIgbm9zZ2lfb2JqCisKKyQoVEVTVF9FWEUpIDogJChPQkpESVIpICQoT0JKRUNUUykKKwkkKENYWCkgJChDWFhGTEFHUykgJChPQkpFQ1RTKSAkKExJQlNUTFBPUlQpICQoTElCUykgLW8gJChURVNUX0VYRSkKKworJChEX1RFU1RfRVhFKSA6ICQoRF9PQkpESVIpICQoRF9PQkpFQ1RTKQorCSQoQ1hYKSAkKERfQ1hYRkxBR1MpICQoRF9PQkpFQ1RTKSAkKERfTElCU1RMUE9SVCkgJChMSUJTKSAtbyAkKERfVEVTVF9FWEUpCisKKyQoTk9TR0lfVEVTVF9FWEUpIDogJChOT1NHSV9PQkpESVIpICQoTk9TR0lfT0JKRUNUUykKKwkkKENYWCkgJChOT1NHSV9DWFhGTEFHUykgJChOT1NHSV9PQkpFQ1RTKSAkKExJQlMpIC1vICQoTk9TR0lfVEVTVF9FWEUpCisKKworJChURVNUKSA6ICQoVEVTVF9FWEUpCisJTERfTElCUkFSWV9QQVRIPSIuLi8uLi9saWI6JChMRF9MSUJSQVJZX1BBVEgpIiAuLyQoVEVTVF9FWEUpIC1zIDEwMAorCiskKERfVEVTVCkgOiAkKERfVEVTVF9FWEUpCisJTERfTElCUkFSWV9QQVRIPSIuLi8uLi9saWI6JChMRF9MSUJSQVJZX1BBVEgpIiAuLyQoRF9URVNUX0VYRSkgLXMgMTAwCisKKworJChOT1NHSV9URVNUKSA6ICQoTk9TR0lfVEVTVF9FWEUpCisJJChOT1NHSV9URVNUX0VYRSkKKworU1VGRklYRVM6IC5jcHAuby5leGUub3V0LnJlcworCitub3NnaV9vYmovJS5vIDogJS5jcHAKKwkkKENYWCkgJChOT1NHSV9DWFhGTEFHUykgJDwgLWMgLW8gJEAKKworZF9vYmovJS5vIDogJS5jcHAKKwkkKENYWCkgJChEX0NYWEZMQUdTKSAkPCAtYyAtbyAkQAorCitvYmovJS5vIDogJS5jcHAKKwkkKENYWCkgJChDWFhGTEFHUykgJDwgLWMgLW8gJEAKKworbm9zZ2lfb2JqLyUuaSA6ICUuY3BwCisJJChDWFgpICQoTk9TR0lfQ1hYRkxBR1MpICQ8IC1FIC1IID4gJEAKKworZF9vYmovJS5pIDogJS5jcHAKKwkkKENYWCkgJChEX0NYWEZMQUdTKSAkPCAtRSAtSCA+ICRACisKK29iai8lLmkgOiAlLmNwcAorCSQoQ1hYKSAkKENYWEZMQUdTKSAkPCAtRSAtSCA+ICRACisKKyUub3V0OiAlLmNwcAorCSQoQ1hYKSAkKENYWEZMQUdTKSAkPCAtYyAtVVNJTkdMRSAtRE1BSU4gLWcgLW8gJCoubworCSQoQ1hYKSAkKENYWEZMQUdTKSAkKi5vICQoTElCUykgLW8gJCoKKwkuLyQqID4gJEAKKwktcm0gLWYgJCoKKworJS5zOiAlLmNwcAorCSQoQ1hYKSAkKENYWEZMQUdTKSAtTzQgLVMgLXB0byAkPCAgLW8gJEAKKworJS5FOiAlLmNwcAorCSQoQ1hYKSAkKENYWEZMQUdTKSAtRSAkPCAgLW8gJEAKKworY2xlYW46CisJLXJtIC1mciAke1RFU1RfRVhFfSAqLm8gKi8qLm8gKi5ycG8gKi5vYmogKi5vdXQgY29yZSAqfiBUZW1wbGF0ZXMuREIKZGlmZiAtLWdpdCBhL3Rlc3QvZWgvZ2NjLm1hayBiL3Rlc3QvZWgvZ2NjLm1hawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTBjNTBhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9laC9nY2MubWFrCkBAIC0wLDAgKzEsMTIyIEBACisjIDs7OyAtKi0gTW9kZTptYWtlZmlsZTstKi0gCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gTWFrZWZpbGUuaW4gYnkgY29uZmlndXJlLgorIyBUaGlzIHJlcXVpcmVzIEdOVSBtYWtlLgorCitzcmNkaXIgPSAuCitWUEFUSCA9IC4KK1NIRUxMPS9iaW4vc2gKKworIyBwb2ludCB0aGlzIHRvIHByb3BlciBsb2NhdGlvbgorU1RMX0lOQ0w9LUkuLi8uLi9zdGxwb3J0CisKK0FVWF9MSVNUPVRlc3RDbGFzcy5jcHAgbWFpbi5jcHAgbmNfYWxsb2MuY3BwIHJhbmRvbV9udW1iZXIuY3BwCisKK1RFU1RfTElTVD10ZXN0X2FsZ28uY3BwICBcCit0ZXN0X2FsZ29iYXNlLmNwcCAgICAgdGVzdF9saXN0LmNwcCB0ZXN0X3NsaXN0LmNwcCBcCit0ZXN0X2JpdF92ZWN0b3IuY3BwICAgdGVzdF92ZWN0b3IuY3BwIFwKK3Rlc3RfZGVxdWUuY3BwIHRlc3Rfc2V0LmNwcCB0ZXN0X21hcC5jcHAgXAordGVzdF9oYXNoX21hcC5jcHAgIHRlc3RfaGFzaF9zZXQuY3BwIHRlc3Rfcm9wZS5jcHAgXAordGVzdF9zdHJpbmcuY3BwIHRlc3RfYml0c2V0LmNwcCB0ZXN0X3ZhbGFycmF5LmNwcAorCitMSVNUPSR7QVVYX0xJU1R9ICR7VEVTVF9MSVNUfQorCitPQkpFQ1RTID0gJChMSVNUOiUuY3BwPW9iai8lLm8pICQoU1RBVF9NT0RVTEUpCitEX09CSkVDVFMgPSAkKExJU1Q6JS5jcHA9ZF9vYmovJS5vKSAkKFNUQVRfTU9EVUxFKQorTk9TR0lfT0JKRUNUUyA9ICQoTElTVDolLmNwcD1ub3NnaV9vYmovJS5vKSAkKFNUQVRfTU9EVUxFKQorCitFWEVDUyA9ICQoTElTVDolLmNwcD0lKQorVEVTVFMgPSAkKExJU1Q6JS5jcHA9JS5vdXQpCitURVNUX0VYRSAgPSAuL2VoX3Rlc3QKK0RfVEVTVF9FWEUgPSAuL2VoX3Rlc3RfZAorTk9TR0lfVEVTVF9FWEUgPSAuL2VoX3Rlc3Rfbm9zZ2kKKworVEVTVCAgPSAuL2VoX3Rlc3Qub3V0CitEX1RFU1QgPSAuL2VoX3Rlc3RfZC5vdXQKK05PU0dJX1RFU1QgPSAuL2VoX3Rlc3Rfbm9zZ2kub3V0CisKK0NDID0gZysrIC1wdGhyZWFkCitDWFggPSAkKENDKQorCisjIGR3YSAxMi8yMi85OSAtLSBoYWQgdG8gdHVybiBvZmYgLWFuc2kgZmxhZyBzbyB3ZSBjb3VsZCB1c2UgU0dJIElPU1RSRUFNUworIyBhbHNvLCB0ZXN0X3NsaXN0IHdvbid0IGNvbXBpbGUgd2l0aCAtTzMvLU8yIHdoZW4gdGFyZ2V0aW5nIFBQQy4gSXQgZmFpbHMgCisjIGluIHRoZSBhc3NlbWJsZXIgd2l0aCAnaW52YWxpZCByZWxvY2F0aW9uIHR5cGUnCitDWFhGTEFHUyA9IC1XYWxsIC1PICR7U1RMX0lOQ0x9IC1JLiAke0NYWF9FWFRSQV9GTEFHU30gLURFSF9WRUNUT1JfT1BFUkFUT1JfTkVXCitEX0NYWEZMQUdTID0gLVdhbGwgLWcgLU8gJHtTVExfSU5DTH0gLUkuICR7Q1hYX0VYVFJBX0ZMQUdTfSAtREVIX1ZFQ1RPUl9PUEVSQVRPUl9ORVcgLURfU1RMUF9ERUJVRyAtRF9TVExQX1VTRV9TVEFUSUNfTElCCitOT1NHSV9DWFhGTEFHUyA9IC1XYWxsIC1nIC1PMiAke1NUTF9JTkNMfSAtSS4gJHtDWFhfRVhUUkFfRkxBR1N9IC1EX1NUTFBfTk9fT1dOX0lPU1RSRUFNUyAtRF9TVExQX0RFQlVHX1VOSU5JVElBTElaRUQgLURFSF9WRUNUT1JfT1BFUkFUT1JfTkVXCisKK2NoZWNrOiAkKFRFU1QpCisKK0xJQlMgPSAtbG0gCitEX0xJQlNUTFBPUlQgPSAtTC4uLy4uL2xpYiAtbHN0bHBvcnRfZ2NjX2RlYnVnCitMSUJTVExQT1JUID0gLUwuLi8uLi9saWIgLWxzdGxwb3J0X2djYworCithbGw6ICQoVEVTVF9FWEUpICQoRF9URVNUX0VYRSkgJChOT1NHSV9URVNUX0VYRSkKKworY2hlY2tfbm9zZ2k6ICQoTk9TR0lfVEVTVCkKK2NoZWNrX2Q6ICQoRF9URVNUKQorCisKK09CSkRJUj1vYmoKK0RfT0JKRElSPWRfb2JqCitOT1NHSV9PQkpESVI9bm9zZ2lfb2JqCisKKyQoT0JKRElSKToKKwlta2RpciBvYmoKKyQoRF9PQkpESVIpOgorCW1rZGlyIGRfb2JqCiskKE5PU0dJX09CSkRJUik6CisJbWtkaXIgbm9zZ2lfb2JqCisKKyQoVEVTVF9FWEUpIDogJChPQkpESVIpICQoT0JKRUNUUykKKwkkKENYWCkgJChDWFhGTEFHUykgJChPQkpFQ1RTKSAkKExJQlNUTFBPUlQpICQoTElCUykgLW8gJChURVNUX0VYRSkKKworJChEX1RFU1RfRVhFKSA6ICQoRF9PQkpESVIpICQoRF9PQkpFQ1RTKQorCSQoQ1hYKSAkKERfQ1hYRkxBR1MpICQoRF9PQkpFQ1RTKSAkKERfTElCU1RMUE9SVCkgJChMSUJTKSAtbyAkKERfVEVTVF9FWEUpCisKKyQoTk9TR0lfVEVTVF9FWEUpIDogJChOT1NHSV9PQkpESVIpICQoTk9TR0lfT0JKRUNUUykKKwkkKENYWCkgJChOT1NHSV9DWFhGTEFHUykgJChOT1NHSV9PQkpFQ1RTKSAkKExJQlMpIC1vICQoTk9TR0lfVEVTVF9FWEUpCisKKyQoVEVTVCkgOiAkKFRFU1RfRVhFKQorCUxEX0xJQlJBUllfUEFUSD0iLi4vLi4vbGliOiQoTERfTElCUkFSWV9QQVRIKSIgdGltZSAuLyQoVEVTVF9FWEUpIC1zIDEwMAorCiskKERfVEVTVCkgOiAkKERfVEVTVF9FWEUpCisJTERfTElCUkFSWV9QQVRIPSIuLi8uLi9saWI6JChMRF9MSUJSQVJZX1BBVEgpIiAuLyQoRF9URVNUX0VYRSkgLXMgMTAwCisKKworJChOT1NHSV9URVNUKSA6ICQoTk9TR0lfVEVTVF9FWEUpCisJJChOT1NHSV9URVNUX0VYRSkKKworU1VGRklYRVM6IC5jcHAuby5leGUub3V0LnJlcworCitub3NnaV9vYmovJS5vIDogJS5jcHAKKwkkKENYWCkgJChOT1NHSV9DWFhGTEFHUykgJDwgLWMgLW8gJEAKKworZF9vYmovJS5vIDogJS5jcHAKKwkkKENYWCkgJChEX0NYWEZMQUdTKSAkPCAtYyAtbyAkQAorCitvYmovJS5vIDogJS5jcHAKKwkkKENYWCkgJChDWFhGTEFHUykgJDwgLWMgLW8gJEAKKworbm9zZ2lfb2JqLyUuaSA6ICUuY3BwCisJJChDWFgpICQoTk9TR0lfQ1hYRkxBR1MpICQ8IC1FIC1IID4gJEAKKworZF9vYmovJS5pIDogJS5jcHAKKwkkKENYWCkgJChEX0NYWEZMQUdTKSAkPCAtRSAtSCA+ICRACisKK29iai8lLmkgOiAlLmNwcAorCSQoQ1hYKSAkKENYWEZMQUdTKSAkPCAtRSAtSCA+ICRACisKKyUub3V0OiAlLmNwcAorCSQoQ1hYKSAkKENYWEZMQUdTKSAkPCAtYyAtVVNJTkdMRSAtRE1BSU4gLWcgLW8gJCoubworCSQoQ1hYKSAkKENYWEZMQUdTKSAkKi5vICQoTElCU1RMUE9SVCkgJChMSUJTKSAtbyAkKgorCS4vJCogPiAkQAorIwktcm0gLWYgJCoKKworJS5zOiAlLmNwcAorCSQoQ1hYKSAkKENYWEZMQUdTKSAtTzQgLVMgLXB0byAkPCAgLW8gJEAKKworJS5FOiAlLmNwcAorCSQoQ1hYKSAkKENYWEZMQUdTKSAtRSAkPCAgLW8gJEAKKworY2xlYW46CisJLXJtIC1mciAke1RFU1RfRVhFfSAqLm8gKi8qLm8gKi5ycG8gKi5vYmogKi5vdXQgY29yZSAqfiBUZW1wbGF0ZXMuREIKZGlmZiAtLWdpdCBhL3Rlc3QvZWgvZ2NjNy5tYWsgYi90ZXN0L2VoL2djYzcubWFrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMTYwYzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2VoL2djYzcubWFrCkBAIC0wLDAgKzEsOTMgQEAKKyMgOzs7IC0qLSBNb2RlOm1ha2VmaWxlOy0qLSAKKyMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBNYWtlZmlsZS5pbiBieSBjb25maWd1cmUuCisjIFRoaXMgcmVxdWlyZXMgR05VIG1ha2UuCisKK3NyY2RpciA9IC4KK1ZQQVRIID0gLgorCisjIHBvaW50IHRoaXMgdG8gcHJvcGVyIGxvY2F0aW9uCitTVExfSU5DTD0tSS4uLy4uL3N0bHBvcnQKKworQVVYX0xJU1Q9VGVzdENsYXNzLmNwcCBtYWluLmNwcCBuY19hbGxvYy5jcHAgcmFuZG9tX251bWJlci5jcHAKKworVEVTVF9MSVNUPXRlc3RfYWxnby5jcHAgIFwKK3Rlc3RfYWxnb2Jhc2UuY3BwICAgICB0ZXN0X2xpc3QuY3BwIHRlc3Rfc2xpc3QuY3BwIFwKK3Rlc3RfYml0X3ZlY3Rvci5jcHAgICB0ZXN0X3ZlY3Rvci5jcHAgXAordGVzdF9kZXF1ZS5jcHAgdGVzdF9zZXQuY3BwIHRlc3RfbWFwLmNwcCBcCit0ZXN0X2hhc2hfbWFwLmNwcCAgdGVzdF9oYXNoX3NldC5jcHAgdGVzdF9yb3BlLmNwcCBcCit0ZXN0X3N0cmluZy5jcHAgdGVzdF9iaXRzZXQuY3BwIHRlc3RfdmFsYXJyYXkuY3BwCisKK0xJU1Q9JHtBVVhfTElTVH0gJHtURVNUX0xJU1R9CisKK09CSkVDVFMgPSAkKExJU1Q6JS5jcHA9b2JqLyUubykgJChTVEFUX01PRFVMRSkKK0RfT0JKRUNUUyA9ICQoTElTVDolLmNwcD1kX29iai8lLm8pICQoU1RBVF9NT0RVTEUpCitOT1NHSV9PQkpFQ1RTID0gJChMSVNUOiUuY3BwPW5vc2dpX29iai8lLm8pICQoU1RBVF9NT0RVTEUpCisKK0VYRUNTID0gJChMSVNUOiUuY3BwPSUpCitURVNUUyA9ICQoTElTVDolLmNwcD0lLm91dCkKK1RFU1RfRVhFICA9IC4vZWhfdGVzdAorRF9URVNUX0VYRSA9IC4vZWhfdGVzdF9kCitOT1NHSV9URVNUX0VYRSA9IC4vZWhfdGVzdF9ub3NnaQorCitURVNUICA9IC4vZWhfdGVzdC5vdXQKK0RfVEVTVCA9IC4vZWhfdGVzdF9kLm91dAorTk9TR0lfVEVTVCA9IC4vZWhfdGVzdF9ub3NnaS5vdXQKKworQ0MgPSBjKysKK0NYWCA9ICQoQ0MpCisKK0NYWEZMQUdTID0gLVdhbGwgLWZoYW5kbGUtZXhjZXB0aW9ucyAtZyAke1NUTF9JTkNMfSAtSS4gJHtDWFhfRVhUUkFfRkxBR1N9IC1EX1NUTFBfTk9fT1dOX0lPU1RSRUFNUyAtRF9TVExQX0RFQlVHX1VOSU5JVElBTElaRUQKKworY2hlY2s6ICQoVEVTVCkKKworTElCUyA9IC1sbSAKK0RfTElCU1RMUE9SVCA9IC1MLi4vLi4vbGliIC1sc3RscG9ydF9nY2NfZGVidWcKK0xJQlNUTFBPUlQgPSAtTC4uLy4uL2xpYiAtbHN0bHBvcnRfZ2NjCisKK2FsbDogJChURVNUX0VYRSkgJChEX1RFU1RfRVhFKSAkKE5PU0dJX1RFU1RfRVhFKQorCitjaGVja19ub3NnaTogJChOT1NHSV9URVNUKQorY2hlY2tfZDogJChEX1RFU1QpCisKKworJChURVNUX0VYRSkgOiAkKE9CSkVDVFMpCisJJChDWFgpICQoQ1hYRkxBR1MpICQoT0JKRUNUUykgJChMSUJTKSAtbyAkKFRFU1RfRVhFKQorCisKKyQoVEVTVCkgOiAkKFRFU1RfRVhFKQorCSQoVEVTVF9FWEUpCisKKyQoRF9URVNUKSA6ICQoRF9URVNUX0VYRSkKKwkkKERfVEVTVF9FWEUpCisKKyQoTk9TR0lfVEVTVCkgOiAkKE5PU0dJX1RFU1RfRVhFKQorCSQoTk9TR0lfVEVTVF9FWEUpCisKK1NVRkZJWEVTOiAuY3BwLm8uZXhlLm91dC5yZXMKKworbm9zZ2lfb2JqLyUubyA6ICUuY3BwCisJJChDWFgpICQoTk9TR0lfQ1hYRkxBR1MpICQ8IC1jIC1vICRACisKK2Rfb2JqLyUubyA6ICUuY3BwCisJJChDWFgpICQoRF9DWFhGTEFHUykgJDwgLWMgLW8gJEAKKworb2JqLyUubyA6ICUuY3BwCisJJChDWFgpICQoQ1hYRkxBR1MpICQ8IC1jIC1vICRACisKK29iai8lLmkgOiAlLmNwcAorCSQoQ1hYKSAkKENYWEZMQUdTKSAkPCAtRSAtSCA+ICRACisKKyUub3V0OiAlLmNwcAorCSQoQ1hYKSAkKENYWEZMQUdTKSAkPCAtYyAtVVNJTkdMRSAtRE1BSU4gLWcgLW8gJCoubworCSQoQ1hYKSAkKENYWEZMQUdTKSAkKi5vICQoTElCUykgLW8gJCoKKwkuLyQqID4gJEAKKwktcm0gLWYgJCoKKworJS5zOiAlLmNwcAorCSQoQ1hYKSAkKENYWEZMQUdTKSAtTzQgLVMgLXB0byAkPCAgLW8gJEAKKworJS5FOiAlLmNwcAorCSQoQ1hYKSAkKENYWEZMQUdTKSAtRSAkPCAgLW8gJEAKKworY2xlYW46CisJLXJtIC1mciAke1RFU1RfRVhFfSAqLm8gKi8qLm8gKi5ycG8gKi5vYmogKi5vdXQgY29yZSAqfiBUZW1wbGF0ZXMuREIKZGlmZiAtLWdpdCBhL3Rlc3QvZWgvaHAubWFrIGIvdGVzdC9laC9ocC5tYWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFlN2U2YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZWgvaHAubWFrCkBAIC0wLDAgKzEsODEgQEAKKyMgOzs7IC0qLSBNb2RlOm1ha2VmaWxlOy0qLSAKKyMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBNYWtlZmlsZS5pbiBieSBjb25maWd1cmUuCisjIFRoaXMgcmVxdWlyZXMgR05VIG1ha2UuCisKKyMgU0hFTEw9L2Jpbi9zaAorIyBzcmNkaXIgPSAuCisjIFZQQVRIID0gLgorCisKKyMgcG9pbnQgdGhpcyB0byBwcm9wZXIgbG9jYXRpb24KK1NUTF9JTkNMPSAtSS4uLy4uL3N0bHBvcnQKKworQVVYX0xJU1Q9VGVzdENsYXNzLmNwcCBtYWluLmNwcCBuY19hbGxvYy5jcHAgcmFuZG9tX251bWJlci5jcHAKKworVEVTVF9MSVNUPXRlc3RfYWxnby5jcHAgIFwKK3Rlc3RfYWxnb2Jhc2UuY3BwICAgICB0ZXN0X2xpc3QuY3BwIHRlc3Rfc2xpc3QuY3BwIFwKK3Rlc3RfYml0X3ZlY3Rvci5jcHAgICB0ZXN0X3ZlY3Rvci5jcHAgXAordGVzdF9kZXF1ZS5jcHAgdGVzdF9zZXQuY3BwIHRlc3RfbWFwLmNwcCBcCit0ZXN0X2hhc2hfbWFwLmNwcCAgdGVzdF9oYXNoX3NldC5jcHAgdGVzdF9yb3BlLmNwcCBcCit0ZXN0X3N0cmluZy5jcHAgdGVzdF9iaXRzZXQuY3BwIHRlc3RfdmFsYXJyYXkuY3BwCisKK09CSkVDVFMgPSB0ZXN0X2FsZ28ubyAgXAordGVzdF9hbGdvYmFzZS5vICAgICB0ZXN0X2xpc3QubyB0ZXN0X3NsaXN0Lm8gXAordGVzdF9iaXRfdmVjdG9yLm8gICB0ZXN0X3ZlY3Rvci5vIFwKK3Rlc3RfZGVxdWUubyB0ZXN0X3NldC5vIHRlc3RfbWFwLm8gXAordGVzdF9oYXNoX21hcC5vICB0ZXN0X2hhc2hfc2V0Lm8gdGVzdF9yb3BlLm8gXAordGVzdF9zdHJpbmcubyB0ZXN0X2JpdHNldC5vIHRlc3RfdmFsYXJyYXkubworCitMSVNUPSR7QVVYX0xJU1R9ICR7VEVTVF9MSVNUfQorCisjIE9CSkVDVFMgPSAkKExJU1Q6JS5jcHA9JS5vKSAkKFNUQVRfTU9EVUxFKQorRVhFQ1MgPSAkKExJU1Q6JS5jcHA9JSkKK1RFU1RTID0gJChMSVNUOiUuY3BwPSUub3V0KQorVEVTVF9FWEUgID0gZWhfdGVzdAorVEVTVCAgPSBlaF90ZXN0Lm91dAorCitDQyA9IENDCitDWFggPSAkKENDKQorCitDWFhGTEFHUyA9IC13ICR7U1RMX0lOQ0x9IC1EX1NUTFBfTk9fQ1VTVE9NX0lPCisKK0xJQlMgPSAtbG0gCisKK0xJQlNUTFBPUlQgPSAtTC4uLy4uL2xpYiAtbHN0bHBvcnRfaHAKKworY2hlY2s6ICQoVEVTVCkKKworYWxsOiAkKFRFU1RfRVhFKQorCWVjaG8gZG9uZS4KKworJChURVNUX0VYRSkgOiAkKE9CSkVDVFMpCisJJChDWFgpICQoQ1hYRkxBR1MpICQoT0JKRUNUUykgJHtMSUJTVExQT1JUfSAkKExJQlMpIC1vICQoVEVTVF9FWEUpCisKKyQoVEVTVCkgOiAkKFRFU1RfRVhFKQorCSQoVEVTVF9FWEUpCisKK1NVRkZJWEVTOiAuY3BwIC5vIC5pIC5zIC5vdXQgLnJlcyAueQorCisuY3BwLm8gOgorCSQoQ1hYKSAkKENYWEZMQUdTKSAkPCAtYyAtbyAkQAorCisuY3BwLmkgOgorCSQoQ1hYKSAkKENYWEZMQUdTKSAkPCAtRSAtSCA+ICRACisKKy5jcHAub3V0OgorCSQoQ1hYKSAkKENYWEZMQUdTKSAkPCAtYyAtVVNJTkdMRSAtRE1BSU4gLWcgLW8gJCoubworCSQoQ1hYKSAkKENYWEZMQUdTKSAkKi5vICQoTElCUykgLW8gJCoKKwkuLyQqIC1xCisJLXJtIC1mICQqCisKKy5jcHAuczoKKwkkKENYWCkgJChDWFhGTEFHUykgLU80IC1TIC1wdG8gJDwgIC1vICRACisKK2NsZWFuOgorCS1ybSAtZnIgJHtURVNUX0VYRX0gKi5vICoucnBvICoub2JqICoub3V0IGNvcmUgKn4gVGVtcGxhdGVzLkRCIFN1bldTX2NhY2hlCisKKworCisKKworCmRpZmYgLS1naXQgYS90ZXN0L2VoL2hwYWNjLm1hayBiL3Rlc3QvZWgvaHBhY2MubWFrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlYTI5MDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2VoL2hwYWNjLm1hawpAQCAtMCwwICsxLDExOSBAQAorIyA7OzsgLSotIE1vZGU6bWFrZWZpbGU7LSotIAorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIE1ha2VmaWxlLmluIGJ5IGNvbmZpZ3VyZS4KKyMgVGhpcyByZXF1aXJlcyBHTlUgbWFrZS4KKworc3JjZGlyID0gLgorVlBBVEggPSAuCisKKyMgcG9pbnQgdGhpcyB0byBwcm9wZXIgbG9jYXRpb24KK1NUTF9JTkNMPS1JLi4vLi4vc3RscG9ydAorCitBVVhfTElTVD1UZXN0Q2xhc3MuY3BwIG1haW4uY3BwIG5jX2FsbG9jLmNwcCByYW5kb21fbnVtYmVyLmNwcAorCitURVNUX0xJU1Q9dGVzdF9hbGdvLmNwcCAgXAordGVzdF9hbGdvYmFzZS5jcHAgICAgIHRlc3RfbGlzdC5jcHAgdGVzdF9zbGlzdC5jcHAgXAordGVzdF9iaXRfdmVjdG9yLmNwcCAgIHRlc3RfdmVjdG9yLmNwcCBcCit0ZXN0X2RlcXVlLmNwcCB0ZXN0X3NldC5jcHAgdGVzdF9tYXAuY3BwIFwKK3Rlc3RfaGFzaF9tYXAuY3BwICB0ZXN0X2hhc2hfc2V0LmNwcCB0ZXN0X3JvcGUuY3BwIFwKK3Rlc3Rfc3RyaW5nLmNwcCB0ZXN0X2JpdHNldC5jcHAgdGVzdF92YWxhcnJheS5jcHAKKworTElTVD0ke0FVWF9MSVNUfSAke1RFU1RfTElTVH0KKworT0JKRUNUUyA9ICQoTElTVDolLmNwcD1vYmovJS5vKSAkKFNUQVRfTU9EVUxFKQorRF9PQkpFQ1RTID0gJChMSVNUOiUuY3BwPWRfb2JqLyUubykgJChTVEFUX01PRFVMRSkKK05PU0dJX09CSkVDVFMgPSAkKExJU1Q6JS5jcHA9bm9zZ2lfb2JqLyUubykgJChTVEFUX01PRFVMRSkKKworRVhFQ1MgPSAkKExJU1Q6JS5jcHA9JSkKK1RFU1RTID0gJChMSVNUOiUuY3BwPSUub3V0KQorVEVTVF9FWEUgID0gLi9laF90ZXN0CitEX1RFU1RfRVhFID0gLi9laF90ZXN0X2QKK05PU0dJX1RFU1RfRVhFID0gLi9laF90ZXN0X25vc2dpCisKK1RFU1QgID0gLi9laF90ZXN0Lm91dAorRF9URVNUID0gLi9laF90ZXN0X2Qub3V0CitOT1NHSV9URVNUID0gLi9laF90ZXN0X25vc2dpLm91dAorCitDQyA9IGFDQworQ1hYID0gJChDQykKKworQ1hYX0VYVFJBX0ZMQUdTID0gLUFBIC1ERUhfREVMRVRFX0hBU19USFJPV19TUEVDCisjIGR3YSAxMi8yMi85OSAtLSBoYWQgdG8gdHVybiBvZmYgLWFuc2kgZmxhZyBzbyB3ZSBjb3VsZCB1c2UgU0dJIElPU1RSRUFNUworIyBhbHNvLCB0ZXN0X3NsaXN0IHdvbid0IGNvbXBpbGUgd2l0aCAtTzMvLU8yIHdoZW4gdGFyZ2V0aW5nIFBQQy4gSXQgZmFpbHMgCisjIGluIHRoZSBhc3NlbWJsZXIgd2l0aCAnaW52YWxpZCByZWxvY2F0aW9uIHR5cGUnCitDWFhGTEFHUyA9IC1nIC1PICR7U1RMX0lOQ0x9IC1JLiAke0NYWF9FWFRSQV9GTEFHU30gLURFSF9WRUNUT1JfT1BFUkFUT1JfTkVXCitEX0NYWEZMQUdTID0gLWcgLU8gJHtTVExfSU5DTH0gLUkuICR7Q1hYX0VYVFJBX0ZMQUdTfSAtREVIX1ZFQ1RPUl9PUEVSQVRPUl9ORVcgLURfU1RMUF9ERUJVRyAtRF9TVExQX1VTRV9TVEFUSUNfTElCCitOT1NHSV9DWFhGTEFHUyA9IC1nIC1PICR7U1RMX0lOQ0x9IC1JLiAke0NYWF9FWFRSQV9GTEFHU30gLURfU1RMUF9OT19PV05fSU9TVFJFQU1TIC1EX1NUTFBfREVCVUdfVU5JTklUSUFMSVpFRCAtREVIX1ZFQ1RPUl9PUEVSQVRPUl9ORVcKKworY2hlY2s6ICQoVEVTVCkKKworSFBfVkVSU0lPTj0kKHNoZWxsIHVuYW1lIC1yKQoraWZlcSAoJHtIUF9WRVJTSU9OfSxCLjEwLjIwKQorUFRIUkVBRF9MSUI9LWxjbWEKK2Vsc2UKK1BUSFJFQURfTElCPS1scHRocmVhZCArbm9zdGwKK2VuZGlmCisKK0xJQlMgPSAkKFBUSFJFQURfTElCKSAtbG0KKyAKK0RfTElCU1RMUE9SVCA9IC1MLi4vLi4vbGliIC1sc3RscG9ydF9hQ0NfZGVidWcKK0xJQlNUTFBPUlQgPSAtTC4uLy4uL2xpYiAtbHN0bHBvcnRfYUNDCisKK2FsbDogJChURVNUX0VYRSkgJChEX1RFU1RfRVhFKSAkKE5PU0dJX1RFU1RfRVhFKQorCitjaGVja19ub3NnaTogJChOT1NHSV9URVNUKQorY2hlY2tfZDogJChEX1RFU1QpCisKKworJChURVNUX0VYRSkgOiAkKE9CSkVDVFMpCisJJChDWFgpICQoQ1hYRkxBR1MpICQoT0JKRUNUUykgJChMSUJTVExQT1JUKSAkKExJQlMpIC1vICQoVEVTVF9FWEUpCisKKyQoRF9URVNUX0VYRSkgOiAkKERfT0JKRUNUUykKKwkkKENYWCkgJChEX0NYWEZMQUdTKSAkKERfT0JKRUNUUykgJChEX0xJQlNUTFBPUlQpICQoTElCUykgLW8gJChEX1RFU1RfRVhFKQorCiskKE5PU0dJX1RFU1RfRVhFKSA6ICQoTk9TR0lfT0JKRUNUUykKKwkkKENYWCkgJChOT1NHSV9DWFhGTEFHUykgJChOT1NHSV9PQkpFQ1RTKSAkKExJQlMpIC1vICQoTk9TR0lfVEVTVF9FWEUpCisKKworJChURVNUKSA6ICQoVEVTVF9FWEUpCisJJChURVNUX0VYRSkKKworJChEX1RFU1QpIDogJChEX1RFU1RfRVhFKQorCSQoRF9URVNUX0VYRSkKKworJChOT1NHSV9URVNUKSA6ICQoTk9TR0lfVEVTVF9FWEUpCisJJChOT1NHSV9URVNUX0VYRSkKKworU1VGRklYRVM6IC5jcHAuby5leGUub3V0LnJlcworCitub3NnaV9vYmovJS5vIDogJS5jcHAKKwkkKENYWCkgJChOT1NHSV9DWFhGTEFHUykgJDwgLWMgLW8gJEAKKworZF9vYmovJS5vIDogJS5jcHAKKwkkKENYWCkgJChEX0NYWEZMQUdTKSAkPCAtYyAtbyAkQAorCitvYmovJS5vIDogJS5jcHAKKwkkKENYWCkgJChDWFhGTEFHUykgJDwgLWMgLW8gJEAKKworbm9zZ2lfb2JqLyUuaSA6ICUuY3BwCisJJChDWFgpICQoTk9TR0lfQ1hYRkxBR1MpICQ8IC1FIC1IID4gJEAKKworZF9vYmovJS5pIDogJS5jcHAKKwkkKENYWCkgJChEX0NYWEZMQUdTKSAkPCAtRSAtSCA+ICRACisKK29iai8lLmkgOiAlLmNwcAorCSQoQ1hYKSAkKENYWEZMQUdTKSAkPCAtRSAtSCA+ICRACisKKyUub3V0OiAlLmNwcAorCSQoQ1hYKSAkKENYWEZMQUdTKSAkPCAtYyAtVVNJTkdMRSAtRE1BSU4gLWcgLW8gJCoubworCSQoQ1hYKSAkKENYWEZMQUdTKSAkKi5vICQoTElCUykgLW8gJCoKKwkuLyQqID4gJEAKKwktcm0gLWYgJCoKKworJS5zOiAlLmNwcAorCSQoQ1hYKSAkKENYWEZMQUdTKSAtTzQgLVMgLXB0byAkPCAgLW8gJEAKKworJS5FOiAlLmNwcAorCSQoQ1hYKSAkKENYWEZMQUdTKSAtRSAkPCAgLW8gJEAKKworY2xlYW46CisJLXJtIC1mciAke1RFU1RfRVhFfSAqLm8gKi8qLm8gKi5ycG8gKi5vYmogKi5vdXQgY29yZSAqfiBUZW1wbGF0ZXMuREIKZGlmZiAtLWdpdCBhL3Rlc3QvZWgvaW50ZWwubWFrIGIvdGVzdC9laC9pbnRlbC5tYWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRjNTBlYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZWgvaW50ZWwubWFrCkBAIC0wLDAgKzEsNjkgQEAKKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIE5NQUtFIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDQuMTAKKyMgKiogRE8gTk9UIEVESVQgKioKKworIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIgMHgwMTAzCisKKworIUlGICIkKE9TKSIgPT0gIldpbmRvd3NfTlQiCitOVUxMPQorIUVMU0UgCitOVUxMPW51bAorIUVORElGIAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gUHJvamVjdAorUlNDPXJjLmV4ZQorQ1BQPWljbC5leGUKK0Y5MD1mbDMyLmV4ZQorCitPVVRESVI9LgorSU5URElSPS4KKworIyBzZXQgdGhpcyBkaXJlY3RvcmllcyAKK1NUTF9JTkNMPS4uLy4uL3N0bHBvcnQKK1ZDX0lOQ0w9LgorIyBkOi92YzQxL21zZGV2L2luY2x1ZGUKKworRGVwX3N0bCA9IFRlc3RDbGFzcy5vYmogbWFpbi5vYmogbmNfYWxsb2Mub2JqIFwKK3JhbmRvbV9udW1iZXIub2JqIHRlc3RfYWxnby5vYmogdGVzdF9hbGdvYmFzZS5vYmogdGVzdF9iaXRfdmVjdG9yLm9iaiB0ZXN0X2RlcXVlLm9iaiBcCit0ZXN0X2hhc2hfbWFwLm9iaiB0ZXN0X2hhc2hfc2V0Lm9iaiB0ZXN0X2xpc3Qub2JqIHRlc3RfbWFwLm9iaiB0ZXN0X3JvcGUub2JqIHRlc3Rfc2V0Lm9iaiBcCit0ZXN0X3NsaXN0Lm9iaiB0ZXN0X3ZlY3Rvci5vYmogdGVzdF9zdHJpbmcub2JqIHRlc3RfYml0c2V0Lm9iaiB0ZXN0X3ZhbGFycmF5Lm9iagorCitMSU5LMzI9bGluay5leGUKKworQ1BQX1BST0o9L25vbG9nbyAvVzMgL0dYIC9EICJXSU4zMiIgL01UZCAvWmkgL0dtIC9PZCAvRCAiX0NPTlNPTEUiICAgL0kkKFNUTF9JTkNMKSAvSS4gL0RfREVCVUcKKworQ1BQX0xJQlMgPSAvbGluayAvbGlicGF0aDoiLi5cLi5cbGliIgorCitjaGVjazogZWhfdGVzdC5vdXQKKworZWhfdGVzdC5vdXQgOiAkKERlcF9zdGwpCisJJChDUFApICQoQ1BQX1BST0opICQoRGVwX3N0bCkgLW8gZWhfdGVzdC5leGUgJChDUFBfTElCUykKKwkuXGVoX3Rlc3QuZXhlCisJZWNobyBkb25lCisKK2NsZWFuIDoKKwktQGVyYXNlICIkKElOVERJUilcKi5vYmoiCisJLUBlcmFzZSAiJChPVVRESVIpXCouZXhlIgorCS1AZXJhc2UgIiQoT1VURElSKVwqLm9iaiIKKworCisuZXhlLm91dDoKKwkkPCA+ICRACisKKy5jcHAuZXhlOgorICAkKENQUCkgJChDUFBfUFJPSikgLURNQUlOICQ8ICQoQ1BQX0xJQlMpCisKKy5jLm9iajoKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAvYyAkPAorCisuY3BwLm9iajoKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAvYyAkPAorCisuY3h4Lm9iajoKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAvYyAkPAorCisuY3BwLkU6CisgICAkKENQUCkgJChDUFBfUFJPSikgLUUgJDwgPiQqLkUgIAorCisuY3BwLnNicjoKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkPCAgCmRpZmYgLS1naXQgYS90ZXN0L2VoL2ludGVsNDUubWFrIGIvdGVzdC9laC9pbnRlbDQ1Lm1hawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjA1ZWVmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9laC9pbnRlbDQ1Lm1hawpAQCAtMCwwICsxLDEwOSBAQAorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgTk1BS0UgRmlsZSwgRm9ybWF0IFZlcnNpb24gNC4xMAorIyAqKiBETyBOT1QgRURJVCAqKgorCisjIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIiAweDAxMDMKKworCishSUYgIiQoT1MpIiA9PSAiV2luZG93c19OVCIKK05VTEw9CishRUxTRSAKK05VTEw9bnVsCishRU5ESUYgCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBQcm9qZWN0CitSU0M9cmMuZXhlCitDUFA9aWNsLmV4ZQorTElOSzMyPXhpbGluay5leGUKKworT1VURElSPS4KK0lOVERJUj0uCisKKyMgc2V0IHRoaXMgZGlyZWN0b3JpZXMgCitTVExfUEFUSD0uLlwuLgorCitEZXBfc3RsID0gVGVzdENsYXNzLm9iaiBtYWluLm9iaiBuY19hbGxvYy5vYmogXAorcmFuZG9tX251bWJlci5vYmogdGVzdF9hbGdvLm9iaiB0ZXN0X2FsZ29iYXNlLm9iaiB0ZXN0X2JpdF92ZWN0b3Iub2JqIHRlc3RfZGVxdWUub2JqIFwKK3Rlc3RfaGFzaF9tYXAub2JqIHRlc3RfaGFzaF9zZXQub2JqIHRlc3RfbGlzdC5vYmogdGVzdF9tYXAub2JqIHRlc3Rfcm9wZS5vYmogdGVzdF9zZXQub2JqIFwKK3Rlc3Rfc2xpc3Qub2JqIHRlc3RfdmVjdG9yLm9iaiB0ZXN0X3N0cmluZy5vYmogdGVzdF9iaXRzZXQub2JqIHRlc3RfdmFsYXJyYXkub2JqCisKK0NQUF9MSUJTID0gL2xpbmsgL2luY3JlbWVudGFsOm5vIC9MSUJQQVRIOiQoU1RMX1BBVEgpXGxpYgorCisjZGlzYWJsZSB3YXJuaW5ncyBjb21wbGFpbmluZyBhYm91dCBkZWJ1ZyAuLi5pbmZvIGV4Y2VlZGVkLi4uLgorQ1BQX1BSSl9FWFRSQSA9IC9Rd2Q5ODUKK0NQUF9QUkpfQ01OID0gL25vbG9nbyAvVzMgL0dSIC9HWCAvRFdJTjMyIC9EX1dJTkRPV1MgL0RfQ09OU09MRSAvSSQoU1RMX1BBVEgpXHN0bHBvcnQgL0kuCisKKyMKK0xJQlRZUEUgPSBTVEFUSUMKKyMgTElCVFlQRSA9IERZTkFNSUMKKyMKKyNERUJVRyA9IFNUTAorREVCVUcgPSBPTgorI0RFQlVHID0KKyMgCitJT1MgPSBTR0kKKyNJT1MgPSBOT1NHSQorI0lPUyA9IE5PTkUKKworIUlGICIkKElPUykiID09ICJOT1NHSSIKK0NQUF9QUkpfSU9TID0gL0RfU1RMUF9OT19PV05fSU9TVFJFQU1TCishRUxTRUlGICIkKElPUykiID09ICJOT05FIgorQ1BQX1BSSl9JT1MgPSAvRF9TVExQX05PX0lPU1RSRUFNCishRUxTRQorQ1BQX1BSSl9JT1MgPQorIUVORElGCisKKyNNVC9NRCBldGMgc2hvdWxkIGJlIExBU1QgaW4gQ1BQX1BSSl9MSUJUWVAgc3RyaW5nISEhCisjTGlicmFyeSBzZWxlY3Rpb24gc2hvdWxkIGJlIEJFRk9SRSBkZWJ1ZyBwcm9jZXNzaW5nISEhCishSUYgIiQoTElCVFlQRSkiID09ICJTVEFUSUMiCitDUFBfUFJKX0xJQlRZUCA9IC9NVAorIUVMU0UKK0NQUF9QUkpfTElCVFlQID0gL01ECishRU5ESUYKKworIUlGICIkKERFQlVHKSIgPT0gIiIKK0NQUF9QUkpfREJHID0gL0ROREVCVUcgL08yIC9Rc294LQorIUVMU0UKK0NQUF9QUkpfTElCVFlQID0gJChDUFBfUFJKX0xJQlRZUClkCitDUFBfUFJKX0RCRyA9IC9EX0RFQlVHIC9PZAorIUlGICIkKERFQlVHKSIgPT0gIlNUTCIKK0NQUF9QUkpfREJHID0gJChDUFBfUFJKX0RCRykgL0RfU1RMUF9ERUJVRworIUVORElGCitDUFBfUFJKX0NNTiA9ICQoQ1BQX1BSSl9DTU4pIC9aaSAvR20KKyFFTkRJRgorCitDUFBfUFJPSiA9ICQoQ1BQX1BSSl9DTU4pICQoQ1BQX1BSSl9FWFRSQSkgJChDUFBfUFJKX0lPUykgJChDUFBfUFJKX0xJQlRZUCkgJChDUFBfUFJKX0RCRykKKworY2hlY2s6IGVoX3Rlc3Qub3V0CisKK2VoX3Rlc3Qub3V0IDogJChEZXBfc3RsKQorCSQoQ1BQKSAkKENQUF9QUk9KKSAkKERlcF9zdGwpIC9GZWVoX3Rlc3QuZXhlICQoQ1BQX0xJQlMpCisgICAgICAgIGNkIC4uXC4uXGxpYgorCS4uXHRlc3RcZWhcZWhfdGVzdC5leGUgLXMgMTAwCisJZWNobyBkb25lCisKK2NsZWFuIDoKKwktQGVyYXNlICIkKElOVERJUilcKi5vYmoiCisJLUBlcmFzZSAiJChPVVRESVIpXCouZXhlIgorCS1AZXJhc2UgIiQoT1VURElSKVwqLm9iaiIKKworCisuZXhlLm91dDoKKwkkPCA+ICRACisKKy5jcHAuZXhlOgorICAkKENQUCkgJChDUFBfUFJPSikgLURNQUlOICQ8CisKKy5jLm9iajoKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAvYyAkPAorCisuY3BwLm9iajoKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAvYyAkPAorCisuY3h4Lm9iajoKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAvYyAkPAorCisuY3BwLkU6CisgICAkKENQUCkgJChDUFBfUFJPSikgLUUgJDwgPiQqLkUgIAorCisuY3BwLnNicjoKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkPCAgCmRpZmYgLS1naXQgYS90ZXN0L2VoL2ludGVsNTAubWFrIGIvdGVzdC9laC9pbnRlbDUwLm1hawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTFkMWQwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9laC9pbnRlbDUwLm1hawpAQCAtMCwwICsxLDExNSBAQAorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgTk1BS0UgRmlsZSwgRm9ybWF0IFZlcnNpb24gNC4xMAorIyAqKiBETyBOT1QgRURJVCAqKgorCisjIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIiAweDAxMDMKKworCishSUYgIiQoT1MpIiA9PSAiV2luZG93c19OVCIKK05VTEw9CishRUxTRSAKK05VTEw9bnVsCishRU5ESUYgCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBQcm9qZWN0CitSU0M9cmMuZXhlCitDUFA9aWNsLmV4ZQorTElOSzMyPXhpbGluay5leGUKKworT1VURElSPS4KK0lOVERJUj0uCisKKyMgc2V0IHRoaXMgZGlyZWN0b3JpZXMgCitTVExfUEFUSD0uLlwuLgorCitEZXBfc3RsID0gVGVzdENsYXNzLm9iaiBtYWluLm9iaiBuY19hbGxvYy5vYmogXAorcmFuZG9tX251bWJlci5vYmogdGVzdF9hbGdvLm9iaiB0ZXN0X2FsZ29iYXNlLm9iaiB0ZXN0X2JpdF92ZWN0b3Iub2JqIHRlc3RfZGVxdWUub2JqIFwKK3Rlc3RfaGFzaF9tYXAub2JqIHRlc3RfaGFzaF9zZXQub2JqIHRlc3RfbGlzdC5vYmogdGVzdF9tYXAub2JqIHRlc3Rfcm9wZS5vYmogdGVzdF9zZXQub2JqIFwKK3Rlc3Rfc2xpc3Qub2JqIHRlc3RfdmVjdG9yLm9iaiB0ZXN0X3N0cmluZy5vYmogdGVzdF9iaXRzZXQub2JqIHRlc3RfdmFsYXJyYXkub2JqCisKKyMgbGlua2VyIGZpbmRzIHByb3BlciBTVExwb3J0IGxpYiBhdXRvbWF0aWNhbGx5LCBvbmx5IHBhdGggdG8gdGhlIGxpYnJhcnkgaXMgbmVlZGVkCitDUFBfUFJKX0xJTksgPSAvbGluayAvaW5jcmVtZW50YWw6bm8gL0xJQlBBVEg6JChTVExfUEFUSClcbGliCisKKyNkaXNhYmxlIHdhcm5pbmdzIGNvbXBsYWluaW5nIGFib3V0IGRlYnVnIC4uLmluZm8gZXhjZWVkZWQuLi4uCitDUFBfUFJKX0VYVFJBID0gL1F3ZDk4NQorQ1BQX1BSSl9DTU4gPSAvbm9sb2dvIC9XMyAvR1IgL0dYIC9EV0lOMzIgL0RfV0lORE9XUyAvRF9DT05TT0xFIC9JJChTVExfUEFUSClcc3RscG9ydCAvSS4KKwkKKyMKK0xJQlRZUEUgPSBTVEFUSUMKKyMgTElCVFlQRSA9IERZTkFNSUMKKyMKKyNERUJVRyA9IFNUTAorREVCVUcgPSBPTgorI0RFQlVHID0KKyMgCitJT1MgPSBTR0kKKyNJT1MgPSBOT1NHSQorI0lPUyA9IE5PTkUKKworIUlGICIkKElPUykiID09ICJOT1NHSSIKK0NQUF9QUkpfSU9TID0gL0RfU1RMUF9OT19TR0lfSU9TVFJFQU1TCishRUxTRUlGICIkKElPUykiID09ICJOT05FIgorQ1BQX1BSSl9JT1MgPSAvRF9TVExQX05PX0lPU1RSRUFNCishRUxTRQorQ1BQX1BSSl9JT1MgPQorIUVORElGCisKKyNNVC9NRCBldGMgc2hvdWxkIGJlIExBU1QgaW4gQ1BQX1BSSl9MSUJUWVAgc3RyaW5nISEhCisjTGlicmFyeSBzZWxlY3Rpb24gc2hvdWxkIGJlIEJFRk9SRSBkZWJ1ZyBwcm9jZXNzaW5nISEhCishSUYgIiQoTElCVFlQRSkiID09ICJTVEFUSUMiCitDUFBfUFJKX0xJQlRZUCA9IC9EX1NUTFBfVVNFX1NUQVRJQ19MSUIgL01UCishRUxTRQorQ1BQX1BSSl9MSUJUWVAgPSAvRF9TVExQX1VTRV9EWU5BTUlDX0xJQiAvTUQKKyFFTkRJRgorCishSUYgIiQoREVCVUcpIiA9PSAiIgorQ1BQX1BSSl9EQkcgPSAvRE5ERUJVRyAvTzIgL1Fzb3gtCishRUxTRQorQ1BQX1BSSl9MSUJUWVAgPSAkKENQUF9QUkpfTElCVFlQKWQKK0NQUF9QUkpfREJHID0gL0RfREVCVUcgL09kCishSUYgIiQoREVCVUcpIiA9PSAiU1RMIgorQ1BQX1BSSl9EQkcgPSAkKENQUF9QUkpfREJHKSAvRF9TVExQX0RFQlVHCishRU5ESUYKK0NQUF9QUkpfQ01OID0gJChDUFBfUFJKX0NNTikgL1ppIC9HbQorIUVORElGCisKK0NQUF9JR05PUkVfTElCID0gTElCQ01UCisjQ1BQX1BSSl9MSU5LID0gJChDUFBfUFJKX0xJTkspIC9OT0RFRkFVTFRMSUI6JChDUFBfSUdOT1JFX0xJQikKK0NQUF9QUkpfTElOSyA9ICQoQ1BQX1BSSl9MSU5LKSAvVkVSQk9TRTpMSUIKKworQ1BQX1BST0ogPSAkKENQUF9QUkpfQ01OKSAkKENQUF9QUkpfRVhUUkEpICQoQ1BQX1BSSl9JT1MpICQoQ1BQX1BSSl9MSUJUWVApICQoQ1BQX1BSSl9EQkcpCisKK2NoZWNrOiBlaF90ZXN0Lm91dAorCitlaF90ZXN0Lm91dCA6ICQoRGVwX3N0bCkKKwkkKENQUCkgJChDUFBfUFJPSikgJChEZXBfc3RsKSAvRmVlaF90ZXN0LmV4ZSAkKENQUF9QUkpfTElOSykKKyMgIAkgICAgZmJwIDogdGhpcyBpcyB0byBsb2NhdGUgRExMCisgICAgICAgIGNkIC4uXC4uXGxpYgorCS4uXHRlc3RcZWhcZWhfdGVzdC5leGUgLXMgMTAwCisJZWNobyBkb25lCisKK2NsZWFuIDoKKwktQGVyYXNlICIkKElOVERJUilcKi5vYmoiCisJLUBlcmFzZSAiJChPVVRESVIpXCouZXhlIgorCS1AZXJhc2UgIiQoT1VURElSKVwqLm9iaiIKKworCisuZXhlLm91dDoKKwkkPCA+ICRACisKKy5jcHAuZXhlOgorICAkKENQUCkgJChDUFBfUFJPSikgLURNQUlOICQ8ICQoQ1BQX1BSSl9MSU5LKQorCisuYy5vYmo6CisgICAkKENQUCkgJChDUFBfUFJPSikgL2MgJDwKKworLmNwcC5vYmo6CisgICAkKENQUCkgJChDUFBfUFJPSikgL2MgJDwKKworLmN4eC5vYmo6CisgICAkKENQUCkgJChDUFBfUFJPSikgL2MgJDwKKworLmNwcC5FOgorICAgJChDUFApICQoQ1BQX1BST0opIC1FICQ8ID4kKi5FICAKKworLmNwcC5zYnI6CisgICAkKENQUCkgJChDUFBfUFJPSikgJDwgIApkaWZmIC0tZ2l0IGEvdGVzdC9laC9rYWkubWFrIGIvdGVzdC9laC9rYWkubWFrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjZTg1YjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2VoL2thaS5tYWsKQEAgLTAsMCArMSw2NSBAQAorIyA7OzsgLSotIE1vZGU6bWFrZWZpbGU7LSotIAorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIE1ha2VmaWxlLmluIGJ5IGNvbmZpZ3VyZS4KKworIyBwb2ludCB0aGlzIHRvIHByb3BlciBsb2NhdGlvbgorU1RMX0lOQ0w9IC1JLi4vLi4vc3RscG9ydCAKKyMgU1RMX0lOQ0w9IC1ERUhfTk9fU0dJX1NUTAorCitBVVhfTElTVD1UZXN0Q2xhc3MuY3BwIG1haW4uY3BwIG5jX2FsbG9jLmNwcCByYW5kb21fbnVtYmVyLmNwcAorCitURVNUX0xJU1Q9dGVzdF9hbGdvLmNwcCAgXAordGVzdF9hbGdvYmFzZS5jcHAgICAgIHRlc3RfbGlzdC5jcHAgdGVzdF9zbGlzdC5jcHAgXAordGVzdF9iaXRfdmVjdG9yLmNwcCAgIHRlc3RfdmVjdG9yLmNwcCBcCit0ZXN0X2RlcXVlLmNwcCB0ZXN0X3NldC5jcHAgdGVzdF9tYXAuY3BwIFwKK3Rlc3RfaGFzaF9tYXAuY3BwICB0ZXN0X2hhc2hfc2V0LmNwcCB0ZXN0X3JvcGUuY3BwIFwKK3Rlc3Rfc3RyaW5nLmNwcCB0ZXN0X2JpdHNldC5jcHAgdGVzdF92YWxhcnJheS5jcHAKKworIyBURVNUX0xJU1Q9dGVzdF9kZXF1ZS5jcHAKKworCitMSVNUPSR7QVVYX0xJU1R9ICR7VEVTVF9MSVNUfQorCitPQkpFQ1RTID0gJChMSVNUOiUuY3BwPSUubykgJChTVEFUX01PRFVMRSkKK0VYRUNTID0gJChMSVNUOiUuY3BwPSUpCitURVNUUyA9ICQoTElTVDolLmNwcD0lLm91dCkKK1RFU1RfRVhFICA9IGVoX3Rlc3QKK1RFU1QgID0gZWhfdGVzdC5vdXQKKworQ0MgPSBLQ0MKK0NYWCA9ICQoQ0MpCisKK0NYWEZMQUdTID0gLXcgLW10IC0tb25lX3BlciAke1NUTF9JTkNMfSAtRF9TVExQX1VTRV9ORVdBTExPQyAtREVIX1ZFQ1RPUl9PUEVSQVRPUl9ORVcgLURFSF9ERUxFVEVfSEFTX1RIUk9XX1NQRUMKKworIyBUaGlzIGlzIHRvIHRlc3Qgd2l0aCBuYXRpdmUgU1RMCisjIENYWEZMQUdTID0gLXcgLW10IC0tb25lX3BlciAtRF9TVExQX1VTRV9ORVdBTExPQyAtREVIX05PX1NHSV9TVEwgLURFSF9ORVdfSEVBREVSUyAtREVIX1ZFQ1RPUl9PUEVSQVRPUl9ORVcgLURFSF9ERUxFVEVfSEFTX1RIUk9XX1NQRUMKKworIyBUaGlzIGlzIHRvIHRlc3Qgd2l0aCBTVExwb3J0IGlvc3RyZWFtcworTElCUyA9IC1MLi4vLi4vbGliIC1sc3RscG9ydF9rY2MgLWxtIAorCitMSUJTVERDWFggPSAKKworY2hlY2s6ICQoVEVTVCkKKworJChURVNUKSA6ICQoT0JKRUNUUykKKwkkKENYWCkgJChDWFhGTEFHUykgJChPQkpFQ1RTKSAkKExJQlMpIC1vICQoVEVTVF9FWEUpCisJJChURVNUX0VYRSkKKworU1VGRklYRVM6IC5jcHAuby5vdXQucmVzCisKKyUubyA6ICUuY3BwCisJJChDWFgpICQoQ1hYRkxBR1MpICQ8IC1jIC1vICRACisKKyUuaSA6ICUuY3BwCisJJChDWFgpICQoQ1hYRkxBR1MpICQ8IC1FIC1IID4gJEAKKworJS5vdXQ6ICUuY3BwCisJJChDWFgpICQoQ1hYRkxBR1MpICQ8IC1jIC1VU0lOR0xFIC1ETUFJTiAtZyAtbyAkKi5vCisJJChDWFgpICQoQ1hYRkxBR1MpICQqLm8gJChMSUJTKSAtbyAkKgorCS4vJCogLXEKKwktcm0gLWYgJCoKKworJS5zOiAlLmNwcAorCSQoQ1hYKSAkKENYWEZMQUdTKSAtTzQgLVMgLXB0byAkPCAgLW8gJEAKKworY2xlYW46CisJLXJtIC1mciAke1RFU1RfRVhFfSAqLm8gKi5ycG8gKi5vYmogKi5vdXQgY29yZSAqfiBUZW1wbGF0ZXMuREIgU3VuV1NfY2FjaGUgdGlfZmlsZXMKZGlmZiAtLWdpdCBhL3Rlc3QvZWgvbG9jYWxlLmNwcCBiL3Rlc3QvZWgvbG9jYWxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjVhMWM1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9laC9sb2NhbGUuY3BwCkBAIC0wLDAgKzEsNjAgQEAKKyNpbmNsdWRlIDxleGNlcHRpb24+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bG9jYWxlPgorI2luY2x1ZGUgPGN0aW1lPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCit2b2lkIG1haW4oKQoreworICB0cnkKKyAgeworICAgIGxvY2FsZSBjX2xvYzsKKyAgICAvL2xvY2FsZSBzeXMoY19sb2MsICJMQ19USU1FPVVLUl9VS1IuT0NQO0xDX05VTUVSSUM9UlVTX1JVUy5PQ1A7TENfQ1RZUEU9dWtyX3Vrci5vY3A7IiwgbG9jYWxlOjpudW1lcmljIHwgbG9jYWxlOjp0aW1lIHwgbG9jYWxlOjpjdHlwZSk7CisgICAgbG9jYWxlIHN5cygiLm9jcCIpOworICAgIGxvY2FsZTo6Z2xvYmFsKHN5cyk7CisgICAgY2luLmltYnVlKHN5cyk7CisgICAgY291dC5pbWJ1ZShzeXMpOworCisgICAgY291dDw8IkxvY2FsZSBuYW1lIGlzOiAiPDxzeXMubmFtZSgpLmNfc3RyKCk8PCdcbic7CisKKyAgICBjb3V0PDwiRW50ZXIgcmVhbCBudW1iZXI6IjsKKyAgICBkb3VibGUgdmFsdWU7CisgICAgY2luPj52YWx1ZTsKKyAgICBjb3V0PDx2YWx1ZTw8J1xuJzsKKworICAgICAgICAvLyBUaW1lIHRlc3QuCisgICAgICAgIGxvbmcgbGN1cl90aW1lOworICAgICAgICB0aW1lKCZsY3VyX3RpbWUpOworICAgICAgICBzdHJ1Y3QgdG0qIGN1cl90aW1lPWxvY2FsdGltZSgmbGN1cl90aW1lKTsKKworICAgICAgICBjb25zdCBudW1wdW5jdDxjaGFyPiYgbnVtX3B1bmN0PXVzZV9mYWNldDxudW1wdW5jdDxjaGFyPiA+KGNvdXQuZ2V0bG9jKCkpOworICAgICAgICBjb3V0IDw8IG51bV9wdW5jdC5kZWNpbWFsX3BvaW50KCkgPDwgJ1xuJzsKKyAgICAgICAgY29uc3QgdGltZV9wdXQ8Y2hhciwgb3N0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+ID4mIHRpbWVfZmFjPQorICAgICAgICB1c2VfZmFjZXQ8dGltZV9wdXQ8Y2hhciwgb3N0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+ID4gPihjb3V0LmdldGxvYygpKTsKKyAgICAgICAgdGltZV9mYWMucHV0KGNvdXQsIGNvdXQsIE5VTEwsIGN1cl90aW1lLCAneCcpOyBjb3V0PDwnXG4nOworICAgICAgICB0aW1lX2ZhYy5wdXQoY291dCwgY291dCwgTlVMTCwgY3VyX3RpbWUsICd4JywgJyMnKTsgY291dDw8J1xuJzsKKyAgICAgICAgdGltZV9mYWMucHV0KGNvdXQsIGNvdXQsIE5VTEwsIGN1cl90aW1lLCAnWCcpOyBjb3V0PDwnXG4nOworICAgICAgICB0aW1lX2ZhYy5wdXQoY291dCwgY291dCwgTlVMTCwgY3VyX3RpbWUsICdjJyk7IGNvdXQ8PCdcbic7CisgICAgICAgIHRpbWVfZmFjLnB1dChjb3V0LCBjb3V0LCBOVUxMLCBjdXJfdGltZSwgJ2MnLCAnIycpOyBjb3V0PDwnXG4nOworICAgICAgICB0aW1lX2ZhYy5wdXQoY291dCwgY291dCwgTlVMTCwgY3VyX3RpbWUsICdJJyk7IGNvdXQ8PCdcbic7CisKKyAgICAgICAgY29uc3QgY3R5cGU8Y2hhcj4mIGNoYXJfdHlwZT11c2VfZmFjZXQ8Y3R5cGU8Y2hhcj4gPihjb3V0LmdldGxvYygpKTsKKyAgICAgICAgaWYoY2hhcl90eXBlLmlzKGN0eXBlX2Jhc2U6OnVwcGVyLCAnjycpKSBwdXRzKCJVcHBlciIpOworICAgICAgICBpZihjaGFyX3R5cGUuaXMoY3R5cGVfYmFzZTo6bG93ZXIsICevJykpIHB1dHMoIkxvd2VyIik7CisgICAgICAgIHB1dHMoIk5leHQiKTsKKyAgICAgICAgaWYoaXN1cHBlcignjycsIGNvdXQuZ2V0bG9jKCkpKSBwdXRzKCJVcHBlciIpOworICAgICAgICBpZihpc2xvd2VyKCevJywgY291dC5nZXRsb2MoKSkpIHB1dHMoIkxvd2VyIik7CisgICAgICAgIC8qZm9yKGludCBjaD0xMjg7IGNoPDI1NjsgY2grKykKKyAgICAgICAgICBwcmludGYoIkNoYXJhY3RlciAlYyAoJWQpIC0gdXBwZXIgJWMsIGxvd2VyICVjXG4iLChjaGFyKWNoLCBjaCx0b3VwcGVyKChjaGFyKWNoLCBjb3V0LmdldGxvYygpKSwgdG9sb3dlcigoY2hhciljaCwgY291dC5nZXRsb2MoKSkpOyovCisgIH0KKyAgY2F0Y2goZXhjZXB0aW9uICZlKQorICB7CisgICAgY291dDw8IkV4Y2VwdGlvbiBmaXJlZDpcbiI8PGUud2hhdCgpPDwnXG4nOworICB9CisgIGNhdGNoKC4uLikKKyAgeworICAgIGNvdXQ8PCJVbmtub3duIGV4Y2VwdGlvbiB0aHJvd2VkIVxuIjsKKyAgfQorICBjb3V0LmZsdXNoKCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L2VoL21haW4uY3BwIGIvdGVzdC9laC9tYWluLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWQwN2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9laC9tYWluLmNwcApAQCAtMCwwICsxLDQwNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIE1haW4uY3BwCisKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogTWFyayBvZiB0aGUgVW5pY29ybiwgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgTWFyayBvZiB0aGUgVW5pY29ybiBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kgbWFrZXMKK25vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgIlByZWZpeC5oIgorI2luY2x1ZGUgIlRlc3RzLmgiCisKKyNpZiBkZWZpbmVkIChFSF9ORVdfSU9TVFJFQU1TKQorIyBpbmNsdWRlIDxpb3N0cmVhbT4KKyMgZWxzZQorIyBpbmNsdWRlIDxpb3N0cmVhbS5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKG1hY2ludG9zaCkmJighZGVmaW5lZChfX01SQ19fKSAmJiAhZGVmaW5lZChfX1NDX18pKSB8fCBkZWZpbmVkIChfTUFDKSAmJiBkZWZpbmVkKF9fTVdFUktTX18pCisKKyMgaW5jbHVkZSA8Y29uc29sZS5oPgorIyBpbmNsdWRlIDxUeXBlcy5oPgorIyBpbmNsdWRlIDxTdHJpbmdzLmg+CisKKyMgaWZkZWYgRUhfTkVXX0hFQURFUlMKKyMgIGluY2x1ZGUgPGNzdGRpbz4KKyMgIGluY2x1ZGUgPGNzdHJpbmc+CisjICBpbmNsdWRlIDxjYXNzZXJ0PgorIyBlbHNlCisjICBpbmNsdWRlIDxzdGRpby5oPgorIyAgaW5jbHVkZSA8c3RyaW5nLmg+CisjICBpbmNsdWRlIDxhc3NlcnQuaD4KKyMgZW5kaWYKKworIyBpZiBkZWZpbmVkIChfU1RMX0RFQlVHKQorCisjICBpZiBkZWZpbmVkICggRUhfVVNFX1NHSV9TVEwgKQorLy8gT3ZlcnJpZGUgYXNzZXJ0aW9uIGJlaGF2aW9yCisjICBpbmNsdWRlIDxjc3RkYXJnPgorLy8jICBpbmNsdWRlIDxzdGxkZWJ1Zy5oPgordm9pZCBTVExQT1JUOjpfX3N0bF9kZWJ1Z19tZXNzYWdlKGNvbnN0IGNoYXIgKiBmb3JtYXRfc3RyLCAuLi4pCit7CisgIHN0ZDo6dmFfbGlzdCBhcmdzOworICB2YV9zdGFydCggYXJncywgZm9ybWF0X3N0ciApOworICBjaGFyIG1zZ1syNTZdOworICBzdGQ6OnZzbnByaW50Zihtc2csIHNpemVvZihtc2cpL3NpemVvZigqbXNnKSAtIDEsIGZvcm1hdF9zdHIsIGFyZ3MgKTsKKyAgRGVidWdTdHIoIGMycHN0cihtc2cpICk7Cit9CisjICBlbHNlCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIF9fYXNzZXJ0aW9uX2ZhaWxlZCAgKG92ZXJyaWRlIHN0YW5kYXJkIGxpYnJhcnkgZnVuY3Rpb24pCisKKyAgRUZGRUNUUzogQnJlYWtzIGludG8gdGhlIGRlYnVnZ2VyIGFuZCBzaG93cyB0aGUgYXNzZXJ0aW9uLiBUaGlzIGltcGxlbWVudGF0aW9uCisgICAgICAgICAgIGlzIE1hYy1zcGVjaWZpYzsgb3RoZXJzIGNvdWxkIGJlIGFkZGVkIGZvciBvdGhlciBwbGF0Zm9ybXMuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworZXh0ZXJuICJDIgoreworICB2b2lkIF9fYXNzZXJ0aW9uX2ZhaWxlZChjaGFyICpjb25kaXRpb24sIGNoYXIgKnRlc3RmaWxlbmFtZSwgaW50IGxpbmVubyk7CisgIHZvaWQgX19hc3NlcnRpb25fZmFpbGVkKGNoYXIgKmNvbmRpdGlvbiwgY2hhciAqdGVzdGZpbGVuYW1lLCBpbnQgbGluZW5vKQorICB7CisgICAgICBjaGFyIG1zZ1syNTZdOworICAgICAgc3RkOjpzdHJuY3B5KCBtc2csIGNvbmRpdGlvbiwgMjU1ICk7CisgICAgICBzdGQ6OnN0cm5jYXQoIG1zZywgIjogIiwgMjU1ICk7CisgICAgICBzdGQ6OnN0cm5jYXQoICBtc2csIHRlc3RmaWxlbmFtZSwgMjU1ICk7CisgICAgICBzdGQ6OnN0cm5jYXQoIG1zZywgIiwgIiwgMjU1ICk7CisgICAgICBjaGFyIGxpbmVbMjBdOworICAgICAgc3RkOjpzcHJpbnRmKCBsaW5lLCAiJWQiLCBsaW5lbm8gKTsKKyAgICAgIHN0ZDo6c3RybmNhdCggIG1zZywgbGluZSwgMjU1ICk7CisgICAgICBEZWJ1Z1N0ciggYzJwc3RyKCBtc2cgKSApOworICB9Cit9CisjICBlbmRpZgorCisjIGVuZGlmCisKKyNlbmRpZgorCisjaW5jbHVkZSAibmNfYWxsb2MuaCIKKworI2lmIGRlZmluZWQgKEVIX05FV19IRUFERVJTKQorIyBpbmNsdWRlIDx2ZWN0b3I+CisjIGluY2x1ZGUgPGNzdHJpbmc+CisjIGVsc2UKKyMgaW5jbHVkZSA8dmVjdG9yLmg+CisjIGluY2x1ZGUgPHN0cmluZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJUZXN0Q2xhc3MuaCIKKyNpbmNsdWRlICJMZWFrQ2hlY2suaCIKKyNpbmNsdWRlICJ0ZXN0X2NvbnN0cnVjdC5oIgorI2lmZGVmIF9fQk9STEFORENfXworIyBpbmNsdWRlIDxleGNlcHQuaD4KKyNlbmRpZgorCisjIGlmIGRlZmluZWQoRUhfVVNFX05BTUVTUEFDRVMpCituYW1lc3BhY2UgIC8vIGR3YSAxLzIxLzAwIC0gbXVzdCB1c2UgdW5uYW1lZCBuYW1lc3BhY2UgaGVyZSB0byBhdm9pZCBjb25mbGljdCB1bmRlciBnY2MgdXNpbmcgbmF0aXZlIHN0cmVhbXMKK3sKKyAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyAgLy8gdXNpbmcgc3RkOjpjZXJyOworICAvLyB1c2luZyBzdGQ6OmVuZGw7Cit9CisjIGVuZGlmCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICB1c2FnZSAgKGZpbGUtc3RhdGljIGhlbHBlcikKKworICBFRkZFQ1RTOiBQcmludHMgYSBtZXNzYWdlIGRlc2NyaWJpbmcgdGhlIGNvbW1hbmQtbGluZSBwYXJhbWV0ZXJzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHZvaWQgdXNhZ2UoY29uc3QgY2hhciogbmFtZSkKK3sKKyAgICBjZXJyPDwiVXNhZ2UgOiAiPDxuYW1lPDwiIFstbiA8aXRlcmF0aW9ucz5dIFstcyA8c2l6ZT5dIFstbF0gWy1lXSBbLXFdL1stdl0gWy10XSBbdGVzdF9uYW1lLi4uXVxuIjsKKyAgICBjZXJyPDwiXHRbLW4gPGl0ZXJhdGlvbnM+XSA6IG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMsIGRlZmF1bHQ9PTEwMDsiPDxlbmRsOworICAgIGNlcnI8PCJcdFstcyA8c2l6ZT5dIDogYmFzZSB2YWx1ZSBmb3IgcmFuZG9tIGNvbnRhaW5lciBzaXplcywgZGVmYXVsdD09MTAwMDsiPDxlbmRsOworICAgIGNlcnI8PCJcdFstZV0gOiBkb24ndCB0aHJvdyBleGNlcHRpb25zLCB0ZXN0IGZvciBsZWFrIGluIG5vcm1hbCBjb25kaXRpb25zOyI8PGVuZGw7CisvLyBUaGlzIG9wdGlvbiB3YXMgbmV2ZXIgYWN0dWFsbHkgdXNlZCAtLSBkd2EgOS8yMi85NworLy8gICAgY2Vycjw8Ilx0Wy1pXSA6IGlnbm9yZSBsZWFrIGVycm9yczsiPDxlbmRsOworICAgIGNlcnI8PCJcdFstcV0gOiBxdWlldCBtb2RlOyI8PGVuZGw7CisgICAgY2Vycjw8Ilx0Wy12XSA6IHZlcmJvc2UgbW9kZTsiPDxlbmRsOworICAgIGNlcnI8PCJcdFstdF0gOiB0cmFjayBlYWNoIGFsbG9jYXRpb247Ijw8ZW5kbDsKKyAgICBjZXJyPDwiXHRbdGVzdCBuYW1lIFt0ZXN0IG5hbWUuLi5dXSA6IHJ1biBvbmx5IHNvbWUgb2YgdGhlIHRlc3RzIGJ5IG5hbWUgKGRlZmF1bHQ9PWFsbCB0ZXN0cyk6Ijw8ZW5kbDsKKyAgICBjZXJyPDwiXHRcdHBvc3NpYmxlIHRlc3QgbmFtZXMgYXJlIDogYWxnbyB2ZWN0b3IgYml0X3ZlY3RvciBsaXN0IHNsaXN0IGRlcXVlIHNldCBtYXAgaGFzaF9zZXQgaGFzaF9tYXAgcm9wZSBzdHJpbmcgYml0c2V0IHZhbGFycmF5Ijw8ZW5kbDsKKyAgICBFSF9DU1REOjpleGl0KDEpOworfQorCisjaWZkZWYgRUhfTkVXX0hFQURFUlMKKyMgIGluY2x1ZGUgPHNldD4KKyNlbHNlCisjICBpbmNsdWRlIDxzZXQuaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZChfV0lOMzJfV0NFKQorI2luY2x1ZGUgPGZzdHJlYW0+CisjZW5kaWYKKworaW50IF9TVExQX0NBTEwgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7CisjaWYgZGVmaW5lZChfV0lOMzJfV0NFKQorICBzdGQ6Om9mc3RyZWFtIGZpbGUoICJcXGVoX3Rlc3QudHh0IiApOworICBzdGQ6OnN0cmVhbWJ1Ziogb2xkX2NvdXRfYnVmID0gY291dC5yZGJ1ZihmaWxlLnJkYnVmKCkpOworICBzdGQ6OnN0cmVhbWJ1Ziogb2xkX2NlcnJfYnVmID0gY2Vyci5yZGJ1ZihmaWxlLnJkYnVmKCkpOworI2VuZGlmCisjaWYgZGVmaW5lZCggX19NV0VSS1NfXyApICYmIGRlZmluZWQoIG1hY2ludG9zaCApICAvLyBHZXQgY29tbWFuZCBsaW5lLgorICBhcmdjID0gY2NvbW1hbmQoJmFyZ3YpOworICAvLyBBbGxvdyB0aGUgaS9vIHdpbmRvdyB0byBiZSByZXBvc2l0aW9uZWQuCisvLyAgRUhfU1REOjpzdHJpbmcgczsKKy8vICBnZXRsaW5lKEVIX1NURDo6Y2luLCBzKTsKKyNlbmRpZgorICAgIHVuc2lnbmVkIGludCBuaXRlcnM9MjsKKyAgICBib29sIHJ1bl9hbGw9dHJ1ZTsKKyAgICBib29sIHJ1bl9zbGlzdCA9IGZhbHNlOworICAgIGJvb2wgcnVuX2xpc3QgPSBmYWxzZTsKKyAgICBib29sIHJ1bl92ZWN0b3IgPSBmYWxzZTsKKyAgICBib29sIHJ1bl9iaXRfdmVjdG9yID0gZmFsc2U7CisgICAgYm9vbCBydW5fZGVxdWUgPSBmYWxzZTsKKyAgICBib29sIHJ1bl9oYXNoX21hcCA9IGZhbHNlOworICAgIGJvb2wgcnVuX2hhc2hfc2V0ID0gZmFsc2U7CisgICAgYm9vbCBydW5fc2V0ID0gZmFsc2U7CisgICAgYm9vbCBydW5fbWFwID0gZmFsc2U7CisgICAgYm9vbCBydW5fYWxnbyA9IGZhbHNlOworICAgIGJvb2wgcnVuX2FsZ29iYXNlID0gZmFsc2U7CisgICAgYm9vbCBydW5fcm9wZSA9IGZhbHNlOworICAgIGJvb2wgcnVuX3N0cmluZyA9IGZhbHNlOworICAgIGJvb2wgcnVuX2JpdHNldCA9IGZhbHNlOworICAgIGJvb2wgcnVuX3ZhbGFycmF5ID0gZmFsc2U7CisKKyAgICBpbnQgY3VyX2FyZ3Y7CisgICAgY2hhciAqcCwgKnAxOworI2lmIGRlZmluZWQgKEVIX05FV19JT1NUUkVBTVMpCisgICAgc3RkOjppb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKKyNlbmRpZgorCisgICAgY2VyciA8PCBhcmd2WzBdPDwiIDogRXhjZXB0aW9uIGhhbmRsaW5nIHRlc3RzdWl0ZS5cbiI7CisgICAgY2Vyci5mbHVzaCgpOworCisgIGJvb2wgdHJhY2tfYWxsb2NhdGlvbnMgPSBmYWxzZTsKKyAgICAvLyBwYXJzZSBwYXJhbWV0ZXJzIDoKKyAgICAvLyBsZWFrX3Rlc3QgWy1pdGVyYXRpb25zXSBbLXRlc3RdIC4uLgorICAgIGZvciAoY3VyX2FyZ3Y9MTsgY3VyX2FyZ3Y8YXJnYzsgY3VyX2FyZ3YrKykgeworICAgICAgICBwID0gYXJndltjdXJfYXJndl07CisgICAgICAgIGlmICgqcCA9PSAnLScpIHsKKyAgICAgICAgICAgIHN3aXRjaCAocFsxXSkgeworICAgICAgICAgICAgY2FzZSAncSc6CisgICAgICAgICAgICAgICAgZ1Rlc3RDb250cm9sbGVyLlNldFZlcmJvc2UoZmFsc2UpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAndic6CisgICAgICAgICAgICAgICAgZ1Rlc3RDb250cm9sbGVyLlNldFZlcmJvc2UodHJ1ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisjaWYgMCAgLy8gVGhpcyBvcHRpb24gd2FzIG5ldmVyIGFjdHVhbGx5IHVzZWQgLS0gZHdhIDkvMjIvOTcKKyAgICAgICAgICAgIGNhc2UgJ2knOgorICAgICAgICAgICAgICAgIGdUZXN0Q29udHJvbGxlci5JZ25vcmVMZWFrcyh0cnVlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgICAgICAgY2FzZSAnbic6CisgICAgICAgICAgICAgICAgcDEgPSBhcmd2WysrY3VyX2FyZ3ZdOworICAgICAgICAgICAgICAgIGlmIChwMSAmJiBFSF9DU1REOjpzc2NhbmYocDEsICIlaSIsICZuaXRlcnMpPT0xKQorICAgICAgICAgICAgICAgICAgICBjZXJyIDw8IiBEb2luZyAiPDxuaXRlcnM8PCIgaXRlcmF0aW9uc1xuIjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHVzYWdlKGFyZ3ZbMF0pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAndCc6CisgICAgICAgICAgICAgIHRyYWNrX2FsbG9jYXRpb25zID0gdHJ1ZTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdlJzoKKyAgICAgICAgICAgICAgICBnVGVzdENvbnRyb2xsZXIuVHVybk9mZkV4Y2VwdGlvbnMoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ3MnOgorICAgICAgICAgICAgICAgIHAxID0gYXJndlsrK2N1cl9hcmd2XTsKKyAgICAgICAgICAgICAgICBpZiAocDEgJiYgRUhfQ1NURDo6c3NjYW5mKHAxLCAiJWkiLCAmcmFuZG9tX2Jhc2UpPT0xKQorICAgICAgICAgICAgICAgICAgICBjZXJyIDw8IiBTZXR0aW5nICAiPDxyYW5kb21fYmFzZTw8IiBhcyBiYXNlIGZvciByYW5kb20gc2l6ZXMuXG4iOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdXNhZ2UoYXJndlswXSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHVzYWdlKGFyZ3ZbMF0pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcnVuX2FsbCA9IGZhbHNlOworICAgICAgICAgICAgLy8gdGVzdCBuYW1lCisgICAgICAgICAgICBpZiAoRUhfQ1NURDo6c3RyY21wKHAsICJhbGdvIik9PTApIHsKKyAgICAgICAgICAgICAgICBydW5fYWxnbz10cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChFSF9DU1REOjpzdHJjbXAocCwgInZlY3RvciIpPT0wKSB7CisgICAgICAgICAgICAgICAgcnVuX3ZlY3Rvcj10cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChFSF9DU1REOjpzdHJjbXAocCwgImJpdF92ZWN0b3IiKT09MCkgeworICAgICAgICAgICAgICAgIHJ1bl9iaXRfdmVjdG9yPXRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKEVIX0NTVEQ6OnN0cmNtcChwLCAibGlzdCIpPT0wKSB7CisgICAgICAgICAgICAgICAgcnVuX2xpc3Q9dHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoRUhfQ1NURDo6c3RyY21wKHAsICJzbGlzdCIpPT0wKSB7CisgICAgICAgICAgICAgICAgcnVuX3NsaXN0PXRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKEVIX0NTVEQ6OnN0cmNtcChwLCAiZGVxdWUiKT09MCkgeworICAgICAgICAgICAgICAgIHJ1bl9kZXF1ZT10cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChFSF9DU1REOjpzdHJjbXAocCwgInNldCIpPT0wKSB7CisgICAgICAgICAgICAgICAgcnVuX3NldD10cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChFSF9DU1REOjpzdHJjbXAocCwgIm1hcCIpPT0wKSB7CisgICAgICAgICAgICAgICAgcnVuX21hcD10cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChFSF9DU1REOjpzdHJjbXAocCwgImhhc2hfc2V0Iik9PTApIHsKKyAgICAgICAgICAgICAgICBydW5faGFzaF9zZXQ9dHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoRUhfQ1NURDo6c3RyY21wKHAsICJoYXNoX21hcCIpPT0wKSB7CisgICAgICAgICAgICAgICAgcnVuX2hhc2hfbWFwPXRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKEVIX0NTVEQ6OnN0cmNtcChwLCAicm9wZSIpPT0wKSB7CisgICAgICAgICAgICAgICAgcnVuX3JvcGU9dHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoRUhfQ1NURDo6c3RyY21wKHAsICJzdHJpbmciKT09MCkgeworICAgICAgICAgICAgICAgIHJ1bl9zdHJpbmc9dHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoRUhfQ1NURDo6c3RyY21wKHAsICJiaXRzZXQiKT09MCkgeworICAgICAgICAgICAgICAgIHJ1bl9iaXRzZXQ9dHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoRUhfQ1NURDo6c3RyY21wKHAsICJ2YWxhcnJheSIpPT0wKSB7CisgICAgICAgICAgICAgICAgcnVuX3ZhbGFycmF5PXRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHVzYWdlKGFyZ3ZbMF0pOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICB9CisKKyAgZ1Rlc3RDb250cm9sbGVyLlRyYWNrQWxsb2NhdGlvbnMoIHRyYWNrX2FsbG9jYXRpb25zICk7CisKKyAgICAvLyBPdmVyIGFuZCBvdmVyLi4uCisgICAgZm9yICggdW5zaWduZWQgaSA9IDA7IGkgPCBuaXRlcnMgOyBpKysgKQorICAgIHsKKyAgICAgY2VyciA8PCAiaXRlcmF0aW9uICMiIDw8IGkgPDwgIlxuIjsKKyAgICAgICAgaWYgKHJ1bl9hbGwgfHwgcnVuX2FsZ29iYXNlKSB7CisgICAgICAgICAgICBnVGVzdENvbnRyb2xsZXIuU2V0Q3VycmVudENvbnRhaW5lcigiYWxnb2Jhc2UiKTsKKyAgICAgICAgICAgIGNlcnIgPDwgIkVIIHRlc3QgOiBhbGdvYmFzZSIgPDwgZW5kbDsKKyAgICAgICAgICAgIHRlc3RfYWxnb2Jhc2UoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocnVuX2FsbCB8fCBydW5fYWxnbykgeworICAgICAgICAgICAgZ1Rlc3RDb250cm9sbGVyLlNldEN1cnJlbnRDb250YWluZXIoImFsZ28iKTsKKyAgICAgICAgICAgIGNlcnIgPDwgIkVIIHRlc3QgOiBhbGdvIiA8PCBlbmRsOworICAgICAgICAgICAgdGVzdF9hbGdvKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocnVuX2FsbCB8fCBydW5fdmVjdG9yKSB7CisgICAgICAgICAgICBnVGVzdENvbnRyb2xsZXIuU2V0Q3VycmVudENvbnRhaW5lcigidmVjdG9yIik7CisgICAgICAgICAgICBjZXJyIDw8ICJFSCB0ZXN0IDogdmVjdG9yIiA8PCBlbmRsOworICAgICAgICAgICAgdGVzdF92ZWN0b3IoKTsKKyAgICAgICAgfQorCisjaWYgZGVmaW5lZCggRUhfQklUX1ZFQ1RPUl9JTVBMRU1FTlRFRCApCisgICAgICAgIGlmIChydW5fYWxsIHx8IHJ1bl9iaXRfdmVjdG9yKSB7CisgICAgICAgICAgICBnVGVzdENvbnRyb2xsZXIuU2V0Q3VycmVudENvbnRhaW5lcigiYml0X3ZlY3RvciIpOworICAgICAgICAgICBjZXJyIDw8ICJFSCB0ZXN0IDogYml0X3ZlY3RvciIgPDwgZW5kbDsKKyAgICAgICAgICAgIHRlc3RfYml0X3ZlY3RvcigpOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICBpZiAocnVuX2FsbCB8fCBydW5fbGlzdCkgeworICAgICAgICAgICAgZ1Rlc3RDb250cm9sbGVyLlNldEN1cnJlbnRDb250YWluZXIoImxpc3QiKTsKKyAgICAgICAgICAgIGNlcnIgPDwgIkVIIHRlc3QgOiBsaXN0IiA8PCBlbmRsOworICAgICAgICAgICAgdGVzdF9saXN0KCk7CisgICAgICAgIH0KKworI2lmIGRlZmluZWQoIEVIX1NMSVNUX0lNUExFTUVOVEVEICkKKyAgICAgICAgaWYgKHJ1bl9hbGwgfHwgcnVuX3NsaXN0KSB7CisgICAgICAgICAgICBnVGVzdENvbnRyb2xsZXIuU2V0Q3VycmVudENvbnRhaW5lcigic2xpc3QiKTsKKyAgICAgICAgICAgIGNlcnIgPDwgIkVIIHRlc3QgOiBzbGlzdCIgPDwgZW5kbDsKKyAgICAgICAgICAgIHRlc3Rfc2xpc3QoKTsKKyAgICAgICAgfQorI2VuZGlmIC8vIEVIX1NMSVNUX0lNUExFTUVOVEVECisKKyAgICAgICAgaWYgKHJ1bl9hbGwgfHwgcnVuX2RlcXVlKSB7CisgICAgICAgICAgICBnVGVzdENvbnRyb2xsZXIuU2V0Q3VycmVudENvbnRhaW5lcigiZGVxdWUiKTsKKyAgICAgICAgICAgIGNlcnIgPDwgIkVIIHRlc3QgOiBkZXF1ZSIgPDwgZW5kbDsKKyAgICAgICAgICAgIHRlc3RfZGVxdWUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocnVuX2FsbCB8fCBydW5fc2V0KSB7CisgICAgICAgICAgICBnVGVzdENvbnRyb2xsZXIuU2V0Q3VycmVudENvbnRhaW5lcigic2V0Iik7CisgICAgICAgICAgICBjZXJyIDw8ICJFSCB0ZXN0IDogc2V0IiA8PCBlbmRsOworICAgICAgICAgICAgdGVzdF9zZXQoKTsKKyAgICAgICAgICAgIGdUZXN0Q29udHJvbGxlci5TZXRDdXJyZW50Q29udGFpbmVyKCJtdWx0aXNldCIpOworICAgICAgICAgICAgY2VyciA8PCAiRUggdGVzdCA6IG11bHRpc2V0IiA8PCBlbmRsOworICAgICAgICAgICAgdGVzdF9tdWx0aXNldCgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJ1bl9hbGwgfHwgcnVuX21hcCkgeworICAgICAgICAgICAgZ1Rlc3RDb250cm9sbGVyLlNldEN1cnJlbnRDb250YWluZXIoIm1hcCIpOworICAgICAgICAgICAgY2VyciA8PCAiRUggdGVzdCA6IG1hcCIgPDwgZW5kbDsKKyAgICAgICAgICAgIHRlc3RfbWFwKCk7CisgICAgICAgICAgICBnVGVzdENvbnRyb2xsZXIuU2V0Q3VycmVudENvbnRhaW5lcigibXVsdGltYXAiKTsKKyAgICAgICAgICAgIGNlcnIgPDwgIkVIIHRlc3QgOiBtdWx0aW1hcCIgPDwgZW5kbDsKKyAgICAgICAgICAgIHRlc3RfbXVsdGltYXAoKTsKKyAgICAgICAgfQorCisjaWYgZGVmaW5lZCggRUhfSEFTSEVEX0NPTlRBSU5FUlNfSU1QTEVNRU5URUQgKQorICAgICAgICBpZiAocnVuX2FsbCB8fCBydW5faGFzaF9tYXApIHsKKyAgICAgICAgICAgIGdUZXN0Q29udHJvbGxlci5TZXRDdXJyZW50Q29udGFpbmVyKCJoYXNoX21hcCIpOworICAgICAgICAgICAgY2VyciA8PCAiRUggdGVzdCA6IGhhc2hfbWFwIiA8PCBlbmRsOworICAgICAgICAgICAgdGVzdF9oYXNoX21hcCgpOworICAgICAgICAgICAgZ1Rlc3RDb250cm9sbGVyLlNldEN1cnJlbnRDb250YWluZXIoImhhc2hfbXVsdGltYXAiKTsKKyAgICAgICAgICAgIGNlcnIgPDwgIkVIIHRlc3QgOiBoYXNoX211bHRpbWFwIiA8PCBlbmRsOworICAgICAgICAgICAgdGVzdF9oYXNoX211bHRpbWFwKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocnVuX2FsbCB8fCBydW5faGFzaF9zZXQpIHsKKyAgICAgICAgICAgIGdUZXN0Q29udHJvbGxlci5TZXRDdXJyZW50Q29udGFpbmVyKCJoYXNoX3NldCIpOworICAgICAgICAgICAgY2VyciA8PCAiRUggdGVzdCA6IGhhc2hfc2V0IiA8PCBlbmRsOworICAgICAgICAgICAgdGVzdF9oYXNoX3NldCgpOworICAgICAgICAgICAgZ1Rlc3RDb250cm9sbGVyLlNldEN1cnJlbnRDb250YWluZXIoImhhc2hfbXVsdGlzZXQiKTsKKyAgICAgICAgICAgIGNlcnIgPDwgIkVIIHRlc3QgOiBoYXNoX211bHRpc2V0IiA8PCBlbmRsOworICAgICAgICAgICAgdGVzdF9oYXNoX211bHRpc2V0KCk7CisgICAgICAgIH0KKyNlbmRpZiAvLyBFSF9IQVNIRURfQ09OVEFJTkVSU19JTVBMRU1FTlRFRAorCisjaWYgZGVmaW5lZCggRUhfUk9QRV9JTVBMRU1FTlRFRCApCisgIC8vIENXMS44IGNhbid0IGNvbXBpbGUgdGhpcyBmb3Igc29tZSByZWFzb24hCisjaWYgISggZGVmaW5lZChfX01XRVJLU19fKSAmJiBfX01XRVJLU19fIDwgMHgxOTAwICkKKyAgICAgICAgaWYgKHJ1bl9hbGwgfHwgcnVuX3JvcGUpIHsKKyAgICAgICAgICAgIGdUZXN0Q29udHJvbGxlci5TZXRDdXJyZW50Q29udGFpbmVyKCJyb3BlIik7CisgICAgICAgICAgICBjZXJyIDw8ICJFSCB0ZXN0IDogcm9wZSIgPDwgZW5kbDsKKyAgICAgICAgICAgIHRlc3Rfcm9wZSgpOworICAgICAgICB9CisjZW5kaWYKKyNlbmRpZiAvLyBFSF9ST1BFX0lNUExFTUVOVEVECisjaWYgZGVmaW5lZCggRUhfU1RSSU5HX0lNUExFTUVOVEVEICkKKyAgICAgICAgaWYgKHJ1bl9hbGwgfHwgcnVuX3N0cmluZykgeworICAgICAgICAgICAgZ1Rlc3RDb250cm9sbGVyLlNldEN1cnJlbnRDb250YWluZXIoInN0cmluZyIpOworICAgICAgICAgICAgY2VyciA8PCAiRUggdGVzdCA6IHN0cmluZyIgPDwgZW5kbDsKKyAgICAgICAgICAgIHRlc3Rfc3RyaW5nKCk7CisgICAgICAgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoIEVIX0JJVFNFVF9JTVBMRU1FTlRFRCApCisgICAgICAgIGlmIChydW5fYWxsIHx8IHJ1bl9iaXRzZXQpIHsKKyAgICAgICAgICAgIGdUZXN0Q29udHJvbGxlci5TZXRDdXJyZW50Q29udGFpbmVyKCJiaXRzZXQiKTsKKyAgICAgICAgICAgIGNlcnIgPDwgIkVIIHRlc3QgOiBiaXRzZXQiIDw8IGVuZGw7CisgICAgICAgICAgICB0ZXN0X2JpdHNldCgpOworICAgICAgICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKCBFSF9WQUxBUlJBWV9JTVBMRU1FTlRFRCApCisgICAgICAgIGlmIChydW5fYWxsIHx8IHJ1bl9iaXRzZXQpIHsKKyAgICAgICAgICAgIGdUZXN0Q29udHJvbGxlci5TZXRDdXJyZW50Q29udGFpbmVyKCJ2YWxhcnJheSIpOworICAgICAgICAgICAgY2VyciA8PCAiRUggdGVzdCA6IHZhbGFycmF5IiA8PCBlbmRsOworICAgICAgICAgICAgdGVzdF92YWxhcnJheSgpOworICAgICAgICB9CisjZW5kaWYKKyAgICB9CisKKyAgZ1Rlc3RDb250cm9sbGVyLlRyYWNrQWxsb2NhdGlvbnMoIGZhbHNlICk7CisKKyAgY2VyciA8PCAiRUggdGVzdCA6IERvbmVcbiI7CisKKyNpZiBkZWZpbmVkKF9XSU4zMl9XQ0UpCisgIGNvdXQucmRidWYob2xkX2NvdXRfYnVmKTsKKyAgY2Vyci5yZGJ1ZihvbGRfY2Vycl9idWYpOworICBmaWxlLmNsb3NlKCk7CisjZW5kaWYKKworICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvdGVzdC9laC9taW5ndzMyLm1hayBiL3Rlc3QvZWgvbWluZ3czMi5tYWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIxODNiYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZWgvbWluZ3czMi5tYWsKQEAgLTAsMCArMSwxMTEgQEAKKyMgOzs7IC0qLSBNb2RlOm1ha2VmaWxlOy0qLSAKKyMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBNYWtlZmlsZS5pbiBieSBjb25maWd1cmUuCisjIFRoaXMgcmVxdWlyZXMgR05VIG1ha2UuCisKK3NyY2RpciA9IC4KK1ZQQVRIID0gLgorCisjIHBvaW50IHRoaXMgdG8gcHJvcGVyIGxvY2F0aW9uCitTVExfSU5DTD0tSS4uLy4uL3N0bHBvcnQKKworQVVYX0xJU1Q9VGVzdENsYXNzLmNwcCBtYWluLmNwcCBuY19hbGxvYy5jcHAgcmFuZG9tX251bWJlci5jcHAKKworVEVTVF9MSVNUPXRlc3RfYWxnby5jcHAgIFwKK3Rlc3RfYWxnb2Jhc2UuY3BwICAgICB0ZXN0X2xpc3QuY3BwIHRlc3Rfc2xpc3QuY3BwIFwKK3Rlc3RfYml0X3ZlY3Rvci5jcHAgICB0ZXN0X3ZlY3Rvci5jcHAgXAordGVzdF9kZXF1ZS5jcHAgdGVzdF9zZXQuY3BwIHRlc3RfbWFwLmNwcCBcCit0ZXN0X2hhc2hfbWFwLmNwcCAgdGVzdF9oYXNoX3NldC5jcHAgdGVzdF9yb3BlLmNwcCBcCit0ZXN0X3N0cmluZy5jcHAgdGVzdF9iaXRzZXQuY3BwIHRlc3RfdmFsYXJyYXkuY3BwCisKK0xJU1Q9JHtBVVhfTElTVH0gJHtURVNUX0xJU1R9CisKK09CSkVDVFMgPSAkKExJU1Q6JS5jcHA9b2JqLyUubykgJChTVEFUX01PRFVMRSkKK0RfT0JKRUNUUyA9ICQoTElTVDolLmNwcD1kX29iai8lLm8pICQoU1RBVF9NT0RVTEUpCitOT1NHSV9PQkpFQ1RTID0gJChMSVNUOiUuY3BwPW5vc2dpX29iai8lLm8pICQoU1RBVF9NT0RVTEUpCisKK0VYRUNTID0gJChMSVNUOiUuY3BwPSUpCitURVNUUyA9ICQoTElTVDolLmNwcD0lLm91dCkKK1RFU1RfRVhFICA9IC4vZWhfdGVzdAorRF9URVNUX0VYRSA9IC4vZWhfdGVzdF9kCitOT1NHSV9URVNUX0VYRSA9IC4vZWhfdGVzdF9ub3NnaQorCitURVNUICA9IC4vZWhfdGVzdC5vdXQKK0RfVEVTVCA9IC4vZWhfdGVzdF9kLm91dAorTk9TR0lfVEVTVCA9IC4vZWhfdGVzdF9ub3NnaS5vdXQKKworQ0MgPSBjKysKK0NYWCA9ICQoQ0MpCisKKyMgZHdhIDEyLzIyLzk5IC0tIGhhZCB0byB0dXJuIG9mZiAtYW5zaSBmbGFnIHNvIHdlIGNvdWxkIHVzZSBTR0kgSU9TVFJFQU1TCisjIGFsc28sIHRlc3Rfc2xpc3Qgd29uJ3QgY29tcGlsZSB3aXRoIC1PMy8tTzIgd2hlbiB0YXJnZXRpbmcgUFBDLiBJdCBmYWlscyAKKyMgaW4gdGhlIGFzc2VtYmxlciB3aXRoICdpbnZhbGlkIHJlbG9jYXRpb24gdHlwZScKK0NYWEZMQUdTID0gLVdhbGwgLWcgLU8gJHtTVExfSU5DTH0gLUkuICR7Q1hYX0VYVFJBX0ZMQUdTfSAtREVIX1ZFQ1RPUl9PUEVSQVRPUl9ORVcKK0RfQ1hYRkxBR1MgPSAtV2FsbCAtZyAtTyAke1NUTF9JTkNMfSAtSS4gJHtDWFhfRVhUUkFfRkxBR1N9IC1ERUhfVkVDVE9SX09QRVJBVE9SX05FVyAtRF9TVExQX0RFQlVHIC1EX1NUTFBfVVNFX1NUQVRJQ19MSUIKK05PU0dJX0NYWEZMQUdTID0gLVdhbGwgLWcgLU8yICR7U1RMX0lOQ0x9IC1JLiAke0NYWF9FWFRSQV9GTEFHU30gLURfU1RMUF9OT19PV05fSU9TVFJFQU1TIC1EX1NUTFBfREVCVUdfVU5JTklUSUFMSVpFRCAtREVIX1ZFQ1RPUl9PUEVSQVRPUl9ORVcKKworY2hlY2s6ICQoVEVTVCkKKworTElCUyA9IC1sbSAKKworRF9MSUJTVExQT1JUID0gLUwuLi8uLi9saWIgLWxzdGxwb3J0X21pbmd3MzJfZGVidWdfc3RhdGljCitMSUJTVExQT1JUID0gLUwuLi8uLi9saWIgLWxzdGxwb3J0X21pbmd3MzJfc3RhdGljCisKK2FsbDogJChURVNUX0VYRSkgJChEX1RFU1RfRVhFKSAkKE5PU0dJX1RFU1RfRVhFKQorCitjaGVja19ub3NnaTogJChOT1NHSV9URVNUKQorY2hlY2tfZDogJChEX1RFU1QpCisKKworJChURVNUX0VYRSkgOiAkKE9CSkVDVFMpCisJJChDWFgpICQoQ1hYRkxBR1MpICQoT0JKRUNUUykgJChMSUJTVExQT1JUKSAkKExJQlMpIC1vICQoVEVTVF9FWEUpCisKKyQoRF9URVNUX0VYRSkgOiAkKERfT0JKRUNUUykKKwkkKENYWCkgJChEX0NYWEZMQUdTKSAkKERfT0JKRUNUUykgJChEX0xJQlNUTFBPUlQpICQoTElCUykgLW8gJChEX1RFU1RfRVhFKQorCiskKE5PU0dJX1RFU1RfRVhFKSA6ICQoTk9TR0lfT0JKRUNUUykKKwkkKENYWCkgJChOT1NHSV9DWFhGTEFHUykgJChOT1NHSV9PQkpFQ1RTKSAkKExJQlMpIC1vICQoTk9TR0lfVEVTVF9FWEUpCisKKworJChURVNUKSA6ICQoVEVTVF9FWEUpCisJJChURVNUX0VYRSkKKworJChEX1RFU1QpIDogJChEX1RFU1RfRVhFKQorCSQoRF9URVNUX0VYRSkKKworJChOT1NHSV9URVNUKSA6ICQoTk9TR0lfVEVTVF9FWEUpCisJJChOT1NHSV9URVNUX0VYRSkKKworU1VGRklYRVM6IC5jcHAuby5leGUub3V0LnJlcworCitub3NnaV9vYmovJS5vIDogJS5jcHAKKwkkKENYWCkgJChOT1NHSV9DWFhGTEFHUykgJDwgLWMgLW8gJEAKKworZF9vYmovJS5vIDogJS5jcHAKKwkkKENYWCkgJChEX0NYWEZMQUdTKSAkPCAtYyAtbyAkQAorCitvYmovJS5vIDogJS5jcHAKKwkkKENYWCkgJChDWFhGTEFHUykgJDwgLWMgLW8gJEAKKworbm9zZ2lfb2JqLyUuaSA6ICUuY3BwCisJJChDWFgpICQoTk9TR0lfQ1hYRkxBR1MpICQ8IC1FIC1IID4gJEAKKworZF9vYmovJS5pIDogJS5jcHAKKwkkKENYWCkgJChEX0NYWEZMQUdTKSAkPCAtRSAtSCA+ICRACisKK29iai8lLmkgOiAlLmNwcAorCSQoQ1hYKSAkKENYWEZMQUdTKSAkPCAtRSAtSCA+ICRACisKKyUub3V0OiAlLmNwcAorCSQoQ1hYKSAkKENYWEZMQUdTKSAkPCAtYyAtVVNJTkdMRSAtRE1BSU4gLWcgLW8gJCoubworCSQoQ1hYKSAkKENYWEZMQUdTKSAkKi5vICQoTElCUykgLW8gJCoKKwkuLyQqID4gJEAKKwktcm0gLWYgJCoKKworJS5zOiAlLmNwcAorCSQoQ1hYKSAkKENYWEZMQUdTKSAtTzQgLVMgLXB0byAkPCAgLW8gJEAKKworJS5FOiAlLmNwcAorCSQoQ1hYKSAkKENYWEZMQUdTKSAtRSAkPCAgLW8gJEAKKworY2xlYW46CisJLXJtIC1mciAke1RFU1RfRVhFfSAqLm8gKi8qLm8gKi5ycG8gKi5vYmogKi5vdXQgY29yZSAqfiBUZW1wbGF0ZXMuREIKZGlmZiAtLWdpdCBhL3Rlc3QvZWgvbXdlcmtzX2NvbnNvbGVfT1NfWC5jIGIvdGVzdC9laC9td2Vya3NfY29uc29sZV9PU19YLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU5N2ZjYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZWgvbXdlcmtzX2NvbnNvbGVfT1NfWC5jCkBAIC0wLDAgKzEsMTkzIEBACisvKiBNZXRyb3dlcmtzIFN0YW5kYXJkIExpYnJhcnkKKyAqIENvcHlyaWdodCCpIDE5OTUtMjAwMiBNZXRyb3dlcmtzIENvcnBvcmF0aW9uLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAkRGF0ZSQKKyAqICRSZXZpc2lvbiQKKyAqLworCisjaW5jbHVkZSA8YW5zaV9wYXJtcy5oPgorI2luY2x1ZGUgPHNpemVfdC5oPgorI2luY2x1ZGUgPGNvbnNvbGUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2lmIF9fTUFDSF9fCisgIHNob3J0IEluc3RhbGxDb25zb2xlKHNob3J0IGZkKQorICB7CisgICNwcmFnbWEgdW51c2VkIChmZCkKKworICAgIHJldHVybiAwOworICB9CisjZWxzZQorICAjaW5jbHVkZSA8Q2FyYm9uLmg+CisKKyAgdHlwZWRlZiBpbnQgKCpSZWFkUHRyKShpbnQsIHZvaWQgKiwgX19zdGQoc2l6ZV90KSk7CisgIHR5cGVkZWYgaW50ICgqV3JpdGVQdHIpKGludCwgY29uc3Qgdm9pZCAqLCBfX3N0ZChzaXplX3QpKTsKKworICBzdGF0aWMgc3RydWN0CisgIHsKKyAgICBCb29sZWFuIGlzTG9hZGVkOworICAgIENGQnVuZGxlUmVmIHRoZUJ1bmRsZTsKKyAgICBSZWFkUHRyIHRoZVJlYWQ7CisgICAgV3JpdGVQdHIgdGhlV3JpdGU7CisgIH0gX19tc2xfb3NfeDsKKworICBzdGF0aWMgT1NFcnIgX19tc2xfQ3JlYXRlRnJhbWV3b3JrQnVuZGxlRnJvbU5hbWUoQ0ZTdHJpbmdSZWYgdGhlRnJhbWV3b3JrTmFtZSwKKyAgICBDRkJ1bmRsZVJlZiAqdGhlQnVuZGxlKQorICB7CisgICAgT1NFcnIgdGhlRXJyOworICAgIEZTUmVmIHRoZVJlZjsKKyAgICBDRlVSTFJlZiB0aGVGcmFtZXdvcmtVUkw7CisgICAgQ0ZVUkxSZWYgdGhlQnVuZGxlVVJMOworCisgICAgLyogRmluZCB0aGUgZm9sZGVyIGNvbnRhaW5pbmcgYWxsIHRoZSBmcmFtZXdvcmtzICovCisgICAgdGhlRXJyID0gRlNGaW5kRm9sZGVyKGtPbkFwcHJvcHJpYXRlRGlzaywga0ZyYW1ld29ya3NGb2xkZXJUeXBlLCBmYWxzZSwgJnRoZVJlZik7CisKKyAgICBpZiAodGhlRXJyID09IG5vRXJyKQorICAgIHsKKyAgICAgIC8qIFR1cm4gdGhlIGZyYW1ld29yayBmb2xkZXIgRlNSZWYgaW50byBhIENGVVJMICovCisgICAgICB0aGVGcmFtZXdvcmtVUkwgPSBDRlVSTENyZWF0ZUZyb21GU1JlZihrQ0ZBbGxvY2F0b3JTeXN0ZW1EZWZhdWx0LCAmdGhlUmVmKTsKKworICAgICAgaWYgKHRoZUZyYW1ld29ya1VSTCAhPSBOVUxMKQorICAgICAgeworICAgICAgICAvKiBDcmVhdGUgYSBDRlVSTCBwb2ludGluZyB0byB0aGUgZGVzaXJlZCBmcmFtZXdvcmsgKi8KKyAgICAgICAgdGhlQnVuZGxlVVJMID0gQ0ZVUkxDcmVhdGVDb3B5QXBwZW5kaW5nUGF0aENvbXBvbmVudChrQ0ZBbGxvY2F0b3JTeXN0ZW1EZWZhdWx0LAorICAgICAgICAgIHRoZUZyYW1ld29ya1VSTCwgdGhlRnJhbWV3b3JrTmFtZSwgZmFsc2UpOworCisgICAgICAgIENGUmVsZWFzZSh0aGVGcmFtZXdvcmtVUkwpOworCisgICAgICAgIGlmICh0aGVCdW5kbGVVUkwgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIC8qIFR1cm4gdGhlIENGVVJMIGludG8gYSBidW5kbGUgcmVmZXJlbmNlICovCisgICAgICAgICAgKnRoZUJ1bmRsZSA9IENGQnVuZGxlQ3JlYXRlKGtDRkFsbG9jYXRvclN5c3RlbURlZmF1bHQsIHRoZUJ1bmRsZVVSTCk7CisKKyAgICAgICAgICBDRlJlbGVhc2UodGhlQnVuZGxlVVJMKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0aGVFcnI7CisgIH0KKworICBzaG9ydCBJbnN0YWxsQ29uc29sZShzaG9ydCBmZCkKKyAgeworICAjcHJhZ21hIHVudXNlZCAoZmQpCisgICAgT1NFcnIgdGhlRXJyOworICAgIHNob3J0IHRoZVJlc3VsdDsKKworICAgIHRoZVJlc3VsdCA9IC0xOworCisgICAgLyogU3RhcnQgd2l0aCBubyBidW5kbGUgKi8KKyAgICBfX21zbF9vc194LmlzTG9hZGVkID0gZmFsc2U7CisgICAgX19tc2xfb3NfeC50aGVCdW5kbGUgPSBOVUxMOworICAgIF9fbXNsX29zX3gudGhlUmVhZCA9IE5VTEw7CisgICAgX19tc2xfb3NfeC50aGVXcml0ZSA9IE5VTEw7CisKKyAgICAvKiBDcmVhdGUgYSBidW5kbGUgcmVmZXJlbmNlIGJhc2VkIG9uIGl0cyBuYW1lICovCisgICAgdGhlRXJyID0gX19tc2xfQ3JlYXRlRnJhbWV3b3JrQnVuZGxlRnJvbU5hbWUoQ0ZTVFIoIlN5c3RlbS5mcmFtZXdvcmsiKSwKKyAgICAgICZfX21zbF9vc194LnRoZUJ1bmRsZSk7CisKKyAgICBpZiAoKHRoZUVyciA9PSBub0VycikgJiYgKF9fbXNsX29zX3gudGhlQnVuZGxlICE9IE5VTEwpKQorICAgIHsKKyAgICAgIHRoZVJlc3VsdCA9IDA7CisKKyAgICAgIF9fbXNsX29zX3guaXNMb2FkZWQgPSBDRkJ1bmRsZUxvYWRFeGVjdXRhYmxlKF9fbXNsX29zX3gudGhlQnVuZGxlKTsKKworICAgICAgaWYgKF9fbXNsX29zX3guaXNMb2FkZWQpCisgICAgICB7CisgICAgICAgIC8qIExvb2t1cCB0aGUgZnVuY3Rpb25zIGluIHRoZSBidW5kbGUgYnkgbmFtZSAqLworICAgICAgICBfX21zbF9vc194LnRoZVJlYWQgPSAoUmVhZFB0cikKKyAgICAgICAgICBDRkJ1bmRsZUdldEZ1bmN0aW9uUG9pbnRlckZvck5hbWUoX19tc2xfb3NfeC50aGVCdW5kbGUsIENGU1RSKCJyZWFkIikpOworICAgICAgICBfX21zbF9vc194LnRoZVdyaXRlID0gKFdyaXRlUHRyKQorICAgICAgICAgIENGQnVuZGxlR2V0RnVuY3Rpb25Qb2ludGVyRm9yTmFtZShfX21zbF9vc194LnRoZUJ1bmRsZSwgQ0ZTVFIoIndyaXRlIikpOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0aGVSZXN1bHQ7CisgIH0KKyNlbmRpZgorCit2b2lkIFJlbW92ZUNvbnNvbGUodm9pZCkKK3sKKyNpZiAhX19NQUNIX18KKyAgaWYgKF9fbXNsX29zX3gudGhlQnVuZGxlICE9IE5VTEwpCisgIHsKKyAgICBpZiAoX19tc2xfb3NfeC5pc0xvYWRlZCkKKyAgICB7CisgICAgICBfX21zbF9vc194LnRoZVJlYWQgPSBOVUxMOworICAgICAgX19tc2xfb3NfeC50aGVXcml0ZSA9IE5VTEw7CisKKyAgICAgIENGQnVuZGxlVW5sb2FkRXhlY3V0YWJsZShfX21zbF9vc194LnRoZUJ1bmRsZSk7CisgICAgICBfX21zbF9vc194LmlzTG9hZGVkID0gZmFsc2U7CisgICAgfQorCisgICAgQ0ZSZWxlYXNlKF9fbXNsX29zX3gudGhlQnVuZGxlKTsKKyAgICBfX21zbF9vc194LnRoZUJ1bmRsZSA9IE5VTEw7CisgIH0KKyNlbmRpZgorfQorCitsb25nIFdyaXRlQ2hhcnNUb0NvbnNvbGUoY2hhciAqYnVmZmVyLCBsb25nIG4pCit7CisjaWYgX19NQUNIX18KKyAgcmV0dXJuIHdyaXRlKDEsIGJ1ZmZlciwgbik7CisjZWxzZQorICAvKiBDYWxsIHRoZSBmdW5jdGlvbiBpZiBpdCB3YXMgZm91bmQgKi8KKyAgaWYgKF9fbXNsX29zX3gudGhlV3JpdGUgPT0gTlVMTCkKKyAgICByZXR1cm4gLTE7CisgIGVsc2UKKyAgICByZXR1cm4gX19tc2xfb3NfeC50aGVXcml0ZSgxLCBidWZmZXIsIG4pOworI2VuZGlmCit9CisKKyNpZiBfX01BQ0hfXworbG9uZyBXcml0ZUNoYXJzVG9FcnJvckNvbnNvbGUoY2hhciAqYnVmZmVyLCBsb25nIG4pCit7CisgIHJldHVybiB3cml0ZSgyLCBidWZmZXIsIG4pOworfQorI2VuZGlmCisKK2xvbmcgUmVhZENoYXJzRnJvbUNvbnNvbGUoY2hhciAqYnVmZmVyLCBsb25nIG4pCit7CisjaWYgX19NQUNIX18KKyAgcmV0dXJuIHJlYWQoMCwgYnVmZmVyLCBuKTsKKyNlbHNlCisgIC8qIENhbGwgdGhlIGZ1bmN0aW9uIGlmIGl0IHdhcyBmb3VuZCAqLworICBpZiAoX19tc2xfb3NfeC50aGVSZWFkID09IE5VTEwpCisgICAgcmV0dXJuIC0xOworICBlbHNlCisgICAgcmV0dXJuIF9fbXNsX29zX3gudGhlUmVhZCgwLCBidWZmZXIsIG4pOworI2VuZGlmCit9CisKKy8qIEpXVyAtIFRoaXMgY29kZSBzaG91bGQgbmV2ZXIgYmUgcmVhY2hlZCwgYnV0IGl0J3MgbmVlZGVkIGZvciBsaW5rIHB1cnBvc2VzICovCitjaGFyICpfX3R0eW5hbWUobG9uZyBmaWxkZXMpCit7CisjcHJhZ21hIHVudXNlZCAoZmlsZGVzKQorICAvKiBhbGwgc3RyZWFtcyBoYXZlIHRoZSBzYW1lIG5hbWUgKi8KKyAgc3RhdGljIGNoYXIgKl9fZGV2aWNlbmFtZSA9ICJUZXJtaW5hbCI7CisKKyAgaWYgKGZpbGRlcyA+PSAwICYmIGZpbGRlcyA8PSAyKQorICAgIHJldHVybiAoX19kZXZpY2VuYW1lKTsKKworICByZXR1cm4gKDBMKTsKK30KKworaW50IGtiaGl0KHZvaWQpCit7CisgIHJldHVybiAwOworfQorCitpbnQgZ2V0Y2godm9pZCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgY2xyc2NyKCkKK3sKKyAgcmV0dXJuOworfQorCisvKiBDaGFuZ2UgcmVjb3JkOgorICogSldXIDAxMDkxOSBDcmVhdGVkIE1hY2gtTyBjb25zb2xlIHN0dWJzIGZpbGUKKyAqIEpXVyAwMjA0MTggVXNlIF9fc3RkKCkgZm9yIGFsbCBzaXplX3QsIGFuZCAjaW5jbHVkZSA8c2l6ZV90Lmg+IHRvIGdldCBwcm9wZXIgQysrIGRlZmluaXRpb25zCisgKi8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2VoL213ZXJrc19kZWJ1Z19wcmVmaXguaCBiL3Rlc3QvZWgvbXdlcmtzX2RlYnVnX3ByZWZpeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NGIxZjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2VoL213ZXJrc19kZWJ1Z19wcmVmaXguaApAQCAtMCwwICsxLDggQEAKKy8vbXdlcmtzX2RlYnVnX3ByZWZpeC5oCisjZGVmaW5lIF9TVExQX05PX0ZPUkNFX0lOU1RBTlRJQVRFIDEvLyBmb3IgZGVidWdnaW5nCisjZGVmaW5lIEVIX1ZFQ1RPUl9PUEVSQVRPUl9ORVcgMQorI2RlZmluZSBfU1RMUF9ERUJVRyAxIC8vIGVuYWJsZSB0aGUgdXNlIG9mIGFsbG9jYXRpb24gZGVidWdnaW5nCisKKyNpZiBfX01XRVJLU19fID49IDB4MzAwMAorI2luY2x1ZGUgPE1TTENhcmJvblByZWZpeC5oPgorI2VuZGlmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9laC9td2Vya3Nfbm9zZ2lfZGVidWdfcHJlZml4LmggYi90ZXN0L2VoL213ZXJrc19ub3NnaV9kZWJ1Z19wcmVmaXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjUyODI1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9laC9td2Vya3Nfbm9zZ2lfZGVidWdfcHJlZml4LmgKQEAgLTAsMCArMSw1IEBACisvL213ZXJrc19ub3NnaV9kZWJ1Z19wcmVmaXguaAorI2RlZmluZSBfU1RMUF9OT19TR0lfSU9TVFJFQU1TIDEKKyNkZWZpbmUgX1NUTFBfTk9fRk9SQ0VfSU5TVEFOVElBVEUgMSAvLyBmb3IgZGVidWdnaW5nCisjZGVmaW5lIF9TVExQX0RFQlVHX1VOSU5JVElBTElaRUQgMSAvLyBlbmFibGUgdGhlIHVzZSBvZiBhbGxvY2F0aW9uIGRlYnVnZ2luZworI2RlZmluZSBFSF9WRUNUT1JfT1BFUkFUT1JfTkVXIDEKZGlmZiAtLWdpdCBhL3Rlc3QvZWgvbXdlcmtzX25vc2dpX3ByZWZpeC5oIGIvdGVzdC9laC9td2Vya3Nfbm9zZ2lfcHJlZml4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYwZmFjMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZWgvbXdlcmtzX25vc2dpX3ByZWZpeC5oCkBAIC0wLDAgKzEsNSBAQAorLy9td2Vya3Nfbm9zZ2lfcHJlZml4LmgKKyNkZWZpbmUgX1NUTFBfTk9fU0dJX0lPU1RSRUFNUyAxCisjZGVmaW5lIF9TVExQX05PX0ZPUkNFX0lOU1RBTlRJQVRFIDEgLy8gZm9yIGRlYnVnZ2luZworI2RlZmluZSBFSF9WRUNUT1JfT1BFUkFUT1JfTkVXIDEKKyNkZWZpbmUgTkRFQlVHIDEKZGlmZiAtLWdpdCBhL3Rlc3QvZWgvbXdlcmtzX3ByZWZpeC5oIGIvdGVzdC9laC9td2Vya3NfcHJlZml4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAxMzFlNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZWgvbXdlcmtzX3ByZWZpeC5oCkBAIC0wLDAgKzEsOCBAQAorLy9td2Vya3NfcHJlZml4LmgKKyNkZWZpbmUgX1NUTFBfTk9fRk9SQ0VfSU5TVEFOVElBVEUgMS8vIGZvciBkZWJ1Z2dpbmcKKyNkZWZpbmUgRUhfVkVDVE9SX09QRVJBVE9SX05FVyAxCisjZGVmaW5lIE5ERUJVRyAxCisKKyNpZiBfX01XRVJLU19fID49IDB4MzAwMAorI2luY2x1ZGUgPE1TTENhcmJvblByZWZpeC5oPgorI2VuZGlmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9laC9uY19hbGxvYy5jcHAgYi90ZXN0L2VoL25jX2FsbG9jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjM0ZWFiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9laC9uY19hbGxvYy5jcHAKQEAgLTAsMCArMSwzMjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBOQ19BTExPQy5DUFAKKworICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBNYXJrIG9mIHRoZSBVbmljb3JuLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBNYXJrIG9mIHRoZSBVbmljb3JuIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIm5jX2FsbG9jLmgiCisjaW5jbHVkZSA8c3RyaW5nPgorCisjaWYgZGVmaW5lZCAoRUhfTkVXX0hFQURFUlMpCisjICBpbmNsdWRlIDxuZXc+CisjICBpbmNsdWRlIDxjYXNzZXJ0PgorIyAgaW5jbHVkZSA8Y3N0ZGxpYj4KKyNlbHNlCisjICBpbmNsdWRlIDxhc3NlcnQuaD4KKyMgIGluY2x1ZGUgPHN0ZGxpYi5oPgorIyAgaW5jbHVkZSA8bmV3Lmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQgKEVIX05FV19JT1NUUkVBTVMpCisjICBpbmNsdWRlIDxpb3N0cmVhbT4KKyNlbHNlCisjICBpbmNsdWRlIDxpb3N0cmVhbS5oPgorI2VuZGlmCisKK2xvbmcgYWxsb2NfY291bnQgPSAwOworbG9uZyBvYmplY3RfY291bnQgPSAwOworbG9uZyBUZXN0Q29udHJvbGxlcjo6cG9zc2libGVfZmFpbHVyZV9jb3VudCA9IDA7Citjb25zdCBjaGFyKiBUZXN0Q29udHJvbGxlcjo6Y3VycmVudF90ZXN0ID0gIjx1bmtub3duPiI7Citjb25zdCBjaGFyKiBUZXN0Q29udHJvbGxlcjo6Y3VycmVudF90ZXN0X2NhdGVnb3J5ID0gIm5vIGNhdGVnb3J5IjsKK2NvbnN0IGNoYXIqIFRlc3RDb250cm9sbGVyOjpjdXJyZW50X2NvbnRhaW5lciA9IDA7Citib29sICBUZXN0Q29udHJvbGxlcjo6bmNfdmVyYm9zZSA9IHRydWU7Citib29sICBUZXN0Q29udHJvbGxlcjo6bmV2ZXJfZmFpbCA9IGZhbHNlOworYm9vbCAgVGVzdENvbnRyb2xsZXI6OnRyYWNrX2FsbG9jYXRpb25zID0gZmFsc2U7Citib29sICBUZXN0Q29udHJvbGxlcjo6bGVha19kZXRlY3Rpb25fZW5hYmxlZCA9IGZhbHNlOworVGVzdENvbnRyb2xsZXIgZ1Rlc3RDb250cm9sbGVyOworCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgordm9pZCBUZXN0Q29udHJvbGxlcjo6bWF5YmVfZmFpbChsb25nKSB7CisgIGlmIChuZXZlcl9mYWlsIHx8IEZhaWx1cmVfdGhyZXNob2xkKCkgPT0ga05vdEluRXhjZXB0aW9uVGVzdCkKKyAgICByZXR1cm47CisKKyAgLy8gdGhyb3cgaWYgYWxsb2NhdGlvbiB3b3VsZCBzYXRpc2Z5IHRoZSB0aHJlc2hvbGQKKyAgaWYgKHBvc3NpYmxlX2ZhaWx1cmVfY291bnQrKyA+PSBGYWlsdXJlX3RocmVzaG9sZCgpKSB7CisgICAgLy8gd2hhdCBhYm91dCBkb2luZyBzb21lIHN0YW5kYXJkIG5ld19oYW5kbGVyKCkgYmVoYXZpb3IgaGVyZSAodG8gdGVzdCBpdCEpID8/PworCisgICAgLy8gcmVzZXQgYW5kIHNpbXVsYXRlIGFuIG91dC1vZi1tZW1vcnkgZmFpbHVyZQorICAgIEZhaWx1cmVfdGhyZXNob2xkKCkgPSBrTm90SW5FeGNlcHRpb25UZXN0OworI2lmbmRlZiBFSF9OT19FWENFUFRJT05TCisgICAgdGhyb3cgRUhfU1REOjpiYWRfYWxsb2MoKTsKKyNlbmRpZgorICB9Cit9CisKKyNpZiBkZWZpbmVkIChFSF9IQVNIRURfQ09OVEFJTkVSU19JTVBMRU1FTlRFRCkKKyMgIGlmIGRlZmluZWQgKF9fU0dJX1NUTCkKKyMgICAgaWYgZGVmaW5lZCAoRUhfTkVXX0hFQURFUlMpCisjICAgICAgaW5jbHVkZSA8aGFzaF9zZXQ+CisjICAgIGVsc2UKKyMgICAgICBpbmNsdWRlIDxoYXNoX3NldC5oPgorIyAgICBlbmRpZgorIyAgZWxpZiBkZWZpbmVkIChfX01TTF9fKQorIyAgICBpbmNsdWRlIDxoYXNoc2V0Lmg+CisjICBlbHNlCisjICAgIGVycm9yIHdoYXQgZG8gSSBpbmNsdWRlIHRvIGdldCBoYXNoX3NldD8KKyMgIGVuZGlmCisjZWxzZQorIyAgaWYgZGVmaW5lZCAoRUhfTkVXX0hFQURFUlMpCisjICAgIGluY2x1ZGUgPHNldD4KKyMgIGVsc2UKKyMgICAgaW5jbHVkZSA8c2V0Lmg+CisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoRUhfSEFTSEVEX0NPTlRBSU5FUlNfSU1QTEVNRU5URUQpCit0eXBlZGVmIEVIX1NURDo6c2V0PHZvaWQqLCBFSF9TVEQ6Omxlc3M8dm9pZCo+ID4gYWxsb2NhdGlvbl9zZXQ7CisjZWxzZQorCitVU0lOR19DU1REX05BTUUoc2l6ZV90KQorCitzdHJ1Y3QgaGFzaF92b2lkIHsKKyAgc2l6ZV90IG9wZXJhdG9yKCkodm9pZCogeCkgY29uc3QgeyByZXR1cm4gKHNpemVfdCl4OyB9Cit9OworCit0eXBlZGVmIEVIX1NURDo6aGFzaF9zZXQ8dm9pZCosIDo6aGFzaF92b2lkLCBFSF9TVEQ6OmVxdWFsX3RvPHZvaWQqPiA+IGFsbG9jYXRpb25fc2V0OworI2VuZGlmCisKK3N0YXRpYyBhbGxvY2F0aW9uX3NldCYgYWxsb2Nfc2V0KCkgeworICBzdGF0aWMgYWxsb2NhdGlvbl9zZXQgczsKKyAgcmV0dXJuIHM7Cit9CisKKy8vIFByZXZlbnRzIGluZmluaXRlIHJlY3Vyc2lvbiBkdXJpbmcgYWxsb2NhdGlvbgorc3RhdGljIGJvb2wgdXNpbmdfYWxsb2Nfc2V0ID0gZmFsc2U7CisKKyNpZiAhZGVmaW5lZCAoTk9fRkFTVF9BTExPQ0FUT1IpCisvLworLy8gIEZhc3RBbGxvY2F0b3IgLS0gc3BlZWRzIHVwIGNvbnN0cnVjdGlvbiBvZiBUZXN0Q2xhc3Mgb2JqZWN0cyB3aGVuCisvLyBURVNUQ0xBU1NfREVFUF9EQVRBIGlzIGVuYWJsZWQsIGFuZCBzcGVlZHMgdXAgdHJhY2tpbmcgb2YgYWxsb2NhdGlvbnMKKy8vIHdoZW4gdGhlIHN1aXRlIGlzIHJ1biB3aXRoIHRoZSAtdCBvcHRpb24uCisvLworY2xhc3MgRmFzdEFsbG9jYXRvciB7CitwdWJsaWM6CisgIC8vRmFzdEFsbG9jYXRvcigpIDogbUZyZWUoMCksIG1Vc2VkKDApIHt9CisgIHN0YXRpYyB2b2lkICpBbGxvY2F0ZShzaXplX3QgcykgeworICAgIHZvaWQgKnJlc3VsdCA9IDA7CisKKyAgICBpZiAocyA8PSBzaXplb2YoQmxvY2spKSB7CisgICAgICBpZiAobUZyZWUgIT0gMCkgeworICAgICAgICByZXN1bHQgPSBtRnJlZTsKKyAgICAgICAgbUZyZWUgPSBtRnJlZS0+bmV4dDsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKG1CbG9ja3MgIT0gMCAmJiBtVXNlZCA8IGtCbG9ja0NvdW50KSB7CisgICAgICAgIHJlc3VsdCA9ICAodm9pZCopJm1CbG9ja3NbbVVzZWQrK107CisgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBzdGF0aWMgYm9vbCBGcmVlKHZvaWQqIHApIHsKKyAgICBCbG9jayogYiA9IChCbG9jayopcDsKKyAgICBpZiAobUJsb2NrcyA9PSAwIHx8IGIgPCBtQmxvY2tzIHx8IGIgPj0gbUJsb2NrcyArIGtCbG9ja0NvdW50KQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGItPm5leHQgPSBtRnJlZTsKKyAgICBtRnJlZSA9IGI7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBzdHJ1Y3QgQmxvY2s7CisgIGZyaWVuZCBzdHJ1Y3QgQmxvY2s7CisKKyAgZW51bSB7CisgICAgLy8gTnVtYmVyIG9mIGZhc3QgYWxsb2NhdGlvbiBibG9ja3MgdG8gY3JlYXRlLgorICAgIGtCbG9ja0NvdW50ID0gMTUwMCwKKworICAgIC8vIFlvdSBtYXkgbmVlZCB0byBhZGp1c3QgdGhpcyBudW1iZXIgZm9yIHlvdXIgcGxhdGZvcm0uCisgICAgLy8gQSBnb29kIGNob2ljZSB3aWxsIHNwZWVkIHRlc3RzLiBBIGJhZCBjaG9pY2Ugd2lsbCBzdGlsbCB3b3JrLgorICAgIGtNaW5CbG9ja1NpemUgPSA0OAorICB9OworCisgIHN0cnVjdCBCbG9jayB7CisgICAgdW5pb24geworICAgICAgQmxvY2sgKm5leHQ7CisgICAgICBkb3VibGUgZHVtbXk7IC8vIGZicCAtIGZvcmNlIGFsaWdubWVudAorICAgICAgY2hhciBkdW1teTJba01pbkJsb2NrU2l6ZV07CisgICAgfTsKKyAgfTsKKworICBzdGF0aWMgQmxvY2sqIG1CbG9ja3M7CisgIHN0YXRpYyBCbG9jayAqbUZyZWU7CisgIHN0YXRpYyBzaXplX3QgbVVzZWQ7Cit9OworCitGYXN0QWxsb2NhdG9yOjpCbG9jayAqRmFzdEFsbG9jYXRvcjo6bUJsb2NrcyA9CisoRmFzdEFsbG9jYXRvcjo6QmxvY2sqKUVIX0NTVEQ6OmNhbGxvYyggc2l6ZW9mKEZhc3RBbGxvY2F0b3I6OkJsb2NrKSwgRmFzdEFsbG9jYXRvcjo6a0Jsb2NrQ291bnQgKTsKK0Zhc3RBbGxvY2F0b3I6OkJsb2NrICpGYXN0QWxsb2NhdG9yOjptRnJlZTsKK3NpemVfdCBGYXN0QWxsb2NhdG9yOjptVXNlZDsKKworCitzdGF0aWMgRmFzdEFsbG9jYXRvciBnRmFzdEFsbG9jYXRvcjsKKyNlbmRpZgorCitpbmxpbmUgY2hhciogQWxsb2NhdGVCbG9jayhzaXplX3QgcykgeworI2lmICFkZWZpbmVkIChOT19GQVNUX0FMTE9DQVRPUikKKyAgY2hhciAqIGNvbnN0IHAgPSAoY2hhciopZ0Zhc3RBbGxvY2F0b3IuQWxsb2NhdGUoIHMgKTsKKyAgaWYgKHAgIT0gMCkKKyAgICByZXR1cm4gcDsKKyNlbmRpZgorCisgIHJldHVybiAoY2hhciopRUhfQ1NURDo6bWFsbG9jKHMpOworfQorCitzdGF0aWMgdm9pZCogT3BlcmF0b3JOZXcoIHNpemVfdCBzICkgeworICBpZiAoIXVzaW5nX2FsbG9jX3NldCkgeworICAgIHNpbXVsYXRlX3Bvc3NpYmxlX2ZhaWx1cmUoKTsKKyAgICArK2FsbG9jX2NvdW50OworICB9CisKKyAgY2hhciAqcCA9IEFsbG9jYXRlQmxvY2socyk7CisKKyAgaWYgKGdUZXN0Q29udHJvbGxlci5UcmFja2luZ0VuYWJsZWQoKSAmJgorICAgICAgZ1Rlc3RDb250cm9sbGVyLkxlYWtEZXRlY3Rpb25FbmFibGVkKCkgJiYKKyAgICAgICF1c2luZ19hbGxvY19zZXQpIHsKKyAgICB1c2luZ19hbGxvY19zZXQgPSB0cnVlOworICAgIGJvb2wgaW5zZXJ0ZWQgPSBhbGxvY19zZXQoKS5pbnNlcnQocCkuc2Vjb25kOworICAgIC8vIFN1cHByZXNzIHdhcm5pbmcgYWJvdXQgdW51c2VkIHZhcmlhYmxlLgorICAgIGluc2VydGVkOyAKKyAgICBFSF9BU1NFUlQoaW5zZXJ0ZWQpOworICAgIHVzaW5nX2FsbG9jX3NldCA9IGZhbHNlOworICB9CisKKyAgcmV0dXJuIHA7Cit9CisKK3ZvaWQqIF9TVExQX0NBTEwgb3BlcmF0b3IgbmV3KHNpemVfdCBzKQorI2lmZGVmIEVIX0RFTEVURV9IQVNfVEhST1dfU1BFQwordGhyb3coRUhfU1REOjpiYWRfYWxsb2MpCisjZW5kaWYKK3sgcmV0dXJuIE9wZXJhdG9yTmV3KCBzICk7IH0KKworI2lmZGVmIEVIX1VTRV9OT1RIUk9XCit2b2lkKiBfU1RMUF9DQUxMIG9wZXJhdG9yIG5ldyhzaXplX3Qgc2l6ZSwgY29uc3QgRUhfU1REOjpub3Rocm93X3QmKSB0aHJvdygpIHsKKyAgdHJ5IHsKKyAgICByZXR1cm4gT3BlcmF0b3JOZXcoIHNpemUgKTsKKyAgfQorICBjYXRjaCAoLi4uKSB7CisgICAgcmV0dXJuIDA7CisgIH0KK30KKyNlbmRpZgorCisjaWYgMSAvKiBkZWZpbmVkIChFSF9WRUNUT1JfT1BFUkFUT1JfTkVXKSAqLwordm9pZCogX1NUTFBfQ0FMTCBvcGVyYXRvciBuZXdbXShzaXplX3Qgc2l6ZSApIHRocm93KEVIX1NURDo6YmFkX2FsbG9jKSB7CisgIHJldHVybiBPcGVyYXRvck5ldyggc2l6ZSApOworfQorCisjICBpZmRlZiBFSF9VU0VfTk9USFJPVwordm9pZCogX1NUTFBfQ0FMTCBvcGVyYXRvciBuZXdbXShzaXplX3Qgc2l6ZSwgY29uc3QgRUhfU1REOjpub3Rocm93X3QmKSB0aHJvdygpIHsKKyAgdHJ5IHsKKyAgICByZXR1cm4gT3BlcmF0b3JOZXcoc2l6ZSk7CisgIH0KKyAgY2F0Y2ggKC4uLikgeworICAgIHJldHVybiAwOworICB9Cit9CisjICBlbmRpZgorCit2b2lkIF9TVExQX0NBTEwgb3BlcmF0b3IgZGVsZXRlW10odm9pZCogcHRyKSB0aHJvdygpCit7IG9wZXJhdG9yIGRlbGV0ZSggcHRyICk7IH0KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoRUhfREVMRVRFX0hBU19USFJPV19TUEVDKQordm9pZCBfU1RMUF9DQUxMIG9wZXJhdG9yIGRlbGV0ZSh2b2lkKiBzKSB0aHJvdygpCisjZWxzZQordm9pZCBfU1RMUF9DQUxMIG9wZXJhdG9yIGRlbGV0ZSh2b2lkKiBzKQorI2VuZGlmCit7CisgIGlmICggcyAhPSAwICkgeworICAgIGlmICggIXVzaW5nX2FsbG9jX3NldCApIHsKKyAgICAgIC0tYWxsb2NfY291bnQ7CisKKyAgICAgIGlmICggZ1Rlc3RDb250cm9sbGVyLlRyYWNraW5nRW5hYmxlZCgpICYmIGdUZXN0Q29udHJvbGxlci5MZWFrRGV0ZWN0aW9uRW5hYmxlZCgpICkgeworICAgICAgICB1c2luZ19hbGxvY19zZXQgPSB0cnVlOworICAgICAgICBhbGxvY2F0aW9uX3NldDo6aXRlcmF0b3IgcCA9IGFsbG9jX3NldCgpLmZpbmQoIChjaGFyKilzICk7CisgICAgICAgIEVIX0FTU0VSVCggcCAhPSBhbGxvY19zZXQoKS5lbmQoKSApOworICAgICAgICBhbGxvY19zZXQoKS5lcmFzZSggcCApOworICAgICAgICB1c2luZ19hbGxvY19zZXQgPSBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisjIGlmICEgZGVmaW5lZCAoTk9fRkFTVF9BTExPQ0FUT1IpCisgICAgaWYgKCAhZ0Zhc3RBbGxvY2F0b3IuRnJlZSggcyApICkKKyMgZW5kaWYKKyAgICAgIEVIX0NTVEQ6OmZyZWUocyk7CisgIH0KK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIENsZWFyQWxsb2NhdGlvblNldCAgKHByaXZhdGUgaGVscGVyKQorCisgIEVGRkVDVFM6ICBFbXB0eSB0aGUgc2V0IG9mIGFsbG9jYXRlZCBibG9ja3MuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBUZXN0Q29udHJvbGxlcjo6Q2xlYXJBbGxvY2F0aW9uU2V0KCkgeworICBpZiAoIXVzaW5nX2FsbG9jX3NldCkgeworICAgIHVzaW5nX2FsbG9jX3NldCA9IHRydWU7CisgICAgYWxsb2Nfc2V0KCkuY2xlYXIoKTsKKyAgICB1c2luZ19hbGxvY19zZXQgPSBmYWxzZTsKKyAgfQorfQorCisKK2Jvb2wgVGVzdENvbnRyb2xsZXI6OlJlcG9ydExlYWtlZCgpIHsKKyAgRW5kTGVha0RldGVjdGlvbigpOworCisgIEVIX0FTU0VSVCggIXVzaW5nX2FsbG9jX3NldCB8fCAoYWxsb2NfY291bnQgPT0gc3RhdGljX2Nhc3Q8aW50PihhbGxvY19zZXQoKS5zaXplKCkpKSApOworCisgIGlmIChhbGxvY19jb3VudCAhPSAwIHx8IG9iamVjdF9jb3VudCAhPSAwKSB7CisgICAgRUhfU1REOjpjZXJyPDwiXG5FSCBURVNUIEZBSUxVUkUgIVxuIjsKKyAgICBQcmludFRlc3ROYW1lKHRydWUpOworICAgIGlmIChhbGxvY19jb3VudCkKKyAgICAgIEVIX1NURDo6Y2VyciA8PCAiRVJST1IgOiAiIDw8IGFsbG9jX2NvdW50IDw8ICIgb3V0c3RhbmRpbmcgYWxsb2NhdGlvbnMuXG4iOworICAgIGlmIChvYmplY3RfY291bnQpCisgICAgICBFSF9TVEQ6OmNlcnIgPDwgIkVSUk9SIDogIiA8PCBvYmplY3RfY291bnQgPDwgIiBub24tZGVzdHJveWVkIG9iamVjdHMuXG4iOworICAgIGFsbG9jX2NvdW50ID0gb2JqZWN0X2NvdW50ID0gMDsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFByaW50VGVzdE5hbWUKKworICBFRkZFQ1RTOiBQcmludHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgdGVzdC4gSWYgZXJyIGlzIGZhbHNlLCBlbmRzIHdpdGgKKyAgICBhbiBlbGxpcHNpcywgYmVjYXVzZSB0aGUgdGVzdCBpcyBvbmdvaW5nLiBJZiBlcnIgaXMgdHJ1ZSBhbiBlcnJvciBpcyBiZWluZworICAgIHJlcG9ydGVkLCBhbmQgdGhlIG91dHB1dCBlbmRzIHdpdGggYW4gZW5kbC4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3ZvaWQgVGVzdENvbnRyb2xsZXI6OlByaW50VGVzdE5hbWUoYm9vbCBlcnIpIHsKKyAgaWYgKGN1cnJlbnRfY29udGFpbmVyKQorICAgIEVIX1NURDo6Y2Vycjw8IlsiPDxjdXJyZW50X2NvbnRhaW5lcjw8Il0gOiI7CisgIEVIX1NURDo6Y2Vycjw8InRlc3RpbmcgIjw8Y3VycmVudF90ZXN0IDw8IiAoIiA8PCBjdXJyZW50X3Rlc3RfY2F0ZWdvcnkgPDwiKSI7CisgIGlmIChlcnIpCisgICAgRUhfU1REOjpjZXJyPDxFSF9TVEQ6OmVuZGw7CisgIGVsc2UKKyAgICBFSF9TVEQ6OmNlcnI8PCIgLi4uICI7Cit9CisKK3ZvaWQgVGVzdENvbnRyb2xsZXI6OlJlcG9ydFN1Y2Nlc3MoaW50IGNvdW50KSB7CisgIGlmIChuY192ZXJib3NlKQorICAgIEVIX1NURDo6Y2Vycjw8KGNvdW50KzEpPDwiIHRyeSBzdWNjZXNzZnVsIjw8RUhfU1REOjplbmRsOworfQorCitsb25nJiBUZXN0Q29udHJvbGxlcjo6RmFpbHVyZV90aHJlc2hvbGQoKSB7CisgIHN0YXRpYyBsb25nIGZhaWx1cmVfdGhyZXNob2xkID0ga05vdEluRXhjZXB0aW9uVGVzdDsKKyAgcmV0dXJuIGZhaWx1cmVfdGhyZXNob2xkOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9laC9uY19hbGxvYy5oIGIvdGVzdC9laC9uY19hbGxvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NzgzNjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2VoL25jX2FsbG9jLmgKQEAgLTAsMCArMSwxODQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICBUZXN0Q29udHJvbGxlci5oCisKKyAgICBTVU1NQVJZOiBBbiAiZmF1eC1zaW5nbGV0b24iIG9iamVjdCB0byBlbmNhcHN1bGF0ZSBhIGhvZGdlcG9kZ2Ugb2Ygc3RhdGUgYW5kCisgICAgICBmdW5jdGlvbmFsaXR5IHJlbGF0aW5nIHRvIHRoZSB0ZXN0IHN1aXRlLiBQcm9iYWJseSBzaG91bGQgYmUgYnJva2VuCisgICAgICBpbnRvIHNtYWxsZXIgcGllY2VzLgorCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1hcmsgb2YgdGhlIFVuaWNvcm4sIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIE1hcmsgb2YgdGhlIFVuaWNvcm4gbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgIUlOQ0xVREVEX01PVFVfbmNfYWxsb2MKKyNkZWZpbmUgSU5DTFVERURfTU9UVV9uY19hbGxvYyAxCisKKyNpbmNsdWRlICJQcmVmaXguaCIKKworI2lmIGRlZmluZWQgKEVIX05FV19IRUFERVJTKQorIyAgaW5jbHVkZSA8dXRpbGl0eT4KKyNlbHNlCisjICBpbmNsdWRlIDxwYWlyLmg+CisjZW5kaWYKKworZXh0ZXJuIGxvbmcgYWxsb2NfY291bnQ7CitleHRlcm4gbG9uZyBvYmplY3RfY291bnQ7CisKK3N0cnVjdCBUZXN0Q29udHJvbGxlciB7CisgIC8vIFJlcG9ydCB0aGF0IHRoZSBjdXJyZW50IHRlc3QgaGFzIHN1Y2NlZWRlZC4KKyAgc3RhdGljIHZvaWQgUmVwb3J0U3VjY2VzcyhpbnQpOworCisgIC8vCisgIC8vIExlYWsgZGV0ZWN0aW9uCisgIC8vCisKKyAgLy8gVHVybiB0aGUgcmVjb3JkaW5nIG9mIHRoZSBhZGRyZXNzZXMgb2YgaW5kaXZpZHVhbCBhbGxvY2F0ZWQKKyAgLy8gYmxvY2tzIG9uIG9yIG9mZi4gSWYgbm90IGNhbGxlZCwgYWxsb2NhdGlvbnMgd2lsbCBvbmx5IGJlCisgIC8vIGNvdW50ZWQsIGJ1dCBkZWFsbG9jYXRpb25zIHdvbid0IGJlIGNoZWNrZWQgZm9yIHZhbGlkaXR5LgorICBzdGF0aWMgdm9pZCBUcmFja0FsbG9jYXRpb25zKCBib29sICk7CisgIHN0YXRpYyBib29sIFRyYWNraW5nRW5hYmxlZCgpOworCisgIC8vIENhbGwgdGhpcyB0byBiZWdpbiBhIG5ldyBsZWFrLWRldGVjdGlvbiBjeWNsZS4gUmVzZXRzIGFsbAorICAvLyBhbGxvY2F0aW9uIGNvdW50cywgZXRjLgorICBzdGF0aWMgdm9pZCBCZWdpbkxlYWtEZXRlY3Rpb24oKTsKKworICAvLyBSZXR1cm5zIHRydWUgaWZmIGxlYWsgZGV0ZWN0aW9uIGlzIGN1cnJlbnRseSBpbiBlZmZlY3QKKyAgc3RhdGljIGJvb2wgTGVha0RldGVjdGlvbkVuYWJsZWQoKTsKKworICAvLyBFbmRzIGxlYWsgZGV0ZWN0aW9uIGFuZCByZXBvcnRzIGFueSByZXNvdXJjZSBsZWFrcy4KKyAgLy8gUmV0dXJucyB0cnVlIGlmIGFueSBvY2N1cnJlZC4KKyAgc3RhdGljIGJvb2wgUmVwb3J0TGVha2VkKCk7CisKKyAgLy8KKyAgLy8gRXhjZXB0aW9uLXNhZmV0eQorICAvLworCisgIC8vIERvbid0IHRlc3QgZm9yIGV4Y2VwdGlvbi1zYWZldHkKKyAgc3RhdGljIHZvaWQgVHVybk9mZkV4Y2VwdGlvbnMoKTsKKworICAvLyBTZXQgb3BlcmF0b3IgbmV3IHRvIGZhaWwgb24gdGhlIG50aCBpbnZvY2F0aW9uCisgIHN0YXRpYyB2b2lkIFNldEZhaWx1cmVDb3VudGRvd24oIGxvbmcgbiApOworCisgIC8vIFNldCBvcGVyYXRvciBuZXcgdG8gbmV2ZXIgZmFpbC4KKyAgc3RhdGljIHZvaWQgQ2FuY2VsRmFpbHVyZUNvdW50ZG93bigpOworCisgIC8vIFRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIGNvdW50IGhhcyBiZWVuIHJlYWNoZWQuIENhbGwgdGhpcworICAvLyBiZWZvcmUgZXZlcnkgb3BlcmF0aW9uIHRoYXQgbWlnaHQgZmFpbCBpbiB0aGUgcmVhbCB3b3JsZC4KKyAgc3RhdGljIHZvaWQgbWF5YmVfZmFpbChsb25nKTsKKworICAvLworICAvLyBNYW5hZ2luZyB2ZXJib3NlIGZlZWRiYWNrLgorICAvLworCisgIC8vIENhbGwgdG8gYmVnaW4gYSBzdHJvbmcsIHdlYWssIG9yIGNvbnN0IHRlc3QuIElmIHZlcmJvc2UKKyAgLy8gcmVwb3J0aW5nIGlzIGVuYWJsZWQsIHByaW50cyB0aGUgdGVzdCBjYXRlZ29yeS4KKyAgc3RhdGljIHZvaWQgU2V0Q3VycmVudFRlc3RDYXRlZ29yeSggY29uc3QgY2hhciogc3RyICk7CisKKyAgLy8gQ2FsbCB0byBzZXQgdGhlIG5hbWUgb2YgdGhlIGNvbnRhaW5lciBiZWluZyB0ZXN0ZWQuCisgIHN0YXRpYyB2b2lkIFNldEN1cnJlbnRDb250YWluZXIoIGNvbnN0IGNoYXIqIHN0ciApOworCisgIC8vIFNldHMgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgdGVzdC4KKyAgc3RhdGljIHZvaWQgU2V0Q3VycmVudFRlc3ROYW1lKGNvbnN0IGNoYXIqIHN0cik7CisKKyAgLy8gVHVybiB2ZXJib3NlIHJlcG9ydGluZyBvbiBvciBvZmYuCisgIHN0YXRpYyB2b2lkIFNldFZlcmJvc2UoYm9vbCB2YWwpOworCitwcml2YXRlOgorICBlbnVtIHsga05vdEluRXhjZXB0aW9uVGVzdCA9IC0xIH07CisKKyAgc3RhdGljIHZvaWQgQ2xlYXJBbGxvY2F0aW9uU2V0KCk7CisgIHN0YXRpYyB2b2lkIEVuZExlYWtEZXRlY3Rpb24oKTsKKyAgc3RhdGljIHZvaWQgUHJpbnRUZXN0TmFtZSggYm9vbCBlcnI9ZmFsc2UgKTsKKworICBzdGF0aWMgbG9uZyYgRmFpbHVyZV90aHJlc2hvbGQoKTsKKyAgc3RhdGljIGxvbmcgcG9zc2libGVfZmFpbHVyZV9jb3VudDsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIGN1cnJlbnRfdGVzdDsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIGN1cnJlbnRfdGVzdF9jYXRlZ29yeTsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIGN1cnJlbnRfY29udGFpbmVyOworICBzdGF0aWMgYm9vbCAgbmNfdmVyYm9zZTsKKyAgc3RhdGljIGJvb2wgIG5ldmVyX2ZhaWw7CisgIHN0YXRpYyBib29sIHRyYWNrX2FsbG9jYXRpb25zOworICBzdGF0aWMgYm9vbCBsZWFrX2RldGVjdGlvbl9lbmFibGVkOworfTsKKworZXh0ZXJuIFRlc3RDb250cm9sbGVyIGdUZXN0Q29udHJvbGxlcjsKKworLy8KKy8vIGlubGluZSBpbXBsZW1lbnRhdGlvbnMKKy8vCisKK2lubGluZSB2b2lkIHNpbXVsYXRlX3Bvc3NpYmxlX2ZhaWx1cmUoKSB7CisgIGdUZXN0Q29udHJvbGxlci5tYXliZV9mYWlsKDApOworfQorCitpbmxpbmUgdm9pZCBzaW11bGF0ZV9jb25zdHJ1Y3RvcigpIHsKKyAgZ1Rlc3RDb250cm9sbGVyLm1heWJlX2ZhaWwoMCk7CisgICsrb2JqZWN0X2NvdW50OworfQorCitpbmxpbmUgdm9pZCBzaW11bGF0ZV9kZXN0cnVjdG9yKCkgeworICAtLW9iamVjdF9jb3VudDsKK30KKworaW5saW5lIHZvaWQgVGVzdENvbnRyb2xsZXI6OlRyYWNrQWxsb2NhdGlvbnMoYm9vbCB0cmFjaykgeworICB0cmFja19hbGxvY2F0aW9ucyA9IHRyYWNrOworfQorCitpbmxpbmUgYm9vbCBUZXN0Q29udHJvbGxlcjo6VHJhY2tpbmdFbmFibGVkKCkgeworICByZXR1cm4gdHJhY2tfYWxsb2NhdGlvbnM7Cit9CisKK2lubGluZSB2b2lkIFRlc3RDb250cm9sbGVyOjpTZXRGYWlsdXJlQ291bnRkb3duKGxvbmcgY291bnQpIHsKKyAgRmFpbHVyZV90aHJlc2hvbGQoKSA9IGNvdW50OworICBwb3NzaWJsZV9mYWlsdXJlX2NvdW50ID0gMDsKK30KKworaW5saW5lIHZvaWQgVGVzdENvbnRyb2xsZXI6OkNhbmNlbEZhaWx1cmVDb3VudGRvd24oKSB7CisgIEZhaWx1cmVfdGhyZXNob2xkKCkgPSBrTm90SW5FeGNlcHRpb25UZXN0OworfQorCitpbmxpbmUgdm9pZCBUZXN0Q29udHJvbGxlcjo6QmVnaW5MZWFrRGV0ZWN0aW9uKCkgeworICBhbGxvY19jb3VudCA9IDA7CisgIG9iamVjdF9jb3VudCA9IDA7CisgIENsZWFyQWxsb2NhdGlvblNldCgpOworICBsZWFrX2RldGVjdGlvbl9lbmFibGVkID0gdHJ1ZTsKK30KKworaW5saW5lIGJvb2wgVGVzdENvbnRyb2xsZXI6OkxlYWtEZXRlY3Rpb25FbmFibGVkKCkgeworICByZXR1cm4gbGVha19kZXRlY3Rpb25fZW5hYmxlZDsKK30KKworaW5saW5lIHZvaWQgVGVzdENvbnRyb2xsZXI6OkVuZExlYWtEZXRlY3Rpb24oKSB7CisgIGxlYWtfZGV0ZWN0aW9uX2VuYWJsZWQgPSBmYWxzZTsKK30KKworaW5saW5lIHZvaWQgVGVzdENvbnRyb2xsZXI6OlNldEN1cnJlbnRUZXN0Q2F0ZWdvcnkoY29uc3QgY2hhciogc3RyKSB7CisgIGN1cnJlbnRfdGVzdF9jYXRlZ29yeSA9IHN0cjsKKyAgaWYgKG5jX3ZlcmJvc2UpCisgICAgUHJpbnRUZXN0TmFtZSgpOworfQorCitpbmxpbmUgdm9pZCBUZXN0Q29udHJvbGxlcjo6U2V0Q3VycmVudENvbnRhaW5lcihjb25zdCBjaGFyKiBzdHIpIHsKKyAgY3VycmVudF9jb250YWluZXI9c3RyOworfQorCitpbmxpbmUgdm9pZCBUZXN0Q29udHJvbGxlcjo6U2V0Q3VycmVudFRlc3ROYW1lKGNvbnN0IGNoYXIqIHN0cikgeworICBjdXJyZW50X3Rlc3QgPSBzdHI7Cit9CisKK2lubGluZSB2b2lkIFRlc3RDb250cm9sbGVyOjpTZXRWZXJib3NlKGJvb2wgdmFsKSB7CisgIG5jX3ZlcmJvc2UgPSB2YWw7Cit9CisKK2lubGluZSB2b2lkIFRlc3RDb250cm9sbGVyOjpUdXJuT2ZmRXhjZXB0aW9ucygpIHsKKyAgbmV2ZXJfZmFpbCA9IHRydWU7Cit9CisKKyNlbmRpZiAvLyBJTkNMVURFRF9NT1RVX25jX2FsbG9jCmRpZmYgLS1naXQgYS90ZXN0L2VoL3JhbmRvbV9udW1iZXIuY3BwIGIvdGVzdC9laC9yYW5kb21fbnVtYmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWJmNTk4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9laC9yYW5kb21fbnVtYmVyLmNwcApAQCAtMCwwICsxLDM5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgcmFuZG9tX251bWJlci5jcHAKKworICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBNYXJrIG9mIHRoZSBVbmljb3JuLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBNYXJrIG9mIHRoZSBVbmljb3JuIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgInJhbmRvbV9udW1iZXIuaCIKKyNpbmNsdWRlICJQcmVmaXguaCIKKyNpZiBkZWZpbmVkIChFSF9ORVdfSEVBREVSUykKKyMgaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyMgaW5jbHVkZSA8Y3N0ZGxpYj4KKyNlbHNlCisjIGluY2x1ZGUgPGZ1bmN0aW9uLmg+CisjIGluY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisKK3Vuc2lnbmVkIHJhbmRvbV9udW1iZXIoIHNpemVfdCByYW5nZSApCit7CisjaWYgIWRlZmluZWQoIF9fU0dJX1NUTCApCisgIGlmIChyYW5nZSA9PSAwKSByZXR1cm4gMDsKKyAgcmV0dXJuICh1bnNpZ25lZCkoRUhfU1REOjpyYW5kKCkgKyBFSF9TVEQ6OnJhbmQoKSkgJSByYW5nZTsKKyNlbHNlCisgIHN0YXRpYyBFSF9TVEQ6OnN1YnRyYWN0aXZlX3JuZyBybmQ7CisgICAgICAgIGlmIChyYW5nZT09MCkgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiBybmQocmFuZ2UpOworI2VuZGlmCit9CisKKy8vIGRlZmF1bHQgYmFzZSBmb3IgcmFuZG9tIGNvbnRhaW5lciBzaXplcwordW5zaWduZWQgcmFuZG9tX2Jhc2UgPSAxMDAwOwpkaWZmIC0tZ2l0IGEvdGVzdC9laC9yYW5kb21fbnVtYmVyLmggYi90ZXN0L2VoL3JhbmRvbV9udW1iZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDc1NGMxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9laC9yYW5kb21fbnVtYmVyLmgKQEAgLTAsMCArMSwyNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIHJhbmRvbV9udW1iZXIuaAorCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMTk5OAorICogTWFyayBvZiB0aGUgVW5pY29ybiwgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgTWFyayBvZiB0aGUgVW5pY29ybiBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUkFORE9NX05VTUJFUl9EV0ExMjAyOThfSF8KKyNkZWZpbmUgUkFORE9NX05VTUJFUl9EV0ExMjAyOThfSF8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisvLyBSZXR1cm4gYSByYW5kb20gbnVtYmVyIGluIHRoZSBnaXZlbiByYW5nZS4KK3Vuc2lnbmVkIHJhbmRvbV9udW1iZXIoIHNpemVfdCByYW5nZSApOworCisvLyBkZWZhdWx0IGJhc2UgZm9yIHJhbmRvbSBjb250YWluZXIgc2l6ZXMKK2V4dGVybiB1bnNpZ25lZCByYW5kb21fYmFzZTsKKworI2VuZGlmIC8vICNpbmNsdWRlIGd1YXJkCmRpZmYgLS1naXQgYS90ZXN0L2VoL3NnaV9taXBzcHJvLm1hayBiL3Rlc3QvZWgvc2dpX21pcHNwcm8ubWFrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMmRiMWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2VoL3NnaV9taXBzcHJvLm1hawpAQCAtMCwwICsxLDYyIEBACisjIDs7OyAtKi0gTW9kZTptYWtlZmlsZTstKi0gCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gTWFrZWZpbGUuaW4gYnkgY29uZmlndXJlLgorIyBUaGlzIHJlcXVpcmVzIEdOVSBtYWtlLgorCitTSEVMTD0vYmluL3NoCisKKyMgc3JjZGlyID0gLgorIyBWUEFUSCA9IC4KKworCitTVExfSU5DTD0tSSR7UFdEfS8uLi8uLi9zdGxwb3J0LworCisjIFNUTF9JTkNMPSAtREVIX05PX1NHSV9TVEwKKworQVVYX0xJU1Q9VGVzdENsYXNzLm8gbWFpbi5vIG5jX2FsbG9jLm8gcmFuZG9tX251bWJlci5vCisKK1RFU1RfTElTVD10ZXN0X2FsZ28ubyAgXAordGVzdF9hbGdvYmFzZS5vICAgICB0ZXN0X2xpc3QubyB0ZXN0X3NsaXN0Lm8gXAordGVzdF9iaXRfdmVjdG9yLm8gICB0ZXN0X3ZlY3Rvci5vIFwKK3Rlc3RfZGVxdWUubyB0ZXN0X3NldC5vIHRlc3RfbWFwLm8gXAordGVzdF9oYXNoX21hcC5vICB0ZXN0X2hhc2hfc2V0Lm8gdGVzdF9yb3BlLm8gXAordGVzdF9zdHJpbmcubyB0ZXN0X2JpdHNldC5vIHRlc3RfdmFsYXJyYXkubworCitMSVNUPSR7QVVYX0xJU1R9ICR7VEVTVF9MSVNUfQorCitPQkpFQ1RTID0gJChMSVNUKQorRVhFQ1MgPSAkKExJU1Q6JS5vPSUpCitURVNUUyA9ICQoTElTVDolLm89JS5vdXQpCitURVNUX0VYRSAgPSBlaF90ZXN0CitURVNUICA9IGVoX3Rlc3Qub3V0CisKK0NDID0gQ0MKK0NYWCA9ICQoQ0MpCisKKyMgQ1hYRkxBR1MgPSAtSiA0IC1hbnNpIC1MQU5HOnN0ZCAtSS4gJHtTVExfSU5DTH0gJHtERUJVR19GTEFHU30gLUkuIC1EX1NUTFBfTk9fT1dOX0lPU1RSRUFNUyAtRF9TVExQX05PX05FV19JT1NUUkVBTVMKK0NYWEZMQUdTID0gLUogNCAtYW5zaSAtTEFORzpzdGQgLUkuICR7U1RMX0lOQ0x9ICR7REVCVUdfRkxBR1N9IC1JLgorCitMSUJTID0gLUwuLi8uLi9saWIgLWxzdGxwb3J0X21pcHNwcm8gLWxtIAorTElCU1REQ1hYID0gCisKKy5TVUZGSVhFUzogLmNwcCAuaSAubyAub3V0IC5yZXMKKworY2hlY2s6ICQoVEVTVCkKKworJChURVNUKSA6ICQoT0JKRUNUUykKKwkkKENYWCkgJChDWFhGTEFHUykgJChPQkpFQ1RTKSAkKExJQlMpIC1vICQoVEVTVF9FWEUpCisJTERfTElCUkFSWV9QQVRIPSIuLi8uLi9saWI6JChMRF9MSUJSQVJZX1BBVEgpIiAuLyQoVEVTVF9FWEUpIC1zIDEwMAorCisuY3BwLm86CisJJChDWFgpICQoQ1hYRkxBR1MpICQ8IC1jIC1vICRACisKKy5jcHAuaToKKwkkKENYWCkgJChDWFhGTEFHUykgJDwgLUUgPiAkQAorCislLm91dDogJS5jcHAKKwkkKENYWCkgJChDWFhGTEFHUykgJCouY3BwIC1jIC1VU0lOR0xFIC1ETUFJTiAtZyAtbyAkKi5vCisJJChDWFgpICQoQ1hYRkxBR1MpICQqLm8gJChMSUJTKSAtbyAkKgorCS4vJCogLXEKKwktcm0gLWYgJCoKKworY2xlYW46CisJLXJtIC1mciAke1RFU1RfRVhFfSAqLm8gKi5ycG8gKi5vYmogKi5vdXQgY29yZSAqfiBUZW1wbGF0ZXMuREIgU3VuV1NfY2FjaGUgY3h4X3JlcG9zaXRvcnkKZGlmZiAtLWdpdCBhL3Rlc3QvZWgvc3VucHJvLTY0Lm1hayBiL3Rlc3QvZWgvc3VucHJvLTY0Lm1hawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzNiZjBhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9laC9zdW5wcm8tNjQubWFrCkBAIC0wLDAgKzEsNjkgQEAKKyMgOzs7IC0qLSBNb2RlOm1ha2VmaWxlOy0qLSAKKyMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBNYWtlZmlsZS5pbiBieSBjb25maWd1cmUuCisjIFRoaXMgcmVxdWlyZXMgR05VIG1ha2UuCisKKworU0hFTEw9L2Jpbi9zaAorCisjIHBvaW50IHRoaXMgdG8gcHJvcGVyIGxvY2F0aW9uCitTVExfSU5DTD0gLUkke1BXRH0vLi4vLi4vc3RscG9ydAorCisjIFNUTF9JTkNMPSAtREVIX05PX1NHSV9TVEwKKworQVVYX0xJU1Q9VGVzdENsYXNzLmNwcCBtYWluLmNwcCBuY19hbGxvYy5jcHAgcmFuZG9tX251bWJlci5jcHAKKworVEVTVF9MSVNUPXRlc3RfYWxnby5jcHAgIFwKK3Rlc3RfYWxnb2Jhc2UuY3BwICAgICB0ZXN0X2xpc3QuY3BwIHRlc3Rfc2xpc3QuY3BwIFwKK3Rlc3RfYml0X3ZlY3Rvci5jcHAgICB0ZXN0X3ZlY3Rvci5jcHAgXAordGVzdF9kZXF1ZS5jcHAgdGVzdF9zZXQuY3BwIHRlc3RfbWFwLmNwcCBcCit0ZXN0X2hhc2hfbWFwLmNwcCAgdGVzdF9oYXNoX3NldC5jcHAgdGVzdF9yb3BlLmNwcCBcCit0ZXN0X3N0cmluZy5jcHAgdGVzdF9iaXRzZXQuY3BwIHRlc3RfdmFsYXJyYXkuY3BwCisKK0xJU1Q9JHtBVVhfTElTVH0gJHtURVNUX0xJU1R9CisKK09CSkVDVFMgPSAkKExJU1Q6JS5jcHA9JS5vKSAkKFNUQVRfTU9EVUxFKQorRVhFQ1MgPSAkKExJU1Q6JS5jcHA9JSkKK1RFU1RTID0gJChMSVNUOiUuY3BwPSUub3V0KQorVEVTVF9FWEUgID0gZWhfdGVzdAorVEVTVCAgPSBlaF90ZXN0Lm91dAorCitDQyA9IENDCitDWFggPSAkKENDKQorCitDWFhGTEFHUyA9ICR7U1RMX0lOQ0x9IC14YXJjaD12OSAtbGlicmFyeT1ubyVDc3RkIC1mZWF0dXJlcz1ydHRpIC1ERUhfVkVDVE9SX09QRVJBVE9SX05FVyAtREVIX0RFTEVURV9IQVNfVEhST1dfU1BFQyAteGlsZG9mZiAtZyAtRF9SRUVOVFJBTlQgLUROT19GQVNUX0FMTE9DQVRPUgorCisjIFRoaXMgaXMgdG8gdGVzdCB3aXRoIG5hdGl2ZSBTVEwKKyMgQ1hYRkxBR1MgPSArdzIgLXhpbGRvZmYgLURfU1RMUF9VU0VfTkVXQUxMT0MgLURFSF9OT19TR0lfU1RMIC1ERUhfTkVXX0hFQURFUlMgLURFSF9WRUNUT1JfT1BFUkFUT1JfTkVXIC1ERUhfREVMRVRFX0hBU19USFJPV19TUEVDCisKKworTElCUyA9IC1sbSAKK0xJQlNURENYWCA9IAorCitMSUJTVExQT1JUID0gLWxpYnJhcnk9bm8lQ3N0ZCAtTC4uLy4uL2xpYiAtbHN0bHBvcnRfc3VucHJvNjQKKworCitjaGVjazogJChURVNUKQorCiskKFRFU1QpIDogJChPQkpFQ1RTKQorCSQoQ1hYKSAkKENYWEZMQUdTKSAkKE9CSkVDVFMpICR7TElCU1RMUE9SVH0gJChMSUJTKSAtbyAkKFRFU1RfRVhFKQorCUxEX0xJQlJBUllfUEFUSD0iLi4vLi4vbGliOyR7TERfTElCUkFSWV9QQVRIfSIgLi8kKFRFU1RfRVhFKSAtcyAxMDAKKworU1VGRklYRVM6IC5jcHAuby5vdXQucmVzCisKKyUubyA6ICUuY3BwCisJJChDWFgpICQoQ1hYRkxBR1MpICQ8IC1jIC1vICRACisKKyUuaSA6ICUuY3BwCisJJChDWFgpICQoQ1hYRkxBR1MpICQ8IC1FIC1IID4gJEAKKworJS5vdXQ6ICUuY3BwCisJJChDWFgpICQoQ1hYRkxBR1MpICQ8IC1jIC1VU0lOR0xFIC1ETUFJTiAtZyAtbyAkKi5vCisJJChDWFgpICQoQ1hYRkxBR1MpICQqLm8gJChMSUJTKSAtbyAkKgorCS4vJCogLXEKKwktcm0gLWYgJCoKKworJS5zOiAlLmNwcAorCSQoQ1hYKSAkKENYWEZMQUdTKSAtTzQgLVMgLXB0byAkPCAgLW8gJEAKKworY2xlYW46CisJLXJtIC1mciAke1RFU1RfRVhFfSAqLm8gKi5ycG8gKi5vYmogKi5vdXQgY29yZSAqfiBUZW1wbGF0ZXMuREIgU3VuV1NfY2FjaGUKZGlmZiAtLWdpdCBhL3Rlc3QvZWgvc3VucHJvLm1hayBiL3Rlc3QvZWgvc3VucHJvLm1hawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODI2NjhmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9laC9zdW5wcm8ubWFrCkBAIC0wLDAgKzEsNzEgQEAKKyMgOzs7IC0qLSBNb2RlOm1ha2VmaWxlOy0qLSAKKyMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBNYWtlZmlsZS5pbiBieSBjb25maWd1cmUuCisjIFRoaXMgcmVxdWlyZXMgR05VIG1ha2UuCisKKworU0hFTEw9L2Jpbi9zaAorCisjIHBvaW50IHRoaXMgdG8gcHJvcGVyIGxvY2F0aW9uCitTVExfSU5DTD0gLUkke1BXRH0vLi4vLi4vc3RscG9ydAorCisjIFNUTF9JTkNMPSAtREVIX05PX1NHSV9TVEwKKworQVVYX0xJU1Q9VGVzdENsYXNzLmNwcCBtYWluLmNwcCBuY19hbGxvYy5jcHAgcmFuZG9tX251bWJlci5jcHAKKworVEVTVF9MSVNUPXRlc3RfYWxnby5jcHAgIFwKK3Rlc3RfYWxnb2Jhc2UuY3BwICAgICB0ZXN0X2xpc3QuY3BwIHRlc3Rfc2xpc3QuY3BwIFwKK3Rlc3RfYml0X3ZlY3Rvci5jcHAgICB0ZXN0X3ZlY3Rvci5jcHAgXAordGVzdF9kZXF1ZS5jcHAgdGVzdF9zZXQuY3BwIHRlc3RfbWFwLmNwcCBcCit0ZXN0X2hhc2hfbWFwLmNwcCAgdGVzdF9oYXNoX3NldC5jcHAgdGVzdF9yb3BlLmNwcCBcCit0ZXN0X3N0cmluZy5jcHAgdGVzdF9iaXRzZXQuY3BwIHRlc3RfdmFsYXJyYXkuY3BwCisKK0xJU1Q9JHtBVVhfTElTVH0gJHtURVNUX0xJU1R9CisKK09CSkVDVFMgPSAkKExJU1Q6JS5jcHA9JS5vKSAkKFNUQVRfTU9EVUxFKQorRVhFQ1MgPSAkKExJU1Q6JS5jcHA9JSkKK1RFU1RTID0gJChMSVNUOiUuY3BwPSUub3V0KQorVEVTVF9FWEUgID0gZWhfdGVzdAorVEVTVCAgPSBlaF90ZXN0Lm91dAorCitDQyA9IENDCitDWFggPSAkKENDKQorCisjIENYWEZMQUdTID0gJHtTVExfSU5DTH0gLWxpYnJhcnk9bm8lQ3N0ZCAtcW9wdGlvbiBjY2ZlIC1pbnN0bGliPS4uLy4uL2xpYi9saWJzdGxwb3J0X3N1bnByby5zbyAtZmVhdHVyZXM9cnR0aSAtREVIX1ZFQ1RPUl9PUEVSQVRPUl9ORVcgLURFSF9ERUxFVEVfSEFTX1RIUk9XX1NQRUMKKworQ1hYRkxBR1MgPSAke1NUTF9JTkNMfSAtbGlicmFyeT1ubyVDc3RkIC1mZWF0dXJlcz1ydHRpIC1ERUhfVkVDVE9SX09QRVJBVE9SX05FVyAtREVIX0RFTEVURV9IQVNfVEhST1dfU1BFQworCisjIFRoaXMgaXMgdG8gdGVzdCB3aXRoIG5hdGl2ZSBTVEwKKyMgQ1hYRkxBR1MgPSArdzIgLXhpbGRvZmYgLURfU1RMUF9VU0VfTkVXQUxMT0MgLURFSF9OT19TR0lfU1RMIC1ERUhfTkVXX0hFQURFUlMgLURFSF9WRUNUT1JfT1BFUkFUT1JfTkVXIC1ERUhfREVMRVRFX0hBU19USFJPV19TUEVDCisKKworTElCUyA9IC1sbSAKK0xJQlNURENYWCA9IAorCitMSUJTVExQT1JUID0gLWxpYnJhcnk9bm8lQ3N0ZCAtTC4uLy4uL2xpYiAtbHN0bHBvcnRfc3VucHJvCisKKworY2hlY2s6ICQoVEVTVCkKKworJChURVNUKSA6ICQoT0JKRUNUUykKKwkkKENYWCkgJChDWFhGTEFHUykgJChPQkpFQ1RTKSAke0xJQlNUTFBPUlR9ICQoTElCUykgLW8gJChURVNUX0VYRSkKKwlMRF9MSUJSQVJZX1BBVEg9Ii4uLy4uL2xpYjske0xEX0xJQlJBUllfUEFUSH0iIC4vJChURVNUX0VYRSkgLXMgMTAwCisKK1NVRkZJWEVTOiAuY3BwLm8ub3V0LnJlcworCislLm8gOiAlLmNwcAorCSQoQ1hYKSAkKENYWEZMQUdTKSAkPCAtYyAtbyAkQAorCislLmkgOiAlLmNwcAorCSQoQ1hYKSAkKENYWEZMQUdTKSAkPCAtRSAtSCA+ICRACisKKyUub3V0OiAlLmNwcAorCSQoQ1hYKSAkKENYWEZMQUdTKSAkPCAtYyAtVVNJTkdMRSAtRE1BSU4gLWcgLW8gJCoubworCSQoQ1hYKSAkKENYWEZMQUdTKSAkKi5vICQoTElCUykgJHtMSUJTVExQT1JUfSAtbyAkKgorCUxEX0xJQlJBUllfUEFUSD0iLi4vLi4vbGliOyR7TERfTElCUkFSWV9QQVRIfSIgLi8kKiAKKworCislLnM6ICUuY3BwCisJJChDWFgpICQoQ1hYRkxBR1MpIC1PNCAtUyAtcHRvICQ8ICAtbyAkQAorCitjbGVhbjoKKwktcm0gLWZyICR7VEVTVF9FWEV9ICoubyAqLnJwbyAqLm9iaiAqLm91dCBjb3JlICp+IFRlbXBsYXRlcy5EQiBTdW5XU19jYWNoZQpkaWZmIC0tZ2l0IGEvdGVzdC9laC9zdW5wcm80Mi5tYWsgYi90ZXN0L2VoL3N1bnBybzQyLm1hawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTU4ZjZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9laC9zdW5wcm80Mi5tYWsKQEAgLTAsMCArMSw3NiBAQAorIyA7OzsgLSotIE1vZGU6bWFrZWZpbGU7LSotIAorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIE1ha2VmaWxlLmluIGJ5IGNvbmZpZ3VyZS4KKyMgVGhpcyByZXF1aXJlcyBHTlUgbWFrZS4KKworIyBTSEVMTD0vYmluL3NoCisjIHNyY2RpciA9IC4KKyMgVlBBVEggPSAuCisKK1NIRUxMPS9iaW4vc2gKKworIyBwb2ludCB0aGlzIHRvIHByb3BlciBsb2NhdGlvbgorU1RMX0lOQ0w9IC1JLi4vLi4vc3RscG9ydAorCisjIFNUTF9JTkNMPSAtREVIX05PX1NHSV9TVEwKKworQVVYX0xJU1Q9VGVzdENsYXNzLmNwcCBtYWluLmNwcCBuY19hbGxvYy5jcHAgcmFuZG9tX251bWJlci5jcHAKKworVEVTVF9MSVNUPXRlc3RfYWxnby5jcHAgIFwKK3Rlc3RfYWxnb2Jhc2UuY3BwICAgICB0ZXN0X2xpc3QuY3BwIHRlc3Rfc2xpc3QuY3BwIFwKK3Rlc3RfYml0X3ZlY3Rvci5jcHAgICB0ZXN0X3ZlY3Rvci5jcHAgXAordGVzdF9kZXF1ZS5jcHAgdGVzdF9zZXQuY3BwIHRlc3RfbWFwLmNwcCBcCit0ZXN0X2hhc2hfbWFwLmNwcCAgdGVzdF9oYXNoX3NldC5jcHAgdGVzdF9yb3BlLmNwcCBcCit0ZXN0X3N0cmluZy5jcHAgdGVzdF9iaXRzZXQuY3BwIHRlc3RfdmFsYXJyYXkuY3BwCisKK0xJU1Q9JHtBVVhfTElTVH0gJHtURVNUX0xJU1R9CisKK09CSkVDVFMgPSAkKExJU1Q6JS5jcHA9JS5vKSAkKFNUQVRfTU9EVUxFKQorRVhFQ1MgPSAkKExJU1Q6JS5jcHA9JSkKK1RFU1RTID0gJChMSVNUOiUuY3BwPSUub3V0KQorVEVTVF9FWEUgID0gZWhfdGVzdAorVEVTVCAgPSBlaF90ZXN0Lm91dAorCitDQyA9IENDCitDWFggPSAkKENDKQorCitDWFhGTEFHUyA9ICQoQVJDSEYpICt3MiAtbXQgLWZlYXR1cmVzPXJ0dGkgJHtTVExfSU5DTH0KKyMgQ1hYRkxBR1MgPSArdzIgJHtTVExfSU5DTH0KKworCisKK0xJQlMgPSAtbG0gCisKK0xJQlNUTFBPUlQgPSAtTC4uLy4uL2xpYiAtbHN0bHBvcnRfc3VucHJvNDIKKworY2hlY2s6ICQoVEVTVCkKKworJChURVNUKSA6ICQoT0JKRUNUUykKKwllY2hvICdJbmZvOiBGb3IgQ0MgNC54LCB3YXJuaW5ncyBmcm9tIGxkIGluIHRoZSBmb3JtICJzeW1ib2wgYFhYWCcgaGFzIGRpZmZlcmluZyBzaXplcyIgYXJlIG5vcm1hbC4nCisJJChDWFgpICQoQ1hYRkxBR1MpICQoT0JKRUNUUykgJHtMSUJTVExQT1JUfSAkKExJQlMpIC1vICQoVEVTVF9FWEUpCisJTERfTElCUkFSWV9QQVRIPSIuLi8uLi9saWI6JChMRF9MSUJSQVJZX1BBVEgpIiAuLyQoVEVTVF9FWEUpIC1zIDEwMAorCitTVUZGSVhFUzogLmNwcC5vLm91dC5yZXMKKworJS5vIDogJS5jcHAKKwkkKENYWCkgJChDWFhGTEFHUykgJDwgLWMgLW8gJEAKKworJS5pIDogJS5jcHAKKwkkKENYWCkgJChDWFhGTEFHUykgJDwgLUUgLUggPiAkQAorCislLm91dDogJS5jcHAKKwkkKENYWCkgJChDWFhGTEFHUykgJDwgLWMgLVVTSU5HTEUgLURNQUlOIC1nIC1vICQqLm8KKwkkKENYWCkgJChDWFhGTEFHUykgJCoubyAkKExJQlNUTFBPUlQpICQoTElCUykgLW8gJCoKKwkuLyQqIC1xCisJLXJtIC1mICQqCisKKyUuczogJS5jcHAKKwkkKENYWCkgJChDWFhGTEFHUykgLU80IC1TIC1wdG8gJDwgIC1vICRACisKK2NsZWFuOgorCS1ybSAtZnIgJHtURVNUX0VYRX0gKi5vICoucnBvICoub2JqICoub3V0IGNvcmUgKn4gVGVtcGxhdGVzLkRCIFN1bldTX2NhY2hlCisKKworCisKKworCmRpZmYgLS1naXQgYS90ZXN0L2VoL3Rlc3QuY3BwIGIvdGVzdC9laC90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTk0MzAzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9laC90ZXN0LmNwcApAQCAtMCwwICsxLDQyIEBACisgICAgICAgICAgICNpbmNsdWRlIDxpb3N0cmVhbT4KKyAgICAgICAgICAgI2luY2x1ZGUgPHNldD4KKyAgICAgICAgICAgI2luY2x1ZGUgPHZlY3Rvcj4KKworICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPgorICAgICAgICAgICBpbmxpbmUgdm9pZCBwcmludEVsZW1lbnRzKGNvbnN0IFQmIGNvbGwsIGNvbnN0IGNoYXIqIG1zZyA9ICIiKQorICAgICAgICAgICB7CisgICAgICAgICAgIHR5cGVuYW1lIFQ6OmNvbnN0X2l0ZXJhdG9yIGl0OworICAgICAgICAgICBzdGQ6OmNvdXQgPDwgbXNnOworICAgICAgICAgICBmb3IoaXQgPSBjb2xsLmJlZ2luKCk7IGl0ICE9IGNvbGwuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgc3RkOjpjb3V0IDw8ICppdCA8PCAnICc7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgc3RkOjpjb3V0IDw8IHN0ZDo6IGVuZGw7CisgICAgICAgICAgIH0KKworICAgICAgICAgICBpbnQgbWFpbihpbnQgLyogYXJnYyAqLywgY2hhcioqIC8qIGFyZ3YgKi8pCisgICAgICAgICAgIHsKKyAgICAgICAgICAgc3RkOjpzZXQ8aW50PiBzZXQxLCBzZXQyOworICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+IGFWZWN0b3I7CisKKyAgICAgICAgICAgYVZlY3Rvci5wdXNoX2JhY2soMSk7CisgICAgICAgICAgIGFWZWN0b3IucHVzaF9iYWNrKDEpOworCisgICAgICAgICAgIHNldDEuaW5zZXJ0KGFWZWN0b3IuYmVnaW4oKSwgYVZlY3Rvci5lbmQoKSk7CisKKyAgICAgICAgICAgc2V0Mi5pbnNlcnQoMSk7CisgICAgICAgICAgIHNldDIuaW5zZXJ0KDEpOworCisgICAgICAgICAgIHByaW50RWxlbWVudHMoYVZlY3RvciwgInZlY3RvcjogIik7CisgICAgICAgICAgIHByaW50RWxlbWVudHMoc2V0MSwgInNldDEgOiAiKTsKKyAgICAgICAgICAgcHJpbnRFbGVtZW50cyhzZXQyLCAic2V0MiA6ICIpOworCisgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICB9CisjIGlmIDAKKyMgaW5jbHVkZSA8aW9zdHJlYW0+CittYWluKCkKK3sKKyAgLy8gc3RkOjpzdHJpbmdzdHJlYW0gdHN0cjsKKyAgc3RkOjpjb3V0PDwiaGVsbG8gd29ybGRcbiI7Cit9CisjIGVuZGlmCmRpZmYgLS1naXQgYS90ZXN0L2VoL3Rlc3RfYWxnby5jcHAgYi90ZXN0L2VoL3Rlc3RfYWxnby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZmOTA1YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZWgvdGVzdF9hbGdvLmNwcApAQCAtMCwwICsxLDI2MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIHRlc3RfYWxnby5jcHAKKworICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBNYXJrIG9mIHRoZSBVbmljb3JuLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBNYXJrIG9mIHRoZSBVbmljb3JuIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgIlRlc3RzLmgiCisjaW5jbHVkZSAiTGVha0NoZWNrLmgiCisjaW5jbHVkZSAiU29ydENsYXNzLmgiCisKKyNpZiBkZWZpbmVkIChFSF9ORVdfSEVBREVSUykKKyMgaW5jbHVkZSA8YWxnb3JpdGhtPgorIyBpbmNsdWRlIDxjYXNzZXJ0PgorI2Vsc2UKKyMgaW5jbHVkZSA8YWxnby5oPgorIyBpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoRUhfTkVXX0lPU1RSRUFNUykKKyMgaW5jbHVkZSA8aW9zdHJlYW0+CisjZWxzZQorIyBpbmNsdWRlIDxpb3N0cmVhbS5oPgorI2VuZGlmCisKKy8vCisvLyBTb3J0QnVmZmVyIC0tIGEgYnVmZmVyIG9mIFNvcnRDbGFzcyBvYmplY3RzIHRoYXQgY2FuIGJlIHVzZWQgdG8gdGVzdCBzb3J0aW5nLgorLy8KK3N0cnVjdCBTb3J0QnVmZmVyCit7CisgICAgZW51bSB7IGtCdWZmZXJTaXplID0gMTAwIH07CisKKyAgICBTb3J0Q2xhc3MqIGJlZ2luKCkgeyByZXR1cm4gaXRlbXM7IH0KKyAgICBjb25zdCBTb3J0Q2xhc3MqIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gaXRlbXM7IH0KKyAgICBTb3J0Q2xhc3MqIGVuZCgpIHsgcmV0dXJuIGl0ZW1zICsga0J1ZmZlclNpemU7IH0KKyAgICBjb25zdCBTb3J0Q2xhc3MqIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGl0ZW1zICsga0J1ZmZlclNpemU7IH0KKworICAvLyBTb3J0IGVhY2ggaGFsZiBvZiB0aGUgYnVmZmVyIGFuZCByZXNldCB0aGUgYWRkcmVzcyBvZiBlYWNoIGVsZW1lbnQKKyAgLy8gc28gdGhhdCBtZXJnZSgpIGNhbiBiZSB0ZXN0ZWQgZm9yIHN0YWJpbGl0eS4KKyAgICB2b2lkIFByZXBhcmVNZXJnZSgpCisgICAgeworICAgICAgICBFSF9TVEQ6OnNvcnQoIGJlZ2luKCksIGJlZ2luKCkgKyAoIGVuZCgpIC0gYmVnaW4oKSApLzIgKTsKKyAgICAgICAgRUhfU1REOjpzb3J0KCBiZWdpbigpICsgKCBlbmQoKSAtIGJlZ2luKCkgKS8yLCBlbmQoKSApOworICAgICAgICBmb3IgKCBTb3J0Q2xhc3MqIHAgPSBiZWdpbigpOyBwICE9IGVuZCgpOyBwKysgKQorICAgICAgICAgICAgcC0+UmVzZXRBZGRyZXNzKCk7CisgICAgfQorCisgIFNvcnRCdWZmZXIoKQorICB7CisgICAgUHJlcGFyZU1lcmdlKCk7CisgIH0KKworICBTb3J0QnVmZmVyKCBjb25zdCBTb3J0QnVmZmVyJiByaHMgKQorICB7CisgICAgU29ydENsYXNzKiBxID0gYmVnaW4oKTsKKyAgICBmb3IgKCBjb25zdCBTb3J0Q2xhc3MqIHAgPSByaHMuYmVnaW4oKSA7IHAgIT0gcmhzLmVuZCgpOyBwKysscSsrICkKKyAgICAgICpxID0gKnA7CisgIH0KKworcHJpdmF0ZToKKyAgICBTb3J0Q2xhc3MgaXRlbXNba0J1ZmZlclNpemVdOworfTsKKworLy8KKy8vIGxlc3NfYnlfcmVmZXJlbmNlIC0tIGEgZnVuY3RvciBmb3IgY29tcGFyaW5nIG9iamVjdHMgYWdhaW5zdCBhCisvLyAgIGNvbnN0YW50IHZhbHVlLgorLy8KK3RlbXBsYXRlIDxjbGFzcyBUPgorc3RydWN0IGxlc3NfYnlfcmVmZXJlbmNlCit7CisgICAgbGVzc19ieV9yZWZlcmVuY2UoIGNvbnN0IFQmIGFyZyApIDogZkFyZyhhcmcpIHt9CisgICAgYm9vbCBvcGVyYXRvcigpKCBjb25zdCBUJiB4ICkgY29uc3QgeyByZXR1cm4geCA8IGZBcmc7IH0KK3ByaXZhdGU6CisgICAgY29uc3QgVCYgZkFyZzsKK307CisKK3N0cnVjdCB0ZXN0X3N0YWJsZV9wYXJ0aXRpb24KK3sKKyAgICB0ZXN0X3N0YWJsZV9wYXJ0aXRpb24oIGNvbnN0IFNvcnRCdWZmZXImIGJ1ZiApCisgICAgICAgIDogb3JpZyggYnVmICksIHBhcnRpdGlvblBvaW50KFNvcnRDbGFzczo6a1JhbmdlIC8gMikgeworICAgICAgICBnVGVzdENvbnRyb2xsZXIuU2V0Q3VycmVudFRlc3ROYW1lKCJzdGFibGVfcGFydGl0aW9uKCkiKTsKKyAgICAgICAgfQorCisgICAgdm9pZCBvcGVyYXRvcigpKCBTb3J0QnVmZmVyJiBidWYgKSBjb25zdAorICAgIHsKKyAgICAgICAgbGVzc19ieV9yZWZlcmVuY2U8U29ydENsYXNzPiB0aHJvd19jbXAoIHBhcnRpdGlvblBvaW50ICk7CisKKyAgICAgICAgU29ydENsYXNzKiBkID0gRUhfU1REOjpzdGFibGVfcGFydGl0aW9uKCBidWYuYmVnaW4oKSwgYnVmLmVuZCgpLCB0aHJvd19jbXAgKTsKKworICAgICAgICAvLyBTdXBwcmVzcyB3YXJuaW5nIGFib3V0IHVudXNlZCB2YXJpYWJsZS4KKyAgICAgICAgZDsKKworICAgICAgICAvLyBJZiB3ZSBnZXQgaGVyZSBubyBleGNlcHRpb24gb2NjdXJyZWQgZHVyaW5nIHRoZSBvcGVyYXRpb24uCisgICAgICAgIC8vIFN0b3AgYW55IHBvdGVudGlhbCBmYWlsdXJlcyB0aGF0IG1pZ2h0IG9jY3VyIGR1cmluZyB2ZXJpZmljYXRpb24uCisgICAgICAgIGdUZXN0Q29udHJvbGxlci5DYW5jZWxGYWlsdXJlQ291bnRkb3duKCk7CisKKyAgICAgICAgLy8gUHJlcGFyZSBhbiBhcnJheSBvZiBjb3VudHMgb2YgdGhlIG9jY3VycmVuY2Ugb2YgZWFjaCB2YWx1ZSBpbgorICAgICAgICAvLyB0aGUgbGVnYWwgcmFuZ2UuCisgICAgICAgIHVuc2lnbmVkIGNvdW50c1tTb3J0Q2xhc3M6OmtSYW5nZV07CisgICAgICAgIEVIX1NURDo6ZmlsbF9uKCBjb3VudHMsIChpbnQpU29ydENsYXNzOjprUmFuZ2UsIDAgKTsKKyAgICAgICAgZm9yICggY29uc3QgU29ydENsYXNzICpxID0gb3JpZy5iZWdpbigpOyBxICE9IG9yaWcuZW5kKCk7IHErKyApCisgICAgICAgICAgICBjb3VudHNbIHEtPnZhbHVlKCkgXSsrOworCisgICAgICAgIGxlc3NfYnlfcmVmZXJlbmNlPFRlc3RDbGFzcz4gY21wKCBwYXJ0aXRpb25Qb2ludCApOworICAgICAgICBmb3IgKCBjb25zdCBTb3J0Q2xhc3MqIHAgPSBidWYuYmVnaW4oKTsgcCAhPSBidWYuZW5kKCk7IHArKyApCisgICAgICAgIHsKKyAgICAgICAgICAvLyBDaGVjayB0aGF0IGFkamFjZW50IGl0ZW1zIHdpdGggdGhlIHNhbWUgdmFsdWUgaGF2ZW4ndCBiZWVuCisgICAgICAgICAgLy8gcmVvcmRlcmVkLiBUaGlzIGNvdWxkIGJlIGEgbW9yZSB0aG9yb3VnaCB0ZXN0LgorICAgICAgICAgICAgaWYgKCBwICE9IGJ1Zi5iZWdpbigpICYmIHAtPnZhbHVlKCkgPT0gcFstMV0udmFsdWUoKSApIHsKKyAgICAgICAgICAgICAgICBFSF9BU1NFUlQoIHAtPkdldEFkZHJlc3MoKSA+IHBbLTFdLkdldEFkZHJlc3MoKSApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBDaGVjayB0aGF0IHRoZSBwYXJ0aXRpb25pbmcgd29ya2VkLgorICAgICAgICAgICAgRUhfQVNTRVJUKCAocCA8IGQpID09IGNtcCggKnAgKSApOworCisgICAgICAgICAgICAvLyBEZWNyZW1lbnQgdGhlIGFwcHJvcHJpYXRlIGNvdW50IGZvciBlYWNoIHZhbHVlLgorICAgICAgICAgICAgY291bnRzWyBwLT52YWx1ZSgpIF0tLTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIHRoYXQgdGhlIHZhbHVlcyB3ZXJlIG9ubHkgcmVhcnJhbmdlZCwgYW5kIG5vbmUgd2VyZSBsb3N0LgorICAgICAgICBmb3IgKCB1bnNpZ25lZCBqID0gMDsgaiA8IFNvcnRDbGFzczo6a1JhbmdlOyBqKysgKSB7CisgICAgICAgICAgICBFSF9BU1NFUlQoIGNvdW50c1tqXSA9PSAwICk7CisgICAgICAgIH0KKyAgICB9CisKK3ByaXZhdGU6CisgICAgY29uc3QgU29ydEJ1ZmZlciYgb3JpZzsKKyAgICBTb3J0Q2xhc3MgcGFydGl0aW9uUG9pbnQ7Cit9OworCit2b2lkIGFzc2VydF9zb3J0ZWRfdmVyc2lvbiggY29uc3QgU29ydEJ1ZmZlciYgb3JpZywgY29uc3QgU29ydEJ1ZmZlciYgYnVmICk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgYXNzZXJ0X3NvcnRlZF92ZXJzaW9uCisKKyAgRUZGRUNUUzogQXNzZXJ0cyB0aGF0IGJ1ZiBpcyBhIHN0YWJsZS1zb3J0ZWQgdmVyc2lvbiBvZiBvcmlnLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgYXNzZXJ0X3NvcnRlZF92ZXJzaW9uKCBjb25zdCBTb3J0QnVmZmVyJiBvcmlnLCBjb25zdCBTb3J0QnVmZmVyJiBidWYgKQoreworICAvLyBTdG9wIGFueSBwb3RlbnRpYWwgZmFpbHVyZXMgdGhhdCBtaWdodCBvY2N1ciBkdXJpbmcgdmVyaWZpY2F0aW9uLgorICAgIGdUZXN0Q29udHJvbGxlci5DYW5jZWxGYWlsdXJlQ291bnRkb3duKCk7CisKKyAgICAvLyBQcmVwYXJlIGFuIGFycmF5IG9mIGNvdW50cyBvZiB0aGUgb2NjdXJyZW5jZSBvZiBlYWNoIHZhbHVlIGluCisgICAgLy8gdGhlIGxlZ2FsIHJhbmdlLgorICAgIHVuc2lnbmVkIGNvdW50c1tTb3J0Q2xhc3M6OmtSYW5nZV07CisgICAgRUhfU1REOjpmaWxsX24oIGNvdW50cywgKGludClTb3J0Q2xhc3M6OmtSYW5nZSwgMCApOworICAgIGZvciAoIGNvbnN0IFNvcnRDbGFzcyAqcSA9IG9yaWcuYmVnaW4oKTsgcSAhPSBvcmlnLmVuZCgpOyBxKysgKQorICAgICAgICBjb3VudHNbIHEtPnZhbHVlKCkgXSsrOworCisgIC8vIENoZWNrIHRoYXQgZWFjaCBlbGVtZW50IGlzIGdyZWF0ZXIgdGhhbiB0aGUgcHJldmlvdXMgb25lLCBvciBpZiB0aGV5IGFyZQorICAvLyBlcXVhbCwgdGhhdCB0aGVpciBvcmRlciBoYXMgYmVlbiBwcmVzZXJ2ZWQuCisgICAgZm9yICggY29uc3QgU29ydENsYXNzKiBwID0gYnVmLmJlZ2luKCk7IHAgIT0gYnVmLmVuZCgpOyBwKysgKQorICAgIHsKKyAgICAgICAgaWYgKCBwICE9IGJ1Zi5iZWdpbigpICkgeworICAgICAgICAgICAgRUhfQVNTRVJUKCBwLT52YWx1ZSgpID4gcFstMV0udmFsdWUoKQorICAgICAgICAgICAgICAgICAgICB8fCBwLT52YWx1ZSgpID09IHBbLTFdLnZhbHVlKCkgJiYgcC0+R2V0QWRkcmVzcygpID4gcFstMV0uR2V0QWRkcmVzcygpICk7CisgICAgICAgIH0KKyAgICAvLyBEZWNyZW1lbnQgdGhlIGFwcHJvcHJpYXRlIGNvdW50IGZvciBlYWNoIHZhbHVlLgorICAgICAgICBjb3VudHNbIHAtPnZhbHVlKCkgXS0tOworICAgIH0KKworICAvLyBDaGVjayB0aGF0IHRoZSB2YWx1ZXMgd2VyZSBvbmx5IHJlYXJyYW5nZWQsIGFuZCBub25lIHdlcmUgbG9zdC4KKyAgICBmb3IgKCB1bnNpZ25lZCBqID0gMDsgaiA8IFNvcnRDbGFzczo6a1JhbmdlOyBqKysgKSB7CisgICAgICAgIEVIX0FTU0VSVCggY291bnRzW2pdID09IDAgKTsKKyAgICB9Cit9CisKKy8vCisvLyBUaGUgdGVzdCBvcGVyYXRvcnMKKy8vCitzdHJ1Y3QgdGVzdF9zdGFibGVfc29ydF8xCit7CisgICAgdGVzdF9zdGFibGVfc29ydF8xKCBjb25zdCBTb3J0QnVmZmVyJiBidWYgKQorICAgICAgICA6IG9yaWcoIGJ1ZiApIHsKKyAgICAgICAgZ1Rlc3RDb250cm9sbGVyLlNldEN1cnJlbnRUZXN0TmFtZSgic3RhYmxlX3NvcnQoKSAjMSIpOworICAgICAgICB9CisKKyAgICB2b2lkIG9wZXJhdG9yKCkoIFNvcnRCdWZmZXImIGJ1ZiApIGNvbnN0CisgICAgeworICAgICAgICBFSF9TVEQ6OnN0YWJsZV9zb3J0KCBidWYuYmVnaW4oKSwgYnVmLmVuZCgpICk7CisgICAgICAgIGFzc2VydF9zb3J0ZWRfdmVyc2lvbiggb3JpZywgYnVmICk7CisgICAgfQorCitwcml2YXRlOgorICAgIGNvbnN0IFNvcnRCdWZmZXImIG9yaWc7Cit9OworCitzdHJ1Y3QgdGVzdF9zdGFibGVfc29ydF8yCit7CisgICAgdGVzdF9zdGFibGVfc29ydF8yKCBjb25zdCBTb3J0QnVmZmVyJiBidWYgKQorICAgICAgICA6IG9yaWcoIGJ1ZiApIHsKKyAgICAgICAgICAgIGdUZXN0Q29udHJvbGxlci5TZXRDdXJyZW50VGVzdE5hbWUoInN0YWJsZV9zb3J0KCkgIzIiKTsKKyAgICAgICAgfQorCisgICAgdm9pZCBvcGVyYXRvcigpKCBTb3J0QnVmZmVyJiBidWYgKSBjb25zdAorICAgIHsKKyAgICAgIEVIX1NURDo6c3RhYmxlX3NvcnQoIGJ1Zi5iZWdpbigpLCBidWYuZW5kKCksIEVIX1NURDo6bGVzczxTb3J0Q2xhc3M+KCkgKTsKKyAgICAgIGFzc2VydF9zb3J0ZWRfdmVyc2lvbiggb3JpZywgYnVmICk7CisgICAgfQorCitwcml2YXRlOgorICAgIGNvbnN0IFNvcnRCdWZmZXImIG9yaWc7Cit9OworCitzdHJ1Y3QgdGVzdF9pbnBsYWNlX21lcmdlXzEKK3sKKyAgICB0ZXN0X2lucGxhY2VfbWVyZ2VfMSggU29ydEJ1ZmZlciYgYnVmICkKKyAgICAgICAgOiBvcmlnKCBidWYgKSB7CisgICAgICAgIGdUZXN0Q29udHJvbGxlci5TZXRDdXJyZW50VGVzdE5hbWUoImlucGxhY2VfbWVyZ2UgIzEoKSIpOworICAgICAgICB9CisKKyAgICB2b2lkIG9wZXJhdG9yKCkoIFNvcnRCdWZmZXImIGJ1ZiApIGNvbnN0CisgICAgeworICAgICAgICBFSF9TVEQ6OmlucGxhY2VfbWVyZ2UoIGJ1Zi5iZWdpbigpLCBidWYuYmVnaW4oKSArICggYnVmLmVuZCgpIC0gYnVmLmJlZ2luKCkgKS8yLCBidWYuZW5kKCkgKTsKKyAgICAgICAgYXNzZXJ0X3NvcnRlZF92ZXJzaW9uKCBvcmlnLCBidWYgKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgY29uc3QgU29ydEJ1ZmZlciYgb3JpZzsKK307CisKK3N0cnVjdCB0ZXN0X2lucGxhY2VfbWVyZ2VfMgoreworICAgIHRlc3RfaW5wbGFjZV9tZXJnZV8yKCBTb3J0QnVmZmVyJiBidWYgKQorICAgICAgICA6IG9yaWcoIGJ1ZiApIHsKKyAgICAgICAgZ1Rlc3RDb250cm9sbGVyLlNldEN1cnJlbnRUZXN0TmFtZSgiaW5wbGFjZV9tZXJnZSgpICMyIik7CisgICAgICAgIH0KKworICAgIHZvaWQgb3BlcmF0b3IoKSggU29ydEJ1ZmZlciYgYnVmICkgY29uc3QKKyAgICB7CisgICAgICAgIEVIX1NURDo6aW5wbGFjZV9tZXJnZSggYnVmLmJlZ2luKCksIGJ1Zi5iZWdpbigpICsgKCBidWYuZW5kKCkgLSBidWYuYmVnaW4oKSApLzIsIGJ1Zi5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgRUhfU1REOjpsZXNzPFNvcnRDbGFzcz4oKSApOworICAgICAgICBhc3NlcnRfc29ydGVkX3ZlcnNpb24oIG9yaWcsIGJ1ZiApOworICAgIH0KKworcHJpdmF0ZToKKyAgICBjb25zdCBTb3J0QnVmZmVyJiBvcmlnOworfTsKKwordm9pZCB0ZXN0X2FsZ28oKQoreworICAgIFNvcnRCdWZmZXIgbWVyZ2VCdWY7CisgICAgbWVyZ2VCdWYuUHJlcGFyZU1lcmdlKCk7CisKKyAgICBFSF9TVEQ6OmNlcnI8PCJFSCB0ZXN0IDogdGVzdGluZyBhbGdvLmgiPDxFSF9TVEQ6OmVuZGw7CisgICAgV2Vha0NoZWNrKCBtZXJnZUJ1ZiwgdGVzdF9pbnBsYWNlX21lcmdlXzEoIG1lcmdlQnVmICkgKTsKKyAgICBXZWFrQ2hlY2soIG1lcmdlQnVmLCB0ZXN0X2lucGxhY2VfbWVyZ2VfMiggbWVyZ2VCdWYgKSApOworCisgICAgU29ydEJ1ZmZlciBidWY7CisgICAgV2Vha0NoZWNrKCBidWYsIHRlc3Rfc3RhYmxlX3NvcnRfMSggYnVmICkgKTsKKyAgICBXZWFrQ2hlY2soIGJ1ZiwgdGVzdF9zdGFibGVfc29ydF8yKCBidWYgKSApOworICAgIFdlYWtDaGVjayggYnVmLCB0ZXN0X3N0YWJsZV9wYXJ0aXRpb24oIGJ1ZiApICk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L2VoL3Rlc3RfYWxnb2Jhc2UuY3BwIGIvdGVzdC9laC90ZXN0X2FsZ29iYXNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGI0OTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9laC90ZXN0X2FsZ29iYXNlLmNwcApAQCAtMCwwICsxLDk4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgdGVzdF9hbGdvYmFzZS5jcHAKKworICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBNYXJrIG9mIHRoZSBVbmljb3JuLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBNYXJrIG9mIHRoZSBVbmljb3JuIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjIGluY2x1ZGUgIlByZWZpeC5oIgorIyBpZiBkZWZpbmVkIChFSF9ORVdfSEVBREVSUykKKyMgaWZkZWYgX19TVU5QUk9fQ0MKKyMgaW5jbHVkZSA8c3RkaW8uaD4KKyMgZW5kaWYKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjIGVsc2UKKyNpbmNsdWRlIDxhbGdvLmg+CisjIGVuZGlmCisjaW5jbHVkZSAiVGVzdHMuaCIKKyNpbmNsdWRlICJMZWFrQ2hlY2suaCIKKyNpbmNsdWRlICJUZXN0Q2xhc3MuaCIKKworLy8gRUhfVVNFX1NURAorCitlbnVtIHsga0J1ZmZlclNpemUgPSAxMDAgfTsKKworc3RydWN0IHRlc3RfdW5pbml0aWFsaXplZF9jb3B5Cit7CisgICAgdGVzdF91bmluaXRpYWxpemVkX2NvcHkoKQorICAgICAgICA6IHN0dWZmKCBuZXcgVGVzdENsYXNzW2tCdWZmZXJTaXplXSApLCBlbmRfb2Zfc3R1ZmYoc3R1ZmYgKyBrQnVmZmVyU2l6ZSkgeworICAgICAgICBnVGVzdENvbnRyb2xsZXIuU2V0Q3VycmVudFRlc3ROYW1lKCJ1bmluaXRpYWxpemVkX2NvcHkoKSIpOworICAgICAgICB9CisKKyAgICB+dGVzdF91bmluaXRpYWxpemVkX2NvcHkoKSB7IGRlbGV0ZVtdIHN0dWZmOyB9CisKKyAgICB2b2lkIG9wZXJhdG9yKCkoIFRlc3RDbGFzcyogYnVmZmVyICkgY29uc3QKKyAgICB7CisgICAgICAgIEVIX1NURDo6dW5pbml0aWFsaXplZF9jb3B5KChUZXN0Q2xhc3MqKXN0dWZmLCAoVGVzdENsYXNzKillbmRfb2Zfc3R1ZmYsIGJ1ZmZlciApOworICAgICAgICBFSF9BU1NFUlQoIEVIX1NURDo6ZXF1YWwoIChUZXN0Q2xhc3MqKXN0dWZmLCAoVGVzdENsYXNzKillbmRfb2Zfc3R1ZmYsIGJ1ZmZlciApICk7CisgICAgICAgIHN0bF9kZXN0cm95KCBidWZmZXIsIGJ1ZmZlcitrQnVmZmVyU2l6ZSApOworICAgIH0KKworcHJpdmF0ZToKKyAgICBUZXN0Q2xhc3MgKiBzdHVmZjsKKyAgICBUZXN0Q2xhc3MgKiBlbmRfb2Zfc3R1ZmY7Cit9OworCitzdHJ1Y3QgdGVzdF91bmluaXRpYWxpemVkX2ZpbGwKK3sKKyAgICB0ZXN0X3VuaW5pdGlhbGl6ZWRfZmlsbCgpIHsKKyAgICAgICAgZ1Rlc3RDb250cm9sbGVyLlNldEN1cnJlbnRUZXN0TmFtZSgidW5pbml0aWFsaXplZF9maWxsKCkiKTsKKyAgICB9CisKKyAgICB2b2lkIG9wZXJhdG9yKCkoIFRlc3RDbGFzcyogYnVmZmVyICkgY29uc3QKKyAgICB7CisgICAgICAgIFRlc3RDbGFzcyogYnVmX2VuZCA9IGJ1ZmZlciArIGtCdWZmZXJTaXplOworICAgICAgICBFSF9TVEQ6OnVuaW5pdGlhbGl6ZWRfZmlsbCggYnVmZmVyLCBidWZfZW5kLCB0ZXN0VmFsdWUgKTsKKyAgICAgICAgZm9yICggRUhfQ1NURDo6c2l6ZV90IGkgPSAwOyBpIDwga0J1ZmZlclNpemU7IGkrKyApCisgICAgICAgICAgICBFSF9BU1NFUlQoIGJ1ZmZlcltpXSA9PSB0ZXN0VmFsdWUgKTsKKyAgICAgICAgc3RsX2Rlc3Ryb3koIGJ1ZmZlciwgYnVmX2VuZCApOworICAgIH0KK3ByaXZhdGU6CisgICAgVGVzdENsYXNzIHRlc3RWYWx1ZTsKK307CisKK3N0cnVjdCB0ZXN0X3VuaW5pdGlhbGl6ZWRfZmlsbF9uCit7CisgICAgdGVzdF91bmluaXRpYWxpemVkX2ZpbGxfbigpIHsKKyAgICAgICAgZ1Rlc3RDb250cm9sbGVyLlNldEN1cnJlbnRUZXN0TmFtZSgidW5pbml0aWFsaXplZF9maWxsX24oKSIpOworICAgIH0KKyAgICB2b2lkIG9wZXJhdG9yKCkoIFRlc3RDbGFzcyogYnVmZmVyICkgY29uc3QKKyAgICB7CisgICAgICAgIFRlc3RDbGFzcyogZW5kID0gYnVmZmVyICsga0J1ZmZlclNpemU7CisgICAgICAgIEVIX1NURDo6dW5pbml0aWFsaXplZF9maWxsX24oIGJ1ZmZlciwgKEVIX0NTVEQ6OnNpemVfdClrQnVmZmVyU2l6ZSwgdGVzdFZhbHVlICk7CisgICAgICAgIGZvciAoIEVIX0NTVEQ6OnNpemVfdCBpID0gMDsgaSA8IGtCdWZmZXJTaXplOyBpKysgKQorICAgICAgICAgICAgRUhfQVNTRVJUKCBidWZmZXJbaV0gPT0gdGVzdFZhbHVlICk7CisgICAgICAgIHN0bF9kZXN0cm95KCBidWZmZXIsIGVuZCApOworICAgIH0KK3ByaXZhdGU6CisgICAgVGVzdENsYXNzIHRlc3RWYWx1ZTsKK307CisKK3ZvaWQgdGVzdF9hbGdvYmFzZSgpCit7CisgIC8vIGZvcmNlIGFsaWdubWVudAorICBkb3VibGUgYXJyWyBzaXplb2YoVGVzdENsYXNzKSAqIGtCdWZmZXJTaXplIF07CisgIFRlc3RDbGFzcyogYyA9IChUZXN0Q2xhc3MqKWFycjsKKyAgV2Vha0NoZWNrKCBjLCB0ZXN0X3VuaW5pdGlhbGl6ZWRfY29weSgpICk7CisgIFdlYWtDaGVjayggYywgdGVzdF91bmluaXRpYWxpemVkX2ZpbGwoKSApOworICBXZWFrQ2hlY2soIGMsIHRlc3RfdW5pbml0aWFsaXplZF9maWxsX24oKSApOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9laC90ZXN0X2Fzc2lnbl9vcC5oIGIvdGVzdC9laC90ZXN0X2Fzc2lnbl9vcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxOGU3YzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2VoL3Rlc3RfYXNzaWduX29wLmgKQEAgLTAsMCArMSw0NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIHRlc3RfYXNzaWduX29wLmgKKworICAgIFNVTU1BUlk6IFRlc3QgZnVuY3RvciB0ZW1wbGF0ZSBmb3IgYXNzaWdubWVudCBvcGVyYXRvcnMuCisKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogTWFyayBvZiB0aGUgVW5pY29ybiwgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgTWFyayBvZiB0aGUgVW5pY29ybiBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgdGVzdF9hc3NpZ25fb3BfSF8KKyNkZWZpbmUgdGVzdF9hc3NpZ25fb3BfSF8KKworI2luY2x1ZGUgIlByZWZpeC5oIgorI2lmZGVmIEVIX05FV19IRUFERVJTCisjICBpbmNsdWRlIDxjYXNzZXJ0PgorI2Vsc2UKKyMgIGluY2x1ZGUgPGFzc2VydC5oPgorI2VuZGlmCisjaW5jbHVkZSAibmNfYWxsb2MuaCIKKwordGVtcGxhdGUgPGNsYXNzIFQ+CitzdHJ1Y3QgdGVzdF9hc3NpZ25fb3AgeworICB0ZXN0X2Fzc2lnbl9vcCggY29uc3QgVCYgc3JjICkKKyAgICA6IHNvdXJjZShzcmMpIHsKKyAgICBnVGVzdENvbnRyb2xsZXIuU2V0Q3VycmVudFRlc3ROYW1lKCJhc3NpZ25tZW50IG9wZXJhdG9yIik7CisgIH0KKworICB2b2lkIG9wZXJhdG9yKCkoIFQmIHQgKSBjb25zdCB7CisgICAgdCA9IHNvdXJjZTsKKworICAgIC8vIFByZXZlbnQgc2ltdWxhdGVkIGZhaWx1cmVzIGR1cmluZyB2ZXJpZmljYXRpb24KKyAgICBnVGVzdENvbnRyb2xsZXIuQ2FuY2VsRmFpbHVyZUNvdW50ZG93bigpOworICAgIC8vRUhfQVNTRVJUKCBzb3VyY2UgPT0gdCApOworICB9Citwcml2YXRlOgorICBjb25zdCBUJiBzb3VyY2U7Cit9OworCisjZW5kaWYgLy8gdGVzdF9hc3NpZ25fb3BfSF8KZGlmZiAtLWdpdCBhL3Rlc3QvZWgvdGVzdF9iaXRfdmVjdG9yLmNwcCBiL3Rlc3QvZWgvdGVzdF9iaXRfdmVjdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjExMjFlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9laC90ZXN0X2JpdF92ZWN0b3IuY3BwCkBAIC0wLDAgKzEsMTI5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgdGVzdF9iaXRfdmVjdG9yLmNwcAorCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1hcmsgb2YgdGhlIFVuaWNvcm4sIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIE1hcmsgb2YgdGhlIFVuaWNvcm4gbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiVGVzdHMuaCIKKworI2lmIGRlZmluZWQoIEVIX0JJVF9WRUNUT1JfSU1QTEVNRU5URUQgKQorCisjIGlmIGRlZmluZWQgKEVIX05FV19IRUFERVJTKQorIyBpZmRlZiBfX1NVTlBST19DQworIyBpbmNsdWRlIDxzdGRpby5oPgorIyBlbmRpZgorI2luY2x1ZGUgPHZlY3Rvcj4KKyMgZWxzZQorI2luY2x1ZGUgPGJ2ZWN0b3IuaD4KKyMgZW5kaWYKKworI2luY2x1ZGUgIkxlYWtDaGVjay5oIgorI2luY2x1ZGUgInRlc3RfY29uc3RydWN0LmgiCisjaW5jbHVkZSAidGVzdF9hc3NpZ25fb3AuaCIKKyNpbmNsdWRlICJ0ZXN0X3B1c2hfYmFjay5oIgorI2luY2x1ZGUgInRlc3RfaW5zZXJ0LmgiCisjaW5jbHVkZSAidGVzdF9wdXNoX2Zyb250LmgiCisKK3R5cGVkZWYgRUhfQklUX1ZFQ1RPUiBCaXRWZWN0b3I7CisKK2lubGluZSBzZXF1ZW5jZV9jb250YWluZXJfdGFnCitjb250YWluZXJfY2F0ZWdvcnkoY29uc3QgQml0VmVjdG9yJikKK3sKKyAgcmV0dXJuIHNlcXVlbmNlX2NvbnRhaW5lcl90YWcoKTsKK30KKworVVNJTkdfQ1NURF9OQU1FKHNpemVfdCkKKworICAvLworLy8gdGVzdF9CaXRWZWN0b3JfcmVzZXJ2ZQorLy8KK3N0cnVjdCB0ZXN0X0JpdFZlY3Rvcl9yZXNlcnZlCit7CisgICAgdGVzdF9CaXRWZWN0b3JfcmVzZXJ2ZSggc2l6ZV90IG4gKSA6IGZBbW91bnQobikKKyAgICB7CisgICAgICAgIGdUZXN0Q29udHJvbGxlci5TZXRDdXJyZW50VGVzdE5hbWUoIkJpdFZlY3Rvcjo6cmVzZXJ2ZSgpIik7CisgICAgfQorCisgICAgdm9pZCBvcGVyYXRvcigpKCBCaXRWZWN0b3ImIHYgKSBjb25zdAorICAgIHsKKyAgICAgICAgdi5yZXNlcnZlKCBmQW1vdW50ICk7CisgICAgfQorcHJpdmF0ZToKKyAgICBzaXplX3QgZkFtb3VudDsKK307CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgdGVzdF9iaXRfdmVjdG9yCisKKyAgRUZGRUNUUzogIFBlcmZvcm1zIHRlc3RzIG9uIGJpdCB2ZWN0b3JzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCB0ZXN0X2JpdF92ZWN0b3IoKQoreworI2RlZmluZSBfX1dPUkRfQklUIChpbnQoQ0hBUl9CSVQqc2l6ZW9mKHVuc2lnbmVkIGludCkpKQorCisgIC8vIE1ha2Ugc29tZSBiaXQgdmVjdG9ycyB0byB3b3JrIHdpdGguCisgIEJpdFZlY3RvciBlbXB0eVZlY3RvcjsKKyAgQml0VmVjdG9yIHRlc3RWZWN0b3IsIHRlc3RWZWN0b3IyOworCisgIEVIX0FTU0VSVCggdGVzdFZlY3Rvci5zaXplKCkgPT0gMCApOworCisgIHNpemVfdCBCaXRWZWN0b3JTaXplID0gcmFuZG9tX251bWJlciggcmFuZG9tX2Jhc2UgKTsKKyAgLy8gSGFsZiB0aGUgdGltZSwgY2hvb3NlIGEgc2l6ZSB0aGF0IHdpbGwgZ3VhcmFudGVlIGltbWVkaWF0ZSByZWFsbG9jYXRpb24KKyAgaWYgKCByYW5kb21fbnVtYmVyKDIpICkKKyAgICBCaXRWZWN0b3JTaXplID0gQml0VmVjdG9yU2l6ZSAvIF9fV09SRF9CSVQgKiBfX1dPUkRfQklUOworCisgIEVIX0FTU0VSVCggdGVzdFZlY3Rvci5zaXplKCkgPT0gMCApOworICB0ZXN0VmVjdG9yLnJlc2VydmUoQml0VmVjdG9yU2l6ZSk7CisgIEVIX0FTU0VSVCggdGVzdFZlY3Rvci5zaXplKCkgPT0gMCApOworICB3aGlsZSAodGVzdFZlY3Rvci5zaXplKCkgPCBCaXRWZWN0b3JTaXplKSB7CisgICAgdGVzdFZlY3Rvci5wdXNoX2JhY2socmFuZG9tX251bWJlcigyKSAhPSAwKTsKKyAgICB0ZXN0VmVjdG9yMi5wdXNoX2JhY2socmFuZG9tX251bWJlcigyKSAhPSAwKTsKKyAgfQorCisgIC8vIFRlc3QgaW5zZXJ0aW9ucworICBTdHJvbmdDaGVjayh0ZXN0VmVjdG9yLCB0ZXN0X2luc2VydF9vbmU8Qml0VmVjdG9yPih0ZXN0VmVjdG9yKSApOworICBTdHJvbmdDaGVjayh0ZXN0VmVjdG9yLCB0ZXN0X2luc2VydF9vbmU8Qml0VmVjdG9yPih0ZXN0VmVjdG9yLDApICk7CisgIFN0cm9uZ0NoZWNrKHRlc3RWZWN0b3IsIHRlc3RfaW5zZXJ0X29uZTxCaXRWZWN0b3I+KHRlc3RWZWN0b3IsIChpbnQpdGVzdFZlY3Rvci5zaXplKCkpICk7CisKKyAgU3Ryb25nQ2hlY2sodGVzdFZlY3RvciwgdGVzdF9pbnNlcnRfbjxCaXRWZWN0b3I+KHRlc3RWZWN0b3IsIHJhbmRvbV9udW1iZXIocmFuZG9tX2Jhc2UpICkgKTsKKyAgU3Ryb25nQ2hlY2sodGVzdFZlY3RvciwgdGVzdF9pbnNlcnRfbjxCaXRWZWN0b3I+KHRlc3RWZWN0b3IsIHJhbmRvbV9udW1iZXIocmFuZG9tX2Jhc2UpLDAgKSApOworICBTdHJvbmdDaGVjayh0ZXN0VmVjdG9yLCB0ZXN0X2luc2VydF9uPEJpdFZlY3Rvcj4odGVzdFZlY3RvciwgcmFuZG9tX251bWJlcihyYW5kb21fYmFzZSksIChpbnQpdGVzdFZlY3Rvci5zaXplKCkpICk7CisjaWYgMAorICAvLyBBbGxvY2F0ZSBzb21lIHJhbmRvbSBib29scyB0byBpbnNlcnQKKyAgc2l6ZV90IGluc0NudCA9IDEgKyByYW5kb21fbnVtYmVyKHJhbmRvbV9iYXNlKTsKKyAgYm9vbCAqaW5zRmlyc3QgPSBuZXcgQml0VmVjdG9yOjp2YWx1ZV90eXBlW2luc0NudF07CisgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwgaW5zQ250OyBuKyspCisgICAgaW5zRmlyc3Rbbl0gPSByYW5kb21fbnVtYmVyKDIpOworICBTdHJvbmdDaGVjayh0ZXN0VmVjdG9yLCBpbnNlcnRfcmFuZ2VfdGVzdGVyKHRlc3RWZWN0b3IsIGluc0ZpcnN0LCBpbnNGaXJzdCtpbnNDbnQpKTsKKyAgU3Ryb25nQ2hlY2sodGVzdFZlY3RvciwgaW5zZXJ0X3JhbmdlX2F0X2JlZ2luX3Rlc3Rlcih0ZXN0VmVjdG9yLCBpbnNGaXJzdCwgaW5zRmlyc3QraW5zQ250KSk7CisgIFN0cm9uZ0NoZWNrKHRlc3RWZWN0b3IsIGluc2VydF9yYW5nZV9hdF9lbmRfdGVzdGVyKHRlc3RWZWN0b3IsIGluc0ZpcnN0LCBpbnNGaXJzdCtpbnNDbnQpKTsKKyAgQ29uc3RDaGVjaygwLCB0ZXN0X2NvbnN0cnVjdF9wb2ludGVyX3JhbmdlPEJpdFZlY3Rvcj4oIGluc0ZpcnN0LCBpbnNGaXJzdCArIGluc0NudCkpOworICBkZWxldGVbXSBpbnNGaXJzdDsKKyNlbmRpZgorICBTdHJvbmdDaGVjayh0ZXN0VmVjdG9yLCBpbnNlcnRfcmFuZ2VfdGVzdGVyKHRlc3RWZWN0b3IsIHRlc3RWZWN0b3IyLmJlZ2luKCksIHRlc3RWZWN0b3IyLmVuZCgpKSk7CisgIFN0cm9uZ0NoZWNrKHRlc3RWZWN0b3IsIGluc2VydF9yYW5nZV9hdF9iZWdpbl90ZXN0ZXIodGVzdFZlY3RvciwgdGVzdFZlY3RvcjIuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0VmVjdG9yMi5lbmQoKSkpOworICBTdHJvbmdDaGVjayh0ZXN0VmVjdG9yLCBpbnNlcnRfcmFuZ2VfYXRfZW5kX3Rlc3Rlcih0ZXN0VmVjdG9yLCB0ZXN0VmVjdG9yMi5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0VmVjdG9yMi5lbmQoKSkpOworICBTdHJvbmdDaGVjayh0ZXN0VmVjdG9yLCB0ZXN0X0JpdFZlY3Rvcl9yZXNlcnZlKCB0ZXN0VmVjdG9yLmNhcGFjaXR5KCkgKyByYW5kb21fbnVtYmVyKDUwKSkpOworICBTdHJvbmdDaGVjayh0ZXN0VmVjdG9yLCB0ZXN0X3B1c2hfYmFjazxCaXRWZWN0b3I+KHRlc3RWZWN0b3IpKTsKKyAgU3Ryb25nQ2hlY2soZW1wdHlWZWN0b3IsIHRlc3RfcHVzaF9iYWNrPEJpdFZlY3Rvcj4oZW1wdHlWZWN0b3IpKTsKKworICBDb25zdENoZWNrKDAsIHRlc3RfZGVmYXVsdF9jb25zdHJ1Y3Q8Qml0VmVjdG9yPigpKTsKKyAgQ29uc3RDaGVjaygwLCB0ZXN0X2NvbnN0cnVjdF9uPEJpdFZlY3Rvcj4ocmFuZG9tX251bWJlcihyYW5kb21fYmFzZSkpKTsKKyAgQ29uc3RDaGVjaygwLCB0ZXN0X2NvbnN0cnVjdF9uX2luc3RhbmNlPEJpdFZlY3Rvcj4ocmFuZG9tX251bWJlcihyYW5kb21fYmFzZSkpKTsKKyAgQ29uc3RDaGVjaygwLCB0ZXN0X2NvbnN0cnVjdF9pdGVyX3JhbmdlPEJpdFZlY3Rvcj4odGVzdFZlY3RvcjIpKTsKKyAgQ29uc3RDaGVjayh0ZXN0VmVjdG9yLCB0ZXN0X2NvcHlfY29uc3RydWN0PEJpdFZlY3Rvcj4oKSApOworICBXZWFrQ2hlY2sodGVzdFZlY3RvciwgdGVzdF9hc3NpZ25fb3A8Qml0VmVjdG9yPih0ZXN0VmVjdG9yMikgKTsKK30KKworIyBlbmRpZiAvKiBCSVRfVkVDVE9SX0lNUExFTUVOVEVEICovCmRpZmYgLS1naXQgYS90ZXN0L2VoL3Rlc3RfYml0c2V0LmNwcCBiL3Rlc3QvZWgvdGVzdF9iaXRzZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMjZmOTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2VoL3Rlc3RfYml0c2V0LmNwcApAQCAtMCwwICsxLDM5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgdGVzdF9iaXRzZXQuY3BwCisKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogTWFyayBvZiB0aGUgVW5pY29ybiwgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgTWFyayBvZiB0aGUgVW5pY29ybiBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJQcmVmaXguaCIKKyNpZiBkZWZpbmVkKCBFSF9CSVRTRVRfSU1QTEVNRU5URUQgKQorI2luY2x1ZGUgIlRlc3RzLmgiCisjaW5jbHVkZSA8Yml0c2V0PgorI2luY2x1ZGUgIlRlc3RDbGFzcy5oIgorI2luY2x1ZGUgIkxlYWtDaGVjay5oIgorI2luY2x1ZGUgInRlc3RfY29uc3RydWN0LmgiCisjaW5jbHVkZSAidGVzdF9hc3NpZ25fb3AuaCIKKyNpbmNsdWRlICJ0ZXN0X3B1c2hfYmFjay5oIgorI2luY2x1ZGUgInRlc3RfaW5zZXJ0LmgiCisjaW5jbHVkZSAidGVzdF9wdXNoX2Zyb250LmgiCisKK3R5cGVkZWYgYml0c2V0PDEwMD4gVGVzdEJpdHNldDsKKworaW5saW5lIHNlcXVlbmNlX2NvbnRhaW5lcl90YWcKK2NvbnRhaW5lcl9jYXRlZ29yeShjb25zdCBUZXN0Qml0c2V0JikKK3sKKyAgcmV0dXJuIHNlcXVlbmNlX2NvbnRhaW5lcl90YWcoKTsKK30KKwordm9pZCB0ZXN0X2JpdHNldCgpCit7Cit9CisjZW5kaWYgLy8gRUhfQklUU0VUX0lNUExFTUVOVEVECmRpZmYgLS1naXQgYS90ZXN0L2VoL3Rlc3RfY29uc3RydWN0LmggYi90ZXN0L2VoL3Rlc3RfY29uc3RydWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkwMDAzYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZWgvdGVzdF9jb25zdHJ1Y3QuaApAQCAtMCwwICsxLDEyNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIHRlc3RfY29uc3RydWN0LmgKKworICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBNYXJrIG9mIHRoZSBVbmljb3JuLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBNYXJrIG9mIHRoZSBVbmljb3JuIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiB0ZXN0X2NvbnN0cnVjdF9IXworI2RlZmluZSB0ZXN0X2NvbnN0cnVjdF9IXworCisjaW5jbHVkZSAiUHJlZml4LmgiCisjaWYgZGVmaW5lZCAoRUhfTkVXX0hFQURFUlMpCisjICBpbmNsdWRlIDxhbGdvcml0aG0+CisjICBpbmNsdWRlIDxjYXNzZXJ0PgorIyAgaW5jbHVkZSA8Y3N0ZGxpYj4KKyNlbHNlCisjICBpbmNsdWRlIDxhbGdvLmg+CisjICBpbmNsdWRlIDxhc3NlcnQuaD4KKyMgIGluY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisKK1VTSU5HX0NTVERfTkFNRShzaXplX3QpCisKK3RlbXBsYXRlIDxjbGFzcyBUPgorc3RydWN0IHRlc3RfY29weV9jb25zdHJ1Y3QgeworICB0ZXN0X2NvcHlfY29uc3RydWN0KCkgeworICAgIGdUZXN0Q29udHJvbGxlci5TZXRDdXJyZW50VGVzdE5hbWUoImNvcHkgY29uc3RydWN0b3IiKTsKKyAgfQorCisgIHZvaWQgb3BlcmF0b3IoKSggY29uc3QgVCYgdCApIGNvbnN0IHsKKyAgICBUIGFDb3B5KCB0ICk7CisgICAgLy8gUHJldmVudCBzaW11bGF0ZWQgZmFpbHVyZXMgZHVyaW5nIHZlcmlmaWNhdGlvbgorICAgIGdUZXN0Q29udHJvbGxlci5DYW5jZWxGYWlsdXJlQ291bnRkb3duKCk7CisgICAgLy9FSF9BU1NFUlQoIGFDb3B5ID09IHQgKTsKKyAgICBDaGVja0ludmFyaWFudCh0KTsKKyAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIFQ+CitzdHJ1Y3QgdGVzdF9kZWZhdWx0X2NvbnN0cnVjdCB7CisgIHRlc3RfZGVmYXVsdF9jb25zdHJ1Y3QoKSB7CisgICAgZ1Rlc3RDb250cm9sbGVyLlNldEN1cnJlbnRUZXN0TmFtZSgiZGVmYXVsdCBjb25zdHJ1Y3RvciIpOworICB9CisKKyAgdm9pZCBvcGVyYXRvcigpKCBpbnQgKSBjb25zdCB7CisgICAgVCB0OworICAgIENoZWNrSW52YXJpYW50KHQpOworICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3N0cnVjdCB0ZXN0X2NvbnN0cnVjdF9uIHsKKyAgdGVzdF9jb25zdHJ1Y3Rfbiggc2l6ZV90IF9uICkgOiBuKF9uKzEpIHsKKyAgICBnVGVzdENvbnRyb2xsZXIuU2V0Q3VycmVudFRlc3ROYW1lKCJuLXNpemUgY29uc3RydWN0b3IiKTsKKyAgfQorCisgIHZvaWQgb3BlcmF0b3IoKSggaW50ICkgY29uc3QgeworICAgIFQgdChuKTsKKyAgICBDaGVja0ludmFyaWFudCh0KTsKKyAgfQorCisgIHNpemVfdCBuOworfTsKKwordGVtcGxhdGUgPGNsYXNzIFQ+CitzdHJ1Y3QgdGVzdF9jb25zdHJ1Y3Rfbl9pbnN0YW5jZSB7CisgIHRlc3RfY29uc3RydWN0X25faW5zdGFuY2UoIHNpemVfdCBfbiApIDogbihfbisxKSB7CisgICAgZ1Rlc3RDb250cm9sbGVyLlNldEN1cnJlbnRUZXN0TmFtZSgibi1zaXplIHdpdGggaW5zdGFuY2UgY29uc3RydWN0b3IiKTsKKyAgfQorCisgIHZvaWQgb3BlcmF0b3IoKSggaW50ICkgY29uc3QgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgVDo6dmFsdWVfdHlwZSBWYWx1ZV90eXBlOworICAgIFZhbHVlX3R5cGUgVmFsID0gMDsKKyAgICBUIHQoIG4sIFZhbCApOworICAgIENoZWNrSW52YXJpYW50KHQpOworICB9CisKKyAgc2l6ZV90IG47Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3N0cnVjdCB0ZXN0X2NvbnN0cnVjdF9wb2ludGVyX3JhbmdlIHsKKyAgdGVzdF9jb25zdHJ1Y3RfcG9pbnRlcl9yYW5nZSggY29uc3QgdHlwZW5hbWUgVDo6dmFsdWVfdHlwZSAqZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVuYW1lIFQ6OnZhbHVlX3R5cGUqIGxhc3QgKQorICAgIDogZkl0ZW1zKCBmaXJzdCApLCBmRW5kKCBsYXN0ICkgeworICAgIGdUZXN0Q29udHJvbGxlci5TZXRDdXJyZW50VGVzdE5hbWUoInBvaW50ZXIgcmFuZ2UgY29uc3RydWN0b3IiKTsKKyAgfQorCisgIHZvaWQgb3BlcmF0b3IoKSggaW50ICkgY29uc3QgeworICAgIFQgdCggZkl0ZW1zLCBmRW5kICk7CisgICAgLy8gUHJldmVudCBzaW11bGF0ZWQgZmFpbHVyZXMgZHVyaW5nIHZlcmlmaWNhdGlvbgorICAgIGdUZXN0Q29udHJvbGxlci5DYW5jZWxGYWlsdXJlQ291bnRkb3duKCk7CisgICAgQ2hlY2tJbnZhcmlhbnQodCk7CisgIH0KKworICBjb25zdCB0eXBlbmFtZSBUOjp2YWx1ZV90eXBlKiBmSXRlbXMsICpmRW5kOworfTsKKwordGVtcGxhdGUgPGNsYXNzIFQ+CitzdHJ1Y3QgdGVzdF9jb25zdHJ1Y3RfaXRlcl9yYW5nZSB7CisKKyAgdGVzdF9jb25zdHJ1Y3RfaXRlcl9yYW5nZSggY29uc3QgVCYgc3JjICkgOiBmSXRlbXMoIHNyYyApIHsKKyAgICBnVGVzdENvbnRyb2xsZXIuU2V0Q3VycmVudFRlc3ROYW1lKCJpdGVyYXRvciByYW5nZSBjb25zdHJ1Y3RvciIpOworICB9CisKKyAgdm9pZCBvcGVyYXRvcigpKCBpbnQgKSBjb25zdCB7CisgICAgVCB0KCBmSXRlbXMuYmVnaW4oKSwgZkl0ZW1zLmVuZCgpICk7CisgICAgLy8gUHJldmVudCBzaW11bGF0ZWQgZmFpbHVyZXMgZHVyaW5nIHZlcmlmaWNhdGlvbgorICAgIGdUZXN0Q29udHJvbGxlci5DYW5jZWxGYWlsdXJlQ291bnRkb3duKCk7CisgICAgRUhfQVNTRVJUKCB0ID09IGZJdGVtcyApOworICAgIENoZWNrSW52YXJpYW50KHQpOworICB9CisKKyAgY29uc3QgVCYgZkl0ZW1zOworfTsKKworI2VuZGlmIC8vIHRlc3RfY29uc3RydWN0X0hfCmRpZmYgLS1naXQgYS90ZXN0L2VoL3Rlc3RfZGVxdWUuY3BwIGIvdGVzdC9laC90ZXN0X2RlcXVlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTM3NzU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9laC90ZXN0X2RlcXVlLmNwcApAQCAtMCwwICsxLDk1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgdGVzdF9kZXF1ZS5jcHAKKworICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBNYXJrIG9mIHRoZSBVbmljb3JuLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBNYXJrIG9mIHRoZSBVbmljb3JuIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiVGVzdHMuaCIKKyMgaWYgZGVmaW5lZCAoRUhfTkVXX0hFQURFUlMpCisjICBpZmRlZiBfX1NVTlBST19DQworIyAgIGluY2x1ZGUgPHN0ZGlvLmg+CisjICBlbHNlCisjICAgaW5jbHVkZSA8Y3N0ZGlvPgorIyAgZW5kaWYKKyMgIGluY2x1ZGUgPGRlcXVlPgorIyBlbHNlCisjICBpbmNsdWRlIDxzdGRpby5oPgorIyAgaW5jbHVkZSA8ZGVxdWUuaD4KKyMgZW5kaWYKKyNpbmNsdWRlICJUZXN0Q2xhc3MuaCIKKyNpbmNsdWRlICJMZWFrQ2hlY2suaCIKKyNpbmNsdWRlICJ0ZXN0X2NvbnN0cnVjdC5oIgorI2luY2x1ZGUgInRlc3RfYXNzaWduX29wLmgiCisjaW5jbHVkZSAidGVzdF9wdXNoX2JhY2suaCIKKyNpbmNsdWRlICJ0ZXN0X2luc2VydC5oIgorI2luY2x1ZGUgInRlc3RfcHVzaF9mcm9udC5oIgorCit0eXBlZGVmIFRlc3RDbGFzcyBEUVRlc3RDbGFzczsKKwordHlwZWRlZiBFSF9TVEQ6OmRlcXVlPERRVGVzdENsYXNzLCBlaF9hbGxvY2F0b3IoRFFUZXN0Q2xhc3MpID4gVGVzdERlcXVlOworCitpbmxpbmUgc2VxdWVuY2VfY29udGFpbmVyX3RhZworY29udGFpbmVyX2NhdGVnb3J5KGNvbnN0IFRlc3REZXF1ZSYpCit7CisgIHJldHVybiBzZXF1ZW5jZV9jb250YWluZXJfdGFnKCk7Cit9CisKK3ZvaWQgdGVzdF9kZXF1ZSgpCit7CisgICAgc2l6ZV90IGRlcXVlU2l6ZSA9IHJhbmRvbV9udW1iZXIocmFuZG9tX2Jhc2UpOworICAgIFRlc3REZXF1ZSBlbXB0eURlcXVlOworICAgIFRlc3REZXF1ZSB0ZXN0RGVxdWUsIHRlc3REZXF1ZTI7CisgICAgd2hpbGUgKCB0ZXN0RGVxdWUuc2l6ZSgpIDwgZGVxdWVTaXplICkKKyAgICB7CisgICAgICAgIERRVGVzdENsYXNzIHg7CisgICAgICAgIHRlc3REZXF1ZS5wdXNoX2JhY2soIHggKTsKKyAgICAgICAgdGVzdERlcXVlMi5wdXNoX2JhY2soIERRVGVzdENsYXNzKCkgKTsKKyAgICB9CisKKyAgICBDb25zdENoZWNrKCB0ZXN0RGVxdWUsIHRlc3RfY29weV9jb25zdHJ1Y3Q8VGVzdERlcXVlPigpICk7CisgICAgV2Vha0NoZWNrKCB0ZXN0RGVxdWUsIHRlc3RfaW5zZXJ0X29uZTxUZXN0RGVxdWU+KHRlc3REZXF1ZSkgKTsKKyAgICBTdHJvbmdDaGVjayggdGVzdERlcXVlLCB0ZXN0X2luc2VydF9vbmU8VGVzdERlcXVlPih0ZXN0RGVxdWUsIDApICk7CisgICAgU3Ryb25nQ2hlY2soIHRlc3REZXF1ZSwgdGVzdF9pbnNlcnRfb25lPFRlc3REZXF1ZT4odGVzdERlcXVlLCAoaW50KXRlc3REZXF1ZS5zaXplKCkpICk7CisKKyAgICBXZWFrQ2hlY2soIHRlc3REZXF1ZSwgdGVzdF9pbnNlcnRfbjxUZXN0RGVxdWU+KHRlc3REZXF1ZSwgcmFuZG9tX251bWJlcihyYW5kb21fYmFzZSkgKSApOworICAgIFN0cm9uZ0NoZWNrKCB0ZXN0RGVxdWUsIHRlc3RfaW5zZXJ0X248VGVzdERlcXVlPih0ZXN0RGVxdWUsIHJhbmRvbV9udW1iZXIocmFuZG9tX2Jhc2UpLCAwICkgKTsKKyAgICBTdHJvbmdDaGVjayggdGVzdERlcXVlLCB0ZXN0X2luc2VydF9uPFRlc3REZXF1ZT4odGVzdERlcXVlLCByYW5kb21fbnVtYmVyKHJhbmRvbV9iYXNlKSwgKGludCl0ZXN0RGVxdWUuc2l6ZSgpICkgKTsKKworICAgIHNpemVfdCBpbnNDbnQgPSByYW5kb21fbnVtYmVyKHJhbmRvbV9iYXNlKTsKKyAgICBEUVRlc3RDbGFzcyAqaW5zRmlyc3QgPSBuZXcgVGVzdERlcXVlOjp2YWx1ZV90eXBlW2luc0NudCArIDFdOworCisgICAgV2Vha0NoZWNrKCB0ZXN0RGVxdWUsIGluc2VydF9yYW5nZV90ZXN0ZXIodGVzdERlcXVlLCBpbnNGaXJzdCwgaW5zRmlyc3QgKyBpbnNDbnQpICk7CisgICAgU3Ryb25nQ2hlY2soIHRlc3REZXF1ZSwgaW5zZXJ0X3JhbmdlX2F0X2JlZ2luX3Rlc3Rlcih0ZXN0RGVxdWUsIGluc0ZpcnN0LCBpbnNGaXJzdCArIGluc0NudCkgKTsKKyAgICBTdHJvbmdDaGVjayggdGVzdERlcXVlLCBpbnNlcnRfcmFuZ2VfYXRfZW5kX3Rlc3Rlcih0ZXN0RGVxdWUsIGluc0ZpcnN0LCBpbnNGaXJzdCArIGluc0NudCkgKTsKKworICAgIENvbnN0Q2hlY2soIDAsIHRlc3RfY29uc3RydWN0X3BvaW50ZXJfcmFuZ2U8VGVzdERlcXVlPihpbnNGaXJzdCwgaW5zRmlyc3QgKyBpbnNDbnQpICk7CisgICAgZGVsZXRlW10gaW5zRmlyc3Q7CisKKyAgICBXZWFrQ2hlY2soIHRlc3REZXF1ZSwgaW5zZXJ0X3JhbmdlX3Rlc3Rlcih0ZXN0RGVxdWUsIHRlc3REZXF1ZTIuYmVnaW4oKSwgdGVzdERlcXVlMi5lbmQoKSApICk7CisKKyAgICBTdHJvbmdDaGVjayggdGVzdERlcXVlLCB0ZXN0X3B1c2hfYmFjazxUZXN0RGVxdWU+KHRlc3REZXF1ZSkgKTsKKyAgICBTdHJvbmdDaGVjayggZW1wdHlEZXF1ZSwgdGVzdF9wdXNoX2JhY2s8VGVzdERlcXVlPihlbXB0eURlcXVlKSApOworICAgIFN0cm9uZ0NoZWNrKCB0ZXN0RGVxdWUsIHRlc3RfcHVzaF9mcm9udDxUZXN0RGVxdWU+KHRlc3REZXF1ZSkgKTsKKyAgICBTdHJvbmdDaGVjayggZW1wdHlEZXF1ZSwgdGVzdF9wdXNoX2Zyb250PFRlc3REZXF1ZT4oZW1wdHlEZXF1ZSkgKTsKKworCisgICAgQ29uc3RDaGVjayggMCwgdGVzdF9kZWZhdWx0X2NvbnN0cnVjdDxUZXN0RGVxdWU+KCkgKTsKKyAgICBDb25zdENoZWNrKCAwLCB0ZXN0X2NvbnN0cnVjdF9uPFRlc3REZXF1ZT4oIHJhbmRvbV9udW1iZXIocmFuZG9tX2Jhc2UpICkgKTsKKyAgICBDb25zdENoZWNrKCAwLCB0ZXN0X2NvbnN0cnVjdF9uX2luc3RhbmNlPFRlc3REZXF1ZT4oIHJhbmRvbV9udW1iZXIocmFuZG9tX2Jhc2UpICkgKTsKKyAgICBDb25zdENoZWNrKCAwLCB0ZXN0X2NvbnN0cnVjdF9pdGVyX3JhbmdlPFRlc3REZXF1ZT4oIHRlc3REZXF1ZTIgKSApOworCisgICAgdGVzdERlcXVlMi5yZXNpemUoIHRlc3REZXF1ZS5zaXplKCkgKiAzIC8gMiApOworICAgIFdlYWtDaGVjayggdGVzdERlcXVlLCB0ZXN0X2Fzc2lnbl9vcDxUZXN0RGVxdWU+KCB0ZXN0RGVxdWUyICkgKTsKKyAgICB0ZXN0RGVxdWUyLnJlc2l6ZSggdGVzdERlcXVlLnNpemUoKSAqIDIgLyAzICk7CisgICAgV2Vha0NoZWNrKCB0ZXN0RGVxdWUsIHRlc3RfYXNzaWduX29wPFRlc3REZXF1ZT4oIHRlc3REZXF1ZTIgKSApOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9laC90ZXN0X2hhc2hfbWFwLmNwcCBiL3Rlc3QvZWgvdGVzdF9oYXNoX21hcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIwYmJiOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZWgvdGVzdF9oYXNoX21hcC5jcHAKQEAgLTAsMCArMSwxMzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICB0ZXN0X2hhc2hfbWFwLmNwcAorCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1hcmsgb2YgdGhlIFVuaWNvcm4sIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIE1hcmsgb2YgdGhlIFVuaWNvcm4gbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiVGVzdHMuaCIKKyNpZiBkZWZpbmVkKCBFSF9IQVNIRURfQ09OVEFJTkVSU19JTVBMRU1FTlRFRCApCisjaW5jbHVkZSAiVGVzdENsYXNzLmgiCisjaW5jbHVkZSAiTGVha0NoZWNrLmgiCisKKyMgIGluY2x1ZGUgPGhhc2hfbWFwPgorCisjaW5jbHVkZSAidGVzdF9jb25zdHJ1Y3QuaCIKKyNpbmNsdWRlICJ0ZXN0X2Fzc2lnbl9vcC5oIgorI2luY2x1ZGUgInRlc3RfcHVzaF9iYWNrLmgiCisjaW5jbHVkZSAidGVzdF9pbnNlcnQuaCIKKyNpbmNsdWRlICJ0ZXN0X3B1c2hfZnJvbnQuaCIKKyNpbmNsdWRlICJUaHJvd0NvbXBhcmUuaCIKKyNpbmNsdWRlICJ0ZXN0X2hhc2hfcmVzaXplLmgiCisvKgordGVtcGxhdGUgc3RydWN0IHBhaXI8Y29uc3QgVGVzdENsYXNzLCBUZXN0Q2xhc3M+OwordGVtcGxhdGUgc3RydWN0IF9faGFzaHRhYmxlX25vZGU8cGFpcjxjb25zdCBUZXN0Q2xhc3MsIFRlc3RDbGFzcz4gPjsKK3RlbXBsYXRlIGNsYXNzIGhhc2hfbWFwPFRlc3RDbGFzcywgVGVzdENsYXNzLCBUaHJvd0hhc2gsIFRocm93RXF1YWw+OwordGVtcGxhdGUgY2xhc3MgaGFzaF9tdWx0aW1hcDxUZXN0Q2xhc3MsIFRlc3RDbGFzcywgVGhyb3dIYXNoLCBUaHJvd0VxdWFsPjsKKyovCisKK3R5cGVkZWYgRUhfU1REOjpfX2hhc2hfbXVsdGltYXBfXzxUZXN0Q2xhc3MsIFRlc3RDbGFzcywgVGhyb3dIYXNoLCBUaHJvd0VxdWFsLAorICBlaF9hbGxvY2F0b3IoVGVzdENsYXNzKSA+IFRlc3RNdWx0aU1hcDsKKworCitpbmxpbmUgbXVsdGltYXBfdGFnCitjb250YWluZXJfY2F0ZWdvcnkoY29uc3QgVGVzdE11bHRpTWFwJikgeworICByZXR1cm4gbXVsdGltYXBfdGFnKCk7Cit9CisKK3ZvaWQgdGVzdF9oYXNoX211bHRpbWFwKCkgeworIyBpZiAhKGRlZmluZWQgKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPCAxMTAwKSkKKyAgVGVzdE11bHRpTWFwIHRlc3RNdWx0aU1hcCwgdGVzdE11bHRpTWFwMjsKKworICAgICAgICBjb25zdCBzaXplX3QgaGFzaF9tYXBTaXplID0gcmFuZG9tX251bWJlcihyYW5kb21fYmFzZSk7CisKKyAgd2hpbGUgKCB0ZXN0TXVsdGlNYXAuc2l6ZSgpIDwgaGFzaF9tYXBTaXplICkKKyAgeworICAgIFRlc3RNdWx0aU1hcDo6dmFsdWVfdHlwZSB4OworICAgIHRlc3RNdWx0aU1hcC5pbnNlcnQoIHggKTsKKyAgICB0ZXN0TXVsdGlNYXAyLmluc2VydCggVGVzdE11bHRpTWFwOjp2YWx1ZV90eXBlKCkgKTsKKyAgfQorCisjICBpZiBkZWZpbmVkKCBFSF9IQVNIX0NPTlRBSU5FUlNfU1VQUE9SVF9SRVNJWkUgKQorICBXZWFrQ2hlY2soIHRlc3RNdWx0aU1hcCwgdGVzdF9oYXNoX3Jlc2l6ZTxUZXN0TXVsdGlNYXA+KCkgKTsKKyAgLy8gVGVzdE11bHRpTWFwID09IFRlc3RNdWx0aU1hcDogbm8gc3VjaCBvcGVyYXRvciEgLSBwdHIKKyAgLy8gU3Ryb25nQ2hlY2soIHRlc3RNdWx0aU1hcCwgdGVzdF9pbnNlcnRfbm9yZXNpemU8VGVzdE11bHRpTWFwPih0ZXN0TXVsdGlNYXApICk7CisjICBlbmRpZgorICBXZWFrQ2hlY2soIHRlc3RNdWx0aU1hcCwgdGVzdF9pbnNlcnRfdmFsdWU8VGVzdE11bHRpTWFwPih0ZXN0TXVsdGlNYXApICk7CisKKyAgc2l6ZV90IGluc0NudCA9IHJhbmRvbV9udW1iZXIocmFuZG9tX2Jhc2UpOworICBUZXN0TXVsdGlNYXA6OnZhbHVlX3R5cGUgKmluc0ZpcnN0ID0gbmV3IFRlc3RNdWx0aU1hcDo6dmFsdWVfdHlwZVsxK2luc0NudF07CisgIFdlYWtDaGVjayggdGVzdE11bHRpTWFwLCBpbnNlcnRfcmFuZ2VfdGVzdGVyKHRlc3RNdWx0aU1hcCwgaW5zRmlyc3QsIGluc0ZpcnN0K2luc0NudCkgKTsKKyAgQ29uc3RDaGVjayggMCwgdGVzdF9jb25zdHJ1Y3RfcG9pbnRlcl9yYW5nZTxUZXN0TXVsdGlNYXA+KGluc0ZpcnN0LCBpbnNGaXJzdCtpbnNDbnQpICk7CisgIGRlbGV0ZVtdIGluc0ZpcnN0OworCisgIFdlYWtDaGVjayggdGVzdE11bHRpTWFwLCBpbnNlcnRfcmFuZ2VfdGVzdGVyKHRlc3RNdWx0aU1hcCwgdGVzdE11bHRpTWFwMi5iZWdpbigpLCB0ZXN0TXVsdGlNYXAyLmVuZCgpICkgKTsKKworICBDb25zdENoZWNrKCAwLCB0ZXN0X2RlZmF1bHRfY29uc3RydWN0PFRlc3RNdWx0aU1hcD4oKSApOworIyAgaWYgRUhfSEFTSF9DT05UQUlORVJTX1NVUFBPUlRfSVRFUkFUT1JfQ09OU1RSVUNUSU9OCisgIENvbnN0Q2hlY2soIDAsIHRlc3RfY29uc3RydWN0X2l0ZXJfcmFuZ2VfbjxUZXN0TXVsdGlNYXA+KCB0ZXN0TXVsdGlNYXAyICkgKTsKKyMgIGVuZGlmCisgIENvbnN0Q2hlY2soIHRlc3RNdWx0aU1hcCwgdGVzdF9jb3B5X2NvbnN0cnVjdDxUZXN0TXVsdGlNYXA+KCkgKTsKKworICBXZWFrQ2hlY2soIHRlc3RNdWx0aU1hcCwgdGVzdF9hc3NpZ25fb3A8VGVzdE11bHRpTWFwPiggdGVzdE11bHRpTWFwMiApICk7CisjIGVuZGlmCit9CisKK3R5cGVkZWYgRUhfU1REOjpfX2hhc2hfbWFwX188VGVzdENsYXNzLCBUZXN0Q2xhc3MsIFRocm93SGFzaCwKKyAgVGhyb3dFcXVhbCwgZWhfYWxsb2NhdG9yKFRlc3RDbGFzcykgPiBUZXN0TWFwOworCitpbmxpbmUgbWFwX3RhZworY29udGFpbmVyX2NhdGVnb3J5KGNvbnN0IFRlc3RNYXAmKQoreworICByZXR1cm4gbWFwX3RhZygpOworfQorCit2b2lkIHRlc3RfaGFzaF9tYXAoKQoreworIyBpZiAhKGRlZmluZWQgKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPCAxMTAwKSkKKyAgVGVzdE1hcCB0ZXN0TWFwLCB0ZXN0TWFwMjsKKworICBjb25zdCBzaXplX3QgaGFzaF9tYXBTaXplID0gcmFuZG9tX251bWJlcihyYW5kb21fYmFzZSk7CisKKyAgd2hpbGUgKCB0ZXN0TWFwLnNpemUoKSA8IGhhc2hfbWFwU2l6ZSApIHsKKyAgICBUZXN0TWFwOjp2YWx1ZV90eXBlIHg7CisgICAgdGVzdE1hcC5pbnNlcnQoIHggKTsKKyAgICB0ZXN0TWFwMi5pbnNlcnQoIFRlc3RNYXA6OnZhbHVlX3R5cGUoKSApOworICB9CisKKyNpZiBkZWZpbmVkKCBFSF9IQVNIX0NPTlRBSU5FUlNfU1VQUE9SVF9SRVNJWkUgKQorICBXZWFrQ2hlY2soIHRlc3RNYXAsIHRlc3RfaGFzaF9yZXNpemU8VGVzdE1hcD4oKSApOworICAvLyBUZXN0TXVsdGlNYXAgPT0gVGVzdE11bHRpTWFwOiBubyBzdWNoIG9wZXJhdG9yISAtIHB0cgorICAvLyBTdHJvbmdDaGVjayggdGVzdE1hcCwgdGVzdF9pbnNlcnRfbm9yZXNpemU8VGVzdE1hcD4odGVzdE1hcCkgKTsKKyNlbmRpZgorICBXZWFrQ2hlY2soIHRlc3RNYXAsIHRlc3RfaW5zZXJ0X3ZhbHVlPFRlc3RNYXA+KHRlc3RNYXApICk7CisKKyAgc2l6ZV90IGluc0NudCA9IHJhbmRvbV9udW1iZXIocmFuZG9tX2Jhc2UpOworICBUZXN0TWFwOjp2YWx1ZV90eXBlICppbnNGaXJzdCA9IG5ldyBUZXN0TWFwOjp2YWx1ZV90eXBlWzEraW5zQ250XTsKKyAgV2Vha0NoZWNrKCB0ZXN0TWFwLCBpbnNlcnRfcmFuZ2VfdGVzdGVyKHRlc3RNYXAsIGluc0ZpcnN0LCBpbnNGaXJzdCtpbnNDbnQpICk7CisgIENvbnN0Q2hlY2soIDAsIHRlc3RfY29uc3RydWN0X3BvaW50ZXJfcmFuZ2U8VGVzdE1hcD4oaW5zRmlyc3QsIGluc0ZpcnN0K2luc0NudCkgKTsKKyAgZGVsZXRlW10gaW5zRmlyc3Q7CisKKyAgV2Vha0NoZWNrKCB0ZXN0TWFwLCBpbnNlcnRfcmFuZ2VfdGVzdGVyKHRlc3RNYXAsIHRlc3RNYXAyLmJlZ2luKCksIHRlc3RNYXAyLmVuZCgpICkgKTsKKworICBDb25zdENoZWNrKCAwLCB0ZXN0X2RlZmF1bHRfY29uc3RydWN0PFRlc3RNYXA+KCkgKTsKKyMgIGlmIEVIX0hBU0hfQ09OVEFJTkVSU19TVVBQT1JUX0lURVJBVE9SX0NPTlNUUlVDVElPTgorICBDb25zdENoZWNrKCAwLCB0ZXN0X2NvbnN0cnVjdF9pdGVyX3JhbmdlX248VGVzdE1hcD4oIHRlc3RNYXAyICkgKTsKKyMgIGVuZGlmCisgIENvbnN0Q2hlY2soIHRlc3RNYXAsIHRlc3RfY29weV9jb25zdHJ1Y3Q8VGVzdE1hcD4oKSApOworCisgIFdlYWtDaGVjayggdGVzdE1hcCwgdGVzdF9hc3NpZ25fb3A8VGVzdE1hcD4oIHRlc3RNYXAyICkgKTsKKyMgZW5kaWYKK30KKworI2VuZGlmICAvLyBFSF9IQVNIRURfQ09OVEFJTkVSU19JTVBMRU1FTlRFRApkaWZmIC0tZ2l0IGEvdGVzdC9laC90ZXN0X2hhc2hfcmVzaXplLmggYi90ZXN0L2VoL3Rlc3RfaGFzaF9yZXNpemUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2JlYjNlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9laC90ZXN0X2hhc2hfcmVzaXplLmgKQEAgLTAsMCArMSw1NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIHRlc3RfaGFzaF9yZXNpemUuaAorCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1hcmsgb2YgdGhlIFVuaWNvcm4sIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIE1hcmsgb2YgdGhlIFVuaWNvcm4gbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIHRlc3RfaGFzaF9yZXNpemVfXworI2RlZmluZSB0ZXN0X2hhc2hfcmVzaXplX18KKworI2luY2x1ZGUgInJhbmRvbV9udW1iZXIuaCIKKyNpbmNsdWRlICJuY19hbGxvYy5oIgorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3N0cnVjdCB0ZXN0X2hhc2hfcmVzaXplCit7CisgICAgdGVzdF9oYXNoX3Jlc2l6ZSgpCisgICAgeworICAgICAgZ1Rlc3RDb250cm9sbGVyLlNldEN1cnJlbnRUZXN0TmFtZSgiaGFzaCByZXNpemUiKTsKKyAgICB9CisKKyAgdm9pZCBvcGVyYXRvcigpKCBUJiB0ICkgY29uc3QKKyAgeworICAgIHQucmVzaXplKCAxK3JhbmRvbV9udW1iZXIocmFuZG9tX2Jhc2UpICsgdC5idWNrZXRfY291bnQoKSApOworICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3N0cnVjdCB0ZXN0X2NvbnN0cnVjdF9pdGVyX3JhbmdlX24KK3sKKyAgdGVzdF9jb25zdHJ1Y3RfaXRlcl9yYW5nZV9uKCBjb25zdCBUJiBzcmMgKQorICAgIDogZkl0ZW1zKCBzcmMgKQorICB7CisgICAgICAgIGdUZXN0Q29udHJvbGxlci5TZXRDdXJyZW50VGVzdE5hbWUoIml0ZXJhdG9yIHJhbmdlIG4tc2l6ZSBjb25zdHJ1Y3RvciIpOworICAgIH0KKworICB2b2lkIG9wZXJhdG9yKCkoIGludCApIGNvbnN0CisgIHsKKyAgICBUIHQoIGZJdGVtcy5iZWdpbigpLCBmSXRlbXMuZW5kKCksIGZJdGVtcy5zaXplKCkgKTsKKyAgICAvLyBwcmV2ZW50IHNpbXVsYXRlZCBmYWlsdXJlcyBkdXJpbmcgdmVyaWZpY2F0aW9uCisgICAgZ1Rlc3RDb250cm9sbGVyLkNhbmNlbEZhaWx1cmVDb3VudGRvd24oKTsKKyAgICBDaGVja0ludmFyaWFudCh0KTsKKyAgfQorCisgIGNvbnN0IFQmIGZJdGVtczsKK307CisKKyNlbmRpZiAvL19fdGVzdF9oYXNoX3Jlc2l6ZV9fCmRpZmYgLS1naXQgYS90ZXN0L2VoL3Rlc3RfaGFzaF9zZXQuY3BwIGIvdGVzdC9laC90ZXN0X2hhc2hfc2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDQ3OWU1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9laC90ZXN0X2hhc2hfc2V0LmNwcApAQCAtMCwwICsxLDEyNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIHRlc3RfaGFzaF9zZXQuY3BwCisKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogTWFyayBvZiB0aGUgVW5pY29ybiwgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgTWFyayBvZiB0aGUgVW5pY29ybiBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJUZXN0cy5oIgorCisjaWYgZGVmaW5lZCggRUhfSEFTSEVEX0NPTlRBSU5FUlNfSU1QTEVNRU5URUQgKQorCisjICBpbmNsdWRlIDxoYXNoX3NldD4KKworI2luY2x1ZGUgIlRlc3RDbGFzcy5oIgorI2luY2x1ZGUgIkxlYWtDaGVjay5oIgorI2luY2x1ZGUgInRlc3RfY29uc3RydWN0LmgiCisjaW5jbHVkZSAidGVzdF9hc3NpZ25fb3AuaCIKKyNpbmNsdWRlICJ0ZXN0X3B1c2hfYmFjay5oIgorI2luY2x1ZGUgInRlc3RfaW5zZXJ0LmgiCisjaW5jbHVkZSAidGVzdF9wdXNoX2Zyb250LmgiCisjaW5jbHVkZSAiVGhyb3dDb21wYXJlLmgiCisjaW5jbHVkZSAidGVzdF9oYXNoX3Jlc2l6ZS5oIgorCit0eXBlZGVmIEVIX1NURDo6X19oYXNoX211bHRpc2V0X188VGVzdENsYXNzLCBUaHJvd0hhc2gsIFRocm93RXF1YWwsCisgIGVoX2FsbG9jYXRvcihUZXN0Q2xhc3MpID4gVGVzdE11bHRpU2V0OworCitpbmxpbmUgbXVsdGlzZXRfdGFnCitjb250YWluZXJfY2F0ZWdvcnkoY29uc3QgVGVzdE11bHRpU2V0JikKK3sKKyAgcmV0dXJuIG11bHRpc2V0X3RhZygpOworfQorCit2b2lkIHRlc3RfaGFzaF9tdWx0aXNldCgpCit7CisjIGlmICEoZGVmaW5lZCAoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA8IDExMDApKQorICBUZXN0TXVsdGlTZXQgdGVzdE11bHRpU2V0LCB0ZXN0TXVsdGlTZXQyOworCisgICAgICAgIGNvbnN0IHNpemVfdCBoYXNoX3NldFNpemUgPSByYW5kb21fbnVtYmVyKHJhbmRvbV9iYXNlKTsKKworICB3aGlsZSAoIHRlc3RNdWx0aVNldC5zaXplKCkgPCBoYXNoX3NldFNpemUgKQorICB7CisgICAgVGVzdE11bHRpU2V0Ojp2YWx1ZV90eXBlIHg7CisgICAgdGVzdE11bHRpU2V0Lmluc2VydCggeCApOworICAgIHRlc3RNdWx0aVNldDIuaW5zZXJ0KCBUZXN0TXVsdGlTZXQ6OnZhbHVlX3R5cGUoKSApOworICB9CisKKyMgIGlmIGRlZmluZWQoIEVIX0hBU0hfQ09OVEFJTkVSU19TVVBQT1JUX1JFU0laRSApCisgIFdlYWtDaGVjayggdGVzdE11bHRpU2V0LCB0ZXN0X2hhc2hfcmVzaXplPFRlc3RNdWx0aVNldD4oKSApOworICAvLyBUZXN0TXVsdGlTZXQgPT0gVGVzdE11bHRpU2V0OiBubyBzdWNoIG9wZXJhdG9yISAtIHB0cgorICAvLyBTdHJvbmdDaGVjayggdGVzdE11bHRpU2V0LCB0ZXN0X2luc2VydF9ub3Jlc2l6ZTxUZXN0TXVsdGlTZXQ+KHRlc3RNdWx0aVNldCkgKTsKKyMgIGVuZGlmCisgIFdlYWtDaGVjayggdGVzdE11bHRpU2V0LCB0ZXN0X2luc2VydF92YWx1ZTxUZXN0TXVsdGlTZXQ+KHRlc3RNdWx0aVNldCkgKTsKKworICBzaXplX3QgaW5zQ250ID0gcmFuZG9tX251bWJlcihyYW5kb21fYmFzZSk7CisgIFRlc3RNdWx0aVNldDo6dmFsdWVfdHlwZSAqaW5zRmlyc3QgPSBuZXcgVGVzdE11bHRpU2V0Ojp2YWx1ZV90eXBlWzEraW5zQ250XTsKKyAgV2Vha0NoZWNrKCB0ZXN0TXVsdGlTZXQsIGluc2VydF9yYW5nZV90ZXN0ZXIodGVzdE11bHRpU2V0LCBpbnNGaXJzdCwgaW5zRmlyc3QraW5zQ250KSApOworICBDb25zdENoZWNrKCAwLCB0ZXN0X2NvbnN0cnVjdF9wb2ludGVyX3JhbmdlPFRlc3RNdWx0aVNldD4oaW5zRmlyc3QsIGluc0ZpcnN0K2luc0NudCkgKTsKKyAgZGVsZXRlW10gaW5zRmlyc3Q7CisKKyAgV2Vha0NoZWNrKCB0ZXN0TXVsdGlTZXQsIGluc2VydF9yYW5nZV90ZXN0ZXIodGVzdE11bHRpU2V0LCB0ZXN0TXVsdGlTZXQyLmJlZ2luKCksIHRlc3RNdWx0aVNldDIuZW5kKCkgKSApOworCisgIENvbnN0Q2hlY2soIDAsIHRlc3RfZGVmYXVsdF9jb25zdHJ1Y3Q8VGVzdE11bHRpU2V0PigpICk7CisjICBpZiBFSF9IQVNIX0NPTlRBSU5FUlNfU1VQUE9SVF9JVEVSQVRPUl9DT05TVFJVQ1RJT04KKyAgQ29uc3RDaGVjayggMCwgdGVzdF9jb25zdHJ1Y3RfaXRlcl9yYW5nZV9uPFRlc3RNdWx0aVNldD4oIHRlc3RNdWx0aVNldDIgKSApOworIyAgZW5kaWYKKyAgQ29uc3RDaGVjayggdGVzdE11bHRpU2V0LCB0ZXN0X2NvcHlfY29uc3RydWN0PFRlc3RNdWx0aVNldD4oKSApOworCisgIFdlYWtDaGVjayggdGVzdE11bHRpU2V0LCB0ZXN0X2Fzc2lnbl9vcDxUZXN0TXVsdGlTZXQ+KCB0ZXN0TXVsdGlTZXQyICkgKTsKKyMgZW5kaWYKK30KKwordHlwZWRlZiBFSF9TVEQ6Ol9faGFzaF9zZXRfXzxUZXN0Q2xhc3MsIFRocm93SGFzaCwgVGhyb3dFcXVhbCwgZWhfYWxsb2NhdG9yKFRlc3RDbGFzcykgPiBUZXN0U2V0OworCitpbmxpbmUgc2V0X3RhZworY29udGFpbmVyX2NhdGVnb3J5KGNvbnN0IFRlc3RTZXQmKQoreworICByZXR1cm4gc2V0X3RhZygpOworfQorCit2b2lkIHRlc3RfaGFzaF9zZXQoKQoreworIyBpZiAhKGRlZmluZWQgKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPCAxMTAwKSkKKyAgVGVzdFNldCB0ZXN0U2V0LCB0ZXN0U2V0MjsKKworICAgICAgICBjb25zdCBzaXplX3QgaGFzaF9zZXRTaXplID0gcmFuZG9tX251bWJlcihyYW5kb21fYmFzZSk7CisKKyAgd2hpbGUgKCB0ZXN0U2V0LnNpemUoKSA8IGhhc2hfc2V0U2l6ZSApCisgIHsKKyAgICBUZXN0U2V0Ojp2YWx1ZV90eXBlIHg7CisgICAgdGVzdFNldC5pbnNlcnQoIHggKTsKKyAgICB0ZXN0U2V0Mi5pbnNlcnQoIFRlc3RTZXQ6OnZhbHVlX3R5cGUoKSApOworICB9CisKKyMgIGlmIGRlZmluZWQoIEVIX0hBU0hfQ09OVEFJTkVSU19TVVBQT1JUX1JFU0laRSApCisgIFdlYWtDaGVjayggdGVzdFNldCwgdGVzdF9oYXNoX3Jlc2l6ZTxUZXN0U2V0PigpICk7CisgIC8vIFRlc3RNdWx0aVNldCA9PSBUZXN0TXVsdGlTZXQ6IG5vIHN1Y2ggb3BlcmF0b3IhIC0gcHRyCisgIC8vIFN0cm9uZ0NoZWNrKCB0ZXN0U2V0LCB0ZXN0X2luc2VydF9ub3Jlc2l6ZTxUZXN0U2V0Pih0ZXN0U2V0KSApOworIyAgZW5kaWYKKyAgV2Vha0NoZWNrKCB0ZXN0U2V0LCB0ZXN0X2luc2VydF92YWx1ZTxUZXN0U2V0Pih0ZXN0U2V0KSApOworCisgIHNpemVfdCBpbnNDbnQgPSByYW5kb21fbnVtYmVyKHJhbmRvbV9iYXNlKTsKKyAgVGVzdFNldDo6dmFsdWVfdHlwZSAqaW5zRmlyc3QgPSBuZXcgVGVzdFNldDo6dmFsdWVfdHlwZVsxK2luc0NudF07CisgIFdlYWtDaGVjayggdGVzdFNldCwgaW5zZXJ0X3JhbmdlX3Rlc3Rlcih0ZXN0U2V0LCBpbnNGaXJzdCwgaW5zRmlyc3QraW5zQ250KSApOworICBDb25zdENoZWNrKCAwLCB0ZXN0X2NvbnN0cnVjdF9wb2ludGVyX3JhbmdlPFRlc3RTZXQ+KGluc0ZpcnN0LCBpbnNGaXJzdCtpbnNDbnQpICk7CisgIGRlbGV0ZVtdIGluc0ZpcnN0OworCisgIFdlYWtDaGVjayggdGVzdFNldCwgaW5zZXJ0X3JhbmdlX3Rlc3Rlcih0ZXN0U2V0LCB0ZXN0U2V0Mi5iZWdpbigpLCB0ZXN0U2V0Mi5lbmQoKSApICk7CisKKyAgQ29uc3RDaGVjayggMCwgdGVzdF9kZWZhdWx0X2NvbnN0cnVjdDxUZXN0U2V0PigpICk7CisjICBpZiBFSF9IQVNIX0NPTlRBSU5FUlNfU1VQUE9SVF9JVEVSQVRPUl9DT05TVFJVQ1RJT04KKyAgQ29uc3RDaGVjayggMCwgdGVzdF9jb25zdHJ1Y3RfaXRlcl9yYW5nZV9uPFRlc3RTZXQ+KCB0ZXN0U2V0MiApICk7CisjICBlbmRpZgorICBDb25zdENoZWNrKCB0ZXN0U2V0LCB0ZXN0X2NvcHlfY29uc3RydWN0PFRlc3RTZXQ+KCkgKTsKKworICBXZWFrQ2hlY2soIHRlc3RTZXQsIHRlc3RfYXNzaWduX29wPFRlc3RTZXQ+KCB0ZXN0U2V0MiApICk7CisjIGVuZGlmCit9CisKKyNlbmRpZiAgLy8gRUhfSEFTSEVEX0NPTlRBSU5FUlNfSU1QTEVNRU5URUQKZGlmZiAtLWdpdCBhL3Rlc3QvZWgvdGVzdF9pbnNlcnQuaCBiL3Rlc3QvZWgvdGVzdF9pbnNlcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDU2YTVmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9laC90ZXN0X2luc2VydC5oCkBAIC0wLDAgKzEsNTUyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgdGVzdF9pbnNlcnQuaAorCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1hcmsgb2YgdGhlIFVuaWNvcm4sIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIE1hcmsgb2YgdGhlIFVuaWNvcm4gbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIHRlc3RfaW5zZXJ0X0hfCisjZGVmaW5lIHRlc3RfaW5zZXJ0X0hfCisKKyMgaW5jbHVkZSAiUHJlZml4LmgiCisjIGlmIGRlZmluZWQgKEVIX05FV19IRUFERVJTKQorIyAgaW5jbHVkZSA8dXRpbGl0eT4KKyMgIGluY2x1ZGUgPHZlY3Rvcj4KKyMgIGluY2x1ZGUgPGNhc3NlcnQ+CisjICBpbmNsdWRlIDxjbGltaXRzPgorIyBlbHNlCisjICBpbmNsdWRlIDx2ZWN0b3IuaD4KKyMgIGluY2x1ZGUgPGFzc2VydC5oPgorIyAgaW5jbHVkZSA8bGltaXRzLmg+CisjIGVuZGlmCisjaW5jbHVkZSAicmFuZG9tX251bWJlci5oIgorI2luY2x1ZGUgIm5jX2FsbG9jLmgiCisjaW5jbHVkZSAiVGhyb3dDb21wYXJlLmgiCisKKy8vIEEgY2xhc3NpZmljYXRpb24gc3lzdGVtIGZvciBjb250YWluZXJzLCBmb3IgdmVyaWZpY2F0aW9uCitzdHJ1Y3QgY29udGFpbmVyX3RhZyB7fTsKK3N0cnVjdCBzZXF1ZW5jZV9jb250YWluZXJfdGFnICB7fTsKK3N0cnVjdCBhc3NvY2lhdGl2ZV9jb250YWluZXJfdGFnICB7fTsKKworc3RydWN0IHNldF90YWcgIHt9Oworc3RydWN0IG11bHRpc2V0X3RhZyAge307CitzdHJ1Y3QgbWFwX3RhZyB7fTsKK3N0cnVjdCBtdWx0aW1hcF90YWcge307CisKK3RlbXBsYXRlIDxjbGFzcyBDLCBjbGFzcyBJdGVyPgorc2l6ZV90IENvdW50TmV3SXRlbXMoIGNvbnN0IEMmLCBjb25zdCBJdGVyJiBmaXJzdE5ldywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJdGVyJiBsYXN0TmV3LCBzZXF1ZW5jZV9jb250YWluZXJfdGFnICkKK3sKKyAgICBzaXplX3QgZGlzdCA9IDA7CisjaWYgMCAvL2RlZiBfX1NVTlBST19DQworICAgIEVIX0RJU1RBTkNFKCBmaXJzdE5ldywgbGFzdE5ldywgZGlzdCApOworI2Vsc2UKKyAgICBFSF9ESVNUQU5DRSggSXRlcihmaXJzdE5ldyksIEl0ZXIobGFzdE5ldyksIGRpc3QgKTsKKyNlbmRpZgorICAgIHJldHVybiBkaXN0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgQywgY2xhc3MgSXRlcj4KK3NpemVfdCBDb3VudE5ld0l0ZW1zKCBjb25zdCBDJiBjLCBjb25zdCBJdGVyJiBmaXJzdE5ldywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJdGVyJiBsYXN0TmV3LCBtdWx0aW1hcF90YWcgKQoreworICAgIHJldHVybiBDb3VudE5ld0l0ZW1zKCBjLCBmaXJzdE5ldywgbGFzdE5ldywgc2VxdWVuY2VfY29udGFpbmVyX3RhZygpICk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBDLCBjbGFzcyBJdGVyPgorc2l6ZV90IENvdW50TmV3SXRlbXMoIGNvbnN0IEMmIGMsIGNvbnN0IEl0ZXImIGZpcnN0TmV3LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEl0ZXImIGxhc3ROZXcsIG11bHRpc2V0X3RhZyApCit7CisgICAgcmV0dXJuIENvdW50TmV3SXRlbXMoIGMsIGZpcnN0TmV3LCBsYXN0TmV3LCBzZXF1ZW5jZV9jb250YWluZXJfdGFnKCkgKTsKK30KKworCit0ZW1wbGF0ZSA8Y2xhc3MgQywgY2xhc3MgSXRlciwgY2xhc3MgS2V5T2ZWYWx1ZT4KKyNpZmRlZiBfX0JPUkxBTkRDX18KK3NpemVfdCBDb3VudFVuaXF1ZUl0ZW1zX0F1eCggY29uc3QgQyYgb3JpZ2luYWwsIGNvbnN0IEl0ZXImIGZpcnN0TmV3LAorI2Vsc2UKK3NpemVfdCBDb3VudFVuaXF1ZUl0ZW1zX0F1eCggY29uc3QgQyYgb3JpZ2luYWwsIEl0ZXIgZmlyc3ROZXcsCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXRlciBsYXN0TmV3LCBjb25zdCBLZXlPZlZhbHVlJiBrZXlPZlZhbHVlICkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBDOjprZXlfdHlwZSBrZXk7CisgIHR5cGVkZWYgdHlwZW5hbWUgQzo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcjsKKyAgdHlwZWRlZiBFSF9TVEQ6OnZlY3RvcjxrZXk+IGtleV9saXN0OworICB0eXBlZGVmIHR5cGVuYW1lIGtleV9saXN0OjppdGVyYXRvciBrZXlfaXRlcmF0b3I7CisgIGtleV9saXN0IGtleXM7CisgIHNpemVfdCBkaXN0ID0gMDsKKyNpZmRlZiBfX1NVTlBST19DQworICBFSF9ESVNUQU5DRSggZmlyc3ROZXcsIGxhc3ROZXcsIGRpc3QgKTsKKyNlbHNlCisgIEVIX0RJU1RBTkNFKCBJdGVyKGZpcnN0TmV3KSwgSXRlcihsYXN0TmV3KSwgZGlzdCApOworI2VuZGlmCisgIGtleXMucmVzZXJ2ZSggZGlzdCApOworICBmb3IgKCBJdGVyIHggPSBmaXJzdE5ldzsgeCAhPSBsYXN0TmV3OyArK3ggKQorICAgIGtleXMucHVzaF9iYWNrKCBrZXlPZlZhbHVlKCp4KSApOworCisgIEVIX1NURDo6c29ydCgga2V5cy5iZWdpbigpLCBrZXlzLmVuZCgpICk7CisgIGtleV9pdGVyYXRvciBsYXN0ID0gRUhfU1REOjp1bmlxdWUoIGtleXMuYmVnaW4oKSwga2V5cy5lbmQoKSApOworCisgICAgc2l6ZV90IGNudCA9IDA7CisgICAgZm9yICgga2V5X2l0ZXJhdG9yIHRtcCA9IGtleXMuYmVnaW4oKTsgdG1wICE9IGxhc3Q7ICsrdG1wICkKKyAgICB7CisgICAgICAgIGlmICggY29uc3RfaXRlcihvcmlnaW5hbC5maW5kKCAqdG1wICkpID09IGNvbnN0X2l0ZXIob3JpZ2luYWwuZW5kKCkpICkKKyAgICAgICAgICAgICsrY250OworICAgIH0KKyAgICByZXR1cm4gY250OworfQorCisjaWYgISBkZWZpbmVkIChfX1NHSV9TVEwpCitFSF9CRUdJTl9OQU1FU1BBQ0UKK3RlbXBsYXRlIDxjbGFzcyBUPgorc3RydWN0IGlkZW50aXR5Cit7CisgIGNvbnN0IFQmIG9wZXJhdG9yKCkoIGNvbnN0IFQmIHggKSBjb25zdCB7IHJldHVybiB4OyB9Cit9OworIyBpZiAhIGRlZmluZWQgKF9fS0NDKQordGVtcGxhdGUgPGNsYXNzIF9QYWlyPgorc3RydWN0IHNlbGVjdDFzdCA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxfUGFpciwgdHlwZW5hbWUgX1BhaXI6OmZpcnN0X3R5cGU+IHsKKyAgY29uc3QgdHlwZW5hbWUgX1BhaXI6OmZpcnN0X3R5cGUmIG9wZXJhdG9yKCkoY29uc3QgX1BhaXImIF9feCkgY29uc3QgeworICAgIHJldHVybiBfX3guZmlyc3Q7CisgIH0KK307CisjIGVuZGlmCitFSF9FTkRfTkFNRVNQQUNFCisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIEMsIGNsYXNzIEl0ZXI+CitzaXplX3QgQ291bnRVbmlxdWVJdGVtcyggY29uc3QgQyYgb3JpZ2luYWwsIGNvbnN0IEl0ZXImIGZpcnN0TmV3LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEl0ZXImIGxhc3ROZXcsIHNldF90YWcgKQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgQzo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICAgIHJldHVybiBDb3VudFVuaXF1ZUl0ZW1zX0F1eCggb3JpZ2luYWwsIGZpcnN0TmV3LCBsYXN0TmV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUhfU1REOjppZGVudGl0eTx2YWx1ZV90eXBlPigpICk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBDLCBjbGFzcyBJdGVyPgorc2l6ZV90IENvdW50VW5pcXVlSXRlbXMoIGNvbnN0IEMmIG9yaWdpbmFsLCBjb25zdCBJdGVyJiBmaXJzdE5ldywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJdGVyJiBsYXN0TmV3LCBtYXBfdGFnICkKK3sKKyNpZmRlZiBFSF9NVUxUSV9DT05TVF9URU1QTEFURV9BUkdfQlVHCisgICAgcmV0dXJuIENvdW50VW5pcXVlSXRlbXNfQXV4KCBvcmlnaW5hbCwgZmlyc3ROZXcsIGxhc3ROZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFSF9TRUxFQ1QxU1RfSElOVDxDOjp2YWx1ZV90eXBlLCBDOjprZXlfdHlwZT4oKSApOworI2Vsc2UKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEM6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgICByZXR1cm4gQ291bnRVbmlxdWVJdGVtc19BdXgoIG9yaWdpbmFsLCBmaXJzdE5ldywgbGFzdE5ldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVIX1NURDo6c2VsZWN0MXN0PHZhbHVlX3R5cGU+KCkgKTsKKyNlbmRpZgorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgQywgY2xhc3MgSXRlcj4KK3NpemVfdCBDb3VudE5ld0l0ZW1zKCBjb25zdCBDJiBvcmlnaW5hbCwgY29uc3QgSXRlciYgZmlyc3ROZXcsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSXRlciYgbGFzdE5ldywgbWFwX3RhZyApCit7CisgICAgcmV0dXJuIENvdW50VW5pcXVlSXRlbXMoIG9yaWdpbmFsLCBmaXJzdE5ldywgbGFzdE5ldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyX2NhdGVnb3J5KCBvcmlnaW5hbCApICk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBDLCBjbGFzcyBJdGVyPgorc2l6ZV90IENvdW50TmV3SXRlbXMoIGNvbnN0IEMmIG9yaWdpbmFsLCBjb25zdCBJdGVyJiBmaXJzdE5ldywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJdGVyJiBsYXN0TmV3LCBzZXRfdGFnICkKK3sKKyAgICByZXR1cm4gQ291bnRVbmlxdWVJdGVtcyggb3JpZ2luYWwsIGZpcnN0TmV3LCBsYXN0TmV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJfY2F0ZWdvcnkoIG9yaWdpbmFsICkgKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEMsIGNsYXNzIFNyY0l0ZXI+CitpbmxpbmUgdm9pZCBWZXJpZnlJbnNlcnRpb24oIGNvbnN0IEMmIG9yaWdpbmFsLCBjb25zdCBDJiByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNyY0l0ZXImIGZpcnN0TmV3LCBjb25zdCBTcmNJdGVyJiBsYXN0TmV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QsIGFzc29jaWF0aXZlX2NvbnRhaW5lcl90YWcgKQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgQzo6Y29uc3RfaXRlcmF0b3IgRHN0SXRlcjsKKyAgICBEc3RJdGVyIGZpcnN0MSA9IG9yaWdpbmFsLmJlZ2luKCk7CisgICAgRHN0SXRlciBmaXJzdDIgPSByZXN1bHQuYmVnaW4oKTsKKworICAgIERzdEl0ZXIqIGZyb21fb3JpZyA9IG5ldyBEc3RJdGVyW29yaWdpbmFsLnNpemUoKV07CisgICAgRHN0SXRlciogbGFzdF9mcm9tX29yaWcgPSBmcm9tX29yaWc7CisKKyAgICAvLyBmYnAgOiBmb3IgaGFzaGVkIGNvbnRhaW5lcnMsIHRoZSBmb2xsb3dpbmcgaXMgbmVlZGVkIDoKKyAgICB3aGlsZSAoIGZpcnN0MiAhPSByZXN1bHQuZW5kKCkgKQorICAgIHsKKyAgICAgICAgRUhfU1REOjpwYWlyPERzdEl0ZXIsIERzdEl0ZXI+IHAgPSBFSF9TVEQ6Om1pc21hdGNoKCBmaXJzdDEsIG9yaWdpbmFsLmVuZCgpLCBmaXJzdDIgKTsKKyAgICAgICAgaWYgKCBwLnNlY29uZCAhPSByZXN1bHQuZW5kKCkgKQorICAgICAgICB7CisgICAgICAgICAgICBTcmNJdGVyIHNyY0l0ZW0gPSBFSF9TVEQ6OmZpbmQoIFNyY0l0ZXIoZmlyc3ROZXcpLCBTcmNJdGVyKGxhc3ROZXcpLCAqcC5zZWNvbmQgKTsKKworICAgICAgICAgICAgaWYgKHNyY0l0ZW0gPT0gbGFzdE5ldykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBub3QgZm91bmQgaW4gaW5wdXQgcmFuZ2UsIHByb2JhYmx5IHJlLW9yZGVyZWQgZnJvbSB0aGUgb3JpZworICAgICAgICAgICAgICAgIERzdEl0ZXIqIHRtcDsKKyAgICAgICAgICAgICAgICB0bXAgPSBFSF9TVEQ6OmZpbmQoIGZyb21fb3JpZywgbGFzdF9mcm9tX29yaWcsIHAuZmlyc3QgKTsKKworICAgICAgICAgICAgICAgIC8vIGlmIGFscmVhZHkgaGVyZSwgZXhjbHVkZQorICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gbGFzdF9mcm9tX29yaWcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBFSF9TVEQ6OmNvcHkodG1wKzEsIGxhc3RfZnJvbV9vcmlnLCB0bXApOworICAgICAgICAgICAgICAgICAgICBsYXN0X2Zyb21fb3JpZy0tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyByZWdpc3RlciByZS1vcmRlcmVkIGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgRHN0SXRlciBkc3RJdGVtOworICAgICAgICAgICAgICAgICAgICBkc3RJdGVtID0gRUhfU1REOjpmaW5kKCBmaXJzdDEsIG9yaWdpbmFsLmVuZCgpLCAqcC5maXJzdCApOworICAgICAgICAgICAgICAgICAgICBFSF9BU1NFUlQoIGRzdEl0ZW0gIT0gb3JpZ2luYWwuZW5kKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgKmxhc3RfZnJvbV9vcmlnID0gZHN0SXRlbTsKKyAgICAgICAgICAgICAgICAgICAgbGFzdF9mcm9tX29yaWcrKzsKKyAgICAgICAgICAgICAgICAgICAgKytwLmZpcnN0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsrcC5zZWNvbmQ7CisgICAgICAgIH0KKyAgICAgICAgZmlyc3QxID0gcC5maXJzdDsKKyAgICAgICAgZmlyc3QyID0gcC5zZWNvbmQ7CisgICAgfQorCisgICAgZGVsZXRlIFtdIGZyb21fb3JpZzsKK30KKworLy8gVkMrKwordGVtcGxhdGUgPGNsYXNzIEMsIGNsYXNzIFNyY0l0ZXI+CitpbmxpbmUgdm9pZCBWZXJpZnlJbnNlcnRpb24oCisgICAgY29uc3QgQyYgb3JpZ2luYWwsIGNvbnN0IEMmIHJlc3VsdCwgY29uc3QgU3JjSXRlciYgZmlyc3ROZXcsCisgICAgY29uc3QgU3JjSXRlciYgbGFzdE5ldywgc2l6ZV90LCBzZXRfdGFnICkKK3sKKyAgICBWZXJpZnlJbnNlcnRpb24oIG9yaWdpbmFsLCByZXN1bHQsIGZpcnN0TmV3LCBsYXN0TmV3LAorICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KDApLCBhc3NvY2lhdGl2ZV9jb250YWluZXJfdGFnKCkgKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEMsIGNsYXNzIFNyY0l0ZXI+CitpbmxpbmUgdm9pZCBWZXJpZnlJbnNlcnRpb24oY29uc3QgQyYgb3JpZ2luYWwsIGNvbnN0IEMmIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTcmNJdGVyJiBmaXJzdE5ldywgY29uc3QgU3JjSXRlciYgbGFzdE5ldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QsIG11bHRpc2V0X3RhZyApCit7CisgICAgVmVyaWZ5SW5zZXJ0aW9uKCBvcmlnaW5hbCwgcmVzdWx0LCBmaXJzdE5ldywgbGFzdE5ldywKKyAgICAgICAgICAgICAgICAgICAgIHNpemVfdCgwKSwgYXNzb2NpYXRpdmVfY29udGFpbmVyX3RhZygpICk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBDLCBjbGFzcyBTcmNJdGVyPgoraW5saW5lIHZvaWQgVmVyaWZ5SW5zZXJ0aW9uKAorICAgIGNvbnN0IEMmIG9yaWdpbmFsLCBjb25zdCBDJiByZXN1bHQsIGNvbnN0IFNyY0l0ZXImIGZpcnN0TmV3LAorICAgIGNvbnN0IFNyY0l0ZXImIGxhc3ROZXcsIHNpemVfdCwgbWFwX3RhZyApCit7CisgICAgVmVyaWZ5SW5zZXJ0aW9uKCBvcmlnaW5hbCwgcmVzdWx0LCBmaXJzdE5ldywgbGFzdE5ldywKKyAgICAgICAgICAgICAgICAgICAgIHNpemVfdCgwKSwgYXNzb2NpYXRpdmVfY29udGFpbmVyX3RhZygpICk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBDLCBjbGFzcyBTcmNJdGVyPgoraW5saW5lIHZvaWQgVmVyaWZ5SW5zZXJ0aW9uKAorICAgIGNvbnN0IEMmIG9yaWdpbmFsLCBjb25zdCBDJiByZXN1bHQsIGNvbnN0IFNyY0l0ZXImIGZpcnN0TmV3LAorICAgIGNvbnN0IFNyY0l0ZXImIGxhc3ROZXcsIHNpemVfdCwgbXVsdGltYXBfdGFnICkKK3sKKyAgICBWZXJpZnlJbnNlcnRpb24oIG9yaWdpbmFsLCByZXN1bHQsIGZpcnN0TmV3LCBsYXN0TmV3LAorICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KDApLCBhc3NvY2lhdGl2ZV9jb250YWluZXJfdGFnKCkgKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEMsIGNsYXNzIFNyY0l0ZXI+Cit2b2lkIFZlcmlmeUluc2VydGlvbigKKyMgaWZkZWYgX01TQ19WRVIKKyAgICBjb25zdCBDJiBvcmlnaW5hbCwgY29uc3QgQyYgcmVzdWx0LCBTcmNJdGVyIGZpcnN0TmV3LAorICAgIFNyY0l0ZXIgbGFzdE5ldywgc2l6ZV90IGluc1Bvcywgc2VxdWVuY2VfY29udGFpbmVyX3RhZyApCisjIGVsc2UKKyAgICBjb25zdCBDJiBvcmlnaW5hbCwgY29uc3QgQyYgcmVzdWx0LCBjb25zdCBTcmNJdGVyJiBmaXJzdE5ldywKKyAgICBjb25zdCBTcmNJdGVyJiBsYXN0TmV3LCBzaXplX3QgaW5zUG9zLCBzZXF1ZW5jZV9jb250YWluZXJfdGFnICkKKyMgZW5kaWYKK3sKKyAgICB0eXBlbmFtZSBDOjpjb25zdF9pdGVyYXRvciBwMSA9IG9yaWdpbmFsLmJlZ2luKCk7CisgICAgdHlwZW5hbWUgQzo6Y29uc3RfaXRlcmF0b3IgcDIgPSByZXN1bHQuYmVnaW4oKTsKKyAgICBTcmNJdGVyIHRtcChmaXJzdE5ldyk7CisKKyAgICBmb3IgKCBzaXplX3QgbiA9IDA7IG4gPCBpbnNQb3M7IG4rKywgKytwMSwgKytwMikKKyAgICAgICAgRUhfQVNTRVJUKCAqcDEgPT0gKnAyICk7CisKKyAgICBmb3IgKDsgdG1wICE9IGxhc3ROZXc7ICsrcDIsICsrdG1wICkgeworICAgICAgICBFSF9BU1NFUlQocDIgIT0gcmVzdWx0LmVuZCgpKTsKKyAgICAgICAgRUhfQVNTRVJUKCpwMiA9PSAqdG1wKTsKKyAgICB9CisKKyAgICBmb3IgKDsgIHAyICE9IHJlc3VsdC5lbmQoKTsgKytwMSwgKytwMiApCisgICAgICAgIEVIX0FTU0VSVCggKnAxID09ICpwMiApOworICAgIEVIX0FTU0VSVCggcDEgPT0gb3JpZ2luYWwuZW5kKCkgKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEMsIGNsYXNzIFNyY0l0ZXI+CitpbmxpbmUgdm9pZCBWZXJpZnlJbnNlcnRpb24oIGNvbnN0IEMmIG9yaWdpbmFsLCBjb25zdCBDJiByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNyY0l0ZXImIGZpcnN0TmV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTcmNJdGVyJiBsYXN0TmV3LCBzaXplX3QgaW5zUG9zICkKK3sKKyAgICBFSF9BU1NFUlQoIHJlc3VsdC5zaXplKCkgPT0gb3JpZ2luYWwuc2l6ZSgpICsKKyAgICAgICAgICAgIENvdW50TmV3SXRlbXMoIG9yaWdpbmFsLCBmaXJzdE5ldywgbGFzdE5ldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcl9jYXRlZ29yeShvcmlnaW5hbCkgKSApOworICAgIFZlcmlmeUluc2VydGlvbiggb3JpZ2luYWwsIHJlc3VsdCwgZmlyc3ROZXcsIGxhc3ROZXcsIGluc1BvcywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcl9jYXRlZ29yeShvcmlnaW5hbCkgKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEMsIGNsYXNzIFZhbHVlPgordm9pZCBWZXJpZnlJbnNlcnROKCBjb25zdCBDJiBvcmlnaW5hbCwgY29uc3QgQyYgcmVzdWx0LCBzaXplX3QgaW5zQ250LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZSYgdmFsLCBzaXplX3QgaW5zUG9zICkKK3sKKyAgICB0eXBlbmFtZSBDOjpjb25zdF9pdGVyYXRvciBwMSA9IG9yaWdpbmFsLmJlZ2luKCk7CisgICAgdHlwZW5hbWUgQzo6Y29uc3RfaXRlcmF0b3IgcDIgPSByZXN1bHQuYmVnaW4oKTsKKyAgKHZvaWQpdmFsOyAgICAvLypUWSAwMi8wNi8yMDAwIC0gdG8gc3VwcHJlc3MgdW51c2VkIHZhcmlhYmxlIHdhcm5pbmcgdW5kZXIgbm9uZGVidWcgYnVpbGQKKworICAgIGZvciAoIHNpemVfdCBuID0gMDsgbiA8IGluc1BvczsgbisrICkKKyAgICAgICAgRUhfQVNTRVJUKCAqcDErKyA9PSAqcDIrKyApOworCisgICAgd2hpbGUgKCBpbnNDbnQtLSA+IDAgKQorICAgIHsKKyAgICAgICAgRUhfQVNTRVJUKHAyICE9IHJlc3VsdC5lbmQoKSk7CisgICAgICAgIEVIX0FTU0VSVCgqcDIgPT0gdmFsICk7CisgICAgICAgICsrcDI7CisgICAgfQorCisgICAgd2hpbGUgKCBwMiAhPSByZXN1bHQuZW5kKCkgKSB7CisgICAgICAgIEVIX0FTU0VSVCggKnAxID09ICpwMiApOworICAgICAgICArK3AxOyArK3AyOworICAgIH0KKyAgICBFSF9BU1NFUlQoIHAxID09IG9yaWdpbmFsLmVuZCgpICk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBDPgordm9pZCBwcmVwYXJlX2luc2VydF9uKCBDJiwgc2l6ZV90ICkge30KKworLy8gTWV0cm93ZXJrcyAxLjggY29tcGlsZXIgcmVxdWlyZXMgdGhhdCBzcGVjaWFsaXphdGlvbnMgYXBwZWFyIGZpcnN0ICghISkKKy8vIG9yIGl0IHdvbid0IGNhbGwgdGhlbS4gRml4ZWQgaW4gMS45LCB0aG91Z2guCitpbmxpbmUgdm9pZCBNYWtlUmFuZG9tVmFsdWUoYm9vbCYgYikgeyBiID0gYm9vbChyYW5kb21fbnVtYmVyKDIpICE9IDApOyB9CisKK3RlbXBsYXRlPGNsYXNzIFQ+CitpbmxpbmUgdm9pZCBNYWtlUmFuZG9tVmFsdWUoVCYpIHt9CisKK3RlbXBsYXRlIDxjbGFzcyBDPgorc3RydWN0IHRlc3RfaW5zZXJ0X29uZQoreworICAgIHRlc3RfaW5zZXJ0X29uZSggY29uc3QgQyYgb3JpZywgaW50IHBvcyA9LTEgKQorICAgICAgICA6IG9yaWdpbmFsKCBvcmlnICksIGZQb3MoIHJhbmRvbV9udW1iZXIoIG9yaWcuc2l6ZSgpICkpCisgICAgeworICAgICAgICBNYWtlUmFuZG9tVmFsdWUoIGZJbnNWYWwgKTsKKyAgICAgICAgaWYgKCBwb3MgIT0gLTEgKQorICAgICAgICB7CisgICAgICAgICAgICBmUG9zID0gc2l6ZV90KHBvcyk7CisgICAgICAgICAgICBpZiAoIHBvcyA9PSAwICkKKyAgICAgICAgICAgICAgICBnVGVzdENvbnRyb2xsZXIuU2V0Q3VycmVudFRlc3ROYW1lKCJzaW5nbGUgaW5zZXJ0aW9uIGF0IGJlZ2luKCkiKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBnVGVzdENvbnRyb2xsZXIuU2V0Q3VycmVudFRlc3ROYW1lKCJzaW5nbGUgaW5zZXJ0aW9uIGF0IGVuZCgpIik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZ1Rlc3RDb250cm9sbGVyLlNldEN1cnJlbnRUZXN0TmFtZSgic2luZ2xlIGluc2VydGlvbiBhdCByYW5kb20gcG9zaXRpb24iKTsKKyAgICB9CisKKyAgICB2b2lkIG9wZXJhdG9yKCkoIEMmIGMgKSBjb25zdAorICAgIHsKKyAgICAgICAgcHJlcGFyZV9pbnNlcnRfbiggYywgKHNpemVfdCkxICk7CisgICAgICAgIHR5cGVuYW1lIEM6Oml0ZXJhdG9yIHBvcyA9IGMuYmVnaW4oKTsKKyAgICAgICAgRUhfU1REOjphZHZhbmNlKCBwb3MsIHNpemVfdChmUG9zKSApOworICAgICAgICBjLmluc2VydCggcG9zLCBmSW5zVmFsICk7CisKKyAgICAgICAgLy8gUHJldmVudCBzaW11bGF0ZWQgZmFpbHVyZXMgZHVyaW5nIHZlcmlmaWNhdGlvbgorICAgICAgICBnVGVzdENvbnRyb2xsZXIuQ2FuY2VsRmFpbHVyZUNvdW50ZG93bigpOworICAgICAgICAvLyBTdWNjZXNzLiBDaGVjayByZXN1bHRzLgorICAgICAgICBWZXJpZnlJbnNlcnRpb24oIG9yaWdpbmFsLCBjLCAmZkluc1ZhbCwgMSsmZkluc1ZhbCwgZlBvcyApOworICAgIH0KK3ByaXZhdGU6CisgICAgdHlwZW5hbWUgQzo6dmFsdWVfdHlwZSBmSW5zVmFsOworICAgIGNvbnN0IEMmIG9yaWdpbmFsOworICAgIHNpemVfdCBmUG9zOworfTsKKwordGVtcGxhdGUgPGNsYXNzIEM+CitzdHJ1Y3QgdGVzdF9pbnNlcnRfbgoreworICAgIHRlc3RfaW5zZXJ0X24oIGNvbnN0IEMmIG9yaWcsIHNpemVfdCBpbnNDbnQsIGludCBwb3MgPS0xICkKKyAgICAgICAgOiBvcmlnaW5hbCggb3JpZyApLCBmUG9zKCByYW5kb21fbnVtYmVyKCBvcmlnLnNpemUoKSApKSwgZkluc0NudChpbnNDbnQpCisgICAgeworICAgICAgICBNYWtlUmFuZG9tVmFsdWUoIGZJbnNWYWwgKTsKKyAgICAgICAgaWYgKHBvcyE9LTEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZQb3M9c2l6ZV90KHBvcyk7CisgICAgICAgICAgICBpZiAocG9zPT0wKQorICAgICAgICAgICAgICAgIGdUZXN0Q29udHJvbGxlci5TZXRDdXJyZW50VGVzdE5hbWUoIm4tYXJ5IGluc2VydGlvbiBhdCBiZWdpbigpIik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZ1Rlc3RDb250cm9sbGVyLlNldEN1cnJlbnRUZXN0TmFtZSgibi1hcnkgaW5zZXJ0aW9uIGF0IGVuZCgpIik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZ1Rlc3RDb250cm9sbGVyLlNldEN1cnJlbnRUZXN0TmFtZSgibi1hcnkgaW5zZXJ0aW9uIGF0IHJhbmRvbSBwb3NpdGlvbiIpOworICAgIH0KKworICAgIHZvaWQgb3BlcmF0b3IoKSggQyYgYyApIGNvbnN0CisgICAgeworICAgICAgICBwcmVwYXJlX2luc2VydF9uKCBjLCBmSW5zQ250ICk7CisgICAgICAgIHR5cGVuYW1lIEM6Oml0ZXJhdG9yIHBvcyA9IGMuYmVnaW4oKTsKKyAgICAgICAgRUhfU1REOjphZHZhbmNlKCBwb3MsIGZQb3MgKTsKKyAgICAgICAgYy5pbnNlcnQoIHBvcywgZkluc0NudCwgZkluc1ZhbCApOworCisgICAgICAgIC8vIFByZXZlbnQgc2ltdWxhdGVkIGZhaWx1cmVzIGR1cmluZyB2ZXJpZmljYXRpb24KKyAgICAgICAgZ1Rlc3RDb250cm9sbGVyLkNhbmNlbEZhaWx1cmVDb3VudGRvd24oKTsKKyAgICAgICAgLy8gU3VjY2Vzcy4gQ2hlY2sgcmVzdWx0cy4KKyAgICAgICAgVmVyaWZ5SW5zZXJ0Tiggb3JpZ2luYWwsIGMsIGZJbnNDbnQsIGZJbnNWYWwsIGZQb3MgKTsKKyAgICB9Citwcml2YXRlOgorICAgIHR5cGVuYW1lIEM6OnZhbHVlX3R5cGUgZkluc1ZhbDsKKyAgICBjb25zdCBDJiBvcmlnaW5hbDsKKyAgICBzaXplX3QgZlBvczsKKyAgICBzaXplX3QgZkluc0NudDsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBDPgorc3RydWN0IHRlc3RfaW5zZXJ0X3ZhbHVlCit7CisgICAgdGVzdF9pbnNlcnRfdmFsdWUoIGNvbnN0IEMmIG9yaWcgKQorICAgICAgICA6IG9yaWdpbmFsKCBvcmlnICkKKyAgICB7CisgICAgICAgIE1ha2VSYW5kb21WYWx1ZSggZkluc1ZhbCApOworICAgICAgICBnVGVzdENvbnRyb2xsZXIuU2V0Q3VycmVudFRlc3ROYW1lKCJpbnNlcnRpb24gb2YgcmFuZG9tIHZhbHVlIik7CisgICAgfQorCisgICAgdm9pZCBvcGVyYXRvcigpKCBDJiBjICkgY29uc3QKKyAgICB7CisgICAgICAgIGMuaW5zZXJ0KCBmSW5zVmFsICk7CisKKyAgICAgICAgLy8gUHJldmVudCBzaW11bGF0ZWQgZmFpbHVyZXMgZHVyaW5nIHZlcmlmaWNhdGlvbgorICAgICAgICBnVGVzdENvbnRyb2xsZXIuQ2FuY2VsRmFpbHVyZUNvdW50ZG93bigpOworICAgICAgICAvLyBTdWNjZXNzLiBDaGVjayByZXN1bHRzLgorICAgICAgICBWZXJpZnlJbnNlcnRpb24oIG9yaWdpbmFsLCBjLCAmZkluc1ZhbCwgMSsmZkluc1ZhbCwgc2l6ZV90KDApICk7CisgICAgfQorcHJpdmF0ZToKKyAgICB0eXBlbmFtZSBDOjp2YWx1ZV90eXBlIGZJbnNWYWw7CisgICAgY29uc3QgQyYgb3JpZ2luYWw7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgQz4KK3N0cnVjdCB0ZXN0X2luc2VydF9ub3Jlc2l6ZQoreworICAgIHRlc3RfaW5zZXJ0X25vcmVzaXplKCBjb25zdCBDJiBvcmlnICkKKyAgICAgICAgOiBvcmlnaW5hbCggb3JpZyApCisgICAgeworICAgICAgICBNYWtlUmFuZG9tVmFsdWUoIGZJbnNWYWwgKTsKKyAgICAgICAgZ1Rlc3RDb250cm9sbGVyLlNldEN1cnJlbnRUZXN0TmFtZSgiaW5zZXJ0aW9uIG9mIHJhbmRvbSB2YWx1ZSB3aXRob3V0IHJlc2l6ZSIpOworICAgIH0KKworICAgIHZvaWQgb3BlcmF0b3IoKSggQyYgYyApIGNvbnN0CisgICAgeworICAgICAgICBjLmluc2VydF9ub3Jlc2l6ZSggZkluc1ZhbCApOworCisgICAgICAgIC8vIFByZXZlbnQgc2ltdWxhdGVkIGZhaWx1cmVzIGR1cmluZyB2ZXJpZmljYXRpb24KKyAgICAgICAgZ1Rlc3RDb250cm9sbGVyLkNhbmNlbEZhaWx1cmVDb3VudGRvd24oKTsKKyAgICAgICAgLy8gU3VjY2Vzcy4gQ2hlY2sgcmVzdWx0cy4KKyAgICAgICAgVmVyaWZ5SW5zZXJ0aW9uKCBvcmlnaW5hbCwgYywgJmZJbnNWYWwsIDErJmZJbnNWYWwsIHNpemVfdCgwKSApOworICAgIH0KK3ByaXZhdGU6CisgICAgdHlwZW5hbWUgQzo6dmFsdWVfdHlwZSBmSW5zVmFsOworICAgIGNvbnN0IEMmIG9yaWdpbmFsOworfTsKKwordGVtcGxhdGUgPGNsYXNzIEMsIGNsYXNzIFBvc2l0aW9uLCBjbGFzcyBJdGVyPgordm9pZCBkb19pbnNlcnRfcmFuZ2UoIEMmIGNfaW5zdCwgUG9zaXRpb24gb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgIEl0ZXIgZmlyc3QsIEl0ZXIgbGFzdCwgc2VxdWVuY2VfY29udGFpbmVyX3RhZyApCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBDOjppdGVyYXRvciBDSXRlcjsKKyAgICBDSXRlciBwb3MgPSBjX2luc3QuYmVnaW4oKTsKKyAgICBFSF9TVEQ6OmFkdmFuY2UoIHBvcywgb2Zmc2V0ICk7CisgICAgY19pbnN0Lmluc2VydCggcG9zLCBmaXJzdCwgbGFzdCApOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgQywgY2xhc3MgUG9zaXRpb24sIGNsYXNzIEl0ZXI+Cit2b2lkIGRvX2luc2VydF9yYW5nZSggQyYgYywgUG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgSXRlciBmaXJzdCwgSXRlciBsYXN0LCBhc3NvY2lhdGl2ZV9jb250YWluZXJfdGFnICkKK3sKKyAgICBjLmluc2VydCggZmlyc3QsIGxhc3QgKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEMsIGNsYXNzIFBvc2l0aW9uLCBjbGFzcyBJdGVyPgordm9pZCBkb19pbnNlcnRfcmFuZ2UoIEMmIGMsIFBvc2l0aW9uLCBJdGVyIGZpcnN0LCBJdGVyIGxhc3QsIG11bHRpc2V0X3RhZyApCit7CisgICAgYy5pbnNlcnQoIGZpcnN0LCBsYXN0ICk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBDLCBjbGFzcyBQb3NpdGlvbiwgY2xhc3MgSXRlcj4KK3ZvaWQgZG9faW5zZXJ0X3JhbmdlKCBDJiBjLCBQb3NpdGlvbiwgSXRlciBmaXJzdCwgSXRlciBsYXN0LCBtdWx0aW1hcF90YWcgKQoreworICAgIGMuaW5zZXJ0KCBmaXJzdCwgbGFzdCApOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgQywgY2xhc3MgUG9zaXRpb24sIGNsYXNzIEl0ZXI+Cit2b2lkIGRvX2luc2VydF9yYW5nZSggQyYgYywgUG9zaXRpb24sIEl0ZXIgZmlyc3QsIEl0ZXIgbGFzdCwgc2V0X3RhZyApCit7CisgICAgYy5pbnNlcnQoIGZpcnN0LCBsYXN0ICk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBDLCBjbGFzcyBQb3NpdGlvbiwgY2xhc3MgSXRlcj4KK3ZvaWQgZG9faW5zZXJ0X3JhbmdlKCBDJiBjLCBQb3NpdGlvbiwgSXRlciBmaXJzdCwgSXRlciBsYXN0LCBtYXBfdGFnICkKK3sKKyAgICBjLmluc2VydCggZmlyc3QsIGxhc3QgKTsKK30KKworLyoKK3RlbXBsYXRlIDxjbGFzcyBDLCBjbGFzcyBJdGVyPgordm9pZCBwcmVwYXJlX2luc2VydF9yYW5nZSggQyYsIHNpemVfdCwgSXRlciwgSXRlcikge30KKyovCisKK3RlbXBsYXRlIDxjbGFzcyBDLCBjbGFzcyBJdGVyPgorc3RydWN0IHRlc3RfaW5zZXJ0X3JhbmdlCit7CisgICAgdGVzdF9pbnNlcnRfcmFuZ2UoIGNvbnN0IEMmIG9yaWcsIEl0ZXIgZmlyc3QsIEl0ZXIgbGFzdCwgaW50IHBvcz0tMSApCisgICAgICAgIDogZkZpcnN0KCBmaXJzdCApLAorICAgICAgICAgIGZMYXN0KCBsYXN0ICksCisgICAgICAgICAgb3JpZ2luYWwoIG9yaWcgKSwKKyAgICAgICAgICBmUG9zKCByYW5kb21fbnVtYmVyKCBvcmlnLnNpemUoKSApKQorICAgIHsKKyAgICAgICAgZ1Rlc3RDb250cm9sbGVyLlNldEN1cnJlbnRUZXN0TmFtZSgicmFuZ2UgaW5zZXJ0aW9uIik7CisgICAgICAgIGlmICggcG9zICE9IC0xICkKKyAgICAgICAgeworICAgICAgICAgICAgZlBvcyA9IHNpemVfdChwb3MpOworICAgICAgICAgICAgaWYgKCBwb3MgPT0gMCApCisgICAgICAgICAgICAgICAgZ1Rlc3RDb250cm9sbGVyLlNldEN1cnJlbnRUZXN0TmFtZSgicmFuZ2UgaW5zZXJ0aW9uIGF0IGJlZ2luKCkiKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBnVGVzdENvbnRyb2xsZXIuU2V0Q3VycmVudFRlc3ROYW1lKCJyYW5nZSBpbnNlcnRpb24gYXQgZW5kKCkiKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBnVGVzdENvbnRyb2xsZXIuU2V0Q3VycmVudFRlc3ROYW1lKCJyYW5nZSBpbnNlcnRpb24gYXQgcmFuZG9tIHBvc2l0aW9uIik7CisgICAgfQorCisgICAgdm9pZCBvcGVyYXRvcigpKCBDJiBjICkgY29uc3QKKyAgICB7CisvLyAgICAgICAgcHJlcGFyZV9pbnNlcnRfcmFuZ2UoIGMsIGZQb3MsIGZGaXJzdCwgZkxhc3QgKTsKKyAgICAgICAgZG9faW5zZXJ0X3JhbmdlKCBjLCBmUG9zLCBmRmlyc3QsIGZMYXN0LCBjb250YWluZXJfY2F0ZWdvcnkoYykgKTsKKworICAgICAgICAvLyBQcmV2ZW50IHNpbXVsYXRlZCBmYWlsdXJlcyBkdXJpbmcgdmVyaWZpY2F0aW9uCisgICAgICAgIGdUZXN0Q29udHJvbGxlci5DYW5jZWxGYWlsdXJlQ291bnRkb3duKCk7CisgICAgICAgIC8vIFN1Y2Nlc3MuIENoZWNrIHJlc3VsdHMuCisgICAgICAgIFZlcmlmeUluc2VydGlvbiggb3JpZ2luYWwsIGMsIGZGaXJzdCwgZkxhc3QsIGZQb3MgKTsKKyAgICB9Citwcml2YXRlOgorICAgIEl0ZXIgZkZpcnN0LCBmTGFzdDsKKyAgICBjb25zdCBDJiBvcmlnaW5hbDsKKyAgICBzaXplX3QgZlBvczsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBDLCBjbGFzcyBJdGVyPgordGVzdF9pbnNlcnRfcmFuZ2U8QywgSXRlcj4gaW5zZXJ0X3JhbmdlX3Rlc3RlciggY29uc3QgQyYgb3JpZywgY29uc3QgSXRlciYgZmlyc3QsIGNvbnN0IEl0ZXImIGxhc3QgKQoreworICAgIHJldHVybiB0ZXN0X2luc2VydF9yYW5nZTxDLCBJdGVyPiggb3JpZywgZmlyc3QsIGxhc3QgKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEMsIGNsYXNzIEl0ZXI+Cit0ZXN0X2luc2VydF9yYW5nZTxDLCBJdGVyPiBpbnNlcnRfcmFuZ2VfYXRfYmVnaW5fdGVzdGVyKCBjb25zdCBDJiBvcmlnLCBjb25zdCBJdGVyJiBmaXJzdCwgY29uc3QgSXRlciYgbGFzdCApCit7CisgIHJldHVybiB0ZXN0X2luc2VydF9yYW5nZTxDLCBJdGVyPiggb3JpZywgZmlyc3QsIGxhc3QgLCAwKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEMsIGNsYXNzIEl0ZXI+Cit0ZXN0X2luc2VydF9yYW5nZTxDLCBJdGVyPiBpbnNlcnRfcmFuZ2VfYXRfZW5kX3Rlc3RlciggY29uc3QgQyYgb3JpZywgY29uc3QgSXRlciYgZmlyc3QsIGNvbnN0IEl0ZXImIGxhc3QgKQoreworICByZXR1cm4gdGVzdF9pbnNlcnRfcmFuZ2U8QywgSXRlcj4oIG9yaWcsIGZpcnN0LCBsYXN0ICwgKGludClvcmlnLnNpemUoKSk7Cit9CisKKyNlbmRpZiAvLyB0ZXN0X2luc2VydF9IXwpkaWZmIC0tZ2l0IGEvdGVzdC9laC90ZXN0X2xpc3QuY3BwIGIvdGVzdC9laC90ZXN0X2xpc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2Mzc1YzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2VoL3Rlc3RfbGlzdC5jcHAKQEAgLTAsMCArMSwxMDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICB0ZXN0X2xpc3QuY3BwCisKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogTWFyayBvZiB0aGUgVW5pY29ybiwgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgTWFyayBvZiB0aGUgVW5pY29ybiBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJUZXN0cy5oIgorI2luY2x1ZGUgIlRlc3RDbGFzcy5oIgorI2luY2x1ZGUgIkxlYWtDaGVjay5oIgorIyBpZiBkZWZpbmVkIChFSF9ORVdfSEVBREVSUykKKyNpbmNsdWRlIDxsaXN0PgorI2Vsc2UKKyNpbmNsdWRlIDxsaXN0Lmg+CisjZW5kaWYKKyNpbmNsdWRlICJ0ZXN0X2NvbnN0cnVjdC5oIgorI2luY2x1ZGUgInRlc3RfYXNzaWduX29wLmgiCisjaW5jbHVkZSAidGVzdF9wdXNoX2JhY2suaCIKKyNpbmNsdWRlICJ0ZXN0X2luc2VydC5oIgorI2luY2x1ZGUgInRlc3RfcHVzaF9mcm9udC5oIgorI2luY2x1ZGUgIm5jX2FsbG9jLmgiCisKK3R5cGVkZWYgRUhfU1REOjpfX2xpc3RfXzxUZXN0Q2xhc3MsIGVoX2FsbG9jYXRvcihUZXN0Q2xhc3MpID4gVGVzdExpc3Q7CisKK2lubGluZSBzZXF1ZW5jZV9jb250YWluZXJfdGFnCitjb250YWluZXJfY2F0ZWdvcnkoY29uc3QgVGVzdExpc3QmKQoreworICByZXR1cm4gc2VxdWVuY2VfY29udGFpbmVyX3RhZygpOworfQorCisvLworLy8gIGxpc3Qgc29ydCgpIG1lbWJlciB0ZXN0IG9wZXJhdGlvbi4gRG9lcyBub3QgdmVyaWZ5IHN0YWJpbGl0eS4KKy8vCitzdHJ1Y3QgdGVzdF9saXN0X3NvcnQKK3sKKyAgICB0ZXN0X2xpc3Rfc29ydCgpCisgICAgeworICAgICAgICBnVGVzdENvbnRyb2xsZXIuU2V0Q3VycmVudFRlc3ROYW1lKCJsaXN0Ojpzb3J0KCkiKTsKKyAgICB9CisKKyAgICB2b2lkIG9wZXJhdG9yKCkoIFRlc3RMaXN0JiBsaXN0ICkgY29uc3QKKyAgICB7CisgICAgICAgIGxpc3Quc29ydCgpOworCisgICAgICAgIGdUZXN0Q29udHJvbGxlci5DYW5jZWxGYWlsdXJlQ291bnRkb3duKCk7CisKKyAgICAgICAgZm9yICggVGVzdExpc3Q6Oml0ZXJhdG9yIHAgPSBsaXN0LmJlZ2luKCk7IHAgIT0gbGlzdC5lbmQoKTsgcCsrICkKKyAgICAgICAgICAgIGlmICggcCAhPSBsaXN0LmJlZ2luKCkgKSB7CisgICAgICAgICAgICAgICAgVGVzdExpc3Q6Oml0ZXJhdG9yIHRtcD1wOworICAgICAgICAgICAgICAgIC0tdG1wOworICAgICAgICAgICAgICAgIEVIX0FTU0VSVCggKnAgPj0gKnRtcCApOworICAgICAgICAgICAgfQorICAgIH0KK307CisKK3ZvaWQgdGVzdF9saXN0KCkKK3sKKyAgICBUZXN0TGlzdCB0ZXN0TGlzdCwgdGVzdExpc3QyOworICAgIHNpemVfdCBsaXN0U2l6ZSA9IHJhbmRvbV9udW1iZXIocmFuZG9tX2Jhc2UpOworCisgICAgd2hpbGUgKCB0ZXN0TGlzdC5zaXplKCkgPCBsaXN0U2l6ZSApCisgICAgeworICAgICAgICBUZXN0Q2xhc3MgeDsKKyAgICAgICAgdGVzdExpc3QucHVzaF9iYWNrKCB4ICk7CisgICAgICAgIHRlc3RMaXN0Mi5wdXNoX2JhY2soIFRlc3RDbGFzcygpICk7CisgICAgfQorCisgICAgU3Ryb25nQ2hlY2soIHRlc3RMaXN0LCB0ZXN0X2luc2VydF9vbmU8VGVzdExpc3Q+KHRlc3RMaXN0KSApOworICAgIFN0cm9uZ0NoZWNrKCB0ZXN0TGlzdCwgdGVzdF9pbnNlcnRfb25lPFRlc3RMaXN0Pih0ZXN0TGlzdCwgMCkgKTsKKyAgICBTdHJvbmdDaGVjayggdGVzdExpc3QsIHRlc3RfaW5zZXJ0X29uZTxUZXN0TGlzdD4odGVzdExpc3QsIChpbnQpdGVzdExpc3Quc2l6ZSgpKSApOworCisgICAgV2Vha0NoZWNrKCB0ZXN0TGlzdCwgdGVzdF9pbnNlcnRfbjxUZXN0TGlzdD4odGVzdExpc3QsIHJhbmRvbV9udW1iZXIocmFuZG9tX2Jhc2UpICkgKTsKKyAgICBXZWFrQ2hlY2soIHRlc3RMaXN0LCB0ZXN0X2luc2VydF9uPFRlc3RMaXN0Pih0ZXN0TGlzdCwgcmFuZG9tX251bWJlcihyYW5kb21fYmFzZSksIDAgKSApOworICAgIFdlYWtDaGVjayggdGVzdExpc3QsIHRlc3RfaW5zZXJ0X248VGVzdExpc3Q+KHRlc3RMaXN0LCByYW5kb21fbnVtYmVyKHJhbmRvbV9iYXNlKSwgKGludCl0ZXN0TGlzdC5zaXplKCkgKSApOworCisgICAgc2l6ZV90IGluc0NudCA9IHJhbmRvbV9udW1iZXIocmFuZG9tX2Jhc2UpOworICAgIFRlc3RDbGFzcyAqaW5zRmlyc3QgPSBuZXcgVGVzdExpc3Q6OnZhbHVlX3R5cGVbMStpbnNDbnRdOworCisgICAgV2Vha0NoZWNrKCB0ZXN0TGlzdCwgaW5zZXJ0X3JhbmdlX3Rlc3Rlcih0ZXN0TGlzdCwgaW5zRmlyc3QsIGluc0ZpcnN0K2luc0NudCkgKTsKKyAgICBXZWFrQ2hlY2soIHRlc3RMaXN0LCBpbnNlcnRfcmFuZ2VfYXRfYmVnaW5fdGVzdGVyKHRlc3RMaXN0LCBpbnNGaXJzdCwgaW5zRmlyc3QraW5zQ250KSApOworICAgIFdlYWtDaGVjayggdGVzdExpc3QsIGluc2VydF9yYW5nZV9hdF9lbmRfdGVzdGVyKHRlc3RMaXN0LCBpbnNGaXJzdCwgaW5zRmlyc3QraW5zQ250KSApOworCisgICAgQ29uc3RDaGVjayggMCwgdGVzdF9jb25zdHJ1Y3RfcG9pbnRlcl9yYW5nZTxUZXN0TGlzdD4oaW5zRmlyc3QsIGluc0ZpcnN0K2luc0NudCkgKTsKKyAgICBkZWxldGVbXSBpbnNGaXJzdDsKKworICAgIFdlYWtDaGVjayggdGVzdExpc3QsIGluc2VydF9yYW5nZV90ZXN0ZXIodGVzdExpc3QsIHRlc3RMaXN0Mi5iZWdpbigpLCB0ZXN0TGlzdDIuZW5kKCkgKSApOworCisgICAgU3Ryb25nQ2hlY2soIHRlc3RMaXN0LCB0ZXN0X3B1c2hfZnJvbnQ8VGVzdExpc3Q+KHRlc3RMaXN0KSApOworICAgIFN0cm9uZ0NoZWNrKCB0ZXN0TGlzdCwgdGVzdF9wdXNoX2JhY2s8VGVzdExpc3Q+KHRlc3RMaXN0KSApOworCisgICAgU3Ryb25nQ2hlY2soIHRlc3RMaXN0LCB0ZXN0X2xpc3Rfc29ydCgpICk7ICAvLyBTaW1wbHkgdG8gdmVyaWZ5IHN0cmVuZ3RoLgorCisgICAgQ29uc3RDaGVjayggMCwgdGVzdF9kZWZhdWx0X2NvbnN0cnVjdDxUZXN0TGlzdD4oKSApOworICAgIENvbnN0Q2hlY2soIDAsIHRlc3RfY29uc3RydWN0X248VGVzdExpc3Q+KCByYW5kb21fbnVtYmVyKHJhbmRvbV9iYXNlKSApICk7CisgICAgQ29uc3RDaGVjayggMCwgdGVzdF9jb25zdHJ1Y3Rfbl9pbnN0YW5jZTxUZXN0TGlzdD4oIHJhbmRvbV9udW1iZXIocmFuZG9tX2Jhc2UpICkgKTsKKyAgICBDb25zdENoZWNrKCAwLCB0ZXN0X2NvbnN0cnVjdF9pdGVyX3JhbmdlPFRlc3RMaXN0PiggdGVzdExpc3QyICkgKTsKKyAgICBDb25zdENoZWNrKCB0ZXN0TGlzdCwgdGVzdF9jb3B5X2NvbnN0cnVjdDxUZXN0TGlzdD4oKSApOworCisgICAgV2Vha0NoZWNrKCB0ZXN0TGlzdCwgdGVzdF9hc3NpZ25fb3A8VGVzdExpc3Q+KCB0ZXN0TGlzdDIgKSApOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9laC90ZXN0X21hcC5jcHAgYi90ZXN0L2VoL3Rlc3RfbWFwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Njc4YjE3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9laC90ZXN0X21hcC5jcHAKQEAgLTAsMCArMSwxMjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICB0ZXN0X21hcC5jcHAKKworICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBNYXJrIG9mIHRoZSBVbmljb3JuLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBNYXJrIG9mIHRoZSBVbmljb3JuIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgIlRlc3RzLmgiCisjaW5jbHVkZSAiVGVzdENsYXNzLmgiCisjaW5jbHVkZSAiTGVha0NoZWNrLmgiCisjIGlmIGRlZmluZWQgKEVIX05FV19IRUFERVJTKQorI2luY2x1ZGUgPG1hcD4KKyMgZWxzZQorI2luY2x1ZGUgPG11bHRpbWFwLmg+CisjaW5jbHVkZSA8bWFwLmg+CisjIGVuZGlmCisKKyNpbmNsdWRlICJ0ZXN0X2NvbnN0cnVjdC5oIgorI2luY2x1ZGUgInRlc3RfYXNzaWduX29wLmgiCisjaW5jbHVkZSAidGVzdF9wdXNoX2JhY2suaCIKKyNpbmNsdWRlICJ0ZXN0X2luc2VydC5oIgorI2luY2x1ZGUgInRlc3RfcHVzaF9mcm9udC5oIgorI2luY2x1ZGUgIlRocm93Q29tcGFyZS5oIgorI2luY2x1ZGUgInRlc3RfaW5zZXJ0LmgiCisKK3RlbXBsYXRlIDxjbGFzcyBLLCBjbGFzcyBWLCBjbGFzcyBDb21wLCBjbGFzcyBBPgoraW5saW5lIG11bHRpbWFwX3RhZworY29udGFpbmVyX2NhdGVnb3J5KGNvbnN0IEVIX1NURDo6X19tdWx0aW1hcF9fPEssVixDb21wLCBBPiYpCit7CisgICAgcmV0dXJuIG11bHRpbWFwX3RhZygpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgSywgY2xhc3MgViwgY2xhc3MgQ29tcCwgY2xhc3MgQSA+CitpbmxpbmUgbWFwX3RhZworY29udGFpbmVyX2NhdGVnb3J5KGNvbnN0IEVIX1NURDo6X19tYXBfXzxLLFYsQ29tcCwgQT4mKQoreworICAgIHJldHVybiBtYXBfdGFnKCk7Cit9CisKK3R5cGVkZWYgRUhfU1REOjpfX211bHRpbWFwX188VGVzdENsYXNzLCBUZXN0Q2xhc3MsIFRocm93Q29tcGFyZSwgZWhfYWxsb2NhdG9yKFRlc3RDbGFzcykgPiBUZXN0TXVsdGlNYXA7CisKK3ZvaWQgdGVzdF9tdWx0aW1hcCgpCit7CisgICAgVGVzdE11bHRpTWFwIHRlc3RNdWx0aU1hcCwgdGVzdE11bHRpTWFwMjsKKworICAgIGNvbnN0IHNpemVfdCBtYXBTaXplID0gcmFuZG9tX251bWJlcihyYW5kb21fYmFzZSk7CisKKyAgICB3aGlsZSAoIHRlc3RNdWx0aU1hcC5zaXplKCkgPCBtYXBTaXplICkKKyAgICB7CisgICAgICAgIFRlc3RNdWx0aU1hcDo6dmFsdWVfdHlwZSB4OworICAgICAgICB0ZXN0TXVsdGlNYXAuaW5zZXJ0KCB4ICk7CisgICAgICAgIHRlc3RNdWx0aU1hcDIuaW5zZXJ0KCBUZXN0TXVsdGlNYXA6OnZhbHVlX3R5cGUoKSApOworICAgIH0KKworICAgIFN0cm9uZ0NoZWNrKCB0ZXN0TXVsdGlNYXAsIHRlc3RfaW5zZXJ0X3ZhbHVlPFRlc3RNdWx0aU1hcD4odGVzdE11bHRpTWFwKSApOworCisgICAgc2l6ZV90IGluc0NudCA9IDEgKyByYW5kb21fbnVtYmVyKHJhbmRvbV9iYXNlKTsKKyAgICBUZXN0TXVsdGlNYXA6OnZhbHVlX3R5cGUgKmluc0ZpcnN0ID0gbmV3IFRlc3RNdWx0aU1hcDo6dmFsdWVfdHlwZVtpbnNDbnRdOworCisgICAgV2Vha0NoZWNrKCB0ZXN0TXVsdGlNYXAsIGluc2VydF9yYW5nZV90ZXN0ZXIodGVzdE11bHRpTWFwLCBpbnNGaXJzdCwgaW5zRmlyc3QraW5zQ250KSApOworCisgICAgQ29uc3RDaGVjayggMCwgdGVzdF9jb25zdHJ1Y3RfcG9pbnRlcl9yYW5nZTxUZXN0TXVsdGlNYXA+KGluc0ZpcnN0LCBpbnNGaXJzdCtpbnNDbnQpICk7CisgICAgZGVsZXRlW10gaW5zRmlyc3Q7CisKKworICAgIFdlYWtDaGVjayggdGVzdE11bHRpTWFwLCBpbnNlcnRfcmFuZ2VfdGVzdGVyKHRlc3RNdWx0aU1hcCwgdGVzdE11bHRpTWFwMi5iZWdpbigpLCB0ZXN0TXVsdGlNYXAyLmVuZCgpICkgKTsKKworCisgICAgQ29uc3RDaGVjayggMCwgdGVzdF9kZWZhdWx0X2NvbnN0cnVjdDxUZXN0TXVsdGlNYXA+KCkgKTsKKworICAgIENvbnN0Q2hlY2soIDAsIHRlc3RfY29uc3RydWN0X2l0ZXJfcmFuZ2U8VGVzdE11bHRpTWFwPiggdGVzdE11bHRpTWFwMiApICk7CisKKyAgICBDb25zdENoZWNrKCB0ZXN0TXVsdGlNYXAsIHRlc3RfY29weV9jb25zdHJ1Y3Q8VGVzdE11bHRpTWFwPigpICk7CisKKyAgICBXZWFrQ2hlY2soIHRlc3RNdWx0aU1hcCwgdGVzdF9hc3NpZ25fb3A8VGVzdE11bHRpTWFwPiggdGVzdE11bHRpTWFwMiApICk7Cit9CisKK3R5cGVkZWYgRUhfU1REOjpfX21hcF9fPFRlc3RDbGFzcywgVGVzdENsYXNzLCBUaHJvd0NvbXBhcmUsIGVoX2FsbG9jYXRvcihUZXN0Q2xhc3MpID4gVGVzdE1hcDsKKwordm9pZCBDaGVja0ludmFyaWFudCggY29uc3QgVGVzdE1hcCYgbSApOworCit2b2lkIENoZWNrSW52YXJpYW50KCBjb25zdCBUZXN0TWFwJiBtICkKK3sKKy8vICBhc3NlcnQoIG1hcC5fX3JiX3ZlcmlmeSgpICk7CisgICAgc2l6ZV90IHRvdGFsID0gMDsKKyAgICBFSF9ESVNUQU5DRSggbS5iZWdpbigpLCBtLmVuZCgpLCB0b3RhbCApOworICAgIGFzc2VydCggbS5zaXplKCkgPT0gdG90YWwgKTsKK30KKwordm9pZCB0ZXN0X21hcCgpCit7CisgICAgVGVzdE1hcCB0ZXN0TWFwLCB0ZXN0TWFwMjsKKworICAgIGNvbnN0IHNpemVfdCBtYXBTaXplID0gcmFuZG9tX251bWJlcihyYW5kb21fYmFzZSk7CisKKyAgICB3aGlsZSAoIHRlc3RNYXAuc2l6ZSgpIDwgbWFwU2l6ZSApCisgICAgeworICAgICAgICBUZXN0TWFwOjp2YWx1ZV90eXBlIHg7CisgICAgICAgIHRlc3RNYXAuaW5zZXJ0KCB4ICk7CisgICAgICAgIHRlc3RNYXAyLmluc2VydCggVGVzdE1hcDo6dmFsdWVfdHlwZSgpICk7CisgICAgfQorCisgICAgU3Ryb25nQ2hlY2soIHRlc3RNYXAsIHRlc3RfaW5zZXJ0X3ZhbHVlPFRlc3RNYXA+KHRlc3RNYXApICk7CisKKyAgICBzaXplX3QgaW5zQ250ID0gcmFuZG9tX251bWJlcihyYW5kb21fYmFzZSk7CisgICAgVGVzdE1hcDo6dmFsdWVfdHlwZSAqaW5zRmlyc3QgPSBuZXcgVGVzdE1hcDo6dmFsdWVfdHlwZVsxK2luc0NudF07CisKKyAgICBXZWFrQ2hlY2soIHRlc3RNYXAsIGluc2VydF9yYW5nZV90ZXN0ZXIodGVzdE1hcCwgaW5zRmlyc3QsIGluc0ZpcnN0K2luc0NudCkgKTsKKworICAgIENvbnN0Q2hlY2soIDAsIHRlc3RfY29uc3RydWN0X3BvaW50ZXJfcmFuZ2U8VGVzdE1hcD4oaW5zRmlyc3QsIGluc0ZpcnN0K2luc0NudCkgKTsKKyAgICBkZWxldGVbXSBpbnNGaXJzdDsKKworICAgIFdlYWtDaGVjayggdGVzdE1hcCwgaW5zZXJ0X3JhbmdlX3Rlc3Rlcih0ZXN0TWFwLCB0ZXN0TWFwMi5iZWdpbigpLCB0ZXN0TWFwMi5lbmQoKSApICk7CisgICAgQ29uc3RDaGVjayggMCwgdGVzdF9kZWZhdWx0X2NvbnN0cnVjdDxUZXN0TWFwPigpICk7CisgICAgQ29uc3RDaGVjayggMCwgdGVzdF9jb25zdHJ1Y3RfaXRlcl9yYW5nZTxUZXN0TWFwPiggdGVzdE1hcDIgKSApOworICAgIENvbnN0Q2hlY2soIHRlc3RNYXAsIHRlc3RfY29weV9jb25zdHJ1Y3Q8VGVzdE1hcD4oKSApOworICAgIFdlYWtDaGVjayggdGVzdE1hcCwgdGVzdF9hc3NpZ25fb3A8VGVzdE1hcD4oIHRlc3RNYXAyICkgKTsKK30KKwpkaWZmIC0tZ2l0IGEvdGVzdC9laC90ZXN0X3B1c2hfYmFjay5oIGIvdGVzdC9laC90ZXN0X3B1c2hfYmFjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ZTNiNmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2VoL3Rlc3RfcHVzaF9iYWNrLmgKQEAgLTAsMCArMSw1MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIHRlc3RfcHVzaF9iYWNrLmgKKworICAgIEludGVyZmFjZSBmb3IgdGhlIHRlc3RfcHVzaF9iYWNrIGNsYXNzCisKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogTWFyayBvZiB0aGUgVW5pY29ybiwgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgTWFyayBvZiB0aGUgVW5pY29ybiBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgdGVzdF9wdXNoX2JhY2tfSF8KKyNkZWZpbmUgdGVzdF9wdXNoX2JhY2tfSF8KKyMgaWZkZWYgRUhfTkVXX0hFQURFUlMKKyMgIGluY2x1ZGUgPGNhc3NlcnQ+CisjIGVsc2UKKyMgIGluY2x1ZGUgPGFzc2VydC5oPgorIyBlbmRpZgorCisjIGluY2x1ZGUgIlByZWZpeC5oIgorI2luY2x1ZGUgIm5jX2FsbG9jLmgiCisKK3RlbXBsYXRlIDxjbGFzcyBDPgorc3RydWN0IHRlc3RfcHVzaF9iYWNrCit7CisgIHRlc3RfcHVzaF9iYWNrKCBjb25zdCBDJiBvcmlnICkgOiBvcmlnaW5hbCggb3JpZyApCisgIHsKKyAgICAgICAgZ1Rlc3RDb250cm9sbGVyLlNldEN1cnJlbnRUZXN0TmFtZSgicHVzaF9iYWNrKCkgbWV0aG9kIik7CisgICAgfQorCisgIHZvaWQgb3BlcmF0b3IoKSggQyYgYyApIGNvbnN0CisgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgQzo6dmFsdWVfdHlwZSBfdmFsdWVfdHlwZTsKKyAgICBjLnB1c2hfYmFjayhfdmFsdWVfdHlwZSgpICk7CisgICAgLy8gUHJldmVudCBzaW11bGF0ZWQgZmFpbHVyZXMgZHVyaW5nIHZlcmlmaWNhdGlvbgorICAgICAgICBnVGVzdENvbnRyb2xsZXIuQ2FuY2VsRmFpbHVyZUNvdW50ZG93bigpOworICAgIEVIX0FTU0VSVCggYy5zaXplKCkgPT0gb3JpZ2luYWwuc2l6ZSgpICsgMSApOworICAgIEVIX0FTU0VSVCggRUhfU1REOjplcXVhbCggb3JpZ2luYWwuYmVnaW4oKSwgb3JpZ2luYWwuZW5kKCksIGMuYmVnaW4oKSApICk7CisgIH0KK3ByaXZhdGU6CisgIGNvbnN0IEMmIG9yaWdpbmFsOworfTsKKworI2VuZGlmIC8vIHRlc3RfcHVzaF9iYWNrX0hfCmRpZmYgLS1naXQgYS90ZXN0L2VoL3Rlc3RfcHVzaF9mcm9udC5oIGIvdGVzdC9laC90ZXN0X3B1c2hfZnJvbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWZmOTExCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9laC90ZXN0X3B1c2hfZnJvbnQuaApAQCAtMCwwICsxLDQ2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgdGVzdF9wdXNoX2Zyb250LmgKKworICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBNYXJrIG9mIHRoZSBVbmljb3JuLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBNYXJrIG9mIHRoZSBVbmljb3JuIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiB0ZXN0X3B1c2hfZnJvbnRfSF8KKyNkZWZpbmUgdGVzdF9wdXNoX2Zyb250X0hfCisKKyMgaWYgZGVmaW5lZCAoRUhfTkVXX0hFQURFUlMpCisjICBpbmNsdWRlIDxjYXNzZXJ0PgorIyBlbHNlCisjICBpbmNsdWRlIDxhc3NlcnQuaD4KKyMgZW5kaWYKKyMgaW5jbHVkZSAiUHJlZml4LmgiCisKK3RlbXBsYXRlIDxjbGFzcyBDPgorc3RydWN0IHRlc3RfcHVzaF9mcm9udAoreworICB0ZXN0X3B1c2hfZnJvbnQoIGNvbnN0IEMmIG9yaWcgKSA6IG9yaWdpbmFsKCBvcmlnICkgeworICAgICAgICAgICAgZ1Rlc3RDb250cm9sbGVyLlNldEN1cnJlbnRUZXN0TmFtZSgicHVzaF9mcm9udCgpIG1ldGhvZCIpOworICAgICAgICB9CisKKyAgdm9pZCBvcGVyYXRvcigpKCBDJiBjICkgY29uc3QKKyAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBDOjp2YWx1ZV90eXBlIF92YWx1ZV90eXBlOworICAgIGMucHVzaF9mcm9udCggX3ZhbHVlX3R5cGUoKSApOworICAgIEVIX0FTU0VSVCggYy5zaXplKCkgPT0gb3JpZ2luYWwuc2l6ZSgpICsgMSApOworICAgIHR5cGVuYW1lIEM6OmNvbnN0X2l0ZXJhdG9yIG5leHQgPSBjLmJlZ2luKCk7CisKKyAgICBFSF9BU1NFUlQoIEVIX1NURDo6ZXF1YWwoIG9yaWdpbmFsLmJlZ2luKCksIG9yaWdpbmFsLmVuZCgpLCArK25leHQgKSApOworICB9Citwcml2YXRlOgorICBjb25zdCBDJiBvcmlnaW5hbDsKK307CisKKyNlbmRpZiAvLyB0ZXN0X3B1c2hfZnJvbnRfSF8KZGlmZiAtLWdpdCBhL3Rlc3QvZWgvdGVzdF9yb3BlLmNwcCBiL3Rlc3QvZWgvdGVzdF9yb3BlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2Y4OWNiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9laC90ZXN0X3JvcGUuY3BwCkBAIC0wLDAgKzEsOTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICB0ZXN0X3JvcGUuY3BwCisKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogTWFyayBvZiB0aGUgVW5pY29ybiwgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgTWFyayBvZiB0aGUgVW5pY29ybiBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworIyBpZmRlZiBfX1NVTlBST19DQworIyAgZGVmaW5lIF9TVExQX05PX01FTUJFUl9URU1QTEFURV9DTEFTU0VTIDEKKyMgZW5kaWYKKworI2luY2x1ZGUgIlByZWZpeC5oIgorI2luY2x1ZGUgIlRlc3RzLmgiCisjaW5jbHVkZSAiVGVzdENsYXNzLmgiCisjaW5jbHVkZSAiTGVha0NoZWNrLmgiCisjaW5jbHVkZSAidGVzdF9jb25zdHJ1Y3QuaCIKKyNpbmNsdWRlICJ0ZXN0X2Fzc2lnbl9vcC5oIgorI2luY2x1ZGUgInRlc3RfcHVzaF9iYWNrLmgiCisjaW5jbHVkZSAidGVzdF9pbnNlcnQuaCIKKyNpbmNsdWRlICJ0ZXN0X3B1c2hfZnJvbnQuaCIKKworI2lmIGRlZmluZWQoIEVIX1JPUEVfSU1QTEVNRU5URUQgKQorI2lmICEoIGRlZmluZWQoX19NV0VSS1NfXykgJiYgX19NV0VSS1NfXyA8IDB4MTkwMCApICAgIC8vIENXMS44IGNhbid0IGNvbXBpbGUgdGhpcyEKKyMgZGVmaW5lIF9fU1REX1NUVUZGIDEKKyMgaWYgZGVmaW5lZCAoRUhfTkVXX0hFQURFUlMpCisjaW5jbHVkZSA8cm9wZT4KKyNlbHNlCisjaW5jbHVkZSA8cm9wZS5oPgorI2VuZGlmCisKKwordHlwZWRlZiBTVExQT1JUOjpyb3BlPGNoYXIsIGVoX2FsbG9jYXRvcihjaGFyKSA+IFRlc3RSb3BlOworCitpbmxpbmUgc2VxdWVuY2VfY29udGFpbmVyX3RhZworY29udGFpbmVyX2NhdGVnb3J5KGNvbnN0IFRlc3RSb3BlJikKK3sKKyAgcmV0dXJuIHNlcXVlbmNlX2NvbnRhaW5lcl90YWcoKTsKK30KKwordm9pZCB0ZXN0X3JvcGUoKQoreworICAgIFRlc3RSb3BlIHRlc3RSb3BlLCB0ZXN0Um9wZTI7CisgICAgc2l6ZV90IHJvcGVTaXplID0gcmFuZG9tX251bWJlcihyYW5kb21fYmFzZSk7CisKKyAgICB3aGlsZSAoIHRlc3RSb3BlLnNpemUoKSA8IHJvcGVTaXplICkKKyAgICB7CisgICAgICAgIFRlc3RSb3BlOjp2YWx1ZV90eXBlIHggPSBUZXN0Um9wZTo6dmFsdWVfdHlwZShyYW5kb21fbnVtYmVyKHJhbmRvbV9iYXNlKSk7ICAvLyBpbml0aWFsaXplIGJlZm9yZSB1c2UKKyAgICAgICAgdGVzdFJvcGUucHVzaF9iYWNrKCB4ICk7CisgICAgICAgIHRlc3RSb3BlMi5wdXNoX2JhY2soIFRlc3RSb3BlOjp2YWx1ZV90eXBlKCkgKTsKKyAgICB9CisgICAgV2Vha0NoZWNrKCB0ZXN0Um9wZSwgdGVzdF9pbnNlcnRfb25lPFRlc3RSb3BlPih0ZXN0Um9wZSkgKTsKKyAgICBXZWFrQ2hlY2soIHRlc3RSb3BlLCB0ZXN0X2luc2VydF9vbmU8VGVzdFJvcGU+KHRlc3RSb3BlLCAwKSApOworICAgIFdlYWtDaGVjayggdGVzdFJvcGUsIHRlc3RfaW5zZXJ0X29uZTxUZXN0Um9wZT4odGVzdFJvcGUsIChpbnQpdGVzdFJvcGUuc2l6ZSgpKSApOworCisgICAgV2Vha0NoZWNrKCB0ZXN0Um9wZSwgdGVzdF9pbnNlcnRfbjxUZXN0Um9wZT4odGVzdFJvcGUsIHJhbmRvbV9udW1iZXIocmFuZG9tX2Jhc2UpICkgKTsKKyAgICBXZWFrQ2hlY2soIHRlc3RSb3BlLCB0ZXN0X2luc2VydF9uPFRlc3RSb3BlPih0ZXN0Um9wZSwgcmFuZG9tX251bWJlcihyYW5kb21fYmFzZSksIDAgKSApOworICAgIFdlYWtDaGVjayggdGVzdFJvcGUsIHRlc3RfaW5zZXJ0X248VGVzdFJvcGU+KHRlc3RSb3BlLCByYW5kb21fbnVtYmVyKHJhbmRvbV9iYXNlKSwgKGludCl0ZXN0Um9wZS5zaXplKCkgKSApOworCisgICAgc2l6ZV90IGluc0NudCA9IHJhbmRvbV9udW1iZXIocmFuZG9tX2Jhc2UpOworICAgIFRlc3RSb3BlOjp2YWx1ZV90eXBlICppbnNGaXJzdCA9IG5ldyBUZXN0Um9wZTo6dmFsdWVfdHlwZVsxK2luc0NudF07CisKKyAgICBXZWFrQ2hlY2soIHRlc3RSb3BlLCBpbnNlcnRfcmFuZ2VfdGVzdGVyKHRlc3RSb3BlLCBpbnNGaXJzdCwgaW5zRmlyc3QraW5zQ250KSApOworICAgIFdlYWtDaGVjayggdGVzdFJvcGUsIGluc2VydF9yYW5nZV9hdF9iZWdpbl90ZXN0ZXIodGVzdFJvcGUsIGluc0ZpcnN0LCBpbnNGaXJzdCtpbnNDbnQpICk7CisgICAgV2Vha0NoZWNrKCB0ZXN0Um9wZSwgaW5zZXJ0X3JhbmdlX2F0X2VuZF90ZXN0ZXIodGVzdFJvcGUsIGluc0ZpcnN0LCBpbnNGaXJzdCtpbnNDbnQpICk7CisKKyAgICBDb25zdENoZWNrKCAwLCB0ZXN0X2NvbnN0cnVjdF9wb2ludGVyX3JhbmdlPFRlc3RSb3BlPihpbnNGaXJzdCwgaW5zRmlyc3QraW5zQ250KSApOworICAgIGRlbGV0ZVtdIGluc0ZpcnN0OworCisgICAgV2Vha0NoZWNrKCB0ZXN0Um9wZSwgaW5zZXJ0X3JhbmdlX3Rlc3Rlcih0ZXN0Um9wZSwgdGVzdFJvcGUyLmJlZ2luKCksIHRlc3RSb3BlMi5lbmQoKSApICk7CisKKyAgICBXZWFrQ2hlY2soIHRlc3RSb3BlLCB0ZXN0X3B1c2hfZnJvbnQ8VGVzdFJvcGU+KHRlc3RSb3BlKSApOworICAgIFdlYWtDaGVjayggdGVzdFJvcGUsIHRlc3RfcHVzaF9iYWNrPFRlc3RSb3BlPih0ZXN0Um9wZSkgKTsKKworICAgIENvbnN0Q2hlY2soIDAsIHRlc3RfZGVmYXVsdF9jb25zdHJ1Y3Q8VGVzdFJvcGU+KCkgKTsKKworLy8gZHdhIDEvMjUvMDAgLSBub3QgYWN0dWFsbHkgdmFsaWQgZm9yIHJvcGUsIGJlY2F1c2UgaXQgZG9lc24ndAorLy8gaGF2ZSB0aGUgY29uc3RydWN0b3IgaW4gcXVlc3Rpb24hIFRoZSBjb2RlIHdpbGwgY29tcGlsZSwgYnV0IHdpdGggdGhlCisvLyB3cm9uZyByZXN1bHQgKHRoZSBjb25zdHJ1Y3RvciB0aGF0IGdldHMgdXNlZCBkb2VzIHNvbWV0aGluZyBkaWZmZXJlbnQpLgorCisvLyAgQ29uc3RDaGVjayggMCwgdGVzdF9jb25zdHJ1Y3RfbjxUZXN0Um9wZT4oIHJhbmRvbV9udW1iZXIocmFuZG9tX2Jhc2UpICkgKTsKKworICAgIENvbnN0Q2hlY2soIDAsIHRlc3RfY29uc3RydWN0X25faW5zdGFuY2U8VGVzdFJvcGU+KCByYW5kb21fbnVtYmVyKHJhbmRvbV9iYXNlKSApICk7CisgICAgQ29uc3RDaGVjayggMCwgdGVzdF9jb25zdHJ1Y3RfaXRlcl9yYW5nZTxUZXN0Um9wZT4oIHRlc3RSb3BlMiApICk7CisgICAgQ29uc3RDaGVjayggdGVzdFJvcGUsIHRlc3RfY29weV9jb25zdHJ1Y3Q8VGVzdFJvcGU+KCkgKTsKKworICAgIFdlYWtDaGVjayggdGVzdFJvcGUsIHRlc3RfYXNzaWduX29wPFRlc3RSb3BlPiggdGVzdFJvcGUyICkgKTsKK30KKyNlbmRpZiAvLyBfX01XRVJLU19fCisKKyNlbmRpZiAvLyBFSF9ST1BFX0lNUExFTUVOVEVECmRpZmYgLS1naXQgYS90ZXN0L2VoL3Rlc3Rfc2V0LmNwcCBiL3Rlc3QvZWgvdGVzdF9zZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMmJkMDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2VoL3Rlc3Rfc2V0LmNwcApAQCAtMCwwICsxLDEwMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIHRlc3Rfc2V0LmNwcAorCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1hcmsgb2YgdGhlIFVuaWNvcm4sIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIE1hcmsgb2YgdGhlIFVuaWNvcm4gbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiVGVzdHMuaCIKKyNpbmNsdWRlICJUZXN0Q2xhc3MuaCIKKyNpbmNsdWRlICJMZWFrQ2hlY2suaCIKKyNpZiBkZWZpbmVkIChFSF9ORVdfSEVBREVSUykKKyMgIGluY2x1ZGUgPHNldD4KKyNlbHNlCisjICBpbmNsdWRlIDxtdWx0aXNldC5oPgorIyAgaW5jbHVkZSA8c2V0Lmg+CisjZW5kaWYKKyNpbmNsdWRlICJ0ZXN0X2NvbnN0cnVjdC5oIgorI2luY2x1ZGUgInRlc3RfYXNzaWduX29wLmgiCisjaW5jbHVkZSAidGVzdF9wdXNoX2JhY2suaCIKKyNpbmNsdWRlICJ0ZXN0X2luc2VydC5oIgorI2luY2x1ZGUgInRlc3RfcHVzaF9mcm9udC5oIgorI2luY2x1ZGUgIlRocm93Q29tcGFyZS5oIgorCit2b2lkIHRlc3RfbXVsdGlzZXQoKTsKKwordHlwZWRlZiBFSF9TVEQ6Ol9fbXVsdGlzZXRfXzxUZXN0Q2xhc3MsIFRocm93Q29tcGFyZSwgZWhfYWxsb2NhdG9yKFRlc3RDbGFzcykgPiBUZXN0TXVsdGlTZXQ7CisKK2lubGluZSBtdWx0aXNldF90YWcKK2NvbnRhaW5lcl9jYXRlZ29yeShjb25zdCBUZXN0TXVsdGlTZXQmKSB7CisgIHJldHVybiBtdWx0aXNldF90YWcoKTsKK30KKwordm9pZCB0ZXN0X211bHRpc2V0KCkgeworICBUZXN0TXVsdGlTZXQgdGVzdE11bHRpU2V0LCB0ZXN0TXVsdGlTZXQyOworCisgIGNvbnN0IHNpemVfdCBzZXRTaXplID0gcmFuZG9tX251bWJlcihyYW5kb21fYmFzZSk7CisKKyAgd2hpbGUgKHRlc3RNdWx0aVNldC5zaXplKCkgPCBzZXRTaXplKSB7CisgICAgVGVzdE11bHRpU2V0Ojp2YWx1ZV90eXBlIHg7CisgICAgdGVzdE11bHRpU2V0Lmluc2VydCggeCApOworICAgIHRlc3RNdWx0aVNldDIuaW5zZXJ0KCBUZXN0TXVsdGlTZXQ6OnZhbHVlX3R5cGUoKSApOworICB9CisKKyAgU3Ryb25nQ2hlY2soIHRlc3RNdWx0aVNldCwgdGVzdF9pbnNlcnRfdmFsdWU8VGVzdE11bHRpU2V0Pih0ZXN0TXVsdGlTZXQpICk7CisKKyAgc2l6ZV90IGluc0NudCA9IHJhbmRvbV9udW1iZXIocmFuZG9tX2Jhc2UpOworICBUZXN0TXVsdGlTZXQ6OnZhbHVlX3R5cGUgKmluc0ZpcnN0ID0gbmV3IFRlc3RNdWx0aVNldDo6dmFsdWVfdHlwZVsxK2luc0NudF07CisgIFdlYWtDaGVjayggdGVzdE11bHRpU2V0LCBpbnNlcnRfcmFuZ2VfdGVzdGVyKHRlc3RNdWx0aVNldCwgaW5zRmlyc3QsIGluc0ZpcnN0K2luc0NudCkgKTsKKyAgQ29uc3RDaGVjayggMCwgdGVzdF9jb25zdHJ1Y3RfcG9pbnRlcl9yYW5nZTxUZXN0TXVsdGlTZXQ+KGluc0ZpcnN0LCBpbnNGaXJzdCtpbnNDbnQpICk7CisgIGRlbGV0ZVtdIGluc0ZpcnN0OworICBXZWFrQ2hlY2soIHRlc3RNdWx0aVNldCwgaW5zZXJ0X3JhbmdlX3Rlc3Rlcih0ZXN0TXVsdGlTZXQsIHRlc3RNdWx0aVNldDIuYmVnaW4oKSwgdGVzdE11bHRpU2V0Mi5lbmQoKSApICk7CisKKyAgQ29uc3RDaGVjayggMCwgdGVzdF9kZWZhdWx0X2NvbnN0cnVjdDxUZXN0TXVsdGlTZXQ+KCkgKTsKKyAgQ29uc3RDaGVjayggMCwgdGVzdF9jb25zdHJ1Y3RfaXRlcl9yYW5nZTxUZXN0TXVsdGlTZXQ+KCB0ZXN0TXVsdGlTZXQyICkgKTsKKyAgQ29uc3RDaGVjayggdGVzdE11bHRpU2V0LCB0ZXN0X2NvcHlfY29uc3RydWN0PFRlc3RNdWx0aVNldD4oKSApOworCisgIFdlYWtDaGVjayggdGVzdE11bHRpU2V0LCB0ZXN0X2Fzc2lnbl9vcDxUZXN0TXVsdGlTZXQ+KCB0ZXN0TXVsdGlTZXQyICkgKTsKK30KKwordHlwZWRlZiBFSF9TVEQ6Ol9fc2V0X188VGVzdENsYXNzLCBUaHJvd0NvbXBhcmUsIGVoX2FsbG9jYXRvcihUZXN0Q2xhc3MpID4gVGVzdFNldDsKKworaW5saW5lIHNldF90YWcKK2NvbnRhaW5lcl9jYXRlZ29yeShjb25zdCBUZXN0U2V0JikgeworICByZXR1cm4gc2V0X3RhZygpOworfQorCit2b2lkIHRlc3Rfc2V0KCkgeworICBUZXN0U2V0IHRlc3RTZXQsIHRlc3RTZXQyOworCisgIGNvbnN0IHNpemVfdCBzZXRTaXplID0gcmFuZG9tX251bWJlcihyYW5kb21fYmFzZSk7CisKKyAgd2hpbGUgKCB0ZXN0U2V0LnNpemUoKSA8IHNldFNpemUgKSB7CisgICAgVGVzdFNldDo6dmFsdWVfdHlwZSB4OworICAgIHRlc3RTZXQuaW5zZXJ0KCB4ICk7CisgICAgdGVzdFNldDIuaW5zZXJ0KCBUZXN0U2V0Ojp2YWx1ZV90eXBlKCkgKTsKKyAgfQorICBTdHJvbmdDaGVjayggdGVzdFNldCwgdGVzdF9pbnNlcnRfdmFsdWU8VGVzdFNldD4odGVzdFNldCkgKTsKKworICBzaXplX3QgaW5zQ250ID0gcmFuZG9tX251bWJlcihyYW5kb21fYmFzZSk7CisgIFRlc3RTZXQ6OnZhbHVlX3R5cGUgKmluc0ZpcnN0ID0gbmV3IFRlc3RTZXQ6OnZhbHVlX3R5cGVbMStpbnNDbnRdOworCisgIFdlYWtDaGVjayggdGVzdFNldCwgaW5zZXJ0X3JhbmdlX3Rlc3Rlcih0ZXN0U2V0LCBpbnNGaXJzdCwgaW5zRmlyc3QraW5zQ250KSApOworCisgIENvbnN0Q2hlY2soIDAsIHRlc3RfY29uc3RydWN0X3BvaW50ZXJfcmFuZ2U8VGVzdFNldD4oaW5zRmlyc3QsIGluc0ZpcnN0K2luc0NudCkgKTsKKyAgZGVsZXRlW10gaW5zRmlyc3Q7CisgIFdlYWtDaGVjayggdGVzdFNldCwgaW5zZXJ0X3JhbmdlX3Rlc3Rlcih0ZXN0U2V0LCB0ZXN0U2V0Mi5iZWdpbigpLCB0ZXN0U2V0Mi5lbmQoKSApICk7CisKKyAgQ29uc3RDaGVjayggMCwgdGVzdF9kZWZhdWx0X2NvbnN0cnVjdDxUZXN0U2V0PigpICk7CisgIENvbnN0Q2hlY2soIDAsIHRlc3RfY29uc3RydWN0X2l0ZXJfcmFuZ2U8VGVzdFNldD4oIHRlc3RTZXQyICkgKTsKKyAgQ29uc3RDaGVjayggdGVzdFNldCwgdGVzdF9jb3B5X2NvbnN0cnVjdDxUZXN0U2V0PigpICk7CisgIFdlYWtDaGVjayggdGVzdFNldCwgdGVzdF9hc3NpZ25fb3A8VGVzdFNldD4oIHRlc3RTZXQyICkgKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvZWgvdGVzdF9zbGlzdC5jcHAgYi90ZXN0L2VoL3Rlc3Rfc2xpc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NDFlNGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2VoL3Rlc3Rfc2xpc3QuY3BwCkBAIC0wLDAgKzEsOTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICB0ZXN0X3NsaXN0LmNwcAorCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1hcmsgb2YgdGhlIFVuaWNvcm4sIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIE1hcmsgb2YgdGhlIFVuaWNvcm4gbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiVGVzdHMuaCIKKyNpZiBkZWZpbmVkKCBFSF9TTElTVF9JTVBMRU1FTlRFRCApCisjICBpbmNsdWRlICJUZXN0Q2xhc3MuaCIKKyMgIGluY2x1ZGUgIkxlYWtDaGVjay5oIgorIyAgaWYgZGVmaW5lZCAoRUhfTkVXX0hFQURFUlMpICYmIGRlZmluZWQgKEVIX1VTRV9TR0lfU1RMKQorIyAgICBpbmNsdWRlIDxzbGlzdD4KKyMgIGVsc2UKKyMgICAgaW5jbHVkZSA8c2xpc3QuaD4KKyMgIGVuZGlmCisjaW5jbHVkZSAidGVzdF9jb25zdHJ1Y3QuaCIKKyNpbmNsdWRlICJ0ZXN0X2Fzc2lnbl9vcC5oIgorI2luY2x1ZGUgInRlc3RfcHVzaF9iYWNrLmgiCisjaW5jbHVkZSAidGVzdF9pbnNlcnQuaCIKKyNpbmNsdWRlICJ0ZXN0X3B1c2hfZnJvbnQuaCIKKworI2lmIGRlZmluZWQgKF9fR05VQ19fKSAmJiBkZWZpbmVkIChfX0FQUExFX18pCit0eXBlZGVmIEVIX1NURDo6c2xpc3Q8VGVzdENsYXNzLCBlaF9hbGxvY2F0b3IoVGVzdENsYXNzKSA+IFRlc3RTTGlzdDsKKyNlbHNlCit0eXBlZGVmIEVIX1NURDo6X19zbGlzdF9fPFRlc3RDbGFzcywgZWhfYWxsb2NhdG9yKFRlc3RDbGFzcykgPiBUZXN0U0xpc3Q7CisjZW5kaWYKKworaW5saW5lIHNlcXVlbmNlX2NvbnRhaW5lcl90YWcKK2NvbnRhaW5lcl9jYXRlZ29yeShjb25zdCBUZXN0U0xpc3QmKSB7CisgIHJldHVybiBzZXF1ZW5jZV9jb250YWluZXJfdGFnKCk7Cit9CisKK3N0cnVjdCB0ZXN0X3NsaXN0X3NvcnQgeworICB0ZXN0X3NsaXN0X3NvcnQoKSB7CisgICAgZ1Rlc3RDb250cm9sbGVyLlNldEN1cnJlbnRUZXN0TmFtZSgic2xpc3Q6OnNvcnQoKSIpOworICB9CisgIHZvaWQgb3BlcmF0b3IoKSggVGVzdFNMaXN0JiBzbGlzdCApIGNvbnN0IHsKKyAgICBzbGlzdC5zb3J0KCk7CisgICAgZm9yICggVGVzdFNMaXN0OjppdGVyYXRvciBwID0gc2xpc3QuYmVnaW4oKSwgcTsgcCAhPSBzbGlzdC5lbmQoKTsgcSA9IHAsIHArKyApCisgICAgICBpZiAoIHAgIT0gc2xpc3QuYmVnaW4oKSApIHsKKyAgICAgICAgRUhfQVNTRVJUKCAqcCA+PSAqcSApOworICAgICAgfQorICB9Cit9OworCit2b2lkIHRlc3Rfc2xpc3QoKSB7CisgIFRlc3RTTGlzdCB0ZXN0U0xpc3QsIHRlc3RTTGlzdDI7CisgIHNpemVfdCBzbGlzdFNpemUgPSByYW5kb21fbnVtYmVyKHJhbmRvbV9iYXNlKTsKKworICB3aGlsZSAodGVzdFNMaXN0LnNpemUoKSA8IHNsaXN0U2l6ZSkgeworICAgIFRlc3RDbGFzcyB4OworICAgIHRlc3RTTGlzdC5wdXNoX2Zyb250KCB4ICk7CisgICAgdGVzdFNMaXN0Mi5wdXNoX2Zyb250KCBUZXN0Q2xhc3MoKSApOworICB9CisKKyAgU3Ryb25nQ2hlY2soIHRlc3RTTGlzdCwgdGVzdF9pbnNlcnRfb25lPFRlc3RTTGlzdD4odGVzdFNMaXN0KSApOworICBTdHJvbmdDaGVjayggdGVzdFNMaXN0LCB0ZXN0X2luc2VydF9vbmU8VGVzdFNMaXN0Pih0ZXN0U0xpc3QsIDApICk7CisgIFN0cm9uZ0NoZWNrKCB0ZXN0U0xpc3QsIHRlc3RfaW5zZXJ0X29uZTxUZXN0U0xpc3Q+KHRlc3RTTGlzdCwgKGludCl0ZXN0U0xpc3Quc2l6ZSgpKSApOworCisgIFdlYWtDaGVjayggdGVzdFNMaXN0LCB0ZXN0X2luc2VydF9uPFRlc3RTTGlzdD4odGVzdFNMaXN0LCByYW5kb21fbnVtYmVyKHJhbmRvbV9iYXNlKSApICk7CisgIFdlYWtDaGVjayggdGVzdFNMaXN0LCB0ZXN0X2luc2VydF9uPFRlc3RTTGlzdD4odGVzdFNMaXN0LCByYW5kb21fbnVtYmVyKHJhbmRvbV9iYXNlKSwgMCApICk7CisgIFdlYWtDaGVjayggdGVzdFNMaXN0LCB0ZXN0X2luc2VydF9uPFRlc3RTTGlzdD4odGVzdFNMaXN0LCByYW5kb21fbnVtYmVyKHJhbmRvbV9iYXNlKSwgKGludCl0ZXN0U0xpc3Quc2l6ZSgpICkgKTsKKworICBzaXplX3QgaW5zQ250ID0gcmFuZG9tX251bWJlcihyYW5kb21fYmFzZSk7CisgIFRlc3RDbGFzcyAqaW5zRmlyc3QgPSBuZXcgVGVzdFNMaXN0Ojp2YWx1ZV90eXBlWzEraW5zQ250XTsKKyAgV2Vha0NoZWNrKCB0ZXN0U0xpc3QsIGluc2VydF9yYW5nZV90ZXN0ZXIodGVzdFNMaXN0LCBpbnNGaXJzdCwgaW5zRmlyc3QraW5zQ250KSApOworCisgIENvbnN0Q2hlY2soIDAsIHRlc3RfY29uc3RydWN0X3BvaW50ZXJfcmFuZ2U8VGVzdFNMaXN0PihpbnNGaXJzdCwgaW5zRmlyc3QraW5zQ250KSApOworICBkZWxldGVbXSBpbnNGaXJzdDsKKyAgV2Vha0NoZWNrKCB0ZXN0U0xpc3QsIHRlc3RfaW5zZXJ0X3JhbmdlPFRlc3RTTGlzdCxUZXN0U0xpc3Q6Oml0ZXJhdG9yPih0ZXN0U0xpc3QsIHRlc3RTTGlzdDIuYmVnaW4oKSwgdGVzdFNMaXN0Mi5lbmQoKSApICk7CisgIFN0cm9uZ0NoZWNrKCB0ZXN0U0xpc3QsIHRlc3RfcHVzaF9mcm9udDxUZXN0U0xpc3Q+KHRlc3RTTGlzdCkgKTsKKyAgU3Ryb25nQ2hlY2soIHRlc3RTTGlzdCwgdGVzdF9zbGlzdF9zb3J0KCkgKTsgIC8vIFNpbXBseSB0byB2ZXJpZnkgc3RyZW5ndGguCisKKyAgQ29uc3RDaGVjayggMCwgdGVzdF9kZWZhdWx0X2NvbnN0cnVjdDxUZXN0U0xpc3Q+KCkgKTsKKyAgQ29uc3RDaGVjayggMCwgdGVzdF9jb25zdHJ1Y3RfbjxUZXN0U0xpc3Q+KCByYW5kb21fbnVtYmVyKHJhbmRvbV9iYXNlKSApICk7CisgIENvbnN0Q2hlY2soIDAsIHRlc3RfY29uc3RydWN0X25faW5zdGFuY2U8VGVzdFNMaXN0PiggcmFuZG9tX251bWJlcihyYW5kb21fYmFzZSkgKSApOworICBDb25zdENoZWNrKCAwLCB0ZXN0X2NvbnN0cnVjdF9pdGVyX3JhbmdlPFRlc3RTTGlzdD4oIHRlc3RTTGlzdDIgKSApOworICBDb25zdENoZWNrKCB0ZXN0U0xpc3QsIHRlc3RfY29weV9jb25zdHJ1Y3Q8VGVzdFNMaXN0PigpICk7CisgIFdlYWtDaGVjayggdGVzdFNMaXN0LCB0ZXN0X2Fzc2lnbl9vcDxUZXN0U0xpc3Q+KCB0ZXN0U0xpc3QyICkgKTsKK30KKworI2VuZGlmIC8vIEVIX1NMSVNUX0lNUExFTUVOVEVECmRpZmYgLS1naXQgYS90ZXN0L2VoL3Rlc3Rfc3RyaW5nLmNwcCBiL3Rlc3QvZWgvdGVzdF9zdHJpbmcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4Yzk0NDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2VoL3Rlc3Rfc3RyaW5nLmNwcApAQCAtMCwwICsxLDc5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgdGVzdF9zdHJpbmcuY3BwCisKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogTWFyayBvZiB0aGUgVW5pY29ybiwgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgTWFyayBvZiB0aGUgVW5pY29ybiBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJQcmVmaXguaCIKKyNpZiBkZWZpbmVkKCBFSF9TVFJJTkdfSU1QTEVNRU5URUQgKQorI2luY2x1ZGUgIlRlc3RzLmgiCisjaW5jbHVkZSAiVGVzdENsYXNzLmgiCisjaW5jbHVkZSAiTGVha0NoZWNrLmgiCisjaW5jbHVkZSAidGVzdF9jb25zdHJ1Y3QuaCIKKyNpbmNsdWRlICJ0ZXN0X2Fzc2lnbl9vcC5oIgorI2luY2x1ZGUgInRlc3RfcHVzaF9iYWNrLmgiCisjaW5jbHVkZSAidGVzdF9pbnNlcnQuaCIKKyNpbmNsdWRlICJ0ZXN0X3B1c2hfZnJvbnQuaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisKK1VTSU5HX0NTVERfTkFNRShzaXplX3QpCisKK3R5cGVkZWYgRUhfU1REOjpiYXNpY19zdHJpbmc8Y2hhciwgRUhfU1REOjpjaGFyX3RyYWl0czxjaGFyPiwgZWhfYWxsb2NhdG9yKGNoYXIpID4gVGVzdFN0cmluZzsKKworaW5saW5lIHNlcXVlbmNlX2NvbnRhaW5lcl90YWcKK2NvbnRhaW5lcl9jYXRlZ29yeShjb25zdCBUZXN0U3RyaW5nJikKK3sKKyAgcmV0dXJuIHNlcXVlbmNlX2NvbnRhaW5lcl90YWcoKTsKK30KKwordm9pZCB0ZXN0X3N0cmluZygpIHsKKyAgICBUZXN0U3RyaW5nIHRlc3RTdHJpbmcsIHRlc3RTdHJpbmcyOworICAgIHNpemVfdCByb3BlU2l6ZSA9IHJhbmRvbV9udW1iZXIocmFuZG9tX2Jhc2UpOworCisgICAgd2hpbGUgKCB0ZXN0U3RyaW5nLnNpemUoKSA8IHJvcGVTaXplICkgeworICAgICAgICBUZXN0U3RyaW5nOjp2YWx1ZV90eXBlIHggPSBUZXN0U3RyaW5nOjp2YWx1ZV90eXBlKHJhbmRvbV9udW1iZXIocmFuZG9tX2Jhc2UpKSA7ICAvLyBpbml0aWFsaXplIGJlZm9yZSB1c2UKKyAgICAgICAgdGVzdFN0cmluZy5hcHBlbmQoMSwgeCApOworICAgICAgICB0ZXN0U3RyaW5nMi5hcHBlbmQoMSwgVGVzdFN0cmluZzo6dmFsdWVfdHlwZSgpICk7CisgICAgfQorICAgIFdlYWtDaGVjayggdGVzdFN0cmluZywgdGVzdF9pbnNlcnRfb25lPFRlc3RTdHJpbmc+KHRlc3RTdHJpbmcpICk7CisgICAgV2Vha0NoZWNrKCB0ZXN0U3RyaW5nLCB0ZXN0X2luc2VydF9vbmU8VGVzdFN0cmluZz4odGVzdFN0cmluZywgMCkgKTsKKyAgICBXZWFrQ2hlY2soIHRlc3RTdHJpbmcsIHRlc3RfaW5zZXJ0X29uZTxUZXN0U3RyaW5nPih0ZXN0U3RyaW5nLCAoaW50KXRlc3RTdHJpbmcuc2l6ZSgpKSApOworCisgICAgV2Vha0NoZWNrKCB0ZXN0U3RyaW5nLCB0ZXN0X2luc2VydF9uPFRlc3RTdHJpbmc+KHRlc3RTdHJpbmcsIHJhbmRvbV9udW1iZXIocmFuZG9tX2Jhc2UpICkgKTsKKyAgICBXZWFrQ2hlY2soIHRlc3RTdHJpbmcsIHRlc3RfaW5zZXJ0X248VGVzdFN0cmluZz4odGVzdFN0cmluZywgcmFuZG9tX251bWJlcihyYW5kb21fYmFzZSksIDAgKSApOworICAgIFdlYWtDaGVjayggdGVzdFN0cmluZywgdGVzdF9pbnNlcnRfbjxUZXN0U3RyaW5nPih0ZXN0U3RyaW5nLCByYW5kb21fbnVtYmVyKHJhbmRvbV9iYXNlKSwgKGludCl0ZXN0U3RyaW5nLnNpemUoKSApICk7CisKKyAgICBzaXplX3QgaW5zQ250ID0gcmFuZG9tX251bWJlcihyYW5kb21fYmFzZSk7CisgICAgVGVzdFN0cmluZzo6dmFsdWVfdHlwZSAqaW5zRmlyc3QgPSBuZXcgVGVzdFN0cmluZzo6dmFsdWVfdHlwZVsxK2luc0NudF07CisKKyAgICBXZWFrQ2hlY2soIHRlc3RTdHJpbmcsIGluc2VydF9yYW5nZV90ZXN0ZXIodGVzdFN0cmluZywgaW5zRmlyc3QsIGluc0ZpcnN0K2luc0NudCkgKTsKKyAgICBXZWFrQ2hlY2soIHRlc3RTdHJpbmcsIGluc2VydF9yYW5nZV9hdF9iZWdpbl90ZXN0ZXIodGVzdFN0cmluZywgaW5zRmlyc3QsIGluc0ZpcnN0K2luc0NudCkgKTsKKyAgICBXZWFrQ2hlY2soIHRlc3RTdHJpbmcsIGluc2VydF9yYW5nZV9hdF9lbmRfdGVzdGVyKHRlc3RTdHJpbmcsIGluc0ZpcnN0LCBpbnNGaXJzdCtpbnNDbnQpICk7CisKKyAgICBDb25zdENoZWNrKCAwLCB0ZXN0X2NvbnN0cnVjdF9wb2ludGVyX3JhbmdlPFRlc3RTdHJpbmc+KGluc0ZpcnN0LCBpbnNGaXJzdCtpbnNDbnQpICk7CisgICAgZGVsZXRlW10gaW5zRmlyc3Q7CisKKyAgICBXZWFrQ2hlY2soIHRlc3RTdHJpbmcsIGluc2VydF9yYW5nZV90ZXN0ZXIodGVzdFN0cmluZywgdGVzdFN0cmluZzIuYmVnaW4oKSwgdGVzdFN0cmluZzIuZW5kKCkgKSApOworICAgIC8qCisgICAgV2Vha0NoZWNrKCB0ZXN0U3RyaW5nLCB0ZXN0X3B1c2hfZnJvbnQ8VGVzdFN0cmluZz4odGVzdFN0cmluZykgKTsKKyAgICBXZWFrQ2hlY2soIHRlc3RTdHJpbmcsIHRlc3RfcHVzaF9iYWNrPFRlc3RTdHJpbmc+KHRlc3RTdHJpbmcpICk7CisgICAgKi8KKyAgICBDb25zdENoZWNrKCAwLCB0ZXN0X2RlZmF1bHRfY29uc3RydWN0PFRlc3RTdHJpbmc+KCkgKTsKKyAgICAvLyByZXF1aXJlcyBfUmVzZXJ2ZV90ICAgIENvbnN0Q2hlY2soIDAsIHRlc3RfY29uc3RydWN0X248VGVzdFN0cmluZz4oIHJhbmRvbV9udW1iZXIocmFuZG9tX2Jhc2UpICkgKTsKKyAgICBDb25zdENoZWNrKCAwLCB0ZXN0X2NvbnN0cnVjdF9uX2luc3RhbmNlPFRlc3RTdHJpbmc+KCByYW5kb21fbnVtYmVyKHJhbmRvbV9iYXNlKSApICk7CisgICAgQ29uc3RDaGVjayggMCwgdGVzdF9jb25zdHJ1Y3RfaXRlcl9yYW5nZTxUZXN0U3RyaW5nPiggdGVzdFN0cmluZzIgKSApOworICAgIENvbnN0Q2hlY2soIHRlc3RTdHJpbmcsIHRlc3RfY29weV9jb25zdHJ1Y3Q8VGVzdFN0cmluZz4oKSApOworCisgICAgV2Vha0NoZWNrKCB0ZXN0U3RyaW5nLCB0ZXN0X2Fzc2lnbl9vcDxUZXN0U3RyaW5nPiggdGVzdFN0cmluZzIgKSApOworfQorCisjZW5kaWYgLy8gRUhfUk9QRV9JTVBMRU1FTlRFRApkaWZmIC0tZ2l0IGEvdGVzdC9laC90ZXN0X3ZhbGFycmF5LmNwcCBiL3Rlc3QvZWgvdGVzdF92YWxhcnJheS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFiYzc1ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZWgvdGVzdF92YWxhcnJheS5jcHAKQEAgLTAsMCArMSw4MSBAQAorLy8gQm9yaXMgLSB0aGlzIGZpbGUgaXMsIHVtLCByYXRoZXIgaW5jb21wbGV0ZS4gUGxlYXNlIHJlbW92ZSBmcm9tIGRpc3RyaWJ1dGlvbi4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIHRlc3Rfc3RyaW5nLmNwcAorCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1hcmsgb2YgdGhlIFVuaWNvcm4sIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIE1hcmsgb2YgdGhlIFVuaWNvcm4gbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiUHJlZml4LmgiCisjaWYgZGVmaW5lZCggRUhfVkFMQVJSQVlfSU1QTEVNRU5URUQgKQorI2luY2x1ZGUgIlRlc3RzLmgiCisjaW5jbHVkZSA8dmFsYXJyYXk+CisjaW5jbHVkZSAiVGVzdENsYXNzLmgiCisjaW5jbHVkZSAiTGVha0NoZWNrLmgiCisjaW5jbHVkZSAidGVzdF9jb25zdHJ1Y3QuaCIKKyNpbmNsdWRlICJ0ZXN0X2Fzc2lnbl9vcC5oIgorI2luY2x1ZGUgInRlc3RfcHVzaF9iYWNrLmgiCisjaW5jbHVkZSAidGVzdF9pbnNlcnQuaCIKKyNpbmNsdWRlICJ0ZXN0X3B1c2hfZnJvbnQuaCIKKwordHlwZWRlZiBfX3ZhbGFycmF5X188VGVzdENsYXNzLCBlaF9hbGxvY2F0b3IoVGVzdENsYXNzKSA+IFRlc3RWYWxhcnJheTsKKworaW5saW5lIHNlcXVlbmNlX2NvbnRhaW5lcl90YWcKK2NvbnRhaW5lcl9jYXRlZ29yeShjb25zdCBUZXN0VmFsYXJyYXkmKQoreworICByZXR1cm4gc2VxdWVuY2VfY29udGFpbmVyX3RhZygpOworfQorCit2b2lkIHRlc3Rfcm9wZSgpCit7CisgICAgVGVzdFZhbGFycmF5IHRlc3RWYWxhcnJheSwgdGVzdFZhbGFycmF5MjsKKyAgICBzaXplX3Qgcm9wZVNpemUgPSByYW5kb21fbnVtYmVyKHJhbmRvbV9iYXNlKTsKKworICAgIHdoaWxlICggdGVzdFZhbGFycmF5LnNpemUoKSA8IHJvcGVTaXplICkKKyAgICB7CisgICAgICAgIFRlc3RWYWxhcnJheTo6dmFsdWVfdHlwZSB4ID0gcmFuZG9tX251bWJlcihyYW5kb21fYmFzZSkgOyAgLy8gaW5pdGlhbGl6ZSBiZWZvcmUgdXNlCisgICAgICAgIHRlc3RWYWxhcnJheS5wdXNoX2JhY2soIHggKTsKKyAgICAgICAgdGVzdFZhbGFycmF5Mi5wdXNoX2JhY2soIFRlc3RWYWxhcnJheTo6dmFsdWVfdHlwZSgpICk7CisgICAgfQorICAgIFdlYWtDaGVjayggdGVzdFZhbGFycmF5LCB0ZXN0X2luc2VydF9vbmU8VGVzdFZhbGFycmF5Pih0ZXN0VmFsYXJyYXkpICk7CisgICAgV2Vha0NoZWNrKCB0ZXN0VmFsYXJyYXksIHRlc3RfaW5zZXJ0X29uZTxUZXN0VmFsYXJyYXk+KHRlc3RWYWxhcnJheSwgMCkgKTsKKyAgICBXZWFrQ2hlY2soIHRlc3RWYWxhcnJheSwgdGVzdF9pbnNlcnRfb25lPFRlc3RWYWxhcnJheT4odGVzdFZhbGFycmF5LCB0ZXN0VmFsYXJyYXkuc2l6ZSgpKSApOworCisgICAgV2Vha0NoZWNrKCB0ZXN0VmFsYXJyYXksIHRlc3RfaW5zZXJ0X248VGVzdFZhbGFycmF5Pih0ZXN0VmFsYXJyYXksIHJhbmRvbV9udW1iZXIocmFuZG9tX2Jhc2UpICkgKTsKKyAgICBXZWFrQ2hlY2soIHRlc3RWYWxhcnJheSwgdGVzdF9pbnNlcnRfbjxUZXN0VmFsYXJyYXk+KHRlc3RWYWxhcnJheSwgcmFuZG9tX251bWJlcihyYW5kb21fYmFzZSksIDAgKSApOworICAgIFdlYWtDaGVjayggdGVzdFZhbGFycmF5LCB0ZXN0X2luc2VydF9uPFRlc3RWYWxhcnJheT4odGVzdFZhbGFycmF5LCByYW5kb21fbnVtYmVyKHJhbmRvbV9iYXNlKSwgdGVzdFZhbGFycmF5LnNpemUoKSApICk7CisKKyAgICBzaXplX3QgaW5zQ250ID0gcmFuZG9tX251bWJlcihyYW5kb21fYmFzZSk7CisgICAgVGVzdFZhbGFycmF5Ojp2YWx1ZV90eXBlICppbnNGaXJzdCA9IG5ldyBUZXN0VmFsYXJyYXk6OnZhbHVlX3R5cGVbMStpbnNDbnRdOworCisgICAgV2Vha0NoZWNrKCB0ZXN0VmFsYXJyYXksIGluc2VydF9yYW5nZV90ZXN0ZXIodGVzdFZhbGFycmF5LCBpbnNGaXJzdCwgaW5zRmlyc3QraW5zQ250KSApOworICAgIFdlYWtDaGVjayggdGVzdFZhbGFycmF5LCBpbnNlcnRfcmFuZ2VfYXRfYmVnaW5fdGVzdGVyKHRlc3RWYWxhcnJheSwgaW5zRmlyc3QsIGluc0ZpcnN0K2luc0NudCkgKTsKKyAgICBXZWFrQ2hlY2soIHRlc3RWYWxhcnJheSwgaW5zZXJ0X3JhbmdlX2F0X2VuZF90ZXN0ZXIodGVzdFZhbGFycmF5LCBpbnNGaXJzdCwgaW5zRmlyc3QraW5zQ250KSApOworCisgICAgQ29uc3RDaGVjayggMCwgdGVzdF9jb25zdHJ1Y3RfcG9pbnRlcl9yYW5nZTxUZXN0VmFsYXJyYXk+KGluc0ZpcnN0LCBpbnNGaXJzdCtpbnNDbnQpICk7CisgICAgZGVsZXRlW10gaW5zRmlyc3Q7CisKKyAgICBXZWFrQ2hlY2soIHRlc3RWYWxhcnJheSwgaW5zZXJ0X3JhbmdlX3Rlc3Rlcih0ZXN0VmFsYXJyYXksIHRlc3RWYWxhcnJheTIuYmVnaW4oKSwgdGVzdFZhbGFycmF5Mi5lbmQoKSApICk7CisKKyAgICBXZWFrQ2hlY2soIHRlc3RWYWxhcnJheSwgdGVzdF9wdXNoX2Zyb250PFRlc3RWYWxhcnJheT4odGVzdFZhbGFycmF5KSApOworICAgIFdlYWtDaGVjayggdGVzdFZhbGFycmF5LCB0ZXN0X3B1c2hfYmFjazxUZXN0VmFsYXJyYXk+KHRlc3RWYWxhcnJheSkgKTsKKworICAgIENvbnN0Q2hlY2soIDAsIHRlc3RfZGVmYXVsdF9jb25zdHJ1Y3Q8VGVzdFZhbGFycmF5PigpICk7CisgICAgQ29uc3RDaGVjayggMCwgdGVzdF9jb25zdHJ1Y3RfbjxUZXN0VmFsYXJyYXk+KCByYW5kb21fbnVtYmVyKHJhbmRvbV9iYXNlKSApICk7CisgICAgQ29uc3RDaGVjayggMCwgdGVzdF9jb25zdHJ1Y3Rfbl9pbnN0YW5jZTxUZXN0VmFsYXJyYXk+KCByYW5kb21fbnVtYmVyKHJhbmRvbV9iYXNlKSApICk7CisgICAgQ29uc3RDaGVjayggMCwgdGVzdF9jb25zdHJ1Y3RfaXRlcl9yYW5nZTxUZXN0VmFsYXJyYXk+KCB0ZXN0VmFsYXJyYXkyICkgKTsKKyAgICBDb25zdENoZWNrKCB0ZXN0VmFsYXJyYXksIHRlc3RfY29weV9jb25zdHJ1Y3Q8VGVzdFZhbGFycmF5PigpICk7CisKKyAgICBXZWFrQ2hlY2soIHRlc3RWYWxhcnJheSwgdGVzdF9hc3NpZ25fb3A8VGVzdFZhbGFycmF5PiggdGVzdFZhbGFycmF5MiApICk7Cit9CisKKyNlbmRpZiAvLyBFSF9ST1BFX0lNUExFTUVOVEVECmRpZmYgLS1naXQgYS90ZXN0L2VoL3Rlc3RfdmVjdG9yLmNwcCBiL3Rlc3QvZWgvdGVzdF92ZWN0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1YzM1YjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2VoL3Rlc3RfdmVjdG9yLmNwcApAQCAtMCwwICsxLDEyNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIHRlc3RfdmVjdG9yLmNwcAorCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1hcmsgb2YgdGhlIFVuaWNvcm4sIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIE1hcmsgb2YgdGhlIFVuaWNvcm4gbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiVGVzdHMuaCIKKyNpbmNsdWRlICJUZXN0Q2xhc3MuaCIKKyNpbmNsdWRlICJMZWFrQ2hlY2suaCIKKyMgaWYgZGVmaW5lZCAoRUhfTkVXX0hFQURFUlMpCisjaW5jbHVkZSA8dmVjdG9yPgorI2Vsc2UKKyNpbmNsdWRlIDx2ZWN0b3IuaD4KKyNlbmRpZgorI2luY2x1ZGUgInRlc3RfY29uc3RydWN0LmgiCisjaW5jbHVkZSAidGVzdF9hc3NpZ25fb3AuaCIKKyNpbmNsdWRlICJ0ZXN0X3B1c2hfYmFjay5oIgorI2luY2x1ZGUgInRlc3RfaW5zZXJ0LmgiCisjaW5jbHVkZSAidGVzdF9wdXNoX2Zyb250LmgiCisKKyMgaWYgZGVmaW5lZCAoX19HTlVDX18pICYmIGRlZmluZWQgKF9fQVBQTEVfXykKK3R5cGVkZWYgRUhfU1REOjp2ZWN0b3I8VGVzdENsYXNzLCBlaF9hbGxvY2F0b3IoVGVzdENsYXNzKSA+IFRlc3RWZWN0b3I7CisjIGVsc2UKK3R5cGVkZWYgRUhfU1REOjpfX3ZlY3Rvcl9fPFRlc3RDbGFzcywgZWhfYWxsb2NhdG9yKFRlc3RDbGFzcykgPiBUZXN0VmVjdG9yOworIyBlbmRpZgorCitpbmxpbmUgc2VxdWVuY2VfY29udGFpbmVyX3RhZworY29udGFpbmVyX2NhdGVnb3J5KGNvbnN0IFRlc3RWZWN0b3ImKQoreworICByZXR1cm4gc2VxdWVuY2VfY29udGFpbmVyX3RhZygpOworfQorCit2b2lkIHByZXBhcmVfaW5zZXJ0X24oIFRlc3RWZWN0b3ImIGMsIHNpemVfdCBpbnNDbnQgKTsKKwordm9pZCBwcmVwYXJlX2luc2VydF9uKCBUZXN0VmVjdG9yJiBjLCBzaXplX3QgaW5zQ250ICkKK3sKKyAgICBpZiAoIHJhbmRvbV9udW1iZXIoMikgKQorICAgICAgICBjLnJlc2VydmUoIGMuc2l6ZSgpICsgaW5zQ250ICk7Cit9CisKK3N0cnVjdCB0ZXN0X3Jlc2VydmUKK3sKKyAgICB0ZXN0X3Jlc2VydmUoIHNpemVfdCBuICkgOiBmQW1vdW50KG4pIHsKKyAgICAgICAgICAgIGdUZXN0Q29udHJvbGxlci5TZXRDdXJyZW50VGVzdE5hbWUoInZlY3Rvcjo6cmVzZXJ2ZSgpIik7CisgICAgfQorCisgICAgdm9pZCBvcGVyYXRvcigpKCBUZXN0VmVjdG9yJiB2ICkgY29uc3QKKyAgICB7CisgICAgICAgIHYucmVzZXJ2ZSggZkFtb3VudCApOworICAgIH0KK3ByaXZhdGU6CisgICAgc2l6ZV90IGZBbW91bnQ7Cit9OworCitpbmxpbmUgdm9pZCBwcmVwYXJlX2luc2VydF9yYW5nZSggVGVzdFZlY3RvciYgdmVjLCBzaXplX3QsIFRlc3RDbGFzcyogZmlyc3QsIFRlc3RDbGFzcyogbGFzdCApCit7CisgICAgaWYgKCByYW5kb21fbnVtYmVyKDIpICkKKyAgICB7CisgICAgICAgIHB0cmRpZmZfdCBkID0gMDsKKyAgICAgICAgRUhfRElTVEFOQ0UoIGZpcnN0LCBsYXN0LCBkICk7CisgICAgICAgIHZlYy5yZXNlcnZlKCB2ZWMuc2l6ZSgpICsgZCApOworICAgIH0KK30KKwordm9pZCB0ZXN0X3ZlY3RvcigpCit7CisKKyAgICBDb25zdENoZWNrKCAwLCB0ZXN0X2NvbnN0cnVjdF9uPFRlc3RWZWN0b3I+KCByYW5kb21fbnVtYmVyKHJhbmRvbV9iYXNlKSApICk7CisKKyAgICBUZXN0VmVjdG9yIGVtcHR5VmVjdG9yOworICAgIFRlc3RWZWN0b3IgdGVzdFZlY3RvciwgdGVzdFZlY3RvcjI7CisgICAgc2l6ZV90IHZlY3RvclNpemUgPSByYW5kb21fbnVtYmVyKHJhbmRvbV9iYXNlKTsKKworICAgIHRlc3RWZWN0b3IucmVzZXJ2ZSh2ZWN0b3JTaXplKjQpOworICAgIHdoaWxlICggdGVzdFZlY3Rvci5zaXplKCkgPCB2ZWN0b3JTaXplICkKKyAgICB7CisgICAgICAgIFRlc3RDbGFzcyB4OworICAgICAgICB0ZXN0VmVjdG9yLnB1c2hfYmFjayggeCApOworICAgICAgICB0ZXN0VmVjdG9yMi5wdXNoX2JhY2soIFRlc3RDbGFzcygpICk7CisgICAgfQorCisgICAgc2l6ZV90IGluc0NudCA9IHJhbmRvbV9udW1iZXIocmFuZG9tX2Jhc2UpOworICAgIFRlc3RDbGFzcyAqaW5zRmlyc3QgPSBuZXcgVGVzdFZlY3Rvcjo6dmFsdWVfdHlwZVsxKyBpbnNDbnRdOworCisgICAgQ29uc3RDaGVjayggMCwgdGVzdF9jb25zdHJ1Y3RfcG9pbnRlcl9yYW5nZTxUZXN0VmVjdG9yPihpbnNGaXJzdCwgaW5zRmlyc3QraW5zQ250KSApOworCisgICAgV2Vha0NoZWNrKCB0ZXN0VmVjdG9yLCBpbnNlcnRfcmFuZ2VfdGVzdGVyKHRlc3RWZWN0b3IsIGluc0ZpcnN0LCBpbnNGaXJzdCtpbnNDbnQpICk7CisgICAgV2Vha0NoZWNrKCB0ZXN0VmVjdG9yLCBpbnNlcnRfcmFuZ2VfYXRfYmVnaW5fdGVzdGVyKHRlc3RWZWN0b3IsIGluc0ZpcnN0LCBpbnNGaXJzdCtpbnNDbnQpICk7CisgICAgV2Vha0NoZWNrKCB0ZXN0VmVjdG9yLCBpbnNlcnRfcmFuZ2VfYXRfZW5kX3Rlc3Rlcih0ZXN0VmVjdG9yLCBpbnNGaXJzdCwgaW5zRmlyc3QraW5zQ250KSApOworICAgIGRlbGV0ZVtdIGluc0ZpcnN0OworCisgICAgV2Vha0NoZWNrKCB0ZXN0VmVjdG9yLCB0ZXN0X2luc2VydF9vbmU8VGVzdFZlY3Rvcj4odGVzdFZlY3RvcikgKTsKKyAgICBXZWFrQ2hlY2soIHRlc3RWZWN0b3IsIHRlc3RfaW5zZXJ0X29uZTxUZXN0VmVjdG9yPih0ZXN0VmVjdG9yLCAwKSApOworICAgIFdlYWtDaGVjayggdGVzdFZlY3RvciwgdGVzdF9pbnNlcnRfb25lPFRlc3RWZWN0b3I+KHRlc3RWZWN0b3IsIChpbnQpdGVzdFZlY3Rvci5zaXplKCkpICk7CisKKyAgICBXZWFrQ2hlY2soIHRlc3RWZWN0b3IsIHRlc3RfaW5zZXJ0X248VGVzdFZlY3Rvcj4odGVzdFZlY3RvciwgcmFuZG9tX251bWJlcihyYW5kb21fYmFzZSkgKSApOworICAgIFdlYWtDaGVjayggdGVzdFZlY3RvciwgdGVzdF9pbnNlcnRfbjxUZXN0VmVjdG9yPih0ZXN0VmVjdG9yLCByYW5kb21fbnVtYmVyKHJhbmRvbV9iYXNlKSwgMCApICk7CisgICAgV2Vha0NoZWNrKCB0ZXN0VmVjdG9yLCB0ZXN0X2luc2VydF9uPFRlc3RWZWN0b3I+KHRlc3RWZWN0b3IsIHJhbmRvbV9udW1iZXIocmFuZG9tX2Jhc2UpLCAoaW50KXRlc3RWZWN0b3Iuc2l6ZSgpICkgKTsKKworICAgIFdlYWtDaGVjayggdGVzdFZlY3RvciwgaW5zZXJ0X3JhbmdlX3Rlc3Rlcih0ZXN0VmVjdG9yLCB0ZXN0VmVjdG9yMi5iZWdpbigpLCB0ZXN0VmVjdG9yMi5lbmQoKSApICk7CisKKworICAgIFN0cm9uZ0NoZWNrKCB0ZXN0VmVjdG9yLCB0ZXN0X3Jlc2VydmUoIHRlc3RWZWN0b3IuY2FwYWNpdHkoKSArIHJhbmRvbV9udW1iZXIocmFuZG9tX2Jhc2UpICkgKTsKKyAgICBTdHJvbmdDaGVjayggdGVzdFZlY3RvciwgdGVzdF9wdXNoX2JhY2s8VGVzdFZlY3Rvcj4odGVzdFZlY3RvcikgKTsKKyAgICBTdHJvbmdDaGVjayggZW1wdHlWZWN0b3IsIHRlc3RfcHVzaF9iYWNrPFRlc3RWZWN0b3I+KGVtcHR5VmVjdG9yKSApOworCisgICAgQ29uc3RDaGVjayggMCwgdGVzdF9kZWZhdWx0X2NvbnN0cnVjdDxUZXN0VmVjdG9yPigpICk7CisgICAgQ29uc3RDaGVjayggMCwgdGVzdF9jb25zdHJ1Y3Rfbl9pbnN0YW5jZTxUZXN0VmVjdG9yPiggcmFuZG9tX251bWJlcihyYW5kb21fYmFzZSkgKSApOworICAgIENvbnN0Q2hlY2soIDAsIHRlc3RfY29uc3RydWN0X2l0ZXJfcmFuZ2U8VGVzdFZlY3Rvcj4oIHRlc3RWZWN0b3IyICkgKTsKKyAgICBDb25zdENoZWNrKCB0ZXN0VmVjdG9yLCB0ZXN0X2NvcHlfY29uc3RydWN0PFRlc3RWZWN0b3I+KCkgKTsKKworICAgIHRlc3RWZWN0b3IyLnJlc2l6ZSggdGVzdFZlY3Rvci5zaXplKCkgKiAzIC8gMiApOworICAgIFdlYWtDaGVjayggdGVzdFZlY3RvciwgdGVzdF9hc3NpZ25fb3A8VGVzdFZlY3Rvcj4oIHRlc3RWZWN0b3IyICkgKTsKKyAgICB0ZXN0VmVjdG9yMi5jbGVhcigpOworICAgIHRlc3RWZWN0b3IyLnJlc2l6ZSggdGVzdFZlY3Rvci5zaXplKCkgKiAyIC8gMyApOworICAgIFdlYWtDaGVjayggdGVzdFZlY3RvciwgdGVzdF9hc3NpZ25fb3A8VGVzdFZlY3Rvcj4oIHRlc3RWZWN0b3IyICkgKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9fdGVtcGxhdGUuY3BwIGIvdGVzdC91bml0L190ZW1wbGF0ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJhODZkNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9fdGVtcGxhdGUuY3BwCkBAIC0wLDAgKzEsMzEgQEAKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSAiY3BwdW5pdC9jcHB1bml0X3Byb3h5LmgiCisKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZChfU1RMUF9VU0VfTkFNRVNQQUNFUykKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisjZW5kaWYKKworLy8KKy8vIFRlc3RDYXNlIGNsYXNzCisvLworY2xhc3MgVGVzdCA6IHB1YmxpYyBDUFBVTklUX05TOjpUZXN0Q2FzZQoreworICBDUFBVTklUX1RFU1RfU1VJVEUoVGVzdCk7CisgIENQUFVOSVRfVEVTVCh0ZXN0KTsKKyAgQ1BQVU5JVF9URVNUX1NVSVRFX0VORCgpOworCitwcm90ZWN0ZWQ6CisgIHZvaWQgdGVzdCgpOworfTsKKworQ1BQVU5JVF9URVNUX1NVSVRFX1JFR0lTVFJBVElPTihUZXN0KTsKKworLy8KKy8vIHRlc3RzIGltcGxlbWVudGF0aW9uCisvLwordm9pZCBUZXN0Ojp0ZXN0KCkKK3sKKyAgQ1BQVU5JVF9BU1NFUlQodHJ1ZSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvYWNjdW1fdGVzdC5jcHAgYi90ZXN0L3VuaXQvYWNjdW1fdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI1ODU2MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9hY2N1bV90ZXN0LmNwcApAQCAtMCwwICsxLDUwIEBACisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPG51bWVyaWM+CisKKyNpbmNsdWRlICJjcHB1bml0L2NwcHVuaXRfcHJveHkuaCIKKworI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkIChfU1RMUF9VU0VfTkFNRVNQQUNFUykKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisjZW5kaWYKKworLy8KKy8vIFRlc3RDYXNlIGNsYXNzCisvLworY2xhc3MgQWNjdW1UZXN0IDogcHVibGljIENQUFVOSVRfTlM6OlRlc3RDYXNlCit7CisgIENQUFVOSVRfVEVTVF9TVUlURShBY2N1bVRlc3QpOworICBDUFBVTklUX1RFU1QoYWNjdW0xKTsKKyAgQ1BQVU5JVF9URVNUKGFjY3VtMik7CisgIENQUFVOSVRfVEVTVF9TVUlURV9FTkQoKTsKKworcHJvdGVjdGVkOgorICB2b2lkIGFjY3VtMSgpOworICB2b2lkIGFjY3VtMigpOworICBzdGF0aWMgaW50IG11bHQoaW50IGluaXRpYWxfLCBpbnQgZWxlbWVudF8pOworfTsKKworQ1BQVU5JVF9URVNUX1NVSVRFX1JFR0lTVFJBVElPTihBY2N1bVRlc3QpOworCisvLworLy8gdGVzdHMgaW1wbGVtZW50YXRpb24KKy8vCit2b2lkIEFjY3VtVGVzdDo6YWNjdW0xKCkKK3sKKyAgdmVjdG9yPGludD4gdig1KTsKKyAgZm9yKGludCBpID0gMDsgKHNpemVfdClpIDwgdi5zaXplKCk7ICsraSkKKyAgICB2W2ldID0gaSArIDE7CisgIGludCBzdW0gPSBhY2N1bXVsYXRlKHYuYmVnaW4oKSwgdi5lbmQoKSwgMCk7CisgIENQUFVOSVRfQVNTRVJUKHN1bT09MTUpOworfQordm9pZCBBY2N1bVRlc3Q6OmFjY3VtMigpCit7CisgIHZlY3RvcjxpbnQ+IHYoNSk7CisgIGZvcihpbnQgaSA9IDA7IChzaXplX3QpaSA8IHYuc2l6ZSgpOyArK2kpCisgICAgdltpXSA9IGkgKyAxOworICBpbnQgcHJvZCA9IGFjY3VtdWxhdGUodi5iZWdpbigpLCB2LmVuZCgpLCAxLCBtdWx0KTsKKyAgQ1BQVU5JVF9BU1NFUlQocHJvZD09MTIwKTsKK30KK2ludCBBY2N1bVRlc3Q6Om11bHQoaW50IGluaXRpYWxfLCBpbnQgZWxlbWVudF8pCit7CisgIHJldHVybiBpbml0aWFsXyAqIGVsZW1lbnRfOworfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L2Fkal90ZXN0LmNwcCBiL3Rlc3QvdW5pdC9hZGpfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg4ODM4YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9hZGpfdGVzdC5jcHAKQEAgLTAsMCArMSwxMzUgQEAKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8bnVtZXJpYz4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpbmNsdWRlICJjcHB1bml0L2NwcHVuaXRfcHJveHkuaCIKKworI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkKF9TVExQX1VTRV9OQU1FU1BBQ0VTKQordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyNlbmRpZgorCisvLworLy8gVGVzdENhc2UgY2xhc3MKKy8vCitjbGFzcyBBZGpUZXN0IDogcHVibGljIENQUFVOSVRfTlM6OlRlc3RDYXNlCit7CisgIENQUFVOSVRfVEVTVF9TVUlURShBZGpUZXN0KTsKKyAgQ1BQVU5JVF9URVNUKGFkamZpbmQwKTsKKyAgQ1BQVU5JVF9URVNUKGFkamZpbmQxKTsKKyAgQ1BQVU5JVF9URVNUKGFkamZpbmQyKTsKKyAgQ1BQVU5JVF9URVNUKGFkamRpZmYwKTsKKyAgQ1BQVU5JVF9URVNUKGFkamRpZmYxKTsKKyAgQ1BQVU5JVF9URVNUKGFkamRpZmYyKTsKKyAgQ1BQVU5JVF9URVNUX1NVSVRFX0VORCgpOworCitwcm90ZWN0ZWQ6CisgIHZvaWQgYWRqZmluZDAoKTsKKyAgdm9pZCBhZGpmaW5kMSgpOworICB2b2lkIGFkamZpbmQyKCk7CisgIHZvaWQgYWRqZGlmZjAoKTsKKyAgdm9pZCBhZGpkaWZmMSgpOworICB2b2lkIGFkamRpZmYyKCk7CisgIHN0YXRpYyBpbnQgZXF1YWxfbGVuZ3RoKGNvbnN0IGNoYXIqIHYxXywgY29uc3QgY2hhciogdjJfKTsKKyAgc3RhdGljIGludCBtdWx0KGludCBhXywgaW50IGJfKTsKK307CisKK0NQUFVOSVRfVEVTVF9TVUlURV9SRUdJU1RSQVRJT04oQWRqVGVzdCk7CisKKy8vCisvLyB0ZXN0cyBpbXBsZW1lbnRhdGlvbgorLy8KK3ZvaWQgQWRqVGVzdDo6YWRqZmluZDAoKQoreworICBpbnQgbnVtYmVyczEgWzVdID0geyAxLCAyLCA0LCA4LCAxNiB9OworICBpbnQgbnVtYmVyczIgWzVdID0geyA1LCAzLCAyLCAxLCAxIH07CisKKyAgaW50KiBsb2NhdGlvbiA9IGFkamFjZW50X2ZpbmQoKGludCopbnVtYmVyczEsIChpbnQqKW51bWJlcnMxICsgNSk7CisgIENQUFVOSVRfQVNTRVJUKGxvY2F0aW9uID09IG51bWJlcnMxICsgNSk7IC8vIG5vIGFkaiBzbyBsb2Mgc2hvdWxkIGJlIF9sYXN0CisKKyAgbG9jYXRpb24gPSBhZGphY2VudF9maW5kKChpbnQqKW51bWJlcnMyLCAoaW50KiludW1iZXJzMiArIDUpOworICBDUFBVTklUX0FTU0VSVChsb2NhdGlvbiAhPSBudW1iZXJzMiArIDUpOyAvLyBhZGogbG9jYXRpb24gb2ZmIHNob3VsZCBiZSAzIChmaXJzdCAxKQorICBDUFBVTklUX0FTU0VSVCgobG9jYXRpb24gLSBudW1iZXJzMik9PTMpOworfQordm9pZCBBZGpUZXN0OjphZGpmaW5kMSgpCit7CisgIHR5cGVkZWYgdmVjdG9yPGludD4gSW50VmVjdG9yOworICBJbnRWZWN0b3IgdigxMCk7CisgIGZvciAoaW50IGkgPSAwOyAoc2l6ZV90KWkgPCB2LnNpemUoKTsgKytpKQorICAgIHZbaV0gPSBpOworICBJbnRWZWN0b3I6Oml0ZXJhdG9yIGxvY2F0aW9uOworICBsb2NhdGlvbiA9IGFkamFjZW50X2ZpbmQodi5iZWdpbigpLCB2LmVuZCgpKTsKKyAgQ1BQVU5JVF9BU1NFUlQobG9jYXRpb24gPT0gdi5lbmQoKSk7CisgIHZbNl0gPSA3OworICBsb2NhdGlvbiA9IGFkamFjZW50X2ZpbmQodi5iZWdpbigpLCB2LmVuZCgpKTsKKyAgQ1BQVU5JVF9BU1NFUlQobG9jYXRpb24gIT0gdi5lbmQoKSk7Cit9Cit2b2lkIEFkalRlc3Q6OmFkamZpbmQyKCkKK3sKKyAgdHlwZWRlZiB2ZWN0b3IgPGNvbnN0IGNoYXIqPiBDU3RyVmVjdG9yOworCisgIGNvbnN0IGNoYXIqIG5hbWVzW10gPSB7ICJCcmV0dCIsICJHcmFoYW0iLCAiSmFjayIsICJNaWtlIiwgIlRvZGQiIH07CisKKyAgY29uc3QgaW50IG5hbWVDb3VudCA9IHNpemVvZihuYW1lcykvc2l6ZW9mKG5hbWVzWzBdKTsKKyAgQ1N0clZlY3RvciB2KG5hbWVDb3VudCk7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBuYW1lQ291bnQ7IGkrKykKKyAgICB2W2ldID0gbmFtZXNbaV07CisgIENTdHJWZWN0b3I6Oml0ZXJhdG9yIGxvY2F0aW9uOworICBsb2NhdGlvbiA9IGFkamFjZW50X2ZpbmQodi5iZWdpbigpLCB2LmVuZCgpLCBlcXVhbF9sZW5ndGgpOworCisgIENQUFVOSVRfQVNTRVJUKGxvY2F0aW9uICE9IHYuZW5kKCkpOworfQoraW50IEFkalRlc3Q6OmVxdWFsX2xlbmd0aChjb25zdCBjaGFyKiB2MV8sIGNvbnN0IGNoYXIqIHYyXykKK3sKKyAgcmV0dXJuIDo6c3RybGVuKHYxXykgPT0gOjpzdHJsZW4odjJfKTsKK30KK3ZvaWQgQWRqVGVzdDo6YWRqZGlmZjAoKQoreworICBpbnQgbnVtYmVyc1s1XSA9IHsgMSwgMiwgNCwgOCwgMTYgfTsKKyAgaW50IGRpZmZlcmVuY2VbNV07CisgIGFkamFjZW50X2RpZmZlcmVuY2UobnVtYmVycywgbnVtYmVycyArIDUsIChpbnQqKWRpZmZlcmVuY2UpOworICBDUFBVTklUX0FTU0VSVChkaWZmZXJlbmNlWzBdPT0xKTsKKyAgQ1BQVU5JVF9BU1NFUlQoZGlmZmVyZW5jZVsxXT09MSk7CisgIENQUFVOSVRfQVNTRVJUKGRpZmZlcmVuY2VbMl09PTIpOworICBDUFBVTklUX0FTU0VSVChkaWZmZXJlbmNlWzNdPT00KTsKKyAgQ1BQVU5JVF9BU1NFUlQoZGlmZmVyZW5jZVs0XT09OCk7Cit9Cit2b2lkIEFkalRlc3Q6OmFkamRpZmYxKCkKK3sKKyAgdmVjdG9yIDxpbnQ+IHYoMTApOworICBmb3IoaW50IGkgPSAwOyAoc2l6ZV90KWkgPCB2LnNpemUoKTsgKytpKQorICAgIHZbaV0gPSBpICogaTsKKyAgdmVjdG9yPGludD4gcmVzdWx0KHYuc2l6ZSgpKTsKKyAgYWRqYWNlbnRfZGlmZmVyZW5jZSh2LmJlZ2luKCksIHYuZW5kKCksIHJlc3VsdC5iZWdpbigpKTsKKyAgQ1BQVU5JVF9BU1NFUlQocmVzdWx0WzBdPT0wKQorICBDUFBVTklUX0FTU0VSVChyZXN1bHRbMV09PTEpCisgIENQUFVOSVRfQVNTRVJUKHJlc3VsdFsyXT09MykKKyAgQ1BQVU5JVF9BU1NFUlQocmVzdWx0WzNdPT01KQorICBDUFBVTklUX0FTU0VSVChyZXN1bHRbNF09PTcpCisgIENQUFVOSVRfQVNTRVJUKHJlc3VsdFs1XT09OSkKKyAgQ1BQVU5JVF9BU1NFUlQocmVzdWx0WzZdPT0xMSkKKyAgQ1BQVU5JVF9BU1NFUlQocmVzdWx0WzddPT0xMykKKyAgQ1BQVU5JVF9BU1NFUlQocmVzdWx0WzhdPT0xNSkKKyAgQ1BQVU5JVF9BU1NFUlQocmVzdWx0WzldPT0xNykKK30KK3ZvaWQgQWRqVGVzdDo6YWRqZGlmZjIoKQoreworICB2ZWN0b3IgPGludD4gdigxMCk7CisgIGZvciAoaW50IGkgPSAwOyAoc2l6ZV90KWkgPCB2LnNpemUoKTsgKytpKQorICAgIHZbaV0gPSBpICsgMTsKKyAgdmVjdG9yIDxpbnQ+IHJlc3VsdCh2LnNpemUoKSk7CisgIGFkamFjZW50X2RpZmZlcmVuY2Uodi5iZWdpbigpLCB2LmVuZCgpLCByZXN1bHQuYmVnaW4oKSwgbXVsdCk7CisgIENQUFVOSVRfQVNTRVJUKHJlc3VsdFswXT09MSkKKyAgQ1BQVU5JVF9BU1NFUlQocmVzdWx0WzFdPT0yKQorICBDUFBVTklUX0FTU0VSVChyZXN1bHRbMl09PTYpCisgIENQUFVOSVRfQVNTRVJUKHJlc3VsdFszXT09MTIpCisgIENQUFVOSVRfQVNTRVJUKHJlc3VsdFs0XT09MjApCisgIENQUFVOSVRfQVNTRVJUKHJlc3VsdFs1XT09MzApCisgIENQUFVOSVRfQVNTRVJUKHJlc3VsdFs2XT09NDIpCisgIENQUFVOSVRfQVNTRVJUKHJlc3VsdFs3XT09NTYpCisgIENQUFVOSVRfQVNTRVJUKHJlc3VsdFs4XT09NzIpCisgIENQUFVOSVRfQVNTRVJUKHJlc3VsdFs5XT09OTApCit9CitpbnQgQWRqVGVzdDo6bXVsdChpbnQgYV8sIGludCBiXykKK3sKKyAgcmV0dXJuIGFfICogYl87Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvYWR2YW5jZV90ZXN0LmNwcCBiL3Rlc3QvdW5pdC9hZHZhbmNlX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkN2ExNjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvYWR2YW5jZV90ZXN0LmNwcApAQCAtMCwwICsxLDM4IEBACisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgImNwcHVuaXQvY3BwdW5pdF9wcm94eS5oIgorCisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IGRlZmluZWQoX1NUTFBfVVNFX05BTUVTUEFDRVMpCit1c2luZyBuYW1lc3BhY2Ugc3RkOworI2VuZGlmCisKKy8vCisvLyBUZXN0Q2FzZSBjbGFzcworLy8KK2NsYXNzIEFkdmFuY2VUZXN0IDogcHVibGljIENQUFVOSVRfTlM6OlRlc3RDYXNlCit7CisgIENQUFVOSVRfVEVTVF9TVUlURShBZHZhbmNlVGVzdCk7CisgIENQUFVOSVRfVEVTVChhZHYpOworICBDUFBVTklUX1RFU1RfU1VJVEVfRU5EKCk7CisKK3Byb3RlY3RlZDoKKyAgdm9pZCBhZHYoKTsKK307CisKK0NQUFVOSVRfVEVTVF9TVUlURV9SRUdJU1RSQVRJT04oQWR2YW5jZVRlc3QpOworCisvLworLy8gdGVzdHMgaW1wbGVtZW50YXRpb24KKy8vCit2b2lkIEFkdmFuY2VUZXN0OjphZHYoKQoreworICB0eXBlZGVmIHZlY3RvciA8aW50PiBJbnRWZWN0b3I7CisgIEludFZlY3RvciB2KDEwKTsKKyAgZm9yIChpbnQgaSA9IDA7IChzaXplX3QpaSA8IHYuc2l6ZSgpOyArK2kpCisgICAgdltpXSA9IGk7CisgIEludFZlY3Rvcjo6aXRlcmF0b3IgbG9jYXRpb24gPSB2LmJlZ2luKCk7CisgIENQUFVOSVRfQVNTRVJUKCpsb2NhdGlvbj09MCk7CisgIGFkdmFuY2UobG9jYXRpb24sIDUpOworICBDUFBVTklUX0FTU0VSVCgqbG9jYXRpb249PTUpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L2FsZ190ZXN0LmNwcCBiL3Rlc3QvdW5pdC9hbGdfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE0OTc3YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9hbGdfdGVzdC5jcHAKQEAgLTAsMCArMSwzNjQgQEAKKyNpbmNsdWRlIDxsaXN0PgorI2lmIGRlZmluZWQgKFNUTFBPUlQpICYmICFkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQorIyAgaW5jbHVkZSA8c2xpc3Q+CisjZW5kaWYKKyNpbmNsdWRlIDxkZXF1ZT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgImNwcHVuaXQvY3BwdW5pdF9wcm94eS5oIgorCisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IGRlZmluZWQoX1NUTFBfVVNFX05BTUVTUEFDRVMpCit1c2luZyBuYW1lc3BhY2Ugc3RkOworI2VuZGlmCisKKy8vCisvLyBUZXN0Q2FzZSBjbGFzcworLy8KK2NsYXNzIEFsZ1Rlc3QgOiBwdWJsaWMgQ1BQVU5JVF9OUzo6VGVzdENhc2UKK3sKKyAgQ1BQVU5JVF9URVNUX1NVSVRFKEFsZ1Rlc3QpOworICBDUFBVTklUX1RFU1QobWluX21heCk7CisgIENQUFVOSVRfVEVTVChjb3VudF90ZXN0KTsKKyAgQ1BQVU5JVF9URVNUKHNvcnRfdGVzdCk7CisgIENQUFVOSVRfVEVTVChzZWFyY2hfbl90ZXN0KTsKKyAgQ1BQVU5JVF9URVNUKGZpbmRfZmlyc3Rfb2ZfdGVzdCk7CisgIENQUFVOSVRfVEVTVChmaW5kX2ZpcnN0X29mX25zY190ZXN0KTsKKyAgQ1BQVU5JVF9URVNUX1NVSVRFX0VORCgpOworCitwcm90ZWN0ZWQ6CisgIHZvaWQgbWluX21heCgpOworICB2b2lkIGNvdW50X3Rlc3QoKTsKKyAgdm9pZCBzb3J0X3Rlc3QoKTsKKyAgdm9pZCBzZWFyY2hfbl90ZXN0KCk7CisgIHZvaWQgZmluZF9maXJzdF9vZl90ZXN0KCk7CisgIHZvaWQgZmluZF9maXJzdF9vZl9uc2NfdGVzdCgpOworfTsKKworQ1BQVU5JVF9URVNUX1NVSVRFX1JFR0lTVFJBVElPTihBbGdUZXN0KTsKKworLy8KKy8vIHRlc3RzIGltcGxlbWVudGF0aW9uCisvLwordm9pZCBBbGdUZXN0OjptaW5fbWF4KCkKK3sKKyAgaW50IGkgPSBtaW4oNCwgNyk7CisgIENQUFVOSVRfQVNTRVJUKCBpID09IDQgKTsKKyAgY2hhciBjID0gbWF4KCdhJywgJ3onKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIGMgPT0gJ3onICk7CisKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKKyAgYyA9IG1pbignYScsICd6JywgZ3JlYXRlcjxjaGFyPigpKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIGMgPT0gJ3onICk7CisgIGkgPSBtYXgoNCwgNywgZ3JlYXRlcjxpbnQ+KCkpOworICBDUFBVTklUX0FTU0VSVCggaSA9PSA0ICk7CisjZW5kaWYKK30KKwordm9pZCBBbGdUZXN0Ojpjb3VudF90ZXN0KCkKK3sKKyAgeworICAgIGludCBpW10gPSB7IDEsIDQsIDIsIDgsIDIsIDIgfTsKKyAgICBpbnQgbiA9IGNvdW50KGksIGkgKyA2LCAyKTsKKyAgICBDUFBVTklUX0FTU0VSVChuPT0zKTsKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fQU5BQ0hST05JU01TKQorICAgIG4gPSAwOworICAgIGNvdW50KGksIGkgKyA2LCAyLCBuKTsKKyAgICBDUFBVTklUX0FTU0VSVChuPT0zKTsKKyNlbmRpZgorICB9CisgIHsKKyAgICB2ZWN0b3I8aW50PiBpOworICAgIGkucHVzaF9iYWNrKDEpOworICAgIGkucHVzaF9iYWNrKDQpOworICAgIGkucHVzaF9iYWNrKDIpOworICAgIGkucHVzaF9iYWNrKDgpOworICAgIGkucHVzaF9iYWNrKDIpOworICAgIGkucHVzaF9iYWNrKDIpOworICAgIGludCBuID0gY291bnQoaS5iZWdpbigpLCBpLmVuZCgpLCAyKTsKKyAgICBDUFBVTklUX0FTU0VSVChuPT0zKTsKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fQU5BQ0hST05JU01TKQorICAgIG4gPSAwOworICAgIGNvdW50KGkuYmVnaW4oKSwgaS5lbmQoKSwgMiwgbik7CisgICAgQ1BQVU5JVF9BU1NFUlQobj09Myk7CisjZW5kaWYKKyAgfQorfQorCit2b2lkIEFsZ1Rlc3Q6OnNvcnRfdGVzdCgpCit7CisgIHsKKyAgICB2ZWN0b3I8aW50PiB5ZWFyczsKKyAgICB5ZWFycy5wdXNoX2JhY2soMTk2Mik7CisgICAgeWVhcnMucHVzaF9iYWNrKDE5OTIpOworICAgIHllYXJzLnB1c2hfYmFjaygyMDAxKTsKKyAgICB5ZWFycy5wdXNoX2JhY2soMTk5OSk7CisgICAgc29ydCh5ZWFycy5iZWdpbigpLCB5ZWFycy5lbmQoKSk7CisgICAgQ1BQVU5JVF9BU1NFUlQoeWVhcnNbMF09PTE5NjIpOworICAgIENQUFVOSVRfQVNTRVJUKHllYXJzWzFdPT0xOTkyKTsKKyAgICBDUFBVTklUX0FTU0VSVCh5ZWFyc1syXT09MTk5OSk7CisgICAgQ1BQVU5JVF9BU1NFUlQoeWVhcnNbM109PTIwMDEpOworICB9CisgIHsKKyAgICBkZXF1ZTxpbnQ+IHllYXJzOworICAgIHllYXJzLnB1c2hfYmFjaygxOTYyKTsKKyAgICB5ZWFycy5wdXNoX2JhY2soMTk5Mik7CisgICAgeWVhcnMucHVzaF9iYWNrKDIwMDEpOworICAgIHllYXJzLnB1c2hfYmFjaygxOTk5KTsKKyAgICBzb3J0KHllYXJzLmJlZ2luKCksIHllYXJzLmVuZCgpKTsgLy8gPC0tIGNoYW5nZWQhCisgICAgQ1BQVU5JVF9BU1NFUlQoeWVhcnNbMF09PTE5NjIpOworICAgIENQUFVOSVRfQVNTRVJUKHllYXJzWzFdPT0xOTkyKTsKKyAgICBDUFBVTklUX0FTU0VSVCh5ZWFyc1syXT09MTk5OSk7CisgICAgQ1BQVU5JVF9BU1NFUlQoeWVhcnNbM109PTIwMDEpOworICB9Cit9CisKKyNkZWZpbmUgQVJSQVlfU0laRShhcnIpIHNpemVvZihhcnIpIC8gc2l6ZW9mKGFyclswXSkKKwordm9pZCBBbGdUZXN0OjpzZWFyY2hfbl90ZXN0KCkKK3sKKyAgaW50IGludHNbXSA9IHswLCAxLCAyLCAzLCAzLCA0LCA0LCA0LCAyLCAyLCAzLCAzLCAzLCA0LCA0LCA0LCA0LCA1LCA1LCA1LCA1LCA1fTsKKworI2lmIGRlZmluZWQgKFNUTFBPUlQpICYmICFkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQorICAvL3NlYXJjaF9uCisgIC8vRm9yd2FyZCBpdGVyYXRvcgorICB7CisgICAgc2xpc3Q8aW50PiBzbGludChpbnRzLCBpbnRzICsgQVJSQVlfU0laRShpbnRzKSk7CisgICAgc2xpc3Q8aW50Pjo6aXRlcmF0b3Igc2xpdCA9IHNlYXJjaF9uKHNsaW50LmJlZ2luKCksIHNsaW50LmVuZCgpLCAyLCAyKTsKKyAgICBDUFBVTklUX0FTU0VSVCggc2xpdCAhPSBzbGludC5lbmQoKSApOworICAgIENQUFVOSVRfQVNTRVJUKCAqKHNsaXQrKykgPT0gMiApOworICAgIENQUFVOSVRfQVNTRVJUKCAqc2xpdCA9PSAyICk7CisgIH0KKyNlbmRpZgorCisgIC8vQmlkaXJlY3Rpb25uYWwgaXRlcmF0b3IKKyAgeworICAgIGxpc3Q8aW50PiBsaW50KGludHMsIGludHMgKyBBUlJBWV9TSVpFKGludHMpKTsKKyAgICBsaXN0PGludD46Oml0ZXJhdG9yIGxpdCA9IHNlYXJjaF9uKGxpbnQuYmVnaW4oKSwgbGludC5lbmQoKSwgMywgMyk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGxpdCAhPSBsaW50LmVuZCgpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoICoobGl0KyspID09IDMgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggKihsaXQrKykgPT0gMyApOworICAgIENQUFVOSVRfQVNTRVJUKCAqbGl0ID09IDMgKTsKKyAgfQorCisgIC8vUmFuZG9tIGFjY2VzcyBpdGVyYXRvcgorICB7CisgICAgZGVxdWU8aW50PiBkaW50KGludHMsIGludHMgKyBBUlJBWV9TSVpFKGludHMpKTsKKyAgICBkZXF1ZTxpbnQ+OjppdGVyYXRvciBkaXQgPSBzZWFyY2hfbihkaW50LmJlZ2luKCksIGRpbnQuZW5kKCksIDQsIDQpOworICAgIENQUFVOSVRfQVNTRVJUKCBkaXQgIT0gZGludC5lbmQoKSApOworICAgIENQUFVOSVRfQVNTRVJUKCAqKGRpdCsrKSA9PSA0ICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoICooZGl0KyspID09IDQgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggKihkaXQrKykgPT0gNCApOworICAgIENQUFVOSVRfQVNTRVJUKCAqZGl0ID09IDQgKTsKKyAgfQorCisjaWYgZGVmaW5lZCAoU1RMUE9SVCkgJiYgIWRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpCisgIC8vc2VhcmNoX24gd2l0aCBwcmVkaWNhdGUKKyAgLy9Gb3J3YXJkIGl0ZXJhdG9yCisgIHsKKyAgICBzbGlzdDxpbnQ+IHNsaW50KGludHMsIGludHMgKyBBUlJBWV9TSVpFKGludHMpKTsKKyAgICBzbGlzdDxpbnQ+OjppdGVyYXRvciBzbGl0ID0gc2VhcmNoX24oc2xpbnQuYmVnaW4oKSwgc2xpbnQuZW5kKCksIDIsIDEsIGdyZWF0ZXI8aW50PigpKTsKKyAgICBDUFBVTklUX0FTU0VSVCggc2xpdCAhPSBzbGludC5lbmQoKSApOworICAgIENQUFVOSVRfQVNTRVJUKCAqKHNsaXQrKykgPiAxICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoICpzbGl0ID4gMiApOworICB9CisjZW5kaWYKKworICAvL0JpZGlyZWN0aW9ubmFsIGl0ZXJhdG9yCisgIHsKKyAgICBsaXN0PGludD4gbGludChpbnRzLCBpbnRzICsgQVJSQVlfU0laRShpbnRzKSk7CisgICAgbGlzdDxpbnQ+OjppdGVyYXRvciBsaXQgPSBzZWFyY2hfbihsaW50LmJlZ2luKCksIGxpbnQuZW5kKCksIDMsIDIsIGdyZWF0ZXI8aW50PigpKTsKKyAgICBDUFBVTklUX0FTU0VSVCggbGl0ICE9IGxpbnQuZW5kKCkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggKihsaXQrKykgPiAyICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoICoobGl0KyspID4gMiApOworICAgIENQUFVOSVRfQVNTRVJUKCAqbGl0ID4gMiApOworICB9CisKKyAgLy9SYW5kb20gYWNjZXNzIGl0ZXJhdG9yCisgIHsKKyAgICBkZXF1ZTxpbnQ+IGRpbnQoaW50cywgaW50cyArIEFSUkFZX1NJWkUoaW50cykpOworICAgIGRlcXVlPGludD46Oml0ZXJhdG9yIGRpdCA9IHNlYXJjaF9uKGRpbnQuYmVnaW4oKSwgZGludC5lbmQoKSwgNCwgMywgZ3JlYXRlcjxpbnQ+KCkpOworICAgIENQUFVOSVRfQVNTRVJUKCBkaXQgIT0gZGludC5lbmQoKSApOworICAgIENQUFVOSVRfQVNTRVJUKCAqKGRpdCsrKSA+IDMgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggKihkaXQrKykgPiAzICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoICooZGl0KyspID4gMyApOworICAgIENQUFVOSVRfQVNTRVJUKCAqZGl0ID4gMyApOworICB9CisKKyAgLy8gdGVzdCBmb3IgYnVnIHJlcG9ydGVkIGJ5IEppbSBYb2NoZWxsaXMKKyAgeworICAgIGludCBhcnJheVtdID0gezAsIDAsIDEsIDAsIDEsIDF9OworICAgIGludCogYXJyYXlfZW5kID0gYXJyYXkgKyBzaXplb2YoYXJyYXkpIC8gc2l6ZW9mKCphcnJheSk7CisgICAgQ1BQVU5JVF9BU1NFUlQoc2VhcmNoX24oYXJyYXksIGFycmF5X2VuZCwgMywgMSkgPT0gYXJyYXlfZW5kKTsKKyAgfQorCisgIC8vIHRlc3QgZm9yIGJ1ZyB3aXRoIGNvdW50ZXIgPT0gMSwgcmVwb3J0ZWQgYnkgVGltbWllIFNtaXRoCisgIHsKKyAgICBpbnQgYXJyYXlbXSA9IHswLCAxLCAyLCAzLCA0LCA1fTsKKyAgICBpbnQqIGFycmF5X2VuZCA9IGFycmF5ICsgc2l6ZW9mKGFycmF5KSAvIHNpemVvZigqYXJyYXkpOworICAgIENQUFVOSVRfQVNTRVJUKCBzZWFyY2hfbihhcnJheSwgYXJyYXlfZW5kLCAxLCAxLCBlcXVhbF90bzxpbnQ+KCkgKSA9PSAmYXJyYXlbMV0gKTsKKyAgfQorfQorCitzdHJ1Y3QgTXlJbnRDb21wYXJhYmxlIHsKKyAgTXlJbnRDb21wYXJhYmxlKGludCB2YWwpIDogX3ZhbCh2YWwpIHt9CisgIGJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IE15SW50Q29tcGFyYWJsZSYgb3RoZXIpIGNvbnN0CisgIHsgcmV0dXJuIF92YWwgPT0gb3RoZXIuX3ZhbDsgfQorCitwcml2YXRlOgorICBpbnQgX3ZhbDsKK307CisKK3ZvaWQgQWxnVGVzdDo6ZmluZF9maXJzdF9vZl90ZXN0KCkKK3sKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKKyAgc2xpc3Q8aW50PiBpbnRzbDsKKyAgaW50c2wucHVzaF9mcm9udCgxKTsKKyAgaW50c2wucHVzaF9mcm9udCgyKTsKKworICB7CisgICAgdmVjdG9yPGludD4gaW50djsKKyAgICBpbnR2LnB1c2hfYmFjaygwKTsKKyAgICBpbnR2LnB1c2hfYmFjaygxKTsKKyAgICBpbnR2LnB1c2hfYmFjaygyKTsKKyAgICBpbnR2LnB1c2hfYmFjaygzKTsKKworICAgIHZlY3RvcjxpbnQ+OjppdGVyYXRvciBmaXJzdDsKKyAgICBmaXJzdCA9IGZpbmRfZmlyc3Rfb2YoaW50di5iZWdpbigpLCBpbnR2LmVuZCgpLCBpbnRzbC5iZWdpbigpLCBpbnRzbC5lbmQoKSk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGZpcnN0ICE9IGludHYuZW5kKCkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggKmZpcnN0ID09IDEgKTsKKyAgfQorICB7CisgICAgdmVjdG9yPGludD4gaW50djsKKyAgICBpbnR2LnB1c2hfYmFjaygzKTsKKyAgICBpbnR2LnB1c2hfYmFjaygyKTsKKyAgICBpbnR2LnB1c2hfYmFjaygxKTsKKyAgICBpbnR2LnB1c2hfYmFjaygwKTsKKworICAgIHZlY3RvcjxpbnQ+OjppdGVyYXRvciBmaXJzdDsKKyAgICBmaXJzdCA9IGZpbmRfZmlyc3Rfb2YoaW50di5iZWdpbigpLCBpbnR2LmVuZCgpLCBpbnRzbC5iZWdpbigpLCBpbnRzbC5lbmQoKSk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGZpcnN0ICE9IGludHYuZW5kKCkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggKmZpcnN0ID09IDIgKTsKKyAgfQorI2VuZGlmCisKKyAgbGlzdDxpbnQ+IGludGw7CisgIGludGwucHVzaF9mcm9udCgxKTsKKyAgaW50bC5wdXNoX2Zyb250KDIpOworCisgIHsKKyAgICB2ZWN0b3I8aW50PiBpbnR2OworICAgIGludHYucHVzaF9iYWNrKDApOworICAgIGludHYucHVzaF9iYWNrKDEpOworICAgIGludHYucHVzaF9iYWNrKDIpOworICAgIGludHYucHVzaF9iYWNrKDMpOworCisgICAgdmVjdG9yPGludD46Oml0ZXJhdG9yIGZpcnN0OworICAgIGZpcnN0ID0gZmluZF9maXJzdF9vZihpbnR2LmJlZ2luKCksIGludHYuZW5kKCksIGludGwuYmVnaW4oKSwgaW50bC5lbmQoKSk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGZpcnN0ICE9IGludHYuZW5kKCkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggKmZpcnN0ID09IDEgKTsKKyAgfQorICB7CisgICAgdmVjdG9yPGludD4gaW50djsKKyAgICBpbnR2LnB1c2hfYmFjaygzKTsKKyAgICBpbnR2LnB1c2hfYmFjaygyKTsKKyAgICBpbnR2LnB1c2hfYmFjaygxKTsKKyAgICBpbnR2LnB1c2hfYmFjaygwKTsKKworICAgIHZlY3RvcjxpbnQ+OjppdGVyYXRvciBmaXJzdDsKKyAgICBmaXJzdCA9IGZpbmRfZmlyc3Rfb2YoaW50di5iZWdpbigpLCBpbnR2LmVuZCgpLCBpbnRsLmJlZ2luKCksIGludGwuZW5kKCkpOworICAgIENQUFVOSVRfQVNTRVJUKCBmaXJzdCAhPSBpbnR2LmVuZCgpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoICpmaXJzdCA9PSAyICk7CisgIH0KKyAgeworICAgIGNoYXIgY2hhcnNbXSA9IHsxLCAyfTsKKworICAgIHZlY3RvcjxpbnQ+IGludHY7CisgICAgaW50di5wdXNoX2JhY2soMCk7CisgICAgaW50di5wdXNoX2JhY2soMSk7CisgICAgaW50di5wdXNoX2JhY2soMik7CisgICAgaW50di5wdXNoX2JhY2soMyk7CisKKyAgICB2ZWN0b3I8aW50Pjo6aXRlcmF0b3IgZmlyc3Q7CisgICAgZmlyc3QgPSBmaW5kX2ZpcnN0X29mKGludHYuYmVnaW4oKSwgaW50di5lbmQoKSwgY2hhcnMsIGNoYXJzICsgc2l6ZW9mKGNoYXJzKSk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGZpcnN0ICE9IGludHYuZW5kKCkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggKmZpcnN0ID09IDEgKTsKKyAgfQorICB7CisgICAgdW5zaWduZWQgY2hhciBjaGFyc1tdID0gezEsIDIsIDI1NX07CisKKyAgICB2ZWN0b3I8aW50PiBpbnR2OworICAgIGludHYucHVzaF9iYWNrKC0xMCk7CisgICAgaW50di5wdXNoX2JhY2soMTAyOSk7CisgICAgaW50di5wdXNoX2JhY2soMjU1KTsKKyAgICBpbnR2LnB1c2hfYmFjayg0KTsKKworICAgIHZlY3RvcjxpbnQ+OjppdGVyYXRvciBmaXJzdDsKKyAgICBmaXJzdCA9IGZpbmRfZmlyc3Rfb2YoaW50di5iZWdpbigpLCBpbnR2LmVuZCgpLCBjaGFycywgY2hhcnMgKyBzaXplb2YoY2hhcnMpKTsKKyAgICBDUFBVTklUX0FTU0VSVCggZmlyc3QgIT0gaW50di5lbmQoKSApOworICAgIENQUFVOSVRfQVNTRVJUKCAqZmlyc3QgPT0gMjU1ICk7CisgIH0KKyAgeworICAgIHNpZ25lZCBjaGFyIGNoYXJzW10gPSB7OTMsIDIsIC0xMDEsIDEzfTsKKworICAgIHZlY3RvcjxpbnQ+IGludHY7CisgICAgaW50di5wdXNoX2JhY2soLTEwKTsKKyAgICBpbnR2LnB1c2hfYmFjaygxMDI5KTsKKyAgICBpbnR2LnB1c2hfYmFjaygtMjAzNSk7CisgICAgaW50di5wdXNoX2JhY2soLTEwMSk7CisgICAgaW50di5wdXNoX2JhY2soNCk7CisKKyAgICB2ZWN0b3I8aW50Pjo6aXRlcmF0b3IgZmlyc3Q7CisgICAgZmlyc3QgPSBmaW5kX2ZpcnN0X29mKGludHYuYmVnaW4oKSwgaW50di5lbmQoKSwgY2hhcnMsIGNoYXJzICsgc2l6ZW9mKGNoYXJzKSk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGZpcnN0ICE9IGludHYuZW5kKCkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggKmZpcnN0ID09IC0xMDEgKTsKKyAgfQorICB7CisgICAgY2hhciBjaGFyc1tdID0gezEsIDJ9OworCisgICAgdmVjdG9yPE15SW50Q29tcGFyYWJsZT4gaW50djsKKyAgICBpbnR2LnB1c2hfYmFjaygwKTsKKyAgICBpbnR2LnB1c2hfYmFjaygxKTsKKyAgICBpbnR2LnB1c2hfYmFjaygyKTsKKyAgICBpbnR2LnB1c2hfYmFjaygzKTsKKworICAgIHZlY3RvcjxNeUludENvbXBhcmFibGU+OjppdGVyYXRvciBmaXJzdDsKKyAgICBmaXJzdCA9IGZpbmRfZmlyc3Rfb2YoaW50di5iZWdpbigpLCBpbnR2LmVuZCgpLCBjaGFycywgY2hhcnMgKyBzaXplb2YoY2hhcnMpKTsKKyAgICBDUFBVTklUX0FTU0VSVCggZmlyc3QgIT0gaW50di5lbmQoKSApOworICAgIENQUFVOSVRfQVNTRVJUKCAqZmlyc3QgPT0gMSApOworICB9Cit9CisKK3R5cGVkZWYgcGFpcjxpbnQsIHN0cmluZz4gUGFpcjsKKworc3RydWN0IFZhbHVlRmluZGVyIDoKKyAgICBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPGNvbnN0IFBhaXImLCBjb25zdCBzdHJpbmcmLCBib29sPgoreworICAgIGJvb2wgb3BlcmF0b3IgKCkgKCBjb25zdCBQYWlyICZwLCBjb25zdCBzdHJpbmcmIHZhbHVlICkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHAuc2Vjb25kID09IHZhbHVlOyB9Cit9OworCit2b2lkIEFsZ1Rlc3Q6OmZpbmRfZmlyc3Rfb2ZfbnNjX3Rlc3QoKQoreworICAvLyBOb24tc3ltbWV0cmljYWwgY29tcGFyYXRvcgorCisgIG1hcDxpbnQsIHN0cmluZz4gbTsKKyAgdmVjdG9yPHN0cmluZz4gdmFsdWVzOworCisgIG1bMV0gPSAib25lIjsKKyAgbVs0XSA9ICJmb3VyIjsKKyAgbVsxMF0gPSAidGVuIjsKKyAgbVsyMF0gPSAidHdlbnR5IjsKKworICB2YWx1ZXMucHVzaF9iYWNrKCAiZm91ciIgKTsKKyAgdmFsdWVzLnB1c2hfYmFjayggInRlbiIgKTsKKworICBtYXA8aW50LCBzdHJpbmc+OjppdGVyYXRvciBpID0gZmluZF9maXJzdF9vZihtLmJlZ2luKCksIG0uZW5kKCksIHZhbHVlcy5iZWdpbigpLCB2YWx1ZXMuZW5kKCksIFZhbHVlRmluZGVyKCkpOworCisgIENQUFVOSVRfQVNTRVJUKCBpICE9IG0uZW5kKCkgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIGktPmZpcnN0ID09IDQgfHwgaS0+Zmlyc3QgPT0gMTAgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIGktPnNlY29uZCA9PSAiZm91ciIgfHwgaS0+c2Vjb25kID09ICJ0ZW4iICk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvYWxnb3JpdGhtX2hlYWRlcl90ZXN0LmNwcCBiL3Rlc3QvdW5pdC9hbGdvcml0aG1faGVhZGVyX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMzU3N2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvYWxnb3JpdGhtX2hlYWRlcl90ZXN0LmNwcApAQCAtMCwwICsxLDggQEAKKy8qIFRoaXMgdGVzdCBwdXJwb3NlIGlzIHNpbXBseSB0byBjaGVjayBTdGFuZGFyZCBoZWFkZXIgaW5kZXBlbmRhbmN5IHRoYXQKKyAqIGlzIHRvIHNheSB0aGF0IHRoZSBoZWFkZXIgY2FuIGJlIGluY2x1ZGVkIGFsb25lIHdpdGhvdXQgYW55IHByZXZpb3VzCisgKiBpbmNsdWRlLgorICogQWRkaXRpb25uYWx5LCBmb3IgQyBTdGFuZGFyZCBoZWFkZXJzIHRoYXQgU1RMcG9ydCBleHBvc2UsIGl0IGNhbiBhbHNvIGJlCisgKiB1c2VkIHRvIGNoZWNrIHRoYXQgZmlsZXMgaW5jbHVkZWQgYnkgdGhvc2UgaGVhZGVycyBhcmUgY29tcGF0aWJsZSB3aXRoCisgKiBwdXJlIEMgY29tcGlsZXJzLgorICovCisjaW5jbHVkZSA8YWxnb3JpdGhtPgpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L2FsbG9jYXRvcl90ZXN0LmNwcCBiL3Rlc3QvdW5pdC9hbGxvY2F0b3JfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc2MGNkMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9hbGxvY2F0b3JfdGVzdC5jcHAKQEAgLTAsMCArMSwxNjggQEAKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8Y3N0ZGlvPgorCisjaW5jbHVkZSAiY3BwdW5pdC9jcHB1bml0X3Byb3h5LmgiCisKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZChfU1RMUF9VU0VfTkFNRVNQQUNFUykKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisjZW5kaWYKKworLy8KKy8vIFRlc3RDYXNlIGNsYXNzCisvLworY2xhc3MgQWxsb2NhdG9yVGVzdCA6IHB1YmxpYyBDUFBVTklUX05TOjpUZXN0Q2FzZQoreworICBDUFBVTklUX1RFU1RfU1VJVEUoQWxsb2NhdG9yVGVzdCk7CisgIENQUFVOSVRfVEVTVCh6ZXJvX2FsbG9jYXRpb24pOworI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkIChfU1RMUF9VU0VfRVhDRVBUSU9OUykKKyAgQ1BQVU5JVF9URVNUKGJhZF9hbGxvY190ZXN0KTsKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNUTFBPUlQpICYmIGRlZmluZWQgKF9TVExQX1RIUkVBRFMpICYmIGRlZmluZWQgKF9TVExQX1VTRV9QRVJUSFJFQURfQUxMT0MpCisgIENQUFVOSVRfVEVTVChwZXJfdGhyZWFkX2FsbG9jKTsKKyNlbmRpZgorICBDUFBVTklUX1RFU1RfU1VJVEVfRU5EKCk7CisKK3Byb3RlY3RlZDoKKyAgdm9pZCB6ZXJvX2FsbG9jYXRpb24oKTsKKyAgdm9pZCBiYWRfYWxsb2NfdGVzdCgpOworICB2b2lkIHBlcl90aHJlYWRfYWxsb2MoKTsKK307CisKK0NQUFVOSVRfVEVTVF9TVUlURV9SRUdJU1RSQVRJT04oQWxsb2NhdG9yVGVzdCk7CisKKy8vCisvLyB0ZXN0cyBpbXBsZW1lbnRhdGlvbgorLy8KK3ZvaWQgQWxsb2NhdG9yVGVzdDo6emVyb19hbGxvY2F0aW9uKCkKK3sKKyAgdHlwZWRlZiBhbGxvY2F0b3I8Y2hhcj4gQ2hhckFsbG9jYXRvcjsKKyAgQ2hhckFsbG9jYXRvciBjaGFyQWxsb2NhdG9yOworCisgIGNoYXIqIGJ1ZiA9IGNoYXJBbGxvY2F0b3IuYWxsb2NhdGUoMCk7CisgIGNoYXJBbGxvY2F0b3IuZGVhbGxvY2F0ZShidWYsIDApOworCisgIGNoYXJBbGxvY2F0b3IuZGVhbGxvY2F0ZSgwLCAwKTsKK30KKworI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkIChfU1RMUF9VU0VfRVhDRVBUSU9OUykKKworc3RydWN0IEJpZ1N0cnVjdAoreworICBjaGFyIF9kYXRhWzQwOTZdOworfTsKKwordm9pZCBBbGxvY2F0b3JUZXN0OjpiYWRfYWxsb2NfdGVzdCgpCit7CisgIHR5cGVkZWYgYWxsb2NhdG9yPEJpZ1N0cnVjdD4gQmlnU3RydWN0QWxsb2NUeXBlOworICBCaWdTdHJ1Y3RBbGxvY1R5cGUgYmlnU3RydWN0QWxsb2M7CisKKyAgdHJ5IHsKKyAgICAvL0xldHMgdHJ5IHRvIGFsbG9jYXRlIGFsbW9zdCA0MDk2IEdvIChvbiBtb3N0IG9mIHRoZSBwbGF0Zm9ybXMpIG9mIG1lbW9yeToKKyAgICBCaWdTdHJ1Y3RBbGxvY1R5cGU6OnBvaW50ZXIgcGJpZ1N0cnVjdCA9IGJpZ1N0cnVjdEFsbG9jLmFsbG9jYXRlKDEwMjQgKiAxMDI0ICogMTAyNCk7CisKKyAgICAvL0FsbG9jYXRpb24gZmFpbGVkIGJ1dCBubyBleGNlcHRpb24gdGhyb3duCisgICAgQ1BQVU5JVF9BU1NFUlQoIHBiaWdTdHJ1Y3QgIT0gMCApOworCisgICAgLy8gSnVzdCBpdCBjYXNlIGl0IHN1Y2NlZWRzOgorICAgIGJpZ1N0cnVjdEFsbG9jLmRlYWxsb2NhdGUocGJpZ1N0cnVjdCwgMTAyNCAqIDEwMjQgKiAxMDI0KTsKKyAgfQorICBjYXRjaCAoYmFkX2FsbG9jIGNvbnN0JikgeworICB9CisgIGNhdGNoICguLi4pIHsKKyAgICAvL1dlIHNob3VsZG4ndCBiZSB0aGVyZToKKyAgICAvL05vdCBiYWRfYWxsb2MgZXhjZXB0aW9uIHRocm93bi4KKyAgICBDUFBVTklUX0ZBSUw7CisgIH0KK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoU1RMUE9SVCkgJiYgZGVmaW5lZCAoX1NUTFBfVEhSRUFEUykgJiYgZGVmaW5lZCAoX1NUTFBfVVNFX1BFUlRIUkVBRF9BTExPQykKKyMgIGluY2x1ZGUgPHB0aHJlYWQuaD4KKworY2xhc3MgU2hhcmVkRGF0YXMKK3sKK3B1YmxpYzoKKyAgdHlwZWRlZiB2ZWN0b3I8aW50LCBwZXJfdGhyZWFkX2FsbG9jYXRvcjxpbnQ+ID4gdGhyZWFkX3ZlY3RvcjsKKworICBTaGFyZWREYXRhcyhzaXplX3QgbmJFbGVtcykgOiB0aHJlYWRWZWN0b3JzKG5iRWxlbXMsICh0aHJlYWRfdmVjdG9yKikwKSB7CisgICAgcHRocmVhZF9tdXRleF9pbml0KCZtdXRleCwgMCk7CisgICAgcHRocmVhZF9jb25kX2luaXQoJmNvbmRpdGlvbiwgMCk7CisgIH0KKworICB+U2hhcmVkRGF0YXMoKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0aHJlYWRWZWN0b3JzLnNpemUoKTsgKytpKSB7CisgICAgICBkZWxldGUgdGhyZWFkVmVjdG9yc1tpXTsKKyAgICB9CisgIH0KKworICBzaXplX3QgaW5pdFRocmVhZFZlY3RvcigpIHsKKyAgICBzaXplX3QgcmV0OworCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtdXRleCk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRocmVhZFZlY3RvcnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgIGlmICh0aHJlYWRWZWN0b3JzW2ldID09IDApIHsKKyAgICAgICAgdGhyZWFkVmVjdG9yc1tpXSA9IG5ldyB0aHJlYWRfdmVjdG9yKCk7CisgICAgICAgIHJldCA9IGk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIGlmIChyZXQgIT0gdGhyZWFkVmVjdG9ycy5zaXplKCkgLSAxKSB7CisgICAgICAvL1dlIHdhaXQgZm9yIG90aGVyIHRocmVhZChzKSB0byBjYWxsIHRoaXMgbWV0aG9kIHRvbzoKKyAgICAgIHByaW50ZigiVGhyZWFkICVkIHdhaXRcbiIsIHJldCk7CisgICAgICBwdGhyZWFkX2NvbmRfd2FpdCgmY29uZGl0aW9uLCAmbXV0ZXgpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIC8vV2UgYXJlIHRoZSBsYXN0IHRocmVhZCBjYWxsaW5nIHRoaXMgbWV0aG9kLCB3ZSBzaWduYWwgdGhpcworICAgICAgLy90byB0aGUgb3RoZXIgdGhyZWFkKHMpIHRoYXQgbWlnaHQgYmUgd2FpdGluZzoKKyAgICAgIHByaW50ZigiVGhyZWFkICVkIHNpZ25hbFxuIiwgcmV0KTsKKyAgICAgIHB0aHJlYWRfY29uZF9zaWduYWwoJmNvbmRpdGlvbik7CisgICAgfQorCisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4KTsKKworICAgIHJldHVybiByZXQ7CisgIH0KKworICB0aHJlYWRfdmVjdG9yJiBnZXRUaHJlYWRWZWN0b3Ioc2l6ZV90IGluZGV4KSB7CisgICAgLy9XZSByZXR1cm4gb3RoZXIgdGhyZWFkIHRocmVhZF92ZWN0b3IgaW5zdGFuY2U6CisgICAgcmV0dXJuICp0aHJlYWRWZWN0b3JzWyhpbmRleCArIDEgPT0gdGhyZWFkVmVjdG9ycy5zaXplKCkpID8gMCA6IGluZGV4ICsgMV07CisgIH0KKworcHJpdmF0ZToKKyAgcHRocmVhZF9tdXRleF90IG11dGV4OworICBwdGhyZWFkX2NvbmRfdCBjb25kaXRpb247CisgIHZlY3Rvcjx0aHJlYWRfdmVjdG9yKj4gdGhyZWFkVmVjdG9yczsKK307CisKK3ZvaWQqIGYodm9pZCogcGRhdGFzKSB7CisgIFNoYXJlZERhdGFzICpwc2hhcmVkRGF0YXMgPSAoU2hhcmVkRGF0YXMqKXBkYXRhczsKKworICBpbnQgdGhyZWFkSW5kZXggPSBwc2hhcmVkRGF0YXMtPmluaXRUaHJlYWRWZWN0b3IoKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgKytpKSB7CisgICAgcHNoYXJlZERhdGFzLT5nZXRUaHJlYWRWZWN0b3IodGhyZWFkSW5kZXgpLnB1c2hfYmFjayhpKTsKKyAgfQorCisgIHJldHVybiAwOworfQorCit2b2lkIEFsbG9jYXRvclRlc3Q6OnBlcl90aHJlYWRfYWxsb2MoKQoreworICBjb25zdCBzaXplX3QgbnRoID0gMjsKKyAgU2hhcmVkRGF0YXMgZGF0YXMobnRoKTsKKyAgcHRocmVhZF90IHRbbnRoXTsKKworICBzaXplX3QgaTsKKyAgZm9yIChpID0gMDsgaSA8IG50aDsgKytpKSB7CisgICAgcHRocmVhZF9jcmVhdGUoJnRbaV0sIDAsIGYsICZkYXRhcyk7CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgbnRoOyArK2kgKSB7CisgICAgcHRocmVhZF9qb2luKHRbaV0sIDApOworICB9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9hc3NlcnRfaGVhZGVyX3Rlc3QuYyBiL3Rlc3QvdW5pdC9hc3NlcnRfaGVhZGVyX3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDc4ODc3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L2Fzc2VydF9oZWFkZXJfdGVzdC5jCkBAIC0wLDAgKzEsOCBAQAorLyogVGhpcyB0ZXN0IHB1cnBvc2UgaXMgc2ltcGx5IHRvIGNoZWNrIFN0YW5kYXJkIGhlYWRlciBpbmRlcGVuZGFuY3kgdGhhdAorICogaXMgdG8gc2F5IHRoYXQgdGhlIGhlYWRlciBjYW4gYmUgaW5jbHVkZWQgYWxvbmUgd2l0aG91dCBhbnkgcHJldmlvdXMKKyAqIGluY2x1ZGUuCisgKiBBZGRpdGlvbm5hbHksIGZvciBDIFN0YW5kYXJkIGhlYWRlcnMgdGhhdCBTVExwb3J0IGV4cG9zZSwgaXQgY2FuIGFsc28gYmUKKyAqIHVzZWQgdG8gY2hlY2sgdGhhdCBmaWxlcyBpbmNsdWRlZCBieSB0aG9zZSBoZWFkZXJzIGFyZSBjb21wYXRpYmxlIHdpdGgKKyAqIHB1cmUgQyBjb21waWxlcnMuCisgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9iY29tcG9zX3Rlc3QuY3BwIGIvdGVzdC91bml0L2Jjb21wb3NfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDExN2ZhYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9iY29tcG9zX3Rlc3QuY3BwCkBAIC0wLDAgKzEsNTUgQEAKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSAidW5hcnkuaCIKKworI2luY2x1ZGUgImNwcHVuaXQvY3BwdW5pdF9wcm94eS5oIgorCisjaWYgZGVmaW5lZChfU1RMUF9VU0VfTkFNRVNQQUNFUykKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisjZW5kaWYKKworLy8KKy8vIFRlc3RDYXNlIGNsYXNzCisvLworY2xhc3MgQmNvbXBvc1Rlc3QgOiBwdWJsaWMgQ1BQVU5JVF9OUzo6VGVzdENhc2UKK3sKKyAgQ1BQVU5JVF9URVNUX1NVSVRFKEJjb21wb3NUZXN0KTsKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKKyAgQ1BQVU5JVF9JR05PUkU7CisjZW5kaWYKKyAgQ1BQVU5JVF9URVNUKGJjb21wb3MxKTsKKyAgQ1BQVU5JVF9URVNUKGJjb21wb3MyKTsKKyAgQ1BQVU5JVF9URVNUX1NVSVRFX0VORCgpOworCitwcm90ZWN0ZWQ6CisgIHZvaWQgYmNvbXBvczEoKTsKKyAgdm9pZCBiY29tcG9zMigpOworfTsKKworQ1BQVU5JVF9URVNUX1NVSVRFX1JFR0lTVFJBVElPTihCY29tcG9zVGVzdCk7CisKKy8vCisvLyB0ZXN0cyBpbXBsZW1lbnRhdGlvbgorLy8KK3ZvaWQgQmNvbXBvc1Rlc3Q6OmJjb21wb3MxKCkKK3sKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKKyAgaW50IGFycmF5IFs2XSA9IHsgLTIsIC0xLCAwLCAxLCAyLCAzIH07CisKKyAgYmluYXJ5X2NvbXBvc2U8bG9naWNhbF9hbmQ8Ym9vbD4sIG9kZCwgcG9zaXRpdmU+CisgIGIgPSBiaW5hcnlfY29tcG9zZTxsb2dpY2FsX2FuZDxib29sPiwgb2RkLCBwb3NpdGl2ZT4obG9naWNhbF9hbmQ8Ym9vbD4oKSwgb2RkKCksIHBvc2l0aXZlKCkpOworCisgIGludCogcCA9IGZpbmRfaWYoKGludCopYXJyYXksIChpbnQqKWFycmF5ICsgNiwgYik7CisgIENQUFVOSVRfQVNTRVJUKHAgIT0gYXJyYXkgKyA2KTsKKyNlbmRpZgorfQorCit2b2lkIEJjb21wb3NUZXN0OjpiY29tcG9zMigpCit7CisjaWYgZGVmaW5lZCAoU1RMUE9SVCkgJiYgIWRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpCisgIGludCBhcnJheSBbNl0gPSB7IC0yLCAtMSAsIDAsIDEsIDIsIDMgfTsKKworICBpbnQqIHAgPSBmaW5kX2lmKChpbnQqKWFycmF5LCAoaW50KilhcnJheSArIDYsCisgIGNvbXBvc2UyKGxvZ2ljYWxfYW5kPGJvb2w+KCksIG9kZCgpLCBwb3NpdGl2ZSgpKSk7CisgIENQUFVOSVRfQVNTRVJUKHAgIT0gYXJyYXkgKyA2KTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L2JpbmRfdGVzdC5jcHAgYi90ZXN0L3VuaXQvYmluZF90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzczYmFhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L2JpbmRfdGVzdC5jcHAKQEAgLTAsMCArMSwxNDkgQEAKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKworI2luY2x1ZGUgImNwcHVuaXQvY3BwdW5pdF9wcm94eS5oIgorCisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IGRlZmluZWQoX1NUTFBfVVNFX05BTUVTUEFDRVMpCit1c2luZyBuYW1lc3BhY2Ugc3RkOworI2VuZGlmCisKKy8vCisvLyBUZXN0Q2FzZSBjbGFzcworLy8KK2NsYXNzIEJpbmRUZXN0IDogcHVibGljIENQUFVOSVRfTlM6OlRlc3RDYXNlCit7CisgIENQUFVOSVRfVEVTVF9TVUlURShCaW5kVGVzdCk7CisgIENQUFVOSVRfVEVTVChiaW5kMXN0MSk7CisgIENQUFVOSVRfVEVTVChiaW5kMm5kMSk7CisgIENQUFVOSVRfVEVTVChiaW5kMm5kMik7CisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IFwKKyAgICBkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKSB8fCAhZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikKKyAgQ1BQVU5JVF9JR05PUkU7CisjZW5kaWYKKyAgQ1BQVU5JVF9URVNUKGJpbmQybmQzKTsKKyAgQ1BQVU5JVF9URVNUKGJpbmRfbWVtZm4pOworICBDUFBVTklUX1RFU1RfU1VJVEVfRU5EKCk7CisKK3Byb3RlY3RlZDoKKyAgdm9pZCBiaW5kMXN0MSgpOworICB2b2lkIGJpbmQybmQxKCk7CisgIHZvaWQgYmluZDJuZDIoKTsKKyAgdm9pZCBiaW5kMm5kMygpOworICB2b2lkIGJpbmRfbWVtZm4oKTsKK307CisKK0NQUFVOSVRfVEVTVF9TVUlURV9SRUdJU1RSQVRJT04oQmluZFRlc3QpOworCitjbGFzcyBwcmVfaW5jcmVtZW50IDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxpbnQsIGludCwgaW50PiB7CitwdWJsaWM6CisgIGludCBvcGVyYXRvcigpKGludCBpbmNyLCBpbnQmIHZhbCkgY29uc3QKKyAgeyByZXR1cm4gdmFsICs9IGluY3I7IH0KK307CisKK2NsYXNzIHBvc3RfaW5jcmVtZW50IDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxpbnQsIGludCwgaW50PiB7CitwdWJsaWM6CisgIGludCBvcGVyYXRvcigpKGludCYgdmFsLCBpbnQgaW5jcikgY29uc3QKKyAgeyByZXR1cm4gdmFsICs9IGluY3I7IH0KK307CisKKworLy8KKy8vIHRlc3RzIGltcGxlbWVudGF0aW9uCisvLwordm9pZCBCaW5kVGVzdDo6YmluZDFzdDEoKQoreworICBpbnQgYXJyYXkgWzNdID0geyAxLCAyLCAzIH07CisgIGludCogcCA9IHJlbW92ZV9pZigoaW50KilhcnJheSwgKGludCopYXJyYXkgKyAzLCBiaW5kMXN0KGxlc3M8aW50PigpLCAyKSk7CisKKyAgQ1BQVU5JVF9BU1NFUlQocCA9PSAmYXJyYXlbMl0pOworICBDUFBVTklUX0FTU0VSVChhcnJheVswXSA9PSAxKTsKKyAgQ1BQVU5JVF9BU1NFUlQoYXJyYXlbMV0gPT0gMik7CisKKyAgZm9yX2VhY2goKGludCopYXJyYXksIChpbnQqKWFycmF5ICsgMywgYmluZDFzdChwcmVfaW5jcmVtZW50KCksIDEpKTsKKyAgQ1BQVU5JVF9BU1NFUlQoYXJyYXlbMF0gPT0gMik7CisgIENQUFVOSVRfQVNTRVJUKGFycmF5WzFdID09IDMpOworICBDUFBVTklUX0FTU0VSVChhcnJheVsyXSA9PSA0KTsKKworICBmb3JfZWFjaCgoaW50KilhcnJheSwgKGludCopYXJyYXkgKyAzLCBiaW5kMm5kKHBvc3RfaW5jcmVtZW50KCksIDEpKTsKKyAgQ1BQVU5JVF9BU1NFUlQoYXJyYXlbMF0gPT0gMyk7CisgIENQUFVOSVRfQVNTRVJUKGFycmF5WzFdID09IDQpOworICBDUFBVTklUX0FTU0VSVChhcnJheVsyXSA9PSA1KTsKK30KKwordm9pZCBCaW5kVGVzdDo6YmluZDJuZDEoKQoreworICBpbnQgYXJyYXkgWzNdID0geyAxLCAyLCAzIH07CisgIHJlcGxhY2VfaWYoYXJyYXksIGFycmF5ICsgMywgYmluZGVyMm5kPGdyZWF0ZXI8aW50PiA+KGdyZWF0ZXI8aW50PigpLCAyKSwgNCk7CisKKyAgQ1BQVU5JVF9BU1NFUlQoYXJyYXlbMF09PTEpOworICBDUFBVTklUX0FTU0VSVChhcnJheVsxXT09Mik7CisgIENQUFVOSVRfQVNTRVJUKGFycmF5WzJdPT00KTsKK30KK3ZvaWQgQmluZFRlc3Q6OmJpbmQybmQyKCkKK3sKKyAgaW50IGFycmF5IFszXSA9IHsgMSwgMiwgMyB9OworICByZXBsYWNlX2lmKGFycmF5LCBhcnJheSArIDMsIGJpbmQybmQoZ3JlYXRlcjxpbnQ+KCksIDIpLCA0KTsKKyAgQ1BQVU5JVF9BU1NFUlQoYXJyYXlbMF09PTEpOworICBDUFBVTklUX0FTU0VSVChhcnJheVsxXT09Mik7CisgIENQUFVOSVRfQVNTRVJUKGFycmF5WzJdPT00KTsKK30KKworaW50IHRlc3RfZnVuYzEgKGNvbnN0IGludCAmcGFyYW0xLCBjb25zdCBpbnQgJnBhcmFtMikgeworICByZXR1cm4gcGFyYW0xICsgcGFyYW0yOworfQorCitpbnQgdGVzdF9mdW5jMiAoaW50ICZwYXJhbTEsIGludCBwYXJhbTIpIHsKKyAgcGFyYW0xICs9IHBhcmFtMjsKKyAgcmV0dXJuIHBhcmFtMSArIHBhcmFtMjsKK30KKwordm9pZCBCaW5kVGVzdDo6YmluZDJuZDMoKQoreworI2lmIGRlZmluZWQgKFNUTFBPUlQpICYmIFwKKyAgICAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykgJiYgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikKKyAgaW50IGFycmF5WzNdID0geyAxLCAyLCAzIH07CisgIHRyYW5zZm9ybShhcnJheSwgYXJyYXkgKyAzLCBhcnJheSwgYmluZDJuZChwdHJfZnVuKHRlc3RfZnVuYzEpLCAxKSk7CisgIHRyYW5zZm9ybShhcnJheSwgYXJyYXkgKyAzLCBhcnJheSwgYmluZDFzdChwdHJfZnVuKHRlc3RfZnVuYzEpLCAtMSkpOworICBDUFBVTklUX0FTU0VSVChhcnJheVswXSA9PSAxKTsKKyAgQ1BQVU5JVF9BU1NFUlQoYXJyYXlbMV0gPT0gMik7CisgIENQUFVOSVRfQVNTRVJUKGFycmF5WzJdID09IDMpOworCisgIHRyYW5zZm9ybShhcnJheSwgYXJyYXkgKyAzLCBhcnJheSwgYmluZDJuZChwdHJfZnVuKHRlc3RfZnVuYzIpLCAxMCkpOworICBDUFBVTklUX0FTU0VSVChhcnJheVswXSA9PSAyMSk7CisgIENQUFVOSVRfQVNTRVJUKGFycmF5WzFdID09IDIyKTsKKyAgQ1BQVU5JVF9BU1NFUlQoYXJyYXlbMl0gPT0gMjMpOworI2VuZGlmCit9CisKK2NsYXNzIEEKK3sKKyAgcHVibGljOgorICAgIEEoKSA6IG1fbiggMCApCisgICAge30KKworICAgIHZvaWQgZiggaW50IG4gKSBjb25zdCB7CisjaWYgZGVmaW5lZCAoU1RMUE9SVCkKKyAgICAgIF9TVExQX01VVEFCTEUoQSwgbV9uKSA9IG47CisjZWxzZQorICAgICAgbV9uID0gbjsKKyNlbmRpZgorICAgIH0KKworICAgIGludCB2KCkgY29uc3QKKyAgICB7IHJldHVybiBtX247IH0KKworICBwcml2YXRlOgorICAgIG11dGFibGUgaW50IG1fbjsKK307CisKK3ZvaWQgQmluZFRlc3Q6OmJpbmRfbWVtZm4oKQoreworI2lmIGRlZmluZWQgKFNUTFBPUlQpICYmIFwKKyAgICAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykgJiYgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikKKyAgQSBhcnJheVszXTsKKworICBmb3JfZWFjaCggYXJyYXksIGFycmF5ICsgMywgYmluZDJuZCggbWVtX2Z1bl9yZWYoJkE6OmYpLCAxMiApICk7CisKKyAgQ1BQVU5JVF9DSEVDSyggYXJyYXlbMF0udigpID09IDEyICk7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9iaW5zZXJ0X3Rlc3QuY3BwIGIvdGVzdC91bml0L2JpbnNlcnRfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA4NWE1YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9iaW5zZXJ0X3Rlc3QuY3BwCkBAIC0wLDAgKzEsNTQgQEAKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSAiY3BwdW5pdC9jcHB1bml0X3Byb3h5LmgiCisKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZChfU1RMUF9VU0VfTkFNRVNQQUNFUykKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisjZW5kaWYKKworLy8KKy8vIFRlc3RDYXNlIGNsYXNzCisvLworY2xhc3MgQmluc2VydFRlc3QgOiBwdWJsaWMgQ1BQVU5JVF9OUzo6VGVzdENhc2UKK3sKKyAgQ1BQVU5JVF9URVNUX1NVSVRFKEJpbnNlcnRUZXN0KTsKKyAgQ1BQVU5JVF9URVNUKGJpbnNlcnQxKTsKKyAgQ1BQVU5JVF9URVNUKGJpbnNlcnQyKTsKKyAgQ1BQVU5JVF9URVNUX1NVSVRFX0VORCgpOworCitwcm90ZWN0ZWQ6CisgIHZvaWQgYmluc2VydDEoKTsKKyAgdm9pZCBiaW5zZXJ0MigpOworfTsKKworQ1BQVU5JVF9URVNUX1NVSVRFX1JFR0lTVFJBVElPTihCaW5zZXJ0VGVzdCk7CisKKy8vCisvLyB0ZXN0cyBpbXBsZW1lbnRhdGlvbgorLy8KK3ZvaWQgQmluc2VydFRlc3Q6OmJpbnNlcnQxKCkKK3sKKyAgY29uc3QgY2hhciogYXJyYXkgW10gPSB7ICJsYXVyaWUiLCAiamVubmlmZXIiLCAibGVpc2EiIH07CisgIHZlY3Rvcjxjb25zdCBjaGFyKj4gbmFtZXM7CisgIGJhY2tfaW5zZXJ0X2l0ZXJhdG9yPHZlY3Rvcjxjb25zdCBjaGFyKj4gPiBiaXQobmFtZXMpOworICBiaXQgPSBjb3B5KGFycmF5LCBhcnJheSArIDMsIGJpdCk7CisKKyAgQ1BQVU5JVF9BU1NFUlQoIXN0cmNtcChuYW1lc1swXSxhcnJheVswXSkpOworICBDUFBVTklUX0FTU0VSVCghc3RyY21wKG5hbWVzWzFdLGFycmF5WzFdKSk7CisgIENQUFVOSVRfQVNTRVJUKCFzdHJjbXAobmFtZXNbMl0sYXJyYXlbMl0pKTsKKworICBjb3B5KGFycmF5LCBhcnJheSArIDMsIGJpdCk7CisgIENQUFVOSVRfQVNTRVJUKCFzdHJjbXAobmFtZXNbM10sYXJyYXlbMF0pKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIXN0cmNtcChuYW1lc1s0XSxhcnJheVsxXSkpOworICBDUFBVTklUX0FTU0VSVCghc3RyY21wKG5hbWVzWzVdLGFycmF5WzJdKSk7Cit9Cit2b2lkIEJpbnNlcnRUZXN0OjpiaW5zZXJ0MigpCit7CisgIGNvbnN0IGNoYXIqIGFycmF5IFtdID0geyAibGF1cmllIiwgImplbm5pZmVyIiwgImxlaXNhIiB9OworICB2ZWN0b3I8Y29uc3QgY2hhcio+IG5hbWVzOworICBjb3B5KGFycmF5LCBhcnJheSArIDMsIGJhY2tfaW5zZXJ0ZXIobmFtZXMpKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIXN0cmNtcChuYW1lc1swXSxhcnJheVswXSkpOworICBDUFBVTklUX0FTU0VSVCghc3RyY21wKG5hbWVzWzFdLGFycmF5WzFdKSk7CisgIENQUFVOSVRfQVNTRVJUKCFzdHJjbXAobmFtZXNbMl0sYXJyYXlbMl0pKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9iaXRzZXRfaGVhZGVyX3Rlc3QuY3BwIGIvdGVzdC91bml0L2JpdHNldF9oZWFkZXJfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJkNWNjMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9iaXRzZXRfaGVhZGVyX3Rlc3QuY3BwCkBAIC0wLDAgKzEsOCBAQAorLyogVGhpcyB0ZXN0IHB1cnBvc2UgaXMgc2ltcGx5IHRvIGNoZWNrIFN0YW5kYXJkIGhlYWRlciBpbmRlcGVuZGFuY3kgdGhhdAorICogaXMgdG8gc2F5IHRoYXQgdGhlIGhlYWRlciBjYW4gYmUgaW5jbHVkZWQgYWxvbmUgd2l0aG91dCBhbnkgcHJldmlvdXMKKyAqIGluY2x1ZGUuCisgKiBBZGRpdGlvbm5hbHksIGZvciBDIFN0YW5kYXJkIGhlYWRlcnMgdGhhdCBTVExwb3J0IGV4cG9zZSwgaXQgY2FuIGFsc28gYmUKKyAqIHVzZWQgdG8gY2hlY2sgdGhhdCBmaWxlcyBpbmNsdWRlZCBieSB0aG9zZSBoZWFkZXJzIGFyZSBjb21wYXRpYmxlIHdpdGgKKyAqIHB1cmUgQyBjb21waWxlcnMuCisgKi8KKyNpbmNsdWRlIDxiaXRzZXQ+CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvYml0c2V0X3Rlc3QuY3BwIGIvdGVzdC91bml0L2JpdHNldF90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDFmNjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L2JpdHNldF90ZXN0LmNwcApAQCAtMCwwICsxLDExMCBAQAorI2luY2x1ZGUgPGJpdHNldD4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8ICFkZWZpbmVkIChfU1RMUF9VU0VfTk9fSU9TVFJFQU1TKQorIyAgaW5jbHVkZSA8c3N0cmVhbT4KKyNlbmRpZgorCisjaW5jbHVkZSAiY3BwdW5pdC9jcHB1bml0X3Byb3h5LmgiCisKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZChfU1RMUF9VU0VfTkFNRVNQQUNFUykKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisjZW5kaWYKKworLy8KKy8vIFRlc3RDYXNlIGNsYXNzCisvLworY2xhc3MgQml0c2V0VGVzdCA6IHB1YmxpYyBDUFBVTklUX05TOjpUZXN0Q2FzZQoreworICBDUFBVTklUX1RFU1RfU1VJVEUoQml0c2V0VGVzdCk7CisgIENQUFVOSVRfVEVTVChiaXRzZXQxKTsKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiBkZWZpbmVkIChfU1RMUF9VU0VfTk9fSU9TVFJFQU1TKQorICBDUFBVTklUX0lHTk9SRTsKKyNlbmRpZgorICBDUFBVTklUX1RFU1QoaW9zdHJlYW0pOworICBDUFBVTklUX1RFU1RfU1VJVEVfRU5EKCk7CisKK3Byb3RlY3RlZDoKKyAgdm9pZCBiaXRzZXQxKCk7CisgIHZvaWQgaW9zdHJlYW0oKTsKK307CisKK0NQUFVOSVRfVEVTVF9TVUlURV9SRUdJU1RSQVRJT04oQml0c2V0VGVzdCk7CisKKy8vCisvLyB0ZXN0cyBpbXBsZW1lbnRhdGlvbgorLy8KK3ZvaWQgQml0c2V0VGVzdDo6Yml0c2V0MSgpCit7CisgIGJpdHNldDwxM1U+IGIxKDB4RkZGRik7CisgIGJpdHNldDwxM1U+IGIyKDB4MTExMSk7CisgIENQUFVOSVRfQVNTRVJUKGIxLnNpemUoKSA9PSAxMyk7CisgIENQUFVOSVRfQVNTRVJUKGIxID09IDB4MUZGRik7CisgIENQUFVOSVRfQVNTRVJUKGIyLnNpemUoKSA9PSAxMyk7CisgIENQUFVOSVRfQVNTRVJUKGIyID09IDB4MTExMSk7CisKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgIWRlZmluZWQgKF9TVExQX05PTl9UWVBFX1RNUExfUEFSQU1fQlVHKQorICBiMSA9IGIxIF4gKGIyIDw8IDIpOworICBDUFBVTklUX0FTU0VSVChiMSA9PSAweDFCQkIpOworCisgIENQUFVOSVRfQVNTRVJUKGIxLmNvdW50KCkgPT0gMTApOworICBDUFBVTklUX0FTU0VSVChiMi5jb3VudCgpID09IDQpOworCisjICBpZiBkZWZpbmVkIChTVExQT1JUKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKKyAgc2l6ZV90IF9fcG9zID0gYjIuX0ZpbmRfZmlyc3QoKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIF9fcG9zID09IDAgKTsKKyAgX19wb3MgPSBiMi5fRmluZF9uZXh0KF9fcG9zKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIF9fcG9zID09IDQgKTsKKyAgX19wb3MgPSBiMi5fRmluZF9uZXh0KF9fcG9zKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIF9fcG9zID09IDggKTsKKyAgX19wb3MgPSBiMi5fRmluZF9uZXh0KF9fcG9zKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIF9fcG9zID09IDEyICk7CisgIF9fcG9zID0gYjIuX0ZpbmRfbmV4dChfX3Bvcyk7CisgIENQUFVOSVRfQVNTRVJUKCBfX3BvcyA9PSAxMyApOworIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8ICFkZWZpbmVkIChfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVTKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhQTElDSVRfRlVOQ1RJT05fVE1QTF9BUkdTKQorICBzdHJpbmcgcmVwcmVzZW50YXRpb24gPSBiMi50b19zdHJpbmc8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4sIGFsbG9jYXRvcjxjaGFyPiA+KCk7CisgIENQUFVOSVRfQVNTRVJUKCByZXByZXNlbnRhdGlvbiA9PSAiMTAwMDEwMDAxMDAwMSIgKTsKKyMgIGlmICFkZWZpbmVkIChTVExQT1JUKSB8fCAhZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkKKyAgd3N0cmluZyB3cmVwcmVzZW50YXRpb24gPSBiMi50b19zdHJpbmc8d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4sIGFsbG9jYXRvcjx3Y2hhcl90PiA+KCk7CisgIENQUFVOSVRfQVNTRVJUKCB3cmVwcmVzZW50YXRpb24gPT0gTCIxMDAwMTAwMDEwMDAxIiApOworIyAgZW5kaWYKKyNlbHNlCisgIENQUFVOSVRfQVNTRVJUKCBiMi50b19zdHJpbmcoKSA9PSAiMTAwMDEwMDAxMDAwMSIgKTsKKyNlbmRpZgorfQorCit2b2lkIEJpdHNldFRlc3Q6Omlvc3RyZWFtKCkKK3sKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgIWRlZmluZWQgKF9TVExQX1VTRV9OT19JT1NUUkVBTVMpCisgIHsKKyAgICBzdHJpbmdzdHJlYW0gc3N0cjsKKyAgICBiaXRzZXQ8MTNVPiBiKDB4MTExMSk7CisgICAgc3N0ciA8PCBiOworICAgIENQUFVOSVRfQVNTRVJUKCBzc3RyLnN0cigpID09ICIxMDAwMTAwMDEwMDAxIiApOworCisgICAgYml0c2V0PDEzVT4gYjE7CisgICAgc3N0ciA+PiBiMTsKKyAgICBDUFBVTklUX0FTU0VSVCggYjEudGVzdCgwKSApOworICAgIENQUFVOSVRfQVNTRVJUKCBiMS50ZXN0KDQpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGIxLnRlc3QoOCkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggYjEudGVzdCgxMikgKTsKKyAgfQorIyAgaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8ICFkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQorICB7CisgICAgd3N0cmluZ3N0cmVhbSBzc3RyOworICAgIGJpdHNldDwxM1U+IGIoMHgxMTExKTsKKyAgICBzc3RyIDw8IGI7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHNzdHIuc3RyKCkgPT0gTCIxMDAwMTAwMDEwMDAxIiApOworCisgICAgYml0c2V0PDEzVT4gYjE7CisgICAgc3N0ciA+PiBiMTsKKyAgICBDUFBVTklUX0FTU0VSVCggYjEudGVzdCgwKSApOworICAgIENQUFVOSVRfQVNTRVJUKCBiMS50ZXN0KDQpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGIxLnRlc3QoOCkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggYjEudGVzdCgxMikgKTsKKyAgfQorIyAgZW5kaWYKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L2JuZWdhdGVfdGVzdC5jcHAgYi90ZXN0L3VuaXQvYm5lZ2F0ZV90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODhiMDM2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L2JuZWdhdGVfdGVzdC5jcHAKQEAgLTAsMCArMSw0OCBAQAorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCisjaW5jbHVkZSAiY3BwdW5pdC9jcHB1bml0X3Byb3h5LmgiCisKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZChfU1RMUF9VU0VfTkFNRVNQQUNFUykKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisjZW5kaWYKKworLy8KKy8vIFRlc3RDYXNlIGNsYXNzCisvLworY2xhc3MgQm5lZ2F0ZVRlc3QgOiBwdWJsaWMgQ1BQVU5JVF9OUzo6VGVzdENhc2UKK3sKKyAgQ1BQVU5JVF9URVNUX1NVSVRFKEJuZWdhdGVUZXN0KTsKKyAgQ1BQVU5JVF9URVNUKGJuZWdhdGUxKTsKKyAgQ1BQVU5JVF9URVNUKGJuZWdhdGUyKTsKKyAgQ1BQVU5JVF9URVNUX1NVSVRFX0VORCgpOworCitwcm90ZWN0ZWQ6CisgIHZvaWQgYm5lZ2F0ZTEoKTsKKyAgdm9pZCBibmVnYXRlMigpOworfTsKKworQ1BQVU5JVF9URVNUX1NVSVRFX1JFR0lTVFJBVElPTihCbmVnYXRlVGVzdCk7CisKKy8vCisvLyB0ZXN0cyBpbXBsZW1lbnRhdGlvbgorLy8KK3ZvaWQgQm5lZ2F0ZVRlc3Q6OmJuZWdhdGUxKCkKK3sKKyAgaW50IGFycmF5IFs0XSA9IHsgNCwgOSwgNywgMSB9OworCisgIHNvcnQoYXJyYXksIGFycmF5ICsgNCwgYmluYXJ5X25lZ2F0ZTxncmVhdGVyPGludD4gPihncmVhdGVyPGludD4oKSkpOworICBDUFBVTklUX0FTU0VSVChhcnJheVswXT09MSk7CisgIENQUFVOSVRfQVNTRVJUKGFycmF5WzFdPT00KTsKKyAgQ1BQVU5JVF9BU1NFUlQoYXJyYXlbMl09PTcpOworICBDUFBVTklUX0FTU0VSVChhcnJheVszXT09OSk7Cit9Cit2b2lkIEJuZWdhdGVUZXN0OjpibmVnYXRlMigpCit7CisgIGludCBhcnJheSBbNF0gPSB7IDQsIDksIDcsIDEgfTsKKyAgc29ydChhcnJheSwgYXJyYXkgKyA0LCBub3QyKGdyZWF0ZXI8aW50PigpKSk7CisgIENQUFVOSVRfQVNTRVJUKGFycmF5WzBdPT0xKTsKKyAgQ1BQVU5JVF9BU1NFUlQoYXJyYXlbMV09PTQpOworICBDUFBVTklUX0FTU0VSVChhcnJheVsyXT09Nyk7CisgIENQUFVOSVRfQVNTRVJUKGFycmF5WzNdPT05KTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9ib29zdF9jaGVjay5jcHAgYi90ZXN0L3VuaXQvYm9vc3RfY2hlY2suY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZjdiOTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvYm9vc3RfY2hlY2suY3BwCkBAIC0wLDAgKzEsNDkgQEAKKyNpZm5kZWYgV0lUSE9VVF9TVExQT1JUIAorI2luY2x1ZGUgPHN0bC9jb25maWcvdXNlcl9jb25maWcuaD4KKworI2lmZGVmIF9TVExQX1VTRV9CT09TVF9TVVBQT1JUCisKKyNpbmNsdWRlIDxib29zdC9jb25maWcuaHBwPgorCisjZW5kaWYgLy8gX1NUTFBfVVNFX0JPT1NUX1NVUFBPUlQKKworI2Vsc2UKKworI2lmIDAgLy8gUHJvYmxlbSAxOgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLi4vLi4vLi4vc3RscG9ydC9mdW5jdGlvbmFsOjYzOiBlcnJvcjogJ2Jvb3N0OjptZW1fZm4nIGhhcyBub3QgYmVlbiBkZWNsYXJlZAorLi4vLi4vLi4vc3RscG9ydC9mdW5jdGlvbmFsOjY0OiBlcnJvcjogJ2Jvb3N0OjpiaW5kJyBoYXMgbm90IGJlZW4gZGVjbGFyZWQKKy4uLy4uLy4uL3N0bHBvcnQvZnVuY3Rpb25hbDo2NzogZXJyb3I6ICc6Ol8xJyBoYXMgbm90IGJlZW4gZGVjbGFyZWQKKy4uLy4uLy4uL3N0bHBvcnQvZnVuY3Rpb25hbDo2ODogZXJyb3I6ICc6Ol8yJyBoYXMgbm90IGJlZW4gZGVjbGFyZWQKKy4uLy4uLy4uL3N0bHBvcnQvZnVuY3Rpb25hbDo2OTogZXJyb3I6ICc6Ol8zJyBoYXMgbm90IGJlZW4gZGVjbGFyZWQKKy4uLy4uLy4uL3N0bHBvcnQvZnVuY3Rpb25hbDo3MDogZXJyb3I6ICc6Ol80JyBoYXMgbm90IGJlZW4gZGVjbGFyZWQKKy4uLy4uLy4uL3N0bHBvcnQvZnVuY3Rpb25hbDo3MTogZXJyb3I6ICc6Ol81JyBoYXMgbm90IGJlZW4gZGVjbGFyZWQKKy4uLy4uLy4uL3N0bHBvcnQvZnVuY3Rpb25hbDo3MjogZXJyb3I6ICc6Ol82JyBoYXMgbm90IGJlZW4gZGVjbGFyZWQKKy4uLy4uLy4uL3N0bHBvcnQvZnVuY3Rpb25hbDo3MzogZXJyb3I6ICc6Ol83JyBoYXMgbm90IGJlZW4gZGVjbGFyZWQKKy4uLy4uLy4uL3N0bHBvcnQvZnVuY3Rpb25hbDo3NDogZXJyb3I6ICc6Ol84JyBoYXMgbm90IGJlZW4gZGVjbGFyZWQKKy4uLy4uLy4uL3N0bHBvcnQvZnVuY3Rpb25hbDo3NTogZXJyb3I6ICc6Ol85JyBoYXMgbm90IGJlZW4gZGVjbGFyZWQKKyAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2luY2x1ZGUgPGJvb3N0L2JpbmQuaHBwPgorCisjZW5kaWYgLy8gUHJvYmxlbSAxCisKKyNpZiAwIC8vIFByb2JsZW0gMgorCisjaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24uaHBwPgorCisjZW5kaWYgLy8gUHJvYmxlbSAyCisKKyNpZiAwIC8vIFByb2JsZW0gMworCisjaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24vZnVuY3Rpb25fYmFzZS5ocHA+CisKKyNlbmRpZiAvLyBQcm9ibGVtIDMKKworI2lmIDAgLy8gUHJvYmxlbSA0CisKKyNpbmNsdWRlIDxib29zdC9mdW5jdGlvbi9mdW5jdGlvbjEuaHBwPgorCisjZW5kaWYgLy8gUHJvYmxlbSA0CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L2JvdW5kX3Rlc3QuY3BwIGIvdGVzdC91bml0L2JvdW5kX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3Y2M2ZTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvYm91bmRfdGVzdC5jcHAKQEAgLTAsMCArMSw4MCBAQAorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpbmNsdWRlICJjcHB1bml0L2NwcHVuaXRfcHJveHkuaCIKKworI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkKF9TVExQX1VTRV9OQU1FU1BBQ0VTKQordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyNlbmRpZgorCisvLworLy8gVGVzdENhc2UgY2xhc3MKKy8vCitjbGFzcyBCb3VuZFRlc3QgOiBwdWJsaWMgQ1BQVU5JVF9OUzo6VGVzdENhc2UKK3sKKyAgQ1BQVU5JVF9URVNUX1NVSVRFKEJvdW5kVGVzdCk7CisgIENQUFVOSVRfVEVTVChsd3JibmQxKTsKKyAgQ1BQVU5JVF9URVNUKGx3cmJuZDIpOworICBDUFBVTklUX1RFU1QodXByYm5kMSk7CisgIENQUFVOSVRfVEVTVCh1cHJibmQyKTsKKyAgQ1BQVU5JVF9URVNUX1NVSVRFX0VORCgpOworCitwcm90ZWN0ZWQ6CisgIHZvaWQgbHdyYm5kMSgpOworICB2b2lkIGx3cmJuZDIoKTsKKyAgdm9pZCB1cHJibmQxKCk7CisgIHZvaWQgdXByYm5kMigpOworCisgIHN0YXRpYyBib29sIGNoYXJfc3RyX2xlc3MoY29uc3QgY2hhciogYV8sIGNvbnN0IGNoYXIqIGJfKQorICB7CisgICAgcmV0dXJuIHN0cmNtcChhXywgYl8pIDwgMCA/IDEgOiAwOworICB9Cit9OworCitDUFBVTklUX1RFU1RfU1VJVEVfUkVHSVNUUkFUSU9OKEJvdW5kVGVzdCk7CisKKy8vCisvLyB0ZXN0cyBpbXBsZW1lbnRhdGlvbgorLy8KK3ZvaWQgQm91bmRUZXN0Ojp1cHJibmQxKCkKK3sKKyAgaW50IGFyclsyMF07CisgIGZvcihpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKQorICB7CisgICAgYXJyW2ldID0gaS80OworICB9CisgIGludCBsb2NhdGlvbiA9IHVwcGVyX2JvdW5kKChpbnQqKWFyciwgKGludCopYXJyICsgMjAsIDMpIC0gYXJyOworICBDUFBVTklUX0FTU0VSVChsb2NhdGlvbj09MTYpOworfQorCit2b2lkIEJvdW5kVGVzdDo6dXByYm5kMigpCit7CisgIGNoYXIgY29uc3QqIHN0ciBbXSA9IHsgImEiLCAiYSIsICJiIiwgImIiLCAicSIsICJ3IiwgInoiIH07CisKKyAgY29uc3QgdW5zaWduZWQgc3RyQ3QgPSBzaXplb2Yoc3RyKS9zaXplb2Yoc3RyWzBdKTsKKworICBpbnQgbG9jYXRpb24gPSAodXBwZXJfYm91bmQoKGNoYXIgY29uc3QqKilzdHIsICAoY2hhciBjb25zdCoqKXN0ciArIHN0ckN0LCAoY29uc3QgY2hhciAqKSJkIiwgY2hhcl9zdHJfbGVzcykgLSBzdHIpOworICBDUFBVTklUX0FTU0VSVChsb2NhdGlvbj09NCk7Cit9Cit2b2lkIEJvdW5kVGVzdDo6bHdyYm5kMSgpCit7CisgIHZlY3RvciA8aW50PiB2MSgyMCk7CisgIGZvciAoaW50IGkgPSAwOyAoc2l6ZV90KWkgPCB2MS5zaXplKCk7ICsraSkKKyAgeworICAgIHYxW2ldID0gaS80OworICB9CisgIC8vIDAgMCAwIDAgMSAxIDEgMSAyIDIgMiAyIDMgMyAzIDMgNCA0IDQgNAorICB2ZWN0b3I8aW50Pjo6aXRlcmF0b3IgbG9jYXRpb24gPSBsb3dlcl9ib3VuZCh2MS5iZWdpbigpLCB2MS5lbmQoKSwgMyk7CisKKyAgQ1BQVU5JVF9BU1NFUlQoKGxvY2F0aW9uIC0gdjEuYmVnaW4oKSk9PTEyKTsKK30KKwordm9pZCBCb3VuZFRlc3Q6Omx3cmJuZDIoKQoreworICBjaGFyIGNvbnN0KiBzdHIgW10gPSB7ICJhIiwgImEiLCAiYiIsICJiIiwgInEiLCAidyIsICJ6IiB9OworCisgIGNvbnN0IHVuc2lnbmVkIHN0ckN0ID0gc2l6ZW9mKHN0cikvc2l6ZW9mKHN0clswXSk7CisgIGNoYXIgY29uc3QqKiBsb2NhdGlvbiA9IGxvd2VyX2JvdW5kKChjaGFyIGNvbnN0Kiopc3RyLCAgKGNoYXIgY29uc3QqKilzdHIgKyBzdHJDdCwgKGNvbnN0IGNoYXIgKikiZCIsIGNoYXJfc3RyX2xlc3MpOworCisgIENQUFVOSVRfQVNTRVJUKChsb2NhdGlvbiAtIHN0cikgPT0gNCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvYnNlYXJjaF90ZXN0LmNwcCBiL3Rlc3QvdW5pdC9ic2VhcmNoX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ZGNjMDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvYnNlYXJjaF90ZXN0LmNwcApAQCAtMCwwICsxLDQ5IEBACisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSAiY3BwdW5pdC9jcHB1bml0X3Byb3h5LmgiCisKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZChfU1RMUF9VU0VfTkFNRVNQQUNFUykKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisjZW5kaWYKKworLy8KKy8vIFRlc3RDYXNlIGNsYXNzCisvLworY2xhc3MgQnNlYXJjaFRlc3QgOiBwdWJsaWMgQ1BQVU5JVF9OUzo6VGVzdENhc2UKK3sKKyAgQ1BQVU5JVF9URVNUX1NVSVRFKEJzZWFyY2hUZXN0KTsKKyAgQ1BQVU5JVF9URVNUKGJzZWFyY2gxKTsKKyAgQ1BQVU5JVF9URVNUKGJzZWFyY2gyKTsKKyAgQ1BQVU5JVF9URVNUX1NVSVRFX0VORCgpOworCitwcm90ZWN0ZWQ6CisgIHZvaWQgYnNlYXJjaDEoKTsKKyAgdm9pZCBic2VhcmNoMigpOworICBzdGF0aWMgYm9vbCBzdHJfY29tcGFyZShjb25zdCBjaGFyKiBhXywgY29uc3QgY2hhciogYl8pOworfTsKKworQ1BQVU5JVF9URVNUX1NVSVRFX1JFR0lTVFJBVElPTihCc2VhcmNoVGVzdCk7CisKKy8vCisvLyB0ZXN0cyBpbXBsZW1lbnRhdGlvbgorLy8KK3ZvaWQgQnNlYXJjaFRlc3Q6OmJzZWFyY2gxKCkKK3sKKyAgaW50IHZlY3RvclsxMDBdOworICBmb3IoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspCisgICAgdmVjdG9yW2ldID0gaTsKKyAgQ1BQVU5JVF9BU1NFUlQoYmluYXJ5X3NlYXJjaCh2ZWN0b3IsIHZlY3RvciArIDEwMCwgNDIpKTsKK30KKwordm9pZCBCc2VhcmNoVGVzdDo6YnNlYXJjaDIoKQoreworICBjaGFyIGNvbnN0KiBsYWJlbHNbXSA9IHsgImFhIiwgImRkIiwgImZmIiwgImpqIiwgInNzIiwgInp6IiB9OworICBjb25zdCB1bnNpZ25lZCBjb3VudCA9IHNpemVvZihsYWJlbHMpIC8gc2l6ZW9mKGxhYmVsc1swXSk7CisgIC8vIERFQyBDKysgZ2VuZXJhdGVzIGluY29ycmVjdCB0ZW1wbGF0ZSBpbnN0YXRpYXRpb24gY29kZQorICAvLyBmb3IgImZmIiBzbyBtdXN0IGNhc3QKKyAgQ1BQVU5JVF9BU1NFUlQoYmluYXJ5X3NlYXJjaChsYWJlbHMsIGxhYmVscyArIGNvdW50LCAoY29uc3QgY2hhciAqKSJmZiIsIHN0cl9jb21wYXJlKSk7Cit9Citib29sIEJzZWFyY2hUZXN0OjpzdHJfY29tcGFyZShjb25zdCBjaGFyKiBhXywgY29uc3QgY2hhciogYl8pCit7CisgIHJldHVybiBzdHJjbXAoYV8sIGJfKSA8IDAgPyAxIDogMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9idmVjdG9yX3Rlc3QuY3BwIGIvdGVzdC91bml0L2J2ZWN0b3JfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBjNDkxMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9idmVjdG9yX3Rlc3QuY3BwCkBAIC0wLDAgKzEsNzEgQEAKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjcHB1bml0L2NwcHVuaXRfcHJveHkuaCIKKworI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkIChfU1RMUF9VU0VfTkFNRVNQQUNFUykKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisjZW5kaWYKKworLy8KKy8vIFRlc3RDYXNlIGNsYXNzCisvLworY2xhc3MgQnZlY3RvclRlc3QgOiBwdWJsaWMgQ1BQVU5JVF9OUzo6VGVzdENhc2UKK3sKKyAgQ1BQVU5JVF9URVNUX1NVSVRFKEJ2ZWN0b3JUZXN0KTsKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKKyAgQ1BQVU5JVF9JR05PUkU7CisjZW5kaWYKKyAgQ1BQVU5JVF9URVNUKGJ2ZWMxKTsKKyAgQ1BQVU5JVF9URVNUX1NVSVRFX0VORCgpOworCitwcm90ZWN0ZWQ6CisgIHZvaWQgYnZlYzEoKTsKK307CisKK0NQUFVOSVRfVEVTVF9TVUlURV9SRUdJU1RSQVRJT04oQnZlY3RvclRlc3QpOworCisvLworLy8gdGVzdHMgaW1wbGVtZW50YXRpb24KKy8vCit2b2lkIEJ2ZWN0b3JUZXN0OjpidmVjMSgpCit7CisjaWYgZGVmaW5lZCAoU1RMUE9SVCkgJiYgIWRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpCisgIGJvb2wgaWlbM109IHsxLDAsMX07CisgIGJpdF92ZWN0b3IgYigzKTsKKworICBDUFBVTklUX0FTU0VSVChiWzBdPT0wKTsKKyAgQ1BQVU5JVF9BU1NFUlQoYlsxXT09MCk7CisgIENQUFVOSVRfQVNTRVJUKGJbMl09PTApOworCisgIGJbMF0gPSBiWzJdID0gMTsKKworICBDUFBVTklUX0FTU0VSVChiWzBdPT0xKTsKKyAgQ1BQVU5JVF9BU1NFUlQoYlsxXT09MCk7CisgIENQUFVOSVRfQVNTRVJUKGJbMl09PTEpOworCisgIGIuaW5zZXJ0KGIuYmVnaW4oKSwoYm9vbCopaWksIGlpKzIpOworCisgIENQUFVOSVRfQVNTRVJUKGJbMF09PTEpOworICBDUFBVTklUX0FTU0VSVChiWzFdPT0wKTsKKyAgQ1BQVU5JVF9BU1NFUlQoYlsyXT09MSk7CisgIENQUFVOSVRfQVNTRVJUKGJbM109PTApOworICBDUFBVTklUX0FTU0VSVChiWzRdPT0xKTsKKworICBiaXRfdmVjdG9yIGJiID0gYjsKKyAgaWYgKGJiICE9IGIpCisgICAgZXhpdCgxKTsKKworICBiWzBdIHw9IDA7CisgIGJbMV0gfD0gMDsKKyAgYlsyXSB8PSAxOworICBiWzNdIHw9IDE7CisgIENQUFVOSVRfQVNTRVJUKCEoKGJbMF0gIT0gMSkgfHwgKGJbMV0gIT0gMCkgfHwgKGJbMl0gIT0gMSkgfHwgKGJbM10gIT0gMSkpKTsKKworCisgIGJiWzBdICY9IDA7CisgIGJiWzFdICY9IDA7CisgIGJiWzJdICY9IDE7CisgIGJiWzNdICY9IDE7CisgIENQUFVOSVRfQVNTRVJUKCEoKGJiWzBdICE9IDApIHx8IChiYlsxXSAhPSAwKSB8fCAoYmJbMl0gIT0gMSkgfHwgKGJiWzNdICE9IDApKSk7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9jX2xpbWl0c19oZWFkZXJfdGVzdC5jIGIvdGVzdC91bml0L2NfbGltaXRzX2hlYWRlcl90ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRiMmJmMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9jX2xpbWl0c19oZWFkZXJfdGVzdC5jCkBAIC0wLDAgKzEsOCBAQAorLyogVGhpcyB0ZXN0IHB1cnBvc2UgaXMgc2ltcGx5IHRvIGNoZWNrIFN0YW5kYXJkIGhlYWRlciBpbmRlcGVuZGFuY3kgdGhhdAorICogaXMgdG8gc2F5IHRoYXQgdGhlIGhlYWRlciBjYW4gYmUgaW5jbHVkZWQgYWxvbmUgd2l0aG91dCBhbnkgcHJldmlvdXMKKyAqIGluY2x1ZGUuCisgKiBBZGRpdGlvbm5hbHksIGZvciBDIFN0YW5kYXJkIGhlYWRlcnMgdGhhdCBTVExwb3J0IGV4cG9zZSwgaXQgY2FuIGFsc28gYmUKKyAqIHVzZWQgdG8gY2hlY2sgdGhhdCBmaWxlcyBpbmNsdWRlZCBieSB0aG9zZSBoZWFkZXJzIGFyZSBjb21wYXRpYmxlIHdpdGgKKyAqIHB1cmUgQyBjb21waWxlcnMuCisgKi8KKyNpbmNsdWRlIDxsaW1pdHMuaD4KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9jX2xvY2FsZV9oZWFkZXJfdGVzdC5jIGIvdGVzdC91bml0L2NfbG9jYWxlX2hlYWRlcl90ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRiZWM0NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9jX2xvY2FsZV9oZWFkZXJfdGVzdC5jCkBAIC0wLDAgKzEsOCBAQAorLyogVGhpcyB0ZXN0IHB1cnBvc2UgaXMgc2ltcGx5IHRvIGNoZWNrIFN0YW5kYXJkIGhlYWRlciBpbmRlcGVuZGFuY3kgdGhhdAorICogaXMgdG8gc2F5IHRoYXQgdGhlIGhlYWRlciBjYW4gYmUgaW5jbHVkZWQgYWxvbmUgd2l0aG91dCBhbnkgcHJldmlvdXMKKyAqIGluY2x1ZGUuCisgKiBBZGRpdGlvbm5hbHksIGZvciBDIFN0YW5kYXJkIGhlYWRlcnMgdGhhdCBTVExwb3J0IGV4cG9zZSwgaXQgY2FuIGFsc28gYmUKKyAqIHVzZWQgdG8gY2hlY2sgdGhhdCBmaWxlcyBpbmNsdWRlZCBieSB0aG9zZSBoZWFkZXJzIGFyZSBjb21wYXRpYmxlIHdpdGgKKyAqIHB1cmUgQyBjb21waWxlcnMuCisgKi8KKyNpbmNsdWRlIDxsb2NhbGUuaD4KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9jYXNzZXJ0X2hlYWRlcl90ZXN0LmNwcCBiL3Rlc3QvdW5pdC9jYXNzZXJ0X2hlYWRlcl90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWZkZjMyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L2Nhc3NlcnRfaGVhZGVyX3Rlc3QuY3BwCkBAIC0wLDAgKzEsOCBAQAorLyogVGhpcyB0ZXN0IHB1cnBvc2UgaXMgc2ltcGx5IHRvIGNoZWNrIFN0YW5kYXJkIGhlYWRlciBpbmRlcGVuZGFuY3kgdGhhdAorICogaXMgdG8gc2F5IHRoYXQgdGhlIGhlYWRlciBjYW4gYmUgaW5jbHVkZWQgYWxvbmUgd2l0aG91dCBhbnkgcHJldmlvdXMKKyAqIGluY2x1ZGUuCisgKiBBZGRpdGlvbm5hbHksIGZvciBDIFN0YW5kYXJkIGhlYWRlcnMgdGhhdCBTVExwb3J0IGV4cG9zZSwgaXQgY2FuIGFsc28gYmUKKyAqIHVzZWQgdG8gY2hlY2sgdGhhdCBmaWxlcyBpbmNsdWRlZCBieSB0aG9zZSBoZWFkZXJzIGFyZSBjb21wYXRpYmxlIHdpdGgKKyAqIHB1cmUgQyBjb21waWxlcnMuCisgKi8KKyNpbmNsdWRlIDxjYXNzZXJ0PgpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L2NjdHlwZV9oZWFkZXJfdGVzdC5jcHAgYi90ZXN0L3VuaXQvY2N0eXBlX2hlYWRlcl90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTY3MzM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L2NjdHlwZV9oZWFkZXJfdGVzdC5jcHAKQEAgLTAsMCArMSw4IEBACisvKiBUaGlzIHRlc3QgcHVycG9zZSBpcyBzaW1wbHkgdG8gY2hlY2sgU3RhbmRhcmQgaGVhZGVyIGluZGVwZW5kYW5jeSB0aGF0CisgKiBpcyB0byBzYXkgdGhhdCB0aGUgaGVhZGVyIGNhbiBiZSBpbmNsdWRlZCBhbG9uZSB3aXRob3V0IGFueSBwcmV2aW91cworICogaW5jbHVkZS4KKyAqIEFkZGl0aW9ubmFseSwgZm9yIEMgU3RhbmRhcmQgaGVhZGVycyB0aGF0IFNUTHBvcnQgZXhwb3NlLCBpdCBjYW4gYWxzbyBiZQorICogdXNlZCB0byBjaGVjayB0aGF0IGZpbGVzIGluY2x1ZGVkIGJ5IHRob3NlIGhlYWRlcnMgYXJlIGNvbXBhdGlibGUgd2l0aAorICogcHVyZSBDIGNvbXBpbGVycy4KKyAqLworI2luY2x1ZGUgPGNjdHlwZT4KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9jZXJybm9faGVhZGVyX3Rlc3QuY3BwIGIvdGVzdC91bml0L2NlcnJub19oZWFkZXJfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBlMWQ1YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9jZXJybm9faGVhZGVyX3Rlc3QuY3BwCkBAIC0wLDAgKzEsOCBAQAorLyogVGhpcyB0ZXN0IHB1cnBvc2UgaXMgc2ltcGx5IHRvIGNoZWNrIFN0YW5kYXJkIGhlYWRlciBpbmRlcGVuZGFuY3kgdGhhdAorICogaXMgdG8gc2F5IHRoYXQgdGhlIGhlYWRlciBjYW4gYmUgaW5jbHVkZWQgYWxvbmUgd2l0aG91dCBhbnkgcHJldmlvdXMKKyAqIGluY2x1ZGUuCisgKiBBZGRpdGlvbm5hbHksIGZvciBDIFN0YW5kYXJkIGhlYWRlcnMgdGhhdCBTVExwb3J0IGV4cG9zZSwgaXQgY2FuIGFsc28gYmUKKyAqIHVzZWQgdG8gY2hlY2sgdGhhdCBmaWxlcyBpbmNsdWRlZCBieSB0aG9zZSBoZWFkZXJzIGFyZSBjb21wYXRpYmxlIHdpdGgKKyAqIHB1cmUgQyBjb21waWxlcnMuCisgKi8KKyNpbmNsdWRlIDxjZXJybm8+CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvY2Zsb2F0X2hlYWRlcl90ZXN0LmNwcCBiL3Rlc3QvdW5pdC9jZmxvYXRfaGVhZGVyX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NzljNzMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvY2Zsb2F0X2hlYWRlcl90ZXN0LmNwcApAQCAtMCwwICsxLDggQEAKKy8qIFRoaXMgdGVzdCBwdXJwb3NlIGlzIHNpbXBseSB0byBjaGVjayBTdGFuZGFyZCBoZWFkZXIgaW5kZXBlbmRhbmN5IHRoYXQKKyAqIGlzIHRvIHNheSB0aGF0IHRoZSBoZWFkZXIgY2FuIGJlIGluY2x1ZGVkIGFsb25lIHdpdGhvdXQgYW55IHByZXZpb3VzCisgKiBpbmNsdWRlLgorICogQWRkaXRpb25uYWx5LCBmb3IgQyBTdGFuZGFyZCBoZWFkZXJzIHRoYXQgU1RMcG9ydCBleHBvc2UsIGl0IGNhbiBhbHNvIGJlCisgKiB1c2VkIHRvIGNoZWNrIHRoYXQgZmlsZXMgaW5jbHVkZWQgYnkgdGhvc2UgaGVhZGVycyBhcmUgY29tcGF0aWJsZSB3aXRoCisgKiBwdXJlIEMgY29tcGlsZXJzLgorICovCisjaW5jbHVkZSA8Y2Zsb2F0PgpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L2Npc282NDZfaGVhZGVyX3Rlc3QuY3BwIGIvdGVzdC91bml0L2Npc282NDZfaGVhZGVyX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiN2IyNTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvY2lzbzY0Nl9oZWFkZXJfdGVzdC5jcHAKQEAgLTAsMCArMSw4IEBACisvKiBUaGlzIHRlc3QgcHVycG9zZSBpcyBzaW1wbHkgdG8gY2hlY2sgU3RhbmRhcmQgaGVhZGVyIGluZGVwZW5kYW5jeSB0aGF0CisgKiBpcyB0byBzYXkgdGhhdCB0aGUgaGVhZGVyIGNhbiBiZSBpbmNsdWRlZCBhbG9uZSB3aXRob3V0IGFueSBwcmV2aW91cworICogaW5jbHVkZS4KKyAqIEFkZGl0aW9ubmFseSwgZm9yIEMgU3RhbmRhcmQgaGVhZGVycyB0aGF0IFNUTHBvcnQgZXhwb3NlLCBpdCBjYW4gYWxzbyBiZQorICogdXNlZCB0byBjaGVjayB0aGF0IGZpbGVzIGluY2x1ZGVkIGJ5IHRob3NlIGhlYWRlcnMgYXJlIGNvbXBhdGlibGUgd2l0aAorICogcHVyZSBDIGNvbXBpbGVycy4KKyAqLworI2luY2x1ZGUgPGNpc282NDY+CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvY2xpbWl0c19oZWFkZXJfdGVzdC5jcHAgYi90ZXN0L3VuaXQvY2xpbWl0c19oZWFkZXJfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y3MWI5ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9jbGltaXRzX2hlYWRlcl90ZXN0LmNwcApAQCAtMCwwICsxLDggQEAKKy8qIFRoaXMgdGVzdCBwdXJwb3NlIGlzIHNpbXBseSB0byBjaGVjayBTdGFuZGFyZCBoZWFkZXIgaW5kZXBlbmRhbmN5IHRoYXQKKyAqIGlzIHRvIHNheSB0aGF0IHRoZSBoZWFkZXIgY2FuIGJlIGluY2x1ZGVkIGFsb25lIHdpdGhvdXQgYW55IHByZXZpb3VzCisgKiBpbmNsdWRlLgorICogQWRkaXRpb25uYWx5LCBmb3IgQyBTdGFuZGFyZCBoZWFkZXJzIHRoYXQgU1RMcG9ydCBleHBvc2UsIGl0IGNhbiBhbHNvIGJlCisgKiB1c2VkIHRvIGNoZWNrIHRoYXQgZmlsZXMgaW5jbHVkZWQgYnkgdGhvc2UgaGVhZGVycyBhcmUgY29tcGF0aWJsZSB3aXRoCisgKiBwdXJlIEMgY29tcGlsZXJzLgorICovCisjaW5jbHVkZSA8Y2xpbWl0cz4KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9jbG9jYWxlX2hlYWRlcl90ZXN0LmNwcCBiL3Rlc3QvdW5pdC9jbG9jYWxlX2hlYWRlcl90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDNiMzZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L2Nsb2NhbGVfaGVhZGVyX3Rlc3QuY3BwCkBAIC0wLDAgKzEsOCBAQAorLyogVGhpcyB0ZXN0IHB1cnBvc2UgaXMgc2ltcGx5IHRvIGNoZWNrIFN0YW5kYXJkIGhlYWRlciBpbmRlcGVuZGFuY3kgdGhhdAorICogaXMgdG8gc2F5IHRoYXQgdGhlIGhlYWRlciBjYW4gYmUgaW5jbHVkZWQgYWxvbmUgd2l0aG91dCBhbnkgcHJldmlvdXMKKyAqIGluY2x1ZGUuCisgKiBBZGRpdGlvbm5hbHksIGZvciBDIFN0YW5kYXJkIGhlYWRlcnMgdGhhdCBTVExwb3J0IGV4cG9zZSwgaXQgY2FuIGFsc28gYmUKKyAqIHVzZWQgdG8gY2hlY2sgdGhhdCBmaWxlcyBpbmNsdWRlZCBieSB0aG9zZSBoZWFkZXJzIGFyZSBjb21wYXRpYmxlIHdpdGgKKyAqIHB1cmUgQyBjb21waWxlcnMuCisgKi8KKyNpbmNsdWRlIDxjbG9jYWxlPgpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L2NtYXRoX2hlYWRlcl90ZXN0LmNwcCBiL3Rlc3QvdW5pdC9jbWF0aF9oZWFkZXJfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM5YjdjYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9jbWF0aF9oZWFkZXJfdGVzdC5jcHAKQEAgLTAsMCArMSw4IEBACisvKiBUaGlzIHRlc3QgcHVycG9zZSBpcyBzaW1wbHkgdG8gY2hlY2sgU3RhbmRhcmQgaGVhZGVyIGluZGVwZW5kYW5jeSB0aGF0CisgKiBpcyB0byBzYXkgdGhhdCB0aGUgaGVhZGVyIGNhbiBiZSBpbmNsdWRlZCBhbG9uZSB3aXRob3V0IGFueSBwcmV2aW91cworICogaW5jbHVkZS4KKyAqIEFkZGl0aW9ubmFseSwgZm9yIEMgU3RhbmRhcmQgaGVhZGVycyB0aGF0IFNUTHBvcnQgZXhwb3NlLCBpdCBjYW4gYWxzbyBiZQorICogdXNlZCB0byBjaGVjayB0aGF0IGZpbGVzIGluY2x1ZGVkIGJ5IHRob3NlIGhlYWRlcnMgYXJlIGNvbXBhdGlibGUgd2l0aAorICogcHVyZSBDIGNvbXBpbGVycy4KKyAqLworI2luY2x1ZGUgPGNtYXRoPgpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L2NtYXRoX3Rlc3QuY3BwIGIvdGVzdC91bml0L2NtYXRoX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3MTg1ZTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvY21hdGhfdGVzdC5jcHAKQEAgLTAsMCArMSwxNzAgQEAKKyNkZWZpbmUgX1NUTFBfRE9fSU1QT1JUX0NTVERfRlVOQ1RJT05TCisKKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8Y21hdGg+CisvL1dlIGFsc28gdGVzdCBtYXRoIGZ1bmN0aW9ucyBpbXBvcnRlZCBmcm9tIHN0ZGxpYi5oIG9yCisvL2RlZmluZWQgaW4gY3N0ZGxpYgorI2luY2x1ZGUgPGNzdGRsaWI+CisKKyNpbmNsdWRlICJtYXRoX2F1eC5oIgorI2luY2x1ZGUgImNwcHVuaXQvY3BwdW5pdF9wcm94eS5oIgorCisvL1RoaXMgdGVzdCBwdXJwb3NlIGlzIHRvIGNoZWNrIHRoZSByaWdodCBpbXBvcnQgb2YgbWF0aC5oIEMgc3ltYm9scworLy9pbnRvIHRoZSBzdGQgbmFtZXNwYWNlIHNvIHdlIGRvIG5vdCB1c2UgdGhlIHVzaW5nIG5hbWVzcGFjZSBzdGQKKy8vc3BlY2lmaWNhdGlvbgorCisvLworLy8gVGVzdENhc2UgY2xhc3MKKy8vCitjbGFzcyBDTWF0aFRlc3QgOiBwdWJsaWMgQ1BQVU5JVF9OUzo6VGVzdENhc2UKK3sKKyAgQ1BQVU5JVF9URVNUX1NVSVRFKENNYXRoVGVzdCk7CisjaWYgZGVmaW5lZCAoU1RMUE9SVCkgJiYgIWRlZmluZWQgKF9TVExQX1VTRV9OQU1FU1BBQ0VTKQorICBDUFBVTklUX0lHTk9SRTsKKyNlbmRpZgorICBDUFBVTklUX1RFU1QoaW1wb3J0X2NoZWNrcyk7CisgIENQUFVOSVRfVEVTVF9TVUlURV9FTkQoKTsKKworICBwcm90ZWN0ZWQ6CisgICAgdm9pZCBpbXBvcnRfY2hlY2tzKCk7Cit9OworCitDUFBVTklUX1RFU1RfU1VJVEVfUkVHSVNUUkFUSU9OKENNYXRoVGVzdCk7CisKKy8vCisvLyB0ZXN0cyBpbXBsZW1lbnRhdGlvbgorLy8KK3ZvaWQgQ01hdGhUZXN0OjppbXBvcnRfY2hlY2tzKCkKK3sKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZCAoX1NUTFBfVVNFX05BTUVTUEFDRVMpCisgIGludCBpbnRfdmFsID0gLTE7CisgIGxvbmcgbG9uZ192YWwgPSAtMWw7CisgIGZsb2F0IGZsb2F0X3ZhbCA9IC0xLjBmOworICBkb3VibGUgZG91YmxlX3ZhbCA9IC0xLjA7CisjICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTE9OR19ET1VCTEUpCisgIGxvbmcgZG91YmxlIGxvbmdfZG91YmxlX3ZhbCA9IC0xLjBsOworIyAgZW5kaWYKKworICBDUFBVTklUX0NIRUNLKCBhcmVfZXF1YWxzKHN0ZDo6YWJzKGludF92YWwpLCAtaW50X3ZhbCkgKTsKKyAgQ1BQVU5JVF9DSEVDSyggYXJlX2VxdWFscyhzdGQ6OmFicyhsb25nX3ZhbCksIC1sb25nX3ZhbCkgKTsKKyAgQ1BQVU5JVF9DSEVDSyggYXJlX2VxdWFscyhzdGQ6OmxhYnMobG9uZ192YWwpLCAtbG9uZ192YWwpICk7CisgIENQUFVOSVRfQ0hFQ0soIGFyZV9lcXVhbHMoc3RkOjphYnMoZmxvYXRfdmFsKSwgLWZsb2F0X3ZhbCkgKTsKKyAgQ1BQVU5JVF9DSEVDSyggYXJlX2VxdWFscyhzdGQ6OmFicyhkb3VibGVfdmFsKSwgLWRvdWJsZV92YWwpICk7CisjICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTE9OR19ET1VCTEUpCisgIENQUFVOSVRfQ0hFQ0soIGFyZV9lcXVhbHMoc3RkOjphYnMobG9uZ19kb3VibGVfdmFsKSwgLWxvbmdfZG91YmxlX3ZhbCkgKTsKKyMgIGVuZGlmCisKKyAgQ1BQVU5JVF9DSEVDSyggYXJlX2VxdWFscyhzdGQ6OmZhYnMoZmxvYXRfdmFsKSwgLWZsb2F0X3ZhbCkgKTsKKyAgQ1BQVU5JVF9DSEVDSyggYXJlX2VxdWFscyhzdGQ6OmZhYnMoZG91YmxlX3ZhbCksIC1kb3VibGVfdmFsKSApOworIyAgaWYgIWRlZmluZWQgKF9TVExQX05PX0xPTkdfRE9VQkxFKQorICBDUFBVTklUX0NIRUNLKCBhcmVfZXF1YWxzKHN0ZDo6ZmFicyhsb25nX2RvdWJsZV92YWwpLCAtbG9uZ19kb3VibGVfdmFsKSApOworIyAgZW5kaWYKKworICBzdGQ6OmRpdl90IGRpdl9yZXMgPSBzdGQ6OmRpdigzLCAyKTsKKyAgQ1BQVU5JVF9DSEVDSyggZGl2X3Jlcy5xdW90ID09IDEgKTsKKyAgQ1BQVU5JVF9DSEVDSyggZGl2X3Jlcy5yZW0gPT0gMSApOworICBzdGQ6OmxkaXZfdCBsZGl2X3JlcyA9IHN0ZDo6bGRpdigzbCwgMmwpOworICBDUFBVTklUX0NIRUNLKCBsZGl2X3Jlcy5xdW90ID09IDFsICk7CisgIENQUFVOSVRfQ0hFQ0soIGxkaXZfcmVzLnJlbSA9PSAxbCApOworICBsZGl2X3JlcyA9IHN0ZDo6ZGl2KDNsLCAybCk7CisgIENQUFVOSVRfQ0hFQ0soIGxkaXZfcmVzLnF1b3QgPT0gMWwgKTsKKyAgQ1BQVU5JVF9DSEVDSyggbGRpdl9yZXMucmVtID09IDFsICk7CisKKyAgc3RkOjpzcmFuZCgyKTsKKyAgaW50IHJhbmRfdmFsID0gc3RkOjpyYW5kKCk7CisgIENQUFVOSVRfQ0hFQ0soIHJhbmRfdmFsID49IDAgJiYgcmFuZF92YWwgPD0gUkFORF9NQVggKTsKKworICBDUFBVTklUX0NIRUNLKCBhcmVfZXF1YWxzKHN0ZDo6Zmxvb3IoMS41KSwgMS4wKSApOworICBDUFBVTklUX0NIRUNLKCBhcmVfZXF1YWxzKHN0ZDo6Y2VpbCgxLjUpLCAyLjApICk7CisgIENQUFVOSVRfQ0hFQ0soIGFyZV9lcXVhbHMoc3RkOjpmbW9kKDEuNSwgMS4wKSwgMC41KSApOworICBDUFBVTklUX0NIRUNLKCBhcmVfZXF1YWxzKHN0ZDo6c3FydCg0LjApLCAyLjApICk7CisgIENQUFVOSVRfQ0hFQ0soIGFyZV9lcXVhbHMoc3RkOjpwb3coMi4wLCAyKSwgNC4wKSApOworICAvKgorICAgKiBVbmNvbW1lbnQgdGhlIGZvbGxvd2luZyB0byBjaGVjayB0aGF0IGl0IGdlbmVyYXRlcyBhbiBhbWJpZ3VvdXMgY2FsbAorICAgKiBhcyB0aGVyZSBpcyBubyBTdGFuZGFyZCBwb3coaW50LCBpbnQpIGZ1bmN0aW9uIG9ubHkgcG93KGRvdWJsZSwgaW50KSwKKyAgICogcG93KGZsb2F0LCBpbnQpIGFuZCBzb21lIG90aGVycy4uLgorICAgKiBJZiBpdCBkbyBub3QgZ2VuZXJhdGUgYSBjb21waWxlIHRpbWUgZXJyb3IgaXQgc2hvdWxkIGF0IGxlYXN0IGdpdmUKKyAgICogdGhlIGdvb2QgcmVzdWx0LgorICAgKi8KKyAgLy9DUFBVTklUX0NIRUNLKCBhcmVfZXF1YWxzKHN0ZDo6cG93KDEwLCAtMiksIDAuMDEpICk7CisgIENQUFVOSVRfQ0hFQ0soIGFyZV9lcXVhbHMoc3RkOjpwb3coMTAuMCwgLTIpLCAwLjAxKSApOworICBDUFBVTklUX0NIRUNLKCBhcmVfZXF1YWxzKHN0ZDo6ZXhwKDAuMCksIDEuMCkgKTsKKyAgQ1BQVU5JVF9DSEVDSyggYXJlX2VxdWFscyhzdGQ6OmxvZyhzdGQ6OmV4cCgxLjApKSwgMS4wKSApOworICBDUFBVTklUX0NIRUNLKCBhcmVfZXF1YWxzKHN0ZDo6bG9nMTAoMTAwLjApLCAyLjApICk7CisjICBpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgIWRlZmluZWQgKF9TVExQX1VTSU5HX1BMQVRGT1JNX1NES19DT01QSUxFUikgfHwgIWRlZmluZWQgKF9XSU42NCkKKyAgQ1BQVU5JVF9DSEVDSyggYXJlX2VxdWFscyhzdGQ6Om1vZGYoMTAwLjUsICZkb3VibGVfdmFsKSwgMC41KSApOworICBDUFBVTklUX0NIRUNLKCBhcmVfZXF1YWxzKGRvdWJsZV92YWwsIDEwMC4wKSApOworIyAgZW5kaWYKKyAgZG91YmxlX3ZhbCA9IHN0ZDo6ZnJleHAoOC4wLCAmaW50X3ZhbCk7CisgIENQUFVOSVRfQ0hFQ0soIGFyZV9lcXVhbHMoZG91YmxlX3ZhbCAqIHN0ZDo6cG93KDIuMCwgaW50X3ZhbCksIDguMCkgKTsKKyAgQ1BQVU5JVF9DSEVDSyggYXJlX2VxdWFscyhzdGQ6OmxkZXhwKDEuMCwgMiksIDQuMCkgKTsKKyAgQ1BQVU5JVF9DSEVDSyggYXJlX2VxdWFscyhzdGQ6OmNvcyhzdGQ6OmFjb3MoMS4wKSksIDEuMCkgKTsKKyAgQ1BQVU5JVF9DSEVDSyggYXJlX2VxdWFscyhzdGQ6OnNpbihzdGQ6OmFzaW4oMS4wKSksIDEuMCkgKTsKKyAgQ1BQVU5JVF9DSEVDSyggYXJlX2VxdWFscyhzdGQ6OnRhbihzdGQ6OmF0YW4oMS4wKSksIDEuMCkgKTsKKyAgQ1BQVU5JVF9DSEVDSyggYXJlX2VxdWFscyhzdGQ6OnRhbihzdGQ6OmF0YW4yKDEuMCwgMS4wKSksIDEuMCkgKTsKKyAgQ1BQVU5JVF9DSEVDSyggYXJlX2VxdWFscyhzdGQ6OmNvc2goMC4wKSwgMS4wKSApOworICBDUFBVTklUX0NIRUNLKCBhcmVfZXF1YWxzKHN0ZDo6c2luaCgwLjApLCAwLjApICk7CisjICBpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgIWRlZmluZWQgKF9TVExQX1VTSU5HX1BMQVRGT1JNX1NES19DT01QSUxFUikgfHwgIWRlZmluZWQgKF9NX0FNRDY0KQorICBDUFBVTklUX0NIRUNLKCBhcmVfZXF1YWxzKHN0ZDo6dGFuaCgwLjApLCAwLjApICk7CisjICBlbmRpZgorCisgIENQUFVOSVRfQ0hFQ0soIGFyZV9lcXVhbHMoc3RkOjpmbG9vcigxLjVmKSwgMS4wZikgKTsKKyAgQ1BQVU5JVF9DSEVDSyggYXJlX2VxdWFscyhzdGQ6OmNlaWwoMS41ZiksIDIuMGYpICk7CisgIENQUFVOSVRfQ0hFQ0soIGFyZV9lcXVhbHMoc3RkOjpmbW9kKDEuNWYsIDEuMGYpLCAwLjVmKSApOworICBDUFBVTklUX0NIRUNLKCBhcmVfZXF1YWxzKHN0ZDo6c3FydCg0LjBmKSwgMi4wZikgKTsKKyAgQ1BQVU5JVF9DSEVDSyggYXJlX2VxdWFscyhzdGQ6OnBvdygyLjBmLCAyKSwgNC4wZikgKTsKKyAgQ1BQVU5JVF9DSEVDSyggYXJlX2VxdWFscyhzdGQ6OmV4cCgwLjBmKSwgMS4wZikgKTsKKyAgQ1BQVU5JVF9DSEVDSyggYXJlX2VxdWFscyhzdGQ6OmxvZyhzdGQ6OmV4cCgxLjBmKSksIDEuMGYpICk7CisgIENQUFVOSVRfQ0hFQ0soIGFyZV9lcXVhbHMoc3RkOjpsb2cxMCgxMDAuMGYpLCAyLjBmKSApOworIyAgaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8ICFkZWZpbmVkIChfU1RMUF9VU0lOR19QTEFURk9STV9TREtfQ09NUElMRVIpIHx8ICFkZWZpbmVkIChfV0lONjQpCisgIENQUFVOSVRfQ0hFQ0soIGFyZV9lcXVhbHMoc3RkOjptb2RmKDEwMC41ZiwgJmZsb2F0X3ZhbCksIDAuNWYpICk7CisgIENQUFVOSVRfQ0hFQ0soIGFyZV9lcXVhbHMoZmxvYXRfdmFsLCAxMDAuMGYpICk7CisjICBlbmRpZgorICBmbG9hdF92YWwgPSBzdGQ6OmZyZXhwKDguMGYsICZpbnRfdmFsKTsKKyAgQ1BQVU5JVF9DSEVDSyggYXJlX2VxdWFscyhmbG9hdF92YWwgKiBzdGQ6OnBvdygyLjBmLCBpbnRfdmFsKSwgOC4wZikgKTsKKyAgQ1BQVU5JVF9DSEVDSyggYXJlX2VxdWFscyhzdGQ6OmxkZXhwKDEuMGYsIDIpLCA0LjBmKSApOworICBDUFBVTklUX0NIRUNLKCBhcmVfZXF1YWxzKHN0ZDo6Y29zKHN0ZDo6YWNvcygxLjBmKSksIDEuMGYpICk7CisgIENQUFVOSVRfQ0hFQ0soIGFyZV9lcXVhbHMoc3RkOjpzaW4oc3RkOjphc2luKDEuMGYpKSwgMS4wZikgKTsKKyAgQ1BQVU5JVF9DSEVDSyggYXJlX2VxdWFscyhzdGQ6OnRhbihzdGQ6OmF0YW4oMS4wZikpLCAxLjBmKSApOworICBDUFBVTklUX0NIRUNLKCBhcmVfZXF1YWxzKHN0ZDo6dGFuKHN0ZDo6YXRhbjIoMS4wZiwgMS4wZikpLCAxLjBmKSApOworICBDUFBVTklUX0NIRUNLKCBhcmVfZXF1YWxzKHN0ZDo6Y29zaCgwLjBmKSwgMS4wZikgKTsKKyAgQ1BQVU5JVF9DSEVDSyggYXJlX2VxdWFscyhzdGQ6OnNpbmgoMC4wZiksIDAuMGYpICk7CisjICBpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgIWRlZmluZWQgKF9TVExQX1VTSU5HX1BMQVRGT1JNX1NES19DT01QSUxFUikgfHwgIWRlZmluZWQgKF9NX0FNRDY0KQorICBDUFBVTklUX0NIRUNLKCBhcmVfZXF1YWxzKHN0ZDo6dGFuaCgwLjBmKSwgMC4wZikgKTsKKyMgIGVuZGlmCisKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9OT19MT05HX0RPVUJMRSkKKyAgQ1BQVU5JVF9DSEVDSyggYXJlX2VxdWFscyhzdGQ6OmZsb29yKDEuNWwpLCAxLjBsKSApOworICBDUFBVTklUX0NIRUNLKCBhcmVfZXF1YWxzKHN0ZDo6Y2VpbCgxLjVsKSwgMi4wbCkgKTsKKyAgQ1BQVU5JVF9DSEVDSyggYXJlX2VxdWFscyhzdGQ6OmZtb2QoMS41bCwgMS4wbCksIDAuNWwpICk7CisgIENQUFVOSVRfQ0hFQ0soIGFyZV9lcXVhbHMoc3RkOjpzcXJ0KDQuMGwpLCAyLjBsKSApOworICBDUFBVTklUX0NIRUNLKCBhcmVfZXF1YWxzKHN0ZDo6cG93KDIuMGwsIDIpLCA0LjBsKSApOworICBDUFBVTklUX0NIRUNLKCBhcmVfZXF1YWxzKHN0ZDo6ZXhwKDAuMGwpLCAxLjBsKSApOworICBDUFBVTklUX0NIRUNLKCBhcmVfZXF1YWxzKHN0ZDo6bG9nKHN0ZDo6ZXhwKDEuMGwpKSwgMS4wbCkgKTsKKyAgQ1BQVU5JVF9DSEVDSyggYXJlX2VxdWFscyhzdGQ6OmxvZzEwKDEwMC4wbCksIDIuMGwpICk7CisjICAgIGlmICFkZWZpbmVkIChTVExQT1JUKSB8fCAhZGVmaW5lZCAoX1NUTFBfVVNJTkdfUExBVEZPUk1fU0RLX0NPTVBJTEVSKSB8fCAhZGVmaW5lZCAoX1dJTjY0KQorICBDUFBVTklUX0NIRUNLKCBhcmVfZXF1YWxzKHN0ZDo6bW9kZigxMDAuNWwsICZsb25nX2RvdWJsZV92YWwpLCAwLjVsKSApOworICBDUFBVTklUX0NIRUNLKCBhcmVfZXF1YWxzKGxvbmdfZG91YmxlX3ZhbCwgMTAwLjBsKSApOworIyAgICBlbmRpZgorICBsb25nX2RvdWJsZV92YWwgPSBzdGQ6OmZyZXhwKDguMGwsICZpbnRfdmFsKTsKKyAgQ1BQVU5JVF9DSEVDSyggYXJlX2VxdWFscyhsb25nX2RvdWJsZV92YWwgKiBzdGQ6OnBvdygyLjBsLCBpbnRfdmFsKSwgOC4wbCkgKTsKKyAgQ1BQVU5JVF9DSEVDSyggYXJlX2VxdWFscyhzdGQ6OmxkZXhwKDEuMGwsIDIpLCA0LjBsKSApOworICBDUFBVTklUX0NIRUNLKCBhcmVfZXF1YWxzKHN0ZDo6Y29zKHN0ZDo6YWNvcygxLjBsKSksIDEuMGwpICk7CisgIENQUFVOSVRfQ0hFQ0soIGFyZV9lcXVhbHMoc3RkOjpzaW4oc3RkOjphc2luKDEuMGwpKSwgMS4wbCkgKTsKKyAgQ1BQVU5JVF9DSEVDSyggYXJlX2VxdWFscyhzdGQ6OnRhbigwLjBsKSwgMC4wbCkgKTsKKyAgQ1BQVU5JVF9DSEVDSyggYXJlX2VxdWFscyhzdGQ6OmF0YW4oMC4wbCksIDAuMGwpICk7CisgIENQUFVOSVRfQ0hFQ0soIGFyZV9lcXVhbHMoc3RkOjphdGFuMigwLjBsLCAxLjBsKSwgMC4wbCkgKTsKKyAgQ1BQVU5JVF9DSEVDSyggYXJlX2VxdWFscyhzdGQ6OmNvc2goMC4wbCksIDEuMGwpICk7CisgIENQUFVOSVRfQ0hFQ0soIGFyZV9lcXVhbHMoc3RkOjpzaW5oKDAuMGwpLCAwLjBsKSApOworIyAgICBpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgIWRlZmluZWQgKF9TVExQX1VTSU5HX1BMQVRGT1JNX1NES19DT01QSUxFUikgfHwgIWRlZmluZWQgKF9NX0FNRDY0KQorICBDUFBVTklUX0NIRUNLKCBhcmVfZXF1YWxzKHN0ZDo6dGFuaCgwLjBsKSwgMC4wbCkgKTsKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisKKyAgQ1BQVU5JVF9DSEVDSyggYXJlX2VxdWFscyhzdGQ6OnNxcnQoc3RkOjpzcXJ0KHN0ZDo6c3FydCgyNTYuMCkpKSwgMi4wKSApOworICBDUFBVTklUX0NIRUNLKCBhcmVfZXF1YWxzKHN0ZDo6c3FydChzdGQ6OnNxcnQoc3RkOjpzcXJ0KDI1Ni4wZikpKSwgMi4wZikgKTsKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9OT19MT05HX0RPVUJMRSkKKyAgQ1BQVU5JVF9DSEVDSyggYXJlX2VxdWFscyhzdGQ6OnNxcnQoc3RkOjpzcXJ0KHN0ZDo6c3FydCgyNTYuMGwpKSksIDIuMGwpICk7CisjICBlbmRpZgorI2VuZGlmCit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvY29kZWN2dF90ZXN0LmNwcCBiL3Rlc3QvdW5pdC9jb2RlY3Z0X3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzM2ZlMTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvY29kZWN2dF90ZXN0LmNwcApAQCAtMCwwICsxLDY1NCBAQAorI2luY2x1ZGUgPHN0cmluZz4KKworI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCAhZGVmaW5lZCAoX1NUTFBfVVNFX05PX0lPU1RSRUFNUykKKyMgIGluY2x1ZGUgPGZzdHJlYW0+CisjICBpbmNsdWRlIDxsb2NhbGU+CisjICBpbmNsdWRlIDxzdGRleGNlcHQ+CisjICBpbmNsdWRlIDxjc3RkaW8+IC8vIGZvciBXRU9GCisKKyMgIGluY2x1ZGUgImNwcHVuaXQvY3BwdW5pdF9wcm94eS5oIgorCisjICBpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZChfU1RMUF9VU0VfTkFNRVNQQUNFUykKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisjICBlbmRpZgorCisvLworLy8gVGVzdENhc2UgY2xhc3MKKy8vCitjbGFzcyBDb2RlY3Z0VGVzdCA6IHB1YmxpYyBDUFBVTklUX05TOjpUZXN0Q2FzZQoreworICBDUFBVTklUX1RFU1RfU1VJVEUoQ29kZWN2dFRlc3QpOworI2lmIGRlZmluZWQgKFNUTFBPUlQpICYmIGRlZmluZWQgKF9TVExQX05PX01FTUJFUl9URU1QTEFURVMpCisgIENQUFVOSVRfSUdOT1JFOworI2VuZGlmCisgIENQUFVOSVRfVEVTVCh2YXJpYWJsZV9lbmNvZGluZyk7CisgIENQUFVOSVRfU1RPUF9JR05PUkU7CisjaWYgZGVmaW5lZCAoU1RMUE9SVCkgJiYgKGRlZmluZWQgKF9TVExQX05PX1dDSEFSX1QpIHx8ICFkZWZpbmVkIChfU1RMUF9VU0VfRVhDRVBUSU9OUykpCisgIENQUFVOSVRfSUdOT1JFOworI2VuZGlmCisgIENQUFVOSVRfVEVTVChpbl9vdXRfdGVzdCk7CisgIENQUFVOSVRfVEVTVChsZW5ndGhfdGVzdCk7CisgIENQUFVOSVRfVEVTVChpbWJ1ZV93aGlsZV9yZWFkaW5nKTsKKyAgQ1BQVU5JVF9URVNUKHNwZWNpYWxfZW5jb2RpbmdzKTsKKyAgQ1BQVU5JVF9URVNUX1NVSVRFX0VORCgpOworCitwcm90ZWN0ZWQ6CisgIHZvaWQgdmFyaWFibGVfZW5jb2RpbmcoKTsKKyAgdm9pZCBpbl9vdXRfdGVzdCgpOworICB2b2lkIGxlbmd0aF90ZXN0KCk7CisgIHZvaWQgaW1idWVfd2hpbGVfcmVhZGluZygpOworICB2b2lkIHNwZWNpYWxfZW5jb2RpbmdzKCk7Cit9OworCitDUFBVTklUX1RFU1RfU1VJVEVfUkVHSVNUUkFUSU9OKENvZGVjdnRUZXN0KTsKKworI2lmIGRlZmluZWQgKFNUTFBPUlQpCisjICBkZWZpbmUgX19OT19USFJPVyBfU1RMUF9OT1RIUk9XCisjZWxzZQorIyAgZGVmaW5lIF9fTk9fVEhST1cgdGhyb3coKQorI2VuZGlmCisKKworLyogQ29kZWN2dCBmYWNldCBlYXRpbmcgc29tZSBjaGFyYWN0ZXJzIGZyb20gdGhlIGV4dGVybmFsIGJ1ZmZlci4KKyAqIFRyYW5zZm9ybSAnMDEnIGluICdhJworICovCitzdHJ1Y3QgZWF0ZXJfY29kZWN2dCA6IHB1YmxpYyBjb2RlY3Z0PGNoYXIsIGNoYXIsIG1ic3RhdGVfdD4geworICB0eXBlZGVmIGNvZGVjdnQ8Y2hhcixjaGFyLG1ic3RhdGVfdD4gYmFzZTsKKworICBleHBsaWNpdCBlYXRlcl9jb2RlY3Z0KHNpemVfdCByZWZzID0gMCkgOiBiYXNlKHJlZnMpIHt9CisKKyAgLy8gcHJpbWl0aXZlIGNvbnZlcnNpb24KKyAgdmlydHVhbCBiYXNlOjpyZXN1bHQKKyAgZG9faW4obWJzdGF0ZV90JiBtYiwKKyAgICAgICAgY29uc3QgY2hhciogZWJlZ2luLCBjb25zdCBjaGFyKiBlZW5kLCBjb25zdCBjaGFyKiYgZWN1ciwKKyAgICAgICAgY2hhciogaWJlZ2luLCBjaGFyKiBpZW5kLCBjaGFyKiYgaWN1cikgY29uc3QgX19OT19USFJPVyB7CisgICAgICBjaGFyICpzdGF0ZSA9IChjaGFyKikmbWI7CisgICAgICBlY3VyID0gZWJlZ2luOworICAgICAgaWN1ciA9IGliZWdpbjsKKworICAgICAgd2hpbGUgKGVjdXIgIT0gZWVuZCkgeworICAgICAgICAgIGlmIChpY3VyID09IGllbmQpCisgICAgICAgICAgICAgIHJldHVybiBwYXJ0aWFsOworICAgICAgICAgIGlmICgqZWN1ciA9PSAnMCcgfHwgKnN0YXRlID09IDEpIHsKKyAgICAgICAgICAgIGlmICgqc3RhdGUgIT0gMSkgeworICAgICAgICAgICAgICArK2VjdXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZWN1ciA9PSBlZW5kKSB7CisgICAgICAgICAgICAgICpzdGF0ZSA9IDE7CisgICAgICAgICAgICAgIHJldHVybiBvazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCplY3VyID09ICcxJykgeworICAgICAgICAgICAgICAqaWN1ciA9ICdhJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAqKGljdXIrKykgPSAnMCc7CisgICAgICAgICAgICAgIGlmIChpY3VyID09IGllbmQpIHsKKyAgICAgICAgICAgICAgICBpZiAoKnN0YXRlICE9IDEpIHsKKyAgICAgICAgICAgICAgICAgIC0tZWN1cjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnRpYWw7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgKmljdXIgPSAqZWN1cjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAqaWN1ciA9ICplY3VyOworICAgICAgICAgIH0KKworICAgICAgICAgICpzdGF0ZSA9IDA7CisgICAgICAgICAgKytpY3VyOworICAgICAgICAgICsrZWN1cjsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIG9rOworICB9CisKKyAgLy8gY2xhaW0gaXQncyBub3QgYSBudWxsLWNvbnZlcnNpb24KKyAgdmlydHVhbCBib29sIGRvX2Fsd2F5c19ub2NvbnYoKSBjb25zdCBfX05PX1RIUk9XCisgIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgLy8gY2xhaW0gaXQgZG9lc24ndCBoYXZlIGEgZml4ZWQtbGVuZ3RoIGVuY29kaW5nCisgIHZpcnR1YWwgaW50IGRvX2VuY29kaW5nKCkgY29uc3QgX19OT19USFJPVworICB7IHJldHVybiAwOyB9CisKKyAgLy8gaW1wbGVtZW50ZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggZG9faW4gb3ZlcmxvYWQKKyAgdmlydHVhbCBpbnQgZG9fbGVuZ3RoKG1ic3RhdGVfdCAmc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplZnJvbSwgY29uc3QgY2hhciAqZWVuZCwgc2l6ZV90IG0pIGNvbnN0IHsKKyAgICBjaGFyICppYmVnaW4gPSBuZXcgY2hhclttXTsKKyAgICBjb25zdCBjaGFyICplY3VyID0gZWZyb207CisgICAgY2hhciAqaWN1ciA9IGliZWdpbjsKKyAgICBtYnN0YXRlX3QgdG1wID0gc3RhdGU7CisgICAgZG9faW4odG1wLCBlZnJvbSwgZWVuZCwgZWN1ciwgaWJlZ2luLCBpYmVnaW4gKyBtLCBpY3VyKTsKKyAgICBkZWxldGVbXSBpYmVnaW47CisgICAgcmV0dXJuIGVjdXIgLSBlZnJvbTsKKyAgfQorCisgIHZpcnR1YWwgaW50IGRvX21heF9sZW5ndGgoKSBjb25zdCBfX05PX1RIUk9XCisgIHsgcmV0dXJuIDI7IH0KKworI2lmZGVmIF9fRE1DX18KKyAgc3RhdGljIGxvY2FsZTo6aWQgaWQ7CisjZW5kaWYKK307CisKKyNpZmRlZiBfX0RNQ19fCitsb2NhbGU6OmlkIGVhdGVyX2NvZGVjdnQ6OmlkOworCitsb2NhbGU6OmlkJiBfR2V0RmFjZXRJZChjb25zdCBlYXRlcl9jb2RlY3Z0KikKK3sgcmV0dXJuIGVhdGVyX2NvZGVjdnQ6OmlkOyB9CisjZW5kaWYKKworLyogQ29kZWN2dCBmYWNldCBnZW5lcmF0aW5nIG1vcmUgY2hhcmFjdGVycyB0aGFuIHRoZSBvbmVzIHJlYWQgZnJvbSB0aGUKKyAqIGV4dGVybmFsIGJ1ZmZlciwgdHJhbnNmb3JtICcwMScgaW4gJ2FiYycKKyAqIFRoaXMga2luZCBvZiBmYWNldCBkbyBub3QgYWxsb3cgc3lzdGVtYXRpY2FsIHBvc2l0aW9ubmluZyBpbiB0aGUgZXh0ZXJuYWwKKyAqIGJ1ZmZlciAodGVsbGcgLT4gLTEpLCB3aGVuIHlvdSBqdXN0IHJlYWQgYSAnYScgeW91IGFyZSBhdCBhbiB1bmRlZmluZWQKKyAqIGV4dGVybmFsIGJ1ZmZlciBwb3NpdGlvbi4KKyAqLworc3RydWN0IGdlbmVyYXRvcl9jb2RlY3Z0IDogcHVibGljIGNvZGVjdnQ8Y2hhciwgY2hhciwgbWJzdGF0ZV90PiB7CisgIHR5cGVkZWYgY29kZWN2dDxjaGFyLGNoYXIsbWJzdGF0ZV90PiBiYXNlOworCisgIGV4cGxpY2l0IGdlbmVyYXRvcl9jb2RlY3Z0KHNpemVfdCByZWZzID0gMCkgOiBiYXNlKHJlZnMpIHt9CisKKyAgLy8gcHJpbWl0aXZlIGNvbnZlcnNpb24KKyAgdmlydHVhbCBiYXNlOjpyZXN1bHQKKyAgZG9faW4obWJzdGF0ZV90JiBtYiwKKyAgICAgICAgY29uc3QgY2hhciogZWJlZ2luLCBjb25zdCBjaGFyKiBlZW5kLCBjb25zdCBjaGFyKiYgZWN1ciwKKyAgICAgICAgY2hhciogaWJlZ2luLCBjaGFyKiBpZW5kLCBjaGFyKiYgaWN1cikgY29uc3QgX19OT19USFJPVyB7CisgICAgICAvL0FjY2VzcyB0aGUgbWJzdGF0ZSBpbmZvcm1hdGlvbiBpbiBhIHBvcnRhYmxlIHdheToKKyAgICAgIGNoYXIgKnN0YXRlID0gKGNoYXIqKSZtYjsKKyAgICAgIGVjdXIgPSBlYmVnaW47CisgICAgICBpY3VyID0gaWJlZ2luOworCisgICAgICBpZiAoaWN1ciA9PSBpZW5kKSByZXR1cm4gb2s7CisKKyAgICAgIGlmICgqc3RhdGUgPT0gMikgeworICAgICAgICAqKGljdXIrKykgPSAnYic7CisgICAgICAgIGlmIChpY3VyID09IGllbmQpIHsKKyAgICAgICAgICAqc3RhdGUgPSAzOworICAgICAgICAgIHJldHVybiBvazsKKyAgICAgICAgfQorICAgICAgICAqKGljdXIrKykgPSAnYyc7CisgICAgICAgICpzdGF0ZSA9IDA7CisgICAgICB9CisgICAgICBlbHNlIGlmICgqc3RhdGUgPT0gMykgeworICAgICAgICAqKGljdXIrKykgPSAnYyc7CisgICAgICAgICpzdGF0ZSA9IDA7CisgICAgICB9CisKKyAgICAgIHdoaWxlIChlY3VyICE9IGVlbmQpIHsKKyAgICAgICAgICBpZiAoaWN1ciA9PSBpZW5kKQorICAgICAgICAgICAgICByZXR1cm4gb2s7CisgICAgICAgICAgaWYgKCplY3VyID09ICcwJyB8fCAqc3RhdGUgPT0gMSkgeworICAgICAgICAgICAgaWYgKCpzdGF0ZSAhPSAxKSB7CisgICAgICAgICAgICAgICsrZWN1cjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlY3VyID09IGVlbmQpIHsKKyAgICAgICAgICAgICAgKnN0YXRlID0gMTsKKyAgICAgICAgICAgICAgcmV0dXJuIHBhcnRpYWw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgqZWN1ciA9PSAnMScpIHsKKyAgICAgICAgICAgICAgKihpY3VyKyspID0gJ2EnOworICAgICAgICAgICAgICBpZiAoaWN1ciA9PSBpZW5kKSB7CisgICAgICAgICAgICAgICAgKnN0YXRlID0gMjsKKyAgICAgICAgICAgICAgICByZXR1cm4gb2s7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgKihpY3VyKyspID0gJ2InOworICAgICAgICAgICAgICBpZiAoaWN1ciA9PSBpZW5kKSB7CisgICAgICAgICAgICAgICAgKnN0YXRlID0gMzsKKyAgICAgICAgICAgICAgICByZXR1cm4gb2s7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgKmljdXIgPSAnYyc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgKihpY3VyKyspID0gJzAnOworICAgICAgICAgICAgICBpZiAoaWN1ciA9PSBpZW5kKSB7CisgICAgICAgICAgICAgICAgaWYgKCpzdGF0ZSAhPSAxKSB7CisgICAgICAgICAgICAgICAgICAtLWVjdXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBvazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAqaWN1ciA9ICplY3VyOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICppY3VyID0gKmVjdXI7CisgICAgICAgICAgfQorCisgICAgICAgICAgKnN0YXRlID0gMDsKKyAgICAgICAgICArK2ljdXI7CisgICAgICAgICAgKytlY3VyOworICAgICAgfQorCisgICAgICByZXR1cm4gb2s7CisgIH0KKworICAvLyBjbGFpbSBpdCdzIG5vdCBhIG51bGwtY29udmVyc2lvbgorICB2aXJ0dWFsIGJvb2wgZG9fYWx3YXlzX25vY29udigpIGNvbnN0IF9fTk9fVEhST1cKKyAgeyByZXR1cm4gZmFsc2U7IH0KKworICAvLyBjbGFpbSBpdCBkb2Vzbid0IGhhdmUgYSBmaXhlZC1sZW5ndGggZW5jb2RpbmcKKyAgdmlydHVhbCBpbnQgZG9fZW5jb2RpbmcoKSBjb25zdCBfX05PX1RIUk9XCisgIHsgcmV0dXJuIDA7IH0KKworICAvLyBpbXBsZW1lbnRlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCBkb19pbiBvdmVybG9hZAorICB2aXJ0dWFsIGludCBkb19sZW5ndGgobWJzdGF0ZV90ICZtYiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVmcm9tLCBjb25zdCBjaGFyICplZW5kLCBzaXplX3QgbSkgY29uc3QgeworICAgIGNvbnN0IGNoYXIgKnN0YXRlID0gKGNvbnN0IGNoYXIqKSZtYjsKKyAgICBpbnQgb2Zmc2V0ID0gMDsKKyAgICBpZiAoKnN0YXRlID09IDIpCisgICAgICBvZmZzZXQgPSAyOworICAgIGVsc2UgaWYgKCpzdGF0ZSA9PSAzKQorICAgICAgb2Zmc2V0ID0gMTsKKworICAgIGNoYXIgKmliZWdpbiA9IG5ldyBjaGFyW20gKyBvZmZzZXRdOworICAgIGNvbnN0IGNoYXIgKmVjdXIgPSBlZnJvbTsKKyAgICBjaGFyICppY3VyID0gaWJlZ2luOworICAgIG1ic3RhdGVfdCB0bXBTdGF0ZSA9IG1iOworICAgIGRvX2luKHRtcFN0YXRlLCBlZnJvbSwgZWVuZCwgZWN1ciwgaWJlZ2luLCBpYmVnaW4gKyBtICsgb2Zmc2V0LCBpY3VyKTsKKyAgICAvKgorICAgIGNoYXIgKnN0YXRlID0gKGNoYXIqKSZ0bXBTdGF0ZTsKKyAgICBpZiAoKnN0YXRlICE9IDApIHsKKyAgICAgIGlmICgqc3RhdGUgPT0gMSkKKyAgICAgICAgLS1lY3VyOworICAgICAgZWxzZSBpZiAoKnN0YXRlID09IDIgfHwgKnN0YXRlID09IDMpIHsKKyAgICAgICAgLy9VbmRlZmluZWQgcG9zaXRpb24sIHdlIHJldHVybiAtMToKKyAgICAgICAgZWN1ciA9IGVmcm9tIC0gMTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICBpZiAoKigoY2hhciopJm1iKSAhPSAwKSB7CisgICAgICAgIC8vV2UgdGFrZSBpbnRvIGFjY291bnQgdGhlIGNoYXJhY3RlciB0aGF0IGhhc24ndCBiZWVuIGNvdW50ZWQgeWV0IGluCisgICAgICAgIC8vdGhlIHByZXZpb3VzIGRlY29kaW5nIHN0ZXA6CisgICAgICAgIGVjdXIrKzsKKyAgICAgIH0KKyAgICB9CisgICAgKi8KKyAgICBkZWxldGVbXSBpYmVnaW47CisgICAgcmV0dXJuIChpbnQpbWluKChzaXplX3QpKGVjdXIgLSBlZnJvbSksIG0pOworICB9CisKKyAgdmlydHVhbCBpbnQgZG9fbWF4X2xlbmd0aCgpIGNvbnN0IF9fTk9fVEhST1cKKyAgeyByZXR1cm4gMDsgfQorI2lmZGVmIF9fRE1DX18KKyAgc3RhdGljIGxvY2FsZTo6aWQgaWQ7CisjZW5kaWYKK307CisKKyNpZmRlZiBfX0RNQ19fCitsb2NhbGU6OmlkIGdlbmVyYXRvcl9jb2RlY3Z0OjppZDsKKworbG9jYWxlOjppZCYgX0dldEZhY2V0SWQoY29uc3QgZ2VuZXJhdG9yX2NvZGVjdnQqKQoreyByZXR1cm4gZ2VuZXJhdG9yX2NvZGVjdnQ6OmlkOyB9CisjZW5kaWYKKworLy8KKy8vIHRlc3RzIGltcGxlbWVudGF0aW9uCisvLwordm9pZCBDb2RlY3Z0VGVzdDo6dmFyaWFibGVfZW5jb2RpbmcoKQoreworI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCAhZGVmaW5lZCAoX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFUykKKyAgLy9XZSBmaXJzdCBnZW5lcmF0ZSB0aGUgZmlsZSB1c2VkIGZvciB0ZXN0OgorICBjb25zdCBjaGFyKiBmaWxlTmFtZSA9ICJ0ZXN0X2ZpbGUudHh0IjsKKyAgeworICAgIG9mc3RyZWFtIG9zdHIoZmlsZU5hbWUpOworICAgIC8vTWF5YmUgd2Ugc2ltcGx5IGRvIG5vdCBoYXZlIHdyaXRlIGFjY2VzcyB0byByZXBvc2l0b3J5CisgICAgQ1BQVU5JVF9BU1NFUlQoIG9zdHIuZ29vZCgpICk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDQ4OyArK2kpIHsKKyAgICAgIG9zdHIgPDwgIjAxMjM0NTY3ODkiOworICAgIH0KKyAgICBDUFBVTklUX0FTU0VSVCggb3N0ci5nb29kKCkgKTsKKyAgfQorCisgIHsKKyAgICBpZnN0cmVhbSBpc3RyKGZpbGVOYW1lKTsKKyAgICBDUFBVTklUX0FTU0VSVCggaXN0ci5nb29kKCkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggIWlzdHIuZW9mKCkgKTsKKworICAgIGVhdGVyX2NvZGVjdnQgY29kZWMoMSk7CisgICAgbG9jYWxlIGxvYyhsb2NhbGU6OmNsYXNzaWMoKSwgJmNvZGVjKTsKKworICAgIGlzdHIuaW1idWUobG9jKTsKKyAgICBDUFBVTklUX0FTU0VSVCggaXN0ci5nb29kKCkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggKGludClpc3RyLnRlbGxnKCkgPT0gMCApOworCisgICAgaW50IHRoZW9yaWNhbFBvcyA9IDA7CisgICAgZG8geworICAgICAgaW50IGMgPSBpc3RyLmdldCgpOworICAgICAgaWYgKGNoYXJfdHJhaXRzPGNoYXI+OjplcV9pbnRfdHlwZShjLCBjaGFyX3RyYWl0czxjaGFyPjo6ZW9mKCkpKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgKyt0aGVvcmljYWxQb3M7CisgICAgICBpZiAoYyA9PSAnYScpIHsKKyAgICAgICAgKyt0aGVvcmljYWxQb3M7CisgICAgICB9CisKKyAgICAgIENQUFVOSVRfQVNTRVJUKCAoaW50KWlzdHIudGVsbGcoKSA9PSB0aGVvcmljYWxQb3MgKTsKKyAgICB9CisgICAgd2hpbGUgKCFpc3RyLmVvZigpKTsKKworICAgIENQUFVOSVRfQVNTRVJUKCBpc3RyLmVvZigpICk7CisgIH0KKworIyAgaWYgMAorICAvKiBUaGlzIHRlc3QgaXMgYnJva2VuLCBub3Qgc3VyZSBpZiBpdCBpcyByZWFsbHkgcG9zc2libGUgdG8gZ2V0IGEgcG9zaXRpb24gaW4KKyAgICogYSBsb2NhbGUgaGF2aW5nIGEgY29kZWN2dCBzdWNoIGFzIGdlbmVyYXRvcl9jb2RlY3Z0LiBNYXliZSBnZW5lcmF0b3JfY29kZWN2dAorICAgKiBpcyBub3QgYSB2YWxpZCB0aGVvcmljYWwgZXhhbXBsZSBvZiBjb2RlY3Z0IGltcGxlbWVudGF0aW9uLiAqLworICB7CisgICAgaWZzdHJlYW0gaXN0cihmaWxlTmFtZSk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGlzdHIuZ29vZCgpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoICFpc3RyLmVvZigpICk7CisKKyAgICBnZW5lcmF0b3JfY29kZWN2dCBjb2RlYygxKTsKKyAgICBsb2NhbGUgbG9jKGxvY2FsZTo6Y2xhc3NpYygpLCAmY29kZWMpOworCisgICAgaXN0ci5pbWJ1ZShsb2MpOworICAgIENQUFVOSVRfQVNTRVJUKCBpc3RyLmdvb2QoKSApOworICAgIENQUFVOSVRfQVNTRVJUKCAoaW50KWlzdHIudGVsbGcoKSA9PSAwICk7CisKKyAgICBpbnQgdGhlb3JpY2FsUG9zID0gMDsKKyAgICBpbnQgdGhlb3JpY2FsVGVsbGc7CisgICAgZG8geworICAgICAgY2hhciBjID0gaXN0ci5nZXQoKTsKKyAgICAgIGlmIChjID09IGNoYXJfdHJhaXRzPGNoYXI+Ojplb2YoKSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHN3aXRjaCAoYykgeworICAgICAgICBjYXNlICdhJzoKKyAgICAgICAgY2FzZSAnYic6CisgICAgICAgICAgdGhlb3JpY2FsVGVsbGcgPSAtMTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnYyc6CisgICAgICAgICAgKyt0aGVvcmljYWxQb3M7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgKyt0aGVvcmljYWxQb3M7CisgICAgICAgICAgdGhlb3JpY2FsVGVsbGcgPSB0aGVvcmljYWxQb3M7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGlmICgoaW50KWlzdHIudGVsbGcoKSAhPSB0aGVvcmljYWxUZWxsZykgeworICAgICAgICBDUFBVTklUX0FTU0VSVCggKGludClpc3RyLnRlbGxnKCkgPT0gdGhlb3JpY2FsVGVsbGcgKTsKKyAgICAgIH0KKyAgICB9CisgICAgd2hpbGUgKCFpc3RyLmVvZigpKTsKKworICAgIENQUFVOSVRfQVNTRVJUKCBpc3RyLmVvZigpICk7CisgIH0KKyMgIGVuZGlmCisjZW5kaWYKK30KKwordm9pZCBDb2RlY3Z0VGVzdDo6aW5fb3V0X3Rlc3QoKQoreworI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCAhKGRlZmluZWQgKF9TVExQX05PX1dDSEFSX1QpIHx8ICFkZWZpbmVkIChfU1RMUF9VU0VfRVhDRVBUSU9OUykpCisgIHRyeSB7CisgICAgbG9jYWxlIGxvYygiIik7CisKKyAgICB0eXBlZGVmIGNvZGVjdnQ8d2NoYXJfdCwgY2hhciwgbWJzdGF0ZV90PiBjZGVjdnRfdHlwZTsKKyAgICBpZiAoaGFzX2ZhY2V0PGNkZWN2dF90eXBlPihsb2MpKSB7CisgICAgICBjZGVjdnRfdHlwZSBjb25zdCYgY2RlY3QgPSB1c2VfZmFjZXQ8Y2RlY3Z0X3R5cGU+KGxvYyk7CisgICAgICB7CisgICAgICAgIGNkZWN2dF90eXBlOjpzdGF0ZV90eXBlIHN0YXRlOworICAgICAgICBtZW1zZXQoJnN0YXRlLCAwLCBzaXplb2YoY2RlY3Z0X3R5cGU6OnN0YXRlX3R5cGUpKTsKKyAgICAgICAgc3RyaW5nIGZyb20oImFiY2RlZiIpOworICAgICAgICBjb25zdCBjaGFyKiBuZXh0X2Zyb207CisgICAgICAgIHdjaGFyX3QgdG9bMV07CisgICAgICAgIHdjaGFyX3QgKm5leHRfdG87CisgICAgICAgIGNkZWN2dF90eXBlOjpyZXN1bHQgcmVzID0gY2RlY3QuaW4oc3RhdGUsIGZyb20uZGF0YSgpLCBmcm9tLmRhdGEoKSArIGZyb20uc2l6ZSgpLCBuZXh0X2Zyb20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8sIHRvICsgc2l6ZW9mKHRvKSAvIHNpemVvZih3Y2hhcl90KSwgbmV4dF90byk7CisgICAgICAgIENQUFVOSVRfQVNTRVJUKCByZXMgPT0gY2RlY3Z0X3R5cGU6Om9rICk7CisgICAgICAgIENQUFVOSVRfQVNTRVJUKCBuZXh0X2Zyb20gPT0gZnJvbS5kYXRhKCkgKyAxICk7CisgICAgICAgIENQUFVOSVRfQVNTRVJUKCBuZXh0X3RvID09ICZ0b1swXSArIDEgKTsKKyAgICAgICAgQ1BQVU5JVF9BU1NFUlQoIHRvWzBdID09IEwnYScpOworICAgICAgfQorICAgICAgeworICAgICAgICBjZGVjdnRfdHlwZTo6c3RhdGVfdHlwZSBzdGF0ZTsKKyAgICAgICAgbWVtc2V0KCZzdGF0ZSwgMCwgc2l6ZW9mKGNkZWN2dF90eXBlOjpzdGF0ZV90eXBlKSk7CisgICAgICAgIHdzdHJpbmcgZnJvbShMImFiY2RlZiIpOworICAgICAgICBjb25zdCB3Y2hhcl90KiBuZXh0X2Zyb207CisgICAgICAgIGNoYXIgdG9bMV07CisgICAgICAgIGNoYXIgKm5leHRfdG87CisgICAgICAgIGNkZWN2dF90eXBlOjpyZXN1bHQgcmVzID0gY2RlY3Qub3V0KHN0YXRlLCBmcm9tLmRhdGEoKSwgZnJvbS5kYXRhKCkgKyBmcm9tLnNpemUoKSwgbmV4dF9mcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bywgdG8gKyBzaXplb2YodG8pIC8gc2l6ZW9mKGNoYXIpLCBuZXh0X3RvKTsKKyAgICAgICAgQ1BQVU5JVF9BU1NFUlQoIHJlcyA9PSBjZGVjdnRfdHlwZTo6b2sgKTsKKyAgICAgICAgQ1BQVU5JVF9BU1NFUlQoIG5leHRfZnJvbSA9PSBmcm9tLmRhdGEoKSArIDEgKTsKKyAgICAgICAgQ1BQVU5JVF9BU1NFUlQoIG5leHRfdG8gPT0gJnRvWzBdICsgMSApOworICAgICAgICBDUFBVTklUX0FTU0VSVCggdG9bMF0gPT0gJ2EnKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgY2F0Y2ggKHJ1bnRpbWVfZXJyb3IgY29uc3QmKSB7CisgIH0KKyAgY2F0Y2ggKC4uLikgeworICAgIENQUFVOSVRfRkFJTDsKKyAgfQorI2VuZGlmCit9CisKK3ZvaWQgQ29kZWN2dFRlc3Q6Omxlbmd0aF90ZXN0KCkKK3sKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgIShkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKSB8fCAhZGVmaW5lZCAoX1NUTFBfVVNFX0VYQ0VQVElPTlMpKQorICB0cnkgeworICAgIGxvY2FsZSBsb2MoIiIpOworCisgICAgdHlwZWRlZiBjb2RlY3Z0PHdjaGFyX3QsIGNoYXIsIG1ic3RhdGVfdD4gY2RlY3Z0X3R5cGU7CisgICAgaWYgKGhhc19mYWNldDxjZGVjdnRfdHlwZT4obG9jKSkgeworICAgICAgY2RlY3Z0X3R5cGUgY29uc3QmIGNkZWN0ID0gdXNlX2ZhY2V0PGNkZWN2dF90eXBlPihsb2MpOworICAgICAgeworICAgICAgICBjZGVjdnRfdHlwZTo6c3RhdGVfdHlwZSBzdGF0ZTsKKyAgICAgICAgbWVtc2V0KCZzdGF0ZSwgMCwgc2l6ZW9mKGNkZWN2dF90eXBlOjpzdGF0ZV90eXBlKSk7CisgICAgICAgIHN0cmluZyBmcm9tKCJhYmNkZWYiKTsKKyAgICAgICAgaW50IHJlcyA9IGNkZWN0Lmxlbmd0aChzdGF0ZSwgZnJvbS5kYXRhKCksIGZyb20uZGF0YSgpICsgZnJvbS5zaXplKCksIGZyb20uc2l6ZSgpKTsKKyAgICAgICAgQ1BQVU5JVF9BU1NFUlQoIChzaXplX3QpcmVzID09IGZyb20uc2l6ZSgpICk7CisgICAgICB9CisgICAgfQorICB9CisgIGNhdGNoIChydW50aW1lX2Vycm9yIGNvbnN0JikgeworICB9CisgIGNhdGNoICguLi4pIHsKKyAgICBDUFBVTklUX0ZBSUw7CisgIH0KKyNlbmRpZgorfQorCisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8ICEoZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkgfHwgIWRlZmluZWQgKF9TVExQX1VTRV9FWENFUFRJT05TKSkKK3R5cGVkZWYgc3RkOjpjb2RlY3Z0PHdjaGFyX3QsIGNoYXIsIG1ic3RhdGVfdD4gbXlfY29kZWN2dF9iYXNlOworCitjbGFzcyBteV9jb2RlY3Z0IDogcHVibGljIG15X2NvZGVjdnRfYmFzZSB7CitwdWJsaWM6CisgIGV4cGxpY2l0IG15X2NvZGVjdnQoc2l6ZV90IHIgPSAwKQorICAgOiBteV9jb2RlY3Z0X2Jhc2Uocikge30KKworcHJvdGVjdGVkOgorICB2aXJ0dWFsIHJlc3VsdCBkb19pbihzdGF0ZV90eXBlJiAvKnN0YXRlKi8sIGNvbnN0IGV4dGVybl90eXBlKiBmaXJzdDEsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4dGVybl90eXBlKiBsYXN0MSwgY29uc3QgZXh0ZXJuX3R5cGUqJiBuZXh0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuX3R5cGUqIGZpcnN0MiwgaW50ZXJuX3R5cGUqIGxhc3QyLAorICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5fdHlwZSomIG5leHQyKSBjb25zdCB7CisgICAgZm9yICggbmV4dDEgPSBmaXJzdDEsIG5leHQyID0gZmlyc3QyOyBuZXh0MSA8IGxhc3QxOyBuZXh0MSArPSAyICkgeworICAgICAgaWYgKCAobGFzdDEgLSBuZXh0MSkgPCAyIHx8IChsYXN0MiAtIG5leHQyKSA8IDEgKQorICAgICAgICByZXR1cm4gcGFydGlhbDsKKyAgICAgICpuZXh0MisrID0gKGludGVybl90eXBlKSgoKihuZXh0MSArIDEpIDw8IDgpIHwgKCpuZXh0MSAmIDI1NSkpOworICAgIH0KKyAgICByZXR1cm4gb2s7CisgIH0KKyAgdmlydHVhbCBib29sIGRvX2Fsd2F5c19ub2NvbnYoKSBjb25zdCBfX05PX1RIUk9XCisgIHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgaW50IGRvX21heF9sZW5ndGgoKSBjb25zdCBfX05PX1RIUk9XCisgIHsgcmV0dXJuIDI7IH0KKyAgdmlydHVhbCBpbnQgZG9fZW5jb2RpbmcoKSBjb25zdCBfX05PX1RIUk9XCisgIHsgcmV0dXJuIDI7IH0KK307CisjZW5kaWYKKwordm9pZCBDb2RlY3Z0VGVzdDo6aW1idWVfd2hpbGVfcmVhZGluZygpCit7CisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8ICEoZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkgfHwgIWRlZmluZWQgKF9TVExQX1VTRV9FWENFUFRJT05TKSkKKyAgeworICAgIHdvZnN0cmVhbSBvZnMoICJ0ZXN0LnR4dCIgKTsKKyAgICBjb25zdCB3Y2hhcl90IGJ1ZltdID0gTCIgIjsKKyAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCA0MDk4OyArK2kgKSB7CisgICAgICBvZnMgPDwgYnVmWzBdOworICAgIH0KKyAgfQorCisgIHdpZnN0cmVhbSBpZnMoInRlc3QudHh0Iik7IC8vIGEgZmlsZSBjb250YWluaW5nIDQwOTggd2NoYXJzCisKKyAgaWZzLmltYnVlKCBsb2NhbGUobG9jYWxlKCksIG5ldyBteV9jb2RlY3Z0KSApOworICBpZnMuZ2V0KCk7CisgIGlmcy5zZWVrZygwKTsKKyAgaWZzLmltYnVlKCBsb2NhbGUoKSApOworICBpZnMuaWdub3JlKDQwOTYpOworICBpbnQgY2ggPSBpZnMuZ2V0KCk7CisgIENQUFVOSVRfQ0hFQ0soIGNoICE9IChpbnQpV0VPRiApOworI2VuZGlmCit9CisKK3ZvaWQgQ29kZWN2dFRlc3Q6OnNwZWNpYWxfZW5jb2RpbmdzKCkKK3sKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgKCFkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKSAmJiBkZWZpbmVkIChfU1RMUF9VU0VfRVhDRVBUSU9OUykpCisgIHsKKyAgICBsb2NhbGUgbG9jKGxvY2FsZTo6Y2xhc3NpYygpLCBuZXcgY29kZWN2dF9ieW5hbWU8d2NoYXJfdCwgY2hhciwgbWJzdGF0ZV90PigiQyIpKTsKKyAgICBjb2RlY3Z0PHdjaGFyX3QsIGNoYXIsIG1ic3RhdGVfdD4gY29uc3QmIGN2dCA9IHVzZV9mYWNldDxjb2RlY3Z0PHdjaGFyX3QsIGNoYXIsIG1ic3RhdGVfdD4gPihsb2MpOworICAgIG1ic3RhdGVfdCBzdGF0ZTsKKyAgICBtZW1zZXQoJnN0YXRlLCAwLCBzaXplb2YobWJzdGF0ZV90KSk7CisgICAgY2hhciBjID0gJzAnOworICAgIGNvbnN0IGNoYXIgKmZyb21fbmV4dDsKKyAgICB3Y2hhcl90IHdjOworICAgIHdjaGFyX3QgKnRvX25leHQ7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGN2dC5pbihzdGF0ZSwgJmMsICZjICsgMSwgZnJvbV9uZXh0LCAmd2MsICZ3YywgdG9fbmV4dCkgPT0gY29kZWN2dF9iYXNlOjpvayApOworICAgIENQUFVOSVRfQVNTRVJUKCB0b19uZXh0ID09ICZ3YyApOworICAgIENQUFVOSVRfQVNTRVJUKCBjdnQuaW4oc3RhdGUsICZjLCAmYyArIDEsIGZyb21fbmV4dCwgJndjLCAmd2MgKyAxLCB0b19uZXh0KSA9PSBjb2RlY3Z0X2Jhc2U6Om9rICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHdjID09IEwnMCcgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggdG9fbmV4dCA9PSAmd2MgKyAxICk7CisgIH0KKyAgdHJ5CisgIHsKKyAgICB3c3RyaW5nIGNwOTM2X3dzdHI7CisgICAgY29uc3Qgc3RyaW5nIGNwOTM2X3N0ciA9ICJceGQ2XHhkMFx4YjlceGZhXHhjOVx4ZTdceGJiXHhlMVx4YmZceGM2XHhkMVx4YTdceGQ0XHhiYVx4YjdceGEyXHhiMlx4YmNceDMyXHgzMFx4MzBceDM4XHhjNFx4ZWFceGExXHhiNlx4YmVceGFkXHhiY1x4YzNceGMwXHhiNlx4YzZceGE0XHhjYVx4ZTlceGExXHhiN1x4ZDZceGI4XHhiM1x4ZjZceGEzXHhhY1x4MzJceDMwXHgzMFx4MzdceGM0XHhlYVx4ZDZceGQwXHhiOVx4ZmFceGJlXHhhZFx4YmNceGMzXHhkNFx4ZjZceGIzXHhhNFx4ZDNceGM5XHhjNlx4YWJceGJmXHhlY1x4ZDdceGFhXHhjZlx4ZjJceGI5XHhmZFx4YzhceGM4XHhiNVx4YzRceGM3XHhmN1x4Y2FceGM2XHhjM1x4ZjdceGNmXHhkNFx4ZDRceGE0XHhiY1x4YzZceGM4XHhhYlx4YzRceGVhXHg0N1x4NDRceDUwXHhkNFx4ZjZceGNiXHhkOVx4YmRceGFiXHhiNFx4ZWZceDMxXHgzMVx4MmVceDM2XHgyNVx4YTFceGEzIjsKKyAgICBsb2NhbGUgbG9jKGxvY2FsZTo6Y2xhc3NpYygpLCAiLjkzNiIsIGxvY2FsZTo6Y3R5cGUpOworICAgIGNvZGVjdnQ8d2NoYXJfdCwgY2hhciwgbWJzdGF0ZV90PiBjb25zdCYgY3Z0ID0gdXNlX2ZhY2V0PGNvZGVjdnQ8d2NoYXJfdCwgY2hhciwgbWJzdGF0ZV90PiA+KGxvYyk7CisgICAgbWJzdGF0ZV90IHN0YXRlOworICAgIG1lbXNldCgmc3RhdGUsIDAsIHNpemVvZihtYnN0YXRlX3QpKTsKKworICAgIGNvZGVjdnRfYmFzZTo6cmVzdWx0IHJlczsKKworICAgIHsKKyAgICAgIHdjaGFyX3Qgd2J1Zls0MDk2XTsKKyAgICAgIC8vIENoZWNrIHdlIHdpbGwgaGF2ZSBlbm91Z2ggcm9vbSBmb3IgdGhlIGdlbmVyYXRlZCB3aWRlIHN0cmluZyBnZW5lcmF0ZWQgZnJvbSB0aGUgd2hvbGUgY2hhciBidWZmZXI6CisgICAgICBpbnQgbGVuID0gY3Z0Lmxlbmd0aChzdGF0ZSwgY3A5MzZfc3RyLmRhdGEoKSwgY3A5MzZfc3RyLmRhdGEoKSArIGNwOTM2X3N0ci5zaXplKCksIHNpemVvZih3YnVmKSAvIHNpemVvZih3Y2hhcl90KSk7CisgICAgICBDUFBVTklUX0FTU0VSVCggY3A5MzZfc3RyLnNpemUoKSA9PSAoc2l6ZV90KWxlbiApOworCisgICAgICBjb25zdCBjaGFyICpmcm9tX25leHQ7CisgICAgICB3Y2hhcl90ICp0b19uZXh0OworICAgICAgcmVzID0gY3Z0LmluKHN0YXRlLCBjcDkzNl9zdHIuZGF0YSgpLCBjcDkzNl9zdHIuZGF0YSgpICsgY3A5MzZfc3RyLnNpemUoKSwgZnJvbV9uZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICB3YnVmLCB3YnVmICsgc2l6ZW9mKHdidWYpIC8gc2l6ZW9mKHdjaGFyX3QpLCB0b19uZXh0KTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCByZXMgPT0gY29kZWN2dF9iYXNlOjpvayApOworICAgICAgQ1BQVU5JVF9BU1NFUlQoIGZyb21fbmV4dCA9PSBjcDkzNl9zdHIuZGF0YSgpICsgY3A5MzZfc3RyLnNpemUoKSApOworICAgICAgY3A5MzZfd3N0ci5hc3NpZ24od2J1ZiwgdG9fbmV4dCk7CisgICAgfQorCisgICAgeworICAgICAgY29uc3Qgd2NoYXJfdCAqZnJvbV9uZXh0OworICAgICAgY2hhciBidWZbNDA5Nl07CisgICAgICBjaGFyICp0b19uZXh0OworICAgICAgcmVzID0gY3Z0Lm91dChzdGF0ZSwgY3A5MzZfd3N0ci5kYXRhKCksIGNwOTM2X3dzdHIuZGF0YSgpICsgY3A5MzZfd3N0ci5zaXplKCksIGZyb21fbmV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiwgYnVmICsgc2l6ZW9mKGJ1ZiksIHRvX25leHQpOworICAgICAgQ1BQVU5JVF9BU1NFUlQoIHJlcyA9PSBjb2RlY3Z0X2Jhc2U6Om9rICk7CisgICAgICBDUFBVTklUX0NIRUNLKCBzdHJpbmcoYnVmLCB0b19uZXh0KSA9PSBjcDkzNl9zdHIgKTsKKyAgICB9CisgIH0KKyAgY2F0Y2ggKGNvbnN0IHJ1bnRpbWVfZXJyb3ImKQorICB7CisgICAgQ1BQVU5JVF9NRVNTQUdFKCJOb3QgZW5vdWdoIHBsYXRmb3JtIGxvY2FsaXphdGlvbiBzdXBwb3J0IHRvIGNoZWNrIDkzNiBjb2RlIHBhZ2UgZW5jb2RpbmcuIik7CisgIH0KKyAgdHJ5CisgIHsKKyAgICBjb25zdCBzdHJpbmcgdXRmOF9zdHIgPSAiXHhlNFx4YjhceGFkXHhlNVx4OWJceGJkXHhlN1x4YTRceGJlXHhlNFx4YmNceDlhXHhlN1x4YTdceDkxXHhlNVx4YWRceGE2XHhlOVx4OTlceGEyXHhlNVx4OGZceDkxXHhlNVx4YjhceDgzXHgzMlx4MzBceDMwXHgzOFx4ZTVceGI5XHhiNFx4ZTNceDgwXHg4YVx4ZTdceGJiXHg4Zlx4ZTZceGI1XHg4ZVx4ZThceDkzXHg5ZFx4ZTdceDlhXHhhZVx4ZTRceGI5XHhhNlx4ZTNceDgwXHg4Ylx4ZTZceDhjXHg4N1x4ZTVceDg3XHhiYVx4ZWZceGJjXHg4Y1x4MzJceDMwXHgzMFx4MzdceGU1XHhiOVx4YjRceGU0XHhiOFx4YWRceGU1XHg5Ylx4YmRceGU3XHhiYlx4OGZceGU2XHhiNVx4OGVceGU1XHhhMlx4OWVceGU5XHg5NVx4YmZceGU3XHg5NFx4YjFceGU1XHg4MVx4OGZceGU1XHhiZlx4YWJceGU4XHhiZFx4YWNceGU1XHg5MFx4OTFceGU4XHhiZlx4ODdceGU3XHg4M1x4YWRceGU3XHg5YVx4ODRceGU4XHhiNlx4OGJceGU1XHg4YVx4YmZceGU2XHg5OFx4OGVceGU2XHg5OFx4YmVceGU5XHhhMlx4ODRceGU4XHhhZVx4YTFceGU1XHg4NVx4YThceGU1XHhiOVx4YjRceDQ3XHg0NFx4NTBceGU1XHhhMlx4OWVceGU5XHg4MFx4OWZceGU1XHhiMFx4ODZceGU4XHhiZVx4YmVceDMxXHgzMVx4MmVceDM2XHgyNVx4ZTNceDgwXHg4MiI7CisgICAgd3N0cmluZyB1dGY4X3dzdHI7CisgICAgbG9jYWxlIGxvYyhsb2NhbGU6OmNsYXNzaWMoKSwgbmV3IGNvZGVjdnRfYnluYW1lPHdjaGFyX3QsIGNoYXIsIG1ic3RhdGVfdD4oIi51dGY4IikpOworICAgIGNvZGVjdnQ8d2NoYXJfdCwgY2hhciwgbWJzdGF0ZV90PiBjb25zdCYgY3Z0ID0gdXNlX2ZhY2V0PGNvZGVjdnQ8d2NoYXJfdCwgY2hhciwgbWJzdGF0ZV90PiA+KGxvYyk7CisgICAgbWJzdGF0ZV90IHN0YXRlOworICAgIG1lbXNldCgmc3RhdGUsIDAsIHNpemVvZihtYnN0YXRlX3QpKTsKKworICAgIGNvZGVjdnRfYmFzZTo6cmVzdWx0IHJlczsKKworICAgIHsKKyAgICAgIHdjaGFyX3Qgd2J1Zls0MDk2XTsKKyAgICAgIC8vIENoZWNrIHdlIHdpbGwgaGF2ZSBlbm91Z2ggcm9vbSBmb3IgdGhlIHdpZGUgc3RyaW5nIGdlbmVyYXRlZCBmcm9tIHRoZSB3aG9sZSBjaGFyIGJ1ZmZlcjoKKyAgICAgIGludCBsZW4gPSBjdnQubGVuZ3RoKHN0YXRlLCB1dGY4X3N0ci5kYXRhKCksIHV0Zjhfc3RyLmRhdGEoKSArIHV0Zjhfc3RyLnNpemUoKSwgc2l6ZW9mKHdidWYpIC8gc2l6ZW9mKHdjaGFyX3QpKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCB1dGY4X3N0ci5zaXplKCkgPT0gKHNpemVfdClsZW4gKTsKKworICAgICAgY29uc3QgY2hhciAqZnJvbV9uZXh0OworICAgICAgd2NoYXJfdCAqdG9fbmV4dDsKKyAgICAgIHJlcyA9IGN2dC5pbihzdGF0ZSwgdXRmOF9zdHIuZGF0YSgpLCB1dGY4X3N0ci5kYXRhKCkgKyB1dGY4X3N0ci5zaXplKCksIGZyb21fbmV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgd2J1Ziwgd2J1ZiArIHNpemVvZih3YnVmKSAvIHNpemVvZih3Y2hhcl90KSwgdG9fbmV4dCk7CisgICAgICBDUFBVTklUX0FTU0VSVCggcmVzID09IGNvZGVjdnRfYmFzZTo6b2sgKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBmcm9tX25leHQgPT0gdXRmOF9zdHIuZGF0YSgpICsgdXRmOF9zdHIuc2l6ZSgpICk7CisgICAgICB1dGY4X3dzdHIuYXNzaWduKHdidWYsIHRvX25leHQpOworCisgICAgICAvLyBUcnkgdG8gcmVhZCBvbmUgY2hhciBhZnRlciB0aGUgb3RoZXI6CisgICAgICB3Y2hhcl90IHdjOworICAgICAgY29uc3QgY2hhciogZnJvbSA9IHV0Zjhfc3RyLmRhdGEoKTsKKyAgICAgIGNvbnN0IGNoYXIqIGZyb21fZW5kID0gZnJvbSArIHV0Zjhfc3RyLnNpemUoKTsKKyAgICAgIGZyb21fbmV4dCA9IHV0Zjhfc3RyLmRhdGEoKTsKKyAgICAgIHNpemVfdCBsZW5ndGggPSAxOworICAgICAgc2l6ZV90IHdpbmRleCA9IDA7CisgICAgICB3aGlsZSAoZnJvbSArIGxlbmd0aCA8PSBmcm9tX2VuZCkgeworICAgICAgICByZXMgPSBjdnQuaW4oc3RhdGUsIGZyb20sIGZyb20gKyBsZW5ndGgsIGZyb21fbmV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2MsICZ3YyArIDEsIHRvX25leHQpOworICAgICAgICBzd2l0Y2ggKHJlcykgeworICAgICAgICAgIGNhc2UgY29kZWN2dF9iYXNlOjpvazoKKyAgICAgICAgICAgIC8vIHJlc2V0IGxlbmd0aDoKKyAgICAgICAgICAgIGZyb20gPSBmcm9tX25leHQ7CisgICAgICAgICAgICBsZW5ndGggPSAxOworICAgICAgICAgICAgQ1BQVU5JVF9BU1NFUlQoIHdjID09IHV0Zjhfd3N0clt3aW5kZXgrK10gKTsKKyAgICAgICAgICAgIHdjID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgY29kZWN2dF9iYXNlOjpwYXJ0aWFsOgorICAgICAgICAgICAgaWYgKGZyb21fbmV4dCA9PSBmcm9tKQorICAgICAgICAgICAgICAvLyBmcm9tX25leHQgaGFzbid0IG1vdmUgc28gd2UgaGF2ZSB0byBwYXNzIG1vcmUgY2hhcnMKKyAgICAgICAgICAgICAgKytsZW5ndGg7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIC8vIGNoYXIgYmV0d2VlbiBmcm9tIGFuZCBmcm9tX25leHQgaGFzIGJlZW4gZWF0ZW4sIHdlIHNpbXBseSByZXN0YXJ0CisgICAgICAgICAgICAgIC8vIGNvbnZlcnNpb24gZnJvbSBmcm9tX25leHQ6CisgICAgICAgICAgICAgIGZyb20gPSBmcm9tX25leHQ7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICBjYXNlIGNvZGVjdnRfYmFzZTo6ZXJyb3I6CisgICAgICAgICAgY2FzZSBjb2RlY3Z0X2Jhc2U6Om5vY29udjoKKyAgICAgICAgICAgIENQUFVOSVRfRkFJTDsKKyAgICAgICAgICAgIC8vYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIENQUFVOSVRfQVNTRVJUKCB3aW5kZXggPT0gdXRmOF93c3RyLnNpemUoKSApOworICAgIH0KKworICAgIHsKKyAgICAgIGNvbnN0IHdjaGFyX3QgKmZyb21fbmV4dDsKKyAgICAgIGNoYXIgYnVmWzQwOTZdOworICAgICAgY2hhciAqdG9fbmV4dDsKKyAgICAgIHJlcyA9IGN2dC5vdXQoc3RhdGUsIHV0Zjhfd3N0ci5kYXRhKCksIHV0Zjhfd3N0ci5kYXRhKCkgKyB1dGY4X3dzdHIuc2l6ZSgpLCBmcm9tX25leHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYsIGJ1ZiArIHNpemVvZihidWYpLCB0b19uZXh0KTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCByZXMgPT0gY29kZWN2dF9iYXNlOjpvayApOworICAgICAgQ1BQVU5JVF9DSEVDSyggc3RyaW5nKGJ1ZiwgdG9fbmV4dCkgPT0gdXRmOF9zdHIgKTsKKyAgICB9CisKKyAgICB7CisgICAgICAvLyBDaGVjayB0aGF0IGFuIG9idmlvdXNseSB3cm9uZyBVVEY4IGVuY29kZWQgc3RyaW5nIGlzIGNvcnJlY3RseSBkZXRlY3RlZDoKKyAgICAgIGNvbnN0IHN0cmluZyBiYWRfdXRmOF9zdHIoIlx4ZGZceGRmXHhkZlx4ZGZceGRmIik7CisgICAgICB3Y2hhcl90IHdjOworICAgICAgY29uc3QgY2hhciAqZnJvbV9uZXh0OworICAgICAgd2NoYXJfdCAqdG9fbmV4dDsKKyAgICAgIHJlcyA9IGN2dC5pbihzdGF0ZSwgYmFkX3V0Zjhfc3RyLmRhdGEoKSwgYmFkX3V0Zjhfc3RyLmRhdGEoKSArIGJhZF91dGY4X3N0ci5zaXplKCksIGZyb21fbmV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJndjLCAmd2MgKyAxLCB0b19uZXh0KTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCByZXMgPT0gY29kZWN2dF9iYXNlOjplcnJvciApOworICAgIH0KKyAgfQorICBjYXRjaCAoY29uc3QgcnVudGltZV9lcnJvciYpCisgIHsKKyAgICBDUFBVTklUX01FU1NBR0UoIk5vdCBlbm91Z2ggcGxhdGZvcm0gbG9jYWxpemF0aW9uIHN1cHBvcnQgdG8gY2hlY2sgVVRGOCBlbmNvZGluZy4iKTsKKyAgfQorI2VuZGlmCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L2NvbGxhdGVfZmFjZXRzX3Rlc3QuY3BwIGIvdGVzdC91bml0L2NvbGxhdGVfZmFjZXRzX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2YTFiMTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvY29sbGF0ZV9mYWNldHNfdGVzdC5jcHAKQEAgLTAsMCArMSwyNzkgQEAKKyNpbmNsdWRlICJsb2NhbGVfdGVzdC5oIgorCisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8ICFkZWZpbmVkIChfU1RMUF9VU0VfTk9fSU9TVFJFQU1TKQorIyAgaW5jbHVkZSA8bG9jYWxlPgorIyAgaW5jbHVkZSA8c3RkZXhjZXB0PgorIyAgaW5jbHVkZSA8YWxnb3JpdGhtPgorIyAgaW5jbHVkZSA8dmVjdG9yPgorCisjICBpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZChfU1RMUF9VU0VfTkFNRVNQQUNFUykKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisjICBlbmRpZgorCisvLworLy8gdGVzdHMgaW1wbGVtZW50YXRpb24KKy8vCit2b2lkIExvY2FsZVRlc3Q6OmNvbGxhdGVfZmFjZXQoKQoreworICB7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGhhc19mYWNldDxjb2xsYXRlPGNoYXI+ID4obG9jYWxlOjpjbGFzc2ljKCkpICk7CisgICAgY29sbGF0ZTxjaGFyPiBjb25zdCYgY29sID0gdXNlX2ZhY2V0PGNvbGxhdGU8Y2hhcj4gPihsb2NhbGU6OmNsYXNzaWMoKSk7CisKKyAgICBjaGFyIGNvbnN0IHN0cjFbXSA9ICJhYmNkZWYxIjsKKyAgICBjaGFyIGNvbnN0IHN0cjJbXSA9ICJhYmNkZWYyIjsKKyAgICBjb25zdCBzaXplX3Qgc2l6ZTEgPSBzaXplb2Yoc3RyMSkgLyBzaXplb2Yoc3RyMVswXSkgLSAxOworICAgIGNvbnN0IHNpemVfdCBzaXplMiA9IHNpemVvZihzdHIyKSAvIHNpemVvZihzdHIyWzBdKSAtIDE7CisKKyAgICBDUFBVTklUX0FTU0VSVCggY29sLmNvbXBhcmUoc3RyMSwgc3RyMSArIHNpemUxIC0gMSwgc3RyMiwgc3RyMiArIHNpemUyIC0gMSkgPT0gMCApOworICAgIENQUFVOSVRfQVNTRVJUKCBjb2wuY29tcGFyZShzdHIxLCBzdHIxICsgc2l6ZTEsIHN0cjIsIHN0cjIgKyBzaXplMikgPT0gLTEgKTsKKworICAgIC8vU21hbGxlc3Qgc3RyaW5nIHNob3VsZCBiZSBiZWZvcmUgbGFyZ2VzdCBvbmU6CisgICAgQ1BQVU5JVF9BU1NFUlQoIGNvbC5jb21wYXJlKHN0cjEsIHN0cjEgKyBzaXplMSAtIDIsIHN0cjIsIHN0cjIgKyBzaXplMiAtIDEpID09IC0xICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGNvbC5jb21wYXJlKHN0cjEsIHN0cjEgKyBzaXplMSAtIDEsIHN0cjIsIHN0cjIgKyBzaXplMiAtIDIpID09IDEgKTsKKyAgfQorCisjICBpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZCAoX1NUTFBfVVNFX0VYQ0VQVElPTlMpCisgIHRyeSB7CisgICAgbG9jYWxlIGxvYygiZnJfRlIiKTsKKyAgICB7CisgICAgICBDUFBVTklUX0FTU0VSVCggaGFzX2ZhY2V0PGNvbGxhdGU8Y2hhcj4gPihsb2MpICk7CisgICAgICBjb2xsYXRlPGNoYXI+IGNvbnN0JiBjb2wgPSB1c2VfZmFjZXQ8Y29sbGF0ZTxjaGFyPiA+KGxvYyk7CisKKyAgICAgIGNoYXIgY29uc3Qgc3RyMVtdID0gImFiY2RlZjEiOworICAgICAgY2hhciBjb25zdCBzdHIyW10gPSAiYWJjZGVmMiI7CisgICAgICBjb25zdCBzaXplX3Qgc2l6ZTEgPSBzaXplb2Yoc3RyMSkgLyBzaXplb2Yoc3RyMVswXSkgLSAxOworICAgICAgY29uc3Qgc2l6ZV90IHNpemUyID0gc2l6ZW9mKHN0cjIpIC8gc2l6ZW9mKHN0cjJbMF0pIC0gMTsKKworICAgICAgQ1BQVU5JVF9BU1NFUlQoIGNvbC5jb21wYXJlKHN0cjEsIHN0cjEgKyBzaXplMSAtIDEsIHN0cjIsIHN0cjIgKyBzaXplMiAtIDEpID09IDAgKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBjb2wuY29tcGFyZShzdHIxLCBzdHIxICsgc2l6ZTEsIHN0cjIsIHN0cjIgKyBzaXplMikgPT0gLTEgKTsKKworICAgICAgLy9TbWFsbGVzdCBzdHJpbmcgc2hvdWxkIGJlIGJlZm9yZSBsYXJnZXN0IG9uZToKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBjb2wuY29tcGFyZShzdHIxLCBzdHIxICsgc2l6ZTEgLSAyLCBzdHIyLCBzdHIyICsgc2l6ZTIgLSAxKSA9PSAtMSApOworICAgICAgQ1BQVU5JVF9BU1NFUlQoIGNvbC5jb21wYXJlKHN0cjEsIHN0cjEgKyBzaXplMSAtIDEsIHN0cjIsIHN0cjIgKyBzaXplMiAtIDIpID09IDEgKTsKKyAgICB9CisgICAgeworICAgICAgQ1BQVU5JVF9BU1NFUlQoIGhhc19mYWNldDxjb2xsYXRlPGNoYXI+ID4obG9jKSApOworICAgICAgY29sbGF0ZTxjaGFyPiBjb25zdCYgY29sID0gdXNlX2ZhY2V0PGNvbGxhdGU8Y2hhcj4gPihsb2MpOworCisgICAgICBzdHJpbmcgc3Ryc1tdID0geyJhYmRkIiwgImFi52QiLCAiYWJiZCIsICJhYmNkIn07CisKKyAgICAgIHN0cmluZyB0cmFuc2Zvcm1lZFs0XTsKKyAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgICAgIHRyYW5zZm9ybWVkW2ldID0gY29sLnRyYW5zZm9ybShzdHJzW2ldLmRhdGEoKSwgc3Ryc1tpXS5kYXRhKCkgKyBzdHJzW2ldLnNpemUoKSk7CisgICAgICB9CisKKyAgICAgIHNvcnQoc3Rycywgc3RycyArIDQsIGxvYyk7CisgICAgICBDUFBVTklUX0FTU0VSVCggc3Ryc1swXSA9PSAiYWJiZCIgKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBzdHJzWzFdID09ICJhYmNkIiApOworICAgICAgQ1BQVU5JVF9BU1NFUlQoIHN0cnNbMl0gPT0gImFi52QiICk7CisgICAgICBDUFBVTklUX0FTU0VSVCggc3Ryc1szXSA9PSAiYWJkZCIgKTsKKworICAgICAgc29ydCh0cmFuc2Zvcm1lZCwgdHJhbnNmb3JtZWQgKyA0KTsKKworICAgICAgQ1BQVU5JVF9BU1NFUlQoIGNvbC50cmFuc2Zvcm0oc3Ryc1swXS5kYXRhKCksIHN0cnNbMF0uZGF0YSgpICsgc3Ryc1swXS5zaXplKCkpID09IHRyYW5zZm9ybWVkWzBdICk7CisgICAgICBDUFBVTklUX0FTU0VSVCggY29sLnRyYW5zZm9ybShzdHJzWzFdLmRhdGEoKSwgc3Ryc1sxXS5kYXRhKCkgKyBzdHJzWzFdLnNpemUoKSkgPT0gdHJhbnNmb3JtZWRbMV0gKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBjb2wudHJhbnNmb3JtKHN0cnNbMl0uZGF0YSgpLCBzdHJzWzJdLmRhdGEoKSArIHN0cnNbMl0uc2l6ZSgpKSA9PSB0cmFuc2Zvcm1lZFsyXSApOworICAgICAgQ1BQVU5JVF9BU1NFUlQoIGNvbC50cmFuc2Zvcm0oc3Ryc1szXS5kYXRhKCksIHN0cnNbM10uZGF0YSgpICsgc3Ryc1szXS5zaXplKCkpID09IHRyYW5zZm9ybWVkWzNdICk7CisKKyAgICAgIC8vIENoZWNrIGVtcHR5IHN0cmluZyByZXN1bHQgaW4gZW1wdHkga2V5LgorICAgICAgQ1BQVU5JVF9BU1NFUlQoIGNvbC50cmFuc2Zvcm0oc3Ryc1swXS5kYXRhKCksIHN0cnNbMF0uZGF0YSgpKS5lbXB0eSgpICk7CisKKyAgICAgIC8vIENoZWNrIHRoYXQgb25seSBjaGFyYWN0ZXJzIHRoYXQgbWF0dGVyIGFyZSB0YWtlbiBpbnRvIGFjY291dCB0byBidWlsZCB0aGUga2V5LgorICAgICAgQ1BQVU5JVF9BU1NFUlQoIGNvbC50cmFuc2Zvcm0oc3Ryc1swXS5kYXRhKCksIHN0cnNbMF0uZGF0YSgpICsgMikgPT0gY29sLnRyYW5zZm9ybShzdHJzWzFdLmRhdGEoKSwgc3Ryc1sxXS5kYXRhKCkgKyAyKSApOworICAgIH0KKyMgICAgaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8ICFkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQorICAgIHsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBoYXNfZmFjZXQ8Y29sbGF0ZTx3Y2hhcl90PiA+KGxvYykgKTsKKyAgICAgIGNvbGxhdGU8d2NoYXJfdD4gY29uc3QmIGNvbCA9IHVzZV9mYWNldDxjb2xsYXRlPHdjaGFyX3Q+ID4obG9jKTsKKworICAgICAgd2NoYXJfdCBjb25zdCBzdHIxW10gPSBMImFiY2RlZjEiOworICAgICAgd2NoYXJfdCBjb25zdCBzdHIyW10gPSBMImFiY2RlZjIiOworICAgICAgY29uc3Qgc2l6ZV90IHNpemUxID0gc2l6ZW9mKHN0cjEpIC8gc2l6ZW9mKHN0cjFbMF0pIC0gMTsKKyAgICAgIGNvbnN0IHNpemVfdCBzaXplMiA9IHNpemVvZihzdHIyKSAvIHNpemVvZihzdHIyWzBdKSAtIDE7CisKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBjb2wuY29tcGFyZShzdHIxLCBzdHIxICsgc2l6ZTEgLSAxLCBzdHIyLCBzdHIyICsgc2l6ZTIgLSAxKSA9PSAwICk7CisgICAgICBDUFBVTklUX0FTU0VSVCggY29sLmNvbXBhcmUoc3RyMSwgc3RyMSArIHNpemUxLCBzdHIyLCBzdHIyICsgc2l6ZTIpID09IC0xICk7CisKKyAgICAgIC8vU21hbGxlc3Qgc3RyaW5nIHNob3VsZCBiZSBiZWZvcmUgbGFyZ2VzdCBvbmU6CisgICAgICBDUFBVTklUX0FTU0VSVCggY29sLmNvbXBhcmUoc3RyMSwgc3RyMSArIHNpemUxIC0gMiwgc3RyMiwgc3RyMiArIHNpemUyIC0gMSkgPT0gLTEgKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBjb2wuY29tcGFyZShzdHIxLCBzdHIxICsgc2l6ZTEgLSAxLCBzdHIyLCBzdHIyICsgc2l6ZTIgLSAyKSA9PSAxICk7CisgICAgfQorICAgIHsKKyAgICAgIHNpemVfdCBpOworICAgICAgQ1BQVU5JVF9BU1NFUlQoIGhhc19mYWNldDxjb2xsYXRlPHdjaGFyX3Q+ID4obG9jKSApOworICAgICAgY29sbGF0ZTx3Y2hhcl90PiBjb25zdCYgY29sID0gdXNlX2ZhY2V0PGNvbGxhdGU8d2NoYXJfdD4gPihsb2MpOworCisgICAgICAvLyBIZXJlIHdlIHdvdWxkIGxpa2UgdG8gdXNlIEwiYWLnZCIgYnV0IGl0IGxvb2tzIGxpa2UgYWxsIGNvbXBpbGVycworICAgICAgLy8gZG8gbm90IHN1cHBvcnQgc3RvcmFnZSBvZiB1bmljb2RlIGNoYXJhY3RlcnMgaW4gZXhlIHJlc3VsdGluZyBpbgorICAgICAgLy8gY29tcGlsYXRpb24gZXJyb3IuIFdlIGF2b2lkIHRoaXMgdGVzdCBmb3IgdGhlIG1vbWVudC4KKyAgICAgIHdzdHJpbmcgc3Ryc1tdID0ge0wiYWJkZCIsIEwiYWJjZCIsIEwiYWJiZCIsIEwiYWJjZCJ9OworCisgICAgICB3c3RyaW5nIHRyYW5zZm9ybWVkWzRdOworICAgICAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgeworICAgICAgICB0cmFuc2Zvcm1lZFtpXSA9IGNvbC50cmFuc2Zvcm0oc3Ryc1tpXS5kYXRhKCksIHN0cnNbaV0uZGF0YSgpICsgc3Ryc1tpXS5zaXplKCkpOworICAgICAgfQorCisgICAgICBzb3J0KHN0cnMsIHN0cnMgKyA0LCBsb2MpOworICAgICAgQ1BQVU5JVF9BU1NFUlQoIHN0cnNbMF0gPT0gTCJhYmJkIiApOworICAgICAgQ1BQVU5JVF9BU1NFUlQoIHN0cnNbMV0gPT0gTCJhYmNkIiApOworICAgICAgQ1BQVU5JVF9BU1NFUlQoIHN0cnNbMl0gPT0gTCJhYmNkIiApOworICAgICAgQ1BQVU5JVF9BU1NFUlQoIHN0cnNbM10gPT0gTCJhYmRkIiApOworCisgICAgICBzb3J0KHRyYW5zZm9ybWVkLCB0cmFuc2Zvcm1lZCArIDQpOworCisgICAgICBDUFBVTklUX0FTU0VSVCggY29sLnRyYW5zZm9ybShzdHJzWzBdLmRhdGEoKSwgc3Ryc1swXS5kYXRhKCkgKyBzdHJzWzBdLnNpemUoKSkgPT0gdHJhbnNmb3JtZWRbMF0gKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBjb2wudHJhbnNmb3JtKHN0cnNbMV0uZGF0YSgpLCBzdHJzWzFdLmRhdGEoKSArIHN0cnNbMV0uc2l6ZSgpKSA9PSB0cmFuc2Zvcm1lZFsxXSApOworICAgICAgQ1BQVU5JVF9BU1NFUlQoIGNvbC50cmFuc2Zvcm0oc3Ryc1syXS5kYXRhKCksIHN0cnNbMl0uZGF0YSgpICsgc3Ryc1syXS5zaXplKCkpID09IHRyYW5zZm9ybWVkWzJdICk7CisgICAgICBDUFBVTklUX0FTU0VSVCggY29sLnRyYW5zZm9ybShzdHJzWzNdLmRhdGEoKSwgc3Ryc1szXS5kYXRhKCkgKyBzdHJzWzNdLnNpemUoKSkgPT0gdHJhbnNmb3JtZWRbM10gKTsKKworICAgICAgQ1BQVU5JVF9BU1NFUlQoIGNvbC50cmFuc2Zvcm0oc3Ryc1swXS5kYXRhKCksIHN0cnNbMF0uZGF0YSgpKS5lbXB0eSgpICk7CisKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBjb2wudHJhbnNmb3JtKHN0cnNbMF0uZGF0YSgpLCBzdHJzWzBdLmRhdGEoKSArIDIpID09IGNvbC50cmFuc2Zvcm0oc3Ryc1sxXS5kYXRhKCksIHN0cnNbMV0uZGF0YSgpICsgMikgKTsKKyAgICB9CisjICAgIGVuZGlmCisgIH0KKyAgY2F0Y2ggKHJ1bnRpbWVfZXJyb3IgY29uc3QmKSB7CisgICAgQ1BQVU5JVF9NRVNTQUdFKCJObyBmcmVuY2ggbG9jYWxlIHRvIGNoZWNrIGNvbGxhdGUgZmFjZXQiKTsKKyAgfQorIyAgZW5kaWYKK30KKwordm9pZCBMb2NhbGVUZXN0Ojpjb2xsYXRlX2J5X25hbWUoKQoreworICAvKgorICAgKiBDaGVjayBvZiB0aGUgMjIuMS4xLjIuNyBzdGFuZGFyZCBwb2ludC4gQ29uc3RydWN0aW9uIG9mIGEgbG9jYWxlCisgICAqIGluc3RhbmNlIGZyb20gYSBudWxsIHBvaW50ZXIgb3IgYW4gdW5rbm93biBuYW1lIHNob3VsZCByZXN1bHQgaW4KKyAgICogYSBydW50aW1lX2Vycm9yIGV4Y2VwdGlvbi4KKyAgICovCisjICBpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZCAoX1NUTFBfVVNFX0VYQ0VQVElPTlMpCisjICAgIGlmIGRlZmluZWQgKFNUTFBPUlQpIHx8ICFkZWZpbmVkIChfX0dOVUNfXykKKyAgdHJ5IHsKKyAgICBsb2NhbGUgbG9jKGxvY2FsZTo6Y2xhc3NpYygpLCBuZXcgY29sbGF0ZV9ieW5hbWU8Y2hhcj4oc3RhdGljX2Nhc3Q8Y2hhciBjb25zdCo+KDApKSk7CisgICAgQ1BQVU5JVF9GQUlMOworICB9CisgIGNhdGNoIChydW50aW1lX2Vycm9yIGNvbnN0JiAvKiBlICovKSB7CisgICAgLy9DUFBVTklUX01FU1NBR0UoIGUud2hhdCgpICk7CisgIH0KKyAgY2F0Y2ggKC4uLikgeworICAgIENQUFVOSVRfRkFJTDsKKyAgfQorIyAgICBlbmRpZgorCisgIHRyeSB7CisgICAgbG9jYWxlIGxvYyhsb2NhbGU6OmNsYXNzaWMoKSwgbmV3IGNvbGxhdGVfYnluYW1lPGNoYXI+KCJ5YXNsaV9sYW5ndWFnZSIpKTsKKyAgICBDUFBVTklUX0ZBSUw7CisgIH0KKyAgY2F0Y2ggKHJ1bnRpbWVfZXJyb3IgY29uc3QmIC8qIGUgKi8pIHsKKyAgICAvL0NQUFVOSVRfTUVTU0FHRSggZS53aGF0KCkgKTsKKyAgfQorICBjYXRjaCAoLi4uKSB7CisgICAgQ1BQVU5JVF9GQUlMOworICB9CisKKyAgdHJ5IHsKKyAgICBzdHJpbmcgdmVyeUxvbmdGYWNldE5hbWUoIkxDX0NPTExBVEU9Iik7CisgICAgdmVyeUxvbmdGYWNldE5hbWUuYXBwZW5kKDUxMiwgJz8nKTsKKyAgICBsb2NhbGUgbG9jKGxvY2FsZTo6Y2xhc3NpYygpLCBuZXcgY29sbGF0ZV9ieW5hbWU8Y2hhcj4odmVyeUxvbmdGYWNldE5hbWUuY19zdHIoKSkpOworICAgIENQUFVOSVRfRkFJTDsKKyAgfQorICBjYXRjaCAocnVudGltZV9lcnJvciBjb25zdCYgLyogZSAqLykgeworICAgIC8vQ1BQVU5JVF9NRVNTQUdFKCBlLndoYXQoKSApOworICB9CisgIGNhdGNoICguLi4pIHsKKyAgICBDUFBVTklUX0ZBSUw7CisgIH0KKworICB0cnkgeworICAgIGxvY2FsZSBsb2MobG9jYWxlOjpjbGFzc2ljKCksICJDIiwgbG9jYWxlOjpjb2xsYXRlKTsKKyAgfQorICBjYXRjaCAocnVudGltZV9lcnJvciBjb25zdCYgZSkgeworICAgIENQUFVOSVRfTUVTU0FHRSggZS53aGF0KCkgKTsKKyAgICBDUFBVTklUX0ZBSUw7CisgIH0KKyAgY2F0Y2ggKC4uLikgeworICAgIENQUFVOSVRfRkFJTDsKKyAgfQorCisgIHRyeSB7CisgICAgLy8gT24gcGxhdGZvcm0gd2l0aG91dCByZWFsIGxvY2FsaXphdGlvbiBzdXBwb3J0IHdlIHNob3VsZCByZWx5IG9uIHRoZSAiQyIgZmFjZXQuCisgICAgbG9jYWxlIGxvYyhsb2NhbGU6OmNsYXNzaWMoKSwgIiIsIGxvY2FsZTo6Y29sbGF0ZSk7CisgIH0KKyAgY2F0Y2ggKHJ1bnRpbWVfZXJyb3IgY29uc3QmIGUpIHsKKyAgICBDUFBVTklUX01FU1NBR0UoIGUud2hhdCgpICk7CisgICAgQ1BQVU5JVF9GQUlMOworICB9CisgIGNhdGNoICguLi4pIHsKKyAgICBDUFBVTklUX0ZBSUw7CisgIH0KKworICB0cnkgeworICAgIGxvY2FsZSBsb2MobG9jYWxlOjpjbGFzc2ljKCksIG5ldyBjb2xsYXRlX2J5bmFtZTxjaGFyPigiQyIpKTsKKworICAgIC8vV2UgY2hlY2sgdGhhdCB0aGUgQyBsb2NhbGUgZ2l2ZXMgYSBsZXhpY29ncmFwaGljYWwgY29tcGFyaXNvbjoKKyAgICBjb2xsYXRlPGNoYXI+IGNvbnN0JiBjZmFjZXRfYnluYW1lID0gdXNlX2ZhY2V0PGNvbGxhdGU8Y2hhcj4gPihsb2MpOworICAgIGNvbGxhdGU8Y2hhcj4gY29uc3QmIGNmYWNldCA9IHVzZV9mYWNldDxjb2xsYXRlPGNoYXI+ID4obG9jYWxlOjpjbGFzc2ljKCkpOworCisgICAgY2hhciBjb25zdCBzdHIxW10gPSAiYWJjZGVmMSI7CisgICAgY2hhciBjb25zdCBzdHIyW10gPSAiYWJjZGVmMiI7CisgICAgY29uc3Qgc2l6ZV90IHNpemUxID0gc2l6ZW9mKHN0cjEpIC8gc2l6ZW9mKHN0cjFbMF0pIC0gMTsKKyAgICBjb25zdCBzaXplX3Qgc2l6ZTIgPSBzaXplb2Yoc3RyMikgLyBzaXplb2Yoc3RyMlswXSkgLSAxOworCisgICAgQ1BQVU5JVF9BU1NFUlQoIGNmYWNldF9ieW5hbWUuY29tcGFyZShzdHIxLCBzdHIxICsgc2l6ZTEgLSAxLCBzdHIyLCBzdHIyICsgc2l6ZTIgLSAxKSA9PQorICAgICAgICAgICAgICAgICAgICBjZmFjZXQuY29tcGFyZShzdHIxLCBzdHIxICsgc2l6ZTEgLSAxLCBzdHIyLCBzdHIyICsgc2l6ZTIgLSAxKSApOworICAgIENQUFVOSVRfQVNTRVJUKCBjZmFjZXRfYnluYW1lLmNvbXBhcmUoc3RyMSwgc3RyMSArIHNpemUxLCBzdHIyLCBzdHIyICsgc2l6ZTIpID09CisgICAgICAgICAgICAgICAgICAgIGNmYWNldC5jb21wYXJlKHN0cjEsIHN0cjEgKyBzaXplMSwgc3RyMiwgc3RyMiArIHNpemUyKSApOworCisgICAgLy9TbWFsbGVzdCBzdHJpbmcgc2hvdWxkIGJlIGJlZm9yZSBsYXJnZXN0IG9uZToKKyAgICBDUFBVTklUX0FTU0VSVCggY2ZhY2V0X2J5bmFtZS5jb21wYXJlKHN0cjEsIHN0cjEgKyBzaXplMSAtIDIsIHN0cjIsIHN0cjIgKyBzaXplMiAtIDEpID09CisgICAgICAgICAgICAgICAgICAgIGNmYWNldC5jb21wYXJlKHN0cjEsIHN0cjEgKyBzaXplMSAtIDIsIHN0cjIsIHN0cjIgKyBzaXplMiAtIDEpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGNmYWNldF9ieW5hbWUuY29tcGFyZShzdHIxLCBzdHIxICsgc2l6ZTEgLSAxLCBzdHIyLCBzdHIyICsgc2l6ZTIgLSAyKSA9PQorICAgICAgICAgICAgICAgICAgICBjZmFjZXQuY29tcGFyZShzdHIxLCBzdHIxICsgc2l6ZTEgLSAxLCBzdHIyLCBzdHIyICsgc2l6ZTIgLSAyKSApOworCisgICAgLy8gV2UgY2Fubm90IHBsYXkgd2l0aCAn5ycgY2hhciBoZXJlIGJlY2F1c2UgZG9pbmcgc28gd291bGQgbWFrZSB0ZXN0IHJlc3VsdAorICAgIC8vIGRlcGVuZGFudCBvbiBjaGFyIGJlaW5nIGNvbnNpZGVyIGFzIHNpZ25lZCBvciBub3QuLi4KKyAgICBzdHJpbmcgc3Ryc1tdID0geyJhYmRkIiwgLyogImFi52QiLCovICJhYmJkIiwgImFiY2QifTsKKworICAgIHZlY3RvcjxzdHJpbmc+IHYxKHN0cnMsIHN0cnMgKyBzaXplb2Yoc3RycykgLyBzaXplb2Yoc3Ryc1swXSkpOworICAgIHNvcnQodjEuYmVnaW4oKSwgdjEuZW5kKCksIGxvYyk7CisgICAgdmVjdG9yPHN0cmluZz4gdjIoc3Rycywgc3RycyArIHNpemVvZihzdHJzKSAvIHNpemVvZihzdHJzWzBdKSk7CisgICAgc29ydCh2Mi5iZWdpbigpLCB2Mi5lbmQoKSwgbG9jYWxlOjpjbGFzc2ljKCkpOworICAgIENQUFVOSVRfQVNTRVJUKCB2MSA9PSB2MiApOworCisgICAgQ1BQVU5JVF9BU1NFUlQoIChjZmFjZXRfYnluYW1lLnRyYW5zZm9ybSh2MVswXS5kYXRhKCksIHYxWzBdLmRhdGEoKSArIHYxWzBdLnNpemUoKSkuY29tcGFyZShjZmFjZXRfYnluYW1lLnRyYW5zZm9ybSh2MVsxXS5kYXRhKCksIHYxWzFdLmRhdGEoKSArIHYxWzFdLnNpemUoKSkpID09CisgICAgICAgICAgICAgICAgICAgIHYxWzBdLmNvbXBhcmUodjFbMV0pKSApOworICB9CisgIGNhdGNoIChydW50aW1lX2Vycm9yIGNvbnN0JiAvKiBlICovKSB7CisgICAgLyogQ1BQVU5JVF9NRVNTQUdFKCBlLndoYXQoKSApOyAqLworICAgIENQUFVOSVRfRkFJTDsKKyAgfQorICBjYXRjaCAoLi4uKSB7CisgICAgQ1BQVU5JVF9GQUlMOworICB9CisKKyMgICAgaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8ICFkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQorIyAgICAgIGlmIGRlZmluZWQgKFNUTFBPUlQpIHx8ICFkZWZpbmVkIChfX0dOVUNfXykKKyAgdHJ5IHsKKyAgICBsb2NhbGUgbG9jKGxvY2FsZTo6Y2xhc3NpYygpLCBuZXcgY29sbGF0ZV9ieW5hbWU8d2NoYXJfdD4oc3RhdGljX2Nhc3Q8Y2hhciBjb25zdCo+KDApKSk7CisgICAgQ1BQVU5JVF9GQUlMOworICB9CisgIGNhdGNoIChydW50aW1lX2Vycm9yIGNvbnN0JikgeworICB9CisgIGNhdGNoICguLi4pIHsKKyAgICBDUFBVTklUX0ZBSUw7CisgIH0KKyMgICAgICBlbmRpZgorCisgIHRyeSB7CisgICAgbG9jYWxlIGxvYyhsb2NhbGU6OmNsYXNzaWMoKSwgbmV3IGNvbGxhdGVfYnluYW1lPHdjaGFyX3Q+KCJ5YXNsaV9sYW5ndWFnZSIpKTsKKyAgICBDUFBVTklUX0ZBSUw7CisgIH0KKyAgY2F0Y2ggKHJ1bnRpbWVfZXJyb3IgY29uc3QmKSB7CisgIH0KKyAgY2F0Y2ggKC4uLikgeworICAgIENQUFVOSVRfRkFJTDsKKyAgfQorIyAgICBlbmRpZgorIyAgZW5kaWYKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvY29tcGxldGVfZGlnaXRzLmggYi90ZXN0L3VuaXQvY29tcGxldGVfZGlnaXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEzZDkzMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9jb21wbGV0ZV9kaWdpdHMuaApAQCAtMCwwICsxLDE5IEBACisjaWZuZGVmIFNUTFBfRElHSVRTX0gKKyNkZWZpbmUgU1RMUF9ESUdJVFNfSAorCisjaW5jbHVkZSA8c3RyaW5nPgorCitpbmxpbmUgdm9pZCAKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZCAoX1NUTFBfVVNFX05BTUVTUEFDRVMpCitjb21wbGV0ZV9kaWdpdHMoc3RkOjpzdHJpbmcgJmRpZ2l0cykKKyNlbHNlCitjb21wbGV0ZV9kaWdpdHMoc3RyaW5nICZkaWdpdHMpCisjZW5kaWYKK3sKKyAgd2hpbGUgKGRpZ2l0cy5zaXplKCkgPCAyKQorICB7CisgICAgZGlnaXRzLmluc2VydChkaWdpdHMuYmVnaW4oKSwgJzAnKTsKKyAgfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9jb21wbGV4X2hlYWRlcl90ZXN0LmNwcCBiL3Rlc3QvdW5pdC9jb21wbGV4X2hlYWRlcl90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjdmM2QwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L2NvbXBsZXhfaGVhZGVyX3Rlc3QuY3BwCkBAIC0wLDAgKzEsOCBAQAorLyogVGhpcyB0ZXN0IHB1cnBvc2UgaXMgc2ltcGx5IHRvIGNoZWNrIFN0YW5kYXJkIGhlYWRlciBpbmRlcGVuZGFuY3kgdGhhdAorICogaXMgdG8gc2F5IHRoYXQgdGhlIGhlYWRlciBjYW4gYmUgaW5jbHVkZWQgYWxvbmUgd2l0aG91dCBhbnkgcHJldmlvdXMKKyAqIGluY2x1ZGUuCisgKiBBZGRpdGlvbm5hbHksIGZvciBDIFN0YW5kYXJkIGhlYWRlcnMgdGhhdCBTVExwb3J0IGV4cG9zZSwgaXQgY2FuIGFsc28gYmUKKyAqIHVzZWQgdG8gY2hlY2sgdGhhdCBmaWxlcyBpbmNsdWRlZCBieSB0aG9zZSBoZWFkZXJzIGFyZSBjb21wYXRpYmxlIHdpdGgKKyAqIHB1cmUgQyBjb21waWxlcnMuCisgKi8KKyNpbmNsdWRlIDxjb21wbGV4PgpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L2NvbmZpZ190ZXN0LmNwcCBiL3Rlc3QvdW5pdC9jb25maWdfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI4NDZiYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9jb25maWdfdGVzdC5jcHAKQEAgLTAsMCArMSwxMjEgQEAKKyNpbmNsdWRlIDxuZXc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiY3BwdW5pdC9jcHB1bml0X3Byb3h5LmgiCisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfTkFNRVNQQUNFUykKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisjZW5kaWYKKworLy8KKy8vIFRlc3RDYXNlIGNsYXNzCisvLworY2xhc3MgQ29uZmlnVGVzdCA6IHB1YmxpYyBDUFBVTklUX05TOjpUZXN0Q2FzZQoreworICBDUFBVTklUX1RFU1RfU1VJVEUoQ29uZmlnVGVzdCk7CisjaWYgIWRlZmluZWQgKFNUTFBPUlQpCisgIENQUFVOSVRfSUdOT1JFOworI2VuZGlmCisgIENQUFVOSVRfVEVTVChwbGFjZW1lbnRfbmV3X2J1Zyk7CisgIENQUFVOSVRfVEVTVChlbmRpYW5lc3MpOworICBDUFBVTklUX1RFU1QodGVtcGxhdGVfZnVuY3Rpb25fcGFydGlhbF9vcmRlcmluZyk7CisjaWYgIWRlZmluZWQgKF9TVExQX1VTRV9FWENFUFRJT05TKQorICBDUFBVTklUX0lHTk9SRTsKKyNlbmRpZgorICBDUFBVTklUX1RFU1QobmV3X3Rocm93X2JhZF9hbGxvYyk7CisgIENQUFVOSVRfVEVTVF9TVUlURV9FTkQoKTsKKworICBwcm90ZWN0ZWQ6CisgICAgdm9pZCBwbGFjZW1lbnRfbmV3X2J1ZygpOworICAgIHZvaWQgZW5kaWFuZXNzKCk7CisgICAgdm9pZCB0ZW1wbGF0ZV9mdW5jdGlvbl9wYXJ0aWFsX29yZGVyaW5nKCk7CisgICAgdm9pZCBuZXdfdGhyb3dfYmFkX2FsbG9jKCk7Cit9OworCitDUFBVTklUX1RFU1RfU1VJVEVfUkVHSVNUUkFUSU9OKENvbmZpZ1Rlc3QpOworCit2b2lkIENvbmZpZ1Rlc3Q6OnBsYWNlbWVudF9uZXdfYnVnKCkKK3sKKyNpZiBkZWZpbmVkIChTVExQT1JUKQorICBpbnQgaW50X3ZhbCA9IDE7CisgIGludCAqcGludDsKKyAgcGludCA9IG5ldygmaW50X3ZhbCkgaW50KCk7CisgIENQUFVOSVRfQVNTRVJUKCBwaW50ID09ICZpbnRfdmFsICk7CisjICBpZiBkZWZpbmVkIChfU1RMUF9ERUZfQ09OU1RfUExDVF9ORVdfQlVHKQorICBDUFBVTklUX0FTU0VSVCggaW50X3ZhbCAhPSAwICk7CisjICBlbHNlCisgIENQUFVOSVRfQVNTRVJUKCBpbnRfdmFsID09IDAgKTsKKyMgIGVuZGlmCisjZW5kaWYKK30KKwordm9pZCBDb25maWdUZXN0OjplbmRpYW5lc3MoKQoreworI2lmIGRlZmluZWQgKFNUTFBPUlQpCisgIGludCB2YWwgPSAweDAxMDIwMzA0OworICBjaGFyICpwdHIgPSAoY2hhciopKCZ2YWwpOworIyAgaWYgZGVmaW5lZCAoX1NUTFBfQklHX0VORElBTikKKyAgLy9UaGlzIHRlc3Qgb25seSB3b3JrIGlmIHNpemVvZihpbnQpID09IDQsIHRoaXMgaXMgYSBrbm93biBsaW1pdGF0aW9uCisgIC8vdGhhdCB3aWxsIGJlIGhhbmRsZSB0aGUgZGF5IHdlIGZpbmQgYSBjb21waWxlciBmb3Igd2hpY2ggaXQgaXMgZmFsc2UuCisgIENQUFVOSVRfQVNTRVJUKCAqcHRyID09IDB4MDEgfHwKKyAgICAgICAgICAgICAgICAgIHNpemVvZihpbnQpID4gNCAmJiAqcHRyID09IDB4MDAgKTsKKyMgIGVsaWYgZGVmaW5lZCAoX1NUTFBfTElUVExFX0VORElBTikKKyAgQ1BQVU5JVF9BU1NFUlQoICpwdHIgPT0gMHgwNCApOworIyAgZW5kaWYKKyNlbmRpZgorfQorCit2b2lkIENvbmZpZ1Rlc3Q6OnRlbXBsYXRlX2Z1bmN0aW9uX3BhcnRpYWxfb3JkZXJpbmcoKQoreworI2lmIGRlZmluZWQgKFNUTFBPUlQpCisgIHZlY3RvcjxpbnQ+IHZlY3QxKDEwLCAwKTsKKyAgaW50KiBwdmVjdDFGcm9udCA9ICZ2ZWN0MS5mcm9udCgpOworICB2ZWN0b3I8aW50PiB2ZWN0MigxMCwgMCk7CisgIGludCogcHZlY3QyRnJvbnQgPSAmdmVjdDIuZnJvbnQoKTsKKworICBzd2FwKHZlY3QxLCB2ZWN0Mik7CisKKyMgIGlmIGRlZmluZWQgKF9TVExQX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUikgfHwgZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKQorICBDUFBVTklUX0FTU0VSVCggcHZlY3QxRnJvbnQgPT0gJnZlY3QyLmZyb250KCkgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHB2ZWN0MkZyb250ID09ICZ2ZWN0MS5mcm9udCgpICk7CisjICBlbHNlCisgIENQUFVOSVRfQVNTRVJUKCBwdmVjdDFGcm9udCAhPSAmdmVjdDIuZnJvbnQoKSApOworICBDUFBVTklUX0FTU0VSVCggcHZlY3QyRnJvbnQgIT0gJnZlY3QxLmZyb250KCkgKTsKKyMgIGVuZGlmCisjZW5kaWYKK30KKwordm9pZCBDb25maWdUZXN0OjpuZXdfdGhyb3dfYmFkX2FsbG9jKCkKK3sKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiBkZWZpbmVkIChfU1RMUF9VU0VfRVhDRVBUSU9OUykKKyAgdHJ5CisgIHsKKyAgLyogV2UgdHJ5IHRvIGV4aGF1c3QgaGVhcCBtZW1vcnkuIEhvd2V2ZXIsIHdlIGRvbid0IGFjdHVhbGx5IHVzZSB0aGUKKyAgICBsYXJnZXN0IHBvc3NpYmxlIHNpemVfdCB2YWx1ZSBidXMgc2xpZ2h0bHkgbGVzcyBpbiBvcmRlciB0byBhdm9pZAorICAgIHRyaWdnZXJpbmcgYW55IG92ZXJmbG93cyBkdWUgdG8gdGhlIGFsbG9jYXRvciBhZGRpbmcgc29tZSBtb3JlIGZvcgorICAgIGl0cyBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMuICovCisgICAgc2l6ZV90IGNvbnN0IGh1Z2VfYW1vdW50ID0gc2l6ZV90KC0xKSAtIDEwMjQ7CisgICAgdm9pZCogcHZvaWQgPSBvcGVyYXRvciBuZXcgKGh1Z2VfYW1vdW50KTsKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTkVXX0RPTlRfVEhST1dfQkFEX0FMTE9DKQorICAgIC8vIEFsbG9jYXRpb24gc2hvdWxkIGhhdmUgZmFpbAorICAgIENQUFVOSVRfQVNTRVJUKCBwdm9pZCAhPSAwICk7CisjZW5kaWYKKyAgICAvLyBKdXN0IGluIGNhc2UgaXQgc3VjY2VlZHM6CisgICAgb3BlcmF0b3IgZGVsZXRlKHB2b2lkKTsKKyAgfQorICBjYXRjaCAoY29uc3QgYmFkX2FsbG9jJikKKyAgeworI2lmIGRlZmluZWQgKF9TVExQX05FV19ET05UX1RIUk9XX0JBRF9BTExPQykKKyAgICAvLyBMb29rcyBsaWtlIHlvdXIgY29tcGlsZXIgbmV3IG9wZXJhdG9yIGZpbmFsbHkgdGhyb3cgYmFkX2FsbG9jLCB5b3UgY2FuIGZpeAorICAgIC8vIGNvbmZpZ3VyYXRpb24uCisgICAgQ1BQVU5JVF9GQUlMOworI2VuZGlmCisgIH0KKyAgY2F0Y2ggKC4uLikKKyAgeworICAgIC8vV2Ugc2hvdWxkbid0IGJlIHRoZXJlOgorICAgIC8vTm90IGJhZF9hbGxvYyBleGNlcHRpb24gdGhyb3duLgorICAgIENQUFVOSVRfRkFJTDsKKyAgfQorI2VuZGlmCit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvY29weV90ZXN0LmNwcCBiL3Rlc3QvdW5pdC9jb3B5X3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MmU2ODcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvY29weV90ZXN0LmNwcApAQCAtMCwwICsxLDEyOSBAQAorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKworI2luY2x1ZGUgImNwcHVuaXQvY3BwdW5pdF9wcm94eS5oIgorCisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IGRlZmluZWQoX1NUTFBfVVNFX05BTUVTUEFDRVMpCit1c2luZyBuYW1lc3BhY2Ugc3RkOworI2VuZGlmCisKKy8vCisvLyBUZXN0Q2FzZSBjbGFzcworLy8KK2NsYXNzIENvcHlUZXN0IDogcHVibGljIENQUFVOSVRfTlM6OlRlc3RDYXNlCit7CisgIENQUFVOSVRfVEVTVF9TVUlURShDb3B5VGVzdCk7CisgIENQUFVOSVRfVEVTVChjb3B5X2FycmF5KTsKKyAgQ1BQVU5JVF9URVNUKGNvcHlfdm9sYXRpbGUpOworICBDUFBVTklUX1RFU1QoY29weV92ZWN0b3IpOworICBDUFBVTklUX1RFU1QoY29weV9pbnNlcnQpOworICBDUFBVTklUX1RFU1QoY29weV9iYWNrKTsKKyAgQ1BQVU5JVF9URVNUKGNvcHlfYmFja19hcnJheSk7CisgIENQUFVOSVRfVEVTVF9TVUlURV9FTkQoKTsKKworcHJvdGVjdGVkOgorICB2b2lkIGNvcHlfYXJyYXkoKTsKKyAgdm9pZCBjb3B5X3ZvbGF0aWxlKCk7CisgIHZvaWQgY29weV92ZWN0b3IoKTsKKyAgdm9pZCBjb3B5X2luc2VydCgpOworICB2b2lkIGNvcHlfYmFjaygpOworICB2b2lkIGNvcHlfYmFja19hcnJheSgpOworfTsKKworQ1BQVU5JVF9URVNUX1NVSVRFX1JFR0lTVFJBVElPTihDb3B5VGVzdCk7CisKKy8vCisvLyB0ZXN0cyBpbXBsZW1lbnRhdGlvbgorLy8KK3ZvaWQgQ29weVRlc3Q6OmNvcHlfYXJyYXkoKQoreworICBjaGFyIHN0cmluZ1syM10gPSAiQSBzdHJpbmcgdG8gYmUgY29waWVkLiI7CisgIGNoYXIgcmVzdWx0WzIzXTsKKyAgY29weShzdHJpbmcsIHN0cmluZyArIDIzLCByZXN1bHQpOworICBDUFBVTklUX0FTU0VSVCghc3RybmNtcChzdHJpbmcsIHJlc3VsdCwgMjMpKTsKK30KKwordm9pZCBDb3B5VGVzdDo6Y29weV92b2xhdGlsZSgpCit7CisgIHsKKyAgICBpbnQgYVtdID0gezAsIDEsIDIsIDMsIDQsIDV9OworICAgIGNvbnN0IHNpemVfdCBzaXplID0gc2l6ZW9mKGEpIC8gc2l6ZW9mKGFbMF0pOworICAgIHZvbGF0aWxlIGludCB2YVtzaXplXTsgCisgICAgY29weShhLCBhICsgc2l6ZSwgdmEpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpICE9IHNpemU7ICsraSkgeworICAgICAgQ1BQVU5JVF9BU1NFUlQoIGFbaV0gPT0gdmFbaV0gKTsKKyAgICB9CisgIH0KKworICB7CisgICAgY29uc3QgaW50IGFbXSA9IHswLCAxLCAyLCAzLCA0LCA1fTsKKyAgICBjb25zdCBzaXplX3Qgc2l6ZSA9IHNpemVvZihhKSAvIHNpemVvZihhWzBdKTsKKyAgICB2b2xhdGlsZSBpbnQgdmFbc2l6ZV07IAorICAgIGNvcHkoYSwgYSArIHNpemUsIHZhKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSAhPSBzaXplOyArK2kpIHsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBhW2ldID09IHZhW2ldICk7CisgICAgfQorICB9CisKKyAgLy8gRm9sbG93aW5nIGNvZGUgY2FuIGJlIGFjdGl2YXRlZCB0byBjaGVjayB0aGF0IGl0IGRvZXNuJ3QgY29tcGlsZWQKKyNpZiAwCisgIHsKKyAgICBpbnQgYVtdID0gezAsIDEsIDIsIDMsIDQsIDV9OworICAgIGNvbnN0IHNpemVfdCBzaXplID0gc2l6ZW9mKGEpIC8gc2l6ZW9mKGFbMF0pOworICAgIGNvbnN0IHZvbGF0aWxlIGludCB2YVtzaXplXSA9IHs1LCA0LCAzLCAyLCAxLCAwfTsgCisgICAgY29weShhLCBhICsgc2l6ZSwgdmEpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpICE9IHNpemU7ICsraSkgeworICAgICAgQ1BQVU5JVF9BU1NFUlQoIGFbaV0gPT0gdmFbaV0gKTsKKyAgICB9CisgIH0KKyNlbmRpZgorfQorCit2b2lkIENvcHlUZXN0Ojpjb3B5X3ZlY3RvcigpCit7CisgIHZlY3RvcjxpbnQ+IHYxKDEwKTsKKyAgZm9yIChpbnQgaSA9IDA7IChzaXplX3QpaSA8IHYxLnNpemUoKTsgKytpKQorICAgIHYxW2ldID0gaTsKKworICB2ZWN0b3I8aW50PiB2Mih2MS5zaXplKCkpOworICBjb3B5KHYxLmJlZ2luKCksIHYxLmVuZCgpLCB2Mi5iZWdpbigpKTsKKworICBDUFBVTklUX0FTU0VSVCggdjIgPT0gdjEgKTsKK30KKwordm9pZCBDb3B5VGVzdDo6Y29weV9pbnNlcnQoKSB7CisgIHZlY3RvcjxpbnQ+IHYxKDEwKTsKKyAgZm9yIChpbnQgbG9jID0gMDsgKHNpemVfdClsb2MgPCB2MS5zaXplKCk7ICsrbG9jKQorICAgIHYxW2xvY10gPSBsb2M7CisgIHZlY3RvcjxpbnQ+IHYyOworICBpbnNlcnRfaXRlcmF0b3I8dmVjdG9yPGludD4gPiBpKHYyLCB2Mi5iZWdpbigpKTsKKyAgY29weSh2MS5iZWdpbigpLCB2MS5lbmQoKSwgaSk7CisKKyAgQ1BQVU5JVF9BU1NFUlQoIHYyID09IHYxICk7Cit9CisKK3ZvaWQgQ29weVRlc3Q6OmNvcHlfYmFjaygpCit7CisgIHZlY3RvcjxpbnQ+IHYxKDEwKTsKKyAgZm9yIChpbnQgaSA9IDA7IChzaXplX3QpaSA8IHYxLnNpemUoKTsgKytpKQorICAgIHYxW2ldID0gaTsKKyAgdmVjdG9yPGludD4gdjIodjEuc2l6ZSgpKTsKKyAgY29weV9iYWNrd2FyZCh2MS5iZWdpbigpLCB2MS5lbmQoKSwgdjIuZW5kKCkpOworCisgIENQUFVOSVRfQVNTRVJUKCB2MiA9PSB2MSApOworfQorCit2b2lkIENvcHlUZXN0Ojpjb3B5X2JhY2tfYXJyYXkoKQoreworICBpbnQgbnVtYmVyc1s1XSA9IHsgMSwgMiwgMywgNCwgNSB9OworCisgIGludCByZXN1bHRbNV07CisgIGNvcHlfYmFja3dhcmQobnVtYmVycywgbnVtYmVycyArIDUsIChpbnQqKXJlc3VsdCArIDUpOworICBDUFBVTklUX0FTU0VSVChyZXN1bHRbMF09PW51bWJlcnNbMF0pOworICBDUFBVTklUX0FTU0VSVChyZXN1bHRbMV09PW51bWJlcnNbMV0pOworICBDUFBVTklUX0FTU0VSVChyZXN1bHRbMl09PW51bWJlcnNbMl0pOworICBDUFBVTklUX0FTU0VSVChyZXN1bHRbM109PW51bWJlcnNbM10pOworICBDUFBVTklUX0FTU0VSVChyZXN1bHRbNF09PW51bWJlcnNbNF0pOworfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L2NvdW50X3Rlc3QuY3BwIGIvdGVzdC91bml0L2NvdW50X3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZjk2ZTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvY291bnRfdGVzdC5jcHAKQEAgLTAsMCArMSw3MyBAQAorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSAiY3BwdW5pdC9jcHB1bml0X3Byb3h5LmgiCisKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZChfU1RMUF9VU0VfTkFNRVNQQUNFUykKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisjZW5kaWYKKworLy8KKy8vIFRlc3RDYXNlIGNsYXNzCisvLworY2xhc3MgQ291bnRUZXN0IDogcHVibGljIENQUFVOSVRfTlM6OlRlc3RDYXNlCit7CisgIENQUFVOSVRfVEVTVF9TVUlURShDb3VudFRlc3QpOworICBDUFBVTklUX1RFU1QoY291bnQwKTsKKyAgQ1BQVU5JVF9URVNUKGNvdW50MSk7CisgIENQUFVOSVRfVEVTVChjb3VudGlmMSk7CisgIENQUFVOSVRfVEVTVF9TVUlURV9FTkQoKTsKKworcHJvdGVjdGVkOgorICB2b2lkIGNvdW50MCgpOworICB2b2lkIGNvdW50MSgpOworICB2b2lkIGNvdW50aWYxKCk7CisgIHN0YXRpYyBpbnQgb2RkKGludCBhXyk7Cit9OworCitDUFBVTklUX1RFU1RfU1VJVEVfUkVHSVNUUkFUSU9OKENvdW50VGVzdCk7CisKKy8vCisvLyB0ZXN0cyBpbXBsZW1lbnRhdGlvbgorLy8KK3ZvaWQgQ291bnRUZXN0Ojpjb3VudDAoKQoreworICBpbnQgbnVtYmVyc1sxMF0gPSB7IDEsIDIsIDQsIDEsIDIsIDQsIDEsIDIsIDQsIDEgfTsKKworICBpbnQgcmVzdWx0ID0gY291bnQobnVtYmVycywgbnVtYmVycyArIDEwLCAxKTsKKyAgQ1BQVU5JVF9BU1NFUlQocmVzdWx0PT00KTsKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fQU5BQ0hST05JU01TKQorICByZXN1bHQgPSAwOworICBjb3VudChudW1iZXJzLCBudW1iZXJzICsgMTAsIDEsIHJlc3VsdCk7CisgIENQUFVOSVRfQVNTRVJUKHJlc3VsdD09NCk7CisjZW5kaWYKK30KK3ZvaWQgQ291bnRUZXN0Ojpjb3VudDEoKQoreworICB2ZWN0b3IgPGludD4gbnVtYmVycygxMDApOworICBmb3IoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspCisgIG51bWJlcnNbaV0gPSBpICUgMzsKKyAgaW50IGVsZW1lbnRzID0gY291bnQobnVtYmVycy5iZWdpbigpLCBudW1iZXJzLmVuZCgpLCAyKTsKKyAgQ1BQVU5JVF9BU1NFUlQoZWxlbWVudHM9PTMzKTsKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fQU5BQ0hST05JU01TKQorICBlbGVtZW50cyA9IDA7CisgIGNvdW50KG51bWJlcnMuYmVnaW4oKSwgbnVtYmVycy5lbmQoKSwgMiwgZWxlbWVudHMpOworICBDUFBVTklUX0FTU0VSVChlbGVtZW50cz09MzMpOworI2VuZGlmCit9Cit2b2lkIENvdW50VGVzdDo6Y291bnRpZjEoKQoreworICB2ZWN0b3IgPGludD4gbnVtYmVycygxMDApOworICBmb3IoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspCisgICAgbnVtYmVyc1tpXSA9IGkgJSAzOworICBpbnQgZWxlbWVudHMgPSBjb3VudF9pZihudW1iZXJzLmJlZ2luKCksIG51bWJlcnMuZW5kKCksIG9kZCk7CisgIENQUFVOSVRfQVNTRVJUKGVsZW1lbnRzPT0zMyk7CisjaWYgZGVmaW5lZCAoU1RMUE9SVCkgJiYgIWRlZmluZWQgKF9TVExQX05PX0FOQUNIUk9OSVNNUykKKyAgZWxlbWVudHMgPSAwOworICBjb3VudF9pZihudW1iZXJzLmJlZ2luKCksIG51bWJlcnMuZW5kKCksIG9kZCwgZWxlbWVudHMpOworICBDUFBVTklUX0FTU0VSVChlbGVtZW50cz09MzMpOworI2VuZGlmCit9CitpbnQgQ291bnRUZXN0OjpvZGQoaW50IGFfKQoreworICByZXR1cm4gYV8gJSAyOworfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L2NwcHVuaXQvY3BwdW5pdF9taW5pLmggYi90ZXN0L3VuaXQvY3BwdW5pdC9jcHB1bml0X21pbmkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGI0YTdhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L2NwcHVuaXQvY3BwdW5pdF9taW5pLmgKQEAgLTAsMCArMSwyMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQKKyAqIFpkZW5layBOZW1lYworICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisvKiAkSWQkICovCisKKyNpZm5kZWYgX0NQUFVOSVRNUEZSX0hfCisjZGVmaW5lIF9DUFBVTklUTVBGUl9IXworCisjaWYgMAorIyAgZGVmaW5lIENQUFVOSVRfTlMgQ3BwVW5pdE1pbmkKKyNlbHNlCisjICBkZWZpbmUgQ1BQVU5JVF9OUworI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmIDAKK25hbWVzcGFjZSBDUFBVTklUX05TCit7CisjZW5kaWYKKyAgY2xhc3MgUmVwb3J0ZXIgeworICBwdWJsaWM6CisgICAgdmlydHVhbCB+UmVwb3J0ZXIoKSB7fQorICAgIHZpcnR1YWwgdm9pZCBlcnJvcihjb25zdCBjaGFyICogLyptYWNyb05hbWUqLywgY29uc3QgY2hhciAqIC8qaW5fbWFjcm8qLywgY29uc3QgY2hhciAqIC8qaW5fZmlsZSovLCBpbnQgLyppbl9saW5lKi8pIHt9CisgICAgdmlydHVhbCB2b2lkIG1lc3NhZ2UoIGNvbnN0IGNoYXIgKiAvKm1zZyovICkge30KKyAgICB2aXJ0dWFsIHZvaWQgcHJvZ3Jlc3MoIGNvbnN0IGNoYXIgKiAvKmluX2NsYXNzTmFtZSovLCBjb25zdCBjaGFyICogLyppbl90ZXN0TmFtZSovLCBib29sIC8qaWdub3JlZCovLCBib29sIC8qIGV4cGxpY2l0ICovKSB7fQorICAgIHZpcnR1YWwgdm9pZCBlbmQoKSB7fQorICAgIHZpcnR1YWwgdm9pZCBwcmludFN1bW1hcnkoKSB7fQorICB9OworCisgIGNsYXNzIFRlc3RGaXh0dXJlIHsKKyAgcHVibGljOgorICAgIHZpcnR1YWwgflRlc3RGaXh0dXJlKCkge30KKworICAgIC8vISBcYnJpZWYgU2V0IHVwIGNvbnRleHQgYmVmb3JlIHJ1bm5pbmcgYSB0ZXN0LgorICAgIHZpcnR1YWwgdm9pZCBzZXRVcCgpIHt9CisKKyAgICAvLyEgQ2xlYW4gdXAgYWZ0ZXIgdGhlIHRlc3QgcnVuLgorICAgIHZpcnR1YWwgdm9pZCB0ZWFyRG93bigpIHt9CisgIH07CisKKyAgY2xhc3MgVGVzdENhc2UgOiBwdWJsaWMgVGVzdEZpeHR1cmUgeworICBwdWJsaWM6CisgICAgVGVzdENhc2UoKSB7IHJlZ2lzdGVyVGVzdENhc2UodGhpcyk7IH0KKworICAgIHZvaWQgc2V0VXAoKSB7IG1fZmFpbGVkID0gZmFsc2U7IH0KKyAgICBzdGF0aWMgaW50IHJ1bihSZXBvcnRlciAqaW5fcmVwb3J0ZXIgPSAwLCBjb25zdCBjaGFyICppbl90ZXN0TmFtZSA9ICIiLCBib29sIGludmVydCA9IGZhbHNlKTsKKyAgICBpbnQgbnVtRXJyb3JzKCkgeyByZXR1cm4gbV9udW1FcnJvcnM7IH0KKyAgICBzdGF0aWMgdm9pZCByZWdpc3RlclRlc3RDYXNlKFRlc3RDYXNlICppbl90ZXN0Q2FzZSk7CisKKyAgICB2aXJ0dWFsIHZvaWQgbXlSdW4oY29uc3QgY2hhciAqIC8qaW5fbmFtZSovLCBib29sIC8qaW52ZXJ0Ki8gPSBmYWxzZSkge30KKworICAgIHZpcnR1YWwgdm9pZCBlcnJvcihjb25zdCBjaGFyICppbl9tYWNyb05hbWUsIGNvbnN0IGNoYXIgKmluX21hY3JvLCBjb25zdCBjaGFyICppbl9maWxlLCBpbnQgaW5fbGluZSkgeworICAgICAgbV9mYWlsZWQgPSB0cnVlOworICAgICAgaWYgKG1fcmVwb3J0ZXIpIHsKKyAgICAgICAgbV9yZXBvcnRlci0+ZXJyb3IoaW5fbWFjcm9OYW1lLCBpbl9tYWNybywgaW5fZmlsZSwgaW5fbGluZSk7CisgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgbWVzc2FnZShjb25zdCBjaGFyICptc2cpIHsKKyAgICAgIGlmIChtX3JlcG9ydGVyKSB7CisgICAgICAgIG1fcmVwb3J0ZXItPm1lc3NhZ2UobXNnKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBib29sIGVxdWFsRG91Ymxlcyhkb3VibGUgaW5fZXhwZWN0ZWQsIGRvdWJsZSBpbl9yZWFsLCBkb3VibGUgaW5fbWF4RXJyKSB7CisgICAgICBkb3VibGUgZGlmZiA9IGluX2V4cGVjdGVkIC0gaW5fcmVhbDsKKyAgICAgIGlmIChkaWZmIDwgMC4pIHsKKyAgICAgICAgZGlmZiA9IC1kaWZmOworICAgICAgfQorICAgICAgcmV0dXJuIGRpZmYgPCBpbl9tYXhFcnI7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHByb2dyZXNzKGNvbnN0IGNoYXIgKmluX2NsYXNzTmFtZSwgY29uc3QgY2hhciAqaW5fZnVuY3Rpb25OYW1lLCBib29sIGlnbm9yZWQsIGJvb2wgZXhwbGljaXRUZXN0KSB7CisgICAgICArK21fbnVtVGVzdHM7CisgICAgICBpZiAobV9yZXBvcnRlcikgeworICAgICAgICBtX3JlcG9ydGVyLT5wcm9ncmVzcyhpbl9jbGFzc05hbWUsIGluX2Z1bmN0aW9uTmFtZSwgaWdub3JlZCwgZXhwbGljaXRUZXN0KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBib29sIHNob3VsZFJ1blRoaXMoY29uc3QgY2hhciAqaW5fZGVzaXJlZFRlc3QsIGNvbnN0IGNoYXIgKmluX2NsYXNzTmFtZSwgY29uc3QgY2hhciAqaW5fZnVuY3Rpb25OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGludmVydCwgYm9vbCBleHBsaWNpdF90ZXN0LCBib29sICZkb19wcm9ncmVzcykgeworICAgICAgaWYgKChpbl9kZXNpcmVkVGVzdCkgJiYgKGluX2Rlc2lyZWRUZXN0WzBdICE9ICdcMCcpKSB7CisgICAgICAgIGRvX3Byb2dyZXNzID0gZmFsc2U7CisgICAgICAgIGNvbnN0IGNoYXIgKnB0ciA9IHN0cnN0cihpbl9kZXNpcmVkVGVzdCwgIjo6Iik7CisgICAgICAgIGlmIChwdHIpIHsKKyAgICAgICAgICBib29sIG1hdGNoID0gKHN0cm5jbXAoaW5fZGVzaXJlZFRlc3QsIGluX2NsYXNzTmFtZSwgc3RybGVuKGluX2NsYXNzTmFtZSkpID09IDApICYmCisgICAgICAgICAgICAgICAgICAgICAgIChzdHJuY21wKHB0ciArIDIsIGluX2Z1bmN0aW9uTmFtZSwgc3RybGVuKGluX2Z1bmN0aW9uTmFtZSkpID09IDApOworICAgICAgICAgIC8vIEludmVydCBzaGFsbCBub3QgbWFrZSBleHBsaWNpdCB0ZXN0IHJ1bjoKKyAgICAgICAgICByZXR1cm4gaW52ZXJ0ID8gKG1hdGNoID8gIW1hdGNoIDogIWV4cGxpY2l0X3Rlc3QpCisgICAgICAgICAgICAgICAgICAgICAgICA6IG1hdGNoOworICAgICAgICB9CisgICAgICAgIGJvb2wgbWF0Y2ggPSAoc3RyY21wKGluX2Rlc2lyZWRUZXN0LCBpbl9jbGFzc05hbWUpID09IDApOworICAgICAgICBkb19wcm9ncmVzcyA9IG1hdGNoOworICAgICAgICByZXR1cm4gIWV4cGxpY2l0X3Rlc3QgJiYgKG1hdGNoID09ICFpbnZlcnQpOworICAgICAgfQorICAgICAgZG9fcHJvZ3Jlc3MgPSB0cnVlOworICAgICAgcmV0dXJuICFleHBsaWNpdF90ZXN0OworICAgIH0KKworICAgIHZvaWQgdGVhckRvd24oKSB7CisgICAgICBpZiAobV9mYWlsZWQpCisgICAgICAgICsrbV9udW1FcnJvcnM7CisgICAgICBtX3JlcG9ydGVyLT5lbmQoKTsKKyAgICB9CisKKyAgcHJvdGVjdGVkOgorICAgIHN0YXRpYyBpbnQgbV9udW1FcnJvcnM7CisgICAgc3RhdGljIGludCBtX251bVRlc3RzOworCisgIHByaXZhdGU6CisgICAgc3RhdGljIFRlc3RDYXNlICptX3Jvb3Q7CisgICAgVGVzdENhc2UgKm1fbmV4dDsKKyAgICBib29sIG1fZmFpbGVkOworCisgICAgc3RhdGljIFJlcG9ydGVyICptX3JlcG9ydGVyOworICB9OworI2lmIDAKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKENQUFVOSVRfTUlOSV9ISURFX1VOVVNFRF9WQVJJQUJMRSkKKyMgIGlmIGRlZmluZWQgKF9NU0NfVkVSKQorIyAgICBkZWZpbmUgQ1BQVU5JVF9NSU5JX0hJREVfVU5VU0VEX1ZBUklBQkxFKHYpICh2KTsKKyMgIGVsc2UKKyMgICAgZGVmaW5lIENQUFVOSVRfTUlOSV9ISURFX1VOVVNFRF9WQVJJQUJMRSh2KQorIyAgZW5kaWYKKyNlbmRpZgorCisjZGVmaW5lIENQUFVOSVRfVEVTVF9TVUlURShYKSBcCisgIHR5cGVkZWYgQ1BQVU5JVF9OUzo6VGVzdENhc2UgQmFzZTsgXAorICB2aXJ0dWFsIHZvaWQgbXlSdW4oY29uc3QgY2hhciAqaW5fbmFtZSwgYm9vbCBpbnZlcnQgPSBmYWxzZSkgeyBcCisgICAgY29uc3QgY2hhciAqY2xhc3NOYW1lID0gI1g7IENQUFVOSVRfTUlOSV9ISURFX1VOVVNFRF9WQVJJQUJMRShjbGFzc05hbWUpIFwKKyAgICBib29sIGlnbm9yaW5nID0gZmFsc2U7IENQUFVOSVRfTUlOSV9ISURFX1VOVVNFRF9WQVJJQUJMRShpZ25vcmluZykKKworI2lmIGRlZmluZWQgQ1BQVU5JVF9NSU5JX1VTRV9FWENFUFRJT05TCisjICBkZWZpbmUgQ1BQVU5JVF9URVNUX0JBU0UoWCwgWSkgXAorICB7IFwKKyAgICBib29sIGRvX3Byb2dyZXNzOyBcCisgICAgYm9vbCBzaG91bGRSdW4gPSBzaG91bGRSdW5UaGlzKGluX25hbWUsIGNsYXNzTmFtZSwgI1gsIGludmVydCwgWSwgZG9fcHJvZ3Jlc3MpOyBcCisgICAgaWYgKHNob3VsZFJ1biB8fCBkb19wcm9ncmVzcykgeyBcCisgICAgICBzZXRVcCgpOyBcCisgICAgICBwcm9ncmVzcyhjbGFzc05hbWUsICNYLCBpZ25vcmluZyB8fCAhc2hvdWxkUnVuLCAhaWdub3JpbmcgJiYgWSk7IFwKKyAgICAgIGlmIChzaG91bGRSdW4gJiYgIWlnbm9yaW5nKSB7IFwKKyAgICAgICAgdHJ5IHsgXAorICAgICAgICAgIFgoKTsgXAorICAgICAgICB9IFwKKyAgICAgICAgY2F0Y2goLi4uKSB7IFwKKyAgICAgICAgICBCYXNlOjplcnJvcigiVGVzdCBGYWlsZWQ6IEFuIEV4Y2VwdGlvbiB3YXMgdGhyb3duLiIsICNYLCBfX0ZJTEVfXywgX19MSU5FX18pOyBcCisgICAgICAgIH0gXAorICAgICAgfSBcCisgICAgICB0ZWFyRG93bigpOyBcCisgICAgfSBcCisgIH0KKyNlbHNlCisjICBkZWZpbmUgQ1BQVU5JVF9URVNUX0JBU0UoWCwgWSkgXAorICB7IFwKKyAgICBib29sIGRvX3Byb2dyZXNzOyBcCisgICAgYm9vbCBzaG91bGRSdW4gPSBzaG91bGRSdW5UaGlzKGluX25hbWUsIGNsYXNzTmFtZSwgI1gsIGludmVydCwgWSwgZG9fcHJvZ3Jlc3MpOyBcCisgICAgaWYgKHNob3VsZFJ1biB8fCBkb19wcm9ncmVzcykgeyBcCisgICAgICBzZXRVcCgpOyBcCisgICAgICBwcm9ncmVzcyhjbGFzc05hbWUsICNYLCBpZ25vcmluZyB8fCAhc2hvdWxkUnVuLCAhaWdub3JpbmcgJiYgWSk7IFwKKyAgICAgIGlmIChzaG91bGRSdW4gJiYgIWlnbm9yaW5nKSBcCisgICAgICAgIFgoKTsgXAorICAgICAgdGVhckRvd24oKTsgXAorICAgIH0gXAorICB9CisjZW5kaWYKKworI2RlZmluZSBDUFBVTklUX1RFU1QoWCkgQ1BQVU5JVF9URVNUX0JBU0UoWCwgZmFsc2UpCisjZGVmaW5lIENQUFVOSVRfRVhQTElDSVRfVEVTVChYKSBDUFBVTklUX1RFU1RfQkFTRShYLCB0cnVlKQorCisjZGVmaW5lIENQUFVOSVRfSUdOT1JFIFwKKyAgaWdub3JpbmcgPSB0cnVlCisKKyNkZWZpbmUgQ1BQVU5JVF9TVE9QX0lHTk9SRSBcCisgIGlnbm9yaW5nID0gZmFsc2UKKworI2RlZmluZSBDUFBVTklUX1RFU1RfU1VJVEVfRU5EKCkgfQorCisjZGVmaW5lIENQUFVOSVRfVEVTVF9TVUlURV9SRUdJU1RSQVRJT04oWCkgc3RhdGljIFggbG9jYWwKKworI2RlZmluZSBDUFBVTklUX0NIRUNLKFgpIFwKKyAgaWYgKCEoWCkpIHsgXAorICAgIEJhc2U6OmVycm9yKCJDUFBVTklUX0NIRUNLIiwgI1gsIF9fRklMRV9fLCBfX0xJTkVfXyk7IFwKKyAgfQorCisjZGVmaW5lIENQUFVOSVRfQVNTRVJUKFgpIFwKKyAgaWYgKCEoWCkpIHsgXAorICAgIEJhc2U6OmVycm9yKCJDUFBVTklUX0FTU0VSVCIsICNYLCBfX0ZJTEVfXywgX19MSU5FX18pOyBcCisgICAgcmV0dXJuOyBcCisgIH0KKworI2RlZmluZSBDUFBVTklUX0ZBSUwgeyBcCisgICAgQmFzZTo6ZXJyb3IoIkNQUFVOSVRfRkFJTCIsICIiLCBfX0ZJTEVfXywgX19MSU5FX18pOyBcCisgICAgcmV0dXJuOyBcCisgIH0KKworI2RlZmluZSBDUFBVTklUX0FTU0VSVF9FUVVBTChYLCBZKSBcCisgIGlmICgoWCkgIT0gKFkpKSB7IFwKKyAgICBCYXNlOjplcnJvcigiQ1BQVU5JVF9BU1NFUlRfRVFVQUwiLCAjWCIsIiNZLCBfX0ZJTEVfXywgX19MSU5FX18pOyBcCisgICAgcmV0dXJuOyBcCisgIH0KKworI2RlZmluZSBDUFBVTklUX0FTU0VSVF9ET1VCTEVTX0VRVUFMKFgsIFksIFopIFwKKyAgaWYgKCFlcXVhbERvdWJsZXMoKFgpLCAoWSksIChaKSkpIHsgXAorICAgIEJhc2U6OmVycm9yKCJDUFBVTklUX0FTU0VSVF9ET1VCTEVTX0VRVUFMIiwgI1giLCIjWSIsIiNaLCBfX0ZJTEVfXywgX19MSU5FX18pOyBcCisgICAgcmV0dXJuOyBcCisgIH0KKworI2RlZmluZSBDUFBVTklUX01FU1NBR0UobSkgQ1BQVU5JVF9OUzo6VGVzdENhc2U6Om1lc3NhZ2UobSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvY3BwdW5pdC9jcHB1bml0X3Byb3h5LmggYi90ZXN0L3VuaXQvY3BwdW5pdC9jcHB1bml0X3Byb3h5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFjZGMyYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9jcHB1bml0L2NwcHVuaXRfcHJveHkuaApAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0CisgKiBaZGVuZWsgTmVtZWMKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworLyogJElkJCAqLworCisjaWZuZGVmIF9DUFBVTklUUFJPWFlJTlRFUkZBQ0VfSF8KKyNkZWZpbmUgX0NQUFVOSVRQUk9YWUlOVEVSRkFDRV9IXworCisvKgorICogU1RMcG9ydCBzcGVjaWZpYworICovCisjaWYgIWRlZmluZWQgKENQUFVOSVRfTUlOSV9VU0VfRVhDRVBUSU9OUykgJiYgXAorICAgICghZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZCAoX1NUTFBfVVNFX0VYQ0VQVElPTlMpKQorIyAgZGVmaW5lIENQUFVOSVRfTUlOSV9VU0VfRVhDRVBUSU9OUworI2VuZGlmCisKKyNpbmNsdWRlICJjcHB1bml0X21pbmkuaCIKKworI2VuZGlmCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvY3BwdW5pdC9jcHB1bml0X3RpbWVyLmggYi90ZXN0L3VuaXQvY3BwdW5pdC9jcHB1bml0X3RpbWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFmOTA3NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9jcHB1bml0L2NwcHVuaXRfdGltZXIuaApAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNgorICogRnJhbmNvaXMgRHVtb250CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgQ1BQVU5JVF9USU1FUl9ICisjZGVmaW5lIENQUFVOSVRfVElNRVJfSAorCisjaWYgZGVmaW5lZCAoX1dJTjMyKQorIyAgZGVmaW5lIENQUFVOSVRfV0lOMzJfVElNRVIKKyMgIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbmRpZgorCitjbGFzcyBUaW1lciB7CitwdWJsaWM6CisgIFRpbWVyKCkgeworI2lmIGRlZmluZWQgKENQUFVOSVRfV0lOMzJfVElNRVIpCisgICAgbV9zdGFydC5Mb3dQYXJ0ID0gbV9yZXN0YXJ0Lkxvd1BhcnQgPSBtX3N0b3AuTG93UGFydCA9IDA7CisgICAgbV9zdGFydC5IaWdoUGFydCA9IG1fcmVzdGFydC5IaWdoUGFydCA9IG1fc3RvcC5IaWdoUGFydCA9IDA7CisgICAgUXVlcnlQZXJmb3JtYW5jZUZyZXF1ZW5jeSgmbV9mcmVxdWVuY3kpOworI2VuZGlmCisgIH0KKworICB2b2lkIHN0YXJ0KCkgeworI2lmIGRlZmluZWQgKENQUFVOSVRfV0lOMzJfVElNRVIpCisgICAgUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoJm1fc3RhcnQpOworI2VuZGlmCisgIH0KKworICB2b2lkIHJlc3RhcnQoKSB7CisjaWYgZGVmaW5lZCAoQ1BQVU5JVF9XSU4zMl9USU1FUikKKyAgICBRdWVyeVBlcmZvcm1hbmNlQ291bnRlcigmbV9yZXN0YXJ0KTsKKyAgICBpZiAobV9zdGFydC5IaWdoUGFydCA9PSAwICYmIG1fc3RhcnQuTG93UGFydCA9PSAwKSB7CisgICAgICBtX3N0YXJ0ID0gbV9yZXN0YXJ0OworICAgIH0KKyNlbmRpZgorICB9CisKKyAgdm9pZCBzdG9wKCkgeworI2lmIGRlZmluZWQgKENQUFVOSVRfV0lOMzJfVElNRVIpCisgICAgTEFSR0VfSU5URUdFUiBzdG9wOworICAgIFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCZzdG9wKTsKKyAgICBpZiAoKG1fc3RvcC5IaWdoUGFydCAhPSAwIHx8IG1fc3RvcC5Mb3dQYXJ0ICE9IDApICYmCisgICAgICAgIG1fcmVzdGFydC5IaWdoUGFydCAhPSAwICYmIG1fcmVzdGFydC5Mb3dQYXJ0ICE9IDApIHsKKyAgICAgIG1fc3RvcC5IaWdoUGFydCArPSAoc3RvcC5IaWdoUGFydCAtIG1fcmVzdGFydC5IaWdoUGFydCk7CisgICAgICBpZiAoc3RvcC5Mb3dQYXJ0IDwgbV9yZXN0YXJ0Lkxvd1BhcnQpIHsKKyAgICAgICAgaWYgKG1fcmVzdGFydC5Mb3dQYXJ0IC0gc3RvcC5Mb3dQYXJ0ID4gbV9zdG9wLkxvd1BhcnQpIHsKKyAgICAgICAgICBtX3N0b3AuSGlnaFBhcnQgLT0gMTsKKyAgICAgICAgfQorICAgICAgICBtX3N0b3AuTG93UGFydCAtPSBtX3Jlc3RhcnQuTG93UGFydCAtIHN0b3AuTG93UGFydDsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBpZiAoc3RvcC5Mb3dQYXJ0IC0gbV9yZXN0YXJ0Lkxvd1BhcnQgPiAweEZGRkZGRkZGIC0gbV9zdG9wLkxvd1BhcnQpIHsKKyAgICAgICAgICBtX3N0b3AuSGlnaFBhcnQgKz0gMTsKKyAgICAgICAgfQorICAgICAgICBtX3N0b3AuTG93UGFydCArPSBzdG9wLkxvd1BhcnQgLSBtX3Jlc3RhcnQuTG93UGFydDsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICBtX3N0b3AgPSBzdG9wOworICAgIH0KKyNlbmRpZgorICB9CisKKyAgZG91YmxlIGVsYXBzZWRNaWxsaXNlY29uZHMoKSBjb25zdCB7CisjaWYgZGVmaW5lZCAoQ1BQVU5JVF9XSU4zMl9USU1FUikKKyAgICBMQVJHRV9JTlRFR0VSIGVsYXBzZWQ7CisgICAgZWxhcHNlZC5IaWdoUGFydCA9IG1fc3RvcC5IaWdoUGFydCAtIG1fc3RhcnQuSGlnaFBhcnQ7CisgICAgZWxhcHNlZC5Mb3dQYXJ0ID0gbV9zdG9wLkxvd1BhcnQgLSBtX3N0YXJ0Lkxvd1BhcnQ7CisgICAgcmV0dXJuIChkb3VibGUpZWxhcHNlZC5RdWFkUGFydCAvIChkb3VibGUpbV9mcmVxdWVuY3kuUXVhZFBhcnQgKiAxMDAwOworI2Vsc2UKKyAgICByZXR1cm4gMDsKKyNlbmRpZgorICB9CisKKyAgc3RhdGljIGJvb2wgc3VwcG9ydGVkKCkgeworI2lmIGRlZmluZWQgKENQUFVOSVRfV0lOMzJfVElNRVIpCisgICAgcmV0dXJuIHRydWU7CisjZWxzZQorICAgIHJldHVybiBmYWxzZTsKKyNlbmRpZgorICB9CisKK3ByaXZhdGU6CisjaWYgZGVmaW5lZCAoQ1BQVU5JVF9XSU4zMl9USU1FUikKKyAgTEFSR0VfSU5URUdFUiBtX2ZyZXF1ZW5jeTsKKyAgTEFSR0VfSU5URUdFUiBtX3N0YXJ0LCBtX3N0b3AsIG1fcmVzdGFydDsKKyNlbmRpZgorfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvY3BwdW5pdC9maWxlX3JlcG9ydGVyLmggYi90ZXN0L3VuaXQvY3BwdW5pdC9maWxlX3JlcG9ydGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM3NjMzYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9jcHB1bml0L2ZpbGVfcmVwb3J0ZXIuaApAQCAtMCwwICsxLDE0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNAorICogWmRlbmVrIE5lbWVjCisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKy8qICRJZCQgKi8KKworI2lmbmRlZiBfQ1BQVU5JVE1JTklGSUxFUkVQT1JURVJJTlRFUkZBQ0VfSF8KKyNkZWZpbmUgX0NQUFVOSVRNSU5JRklMRVJFUE9SVEVSSU5URVJGQUNFX0hfCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiY3BwdW5pdF90aW1lci5oIgorCisvLworLy8gQ3BwVW5pdCBtaW5pIGZpbGUoc3RyZWFtKSByZXBvcnRlcgorLy8KK2NsYXNzIEZpbGVSZXBvcnRlciA6IHB1YmxpYyBDUFBVTklUX05TOjpSZXBvcnRlciB7Citwcml2YXRlOgorICBGaWxlUmVwb3J0ZXIoY29uc3QgRmlsZVJlcG9ydGVyJik7CisgIEZpbGVSZXBvcnRlciYgb3BlcmF0b3I9KGNvbnN0IEZpbGVSZXBvcnRlciYpOworcHVibGljOgorICAvLyByZXBvcnRpbmcgdG8gc3RkZXJyCisgIGV4cGxpY2l0IEZpbGVSZXBvcnRlcihib29sIGRvTW9uaXRvciA9IGZhbHNlKToKKyAgICAgIG1fbnVtRXJyb3JzKDApLCBtX251bUlnbm9yZWQoMCksIG1fbnVtRXhwbGljaXQoMCksIG1fbnVtVGVzdHMoMCksIF9teVN0cmVhbShmYWxzZSksCisgICAgICBtX2ZhaWxlZChmYWxzZSksIG1fZG9Nb25pdG9yKGRvTW9uaXRvcikKKyAgeyBfZmlsZSA9IHN0ZGVycjsgfQorCisgIC8vIHJlcG9ydGluZyB0byB0aGUgZmlsZSB3aXRoIHRoZSBnaXZlbiBuYW1lCisgIGV4cGxpY2l0IEZpbGVSZXBvcnRlcihjb25zdCBjaGFyKiBmaWxlLCBib29sIGRvTW9uaXRvciA9IGZhbHNlKToKKyAgICAgIG1fbnVtRXJyb3JzKDApLCBtX251bUlnbm9yZWQoMCksIG1fbnVtRXhwbGljaXQoMCksIG1fbnVtVGVzdHMoMCksIF9teVN0cmVhbSh0cnVlKSwKKyAgICAgIG1fZmFpbGVkKGZhbHNlKSwgbV9kb01vbml0b3IoZG9Nb25pdG9yKQorICB7CisjaWZuZGVmIF9TVExQX1VTRV9TQUZFX1NUUklOR19GVU5DVElPTlMKKyAgICBfZmlsZSA9IGZvcGVuKGZpbGUsICJ3Iik7CisjZWxzZQorICAgIGZvcGVuX3MoJl9maWxlLCBmaWxlLCAidyIpOworI2VuZGlmCisgIH0KKworICAvLyByZXBvcnRpbmcgdG8gdGhlIGdpdmVuIGZpbGUKKyAgZXhwbGljaXQgRmlsZVJlcG9ydGVyKEZJTEUqIHN0cmVhbSwgYm9vbCBkb01vbml0b3IgPSBmYWxzZSk6CisgICAgICBtX251bUVycm9ycygwKSwgbV9udW1JZ25vcmVkKDApLCBtX251bUV4cGxpY2l0KDApLCBtX251bVRlc3RzKDApLCBfbXlTdHJlYW0oZmFsc2UpLAorICAgICAgbV9mYWlsZWQoZmFsc2UpLCBtX2RvTW9uaXRvcihkb01vbml0b3IpCisgIHsgX2ZpbGUgPSBzdHJlYW07IH0KKworICB2aXJ0dWFsIH5GaWxlUmVwb3J0ZXIoKSB7CisgICAgaWYgKF9teVN0cmVhbSkKKyAgICAgIGZjbG9zZShfZmlsZSk7CisgICAgZWxzZQorICAgICAgZmZsdXNoKF9maWxlKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBlcnJvcihjb25zdCBjaGFyICppbl9tYWNyb05hbWUsIGNvbnN0IGNoYXIgKmluX21hY3JvLCBjb25zdCBjaGFyICppbl9maWxlLCBpbnQgaW5fbGluZSkgeworICAgIC8vIEVycm9yIG1pZ2h0IGJlIGNhbGxlZCBzZXZlcmFsIHRpbWVzIGJldHdlZW4gMiBwcm9ncmVzcyBjYWxscywgd2Ugc2hvdWxkbid0IGhvd2V2ZXIgY29uc2lkZXIKKyAgICAvLyB0aGF0IGEgdGVzdCBmYWlsZWQgdHdpY2Ugc28gd2Ugc2ltcGx5IGtlZXAgdGhlIGluZm8gdGhhdCB0ZXN0IGZhaWxlZCwgbnVtYmVyIG9mIGZhaWxlZCB0ZXN0cworICAgIC8vIGlzIGNvbXB1dGVkIGxhdGVyIGluIGVuZCBtZXRob2QuCisgICAgbV9mYWlsZWQgPSB0cnVlOworICAgIGZwcmludGYoX2ZpbGUsICJcblxuJXMoJWQpIDogJXMoJXMpOyIsIGluX2ZpbGUsIGluX2xpbmUsIGluX21hY3JvTmFtZSwgaW5fbWFjcm8pOworICB9CisKKyAgdmlydHVhbCB2b2lkIG1lc3NhZ2UoIGNvbnN0IGNoYXIgKm1zZyApCisgIHsgZnByaW50ZihfZmlsZSwgIlxuXHQlcyIsIG1zZyApOyB9CisKKyAgdmlydHVhbCB2b2lkIHByb2dyZXNzKGNvbnN0IGNoYXIgKmluX2NsYXNzTmFtZSwgY29uc3QgY2hhciAqaW5fc2hvcnRUZXN0TmFtZSwgYm9vbCBpZ25vcmVkLCBib29sIGV4cGxpY2l0VGVzdCkgeworICAgIGlmIChtX2RvTW9uaXRvcikgeworICAgICAgbV9nbG9iYWxUaW1lci5yZXN0YXJ0KCk7CisgICAgICBtX3Rlc3RUaW1lci5zdGFydCgpOworICAgIH0KKyAgICArK21fbnVtVGVzdHM7CisgICAgbV9mYWlsZWQgPSBmYWxzZTsKKyAgICBpZiAoaWdub3JlZCkKKyAgICAgICsrbV9udW1JZ25vcmVkOworICAgIGZwcmludGYoX2ZpbGUsICIlczo6JXMiLCBpbl9jbGFzc05hbWUsIGluX3Nob3J0VGVzdE5hbWUpOworICAgIGlmIChpZ25vcmVkKSB7CisgICAgICBjb25zdCBjaGFyICppZ25vcmVkUmVhc29uOworICAgICAgaWYgKGV4cGxpY2l0VGVzdCkgeworICAgICAgICArK21fbnVtRXhwbGljaXQ7CisgICAgICAgIGlnbm9yZWRSZWFzb24gPSAiIEVYUExJQ0lUIjsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgaWdub3JlZFJlYXNvbiA9ICIgSUdOT1JFRCI7CisKKyAgICAgIGZwcmludGYoX2ZpbGUsICIlcyIsIGlnbm9yZWRSZWFzb24pOworICAgIH0KKyAgfQorCisgIHZpcnR1YWwgdm9pZCBlbmQoKSB7CisgICAgaWYgKG1fZG9Nb25pdG9yKSB7CisgICAgICBtX2dsb2JhbFRpbWVyLnN0b3AoKTsKKyAgICAgIG1fdGVzdFRpbWVyLnN0b3AoKTsKKyAgICAgIGZwcmludGYoX2ZpbGUsICIgJWYgbXNlYyIsIG1fdGVzdFRpbWVyLmVsYXBzZWRNaWxsaXNlY29uZHMoKSk7CisgICAgfQorICAgIGlmIChtX2ZhaWxlZCkgeworICAgICAgKyttX251bUVycm9yczsKKyAgICB9CisgICAgZnByaW50ZihfZmlsZSwgIlxuIik7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgcHJpbnRTdW1tYXJ5KCkgeworICAgIGlmIChtX251bUVycm9ycyA+IDApIHsKKyAgICAgIGZwcmludGYoX2ZpbGUsICJcblRoZXJlIHdlcmUgZXJyb3JzISAlZCBvZiAlZCB0ZXN0cyIsIG1fbnVtRXJyb3JzLCBtX251bVRlc3RzKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBmcHJpbnRmKF9maWxlLCAiXG5PSyAlZCB0ZXN0cyIsIG1fbnVtVGVzdHMpOworICAgIH0KKworICAgIGlmIChtX251bUlnbm9yZWQgPiAwKSB7CisgICAgICBmcHJpbnRmKF9maWxlLCAiLCAlZCBpZ25vcmVkIiwgbV9udW1JZ25vcmVkKTsKKyAgICB9CisKKyAgICBpZiAobV9udW1FeHBsaWNpdCA+IDApIHsKKyAgICAgIGZwcmludGYoX2ZpbGUsICIgKCVkIGV4cGxpY2l0KSIsIG1fbnVtRXhwbGljaXQpOworICAgIH0KKworICAgIGlmIChtX2RvTW9uaXRvcikgeworICAgICAgZnByaW50ZihfZmlsZSwgIiAlZiBtc2VjIiwgbV9nbG9iYWxUaW1lci5lbGFwc2VkTWlsbGlzZWNvbmRzKCkpOworICAgIH0KKworICAgIGZwcmludGYoX2ZpbGUsICJcblxuIik7CisgIH0KK3ByaXZhdGU6CisgIGludCBtX251bUVycm9yczsKKyAgaW50IG1fbnVtSWdub3JlZDsKKyAgaW50IG1fbnVtRXhwbGljaXQ7CisgIGludCBtX251bVRlc3RzOworICAvLyBmbGFnIHdoZXRoZXIgd2Ugb3duICdfZmlsZScgYW5kIGFyZSB0aHVzIHJlc3BvbnNpYmxlIGZvciByZWxlYXNpbmcgaXQgaW4gdGhlIGRlc3RydWN0b3IKKyAgYm9vbCAgX215U3RyZWFtOworICBib29sIG1fZmFpbGVkOworICBib29sIG1fZG9Nb25pdG9yOworICBUaW1lciBtX2dsb2JhbFRpbWVyLCBtX3Rlc3RUaW1lcjsKKyAgRklMRSogX2ZpbGU7Cit9OworCisjZW5kaWYgLypfQ1BQVU5JVE1JTklGSUxFUkVQT1JURVJJTlRFUkZBQ0VfSF8qLwpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L2NwcHVuaXQvdGVzdF9tYWluLmNwcCBiL3Rlc3QvdW5pdC9jcHB1bml0L3Rlc3RfbWFpbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUxOWQ0ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9jcHB1bml0L3Rlc3RfbWFpbi5jcHAKQEAgLTAsMCArMSwxNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQKKyAqIFpkZW5layBOZW1lYworICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaW5jbHVkZSAiY3BwdW5pdF9wcm94eS5oIgorI2luY2x1ZGUgImZpbGVfcmVwb3J0ZXIuaCIKKyNpbmNsdWRlICJjcHB1bml0X3RpbWVyLmgiCisKKyNpbmNsdWRlICJzdGRpby5oIgorCisjaWYgMAorbmFtZXNwYWNlIENQUFVOSVRfTlMKK3sKKyNlbmRpZgorICBpbnQgVGVzdENhc2U6Om1fbnVtRXJyb3JzID0gMDsKKyAgaW50IFRlc3RDYXNlOjptX251bVRlc3RzID0gMDsKKworICBUZXN0Q2FzZSAqVGVzdENhc2U6Om1fcm9vdCA9IDA7CisgIFJlcG9ydGVyICpUZXN0Q2FzZTo6bV9yZXBvcnRlciA9IDA7CisKKyAgdm9pZCBUZXN0Q2FzZTo6cmVnaXN0ZXJUZXN0Q2FzZShUZXN0Q2FzZSAqaW5fdGVzdENhc2UpIHsKKyAgICBpbl90ZXN0Q2FzZS0+bV9uZXh0ID0gbV9yb290OworICAgIG1fcm9vdCA9IGluX3Rlc3RDYXNlOworICB9CisKKyAgaW50IFRlc3RDYXNlOjpydW4oUmVwb3J0ZXIgKmluX3JlcG9ydGVyLCBjb25zdCBjaGFyICppbl90ZXN0TmFtZSwgYm9vbCBpbnZlcnQpIHsKKyAgICBUZXN0Q2FzZTo6bV9yZXBvcnRlciA9IGluX3JlcG9ydGVyOworCisgICAgbV9udW1FcnJvcnMgPSAwOworICAgIG1fbnVtVGVzdHMgPSAwOworCisgICAgVGVzdENhc2UgKnRtcCA9IG1fcm9vdDsKKyAgICB3aGlsZSAodG1wICE9IDApIHsKKyAgICAgIHRtcC0+bXlSdW4oaW5fdGVzdE5hbWUsIGludmVydCk7CisgICAgICB0bXAgPSB0bXAtPm1fbmV4dDsKKyAgICB9CisgICAgcmV0dXJuIG1fbnVtRXJyb3JzOworICB9CisjaWYgMAorfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHVzYWdlKGNvbnN0IGNoYXIqIG5hbWUpCit7CisgIHByaW50ZigiVXNhZ2UgOiAlcyBbLXQ9PGNsYXNzPls6Ojx0ZXN0Pl1dIFsteD08Y2xhc3M+Wzo6PHRlc3Q+XV0gWy1mPTxmaWxlPl0lc1xuIiwKKyAgICAgICAgIG5hbWUsIFRpbWVyOjpzdXBwb3J0ZWQoKSA/ICIgWy1tXSI6ICIiKTsKKyAgcHJpbnRmKCJcdFstdD08Y2xhc3M+Wzo6PHRlc3Q+XV0gOiB0ZXN0IGNsYXNzIG9yIGNsYXNzOjp0ZXN0IHRvIGV4ZWN1dGU7XG4iKTsKKyAgcHJpbnRmKCJcdFsteD08Y2xhc3M+Wzo6PHRlc3Q+XV0gOiB0ZXN0IGNsYXNzIG9yIGNsYXNzOjp0ZXN0IHRvIGV4Y2x1ZGUgZnJvbSBleGVjdXRpb247XG4iKTsKKyAgcHJpbnRmKCJcdFstZj08ZmlsZT5dIDogb3V0cHV0IGZpbGUiKTsKKyAgaWYgKFRpbWVyOjpzdXBwb3J0ZWQoKSkKKyAgICBwcmludGYoIjtcblx0Wy1tXSA6IG1vbml0b3IgdGVzdCBleGVjdXRpb24sIGRpc3BsYXkgdGltZSBkdXJhdGlvbiBmb3IgZWFjaCB0ZXN0XG4iKTsKKyAgZWxzZQorICAgIHByaW50ZigiXG4iKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisKKyAgLy8gQ3BwVW5pdChtaW5pKSB0ZXN0IGxhdW5jaGVyCisgIC8vIGNvbW1hbmQgbGluZSBvcHRpb24gc3ludGF4OgorICAvLyB0ZXN0IFtPUFRJT05TXQorICAvLyB3aGVyZSBPUFRJT05TIGFyZQorICAvLyAgLXQ9Q0xBU1NbOjpURVNUXSAgICBydW4gdGhlIHRlc3QgY2xhc3MgQ0xBU1Mgb3IgbWVtYmVyIHRlc3QgQ0xBU1M6OlRFU1QKKyAgLy8gIC14PUNMQVNTWzo6VEVTVF0gICAgcnVuIGFsbCBleGNlcHQgdGhlIHRlc3QgY2xhc3MgQ0xBU1Mgb3IgbWVtYmVyIHRlc3QgQ0xBU1M6OlRFU1QKKyAgLy8gIC1mPUZJTEUgICAgICAgICAgICAgc2F2ZSBvdXRwdXQgaW4gZmlsZSBGSUxFIGluc3RlYWQgb2Ygc3Rkb3V0CisgIC8vICAtbSAgICAgICAgICAgICAgICAgIG1vbml0b3IgdGVzdChzKSBleGVjdXRpb24KKyAgY29uc3QgY2hhciAqZmlsZU5hbWUgPSAwOworICBjb25zdCBjaGFyICp0ZXN0TmFtZSA9ICIiOworICBjb25zdCBjaGFyICp4dGVzdE5hbWUgPSAiIjsKKyAgYm9vbCBkb01vbml0b3JpbmcgPSBmYWxzZTsKKworICBmb3IgKGludCBpID0gMTsgaSA8IGFyZ2M7ICsraSkgeworICAgIGlmIChhcmd2W2ldWzBdID09ICctJykgeworICAgICAgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItdD0iLCAzKSkgeworICAgICAgICB0ZXN0TmFtZSA9IGFyZ3ZbaV0rMzsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAiLWY9IiwgMykpIHsKKyAgICAgICAgZmlsZU5hbWUgPSBhcmd2W2ldKzM7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi14PSIsIDMpKSB7CisgICAgICAgIHh0ZXN0TmFtZSA9IGFyZ3ZbaV0rMzsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBlbHNlIGlmIChUaW1lcjo6c3VwcG9ydGVkKCkgJiYgIXN0cm5jbXAoYXJndltpXSwgIi1tIiwgMikpIHsKKyAgICAgICAgZG9Nb25pdG9yaW5nID0gdHJ1ZTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgfQorCisJCS8vIGludmFsaWQgb3B0aW9uLCB3ZSBkaXNwbGF5IG5vcm1hbCB1c2FnZS4KKyAgICB1c2FnZShhcmd2WzBdKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIENQUFVOSVRfTlM6OlJlcG9ydGVyKiByZXBvcnRlcjsKKyAgaWYgKGZpbGVOYW1lICE9IDApCisgICAgcmVwb3J0ZXIgPSBuZXcgRmlsZVJlcG9ydGVyKGZpbGVOYW1lLCBkb01vbml0b3JpbmcpOworICBlbHNlCisgICAgcmVwb3J0ZXIgPSBuZXcgRmlsZVJlcG9ydGVyKHN0ZG91dCwgZG9Nb25pdG9yaW5nKTsKKworICBpbnQgbnVtX2Vycm9yczsKKyAgaWYgKHh0ZXN0TmFtZVswXSAhPSAwKSB7CisgICAgbnVtX2Vycm9ycyA9IENQUFVOSVRfTlM6OlRlc3RDYXNlOjpydW4ocmVwb3J0ZXIsIHh0ZXN0TmFtZSwgdHJ1ZSk7CisgIH0gZWxzZSB7CisgICAgbnVtX2Vycm9ycyA9IENQUFVOSVRfTlM6OlRlc3RDYXNlOjpydW4ocmVwb3J0ZXIsIHRlc3ROYW1lKTsKKyAgfQorCisgIHJlcG9ydGVyLT5wcmludFN1bW1hcnkoKTsKKyAgZGVsZXRlIHJlcG9ydGVyOworCisgIHJldHVybiBudW1fZXJyb3JzOworfQorCisvLyBTZWUgZG9jL1JFQURNRS5pbnRlbCBmb3IgZXhwbGFuYXRpb24gYWJvdXQgdGhpcyBjb2RlCisjaWYgZGVmaW5lZCAoU1RMUE9SVCkgJiYgZGVmaW5lZCAoX19JQ0wpICYmIChfX0lDTCA+PSA5MDApICYmIFwKKyAgICAgICAgICAgIChfU1RMUF9NU1ZDX0xJQiA8IDEzMDApICYmIGRlZmluZWQgKF9TVExQX1VTRV9EWU5BTUlDX0xJQikKKyMgIGluY2x1ZGUgPGV4Y2VwdGlvbj4KKworIyAgdW5kZWYgc3RkCituYW1lc3BhY2Ugc3RkCit7CisgIHZvaWQgX1NUTFBfQ0FMTCB1bmV4cGVjdGVkKCkgeworICAgIHVuZXhwZWN0ZWRfaGFuZGxlciBoZGw7CisgICAgc2V0X3VuZXhwZWN0ZWQoaGRsID0gc2V0X3VuZXhwZWN0ZWQoKHVuZXhwZWN0ZWRfaGFuZGxlcikwKSk7CisgICAgaGRsKCk7CisgIH0KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L2NzZXRqbXBfaGVhZGVyX3Rlc3QuY3BwIGIvdGVzdC91bml0L2NzZXRqbXBfaGVhZGVyX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MTc4NjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvY3NldGptcF9oZWFkZXJfdGVzdC5jcHAKQEAgLTAsMCArMSw4IEBACisvKiBUaGlzIHRlc3QgcHVycG9zZSBpcyBzaW1wbHkgdG8gY2hlY2sgU3RhbmRhcmQgaGVhZGVyIGluZGVwZW5kYW5jeSB0aGF0CisgKiBpcyB0byBzYXkgdGhhdCB0aGUgaGVhZGVyIGNhbiBiZSBpbmNsdWRlZCBhbG9uZSB3aXRob3V0IGFueSBwcmV2aW91cworICogaW5jbHVkZS4KKyAqIEFkZGl0aW9ubmFseSwgZm9yIEMgU3RhbmRhcmQgaGVhZGVycyB0aGF0IFNUTHBvcnQgZXhwb3NlLCBpdCBjYW4gYWxzbyBiZQorICogdXNlZCB0byBjaGVjayB0aGF0IGZpbGVzIGluY2x1ZGVkIGJ5IHRob3NlIGhlYWRlcnMgYXJlIGNvbXBhdGlibGUgd2l0aAorICogcHVyZSBDIGNvbXBpbGVycy4KKyAqLworI2luY2x1ZGUgPGNzZXRqbXA+CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvY3NpZ25hbF9oZWFkZXJfdGVzdC5jcHAgYi90ZXN0L3VuaXQvY3NpZ25hbF9oZWFkZXJfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE5YzZlMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9jc2lnbmFsX2hlYWRlcl90ZXN0LmNwcApAQCAtMCwwICsxLDggQEAKKy8qIFRoaXMgdGVzdCBwdXJwb3NlIGlzIHNpbXBseSB0byBjaGVjayBTdGFuZGFyZCBoZWFkZXIgaW5kZXBlbmRhbmN5IHRoYXQKKyAqIGlzIHRvIHNheSB0aGF0IHRoZSBoZWFkZXIgY2FuIGJlIGluY2x1ZGVkIGFsb25lIHdpdGhvdXQgYW55IHByZXZpb3VzCisgKiBpbmNsdWRlLgorICogQWRkaXRpb25uYWx5LCBmb3IgQyBTdGFuZGFyZCBoZWFkZXJzIHRoYXQgU1RMcG9ydCBleHBvc2UsIGl0IGNhbiBhbHNvIGJlCisgKiB1c2VkIHRvIGNoZWNrIHRoYXQgZmlsZXMgaW5jbHVkZWQgYnkgdGhvc2UgaGVhZGVycyBhcmUgY29tcGF0aWJsZSB3aXRoCisgKiBwdXJlIEMgY29tcGlsZXJzLgorICovCisjaW5jbHVkZSA8Y3NpZ25hbD4KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9jc3RkYXJnX2hlYWRlcl90ZXN0LmNwcCBiL3Rlc3QvdW5pdC9jc3RkYXJnX2hlYWRlcl90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmNmMGE1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L2NzdGRhcmdfaGVhZGVyX3Rlc3QuY3BwCkBAIC0wLDAgKzEsOCBAQAorLyogVGhpcyB0ZXN0IHB1cnBvc2UgaXMgc2ltcGx5IHRvIGNoZWNrIFN0YW5kYXJkIGhlYWRlciBpbmRlcGVuZGFuY3kgdGhhdAorICogaXMgdG8gc2F5IHRoYXQgdGhlIGhlYWRlciBjYW4gYmUgaW5jbHVkZWQgYWxvbmUgd2l0aG91dCBhbnkgcHJldmlvdXMKKyAqIGluY2x1ZGUuCisgKiBBZGRpdGlvbm5hbHksIGZvciBDIFN0YW5kYXJkIGhlYWRlcnMgdGhhdCBTVExwb3J0IGV4cG9zZSwgaXQgY2FuIGFsc28gYmUKKyAqIHVzZWQgdG8gY2hlY2sgdGhhdCBmaWxlcyBpbmNsdWRlZCBieSB0aG9zZSBoZWFkZXJzIGFyZSBjb21wYXRpYmxlIHdpdGgKKyAqIHB1cmUgQyBjb21waWxlcnMuCisgKi8KKyNpbmNsdWRlIDxjc3RkYXJnPgpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L2NzdGRkZWZfaGVhZGVyX3Rlc3QuY3BwIGIvdGVzdC91bml0L2NzdGRkZWZfaGVhZGVyX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMWQzZjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvY3N0ZGRlZl9oZWFkZXJfdGVzdC5jcHAKQEAgLTAsMCArMSw4IEBACisvKiBUaGlzIHRlc3QgcHVycG9zZSBpcyBzaW1wbHkgdG8gY2hlY2sgU3RhbmRhcmQgaGVhZGVyIGluZGVwZW5kYW5jeSB0aGF0CisgKiBpcyB0byBzYXkgdGhhdCB0aGUgaGVhZGVyIGNhbiBiZSBpbmNsdWRlZCBhbG9uZSB3aXRob3V0IGFueSBwcmV2aW91cworICogaW5jbHVkZS4KKyAqIEFkZGl0aW9ubmFseSwgZm9yIEMgU3RhbmRhcmQgaGVhZGVycyB0aGF0IFNUTHBvcnQgZXhwb3NlLCBpdCBjYW4gYWxzbyBiZQorICogdXNlZCB0byBjaGVjayB0aGF0IGZpbGVzIGluY2x1ZGVkIGJ5IHRob3NlIGhlYWRlcnMgYXJlIGNvbXBhdGlibGUgd2l0aAorICogcHVyZSBDIGNvbXBpbGVycy4KKyAqLworI2luY2x1ZGUgPGNzdGRkZWY+CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvY3N0ZGlvX2hlYWRlcl90ZXN0LmNwcCBiL3Rlc3QvdW5pdC9jc3RkaW9faGVhZGVyX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzOGE1ZTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvY3N0ZGlvX2hlYWRlcl90ZXN0LmNwcApAQCAtMCwwICsxLDggQEAKKy8qIFRoaXMgdGVzdCBwdXJwb3NlIGlzIHNpbXBseSB0byBjaGVjayBTdGFuZGFyZCBoZWFkZXIgaW5kZXBlbmRhbmN5IHRoYXQKKyAqIGlzIHRvIHNheSB0aGF0IHRoZSBoZWFkZXIgY2FuIGJlIGluY2x1ZGVkIGFsb25lIHdpdGhvdXQgYW55IHByZXZpb3VzCisgKiBpbmNsdWRlLgorICogQWRkaXRpb25uYWx5LCBmb3IgQyBTdGFuZGFyZCBoZWFkZXJzIHRoYXQgU1RMcG9ydCBleHBvc2UsIGl0IGNhbiBhbHNvIGJlCisgKiB1c2VkIHRvIGNoZWNrIHRoYXQgZmlsZXMgaW5jbHVkZWQgYnkgdGhvc2UgaGVhZGVycyBhcmUgY29tcGF0aWJsZSB3aXRoCisgKiBwdXJlIEMgY29tcGlsZXJzLgorICovCisjaW5jbHVkZSA8Y3N0ZGlvPgpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L2NzdGRsaWJfaGVhZGVyX3Rlc3QuY3BwIGIvdGVzdC91bml0L2NzdGRsaWJfaGVhZGVyX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNTYwNzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvY3N0ZGxpYl9oZWFkZXJfdGVzdC5jcHAKQEAgLTAsMCArMSwxMyBAQAorLyogVGhpcyB0ZXN0IHB1cnBvc2UgaXMgc2ltcGx5IHRvIGNoZWNrIFN0YW5kYXJkIGhlYWRlciBpbmRlcGVuZGFuY3kgdGhhdAorICogaXMgdG8gc2F5IHRoYXQgdGhlIGhlYWRlciBjYW4gYmUgaW5jbHVkZWQgYWxvbmUgd2l0aG91dCBhbnkgcHJldmlvdXMKKyAqIGluY2x1ZGUuCisgKiBBZGRpdGlvbm5hbHksIGZvciBDIFN0YW5kYXJkIGhlYWRlcnMgdGhhdCBTVExwb3J0IGV4cG9zZSwgaXQgY2FuIGFsc28gYmUKKyAqIHVzZWQgdG8gY2hlY2sgdGhhdCBmaWxlcyBpbmNsdWRlZCBieSB0aG9zZSBoZWFkZXJzIGFyZSBjb21wYXRpYmxlIHdpdGgKKyAqIHB1cmUgQyBjb21waWxlcnMuCisgKi8KKyNpbmNsdWRlIDxjc3RkbGliPgorCisvL0p1c3QgYW4gYWRkaXRpb25uYWwgY29tcGlsYXRpb24gdGVzdCBmb3IgQm9ybGFuZCB0aGF0IHVzZWQgdG8gZmFpbCBoZXJlLgorI2lmIGRlZmluZWQgKF9fQk9STEFORENfXykKKyMgIGluY2x1ZGUgPHByb2Nlc3MuaD4KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L2NzdHJpbmdfaGVhZGVyX3Rlc3QuY3BwIGIvdGVzdC91bml0L2NzdHJpbmdfaGVhZGVyX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNWQyY2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvY3N0cmluZ19oZWFkZXJfdGVzdC5jcHAKQEAgLTAsMCArMSw4IEBACisvKiBUaGlzIHRlc3QgcHVycG9zZSBpcyBzaW1wbHkgdG8gY2hlY2sgU3RhbmRhcmQgaGVhZGVyIGluZGVwZW5kYW5jeSB0aGF0CisgKiBpcyB0byBzYXkgdGhhdCB0aGUgaGVhZGVyIGNhbiBiZSBpbmNsdWRlZCBhbG9uZSB3aXRob3V0IGFueSBwcmV2aW91cworICogaW5jbHVkZS4KKyAqIEFkZGl0aW9ubmFseSwgZm9yIEMgU3RhbmRhcmQgaGVhZGVycyB0aGF0IFNUTHBvcnQgZXhwb3NlLCBpdCBjYW4gYWxzbyBiZQorICogdXNlZCB0byBjaGVjayB0aGF0IGZpbGVzIGluY2x1ZGVkIGJ5IHRob3NlIGhlYWRlcnMgYXJlIGNvbXBhdGlibGUgd2l0aAorICogcHVyZSBDIGNvbXBpbGVycy4KKyAqLworI2luY2x1ZGUgPGNzdHJpbmc+CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvY3N0cmluZ190ZXN0LmNwcCBiL3Rlc3QvdW5pdC9jc3RyaW5nX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MWRhMDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvY3N0cmluZ190ZXN0LmNwcApAQCAtMCwwICsxLDc1IEBACisjZGVmaW5lIF9TVExQX0RPX0lNUE9SVF9DU1REX0ZVTkNUSU9OUworCisjaW5jbHVkZSA8Y3N0cmluZz4KKworI2luY2x1ZGUgImNwcHVuaXQvY3BwdW5pdF9wcm94eS5oIgorCisvL1RoaXMgdGVzdCBwdXJwb3NlIGlzIHRvIGNoZWNrIHRoZSByaWdodCBpbXBvcnQgb2YgbWF0aC5oIEMgc3ltYm9scworLy9pbnRvIHRoZSBzdGQgbmFtZXNwYWNlIHNvIHdlIGRvIG5vdCB1c2UgdGhlIHVzaW5nIG5hbWVzcGFjZSBzdGQKKy8vc3BlY2lmaWNhdGlvbgorCisvLworLy8gVGVzdENhc2UgY2xhc3MKKy8vCitjbGFzcyBDU3RyaW5nVGVzdCA6IHB1YmxpYyBDUFBVTklUX05TOjpUZXN0Q2FzZQoreworICBDUFBVTklUX1RFU1RfU1VJVEUoQ1N0cmluZ1Rlc3QpOworI2lmIGRlZmluZWQgKFNUTFBPUlQpICYmICFkZWZpbmVkIChfU1RMUF9VU0VfTkFNRVNQQUNFUykKKyAgQ1BQVU5JVF9JR05PUkU7CisjZW5kaWYKKyAgQ1BQVU5JVF9URVNUKGltcG9ydF9jaGVja3MpOworICBDUFBVTklUX1RFU1RfU1VJVEVfRU5EKCk7CisKKyAgcHJvdGVjdGVkOgorICAgIHZvaWQgaW1wb3J0X2NoZWNrcygpOworfTsKKworQ1BQVU5JVF9URVNUX1NVSVRFX1JFR0lTVFJBVElPTihDU3RyaW5nVGVzdCk7CisKKyNpZiBkZWZpbmVkIChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDE0MDApCisvL0ZvciBkZXByZWNhdGVkIHN5bWJvbHMgbGlrZSBzdHJjYXQsIHN0cnRvay4uLgorIyAgcHJhZ21hIHdhcm5pbmcgKGRpc2FibGUgOiA0OTk2KQorI2VuZGlmCisKKy8vCisvLyB0ZXN0cyBpbXBsZW1lbnRhdGlvbgorLy8KK3ZvaWQgQ1N0cmluZ1Rlc3Q6OmltcG9ydF9jaGVja3MoKQoreworI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkIChfU1RMUF9VU0VfTkFNRVNQQUNFUykKKyAgc3RkOjpzaXplX3QgYmFyID0gMDsKKyAgQ1BQVU5JVF9DSEVDSyggYmFyID09IDAgKTsKKworICBDUFBVTklUX0NIRUNLKCBzdGQ6Om1lbWNocigiZm9vIiwgJ28nLCAzKSAhPSBOVUxMICk7CisgIENQUFVOSVRfQ0hFQ0soIHN0ZDo6bWVtY21wKCJmb28xIiwgImZvbzIiLCAzKSA9PSAwICk7CisgIGNoYXIgYnVmMVsxXSwgYnVmMlsxXTsKKyAgQ1BQVU5JVF9DSEVDSyggc3RkOjptZW1jcHkoYnVmMSwgYnVmMiwgMCkgIT0gTlVMTCApOworICBDUFBVTklUX0NIRUNLKCBzdGQ6Om1lbW1vdmUoYnVmMSwgYnVmMiwgMCkgIT0gTlVMTCApOworICBDUFBVTklUX0NIRUNLKCBzdGQ6Om1lbXNldChidWYxLCAwLCAxKSAhPSBOVUxMICk7CisgIGNoYXIgYnVmWzE2XTsgYnVmWzBdID0gMDsKKyAgY29uc3QgY2hhciogZm9vID0gImZvbyI7CisjICBpZiAhZGVmaW5lZChfV0lOMzJfV0NFKQorICBDUFBVTklUX0NIRUNLKCBzdGQ6OnN0cmNvbGwoImZvbyIsICJmb28iKSA9PSAwICk7CisgIENQUFVOSVRfQ0hFQ0soIHN0ZDo6c3RyZXJyb3IoMCkgIT0gTlVMTCApOworIyAgZW5kaWYKKyAgQ1BQVU5JVF9DSEVDSyggc3RkOjpzdHJjYXQoKGNoYXIqKWJ1ZiwgZm9vKSA9PSAoY2hhciopYnVmICk7IC8vIGJ1ZiA8LSBmb28KKyAgQ1BQVU5JVF9DSEVDSyggc3RkOjpzdHJjaHIoZm9vLCAnbycpICE9IE5VTEwgKTsKKyAgQ1BQVU5JVF9DSEVDSyggc3RkOjpzdHJjbXAoImZvbzEiLCAiZm9vMiIpIDwgMCApOworICBDUFBVTklUX0NIRUNLKCBzdGQ6OnN0cmNweSgoY2hhciopYnVmLCBmb28pID09IChjaGFyKilidWYgKTsgLy8gYnVmIDwtIGZvbworICBDUFBVTklUX0NIRUNLKCBzdGQ6OnN0cmNzcG4oImZvbyIsICJvIikgPT0gMSApOworICBDUFBVTklUX0NIRUNLKCBzdGQ6OnN0cmxlbigiZm9vIikgPT0gMyApOworICBDUFBVTklUX0NIRUNLKCBzdGQ6OnN0cm5jYXQoKGNoYXIqKWJ1ZiwgZm9vLCAyKSA9PSAoY2hhciopYnVmICk7IC8vIGJ1ZiA8LSBmb29mbworICBDUFBVTklUX0NIRUNLKCBzdGQ6OnN0cm5jbXAoImZvbzEiLCAiZm9vMiIsIDMpID09IDAgKTsKKyAgQ1BQVU5JVF9DSEVDSyggc3RkOjpzdHJuY3B5KChjaGFyKilidWYsIGZvbywgMykgPT0gKGNoYXIqKWJ1ZiApOyAvLyBidWYgPC0gZm9vCisgIENQUFVOSVRfQ0hFQ0soIHN0ZDo6c3RycGJyayhmb28sICJhYmNkbyIpID09IGZvbyArIDEgKTsKKyAgY29uc3QgY2hhciogZm9vZm9vID0gImZvb2ZvbyI7CisgIENQUFVOSVRfQ0hFQ0soIHN0ZDo6c3RycmNocihmb29mb28sICdmJykgPT0gZm9vZm9vICsgMyApOworICBDUFBVTklUX0NIRUNLKCBzdGQ6OnN0cnNwbihmb29mb28sICJhb2Z6IikgPT0gNiApOworICBDUFBVTklUX0NIRUNLKCBzdGQ6OnN0cnN0cihmb28sICIiKSA9PSBmb28gKTsKKyAgY2hhciBmb29mb29idWZbXSA9ICJmb29mb28iOworICBDUFBVTklUX0NIRUNLKCBzdGQ6OnN0cnRvayhmb29mb29idWYsICJ6IikgIT0gTlVMTCApOworIyAgaWYgIWRlZmluZWQoX1dJTjMyX1dDRSkKKyAgQ1BQVU5JVF9DSEVDSyggc3RkOjpzdHJ4ZnJtKChjaGFyKilidWYsIGZvbywgMykgIT0gMCApOworIyAgZW5kaWYKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L2N0aW1lX2hlYWRlcl90ZXN0LmNwcCBiL3Rlc3QvdW5pdC9jdGltZV9oZWFkZXJfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU3MWMxOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9jdGltZV9oZWFkZXJfdGVzdC5jcHAKQEAgLTAsMCArMSw4IEBACisvKiBUaGlzIHRlc3QgcHVycG9zZSBpcyBzaW1wbHkgdG8gY2hlY2sgU3RhbmRhcmQgaGVhZGVyIGluZGVwZW5kYW5jeSB0aGF0CisgKiBpcyB0byBzYXkgdGhhdCB0aGUgaGVhZGVyIGNhbiBiZSBpbmNsdWRlZCBhbG9uZSB3aXRob3V0IGFueSBwcmV2aW91cworICogaW5jbHVkZS4KKyAqIEFkZGl0aW9ubmFseSwgZm9yIEMgU3RhbmRhcmQgaGVhZGVycyB0aGF0IFNUTHBvcnQgZXhwb3NlLCBpdCBjYW4gYWxzbyBiZQorICogdXNlZCB0byBjaGVjayB0aGF0IGZpbGVzIGluY2x1ZGVkIGJ5IHRob3NlIGhlYWRlcnMgYXJlIGNvbXBhdGlibGUgd2l0aAorICogcHVyZSBDIGNvbXBpbGVycy4KKyAqLworI2luY2x1ZGUgPGN0aW1lPgpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L2N0eXBlX2ZhY2V0c190ZXN0LmNwcCBiL3Rlc3QvdW5pdC9jdHlwZV9mYWNldHNfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYwOWUyMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9jdHlwZV9mYWNldHNfdGVzdC5jcHAKQEAgLTAsMCArMSw1MjAgQEAKKyNpbmNsdWRlICJsb2NhbGVfdGVzdC5oIgorCisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8ICFkZWZpbmVkIChfU1RMUF9VU0VfTk9fSU9TVFJFQU1TKQorIyAgaW5jbHVkZSA8bG9jYWxlPgorIyAgaW5jbHVkZSA8c3RkZXhjZXB0PgorCisjICBpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZChfU1RMUF9VU0VfTkFNRVNQQUNFUykKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisjICBlbmRpZgorCitzdGF0aWMgY29uc3QgY2hhciogdGVzdGVkX2xvY2FsZXNbXSA9IHsKKy8vbmFtZSwKKyMgIGlmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkIChfU1RMUF9VU0VfRVhDRVBUSU9OUykKKyAgLy8gV2UgbmVlZCBleGNlcHRpb24gc3VwcG9ydCB0byBjaGVjayBzdXBwb3J0IG9mIHRoZSBmb2xsb3dpbmcgbG9jYWxpemF0aW9ucy4KKyAgImZyX0ZSIiwKKyAgInJ1X1JVLmtvaThyIiwKKyAgImVuX0dCIiwKKyAgImVuX1VTIiwKKyMgIGVuZGlmCisgICIiLAorICAiQyIKK307CisKKy8vCisvLyB0ZXN0cyBpbXBsZW1lbnRhdGlvbgorLy8KK3ZvaWQgTG9jYWxlVGVzdDo6X2N0eXBlX2ZhY2V0KCBjb25zdCBsb2NhbGUmIGxvYykKK3sKKyAgQ1BQVU5JVF9BU1NFUlQoIGhhc19mYWNldDxjdHlwZTxjaGFyPiA+KGxvYykgKTsKKyAgY3R5cGU8Y2hhcj4gY29uc3QmIGN0ID0gdXNlX2ZhY2V0PGN0eXBlPGNoYXI+ID4obG9jKTsKKyAgLy9pcworICB7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGN0LmlzKGN0eXBlX2Jhc2U6OmRpZ2l0LCAnMCcpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGN0LmlzKGN0eXBlX2Jhc2U6OnVwcGVyLCAnQScpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGN0LmlzKGN0eXBlX2Jhc2U6Omxvd2VyLCAnYScpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGN0LmlzKGN0eXBlX2Jhc2U6OmFscGhhLCAnQScpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGN0LmlzKGN0eXBlX2Jhc2U6OnNwYWNlLCAnICcpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoICFjdC5pcyhjdHlwZV9iYXNlOjpzcGFjZSwgJzInKSApOworICAgIENQUFVOSVRfQVNTRVJUKCBjdC5pcyhjdHlwZV9iYXNlOjpwdW5jdCwgJy4nKSApOworICAgIENQUFVOSVRfQVNTRVJUKCBjdC5pcyhjdHlwZV9iYXNlOjp4ZGlnaXQsICdhJykgKTsKKyAgfQorCisgIC8vaXMgcmFuZ2UKKyAgeworICAgIGNoYXIgdmFsdWVzW10gPSAiMEFhIC4iOworICAgIGN0eXBlX2Jhc2U6Om1hc2sgcmVzW3NpemVvZih2YWx1ZXMpXTsKKyAgICBjdC5pcyh2YWx1ZXMsIHZhbHVlcyArIHNpemVvZih2YWx1ZXMpLCByZXMpOworICAgIC8vICcwJworICAgIENQUFVOSVRfQVNTRVJUKCAocmVzWzBdICYgY3R5cGVfYmFzZTo6cHJpbnQpICE9IDAgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggKHJlc1swXSAmIGN0eXBlX2Jhc2U6OmRpZ2l0KSAhPSAwICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIChyZXNbMF0gJiBjdHlwZV9iYXNlOjp4ZGlnaXQpICE9IDAgKTsKKyAgICAvLyAnQScKKyAgICBDUFBVTklUX0FTU0VSVCggKHJlc1sxXSAmIGN0eXBlX2Jhc2U6OnByaW50KSAhPSAwICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIChyZXNbMV0gJiBjdHlwZV9iYXNlOjphbHBoYSkgIT0gMCApOworICAgIENQUFVOSVRfQVNTRVJUKCAocmVzWzFdICYgY3R5cGVfYmFzZTo6eGRpZ2l0KSAhPSAwICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIChyZXNbMV0gJiBjdHlwZV9iYXNlOjp1cHBlcikgIT0gMCApOworICAgIC8vICdhJworICAgIENQUFVOSVRfQVNTRVJUKCAocmVzWzJdICYgY3R5cGVfYmFzZTo6cHJpbnQpICE9IDAgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggKHJlc1syXSAmIGN0eXBlX2Jhc2U6OmFscGhhKSAhPSAwICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIChyZXNbMl0gJiBjdHlwZV9iYXNlOjp4ZGlnaXQpICE9IDAgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggKHJlc1syXSAmIGN0eXBlX2Jhc2U6Omxvd2VyKSAhPSAwICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIChyZXNbMl0gJiBjdHlwZV9iYXNlOjpzcGFjZSkgPT0gMCApOworICAgIC8vICcgJworICAgIENQUFVOSVRfQVNTRVJUKCAocmVzWzNdICYgY3R5cGVfYmFzZTo6cHJpbnQpICE9IDAgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggKHJlc1szXSAmIGN0eXBlX2Jhc2U6OnNwYWNlKSAhPSAwICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIChyZXNbM10gJiBjdHlwZV9iYXNlOjpkaWdpdCkgPT0gMCApOworICAgIC8vICcuJworICAgIENQUFVOSVRfQVNTRVJUKCAocmVzWzRdICYgY3R5cGVfYmFzZTo6cHJpbnQpICE9IDAgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggKHJlc1s0XSAmIGN0eXBlX2Jhc2U6OnB1bmN0KSAhPSAwICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIChyZXNbNF0gJiBjdHlwZV9iYXNlOjpkaWdpdCkgPT0gMCApOworICB9CisKKyAgLy9zY2FuX2lzCisgIHsKKyAgICBjaGFyIHJhbmdlW10gPSAiYWJBYzEyMyAuIjsKKyAgICBjb25zdCBjaGFyICpyYmVnID0gcmFuZ2U7CisgICAgY29uc3QgY2hhciAqcmVuZCA9IHJhbmdlICsgc2l6ZW9mKHJhbmdlKTsKKworICAgIGNvbnN0IGNoYXIgKnJlczsKKyAgICByZXMgPSBjdC5zY2FuX2lzKChjdHlwZV9iYXNlOjptYXNrKShjdHlwZV9iYXNlOjphbHBoYSB8IGN0eXBlX2Jhc2U6Omxvd2VyKSwgcmJlZywgcmVuZCk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHJlcyAhPSByZW5kICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoICpyZXMgPT0gJ2EnICk7CisKKyAgICByZXMgPSBjdC5zY2FuX2lzKGN0eXBlX2Jhc2U6OnVwcGVyLCByYmVnLCByZW5kKTsKKyAgICBDUFBVTklUX0FTU0VSVCggcmVzICE9IHJlbmQgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggKnJlcyA9PSAnQScgKTsKKworICAgIHJlcyA9IGN0LnNjYW5faXMoY3R5cGVfYmFzZTo6cHVuY3QsIHJiZWcsIHJlbmQpOworICAgIENQUFVOSVRfQVNTRVJUKCByZXMgIT0gcmVuZCApOworICAgIENQUFVOSVRfQVNTRVJUKCAqcmVzID09ICcuJyApOworICB9CisKKyAgLy9zY2FuX25vdAorICB7CisgICAgY2hhciByYW5nZVtdID0gImFiQWMxMjMgLiI7CisgICAgY29uc3QgY2hhciAqcmJlZyA9IHJhbmdlOworICAgIGNvbnN0IGNoYXIgKnJlbmQgPSByYW5nZSArIHNpemVvZihyYW5nZSk7CisKKyAgICBjb25zdCBjaGFyICpyZXM7CisgICAgcmVzID0gY3Quc2Nhbl9ub3QoKGN0eXBlX2Jhc2U6Om1hc2spKGN0eXBlX2Jhc2U6OmFscGhhIHwgY3R5cGVfYmFzZTo6bG93ZXIpLCByYmVnLCByZW5kKTsKKyAgICBDUFBVTklUX0FTU0VSVCggcmVzICE9IHJlbmQgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggKnJlcyA9PSAnMScgKTsKKworICAgIHJlcyA9IGN0LnNjYW5fbm90KGN0eXBlX2Jhc2U6OmFscGhhLCByYmVnLCByZW5kKTsKKyAgICBDUFBVTklUX0FTU0VSVCggcmVzICE9IHJlbmQgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggKnJlcyA9PSAnMScgKTsKKworICAgIHJlcyA9IGN0LnNjYW5fbm90KGN0eXBlX2Jhc2U6OnB1bmN0LCByYmVnLCByZW5kKTsKKyAgICBDUFBVTklUX0FTU0VSVCggcmVzICE9IHJlbmQgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggKnJlcyA9PSAnYScgKTsKKyAgfQorCisgIC8vdG91cHBlcgorICB7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGN0LnRvdXBwZXIoJ2EnKSA9PSAnQScgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggY3QudG91cHBlcignQScpID09ICdBJyApOworICAgIENQUFVOSVRfQVNTRVJUKCBjdC50b3VwcGVyKCcxJykgPT0gJzEnICk7CisgIH0KKworICAvL3RvdXBwZXIgcmFuZ2UKKyAgeworICAgIGNoYXIgcmFuZ2VbXSA9ICJhYkFjMSI7CisgICAgY2hhciBleHBlY3RlZF9yYW5nZVtdID0gIkFCQUMxIjsKKyAgICBjdC50b3VwcGVyKHJhbmdlLCByYW5nZSArIHNpemVvZihyYW5nZSkpOworICAgIENQUFVOSVRfQVNTRVJUKCBlcXVhbChyYW5nZSwgcmFuZ2UgKyBzaXplb2YocmFuZ2UpLCBleHBlY3RlZF9yYW5nZSkgKTsKKyAgfQorCisgIC8vdG9sb3dlcgorICB7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGN0LnRvbG93ZXIoJ0EnKSA9PSAnYScgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggY3QudG9sb3dlcignYScpID09ICdhJyApOworICAgIENQUFVOSVRfQVNTRVJUKCBjdC50b2xvd2VyKCcxJykgPT0gJzEnICk7CisgIH0KKworICAvL3RvbG93ZXIgcmFuZ2UKKyAgeworICAgIGNoYXIgcmFuZ2VbXSA9ICJBQmFDMSI7CisgICAgY2hhciBleHBlY3RlZF9yYW5nZVtdID0gImFiYWMxIjsKKyAgICBjdC50b2xvd2VyKHJhbmdlLCByYW5nZSArIHNpemVvZihyYW5nZSkpOworICAgIENQUFVOSVRfQVNTRVJUKCBlcXVhbChyYW5nZSwgcmFuZ2UgKyBzaXplb2YocmFuZ2UpLCBleHBlY3RlZF9yYW5nZSkgKTsKKyAgfQorCisgIC8vd2lkZW4KKyAgeworICAgIENQUFVOSVRfQVNTRVJUKCBjdC53aWRlbignYScpID09ICdhJyApOworICB9CisKKyAgLy93aWRlbiByYW5nZQorICB7CisgICAgY2hhciByYW5nZVtdID0gIkFCYUMxIjsKKyAgICBjaGFyIHJlc1tzaXplb2YocmFuZ2UpXTsKKyAgICBjdC53aWRlbihyYW5nZSwgcmFuZ2UgKyBzaXplb2YocmFuZ2UpLCByZXMpOworICAgIENQUFVOSVRfQVNTRVJUKCBlcXVhbChyYW5nZSwgcmFuZ2UgKyBzaXplb2YocmFuZ2UpLCByZXMpICk7CisgIH0KKworICAvL25hcnJvdworICB7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGN0Lm5hcnJvdygnYScsICdiJykgPT0gJ2EnICk7CisgIH0KKworICAvL25hcnJvdyByYW5nZQorICB7CisgICAgY2hhciByYW5nZVtdID0gIkFCYUMxIjsKKyAgICBjaGFyIHJlc1tzaXplb2YocmFuZ2UpXTsKKyAgICBjdC5uYXJyb3cocmFuZ2UsIHJhbmdlICsgc2l6ZW9mKHJhbmdlKSwgJ2InLCByZXMpOworICAgIENQUFVOSVRfQVNTRVJUKCBlcXVhbChyYW5nZSwgcmFuZ2UgKyBzaXplb2YocmFuZ2UpLCByZXMpICk7CisgIH0KK30KKwordm9pZCBMb2NhbGVUZXN0OjpfY3R5cGVfZmFjZXRfdyggY29uc3QgbG9jYWxlJiBsb2MgKQoreworIyBpZm5kZWYgX1NUTFBfTk9fV0NIQVJfVAorICBDUFBVTklUX0FTU0VSVCggaGFzX2ZhY2V0PGN0eXBlPHdjaGFyX3Q+ID4obG9jKSApOworICBjdHlwZTx3Y2hhcl90PiBjb25zdCYgd2N0ID0gdXNlX2ZhY2V0PGN0eXBlPHdjaGFyX3Q+ID4obG9jKTsKKyAgLy9pcworICB7CisgICAgQ1BQVU5JVF9DSEVDSyggd2N0LmlzKGN0eXBlX2Jhc2U6OmRpZ2l0LCBMJzAnKSApOworICAgIENQUFVOSVRfQ0hFQ0soIHdjdC5pcyhjdHlwZV9iYXNlOjp1cHBlciwgTCdBJykgKTsKKyAgICBDUFBVTklUX0NIRUNLKCB3Y3QuaXMoY3R5cGVfYmFzZTo6bG93ZXIsIEwnYScpICk7CisgICAgQ1BQVU5JVF9DSEVDSyggd2N0LmlzKGN0eXBlX2Jhc2U6OmFscGhhLCBMJ0EnKSApOworICAgIENQUFVOSVRfQ0hFQ0soIHdjdC5pcyhjdHlwZV9iYXNlOjpzcGFjZSwgTCcgJykgKTsKKyAgICBDUFBVTklUX0NIRUNLKCAhd2N0LmlzKGN0eXBlX2Jhc2U6OnNwYWNlLCBMJzInKSApOworICAgIENQUFVOSVRfQ0hFQ0soIHdjdC5pcyhjdHlwZV9iYXNlOjpwdW5jdCwgTCcuJykgKTsKKyAgICBDUFBVTklUX0NIRUNLKCB3Y3QuaXMoY3R5cGVfYmFzZTo6eGRpZ2l0LCBMJ2EnKSApOworICB9CisKKyAgLy9pcyByYW5nZQorICB7CisgICAgd2NoYXJfdCB2YWx1ZXNbXSA9IEwiMEFhIC4iOworICAgIGN0eXBlX2Jhc2U6Om1hc2sgcmVzW3NpemVvZih2YWx1ZXMpIC8gc2l6ZW9mKHdjaGFyX3QpXTsKKyAgICB3Y3QuaXModmFsdWVzLCB2YWx1ZXMgKyAoc2l6ZW9mKHZhbHVlcykgLyBzaXplb2Yod2NoYXJfdCkpLCByZXMpOworICAgIC8vICcwJworICAgIENQUFVOSVRfQ0hFQ0soIChyZXNbMF0gJiBjdHlwZV9iYXNlOjpwcmludCkgIT0gMCApOworICAgIENQUFVOSVRfQ0hFQ0soIChyZXNbMF0gJiBjdHlwZV9iYXNlOjpkaWdpdCkgIT0gMCApOworICAgIENQUFVOSVRfQ0hFQ0soIChyZXNbMF0gJiBjdHlwZV9iYXNlOjp4ZGlnaXQpICE9IDAgKTsKKyAgICAvLyAnQScKKyAgICBDUFBVTklUX0NIRUNLKCAocmVzWzFdICYgY3R5cGVfYmFzZTo6cHJpbnQpICE9IDAgKTsKKyAgICBDUFBVTklUX0NIRUNLKCAocmVzWzFdICYgY3R5cGVfYmFzZTo6YWxwaGEpICE9IDAgKTsKKyAgICBDUFBVTklUX0NIRUNLKCAocmVzWzFdICYgY3R5cGVfYmFzZTo6eGRpZ2l0KSAhPSAwICk7CisgICAgQ1BQVU5JVF9DSEVDSyggKHJlc1sxXSAmIGN0eXBlX2Jhc2U6OnVwcGVyKSAhPSAwICk7CisgICAgLy8gJ2EnCisgICAgQ1BQVU5JVF9DSEVDSyggKHJlc1syXSAmIGN0eXBlX2Jhc2U6OnByaW50KSAhPSAwICk7CisgICAgQ1BQVU5JVF9DSEVDSyggKHJlc1syXSAmIGN0eXBlX2Jhc2U6OmFscGhhKSAhPSAwICk7CisgICAgQ1BQVU5JVF9DSEVDSyggKHJlc1syXSAmIGN0eXBlX2Jhc2U6OnhkaWdpdCkgIT0gMCApOworICAgIENQUFVOSVRfQ0hFQ0soIChyZXNbMl0gJiBjdHlwZV9iYXNlOjpsb3dlcikgIT0gMCApOworICAgIENQUFVOSVRfQ0hFQ0soIChyZXNbMl0gJiBjdHlwZV9iYXNlOjpzcGFjZSkgPT0gMCApOworICAgIC8vICcgJworICAgIENQUFVOSVRfQ0hFQ0soIChyZXNbM10gJiBjdHlwZV9iYXNlOjpwcmludCkgIT0gMCApOworICAgIENQUFVOSVRfQ0hFQ0soIChyZXNbM10gJiBjdHlwZV9iYXNlOjpzcGFjZSkgIT0gMCApOworICAgIENQUFVOSVRfQ0hFQ0soIChyZXNbM10gJiBjdHlwZV9iYXNlOjpkaWdpdCkgPT0gMCApOworICAgIC8vICcuJworICAgIENQUFVOSVRfQ0hFQ0soIChyZXNbNF0gJiBjdHlwZV9iYXNlOjpwcmludCkgIT0gMCApOworICAgIENQUFVOSVRfQ0hFQ0soIChyZXNbNF0gJiBjdHlwZV9iYXNlOjpwdW5jdCkgIT0gMCApOworICAgIENQUFVOSVRfQ0hFQ0soIChyZXNbNF0gJiBjdHlwZV9iYXNlOjpkaWdpdCkgPT0gMCApOworICB9CisKKyAgLy9zY2FuX2lzCisgIHsKKyAgICB3Y2hhcl90IHJhbmdlW10gPSBMImFiQWMxMjMgLiI7CisgICAgY29uc3Qgd2NoYXJfdCAqcmJlZyA9IHJhbmdlOworICAgIGNvbnN0IHdjaGFyX3QgKnJlbmQgPSByYW5nZSArIChzaXplb2YocmFuZ2UpIC8gc2l6ZW9mKHdjaGFyX3QpKTsKKworICAgIGNvbnN0IHdjaGFyX3QgKnJlczsKKyAgICByZXMgPSB3Y3Quc2Nhbl9pcygoY3R5cGVfYmFzZTo6bWFzaykoY3R5cGVfYmFzZTo6YWxwaGEgfCBjdHlwZV9iYXNlOjpsb3dlciksIHJiZWcsIHJlbmQpOworICAgIENQUFVOSVRfQ0hFQ0soIHJlcyAhPSByZW5kICk7CisgICAgQ1BQVU5JVF9DSEVDSyggKnJlcyA9PSBMJ2EnICk7CisKKyAgICByZXMgPSB3Y3Quc2Nhbl9pcyhjdHlwZV9iYXNlOjp1cHBlciwgcmJlZywgcmVuZCk7CisgICAgQ1BQVU5JVF9DSEVDSyggcmVzICE9IHJlbmQgKTsKKyAgICBDUFBVTklUX0NIRUNLKCAqcmVzID09IEwnQScgKTsKKworICAgIHJlcyA9IHdjdC5zY2FuX2lzKGN0eXBlX2Jhc2U6OnB1bmN0LCByYmVnLCByZW5kKTsKKyAgICBDUFBVTklUX0NIRUNLKCByZXMgIT0gcmVuZCApOworICAgIENQUFVOSVRfQ0hFQ0soICpyZXMgPT0gTCcuJyApOworICB9CisKKyAgLy9zY2FuX25vdAorICB7CisgICAgd2NoYXJfdCByYW5nZVtdID0gTCJhYkFjMTIzIC4iOworICAgIGNvbnN0IHdjaGFyX3QgKnJiZWcgPSByYW5nZTsKKyAgICBjb25zdCB3Y2hhcl90ICpyZW5kID0gcmFuZ2UgKyAoc2l6ZW9mKHJhbmdlKSAvIHNpemVvZih3Y2hhcl90KSk7CisKKyAgICBjb25zdCB3Y2hhcl90ICpyZXM7CisgICAgcmVzID0gd2N0LnNjYW5fbm90KChjdHlwZV9iYXNlOjptYXNrKShjdHlwZV9iYXNlOjphbHBoYSB8IGN0eXBlX2Jhc2U6Omxvd2VyKSwgcmJlZywgcmVuZCk7CisgICAgQ1BQVU5JVF9DSEVDSyggcmVzICE9IHJlbmQgKTsKKyAgICBDUFBVTklUX0NIRUNLKCAqcmVzID09IEwnMScgKTsKKworICAgIHJlcyA9IHdjdC5zY2FuX25vdChjdHlwZV9iYXNlOjphbHBoYSwgcmJlZywgcmVuZCk7CisgICAgQ1BQVU5JVF9DSEVDSyggcmVzICE9IHJlbmQgKTsKKyAgICBDUFBVTklUX0NIRUNLKCAqcmVzID09IEwnMScgKTsKKworICAgIHJlcyA9IHdjdC5zY2FuX25vdChjdHlwZV9iYXNlOjpwdW5jdCwgcmJlZywgcmVuZCk7CisgICAgQ1BQVU5JVF9DSEVDSyggcmVzICE9IHJlbmQgKTsKKyAgICBDUFBVTklUX0NIRUNLKCAqcmVzID09IEwnYScgKTsKKyAgfQorCisgIC8vdG91cHBlcgorICB7CisgICAgQ1BQVU5JVF9DSEVDSyggd2N0LnRvdXBwZXIoTCdhJykgPT0gTCdBJyApOworICAgIENQUFVOSVRfQ0hFQ0soIHdjdC50b3VwcGVyKEwnQScpID09IEwnQScgKTsKKyAgICBDUFBVTklUX0NIRUNLKCB3Y3QudG91cHBlcihMJzEnKSA9PSBMJzEnICk7CisgIH0KKworICAvL3RvdXBwZXIgcmFuZ2UKKyAgeworICAgIHdjaGFyX3QgcmFuZ2VbXSA9IEwiYWJBYzEiOworICAgIHdjaGFyX3QgZXhwZWN0ZWRfcmFuZ2VbXSA9IEwiQUJBQzEiOworICAgIHdjdC50b3VwcGVyKHJhbmdlLCByYW5nZSArIHNpemVvZihyYW5nZSkgLyBzaXplb2Yod2NoYXJfdCkpOworICAgIENQUFVOSVRfQ0hFQ0soIGVxdWFsKHJhbmdlLCByYW5nZSArIHNpemVvZihyYW5nZSkgLyBzaXplb2Yod2NoYXJfdCksIGV4cGVjdGVkX3JhbmdlKSApOworICB9CisKKyAgLy90b2xvd2VyCisgIHsKKyAgICBDUFBVTklUX0NIRUNLKCB3Y3QudG9sb3dlcihMJ0EnKSA9PSBMJ2EnICk7CisgICAgQ1BQVU5JVF9DSEVDSyggd2N0LnRvbG93ZXIoTCdhJykgPT0gTCdhJyApOworICAgIENQUFVOSVRfQ0hFQ0soIHdjdC50b2xvd2VyKEwnMScpID09IEwnMScgKTsKKyAgfQorCisgIC8vdG9sb3dlciByYW5nZQorICB7CisgICAgd2NoYXJfdCByYW5nZVtdID0gTCJBQmFDMSI7CisgICAgd2NoYXJfdCBleHBlY3RlZF9yYW5nZVtdID0gTCJhYmFjMSI7CisgICAgd2N0LnRvbG93ZXIocmFuZ2UsIHJhbmdlICsgc2l6ZW9mKHJhbmdlKSAvIHNpemVvZih3Y2hhcl90KSk7CisgICAgQ1BQVU5JVF9DSEVDSyggZXF1YWwocmFuZ2UsIHJhbmdlICsgc2l6ZW9mKHJhbmdlKSAvIHNpemVvZih3Y2hhcl90KSwgZXhwZWN0ZWRfcmFuZ2UpICk7CisgIH0KKworICAvL3dpZGVuCisgIHsKKyAgICBDUFBVTklUX0NIRUNLKCB3Y3Qud2lkZW4oJ2EnKSA9PSBMJ2EnICk7CisgIH0KKworICAvL3dpZGVuIHJhbmdlCisgIHsKKyAgICBjaGFyIHJhbmdlW10gPSAiQUJhQzEiOworICAgIHdjaGFyX3QgcmVzW3NpemVvZihyYW5nZSldOworICAgIHdjaGFyX3QgZXhwZWN0ZWRfcmVzW10gPSBMIkFCYUMxIjsKKyAgICB3Y3Qud2lkZW4ocmFuZ2UsIHJhbmdlICsgc2l6ZW9mKHJhbmdlKSwgcmVzKTsKKyAgICBDUFBVTklUX0NIRUNLKCBlcXVhbChleHBlY3RlZF9yZXMsIGV4cGVjdGVkX3JlcyArIHNpemVvZihyYW5nZSksIHJlcykgKTsKKyAgfQorCisgIC8vbmFycm93CisgIHsKKyAgICBDUFBVTklUX0NIRUNLKCB3Y3QubmFycm93KEwnYScsICdiJykgPT0gTCdhJyApOworICB9CisKKyAgLy9uYXJyb3cgcmFuZ2UKKyAgeworICAgIHdjaGFyX3QgcmFuZ2VbXSA9IEwiQUJhQzEiOworICAgIGNoYXIgcmVzW3NpemVvZihyYW5nZSkgLyBzaXplb2Yod2NoYXJfdCldOworICAgIGNoYXIgZXhwZWN0ZWRfcmVzW10gPSAiQUJhQzEiOworICAgIHdjdC5uYXJyb3cocmFuZ2UsIHJhbmdlICsgc2l6ZW9mKHJhbmdlKSAvIHNpemVvZih3Y2hhcl90KSwgJ2InLCByZXMpOworICAgIENQUFVOSVRfQ0hFQ0soIGVxdWFsKGV4cGVjdGVkX3JlcywgZXhwZWN0ZWRfcmVzICsgc2l6ZW9mKHJhbmdlKSAvIHNpemVvZih3Y2hhcl90KSwgcmVzKSApOworICB9CisjIGVuZGlmCit9CisKKwordHlwZWRlZiB2b2lkIChMb2NhbGVUZXN0OjoqX1Rlc3QpIChjb25zdCBsb2NhbGUmKTsKK3N0YXRpYyB2b2lkIHRlc3Rfc3VwcG9ydGVkX2xvY2FsZShMb2NhbGVUZXN0JiBpbnN0LCBfVGVzdCBfX3Rlc3QpIHsKKyAgc2l6ZV90IG4gPSBzaXplb2YodGVzdGVkX2xvY2FsZXMpIC8gc2l6ZW9mKHRlc3RlZF9sb2NhbGVzWzBdKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuOyArK2kpIHsKKyAgICBsb2NhbGUgbG9jOworIyAgaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IGRlZmluZWQgKF9TVExQX1VTRV9FWENFUFRJT05TKQorICAgIHRyeQorIyAgZW5kaWYKKyAgICB7CisgICAgICBsb2NhbGUgdG1wKHRlc3RlZF9sb2NhbGVzW2ldKTsKKyAgICAgIGxvYyA9IHRtcDsKKyAgICB9CisjICBpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZCAoX1NUTFBfVVNFX0VYQ0VQVElPTlMpCisgICAgY2F0Y2ggKHJ1bnRpbWVfZXJyb3IgY29uc3QmKSB7CisgICAgICAvL1RoaXMgbG9jYWxlIGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgICBjb250aW51ZTsKKyAgICB9CisjICBlbmRpZgorCisgICAgQ1BQVU5JVF9NRVNTQUdFKCBsb2MubmFtZSgpLmNfc3RyKCkgKTsKKyAgICAoaW5zdC4qX190ZXN0KShsb2MpOworCisgICAgeworICAgICAgbG9jYWxlIHRtcChsb2NhbGU6OmNsYXNzaWMoKSwgdGVzdGVkX2xvY2FsZXNbaV0sIGxvY2FsZTo6Y3R5cGUpOworICAgICAgbG9jID0gdG1wOworICAgIH0KKyAgICAoaW5zdC4qX190ZXN0KShsb2MpOworCisgICAgeworICAgICAgbG9jYWxlIHRtcChsb2NhbGU6OmNsYXNzaWMoKSwgbmV3IGN0eXBlX2J5bmFtZTxjaGFyPih0ZXN0ZWRfbG9jYWxlc1tpXSkpOworI2lmbmRlZiBfU1RMUF9OT19XQ0hBUl9UCisgICAgICBsb2NhbGUgdG1wMCh0bXAsIG5ldyBjdHlwZV9ieW5hbWU8d2NoYXJfdD4odGVzdGVkX2xvY2FsZXNbaV0pKTsKKyAgICAgIHRtcCA9IHRtcDA7CisjZW5kaWYKKyAgICAgIGxvYyA9IHRtcDsKKyAgICB9CisgICAgKGluc3QuKl9fdGVzdCkobG9jKTsKKyAgfQorfQorCit2b2lkIExvY2FsZVRlc3Q6OmN0eXBlX2ZhY2V0KCkKK3sKKyAgdGVzdF9zdXBwb3J0ZWRfbG9jYWxlKCp0aGlzLCAmTG9jYWxlVGVzdDo6X2N0eXBlX2ZhY2V0KTsKKyNpZm5kZWYgX1NUTFBfTk9fV0NIQVJfVAorICB0ZXN0X3N1cHBvcnRlZF9sb2NhbGUoKnRoaXMsICZMb2NhbGVUZXN0OjpfY3R5cGVfZmFjZXRfdyk7CisjZW5kaWYKK30KKwordm9pZCBMb2NhbGVUZXN0OjpjdHlwZV9ieV9uYW1lKCkKK3sKKyAgLyoKKyAgICogQ2hlY2sgb2YgdGhlIDIyLjEuMS4yLjcgc3RhbmRhcmQgcG9pbnQuIENvbnN0cnVjdGlvbiBvZiBhIGxvY2FsZQorICAgKiBpbnN0YW5jZSBmcm9tIGEgbnVsbCBwb2ludGVyIG9yIGFuIHVua25vd24gbmFtZSBzaG91bGQgcmVzdWx0IGluCisgICAqIGEgcnVudGltZV9lcnJvciBleGNlcHRpb24uCisgICAqLworIyAgaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IGRlZmluZWQgKF9TVExQX1VTRV9FWENFUFRJT05TKQorIyAgICBpZiAgZGVmaW5lZCAoU1RMUE9SVCkgfHwgKCFkZWZpbmVkKF9fR05VQ19fKSAmJiAoIWRlZmluZWQgKF9NU0NfVkVSKSB8fCAoX01TQ19WRVIgPiAxNDAwKSkpCisgICAvLyBsaWJzdGRjKysgY2FsbCBmcmVlbG9jYXRlIG9uIGJhZCBsb2NhbGUKKyAgdHJ5IHsKKyAgICBsb2NhbGUgbG9jKGxvY2FsZTo6Y2xhc3NpYygpLCBuZXcgY3R5cGVfYnluYW1lPGNoYXI+KHN0YXRpY19jYXN0PGNoYXIgY29uc3QqPigwKSkpOworICAgIENQUFVOSVRfQVNTRVJUKCBmYWxzZSApOworICB9CisgIGNhdGNoIChydW50aW1lX2Vycm9yIGNvbnN0JiAvKiBlICovKSB7CisgICAgLy9DUFBVTklUX01FU1NBR0UoIGUud2hhdCgpICk7CisgIH0KKyAgY2F0Y2ggKC4uLikgeworICAgIENQUFVOSVRfQVNTRVJUKCBmYWxzZSApOworICB9CisjICAgIGVuZGlmCisKKyAgdHJ5IHsKKyAgICBsb2NhbGUgbG9jKGxvY2FsZTo6Y2xhc3NpYygpLCBuZXcgY3R5cGVfYnluYW1lPGNoYXI+KCJ5YXNsaV9sYW5ndWFnZSIpKTsKKyAgICBDUFBVTklUX0ZBSUw7CisgIH0KKyAgY2F0Y2ggKHJ1bnRpbWVfZXJyb3IgY29uc3QmIC8qIGUgKi8pIHsKKyAgICAvL0NQUFVOSVRfTUVTU0FHRSggZS53aGF0KCkgKTsKKyAgfQorICBjYXRjaCAoLi4uKSB7CisgICAgQ1BQVU5JVF9GQUlMOworICB9CisKKyMgICAgaWYgIGRlZmluZWQoU1RMUE9SVCkgfHwgIWRlZmluZWQoX19HTlVDX18pCisgIHRyeSB7CisgICAgbG9jYWxlIGxvYyhsb2NhbGU6OmNsYXNzaWMoKSwgbmV3IGNvZGVjdnRfYnluYW1lPGNoYXIsIGNoYXIsIG1ic3RhdGVfdD4oc3RhdGljX2Nhc3Q8Y2hhciBjb25zdCo+KDApKSk7CisgICAgQ1BQVU5JVF9GQUlMOworICB9CisgIGNhdGNoIChydW50aW1lX2Vycm9yIGNvbnN0JiAvKiBlICovKSB7CisgICAgLy9DUFBVTklUX01FU1NBR0UoIGUud2hhdCgpICk7CisgIH0KKyAgY2F0Y2ggKC4uLikgeworICAgIENQUFVOSVRfRkFJTDsKKyAgfQorIyAgICBlbmRpZgorCisgIHRyeSB7CisgICAgbG9jYWxlIGxvYyhsb2NhbGU6OmNsYXNzaWMoKSwgbmV3IGNvZGVjdnRfYnluYW1lPGNoYXIsIGNoYXIsIG1ic3RhdGVfdD4oInlhc2xpX2xhbmd1YWdlIikpOworICAgIC8vU1RMcG9ydCBpbXBsZW1lbnRhdGlvbiBkbyBub3QgY2FyZSBhYm91dCBuYW1lIHBhc3MgdG8gdGhpcyBmYWNldC4KKyMgICAgaWYgIWRlZmluZWQgKFNUTFBPUlQpCisgICAgQ1BQVU5JVF9GQUlMOworIyAgICBlbmRpZgorICB9CisgIGNhdGNoIChydW50aW1lX2Vycm9yIGNvbnN0JiAvKiBlICovKSB7CisgICAgLy9DUFBVTklUX01FU1NBR0UoIGUud2hhdCgpICk7CisgIH0KKyAgY2F0Y2ggKC4uLikgeworICAgIENQUFVOSVRfRkFJTDsKKyAgfQorCisgIHRyeSB7CisgICAgbG9jYWxlIGxvYyhsb2NhbGU6OmNsYXNzaWMoKSwgbmV3IGN0eXBlX2J5bmFtZTxjaGFyPigiZnJfRlIiKSk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGhhc19mYWNldDxjdHlwZTxjaGFyPiA+KGxvYykgKTsKKyAgICBjdHlwZTxjaGFyPiBjb25zdCYgY3QgPSB1c2VfZmFjZXQ8Y3R5cGU8Y2hhcj4gPihsb2MpOworICAgIENQUFVOSVRfQVNTRVJUKCBjdC5pcyhjdHlwZV9iYXNlOjptYXNrKGN0eXBlX2Jhc2U6OnByaW50IHwgY3R5cGVfYmFzZTo6bG93ZXIgfCBjdHlwZV9iYXNlOjphbHBoYSksICfnJykgKTsKKyAgfQorICBjYXRjaCAocnVudGltZV9lcnJvciBjb25zdCYgLyogZSAqLykgeworICAgIC8vQ1BQVU5JVF9NRVNTQUdFKCBlLndoYXQoKSApOworICB9CisgIGNhdGNoICguLi4pIHsKKyAgICBDUFBVTklUX0ZBSUw7CisgIH0KKworICB0cnkgeworICAgIGxvY2FsZSBsb2MobG9jYWxlOjpjbGFzc2ljKCksIG5ldyBjdHlwZV9ieW5hbWU8Y2hhcj4oIkMiKSk7CisgICAgY3R5cGU8Y2hhcj4gY29uc3QmIGNmYWNldF9ieW5hbWUgPSB1c2VfZmFjZXQ8Y3R5cGU8Y2hhcj4gPihsb2MpOworICAgIGN0eXBlPGNoYXI+IGNvbnN0JiBjZmFjZXQgPSB1c2VfZmFjZXQ8Y3R5cGU8Y2hhcj4gPihsb2NhbGU6OmNsYXNzaWMoKSk7CisKKyAgICBmb3IgKGNoYXIgYyA9IDA7OyArK2MpIHsKKyAgICAgIENQUFVOSVRfQ0hFQ0soY2ZhY2V0X2J5bmFtZS5pcyhjdHlwZV9iYXNlOjpzcGFjZSwgYykgPT0gY2ZhY2V0LmlzKGN0eXBlX2Jhc2U6OnNwYWNlLCBjKSk7CisgICAgICBpZiAoY2ZhY2V0X2J5bmFtZS5pcyhjdHlwZV9iYXNlOjpwcmludCwgYykgIT0gY2ZhY2V0LmlzKGN0eXBlX2Jhc2U6OnByaW50LCBjKSkKKyAgICAgIHsKKyAgICAgICAgQ1BQVU5JVF9DSEVDSyhjZmFjZXRfYnluYW1lLmlzKGN0eXBlX2Jhc2U6OnByaW50LCBjKSA9PSBjZmFjZXQuaXMoY3R5cGVfYmFzZTo6cHJpbnQsIGMpKTsKKyAgICAgIH0KKyAgICAgIENQUFVOSVRfQ0hFQ0soY2ZhY2V0X2J5bmFtZS5pcyhjdHlwZV9iYXNlOjpjbnRybCwgYykgPT0gY2ZhY2V0LmlzKGN0eXBlX2Jhc2U6OmNudHJsLCBjKSk7CisgICAgICBDUFBVTklUX0NIRUNLKGNmYWNldF9ieW5hbWUuaXMoY3R5cGVfYmFzZTo6dXBwZXIsIGMpID09IGNmYWNldC5pcyhjdHlwZV9iYXNlOjp1cHBlciwgYykpOworICAgICAgQ1BQVU5JVF9DSEVDSyhjZmFjZXRfYnluYW1lLmlzKGN0eXBlX2Jhc2U6Omxvd2VyLCBjKSA9PSBjZmFjZXQuaXMoY3R5cGVfYmFzZTo6bG93ZXIsIGMpKTsKKyAgICAgIENQUFVOSVRfQ0hFQ0soY2ZhY2V0X2J5bmFtZS5pcyhjdHlwZV9iYXNlOjphbHBoYSwgYykgPT0gY2ZhY2V0LmlzKGN0eXBlX2Jhc2U6OmFscGhhLCBjKSk7CisgICAgICBDUFBVTklUX0NIRUNLKGNmYWNldF9ieW5hbWUuaXMoY3R5cGVfYmFzZTo6ZGlnaXQsIGMpID09IGNmYWNldC5pcyhjdHlwZV9iYXNlOjpkaWdpdCwgYykpOworICAgICAgQ1BQVU5JVF9DSEVDSyhjZmFjZXRfYnluYW1lLmlzKGN0eXBlX2Jhc2U6OnB1bmN0LCBjKSA9PSBjZmFjZXQuaXMoY3R5cGVfYmFzZTo6cHVuY3QsIGMpKTsKKyAgICAgIENQUFVOSVRfQ0hFQ0soY2ZhY2V0X2J5bmFtZS5pcyhjdHlwZV9iYXNlOjp4ZGlnaXQsIGMpID09IGNmYWNldC5pcyhjdHlwZV9iYXNlOjp4ZGlnaXQsIGMpKTsKKyAgICAgIENQUFVOSVRfQ0hFQ0soY2ZhY2V0X2J5bmFtZS5pcyhjdHlwZV9iYXNlOjphbG51bSwgYykgPT0gY2ZhY2V0LmlzKGN0eXBlX2Jhc2U6OmFsbnVtLCBjKSk7CisgICAgICBDUFBVTklUX0NIRUNLKGNmYWNldF9ieW5hbWUuaXMoY3R5cGVfYmFzZTo6Z3JhcGgsIGMpID09IGNmYWNldC5pcyhjdHlwZV9iYXNlOjpncmFwaCwgYykpOworICAgICAgaWYgKGMgPT0gMTI3KSBicmVhazsKKyAgICB9CisgIH0KKyAgY2F0Y2ggKHJ1bnRpbWVfZXJyb3IgY29uc3QmIC8qIGUgKi8pIHsKKyAgICAvKiBDUFBVTklUX01FU1NBR0UoIGUud2hhdCgpICk7ICovCisgICAgQ1BQVU5JVF9GQUlMOworICB9CisgIGNhdGNoICguLi4pIHsKKyAgICBDUFBVTklUX0ZBSUw7CisgIH0KKworIyAgICBpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgIWRlZmluZWQgKF9TVExQX05PX1dDSEFSX1QpCisjICAgICAgaWYgIGRlZmluZWQoU1RMUE9SVCkgfHwgIWRlZmluZWQoX19HTlVDX18pCisgIHRyeSB7CisgICAgbG9jYWxlIGxvYyhsb2NhbGU6OmNsYXNzaWMoKSwgbmV3IGN0eXBlX2J5bmFtZTx3Y2hhcl90PihzdGF0aWNfY2FzdDxjaGFyIGNvbnN0Kj4oMCkpKTsKKyAgICBDUFBVTklUX0ZBSUw7CisgIH0KKyAgY2F0Y2ggKHJ1bnRpbWVfZXJyb3IgY29uc3QmKSB7CisgIH0KKyAgY2F0Y2ggKC4uLikgeworICAgIENQUFVOSVRfRkFJTDsKKyAgfQorIyAgICAgIGVuZGlmCisKKyAgdHJ5IHsKKyAgICBsb2NhbGUgbG9jKGxvY2FsZTo6Y2xhc3NpYygpLCBuZXcgY3R5cGVfYnluYW1lPHdjaGFyX3Q+KCJ5YXNsaV9sYW5ndWFnZSIpKTsKKyAgICBDUFBVTklUX0ZBSUw7CisgIH0KKyAgY2F0Y2ggKHJ1bnRpbWVfZXJyb3IgY29uc3QmKSB7CisgIH0KKyAgY2F0Y2ggKC4uLikgeworICAgIENQUFVOSVRfRkFJTDsKKyAgfQorCisjICAgICAgaWYgIGRlZmluZWQoU1RMUE9SVCkgfHwgIWRlZmluZWQoX19HTlVDX18pCisgIHRyeSB7CisgICAgbG9jYWxlIGxvYyhsb2NhbGU6OmNsYXNzaWMoKSwgbmV3IGNvZGVjdnRfYnluYW1lPHdjaGFyX3QsIGNoYXIsIG1ic3RhdGVfdD4oc3RhdGljX2Nhc3Q8Y2hhciBjb25zdCo+KDApKSk7CisgICAgQ1BQVU5JVF9GQUlMOworICB9CisgIGNhdGNoIChydW50aW1lX2Vycm9yIGNvbnN0JiAvKiBlICovKSB7CisgICAgLy9DUFBVTklUX01FU1NBR0UoIGUud2hhdCgpICk7CisgIH0KKyAgY2F0Y2ggKC4uLikgeworICAgIENQUFVOSVRfRkFJTDsKKyAgfQorIyAgICAgIGVuZGlmCisKKyAgdHJ5IHsKKyAgICBsb2NhbGUgbG9jKGxvY2FsZTo6Y2xhc3NpYygpLCBuZXcgY29kZWN2dF9ieW5hbWU8d2NoYXJfdCwgY2hhciwgbWJzdGF0ZV90PigieWFzbGlfbGFuZ3VhZ2UiKSk7CisgICAgQ1BQVU5JVF9GQUlMOworICB9CisgIGNhdGNoIChydW50aW1lX2Vycm9yIGNvbnN0JiAvKiBlICovKSB7CisgICAgLy9DUFBVTklUX01FU1NBR0UoIGUud2hhdCgpICk7CisgIH0KKyAgY2F0Y2ggKC4uLikgeworICAgIENQUFVOSVRfRkFJTDsKKyAgfQorIyAgICBlbmRpZgorIyAgZW5kaWYKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvY3R5cGVfaGVhZGVyX3Rlc3QuYyBiL3Rlc3QvdW5pdC9jdHlwZV9oZWFkZXJfdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZDlmYTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvY3R5cGVfaGVhZGVyX3Rlc3QuYwpAQCAtMCwwICsxLDggQEAKKy8qIFRoaXMgdGVzdCBwdXJwb3NlIGlzIHNpbXBseSB0byBjaGVjayBTdGFuZGFyZCBoZWFkZXIgaW5kZXBlbmRhbmN5IHRoYXQKKyAqIGlzIHRvIHNheSB0aGF0IHRoZSBoZWFkZXIgY2FuIGJlIGluY2x1ZGVkIGFsb25lIHdpdGhvdXQgYW55IHByZXZpb3VzCisgKiBpbmNsdWRlLgorICogQWRkaXRpb25uYWx5LCBmb3IgQyBTdGFuZGFyZCBoZWFkZXJzIHRoYXQgU1RMcG9ydCBleHBvc2UsIGl0IGNhbiBhbHNvIGJlCisgKiB1c2VkIHRvIGNoZWNrIHRoYXQgZmlsZXMgaW5jbHVkZWQgYnkgdGhvc2UgaGVhZGVycyBhcmUgY29tcGF0aWJsZSB3aXRoCisgKiBwdXJlIEMgY29tcGlsZXJzLgorICovCisjaW5jbHVkZSA8Y3R5cGUuaD4KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9jd2NoYXJfaGVhZGVyX3Rlc3QuY3BwIGIvdGVzdC91bml0L2N3Y2hhcl9oZWFkZXJfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E2MzM5MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9jd2NoYXJfaGVhZGVyX3Rlc3QuY3BwCkBAIC0wLDAgKzEsOCBAQAorLyogVGhpcyB0ZXN0IHB1cnBvc2UgaXMgc2ltcGx5IHRvIGNoZWNrIFN0YW5kYXJkIGhlYWRlciBpbmRlcGVuZGFuY3kgdGhhdAorICogaXMgdG8gc2F5IHRoYXQgdGhlIGhlYWRlciBjYW4gYmUgaW5jbHVkZWQgYWxvbmUgd2l0aG91dCBhbnkgcHJldmlvdXMKKyAqIGluY2x1ZGUuCisgKiBBZGRpdGlvbm5hbHksIGZvciBDIFN0YW5kYXJkIGhlYWRlcnMgdGhhdCBTVExwb3J0IGV4cG9zZSwgaXQgY2FuIGFsc28gYmUKKyAqIHVzZWQgdG8gY2hlY2sgdGhhdCBmaWxlcyBpbmNsdWRlZCBieSB0aG9zZSBoZWFkZXJzIGFyZSBjb21wYXRpYmxlIHdpdGgKKyAqIHB1cmUgQyBjb21waWxlcnMuCisgKi8KKyNpbmNsdWRlIDxjd2NoYXI+CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvY3djdHlwZV9oZWFkZXJfdGVzdC5jcHAgYi90ZXN0L3VuaXQvY3djdHlwZV9oZWFkZXJfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc0NmI4MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9jd2N0eXBlX2hlYWRlcl90ZXN0LmNwcApAQCAtMCwwICsxLDggQEAKKy8qIFRoaXMgdGVzdCBwdXJwb3NlIGlzIHNpbXBseSB0byBjaGVjayBTdGFuZGFyZCBoZWFkZXIgaW5kZXBlbmRhbmN5IHRoYXQKKyAqIGlzIHRvIHNheSB0aGF0IHRoZSBoZWFkZXIgY2FuIGJlIGluY2x1ZGVkIGFsb25lIHdpdGhvdXQgYW55IHByZXZpb3VzCisgKiBpbmNsdWRlLgorICogQWRkaXRpb25uYWx5LCBmb3IgQyBTdGFuZGFyZCBoZWFkZXJzIHRoYXQgU1RMcG9ydCBleHBvc2UsIGl0IGNhbiBhbHNvIGJlCisgKiB1c2VkIHRvIGNoZWNrIHRoYXQgZmlsZXMgaW5jbHVkZWQgYnkgdGhvc2UgaGVhZGVycyBhcmUgY29tcGF0aWJsZSB3aXRoCisgKiBwdXJlIEMgY29tcGlsZXJzLgorICovCisjaW5jbHVkZSA8Y3djdHlwZT4KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9kZXF1ZV9oZWFkZXJfdGVzdC5jcHAgYi90ZXN0L3VuaXQvZGVxdWVfaGVhZGVyX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NDU5NDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvZGVxdWVfaGVhZGVyX3Rlc3QuY3BwCkBAIC0wLDAgKzEsOCBAQAorLyogVGhpcyB0ZXN0IHB1cnBvc2UgaXMgc2ltcGx5IHRvIGNoZWNrIFN0YW5kYXJkIGhlYWRlciBpbmRlcGVuZGFuY3kgdGhhdAorICogaXMgdG8gc2F5IHRoYXQgdGhlIGhlYWRlciBjYW4gYmUgaW5jbHVkZWQgYWxvbmUgd2l0aG91dCBhbnkgcHJldmlvdXMKKyAqIGluY2x1ZGUuCisgKiBBZGRpdGlvbm5hbHksIGZvciBDIFN0YW5kYXJkIGhlYWRlcnMgdGhhdCBTVExwb3J0IGV4cG9zZSwgaXQgY2FuIGFsc28gYmUKKyAqIHVzZWQgdG8gY2hlY2sgdGhhdCBmaWxlcyBpbmNsdWRlZCBieSB0aG9zZSBoZWFkZXJzIGFyZSBjb21wYXRpYmxlIHdpdGgKKyAqIHB1cmUgQyBjb21waWxlcnMuCisgKi8KKyNpbmNsdWRlIDxkZXF1ZT4KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9kZXF1ZV90ZXN0LmNwcCBiL3Rlc3QvdW5pdC9kZXF1ZV90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmU3ZTAxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L2RlcXVlX3Rlc3QuY3BwCkBAIC0wLDAgKzEsMzMwIEBACisvL0hhcyB0byBiZSBmaXJzdCBmb3IgU3RhY2tBbGxvY2F0b3Igc3dhcCBvdmVybG9hZCB0byBiZSB0YWtlbgorLy9pbnRvIGFjY291bnQgKGF0IGxlYXN0IHVzaW5nIEdDQyA0LjAuMSkKKyNpbmNsdWRlICJzdGFja19hbGxvY2F0b3IuaCIKKworI2luY2x1ZGUgPGRlcXVlPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZCAoX1NUTFBfVVNFX0VYQ0VQVElPTlMpCisjIGluY2x1ZGUgPHN0ZGV4Y2VwdD4KKyNlbmRpZgorCisjaW5jbHVkZSAiY3BwdW5pdC9jcHB1bml0X3Byb3h5LmgiCisKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZChfU1RMUF9VU0VfTkFNRVNQQUNFUykKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisjZW5kaWYKKworLy8KKy8vIFRlc3RDYXNlIGNsYXNzCisvLworY2xhc3MgRGVxdWVUZXN0IDogcHVibGljIENQUFVOSVRfTlM6OlRlc3RDYXNlCit7CisgIENQUFVOSVRfVEVTVF9TVUlURShEZXF1ZVRlc3QpOworICBDUFBVTklUX1RFU1QoZGVxdWUxKTsKKyAgQ1BQVU5JVF9URVNUKGF0KTsKKyAgQ1BQVU5JVF9URVNUKGluc2VydCk7CisgIENQUFVOSVRfVEVTVChlcmFzZSk7CisgIENQUFVOSVRfVEVTVChhdXRvX3JlZik7CisgIENQUFVOSVRfVEVTVChhbGxvY2F0b3Jfd2l0aF9zdGF0ZSk7CisjaWYgZGVmaW5lZCAoU1RMUE9SVCkgJiYgZGVmaW5lZCAoX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFUykKKyAgQ1BQVU5JVF9JR05PUkU7CisjZW5kaWYKKyAgQ1BQVU5JVF9URVNUKG9wdGltaXphdGlvbnNfY2hlY2spOworICBDUFBVTklUX1RFU1RfU1VJVEVfRU5EKCk7CisKK3Byb3RlY3RlZDoKKyAgdm9pZCBkZXF1ZTEoKTsKKyAgdm9pZCBpbnNlcnQoKTsKKyAgdm9pZCBlcmFzZSgpOworICB2b2lkIGF0KCk7CisgIHZvaWQgYXV0b19yZWYoKTsKKyAgdm9pZCBhbGxvY2F0b3Jfd2l0aF9zdGF0ZSgpOworICB2b2lkIG9wdGltaXphdGlvbnNfY2hlY2soKTsKK307CisKK0NQUFVOSVRfVEVTVF9TVUlURV9SRUdJU1RSQVRJT04oRGVxdWVUZXN0KTsKKworLy8KKy8vIHRlc3RzIGltcGxlbWVudGF0aW9uCisvLwordm9pZCBEZXF1ZVRlc3Q6OmRlcXVlMSgpCit7CisgIGRlcXVlPGludD4gZDsKKyAgZC5wdXNoX2JhY2soNCk7CisgIGQucHVzaF9iYWNrKDkpOworICBkLnB1c2hfYmFjaygxNik7CisgIGQucHVzaF9mcm9udCgxKTsKKworICBDUFBVTklUX0FTU0VSVCggZFswXSA9PSAxICk7CisgIENQUFVOSVRfQVNTRVJUKCBkWzFdID09IDQgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIGRbMl0gPT0gOSApOworICBDUFBVTklUX0FTU0VSVCggZFszXSA9PSAxNiApOworCisgIGQucG9wX2Zyb250KCk7CisgIGRbMl0gPSAyNTsKKworICBDUFBVTklUX0FTU0VSVCggZFswXSA9PSA0ICk7CisgIENQUFVOSVRfQVNTRVJUKCBkWzFdID09IDkgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIGRbMl0gPT0gMjUgKTsKKworICAvL1NvbWUgY29tcGlsZSB0aW1lIHRlc3RzOgorICBkZXF1ZTxpbnQ+OjppdGVyYXRvciBkaXQgPSBkLmJlZ2luKCk7CisgIGRlcXVlPGludD46OmNvbnN0X2l0ZXJhdG9yIGNkaXQoZC5iZWdpbigpKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIChkaXQgLSBjZGl0KSA9PSAwICk7CisgIENQUFVOSVRfQVNTRVJUKCAoY2RpdCAtIGRpdCkgPT0gMCApOworICBDUFBVTklUX0FTU0VSVCggKGRpdCAtIGRpdCkgPT0gMCApOworICBDUFBVTklUX0FTU0VSVCggKGNkaXQgLSBjZGl0KSA9PSAwICk7CisgIENQUFVOSVRfQVNTRVJUKCEoKGRpdCA8IGNkaXQpIHx8IChkaXQgPiBjZGl0KSB8fCAoZGl0ICE9IGNkaXQpIHx8ICEoZGl0IDw9IGNkaXQpIHx8ICEoZGl0ID49IGNkaXQpKSk7Cit9CisKK3ZvaWQgRGVxdWVUZXN0OjppbnNlcnQoKQoreworICBkZXF1ZTxpbnQ+IGQ7CisgIGQucHVzaF9iYWNrKDApOworICBkLnB1c2hfYmFjaygxKTsKKyAgZC5wdXNoX2JhY2soMik7CisgIENQUFVOSVRfQVNTRVJUKCBkLnNpemUoKSA9PSAzICk7CisKKyAgZGVxdWU8aW50Pjo6aXRlcmF0b3IgZGl0OworCisgIC8vSW5zZXJ0aW9uIGJlZm9yZSBiZWdpbjoKKyAgZGl0ID0gZC5pbnNlcnQoZC5iZWdpbigpLCAzKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIGRpdCAhPSBkLmVuZCgpICk7CisgIENQUFVOSVRfQ0hFQ0soICpkaXQgPT0gMyApOworICBDUFBVTklUX0FTU0VSVCggZC5zaXplKCkgPT0gNCApOworICBDUFBVTklUX0FTU0VSVCggZFswXSA9PSAzICk7CisKKyAgLy9JbnNlcnRpb24gYWZ0ZXIgYmVnaW46CisgIGRpdCA9IGQuaW5zZXJ0KGQuYmVnaW4oKSArIDEsIDQpOworICBDUFBVTklUX0FTU0VSVCggZGl0ICE9IGQuZW5kKCkgKTsKKyAgQ1BQVU5JVF9DSEVDSyggKmRpdCA9PSA0ICk7CisgIENQUFVOSVRfQVNTRVJUKCBkLnNpemUoKSA9PSA1ICk7CisgIENQUFVOSVRfQVNTRVJUKCBkWzFdID09IDQgKTsKKworICAvL0luc2VydGlvbiBhdCBlbmQ6CisgIGRpdCA9IGQuaW5zZXJ0KGQuZW5kKCksIDUpOworICBDUFBVTklUX0FTU0VSVCggZGl0ICE9IGQuZW5kKCkgKTsKKyAgQ1BQVU5JVF9DSEVDSyggKmRpdCA9PSA1ICk7CisgIENQUFVOSVRfQVNTRVJUKCBkLnNpemUoKSA9PSA2ICk7CisgIENQUFVOSVRfQVNTRVJUKCBkWzVdID09IDUgKTsKKworICAvL0luc2VydGlvbiBiZWZvcmUgbGFzdCBlbGVtZW50OgorICBkaXQgPSBkLmluc2VydChkLmVuZCgpIC0gMSwgNik7CisgIENQUFVOSVRfQVNTRVJUKCBkaXQgIT0gZC5lbmQoKSApOworICBDUFBVTklUX0NIRUNLKCAqZGl0ID09IDYgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIGQuc2l6ZSgpID09IDcgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIGRbNV0gPT0gNiApOworCisgIC8vSW5zZXJ0aW9uIG9mIHNldmVyYWwgZWxlbWVudHMgYmVmb3JlIGJlZ2luCisgIGQuaW5zZXJ0KGQuYmVnaW4oKSwgMiwgNyk7CisgIENQUFVOSVRfQVNTRVJUKCBkLnNpemUoKSA9PSA5ICk7CisgIENQUFVOSVRfQVNTRVJUKCBkWzBdID09IDcgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIGRbMV0gPT0gNyApOworCisgIC8vSW5zZXJ0aW9uIG9mIHNldmVyYWwgZWxlbWVudHMgYWZ0ZXIgYmVnaW4KKyAgLy9UaGVyZSBpcyBtb3JlIGVsZW1lbnRzIHRvIGluc2VydCB0aGFuIGVsZW1lbnRzIGJlZm9yZSBpbnNlcnRpb24gcG9zaXRpb24KKyAgZC5pbnNlcnQoZC5iZWdpbigpICsgMSwgMiwgOCk7CisgIENQUFVOSVRfQVNTRVJUKCBkLnNpemUoKSA9PSAxMSApOworICBDUFBVTklUX0FTU0VSVCggZFsxXSA9PSA4ICk7CisgIENQUFVOSVRfQVNTRVJUKCBkWzJdID09IDggKTsKKworICAvL1RoZXJlIGlzIGxlc3MgZWxlbWVudHMgdG8gaW5zZXJ0IHRoYW4gZWxlbWVudHMgYmVmb3JlIGluc2VydGlvbiBwb3NpdGlvbgorICBkLmluc2VydChkLmJlZ2luKCkgKyAzLCAyLCA5KTsKKyAgQ1BQVU5JVF9BU1NFUlQoIGQuc2l6ZSgpID09IDEzICk7CisgIENQUFVOSVRfQVNTRVJUKCBkWzNdID09IDkgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIGRbNF0gPT0gOSApOworCisgIC8vSW5zZXJ0aW9uIG9mIHNldmVyYWwgZWxlbWVudHMgYXQgZW5kOgorICBkLmluc2VydChkLmVuZCgpLCAyLCAxMCk7CisgIENQUFVOSVRfQVNTRVJUKCBkLnNpemUoKSA9PSAxNSApOworICBDUFBVTklUX0FTU0VSVCggZFsxNF0gPT0gMTAgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIGRbMTNdID09IDEwICk7CisKKyAgLy9JbnNlcnRpb24gb2Ygc2V2ZXJhbCBlbGVtZW50cyBiZWZvcmUgbGFzdDoKKyAgLy9UaGVyZSBpcyBtb3JlIGVsZW1lbnRzIHRvIGluc2VydCB0aGFuIGVsZW1lbnRzIGFmdGVyIGluc2VydGlvbiBwb3NpdGlvbgorICBkLmluc2VydChkLmVuZCgpIC0gMSwgMiwgMTEpOworICBDUFBVTklUX0FTU0VSVCggZC5zaXplKCkgPT0gMTcgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIGRbMTVdID09IDExICk7CisgIENQUFVOSVRfQVNTRVJUKCBkWzE0XSA9PSAxMSApOworCisgIC8vVGhlcmUgaXMgbGVzcyBlbGVtZW50cyB0byBpbnNlcnQgdGhhbiBlbGVtZW50cyBhZnRlciBpbnNlcnRpb24gcG9zaXRpb24KKyAgZC5pbnNlcnQoZC5lbmQoKSAtIDMsIDIsIDEyKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIGQuc2l6ZSgpID09IDE5ICk7CisgIENQUFVOSVRfQVNTRVJUKCBkWzE1XSA9PSAxMiApOworICBDUFBVTklUX0FTU0VSVCggZFsxNF0gPT0gMTIgKTsKK30KKwordm9pZCBEZXF1ZVRlc3Q6OmF0KCkgeworICBkZXF1ZTxpbnQ+IGQ7CisgIGRlcXVlPGludD4gY29uc3QmIGNkID0gZDsKKworICBkLnB1c2hfYmFjaygxMCk7CisgIENQUFVOSVRfQVNTRVJUKCBkLmF0KDApID09IDEwICk7CisgIGQuYXQoMCkgPSAyMDsKKyAgQ1BQVU5JVF9BU1NFUlQoIGNkLmF0KDApID09IDIwICk7CisKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZCAoX1NUTFBfVVNFX0VYQ0VQVElPTlMpCisgIGZvciAoOzspIHsKKyAgICB0cnkgeworICAgICAgZC5hdCgxKSA9IDIwOworICAgICAgQ1BQVU5JVF9BU1NFUlQoZmFsc2UpOworICAgIH0KKyAgICBjYXRjaCAob3V0X29mX3JhbmdlIGNvbnN0JikgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjYXRjaCAoLi4uKSB7CisgICAgICBDUFBVTklUX0FTU0VSVChmYWxzZSk7CisgICAgfQorICB9CisjZW5kaWYKK30KKwordm9pZCBEZXF1ZVRlc3Q6OmF1dG9fcmVmKCkKK3sKKyAgaW50IGk7CisgIGRlcXVlPGludD4gcmVmOworICBmb3IgKGkgPSAwOyBpIDwgNTsgKytpKSB7CisgICAgcmVmLnB1c2hfYmFjayhpKTsKKyAgfQorCisgIGRlcXVlPGRlcXVlPGludD4gPiBkX2RfaW50KDEsIHJlZik7CisgIGRfZF9pbnQucHVzaF9iYWNrKGRfZF9pbnRbMF0pOworICBkX2RfaW50LnB1c2hfYmFjayhyZWYpOworICBkX2RfaW50LnB1c2hfYmFjayhkX2RfaW50WzBdKTsKKyAgZF9kX2ludC5wdXNoX2JhY2soZF9kX2ludFswXSk7CisgIGRfZF9pbnQucHVzaF9iYWNrKHJlZik7CisKKyAgZm9yIChpID0gMDsgaSA8IDU7ICsraSkgeworICAgIENQUFVOSVRfQVNTRVJUKCBkX2RfaW50W2ldID09IHJlZiApOworICB9Cit9CisKK3ZvaWQgRGVxdWVUZXN0OjphbGxvY2F0b3Jfd2l0aF9zdGF0ZSgpCit7CisgIGNoYXIgYnVmMVsxMDI0XTsKKyAgU3RhY2tBbGxvY2F0b3I8aW50PiBzdGFjazEoYnVmMSwgYnVmMSArIHNpemVvZihidWYxKSk7CisKKyAgY2hhciBidWYyWzEwMjRdOworICBTdGFja0FsbG9jYXRvcjxpbnQ+IHN0YWNrMihidWYyLCBidWYyICsgc2l6ZW9mKGJ1ZjIpKTsKKworICB7CisgICAgdHlwZWRlZiBkZXF1ZTxpbnQsIFN0YWNrQWxsb2NhdG9yPGludD4gPiBEZXF1ZUludDsKKyAgICBEZXF1ZUludCBkaW50MSgxMCwgMCwgc3RhY2sxKTsKKyAgICBEZXF1ZUludCBkaW50MUNweShkaW50MSk7CisKKyAgICBEZXF1ZUludCBkaW50MigxMCwgMSwgc3RhY2syKTsKKyAgICBEZXF1ZUludCBkaW50MkNweShkaW50Mik7CisKKyAgICBkaW50MS5zd2FwKGRpbnQyKTsKKworICAgIENQUFVOSVRfQVNTRVJUKCBkaW50MS5nZXRfYWxsb2NhdG9yKCkuc3dhcGVkKCkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggZGludDIuZ2V0X2FsbG9jYXRvcigpLnN3YXBlZCgpICk7CisKKyAgICBDUFBVTklUX0FTU0VSVCggZGludDEgPT0gZGludDJDcHkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggZGludDIgPT0gZGludDFDcHkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggZGludDEuZ2V0X2FsbG9jYXRvcigpID09IHN0YWNrMiApOworICAgIENQUFVOSVRfQVNTRVJUKCBkaW50Mi5nZXRfYWxsb2NhdG9yKCkgPT0gc3RhY2sxICk7CisgIH0KKyAgQ1BQVU5JVF9BU1NFUlQoIHN0YWNrMS5vaygpICk7CisgIENQUFVOSVRfQVNTRVJUKCBzdGFjazIub2soKSApOworfQorCitzdHJ1Y3QgUG9pbnQgeworICBpbnQgeCwgeTsKK307CisKK3N0cnVjdCBQb2ludEV4IDogcHVibGljIFBvaW50IHsKKyAgUG9pbnRFeCgpIDogYnVpbHRGcm9tQmFzZShmYWxzZSkge30KKyAgUG9pbnRFeChjb25zdCBQb2ludCYpIDogYnVpbHRGcm9tQmFzZSh0cnVlKSB7fQorCisgIGJvb2wgYnVpbHRGcm9tQmFzZTsKK307CisKKyNpZiBkZWZpbmVkIChTVExQT1JUKQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX05BTUVTUEFDRVMpCituYW1lc3BhY2Ugc3RkIHsKKyMgIGVuZGlmCisgIF9TVExQX1RFTVBMQVRFX05VTEwKKyAgc3RydWN0IF9fdHlwZV90cmFpdHM8UG9pbnRFeD4geworICAgIHR5cGVkZWYgX19mYWxzZV90eXBlIGhhc190cml2aWFsX2RlZmF1bHRfY29uc3RydWN0b3I7CisgICAgdHlwZWRlZiBfX3RydWVfdHlwZSBoYXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yOworICAgIHR5cGVkZWYgX190cnVlX3R5cGUgaGFzX3RyaXZpYWxfYXNzaWdubWVudF9vcGVyYXRvcjsKKyAgICB0eXBlZGVmIF9fdHJ1ZV90eXBlIGhhc190cml2aWFsX2Rlc3RydWN0b3I7CisgICAgdHlwZWRlZiBfX3RydWVfdHlwZSBpc19QT0RfdHlwZTsKKyAgfTsKKyMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9OQU1FU1BBQ0VTKQorfQorIyAgZW5kaWYKKyNlbmRpZgorCisvL1RoaXMgdGVzdCBjaGVjayB0aGF0IGRlcXVlIGltcGxlbWVudGF0aW9uIGRvIG5vdCBvdmVyIG9wdGltaXplCisvL29wZXJhdGlvbiBhcyBQb2ludEV4IGNvcHkgY29uc3RydWN0b3IgaXMgdHJpdmlhbAordm9pZCBEZXF1ZVRlc3Q6Om9wdGltaXphdGlvbnNfY2hlY2soKQoreworI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCAhZGVmaW5lZCAoX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFUykKKyAgZGVxdWU8UG9pbnQ+IGQxKDEpOworICBDUFBVTklUX0FTU0VSVCggZDEuc2l6ZSgpID09IDEgKTsKKworICBkZXF1ZTxQb2ludEV4PiBkMihkMS5iZWdpbigpLCBkMS5lbmQoKSk7CisgIENQUFVOSVRfQVNTRVJUKCBkMi5zaXplKCkgPT0gMSApOworICBDUFBVTklUX0FTU0VSVCggZDJbMF0uYnVpbHRGcm9tQmFzZSA9PSB0cnVlICk7CisKKyAgZDIuaW5zZXJ0KGQyLmVuZCgpLCBkMS5iZWdpbigpLCBkMS5lbmQoKSk7CisgIENQUFVOSVRfQVNTRVJUKCBkMi5zaXplKCkgPT0gMiApOworICBDUFBVTklUX0FTU0VSVCggZDJbMV0uYnVpbHRGcm9tQmFzZSA9PSB0cnVlICk7CisjZW5kaWYKK30KKwordm9pZCBEZXF1ZVRlc3Q6OmVyYXNlKCkKK3sKKyAgZGVxdWU8aW50PiBkaW50OworICBkaW50LnB1c2hfYmFjaygzKTsKKyAgZGludC5wdXNoX2Zyb250KDIpOworICBkaW50LnB1c2hfYmFjayg0KTsKKyAgZGludC5wdXNoX2Zyb250KDEpOworICBkaW50LnB1c2hfYmFjayg1KTsKKyAgZGludC5wdXNoX2Zyb250KDApOworICBkaW50LnB1c2hfYmFjayg2KTsKKworICBkZXF1ZTxpbnQ+OjppdGVyYXRvciBpdChkaW50LmJlZ2luKCkgKyAxKTsKKyAgQ1BQVU5JVF9BU1NFUlQoICppdCA9PSAxICk7CisKKyAgZGludC5lcmFzZShkaW50LmJlZ2luKCkpOworICBDUFBVTklUX0FTU0VSVCggKml0ID09IDEgKTsKKworICBpdCA9IGRpbnQuZW5kKCkgLSAyOworICBDUFBVTklUX0FTU0VSVCggKml0ID09IDUgKTsKKworICBkaW50LmVyYXNlKGRpbnQuZW5kKCkgLSAxKTsKKyAgQ1BQVU5JVF9BU1NFUlQoICppdCA9PSA1ICk7CisKKyAgZGludC5wdXNoX2JhY2soNik7CisgIGRpbnQucHVzaF9mcm9udCgwKTsKKworICBpdCA9IGRpbnQuYmVnaW4oKSArIDI7CisgIENQUFVOSVRfQVNTRVJUKCAqaXQgPT0gMiApOworCisgIGRpbnQuZXJhc2UoZGludC5iZWdpbigpLCBkaW50LmJlZ2luKCkgKyAyKTsKKyAgQ1BQVU5JVF9BU1NFUlQoICppdCA9PSAyICk7CisKKyAgaXQgPSBkaW50LmVuZCgpIC0gMzsKKyAgQ1BQVU5JVF9BU1NFUlQoICppdCA9PSA0ICk7CisKKyAgZGludC5lcmFzZShkaW50LmVuZCgpIC0gMiwgZGludC5lbmQoKSk7CisgIENQUFVOSVRfQVNTRVJUKCAqaXQgPT0gNCApOworfQorCisjaWYgKCFkZWZpbmVkIChTVExQT1JUKSB8fCBcCisgICAgKCFkZWZpbmVkIChfU1RMUF9VU0VfUFRSX1NQRUNJQUxJWkFUSU9OUykgfHwgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikpKSAmJiBcCisgICAgICghZGVmaW5lZCAoX01TQ19WRVIpIHx8IChfTVNDX1ZFUiA+IDE0MDApKSAmJiBcCisgICAgICghZGVmaW5lZChfX0dOVUNfXykgfHwgKF9fR05VQ19fIDwgNCkgfHwgKF9fR05VQ19NSU5PUl9fIDwgMykpCisvKiBTaW1wbGUgY29tcGlsYXRpb24gdGVzdDogQ2hlY2sgdGhhdCBuZXN0ZWQgdHlwZXMgbGlrZSBpdGVyYXRvcgorICogY2FuIGJlIGFjY2VzcyBldmVuIGlmIHR5cGUgdXNlZCB0byBpbnN0YW5jaWF0ZSBjb250YWluZXIgaXMgbm90CisgKiB5ZXQgY29tcGxldGVseSBkZWZpbmVkLgorICovCitjbGFzcyBJbmNvbXBsZXRlQ2xhc3MKK3sKKyAgZGVxdWU8SW5jb21wbGV0ZUNsYXNzPiBpbnN0YW5jZXM7CisgIHR5cGVkZWYgZGVxdWU8SW5jb21wbGV0ZUNsYXNzPjo6c2l6ZV90eXBlIHNpemU7Cit9OworI2VuZGlmCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvZGl2aWRlc190ZXN0LmNwcCBiL3Rlc3QvdW5pdC9kaXZpZGVzX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczZTM1Y2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvZGl2aWRlc190ZXN0LmNwcApAQCAtMCwwICsxLDMzIEBACisjaW5jbHVkZSA8bnVtZXJpYz4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCisjaW5jbHVkZSAiY3BwdW5pdC9jcHB1bml0X3Byb3h5LmgiCisKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZChfU1RMUF9VU0VfTkFNRVNQQUNFUykKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisjZW5kaWYKKworLy8KKy8vIFRlc3RDYXNlIGNsYXNzCisvLworY2xhc3MgRGl2aWRlVGVzdCA6IHB1YmxpYyBDUFBVTklUX05TOjpUZXN0Q2FzZQoreworICBDUFBVTklUX1RFU1RfU1VJVEUoRGl2aWRlVGVzdCk7CisgIENQUFVOSVRfVEVTVChkaXYpOworICBDUFBVTklUX1RFU1RfU1VJVEVfRU5EKCk7CisKK3Byb3RlY3RlZDoKKyAgdm9pZCBkaXYoKTsKK307CisKK0NQUFVOSVRfVEVTVF9TVUlURV9SRUdJU1RSQVRJT04oRGl2aWRlVGVzdCk7CisKKy8vCisvLyB0ZXN0cyBpbXBsZW1lbnRhdGlvbgorLy8KK3ZvaWQgRGl2aWRlVGVzdDo6ZGl2KCkKK3sKKyAgaW50IGlucHV0IFszXSA9IHsgMiwgMywgNCB9OworICBpbnQgcmVzdWx0ID0gYWNjdW11bGF0ZShpbnB1dCwgaW5wdXQgKyAzLCA0OCwgZGl2aWRlczxpbnQ+KCkpOworICBDUFBVTklUX0FTU0VSVChyZXN1bHQ9PTIpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L2VwaWxvZ190ZXN0LmNwcCBiL3Rlc3QvdW5pdC9lcGlsb2dfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdlMjhmMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9lcGlsb2dfdGVzdC5jcHAKQEAgLTAsMCArMSwxMCBAQAorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZChfU1RMUF9VU0VfTkFNRVNQQUNFUykKKworc3RydWN0IHNvbWVfc3RydWN0IHsKKyAgICBzdGQ6OnN0cmluZyBzOyAvLyBpZiBzdGQgbm90IHByb3Blcmx5IHJlZGVmaW5lZCwgZXJyb3Igd2lsbCBiZSBoZXJlCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9lcXVhbF90ZXN0LmNwcCBiL3Rlc3QvdW5pdC9lcXVhbF90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWMwYWUyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L2VxdWFsX3Rlc3QuY3BwCkBAIC0wLDAgKzEsMTc4IEBACisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgImNwcHVuaXQvY3BwdW5pdF9wcm94eS5oIgorCisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IGRlZmluZWQoX1NUTFBfVVNFX05BTUVTUEFDRVMpCit1c2luZyBuYW1lc3BhY2Ugc3RkOworI2VuZGlmCisKKy8vCisvLyBUZXN0Q2FzZSBjbGFzcworLy8KK2NsYXNzIEVxdWFsVGVzdCA6IHB1YmxpYyBDUFBVTklUX05TOjpUZXN0Q2FzZQoreworICBDUFBVTklUX1RFU1RfU1VJVEUoRXF1YWxUZXN0KTsKKyAgQ1BQVU5JVF9URVNUKGVxdWFsX3JhbmdlMCk7CisgIENQUFVOSVRfVEVTVChlcXVhbF9yYW5nZTEpOworICBDUFBVTklUX1RFU1QoZXF1YWxfcmFuZ2UyKTsKKyAgQ1BQVU5JVF9URVNUKGVxdWFsMCk7CisgIENQUFVOSVRfVEVTVChlcXVhbDEpOworICBDUFBVTklUX1RFU1QoZXF1YWwyKTsKKyAgQ1BQVU5JVF9URVNUKGVxdWFsdG8pOworICBDUFBVTklUX1RFU1RfU1VJVEVfRU5EKCk7CisKK3Byb3RlY3RlZDoKKyAgdm9pZCBlcXVhbF9yYW5nZTAoKTsKKyAgdm9pZCBlcXVhbF9yYW5nZTEoKTsKKyAgdm9pZCBlcXVhbF9yYW5nZTIoKTsKKyAgdm9pZCBlcXVhbDAoKTsKKyAgdm9pZCBlcXVhbDEoKTsKKyAgdm9pZCBlcXVhbDIoKTsKKyAgdm9pZCBlcXVhbHRvKCk7CisgIHN0YXRpYyBib29sIHZhbHVlc19zcXVhcmVkKGludCBhXywgaW50IGJfKTsKK307CisKK0NQUFVOSVRfVEVTVF9TVUlURV9SRUdJU1RSQVRJT04oRXF1YWxUZXN0KTsKKworLy8KKy8vIHRlc3RzIGltcGxlbWVudGF0aW9uCisvLwordm9pZCBFcXVhbFRlc3Q6OmVxdWFsX3JhbmdlMCgpCit7CisgIGludCBudW1iZXJzWzEwXSA9IHsgMCwgMCwgMSwgMSwgMiwgMiwgMiwgMiwgMywgMyB9OworICBwYWlyPGludCosIGludCo+IHJhbmdlID0gZXF1YWxfcmFuZ2UoKGludCopbnVtYmVycywgKGludCopbnVtYmVycyArIDEwLCAyKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIChyYW5nZS5maXJzdCAtIG51bWJlcnMpID09IDQgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIChyYW5nZS5zZWNvbmQgLSBudW1iZXJzKSA9PSA4ICk7Cit9CisKK3ZvaWQgRXF1YWxUZXN0OjplcXVhbF9yYW5nZTEoKQoreworICB0eXBlZGVmIHZlY3RvciA8aW50PiBJbnRWZWM7CisgIEludFZlYyB2KDEwKTsKKyAgZm9yIChpbnQgaSA9IDA7IChzaXplX3QpaSA8IHYuc2l6ZSgpOyArK2kpCisgICAgdltpXSA9IGkgLyAzOworCisgIHBhaXI8SW50VmVjOjppdGVyYXRvciwgSW50VmVjOjppdGVyYXRvcj4gcmFuZ2UgPSBlcXVhbF9yYW5nZSh2LmJlZ2luKCksIHYuZW5kKCksIDIpOworICBDUFBVTklUX0FTU0VSVCggKHJhbmdlLmZpcnN0IC0gdi5iZWdpbigpKSA9PSA2ICk7CisgIENQUFVOSVRfQVNTRVJUKCAocmFuZ2Uuc2Vjb25kIC0gdi5iZWdpbigpKSA9PSA5ICk7CisgIGZvciAoOyByYW5nZS5maXJzdCAhPSByYW5nZS5zZWNvbmQ7ICsrcmFuZ2UuZmlyc3QpCisgICAgQ1BQVU5JVF9BU1NFUlQoICpyYW5nZS5maXJzdCA9PSAyICk7CisKKyAgcmFuZ2UgPSBlcXVhbF9yYW5nZSh2LmJlZ2luKCksIHYuZW5kKCksIDQpOworICBDUFBVTklUX0FTU0VSVCggcmFuZ2UuZmlyc3QgPT0gcmFuZ2Uuc2Vjb25kICk7CisgIENQUFVOSVRfQVNTRVJUKCByYW5nZS5maXJzdCA9PSB2LmVuZCgpICk7Cit9CisKK3N0cnVjdCBUZXN0IHsKKyNpZiBkZWZpbmVkIChfX0RNQ19fKQorICBUZXN0KCk7CisjZW5kaWYKKworICBUZXN0KGludCB2YWwpIDogdmFsdWUodmFsKSB7fQorICBpbnQgdmFsdWU7CisKKyAgYm9vbCBvcGVyYXRvciA9PSAoaW50IGkpIGNvbnN0CisgIHsgcmV0dXJuIHZhbHVlID09IGk7IH0KK307CisKK2Jvb2wgb3BlcmF0b3IgPCAoY29uc3QgVGVzdCYgdjEsIGludCB2MikKK3sgcmV0dXJuIHYxLnZhbHVlIDwgdjI7IH0KKworYm9vbCBvcGVyYXRvciA8IChpbnQgdjEsIGNvbnN0IFRlc3QmIHYyKQoreyByZXR1cm4gdjEgPCB2Mi52YWx1ZTsgfQorCisjaWYgZGVmaW5lZCAoX01TQ19WRVIpICYmICFkZWZpbmVkIChTVExQT1JUKQorYm9vbCBvcGVyYXRvciA8IChjb25zdCBUZXN0JiB2MSwgY29uc3QgVGVzdCYgdjIpCit7IHJldHVybiB2MS52YWx1ZSA8IHYyLnZhbHVlOyB9CisjZW5kaWYKKwordm9pZCBFcXVhbFRlc3Q6OmVxdWFsX3JhbmdlMigpCit7CisgIGNoYXIgY2hhcnNbXSA9ICJhYWJiY2NkZGdnZ2hoa2xsbG1xcXFxc3N5eXp6IjsKKworICBjb25zdCB1bnNpZ25lZCBjb3VudCA9IHNpemVvZihjaGFycykgLSAxOworICBwYWlyPGNoYXIqLCBjaGFyKj4gcmFuZ2UgPSBlcXVhbF9yYW5nZSgoY2hhciopY2hhcnMsIChjaGFyKiljaGFycyArIGNvdW50LCAncScsIGxlc3M8Y2hhcj4oKSk7CisgIENQUFVOSVRfQVNTRVJUKCAocmFuZ2UuZmlyc3QgLSBjaGFycykgPT0gMTggKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIChyYW5nZS5zZWNvbmQgLSBjaGFycykgPT0gMjIgKTsKKyAgZm9yICg7IHJhbmdlLmZpcnN0ICE9IHJhbmdlLnNlY29uZDsgKytyYW5nZS5maXJzdCkKKyAgICBDUFBVTklUX0FTU0VSVCggKnJhbmdlLmZpcnN0ID09ICdxJyApOworCisgIHJhbmdlID0gZXF1YWxfcmFuZ2UoKGNoYXIqKWNoYXJzLCAoY2hhciopY2hhcnMgKyBjb3VudCwgJ20nLCBsZXNzPGNoYXI+KCkpOworICBDUFBVTklUX0FTU0VSVCggKHJhbmdlLnNlY29uZCAtIHJhbmdlLmZpcnN0KSA9PSAxICk7CisgIENQUFVOSVRfQVNTRVJUKCAqcmFuZ2UuZmlyc3QgPT0gJ20nICk7CisKKyAgdmVjdG9yPFRlc3Q+IHR2OworICB2ZWN0b3I8VGVzdD46Oml0ZXJhdG9yIGl0OworICBwYWlyPHZlY3RvcjxUZXN0Pjo6aXRlcmF0b3IsIHZlY3RvcjxUZXN0Pjo6aXRlcmF0b3I+IHA7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgKytpKSB7CisgICAgdHYucHVzaF9iYWNrKGkpOworICB9CisKKyAgaXQgPSB1cHBlcl9ib3VuZCh0di5iZWdpbigpLCB0di5lbmQoKSwgNSk7CisgIENQUFVOSVRfQVNTRVJUKCBpdCAhPSB0di5lbmQoKSApOworICBDUFBVTklUX0FTU0VSVCggKml0ID09IDYgKTsKKworICBpdCA9IGxvd2VyX2JvdW5kKHR2LmJlZ2luKCksIHR2LmVuZCgpLCA1KTsKKyAgQ1BQVU5JVF9BU1NFUlQoIGl0ICE9IHR2LmVuZCgpICk7CisgIENQUFVOSVRfQVNTRVJUKCAqaXQgPT0gNSApOworCisgIHAgPSBlcXVhbF9yYW5nZSh0di5iZWdpbigpLCB0di5lbmQoKSwgNSk7CisgIENQUFVOSVRfQVNTRVJUKCBwLmZpcnN0ICE9IHAuc2Vjb25kICk7CisgIENQUFVOSVRfQVNTRVJUKCBwLmZpcnN0ICE9IHR2LmVuZCgpICk7CisgIENQUFVOSVRfQVNTRVJUKCBwLnNlY29uZCAhPSB0di5lbmQoKSApOworICBDUFBVTklUX0FTU0VSVCggKnAuZmlyc3QgPT0gNSApOworICBDUFBVTklUX0FTU0VSVCggKnAuc2Vjb25kID09IDYgKTsKK30KKwordm9pZCBFcXVhbFRlc3Q6OmVxdWFsMCgpCit7CisgIGludCBudW1iZXJzMVs1XSA9IHsgMSwgMiwgMywgNCwgNSB9OworICBpbnQgbnVtYmVyczJbNV0gPSB7IDEsIDIsIDQsIDgsIDE2IH07CisgIGludCBudW1iZXJzM1syXSA9IHsgMSwgMiB9OworCisgIENQUFVOSVRfQVNTRVJUKCAhZXF1YWwobnVtYmVyczEsIG51bWJlcnMxICsgNSwgbnVtYmVyczIpICk7CisgIENQUFVOSVRfQVNTRVJUKCBlcXVhbChudW1iZXJzMywgbnVtYmVyczMgKyAyLCBudW1iZXJzMSkgKTsKK30KKwordm9pZCBFcXVhbFRlc3Q6OmVxdWFsMSgpCit7CisgIHZlY3RvciA8aW50PiB2MSgxMCk7CisgIGZvciAoaW50IGkgPSAwOyAoc2l6ZV90KWkgPCB2MS5zaXplKCk7ICsraSkKKyAgICB2MVtpXSA9IGk7CisgIHZlY3RvciA8aW50PiB2MigxMCk7CisgIENQUFVOSVRfQVNTRVJUKCAhZXF1YWwodjEuYmVnaW4oKSwgdjEuZW5kKCksIHYyLmJlZ2luKCkpICk7CisKKyAgY29weSh2MS5iZWdpbigpLCB2MS5lbmQoKSwgdjIuYmVnaW4oKSk7CisgIENQUFVOSVRfQVNTRVJUKCBlcXVhbCh2MS5iZWdpbigpLCB2MS5lbmQoKSwgdjIuYmVnaW4oKSkgKQorfQorCit2b2lkIEVxdWFsVGVzdDo6ZXF1YWwyKCkKK3sKKyAgdmVjdG9yIDxpbnQ+IHYxKDEwKTsKKyAgdmVjdG9yIDxpbnQ+IHYyKDEwKTsKKyAgZm9yIChpbnQgaSA9IDA7IChzaXplX3QpaSA8IHYxLnNpemUoKTsgKytpKSB7CisgICAgdjFbaV0gPSBpOworICAgIHYyW2ldID0gaSAqIGk7CisgIH0KKyAgQ1BQVU5JVF9BU1NFUlQoIGVxdWFsKHYxLmJlZ2luKCksIHYxLmVuZCgpLCB2Mi5iZWdpbigpLCB2YWx1ZXNfc3F1YXJlZCkgKTsKK30KKwordm9pZCBFcXVhbFRlc3Q6OmVxdWFsdG8oKQoreworICBpbnQgaW5wdXQxIFs0XSA9IHsgMSwgNywgMiwgMiB9OworICBpbnQgaW5wdXQyIFs0XSA9IHsgMSwgNiwgMiwgMyB9OworCisgIGludCBvdXRwdXQgWzRdOworICB0cmFuc2Zvcm0oKGludCopaW5wdXQxLCAoaW50KilpbnB1dDEgKyA0LCAoaW50KilpbnB1dDIsIChpbnQqKW91dHB1dCwgZXF1YWxfdG88aW50PigpKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIG91dHB1dFswXSA9PSAxICk7CisgIENQUFVOSVRfQVNTRVJUKCBvdXRwdXRbMV0gPT0gMCApOworICBDUFBVTklUX0FTU0VSVCggb3V0cHV0WzJdID09IDEgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIG91dHB1dFszXSA9PSAwICk7Cit9CisKK2Jvb2wgRXF1YWxUZXN0Ojp2YWx1ZXNfc3F1YXJlZChpbnQgYV8sIGludCBiXykKK3sKKyAgcmV0dXJuIChhXyAqIGFfID09IGJfKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9lcnJub19oZWFkZXJfdGVzdC5jIGIvdGVzdC91bml0L2Vycm5vX2hlYWRlcl90ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEwYWNjYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9lcnJub19oZWFkZXJfdGVzdC5jCkBAIC0wLDAgKzEsOCBAQAorLyogVGhpcyB0ZXN0IHB1cnBvc2UgaXMgc2ltcGx5IHRvIGNoZWNrIFN0YW5kYXJkIGhlYWRlciBpbmRlcGVuZGFuY3kgdGhhdAorICogaXMgdG8gc2F5IHRoYXQgdGhlIGhlYWRlciBjYW4gYmUgaW5jbHVkZWQgYWxvbmUgd2l0aG91dCBhbnkgcHJldmlvdXMKKyAqIGluY2x1ZGUuCisgKiBBZGRpdGlvbm5hbHksIGZvciBDIFN0YW5kYXJkIGhlYWRlcnMgdGhhdCBTVExwb3J0IGV4cG9zZSwgaXQgY2FuIGFsc28gYmUKKyAqIHVzZWQgdG8gY2hlY2sgdGhhdCBmaWxlcyBpbmNsdWRlZCBieSB0aG9zZSBoZWFkZXJzIGFyZSBjb21wYXRpYmxlIHdpdGgKKyAqIHB1cmUgQyBjb21waWxlcnMuCisgKi8KKyNpbmNsdWRlIDxlcnJuby5oPgpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L2V4Y2VwdGlvbl9oZWFkZXJfdGVzdC5jcHAgYi90ZXN0L3VuaXQvZXhjZXB0aW9uX2hlYWRlcl90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzg0YWI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L2V4Y2VwdGlvbl9oZWFkZXJfdGVzdC5jcHAKQEAgLTAsMCArMSw4IEBACisvKiBUaGlzIHRlc3QgcHVycG9zZSBpcyBzaW1wbHkgdG8gY2hlY2sgU3RhbmRhcmQgaGVhZGVyIGluZGVwZW5kYW5jeSB0aGF0CisgKiBpcyB0byBzYXkgdGhhdCB0aGUgaGVhZGVyIGNhbiBiZSBpbmNsdWRlZCBhbG9uZSB3aXRob3V0IGFueSBwcmV2aW91cworICogaW5jbHVkZS4KKyAqIEFkZGl0aW9ubmFseSwgZm9yIEMgU3RhbmRhcmQgaGVhZGVycyB0aGF0IFNUTHBvcnQgZXhwb3NlLCBpdCBjYW4gYWxzbyBiZQorICogdXNlZCB0byBjaGVjayB0aGF0IGZpbGVzIGluY2x1ZGVkIGJ5IHRob3NlIGhlYWRlcnMgYXJlIGNvbXBhdGlibGUgd2l0aAorICogcHVyZSBDIGNvbXBpbGVycy4KKyAqLworI2luY2x1ZGUgPGV4Y2VwdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9leGNlcHRpb25fdGVzdC5jcHAgYi90ZXN0L3VuaXQvZXhjZXB0aW9uX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4Nzk5NDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvZXhjZXB0aW9uX3Rlc3QuY3BwCkBAIC0wLDAgKzEsMTkzIEBACisjaW5jbHVkZSA8ZXhjZXB0aW9uPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJjcHB1bml0L2NwcHVuaXRfcHJveHkuaCIKKworI2lmIGRlZmluZWQgKFNUTFBPUlQpICYmIGRlZmluZWQgKF9TVExQX1VTRV9OQU1FU1BBQ0VTKQorLyoKKyAqIFRoaXMgdGVzdCBjYXNlIHB1cnBvc2UgaXMgdG8gY2hlY2sgdGhhdCB0aGUgZXhjZXB0aW9uIGhhbmRsaW5nCisgKiBmdW5jdGlvbnMgYXJlIGNvcnJlY3RseSBpbXBvcnRlZCB0byB0aGUgU1RMcG9ydCBuYW1lc3BhY2Ugb25seQorICogaWYgdGhleSBoYXZlIGEgcmlnaHQgYmVoYXZpb3IuCisgKiBPdGhlcndpc2UgdGhleSBhcmUgbm90IGltcG9ydGVkIHRvIHJlcG9ydCB0aGUgcHJvYmxlbSBhcyBhIGNvbXBpbGUKKyAqIHRpbWUgZXJyb3IuCisgKi8KKworLy8KKy8vIFRlc3RDYXNlIGNsYXNzCisvLworY2xhc3MgRXhjZXB0aW9uVGVzdCA6IHB1YmxpYyBDUFBVTklUX05TOjpUZXN0Q2FzZQoreworICBDUFBVTklUX1RFU1RfU1VJVEUoRXhjZXB0aW9uVGVzdCk7CisjaWYgZGVmaW5lZCAoU1RMUE9SVCkgJiYgIWRlZmluZWQgKF9TVExQX1VTRV9FWENFUFRJT05TKQorICBDUFBVTklUX0lHTk9SRTsKKyNlbmRpZgorICBDUFBVTklUX1RFU1Qod2hhdCk7CisjaWYgZGVmaW5lZCAoU1RMUE9SVCkgJiYgZGVmaW5lZCAoX1NUTFBfTk9fVU5FWFBFQ1RFRF9FWENFUFRfU1VQUE9SVCkKKyAgQ1BQVU5JVF9JR05PUkU7CisjZW5kaWYKKyAgQ1BQVU5JVF9URVNUKHVuZXhwZWN0ZWRfZXhjZXB0KTsKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiBkZWZpbmVkIChfU1RMUF9VU0VfRVhDRVBUSU9OUykKKyAgQ1BQVU5JVF9TVE9QX0lHTk9SRTsKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNUTFBPUlQpICYmIGRlZmluZWQgKF9TVExQX05PX1VOQ0FVR0hUX0VYQ0VQVF9TVVBQT1JUKQorICBDUFBVTklUX0lHTk9SRTsKKyNlbmRpZgorICBDUFBVTklUX1RFU1QodW5jYXVnaHRfZXhjZXB0KTsKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiBkZWZpbmVkIChfU1RMUF9VU0VfRVhDRVBUSU9OUykKKyAgQ1BQVU5JVF9TVE9QX0lHTk9SRTsKKyNlbmRpZgorICBDUFBVTklUX1RFU1QoZXhjZXB0aW9uX2VtaXNzaW9uKTsKKyAgQ1BQVU5JVF9URVNUX1NVSVRFX0VORCgpOworCitwcm90ZWN0ZWQ6CisgIHZvaWQgd2hhdCgpOworICB2b2lkIHVuZXhwZWN0ZWRfZXhjZXB0KCk7CisgIHZvaWQgdW5jYXVnaHRfZXhjZXB0KCk7CisgIHZvaWQgZXhjZXB0aW9uX2VtaXNzaW9uKCk7Cit9OworCitDUFBVTklUX1RFU1RfU1VJVEVfUkVHSVNUUkFUSU9OKEV4Y2VwdGlvblRlc3QpOworCisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8ICFkZWZpbmVkIChfU1RMUF9OT19VTkVYUEVDVEVEX0VYQ0VQVF9TVVBQT1JUKQorYm9vbCBnX3VuZXhwZWN0ZWRfY2FsbGVkID0gZmFsc2U7Cit2b2lkIHVuZXhwZWN0ZWRfaGRsKCkgeworICBnX3VuZXhwZWN0ZWRfY2FsbGVkID0gdHJ1ZTsKKyAgdGhyb3cgc3RkOjpiYWRfZXhjZXB0aW9uKCk7Cit9CisKK3N0cnVjdCBzcGVjaWFsX2V4Y2VwdCB7fTsKK3ZvaWQgdGhyb3dfZnVuYygpIHsKKyAgdGhyb3cgc3BlY2lhbF9leGNlcHQoKTsKK30KKwordm9pZCB0aHJvd19leGNlcHRfZnVuYygpIHRocm93KHN0ZDo6ZXhjZXB0aW9uKSB7CisgIHRocm93X2Z1bmMoKTsKK30KKyNlbmRpZgorCit2b2lkIEV4Y2VwdGlvblRlc3Q6OndoYXQoKQoreworICB0cnkgeworICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvciggc3RkOjpzdHJpbmcoICJtZXNzYWdlIiApICk7CisgIH0KKyAgY2F0Y2ggKCBzdGQ6OnJ1bnRpbWVfZXJyb3ImIGVyciApIHsKKyAgICBDUFBVTklUX0NIRUNLKCBzdHJjbXAoIGVyci53aGF0KCksICJtZXNzYWdlIiApID09IDAgKTsKKyAgfQorfQorCit2b2lkIEV4Y2VwdGlvblRlc3Q6OnVuZXhwZWN0ZWRfZXhjZXB0KCkKK3sKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgIWRlZmluZWQgKF9TVExQX05PX1VORVhQRUNURURfRVhDRVBUX1NVUFBPUlQpCisgIHN0ZDo6dW5leHBlY3RlZF9oYW5kbGVyIGhkbCA9ICZ1bmV4cGVjdGVkX2hkbDsKKyAgc3RkOjpzZXRfdW5leHBlY3RlZChoZGwpOworCisgIHRyeSB7CisgICAgdGhyb3dfZXhjZXB0X2Z1bmMoKTsKKyAgfQorICBjYXRjaCAoc3RkOjpiYWRfZXhjZXB0aW9uIGNvbnN0JikgeworICAgIENQUFVOSVRfQVNTRVJUKCB0cnVlICk7CisgIH0KKyAgY2F0Y2ggKHNwZWNpYWxfZXhjZXB0KSB7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGZhbHNlICk7CisgIH0KKyAgQ1BQVU5JVF9BU1NFUlQoIGdfdW5leHBlY3RlZF9jYWxsZWQgKTsKKyNlbmRpZgorfQorCisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8ICFkZWZpbmVkIChfU1RMUF9OT19VTkNBVUdIVF9FWENFUFRfU1VQUE9SVCkKK3N0cnVjdCBVbmNhdWdodENsYXNzVGVzdAoreworICBVbmNhdWdodENsYXNzVGVzdChpbnQgJnJlcykgOiBfcmVzKHJlcykKKyAge30KKworICB+VW5jYXVnaHRDbGFzc1Rlc3QoKSB7CisgICAgX3JlcyA9IHN0ZDo6dW5jYXVnaHRfZXhjZXB0aW9uKCk/MTowOworICB9CisKKyAgaW50ICZfcmVzOworfTsKKyNlbmRpZgorCit2b2lkIEV4Y2VwdGlvblRlc3Q6OnVuY2F1Z2h0X2V4Y2VwdCgpCit7CisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8ICFkZWZpbmVkIChfU1RMUF9OT19VTkNBVUdIVF9FWENFUFRfU1VQUE9SVCkKKyAgaW50IHVuY2F1Z2h0X3Jlc3VsdCA9IC0xOworICB7CisgICAgVW5jYXVnaHRDbGFzc1Rlc3QgdGVzdF9pbnN0KHVuY2F1Z2h0X3Jlc3VsdCk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHVuY2F1Z2h0X3Jlc3VsdCA9PSAtMSApOworICB9CisgIENQUFVOSVRfQVNTRVJUKCB1bmNhdWdodF9yZXN1bHQgPT0gMCApOworCisgIHsKKyAgICB0cnkgeworICAgICAgdW5jYXVnaHRfcmVzdWx0ID0gLTE7CisgICAgICBVbmNhdWdodENsYXNzVGVzdCB0ZXN0X2luc3QodW5jYXVnaHRfcmVzdWx0KTsKKyAgICAgIHRocm93ICJleGNlcHRpb24iOworICAgIH0KKyAgICBjYXRjaCAoLi4uKSB7CisgICAgfQorICB9CisgIENQUFVOSVRfQVNTRVJUKCB1bmNhdWdodF9yZXN1bHQgPT0gMSApOworI2VuZGlmCit9CisKK3ZvaWQgRXhjZXB0aW9uVGVzdDo6ZXhjZXB0aW9uX2VtaXNzaW9uKCkKK3sKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZCAoX1NUTFBfVVNFX0VYQ0VQVElPTlMpCisgIHN0ZDo6c3RyaW5nIGZvbyA9ICJmb28iOworICB0cnkgeworICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcihmb28pOworICB9CisgIGNhdGNoIChzdGQ6OnJ1bnRpbWVfZXJyb3IgY29uc3QmIGUpIHsKKyAgICBDUFBVTklUX0FTU0VSVCggZm9vID09IGUud2hhdCgpICk7CisgICAgc3RkOjpydW50aW1lX2Vycm9yIGNsb25lKCIiKTsKKyAgICBjbG9uZSA9IGU7CisgICAgQ1BQVU5JVF9BU1NFUlQoZm9vID09IGNsb25lLndoYXQoKSApOworICB9CisgIGNhdGNoICguLi4pIHsKKyAgICBDUFBVTklUX0FTU0VSVCggZmFsc2UgKTsKKyAgfQorCisgIHRyeSB7CisgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKGZvbyk7CisgIH0KKyAgY2F0Y2ggKHN0ZDo6cnVudGltZV9lcnJvciBlKSB7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGZvbyA9PSBlLndoYXQoKSApOworICAgIHN0ZDo6cnVudGltZV9lcnJvciBjbG9uZSgiIik7CisgICAgY2xvbmUgPSBlOworICAgIENQUFVOSVRfQVNTRVJUKGZvbyA9PSBjbG9uZS53aGF0KCkgKTsKKyAgfQorICBjYXRjaCAoLi4uKSB7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGZhbHNlICk7CisgIH0KKworICBzdGQ6OnN0cmluZyBtc2coNTEyLCAnYScpOworICB0cnkgeworICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcihtc2cpOworICB9CisgIGNhdGNoIChzdGQ6OnJ1bnRpbWVfZXJyb3IgY29uc3QmIGUpIHsKKyAgICBDUFBVTklUX0FTU0VSVChtc2cgPT0gZS53aGF0KCkgKTsKKyAgICBzdGQ6OnJ1bnRpbWVfZXJyb3IgY2xvbmUoIiIpOworICAgIGNsb25lID0gZTsKKyAgICBDUFBVTklUX0FTU0VSVChtc2cgPT0gY2xvbmUud2hhdCgpICk7CisgIH0KKyAgY2F0Y2ggKC4uLikgeworICAgIENQUFVOSVRfQVNTRVJUKCBmYWxzZSApOworICB9CisKKyAgdHJ5IHsKKyAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IobXNnKTsKKyAgfQorICBjYXRjaCAoc3RkOjpydW50aW1lX2Vycm9yIGUpIHsKKyAgICBDUFBVTklUX0FTU0VSVChtc2cgPT0gZS53aGF0KCkgKTsKKyAgICBzdGQ6OnJ1bnRpbWVfZXJyb3IgY2xvbmUoIiIpOworICAgIGNsb25lID0gZTsKKyAgICBDUFBVTklUX0FTU0VSVChtc2cgPT0gY2xvbmUud2hhdCgpICk7CisgIH0KKyAgY2F0Y2ggKC4uLikgeworICAgIENQUFVOSVRfQVNTRVJUKCBmYWxzZSApOworICB9CisjZW5kaWYKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L2ZhZGFwdGVyLmggYi90ZXN0L3VuaXQvZmFkYXB0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWNjZWFmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L2ZhZGFwdGVyLmgKQEAgLTAsMCArMSw4MCBAQAorI2lmbmRlZiBfZmFkYXB0ZXJfaF8KKyNkZWZpbmUgX2ZhZGFwdGVyX2hfCisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCisvLyB1c2VkIGFzIGFkYXB0b3IncyByZXR1cm4vYXJndW1lbnQgdHlwZSwKKy8vIHRvIGFsbG93IGJpbmRlcnMvY29tcG9zZXJzIHVzYWdlCitzdHJ1Y3QgX192b2lkX3RhZyB7fTsKKworI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkIChfU1RMUF9VU0VfTkFNRVNQQUNFUykKK3VzaW5nIHN0ZDo6dW5hcnlfZnVuY3Rpb247CisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIFJlc3VsdD4KK2NsYXNzIHBvaW50ZXJfdG9fdm9pZF9mdW5jdGlvbiB7Citwcm90ZWN0ZWQ6CisgIFJlc3VsdCAoKnB0cikoKTsKK3B1YmxpYzoKKyAgZXhwbGljaXQgcG9pbnRlcl90b192b2lkX2Z1bmN0aW9uKFJlc3VsdCAoKngpKCkpIDogcHRyKHgpIHt9CisgIFJlc3VsdCBvcGVyYXRvcigpKCkgY29uc3QgeyByZXR1cm4gcHRyKCk7IH0KKyAgUmVzdWx0IG9wZXJhdG9yKCkoX192b2lkX3RhZykgY29uc3QgeyByZXR1cm4gcHRyKCk7IH0KK307CisKKy8vIHRvIGZlZWQgY29tcG9zZXJzCit0ZW1wbGF0ZSA8Y2xhc3MgQXJnMT4KK3N0cnVjdCBwcm9qZWN0dm9pZCA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxBcmcxLF9fdm9pZF90YWc+IHsKKyAgX192b2lkX3RhZyBvcGVyYXRvcigpKGNvbnN0IEFyZzEmIHgpIGNvbnN0IHsgcmV0dXJuIF9fdm9pZF90YWcoKTsgfQorfTsKKworI2lmICFkZWZpbmVkIChfU1RMUF9NRU1CRVJfUE9JTlRFUl9QQVJBTV9CVUcpCisKK3RlbXBsYXRlIDxjbGFzcyBSZXN1bHQ+Citwb2ludGVyX3RvX3ZvaWRfZnVuY3Rpb248UmVzdWx0PiBwdHJfZnVuKFJlc3VsdCAoKngpKCkpIHsKKyAgcmV0dXJuIHBvaW50ZXJfdG9fdm9pZF9mdW5jdGlvbjxSZXN1bHQ+KHgpOworfQorCisvLyBhbHRlcm5hdGUgbmFtZQordGVtcGxhdGUgPGNsYXNzIFJlc3VsdD4KK3BvaW50ZXJfdG9fdm9pZF9mdW5jdGlvbjxSZXN1bHQ+IHB0cl9nZW4oUmVzdWx0ICgqeCkoKSkgeworICByZXR1cm4gcG9pbnRlcl90b192b2lkX2Z1bmN0aW9uPFJlc3VsdD4oeCk7Cit9CisKKyNlbmRpZiAvKiAgIWRlZmluZWQgKF9TVExQX01FTUJFUl9QT0lOVEVSX1BBUkFNX0JVRykgKi8KKwordGVtcGxhdGUgPGNsYXNzIEFyZz4KK2NsYXNzIHBvaW50ZXJfdG9fdW5hcnlfcHJvY2VkdXJlIC8qIDpwdWJsaWMgdW5hcnlfZnVuY3Rpb248QXJnLCBfX3ZvaWRfdGFnPiAqLyB7Citwcm90ZWN0ZWQ6CisgIHR5cGVkZWYgdm9pZCAoKmZ1bl90eXBlKShBcmcpOworICBmdW5fdHlwZSBwdHI7CitwdWJsaWM6CisgIHR5cGVkZWYgQXJnIGFyZ3VtZW50X3R5cGU7CisgIHBvaW50ZXJfdG9fdW5hcnlfcHJvY2VkdXJlKCkge30KKyAgcG9pbnRlcl90b191bmFyeV9wcm9jZWR1cmUoZnVuX3R5cGUgeCkgOiBwdHIoeCkge30KKyAgdm9pZCBvcGVyYXRvcigpIChBcmcgeCkgY29uc3QgeyBwdHIoeCk7IH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBBcmc+CitpbmxpbmUgcG9pbnRlcl90b191bmFyeV9wcm9jZWR1cmU8QXJnPiBwdHJfcHJvYyh2b2lkICgqeCkoQXJnKSkgeworICByZXR1cm4gcG9pbnRlcl90b191bmFyeV9wcm9jZWR1cmU8QXJnPih4KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEFyZzEsIGNsYXNzIEFyZzI+CitjbGFzcyBwb2ludGVyX3RvX2JpbmFyeV9wcm9jZWR1cmUgLyogOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248QXJnMSwgQXJnMiwgX192b2lkX3RhZz4gKi8geworcHJvdGVjdGVkOgorICB0eXBlZGVmIHZvaWQgKCpmdW5fdHlwZSkoQXJnMSwgQXJnMik7CisgIGZ1bl90eXBlIHB0cjsKK3B1YmxpYzoKKyAgdHlwZWRlZiBBcmcxIGZpcnN0X2FyZ3VtZW50X3R5cGU7CisgIHR5cGVkZWYgQXJnMiBzZWNvbmRfYXJndW1lbnRfdHlwZTsKKyAgcG9pbnRlcl90b19iaW5hcnlfcHJvY2VkdXJlKCkge30KKyAgcG9pbnRlcl90b19iaW5hcnlfcHJvY2VkdXJlKGZ1bl90eXBlIHgpIDogcHRyKHgpIHt9CisgIHZvaWQgb3BlcmF0b3IoKSAoQXJnMSB4LCBBcmcyIHkpIGNvbnN0IHsgcHRyKHgsIHkpOyB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgQXJnMSwgY2xhc3MgQXJnMj4KK2lubGluZSBwb2ludGVyX3RvX2JpbmFyeV9wcm9jZWR1cmU8QXJnMSwgQXJnMj4gcHRyX3Byb2Modm9pZCAoKngpKEFyZzEsIEFyZzIpKSB7CisgIHJldHVybiBwb2ludGVyX3RvX2JpbmFyeV9wcm9jZWR1cmU8QXJnMSwgQXJnMj4oeCk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L2ZpYi5oIGIvdGVzdC91bml0L2ZpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNzQwMzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvZmliLmgKQEAgLTAsMCArMSwyMSBAQAorI2lmbmRlZiBfZmliX2gKKyNkZWZpbmUgX2ZpYl9oCitjbGFzcyBGaWJvbmFjY2kKK3sKKyAgcHVibGljOgorICAgIEZpYm9uYWNjaSgpIDogdjEoMCksIHYyKDEpIHt9CisgICAgaW5saW5lIGludCBvcGVyYXRvcigpKCk7CisgIHByaXZhdGU6CisgICAgaW50IHYxOworICAgIGludCB2MjsKK307CisKK2lubGluZSBpbnQKK0ZpYm9uYWNjaTo6b3BlcmF0b3IoKSgpCit7CisgIGludCByID0gdjEgKyB2MjsKKyAgdjEgPSB2MjsKKyAgdjIgPSByOworICByZXR1cm4gdjE7Cit9CisjZW5kaWYgLy8gX2ZpYl9oCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvZmlsbF90ZXN0LmNwcCBiL3Rlc3QvdW5pdC9maWxsX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyZDNmZTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvZmlsbF90ZXN0LmNwcApAQCAtMCwwICsxLDYxIEBACisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgImNwcHVuaXQvY3BwdW5pdF9wcm94eS5oIgorCisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IGRlZmluZWQoX1NUTFBfVVNFX05BTUVTUEFDRVMpCit1c2luZyBuYW1lc3BhY2Ugc3RkOworI2VuZGlmCisKKy8vCisvLyBUZXN0Q2FzZSBjbGFzcworLy8KK2NsYXNzIEZpbGxUZXN0IDogcHVibGljIENQUFVOSVRfTlM6OlRlc3RDYXNlCit7CisgIENQUFVOSVRfVEVTVF9TVUlURShGaWxsVGVzdCk7CisgIENQUFVOSVRfVEVTVChmaWxsMSk7CisgIENQUFVOSVRfVEVTVChmaWxsbjEpOworICBDUFBVTklUX1RFU1RfU1VJVEVfRU5EKCk7CisKK3Byb3RlY3RlZDoKKyAgdm9pZCBmaWxsMSgpOworICB2b2lkIGZpbGxuMSgpOworfTsKKworQ1BQVU5JVF9URVNUX1NVSVRFX1JFR0lTVFJBVElPTihGaWxsVGVzdCk7CisKKy8vCisvLyB0ZXN0cyBpbXBsZW1lbnRhdGlvbgorLy8KK3ZvaWQgRmlsbFRlc3Q6OmZpbGwxKCkKK3sKKyAgdmVjdG9yIDxpbnQ+IHYoMTApOworICBmaWxsKHYuYmVnaW4oKSwgdi5lbmQoKSwgNDIpOworCisgIENQUFVOSVRfQVNTRVJUKHZbMF09PTQyKTsKKyAgQ1BQVU5JVF9BU1NFUlQodlsxXT09NDIpOworICBDUFBVTklUX0FTU0VSVCh2WzJdPT00Mik7CisgIENQUFVOSVRfQVNTRVJUKHZbM109PTQyKTsKKyAgQ1BQVU5JVF9BU1NFUlQodls0XT09NDIpOworICBDUFBVTklUX0FTU0VSVCh2WzVdPT00Mik7CisgIENQUFVOSVRfQVNTRVJUKHZbNl09PTQyKTsKKyAgQ1BQVU5JVF9BU1NFUlQodls3XT09NDIpOworICBDUFBVTklUX0FTU0VSVCh2WzhdPT00Mik7CisgIENQUFVOSVRfQVNTRVJUKHZbOV09PTQyKTsKK30KK3ZvaWQgRmlsbFRlc3Q6OmZpbGxuMSgpCit7CisgIHZlY3RvciA8aW50PiB2KDEwKTsKKyAgZmlsbF9uKHYuYmVnaW4oKSwgdi5zaXplKCksIDQyKTsKKworICBDUFBVTklUX0FTU0VSVCh2WzBdPT00Mik7CisgIENQUFVOSVRfQVNTRVJUKHZbMV09PTQyKTsKKyAgQ1BQVU5JVF9BU1NFUlQodlsyXT09NDIpOworICBDUFBVTklUX0FTU0VSVCh2WzNdPT00Mik7CisgIENQUFVOSVRfQVNTRVJUKHZbNF09PTQyKTsKKyAgQ1BQVU5JVF9BU1NFUlQodls1XT09NDIpOworICBDUFBVTklUX0FTU0VSVCh2WzZdPT00Mik7CisgIENQUFVOSVRfQVNTRVJUKHZbN109PTQyKTsKKyAgQ1BQVU5JVF9BU1NFUlQodls4XT09NDIpOworICBDUFBVTklUX0FTU0VSVCh2WzldPT00Mik7Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvZmluZF90ZXN0LmNwcCBiL3Rlc3QvdW5pdC9maW5kX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MTBmMzMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvZmluZF90ZXN0LmNwcApAQCAtMCwwICsxLDEzNSBAQAorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpbmNsdWRlICJjcHB1bml0L2NwcHVuaXRfcHJveHkuaCIKKworI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkKF9TVExQX1VTRV9OQU1FU1BBQ0VTKQordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyNlbmRpZgorCisvLworLy8gVGVzdENhc2UgY2xhc3MKKy8vCitjbGFzcyBGaW5kVGVzdCA6IHB1YmxpYyBDUFBVTklUX05TOjpUZXN0Q2FzZQoreworICBDUFBVTklUX1RFU1RfU1VJVEUoRmluZFRlc3QpOworICBDUFBVTklUX1RFU1QoZmluZDApOworICBDUFBVTklUX1RFU1QoZmluZDEpOworICBDUFBVTklUX1RFU1QoZmluZGlmMCk7CisgIENQUFVOSVRfVEVTVChmaW5kaWYxKTsKKyAgQ1BQVU5JVF9URVNUKGZpbmRfY2hhcik7CisgIENQUFVOSVRfVEVTVF9TVUlURV9FTkQoKTsKKworcHJvdGVjdGVkOgorICB2b2lkIGZpbmQwKCk7CisgIHZvaWQgZmluZDEoKTsKKyAgdm9pZCBmaW5kaWYwKCk7CisgIHZvaWQgZmluZGlmMSgpOworICB2b2lkIGZpbmRfY2hhcigpOworICBzdGF0aWMgYm9vbCBvZGQoaW50IGFfKTsKKyAgc3RhdGljIGJvb2wgZGl2XzMoaW50IGFfKTsKK307CisKK0NQUFVOSVRfVEVTVF9TVUlURV9SRUdJU1RSQVRJT04oRmluZFRlc3QpOworCisvLworLy8gdGVzdHMgaW1wbGVtZW50YXRpb24KKy8vCit2b2lkIEZpbmRUZXN0OjpmaW5kMCgpCit7CisgIGludCBudW1iZXJzWzEwXSA9IHsgMCwgMSwgNCwgOSwgMTYsIDI1LCAzNiwgNDksIDY0IH07CisKKyAgaW50ICpsb2NhdGlvbiA9IGZpbmQoKGludCopbnVtYmVycywgKGludCopbnVtYmVycyArIDEwLCAyNSk7CisKKyAgQ1BQVU5JVF9BU1NFUlQoKGxvY2F0aW9uIC0gbnVtYmVycyk9PTUpOworCisgIGludCAqb3V0X3JhbmdlID0gZmluZCgoaW50KiludW1iZXJzLCAoaW50KiludW1iZXJzICsgMTAsIDEyOCk7CisKKyAgQ1BQVU5JVF9BU1NFUlQoIG91dF9yYW5nZSA9PSAoaW50ICopKG51bWJlcnMgKyAxMCkgKTsKK30KKworc3RydWN0IEtleQoreworICBpbnQgZGF0YTsKKworICAvKiBUaGlzIG9wZXJhdG9yIHNob3VsZCByYXRoZXIgYmUgZ2xvYmFsIGFuZCBjb21tdXRhdGl2ZQorICAgICBidXQgaW1wbGVtZW50aW5nIGl0IHRoaXMgd2F5IHNob3cgdGhhdCBTVExwb3J0IHVzZWQgdG8KKyAgICAgYXNrIHRvbyBtdWNoIGZyb20gdGhlIHVzZXIgY29kZS4gKi8KKyAgYm9vbCBvcGVyYXRvciA9PSAoaW50IGQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gZGF0YSA9PSBkOworICB9Cit9OworCit2b2lkIEZpbmRUZXN0OjpmaW5kMSgpCit7CisgIGludCB5ZWFyc1tdID0geyAxOTQyLCAxOTUyLCAxOTYyLCAxOTcyLCAxOTgyLCAxOTkyIH07CisKKyAgY29uc3QgdW5zaWduZWQgeWVhckNvdW50ID0gc2l6ZW9mKHllYXJzKSAvIHNpemVvZih5ZWFyc1swXSk7CisgIGludCogbG9jYXRpb24gPSBmaW5kKChpbnQqKXllYXJzLCAoaW50Kil5ZWFycyArIHllYXJDb3VudCwgMTk3Mik7CisKKyAgQ1BQVU5JVF9BU1NFUlQoKGxvY2F0aW9uIC0geWVhcnMpPT0zKTsKK30KKwordm9pZCBGaW5kVGVzdDo6ZmluZGlmMCgpCit7CisgIHsKKyAgICBpbnQgbnVtYmVyc1s2XSA9IHsgMiwgNCwgOCwgMTUsIDMyLCA2NCB9OworICAgIGludCAqbG9jYXRpb24gPSBmaW5kX2lmKChpbnQqKW51bWJlcnMsIChpbnQqKW51bWJlcnMgKyA2LCBvZGQpOworCisgICAgQ1BQVU5JVF9BU1NFUlQoKGxvY2F0aW9uIC0gbnVtYmVycyk9PTMpOworCisgICAgaW50IG51bWJlcnNfZXZlbls2XSA9IHsgMiwgNCwgOCwgMTYsIDMyLCA2NCB9OworCisgICAgaW50ICpvdXRfcmFuZ2UgPSBmaW5kX2lmKChpbnQqKW51bWJlcnNfZXZlbiwgKGludCopbnVtYmVyc19ldmVuICsgNiwgb2RkKTsKKworICAgIENQUFVOSVRfQVNTRVJUKCBvdXRfcmFuZ2UgPT0gKGludCAqKShudW1iZXJzX2V2ZW4gKyA2KSApOworICB9CisKKyAgeworICAgIEtleSBrZXlzWzEwXSA9IHsgezB9LCB7MH0sIHswfSwgezB9LCB7MH0sIHswfSwgezB9LCB7MH0sIHswfSwgezB9IH07CisgICAgS2V5IGNvbnN0KiBrID0gZmluZChrZXlzICsgMCwga2V5cyArIDEwLCA1KTsKKyAgICBDUFBVTklUX0FTU0VSVCggayA9PSBrZXlzICsgMTAgKTsKKyAgfQorfQorCit2b2lkIEZpbmRUZXN0OjpmaW5kaWYxKCkKK3sKKyAgdHlwZWRlZiB2ZWN0b3IgPGludD4gSW50VmVjOworICBJbnRWZWMgdigxMCk7CisgIGZvcihpbnQgaSA9IDA7IChzaXplX3QpaSA8IHYuc2l6ZSgpOyArK2kpCisgICAgdltpXSA9KGkgKyAxKSAqKGkgKyAxKTsKKyAgSW50VmVjOjppdGVyYXRvciBpdGVyOworICBpdGVyID0gZmluZF9pZih2LmJlZ2luKCksIHYuZW5kKCksIGRpdl8zKTsKKyAgQ1BQVU5JVF9BU1NFUlQoKGl0ZXIgLSB2LmJlZ2luKCkpPT0yKTsKK30KKworYm9vbCBGaW5kVGVzdDo6b2RkKGludCBhXykKK3sKKyAgcmV0dXJuIChhXyAlIDIpICE9IDA7Cit9CisKK2Jvb2wgRmluZFRlc3Q6OmRpdl8zKGludCBhXykKK3sKKyAgcmV0dXJuIGFfICUgMyA/IDAgOiAxOworfQorCit2b2lkIEZpbmRUZXN0OjpmaW5kX2NoYXIoKQoreworICBjaGFyIHN0cltdID0gImFiY2RlZmdoaWoiOworICBjaGFyICpwc3RyID0gKGNoYXIqKXN0cjsKKyAgY29uc3QgY2hhciogY3BzdHIgPSAoY29uc3QgY2hhciopc3RyOworICBzaXplX3Qgc3RyX3NpemUgPSBzaXplb2Yoc3RyKSAvIHNpemVvZihjaGFyKTsKKworICBjaGFyICpkID0gZmluZChwc3RyLCBwc3RyICsgc3RyX3NpemUsICdkJyk7CisgIENQUFVOSVRfQVNTRVJUKCAqZCA9PSAnZCcgKTsKKworICBjb25zdCBjaGFyICplID0gZmluZChjcHN0ciwgY3BzdHIgKyBzdHJfc2l6ZSwgJ2UnKTsKKyAgQ1BQVU5JVF9BU1NFUlQoICplID09ICdlJyApOworCisgIGNoYXIgKmxhc3QgPSBmaW5kKHBzdHIsIHBzdHIgKyBzdHJfc2l6ZSwgJ3gnKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIGxhc3QgPT0gcHN0ciArIHN0cl9zaXplICk7CisKKyAgY29uc3QgY2hhciAqY2xhc3QgPSBmaW5kKGNwc3RyLCBjcHN0ciArIHN0cl9zaXplLCAneCcpOworICBDUFBVTklUX0FTU0VSVCggY2xhc3QgPT0gY3BzdHIgKyBzdHJfc2l6ZSApOworfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L2ZpbnNlcnRfdGVzdC5jcHAgYi90ZXN0L3VuaXQvZmluc2VydF90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDUyODllCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L2ZpbnNlcnRfdGVzdC5jcHAKQEAgLTAsMCArMSw1OCBAQAorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8ZGVxdWU+CisKKyNpbmNsdWRlICJjcHB1bml0L2NwcHVuaXRfcHJveHkuaCIKKworI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkKF9TVExQX1VTRV9OQU1FU1BBQ0VTKQordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyNlbmRpZgorCisvLworLy8gVGVzdENhc2UgY2xhc3MKKy8vCitjbGFzcyBGaW5zZXJ0VGVzdCA6IHB1YmxpYyBDUFBVTklUX05TOjpUZXN0Q2FzZQoreworICBDUFBVTklUX1RFU1RfU1VJVEUoRmluc2VydFRlc3QpOworICBDUFBVTklUX1RFU1QoZmluc2VydDEpOworICBDUFBVTklUX1RFU1QoZmluc2VydDIpOworICBDUFBVTklUX1RFU1RfU1VJVEVfRU5EKCk7CisKK3Byb3RlY3RlZDoKKyAgdm9pZCBmaW5zZXJ0MSgpOworICB2b2lkIGZpbnNlcnQyKCk7Cit9OworCitDUFBVTklUX1RFU1RfU1VJVEVfUkVHSVNUUkFUSU9OKEZpbnNlcnRUZXN0KTsKKworLy8KKy8vIHRlc3RzIGltcGxlbWVudGF0aW9uCisvLwordm9pZCBGaW5zZXJ0VGVzdDo6Zmluc2VydDEoKQoreworICBjaGFyIGNvbnN0KiBhcnJheSBbXSA9IHsgImxhdXJpZSIsICJqZW5uaWZlciIsICJsZWlzYSIgfTsKKyAgZGVxdWU8Y2hhciBjb25zdCo+IG5hbWVzOworICBmcm9udF9pbnNlcnRfaXRlcmF0b3I8ZGVxdWU8Y2hhciBjb25zdCo+ID4gZml0KG5hbWVzKTsKKyAgZml0ID0gY29weShhcnJheSwgYXJyYXkgKyAzLCBmcm9udF9pbnNlcnRfaXRlcmF0b3I8ZGVxdWUgPGNoYXIgY29uc3QqPiA+KG5hbWVzKSk7CisKKyAgQ1BQVU5JVF9BU1NFUlQobmFtZXNbMF09PWFycmF5WzJdKTsKKyAgQ1BQVU5JVF9BU1NFUlQobmFtZXNbMV09PWFycmF5WzFdKTsKKyAgQ1BQVU5JVF9BU1NFUlQobmFtZXNbMl09PWFycmF5WzBdKTsKKworICBjb3B5KGFycmF5LCBhcnJheSArIDMsIGZpdCk7CisgIENQUFVOSVRfQVNTRVJUKG5hbWVzWzNdPT1hcnJheVsyXSk7CisgIENQUFVOSVRfQVNTRVJUKG5hbWVzWzRdPT1hcnJheVsxXSk7CisgIENQUFVOSVRfQVNTRVJUKG5hbWVzWzVdPT1hcnJheVswXSk7Cit9CisKK3ZvaWQgRmluc2VydFRlc3Q6OmZpbnNlcnQyKCkKK3sKKyAgY2hhciBjb25zdCogYXJyYXkgW10gPSB7ICJsYXVyaWUiLCAiamVubmlmZXIiLCAibGVpc2EiIH07CisKKyAgZGVxdWU8Y2hhciBjb25zdCo+IG5hbWVzOworICBjb3B5KGFycmF5LCBhcnJheSArIDMsIGZyb250X2luc2VydGVyKG5hbWVzKSk7CisKKyAgQ1BQVU5JVF9BU1NFUlQobmFtZXNbMF09PWFycmF5WzJdKTsKKyAgQ1BQVU5JVF9BU1NFUlQobmFtZXNbMV09PWFycmF5WzFdKTsKKyAgQ1BQVU5JVF9BU1NFUlQobmFtZXNbMl09PWFycmF5WzBdKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9mbG9hdF9oZWFkZXJfdGVzdC5jIGIvdGVzdC91bml0L2Zsb2F0X2hlYWRlcl90ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIzZjI4ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9mbG9hdF9oZWFkZXJfdGVzdC5jCkBAIC0wLDAgKzEsOCBAQAorLyogVGhpcyB0ZXN0IHB1cnBvc2UgaXMgc2ltcGx5IHRvIGNoZWNrIFN0YW5kYXJkIGhlYWRlciBpbmRlcGVuZGFuY3kgdGhhdAorICogaXMgdG8gc2F5IHRoYXQgdGhlIGhlYWRlciBjYW4gYmUgaW5jbHVkZWQgYWxvbmUgd2l0aG91dCBhbnkgcHJldmlvdXMKKyAqIGluY2x1ZGUuCisgKiBBZGRpdGlvbm5hbHksIGZvciBDIFN0YW5kYXJkIGhlYWRlcnMgdGhhdCBTVExwb3J0IGV4cG9zZSwgaXQgY2FuIGFsc28gYmUKKyAqIHVzZWQgdG8gY2hlY2sgdGhhdCBmaWxlcyBpbmNsdWRlZCBieSB0aG9zZSBoZWFkZXJzIGFyZSBjb21wYXRpYmxlIHdpdGgKKyAqIHB1cmUgQyBjb21waWxlcnMuCisgKi8KKyNpbmNsdWRlIDxmbG9hdC5oPgpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L2ZvcmVhY2hfdGVzdC5jcHAgYi90ZXN0L3VuaXQvZm9yZWFjaF90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmZkNTE0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L2ZvcmVhY2hfdGVzdC5jcHAKQEAgLTAsMCArMSw3MyBAQAorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSAiZmFkYXB0ZXIuaCIKKworI2luY2x1ZGUgImNwcHVuaXQvY3BwdW5pdF9wcm94eS5oIgorCisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IGRlZmluZWQoX1NUTFBfVVNFX05BTUVTUEFDRVMpCit1c2luZyBuYW1lc3BhY2Ugc3RkOworI2VuZGlmCisKKy8vCisvLyBUZXN0Q2FzZSBjbGFzcworLy8KK2NsYXNzIEZvcmVhY2hUZXN0IDogcHVibGljIENQUFVOSVRfTlM6OlRlc3RDYXNlCit7CisgIENQUFVOSVRfVEVTVF9TVUlURShGb3JlYWNoVGVzdCk7CisgIENQUFVOSVRfVEVTVChmb3JlYWNoMCk7CisgIENQUFVOSVRfVEVTVChmb3JlYWNoMSk7CisgIENQUFVOSVRfVEVTVF9TVUlURV9FTkQoKTsKKworcHJvdGVjdGVkOgorICB2b2lkIGZvcmVhY2gwKCk7CisgIHZvaWQgZm9yZWFjaDEoKTsKK307CisKK0NQUFVOSVRfVEVTVF9TVUlURV9SRUdJU1RSQVRJT04oRm9yZWFjaFRlc3QpOworCisvLworLy8gdGVzdHMgaW1wbGVtZW50YXRpb24KKy8vCitzdGF0aWMgdm9pZCBpbmNyZWFzZShpbnQmIGFfKQoreworICBhXyArPSAxOworfQordm9pZCBGb3JlYWNoVGVzdDo6Zm9yZWFjaDAoKQoreworICBpbnQgbnVtYmVyc1sxMF0gPSB7IDEsIDEsIDIsIDMsIDUsIDgsIDEzLCAyMSwgMzQsIDU1IH07CisKKyAgZm9yX2VhY2gobnVtYmVycywgbnVtYmVycyArIDEwLCBwdHJfZnVuKGluY3JlYXNlKSk7CisKKyAgQ1BQVU5JVF9BU1NFUlQobnVtYmVyc1swXT09Mik7CisgIENQUFVOSVRfQVNTRVJUKG51bWJlcnNbMV09PTIpOworICBDUFBVTklUX0FTU0VSVChudW1iZXJzWzJdPT0zKTsKKyAgQ1BQVU5JVF9BU1NFUlQobnVtYmVyc1szXT09NCk7CisgIENQUFVOSVRfQVNTRVJUKG51bWJlcnNbNF09PTYpOworICBDUFBVTklUX0FTU0VSVChudW1iZXJzWzVdPT05KTsKKyAgQ1BQVU5JVF9BU1NFUlQobnVtYmVyc1s2XT09MTQpOworICBDUFBVTklUX0FTU0VSVChudW1iZXJzWzddPT0yMik7CisgIENQUFVOSVRfQVNTRVJUKG51bWJlcnNbOF09PTM1KTsKKyAgQ1BQVU5JVF9BU1NFUlQobnVtYmVyc1s5XT09NTYpOworfQorc3RhdGljIHZvaWQgc3FyKGludCYgYV8pCit7CisgIGFfID0gYV8gKiBhXzsKK30KK3ZvaWQgRm9yZWFjaFRlc3Q6OmZvcmVhY2gxKCkKK3sKKyAgdmVjdG9yPGludD4gdjEoMTApOworICBmb3IgKGludCBpID0gMDsgKHNpemVfdClpIDwgdjEuc2l6ZSgpOyArK2kpCisgICAgdjFbaV0gPSBpOworICBmb3JfZWFjaCh2MS5iZWdpbigpLCB2MS5lbmQoKSwgcHRyX2Z1bihzcXIpICk7CisKKyAgQ1BQVU5JVF9BU1NFUlQodjFbMF09PTApOworICBDUFBVTklUX0FTU0VSVCh2MVsxXT09MSk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzJdPT00KTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbM109PTkpOworICBDUFBVTklUX0FTU0VSVCh2MVs0XT09MTYpOworICBDUFBVTklUX0FTU0VSVCh2MVs1XT09MjUpOworICBDUFBVTklUX0FTU0VSVCh2MVs2XT09MzYpOworICBDUFBVTklUX0FTU0VSVCh2MVs3XT09NDkpOworICBDUFBVTklUX0FTU0VSVCh2MVs4XT09NjQpOworICBDUFBVTklUX0FTU0VSVCh2MVs5XT09ODEpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L2ZzdHJlYW1faGVhZGVyX3Rlc3QuY3BwIGIvdGVzdC91bml0L2ZzdHJlYW1faGVhZGVyX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYmUyNjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvZnN0cmVhbV9oZWFkZXJfdGVzdC5jcHAKQEAgLTAsMCArMSwxMCBAQAorLyogVGhpcyB0ZXN0IHB1cnBvc2UgaXMgc2ltcGx5IHRvIGNoZWNrIFN0YW5kYXJkIGhlYWRlciBpbmRlcGVuZGFuY3kgdGhhdAorICogaXMgdG8gc2F5IHRoYXQgdGhlIGhlYWRlciBjYW4gYmUgaW5jbHVkZWQgYWxvbmUgd2l0aG91dCBhbnkgcHJldmlvdXMKKyAqIGluY2x1ZGUuCisgKiBBZGRpdGlvbm5hbHksIGZvciBDIFN0YW5kYXJkIGhlYWRlcnMgdGhhdCBTVExwb3J0IGV4cG9zZSwgaXQgY2FuIGFsc28gYmUKKyAqIHVzZWQgdG8gY2hlY2sgdGhhdCBmaWxlcyBpbmNsdWRlZCBieSB0aG9zZSBoZWFkZXJzIGFyZSBjb21wYXRpYmxlIHdpdGgKKyAqIHB1cmUgQyBjb21waWxlcnMuCisgKi8KKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fSU9TVFJFQU1TKQorIyAgaW5jbHVkZSA8ZnN0cmVhbT4KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L2ZzdHJlYW1fdGVzdC5jcHAgYi90ZXN0L3VuaXQvZnN0cmVhbV90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmE0MWEyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L2ZzdHJlYW1fdGVzdC5jcHAKQEAgLTAsMCArMSw5MTUgQEAKKyNpbmNsdWRlIDxzdHJpbmc+CisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8ICFkZWZpbmVkIChfU1RMUF9VU0VfTk9fSU9TVFJFQU1TKQorIyAgaW5jbHVkZSA8ZnN0cmVhbT4KKyMgIGluY2x1ZGUgPGlvc3RyZWFtPgorIyAgaW5jbHVkZSA8aW9tYW5pcD4KKyMgIGluY2x1ZGUgPHNzdHJlYW0+CisjICBpbmNsdWRlIDx2ZWN0b3I+CisjICBpbmNsdWRlIDxzdGRleGNlcHQ+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjICBpbmNsdWRlICJmdWxsX3N0cmVhbWJ1Zi5oIgorIyAgaW5jbHVkZSAiY3BwdW5pdC9jcHB1bml0X3Byb3h5LmgiCisKKyMgIGlmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkKF9TVExQX1VTRV9OQU1FU1BBQ0VTKQordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyMgIGVuZGlmCisKKy8vVGhlIG1hY3JvIHZhbHVlIGdpdmVzIGFwcHJveGltYXRlbHkgdGhlIGdlbmVyYXRlZCBmaWxlCisvL3NpemUgaW4gR28KKy8vI2RlZmluZSBDSEVDS19CSUdfRklMRSA0CisKKyMgIGlmICghZGVmaW5lZChTVExQT1JUKSAmJiAoZGVmaW5lZCAoX19HTlVDX18pICYmIChfX0dOVUNfXyA+IDMpKSkgfHwgXAorICAgICAgKGRlZmluZWQgKFNUTFBPUlQpICYmICFkZWZpbmVkIChfU1RMUF9OT19DVVNUT01fSU8pICYmICFkZWZpbmVkIChfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVTKSAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgISgoZGVmaW5lZCAoX1NUTFBfTVNWQykgJiYgKF9TVExQX01TVkMgPCAxMzAwKSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmluZWQgKF9fR05VQ19fKSAmJiAoX19HTlVDX18gPCAzKSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmluZWQgKF9fU1VOUFJPX0NDKSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmluZWQgKF9fRE1DX18pICYmIGRlZmluZWQgKF9ETEwpKSkpCisjICAgIGRlZmluZSBET19DVVNUT01fRkFDRVRfVEVTVAorIyAgZW5kaWYKKworLy8KKy8vIFRlc3RDYXNlIGNsYXNzCisvLworY2xhc3MgRnN0cmVhbVRlc3QgOiBwdWJsaWMgQ1BQVU5JVF9OUzo6VGVzdENhc2UKK3sKKyAgQ1BQVU5JVF9URVNUX1NVSVRFKEZzdHJlYW1UZXN0KTsKKyAgQ1BQVU5JVF9URVNUKG91dHB1dCk7CisgIENQUFVOSVRfVEVTVChpbnB1dCk7CisgIENQUFVOSVRfVEVTVChpbnB1dF9jaGFyKTsKKyAgQ1BQVU5JVF9URVNUKGlvKTsKKyAgQ1BQVU5JVF9URVNUKGVycik7CisgIENQUFVOSVRfVEVTVCh0ZWxsZyk7CisgIENQUFVOSVRfVEVTVCh0ZWxscCk7CisgIENQUFVOSVRfVEVTVChzZWVrKTsKKyAgQ1BQVU5JVF9URVNUKGJ1Zik7CisgIENQUFVOSVRfVEVTVChyZGJ1Zik7CisgIENQUFVOSVRfVEVTVChzdHJlYW1idWZfb3V0cHV0KTsKKyAgQ1BQVU5JVF9URVNUKHdpbjMyX2ZpbGVfZm9ybWF0KTsKKyAgQ1BQVU5JVF9URVNUKG51bGxfc3RyZWFtKTsKKyMgIGlmIGRlZmluZWQgKFNUTFBPUlQpICYmIChkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKSB8fCAhZGVmaW5lZCAoX1NUTFBfVVNFX0VYQ0VQVElPTlMpKQorICBDUFBVTklUX0lHTk9SRTsKKyMgIGVuZGlmCisgIENQUFVOSVRfVEVTVChudWxsX2J1Zik7CisjICBpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgIWRlZmluZWQgKF9TVExQX1dJTjMyKQorICBDUFBVTklUX1RFU1Qob2Zmc2V0KTsKKyMgIGVuZGlmCisjICBpZiBkZWZpbmVkIChDSEVDS19CSUdfRklMRSkKKyAgQ1BQVU5JVF9URVNUKGJpZ19maWxlKTsKKyMgIGVuZGlmCisjICBpZiAhZGVmaW5lZCAoRE9fQ1VTVE9NX0ZBQ0VUX1RFU1QpCisgIENQUFVOSVRfSUdOT1JFOworIyAgZW5kaWYKKyAgQ1BQVU5JVF9URVNUKGN1c3RvbV9mYWNldCk7CisgIENQUFVOSVRfVEVTVF9TVUlURV9FTkQoKTsKKworICBwcm90ZWN0ZWQ6CisgICAgdm9pZCBvdXRwdXQoKTsKKyAgICB2b2lkIGlucHV0KCk7CisgICAgdm9pZCBpbnB1dF9jaGFyKCk7CisgICAgdm9pZCBpbygpOworICAgIHZvaWQgZXJyKCk7CisgICAgdm9pZCB0ZWxsZygpOworICAgIHZvaWQgdGVsbHAoKTsKKyAgICB2b2lkIHNlZWsoKTsKKyAgICB2b2lkIGJ1ZigpOworICAgIHZvaWQgcmRidWYoKTsKKyAgICB2b2lkIHN0cmVhbWJ1Zl9vdXRwdXQoKTsKKyAgICB2b2lkIHdpbjMyX2ZpbGVfZm9ybWF0KCk7CisgICAgdm9pZCBudWxsX3N0cmVhbSgpOworICAgIHZvaWQgbnVsbF9idWYoKTsKKyMgIGlmICFkZWZpbmVkIChTVExQT1JUKSB8fCAhZGVmaW5lZCAoX1NUTFBfV0lOMzIpCisgICAgdm9pZCBvZmZzZXQoKTsKKyMgIGVuZGlmCisgICAgdm9pZCBjdXN0b21fZmFjZXQoKTsKKyMgIGlmIGRlZmluZWQgKENIRUNLX0JJR19GSUxFKQorICAgIHZvaWQgYmlnX2ZpbGUoKTsKKyMgIGVuZGlmCit9OworCitDUFBVTklUX1RFU1RfU1VJVEVfUkVHSVNUUkFUSU9OKEZzdHJlYW1UZXN0KTsKKworLy8KKy8vIHRlc3RzIGltcGxlbWVudGF0aW9uCisvLwordm9pZCBGc3RyZWFtVGVzdDo6b3V0cHV0KCkKK3sKKyAgb2ZzdHJlYW0gZiggInRlc3RfZmlsZS50eHQiICk7CisKKyAgZiA8PCAxIDw8ICdcbicgPDwgMi4wIDw8ICdcbicgPDwgImFiY2RcbiIgPDwgImdoayBsbVxuIiA8PCAiYWJjZCBlZiI7CisgIENQUFVOSVRfQVNTRVJUIChmLmdvb2QoKSk7CisgIC8vIENQUFVOSVRfQVNTRVJUKCBzLnN0cigpID09ICIxXG4yXG5hYmNkXG5naGsgbG1cbmFiY2QgZWYiICk7Cit9CisKK3ZvaWQgRnN0cmVhbVRlc3Q6OmlucHV0KCkKK3sKKyAgeworICAgIGlmc3RyZWFtIGYoICJ0ZXN0X2ZpbGUudHh0IiApOworICAgIGludCBpID0gMDsKKyAgICBmID4+IGk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGYuZ29vZCgpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGkgPT0gMSApOworICAgIGRvdWJsZSBkID0gMC4wOworICAgIGYgPj4gZDsKKyAgICBDUFBVTklUX0FTU0VSVCggZi5nb29kKCkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggZCA9PSAyLjAgKTsKKyAgICBzdHJpbmcgc3RyOworICAgIGYgPj4gc3RyOworICAgIENQUFVOSVRfQVNTRVJUKCBmLmdvb2QoKSApOworICAgIENQUFVOSVRfQVNTRVJUKCBzdHIgPT0gImFiY2QiICk7CisgICAgY2hhciBjOworICAgIGYuZ2V0KGMpOyAvLyBleHRyYWN0IG5ld2xpbmUsIHRoYXQgbm90IGV4dHJhY3RlZCBieSBvcGVyYXRvciA+PgorICAgIENQUFVOSVRfQVNTRVJUKCBmLmdvb2QoKSApOworICAgIENQUFVOSVRfQVNTRVJUKCBjID09ICdcbicgKTsKKyAgICBnZXRsaW5lKCBmLCBzdHIgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggZi5nb29kKCkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggc3RyID09ICJnaGsgbG0iICk7CisgICAgZ2V0bGluZSggZiwgc3RyICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGYuZW9mKCkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggc3RyID09ICJhYmNkIGVmIiApOworICB9CisjaWYgZGVmaW5lZCAoU1RMUE9SVCkgJiYgIWRlZmluZWQgKF9TVExQX1VTRV9XSU4zMl9JTykKKyAgeworICAgIGlmc3RyZWFtIGluKCIvdG1wIik7CisgICAgaWYgKGluLmdvb2QoKSkgeworICAgICAgc3RyaW5nIHM7CisgICAgICBnZXRsaW5lKGluLCBzKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBpbi5mYWlsKCkgKTsKKyAgICB9CisgIH0KKyNlbmRpZgorfQorCit2b2lkIEZzdHJlYW1UZXN0OjppbnB1dF9jaGFyKCkKK3sKKyAgY2hhciBidWZbMTZdID0geyAwLCAnMScsICcyJywgJzMnIH07CisgIGlmc3RyZWFtIHMoICJ0ZXN0X2ZpbGUudHh0IiApOworICBzID4+IGJ1ZjsKKworICBDUFBVTklUX0FTU0VSVCggYnVmWzBdID09ICcxJyApOworICBDUFBVTklUX0FTU0VSVCggYnVmWzFdID09IDAgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIGJ1ZlsyXSA9PSAnMicgKTsKK30KKwordm9pZCBGc3RyZWFtVGVzdDo6aW8oKQoreworICBiYXNpY19mc3RyZWFtPGNoYXIsY2hhcl90cmFpdHM8Y2hhcj4gPiBmKCAidGVzdF9maWxlLnR4dCIsIGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQgfCBpb3NfYmFzZTo6dHJ1bmMgKTsKKworICBDUFBVTklUX0FTU0VSVCggZi5pc19vcGVuKCkgKTsKKworICBmIDw8IDEgPDwgJ1xuJyA8PCAyLjAgPDwgJ1xuJyA8PCAiYWJjZFxuIiA8PCAiZ2hrIGxtXG4iIDw8ICJhYmNkIGVmIjsKKworICAvLyBmLmZsdXNoKCk7CisgIGYuc2Vla2coIDAsIGlvc19iYXNlOjpiZWcgKTsKKworICBpbnQgaSA9IDA7CisgIGYgPj4gaTsKKyAgQ1BQVU5JVF9BU1NFUlQoIGYuZ29vZCgpICk7CisgIENQUFVOSVRfQVNTRVJUKCBpID09IDEgKTsKKyAgZG91YmxlIGQgPSAwLjA7CisgIGYgPj4gZDsKKyAgQ1BQVU5JVF9BU1NFUlQoIGQgPT0gMi4wICk7CisgIHN0cmluZyBzOworICBmID4+IHM7CisgIENQUFVOSVRfQVNTRVJUKCBmLmdvb2QoKSApOworICBDUFBVTklUX0FTU0VSVCggcyA9PSAiYWJjZCIgKTsKKyAgY2hhciBjOworICBmLmdldChjKTsgLy8gZXh0cmFjdCBuZXdsaW5lLCB0aGF0IG5vdCBleHRyYWN0ZWQgYnkgb3BlcmF0b3IgPj4KKyAgQ1BQVU5JVF9BU1NFUlQoIGYuZ29vZCgpICk7CisgIENQUFVOSVRfQVNTRVJUKCBjID09ICdcbicgKTsKKyAgZ2V0bGluZSggZiwgcyApOworICBDUFBVTklUX0FTU0VSVCggZi5nb29kKCkgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHMgPT0gImdoayBsbSIgKTsKKyAgZ2V0bGluZSggZiwgcyApOworICBDUFBVTklUX0FTU0VSVCggIWYuZmFpbCgpICk7CisgIENQUFVOSVRfQVNTRVJUKCBzID09ICJhYmNkIGVmIiApOworICBDUFBVTklUX0FTU0VSVCggZi5lb2YoKSApOworfQorCit2b2lkIEZzdHJlYW1UZXN0OjplcnIoKQoreworICBiYXNpY19mc3RyZWFtPGNoYXIsY2hhcl90cmFpdHM8Y2hhcj4gPiBmKCAidGVzdF9maWxlLnR4dCIsIGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQgfCBpb3NfYmFzZTo6dHJ1bmMgKTsKKworICBDUFBVTklUX0FTU0VSVCggZi5pc19vcGVuKCkgKTsKKworICBpbnQgaSA9IDk7CisgIGYgPDwgaTsKKyAgQ1BQVU5JVF9BU1NFUlQoIGYuZ29vZCgpICk7CisgIGkgPSAwOworICBmLnNlZWtnKCAwLCBpb3NfYmFzZTo6YmVnICk7CisgIGYgPj4gaTsKKyAgQ1BQVU5JVF9BU1NFUlQoICFmLmZhaWwoKSApOworICBDUFBVTklUX0FTU0VSVCggaSA9PSA5ICk7CisgIGYgPj4gaTsKKyAgQ1BQVU5JVF9BU1NFUlQoIGYuZmFpbCgpICk7CisgIENQUFVOSVRfQVNTRVJUKCBmLmVvZigpICk7CisgIENQUFVOSVRfQVNTRVJUKCBpID09IDkgKTsKK30KKwordm9pZCBGc3RyZWFtVGVzdDo6dGVsbGcoKQoreworICB7CisgICAgLy8gYm9ndXMgaW9zX2Jhc2U6OmJpbmFyeSBpcyBmb3IgV2lucworICAgIG9mc3RyZWFtIG9mKCJ0ZXN0X2ZpbGUudHh0IiwgaW9zX2Jhc2U6Om91dCB8IGlvc19iYXNlOjpiaW5hcnkgfCBpb3NfYmFzZTo6dHJ1bmMpOworICAgIENQUFVOSVRfQVNTRVJUKCBvZi5pc19vcGVuKCkgKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTA7ICsraSkgeworICAgICAgb2YgPDwgImxpbmUgIiA8PCBzZXRpb3NmbGFncyhpb3NfYmFzZTo6cmlnaHQpIDw8IHNldGZpbGwoJzAnKSA8PCBzZXR3KDIpIDw8IGkgPDwgIlxuIjsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCAhb2YuZmFpbCgpICk7CisgICAgfQorICAgIG9mLmNsb3NlKCk7CisgIH0KKworICB7CisgICAgLy8gYm9ndXMgaW9zX2Jhc2U6OmJpbmFyeSBpcyBmb3IgV2lucworICAgIGlmc3RyZWFtIGlzKCJ0ZXN0X2ZpbGUudHh0IiwgaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6OmJpbmFyeSk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGlzLmlzX29wZW4oKSApOworICAgIGNoYXIgYnVmWzY0XTsKKworICAgIC8vIENQUFVOSVRfQVNTRVJUKCBpcy50ZWxsZygpID09IDAgKTsKKyAgICBzdHJlYW1wb3MgcCA9IDA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1MDsgKytpKSB7CisgICAgICBpcy5yZWFkKGJ1ZiwgMCk7CisgICAgICBDUFBVTklUX0FTU0VSVCggaXMuZ2NvdW50KCkgPT0gMCApOworICAgICAgQ1BQVU5JVF9BU1NFUlQoIGlzLnRlbGxnKCkgPT0gcCApOworICAgICAgaXMucmVhZCggYnVmLCA4ICk7CisgICAgICBDUFBVTklUX0FTU0VSVCggIWlzLmZhaWwoKSApOworICAgICAgQ1BQVU5JVF9BU1NFUlQoIGlzLmdjb3VudCgpID09IDggKTsKKyAgICAgIHAgKz0gODsKKyAgICB9CisgIH0KKworICB7CisgICAgLy8gYm9ndXMgaW9zX2Jhc2U6OmJpbmFyeSBpcyBmb3IgV2lucworICAgIGlmc3RyZWFtIGlzKCJ0ZXN0X2ZpbGUudHh0IiwgaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6OmJpbmFyeSk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGlzLmlzX29wZW4oKSApOworCisgICAgc3RyZWFtcG9zIHAgPSAwOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTA7ICsraSkgeworICAgICAgQ1BQVU5JVF9BU1NFUlQoICFpcy5mYWlsKCkgKTsKKyAgICAgIGlzLnRlbGxnKCk7CisgICAgICBDUFBVTklUX0FTU0VSVCggaXMudGVsbGcoKSA9PSBwICk7CisgICAgICBwICs9IDg7CisgICAgICBpcy5zZWVrZyggcCwgaW9zX2Jhc2U6OmJlZyAgKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCAhaXMuZmFpbCgpICk7CisgICAgfQorICB9CisKKyAgeworICAgIC8vIGJvZ3VzIGlvc19iYXNlOjpiaW5hcnkgaXMgZm9yIFdpbnMKKyAgICBpZnN0cmVhbSBpcygidGVzdF9maWxlLnR4dCIsIGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpiaW5hcnkpOworICAgIENQUFVOSVRfQVNTRVJUKCBpcy5pc19vcGVuKCkgKTsKKworICAgIHN0cmVhbXBvcyBwID0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDUwOyArK2kpIHsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBpcy50ZWxsZygpID09IHAgKTsKKyAgICAgIHAgKz0gODsKKyAgICAgIGlzLnNlZWtnKCA4LCBpb3NfYmFzZTo6Y3VyICk7CisgICAgICBDUFBVTklUX0FTU0VSVCggIWlzLmZhaWwoKSApOworICAgIH0KKyAgfQorfQorCit2b2lkIEZzdHJlYW1UZXN0Ojp0ZWxscCgpCit7CisgIHsKKyAgICBvZnN0cmVhbSBvKCAidGVzdF9maWxlLnR4dCIgKTsKKworICAgIG8gPDwgIjEyMzQ1NiI7CisKKyAgICBDUFBVTklUX0NIRUNLKCBvLnJkYnVmKCktPnB1YnNlZWtvZmYoIDAsIGlvc19iYXNlOjpjdXIsIGlvc19iYXNlOjpvdXQgKSA9PSBvZnN0cmVhbTo6cG9zX3R5cGUoNikgKTsKKyAgICBDUFBVTklUX0NIRUNLKCBvLnRlbGxwKCkgPT0gb2ZzdHJlYW06OnBvc190eXBlKDYpICk7CisgIH0KKyAgeworICAgIG9mc3RyZWFtIG8oICJ0ZXN0X2ZpbGUudHh0IiApOworCisgICAgbyA8PCAiMTIzNDU2Nzg5IjsKKworICAgIENQUFVOSVRfQ0hFQ0soIG8ucmRidWYoKS0+cHVic2Vla29mZiggMCwgaW9zX2Jhc2U6OmN1ciwgaW9zX2Jhc2U6Om91dCApID09IG9mc3RyZWFtOjpwb3NfdHlwZSg5KSApOworICAgIENQUFVOSVRfQ0hFQ0soIG8udGVsbHAoKSA9PSBvZnN0cmVhbTo6cG9zX3R5cGUoOSkgKTsKKyAgfQorICAvKiBBY2NvcmRpbmcgdG8gdGhlIHN0YW5kYXJkCisgICAgIG9mc3RyZWFtIG8oICJ0ZXN0X2ZpbGUudHh0IiwgaW9zX2Jhc2U6OmFwcCB8IGlvc19iYXNlOjpvdXQgKQorICAgICBzaG91bGQgZ2l2ZSB0aGUgc2FtZSBlZmZlY3QgYXMgZm9wZW4oICJ0ZXN0X2ZpbGUudHh0IiwgImEiICkuCisgICAgIFByb2JsZW0gaXMgZm9wZW4oICJ0ZXN0X2ZpbGUudHh0IiwgImEiICkgaGFzIGEgYml0IGRpZmZlcmVudCBiZWhhdmlvdXIKKyAgICAgb24gZGlmZmVyZW50IHBsYXRmb3JtcywgYW5kIHRoaXMgZGlmZmVyZW5jZSBpcyBub3QgY292ZXJlZCBieSBzcGVjaWZpY2F0aW9uLgorICAgICBBZnRlciBmb3BlbiggInRlc3RfZmlsZS50eHQiLCAiYSIgKSBpbiB0aGlzIGNvbnRleHQgZnRlbGwoIGYgKSA9PSA5IGZvcgorICAgICBMaW51eCBhbmQgTWFjIE9TIFggKEkgZXhwZWN0IHRoZSBzYW1lIGZvciBvdGhlcnMgUE9TSVgtbGlrZSBwbGF0Zm9ybXMgdG9vKTsKKyAgICAgb24gV2luZG93cyAoaW5kZXBlbmRlbnRseSBmcm9tIHZlcnNpb24/KSBmdGVsbCggZiApID09IDAsIGkuZS4gd3JpdGUgcG9pbnRlciBub3QKKyAgICAgc2hpZnRlZCB0byBFT0YgKGJ1dCBzaGlmdGVkIHRvIEVPRiBqdXN0IGJlZm9yZSB3cml0ZSwgYXMgZGVzY3JpYmVkIGluIHRoZSBzcGVjcykuCisKKyAgICAgSXQgaXNuJ3Qgc3BlY2lmaWNhdGlvbnMgdmlvbGF0aW9uLCBuZWl0aGVyIGZvciBMaW51eCBhbmQgTWFjIE9TIFggbm9yIGZvciBXaW5kb3dzLgorCisgICAgIFRoZSBjb2RlIGJlbG93IGlzIGludGVuZGVkIHRvIGRlbW9uc3RyYXRlIGFtYmlndWl0eSAoZGVwZW5kYW5jZSBmcm9tIGZvcGVuIGltcGxlbWVudGF0aW9uKS4KKyAgICovCisgIHsKKyAgICAjaWZkZWYgV0lOMzIKKyAgICAvL0luIFdpbmRvd3MsIHN0bHBvcnQgYW5kIGZvcGVuIHVzZSBrZXJuZWwzMi5DcmVhdGVGaWxlIGZvciBvcGVuLiAKKyAgICAvL0ZpbGUgcG9zaXRpb24gaXMgYXQgQk9GIGFmdGVyIG9wZW4sIHVubGVzcyB3ZSBvcGVuIHdpdGggaW9zX2Jhc2U6OmF0ZQorICAgIGxvbmcgZXhwZWN0ZWRfcG9zID0gMDsgCisgICAgI2Vsc2UKKyAgICAvL09uIFVOSVggZmxhdm91cnMsIHN0bHBvcnQgYW5kIGZvcGVuIHVzZSB1bml4J3Mgb3BlbgorICAgIC8vRmlsZSBwb3NpdGlvbiBpcyBhdCBFT0YgYWZ0ZXIgb3BlbgorICAgIC8vCisgICAgLy8zcmQgcG9zc2libGUgc2NlbmFyaW8sICJvdGhlciBwbGF0Zm9ybXMiIC0gX1NUTFBfVVNFX1NURElPX0lPCisgICAgLy9zdGxwb3J0IHVzZXMgZm9wZW4gaGVyZS4gVGhpcyBjYXNlIG1heSBmYWlsIHRoaXMgdGVzdCwgc2luY2UgdGhlIGZpbGUgcG9zaXRpb24gYWZ0ZXIgCisgICAgLy9mb3BlbiBpcyBpbXBsZW1lbnRhdGlvbi1kZXBlbmRlbnQKKyAgICBsb25nIGV4cGVjdGVkX3BvcyA9IDk7CisgICAgI2VuZGlmCisgICAgb2ZzdHJlYW0gbyggInRlc3RfZmlsZS50eHQiLCBpb3NfYmFzZTo6YXBwIHwgaW9zX2Jhc2U6Om91dCApOworICAgIENQUFVOSVRfQ0hFQ0soIG8ucmRidWYoKS0+cHVic2Vla29mZiggMCwgaW9zX2Jhc2U6OmN1ciwgaW9zX2Jhc2U6Om91dCApID09IG9mc3RyZWFtOjpwb3NfdHlwZShleHBlY3RlZF9wb3MpICk7CisgICAgQ1BQVU5JVF9DSEVDSyggby50ZWxscCgpID09IG9mc3RyZWFtOjpwb3NfdHlwZShleHBlY3RlZF9wb3MpICk7CisgIH0KKyAgeyAvLyBmb3IgcmVmZXJlbmNlLCB0byB0ZXN0IGZvcGVuL2Z0ZWxsIGJlaGF2aW91ciBpbiBhcHBlbmQgbW9kZToKKyAgICAjaWZkZWYgV0lOMzIKKyAgICBsb25nIGV4cGVjdGVkX3BvcyA9IDA7CisgICAgI2Vsc2UKKyAgICBsb25nIGV4cGVjdGVkX3BvcyA9IDk7CisgICAgI2VuZGlmCisgICAgRklMRSogZiA9IGZvcGVuKCAidGVzdF9maWxlLnR4dCIsICJhIiApOworICAgIENQUFVOSVRfQ0hFQ0soIGZ0ZWxsKCBmICkgPT0gZXhwZWN0ZWRfcG9zICk7CisgICAgZmNsb3NlKCBmICk7CisgIH0KKyAgeworICAgIC8vSW4gYXBwZW5kIG1vZGUsIGZpbGUgaXMgcG9zaXRpb25lZCBhdCBFT0YganVzdCBiZWZvcmUgYSB3cml0ZS4gCisgICAgLy8gQWZ0ZXIgYSB3cml0ZSwgZmlsZSBpcyBhdCBFT0YuIFRoaXMgaXMgaW1wbGVtZW50YXRpb24taW5kZXBlbmRlbnQuICAKKyAgICBvZnN0cmVhbSBvKCAidGVzdF9maWxlLnR4dCIsIGlvc19iYXNlOjphcHAgfCBpb3NfYmFzZTo6b3V0ICk7CisgICAgbyA8PCAiWCI7CisgICAgQ1BQVU5JVF9DSEVDSyggby5yZGJ1ZigpLT5wdWJzZWVrb2ZmKCAwLCBpb3NfYmFzZTo6Y3VyLCBpb3NfYmFzZTo6b3V0ICkgPT0gb2ZzdHJlYW06OnBvc190eXBlKDEwKSApOworICAgIENQUFVOSVRfQ0hFQ0soIG8udGVsbHAoKSA9PSBvZnN0cmVhbTo6cG9zX3R5cGUoMTApICk7CisgIH0KK30KKwordm9pZCBGc3RyZWFtVGVzdDo6YnVmKCkKK3sKKyAgZnN0cmVhbSBzcyggInRlc3RfZmlsZS50eHQiLCBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0IHwgaW9zX2Jhc2U6OmJpbmFyeSB8IGlvc19iYXNlOjp0cnVuYyApOworCisgIHNzIDw8ICIxMjM0NTY3XG44OVxuIjsKKyAgc3Muc2Vla2coIDAsIGlvc19iYXNlOjpiZWcgKTsKKyAgY2hhciBidWZbMTBdOworICBidWZbN10gPSAneCc7CisgIHNzLmdldCggYnVmLCAxMCApOworICBDUFBVTklUX0FTU0VSVCggIXNzLmZhaWwoKSApOworICBDUFBVTklUX0FTU0VSVCggYnVmWzBdID09ICcxJyApOworICBDUFBVTklUX0FTU0VSVCggYnVmWzFdID09ICcyJyApOworICBDUFBVTklUX0FTU0VSVCggYnVmWzJdID09ICczJyApOworICBDUFBVTklUX0FTU0VSVCggYnVmWzNdID09ICc0JyApOworICBDUFBVTklUX0FTU0VSVCggYnVmWzRdID09ICc1JyApOworICBDUFBVTklUX0FTU0VSVCggYnVmWzVdID09ICc2JyApOworICBDUFBVTklUX0FTU0VSVCggYnVmWzZdID09ICc3JyApOyAvLyAyNy42LjEuMyBwYXJhZ3JhcGggMTAsIHBhcmFncmFwaCA3CisgIENQUFVOSVRfQVNTRVJUKCBidWZbN10gPT0gMCApOyAvLyAyNy42LjEuMyBwYXJhZ3JhcGggOAorICBjaGFyIGM7CisgIHNzLmdldChjKTsKKyAgQ1BQVU5JVF9BU1NFUlQoICFzcy5mYWlsKCkgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIGMgPT0gJ1xuJyApOyAvLyAyNy42LjEuMyBwYXJhZ3JhcGggMTAsIHBhcmFncmFwaCA3CisgIHNzLmdldChjKTsKKyAgQ1BQVU5JVF9BU1NFUlQoICFzcy5mYWlsKCkgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIGMgPT0gJzgnICk7Cit9CisKK3ZvaWQgRnN0cmVhbVRlc3Q6OnNlZWsoKQoreworICB7CisgICAgLy8gVGVzdCBpbiBiaW5hcnkgbW9kZToKKyAgICB7CisgICAgICBmc3RyZWFtIHMoICJ0ZXN0X2ZpbGUudHh0IiwgaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6Om91dCB8IGlvc19iYXNlOjpiaW5hcnkgfCBpb3NfYmFzZTo6dHJ1bmMgKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBzICk7CisKKyAgICAgIHMgPDwgIjEyMzQ1Njc4OTBcbiI7CisgICAgICBDUFBVTklUX0FTU0VSVCggcyApOworICAgIH0KKworICAgIGNoYXIgYjFbXSA9IHsgJ3gnLCAneCcsICd4JywgJ3gnLCAneCcsICd4JywgJ3gnLCAneCcsICd4JywgJ3gnLCAneCcsICd4JywgJ3gnLCAneCcsICd4JywgJ3gnLCAneCcsICd4JywgJ3gnLCAneCcgfTsKKyAgICBmc3RyZWFtIHMoICJ0ZXN0X2ZpbGUudHh0IiwgaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6Om91dCB8IGlvc19iYXNlOjpiaW5hcnkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggcyApOworCisgICAgaW50IGNoYXJzX3JlYWQgPSAoaW50KXMucmRidWYoKS0+c2dldG4oIGIxLCBzaXplb2YoYjEpICk7CisgICAgQ1BQVU5JVF9DSEVDSyggY2hhcnNfcmVhZCA9PSAxMSApOworICAgIENQUFVOSVRfQ0hFQ0soIGIxWzldID09ICcwJyApOworICAgIENQUFVOSVRfQVNTRVJUKCBzLnJkYnVmKCktPnB1YnNlZWtvZmYoIDAsIGlvc19iYXNlOjpjdXIgKSA9PSBmc3RyZWFtOjpwb3NfdHlwZShjaGFyc19yZWFkKSApOworICAgIENQUFVOSVRfQVNTRVJUKCBzLnJkYnVmKCktPnB1YnNlZWtvZmYoIC1jaGFyc19yZWFkLCBpb3NfYmFzZTo6Y3VyICkgPT0gZnN0cmVhbTo6cG9zX3R5cGUoMCkgKTsKKworICAgIGNoYXIgYjJbMTBdID0geyAneScsICd5JywgJ3knLCAneScsICd5JywgJ3knLCAneScsICd5JywgJ3knLCAneScgfTsKKworICAgIENQUFVOSVRfQVNTRVJUKCBzLnJkYnVmKCktPnNnZXRuKCBiMiwgMTAgKSA9PSAxMCApOworICAgIENQUFVOSVRfQ0hFQ0soIGIyWzldID09ICcwJyApOworICB9CisKKyAgeworICAgIC8vIFRlc3QgaW4gdGV4dCBtb2RlOgorICAgIHsKKyAgICAgIGZzdHJlYW0gcyggInRlc3RfZmlsZS50eHQiLCBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0IHwgaW9zX2Jhc2U6OnRydW5jICk7CisgICAgICBDUFBVTklUX0FTU0VSVCggcyApOworCisgICAgICBzIDw8ICIxMjM0NTY3ODkwXG4iOworICAgICAgQ1BQVU5JVF9BU1NFUlQoIHMgKTsKKyAgICB9CisKKyAgICBjaGFyIGIxW10gPSB7ICd4JywgJ3gnLCAneCcsICd4JywgJ3gnLCAneCcsICd4JywgJ3gnLCAneCcsICd4JywgJ3gnLCAneCcsICd4JywgJ3gnLCAneCcsICd4JywgJ3gnLCAneCcsICd4JywgJ3gnIH07CisgICAgZnN0cmVhbSBzKCAidGVzdF9maWxlLnR4dCIsIGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggcyApOworCisgICAgaW50IGNoYXJzX3JlYWQgPSAoaW50KXMucmRidWYoKS0+c2dldG4oIGIxLCBzaXplb2YoYjEpICk7CisgICAgQ1BQVU5JVF9DSEVDSyggY2hhcnNfcmVhZCA9PSAxMSApOworICAgIENQUFVOSVRfQ0hFQ0soIGIxWzldID09ICcwJyApOworCisgICAgZnN0cmVhbTo6cG9zX3R5cGUgcG9zID0gcy5yZGJ1ZigpLT5wdWJzZWVrb2ZmKDAsIGlvc19iYXNlOjpjdXIpOworICAgIC8vIERlcGVuZGluZyBvbiBob3cgJ1xuJyBpcyB3cml0dGVuIGluIGZpbGUsIGZpbGUgcG9zaXRpb24gY2FuIGJlIGdyZWF0ZXIgb3IgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBjaGFyc19yZWFkIHJlYWQuCisgICAgc3RyZWFtb2ZmIG9mZnNldCA9IHBvczsKKyAgICBDUFBVTklUX0FTU0VSVCggb2Zmc2V0ID49IGNoYXJzX3JlYWQgKTsKKyAgICBvZmZzZXQgPSBzLnJkYnVmKCktPnB1YnNlZWtvZmYoIC1vZmZzZXQsIGlvc19iYXNlOjpjdXIgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggb2Zmc2V0ID09IDAgKTsKKworICAgIGNoYXIgYjJbMTBdID0geyAneScsICd5JywgJ3knLCAneScsICd5JywgJ3knLCAneScsICd5JywgJ3knLCAneScgfTsKKworICAgIENQUFVOSVRfQVNTRVJUKCBzLnJkYnVmKCktPnNnZXRuKCBiMiwgNSApID09IDUgKTsKKyAgICBDUFBVTklUX0NIRUNLKCBiMls0XSA9PSAnNScgKTsKKworICAgIHBvcyA9IHMucmRidWYoKS0+cHVic2Vla29mZigwLCBpb3NfYmFzZTo6Y3VyKTsKKyAgICBDUFBVTklUX0FTU0VSVCggcG9zID09IGZzdHJlYW06OnBvc190eXBlKDUpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHMucmRidWYoKS0+cHVic2Vla29mZigtNSwgaW9zX2Jhc2U6OmN1cikgPT0gZnN0cmVhbTo6cG9zX3R5cGUoMCkgKTsKKyAgfQorCisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IFwKKyAgICAoIWRlZmluZWQgKF9TVExQX05PX1dDSEFSX1QpICYmIGRlZmluZWQgKF9TVExQX1VTRV9FWENFUFRJT05TKSkKKyAgeworICAgIC8vIFRlc3Qgd2l0aCBhIHdhcmlhYmxlIGVuY29kaW5nOgorICAgIGxvY2FsZSBsb2M7CisgICAgdHJ5CisgICAgeworICAgICAgbG9jYWxlIHRtcChsb2NhbGU6OmNsYXNzaWMoKSwgbmV3IGNvZGVjdnRfYnluYW1lPHdjaGFyX3QsIGNoYXIsIG1ic3RhdGVfdD4oIi5VVEY4IikpOworICAgICAgbG9jID0gdG1wOworICAgIH0KKyAgICBjYXRjaCAoY29uc3QgcnVudGltZV9lcnJvciYpCisgICAgeworICAgICAgLy8gTG9jYWxpemF0aW9uIG5vIHN1cHBvcnRlZCBzbyBubyB0ZXN0OgorICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHsKKyAgICAgIHdmc3RyZWFtIHMoICJ0ZXN0X2ZpbGUudHh0IiwgaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6Om91dCB8IGlvc19iYXNlOjp0cnVuYyApOworICAgICAgQ1BQVU5JVF9BU1NFUlQoIHMgKTsKKyAgICAgIHMuaW1idWUobG9jKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBzICk7CisKKyAgICAgIHMgPDwgTCIxMjM0NTY3ODkwXG4iOworICAgICAgQ1BQVU5JVF9BU1NFUlQoIHMgKTsKKyAgICB9CisKKyAgICB3Y2hhcl90IGIxW10gPSB7IEwneCcsIEwneCcsIEwneCcsIEwneCcsIEwneCcsIEwneCcsIEwneCcsIEwneCcsIEwneCcsIEwneCcsIEwneCcsIEwneCcsIEwneCcsIEwneCcsIEwneCcsIEwneCcsIEwneCcsIEwneCcsIEwneCcsIEwneCcgfTsKKyAgICB3ZnN0cmVhbSBzKCAidGVzdF9maWxlLnR4dCIsIGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggcyApOworICAgIHMuaW1idWUobG9jKTsKKyAgICBDUFBVTklUX0FTU0VSVCggcyApOworCisgICAgaW50IGNoYXJzX3JlYWQgPSAoaW50KXMucmRidWYoKS0+c2dldG4oIGIxLCBzaXplb2YoYjEpIC8gc2l6ZW9mKHdjaGFyX3QpICk7CisgICAgQ1BQVU5JVF9DSEVDSyggY2hhcnNfcmVhZCA9PSAxMSApOworICAgIENQUFVOSVRfQ0hFQ0soIGIxWzldID09IEwnMCcgKTsKKworICAgIGZzdHJlYW06OnBvc190eXBlIHBvcyA9IHMucmRidWYoKS0+cHVic2Vla29mZigwLCBpb3NfYmFzZTo6Y3VyKTsKKyAgICAvLyBEZXBlbmRpbmcgb24gaG93ICdcbicgaXMgd3JpdHRlbiBpbiBmaWxlLCBmaWxlIHBvc2l0aW9uIGNhbiBiZSBncmVhdGVyIG9yIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgY2hhcnNfcmVhZCByZWFkLgorICAgIHN0cmVhbW9mZiBvZmYgPSBwb3M7CisgICAgQ1BQVU5JVF9BU1NFUlQoIG9mZiA+PSBjaGFyc19yZWFkICk7CisgICAgb2ZmID0gcy5yZGJ1ZigpLT5wdWJzZWVrb2ZmKC1vZmYsIGlvc19iYXNlOjpjdXIpOworICAgIENQUFVOSVRfQVNTRVJUKCBvZmYgPT0gLTEgKTsKKyAgICBvZmYgPSBzLnJkYnVmKCktPnB1YnNlZWtvZmYoMCwgaW9zX2Jhc2U6OmJlZyk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIG9mZiA9PSAwICk7CisKKyAgICB3Y2hhcl90IGIyWzEwXSA9IHsgTCd5JywgTCd5JywgTCd5JywgTCd5JywgTCd5JywgTCd5JywgTCd5JywgTCd5JywgTCd5JywgTCd5JyB9OworCisgICAgQ1BQVU5JVF9BU1NFUlQoIHMucmRidWYoKS0+c2dldG4oIGIyLCA1ICkgPT0gNSApOworICAgIENQUFVOSVRfQ0hFQ0soIGIyWzRdID09IEwnNScgKTsKKworICAgIHBvcyA9IHMucmRidWYoKS0+cHVic2Vla29mZigwLCBpb3NfYmFzZTo6Y3VyKTsKKyAgICBDUFBVTklUX0FTU0VSVCggcG9zID09IGZzdHJlYW06OnBvc190eXBlKDUpICk7CisgICAgLy9DUFBVTklUX0FTU0VSVCggcy5yZGJ1ZigpLT5wdWJzZWVrb2ZmKC01LCBpb3NfYmFzZTo6Y3VyKSA9PSBmc3RyZWFtOjpwb3NfdHlwZSgwKSApOworICB9CisjZW5kaWYKK30KKwordm9pZCBGc3RyZWFtVGVzdDo6cmRidWYoKQoreworICBmc3RyZWFtIHNzKCAidGVzdF9maWxlLnR4dCIsIGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQgfCBpb3NfYmFzZTo6YmluYXJ5IHwgaW9zX2Jhc2U6OnRydW5jICk7CisKKyAgc3MgPDwgIjEyMzQ1Njdcbjg5XG4iOworICBzcy5zZWVrZyggMCwgaW9zX2Jhc2U6OmJlZyApOworCisgIG9zdHJpbmdzdHJlYW0gb3M7CisgIHNzLmdldCggKm9zLnJkYnVmKCksICdcbicgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoICFzcy5mYWlsKCkgKTsKKyAgY2hhciBjOworICBzcy5nZXQoYyk7CisgIENQUFVOSVRfQVNTRVJUKCAhc3MuZmFpbCgpICk7CisgIENQUFVOSVRfQVNTRVJUKCBjID09ICdcbicgKTsgLy8gMjcuNi4xLjMgcGFyYWdyYXBoIDEyCisgIENQUFVOSVRfQVNTRVJUKCBvcy5zdHIoKSA9PSAiMTIzNDU2NyIgKTsKK30KKwordm9pZCBGc3RyZWFtVGVzdDo6c3RyZWFtYnVmX291dHB1dCgpCit7CisgIHsKKyAgICBvZnN0cmVhbSBvZnN0cigidGVzdF9maWxlLnR4dCIsIGlvc19iYXNlOjpiaW5hcnkpOworICAgIGlmICghb2ZzdHIpCisgICAgICAvL05vIHRlc3QgaWYgd2UgY2Fubm90IGNyZWF0ZSB0aGUgZmlsZQorICAgICAgcmV0dXJuOworICAgIG9mc3RyIDw8ICIwMTIzNDU2Nzg5MDEyMzQ1Njc4OSI7CisgICAgQ1BQVU5JVF9BU1NFUlQoIG9mc3RyICk7CisgIH0KKworICB7CisgICAgaWZzdHJlYW0gaW4oInRlc3RfZmlsZS50eHQiLCBpb3NfYmFzZTo6YmluYXJ5KTsKKyAgICBDUFBVTklUX0FTU0VSVCggaW4gKTsKKworICAgIGZ1bGxfc3RyZWFtYnVmIGZ1bGxfYnVmKDEwKTsKKyAgICBvc3RyZWFtIG91dCgmZnVsbF9idWYpOworICAgIENQUFVOSVRfQVNTRVJUKCBvdXQgKTsKKworICAgIG91dCA8PCBpbi5yZGJ1ZigpOworICAgIENQUFVOSVRfQVNTRVJUKCBvdXQgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggaW4gKTsKKyAgICBDUFBVTklUX0FTU0VSVCggZnVsbF9idWYuc3RyKCkgPT0gIjAxMjM0NTY3ODkiICk7CisKKyAgICBvdXQgPDwgaW4ucmRidWYoKTsKKyAgICBDUFBVTklUX0FTU0VSVCggb3V0LmZhaWwoKSApOworICAgIENQUFVOSVRfQVNTRVJUKCBpbiApOworCisgICAgb3N0cmluZ3N0cmVhbSBvc3RyOworICAgIG9zdHIgPDwgaW4ucmRidWYoKTsKKyAgICBDUFBVTklUX0FTU0VSVCggb3N0ciApOworICAgIENQUFVOSVRfQVNTRVJUKCBpbiApOworICAgIENQUFVOSVRfQVNTRVJUKCBvc3RyLnN0cigpID09ICIwMTIzNDU2Nzg5IiApOworICB9CisKKyMgIGlmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkIChfU1RMUF9VU0VfRVhDRVBUSU9OUykKKyAgeworICAgIC8vSWYgdGhlIG91dHB1dCBzdHJlYW0gYnVmZmVyIHRocm93czoKKyAgICBpZnN0cmVhbSBpbigidGVzdF9maWxlLnR4dCIsIGlvc19iYXNlOjpiaW5hcnkpOworICAgIENQUFVOSVRfQVNTRVJUKCBpbiApOworCisgICAgZnVsbF9zdHJlYW1idWYgZnVsbF9idWYoMTAsIHRydWUpOworICAgIG9zdHJlYW0gb3V0KCZmdWxsX2J1Zik7CisgICAgQ1BQVU5JVF9BU1NFUlQoIG91dCApOworCisgICAgb3V0IDw8IGluLnJkYnVmKCk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIG91dC5iYWQoKSApOworICAgIENQUFVOSVRfQVNTRVJUKCBpbiApOworICAgIC8vb3V0IGlzIGJhZCB3ZSBoYXZlIG5vIGd1YXJhbnR5IG9uIHdoYXQgaGFzIGJlZW4gZXh0cmFjdGVkOgorICAgIC8vQ1BQVU5JVF9BU1NFUlQoIGZ1bGxfYnVmLnN0cigpID09ICIwMTIzNDU2Nzg5IiApOworCisgICAgb3V0LmNsZWFyKCk7CisgICAgb3V0IDw8IGluLnJkYnVmKCk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIG91dC5mYWlsKCkgJiYgb3V0LmJhZCgpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGluICk7CisKKyAgICBvc3RyaW5nc3RyZWFtIG9zdHI7CisgICAgb3N0ciA8PCBpbi5yZGJ1ZigpOworICAgIENQUFVOSVRfQVNTRVJUKCBvc3RyICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGluICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIG9zdHIuc3RyKCkgPT0gIjAxMjM0NTY3ODkiICk7CisgIH0KKyMgIGVuZGlmCit9CisKK3ZvaWQgRnN0cmVhbVRlc3Q6OndpbjMyX2ZpbGVfZm9ybWF0KCkKK3sKKyAgY29uc3QgY2hhciogZmlsZV9uYW1lID0gIndpbjMyX2ZpbGVfZm9ybWF0LnRtcCI7CisgIGNvbnN0IHNpemVfdCBuYl9saW5lcyA9IDIwNDk7CisgIHsKKyAgICBvZnN0cmVhbSBvdXQoZmlsZV9uYW1lKTsKKyAgICBDUFBVTklUX0FTU0VSVCggb3V0Lmdvb2QoKSApOworICAgIG91dCA8PCAnYSc7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuYl9saW5lcyAtIDE7ICsraSkgeworICAgICAgb3V0IDw8ICdcbic7CisgICAgfQorICAgIG91dCA8PCAnXHInOworICAgIENQUFVOSVRfQVNTRVJUKCBvdXQuZ29vZCgpICk7CisgIH0KKyAgeworICAgIGlmc3RyZWFtIGluKGZpbGVfbmFtZSk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGluLmdvb2QoKSApOworICAgIHN0cmluZyBsaW5lLCBsYXN0X2xpbmU7CisgICAgc2l6ZV90IG5iX3JlYWRfbGluZXMgPSAwOworICAgIHdoaWxlIChnZXRsaW5lKGluLCBsaW5lKSkgeworICAgICAgKytuYl9yZWFkX2xpbmVzOworICAgICAgbGFzdF9saW5lID0gbGluZTsKKyAgICB9CisgICAgQ1BQVU5JVF9BU1NFUlQoIGluLmVvZigpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIG5iX3JlYWRfbGluZXMgPT0gbmJfbGluZXMgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggIWxhc3RfbGluZS5lbXB0eSgpICYmIChsYXN0X2xpbmVbMF0gPT0gJ1xyJykgKTsKKyAgfQorfQorCisjaWYgZGVmaW5lZCAoRE9fQ1VTVE9NX0ZBQ0VUX1RFU1QpCitzdHJ1Y3QgbXlfc3RhdGUgeworICBjaGFyIGR1bW15OworfTsKKworc3RydWN0IG15X3RyYWl0cyA6IHB1YmxpYyBjaGFyX3RyYWl0czxjaGFyPiB7CisgIHR5cGVkZWYgbXlfc3RhdGUgc3RhdGVfdHlwZTsKKyAgdHlwZWRlZiBmcG9zPHN0YXRlX3R5cGU+IHBvc190eXBlOworfTsKKworI2lmICFkZWZpbmVkIChTVExQT1JUKQorLy9TVExwb3J0IGdyYW50IGEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiwgb3RoZXIgU3RhbmRhcmQgbGlicyBpbXBsZW1lbnRhdGlvbgorLy9kbyBub3QgbmVjZXNzYXJpbHkgZG8gdGhlIHNhbWU6CituYW1lc3BhY2Ugc3RkIHsKKyAgdGVtcGxhdGUgPD4KKyAgY2xhc3MgY29kZWN2dDxjaGFyLCBjaGFyLCBteV9zdGF0ZT4KKyAgICA6IHB1YmxpYyBsb2NhbGU6OmZhY2V0LCBwdWJsaWMgY29kZWN2dF9iYXNlIHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgY2hhciBpbnRlcm5fdHlwZTsKKyAgICB0eXBlZGVmIGNoYXIgZXh0ZXJuX3R5cGU7CisgICAgdHlwZWRlZiBteV9zdGF0ZSBzdGF0ZV90eXBlOworCisgICAgZXhwbGljaXQgY29kZWN2dChzaXplX3QgX19yZWZzID0gMCkgOiBsb2NhbGU6OmZhY2V0KF9fcmVmcykge30KKyAgICByZXN1bHQgb3V0KHN0YXRlX3R5cGUmLAorICAgICAgICAgICAgICAgY29uc3QgaW50ZXJuX3R5cGUqICBfX2Zyb20sCisgICAgICAgICAgICAgICBjb25zdCBpbnRlcm5fdHlwZSosCisgICAgICAgICAgICAgICBjb25zdCBpbnRlcm5fdHlwZSomIF9fZnJvbV9uZXh0LAorICAgICAgICAgICAgICAgZXh0ZXJuX3R5cGUqICAgICAgICBfX3RvLAorICAgICAgICAgICAgICAgZXh0ZXJuX3R5cGUqLAorICAgICAgICAgICAgICAgZXh0ZXJuX3R5cGUqJiAgICAgICBfX3RvX25leHQpIGNvbnN0CisgICAgeyBfX2Zyb21fbmV4dCA9IF9fZnJvbTsgX190b19uZXh0ICAgPSBfX3RvOyByZXR1cm4gbm9jb252OyB9CisKKyAgICByZXN1bHQgaW4gKHN0YXRlX3R5cGUmLAorICAgICAgICAgICAgICAgY29uc3QgZXh0ZXJuX3R5cGUqICBfX2Zyb20sCisgICAgICAgICAgICAgICBjb25zdCBleHRlcm5fdHlwZSosCisgICAgICAgICAgICAgICBjb25zdCBleHRlcm5fdHlwZSomIF9fZnJvbV9uZXh0LAorICAgICAgICAgICAgICAgaW50ZXJuX3R5cGUqICAgICAgICBfX3RvLAorICAgICAgICAgICAgICAgaW50ZXJuX3R5cGUqLAorICAgICAgICAgICAgICAgaW50ZXJuX3R5cGUqJiAgICAgICBfX3RvX25leHQpIGNvbnN0CisgICAgeyBfX2Zyb21fbmV4dCA9IF9fZnJvbTsgX190b19uZXh0ID0gX190bzsgcmV0dXJuIG5vY29udjsgfQorCisgICAgcmVzdWx0IHVuc2hpZnQoc3RhdGVfdHlwZSYsCisgICAgICAgICAgICAgICAgICAgZXh0ZXJuX3R5cGUqIF9fdG8sCisgICAgICAgICAgICAgICAgICAgZXh0ZXJuX3R5cGUqLAorICAgICAgICAgICAgICAgICAgIGV4dGVybl90eXBlKiYgX190b19uZXh0KSBjb25zdAorICAgIHsgX190b19uZXh0ID0gX190bzsgcmV0dXJuIG5vY29udjsgfQorCisgICAgaW50IGVuY29kaW5nKCkgY29uc3QgdGhyb3coKQorICAgIHsgcmV0dXJuIDE7IH0KKworICAgIGJvb2wgYWx3YXlzX25vY29udigpIGNvbnN0IHRocm93KCkKKyAgICB7IHJldHVybiB0cnVlOyB9CisKKyAgICBpbnQgbGVuZ3RoKGNvbnN0IHN0YXRlX3R5cGUmLAorICAgICAgICAgICAgICAgY29uc3QgZXh0ZXJuX3R5cGUqIF9fZnJvbSwKKyAgICAgICAgICAgICAgIGNvbnN0IGV4dGVybl90eXBlKiBfX2VuZCwKKyAgICAgICAgICAgICAgIHNpemVfdCBfX21heCkgY29uc3QKKyAgICB7IHJldHVybiAoaW50KW1pbihzdGF0aWNfY2FzdDxzaXplX3Q+KF9fZW5kIC0gX19mcm9tKSwgX19tYXgpOyB9CisKKyAgICBpbnQgbWF4X2xlbmd0aCgpIGNvbnN0IHRocm93KCkKKyAgICB7IHJldHVybiAxOyB9CisKKyAgICBzdGF0aWMgbG9jYWxlOjppZCBpZDsKKyAgfTsKKworICBsb2NhbGU6OmlkIGNvZGVjdnQ8Y2hhciwgY2hhciwgbXlfc3RhdGU+OjppZDsKK30KKyMgIGVsc2UKKyMgICAgaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKSAmJiAoX19CT1JMQU5EQ19fIDwgMHg1OTApCit0ZW1wbGF0ZSA8PgorbG9jYWxlOjppZCBjb2RlY3Z0PGNoYXIsIGNoYXIsIG15X3N0YXRlPjo6aWQ7CisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKK3ZvaWQgRnN0cmVhbVRlc3Q6OmN1c3RvbV9mYWNldCgpCit7CisjaWYgZGVmaW5lZCAoRE9fQ1VTVE9NX0ZBQ0VUX1RFU1QpCisgIGNvbnN0IGNoYXIqIGZpbGVOYW1lID0gInRlc3RfZmlsZS50eHQiOworICAvL0ZpbGUgcHJlcGFyYXRpb246CisgIHsKKyAgICBvZnN0cmVhbSBvZnN0cihmaWxlTmFtZSwgaW9zX2Jhc2U6OmJpbmFyeSk7CisgICAgb2ZzdHIgPDwgIjAxMjM0NTY3ODkiOworICAgIENQUFVOSVRfQVNTRVJUKCBvZnN0ciApOworICB9CisKKyAgeworICAgIHR5cGVkZWYgYmFzaWNfaWZzdHJlYW08Y2hhciwgbXlfdHJhaXRzPiBteV9pZnN0cmVhbTsKKyAgICB0eXBlZGVmIGJhc2ljX3N0cmluZzxjaGFyLCBteV90cmFpdHM+IG15X3N0cmluZzsKKworICAgIG15X2lmc3RyZWFtIGlmc3RyKGZpbGVOYW1lKTsKKyAgICBDUFBVTklUX0FTU0VSVCggaWZzdHIgKTsKKworIyAgaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IGRlZmluZWQgKF9TVExQX1VTRV9FWENFUFRJT05TKQorICAgIGlmc3RyLmltYnVlKGxvY2FsZTo6Y2xhc3NpYygpKTsKKyAgICBDUFBVTklUX0FTU0VSVCggaWZzdHIuZmFpbCgpICYmICFpZnN0ci5iYWQoKSApOworICAgIGlmc3RyLmNsZWFyKCk7CisjICBlbmRpZgorICAgIHR5cGVkZWYgY29kZWN2dDxjaGFyLCBjaGFyLCBteV9zdGF0ZT4gbXlfY29kZWN2dDsKKyAgICBsb2NhbGUgbXlfbG9jKGxvY2FsZTo6Y2xhc3NpYygpLCBuZXcgbXlfY29kZWN2dCgpKTsKKyAgICAvLyBDaGVjayB0aGF0IG15X2NvZGVjdnQgaGFzIG5vdCByZXBsYWNlIGRlZmF1bHQgY29kZWN2dDoKKyAgICBDUFBVTklUX0FTU0VSVCggKGhhc19mYWNldDxteV9jb2RlY3Z0PihteV9sb2MpKSApOworICAgIENQUFVOSVRfQVNTRVJUKCAoaGFzX2ZhY2V0PGNvZGVjdnQ8Y2hhciwgY2hhciwgbWJzdGF0ZV90PiA+KG15X2xvYykpICk7CisjICBpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgIWRlZmluZWQgKF9TVExQX05PX1dDSEFSX1QpCisgICAgQ1BQVU5JVF9BU1NFUlQoIChoYXNfZmFjZXQ8Y29kZWN2dDx3Y2hhcl90LCBjaGFyLCBtYnN0YXRlX3Q+ID4obXlfbG9jKSkgKTsKKyMgIGVuZGlmCisgICAgaWZzdHIuaW1idWUobXlfbG9jKTsKKyAgICBDUFBVTklUX0FTU0VSVCggaWZzdHIuZ29vZCgpICk7CisgICAgLyoKKyAgICBteV9zdHJpbmcgcmVzOworICAgIGlmc3RyID4+IHJlczsKKyAgICBDUFBVTklUX0FTU0VSVCggIWlmc3RyLmZhaWwoKSApOworICAgIENQUFVOSVRfQVNTRVJUKCAhaWZzdHIuYmFkKCkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggaWZzdHIuZW9mKCkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggcmVzID09ICIwMTIzNDU2Nzg5IiApOworICAgICovCisgIH0KKyNlbmRpZgorfQorCisjICBpZiBkZWZpbmVkIChDSEVDS19CSUdfRklMRSkKK3ZvaWQgRnN0cmVhbVRlc3Q6OmJpZ19maWxlKCkKK3sKKyAgdmVjdG9yPHBhaXI8c3RyZWFtc2l6ZSwgc3RyZWFtb2ZmPiA+IGZpbGVfcG9zOworCisgIC8vQmlnIGZpbGUgY3JlYXRpb246CisgIHsKKyAgICBvZnN0cmVhbSBvdXQoImJpZ19maWxlLnR4dCIpOworICAgIENQUFVOSVRfQVNTRVJUKCBvdXQgKTsKKworICAgIC8vV2UgYXJlIGdvaW5nIHRvIGdlbmVyYXRlIGEgZmlsZSB3aXRoIHRoZSBmb2xsb3dpbmcgc2NoZW1hIGZvciB0aGUgY29udGVudDoKKyAgICAvLzAoMTAxOSB0aW1lcykwMDAwICAvLzEwMjMgY2hhcmFjdGVycyArIDEgY2hhcmF0ZXIgZm9yIFxuIChmb3Igc29tZSBwbGF0Zm9ybXMgaXQgd2lsbCBiZSBhIDEga28gbGluZSkKKyAgICAvLzAoMTAxOSB0aW1lcykwMDAxCisgICAgLy8uLi4KKyAgICAvLzAoMTAxOSB0aW1lcykxMjM0CisgICAgLy8uLi4KKworICAgIC8vR2VuZXJhdGlvbiBvZiB0aGUgbnVtYmVyIG9mIGxvb3A6CisgICAgc3RyZWFtb2ZmIG5iID0gMTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDIwOyArK2kpIHsKKyAgICAgIC8vVGhpcyBhc3NlcnRpb24gY2hlY2sgdGhhdCB0aGUgc3RyZWFtb2ZmIGNhbiBhdCBsZWFzdCByZXByZXNlbnQgdGhlIG5lY2Vzc2FyeSBpbnRlZ2VycyB2YWx1ZXMKKyAgICAgIC8vZm9yIHRoaXMgdGVzdDoKKyAgICAgIENQUFVOSVRfQVNTRVJUKCAobmIgPDwgMSkgPiBuYiApOworICAgICAgbmIgPDw9IDE7CisgICAgfQorICAgIENQUFVOSVRfQVNTRVJUKCBuYiAqIENIRUNLX0JJR19GSUxFID49IG5iICk7CisgICAgbmIgKj0gQ0hFQ0tfQklHX0ZJTEU7CisKKyAgICAvL1ByZXBhcmF0aW9uIG9mIHRoZSBvdXB1dCBzdHJlYW0gc3RhdGU6CisgICAgb3V0IDw8IHNldGlvc2ZsYWdzKGlvc19iYXNlOjpyaWdodCkgPDwgc2V0ZmlsbCgnKicpOworICAgIGZvciAoc3RyZWFtb2ZmIGluZGV4ID0gMDsgaW5kZXggPCBuYjsgKytpbmRleCkgeworICAgICAgaWYgKGluZGV4ICUgMTAyNCA9PSAwKSB7CisgICAgICAgIGZpbGVfcG9zLnB1c2hfYmFjayhtYWtlX3BhaXIob3V0LnRlbGxwKCksIGluZGV4KSk7CisgICAgICAgIENQUFVOSVRfQVNTRVJUKCBmaWxlX3Bvcy5iYWNrKCkuZmlyc3QgIT0gc3RyZWFtc2l6ZSgtMSkgKTsKKyAgICAgICAgaWYgKGZpbGVfcG9zLnNpemUoKSA+IDEpIHsKKyAgICAgICAgICBDUFBVTklUX0FTU0VSVCggZmlsZV9wb3NbZmlsZV9wb3Muc2l6ZSgpIC0gMV0uZmlyc3QgPiBmaWxlX3Bvc1tmaWxlX3Bvcy5zaXplKCkgLSAyXS5maXJzdCApOworICAgICAgICB9CisgICAgICB9CisgICAgICBvdXQgPDwgc2V0dygxMDIzKSA8PCBpbmRleCA8PCAnXG4nOworICAgIH0KKyAgfQorCisgIHsKKyAgICBpZnN0cmVhbSBpbigiYmlnX2ZpbGUudHh0Iik7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGluICk7CisKKyAgICBzdHJpbmcgbGluZTsKKyAgICB2ZWN0b3I8cGFpcjxzdHJlYW1zaXplLCBzdHJlYW1zaXplPiA+Ojpjb25zdF9pdGVyYXRvciBwaXQoZmlsZV9wb3MuYmVnaW4oKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl0RW5kKGZpbGVfcG9zLmVuZCgpKTsKKyAgICBmb3IgKDsgcGl0ICE9IHBpdEVuZDsgKytwaXQpIHsKKyAgICAgIGluLnNlZWtnKCgqcGl0KS5maXJzdCk7CisgICAgICBDUFBVTklUX0FTU0VSVCggaW4gKTsKKyAgICAgIGluID4+IGxpbmU7CisgICAgICBzaXplX3QgbGFzdFN0YXJQb3MgPSBsaW5lLnJmaW5kKCcqJyk7CisgICAgICBDUFBVTklUX0FTU0VSVCggYXRvaShsaW5lLnN1YnN0cihsYXN0U3RhclBvcyArIDEpLmNfc3RyKCkpID09ICgqcGl0KS5zZWNvbmQgKTsKKyAgICB9CisgIH0KKworICAvKgorICBUaGUgZm9sbG93aW5nIHRlc3QgaGFzIGJlZW4gdXNlZCB0byBjaGVjayB0aGF0IFNUTHBvcnQgZG8gbm90IGdlbmVyYXRlCisgIGFuIGluZmluaXRlIGxvb3Agd2hlbiB0aGUgZmlsZSBzaXplIGlzIGxhcmdlciB0aGFuIHRoZSBzdHJlYW1zaXplIGFuZAorICBzdHJlYW1vZmYgcmVwcmVzZW50YXRpb24gKDMyIGJpdHMgb3IgNjQgYml0cykuCisgIHsKKyAgICBpZnN0cmVhbSBpbigiYmlnX2ZpbGUudHh0Iik7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGluICk7CisgICAgY2hhciB0bXBbNDA5Nl07CisgICAgc3RyZWFtc2l6ZSBuYl9yZWFkcyA9IDA7CisgICAgd2hpbGUgKCghaW4uZW9mKCkpICYmIGluLmdvb2QoKSl7CisgICAgICBpbi5yZWFkKHRtcCwgNDA5Nik7CisgICAgICBuYl9yZWFkcyArPSBpbi5nY291bnQoKTsKKyAgICB9CisgIH0KKyAgKi8KK30KKyMgIGVuZGlmCisKK3ZvaWQgRnN0cmVhbVRlc3Q6Om51bGxfc3RyZWFtKCkKK3sKKyMgIGlmIChkZWZpbmVkIChTVExQT1JUKSAmJiBkZWZpbmVkIChfU1RMUF9VU0VfV0lOMzJfSU8pKSB8fCBcCisgICAgICAoIWRlZmluZWQgKFNUTFBPUlQpICYmIChkZWZpbmVkIChXSU4zMikgfHwgZGVmaW5lZCAoX1dJTjMyKSkpCisgIGNvbnN0IGNoYXIqIG51bGxTdHJlYW1OYW1lID0gIk5VTCI7CisjICBlbHNlCisgIGNvbnN0IGNoYXIqIG51bGxTdHJlYW1OYW1lID0gIi9kZXYvbnVsbCI7CisjICBlbmRpZgorICB7CisgICAgb2ZzdHJlYW0gbnVsbFN0cmVhbShudWxsU3RyZWFtTmFtZSk7CisgICAgQ1BQVU5JVF9DSEVDSyggbnVsbFN0cmVhbSApOworICB9CisKKyAgeworICAgIG9mc3RyZWFtIG51bGxTdHJlYW0obnVsbFN0cmVhbU5hbWUsIGlvc19iYXNlOjphdGUpOworICAgIENQUFVOSVRfQ0hFQ0soIG51bGxTdHJlYW0gKTsKKyAgfQorCisgIHsKKyAgICBvZnN0cmVhbSBudWxsU3RyZWFtKG51bGxTdHJlYW1OYW1lLCBpb3NfYmFzZTo6dHJ1bmMpOworICAgIENQUFVOSVRfQ0hFQ0soIG51bGxTdHJlYW0gKTsKKyAgfQorCisgIHsKKyAgICBvZnN0cmVhbSBudWxsU3RyZWFtKG51bGxTdHJlYW1OYW1lLCBpb3NfYmFzZTo6YXBwKTsKKyAgICBDUFBVTklUX0NIRUNLKCBudWxsU3RyZWFtICk7CisgIH0KKworICB7CisgICAgaWZzdHJlYW0gbnVsbFN0cmVhbShudWxsU3RyZWFtTmFtZSk7CisgICAgQ1BQVU5JVF9DSEVDSyggbnVsbFN0cmVhbSApOworICB9CisKKyAgeworICAgIGlmc3RyZWFtIG51bGxTdHJlYW0obnVsbFN0cmVhbU5hbWUsIGlvc19iYXNlOjphdGUpOworICAgIENQUFVOSVRfQ0hFQ0soIG51bGxTdHJlYW0gKTsKKyAgfQorCisgIHsKKyAgICBmc3RyZWFtIG51bGxTdHJlYW0obnVsbFN0cmVhbU5hbWUpOworICAgIENQUFVOSVRfQ0hFQ0soIG51bGxTdHJlYW0gKTsKKyAgfQorCisgIHsKKyAgICBmc3RyZWFtIG51bGxTdHJlYW0obnVsbFN0cmVhbU5hbWUsIGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQgfCBpb3NfYmFzZTo6YXRlKTsKKyAgICBDUFBVTklUX0NIRUNLKCBudWxsU3RyZWFtICk7CisgIH0KKworICB7CisgICAgZnN0cmVhbSBudWxsU3RyZWFtKG51bGxTdHJlYW1OYW1lLCBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0IHwgaW9zX2Jhc2U6OnRydW5jKTsKKyAgICBDUFBVTklUX0NIRUNLKCBudWxsU3RyZWFtICk7CisgIH0KK30KKwordm9pZCBGc3RyZWFtVGVzdDo6bnVsbF9idWYoKQoreworICAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgdGVzdGNhc2UgZm9yIGJ1ZyAjMTgzMDUxMzoKKyAgaW4gX2lzdHJlYW0uYworIAorICB0ZW1wbGF0ZSA8IGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0lzX0RlbGltPgorICBzdHJlYW1zaXplIF9TVExQX0NBTEwgX19yZWFkX3VuYnVmZmVyZWQoYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+KiBfX3RoYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1zaXplIF9OdW0sIF9DaGFyVCogX19zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lzX0RlbGltIF9faXNfZGVsaW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIF9fZXh0cmFjdF9kZWxpbSwgYm9vbCBfX2FwcGVuZF9udWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBfX2lzX2dldGxpbmUpCisKKyAgY2FuJ3QgYWNjZXB0IF9OdW0gPT0gMDsgdGhpcyBpcyBsZWdhbCBjYXNlLCBhbmQgbWF5IGhhcHBlbiBmcm9tCisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KKyAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OmdldGxpbmUoX0NoYXJUKiBfX3MsIHN0cmVhbXNpemUgX19uLCBfQ2hhclQgX19kZWxpbSkKKworICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisgIGZzdHJlYW0gZiggInRlc3QudHh0IiwgaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6Om91dCB8IGlvc19iYXNlOjp0cnVuYyApOworICAvLyBzdHJpbmcgbGluZTsKKworICBmb3IgKCBpbnQgaSA9IDA7IGkgPCAweDIwMDsgKytpICkgeworICAgIGYucHV0KCAnICcgKTsKKyAgfQorCisgIC8vIGNvbnN0IHN0cmVhbWJ1ZiAqYiA9IGYucmRidWYoKTsKKworICAvLyBzdHJpbmcgczsKKyAgY2hhciBidWZbMTAyNF07CisgIGJ1ZlswXSA9ICdhJzsKKyAgYnVmWzFdID0gJ2InOworICBidWZbMl0gPSAnYyc7CisKKyAgLy8gZ2V0bGluZSggZiwgcyApOworICAvLyBjZXJyIDw8IGYuZ29vZCgpIDw8IGVuZGw7CisgIGYuc2Vla2coIDAsIGlvc19iYXNlOjpiZWcgKTsKKyAgLy8gZi5zZWVrZyggMCwgaW9zX2Jhc2U6OmVuZCApOworICAvLyBidWZbMF0gPSBmLmdldCgpOworCisgIC8vIGNlcnIgPDwgKHZvaWQgKikoYi0+X01fZ3B0cigpKSA8PCAiICIgPDwgKHZvaWQgKikoYi0+X01fZWdwdHIoKSkgPDwgZW5kbDsKKyAgLy8gY2VyciA8PCBmLmdvb2QoKSA8PCBlbmRsOworICAvLyBnZXRsaW5lKCBmLCBzICk7CisgIGYuZ2V0bGluZSggYnVmLCAxICk7IC8vIDwtLSBrZXkgbGluZQorICBDUFBVTklUX0NIRUNLKCBidWZbMF0gPT0gMCApOworICBDUFBVTklUX0NIRUNLKCBmLmZhaWwoKSApOyAvLyBkdWUgdG8gZGVsaW1pdGVyIG5vdCBmb3VuZCB3aGlsZSBidWZmZXIgd2FzIGV4aGF1c3RlZAorfQorCisjICBpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgIWRlZmluZWQgKF9TVExQX1dJTjMyKQordm9pZCBGc3RyZWFtVGVzdDo6b2Zmc2V0KCkKK3sKKyMgICAgaWYgKGRlZmluZWQoX0xBUkdFRklMRV9TT1VSQ0UpIHx8IGRlZmluZWQoX0xBUkdFRklMRTY0X1NPVVJDRSkpICYmICFkZWZpbmVkKF9TVExQX1VTRV9ERUZBVUxUX0ZJTEVfT0ZGU0VUKQorICBDUFBVTklUX0NIRUNLKCBzaXplb2Yoc3RyZWFtb2ZmKSA9PSA4ICk7CisjICAgIGVsc2UKKyAgQ1BQVU5JVF9DSEVDSyggc2l6ZW9mKHN0cmVhbW9mZikgPT0gc2l6ZW9mKG9mZl90KSApOworIyAgICBlbmRpZgorfQorIyAgZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvZnVsbF9zdHJlYW1idWYuaCBiL3Rlc3QvdW5pdC9mdWxsX3N0cmVhbWJ1Zi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NzY2YWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvZnVsbF9zdHJlYW1idWYuaApAQCAtMCwwICsxLDQ2IEBACisjaWZuZGVmIF9GVUxMX1NUUkVBTV9ICisjZGVmaW5lIF9GVUxMX1NUUkVBTV9ICisKKyNpbmNsdWRlIDxzdHJlYW1idWY+CisKKy8qCisgKiBUaGlzIGZ1bGxfc3RyZWFtYnVmIHB1cnBvc2UgaXMgdG8gYWN0IGxpa2UgYSBmdWxsIGRpc2sgdG8gY2hlY2sgdGhlIHJpZ2h0IGJlaGF2aW9yCisgKiBvZiB0aGUgU1RMcG9ydCBjb2RlIGluIHN1Y2ggYSBjYXNlLgorICovCisKK2NsYXNzIGZ1bGxfc3RyZWFtYnVmIDogcHVibGljIHN0ZDo6c3RyZWFtYnVmIHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBzdGQ6OnN0cmVhbWJ1ZiBfQmFzZTsKKworICB0eXBlZGVmIF9CYXNlOjppbnRfdHlwZSBpbnRfdHlwZTsKKyAgdHlwZWRlZiBfQmFzZTo6dHJhaXRzX3R5cGUgdHJhaXRzX3R5cGU7CisKKyAgZnVsbF9zdHJlYW1idWYoc2l6ZV90IG5iX291dHB1dCwgYm9vbCBkb190aHJvdyA9IGZhbHNlKQorICAgIDogX25iX291dHB1dChuYl9vdXRwdXQpLCBfZG9fdGhyb3coZG9fdGhyb3cpCisgIHt9CisKKyAgc3RkOjpzdHJpbmcgY29uc3QmIHN0cigpIGNvbnN0CisgIHsgcmV0dXJuIF9idWY7IH0KKworcHJvdGVjdGVkOgorICBpbnRfdHlwZSBvdmVyZmxvdyhpbnRfdHlwZSBjKSB7CisgICAgaWYgKF9uYl9vdXRwdXQgPT0gMCkgeworI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkIChfU1RMUF9VU0VfRVhDRVBUSU9OUykKKyAgICAgIGlmIChfZG9fdGhyb3cpIHsKKyAgICAgICAgdGhyb3cgInN0cmVhbWJ1ZiBmdWxsIjsKKyAgICAgIH0KKyNlbmRpZgorICAgICAgcmV0dXJuIHRyYWl0c190eXBlOjplb2YoKTsKKyAgICB9CisgICAgLS1fbmJfb3V0cHV0OworICAgIF9idWYgKz0gdHJhaXRzX3R5cGU6OnRvX2NoYXJfdHlwZShjKTsKKyAgICByZXR1cm4gYzsKKyAgfQorCitwcml2YXRlOgorICBzaXplX3QgX25iX291dHB1dDsKKyAgYm9vbCBfZG9fdGhyb3c7CisgIHN0ZDo6c3RyaW5nIF9idWY7Cit9OworCisjZW5kaWYgLy9fRlVMTF9TVFJFQU1fSApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L2Z1bmNfdGVzdC5jcHAgYi90ZXN0L3VuaXQvZnVuY190ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWFkMWVmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L2Z1bmNfdGVzdC5jcHAKQEAgLTAsMCArMSw3NiBAQAorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKworI2luY2x1ZGUgImNwcHVuaXQvY3BwdW5pdF9wcm94eS5oIgorCisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IGRlZmluZWQoX1NUTFBfVVNFX05BTUVTUEFDRVMpCit1c2luZyBuYW1lc3BhY2Ugc3RkOworI2VuZGlmCisKKy8vCisvLyBUZXN0Q2FzZSBjbGFzcworLy8KK2NsYXNzIEZ1bmNUZXN0IDogcHVibGljIENQUFVOSVRfTlM6OlRlc3RDYXNlCit7CisgIENQUFVOSVRfVEVTVF9TVUlURShGdW5jVGVzdCk7CisgIENQUFVOSVRfVEVTVChmdW5jMSk7CisgIENQUFVOSVRfVEVTVChmdW5jMik7CisgIENQUFVOSVRfVEVTVChmdW5jMyk7CisgIENQUFVOSVRfVEVTVF9TVUlURV9FTkQoKTsKKworcHJvdGVjdGVkOgorICB2b2lkIGZ1bmMxKCk7CisgIHZvaWQgZnVuYzIoKTsKKyAgdm9pZCBmdW5jMygpOworICBzdGF0aWMgYm9vbCBiaWdnZXIoaW50IGlfKTsKKyAgc3RhdGljIGJvb2wgYmlnZ2VyX3RoYW4oaW50IHhfLCBpbnQgeV8pOworfTsKKworQ1BQVU5JVF9URVNUX1NVSVRFX1JFR0lTVFJBVElPTihGdW5jVGVzdCk7CisKKy8vCisvLyB0ZXN0cyBpbXBsZW1lbnRhdGlvbgorLy8KK2Jvb2wgRnVuY1Rlc3Q6OmJpZ2dlcihpbnQgaV8pCit7CisgIHJldHVybiBpXyA+IDM7Cit9Citib29sIEZ1bmNUZXN0OjpiaWdnZXJfdGhhbihpbnQgeF8sIGludCB5XykKK3sKKyAgICByZXR1cm4geF8gPiB5XzsKK30KK3ZvaWQgRnVuY1Rlc3Q6OmZ1bmMxKCkKK3sKKyAgdmVjdG9yPGludD52OworICB2LnB1c2hfYmFjayg0KTsKKyAgdi5wdXNoX2JhY2soMSk7CisgIHYucHVzaF9iYWNrKDUpOworICBpbnQgbiA9IGNvdW50X2lmKHYuYmVnaW4oKSwgdi5lbmQoKSwgYmlnZ2VyKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIG4gPT0gMiApCit9CisKK3ZvaWQgRnVuY1Rlc3Q6OmZ1bmMyKCkKK3sKKyAgdmVjdG9yPGludD4gdjsKKyAgdi5wdXNoX2JhY2soNCk7CisgIHYucHVzaF9iYWNrKDEpOworICB2LnB1c2hfYmFjayg1KTsKKyAgc29ydCh2LmJlZ2luKCksIHYuZW5kKCksIGJpZ2dlcl90aGFuKTsKKworICBDUFBVTklUX0FTU0VSVCggdlswXSA9PSA1ICk7CisgIENQUFVOSVRfQVNTRVJUKCB2WzFdID09IDQgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHZbMl0gPT0gMSApOworfQordm9pZCBGdW5jVGVzdDo6ZnVuYzMoKQoreworICB2ZWN0b3I8aW50PiB2OworICB2LnB1c2hfYmFjayg0KTsKKyAgdi5wdXNoX2JhY2soMSk7CisgIHYucHVzaF9iYWNrKDUpOworICBzb3J0KHYuYmVnaW4oKSwgdi5lbmQoKSwgZ3JlYXRlcjxpbnQ+KCkpOworCisgIENQUFVOSVRfQVNTRVJUKCB2WzBdID09IDUgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHZbMV0gPT0gNCApOworICBDUFBVTklUX0FTU0VSVCggdlsyXSA9PSAxICk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvZnVuY3Rpb25hbF9oZWFkZXJfdGVzdC5jcHAgYi90ZXN0L3VuaXQvZnVuY3Rpb25hbF9oZWFkZXJfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdiY2U3MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9mdW5jdGlvbmFsX2hlYWRlcl90ZXN0LmNwcApAQCAtMCwwICsxLDggQEAKKy8qIFRoaXMgdGVzdCBwdXJwb3NlIGlzIHNpbXBseSB0byBjaGVjayBTdGFuZGFyZCBoZWFkZXIgaW5kZXBlbmRhbmN5IHRoYXQKKyAqIGlzIHRvIHNheSB0aGF0IHRoZSBoZWFkZXIgY2FuIGJlIGluY2x1ZGVkIGFsb25lIHdpdGhvdXQgYW55IHByZXZpb3VzCisgKiBpbmNsdWRlLgorICogQWRkaXRpb25uYWx5LCBmb3IgQyBTdGFuZGFyZCBoZWFkZXJzIHRoYXQgU1RMcG9ydCBleHBvc2UsIGl0IGNhbiBhbHNvIGJlCisgKiB1c2VkIHRvIGNoZWNrIHRoYXQgZmlsZXMgaW5jbHVkZWQgYnkgdGhvc2UgaGVhZGVycyBhcmUgY29tcGF0aWJsZSB3aXRoCisgKiBwdXJlIEMgY29tcGlsZXJzLgorICovCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9nZW5lcmF0b3JfdGVzdC5jcHAgYi90ZXN0L3VuaXQvZ2VuZXJhdG9yX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwYWM5NDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvZ2VuZXJhdG9yX3Rlc3QuY3BwCkBAIC0wLDAgKzEsOTIgQEAKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgImZhZGFwdGVyLmgiCisjaW5jbHVkZSAiZmliLmgiCisKKyNpbmNsdWRlICJjcHB1bml0L2NwcHVuaXRfcHJveHkuaCIKKworI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkKF9TVExQX1VTRV9OQU1FU1BBQ0VTKQordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyNlbmRpZgorCisvLworLy8gVGVzdENhc2UgY2xhc3MKKy8vCitjbGFzcyBHZW5lcmF0b3JUZXN0IDogcHVibGljIENQUFVOSVRfTlM6OlRlc3RDYXNlCit7CisgIENQUFVOSVRfVEVTVF9TVUlURShHZW5lcmF0b3JUZXN0KTsKKyAgQ1BQVU5JVF9URVNUKGdlbmVyMSk7CisgIENQUFVOSVRfVEVTVChnZW5lcjIpOworICBDUFBVTklUX1RFU1QoZ2VuZXJuMSk7CisgIENQUFVOSVRfVEVTVChnZW5lcm4yKTsKKyAgQ1BQVU5JVF9URVNUX1NVSVRFX0VORCgpOworCitwcm90ZWN0ZWQ6CisgIHZvaWQgZ2VuZXIxKCk7CisgIHZvaWQgZ2VuZXIyKCk7CisgIHZvaWQgZ2VuZXJuMSgpOworICB2b2lkIGdlbmVybjIoKTsKK307CisKK0NQUFVOSVRfVEVTVF9TVUlURV9SRUdJU1RSQVRJT04oR2VuZXJhdG9yVGVzdCk7CisKKy8vCisvLyB0ZXN0cyBpbXBsZW1lbnRhdGlvbgorLy8KKworc3RhdGljICBpbnQgY3h4cmFuZCgpIHsgcmV0dXJuIHJhbmQoKTt9CisKK3ZvaWQgR2VuZXJhdG9yVGVzdDo6Z2VuZXIxKCkKK3sKKyAgaW50IG51bWJlcnNbMTBdOworI2lmIGRlZmluZWQoX19NVlNfXykKKyAgZ2VuZXJhdGUobnVtYmVycywgbnVtYmVycyArIDEwLCBwdHJfZ2VuKGN4eHJhbmQpKTsKKyNlbHNlCisgIGdlbmVyYXRlKG51bWJlcnMsIG51bWJlcnMgKyAxMCwgY3h4cmFuZCk7CisjZW5kaWYKKyAgLy8gYW55IHN1Z2dlc3Rpb25zPworfQordm9pZCBHZW5lcmF0b3JUZXN0OjpnZW5lcjIoKQoreworICB2ZWN0b3IgPGludD4gdjEoMTApOworICBGaWJvbmFjY2kgZ2VuZXJhdG9yOworICBnZW5lcmF0ZSh2MS5iZWdpbigpLCB2MS5lbmQoKSwgZ2VuZXJhdG9yKTsKKworICBDUFBVTklUX0FTU0VSVCh2MVswXT09MSk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzFdPT0xKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbMl09PTIpOworICBDUFBVTklUX0FTU0VSVCh2MVszXT09Myk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzRdPT01KTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbNV09PTgpOworICBDUFBVTklUX0FTU0VSVCh2MVs2XT09MTMpOworICBDUFBVTklUX0FTU0VSVCh2MVs3XT09MjEpOworICBDUFBVTklUX0FTU0VSVCh2MVs4XT09MzQpOworICBDUFBVTklUX0FTU0VSVCh2MVs5XT09NTUpOworfQordm9pZCBHZW5lcmF0b3JUZXN0OjpnZW5lcm4xKCkKK3sKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1BPSU5URVJfUEFSQU1fQlVHKQorICAvLypUWSAwNy8xOC85OCAtIGFkZGVkIGNvbmRpdGlvbmFsCisgIC8vIHNpbmNlIHB0cl9nZW4oKSBpcyBub3QgZGVmaW5lZCB1bmRlciB0aGlzIGNvbmRpdGlvbgorICAvLyAoc2VlIHhmdW5jdGlvbi5oKQorICB2ZWN0b3IgPGludD4gdjEoMTApOworICBnZW5lcmF0ZV9uKHYxLmJlZ2luKCksIHYxLnNpemUoKSwgcHRyX2dlbihjeHhyYW5kKSk7CisjZW5kaWYgIC8vX1NUTFBfTUVNQkVSX1BPSU5URVJfUEFSQU1fQlVHICAvLypUWSAwNy8xOC85OCAtIGFkZGVkCit9Cit2b2lkIEdlbmVyYXRvclRlc3Q6OmdlbmVybjIoKQoreworICB2ZWN0b3IgPGludD4gdjEoMTApOworICBGaWJvbmFjY2kgZ2VuZXJhdG9yOworICBnZW5lcmF0ZV9uKHYxLmJlZ2luKCksIHYxLnNpemUoKSwgZ2VuZXJhdG9yKTsKKworICBDUFBVTklUX0FTU0VSVCh2MVswXT09MSk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzFdPT0xKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbMl09PTIpOworICBDUFBVTklUX0FTU0VSVCh2MVszXT09Myk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzRdPT01KTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbNV09PTgpOworICBDUFBVTklUX0FTU0VSVCh2MVs2XT09MTMpOworICBDUFBVTklUX0FTU0VSVCh2MVs3XT09MjEpOworICBDUFBVTklUX0FTU0VSVCh2MVs4XT09MzQpOworICBDUFBVTklUX0FTU0VSVCh2MVs5XT09NTUpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L2dyZWF0ZXJfdGVzdC5jcHAgYi90ZXN0L3VuaXQvZ3JlYXRlcl90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2I4NTg1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L2dyZWF0ZXJfdGVzdC5jcHAKQEAgLTAsMCArMSw0OSBAQAorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKworI2luY2x1ZGUgImNwcHVuaXQvY3BwdW5pdF9wcm94eS5oIgorCisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IGRlZmluZWQoX1NUTFBfVVNFX05BTUVTUEFDRVMpCit1c2luZyBuYW1lc3BhY2Ugc3RkOworI2VuZGlmCisKKy8vCisvLyBUZXN0Q2FzZSBjbGFzcworLy8KK2NsYXNzIEdyZWF0ZXJUZXN0IDogcHVibGljIENQUFVOSVRfTlM6OlRlc3RDYXNlCit7CisgIENQUFVOSVRfVEVTVF9TVUlURShHcmVhdGVyVGVzdCk7CisgIENQUFVOSVRfVEVTVChncmVhdGVydCk7CisgIENQUFVOSVRfVEVTVChncmVhdGVyZXEpOworICBDUFBVTklUX1RFU1RfU1VJVEVfRU5EKCk7CisKK3Byb3RlY3RlZDoKKyAgdm9pZCBncmVhdGVydCgpOworICB2b2lkIGdyZWF0ZXJlcSgpOworfTsKKworQ1BQVU5JVF9URVNUX1NVSVRFX1JFR0lTVFJBVElPTihHcmVhdGVyVGVzdCk7CisKKy8vCisvLyB0ZXN0cyBpbXBsZW1lbnRhdGlvbgorLy8KK3ZvaWQgR3JlYXRlclRlc3Q6OmdyZWF0ZXJ0KCkKK3sKKyAgaW50IGFycmF5WzRdID0geyAzLCAxLCA0LCAyIH07CisgIHNvcnQoYXJyYXksIGFycmF5ICsgNCwgZ3JlYXRlcjxpbnQ+KCkgKTsKKworICBDUFBVTklUX0FTU0VSVChhcnJheVswXT09NCk7CisgIENQUFVOSVRfQVNTRVJUKGFycmF5WzFdPT0zKTsKKyAgQ1BQVU5JVF9BU1NFUlQoYXJyYXlbMl09PTIpOworICBDUFBVTklUX0FTU0VSVChhcnJheVszXT09MSk7Cit9Cit2b2lkIEdyZWF0ZXJUZXN0OjpncmVhdGVyZXEoKQoreworICBpbnQgYXJyYXkgWzRdID0geyAzLCAxLCA0LCAyIH07CisgIHNvcnQoYXJyYXksIGFycmF5ICsgNCwgZ3JlYXRlcl9lcXVhbDxpbnQ+KCkpOworICBDUFBVTklUX0FTU0VSVChhcnJheVswXT09NCk7CisgIENQUFVOSVRfQVNTRVJUKGFycmF5WzFdPT0zKTsKKyAgQ1BQVU5JVF9BU1NFUlQoYXJyYXlbMl09PTIpOworICBDUFBVTklUX0FTU0VSVChhcnJheVszXT09MSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvaGFzaF90ZXN0LmNwcCBiL3Rlc3QvdW5pdC9oYXNoX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlYTkxM2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvaGFzaF90ZXN0LmNwcApAQCAtMCwwICsxLDQzNCBAQAorLy9IYXMgdG8gYmUgZmlyc3QgZm9yIFN0YWNrQWxsb2NhdG9yIHN3YXAgb3ZlcmxvYWQgdG8gYmUgdGFrZW4KKy8vaW50byBhY2NvdW50IChhdCBsZWFzdCB1c2luZyBHQ0MgNC4wLjEpCisjaW5jbHVkZSAic3RhY2tfYWxsb2NhdG9yLmgiCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzZXQ+CisKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKKyMgIGluY2x1ZGUgPGhhc2hfbWFwPgorIyAgaW5jbHVkZSA8aGFzaF9zZXQ+CisjICBpbmNsdWRlIDxyb3BlPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJjcHB1bml0L2NwcHVuaXRfcHJveHkuaCIKKworI2lmIGRlZmluZWQgKF9fTVZTX18pCitjb25zdCBjaGFyIHN0YXIgPSA5MjsKKyNlbHNlCitjb25zdCBjaGFyIHN0YXIgPSA0MjsKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IGRlZmluZWQgKF9TVExQX1VTRV9OQU1FU1BBQ0VTKQordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyNlbmRpZgorCisvLworLy8gVGVzdENhc2UgY2xhc3MKKy8vCitjbGFzcyBIYXNoVGVzdCA6IHB1YmxpYyBDUFBVTklUX05TOjpUZXN0Q2FzZQoreworICBDUFBVTklUX1RFU1RfU1VJVEUoSGFzaFRlc3QpOworI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQorICBDUFBVTklUX0lHTk9SRTsKKyNlbmRpZgorICBDUFBVTklUX1RFU1QoaG1hcDEpOworICBDUFBVTklUX1RFU1QoaG1tYXAxKTsKKyAgQ1BQVU5JVF9URVNUKGhtbWFwMik7CisgIENQUFVOSVRfVEVTVChobXNldDEpOworICBDUFBVTklUX1RFU1QoaHNldDIpOworICBDUFBVTklUX1RFU1QoaW5zZXJ0X2VyYXNlKTsKKyAgQ1BQVU5JVF9URVNUKGFsbG9jYXRvcl93aXRoX3N0YXRlKTsKKyAgLy9DUFBVTklUX1RFU1QoZXF1YWxpdHkpOworICBDUFBVTklUX1RFU1RfU1VJVEVfRU5EKCk7CisKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKKyAgdHlwZWRlZiBoYXNoX211bHRpc2V0PGNoYXIsIGhhc2g8Y2hhcj4sIGVxdWFsX3RvPGNoYXI+ID4gaG1zZXQ7CisjZW5kaWYKKworcHJvdGVjdGVkOgorICB2b2lkIGhtYXAxKCk7CisgIHZvaWQgaG1tYXAxKCk7CisgIHZvaWQgaG1tYXAyKCk7CisgIHZvaWQgaG1zZXQxKCk7CisgIHZvaWQgaHNldDIoKTsKKyAgdm9pZCBpbnNlcnRfZXJhc2UoKTsKKyAgLy92b2lkIGVxdWFsaXR5KCk7CisgIHZvaWQgYWxsb2NhdG9yX3dpdGhfc3RhdGUoKTsKKworI2lmIGRlZmluZWQgKFNUTFBPUlQpICYmICFkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQorICB0eXBlZGVmIGhhc2hfbXVsdGltYXA8aW50LCBpbnQ+IGhhc2hUeXBlOworICB0eXBlZGVmIG11bHRpbWFwPGludCwgaW50PiBtYXBUeXBlOworCisgIHZvaWQgY2hlY2tfa2V5cyggaGFzaFR5cGUmIGgsIG1hcFR5cGUmIG0gKTsKKyNlbmRpZgorfTsKKworQ1BQVU5JVF9URVNUX1NVSVRFX1JFR0lTVFJBVElPTihIYXNoVGVzdCk7CisKKy8vCisvLyB0ZXN0cyBpbXBsZW1lbnRhdGlvbgorLy8KK3ZvaWQgSGFzaFRlc3Q6OmhtYXAxKCkKK3sKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKKyAgdHlwZWRlZiBoYXNoX21hcDxjaGFyLCBjcm9wZSwgaGFzaDxjaGFyPiwgZXF1YWxfdG88Y2hhcj4gPiBtYXB0eXBlOworICBtYXB0eXBlIG07CisgIC8vIFN0b3JlIG1hcHBpbmdzIGJldHdlZW4gcm9tYW4gbnVtZXJhbHMgYW5kIGRlY2ltYWxzLgorICBtWydsJ10gPSAiNTAiOworICBtWyd4J10gPSAiMjAiOyAvLyBEZWxpYmVyYXRlIG1pc3Rha2UuCisgIG1bJ3YnXSA9ICI1IjsKKyAgbVsnaSddID0gIjEiOworICBDUFBVTklUX0FTU0VSVCggIXN0cmNtcChtWyd4J10uY19zdHIoKSwiMjAiKSApOworICBtWyd4J10gPSAiMTAiOyAvLyBDb3JyZWN0IG1pc3Rha2UuCisgIENQUFVOSVRfQVNTRVJUKCAhc3RyY21wKG1bJ3gnXS5jX3N0cigpLCIxMCIpICk7CisKKyAgQ1BQVU5JVF9BU1NFUlQoICFzdHJjbXAobVsneiddLmNfc3RyKCksIiIpICk7CisKKyAgQ1BQVU5JVF9BU1NFUlQoIG0uY291bnQoJ3onKT09MSApOworICBwYWlyPG1hcHR5cGU6Oml0ZXJhdG9yLCBib29sPiBwID0gbS5pbnNlcnQocGFpcjxjb25zdCBjaGFyLCBjcm9wZT4oJ2MnLCBjcm9wZSgiMTAwIikpKTsKKworICBDUFBVTklUX0FTU0VSVChwLnNlY29uZCk7CisKKyAgcCA9IG0uaW5zZXJ0KHBhaXI8Y29uc3QgY2hhciwgY3JvcGU+KCdjJywgY3JvcGUoIjEwMCIpKSk7CisgIENQUFVOSVRfQVNTRVJUKCFwLnNlY29uZCk7CisKKyAgLy9Tb21lIGl0ZXJhdG9ycyBjb21wYXJlIGNoZWNrLCByZWFsbHkgY29tcGlsZSB0aW1lIGNoZWNrcworICBtYXB0eXBlOjppdGVyYXRvciBpdGUobS5iZWdpbigpKTsKKyAgbWFwdHlwZTo6Y29uc3RfaXRlcmF0b3IgY2l0ZShtLmJlZ2luKCkpOworICBjaXRlID0gbS5iZWdpbigpOworICBtYXB0eXBlIGNvbnN0JiBjbSA9IG07CisgIGNpdGUgPSBjbS5iZWdpbigpOworICBDUFBVTklUX0FTU0VSVCggaXRlID09IGNpdGUgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoICEoaXRlICE9IGNpdGUpICk7CisgIENQUFVOSVRfQVNTRVJUKCBjaXRlID09IGl0ZSApOworICBDUFBVTklUX0FTU0VSVCggIShjaXRlICE9IGl0ZSkgKTsKKyNlbmRpZgorfQorCit2b2lkIEhhc2hUZXN0OjpobW1hcDEoKQoreworI2lmIGRlZmluZWQgKFNUTFBPUlQpICYmICFkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQorICB0eXBlZGVmIGhhc2hfbXVsdGltYXA8Y2hhciwgaW50LCBoYXNoPGNoYXI+LGVxdWFsX3RvPGNoYXI+ID4gbW1hcDsKKyAgbW1hcCBtOworICBDUFBVTklUX0FTU0VSVChtLmNvdW50KCdYJyk9PTApOworICBtLmluc2VydChwYWlyPGNvbnN0IGNoYXIsaW50PignWCcsIDEwKSk7IC8vIFN0YW5kYXJkIHdheS4KKyAgQ1BQVU5JVF9BU1NFUlQobS5jb3VudCgnWCcpPT0xKTsKKy8vICBtLmluc2VydCgnWCcsIDIwKTsgLy8gTm9uLXN0YW5kYXJkLCBidXQgdmVyeSBjb252ZW5pZW50IQorICBtLmluc2VydChwYWlyPGNvbnN0IGNoYXIsaW50PignWCcsIDIwKSk7ICAvLyBqYnVjazogc3RhbmRhcmQgd2F5CisgIENQUFVOSVRfQVNTRVJUKG0uY291bnQoJ1gnKT09Mik7CisvLyAgbS5pbnNlcnQoJ1knLCAzMik7CisgIG0uaW5zZXJ0KHBhaXI8Y29uc3QgY2hhcixpbnQ+KCdZJywgMzIpKTsgIC8vIGpidWNrOiBzdGFuZGFyZCB3YXkKKyAgbW1hcDo6aXRlcmF0b3IgaSA9IG0uZmluZCgnWCcpOyAvLyBGaW5kIGZpcnN0IG1hdGNoLgorCisgIENQUFVOSVRfQVNTRVJUKCgqaSkuZmlyc3Q9PSdYJyk7CisgIENQUFVOSVRfQVNTRVJUKCgqaSkuc2Vjb25kPT0xMCk7CisgIGkrKzsKKyAgQ1BQVU5JVF9BU1NFUlQoKCppKS5maXJzdD09J1gnKTsKKyAgQ1BQVU5JVF9BU1NFUlQoKCppKS5zZWNvbmQ9PTIwKTsKKyAgaSsrOworICBDUFBVTklUX0FTU0VSVCgoKmkpLmZpcnN0PT0nWScpOworICBDUFBVTklUX0FTU0VSVCgoKmkpLnNlY29uZD09MzIpOworICBpKys7CisgIENQUFVOSVRfQVNTRVJUKGk9PW0uZW5kKCkpOworCisgIHNpemVfdCBjb3VudCA9IG0uZXJhc2UoJ1gnKTsKKyAgQ1BQVU5JVF9BU1NFUlQoY291bnQ9PTIpOworCisgIC8vU29tZSBpdGVyYXRvcnMgY29tcGFyZSBjaGVjaywgcmVhbGx5IGNvbXBpbGUgdGltZSBjaGVja3MKKyAgbW1hcDo6aXRlcmF0b3IgaXRlKG0uYmVnaW4oKSk7CisgIG1tYXA6OmNvbnN0X2l0ZXJhdG9yIGNpdGUobS5iZWdpbigpKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIGl0ZSA9PSBjaXRlICk7CisgIENQUFVOSVRfQVNTRVJUKCAhKGl0ZSAhPSBjaXRlKSApOworICBDUFBVTklUX0FTU0VSVCggY2l0ZSA9PSBpdGUgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoICEoY2l0ZSAhPSBpdGUpICk7CisKKyAgdHlwZWRlZiBoYXNoX211bHRpbWFwPHNpemVfdCwgc2l6ZV90PiBITWFwVHlwZTsKKyAgSE1hcFR5cGUgaG1hcDsKKworICAvL1dlIGZpbGwgdGhlIG1hcCB0byBpbXBsaWNpdGVseSBzdGFydCBhIHJlaGFzaC4KKyAgZm9yIChzaXplX3QgY291bnRlciA9IDA7IGNvdW50ZXIgPCAzMDc3OyArK2NvdW50ZXIpCisgICAgaG1hcC5pbnNlcnQoSE1hcFR5cGU6OnZhbHVlX3R5cGUoMSwgY291bnRlcikpOworCisgIGhtYXAuaW5zZXJ0KEhNYXBUeXBlOjp2YWx1ZV90eXBlKDEyMzI1LCAxKSk7CisgIGhtYXAuaW5zZXJ0KEhNYXBUeXBlOjp2YWx1ZV90eXBlKDEyMzI1LCAyKSk7CisKKyAgQ1BQVU5JVF9BU1NFUlQoIGhtYXAuY291bnQoMTIzMjUpID09IDIgKTsKKworICAvL0F0IHRoaXMgcG9pbnQgMjMgZ29lcyB0byB0aGUgc2FtZSBidWNrZXQgYXMgMTIzMjUsIGl0IHVzZWQgdG8gcmV2ZWFsIGEgYnVnLgorICBobWFwLmluc2VydChITWFwVHlwZTo6dmFsdWVfdHlwZSgyMywgMCkpOworCisgIENQUFVOSVRfQVNTRVJUKCBobWFwLmNvdW50KDEyMzI1KSA9PSAyICk7CisjZW5kaWYKK30KKworI2lmIGRlZmluZWQgKFNUTFBPUlQpICYmICFkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQorLy8gU2hvcnQgZGVtb25zdHJhdG9yIHRoYXQgaGVscHMgcmVwcm9kdWNpbmcgYSBidWcgaW4gdGhlIGhhc2gtdGFibGUgaW1wbGVtZW50YXRpb24KKy8vIG9mIFNUTFBvcnQgNS4wLjEvNS4wLjIuCisvLworLy8gUHJvYmxlbTogRmlsbCBhIGhhc2hfbXVsdGltYXAgd2l0aCBlbnRyaWVzIG9mIHdoaWNoIG1hbnkgaGF2ZSB0aGUgc2FtZSBrZXkKKy8vICAgICAgICAgIEludGVybmFsbHksIGVudHJpZXMgd2l0aCB0aGUgc2FtZSBrZXkgYXJlIGtlcHQgYXMgb25lIGJsb2NrIHdpdGhpbiB0aGUgc2FtZSBidWNrZXQuCisvLyAgICAgICAgICBUaHVzLCB3aGVuIGNhbGxpbmcgZXF1YWxfcmFuZ2Uoa2V5KSB0aGUgYmVnaW4vZW5kIG9mIHRoYXQgYmxvY2sgaXMgcmV0dXJuZWQuCisvLyAgICAgICAgICBIb3dldmVyLCB0aGlzIGNvZGUgc2hvd3MgdGhhdCBmb3Iga2V5ID0zLCB0aGF0IGJsb2NrIGlzIGRlc3Ryb3llZCBhZnRlciBpbnNlcnRpbmcgdGhlIDE5NHRoIGVsZW1lbnQuCisvLyAgICAgICAgICBBY2NvcmRpbmcgdG8gX2hhc2h0YWJsZS5jIHdlIHdpbGwgaGF2ZSBhIHJlaGFzaCBmcm9tIHNpemUgMTkzIHRvIHNpemUgMzg5IGluIHRoYXQgc2l0dWF0aW9uLgorLy8gICAgICAgICAgQWZ0ZXIgdGhhdCByZWhhc2gsICBlcXVhbF9yYW5nZSBvbmx5IHJldHVybnMgMiBlbGVtZW50cyB3aXRoIGtleSA9IDMgd2hlcmVhcyB0aGVyZSBhcmUgNjUgaW4gaXQuCisvLyBSZXByb2R1Y3Rpb246CisvLyAgICAgICAgICBJbiB0aGUgbWFpbigpLW1ldGhvZCB3ZSBmaWxsIGEgaGFzaF9tdWx0aW1hcCBhcyB3ZWxsIGFzIGEgbXVsdGlfbWFwIHdpdGggdGhlIHNhbWUgPGtleSwgZGF0YT4gcGFpcnMKKy8vICAgICAgICAgIEFmdGVyIGVhY2ggaW5zZXJ0aW9uIHdlIGNhbGwgY2hlY2tfa2V5cyguLi4pIHRvIGFzc3VyZSB2YWxpZGl0eSBvZiB0aGVzZSB0d28gY29udGFpbmVycy4KKy8vICAgICAgICAgIFRoaXMgd29ya3MgZmluZSB1cCB0byB0aGUgMTkzdGggaW5zZXJ0aW9uLiBJbnNlcnRpb24gMTk0IGdlbmVyYXRlcyB0aGUgYnVnLgorLy8KKy8vICAgICAgICAgIGNoZWNrX2tleXMoKSB3b3JrcyBhcyBmb2xsb3dzOgorLy8gICAgICAgICAgKGEpIHdlIGNoZWNrIHdoZXRoZXIgYm90aCBjb250YWluZXJzIGNvbnRhaW4gdGhlIHNhbWUgbnVtYmVyIG9mIGVsZW1lbnRzLgorLy8gICAgICAgICAgKGIpIEFzc3VtaW5nIHRoYXQgdGhlIG11bHRpX21hcCB3b3JrcyBjb3JyZWN0bHksIHdlIGl0ZXJhdGUgb3ZlciBhbGwgaXRzIGVsZW1lbnRzIGFuZCBjaGVjaworLy8gICAgICAgICAgICAgIHdoZXRoZXIgd2UgY2FuIGZpbmQgdGhhdCBrZXkgYWxzbyBpbiB0aGUgaGFzaF9tdWx0aW1hcC4gV2UgY29sbGVjdCBhbGwgZGF0YSBmb3IgdGhhdCBzcGVjaWZpYworLy8gICAgICAgICAgICAgIGtleSBpbiBpbiBhIHNldCAoImNvbGxlY3Rpb24iKS4gTm90aWNlIHRoYXQgZGF0YSBpcyB1bmlxdWUgYnkgY29uc3RydWN0aW9uIGluIG1haW4oKSwgdGh1cyB0aGUKKy8vICAgICAgICAgICAgICBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHNldCBtdXN0IGVxdWFsIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgaGFzaF9tdWx0aW1hcCBhbmQgaW4gdGhlIG11bHRpbWFwCisvLyAgICAgICAgICAoYykgV2UgY2hlY2sgaWYgd2UgaGF2ZSBzZWVuIGFzIG1hbnkgZGF0YSBlbGVtZW50cyBpbiBjb2xsZWN0aW9uIGFzIHdlIGhhdmUgc2VlbiBpbiB0aGUgbXVsdGltYXAuCisvLyAgICAgICAgICAgICAgaWYgc28sIHdlIHByaW50ICJPSyIsIG90aGVyd2lzZSB3ZSBwcmludCBhIGRldGFpbGVkIGtleS9kYXRhIG92ZXJ2aWV3IGFuZCBhc3NlcnQuCisvLyBDYXV0aW9uOgorLy8gICAgICAgIFRoZXJlIGFyZSBzZXZlcmFsIGNvbmZpZ3VyYXRpb25zIG9mIHRoZSBwcm9ncmFtIHRoYXQgd2lsbCBOT1QgZmFpbC4gKHNlZSBjb21tZW50IGluIGNvZGUgYmVsb3cpCisvLyAgICAgICAgRS5nLiBpdCBzZWVtcyB0aGF0IHdoZW5ldmVyIHRoZSBrZXlzIGFyZSBtb3JlIG9yIGxlc3Mgc29ydGVkLCB0aGUgcHJvYmxlbSBkb2VzIG5vdCBvY2N1ci4KKy8vICAgICAgICBBbHNvLCB1c2luZyBudW1iZXJzIGZyb20gMjAwIGRvd250byAxIG9yIGZyb20gMzAwIGRvd250byAxIGNhbm5vdCBnZW5lcmF0ZSB0aGUgcHJvYmxlbSwKKy8vICAgICAgICB3aGVyZWFzIHVzaW5nIDQwMCBkb3dudG8gMSB3aWxsIGZhaWwuCisvLyAgICAgICAgRmluYWxseSwgaWYgd2UgdXNlIGtleSAxIChyYXRoZXIgdGhhbiBrZXkgMykgd2UgY2Fubm90IGdlbmVyYXRlIGEgcHJvYmxlbS4KKwordm9pZCBIYXNoVGVzdDo6Y2hlY2tfa2V5cyggSGFzaFRlc3Q6Omhhc2hUeXBlJiBoLCBIYXNoVGVzdDo6bWFwVHlwZSYgbSApCit7CisgIHNldDxpbnQ+IGNvbGxlY3Rpb247CisKKyAgLy8gKGEpIGNoZWNrIHNpemVzCisgIENQUFVOSVRfQ0hFQ0soIGguc2l6ZSgpID09IG0uc2l6ZSgpICk7CisKKyAgLy8gKGIpIGl0ZXJhdGUgb3ZlciBtdWx0aV9tYXAKKyAgZm9yICggbWFwVHlwZTo6aXRlcmF0b3IgaSA9IG0uYmVnaW4oKTsgaSAhPSBtLmVuZCgpOyArK2kgKSB7CisgICAgLy8gbG9vayB1cCB0aGF0IGtleSBpbiBoYXNoLXRhYmxlIGFuZCBrZWVwIGFsbCBkYXRhIGluIHRoZSBzZXQKKyAgICBwYWlyPGhhc2hUeXBlOjppdGVyYXRvcixoYXNoVHlwZTo6aXRlcmF0b3I+IHJhbmdlID0gaC5lcXVhbF9yYW5nZSggaS0+Zmlyc3QgKTsKKyAgICBmb3IgKCBoYXNoVHlwZTo6aXRlcmF0b3IgaiA9IHJhbmdlLmZpcnN0OyBqICE9IHJhbmdlLnNlY29uZDsgKytqICkgeworICAgICAgY29sbGVjdGlvbi5pbnNlcnQoIGotPnNlY29uZCApOworICAgIH0KKyAgfQorICAvLyAoYykgd2Ugc2hvdWxkIGhhdmUgc2VlbiBhcyBtYW55IGVsZW1lbnRzIGFzIHRoZXJlIGFyZSBpbiB0aGUgaGFzaC10YWJsZQorI2lmIDAKKyAgaWYgKGNvbGxlY3Rpb24uc2l6ZSgpID09IGguc2l6ZSgpKSBjb3V0IDw8ICIgT0siIDw8IGVuZGw7CisgIGVsc2UgeworICAgIC8vIGlmIG5vdCwgcGxlYXNlIHJlcG9ydAorICAgIGNvdXQgPDwgIiBGQUlMRUQ6ICIgPDwgZW5kbDsKKyAgICBpbnQgbGFzdEtleSAgPSAtMTsKKyAgICAvLyBpdGVyYXRlIG92ZXIgYWxsIGVsZW1lbnRzIGluIG11bHRpX21hcAorICAgIGZvciAobWFwVHlwZTo6aXRlcmF0b3IgbUl0ZXIgPSBtLmJlZ2luKCk7IG1JdGVyICE9IG0uZW5kKCk7IG1JdGVyKyspIHsKKyAgICAgIC8vIG5ldyBrZXk/IHByaW50IGEgbmV3IHN0YXR1cyBsaW5lCisgICAgICBpZiAobUl0ZXItPmZpcnN0ICE9IGxhc3RLZXkpIHsKKyAgICAgICAgY291dCA8PCBlbmRsIDw8ICJLZXkgOiAiIDw8IG1JdGVyLT5maXJzdCA8PCBlbmRsOworICAgICAgICBsYXN0S2V5ID0gbUl0ZXItPmZpcnN0OworCisgICAgICAgIC8vIHByaW50IGFsbCBoYXNoZWQgdmFsdWVzIGZvciB0aGF0IGtleQorICAgICAgICBjb3V0IDw8ICIgZGF0YSBpbiBoYXNoOiAiOworICAgICAgICBwYWlyPGhhc2hUeXBlOjppdGVyYXRvcixoYXNoVHlwZTo6aXRlcmF0b3I+IHJhbmdlID0gaC5lcXVhbF9yYW5nZShtSXRlci0+Zmlyc3QpOworCisgICAgICAgIGZvciAoaGFzaFR5cGU6Oml0ZXJhdG9yIGggPSByYW5nZS5maXJzdDsgaCAhPSByYW5nZS5zZWNvbmQ7IGgrKykgeworICAgICAgICAgIGFzc2VydCAoaC0+Zmlyc3QgPT0gbGFzdEtleSk7CisgICAgICAgICAgY2VyciA8PCBoLT5zZWNvbmQgPDwgIiwgIjsgLy8gcHJpbnQgYWxsIGRhdGEgZm9yIHRoYXQga2V5IGluIEhhc2gtVGFibGUKKyAgICAgICAgfQorICAgICAgICBjb3V0IDw8IGVuZGwgPDwgIiBkYXRhIGluIG1hcDogICI7CisgICAgICB9CisgICAgICAvLyBhbmQgcHJpbnQgYWxsIG1lbWJlciBpbiBtdWx0aS1tYXAgdW50aWwgdGhlIG5leHQga2V5IG9jY3VycworICAgICAgY291dCA8PCBtSXRlci0+c2Vjb25kIDw8ICIsICIgOyAgLy8gcHJpbnQgYWxsIGRhdGEgZm9yIHRoYXQga2V5IGluIE1hcAorICAgIH0KKyAgfQorI2VuZGlmCisgIENQUFVOSVRfQ0hFQ0soIGNvbGxlY3Rpb24uc2l6ZSgpID09IGguc2l6ZSgpICk7Cit9CisKKyNlbmRpZgorCit2b2lkIEhhc2hUZXN0OjpobW1hcDIoKQoreworI2lmIGRlZmluZWQgKFNUTFBPUlQpICYmICFkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQorICBoYXNoVHlwZSBoOworICBtYXBUeXBlIG07CisKKyAgLy8gQ0FVVElPTiB0aGUgZm9sbG93aW5nIGNvbmZpZ3VyYXRpb25zIFdPUktTIGluIG91ciBzZXR0aW5nCisgIC8vICAgICAgZm9yIChpbnQgaWQgPSAxOyBpZCAhPSA0MDA7IGlkICsrKSAgIGFuZCBpbnQga2V5ID0gKGlkICUzID09IDAgPyAzIDogaWQpCisgIC8vICAgICAgZm9yIChpbnQgaWQgPSAyMDA7IGlkICE9IDE7IGlkIC0tKSAgIGFuZCBpbnQga2V5ID0gKGlkICUzID09IDAgPyAzIDogaWQpCisgIC8vICAgICAgZm9yIChpbnQgaWQgPSAzMDA7IGlkICE9IDE7IGlkIC0tKSAgIGFuZCBpbnQga2V5ID0gKGlkICUzID09IDAgPyAzIDogaWQpCisgIC8vICAgICAgZm9yIChpbnQgaWQgPSA0MDA7IGlkICE9IDE7IGlkIC0tKSAgIGFuZCBpbnQga2V5ID0gKGlkICUzID09IDAgPyAxIDogaWQpCisgIC8vICAgICAgZm9yIChpbnQgaWQgPSA0MDAwOyBpZCAhPSAxOyBpZCAtLSkgIGFuZCBpbnQga2V5ID0gKGlkICUzID09IDAgPyAxIDogaWQpCisgIC8vCisgIC8vIHdoZXJlYXMgdGhlc2Ugd2lsbCBGQUlMCisgIC8vICAgICAgZm9yIChpbnQgaWQgPSA0MDA7IGlkICE9IDE7IGlkIC0tKSAgIGFuZCBpbnQga2V5ID0gKGlkICUzID09IDAgPyAzIDogaWQpCisgIC8vICAgICAgZm9yIChpbnQgaWQgPSA0MDAwOyBpZCAhPSAxOyBpZCAtLSkgIGFuZCBpbnQga2V5ID0gKGlkICUzID09IDAgPyAzIDogaWQpCisgIC8vCisKKyAgZm9yICggaW50IGlkID0gNDAwOyBpZCAhPSAxOyBpZC0tICkgeworICAgIC8vIGdlbmVyYXRlIG1hbnkgZW50cmllcyB3aXRoIGtleSAzLCBmaWxsIHVwIHdpdGggdW5pcXVlIGtleXMuIERhdGEgaXMgdW5pcXVlIChuZWVkZWQgaW4gY2hlY2tfa2V5cygpKQorICAgIGludCBrZXkgPSAoaWQgJSAzID09IDAgPyAzIDogaWQpOworCisgICAgLy8ga2VlcCBoYXNoX211bHRpX21hcCBhbmQgbXVsdGltYXAgaW4gc3luYworICAgIGguaW5zZXJ0KG1ha2VfcGFpcihrZXksIGlkKSk7CisgICAgbS5pbnNlcnQobWFrZV9wYWlyKGtleSwgaWQpKTsKKworICAgIC8vIGNoZWNrIHdoZXRoZXIgYm90aCBjb250YWluIHRoZSBzYW1lIGVsZW1lbnRzCisgICAgY2hlY2tfa2V5cyggaCwgbSApOworICB9CisjZW5kaWYKK30KKwordm9pZCBIYXNoVGVzdDo6aG1zZXQxKCkKK3sKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKKyAgaG1zZXQgczsKKyAgQ1BQVU5JVF9BU1NFUlQoIHMuY291bnQoc3RhcikgPT0gMCApOworICBzLmluc2VydChzdGFyKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHMuY291bnQoc3RhcikgPT0gMSApOworICBzLmluc2VydChzdGFyKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHMuY291bnQoc3RhcikgPT0gMiApOworICBobXNldDo6aXRlcmF0b3IgaSA9IHMuZmluZChjaGFyKDQwKSk7CisgIENQUFVOSVRfQVNTRVJUKCBpID09IHMuZW5kKCkgKTsKKworICBpID0gcy5maW5kKHN0YXIpOworICBDUFBVTklUX0FTU0VSVCggaSAhPSBzLmVuZCgpICkKKyAgQ1BQVU5JVF9BU1NFUlQoICppID09ICcqJyApOworICBDUFBVTklUX0FTU0VSVCggcy5lcmFzZShzdGFyKSA9PSAyICk7CisjZW5kaWYKK30KK3ZvaWQgSGFzaFRlc3Q6OmhzZXQyKCkKK3sKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKKyAgaGFzaF9zZXQ8aW50LCBoYXNoPGludD4sIGVxdWFsX3RvPGludD4gPiBzOworICBwYWlyPGhhc2hfc2V0PGludCwgaGFzaDxpbnQ+LCBlcXVhbF90bzxpbnQ+ID46Oml0ZXJhdG9yLCBib29sPiBwID0gcy5pbnNlcnQoNDIpOworICBDUFBVTklUX0FTU0VSVCggcC5zZWNvbmQgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoICoocC5maXJzdCkgPT0gNDIgKTsKKworICBwID0gcy5pbnNlcnQoNDIpOworICBDUFBVTklUX0FTU0VSVCggIXAuc2Vjb25kICk7CisjZW5kaWYKK30KKwordm9pZCBIYXNoVGVzdDo6aW5zZXJ0X2VyYXNlKCkKK3sKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKKyAgdHlwZWRlZiBoYXNoX21hcDxzdHJpbmcsIHNpemVfdCwgaGFzaDxzdHJpbmc+LCBlcXVhbF90bzxzdHJpbmc+ID4gaG1hcDsKKyAgdHlwZWRlZiBobWFwOjp2YWx1ZV90eXBlIHZhbF90eXBlOworICB7CisgICAgaG1hcCB2YWx1ZXM7CisjICBpZiAhZGVmaW5lZCAoX19CT1JMQU5EQ19fKSB8fCAoX19CT1JMQU5EQ19fID49IDB4NTY0KQorICAgIENQUFVOSVRfQVNTRVJUKCB2YWx1ZXMuaW5zZXJ0KHZhbF90eXBlKCJmb28iLCAwKSkuc2Vjb25kICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHZhbHVlcy5pbnNlcnQodmFsX3R5cGUoImJhciIsIDApKS5zZWNvbmQgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggdmFsdWVzLmluc2VydCh2YWxfdHlwZSgiYWJjIiwgMCkpLnNlY29uZCApOworIyAgZWxzZQorICAgIENQUFVOSVRfQVNTRVJUKCB2YWx1ZXMuaW5zZXJ0KGhtYXA6OnZhbHVlX3R5cGUoImZvbyIsIDApKS5zZWNvbmQgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggdmFsdWVzLmluc2VydChobWFwOjp2YWx1ZV90eXBlKCJiYXIiLCAwKSkuc2Vjb25kICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHZhbHVlcy5pbnNlcnQoaG1hcDo6dmFsdWVfdHlwZSgiYWJjIiwgMCkpLnNlY29uZCApOworIyAgZW5kaWYKKworICAgIENQUFVOSVRfQVNTRVJUKCB2YWx1ZXMuZXJhc2UoImZvbyIpID09IDEgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggdmFsdWVzLmVyYXNlKCJiYXIiKSA9PSAxICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHZhbHVlcy5lcmFzZSgiYWJjIikgPT0gMSApOworICB9CisKKyAgeworICAgIGhtYXAgdmFsdWVzOworIyAgaWYgIWRlZmluZWQgKF9fQk9STEFORENfXykgfHwgKF9fQk9STEFORENfXyA+PSAweDU2NCkKKyAgICBDUFBVTklUX0FTU0VSVCggdmFsdWVzLmluc2VydCh2YWxfdHlwZSgiZm9vIiwgMCkpLnNlY29uZCApOworICAgIENQUFVOSVRfQVNTRVJUKCB2YWx1ZXMuaW5zZXJ0KHZhbF90eXBlKCJiYXIiLCAwKSkuc2Vjb25kICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHZhbHVlcy5pbnNlcnQodmFsX3R5cGUoImFiYyIsIDApKS5zZWNvbmQgKTsKKyMgIGVsc2UKKyAgICBDUFBVTklUX0FTU0VSVCggdmFsdWVzLmluc2VydChobWFwOjp2YWx1ZV90eXBlKCJmb28iLCAwKSkuc2Vjb25kICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHZhbHVlcy5pbnNlcnQoaG1hcDo6dmFsdWVfdHlwZSgiYmFyIiwgMCkpLnNlY29uZCApOworICAgIENQUFVOSVRfQVNTRVJUKCB2YWx1ZXMuaW5zZXJ0KGhtYXA6OnZhbHVlX3R5cGUoImFiYyIsIDApKS5zZWNvbmQgKTsKKyMgIGVuZGlmCisKKyAgICBDUFBVTklUX0FTU0VSVCggdmFsdWVzLmVyYXNlKCJhYmMiKSA9PSAxICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHZhbHVlcy5lcmFzZSgiYmFyIikgPT0gMSApOworICAgIENQUFVOSVRfQVNTRVJUKCB2YWx1ZXMuZXJhc2UoImZvbyIpID09IDEgKTsKKyAgfQorI2VuZGlmCit9CisKKy8qCisgKiBIZXJlIGlzIHRoZSB0ZXN0IHNob3dpbmcgd2h5IGVxdWFsaXR5IG9wZXJhdG9yIG9uIGhhc2ggY29udGFpbmVycworICogaGFzIG5vIG1lYW5pbmc6CisKK3N0cnVjdCBlcXVhbGl0eV9oYXNoX2Z1bmMgeworICBzaXplX3Qgb3BlcmF0b3IgKCkgKHNpemVfdCB2YWwpIGNvbnN0IHsKKyAgICByZXR1cm4gdmFsICUgMTA7CisgIH0KK307CisKK3ZvaWQgSGFzaFRlc3Q6OmVxdWFsaXR5KCkKK3sKKyAgaGFzaF9zZXQ8c2l6ZV90LCBlcXVhbGl0eV9oYXNoX2Z1bmMsIGVxdWFsX3RvPHNpemVfdD4gPiBzMSwgczI7CisKKyAgczEuaW5zZXJ0KDEwKTsKKyAgczEuaW5zZXJ0KDIwKTsKKworICBzMi5pbnNlcnQoMjApOworICBzMi5pbnNlcnQoMTApOworCisgIC8vczEgYW5kIHMyIGNvbnRhaW5zIGJvdGggMTAgYW5kIDIwOgorICBDUFBVTklUX0FTU0VSVCggczEgPT0gczIgKTsKK30KKyovCisKK3ZvaWQgSGFzaFRlc3Q6OmFsbG9jYXRvcl93aXRoX3N0YXRlKCkKK3sKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKKyAgY2hhciBidWYxWzIwNDhdOworICBTdGFja0FsbG9jYXRvcjxpbnQ+IHN0YWNrMShidWYxLCBidWYxICsgc2l6ZW9mKGJ1ZjEpKTsKKworICBjaGFyIGJ1ZjJbMjA0OF07CisgIFN0YWNrQWxsb2NhdG9yPGludD4gc3RhY2syKGJ1ZjIsIGJ1ZjIgKyBzaXplb2YoYnVmMikpOworCisgIHsKKyAgICB0eXBlZGVmIGhhc2hfc2V0PGludCwgaGFzaDxpbnQ+LCBlcXVhbF90bzxpbnQ+LCBTdGFja0FsbG9jYXRvcjxpbnQ+ID4gSGFzaFNldEludDsKKyAgICBIYXNoU2V0SW50IGhpbnQxKDEwLCBoYXNoPGludD4oKSwgZXF1YWxfdG88aW50PigpLCBzdGFjazEpOworCisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IDU7ICsraSkKKyAgICAgIGhpbnQxLmluc2VydChpKTsKKyAgICBIYXNoU2V0SW50IGhpbnQxQ3B5KGhpbnQxKTsKKworICAgIEhhc2hTZXRJbnQgaGludDIoMTAsIGhhc2g8aW50PigpLCBlcXVhbF90bzxpbnQ+KCksIHN0YWNrMik7CisgICAgZm9yICg7IGkgPCAxMDsgKytpKQorICAgICAgaGludDIuaW5zZXJ0KGkpOworICAgIEhhc2hTZXRJbnQgaGludDJDcHkoaGludDIpOworCisgICAgaGludDEuc3dhcChoaW50Mik7CisKKyAgICBDUFBVTklUX0FTU0VSVCggaGludDEuZ2V0X2FsbG9jYXRvcigpLnN3YXBlZCgpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGhpbnQyLmdldF9hbGxvY2F0b3IoKS5zd2FwZWQoKSApOworCisgICAgQ1BQVU5JVF9BU1NFUlQoIGhpbnQxLmdldF9hbGxvY2F0b3IoKSA9PSBzdGFjazIgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggaGludDIuZ2V0X2FsbG9jYXRvcigpID09IHN0YWNrMSApOworICB9CisgIENQUFVOSVRfQVNTRVJUKCBzdGFjazEub2soKSApOworICBDUFBVTklUX0FTU0VSVCggc3RhY2syLm9rKCkgKTsKKyNlbmRpZgorfQorCisjaWYgZGVmaW5lZCAoU1RMUE9SVCkgJiYgIWRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpICYmIFwKKyAgICghZGVmaW5lZCAoX1NUTFBfVVNFX1BUUl9TUEVDSUFMSVpBVElPTlMpIHx8IGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pKQorIyAgaWYgIWRlZmluZWQgKF9fRE1DX18pCisKKy8qIFNpbXBsZSBjb21waWxhdGlvbiB0ZXN0OiBDaGVjayB0aGF0IG5lc3RlZCB0eXBlcyBsaWtlIGl0ZXJhdG9yCisgKiBjYW4gYmUgYWNjZXNzIGV2ZW4gaWYgdHlwZSB1c2VkIHRvIGluc3RhbmNpYXRlIGNvbnRhaW5lciBpcyBub3QKKyAqIHlldCBjb21wbGV0ZWx5IGRlZmluZWQuCisgKi8KK2NsYXNzIEluY29tcGxldGVDbGFzcworeworICBoYXNoX3NldDxJbmNvbXBsZXRlQ2xhc3M+IGhzaW5zdGFuY2VzOworICB0eXBlZGVmIGhhc2hfc2V0PEluY29tcGxldGVDbGFzcz46Oml0ZXJhdG9yIGhzaXQ7CisgIGhhc2hfbXVsdGlzZXQ8SW5jb21wbGV0ZUNsYXNzPiBoc21pbnN0YW5jZXM7CisgIHR5cGVkZWYgaGFzaF9tdWx0aXNldDxJbmNvbXBsZXRlQ2xhc3M+OjppdGVyYXRvciBoc21pdDsKKworICBoYXNoX21hcDxJbmNvbXBsZXRlQ2xhc3MsIEluY29tcGxldGVDbGFzcz4gaG1pbnN0YW5jZXM7CisgIHR5cGVkZWYgaGFzaF9tYXA8SW5jb21wbGV0ZUNsYXNzLCBJbmNvbXBsZXRlQ2xhc3M+OjppdGVyYXRvciBobWl0OworICBoYXNoX211bHRpbWFwPEluY29tcGxldGVDbGFzcywgSW5jb21wbGV0ZUNsYXNzPiBobW1pbnN0YW5jZXM7CisgIHR5cGVkZWYgaGFzaF9tdWx0aW1hcDxJbmNvbXBsZXRlQ2xhc3MsIEluY29tcGxldGVDbGFzcz46Oml0ZXJhdG9yIGhtbWl0OworfTsKKyMgIGVuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9oZWFwX3Rlc3QuY3BwIGIvdGVzdC91bml0L2hlYXBfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdlYjc1ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9oZWFwX3Rlc3QuY3BwCkBAIC0wLDAgKzEsMTA4IEBACisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCisjaW5jbHVkZSAiY3BwdW5pdC9jcHB1bml0X3Byb3h5LmgiCisKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZChfU1RMUF9VU0VfTkFNRVNQQUNFUykKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisjZW5kaWYKKworLy8KKy8vIFRlc3RDYXNlIGNsYXNzCisvLworY2xhc3MgSGVhcFRlc3QgOiBwdWJsaWMgQ1BQVU5JVF9OUzo6VGVzdENhc2UKK3sKKyAgQ1BQVU5JVF9URVNUX1NVSVRFKEhlYXBUZXN0KTsKKyAgQ1BQVU5JVF9URVNUKG1raGVhcDApOworICBDUFBVTklUX1RFU1QobWtoZWFwMSk7CisgIENQUFVOSVRfVEVTVChwaGVhcDEpOworICBDUFBVTklUX1RFU1QocGhlYXAyKTsKKyAgQ1BQVU5JVF9URVNUX1NVSVRFX0VORCgpOworCitwcm90ZWN0ZWQ6CisgIHZvaWQgbWtoZWFwMCgpOworICB2b2lkIG1raGVhcDEoKTsKKyAgdm9pZCBwaGVhcDEoKTsKKyAgdm9pZCBwaGVhcDIoKTsKK307CisKK0NQUFVOSVRfVEVTVF9TVUlURV9SRUdJU1RSQVRJT04oSGVhcFRlc3QpOworCisvLworLy8gdGVzdHMgaW1wbGVtZW50YXRpb24KKy8vCit2b2lkIEhlYXBUZXN0Ojpta2hlYXAwKCkKK3sKKyAgaW50IG51bWJlcnNbNl0gPSB7IDUsIDEwLCA0LCAxMywgMTEsIDE5IH07CisKKyAgbWFrZV9oZWFwKG51bWJlcnMsIG51bWJlcnMgKyA2KTsKKyAgQ1BQVU5JVF9BU1NFUlQobnVtYmVyc1swXT09MTkpCisgIHBvcF9oZWFwKG51bWJlcnMsIG51bWJlcnMgKyA2KTsKKyAgQ1BQVU5JVF9BU1NFUlQobnVtYmVyc1swXT09MTMpCisgIHBvcF9oZWFwKG51bWJlcnMsIG51bWJlcnMgKyA1KTsKKyAgQ1BQVU5JVF9BU1NFUlQobnVtYmVyc1swXT09MTEpCisgIHBvcF9oZWFwKG51bWJlcnMsIG51bWJlcnMgKyA0KTsKKyAgQ1BQVU5JVF9BU1NFUlQobnVtYmVyc1swXT09MTApCisgIHBvcF9oZWFwKG51bWJlcnMsIG51bWJlcnMgKyAzKTsKKyAgQ1BQVU5JVF9BU1NFUlQobnVtYmVyc1swXT09NSkKKyAgcG9wX2hlYXAobnVtYmVycywgbnVtYmVycyArIDIpOworICBDUFBVTklUX0FTU0VSVChudW1iZXJzWzBdPT00KQorICBwb3BfaGVhcChudW1iZXJzLCBudW1iZXJzICsgMSk7Cit9Cit2b2lkIEhlYXBUZXN0Ojpta2hlYXAxKCkKK3sKKyAgaW50IG51bWJlcnNbNl0gPSB7IDUsIDEwLCA0LCAxMywgMTEsIDE5IH07CisKKyAgbWFrZV9oZWFwKG51bWJlcnMsIG51bWJlcnMgKyA2LCBncmVhdGVyPGludD4oKSk7CisKKyAgQ1BQVU5JVF9BU1NFUlQobnVtYmVyc1swXT09NCkKKyAgcG9wX2hlYXAobnVtYmVycywgbnVtYmVycyArIDYsIGdyZWF0ZXI8aW50PigpKTsKKyAgQ1BQVU5JVF9BU1NFUlQobnVtYmVyc1swXT09NSkKKyAgcG9wX2hlYXAobnVtYmVycywgbnVtYmVycyArIDUsIGdyZWF0ZXI8aW50PigpKTsKKyAgQ1BQVU5JVF9BU1NFUlQobnVtYmVyc1swXT09MTApCisgIHBvcF9oZWFwKG51bWJlcnMsIG51bWJlcnMgKyA0LCBncmVhdGVyPGludD4oKSk7CisgIENQUFVOSVRfQVNTRVJUKG51bWJlcnNbMF09PTExKQorICBwb3BfaGVhcChudW1iZXJzLCBudW1iZXJzICsgMywgZ3JlYXRlcjxpbnQ+KCkpOworICBDUFBVTklUX0FTU0VSVChudW1iZXJzWzBdPT0xMykKKyAgcG9wX2hlYXAobnVtYmVycywgbnVtYmVycyArIDIsIGdyZWF0ZXI8aW50PigpKTsKKyAgQ1BQVU5JVF9BU1NFUlQobnVtYmVyc1swXT09MTkpCit9Cit2b2lkIEhlYXBUZXN0OjpwaGVhcDEoKQoreworICB2ZWN0b3I8aW50PiB2OworCisgIHYucHVzaF9iYWNrKDEpOworICB2LnB1c2hfYmFjaygyMCk7CisgIHYucHVzaF9iYWNrKDQpOworICBtYWtlX2hlYXAodi5iZWdpbigpLCB2LmVuZCgpKTsKKworICB2LnB1c2hfYmFjayg3KTsKKyAgcHVzaF9oZWFwKHYuYmVnaW4oKSwgdi5lbmQoKSk7CisKKyAgc29ydF9oZWFwKHYuYmVnaW4oKSwgdi5lbmQoKSk7CisKKyAgQ1BQVU5JVF9BU1NFUlQodlswXT09MSk7CisgIENQUFVOSVRfQVNTRVJUKHZbMV09PTQpOworICBDUFBVTklUX0FTU0VSVCh2WzJdPT03KTsKKyAgQ1BQVU5JVF9BU1NFUlQodlszXT09MjApOworfQordm9pZCBIZWFwVGVzdDo6cGhlYXAyKCkKK3sKKyAgdmVjdG9yPGludD4gdjsKKworICB2LnB1c2hfYmFjaygxKTsKKyAgdi5wdXNoX2JhY2soMjApOworICB2LnB1c2hfYmFjayg0KTsKKyAgbWFrZV9oZWFwKHYuYmVnaW4oKSwgdi5lbmQoKSwgZ3JlYXRlcjxpbnQ+KCkpOworCisgIHYucHVzaF9iYWNrKDcpOworICBwdXNoX2hlYXAodi5iZWdpbigpLCB2LmVuZCgpLCBncmVhdGVyPGludD4oKSk7CisKKyAgc29ydF9oZWFwKHYuYmVnaW4oKSwgdi5lbmQoKSwgZ3JlYXRlcjxpbnQ+KCkpOworCisgIENQUFVOSVRfQVNTRVJUKHZbMF09PTIwKTsKKyAgQ1BQVU5JVF9BU1NFUlQodlsxXT09Nyk7CisgIENQUFVOSVRfQVNTRVJUKHZbMl09PTQpOworICBDUFBVTklUX0FTU0VSVCh2WzNdPT0xKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9pbmNsdWRlc190ZXN0LmNwcCBiL3Rlc3QvdW5pdC9pbmNsdWRlc190ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjQxNzk3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L2luY2x1ZGVzX3Rlc3QuY3BwCkBAIC0wLDAgKzEsODcgQEAKKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpbmNsdWRlICJjcHB1bml0L2NwcHVuaXRfcHJveHkuaCIKKworI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkKF9TVExQX1VTRV9OQU1FU1BBQ0VTKQordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyNlbmRpZgorCisvLworLy8gVGVzdENhc2UgY2xhc3MKKy8vCitjbGFzcyBJbmNsdWRlc1Rlc3QgOiBwdWJsaWMgQ1BQVU5JVF9OUzo6VGVzdENhc2UKK3sKKyAgQ1BQVU5JVF9URVNUX1NVSVRFKEluY2x1ZGVzVGVzdCk7CisgIENQUFVOSVRfVEVTVChpbmNsMCk7CisgIENQUFVOSVRfVEVTVChpbmNsMSk7CisgIENQUFVOSVRfVEVTVChpbmNsMik7CisgIENQUFVOSVRfVEVTVF9TVUlURV9FTkQoKTsKKworcHJvdGVjdGVkOgorICB2b2lkIGluY2wwKCk7CisgIHZvaWQgaW5jbDEoKTsKKyAgdm9pZCBpbmNsMigpOworCisgIHN0YXRpYyBib29sIGNvbXBhcmVfc3RyaW5ncyhjb25zdCBjaGFyKiBzMV8sIGNvbnN0IGNoYXIqIHMyXykKKyAgeworICAgIHJldHVybiBzdHJjbXAoczFfLCBzMl8pIDwgMCA/IDEgOiAwOworICB9Cit9OworCitDUFBVTklUX1RFU1RfU1VJVEVfUkVHSVNUUkFUSU9OKEluY2x1ZGVzVGVzdCk7CisKKy8vCisvLyB0ZXN0cyBpbXBsZW1lbnRhdGlvbgorLy8KK3ZvaWQgSW5jbHVkZXNUZXN0OjppbmNsMCgpCit7CisgIGludCBudW1iZXJzMVs1XSA9IHsgMSwgMiwgMywgNCwgNSB9OworICAvL2ludCBudW1iZXJzMls1XSA9IHsgMSwgMiwgNCwgOCwgMTYgfTsKKyAgaW50IG51bWJlcnMzWzJdID0geyA0LCA4IH07CisgIGJvb2wgcjE9aW5jbHVkZXMobnVtYmVyczEsIG51bWJlcnMxICsgNSwgbnVtYmVyczMsIG51bWJlcnMzICsgMik7CisgIENQUFVOSVRfQVNTRVJUKCFyMSk7Cit9Cit2b2lkIEluY2x1ZGVzVGVzdDo6aW5jbDEoKQoreworICB2ZWN0b3I8aW50PiB2MSgxMCk7CisgIHZlY3RvcjxpbnQ+IHYyKDMpOworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgKHNpemVfdClpIDwgdjEuc2l6ZSgpOyArK2kpIHsKKyAgICB2MVtpXSA9IGk7CisgIH0KKworICBib29sIHIxPWluY2x1ZGVzKHYxLmJlZ2luKCksIHYxLmVuZCgpLCB2Mi5iZWdpbigpLCB2Mi5lbmQoKSk7CisgIENQUFVOSVRfQVNTRVJUKCFyMSk7CisKKyAgZm9yIChpID0gMDsgKHNpemVfdClpIDwgdjIuc2l6ZSgpOyArK2kpCisgICAgdjJbaV0gPSBpICsgMzsKKworICBib29sIHIyPWluY2x1ZGVzKHYxLmJlZ2luKCksIHYxLmVuZCgpLCB2Mi5iZWdpbigpLCB2Mi5lbmQoKSk7CisgIENQUFVOSVRfQVNTRVJUKHIyKTsKK30KK3ZvaWQgSW5jbHVkZXNUZXN0OjppbmNsMigpCit7CisgIGNoYXIgY29uc3QqIG5hbWVzW10gPSB7ICAiVG9kZCIsICJNaWtlIiwgIkdyYWhhbSIsICJKYWNrIiwgIkJyZXR0In07CisKKyAgY29uc3QgdW5zaWduZWQgbmFtZVNpemUgPSBzaXplb2YobmFtZXMpL3NpemVvZihuYW1lc1swXSk7CisgIHZlY3RvciA8Y2hhciBjb25zdCo+IHYxKG5hbWVTaXplKTsKKyAgZm9yIChpbnQgaSA9IDA7IChzaXplX3QpaSA8IHYxLnNpemUoKTsgKytpKSB7CisgICAgdjFbaV0gPSBuYW1lc1tpXTsKKyAgfQorICB2ZWN0b3IgPGNoYXIgY29uc3QqPiB2MigyKTsKKworICB2MlswXSA9ICJmb28iOworICB2MlsxXSA9ICJiYXIiOworICBzb3J0KHYxLmJlZ2luKCksIHYxLmVuZCgpLCBjb21wYXJlX3N0cmluZ3MpOworICBzb3J0KHYyLmJlZ2luKCksIHYyLmVuZCgpLCBjb21wYXJlX3N0cmluZ3MpOworCisgIGJvb2wgcjEgPSBpbmNsdWRlcyh2MS5iZWdpbigpLCB2MS5lbmQoKSwgdjIuYmVnaW4oKSwgdjIuZW5kKCksIGNvbXBhcmVfc3RyaW5ncyk7CisgIENQUFVOSVRfQVNTRVJUKCFyMSk7CisKKyAgdjJbMF0gPSAiQnJldHQiOworICB2MlsxXSA9ICJUb2RkIjsKKyAgYm9vbCByMiA9IGluY2x1ZGVzKHYxLmJlZ2luKCksIHYxLmVuZCgpLCB2Mi5iZWdpbigpLCB2Mi5lbmQoKSwgY29tcGFyZV9zdHJpbmdzKTsKKyAgQ1BQVU5JVF9BU1NFUlQocjIpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L2lubmVycHJvZF90ZXN0LmNwcCBiL3Rlc3QvdW5pdC9pbm5lcnByb2RfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q3N2Y1ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9pbm5lcnByb2RfdGVzdC5jcHAKQEAgLTAsMCArMSw3MiBAQAorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8bnVtZXJpYz4KKworI2luY2x1ZGUgImNwcHVuaXQvY3BwdW5pdF9wcm94eS5oIgorCisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IGRlZmluZWQoX1NUTFBfVVNFX05BTUVTUEFDRVMpCit1c2luZyBuYW1lc3BhY2Ugc3RkOworI2VuZGlmCisKKy8vCisvLyBUZXN0Q2FzZSBjbGFzcworLy8KK2NsYXNzIElubmVycHJvZFRlc3QgOiBwdWJsaWMgQ1BQVU5JVF9OUzo6VGVzdENhc2UKK3sKKyAgQ1BQVU5JVF9URVNUX1NVSVRFKElubmVycHJvZFRlc3QpOworICBDUFBVTklUX1RFU1QoaW5wcm9kMCk7CisgIENQUFVOSVRfVEVTVChpbnByb2QxKTsKKyAgQ1BQVU5JVF9URVNUKGlucHJvZDIpOworICBDUFBVTklUX1RFU1RfU1VJVEVfRU5EKCk7CisKK3Byb3RlY3RlZDoKKyAgdm9pZCBpbnByb2QwKCk7CisgIHZvaWQgaW5wcm9kMSgpOworICB2b2lkIGlucHJvZDIoKTsKKworICBzdGF0aWMgc2l6ZV90IGFkZChzaXplX3QgYV8sIHNpemVfdCBiXykgeworICAgIHJldHVybiBhXyArIGJfOworICB9CisKKyAgc3RhdGljIHNpemVfdCBtdWx0KHNpemVfdCBhXywgc2l6ZV90IGJfKSB7CisgICAgcmV0dXJuIGFfICogYl87CisgIH0KK307CisKK0NQUFVOSVRfVEVTVF9TVUlURV9SRUdJU1RSQVRJT04oSW5uZXJwcm9kVGVzdCk7CisKKy8vCisvLyB0ZXN0cyBpbXBsZW1lbnRhdGlvbgorLy8KK3ZvaWQgSW5uZXJwcm9kVGVzdDo6aW5wcm9kMCgpCit7CisgIGludCB2ZWN0b3IxWzVdID0geyAxLCAyLCAzLCA0LCA1IH07CisgIGludCB2ZWN0b3IyWzVdID0geyAxLCAyLCAzLCA0LCA1IH07CisKKyAgaW50IHJlc3VsdDsKKyAgcmVzdWx0ID0gaW5uZXJfcHJvZHVjdCh2ZWN0b3IxLCB2ZWN0b3IxICsgNSwgdmVjdG9yMiwgMCk7CisgIENQUFVOSVRfQVNTRVJUKHJlc3VsdD09NTUpOworfQordm9pZCBJbm5lcnByb2RUZXN0OjppbnByb2QxKCkKK3sKKyAgdmVjdG9yPHNpemVfdD4gdjEoMyk7CisgIHZlY3RvcjxzaXplX3Q+IHYyKHYxLnNpemUoKSk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdjEuc2l6ZSgpOyArK2kpIHsKKyAgICB2MVtpXSA9IGkgKyAxOworICAgIHYyW2ldID0gdjEuc2l6ZSgpIC0gaTsKKyAgfQorICBzaXplX3QgcmVzdWx0ID0gaW5uZXJfcHJvZHVjdCh2MS5iZWdpbigpLCB2MS5lbmQoKSwgdjIuYmVnaW4oKSwgKHNpemVfdCkwKTsKKyAgQ1BQVU5JVF9BU1NFUlQocmVzdWx0ID09IDEwKTsKK30KK3ZvaWQgSW5uZXJwcm9kVGVzdDo6aW5wcm9kMigpCit7CisgIHZlY3RvcjxzaXplX3Q+IHYxKDMpOworICB2ZWN0b3I8c2l6ZV90PiB2Mih2MS5zaXplKCkpOworICBmb3Ioc2l6ZV90IGkgPSAwOyBpIDwgdjEuc2l6ZSgpOyArK2kpIHsKKyAgICB2MVtpXSA9IGkgKyAxOworICAgIHYyW2ldID0gdjEuc2l6ZSgpIC0gaTsKKyAgfQorICBzaXplX3QgcmVzdWx0PWlubmVyX3Byb2R1Y3QodjEuYmVnaW4oKSwgdjEuZW5kKCksIHYyLmJlZ2luKCksIChzaXplX3QpMSwgbXVsdCwgYWRkKTsKKworICBDUFBVTklUX0FTU0VSVChyZXN1bHQgPT0gNjQpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L2lucGxhY2VfdGVzdC5jcHAgYi90ZXN0L3VuaXQvaW5wbGFjZV90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzliZDk5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L2lucGxhY2VfdGVzdC5jcHAKQEAgLTAsMCArMSw2MSBAQAorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKworI2luY2x1ZGUgImNwcHVuaXQvY3BwdW5pdF9wcm94eS5oIgorCisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IGRlZmluZWQoX1NUTFBfVVNFX05BTUVTUEFDRVMpCit1c2luZyBuYW1lc3BhY2Ugc3RkOworI2VuZGlmCisKKy8vCisvLyBUZXN0Q2FzZSBjbGFzcworLy8KK2NsYXNzIElucGxhY2VUZXN0IDogcHVibGljIENQUFVOSVRfTlM6OlRlc3RDYXNlCit7CisgIENQUFVOSVRfVEVTVF9TVUlURShJbnBsYWNlVGVzdCk7CisgIENQUFVOSVRfVEVTVChpbnBsbXJnMSk7CisgIENQUFVOSVRfVEVTVChpbnBsbXJnMik7CisgIENQUFVOSVRfVEVTVF9TVUlURV9FTkQoKTsKKworcHJvdGVjdGVkOgorICB2b2lkIGlucGxtcmcxKCk7CisgIHZvaWQgaW5wbG1yZzIoKTsKK307CisKK0NQUFVOSVRfVEVTVF9TVUlURV9SRUdJU1RSQVRJT04oSW5wbGFjZVRlc3QpOworCisvLworLy8gdGVzdHMgaW1wbGVtZW50YXRpb24KKy8vCit2b2lkIElucGxhY2VUZXN0OjppbnBsbXJnMSgpCit7CisgIGludCBudW1iZXJzWzZdID0geyAxLCAxMCwgNDIsIDMsIDE2LCAzMiB9OworICBpbnBsYWNlX21lcmdlKG51bWJlcnMsIG51bWJlcnMgKyAzLCBudW1iZXJzICsgNik7CisKKyAgQ1BQVU5JVF9BU1NFUlQobnVtYmVyc1swXT09MSk7CisgIENQUFVOSVRfQVNTRVJUKG51bWJlcnNbMV09PTMpOworICBDUFBVTklUX0FTU0VSVChudW1iZXJzWzJdPT0xMCk7CisgIENQUFVOSVRfQVNTRVJUKG51bWJlcnNbM109PTE2KTsKKyAgQ1BQVU5JVF9BU1NFUlQobnVtYmVyc1s0XT09MzIpOworICBDUFBVTklUX0FTU0VSVChudW1iZXJzWzVdPT00Mik7Cit9Cit2b2lkIElucGxhY2VUZXN0OjppbnBsbXJnMigpCit7CisgIHZlY3RvcjxzaXplX3Q+IHYxKDEwKTsKKyAgZm9yKHNpemVfdCBpID0gMDsgaSA8IHYxLnNpemUoKTsgKytpKQorICAgIHYxW2ldID0odjEuc2l6ZSgpIC0gaSAtIDEpICUgNTsKKworICBpbnBsYWNlX21lcmdlKHYxLmJlZ2luKCksIHYxLmJlZ2luKCkgKyA1LCB2MS5lbmQoKSwgZ3JlYXRlcjxzaXplX3Q+KCkpOworCisgIENQUFVOSVRfQVNTRVJUKHYxWzBdPT00KTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbMV09PTQpOworICBDUFBVTklUX0FTU0VSVCh2MVsyXT09Myk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzNdPT0zKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbNF09PTIpOworICBDUFBVTklUX0FTU0VSVCh2MVs1XT09Mik7CisgIENQUFVOSVRfQVNTRVJUKHYxWzZdPT0xKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbN109PTEpOworICBDUFBVTklUX0FTU0VSVCh2MVs4XT09MCk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzldPT0wKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9pbnNlcnRfdGVzdC5jcHAgYi90ZXN0L3VuaXQvaW5zZXJ0X3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwZWMxYTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvaW5zZXJ0X3Rlc3QuY3BwCkBAIC0wLDAgKzEsNzAgQEAKKyNpbmNsdWRlIDxkZXF1ZT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSAiY3BwdW5pdC9jcHB1bml0X3Byb3h5LmgiCisKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZChfU1RMUF9VU0VfTkFNRVNQQUNFUykKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisjZW5kaWYKKworLy8KKy8vIFRlc3RDYXNlIGNsYXNzCisvLworY2xhc3MgSW5zZXJ0VGVzdCA6IHB1YmxpYyBDUFBVTklUX05TOjpUZXN0Q2FzZQoreworICBDUFBVTklUX1RFU1RfU1VJVEUoSW5zZXJ0VGVzdCk7CisgIENQUFVOSVRfVEVTVChpbnNlcnQxKTsKKyAgQ1BQVU5JVF9URVNUKGluc2VydDIpOworICBDUFBVTklUX1RFU1RfU1VJVEVfRU5EKCk7CisKK3Byb3RlY3RlZDoKKyAgdm9pZCBpbnNlcnQxKCk7CisgIHZvaWQgaW5zZXJ0MigpOworfTsKKworQ1BQVU5JVF9URVNUX1NVSVRFX1JFR0lTVFJBVElPTihJbnNlcnRUZXN0KTsKKworLy8KKy8vIHRlc3RzIGltcGxlbWVudGF0aW9uCisvLwordm9pZCBJbnNlcnRUZXN0OjppbnNlcnQxKCkKK3sKKyAgY2hhciBjb25zdCogYXJyYXkxIFtdID0geyAibGF1cmllIiwgImplbm5pZmVyIiwgImxlaXNhIiB9OworICBjaGFyIGNvbnN0KiBhcnJheTIgW10gPSB7ICJhbWFuZGEiLCAic2Fza2lhIiwgImNhcnJpZSIgfTsKKworICBkZXF1ZTxjaGFyIGNvbnN0Kj4gbmFtZXMoYXJyYXkxLCBhcnJheTEgKyAzKTsKKyAgZGVxdWU8Y2hhciBjb25zdCo+OjppdGVyYXRvciBpID0gbmFtZXMuYmVnaW4oKSArIDI7CisKKyAgaW5zZXJ0X2l0ZXJhdG9yPGRlcXVlIDxjaGFyIGNvbnN0Kj4gPiBpdGQobmFtZXMsIGkpOworICBpdGQgPSBjb3B5KGFycmF5MiwgYXJyYXkyICsgMywgaW5zZXJ0X2l0ZXJhdG9yPGRlcXVlIDxjaGFyIGNvbnN0Kj4gPihuYW1lcywgaSkpOworCisgIENQUFVOSVRfQVNTRVJUKCAhc3RyY21wKG5hbWVzWzBdLCAibGF1cmllIikgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoICFzdHJjbXAobmFtZXNbMV0sICJqZW5uaWZlciIpICk7CisgIENQUFVOSVRfQVNTRVJUKCAhc3RyY21wKG5hbWVzWzJdLCAiYW1hbmRhIikgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoICFzdHJjbXAobmFtZXNbM10sICJzYXNraWEiKSApOworICBDUFBVTklUX0FTU0VSVCggIXN0cmNtcChuYW1lc1s0XSwgImNhcnJpZSIpICk7CisgIENQUFVOSVRfQVNTRVJUKCAhc3RyY21wKG5hbWVzWzVdLCAibGVpc2EiKSApOworCisgIGNvcHkoYXJyYXkxLCBhcnJheTEgKyAzLCBpdGQpOworICBDUFBVTklUX0FTU0VSVCggIXN0cmNtcChuYW1lc1s1XSwgImxhdXJpZSIpICk7CisgIENQUFVOSVRfQVNTRVJUKCAhc3RyY21wKG5hbWVzWzZdLCAiamVubmlmZXIiKSApOworICBDUFBVTklUX0FTU0VSVCggIXN0cmNtcChuYW1lc1s3XSwgImxlaXNhIikgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoICFzdHJjbXAobmFtZXNbOF0sICJsZWlzYSIpICk7Cit9Cit2b2lkIEluc2VydFRlc3Q6Omluc2VydDIoKQoreworICBjaGFyIGNvbnN0KiBhcnJheTEgW10gPSB7ICJsYXVyaWUiLCAiamVubmlmZXIiLCAibGVpc2EiIH07CisgIGNoYXIgY29uc3QqIGFycmF5MiBbXSA9IHsgImFtYW5kYSIsICJzYXNraWEiLCAiY2FycmllIiB9OworCisgIGRlcXVlPGNoYXIgY29uc3QqPiBuYW1lcyhhcnJheTEsIGFycmF5MSArIDMpOworICBkZXF1ZTxjaGFyIGNvbnN0Kj46Oml0ZXJhdG9yIGkgPSBuYW1lcy5iZWdpbigpICsgMjsKKyAgY29weShhcnJheTIsIGFycmF5MiArIDMsIGluc2VydGVyKG5hbWVzLCBpKSk7CisKKyAgQ1BQVU5JVF9BU1NFUlQoICFzdHJjbXAobmFtZXNbMF0sICJsYXVyaWUiKSApOworICBDUFBVTklUX0FTU0VSVCggIXN0cmNtcChuYW1lc1sxXSwgImplbm5pZmVyIikgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoICFzdHJjbXAobmFtZXNbMl0sICJhbWFuZGEiKSApOworICBDUFBVTklUX0FTU0VSVCggIXN0cmNtcChuYW1lc1szXSwgInNhc2tpYSIpICk7CisgIENQUFVOSVRfQVNTRVJUKCAhc3RyY21wKG5hbWVzWzRdLCAiY2FycmllIikgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoICFzdHJjbXAobmFtZXNbNV0sICJsZWlzYSIpICk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvaW9pdGVyX3Rlc3QuY3BwIGIvdGVzdC91bml0L2lvaXRlcl90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjBhZWI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L2lvaXRlcl90ZXN0LmNwcApAQCAtMCwwICsxLDExMCBAQAorI2luY2x1ZGUgPHN0cmluZz4KKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgIWRlZmluZWQgKF9TVExQX1VTRV9OT19JT1NUUkVBTVMpCisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisKKyNpbmNsdWRlICJjcHB1bml0L2NwcHVuaXRfcHJveHkuaCIKKworI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkKF9TVExQX1VTRV9OQU1FU1BBQ0VTKQordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyNlbmRpZgorCitjbGFzcyBJb2l0ZXJUZXN0IDogcHVibGljIENQUFVOSVRfTlM6OlRlc3RDYXNlCit7CisgIENQUFVOSVRfVEVTVF9TVUlURShJb2l0ZXJUZXN0KTsKKyAgQ1BQVU5JVF9URVNUKGlvaXRlcl90ZXN0KTsKKyAgQ1BQVU5JVF9URVNUKGFzc2lnbl90ZXN0KTsKKyAgQ1BQVU5JVF9URVNUKGFzc2lnbjJfdGVzdCk7CisgIENQUFVOSVRfVEVTVF9TVUlURV9FTkQoKTsKKworcHJvdGVjdGVkOgorICB2b2lkIGlvaXRlcl90ZXN0KCk7CisgIHZvaWQgYXNzaWduX3Rlc3QoKTsKKyAgdm9pZCBhc3NpZ24yX3Rlc3QoKTsKK307CisKK0NQUFVOSVRfVEVTVF9TVUlURV9SRUdJU1RSQVRJT04oSW9pdGVyVGVzdCk7CisKK3ZvaWQgSW9pdGVyVGVzdDo6aW9pdGVyX3Rlc3QoKQoreworCisgIGNoYXIgYzsKKyAgY29uc3QgY2hhciAqcGM7CisgIGNvbnN0IGNoYXIgKnN0cm9yZyA9ICJhYmNkIjsKKyAgc3RyaW5nIHRtcDsKKworICBzdHJpbmcgb2JqU3RyKHN0cm9yZyk7CisKKyAgaXN0cmluZ3N0cmVhbSBvYmpJU3RyU3RybTEob2JqU3RyKTsKKyAgaXN0cmluZ3N0cmVhbSBvYmpJU3RyU3RybTIob2JqU3RyKTsKKyAgaXN0cmluZ3N0cmVhbSBvYmpJU3RyU3RybTMob2JqU3RyKTsKKworICBwYyA9IHN0cm9yZzsKKyAgc3RyaW5nOjpzaXplX3R5cGUgc3ogPSBzdHJsZW4oc3Ryb3JnKTsKKyAgc3RyaW5nOjpzaXplX3R5cGUgaTsKKyAgZm9yICggaSA9IDA7IGkgPCBzejsgKytpICkgeworICAgIGMgPSAqcGMrKzsKKyAgICB0bXAgKz0gYzsKKyAgfQorICBDUFBVTklUX0FTU0VSVCggdG1wID09ICJhYmNkIiApOworCisgIGlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiBvYmpJU3RybWJJdDEoIG9iaklTdHJTdHJtMS5yZGJ1ZigpICk7CisgIGlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiBlbmQ7CisKKyAgdG1wLmNsZWFyKCk7CisKKyAgZm9yICggaSA9IDA7IGkgPCBzeiAvKiBvYmpJU3RybWJJdDEgIT0gZW5kICovOyArK2kgKSB7CisgICAgYyA9ICpvYmpJU3RybWJJdDErKzsKKyAgICB0bXAgKz0gYzsKKyAgfQorICBDUFBVTklUX0FTU0VSVCggdG1wID09ICJhYmNkIiApOworCisgIHRtcC5jbGVhcigpOworCisgIGlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiBvYmpJU3RybWJJdDIoIG9iaklTdHJTdHJtMi5yZGJ1ZigpICk7CisgIGZvciAoIGkgPSAwOyBpIDwgc3o7ICsraSApIHsKKyAgICBjID0gKm9iaklTdHJtYkl0MjsKKyAgICB0bXAgKz0gYzsKKyAgICBvYmpJU3RybWJJdDIrKzsKKyAgfQorICBDUFBVTklUX0FTU0VSVCggdG1wID09ICJhYmNkIiApOworCisgIHRtcC5jbGVhcigpOworCisgIGlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiBvYmpJU3RybWJJdDMoIG9iaklTdHJTdHJtMy5yZGJ1ZigpICk7CisKKyAgd2hpbGUgKCBvYmpJU3RybWJJdDMgIT0gZW5kICkgeworICAgIGMgPSAqb2JqSVN0cm1iSXQzKys7CisgICAgdG1wICs9IGM7CisgIH0KKyAgQ1BQVU5JVF9BU1NFUlQoIHRtcCA9PSAiYWJjZCIgKTsKK30KKwordm9pZCBJb2l0ZXJUZXN0Ojphc3NpZ25fdGVzdCgpCit7CisgIHN0cmluZ3N0cmVhbSBzKCAiMTIzNDU2Nzg5MCIgKTsKKyAgdmVjdG9yPGNoYXI+IHY7CisKKyAgdi5hc3NpZ24oIGlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4ocyksIGlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oKSApOworICBDUFBVTklUX0NIRUNLKCB2LnNpemUoKSA9PSAxMCApOworICBpZiAoIHYuc2l6ZSgpID09IDEwICkgeworICAgIENQUFVOSVRfQ0hFQ0soIHZbMF0gPT0gJzEnICk7CisgICAgQ1BQVU5JVF9DSEVDSyggdls5XSA9PSAnMCcgKTsKKyAgfQorfQorCit2b2lkIElvaXRlclRlc3Q6OmFzc2lnbjJfdGVzdCgpCit7CisgIHN0cmluZ3N0cmVhbSBzKCAiMTIzNDU2Nzg5MCIgKTsKKyAgdmVjdG9yPGNoYXI+IHY7CisKKyAgdi5hc3NpZ24oIGlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4ocy5yZGJ1ZigpKSwgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPigpICk7CisgIENQUFVOSVRfQ0hFQ0soIHYuc2l6ZSgpID09IDEwICk7CisgIGlmICggdi5zaXplKCkgPT0gMTAgKSB7CisgICAgQ1BQVU5JVF9DSEVDSyggdlswXSA9PSAnMScgKTsKKyAgICBDUFBVTklUX0NIRUNLKCB2WzldID09ICcwJyApOworICB9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L2lvbWFuaXBfaGVhZGVyX3Rlc3QuY3BwIGIvdGVzdC91bml0L2lvbWFuaXBfaGVhZGVyX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMGFiMGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvaW9tYW5pcF9oZWFkZXJfdGVzdC5jcHAKQEAgLTAsMCArMSwxMCBAQAorLyogVGhpcyB0ZXN0IHB1cnBvc2UgaXMgc2ltcGx5IHRvIGNoZWNrIFN0YW5kYXJkIGhlYWRlciBpbmRlcGVuZGFuY3kgdGhhdAorICogaXMgdG8gc2F5IHRoYXQgdGhlIGhlYWRlciBjYW4gYmUgaW5jbHVkZWQgYWxvbmUgd2l0aG91dCBhbnkgcHJldmlvdXMKKyAqIGluY2x1ZGUuCisgKiBBZGRpdGlvbm5hbHksIGZvciBDIFN0YW5kYXJkIGhlYWRlcnMgdGhhdCBTVExwb3J0IGV4cG9zZSwgaXQgY2FuIGFsc28gYmUKKyAqIHVzZWQgdG8gY2hlY2sgdGhhdCBmaWxlcyBpbmNsdWRlZCBieSB0aG9zZSBoZWFkZXJzIGFyZSBjb21wYXRpYmxlIHdpdGgKKyAqIHB1cmUgQyBjb21waWxlcnMuCisgKi8KKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fSU9TVFJFQU1TKQorIyAgaW5jbHVkZSA8aW9tYW5pcD4KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L2lvc19oZWFkZXJfdGVzdC5jcHAgYi90ZXN0L3VuaXQvaW9zX2hlYWRlcl90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjM5NjQzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L2lvc19oZWFkZXJfdGVzdC5jcHAKQEAgLTAsMCArMSwxMCBAQAorLyogVGhpcyB0ZXN0IHB1cnBvc2UgaXMgc2ltcGx5IHRvIGNoZWNrIFN0YW5kYXJkIGhlYWRlciBpbmRlcGVuZGFuY3kgdGhhdAorICogaXMgdG8gc2F5IHRoYXQgdGhlIGhlYWRlciBjYW4gYmUgaW5jbHVkZWQgYWxvbmUgd2l0aG91dCBhbnkgcHJldmlvdXMKKyAqIGluY2x1ZGUuCisgKiBBZGRpdGlvbm5hbHksIGZvciBDIFN0YW5kYXJkIGhlYWRlcnMgdGhhdCBTVExwb3J0IGV4cG9zZSwgaXQgY2FuIGFsc28gYmUKKyAqIHVzZWQgdG8gY2hlY2sgdGhhdCBmaWxlcyBpbmNsdWRlZCBieSB0aG9zZSBoZWFkZXJzIGFyZSBjb21wYXRpYmxlIHdpdGgKKyAqIHB1cmUgQyBjb21waWxlcnMuCisgKi8KKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fSU9TVFJFQU1TKQorIyAgaW5jbHVkZSA8aW9zPgorI2VuZGlmCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvaW9zZndkX2hlYWRlcl90ZXN0LmNwcCBiL3Rlc3QvdW5pdC9pb3Nmd2RfaGVhZGVyX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjM2FkY2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvaW9zZndkX2hlYWRlcl90ZXN0LmNwcApAQCAtMCwwICsxLDEwIEBACisvKiBUaGlzIHRlc3QgcHVycG9zZSBpcyBzaW1wbHkgdG8gY2hlY2sgU3RhbmRhcmQgaGVhZGVyIGluZGVwZW5kYW5jeSB0aGF0CisgKiBpcyB0byBzYXkgdGhhdCB0aGUgaGVhZGVyIGNhbiBiZSBpbmNsdWRlZCBhbG9uZSB3aXRob3V0IGFueSBwcmV2aW91cworICogaW5jbHVkZS4KKyAqIEFkZGl0aW9ubmFseSwgZm9yIEMgU3RhbmRhcmQgaGVhZGVycyB0aGF0IFNUTHBvcnQgZXhwb3NlLCBpdCBjYW4gYWxzbyBiZQorICogdXNlZCB0byBjaGVjayB0aGF0IGZpbGVzIGluY2x1ZGVkIGJ5IHRob3NlIGhlYWRlcnMgYXJlIGNvbXBhdGlibGUgd2l0aAorICogcHVyZSBDIGNvbXBpbGVycy4KKyAqLworI2lmbmRlZiBfU1RMUF9OT19JT1NUUkVBTVMKKyMgIGluY2x1ZGUgPGlvc2Z3ZD4KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L2lvc3RyZWFtX2hlYWRlcl90ZXN0LmNwcCBiL3Rlc3QvdW5pdC9pb3N0cmVhbV9oZWFkZXJfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFlNmRmNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9pb3N0cmVhbV9oZWFkZXJfdGVzdC5jcHAKQEAgLTAsMCArMSwxMCBAQAorLyogVGhpcyB0ZXN0IHB1cnBvc2UgaXMgc2ltcGx5IHRvIGNoZWNrIFN0YW5kYXJkIGhlYWRlciBpbmRlcGVuZGFuY3kgdGhhdAorICogaXMgdG8gc2F5IHRoYXQgdGhlIGhlYWRlciBjYW4gYmUgaW5jbHVkZWQgYWxvbmUgd2l0aG91dCBhbnkgcHJldmlvdXMKKyAqIGluY2x1ZGUuCisgKiBBZGRpdGlvbm5hbHksIGZvciBDIFN0YW5kYXJkIGhlYWRlcnMgdGhhdCBTVExwb3J0IGV4cG9zZSwgaXQgY2FuIGFsc28gYmUKKyAqIHVzZWQgdG8gY2hlY2sgdGhhdCBmaWxlcyBpbmNsdWRlZCBieSB0aG9zZSBoZWFkZXJzIGFyZSBjb21wYXRpYmxlIHdpdGgKKyAqIHB1cmUgQyBjb21waWxlcnMuCisgKi8KKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fSU9TVFJFQU1TKQorIyAgaW5jbHVkZSA8aW9zdHJlYW0+CisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9pb3N0cmVhbV90ZXN0LmNwcCBiL3Rlc3QvdW5pdC9pb3N0cmVhbV90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGRiNWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L2lvc3RyZWFtX3Rlc3QuY3BwCkBAIC0wLDAgKzEsMTE2IEBACisjaW5jbHVkZSA8c3RyaW5nPgorCisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8ICFkZWZpbmVkIChfU1RMUF9VU0VfTk9fSU9TVFJFQU1TKQorIyAgaW5jbHVkZSA8c3N0cmVhbT4KKy8vIyAgaW5jbHVkZSA8bG9jYWxlPgorIyAgaW5jbHVkZSA8aW9zdHJlYW0+CisvLyMgIGluY2x1ZGUgPHN0ZGV4Y2VwdD4KKworIyAgaW5jbHVkZSAiY3BwdW5pdC9jcHB1bml0X3Byb3h5LmgiCisKKyMgIGlmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkKF9TVExQX1VTRV9OQU1FU1BBQ0VTKQordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyMgIGVuZGlmCisKKy8vCisvLyBUZXN0Q2FzZSBjbGFzcworLy8KK2NsYXNzIElPU3RyZWFtVGVzdCA6IHB1YmxpYyBDUFBVTklUX05TOjpUZXN0Q2FzZQoreworICBDUFBVTklUX1RFU1RfU1VJVEUoSU9TdHJlYW1UZXN0KTsKKyAgQ1BQVU5JVF9URVNUKG1hbmlwdWxhdG9ycyk7CisgIENQUFVOSVRfVEVTVChpbl9hdmFpbCk7CisvLyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiBkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQorICAvL0NQUFVOSVRfSUdOT1JFOworLy8jZW5kaWYKKyAgLy9DUFBVTklUX1RFU1Qod2ltYnVlKTsKKyAgQ1BQVU5JVF9URVNUX1NVSVRFX0VORCgpOworCitwcml2YXRlOgorICB2b2lkIG1hbmlwdWxhdG9ycygpOworICB2b2lkIGluX2F2YWlsKCk7CisgIC8vdm9pZCB3aW1idWUoKTsKK307CisKK0NQUFVOSVRfVEVTVF9TVUlURV9SRUdJU1RSQVRJT04oSU9TdHJlYW1UZXN0KTsKKworLy8KKy8vIHRlc3RzIGltcGxlbWVudGF0aW9uCisvLwordm9pZCBJT1N0cmVhbVRlc3Q6Om1hbmlwdWxhdG9ycygpCit7CisgIHsKKyAgICBpc3RyaW5nc3RyZWFtIGlzdHI7CisgICAgaXN0ci5zdHIoImJhciIpOworCisgICAgaXN0ciA+PiB3czsKKyAgICBDUFBVTklUX0FTU0VSVCggaXN0ci5nb29kKCkgKTsKKworICAgIHN0cmluZyBmb287CisgICAgaXN0ciA+PiBmb287CisgICAgQ1BQVU5JVF9BU1NFUlQoIGlzdHIuZW9mKCkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggIWlzdHIuZmFpbCgpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGZvbyA9PSAiYmFyIiApOworCisgICAgaXN0ciA+PiB3czsKKyAgICBDUFBVTklUX0FTU0VSVCggaXN0ci5lb2YoKSApOworICAgIENQUFVOSVRfQVNTRVJUKCAhaXN0ci5mYWlsKCkgKTsKKyAgICBpc3RyLmNsZWFyKCk7CisgIH0KKworICB7CisgICAgaXN0cmluZ3N0cmVhbSBpc3RyOworICAgIGlzdHIuc3RyKCIgIGJhciAgIik7CisKKyAgICBpc3RyID4+IHdzOworICAgIENQUFVOSVRfQVNTRVJUKCBpc3RyLmdvb2QoKSApOworCisgICAgc3RyaW5nIGZvbzsKKyAgICBpc3RyID4+IGZvbzsKKyAgICBDUFBVTklUX0FTU0VSVCggIWlzdHIuZW9mKCkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggIWlzdHIuZmFpbCgpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGZvbyA9PSAiYmFyIiApOworCisgICAgaXN0ciA+PiB3czsKKyAgICBDUFBVTklUX0FTU0VSVCggaXN0ci5lb2YoKSApOworICAgIENQUFVOSVRfQVNTRVJUKCAhaXN0ci5mYWlsKCkgKTsKKyAgICBpc3RyLmNsZWFyKCk7CisgIH0KK30KKworCit2b2lkIElPU3RyZWFtVGVzdDo6aW5fYXZhaWwoKQoreworICBDUFBVTklUX0NIRUNLKCBjaW4ucmRidWYoKS0+aW5fYXZhaWwoKSA9PSAwICk7CisgIENQUFVOSVRfQ0hFQ0soIGNvdXQucmRidWYoKS0+aW5fYXZhaWwoKSA9PSAtMSApOworICBDUFBVTklUX0NIRUNLKCBjbG9nLnJkYnVmKCktPmluX2F2YWlsKCkgPT0gLTEgKTsKKyAgQ1BQVU5JVF9DSEVDSyggY2Vyci5yZGJ1ZigpLT5pbl9hdmFpbCgpID09IC0xICk7CisKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgIWRlZmluZWQgKF9TVExQX05PX1dDSEFSX1QpCisgIENQUFVOSVRfQ0hFQ0soIHdjaW4ucmRidWYoKS0+aW5fYXZhaWwoKSA9PSAwICk7CisgIENQUFVOSVRfQ0hFQ0soIHdjb3V0LnJkYnVmKCktPmluX2F2YWlsKCkgPT0gMCApOworICBDUFBVTklUX0NIRUNLKCB3Y2xvZy5yZGJ1ZigpLT5pbl9hdmFpbCgpID09IDAgKTsKKyAgQ1BQVU5JVF9DSEVDSyggd2NlcnIucmRidWYoKS0+aW5fYXZhaWwoKSA9PSAwICk7CisjZW5kaWYKK30KKworLy92b2lkIElPU3RyZWFtVGVzdDo6d2ltYnVlKCkKKy8veworLy8jaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8ICFkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQorLy8gIGxvY2FsZSBsb2M7CisvLyAgdHJ5IHsKKy8vICAgIGxvY2FsZSB0bXAoIi44NjYiKTsKKy8vICAgIGxvYyA9IHRtcDsKKy8vICB9CisvLyAgY2F0Y2ggKGNvbnN0IHJ1bnRpbWVfZXJyb3ImKSB7CisvLyAgICByZXR1cm47CisvLyAgfQorLy8KKy8vICB3Y291dC5pbWJ1ZShsb2MpOworLy8gIHdjb3V0IDw8IEwiSGVsbG8gd29ybGQiIDw8IGVuZGw7CisvLyAgd2NvdXQuaW1idWUobG9jKTsKKy8vICB3Y291dCA8PCBMIkhlbGxvIHdvcmxkIiA8PCBlbmRsOworLy8jZW5kaWYKKy8vfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9pb3RhLmggYi90ZXN0L3VuaXQvaW90YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZmZlZmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvaW90YS5oCkBAIC0wLDAgKzEsMTggQEAKKyNpZm5kZWYgSU9UQV9ICisjZGVmaW5lIElPVEFfSAorCisjaW5jbHVkZSA8bnVtZXJpYz4KKworLy9pb3RhIGRlZmluaXRpb24gdXNlZCBpbiB1bml0IHRlc3QKK3RlbXBsYXRlIDx0eXBlbmFtZSBfSXQsIHR5cGVuYW1lIF9UcD4KK3ZvaWQgX19pb3RhKF9JdCBfX2ZpcnN0LCBfSXQgX19sYXN0LCBfVHAgX192YWwpIHsKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKKyAgaW90YShfX2ZpcnN0LCBfX2xhc3QsIF9fdmFsKTsKKyNlbHNlCisgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkgeworICAgICpfX2ZpcnN0KysgPSBfX3ZhbCsrOworICB9CisjZW5kaWYKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvaW90YV90ZXN0LmNwcCBiL3Rlc3QvdW5pdC9pb3RhX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MzM5YjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvaW90YV90ZXN0LmNwcApAQCAtMCwwICsxLDQ3IEBACisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPG51bWVyaWM+CisKKyNpbmNsdWRlICJjcHB1bml0L2NwcHVuaXRfcHJveHkuaCIKKworI2lmIGRlZmluZWQoX1NUTFBfVVNFX05BTUVTUEFDRVMpCit1c2luZyBuYW1lc3BhY2Ugc3RkOworI2VuZGlmCisKKy8vCisvLyBUZXN0Q2FzZSBjbGFzcworLy8KK2NsYXNzIElvdGFUZXN0IDogcHVibGljIENQUFVOSVRfTlM6OlRlc3RDYXNlCit7CisgIENQUFVOSVRfVEVTVF9TVUlURShJb3RhVGVzdCk7CisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IGRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpCisgIENQUFVOSVRfSUdOT1JFOworI2VuZGlmCisgIENQUFVOSVRfVEVTVChpb3RhMSk7CisgIENQUFVOSVRfVEVTVF9TVUlURV9FTkQoKTsKKworcHJvdGVjdGVkOgorICB2b2lkIGlvdGExKCk7Cit9OworCitDUFBVTklUX1RFU1RfU1VJVEVfUkVHSVNUUkFUSU9OKElvdGFUZXN0KTsKKworLy8KKy8vIHRlc3RzIGltcGxlbWVudGF0aW9uCisvLwordm9pZCBJb3RhVGVzdDo6aW90YTEoKQoreworI2lmIGRlZmluZWQgKFNUTFBPUlQpICYmICFkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQorICBpbnQgbnVtYmVyc1sxMF07CisgIGlvdGEobnVtYmVycywgbnVtYmVycyArIDEwLCA0Mik7CisgIENQUFVOSVRfQVNTRVJUKG51bWJlcnNbMF09PTQyKTsKKyAgQ1BQVU5JVF9BU1NFUlQobnVtYmVyc1sxXT09NDMpOworICBDUFBVTklUX0FTU0VSVChudW1iZXJzWzJdPT00NCk7CisgIENQUFVOSVRfQVNTRVJUKG51bWJlcnNbM109PTQ1KTsKKyAgQ1BQVU5JVF9BU1NFUlQobnVtYmVyc1s0XT09NDYpOworICBDUFBVTklUX0FTU0VSVChudW1iZXJzWzVdPT00Nyk7CisgIENQUFVOSVRfQVNTRVJUKG51bWJlcnNbNl09PTQ4KTsKKyAgQ1BQVU5JVF9BU1NFUlQobnVtYmVyc1s3XT09NDkpOworICBDUFBVTklUX0FTU0VSVChudW1iZXJzWzhdPT01MCk7CisgIENQUFVOSVRfQVNTRVJUKG51bWJlcnNbOV09PTUxKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L2lzbzY0Nl9oZWFkZXJfdGVzdC5jIGIvdGVzdC91bml0L2lzbzY0Nl9oZWFkZXJfdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZDc0MzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvaXNvNjQ2X2hlYWRlcl90ZXN0LmMKQEAgLTAsMCArMSw4IEBACisvKiBUaGlzIHRlc3QgcHVycG9zZSBpcyBzaW1wbHkgdG8gY2hlY2sgU3RhbmRhcmQgaGVhZGVyIGluZGVwZW5kYW5jeSB0aGF0CisgKiBpcyB0byBzYXkgdGhhdCB0aGUgaGVhZGVyIGNhbiBiZSBpbmNsdWRlZCBhbG9uZSB3aXRob3V0IGFueSBwcmV2aW91cworICogaW5jbHVkZS4KKyAqIEFkZGl0aW9ubmFseSwgZm9yIEMgU3RhbmRhcmQgaGVhZGVycyB0aGF0IFNUTHBvcnQgZXhwb3NlLCBpdCBjYW4gYWxzbyBiZQorICogdXNlZCB0byBjaGVjayB0aGF0IGZpbGVzIGluY2x1ZGVkIGJ5IHRob3NlIGhlYWRlcnMgYXJlIGNvbXBhdGlibGUgd2l0aAorICogcHVyZSBDIGNvbXBpbGVycy4KKyAqLworI2luY2x1ZGUgPGlzbzY0Ni5oPgpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L2lzdG1pdF90ZXN0LmNwcCBiL3Rlc3QvdW5pdC9pc3RtaXRfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFlMmQxNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9pc3RtaXRfdGVzdC5jcHAKQEAgLTAsMCArMSwxNTkgQEAKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8ICFkZWZpbmVkIChfU1RMUF9VU0VfTk9fSU9TVFJFQU1TKQorIyAgaW5jbHVkZSA8c3N0cmVhbT4KKyMgIGluY2x1ZGUgPGZ1bmN0aW9uYWw+CisjICBpbmNsdWRlIDxpdGVyYXRvcj4KKyMgIGluY2x1ZGUgPHZlY3Rvcj4KKyMgIGluY2x1ZGUgPHN0cmluZz4KKyNlbmRpZgorCisjaW5jbHVkZSAiY3BwdW5pdC9jcHB1bml0X3Byb3h5LmgiCisKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZChfU1RMUF9VU0VfTkFNRVNQQUNFUykKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisjZW5kaWYKKworLy8KKy8vIFRlc3RDYXNlIGNsYXNzCisvLworY2xhc3MgSVN0cmVhbUl0ZXJhdG9yVGVzdCA6IHB1YmxpYyBDUFBVTklUX05TOjpUZXN0Q2FzZQoreworICBDUFBVTklUX1RFU1RfU1VJVEUoSVN0cmVhbUl0ZXJhdG9yVGVzdCk7CisjaWYgZGVmaW5lZCAoU1RMUE9SVCkgJiYgZGVmaW5lZCAoX1NUTFBfVVNFX05PX0lPU1RSRUFNUykKKyAgQ1BQVU5JVF9JR05PUkU7CisjZW5kaWYKKyAgQ1BQVU5JVF9URVNUKGlzdG1pdDEpOworI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQorICBDUFBVTklUX0lHTk9SRTsKKyNlbmRpZgorICBDUFBVTklUX1RFU1QoY29weV9uX3Rlc3QpOworICBDUFBVTklUX1RFU1RfU1VJVEVfRU5EKCk7CisKK3Byb3RlY3RlZDoKKyAgdm9pZCBpc3RtaXQxKCk7CisgIHZvaWQgY29weV9uX3Rlc3QoKTsKK307CisKK0NQUFVOSVRfVEVTVF9TVUlURV9SRUdJU1RSQVRJT04oSVN0cmVhbUl0ZXJhdG9yVGVzdCk7CisKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgIWRlZmluZWQgKF9TVExQX1VTRV9OT19JT1NUUkVBTVMpCisjICBpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgIWRlZmluZWQgKF9TVExQX0xJTUlURURfREVGQVVMVF9URU1QTEFURVMpCit0eXBlZGVmIGlzdHJlYW1faXRlcmF0b3I8Y2hhcj4gaXN0cmVhbV9jaGFyX2l0ZTsKK3R5cGVkZWYgaXN0cmVhbV9pdGVyYXRvcjxpbnQ+IGlzdHJlYW1faW50X2l0ZTsKK3R5cGVkZWYgaXN0cmVhbV9pdGVyYXRvcjxzdHJpbmc+IGlzdHJlYW1fc3RyaW5nX2l0ZTsKKyMgIGVsc2UKK3R5cGVkZWYgaXN0cmVhbV9pdGVyYXRvcjxjaGFyLCBwdHJkaWZmX3Q+IGlzdHJlYW1fY2hhcl9pdGU7Cit0eXBlZGVmIGlzdHJlYW1faXRlcmF0b3I8aW50LCBwdHJkaWZmX3Q+IGlzdHJlYW1faW50X2l0ZTsKK3R5cGVkZWYgaXN0cmVhbV9pdGVyYXRvcjxzdHJpbmcsIHB0cmRpZmZfdD4gaXN0cmVhbV9zdHJpbmdfaXRlOworIyAgZW5kaWYKKyNlbmRpZgorCisvLworLy8gdGVzdHMgaW1wbGVtZW50YXRpb24KKy8vCit2b2lkIElTdHJlYW1JdGVyYXRvclRlc3Q6OmlzdG1pdDEoKQoreworI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCAhZGVmaW5lZCAoX1NUTFBfVVNFX05PX0lPU1RSRUFNUykKKyAgY29uc3QgY2hhciogYnVmZiA9ICJNeVN0cmluZyI7CisgIGlzdHJpbmdzdHJlYW0gaXN0cihidWZmKTsKKworICBjaGFyIGJ1ZmZlclsxMDBdOworICBzaXplX3QgaSA9IDA7CisgIGlzdHIudW5zZXRmKGlvczo6c2tpcHdzKTsgLy8gRGlzYWJsZSB3aGl0ZS1zcGFjZSBza2lwcGluZy4KKyAgaXN0cmVhbV9jaGFyX2l0ZSBzKGlzdHIpLCBtZW9zOworICB3aGlsZSAoIShzID09IG1lb3MpICAmJgorICAvLypUWSAwMS8xMC8xOTk5IC0gYWRkZWQgZW5kIG9mIHN0cmVhbSBjaGVjaworICAvLyBOT1RFIG9wZXJhdG9yIT0gc2hvdWxkIG5vdCBiZSB1c2VkIGhlcmUgaWZuZGVmIF9TVExQX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUgorICAgICAgICAgKCpzICE9ICdcbicpICYmCisgICAgICAgICAoaSA8IHNpemVvZihidWZmZXIpIC8gc2l6ZW9mKGJ1ZmZlclswXSkpKSB7ICAvLypUWSAwNy8yOC85OCAtIGFkZGVkIGluZGV4IGNoZWNrCisgICAgYnVmZmVyW2krK10gPSAqcysrOworICB9CisgIGJ1ZmZlcltpXSA9ICdcMCc7IC8vIE51bGwgdGVybWluYXRlIGJ1ZmZlci4KKworICBDUFBVTklUX0FTU0VSVCghc3RyY21wKGJ1ZmZlciwgYnVmZikpOworCisgIHsKKyAgICBpc3RyaW5nc3RyZWFtIGVtcHR5X2lzdHI7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGlzdHJlYW1fY2hhcl9pdGUoZW1wdHlfaXN0cikgPT0gaXN0cmVhbV9jaGFyX2l0ZSgpICk7CisgIH0KKyNlbmRpZgorfQorCit2b2lkIElTdHJlYW1JdGVyYXRvclRlc3Q6OmNvcHlfbl90ZXN0KCkKK3sKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykgJiYgIWRlZmluZWQgKF9TVExQX1VTRV9OT19JT1NUUkVBTVMpCisgIC8vVGhpcyB0ZXN0IGNoZWNrIHRoYXQgbm8gY2hhcmFjdGVyIGlzIGxvc3Qgd2hpbGUgcmVhZGluZyB0aGUgaXN0cmVhbQorICAvL3Rocm91Z2ggYSBpc3RyZWFtX2l0ZXJhdG9yLgorICB7CisgICAgaXN0cmluZ3N0cmVhbSBpc3RyKCJhYWJiY2QiKTsKKyAgICBzdHJpbmcgY2hhcnM7CisgICAgaXN0cmVhbV9jaGFyX2l0ZSBpdGUgPSBjb3B5X24oY29weV9uKGlzdHJlYW1fY2hhcl9pdGUoaXN0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsIGJhY2tfaW5zZXJ0ZXIoY2hhcnMpKS5maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCBiYWNrX2luc2VydGVyKGNoYXJzKSkuZmlyc3Q7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGNoYXJzID09ICJhYWJiIiApOworICAgIGNvcHlfbihpdGUsIDIsIGJhY2tfaW5zZXJ0ZXIoY2hhcnMpKTsKKyAgICBDUFBVTklUX0FTU0VSVCggY2hhcnMgPT0gImFhYmJjZCIgKTsKKyAgfQorCisgIHsKKyAgICBpc3RyaW5nc3RyZWFtIGlzdHIoIjExIDIyIEFBIEJCIDMzIDQ0IENDIEREIik7CisgICAgdmVjdG9yPGludD4gaW50czsKKyAgICB2ZWN0b3I8c3RyaW5nPiBzdHJpbmdzOworCisgICAgY29weV9uKGlzdHJlYW1faW50X2l0ZShpc3RyKSwgMiwgYmFja19pbnNlcnRlcihpbnRzKSk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGludHMuc2l6ZSgpID09IDIgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggaW50c1swXSA9PSAxMSApOworICAgIENQUFVOSVRfQVNTRVJUKCBpbnRzWzFdID09IDIyICk7CisgICAgaW50cy5jbGVhcigpOworICAgIGlzdHIuY2xlYXIoKTsKKyAgICBjb3B5X24oaXN0cmVhbV9zdHJpbmdfaXRlKGlzdHIpLCAyLCBiYWNrX2luc2VydGVyKHN0cmluZ3MpKTsKKyAgICBDUFBVTklUX0FTU0VSVCggc3RyaW5ncy5zaXplKCkgPT0gMiApOworICAgIENQUFVOSVRfQVNTRVJUKCBzdHJpbmdzWzBdID09ICJBQSIgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggc3RyaW5nc1sxXSA9PSAiQkIiICk7CisgICAgc3RyaW5ncy5jbGVhcigpOworICAgIGlzdHIuY2xlYXIoKTsKKyAgICAvKiBUaGUgZm9sbG93aW5nIGNvZGUgY2Fubm90IHdvcmssICczMycgaXMgZXh0cmFjdGVkIGFzIGEgc3RyaW5nCisgICAgICogaW4gdGhlIHByZXZpb3VzIGNvcHlfbiBjYWxsLCB0aGlzIHZhbHVlIGlzIHJldHVybmVkIGluIHRoZSBwYWlyCisgICAgICogcmV0dXJuZWQgYnkgY29weV9uIGJ1dCBpcyBsb3N0IGFzIHRoaXMgaXN0cmVhbV9pdGVyYXRvciBpcyBub3QgdXNlZC4KKyAgICAgKiBjb3B5X24gYW5kIGlzdHJlYW1faXRlcmF0b3IgY2FuIG9ubHkgYmUgY29tYmluZWQgc2FmZWx5IGlmOgorICAgICAqIC0geW91IGFsd2F5cyBleHRyYWN0IHRoZSBzYW1lIHR5cGUgb2YgaXN0cmVhbV9pdGVyYXRvciBhbmQgeW91IGFsd2F5cyByZXVzZQorICAgICAqIHRoZSBpc3RyZWFtX2l0ZXJhdG9yIHJldHVybmVkIGJ5IGNvcHlfbiAoc2VlIHByZXZpb3VzIHRlc3Qgd2l0aCAiYWFiYmNkIikKKyAgICAgKiAtIHlvdSBleHRyYWN0IGRpZmZlcmVudCB0eXBlIG9mIG9iamVjdCBhbmQgbm8gb2JqZWN0IGlzIGNvbnZlcnRpYmxlIHRvIGFuIG90aGVyCisgICAgICogYXMgaW4gdGhpcyBjdXJyZW50IHRlc3Qgd2hlbiB5b3UgZXh0cmFjdCBpbnQgYW5kIHN0cmluZyAod2hlbiB5b3UgZXh0cmFjdCBpbnRzCisgICAgICogYWdhaW4gaXQgZmFpbHMgYXMgaW50IGNhbiBiZSBjb252ZXJ0ZWQgdG8gc3RyaW5ncy4KKyAgICAgKgorICAgIGNvcHlfbihpc3RyZWFtX2ludF9pdGUoaXN0ciksIDIsIGJhY2tfaW5zZXJ0ZXIoaW50cykpOworICAgIENQUFVOSVRfQVNTRVJUKCBpbnRzLnNpemUoKSA9PSAyICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGludHNbMF0gPT0gMzMgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggaW50c1sxXSA9PSA0NCApOworICAgIGlzdHIuY2xlYXIoKTsKKyAgICBjb3B5X24oaXN0cmVhbV9zdHJpbmdfaXRlKGlzdHIpLCAyLCBiYWNrX2luc2VydGVyKHN0cmluZ3MpKTsKKyAgICBDUFBVTklUX0FTU0VSVCggc3RyaW5ncy5zaXplKCkgPT0gMiApOworICAgIENQUFVOSVRfQVNTRVJUKCBzdHJpbmdzWzBdID09ICJDQyIgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggc3RyaW5nc1sxXSA9PSAiREQiICk7CisgICAgKi8KKyAgfQorCisgIHsKKyAgICBpc3RyaW5nc3RyZWFtIGlzKCIxIDIgMyA0IDUgNiA3IDggOSAxMCIpOworICAgIHZlY3RvcjxpbnQ+IGludHM7CisgICAgaXN0cmVhbV9pdGVyYXRvcjxpbnQ+IGl0cihpcyk7CisgICAgaXRyID0gY29weV9uKGl0ciwgMCwgYmFja19pbnNlcnRlcihpbnRzKSkuZmlyc3Q7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGludHMuZW1wdHkoKSApOworICAgIGl0ciA9IGNvcHlfbihpdHIsIC0xLCBiYWNrX2luc2VydGVyKGludHMpKS5maXJzdDsKKyAgICBDUFBVTklUX0FTU0VSVCggaW50cy5lbXB0eSgpICk7CisgICAgaXRyID0gY29weV9uKGl0ciwgMiwgYmFja19pbnNlcnRlcihpbnRzKSkuZmlyc3Q7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGludHMuc2l6ZSgpID09IDIgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggaW50c1swXSA9PSAxICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGludHNbMV0gPT0gMiApOworICAgIGl0ciA9IGNvcHlfbihpdHIsIDIsIGJhY2tfaW5zZXJ0ZXIoaW50cykpLmZpcnN0OworICAgIENQUFVOSVRfQVNTRVJUKCBpbnRzLnNpemUoKSA9PSA0ICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGludHNbMl0gPT0gMyApOworICAgIENQUFVOSVRfQVNTRVJUKCBpbnRzWzNdID09IDQgKTsKKyAgICBpdHIgPSBjb3B5X24oaXRyLCAyLCBiYWNrX2luc2VydGVyKGludHMpKS5maXJzdDsKKyAgICBDUFBVTklUX0FTU0VSVCggaW50cy5zaXplKCkgPT0gNiApOworICAgIENQUFVOSVRfQVNTRVJUKCBpbnRzWzRdID09IDUgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggaW50c1s1XSA9PSA2ICk7CisgIH0KKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L2lzdHJlYW1faGVhZGVyX3Rlc3QuY3BwIGIvdGVzdC91bml0L2lzdHJlYW1faGVhZGVyX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjODM4NTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvaXN0cmVhbV9oZWFkZXJfdGVzdC5jcHAKQEAgLTAsMCArMSwxMCBAQAorLyogVGhpcyB0ZXN0IHB1cnBvc2UgaXMgc2ltcGx5IHRvIGNoZWNrIFN0YW5kYXJkIGhlYWRlciBpbmRlcGVuZGFuY3kgdGhhdAorICogaXMgdG8gc2F5IHRoYXQgdGhlIGhlYWRlciBjYW4gYmUgaW5jbHVkZWQgYWxvbmUgd2l0aG91dCBhbnkgcHJldmlvdXMKKyAqIGluY2x1ZGUuCisgKiBBZGRpdGlvbm5hbHksIGZvciBDIFN0YW5kYXJkIGhlYWRlcnMgdGhhdCBTVExwb3J0IGV4cG9zZSwgaXQgY2FuIGFsc28gYmUKKyAqIHVzZWQgdG8gY2hlY2sgdGhhdCBmaWxlcyBpbmNsdWRlZCBieSB0aG9zZSBoZWFkZXJzIGFyZSBjb21wYXRpYmxlIHdpdGgKKyAqIHB1cmUgQyBjb21waWxlcnMuCisgKi8KKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fSU9TVFJFQU1TKQorIyAgaW5jbHVkZSA8aXN0cmVhbT4KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L2l0ZXJfdGVzdC5jcHAgYi90ZXN0L3VuaXQvaXRlcl90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmU0MzQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L2l0ZXJfdGVzdC5jcHAKQEAgLTAsMCArMSwxNjkgQEAKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8bnVtZXJpYz4KKworI2luY2x1ZGUgImlvdGEuaCIKKyNpbmNsdWRlICJjcHB1bml0L2NwcHVuaXRfcHJveHkuaCIKKworI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkKF9TVExQX1VTRV9OQU1FU1BBQ0VTKQordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyNlbmRpZgorCisvLworLy8gVGVzdENhc2UgY2xhc3MKKy8vCitjbGFzcyBJdGVyVGVzdCA6IHB1YmxpYyBDUFBVTklUX05TOjpUZXN0Q2FzZQoreworICBDUFBVTklUX1RFU1RfU1VJVEUoSXRlclRlc3QpOworICBDUFBVTklUX1RFU1QoaXRlcjEpOworICBDUFBVTklUX1RFU1QoaXRlcjMpOworICBDUFBVTklUX1RFU1QoaXRlcjQpOworICBDUFBVTklUX1RFU1QoaXRlcnN3cDApOworICBDUFBVTklUX1RFU1QoaXRlcnN3cDEpOworICBDUFBVTklUX1RFU1QoaXRlcnN3cDIpOworICBDUFBVTklUX1RFU1QoaXRlcnN3cDMpOworICBDUFBVTklUX1RFU1RfU1VJVEVfRU5EKCk7CisKK3Byb3RlY3RlZDoKKyAgdm9pZCBpdGVyMSgpOworICB2b2lkIGl0ZXIzKCk7CisgIHZvaWQgaXRlcjQoKTsKKyAgdm9pZCBpdGVyc3dwMCgpOworICB2b2lkIGl0ZXJzd3AxKCk7CisgIHZvaWQgaXRlcnN3cDIoKTsKKyAgdm9pZCBpdGVyc3dwMygpOworfTsKKworQ1BQVU5JVF9URVNUX1NVSVRFX1JFR0lTVFJBVElPTihJdGVyVGVzdCk7CisKKy8vCisvLyB0ZXN0cyBpbXBsZW1lbnRhdGlvbgorLy8KK3ZvaWQgSXRlclRlc3Q6Oml0ZXIxKCkKK3sKKyAgdmVjdG9yPGNvbnN0IGNoYXIqPiB2OyAvLyBWZWN0b3Igb2YgY2hhcmFjdGVyIHN0cmluZ3MuCisgIHYucHVzaF9iYWNrKCJ6aXBweSIpOyAvLyBGaXJzdCBlbGVtZW50LgorICB2LnB1c2hfYmFjaygibW90b3Jib3kiKTsgLy8gU2Vjb25kIGVsZW1lbnQuCisgIHR5cGVkZWYgdmVjdG9yPGNvbnN0IGNoYXIqPiB2ZWM7CisgIHVuc2lnbmVkIGNvdW50ZXIgPSAwOworICBmb3IgKHZlYzo6aXRlcmF0b3IgaSA9IHYuYmVnaW4oKTsgaSAhPSB2LmVuZCgpOyArK2ksICsrY291bnRlcikgeworICAgIHN3aXRjaCAoY291bnRlcikgeworICAgICAgY2FzZSAwOgorICAgICAgICBDUFBVTklUX0FTU0VSVCghc3RyY21wKCppLCAiemlwcHkiKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxOgorICAgICAgICBDUFBVTklUX0FTU0VSVCghc3RyY21wKCppLCAibW90b3Jib3kiKSk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgQ1BQVU5JVF9GQUlMOworICAgIH0KKyAgfQorfQordm9pZCBJdGVyVGVzdDo6aXRlcjMoKQoreworICB0eXBlZGVmIHZlY3Rvcjxjb25zdCBjaGFyKj4gVmVjOworICBWZWMgdjsgLy8gVmVjdG9yIG9mIGNoYXJhY3RlciBzdHJpbmdzLgorICB2LnB1c2hfYmFjaygiemlwcHkiKTsgLy8gRmlyc3QgZWxlbWVudC4KKyAgdi5wdXNoX2JhY2soIm1vdG9yYm95Iik7IC8vIFNlY29uZCBlbGVtZW50LgorICBWZWM6OnJldmVyc2VfaXRlcmF0b3IgaXQ7CisgIHVuc2lnbmVkIGNvdW50ZXIgPSAwOworICBmb3IgKGl0ID0gdi5yYmVnaW4oKTsgaXQgIT0gdi5yZW5kKCk7ICsraXQsICsrY291bnRlcikgeworICAgIHN3aXRjaCAoY291bnRlcikgeworICAgICAgY2FzZSAxOgorICAgICAgICBDUFBVTklUX0FTU0VSVCghc3RyY21wKCppdCwgInppcHB5IikpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgQ1BQVU5JVF9BU1NFUlQoIXN0cmNtcCgqaXQsICJtb3RvcmJveSIpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBDUFBVTklUX0ZBSUw7CisgICAgfQorICB9Cit9Cit2b2lkIEl0ZXJUZXN0OjppdGVyNCgpCit7CisgIHZlY3RvcjxpbnQ+IHY7IC8vIEVtcHR5IHZlY3RvciBvZiBpbnRlZ2Vycy4KKyAgdi5wdXNoX2JhY2soMSk7CisgIHYucHVzaF9iYWNrKDIpOworICB2LnB1c2hfYmFjaygzKTsKKyAgLy8gUG9zaXRpb24gaW1tZWRpYXRlbHkgYWZ0ZXIgbGFzdCBpdGVtLgorICB2ZWN0b3I8aW50Pjo6aXRlcmF0b3IgaSA9IHYuZW5kKCk7CisgIC8vIE1vdmUgYmFjayBvbmUgYW5kIHRoZW4gYWNjZXNzLgorICBDUFBVTklUX0FTU0VSVCgoKi0taSk9PTMpOworICBpIC09IDI7IC8vIEp1bXAgYmFjayB0d28gaXRlbXMuCisgIENQUFVOSVRfQVNTRVJUKCgqaSk9PTEpOworfQordm9pZCBJdGVyVGVzdDo6aXRlcnN3cDAoKQoreworICBpbnQgbnVtYmVyc1s2XSA9IHsgMCwgMSwgMiwgMywgNCwgNSB9OworCisgIGl0ZXJfc3dhcChudW1iZXJzLCBudW1iZXJzICsgMyk7CisKKyAgQ1BQVU5JVF9BU1NFUlQobnVtYmVyc1swXT09Myk7CisgIENQUFVOSVRfQVNTRVJUKG51bWJlcnNbMV09PTEpOworICBDUFBVTklUX0FTU0VSVChudW1iZXJzWzJdPT0yKTsKKyAgQ1BQVU5JVF9BU1NFUlQobnVtYmVyc1szXT09MCk7CisgIENQUFVOSVRfQVNTRVJUKG51bWJlcnNbNF09PTQpOworICBDUFBVTklUX0FTU0VSVChudW1iZXJzWzVdPT01KTsKKworfQordm9pZCBJdGVyVGVzdDo6aXRlcnN3cDEoKQoreworICB2ZWN0b3I8aW50PiB2MSg2KTsKKyAgX19pb3RhKHYxLmJlZ2luKCksIHYxLmVuZCgpLCAwKTsKKyAgaXRlcl9zd2FwKCB2MS5iZWdpbigpLCB2MS5iZWdpbigpICsgMyApOworCisgIENQUFVOSVRfQVNTRVJUKHYxWzBdPT0zKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbMV09PTEpOworICBDUFBVTklUX0FTU0VSVCh2MVsyXT09Mik7CisgIENQUFVOSVRfQVNTRVJUKHYxWzNdPT0wKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbNF09PTQpOworICBDUFBVTklUX0FTU0VSVCh2MVs1XT09NSk7Cit9Cit2b2lkIEl0ZXJUZXN0OjppdGVyc3dwMigpCit7CisgIHZlY3Rvcjxib29sPiBib29sVmVjdG9yOworCisgIGJvb2xWZWN0b3IucHVzaF9iYWNrKCB0cnVlICk7CisgIGJvb2xWZWN0b3IucHVzaF9iYWNrKCBmYWxzZSApOworCisgIHZlY3Rvcjxib29sPjo6aXRlcmF0b3IgaTEgPSBib29sVmVjdG9yLmJlZ2luKCk7CisgIHZlY3Rvcjxib29sPjo6aXRlcmF0b3IgaTIgPSBib29sVmVjdG9yLmJlZ2luKCk7CisgICsraTI7CisKKyAgYm9vbCB2MCA9ICppMTsKKyAgYm9vbCB2MSA9ICppMjsKKworICBpdGVyX3N3YXAoIGkxLCBpMiApOworCisgIENQUFVOSVRfQVNTRVJUKCggKmkxID09IHYxICYmICppMiA9PSB2MCApKTsKK30KKworCit2b2lkIEl0ZXJUZXN0OjppdGVyc3dwMygpCit7CisgIHZlY3RvcjxpbnQ+IHZ2cmVmKDEwLCAxMCk7CisgIHZlY3RvcjxpbnQ+IGx2cmVmKDEwLCAyMCk7CisKKyAgdmVjdG9yPHZlY3RvcjxpbnQ+ID4gdnZpbnRzKDQsIHZ2cmVmKTsKKyAgbGlzdDx2ZWN0b3I8aW50PiA+IGx2aW50cyg0LCBsdnJlZik7CisKKyAgaXRlcl9zd2FwKHZ2aW50cy5iZWdpbigpLCBsdmludHMuYmVnaW4oKSk7CisgIENQUFVOSVRfQ0hFQ0soIHZ2aW50cy5mcm9udCgpID09IGx2cmVmICk7CisgIENQUFVOSVRfQ0hFQ0soIGx2aW50cy5mcm9udCgpID09IHZ2cmVmICk7CisKKyAgLy9jb25zdCB2ZWN0b3I8dmVjdG9yPGludD4gPiAmY3Z2aW50cyA9IHZ2aW50czsKKyAgLy9pdGVyX3N3YXAoY3Z2aW50cy5iZWdpbigpLCBsdmludHMuYmVnaW4oKSk7CisgIC8vaXRlcl9zd2FwKGx2aW50cy5iZWdpbigpLCBjdnZpbnRzLmJlZ2luKCkpOworCisjaWYgZGVmaW5lZCAoU1RMUE9SVCkgJiYgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikKKyAgaW50ICpwdnZpbnQgPSAmdnZpbnRzLmZyb250KCkuZnJvbnQoKTsKKyAgaW50ICpwbHZpbnQgPSAmbHZpbnRzLmZyb250KCkuZnJvbnQoKTsKKworICBpdGVyX3N3YXAodnZpbnRzLmJlZ2luKCksIGx2aW50cy5iZWdpbigpKTsKKyAgLy9DaGVjayB0aGF0IGVsZW1lbnRzIGhhdmUgYmVlbiBzd2FwZWQ6CisgIENQUFVOSVRfQ0hFQ0soIHB2dmludCA9PSAmbHZpbnRzLmZyb250KCkuZnJvbnQoKSApOworICBDUFBVTklUX0NIRUNLKCBwbHZpbnQgPT0gJnZ2aW50cy5mcm9udCgpLmZyb250KCkgKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L2l0ZXJhdG9yX2hlYWRlcl90ZXN0LmNwcCBiL3Rlc3QvdW5pdC9pdGVyYXRvcl9oZWFkZXJfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I3ZWQyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9pdGVyYXRvcl9oZWFkZXJfdGVzdC5jcHAKQEAgLTAsMCArMSw4IEBACisvKiBUaGlzIHRlc3QgcHVycG9zZSBpcyBzaW1wbHkgdG8gY2hlY2sgU3RhbmRhcmQgaGVhZGVyIGluZGVwZW5kYW5jeSB0aGF0CisgKiBpcyB0byBzYXkgdGhhdCB0aGUgaGVhZGVyIGNhbiBiZSBpbmNsdWRlZCBhbG9uZSB3aXRob3V0IGFueSBwcmV2aW91cworICogaW5jbHVkZS4KKyAqIEFkZGl0aW9ubmFseSwgZm9yIEMgU3RhbmRhcmQgaGVhZGVycyB0aGF0IFNUTHBvcnQgZXhwb3NlLCBpdCBjYW4gYWxzbyBiZQorICogdXNlZCB0byBjaGVjayB0aGF0IGZpbGVzIGluY2x1ZGVkIGJ5IHRob3NlIGhlYWRlcnMgYXJlIGNvbXBhdGlibGUgd2l0aAorICogcHVyZSBDIGNvbXBpbGVycy4KKyAqLworI2luY2x1ZGUgPGl0ZXJhdG9yPgpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L2xlc3NfdGVzdC5jcHAgYi90ZXN0L3VuaXQvbGVzc190ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODdlYWU4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L2xlc3NfdGVzdC5jcHAKQEAgLTAsMCArMSw1MCBAQAorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKworI2luY2x1ZGUgImNwcHVuaXQvY3BwdW5pdF9wcm94eS5oIgorCisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IGRlZmluZWQoX1NUTFBfVVNFX05BTUVTUEFDRVMpCit1c2luZyBuYW1lc3BhY2Ugc3RkOworI2VuZGlmCisKKy8vCisvLyBUZXN0Q2FzZSBjbGFzcworLy8KK2NsYXNzIExlc3NUZXN0IDogcHVibGljIENQUFVOSVRfTlM6OlRlc3RDYXNlCit7CisgIENQUFVOSVRfVEVTVF9TVUlURShMZXNzVGVzdCk7CisgIENQUFVOSVRfVEVTVChsZXNzdCk7CisgIENQUFVOSVRfVEVTVChsZXNzZXF0KTsKKyAgQ1BQVU5JVF9URVNUX1NVSVRFX0VORCgpOworCitwcm90ZWN0ZWQ6CisgIHZvaWQgbGVzc3QoKTsKKyAgdm9pZCBsZXNzZXF0KCk7Cit9OworCitDUFBVTklUX1RFU1RfU1VJVEVfUkVHSVNUUkFUSU9OKExlc3NUZXN0KTsKKworLy8KKy8vIHRlc3RzIGltcGxlbWVudGF0aW9uCisvLwordm9pZCBMZXNzVGVzdDo6bGVzc3QoKQoreworICBpbnQgYXJyYXkgWzRdID0geyAzLCAxLCA0LCAyIH07CisgIHNvcnQoYXJyYXksIGFycmF5ICsgNCwgbGVzczxpbnQ+KCkpOworCisgIENQUFVOSVRfQVNTRVJUKGFycmF5WzBdPT0xKTsKKyAgQ1BQVU5JVF9BU1NFUlQoYXJyYXlbMV09PTIpOworICBDUFBVTklUX0FTU0VSVChhcnJheVsyXT09Myk7CisgIENQUFVOSVRfQVNTRVJUKGFycmF5WzNdPT00KTsKK30KK3ZvaWQgTGVzc1Rlc3Q6Omxlc3NlcXQoKQoreworICBpbnQgYXJyYXkgWzRdID0geyAzLCAxLCA0LCAyIH07CisgIHNvcnQoYXJyYXksIGFycmF5ICsgNCwgbGVzc19lcXVhbDxpbnQ+KCkpOworCisgIENQUFVOSVRfQVNTRVJUKGFycmF5WzBdPT0xKTsKKyAgQ1BQVU5JVF9BU1NFUlQoYXJyYXlbMV09PTIpOworICBDUFBVTklUX0FTU0VSVChhcnJheVsyXT09Myk7CisgIENQUFVOSVRfQVNTRVJUKGFycmF5WzNdPT00KTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9sZXhjbXBfdGVzdC5jcHAgYi90ZXN0L3VuaXQvbGV4Y21wX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MTNmNDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvbGV4Y21wX3Rlc3QuY3BwCkBAIC0wLDAgKzEsNDggQEAKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisKKyNpbmNsdWRlICJjcHB1bml0L2NwcHVuaXRfcHJveHkuaCIKKworI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkKF9TVExQX1VTRV9OQU1FU1BBQ0VTKQordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyNlbmRpZgorCisvLworLy8gVGVzdENhc2UgY2xhc3MKKy8vCitjbGFzcyBMZXhjbXBUZXN0IDogcHVibGljIENQUFVOSVRfTlM6OlRlc3RDYXNlCit7CisgIENQUFVOSVRfVEVTVF9TVUlURShMZXhjbXBUZXN0KTsKKyAgQ1BQVU5JVF9URVNUKGxleGNtcDEpOworICBDUFBVTklUX1RFU1QobGV4Y21wMik7CisgIENQUFVOSVRfVEVTVF9TVUlURV9FTkQoKTsKKworcHJvdGVjdGVkOgorICB2b2lkIGxleGNtcDEoKTsKKyAgdm9pZCBsZXhjbXAyKCk7Cit9OworCitDUFBVTklUX1RFU1RfU1VJVEVfUkVHSVNUUkFUSU9OKExleGNtcFRlc3QpOworCisvLworLy8gdGVzdHMgaW1wbGVtZW50YXRpb24KKy8vCit2b2lkIExleGNtcFRlc3Q6OmxleGNtcDEoKQoreworICBjb25zdCB1bnNpZ25lZCBzaXplID0gNjsKKyAgY2hhciBuMVtzaXplXSA9ICJzaG9lIjsKKyAgY2hhciBuMltzaXplXSA9ICJzaGluZSI7CisKKyAgYm9vbCBiZWZvcmUgPSBsZXhpY29ncmFwaGljYWxfY29tcGFyZShuMSwgbjEgKyBzaXplLCBuMiwgbjIgKyBzaXplKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIWJlZm9yZSk7Cit9Cit2b2lkIExleGNtcFRlc3Q6OmxleGNtcDIoKQoreworICBjb25zdCB1bnNpZ25lZCBzaXplID0gNjsKKyAgY2hhciBuMVtzaXplXSA9ICJzaG9lIjsKKyAgY2hhciBuMltzaXplXSA9ICJzaGluZSI7CisKKyAgYm9vbCBiZWZvcmUgPSBsZXhpY29ncmFwaGljYWxfY29tcGFyZShuMSwgbjEgKyBzaXplLCBuMiwgbjIgKyBzaXplLCBncmVhdGVyPGNoYXI+KCkpOworICBDUFBVTklUX0FTU0VSVChiZWZvcmUpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L2xpbWl0c19oZWFkZXJfdGVzdC5jcHAgYi90ZXN0L3VuaXQvbGltaXRzX2hlYWRlcl90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTU0YTA0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L2xpbWl0c19oZWFkZXJfdGVzdC5jcHAKQEAgLTAsMCArMSw4IEBACisvKiBUaGlzIHRlc3QgcHVycG9zZSBpcyBzaW1wbHkgdG8gY2hlY2sgU3RhbmRhcmQgaGVhZGVyIGluZGVwZW5kYW5jeSB0aGF0CisgKiBpcyB0byBzYXkgdGhhdCB0aGUgaGVhZGVyIGNhbiBiZSBpbmNsdWRlZCBhbG9uZSB3aXRob3V0IGFueSBwcmV2aW91cworICogaW5jbHVkZS4KKyAqIEFkZGl0aW9ubmFseSwgZm9yIEMgU3RhbmRhcmQgaGVhZGVycyB0aGF0IFNUTHBvcnQgZXhwb3NlLCBpdCBjYW4gYWxzbyBiZQorICogdXNlZCB0byBjaGVjayB0aGF0IGZpbGVzIGluY2x1ZGVkIGJ5IHRob3NlIGhlYWRlcnMgYXJlIGNvbXBhdGlibGUgd2l0aAorICogcHVyZSBDIGNvbXBpbGVycy4KKyAqLworI2luY2x1ZGUgPGxpbWl0cz4KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9saW1pdHNfdGVzdC5jcHAgYi90ZXN0L3VuaXQvbGltaXRzX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MTAyZWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvbGltaXRzX3Rlc3QuY3BwCkBAIC0wLDAgKzEsMzE3IEBACisvKiBib29zdCBsaW1pdHNfdGVzdC5jcHAgICB0ZXN0IHlvdXIgPGxpbWl0cz4gZmlsZSBmb3IgaW1wb3J0YW50CisgKgorICogQ29weXJpZ2h0IEplbnMgTWF1cmVyIDIwMDAKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKyAqIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UKKyAqIGFwcGVhcnMgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcworICogcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwKKyAqCisgKiBKZW5zIE1hdXJlciBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMKKyAqIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IKKyAqIGltcGxpZWQgd2FycmFudHkuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW1pdHM+CisvLyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaW5jbHVkZSAiY3BwdW5pdC9jcHB1bml0X3Byb3h5LmgiCisKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZChfU1RMUF9VU0VfTkFNRVNQQUNFUykKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisjZW5kaWYKKworLy8KKy8vIFRlc3RDYXNlIGNsYXNzCisvLworY2xhc3MgTGltaXRUZXN0IDogcHVibGljIENQUFVOSVRfTlM6OlRlc3RDYXNlCit7CisgIENQUFVOSVRfVEVTVF9TVUlURShMaW1pdFRlc3QpOworIyAgaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKQorICAvKiBJZ25vcmUgRlBVIGV4Y2VwdGlvbnMsIHNldCBGUFUgcHJlY2lzaW9uIHRvIDY0IGJpdHMgKi8KKyAgdW5zaWduZWQgaW50IF9mbG9hdF9jb250cm9sX3dvcmQgPSBfY29udHJvbDg3KDAsIDApOworICBfY29udHJvbDg3KFBDXzY0fE1DV19FTXxJQ19BRkZJTkUsIE1DV19QQ3xNQ1dfRU18TUNXX0lDKTsKKyMgIGVuZGlmCisgIENQUFVOSVRfVEVTVCh0ZXN0KTsKKyAgQ1BQVU5JVF9URVNUKHFuYW5fdGVzdCk7CisjICBpZiBkZWZpbmVkIChfX0JPUkxBTkRDX18pCisgIC8qIFJlc2V0IGZsb2F0aW5nIHBvaW50IGNvbnRyb2wgd29yZCAqLworICBfY2xlYXI4NygpOworICBfY29udHJvbDg3KF9mbG9hdF9jb250cm9sX3dvcmQsIE1DV19QQ3xNQ1dfRU18TUNXX0lDKTsKKyMgIGVuZGlmCisgIENQUFVOSVRfVEVTVF9TVUlURV9FTkQoKTsKKworcHJvdGVjdGVkOgorICB2b2lkIHRlc3QoKTsKKyAgdm9pZCBxbmFuX3Rlc3QoKTsKK307CisKK0NQUFVOSVRfVEVTVF9TVUlURV9SRUdJU1RSQVRJT04oTGltaXRUZXN0KTsKKworI2lmIGRlZmluZWQgKFNUTFBPUlQpICYmIGRlZmluZWQgKF9TVExQX1NUQVRJQ19DT05TVF9JTklUX0JVRykKKyMgIGRlZmluZSBDSEVDS19DT05EKFgpIGlmICghKFgpKSAgeyBDUFBVTklUX01FU1NBR0UoI1gpOyByZXR1cm4gZmFsc2U7IH0KKyNlbHNlCisvL1RoaXMgdmVyc2lvbiBmb3JjZSB0byBoYXZlIGV4dGVybmFsIGxpbmthZ2Ugb24gc3RhdGljIGNvbnN0YW50IHdoaWNoIG1pZ2h0CisvL3JldmVhbCB0aGF0IF9TVExQX05PX1NUQVRJQ19DT05TVF9ERUZJTklUSU9OIHNob3VsZCBiZSBjb21tZW50ZWQuCitib29sIGNoZWNrX2NvbmQoY29uc3QgYm9vbCYgY29uZCkgeyByZXR1cm4gY29uZDsgfQorIyAgZGVmaW5lIENIRUNLX0NPTkQoWCkgaWYgKCFjaGVja19jb25kKFgpKSB7IENQUFVOSVRfTUVTU0FHRSgjWCk7IHJldHVybiBmYWxzZTsgfQorI2VuZGlmCisKK2Jvb2wgdmFsaWRfc2lnbl9pbmZvKGJvb2wsIGJvb2wpCit7IHJldHVybiB0cnVlOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+Citib29sIHZhbGlkX3NpZ25faW5mbyhib29sIGxpbWl0X2lzX3NpZ25lZCwgY29uc3QgX1RwICYpIHsKKyAgcmV0dXJuIChsaW1pdF9pc19zaWduZWQgJiYgX1RwKC0xKSA8IDApIHx8CisgICAgICAgICAoIWxpbWl0X2lzX3NpZ25lZCAmJiBfVHAoLTEpID4gMCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+Citib29sIHRlc3RfaW50ZWdyYWxfbGltaXRzX2Jhc2UoY29uc3QgX1RwICYsIGJvb2wgdW5rbm93bl9zaWduID0gdHJ1ZSwgYm9vbCBpc19zaWduZWQgPSB0cnVlKSB7CisgIHR5cGVkZWYgbnVtZXJpY19saW1pdHM8X1RwPiBsaW07CisKKyAgQ0hFQ0tfQ09ORChsaW06OmlzX3NwZWNpYWxpemVkKTsKKyAgQ0hFQ0tfQ09ORChsaW06OmlzX2V4YWN0KTsKKyAgQ0hFQ0tfQ09ORChsaW06OmlzX2ludGVnZXIpOworICBDSEVDS19DT05EKCFsaW06OmlzX2llYzU1OSk7CisgIENIRUNLX0NPTkQobGltOjptaW4oKSA8IGxpbTo6bWF4KCkpOworICBDSEVDS19DT05EKCh1bmtub3duX3NpZ24gJiYgKChsaW06OmlzX3NpZ25lZCAmJiAobGltOjptaW4oKSAhPSAwKSkgfHwgKCFsaW06OmlzX3NpZ25lZCAmJiAobGltOjptaW4oKSA9PSAwKSkpKSB8fAorICAgICAgICAgICAgICghdW5rbm93bl9zaWduICYmICgobGltOjppc19zaWduZWQgJiYgaXNfc2lnbmVkKSB8fCAoIWxpbTo6aXNfc2lnbmVkICYmICFpc19zaWduZWQpKSkpOworCisgIGlmICh1bmtub3duX3NpZ24pIHsKKyAgICBDSEVDS19DT05EKHZhbGlkX3NpZ25faW5mbyhsaW06OmlzX3NpZ25lZCwgX1RwKCkpKTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2Jvb2wgdGVzdF9pbnRlZ3JhbF9saW1pdHMoY29uc3QgX1RwICZ2YWwsIGJvb2wgdW5rbm93bl9zaWduID0gdHJ1ZSwgYm9vbCBpc19zaWduZWQgPSB0cnVlKSB7CisgIGlmICghdGVzdF9pbnRlZ3JhbF9saW1pdHNfYmFzZSh2YWwsIHVua25vd25fc2lnbiwgaXNfc2lnbmVkKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgdHlwZWRlZiBudW1lcmljX2xpbWl0czxfVHA+IGxpbTsKKworICBDSEVDS19DT05EKGxpbTo6aXNfbW9kdWxvKTsKKworICBpZiAobGltOjppc19ib3VuZGVkIHx8CisgICAgICghbGltOjppc19ib3VuZGVkICYmICFsaW06OmlzX3NpZ25lZCkpIHsKKyAgICBfVHAgdG1wID0gbGltOjptaW4oKTsKKyAgICBDSEVDS19DT05EKCAtLXRtcCA+IGxpbTo6bWluKCkgKTsKKyAgfQorCisgIGlmIChsaW06OmlzX2JvdW5kZWQpIHsKKyAgICBfVHAgdG1wID0gbGltOjptYXgoKTsKKyAgICBDSEVDS19DT05EKCArK3RtcCA8IGxpbTo6bWF4KCkgKTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorYm9vbCB0ZXN0X3NpZ25lZF9pbnRlZ3JhbF9saW1pdHMoY29uc3QgX1RwICZfX3ZhbCkgeworICByZXR1cm4gdGVzdF9pbnRlZ3JhbF9saW1pdHMoX192YWwsIGZhbHNlLCB0cnVlKTsKK30KK3RlbXBsYXRlIDxjbGFzcyBfVHA+Citib29sIHRlc3RfdW5zaWduZWRfaW50ZWdyYWxfbGltaXRzKGNvbnN0IF9UcCAmX192YWwpIHsKKyAgcmV0dXJuIHRlc3RfaW50ZWdyYWxfbGltaXRzKF9fdmFsLCBmYWxzZSwgZmFsc2UpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorYm9vbCB0ZXN0X2Zsb2F0X3ZhbHVlcyhfVHAgbGhzLCBfVHAgcmhzKQoreyByZXR1cm4gbGhzID09IHJoczsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorYm9vbCB0ZXN0X2Zsb2F0X2xpbWl0cyhjb25zdCBfVHAgJikgeworICB0eXBlZGVmIG51bWVyaWNfbGltaXRzPF9UcD4gbGltOworICBDSEVDS19DT05EKGxpbTo6aXNfc3BlY2lhbGl6ZWQpOworICBDSEVDS19DT05EKCFsaW06OmlzX21vZHVsbyk7CisgIENIRUNLX0NPTkQoIWxpbTo6aXNfaW50ZWdlcik7CisgIENIRUNLX0NPTkQobGltOjppc19zaWduZWQpOworCisgIENIRUNLX0NPTkQobGltOjptYXgoKSA+IDEwMDApOworICBDSEVDS19DT05EKGxpbTo6bWluKCkgPiAwKTsKKyAgQ0hFQ0tfQ09ORChsaW06Om1pbigpIDwgMC4wMDEpOworICBDSEVDS19DT05EKGxpbTo6ZXBzaWxvbigpID4gMCk7CisKKyAgaWYgKGxpbTo6aXNfaWVjNTU5KSB7CisgICAgQ0hFQ0tfQ09ORChsaW06Omhhc19pbmZpbml0eSk7CisgICAgQ0hFQ0tfQ09ORChsaW06Omhhc19xdWlldF9OYU4pOworICAgIENIRUNLX0NPTkQobGltOjpoYXNfc2lnbmFsaW5nX05hTik7CisgICAgQ0hFQ0tfQ09ORChsaW06Omhhc19kZW5vcm0gPT0gZGVub3JtX3ByZXNlbnQpOworICB9CisKKyAgaWYgKGxpbTo6aGFzX2Rlbm9ybSA9PSBkZW5vcm1fYWJzZW50KSB7CisgICAgQ0hFQ0tfQ09ORChsaW06OmRlbm9ybV9taW4oKSA9PSBsaW06Om1pbigpKTsKKyAgICBfVHAgdG1wID0gbGltOjptaW4oKTsKKyAgICB0bXAgLz0gMjsKKyAgICBpZiAodG1wID4gMCAmJiB0bXAgPCBsaW06Om1pbigpKSB7CisgICAgICAvLyBoYXNfZGVub3JtIGNvdWxkIGJlIGRlbm9ybV9wcmVzZW50CisgICAgICBDUFBVTklUX01FU1NBR0UoIkl0IGxvb2tzIGxpa2UgeW91ciBjb21waWxlci9wbGF0Zm9ybSBzdXBwb3J0cyBkZW5vcm1hbGl6ZWQgZmxvYXRpbmcgcG9pbnQgcmVwcmVzZW50YXRpb24uIik7CisgICAgfQorICB9CisgIGVsc2UgaWYgKGxpbTo6aGFzX2Rlbm9ybSA9PSBkZW5vcm1fcHJlc2VudCkgeworICAgIENIRUNLX0NPTkQobGltOjpkZW5vcm1fbWluKCkgPiAwKTsKKyAgICBDSEVDS19DT05EKGxpbTo6ZGVub3JtX21pbigpIDwgbGltOjptaW4oKSk7CisKKyAgICBfVHAgdG1wID0gbGltOjptaW4oKTsKKyAgICB3aGlsZSAodG1wICE9IDApIHsKKyAgICAgIF9UcCBvbGRfdG1wID0gdG1wOworICAgICAgdG1wIC89IDI7CisgICAgICBDSEVDS19DT05EKHRtcCA8IG9sZF90bXApOworICAgICAgQ0hFQ0tfQ09ORCh0bXAgPj0gbGltOjpkZW5vcm1fbWluKCkgfHwgdG1wID09IChfVHApMCk7CisgICAgICAvL29zdHJpbmdzdHJlYW0gc3RyOworICAgICAgLy9zdHIgPDwgImRlbm9ybV9taW4gPSAiIDw8IGxpbTo6ZGVub3JtX21pbigpIDw8ICIsIHRtcCA9ICIgPDwgdG1wOworICAgICAgLy9DUFBVTklUX01FU1NBR0Uoc3RyLnN0cigpLmNfc3RyKCkpOworICAgIH0KKyAgfQorCisgIGlmIChsaW06Omhhc19pbmZpbml0eSkgeworICAgIGNvbnN0IF9UcCBpbmZpbml0eSA9IGxpbTo6aW5maW5pdHkoKTsKKyAgICAvKiBNYWtlIHN1cmUgdGhvc2UgdmFsdWVzIGFyZSBub3QgMCBvciBzaW1pbGFyIG5vbnNlbnNlLgorICAgICAqIEluZmluaXR5IG11c3QgY29tcGFyZSBhcyBpZiBsYXJnZXIgdGhhbiB0aGUgbWF4aW11bSByZXByZXNlbnRhYmxlIHZhbHVlLiAqLworCisgICAgX1RwIHZhbCA9IGxpbTo6bWF4KCk7CisgICAgdmFsICo9IDI7CisKKyAgICAvKiBXZSB1c2UgdGVzdF9mbG9hdF92YWx1ZXMgYmVjYXVzZSB3aXRob3V0IGl0IHNvbWUgY29tcGlsZXJzIChnY2MpIHBlcmZvcm0gd2VpcmQKKyAgICAgKiBvcHRpbWl6YXRpb24gb24gdGhlIHRlc3QgZ2l2aW5nIHVuZXhwZWN0ZWQgcmVzdWx0LiAqLworICAgIENIRUNLX0NPTkQodGVzdF9mbG9hdF92YWx1ZXModmFsLCBpbmZpbml0eSkpOworCisgICAgLyoKKyAgICBvc3RyaW5nc3RyZWFtIHN0cjsKKyAgICBzdHIgPDwgImxpbTo6bWF4KCkgPSAiIDw8IGxpbTo6bWF4KCkgPDwgIiwgdmFsID0gIiA8PCB2YWwgPDwgIiwgaW5maW5pdHkgPSAiIDw8IGluZmluaXR5OworICAgIENQUFVOSVRfTUVTU0FHRSggc3RyLnN0cigpLmNfc3RyKCkgKTsKKyAgICBzdHIuc3RyKHN0cmluZygpKTsKKyAgICBzdHIgPDwgInNpemVvZihfVHApID0gIiA8PCBzaXplb2YoX1RwKTsKKyAgICBDUFBVTklUX01FU1NBR0UoIHN0ci5zdHIoKS5jX3N0cigpICk7CisgICAgaWYgKHNpemVvZihfVHApID09IDQpIHsKKyAgICAgIHN0ci5zdHIoc3RyaW5nKCkpOworICAgICAgc3RyIDw8ICJ2YWwgaW4gaGV4YTogIiA8PCBzaG93YmFzZSA8PCBoZXggPDwgKigoY29uc3QgdW5zaWduZWQgaW50KikmdmFsKTsKKyAgICAgIHN0ciA8PCAiLCBpbmZpbml0eSBpbiBoZXhhOiAiIDw8IHNob3diYXNlIDw8IGhleCA8PCAqKChjb25zdCB1bnNpZ25lZCBpbnQqKSZpbmZpbml0eSk7CisgICAgfQorI2lmIGRlZmluZWQgKF9TVExQX0xPTkdfTE9ORykKKyAgICBlbHNlIGlmIChzaXplb2YoX1RwKSA9PSBzaXplb2YoX1NUTFBfTE9OR19MT05HKSkgeworICAgICAgc3RyLnN0cihzdHJpbmcoKSk7CisgICAgICBzdHIgPDwgInZhbCBpbiBoZXhhOiAiIDw8IHNob3diYXNlIDw8IGhleCA8PCAqKChjb25zdCB1bnNpZ25lZCBfU1RMUF9MT05HX0xPTkcqKSZ2YWwpOworICAgICAgc3RyIDw8ICIsIGluZmluaXR5IGluIGhleGE6ICIgPDwgc2hvd2Jhc2UgPDwgaGV4IDw8ICooKGNvbnN0IHVuc2lnbmVkIF9TVExQX0xPTkdfTE9ORyopJmluZmluaXR5KTsKKyAgICB9CisjZW5kaWYKKyAgICBlbHNlIHsKKyAgICAgIHN0ci5zdHIoc3RyaW5nKCkpOworICAgICAgc3RyIDw8ICJ2YWw6ICI7CisgICAgICBmb3IgKGludCBpID0gMDsgaSAhPSBzaXplb2YoX1RwKSAvICBzaXplb2YodW5zaWduZWQgc2hvcnQpOyArK2kpIHsKKyAgICAgICAgaWYgKGkgIT0gMCkgc3RyIDw8ICcgJzsKKyAgICAgICAgc3RyIDw8IHNob3diYXNlIDw8IGhleCA8PCBzZXR3KDQpIDw8IHNldGZpbGwoJzAnKSA8PCAqKChjb25zdCB1bnNpZ25lZCBzaG9ydCopJnZhbCArIGkpOworICAgICAgfQorICAgICAgc3RyIDw8ICIsIGluZmluaXR5OiAiOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgIT0gc2l6ZW9mKF9UcCkgLyAgc2l6ZW9mKHVuc2lnbmVkIHNob3J0KTsgKytpKSB7CisgICAgICAgIGlmIChpICE9IDApIHN0ciA8PCAnICc7CisgICAgICAgIHN0ciA8PCBzaG93YmFzZSA8PCBoZXggPDwgc2V0dyg0KSA8PCBzZXRmaWxsKCcwJykgPDwgKigoY29uc3QgdW5zaWduZWQgc2hvcnQqKSZpbmZpbml0eSArIGkpOworICAgICAgfQorICAgIH0KKyAgICBDUFBVTklUX01FU1NBR0UoIHN0ci5zdHIoKS5jX3N0cigpICk7CisgICAgc3RyLnN0cihzdHJpbmcoKSk7CisgICAgc3RyIDw8IGRlYzsKKyAgICBzdHIgPDwgImxpbTo6ZGlnaXRzID0gIiA8PCBsaW06OmRpZ2l0cyA8PCAiLCBsaW06OmRpZ2l0czEwID0gIiA8PCBsaW06OmRpZ2l0czEwIDw8IGVuZGw7CisgICAgc3RyIDw8ICJsaW06Om1pbl9leHBvbmVudCA9ICIgPDwgbGltOjptaW5fZXhwb25lbnQgPDwgIiwgbGltOjptaW5fZXhwb25lbnQxMCA9ICIgPDwgbGltOjptaW5fZXhwb25lbnQxMCA8PCBlbmRsOworICAgIHN0ciA8PCAibGltOjptYXhfZXhwb25lbnQgPSAiIDw8IGxpbTo6bWF4X2V4cG9uZW50IDw8ICIsIGxpbTo6bWF4X2V4cG9uZW50MTAgPSAiIDw8IGxpbTo6bWF4X2V4cG9uZW50MTAgPDwgZW5kbDsKKyAgICBDUFBVTklUX01FU1NBR0UoIHN0ci5zdHIoKS5jX3N0cigpICk7CisgICAgKi8KKworICAgIENIRUNLX0NPTkQoaW5maW5pdHkgPT0gaW5maW5pdHkpOworICAgIENIRUNLX0NPTkQoaW5maW5pdHkgPiBsaW06Om1heCgpKTsKKyAgICBDSEVDS19DT05EKC1pbmZpbml0eSA8IC1saW06Om1heCgpKTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvL2Zsb2F0IGdlbmVyYXRlX25hbihmbG9hdCBmKSB7CisvLyAgcmV0dXJuIDAuMGYgLyBmOworLy99Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorYm9vbCB0ZXN0X3FuYW4oY29uc3QgX1RwICYpIHsKKyAgdHlwZWRlZiBudW1lcmljX2xpbWl0czxfVHA+IGxpbTsKKyAgaWYgKGxpbTo6aGFzX3F1aWV0X05hTikgeworICAgIGNvbnN0IF9UcCBxbmFuID0gbGltOjpxdWlldF9OYU4oKTsKKworICAgIC8vaWYgKHNpemVvZihfVHApID09IDQpIHsKKyAgICAvLyAgb3N0cmluZ3N0cmVhbSBzdHI7CisgICAgLy8gIHN0ciA8PCAicW5hbiAiIDw8IHFuYW4gPDwgIiwgaW4gaGV4YTogIiA8PCBzaG93YmFzZSA8PCBoZXggPDwgKigodW5zaWduZWQgaW50KikmcW5hbik7CisgICAgLy8gIENQUFVOSVRfTUVTU0FHRSggc3RyLnN0cigpLmNfc3RyKCkgKTsKKyAgICAvLyAgc3RyLnN0cigiIik7CisgICAgLy8gIGZsb2F0IHZhbCA9IGdlbmVyYXRlX25hbigwLjBmKTsKKyAgICAvLyAgc3RyIDw8ICJ2YWwgIiA8PCB2YWwgPDwgIiwgaW4gaGV4YTogIiA8PCBzaG93YmFzZSA8PCBoZXggPDwgKigodW5zaWduZWQgaW50KikmdmFsKTsKKyAgICAvLyAgQ1BQVU5JVF9NRVNTQUdFKCBzdHIuc3RyKCkuY19zdHIoKSApOworICAgIC8vICBzdHIuc3RyKCIiKTsKKyAgICAvLyAgdmFsID0gLXFuYW47CisgICAgLy8gIHN0ciA8PCAiLXFuYW4gIiA8PCB2YWwgPDwgIiwgaW4gaGV4YTogIiA8PCBzaG93YmFzZSA8PCBoZXggPDwgKigodW5zaWduZWQgaW50KikmdmFsKTsKKyAgICAvLyAgQ1BQVU5JVF9NRVNTQUdFKCBzdHIuc3RyKCkuY19zdHIoKSApOworICAgIC8vfQorICAgIC8qIE5hTnMgc2hhbGwgYWx3YXlzIGNvbXBhcmUgImZhbHNlIiB3aGVuIGNvbXBhcmVkIGZvciBlcXVhbGl0eQorICAgICogSWYgb25lIG9mIHRoZXNlIGZhaWwsIHlvdXIgY29tcGlsZXIgbWF5IGJlIG9wdGltaXppbmcgaW5jb3JyZWN0bHksCisgICAgKiBvciB0aGUgU1RMcG9ydCBpcyBpbmNvcnJlY3RseSBjb25maWd1cmVkLgorICAgICovCisgICAgQ0hFQ0tfQ09ORCghIChxbmFuID09IDQyKSk7CisgICAgQ0hFQ0tfQ09ORCghIChxbmFuID09IHFuYW4pKTsKKyAgICBDSEVDS19DT05EKHFuYW4gIT0gNDIpOworICAgIENIRUNLX0NPTkQocW5hbiAhPSBxbmFuKTsKKworICAgIC8qIFRoZSBmb2xsb3dpbmcgdGVzdHMgbWF5IGNhdXNlIGFyaXRobWV0aWMgdHJhcHMuCisgICAgKiBDSEVDS19DT05EKCEgKHFuYW4gPCA0MikpOworICAgICogQ0hFQ0tfQ09ORCghIChxbmFuID4gNDIpKTsKKyAgICAqIENIRUNLX0NPTkQoISAocW5hbiA8PSA0MikpOworICAgICogQ0hFQ0tfQ09ORCghIChxbmFuID49IDQyKSk7CisgICAgKi8KKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworCitjbGFzcyBBcmJpdHJhcnlUeXBlCit7fTsKKwordm9pZCBMaW1pdFRlc3Q6OnRlc3QoKSB7CisgIENQUFVOSVRfQ0hFQ0sodGVzdF9pbnRlZ3JhbF9saW1pdHNfYmFzZShib29sKCkpKTsKKyAgQ1BQVU5JVF9DSEVDSyh0ZXN0X2ludGVncmFsX2xpbWl0cyhjaGFyKCkpKTsKKyAgdHlwZWRlZiBzaWduZWQgY2hhciBzaWduZWRfY2hhcjsKKyAgQ1BQVU5JVF9DSEVDSyh0ZXN0X3NpZ25lZF9pbnRlZ3JhbF9saW1pdHMoc2lnbmVkX2NoYXIoKSkpOworICB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdW5zaWduZWRfY2hhcjsKKyAgQ1BQVU5JVF9DSEVDSyh0ZXN0X3Vuc2lnbmVkX2ludGVncmFsX2xpbWl0cyh1bnNpZ25lZF9jaGFyKCkpKTsKKyMgIGlmIGRlZmluZWQgKF9TVExQX0hBU19XQ0hBUl9UKSAmJiAhZGVmaW5lZCAoX1NUTFBfV0NIQVJfVF9JU19VU0hPUlQpCisgIENQUFVOSVRfQ0hFQ0sodGVzdF9pbnRlZ3JhbF9saW1pdHMod2NoYXJfdCgpKSk7CisjICBlbmRpZgorICBDUFBVTklUX0NIRUNLKHRlc3Rfc2lnbmVkX2ludGVncmFsX2xpbWl0cyhzaG9ydCgpKSk7CisgIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgdW5zaWduZWRfc2hvcnQ7CisgIENQUFVOSVRfQ0hFQ0sodGVzdF91bnNpZ25lZF9pbnRlZ3JhbF9saW1pdHModW5zaWduZWRfc2hvcnQoKSkpOworICBDUFBVTklUX0NIRUNLKHRlc3Rfc2lnbmVkX2ludGVncmFsX2xpbWl0cyhpbnQoKSkpOworICB0eXBlZGVmIHVuc2lnbmVkIGludCB1bnNpZ25lZF9pbnQ7CisgIENQUFVOSVRfQ0hFQ0sodGVzdF91bnNpZ25lZF9pbnRlZ3JhbF9saW1pdHModW5zaWduZWRfaW50KCkpKTsKKyAgQ1BQVU5JVF9DSEVDSyh0ZXN0X3NpZ25lZF9pbnRlZ3JhbF9saW1pdHMobG9uZygpKSk7CisgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyB1bnNpZ25lZF9sb25nOworICBDUFBVTklUX0NIRUNLKHRlc3RfdW5zaWduZWRfaW50ZWdyYWxfbGltaXRzKHVuc2lnbmVkX2xvbmcoKSkpOworIyAgaWYgZGVmaW5lZCAoX1NUTFBfTE9OR19MT05HKQorICB0eXBlZGVmIF9TVExQX0xPTkdfTE9ORyBsb25nX2xvbmc7CisgIENQUFVOSVRfQ0hFQ0sodGVzdF9zaWduZWRfaW50ZWdyYWxfbGltaXRzKGxvbmdfbG9uZygpKSk7CisgIHR5cGVkZWYgdW5zaWduZWQgX1NUTFBfTE9OR19MT05HIHVuc2lnbmVkX2xvbmdfbG9uZzsKKyAgQ1BQVU5JVF9DSEVDSyh0ZXN0X3Vuc2lnbmVkX2ludGVncmFsX2xpbWl0cyh1bnNpZ25lZF9sb25nX2xvbmcoKSkpOworI2VuZGlmCisKKyAgQ1BQVU5JVF9DSEVDSyh0ZXN0X2Zsb2F0X2xpbWl0cyhmbG9hdCgpKSk7CisgIENQUFVOSVRfQ0hFQ0sodGVzdF9mbG9hdF9saW1pdHMoZG91YmxlKCkpKTsKKyMgIGlmICFkZWZpbmVkICggX1NUTFBfTk9fTE9OR19ET1VCTEUgKQorICB0eXBlZGVmIGxvbmcgZG91YmxlIGxvbmdfZG91YmxlOworICBDUFBVTklUX0NIRUNLKHRlc3RfZmxvYXRfbGltaXRzKGxvbmdfZG91YmxlKCkpKTsKKyMgIGVuZGlmCisKKyAgQ1BQVU5JVF9BU1NFUlQoICFudW1lcmljX2xpbWl0czxBcmJpdHJhcnlUeXBlPjo6aXNfc3BlY2lhbGl6ZWQgKTsKK30KKwordm9pZCBMaW1pdFRlc3Q6OnFuYW5fdGVzdCgpIHsKKyAgQ1BQVU5JVF9DSEVDSyh0ZXN0X3FuYW4oZmxvYXQoKSkpOworICBDUFBVTklUX0NIRUNLKHRlc3RfcW5hbihkb3VibGUoKSkpOworIyAgaWYgIWRlZmluZWQgKCBfU1RMUF9OT19MT05HX0RPVUJMRSApCisgIHR5cGVkZWYgbG9uZyBkb3VibGUgbG9uZ19kb3VibGU7CisgIENQUFVOSVRfQ0hFQ0sodGVzdF9xbmFuKGxvbmdfZG91YmxlKCkpKTsKKyMgIGVuZGlmCit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvbGlzdF9oZWFkZXJfdGVzdC5jcHAgYi90ZXN0L3VuaXQvbGlzdF9oZWFkZXJfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZjYjZjNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9saXN0X2hlYWRlcl90ZXN0LmNwcApAQCAtMCwwICsxLDggQEAKKy8qIFRoaXMgdGVzdCBwdXJwb3NlIGlzIHNpbXBseSB0byBjaGVjayBTdGFuZGFyZCBoZWFkZXIgaW5kZXBlbmRhbmN5IHRoYXQKKyAqIGlzIHRvIHNheSB0aGF0IHRoZSBoZWFkZXIgY2FuIGJlIGluY2x1ZGVkIGFsb25lIHdpdGhvdXQgYW55IHByZXZpb3VzCisgKiBpbmNsdWRlLgorICogQWRkaXRpb25uYWx5LCBmb3IgQyBTdGFuZGFyZCBoZWFkZXJzIHRoYXQgU1RMcG9ydCBleHBvc2UsIGl0IGNhbiBhbHNvIGJlCisgKiB1c2VkIHRvIGNoZWNrIHRoYXQgZmlsZXMgaW5jbHVkZWQgYnkgdGhvc2UgaGVhZGVycyBhcmUgY29tcGF0aWJsZSB3aXRoCisgKiBwdXJlIEMgY29tcGlsZXJzLgorICovCisjaW5jbHVkZSA8bGlzdD4KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9saXN0X3Rlc3QuY3BwIGIvdGVzdC91bml0L2xpc3RfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM0NWQ0MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9saXN0X3Rlc3QuY3BwCkBAIC0wLDAgKzEsNDY4IEBACisvL0hhcyB0byBiZSBmaXJzdCBmb3IgU3RhY2tBbGxvY2F0b3Igc3dhcCBvdmVybG9hZCB0byBiZSB0YWtlbgorLy9pbnRvIGFjY291bnQgKGF0IGxlYXN0IHVzaW5nIEdDQyA0LjAuMSkKKyNpbmNsdWRlICJzdGFja19hbGxvY2F0b3IuaCIKKworI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisKKyNpbmNsdWRlICJjcHB1bml0L2NwcHVuaXRfcHJveHkuaCIKKworI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkKF9TVExQX1VTRV9OQU1FU1BBQ0VTKQordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyNlbmRpZgorCisvLworLy8gVGVzdENhc2UgY2xhc3MKKy8vCitjbGFzcyBMaXN0VGVzdCA6IHB1YmxpYyBDUFBVTklUX05TOjpUZXN0Q2FzZQoreworICBDUFBVTklUX1RFU1RfU1VJVEUoTGlzdFRlc3QpOworICBDUFBVTklUX1RFU1QobGlzdDEpOworICBDUFBVTklUX1RFU1QobGlzdDIpOworICBDUFBVTklUX1RFU1QobGlzdDMpOworICBDUFBVTklUX1RFU1QobGlzdDQpOworICBDUFBVTklUX1RFU1QoZXJhc2UpOworICBDUFBVTklUX1RFU1QocmVzaXplKTsKKyAgQ1BQVU5JVF9URVNUKHB1c2hfYmFjayk7CisgIENQUFVOSVRfVEVTVChwdXNoX2Zyb250KTsKKyAgQ1BQVU5JVF9URVNUKGFsbG9jYXRvcl93aXRoX3N0YXRlKTsKKyAgQ1BQVU5JVF9URVNUKHN3YXApOworICBDUFBVTklUX1RFU1QoYWRsKTsKKyAgLy9DUFBVTklUX1RFU1QoY29uc3RfbGlzdCk7CisgIENQUFVOSVRfVEVTVF9TVUlURV9FTkQoKTsKKworcHJvdGVjdGVkOgorICB2b2lkIGxpc3QxKCk7CisgIHZvaWQgbGlzdDIoKTsKKyAgdm9pZCBsaXN0MygpOworICB2b2lkIGxpc3Q0KCk7CisgIHZvaWQgZXJhc2UoKTsKKyAgdm9pZCByZXNpemUoKTsKKyAgdm9pZCBwdXNoX2JhY2soKTsKKyAgdm9pZCBwdXNoX2Zyb250KCk7CisgIHZvaWQgYWxsb2NhdG9yX3dpdGhfc3RhdGUoKTsKKyAgdm9pZCBzd2FwKCk7CisgIHZvaWQgYWRsKCk7CisgIC8vdm9pZCBjb25zdF9saXN0KCk7Cit9OworCitDUFBVTklUX1RFU1RfU1VJVEVfUkVHSVNUUkFUSU9OKExpc3RUZXN0KTsKKworLy8KKy8vIHRlc3RzIGltcGxlbWVudGF0aW9uCisvLwordm9pZCBMaXN0VGVzdDo6bGlzdDEoKQoreworICBpbnQgYXJyYXkxIFtdID0geyA5LCAxNiwgMzYgfTsKKyAgaW50IGFycmF5MiBbXSA9IHsgMSwgNCB9OworCisgIGxpc3Q8aW50PiBsMShhcnJheTEsIGFycmF5MSArIDMpOworICBsaXN0PGludD4gbDIoYXJyYXkyLCBhcnJheTIgKyAyKTsKKyAgbGlzdDxpbnQ+OjppdGVyYXRvciBpMSA9IGwxLmJlZ2luKCk7CisgIGxpc3Q8aW50Pjo6aXRlcmF0b3IgaTIgPSBsMi5iZWdpbigpOworICBsaXN0PGludD46OmNvbnN0X2l0ZXJhdG9yIGNpKGkxKTsKKyAgbGlzdDxpbnQ+Ojpjb25zdF9pdGVyYXRvciBjaTEoY2kpOworICBsMS5zcGxpY2UoaTEsIGwyKTsKKyAgaTEgPSBsMS5iZWdpbigpOworICBDUFBVTklUX0FTU0VSVCggKmkxKysgPT0gMSApOworICBDUFBVTklUX0FTU0VSVCggKmkxKysgPT0gNCApOworICBDUFBVTklUX0FTU0VSVCggKmkxKysgPT0gOSApOworICBDUFBVTklUX0FTU0VSVCggKmkxKysgPT0gMTYgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoICppMSsrID09IDM2ICk7CisKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiBcCisgICAoIWRlZmluZWQgKF9TVExQX0RFQlVHKSB8fCAoX1NUTFBfREVCVUdfTEVWRUwgIT0gX1NUTFBfU1RBTkRBUkRfREJHX0xFVkVMKSkKKyAgQ1BQVU5JVF9BU1NFUlQoIGkyID09IGwxLmJlZ2luKCkgKTsKKyNlbmRpZgorCisgIC8vRGVmYXVsdCBjb25zdHJ1Y3QgY2hlY2sgKF9TVExQX0RFRl9DT05TVF9QTENUX05FV19CVUcpCisgIGxpc3Q8aW50PiBsKDIpOworICBpMSA9IGwuYmVnaW4oKTsKKyAgQ1BQVU5JVF9BU1NFUlQoICooaTErKykgPT0gMCApOworICBDUFBVTklUX0FTU0VSVCggKmkxID09IDAgKTsKKyNpZiAwCisgIC8vQSBzbWFsbCBjb21waWxhdGlvbiB0aW1lIGNoZWNrIHRvIGJlIGFjdGl2YXRlZCBmcm9tIHRpbWUgdG8gdGltZSwKKyAgLy9jb21waWxhdGlvbiBzaG91bGQgZmFpbC4KKyAgeworICAgIGxpc3Q8Y2hhcj46Oml0ZXJhdG9yIGxfY2hhcl9pdGU7CisgICAgbGlzdDxpbnQ+OjppdGVyYXRvciBsX2ludF9pdGU7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGxfY2hhcl9pdGUgIT0gbF9pbnRfaXRlICk7CisgIH0KKyNlbmRpZgorfQorCit2b2lkIExpc3RUZXN0OjpsaXN0MigpCit7CisgIGludCBhcnJheTEgW10gPSB7IDEsIDE2IH07CisgIGludCBhcnJheTIgW10gPSB7IDQsIDkgfTsKKworICBsaXN0PGludD4gbDEoYXJyYXkxLCBhcnJheTEgKyAyKTsKKyAgbGlzdDxpbnQ+IGwyKGFycmF5MiwgYXJyYXkyICsgMik7CisgIGxpc3Q8aW50Pjo6aXRlcmF0b3IgaSA9IGwxLmJlZ2luKCk7CisgIGkrKzsKKyAgbDEuc3BsaWNlKGksIGwyLCBsMi5iZWdpbigpLCBsMi5lbmQoKSk7CisgIGkgPSBsMS5iZWdpbigpOworICBDUFBVTklUX0FTU0VSVCgqaSsrPT0xKTsKKyAgQ1BQVU5JVF9BU1NFUlQoKmkrKz09NCk7CisgIENQUFVOSVRfQVNTRVJUKCppKys9PTkpOworICBDUFBVTklUX0FTU0VSVCgqaSsrPT0xNik7Cit9CisKK3ZvaWQgTGlzdFRlc3Q6Omxpc3QzKCkKK3sKKyAgY2hhciBhcnJheSBbXSA9IHsgJ3gnLCAnbCcsICd4JywgJ3QnLCAncycsICdzJyB9OworCisgIGxpc3Q8Y2hhcj4gc3RyKGFycmF5LCBhcnJheSArIDYpOworICBsaXN0PGNoYXI+OjppdGVyYXRvciBpOworCisgIHN0ci5yZXZlcnNlKCk7CisgIGkgPSBzdHIuYmVnaW4oKTsKKyAgQ1BQVU5JVF9BU1NFUlQoKmkrKz09J3MnKTsKKyAgQ1BQVU5JVF9BU1NFUlQoKmkrKz09J3MnKTsKKyAgQ1BQVU5JVF9BU1NFUlQoKmkrKz09J3QnKTsKKyAgQ1BQVU5JVF9BU1NFUlQoKmkrKz09J3gnKTsKKyAgQ1BQVU5JVF9BU1NFUlQoKmkrKz09J2wnKTsKKyAgQ1BQVU5JVF9BU1NFUlQoKmkrKz09J3gnKTsKKworICBzdHIucmVtb3ZlKCd4Jyk7CisgIGkgPSBzdHIuYmVnaW4oKTsKKyAgQ1BQVU5JVF9BU1NFUlQoKmkrKz09J3MnKTsKKyAgQ1BQVU5JVF9BU1NFUlQoKmkrKz09J3MnKTsKKyAgQ1BQVU5JVF9BU1NFUlQoKmkrKz09J3QnKTsKKyAgQ1BQVU5JVF9BU1NFUlQoKmkrKz09J2wnKTsKKworICBzdHIudW5pcXVlKCk7CisgIGkgPSBzdHIuYmVnaW4oKTsKKyAgQ1BQVU5JVF9BU1NFUlQoKmkrKz09J3MnKTsKKyAgQ1BQVU5JVF9BU1NFUlQoKmkrKz09J3QnKTsKKyAgQ1BQVU5JVF9BU1NFUlQoKmkrKz09J2wnKTsKKworICBzdHIuc29ydCgpOworICBpID0gc3RyLmJlZ2luKCk7CisgIENQUFVOSVRfQVNTRVJUKCppKys9PSdsJyk7CisgIENQUFVOSVRfQVNTRVJUKCppKys9PSdzJyk7CisgIENQUFVOSVRfQVNTRVJUKCppKys9PSd0Jyk7Cit9CisKK3ZvaWQgTGlzdFRlc3Q6Omxpc3Q0KCkKK3sKKyAgaW50IGFycmF5MSBbXSA9IHsgMSwgMywgNiwgNyB9OworICBpbnQgYXJyYXkyIFtdID0geyAyLCA0IH07CisKKyAgbGlzdDxpbnQ+IGwxKGFycmF5MSwgYXJyYXkxICsgNCk7CisgIGxpc3Q8aW50PiBsMihhcnJheTIsIGFycmF5MiArIDIpOworICBsMS5tZXJnZShsMik7CisgIGxpc3Q8aW50Pjo6aXRlcmF0b3IgaSA9IGwxLmJlZ2luKCk7CisgIENQUFVOSVRfQVNTRVJUKCppKys9PTEpOworICBDUFBVTklUX0FTU0VSVCgqaSsrPT0yKTsKKyAgQ1BQVU5JVF9BU1NFUlQoKmkrKz09Myk7CisgIENQUFVOSVRfQVNTRVJUKCppKys9PTQpOworICBDUFBVTklUX0FTU0VSVCgqaSsrPT02KTsKKyAgQ1BQVU5JVF9BU1NFUlQoKmkrKz09Nyk7CisKKyAgLy9XZSB1c2UgZGlzdGFuY2UgdG8gYXZvaWQgYSBzaW1wbGUgY2FsbCB0byBhbiBpbnRlcm5hbCBjb3VudGVyCisgIENQUFVOSVRfQVNTRVJUKGRpc3RhbmNlKGwxLmJlZ2luKCksIGwxLmVuZCgpKSA9PSA2KTsKKyAgQ1BQVU5JVF9BU1NFUlQoZGlzdGFuY2UobDIuYmVnaW4oKSwgbDIuZW5kKCkpID09IDApOworCisgIGwxLnN3YXAobDIpOworCisgIENQUFVOSVRfQVNTRVJUKGRpc3RhbmNlKGwxLmJlZ2luKCksIGwxLmVuZCgpKSA9PSAwKTsKKyAgQ1BQVU5JVF9BU1NFUlQoZGlzdGFuY2UobDIuYmVnaW4oKSwgbDIuZW5kKCkpID09IDYpOworfQorCit2b2lkIExpc3RUZXN0OjplcmFzZSgpCit7CisgIGxpc3Q8aW50PiBsOworICBsLnB1c2hfYmFjayggMSApOworICBsLmVyYXNlKGwuYmVnaW4oKSk7CisgIENQUFVOSVRfQVNTRVJUKCBsLmVtcHR5KCkgKTsKKworICBpbnQgYXJyYXlbXSA9IHsgMCwgMSwgMiwgMyB9OworICBsLmFzc2lnbihhcnJheSwgYXJyYXkgKyA0KTsKKyAgbGlzdDxpbnQ+OjppdGVyYXRvciBsaXQ7CisgIGxpdCA9IGwuZXJhc2UobC5iZWdpbigpKTsKKyAgQ1BQVU5JVF9BU1NFUlQoICpsaXQgPT0gMSApOworCisgIGxpdCA9IGwuZXJhc2UobC5iZWdpbigpLCAtLWwuZW5kKCkpOworICBDUFBVTklUX0FTU0VSVCggKmxpdCA9PSAzICk7CisKKyAgbC5jbGVhcigpOworICBDUFBVTklUX0FTU0VSVCggbC5lbXB0eSgpICk7Cit9CisKKwordm9pZCBMaXN0VGVzdDo6cmVzaXplKCkKK3sKKyAgeworICAgIGxpc3Q8aW50PiBsOworICAgIGwucmVzaXplKDUsIDEpOworCisgICAgc2l6ZV90IGk7CisgICAgbGlzdDxpbnQ+OjppdGVyYXRvciBsaXQobC5iZWdpbigpKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNTsgKytpKSB7CisgICAgICBDUFBVTklUX0FTU0VSVCggbGl0ICE9IGwuZW5kKCkgKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCAqKGxpdCsrKSA9PSAxICk7CisgICAgfQorICAgIENQUFVOSVRfQVNTRVJUKCBsaXQgPT0gbC5lbmQoKSApOworCisgICAgbC5yZXNpemUoMyk7CisgICAgbGl0ID0gbC5iZWdpbigpOworICAgIGZvciAoaSA9IDA7IGkgPCAzOyArK2kpIHsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBsaXQgIT0gbC5lbmQoKSApOworICAgICAgQ1BQVU5JVF9BU1NFUlQoICoobGl0KyspID09IDEgKTsKKyAgICB9CisgICAgQ1BQVU5JVF9BU1NFUlQoIGxpdCA9PSBsLmVuZCgpICk7CisgIH0KKworICB7CisgICAgbGlzdDxpbnQ+IGw7CisgICAgbC5yZXNpemUoNSk7CisKKyAgICBzaXplX3QgaTsKKyAgICBsaXN0PGludD46Oml0ZXJhdG9yIGxpdChsLmJlZ2luKCkpOworICAgIGZvciAoaSA9IDA7IGkgPCA1OyArK2kpIHsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBsaXQgIT0gbC5lbmQoKSApOworICAgICAgQ1BQVU5JVF9BU1NFUlQoICoobGl0KyspID09IDAgKTsKKyAgICB9CisgICAgQ1BQVU5JVF9BU1NFUlQoIGxpdCA9PSBsLmVuZCgpICk7CisgIH0KK30KKwordm9pZCBMaXN0VGVzdDo6cHVzaF9iYWNrKCkKK3sKKyAgbGlzdDxpbnQ+IGw7CisgIGwucHVzaF9iYWNrKCAxICk7CisgIGwucHVzaF9iYWNrKCAyICk7CisgIGwucHVzaF9iYWNrKCAzICk7CisKKyAgbGlzdDxpbnQ+OjpyZXZlcnNlX2l0ZXJhdG9yIHIgPSBsLnJiZWdpbigpOworCisgIENQUFVOSVRfQVNTRVJUKCAqciA9PSAzICk7CisgIGwucHVzaF9iYWNrKCA0ICk7CisgIC8qCisgICAqIEZvbGxvd2luZyBsaW5lcyBhcmUgY29tbWVudGVkLCBiZWNhdXNlIG9uZXMgc2hvdyBzdGFuZGFyZCBjb250cmFkaWN0aW9uCisgICAqICgyNC40LjEgYW5kIDIzLjIuMi4zKTsgYnV0IHByZXNlbnQgYmVoYXZpb3VyIGlzIHZhbGlkLCAyNC40LjEsIHBhcmFncmFwaHMgMSBhbmQgMiwKKyAgICogMjQuNC4xLjMuMyBhbmQgMjMuMSBwYXJhZ3JhcGggOSAoVGFibGUgNjYpLiBUaGUgMjQuNC4xIGlzIG1vcmUgY29tbW9uIHJ1bGUsCisgICAqIHNvIGl0IGhhcyBwcmVmZXJlbmNlIHVuZGVyIDIzLjIuMi4zLCBieSBteSBvcGluaW9uLgorICAgKgorICAgKiAgICAgIC0gcHRyCisgICAqLworICAvLyBDUFBVTklUX0FTU0VSVCggKnIgPT0gMyApOworICAvLyArK3I7CisgIC8vIENQUFVOSVRfQVNTRVJUKCAqciA9PSAyICk7Cit9CisKK3ZvaWQgTGlzdFRlc3Q6OnB1c2hfZnJvbnQoKQoreworICBsaXN0PGludD4gbDsKKyAgbC5wdXNoX2JhY2soIDEgKTsKKyAgbC5wdXNoX2JhY2soIDIgKTsKKyAgbC5wdXNoX2JhY2soIDMgKTsKKworICBsaXN0PGludD46Oml0ZXJhdG9yIGkgPSBsLmJlZ2luKCk7CisKKyAgQ1BQVU5JVF9BU1NFUlQoICppID09IDEgKTsKKyAgbC5wdXNoX2Zyb250KCAwICk7CisgIENQUFVOSVRfQVNTRVJUKCAqaSA9PSAxICk7CisgICsraTsKKyAgQ1BQVU5JVF9BU1NFUlQoICppID09IDIgKTsKK30KKwordm9pZCBMaXN0VGVzdDo6YWxsb2NhdG9yX3dpdGhfc3RhdGUoKQoreworICBjaGFyIGJ1ZjFbMTAyNF07CisgIFN0YWNrQWxsb2NhdG9yPGludD4gc3RhY2sxKGJ1ZjEsIGJ1ZjEgKyBzaXplb2YoYnVmMSkpOworCisgIGNoYXIgYnVmMlsxMDI0XTsKKyAgU3RhY2tBbGxvY2F0b3I8aW50PiBzdGFjazIoYnVmMiwgYnVmMiArIHNpemVvZihidWYyKSk7CisKKyAgdHlwZWRlZiBsaXN0PGludCwgU3RhY2tBbGxvY2F0b3I8aW50PiA+IExpc3RJbnQ7CisgIHsKKyAgICAvL1N3YXAgd2l0aCBib3RoIGxpc3Qgbm9uIGVtcHR5CisgICAgTGlzdEludCBsaW50MSgxMCwgMCwgc3RhY2sxKTsKKyAgICBMaXN0SW50IGxpbnQxQ3B5KGxpbnQxKTsKKworICAgIExpc3RJbnQgbGludDIoMTAsIDEsIHN0YWNrMik7CisgICAgTGlzdEludCBsaW50MkNweShsaW50Mik7CisKKyAgICBsaW50MS5zd2FwKGxpbnQyKTsKKworICAgIENQUFVOSVRfQVNTRVJUKCBsaW50MS5nZXRfYWxsb2NhdG9yKCkuc3dhcGVkKCkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggbGludDIuZ2V0X2FsbG9jYXRvcigpLnN3YXBlZCgpICk7CisKKyAgICBDUFBVTklUX0FTU0VSVCggbGludDEgPT0gbGludDJDcHkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggbGludDIgPT0gbGludDFDcHkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggbGludDEuZ2V0X2FsbG9jYXRvcigpID09IHN0YWNrMiApOworICAgIENQUFVOSVRfQVNTRVJUKCBsaW50Mi5nZXRfYWxsb2NhdG9yKCkgPT0gc3RhY2sxICk7CisgIH0KKyAgQ1BQVU5JVF9DSEVDSyggc3RhY2sxLm9rKCkgKTsKKyAgQ1BQVU5JVF9DSEVDSyggc3RhY2syLm9rKCkgKTsKKyAgc3RhY2sxLnJlc2V0KCk7IHN0YWNrMi5yZXNldCgpOworCisgIHsKKyAgICAvL1N3YXAgd2l0aCBlbXB0eSBjYWxsZSBsaXN0CisgICAgTGlzdEludCBsaW50MSgxMCwgMCwgc3RhY2sxKTsKKyAgICBMaXN0SW50IGxpbnQxQ3B5KGxpbnQxKTsKKworICAgIExpc3RJbnQgbGludDIoc3RhY2syKTsKKyAgICBMaXN0SW50IGxpbnQyQ3B5KGxpbnQyKTsKKworICAgIGxpbnQxLnN3YXAobGludDIpOworCisgICAgQ1BQVU5JVF9BU1NFUlQoIGxpbnQxLmdldF9hbGxvY2F0b3IoKS5zd2FwZWQoKSApOworICAgIENQUFVOSVRfQVNTRVJUKCBsaW50Mi5nZXRfYWxsb2NhdG9yKCkuc3dhcGVkKCkgKTsKKworICAgIENQUFVOSVRfQVNTRVJUKCBsaW50MSA9PSBsaW50MkNweSApOworICAgIENQUFVOSVRfQVNTRVJUKCBsaW50MiA9PSBsaW50MUNweSApOworICAgIENQUFVOSVRfQVNTRVJUKCBsaW50MS5nZXRfYWxsb2NhdG9yKCkgPT0gc3RhY2syICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGxpbnQyLmdldF9hbGxvY2F0b3IoKSA9PSBzdGFjazEgKTsKKyAgfQorICBDUFBVTklUX0NIRUNLKCBzdGFjazEub2soKSApOworICBDUFBVTklUX0NIRUNLKCBzdGFjazIub2soKSApOworICBzdGFjazEucmVzZXQoKTsgc3RhY2syLnJlc2V0KCk7CisKKyAgeworICAgIC8vU3dhcCB3aXRoIGVtcHR5IGNhbGxlciBsaXN0CisgICAgTGlzdEludCBsaW50MShzdGFjazEpOworICAgIExpc3RJbnQgbGludDFDcHkobGludDEpOworCisgICAgTGlzdEludCBsaW50MigxMCwgMCwgc3RhY2syKTsKKyAgICBMaXN0SW50IGxpbnQyQ3B5KGxpbnQyKTsKKworICAgIGxpbnQxLnN3YXAobGludDIpOworCisgICAgQ1BQVU5JVF9BU1NFUlQoIGxpbnQxLmdldF9hbGxvY2F0b3IoKS5zd2FwZWQoKSApOworICAgIENQUFVOSVRfQVNTRVJUKCBsaW50Mi5nZXRfYWxsb2NhdG9yKCkuc3dhcGVkKCkgKTsKKworICAgIENQUFVOSVRfQVNTRVJUKCBsaW50MSA9PSBsaW50MkNweSApOworICAgIENQUFVOSVRfQVNTRVJUKCBsaW50MiA9PSBsaW50MUNweSApOworICAgIENQUFVOSVRfQVNTRVJUKCBsaW50MS5nZXRfYWxsb2NhdG9yKCkgPT0gc3RhY2syICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGxpbnQyLmdldF9hbGxvY2F0b3IoKSA9PSBzdGFjazEgKTsKKyAgfQorICBDUFBVTklUX0NIRUNLKCBzdGFjazEub2soKSApOworICBDUFBVTklUX0NIRUNLKCBzdGFjazIub2soKSApOworICBzdGFjazEucmVzZXQoKTsgc3RhY2syLnJlc2V0KCk7CisKKyAgeworICAgIExpc3RJbnQgbGludDEoMTAsIDAsIHN0YWNrMSk7CisgICAgTGlzdEludCBsaW50MigxMCwgMSwgc3RhY2syKTsKKworICAgIGxpbnQxLnNwbGljZShsaW50MS5iZWdpbigpLCBsaW50Mik7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGxpbnQxLnNpemUoKSA9PSAyMCApOworICAgIENQUFVOSVRfQVNTRVJUKCBsaW50Mi5lbXB0eSgpICk7CisgIH0KKyAgQ1BQVU5JVF9DSEVDSyggc3RhY2sxLm9rKCkgKTsKKyAgQ1BQVU5JVF9DSEVDSyggc3RhY2syLm9rKCkgKTsKKyAgc3RhY2sxLnJlc2V0KCk7IHN0YWNrMi5yZXNldCgpOworCisgIHsKKyAgICBMaXN0SW50IGxpbnQxKDEwLCAwLCBzdGFjazEpOworICAgIExpc3RJbnQgbGludDIoMTAsIDEsIHN0YWNrMik7CisKKyAgICBsaW50MS5zcGxpY2UobGludDEuYmVnaW4oKSwgbGludDIsIGxpbnQyLmJlZ2luKCkpOworICAgIENQUFVOSVRfQVNTRVJUKCBsaW50MS5zaXplKCkgPT0gMTEgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggbGludDIuc2l6ZSgpID09IDkgKTsKKyAgfQorICBDUFBVTklUX0NIRUNLKCBzdGFjazEub2soKSApOworICBDUFBVTklUX0NIRUNLKCBzdGFjazIub2soKSApOworICBzdGFjazEucmVzZXQoKTsgc3RhY2syLnJlc2V0KCk7CisKKyAgeworICAgIExpc3RJbnQgbGludDEoMTAsIDAsIHN0YWNrMSk7CisgICAgTGlzdEludCBsaW50MigxMCwgMSwgc3RhY2syKTsKKworICAgIExpc3RJbnQ6Oml0ZXJhdG9yIGxpdChsaW50Mi5iZWdpbigpKTsKKyAgICBhZHZhbmNlKGxpdCwgNSk7CisgICAgbGludDEuc3BsaWNlKGxpbnQxLmJlZ2luKCksIGxpbnQyLCBsaW50Mi5iZWdpbigpLCBsaXQpOworICAgIENQUFVOSVRfQVNTRVJUKCBsaW50MS5zaXplKCkgPT0gMTUgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggbGludDIuc2l6ZSgpID09IDUgKTsKKyAgfQorICBDUFBVTklUX0NIRUNLKCBzdGFjazEub2soKSApOworICBDUFBVTklUX0NIRUNLKCBzdGFjazIub2soKSApOworICBzdGFjazEucmVzZXQoKTsgc3RhY2syLnJlc2V0KCk7CisKKyAgeworICAgIExpc3RJbnQgbGludDEoMTAsIDAsIHN0YWNrMSk7CisgICAgTGlzdEludCBsaW50MigxMCwgMSwgc3RhY2syKTsKKworICAgIExpc3RJbnQgbGludHJlZihzdGFjazIpOworICAgIGxpbnRyZWYuaW5zZXJ0KGxpbnRyZWYuYmVnaW4oKSwgMTAsIDEpOworICAgIGxpbnRyZWYuaW5zZXJ0KGxpbnRyZWYuYmVnaW4oKSwgMTAsIDApOworCisgICAgbGludDEubWVyZ2UobGludDIpOworICAgIENQUFVOSVRfQVNTRVJUKCBsaW50MS5zaXplKCkgPT0gMjAgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggbGludDEgPT0gbGludHJlZiApOworICAgIENQUFVOSVRfQVNTRVJUKCBsaW50Mi5lbXB0eSgpICk7CisgIH0KKyAgQ1BQVU5JVF9DSEVDSyggc3RhY2sxLm9rKCkgKTsKKyAgQ1BQVU5JVF9DSEVDSyggc3RhY2syLm9rKCkgKTsKKworI2lmIGRlZmluZWQgKFNUTFBPUlQpICYmICFkZWZpbmVkIChfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVTKSAmJiBcCisgICAgKCFkZWZpbmVkIChfTVNDX1ZFUikgfHwgKF9NU0NfVkVSID49IDEzMDApKQorICB7CisgICAgLy9UaGlzIGlzIGEgY29tcGlsZSB0aW1lIHRlc3QuCisgICAgLy9XZSBjaGVjayB0aGF0IHNvcnQgaW1wbGVtZW50YXRpb24gaXMgY29ycmVjdCB3aGVuIGxpc3QgaXMgaW5zdGFuY2lhdGVkCisgICAgLy93aXRoIGFuIGFsbG9jYXRvciB0aGF0IGRvIG5vdCBoYXZlIGEgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICBMaXN0SW50IGxpbnQxKDEwLCAwLCBzdGFjazEpOworICAgIGxpbnQxLnNvcnQoKTsKKyAgICBsaW50MS5zb3J0KGdyZWF0ZXI8aW50PigpKTsKKyAgfQorI2VuZGlmCit9CisKKy8qCit2b2lkIExpc3RUZXN0Ojpjb25zdF9saXN0KCkKK3sKKyAgbGlzdDxjb25zdCBpbnQ+IGNpbnRfbGlzdDsKKyAgY2ludF9saXN0LnB1c2hfYmFjaygxKTsKKyAgY2ludF9saXN0LnB1c2hfZnJvbnQoMik7Cit9CisqLwordm9pZCBMaXN0VGVzdDo6c3dhcCgpCit7CisgIGxpc3Q8aW50PiBsc3QxOworICBsaXN0PGludD4gbHN0MjsKKworICBsc3QxLnB1c2hfYmFjaygxKTsKKyAgbHN0Mi5wdXNoX2JhY2soMik7CisKKyAgbHN0MS5zd2FwKCBsc3QyICk7CisKKyAgQ1BQVU5JVF9DSEVDSyggbHN0MS5mcm9udCgpID09IDIgKTsKKyAgQ1BQVU5JVF9DSEVDSyggbHN0Mi5mcm9udCgpID09IDEgKTsKKyAgQ1BQVU5JVF9DSEVDSyggbHN0MS5zaXplKCkgPT0gMSApOworICBDUFBVTklUX0NIRUNLKCBsc3QyLnNpemUoKSA9PSAxICk7CisKKyAgbHN0MS5wb3BfZnJvbnQoKTsKKyAgbHN0Mi5wb3BfZnJvbnQoKTsKKworICBDUFBVTklUX0NIRUNLKCBsc3QxLmVtcHR5KCkgKTsKKyAgQ1BQVU5JVF9DSEVDSyggbHN0Mi5lbXB0eSgpICk7Cit9CisKK25hbWVzcGFjZSBmb28geworICBjbGFzcyBiYXIge307CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JdD4KKyAgc2l6ZV90IGRpc3RhbmNlKF9JdCwgX0l0KTsKK30KKwordm9pZCBMaXN0VGVzdDo6YWRsKCkKK3sKKyAgbGlzdDxmb286OmJhcj4gbGJhcjsKKyAgQ1BQVU5JVF9BU1NFUlQoIGxiYXIuc2l6ZSgpID09IDApOworfQorCisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IFwKKyAgICAhZGVmaW5lZCAoX1NUTFBfVVNFX1BUUl9TUEVDSUFMSVpBVElPTlMpIHx8IGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pCisvKiBTaW1wbGUgY29tcGlsYXRpb24gdGVzdDogQ2hlY2sgdGhhdCBuZXN0ZWQgdHlwZXMgbGlrZSBpdGVyYXRvcgorICogY2FuIGJlIGFjY2VzcyBldmVuIGlmIHR5cGUgdXNlZCB0byBpbnN0YW5jaWF0ZSBjb250YWluZXIgaXMgbm90CisgKiB5ZXQgY29tcGxldGVseSBkZWZpbmVkLgorICovCitjbGFzcyBJbmNvbXBsZXRlQ2xhc3MKK3sKKyAgbGlzdDxJbmNvbXBsZXRlQ2xhc3M+IGluc3RhbmNlczsKKyAgdHlwZWRlZiBsaXN0PEluY29tcGxldGVDbGFzcz46Oml0ZXJhdG9yIGl0OworfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L2xvY2FsZV9oZWFkZXJfdGVzdC5jcHAgYi90ZXN0L3VuaXQvbG9jYWxlX2hlYWRlcl90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjJkZWMxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L2xvY2FsZV9oZWFkZXJfdGVzdC5jcHAKQEAgLTAsMCArMSwxMCBAQAorLyogVGhpcyB0ZXN0IHB1cnBvc2UgaXMgc2ltcGx5IHRvIGNoZWNrIFN0YW5kYXJkIGhlYWRlciBpbmRlcGVuZGFuY3kgdGhhdAorICogaXMgdG8gc2F5IHRoYXQgdGhlIGhlYWRlciBjYW4gYmUgaW5jbHVkZWQgYWxvbmUgd2l0aG91dCBhbnkgcHJldmlvdXMKKyAqIGluY2x1ZGUuCisgKiBBZGRpdGlvbm5hbHksIGZvciBDIFN0YW5kYXJkIGhlYWRlcnMgdGhhdCBTVExwb3J0IGV4cG9zZSwgaXQgY2FuIGFsc28gYmUKKyAqIHVzZWQgdG8gY2hlY2sgdGhhdCBmaWxlcyBpbmNsdWRlZCBieSB0aG9zZSBoZWFkZXJzIGFyZSBjb21wYXRpYmxlIHdpdGgKKyAqIHB1cmUgQyBjb21waWxlcnMuCisgKi8KKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fSU9TVFJFQU1TKQorIyAgaW5jbHVkZSA8bG9jYWxlPgorI2VuZGlmCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvbG9jYWxlX3Rlc3QuY3BwIGIvdGVzdC91bml0L2xvY2FsZV90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWQzZGE5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L2xvY2FsZV90ZXN0LmNwcApAQCAtMCwwICsxLDMzNyBAQAorI2luY2x1ZGUgImxvY2FsZV90ZXN0LmgiCisKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgIWRlZmluZWQgKF9TVExQX1VTRV9OT19JT1NUUkVBTVMpCisjICBpbmNsdWRlIDxzc3RyZWFtPgorIyAgaW5jbHVkZSA8bG9jYWxlPgorIyAgaW5jbHVkZSA8c3RkZXhjZXB0PgorCisjICBpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZChfU1RMUF9VU0VfTkFNRVNQQUNFUykKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisjICBlbmRpZgorCitzdGF0aWMgY29uc3QgY2hhciogdGVzdGVkX2xvY2FsZXNbXSA9IHsKKy8vbmFtZSwKKyMgIGlmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkIChfU1RMUF9VU0VfRVhDRVBUSU9OUykKKyAgImZyX0ZSIiwKKyAgInJ1X1JVLmtvaThyIiwKKyAgImVuX0dCIiwKKyAgImVuX1VTIiwKKyMgIGVuZGlmCisgICIiLAorICAiQyIKK307CisKK0NQUFVOSVRfVEVTVF9TVUlURV9SRUdJU1RSQVRJT04oTG9jYWxlVGVzdCk7CisKKy8vCisvLyB0ZXN0cyBpbXBsZW1lbnRhdGlvbgorLy8KK3R5cGVkZWYgdm9pZCAoTG9jYWxlVGVzdDo6Kl9UZXN0KSAoY29uc3QgbG9jYWxlJik7CitzdGF0aWMgdm9pZCB0ZXN0X3N1cHBvcnRlZF9sb2NhbGUoTG9jYWxlVGVzdCAmaW5zdCwgX1Rlc3QgX190ZXN0KSB7CisgIHNpemVfdCBuID0gc2l6ZW9mKHRlc3RlZF9sb2NhbGVzKSAvIHNpemVvZih0ZXN0ZWRfbG9jYWxlc1swXSk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbjsgKytpKSB7CisgICAgbG9jYWxlIGxvYzsKKyMgIGlmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkIChfU1RMUF9VU0VfRVhDRVBUSU9OUykKKyAgICB0cnkgeworIyAgZW5kaWYKKyAgICAgIGxvY2FsZSB0bXAodGVzdGVkX2xvY2FsZXNbaV0pOworICAgICAgbG9jID0gdG1wOworIyAgaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IGRlZmluZWQgKF9TVExQX1VTRV9FWENFUFRJT05TKQorICAgIH0KKyAgICBjYXRjaCAocnVudGltZV9lcnJvciBjb25zdCYpIHsKKyAgICAgIC8vVGhpcyBsb2NhbGUgaXMgbm90IHN1cHBvcnRlZC4KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyMgIGVuZGlmCisgICAgQ1BQVU5JVF9NRVNTQUdFKCBsb2MubmFtZSgpLmNfc3RyKCkgKTsKKyAgICAoaW5zdC4qX190ZXN0KShsb2MpOworICB9Cit9CisKK3ZvaWQgTG9jYWxlVGVzdDo6bG9jYWxlX2J5X25hbWUoKSB7CisjICBpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZCAoX1NUTFBfVVNFX0VYQ0VQVElPTlMpCisgIC8qCisgICAqIENoZWNrIG9mIHRoZSAyMi4xLjEuMi43IHN0YW5kYXJkIHBvaW50LiBDb25zdHJ1Y3Rpb24gb2YgYSBsb2NhbGUKKyAgICogaW5zdGFuY2UgZnJvbSBhIG51bGwgcG9pbnRlciBvciBhbiB1bmtub3duIG5hbWUgc2hvdWxkIHJlc3VsdCBpbgorICAgKiBhIHJ1bnRpbWVfZXJyb3IgZXhjZXB0aW9uLgorICAgKi8KKyAgdHJ5IHsKKyAgICBsb2NhbGUgbG9jKHN0YXRpY19jYXN0PGNoYXIgY29uc3QqPigwKSk7CisgICAgQ1BQVU5JVF9GQUlMOworICB9CisgIGNhdGNoIChydW50aW1lX2Vycm9yIGNvbnN0JikgeworICB9CisgIGNhdGNoICguLi4pIHsKKyAgICBDUFBVTklUX0ZBSUw7CisgIH0KKworICB0cnkgeworICAgIGxvY2FsZSBsb2MoInlhc2xpX2xhbmd1YWdlIik7CisgICAgQ1BQVU5JVF9GQUlMOworICB9CisgIGNhdGNoIChydW50aW1lX2Vycm9yIGNvbnN0JiAvKiBlICovKSB7CisgICAgLy9DUFBVTklUX01FU1NBR0UoIGUud2hhdCgpICk7CisgIH0KKyAgY2F0Y2ggKC4uLikgeworICAgIENQUFVOSVRfRkFJTDsKKyAgfQorCisgIHRyeSB7CisgICAgc3RyaW5nIHZlcnlfbGFyZ2VfbG9jYWxlX25hbWUoMTAyNCwgJz8nKTsKKyAgICBsb2NhbGUgbG9jKHZlcnlfbGFyZ2VfbG9jYWxlX25hbWUuY19zdHIoKSk7CisgICAgQ1BQVU5JVF9GQUlMOworICB9CisgIGNhdGNoIChydW50aW1lX2Vycm9yIGNvbnN0JiAvKiBlICovKSB7CisgICAgLy9DUFBVTklUX01FU1NBR0UoIGUud2hhdCgpICk7CisgIH0KKyAgY2F0Y2ggKC4uLikgeworICAgIENQUFVOSVRfRkFJTDsKKyAgfQorCisjaWYgZGVmaW5lZCAoU1RMUE9SVCkgfHwgIWRlZmluZWQgKF9NU0NfVkVSKSB8fCAoX01TQ19WRVIgPiAxNDAwKQorICB0cnkgeworICAgIHN0cmluZyB2ZXJ5X2xhcmdlX2xvY2FsZV9uYW1lKCJMQ19DVFlQRT0iKTsKKyAgICB2ZXJ5X2xhcmdlX2xvY2FsZV9uYW1lLmFwcGVuZCgxMDI0LCAnPycpOworICAgIGxvY2FsZSBsb2ModmVyeV9sYXJnZV9sb2NhbGVfbmFtZS5jX3N0cigpKTsKKyAgICBDUFBVTklUX0ZBSUw7CisgIH0KKyAgY2F0Y2ggKHJ1bnRpbWVfZXJyb3IgY29uc3QmIC8qIGUgKi8pIHsKKyAgICAvL0NQUFVOSVRfTUVTU0FHRSggZS53aGF0KCkgKTsKKyAgfQorICBjYXRjaCAoLi4uKSB7CisgICAgQ1BQVU5JVF9GQUlMOworICB9CisKKyAgdHJ5IHsKKyAgICBzdHJpbmcgdmVyeV9sYXJnZV9sb2NhbGVfbmFtZSgiTENfQUxMPSIpOworICAgIHZlcnlfbGFyZ2VfbG9jYWxlX25hbWUuYXBwZW5kKDEwMjQsICc/Jyk7CisgICAgbG9jYWxlIGxvYyh2ZXJ5X2xhcmdlX2xvY2FsZV9uYW1lLmNfc3RyKCkpOworICAgIENQUFVOSVRfRkFJTDsKKyAgfQorICBjYXRjaCAocnVudGltZV9lcnJvciBjb25zdCYgLyogZSAqLykgeworICAgIC8vQ1BQVU5JVF9NRVNTQUdFKCBlLndoYXQoKSApOworICB9CisgIGNhdGNoICguLi4pIHsKKyAgICBDUFBVTklUX0ZBSUw7CisgIH0KKyNlbmRpZgorCisgIHRyeSB7CisgICAgbG9jYWxlIGxvYygiQyIpOworICB9CisgIGNhdGNoIChydW50aW1lX2Vycm9yIGNvbnN0JiAvKiBlICovKSB7CisgICAgLyogQ1BQVU5JVF9NRVNTQUdFKCBlLndoYXQoKSApOyAqLworICAgIENQUFVOSVRfRkFJTDsKKyAgfQorICBjYXRjaCAoLi4uKSB7CisgICAgQ1BQVU5JVF9GQUlMOworICB9CisKKyAgdHJ5IHsKKyAgICAvLyBPbiBwbGF0Zm9ybSB3aXRob3V0IHJlYWwgbG9jYWxpemF0aW9uIHN1cHBvcnQgd2Ugc2hvdWxkIHJlbHkgb24gdGhlICJDIiBsb2NhbGUgZmFjZXQuCisgICAgbG9jYWxlIGxvYygiIik7CisgIH0KKyAgY2F0Y2ggKHJ1bnRpbWVfZXJyb3IgY29uc3QmIC8qIGUgKi8pIHsKKyAgICAvKiBDUFBVTklUX01FU1NBR0UoIGUud2hhdCgpICk7ICovCisgICAgQ1BQVU5JVF9GQUlMOworICB9CisgIGNhdGNoICguLi4pIHsKKyAgICBDUFBVTklUX0ZBSUw7CisgIH0KKworIyAgZW5kaWYKK30KKwordm9pZCBMb2NhbGVUZXN0Ojpsb2NfaGFzX2ZhY2V0KCkgeworICBsb2NhbGUgbG9jKCJDIik7CisgIHR5cGVkZWYgbnVtcHVuY3Q8Y2hhcj4gaW1wbGVtZW50ZWRfZmFjZXQ7CisgIENQUFVOSVRfQVNTRVJUKCBoYXNfZmFjZXQ8aW1wbGVtZW50ZWRfZmFjZXQ+KGxvYykgKTsKKyAgLyoKKyAgdHlwZWRlZiBudW1fcHV0PGNoYXIsIGJhY2tfaW5zZXJ0X2l0ZXJhdG9yPHN0cmluZz4gPiBub3RfaW1wbGVtZW50ZWRfZmFjZXQ7CisgIENQUFVOSVRfQVNTRVJUKCAhaGFzX2ZhY2V0PG5vdF9pbXBsZW1lbnRlZF9mYWNldD4obG9jKSApOworICAqLworfQorCit2b2lkIExvY2FsZVRlc3Q6OmxvY2FsZV9pbml0X3Byb2JsZW0oKSB7CisjICBpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgIWRlZmluZWQgKF9TVExQX05PX01FTUJFUl9URU1QTEFURVMpCisgIHRlc3Rfc3VwcG9ydGVkX2xvY2FsZSgqdGhpcywgJkxvY2FsZVRlc3Q6Ol9sb2NhbGVfaW5pdF9wcm9ibGVtKTsKKyMgIGVuZGlmCit9CisKKy8qCisgKiBDcmVhdGlvbiBvZiBhIGxvY2FsZSBpbnN0YW5jZSBpbXBseSBpbml0aWFsaXphdGlvbiBvZiBzb21lIFNUTHBvcnQgaW50ZXJuYWwKKyAqIHN0YXRpYyBvYmplY3RzIGZpcnN0LiBXZSB1c2UgYSBzdGF0aWMgaW5zdGFuY2Ugb2YgbG9jYWxlIHRvIGNoZWNrIHRoYXQgdGhpcworICogaW5pdGlhbGl6YXRpb24gaXMgZG9uZSBjb3JyZWN0bHkuCisgKi8KK3N0YXRpYyBsb2NhbGUgZ2xvYmFsX2xvYzsKK3N0YXRpYyBsb2NhbGUgb3RoZXJfbG9jKCIiKTsKKworIyAgaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8ICFkZWZpbmVkIChfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVTKQordm9pZCBMb2NhbGVUZXN0OjpfbG9jYWxlX2luaXRfcHJvYmxlbSggY29uc3QgbG9jYWxlJiBsb2MpCit7CisjICAgIGlmICFkZWZpbmVkIChfX0FQUExFX18pICYmICFkZWZpbmVkIChfX0ZyZWVCU0RfXykgfHwgXAorICAgICAgICAhZGVmaW5lZChfX0dOVUNfXykgfHwgKChfX0dOVUNfXyA+IDMpIHx8ICgoX19HTlVDX18gPT0gMykgJiYgKF9fR05VQ19NSU5PUl9fPiAzKSkpCisgIHR5cGVkZWYgY29kZWN2dDxjaGFyLGNoYXIsbWJzdGF0ZV90PiBteV9mYWNldDsKKyMgICAgZWxzZQorLy8gc3RkOjptYnN0YXRlX3QgcmVxdWlyZWQgZm9yIGdjYyAzLjMuMiBvbiBGcmVlQlNELi4uCisvLyBJIGFtIG5vdCBzdXJlIHdoYXQga2V5IGhlcmUtLS1GcmVlQlNEIG9yIDMuMy4yLi4uCisvLyAgICAgIC0gcHRyIDIwMDUtMDQtMDQKKyAgdHlwZWRlZiBjb2RlY3Z0PGNoYXIsY2hhcixzdGQ6Om1ic3RhdGVfdD4gbXlfZmFjZXQ7CisjICAgIGVuZGlmCisKKyAgbG9jYWxlIGxvY19yZWYoZ2xvYmFsX2xvYyk7CisgIHsKKyAgICBsb2NhbGUgZ2xvYyggbG9jX3JlZiwgbmV3IG15X2ZhY2V0KCkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggaGFzX2ZhY2V0PG15X2ZhY2V0PiggZ2xvYyApICk7CisgICAgLy9UaGUgZm9sbG93aW5nIGNvZGUgaXMganVzdCBoZXJlIHRvIHRyeSB0byBjb25mdXNlIHRoZSByZWZlcmVuY2UgY291bnRpbmcgdW5kZXJseWluZyBtZWNhbmlzbToKKyAgICBsb2NhbGU6Omdsb2JhbCggbG9jYWxlOjpjbGFzc2ljKCkgKTsKKyAgICBsb2NhbGU6Omdsb2JhbCggZ2xvYyApOworICB9CisKKyMgICAgICBpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZCAoX1NUTFBfVVNFX0VYQ0VQVElPTlMpCisgIHRyeSB7CisjICAgICAgZW5kaWYKKyAgICBvc3RyaW5nc3RyZWFtIG9zKCJ0ZXN0IikgOworICAgIGxvY2FsZSBsb2MyKCBsb2MsIG5ldyBteV9mYWNldCgpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGhhc19mYWNldDxteV9mYWNldD4oIGxvYzIgKSApOworICAgIG9zLmltYnVlKCBsb2MyICk7CisjICAgICAgaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IGRlZmluZWQgKF9TVExQX1VTRV9FWENFUFRJT05TKQorICB9CisgIGNhdGNoICggcnVudGltZV9lcnJvciYgKSB7CisgICAgQ1BQVU5JVF9GQUlMOworICB9CisgIGNhdGNoICggLi4uICkgeworICAgQ1BQVU5JVF9GQUlMOworICB9CisjICAgICAgZW5kaWYKKworIyAgICAgIGlmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkIChfU1RMUF9VU0VfRVhDRVBUSU9OUykKKyAgdHJ5IHsKKyMgICAgICBlbmRpZgorICAgIG9zdHJpbmdzdHJlYW0gb3MyKCJ0ZXN0MiIpOworIyAgICAgIGlmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkIChfU1RMUF9VU0VfRVhDRVBUSU9OUykKKyAgfQorICBjYXRjaCAoIHJ1bnRpbWVfZXJyb3ImICkgeworICAgIENQUFVOSVRfRkFJTDsKKyAgfQorICBjYXRjaCAoIC4uLiApIHsKKyAgICBDUFBVTklUX0ZBSUw7CisgIH0KKyMgIGVuZGlmCit9CisjZW5kaWYKKwordm9pZCBMb2NhbGVUZXN0OjpkZWZhdWx0X2xvY2FsZSgpCit7CisgIGxvY2FsZSBsb2MoICIiICk7Cit9CisKK2NsYXNzIGR1bW15X2ZhY2V0IDogcHVibGljIGxvY2FsZTo6ZmFjZXQgeworcHVibGljOgorICBzdGF0aWMgbG9jYWxlOjppZCBpZDsKK307CisKK2xvY2FsZTo6aWQgZHVtbXlfZmFjZXQ6OmlkOworCit2b2lkIExvY2FsZVRlc3Q6OmNvbWJpbmUoKQoreworIyAgaWYgKCFkZWZpbmVkIChTVExQT1JUKSB8fCBcCisgICAgICAgKGRlZmluZWQgKF9TVExQX1VTRV9FWENFUFRJT05TKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFUykgJiYgIWRlZmluZWQgKF9TVExQX05PX0VYUExJQ0lUX0ZVTkNUSU9OX1RNUExfQVJHUykpKQorICB7CisgICAgdHJ5IHsKKyAgICAgIGxvY2FsZSBsb2MoIiIpOworICAgICAgaWYgKCFoYXNfZmFjZXQ8bWVzc2FnZXM8Y2hhcj4gPihsb2MpKSB7CisgICAgICAgIGxvYy5jb21iaW5lPG1lc3NhZ2VzPGNoYXI+ID4obG9jKTsKKyAgICAgICAgQ1BQVU5JVF9GQUlMOworICAgICAgfQorICAgIH0KKyAgICBjYXRjaCAoY29uc3QgcnVudGltZV9lcnJvciAmIC8qIGUgKi8pIHsKKyAgICAgIC8qIENQUFVOSVRfTUVTU0FHRSggZS53aGF0KCkgKTsgKi8KKyAgICB9CisKKyAgICB0cnkgeworICAgICAgbG9jYWxlIGxvYzsKKyAgICAgIGlmICghaGFzX2ZhY2V0PGR1bW15X2ZhY2V0Pihsb2MpKSB7CisgICAgICAgIGxvYy5jb21iaW5lPGR1bW15X2ZhY2V0Pihsb2MpOworICAgICAgICBDUFBVTklUX0ZBSUw7CisgICAgICB9CisgICAgfQorICAgIGNhdGNoIChjb25zdCBydW50aW1lX2Vycm9yICYgLyogZSAqLykgeworICAgICAgLyogQ1BQVU5JVF9NRVNTQUdFKCBlLndoYXQoKSApOyAqLworICAgIH0KKyAgfQorCisgIGxvY2FsZSBsb2MxKGxvY2FsZTo6Y2xhc3NpYygpKSwgbG9jMjsKKyAgc2l6ZV90IGxvYzFfaW5kZXggPSAwOworICBmb3IgKHNpemVfdCBpID0gMDsgX2dldF9yZWZfbW9uZXRhcnkoaSkgIT0gMDsgKytpKSB7CisgICAgdHJ5IHsKKyAgICAgIHsKKyAgICAgICAgbG9jYWxlIGxvYyhfZ2V0X3JlZl9tb25ldGFyeV9uYW1lKF9nZXRfcmVmX21vbmV0YXJ5KGkpKSk7CisgICAgICAgIGlmIChsb2MxID09IGxvY2FsZTo6Y2xhc3NpYygpKQorICAgICAgICB7CisgICAgICAgICAgbG9jMSA9IGxvYzsKKyAgICAgICAgICBsb2MxX2luZGV4ID0gaTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBsb2MyID0gbG9jOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vV2UgY2FuIHN0YXJ0IHRoZSB0ZXN0CisgICAgICBvc3RyaW5nc3RyZWFtIG9zdHI7CisgICAgICBvc3RyIDw8ICJjb21iaW5pbmcgJyIgPDwgbG9jMi5uYW1lKCkgPDwgIicgbW9uZXkgZmFjZXRzIHdpdGggJyIgPDwgbG9jMS5uYW1lKCkgPDwgIiciOworICAgICAgQ1BQVU5JVF9NRVNTQUdFKCBvc3RyLnN0cigpLmNfc3RyKCkgKTsKKworICAgICAgLy9XZSBhcmUgZ29pbmcgdG8gY29tYmluZSBtb25leSBmYWNldHMgYXMgYWxsIGZvcm1hdHMgYXJlIGRpZmZlcmVudC4KKyAgICAgIHsKKyAgICAgICAgLy9XZSBjaGVjayB0aGF0IHJlc3VsdGluZyBsb2NhbGUgaGFzIGNvcnJlY3RseSBhY3F1aXJlIGxvYzIgZmFjZXRzLgorICAgICAgICBsb2NhbGUgbG9jID0gbG9jMS5jb21iaW5lPG1vbmV5cHVuY3Q8Y2hhciwgdHJ1ZT4gPihsb2MyKTsKKyAgICAgICAgbG9jID0gbG9jLmNvbWJpbmU8bW9uZXlwdW5jdDxjaGFyLCBmYWxzZT4gPihsb2MyKTsKKyAgICAgICAgbG9jID0gbG9jLmNvbWJpbmU8bW9uZXlfcHV0PGNoYXI+ID4obG9jMik7CisgICAgICAgIGxvYyA9IGxvYy5jb21iaW5lPG1vbmV5X2dldDxjaGFyPiA+KGxvYzIpOworCisgICAgICAgIC8vQ2hlY2sgbG9jIGhhcyB0aGUgY29ycmVjdCBmYWNldHM6CisgICAgICAgIF9tb25leV9wdXRfZ2V0Mihsb2MyLCBsb2MsIF9nZXRfcmVmX21vbmV0YXJ5KGkpKTsKKworICAgICAgICAvL0NoZWNrIGxvYzEgaGFzIG5vdCBiZWVuIGltcGFjdGVkOgorICAgICAgICBfbW9uZXlfcHV0X2dldDIobG9jMSwgbG9jMSwgX2dldF9yZWZfbW9uZXRhcnkobG9jMV9pbmRleCkpOworCisgICAgICAgIC8vQ2hlY2sgbG9jMiBoYXMgbm90IGJlZW4gaW1wYWN0ZWQ6CisgICAgICAgIF9tb25leV9wdXRfZ2V0Mihsb2MyLCBsb2MyLCBfZ2V0X3JlZl9tb25ldGFyeShpKSk7CisgICAgICB9CisgICAgICB7CisgICAgICAgIC8vV2UgY2hlY2sgdGhhdCByZXN1bHRpbmcgbG9jYWxlIGhhcyBub3Qgd3JvbmdseSBhY3F1aXJlIGxvYzEgZmFjZXRzIHRoYXQgaGFzbid0IGJlZW4gY29tYmluZToKKyAgICAgICAgbG9jYWxlIGxvYyA9IGxvYzIuY29tYmluZTxudW1wdW5jdDxjaGFyPiA+KGxvYzEpOworICAgICAgICBsb2MgPSBsb2MuY29tYmluZTx0aW1lX3B1dDxjaGFyPiA+KGxvYzEpOworICAgICAgICBsb2MgPSBsb2MuY29tYmluZTx0aW1lX2dldDxjaGFyPiA+KGxvYzEpOworCisgICAgICAgIC8vQ2hlY2sgbG9jIGhhcyB0aGUgY29ycmVjdCBmYWNldHM6CisgICAgICAgIF9tb25leV9wdXRfZ2V0Mihsb2MyLCBsb2MsIF9nZXRfcmVmX21vbmV0YXJ5KGkpKTsKKworICAgICAgICAvL0NoZWNrIGxvYzEgaGFzIG5vdCBiZWVuIGltcGFjdGVkOgorICAgICAgICBfbW9uZXlfcHV0X2dldDIobG9jMSwgbG9jMSwgX2dldF9yZWZfbW9uZXRhcnkobG9jMV9pbmRleCkpOworCisgICAgICAgIC8vQ2hlY2sgbG9jMiBoYXMgbm90IGJlZW4gaW1wYWN0ZWQ6CisgICAgICAgIF9tb25leV9wdXRfZ2V0Mihsb2MyLCBsb2MyLCBfZ2V0X3JlZl9tb25ldGFyeShpKSk7CisgICAgICB9CisKKyAgICAgIHsKKyAgICAgICAgLy8gQ2hlY2sgYXV0byBjb21iaW5hdGlvbiBkbyBub3QgcmVzdWx0IGluIHdlaXJkIHJlZmVyZW5jZSBjb3VudGluZyBiZWhhdmlvciAKKyAgICAgICAgLy8gKG1pZ2h0IGdlbmVyYXRlIGEgY3Jhc2gpLgorICAgICAgICBsb2MxLmNvbWJpbmU8bnVtcHVuY3Q8Y2hhcj4gPihsb2MxKTsKKyAgICAgIH0KKworICAgICAgbG9jMSA9IGxvYzI7CisgICAgICBsb2MxX2luZGV4ID0gaTsKKyAgICB9CisgICAgY2F0Y2ggKHJ1bnRpbWVfZXJyb3IgY29uc3QmKSB7CisgICAgICAvL1RoaXMgbG9jYWxlIGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgICBjb250aW51ZTsKKyAgICB9CisgIH0KKyMgIGVuZGlmCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L2xvY2FsZV90ZXN0LmggYi90ZXN0L3VuaXQvbG9jYWxlX3Rlc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjk3YWM0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L2xvY2FsZV90ZXN0LmgKQEAgLTAsMCArMSw5NCBAQAorI2luY2x1ZGUgPHN0cmluZz4KKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgIWRlZmluZWQgKF9TVExQX1VTRV9OT19JT1NUUkVBTVMpCisjICBpbmNsdWRlIDxpb3Nmd2Q+CisKKyMgIGluY2x1ZGUgImNwcHVuaXQvY3BwdW5pdF9wcm94eS5oIgorIyAgaW5jbHVkZSA8bG9jYWxlPgorCitzdHJ1Y3QgcmVmX21vbmV0YXJ5Oworc3RydWN0IHJlZl9sb2NhbGU7CisKKyMgIGlmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkIChfU1RMUF9VU0VfTkFNRVNQQUNFUykKKyMgICAgZGVmaW5lIFNURCBzdGQ6OgorIyAgZWxzZQorIyAgICBkZWZpbmUgU1RECisjICBlbmRpZgorCisvLworLy8gVGVzdENhc2UgY2xhc3MKKy8vCitjbGFzcyBMb2NhbGVUZXN0IDogcHVibGljIENQUFVOSVRfTlM6OlRlc3RDYXNlCit7CisgIENQUFVOSVRfVEVTVF9TVUlURShMb2NhbGVUZXN0KTsKKyMgIGlmIGRlZmluZWQgKFNUTFBPUlQpICYmICFkZWZpbmVkIChfU1RMUF9VU0VfRVhDRVBUSU9OUykKKyAgQ1BQVU5JVF9JR05PUkU7CisjICBlbmRpZgorICBDUFBVTklUX1RFU1QobG9jYWxlX2J5X25hbWUpOworICBDUFBVTklUX1RFU1QobW9uZXlwdW5jdF9ieV9uYW1lKTsKKyAgQ1BQVU5JVF9URVNUKHRpbWVfYnlfbmFtZSk7CisgIENQUFVOSVRfVEVTVChudW1wdW5jdF9ieV9uYW1lKTsKKyAgQ1BQVU5JVF9URVNUKGN0eXBlX2J5X25hbWUpOworICBDUFBVTklUX1RFU1QoY29sbGF0ZV9ieV9uYW1lKTsKKyAgQ1BQVU5JVF9URVNUKG1lc3NhZ2VzX2J5X25hbWUpOworICBDUFBVTklUX1NUT1BfSUdOT1JFOworICBDUFBVTklUX1RFU1QobG9jX2hhc19mYWNldCk7CisgIENQUFVOSVRfVEVTVChudW1fcHV0X2dldCk7CisgIENQUFVOSVRfVEVTVChtb25leV9wdXRfZ2V0KTsKKyAgQ1BQVU5JVF9URVNUKG1vbmV5X3B1dF9YX2J1Zyk7CisgIENQUFVOSVRfVEVTVCh0aW1lX3B1dF9nZXQpOworICBDUFBVTklUX1RFU1QoY29sbGF0ZV9mYWNldCk7CisgIENQUFVOSVRfVEVTVChjdHlwZV9mYWNldCk7CisjICBpZiBkZWZpbmVkIChTVExQT1JUKSAmJiBkZWZpbmVkIChfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVTKQorICBDUFBVTklUX0lHTk9SRTsKKyMgIGVuZGlmCisgIENQUFVOSVRfVEVTVChsb2NhbGVfaW5pdF9wcm9ibGVtKTsKKyAgQ1BQVU5JVF9TVE9QX0lHTk9SRTsKKyAgQ1BQVU5JVF9URVNUKGRlZmF1bHRfbG9jYWxlKTsKKyMgIGlmICFkZWZpbmVkIChTVExQT1JUKQorICBDUFBVTklUX0lHTk9SRTsKKyMgIGVuZGlmCisgIENQUFVOSVRfU1RPUF9JR05PUkU7CisjaWYgKGRlZmluZWQgKFNUTFBPUlQpICYmIFwKKyAgICghZGVmaW5lZCAoX1NUTFBfVVNFX0VYQ0VQVElPTlMpIHx8IGRlZmluZWQgKF9TVExQX05PX01FTUJFUl9URU1QTEFURVMpIHx8IGRlZmluZWQgKF9TVExQX05PX0VYUExJQ0lUX0ZVTkNUSU9OX1RNUExfQVJHUykpKQorICBDUFBVTklUX0lHTk9SRTsKKyMgIGVuZGlmCisgIENQUFVOSVRfVEVTVChjb21iaW5lKTsKKyAgQ1BQVU5JVF9URVNUX1NVSVRFX0VORCgpOworCitwdWJsaWM6CisgIHZvaWQgbG9jYWxlX2J5X25hbWUoKTsKKyAgdm9pZCBsb2NfaGFzX2ZhY2V0KCk7CisgIHZvaWQgbnVtX3B1dF9nZXQoKTsKKyAgdm9pZCBudW1wdW5jdF9ieV9uYW1lKCk7CisgIHZvaWQgdGltZV9wdXRfZ2V0KCk7CisgIHZvaWQgdGltZV9ieV9uYW1lKCk7CisgIHZvaWQgY29sbGF0ZV9mYWNldCgpOworICB2b2lkIGNvbGxhdGVfYnlfbmFtZSgpOworICB2b2lkIGN0eXBlX2ZhY2V0KCk7CisgIHZvaWQgY3R5cGVfYnlfbmFtZSgpOworICB2b2lkIGxvY2FsZV9pbml0X3Byb2JsZW0oKTsKKyAgdm9pZCBtb25leV9wdXRfZ2V0KCk7CisgIHZvaWQgbW9uZXlfcHV0X1hfYnVnKCk7CisgIHZvaWQgbW9uZXlwdW5jdF9ieV9uYW1lKCk7CisgIHZvaWQgZGVmYXVsdF9sb2NhbGUoKTsKKyAgdm9pZCBjb21iaW5lKCk7CisgIHZvaWQgbWVzc2FnZXNfYnlfbmFtZSgpOworcHJpdmF0ZToKKyAgdm9pZCBfbG9jX2hhc19mYWNldCggY29uc3QgU1REIGxvY2FsZSYgKTsKKyAgdm9pZCBfbnVtX3B1dF9nZXQoIGNvbnN0IFNURCBsb2NhbGUmLCBjb25zdCByZWZfbG9jYWxlKiApOworICB2b2lkIF90aW1lX3B1dF9nZXQoIGNvbnN0IFNURCBsb2NhbGUmICk7CisgIHZvaWQgX2N0eXBlX2ZhY2V0KCBjb25zdCBTVEQgbG9jYWxlJiApOworICB2b2lkIF9jdHlwZV9mYWNldF93KCBjb25zdCBTVEQgbG9jYWxlJiApOworICB2b2lkIF9sb2NhbGVfaW5pdF9wcm9ibGVtKCBjb25zdCBTVEQgbG9jYWxlJiApOworCisgIHN0YXRpYyBjb25zdCByZWZfbW9uZXRhcnkqIF9nZXRfcmVmX21vbmV0YXJ5KHNpemVfdCk7CisgIHN0YXRpYyBjb25zdCBjaGFyKiBfZ2V0X3JlZl9tb25ldGFyeV9uYW1lKGNvbnN0IHJlZl9tb25ldGFyeSopOworCisgIHZvaWQgX21vbmV5X3B1dF9nZXQoIGNvbnN0IFNURCBsb2NhbGUmLCBjb25zdCByZWZfbW9uZXRhcnkqICk7CisgIHZvaWQgX21vbmV5X3B1dF9nZXQyKCBjb25zdCBTVEQgbG9jYWxlJiBsb2MsIGNvbnN0IFNURCBsb2NhbGUmIHN0cmVhbUxvYywgY29uc3QgcmVmX21vbmV0YXJ5KiApOworICB2b2lkIF9tb25leV9wdXRfWF9idWcoIGNvbnN0IFNURCBsb2NhbGUmLCBjb25zdCByZWZfbW9uZXRhcnkqICk7Cit9OworCisjICB1bmRlZiBTVEQKKyNlbmRpZgorCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvbG9naWNfdGVzdC5jcHAgYi90ZXN0L3VuaXQvbG9naWNfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjljZWVhMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9sb2dpY190ZXN0LmNwcApAQCAtMCwwICsxLDY1IEBACisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCisjaW5jbHVkZSAiY3BwdW5pdC9jcHB1bml0X3Byb3h5LmgiCisKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZChfU1RMUF9VU0VfTkFNRVNQQUNFUykKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisjZW5kaWYKKworLy8KKy8vIFRlc3RDYXNlIGNsYXNzCisvLworY2xhc3MgTG9naWNUZXN0IDogcHVibGljIENQUFVOSVRfTlM6OlRlc3RDYXNlCit7CisgIENQUFVOSVRfVEVTVF9TVUlURShMb2dpY1Rlc3QpOworICBDUFBVTklUX1RFU1QobG9naWNhbmQpOworICBDUFBVTklUX1RFU1QobG9naWNub3QpOworICBDUFBVTklUX1RFU1QobG9naWNvcik7CisgIENQUFVOSVRfVEVTVF9TVUlURV9FTkQoKTsKKworcHJvdGVjdGVkOgorICB2b2lkIGxvZ2ljYW5kKCk7CisgIHZvaWQgbG9naWNub3QoKTsKKyAgdm9pZCBsb2dpY29yKCk7Cit9OworCitDUFBVTklUX1RFU1RfU1VJVEVfUkVHSVNUUkFUSU9OKExvZ2ljVGVzdCk7CisKKy8vCisvLyB0ZXN0cyBpbXBsZW1lbnRhdGlvbgorLy8KK3ZvaWQgTG9naWNUZXN0Ojpsb2dpY2FuZCgpCit7CisgIGJvb2wgaW5wdXQxIFs0XSA9IHsgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIHRydWUgfTsKKyAgYm9vbCBpbnB1dDIgWzRdID0geyBmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlIH07CisKKyAgYm9vbCBvdXRwdXQgWzRdOworICB0cmFuc2Zvcm0oKGJvb2wqKWlucHV0MSwgKGJvb2wqKWlucHV0MSArIDQsIChib29sKilpbnB1dDIsIChib29sKilvdXRwdXQsIGxvZ2ljYWxfYW5kPGJvb2w+KCkpOworCisgIENQUFVOSVRfQVNTRVJUKG91dHB1dFswXT09ZmFsc2UpOworICBDUFBVTklUX0FTU0VSVChvdXRwdXRbMV09PXRydWUpOworICBDUFBVTklUX0FTU0VSVChvdXRwdXRbMl09PWZhbHNlKTsKKyAgQ1BQVU5JVF9BU1NFUlQob3V0cHV0WzNdPT1mYWxzZSk7Cit9Cit2b2lkIExvZ2ljVGVzdDo6bG9naWNub3QoKQoreworICBib29sIGlucHV0IFs3XSA9IHsgMSwgMCwgMCwgMSwgMSwgMSwgMSB9OworCisgIGludCBuID0gY291bnRfaWYoaW5wdXQsIGlucHV0ICsgNywgbG9naWNhbF9ub3Q8Ym9vbD4oKSk7CisgIENQUFVOSVRfQVNTRVJUKCBuID09IDIgKTsKK30KK3ZvaWQgTG9naWNUZXN0Ojpsb2dpY29yKCkKK3sKKyAgYm9vbCBpbnB1dDEgWzRdID0geyB0cnVlLCB0cnVlLCBmYWxzZSwgdHJ1ZSB9OworICBib29sIGlucHV0MiBbNF0gPSB7IGZhbHNlLCB0cnVlLCBmYWxzZSwgZmFsc2UgfTsKKworICBib29sIG91dHB1dCBbNF07CisgIHRyYW5zZm9ybSgoYm9vbCopaW5wdXQxLCAoYm9vbCopaW5wdXQxICsgNCwgKGJvb2wqKWlucHV0MiwgKGJvb2wqKW91dHB1dCwgbG9naWNhbF9vcjxib29sPigpKTsKKworICBDUFBVTklUX0FTU0VSVChvdXRwdXRbMF09PXRydWUpOworICBDUFBVTklUX0FTU0VSVChvdXRwdXRbMV09PXRydWUpOworICBDUFBVTklUX0FTU0VSVChvdXRwdXRbMl09PWZhbHNlKTsKKyAgQ1BQVU5JVF9BU1NFUlQob3V0cHV0WzNdPT10cnVlKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9tYWNyb19jaGVja3MuY3BwIGIvdGVzdC91bml0L21hY3JvX2NoZWNrcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcxYTlmYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9tYWNyb19jaGVja3MuY3BwCkBAIC0wLDAgKzEsMTE1IEBACisjaW5jbHVkZSA8Y3N0ZGlvPgorI2luY2x1ZGUgPGN3Y2hhcj4KKyNpbmNsdWRlIDxjbGltaXRzPgorCisjaWYgIWRlZmluZWQgKENIQVJfQklUKQorIyAgZXJyb3IgTWlzc2luZyBDSEFSX0JJVCBkZWZpbml0aW9uLgorI2VuZGlmCisKKyNpZiAoQ0hBUl9CSVQgPCAwKQorIyAgZXJyb3IgV2VpcmQgV0NIQVJfQklUIHZhbHVlLgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoQ0hBUl9NQVgpCisjICBlcnJvciBNaXNzaW5nIENIQVJfTUFYIGRlZmluaXRpb24uCisjZW5kaWYKKworI2lmICFkZWZpbmVkIChDSEFSX01JTikKKyMgIGVycm9yIE1pc3NpbmcgQ0hBUl9NSU4gZGVmaW5pdGlvbi4KKyNlbmRpZgorCisjaWYgIShDSEFSX01JTiA8IENIQVJfTUFYKQorIyAgZXJyb3IgV2VpcmQgQ0hBUl9NSU4gb3IgQ0hBUl9NQVggbWFjcm8gdmFsdWVzLgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoSU5UX01BWCkKKyMgIGVycm9yIE1pc3NpbmcgSU5UX01BWCBkZWZpbml0aW9uLgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoSU5UX01JTikKKyMgIGVycm9yIE1pc3NpbmcgSU5UX01JTiBkZWZpbml0aW9uLgorI2VuZGlmCisKKyNpZiAhKElOVF9NSU4gPCBJTlRfTUFYKQorIyAgZXJyb3IgV2VpcmQgSU5UX01JTiBvciBJTlRfTUFYIG1hY3JvIHZhbHVlcy4KKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKExPTkdfTUFYKQorIyAgZXJyb3IgTWlzc2luZyBMT05HX01BWCBkZWZpbml0aW9uLgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoTE9OR19NSU4pCisjICBlcnJvciBNaXNzaW5nIExPTkdfTUlOIGRlZmluaXRpb24uCisjZW5kaWYKKworI2lmICEoTE9OR19NSU4gPCBMT05HX01BWCkKKyMgIGVycm9yIFdlaXJkIExPTkdfTUlOIG9yIExPTkdfTUFYIG1hY3JvIHZhbHVlcy4KKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKFNDSEFSX01BWCkKKyMgIGVycm9yIE1pc3NpbmcgU0NIQVJfTUFYIGRlZmluaXRpb24uCisjZW5kaWYKKworI2lmICFkZWZpbmVkIChTQ0hBUl9NSU4pCisjICBlcnJvciBNaXNzaW5nIFNDSEFSX01JTiBkZWZpbml0aW9uLgorI2VuZGlmCisKKyNpZiAhKFNDSEFSX01JTiA8IFNDSEFSX01BWCkKKyMgIGVycm9yIFdlaXJkIFNDSEFSX01JTiBvciBTQ0hBUl9NQVggbWFjcm8gdmFsdWVzLgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoU0hSVF9NQVgpCisjICBlcnJvciBNaXNzaW5nIFNIUlRfTUFYIGRlZmluaXRpb24uCisjZW5kaWYKKworI2lmICFkZWZpbmVkIChTSFJUX01JTikKKyMgIGVycm9yIE1pc3NpbmcgU0hSVF9NSU4gZGVmaW5pdGlvbi4KKyNlbmRpZgorCisjaWYgIShTSFJUX01JTiA8IFNIUlRfTUFYKQorIyAgZXJyb3IgV2VpcmQgU0hSVF9NSU4gb3IgU0hSVF9NQVggbWFjcm8gdmFsdWVzLgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoV0NIQVJfTUlOKQorIyAgZXJyb3IgTWlzc2luZyBXQ0hBUl9NSU4gZGVmaW5pdGlvbi4KKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKFdDSEFSX01BWCkKKyMgIGVycm9yIE1pc3NpbmcgV0NIQVJfTUFYIGRlZmluaXRpb24uCisjZW5kaWYKKworI2lmICEoV0NIQVJfTUlOIDwgV0NIQVJfTUFYKQorIyAgZXJyb3IgV2VpcmQgV0NIQVJfTUlOIG9yIFdDSEFSX01BWCBtYWNybyB2YWx1ZS4KKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKFVDSEFSX01BWCkKKyMgIGVycm9yIE1pc3NpbmcgVUNIQVJfTUFYIGRlZmluaXRpb24uCisjZW5kaWYKKworI2lmIChVQ0hBUl9NQVggPCAwKQorIyAgZXJyb3IgV2VpcmQgVUNIQVJfTUFYIG1hY3JvIHZhbHVlLgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoVUlOVF9NQVgpCisjICBlcnJvciBNaXNzaW5nIFVJTlRfTUFYIGRlZmluaXRpb24uCisjZW5kaWYKKworI2lmIChVSU5UX01BWCA8IDApCisjICBlcnJvciBXZWlyZCBVSU5UX01BWCBtYWNybyB2YWx1ZS4KKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKFVMT05HX01BWCkKKyMgIGVycm9yIE1pc3NpbmcgVUxPTkdfTUFYIGRlZmluaXRpb24uCisjZW5kaWYKKworI2lmIChVTE9OR19NQVggPCAwKQorIyAgZXJyb3IgV2VpcmQgVUxPTkdfTUFYIG1hY3JvIHZhbHVlLgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoVVNIUlRfTUFYKQorIyAgZXJyb3IgTWlzc2luZyBVU0hSVF9NQVggZGVmaW5pdGlvbi4KKyNlbmRpZgorCisjaWYgKFVTSFJUX01BWCA8IDApCisjICBlcnJvciBXZWlyZCBVU0hSVF9NQVggbWFjcm8gdmFsdWUuCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9tYXBfaGVhZGVyX3Rlc3QuY3BwIGIvdGVzdC91bml0L21hcF9oZWFkZXJfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRjZjE1NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9tYXBfaGVhZGVyX3Rlc3QuY3BwCkBAIC0wLDAgKzEsOCBAQAorLyogVGhpcyB0ZXN0IHB1cnBvc2UgaXMgc2ltcGx5IHRvIGNoZWNrIFN0YW5kYXJkIGhlYWRlciBpbmRlcGVuZGFuY3kgdGhhdAorICogaXMgdG8gc2F5IHRoYXQgdGhlIGhlYWRlciBjYW4gYmUgaW5jbHVkZWQgYWxvbmUgd2l0aG91dCBhbnkgcHJldmlvdXMKKyAqIGluY2x1ZGUuCisgKiBBZGRpdGlvbm5hbHksIGZvciBDIFN0YW5kYXJkIGhlYWRlcnMgdGhhdCBTVExwb3J0IGV4cG9zZSwgaXQgY2FuIGFsc28gYmUKKyAqIHVzZWQgdG8gY2hlY2sgdGhhdCBmaWxlcyBpbmNsdWRlZCBieSB0aG9zZSBoZWFkZXJzIGFyZSBjb21wYXRpYmxlIHdpdGgKKyAqIHB1cmUgQyBjb21waWxlcnMuCisgKi8KKyNpbmNsdWRlIDxtYXA+CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvbWFwX3Rlc3QuY3BwIGIvdGVzdC91bml0L21hcF90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjI1NmE5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L21hcF90ZXN0LmNwcApAQCAtMCwwICsxLDQ1NCBAQAorLy9IYXMgdG8gYmUgZmlyc3QgZm9yIFN0YWNrQWxsb2NhdG9yIHN3YXAgb3ZlcmxvYWQgdG8gYmUgdGFrZW4KKy8vaW50byBhY2NvdW50IChhdCBsZWFzdCB1c2luZyBHQ0MgNC4wLjEpCisjaW5jbHVkZSAic3RhY2tfYWxsb2NhdG9yLmgiCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSAiY3BwdW5pdC9jcHB1bml0X3Byb3h5LmgiCisKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZChfU1RMUF9VU0VfTkFNRVNQQUNFUykKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisjZW5kaWYKKworLy8KKy8vIFRlc3RDYXNlIGNsYXNzCisvLworY2xhc3MgTWFwVGVzdCA6IHB1YmxpYyBDUFBVTklUX05TOjpUZXN0Q2FzZQoreworICBDUFBVTklUX1RFU1RfU1VJVEUoTWFwVGVzdCk7CisgIENQUFVOSVRfVEVTVChtYXAxKTsKKyAgQ1BQVU5JVF9URVNUKG1tYXAxKTsKKyAgQ1BQVU5JVF9URVNUKG1tYXAyKTsKKyAgQ1BQVU5JVF9URVNUKGl0ZXJhdG9ycyk7CisgIENQUFVOSVRfVEVTVChlcXVhbF9yYW5nZSk7CisgIENQUFVOSVRfVEVTVChhbGxvY2F0b3Jfd2l0aF9zdGF0ZSk7CisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8ICFkZWZpbmVkIChfU1RMUF9VU0VfQ09OVEFJTkVSU19FWFRFTlNJT04pCisgIENQUFVOSVRfSUdOT1JFOworI2VuZGlmCisgIENQUFVOSVRfVEVTVCh0ZW1wbGF0ZV9tZXRob2RzKTsKKyAgQ1BQVU5JVF9URVNUX1NVSVRFX0VORCgpOworCitwcm90ZWN0ZWQ6CisgIHZvaWQgbWFwMSgpOworICB2b2lkIG1tYXAxKCk7CisgIHZvaWQgbW1hcDIoKTsKKyAgdm9pZCBpdGVyYXRvcnMoKTsKKyAgdm9pZCBlcXVhbF9yYW5nZSgpOworICB2b2lkIGFsbG9jYXRvcl93aXRoX3N0YXRlKCk7CisgIHZvaWQgdGVtcGxhdGVfbWV0aG9kcygpOworfTsKKworQ1BQVU5JVF9URVNUX1NVSVRFX1JFR0lTVFJBVElPTihNYXBUZXN0KTsKKworLy8KKy8vIHRlc3RzIGltcGxlbWVudGF0aW9uCisvLwordm9pZCBNYXBUZXN0OjptYXAxKCkKK3sKKyAgdHlwZWRlZiBtYXA8Y2hhciwgaW50LCBsZXNzPGNoYXI+ID4gbWFwdHlwZTsKKyAgbWFwdHlwZSBtOworICAvLyBTdG9yZSBtYXBwaW5ncyBiZXR3ZWVuIHJvbWFuIG51bWVyYWxzIGFuZCBkZWNpbWFscy4KKyAgbVsnbCddID0gNTA7CisgIG1bJ3gnXSA9IDIwOyAvLyBEZWxpYmVyYXRlIG1pc3Rha2UuCisgIG1bJ3YnXSA9IDU7CisgIG1bJ2knXSA9IDE7CisvLyAgY291dCA8PCAibVsneCddID0gIiA8PCBtWyd4J10gPDwgZW5kbDsKKyAgQ1BQVU5JVF9BU1NFUlQoIG1bJ3gnXT09IDIwICk7CisgIG1bJ3gnXSA9IDEwOyAvLyBDb3JyZWN0IG1pc3Rha2UuCisgIENQUFVOSVRfQVNTRVJUKCBtWyd4J109PSAxMCApOworICBDUFBVTklUX0FTU0VSVCggbVsneiddPT0gMCApOworICAvL2NvdXQgPDwgIm1bJ3onXSA9ICIgPDwgbVsneiddIDw8IGVuZGw7IC8vIE5vdGUgZGVmYXVsdCB2YWx1ZSBpcyBhZGRlZC4KKyAgQ1BQVU5JVF9BU1NFUlQoIG0uY291bnQoJ3onKSA9PSAxICk7CisgIC8vY291dCA8PCAibS5jb3VudCgneicpID0gIiA8PCBtLmNvdW50KCd6JykgPDwgZW5kbDsKKyAgcGFpcjxtYXB0eXBlOjppdGVyYXRvciwgYm9vbD4gcCA9IG0uaW5zZXJ0KHBhaXI8Y29uc3QgY2hhciwgaW50PignYycsIDEwMCkpOworICBDUFBVTklUX0FTU0VSVCggcC5zZWNvbmQgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHAuZmlyc3QgIT0gbS5lbmQoKSApOworICBDUFBVTklUX0FTU0VSVCggKCpwLmZpcnN0KS5maXJzdCA9PSAnYycgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoICgqcC5maXJzdCkuc2Vjb25kID09IDEwMCApOworCisgIHAgPSBtLmluc2VydChwYWlyPGNvbnN0IGNoYXIsIGludD4oJ2MnLCAxMDApKTsKKyAgQ1BQVU5JVF9BU1NFUlQoICFwLnNlY29uZCApOyAvLyBhbHJlYWR5IGV4aXN0aW5nIHBhaXIKKyAgQ1BQVU5JVF9BU1NFUlQoIHAuZmlyc3QgIT0gbS5lbmQoKSApOworICBDUFBVTklUX0FTU0VSVCggKCpwLmZpcnN0KS5maXJzdCA9PSAnYycgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoICgqcC5maXJzdCkuc2Vjb25kID09IDEwMCApOworfQorCit2b2lkIE1hcFRlc3Q6Om1tYXAxKCkKK3sKKyAgdHlwZWRlZiBtdWx0aW1hcDxjaGFyLCBpbnQsIGxlc3M8Y2hhcj4gPiBtbWFwOworICBtbWFwIG07CisgIENQUFVOSVRfQVNTRVJUKG0uY291bnQoJ1gnKT09MCk7CisKKyAgbS5pbnNlcnQocGFpcjxjb25zdCBjaGFyLCBpbnQ+KCdYJywgMTApKTsgLy8gU3RhbmRhcmQgd2F5LgorICBDUFBVTklUX0FTU0VSVChtLmNvdW50KCdYJyk9PTEpOworCisgIG0uaW5zZXJ0KHBhaXI8Y29uc3QgY2hhciwgaW50PignWCcsIDIwKSk7IC8vIGpidWNrOiBzdGFuZGFyZCB3YXkKKyAgQ1BQVU5JVF9BU1NFUlQobS5jb3VudCgnWCcpPT0yKTsKKworICBtLmluc2VydChwYWlyPGNvbnN0IGNoYXIsIGludD4oJ1knLCAzMikpOyAvLyBqYnVjazogc3RhbmRhcmQgd2F5CisgIG1tYXA6Oml0ZXJhdG9yIGkgPSBtLmZpbmQoJ1gnKTsgLy8gRmluZCBmaXJzdCBtYXRjaC4KKyNpZm5kZWYgX1NUTFBfQ09OU1QKKyMgIGRlZmluZSBfU1RMUF9DT05TVCBjb25zdAorI2VuZGlmCisgIHBhaXI8X1NUTFBfQ09OU1QgY2hhciwgaW50PiBwKCdYJywgMTApOworICBDUFBVTklUX0FTU0VSVCgqaSA9PSBwKTsKKyAgQ1BQVU5JVF9BU1NFUlQoKCppKS5maXJzdCA9PSAnWCcpOworICBDUFBVTklUX0FTU0VSVCgoKmkpLnNlY29uZCA9PSAxMCk7CisgIGkrKzsKKyAgQ1BQVU5JVF9BU1NFUlQoKCppKS5maXJzdCA9PSAnWCcpOworICBDUFBVTklUX0FTU0VSVCgoKmkpLnNlY29uZCA9PSAyMCk7CisgIGkrKzsKKyAgQ1BQVU5JVF9BU1NFUlQoKCppKS5maXJzdCA9PSAnWScpOworICBDUFBVTklUX0FTU0VSVCgoKmkpLnNlY29uZCA9PSAzMik7CisgIGkrKzsKKyAgQ1BQVU5JVF9BU1NFUlQoaSA9PSBtLmVuZCgpKTsKKworICBzaXplX3QgY291bnQgPSBtLmVyYXNlKCdYJyk7CisgIENQUFVOSVRfQVNTRVJUKGNvdW50PT0yKTsKK30KK3ZvaWQgTWFwVGVzdDo6bW1hcDIoKQoreworICB0eXBlZGVmIHBhaXI8Y29uc3QgaW50LCBjaGFyPiBwYWlyX3R5cGU7CisKKyAgcGFpcl90eXBlIHAxKDMsICdjJyk7CisgIHBhaXJfdHlwZSBwMig2LCAnZicpOworICBwYWlyX3R5cGUgcDMoMSwgJ2EnKTsKKyAgcGFpcl90eXBlIHA0KDIsICdiJyk7CisgIHBhaXJfdHlwZSBwNSgzLCAneCcpOworICBwYWlyX3R5cGUgcDYoNiwgJ2YnKTsKKworICB0eXBlZGVmIG11bHRpbWFwPGludCwgY2hhciwgbGVzczxpbnQ+ID4gbW1hcDsKKworICBwYWlyX3R5cGUgYXJyYXkgW10gPSB7CisgICAgcDEsCisgICAgcDIsCisgICAgcDMsCisgICAgcDQsCisgICAgcDUsCisgICAgcDYKKyAgfTsKKworICBtbWFwIG0oYXJyYXkgKyAwLCBhcnJheSArIDYpOworICBtbWFwOjppdGVyYXRvciBpOworICBpID0gbS5sb3dlcl9ib3VuZCgzKTsKKyAgQ1BQVU5JVF9BU1NFUlQoKCppKS5maXJzdD09Myk7CisgIENQUFVOSVRfQVNTRVJUKCgqaSkuc2Vjb25kPT0nYycpOworCisgIGkgPSBtLnVwcGVyX2JvdW5kKDMpOworICBDUFBVTklUX0FTU0VSVCgoKmkpLmZpcnN0PT02KTsKKyAgQ1BQVU5JVF9BU1NFUlQoKCppKS5zZWNvbmQ9PSdmJyk7Cit9CisKKwordm9pZCBNYXBUZXN0OjppdGVyYXRvcnMoKQoreworICB0eXBlZGVmIG1hcDxpbnQsIGNoYXIsIGxlc3M8aW50PiA+IGludF9tYXA7CisgIGludF9tYXAgaW1hcDsKKyAgeworICAgIGludF9tYXA6Oml0ZXJhdG9yIGl0ZShpbWFwLmJlZ2luKCkpOworICAgIGludF9tYXA6OmNvbnN0X2l0ZXJhdG9yIGNpdGUoaW1hcC5iZWdpbigpKTsKKyAgICBDUFBVTklUX0FTU0VSVCggaXRlID09IGNpdGUgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggIShpdGUgIT0gY2l0ZSkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggY2l0ZSA9PSBpdGUgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggIShjaXRlICE9IGl0ZSkgKTsKKyAgfQorCisgIHR5cGVkZWYgbXVsdGltYXA8aW50LCBjaGFyLCBsZXNzPGludD4gPiBtbWFwOworICB0eXBlZGVmIG1tYXA6OnZhbHVlX3R5cGUgcGFpcl90eXBlOworCisgIHBhaXJfdHlwZSBwMSgzLCAnYycpOworICBwYWlyX3R5cGUgcDIoNiwgJ2YnKTsKKyAgcGFpcl90eXBlIHAzKDEsICdhJyk7CisgIHBhaXJfdHlwZSBwNCgyLCAnYicpOworICBwYWlyX3R5cGUgcDUoMywgJ3gnKTsKKyAgcGFpcl90eXBlIHA2KDYsICdmJyk7CisKKyAgcGFpcl90eXBlIGFycmF5IFtdID0geworICAgIHAxLAorICAgIHAyLAorICAgIHAzLAorICAgIHA0LAorICAgIHA1LAorICAgIHA2CisgIH07CisKKyAgbW1hcCBtKGFycmF5KzAsIGFycmF5ICsgNik7CisKKyAgeworICAgIG1tYXA6Oml0ZXJhdG9yIGl0ZShtLmJlZ2luKCkpOworICAgIG1tYXA6OmNvbnN0X2l0ZXJhdG9yIGNpdGUobS5iZWdpbigpKTsKKyAgICAvL3Rlc3QgY29tcGFyZSBiZXR3ZWVuIGNvbnN0X2l0ZXJhdG9yIGFuZCBpdGVyYXRvcgorICAgIENQUFVOSVRfQVNTRVJUKCBpdGUgPT0gY2l0ZSApOworICAgIENQUFVOSVRfQVNTRVJUKCAhKGl0ZSAhPSBjaXRlKSApOworICAgIENQUFVOSVRfQVNTRVJUKCBjaXRlID09IGl0ZSApOworICAgIENQUFVOSVRfQVNTRVJUKCAhKGNpdGUgIT0gaXRlKSApOworICB9CisKKyNpZiAwCisgIC8qCisgICAqIEEgY2hlY2sgdGhhdCBtYXAgYW5kIG11bHRpbWFwIGl0ZXJhdG9ycyBhcmUgTk9UIGNvbXBhcmFibGUKKyAgICogdGhlIGZvbGxvd2luZyBjb2RlIHNob3VsZCBnZW5lcmF0ZSBhIGNvbXBpbGUgdGltZSBlcnJvcgorICAgKi8KKyAgeworICAgIGludF9tYXA6Oml0ZXJhdG9yIG1pdGUoaW1hcC5iZWdpbigpKTsKKyAgICBpbnRfbWFwOjpjb25zdF9pdGVyYXRvciBtY2l0ZShpbWFwLmJlZ2luKCkpOworICAgIG1tYXA6Oml0ZXJhdG9yIG1taXRlKG0uYmVnaW4oKSk7CisgICAgbW1hcDo6Y29uc3RfaXRlcmF0b3IgbW1jaXRlKG0uYmVnaW4oKSk7CisgICAgQ1BQVU5JVF9BU1NFUlQoICEobWl0ZSA9PSBtbWl0ZSkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggIShtY2l0ZSA9PSBtbWNpdGUpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIG1pdGUgIT0gbW1pdGUgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggbWNpdGUgIT0gbW1jaXRlICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoICEobWl0ZSA9PSBtbWNpdGUpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoICEobWl0ZSA9PSBtbWNpdGUpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIG1pdGUgIT0gbW1jaXRlICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIG1pdGUgIT0gbW1jaXRlICk7CisgIH0KKworI2VuZGlmCisKKyAgbW1hcDo6cmV2ZXJzZV9pdGVyYXRvciByaSA9IG0ucmJlZ2luKCk7CisgIENQUFVOSVRfQVNTRVJUKCByaSAhPSBtLnJlbmQoKSApOworICBDUFBVTklUX0FTU0VSVCggcmkgPT0gbS5yYmVnaW4oKSApOworICBDUFBVTklUX0FTU0VSVCggKCpyaSkuZmlyc3QgPT0gNiApOworICBDUFBVTklUX0FTU0VSVCggKCpyaSsrKS5zZWNvbmQgPT0gJ2YnICk7CisgIENQUFVOSVRfQVNTRVJUKCAoKnJpKS5maXJzdCA9PSA2ICk7CisgIENQUFVOSVRfQVNTRVJUKCAoKnJpKS5zZWNvbmQgPT0gJ2YnICk7CisKKyAgbW1hcCBjb25zdCYgY20gPSBtOworICBtbWFwOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJjaSA9IGNtLnJiZWdpbigpOworICBDUFBVTklUX0FTU0VSVCggcmNpICE9IGNtLnJlbmQoKSApOworICBDUFBVTklUX0FTU0VSVCggKCpyY2kpLmZpcnN0ID09IDYgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoICgqcmNpKyspLnNlY29uZCA9PSAnZicgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoICgqcmNpKS5maXJzdCA9PSA2ICk7CisgIENQUFVOSVRfQVNTRVJUKCAoKnJjaSkuc2Vjb25kID09ICdmJyApOworfQorCit2b2lkIE1hcFRlc3Q6OmVxdWFsX3JhbmdlKCkKK3sKKyAgdHlwZWRlZiBtYXA8Y2hhciwgaW50LCBsZXNzPGNoYXI+ID4gbWFwdHlwZTsKKyAgeworICAgIG1hcHR5cGUgbTsKKyAgICBtWyd4J10gPSAxMDsKKworICAgIHBhaXI8bWFwdHlwZTo6aXRlcmF0b3IsIG1hcHR5cGU6Oml0ZXJhdG9yPiByZXQ7CisgICAgcmV0ID0gbS5lcXVhbF9yYW5nZSgneCcpOworICAgIENQUFVOSVRfQVNTRVJUKCByZXQuZmlyc3QgIT0gcmV0LnNlY29uZCApOworICAgIENQUFVOSVRfQVNTRVJUKCAoKihyZXQuZmlyc3QpKS5maXJzdCA9PSAneCcgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggKCoocmV0LmZpcnN0KSkuc2Vjb25kID09IDEwICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoICsrKHJldC5maXJzdCkgPT0gcmV0LnNlY29uZCApOworICB9CisgIHsKKyAgICB7CisgICAgICBtYXB0eXBlIG07CisKKyAgICAgIG1hcHR5cGU6Oml0ZXJhdG9yIGkgPSBtLmxvd2VyX2JvdW5kKCAneCcgKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBpID09IG0uZW5kKCkgKTsKKworICAgICAgaSA9IG0udXBwZXJfYm91bmQoICd4JyApOworICAgICAgQ1BQVU5JVF9BU1NFUlQoIGkgPT0gbS5lbmQoKSApOworCisgICAgICBwYWlyPG1hcHR5cGU6Oml0ZXJhdG9yLCBtYXB0eXBlOjppdGVyYXRvcj4gcmV0OworICAgICAgcmV0ID0gbS5lcXVhbF9yYW5nZSgneCcpOworICAgICAgQ1BQVU5JVF9BU1NFUlQoIHJldC5maXJzdCA9PSByZXQuc2Vjb25kICk7CisgICAgICBDUFBVTklUX0FTU0VSVCggcmV0LmZpcnN0ID09IG0uZW5kKCkgKTsKKyAgICB9CisKKyAgICB7CisgICAgICBjb25zdCBtYXB0eXBlIG07CisgICAgICBwYWlyPG1hcHR5cGU6OmNvbnN0X2l0ZXJhdG9yLCBtYXB0eXBlOjpjb25zdF9pdGVyYXRvcj4gcmV0OworICAgICAgcmV0ID0gbS5lcXVhbF9yYW5nZSgneCcpOworICAgICAgQ1BQVU5JVF9BU1NFUlQoIHJldC5maXJzdCA9PSByZXQuc2Vjb25kICk7CisgICAgICBDUFBVTklUX0FTU0VSVCggcmV0LmZpcnN0ID09IG0uZW5kKCkgKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBNYXBUZXN0OjphbGxvY2F0b3Jfd2l0aF9zdGF0ZSgpCit7CisgIGNoYXIgYnVmMVsxMDI0XTsKKyAgU3RhY2tBbGxvY2F0b3I8cGFpcjxjb25zdCBpbnQsIGludD4gPiBzdGFjazEoYnVmMSwgYnVmMSArIHNpemVvZihidWYxKSk7CisKKyAgY2hhciBidWYyWzEwMjRdOworICBTdGFja0FsbG9jYXRvcjxwYWlyPGNvbnN0IGludCwgaW50PiA+IHN0YWNrMihidWYyLCBidWYyICsgc2l6ZW9mKGJ1ZjIpKTsKKworICB7CisgICAgdHlwZWRlZiBtYXA8aW50LCBpbnQsIGxlc3M8aW50PiwgU3RhY2tBbGxvY2F0b3I8cGFpcjxjb25zdCBpbnQsIGludD4gPiA+IE1hcEludDsKKyAgICBsZXNzPGludD4gaW50TGVzczsKKyAgICBNYXBJbnQgbWludDEoaW50TGVzcywgc3RhY2sxKTsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNTsgKytpKQorICAgICAgbWludDEuaW5zZXJ0KE1hcEludDo6dmFsdWVfdHlwZShpLCBpKSk7CisgICAgTWFwSW50IG1pbnQxQ3B5KG1pbnQxKTsKKworICAgIE1hcEludCBtaW50MihpbnRMZXNzLCBzdGFjazIpOworICAgIGZvciAoOyBpIDwgMTA7ICsraSkKKyAgICAgIG1pbnQyLmluc2VydChNYXBJbnQ6OnZhbHVlX3R5cGUoaSwgaSkpOworICAgIE1hcEludCBtaW50MkNweShtaW50Mik7CisKKyAgICBtaW50MS5zd2FwKG1pbnQyKTsKKworICAgIENQUFVOSVRfQVNTRVJUKCBtaW50MS5nZXRfYWxsb2NhdG9yKCkuc3dhcGVkKCkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggbWludDIuZ2V0X2FsbG9jYXRvcigpLnN3YXBlZCgpICk7CisKKyAgICBDUFBVTklUX0FTU0VSVCggbWludDEgPT0gbWludDJDcHkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggbWludDIgPT0gbWludDFDcHkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggbWludDEuZ2V0X2FsbG9jYXRvcigpID09IHN0YWNrMiApOworICAgIENQUFVOSVRfQVNTRVJUKCBtaW50Mi5nZXRfYWxsb2NhdG9yKCkgPT0gc3RhY2sxICk7CisgIH0KKyAgQ1BQVU5JVF9BU1NFUlQoIHN0YWNrMS5vaygpICk7CisgIENQUFVOSVRfQVNTRVJUKCBzdGFjazIub2soKSApOworfQorCitzdHJ1Y3QgS2V5Cit7CisgIEtleSgpIDogbV9kYXRhKDApIHt9CisgIGV4cGxpY2l0IEtleShpbnQgZGF0YSkgOiBtX2RhdGEoZGF0YSkge30KKworICBpbnQgbV9kYXRhOworfTsKKworc3RydWN0IEtleUNtcAoreworICBib29sIG9wZXJhdG9yICgpIChLZXkgbGhzLCBLZXkgcmhzKSBjb25zdAorICB7IHJldHVybiBsaHMubV9kYXRhIDwgcmhzLm1fZGF0YTsgfQorCisgIGJvb2wgb3BlcmF0b3IgKCkgKEtleSBsaHMsIGludCByaHMpIGNvbnN0CisgIHsgcmV0dXJuIGxocy5tX2RhdGEgPCByaHM7IH0KKworICBib29sIG9wZXJhdG9yICgpIChpbnQgbGhzLCBLZXkgcmhzKSBjb25zdAorICB7IHJldHVybiBsaHMgPCByaHMubV9kYXRhOyB9Cit9OworCitzdHJ1Y3QgS2V5Q21wUHRyCit7CisgIGJvb2wgb3BlcmF0b3IgKCkgKEtleSBjb25zdCB2b2xhdGlsZSAqbGhzLCBLZXkgY29uc3Qgdm9sYXRpbGUgKnJocykgY29uc3QKKyAgeyByZXR1cm4gKCpsaHMpLm1fZGF0YSA8ICgqcmhzKS5tX2RhdGE7IH0KKworICBib29sIG9wZXJhdG9yICgpIChLZXkgY29uc3Qgdm9sYXRpbGUgKmxocywgaW50IHJocykgY29uc3QKKyAgeyByZXR1cm4gKCpsaHMpLm1fZGF0YSA8IHJoczsgfQorCisgIGJvb2wgb3BlcmF0b3IgKCkgKGludCBsaHMsIEtleSBjb25zdCB2b2xhdGlsZSAqcmhzKSBjb25zdAorICB7IHJldHVybiBsaHMgPCAoKnJocykubV9kYXRhOyB9Cit9OworCit2b2lkIE1hcFRlc3Q6OnRlbXBsYXRlX21ldGhvZHMoKQoreworI2lmIGRlZmluZWQgKFNUTFBPUlQpICYmIGRlZmluZWQgKF9TVExQX1VTRV9DT05UQUlORVJTX0VYVEVOU0lPTikKKyAgeworICAgIHR5cGVkZWYgbWFwPEtleSwgaW50LCBLZXlDbXA+IENvbnRhaW5lcjsKKyAgICB0eXBlZGVmIENvbnRhaW5lcjo6dmFsdWVfdHlwZSB2YWx1ZTsKKyAgICBDb250YWluZXIgY29udDsKKyAgICBjb250Lmluc2VydCh2YWx1ZShLZXkoMSksIDEpKTsKKyAgICBjb250Lmluc2VydCh2YWx1ZShLZXkoMiksIDIpKTsKKyAgICBjb250Lmluc2VydCh2YWx1ZShLZXkoMyksIDMpKTsKKyAgICBjb250Lmluc2VydCh2YWx1ZShLZXkoNCksIDQpKTsKKworICAgIENQUFVOSVRfQVNTRVJUKCBjb250LmNvdW50KEtleSgxKSkgPT0gMSApOworICAgIENQUFVOSVRfQVNTRVJUKCBjb250LmNvdW50KDEpID09IDEgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggY29udC5jb3VudCg1KSA9PSAwICk7CisKKyAgICBDUFBVTklUX0FTU0VSVCggY29udC5maW5kKDIpICE9IGNvbnQuZW5kKCkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggY29udC5sb3dlcl9ib3VuZCgyKSAhPSBjb250LmVuZCgpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGNvbnQudXBwZXJfYm91bmQoMikgIT0gY29udC5lbmQoKSApOworICAgIENQUFVOSVRfQVNTRVJUKCBjb250LmVxdWFsX3JhbmdlKDIpICE9IG1ha2VfcGFpcihjb250LmJlZ2luKCksIGNvbnQuZW5kKCkpICk7CisKKyAgICBDb250YWluZXIgY29uc3QmIGNjb250ID0gY29udDsKKyAgICBDUFBVTklUX0FTU0VSVCggY2NvbnQuZmluZCgyKSAhPSBjY29udC5lbmQoKSApOworICAgIENQUFVOSVRfQVNTRVJUKCBjY29udC5sb3dlcl9ib3VuZCgyKSAhPSBjY29udC5lbmQoKSApOworICAgIENQUFVOSVRfQVNTRVJUKCBjY29udC51cHBlcl9ib3VuZCgyKSAhPSBjY29udC5lbmQoKSApOworICAgIENQUFVOSVRfQVNTRVJUKCBjY29udC5lcXVhbF9yYW5nZSgyKSAhPSBtYWtlX3BhaXIoY2NvbnQuZW5kKCksIGNjb250LmVuZCgpKSApOworICB9CisKKyAgeworICAgIHR5cGVkZWYgbWFwPEtleSosIGludCwgS2V5Q21wUHRyPiBDb250YWluZXI7CisgICAgdHlwZWRlZiBDb250YWluZXI6OnZhbHVlX3R5cGUgdmFsdWU7CisgICAgQ29udGFpbmVyIGNvbnQ7CisgICAgS2V5IGtleTEoMSksIGtleTIoMiksIGtleTMoMyksIGtleTQoNCk7CisgICAgY29udC5pbnNlcnQodmFsdWUoJmtleTEsIDEpKTsKKyAgICBjb250Lmluc2VydCh2YWx1ZSgma2V5MiwgMikpOworICAgIGNvbnQuaW5zZXJ0KHZhbHVlKCZrZXkzLCAzKSk7CisgICAgY29udC5pbnNlcnQodmFsdWUoJmtleTQsIDQpKTsKKworICAgIENQUFVOSVRfQVNTRVJUKCBjb250LmNvdW50KDEpID09IDEgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggY29udC5jb3VudCg1KSA9PSAwICk7CisKKyAgICBDUFBVTklUX0FTU0VSVCggY29udC5maW5kKDIpICE9IGNvbnQuZW5kKCkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggY29udC5sb3dlcl9ib3VuZCgyKSAhPSBjb250LmVuZCgpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGNvbnQudXBwZXJfYm91bmQoMikgIT0gY29udC5lbmQoKSApOworICAgIENQUFVOSVRfQVNTRVJUKCBjb250LmVxdWFsX3JhbmdlKDIpICE9IG1ha2VfcGFpcihjb250LmJlZ2luKCksIGNvbnQuZW5kKCkpICk7CisKKyAgICBDb250YWluZXIgY29uc3QmIGNjb250ID0gY29udDsKKyAgICBDUFBVTklUX0FTU0VSVCggY2NvbnQuZmluZCgyKSAhPSBjY29udC5lbmQoKSApOworICAgIENQUFVOSVRfQVNTRVJUKCBjY29udC5sb3dlcl9ib3VuZCgyKSAhPSBjY29udC5lbmQoKSApOworICAgIENQUFVOSVRfQVNTRVJUKCBjY29udC51cHBlcl9ib3VuZCgyKSAhPSBjY29udC5lbmQoKSApOworICAgIENQUFVOSVRfQVNTRVJUKCBjY29udC5lcXVhbF9yYW5nZSgyKSAhPSBtYWtlX3BhaXIoY2NvbnQuYmVnaW4oKSwgY2NvbnQuZW5kKCkpICk7CisgIH0KKyAgeworICAgIHR5cGVkZWYgbXVsdGltYXA8S2V5LCBpbnQsIEtleUNtcD4gQ29udGFpbmVyOworICAgIHR5cGVkZWYgQ29udGFpbmVyOjp2YWx1ZV90eXBlIHZhbHVlOworICAgIENvbnRhaW5lciBjb250OworICAgIGNvbnQuaW5zZXJ0KHZhbHVlKEtleSgxKSwgMSkpOworICAgIGNvbnQuaW5zZXJ0KHZhbHVlKEtleSgyKSwgMikpOworICAgIGNvbnQuaW5zZXJ0KHZhbHVlKEtleSgzKSwgMykpOworICAgIGNvbnQuaW5zZXJ0KHZhbHVlKEtleSg0KSwgNCkpOworCisgICAgQ1BQVU5JVF9BU1NFUlQoIGNvbnQuY291bnQoS2V5KDEpKSA9PSAxICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGNvbnQuY291bnQoMSkgPT0gMSApOworICAgIENQUFVOSVRfQVNTRVJUKCBjb250LmNvdW50KDUpID09IDAgKTsKKworICAgIENQUFVOSVRfQVNTRVJUKCBjb250LmZpbmQoMikgIT0gY29udC5lbmQoKSApOworICAgIENQUFVOSVRfQVNTRVJUKCBjb250Lmxvd2VyX2JvdW5kKDIpICE9IGNvbnQuZW5kKCkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggY29udC51cHBlcl9ib3VuZCgyKSAhPSBjb250LmVuZCgpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGNvbnQuZXF1YWxfcmFuZ2UoMikgIT0gbWFrZV9wYWlyKGNvbnQuYmVnaW4oKSwgY29udC5lbmQoKSkgKTsKKworICAgIENvbnRhaW5lciBjb25zdCYgY2NvbnQgPSBjb250OworICAgIENQUFVOSVRfQVNTRVJUKCBjY29udC5maW5kKDIpICE9IGNjb250LmVuZCgpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGNjb250Lmxvd2VyX2JvdW5kKDIpICE9IGNjb250LmVuZCgpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGNjb250LnVwcGVyX2JvdW5kKDIpICE9IGNjb250LmVuZCgpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGNjb250LmVxdWFsX3JhbmdlKDIpICE9IG1ha2VfcGFpcihjY29udC5lbmQoKSwgY2NvbnQuZW5kKCkpICk7CisgIH0KKworICB7CisgICAgdHlwZWRlZiBtdWx0aW1hcDxLZXkgY29uc3Qgdm9sYXRpbGUqLCBpbnQsIEtleUNtcFB0cj4gQ29udGFpbmVyOworICAgIHR5cGVkZWYgQ29udGFpbmVyOjp2YWx1ZV90eXBlIHZhbHVlOworICAgIENvbnRhaW5lciBjb250OworICAgIEtleSBrZXkxKDEpLCBrZXkyKDIpLCBrZXkzKDMpLCBrZXk0KDQpOworICAgIGNvbnQuaW5zZXJ0KHZhbHVlKCZrZXkxLCAxKSk7CisgICAgY29udC5pbnNlcnQodmFsdWUoJmtleTIsIDIpKTsKKyAgICBjb250Lmluc2VydCh2YWx1ZSgma2V5MywgMykpOworICAgIGNvbnQuaW5zZXJ0KHZhbHVlKCZrZXk0LCA0KSk7CisKKyAgICBDUFBVTklUX0FTU0VSVCggY29udC5jb3VudCgxKSA9PSAxICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGNvbnQuY291bnQoNSkgPT0gMCApOworCisgICAgQ1BQVU5JVF9BU1NFUlQoIGNvbnQuZmluZCgyKSAhPSBjb250LmVuZCgpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGNvbnQubG93ZXJfYm91bmQoMikgIT0gY29udC5lbmQoKSApOworICAgIENQUFVOSVRfQVNTRVJUKCBjb250LnVwcGVyX2JvdW5kKDIpICE9IGNvbnQuZW5kKCkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggY29udC5lcXVhbF9yYW5nZSgyKSAhPSBtYWtlX3BhaXIoY29udC5iZWdpbigpLCBjb250LmVuZCgpKSApOworCisgICAgQ29udGFpbmVyIGNvbnN0JiBjY29udCA9IGNvbnQ7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGNjb250LmZpbmQoMikgIT0gY2NvbnQuZW5kKCkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggY2NvbnQubG93ZXJfYm91bmQoMikgIT0gY2NvbnQuZW5kKCkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggY2NvbnQudXBwZXJfYm91bmQoMikgIT0gY2NvbnQuZW5kKCkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggY2NvbnQuZXF1YWxfcmFuZ2UoMikgIT0gbWFrZV9wYWlyKGNjb250LmJlZ2luKCksIGNjb250LmVuZCgpKSApOworICB9CisjZW5kaWYKK30KKworI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCBcCisgICAgIWRlZmluZWQgKF9TVExQX1VTRV9QVFJfU1BFQ0lBTElaQVRJT05TKSB8fCBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQorIyAgaWYgIWRlZmluZWQgKF9fRE1DX18pCisvKiBTaW1wbGUgY29tcGlsYXRpb24gdGVzdDogQ2hlY2sgdGhhdCBuZXN0ZWQgdHlwZXMgbGlrZSBpdGVyYXRvcgorICogY2FuIGJlIGFjY2VzcyBldmVuIGlmIHR5cGUgdXNlZCB0byBpbnN0YW5jaWF0ZSBjb250YWluZXIgaXMgbm90CisgKiB5ZXQgY29tcGxldGVseSBkZWZpbmVkLgorICovCitjbGFzcyBJbmNvbXBsZXRlQ2xhc3MKK3sKKyAgbWFwPEluY29tcGxldGVDbGFzcywgSW5jb21wbGV0ZUNsYXNzPiBpbnN0YW5jZXM7CisgIHR5cGVkZWYgbWFwPEluY29tcGxldGVDbGFzcywgSW5jb21wbGV0ZUNsYXNzPjo6aXRlcmF0b3IgaXQ7CisgIG11bHRpbWFwPEluY29tcGxldGVDbGFzcywgSW5jb21wbGV0ZUNsYXNzPiBtaW5zdGFuY2VzOworICB0eXBlZGVmIG11bHRpbWFwPEluY29tcGxldGVDbGFzcywgSW5jb21wbGV0ZUNsYXNzPjo6aXRlcmF0b3IgbWl0OworfTsKKyMgIGVuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9tYXRoX2F1eC5oIGIvdGVzdC91bml0L21hdGhfYXV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzEyOTFhZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9tYXRoX2F1eC5oCkBAIC0wLDAgKzEsMzAgQEAKKyNpZm5kZWYgX19NQVRIX0FVWF9ICisjZGVmaW5lIF9fTUFUSF9BVVhfSAorCisjaW5jbHVkZSA8bGltaXRzPgorCisjdW5kZWYgX19TVEQKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZCAoX1NUTFBfVVNFX05BTUVTUEFDRVMpCisjICBkZWZpbmUgX19TVEQgc3RkOjoKKyNlbHNlCisjICBkZWZpbmUgX19TVEQKKyNlbmRpZgorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBub3Qgb25seSB1c2VkIHRvIGNvbXBhcmUgZmxvYXRpbmcgcG9pbnQgdmFsdWVzIHdpdGggYSB0b2xlcmFuY2UsCisgKiBpdCBhbHNvIGxlYWRzIHRvIGFtYmlndWl0eSBwcm9ibGVtcyBpZiB0aGUgY2FsbGVkIGZ1bmN0aW9ucyBkbyBub3QgaGF2ZSB0aGUKKyAqIHJpZ2h0IHByb3RvdHlwZS4KKyAqLwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2Jvb2wgYXJlX2VxdWFscyhfVHAgdmFsLCBfVHAgcmVmKSB7CisgIGlmICh2YWwgPCByZWYpIHsKKyAgICByZXR1cm4gKHJlZiAtIHZhbCkgPD0gX19TVEQgbnVtZXJpY19saW1pdHM8X1RwPjo6ZXBzaWxvbigpOworICB9CisgIGVsc2UgeworICAgIHJldHVybiAodmFsIC0gcmVmKSA8PSBfX1NURCBudW1lcmljX2xpbWl0czxfVHA+OjplcHNpbG9uKCk7CisgIH0KK30KKworI3VuZGVmIF9fU1RECisKKyNlbmRpZiAvLyBfX01BVEhfQVVYX0gKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9tYXRoX2hlYWRlcl90ZXN0LmMgYi90ZXN0L3VuaXQvbWF0aF9oZWFkZXJfdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NTc0OTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvbWF0aF9oZWFkZXJfdGVzdC5jCkBAIC0wLDAgKzEsOCBAQAorLyogVGhpcyB0ZXN0IHB1cnBvc2UgaXMgc2ltcGx5IHRvIGNoZWNrIFN0YW5kYXJkIGhlYWRlciBpbmRlcGVuZGFuY3kgdGhhdAorICogaXMgdG8gc2F5IHRoYXQgdGhlIGhlYWRlciBjYW4gYmUgaW5jbHVkZWQgYWxvbmUgd2l0aG91dCBhbnkgcHJldmlvdXMKKyAqIGluY2x1ZGUuCisgKiBBZGRpdGlvbm5hbHksIGZvciBDIFN0YW5kYXJkIGhlYWRlcnMgdGhhdCBTVExwb3J0IGV4cG9zZSwgaXQgY2FuIGFsc28gYmUKKyAqIHVzZWQgdG8gY2hlY2sgdGhhdCBmaWxlcyBpbmNsdWRlZCBieSB0aG9zZSBoZWFkZXJzIGFyZSBjb21wYXRpYmxlIHdpdGgKKyAqIHB1cmUgQyBjb21waWxlcnMuCisgKi8KKyNpbmNsdWRlIDxtYXRoLmg+CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvbWF4X3Rlc3QuY3BwIGIvdGVzdC91bml0L21heF90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGFiMDA2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L21heF90ZXN0LmNwcApAQCAtMCwwICsxLDY0IEBACisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgImNwcHVuaXQvY3BwdW5pdF9wcm94eS5oIgorCisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IGRlZmluZWQoX1NUTFBfVVNFX05BTUVTUEFDRVMpCit1c2luZyBuYW1lc3BhY2Ugc3RkOworI2VuZGlmCisKKy8vCisvLyBUZXN0Q2FzZSBjbGFzcworLy8KK2NsYXNzIE1heFRlc3QgOiBwdWJsaWMgQ1BQVU5JVF9OUzo6VGVzdENhc2UKK3sKKyAgQ1BQVU5JVF9URVNUX1NVSVRFKE1heFRlc3QpOworICBDUFBVTklUX1RFU1QobWF4MSk7CisgIENQUFVOSVRfVEVTVChtYXgyKTsKKyAgQ1BQVU5JVF9URVNUKG1heGVsZW0xKTsKKyAgQ1BQVU5JVF9URVNUKG1heGVsZW0yKTsKKyAgQ1BQVU5JVF9URVNUX1NVSVRFX0VORCgpOworCitwcm90ZWN0ZWQ6CisgIHZvaWQgbWF4MSgpOworICB2b2lkIG1heDIoKTsKKyAgdm9pZCBtYXhlbGVtMSgpOworICB2b2lkIG1heGVsZW0yKCk7CisKKyAgc3RhdGljIGJvb2wgc3RyX2NvbXBhcmUoY29uc3QgY2hhciogYV8sIGNvbnN0IGNoYXIqIGJfKQorICB7IHJldHVybiBzdHJjbXAoYV8sIGJfKSA8IDAgPyAxIDogMDsgfQorfTsKKworQ1BQVU5JVF9URVNUX1NVSVRFX1JFR0lTVFJBVElPTihNYXhUZXN0KTsKKworLy8KKy8vIHRlc3RzIGltcGxlbWVudGF0aW9uCisvLwordm9pZCBNYXhUZXN0OjptYXgxKCkKK3sKKyAgaW50IHIgPSBtYXgoNDIsIDEwMCk7CisgIENQUFVOSVRfQVNTRVJUKCByID09IDEwMCApOworCisgIGludCB0ID0gbWF4KCsrciwgMCk7CisgIENQUFVOSVRfQVNTRVJUKCB0ID09IDEwMSApOworfQordm9pZCBNYXhUZXN0OjptYXgyKCkKK3sKKyAgY29uc3QgY2hhciogciA9IG1heCgoY29uc3QgY2hhciopInNob2UiLCAoY29uc3QgY2hhciopInNoaW5lIiwgc3RyX2NvbXBhcmUpOworICBDUFBVTklUX0FTU0VSVCghc3RyY21wKHIsICJzaG9lIikpOworfQordm9pZCBNYXhUZXN0OjptYXhlbGVtMSgpCit7CisgIGludCBudW1iZXJzWzZdID0geyA0LCAxMCwgNTYsIDExLCAtNDIsIDE5IH07CisKKyAgaW50KiByID0gbWF4X2VsZW1lbnQoKGludCopbnVtYmVycywgKGludCopbnVtYmVycyArIDYpOworICBDUFBVTklUX0FTU0VSVCgqcj09NTYpOworfQordm9pZCBNYXhUZXN0OjptYXhlbGVtMigpCit7CisgIGNvbnN0IGNoYXIqIG5hbWVzW10gPSB7ICJCcmV0dCIsICJHcmFoYW0iLCAiSmFjayIsICJNaWtlIiwgIlRvZGQiIH07CisKKyAgY29uc3QgdW5zaWduZWQgbmFtZXNDdCA9IHNpemVvZihuYW1lcykgLyBzaXplb2YobmFtZXNbMF0pOworICBjb25zdCBjaGFyKiogciA9IG1heF9lbGVtZW50KChjb25zdCBjaGFyKiopbmFtZXMsIChjb25zdCBjaGFyKiopbmFtZXMgKyBuYW1lc0N0LCBzdHJfY29tcGFyZSk7CisgIENQUFVOSVRfQVNTRVJUKCFzdHJjbXAoKnIsICJUb2RkIikpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L21lbW9yeV9oZWFkZXJfdGVzdC5jcHAgYi90ZXN0L3VuaXQvbWVtb3J5X2hlYWRlcl90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmQ5ZjA1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L21lbW9yeV9oZWFkZXJfdGVzdC5jcHAKQEAgLTAsMCArMSw4IEBACisvKiBUaGlzIHRlc3QgcHVycG9zZSBpcyBzaW1wbHkgdG8gY2hlY2sgU3RhbmRhcmQgaGVhZGVyIGluZGVwZW5kYW5jeSB0aGF0CisgKiBpcyB0byBzYXkgdGhhdCB0aGUgaGVhZGVyIGNhbiBiZSBpbmNsdWRlZCBhbG9uZSB3aXRob3V0IGFueSBwcmV2aW91cworICogaW5jbHVkZS4KKyAqIEFkZGl0aW9ubmFseSwgZm9yIEMgU3RhbmRhcmQgaGVhZGVycyB0aGF0IFNUTHBvcnQgZXhwb3NlLCBpdCBjYW4gYWxzbyBiZQorICogdXNlZCB0byBjaGVjayB0aGF0IGZpbGVzIGluY2x1ZGVkIGJ5IHRob3NlIGhlYWRlcnMgYXJlIGNvbXBhdGlibGUgd2l0aAorICogcHVyZSBDIGNvbXBpbGVycy4KKyAqLworI2luY2x1ZGUgPG1lbW9yeT4KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9tZW1vcnlfdGVzdC5jcHAgYi90ZXN0L3VuaXQvbWVtb3J5X3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMTcxMDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvbWVtb3J5X3Rlc3QuY3BwCkBAIC0wLDAgKzEsNjcgQEAKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlICJjcHB1bml0L2NwcHVuaXRfcHJveHkuaCIKKworI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkKF9TVExQX1VTRV9OQU1FU1BBQ0VTKQordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyNlbmRpZgorCisvLworLy8gVGVzdENhc2UgY2xhc3MKKy8vCitjbGFzcyBNZW1vcnlUZXN0IDogcHVibGljIENQUFVOSVRfTlM6OlRlc3RDYXNlCit7CisgIENQUFVOSVRfVEVTVF9TVUlURShNZW1vcnlUZXN0KTsKKyNpZiBkZWZpbmVkIChfU1RMUF9NU1ZDKSAmJiAoX1NUTFBfTVNWQyA8IDEzMTApCisgIENQUFVOSVRfSUdOT1JFOworI2VuZGlmCisgIENQUFVOSVRfVEVTVChhdXRvX3B0cl90ZXN0KTsKKyAgQ1BQVU5JVF9URVNUX1NVSVRFX0VORCgpOworCitwcm90ZWN0ZWQ6CisgIHZvaWQgYXV0b19wdHJfdGVzdCgpOworfTsKKworQ1BQVU5JVF9URVNUX1NVSVRFX1JFR0lTVFJBVElPTihNZW1vcnlUZXN0KTsKKworI2lmICFkZWZpbmVkIChfU1RMUF9NU1ZDKSB8fCAoX1NUTFBfTVNWQyA+PSAxMzEwKQorYXV0b19wdHI8aW50PiBDcmVhdGVBdXRvUHRyKGludCB2YWwpCit7IHJldHVybiBhdXRvX3B0cjxpbnQ+KG5ldyBpbnQodmFsKSk7IH0KKworYm9vbCBDaGVja0VxdWFsaXR5KGF1dG9fcHRyPGludD4gcGludCwgaW50IHZhbCkKK3sgcmV0dXJuICpwaW50ID09IHZhbDsgfQorI2VuZGlmCisKKy8vCisvLyB0ZXN0cyBpbXBsZW1lbnRhdGlvbgorLy8KK3ZvaWQgTWVtb3J5VGVzdDo6YXV0b19wdHJfdGVzdCgpCit7CisjaWYgIWRlZmluZWQgKF9TVExQX01TVkMpIHx8IChfU1RMUF9NU1ZDID49IDEzMTApCisgIHsKKyAgICBhdXRvX3B0cjxpbnQ+IHBpbnQobmV3IGludCgxKSk7CisgICAgQ1BQVU5JVF9BU1NFUlQoICpwaW50ID09IDEgKTsKKyAgICAqcGludCA9IDI7CisgICAgQ1BQVU5JVF9BU1NFUlQoICpwaW50ID09IDIgKTsKKyAgfQorCisgIHsKKyAgICBhdXRvX3B0cjxpbnQ+IHBpbnQoQ3JlYXRlQXV0b1B0cigzKSk7CisgICAgQ1BQVU5JVF9BU1NFUlQoICpwaW50ID09IDMgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggQ2hlY2tFcXVhbGl0eShwaW50LCAzKSApOworICB9CisKKyAgeworICAgIGF1dG9fcHRyPGNvbnN0IGludD4gcGludChuZXcgaW50KDIpKTsKKyAgICBDUFBVTklUX0FTU0VSVCggKnBpbnQgPT0gMiApOworICB9CisgIHsKKyAgICBhdXRvX3B0cjx2b2xhdGlsZSBpbnQ+IHBpbnQobmV3IGludCgyKSk7CisgICAgQ1BQVU5JVF9BU1NFUlQoICpwaW50ID09IDIgKTsKKyAgfQorICB7CisgICAgYXV0b19wdHI8Y29uc3Qgdm9sYXRpbGUgaW50PiBwaW50KG5ldyBpbnQoMikpOworICAgIENQUFVOSVRfQVNTRVJUKCAqcGludCA9PSAyICk7CisgIH0KKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L21lcmdlX3Rlc3QuY3BwIGIvdGVzdC91bml0L21lcmdlX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MzViOGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvbWVyZ2VfdGVzdC5jcHAKQEAgLTAsMCArMSw5NyBAQAorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxudW1lcmljPgorCisjaW5jbHVkZSAiaW90YS5oIgorI2luY2x1ZGUgImNwcHVuaXQvY3BwdW5pdF9wcm94eS5oIgorCisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IGRlZmluZWQoX1NUTFBfVVNFX05BTUVTUEFDRVMpCit1c2luZyBuYW1lc3BhY2Ugc3RkOworI2VuZGlmCisKKy8vCisvLyBUZXN0Q2FzZSBjbGFzcworLy8KK2NsYXNzIE1lcmdlVGVzdCA6IHB1YmxpYyBDUFBVTklUX05TOjpUZXN0Q2FzZQoreworICBDUFBVTklUX1RFU1RfU1VJVEUoTWVyZ2VUZXN0KTsKKyAgQ1BQVU5JVF9URVNUKG1lcmdlMCk7CisgIENQUFVOSVRfVEVTVChtZXJnZTEpOworICBDUFBVTklUX1RFU1QobWVyZ2UyKTsKKyAgQ1BQVU5JVF9URVNUX1NVSVRFX0VORCgpOworCitwcm90ZWN0ZWQ6CisgIHZvaWQgbWVyZ2UwKCk7CisgIHZvaWQgbWVyZ2UxKCk7CisgIHZvaWQgbWVyZ2UyKCk7Cit9OworCitDUFBVTklUX1RFU1RfU1VJVEVfUkVHSVNUUkFUSU9OKE1lcmdlVGVzdCk7CisKKy8vCisvLyB0ZXN0cyBpbXBsZW1lbnRhdGlvbgorLy8KK3ZvaWQgTWVyZ2VUZXN0OjptZXJnZTAoKQoreworICBpbnQgbnVtYmVyczFbNV0gPSB7IDEsIDYsIDEzLCAyNSwgMTAxIH07CisgIGludCBudW1iZXJzMls1XSA9IHstNSwgMjYsIDM2LCA0NiwgOTkgfTsKKworICBpbnQgcmVzdWx0WzEwXTsKKyAgbWVyZ2UoKGludCopbnVtYmVyczEsIChpbnQqKW51bWJlcnMxICsgNSwgKGludCopbnVtYmVyczIsIChpbnQqKW51bWJlcnMyICsgNSwgKGludCopcmVzdWx0KTsKKworICBDUFBVTklUX0FTU0VSVChyZXN1bHRbMF09PS01KTsKKyAgQ1BQVU5JVF9BU1NFUlQocmVzdWx0WzFdPT0xKTsKKyAgQ1BQVU5JVF9BU1NFUlQocmVzdWx0WzJdPT02KTsKKyAgQ1BQVU5JVF9BU1NFUlQocmVzdWx0WzNdPT0xMyk7CisgIENQUFVOSVRfQVNTRVJUKHJlc3VsdFs0XT09MjUpOworICBDUFBVTklUX0FTU0VSVChyZXN1bHRbNV09PTI2KTsKKyAgQ1BQVU5JVF9BU1NFUlQocmVzdWx0WzZdPT0zNik7CisgIENQUFVOSVRfQVNTRVJUKHJlc3VsdFs3XT09NDYpOworICBDUFBVTklUX0FTU0VSVChyZXN1bHRbOF09PTk5KTsKKyAgQ1BQVU5JVF9BU1NFUlQocmVzdWx0WzldPT0xMDEpOworfQordm9pZCBNZXJnZVRlc3Q6Om1lcmdlMSgpCit7CisgIHZlY3RvcjxpbnQ+IHYxKDUpOworICB2ZWN0b3I8aW50PiB2Mih2MS5zaXplKCkpOworICBfX2lvdGEodjEuYmVnaW4oKSwgdjEuZW5kKCksIDApOworICBfX2lvdGEodjIuYmVnaW4oKSwgdjIuZW5kKCksIDMpOworCisgIHZlY3RvciA8aW50PiByZXN1bHQodjEuc2l6ZSgpICsgdjIuc2l6ZSgpKTsKKyAgbWVyZ2UodjEuYmVnaW4oKSwgdjEuZW5kKCksIHYyLmJlZ2luKCksIHYyLmVuZCgpLCByZXN1bHQuYmVnaW4oKSk7CisKKyAgQ1BQVU5JVF9BU1NFUlQocmVzdWx0WzBdPT0wKTsKKyAgQ1BQVU5JVF9BU1NFUlQocmVzdWx0WzFdPT0xKTsKKyAgQ1BQVU5JVF9BU1NFUlQocmVzdWx0WzJdPT0yKTsKKyAgQ1BQVU5JVF9BU1NFUlQocmVzdWx0WzNdPT0zKTsKKyAgQ1BQVU5JVF9BU1NFUlQocmVzdWx0WzRdPT0zKTsKKyAgQ1BQVU5JVF9BU1NFUlQocmVzdWx0WzVdPT00KTsKKyAgQ1BQVU5JVF9BU1NFUlQocmVzdWx0WzZdPT00KTsKKyAgQ1BQVU5JVF9BU1NFUlQocmVzdWx0WzddPT01KTsKKyAgQ1BQVU5JVF9BU1NFUlQocmVzdWx0WzhdPT02KTsKKyAgQ1BQVU5JVF9BU1NFUlQocmVzdWx0WzldPT03KTsKKworfQordm9pZCBNZXJnZVRlc3Q6Om1lcmdlMigpCit7CisgIHZlY3RvciA8aW50PiB2MSg1KTsKKyAgdmVjdG9yIDxpbnQ+IHYyKHYxLnNpemUoKSk7CisgIGZvciAoaW50IGkgPSAwOyAoc2l6ZV90KWkgPCB2MS5zaXplKCk7ICsraSkgeworICAgIHYxW2ldID0gMTAgLSBpOworICAgIHYyW2ldID0gIDcgLSBpOworICB9CisgIHZlY3RvcjxpbnQ+IHJlc3VsdCh2MS5zaXplKCkgKyB2Mi5zaXplKCkpOworICBtZXJnZSh2MS5iZWdpbigpLCB2MS5lbmQoKSwgdjIuYmVnaW4oKSwgdjIuZW5kKCksIHJlc3VsdC5iZWdpbigpLCBncmVhdGVyPGludD4oKSApOworCisgIENQUFVOSVRfQVNTRVJUKHJlc3VsdFswXT09MTApOworICBDUFBVTklUX0FTU0VSVChyZXN1bHRbMV09PTkpOworICBDUFBVTklUX0FTU0VSVChyZXN1bHRbMl09PTgpOworICBDUFBVTklUX0FTU0VSVChyZXN1bHRbM109PTcpOworICBDUFBVTklUX0FTU0VSVChyZXN1bHRbNF09PTcpOworICBDUFBVTklUX0FTU0VSVChyZXN1bHRbNV09PTYpOworICBDUFBVTklUX0FTU0VSVChyZXN1bHRbNl09PTYpOworICBDUFBVTklUX0FTU0VSVChyZXN1bHRbN109PTUpOworICBDUFBVTklUX0FTU0VSVChyZXN1bHRbOF09PTQpOworICBDUFBVTklUX0FTU0VSVChyZXN1bHRbOV09PTMpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L21lc3NhZ2VzX2ZhY2V0c190ZXN0LmNwcCBiL3Rlc3QvdW5pdC9tZXNzYWdlc19mYWNldHNfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjEwYmJhYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9tZXNzYWdlc19mYWNldHNfdGVzdC5jcHAKQEAgLTAsMCArMSw4NSBAQAorI2luY2x1ZGUgImxvY2FsZV90ZXN0LmgiCisKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgIWRlZmluZWQgKF9TVExQX1VTRV9OT19JT1NUUkVBTVMpCisjICBpbmNsdWRlIDxsb2NhbGU+CisjICBpbmNsdWRlIDxzdGRleGNlcHQ+CisKKyMgIGlmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkKF9TVExQX1VTRV9OQU1FU1BBQ0VTKQordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyMgIGVuZGlmCisKKy8vCisvLyB0ZXN0cyBpbXBsZW1lbnRhdGlvbgorLy8KK3ZvaWQgTG9jYWxlVGVzdDo6bWVzc2FnZXNfYnlfbmFtZSgpCit7CisgIC8qCisgICAqIENoZWNrIG9mIHRoZSAyMi4xLjEuMi43IHN0YW5kYXJkIHBvaW50LiBDb25zdHJ1Y3Rpb24gb2YgYSBsb2NhbGUKKyAgICogaW5zdGFuY2UgZnJvbSBhIG51bGwgcG9pbnRlciBvciBhbiB1bmtub3duIG5hbWUgc2hvdWxkIHJlc3VsdCBpbgorICAgKiBhIHJ1bnRpbWVfZXJyb3IgZXhjZXB0aW9uLgorICAgKi8KKyMgIGlmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkIChfU1RMUF9VU0VfRVhDRVBUSU9OUykKKyMgICAgaWYgZGVmaW5lZCAoU1RMUE9SVCkgfHwgIWRlZmluZWQgKF9fR05VQ19fKQorICB0cnkgeworICAgIGxvY2FsZSBsb2MobG9jYWxlOjpjbGFzc2ljKCksIG5ldyBtZXNzYWdlc19ieW5hbWU8Y2hhcj4oc3RhdGljX2Nhc3Q8Y2hhciBjb25zdCo+KDApKSk7CisgICAgQ1BQVU5JVF9GQUlMOworICB9CisgIGNhdGNoIChydW50aW1lX2Vycm9yIGNvbnN0JiAvKiBlICovKSB7CisgICAgLy9DUFBVTklUX01FU1NBR0UoIGUud2hhdCgpICk7CisgIH0KKyAgY2F0Y2ggKC4uLikgeworICAgIENQUFVOSVRfRkFJTDsKKyAgfQorIyAgICBlbmRpZgorCisgIHRyeSB7CisgICAgbG9jYWxlIGxvYyhsb2NhbGU6OmNsYXNzaWMoKSwgbmV3IG1lc3NhZ2VzX2J5bmFtZTxjaGFyPigieWFzbGlfbGFuZ3VhZ2UiKSk7CisgICAgQ1BQVU5JVF9GQUlMOworICB9CisgIGNhdGNoIChydW50aW1lX2Vycm9yIGNvbnN0JiAvKiBlICovKSB7CisgICAgLy9DUFBVTklUX01FU1NBR0UoIGUud2hhdCgpICk7CisgIH0KKyAgY2F0Y2ggKC4uLikgeworICAgIENQUFVOSVRfRkFJTDsKKyAgfQorCisgIC8qCisgIHRyeSB7CisgICAgbG9jYWxlIGxvYyhsb2NhbGU6OmNsYXNzaWMoKSwgbmV3IG1lc3NhZ2VzX2J5bmFtZTxjaGFyPigiIikpOworICAgIENQUFVOSVRfRkFJTDsKKyAgfQorICBjYXRjaCAocnVudGltZV9lcnJvciBjb25zdCYgZSkgeworICAgIENQUFVOSVRfTUVTU0FHRSggZS53aGF0KCkgKTsKKyAgfQorICBjYXRjaCAoLi4uKSB7CisgICAgQ1BQVU5JVF9GQUlMOworICB9CisgICovCisKKyMgICAgaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8ICFkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQorIyAgICAgIGlmIGRlZmluZWQgKFNUTFBPUlQpIHx8ICFkZWZpbmVkIChfX0dOVUNfXykKKyAgdHJ5IHsKKyAgICBsb2NhbGUgbG9jKGxvY2FsZTo6Y2xhc3NpYygpLCBuZXcgbWVzc2FnZXNfYnluYW1lPHdjaGFyX3Q+KHN0YXRpY19jYXN0PGNoYXIgY29uc3QqPigwKSkpOworICAgIENQUFVOSVRfRkFJTDsKKyAgfQorICBjYXRjaCAocnVudGltZV9lcnJvciBjb25zdCYpIHsKKyAgfQorICBjYXRjaCAoLi4uKSB7CisgICAgQ1BQVU5JVF9GQUlMOworICB9CisjICAgIGVuZGlmCisKKyAgdHJ5IHsKKyAgICBsb2NhbGUgbG9jKGxvY2FsZTo6Y2xhc3NpYygpLCBuZXcgbWVzc2FnZXNfYnluYW1lPHdjaGFyX3Q+KCJ5YXNsaV9sYW5ndWFnZSIpKTsKKyAgICBDUFBVTklUX0ZBSUw7CisgIH0KKyAgY2F0Y2ggKHJ1bnRpbWVfZXJyb3IgY29uc3QmKSB7CisgIH0KKyAgY2F0Y2ggKC4uLikgeworICAgIENQUFVOSVRfRkFJTDsKKyAgfQorIyAgICBlbmRpZgorIyAgZW5kaWYKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvbWZ1bnB0cl90ZXN0LmNwcCBiL3Rlc3QvdW5pdC9tZnVucHRyX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyOWQ1OTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvbWZ1bnB0cl90ZXN0LmNwcApAQCAtMCwwICsxLDIzMCBAQAorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpbmNsdWRlICJjcHB1bml0L2NwcHVuaXRfcHJveHkuaCIKKworI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkKF9TVExQX1VTRV9OQU1FU1BBQ0VTKQordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyNlbmRpZgorCisvLworLy8gVGVzdENhc2UgY2xhc3MKKy8vCitjbGFzcyBNZW1GdW5QdHJUZXN0IDogcHVibGljIENQUFVOSVRfTlM6OlRlc3RDYXNlCit7CisgIENQUFVOSVRfVEVTVF9TVUlURShNZW1GdW5QdHJUZXN0KTsKKyAgQ1BQVU5JVF9URVNUKG1lbV9wdHJfZnVuKTsKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiAhZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikKKyAgLy9UaGlzIHRlc3QgcmVxdWlyZSBwYXJ0aWFsIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGZlYXR1cmUgdG8gYXZvaWQgdGhlCisgIC8vcmVmZXJlbmNlIHRvIHJlZmVyZW5jZSBwcm9ibGVtLiBObyB3b3JrYXJvdW5kIHlldCBmb3IgbGltaXRlZCBjb21waWxlcnMuCisgIENQUFVOSVRfSUdOT1JFOworI2VuZGlmCisgIENQUFVOSVRfVEVTVChmaW5kKTsKKyAgQ1BQVU5JVF9URVNUX1NVSVRFX0VORCgpOworCitwcm90ZWN0ZWQ6CisgIC8vIGNvbXBpbGUgdGVzdCBub3QgbmVjY2Vzc2FyeSB0byBydW4gYnV0Li4uCisgIHZvaWQgbWVtX3B0cl9mdW4oKTsKKyAgdm9pZCBmaW5kKCk7Cit9OworCitDUFBVTklUX1RFU1RfU1VJVEVfUkVHSVNUUkFUSU9OKE1lbUZ1blB0clRlc3QpOworCisjaWYgZGVmaW5lZChfU1RMUF9ET05UX1JFVFVSTl9WT0lEKSAmJiAoZGVmaW5lZChfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVfQ0xBU1NFUykgJiYgZGVmaW5lZChfU1RMUF9OT19DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKSkKKyMgIGRlZmluZSBfU1RMUF9ET05UX1RFU1RfUkVUVVJOX1ZPSUQKKyNlbmRpZgorLy9lbHNlIHRoZXJlIGlzIG5vIHdvcmthcm91bmQgZm9yIHRoZSByZXR1cm4gdm9pZCBidWcKKworc3RydWN0IFMxIHsgfSBzMTsKK3N0cnVjdCBTMiB7IH0gczI7CisKK2ludCBmMShTMSYpOworaW50IGYyKFMxJiwgUzImKTsKK2ludCBmMWMoY29uc3QgUzEmKTsKK2ludCBmMmMoY29uc3QgUzEmLCBjb25zdCBTMiYpOworCit2b2lkIHZmMShTMSYpOwordm9pZCB2ZjIoUzEmLCBTMiYpOwordm9pZCB2ZjFjKGNvbnN0IFMxJik7Cit2b2lkIHZmMmMoY29uc3QgUzEmLCBjb25zdCBTMiYpOworCitjbGFzcyBDbGFzcyB7CitwdWJsaWM6CisgIGludCBmMCgpOworICBpbnQgZjEoY29uc3QgUzEmKTsKKworICB2b2lkIHZmMCgpOworICB2b2lkIHZmMShjb25zdCBTMSYpOworCisgIGludCBmMGMoKSBjb25zdDsKKyAgaW50IGYxYyhjb25zdCBTMSYpIGNvbnN0OworCisgIHZvaWQgdmYwYygpIGNvbnN0OworICB2b2lkIHZmMWMoY29uc3QgUzEmKSBjb25zdDsKK307CisKKy8vCisvLyB0ZXN0cyBpbXBsZW1lbnRhdGlvbgorLy8KK3ZvaWQgTWVtRnVuUHRyVGVzdDo6bWVtX3B0cl9mdW4oKQoreworICBDbGFzcyBvYmo7CisgIGNvbnN0IENsYXNzJiBvYmpjID0gb2JqOworCisgIC8vIHB0cl9mdW4KKworICBwdHJfZnVuKGYxKShzMSk7CisgIHB0cl9mdW4oZjIpKHMxLCBzMik7CisKKyAgcHRyX2Z1bihmMWMpKHMxKTsKKyAgcHRyX2Z1bihmMmMpKHMxLCBzMik7CisKKyNpZm5kZWYgX1NUTFBfRE9OVF9URVNUX1JFVFVSTl9WT0lECisgIHB0cl9mdW4odmYxKShzMSk7CisgIHB0cl9mdW4odmYyKShzMSwgczIpOworCisgIHB0cl9mdW4odmYxYykoczEpOworICBwdHJfZnVuKHZmMmMpKHMxLCBzMik7CisjZW5kaWYgLyogX1NUTFBfRE9OVF9URVNUX1JFVFVSTl9WT0lEICovCisKKyAgLy8gbWVtX2Z1bgorCisgIG1lbV9mdW4oJkNsYXNzOjpmMCkoJm9iaik7CisgIG1lbV9mdW4oJkNsYXNzOjpmMSkoJm9iaiwgczEpOworCisjaWZuZGVmIF9TVExQX0RPTlRfVEVTVF9SRVRVUk5fVk9JRAorICBtZW1fZnVuKCZDbGFzczo6dmYwKSgmb2JqKTsKKyAgbWVtX2Z1bigmQ2xhc3M6OnZmMSkoJm9iaiwgczEpOworI2VuZGlmIC8qIF9TVExQX0RPTlRfVEVTVF9SRVRVUk5fVk9JRCAqLworCisgIC8vIG1lbV9mdW4gKGNvbnN0KQorCisgIG1lbV9mdW4oJkNsYXNzOjpmMGMpKCZvYmpjKTsKKyAgbWVtX2Z1bigmQ2xhc3M6OmYxYykoJm9iamMsIHMxKTsKKworI2lmbmRlZiBfU1RMUF9ET05UX1RFU1RfUkVUVVJOX1ZPSUQKKyAgbWVtX2Z1bigmQ2xhc3M6OnZmMGMpKCZvYmpjKTsKKyAgbWVtX2Z1bigmQ2xhc3M6OnZmMWMpKCZvYmpjLCBzMSk7CisjZW5kaWYgLyogX1NUTFBfRE9OVF9URVNUX1JFVFVSTl9WT0lEICovCisKKyAgLy8gbWVtX2Z1bl9yZWYKKworICBtZW1fZnVuX3JlZigmQ2xhc3M6OmYwKShvYmopOworICBtZW1fZnVuX3JlZigmQ2xhc3M6OmYxKShvYmosIHMxKTsKKworI2lmbmRlZiBfU1RMUF9ET05UX1RFU1RfUkVUVVJOX1ZPSUQKKyAgbWVtX2Z1bl9yZWYoJkNsYXNzOjp2ZjApKG9iaik7CisgIG1lbV9mdW5fcmVmKCZDbGFzczo6dmYxKShvYmosIHMxKTsKKyNlbmRpZiAvKiBfU1RMUF9ET05UX1RFU1RfUkVUVVJOX1ZPSUQgKi8KKworICAvLyBtZW1fZnVuX3JlZiAoY29uc3QpCisgIG1lbV9mdW5fcmVmKCZDbGFzczo6ZjBjKShvYmpjKTsKKyAgbWVtX2Z1bl9yZWYoJkNsYXNzOjpmMWMpKG9iamMsIHMxKTsKKworI2lmbmRlZiBfU1RMUF9ET05UX1RFU1RfUkVUVVJOX1ZPSUQKKyAgbWVtX2Z1bl9yZWYoJkNsYXNzOjp2ZjBjKShvYmpjKTsKKyAgbWVtX2Z1bl9yZWYoJkNsYXNzOjp2ZjFjKShvYmpjLCBzMSk7CisjZW5kaWYgLyogX1NUTFBfRE9OVF9URVNUX1JFVFVSTl9WT0lEICovCit9CitpbnQgZjEoUzEmKQore3JldHVybiAxO30KKworaW50IGYyKFMxJiwgUzImKQore3JldHVybiAyO30KKworaW50IGYxYyhjb25zdCBTMSYpCit7cmV0dXJuIDE7fQorCitpbnQgZjJjKGNvbnN0IFMxJiwgY29uc3QgUzImKQore3JldHVybiAyO30KKwordm9pZCB2ZjEoUzEmKQore30KKwordm9pZCB2ZjIoUzEmLCBTMiYpCit7fQorCit2b2lkIHZmMWMoY29uc3QgUzEmKQore30KKwordm9pZCB2ZjJjKGNvbnN0IFMxJiwgY29uc3QgUzImKQore30KKworaW50IENsYXNzOjpmMCgpCit7cmV0dXJuIDA7fQorCitpbnQgQ2xhc3M6OmYxKGNvbnN0IFMxJikKK3tyZXR1cm4gMTt9CisKK3ZvaWQgQ2xhc3M6OnZmMCgpCit7fQorCit2b2lkIENsYXNzOjp2ZjEoY29uc3QgUzEmKQore30KKworaW50IENsYXNzOjpmMGMoKSBjb25zdAore3JldHVybiAwO30KKworaW50IENsYXNzOjpmMWMoY29uc3QgUzEmKSBjb25zdAore3JldHVybiAxO30KKwordm9pZCBDbGFzczo6dmYwYygpIGNvbnN0Cit7fQorCit2b2lkIENsYXNzOjp2ZjFjKGNvbnN0IFMxJikgY29uc3QKK3t9CisKK3N0cnVjdCBWIHsKKyAgcHVibGljOgorICAgIFYoaW50IF92KSA6CisgICAgICB2KF92KQorICAgIHsgfQorCisgIGJvb2wgZiggaW50IF92ICkgY29uc3QgeyByZXR1cm4gKHYgPT0gX3YpOyB9CisKKyAgaW50IHY7CisjaWYgZGVmaW5lZCAoX19ETUNfXykKKyAgVigpe30KKyNlbmRpZgorfTsKKwordm9pZCBNZW1GdW5QdHJUZXN0OjpmaW5kKCkKK3sKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikKKyAgdmVjdG9yPFY+IHY7CisKKyAgdi5wdXNoX2JhY2soIFYoMSkgKTsKKyAgdi5wdXNoX2JhY2soIFYoMikgKTsKKyAgdi5wdXNoX2JhY2soIFYoMykgKTsKKworICAvLyBzdGVwLWJ5LXN0ZXAgY29tcGxpY2F0aW9uIG9mIHdvcmsgZm9yIGNvbXBpbGVyOgorCisgIC8vIHN0ZXAgMToKKyAgY29uc3RfbWVtX2Z1bjFfcmVmX3Q8Ym9vbCxWLGludD4gcG1mID0gbWVtX2Z1bl9yZWYoICZWOjpmICk7CisgIGJpbmRlcjJuZDxjb25zdF9tZW1fZnVuMV9yZWZfdDxib29sLFYsaW50PiA+IGIocG1mLCAyKTsKKyAgdmVjdG9yPFY+OjppdGVyYXRvciBpID0gZmluZF9pZiggdi5iZWdpbigpLCB2LmVuZCgpLCBiICk7CisgIENQUFVOSVRfQVNTRVJUKGkgIT0gdi5lbmQoKSk7CisgIENQUFVOSVRfQVNTRVJUKGktPnYgPT0gMik7CisKKyAgLy8gc3RlcCAyLCBqdXN0IGNoZWNrIHRoYXQgY29tcGlsZXIgdW5kZXJzdGFuZCB3aGF0IHBhc3MgdG8gYmluZDJuZDoKKyAgYmluZGVyMm5kPGNvbnN0X21lbV9mdW4xX3JlZl90PGJvb2wsVixpbnQ+ID4gYjIgPSBiaW5kMm5kKCBwbWYsIDIgKTsKKworICAvLyBzdGVwIDMsIHRoZSBzYW1lIGFzIHN0ZXAgMSwgYnV0IG1vcmUgaW50ZWxsZWN0IGZyb20gY29tcGlsZXIgcmVxdWlyZWQ6CisgIGJpbmRlcjJuZDxjb25zdF9tZW1fZnVuMV9yZWZfdDxib29sLFYsaW50PiA+IGIzID0gYmluZDJuZCggbWVtX2Z1bl9yZWYoICZWOjpmICksIDIgKTsKKworICB2ZWN0b3I8Vj46Oml0ZXJhdG9yIGogPSBmaW5kX2lmKCB2LmJlZ2luKCksIHYuZW5kKCksIGIzICk7CisgIENQUFVOSVRfQVNTRVJUKGogIT0gdi5lbmQoKSk7CisgIENQUFVOSVRfQVNTRVJUKGotPnYgPT0gMik7CisKKyAgLy8gc3RlcCA0LCBtb3JlIGJyaWVmLCBtb3JlIGNvbXBsZXg6CisgIHZlY3RvcjxWPjo6aXRlcmF0b3IgayA9IGZpbmRfaWYoIHYuYmVnaW4oKSwgdi5lbmQoKSwgYmluZDJuZCggbWVtX2Z1bl9yZWYoICZWOjpmICksIDIgKSApOworICBDUFBVTklUX0FTU0VSVChrICE9IHYuZW5kKCkpOworICBDUFBVTklUX0FTU0VSVChrLT52ID09IDIpOworI2VuZGlmCit9CisKKyNpZmRlZiBfU1RMUF9ET05UX1RFU1RfUkVUVVJOX1ZPSUQKKyMgIHVuZGVmIF9TVExQX0RPTlRfVEVTVF9SRVRVUk5fVk9JRAorI2VuZGlmCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvbWluX3Rlc3QuY3BwIGIvdGVzdC91bml0L21pbl90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjQ1YWRlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L21pbl90ZXN0LmNwcApAQCAtMCwwICsxLDYyIEBACisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgImNwcHVuaXQvY3BwdW5pdF9wcm94eS5oIgorCisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IGRlZmluZWQoX1NUTFBfVVNFX05BTUVTUEFDRVMpCit1c2luZyBuYW1lc3BhY2Ugc3RkOworI2VuZGlmCisKKy8vCisvLyBUZXN0Q2FzZSBjbGFzcworLy8KK2NsYXNzIE1pblRlc3QgOiBwdWJsaWMgQ1BQVU5JVF9OUzo6VGVzdENhc2UKK3sKKyAgQ1BQVU5JVF9URVNUX1NVSVRFKE1pblRlc3QpOworICBDUFBVTklUX1RFU1QobWluMSk7CisgIENQUFVOSVRfVEVTVChtaW4yKTsKKyAgQ1BQVU5JVF9URVNUKG1pbmVsZW0xKTsKKyAgQ1BQVU5JVF9URVNUKG1pbmVsZW0yKTsKKyAgQ1BQVU5JVF9URVNUX1NVSVRFX0VORCgpOworCitwcm90ZWN0ZWQ6CisgIHZvaWQgbWluMSgpOworICB2b2lkIG1pbjIoKTsKKyAgdm9pZCBtaW5lbGVtMSgpOworICB2b2lkIG1pbmVsZW0yKCk7CisgIHN0YXRpYyBib29sIHN0cl9jb21wYXJlKGNvbnN0IGNoYXIqIGFfLCBjb25zdCBjaGFyKiBiXykKKyAgeyByZXR1cm4gc3RyY21wKGFfLCBiXykgPCAwID8gMSA6IDA7IH0KK307CisKK0NQUFVOSVRfVEVTVF9TVUlURV9SRUdJU1RSQVRJT04oTWluVGVzdCk7CisKKy8vCisvLyB0ZXN0cyBpbXBsZW1lbnRhdGlvbgorLy8KK3ZvaWQgTWluVGVzdDo6bWluMSgpCit7CisgIGludCByID0gbWluKDQyLCAxMDApOworICBDUFBVTklUX0FTU0VSVCggciA9PSA0MiApOworCisgIHIgPSBtaW4oLS1yLCByKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHIgPT0gNDEgKTsKK30KK3ZvaWQgTWluVGVzdDo6bWluMigpCit7CisgIGNvbnN0IGNoYXIqIHIgPSBtaW4oKGNvbnN0IGNoYXIqKSJzaG9lIiwgKGNvbnN0IGNoYXIqKSJzaGluZSIsIHN0cl9jb21wYXJlKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIXN0cmNtcChyLCAic2hpbmUiKSk7Cit9Cit2b2lkIE1pblRlc3Q6Om1pbmVsZW0xKCkKK3sKKyAgaW50IG51bWJlcnNbNl0gPSB7IC0xMCwgMTUsIC0xMDAsIDM2LCAtMjQyLCA0MiB9OworICBpbnQqIHIgPSBtaW5fZWxlbWVudCgoaW50KiludW1iZXJzLCAoaW50KiludW1iZXJzICsgNik7CisgIENQUFVOSVRfQVNTRVJUKCpyPT0tMjQyKTsKK30KK3ZvaWQgTWluVGVzdDo6bWluZWxlbTIoKQoreworICBjb25zdCBjaGFyKiBuYW1lc1tdID0geyAiQnJldHQiLCAiR3JhaGFtIiwgIkphY2siLCAiTWlrZSIsICJUb2RkIiB9OworCisgIGNvbnN0IHVuc2lnbmVkIG5hbWVzQ3QgPSBzaXplb2YobmFtZXMpIC8gc2l6ZW9mKG5hbWVzWzBdKTsKKyAgY29uc3QgY2hhcioqIHIgPSBtaW5fZWxlbWVudCgoY29uc3QgY2hhcioqKW5hbWVzLCAoY29uc3QgY2hhcioqKW5hbWVzICsgbmFtZXNDdCwgc3RyX2NvbXBhcmUpOworICBDUFBVTklUX0FTU0VSVCghc3RyY21wKCpyLCAiQnJldHQiKSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvbWlzbWF0Y2hfdGVzdC5jcHAgYi90ZXN0L3VuaXQvbWlzbWF0Y2hfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNmN2NkMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9taXNtYXRjaF90ZXN0LmNwcApAQCAtMCwwICsxLDgyIEBACisjaW5jbHVkZSA8bnVtZXJpYz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSAiaW90YS5oIgorI2luY2x1ZGUgImNwcHVuaXQvY3BwdW5pdF9wcm94eS5oIgorCisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IGRlZmluZWQoX1NUTFBfVVNFX05BTUVTUEFDRVMpCit1c2luZyBuYW1lc3BhY2Ugc3RkOworI2VuZGlmCisKKy8vCisvLyBUZXN0Q2FzZSBjbGFzcworLy8KK2NsYXNzIE1pc21hdGNoVGVzdCA6IHB1YmxpYyBDUFBVTklUX05TOjpUZXN0Q2FzZQoreworICBDUFBVTklUX1RFU1RfU1VJVEUoTWlzbWF0Y2hUZXN0KTsKKyAgQ1BQVU5JVF9URVNUKG1pc21hdGNoMCk7CisgIENQUFVOSVRfVEVTVChtaXNtYXRjaDEpOworICBDUFBVTklUX1RFU1QobWlzbWF0Y2gyKTsKKyAgQ1BQVU5JVF9URVNUX1NVSVRFX0VORCgpOworCitwcm90ZWN0ZWQ6CisgIHZvaWQgbWlzbWF0Y2gwKCk7CisgIHZvaWQgbWlzbWF0Y2gxKCk7CisgIHZvaWQgbWlzbWF0Y2gyKCk7Cit9OworCitDUFBVTklUX1RFU1RfU1VJVEVfUkVHSVNUUkFUSU9OKE1pc21hdGNoVGVzdCk7CisKKy8vCisvLyB0ZXN0cyBpbXBsZW1lbnRhdGlvbgorLy8KK2Jvb2wgc3RyX2VxdWFsKGNvbnN0IGNoYXIqIGFfLCBjb25zdCBjaGFyKiBiXykKK3sKKyAgcmV0dXJuIHN0cmNtcChhXywgYl8pID09IDAgPyAxIDogMDsKK30KK3ZvaWQgTWlzbWF0Y2hUZXN0OjptaXNtYXRjaDAoKQoreworICBpbnQgbjFbNV0gPSB7IDEsIDIsIDMsIDQsIDUgfTsKKyAgaW50IG4yWzVdID0geyAxLCAyLCAzLCA0LCA1IH07CisgIGludCBuM1s1XSA9IHsgMSwgMiwgMywgMiwgMSB9OworCisgIHBhaXIgPGludCosIGludCo+IHJlc3VsdCA9IG1pc21hdGNoKChpbnQqKW4xLCAoaW50KiluMSArIDUsIChpbnQqKW4yKTsKKyAgQ1BQVU5JVF9BU1NFUlQocmVzdWx0LmZpcnN0ID09KG4xICsgNSkgJiYgcmVzdWx0LnNlY29uZCA9PShuMiArIDUpKTsKKworICByZXN1bHQgPSBtaXNtYXRjaCgoaW50KiluMSwgKGludCopbjEgKyA1LCAoaW50KiluMyk7CisgIENQUFVOSVRfQVNTRVJUKCEocmVzdWx0LmZpcnN0ID09KG4xICsgNSkgJiYgcmVzdWx0LnNlY29uZCA9PShuMyArIDUpKSk7CisgIENQUFVOSVRfQVNTRVJUKChyZXN1bHQuZmlyc3QgLSBuMSk9PTMpOworfQordm9pZCBNaXNtYXRjaFRlc3Q6Om1pc21hdGNoMSgpCit7CisgIHR5cGVkZWYgdmVjdG9yPGludD4gSW50VmVjOworICBJbnRWZWMgdjEoMTApOworICBfX2lvdGEodjEuYmVnaW4oKSwgdjEuZW5kKCksIDApOworICBJbnRWZWMgdjIodjEpOworCisgIHBhaXIgPEludFZlYzo6aXRlcmF0b3IsIEludFZlYzo6aXRlcmF0b3I+IHJlc3VsdCA9IG1pc21hdGNoKHYxLmJlZ2luKCksIHYxLmVuZCgpLCB2Mi5iZWdpbigpKTsKKworICBDUFBVTklUX0FTU0VSVChyZXN1bHQuZmlyc3QgPT0gdjEuZW5kKCkgJiYgcmVzdWx0LnNlY29uZCA9PSB2Mi5lbmQoKSk7CisKKyAgdjJbdjIuc2l6ZSgpLzJdID0gNDI7CisgIHJlc3VsdCA9IG1pc21hdGNoKHYxLmJlZ2luKCksIHYxLmVuZCgpLCB2Mi5iZWdpbigpKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIShyZXN1bHQuZmlyc3QgPT0gdjEuZW5kKCkgJiYgcmVzdWx0LnNlY29uZCA9PSB2Mi5lbmQoKSkpOworICBDUFBVTklUX0FTU0VSVCgocmVzdWx0LmZpcnN0IC0gdjEuYmVnaW4oKSk9PTUpOworfQordm9pZCBNaXNtYXRjaFRlc3Q6Om1pc21hdGNoMigpCit7CisgIGNvbnN0IHVuc2lnbmVkIHNpemUgPSA1OworICBjaGFyIGNvbnN0KiBuMVtzaXplXSA9IHsgIkJyZXR0IiwgIkdyYWhhbSIsICJKYWNrIiwgIk1pa2UiLCAiVG9kZCIgfTsKKworICBjaGFyIGNvbnN0KiBuMltzaXplXTsKKyAgY29weShuMSwgbjEgKyA1LCAoY2hhciBjb25zdCoqKW4yKTsKKyAgcGFpciA8Y2hhciBjb25zdCoqLCBjaGFyIGNvbnN0Kio+IHJlc3VsdCA9IG1pc21hdGNoKChjaGFyIGNvbnN0KiopbjEsIChjaGFyIGNvbnN0KiopbjEgKyBzaXplLCAoY2hhciBjb25zdCoqKW4yLCBzdHJfZXF1YWwpOworCisgIENQUFVOSVRfQVNTRVJUKHJlc3VsdC5maXJzdCA9PSBuMSArIHNpemUgJiYgcmVzdWx0LnNlY29uZCA9PSBuMiArIHNpemUpOworCisgIG4yWzJdID0gIlFFRCI7CisgIHJlc3VsdCA9IG1pc21hdGNoKChjaGFyIGNvbnN0KiopbjEsIChjaGFyIGNvbnN0KiopbjEgKyBzaXplLCAoY2hhciBjb25zdCoqKW4yLCBzdHJfZXF1YWwpOworICBDUFBVTklUX0FTU0VSVCghKHJlc3VsdC5maXJzdCA9PSBuMiArIHNpemUgJiYgcmVzdWx0LnNlY29uZCA9PSBuMiArIHNpemUpKTsKKyAgQ1BQVU5JVF9BU1NFUlQoKHJlc3VsdC5maXJzdCAtIG4xKT09Mik7Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvbW9kdWx1c190ZXN0LmNwcCBiL3Rlc3QvdW5pdC9tb2R1bHVzX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmYWI5NzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvbW9kdWx1c190ZXN0LmNwcApAQCAtMCwwICsxLDQwIEBACisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisKKyNpbmNsdWRlICJjcHB1bml0L2NwcHVuaXRfcHJveHkuaCIKKworI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkKF9TVExQX1VTRV9OQU1FU1BBQ0VTKQordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyNlbmRpZgorCisvLworLy8gVGVzdENhc2UgY2xhc3MKKy8vCitjbGFzcyBNb2R1bHVzVGVzdCA6IHB1YmxpYyBDUFBVTklUX05TOjpUZXN0Q2FzZQoreworICBDUFBVTklUX1RFU1RfU1VJVEUoTW9kdWx1c1Rlc3QpOworICBDUFBVTklUX1RFU1QobW9kdWx1czApOworICBDUFBVTklUX1RFU1RfU1VJVEVfRU5EKCk7CisKK3Byb3RlY3RlZDoKKyAgdm9pZCBtb2R1bHVzMCgpOworfTsKKworQ1BQVU5JVF9URVNUX1NVSVRFX1JFR0lTVFJBVElPTihNb2R1bHVzVGVzdCk7CisKKy8vCisvLyB0ZXN0cyBpbXBsZW1lbnRhdGlvbgorLy8KK3ZvaWQgTW9kdWx1c1Rlc3Q6Om1vZHVsdXMwKCkKK3sKKyAgaW50IGlucHV0MSBbNF0gPSB7IDYsIDgsIDEwLCAyIH07CisgIGludCBpbnB1dDIgWzRdID0geyA0LCAyLCAxMSwgMyB9OworCisgIGludCBvdXRwdXQgWzRdOworCisgIHRyYW5zZm9ybSgoaW50KilpbnB1dDEsIChpbnQqKWlucHV0MSArIDQsIChpbnQqKWlucHV0MiwgKGludCopb3V0cHV0LCBtb2R1bHVzPGludD4oKSk7CisgIENQUFVOSVRfQVNTRVJUKG91dHB1dFswXT09Mik7CisgIENQUFVOSVRfQVNTRVJUKG91dHB1dFsxXT09MCk7CisgIENQUFVOSVRfQVNTRVJUKG91dHB1dFsyXT09MTApOworICBDUFBVTklUX0FTU0VSVChvdXRwdXRbM109PTIpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L21vbmV5X2ZhY2V0c190ZXN0LmNwcCBiL3Rlc3QvdW5pdC9tb25leV9mYWNldHNfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFjZTc3MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9tb25leV9mYWNldHNfdGVzdC5jcHAKQEAgLTAsMCArMSw2NTUgQEAKKyNpbmNsdWRlICJsb2NhbGVfdGVzdC5oIgorCisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8ICFkZWZpbmVkIChfU1RMUF9VU0VfTk9fSU9TVFJFQU1TKQorIyAgaW5jbHVkZSA8bG9jYWxlPgorIyAgaW5jbHVkZSA8c3N0cmVhbT4KKyMgIGluY2x1ZGUgPHN0ZGV4Y2VwdD4KKworIyAgaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IGRlZmluZWQoX1NUTFBfVVNFX05BTUVTUEFDRVMpCit1c2luZyBuYW1lc3BhY2Ugc3RkOworIyAgZW5kaWYKKworc3RydWN0IHJlZl9tb25ldGFyeSB7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIGNvbnN0IGNoYXIgKm1vbmV5X2ludF9wcmVmaXg7CisgIGNvbnN0IGNoYXIgKm1vbmV5X2ludF9wcmVmaXhfb2xkOworICBjb25zdCBjaGFyICptb25leV9wcmVmaXg7CisgIGNvbnN0IGNoYXIgKm1vbmV5X3N1ZmZpeDsKKyAgY29uc3QgY2hhciAqbW9uZXlfZGVjaW1hbF9wb2ludDsKKyAgY29uc3QgY2hhciAqbW9uZXlfdGhvdXNhbmRzX3NlcDsKK307CisKK3N0YXRpYyBjb25zdCByZWZfbW9uZXRhcnkgdGVzdGVkX2xvY2FsZXNbXSA9IHsKKy8veyAgbmFtZSwgICAgICAgICBtb25leV9pbnRfcHJlZml4LCBtb25leV9pbnRfcHJlZml4X29sZCwgbW9uZXlfcHJlZml4LCBtb25leV9zdWZmaXgsIG1vbmV5X2RlY2ltYWxfcG9pbnQsIG1vbmV5X3Rob3VzYW5kc19zZXB9LAorIyAgaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IGRlZmluZWQgKF9TVExQX1VTRV9FWENFUFRJT05TKQorICB7ICJmcl9GUiIsICAgICAgICJFVVIgIiwgICAgICAgICAgICJGUkYgIiwgICAgICAgICAgICAgICAiIiwgICAgICAgICAgICIiLCAgICAgICAgICAgIiwiLAorIyAgICBpZiBkZWZpbmVkIChXSU4zMikgfHwgZGVmaW5lZCAoX1dJTjMyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4YTAiIH0sCisjICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIiB9LAorIyAgICBlbmRpZgorICB7ICJydV9SVS5rb2k4ciIsICJSVUIgIiwgICAgICAgICAgICJSVVIgIiwgICAgICAgICAgICAgICAiIiwgICAgICAgICAgICJceGQyXHhkNVx4YzIiLCAiLiIsICAgICAgICAgICAgICAgIiAiIH0sCisgIHsgImVuX0dCIiwgICAgICAgIkdCUCAiLCAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICJceGEzIiwgICAgICAgIiIsICAgICAgICAgICAiLiIsICAgICAgICAgICAgICAgICAiLCIgfSwKKyAgeyAiZW5fVVMiLCAgICAgICAiVVNEICIsICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgIiQiLCAgICAgICAgICAiIiwgICAgICAgICAgICIuIiwgICAgICAgICAgICAgICAgICIsIiB9LAorIyAgZW5kaWYKKyAgeyAiQyIsICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgIiIsICAgICAgICAgICAiIiwgICAgICAgICAgICIgIiwgICAgICAgICAgICAgICAgICIgIiB9LAorfTsKKworCitjb25zdCByZWZfbW9uZXRhcnkqIExvY2FsZVRlc3Q6Ol9nZXRfcmVmX21vbmV0YXJ5KHNpemVfdCBpKQoreworICBpZiAoaSA8IHNpemVvZih0ZXN0ZWRfbG9jYWxlcykgLyBzaXplb2YodGVzdGVkX2xvY2FsZXNbMF0pKSB7CisgICAgcmV0dXJuIHRlc3RlZF9sb2NhbGVzICsgaTsKKyAgfQorICByZXR1cm4gMDsKK30KKworY29uc3QgY2hhciogTG9jYWxlVGVzdDo6X2dldF9yZWZfbW9uZXRhcnlfbmFtZShjb25zdCByZWZfbW9uZXRhcnkqIF9yZWYpCit7CisgIHJldHVybiBfcmVmLT5uYW1lOworfQorCit2b2lkIExvY2FsZVRlc3Q6Ol9tb25leV9wdXRfZ2V0KCBjb25zdCBsb2NhbGUmIGxvYywgY29uc3QgcmVmX21vbmV0YXJ5KiBybCApCit7CisgIF9tb25leV9wdXRfZ2V0Mihsb2MsIGxvYywgcmwpOworfQorCit2b2lkIExvY2FsZVRlc3Q6Ol9tb25leV9wdXRfZ2V0MiggY29uc3QgbG9jYWxlJiBsb2MsIGNvbnN0IGxvY2FsZSYgc3RyZWFtTG9jLCBjb25zdCByZWZfbW9uZXRhcnkqIHBybCApCit7CisgIGNvbnN0IHJlZl9tb25ldGFyeSAmcmwgPSAqcHJsOworICBDUFBVTklUX0FTU0VSVCggaGFzX2ZhY2V0PG1vbmV5X3B1dDxjaGFyPiA+KGxvYykgKTsKKyAgbW9uZXlfcHV0PGNoYXI+IGNvbnN0JiBmbXAgPSB1c2VfZmFjZXQ8bW9uZXlfcHV0PGNoYXI+ID4obG9jKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIGhhc19mYWNldDxtb25leV9nZXQ8Y2hhcj4gPihsb2MpICk7CisgIG1vbmV5X2dldDxjaGFyPiBjb25zdCYgZm1nID0gdXNlX2ZhY2V0PG1vbmV5X2dldDxjaGFyPiA+KGxvYyk7CisKKyAgb3N0cmluZ3N0cmVhbSBvc3RyOworICBvc3RyLmltYnVlKHN0cmVhbUxvYyk7CisgIG9zdHIgPDwgc2hvd2Jhc2U7CisKKyAgLy9DaGVjayBhIHBvc2l0aXZlIHZhbHVlIChpbnRlcm5hdGlvbmFsIGZvcm1hdCkKKyAgeworICAgIHN0cmluZyBzdHJfcmVzOworICAgIC8vbW9uZXlfcHV0CisgICAgeworICAgICAgQ1BQVU5JVF9BU1NFUlQoIChoYXNfZmFjZXQ8bW9uZXlwdW5jdDxjaGFyLCB0cnVlPiA+KGxvYykpICk7CisgICAgICBtb25leXB1bmN0PGNoYXIsIHRydWU+IGNvbnN0JiBpbnRsX2ZtcCA9IHVzZV9mYWNldDxtb25leXB1bmN0PGNoYXIsIHRydWU+ID4obG9jKTsKKworICAgICAgb3N0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+IHJlcyA9IGZtcC5wdXQob3N0ciwgdHJ1ZSwgb3N0ciwgJyAnLCAxMjM0NTYpOworCisgICAgICBDUFBVTklUX0FTU0VSVCggIXJlcy5mYWlsZWQoKSApOworICAgICAgc3RyX3JlcyA9IG9zdHIuc3RyKCk7CisgICAgICAvL0NQUFVOSVRfTUVTU0FHRShzdHJfcmVzLmNfc3RyKCkpOworCisgICAgICBzaXplX3QgZmllbGRJbmRleCA9IDA7CisgICAgICBzaXplX3QgaW5kZXggPSAwOworCisgICAgICAvL09uIGEgcG9zaXRpdmUgdmFsdWUgd2Ugc2tpcCB0aGUgc2lnbiBmaWVsZCBpZiBleGlzdHM6CisgICAgICBpZiAoaW50bF9mbXAucG9zX2Zvcm1hdCgpLmZpZWxkW2ZpZWxkSW5kZXhdID09IG1vbmV5X2Jhc2U6OnNpZ24pIHsKKyAgICAgICAgKytmaWVsZEluZGV4OworICAgICAgfQorICAgICAgLy8gaW50ZXJuYXRpb25hbCBjdXJyZW5jeSBhYmJyZXZpYXRpb24sIGlmIGl0IGlzIGJlZm9yZSB2YWx1ZQorCisgICAgICAvKgorICAgICAgICogaW50X2N1cnJfc3ltYm9sCisgICAgICAgKgorICAgICAgICogICBUaGUgaW50ZXJuYXRpb25hbCBjdXJyZW5jeSBzeW1ib2wuIFRoZSBvcGVyYW5kIGlzIGEgZm91ci1jaGFyYWN0ZXIKKyAgICAgICAqICAgc3RyaW5nLCB3aXRoIHRoZSBmaXJzdCB0aHJlZSBjaGFyYWN0ZXJzIGNvbnRhaW5pbmcgdGhlIGFscGhhYmV0aWMKKyAgICAgICAqICAgaW50ZXJuYXRpb25hbCBjdXJyZW5jeSBzeW1ib2wgaW4gYWNjb3JkYW5jZSB3aXRoIHRob3NlIHNwZWNpZmllZAorICAgICAgICogICBpbiB0aGUgSVNPIDQyMTcgc3BlY2lmaWNhdGlvbi4gVGhlIGZvdXJ0aCBjaGFyYWN0ZXIgaXMgdGhlIGNoYXJhY3RlciB1c2VkCisgICAgICAgKiAgIHRvIHNlcGFyYXRlIHRoZSBpbnRlcm5hdGlvbmFsIGN1cnJlbmN5IHN5bWJvbCBmcm9tIHRoZSBtb25ldGFyeSBxdWFudGl0eS4KKyAgICAgICAqCisgICAgICAgKiAoaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvNzk5MDk4OTc3NS94YmQvbG9jYWxlLmh0bWwpCisgICAgICAgKi8KKyAgICAgIHN0cmluZzo6c2l6ZV90eXBlIHAgPSBzdHJsZW4oIHJsLm1vbmV5X2ludF9wcmVmaXggKTsKKyAgICAgIGlmIChwICE9IDApIHsKKyAgICAgICAgQ1BQVU5JVF9BU1NFUlQoIGludGxfZm1wLnBvc19mb3JtYXQoKS5maWVsZFtmaWVsZEluZGV4XSA9PSBtb25leV9iYXNlOjpzeW1ib2wgKTsKKyAgICAgICAgc3RyaW5nOjpzaXplX3R5cGUgcF9vbGQgPSBzdHJsZW4oIHJsLm1vbmV5X2ludF9wcmVmaXhfb2xkICk7CisgICAgICAgIENQUFVOSVRfQVNTRVJUKCAoc3RyX3Jlcy5zdWJzdHIoaW5kZXgsIHApID09IHJsLm1vbmV5X2ludF9wcmVmaXgpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAoKHBfb2xkICE9IDApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cl9yZXMuc3Vic3RyKGluZGV4LCBwX29sZCkgPT0gcmwubW9uZXlfaW50X3ByZWZpeF9vbGQpKSApOworICAgICAgICBpZiAoIHN0cl9yZXMuc3Vic3RyKGluZGV4LCBwKSA9PSBybC5tb25leV9pbnRfcHJlZml4ICkgeworICAgICAgICAgIGluZGV4ICs9IHA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaW5kZXggKz0gcF9vbGQ7CisgICAgICAgIH0KKyAgICAgICAgKytmaWVsZEluZGV4OworICAgICAgfQorCisgICAgICAvLyBzcGFjZSBhZnRlciBjdXJyZW5jeQorICAgICAgaWYgKGludGxfZm1wLnBvc19mb3JtYXQoKS5maWVsZFtmaWVsZEluZGV4XSA9PSBtb25leV9iYXNlOjpzcGFjZSB8fAorICAgICAgICAgIGludGxfZm1wLnBvc19mb3JtYXQoKS5maWVsZFtmaWVsZEluZGV4XSA9PSBtb25leV9iYXNlOjpub25lKSB7CisgICAgICAgIC8vIGl0ZXJuYXRpb25hbCBjdXJyZW5jeSBzeW1vYm9sIGhhcyBmb3VyIGNoYXJzLCBvbmUgb2YgdGhlc2UgY2hhcnMKKyAgICAgICAgLy8gaXMgc2VwYXJhdG9yLCBzbyBpZiBmb3JtYXQgaGFzIHNwYWNlIG9uIHRoaXMgcGxhY2UsIGl0IHNob3VsZAorICAgICAgICAvLyBiZSBza2lwcGVkLgorICAgICAgICArK2ZpZWxkSW5kZXg7CisgICAgICB9CisKKyAgICAgIC8vIHNpZ24KKyAgICAgIGlmIChpbnRsX2ZtcC5wb3NfZm9ybWF0KCkuZmllbGRbZmllbGRJbmRleF0gPT0gbW9uZXlfYmFzZTo6c2lnbikgeworICAgICAgICArK2ZpZWxkSW5kZXg7CisgICAgICB9CisKKyAgICAgIC8vIHZhbHVlCisgICAgICBDUFBVTklUX0FTU0VSVCggc3RyX3Jlc1tpbmRleCsrXSA9PSAnMScgKTsKKyAgICAgIGlmICghaW50bF9mbXAuZ3JvdXBpbmcoKS5lbXB0eSgpKSB7CisgICAgICAgIENQUFVOSVRfQVNTRVJUKCBzdHJfcmVzW2luZGV4KytdID09IC8qIGludGxfZm1wLnRob3VzYW5kc19zZXAoKSAqLyAqcmwubW9uZXlfdGhvdXNhbmRzX3NlcCApOworICAgICAgfQorICAgICAgQ1BQVU5JVF9BU1NFUlQoIHN0cl9yZXNbaW5kZXgrK10gPT0gJzInICk7CisgICAgICBDUFBVTklUX0FTU0VSVCggc3RyX3Jlc1tpbmRleCsrXSA9PSAnMycgKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBzdHJfcmVzW2luZGV4KytdID09ICc0JyApOworICAgICAgaWYgKGludGxfZm1wLmZyYWNfZGlnaXRzKCkgIT0gMCkgeworICAgICAgICBDUFBVTklUX0FTU0VSVCggc3RyX3Jlc1tpbmRleCsrXSA9PSAvKiBpbnRsX2ZtcC5kZWNpbWFsX3BvaW50KCkgKi8gKnJsLm1vbmV5X2RlY2ltYWxfcG9pbnQgKTsKKyAgICAgIH0KKyAgICAgIENQUFVOSVRfQVNTRVJUKCBzdHJfcmVzW2luZGV4KytdID09ICc1JyApOworICAgICAgQ1BQVU5JVF9BU1NFUlQoIHN0cl9yZXNbaW5kZXgrK10gPT0gJzYnICk7CisgICAgICArK2ZpZWxkSW5kZXg7CisKKyAgICAgIC8vIHNpZ24KKyAgICAgIGlmIChpbnRsX2ZtcC5wb3NfZm9ybWF0KCkuZmllbGRbZmllbGRJbmRleF0gPT0gbW9uZXlfYmFzZTo6c2lnbikgeworICAgICAgICArK2ZpZWxkSW5kZXg7CisgICAgICB9CisKKyAgICAgIC8vIHNwYWNlCisgICAgICBpZiAoaW50bF9mbXAucG9zX2Zvcm1hdCgpLmZpZWxkW2ZpZWxkSW5kZXhdID09IG1vbmV5X2Jhc2U6OnNwYWNlICkgeworICAgICAgICBDUFBVTklUX0FTU0VSVCggc3RyX3Jlc1tpbmRleCsrXSA9PSAnICcgKTsKKyAgICAgICAgKytmaWVsZEluZGV4OworICAgICAgfQorCisgICAgICAvLyBzaWduCisgICAgICBpZiAoaW50bF9mbXAucG9zX2Zvcm1hdCgpLmZpZWxkW2ZpZWxkSW5kZXhdID09IG1vbmV5X2Jhc2U6OnNpZ24pIHsKKyAgICAgICAgKytmaWVsZEluZGV4OworICAgICAgfQorCisgICAgICAvL2FzIHNwYWNlIGNhbm5vdCBiZSBsYXN0IHRoZSBvbmx5IGxlZnQgZm9ybWF0IGNhbiBiZSBub25lOgorICAgICAgd2hpbGUgKCBmaWVsZEluZGV4IDwgMyApIHsKKyAgICAgICAgQ1BQVU5JVF9BU1NFUlQoIGludGxfZm1wLnBvc19mb3JtYXQoKS5maWVsZFtmaWVsZEluZGV4XSA9PSBtb25leV9iYXNlOjpub25lICk7CisgICAgICAgICsrZmllbGRJbmRleDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvL21vbmV5X2dldAorICAgIHsKKyAgICAgIGlvc19iYXNlOjppb3N0YXRlIGVyciA9IGlvc19iYXNlOjpnb29kYml0OworICAgICAgc3RyaW5nIGRpZ2l0czsKKworICAgICAgaXN0cmluZ3N0cmVhbSBpc3RyKHN0cl9yZXMpOworICAgICAgb3N0ci5zdHIoICIiICk7CisgICAgICBvc3RyLmNsZWFyKCk7CisgICAgICBmbWcuZ2V0KGlzdHIsIGlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPigpLCB0cnVlLCBvc3RyLCBlcnIsIGRpZ2l0cyk7CisgICAgICBDUFBVTklUX0FTU0VSVCggKGVyciAmIChpb3NfYmFzZTo6ZmFpbGJpdCB8IGlvc19iYXNlOjpiYWRiaXQpKSA9PSAwICk7CisgICAgICBDUFBVTklUX0FTU0VSVCggZGlnaXRzID09ICIxMjM0NTYiICk7CisgICAgfQorICB9CisKKyAgb3N0ci5zdHIoIiIpOworICAvL0NoZWNrIGEgbmVnYXRpdmUgdmFsdWUgKG5hdGlvbmFsIGZvcm1hdCkKKyAgeworICAgIENQUFVOSVRfQVNTRVJUKCAoaGFzX2ZhY2V0PG1vbmV5cHVuY3Q8Y2hhciwgZmFsc2U+ID4obG9jKSkgKTsKKyAgICBtb25leXB1bmN0PGNoYXIsIGZhbHNlPiBjb25zdCYgZG9tX2ZtcCA9IHVzZV9mYWNldDxtb25leXB1bmN0PGNoYXIsIGZhbHNlPiA+KGxvYyk7CisgICAgc3RyaW5nIHN0cl9yZXM7CisgICAgLy9DaGVjayBtb25leV9wdXQKKyAgICB7CisgICAgICBvc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4gcmVzID0gZm1wLnB1dChvc3RyLCBmYWxzZSwgb3N0ciwgJyAnLCAtMTIzNDU2KTsKKworICAgICAgQ1BQVU5JVF9BU1NFUlQoICFyZXMuZmFpbGVkKCkgKTsKKyAgICAgIHN0cl9yZXMgPSBvc3RyLnN0cigpOworICAgICAgLy9DUFBVTklUX01FU1NBR0Uoc3RyX3Jlcy5jX3N0cigpKTsKKworICAgICAgc2l6ZV90IGZpZWxkSW5kZXggPSAwOworICAgICAgc2l6ZV90IGluZGV4ID0gMDsKKworICAgICAgaWYgKGRvbV9mbXAubmVnX2Zvcm1hdCgpLmZpZWxkW2ZpZWxkSW5kZXhdID09IG1vbmV5X2Jhc2U6OnNpZ24pIHsKKyAgICAgICAgQ1BQVU5JVF9BU1NFUlQoIHN0cl9yZXMuc3Vic3RyKGluZGV4LCBkb21fZm1wLm5lZ2F0aXZlX3NpZ24oKS5zaXplKCkpID09IGRvbV9mbXAubmVnYXRpdmVfc2lnbigpICk7CisgICAgICAgIGluZGV4ICs9IGRvbV9mbXAubmVnYXRpdmVfc2lnbigpLnNpemUoKTsKKyAgICAgICAgKytmaWVsZEluZGV4OworICAgICAgfQorCisgICAgICBzdHJpbmc6OnNpemVfdHlwZSBwID0gc3RybGVuKCBybC5tb25leV9wcmVmaXggKTsKKyAgICAgIGlmIChwICE9IDApIHsKKyAgICAgICAgQ1BQVU5JVF9BU1NFUlQoIHN0cl9yZXMuc3Vic3RyKGluZGV4LCBwKSA9PSBybC5tb25leV9wcmVmaXggKTsKKyAgICAgICAgaW5kZXggKz0gcDsKKyAgICAgICAgKytmaWVsZEluZGV4OworICAgICAgfQorICAgICAgaWYgKGRvbV9mbXAubmVnX2Zvcm1hdCgpLmZpZWxkW2ZpZWxkSW5kZXhdID09IG1vbmV5X2Jhc2U6OnNwYWNlIHx8CisgICAgICAgICAgZG9tX2ZtcC5uZWdfZm9ybWF0KCkuZmllbGRbZmllbGRJbmRleF0gPT0gbW9uZXlfYmFzZTo6bm9uZSkgeworICAgICAgICBDUFBVTklUX0FTU0VSVCggc3RyX3Jlc1tpbmRleCsrXSA9PSAnICcgKTsKKyAgICAgICAgKytmaWVsZEluZGV4OworICAgICAgfQorCisgICAgICBDUFBVTklUX0FTU0VSVCggc3RyX3Jlc1tpbmRleCsrXSA9PSAnMScgKTsKKyAgICAgIGlmICghZG9tX2ZtcC5ncm91cGluZygpLmVtcHR5KCkpIHsKKyAgICAgICAgQ1BQVU5JVF9BU1NFUlQoIHN0cl9yZXNbaW5kZXgrK10gPT0gZG9tX2ZtcC50aG91c2FuZHNfc2VwKCkgKTsKKyAgICAgIH0KKyAgICAgIENQUFVOSVRfQVNTRVJUKCBzdHJfcmVzW2luZGV4KytdID09ICcyJyApOworICAgICAgQ1BQVU5JVF9BU1NFUlQoIHN0cl9yZXNbaW5kZXgrK10gPT0gJzMnICk7CisgICAgICBDUFBVTklUX0FTU0VSVCggc3RyX3Jlc1tpbmRleCsrXSA9PSAnNCcgKTsKKyAgICAgIGlmIChkb21fZm1wLmZyYWNfZGlnaXRzKCkgIT0gMCkgeworICAgICAgICBDUFBVTklUX0FTU0VSVCggc3RyX3Jlc1tpbmRleCsrXSA9PSBkb21fZm1wLmRlY2ltYWxfcG9pbnQoKSApOworICAgICAgfQorICAgICAgQ1BQVU5JVF9BU1NFUlQoIHN0cl9yZXNbaW5kZXgrK10gPT0gJzUnICk7CisgICAgICBDUFBVTklUX0FTU0VSVCggc3RyX3Jlc1tpbmRleCsrXSA9PSAnNicgKTsKKyAgICAgICsrZmllbGRJbmRleDsKKworICAgICAgLy9zcGFjZSBjYW5ub3QgYmUgbGFzdDoKKyAgICAgIGlmICgoZmllbGRJbmRleCA8IDMpICYmCisgICAgICAgICAgZG9tX2ZtcC5uZWdfZm9ybWF0KCkuZmllbGRbZmllbGRJbmRleF0gPT0gbW9uZXlfYmFzZTo6c3BhY2UpIHsKKyAgICAgICAgQ1BQVU5JVF9BU1NFUlQoIHN0cl9yZXNbaW5kZXgrK10gPT0gJyAnICk7CisgICAgICAgICsrZmllbGRJbmRleDsKKyAgICAgIH0KKworICAgICAgaWYgKGZpZWxkSW5kZXggPT0gMykgeworICAgICAgICAvL0lmIG5vbmUgaXMgbGFzdCB3ZSBzaG91bGQgbm90IGFkZCBhbnl0aGluZyB0byB0aGUgcmVzdWx0aW5nIHN0cmluZzoKKyAgICAgICAgaWYgKGRvbV9mbXAubmVnX2Zvcm1hdCgpLmZpZWxkW2ZpZWxkSW5kZXhdID09IG1vbmV5X2Jhc2U6Om5vbmUpIHsKKyAgICAgICAgICBDUFBVTklUX0FTU0VSVCggaW5kZXggPT0gc3RyX3Jlcy5zaXplKCkgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBDUFBVTklUX0FTU0VSVCggZG9tX2ZtcC5uZWdfZm9ybWF0KCkuZmllbGRbZmllbGRJbmRleF0gPT0gbW9uZXlfYmFzZTo6c3ltYm9sICk7CisgICAgICAgICAgQ1BQVU5JVF9BU1NFUlQoIHN0cl9yZXMuc3Vic3RyKGluZGV4LCBzdHJsZW4ocmwubW9uZXlfc3VmZml4KSkgPT0gcmwubW9uZXlfc3VmZml4ICk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvL21vbmV5X2dldAorICAgIHsKKyAgICAgIGlvc19iYXNlOjppb3N0YXRlIGVyciA9IGlvc19iYXNlOjpnb29kYml0OworIyAgaWYgZGVmaW5lZCAoU1RMUE9SVCkKKyAgICAgIF9TVExQX0xPTkdFU1RfRkxPQVRfVFlQRSB2YWw7CisjICBlbHNlCisgICAgICBsb25nIGRvdWJsZSB2YWw7CisjICBlbmRpZgorCisgICAgICBpc3RyaW5nc3RyZWFtIGlzdHIoc3RyX3Jlcyk7CisgICAgICBmbWcuZ2V0KGlzdHIsIGlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPigpLCBmYWxzZSwgb3N0ciwgZXJyLCB2YWwpOworICAgICAgQ1BQVU5JVF9BU1NFUlQoIChlcnIgJiAoaW9zX2Jhc2U6OmZhaWxiaXQgfCBpb3NfYmFzZTo6YmFkYml0KSkgPT0gMCApOworICAgICAgaWYgKGRvbV9mbXAubmVnYXRpdmVfc2lnbigpLmVtcHR5KCkpIHsKKyAgICAgICAgLy9XaXRob3V0IG5lZ2F0aXZlIHNpZ24gdGhlcmUgaXMgbm8gd2F5IHRvIGd1ZXNzIHRoZSByZXN1bHRpbmcgYW1vdW50IHNpZ24gKCJDIiBsb2NhbGUpOgorICAgICAgICBDUFBVTklUX0FTU0VSVCggdmFsID09IDEyMzQ1NiApOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIENQUFVOSVRfQVNTRVJUKCB2YWwgPT0gLTEyMzQ1NiApOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisKKy8vIFRlc3QgZm9yIGJ1ZyBpbiBjYXNlIHdoZW4gbnVtYmVyIG9mIGRpZ2l0cyBpbiB2YWx1ZSBsZXNzIHRoZW4gbnVtYmVyCisvLyBvZiBkaWdpdHMgaW4gZnJhY3Rpb24uIEkuZS4gJzknIHNob3VsZCBiZSBwcmludGVkIGFzICcwLjA5JywKKy8vIGlmIHguZnJhY19kaWdpdHMoKSA9PSAyLgorCit2b2lkIExvY2FsZVRlc3Q6Ol9tb25leV9wdXRfWF9idWcoIGNvbnN0IGxvY2FsZSYgbG9jLCBjb25zdCByZWZfbW9uZXRhcnkqIHBybCApCit7CisgIGNvbnN0IHJlZl9tb25ldGFyeSAmcmwgPSAqcHJsOworICBDUFBVTklUX0FTU0VSVCggaGFzX2ZhY2V0PG1vbmV5X3B1dDxjaGFyPiA+KGxvYykgKTsKKyAgbW9uZXlfcHV0PGNoYXI+IGNvbnN0JiBmbXAgPSB1c2VfZmFjZXQ8bW9uZXlfcHV0PGNoYXI+ID4obG9jKTsKKworICBvc3RyaW5nc3RyZWFtIG9zdHI7CisgIG9zdHIuaW1idWUobG9jKTsKKyAgb3N0ciA8PCBzaG93YmFzZTsKKworICAvLyBvc3RyLnN0cigiIik7CisgIC8vIENoZWNrIHZhbHVlIHdpdGggb25lIGRlY2ltYWwgZGlnaXQ6CisgIHsKKyAgICBDUFBVTklUX0FTU0VSVCggKGhhc19mYWNldDxtb25leXB1bmN0PGNoYXIsIGZhbHNlPiA+KGxvYykpICk7CisgICAgbW9uZXlwdW5jdDxjaGFyLCBmYWxzZT4gY29uc3QmIGRvbV9mbXAgPSB1c2VfZmFjZXQ8bW9uZXlwdW5jdDxjaGFyLCBmYWxzZT4gPihsb2MpOworICAgIHN0cmluZyBzdHJfcmVzOworICAgIC8vIENoZWNrIG1vbmV5X3B1dAorICAgIHsKKyAgICAgIG9zdHJlYW1idWZfaXRlcmF0b3I8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiByZXMgPSBmbXAucHV0KG9zdHIsIGZhbHNlLCBvc3RyLCAnICcsIDkpOworCisgICAgICBDUFBVTklUX0FTU0VSVCggIXJlcy5mYWlsZWQoKSApOworICAgICAgc3RyX3JlcyA9IG9zdHIuc3RyKCk7CisKKyAgICAgIHNpemVfdCBmaWVsZEluZGV4ID0gMDsKKyAgICAgIHNpemVfdCBpbmRleCA9IDA7CisKKyAgICAgIGlmIChkb21fZm1wLnBvc19mb3JtYXQoKS5maWVsZFtmaWVsZEluZGV4XSA9PSBtb25leV9iYXNlOjpzaWduKSB7CisgICAgICAgIENQUFVOSVRfQVNTRVJUKCBzdHJfcmVzLnN1YnN0cihpbmRleCwgZG9tX2ZtcC5wb3NpdGl2ZV9zaWduKCkuc2l6ZSgpKSA9PSBkb21fZm1wLnBvc2l0aXZlX3NpZ24oKSApOworICAgICAgICBpbmRleCArPSBkb21fZm1wLnBvc2l0aXZlX3NpZ24oKS5zaXplKCk7CisgICAgICAgICsrZmllbGRJbmRleDsKKyAgICAgIH0KKworICAgICAgc3RyaW5nOjpzaXplX3R5cGUgcCA9IHN0cmxlbiggcmwubW9uZXlfcHJlZml4ICk7CisgICAgICBpZiAocCAhPSAwKSB7CisgICAgICAgIENQUFVOSVRfQVNTRVJUKCBzdHJfcmVzLnN1YnN0cihpbmRleCwgcCkgPT0gcmwubW9uZXlfcHJlZml4ICk7CisgICAgICAgIGluZGV4ICs9IHA7CisgICAgICAgICsrZmllbGRJbmRleDsKKyAgICAgIH0KKyAgICAgIGlmIChkb21fZm1wLm5lZ19mb3JtYXQoKS5maWVsZFtmaWVsZEluZGV4XSA9PSBtb25leV9iYXNlOjpzcGFjZSB8fAorICAgICAgICAgIGRvbV9mbXAubmVnX2Zvcm1hdCgpLmZpZWxkW2ZpZWxkSW5kZXhdID09IG1vbmV5X2Jhc2U6Om5vbmUpIHsKKyAgICAgICAgQ1BQVU5JVF9BU1NFUlQoIHN0cl9yZXNbaW5kZXgrK10gPT0gJyAnICk7CisgICAgICAgICsrZmllbGRJbmRleDsKKyAgICAgIH0KKyAgICAgIGlmIChkb21fZm1wLmZyYWNfZGlnaXRzKCkgIT0gMCkgeworICAgICAgICBDUFBVTklUX0FTU0VSVCggc3RyX3Jlc1tpbmRleCsrXSA9PSAnMCcgKTsKKyAgICAgICAgQ1BQVU5JVF9BU1NFUlQoIHN0cl9yZXNbaW5kZXgrK10gPT0gZG9tX2ZtcC5kZWNpbWFsX3BvaW50KCkgKTsKKyAgICAgICAgZm9yICggaW50IGZkID0gMTsgZmQgPCBkb21fZm1wLmZyYWNfZGlnaXRzKCk7ICsrZmQgKSB7CisgICAgICAgICAgQ1BQVU5JVF9BU1NFUlQoIHN0cl9yZXNbaW5kZXgrK10gPT0gJzAnICk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIENQUFVOSVRfQVNTRVJUKCBzdHJfcmVzW2luZGV4KytdID09ICc5JyApOworICAgICAgKytmaWVsZEluZGV4OworCisgICAgICAvL3NwYWNlIGNhbm5vdCBiZSBsYXN0OgorICAgICAgaWYgKChmaWVsZEluZGV4IDwgMykgJiYKKyAgICAgICAgICBkb21fZm1wLm5lZ19mb3JtYXQoKS5maWVsZFtmaWVsZEluZGV4XSA9PSBtb25leV9iYXNlOjpzcGFjZSkgeworICAgICAgICBDUFBVTklUX0FTU0VSVCggc3RyX3Jlc1tpbmRleCsrXSA9PSAnICcgKTsKKyAgICAgICAgKytmaWVsZEluZGV4OworICAgICAgfQorCisgICAgICBpZiAoZmllbGRJbmRleCA9PSAzKSB7CisgICAgICAgIC8vSWYgbm9uZSBpcyBsYXN0IHdlIHNob3VsZCBub3QgYWRkIGFueXRoaW5nIHRvIHRoZSByZXN1bHRpbmcgc3RyaW5nOgorICAgICAgICBpZiAoZG9tX2ZtcC5uZWdfZm9ybWF0KCkuZmllbGRbZmllbGRJbmRleF0gPT0gbW9uZXlfYmFzZTo6bm9uZSkgeworICAgICAgICAgIENQUFVOSVRfQVNTRVJUKCBpbmRleCA9PSBzdHJfcmVzLnNpemUoKSApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIENQUFVOSVRfQVNTRVJUKCBkb21fZm1wLm5lZ19mb3JtYXQoKS5maWVsZFtmaWVsZEluZGV4XSA9PSBtb25leV9iYXNlOjpzeW1ib2wgKTsKKyAgICAgICAgICBDUFBVTklUX0FTU0VSVCggc3RyX3Jlcy5zdWJzdHIoaW5kZXgsIHN0cmxlbihybC5tb25leV9zdWZmaXgpKSA9PSBybC5tb25leV9zdWZmaXggKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIG9zdHIuc3RyKCIiKTsKKyAgLy8gQ2hlY2sgdmFsdWUgd2l0aCB0d28gZGVjaW1hbCBkaWdpdDoKKyAgeworICAgIENQUFVOSVRfQVNTRVJUKCAoaGFzX2ZhY2V0PG1vbmV5cHVuY3Q8Y2hhciwgZmFsc2U+ID4obG9jKSkgKTsKKyAgICBtb25leXB1bmN0PGNoYXIsIGZhbHNlPiBjb25zdCYgZG9tX2ZtcCA9IHVzZV9mYWNldDxtb25leXB1bmN0PGNoYXIsIGZhbHNlPiA+KGxvYyk7CisgICAgc3RyaW5nIHN0cl9yZXM7CisgICAgLy8gQ2hlY2sgbW9uZXlfcHV0CisgICAgeworICAgICAgb3N0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+IHJlcyA9IGZtcC5wdXQob3N0ciwgZmFsc2UsIG9zdHIsICcgJywgOTApOworCisgICAgICBDUFBVTklUX0FTU0VSVCggIXJlcy5mYWlsZWQoKSApOworICAgICAgc3RyX3JlcyA9IG9zdHIuc3RyKCk7CisKKyAgICAgIHNpemVfdCBmaWVsZEluZGV4ID0gMDsKKyAgICAgIHNpemVfdCBpbmRleCA9IDA7CisKKyAgICAgIGlmIChkb21fZm1wLnBvc19mb3JtYXQoKS5maWVsZFtmaWVsZEluZGV4XSA9PSBtb25leV9iYXNlOjpzaWduKSB7CisgICAgICAgIENQUFVOSVRfQVNTRVJUKCBzdHJfcmVzLnN1YnN0cihpbmRleCwgZG9tX2ZtcC5wb3NpdGl2ZV9zaWduKCkuc2l6ZSgpKSA9PSBkb21fZm1wLnBvc2l0aXZlX3NpZ24oKSApOworICAgICAgICBpbmRleCArPSBkb21fZm1wLnBvc2l0aXZlX3NpZ24oKS5zaXplKCk7CisgICAgICAgICsrZmllbGRJbmRleDsKKyAgICAgIH0KKworICAgICAgc3RyaW5nOjpzaXplX3R5cGUgcCA9IHN0cmxlbiggcmwubW9uZXlfcHJlZml4ICk7CisgICAgICBpZiAocCAhPSAwKSB7CisgICAgICAgIENQUFVOSVRfQVNTRVJUKCBzdHJfcmVzLnN1YnN0cihpbmRleCwgcCkgPT0gcmwubW9uZXlfcHJlZml4ICk7CisgICAgICAgIGluZGV4ICs9IHA7CisgICAgICAgICsrZmllbGRJbmRleDsKKyAgICAgIH0KKyAgICAgIGlmIChkb21fZm1wLm5lZ19mb3JtYXQoKS5maWVsZFtmaWVsZEluZGV4XSA9PSBtb25leV9iYXNlOjpzcGFjZSB8fAorICAgICAgICAgIGRvbV9mbXAubmVnX2Zvcm1hdCgpLmZpZWxkW2ZpZWxkSW5kZXhdID09IG1vbmV5X2Jhc2U6Om5vbmUpIHsKKyAgICAgICAgQ1BQVU5JVF9BU1NFUlQoIHN0cl9yZXNbaW5kZXgrK10gPT0gJyAnICk7CisgICAgICAgICsrZmllbGRJbmRleDsKKyAgICAgIH0KKyAgICAgIGlmIChkb21fZm1wLmZyYWNfZGlnaXRzKCkgIT0gMCkgeworICAgICAgICBDUFBVTklUX0FTU0VSVCggc3RyX3Jlc1tpbmRleCsrXSA9PSAnMCcgKTsKKyAgICAgICAgQ1BQVU5JVF9BU1NFUlQoIHN0cl9yZXNbaW5kZXgrK10gPT0gZG9tX2ZtcC5kZWNpbWFsX3BvaW50KCkgKTsKKyAgICAgICAgZm9yICggaW50IGZkID0gMTsgZmQgPCBkb21fZm1wLmZyYWNfZGlnaXRzKCkgLSAxOyArK2ZkICkgeworICAgICAgICAgIENQUFVOSVRfQVNTRVJUKCBzdHJfcmVzW2luZGV4KytdID09ICcwJyApOworICAgICAgICB9CisgICAgICB9CisgICAgICBDUFBVTklUX0FTU0VSVCggc3RyX3Jlc1tpbmRleCsrXSA9PSAnOScgKTsKKyAgICAgIGlmIChkb21fZm1wLmZyYWNfZGlnaXRzKCkgIT0gMCkgeworICAgICAgICBDUFBVTklUX0FTU0VSVCggc3RyX3Jlc1tpbmRleCsrXSA9PSAnMCcgKTsKKyAgICAgIH0KKyAgICAgICsrZmllbGRJbmRleDsKKworICAgICAgLy9zcGFjZSBjYW5ub3QgYmUgbGFzdDoKKyAgICAgIGlmICgoZmllbGRJbmRleCA8IDMpICYmCisgICAgICAgICAgZG9tX2ZtcC5uZWdfZm9ybWF0KCkuZmllbGRbZmllbGRJbmRleF0gPT0gbW9uZXlfYmFzZTo6c3BhY2UpIHsKKyAgICAgICAgQ1BQVU5JVF9BU1NFUlQoIHN0cl9yZXNbaW5kZXgrK10gPT0gJyAnICk7CisgICAgICAgICsrZmllbGRJbmRleDsKKyAgICAgIH0KKworICAgICAgaWYgKGZpZWxkSW5kZXggPT0gMykgeworICAgICAgICAvL0lmIG5vbmUgaXMgbGFzdCB3ZSBzaG91bGQgbm90IGFkZCBhbnl0aGluZyB0byB0aGUgcmVzdWx0aW5nIHN0cmluZzoKKyAgICAgICAgaWYgKGRvbV9mbXAubmVnX2Zvcm1hdCgpLmZpZWxkW2ZpZWxkSW5kZXhdID09IG1vbmV5X2Jhc2U6Om5vbmUpIHsKKyAgICAgICAgICBDUFBVTklUX0FTU0VSVCggaW5kZXggPT0gc3RyX3Jlcy5zaXplKCkgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBDUFBVTklUX0FTU0VSVCggZG9tX2ZtcC5uZWdfZm9ybWF0KCkuZmllbGRbZmllbGRJbmRleF0gPT0gbW9uZXlfYmFzZTo6c3ltYm9sICk7CisgICAgICAgICAgQ1BQVU5JVF9BU1NFUlQoIHN0cl9yZXMuc3Vic3RyKGluZGV4LCBzdHJsZW4ocmwubW9uZXlfc3VmZml4KSkgPT0gcmwubW9uZXlfc3VmZml4ICk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwordHlwZWRlZiB2b2lkIChMb2NhbGVUZXN0OjoqX1Rlc3QpIChjb25zdCBsb2NhbGUmLCBjb25zdCByZWZfbW9uZXRhcnkqKTsKK3N0YXRpYyB2b2lkIHRlc3Rfc3VwcG9ydGVkX2xvY2FsZShMb2NhbGVUZXN0JiBpbnN0LCBfVGVzdCBfX3Rlc3QpIHsKKyAgc2l6ZV90IG4gPSBzaXplb2YodGVzdGVkX2xvY2FsZXMpIC8gc2l6ZW9mKHRlc3RlZF9sb2NhbGVzWzBdKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuOyArK2kpIHsKKyAgICBsb2NhbGUgbG9jOworIyAgaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IGRlZmluZWQgKF9TVExQX1VTRV9FWENFUFRJT05TKQorICAgIHRyeQorIyAgZW5kaWYKKyAgICB7CisgICAgICBsb2NhbGUgdG1wKHRlc3RlZF9sb2NhbGVzW2ldLm5hbWUpOworICAgICAgbG9jID0gdG1wOworICAgIH0KKyMgIGlmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkIChfU1RMUF9VU0VfRVhDRVBUSU9OUykKKyAgICBjYXRjaCAocnVudGltZV9lcnJvciBjb25zdCYpIHsKKyAgICAgIC8vVGhpcyBsb2NhbGUgaXMgbm90IHN1cHBvcnRlZC4KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyMgIGVuZGlmCisgICAgQ1BQVU5JVF9NRVNTQUdFKCBsb2MubmFtZSgpLmNfc3RyKCkgKTsKKyAgICAoaW5zdC4qX190ZXN0KShsb2MsIHRlc3RlZF9sb2NhbGVzICsgaSk7CisKKyAgICB7CisgICAgICBsb2NhbGUgdG1wKGxvY2FsZTo6Y2xhc3NpYygpLCB0ZXN0ZWRfbG9jYWxlc1tpXS5uYW1lLCBsb2NhbGU6Om1vbmV0YXJ5KTsKKyAgICAgIGxvYyA9IHRtcDsKKyAgICB9CisgICAgKGluc3QuKl9fdGVzdCkobG9jLCB0ZXN0ZWRfbG9jYWxlcyArIGkpOworCisgICAgeworICAgICAgbG9jYWxlIHRtcDAobG9jYWxlOjpjbGFzc2ljKCksIG5ldyBtb25leXB1bmN0X2J5bmFtZTxjaGFyLCB0cnVlPih0ZXN0ZWRfbG9jYWxlc1tpXS5uYW1lKSk7CisgICAgICBsb2NhbGUgdG1wMSh0bXAwLCBuZXcgbW9uZXlwdW5jdF9ieW5hbWU8Y2hhciwgZmFsc2U+KHRlc3RlZF9sb2NhbGVzW2ldLm5hbWUpKTsKKyAgICAgIGxvYyA9IHRtcDE7CisgICAgfQorICAgIChpbnN0LipfX3Rlc3QpKGxvYywgdGVzdGVkX2xvY2FsZXMgKyBpKTsKKyAgfQorfQorCit2b2lkIExvY2FsZVRlc3Q6Om1vbmV5X3B1dF9nZXQoKQoreyB0ZXN0X3N1cHBvcnRlZF9sb2NhbGUoKnRoaXMsICZMb2NhbGVUZXN0OjpfbW9uZXlfcHV0X2dldCk7IH0KKwordm9pZCBMb2NhbGVUZXN0Ojptb25leV9wdXRfWF9idWcoKQoreyB0ZXN0X3N1cHBvcnRlZF9sb2NhbGUoKnRoaXMsICZMb2NhbGVUZXN0OjpfbW9uZXlfcHV0X1hfYnVnKTsgfQorCit2b2lkIExvY2FsZVRlc3Q6Om1vbmV5cHVuY3RfYnlfbmFtZSgpCit7CisgIC8qCisgICAqIENoZWNrIG9mIHRoZSAyMi4xLjEuMi43IHN0YW5kYXJkIHBvaW50LiBDb25zdHJ1Y3Rpb24gb2YgYSBsb2NhbGUKKyAgICogaW5zdGFuY2UgZnJvbSBhIG51bGwgcG9pbnRlciBvciBhbiB1bmtub3duIG5hbWUgc2hvdWxkIHJlc3VsdCBpbgorICAgKiBhIHJ1bnRpbWVfZXJyb3IgZXhjZXB0aW9uLgorICAgKi8KKyMgIGlmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkIChfU1RMUF9VU0VfRVhDRVBUSU9OUykKKyMgICAgaWYgZGVmaW5lZCAoU1RMUE9SVCkgfHwgIWRlZmluZWQgKF9fR05VQ19fKQorICB0cnkgeworICAgIGxvY2FsZSBsb2MobG9jYWxlOjpjbGFzc2ljKCksIG5ldyBtb25leXB1bmN0X2J5bmFtZTxjaGFyLCB0cnVlPihzdGF0aWNfY2FzdDxjaGFyIGNvbnN0Kj4oMCkpKTsKKyAgICBDUFBVTklUX0ZBSUw7CisgIH0KKyAgY2F0Y2ggKHJ1bnRpbWVfZXJyb3IgY29uc3QmKSB7CisgIH0KKyAgY2F0Y2ggKC4uLikgeworICAgIENQUFVOSVRfRkFJTDsKKyAgfQorIyAgICBlbmRpZgorCisgIHRyeSB7CisgICAgbG9jYWxlIGxvYyhsb2NhbGU6OmNsYXNzaWMoKSwgbmV3IG1vbmV5cHVuY3RfYnluYW1lPGNoYXIsIHRydWU+KCJ5YXNsaV9sYW5ndWFnZSIpKTsKKyAgICBDUFBVTklUX0ZBSUw7CisgIH0KKyAgY2F0Y2ggKHJ1bnRpbWVfZXJyb3IgY29uc3QmKSB7CisgIH0KKyAgY2F0Y2ggKC4uLikgeworICAgIENQUFVOSVRfRkFJTDsKKyAgfQorCisgIHRyeSB7CisgICAgc3RyaW5nIHZlcnlMb25nRmFjZXROYW1lKCJMQ19NT05FVEFSWT0iKTsKKyAgICB2ZXJ5TG9uZ0ZhY2V0TmFtZS5hcHBlbmQoNTEyLCAnPycpOworICAgIGxvY2FsZSBsb2MobG9jYWxlOjpjbGFzc2ljKCksIG5ldyBtb25leXB1bmN0X2J5bmFtZTxjaGFyLCB0cnVlPih2ZXJ5TG9uZ0ZhY2V0TmFtZS5jX3N0cigpKSk7CisgICAgQ1BQVU5JVF9GQUlMOworICB9CisgIGNhdGNoIChydW50aW1lX2Vycm9yIGNvbnN0JiAvKiBlICovKSB7CisgICAgLy9DUFBVTklUX01FU1NBR0UoIGUud2hhdCgpICk7CisgIH0KKyAgY2F0Y2ggKC4uLikgeworICAgIENQUFVOSVRfRkFJTDsKKyAgfQorCisjICAgIGlmIGRlZmluZWQgKFNUTFBPUlQpIHx8ICFkZWZpbmVkIChfX0dOVUNfXykKKyAgdHJ5IHsKKyAgICBsb2NhbGUgbG9jKGxvY2FsZTo6Y2xhc3NpYygpLCBuZXcgbW9uZXlwdW5jdF9ieW5hbWU8Y2hhciwgZmFsc2U+KHN0YXRpY19jYXN0PGNoYXIgY29uc3QqPigwKSkpOworICAgIENQUFVOSVRfRkFJTDsKKyAgfQorICBjYXRjaCAocnVudGltZV9lcnJvciBjb25zdCYpIHsKKyAgfQorICBjYXRjaCAoLi4uKSB7CisgICAgQ1BQVU5JVF9GQUlMOworICB9CisjICAgIGVuZGlmCisKKyAgdHJ5IHsKKyAgICBsb2NhbGUgbG9jKGxvY2FsZTo6Y2xhc3NpYygpLCBuZXcgbW9uZXlwdW5jdF9ieW5hbWU8Y2hhciwgZmFsc2U+KCJ5YXNsaV9sYW5ndWFnZSIpKTsKKyAgICBDUFBVTklUX0ZBSUw7CisgIH0KKyAgY2F0Y2ggKHJ1bnRpbWVfZXJyb3IgY29uc3QmKSB7CisgIH0KKyAgY2F0Y2ggKC4uLikgeworICAgIENQUFVOSVRfRkFJTDsKKyAgfQorCisgIHRyeSB7CisgICAgc3RyaW5nIHZlcnlMb25nRmFjZXROYW1lKCJMQ19NT05FVEFSWT0iKTsKKyAgICB2ZXJ5TG9uZ0ZhY2V0TmFtZS5hcHBlbmQoNTEyLCAnPycpOworICAgIGxvY2FsZSBsb2MobG9jYWxlOjpjbGFzc2ljKCksIG5ldyBtb25leXB1bmN0X2J5bmFtZTxjaGFyLCBmYWxzZT4odmVyeUxvbmdGYWNldE5hbWUuY19zdHIoKSkpOworICAgIENQUFVOSVRfRkFJTDsKKyAgfQorICBjYXRjaCAocnVudGltZV9lcnJvciBjb25zdCYgLyogZSAqLykgeworICAgIC8vQ1BQVU5JVF9NRVNTQUdFKCBlLndoYXQoKSApOworICB9CisgIGNhdGNoICguLi4pIHsKKyAgICBDUFBVTklUX0ZBSUw7CisgIH0KKworICB0cnkgeworICAgIGxvY2FsZSBsb2MobG9jYWxlOjpjbGFzc2ljKCksIG5ldyBtb25leXB1bmN0X2J5bmFtZTxjaGFyLCBmYWxzZT4oIkMiKSk7CisgICAgbW9uZXlwdW5jdDxjaGFyLCBmYWxzZT4gY29uc3QmIGNmYWNldF9ieW5hbWUgPSB1c2VfZmFjZXQ8bW9uZXlwdW5jdDxjaGFyLCBmYWxzZT4gPihsb2MpOworICAgIG1vbmV5cHVuY3Q8Y2hhciwgZmFsc2U+IGNvbnN0JiBjZmFjZXQgPSB1c2VfZmFjZXQ8bW9uZXlwdW5jdDxjaGFyLCBmYWxzZT4gPihsb2NhbGU6OmNsYXNzaWMoKSk7CisKKyAgICBtb25leV9iYXNlOjpwYXR0ZXJuIGNwID0gY2ZhY2V0LnBvc19mb3JtYXQoKTsKKyAgICBtb25leV9iYXNlOjpwYXR0ZXJuIGNwX2JuID0gY2ZhY2V0X2J5bmFtZS5wb3NfZm9ybWF0KCk7CisgICAgQ1BQVU5JVF9DSEVDSyggY3BfYm4uZmllbGRbMF0gPT0gY3AuZmllbGRbMF0gKTsKKyAgICBDUFBVTklUX0NIRUNLKCBjcF9ibi5maWVsZFsxXSA9PSBjcC5maWVsZFsxXSApOworICAgIENQUFVOSVRfQ0hFQ0soIGNwX2JuLmZpZWxkWzJdID09IGNwLmZpZWxkWzJdICk7CisgICAgQ1BQVU5JVF9DSEVDSyggY3BfYm4uZmllbGRbM10gPT0gY3AuZmllbGRbM10gKTsKKworICAgIENQUFVOSVRfQ0hFQ0soIGNmYWNldF9ieW5hbWUuZnJhY19kaWdpdHMoKSA9PSBjZmFjZXQuZnJhY19kaWdpdHMoKSApOworICAgIGlmIChjZmFjZXRfYnluYW1lLmZyYWNfZGlnaXRzKCkgIT0gMCkKKyAgICAgIENQUFVOSVRfQ0hFQ0soIGNmYWNldF9ieW5hbWUuZGVjaW1hbF9wb2ludCgpID09IGNmYWNldC5kZWNpbWFsX3BvaW50KCkgKTsKKyAgICBDUFBVTklUX0NIRUNLKCBjZmFjZXRfYnluYW1lLmdyb3VwaW5nKCkgPT0gY2ZhY2V0Lmdyb3VwaW5nKCkgKTsKKyAgICBpZiAoIWNmYWNldF9ieW5hbWUuZ3JvdXBpbmcoKS5lbXB0eSgpKQorICAgICAgQ1BQVU5JVF9DSEVDSyggY2ZhY2V0X2J5bmFtZS50aG91c2FuZHNfc2VwKCkgPT0gY2ZhY2V0LnRob3VzYW5kc19zZXAoKSApOworICAgIENQUFVOSVRfQ0hFQ0soIGNmYWNldF9ieW5hbWUucG9zaXRpdmVfc2lnbigpID09IGNmYWNldC5wb3NpdGl2ZV9zaWduKCkgKTsKKyAgICBDUFBVTklUX0NIRUNLKCBjZmFjZXRfYnluYW1lLm5lZ2F0aXZlX3NpZ24oKSA9PSBjZmFjZXQubmVnYXRpdmVfc2lnbigpICk7CisgIH0KKyAgY2F0Y2ggKHJ1bnRpbWVfZXJyb3IgY29uc3QmIC8qIGUgKi8pIHsKKyAgICAvKiBDUFBVTklUX01FU1NBR0UoIGUud2hhdCgpICk7ICovCisgICAgQ1BQVU5JVF9GQUlMOworICB9CisgIGNhdGNoICguLi4pIHsKKyAgICBDUFBVTklUX0ZBSUw7CisgIH0KKworICB0cnkgeworICAgIGxvY2FsZSBsb2MobG9jYWxlOjpjbGFzc2ljKCksIG5ldyBtb25leXB1bmN0X2J5bmFtZTxjaGFyLCB0cnVlPigiQyIpKTsKKyAgICBtb25leXB1bmN0PGNoYXIsIHRydWU+IGNvbnN0JiBjZmFjZXRfYnluYW1lID0gdXNlX2ZhY2V0PG1vbmV5cHVuY3Q8Y2hhciwgdHJ1ZT4gPihsb2MpOworICAgIG1vbmV5cHVuY3Q8Y2hhciwgdHJ1ZT4gY29uc3QmIGNmYWNldCA9IHVzZV9mYWNldDxtb25leXB1bmN0PGNoYXIsIHRydWU+ID4obG9jYWxlOjpjbGFzc2ljKCkpOworCisgICAgbW9uZXlfYmFzZTo6cGF0dGVybiBjcCA9IGNmYWNldC5wb3NfZm9ybWF0KCk7CisgICAgbW9uZXlfYmFzZTo6cGF0dGVybiBjcF9ibiA9IGNmYWNldF9ieW5hbWUucG9zX2Zvcm1hdCgpOworICAgIENQUFVOSVRfQ0hFQ0soIGNwX2JuLmZpZWxkWzBdID09IGNwLmZpZWxkWzBdICk7CisgICAgQ1BQVU5JVF9DSEVDSyggY3BfYm4uZmllbGRbMV0gPT0gY3AuZmllbGRbMV0gKTsKKyAgICBDUFBVTklUX0NIRUNLKCBjcF9ibi5maWVsZFsyXSA9PSBjcC5maWVsZFsyXSApOworICAgIENQUFVOSVRfQ0hFQ0soIGNwX2JuLmZpZWxkWzNdID09IGNwLmZpZWxkWzNdICk7CisKKyAgICBDUFBVTklUX0NIRUNLKCBjZmFjZXRfYnluYW1lLmZyYWNfZGlnaXRzKCkgPT0gY2ZhY2V0LmZyYWNfZGlnaXRzKCkgKTsKKyAgICBpZiAoY2ZhY2V0X2J5bmFtZS5mcmFjX2RpZ2l0cygpICE9IDApCisgICAgICBDUFBVTklUX0NIRUNLKCBjZmFjZXRfYnluYW1lLmRlY2ltYWxfcG9pbnQoKSA9PSBjZmFjZXQuZGVjaW1hbF9wb2ludCgpICk7CisgICAgQ1BQVU5JVF9DSEVDSyggY2ZhY2V0X2J5bmFtZS5ncm91cGluZygpID09IGNmYWNldC5ncm91cGluZygpICk7CisgICAgaWYgKCFjZmFjZXRfYnluYW1lLmdyb3VwaW5nKCkuZW1wdHkoKSkKKyAgICAgIENQUFVOSVRfQ0hFQ0soIGNmYWNldF9ieW5hbWUudGhvdXNhbmRzX3NlcCgpID09IGNmYWNldC50aG91c2FuZHNfc2VwKCkgKTsKKyAgICBDUFBVTklUX0NIRUNLKCBjZmFjZXRfYnluYW1lLnBvc2l0aXZlX3NpZ24oKSA9PSBjZmFjZXQucG9zaXRpdmVfc2lnbigpICk7CisgICAgQ1BQVU5JVF9DSEVDSyggY2ZhY2V0X2J5bmFtZS5uZWdhdGl2ZV9zaWduKCkgPT0gY2ZhY2V0Lm5lZ2F0aXZlX3NpZ24oKSApOworICB9CisgIGNhdGNoIChydW50aW1lX2Vycm9yIGNvbnN0JiAvKiBlICovKSB7CisgICAgLyogQ1BQVU5JVF9NRVNTQUdFKCBlLndoYXQoKSApOyAqLworICAgIENQUFVOSVRfRkFJTDsKKyAgfQorICBjYXRjaCAoLi4uKSB7CisgICAgQ1BQVU5JVF9GQUlMOworICB9CisKKyAgdHJ5IHsKKyAgICAvLyBPbiBwbGF0Zm9ybSB3aXRob3V0IHJlYWwgbG9jYWxpemF0aW9uIHN1cHBvcnQgd2Ugc2hvdWxkIHJlbHkgb24gdGhlICJDIiBsb2NhbGUgZmFjZXQuCisgICAgbG9jYWxlIGxvYyhsb2NhbGU6OmNsYXNzaWMoKSwgbmV3IG1vbmV5cHVuY3RfYnluYW1lPGNoYXIsIGZhbHNlPigiIikpOworICB9CisgIGNhdGNoIChydW50aW1lX2Vycm9yIGNvbnN0JiAvKiBlICovKSB7CisgICAgLyogQ1BQVU5JVF9NRVNTQUdFKCBlLndoYXQoKSApOyAqLworICAgIENQUFVOSVRfRkFJTDsKKyAgfQorICBjYXRjaCAoLi4uKSB7CisgICAgQ1BQVU5JVF9GQUlMOworICB9CisKKyMgICAgaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8ICFkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQorIyAgICAgIGlmIGRlZmluZWQgKFNUTFBPUlQpIHx8ICFkZWZpbmVkIChfX0dOVUNfXykKKyAgdHJ5IHsKKyAgICBsb2NhbGUgbG9jKGxvY2FsZTo6Y2xhc3NpYygpLCBuZXcgbW9uZXlwdW5jdF9ieW5hbWU8d2NoYXJfdCwgdHJ1ZT4oc3RhdGljX2Nhc3Q8Y2hhciBjb25zdCo+KDApKSk7CisgICAgQ1BQVU5JVF9GQUlMOworICB9CisgIGNhdGNoIChydW50aW1lX2Vycm9yIGNvbnN0JikgeworICB9CisgIGNhdGNoICguLi4pIHsKKyAgICBDUFBVTklUX0ZBSUw7CisgIH0KKyMgICAgICBlbmRpZgorCisgIHRyeSB7CisgICAgbG9jYWxlIGxvYyhsb2NhbGU6OmNsYXNzaWMoKSwgbmV3IG1vbmV5cHVuY3RfYnluYW1lPHdjaGFyX3QsIHRydWU+KCJ5YXNsaV9sYW5ndWFnZSIpKTsKKyAgICBDUFBVTklUX0ZBSUw7CisgIH0KKyAgY2F0Y2ggKHJ1bnRpbWVfZXJyb3IgY29uc3QmKSB7CisgIH0KKyAgY2F0Y2ggKC4uLikgeworICAgIENQUFVOSVRfRkFJTDsKKyAgfQorCisjICAgICAgaWYgZGVmaW5lZCAoU1RMUE9SVCkgfHwgIWRlZmluZWQgKF9fR05VQ19fKQorICB0cnkgeworICAgIGxvY2FsZSBsb2MobG9jYWxlOjpjbGFzc2ljKCksIG5ldyBtb25leXB1bmN0X2J5bmFtZTx3Y2hhcl90LCBmYWxzZT4oc3RhdGljX2Nhc3Q8Y2hhciBjb25zdCo+KDApKSk7CisgICAgQ1BQVU5JVF9GQUlMOworICB9CisgIGNhdGNoIChydW50aW1lX2Vycm9yIGNvbnN0JikgeworICB9CisgIGNhdGNoICguLi4pIHsKKyAgICBDUFBVTklUX0ZBSUw7CisgIH0KKyMgICAgICBlbmRpZgorCisgIHRyeSB7CisgICAgbG9jYWxlIGxvYyhsb2NhbGU6OmNsYXNzaWMoKSwgbmV3IG1vbmV5cHVuY3RfYnluYW1lPHdjaGFyX3QsIGZhbHNlPigieWFzbGlfbGFuZ3VhZ2UiKSk7CisgICAgQ1BQVU5JVF9GQUlMOworICB9CisgIGNhdGNoIChydW50aW1lX2Vycm9yIGNvbnN0JikgeworICB9CisgIGNhdGNoICguLi4pIHsKKyAgICBDUFBVTklUX0ZBSUw7CisgIH0KKyMgICAgZW5kaWYKKyMgIGVuZGlmCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L211bHRpc2V0X3Rlc3QuY3BwIGIvdGVzdC91bml0L211bHRpc2V0X3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMzA5MTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvbXVsdGlzZXRfdGVzdC5jcHAKQEAgLTAsMCArMSwxMjcgQEAKKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKworI2luY2x1ZGUgImNwcHVuaXQvY3BwdW5pdF9wcm94eS5oIgorCisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IGRlZmluZWQoX1NUTFBfVVNFX05BTUVTUEFDRVMpCit1c2luZyBuYW1lc3BhY2Ugc3RkOworI2VuZGlmCisKKy8vCisvLyBUZXN0Q2FzZSBjbGFzcworLy8KK2NsYXNzIE11bHRpc2V0VGVzdCA6IHB1YmxpYyBDUFBVTklUX05TOjpUZXN0Q2FzZQoreworICB0eXBlZGVmIG11bHRpc2V0PGludCwgbGVzczxpbnQ+ID4gbXNldDsKKworICBDUFBVTklUX1RFU1RfU1VJVEUoTXVsdGlzZXRUZXN0KTsKKyAgQ1BQVU5JVF9URVNUKG1zZXQxKTsKKyAgQ1BQVU5JVF9URVNUKG1zZXQzKTsKKyAgQ1BQVU5JVF9URVNUKG1zZXQ1KTsKKyAgQ1BQVU5JVF9URVNUX1NVSVRFX0VORCgpOworCitwcm90ZWN0ZWQ6CisgIHZvaWQgbXNldDEoKTsKKyAgdm9pZCBtc2V0MygpOworICB2b2lkIG1zZXQ1KCk7CisKKyAgc3RhdGljIGJvb2wgbGVzc190aGFuKGludCBhXywgaW50IGJfKQorICB7CisgICAgcmV0dXJuIGFfIDwgYl87CisgIH0KKworICBzdGF0aWMgYm9vbCBncmVhdGVyX3RoYW4oaW50IGFfLCBpbnQgYl8pCisgIHsKKyAgICByZXR1cm4gYV8gPiBiXzsKKyAgfQorfTsKKworQ1BQVU5JVF9URVNUX1NVSVRFX1JFR0lTVFJBVElPTihNdWx0aXNldFRlc3QpOworCisvLworLy8gdGVzdHMgaW1wbGVtZW50YXRpb24KKy8vCit2b2lkIE11bHRpc2V0VGVzdDo6bXNldDEoKQoreworICBtc2V0IHM7CisgIENQUFVOSVRfQVNTRVJUKHMuY291bnQoNDIpID09IDApOworICBzLmluc2VydCg0Mik7CisgIENQUFVOSVRfQVNTRVJUKHMuY291bnQoNDIpID09IDEpOworICBzLmluc2VydCg0Mik7CisgIENQUFVOSVRfQVNTRVJUKHMuY291bnQoNDIpID09IDIpOworCisgIG1zZXQ6Oml0ZXJhdG9yIGkgPSBzLmZpbmQoNDApOworICBDUFBVTklUX0FTU0VSVChpID09IHMuZW5kKCkpOworCisgIGkgPSBzLmZpbmQoNDIpOworICBDUFBVTklUX0FTU0VSVChpICE9IHMuZW5kKCkpOworICBzaXplX3QgY291bnQgPSBzLmVyYXNlKDQyKTsKKyAgQ1BQVU5JVF9BU1NFUlQoY291bnQgPT0gMik7Cit9Cit2b2lkIE11bHRpc2V0VGVzdDo6bXNldDMoKQoreworICBpbnQgYXJyYXkgW10gPSB7IDMsIDYsIDEsIDIsIDMsIDIsIDYsIDcsIDkgfTsKKworICAvL0NoZWNrIGl0ZXJhdG9yIG9uIGEgbXV0YWJsZSBzZXQKKyAgbXNldCBzKGFycmF5LCBhcnJheSArIDkpOworICBtc2V0OjppdGVyYXRvciBpOworICBpID0gcy5sb3dlcl9ib3VuZCgzKTsKKyAgQ1BQVU5JVF9BU1NFUlQoKmkgPT0gMyk7CisgIGkgPSBzLnVwcGVyX2JvdW5kKDMpOworICBDUFBVTklUX0FTU0VSVCgqaSA9PSA2KTsKKyAgcGFpcjxtc2V0OjppdGVyYXRvciwgbXNldDo6aXRlcmF0b3I+IHAgPSBzLmVxdWFsX3JhbmdlKDUpOworICBDUFBVTklUX0FTU0VSVCgqKHAuZmlyc3QpID09IDYpOworICBDUFBVTklUX0FTU0VSVCgqKHAuc2Vjb25kKSA9PSA2KTsKKworICAvL0NoZWNrIGNvbnN0X2l0ZXJhdG9yIG9uIGEgbXV0YWJsZSBtdWx0aXNldAorICBtc2V0Ojpjb25zdF9pdGVyYXRvciBjaTsKKyAgY2kgPSBzLmxvd2VyX2JvdW5kKDMpOworICBDUFBVTklUX0FTU0VSVCgqY2kgPT0gMyk7CisgIGNpID0gcy51cHBlcl9ib3VuZCgzKTsKKyAgQ1BQVU5JVF9BU1NFUlQoKmNpID09IDYpOworICBwYWlyPG1zZXQ6OmNvbnN0X2l0ZXJhdG9yLCBtc2V0Ojpjb25zdF9pdGVyYXRvcj4gY3A7CisjaWZkZWYgX1NUTFBfTUVNQkVSX1RFTVBMQVRFUworICBjcCA9IHMuZXF1YWxfcmFuZ2UoNSk7CisgIENQUFVOSVRfQVNTRVJUKCooY3AuZmlyc3QpID09IDYpOworICBDUFBVTklUX0FTU0VSVCgqKGNwLnNlY29uZCkgPT0gNik7CisjZW5kaWYKKworICAvL0NoZWNrIGNvbnN0X2l0ZXJhdG9yIG9uIGEgY29uc3QgbXVsdGlzZXQKKyAgbXNldCBjb25zdCYgY3JzID0gczsKKyAgY2kgPSBjcnMubG93ZXJfYm91bmQoMyk7CisgIENQUFVOSVRfQVNTRVJUKCpjaSA9PSAzKTsKKyAgY2kgPSBjcnMudXBwZXJfYm91bmQoMyk7CisgIENQUFVOSVRfQVNTRVJUKCpjaSA9PSA2KTsKKyAgY3AgPSBjcnMuZXF1YWxfcmFuZ2UoNSk7CisgIENQUFVOSVRfQVNTRVJUKCooY3AuZmlyc3QpID09IDYpOworICBDUFBVTklUX0FTU0VSVCgqKGNwLnNlY29uZCkgPT0gNik7Cit9Cit2b2lkIE11bHRpc2V0VGVzdDo6bXNldDUoKQoreworICBpbnQgYXJyYXkgW10gPSB7IDMsIDYsIDEsIDkgfTsKKyAgaW50IGo7CisKKyAgdHlwZWRlZiBwb2ludGVyX3RvX2JpbmFyeV9mdW5jdGlvbjxpbnQsIGludCwgYm9vbD4gZm5fdHlwZTsKKyAgdHlwZWRlZiBtdWx0aXNldDxpbnQsIGZuX3R5cGUsIGFsbG9jYXRvcjxpbnQ+ID4gZm5fbXNldDsKKworICBmbl90eXBlIGYobGVzc190aGFuKTsKKyAgZm5fbXNldCBzMShhcnJheSswLCBhcnJheSArIDQgLCBmICk7CisgIGZuX21zZXQ6OmNvbnN0X2l0ZXJhdG9yIGkgPSBzMS5iZWdpbigpOworICBmb3IgKGogPSAwOyBpICE9IHMxLmVuZCgpOyArK2ksICsraikgeworICAgIENQUFVOSVRfQVNTRVJUKGogIT0gMCB8fCAqaSA9PSAxKTsKKyAgICBDUFBVTklUX0FTU0VSVChqICE9IDEgfHwgKmkgPT0gMyk7CisgICAgQ1BQVU5JVF9BU1NFUlQoaiAhPSAyIHx8ICppID09IDYpOworICAgIENQUFVOSVRfQVNTRVJUKGogIT0gMyB8fCAqaSA9PSA5KTsKKyAgfQorCisgIGZuX3R5cGUgZyhncmVhdGVyX3RoYW4pOworICBmbl9tc2V0IHMyKGFycmF5LCBhcnJheSArIDQsIGcpOworICBpID0gczIuYmVnaW4oKTsKKyAgZm9yIChqID0gMDsgaSAhPSBzMi5lbmQoKTsgKytpLCArK2opIHsKKyAgICBDUFBVTklUX0FTU0VSVChqICE9IDAgfHwgKmkgPT0gOSk7CisgICAgQ1BQVU5JVF9BU1NFUlQoaiAhPSAxIHx8ICppID09IDYpOworICAgIENQUFVOSVRfQVNTRVJUKGogIT0gMiB8fCAqaSA9PSAzKTsKKyAgICBDUFBVTklUX0FTU0VSVChqICE9IDMgfHwgKmkgPT0gMSk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L212Y3Rvcl9kZWNsYXJhdGlvbl90ZXN0LmNwcCBiL3Rlc3QvdW5pdC9tdmN0b3JfZGVjbGFyYXRpb25fdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I2ZjhhMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9tdmN0b3JfZGVjbGFyYXRpb25fdGVzdC5jcHAKQEAgLTAsMCArMSwzNjkgQEAKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKKyMgIGluY2x1ZGUgPHJvcGU+CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKKyMgIGluY2x1ZGUgPHNsaXN0PgorI2VuZGlmCisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxkZXF1ZT4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8bWFwPgorI2lmIGRlZmluZWQgKFNUTFBPUlQpCisjICBpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorIyAgaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKyNlbmRpZgorI2lmIGRlZmluZWQgKFNUTFBPUlQpICYmICFkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQorIyAgaW5jbHVkZSA8aGFzaF9zZXQ+CisjICBpbmNsdWRlIDxoYXNoX21hcD4KKyNlbmRpZgorI2luY2x1ZGUgPHF1ZXVlPgorI2luY2x1ZGUgPHN0YWNrPgorCisjaW5jbHVkZSAibXZjdG9yX3Rlc3QuaCIKKworI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkKF9TVExQX1VTRV9OQU1FU1BBQ0VTKQordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyMgIGlmIGRlZmluZWQgKFNUTFBPUlQpCit1c2luZyBuYW1lc3BhY2Ugc3RkOjp0cjE7CisjICBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKKworIyAgaWYgZGVmaW5lZCAoX19HTlVDX18pICYmIGRlZmluZWQgKF9TVExQX1VTRV9OQU1FU1BBQ0VTKQorLy8gbGlic3RkYysrIHNvbWV0aW1lcyBleHBvc2VkIGl0cyBvd24gX190cnVlX3R5cGUgaW4KKy8vIGdsb2JhbCBuYW1lc3BhY2UgcmVzdWx0aW5nIGluIGFuIGFtYmlndWl0eS4KKyMgICAgZGVmaW5lIF9fdHJ1ZV90eXBlIHN0ZDo6X190cnVlX3R5cGUKKyMgICAgZGVmaW5lIF9fZmFsc2VfdHlwZSBzdGQ6Ol9fZmFsc2VfdHlwZQorIyAgZW5kaWYKKworc3RhdGljIGJvb2wgdHlwZV90b19ib29sKF9fdHJ1ZV90eXBlKQoreyByZXR1cm4gdHJ1ZTsgfQorc3RhdGljIGJvb2wgdHlwZV90b19ib29sKF9fZmFsc2VfdHlwZSkKK3sgcmV0dXJuIGZhbHNlOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdGF0aWMgYm9vbCBpc19tb3ZhYmxlKGNvbnN0IF9UcCYpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX21vdmVfdHJhaXRzPF9UcD46OmltcGxlbWVudGVkIF9Nb3ZhYmxlVHA7CisgIHJldHVybiB0eXBlX3RvX2Jvb2woX01vdmFibGVUcCgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0YXRpYyBib29sIGlzX21vdmVfY29tcGxldGUoY29uc3QgX1RwJikgeworICB0eXBlZGVmIF9fbW92ZV90cmFpdHM8X1RwPiBfVHBNb3ZlVHJhaXRzOworICB0eXBlZGVmIHR5cGVuYW1lIF9UcE1vdmVUcmFpdHM6OmNvbXBsZXRlIF9UcE1vdmVDb21wbGV0ZTsKKyAgcmV0dXJuIHR5cGVfdG9fYm9vbChfVHBNb3ZlQ29tcGxldGUoKSk7Cit9CisKK3N0cnVjdCBzcGVjaWFsbHlfYWxsb2NhdGVkX3N0cnVjdCB7CisgIGJvb2wgb3BlcmF0b3IgPCAoY29uc3Qgc3BlY2lhbGx5X2FsbG9jYXRlZF9zdHJ1Y3QmKSBjb25zdDsKKyMgIGlmIGRlZmluZWQgKF9fRE1DX18pIC8vIHNsaXN0PF9UcCxfQWxsb2M+OjpyZW1vdmUgZXJyb3IKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHNwZWNpYWxseV9hbGxvY2F0ZWRfc3RydWN0JikgY29uc3Q7CisjICBlbmRpZgorfTsKKworI2lmIGRlZmluZWQgKF9fRE1DX18pCitib29sIHNwZWNpYWxseV9hbGxvY2F0ZWRfc3RydWN0OjpvcGVyYXRvciA8IChjb25zdCBzcGVjaWFsbHlfYWxsb2NhdGVkX3N0cnVjdCYpIGNvbnN0Cit7IHJldHVybiBmYWxzZTsgfQorI2VuZGlmCisKK3N0cnVjdCBzdHJ1Y3Rfd2l0aF9zcGVjaWFsaXplZF9sZXNzIHt9OworCisjICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfTkFNRVNQQUNFUykKK25hbWVzcGFjZSBzdGQgeworIyAgZW5kaWYKKyAgX1NUTFBfVEVNUExBVEVfTlVMTAorICBjbGFzcyBhbGxvY2F0b3I8c3BlY2lhbGx5X2FsbG9jYXRlZF9zdHJ1Y3Q+IHsKKyAgICAvL1RoaXMgYWxsb2NhdG9yIGp1c3QgcmVwcmVzZW50IHdoYXQgYSBTVExwb3J0IGNvdWxkIGRvIGFuZCBpbiB0aGlzCisgICAgLy9jYXNlIHRoZSBTVEwgY29udGFpbmVycyBpbXBsZW1lbnRlZCB3aXRoIGl0IHNob3VsZCBzdGlsbCBiZSBtb3ZhYmxlCisgICAgLy9idXQgbm90IGNvbXBsZXRlbHkgYXMgd2UgY2Fubm90IGRvIGFueSBoeXBvdGhlc2lzIG9uIHdoYXQgaXMgaW4gdGhpcworICAgIC8vYWxsb2NhdG9yLgorICBwdWJsaWM6CisgICAgdHlwZWRlZiBzcGVjaWFsbHlfYWxsb2NhdGVkX3N0cnVjdCB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgdmFsdWVfdHlwZSAqICAgICAgIHBvaW50ZXI7CisgICAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlKiBjb25zdF9wb2ludGVyOworICAgIHR5cGVkZWYgdmFsdWVfdHlwZSYgICAgICAgcmVmZXJlbmNlOworICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSYgY29uc3RfcmVmZXJlbmNlOworICAgIHR5cGVkZWYgc2l6ZV90ICAgICBzaXplX3R5cGU7CisgICAgdHlwZWRlZiBwdHJkaWZmX3QgIGRpZmZlcmVuY2VfdHlwZTsKKyMgIGlmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURV9DTEFTU0VTKQorICAgIHRlbXBsYXRlIDxjbGFzcyBfVHAxPiBzdHJ1Y3QgcmViaW5kIHsKKyAgICAgIHR5cGVkZWYgYWxsb2NhdG9yPF9UcDE+IG90aGVyOworICAgIH07CisjICBlbmRpZgorICAgIGFsbG9jYXRvcigpIF9TVExQX05PVEhST1cge30KKyMgIGlmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgICAgdGVtcGxhdGUgPGNsYXNzIF9UcDE+IGFsbG9jYXRvcihjb25zdCBhbGxvY2F0b3I8X1RwMT4mKSBfU1RMUF9OT1RIUk9XIHt9CisjICBlbmRpZgorICAgIGFsbG9jYXRvcihjb25zdCBhbGxvY2F0b3ImKSBfU1RMUF9OT1RIUk9XIHt9CisgICAgfmFsbG9jYXRvcigpIF9TVExQX05PVEhST1cge30KKyAgICBwb2ludGVyIGFkZHJlc3MocmVmZXJlbmNlIF9feCkgY29uc3QgeyByZXR1cm4gJl9feDsgfQorICAgIGNvbnN0X3BvaW50ZXIgYWRkcmVzcyhjb25zdF9yZWZlcmVuY2UgX194KSBjb25zdCB7IHJldHVybiAmX194OyB9CisgICAgcG9pbnRlciBhbGxvY2F0ZShzaXplX3R5cGUsIGNvbnN0IHZvaWQqID0gMCkgeyByZXR1cm4gMDsgfQorICAgIHZvaWQgZGVhbGxvY2F0ZShwb2ludGVyLCBzaXplX3R5cGUpIHt9CisgICAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgX1NUTFBfTk9USFJPVyAgeyByZXR1cm4gMDsgfQorICAgIHZvaWQgY29uc3RydWN0KHBvaW50ZXIsIGNvbnN0X3JlZmVyZW5jZSkge30KKyAgICB2b2lkIGRlc3Ryb3kocG9pbnRlcikge30KKyAgfTsKKworICBfU1RMUF9URU1QTEFURV9OVUxMCisgIHN0cnVjdCBsZXNzPHN0cnVjdF93aXRoX3NwZWNpYWxpemVkX2xlc3M+IHsKKyAgICBib29sIG9wZXJhdG9yKCkgKHN0cnVjdF93aXRoX3NwZWNpYWxpemVkX2xlc3MgY29uc3QmLAorICAgICAgICAgICAgICAgICAgICAgc3RydWN0X3dpdGhfc3BlY2lhbGl6ZWRfbGVzcyBjb25zdCYpIGNvbnN0OworICB9OworCisjICBpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQorIyAgICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKKyMgICAgICBpZiBkZWZpbmVkIChfX0JPUkxBTkRDX18pICYmIChfX0JPUkxBTkRDX18gPj0gMHg1NjQpCisgIF9TVExQX1RFTVBMQVRFX05VTEwKKyAgc3RydWN0IF9fbW92ZV90cmFpdHM8dmVjdG9yPHNwZWNpYWxseV9hbGxvY2F0ZWRfc3RydWN0PiA+IHsKKyAgICB0eXBlZGVmIF9fdHJ1ZV90eXBlIGltcGxlbWVudGVkOworICAgIHR5cGVkZWYgX19mYWxzZV90eXBlIGNvbXBsZXRlOworICB9OworICBfU1RMUF9URU1QTEFURV9OVUxMCisgIHN0cnVjdCBfX21vdmVfdHJhaXRzPGRlcXVlPHNwZWNpYWxseV9hbGxvY2F0ZWRfc3RydWN0PiA+IHsKKyAgICB0eXBlZGVmIF9fdHJ1ZV90eXBlIGltcGxlbWVudGVkOworICAgIHR5cGVkZWYgX19mYWxzZV90eXBlIGNvbXBsZXRlOworICB9OworICBfU1RMUF9URU1QTEFURV9OVUxMCisgIHN0cnVjdCBfX21vdmVfdHJhaXRzPGxpc3Q8c3BlY2lhbGx5X2FsbG9jYXRlZF9zdHJ1Y3Q+ID4geworICAgIHR5cGVkZWYgX190cnVlX3R5cGUgaW1wbGVtZW50ZWQ7CisgICAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgY29tcGxldGU7CisgIH07CisgIF9TVExQX1RFTVBMQVRFX05VTEwKKyAgc3RydWN0IF9fbW92ZV90cmFpdHM8c2xpc3Q8c3BlY2lhbGx5X2FsbG9jYXRlZF9zdHJ1Y3Q+ID4geworICAgIHR5cGVkZWYgX190cnVlX3R5cGUgaW1wbGVtZW50ZWQ7CisgICAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgY29tcGxldGU7CisgIH07CisgIF9TVExQX1RFTVBMQVRFX05VTEwKKyAgc3RydWN0IF9fbW92ZV90cmFpdHM8bGVzczxzdHJ1Y3Rfd2l0aF9zcGVjaWFsaXplZF9sZXNzPiA+IHsKKyAgICB0eXBlZGVmIF9fdHJ1ZV90eXBlIGltcGxlbWVudGVkOworICAgIHR5cGVkZWYgX19mYWxzZV90eXBlIGNvbXBsZXRlOworICB9OworICBfU1RMUF9URU1QTEFURV9OVUxMCisgIHN0cnVjdCBfX21vdmVfdHJhaXRzPHNldDxzcGVjaWFsbHlfYWxsb2NhdGVkX3N0cnVjdD4gPiB7CisgICAgdHlwZWRlZiBfX3RydWVfdHlwZSBpbXBsZW1lbnRlZDsKKyAgICB0eXBlZGVmIF9fZmFsc2VfdHlwZSBjb21wbGV0ZTsKKyAgfTsKKyAgX1NUTFBfVEVNUExBVEVfTlVMTAorICBzdHJ1Y3QgX19tb3ZlX3RyYWl0czxtdWx0aXNldDxzcGVjaWFsbHlfYWxsb2NhdGVkX3N0cnVjdD4gPiB7CisgICAgdHlwZWRlZiBfX3RydWVfdHlwZSBpbXBsZW1lbnRlZDsKKyAgICB0eXBlZGVmIF9fZmFsc2VfdHlwZSBjb21wbGV0ZTsKKyAgfTsKKyMgICAgICBlbmRpZgorIyAgICBlbmRpZgorIyAgZW5kaWYKKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX05BTUVTUEFDRVMpCit9CisjICBlbmRpZgorI2VuZGlmCisKK3ZvaWQgTW92ZUNvbnN0cnVjdG9yVGVzdDo6bW92YWJsZV9kZWNsYXJhdGlvbigpCit7CisjaWYgZGVmaW5lZCAoU1RMUE9SVCkgJiYgIWRlZmluZWQgKF9TVExQX0RPTlRfU0lNVUxBVEVfUEFSVElBTF9TUEVDX0ZPUl9UWVBFX1RSQUlUUykgJiYgXAorICAgICAgICAgICAgICAgICAgICAgICAgICFkZWZpbmVkIChfU1RMUF9OT19NT1ZFX1NFTUFOVElDKQorICAvL1RoaXMgdGVzdCBwdXJwb3NlIGlzIHRvIGNoZWNrIGNvcnJlY3QgZGV0ZWN0aW9uIG9mIHRoZSBTVEwgbW92YWJsZQorICAvL3RyYWl0cyBkZWNsYXJhdGlvbgorICB7CisgICAgLy9zdHJpbmcsIHdzdHJpbmc6CisgICAgQ1BQVU5JVF9BU1NFUlQoIGlzX21vdmFibGUoc3RyaW5nKCkpICk7CisjICBpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQorICAgIENQUFVOSVRfQVNTRVJUKCBpc19tb3ZlX2NvbXBsZXRlKHN0cmluZygpKSApOworIyAgZWxzZQorICAgIENQUFVOSVRfQVNTRVJUKCAhaXNfbW92ZV9jb21wbGV0ZShzdHJpbmcoKSkgKTsKKyMgIGVuZGlmCisjICBpZiBkZWZpbmVkIChfU1RMUF9IQVNfV0NIQVJfVCkKKyAgICBDUFBVTklUX0FTU0VSVCggaXNfbW92YWJsZSh3c3RyaW5nKCkpICk7CisjICAgIGlmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pCisgICAgQ1BQVU5JVF9BU1NFUlQoIGlzX21vdmVfY29tcGxldGUod3N0cmluZygpKSApOworIyAgICBlbHNlCisgICAgQ1BQVU5JVF9BU1NFUlQoICFpc19tb3ZlX2NvbXBsZXRlKHdzdHJpbmcoKSkgKTsKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisgIH0KKworIyAgaWYgZGVmaW5lZCAoU1RMUE9SVCkgJiYgIWRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpCisgIHsKKyAgICAvL2Nyb3BlLCB3cm9wZToKKyAgICBDUFBVTklUX0FTU0VSVCggaXNfbW92YWJsZShjcm9wZSgpKSApOworIyAgICBpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQorICAgIENQUFVOSVRfQVNTRVJUKCBpc19tb3ZlX2NvbXBsZXRlKGNyb3BlKCkpICk7CisjICAgIGVsc2UKKyAgICBDUFBVTklUX0FTU0VSVCggIWlzX21vdmVfY29tcGxldGUoY3JvcGUoKSkgKTsKKyMgICAgZW5kaWYKKyMgICAgaWYgZGVmaW5lZCAoX1NUTFBfSEFTX1dDSEFSX1QpCisgICAgQ1BQVU5JVF9BU1NFUlQoIGlzX21vdmFibGUod3JvcGUoKSkgKTsKKyMgICAgICBpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQorICAgIENQUFVOSVRfQVNTRVJUKCBpc19tb3ZlX2NvbXBsZXRlKHdyb3BlKCkpICk7CisjICAgICAgZWxzZQorICAgIENQUFVOSVRfQVNTRVJUKCAhaXNfbW92ZV9jb21wbGV0ZSh3cm9wZSgpKSApOworIyAgICAgIGVuZGlmCisjICAgIGVuZGlmCisgIH0KKyMgIGVuZGlmCisKKyAgeworICAgIC8vdmVjdG9yOgorICAgIENQUFVOSVRfQVNTRVJUKCBpc19tb3ZhYmxlKHZlY3RvcjxjaGFyPigpKSApOworICAgIENQUFVOSVRfQVNTRVJUKCBpc19tb3ZhYmxlKHZlY3RvcjxzcGVjaWFsbHlfYWxsb2NhdGVkX3N0cnVjdD4oKSkgKTsKKyMgIGlmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pCisgICAgQ1BQVU5JVF9BU1NFUlQoIGlzX21vdmVfY29tcGxldGUodmVjdG9yPGNoYXI+KCkpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoICFpc19tb3ZlX2NvbXBsZXRlKHZlY3RvcjxzcGVjaWFsbHlfYWxsb2NhdGVkX3N0cnVjdD4oKSkgKTsKKyMgIGVsc2UKKyAgICBDUFBVTklUX0FTU0VSVCggIWlzX21vdmVfY29tcGxldGUodmVjdG9yPGNoYXI+KCkpICk7CisjICBlbmRpZgorICB9CisKKyAgeworICAgIC8vZGVxdWU6CisgICAgQ1BQVU5JVF9BU1NFUlQoIGlzX21vdmFibGUoZGVxdWU8Y2hhcj4oKSkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggaXNfbW92YWJsZShkZXF1ZTxzcGVjaWFsbHlfYWxsb2NhdGVkX3N0cnVjdD4oKSkgKTsKKyMgIGlmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pCisgICAgQ1BQVU5JVF9BU1NFUlQoIGlzX21vdmVfY29tcGxldGUoZGVxdWU8Y2hhcj4oKSkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggIWlzX21vdmVfY29tcGxldGUoZGVxdWU8c3BlY2lhbGx5X2FsbG9jYXRlZF9zdHJ1Y3Q+KCkpICk7CisjICBlbHNlCisgICAgQ1BQVU5JVF9BU1NFUlQoICFpc19tb3ZlX2NvbXBsZXRlKGRlcXVlPGNoYXI+KCkpICk7CisjICBlbmRpZgorICB9CisKKyAgeworICAgIC8vbGlzdDoKKyAgICBDUFBVTklUX0FTU0VSVCggaXNfbW92YWJsZShsaXN0PGNoYXI+KCkpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGlzX21vdmFibGUobGlzdDxzcGVjaWFsbHlfYWxsb2NhdGVkX3N0cnVjdD4oKSkgKTsKKyMgIGlmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pCisgICAgQ1BQVU5JVF9BU1NFUlQoIGlzX21vdmVfY29tcGxldGUobGlzdDxjaGFyPigpKSApOworICAgIENQUFVOSVRfQVNTRVJUKCAhaXNfbW92ZV9jb21wbGV0ZShsaXN0PHNwZWNpYWxseV9hbGxvY2F0ZWRfc3RydWN0PigpKSApOworIyAgZWxzZQorICAgIENQUFVOSVRfQVNTRVJUKCAhaXNfbW92ZV9jb21wbGV0ZShsaXN0PGNoYXI+KCkpICk7CisjICBlbmRpZgorICB9CisKKyMgIGlmIGRlZmluZWQgKFNUTFBPUlQpICYmICFkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQorICB7CisgICAgLy9zbGlzdDoKKyAgICBDUFBVTklUX0FTU0VSVCggaXNfbW92YWJsZShzbGlzdDxjaGFyPigpKSApOworICAgIENQUFVOSVRfQVNTRVJUKCBpc19tb3ZhYmxlKHNsaXN0PHNwZWNpYWxseV9hbGxvY2F0ZWRfc3RydWN0PigpKSApOworIyAgICBpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQorICAgIENQUFVOSVRfQVNTRVJUKCBpc19tb3ZlX2NvbXBsZXRlKHNsaXN0PGNoYXI+KCkpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoICFpc19tb3ZlX2NvbXBsZXRlKHNsaXN0PHNwZWNpYWxseV9hbGxvY2F0ZWRfc3RydWN0PigpKSApOworIyAgICBlbHNlCisgICAgQ1BQVU5JVF9BU1NFUlQoICFpc19tb3ZlX2NvbXBsZXRlKHNsaXN0PGNoYXI+KCkpICk7CisjICAgIGVuZGlmCisgIH0KKyMgIGVuZGlmCisKKyAgeworICAgIC8vcXVldWU6CisgICAgQ1BQVU5JVF9BU1NFUlQoIGlzX21vdmFibGUocXVldWU8Y2hhcj4oKSkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggaXNfbW92YWJsZShxdWV1ZTxzcGVjaWFsbHlfYWxsb2NhdGVkX3N0cnVjdD4oKSkgKTsKKyMgIGlmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pCisgICAgQ1BQVU5JVF9BU1NFUlQoIGlzX21vdmVfY29tcGxldGUocXVldWU8Y2hhcj4oKSkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggIWlzX21vdmVfY29tcGxldGUocXVldWU8c3BlY2lhbGx5X2FsbG9jYXRlZF9zdHJ1Y3Q+KCkpICk7CisjICBlbHNlCisgICAgQ1BQVU5JVF9BU1NFUlQoICFpc19tb3ZlX2NvbXBsZXRlKHF1ZXVlPGNoYXI+KCkpICk7CisjICBlbmRpZgorICB9CisKKyAgeworICAgIC8vc3RhY2s6CisgICAgQ1BQVU5JVF9BU1NFUlQoIGlzX21vdmFibGUoc3RhY2s8Y2hhcj4oKSkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggaXNfbW92YWJsZShzdGFjazxzcGVjaWFsbHlfYWxsb2NhdGVkX3N0cnVjdD4oKSkgKTsKKyMgIGlmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pCisgICAgQ1BQVU5JVF9BU1NFUlQoIGlzX21vdmVfY29tcGxldGUoc3RhY2s8Y2hhcj4oKSkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggIWlzX21vdmVfY29tcGxldGUoc3RhY2s8c3BlY2lhbGx5X2FsbG9jYXRlZF9zdHJ1Y3Q+KCkpICk7CisjICBlbHNlCisgICAgQ1BQVU5JVF9BU1NFUlQoICFpc19tb3ZlX2NvbXBsZXRlKHN0YWNrPGNoYXI+KCkpICk7CisjICBlbmRpZgorICB9CisKKyNlbmRpZgorfQorCit2b2lkIE1vdmVDb25zdHJ1Y3RvclRlc3Q6Om1vdmFibGVfZGVjbGFyYXRpb25fYXNzb2MoKQoreworI2lmIGRlZmluZWQgKFNUTFBPUlQpICYmICFkZWZpbmVkIChfU1RMUF9ET05UX1NJTVVMQVRFX1BBUlRJQUxfU1BFQ19GT1JfVFlQRV9UUkFJVFMpICYmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKKyAgeworICAgIC8vYXNzb2NpYXRpdmUgY29udGFpbmVycywgc2V0IG11bHRpc2V0LCBtYXAsIG11bHRpbWFwOgorCisgICAgLy9Gb3IgYXNzb2NpYXRpdmUgY29udGFpbmVycyBpdCBpcyBpbXBvcnRhbnQgdGhhdCBsZXNzIGlzIGNvcnJlY3RseSByZWNvZ25pemUgYXMKKyAgICAvL3RoZSBTVExwb3J0IGxlc3Mgb3IgYSB1c2VyIHNwZWNpYWxpemVkIGxlc3M6CisjICBpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQorICAgIENQUFVOSVRfQVNTRVJUKCBpc19tb3ZlX2NvbXBsZXRlKGxlc3M8Y2hhcj4oKSkgKTsKKyMgIGVuZGlmCisgICAgQ1BQVU5JVF9BU1NFUlQoICFpc19tb3ZlX2NvbXBsZXRlKGxlc3M8c3RydWN0X3dpdGhfc3BlY2lhbGl6ZWRfbGVzcz4oKSkgKTsKKworICAgIC8vc2V0CisgICAgQ1BQVU5JVF9BU1NFUlQoIGlzX21vdmFibGUoc2V0PGNoYXI+KCkpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGlzX21vdmFibGUoc2V0PHNwZWNpYWxseV9hbGxvY2F0ZWRfc3RydWN0PigpKSApOworIyAgaWYgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikKKyAgICBDUFBVTklUX0FTU0VSVCggaXNfbW92ZV9jb21wbGV0ZShzZXQ8Y2hhcj4oKSkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggIWlzX21vdmVfY29tcGxldGUoc2V0PHNwZWNpYWxseV9hbGxvY2F0ZWRfc3RydWN0PigpKSApOworIyAgZWxzZQorICAgIENQUFVOSVRfQVNTRVJUKCAhaXNfbW92ZV9jb21wbGV0ZShzZXQ8Y2hhcj4oKSkgKTsKKyMgIGVuZGlmCisKKyAgICAvL211bHRpc2V0CisgICAgQ1BQVU5JVF9BU1NFUlQoIGlzX21vdmFibGUobXVsdGlzZXQ8Y2hhcj4oKSkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggaXNfbW92YWJsZShtdWx0aXNldDxzcGVjaWFsbHlfYWxsb2NhdGVkX3N0cnVjdD4oKSkgKTsKKyMgIGlmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pCisgICAgQ1BQVU5JVF9BU1NFUlQoIGlzX21vdmVfY29tcGxldGUobXVsdGlzZXQ8Y2hhcj4oKSkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggIWlzX21vdmVfY29tcGxldGUobXVsdGlzZXQ8c3BlY2lhbGx5X2FsbG9jYXRlZF9zdHJ1Y3Q+KCkpICk7CisjICBlbHNlCisgICAgQ1BQVU5JVF9BU1NFUlQoICFpc19tb3ZlX2NvbXBsZXRlKG11bHRpc2V0PGNoYXI+KCkpICk7CisjICBlbmRpZgorCisgICAgLy9tYXAKKyAgICBDUFBVTklUX0FTU0VSVCggaXNfbW92YWJsZShtYXA8Y2hhciwgY2hhcj4oKSkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggaXNfbW92YWJsZShtYXA8c3BlY2lhbGx5X2FsbG9jYXRlZF9zdHJ1Y3QsIGNoYXI+KCkpICk7CisjICBpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQorICAgIENQUFVOSVRfQVNTRVJUKCBpc19tb3ZlX2NvbXBsZXRlKG1hcDxjaGFyLCBjaGFyPigpKSApOworICAgIC8vSGVyZSBldmVuIGlmIGFsbG9jYXRvciBoYXMgYmVlbiBzcGVjaWFsaXplZCBmb3Igc3BlY2lhbGx5X2FsbG9jYXRlZF9zdHJ1Y3QKKyAgICAvL3RoaXMgcGVjaWFsaXphdGlvbiB3b24ndCBiZSB1c2VkIGluIGRlZmF1bHQgbWFwIGluc3RhbmNpYXRpb24gYXMgdGhlIGRlZmF1bHQKKyAgICAvL2FsbG9jYXRvciBpcyBhbGxvY2F0b3I8cGFpcjxzcGVjaWFsbHlfYWxsb2NhdGVkX3N0cnVjdCwgY2hhcj4gPgorICAgIENQUFVOSVRfQVNTRVJUKCBpc19tb3ZlX2NvbXBsZXRlKG1hcDxzcGVjaWFsbHlfYWxsb2NhdGVkX3N0cnVjdCwgY2hhcj4oKSkgKTsKKyMgIGVsc2UKKyAgICBDUFBVTklUX0FTU0VSVCggIWlzX21vdmVfY29tcGxldGUobWFwPGNoYXIsIGNoYXI+KCkpICk7CisjICBlbmRpZgorCisgICAgLy9tdWx0aW1hcAorICAgIENQUFVOSVRfQVNTRVJUKCBpc19tb3ZhYmxlKG11bHRpbWFwPGNoYXIsIGNoYXI+KCkpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGlzX21vdmFibGUobXVsdGltYXA8c3BlY2lhbGx5X2FsbG9jYXRlZF9zdHJ1Y3QsIGNoYXI+KCkpICk7CisjICBpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQorICAgIENQUFVOSVRfQVNTRVJUKCBpc19tb3ZlX2NvbXBsZXRlKG11bHRpbWFwPGNoYXIsIGNoYXI+KCkpICk7CisgICAgLy9JZGVtIG1hcCByZW1hcmsKKyAgICBDUFBVTklUX0FTU0VSVCggaXNfbW92ZV9jb21wbGV0ZShtdWx0aW1hcDxzcGVjaWFsbHlfYWxsb2NhdGVkX3N0cnVjdCwgY2hhcj4oKSkgKTsKKyMgIGVsc2UKKyAgICBDUFBVTklUX0FTU0VSVCggIWlzX21vdmVfY29tcGxldGUobXVsdGltYXA8Y2hhciwgY2hhcj4oKSkgKTsKKyMgIGVuZGlmCisgIH0KKyNlbmRpZgorfQorCit2b2lkIE1vdmVDb25zdHJ1Y3RvclRlc3Q6Om1vdmFibGVfZGVjbGFyYXRpb25faGFzaCgpCit7CisjaWYgZGVmaW5lZCAoU1RMUE9SVCkgJiYgIWRlZmluZWQgKF9TVExQX0RPTlRfU0lNVUxBVEVfUEFSVElBTF9TUEVDX0ZPUl9UWVBFX1RSQUlUUykgJiYgXAorICAgICAgICAgICAgICAgICAgICAgICAgICFkZWZpbmVkIChfU1RMUF9OT19NT1ZFX1NFTUFOVElDKQorICB7CisgICAgLy9oYXNoZWQgY29udGFpbmVycywgdW5vcmRlcmVkX3NldCB1bm9yZGVyZWRfbXVsdGlzZXQsIHVub3JkZXJlZF9tYXAsIHVub3JkZXJlZF9tdWx0aW1hcCwKKyAgICAvLyAgICAgICAgICAgICAgICAgICBoYXNoX3NldCwgaGFzaF9tdWx0aXNldCwgaGFzaF9tYXAsIGhhc2hfbXVsdGltYXA6CisKKyAgICAvL1dlIG9ubHkgY2hlY2sgdGhhdCB0aGV5IGFyZSBtb3ZhYmxlLCBjb21wbGV0bmVzcyBpcyBub3QgeWV0IHN1cHBvcnRlZAorICAgIENQUFVOSVRfQVNTRVJUKCBpc19tb3ZhYmxlKHVub3JkZXJlZF9zZXQ8Y2hhcj4oKSkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggaXNfbW92YWJsZSh1bm9yZGVyZWRfbXVsdGlzZXQ8Y2hhcj4oKSkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggaXNfbW92YWJsZSh1bm9yZGVyZWRfbWFwPGNoYXIsIGNoYXI+KCkpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGlzX21vdmFibGUodW5vcmRlcmVkX211bHRpbWFwPGNoYXIsIGNoYXI+KCkpICk7CisjICBpZiBkZWZpbmVkIChTVExQT1JUKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKKyAgICBDUFBVTklUX0FTU0VSVCggaXNfbW92YWJsZShoYXNoX3NldDxjaGFyPigpKSApOworICAgIENQUFVOSVRfQVNTRVJUKCBpc19tb3ZhYmxlKGhhc2hfbXVsdGlzZXQ8Y2hhcj4oKSkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggaXNfbW92YWJsZShoYXNoX21hcDxjaGFyLCBjaGFyPigpKSApOworICAgIENQUFVOSVRfQVNTRVJUKCBpc19tb3ZhYmxlKGhhc2hfbXVsdGltYXA8Y2hhciwgY2hhcj4oKSkgKTsKKyMgIGVuZGlmCisgIH0KKyNlbmRpZgorfQorCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvbXZjdG9yX3Rlc3QuY3BwIGIvdGVzdC91bml0L212Y3Rvcl90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGFjMzJmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L212Y3Rvcl90ZXN0LmNwcApAQCAtMCwwICsxLDgxNiBAQAorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2lmIGRlZmluZWQgKFNUTFBPUlQpICYmICFkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQorIyAgaW5jbHVkZSA8c2xpc3Q+CisjZW5kaWYKKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPGRlcXVlPgorI2luY2x1ZGUgPHNldD4KKyNpZiBkZWZpbmVkIChTVExQT1JUKQorIyAgaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KKyNlbmRpZgorCisjaW5jbHVkZSAibXZjdG9yX3Rlc3QuaCIKKworI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkKF9TVExQX1VTRV9OQU1FU1BBQ0VTKQordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyMgIGlmIGRlZmluZWQgKFNUTFBPUlQpCit1c2luZyBuYW1lc3BhY2Ugc3RkOjp0cjE7CisjICBlbmRpZgorI2VuZGlmCisKK0NQUFVOSVRfVEVTVF9TVUlURV9SRUdJU1RSQVRJT04oTW92ZUNvbnN0cnVjdG9yVGVzdCk7CisKKy8vCisvLyB0ZXN0cyBpbXBsZW1lbnRhdGlvbgorLy8KK3ZvaWQgTW92ZUNvbnN0cnVjdG9yVGVzdDo6bW92ZV9jb25zdHJ1Y3RfdGVzdCgpCit7CisgIC8vY291dCA8PCAidmVjdG9yPHZlY3RvcjxpbnQ+PiI7CisgIHZlY3RvcjxpbnQ+IGNvbnN0IHJlZl92ZWMoMTAsIDApOworICB2ZWN0b3I8dmVjdG9yPGludD4gPiB2X3ZfaW50cygxLCByZWZfdmVjKTsKKworI2lmIGRlZmluZWQgKFNUTFBPUlQpICYmICFkZWZpbmVkIChfU1RMUF9OT19NT1ZFX1NFTUFOVElDKQorICBpbnQgKnBpbnQgPSAmKHZfdl9pbnRzLmZyb250KCkuZnJvbnQoKSk7CisjZW5kaWYKKworICBzaXplX3QgY3VyX2NhcGFjaXR5ID0gdl92X2ludHMuY2FwYWNpdHkoKTsKKyAgd2hpbGUgKHZfdl9pbnRzLmNhcGFjaXR5KCkgPD0gY3VyX2NhcGFjaXR5KSB7CisgICAgdl92X2ludHMucHVzaF9iYWNrKHJlZl92ZWMpOworICB9CisKKyAgLy92X3ZfaW50cyBoYXMgYmVlbiByZXNpemVkCisjaWYgZGVmaW5lZCAoU1RMUE9SVCkgJiYgIWRlZmluZWQgKF9TVExQX05PX01PVkVfU0VNQU5USUMpCisgIENQUFVOSVRfQVNTRVJUKChwaW50ID09ICZ2X3ZfaW50cy5mcm9udCgpLmZyb250KCkpKTsKKyNlbmRpZgorCisgIC8vY291dCA8PCAidmVjdG9yPHZlY3RvcjxpbnQ+Pjo6ZXJhc2UiOworICAvL1dlIG5lZWQgYXQgbGVhc3QgMyBlbGVtZW50czoKKyAgd2hpbGUgKHZfdl9pbnRzLnNpemUoKSA8IDMpIHsKKyAgICB2X3ZfaW50cy5wdXNoX2JhY2socmVmX3ZlYyk7CisgIH0KKworICAvL1dlIGVyYXNlIHRoZSAybmQKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKKyAgcGludCA9ICZ2X3ZfaW50c1syXS5mcm9udCgpOworI2VuZGlmCisgIHZfdl9pbnRzLmVyYXNlKHZfdl9pbnRzLmJlZ2luKCkgKyAxKTsKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKKyAgQ1BQVU5JVF9BU1NFUlQoKHBpbnQgPT0gJnZfdl9pbnRzWzFdLmZyb250KCkpKTsKKyNlbmRpZgorCisgIC8vY291dCA8PCAidmVjdG9yPHN0cmluZz4iOworICBzdHJpbmcgY29uc3QgcmVmX3N0cigicmVmIHN0cmluZywgYmlnIGVub3VnaCB0byBiZSBhIGR5bmFtaWMgb25lIik7CisgIHZlY3RvcjxzdHJpbmc+IHZlY19zdHJzKDEsIHJlZl9zdHIpOworCisjaWYgZGVmaW5lZCAoU1RMUE9SVCkgJiYgIWRlZmluZWQgKF9TVExQX05PX01PVkVfU0VNQU5USUMpCisgIGNoYXIgY29uc3QqIHBzdHIgPSB2ZWNfc3Rycy5mcm9udCgpLmNfc3RyKCk7CisjZW5kaWYKKyAgY3VyX2NhcGFjaXR5ID0gdmVjX3N0cnMuY2FwYWNpdHkoKTsKKyAgd2hpbGUgKHZlY19zdHJzLmNhcGFjaXR5KCkgPD0gY3VyX2NhcGFjaXR5KSB7CisgICAgdmVjX3N0cnMucHVzaF9iYWNrKHJlZl9zdHIpOworICB9CisKKyAgLy92ZWNfc3RyIGhhcyBiZWVuIHJlc2l6ZWQKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKKyAgQ1BQVU5JVF9BU1NFUlQoKHBzdHIgPT0gdmVjX3N0cnMuZnJvbnQoKS5jX3N0cigpKSk7CisjZW5kaWYKKworICAvL2NvdXQgPDwgInZlY3RvcjxzdHJpbmc+OjplcmFzZSI7CisgIC8vV2UgbmVlZCBhdCBsZWFzdCAzIGVsZW1lbnRzOgorICB3aGlsZSAodmVjX3N0cnMuc2l6ZSgpIDwgMykgeworICAgIHZlY19zdHJzLnB1c2hfYmFjayhyZWZfc3RyKTsKKyAgfQorCisgIC8vV2UgZXJhc2UgdGhlIDJuZAorI2lmIGRlZmluZWQgKFNUTFBPUlQpICYmICFkZWZpbmVkIChfU1RMUF9OT19NT1ZFX1NFTUFOVElDKQorICBwc3RyID0gdmVjX3N0cnNbMl0uY19zdHIoKTsKKyNlbmRpZgorICB2ZWNfc3Rycy5lcmFzZSh2ZWNfc3Rycy5iZWdpbigpICsgMSk7CisjaWYgZGVmaW5lZCAoU1RMUE9SVCkgJiYgIWRlZmluZWQgKF9TVExQX05PX01PVkVfU0VNQU5USUMpCisgIENQUFVOSVRfQVNTRVJUKChwc3RyID09IHZlY19zdHJzWzFdLmNfc3RyKCkpKTsKKyNlbmRpZgorCisgIC8vY291dCA8PCAic3dhcCh2ZWN0b3I8aW50PiwgdmVjdG9yPGludD4pIjsKKyAgdmVjdG9yPGludD4gZWxlbTEoMTAsIDApLCBlbGVtMigxMCwgMCk7CisjaWYgZGVmaW5lZCAoU1RMUE9SVCkgJiYgIWRlZmluZWQgKF9TVExQX05PX01PVkVfU0VNQU5USUMpCisgIGludCAqcDEgPSAmZWxlbTEuZnJvbnQoKTsKKyAgaW50ICpwMiA9ICZlbGVtMi5mcm9udCgpOworI2VuZGlmCisgIHN3YXAoZWxlbTEsIGVsZW0yKTsKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKKyAgQ1BQVU5JVF9BU1NFUlQoKChwMSA9PSAmZWxlbTIuZnJvbnQoKSkgJiYgKHAyID09ICZlbGVtMS5mcm9udCgpKSkpOworI2VuZGlmCisKKyAgeworICAgIHZlY3Rvcjxib29sPiBiaXRfdmVjKDUsIHRydWUpOworICAgIGJpdF92ZWMuaW5zZXJ0KGJpdF92ZWMuZW5kKCksIDUsIGZhbHNlKTsKKyAgICB2ZWN0b3I8dmVjdG9yPGJvb2w+ID4gdl92X2JpdHMoMSwgYml0X3ZlYyk7CisKKyAgICAvKgorICAgICAqIFRoaXMgaXMgYSBTVExwb3J0IHNwZWNpZmljIHRlc3QgYXMgd2UgYXJlIHVzaW5nIGludGVybmFsIGltcGxlbWVudGF0aW9uCisgICAgICogZGV0YWlscyB0byBjaGVjayB0aGF0IHRoZSBtb3ZlIGhhcyBiZWVuIGNvcnJlY3RseSBoYW5kbGVkLiBGb3Igb3RoZXIKKyAgICAgKiBTVEwgaW1wbGVtZW50YXRpb24gaXQgaXMgb25seSBhIGNvbXBpbGUgY2hlY2suCisgICAgICovCisjaWYgZGVmaW5lZCAoU1RMUE9SVCkgJiYgIWRlZmluZWQgKF9TVExQX05PX01PVkVfU0VNQU5USUMpCisjICBpZiBkZWZpbmVkIChfU1RMUF9ERUJVRykKKyAgICB1bnNpZ25lZCBpbnQgKnB1bml0ID0gdl92X2JpdHMuZnJvbnQoKS5iZWdpbigpLl9NX2l0ZXJhdG9yLl9NX3A7CisjICBlbHNlCisgICAgdW5zaWduZWQgaW50ICpwdW5pdCA9IHZfdl9iaXRzLmZyb250KCkuYmVnaW4oKS5fTV9wOworIyAgZW5kaWYKKyNlbmRpZgorCisgICAgY3VyX2NhcGFjaXR5ID0gdl92X2JpdHMuY2FwYWNpdHkoKTsKKyAgICB3aGlsZSAodl92X2JpdHMuY2FwYWNpdHkoKSA8PSBjdXJfY2FwYWNpdHkpIHsKKyAgICAgIHZfdl9iaXRzLnB1c2hfYmFjayhiaXRfdmVjKTsKKyAgICB9CisKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKKyAgICAvL3Zfdl9iaXRzIGhhcyBiZWVuIHJlc2l6ZWQKKyMgIGlmIGRlZmluZWQgKF9TVExQX0RFQlVHKQorICAgIENQUFVOSVRfQVNTRVJUKCBwdW5pdCA9PSB2X3ZfYml0cy5mcm9udCgpLmJlZ2luKCkuX01faXRlcmF0b3IuX01fcCApOworIyAgZWxzZQorICAgIENQUFVOSVRfQVNTRVJUKCBwdW5pdCA9PSB2X3ZfYml0cy5mcm9udCgpLmJlZ2luKCkuX01fcCApOworIyAgZW5kaWYKKyNlbmRpZgorICB9CisKKyAgLy8gemVybzogZG9uJ3QgbGlrZSB0aGlzIGtpbmQgb2YgdGVzdHMKKyAgLy8gYmVjYXVzZSBvZiB0ZW1wbGF0ZSB0ZXN0IGZ1bmN0aW9uCisgIC8vIHdlIHNob3VsZCBmaW5kIGFub3RoZXIgd2F5IHRvIHByb3ZpZGUKKyAgLy8gbW92ZSBjb25zdHJ1Y3RvciB0ZXN0aW5nLi4uCisKKy8qCisgIHN0YW5kYXJkX3Rlc3QxKGxpc3Q8aW50PigxMCkpOworCisKKyAgc3RhbmRhcmRfdGVzdDEoc2xpc3Q8aW50PigxMCkpOworCisgIHN0YW5kYXJkX3Rlc3QxKGRlcXVlPGludD4oMTApKTsKKyovCisKKyAgLyoKKyAgaW50IGludF92YWx1ZXNbXSA9IHswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5fTsKKworICBzZXQ8aW50PiBpbnRfc2V0KGludF92YWx1ZXMsIGludF92YWx1ZXMgKyBzaXplb2YoaW5fdmFsdWVzKSAvIHNpemVvZihpbnQpKTsKKyAgc3RhbmRhcmRfdGVzdDEoaW50X3NldCk7CisKKyAgbXVsdGlzZXQ8aW50PiBpbnRfbXVsdGlzZXQoaW50X3ZhbHVlcywgaW50X3ZhbHVlcyArIHNpemVvZihpbl92YWx1ZXMpIC8gc2l6ZW9mKGludCkpOworICBzdGFuZGFyZF90ZXN0MShpbnRfbXVsdGlzZXQpOworICAqLworCisgIC8qCisgIENoZWNrRnVsbE1vdmVTdXBwb3J0KHN0cmluZygpKTsKKyAgQ2hlY2tGdWxsTW92ZVN1cHBvcnQodmVjdG9yPGludD4oKSk7CisgIENoZWNrRnVsbE1vdmVTdXBwb3J0KGRlcXVlPGludD4oKSk7CisgIENoZWNrRnVsbE1vdmVTdXBwb3J0KGxpc3Q8aW50PigpKTsKKyAgQ2hlY2tGdWxsTW92ZVN1cHBvcnQoc2xpc3Q8aW50PigpKTsKKyAgKi8KK30KKwordm9pZCBNb3ZlQ29uc3RydWN0b3JUZXN0OjpkZXF1ZV90ZXN0KCkKK3sKKyAgLy9DaGVjayB0aGUgaW5zZXJ0IHJhbmdlIG1ldGhvZC4KKyAgLy9UbyB0aGUgZnJvbnQ6CisgIHsKKyMgIGlmICFkZWZpbmVkIChTVExQT1JUKSB8fCAhZGVmaW5lZCAoX1NUTFBfREVCVUcpIHx8ICFkZWZpbmVkIChfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVTKQorICAgIGRlcXVlPHZlY3RvcjxpbnQ+ID4gdmVjdF9kZXF1ZTsKKyAgICB2ZWN0b3I8aW50Kj4gYnVmczsKKyAgICB2ZWN0X2RlcXVlLmFzc2lnbigzLCB2ZWN0b3I8aW50PigxMCkpOworICAgIGJ1ZnMucHVzaF9iYWNrKCZ2ZWN0X2RlcXVlWzBdLmZyb250KCkpOworICAgIGJ1ZnMucHVzaF9iYWNrKCZ2ZWN0X2RlcXVlWzFdLmZyb250KCkpOworICAgIGJ1ZnMucHVzaF9iYWNrKCZ2ZWN0X2RlcXVlWzJdLmZyb250KCkpOworCisgICAgaW50IG5iX2luc2VydCA9IDU7CisgICAgLy9Jbml0aWFsaXplIHRvIDEgdG8gZ2VuZXJhdGUgYSBmcm9udCBpbnNlcnRpb246CisgICAgaW50IHBvcyA9IDE7CisgICAgd2hpbGUgKG5iX2luc2VydC0tKSB7CisgICAgICB2ZWN0b3I8dmVjdG9yPGludD4gPiB2ZWN0X3ZlY3QoMiwgdmVjdG9yPGludD4oMTApKTsKKyAgICAgIHZlY3RfZGVxdWUuaW5zZXJ0KHZlY3RfZGVxdWUuYmVnaW4oKSArIHBvcywgdmVjdF92ZWN0LmJlZ2luKCksIHZlY3RfdmVjdC5lbmQoKSk7CisgICAgICBidWZzLmluc2VydChidWZzLmJlZ2luKCkgKyBwb3MsICZ2ZWN0X2RlcXVlW3Bvc10uZnJvbnQoKSk7CisgICAgICBidWZzLmluc2VydChidWZzLmJlZ2luKCkgKyBwb3MgKyAxLCAmdmVjdF9kZXF1ZVtwb3MgKyAxXS5mcm9udCgpKTsKKyAgICAgICsrcG9zOworICAgIH0KKyAgICBDUFBVTklUX0FTU0VSVCggdmVjdF9kZXF1ZS5zaXplKCkgPT0gMTMgKTsKKyMgICAgaWYgZGVmaW5lZCAoU1RMUE9SVCkgJiYgIWRlZmluZWQgKF9TVExQX05PX01PVkVfU0VNQU5USUMpCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyArK2kpIHsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBidWZzW2ldID09ICZ2ZWN0X2RlcXVlW2ldLmZyb250KCkgKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBidWZzWzExIC0gaV0gPT0gJnZlY3RfZGVxdWVbMTEgLSBpXS5mcm9udCgpICk7CisgICAgfQorIyAgICBlbmRpZgorIyAgZW5kaWYKKyAgfQorCisgIC8vVG8gdGhlIGJhY2sKKyAgeworIyAgaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8ICFkZWZpbmVkIChfU1RMUF9ERUJVRykgfHwgIWRlZmluZWQgKF9TVExQX05PX01FTUJFUl9URU1QTEFURVMpCisgICAgZGVxdWU8dmVjdG9yPGludD4gPiB2ZWN0X2RlcXVlOworICAgIHZlY3RvcjxpbnQqPiBidWZzOworICAgIHZlY3RfZGVxdWUuYXNzaWduKDMsIHZlY3RvcjxpbnQ+KDEwKSk7CisgICAgYnVmcy5wdXNoX2JhY2soJnZlY3RfZGVxdWVbMF0uZnJvbnQoKSk7CisgICAgYnVmcy5wdXNoX2JhY2soJnZlY3RfZGVxdWVbMV0uZnJvbnQoKSk7CisgICAgYnVmcy5wdXNoX2JhY2soJnZlY3RfZGVxdWVbMl0uZnJvbnQoKSk7CisKKyAgICBpbnQgbmJfaW5zZXJ0ID0gNTsKKyAgICAvL0luaXRpYWxpemUgdG8gMiB0byBnZW5lcmF0ZSBhIGJhY2sgaW5zZXJ0aW9uOgorICAgIGludCBwb3MgPSAyOworICAgIHdoaWxlIChuYl9pbnNlcnQtLSkgeworICAgICAgdmVjdG9yPHZlY3RvcjxpbnQ+ID4gdmVjdF92ZWN0KDIsIHZlY3RvcjxpbnQ+KDEwKSk7CisgICAgICB2ZWN0X2RlcXVlLmluc2VydCh2ZWN0X2RlcXVlLmJlZ2luKCkgKyBwb3MsIHZlY3RfdmVjdC5iZWdpbigpLCB2ZWN0X3ZlY3QuZW5kKCkpOworICAgICAgYnVmcy5pbnNlcnQoYnVmcy5iZWdpbigpICsgcG9zLCAmdmVjdF9kZXF1ZVtwb3NdLmZyb250KCkpOworICAgICAgYnVmcy5pbnNlcnQoYnVmcy5iZWdpbigpICsgcG9zICsgMSwgJnZlY3RfZGVxdWVbcG9zICsgMV0uZnJvbnQoKSk7CisgICAgICArK3BvczsKKyAgICB9CisgICAgQ1BQVU5JVF9BU1NFUlQoIHZlY3RfZGVxdWUuc2l6ZSgpID09IDEzICk7CisjICAgIGlmIGRlZmluZWQgKFNUTFBPUlQpICYmICFkZWZpbmVkIChfU1RMUF9OT19NT1ZFX1NFTUFOVElDKQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgKytpKSB7CisgICAgICBDUFBVTklUX0FTU0VSVCggYnVmc1tpICsgMV0gPT0gJnZlY3RfZGVxdWVbaSArIDFdLmZyb250KCkgKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBidWZzWzEyIC0gaV0gPT0gJnZlY3RfZGVxdWVbMTIgLSBpXS5mcm9udCgpICk7CisgICAgfQorIyAgICBlbmRpZgorIyAgZW5kaWYKKyAgfQorCisgIC8vQ2hlY2sgdGhlIGRpZmZlcmVudCBlcmFzZSBtZXRob2RzLgorICB7CisgICAgZGVxdWU8dmVjdG9yPGludD4gPiB2ZWN0X2RlcXVlOworICAgIHZlY3RfZGVxdWUuYXNzaWduKDIwLCB2ZWN0b3I8aW50PigxMCkpOworICAgIGRlcXVlPHZlY3RvcjxpbnQ+ID46Oml0ZXJhdG9yIHZkaXQodmVjdF9kZXF1ZS5iZWdpbigpKSwgdmRpdEVuZCh2ZWN0X2RlcXVlLmVuZCgpKTsKKyAgICB2ZWN0b3I8aW50Kj4gYnVmczsKKyAgICBmb3IgKDsgdmRpdCAhPSB2ZGl0RW5kOyArK3ZkaXQpIHsKKyAgICAgIGJ1ZnMucHVzaF9iYWNrKCZ2ZGl0LT5mcm9udCgpKTsKKyAgICB9CisKKyAgICB7CisgICAgICAvLyBUaGlzIGNoZWNrLCByZXBlYXRlZCBhZnRlciBlYWNoIG9wZXJhdGlvbiwgY2hlY2sgdGhlIGRlcXVlIGNvbnNpc3RlbmN5OgorICAgICAgZGVxdWU8dmVjdG9yPGludD4gPjo6aXRlcmF0b3IgaXQgPSB2ZWN0X2RlcXVlLmVuZCgpIC0gNTsKKyAgICAgIGludCBuYl9pbmNyID0gMDsKKyAgICAgIGZvciAoOyBpdCAhPSB2ZWN0X2RlcXVlLmVuZCgpICYmIG5iX2luY3IgPD0gNjsgKytuYl9pbmNyLCArK2l0KSB7fQorICAgICAgQ1BQVU5JVF9BU1NFUlQoIG5iX2luY3IgPT0gNSApOworICAgIH0KKworICAgIHsKKyAgICAgIC8vZXJhc2UgaW4gZnJvbnQ6CisgICAgICB2ZWN0X2RlcXVlLmVyYXNlKHZlY3RfZGVxdWUuYmVnaW4oKSArIDIpOworICAgICAgYnVmcy5lcmFzZShidWZzLmJlZ2luKCkgKyAyKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCB2ZWN0X2RlcXVlLnNpemUoKSA9PSAxOSApOworICAgICAgZGVxdWU8dmVjdG9yPGludD4gPjo6aXRlcmF0b3IgZGl0KHZlY3RfZGVxdWUuYmVnaW4oKSksIGRpdEVuZCh2ZWN0X2RlcXVlLmVuZCgpKTsKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKKyAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBkaXQgIT0gZGl0RW5kOyArK2RpdCwgKytpKSB7CisgICAgICAgIENQUFVOSVRfQVNTRVJUKCBidWZzW2ldID09ICZkaXQtPmZyb250KCkgKTsKKyAgICAgIH0KKyNlbmRpZgorICAgIH0KKworICAgIHsKKyAgICAgIGRlcXVlPHZlY3RvcjxpbnQ+ID46Oml0ZXJhdG9yIGl0ID0gdmVjdF9kZXF1ZS5lbmQoKSAtIDU7CisgICAgICBpbnQgbmJfaW5jciA9IDA7CisgICAgICBmb3IgKDsgaXQgIT0gdmVjdF9kZXF1ZS5lbmQoKSAmJiBuYl9pbmNyIDw9IDY7ICsrbmJfaW5jciwgKytpdCkge30KKyAgICAgIENQUFVOSVRfQVNTRVJUKCBuYl9pbmNyID09IDUgKTsKKyAgICB9CisKKyAgICB7CisgICAgICAvL2VyYXNlIGluIHRoZSBiYWNrOgorICAgICAgdmVjdF9kZXF1ZS5lcmFzZSh2ZWN0X2RlcXVlLmVuZCgpIC0gMik7CisgICAgICBidWZzLmVyYXNlKGJ1ZnMuZW5kKCkgLSAyKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCB2ZWN0X2RlcXVlLnNpemUoKSA9PSAxOCApOworICAgICAgZGVxdWU8dmVjdG9yPGludD4gPjo6aXRlcmF0b3IgZGl0KHZlY3RfZGVxdWUuYmVnaW4oKSksIGRpdEVuZCh2ZWN0X2RlcXVlLmVuZCgpKTsKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKKyAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBkaXQgIT0gZGl0RW5kOyArK2RpdCwgKytpKSB7CisgICAgICAgIENQUFVOSVRfQVNTRVJUKCBidWZzW2ldID09ICZkaXQtPmZyb250KCkgKTsKKyAgICAgIH0KKyNlbmRpZgorICAgIH0KKworICAgIHsKKyAgICAgIGRlcXVlPHZlY3RvcjxpbnQ+ID46Oml0ZXJhdG9yIGl0ID0gdmVjdF9kZXF1ZS5lbmQoKSAtIDU7CisgICAgICBpbnQgbmJfaW5jciA9IDA7CisgICAgICBmb3IgKDsgaXQgIT0gdmVjdF9kZXF1ZS5lbmQoKSAmJiBuYl9pbmNyIDwgNjsgKytuYl9pbmNyLCArK2l0KSB7fQorICAgICAgQ1BQVU5JVF9BU1NFUlQoIG5iX2luY3IgPT0gNSApOworICAgIH0KKworICAgIHsKKyAgICAgIC8vcmFuZ2UgZXJhc2UgaW4gZnJvbnQKKyAgICAgIHZlY3RfZGVxdWUuZXJhc2UodmVjdF9kZXF1ZS5iZWdpbigpICsgMywgdmVjdF9kZXF1ZS5iZWdpbigpICsgNSk7CisgICAgICBidWZzLmVyYXNlKGJ1ZnMuYmVnaW4oKSArIDMsIGJ1ZnMuYmVnaW4oKSArIDUpOworICAgICAgQ1BQVU5JVF9BU1NFUlQoIHZlY3RfZGVxdWUuc2l6ZSgpID09IDE2ICk7CisgICAgICBkZXF1ZTx2ZWN0b3I8aW50PiA+OjppdGVyYXRvciBkaXQodmVjdF9kZXF1ZS5iZWdpbigpKSwgZGl0RW5kKHZlY3RfZGVxdWUuZW5kKCkpOworI2lmIGRlZmluZWQgKFNUTFBPUlQpICYmICFkZWZpbmVkIChfU1RMUF9OT19NT1ZFX1NFTUFOVElDKQorICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGRpdCAhPSBkaXRFbmQ7ICsrZGl0LCArK2kpIHsKKyAgICAgICAgQ1BQVU5JVF9BU1NFUlQoIGJ1ZnNbaV0gPT0gJmRpdC0+ZnJvbnQoKSApOworICAgICAgfQorI2VuZGlmCisgICAgfQorCisgICAgeworICAgICAgZGVxdWU8dmVjdG9yPGludD4gPjo6aXRlcmF0b3IgaXQgPSB2ZWN0X2RlcXVlLmVuZCgpIC0gNTsKKyAgICAgIGludCBuYl9pbmNyID0gMDsKKyAgICAgIGZvciAoOyBpdCAhPSB2ZWN0X2RlcXVlLmVuZCgpICYmIG5iX2luY3IgPD0gNjsgKytuYl9pbmNyLCArK2l0KSB7fQorICAgICAgQ1BQVU5JVF9BU1NFUlQoIG5iX2luY3IgPT0gNSApOworICAgIH0KKworICAgIHsKKyAgICAgIC8vcmFuZ2UgZXJhc2UgaW4gYmFjaworICAgICAgdmVjdF9kZXF1ZS5lcmFzZSh2ZWN0X2RlcXVlLmVuZCgpIC0gNSwgdmVjdF9kZXF1ZS5lbmQoKSAtIDMpOworICAgICAgYnVmcy5lcmFzZShidWZzLmVuZCgpIC0gNSwgYnVmcy5lbmQoKSAtIDMpOworICAgICAgQ1BQVU5JVF9BU1NFUlQoIHZlY3RfZGVxdWUuc2l6ZSgpID09IDE0ICk7CisgICAgICBkZXF1ZTx2ZWN0b3I8aW50PiA+OjppdGVyYXRvciBkaXQodmVjdF9kZXF1ZS5iZWdpbigpKSwgZGl0RW5kKHZlY3RfZGVxdWUuZW5kKCkpOworI2lmIGRlZmluZWQgKFNUTFBPUlQpICYmICFkZWZpbmVkIChfU1RMUF9OT19NT1ZFX1NFTUFOVElDKQorICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGRpdCAhPSBkaXRFbmQ7ICsrZGl0LCArK2kpIHsKKyAgICAgICAgQ1BQVU5JVF9BU1NFUlQoIGJ1ZnNbaV0gPT0gJmRpdC0+ZnJvbnQoKSApOworICAgICAgfQorI2VuZGlmCisgICAgfQorICB9CisKKyAgLy9DaGVjayB0aGUgaW5zZXJ0IHZhbHVlKHMpCisgIHsKKyAgICBkZXF1ZTx2ZWN0b3I8aW50PiA+IHZlY3RfZGVxdWU7CisgICAgdmVjdF9kZXF1ZS5hc3NpZ24oMjAsIHZlY3RvcjxpbnQ+KDEwKSk7CisgICAgZGVxdWU8dmVjdG9yPGludD4gPjo6aXRlcmF0b3IgdmRpdCh2ZWN0X2RlcXVlLmJlZ2luKCkpLCB2ZGl0RW5kKHZlY3RfZGVxdWUuZW5kKCkpOworICAgIHZlY3RvcjxpbnQqPiBidWZzOworICAgIGZvciAoOyB2ZGl0ICE9IHZkaXRFbmQ7ICsrdmRpdCkgeworICAgICAgYnVmcy5wdXNoX2JhY2soJnZkaXQtPmZyb250KCkpOworICAgIH0KKworICAgIHsKKyAgICAgIC8vMiB2YWx1ZXMgaW4gZnJvbnQ6CisgICAgICB2ZWN0X2RlcXVlLmluc2VydCh2ZWN0X2RlcXVlLmJlZ2luKCkgKyAyLCAyLCB2ZWN0b3I8aW50PigxMCkpOworICAgICAgYnVmcy5pbnNlcnQoYnVmcy5iZWdpbigpICsgMiwgJnZlY3RfZGVxdWVbMl0uZnJvbnQoKSk7CisgICAgICBidWZzLmluc2VydChidWZzLmJlZ2luKCkgKyAzLCAmdmVjdF9kZXF1ZVszXS5mcm9udCgpKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCB2ZWN0X2RlcXVlLnNpemUoKSA9PSAyMiApOworICAgICAgZGVxdWU8dmVjdG9yPGludD4gPjo6aXRlcmF0b3IgZGl0KHZlY3RfZGVxdWUuYmVnaW4oKSksIGRpdEVuZCh2ZWN0X2RlcXVlLmVuZCgpKTsKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKKyAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBkaXQgIT0gZGl0RW5kOyArK2RpdCwgKytpKSB7CisgICAgICAgIENQUFVOSVRfQVNTRVJUKCBidWZzW2ldID09ICZkaXQtPmZyb250KCkgKTsKKyAgICAgIH0KKyNlbmRpZgorICAgIH0KKworICAgIHsKKyAgICAgIC8vMiB2YWx1ZXMgaW4gYmFjazoKKyAgICAgIHZlY3RfZGVxdWUuaW5zZXJ0KHZlY3RfZGVxdWUuZW5kKCkgLSAyLCAyLCB2ZWN0b3I8aW50PigxMCkpOworICAgICAgYnVmcy5pbnNlcnQoYnVmcy5lbmQoKSAtIDIsICZ2ZWN0X2RlcXVlWzIwXS5mcm9udCgpKTsKKyAgICAgIGJ1ZnMuaW5zZXJ0KGJ1ZnMuZW5kKCkgLSAyLCAmdmVjdF9kZXF1ZVsyMV0uZnJvbnQoKSk7CisgICAgICBDUFBVTklUX0FTU0VSVCggdmVjdF9kZXF1ZS5zaXplKCkgPT0gMjQgKTsKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKKyAgICAgIGRlcXVlPHZlY3RvcjxpbnQ+ID46Oml0ZXJhdG9yIGRpdCh2ZWN0X2RlcXVlLmJlZ2luKCkpLCBkaXRFbmQodmVjdF9kZXF1ZS5lbmQoKSk7CisgICAgICBmb3IgKHNpemVfdCBpID0gMDsgZGl0ICE9IGRpdEVuZDsgKytkaXQsICsraSkgeworICAgICAgICBDUFBVTklUX0FTU0VSVCggYnVmc1tpXSA9PSAmZGl0LT5mcm9udCgpICk7CisgICAgICB9CisjZW5kaWYKKyAgICB9CisKKyAgICB7CisgICAgICAvLzEgdmFsdWUgaW4gZnJvbnQ6CisgICAgICBkZXF1ZTx2ZWN0b3I8aW50PiA+OjppdGVyYXRvciByZXQ7CisgICAgICByZXQgPSB2ZWN0X2RlcXVlLmluc2VydCh2ZWN0X2RlcXVlLmJlZ2luKCkgKyAyLCB2ZWN0b3I8aW50PigxMCkpOworICAgICAgYnVmcy5pbnNlcnQoYnVmcy5iZWdpbigpICsgMiwgJnZlY3RfZGVxdWVbMl0uZnJvbnQoKSk7CisgICAgICBDUFBVTklUX0FTU0VSVCggdmVjdF9kZXF1ZS5zaXplKCkgPT0gMjUgKTsKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKKyAgICAgIENQUFVOSVRfQVNTRVJUKCAmcmV0LT5mcm9udCgpID09IGJ1ZnNbMl0gKTsKKyAgICAgIGRlcXVlPHZlY3RvcjxpbnQ+ID46Oml0ZXJhdG9yIGRpdCh2ZWN0X2RlcXVlLmJlZ2luKCkpLCBkaXRFbmQodmVjdF9kZXF1ZS5lbmQoKSk7CisgICAgICBmb3IgKHNpemVfdCBpID0gMDsgZGl0ICE9IGRpdEVuZDsgKytkaXQsICsraSkgeworICAgICAgICBDUFBVTklUX0FTU0VSVCggYnVmc1tpXSA9PSAmZGl0LT5mcm9udCgpICk7CisgICAgICB9CisjZW5kaWYKKyAgICB9CisKKyAgICB7CisgICAgICAvLzEgdmFsdWUgaW4gYmFjazoKKyAgICAgIGRlcXVlPHZlY3RvcjxpbnQ+ID46Oml0ZXJhdG9yIHJldDsKKyAgICAgIHJldCA9IHZlY3RfZGVxdWUuaW5zZXJ0KHZlY3RfZGVxdWUuZW5kKCkgLSAyLCB2ZWN0b3I8aW50PigxMCkpOworICAgICAgYnVmcy5pbnNlcnQoYnVmcy5lbmQoKSAtIDIsICZ2ZWN0X2RlcXVlWzIzXS5mcm9udCgpKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCB2ZWN0X2RlcXVlLnNpemUoKSA9PSAyNiApOworI2lmIGRlZmluZWQgKFNUTFBPUlQpICYmICFkZWZpbmVkIChfU1RMUF9OT19NT1ZFX1NFTUFOVElDKQorICAgICAgQ1BQVU5JVF9BU1NFUlQoICZyZXQtPmZyb250KCkgPT0gYnVmc1syM10gKTsKKyAgICAgIGRlcXVlPHZlY3RvcjxpbnQ+ID46Oml0ZXJhdG9yIGRpdCh2ZWN0X2RlcXVlLmJlZ2luKCkpLCBkaXRFbmQodmVjdF9kZXF1ZS5lbmQoKSk7CisgICAgICBmb3IgKHNpemVfdCBpID0gMDsgZGl0ICE9IGRpdEVuZDsgKytkaXQsICsraSkgeworICAgICAgICBDUFBVTklUX0FTU0VSVCggYnVmc1tpXSA9PSAmZGl0LT5mcm9udCgpICk7CisgICAgICB9CisjZW5kaWYKKyAgICB9CisgIH0KK30KKwordm9pZCBNb3ZlQ29uc3RydWN0b3JUZXN0Ojp2ZWN0b3JfdGVzdCgpCit7CisgIC8vQ2hlY2sgdGhlIGluc2VydCByYW5nZSBtZXRob2QuCisgIC8vVG8gdGhlIGZyb250OgorICB7CisgICAgdmVjdG9yPHZlY3RvcjxpbnQ+ID4gdmVjdF92ZWN0b3I7CisgICAgdmVjdG9yPGludCo+IGJ1ZnM7CisgICAgdmVjdF92ZWN0b3IuYXNzaWduKDMsIHZlY3RvcjxpbnQ+KDEwKSk7CisgICAgYnVmcy5wdXNoX2JhY2soJnZlY3RfdmVjdG9yWzBdLmZyb250KCkpOworICAgIGJ1ZnMucHVzaF9iYWNrKCZ2ZWN0X3ZlY3RvclsxXS5mcm9udCgpKTsKKyAgICBidWZzLnB1c2hfYmFjaygmdmVjdF92ZWN0b3JbMl0uZnJvbnQoKSk7CisKKyAgICBpbnQgbmJfaW5zZXJ0ID0gNTsKKyAgICBpbnQgcG9zID0gMTsKKyAgICB3aGlsZSAobmJfaW5zZXJ0LS0pIHsKKyAgICAgIHZlY3Rvcjx2ZWN0b3I8aW50PiA+IHZlY3RfdmVjdCgyLCB2ZWN0b3I8aW50PigxMCkpOworICAgICAgdmVjdF92ZWN0b3IuaW5zZXJ0KHZlY3RfdmVjdG9yLmJlZ2luKCkgKyBwb3MsIHZlY3RfdmVjdC5iZWdpbigpLCB2ZWN0X3ZlY3QuZW5kKCkpOworICAgICAgYnVmcy5pbnNlcnQoYnVmcy5iZWdpbigpICsgcG9zLCAmdmVjdF92ZWN0b3JbcG9zXS5mcm9udCgpKTsKKyAgICAgIGJ1ZnMuaW5zZXJ0KGJ1ZnMuYmVnaW4oKSArIHBvcyArIDEsICZ2ZWN0X3ZlY3Rvcltwb3MgKyAxXS5mcm9udCgpKTsKKyAgICAgICsrcG9zOworICAgIH0KKyAgICBDUFBVTklUX0FTU0VSVCggdmVjdF92ZWN0b3Iuc2l6ZSgpID09IDEzICk7CisjaWYgZGVmaW5lZCAoU1RMUE9SVCkgJiYgIWRlZmluZWQgKF9TVExQX05PX01PVkVfU0VNQU5USUMpCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyArK2kpIHsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBidWZzW2ldID09ICZ2ZWN0X3ZlY3RvcltpXS5mcm9udCgpICk7CisgICAgICBDUFBVTklUX0FTU0VSVCggYnVmc1sxMSAtIGldID09ICZ2ZWN0X3ZlY3RvclsxMSAtIGldLmZyb250KCkgKTsKKyAgICB9CisjZW5kaWYKKyAgfQorCisgIC8vVG8gdGhlIGJhY2sKKyAgeworICAgIHZlY3Rvcjx2ZWN0b3I8aW50PiA+IHZlY3RfdmVjdG9yOworICAgIHZlY3RvcjxpbnQqPiBidWZzOworICAgIHZlY3RfdmVjdG9yLmFzc2lnbigzLCB2ZWN0b3I8aW50PigxMCkpOworICAgIGJ1ZnMucHVzaF9iYWNrKCZ2ZWN0X3ZlY3RvclswXS5mcm9udCgpKTsKKyAgICBidWZzLnB1c2hfYmFjaygmdmVjdF92ZWN0b3JbMV0uZnJvbnQoKSk7CisgICAgYnVmcy5wdXNoX2JhY2soJnZlY3RfdmVjdG9yWzJdLmZyb250KCkpOworCisgICAgaW50IG5iX2luc2VydCA9IDU7CisgICAgLy9Jbml0aWFsaXplIHRvIDIgdG8gZ2VuZXJhdGUgYSBiYWNrIGluc2VydGlvbjoKKyAgICBpbnQgcG9zID0gMjsKKyAgICB3aGlsZSAobmJfaW5zZXJ0LS0pIHsKKyAgICAgIHZlY3Rvcjx2ZWN0b3I8aW50PiA+IHZlY3RfdmVjdCgyLCB2ZWN0b3I8aW50PigxMCkpOworICAgICAgdmVjdF92ZWN0b3IuaW5zZXJ0KHZlY3RfdmVjdG9yLmJlZ2luKCkgKyBwb3MsIHZlY3RfdmVjdC5iZWdpbigpLCB2ZWN0X3ZlY3QuZW5kKCkpOworICAgICAgYnVmcy5pbnNlcnQoYnVmcy5iZWdpbigpICsgcG9zLCAmdmVjdF92ZWN0b3JbcG9zXS5mcm9udCgpKTsKKyAgICAgIGJ1ZnMuaW5zZXJ0KGJ1ZnMuYmVnaW4oKSArIHBvcyArIDEsICZ2ZWN0X3ZlY3Rvcltwb3MgKyAxXS5mcm9udCgpKTsKKyAgICAgICsrcG9zOworICAgIH0KKyAgICBDUFBVTklUX0FTU0VSVCggdmVjdF92ZWN0b3Iuc2l6ZSgpID09IDEzICk7CisjaWYgZGVmaW5lZCAoU1RMUE9SVCkgJiYgIWRlZmluZWQgKF9TVExQX05PX01PVkVfU0VNQU5USUMpCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyArK2kpIHsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBidWZzW2kgKyAxXSA9PSAmdmVjdF92ZWN0b3JbaSArIDFdLmZyb250KCkgKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBidWZzWzEyIC0gaV0gPT0gJnZlY3RfdmVjdG9yWzEyIC0gaV0uZnJvbnQoKSApOworICAgIH0KKyNlbmRpZgorICB9CisKKyAgLy9DaGVjayB0aGUgZGlmZmVyZW50IGVyYXNlIG1ldGhvZHMuCisgIHsKKyAgICB2ZWN0b3I8dmVjdG9yPGludD4gPiB2ZWN0X3ZlY3RvcjsKKyAgICB2ZWN0X3ZlY3Rvci5hc3NpZ24oMjAsIHZlY3RvcjxpbnQ+KDEwKSk7CisgICAgdmVjdG9yPHZlY3RvcjxpbnQ+ID46Oml0ZXJhdG9yIHZkaXQodmVjdF92ZWN0b3IuYmVnaW4oKSksIHZkaXRFbmQodmVjdF92ZWN0b3IuZW5kKCkpOworICAgIHZlY3RvcjxpbnQqPiBidWZzOworICAgIGZvciAoOyB2ZGl0ICE9IHZkaXRFbmQ7ICsrdmRpdCkgeworICAgICAgYnVmcy5wdXNoX2JhY2soJnZkaXQtPmZyb250KCkpOworICAgIH0KKworICAgIHsKKyAgICAgIC8vIFRoaXMgY2hlY2ssIHJlcGVhdGVkIGFmdGVyIGVhY2ggb3BlcmF0aW9uLCBjaGVjayB0aGUgdmVjdG9yIGNvbnNpc3RlbmN5OgorICAgICAgdmVjdG9yPHZlY3RvcjxpbnQ+ID46Oml0ZXJhdG9yIGl0ID0gdmVjdF92ZWN0b3IuZW5kKCkgLSA1OworICAgICAgaW50IG5iX2luY3IgPSAwOworICAgICAgZm9yICg7IGl0ICE9IHZlY3RfdmVjdG9yLmVuZCgpICYmIG5iX2luY3IgPD0gNjsgKytuYl9pbmNyLCArK2l0KSB7fQorICAgICAgQ1BQVU5JVF9BU1NFUlQoIG5iX2luY3IgPT0gNSApOworICAgIH0KKworICAgIHsKKyAgICAgIC8vZXJhc2UgaW4gZnJvbnQ6CisgICAgICB2ZWN0X3ZlY3Rvci5lcmFzZSh2ZWN0X3ZlY3Rvci5iZWdpbigpICsgMik7CisgICAgICBidWZzLmVyYXNlKGJ1ZnMuYmVnaW4oKSArIDIpOworICAgICAgQ1BQVU5JVF9BU1NFUlQoIHZlY3RfdmVjdG9yLnNpemUoKSA9PSAxOSApOworI2lmIGRlZmluZWQgKFNUTFBPUlQpICYmICFkZWZpbmVkIChfU1RMUF9OT19NT1ZFX1NFTUFOVElDKQorICAgICAgdmVjdG9yPHZlY3RvcjxpbnQ+ID46Oml0ZXJhdG9yIGRpdCh2ZWN0X3ZlY3Rvci5iZWdpbigpKSwgZGl0RW5kKHZlY3RfdmVjdG9yLmVuZCgpKTsKKyAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBkaXQgIT0gZGl0RW5kOyArK2RpdCwgKytpKSB7CisgICAgICAgIENQUFVOSVRfQVNTRVJUKCBidWZzW2ldID09ICZkaXQtPmZyb250KCkgKTsKKyAgICAgIH0KKyNlbmRpZgorICAgIH0KKworICAgIHsKKyAgICAgIHZlY3Rvcjx2ZWN0b3I8aW50PiA+OjppdGVyYXRvciBpdCA9IHZlY3RfdmVjdG9yLmVuZCgpIC0gNTsKKyAgICAgIGludCBuYl9pbmNyID0gMDsKKyAgICAgIGZvciAoOyBpdCAhPSB2ZWN0X3ZlY3Rvci5lbmQoKSAmJiBuYl9pbmNyIDw9IDY7ICsrbmJfaW5jciwgKytpdCkge30KKyAgICAgIENQUFVOSVRfQVNTRVJUKCBuYl9pbmNyID09IDUgKTsKKyAgICB9CisKKyAgICB7CisgICAgICAvL2VyYXNlIGluIHRoZSBiYWNrOgorICAgICAgdmVjdF92ZWN0b3IuZXJhc2UodmVjdF92ZWN0b3IuZW5kKCkgLSAyKTsKKyAgICAgIGJ1ZnMuZXJhc2UoYnVmcy5lbmQoKSAtIDIpOworICAgICAgQ1BQVU5JVF9BU1NFUlQoIHZlY3RfdmVjdG9yLnNpemUoKSA9PSAxOCApOworI2lmIGRlZmluZWQgKFNUTFBPUlQpICYmICFkZWZpbmVkIChfU1RMUF9OT19NT1ZFX1NFTUFOVElDKQorICAgICAgdmVjdG9yPHZlY3RvcjxpbnQ+ID46Oml0ZXJhdG9yIGRpdCh2ZWN0X3ZlY3Rvci5iZWdpbigpKSwgZGl0RW5kKHZlY3RfdmVjdG9yLmVuZCgpKTsKKyAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBkaXQgIT0gZGl0RW5kOyArK2RpdCwgKytpKSB7CisgICAgICAgIENQUFVOSVRfQVNTRVJUKCBidWZzW2ldID09ICZkaXQtPmZyb250KCkgKTsKKyAgICAgIH0KKyNlbmRpZgorICAgIH0KKworICAgIHsKKyAgICAgIHZlY3Rvcjx2ZWN0b3I8aW50PiA+OjppdGVyYXRvciBpdCA9IHZlY3RfdmVjdG9yLmVuZCgpIC0gNTsKKyAgICAgIGludCBuYl9pbmNyID0gMDsKKyAgICAgIGZvciAoOyBpdCAhPSB2ZWN0X3ZlY3Rvci5lbmQoKSAmJiBuYl9pbmNyIDwgNjsgKytuYl9pbmNyLCArK2l0KSB7fQorICAgICAgQ1BQVU5JVF9BU1NFUlQoIG5iX2luY3IgPT0gNSApOworICAgIH0KKworICAgIHsKKyAgICAgIC8vcmFuZ2UgZXJhc2UgaW4gZnJvbnQKKyAgICAgIHZlY3RfdmVjdG9yLmVyYXNlKHZlY3RfdmVjdG9yLmJlZ2luKCkgKyAzLCB2ZWN0X3ZlY3Rvci5iZWdpbigpICsgNSk7CisgICAgICBidWZzLmVyYXNlKGJ1ZnMuYmVnaW4oKSArIDMsIGJ1ZnMuYmVnaW4oKSArIDUpOworICAgICAgQ1BQVU5JVF9BU1NFUlQoIHZlY3RfdmVjdG9yLnNpemUoKSA9PSAxNiApOworI2lmIGRlZmluZWQgKFNUTFBPUlQpICYmICFkZWZpbmVkIChfU1RMUF9OT19NT1ZFX1NFTUFOVElDKQorICAgICAgdmVjdG9yPHZlY3RvcjxpbnQ+ID46Oml0ZXJhdG9yIGRpdCh2ZWN0X3ZlY3Rvci5iZWdpbigpKSwgZGl0RW5kKHZlY3RfdmVjdG9yLmVuZCgpKTsKKyAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBkaXQgIT0gZGl0RW5kOyArK2RpdCwgKytpKSB7CisgICAgICAgIENQUFVOSVRfQVNTRVJUKCBidWZzW2ldID09ICZkaXQtPmZyb250KCkgKTsKKyAgICAgIH0KKyNlbmRpZgorICAgIH0KKworICAgIHsKKyAgICAgIHZlY3Rvcjx2ZWN0b3I8aW50PiA+OjppdGVyYXRvciBpdCA9IHZlY3RfdmVjdG9yLmVuZCgpIC0gNTsKKyAgICAgIGludCBuYl9pbmNyID0gMDsKKyAgICAgIGZvciAoOyBpdCAhPSB2ZWN0X3ZlY3Rvci5lbmQoKSAmJiBuYl9pbmNyIDw9IDY7ICsrbmJfaW5jciwgKytpdCkge30KKyAgICAgIENQUFVOSVRfQVNTRVJUKCBuYl9pbmNyID09IDUgKTsKKyAgICB9CisKKyAgICB7CisgICAgICAvL3JhbmdlIGVyYXNlIGluIGJhY2sKKyAgICAgIHZlY3RfdmVjdG9yLmVyYXNlKHZlY3RfdmVjdG9yLmVuZCgpIC0gNSwgdmVjdF92ZWN0b3IuZW5kKCkgLSAzKTsKKyAgICAgIGJ1ZnMuZXJhc2UoYnVmcy5lbmQoKSAtIDUsIGJ1ZnMuZW5kKCkgLSAzKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCB2ZWN0X3ZlY3Rvci5zaXplKCkgPT0gMTQgKTsKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKKyAgICAgIHZlY3Rvcjx2ZWN0b3I8aW50PiA+OjppdGVyYXRvciBkaXQodmVjdF92ZWN0b3IuYmVnaW4oKSksIGRpdEVuZCh2ZWN0X3ZlY3Rvci5lbmQoKSk7CisgICAgICBmb3IgKHNpemVfdCBpID0gMDsgZGl0ICE9IGRpdEVuZDsgKytkaXQsICsraSkgeworICAgICAgICBDUFBVTklUX0FTU0VSVCggYnVmc1tpXSA9PSAmZGl0LT5mcm9udCgpICk7CisgICAgICB9CisjZW5kaWYKKyAgICB9CisgIH0KKworICAvL0NoZWNrIHRoZSBpbnNlcnQgdmFsdWUocykKKyAgeworICAgIHZlY3Rvcjx2ZWN0b3I8aW50PiA+IHZlY3RfdmVjdG9yOworICAgIHZlY3RfdmVjdG9yLmFzc2lnbigyMCwgdmVjdG9yPGludD4oMTApKTsKKyAgICB2ZWN0b3I8dmVjdG9yPGludD4gPjo6aXRlcmF0b3IgdmRpdCh2ZWN0X3ZlY3Rvci5iZWdpbigpKSwgdmRpdEVuZCh2ZWN0X3ZlY3Rvci5lbmQoKSk7CisgICAgdmVjdG9yPGludCo+IGJ1ZnM7CisgICAgZm9yICg7IHZkaXQgIT0gdmRpdEVuZDsgKyt2ZGl0KSB7CisgICAgICBidWZzLnB1c2hfYmFjaygmdmRpdC0+ZnJvbnQoKSk7CisgICAgfQorCisgICAgeworICAgICAgLy8yIHZhbHVlcyBpbiBmcm9udDoKKyAgICAgIHZlY3RfdmVjdG9yLmluc2VydCh2ZWN0X3ZlY3Rvci5iZWdpbigpICsgMiwgMiwgdmVjdG9yPGludD4oMTApKTsKKyAgICAgIGJ1ZnMuaW5zZXJ0KGJ1ZnMuYmVnaW4oKSArIDIsICZ2ZWN0X3ZlY3RvclsyXS5mcm9udCgpKTsKKyAgICAgIGJ1ZnMuaW5zZXJ0KGJ1ZnMuYmVnaW4oKSArIDMsICZ2ZWN0X3ZlY3RvclszXS5mcm9udCgpKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCB2ZWN0X3ZlY3Rvci5zaXplKCkgPT0gMjIgKTsKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKKyAgICAgIHZlY3Rvcjx2ZWN0b3I8aW50PiA+OjppdGVyYXRvciBkaXQodmVjdF92ZWN0b3IuYmVnaW4oKSksIGRpdEVuZCh2ZWN0X3ZlY3Rvci5lbmQoKSk7CisgICAgICBmb3IgKHNpemVfdCBpID0gMDsgZGl0ICE9IGRpdEVuZDsgKytkaXQsICsraSkgeworICAgICAgICBDUFBVTklUX0FTU0VSVCggYnVmc1tpXSA9PSAmZGl0LT5mcm9udCgpICk7CisgICAgICB9CisjZW5kaWYKKyAgICB9CisKKyAgICB7CisgICAgICAvLzIgdmFsdWVzIGluIGJhY2s6CisgICAgICB2ZWN0X3ZlY3Rvci5pbnNlcnQodmVjdF92ZWN0b3IuZW5kKCkgLSAyLCAyLCB2ZWN0b3I8aW50PigxMCkpOworICAgICAgYnVmcy5pbnNlcnQoYnVmcy5lbmQoKSAtIDIsICZ2ZWN0X3ZlY3RvclsyMF0uZnJvbnQoKSk7CisgICAgICBidWZzLmluc2VydChidWZzLmVuZCgpIC0gMiwgJnZlY3RfdmVjdG9yWzIxXS5mcm9udCgpKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCB2ZWN0X3ZlY3Rvci5zaXplKCkgPT0gMjQgKTsKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKKyAgICAgIHZlY3Rvcjx2ZWN0b3I8aW50PiA+OjppdGVyYXRvciBkaXQodmVjdF92ZWN0b3IuYmVnaW4oKSksIGRpdEVuZCh2ZWN0X3ZlY3Rvci5lbmQoKSk7CisgICAgICBmb3IgKHNpemVfdCBpID0gMDsgZGl0ICE9IGRpdEVuZDsgKytkaXQsICsraSkgeworICAgICAgICBDUFBVTklUX0FTU0VSVCggYnVmc1tpXSA9PSAmZGl0LT5mcm9udCgpICk7CisgICAgICB9CisjZW5kaWYKKyAgICB9CisKKyAgICB7CisgICAgICAvLzEgdmFsdWUgaW4gZnJvbnQ6CisjaWYgZGVmaW5lZCAoU1RMUE9SVCkgJiYgIWRlZmluZWQgKF9TVExQX05PX01PVkVfU0VNQU5USUMpCisgICAgICB2ZWN0b3I8dmVjdG9yPGludD4gPjo6aXRlcmF0b3IgcmV0ID0KKyNlbmRpZgorICAgICAgdmVjdF92ZWN0b3IuaW5zZXJ0KHZlY3RfdmVjdG9yLmJlZ2luKCkgKyAyLCB2ZWN0b3I8aW50PigxMCkpOworICAgICAgYnVmcy5pbnNlcnQoYnVmcy5iZWdpbigpICsgMiwgJnZlY3RfdmVjdG9yWzJdLmZyb250KCkpOworICAgICAgQ1BQVU5JVF9BU1NFUlQoIHZlY3RfdmVjdG9yLnNpemUoKSA9PSAyNSApOworI2lmIGRlZmluZWQgKFNUTFBPUlQpICYmICFkZWZpbmVkIChfU1RMUF9OT19NT1ZFX1NFTUFOVElDKQorICAgICAgQ1BQVU5JVF9BU1NFUlQoICZyZXQtPmZyb250KCkgPT0gYnVmc1syXSApOworICAgICAgdmVjdG9yPHZlY3RvcjxpbnQ+ID46Oml0ZXJhdG9yIGRpdCh2ZWN0X3ZlY3Rvci5iZWdpbigpKSwgZGl0RW5kKHZlY3RfdmVjdG9yLmVuZCgpKTsKKyAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBkaXQgIT0gZGl0RW5kOyArK2RpdCwgKytpKSB7CisgICAgICAgIENQUFVOSVRfQVNTRVJUKCBidWZzW2ldID09ICZkaXQtPmZyb250KCkgKTsKKyAgICAgIH0KKyNlbmRpZgorICAgIH0KKworICAgIHsKKyAgICAgIC8vMSB2YWx1ZSBpbiBiYWNrOgorI2lmIGRlZmluZWQgKFNUTFBPUlQpICYmICFkZWZpbmVkIChfU1RMUF9OT19NT1ZFX1NFTUFOVElDKQorICAgICAgdmVjdG9yPHZlY3RvcjxpbnQ+ID46Oml0ZXJhdG9yIHJldCA9CisjZW5kaWYKKyAgICAgIHZlY3RfdmVjdG9yLmluc2VydCh2ZWN0X3ZlY3Rvci5lbmQoKSAtIDIsIHZlY3RvcjxpbnQ+KDEwKSk7CisgICAgICBidWZzLmluc2VydChidWZzLmVuZCgpIC0gMiwgJnZlY3RfdmVjdG9yWzIzXS5mcm9udCgpKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCB2ZWN0X3ZlY3Rvci5zaXplKCkgPT0gMjYgKTsKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKKyAgICAgIENQUFVOSVRfQVNTRVJUKCAmcmV0LT5mcm9udCgpID09IGJ1ZnNbMjNdICk7CisgICAgICB2ZWN0b3I8dmVjdG9yPGludD4gPjo6aXRlcmF0b3IgZGl0KHZlY3RfdmVjdG9yLmJlZ2luKCkpLCBkaXRFbmQodmVjdF92ZWN0b3IuZW5kKCkpOworICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGRpdCAhPSBkaXRFbmQ7ICsrZGl0LCArK2kpIHsKKyAgICAgICAgQ1BQVU5JVF9BU1NFUlQoIGJ1ZnNbaV0gPT0gJmRpdC0+ZnJvbnQoKSApOworICAgICAgfQorI2VuZGlmCisgICAgfQorICB9CisKKyAgLy9UaGUgZm9sbG93aW5nIHRlc3RzIGFyZSBjaGVja2luZyBtb3ZlIGNvbnRydWN0b3IgaW1wbGVtZW50YXRpb25zOgorICBjb25zdCBzdHJpbmcgbG9uZ19zdHIoImxvbmcgZW5vdWdoIHN0cmluZyB0byBmb3JjZSBkeW5hbWljIGFsbG9jYXRpb24iKTsKKyAgeworICAgIC8vdmVjdG9yIG1vdmUgY29udHJ1Y3RvcjoKKyAgICB2ZWN0b3I8dmVjdG9yPHN0cmluZz4gPiB2ZWN0KDEwLCB2ZWN0b3I8c3RyaW5nPigxMCwgbG9uZ19zdHIpKTsKKyAgICB2ZWN0b3I8c3RyaW5nPiBzdHJzOworICAgIHNpemVfdCBpbmRleCA9IDA7CisgICAgZm9yICg7OykgeworICAgICAgdmVjdG9yPHZlY3RvcjxzdHJpbmc+ID46Oml0ZXJhdG9yIGl0KHZlY3QuYmVnaW4oKSk7CisgICAgICBhZHZhbmNlKGl0LCBpbmRleCAlIHZlY3Quc2l6ZSgpKTsKKyAgICAgIHN0cnMucHVzaF9iYWNrKGl0LT5mcm9udCgpKTsKKyAgICAgIGl0LT5lcmFzZShpdC0+YmVnaW4oKSk7CisgICAgICBpZiAoaXQtPmVtcHR5KCkpIHsKKyAgICAgICAgdmVjdC5lcmFzZShpdCk7CisgICAgICAgIGlmICh2ZWN0LmVtcHR5KCkpCisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpbmRleCArPSAzOworICAgIH0KKyAgICBDUFBVTklUX0FTU0VSVCggc3Rycy5zaXplKCkgPT0gMTAgKiAxMCApOworICAgIHZlY3RvcjxzdHJpbmc+OjppdGVyYXRvciBpdChzdHJzLmJlZ2luKCkpLCBpdEVuZChzdHJzLmVuZCgpKTsKKyAgICBmb3IgKDsgaXQgIT0gaXRFbmQ7ICsraXQpIHsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCAqaXQgPT0gbG9uZ19zdHIgKTsKKyAgICB9CisgIH0KKworICB7CisgICAgLy9kZXF1ZSBtb3ZlIGNvbnRydWN0b3I6CisjICBpZiAhZGVmaW5lZCAoX19ETUNfXykKKyAgICB2ZWN0b3I8ZGVxdWU8c3RyaW5nPiA+IHZlY3QoMTAsIGRlcXVlPHN0cmluZz4oMTAsIGxvbmdfc3RyKSk7CisjICBlbHNlCisgICAgZGVxdWU8c3RyaW5nPiBkZXFfc3RyID0gZGVxdWU8c3RyaW5nPigxMCwgbG9uZ19zdHIpOworICAgIHZlY3RvcjxkZXF1ZTxzdHJpbmc+ID4gdmVjdCgxMCwgZGVxX3N0cik7CisjICBlbmRpZgorICAgIHZlY3RvcjxzdHJpbmc+IHN0cnM7CisgICAgc2l6ZV90IGluZGV4ID0gMDsKKyAgICBmb3IgKDs7KSB7CisgICAgICB2ZWN0b3I8ZGVxdWU8c3RyaW5nPiA+OjppdGVyYXRvciBpdCh2ZWN0LmJlZ2luKCkpOworICAgICAgYWR2YW5jZShpdCwgaW5kZXggJSB2ZWN0LnNpemUoKSk7CisgICAgICBzdHJzLnB1c2hfYmFjayhpdC0+ZnJvbnQoKSk7CisgICAgICBpdC0+cG9wX2Zyb250KCk7CisgICAgICBpZiAoaXQtPmVtcHR5KCkpIHsKKyAgICAgICAgdmVjdC5lcmFzZShpdCk7CisgICAgICAgIGlmICh2ZWN0LmVtcHR5KCkpCisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpbmRleCArPSAzOworICAgIH0KKyAgICBDUFBVTklUX0FTU0VSVCggc3Rycy5zaXplKCkgPT0gMTAgKiAxMCApOworICAgIHZlY3RvcjxzdHJpbmc+OjppdGVyYXRvciBpdChzdHJzLmJlZ2luKCkpLCBpdEVuZChzdHJzLmVuZCgpKTsKKyAgICBmb3IgKDsgaXQgIT0gaXRFbmQ7ICsraXQpIHsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCAqaXQgPT0gbG9uZ19zdHIgKTsKKyAgICB9CisgIH0KKworICB7CisgICAgLy9saXN0IG1vdmUgY29udHJ1Y3RvcjoKKyAgICB2ZWN0b3I8bGlzdDxzdHJpbmc+ID4gdmVjdCgxMCwgbGlzdDxzdHJpbmc+KDEwLCBsb25nX3N0cikpOworICAgIHZlY3RvcjxzdHJpbmc+IHN0cnM7CisgICAgc2l6ZV90IGluZGV4ID0gMDsKKyAgICBmb3IgKDs7KSB7CisgICAgICB2ZWN0b3I8bGlzdDxzdHJpbmc+ID46Oml0ZXJhdG9yIGl0KHZlY3QuYmVnaW4oKSk7CisgICAgICBhZHZhbmNlKGl0LCBpbmRleCAlIHZlY3Quc2l6ZSgpKTsKKyAgICAgIHN0cnMucHVzaF9iYWNrKGl0LT5mcm9udCgpKTsKKyAgICAgIGl0LT5wb3BfZnJvbnQoKTsKKyAgICAgIGlmIChpdC0+ZW1wdHkoKSkgeworICAgICAgICB2ZWN0LmVyYXNlKGl0KTsKKyAgICAgICAgaWYgKHZlY3QuZW1wdHkoKSkKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGluZGV4ICs9IDM7CisgICAgfQorICAgIENQUFVOSVRfQVNTRVJUKCBzdHJzLnNpemUoKSA9PSAxMCAqIDEwICk7CisgICAgdmVjdG9yPHN0cmluZz46Oml0ZXJhdG9yIGl0KHN0cnMuYmVnaW4oKSksIGl0RW5kKHN0cnMuZW5kKCkpOworICAgIGZvciAoOyBpdCAhPSBpdEVuZDsgKytpdCkgeworICAgICAgQ1BQVU5JVF9BU1NFUlQoICppdCA9PSBsb25nX3N0ciApOworICAgIH0KKyAgfQorCisjaWYgZGVmaW5lZCAoU1RMUE9SVCkgJiYgIWRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpCisgIHsKKyAgICAvL3NsaXN0IG1vdmUgY29udHJ1Y3RvcjoKKyAgICB2ZWN0b3I8c2xpc3Q8c3RyaW5nPiA+IHZlY3QoMTAsIHNsaXN0PHN0cmluZz4oMTAsIGxvbmdfc3RyKSk7CisgICAgdmVjdG9yPHN0cmluZz4gc3RyczsKKyAgICBzaXplX3QgaW5kZXggPSAwOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB2ZWN0b3I8c2xpc3Q8c3RyaW5nPiA+OjppdGVyYXRvciBpdCh2ZWN0LmJlZ2luKCkpOworICAgICAgYWR2YW5jZShpdCwgaW5kZXggJSB2ZWN0LnNpemUoKSk7CisgICAgICBzdHJzLnB1c2hfYmFjayhpdC0+ZnJvbnQoKSk7CisgICAgICBpdC0+cG9wX2Zyb250KCk7CisgICAgICBpZiAoaXQtPmVtcHR5KCkpIHsKKyAgICAgICAgdmVjdC5lcmFzZShpdCk7CisgICAgICAgIGlmICh2ZWN0LmVtcHR5KCkpCisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpbmRleCArPSAzOworICAgIH0KKyAgICBDUFBVTklUX0FTU0VSVCggc3Rycy5zaXplKCkgPT0gMTAgKiAxMCApOworICAgIHZlY3RvcjxzdHJpbmc+OjppdGVyYXRvciBpdChzdHJzLmJlZ2luKCkpLCBpdEVuZChzdHJzLmVuZCgpKTsKKyAgICBmb3IgKDsgaXQgIT0gaXRFbmQ7ICsraXQpIHsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCAqaXQgPT0gbG9uZ19zdHIgKTsKKyAgICB9CisgIH0KKyNlbmRpZgorCisgIHsKKyAgICAvL2JpbmFyeSB0cmVlIG1vdmUgY29udHJ1Y3RvcjoKKyAgICBtdWx0aXNldDxzdHJpbmc+IHJlZjsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDEwOyArK2kpIHsKKyAgICAgIHJlZi5pbnNlcnQobG9uZ19zdHIpOworICAgIH0KKyAgICB2ZWN0b3I8bXVsdGlzZXQ8c3RyaW5nPiA+IHZlY3QoMTAsIHJlZik7CisgICAgdmVjdG9yPHN0cmluZz4gc3RyczsKKyAgICBzaXplX3QgaW5kZXggPSAwOworICAgIGZvciAoOzspIHsKKyAgICAgIHZlY3RvcjxtdWx0aXNldDxzdHJpbmc+ID46Oml0ZXJhdG9yIGl0KHZlY3QuYmVnaW4oKSk7CisgICAgICBhZHZhbmNlKGl0LCBpbmRleCAlIHZlY3Quc2l6ZSgpKTsKKyAgICAgIHN0cnMucHVzaF9iYWNrKCppdC0+YmVnaW4oKSk7CisgICAgICBpdC0+ZXJhc2UoaXQtPmJlZ2luKCkpOworICAgICAgaWYgKGl0LT5lbXB0eSgpKSB7CisgICAgICAgIHZlY3QuZXJhc2UoaXQpOworICAgICAgICBpZiAodmVjdC5lbXB0eSgpKQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaW5kZXggKz0gMzsKKyAgICB9CisgICAgQ1BQVU5JVF9BU1NFUlQoIHN0cnMuc2l6ZSgpID09IDEwICogMTAgKTsKKyAgICB2ZWN0b3I8c3RyaW5nPjo6aXRlcmF0b3IgaXQoc3Rycy5iZWdpbigpKSwgaXRFbmQoc3Rycy5lbmQoKSk7CisgICAgZm9yICg7IGl0ICE9IGl0RW5kOyArK2l0KSB7CisgICAgICBDUFBVTklUX0FTU0VSVCggKml0ID09IGxvbmdfc3RyICk7CisgICAgfQorICB9CisKKyNpZiBkZWZpbmVkIChTVExQT1JUKQorIyAgaWYgIWRlZmluZWQgKF9fRE1DX18pCisgIHsKKyAgICAvL2hhc2ggY29udGFpbmVyIG1vdmUgY29udHJ1Y3RvcjoKKyAgICB1bm9yZGVyZWRfbXVsdGlzZXQ8c3RyaW5nPiByZWY7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAxMDsgKytpKSB7CisgICAgICByZWYuaW5zZXJ0KGxvbmdfc3RyKTsKKyAgICB9CisgICAgdmVjdG9yPHVub3JkZXJlZF9tdWx0aXNldDxzdHJpbmc+ID4gdmVjdCgxMCwgcmVmKTsKKyAgICB2ZWN0b3I8c3RyaW5nPiBzdHJzOworICAgIHNpemVfdCBpbmRleCA9IDA7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHZlY3Rvcjx1bm9yZGVyZWRfbXVsdGlzZXQ8c3RyaW5nPiA+OjppdGVyYXRvciBpdCh2ZWN0LmJlZ2luKCkpOworICAgICAgYWR2YW5jZShpdCwgaW5kZXggJSB2ZWN0LnNpemUoKSk7CisgICAgICBzdHJzLnB1c2hfYmFjaygqaXQtPmJlZ2luKCkpOworICAgICAgaXQtPmVyYXNlKGl0LT5iZWdpbigpKTsKKyAgICAgIGlmIChpdC0+ZW1wdHkoKSkgeworICAgICAgICB2ZWN0LmVyYXNlKGl0KTsKKyAgICAgICAgaWYgKHZlY3QuZW1wdHkoKSkKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGluZGV4ICs9IDM7CisgICAgfQorICAgIENQUFVOSVRfQVNTRVJUKCBzdHJzLnNpemUoKSA9PSAxMCAqIDEwICk7CisgICAgdmVjdG9yPHN0cmluZz46Oml0ZXJhdG9yIGl0KHN0cnMuYmVnaW4oKSksIGl0RW5kKHN0cnMuZW5kKCkpOworICAgIGZvciAoOyBpdCAhPSBpdEVuZDsgKytpdCkgeworICAgICAgQ1BQVU5JVF9BU1NFUlQoICppdCA9PSBsb25nX3N0ciApOworICAgIH0KKyAgfQorIyAgZW5kaWYKKyNlbmRpZgorfQorCisjaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKQorLyogU3BlY2lmaWMgQm9ybGFuZCB0ZXN0IGNhc2UgdG8gc2hvdyBhIHJlYWxseSB3ZWlyZCBjb21waWxlciBiZWhhdmlvci4KKyAqLworY2xhc3MgU3RhbmRhbG9uZQoreworcHVibGljOgorICAvL1VuY29tbWVudCBmb2xsb3dpbmcgdG8gcGFzcyB0aGUgdGVzdAorICAvL1N0YW5kYWxvbmUoKSB7fQorICB+U3RhbmRhbG9uZSgpIHt9CisKKyAgTW92YWJsZVN0cnVjdCBtb3ZhYmxlU3RydWN0OworICB2ZWN0b3I8aW50PiBpbnRWZWN0b3I7Cit9OworCit2b2lkIE1vdmVDb25zdHJ1Y3RvclRlc3Q6Om5iX2Rlc3RydWN0b3JfY2FsbHMoKQoreworICBNb3ZhYmxlU3RydWN0OjpyZXNldCgpOworCisgIHRyeQorICB7CisgICAgU3RhbmRhbG9uZSBzdGFuZGFsb25lOworICAgIHRocm93ICJzb21lIGV4Y2VwdGlvbiI7CisgICAgTW92YWJsZVN0cnVjdCBtb3ZhYmxlU3RydWN0OworICB9CisgIGNhdGNoIChjb25zdCBjaGFyKikKKyAgeworICAgIENQUFVOSVRfQVNTRVJUKCBNb3ZhYmxlU3RydWN0OjpuYl9kZnRfY29uc3RydWN0X2NhbGwgPT0gMSApOworICAgIENQUFVOSVRfQVNTRVJUKCBNb3ZhYmxlU3RydWN0OjpuYl9kZXN0cnVjdF9jYWxsID09IDEgKTsKKyAgfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvbXZjdG9yX3Rlc3QuaCBiL3Rlc3QvdW5pdC9tdmN0b3JfdGVzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMTRkYjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvbXZjdG9yX3Rlc3QuaApAQCAtMCwwICsxLDk3IEBACisjaW5jbHVkZSA8Y3N0ZGlvPiAvL3NpemVfdCBhbmQgU1RMcG9ydCBtYWNyb3MKKworI2luY2x1ZGUgImNwcHVuaXQvY3BwdW5pdF9wcm94eS5oIgorCisvLworLy8gVGVzdENhc2UgY2xhc3MKKy8vCitjbGFzcyBNb3ZlQ29uc3RydWN0b3JUZXN0IDogcHVibGljIENQUFVOSVRfTlM6OlRlc3RDYXNlCit7CisgIENQUFVOSVRfVEVTVF9TVUlURShNb3ZlQ29uc3RydWN0b3JUZXN0KTsKKyAgQ1BQVU5JVF9URVNUKG1vdmVfY29uc3RydWN0X3Rlc3QpOworICBDUFBVTklUX1RFU1QoZGVxdWVfdGVzdCk7CisgIENQUFVOSVRfVEVTVCh2ZWN0b3JfdGVzdCk7CisgIENQUFVOSVRfVEVTVChtb3ZlX3RyYWl0cyk7CisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IGRlZmluZWQgKF9TVExQX05PX01PVkVfU0VNQU5USUMpIHx8IFwKKyAgICBkZWZpbmVkIChfU1RMUF9ET05UX1NJTVVMQVRFX1BBUlRJQUxfU1BFQ19GT1JfVFlQRV9UUkFJVFMpIHx8IFwKKyAgICAoZGVmaW5lZCAoX19CT1JMQU5EQ19fKSAmJiAoX19CT1JMQU5EQ19fIDwgMHg1NjQpKQorICBDUFBVTklUX0lHTk9SRTsKKyMgIGVuZGlmCisgIENQUFVOSVRfVEVTVChtb3ZhYmxlX2RlY2xhcmF0aW9uKQorICBDUFBVTklUX1RFU1QobW92YWJsZV9kZWNsYXJhdGlvbl9hc3NvYykKKyAgQ1BQVU5JVF9URVNUKG1vdmFibGVfZGVjbGFyYXRpb25faGFzaCkKKyNpZiBkZWZpbmVkIChfX0JPUkxBTkRDX18pCisgIENQUFVOSVRfU1RPUF9JR05PUkU7CisgIENQUFVOSVRfVEVTVChuYl9kZXN0cnVjdG9yX2NhbGxzKTsKKyNlbmRpZgorICBDUFBVTklUX1RFU1RfU1VJVEVfRU5EKCk7CisKK3Byb3RlY3RlZDoKKyAgdm9pZCBtb3ZlX2NvbnN0cnVjdF90ZXN0KCk7CisgIHZvaWQgZGVxdWVfdGVzdCgpOworICB2b2lkIHZlY3Rvcl90ZXN0KCk7CisgIHZvaWQgbW92ZV90cmFpdHMoKTsKKyAgdm9pZCBtb3ZhYmxlX2RlY2xhcmF0aW9uKCk7CisgIHZvaWQgbW92YWJsZV9kZWNsYXJhdGlvbl9hc3NvYygpOworICB2b2lkIG1vdmFibGVfZGVjbGFyYXRpb25faGFzaCgpOworICB2b2lkIG5iX2Rlc3RydWN0b3JfY2FsbHMoKTsKKworICAvKgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0NvbnRhaW5lcj4KKyAgdm9pZCBzdGFuZGFyZF90ZXN0MShfQ29udGFpbmVyIGNvbnN0JiByZWZfY29udCkgeworICAgIHZlY3RvcjxfQ29udGFpbmVyPiB2ZWNfY29udCgxLCByZWZfY29udCk7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQ29udGFpbmVyOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgdmFsdWVfdHlwZSAqcHZhbHVlID0gJigqdmVjX2NvbnQuZnJvbnQoKS5iZWdpbigpKTsKKyAgICBzaXplX3QgY3VyX2NhcGFjaXR5PSB2ZWNfY29udC5jYXBhY2l0eSgpOworICAgIC8vZm9yY2UgcmVhbGxvY2F0aW9uCisgICAgd2hpbGUgKGN1cl9jYXBhY2l0eSA9PSB2ZWNfY29udC5jYXBhY2l0eSgpKSB7CisgICAgICB2ZWNfY29udC5wdXNoX2JhY2socmVmX2NvbnQpOworICAgIH0KKyAgICBib29sIGI9KCAocHZhbHVlPT0oJigqdmVjX2NvbnQuZnJvbnQoKS5iZWdpbigpKSkpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoYik7CisgIH0KKyAgKi8KKworcHJpdmF0ZToKKyAgdm9pZCBtb3ZlX3RyYWl0c192ZWMoKTsKKyAgdm9pZCBtb3ZlX3RyYWl0c192ZWNfY29tcGxldGUoKTsKKyAgdm9pZCBtb3ZlX3RyYWl0c19kZXEoKTsKKyAgdm9pZCBtb3ZlX3RyYWl0c19kZXFfY29tcGxldGUoKTsKK307CisKK3N0cnVjdCBNb3ZhYmxlU3RydWN0IHsKKyAgTW92YWJsZVN0cnVjdCgpIHsgKytuYl9kZnRfY29uc3RydWN0X2NhbGw7IH0KKyAgTW92YWJsZVN0cnVjdChNb3ZhYmxlU3RydWN0IGNvbnN0JikgeyArK25iX2NweV9jb25zdHJ1Y3RfY2FsbDsgfQorI2lmIGRlZmluZWQgKFNUTFBPUlQpICYmICFkZWZpbmVkIChfU1RMUF9OT19NT1ZFX1NFTUFOVElDKQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX05BTUVTUEFDRVMpCisgIE1vdmFibGVTdHJ1Y3Qoc3RkOjpfX21vdmVfc291cmNlPE1vdmFibGVTdHJ1Y3Q+KQorIyAgZWxzZQorICBNb3ZhYmxlU3RydWN0KF9fbW92ZV9zb3VyY2U8TW92YWJsZVN0cnVjdD4pCisjICBlbmRpZgorICB7ICsrbmJfbXZfY29uc3RydWN0X2NhbGw7IH0KKyNlbmRpZgorICB+TW92YWJsZVN0cnVjdCgpIHsgKytuYl9kZXN0cnVjdF9jYWxsOyB9CisKKyAgTW92YWJsZVN0cnVjdCYgb3BlcmF0b3IgPSAoY29uc3QgTW92YWJsZVN0cnVjdCYpIHsKKyAgICArK25iX2Fzc2lnbm1lbnRfY2FsbDsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBzdGF0aWMgdm9pZCByZXNldCgpIHsKKyAgICBuYl9kZnRfY29uc3RydWN0X2NhbGwgPSBuYl9jcHlfY29uc3RydWN0X2NhbGwgPSBuYl9tdl9jb25zdHJ1Y3RfY2FsbCA9IDA7CisgICAgbmJfYXNzaWdubWVudF9jYWxsID0gMDsKKyAgICBuYl9kZXN0cnVjdF9jYWxsID0gMDsKKyAgfQorCisgIHN0YXRpYyBzaXplX3QgbmJfZGZ0X2NvbnN0cnVjdF9jYWxsOworICBzdGF0aWMgc2l6ZV90IG5iX2NweV9jb25zdHJ1Y3RfY2FsbDsKKyAgc3RhdGljIHNpemVfdCBuYl9tdl9jb25zdHJ1Y3RfY2FsbDsKKyAgc3RhdGljIHNpemVfdCBuYl9hc3NpZ25tZW50X2NhbGw7CisgIHN0YXRpYyBzaXplX3QgbmJfZGVzdHJ1Y3RfY2FsbDsKKworICAvL0R1bW15IGRhdGEganVzdCB0byBjb250cm9sIHN0cnVjdCBzaXplb2YKKyAgLy9BcyBub2RlIGFsbG9jYXRvciBpbXBsZW1lbnRhdGlvbiBhbGlnbiBtZW1vcnkgYmxvY2tzIG9uIDIgKiBzaXplb2Yodm9pZCopCisgIC8vd2UgZ2l2ZSBNb3ZhYmxlU3RydWN0IHRoZSBzYW1lIHNpemUgaW4gb3JkZXIgdG8gaGF2ZSBleHBlY3RlZCBhbGxvY2F0aW9uCisgIC8vYW5kIG5vdCBtb3JlCisgIHZvaWQqIGR1bW15X2RhdGFbMl07Cit9OwpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L212Y3Rvcl90cmFpdHNfdGVzdC5jcHAgYi90ZXN0L3VuaXQvbXZjdG9yX3RyYWl0c190ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2VhOThmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L212Y3Rvcl90cmFpdHNfdGVzdC5jcHAKQEAgLTAsMCArMSw0NjAgQEAKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8ZGVxdWU+CisKKyNpbmNsdWRlICJtdmN0b3JfdGVzdC5oIgorCisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IGRlZmluZWQoX1NUTFBfVVNFX05BTUVTUEFDRVMpCit1c2luZyBuYW1lc3BhY2Ugc3RkOworI2VuZGlmCisKK3NpemVfdCBNb3ZhYmxlU3RydWN0OjpuYl9kZnRfY29uc3RydWN0X2NhbGwgPSAwOworc2l6ZV90IE1vdmFibGVTdHJ1Y3Q6Om5iX2NweV9jb25zdHJ1Y3RfY2FsbCA9IDA7CitzaXplX3QgTW92YWJsZVN0cnVjdDo6bmJfbXZfY29uc3RydWN0X2NhbGwgPSAwOworc2l6ZV90IE1vdmFibGVTdHJ1Y3Q6Om5iX2Fzc2lnbm1lbnRfY2FsbCA9IDA7CitzaXplX3QgTW92YWJsZVN0cnVjdDo6bmJfZGVzdHJ1Y3RfY2FsbCA9IDA7CisKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKKyMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9OQU1FU1BBQ0VTKQorbmFtZXNwYWNlIHN0ZCB7CisjICBlbmRpZgorICBfU1RMUF9URU1QTEFURV9OVUxMCisgIHN0cnVjdCBfX21vdmVfdHJhaXRzPE1vdmFibGVTdHJ1Y3Q+IHsKKyAgICB0eXBlZGVmIF9fdHJ1ZV90eXBlIGltcGxlbWVudGVkOworICAgIHR5cGVkZWYgX19mYWxzZV90eXBlIGNvbXBsZXRlOworICB9OworIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX05BTUVTUEFDRVMpCit9CisjICBlbmRpZgorI2VuZGlmCisKK3N0cnVjdCBDb21wbGV0ZU1vdmFibGVTdHJ1Y3QgeworICBDb21wbGV0ZU1vdmFibGVTdHJ1Y3QoKSB7ICsrbmJfZGZ0X2NvbnN0cnVjdF9jYWxsOyB9CisgIENvbXBsZXRlTW92YWJsZVN0cnVjdChDb21wbGV0ZU1vdmFibGVTdHJ1Y3QgY29uc3QmKSB7ICsrbmJfY3B5X2NvbnN0cnVjdF9jYWxsOyB9CisjaWYgZGVmaW5lZCAoU1RMUE9SVCkgJiYgIWRlZmluZWQgKF9TVExQX05PX01PVkVfU0VNQU5USUMpCisgIENvbXBsZXRlTW92YWJsZVN0cnVjdChfX21vdmVfc291cmNlPENvbXBsZXRlTW92YWJsZVN0cnVjdD4pIHsgKytuYl9tdl9jb25zdHJ1Y3RfY2FsbDsgfQorI2VuZGlmCisgIH5Db21wbGV0ZU1vdmFibGVTdHJ1Y3QoKSB7ICsrbmJfZGVzdHJ1Y3RfY2FsbDsgfQorCisgIENvbXBsZXRlTW92YWJsZVN0cnVjdCYgb3BlcmF0b3IgPSAoY29uc3QgQ29tcGxldGVNb3ZhYmxlU3RydWN0JikgeworICAgICsrbmJfYXNzaWdubWVudF9jYWxsOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBzdGF0aWMgdm9pZCByZXNldCgpIHsKKyAgICBuYl9kZnRfY29uc3RydWN0X2NhbGwgPSBuYl9jcHlfY29uc3RydWN0X2NhbGwgPSBuYl9tdl9jb25zdHJ1Y3RfY2FsbCA9IDA7CisgICAgbmJfYXNzaWdubWVudF9jYWxsID0gMDsKKyAgICBuYl9kZXN0cnVjdF9jYWxsID0gMDsKKyAgfQorCisgIHN0YXRpYyBzaXplX3QgbmJfZGZ0X2NvbnN0cnVjdF9jYWxsOworICBzdGF0aWMgc2l6ZV90IG5iX2NweV9jb25zdHJ1Y3RfY2FsbDsKKyAgc3RhdGljIHNpemVfdCBuYl9tdl9jb25zdHJ1Y3RfY2FsbDsKKyAgc3RhdGljIHNpemVfdCBuYl9hc3NpZ25tZW50X2NhbGw7CisgIHN0YXRpYyBzaXplX3QgbmJfZGVzdHJ1Y3RfY2FsbDsKKworICAvL1NlZSBNb3ZhYmxlU3RydWN0CisgIHZvaWQqIGR1bW15X2RhdGFbMl07Cit9OworCitzaXplX3QgQ29tcGxldGVNb3ZhYmxlU3RydWN0OjpuYl9kZnRfY29uc3RydWN0X2NhbGwgPSAwOworc2l6ZV90IENvbXBsZXRlTW92YWJsZVN0cnVjdDo6bmJfY3B5X2NvbnN0cnVjdF9jYWxsID0gMDsKK3NpemVfdCBDb21wbGV0ZU1vdmFibGVTdHJ1Y3Q6Om5iX212X2NvbnN0cnVjdF9jYWxsID0gMDsKK3NpemVfdCBDb21wbGV0ZU1vdmFibGVTdHJ1Y3Q6Om5iX2Fzc2lnbm1lbnRfY2FsbCA9IDA7CitzaXplX3QgQ29tcGxldGVNb3ZhYmxlU3RydWN0OjpuYl9kZXN0cnVjdF9jYWxsID0gMDsKKworI2lmIGRlZmluZWQgKFNUTFBPUlQpICYmICFkZWZpbmVkIChfU1RMUF9OT19NT1ZFX1NFTUFOVElDKQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX05BTUVTUEFDRVMpCituYW1lc3BhY2Ugc3RkIHsKKyMgIGVuZGlmCisgIF9TVExQX1RFTVBMQVRFX05VTEwKKyAgc3RydWN0IF9fbW92ZV90cmFpdHM8Q29tcGxldGVNb3ZhYmxlU3RydWN0PiB7CisgICAgdHlwZWRlZiBfX3RydWVfdHlwZSBpbXBsZW1lbnRlZDsKKyAgICB0eXBlZGVmIF9fdHJ1ZV90eXBlIGNvbXBsZXRlOworICB9OworIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX05BTUVTUEFDRVMpCit9CisjICBlbmRpZgorI2VuZGlmCisKK3ZvaWQgTW92ZUNvbnN0cnVjdG9yVGVzdDo6bW92ZV90cmFpdHMoKQoreworICBtb3ZlX3RyYWl0c192ZWMoKTsKKyAgbW92ZV90cmFpdHNfdmVjX2NvbXBsZXRlKCk7CisgIG1vdmVfdHJhaXRzX2RlcSgpOworICBtb3ZlX3RyYWl0c19kZXFfY29tcGxldGUoKTsKK30KKwordm9pZCBNb3ZlQ29uc3RydWN0b3JUZXN0Ojptb3ZlX3RyYWl0c192ZWMoKQoreworICB7CisgICAgeworICAgICAgdmVjdG9yPE1vdmFibGVTdHJ1Y3Q+IHZlY3Q7CisgICAgICB2ZWN0LnB1c2hfYmFjayhNb3ZhYmxlU3RydWN0KCkpOworICAgICAgdmVjdC5wdXNoX2JhY2soTW92YWJsZVN0cnVjdCgpKTsKKyAgICAgIHZlY3QucHVzaF9iYWNrKE1vdmFibGVTdHJ1Y3QoKSk7CisgICAgICB2ZWN0LnB1c2hfYmFjayhNb3ZhYmxlU3RydWN0KCkpOworCisgICAgICAvLyB2ZWN0IGNvbnRhaW5zIDQgZWxlbWVudHMKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBNb3ZhYmxlU3RydWN0OjpuYl9kZnRfY29uc3RydWN0X2NhbGwgPT0gNCApOworI2lmIGRlZmluZWQgKFNUTFBPUlQpCisjICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBNb3ZhYmxlU3RydWN0OjpuYl9jcHlfY29uc3RydWN0X2NhbGwgPT0gNCApOworICAgICAgQ1BQVU5JVF9BU1NFUlQoIE1vdmFibGVTdHJ1Y3Q6Om5iX212X2NvbnN0cnVjdF9jYWxsID09IDMgKTsKKyMgIGVsc2UKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBNb3ZhYmxlU3RydWN0OjpuYl9jcHlfY29uc3RydWN0X2NhbGwgPT0gNyApOworIyAgZW5kaWYKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBNb3ZhYmxlU3RydWN0OjpuYl9kZXN0cnVjdF9jYWxsID09IDcgKTsKKyNlbGlmICFkZWZpbmVkIChfTVNDX1ZFUikKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBNb3ZhYmxlU3RydWN0OjpuYl9jcHlfY29uc3RydWN0X2NhbGwgPT0gNyApOworICAgICAgQ1BQVU5JVF9BU1NFUlQoIE1vdmFibGVTdHJ1Y3Q6Om5iX2Rlc3RydWN0X2NhbGwgPT0gNyApOworI2Vsc2UKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBNb3ZhYmxlU3RydWN0OjpuYl9jcHlfY29uc3RydWN0X2NhbGwgPT0gMTQgKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBNb3ZhYmxlU3RydWN0OjpuYl9kZXN0cnVjdF9jYWxsID09IDE0ICk7CisjZW5kaWYKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBNb3ZhYmxlU3RydWN0OjpuYl9hc3NpZ25tZW50X2NhbGwgPT0gMCApOworCisgICAgICAvLyBGb2xsb3dpbmcgdGVzdCB2aW9sYXRlIHJlcXVpcmVtZW50cyB0byBzZXF1aWVuY2VzICgyMy4xLjEgVGFibGUgNjcpCisgICAgICAvKgorICAgICAgdmVjdC5pbnNlcnQodmVjdC5iZWdpbigpICsgMiwgdmVjdC5iZWdpbigpLCB2ZWN0LmVuZCgpKTsKKyAgICAgIC8vIHZlY3QgY29udGFpbnMgOCBlbGVtZW50cworICAgICAgQ1BQVU5JVF9BU1NFUlQoIE1vdmFibGVTdHJ1Y3Q6Om5iX2RmdF9jb25zdHJ1Y3RfY2FsbCA9PSA0ICk7CisgICAgICBDUFBVTklUX0FTU0VSVCggTW92YWJsZVN0cnVjdDo6bmJfY3B5X2NvbnN0cnVjdF9jYWxsID09IDggKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBNb3ZhYmxlU3RydWN0OjpuYl9tdl9jb25zdHJ1Y3RfY2FsbCA9PSA3ICk7CisgICAgICBDUFBVTklUX0FTU0VSVCggTW92YWJsZVN0cnVjdDo6bmJfZGVzdHJ1Y3RfY2FsbCA9PSAxMSApOworICAgICAgKi8KKworICAgICAgTW92YWJsZVN0cnVjdDo6cmVzZXQoKTsKKyAgICAgIHZlY3RvcjxNb3ZhYmxlU3RydWN0PiB2MiA9IHZlY3Q7CisgICAgICBDUFBVTklUX0FTU0VSVCggTW92YWJsZVN0cnVjdDo6bmJfZGZ0X2NvbnN0cnVjdF9jYWxsID09IDAgKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBNb3ZhYmxlU3RydWN0OjpuYl9jcHlfY29uc3RydWN0X2NhbGwgPT0gNCApOworICAgICAgQ1BQVU5JVF9BU1NFUlQoIE1vdmFibGVTdHJ1Y3Q6Om5iX212X2NvbnN0cnVjdF9jYWxsID09IDAgKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBNb3ZhYmxlU3RydWN0OjpuYl9hc3NpZ25tZW50X2NhbGwgPT0gMCApOworICAgICAgQ1BQVU5JVF9BU1NFUlQoIE1vdmFibGVTdHJ1Y3Q6Om5iX2Rlc3RydWN0X2NhbGwgPT0gMCApOworCisgICAgICBNb3ZhYmxlU3RydWN0OjpyZXNldCgpOworICAgICAgdmVjdC5pbnNlcnQodmVjdC5iZWdpbigpICsgMiwgdjIuYmVnaW4oKSwgdjIuZW5kKCkgKTsKKworICAgICAgLy8gdmVjdCBjb250YWlucyA4IGVsZW1lbnRzCisgICAgICBDUFBVTklUX0FTU0VSVCggTW92YWJsZVN0cnVjdDo6bmJfZGZ0X2NvbnN0cnVjdF9jYWxsID09IDAgKTsKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBNb3ZhYmxlU3RydWN0OjpuYl9jcHlfY29uc3RydWN0X2NhbGwgPT0gNCApOworICAgICAgQ1BQVU5JVF9BU1NFUlQoIE1vdmFibGVTdHJ1Y3Q6Om5iX212X2NvbnN0cnVjdF9jYWxsID09IDQgKTsKKyNlbHNlCisgICAgICBDUFBVTklUX0FTU0VSVCggTW92YWJsZVN0cnVjdDo6bmJfY3B5X2NvbnN0cnVjdF9jYWxsID09IDggKTsKKyNlbmRpZgorICAgICAgQ1BQVU5JVF9BU1NFUlQoIE1vdmFibGVTdHJ1Y3Q6Om5iX2Fzc2lnbm1lbnRfY2FsbCA9PSAwICk7CisgICAgICBDUFBVTklUX0FTU0VSVCggTW92YWJsZVN0cnVjdDo6bmJfZGVzdHJ1Y3RfY2FsbCA9PSA0ICk7CisKKyAgICAgIE1vdmFibGVTdHJ1Y3Q6OnJlc2V0KCk7CisgICAgICB2ZWN0LmVyYXNlKHZlY3QuYmVnaW4oKSwgdmVjdC5iZWdpbigpICsgMiApOworCisgICAgICAvLyB2ZWN0IGNvbnRhaW5zIDYgZWxlbWVudHMKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBNb3ZhYmxlU3RydWN0OjpuYl9tdl9jb25zdHJ1Y3RfY2FsbCA9PSA2ICk7CisgICAgICBDUFBVTklUX0FTU0VSVCggTW92YWJsZVN0cnVjdDo6bmJfZGVzdHJ1Y3RfY2FsbCA9PSA4ICk7CisjZWxzZQorICAgICAgQ1BQVU5JVF9BU1NFUlRfRVFVQUwoIE1vdmFibGVTdHJ1Y3Q6Om5iX2Fzc2lnbm1lbnRfY2FsbCwgNiApOworICAgICAgQ1BQVU5JVF9BU1NFUlQoIE1vdmFibGVTdHJ1Y3Q6Om5iX2Rlc3RydWN0X2NhbGwgPT0gMiApOworI2VuZGlmCisKKyAgICAgIE1vdmFibGVTdHJ1Y3Q6OnJlc2V0KCk7CisgICAgICB2ZWN0LmVyYXNlKHZlY3QuZW5kKCkgLSAyLCB2ZWN0LmVuZCgpKTsKKworICAgICAgLy8gdmVjdCBjb250YWlucyA0IGVsZW1lbnRzCisgICAgICBDUFBVTklUX0FTU0VSVCggTW92YWJsZVN0cnVjdDo6bmJfbXZfY29uc3RydWN0X2NhbGwgPT0gMCApOworICAgICAgQ1BQVU5JVF9BU1NFUlQoIE1vdmFibGVTdHJ1Y3Q6Om5iX2Rlc3RydWN0X2NhbGwgPT0gMiApOworCisgICAgICBNb3ZhYmxlU3RydWN0OjpyZXNldCgpOworICAgICAgdmVjdC5lcmFzZSh2ZWN0LmJlZ2luKCkpOworCisgICAgICAvLyB2ZWN0IGNvbnRhaW5zIDMgZWxlbWVudHMKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBNb3ZhYmxlU3RydWN0OjpuYl9tdl9jb25zdHJ1Y3RfY2FsbCA9PSAzICk7CisgICAgICBDUFBVTklUX0FTU0VSVCggTW92YWJsZVN0cnVjdDo6bmJfZGVzdHJ1Y3RfY2FsbCA9PSA0ICk7CisjZWxzZQorICAgICAgQ1BQVU5JVF9BU1NFUlQoIE1vdmFibGVTdHJ1Y3Q6Om5iX2Fzc2lnbm1lbnRfY2FsbCA9PSAzICk7CisgICAgICBDUFBVTklUX0FTU0VSVCggTW92YWJsZVN0cnVjdDo6bmJfZGVzdHJ1Y3RfY2FsbCA9PSAxICk7CisjZW5kaWYKKworICAgICAgTW92YWJsZVN0cnVjdDo6cmVzZXQoKTsKKyAgICB9CisgICAgLy92ZWN0IHdpdGggMyBlbGVtZW50cyBhbmQgdjIgd2l0aCA0IGVsZW1lbnRzIGFyZSBub3cgb3V0IG9mIHNjb3BlCisgICAgQ1BQVU5JVF9BU1NFUlQoIE1vdmFibGVTdHJ1Y3Q6Om5iX2Rlc3RydWN0X2NhbGwgPT0gMyArIDQgKTsKKyAgfQorfQorCit2b2lkIE1vdmVDb25zdHJ1Y3RvclRlc3Q6Om1vdmVfdHJhaXRzX3ZlY19jb21wbGV0ZSgpCit7CisgIHsKKyAgICB7CisgICAgICB2ZWN0b3I8Q29tcGxldGVNb3ZhYmxlU3RydWN0PiB2ZWN0OworICAgICAgdmVjdC5wdXNoX2JhY2soQ29tcGxldGVNb3ZhYmxlU3RydWN0KCkpOworICAgICAgdmVjdC5wdXNoX2JhY2soQ29tcGxldGVNb3ZhYmxlU3RydWN0KCkpOworICAgICAgdmVjdC5wdXNoX2JhY2soQ29tcGxldGVNb3ZhYmxlU3RydWN0KCkpOworICAgICAgdmVjdC5wdXNoX2JhY2soQ29tcGxldGVNb3ZhYmxlU3RydWN0KCkpOworCisgICAgICAvLyB2ZWN0IGNvbnRhaW5zIDQgZWxlbWVudHMKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBDb21wbGV0ZU1vdmFibGVTdHJ1Y3Q6Om5iX2RmdF9jb25zdHJ1Y3RfY2FsbCA9PSA0ICk7CisjaWYgZGVmaW5lZCAoU1RMUE9SVCkKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9OT19NT1ZFX1NFTUFOVElDKQorICAgICAgQ1BQVU5JVF9BU1NFUlQoIENvbXBsZXRlTW92YWJsZVN0cnVjdDo6bmJfY3B5X2NvbnN0cnVjdF9jYWxsID09IDQgKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBDb21wbGV0ZU1vdmFibGVTdHJ1Y3Q6Om5iX212X2NvbnN0cnVjdF9jYWxsID09IDMgKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBDb21wbGV0ZU1vdmFibGVTdHJ1Y3Q6Om5iX2Rlc3RydWN0X2NhbGwgPT0gNCApOworIyAgZWxzZQorICAgICAgQ1BQVU5JVF9BU1NFUlQoIENvbXBsZXRlTW92YWJsZVN0cnVjdDo6bmJfY3B5X2NvbnN0cnVjdF9jYWxsID09IDcgKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBDb21wbGV0ZU1vdmFibGVTdHJ1Y3Q6Om5iX2Rlc3RydWN0X2NhbGwgPT0gNyApOworIyAgZW5kaWYKKyNlbGlmICFkZWZpbmVkIChfTVNDX1ZFUikKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBDb21wbGV0ZU1vdmFibGVTdHJ1Y3Q6Om5iX2NweV9jb25zdHJ1Y3RfY2FsbCA9PSA3ICk7CisgICAgICBDUFBVTklUX0FTU0VSVCggQ29tcGxldGVNb3ZhYmxlU3RydWN0OjpuYl9kZXN0cnVjdF9jYWxsID09IDcgKTsKKyNlbHNlCisgICAgICBDUFBVTklUX0FTU0VSVCggQ29tcGxldGVNb3ZhYmxlU3RydWN0OjpuYl9jcHlfY29uc3RydWN0X2NhbGwgPT0gMTQgKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBDb21wbGV0ZU1vdmFibGVTdHJ1Y3Q6Om5iX2Rlc3RydWN0X2NhbGwgPT0gMTQgKTsKKyNlbmRpZgorCisgICAgICAvLyBGb2xsb3dpbmcgdGVzdCB2aW9sYXRlIHJlcXVpcmVtZW50cyB0byBzZXF1aWVuY2VzICgyMy4xLjEgVGFibGUgNjcpCisgICAgICAvKgorICAgICAgdmVjdC5pbnNlcnQodmVjdC5iZWdpbigpICsgMiwgdmVjdC5iZWdpbigpLCB2ZWN0LmVuZCgpKTsKKworICAgICAgLy8gdmVjdCBjb250YWlucyA4IGVsZW1lbnRzCisgICAgICBDUFBVTklUX0FTU0VSVCggQ29tcGxldGVNb3ZhYmxlU3RydWN0OjpuYl9kZnRfY29uc3RydWN0X2NhbGwgPT0gNCApOworICAgICAgQ1BQVU5JVF9BU1NFUlQoIENvbXBsZXRlTW92YWJsZVN0cnVjdDo6bmJfY3B5X2NvbnN0cnVjdF9jYWxsID09IDggKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBDb21wbGV0ZU1vdmFibGVTdHJ1Y3Q6Om5iX212X2NvbnN0cnVjdF9jYWxsID09IDcgKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBDb21wbGV0ZU1vdmFibGVTdHJ1Y3Q6Om5iX2Rlc3RydWN0X2NhbGwgPT0gNCApOworICAgICAgKi8KKworICAgICAgQ29tcGxldGVNb3ZhYmxlU3RydWN0OjpyZXNldCgpOworICAgICAgdmVjdG9yPENvbXBsZXRlTW92YWJsZVN0cnVjdD4gdjIgPSB2ZWN0OworCisgICAgICBDUFBVTklUX0FTU0VSVCggQ29tcGxldGVNb3ZhYmxlU3RydWN0OjpuYl9kZnRfY29uc3RydWN0X2NhbGwgPT0gMCApOworICAgICAgQ1BQVU5JVF9BU1NFUlQoIENvbXBsZXRlTW92YWJsZVN0cnVjdDo6bmJfY3B5X2NvbnN0cnVjdF9jYWxsID09IDQgKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBDb21wbGV0ZU1vdmFibGVTdHJ1Y3Q6Om5iX212X2NvbnN0cnVjdF9jYWxsID09IDAgKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBDb21wbGV0ZU1vdmFibGVTdHJ1Y3Q6Om5iX2Rlc3RydWN0X2NhbGwgPT0gMCApOworCisgICAgICBDb21wbGV0ZU1vdmFibGVTdHJ1Y3Q6OnJlc2V0KCk7CisgICAgICB2ZWN0Lmluc2VydCh2ZWN0LmJlZ2luKCkgKyAyLCB2Mi5iZWdpbigpLCB2Mi5lbmQoKSk7CisKKyAgICAgIC8vIHZlY3QgY29udGFpbnMgOCBlbGVtZW50cworICAgICAgQ1BQVU5JVF9BU1NFUlQoIENvbXBsZXRlTW92YWJsZVN0cnVjdDo6bmJfZGZ0X2NvbnN0cnVjdF9jYWxsID09IDAgKTsKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBDb21wbGV0ZU1vdmFibGVTdHJ1Y3Q6Om5iX2NweV9jb25zdHJ1Y3RfY2FsbCA9PSA0ICk7CisgICAgICBDUFBVTklUX0FTU0VSVCggQ29tcGxldGVNb3ZhYmxlU3RydWN0OjpuYl9tdl9jb25zdHJ1Y3RfY2FsbCA9PSA0ICk7CisgICAgICBDUFBVTklUX0FTU0VSVCggQ29tcGxldGVNb3ZhYmxlU3RydWN0OjpuYl9kZXN0cnVjdF9jYWxsID09IDAgKTsKKyNlbHNlCisgICAgICBDUFBVTklUX0FTU0VSVCggQ29tcGxldGVNb3ZhYmxlU3RydWN0OjpuYl9jcHlfY29uc3RydWN0X2NhbGwgPT0gOCApOworICAgICAgQ1BQVU5JVF9BU1NFUlQoIENvbXBsZXRlTW92YWJsZVN0cnVjdDo6bmJfZGVzdHJ1Y3RfY2FsbCA9PSA0ICk7CisjZW5kaWYKKworICAgICAgQ29tcGxldGVNb3ZhYmxlU3RydWN0OjpyZXNldCgpOworICAgICAgdmVjdC5lcmFzZSh2ZWN0LmJlZ2luKCksIHZlY3QuYmVnaW4oKSArIDIpOworCisgICAgICAvLyB2ZWN0IGNvbnRhaW5zIDYgZWxlbWVudHMKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBDb21wbGV0ZU1vdmFibGVTdHJ1Y3Q6Om5iX212X2NvbnN0cnVjdF9jYWxsID09IDYgKTsKKyNlbHNlCisgICAgICBDUFBVTklUX0FTU0VSVCggQ29tcGxldGVNb3ZhYmxlU3RydWN0OjpuYl9hc3NpZ25tZW50X2NhbGwgPT0gNiApOworI2VuZGlmCisgICAgICBDUFBVTklUX0FTU0VSVCggQ29tcGxldGVNb3ZhYmxlU3RydWN0OjpuYl9kZXN0cnVjdF9jYWxsID09IDIgKTsKKworICAgICAgQ29tcGxldGVNb3ZhYmxlU3RydWN0OjpyZXNldCgpOworICAgICAgdmVjdC5lcmFzZSh2ZWN0LmVuZCgpIC0gMiwgdmVjdC5lbmQoKSk7CisKKyAgICAgIC8vIHZlY3QgY29udGFpbnMgNCBlbGVtZW50cworICAgICAgQ1BQVU5JVF9BU1NFUlQoIENvbXBsZXRlTW92YWJsZVN0cnVjdDo6bmJfbXZfY29uc3RydWN0X2NhbGwgPT0gMCApOworICAgICAgQ1BQVU5JVF9BU1NFUlQoIENvbXBsZXRlTW92YWJsZVN0cnVjdDo6bmJfZGVzdHJ1Y3RfY2FsbCA9PSAyICk7CisKKyAgICAgIENvbXBsZXRlTW92YWJsZVN0cnVjdDo6cmVzZXQoKTsKKyAgICAgIHZlY3QuZXJhc2UodmVjdC5iZWdpbigpKTsKKworICAgICAgLy8gdmVjdCBjb250YWlucyAzIGVsZW1lbnRzCisjaWYgZGVmaW5lZCAoU1RMUE9SVCkgJiYgIWRlZmluZWQgKF9TVExQX05PX01PVkVfU0VNQU5USUMpCisgICAgICBDUFBVTklUX0FTU0VSVCggQ29tcGxldGVNb3ZhYmxlU3RydWN0OjpuYl9tdl9jb25zdHJ1Y3RfY2FsbCA9PSAzICk7CisjZWxzZQorICAgICAgQ1BQVU5JVF9BU1NFUlQoIENvbXBsZXRlTW92YWJsZVN0cnVjdDo6bmJfYXNzaWdubWVudF9jYWxsID09IDMgKTsKKyNlbmRpZgorICAgICAgQ1BQVU5JVF9BU1NFUlQoIENvbXBsZXRlTW92YWJsZVN0cnVjdDo6bmJfZGVzdHJ1Y3RfY2FsbCA9PSAxICk7CisKKyAgICAgIENvbXBsZXRlTW92YWJsZVN0cnVjdDo6cmVzZXQoKTsKKyAgICB9CisgICAgLy92ZWN0IHdpdGggMyBlbGVtZW50cyBhbmQgdjIgd2l0aCA0IGVsZW1lbnRzIGFyZSBub3cgb3V0IG9mIHNjb3BlCisgICAgQ1BQVU5JVF9BU1NFUlQoIENvbXBsZXRlTW92YWJsZVN0cnVjdDo6bmJfZGVzdHJ1Y3RfY2FsbCA9PSAzICsgNCApOworICB9Cit9CisKK3ZvaWQgTW92ZUNvbnN0cnVjdG9yVGVzdDo6bW92ZV90cmFpdHNfZGVxKCkKK3sKKyAgeworICAgIE1vdmFibGVTdHJ1Y3Q6OnJlc2V0KCk7CisgICAgeworICAgICAgZGVxdWU8TW92YWJsZVN0cnVjdD4gZGVxOworICAgICAgZGVxLnB1c2hfYmFjayhNb3ZhYmxlU3RydWN0KCkpOworICAgICAgZGVxLnB1c2hfYmFjayhNb3ZhYmxlU3RydWN0KCkpOworICAgICAgZGVxLnB1c2hfYmFjayhNb3ZhYmxlU3RydWN0KCkpOworICAgICAgZGVxLnB1c2hfYmFjayhNb3ZhYmxlU3RydWN0KCkpOworCisgICAgICAvLyBkZXEgY29udGFpbnMgNCBlbGVtZW50cworICAgICAgQ1BQVU5JVF9BU1NFUlQoIE1vdmFibGVTdHJ1Y3Q6Om5iX2RmdF9jb25zdHJ1Y3RfY2FsbCA9PSA0ICk7CisgICAgICBDUFBVTklUX0FTU0VSVCggTW92YWJsZVN0cnVjdDo6bmJfY3B5X2NvbnN0cnVjdF9jYWxsID09IDQgKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBNb3ZhYmxlU3RydWN0OjpuYl9tdl9jb25zdHJ1Y3RfY2FsbCA9PSAwICk7CisgICAgICBDUFBVTklUX0FTU0VSVCggTW92YWJsZVN0cnVjdDo6bmJfZGVzdHJ1Y3RfY2FsbCA9PSA0ICk7CisKKyAgICAgIC8vIEZvbGxvd2luZyB0ZXN0IHZpb2xhdGUgcmVxdWlyZW1lbnRzIHRvIHNlcXVpZW5jZXMgKDIzLjEuMSBUYWJsZSA2NykKKyAgICAgIC8qCisgICAgICBkZXEuaW5zZXJ0KGRlcS5iZWdpbigpICsgMiwgZGVxLmJlZ2luKCksIGRlcS5lbmQoKSk7CisgICAgICAvLyBkZXEgY29udGFpbnMgOCBlbGVtZW50cworICAgICAgQ1BQVU5JVF9BU1NFUlQoIE1vdmFibGVTdHJ1Y3Q6Om5iX2RmdF9jb25zdHJ1Y3RfY2FsbCA9PSA0ICk7CisgICAgICBDUFBVTklUX0FTU0VSVCggTW92YWJsZVN0cnVjdDo6bmJfY3B5X2NvbnN0cnVjdF9jYWxsID09IDggKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBNb3ZhYmxlU3RydWN0OjpuYl9tdl9jb25zdHJ1Y3RfY2FsbCA9PSA3ICk7CisgICAgICBDUFBVTklUX0FTU0VSVCggTW92YWJsZVN0cnVjdDo6bmJfZGVzdHJ1Y3RfY2FsbCA9PSAxMSApOworICAgICAgKi8KKworICAgICAgTW92YWJsZVN0cnVjdDo6cmVzZXQoKTsKKyAgICAgIGRlcXVlPE1vdmFibGVTdHJ1Y3Q+IGQyID0gZGVxOworCisgICAgICBDUFBVTklUX0FTU0VSVCggTW92YWJsZVN0cnVjdDo6bmJfZGZ0X2NvbnN0cnVjdF9jYWxsID09IDAgKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBNb3ZhYmxlU3RydWN0OjpuYl9jcHlfY29uc3RydWN0X2NhbGwgPT0gNCApOworICAgICAgQ1BQVU5JVF9BU1NFUlQoIE1vdmFibGVTdHJ1Y3Q6Om5iX212X2NvbnN0cnVjdF9jYWxsID09IDAgKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBNb3ZhYmxlU3RydWN0OjpuYl9kZXN0cnVjdF9jYWxsID09IDAgKTsKKworICAgICAgTW92YWJsZVN0cnVjdDo6cmVzZXQoKTsKKyAgICAgIGRlcS5pbnNlcnQoZGVxLmJlZ2luKCkgKyAyLCBkMi5iZWdpbigpLCBkMi5lbmQoKSApOworCisgICAgICAvLyBkZXEgY29udGFpbnMgOCBlbGVtZW50cworICAgICAgQ1BQVU5JVF9BU1NFUlQoIE1vdmFibGVTdHJ1Y3Q6Om5iX2RmdF9jb25zdHJ1Y3RfY2FsbCA9PSAwICk7CisgICAgICBDUFBVTklUX0FTU0VSVCggTW92YWJsZVN0cnVjdDo6bmJfY3B5X2NvbnN0cnVjdF9jYWxsID09IDQgKTsKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBNb3ZhYmxlU3RydWN0OjpuYl9tdl9jb25zdHJ1Y3RfY2FsbCA9PSAyICk7CisgICAgICBDUFBVTklUX0FTU0VSVCggTW92YWJsZVN0cnVjdDo6bmJfZGVzdHJ1Y3RfY2FsbCA9PSAyICk7CisjZWxzZQorICAgICAgQ1BQVU5JVF9BU1NFUlQoIE1vdmFibGVTdHJ1Y3Q6Om5iX2Fzc2lnbm1lbnRfY2FsbCA9PSAyICk7CisgICAgICBDUFBVTklUX0FTU0VSVCggTW92YWJsZVN0cnVjdDo6bmJfZGVzdHJ1Y3RfY2FsbCA9PSAwICk7CisjZW5kaWYKKworICAgICAgTW92YWJsZVN0cnVjdDo6cmVzZXQoKTsKKyAgICAgIGRlcS5lcmFzZShkZXEuYmVnaW4oKSArIDEsIGRlcS5iZWdpbigpICsgMyApOworCisgICAgICAvLyBkZXEgY29udGFpbnMgNiBlbGVtZW50cworI2lmIGRlZmluZWQgKFNUTFBPUlQpICYmICFkZWZpbmVkIChfU1RMUF9OT19NT1ZFX1NFTUFOVElDKQorICAgICAgQ1BQVU5JVF9BU1NFUlQoIE1vdmFibGVTdHJ1Y3Q6Om5iX212X2NvbnN0cnVjdF9jYWxsID09IDEgKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBNb3ZhYmxlU3RydWN0OjpuYl9kZXN0cnVjdF9jYWxsID09IDMgKTsKKyNlbHNlCisgICAgICAvL0ZvbGxvd2luZyBjaGVjayBpcyBoaWdobHkgZGVxdWUgaW1wbGVtZW50YXRpb24gZGVwZW5kYW50IHNvCisgICAgICAvL2l0IG1pZ2h0IG5vdCBhbHdheXMgd29yay4uLgorICAgICAgQ1BQVU5JVF9BU1NFUlQoIE1vdmFibGVTdHJ1Y3Q6Om5iX2Fzc2lnbm1lbnRfY2FsbCA9PSAxICk7CisgICAgICBDUFBVTklUX0FTU0VSVCggTW92YWJsZVN0cnVjdDo6bmJfZGVzdHJ1Y3RfY2FsbCA9PSAyICk7CisjZW5kaWYKKworICAgICAgTW92YWJsZVN0cnVjdDo6cmVzZXQoKTsKKyAgICAgIGRlcS5lcmFzZShkZXEuZW5kKCkgLSAzLCBkZXEuZW5kKCkgLSAxKTsKKworICAgICAgLy8gZGVxIGNvbnRhaW5zIDQgZWxlbWVudHMKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fTU9WRV9TRU1BTlRJQykKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBNb3ZhYmxlU3RydWN0OjpuYl9tdl9jb25zdHJ1Y3RfY2FsbCA9PSAxICk7CisgICAgICBDUFBVTklUX0FTU0VSVCggTW92YWJsZVN0cnVjdDo6bmJfZGVzdHJ1Y3RfY2FsbCA9PSAzICk7CisjZWxzZQorICAgICAgQ1BQVU5JVF9BU1NFUlQoIE1vdmFibGVTdHJ1Y3Q6Om5iX2Fzc2lnbm1lbnRfY2FsbCA9PSAxICk7CisgICAgICBDUFBVTklUX0FTU0VSVCggTW92YWJsZVN0cnVjdDo6bmJfZGVzdHJ1Y3RfY2FsbCA9PSAyICk7CisjZW5kaWYKKworICAgICAgTW92YWJsZVN0cnVjdDo6cmVzZXQoKTsKKyAgICAgIGRlcS5lcmFzZShkZXEuYmVnaW4oKSk7CisKKyAgICAgIC8vIGRlcSBjb250YWlucyAzIGVsZW1lbnRzCisjaWYgZGVmaW5lZCAoU1RMUE9SVCkgJiYgIWRlZmluZWQgKF9TVExQX05PX01PVkVfU0VNQU5USUMpCisgICAgICBDUFBVTklUX0FTU0VSVCggTW92YWJsZVN0cnVjdDo6bmJfbXZfY29uc3RydWN0X2NhbGwgPT0gMCApOworI2Vsc2UKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBNb3ZhYmxlU3RydWN0OjpuYl9hc3NpZ25tZW50X2NhbGwgPT0gMCApOworI2VuZGlmCisgICAgICBDUFBVTklUX0FTU0VSVCggTW92YWJsZVN0cnVjdDo6bmJfZGVzdHJ1Y3RfY2FsbCA9PSAxICk7CisKKyAgICAgIE1vdmFibGVTdHJ1Y3Q6OnJlc2V0KCk7CisgICAgfQorICAgIC8vZGVxIHdpdGggMyBlbGVtZW50cyBhbmQgZDIgd2l0aCA0IGVsZW1lbnRzIGFyZSBub3cgb3V0IG9mIHNjb3BlCisgICAgQ1BQVU5JVF9BU1NFUlQoIE1vdmFibGVTdHJ1Y3Q6Om5iX2Rlc3RydWN0X2NhbGwgPT0gMyArIDQgKTsKKyAgfQorfQorCit2b2lkIE1vdmVDb25zdHJ1Y3RvclRlc3Q6Om1vdmVfdHJhaXRzX2RlcV9jb21wbGV0ZSgpCit7CisgIHsKKyAgICBDb21wbGV0ZU1vdmFibGVTdHJ1Y3Q6OnJlc2V0KCk7CisgICAgeworICAgICAgZGVxdWU8Q29tcGxldGVNb3ZhYmxlU3RydWN0PiBkZXE7CisgICAgICBkZXEucHVzaF9iYWNrKENvbXBsZXRlTW92YWJsZVN0cnVjdCgpKTsKKyAgICAgIGRlcS5wdXNoX2JhY2soQ29tcGxldGVNb3ZhYmxlU3RydWN0KCkpOworICAgICAgZGVxLnB1c2hfYmFjayhDb21wbGV0ZU1vdmFibGVTdHJ1Y3QoKSk7CisgICAgICBkZXEucHVzaF9iYWNrKENvbXBsZXRlTW92YWJsZVN0cnVjdCgpKTsKKworICAgICAgLy8gZGVxIGNvbnRhaW5zIDQgZWxlbWVudHMKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBDb21wbGV0ZU1vdmFibGVTdHJ1Y3Q6Om5iX2RmdF9jb25zdHJ1Y3RfY2FsbCA9PSA0ICk7CisgICAgICBDUFBVTklUX0FTU0VSVCggQ29tcGxldGVNb3ZhYmxlU3RydWN0OjpuYl9jcHlfY29uc3RydWN0X2NhbGwgPT0gNCApOworICAgICAgQ1BQVU5JVF9BU1NFUlQoIENvbXBsZXRlTW92YWJsZVN0cnVjdDo6bmJfbXZfY29uc3RydWN0X2NhbGwgPT0gMCApOworICAgICAgQ1BQVU5JVF9BU1NFUlQoIENvbXBsZXRlTW92YWJsZVN0cnVjdDo6bmJfZGVzdHJ1Y3RfY2FsbCA9PSA0ICk7CisKKyAgICAgIC8vIEZvbGxvd2luZyB0ZXN0IHZpb2xhdGUgcmVxdWlyZW1lbnRzIHRvIHNlcXVpZW5jZXMgKDIzLjEuMSBUYWJsZSA2NykKKyAgICAgIC8qCisgICAgICBkZXEuaW5zZXJ0KGRlcS5iZWdpbigpICsgMiwgZGVxLmJlZ2luKCksIGRlcS5lbmQoKSk7CisKKyAgICAgIC8vIGRlcSBjb250YWlucyA4IGVsZW1lbnRzCisgICAgICBDUFBVTklUX0FTU0VSVCggQ29tcGxldGVNb3ZhYmxlU3RydWN0OjpuYl9kZnRfY29uc3RydWN0X2NhbGwgPT0gNCApOworICAgICAgQ1BQVU5JVF9BU1NFUlQoIENvbXBsZXRlTW92YWJsZVN0cnVjdDo6bmJfY3B5X2NvbnN0cnVjdF9jYWxsID09IDggKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBDb21wbGV0ZU1vdmFibGVTdHJ1Y3Q6Om5iX212X2NvbnN0cnVjdF9jYWxsID09IDcgKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBDb21wbGV0ZU1vdmFibGVTdHJ1Y3Q6Om5iX2Rlc3RydWN0X2NhbGwgPT0gNCApOworICAgICAgKi8KKworICAgICAgQ29tcGxldGVNb3ZhYmxlU3RydWN0OjpyZXNldCgpOworICAgICAgZGVxdWU8Q29tcGxldGVNb3ZhYmxlU3RydWN0PiBkMiA9IGRlcTsKKworICAgICAgQ1BQVU5JVF9BU1NFUlQoIENvbXBsZXRlTW92YWJsZVN0cnVjdDo6bmJfZGZ0X2NvbnN0cnVjdF9jYWxsID09IDAgKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBDb21wbGV0ZU1vdmFibGVTdHJ1Y3Q6Om5iX2NweV9jb25zdHJ1Y3RfY2FsbCA9PSA0ICk7CisgICAgICBDUFBVTklUX0FTU0VSVCggQ29tcGxldGVNb3ZhYmxlU3RydWN0OjpuYl9tdl9jb25zdHJ1Y3RfY2FsbCA9PSAwICk7CisgICAgICBDUFBVTklUX0FTU0VSVCggQ29tcGxldGVNb3ZhYmxlU3RydWN0OjpuYl9kZXN0cnVjdF9jYWxsID09IDAgKTsKKworICAgICAgQ29tcGxldGVNb3ZhYmxlU3RydWN0OjpyZXNldCgpOworICAgICAgZGVxLmluc2VydChkZXEuYmVnaW4oKSArIDIsIGQyLmJlZ2luKCksIGQyLmVuZCgpKTsKKworICAgICAgLy8gZGVxIGNvbnRhaW5zIDggZWxlbWVudHMKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBDb21wbGV0ZU1vdmFibGVTdHJ1Y3Q6Om5iX2RmdF9jb25zdHJ1Y3RfY2FsbCA9PSAwICk7CisgICAgICBDUFBVTklUX0FTU0VSVCggQ29tcGxldGVNb3ZhYmxlU3RydWN0OjpuYl9jcHlfY29uc3RydWN0X2NhbGwgPT0gNCApOworI2lmIGRlZmluZWQgKFNUTFBPUlQpICYmICFkZWZpbmVkIChfU1RMUF9OT19NT1ZFX1NFTUFOVElDKQorICAgICAgQ1BQVU5JVF9BU1NFUlQoIENvbXBsZXRlTW92YWJsZVN0cnVjdDo6bmJfbXZfY29uc3RydWN0X2NhbGwgPT0gMiApOworI2Vsc2UKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBDb21wbGV0ZU1vdmFibGVTdHJ1Y3Q6Om5iX2Fzc2lnbm1lbnRfY2FsbCA9PSAyICk7CisjZW5kaWYKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBDb21wbGV0ZU1vdmFibGVTdHJ1Y3Q6Om5iX2Rlc3RydWN0X2NhbGwgPT0gMCApOworCisgICAgICBDb21wbGV0ZU1vdmFibGVTdHJ1Y3Q6OnJlc2V0KCk7CisgICAgICBkZXEuZXJhc2UoZGVxLmJlZ2luKCkgKyAxLCBkZXEuYmVnaW4oKSArIDMpOworCisgICAgICAvLyBkZXEgY29udGFpbnMgNiBlbGVtZW50cworI2lmIGRlZmluZWQgKFNUTFBPUlQpICYmICFkZWZpbmVkIChfU1RMUF9OT19NT1ZFX1NFTUFOVElDKQorICAgICAgQ1BQVU5JVF9BU1NFUlQoIENvbXBsZXRlTW92YWJsZVN0cnVjdDo6bmJfbXZfY29uc3RydWN0X2NhbGwgPT0gMSApOworI2Vsc2UKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBDb21wbGV0ZU1vdmFibGVTdHJ1Y3Q6Om5iX2Fzc2lnbm1lbnRfY2FsbCA9PSAxICk7CisjZW5kaWYKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBDb21wbGV0ZU1vdmFibGVTdHJ1Y3Q6Om5iX2Rlc3RydWN0X2NhbGwgPT0gMiApOworCisgICAgICBDb21wbGV0ZU1vdmFibGVTdHJ1Y3Q6OnJlc2V0KCk7CisgICAgICBkZXEuZXJhc2UoZGVxLmVuZCgpIC0gMywgZGVxLmVuZCgpIC0gMSk7CisKKyAgICAgIC8vIGRlcSBjb250YWlucyA0IGVsZW1lbnRzCisjaWYgZGVmaW5lZCAoU1RMUE9SVCkgJiYgIWRlZmluZWQgKF9TVExQX05PX01PVkVfU0VNQU5USUMpCisgICAgICBDUFBVTklUX0FTU0VSVCggQ29tcGxldGVNb3ZhYmxlU3RydWN0OjpuYl9tdl9jb25zdHJ1Y3RfY2FsbCA9PSAxICk7CisjZWxzZQorICAgICAgQ1BQVU5JVF9BU1NFUlQoIENvbXBsZXRlTW92YWJsZVN0cnVjdDo6bmJfYXNzaWdubWVudF9jYWxsID09IDEgKTsKKyNlbmRpZgorICAgICAgQ1BQVU5JVF9BU1NFUlQoIENvbXBsZXRlTW92YWJsZVN0cnVjdDo6bmJfZGVzdHJ1Y3RfY2FsbCA9PSAyICk7CisKKyAgICAgIENvbXBsZXRlTW92YWJsZVN0cnVjdDo6cmVzZXQoKTsKKyAgICAgIGRlcS5lcmFzZShkZXEuYmVnaW4oKSk7CisKKyAgICAgIC8vIGRlcSBjb250YWlucyAzIGVsZW1lbnRzCisgICAgICBDUFBVTklUX0FTU0VSVCggQ29tcGxldGVNb3ZhYmxlU3RydWN0OjpuYl9tdl9jb25zdHJ1Y3RfY2FsbCA9PSAwICk7CisgICAgICBDUFBVTklUX0FTU0VSVCggQ29tcGxldGVNb3ZhYmxlU3RydWN0OjpuYl9hc3NpZ25tZW50X2NhbGwgPT0gMCApOworICAgICAgQ1BQVU5JVF9BU1NFUlQoIENvbXBsZXRlTW92YWJsZVN0cnVjdDo6bmJfZGVzdHJ1Y3RfY2FsbCA9PSAxICk7CisKKyAgICAgIENvbXBsZXRlTW92YWJsZVN0cnVjdDo6cmVzZXQoKTsKKyAgICB9CisgICAgLy9kZXEgd2l0aCAzIGVsZW1lbnRzIGFuZCB2MiB3aXRoIDQgZWxlbWVudHMgYXJlIG5vdyBvdXQgb2Ygc2NvcGUKKyAgICBDUFBVTklUX0FTU0VSVCggQ29tcGxldGVNb3ZhYmxlU3RydWN0OjpuYl9kZXN0cnVjdF9jYWxsID09IDMgKyA0ICk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9uZXFfdGVzdC5jcHAgYi90ZXN0L3VuaXQvbmVxX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NjllNDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvbmVxX3Rlc3QuY3BwCkBAIC0wLDAgKzEsNTQgQEAKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisKKyNpbmNsdWRlICJjcHB1bml0L2NwcHVuaXRfcHJveHkuaCIKKworI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkKF9TVExQX1VTRV9OQU1FU1BBQ0VTKQordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyNlbmRpZgorCisvLworLy8gVGVzdENhc2UgY2xhc3MKKy8vCitjbGFzcyBOZXFUZXN0IDogcHVibGljIENQUFVOSVRfTlM6OlRlc3RDYXNlCit7CisgIENQUFVOSVRfVEVTVF9TVUlURShOZXFUZXN0KTsKKyAgQ1BQVU5JVF9URVNUKG5lZ2F0ZTApOworICBDUFBVTklUX1RFU1QobmVxdWFsMCk7CisgIENQUFVOSVRfVEVTVF9TVUlURV9FTkQoKTsKKworcHJvdGVjdGVkOgorICB2b2lkIG5lZ2F0ZTAoKTsKKyAgdm9pZCBuZXF1YWwwKCk7Cit9OworCitDUFBVTklUX1RFU1RfU1VJVEVfUkVHSVNUUkFUSU9OKE5lcVRlc3QpOworCisvLworLy8gdGVzdHMgaW1wbGVtZW50YXRpb24KKy8vCit2b2lkIE5lcVRlc3Q6Om5lZ2F0ZTAoKQoreworICBpbnQgaW5wdXQgWzNdID0geyAxLCAyLCAzIH07CisKKyAgaW50IG91dHB1dFszXTsKKyAgdHJhbnNmb3JtKChpbnQqKWlucHV0LCAoaW50KilpbnB1dCArIDMsIChpbnQqKW91dHB1dCwgbmVnYXRlPGludD4oKSk7CisKKyAgQ1BQVU5JVF9BU1NFUlQob3V0cHV0WzBdPT0tMSk7CisgIENQUFVOSVRfQVNTRVJUKG91dHB1dFsxXT09LTIpOworICBDUFBVTklUX0FTU0VSVChvdXRwdXRbMl09PS0zKTsKK30KK3ZvaWQgTmVxVGVzdDo6bmVxdWFsMCgpCit7CisgIGludCBpbnB1dDEgWzRdID0geyAxLCA3LCAyLCAyIH07CisgIGludCBpbnB1dDIgWzRdID0geyAxLCA2LCAyLCAzIH07CisKKyAgaW50IG91dHB1dCBbNF07CisgIHRyYW5zZm9ybSgoaW50KilpbnB1dDEsIChpbnQqKWlucHV0MSArIDQsIChpbnQqKWlucHV0MiwgKGludCopb3V0cHV0LCBub3RfZXF1YWxfdG88aW50PigpKTsKKworICBDUFBVTklUX0FTU0VSVChvdXRwdXRbMF09PTApOworICBDUFBVTklUX0FTU0VSVChvdXRwdXRbMV09PTEpOworICBDUFBVTklUX0FTU0VSVChvdXRwdXRbMl09PTApOworICBDUFBVTklUX0FTU0VSVChvdXRwdXRbM109PTEpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L25ld19oZWFkZXJfdGVzdC5jcHAgYi90ZXN0L3VuaXQvbmV3X2hlYWRlcl90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODg0Mjk5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L25ld19oZWFkZXJfdGVzdC5jcHAKQEAgLTAsMCArMSw4IEBACisvKiBUaGlzIHRlc3QgcHVycG9zZSBpcyBzaW1wbHkgdG8gY2hlY2sgU3RhbmRhcmQgaGVhZGVyIGluZGVwZW5kYW5jeSB0aGF0CisgKiBpcyB0byBzYXkgdGhhdCB0aGUgaGVhZGVyIGNhbiBiZSBpbmNsdWRlZCBhbG9uZSB3aXRob3V0IGFueSBwcmV2aW91cworICogaW5jbHVkZS4KKyAqIEFkZGl0aW9ubmFseSwgZm9yIEMgU3RhbmRhcmQgaGVhZGVycyB0aGF0IFNUTHBvcnQgZXhwb3NlLCBpdCBjYW4gYWxzbyBiZQorICogdXNlZCB0byBjaGVjayB0aGF0IGZpbGVzIGluY2x1ZGVkIGJ5IHRob3NlIGhlYWRlcnMgYXJlIGNvbXBhdGlibGUgd2l0aAorICogcHVyZSBDIGNvbXBpbGVycy4KKyAqLworI2luY2x1ZGUgPG5ldz4KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9udGhlbG1fdGVzdC5jcHAgYi90ZXN0L3VuaXQvbnRoZWxtX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1YzI2ZDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvbnRoZWxtX3Rlc3QuY3BwCkBAIC0wLDAgKzEsODQgQEAKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisKKyNpbmNsdWRlICJjcHB1bml0L2NwcHVuaXRfcHJveHkuaCIKKworI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkKF9TVExQX1VTRV9OQU1FU1BBQ0VTKQordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyNlbmRpZgorCisvLworLy8gVGVzdENhc2UgY2xhc3MKKy8vCitjbGFzcyBOdGhFbGVtVGVzdCA6IHB1YmxpYyBDUFBVTklUX05TOjpUZXN0Q2FzZQoreworICBDUFBVTklUX1RFU1RfU1VJVEUoTnRoRWxlbVRlc3QpOworICBDUFBVTklUX1RFU1QobnRoZWxlbTApOworICBDUFBVTklUX1RFU1QobnRoZWxlbTEpOworICBDUFBVTklUX1RFU1QobnRoZWxlbTIpOworICBDUFBVTklUX1RFU1RfU1VJVEVfRU5EKCk7CisKK3Byb3RlY3RlZDoKKyAgdm9pZCBudGhlbGVtMCgpOworICB2b2lkIG50aGVsZW0xKCk7CisgIHZvaWQgbnRoZWxlbTIoKTsKK307CisKK0NQUFVOSVRfVEVTVF9TVUlURV9SRUdJU1RSQVRJT04oTnRoRWxlbVRlc3QpOworCisvLworLy8gdGVzdHMgaW1wbGVtZW50YXRpb24KKy8vCit2b2lkIE50aEVsZW1UZXN0OjpudGhlbGVtMCgpCit7CisgIGludCBudW1iZXJzWzddID0geyA1LCAyLCA0LCAxLCAwLCAzICw3N307CisgIG50aF9lbGVtZW50KG51bWJlcnMsIG51bWJlcnMgKyAzLCBudW1iZXJzICsgNik7CisKKyAgQ1BQVU5JVF9BU1NFUlQobnVtYmVyc1swXT09MSk7CisgIENQUFVOSVRfQVNTRVJUKG51bWJlcnNbMV09PTApOworICBDUFBVTklUX0FTU0VSVChudW1iZXJzWzJdPT0yKTsKKyAgQ1BQVU5JVF9BU1NFUlQobnVtYmVyc1szXT09Myk7CisgIENQUFVOSVRfQVNTRVJUKG51bWJlcnNbNF09PTQpOworICBDUFBVTklUX0FTU0VSVChudW1iZXJzWzVdPT01KTsKK30KK3ZvaWQgTnRoRWxlbVRlc3Q6Om50aGVsZW0xKCkKK3sKKyAgLy82IDggNSAxIDcgNCAxIDUgMiA2CisgIC8vMSAxIDQgMiA1IDUgNiA3IDggNgorICBpbnQgbnVtYmVyc1sxMF0gPSB7IDYsIDgsIDUsIDEsIDcsIDQsIDEsIDUsIDIsIDYgfTsKKworICB2ZWN0b3IgPGludD4gdjEobnVtYmVycywgbnVtYmVycysxMCk7CisgIG50aF9lbGVtZW50KHYxLmJlZ2luKCksIHYxLmJlZ2luKCkgKyB2MS5zaXplKCkgLyAyLCB2MS5lbmQoKSk7CisKKyAgQ1BQVU5JVF9BU1NFUlQodjFbMF09PTEpOworICBDUFBVTklUX0FTU0VSVCh2MVsxXT09MSk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzJdPT00KTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbM109PTIpOworICBDUFBVTklUX0FTU0VSVCh2MVs0XT09NSk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzVdPT01KTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbNl09PTYpOworICBDUFBVTklUX0FTU0VSVCh2MVs3XT09Nyk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzhdPT04KTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbOV09PTYpOworfQordm9pZCBOdGhFbGVtVGVzdDo6bnRoZWxlbTIoKQoreworICAvLzQgNSA0IDIgMSA3IDQgMyAxIDYKKyAgLy82IDcgNCA0IDUgNCAzIDIgMSAxCisKKyAgaW50IG51bWJlcnNbMTBdID0geyA0LCA1LCA0LCAyLCAxLCA3LCA0LCAzLCAxLCA2IH07CisgIHZlY3RvciA8aW50PiB2MShudW1iZXJzLCBudW1iZXJzKzEwKTsKKyAgbnRoX2VsZW1lbnQodjEuYmVnaW4oKSwgdjEuYmVnaW4oKSArIHYxLnNpemUoKSAvIDIsIHYxLmVuZCgpLCBncmVhdGVyPGludD4oKSk7CisKKyAgQ1BQVU5JVF9BU1NFUlQodjFbMF09PTYpOworICBDUFBVTklUX0FTU0VSVCh2MVsxXT09Nyk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzJdPT00KTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbM109PTQpOworICBDUFBVTklUX0FTU0VSVCh2MVs0XT09NSk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzVdPT00KTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbNl09PTMpOworICBDUFBVTklUX0FTU0VSVCh2MVs3XT09Mik7CisgIENQUFVOSVRfQVNTRVJUKHYxWzhdPT0xKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbOV09PTEpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L251bV9mYWNldHNfdGVzdC5jcHAgYi90ZXN0L3VuaXQvbnVtX2ZhY2V0c190ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzUxOTVmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L251bV9mYWNldHNfdGVzdC5jcHAKQEAgLTAsMCArMSwyOTcgQEAKKyNpbmNsdWRlICJsb2NhbGVfdGVzdC5oIgorCisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8ICFkZWZpbmVkIChfU1RMUF9VU0VfTk9fSU9TVFJFQU1TKQorIyAgaW5jbHVkZSA8bG9jYWxlPgorIyAgaW5jbHVkZSA8c3N0cmVhbT4KKyMgIGluY2x1ZGUgPHN0ZGV4Y2VwdD4KKworIyAgaW5jbHVkZSAiY29tcGxldGVfZGlnaXRzLmgiCisKKyMgIGlmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkKF9TVExQX1VTRV9OQU1FU1BBQ0VTKQordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyMgIGVuZGlmCisKK3N0cnVjdCByZWZfbG9jYWxlIHsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgY29uc3QgY2hhciAqZGVjaW1hbF9wb2ludDsKKyAgY29uc3QgY2hhciAqdGhvdXNhbmRzX3NlcDsKK307CisKK3N0YXRpYyBjb25zdCByZWZfbG9jYWxlIHRlc3RlZF9sb2NhbGVzW10gPSB7CisvL3sgIG5hbWUsICAgICAgICAgZGVjaW1hbF9wb2ludCwgdGhvdXNhbmRzX3NlcHlfdGhvdXNhbmRzX3NlcH0sCisjICBpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZCAoX1NUTFBfVVNFX0VYQ0VQVElPTlMpCisgIHsgImZyX0ZSIiwgICAgICAgIiwiLCAgICAgICAgICAgIlx4YTAifSwKKyAgeyAicnVfUlUua29pOHIiLCAiLCIsICAgICAgICAgICAiLiJ9LAorICB7ICJlbl9HQiIsICAgICAgICIuIiwgICAgICAgICAgICIsIn0sCisgIHsgImVuX1VTIiwgICAgICAgIi4iLCAgICAgICAgICAgIiwifSwKKyMgIGVuZGlmCisgIHsgIkMiLCAgICAgICAgICAgIi4iLCAgICAgICAgICAgIiwifSwKK307CisKKy8vCisvLyB0ZXN0cyBpbXBsZW1lbnRhdGlvbgorLy8KK3ZvaWQgTG9jYWxlVGVzdDo6X251bV9wdXRfZ2V0KCBjb25zdCBsb2NhbGUmIGxvYywgY29uc3QgcmVmX2xvY2FsZSogcHJsICkgeworICBjb25zdCByZWZfbG9jYWxlJiBybCA9ICpwcmw7CisgIENQUFVOSVRfQVNTRVJUKCBoYXNfZmFjZXQ8bnVtcHVuY3Q8Y2hhcj4gPihsb2MpICk7CisgIG51bXB1bmN0PGNoYXI+IGNvbnN0JiBucGN0ID0gdXNlX2ZhY2V0PG51bXB1bmN0PGNoYXI+ID4obG9jKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIG5wY3QuZGVjaW1hbF9wb2ludCgpID09ICpybC5kZWNpbWFsX3BvaW50ICk7CisKKyAgZmxvYXQgdmFsID0gMTIzNC41NmY7CisgIG9zdHJpbmdzdHJlYW0gZm9zdHI7CisgIGZvc3RyLmltYnVlKGxvYyk7CisgIGZvc3RyIDw8IHZhbDsKKworICBzdHJpbmcgcmVmID0gIjEiOworICBpZiAoIW5wY3QuZ3JvdXBpbmcoKS5lbXB0eSgpKSB7CisgICAgcmVmICs9IG5wY3QudGhvdXNhbmRzX3NlcCgpOworICB9CisgIHJlZiArPSAiMjM0IjsKKyAgcmVmICs9IG5wY3QuZGVjaW1hbF9wb2ludCgpOworICByZWYgKz0gIjU2IjsKKyAgLy9jb3V0IDw8ICJJbiAiIDw8IGxvYy5uYW1lKCkgPDwgIiAxMjM0LjU2IGlzIHdyaXR0ZW46ICIgPDwgZm9zdHIuc3RyKCkgPDwgZW5kbDsKKyAgQ1BQVU5JVF9BU1NFUlQoIGZvc3RyLnN0cigpID09IHJlZiApOworCisgIHZhbCA9IDEyMzQ1Njc4LjlmOworICByZWYgPSAiMSI7CisgIHJlZiArPSBucGN0LmRlY2ltYWxfcG9pbnQoKTsKKyAgcmVmICs9ICIyMzQ1N2UrIjsKKyAgc3RyaW5nIGRpZ2l0cyA9ICI3IjsKKyAgY29tcGxldGVfZGlnaXRzKGRpZ2l0cyk7CisgIHJlZiArPSBkaWdpdHM7CisgIGZvc3RyLnN0cigiIik7CisgIGZvc3RyIDw8IHZhbDsKKyAgQ1BQVU5JVF9BU1NFUlQoIGZvc3RyLnN0cigpID09IHJlZiApOworCisgIHZhbCA9IDEwMDAwMDAwMDAuMGY7CisgIGZvc3RyLnN0cigiIik7CisgIGZvc3RyIDw8IHZhbDsKKyAgZGlnaXRzID0gIjkiOworICBjb21wbGV0ZV9kaWdpdHMoZGlnaXRzKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIGZvc3RyLnN0cigpID09IHN0cmluZygiMWUrIikgKyBkaWdpdHMgKTsKKworICB2YWwgPSAxMjM0LjBmOworICByZWYgPSAiMSI7CisgIGlmICghbnBjdC5ncm91cGluZygpLmVtcHR5KCkpIHsKKyAgICByZWYgKz0gbnBjdC50aG91c2FuZHNfc2VwKCk7CisgIH0KKyAgcmVmICs9ICIyMzQiOworICBmb3N0ci5zdHIoIiIpOworICBmb3N0ciA8PCB2YWw7CisgIENQUFVOSVRfQVNTRVJUKCBmb3N0ci5zdHIoKSA9PSByZWYgKTsKKworICB2YWwgPSAxMDAwMDAwMS4wZjsKKyAgZm9zdHIuc3RyKCIiKTsKKyAgZm9zdHIgPDwgdmFsOworICBkaWdpdHMgPSAiNyI7CisgIGNvbXBsZXRlX2RpZ2l0cyhkaWdpdHMpOworICBDUFBVTklUX0FTU0VSVCggZm9zdHIuc3RyKCkgPT0gc3RyaW5nKCIxZSsiKSArIGRpZ2l0cyApOworCisgIGlmIChucGN0Lmdyb3VwaW5nKCkuc2l6ZSgpID09IDEgJiYgbnBjdC5ncm91cGluZygpWzBdID09IDMpIHsKKyAgICBpbnQgaXZhbCA9IDEyMzQ1Njc4OTA7CisgICAgZm9zdHIuc3RyKCIiKTsKKyAgICBmb3N0ciA8PCBpdmFsOworICAgIHJlZiA9ICIxIjsKKyAgICByZWYgKz0gbnBjdC50aG91c2FuZHNfc2VwKCk7CisgICAgcmVmICs9ICIyMzQiOworICAgIHJlZiArPSBucGN0LnRob3VzYW5kc19zZXAoKTsKKyAgICByZWYgKz0gIjU2NyI7CisgICAgcmVmICs9IG5wY3QudGhvdXNhbmRzX3NlcCgpOworICAgIHJlZiArPSAiODkwIjsKKyAgICBDUFBVTklUX0FTU0VSVCggZm9zdHIuc3RyKCkgPT0gcmVmICk7CisgIH0KKworI2lmIGRlZmluZWQgKF9fQk9STEFORENfXykKKyAgbnVtX3B1dDxjaGFyPiBjb25zdCYgbnB1dCA9IHVzZV9mYWNldDxudW1fcHV0PGNoYXI+ID4obG9jKTsKKyAgdHlwZWRlZiBudW1lcmljX2xpbWl0czxkb3VibGU+IGxpbWQ7CisgIGZvc3RyLnNldGYoaW9zX2Jhc2U6OnVwcGVyY2FzZSB8IGlvc19iYXNlOjpzaG93cG9zKTsKKworICBpZiAobGltZDo6aGFzX2luZmluaXR5KSB7CisgICAgZG91YmxlIGluZmluaXR5ID0gbGltZDo6aW5maW5pdHkoKTsKKyAgICBmb3N0ci5zdHIoIiIpOworICAgIG5wdXQucHV0KGZvc3RyLCBmb3N0ciwgJyAnLCBpbmZpbml0eSk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGZvc3RyLnN0cigpID09IHN0cmluZygiK0luZiIpICk7CisgIH0KKworICBpZiAobGltZDo6aGFzX3F1aWV0X05hTikgeworICAgIC8qIElnbm9yZSBGUFUgZXhjZXB0aW9ucyAqLworICAgIHVuc2lnbmVkIGludCBfZmxvYXRfY29udHJvbF93b3JkID0gX2NvbnRyb2w4NygwLCAwKTsKKyAgICBfY29udHJvbDg3KEVNX0lOVkFMSUR8RU1fSU5FWEFDVCwgTUNXX0VNKTsKKyAgICBkb3VibGUgcW5hbiA9IGxpbWQ6OnF1aWV0X05hTigpOworICAgIC8qIFJlc2V0IGZsb2F0aW5nIHBvaW50IGNvbnRyb2wgd29yZCAqLworICAgIF9jbGVhcjg3KCk7CisgICAgX2NvbnRyb2w4NyhfZmxvYXRfY29udHJvbF93b3JkLCBNQ1dfRU0pOworICAgIGZvc3RyLnN0cigiIik7CisgICAgbnB1dC5wdXQoZm9zdHIsIGZvc3RyLCAnICcsIHFuYW4pOworICAgIENQUFVOSVRfQVNTRVJUKCBmb3N0ci5zdHIoKSA9PSBzdHJpbmcoIitOYU4iKSApOworICB9CisjZW5kaWYKK30KKwordHlwZWRlZiB2b2lkIChMb2NhbGVUZXN0OjoqX1Rlc3QpIChjb25zdCBsb2NhbGUmLCBjb25zdCByZWZfbG9jYWxlKik7CitzdGF0aWMgdm9pZCB0ZXN0X3N1cHBvcnRlZF9sb2NhbGUoTG9jYWxlVGVzdCYgaW5zdCwgX1Rlc3QgX190ZXN0KSB7CisgIHNpemVfdCBuID0gc2l6ZW9mKHRlc3RlZF9sb2NhbGVzKSAvIHNpemVvZih0ZXN0ZWRfbG9jYWxlc1swXSk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbjsgKytpKSB7CisgICAgbG9jYWxlIGxvYzsKKyMgIGlmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkIChfU1RMUF9VU0VfRVhDRVBUSU9OUykKKyAgICB0cnkKKyMgIGVuZGlmCisgICAgeworICAgICAgbG9jYWxlIHRtcCh0ZXN0ZWRfbG9jYWxlc1tpXS5uYW1lKTsKKyAgICAgIGxvYyA9IHRtcDsKKyAgICB9CisjICBpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZCAoX1NUTFBfVVNFX0VYQ0VQVElPTlMpCisgICAgY2F0Y2ggKHJ1bnRpbWVfZXJyb3IgY29uc3QmKSB7CisgICAgICAvL1RoaXMgbG9jYWxlIGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgICBjb250aW51ZTsKKyAgICB9CisjICBlbmRpZgorICAgIENQUFVOSVRfTUVTU0FHRSggbG9jLm5hbWUoKS5jX3N0cigpICk7CisgICAgKGluc3QuKl9fdGVzdCkobG9jLCB0ZXN0ZWRfbG9jYWxlcyArIGkpOworCisgICAgeworICAgICAgbG9jYWxlIHRtcChsb2NhbGU6OmNsYXNzaWMoKSwgdGVzdGVkX2xvY2FsZXNbaV0ubmFtZSwgbG9jYWxlOjpudW1lcmljKTsKKyAgICAgIGxvYyA9IHRtcDsKKyAgICB9CisgICAgKGluc3QuKl9fdGVzdCkobG9jLCB0ZXN0ZWRfbG9jYWxlcyArIGkpOworCisgICAgeworICAgICAgbG9jYWxlIHRtcChsb2NhbGU6OmNsYXNzaWMoKSwgbmV3IG51bXB1bmN0X2J5bmFtZTxjaGFyPih0ZXN0ZWRfbG9jYWxlc1tpXS5uYW1lKSk7CisgICAgICBsb2MgPSB0bXA7CisgICAgfQorICAgIChpbnN0LipfX3Rlc3QpKGxvYywgdGVzdGVkX2xvY2FsZXMgKyBpKTsKKyAgfQorfQorCit2b2lkIExvY2FsZVRlc3Q6Om51bV9wdXRfZ2V0KCkKK3sgdGVzdF9zdXBwb3J0ZWRfbG9jYWxlKCp0aGlzLCAmTG9jYWxlVGVzdDo6X251bV9wdXRfZ2V0KTsgfQorCit2b2lkIExvY2FsZVRlc3Q6Om51bXB1bmN0X2J5X25hbWUoKQoreworICAvKgorICAgKiBDaGVjayBvZiB0aGUgMjIuMS4xLjIuNyBzdGFuZGFyZCBwb2ludC4gQ29uc3RydWN0aW9uIG9mIGEgbG9jYWxlCisgICAqIGluc3RhbmNlIGZyb20gYSBudWxsIHBvaW50ZXIgb3IgYW4gdW5rbm93biBuYW1lIHNob3VsZCByZXN1bHQgaW4KKyAgICogYSBydW50aW1lX2Vycm9yIGV4Y2VwdGlvbi4KKyAgICovCisjICBpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZCAoX1NUTFBfVVNFX0VYQ0VQVElPTlMpCisjICAgIGlmIGRlZmluZWQgKFNUTFBPUlQpIHx8ICFkZWZpbmVkIChfX0dOVUNfXykKKyAgdHJ5IHsKKyAgICBsb2NhbGUgbG9jKGxvY2FsZTo6Y2xhc3NpYygpLCBuZXcgbnVtcHVuY3RfYnluYW1lPGNoYXI+KHN0YXRpY19jYXN0PGNoYXIgY29uc3QqPigwKSkpOworICAgIENQUFVOSVRfRkFJTDsKKyAgfQorICBjYXRjaCAocnVudGltZV9lcnJvciBjb25zdCYgLyogZSAqLykgeworICAgIC8vQ1BQVU5JVF9NRVNTQUdFKCBlLndoYXQoKSApOworICB9CisgIGNhdGNoICguLi4pIHsKKyAgICBDUFBVTklUX0ZBSUw7CisgIH0KKyMgICAgZW5kaWYKKworICB0cnkgeworICAgIGxvY2FsZSBsb2MobG9jYWxlOjpjbGFzc2ljKCksIG5ldyBudW1wdW5jdF9ieW5hbWU8Y2hhcj4oInlhc2xpX2xhbmd1YWdlIikpOworICAgIENQUFVOSVRfRkFJTDsKKyAgfQorICBjYXRjaCAocnVudGltZV9lcnJvciBjb25zdCYgLyogZSAqLykgeworICAgIC8vQ1BQVU5JVF9NRVNTQUdFKCBlLndoYXQoKSApOworICB9CisgIGNhdGNoICguLi4pIHsKKyAgICBDUFBVTklUX0ZBSUw7CisgIH0KKworICB0cnkgeworICAgIHN0cmluZyB2ZXJ5TG9uZ0ZhY2V0TmFtZSgiTENfTlVNRVJJQz0iKTsKKyAgICB2ZXJ5TG9uZ0ZhY2V0TmFtZS5hcHBlbmQoNTEyLCAnPycpOworICAgIGxvY2FsZSBsb2MobG9jYWxlOjpjbGFzc2ljKCksIG5ldyBudW1wdW5jdF9ieW5hbWU8Y2hhcj4odmVyeUxvbmdGYWNldE5hbWUuY19zdHIoKSkpOworICAgIENQUFVOSVRfRkFJTDsKKyAgfQorICBjYXRjaCAocnVudGltZV9lcnJvciBjb25zdCYgLyogZSAqLykgeworICAgIC8vQ1BQVU5JVF9NRVNTQUdFKCBlLndoYXQoKSApOworICB9CisgIGNhdGNoICguLi4pIHsKKyAgICBDUFBVTklUX0ZBSUw7CisgIH0KKworICB0cnkgeworICAgIGxvY2FsZSBsb2MobG9jYWxlOjpjbGFzc2ljKCksICJDIiwgbG9jYWxlOjpudW1lcmljKTsKKyAgfQorICBjYXRjaCAocnVudGltZV9lcnJvciBjb25zdCYgZSkgeworICAgIENQUFVOSVRfTUVTU0FHRSggZS53aGF0KCkgKTsKKyAgICBDUFBVTklUX0ZBSUw7CisgIH0KKyAgY2F0Y2ggKC4uLikgeworICAgIENQUFVOSVRfRkFJTDsKKyAgfQorCisgIHRyeSB7CisgICAgLy8gT24gcGxhdGZvcm0gd2l0aG91dCByZWFsIGxvY2FsaXphdGlvbiBzdXBwb3J0IHdlIHNob3VsZCByZWx5IG9uIHRoZSAiQyIgZmFjZXQuCisgICAgbG9jYWxlIGxvYyhsb2NhbGU6OmNsYXNzaWMoKSwgIiIsIGxvY2FsZTo6bnVtZXJpYyk7CisgIH0KKyAgY2F0Y2ggKHJ1bnRpbWVfZXJyb3IgY29uc3QmIGUpIHsKKyAgICBDUFBVTklUX01FU1NBR0UoIGUud2hhdCgpICk7CisgICAgQ1BQVU5JVF9GQUlMOworICB9CisgIGNhdGNoICguLi4pIHsKKyAgICBDUFBVTklUX0ZBSUw7CisgIH0KKworICB0cnkgeworICAgIGxvY2FsZSBsb2MobG9jYWxlOjpjbGFzc2ljKCksIG5ldyBudW1wdW5jdF9ieW5hbWU8Y2hhcj4oIkMiKSk7CisgICAgbnVtcHVuY3Q8Y2hhcj4gY29uc3QmIGNmYWNldF9ieW5hbWUgPSB1c2VfZmFjZXQ8bnVtcHVuY3Q8Y2hhcj4gPihsb2MpOworICAgIG51bXB1bmN0PGNoYXI+IGNvbnN0JiBjZmFjZXQgPSB1c2VfZmFjZXQ8bnVtcHVuY3Q8Y2hhcj4gPihsb2NhbGU6OmNsYXNzaWMoKSk7CisKKyAgICBDUFBVTklUX0NIRUNLKCBjZmFjZXRfYnluYW1lLmRlY2ltYWxfcG9pbnQoKSA9PSBjZmFjZXQuZGVjaW1hbF9wb2ludCgpICk7CisgICAgQ1BQVU5JVF9DSEVDSyggY2ZhY2V0X2J5bmFtZS5ncm91cGluZygpID09IGNmYWNldC5ncm91cGluZygpICk7CisgICAgaWYgKCFjZmFjZXQuZ3JvdXBpbmcoKS5lbXB0eSgpKQorICAgICAgQ1BQVU5JVF9DSEVDSyggY2ZhY2V0X2J5bmFtZS50aG91c2FuZHNfc2VwKCkgPT0gY2ZhY2V0LnRob3VzYW5kc19zZXAoKSApOworIyAgICBpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgIWRlZmluZWQgKF9fR0xJQkNfXykKKyAgICBDUFBVTklUX0NIRUNLKCBjZmFjZXRfYnluYW1lLnRydWVuYW1lKCkgPT0gY2ZhY2V0LnRydWVuYW1lKCkgKTsKKyAgICBDUFBVTklUX0NIRUNLKCBjZmFjZXRfYnluYW1lLmZhbHNlbmFtZSgpID09IGNmYWNldC5mYWxzZW5hbWUoKSApOworIyAgICBlbmRpZgorICB9CisgIGNhdGNoIChydW50aW1lX2Vycm9yIGNvbnN0JiAvKiBlICovKSB7CisgICAgLy9DUFBVTklUX01FU1NBR0UoIGUud2hhdCgpICk7CisgICAgQ1BQVU5JVF9GQUlMOworICB9CisgIGNhdGNoICguLi4pIHsKKyAgICBDUFBVTklUX0ZBSUw7CisgIH0KKworICB0cnkgeworICAgIC8vIE9uIHBsYXRmb3JtIHdpdGhvdXQgcmVhbCBsb2NhbGl6YXRpb24gc3VwcG9ydCB3ZSBzaG91bGQgcmVseSBvbiB0aGUgIkMiIGxvY2FsZSBmYWNldC4KKyAgICBsb2NhbGUgbG9jKGxvY2FsZTo6Y2xhc3NpYygpLCBuZXcgbnVtcHVuY3RfYnluYW1lPGNoYXI+KCIiKSk7CisgIH0KKyAgY2F0Y2ggKHJ1bnRpbWVfZXJyb3IgY29uc3QmIGUpIHsKKyAgICBDUFBVTklUX01FU1NBR0UoIGUud2hhdCgpICk7CisgICAgQ1BQVU5JVF9GQUlMOworICB9CisgIGNhdGNoICguLi4pIHsKKyAgICBDUFBVTklUX0ZBSUw7CisgIH0KKworIyAgICBpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgIWRlZmluZWQgKF9TVExQX05PX1dDSEFSX1QpCisjICAgICAgaWYgZGVmaW5lZCAoU1RMUE9SVCkgfHwgIWRlZmluZWQgKF9fR05VQ19fKQorICB0cnkgeworICAgIGxvY2FsZSBsb2MobG9jYWxlOjpjbGFzc2ljKCksIG5ldyBudW1wdW5jdF9ieW5hbWU8d2NoYXJfdD4oc3RhdGljX2Nhc3Q8Y2hhciBjb25zdCo+KDApKSk7CisgICAgQ1BQVU5JVF9GQUlMOworICB9CisgIGNhdGNoIChydW50aW1lX2Vycm9yIGNvbnN0JikgeworICB9CisgIGNhdGNoICguLi4pIHsKKyAgICBDUFBVTklUX0ZBSUw7CisgIH0KKyMgICAgICBlbmRpZgorCisgIHRyeSB7CisgICAgbG9jYWxlIGxvYyhsb2NhbGU6OmNsYXNzaWMoKSwgbmV3IG51bXB1bmN0X2J5bmFtZTx3Y2hhcl90PigieWFzbGlfbGFuZ3VhZ2UiKSk7CisgICAgQ1BQVU5JVF9GQUlMOworICB9CisgIGNhdGNoIChydW50aW1lX2Vycm9yIGNvbnN0JikgeworICB9CisgIGNhdGNoICguLi4pIHsKKyAgICBDUFBVTklUX0ZBSUw7CisgIH0KKyMgICAgZW5kaWYKKyMgIGVuZGlmCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L251bV9wdXRfZ2V0X3Rlc3QuY3BwIGIvdGVzdC91bml0L251bV9wdXRfZ2V0X3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzYjI1MGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvbnVtX3B1dF9nZXRfdGVzdC5jcHAKQEAgLTAsMCArMSwxMjY2IEBACisjaW5jbHVkZSA8bGltaXRzPgorCisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8ICFkZWZpbmVkIChfU1RMUF9VU0VfTk9fSU9TVFJFQU1TKQorIyAgaW5jbHVkZSA8aW9tYW5pcD4KKyMgIGluY2x1ZGUgPHN0cmluZz4KKyMgIGluY2x1ZGUgPHNzdHJlYW0+CisjICBpbmNsdWRlIDxjc3RkaW8+CisvKgorIyAgaW5jbHVkZSA8aW9zdHJlYW0+CisjICBpbmNsdWRlIDxpZWVlNzU0Lmg+CisqLworCisjICBpbmNsdWRlICJjb21wbGV0ZV9kaWdpdHMuaCIKKyMgIGluY2x1ZGUgImNwcHVuaXQvY3BwdW5pdF9wcm94eS5oIgorCisjICBpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZChfU1RMUF9VU0VfTkFNRVNQQUNFUykKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisjICBlbmRpZgorCisvLworLy8gVGVzdENhc2UgY2xhc3MKKy8vCitjbGFzcyBOdW1QdXRHZXRUZXN0IDogcHVibGljIENQUFVOSVRfTlM6OlRlc3RDYXNlCit7CisgIENQUFVOSVRfVEVTVF9TVUlURShOdW1QdXRHZXRUZXN0KTsKKyMgIGlmIGRlZmluZWQgKF9fQk9STEFORENfXykKKyAgLyogSWdub3JlIEZQVSBleGNlcHRpb25zLCBzZXQgRlBVIHByZWNpc2lvbiB0byA2NCBiaXRzICovCisgIHVuc2lnbmVkIGludCBfZmxvYXRfY29udHJvbF93b3JkID0gX2NvbnRyb2w4NygwLCAwKTsKKyAgX2NvbnRyb2w4NyhQQ182NHxNQ1dfRU18SUNfQUZGSU5FLCBNQ1dfUEN8TUNXX0VNfE1DV19JQyk7CisjICBlbmRpZgorICBDUFBVTklUX1RFU1QobnVtX3B1dF9mbG9hdCk7CisgIENQUFVOSVRfVEVTVChudW1fcHV0X2ludGVnZXIpOworICBDUFBVTklUX1RFU1QobnVtX2dldF9mbG9hdCk7CisgIENQUFVOSVRfVEVTVChudW1fZ2V0X2ludGVnZXIpOworICBDUFBVTklUX1RFU1QoaW5oZXgpOworICBDUFBVTklUX1RFU1QocG9pbnRlcik7CisgIENQUFVOSVRfVEVTVChmaXhfZmxvYXRfbG9uZyk7CisgIENQUFVOSVRfVEVTVChjdXN0b21fbnVtcHVuY3QpOworIyAgaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKQorICAvKiBSZXNldCBmbG9hdGluZyBwb2ludCBjb250cm9sIHdvcmQgKi8KKyAgX2NsZWFyODcoKTsKKyAgX2NvbnRyb2w4NyhfZmxvYXRfY29udHJvbF93b3JkLCBNQ1dfUEN8TUNXX0VNfE1DV19JQyk7CisjICBlbmRpZgorICBDUFBVTklUX1RFU1RfU1VJVEVfRU5EKCk7CisKK3ByaXZhdGU6CisgIHZvaWQgbnVtX3B1dF9mbG9hdCgpOworICB2b2lkIG51bV9wdXRfaW50ZWdlcigpOworICB2b2lkIG51bV9nZXRfZmxvYXQoKTsKKyAgdm9pZCBudW1fZ2V0X2ludGVnZXIoKTsKKyAgdm9pZCBpbmhleCgpOworICB2b2lkIHBvaW50ZXIoKTsKKyAgdm9pZCBmaXhfZmxvYXRfbG9uZygpOworICB2b2lkIGN1c3RvbV9udW1wdW5jdCgpOworCisgIHN0YXRpYyBib29sIGNoZWNrX2Zsb2F0KGZsb2F0IHZhbCwgZmxvYXQgcmVmKQorICB7CisgICAgZmxvYXQgZXBzaWxvbiA9IG51bWVyaWNfbGltaXRzPGZsb2F0Pjo6ZXBzaWxvbigpOworICAgIHJldHVybiB2YWwgPD0gcmVmICsgZXBzaWxvbiAmJiB2YWwgPj0gcmVmIC0gZXBzaWxvbjsKKyAgfQorCisgIHN0YXRpYyBib29sIGNoZWNrX2RvdWJsZShkb3VibGUgdmFsLCBkb3VibGUgcmVmKQorICB7CisgICAgZG91YmxlIGVwc2lsb24gPSBudW1lcmljX2xpbWl0czxkb3VibGU+OjplcHNpbG9uKCk7CisgICAgcmV0dXJuIHZhbCA8PSByZWYgKyBlcHNpbG9uICYmIHZhbCA+PSByZWYgLSBlcHNpbG9uOworICB9CisKKyAgc3RhdGljIHN0cmluZyByZXNldF9zdHJlYW0ob3N0cmluZ3N0cmVhbSAmb3N0cikKKyAgeworICAgIHN0cmluZyB0bXAgPSBvc3RyLnN0cigpOworICAgIG9zdHIuc3RyKCIiKTsKKyAgICByZXR1cm4gdG1wOworICB9CisKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgIWRlZmluZWQgKF9TVExQX05PX01FTUJFUl9URU1QTEFURVMpCisgIHRlbXBsYXRlIDxjbGFzcyBGPgorICB2b2lkIGNoZWNrX2dldF9mbG9hdCggRiB2ICkKKyAgeworICAgIEYgaW5fdmFsX2QgPSB2OworICAgIHR5cGVkZWYgbnVtZXJpY19saW1pdHM8Rj4gbGltaXRzOworICAgIHsKKyAgICAgIHN0cmluZ3N0cmVhbSBzdHI7CisKKyAgICAgIHN0ciA8PCAiMUUrIiA8PCBsaW1pdHM6Om1heF9leHBvbmVudDEwOworCisgICAgICBzdHIgPj4gaW5fdmFsX2Q7CisgICAgICBDUFBVTklUX0FTU0VSVCghc3RyLmZhaWwoKSk7CisgICAgICBDUFBVTklUX0FTU0VSVChzdHIuZW9mKCkpOworICAgICAgQ1BQVU5JVF9DSEVDSyggaW5fdmFsX2QgPT0gaW5fdmFsX2QgKTsKKyAgICAgIENQUFVOSVRfQ0hFQ0soIGluX3ZhbF9kICE9IGxpbWl0czo6aW5maW5pdHkoKSApOworICAgIH0KKyAgICB7CisgICAgICBzdHJpbmdzdHJlYW0gc3RyOworCisgICAgICBzdHIgPDwgIi0xRSsiIDw8IGxpbWl0czo6bWF4X2V4cG9uZW50MTA7CisKKyAgICAgIHN0ciA+PiBpbl92YWxfZDsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCFzdHIuZmFpbCgpKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKHN0ci5lb2YoKSk7CisgICAgICBDUFBVTklUX0NIRUNLKCBpbl92YWxfZCA9PSBpbl92YWxfZCApOworICAgICAgQ1BQVU5JVF9DSEVDSyggaW5fdmFsX2QgIT0gLWxpbWl0czo6aW5maW5pdHkoKSApOworICAgIH0KKyAgICB7CisgICAgICBzdHJpbmdzdHJlYW0gc3RyOworCisgICAgICBzdHIgPDwgIjFFIiA8PCBsaW1pdHM6Om1pbl9leHBvbmVudDEwOworCisgICAgICBzdHIgPj4gaW5fdmFsX2Q7CisgICAgICBDUFBVTklUX0FTU0VSVCghc3RyLmZhaWwoKSk7CisgICAgICBDUFBVTklUX0FTU0VSVChzdHIuZW9mKCkpOworICAgICAgQ1BQVU5JVF9DSEVDSyggaW5fdmFsX2QgPT0gaW5fdmFsX2QgKTsKKyAgICAgIENQUFVOSVRfQ0hFQ0soIGluX3ZhbF9kICE9IEYoMC4wKSApOworICAgIH0KKyAgICB7CisgICAgICBzdHJpbmdzdHJlYW0gc3RyOworCisgICAgICBzdHIgPDwgIjFFKyIgPDwgKGxpbWl0czo6bWF4X2V4cG9uZW50MTAgKyAxKTsKKworICAgICAgc3RyID4+IGluX3ZhbF9kOworICAgICAgQ1BQVU5JVF9BU1NFUlQoIXN0ci5mYWlsKCkpOworICAgICAgQ1BQVU5JVF9BU1NFUlQoc3RyLmVvZigpKTsKKyAgICAgIENQUFVOSVRfQ0hFQ0soIGluX3ZhbF9kID09IGluX3ZhbF9kICk7CisgICAgICBDUFBVTklUX0NIRUNLKCBpbl92YWxfZCA9PSBsaW1pdHM6OmluZmluaXR5KCkgKTsKKyAgICB9CisgICAgeworICAgICAgc3RyaW5nc3RyZWFtIHN0cjsKKworICAgICAgc3RyIDw8ICItMUUrIiA8PCAobGltaXRzOjptYXhfZXhwb25lbnQxMCArIDEpOworCisgICAgICBzdHIgPj4gaW5fdmFsX2Q7CisgICAgICBDUFBVTklUX0FTU0VSVCghc3RyLmZhaWwoKSk7CisgICAgICBDUFBVTklUX0FTU0VSVChzdHIuZW9mKCkpOworICAgICAgQ1BQVU5JVF9DSEVDSyggaW5fdmFsX2QgPT0gaW5fdmFsX2QgKTsKKyAgICAgIENQUFVOSVRfQ0hFQ0soIGluX3ZhbF9kID09IC1saW1pdHM6OmluZmluaXR5KCkgKTsKKyAgICB9CisgICAgeworICAgICAgc3RyaW5nc3RyZWFtIHN0cjsKKworICAgICAgc3RyIDw8ICIxRSIgPDwgKGxpbWl0czo6bWluX2V4cG9uZW50MTAgLSAxKTsKKworICAgICAgc3RyID4+IGluX3ZhbF9kOworICAgICAgQ1BQVU5JVF9BU1NFUlQoIXN0ci5mYWlsKCkpOworICAgICAgQ1BQVU5JVF9BU1NFUlQoc3RyLmVvZigpKTsKKyAgICAgIENQUFVOSVRfQ0hFQ0soIGluX3ZhbF9kID09IGluX3ZhbF9kICk7CisgICAgICBDUFBVTklUX0NIRUNLKCBpbl92YWxfZCA+PSBGKDAuMCkgJiYgaW5fdmFsX2QgPD0gbGltaXRzOjptaW4oKSApOworICAgIH0KKyNpZiAhZGVmaW5lZCAoX19NSU5HVzMyX18pCisgICAgeworICAgICAgc3RyaW5nc3RyZWFtIHN0cjsKKworICAgICAgc3RyIDw8IGxpbWl0czo6bWF4KCk7CisKKyAgICAgIENQUFVOSVRfQVNTRVJUKCFzdHIuZmFpbCgpKTsKKyAgICAgIENQUFVOSVRfQ0hFQ0soIHN0ci5zdHIoKSAhPSAiaW5mIiApOworICAgICAgQ1BQVU5JVF9DSEVDSyggc3RyLnN0cigpICE9ICItaW5mIiApOworICAgICAgQ1BQVU5JVF9DSEVDSyggc3RyLnN0cigpICE9ICJuYW4iICk7CisgICAgICBDUFBVTklUX0NIRUNLKCBzdHIuc3RyKCkgIT0gIi1uYW4iICk7CisgICAgICAvL0NQUFVOSVRfTUVTU0FHRSggc3RyLnN0cigpLmNfc3RyKCkgKTsKKworICAgICAgLy9zdHIuc3RyKCIiKTsKKyAgICAgIC8vc3RyIDw8IGxpbWl0czo6bWF4X2V4cG9uZW50MTA7CisgICAgICAvL0NQUFVOSVRfTUVTU0FHRSggc3RyLnN0cigpLmNfc3RyKCkgKTsKKworICAgICAgc3RyID4+IGluX3ZhbF9kOworCisgICAgICBDUFBVTklUX0FTU0VSVCghc3RyLmZhaWwoKSk7CisgICAgICBDUFBVTklUX0FTU0VSVChzdHIuZW9mKCkpOworICAgICAgQ1BQVU5JVF9DSEVDSyggaW5fdmFsX2QgPT0gaW5fdmFsX2QgKTsKKyAgICAgIENQUFVOSVRfQ0hFQ0soIGluX3ZhbF9kICE9IGxpbWl0czo6aW5maW5pdHkoKSApOworICAgIH0KKyAgICB7CisgICAgICBzdHJpbmdzdHJlYW0gc3RyOworCisgICAgICBzdHIgPDwgZml4ZWQgPDwgbGltaXRzOjptYXgoKTsKKworICAgICAgQ1BQVU5JVF9BU1NFUlQoIXN0ci5mYWlsKCkpOworICAgICAgQ1BQVU5JVF9DSEVDSyggc3RyLnN0cigpICE9ICJpbmYiICk7CisgICAgICBDUFBVTklUX0NIRUNLKCBzdHIuc3RyKCkgIT0gIi1pbmYiICk7CisgICAgICBDUFBVTklUX0NIRUNLKCBzdHIuc3RyKCkgIT0gIm5hbiIgKTsKKyAgICAgIENQUFVOSVRfQ0hFQ0soIHN0ci5zdHIoKSAhPSAiLW5hbiIgKTsKKyAgICAgIC8vQ1BQVU5JVF9NRVNTQUdFKCBzdHIuc3RyKCkuY19zdHIoKSApOworCisgICAgICAvL3N0ci5zdHIoIiIpOworICAgICAgLy9zdHIgPDwgbGltaXRzOjptYXhfZXhwb25lbnQxMDsKKyAgICAgIC8vQ1BQVU5JVF9NRVNTQUdFKCBzdHIuc3RyKCkuY19zdHIoKSApOworCisgICAgICBzdHIgPj4gaW5fdmFsX2Q7CisKKyAgICAgIENQUFVOSVRfQVNTRVJUKCFzdHIuZmFpbCgpKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKHN0ci5lb2YoKSk7CisgICAgICBDUFBVTklUX0NIRUNLKCBpbl92YWxfZCA9PSBpbl92YWxfZCApOworICAgICAgQ1BQVU5JVF9DSEVDSyggaW5fdmFsX2QgIT0gbGltaXRzOjppbmZpbml0eSgpICk7CisgICAgfQorICAgIHsKKyAgICAgIHN0cmluZ3N0cmVhbSBzdHI7CisKKyAgICAgIHN0ciA8PCBzY2llbnRpZmljIDw8IHNldHByZWNpc2lvbig1MCkgPDwgbGltaXRzOjptYXgoKTsKKworICAgICAgQ1BQVU5JVF9BU1NFUlQoIXN0ci5mYWlsKCkpOworICAgICAgQ1BQVU5JVF9DSEVDSyggc3RyLnN0cigpICE9ICJpbmYiICk7CisgICAgICBDUFBVTklUX0NIRUNLKCBzdHIuc3RyKCkgIT0gIi1pbmYiICk7CisgICAgICBDUFBVTklUX0NIRUNLKCBzdHIuc3RyKCkgIT0gIm5hbiIgKTsKKyAgICAgIENQUFVOSVRfQ0hFQ0soIHN0ci5zdHIoKSAhPSAiLW5hbiIgKTsKKyAgICAgIC8vQ1BQVU5JVF9NRVNTQUdFKCBzdHIuc3RyKCkuY19zdHIoKSApOworCisgICAgICAvL3N0ci5zdHIoIiIpOworICAgICAgLy9zdHIgPDwgbGltaXRzOjptYXhfZXhwb25lbnQxMDsKKyAgICAgIC8vQ1BQVU5JVF9NRVNTQUdFKCBzdHIuc3RyKCkuY19zdHIoKSApOworCisgICAgICBzdHIgPj4gaW5fdmFsX2Q7CisKKyAgICAgIENQUFVOSVRfQVNTRVJUKCFzdHIuZmFpbCgpKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKHN0ci5lb2YoKSk7CisgICAgICBDUFBVTklUX0NIRUNLKCBpbl92YWxfZCA9PSBpbl92YWxfZCApOworICAgICAgQ1BQVU5JVF9DSEVDSyggaW5fdmFsX2QgIT0gbGltaXRzOjppbmZpbml0eSgpICk7CisgICAgfQorI2VuZGlmCisgICAgeworICAgICAgc3RyaW5nc3RyZWFtIHN0cjsKKworICAgICAgc3RyIDw8IGxpbWl0czo6aW5maW5pdHkoKTsKKworICAgICAgQ1BQVU5JVF9BU1NFUlQoICFzdHIuZmFpbCgpICk7CisgICAgICBDUFBVTklUX0FTU0VSVCggIWxpbWl0czo6aGFzX2luZmluaXR5IHx8IHN0ci5zdHIoKSA9PSAiaW5mIiApOworICAgIH0KKyAgICB7CisgICAgICBzdHJpbmdzdHJlYW0gc3RyOworCisgICAgICBzdHIgPDwgLWxpbWl0czo6aW5maW5pdHkoKTsKKworICAgICAgQ1BQVU5JVF9BU1NFUlQoICFzdHIuZmFpbCgpICk7CisgICAgICBDUFBVTklUX0FTU0VSVCggIWxpbWl0czo6aGFzX2luZmluaXR5IHx8IHN0ci5zdHIoKSA9PSAiLWluZiIgKTsKKyAgICB9CisgICAgeworICAgICAgc3RyaW5nc3RyZWFtIHN0cjsKKworICAgICAgc3RyIDw8IGxpbWl0czo6cXVpZXRfTmFOKCk7CisKKyAgICAgIENQUFVOSVRfQVNTRVJUKCAhc3RyLmZhaWwoKSApOworICAgICAgQ1BQVU5JVF9BU1NFUlQoICFsaW1pdHM6Omhhc19xdWlldF9OYU4gfHwgc3RyLnN0cigpID09ICJuYW4iICk7CisgICAgfQorICAgIHsKKyAgICAgIHN0cmluZ3N0cmVhbSBzdHI7CisKKyAgICAgIHN0ciA8PCAtbGltaXRzOjpxdWlldF9OYU4oKTsKKworICAgICAgQ1BQVU5JVF9BU1NFUlQoICFzdHIuZmFpbCgpICk7CisgICAgICBDUFBVTklUX0FTU0VSVCggIWxpbWl0czo6aGFzX3F1aWV0X05hTiB8fCBzdHIuc3RyKCkgPT0gIi1uYW4iICk7CisgICAgfQorICAgIHsKKyAgICAgIHN0cmluZ3N0cmVhbSBzdHI7CisKKyAgICAgIHN0ciA8PCAiMC4iIDw8IHN0cmluZyhsaW1pdHM6Om1heF9leHBvbmVudDEwLCAnMCcpIDw8ICIxZSIgPDwgKGxpbWl0czo6bWF4X2V4cG9uZW50MTAgKyAxKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCAhc3RyLmZhaWwoKSApOworCisgICAgICBzdHIgPj4gaW5fdmFsX2Q7CisgICAgICBDUFBVTklUX0FTU0VSVCggIXN0ci5mYWlsKCkgKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBzdHIuZW9mKCkgKTsKKyAgICAgIENQUFVOSVRfQ0hFQ0soIGluX3ZhbF9kID09IDEgKTsKKyAgICB9CisgICAgeworICAgICAgc3RyaW5nc3RyZWFtIHN0cjsKKworICAgICAgc3RyIDw8ICIxIiA8PCBzdHJpbmcoLShsaW1pdHM6Om1pbl9leHBvbmVudDEwIC0gMSksICcwJykgPDwgImUiIDw8IChsaW1pdHM6Om1pbl9leHBvbmVudDEwIC0gMSk7CisgICAgICBDUFBVTklUX0FTU0VSVCggIXN0ci5mYWlsKCkgKTsKKworICAgICAgc3RyID4+IGluX3ZhbF9kOworICAgICAgQ1BQVU5JVF9BU1NFUlQoICFzdHIuZmFpbCgpICk7CisgICAgICBDUFBVTklUX0FTU0VSVCggc3RyLmVvZigpICk7CisgICAgICBDUFBVTklUX0NIRUNLKCBpbl92YWxfZCA9PSAxICk7CisgICAgfQorIyAgaWYgZGVmaW5lZCAoX1NUTFBPUlRfVkVSU0lPTikgJiYgKF9TVExQT1JUX1ZFUlNJT04gPj0gMHg1MzApCisgICAgLy8gVGhlIGZvbGxvd2luZyB0ZXN0cyBhcmUgc2hvd2luZyB0aGF0IHNpbXBseSBjaGFuZ2luZyBzdHJlYW0KKyAgICAvLyBwcmVjaXNpb24gbGVhZCB0byBkaWZmZXJlbnQgcmVzdWx0LiBEbyBub3Qgc2VlbXMgdG8gYmUgYSByZWFsCisgICAgLy8gcHJvYmxlbSwgc2ltcGx5IHJvdW5kaW5nIGFwcHJveGltYXRpb24gYnV0IGFkZGl0aW9uYWwgc3R1ZHkgc2hvdWxkCisgICAgLy8gYmUgZG9uZSBhZnRlciA1LjIgcmVsZWFzZS4KKyAgICB7CisgICAgICBzdHJpbmdzdHJlYW0gc3RyOworICAgICAgc3RyIDw8IHNldHByZWNpc2lvbihsaW1pdHM6OmRpZ2l0czEwICsgMikgPDwgbGltaXRzOjptYXgoKTsKKworICAgICAgQ1BQVU5JVF9NRVNTQUdFKHN0ci5zdHIoKS5jX3N0cigpKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCAhc3RyLmZhaWwoKSApOworCisgICAgICBGIHZhbDsKKyAgICAgIHN0ciA+PiB2YWw7CisKKyAgICAgIENQUFVOSVRfQVNTRVJUKCAhc3RyLmZhaWwoKSApOworICAgICAgQ1BQVU5JVF9BU1NFUlQoIGxpbWl0czo6aW5maW5pdHkoKSA+IHZhbCApOworICAgIH0KKyAgICB7CisgICAgICBzdHJpbmdzdHJlYW0gc3RyOworICAgICAgc3RyIDw8IHNldHByZWNpc2lvbihsaW1pdHM6OmRpZ2l0czEwICsgMSkgPDwgbGltaXRzOjptYXgoKTsKKworICAgICAgQ1BQVU5JVF9NRVNTQUdFKHN0ci5zdHIoKS5jX3N0cigpKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCAhc3RyLmZhaWwoKSApOworCisgICAgICBGIHZhbDsKKyAgICAgIHN0ciA+PiB2YWw7CisKKyAgICAgIENQUFVOSVRfQVNTRVJUKCAhc3RyLmZhaWwoKSApOworICAgICAgQ1BQVU5JVF9BU1NFUlQoIGxpbWl0czo6aW5maW5pdHkoKSA+IHZhbCApOworICAgIH0KKyMgIGVuZGlmCisgIH0KKyNlbHNlCisjICBkZWZpbmUgX19jaGVja19nZXRfZmxvYXQoIEYgKSBcCisgIHZvaWQgY2hlY2tfZ2V0X2Zsb2F0KCBGIHYgKSBcCisgIHsgXAorICAgIEYgaW5fdmFsX2QgPSB2OyBcCisgICAgeyBcCisgICAgICBzdHJpbmdzdHJlYW0gc3RyOyBcCisgXAorICAgICAgc3RyIDw8ICIxRSsiIDw8IG51bWVyaWNfbGltaXRzPEY+OjptYXhfZXhwb25lbnQxMDsgXAorIFwKKyAgICAgIHN0ciA+PiBpbl92YWxfZDsgXAorICAgICAgQ1BQVU5JVF9BU1NFUlQoIXN0ci5mYWlsKCkpOyBcCisgICAgICBDUFBVTklUX0FTU0VSVChzdHIuZW9mKCkpOyBcCisgICAgICBDUFBVTklUX0NIRUNLKCBpbl92YWxfZCA9PSBpbl92YWxfZCApOyBcCisgICAgICBDUFBVTklUX0NIRUNLKCBpbl92YWxfZCAhPSBudW1lcmljX2xpbWl0czxGPjo6aW5maW5pdHkoKSApOyBcCisgICAgfSBcCisgICAgeyBcCisgICAgICBzdHJpbmdzdHJlYW0gc3RyOyBcCisgXAorICAgICAgc3RyIDw8ICItMUUrIiA8PCBudW1lcmljX2xpbWl0czxGPjo6bWF4X2V4cG9uZW50MTA7IFwKKyBcCisgICAgICBzdHIgPj4gaW5fdmFsX2Q7IFwKKyAgICAgIENQUFVOSVRfQVNTRVJUKCFzdHIuZmFpbCgpKTsgXAorICAgICAgQ1BQVU5JVF9BU1NFUlQoc3RyLmVvZigpKTsgXAorICAgICAgQ1BQVU5JVF9DSEVDSyggaW5fdmFsX2QgPT0gaW5fdmFsX2QgKTsgXAorICAgICAgQ1BQVU5JVF9DSEVDSyggaW5fdmFsX2QgIT0gLW51bWVyaWNfbGltaXRzPEY+OjppbmZpbml0eSgpICk7IFwKKyAgICB9IFwKKyAgICB7IFwKKyAgICAgIHN0cmluZ3N0cmVhbSBzdHI7IFwKKyBcCisgICAgICBzdHIgPDwgIjFFIiA8PCBudW1lcmljX2xpbWl0czxGPjo6bWluX2V4cG9uZW50MTA7IFwKKyBcCisgICAgICBzdHIgPj4gaW5fdmFsX2Q7IFwKKyAgICAgIENQUFVOSVRfQVNTRVJUKCFzdHIuZmFpbCgpKTsgXAorICAgICAgQ1BQVU5JVF9BU1NFUlQoc3RyLmVvZigpKTsgXAorICAgICAgQ1BQVU5JVF9DSEVDSyggaW5fdmFsX2QgPT0gaW5fdmFsX2QgKTsgXAorICAgICAgQ1BQVU5JVF9DSEVDSyggaW5fdmFsX2QgIT0gRigwLjApICk7IFwKKyAgICB9IFwKKyAgICB7IFwKKyAgICAgIHN0cmluZ3N0cmVhbSBzdHI7IFwKKyBcCisgICAgICBzdHIgPDwgIjFFKyIgPDwgKG51bWVyaWNfbGltaXRzPEY+OjptYXhfZXhwb25lbnQxMCArIDEpOyBcCisgXAorICAgICAgc3RyID4+IGluX3ZhbF9kOyBcCisgICAgICBDUFBVTklUX0FTU0VSVCghc3RyLmZhaWwoKSk7IFwKKyAgICAgIENQUFVOSVRfQVNTRVJUKHN0ci5lb2YoKSk7IFwKKyAgICAgIENQUFVOSVRfQ0hFQ0soIGluX3ZhbF9kID09IGluX3ZhbF9kICk7IFwKKyAgICAgIENQUFVOSVRfQ0hFQ0soIGluX3ZhbF9kID09IG51bWVyaWNfbGltaXRzPEY+OjppbmZpbml0eSgpICk7IFwKKyAgICB9IFwKKyAgICB7IFwKKyAgICAgIHN0cmluZ3N0cmVhbSBzdHI7IFwKKyBcCisgICAgICBzdHIgPDwgIi0xRSsiIDw8IChudW1lcmljX2xpbWl0czxGPjo6bWF4X2V4cG9uZW50MTAgKyAxKTsgXAorIFwKKyAgICAgIHN0ciA+PiBpbl92YWxfZDsgXAorICAgICAgQ1BQVU5JVF9BU1NFUlQoIXN0ci5mYWlsKCkpOyBcCisgICAgICBDUFBVTklUX0FTU0VSVChzdHIuZW9mKCkpOyBcCisgICAgICBDUFBVTklUX0NIRUNLKCBpbl92YWxfZCA9PSBpbl92YWxfZCApOyBcCisgICAgICBDUFBVTklUX0NIRUNLKCBpbl92YWxfZCA9PSAtbnVtZXJpY19saW1pdHM8Rj46OmluZmluaXR5KCkgKTsgXAorICAgIH0gXAorICAgIHsgXAorICAgICAgc3RyaW5nc3RyZWFtIHN0cjsgXAorIFwKKyAgICAgIHN0ciA8PCAiMUUiIDw8IChudW1lcmljX2xpbWl0czxGPjo6bWluX2V4cG9uZW50MTAgLSAxKTsgXAorIFwKKyAgICAgIHN0ciA+PiBpbl92YWxfZDsgXAorICAgICAgQ1BQVU5JVF9BU1NFUlQoIXN0ci5mYWlsKCkpOyBcCisgICAgICBDUFBVTklUX0FTU0VSVChzdHIuZW9mKCkpOyBcCisgICAgICBDUFBVTklUX0NIRUNLKCBpbl92YWxfZCA9PSBpbl92YWxfZCApOyBcCisgICAgICBDUFBVTklUX0NIRUNLKCBpbl92YWxfZCA+PSBGKDAuMCkgJiYgaW5fdmFsX2QgPD0gbnVtZXJpY19saW1pdHM8Rj46Om1pbigpICk7IFwKKyAgICB9IFwKKyAgfQorCisgIF9fY2hlY2tfZ2V0X2Zsb2F0KCBmbG9hdCApCisgIF9fY2hlY2tfZ2V0X2Zsb2F0KCBkb3VibGUgKQorIyAgaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8ICFkZWZpbmVkIChfU1RMUF9OT19MT05HX0RPVUJMRSkKKyAgX19jaGVja19nZXRfZmxvYXQoIGxvbmcgZG91YmxlICkKKyMgIGVuZGlmCisjICB1bmRlZiBfX2NoZWNrX2dldF9mbG9hdAorI2VuZGlmIC8vIF9TVExQX05PX01FTUJFUl9URU1QTEFURVMKK307CisKK0NQUFVOSVRfVEVTVF9TVUlURV9SRUdJU1RSQVRJT04oTnVtUHV0R2V0VGVzdCk7CisKKyNpZiBkZWZpbmVkIChfTVNDX1ZFUikKKyMgIHByYWdtYSB3YXJuaW5nIChkaXNhYmxlIDogNDA1NikKKyMgIHByYWdtYSB3YXJuaW5nIChkaXNhYmxlIDogNDc1NikKKyNlbmRpZgorCisvLworLy8gdGVzdHMgaW1wbGVtZW50YXRpb24KKy8vCit2b2lkIE51bVB1dEdldFRlc3Q6Om51bV9wdXRfZmxvYXQoKQoreworICB7CisgICAgc3RyaW5nIG91dHB1dCwgZGlnaXRzOworCisgICAgeworICAgICAgb3N0cmluZ3N0cmVhbSBvc3RyOworICAgICAgb3N0ciA8PCAxLjIzNDU3ZSsxN2Y7CisgICAgICBDUFBVTklUX0FTU0VSVChvc3RyLmdvb2QoKSk7CisgICAgICBvdXRwdXQgPSByZXNldF9zdHJlYW0ob3N0cik7CisgICAgICBkaWdpdHMgPSAiMTciOworICAgICAgY29tcGxldGVfZGlnaXRzKGRpZ2l0cyk7CisgICAgICBDUFBVTklUX0NIRUNLKG91dHB1dCA9PSBzdHJpbmcoIjEuMjM0NTdlKyIpICsgZGlnaXRzICk7CisgICAgfQorICAgIAorICAgIHsKKyAgICAgIG9zdHJpbmdzdHJlYW0gb3N0cjsKKyAgICAgIG9zdHIgPDwgc2V0cHJlY2lzaW9uKDIwMCkgPDwgMS4yMzQ1N2UrMTdmOworICAgICAgQ1BQVU5JVF9BU1NFUlQob3N0ci5nb29kKCkpOworICAgICAgb3V0cHV0ID0gcmVzZXRfc3RyZWFtKG9zdHIpOworICAgICAgQ1BQVU5JVF9DSEVDSyggb3V0cHV0LnNpemUoKSA8IDIwMCApOworICAgIH0KKyAgICAKKyAgICB7CisgICAgICBvc3RyaW5nc3RyZWFtIG9zdHI7CisgICAgICBvc3RyIDw8IHNldHByZWNpc2lvbigyMDApIDw8IG51bWVyaWNfbGltaXRzPGZsb2F0Pjo6bWluKCk7CisgICAgICBDUFBVTklUX0FTU0VSVChvc3RyLmdvb2QoKSk7CisgICAgICBvdXRwdXQgPSByZXNldF9zdHJlYW0ob3N0cik7CisgICAgICBDUFBVTklUX0NIRUNLKCBvdXRwdXQuc2l6ZSgpIDwgMjAwICk7CisgICAgfQorICAgIAorICAgIHsKKyAgICAgIG9zdHJpbmdzdHJlYW0gb3N0cjsKKyAgICAgIG9zdHIgPDwgZml4ZWQgPDwgMS4yMzQ1N2UrMTdmOworICAgICAgQ1BQVU5JVF9BU1NFUlQob3N0ci5nb29kKCkpOworICAgICAgb3V0cHV0ID0gcmVzZXRfc3RyZWFtKG9zdHIpOworICAgICAgQ1BQVU5JVF9DSEVDSyhvdXRwdXQuc2l6ZSgpID09IDI1KTsKKyAgICAgIENQUFVOSVRfQ0hFQ0sob3V0cHV0LnN1YnN0cigwLCA1KSA9PSAiMTIzNDUiKTsKKyAgICAgIENQUFVOSVRfQ0hFQ0sob3V0cHV0LnN1YnN0cigxOCkgPT0gIi4wMDAwMDAiKTsKKyAgICB9CisKKyAgICB7CisgICAgICBvc3RyaW5nc3RyZWFtIG9zdHI7CisgICAgICBvc3RyIDw8IGZpeGVkIDw8IHNob3dwb3MgPDwgMS4yMzQ1N2UrMTdmOworICAgICAgQ1BQVU5JVF9BU1NFUlQob3N0ci5nb29kKCkpOworICAgICAgb3V0cHV0ID0gcmVzZXRfc3RyZWFtKG9zdHIpOworICAgICAgQ1BQVU5JVF9DSEVDSyhvdXRwdXQuc2l6ZSgpID09IDI2KTsKKyAgICAgIENQUFVOSVRfQ0hFQ0sob3V0cHV0LnN1YnN0cigwLCA2KSA9PSAiKzEyMzQ1Iik7CisgICAgICBDUFBVTklUX0NIRUNLKG91dHB1dC5zdWJzdHIoMTkpID09ICIuMDAwMDAwIik7CisgICAgfQorCisgICAgeworICAgICAgb3N0cmluZ3N0cmVhbSBvc3RyOworICAgICAgb3N0ciA8PCBmaXhlZCA8PCBzaG93cG9zIDw8IHNldHByZWNpc2lvbigxMDApIDw8IDEuMjM0NTdlKzE3ZjsKKyAgICAgIENQUFVOSVRfQVNTRVJUKG9zdHIuZ29vZCgpKTsKKyAgICAgIG91dHB1dCA9IHJlc2V0X3N0cmVhbShvc3RyKTsKKyAgICAgIENQUFVOSVRfQ0hFQ0sob3V0cHV0LnNpemUoKSA9PSAxMjApOworICAgICAgQ1BQVU5JVF9DSEVDSyhvdXRwdXQuc3Vic3RyKDAsIDYpID09ICIrMTIzNDUiKTsKKyAgICAgIENQUFVOSVRfQ0hFQ0sob3V0cHV0LnN1YnN0cigxOSkgPT0gIi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiApOworICAgIH0KKworICAgIHsKKyAgICAgIG9zdHJpbmdzdHJlYW0gb3N0cjsKKyAgICAgIG9zdHIgPDwgc2NpZW50aWZpYyA8PCBzZXRwcmVjaXNpb24oOCkgPDwgMC4xMjM0NTY3OGY7CisgICAgICBDUFBVTklUX0FTU0VSVChvc3RyLmdvb2QoKSk7CisgICAgICBvdXRwdXQgPSByZXNldF9zdHJlYW0ob3N0cik7CisgICAgICBkaWdpdHMgPSAiMSI7CisgICAgICBjb21wbGV0ZV9kaWdpdHMoZGlnaXRzKTsKKyAgICAgIENQUFVOSVRfQ0hFQ0sob3V0cHV0ID09IHN0cmluZygiMS4yMzQ1Njc4MGUtIikgKyBkaWdpdHMgKTsKKyAgICB9CisKKyAgICB7CisgICAgICBvc3RyaW5nc3RyZWFtIG9zdHI7CisgICAgICBvc3RyIDw8IGZpeGVkIDw8IHNldHByZWNpc2lvbig4KSA8PCBzZXR3KDMwKSA8PCBzZXRmaWxsKCcwJykgPDwgMC4xMjM0NTY3OGY7CisgICAgICBDUFBVTklUX0FTU0VSVChvc3RyLmdvb2QoKSk7CisgICAgICBvdXRwdXQgPSByZXNldF9zdHJlYW0ob3N0cik7CisgICAgICBDUFBVTklUX0NIRUNLKG91dHB1dCA9PSAiMDAwMDAwMDAwMDAwMDAwMDAwMDAwLjEyMzQ1Njc4Iik7CisgICAgfQorCisgICAgeworICAgICAgb3N0cmluZ3N0cmVhbSBvc3RyOworICAgICAgb3N0ciA8PCBmaXhlZCA8PCBzaG93cG9zIDw8IHNldHByZWNpc2lvbig4KSA8PCBzZXR3KDMwKSA8PCBzZXRmaWxsKCcwJykgPDwgMC4xMjM0NTY3OGY7CisgICAgICBDUFBVTklUX0FTU0VSVChvc3RyLmdvb2QoKSk7CisgICAgICBvdXRwdXQgPSByZXNldF9zdHJlYW0ob3N0cik7CisgICAgICBDUFBVTklUX0NIRUNLKG91dHB1dCA9PSAiMDAwMDAwMDAwMDAwMDAwMDAwMCswLjEyMzQ1Njc4Iik7CisgICAgfQorCisgICAgeworICAgICAgb3N0cmluZ3N0cmVhbSBvc3RyOworICAgICAgb3N0ciA8PCBmaXhlZCA8PCBzaG93cG9zIDw8IHNldHByZWNpc2lvbig4KSA8PCBzZXR3KDMwKSA8PCBsZWZ0IDw8IHNldGZpbGwoJzAnKSA8PCAwLjEyMzQ1Njc4ZjsKKyAgICAgIENQUFVOSVRfQVNTRVJUKG9zdHIuZ29vZCgpKTsKKyAgICAgIG91dHB1dCA9IHJlc2V0X3N0cmVhbShvc3RyKTsKKyAgICAgIENQUFVOSVRfQ0hFQ0sob3V0cHV0ID09ICIrMC4xMjM0NTY3ODAwMDAwMDAwMDAwMDAwMDAwMDAiKTsKKyAgICB9CisKKyAgICB7CisgICAgICBvc3RyaW5nc3RyZWFtIG9zdHI7CisgICAgICBvc3RyIDw8IGZpeGVkIDw8IHNob3dwb3MgPDwgc2V0cHJlY2lzaW9uKDgpIDw8IHNldHcoMzApIDw8IGludGVybmFsIDw8IHNldGZpbGwoJzAnKSA8PCAwLjEyMzQ1Njc4ZjsKKyAgICAgIENQUFVOSVRfQVNTRVJUKG9zdHIuZ29vZCgpKTsKKyAgICAgIG91dHB1dCA9IHJlc2V0X3N0cmVhbShvc3RyKTsKKyAgICAgIENQUFVOSVRfQ0hFQ0sob3V0cHV0ID09ICIrMDAwMDAwMDAwMDAwMDAwMDAwMDAuMTIzNDU2NzgiKTsKKyAgICB9CisKKyAgICB7CisgICAgICBvc3RyaW5nc3RyZWFtIG9zdHI7CisgICAgICBvc3RyIDw8IGZpeGVkIDw8IHNob3dwb3MgPDwgc2V0cHJlY2lzaW9uKDEwMCkgPDwgMS4yMzQ1NjdlKzE3OworICAgICAgQ1BQVU5JVF9BU1NFUlQob3N0ci5nb29kKCkpOworICAgICAgb3V0cHV0ID0gcmVzZXRfc3RyZWFtKG9zdHIpOworICAgICAgQ1BQVU5JVF9DSEVDSyhvdXRwdXQuc2l6ZSgpID09IDEyMCk7CisgICAgICBDUFBVTklUX0NIRUNLKG91dHB1dC5zdWJzdHIoMCwgNikgPT0gIisxMjM0NSIpOworICAgICAgQ1BQVU5JVF9DSEVDSyhvdXRwdXQuc3Vic3RyKDE5KSA9PSAiLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiICk7CisgICAgfQorCisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8ICFkZWZpbmVkIChfU1RMUF9OT19MT05HX0RPVUJMRSkKKyAgICB7CisgICAgICBvc3RyaW5nc3RyZWFtIG9zdHI7CisgICAgICBvc3RyIDw8IGZpeGVkIDw8IHNob3dwb3MgPDwgc2V0cHJlY2lzaW9uKDEwMCkgPDwgMS4yMzQ1NjdlKzE3bDsKKyAgICAgIENQUFVOSVRfQVNTRVJUKG9zdHIuZ29vZCgpKTsKKyAgICAgIG91dHB1dCA9IHJlc2V0X3N0cmVhbShvc3RyKTsKKyAgICAgIENQUFVOSVRfQ0hFQ0sob3V0cHV0LnNpemUoKSA9PSAxMjApOworICAgICAgQ1BQVU5JVF9DSEVDSyhvdXRwdXQuc3Vic3RyKDAsIDYpID09ICIrMTIzNDUiKTsKKyAgICAgIENQUFVOSVRfQ0hFQ0sob3V0cHV0LnN1YnN0cigxOSkgPT0gIi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiApOworICAgIH0KKyNlbmRpZgorCisgICAgeworICAgICAgb3N0cmluZ3N0cmVhbSBvc3RyOworICAgICAgb3N0ciA8PCBzY2llbnRpZmljIDw8IHNldHByZWNpc2lvbig1MCkgPDwgMC4wOworICAgICAgQ1BQVU5JVF9BU1NFUlQob3N0ci5nb29kKCkpOworICAgICAgb3V0cHV0ID0gcmVzZXRfc3RyZWFtKG9zdHIpOworICAgICAgQ1BQVU5JVF9DSEVDSyggb3V0cHV0ID09ICIwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwZSswMCIgKTsKKyAgICB9CisgICAgeworICAgICAgb3N0cmluZ3N0cmVhbSBvc3RyOworICAgICAgb3N0ciA8PCBmaXhlZCA8PCBzZXRwcmVjaXNpb24oMTAwKSA8PCBudW1lcmljX2xpbWl0czxmbG9hdD46Om1heCgpOworICAgICAgQ1BQVU5JVF9BU1NFUlQob3N0ci5nb29kKCkpOworICAgICAgb3V0cHV0ID0gcmVzZXRfc3RyZWFtKG9zdHIpOworICAgICAgLy9DUFBVTklUX01FU1NBR0UoIG91dHB1dC5jX3N0cigpICk7CisgICAgfQorCisgICAgeworICAgICAgb3N0cmluZ3N0cmVhbSBvc3RyOworICAgICAgb3N0ciA8PCBzZXRwcmVjaXNpb24oMTAwKSA8PCBudW1lcmljX2xpbWl0czxkb3VibGU+OjptYXgoKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKG9zdHIuZ29vZCgpKTsKKyAgICAgIG91dHB1dCA9IHJlc2V0X3N0cmVhbShvc3RyKTsKKyAgICAgIC8vQ1BQVU5JVF9NRVNTQUdFKCBvdXRwdXQuY19zdHIoKSApOworICAgIH0KKworI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCAhZGVmaW5lZCAoX1NUTFBfTk9fTE9OR19ET1VCTEUpCisgICAgeworICAgICAgb3N0cmluZ3N0cmVhbSBvc3RyOworICAgICAgb3N0ciA8PCBzZXRwcmVjaXNpb24oMTAwKSA8PCBudW1lcmljX2xpbWl0czxsb25nIGRvdWJsZT46Om1heCgpOworICAgICAgQ1BQVU5JVF9BU1NFUlQob3N0ci5nb29kKCkpOworICAgICAgb3V0cHV0ID0gcmVzZXRfc3RyZWFtKG9zdHIpOworICAgICAgLy9DUFBVTklUX01FU1NBR0UoIG91dHB1dC5jX3N0cigpICk7CisgICAgfQorI2VuZGlmCisKKyAgICAvL3sKKyAgICAvLyAgb3N0cmluZ3N0cmVhbSBvc3RyOworICAgIC8vICBvc3RyIDw8IHNldHByZWNpc2lvbigtbnVtZXJpY19saW1pdHM8ZmxvYXQ+OjptaW5fZXhwb25lbnQxMCArIG51bWVyaWNfbGltaXRzPGZsb2F0Pjo6ZGlnaXRzMTAgKyA5KSA8PCBudW1lcmljX2xpbWl0czxmbG9hdD46Om1pbigpOworICAgIC8vICBDUFBVTklUX0FTU0VSVChvc3RyLmdvb2QoKSk7CisgICAgLy8gIG91dHB1dCA9IHJlc2V0X3N0cmVhbShvc3RyKTsKKyAgICAvLyAgLy9DUFBVTklUX01FU1NBR0UoIG91dHB1dC5jX3N0cigpICk7CisgICAgLy99CisKKyAgICAvL3sKKyAgICAvLyAgb3N0cmluZ3N0cmVhbSBvc3RyOworICAgIC8vICBvc3RyIDw8IHNldHByZWNpc2lvbigtbnVtZXJpY19saW1pdHM8ZG91YmxlPjo6bWluX2V4cG9uZW50MTAgKyBudW1lcmljX2xpbWl0czxkb3VibGU+OjpkaWdpdHMxMCkgPDwgbnVtZXJpY19saW1pdHM8ZG91YmxlPjo6bWluKCk7CisgICAgLy8gIENQUFVOSVRfQVNTRVJUKG9zdHIuZ29vZCgpKTsKKyAgICAvLyAgb3V0cHV0ID0gcmVzZXRfc3RyZWFtKG9zdHIpOworICAgIC8vICAvL0NQUFVOSVRfTUVTU0FHRSggb3V0cHV0LmNfc3RyKCkgKTsKKyAgICAvL30KKworLy8jaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8ICFkZWZpbmVkIChfU1RMUF9OT19MT05HX0RPVUJMRSkKKy8vICAgIHsKKy8vICAgICAgb3N0cmluZ3N0cmVhbSBvc3RyOworLy8gICAgICBvc3RyIDw8IHNldHByZWNpc2lvbigtbnVtZXJpY19saW1pdHM8bG9uZyBkb3VibGU+OjptaW5fZXhwb25lbnQxMCArIG51bWVyaWNfbGltaXRzPGxvbmcgZG91YmxlPjo6ZGlnaXRzMTApIDw8IG51bWVyaWNfbGltaXRzPGxvbmcgZG91YmxlPjo6bWluKCk7CisvLyAgICAgIENQUFVOSVRfQVNTRVJUKG9zdHIuZ29vZCgpKTsKKy8vICAgICAgb3V0cHV0ID0gcmVzZXRfc3RyZWFtKG9zdHIpOworLy8gICAgICBDUFBVTklUX01FU1NBR0UoIG91dHB1dC5jX3N0cigpICk7CisvLyAgICB9CisvLyNlbmRpZgorICB9CisKKyAgeworICAgIG9zdHJpbmdzdHJlYW0gc3RyOworCisgICAgc3RyLnNldGYoaW9zOjpmaXhlZCwgaW9zOjpmbG9hdGZpZWxkKTsKKyAgICBzdHIgPDwgMS4wZSs1OworICAgIC8vIGNlcnIgPDwgc3RyLnN0cigpIDw8IGVuZGw7CisgICAgQ1BQVU5JVF9DSEVDSyggc3RyLnN0cigpID09ICIxMDAwMDAuMDAwMDAwIiApOworCisgICAgcmVzZXRfc3RyZWFtKHN0cik7CisgICAgc3RyLnByZWNpc2lvbigwKTsKKyAgICBzdHIgPDwgMS4wZSs1OworICAgIENQUFVOSVRfQ0hFQ0soIHN0ci5zdHIoKSA9PSAiMTAwMDAwIiApOworCisgICAgcmVzZXRfc3RyZWFtKHN0cik7CisgICAgc3RyLnByZWNpc2lvbig0KTsKKyAgICBzdHIgPDwgMS4wZSs1OworICAgIENQUFVOSVRfQ0hFQ0soIHN0ci5zdHIoKSA9PSAiMTAwMDAwLjAwMDAiICk7CisKKyAgICByZXNldF9zdHJlYW0oc3RyKTsKKyAgICBzdHIucHJlY2lzaW9uKDApOworICAgIHN0ciA8PCAxLjBlKzgzOworICAgIENQUFVOSVRfQ0hFQ0soIHN0ci5zdHIoKS5zaXplKCkgPT0gODQgKTsKKyAgICAvL3ByaW50ZigiXG5DIHJlc3VsdDogJS4wZlxuIiwgMS4wZSs4Myk7CisgICAgLy9DUFBVTklUX01FU1NBR0UoIHN0ci5zdHIoKS5jX3N0cigpICk7CisgICAgLy9DUFBVTklUX0NIRUNLKCBzdHIuc3RyKCkgPT0gIjEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIgKTsKKworICAgIC8vIGNlcnIuc2V0Zihpb3M6OmZpeGVkLCBpb3M6OmZsb2F0ZmllbGQpOworICAgIC8vIGNlcnIgPDwgREJMX01BWCA8PCBlbmRsOworICAgIC8vIGNlcnIgPDwgMS4wZSszNyA8PCBlbmRsOworICB9Cit9CisKKyNkZWZpbmUgQ0hFQ0tfQ09NUExFVEUodHlwZSwgdmFsLCBiYXNlLCBzaG93YmFzZSwgc2hvd3BvcywgY2FzaW5nLCB3aWR0aCwgYWRqdXN0LCBleHBlY3RlZCkgXAoreyBcCisgIHR5cGUgdG1wID0gdmFsOyBcCisgIG9zdHJpbmdzdHJlYW0gb3N0cjsgXAorICBvc3RyIDw8IGJhc2UgPDwgc2hvd2Jhc2UgPDwgc2hvd3BvcyA8PCBjYXNpbmcgPDwgc2V0dyh3aWR0aCkgPDwgYWRqdXN0IDw8IHRtcDsgXAorICBDUFBVTklUX0NIRUNLKCBvc3RyLnN0cigpID09IGV4cGVjdGVkICk7IFwKK30KKworI2RlZmluZSBDSEVDSyh0eXBlLCB2YWwsIGJhc2UsIGV4cGVjdGVkKSBcCisgIENIRUNLX0NPTVBMRVRFKHR5cGUsIHZhbCwgYmFzZSwgbm9zaG93YmFzZSwgbm9zaG93cG9zLCBub3VwcGVyY2FzZSwgMCwgcmlnaHQsIGV4cGVjdGVkKQorCit2b2lkIE51bVB1dEdldFRlc3Q6Om51bV9wdXRfaW50ZWdlcigpCit7CisgIC8vb2N0YWwgb3V0cHV0cworICB7CisgICAgQ0hFQ0soc2hvcnQsIDAsIG9jdCwgIjAiKQorICAgIENIRUNLKHNob3J0LCAxLCBvY3QsICIxIikKKyAgICBDSEVDSyhzaG9ydCwgMTIzNDUsIG9jdCwgIjMwMDcxIikKKyAgICBpZiAoc2l6ZW9mKHNob3J0KSA9PSAyKSB7CisgICAgICBDSEVDSyhzaG9ydCwgLTEsIG9jdCwgIjE3Nzc3NyIpCisgICAgICBDSEVDSyhzaG9ydCwgLTEyMzQ1LCBvY3QsICIxNDc3MDciKQorICAgIH0KKworICAgIENIRUNLKHVuc2lnbmVkIHNob3J0LCAwLCBvY3QsICIwIikKKyAgICBDSEVDSyh1bnNpZ25lZCBzaG9ydCwgMTIzNDUsIG9jdCwgIjMwMDcxIikKKworICAgIENIRUNLKGludCwgMCwgb2N0LCAiMCIpCisgICAgQ0hFQ0soaW50LCAxMjM0NTY3OCwgb2N0LCAiNTcwNjA1MTYiKQorICAgIGlmIChzaXplb2YoaW50KSA9PSA0KSB7CisgICAgICBDSEVDSyhpbnQsIC0xLCBvY3QsICIzNzc3Nzc3Nzc3NyIpCisgICAgICBDSEVDSyhpbnQsIC0xMjM0NTY3OCwgb2N0LCAiMzc3MjA3MTcyNjIiKQorICAgIH0KKworICAgIENIRUNLKHVuc2lnbmVkIGludCwgMCwgb2N0LCAiMCIpCisgICAgQ0hFQ0sodW5zaWduZWQgaW50LCAxMjM0NTY3OCwgb2N0LCAiNTcwNjA1MTYiKQorCisgICAgQ0hFQ0sobG9uZywgMCwgb2N0LCAiMCIpCisgICAgQ0hFQ0sobG9uZywgMTIzNDU2NzgsIG9jdCwgIjU3MDYwNTE2IikKKyAgICBpZiAoc2l6ZW9mKGxvbmcpID09IDQpIHsKKyAgICAgIENIRUNLKGxvbmcsIC0xLCBvY3QsICIzNzc3Nzc3Nzc3NyIpCisgICAgICBDSEVDSyhsb25nLCAtMTIzNDU2NzgsIG9jdCwgIjM3NzIwNzE3MjYyIikKKyAgICB9CisKKyAgICBDSEVDSyh1bnNpZ25lZCBsb25nLCAwLCBvY3QsICIwIikKKyAgICBDSEVDSyh1bnNpZ25lZCBsb25nLCAxMjM0NTY3OCwgb2N0LCAiNTcwNjA1MTYiKQorCisjaWYgZGVmaW5lZCAoU1RMUE9SVCkgJiYgZGVmaW5lZCAoX1NUTFBfTE9OR19MT05HKQorICAgIENIRUNLKF9TVExQX0xPTkdfTE9ORywgMCwgb2N0LCAiMCIpCisgICAgQ0hFQ0soX1NUTFBfTE9OR19MT05HLCAxMjM0NTY3OCwgb2N0LCAiNTcwNjA1MTYiKQorICAgIGlmIChzaXplb2YoX1NUTFBfTE9OR19MT05HKSA9PSA4KSB7CisgICAgICBDSEVDSyhfU1RMUF9MT05HX0xPTkcsIC0xLCBvY3QsICIxNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3IikKKyAgICAgIENIRUNLKF9TVExQX0xPTkdfTE9ORywgLTEyMzQ1Njc4LCBvY3QsICIxNzc3Nzc3Nzc3Nzc3NzIwNzE3MjYyIikKKyAgICB9CisKKyAgICBDSEVDSyh1bnNpZ25lZCBfU1RMUF9MT05HX0xPTkcsIDAsIG9jdCwgIjAiKQorICAgIENIRUNLKHVuc2lnbmVkIF9TVExQX0xPTkdfTE9ORywgMTIzNDU2NzgsIG9jdCwgIjU3MDYwNTE2IikKKyNlbmRpZgorCisgICAgLy9FdmVuIHdpdGggc2hvd2Jhc2UsIDAgdmFsdWUgZ2l2ZXMgIjAiIChzZWUgcHJpbnRmIGRvY3VtZW50YXRpb24pCisgICAgQ0hFQ0tfQ09NUExFVEUoc2hvcnQsIDAsIG9jdCwgc2hvd2Jhc2UsIG5vc2hvd3Bvcywgbm91cHBlcmNhc2UsIDAsIHJpZ2h0LCAiMCIpCisgICAgQ0hFQ0tfQ09NUExFVEUoc2hvcnQsIDAsIG9jdCwgc2hvd2Jhc2UsIHNob3dwb3MsIG5vdXBwZXJjYXNlLCA2LCByaWdodCwgIiAgICAgMCIpCisKKyAgICBDSEVDS19DT01QTEVURShzaG9ydCwgMSwgb2N0LCBzaG93YmFzZSwgbm9zaG93cG9zLCBub3VwcGVyY2FzZSwgNiwgcmlnaHQsICIgICAgMDEiKQorICAgIENIRUNLX0NPTVBMRVRFKHNob3J0LCAxLCBvY3QsIHNob3diYXNlLCBub3Nob3dwb3MsIG5vdXBwZXJjYXNlLCA2LCBsZWZ0LCAiMDEgICAgIikKKyAgICBDSEVDS19DT01QTEVURShzaG9ydCwgMSwgb2N0LCBzaG93YmFzZSwgc2hvd3Bvcywgbm91cHBlcmNhc2UsIDYsIGludGVybmFsLCAiICAgIDAxIikKKyAgfQorCisgIC8vZGVjaW1hbCBvdXRwdXRzCisgIHsKKyAgICBDSEVDSyhzaG9ydCwgMCwgZGVjLCAiMCIpCisgICAgQ0hFQ0soc2hvcnQsIC0xLCBkZWMsICItMSIpCisgICAgQ0hFQ0soc2hvcnQsIDEyMzQ1LCBkZWMsICIxMjM0NSIpCisgICAgQ0hFQ0soc2hvcnQsIC0xMjM0NSwgZGVjLCAiLTEyMzQ1IikKKworICAgIENIRUNLKHVuc2lnbmVkIHNob3J0LCAwLCBkZWMsICIwIikKKyAgICBDSEVDSyh1bnNpZ25lZCBzaG9ydCwgMTIzNDUsIGRlYywgIjEyMzQ1IikKKworICAgIENIRUNLKGludCwgMCwgZGVjLCAiMCIpCisgICAgQ0hFQ0soaW50LCAtMSwgZGVjLCAiLTEiKQorICAgIENIRUNLKGludCwgMTIzNDU2NzgsIGRlYywgIjEyMzQ1Njc4IikKKyAgICBDSEVDSyhpbnQsIC0xMjM0NTY3OCwgZGVjLCAiLTEyMzQ1Njc4IikKKworICAgIENIRUNLKHVuc2lnbmVkIGludCwgMCwgZGVjLCAiMCIpCisgICAgQ0hFQ0sodW5zaWduZWQgaW50LCAxMjM0NTY3OCwgZGVjLCAiMTIzNDU2NzgiKQorCisgICAgQ0hFQ0sobG9uZywgMCwgZGVjLCAiMCIpCisgICAgQ0hFQ0sobG9uZywgLTEsIGRlYywgIi0xIikKKyAgICBDSEVDSyhsb25nLCAxMjM0NTY3OCwgZGVjLCAiMTIzNDU2NzgiKQorICAgIENIRUNLKGxvbmcsIC0xMjM0NTY3OCwgZGVjLCAiLTEyMzQ1Njc4IikKKworICAgIENIRUNLKHVuc2lnbmVkIGxvbmcsIDAsIGRlYywgIjAiKQorICAgIENIRUNLKHVuc2lnbmVkIGxvbmcsIDEyMzQ1Njc4LCBkZWMsICIxMjM0NTY3OCIpCisjaWYgZGVmaW5lZCAoU1RMUE9SVCkgJiYgZGVmaW5lZCAoX1NUTFBfTE9OR19MT05HKQorICAgIENIRUNLKF9TVExQX0xPTkdfTE9ORywgMCwgZGVjLCAiMCIpCisgICAgQ0hFQ0soX1NUTFBfTE9OR19MT05HLCAtMSwgZGVjLCAiLTEiKQorICAgIENIRUNLKF9TVExQX0xPTkdfTE9ORywgMTIzNDU2NzgsIGRlYywgIjEyMzQ1Njc4IikKKyAgICBDSEVDSyhfU1RMUF9MT05HX0xPTkcsIC0xMjM0NTY3OCwgZGVjLCAiLTEyMzQ1Njc4IikKKworICAgIENIRUNLKHVuc2lnbmVkIF9TVExQX0xPTkdfTE9ORywgMCwgZGVjLCAiMCIpCisgICAgQ0hFQ0sodW5zaWduZWQgX1NUTFBfTE9OR19MT05HLCAxMjM0NTY3OCwgZGVjLCAiMTIzNDU2NzgiKQorI2VuZGlmCisKKyAgICBDSEVDS19DT01QTEVURShzaG9ydCwgMCwgZGVjLCBzaG93YmFzZSwgc2hvd3Bvcywgbm91cHBlcmNhc2UsIDAsIHJpZ2h0LCAiKzAiKQorICAgIENIRUNLX0NPTVBMRVRFKHNob3J0LCAwLCBkZWMsIHNob3diYXNlLCBzaG93cG9zLCBub3VwcGVyY2FzZSwgNiwgcmlnaHQsICIgICAgKzAiKQorICAgIENIRUNLX0NPTVBMRVRFKHNob3J0LCAxLCBkZWMsIHNob3diYXNlLCBzaG93cG9zLCBub3VwcGVyY2FzZSwgNiwgcmlnaHQsICIgICAgKzEiKQorICAgIENIRUNLX0NPTVBMRVRFKHNob3J0LCAxLCBkZWMsIHNob3diYXNlLCBzaG93cG9zLCBub3VwcGVyY2FzZSwgNiwgbGVmdCwgIisxICAgICIpCisgICAgQ0hFQ0tfQ09NUExFVEUoc2hvcnQsIDEsIGRlYywgc2hvd2Jhc2UsIHNob3dwb3MsIG5vdXBwZXJjYXNlLCA2LCBpbnRlcm5hbCwgIisgICAgMSIpCisgIH0KKworICAvL2hleGFkZWNpbWFsIG91dHB1dHMKKyAgeworICAgIENIRUNLKHNob3J0LCAwLCBoZXgsICIwIikKKyAgICBDSEVDSyhzaG9ydCwgMTIzNDUsIGhleCwgIjMwMzkiKQorICAgIGlmIChzaXplb2Yoc2hvcnQpID09IDIpIHsKKyAgICAgIENIRUNLKHNob3J0LCAtMSwgaGV4LCAiZmZmZiIpCisgICAgICBDSEVDSyhzaG9ydCwgLTEyMzQ1LCBoZXgsICJjZmM3IikKKyAgICB9CisKKyAgICBDSEVDSyh1bnNpZ25lZCBzaG9ydCwgMCwgaGV4LCAiMCIpCisgICAgQ0hFQ0sodW5zaWduZWQgc2hvcnQsIDEyMzQ1LCBoZXgsICIzMDM5IikKKworICAgIENIRUNLKGludCwgMCwgaGV4LCAiMCIpCisgICAgQ0hFQ0soaW50LCAxMjM0NTY3OCwgaGV4LCAiYmM2MTRlIikKKyAgICBpZiAoc2l6ZW9mKGludCkgPT0gNCkgeworICAgICAgQ0hFQ0soaW50LCAtMSwgaGV4LCAiZmZmZmZmZmYiKQorICAgICAgQ0hFQ0soaW50LCAtMTIzNDU2NzgsIGhleCwgImZmNDM5ZWIyIikKKyAgICB9CisKKyAgICBDSEVDSyh1bnNpZ25lZCBpbnQsIDAsIGhleCwgIjAiKQorICAgIENIRUNLKHVuc2lnbmVkIGludCwgMTIzNDU2NzgsIGhleCwgImJjNjE0ZSIpCisKKyAgICBDSEVDSyhsb25nLCAwLCBoZXgsICIwIikKKyAgICBDSEVDSyhsb25nLCAxMjM0NTY3OCwgaGV4LCAiYmM2MTRlIikKKyAgICBpZiAoc2l6ZW9mKGxvbmcpID09IDQpIHsKKyAgICAgIENIRUNLKGxvbmcsIC0xLCBoZXgsICJmZmZmZmZmZiIpCisgICAgICBDSEVDSyhsb25nLCAtMTIzNDU2NzgsIGhleCwgImZmNDM5ZWIyIikKKyAgICB9CisKKyAgICBDSEVDSyh1bnNpZ25lZCBsb25nLCAwLCBoZXgsICIwIikKKyAgICBDSEVDSyh1bnNpZ25lZCBsb25nLCAxMjM0NTY3OCwgaGV4LCAiYmM2MTRlIikKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiBkZWZpbmVkIChfU1RMUF9MT05HX0xPTkcpCisgICAgQ0hFQ0soX1NUTFBfTE9OR19MT05HLCAwLCBoZXgsICIwIikKKyAgICBDSEVDSyhfU1RMUF9MT05HX0xPTkcsIDEyMzQ1Njc4LCBoZXgsICJiYzYxNGUiKQorICAgIGlmIChzaXplb2YoX1NUTFBfTE9OR19MT05HKSA9PSA4KSB7CisgICAgICBDSEVDSyhfU1RMUF9MT05HX0xPTkcsIC0xLCBoZXgsICJmZmZmZmZmZmZmZmZmZmZmIikKKyAgICAgIENIRUNLKF9TVExQX0xPTkdfTE9ORywgLTEyMzQ1Njc4LCBoZXgsICJmZmZmZmZmZmZmNDM5ZWIyIikKKyAgICB9CisKKyAgICBDSEVDSyh1bnNpZ25lZCBfU1RMUF9MT05HX0xPTkcsIDAsIGhleCwgIjAiKQorICAgIENIRUNLKHVuc2lnbmVkIF9TVExQX0xPTkdfTE9ORywgMTIzNDU2NzgsIGhleCwgImJjNjE0ZSIpCisjZW5kaWYKKworICAgIC8vRXZlbiB3aXRoIHNob3diYXNlLCAwIHZhbHVlIGdpdmVzICIwIiBvdXRwdXQgKHNlZSBwcmludGYgZG9jdW1lbnRhdGlvbikKKyAgICBDSEVDS19DT01QTEVURShzaG9ydCwgMCwgaGV4LCBzaG93YmFzZSwgc2hvd3Bvcywgbm91cHBlcmNhc2UsIDAsIHJpZ2h0LCAiMCIpCisgICAgQ0hFQ0tfQ09NUExFVEUoc2hvcnQsIDAsIGhleCwgc2hvd2Jhc2UsIG5vc2hvd3Bvcywgbm91cHBlcmNhc2UsIDYsIHJpZ2h0LCAiICAgICAwIikKKyAgICBDSEVDS19DT01QTEVURShzaG9ydCwgMCwgaGV4LCBzaG93YmFzZSwgbm9zaG93cG9zLCBub3VwcGVyY2FzZSwgNiwgaW50ZXJuYWwsICIgICAgIDAiKQorCisgICAgQ0hFQ0tfQ09NUExFVEUoc2hvcnQsIDEsIGhleCwgc2hvd2Jhc2UsIG5vc2hvd3Bvcywgbm91cHBlcmNhc2UsIDYsIHJpZ2h0LCAiICAgMHgxIikKKyAgICBDSEVDS19DT01QTEVURShzaG9ydCwgMSwgaGV4LCBzaG93YmFzZSwgbm9zaG93cG9zLCBub3VwcGVyY2FzZSwgNiwgbGVmdCwgIjB4MSAgICIpCisgICAgQ0hFQ0tfQ09NUExFVEUoc2hvcnQsIDEsIGhleCwgc2hvd2Jhc2UsIG5vc2hvd3Bvcywgbm91cHBlcmNhc2UsIDYsIGludGVybmFsLCAiMHggICAxIikKKyAgICBDSEVDS19DT01QTEVURShzaG9ydCwgMSwgaGV4LCBzaG93YmFzZSwgbm9zaG93cG9zLCB1cHBlcmNhc2UsIDYsIGxlZnQsICIwWDEgICAiKQorICAgIENIRUNLX0NPTVBMRVRFKHNob3J0LCAxLCBoZXgsIHNob3diYXNlLCBzaG93cG9zLCB1cHBlcmNhc2UsIDYsIGludGVybmFsLCAiMFggICAxIikKKyAgfQorfQorCit2b2lkIE51bVB1dEdldFRlc3Q6Om51bV9nZXRfZmxvYXQoKQoreworICBmbG9hdCBpbl92YWw7CisKKyAgaXN0cmluZ3N0cmVhbSBpc3RyOworCisgIGlzdHIuc3RyKCIxLjIzNDUiKTsKKyAgaXN0ciA+PiBpbl92YWw7CisgIENQUFVOSVRfQVNTRVJUKCFpc3RyLmZhaWwoKSk7CisgIENQUFVOSVRfQVNTRVJUKGlzdHIuZW9mKCkpOworICBDUFBVTklUX0FTU0VSVChjaGVja19mbG9hdChpbl92YWwsIDEuMjM0NWYpKTsKKyAgaXN0ci5jbGVhcigpOworCisgIGlzdHIuc3RyKCItMS4yMzQ1Iik7CisgIGlzdHIgPj4gaW5fdmFsOworICBDUFBVTklUX0FTU0VSVCghaXN0ci5mYWlsKCkpOworICBDUFBVTklUX0FTU0VSVChpc3RyLmVvZigpKTsKKyAgQ1BQVU5JVF9BU1NFUlQoY2hlY2tfZmxvYXQoaW5fdmFsLCAtMS4yMzQ1ZikpOworICBpc3RyLmNsZWFyKCk7CisKKyAgaXN0ci5zdHIoIisxLjIzNDUiKTsKKyAgaXN0ciA+PiBpbl92YWw7CisgIENQUFVOSVRfQVNTRVJUKCFpc3RyLmZhaWwoKSk7CisgIENQUFVOSVRfQVNTRVJUKGNoZWNrX2Zsb2F0KGluX3ZhbCwgMS4yMzQ1ZikpOworICBpc3RyLmNsZWFyKCk7CisKKyAgaXN0ci5zdHIoIjAwMDAwMDAwMDAwMDAwMS4yMzQ1MDAwMDAwMDAiKTsKKyAgaXN0ciA+PiBpbl92YWw7CisgIENQUFVOSVRfQVNTRVJUKCFpc3RyLmZhaWwoKSk7CisgIENQUFVOSVRfQVNTRVJUKGlzdHIuZW9mKCkpOworICBDUFBVTklUX0FTU0VSVChjaGVja19mbG9hdChpbl92YWwsIDEuMjM0NWYpKTsKKyAgaXN0ci5jbGVhcigpOworCisgIGlzdHIuc3RyKCIxLjIzNDVlKzA0Iik7CisgIGlzdHIgPj4gaW5fdmFsOworICBDUFBVTklUX0FTU0VSVCghaXN0ci5mYWlsKCkpOworICBDUFBVTklUX0FTU0VSVChpc3RyLmVvZigpKTsKKyAgQ1BQVU5JVF9BU1NFUlQoY2hlY2tfZmxvYXQoaW5fdmFsLCAxMjM0NS4wZikpOworICBpc3RyLmNsZWFyKCk7CisKKyAgQ1BQVU5JVF9NRVNTQUdFKCAiZmxvYXQiICk7CisgIGNoZWNrX2dldF9mbG9hdCggMC4wRiApOworICBDUFBVTklUX01FU1NBR0UoICJkb3VibGUiICk7CisgIGNoZWNrX2dldF9mbG9hdCggMC4wICk7CisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8ICFkZWZpbmVkIChfU1RMUF9OT19MT05HX0RPVUJMRSkKKyAgQ1BQVU5JVF9NRVNTQUdFKCAibG9uZyBkb3VibGUiICk7CisgIGNoZWNrX2dldF9mbG9hdCggMC4wTCApOworI2VuZGlmCisgIHsKKyAgICBzdHJpbmdzdHJlYW0gc3RyOworCisgICAgc3RyIDw8ICIxZSIgPDwgbnVtZXJpY19saW1pdHM8ZG91YmxlPjo6bWF4X2V4cG9uZW50MTA7CisgICAgQ1BQVU5JVF9BU1NFUlQoIXN0ci5mYWlsKCkpOworCisgICAgZmxvYXQgdmFsOworICAgIHN0ciA+PiB2YWw7CisgICAgQ1BQVU5JVF9BU1NFUlQoIXN0ci5mYWlsKCkpOworICAgIENQUFVOSVRfQVNTRVJUKHN0ci5lb2YoKSk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIG51bWVyaWNfbGltaXRzPGRvdWJsZT46Om1heF9leHBvbmVudDEwIDw9IG51bWVyaWNfbGltaXRzPGZsb2F0Pjo6bWF4X2V4cG9uZW50MTAgfHwKKyAgICAgICAgICAgICAgICAgICAgdmFsID09IG51bWVyaWNfbGltaXRzPGZsb2F0Pjo6aW5maW5pdHkoKSApOworICB9CisgIHsKKyAgICBzdHJpbmdzdHJlYW0gc3RyOworCisgICAgc3RyIDw8ICIxZSIgPDwgbnVtZXJpY19saW1pdHM8ZG91YmxlPjo6bWluX2V4cG9uZW50MTA7CisgICAgQ1BQVU5JVF9BU1NFUlQoIXN0ci5mYWlsKCkpOworCisgICAgZmxvYXQgdmFsOworICAgIHN0ciA+PiB2YWw7CisgICAgQ1BQVU5JVF9BU1NFUlQoIXN0ci5mYWlsKCkpOworICAgIENQUFVOSVRfQVNTRVJUKHN0ci5lb2YoKSk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIG51bWVyaWNfbGltaXRzPGRvdWJsZT46Om1pbl9leHBvbmVudDEwID49IG51bWVyaWNfbGltaXRzPGZsb2F0Pjo6bWluX2V4cG9uZW50MTAgfHwKKyAgICAgICAgICAgICAgICAgICAgdmFsID09IDAuMGYgKTsKKyAgfQorI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCAhZGVmaW5lZCAoX1NUTFBfTk9fTE9OR19ET1VCTEUpCisgIHsKKyAgICBzdHJpbmdzdHJlYW0gc3RyOworCisgICAgc3RyIDw8ICIxZSIgPDwgbnVtZXJpY19saW1pdHM8bG9uZyBkb3VibGU+OjptYXhfZXhwb25lbnQxMDsKKyAgICBDUFBVTklUX0FTU0VSVCghc3RyLmZhaWwoKSk7CisKKyAgICBkb3VibGUgdmFsOworICAgIHN0ciA+PiB2YWw7CisgICAgQ1BQVU5JVF9BU1NFUlQoIXN0ci5mYWlsKCkpOworICAgIENQUFVOSVRfQVNTRVJUKHN0ci5lb2YoKSk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIG51bWVyaWNfbGltaXRzPGxvbmcgZG91YmxlPjo6bWF4X2V4cG9uZW50MTAgPD0gbnVtZXJpY19saW1pdHM8ZG91YmxlPjo6bWF4X2V4cG9uZW50MTAgfHwKKyAgICAgICAgICAgICAgICAgICAgdmFsID09IG51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCkgKTsKKyAgfQorICB7CisgICAgc3RyaW5nc3RyZWFtIHN0cjsKKworICAgIHN0ciA8PCAiMWUiIDw8IG51bWVyaWNfbGltaXRzPGxvbmcgZG91YmxlPjo6bWluX2V4cG9uZW50MTA7CisgICAgQ1BQVU5JVF9BU1NFUlQoIXN0ci5mYWlsKCkpOworCisgICAgZG91YmxlIHZhbDsKKyAgICBzdHIgPj4gdmFsOworICAgIENQUFVOSVRfQVNTRVJUKCFzdHIuZmFpbCgpKTsKKyAgICBDUFBVTklUX0FTU0VSVChzdHIuZW9mKCkpOworICAgIENQUFVOSVRfQVNTRVJUKCBudW1lcmljX2xpbWl0czxsb25nIGRvdWJsZT46Om1pbl9leHBvbmVudDEwID49IG51bWVyaWNfbGltaXRzPGRvdWJsZT46Om1pbl9leHBvbmVudDEwIHx8CisgICAgICAgICAgICAgICAgICAgIHZhbCA9PSAwLjAgKTsKKyAgfQorICB7CisgICAgY29uc3QgY2hhciogcCA9ICIyLjcxODI4MTgyODQ1OTA0NTIzNTM2MDI4NzQ3MTM1MjY2MjQ5Nzc1NzI0NzA5M2UwIjsKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzOworICAgIHMgPDwgcDsKKyAgICBsb25nIGRvdWJsZSB4OworICAgIHMgPj4geDsKKyAgICBDUFBVTklUX0FTU0VSVCggeCA+IDIuNzBsICYmIHggPCAyLjcybCApOworICB9CisjZW5kaWYKK30KKwordm9pZCBOdW1QdXRHZXRUZXN0OjpudW1fZ2V0X2ludGVnZXIoKQoreworICAvL29jdGFsIGlucHV0CisgIHsKKyAgICBpc3RyaW5nc3RyZWFtIGlzdHI7CisgICAgaXN0ci5zdHIoIjMwMDcxIik7CisgICAgc2hvcnQgdmFsOworICAgIGlzdHIgPj4gb2N0ID4+IHZhbDsKKyAgICBDUFBVTklUX0FTU0VSVCggIWlzdHIuZmFpbCgpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGlzdHIuZW9mKCkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggdmFsID09IDEyMzQ1ICk7CisgICAgaXN0ci5jbGVhcigpOworCisgICAgaWYgKHNpemVvZihzaG9ydCkgPT0gMikgeworICAgICAgaXN0ci5zdHIoIjE3Nzc3NyIpOworICAgICAgaXN0ciA+PiBvY3QgPj4gdmFsOworICAgICAgQ1BQVU5JVF9BU1NFUlQoICFpc3RyLmZhaWwoKSApOworICAgICAgQ1BQVU5JVF9BU1NFUlQoIGlzdHIuZW9mKCkgKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCB2YWwgPT0gLTEgKTsKKyAgICAgIGlzdHIuY2xlYXIoKTsKKyAgICB9CisgIH0KKworICAvL2RlY2ltYWwgaW5wdXQKKyAgeworICAgIGlzdHJpbmdzdHJlYW0gaXN0cjsKKyAgICBpc3RyLnN0cigiMTAwMDAiKTsKKyAgICBzaG9ydCB2YWwgPSAtMTsKKyAgICBpc3RyID4+IHZhbDsKKyAgICBDUFBVTklUX0FTU0VSVCggIWlzdHIuZmFpbCgpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGlzdHIuZW9mKCkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggdmFsID09IDEwMDAwICk7CisgICAgaXN0ci5jbGVhcigpOworCisgICAgaXN0ci5zdHIoIisxMDAwMCIpOworICAgIHZhbCA9IC0xOworICAgIGlzdHIgPj4gdmFsOworICAgIENQUFVOSVRfQVNTRVJUKCAhaXN0ci5mYWlsKCkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggaXN0ci5lb2YoKSApOworICAgIENQUFVOSVRfQVNTRVJUKCB2YWwgPT0gMTAwMDAgKTsKKyAgICBpc3RyLmNsZWFyKCk7CisKKyAgICBpZiAoc2l6ZW9mKHNob3J0KSA9PSAyKSB7CisgICAgICB2YWwgPSAtMTsKKyAgICAgIGlzdHIuc3RyKCIxMDAwMDAwMCIpOworICAgICAgaXN0ciA+PiB2YWw7CisgICAgICBDUFBVTklUX0FTU0VSVCggaXN0ci5mYWlsKCkgKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBpc3RyLmVvZigpICk7CisgICAgICBDUFBVTklUX0FTU0VSVCggdmFsID09IC0xICk7CisgICAgICBpc3RyLmNsZWFyKCk7CisgICAgfQorCisgICAgdmFsID0gLTE7CisgICAgaXN0ci5zdHIoIjB4MCIpOworICAgIGlzdHIgPj4gdmFsOworICAgIENQUFVOSVRfQVNTRVJUKCAhaXN0ci5mYWlsKCkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggIWlzdHIuZW9mKCkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggdmFsID09IDAgKTsKKyAgICBpc3RyLmNsZWFyKCk7CisKKyAgICB2YWwgPSAtMTsKKyAgICBpc3RyLnN0cigiMDAwMDAxIik7CisgICAgaXN0ciA+PiB2YWw7CisgICAgQ1BQVU5JVF9BU1NFUlQoICFpc3RyLmZhaWwoKSApOworICAgIENQUFVOSVRfQVNTRVJUKCBpc3RyLmVvZigpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHZhbCA9PSAxICk7CisgICAgaXN0ci5jbGVhcigpOworICB9CisKKyAgLy9oZXhhZGVjaW1hbCBpbnB1dAorICB7CisgICAgaXN0cmluZ3N0cmVhbSBpc3RyOworICAgIGlzdHIuc3RyKCIzMDM5Iik7CisgICAgc2hvcnQgdmFsID0gLTE7CisgICAgaXN0ciA+PiBoZXggPj4gdmFsOworICAgIENQUFVOSVRfQVNTRVJUKCAhaXN0ci5mYWlsKCkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggaXN0ci5lb2YoKSApOworICAgIENQUFVOSVRfQVNTRVJUKCB2YWwgPT0gMTIzNDUgKTsKKyAgICBpc3RyLmNsZWFyKCk7CisKKyAgICBpc3RyLnN0cigieDMwMzkiKTsKKyAgICB2YWwgPSAtMTsKKyAgICBpc3RyID4+IGhleCA+PiB2YWw7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGlzdHIuZmFpbCgpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoICFpc3RyLmVvZigpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHZhbCA9PSAtMSApOworICAgIGlzdHIuY2xlYXIoKTsKKworICAgIGlzdHIuc3RyKCIwMzAzOSIpOworICAgIHZhbCA9IC0xOworICAgIGlzdHIgPj4gaGV4ID4+IHZhbDsKKyAgICBDUFBVTklUX0FTU0VSVCggIWlzdHIuZmFpbCgpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGlzdHIuZW9mKCkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggdmFsID09IDEyMzQ1ICk7CisgICAgaXN0ci5jbGVhcigpOworCisgICAgaXN0ci5zdHIoIjB4MzAzOSIpOworICAgIGlzdHIgPj4gaGV4ID4+IHZhbDsKKyAgICBDUFBVTklUX0FTU0VSVCggIWlzdHIuZmFpbCgpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGlzdHIuZW9mKCkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggdmFsID09IDEyMzQ1ICk7CisgICAgaXN0ci5jbGVhcigpOworCisgICAgaWYgKHNpemVvZihzaG9ydCkgPT0gMikgeworICAgICAgdmFsID0gLTE7CisgICAgICBpc3RyLnN0cigiY2ZjNyIpOworICAgICAgaXN0ciA+PiBoZXggPj4gdmFsOworICAgICAgQ1BQVU5JVF9BU1NFUlQoICFpc3RyLmZhaWwoKSApOworICAgICAgQ1BQVU5JVF9BU1NFUlQoIGlzdHIuZW9mKCkgKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCB2YWwgPT0gLTEyMzQ1ICk7CisgICAgICBpc3RyLmNsZWFyKCk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgTnVtUHV0R2V0VGVzdDo6aW5oZXgoKQoreworICB7CisgICAgb3N0cmluZ3N0cmVhbSBzOworICAgIHMgPDwgaGV4IDw8IDA7CisgICAgQ1BQVU5JVF9DSEVDSyggcy5zdHIoKSA9PSAiMCIgKTsKKyAgfQorICB7CisgICAgb3N0cmluZ3N0cmVhbSBzOworICAgIHMgPDwgaGV4IDw8IDB4ZmY7CisgICAgQ1BQVU5JVF9DSEVDSyggcy5zdHIoKSA9PSAiZmYiICk7CisgIH0KKyAgeworICAgIG9zdHJpbmdzdHJlYW0gczsKKyAgICBzIDw8IGhleCA8PCBzZXR3KCA0ICkgPDwgMHhmZjsKKyAgICBDUFBVTklUX0NIRUNLKCBzLnN0cigpID09ICIgIGZmIiApOworICB9CisgIHsKKyAgICBvc3RyaW5nc3RyZWFtIHM7CisgICAgcyA8PCBoZXggPDwgc2V0dyggNCApIDw8IDA7CisgICAgQ1BQVU5JVF9DSEVDSyggcy5zdHIoKSA9PSAiICAgMCIgKTsKKyAgfQorICB7CisgICAgb3N0cmluZ3N0cmVhbSBzOworICAgIHMgPDwgaGV4IDw8IHNob3diYXNlIDw8IDA7CisgICAgQ1BQVU5JVF9DSEVDSyggcy5zdHIoKSA9PSAiMCIgKTsKKyAgfQorICB7CisgICAgb3N0cmluZ3N0cmVhbSBzOworICAgIHMgPDwgaGV4IDw8IHNob3diYXNlIDw8IDB4ZmY7CisgICAgQ1BQVU5JVF9DSEVDSyggcy5zdHIoKSA9PSAiMHhmZiIgKTsKKyAgfQorICB7CisgICAgb3N0cmluZ3N0cmVhbSBzOworICAgIHMgPDwgaGV4IDw8IHNob3diYXNlIDw8IHNldHcoIDQgKSA8PCAweGZmOworICAgIENQUFVOSVRfQ0hFQ0soIHMuc3RyKCkgPT0gIjB4ZmYiICk7CisgIH0KKyAgeyAvLyBzcGVjaWFsIGNhc2UgZm9yIHJlZ3Jlc3Npb24gKHBhcnRpYWxseSBkdXBsaWNhdGUgQ0hFQ0tfQ09NUExFVEUgYWJvdmUpOgorICAgIG9zdHJpbmdzdHJlYW0gczsKKyAgICBzLnNldGYoIGlvc19iYXNlOjppbnRlcm5hbCwgaW9zX2Jhc2U6OmFkanVzdGZpZWxkICk7CisgICAgcyA8PCBoZXggPDwgc2hvd2Jhc2UgPDwgc2V0dyg4KzIpIDw8IDA7CisgICAgQ1BQVU5JVF9DSEVDSyggcy5zdHIoKSA9PSAiICAgICAgICAgMCIgKTsKKyAgfQorfQorCit2b2lkIE51bVB1dEdldFRlc3Q6OnBvaW50ZXIoKQoreworICAvLyBQcm9ibGVtIHdpdGggcHJpbnRpbmcgcG9pbnRlciB0byBudWxsCisKKyAgLyoKKyAgICogUmVhbGx5IEMncyBmb3JtYXR0aW5nIG5vdCBoZWxwIGhlcmUsIGR1ZSB0bzoKKyAgICoKKyAgICogcCAgVGhlIGFyZ3VtZW50IHNoYWxsIGJlIGEgcG9pbnRlciB0byB2b2lkLiBUaGUgdmFsdWUgb2YKKyAgICogICAgdGhlIHBvaW50ZXIgaXMgY29udmVydGVkIHRvIGEgc2VxdWVuY2Ugb2YgcHJpbnRhYmxlIGNoYXJhY3RlcnMsCisgICAqICAgIGluIGFuIGltcGxlbWVudGF0aW9uLWRlZmluZWQgbWFubmVyLgorICAgKi8KKyAgeworICAgIC8qCisgICAgY2hhciBidWZbMTI4XTsKKyAgICB2b2lkICpwID0gKHZvaWQgKikweGZmMDA7CisgICAgc3ByaW50ZiggYnVmLCAiJXAiLCBwICk7CisgICAgLy8gY2VyciA8PCBidWYgPDwgZW5kbDsKKyAgICAvLyBIbW1tLCBJIHNlZSAweGZmMDAgb24gYm94IHdpdGggMzItYml0cyBhZGRyZXNzOyBwb2ludGVyIGxpa2UgJ3Vuc2lnbmVkIGhleCc/IAorICAgIGlmICggc2l6ZW9mKCBwICkgPT0gMiApIHsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBzdHJjbXAoIGJ1ZiwgIjB4ZmYwMCIgKSA9PSAwICk7CisgICAgfSBlbHNlIGlmICggc2l6ZW9mKCBwICkgPT0gNCApIHsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBzdHJjbXAoIGJ1ZiwgIjB4MDAwMGZmMDAiICkgPT0gMCApOworICAgIH0gZWxzZSBpZiAoIHNpemVvZiggcCApID09IDggKSB7CisgICAgICBDUFBVTklUX0FTU0VSVCggc3RyY21wKCBidWYsICIweDAwMDAwMDAwMDAwMGZmMDAiICkgPT0gMCApOworICAgIH0gZWxzZSB7CisgICAgICBDUFBVTklUX0NIRUNLKCBzaXplb2YoIHAgKSA9PSAyIHx8IHNpemVvZiggcCApID09IDQgfHwgc2l6ZW9mKCBwICkgPT0gOCApOworICAgIH0KKyAgICAqLworICB9CisgIHsKKyAgICAvKgorICAgIGNoYXIgYnVmWzEyOF07CisgICAgdm9pZCAqcCA9IDA7CisgICAgKi8KKyAgICAvLyBzcHJpbnRmKCBidWYsICIlcCIsIHAgKTsKKyAgICAvKiBDb29sLiAiJXAiIHByaW50ICcobmlsKSc7ICIlI3giIHByaW50ICcwJyAqLworICAgIC8vIHNwcmludGYoIGJ1ZiwgIiUjeCIsICh1bnNpZ25lZClwICk7CisgICAgLy8gY2VyciA8PCBidWYgPDwgZW5kbDsKKyAgfQorICB7CisgICAgb3N0cmluZ3N0cmVhbSBzOworICAgIHZvaWQgKnAgPSAodm9pZCAqKTB4ZmYwMDsKKyAgICBzIDw8IHA7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHMuZ29vZCgpICk7CisgICAgaWYgKCBzaXplb2YoIHAgKSA9PSAyICkgeworICAgICAgQ1BQVU5JVF9BU1NFUlQoIHMuc3RyKCkgPT0gIjB4ZmYwMCIgKTsKKyAgICB9IGVsc2UgaWYgKCBzaXplb2YoIHAgKSA9PSA0ICkgeworICAgICAgQ1BQVU5JVF9BU1NFUlQoIHMuc3RyKCkgPT0gIjB4MDAwMGZmMDAiICk7IC8vIHRoaXMgcGFzcworICAgIH0gZWxzZSBpZiAoIHNpemVvZiggcCApID09IDggKSB7CisgICAgICBDUFBVTklUX0FTU0VSVCggcy5zdHIoKSA9PSAiMHgwMDAwMDAwMDAwMDBmZjAwIiApOworICAgIH0gZWxzZSB7CisgICAgICBDUFBVTklUX0NIRUNLKCBzaXplb2YoIHAgKSA9PSAyIHx8IHNpemVvZiggcCApID09IDQgfHwgc2l6ZW9mKCBwICkgPT0gOCApOworICAgIH0KKyAgfQorICB7CisgICAgb3N0cmluZ3N0cmVhbSBzOworICAgIHZvaWQgKnAgPSAwOworICAgIHMgPDwgcDsKKyAgICBDUFBVTklUX0FTU0VSVCggcy5nb29kKCkgKTsKKyAgICBpZiAoIHNpemVvZiggcCApID09IDIgKSB7CisgICAgICBDUFBVTklUX0FTU0VSVCggcy5zdHIoKSA9PSAiMHgwMDAwIiApOworICAgIH0gZWxzZSBpZiAoIHNpemVvZiggcCApID09IDQgKSB7CisgICAgICBDUFBVTklUX0FTU0VSVCggcy5zdHIoKSA9PSAiMHgwMDAwMDAwMCIgKTsgLy8gYnV0IHRoaXMgd2lsbCBmYWlsLCBpZiBmb2xsb3cgJXAKKyAgICB9IGVsc2UgaWYgKCBzaXplb2YoIHAgKSA9PSA4ICkgeworICAgICAgQ1BQVU5JVF9BU1NFUlQoIHMuc3RyKCkgPT0gIjB4MDAwMDAwMDAwMDAwMDAwMCIgKTsKKyAgICB9IGVsc2UgeworICAgICAgQ1BQVU5JVF9DSEVDSyggc2l6ZW9mKCBwICkgPT0gMiB8fCBzaXplb2YoIHAgKSA9PSA0IHx8IHNpemVvZiggcCApID09IDggKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBOdW1QdXRHZXRUZXN0OjpmaXhfZmxvYXRfbG9uZygpCit7CisgIG9zdHJpbmdzdHJlYW0gc3RyOworCisgIHN0ci5zZXRmKGlvczo6Zml4ZWQsIGlvczo6ZmxvYXRmaWVsZCk7CisgIHN0ciA8PCAxLjBlKzU7CisgIENQUFVOSVRfQ0hFQ0soIHN0ci5zdHIoKSA9PSAiMTAwMDAwLjAwMDAwMCIgKTsKKworICByZXNldF9zdHJlYW0oc3RyKTsKKyAgc3RyLnByZWNpc2lvbigwKTsKKyAgc3RyIDw8IDEuMGUrNTsKKyAgQ1BQVU5JVF9DSEVDSyggc3RyLnN0cigpID09ICIxMDAwMDAiICk7CisKKyAgcmVzZXRfc3RyZWFtKHN0cik7CisgIHN0ci5wcmVjaXNpb24oNCk7CisgIHN0ciA8PCAxLjBlKzU7CisgIENQUFVOSVRfQ0hFQ0soIHN0ci5zdHIoKSA9PSAiMTAwMDAwLjAwMDAiICk7CisKKyAgcmVzZXRfc3RyZWFtKHN0cik7CisgIHN0ci5wcmVjaXNpb24oMCk7CisgIHN0ciA8PCAxLjBlKzgzOworICB7CisgICAgaXN0cmluZ3N0cmVhbSBpc3RyKCBzdHIuc3RyKCkgKTsKKyAgICBkb3VibGUgZjsKKyAgICBpc3RyID4+IGY7CisgICAgQ1BQVU5JVF9DSEVDSyggIWlzdHIuZmFpbCgpICk7CisgICAgaWYgKCBpbnQobnVtZXJpY19saW1pdHM8ZG91YmxlPjo6ZGlnaXRzMTApIDwgODMgKSB7CisgICAgICBkb3VibGUgZGVsdGEgPSAxLjA7CisgICAgICBmb3IgKCBpbnQgZWUgPSA4MyAtIGludChudW1lcmljX2xpbWl0czxkb3VibGU+OjpkaWdpdHMxMCk7IGVlID4gMDsgLS1lZSApIHsKKyAgICAgICAgZGVsdGEgKj0gMTAuMDsKKyAgICAgIH0KKyAgICAgIC8vIHdlIG1heSBsb3NzIHNvbWUgZGlnaXRzIGhlcmUsIGJ1dCBub3QgbW9yZSB0aGFuIG1hbnRpc3NhOgorICAgICAgQ1BQVU5JVF9DSEVDSyggKGYgPiAoMS4wZSs4MyAtIGRlbHRhKSkgJiYgKGYgPCAoMS4wZSs4MyArIGRlbHRhKSkgKTsKKyAgICB9IGVsc2UgeworICAgICAgQ1BQVU5JVF9DSEVDSyggY2hlY2tfZG91YmxlKGYsIDEuMGUrODMpICk7CisgICAgfQorICB9CisKKyNpZiAwIC8vICNpZm5kZWYgX1NUTFBfTk9fTE9OR19ET1VCTEUKKyAgcmVzZXRfc3RyZWFtKHN0cik7CisgIHN0ci5wcmVjaXNpb24oMCk7CisgIHN0ciA8PCAxLjBlKzgzbDsKKyAgeworICAgIGlzdHJpbmdzdHJlYW0gaXN0ciggc3RyLnN0cigpICk7CisgICAgbG9uZyBkb3VibGUgZjsKKyAgICBpc3RyID4+IGY7CisgICAgQ1BQVU5JVF9DSEVDSyggIWlzdHIuZmFpbCgpICk7CisgICAgaWYgKCBpbnQobnVtZXJpY19saW1pdHM8bG9uZyBkb3VibGU+OjpkaWdpdHMxMCkgPCA4MyApIHsKKyAgICAgIGxvbmcgZG91YmxlIGRlbHRhID0gMS4wbDsKKyAgICAgIGZvciAoIGludCBlZSA9IDgzIC0gaW50KG51bWVyaWNfbGltaXRzPGxvbmcgZG91YmxlPjo6ZGlnaXRzMTApOyBlZSA+IDA7IC0tZWUgKSB7CisgICAgICAgIGRlbHRhICo9IDEwLjBsOworICAgICAgfQorICAgICAgLy8gd2UgbWF5IGxvc3Mgc29tZSBkaWdpdHMgaGVyZSwgYnV0IG5vdCBtb3JlIHRoYW4gbWFudGlzc2E6CisgICAgICBjZXJyIDw8ICIwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5IiA8PCBlbmRsOworICAgICAgY2VyciA8PCBzdHIuc3RyKCkgPDwgZW5kbDsKKyAgICAgIGNlcnIgPDwgZGVsdGEgPDwgZW5kbDsKKyAgICAgIGNlcnIgPDwgZiA8PCBlbmRsOworICAgICAgQ1BQVU5JVF9DSEVDSyggKGYgPiAoMS4wZSs4M2wgLSBkZWx0YSkpICYmIChmIDwgKDEuMGUrODNsICsgZGVsdGEpKSApOworICAgIH0gZWxzZSB7CisgICAgICBDUFBVTklUX0NIRUNLKCBjaGVja19kb3VibGUoZiwgMS4wZSs4M2wpICk7CisgICAgfQorICB9CisjZW5kaWYKKworICByZXNldF9zdHJlYW0oc3RyKTsKKyAgc3RyLnByZWNpc2lvbigwKTsKKyAgc3RyIDw8IG51bWVyaWNfbGltaXRzPGRvdWJsZT46Om1heCgpOworICB7CisgICAgaXN0cmluZ3N0cmVhbSBpc3RyKCBzdHIuc3RyKCkgKTsKKyAgICBkb3VibGUgZjsKKyAgICBpc3RyID4+IGY7CisgICAgQ1BQVU5JVF9DSEVDSyggIWlzdHIuZmFpbCgpICk7CisgICAgaWYgKCBpbnQobnVtZXJpY19saW1pdHM8ZG91YmxlPjo6ZGlnaXRzMTApIDwgaW50KG51bWVyaWNfbGltaXRzPGRvdWJsZT46Om1heF9leHBvbmVudDEwKSApIHsKKyAgICAgIGRvdWJsZSBkZWx0YSA9IDkuMDsKKyAgICAgIGZvciAoIGludCBlZSA9IGludChudW1lcmljX2xpbWl0czxkb3VibGU+OjptYXhfZXhwb25lbnQxMCkgLSBpbnQobnVtZXJpY19saW1pdHM8ZG91YmxlPjo6ZGlnaXRzMTApOyBlZSA+IDA7IC0tZWUgKSB7CisgICAgICAgIGRlbHRhICo9IDEwLjA7CisgICAgICB9CisgICAgICAvLyB3ZSBtYXkgbG9zcyBzb21lIGRpZ2l0cyBoZXJlLCBidXQgbm90IG1vcmUgdGhhbiBtYW50aXNzYToKKyAgICAgIENQUFVOSVRfQ0hFQ0soIChmID4gKG51bWVyaWNfbGltaXRzPGRvdWJsZT46Om1heCgpIC0gZGVsdGEpKSApOworICAgIH0KKyAgfQorCisjaWYgMCAvLyAjaWZuZGVmIF9TVExQX05PX0xPTkdfRE9VQkxFCisgIHJlc2V0X3N0cmVhbShzdHIpOworICBzdHIucHJlY2lzaW9uKDApOworICBzdHIgPDwgbnVtZXJpY19saW1pdHM8bG9uZyBkb3VibGU+OjptYXgoKTsKKyAgeworICAgIGlzdHJpbmdzdHJlYW0gaXN0ciggc3RyLnN0cigpICk7CisgICAgbG9uZyBkb3VibGUgZjsKKyAgICBpc3RyID4+IGY7CisgICAgQ1BQVU5JVF9DSEVDSyggIWlzdHIuZmFpbCgpICk7CisgICAgaWYgKCBpbnQobnVtZXJpY19saW1pdHM8bG9uZyBkb3VibGU+OjpkaWdpdHMxMCkgPCBpbnQobnVtZXJpY19saW1pdHM8bG9uZyBkb3VibGU+OjptYXhfZXhwb25lbnQxMCkgKSB7CisgICAgICBsb25nIGRvdWJsZSBkZWx0YSA9IDEuMGw7CisgICAgICBmb3IgKCBpbnQgZWUgPSBpbnQobnVtZXJpY19saW1pdHM8bG9uZyBkb3VibGU+OjptYXhfZXhwb25lbnQxMCkgLSBpbnQobnVtZXJpY19saW1pdHM8bG9uZyBkb3VibGU+OjpkaWdpdHMxMCk7IGVlID4gMDsgLS1lZSApIHsKKyAgICAgICAgZGVsdGEgKj0gMTAuMGw7CisgICAgICB9CisgICAgICAvLyB3ZSBtYXkgbG9zcyBzb21lIGRpZ2l0cyBoZXJlLCBidXQgbm90IG1vcmUgdGhhbiBtYW50aXNzYToKKyAgICAgIENQUFVOSVRfQ0hFQ0soIChmID4gKG51bWVyaWNfbGltaXRzPGxvbmcgZG91YmxlPjo6bWF4KCkgLSBkZWx0YSkpICk7CisgICAgfQorICB9CisjZW5kaWYKK30KKworY2xhc3MgQ29tbWFTZXBOdW1QdW5jdCA6IHB1YmxpYyBudW1wdW5jdDxjaGFyPiB7CisgIGNoYXIgZG9fdGhvdXNhbmRzX3NlcCgpIGNvbnN0IHsgcmV0dXJuICcsJzsgfQorICBzdHJpbmcgZG9fZ3JvdXBpbmcoKSBjb25zdCB7IHJldHVybiBzdHJpbmcoIlwxXDJcMyIpICsgKGNoYXIpQ0hBUl9NQVg7IH0KK307CisKKyNkZWZpbmUgQ0hFQ0syKHZhbCwgZXhwZWN0ZWQpIFwKKyAgb3Muc3RyKCIiKTsgb3MgPDwgZml4ZWQgPDwgc2V0cHJlY2lzaW9uKDMpIDw8IHNob3dwb3MgPDwgdmFsOyBcCisgIENQUFVOSVRfQVNTRVJUKCBvcy5zdHIoKSA9PSBleHBlY3RlZCApCisKK3ZvaWQgTnVtUHV0R2V0VGVzdDo6Y3VzdG9tX251bXB1bmN0KCkKK3sKKyAgICBvc3RyaW5nc3RyZWFtIG9zOworICAgIGxvY2FsZSBsb2Mob3MuZ2V0bG9jKCksIG5ldyBDb21tYVNlcE51bVB1bmN0KCkpOworICAgIG9zLmltYnVlKGxvYyk7CisKKyAgICBDSEVDSzIoMSwgIisxIik7CisgICAgQ0hFQ0syKDEwLCAiKzEsMCIpOworICAgIENIRUNLMigxMDAsICIrMTAsMCIpOworICAgIENIRUNLMigxMDAwLCAiKzEsMDAsMCIpOworCisgICAgQ0hFQ0syKDEuMjM0LCAiKzEuMjM0Iik7CisgICAgQ0hFQ0syKDEyMy40NTYsICIrMTIsMy40NTYiKTsKKyAgICBDSEVDSzIoMTIzNC41NjcsICIrMSwyMyw0LjU2NyIpOworICAgIENIRUNLMigxMjM0NS42NzgsICIrMTIsMzQsNS42NzgiKTsKKyAgICBDSEVDSzIoMTIzNDU2Ljc4OSwgIisxMjMsNDUsNi43ODkiKTsKKyAgICBDSEVDSzIoMTIzNDU2Ny44OTEsICIrMSwyMzQsNTYsNy44OTEiKTsKKyAgICBDSEVDSzIoMTIzNDU2Nzg5LjEyMywgIisxMjMsNDU2LDc4LDkuMTIzIik7CisgICAgLy9DSEVDSzIoMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLjAsICIrMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLDAwMCwwMCwwLjAwMCIpOworICAgIENIRUNLMihudW1lcmljX2xpbWl0czxkb3VibGU+OjppbmZpbml0eSgpLCAiK2luZiIpOworCisgICAgQ0hFQ0syKC0xLjIzNCwgIi0xLjIzNCIpOworICAgIENIRUNLMigtMTIzLjQ1NiwgIi0xMiwzLjQ1NiIpOworICAgIENIRUNLMigtMTIzNC41NjcsICItMSwyMyw0LjU2NyIpOworICAgIENIRUNLMigtMTIzNDUuNjc4LCAiLTEyLDM0LDUuNjc4Iik7CisgICAgQ0hFQ0syKC0xMjM0NTYuNzg5LCAiLTEyMyw0NSw2Ljc4OSIpOworICAgIENIRUNLMigtMTIzNDU2Ny44OTEsICItMSwyMzQsNTYsNy44OTEiKTsKKyAgICBDSEVDSzIoLTEyMzQ1Njc4OS4xMjMsICItMTIzLDQ1Niw3OCw5LjEyMyIpOworICAgIC8vQ0hFQ0syKC0xMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuMCwgIi0xMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAsMDAwLDAwLDAuMDAwIik7CisgICAgQ0hFQ0syKC1udW1lcmljX2xpbWl0czxkb3VibGU+OjppbmZpbml0eSgpLCAiLWluZiIpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9udW1lcmljX2hlYWRlcl90ZXN0LmNwcCBiL3Rlc3QvdW5pdC9udW1lcmljX2hlYWRlcl90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGQyM2RkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L251bWVyaWNfaGVhZGVyX3Rlc3QuY3BwCkBAIC0wLDAgKzEsOCBAQAorLyogVGhpcyB0ZXN0IHB1cnBvc2UgaXMgc2ltcGx5IHRvIGNoZWNrIFN0YW5kYXJkIGhlYWRlciBpbmRlcGVuZGFuY3kgdGhhdAorICogaXMgdG8gc2F5IHRoYXQgdGhlIGhlYWRlciBjYW4gYmUgaW5jbHVkZWQgYWxvbmUgd2l0aG91dCBhbnkgcHJldmlvdXMKKyAqIGluY2x1ZGUuCisgKiBBZGRpdGlvbm5hbHksIGZvciBDIFN0YW5kYXJkIGhlYWRlcnMgdGhhdCBTVExwb3J0IGV4cG9zZSwgaXQgY2FuIGFsc28gYmUKKyAqIHVzZWQgdG8gY2hlY2sgdGhhdCBmaWxlcyBpbmNsdWRlZCBieSB0aG9zZSBoZWFkZXJzIGFyZSBjb21wYXRpYmxlIHdpdGgKKyAqIHB1cmUgQyBjb21waWxlcnMuCisgKi8KKyNpbmNsdWRlIDxudW1lcmljPgpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29zdG1pdF90ZXN0LmNwcCBiL3Rlc3QvdW5pdC9vc3RtaXRfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk0MzUzZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vc3RtaXRfdGVzdC5jcHAKQEAgLTAsMCArMSw1MiBAQAorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCAhZGVmaW5lZCAoX1NUTFBfVVNFX05PX0lPU1RSRUFNUykKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpbmNsdWRlICJjcHB1bml0L2NwcHVuaXRfcHJveHkuaCIKKworI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkKF9TVExQX1VTRV9OQU1FU1BBQ0VTKQordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyNlbmRpZgorCisvLworLy8gVGVzdENhc2UgY2xhc3MKKy8vCitjbGFzcyBPc3RyZWFtSXRlcmF0b3JUZXN0IDogcHVibGljIENQUFVOSVRfTlM6OlRlc3RDYXNlCit7CisgIENQUFVOSVRfVEVTVF9TVUlURShPc3RyZWFtSXRlcmF0b3JUZXN0KTsKKyAgQ1BQVU5JVF9URVNUKG9zdG1pdDApOworICBDUFBVTklUX1RFU1RfU1VJVEVfRU5EKCk7CisKK3Byb3RlY3RlZDoKKyAgdm9pZCBvc3RtaXQwKCk7Cit9OworCitDUFBVTklUX1RFU1RfU1VJVEVfUkVHSVNUUkFUSU9OKE9zdHJlYW1JdGVyYXRvclRlc3QpOworCisvLworLy8gdGVzdHMgaW1wbGVtZW50YXRpb24KKy8vCit2b2lkIE9zdHJlYW1JdGVyYXRvclRlc3Q6Om9zdG1pdDAoKQoreworICAvLyBub3QgbmVjZXNzYXJ5LCB0ZXN0ZWQgaW4gY29weV90ZXN0CisgIGludCBhcnJheSBbXSA9IHsgMSwgNSwgMiwgNCB9OworCisgIGNvbnN0IGNoYXIqIHRleHQgPSAiaGVsbG8iOworCisgIG9zdHJpbmdzdHJlYW0gb3M7CisKKyAgb3N0cmVhbV9pdGVyYXRvcjxjaGFyPiBpdGVyKG9zKTsKKyAgY29weSh0ZXh0LCB0ZXh0ICsgNSwgaXRlcik7CisgIENQUFVOSVRfQVNTRVJUKG9zLmdvb2QoKSk7CisgIG9zIDw8ICcgJzsKKyAgQ1BQVU5JVF9BU1NFUlQob3MuZ29vZCgpKTsKKworICBvc3RyZWFtX2l0ZXJhdG9yPGludD4gaXRlcjIob3MpOworICBjb3B5KGFycmF5LCBhcnJheSArIDQsIGl0ZXIyKTsKKyAgQ1BQVU5JVF9BU1NFUlQob3MuZ29vZCgpKTsKKyAgQ1BQVU5JVF9BU1NFUlQob3Muc3RyKCkgPT0gImhlbGxvIDE1MjQiKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3N0cmVhbV9oZWFkZXJfdGVzdC5jcHAgYi90ZXN0L3VuaXQvb3N0cmVhbV9oZWFkZXJfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM5Y2NiNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vc3RyZWFtX2hlYWRlcl90ZXN0LmNwcApAQCAtMCwwICsxLDEwIEBACisvKiBUaGlzIHRlc3QgcHVycG9zZSBpcyBzaW1wbHkgdG8gY2hlY2sgU3RhbmRhcmQgaGVhZGVyIGluZGVwZW5kYW5jeSB0aGF0CisgKiBpcyB0byBzYXkgdGhhdCB0aGUgaGVhZGVyIGNhbiBiZSBpbmNsdWRlZCBhbG9uZSB3aXRob3V0IGFueSBwcmV2aW91cworICogaW5jbHVkZS4KKyAqIEFkZGl0aW9ubmFseSwgZm9yIEMgU3RhbmRhcmQgaGVhZGVycyB0aGF0IFNUTHBvcnQgZXhwb3NlLCBpdCBjYW4gYWxzbyBiZQorICogdXNlZCB0byBjaGVjayB0aGF0IGZpbGVzIGluY2x1ZGVkIGJ5IHRob3NlIGhlYWRlcnMgYXJlIGNvbXBhdGlibGUgd2l0aAorICogcHVyZSBDIGNvbXBpbGVycy4KKyAqLworI2lmICFkZWZpbmVkIChfU1RMUF9OT19JT1NUUkVBTVMpCisjICBpbmNsdWRlIDxvc3RyZWFtPgorI2VuZGlmCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvcGFpcl90ZXN0LmNwcCBiL3Rlc3QvdW5pdC9wYWlyX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmYzUxNzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvcGFpcl90ZXN0LmNwcApAQCAtMCwwICsxLDQ2IEBACisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgImNwcHVuaXQvY3BwdW5pdF9wcm94eS5oIgorCisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IGRlZmluZWQoX1NUTFBfVVNFX05BTUVTUEFDRVMpCit1c2luZyBuYW1lc3BhY2Ugc3RkOworI2VuZGlmCisKK2NsYXNzIFBhaXJUZXN0IDogcHVibGljIENQUFVOSVRfTlM6OlRlc3RDYXNlCit7CisgICAgQ1BQVU5JVF9URVNUX1NVSVRFKFBhaXJUZXN0KTsKKyAgICBDUFBVTklUX1RFU1QocGFpcjApOworICAgIENQUFVOSVRfVEVTVChpbml0KTsKKyAgICBDUFBVTklUX1RFU1RfU1VJVEVfRU5EKCk7CisKKyAgcHJvdGVjdGVkOgorICAgIHZvaWQgcGFpcjAoKTsKKyAgICB2b2lkIGluaXQoKTsKK307CisKK0NQUFVOSVRfVEVTVF9TVUlURV9SRUdJU1RSQVRJT04oUGFpclRlc3QpOworCit2b2lkIFBhaXJUZXN0OjpwYWlyMCgpCit7CisgIHBhaXI8aW50LCBpbnQ+IHAgPSBtYWtlX3BhaXIoMSwgMTApOworCisgIENQUFVOSVRfQVNTRVJUKHAuZmlyc3Q9PTEpOworICBDUFBVTklUX0FTU0VSVChwLnNlY29uZD09MTApOworfQorCit2b2lkIFBhaXJUZXN0Ojppbml0KCkKK3sKKyAgcGFpcjxpbnQsIHN0cmluZz4gUEFJUl9BUlJBWVtdID0geyBwYWlyPGludCwgc3RyaW5nPigwLCAiMCIpIH07CisKKyAgaW50IFBBSVJfQVJSQVlfU0laRSA9IHNpemVvZihQQUlSX0FSUkFZKSA+IDAgPyBzaXplb2YoUEFJUl9BUlJBWSkgLyBzaXplb2YoUEFJUl9BUlJBWVswXSkgOiAwOworCisKKyAgZm9yICggaW50IGkgPSAwOyBpIDwgUEFJUl9BUlJBWV9TSVpFOyBpKysgKSB7CisgICAgQ1BQVU5JVF9DSEVDSyggUEFJUl9BUlJBWVtpXS5maXJzdCA9PSAwICk7CisgICAgQ1BQVU5JVF9DSEVDSyggUEFJUl9BUlJBWVtpXS5zZWNvbmQgPT0gIjAiICk7CisgICAgUEFJUl9BUlJBWVtpXS5zZWNvbmQgPSAiMSI7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9wYXJ0aWFsX3Rlc3QuY3BwIGIvdGVzdC91bml0L3BhcnRpYWxfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc2NTBmZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9wYXJ0aWFsX3Rlc3QuY3BwCkBAIC0wLDAgKzEsMjQ4IEBACisjaW5jbHVkZSA8bnVtZXJpYz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiBkZWZpbmVkIChfU1RMUF9ERUJVRykgJiYgZGVmaW5lZCAoX1NUTFBfREVCVUdfTU9ERV9USFJPV1MpCisjICBkZWZpbmUgX1NUTFBfRE9fQ0hFQ0tfQkFEX1BSRURJQ0FURQorIyAgaW5jbHVkZSA8c3RkZXhjZXB0PgorI2VuZGlmCisKKyNpbmNsdWRlICJpb3RhLmgiCisjaW5jbHVkZSAiY3BwdW5pdC9jcHB1bml0X3Byb3h5LmgiCisKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZChfU1RMUF9VU0VfTkFNRVNQQUNFUykKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisjZW5kaWYKKworLy8KKy8vIFRlc3RDYXNlIGNsYXNzCisvLworY2xhc3MgUGFydGlhbFRlc3QgOiBwdWJsaWMgQ1BQVU5JVF9OUzo6VGVzdENhc2UKK3sKKyAgQ1BQVU5JVF9URVNUX1NVSVRFKFBhcnRpYWxUZXN0KTsKKyAgQ1BQVU5JVF9URVNUKHBhcnNydDApOworICBDUFBVTklUX1RFU1QocGFyc3J0MSk7CisgIENQUFVOSVRfVEVTVChwYXJzcnQyKTsKKyAgQ1BQVU5JVF9URVNUKHBhcnNydGMwKTsKKyAgQ1BQVU5JVF9URVNUKHBhcnNydGMxKTsKKyAgQ1BQVU5JVF9URVNUKHBhcnNydGMyKTsKKyNpZiBkZWZpbmVkIChfU1RMUF9ET19DSEVDS19CQURfUFJFRElDQVRFKQorICBDUFBVTklUX1RFU1QoYmFkX3ByZWRpY2F0ZV9kZXRlY3RlZCk7CisjZW5kaWYKKyAgQ1BQVU5JVF9URVNUKHBhcnRzdW0wKTsKKyAgQ1BQVU5JVF9URVNUKHBhcnRzdW0xKTsKKyAgQ1BQVU5JVF9URVNUKHBhcnRzdW0yKTsKKyAgQ1BQVU5JVF9URVNUX1NVSVRFX0VORCgpOworCitwcm90ZWN0ZWQ6CisgIHZvaWQgcGFyc3J0MCgpOworICB2b2lkIHBhcnNydDEoKTsKKyAgdm9pZCBwYXJzcnQyKCk7CisgIHZvaWQgcGFyc3J0YzAoKTsKKyAgdm9pZCBwYXJzcnRjMSgpOworICB2b2lkIHBhcnNydGMyKCk7CisgIHZvaWQgcGFydHN1bTAoKTsKKyAgdm9pZCBwYXJ0c3VtMSgpOworICB2b2lkIHBhcnRzdW0yKCk7CisgIHZvaWQgYmFkX3ByZWRpY2F0ZV9kZXRlY3RlZCgpOworCisgIHN0YXRpYyBib29sIHN0cl9jb21wYXJlKGNvbnN0IGNoYXIqIGFfLCBjb25zdCBjaGFyKiBiXykKKyAgeworICAgIHJldHVybiBzdHJjbXAoYV8sIGJfKSA8IDAgPyAxIDogMDsKKyAgfQorfTsKKworQ1BQVU5JVF9URVNUX1NVSVRFX1JFR0lTVFJBVElPTihQYXJ0aWFsVGVzdCk7CisKKy8vCisvLyB0ZXN0cyBpbXBsZW1lbnRhdGlvbgorLy8KK3ZvaWQgUGFydGlhbFRlc3Q6OnBhcnNydDAoKQoreworICBpbnQgbnVtYmVyc1s2XSA9IHsgNSwgMiwgNCwgMywgMSwgNiB9OworCisgIHBhcnRpYWxfc29ydCgoaW50KiludW1iZXJzLCAoaW50KiludW1iZXJzICsgMywgKGludCopbnVtYmVycyArIDYpOworCisgIC8vIDEgMiAzIDUgNCA2CisgIENQUFVOSVRfQVNTRVJUKG51bWJlcnNbMF09PTEpOworICBDUFBVTklUX0FTU0VSVChudW1iZXJzWzFdPT0yKTsKKyAgQ1BQVU5JVF9BU1NFUlQobnVtYmVyc1syXT09Myk7CisgIENQUFVOSVRfQVNTRVJUKG51bWJlcnNbM109PTUpOworICBDUFBVTklUX0FTU0VSVChudW1iZXJzWzRdPT00KTsKKyAgQ1BQVU5JVF9BU1NFUlQobnVtYmVyc1s1XT09Nik7Cit9CisKK3ZvaWQgUGFydGlhbFRlc3Q6OnBhcnNydDEoKQoreworICAvLyA4IDggNSAzIDcgNiA1IDMgMiA0CisgIC8vIDIgMyAzIDQgNSA4IDggNyA2IDUKKyAgaW50IG51bWJlcnNbMTBdID17IDgsIDgsIDUsIDMsIDcsIDYsIDUsIDMsIDIsIDQgfTsKKworICB2ZWN0b3IgPGludD4gdjEobnVtYmVycywgbnVtYmVycysxMCk7CisgIHBhcnRpYWxfc29ydCh2MS5iZWdpbigpLCB2MS5iZWdpbigpICsgdjEuc2l6ZSgpIC8gMiwgdjEuZW5kKCkpOworCisgIENQUFVOSVRfQVNTRVJUKHYxWzBdPT0yKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbMV09PTMpOworICBDUFBVTklUX0FTU0VSVCh2MVsyXT09Myk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzNdPT00KTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbNF09PTUpOworICBDUFBVTklUX0FTU0VSVCh2MVs1XT09OCk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzZdPT04KTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbN109PTcpOworICBDUFBVTklUX0FTU0VSVCh2MVs4XT09Nik7CisgIENQUFVOSVRfQVNTRVJUKHYxWzldPT01KTsKK30KKwordm9pZCBQYXJ0aWFsVGVzdDo6cGFyc3J0MigpCit7CisgIGNoYXIgY29uc3QqIG5hbWVzW10gPSB7ICJhYSIsICJmZiIsICJkZCIsICJlZSIsICJjYyIsICJiYiIgfTsKKworICBjb25zdCB1bnNpZ25lZCBuYW1lU2l6ZSA9IHNpemVvZihuYW1lcykgLyBzaXplb2YobmFtZXNbMF0pOworICB2ZWN0b3IgPGNoYXIgY29uc3QqPiB2MShuYW1lU2l6ZSk7CisgIGZvcihzaXplX3QgaSA9IDA7IGkgPCB2MS5zaXplKCk7IGkrKykKKyAgICB2MVtpXSA9IG5hbWVzW2ldOworCisgIHBhcnRpYWxfc29ydCh2MS5iZWdpbigpLCB2MS5iZWdpbigpICsgbmFtZVNpemUgLyAyLCB2MS5lbmQoKSwgc3RyX2NvbXBhcmUpOworCisgIC8vIGFhIGJiIGNjIGZmIGVlIGRkCisgIENQUFVOSVRfQVNTRVJUKCBzdHJjbXAodjFbMF0sICJhYSIpID09IDAgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHYxWzBdID09IG5hbWVzWzBdICk7CisgIENQUFVOSVRfQVNTRVJUKCBzdHJjbXAodjFbMV0sICJiYiIpID09IDAgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHYxWzFdID09IG5hbWVzWzVdICk7CisgIENQUFVOSVRfQVNTRVJUKCBzdHJjbXAodjFbMl0sICJjYyIpID09IDAgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHYxWzJdID09IG5hbWVzWzRdICk7CisgIENQUFVOSVRfQVNTRVJUKCBzdHJjbXAodjFbM10sICJmZiIpID09IDAgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHYxWzNdID09IG5hbWVzWzFdICk7CisgIENQUFVOSVRfQVNTRVJUKCBzdHJjbXAodjFbNF0sICJlZSIpID09IDAgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHYxWzRdID09IG5hbWVzWzNdICk7CisgIENQUFVOSVRfQVNTRVJUKCBzdHJjbXAodjFbNV0sICJkZCIpID09IDAgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHYxWzVdID09IG5hbWVzWzJdICk7Cit9CisKK3ZvaWQgUGFydGlhbFRlc3Q6OnBhcnNydGMwKCkKK3sKKyAgaW50IG51bWJlcnNbNl0gPSB7IDUsIDIsIDQsIDMsIDEsIDYgfTsKKworICBpbnQgcmVzdWx0WzNdOworICBwYXJ0aWFsX3NvcnRfY29weSgoaW50KiludW1iZXJzLCAoaW50KiludW1iZXJzICsgNiwgKGludCopcmVzdWx0LCAoaW50KilyZXN1bHQgKyAzKTsKKyAgLy8xIDIgMworICBDUFBVTklUX0FTU0VSVChyZXN1bHRbMF09PTEpOworICBDUFBVTklUX0FTU0VSVChyZXN1bHRbMV09PTIpOworICBDUFBVTklUX0FTU0VSVChyZXN1bHRbMl09PTMpOworfQorCit2b2lkIFBhcnRpYWxUZXN0OjpwYXJzcnRjMSgpCit7CisgIGludCBudW1iZXJzWzEwXSA9eyAzLCAwLCA0LCAzLCAyLCA4LCAyLCA3LCA3LCA1IH07CisKKyAgLy8zIDAgNCAzIDIgOCAyIDcgNyA1CisgIC8vMCAyIDIgMyAzCisKKyAgdmVjdG9yIDxpbnQ+IHYxKG51bWJlcnMsIG51bWJlcnMrMTApOworICB2ZWN0b3IgPGludD4gcmVzdWx0KDUpOworCisgIHBhcnRpYWxfc29ydF9jb3B5KHYxLmJlZ2luKCksIHYxLmVuZCgpLCByZXN1bHQuYmVnaW4oKSwgcmVzdWx0LmVuZCgpKTsKKyAgQ1BQVU5JVF9BU1NFUlQocmVzdWx0WzBdPT0wKTsKKyAgQ1BQVU5JVF9BU1NFUlQocmVzdWx0WzFdPT0yKTsKKyAgQ1BQVU5JVF9BU1NFUlQocmVzdWx0WzJdPT0yKTsKKyAgQ1BQVU5JVF9BU1NFUlQocmVzdWx0WzNdPT0zKTsKKyAgQ1BQVU5JVF9BU1NFUlQocmVzdWx0WzRdPT0zKTsKK30KKwordm9pZCBQYXJ0aWFsVGVzdDo6cGFyc3J0YzIoKQoreworICBjaGFyIGNvbnN0KiBuYW1lc1tdID0geyAiYWEiLCAiZmYiLCAiZGQiLCAiZWUiLCAiY2MiLCAiYmIiIH07CisKKyAgY29uc3QgdW5zaWduZWQgbmFtZVNpemUgPSBzaXplb2YobmFtZXMpIC8gc2l6ZW9mKG5hbWVzWzBdKTsKKyAgdmVjdG9yIDxjaGFyIGNvbnN0Kj4gdjEobmFtZVNpemUpOworICBmb3Ioc2l6ZV90IGkgPSAwOyBpIDwgdjEuc2l6ZSgpOyBpKyspCisgICAgdjFbaV0gPSBuYW1lc1tpXTsKKyAgdmVjdG9yIDxjaGFyIGNvbnN0Kj4gcmVzdWx0KDMpOworICBwYXJ0aWFsX3NvcnRfY29weSh2MS5iZWdpbigpLCB2MS5lbmQoKSwgcmVzdWx0LmJlZ2luKCksIHJlc3VsdC5lbmQoKSwgc3RyX2NvbXBhcmUpOworCisgIC8vIGFhIGJiIGNjCisgIENQUFVOSVRfQVNTRVJUKCBzdHJjbXAoIHJlc3VsdFswXSwgImFhIiApID09IDAgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHJlc3VsdFswXSA9PSBuYW1lc1swXSApOworICBDUFBVTklUX0FTU0VSVCggc3RyY21wKCByZXN1bHRbMV0sICJiYiIgKSA9PSAwICk7CisgIENQUFVOSVRfQVNTRVJUKCByZXN1bHRbMV0gPT0gbmFtZXNbNV0gKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHN0cmNtcCggcmVzdWx0WzJdLCAiY2MiICkgPT0gMCApOworICBDUFBVTklUX0FTU0VSVCggcmVzdWx0WzJdID09IG5hbWVzWzRdICk7Cit9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9ET19DSEVDS19CQURfUFJFRElDQVRFKQordm9pZCBQYXJ0aWFsVGVzdDo6YmFkX3ByZWRpY2F0ZV9kZXRlY3RlZCgpCit7CisgIGludCBudW1iZXJzW10gPSB7IDAsIDAsIDEsIDAsIDAsIDEsIDAsIDAgfTsKKyAgY29uc3Qgc2l6ZV90IHMgPSBzaXplb2YobnVtYmVycykgLyBzaXplb2YobnVtYmVyc1swXSk7CisKKyAgdHJ5IHsKKyAgICBwYXJ0aWFsX3NvcnQobnVtYmVycywgbnVtYmVycyArIHMgLyAyLCBudW1iZXJzICsgcywgbGVzc19lcXVhbDxpbnQ+KCkpOworCisgICAgLy9IZXJlIGlzIG1lYW5zIHRoYXQgbm8gZXhjZXB0aW9uIGhhcyBiZWVuIHJhaXNlZAorICAgIENQUFVOSVRfQVNTRVJUKCBmYWxzZSApOworICB9CisgIGNhdGNoIChydW50aW1lX2Vycm9yIGNvbnN0JikKKyAgeyAvKk9LIGJhZCBwcmVkaWNhdGUgaGFzIGJlZW4gZGV0ZWN0ZWQuKi8gfQorCisgIHRyeSB7CisgICAgdmVjdG9yPGludD4gcmVzdWx0KHMpOworICAgIHBhcnRpYWxfc29ydF9jb3B5KG51bWJlcnMsIG51bWJlcnMgKyBzLCByZXN1bHQuYmVnaW4oKSwgcmVzdWx0LmVuZCgpLCBsZXNzX2VxdWFsPGludD4oKSk7CisKKyAgICAvL0hlcmUgaXMgbWVhbnMgdGhhdCBubyBleGNlcHRpb24gaGFzIGJlZW4gcmFpc2VkCisgICAgQ1BQVU5JVF9BU1NFUlQoIGZhbHNlICk7CisgIH0KKyAgY2F0Y2ggKHJ1bnRpbWVfZXJyb3IgY29uc3QmKQorICB7IC8qT0sgYmFkIHByZWRpY2F0ZSBoYXMgYmVlbiBkZXRlY3RlZC4qLyB9Cit9CisjZW5kaWYKKwordm9pZCBQYXJ0aWFsVGVzdDo6cGFydHN1bTAoKQoreworICBpbnQgbnVtYmVyc1s2XSA9IHsgMSwgMiwgMywgNCwgNSwgNiB9OworCisgIGludCByZXN1bHRbNl07CisgIHBhcnRpYWxfc3VtKChpbnQqKW51bWJlcnMsIChpbnQqKW51bWJlcnMgKyA2LCAoaW50KilyZXN1bHQpOworCisgIC8vIDEgMyA2IDEwIDE1IDIxCisgIENQUFVOSVRfQVNTRVJUKHJlc3VsdFswXT09MSk7CisgIENQUFVOSVRfQVNTRVJUKHJlc3VsdFsxXT09Myk7CisgIENQUFVOSVRfQVNTRVJUKHJlc3VsdFsyXT09Nik7CisgIENQUFVOSVRfQVNTRVJUKHJlc3VsdFszXT09MTApOworICBDUFBVTklUX0FTU0VSVChyZXN1bHRbNF09PTE1KTsKKyAgQ1BQVU5JVF9BU1NFUlQocmVzdWx0WzVdPT0yMSk7Cit9CisKK3ZvaWQgUGFydGlhbFRlc3Q6OnBhcnRzdW0xKCkKK3sKKyAgdmVjdG9yIDxpbnQ+IHYxKDEwKTsKKyAgX19pb3RhKHYxLmJlZ2luKCksIHYxLmVuZCgpLCAwKTsKKyAgdmVjdG9yIDxpbnQ+IHYyKHYxLnNpemUoKSk7CisgIHBhcnRpYWxfc3VtKHYxLmJlZ2luKCksIHYxLmVuZCgpLCB2Mi5iZWdpbigpKTsKKworICAvLyAwIDEgMyA2IDEwIDE1IDIxIDI4IDM2IDQ1CisgIENQUFVOSVRfQVNTRVJUKHYyWzBdPT0wKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjJbMV09PTEpOworICBDUFBVTklUX0FTU0VSVCh2MlsyXT09Myk7CisgIENQUFVOSVRfQVNTRVJUKHYyWzNdPT02KTsKKyAgQ1BQVU5JVF9BU1NFUlQodjJbNF09PTEwKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjJbNV09PTE1KTsKKyAgQ1BQVU5JVF9BU1NFUlQodjJbNl09PTIxKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjJbN109PTI4KTsKKyAgQ1BQVU5JVF9BU1NFUlQodjJbOF09PTM2KTsKKyAgQ1BQVU5JVF9BU1NFUlQodjJbOV09PTQ1KTsKK30KKwordm9pZCBQYXJ0aWFsVGVzdDo6cGFydHN1bTIoKQoreworICB2ZWN0b3IgPGludD4gdjEoNSk7CisgIF9faW90YSh2MS5iZWdpbigpLCB2MS5lbmQoKSwgMSk7CisgIHZlY3RvciA8aW50PiB2Mih2MS5zaXplKCkpOworICBwYXJ0aWFsX3N1bSh2MS5iZWdpbigpLCB2MS5lbmQoKSwgdjIuYmVnaW4oKSwgbXVsdGlwbGllczxpbnQ+KCkpOworICAvLyAxIDIgNiAyNCAxMjAKKyAgQ1BQVU5JVF9BU1NFUlQodjJbMF09PTEpOworICBDUFBVTklUX0FTU0VSVCh2MlsxXT09Mik7CisgIENQUFVOSVRfQVNTRVJUKHYyWzJdPT02KTsKKyAgQ1BQVU5JVF9BU1NFUlQodjJbM109PTI0KTsKKyAgQ1BQVU5JVF9BU1NFUlQodjJbNF09PTEyMCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvcGFydGl0aW9uX3Rlc3QuY3BwIGIvdGVzdC91bml0L3BhcnRpdGlvbl90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzVjOTFiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L3BhcnRpdGlvbl90ZXN0LmNwcApAQCAtMCwwICsxLDEzMCBAQAorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCisjaW5jbHVkZSAiY3BwdW5pdC9jcHB1bml0X3Byb3h5LmgiCisKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZChfU1RMUF9VU0VfTkFNRVNQQUNFUykKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisjZW5kaWYKKworLy8KKy8vIFRlc3RDYXNlIGNsYXNzCisvLworY2xhc3MgUGFydGl0aW9uVGVzdCA6IHB1YmxpYyBDUFBVTklUX05TOjpUZXN0Q2FzZQoreworICBDUFBVTklUX1RFU1RfU1VJVEUoUGFydGl0aW9uVGVzdCk7CisgIENQUFVOSVRfVEVTVChwdGl0aW9uMCk7CisgIENQUFVOSVRfVEVTVChwdGl0aW9uMSk7CisgIENQUFVOSVRfVEVTVChzdGJscHRuMCk7CisgIENQUFVOSVRfVEVTVChzdGJscHRuMSk7CisgIENQUFVOSVRfVEVTVF9TVUlURV9FTkQoKTsKKworcHJvdGVjdGVkOgorICB2b2lkIHB0aXRpb24wKCk7CisgIHZvaWQgcHRpdGlvbjEoKTsKKyAgdm9pZCBzdGJscHRuMCgpOworICB2b2lkIHN0YmxwdG4xKCk7CisKKyAgc3RydWN0IGxlc3NfbiB7CisgICAgbGVzc19uKGludCBsaW1pdCwgc2l6ZV90ICZuYl9jYWxscykKKyAgICAgIDogX2xpbWl0KGxpbWl0KSwgX25iX2NhbGxzKG5iX2NhbGxzKSB7fQorCisgICAgYm9vbCBvcGVyYXRvcigpIChpbnQgYV8pIGNvbnN0IHsKKyAgICAgICsrX25iX2NhbGxzOworICAgICAgcmV0dXJuIGFfIDwgX2xpbWl0OworICAgIH0KKworICAgIGludCBfbGltaXQ7CisgICAgc2l6ZV90ICZfbmJfY2FsbHM7CisKKyAgcHJpdmF0ZToKKyAgICAvL2V4cGxpY2l0ZWx5IGRlZmluZWQgYXMgcHJpdmF0ZSB0byBhdm9pZCB3YXJuaW5nczoKKyAgICBsZXNzX24mIG9wZXJhdG9yID0gKGxlc3NfbiBjb25zdCYpOworICB9OworfTsKKworQ1BQVU5JVF9URVNUX1NVSVRFX1JFR0lTVFJBVElPTihQYXJ0aXRpb25UZXN0KTsKKworLy8KKy8vIHRlc3RzIGltcGxlbWVudGF0aW9uCisvLwordm9pZCBQYXJ0aXRpb25UZXN0OjpzdGJscHRuMCgpCit7CisgIGludCBudW1iZXJzWzZdID0geyAxMCwgNSwgMTEsIDIwLCA2LCAtMiB9OworCisgIHNpemVfdCBuYl9wcmVkX2NhbGxzID0gMDsKKyAgc3RhYmxlX3BhcnRpdGlvbigoaW50KiludW1iZXJzLCAoaW50KiludW1iZXJzICsgNiwgbGVzc19uKDEwLCBuYl9wcmVkX2NhbGxzKSk7CisgIC8vIDUgNiAtMiAxMCAxMSAyMAorICBDUFBVTklUX0FTU0VSVChudW1iZXJzWzBdPT01KTsKKyAgQ1BQVU5JVF9BU1NFUlQobnVtYmVyc1sxXT09Nik7CisgIENQUFVOSVRfQVNTRVJUKG51bWJlcnNbMl09PS0yKTsKKyAgQ1BQVU5JVF9BU1NFUlQobnVtYmVyc1szXT09MTApOworICBDUFBVTklUX0FTU0VSVChudW1iZXJzWzRdPT0xMSk7CisgIENQUFVOSVRfQVNTRVJUKG51bWJlcnNbNV09PTIwKTsKKworICAvL0NvbXBsZXhpdHkgY2hlY2s6CisgIENQUFVOSVRfQVNTRVJUKCBuYl9wcmVkX2NhbGxzID09IHNpemVvZihudW1iZXJzKSAvIHNpemVvZihudW1iZXJzWzBdKSApOworfQordm9pZCBQYXJ0aXRpb25UZXN0OjpzdGJscHRuMSgpCit7CisgIC8vNSA1IDIgMTAgMCAxMiA1IDAgMCAxOQorICAvLzUgNSAyIDEwIDAgNSAwIDAgMTIgMTkKKyAgaW50IG51bWJlcnNbXSA9IHsgNSwgNSwgMiwgMTAsIDAsIDEyLCA1LCAwLCAwLCAxOSB9OworICB2ZWN0b3IgPGludD4gdjEobnVtYmVycywgbnVtYmVycysxMCk7CisKKyAgc2l6ZV90IG5iX3ByZWRfY2FsbHMgPSAwOworICBzdGFibGVfcGFydGl0aW9uKHYxLmJlZ2luKCksIHYxLmVuZCgpLCBsZXNzX24oMTEsIG5iX3ByZWRfY2FsbHMpKTsKKworICBDUFBVTklUX0FTU0VSVCh2MVswXT09NSk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzFdPT01KTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbMl09PTIpOworICBDUFBVTklUX0FTU0VSVCh2MVszXT09MTApOworICBDUFBVTklUX0FTU0VSVCh2MVs0XT09MCk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzVdPT01KTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbNl09PTApOworICBDUFBVTklUX0FTU0VSVCh2MVs3XT09MCk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzhdPT0xMik7CisgIENQUFVOSVRfQVNTRVJUKHYxWzldPT0xOSk7CisgIENQUFVOSVRfQVNTRVJUKCBuYl9wcmVkX2NhbGxzID09IHYxLnNpemUoKSApOworfQordm9pZCBQYXJ0aXRpb25UZXN0OjpwdGl0aW9uMCgpCit7CisgIGludCBudW1iZXJzWzZdID0geyA2LCAxMiwgMywgMTAsIDEsIDIwIH07CisgIHNpemVfdCBuYl9wcmVkX2NhbGxzID0gMDsKKyAgLy8gNiAxIDMgMTAgMTIgMjAKKyAgcGFydGl0aW9uKChpbnQqKW51bWJlcnMsIChpbnQqKW51bWJlcnMgKyA2LCBsZXNzX24oMTAsIG5iX3ByZWRfY2FsbHMpKTsKKyAgQ1BQVU5JVF9BU1NFUlQobnVtYmVyc1swXT09Nik7CisgIENQUFVOSVRfQVNTRVJUKG51bWJlcnNbMV09PTEpOworICBDUFBVTklUX0FTU0VSVChudW1iZXJzWzJdPT0zKTsKKyAgQ1BQVU5JVF9BU1NFUlQobnVtYmVyc1szXT09MTApOworICBDUFBVTklUX0FTU0VSVChudW1iZXJzWzRdPT0xMik7CisgIENQUFVOSVRfQVNTRVJUKG51bWJlcnNbNV09PTIwKTsKKworICBDUFBVTklUX0FTU0VSVCggbmJfcHJlZF9jYWxscyA9PSBzaXplb2YobnVtYmVycykgLyBzaXplb2YobnVtYmVyc1swXSkgKTsKK30KK3ZvaWQgUGFydGl0aW9uVGVzdDo6cHRpdGlvbjEoKQoreworICAvLyAxOSAzIDExIDE0IDEwIDE5IDggMTcgOSA2CisgIC8vIDYgMyA5IDggMTAgMTkgMTQgMTcgMTEgMTkKKworICBpbnQgbnVtYmVyc1sxMF0gPXsgMTksIDMsIDExLCAxNCwgMTAsIDE5LCA4LCAxNywgOSwgNiB9OworCisgIHZlY3RvciA8aW50PiB2MShudW1iZXJzLCBudW1iZXJzKzEwKTsKKyAgc2l6ZV90IG5iX3ByZWRfY2FsbHMgPSAwOworICBwYXJ0aXRpb24odjEuYmVnaW4oKSwgdjEuZW5kKCksIGxlc3NfbigxMSwgbmJfcHJlZF9jYWxscykpOworCisgIENQUFVOSVRfQVNTRVJUKHYxWzBdPT02KTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbMV09PTMpOworICBDUFBVTklUX0FTU0VSVCh2MVsyXT09OSk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzNdPT04KTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbNF09PTEwKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbNV09PTE5KTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbNl09PTE0KTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbN109PTE3KTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbOF09PTExKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbOV09PTE5KTsKKyAgQ1BQVU5JVF9BU1NFUlQoIG5iX3ByZWRfY2FsbHMgPT0gdjEuc2l6ZSgpICk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvcGVybV90ZXN0LmNwcCBiL3Rlc3QvdW5pdC9wZXJtX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZTZlYTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvcGVybV90ZXN0LmNwcApAQCAtMCwwICsxLDIyOCBAQAorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8bnVtZXJpYz4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCisjaW5jbHVkZSAiaW90YS5oIgorI2luY2x1ZGUgImNwcHVuaXQvY3BwdW5pdF9wcm94eS5oIgorCisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IGRlZmluZWQoX1NUTFBfVVNFX05BTUVTUEFDRVMpCit1c2luZyBuYW1lc3BhY2Ugc3RkOworI2VuZGlmCisKKy8vCisvLyBUZXN0Q2FzZSBjbGFzcworLy8KK2NsYXNzIFBlcm1UZXN0IDogcHVibGljIENQUFVOSVRfTlM6OlRlc3RDYXNlCit7CisgIENQUFVOSVRfVEVTVF9TVUlURShQZXJtVGVzdCk7CisgIENQUFVOSVRfVEVTVChuZXh0cHJtMCk7CisgIENQUFVOSVRfVEVTVChuZXh0cHJtMSk7CisgIENQUFVOSVRfVEVTVChuZXh0cHJtMik7CisgIENQUFVOSVRfVEVTVChwcmV2cHJtMCk7CisgIENQUFVOSVRfVEVTVChwcmV2cHJtMSk7CisgIENQUFVOSVRfVEVTVChwcmV2cHJtMik7CisgIENQUFVOSVRfVEVTVF9TVUlURV9FTkQoKTsKKworcHJvdGVjdGVkOgorICB2b2lkIG5leHRwcm0wKCk7CisgIHZvaWQgbmV4dHBybTEoKTsKKyAgdm9pZCBuZXh0cHJtMigpOworICB2b2lkIHByZXZwcm0wKCk7CisgIHZvaWQgcHJldnBybTEoKTsKKyAgdm9pZCBwcmV2cHJtMigpOworfTsKKworQ1BQVU5JVF9URVNUX1NVSVRFX1JFR0lTVFJBVElPTihQZXJtVGVzdCk7CisKKy8vCisvLyB0ZXN0cyBpbXBsZW1lbnRhdGlvbgorLy8KK3ZvaWQgUGVybVRlc3Q6OnByZXZwcm0wKCkKK3sKKyAgaW50IHYxWzNdID0geyAwLCAxLCAyIH07CisgIHByZXZfcGVybXV0YXRpb24odjEsIHYxICsgMyk7CisKKyAgQ1BQVU5JVF9BU1NFUlQodjFbMF09PTIpOworICBDUFBVTklUX0FTU0VSVCh2MVsxXT09MSk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzJdPT0wKTsKK30KK3ZvaWQgUGVybVRlc3Q6OnByZXZwcm0xKCkKK3sKKyAgdmVjdG9yIDxpbnQ+IHYxKDMpOworICBfX2lvdGEodjEuYmVnaW4oKSwgdjEuZW5kKCksIDApOworCisgIHByZXZfcGVybXV0YXRpb24odjEuYmVnaW4oKSwgdjEuZW5kKCkpOworICBDUFBVTklUX0FTU0VSVCh2MVswXT09Mik7CisgIENQUFVOSVRfQVNTRVJUKHYxWzFdPT0xKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbMl09PTApOworICBwcmV2X3Blcm11dGF0aW9uKHYxLmJlZ2luKCksIHYxLmVuZCgpKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbMF09PTIpOworICBDUFBVTklUX0FTU0VSVCh2MVsxXT09MCk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzJdPT0xKTsKKyAgcHJldl9wZXJtdXRhdGlvbih2MS5iZWdpbigpLCB2MS5lbmQoKSk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzBdPT0xKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbMV09PTIpOworICBDUFBVTklUX0FTU0VSVCh2MVsyXT09MCk7CisgIHByZXZfcGVybXV0YXRpb24odjEuYmVnaW4oKSwgdjEuZW5kKCkpOworICBDUFBVTklUX0FTU0VSVCh2MVswXT09MSk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzFdPT0wKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbMl09PTIpOworICBwcmV2X3Blcm11dGF0aW9uKHYxLmJlZ2luKCksIHYxLmVuZCgpKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbMF09PTApOworICBDUFBVTklUX0FTU0VSVCh2MVsxXT09Mik7Ly8KKyAgQ1BQVU5JVF9BU1NFUlQodjFbMl09PTEpOworICBwcmV2X3Blcm11dGF0aW9uKHYxLmJlZ2luKCksIHYxLmVuZCgpKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbMF09PTApOworICBDUFBVTklUX0FTU0VSVCh2MVsxXT09MSk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzJdPT0yKTsKKyAgcHJldl9wZXJtdXRhdGlvbih2MS5iZWdpbigpLCB2MS5lbmQoKSk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzBdPT0yKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbMV09PTEpOworICBDUFBVTklUX0FTU0VSVCh2MVsyXT09MCk7CisgIHByZXZfcGVybXV0YXRpb24odjEuYmVnaW4oKSwgdjEuZW5kKCkpOworICBDUFBVTklUX0FTU0VSVCh2MVswXT09Mik7CisgIENQUFVOSVRfQVNTRVJUKHYxWzFdPT0wKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbMl09PTEpOworICBwcmV2X3Blcm11dGF0aW9uKHYxLmJlZ2luKCksIHYxLmVuZCgpKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbMF09PTEpOworICBDUFBVTklUX0FTU0VSVCh2MVsxXT09Mik7CisgIENQUFVOSVRfQVNTRVJUKHYxWzJdPT0wKTsKK30KK3ZvaWQgUGVybVRlc3Q6OnByZXZwcm0yKCkKK3sKKyAgdmVjdG9yIDxpbnQ+IHYxKDMpOworICBfX2lvdGEodjEuYmVnaW4oKSwgdjEuZW5kKCksIDApOworCisgIHByZXZfcGVybXV0YXRpb24odjEuYmVnaW4oKSwgdjEuZW5kKCksIGdyZWF0ZXI8aW50PigpKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbMF09PTApOworICBDUFBVTklUX0FTU0VSVCh2MVsxXT09Mik7CisgIENQUFVOSVRfQVNTRVJUKHYxWzJdPT0xKTsKKyAgcHJldl9wZXJtdXRhdGlvbih2MS5iZWdpbigpLCB2MS5lbmQoKSwgZ3JlYXRlcjxpbnQ+KCkpOworICBDUFBVTklUX0FTU0VSVCh2MVswXT09MSk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzFdPT0wKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbMl09PTIpOworICBwcmV2X3Blcm11dGF0aW9uKHYxLmJlZ2luKCksIHYxLmVuZCgpLCBncmVhdGVyPGludD4oKSk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzBdPT0xKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbMV09PTIpOworICBDUFBVTklUX0FTU0VSVCh2MVsyXT09MCk7CisgIHByZXZfcGVybXV0YXRpb24odjEuYmVnaW4oKSwgdjEuZW5kKCksIGdyZWF0ZXI8aW50PigpKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbMF09PTIpOworICBDUFBVTklUX0FTU0VSVCh2MVsxXT09MCk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzJdPT0xKTsKKyAgcHJldl9wZXJtdXRhdGlvbih2MS5iZWdpbigpLCB2MS5lbmQoKSwgZ3JlYXRlcjxpbnQ+KCkpOworICBDUFBVTklUX0FTU0VSVCh2MVswXT09Mik7CisgIENQUFVOSVRfQVNTRVJUKHYxWzFdPT0xKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbMl09PTApOworICBwcmV2X3Blcm11dGF0aW9uKHYxLmJlZ2luKCksIHYxLmVuZCgpLCBncmVhdGVyPGludD4oKSk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzBdPT0wKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbMV09PTEpOworICBDUFBVTklUX0FTU0VSVCh2MVsyXT09Mik7CisgIHByZXZfcGVybXV0YXRpb24odjEuYmVnaW4oKSwgdjEuZW5kKCksIGdyZWF0ZXI8aW50PigpKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbMF09PTApOworICBDUFBVTklUX0FTU0VSVCh2MVsxXT09Mik7CisgIENQUFVOSVRfQVNTRVJUKHYxWzJdPT0xKTsKKyAgcHJldl9wZXJtdXRhdGlvbih2MS5iZWdpbigpLCB2MS5lbmQoKSwgZ3JlYXRlcjxpbnQ+KCkpOworICBDUFBVTklUX0FTU0VSVCh2MVswXT09MSk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzFdPT0wKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbMl09PTIpOworICBwcmV2X3Blcm11dGF0aW9uKHYxLmJlZ2luKCksIHYxLmVuZCgpLCBncmVhdGVyPGludD4oKSk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzBdPT0xKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbMV09PTIpOworICBDUFBVTklUX0FTU0VSVCh2MVsyXT09MCk7Cit9Cit2b2lkIFBlcm1UZXN0OjpuZXh0cHJtMCgpCit7CisgIGludCB2MVszXSA9IHsgMCwgMSwgMiB9OworICBuZXh0X3Blcm11dGF0aW9uKHYxLCB2MSArIDMpOworCisgIENQUFVOSVRfQVNTRVJUKHYxWzBdPT0wKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbMV09PTIpOworICBDUFBVTklUX0FTU0VSVCh2MVsyXT09MSk7Cit9Cit2b2lkIFBlcm1UZXN0OjpuZXh0cHJtMSgpCit7CisgIHZlY3RvciA8aW50PiB2MSgzKTsKKyAgX19pb3RhKHYxLmJlZ2luKCksIHYxLmVuZCgpLCAwKTsKKworICBuZXh0X3Blcm11dGF0aW9uKHYxLmJlZ2luKCksIHYxLmVuZCgpKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbMF09PTApOworICBDUFBVTklUX0FTU0VSVCh2MVsxXT09Mik7CisgIENQUFVOSVRfQVNTRVJUKHYxWzJdPT0xKTsKKyAgbmV4dF9wZXJtdXRhdGlvbih2MS5iZWdpbigpLCB2MS5lbmQoKSk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzBdPT0xKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbMV09PTApOworICBDUFBVTklUX0FTU0VSVCh2MVsyXT09Mik7CisgIG5leHRfcGVybXV0YXRpb24odjEuYmVnaW4oKSwgdjEuZW5kKCkpOworICBDUFBVTklUX0FTU0VSVCh2MVswXT09MSk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzFdPT0yKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbMl09PTApOworICBuZXh0X3Blcm11dGF0aW9uKHYxLmJlZ2luKCksIHYxLmVuZCgpKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbMF09PTIpOworICBDUFBVTklUX0FTU0VSVCh2MVsxXT09MCk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzJdPT0xKTsKKyAgbmV4dF9wZXJtdXRhdGlvbih2MS5iZWdpbigpLCB2MS5lbmQoKSk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzBdPT0yKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbMV09PTEpOworICBDUFBVTklUX0FTU0VSVCh2MVsyXT09MCk7CisgIG5leHRfcGVybXV0YXRpb24odjEuYmVnaW4oKSwgdjEuZW5kKCkpOworICBDUFBVTklUX0FTU0VSVCh2MVswXT09MCk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzFdPT0xKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbMl09PTIpOworICBuZXh0X3Blcm11dGF0aW9uKHYxLmJlZ2luKCksIHYxLmVuZCgpKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbMF09PTApOworICBDUFBVTklUX0FTU0VSVCh2MVsxXT09Mik7CisgIENQUFVOSVRfQVNTRVJUKHYxWzJdPT0xKTsKKyAgbmV4dF9wZXJtdXRhdGlvbih2MS5iZWdpbigpLCB2MS5lbmQoKSk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzBdPT0xKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbMV09PTApOworICBDUFBVTklUX0FTU0VSVCh2MVsyXT09Mik7CisgIG5leHRfcGVybXV0YXRpb24odjEuYmVnaW4oKSwgdjEuZW5kKCkpOworICBDUFBVTklUX0FTU0VSVCh2MVswXT09MSk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzFdPT0yKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbMl09PTApOworfQordm9pZCBQZXJtVGVzdDo6bmV4dHBybTIoKQoreworICB2ZWN0b3IgPGNoYXI+IHYxKDMpOworICBfX2lvdGEodjEuYmVnaW4oKSwgdjEuZW5kKCksICdBJyk7CisKKyAgbmV4dF9wZXJtdXRhdGlvbih2MS5iZWdpbigpLCB2MS5lbmQoKSwgbGVzczxjaGFyPigpKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbMF09PSdBJyk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzFdPT0nQycpOworICBDUFBVTklUX0FTU0VSVCh2MVsyXT09J0InKTsKKyAgbmV4dF9wZXJtdXRhdGlvbih2MS5iZWdpbigpLCB2MS5lbmQoKSwgbGVzczxjaGFyPigpKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbMF09PSdCJyk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzFdPT0nQScpOworICBDUFBVTklUX0FTU0VSVCh2MVsyXT09J0MnKTsKKyAgbmV4dF9wZXJtdXRhdGlvbih2MS5iZWdpbigpLCB2MS5lbmQoKSwgbGVzczxjaGFyPigpKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbMF09PSdCJyk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzFdPT0nQycpOworICBDUFBVTklUX0FTU0VSVCh2MVsyXT09J0EnKTsKKyAgbmV4dF9wZXJtdXRhdGlvbih2MS5iZWdpbigpLCB2MS5lbmQoKSwgbGVzczxjaGFyPigpKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbMF09PSdDJyk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzFdPT0nQScpOworICBDUFBVTklUX0FTU0VSVCh2MVsyXT09J0InKTsKKyAgbmV4dF9wZXJtdXRhdGlvbih2MS5iZWdpbigpLCB2MS5lbmQoKSwgbGVzczxjaGFyPigpKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbMF09PSdDJyk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzFdPT0nQicpOworICBDUFBVTklUX0FTU0VSVCh2MVsyXT09J0EnKTsKKyAgbmV4dF9wZXJtdXRhdGlvbih2MS5iZWdpbigpLCB2MS5lbmQoKSwgbGVzczxjaGFyPigpKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbMF09PSdBJyk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzFdPT0nQicpOworICBDUFBVTklUX0FTU0VSVCh2MVsyXT09J0MnKTsKKyAgbmV4dF9wZXJtdXRhdGlvbih2MS5iZWdpbigpLCB2MS5lbmQoKSwgbGVzczxjaGFyPigpKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbMF09PSdBJyk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzFdPT0nQycpOworICBDUFBVTklUX0FTU0VSVCh2MVsyXT09J0InKTsKKyAgbmV4dF9wZXJtdXRhdGlvbih2MS5iZWdpbigpLCB2MS5lbmQoKSwgbGVzczxjaGFyPigpKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbMF09PSdCJyk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzFdPT0nQScpOworICBDUFBVTklUX0FTU0VSVCh2MVsyXT09J0MnKTsKKyAgbmV4dF9wZXJtdXRhdGlvbih2MS5iZWdpbigpLCB2MS5lbmQoKSwgbGVzczxjaGFyPigpKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbMF09PSdCJyk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzFdPT0nQycpOworICBDUFBVTklUX0FTU0VSVCh2MVsyXT09J0EnKTsKKworfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L3BsdXNtaW51c190ZXN0LmNwcCBiL3Rlc3QvdW5pdC9wbHVzbWludXNfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU2ZjVjNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9wbHVzbWludXNfdGVzdC5jcHAKQEAgLTAsMCArMSw1MiBAQAorI2luY2x1ZGUgPG51bWVyaWM+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisKKyNpbmNsdWRlICJjcHB1bml0L2NwcHVuaXRfcHJveHkuaCIKKworI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkKF9TVExQX1VTRV9OQU1FU1BBQ0VTKQordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyNlbmRpZgorCisvLworLy8gVGVzdENhc2UgY2xhc3MKKy8vCitjbGFzcyBQbHVzTWludXNUZXN0IDogcHVibGljIENQUFVOSVRfTlM6OlRlc3RDYXNlCit7CisgIENQUFVOSVRfVEVTVF9TVUlURShQbHVzTWludXNUZXN0KTsKKyAgQ1BQVU5JVF9URVNUKHBsdXMwKTsKKyAgQ1BQVU5JVF9URVNUKG1pbnVzMCk7CisgIENQUFVOSVRfVEVTVF9TVUlURV9FTkQoKTsKKworcHJvdGVjdGVkOgorICB2b2lkIHBsdXMwKCk7CisgIHZvaWQgbWludXMwKCk7Cit9OworCitDUFBVTklUX1RFU1RfU1VJVEVfUkVHSVNUUkFUSU9OKFBsdXNNaW51c1Rlc3QpOworCisvLworLy8gdGVzdHMgaW1wbGVtZW50YXRpb24KKy8vCit2b2lkIFBsdXNNaW51c1Rlc3Q6OnBsdXMwKCkKK3sKKyAgaW50IGlucHV0MSBbNF0gPSB7IDEsIDYsIDExLCA4IH07CisgIGludCBpbnB1dDIgWzRdID0geyAxLCA1LCAyLCAzIH07CisKKyAgaW50IHRvdGFsID0gaW5uZXJfcHJvZHVjdChpbnB1dDEsIGlucHV0MSArIDQsIGlucHV0MiwgMCwgcGx1czxpbnQ+KCksIG11bHRpcGxpZXMgPGludD4oKSk7CisKKyAgQ1BQVU5JVF9BU1NFUlQodG90YWw9PTc3KTsKK30KK3ZvaWQgUGx1c01pbnVzVGVzdDo6bWludXMwKCkKK3sKKyAgaW50IGlucHV0MSBbNF0gPSB7IDEsIDUsIDcsIDggfTsKKyAgaW50IGlucHV0MiBbNF0gPSB7IDEsIDQsIDgsIDMgfTsKKworICBpbnQgb3V0cHV0IFs0XTsKKworICB0cmFuc2Zvcm0oKGludCopaW5wdXQxLCAoaW50KilpbnB1dDEgKyA0LCAoaW50KilpbnB1dDIsIChpbnQqKW91dHB1dCwgbWludXM8aW50PigpKTsKKyAgQ1BQVU5JVF9BU1NFUlQob3V0cHV0WzBdPT0wKTsKKyAgQ1BQVU5JVF9BU1NFUlQob3V0cHV0WzFdPT0xKTsKKyAgQ1BQVU5JVF9BU1NFUlQob3V0cHV0WzJdPT0tMSk7CisgIENQUFVOSVRfQVNTRVJUKG91dHB1dFszXT09NSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvcHRyMl90ZXN0LmNwcCBiL3Rlc3QvdW5pdC9wdHIyX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMTE1NWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvcHRyMl90ZXN0LmNwcApAQCAtMCwwICsxLDg0IEBACisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCisjaW5jbHVkZSAiY3BwdW5pdC9jcHB1bml0X3Byb3h5LmgiCisKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZChfU1RMUF9VU0VfTkFNRVNQQUNFUykKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisjZW5kaWYKKworLy8KKy8vIFRlc3RDYXNlIGNsYXNzCisvLworY2xhc3MgUHRyMlRlc3QgOiBwdWJsaWMgQ1BQVU5JVF9OUzo6VGVzdENhc2UKK3sKKyAgQ1BQVU5JVF9URVNUX1NVSVRFKFB0cjJUZXN0KTsKKyAgQ1BQVU5JVF9URVNUKHB0cmJpbjEpOworICBDUFBVTklUX1RFU1QocHRyYmluMik7CisgIENQUFVOSVRfVEVTVChwdHJ1bjEpOworICBDUFBVTklUX1RFU1QocHRydW4yKTsKKyAgQ1BQVU5JVF9URVNUX1NVSVRFX0VORCgpOworCitwcm90ZWN0ZWQ6CisgIHZvaWQgcHRyYmluMSgpOworICB2b2lkIHB0cmJpbjIoKTsKKyAgdm9pZCBwdHJ1bjEoKTsKKyAgdm9pZCBwdHJ1bjIoKTsKK307CisKK0NQUFVOSVRfVEVTVF9TVUlURV9SRUdJU1RSQVRJT04oUHRyMlRlc3QpOworCisvLworLy8gdGVzdHMgaW1wbGVtZW50YXRpb24KKy8vCitzdGF0aWMgaW50IHN1bShpbnQgeF8sIGludCB5XykKK3sKKyAgcmV0dXJuIHhfICsgeV87Cit9Citib29sIGV2ZW4oaW50IG5fKQoreworICByZXR1cm4obl8gJSAyKSA9PSAwOworfQordm9pZCBQdHIyVGVzdDo6cHRyYmluMSgpCit7CisgIGludCBpbnB1dDEgWzRdID0geyA3LCAyLCAzLCA1IH07CisgIGludCBpbnB1dDIgWzRdID0geyAxLCA1LCA1LCA4IH07CisKKyAgaW50IG91dHB1dCBbNF07CisgIHRyYW5zZm9ybSgoaW50KilpbnB1dDEsIChpbnQqKWlucHV0MSArIDQsIChpbnQqKWlucHV0MiwgKGludCopb3V0cHV0LCBwb2ludGVyX3RvX2JpbmFyeV9mdW5jdGlvbjxpbnQsIGludCwgaW50PihzdW0pKTsKKworICBDUFBVTklUX0FTU0VSVChvdXRwdXRbMF09PTgpOworICBDUFBVTklUX0FTU0VSVChvdXRwdXRbMV09PTcpOworICBDUFBVTklUX0FTU0VSVChvdXRwdXRbMl09PTgpOworICBDUFBVTklUX0FTU0VSVChvdXRwdXRbM109PTEzKTsKK30KK3ZvaWQgUHRyMlRlc3Q6OnB0cmJpbjIoKQoreworICBpbnQgaW5wdXQxIFs0XSA9IHsgNywgMiwgMywgNSB9OworICBpbnQgaW5wdXQyIFs0XSA9IHsgMSwgNSwgNSwgOCB9OworCisgIGludCBvdXRwdXQgWzRdOworICB0cmFuc2Zvcm0oKGludCopaW5wdXQxLCAoaW50KilpbnB1dDEgKyA0LCAoaW50KilpbnB1dDIsIChpbnQqKW91dHB1dCwgcHRyX2Z1bihzdW0pKTsKKworICBDUFBVTklUX0FTU0VSVChvdXRwdXRbMF09PTgpOworICBDUFBVTklUX0FTU0VSVChvdXRwdXRbMV09PTcpOworICBDUFBVTklUX0FTU0VSVChvdXRwdXRbMl09PTgpOworICBDUFBVTklUX0FTU0VSVChvdXRwdXRbM109PTEzKTsKK30KK3ZvaWQgUHRyMlRlc3Q6OnB0cnVuMSgpCit7CisgIGludCBhcnJheSBbM10gPSB7IDEsIDIsIDMgfTsKKworICBpbnQqIHAgPSBmaW5kX2lmKChpbnQqKWFycmF5LCAoaW50KilhcnJheSArIDMsIHBvaW50ZXJfdG9fdW5hcnlfZnVuY3Rpb248aW50LCBib29sPihldmVuKSk7CisgIENQUFVOSVRfQVNTRVJUKHAgIT0gYXJyYXkrMyk7CisgIENQUFVOSVRfQVNTRVJUKCpwPT0yKTsKK30KK3ZvaWQgUHRyMlRlc3Q6OnB0cnVuMigpCit7CisgIGludCBhcnJheSBbM10gPSB7IDEsIDIsIDMgfTsKKworICBpbnQqIHAgPSBmaW5kX2lmKChpbnQqKWFycmF5LCAoaW50KilhcnJheSArIDMsIHB0cl9mdW4oZXZlbikpOworICBDUFBVTklUX0FTU0VSVChwICE9IGFycmF5KzMpOworICBDUFBVTklUX0FTU0VSVCgqcD09Mik7Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvcHRyc3BlY190ZXN0LmNwcCBiL3Rlc3QvdW5pdC9wdHJzcGVjX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMGZjZjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvcHRyc3BlY190ZXN0LmNwcApAQCAtMCwwICsxLDIzMiBAQAorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxsaXN0PgorI2lmIGRlZmluZWQgKFNUTFBPUlQpICYmICFkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQorIyAgaW5jbHVkZSA8c2xpc3Q+CisjZW5kaWYKKyNpbmNsdWRlIDxkZXF1ZT4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisKKyNpbmNsdWRlICJjcHB1bml0L2NwcHVuaXRfcHJveHkuaCIKKworI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkKF9TVExQX1VTRV9OQU1FU1BBQ0VTKQordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyNlbmRpZgorCisvLworLy8gVGVzdENhc2UgY2xhc3MKKy8vCitjbGFzcyBQdHJTcGVjVGVzdCA6IHB1YmxpYyBDUFBVTklUX05TOjpUZXN0Q2FzZQoreworICBDUFBVTklUX1RFU1RfU1VJVEUoUHRyU3BlY1Rlc3QpOworICBDUFBVTklUX1RFU1QocHRyX3NwZWNpYWxpemF0aW9uX3Rlc3QpOworICBDUFBVTklUX1RFU1QoZnVuY3Rpb25fcG9pbnRlcik7CisgIENQUFVOSVRfVEVTVF9TVUlURV9FTkQoKTsKKworcHJvdGVjdGVkOgorICAvLy8gdGhpcyBzZWVtcyB0byBiZSBjb21waWxlIG9ubHkgdGVzdCBidXQuLi4KKyAgdm9pZCBwdHJfc3BlY2lhbGl6YXRpb25fdGVzdCgpOworICB2b2lkIGZ1bmN0aW9uX3BvaW50ZXIoKTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICBzdHJ1Y3QgdW5hcnlfcHJlZCB7CisgICAgYm9vbCBvcGVyYXRvciAoKSAoX1RwICpfX3B0cikgY29uc3QgeworICAgICByZXR1cm4gKl9fcHRyID09IDA7CisgICAgfQorICB9OworCisgIHRlbXBsYXRlIDxjbGFzcyBfVHA+CisgIHN0cnVjdCBiaW5hcnlfcHJlZCB7CisgICAgYm9vbCBvcGVyYXRvciAoKSAoX1RwICpfX2ZpcnN0LCBfVHAgKl9fc2Vjb25kKSBjb25zdCB7CisgICAgICByZXR1cm4gKl9fZmlyc3QgPCAqX19zZWNvbmQ7CisgICAgfQorICB9OworfTsKKworQ1BQVU5JVF9URVNUX1NVSVRFX1JFR0lTVFJBVElPTihQdHJTcGVjVGVzdCk7CisKKyNkZWZpbmUgVEVTVF9JTlNUQU5DSUFURV9DT05UQUlORVIoY29udCkgXAorICB0ZW1wbGF0ZSBjbGFzcyBjb250PGludCo+OyBcCisgIHRlbXBsYXRlIGNsYXNzIGNvbnQ8aW50IGNvbnN0Kj47IFwKKyAgdGVtcGxhdGUgY2xhc3MgY29udDxpbnQgdm9sYXRpbGUqPjsgXAorICB0ZW1wbGF0ZSBjbGFzcyBjb250PGludCBjb25zdCB2b2xhdGlsZSo+CisKKyNpZiAhZGVmaW5lZChfTVNDX1ZFUikgfHwgKF9NU0NfVkVSID4gMTIwMCkgIC8vIGV4Y2x1ZGluZyBNU1ZDIDYuMAorVEVTVF9JTlNUQU5DSUFURV9DT05UQUlORVIodmVjdG9yKTsKK1RFU1RfSU5TVEFOQ0lBVEVfQ09OVEFJTkVSKGxpc3QpOworIyAgaWYgZGVmaW5lZCAoU1RMUE9SVCkgJiYgIWRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpCitURVNUX0lOU1RBTkNJQVRFX0NPTlRBSU5FUihzbGlzdCk7CisjICBlbmRpZgorVEVTVF9JTlNUQU5DSUFURV9DT05UQUlORVIoZGVxdWUpOworVEVTVF9JTlNUQU5DSUFURV9DT05UQUlORVIoc2V0KTsKK1RFU1RfSU5TVEFOQ0lBVEVfQ09OVEFJTkVSKG11bHRpc2V0KTsKKyNlbmRpZgorCisvL0Z1bmN0aW9uIHRvIHRlc3QgcG9pbnRlciB0byBmdW5jdGlvbiBzdXBwb3J0Ogordm9pZCBGVHlwZUluc3RhbmNlKCkge30KKworLy9DbGFzcyB0byB0ZXN0IHBvaW50ZXIgdG8gbWVtYmVyIG1ldGhvZCBzdXBwb3J0OgorY2xhc3MgQUNsYXNzIHsKK3B1YmxpYzoKKyAgdm9pZCBmdW5jKCkge30KK307CisKKy8vCisvLyB0ZXN0cyBpbXBsZW1lbnRhdGlvbgorLy8KK3ZvaWQgUHRyU3BlY1Rlc3Q6OnB0cl9zcGVjaWFsaXphdGlvbl90ZXN0KCkKK3sKKyAgaW50ICppbnRfYXJyYXlbXSA9IHswLCAwLCAwfTsKKyAgaW50IGNvbnN0KiBjaW50X2FycmF5W10gPSB7MCwgMCwgMH07CisKKyAgeworICAgIHZlY3Rvcjx2b2lkKj4gdm9pZF92ZWN0OworICAgIGRlcXVlPHZvaWQqPiB2b2lkX2RlcXVlOworICAgIGxpc3Q8dm9pZCo+IHZvaWRfbGlzdDsKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKKyAgICBzbGlzdDx2b2lkKj4gdm9pZF9zbGlzdDsKKyNlbmRpZgorICB9CisKKyAgeworICAgIHR5cGVkZWYgdm9pZCAoKkZUeXBlKSgpOworICAgIHZlY3RvcjxGVHlwZT4gZnVuY192ZWN0b3I7CisgICAgZnVuY192ZWN0b3IucHVzaF9iYWNrKCZGVHlwZUluc3RhbmNlKTsKKyAgfQorCisjaWYgIWRlZmluZWQoX19HTlVDX18pIHx8IChfX0dOVUNfXyA+IDIpCisgIHsKKyAgICB0eXBlZGVmIHZvaWQgKEFDbGFzczo6Kk1GVHlwZSkoKTsKKyAgICB2ZWN0b3I8TUZUeXBlPiBtZW1fZnVuY192ZWN0b3I7CisgICAgbWVtX2Z1bmNfdmVjdG9yLnB1c2hfYmFjaygmQUNsYXNzOjpmdW5jKTsKKyAgfQorI2VuZGlmCisKKyAgdmVjdG9yPGludCo+IHBpbnRfdmVjdDsKKyAgdmVjdG9yPGludCo+IHBpbnRfdmVjdDI7CisgIHZlY3RvcjxpbnQgY29uc3QqPiBwY2ludF92ZWN0OworICBsaXN0PGludCo+IHBpbnRfbGlzdDsKKyAgbGlzdDxpbnQqPiBwaW50X2xpc3QyOworICBsaXN0PGludCBjb25zdCo+IHBjaW50X2xpc3Q7CisjaWYgZGVmaW5lZCAoU1RMUE9SVCkgJiYgIWRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpCisgIHNsaXN0PGludCo+IHBpbnRfc2xpc3Q7CisgIHNsaXN0PGludCo+IHBpbnRfc2xpc3QyOworICBzbGlzdDxpbnQgY29uc3QqPiBwY2ludF9zbGlzdDsKKyNlbmRpZgorICBkZXF1ZTxpbnQqPiBwaW50X2RlcXVlOworICBkZXF1ZTxpbnQqPiBwaW50X2RlcXVlMjsKKyAgZGVxdWU8aW50IGNvbnN0Kj4gcGNpbnRfZGVxdWU7CisKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyAgdmVjdG9yPGludCo+IHBpbnRfdmVjdF9mcm9tX2xpc3QocGludF9saXN0LmJlZ2luKCksIHBpbnRfbGlzdC5lbmQoKSk7CisjZW5kaWYKKyAgcGludF92ZWN0Lmluc2VydChwaW50X3ZlY3QuZW5kKCksIHBpbnRfdmVjdDIuYmVnaW4oKSwgcGludF92ZWN0Mi5lbmQoKSk7CisgIHBpbnRfdmVjdC5pbnNlcnQocGludF92ZWN0LmVuZCgpLCBpbnRfYXJyYXksIGludF9hcnJheSArIDMpOworICBwaW50X3ZlY3QyLmluc2VydChwaW50X3ZlY3QyLmVuZCgpLCBpbnRfYXJyYXksIGludF9hcnJheSArIDMpOworICBwY2ludF92ZWN0Lmluc2VydChwY2ludF92ZWN0LmVuZCgpLCBpbnRfYXJyYXksIGludF9hcnJheSArIDMpOworICBwY2ludF92ZWN0Lmluc2VydChwY2ludF92ZWN0LmVuZCgpLCBjaW50X2FycmF5LCBjaW50X2FycmF5ICsgMyk7CisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8ICFkZWZpbmVkKF9TVExQX0RFQlVHKSB8fCBkZWZpbmVkKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIHBjaW50X3ZlY3QuaW5zZXJ0KHBjaW50X3ZlY3QuZW5kKCksIHBpbnRfdmVjdDIuYmVnaW4oKSwgcGludF92ZWN0Mi5lbmQoKSk7CisjZW5kaWYKKyAgcGNpbnRfdmVjdC5pbnNlcnQocGNpbnRfdmVjdC5lbmQoKSwgaW50X2FycmF5LCBpbnRfYXJyYXkgKyAzKTsKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyAgcGludF92ZWN0Lmluc2VydChwaW50X3ZlY3QuZW5kKCksIHBpbnRfbGlzdC5iZWdpbigpLCBwaW50X2xpc3QuZW5kKCkpOworICBwY2ludF92ZWN0Lmluc2VydChwY2ludF92ZWN0LmVuZCgpLCBwaW50X2xpc3QuYmVnaW4oKSwgcGludF9saXN0LmVuZCgpKTsKKyAgcGNpbnRfdmVjdC5pbnNlcnQocGNpbnRfdmVjdC5lbmQoKSwgcGNpbnRfbGlzdC5iZWdpbigpLCBwY2ludF9saXN0LmVuZCgpKTsKKyAgcGludF92ZWN0LmFzc2lnbihwaW50X2xpc3QuYmVnaW4oKSwgcGludF9saXN0LmVuZCgpKTsKKyAgcGNpbnRfdmVjdC5hc3NpZ24ocGludF9saXN0LmJlZ2luKCksIHBpbnRfbGlzdC5lbmQoKSk7CisjZW5kaWYKKyAgcGludF92ZWN0LmFzc2lnbihpbnRfYXJyYXksIGludF9hcnJheSArIDMpOworICBwY2ludF92ZWN0LmFzc2lnbihpbnRfYXJyYXksIGludF9hcnJheSArIDMpOworICBwY2ludF92ZWN0LmFzc2lnbihjaW50X2FycmF5LCBjaW50X2FycmF5ICsgMyk7CisgIGNvcHkoaW50X2FycmF5LCBpbnRfYXJyYXkgKyAzLCBiYWNrX2luc2VydGVyKHBpbnRfdmVjdCkpOworCisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIHBpbnRfbGlzdC5zb3J0KGJpbmFyeV9wcmVkPGludD4oKSk7CisgIHBjaW50X2xpc3Quc29ydChiaW5hcnlfcHJlZDxpbnQgY29uc3Q+KCkpOworICBwaW50X2xpc3QudW5pcXVlKGJpbmFyeV9wcmVkPGludD4oKSk7CisgIHBjaW50X2xpc3QudW5pcXVlKGJpbmFyeV9wcmVkPGludCBjb25zdD4oKSk7CisgIHBpbnRfbGlzdC5tZXJnZShwaW50X2xpc3QsIGJpbmFyeV9wcmVkPGludD4oKSk7CisgIHBjaW50X2xpc3QubWVyZ2UocGNpbnRfbGlzdCwgYmluYXJ5X3ByZWQ8aW50IGNvbnN0PigpKTsKKyAgcGludF9saXN0LnJlbW92ZV9pZih1bmFyeV9wcmVkPGludD4oKSk7CisgIHBjaW50X2xpc3QucmVtb3ZlX2lmKHVuYXJ5X3ByZWQ8aW50IGNvbnN0PigpKTsKKyNlbmRpZgorCisgIGNvcHkoaW50X2FycmF5LCBpbnRfYXJyYXkgKyAzLCBiYWNrX2luc2VydGVyKHBpbnRfbGlzdCkpOworICBjb3B5KGludF9hcnJheSwgaW50X2FycmF5ICsgMywgYmFja19pbnNlcnRlcihwaW50X2xpc3QyKSk7CisgIHBpbnRfbGlzdC5pbnNlcnQocGludF9saXN0LmVuZCgpLCBwaW50X2xpc3QyLmJlZ2luKCksIHBpbnRfbGlzdDIuZW5kKCkpOworI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICBwY2ludF9saXN0Lmluc2VydChwY2ludF9saXN0LmVuZCgpLCBwaW50X2xpc3QuYmVnaW4oKSwgcGludF9saXN0LmVuZCgpKTsKKyNlbmRpZgorI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCAhZGVmaW5lZChfU1RMUF9ERUJVRykgfHwgZGVmaW5lZChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICBwaW50X2xpc3QuaW5zZXJ0KHBpbnRfbGlzdC5lbmQoKSwgcGludF92ZWN0LmJlZ2luKCksIHBpbnRfdmVjdC5lbmQoKSk7CisgIHBjaW50X2xpc3QuaW5zZXJ0KHBjaW50X2xpc3QuZW5kKCksIHBpbnRfdmVjdC5iZWdpbigpLCBwaW50X3ZlY3QuZW5kKCkpOworICBwY2ludF9saXN0Lmluc2VydChwY2ludF9saXN0LmVuZCgpLCBwY2ludF92ZWN0LmJlZ2luKCksIHBjaW50X3ZlY3QuZW5kKCkpOworICBsaXN0PGludCo+IHBpbnRfbGlzdF9mcm9tX3ZlY3QocGludF92ZWN0LmJlZ2luKCksIHBpbnRfdmVjdC5lbmQoKSk7CisgIHBpbnRfbGlzdC5hc3NpZ24ocGludF92ZWN0LmJlZ2luKCksIHBpbnRfdmVjdC5lbmQoKSk7CisgIHBjaW50X2xpc3QuYXNzaWduKHBpbnRfdmVjdC5iZWdpbigpLCBwaW50X3ZlY3QuZW5kKCkpOworI2VuZGlmCisgIHBpbnRfbGlzdC5pbnNlcnQocGludF9saXN0LmJlZ2luKCksIGludF9hcnJheSwgaW50X2FycmF5ICsgMyk7CisgIHBpbnRfbGlzdC5pbnNlcnQocGludF9saXN0LmVuZCgpLCBpbnRfYXJyYXksIGludF9hcnJheSArIDMpOworICBwY2ludF9saXN0Lmluc2VydChwY2ludF9saXN0LmVuZCgpLCBpbnRfYXJyYXksIGludF9hcnJheSArIDMpOworICBwY2ludF9saXN0Lmluc2VydChwY2ludF9saXN0LmVuZCgpLCBjaW50X2FycmF5LCBjaW50X2FycmF5ICsgMyk7CisgIHBpbnRfbGlzdC5hc3NpZ24oaW50X2FycmF5LCBpbnRfYXJyYXkgKyAzKTsKKyAgcGNpbnRfbGlzdC5hc3NpZ24oaW50X2FycmF5LCBpbnRfYXJyYXkgKyAzKTsKKyAgcGNpbnRfbGlzdC5hc3NpZ24oY2ludF9hcnJheSwgY2ludF9hcnJheSArIDMpOworICAvL3BpbnRfbGlzdC5hc3NpZ24ocGNpbnRfdmVjdC5iZWdpbigpLCBwY2ludF92ZWN0LmVuZCgpKTsKKworI2lmIGRlZmluZWQgKFNUTFBPUlQpICYmICFkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQorICBjb3B5KGludF9hcnJheSwgaW50X2FycmF5ICsgMywgZnJvbnRfaW5zZXJ0ZXIocGludF9zbGlzdCkpOworICBjb3B5KGludF9hcnJheSwgaW50X2FycmF5ICsgMywgZnJvbnRfaW5zZXJ0ZXIocGludF9zbGlzdDIpKTsKKyAgcGludF9zbGlzdC5pbnNlcnQocGludF9zbGlzdC5lbmQoKSwgcGludF9zbGlzdDIuYmVnaW4oKSwgcGludF9zbGlzdDIuZW5kKCkpOworIyAgaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyAgcGNpbnRfc2xpc3QuaW5zZXJ0KHBjaW50X3NsaXN0LmVuZCgpLCBwaW50X3NsaXN0LmJlZ2luKCksIHBpbnRfc2xpc3QuZW5kKCkpOworIyAgZW5kaWYKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9ERUJVRykgfHwgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyAgcGludF9zbGlzdC5pbnNlcnQocGludF9zbGlzdC5lbmQoKSwgcGludF92ZWN0LmJlZ2luKCksIHBpbnRfdmVjdC5lbmQoKSk7CisgIHBjaW50X3NsaXN0Lmluc2VydChwY2ludF9zbGlzdC5lbmQoKSwgcGludF92ZWN0LmJlZ2luKCksIHBpbnRfdmVjdC5lbmQoKSk7CisgIHBjaW50X3NsaXN0Lmluc2VydChwY2ludF9zbGlzdC5lbmQoKSwgcGNpbnRfdmVjdC5iZWdpbigpLCBwY2ludF92ZWN0LmVuZCgpKTsKKyAgc2xpc3Q8aW50Kj4gcGludF9zbGlzdF9mcm9tX3ZlY3QocGludF92ZWN0LmJlZ2luKCksIHBpbnRfdmVjdC5lbmQoKSk7CisgIHBpbnRfc2xpc3QuYXNzaWduKHBpbnRfdmVjdC5iZWdpbigpLCBwaW50X3ZlY3QuZW5kKCkpOworICBwY2ludF9zbGlzdC5hc3NpZ24ocGludF92ZWN0LmJlZ2luKCksIHBpbnRfdmVjdC5lbmQoKSk7CisjICBlbmRpZgorICBwaW50X3NsaXN0Lmluc2VydChwaW50X3NsaXN0LmVuZCgpLCBpbnRfYXJyYXksIGludF9hcnJheSArIDMpOworICBwY2ludF9zbGlzdC5pbnNlcnQocGNpbnRfc2xpc3QuZW5kKCksIGludF9hcnJheSwgaW50X2FycmF5ICsgMyk7CisgIHBjaW50X3NsaXN0Lmluc2VydChwY2ludF9zbGlzdC5lbmQoKSwgY2ludF9hcnJheSwgY2ludF9hcnJheSArIDMpOworICBwaW50X3NsaXN0LmFzc2lnbihpbnRfYXJyYXksIGludF9hcnJheSArIDMpOworICBwY2ludF9zbGlzdC5hc3NpZ24oaW50X2FycmF5LCBpbnRfYXJyYXkgKyAzKTsKKyAgcGNpbnRfc2xpc3QuYXNzaWduKGNpbnRfYXJyYXksIGNpbnRfYXJyYXkgKyAzKTsKKyAgLy9waW50X3NsaXN0LmFzc2lnbihwY2ludF92ZWN0LmJlZ2luKCksIHBjaW50X3ZlY3QuZW5kKCkpOworI2VuZGlmCisKKyAgY29weShpbnRfYXJyYXksIGludF9hcnJheSArIDMsIGJhY2tfaW5zZXJ0ZXIocGludF9kZXF1ZSkpOworICBjb3B5KGludF9hcnJheSwgaW50X2FycmF5ICsgMywgYmFja19pbnNlcnRlcihwaW50X2RlcXVlMikpOworICBwaW50X2RlcXVlLmluc2VydChwaW50X2RlcXVlLmVuZCgpLCBwaW50X2RlcXVlMi5iZWdpbigpLCBwaW50X2RlcXVlMi5lbmQoKSk7CisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIHBjaW50X2RlcXVlLmluc2VydChwY2ludF9kZXF1ZS5lbmQoKSwgcGludF9kZXF1ZS5iZWdpbigpLCBwaW50X2RlcXVlLmVuZCgpKTsKKyNlbmRpZgorI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCAhZGVmaW5lZChfU1RMUF9ERUJVRykgfHwgZGVmaW5lZChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICBwaW50X2RlcXVlLmluc2VydChwaW50X2RlcXVlLmVuZCgpLCBwaW50X3ZlY3QuYmVnaW4oKSwgcGludF92ZWN0LmVuZCgpKTsKKyAgcGNpbnRfZGVxdWUuaW5zZXJ0KHBjaW50X2RlcXVlLmVuZCgpLCBwaW50X3ZlY3QuYmVnaW4oKSwgcGludF92ZWN0LmVuZCgpKTsKKyAgcGNpbnRfZGVxdWUuaW5zZXJ0KHBjaW50X2RlcXVlLmVuZCgpLCBwY2ludF92ZWN0LmJlZ2luKCksIHBjaW50X3ZlY3QuZW5kKCkpOworICBkZXF1ZTxpbnQqPiBwaW50X2RlcXVlX2Zyb21fdmVjdChwaW50X3ZlY3QuYmVnaW4oKSwgcGludF92ZWN0LmVuZCgpKTsKKyAgcGludF9kZXF1ZS5hc3NpZ24ocGludF92ZWN0LmJlZ2luKCksIHBpbnRfdmVjdC5lbmQoKSk7CisgIHBjaW50X2RlcXVlLmFzc2lnbihwaW50X3ZlY3QuYmVnaW4oKSwgcGludF92ZWN0LmVuZCgpKTsKKyNlbmRpZgorICBwaW50X2RlcXVlLmluc2VydChwaW50X2RlcXVlLmVuZCgpLCBpbnRfYXJyYXksIGludF9hcnJheSArIDMpOworICBwY2ludF9kZXF1ZS5pbnNlcnQocGNpbnRfZGVxdWUuZW5kKCksIGludF9hcnJheSwgaW50X2FycmF5ICsgMyk7CisgIHBjaW50X2RlcXVlLmluc2VydChwY2ludF9kZXF1ZS5lbmQoKSwgY2ludF9hcnJheSwgY2ludF9hcnJheSArIDMpOworICBwaW50X2RlcXVlLmFzc2lnbihpbnRfYXJyYXksIGludF9hcnJheSArIDMpOworICBwY2ludF9kZXF1ZS5hc3NpZ24oaW50X2FycmF5LCBpbnRfYXJyYXkgKyAzKTsKKyAgcGNpbnRfZGVxdWUuYXNzaWduKGNpbnRfYXJyYXksIGNpbnRfYXJyYXkgKyAzKTsKK30KKwordHlwZWRlZiB2b2lkICgqRnVuYykoaW50KTsKK3ZvaWQgZjEoaW50KSB7fQorCit2b2lkIFB0clNwZWNUZXN0OjpmdW5jdGlvbl9wb2ludGVyKCkKK3sKKyAgdmVjdG9yPEZ1bmM+IGZzOworICBmcy5wdXNoX2JhY2soJmYxKTsKKyAgQ1BQVU5JVF9BU1NFUlQoICFmcy5lbXB0eSgpICk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvcXVldWVfaGVhZGVyX3Rlc3QuY3BwIGIvdGVzdC91bml0L3F1ZXVlX2hlYWRlcl90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTQ5YzIyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L3F1ZXVlX2hlYWRlcl90ZXN0LmNwcApAQCAtMCwwICsxLDggQEAKKy8qIFRoaXMgdGVzdCBwdXJwb3NlIGlzIHNpbXBseSB0byBjaGVjayBTdGFuZGFyZCBoZWFkZXIgaW5kZXBlbmRhbmN5IHRoYXQKKyAqIGlzIHRvIHNheSB0aGF0IHRoZSBoZWFkZXIgY2FuIGJlIGluY2x1ZGVkIGFsb25lIHdpdGhvdXQgYW55IHByZXZpb3VzCisgKiBpbmNsdWRlLgorICogQWRkaXRpb25uYWx5LCBmb3IgQyBTdGFuZGFyZCBoZWFkZXJzIHRoYXQgU1RMcG9ydCBleHBvc2UsIGl0IGNhbiBhbHNvIGJlCisgKiB1c2VkIHRvIGNoZWNrIHRoYXQgZmlsZXMgaW5jbHVkZWQgYnkgdGhvc2UgaGVhZGVycyBhcmUgY29tcGF0aWJsZSB3aXRoCisgKiBwdXJlIEMgY29tcGlsZXJzLgorICovCisjaW5jbHVkZSA8cXVldWU+CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvcXVldWVfdGVzdC5jcHAgYi90ZXN0L3VuaXQvcXVldWVfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU2YWRkMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9xdWV1ZV90ZXN0LmNwcApAQCAtMCwwICsxLDY0IEBACisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPGRlcXVlPgorI2luY2x1ZGUgPHF1ZXVlPgorCisjaW5jbHVkZSAiY3BwdW5pdC9jcHB1bml0X3Byb3h5LmgiCisKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZChfU1RMUF9VU0VfTkFNRVNQQUNFUykKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisjZW5kaWYKKworLy8KKy8vIFRlc3RDYXNlIGNsYXNzCisvLworY2xhc3MgUXVldWVUZXN0IDogcHVibGljIENQUFVOSVRfTlM6OlRlc3RDYXNlCit7CisgIENQUFVOSVRfVEVTVF9TVUlURShRdWV1ZVRlc3QpOworICBDUFBVTklUX1RFU1QocHF1ZXVlMSk7CisgIENQUFVOSVRfVEVTVChxdWV1ZTEpOworICBDUFBVTklUX1RFU1RfU1VJVEVfRU5EKCk7CisKK3Byb3RlY3RlZDoKKyAgdm9pZCBwcXVldWUxKCk7CisgIHZvaWQgcXVldWUxKCk7Cit9OworCitDUFBVTklUX1RFU1RfU1VJVEVfUkVHSVNUUkFUSU9OKFF1ZXVlVGVzdCk7CisKKy8vCisvLyB0ZXN0cyBpbXBsZW1lbnRhdGlvbgorLy8KK3ZvaWQgUXVldWVUZXN0OjpwcXVldWUxKCkKK3sKKyAgcHJpb3JpdHlfcXVldWU8aW50LCBkZXF1ZTxpbnQ+LCBsZXNzPGludD4gPiBxOworICBxLnB1c2goNDIpOworICBxLnB1c2goMTAxKTsKKyAgcS5wdXNoKDY5KTsKKworICBDUFBVTklUX0FTU0VSVCggcS50b3AoKT09MTAxICk7CisgIHEucG9wKCk7CisgIENQUFVOSVRfQVNTRVJUKCBxLnRvcCgpPT02OSApOworICBxLnBvcCgpOworICBDUFBVTklUX0FTU0VSVCggcS50b3AoKT09NDIgKTsKKyAgcS5wb3AoKTsKKworICBDUFBVTklUX0FTU0VSVChxLmVtcHR5KCkpOworfQordm9pZCBRdWV1ZVRlc3Q6OnF1ZXVlMSgpCit7CisgIHF1ZXVlPGludCwgbGlzdDxpbnQ+ID4gcTsKKyAgcS5wdXNoKDQyKTsKKyAgcS5wdXNoKDEwMSk7CisgIHEucHVzaCg2OSk7CisKKyAgQ1BQVU5JVF9BU1NFUlQoIHEuZnJvbnQoKT09NDIgKTsKKyAgcS5wb3AoKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHEuZnJvbnQoKT09MTAxICk7CisgIHEucG9wKCk7CisgIENQUFVOSVRfQVNTRVJUKCBxLmZyb250KCk9PTY5ICk7CisgIHEucG9wKCk7CisKKyAgQ1BQVU5JVF9BU1NFUlQocS5lbXB0eSgpKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9yYXdyaXRlcl90ZXN0LmNwcCBiL3Rlc3QvdW5pdC9yYXdyaXRlcl90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzg0MzhhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L3Jhd3JpdGVyX3Rlc3QuY3BwCkBAIC0wLDAgKzEsNjYgQEAKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiY3BwdW5pdC9jcHB1bml0X3Byb3h5LmgiCisKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZChfU1RMUF9VU0VfTkFNRVNQQUNFUykKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisjZW5kaWYKKworY2xhc3MgWAoreworICBwdWJsaWM6CisgICAgWChpbnQgaV8gPSAwKSA6IGkoaV8pIHt9CisgICAgflgoKSB7fQorICAgIG9wZXJhdG9yIGludCgpIGNvbnN0IHsgcmV0dXJuIGk7IH0KKworICBwcml2YXRlOgorICAgIGludCBpOworfTsKKworCisvLworLy8gVGVzdENhc2UgY2xhc3MKKy8vCitjbGFzcyBSYXdyaXRlclRlc3QgOiBwdWJsaWMgQ1BQVU5JVF9OUzo6VGVzdENhc2UKK3sKKyAgQ1BQVU5JVF9URVNUX1NVSVRFKFJhd3JpdGVyVGVzdCk7CisgIENQUFVOSVRfVEVTVChyYXdpdGVyMSk7CisgIENQUFVOSVRfVEVTVF9TVUlURV9FTkQoKTsKKworcHJvdGVjdGVkOgorICB2b2lkIHJhd2l0ZXIxKCk7Cit9OworCitDUFBVTklUX1RFU1RfU1VJVEVfUkVHSVNUUkFUSU9OKFJhd3JpdGVyVGVzdCk7CisKKy8vCisvLyB0ZXN0cyBpbXBsZW1lbnRhdGlvbgorLy8KK3ZvaWQgUmF3cml0ZXJUZXN0OjpyYXdpdGVyMSgpCit7CisgIGFsbG9jYXRvcjxYPiBhOworICB0eXBlZGVmIFgqIHhfcG9pbnRlcjsKKyAgeF9wb2ludGVyIHNhdmVfcCwgcDsKKyAgcCA9IGEuYWxsb2NhdGUoNSk7CisgIHNhdmVfcD1wOworICByYXdfc3RvcmFnZV9pdGVyYXRvcjxYKiwgWD4gcihwKTsKKyAgaW50IGk7CisgIGZvcihpID0gMDsgaSA8IDU7IGkrKykKKyAgICAqcisrID0gWChpKTsKKworICBDUFBVTklUX0FTU0VSVCgqcCsrID09IDApOworICBDUFBVTklUX0FTU0VSVCgqcCsrID09IDEpOworICBDUFBVTklUX0FTU0VSVCgqcCsrID09IDIpOworICBDUFBVTklUX0FTU0VSVCgqcCsrID09IDMpOworICBDUFBVTklUX0FTU0VSVCgqcCsrID09IDQpOworCisvLyNpZiBkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkIChfX0dOVUNfXykKKyAgYS5kZWFsbG9jYXRlKHNhdmVfcCwgNSk7CisvKgorI2Vsc2UKKyAgYS5kZWFsbG9jYXRlKHNhdmVfcCk7CisjZW5kaWYKKyovCit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvcmVmZXJlbmNlX3dyYXBwZXJfdGVzdC5jcHAgYi90ZXN0L3VuaXQvcmVmZXJlbmNlX3dyYXBwZXJfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUzZmI0MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9yZWZlcmVuY2Vfd3JhcHBlcl90ZXN0LmNwcApAQCAtMCwwICsxLDg1IEBACisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKworI2lmICFkZWZpbmVkKF9TVExQX05PX0VYVEVOU0lPTlMpICYmIGRlZmluZWQoX1NUTFBfVVNFX0JPT1NUX1NVUFBPUlQpCisKKyNpbmNsdWRlIDx0eXBlaW5mbz4KKyNpbmNsdWRlICJjcHB1bml0L2NwcHVuaXRfcHJveHkuaCIKKworI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkKF9TVExQX1VTRV9OQU1FU1BBQ0VTKQordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyNlbmRpZgorCitjbGFzcyBSZWZXcmFwcGVyVGVzdCA6CisgICAgcHVibGljIENQUFVOSVRfTlM6OlRlc3RDYXNlCit7CisgICAgQ1BQVU5JVF9URVNUX1NVSVRFKFJlZldyYXBwZXJUZXN0KTsKKyAgICBDUFBVTklUX1RFU1QocmVmKTsKKyAgICBDUFBVTklUX1RFU1QoY3JlZik7CisgICAgQ1BQVU5JVF9URVNUX1NVSVRFX0VORCgpOworCisgIHByb3RlY3RlZDoKKyAgICB2b2lkIHJlZigpOworICAgIHZvaWQgY3JlZigpOworfTsKKworQ1BQVU5JVF9URVNUX1NVSVRFX1JFR0lTVFJBVElPTihSZWZXcmFwcGVyVGVzdCk7CisKK3ZvaWQgUmVmV3JhcHBlclRlc3Q6OnJlZigpCit7CisgIHR5cGVkZWYgc3RkOjp0cjE6OnJlZmVyZW5jZV93cmFwcGVyPGludD4gcnJfdHlwZTsKKworICBDUFBVTklUX0NIRUNLKCAoOjpib29zdDo6aXNfY29udmVydGlibGU8cnJfdHlwZSwgaW50Jj46OnZhbHVlKSApOworICBDUFBVTklUX0NIRUNLKCAoOjpib29zdDo6aXNfc2FtZTxycl90eXBlOjp0eXBlLCBpbnQ+Ojp2YWx1ZSkgKTsKKworICBpbnQgaSA9IDE7CisgIGludCBqID0gMjsKKworICBycl90eXBlIHIxID0gc3RkOjp0cjE6OnJlZihpKTsKKworICBDUFBVTklUX0NIRUNLKCByMS5nZXQoKSA9PSAxICk7CisKKyAgcjEgPSBzdGQ6OnRyMTo6cmVmKGopOworCisgIENQUFVOSVRfQ0hFQ0soIHIxLmdldCgpID09IDIgKTsKKworICBpID0gMzsKKworICBDUFBVTklUX0NIRUNLKCByMS5nZXQoKSA9PSAyICk7CisKKyAgaiA9IDQ7CisKKyAgQ1BQVU5JVF9DSEVDSyggcjEuZ2V0KCkgPT0gNCApOworCisgIHIxLmdldCgpID0gNTsKKworICBDUFBVTklUX0NIRUNLKCBqID09IDUgKTsKK30KKwordm9pZCBSZWZXcmFwcGVyVGVzdDo6Y3JlZigpCit7CisgIHR5cGVkZWYgc3RkOjp0cjE6OnJlZmVyZW5jZV93cmFwcGVyPGNvbnN0IGludD4gY3JyX3R5cGU7CisKKyAgQ1BQVU5JVF9DSEVDSyggKDo6Ym9vc3Q6OmlzX2NvbnZlcnRpYmxlPGNycl90eXBlLCBjb25zdCBpbnQmPjo6dmFsdWUpICk7CisgIENQUFVOSVRfQ0hFQ0soICg6OmJvb3N0Ojppc19zYW1lPGNycl90eXBlOjp0eXBlLCBjb25zdCBpbnQ+Ojp2YWx1ZSkgKTsKKworICBpbnQgaSA9IDE7CisgIGludCBqID0gMjsKKworICBjcnJfdHlwZSByMSA9IHN0ZDo6dHIxOjpjcmVmKGkpOworCisgIENQUFVOSVRfQ0hFQ0soIHIxLmdldCgpID09IDEgKTsKKworICByMSA9IHN0ZDo6dHIxOjpjcmVmKGopOworCisgIENQUFVOSVRfQ0hFQ0soIHIxLmdldCgpID09IDIgKTsKKworICBpID0gMzsKKworICBDUFBVTklUX0NIRUNLKCByMS5nZXQoKSA9PSAyICk7CisKKyAgaiA9IDQ7CisKKyAgQ1BQVU5JVF9DSEVDSyggcjEuZ2V0KCkgPT0gNCApOworfQorCisjZW5kaWYgLyogIV9TVExQX05PX0VYVEVOU0lPTlMgJiYgX1NUTFBfVVNFX0JPT1NUX1NVUFBPUlQgKi8KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9yZXNvbHZlX25hbWUuY3BwIGIvdGVzdC91bml0L3Jlc29sdmVfbmFtZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM3YzEyMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9yZXNvbHZlX25hbWUuY3BwCkBAIC0wLDAgKzEsODMgQEAKKyNkZWZpbmUgX1NUTFBfRE9fSU1QT1JUX0NTVERfRlVOQ1RJT05TCisjaW5jbHVkZSA8Y21hdGg+CisKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZCAoX1NUTFBfVVNFX05BTUVTUEFDRVMpCisKK25hbWVzcGFjZSBOUzEgeworCitib29sIGYoKQoreworICBkb3VibGUgZCggMS4wICk7CisKKyAgZCA9IHNxcnQoIGQgKTsKKyAgZCA9IDo6c3FydCggZCApOworICBkID0gc3RkOjpzcXJ0KCBkICk7CisgIHJldHVybiBkID09IDEuMDsKK30KKworfQorCituYW1lc3BhY2UgeworCitib29sIGcoKQoreworICBkb3VibGUgZCggMS4wICk7CisKKyAgZCA9IHNxcnQoIGQgKTsKKyAgZCA9IDo6c3FydCggZCApOworICBkID0gc3RkOjpzcXJ0KCBkICk7CisgIHJldHVybiBkID09IDEuMDsKK30KKworfQorCisvLyBWQzYgY29uc2lkZXIgY2FsbCB0byBzcXJ0IGFtYmlndW91cyBhcyBzb29uIGFzIHVzaW5nIG5hbWVzcGFjZSBzdGQgaGFzCisvLyBiZWVuIGludm9rZWQuCisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8ICFkZWZpbmVkIChfU1RMUF9NU1ZDKSB8fCAoX1NUTFBfTVNWQyA+PSAxMzAwKQordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyNlbmRpZgorCitib29sIGgoKQoreworICBkb3VibGUgZCggMS4wICk7CisKKyAgZCA9IHNxcnQoIGQgKTsKKyAgZCA9IDo6c3FydCggZCApOworICBkID0gc3RkOjpzcXJ0KCBkICk7CisgIHJldHVybiBkID09IDEuMDsKK30KKworc3RydWN0IHNxCit7CisgIHNxKCkge30KKworICBkb3VibGUgc3Fyb290KCBkb3VibGUgeCApIHsKKyAgICB1c2luZyBzdGQ6OnNxcnQ7CisgICAgcmV0dXJuIHNxcnQoeCk7CisgIH0KK307CisKKyNlbmRpZgorCisKKyNpZiAwIC8vIERvIG5vdGhpbmcsIHRoaXMgc2hvdWxkIGJlIGNvbXBpbGVkIG9ubHkKKworI2luY2x1ZGUgImNwcHVuaXQvY3BwdW5pdF9wcm94eS5oIgorCitjbGFzcyBSZXNvbHZlTmFtZVRlc3QgOiBwdWJsaWMgQ1BQVU5JVF9OUzo6VGVzdENhc2UKK3sKKyAgQ1BQVU5JVF9URVNUX1NVSVRFKFJlc29sdmVOYW1lVGVzdCk7CisgIENQUFVOSVRfVEVTVChjc3R5bGUpOworICBDUFBVTklUX1RFU1RfU1VJVEVfRU5EKCk7CisKK3Byb3RlY3RlZDoKKyAgdm9pZCBjc3R5bGUoKTsKK307CisKK0NQUFVOSVRfVEVTVF9TVUlURV9SRUdJU1RSQVRJT04oUmVzb2x2ZU5hbWVUZXN0KTsKKwordm9pZCBSZXNvbHZlTmFtZVRlc3Q6OmNzdHlsZSgpCit7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L3Jldml0ZXJfdGVzdC5jcHAgYi90ZXN0L3VuaXQvcmV2aXRlcl90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWEzYzM0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L3Jldml0ZXJfdGVzdC5jcHAKQEAgLTAsMCArMSw3MiBAQAorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgImNwcHVuaXQvY3BwdW5pdF9wcm94eS5oIgorCisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IGRlZmluZWQoX1NUTFBfVVNFX05BTUVTUEFDRVMpCit1c2luZyBuYW1lc3BhY2Ugc3RkOworI2VuZGlmCisKKy8vCisvLyBUZXN0Q2FzZSBjbGFzcworLy8KK2NsYXNzIFJldml0ZXJUZXN0IDogcHVibGljIENQUFVOSVRfTlM6OlRlc3RDYXNlCit7CisgIENQUFVOSVRfVEVTVF9TVUlURShSZXZpdGVyVGVzdCk7CisgIENQUFVOSVRfVEVTVChyZXZpdGVyMSk7CisgIENQUFVOSVRfVEVTVChyZXZpdGVyMik7CisgIENQUFVOSVRfVEVTVChyZXZiaXQxKTsKKyAgQ1BQVU5JVF9URVNUX1NVSVRFX0VORCgpOworCitwcm90ZWN0ZWQ6CisgIHZvaWQgcmV2aXRlcjEoKTsKKyAgdm9pZCByZXZpdGVyMigpOworICB2b2lkIHJldmJpdDEoKTsKK307CisKK0NQUFVOSVRfVEVTVF9TVUlURV9SRUdJU1RSQVRJT04oUmV2aXRlclRlc3QpOworCisvLworLy8gdGVzdHMgaW1wbGVtZW50YXRpb24KKy8vCit2b2lkIFJldml0ZXJUZXN0OjpyZXZpdGVyMSgpCit7CisgIGludCBhcnJheSBbXSA9IHsgMSwgNSwgMiwgMyB9OworCisgIHZlY3RvcjxpbnQ+IHYoYXJyYXksIGFycmF5ICsgNCk7CisgIHR5cGVkZWYgdmVjdG9yPGludD46OnJldmVyc2VfaXRlcmF0b3IgcmV2aXRlcjsKKyAgcmV2aXRlciByKHYucmVuZCgpKTsKKyAgci0tOworCisgIENQUFVOSVRfQVNTRVJUKCpyLS0gPT0gMSk7CisgIENQUFVOSVRfQVNTRVJUKCpyLS0gPT0gNSk7CisgIENQUFVOSVRfQVNTRVJUKCpyLS0gPT0gMik7CisgIENQUFVOSVRfQVNTRVJUKCpyID09IDMpOworICBDUFBVTklUX0FTU0VSVChyPT12LnJiZWdpbigpKTsKK30KK3ZvaWQgUmV2aXRlclRlc3Q6OnJldml0ZXIyKCkKK3sKKyAgaW50IGFycmF5IFtdID0geyAxLCA1LCAyLCAzIH07CisKKyAgdmVjdG9yPGludD4gdihhcnJheSwgYXJyYXkgKyA0KTsKKyAgdmVjdG9yPGludD46OnJldmVyc2VfaXRlcmF0b3IgcjsKKyAgciA9IHYucmJlZ2luKCk7CisgIENQUFVOSVRfQVNTRVJUKCpyKysgPT0gMyk7CisgIENQUFVOSVRfQVNTRVJUKCpyKysgPT0gMik7CisgIENQUFVOSVRfQVNTRVJUKCpyKysgPT0gNSk7CisgIENQUFVOSVRfQVNTRVJUKCpyKysgPT0gMSk7CisgIENQUFVOSVRfQVNTRVJUKHI9PXYucmVuZCgpKTsKK30KK3ZvaWQgUmV2aXRlclRlc3Q6OnJldmJpdDEoKQoreworICBpbnQgYXJyYXkgW10gPSB7IDEsIDUsIDIsIDMgfTsKKworICBsaXN0PGludD4gdihhcnJheSwgYXJyYXkgKyA0KTsKKyAgbGlzdDxpbnQ+OjpyZXZlcnNlX2l0ZXJhdG9yIHIodi5yYmVnaW4oKSk7CisgIENQUFVOSVRfQVNTRVJUKCpyKysgPT0gMyk7CisgIENQUFVOSVRfQVNTRVJUKCpyKysgPT0gMik7CisgIENQUFVOSVRfQVNTRVJUKCpyKysgPT0gNSk7CisgIENQUFVOSVRfQVNTRVJUKCpyKysgPT0gMSk7CisgIENQUFVOSVRfQVNTRVJUKHI9PXYucmVuZCgpKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9ybV9jcF90ZXN0LmNwcCBiL3Rlc3QvdW5pdC9ybV9jcF90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTNhNGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L3JtX2NwX3Rlc3QuY3BwCkBAIC0wLDAgKzEsMjQ1IEBACisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgImNwcHVuaXQvY3BwdW5pdF9wcm94eS5oIgorCisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IGRlZmluZWQoX1NUTFBfVVNFX05BTUVTUEFDRVMpCit1c2luZyBuYW1lc3BhY2Ugc3RkOworI2VuZGlmCisKKy8vCisvLyBUZXN0Q2FzZSBjbGFzcworLy8KK2NsYXNzIFJtQ3BUZXN0IDogcHVibGljIENQUFVOSVRfTlM6OlRlc3RDYXNlCit7CisgIENQUFVOSVRfVEVTVF9TVUlURShSbUNwVGVzdCk7CisgIENQUFVOSVRfVEVTVChyZW1jb3B5MSk7CisgIENQUFVOSVRfVEVTVChyZW1jcGlmMSk7CisgIENQUFVOSVRfVEVTVChyZW1pZjEpOworICBDUFBVTklUX1RFU1QocmVtb3ZlMSk7CisgIENQUFVOSVRfVEVTVChyZXBjcGlmMSk7CisgIENQUFVOSVRfVEVTVChyZXBsYWNlMCk7CisgIENQUFVOSVRfVEVTVChyZXBsYWNlMSk7CisgIENQUFVOSVRfVEVTVChyZXBsY3B5MSk7CisgIENQUFVOSVRfVEVTVChyZXBsaWYxKTsKKyAgQ1BQVU5JVF9URVNUKHJldmNvcHkxKTsKKyAgQ1BQVU5JVF9URVNUKHJldmVyc2UxKTsKKyAgQ1BQVU5JVF9URVNUX1NVSVRFX0VORCgpOworCitwcm90ZWN0ZWQ6CisgIHZvaWQgcmVtY29weTEoKTsKKyAgdm9pZCByZW1jcGlmMSgpOworICB2b2lkIHJlbWlmMSgpOworICB2b2lkIHJlbW92ZTEoKTsKKyAgdm9pZCByZXBjcGlmMSgpOworICB2b2lkIHJlcGxhY2UwKCk7CisgIHZvaWQgcmVwbGFjZTEoKTsKKyAgdm9pZCByZXBsY3B5MSgpOworICB2b2lkIHJlcGxpZjEoKTsKKyAgdm9pZCByZXZjb3B5MSgpOworICB2b2lkIHJldmVyc2UxKCk7CisKK307CisKK0NQUFVOSVRfVEVTVF9TVUlURV9SRUdJU1RSQVRJT04oUm1DcFRlc3QpOworCitzdGF0aWMgYm9vbCBvZGQoaW50IGFfKQoreworICByZXR1cm4gKGFfICUgMikgIT0gMDsKK30KKy8vCisvLyB0ZXN0cyBpbXBsZW1lbnRhdGlvbgorLy8KKwordm9pZCBSbUNwVGVzdDo6cmV2ZXJzZTEoKQoreworICBpbnQgbnVtYmVyc1s2XSA9IHsgMCwgMSwgMiwgMywgNCwgNSB9OworCisgIHJldmVyc2UobnVtYmVycywgbnVtYmVycyArIDYpOworICBDUFBVTklUX0FTU0VSVChudW1iZXJzWzBdPT01KTsKKyAgQ1BQVU5JVF9BU1NFUlQobnVtYmVyc1sxXT09NCk7CisgIENQUFVOSVRfQVNTRVJUKG51bWJlcnNbMl09PTMpOworICBDUFBVTklUX0FTU0VSVChudW1iZXJzWzNdPT0yKTsKKyAgQ1BQVU5JVF9BU1NFUlQobnVtYmVyc1s0XT09MSk7CisgIENQUFVOSVRfQVNTRVJUKG51bWJlcnNbNV09PTApOworfQorCit2b2lkIFJtQ3BUZXN0OjpyZXZjb3B5MSgpCit7CisgIGludCBudW1iZXJzWzZdID0geyAwLCAxLCAyLCAzLCA0LCA1IH07CisKKyAgaW50IHJlc3VsdFs2XTsKKyAgcmV2ZXJzZV9jb3B5KChpbnQqKW51bWJlcnMsIChpbnQqKW51bWJlcnMgKyA2LCAoaW50KilyZXN1bHQpOworICAvLyA1IDQgMyAyIDEgMAorICBDUFBVTklUX0FTU0VSVChyZXN1bHRbMF09PTUpOworICBDUFBVTklUX0FTU0VSVChyZXN1bHRbMV09PTQpOworICBDUFBVTklUX0FTU0VSVChyZXN1bHRbMl09PTMpOworICBDUFBVTklUX0FTU0VSVChyZXN1bHRbM109PTIpOworICBDUFBVTklUX0FTU0VSVChyZXN1bHRbNF09PTEpOworICBDUFBVTklUX0FTU0VSVChyZXN1bHRbNV09PTApOworfQorCit2b2lkIFJtQ3BUZXN0OjpyZXBsaWYxKCkKK3sKKyAgdmVjdG9yIDxpbnQ+IHYxKDEwKTsKKyAgZm9yIChpbnQgaSA9IDA7IChzaXplX3QpaSA8IHYxLnNpemUoKTsgKytpKQorICAgIHYxW2ldID0gaSAlIDU7CisKKyAgcmVwbGFjZV9pZih2MS5iZWdpbigpLCB2MS5lbmQoKSwgb2RkLCA0Mik7CisKKyAgLy8gMCA0MiAyIDQyIDQgMCA0MiAyIDQyIDQKKyAgQ1BQVU5JVF9BU1NFUlQodjFbMF09PTApOworICBDUFBVTklUX0FTU0VSVCh2MVsxXT09NDIpOworICBDUFBVTklUX0FTU0VSVCh2MVsyXT09Mik7CisgIENQUFVOSVRfQVNTRVJUKHYxWzNdPT00Mik7CisgIENQUFVOSVRfQVNTRVJUKHYxWzRdPT00KTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbNV09PTApOworICBDUFBVTklUX0FTU0VSVCh2MVs2XT09NDIpOworICBDUFBVTklUX0FTU0VSVCh2MVs3XT09Mik7CisgIENQUFVOSVRfQVNTRVJUKHYxWzhdPT00Mik7CisgIENQUFVOSVRfQVNTRVJUKHYxWzldPT00KTsKK30KKwordm9pZCBSbUNwVGVzdDo6cmVwbGNweTEoKQoreworICBpbnQgbnVtYmVyc1s2XSA9IHsgMCwgMSwgMiwgMCwgMSwgMiB9OworICBpbnQgcmVzdWx0WzZdID0geyAwLCAwLCAwLCAwLCAwLCAwIH07CisKKyAgcmVwbGFjZV9jb3B5KChpbnQqKW51bWJlcnMsIChpbnQqKW51bWJlcnMgKyA2LCAoaW50KilyZXN1bHQsIDIsIDQyKTsKKyAgQ1BQVU5JVF9BU1NFUlQocmVzdWx0WzBdPT0wKTsKKyAgQ1BQVU5JVF9BU1NFUlQocmVzdWx0WzFdPT0xKTsKKyAgQ1BQVU5JVF9BU1NFUlQocmVzdWx0WzJdPT00Mik7CisgIENQUFVOSVRfQVNTRVJUKHJlc3VsdFszXT09MCk7CisgIENQUFVOSVRfQVNTRVJUKHJlc3VsdFs0XT09MSk7CisgIENQUFVOSVRfQVNTRVJUKHJlc3VsdFs1XT09NDIpOworfQorCit2b2lkIFJtQ3BUZXN0OjpyZXBsYWNlMCgpCit7CisgIGludCBudW1iZXJzWzZdID0geyAwLCAxLCAyLCAwLCAxLCAyIH07CisKKyAgcmVwbGFjZShudW1iZXJzLCBudW1iZXJzICsgNiwgMiwgNDIpOworCisgIC8vIDAgMSA0MiAwIDEgNDIKKyAgQ1BQVU5JVF9BU1NFUlQobnVtYmVyc1swXT09MCk7CisgIENQUFVOSVRfQVNTRVJUKG51bWJlcnNbMV09PTEpOworICBDUFBVTklUX0FTU0VSVChudW1iZXJzWzJdPT00Mik7CisgIENQUFVOSVRfQVNTRVJUKG51bWJlcnNbM109PTApOworICBDUFBVTklUX0FTU0VSVChudW1iZXJzWzRdPT0xKTsKKyAgQ1BQVU5JVF9BU1NFUlQobnVtYmVyc1s1XT09NDIpOworfQorCit2b2lkIFJtQ3BUZXN0OjpyZXBsYWNlMSgpCit7CisgIHZlY3RvciA8aW50PiB2MSgxMCk7CisgIGZvciAoaW50IGkgPSAwOyAoc2l6ZV90KWkgPCB2MS5zaXplKCk7ICsraSkKKyAgICB2MVtpXSA9IGkgJSA1OworICByZXBsYWNlKHYxLmJlZ2luKCksIHYxLmVuZCgpLCAyLCA0Mik7CisKKyAgLy8gMCAxIDIgMyA0IDAgMSAyIDMgNAorICAvLyAwIDEgNDIgMyA0IDAgMSA0MiAzIDQKKyAgQ1BQVU5JVF9BU1NFUlQodjFbMF09PTApOworICBDUFBVTklUX0FTU0VSVCh2MVsxXT09MSk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzJdPT00Mik7CisgIENQUFVOSVRfQVNTRVJUKHYxWzNdPT0zKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbNF09PTQpOworICBDUFBVTklUX0FTU0VSVCh2MVs1XT09MCk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzZdPT0xKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbN109PTQyKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbOF09PTMpOworICBDUFBVTklUX0FTU0VSVCh2MVs5XT09NCk7Cit9CisKK3ZvaWQgUm1DcFRlc3Q6OnJlcGNwaWYxKCkKK3sKKyAgdmVjdG9yIDxpbnQ+IHYxKDEwKTsKKyAgZm9yIChpbnQgaSA9IDA7IChzaXplX3QpaSA8IHYxLnNpemUoKTsgKytpKQorICAgIHYxW2ldID0gaSAlIDU7CisgIHZlY3RvciA8aW50PiB2Mih2MS5zaXplKCkpOworCisgIC8vIDAgMSAyIDMgNCAwIDEgMiAzIDQKKyAgLy8gMCAxIDIgMyA0IDAgMSAyIDMgNAorICAvLyAwIDQyIDIgNDIgNCAwIDQyIDIgNDIgNAorICByZXBsYWNlX2NvcHlfaWYodjEuYmVnaW4oKSwgdjEuZW5kKCksIHYyLmJlZ2luKCksIG9kZCwgNDIpOworICBDUFBVTklUX0FTU0VSVCh2MVswXT09MCk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzFdPT0xKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbMl09PTIpOworICBDUFBVTklUX0FTU0VSVCh2MVszXT09Myk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzRdPT00KTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbNV09PTApOworICBDUFBVTklUX0FTU0VSVCh2MVs2XT09MSk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzddPT0yKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbOF09PTMpOworICBDUFBVTklUX0FTU0VSVCh2MVs5XT09NCk7CisKKyAgQ1BQVU5JVF9BU1NFUlQodjJbMF09PTApOworICBDUFBVTklUX0FTU0VSVCh2MlsxXT09NDIpOworICBDUFBVTklUX0FTU0VSVCh2MlsyXT09Mik7CisgIENQUFVOSVRfQVNTRVJUKHYyWzNdPT00Mik7CisgIENQUFVOSVRfQVNTRVJUKHYyWzRdPT00KTsKKyAgQ1BQVU5JVF9BU1NFUlQodjJbNV09PTApOworICBDUFBVTklUX0FTU0VSVCh2Mls2XT09NDIpOworICBDUFBVTklUX0FTU0VSVCh2Mls3XT09Mik7CisgIENQUFVOSVRfQVNTRVJUKHYyWzhdPT00Mik7CisgIENQUFVOSVRfQVNTRVJUKHYyWzldPT00KTsKK30KKwordm9pZCBSbUNwVGVzdDo6cmVtb3ZlMSgpCit7CisgIGludCBudW1iZXJzWzZdID0geyAxLCAyLCAzLCAxLCAyLCAzIH07CisgIHJlbW92ZSgoaW50KiludW1iZXJzLCAoaW50KiludW1iZXJzICsgNiwgMSk7CisKKyAgLy8gMiAzIDIgMyAyIDMKKyAgQ1BQVU5JVF9BU1NFUlQobnVtYmVyc1swXT09Mik7CisgIENQUFVOSVRfQVNTRVJUKG51bWJlcnNbMV09PTMpOworICBDUFBVTklUX0FTU0VSVChudW1iZXJzWzJdPT0yKTsKKyAgQ1BQVU5JVF9BU1NFUlQobnVtYmVyc1szXT09Myk7CisgIENQUFVOSVRfQVNTRVJUKG51bWJlcnNbNF09PTIpOworICBDUFBVTklUX0FTU0VSVChudW1iZXJzWzVdPT0zKTsKK30KKwordm9pZCBSbUNwVGVzdDo6cmVtaWYxKCkKK3sKKyAgaW50IG51bWJlcnNbNl0gPSB7IDAsIDAsIDEsIDEsIDIsIDIgfTsKKworICByZW1vdmVfaWYoKGludCopbnVtYmVycywgKGludCopbnVtYmVycyArIDYsIG9kZCk7CisKKyAgLy8gMCAwIDIgMiAyIDIKKyAgQ1BQVU5JVF9BU1NFUlQobnVtYmVyc1swXT09MCk7CisgIENQUFVOSVRfQVNTRVJUKG51bWJlcnNbMV09PTApOworICBDUFBVTklUX0FTU0VSVChudW1iZXJzWzJdPT0yKTsKKyAgQ1BQVU5JVF9BU1NFUlQobnVtYmVyc1szXT09Mik7CisgIENQUFVOSVRfQVNTRVJUKG51bWJlcnNbNF09PTIpOworICBDUFBVTklUX0FTU0VSVChudW1iZXJzWzVdPT0yKTsKK30KKwordm9pZCBSbUNwVGVzdDo6cmVtY29weTEoKQoreworICBpbnQgbnVtYmVyc1s2XSA9IHsgMSwgMiwgMywgMSwgMiwgMyB9OworICBpbnQgcmVzdWx0WzZdID0geyAwLCAwLCAwLCAwLCAwLCAwIH07CisKKyAgcmVtb3ZlX2NvcHkoKGludCopbnVtYmVycywgKGludCopbnVtYmVycyArIDYsIChpbnQqKXJlc3VsdCwgMik7CisKKyAgQ1BQVU5JVF9BU1NFUlQocmVzdWx0WzBdPT0xKTsKKyAgQ1BQVU5JVF9BU1NFUlQocmVzdWx0WzFdPT0zKTsKKyAgQ1BQVU5JVF9BU1NFUlQocmVzdWx0WzJdPT0xKTsKKyAgQ1BQVU5JVF9BU1NFUlQocmVzdWx0WzNdPT0zKTsKKyAgQ1BQVU5JVF9BU1NFUlQocmVzdWx0WzRdPT0wKTsKKyAgQ1BQVU5JVF9BU1NFUlQocmVzdWx0WzVdPT0wKTsKK30KKwordm9pZCBSbUNwVGVzdDo6cmVtY3BpZjEoKQoreworICBpbnQgbnVtYmVyc1s2XSA9IHsgMSwgMiwgMywgMSwgMiwgMyB9OworICBpbnQgcmVzdWx0WzZdID0geyAwLCAwLCAwLCAwLCAwLCAwIH07CisKKyAgcmVtb3ZlX2NvcHlfaWYoKGludCopbnVtYmVycywgKGludCopbnVtYmVycyArIDYsIChpbnQqKXJlc3VsdCwgb2RkKTsKKworICAvLyAyIDIgMCAwIDAgMAorICBDUFBVTklUX0FTU0VSVChyZXN1bHRbMF09PTIpOworICBDUFBVTklUX0FTU0VSVChyZXN1bHRbMV09PTIpOworICBDUFBVTklUX0FTU0VSVChyZXN1bHRbMl09PTApOworICBDUFBVTklUX0FTU0VSVChyZXN1bHRbM109PTApOworICBDUFBVTklUX0FTU0VSVChyZXN1bHRbNF09PTApOworICBDUFBVTklUX0FTU0VSVChyZXN1bHRbNV09PTApOworfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L3JuZHNoZl90ZXN0LmNwcCBiL3Rlc3QvdW5pdC9ybmRzaGZfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ1N2E1MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9ybmRzaGZfdGVzdC5jcHAKQEAgLTAsMCArMSw3MyBAQAorI2luY2x1ZGUgPG51bWVyaWM+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgImlvdGEuaCIKKyNpbmNsdWRlICJjcHB1bml0L2NwcHVuaXRfcHJveHkuaCIKKworI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkKF9TVExQX1VTRV9OQU1FU1BBQ0VTKQordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyNlbmRpZgorCisvLworLy8gVGVzdENhc2UgY2xhc3MKKy8vCitjbGFzcyBSbmRTaHVmZmxlVGVzdCA6IHB1YmxpYyBDUFBVTklUX05TOjpUZXN0Q2FzZQoreworICBjbGFzcyBNeVJhbmRvbUdlbmVyYXRvcgorICB7CisgICAgcHVibGljOgorICAgICAgdW5zaWduZWQgbG9uZyBvcGVyYXRvcigpKHVuc2lnbmVkIGxvbmcgbl8pCisgICAgICAgIHsKKyAgICAgICAgcmV0dXJuIHJhbmQoKSAlIG5fOworICAgICAgICB9CisgIH07CisgIENQUFVOSVRfVEVTVF9TVUlURShSbmRTaHVmZmxlVGVzdCk7CisgIENQUFVOSVRfVEVTVChybmRzaHVmMCk7CisgIENQUFVOSVRfVEVTVChybmRzaHVmMik7CisgIENQUFVOSVRfVEVTVF9TVUlURV9FTkQoKTsKKworcHJvdGVjdGVkOgorICB2b2lkIHJuZHNodWYwKCk7CisgIHZvaWQgcm5kc2h1ZjIoKTsKK307CisKK0NQUFVOSVRfVEVTVF9TVUlURV9SRUdJU1RSQVRJT04oUm5kU2h1ZmZsZVRlc3QpOworCisvLworLy8gdGVzdHMgaW1wbGVtZW50YXRpb24KKy8vCit2b2lkIFJuZFNodWZmbGVUZXN0OjpybmRzaHVmMCgpCit7CisgIGludCBudW1iZXJzWzZdID0geyAxLCAyLCAzLCA0LCA1LCA2IH07CisKKyAgcmFuZG9tX3NodWZmbGUobnVtYmVycywgbnVtYmVycyArIDYpOworCisgIENQUFVOSVRfQVNTRVJUKGNvdW50KG51bWJlcnMsIG51bWJlcnMrNiwgMSk9PTEpOworICBDUFBVTklUX0FTU0VSVChjb3VudChudW1iZXJzLCBudW1iZXJzKzYsIDIpPT0xKTsKKyAgQ1BQVU5JVF9BU1NFUlQoY291bnQobnVtYmVycywgbnVtYmVycys2LCAzKT09MSk7CisgIENQUFVOSVRfQVNTRVJUKGNvdW50KG51bWJlcnMsIG51bWJlcnMrNiwgNCk9PTEpOworICBDUFBVTklUX0FTU0VSVChjb3VudChudW1iZXJzLCBudW1iZXJzKzYsIDUpPT0xKTsKKyAgQ1BQVU5JVF9BU1NFUlQoY291bnQobnVtYmVycywgbnVtYmVycys2LCA2KT09MSk7Cit9Cit2b2lkIFJuZFNodWZmbGVUZXN0OjpybmRzaHVmMigpCit7CisgIHZlY3RvciA8aW50PiB2MSgxMCk7CisgIF9faW90YSh2MS5iZWdpbigpLCB2MS5lbmQoKSwgMCk7CisKKyAgTXlSYW5kb21HZW5lcmF0b3IgcjsKKyAgZm9yKGludCBpID0gMDsgaSA8IDM7IGkrKykKKyAgeworICAgIHJhbmRvbV9zaHVmZmxlKHYxLmJlZ2luKCksIHYxLmVuZCgpLCByKTsKKyAgICBDUFBVTklUX0FTU0VSVChjb3VudCh2MS5iZWdpbigpLCB2MS5lbmQoKSwgMCk9PTEpOworICAgIENQUFVOSVRfQVNTRVJUKGNvdW50KHYxLmJlZ2luKCksIHYxLmVuZCgpLCAxKT09MSk7CisgICAgQ1BQVU5JVF9BU1NFUlQoY291bnQodjEuYmVnaW4oKSwgdjEuZW5kKCksIDIpPT0xKTsKKyAgICBDUFBVTklUX0FTU0VSVChjb3VudCh2MS5iZWdpbigpLCB2MS5lbmQoKSwgMyk9PTEpOworICAgIENQUFVOSVRfQVNTRVJUKGNvdW50KHYxLmJlZ2luKCksIHYxLmVuZCgpLCA0KT09MSk7CisgICAgQ1BQVU5JVF9BU1NFUlQoY291bnQodjEuYmVnaW4oKSwgdjEuZW5kKCksIDUpPT0xKTsKKyAgICBDUFBVTklUX0FTU0VSVChjb3VudCh2MS5iZWdpbigpLCB2MS5lbmQoKSwgNik9PTEpOworICAgIENQUFVOSVRfQVNTRVJUKGNvdW50KHYxLmJlZ2luKCksIHYxLmVuZCgpLCA3KT09MSk7CisgICAgQ1BQVU5JVF9BU1NFUlQoY291bnQodjEuYmVnaW4oKSwgdjEuZW5kKCksIDgpPT0xKTsKKyAgICBDUFBVTklUX0FTU0VSVChjb3VudCh2MS5iZWdpbigpLCB2MS5lbmQoKSwgOSk9PTEpOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvcm9wZV90ZXN0LmNwcCBiL3Rlc3QvdW5pdC9yb3BlX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMmZlYzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvcm9wZV90ZXN0LmNwcApAQCAtMCwwICsxLDE4OSBAQAorLy9TbWFsbCBoZWFkZXIgdG8gZ2V0IFNUTHBvcnQgbnVtZXJvdXMgZGVmaW5lczoKKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaWYgZGVmaW5lZCAoU1RMUE9SVCkgJiYgIWRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpCisjICBpbmNsdWRlIDxyb3BlPgorCisjICBpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX05PX0lPU1RSRUFNUykKKyMgICAgaW5jbHVkZSA8c3N0cmVhbT4KKyMgIGVuZGlmCisjZW5kaWYKKworI2luY2x1ZGUgImNwcHVuaXQvY3BwdW5pdF9wcm94eS5oIgorCisvLyAjaW5jbHVkZSA8c3RkbGliLmg+IC8vIGZvciByYW5kIGV0YworCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX05BTUVTUEFDRVMpCit1c2luZyBuYW1lc3BhY2Ugc3RkOworI2VuZGlmCisKKy8vCisvLyBUZXN0Q2FzZSBjbGFzcworLy8KK2NsYXNzIFJvcGVUZXN0IDogcHVibGljIENQUFVOSVRfTlM6OlRlc3RDYXNlCit7CisgIENQUFVOSVRfVEVTVF9TVUlURShSb3BlVGVzdCk7CisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IGRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpIHx8IGRlZmluZWQgKF9TVExQX1VTRV9OT19JT1NUUkVBTVMpCisgIENQUFVOSVRfSUdOT1JFOworI2VuZGlmCisgIENQUFVOSVRfVEVTVChpbyk7CisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX05PX0lPU1RSRUFNUykKKyAgQ1BQVU5JVF9TVE9QX0lHTk9SRTsKKyNlbmRpZgorICBDUFBVTklUX1RFU1QoZmluZDEpOworICBDUFBVTklUX1RFU1QoZmluZDIpOworICBDUFBVTklUX1RFU1QoY29uc3RydWN0X2Zyb21fY2hhcik7CisgIENQUFVOSVRfVEVTVChidWdfcmVwb3J0KTsKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyAgQ1BQVU5JVF9JR05PUkU7CisjZW5kaWYKKyAgQ1BQVU5JVF9URVNUKHRlc3Rfc2F2ZWRfcm9wZV9pdGVyYXRvcnMpOworICBDUFBVTklUX1RFU1RfU1VJVEVfRU5EKCk7CisKK3Byb3RlY3RlZDoKKyAgdm9pZCBpbygpOworICB2b2lkIGZpbmQxKCk7CisgIHZvaWQgZmluZDIoKTsKKyAgdm9pZCBjb25zdHJ1Y3RfZnJvbV9jaGFyKCk7CisgIHZvaWQgYnVnX3JlcG9ydCgpOworICB2b2lkIHRlc3Rfc2F2ZWRfcm9wZV9pdGVyYXRvcnMoKTsKK307CisKK0NQUFVOSVRfVEVTVF9TVUlURV9SRUdJU1RSQVRJT04oUm9wZVRlc3QpOworCisvLworLy8gdGVzdHMgaW1wbGVtZW50YXRpb24KKy8vCit2b2lkIFJvcGVUZXN0OjppbygpCit7CisjaWYgZGVmaW5lZCAoU1RMUE9SVCkgJiYgIWRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpICYmICFkZWZpbmVkIChfU1RMUF9VU0VfTk9fSU9TVFJFQU1TKSAKKyAgY2hhciBjb25zdCogY3N0ciA9ICJyb3BlIHRlc3Qgc3RyaW5nIjsKKyAgY3JvcGUgcnN0cihjc3RyKTsKKworICB7CisgICAgb3N0cmluZ3N0cmVhbSBvc3RyOworICAgIG9zdHIgPDwgcnN0cjsKKworICAgIENQUFVOSVRfQVNTRVJUKCBvc3RyICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIG9zdHIuc3RyKCkgPT0gY3N0ciApOworICB9CisjZW5kaWYKK30KKwordm9pZCBSb3BlVGVzdDo6ZmluZDEoKQoreworI2lmIGRlZmluZWQgKFNUTFBPUlQpICYmICFkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKSAKKyAgY3JvcGUgcigiRnV6enkgV3V6enkgd2FzIGEgYmVhciIpOworICBjcm9wZTo6c2l6ZV90eXBlIG4gPSByLmZpbmQoICJoYWlyIiApOworICBDUFBVTklUX0FTU0VSVCggbiA9PSBjcm9wZTo6bnBvcyApOworCisgIG4gPSByLmZpbmQoImVhciIpOworCisgIENQUFVOSVRfQVNTRVJUKCBuID09IChyLnNpemUoKSAtIDMpICk7CisjZW5kaWYKK30KKwordm9pZCBSb3BlVGVzdDo6ZmluZDIoKQoreworI2lmIGRlZmluZWQgKFNUTFBPUlQpICYmICFkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKSAKKyAgY3JvcGUgcigiRnV6enkgV3V6enkgd2FzIGEgYmVhciIpOworICBjcm9wZTo6c2l6ZV90eXBlIG4gPSByLmZpbmQoICdlJyApOworICBDUFBVTklUX0FTU0VSVCggbiA9PSAoci5zaXplKCkgLSAzKSApOworI2VuZGlmCit9CisKK3ZvaWQgUm9wZVRlc3Q6OmNvbnN0cnVjdF9mcm9tX2NoYXIoKQoreworI2lmIGRlZmluZWQgKFNUTFBPUlQpICYmICFkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKSAKKyAgY3JvcGUgcignMScpOworICBjaGFyIGNvbnN0KiBzID0gci5jX3N0cigpOworICBDUFBVTklUX0FTU0VSVCggJzEnID09IHNbMF0gJiYgJ1wwJyA9PSBzWzFdICk7CisjZW5kaWYKK30KKworLy8gVGVzdCB1c2VkIGZvciBhIGJ1ZyByZXBvcnQgZnJvbSBQZXRlciBIZXJjZWsKK3ZvaWQgUm9wZVRlc3Q6OmJ1Z19yZXBvcnQoKQoreworI2lmIGRlZmluZWQgKFNUTFBPUlQpICYmICFkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKSAKKyAgLy9maXJzdCBjcmVhdGUgYSByb3BlIGJpZ2dlciB0aGFuIGNyb3BlOjpfU19jb3B5X21heCA9IDIzCisgIC8vIHNvIHRoYXQgYW55IHN0cmluZyBhZGRpdGlvbiBpcyBhZGRlZCB0byBhIG5ldyBsZWFmCisgIGNyb3BlIGV2aWxSb3BlKCIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyM18iKTsKKyAgLy9jcm9wZSogcFNldmVuQ2hhclJvcGUoIG5ldyBUUm9wZSgiMTIzNDU2NyIpICk7CisgIGNyb3BlIHNldmVuQ2hhclJvcGUwKCIxMjM0NTY3OCIpOworICBjcm9wZSBzZXZlbkNoYXJSb3BlMSgiMTIzNDU2NyIpOworICAvLyBhZGQgX1JvcGVfUm9wZVJlcDxjLGE+OjpfU19hbGxvY19ncmFudWxhcml0eS0xID0gNyBjaGFyYWN0ZXJzCisgIGV2aWxSb3BlICs9ICIxMjM0NTY3IjsgLy8gY3JlYXRlcyBhIG5ldyBsZWFmCisgIGNyb3BlIHNldmVuQ2hhclJvcGUyKCIxMjM0NTY3Iik7CisgIC8vIGFkZCBvbmUgbW9yZSBjaGFyYWN0ZXIgdG8gdGhlIGxlYWYKKyAgZXZpbFJvcGUgKz0gJzgnOyAvLyBoZXJlIGlzIHRoZSB3cml0ZSBiZXlvbmQgdGhlIGFsbG9jYXRlZCBtZW1vcnkKKyAgQ1BQVU5JVF9BU1NFUlQoIHN0cmNtcChzZXZlbkNoYXJSb3BlMi5jX3N0cigpLCAiMTIzNDU2NyIpID09IDAgKTsKKyNlbmRpZgorfQorCisjaWYgZGVmaW5lZCAoU1RMUE9SVCkgJiYgIWRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpCitjb25zdCBjaGFyIHN0cltdID0gImlsY3Bza2xyeXZtY3BqbmJwYndsbHNyZWhmbXhya2Vjd2l0cnNnbHJleHZ0am14eXB1XAorbmJxZmd4bXV2Z2ZhamNsZnZlbmh5dWh1b3Jqb3NhbWliZG5qZGJleWhrYnNvbWJsdG9cCit1dWpkcmJ3Y3JyY2diZmxxcG90dHBlZ3J3dmdhamNyZ3dkbHBnaXR5ZHZoZWR0dXNpcFwKK3B5dnhzdXZidmZlbm9kcWFzYWpveW9tZ3NxY3BqbGhibWRhaHl2aXVlbWtzc2RzbGRlXAorYmVzbm5uZ3Blc2RudHJydnlzdWlweXdhdHBmb2VsdGhyb3doZmV4bHdkeXN2c3B3bGtcCitmYmxmZGYiOworCitjcm9wZSBjcmVhdGVfcm9wZSggaW50IGxlbiApCit7CisgICBpbnQgbCA9IGxlbi8yOworICAgY3JvcGUgcmVzdWx0OworICAgaWYobCA8PSAyKQorICAgeworICAgICAgc3RhdGljIGludCBqID0gMDsKKyAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBsZW47ICsraSkKKyAgICAgIHsKKyAgICAgICAgIC8vIGNoYXIgYyA9ICdhJyArIHJhbmQoKSAlICgneicgLSAnYScpOworICAgICAgICAgcmVzdWx0LmFwcGVuZCgxLCAvKiBjICovIHN0cltqKytdICk7CisgICAgICAgICBqICU9IHNpemVvZihzdHIpOworICAgICAgfQorICAgfQorICAgZWxzZQorICAgeworICAgICAgcmVzdWx0ID0gY3JlYXRlX3JvcGUobGVuLzIpOworICAgICAgcmVzdWx0LmFwcGVuZChjcmVhdGVfcm9wZShsZW4vMikpOworICAgfQorICAgcmV0dXJuIHJlc3VsdDsKK30KKworI2VuZGlmCisKK3ZvaWQgUm9wZVRlc3Q6OnRlc3Rfc2F2ZWRfcm9wZV9pdGVyYXRvcnMoKQoreworI2lmIGRlZmluZWQgKFNUTFBPUlQpICYmICFkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKSAmJiBcCisgICAgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyAgIC8vCisgICAvLyBUcnkgYW5kIGNyZWF0ZSBhIHJvcGUgd2l0aCBhIGNvbXBsZXggdHJlZSBzdHJ1Y3R1cmU6CisgICAvLworICAgLy8gc3JhbmQoMCk7CisgICBjcm9wZSByID0gY3JlYXRlX3JvcGUoMzAwKTsKKyAgIHN0cmluZyBleHBlY3RlZChyLmJlZ2luKCksIHIuZW5kKCkpOworICAgQ1BQVU5JVF9BU1NFUlQoZXhwZWN0ZWQuc2l6ZSgpID09IHIuc2l6ZSgpKTsKKyAgIENQUFVOSVRfQVNTRVJUKGVxdWFsKGV4cGVjdGVkLmJlZ2luKCksIGV4cGVjdGVkLmVuZCgpLCByLmJlZ2luKCkpKTsKKyAgIGNyb3BlOjpjb25zdF9pdGVyYXRvciBpKHIuYmVnaW4oKSksIGooci5lbmQoKSk7CisgICBpbnQgcG9zID0gMDsKKyAgIHdoaWxlKGkgIT0gaikKKyAgIHsKKyAgICAgIGNyb3BlOjpjb25zdF9pdGVyYXRvciBrOworICAgICAgLy8gVGhpcyBpbml0aWFsIHJlYWQgdHJpZ2dlcnMgdGhlIGJ1ZzoKKyAgICAgIENQUFVOSVRfQVNTRVJUKCppKTsKKyAgICAgIGsgPSBpOworICAgICAgaW50IG5ld3BvcyA9IHBvczsKKyAgICAgIC8vIE5vdyBtYWtlIHN1cmUgdGhhdCBpIGlzIGluY3JlbWVudGVkIGludG8gdGhlIG5leHQgbGVhZjoKKyAgICAgIHdoaWxlKGkgIT0gaikKKyAgICAgIHsKKyAgICAgICAgIENQUFVOSVRfQVNTRVJUKCppID09IGV4cGVjdGVkW25ld3Bvc10pOworICAgICAgICAgKytpOworICAgICAgICAgKytuZXdwb3M7CisgICAgICB9CisgICAgICAvLyBCYWNrIHVwIGZyb20gc3RvcmVkIHZhbHVlIGFuZCBjb250aW51ZToKKyAgICAgIGkgPSBrOworICAgICAgKytpOworICAgICAgKytwb3M7CisgICB9CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9yb3RhdGVfdGVzdC5jcHAgYi90ZXN0L3VuaXQvcm90YXRlX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMGJmMjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvcm90YXRlX3Rlc3QuY3BwCkBAIC0wLDAgKzEsMTMzIEBACisjaW5jbHVkZSA8bnVtZXJpYz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSAiaW90YS5oIgorI2luY2x1ZGUgImNwcHVuaXQvY3BwdW5pdF9wcm94eS5oIgorCisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IGRlZmluZWQoX1NUTFBfVVNFX05BTUVTUEFDRVMpCit1c2luZyBuYW1lc3BhY2Ugc3RkOworI2VuZGlmCisKKy8vCisvLyBUZXN0Q2FzZSBjbGFzcworLy8KK2NsYXNzIFJvdGF0ZVRlc3QgOiBwdWJsaWMgQ1BQVU5JVF9OUzo6VGVzdENhc2UKK3sKKyAgQ1BQVU5JVF9URVNUX1NVSVRFKFJvdGF0ZVRlc3QpOworICBDUFBVTklUX1RFU1Qocm90YXRlMCk7CisgIENQUFVOSVRfVEVTVChyb3RhdGUxKTsKKyAgQ1BQVU5JVF9URVNUKHJvdGNvcHkwKTsKKyAgQ1BQVU5JVF9URVNUKHJvdGNvcHkxKTsKKyAgQ1BQVU5JVF9URVNUX1NVSVRFX0VORCgpOworCitwcm90ZWN0ZWQ6CisgIHZvaWQgcm90YXRlMCgpOworICB2b2lkIHJvdGF0ZTEoKTsKKyAgdm9pZCByb3Rjb3B5MCgpOworICB2b2lkIHJvdGNvcHkxKCk7Cit9OworCitDUFBVTklUX1RFU1RfU1VJVEVfUkVHSVNUUkFUSU9OKFJvdGF0ZVRlc3QpOworCisvLworLy8gdGVzdHMgaW1wbGVtZW50YXRpb24KKy8vCit2b2lkIFJvdGF0ZVRlc3Q6OnJvdGF0ZTAoKQoreworICBpbnQgbnVtYmVyc1s2XSA9IHsgMCwgMSwgMiwgMywgNCwgNSB9OworICAvLyAzIDQgNSAwIDEgMgorICByb3RhdGUoKGludCopbnVtYmVycywgbnVtYmVycyArIDMsIG51bWJlcnMgKyA2KTsKKyAgQ1BQVU5JVF9BU1NFUlQobnVtYmVyc1swXT09Myk7CisgIENQUFVOSVRfQVNTRVJUKG51bWJlcnNbMV09PTQpOworICBDUFBVTklUX0FTU0VSVChudW1iZXJzWzJdPT01KTsKKyAgQ1BQVU5JVF9BU1NFUlQobnVtYmVyc1szXT09MCk7CisgIENQUFVOSVRfQVNTRVJUKG51bWJlcnNbNF09PTEpOworICBDUFBVTklUX0FTU0VSVChudW1iZXJzWzVdPT0yKTsKK30KK3ZvaWQgUm90YXRlVGVzdDo6cm90YXRlMSgpCit7CisgIHZlY3RvciA8aW50PiB2MSgxMCk7CisgIF9faW90YSh2MS5iZWdpbigpLCB2MS5lbmQoKSwgMCk7CisKKyAgcm90YXRlKHYxLmJlZ2luKCksIHYxLmJlZ2luKCkrMSwgdjEuZW5kKCkpOworICBDUFBVTklUX0FTU0VSVCh2MVswXT09MSk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzFdPT0yKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbMl09PTMpOworICBDUFBVTklUX0FTU0VSVCh2MVszXT09NCk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzRdPT01KTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbNV09PTYpOworICBDUFBVTklUX0FTU0VSVCh2MVs2XT09Nyk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzddPT04KTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbOF09PTkpOworICBDUFBVTklUX0FTU0VSVCh2MVs5XT09MCk7CisKKyAgcm90YXRlKHYxLmJlZ2luKCksIHYxLmJlZ2luKCkrMiwgdjEuZW5kKCkpOworICBDUFBVTklUX0FTU0VSVCh2MVswXT09Myk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzFdPT00KTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbMl09PTUpOworICBDUFBVTklUX0FTU0VSVCh2MVszXT09Nik7CisgIENQUFVOSVRfQVNTRVJUKHYxWzRdPT03KTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbNV09PTgpOworICBDUFBVTklUX0FTU0VSVCh2MVs2XT09OSk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzddPT0wKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbOF09PTEpOworICBDUFBVTklUX0FTU0VSVCh2MVs5XT09Mik7CisKKyAgcm90YXRlKHYxLmJlZ2luKCksIHYxLmJlZ2luKCkrNywgdjEuZW5kKCkpOworICBDUFBVTklUX0FTU0VSVCh2MVswXT09MCk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzFdPT0xKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbMl09PTIpOworICBDUFBVTklUX0FTU0VSVCh2MVszXT09Myk7CisgIENQUFVOSVRfQVNTRVJUKHYxWzRdPT00KTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbNV09PTUpOworICBDUFBVTklUX0FTU0VSVCh2MVs2XT09Nik7CisgIENQUFVOSVRfQVNTRVJUKHYxWzddPT03KTsKKyAgQ1BQVU5JVF9BU1NFUlQodjFbOF09PTgpOworICBDUFBVTklUX0FTU0VSVCh2MVs5XT09OSk7CisKK30KK3ZvaWQgUm90YXRlVGVzdDo6cm90Y29weTAoKQoreworICBpbnQgbnVtYmVyc1s2XSA9IHsgMCwgMSwgMiwgMywgNCwgNSB9OworCisgIGludCByZXN1bHRbNl07CisgIHJvdGF0ZV9jb3B5KChpbnQqKW51bWJlcnMsIChpbnQqKW51bWJlcnMgKyAzLCAoaW50KiludW1iZXJzICsgNiwgKGludCopcmVzdWx0KTsKKyAgLy8gMyA0IDUgMCAxIDIKKyAgQ1BQVU5JVF9BU1NFUlQocmVzdWx0WzBdPT0zKTsKKyAgQ1BQVU5JVF9BU1NFUlQocmVzdWx0WzFdPT00KTsKKyAgQ1BQVU5JVF9BU1NFUlQocmVzdWx0WzJdPT01KTsKKyAgQ1BQVU5JVF9BU1NFUlQocmVzdWx0WzNdPT0wKTsKKyAgQ1BQVU5JVF9BU1NFUlQocmVzdWx0WzRdPT0xKTsKKyAgQ1BQVU5JVF9BU1NFUlQocmVzdWx0WzVdPT0yKTsKK30KK3ZvaWQgUm90YXRlVGVzdDo6cm90Y29weTEoKQoreworICB2ZWN0b3IgPGludD4gdjEoMTApOworICBfX2lvdGEodjEuYmVnaW4oKSwgdjEuZW5kKCksIDApOworICB2ZWN0b3IgPGludD4gdjIodjEuc2l6ZSgpKTsKKworICByb3RhdGVfY29weSh2MS5iZWdpbigpLCB2MS5iZWdpbigpKzEsIHYxLmVuZCgpLCB2Mi5iZWdpbigpKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjJbMF09PTEpOworICBDUFBVTklUX0FTU0VSVCh2MlsxXT09Mik7CisgIENQUFVOSVRfQVNTRVJUKHYyWzJdPT0zKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjJbM109PTQpOworICBDUFBVTklUX0FTU0VSVCh2Mls0XT09NSk7CisgIENQUFVOSVRfQVNTRVJUKHYyWzVdPT02KTsKKyAgQ1BQVU5JVF9BU1NFUlQodjJbNl09PTcpOworICBDUFBVTklUX0FTU0VSVCh2Mls3XT09OCk7CisgIENQUFVOSVRfQVNTRVJUKHYyWzhdPT05KTsKKyAgQ1BQVU5JVF9BU1NFUlQodjJbOV09PTApOworCisgIHJvdGF0ZV9jb3B5KHYxLmJlZ2luKCksIHYxLmJlZ2luKCkrMywgdjEuZW5kKCksIHYyLmJlZ2luKCkpOworICBDUFBVTklUX0FTU0VSVCh2MlswXT09Myk7CisgIENQUFVOSVRfQVNTRVJUKHYyWzFdPT00KTsKKyAgQ1BQVU5JVF9BU1NFUlQodjJbMl09PTUpOworICBDUFBVTklUX0FTU0VSVCh2MlszXT09Nik7CisgIENQUFVOSVRfQVNTRVJUKHYyWzRdPT03KTsKKyAgQ1BQVU5JVF9BU1NFUlQodjJbNV09PTgpOworICBDUFBVTklUX0FTU0VSVCh2Mls2XT09OSk7CisgIENQUFVOSVRfQVNTRVJUKHYyWzddPT0wKTsKKyAgQ1BQVU5JVF9BU1NFUlQodjJbOF09PTEpOworICBDUFBVTklUX0FTU0VSVCh2Mls5XT09Mik7Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvc2VhcmNoX3Rlc3QuY3BwIGIvdGVzdC91bml0L3NlYXJjaF90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2RkMzNkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L3NlYXJjaF90ZXN0LmNwcApAQCAtMCwwICsxLDg5IEBACisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPG51bWVyaWM+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSAiaW90YS5oIgorI2luY2x1ZGUgImNwcHVuaXQvY3BwdW5pdF9wcm94eS5oIgorCisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IGRlZmluZWQoX1NUTFBfVVNFX05BTUVTUEFDRVMpCit1c2luZyBuYW1lc3BhY2Ugc3RkOworI2VuZGlmCisKKy8vCisvLyBUZXN0Q2FzZSBjbGFzcworLy8KK2NsYXNzIFNlYXJjaFRlc3QgOiBwdWJsaWMgQ1BQVU5JVF9OUzo6VGVzdENhc2UKK3sKKyAgQ1BQVU5JVF9URVNUX1NVSVRFKFNlYXJjaFRlc3QpOworICBDUFBVTklUX1RFU1Qoc2VhcmNoMCk7CisgIENQUFVOSVRfVEVTVChzZWFyY2gxKTsKKyAgQ1BQVU5JVF9URVNUKHNlYXJjaDIpOworICBDUFBVTklUX1RFU1RfU1VJVEVfRU5EKCk7CisKK3Byb3RlY3RlZDoKKyAgdm9pZCBzZWFyY2gwKCk7CisgIHZvaWQgc2VhcmNoMSgpOworICB2b2lkIHNlYXJjaDIoKTsKKworICBzdGF0aWMgYm9vbCBzdHJfZXF1YWwoY29uc3QgY2hhciogYV8sIGNvbnN0IGNoYXIqIGJfKQorICB7CisgICAgcmV0dXJuIHN0cmNtcChhXywgYl8pID09IDAgPyAxIDogMDsKKyAgfQorfTsKKworQ1BQVU5JVF9URVNUX1NVSVRFX1JFR0lTVFJBVElPTihTZWFyY2hUZXN0KTsKKworLy8KKy8vIHRlc3RzIGltcGxlbWVudGF0aW9uCisvLwordm9pZCBTZWFyY2hUZXN0OjpzZWFyY2gwKCkKK3sKKyAgaW50IHYxWzZdID0geyAxLCAxLCAyLCAzLCA1LCA4IH07CisgIGludCB2Mls2XSA9IHsgMCwgMSwgMiwgMywgNCwgNSB9OworICBpbnQgdjNbMl0gPSB7IDMsIDQgfTsKKworICBpbnQqIGxvY2F0aW9uOworICBsb2NhdGlvbiA9IHNlYXJjaCgoaW50Kil2MSwgKGludCopdjEgKyA2LCAoaW50Kil2MywgKGludCopdjMgKyAyKTsKKyAgQ1BQVU5JVF9BU1NFUlQobG9jYXRpb24gPT0gdjEgKyA2KTsKKworICBsb2NhdGlvbiA9IHNlYXJjaCgoaW50Kil2MiwgKGludCopdjIgKyA2LCAoaW50Kil2MywgKGludCopdjMgKyAyKTsKKyAgQ1BQVU5JVF9BU1NFUlQobG9jYXRpb24gIT0gdjIgKyA2KTsKKyAgQ1BQVU5JVF9BU1NFUlQobG9jYXRpb24gLSB2MiA9PSAzKTsKK30KK3ZvaWQgU2VhcmNoVGVzdDo6c2VhcmNoMSgpCit7CisgIHR5cGVkZWYgdmVjdG9yIDxpbnQ+IEludFZlYzsKKyAgSW50VmVjIHYxKDEwKTsKKyAgX19pb3RhKHYxLmJlZ2luKCksIHYxLmVuZCgpLCAwKTsKKyAgSW50VmVjIHYyKDMpOworICBfX2lvdGEodjIuYmVnaW4oKSwgdjIuZW5kKCksIDUwKTsKKworICBJbnRWZWM6Oml0ZXJhdG9yIGxvY2F0aW9uOworICBsb2NhdGlvbiA9IHNlYXJjaCh2MS5iZWdpbigpLCB2MS5lbmQoKSwgdjIuYmVnaW4oKSwgdjIuZW5kKCkpOworCisgIENQUFVOSVRfQVNTRVJUKGxvY2F0aW9uID09IHYxLmVuZCgpKTsKKworICBfX2lvdGEodjIuYmVnaW4oKSwgdjIuZW5kKCksIDQpOworCisgIGxvY2F0aW9uID0gc2VhcmNoKHYxLmJlZ2luKCksIHYxLmVuZCgpLCB2Mi5iZWdpbigpLCB2Mi5lbmQoKSk7CisKKyAgQ1BQVU5JVF9BU1NFUlQobG9jYXRpb24gIT0gdjEuZW5kKCkpOworICBDUFBVTklUX0FTU0VSVChsb2NhdGlvbiAtIHYxLmJlZ2luKCkgPT0gNCk7Cit9Cit2b2lkIFNlYXJjaFRlc3Q6OnNlYXJjaDIoKQoreworICBjaGFyIGNvbnN0KiBncmFkZXNbXSA9IHsgIkEiLCAiQiIsICJDIiwgIkQiLCAiRiIgfTsKKyAgY2hhciBjb25zdCogbGV0dGVyc1tdID0geyAiUSIsICJFIiwgIkQiIH07CisgIGNvbnN0IHVuc2lnbmVkIGdyYWRlQ291bnQgPSBzaXplb2YoZ3JhZGVzKSAvIHNpemVvZihncmFkZXNbMF0pOworICBjb25zdCB1bnNpZ25lZCBsZXR0ZXJDb3VudCA9IHNpemVvZihsZXR0ZXJzKSAvIHNpemVvZihsZXR0ZXJzWzBdKTsKKyAgY2hhciBjb25zdCoqIGxvY2F0aW9uID0gc2VhcmNoKChjaGFyIGNvbnN0KiopZ3JhZGVzLCAoY2hhciBjb25zdCoqKWdyYWRlcyArIGdyYWRlQ291bnQsIChjaGFyIGNvbnN0KiopbGV0dGVycywgKGNoYXIgY29uc3QqKilsZXR0ZXJzICsgbGV0dGVyQ291bnQsIHN0cl9lcXVhbCk7CisKKyAgQ1BQVU5JVF9BU1NFUlQobG9jYXRpb24gPT0gZ3JhZGVzICsgZ3JhZGVDb3VudCk7CisKKyAgY29weSgoY2hhciBjb25zdCoqKWdyYWRlcyArIDEsIChjaGFyIGNvbnN0KiopZ3JhZGVzICsgMSArIGxldHRlckNvdW50LCAoY2hhciBjb25zdCoqKWxldHRlcnMpOworICBsb2NhdGlvbiA9IHNlYXJjaCgoY2hhciBjb25zdCoqKWdyYWRlcywgKGNoYXIgY29uc3QqKilncmFkZXMgKyBncmFkZUNvdW50LCAoY2hhciBjb25zdCoqKWxldHRlcnMsIChjaGFyIGNvbnN0KiopbGV0dGVycyArIGxldHRlckNvdW50LCBzdHJfZXF1YWwpOworCisgIENQUFVOSVRfQVNTRVJUKGxvY2F0aW9uICE9IGdyYWRlcyArIGdyYWRlQ291bnQpOworICBDUFBVTklUX0FTU0VSVChsb2NhdGlvbiAtIGdyYWRlcyA9PSAxKTsKKworfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L3NldF9oZWFkZXJfdGVzdC5jcHAgYi90ZXN0L3VuaXQvc2V0X2hlYWRlcl90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzM1ZTEzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L3NldF9oZWFkZXJfdGVzdC5jcHAKQEAgLTAsMCArMSw4IEBACisvKiBUaGlzIHRlc3QgcHVycG9zZSBpcyBzaW1wbHkgdG8gY2hlY2sgU3RhbmRhcmQgaGVhZGVyIGluZGVwZW5kYW5jeSB0aGF0CisgKiBpcyB0byBzYXkgdGhhdCB0aGUgaGVhZGVyIGNhbiBiZSBpbmNsdWRlZCBhbG9uZSB3aXRob3V0IGFueSBwcmV2aW91cworICogaW5jbHVkZS4KKyAqIEFkZGl0aW9ubmFseSwgZm9yIEMgU3RhbmRhcmQgaGVhZGVycyB0aGF0IFNUTHBvcnQgZXhwb3NlLCBpdCBjYW4gYWxzbyBiZQorICogdXNlZCB0byBjaGVjayB0aGF0IGZpbGVzIGluY2x1ZGVkIGJ5IHRob3NlIGhlYWRlcnMgYXJlIGNvbXBhdGlibGUgd2l0aAorICogcHVyZSBDIGNvbXBpbGVycy4KKyAqLworI2luY2x1ZGUgPHNldD4KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9zZXRfdGVzdC5jcHAgYi90ZXN0L3VuaXQvc2V0X3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNzBiMmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvc2V0X3Rlc3QuY3BwCkBAIC0wLDAgKzEsNTA3IEBACisvL0hhcyB0byBiZSBmaXJzdCBmb3IgU3RhY2tBbGxvY2F0b3Igc3dhcCBvdmVybG9hZCB0byBiZSB0YWtlbgorLy9pbnRvIGFjY291bnQgKGF0IGxlYXN0IHVzaW5nIEdDQyA0LjAuMSkKKyNpbmNsdWRlICJzdGFja19hbGxvY2F0b3IuaCIKKworI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpbmNsdWRlICJjcHB1bml0L2NwcHVuaXRfcHJveHkuaCIKKworI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkKF9TVExQX1VTRV9OQU1FU1BBQ0VTKQordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyNlbmRpZgorCisvLworLy8gVGVzdENhc2UgY2xhc3MKKy8vCitjbGFzcyBTZXRUZXN0IDogcHVibGljIENQUFVOSVRfTlM6OlRlc3RDYXNlCit7CisgIENQUFVOSVRfVEVTVF9TVUlURShTZXRUZXN0KTsKKyAgQ1BQVU5JVF9URVNUKHNldDEpOworICBDUFBVTklUX1RFU1Qoc2V0Mik7CisgIENQUFVOSVRfVEVTVChlcmFzZSk7CisgIENQUFVOSVRfVEVTVChpbnNlcnQpOworICBDUFBVTklUX1RFU1QoZmluZCk7CisgIENQUFVOSVRfVEVTVChib3VuZHMpOworICBDUFBVTklUX1RFU1Qoc3BlY2lhbGl6ZWRfbGVzcyk7CisgIENQUFVOSVRfVEVTVChpbXBsZW1lbnRhdGlvbl9jaGVjayk7CisgIENQUFVOSVRfVEVTVChhbGxvY2F0b3Jfd2l0aF9zdGF0ZSk7CisgIENQUFVOSVRfVEVTVChyZXZlcnNlX2l0ZXJhdG9yX3Rlc3QpOworI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCAhZGVmaW5lZCAoX1NUTFBfVVNFX0NPTlRBSU5FUlNfRVhURU5TSU9OKQorICBDUFBVTklUX0lHTk9SRTsKKyNlbmRpZgorICBDUFBVTklUX1RFU1QodGVtcGxhdGVfbWV0aG9kcyk7CisgIENQUFVOSVRfVEVTVF9TVUlURV9FTkQoKTsKKworcHJvdGVjdGVkOgorICB2b2lkIHNldDEoKTsKKyAgdm9pZCBzZXQyKCk7CisgIHZvaWQgZXJhc2UoKTsKKyAgdm9pZCBpbnNlcnQoKTsKKyAgdm9pZCBmaW5kKCk7CisgIHZvaWQgYm91bmRzKCk7CisgIHZvaWQgc3BlY2lhbGl6ZWRfbGVzcygpOworICB2b2lkIGltcGxlbWVudGF0aW9uX2NoZWNrKCk7CisgIHZvaWQgYWxsb2NhdG9yX3dpdGhfc3RhdGUoKTsKKyAgdm9pZCByZXZlcnNlX2l0ZXJhdG9yX3Rlc3QoKTsKKyAgdm9pZCB0ZW1wbGF0ZV9tZXRob2RzKCk7Cit9OworCitDUFBVTklUX1RFU1RfU1VJVEVfUkVHSVNUUkFUSU9OKFNldFRlc3QpOworCisKKy8vCisvLyB0ZXN0cyBpbXBsZW1lbnRhdGlvbgorLy8KK3ZvaWQgU2V0VGVzdDo6c2V0MSgpCit7CisgIHNldDxpbnQsIGxlc3M8aW50PiA+IHM7CisgIENQUFVOSVRfQVNTRVJUIChzLmNvdW50KDQyKSA9PSAwKTsKKyAgcy5pbnNlcnQoNDIpOworICBDUFBVTklUX0FTU0VSVCAocy5jb3VudCg0MikgPT0gMSk7CisgIHMuaW5zZXJ0KDQyKTsKKyAgQ1BQVU5JVF9BU1NFUlQgKHMuY291bnQoNDIpID09IDEpOworICBzaXplX3QgY291bnQgPSBzLmVyYXNlKDQyKTsKKyAgQ1BQVU5JVF9BU1NFUlQgKGNvdW50ID09IDEpOworfQorCit2b2lkIFNldFRlc3Q6OnNldDIoKQoreworICB0eXBlZGVmIHNldDxpbnQsIGxlc3M8aW50PiA+IGludF9zZXQ7CisgIGludF9zZXQgczsKKyAgcGFpcjxpbnRfc2V0OjppdGVyYXRvciwgYm9vbD4gcCA9IHMuaW5zZXJ0KDQyKTsKKyAgQ1BQVU5JVF9BU1NFUlQgKHAuc2Vjb25kID09IHRydWUpOworICBwID0gcy5pbnNlcnQoNDIpOworICBDUFBVTklUX0FTU0VSVCAocC5zZWNvbmQgPT0gZmFsc2UpOworCisgIGludCBhcnJheTEgW10gPSB7IDEsIDMsIDYsIDcgfTsKKyAgcy5pbnNlcnQoYXJyYXkxLCBhcnJheTEgKyA0KTsKKyAgQ1BQVU5JVF9BU1NFUlQgKGRpc3RhbmNlKHMuYmVnaW4oKSwgcy5lbmQoKSkgPT0gNSk7CisKKyAgaW50X3NldCBzMjsKKyAgczIuc3dhcChzKTsKKyAgQ1BQVU5JVF9BU1NFUlQgKGRpc3RhbmNlKHMyLmJlZ2luKCksIHMyLmVuZCgpKSA9PSA1KTsKKyAgQ1BQVU5JVF9BU1NFUlQgKGRpc3RhbmNlKHMuYmVnaW4oKSwgcy5lbmQoKSkgPT0gMCk7CisKKyAgaW50X3NldCBzMzsKKyAgczMuc3dhcChzKTsKKyAgczMuc3dhcChzMik7CisgIENQUFVOSVRfQVNTRVJUIChkaXN0YW5jZShzLmJlZ2luKCksIHMuZW5kKCkpID09IDApOworICBDUFBVTklUX0FTU0VSVCAoZGlzdGFuY2UoczIuYmVnaW4oKSwgczIuZW5kKCkpID09IDApOworICBDUFBVTklUX0FTU0VSVCAoZGlzdGFuY2UoczMuYmVnaW4oKSwgczMuZW5kKCkpID09IDUpOworfQorCit2b2lkIFNldFRlc3Q6OmVyYXNlKCkKK3sKKyAgc2V0PGludCwgbGVzczxpbnQ+ID4gczsKKyAgcy5pbnNlcnQoMSk7CisgIHMuZXJhc2Uocy5iZWdpbigpKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHMuZW1wdHkoKSApOworCisgIHNpemVfdCBuYiA9IHMuZXJhc2UoMSk7CisgIENQUFVOSVRfQVNTRVJUKG5iID09IDApOworfQorCit2b2lkIFNldFRlc3Q6Omluc2VydCgpCit7CisgIHNldDxpbnQ+IHM7CisgIHNldDxpbnQ+OjppdGVyYXRvciBpID0gcy5pbnNlcnQoIHMuZW5kKCksIDAgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoICppID09IDAgKTsKK30KKwordm9pZCBTZXRUZXN0OjpmaW5kKCkKK3sKKyAgc2V0PGludD4gczsKKworICBDUFBVTklUX0FTU0VSVCggcy5maW5kKDApID09IHMuZW5kKCkgKTsKKworICBzZXQ8aW50PiBjb25zdCYgY3JzID0gczsKKworICBDUFBVTklUX0FTU0VSVCggY3JzLmZpbmQoMCkgPT0gY3JzLmVuZCgpICk7Cit9CisKK3ZvaWQgU2V0VGVzdDo6Ym91bmRzKCkKK3sKKyAgaW50IGFycmF5MSBbXSA9IHsgMSwgMywgNiwgNyB9OworICBzZXQ8aW50PiBzKGFycmF5MSwgYXJyYXkxICsgc2l6ZW9mKGFycmF5MSkgLyBzaXplb2YoYXJyYXkxWzBdKSk7CisgIHNldDxpbnQ+IGNvbnN0JiBjcnMgPSBzOworCisgIHNldDxpbnQ+OjppdGVyYXRvciBzaXQ7CisgIHNldDxpbnQ+Ojpjb25zdF9pdGVyYXRvciBzY2l0OworICBwYWlyPHNldDxpbnQ+OjppdGVyYXRvciwgc2V0PGludD46Oml0ZXJhdG9yPiBwaXQ7CisgIHBhaXI8c2V0PGludD46OmNvbnN0X2l0ZXJhdG9yLCBzZXQ8aW50Pjo6Y29uc3RfaXRlcmF0b3I+IHBjaXQ7CisKKyAgLy9DaGVjayBpdGVyYXRvciBvbiBtdXRhYmxlIHNldAorICBzaXQgPSBzLmxvd2VyX2JvdW5kKDIpOworICBDUFBVTklUX0FTU0VSVCggc2l0ICE9IHMuZW5kKCkgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoICpzaXQgPT0gMyApOworCisgIHNpdCA9IHMudXBwZXJfYm91bmQoNSk7CisgIENQUFVOSVRfQVNTRVJUKCBzaXQgIT0gcy5lbmQoKSApOworICBDUFBVTklUX0FTU0VSVCggKnNpdCA9PSA2ICk7CisKKyAgcGl0ID0gcy5lcXVhbF9yYW5nZSg2KTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHBpdC5maXJzdCAhPSBwaXQuc2Vjb25kICk7CisgIENQUFVOSVRfQVNTRVJUKCBwaXQuZmlyc3QgIT0gcy5lbmQoKSApOworICBDUFBVTklUX0FTU0VSVCggKnBpdC5maXJzdCA9PSA2ICk7CisgIENQUFVOSVRfQVNTRVJUKCBwaXQuc2Vjb25kICE9IHMuZW5kKCkgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoICpwaXQuc2Vjb25kID09IDcgKTsKKworICBwaXQgPSBzLmVxdWFsX3JhbmdlKDQpOworICBDUFBVTklUX0FTU0VSVCggcGl0LmZpcnN0ID09IHBpdC5zZWNvbmQgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHBpdC5maXJzdCAhPSBzLmVuZCgpICk7CisgIENQUFVOSVRfQVNTRVJUKCAqcGl0LmZpcnN0ID09IDYgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHBpdC5zZWNvbmQgIT0gcy5lbmQoKSApOworICBDUFBVTklUX0FTU0VSVCggKnBpdC5zZWNvbmQgPT0gNiApOworCisgIC8vQ2hlY2sgY29uc3RfaXRlcmF0b3Igb24gbXV0YWJsZSBzZXQKKyAgc2NpdCA9IHMubG93ZXJfYm91bmQoMik7CisgIENQUFVOSVRfQVNTRVJUKCBzY2l0ICE9IHMuZW5kKCkgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoICpzY2l0ID09IDMgKTsKKworICBzY2l0ID0gcy51cHBlcl9ib3VuZCg1KTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHNjaXQgIT0gcy5lbmQoKSApOworICBDUFBVTklUX0FTU0VSVCggKnNjaXQgPT0gNiApOworCisjaWZkZWYgX1NUTFBfTUVNQkVSX1RFTVBMQVRFUworICBwY2l0ID0gcy5lcXVhbF9yYW5nZSg2KTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHBjaXQuZmlyc3QgIT0gcGNpdC5zZWNvbmQgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHBjaXQuZmlyc3QgIT0gcy5lbmQoKSApOworICBDUFBVTklUX0FTU0VSVCggKnBjaXQuZmlyc3QgPT0gNiApOworICBDUFBVTklUX0FTU0VSVCggcGNpdC5zZWNvbmQgIT0gcy5lbmQoKSApOworICBDUFBVTklUX0FTU0VSVCggKnBjaXQuc2Vjb25kID09IDcgKTsKKyNlbmRpZgorCisgIC8vQ2hlY2sgY29uc3RfaXRlcmF0b3Igb24gY29uc3Qgc2V0CisgIHNjaXQgPSBjcnMubG93ZXJfYm91bmQoMik7CisgIENQUFVOSVRfQVNTRVJUKCBzY2l0ICE9IGNycy5lbmQoKSApOworICBDUFBVTklUX0FTU0VSVCggKnNjaXQgPT0gMyApOworCisgIHNjaXQgPSBjcnMudXBwZXJfYm91bmQoNSk7CisgIENQUFVOSVRfQVNTRVJUKCBzY2l0ICE9IGNycy5lbmQoKSApOworICBDUFBVTklUX0FTU0VSVCggKnNjaXQgPT0gNiApOworCisgIHBjaXQgPSBjcnMuZXF1YWxfcmFuZ2UoNik7CisgIENQUFVOSVRfQVNTRVJUKCBwY2l0LmZpcnN0ICE9IHBjaXQuc2Vjb25kICk7CisgIENQUFVOSVRfQVNTRVJUKCBwY2l0LmZpcnN0ICE9IGNycy5lbmQoKSApOworICBDUFBVTklUX0FTU0VSVCggKnBjaXQuZmlyc3QgPT0gNiApOworICBDUFBVTklUX0FTU0VSVCggcGNpdC5zZWNvbmQgIT0gY3JzLmVuZCgpICk7CisgIENQUFVOSVRfQVNTRVJUKCAqcGNpdC5zZWNvbmQgPT0gNyApOworfQorCisKK2NsYXNzIFNldFRlc3RDbGFzcyB7CitwdWJsaWM6CisgIFNldFRlc3RDbGFzcyAoaW50IGRhdGEpIDogX2RhdGEoZGF0YSkKKyAge30KKworICBpbnQgZGF0YSgpIGNvbnN0IHsKKyAgICByZXR1cm4gX2RhdGE7CisgIH0KKworcHJpdmF0ZToKKyAgaW50IF9kYXRhOworfTsKKworI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkIChfU1RMUF9VU0VfTkFNRVNQQUNFUykKK25hbWVzcGFjZSBzdGQgeworI2VuZGlmCisjaWYgZGVmaW5lZCAoU1RMUE9SVCkKKyAgX1NUTFBfVEVNUExBVEVfTlVMTAorI2Vsc2UKKyAgdGVtcGxhdGUgPD4KKyNlbmRpZgorICBzdHJ1Y3QgbGVzczxTZXRUZXN0Q2xhc3M+IHsKKyAgICBib29sIG9wZXJhdG9yICgpIChTZXRUZXN0Q2xhc3MgY29uc3QmIGxocywgU2V0VGVzdENsYXNzIGNvbnN0JiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBsaHMuZGF0YSgpIDwgcmhzLmRhdGEoKTsKKyAgICB9CisgIH07CisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IGRlZmluZWQgKF9TVExQX1VTRV9OQU1FU1BBQ0VTKQorfQorI2VuZGlmCisKK3ZvaWQgU2V0VGVzdDo6c3BlY2lhbGl6ZWRfbGVzcygpCit7CisgIHNldDxTZXRUZXN0Q2xhc3M+IHM7CisgIHMuaW5zZXJ0KFNldFRlc3RDbGFzcygxKSk7CisgIHMuaW5zZXJ0KFNldFRlc3RDbGFzcygzKSk7CisgIHMuaW5zZXJ0KFNldFRlc3RDbGFzcygyKSk7CisgIHMuaW5zZXJ0KFNldFRlc3RDbGFzcygwKSk7CisKKyAgc2V0PFNldFRlc3RDbGFzcz46Oml0ZXJhdG9yIHNpdChzLmJlZ2luKCkpLCBzaXRFbmQocy5lbmQoKSk7CisgIGludCBpID0gMDsKKyAgZm9yICg7IHNpdCAhPSBzaXRFbmQ7ICsrc2l0LCArK2kpIHsKKyAgICBDUFBVTklUX0FTU0VSVCggc2l0LT5kYXRhKCkgPT0gaSApOworICB9Cit9CisKK3ZvaWQgU2V0VGVzdDo6aW1wbGVtZW50YXRpb25fY2hlY2soKQoreworICBzZXQ8aW50PiB0cmVlOworICB0cmVlLmluc2VydCgxKTsKKyAgc2V0PGludD46Oml0ZXJhdG9yIGl0ID0gdHJlZS5iZWdpbigpOworICBpbnQgY29uc3QmIGludF9yZWYgPSAqaXQrKzsKKyAgQ1BQVU5JVF9BU1NFUlQoIGludF9yZWYgPT0gMSApOworCisgIENQUFVOSVRfQVNTRVJUKCBpdCA9PSB0cmVlLmVuZCgpICk7CisgIENQUFVOSVRfQVNTRVJUKCBpdCAhPSB0cmVlLmJlZ2luKCkgKTsKKworICBzZXQ8aW50Pjo6Y29uc3RfaXRlcmF0b3IgY2l0ID0gdHJlZS5iZWdpbigpOworICBpbnQgY29uc3QmIGludF9jcmVmID0gKmNpdCsrOworICBDUFBVTklUX0FTU0VSVCggaW50X2NyZWYgPT0gMSApOworfQorCit2b2lkIFNldFRlc3Q6OnJldmVyc2VfaXRlcmF0b3JfdGVzdCgpCit7CisgIHNldDxpbnQ+IHRyZWU7CisgIHRyZWUuaW5zZXJ0KDEpOworICB0cmVlLmluc2VydCgyKTsKKworICB7CisgICAgc2V0PGludD46OnJldmVyc2VfaXRlcmF0b3Igcml0KHRyZWUucmJlZ2luKCkpOworICAgIENQUFVOSVRfQVNTRVJUKCAqKHJpdCsrKSA9PSAyICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoICoocml0KyspID09IDEgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggcml0ID09IHRyZWUucmVuZCgpICk7CisgIH0KKworICB7CisgICAgc2V0PGludD4gY29uc3QmIGN0cmVlID0gdHJlZTsKKyAgICBzZXQ8aW50Pjo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciByaXQoY3RyZWUucmJlZ2luKCkpOworICAgIENQUFVOSVRfQVNTRVJUKCAqKHJpdCsrKSA9PSAyICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoICoocml0KyspID09IDEgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggcml0ID09IGN0cmVlLnJlbmQoKSApOworICB9Cit9CisKK3ZvaWQgU2V0VGVzdDo6YWxsb2NhdG9yX3dpdGhfc3RhdGUoKQoreworICBjaGFyIGJ1ZjFbMTAyNF07CisgIFN0YWNrQWxsb2NhdG9yPGludD4gc3RhY2sxKGJ1ZjEsIGJ1ZjEgKyBzaXplb2YoYnVmMSkpOworCisgIGNoYXIgYnVmMlsxMDI0XTsKKyAgU3RhY2tBbGxvY2F0b3I8aW50PiBzdGFjazIoYnVmMiwgYnVmMiArIHNpemVvZihidWYyKSk7CisKKyAgaW50IGk7CisgIHR5cGVkZWYgc2V0PGludCwgbGVzczxpbnQ+LCBTdGFja0FsbG9jYXRvcjxpbnQ+ID4gU2V0SW50OworICBsZXNzPGludD4gaW50TGVzczsKKworICB7CisgICAgU2V0SW50IHNpbnQxKGludExlc3MsIHN0YWNrMSk7CisgICAgZm9yIChpID0gMDsgaSA8IDU7ICsraSkKKyAgICAgIHNpbnQxLmluc2VydChpKTsKKyAgICBTZXRJbnQgc2ludDFDcHkoc2ludDEpOworCisgICAgU2V0SW50IHNpbnQyKGludExlc3MsIHN0YWNrMik7CisgICAgZm9yICg7IGkgPCAxMDsgKytpKQorICAgICAgc2ludDIuaW5zZXJ0KGkpOworICAgIFNldEludCBzaW50MkNweShzaW50Mik7CisKKyAgICBzaW50MS5zd2FwKHNpbnQyKTsKKworICAgIENQUFVOSVRfQVNTRVJUKCBzaW50MS5nZXRfYWxsb2NhdG9yKCkuc3dhcGVkKCkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggc2ludDIuZ2V0X2FsbG9jYXRvcigpLnN3YXBlZCgpICk7CisKKyAgICBDUFBVTklUX0FTU0VSVCggc2ludDEgPT0gc2ludDJDcHkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggc2ludDIgPT0gc2ludDFDcHkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggc2ludDEuZ2V0X2FsbG9jYXRvcigpID09IHN0YWNrMiApOworICAgIENQUFVOSVRfQVNTRVJUKCBzaW50Mi5nZXRfYWxsb2NhdG9yKCkgPT0gc3RhY2sxICk7CisgIH0KKyAgQ1BQVU5JVF9BU1NFUlQoIHN0YWNrMS5vaygpICk7CisgIENQUFVOSVRfQVNTRVJUKCBzdGFjazIub2soKSApOworICBzdGFjazEucmVzZXQoKTsgc3RhY2syLnJlc2V0KCk7CisKKyAgeworICAgIFNldEludCBzaW50MShpbnRMZXNzLCBzdGFjazEpOworICAgIFNldEludCBzaW50MUNweShzaW50MSk7CisKKyAgICBTZXRJbnQgc2ludDIoaW50TGVzcywgc3RhY2syKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTA7ICsraSkKKyAgICAgIHNpbnQyLmluc2VydChpKTsKKyAgICBTZXRJbnQgc2ludDJDcHkoc2ludDIpOworCisgICAgc2ludDEuc3dhcChzaW50Mik7CisKKyAgICBDUFBVTklUX0FTU0VSVCggc2ludDEuZ2V0X2FsbG9jYXRvcigpLnN3YXBlZCgpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHNpbnQyLmdldF9hbGxvY2F0b3IoKS5zd2FwZWQoKSApOworCisgICAgQ1BQVU5JVF9BU1NFUlQoIHNpbnQxID09IHNpbnQyQ3B5ICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHNpbnQyID09IHNpbnQxQ3B5ICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHNpbnQxLmdldF9hbGxvY2F0b3IoKSA9PSBzdGFjazIgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggc2ludDIuZ2V0X2FsbG9jYXRvcigpID09IHN0YWNrMSApOworICB9CisgIENQUFVOSVRfQVNTRVJUKCBzdGFjazEub2soKSApOworICBDUFBVTklUX0FTU0VSVCggc3RhY2syLm9rKCkgKTsKKyAgc3RhY2sxLnJlc2V0KCk7IHN0YWNrMi5yZXNldCgpOworCisgIHsKKyAgICBTZXRJbnQgc2ludDEoaW50TGVzcywgc3RhY2sxKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTA7ICsraSkKKyAgICAgIHNpbnQxLmluc2VydChpKTsKKyAgICBTZXRJbnQgc2ludDFDcHkoc2ludDEpOworCisgICAgU2V0SW50IHNpbnQyKGludExlc3MsIHN0YWNrMik7CisgICAgU2V0SW50IHNpbnQyQ3B5KHNpbnQyKTsKKworICAgIHNpbnQxLnN3YXAoc2ludDIpOworCisgICAgQ1BQVU5JVF9BU1NFUlQoIHNpbnQxLmdldF9hbGxvY2F0b3IoKS5zd2FwZWQoKSApOworICAgIENQUFVOSVRfQVNTRVJUKCBzaW50Mi5nZXRfYWxsb2NhdG9yKCkuc3dhcGVkKCkgKTsKKworICAgIENQUFVOSVRfQVNTRVJUKCBzaW50MSA9PSBzaW50MkNweSApOworICAgIENQUFVOSVRfQVNTRVJUKCBzaW50MiA9PSBzaW50MUNweSApOworICAgIENQUFVOSVRfQVNTRVJUKCBzaW50MS5nZXRfYWxsb2NhdG9yKCkgPT0gc3RhY2syICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHNpbnQyLmdldF9hbGxvY2F0b3IoKSA9PSBzdGFjazEgKTsKKyAgfQorICBDUFBVTklUX0FTU0VSVCggc3RhY2sxLm9rKCkgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHN0YWNrMi5vaygpICk7CisgIHN0YWNrMS5yZXNldCgpOyBzdGFjazIucmVzZXQoKTsKK30KKworc3RydWN0IEtleQoreworICBLZXkoKSA6IG1fZGF0YSgwKSB7fQorICBleHBsaWNpdCBLZXkoaW50IGRhdGEpIDogbV9kYXRhKGRhdGEpIHt9CisKKyAgaW50IG1fZGF0YTsKK307CisKK3N0cnVjdCBLZXlDbXAKK3sKKyAgYm9vbCBvcGVyYXRvciAoKSAoS2V5IGxocywgS2V5IHJocykgY29uc3QKKyAgeyByZXR1cm4gbGhzLm1fZGF0YSA8IHJocy5tX2RhdGE7IH0KKworICBib29sIG9wZXJhdG9yICgpIChLZXkgbGhzLCBpbnQgcmhzKSBjb25zdAorICB7IHJldHVybiBsaHMubV9kYXRhIDwgcmhzOyB9CisKKyAgYm9vbCBvcGVyYXRvciAoKSAoaW50IGxocywgS2V5IHJocykgY29uc3QKKyAgeyByZXR1cm4gbGhzIDwgcmhzLm1fZGF0YTsgfQorfTsKKworc3RydWN0IEtleUNtcFB0cgoreworICBib29sIG9wZXJhdG9yICgpIChLZXkgY29uc3Qgdm9sYXRpbGUgKmxocywgS2V5IGNvbnN0IHZvbGF0aWxlICpyaHMpIGNvbnN0CisgIHsgcmV0dXJuICgqbGhzKS5tX2RhdGEgPCAoKnJocykubV9kYXRhOyB9CisKKyAgYm9vbCBvcGVyYXRvciAoKSAoS2V5IGNvbnN0IHZvbGF0aWxlICpsaHMsIGludCByaHMpIGNvbnN0CisgIHsgcmV0dXJuICgqbGhzKS5tX2RhdGEgPCByaHM7IH0KKworICBib29sIG9wZXJhdG9yICgpIChpbnQgbGhzLCBLZXkgY29uc3Qgdm9sYXRpbGUgKnJocykgY29uc3QKKyAgeyByZXR1cm4gbGhzIDwgKCpyaHMpLm1fZGF0YTsgfQorfTsKKwordm9pZCBTZXRUZXN0Ojp0ZW1wbGF0ZV9tZXRob2RzKCkKK3sKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiBkZWZpbmVkIChfU1RMUF9VU0VfQ09OVEFJTkVSU19FWFRFTlNJT04pCisgIHsKKyAgICB0eXBlZGVmIHNldDxLZXksIEtleUNtcD4gS2V5U2V0OworICAgIEtleVNldCBrZXlTZXQ7CisgICAga2V5U2V0Lmluc2VydChLZXkoMSkpOworICAgIGtleVNldC5pbnNlcnQoS2V5KDIpKTsKKyAgICBrZXlTZXQuaW5zZXJ0KEtleSgzKSk7CisgICAga2V5U2V0Lmluc2VydChLZXkoNCkpOworCisgICAgQ1BQVU5JVF9BU1NFUlQoIGtleVNldC5jb3VudChLZXkoMSkpID09IDEgKTsKKyAgICBDUFBVTklUX0FTU0VSVCgga2V5U2V0LmNvdW50KDEpID09IDEgKTsKKyAgICBDUFBVTklUX0FTU0VSVCgga2V5U2V0LmNvdW50KDUpID09IDAgKTsKKworICAgIENQUFVOSVRfQVNTRVJUKCBrZXlTZXQuZmluZCgyKSAhPSBrZXlTZXQuZW5kKCkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCgga2V5U2V0Lmxvd2VyX2JvdW5kKDIpICE9IGtleVNldC5lbmQoKSApOworICAgIENQUFVOSVRfQVNTRVJUKCBrZXlTZXQudXBwZXJfYm91bmQoMikgIT0ga2V5U2V0LmVuZCgpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGtleVNldC5lcXVhbF9yYW5nZSgyKSAhPSBtYWtlX3BhaXIoa2V5U2V0LmJlZ2luKCksIGtleVNldC5lbmQoKSkgKTsKKworICAgIEtleVNldCBjb25zdCYgY2tleVNldCA9IGtleVNldDsKKyAgICBDUFBVTklUX0FTU0VSVCggY2tleVNldC5maW5kKDIpICE9IGNrZXlTZXQuZW5kKCkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggY2tleVNldC5sb3dlcl9ib3VuZCgyKSAhPSBja2V5U2V0LmVuZCgpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGNrZXlTZXQudXBwZXJfYm91bmQoMikgIT0gY2tleVNldC5lbmQoKSApOworICAgIENQUFVOSVRfQVNTRVJUKCBja2V5U2V0LmVxdWFsX3JhbmdlKDIpICE9IG1ha2VfcGFpcihja2V5U2V0LmJlZ2luKCksIGNrZXlTZXQuZW5kKCkpICk7CisgIH0KKworICB7CisgICAgdHlwZWRlZiBzZXQ8S2V5KiwgS2V5Q21wUHRyPiBLZXlTZXQ7CisgICAgS2V5U2V0IGtleVNldDsKKyAgICBLZXkga2V5MSgxKSwga2V5MigyKSwga2V5MygzKSwga2V5NCg0KTsKKyAgICBrZXlTZXQuaW5zZXJ0KCZrZXkxKTsKKyAgICBrZXlTZXQuaW5zZXJ0KCZrZXkyKTsKKyAgICBrZXlTZXQuaW5zZXJ0KCZrZXkzKTsKKyAgICBrZXlTZXQuaW5zZXJ0KCZrZXk0KTsKKworICAgIENQUFVOSVRfQVNTRVJUKCBrZXlTZXQuY291bnQoMSkgPT0gMSApOworICAgIENQUFVOSVRfQVNTRVJUKCBrZXlTZXQuY291bnQoNSkgPT0gMCApOworCisgICAgQ1BQVU5JVF9BU1NFUlQoIGtleVNldC5maW5kKDIpICE9IGtleVNldC5lbmQoKSApOworICAgIENQUFVOSVRfQVNTRVJUKCBrZXlTZXQubG93ZXJfYm91bmQoMikgIT0ga2V5U2V0LmVuZCgpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGtleVNldC51cHBlcl9ib3VuZCgyKSAhPSBrZXlTZXQuZW5kKCkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCgga2V5U2V0LmVxdWFsX3JhbmdlKDIpICE9IG1ha2VfcGFpcihrZXlTZXQuYmVnaW4oKSwga2V5U2V0LmVuZCgpKSApOworCisgICAgS2V5U2V0IGNvbnN0JiBja2V5U2V0ID0ga2V5U2V0OworICAgIENQUFVOSVRfQVNTRVJUKCBja2V5U2V0LmZpbmQoMikgIT0gY2tleVNldC5lbmQoKSApOworICAgIENQUFVOSVRfQVNTRVJUKCBja2V5U2V0Lmxvd2VyX2JvdW5kKDIpICE9IGNrZXlTZXQuZW5kKCkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggY2tleVNldC51cHBlcl9ib3VuZCgyKSAhPSBja2V5U2V0LmVuZCgpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGNrZXlTZXQuZXF1YWxfcmFuZ2UoMikgIT0gbWFrZV9wYWlyKGNrZXlTZXQuYmVnaW4oKSwgY2tleVNldC5lbmQoKSkgKTsKKyAgfQorICB7CisgICAgdHlwZWRlZiBtdWx0aXNldDxLZXksIEtleUNtcD4gS2V5U2V0OworICAgIEtleVNldCBrZXlTZXQ7CisgICAga2V5U2V0Lmluc2VydChLZXkoMSkpOworICAgIGtleVNldC5pbnNlcnQoS2V5KDIpKTsKKyAgICBrZXlTZXQuaW5zZXJ0KEtleSgzKSk7CisgICAga2V5U2V0Lmluc2VydChLZXkoNCkpOworCisgICAgQ1BQVU5JVF9BU1NFUlQoIGtleVNldC5jb3VudChLZXkoMSkpID09IDEgKTsKKyAgICBDUFBVTklUX0FTU0VSVCgga2V5U2V0LmNvdW50KDEpID09IDEgKTsKKyAgICBDUFBVTklUX0FTU0VSVCgga2V5U2V0LmNvdW50KDUpID09IDAgKTsKKworICAgIENQUFVOSVRfQVNTRVJUKCBrZXlTZXQuZmluZCgyKSAhPSBrZXlTZXQuZW5kKCkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCgga2V5U2V0Lmxvd2VyX2JvdW5kKDIpICE9IGtleVNldC5lbmQoKSApOworICAgIENQUFVOSVRfQVNTRVJUKCBrZXlTZXQudXBwZXJfYm91bmQoMikgIT0ga2V5U2V0LmVuZCgpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGtleVNldC5lcXVhbF9yYW5nZSgyKSAhPSBtYWtlX3BhaXIoa2V5U2V0LmJlZ2luKCksIGtleVNldC5lbmQoKSkgKTsKKworICAgIEtleVNldCBjb25zdCYgY2tleVNldCA9IGtleVNldDsKKyAgICBDUFBVTklUX0FTU0VSVCggY2tleVNldC5maW5kKDIpICE9IGNrZXlTZXQuZW5kKCkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggY2tleVNldC5sb3dlcl9ib3VuZCgyKSAhPSBja2V5U2V0LmVuZCgpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGNrZXlTZXQudXBwZXJfYm91bmQoMikgIT0gY2tleVNldC5lbmQoKSApOworICAgIENQUFVOSVRfQVNTRVJUKCBja2V5U2V0LmVxdWFsX3JhbmdlKDIpICE9IG1ha2VfcGFpcihja2V5U2V0LmJlZ2luKCksIGNrZXlTZXQuZW5kKCkpICk7CisgIH0KKworICB7CisgICAgdHlwZWRlZiBtdWx0aXNldDxLZXkgY29uc3Qgdm9sYXRpbGUqLCBLZXlDbXBQdHI+IEtleVNldDsKKyAgICBLZXlTZXQga2V5U2V0OworICAgIEtleSBrZXkxKDEpLCBrZXkyKDIpLCBrZXkzKDMpLCBrZXk0KDQpOworICAgIGtleVNldC5pbnNlcnQoJmtleTEpOworICAgIGtleVNldC5pbnNlcnQoJmtleTIpOworICAgIGtleVNldC5pbnNlcnQoJmtleTMpOworICAgIGtleVNldC5pbnNlcnQoJmtleTQpOworCisgICAgQ1BQVU5JVF9BU1NFUlQoIGtleVNldC5jb3VudCgxKSA9PSAxICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGtleVNldC5jb3VudCg1KSA9PSAwICk7CisKKyAgICBDUFBVTklUX0FTU0VSVCgga2V5U2V0LmZpbmQoMikgIT0ga2V5U2V0LmVuZCgpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGtleVNldC5sb3dlcl9ib3VuZCgyKSAhPSBrZXlTZXQuZW5kKCkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCgga2V5U2V0LnVwcGVyX2JvdW5kKDIpICE9IGtleVNldC5lbmQoKSApOworICAgIENQUFVOSVRfQVNTRVJUKCBrZXlTZXQuZXF1YWxfcmFuZ2UoMikgIT0gbWFrZV9wYWlyKGtleVNldC5iZWdpbigpLCBrZXlTZXQuZW5kKCkpICk7CisKKyAgICBLZXlTZXQgY29uc3QmIGNrZXlTZXQgPSBrZXlTZXQ7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGNrZXlTZXQuZmluZCgyKSAhPSBja2V5U2V0LmVuZCgpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGNrZXlTZXQubG93ZXJfYm91bmQoMikgIT0gY2tleVNldC5lbmQoKSApOworICAgIENQUFVOSVRfQVNTRVJUKCBja2V5U2V0LnVwcGVyX2JvdW5kKDIpICE9IGNrZXlTZXQuZW5kKCkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggY2tleVNldC5lcXVhbF9yYW5nZSgyKSAhPSBtYWtlX3BhaXIoY2tleVNldC5iZWdpbigpLCBja2V5U2V0LmVuZCgpKSApOworICB9CisjZW5kaWYKK30KKworI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCBcCisgICAgIWRlZmluZWQgKF9TVExQX1VTRV9QVFJfU1BFQ0lBTElaQVRJT05TKSB8fCBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQorIyAgaWYgIWRlZmluZWQgKF9fRE1DX18pCisvKiBTaW1wbGUgY29tcGlsYXRpb24gdGVzdDogQ2hlY2sgdGhhdCBuZXN0ZWQgdHlwZXMgbGlrZSBpdGVyYXRvcgorICogY2FuIGJlIGFjY2VzcyBldmVuIGlmIHR5cGUgdXNlZCB0byBpbnN0YW5jaWF0ZSBjb250YWluZXIgaXMgbm90CisgKiB5ZXQgY29tcGxldGVseSBkZWZpbmVkLgorICovCitjbGFzcyBJbmNvbXBsZXRlQ2xhc3MKK3sKKyAgc2V0PEluY29tcGxldGVDbGFzcz4gaW5zdGFuY2VzOworICB0eXBlZGVmIHNldDxJbmNvbXBsZXRlQ2xhc3M+OjppdGVyYXRvciBpdDsKKyAgbXVsdGlzZXQ8SW5jb21wbGV0ZUNsYXNzPiBtaW5zdGFuY2VzOworICB0eXBlZGVmIG11bHRpc2V0PEluY29tcGxldGVDbGFzcz46Oml0ZXJhdG9yIG1pdDsKK307CisjICBlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvc2V0ZGlmZl90ZXN0LmNwcCBiL3Rlc3QvdW5pdC9zZXRkaWZmX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmYTJkZGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvc2V0ZGlmZl90ZXN0LmNwcApAQCAtMCwwICsxLDEzNCBAQAorI2luY2x1ZGUgPG51bWVyaWM+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKworI2luY2x1ZGUgImlvdGEuaCIKKyNpbmNsdWRlICJjcHB1bml0L2NwcHVuaXRfcHJveHkuaCIKKworI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkKF9TVExQX1VTRV9OQU1FU1BBQ0VTKQordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyNlbmRpZgorCisvLworLy8gVGVzdENhc2UgY2xhc3MKKy8vCitjbGFzcyBTZXREaWZmZXJlbmNlVGVzdCA6IHB1YmxpYyBDUFBVTklUX05TOjpUZXN0Q2FzZQoreworICBDUFBVTklUX1RFU1RfU1VJVEUoU2V0RGlmZmVyZW5jZVRlc3QpOworICBDUFBVTklUX1RFU1Qoc2V0ZGlmZjApOworICBDUFBVTklUX1RFU1Qoc2V0ZGlmZjEpOworICBDUFBVTklUX1RFU1Qoc2V0ZGlmZjIpOworICBDUFBVTklUX1RFU1Qoc2V0c3ltZDApOworICBDUFBVTklUX1RFU1Qoc2V0c3ltZDEpOworICBDUFBVTklUX1RFU1Qoc2V0c3ltZDIpOworICBDUFBVTklUX1RFU1RfU1VJVEVfRU5EKCk7CisKK3Byb3RlY3RlZDoKKyAgdm9pZCBzZXRkaWZmMCgpOworICB2b2lkIHNldGRpZmYxKCk7CisgIHZvaWQgc2V0ZGlmZjIoKTsKKyAgdm9pZCBzZXRzeW1kMCgpOworICB2b2lkIHNldHN5bWQxKCk7CisgIHZvaWQgc2V0c3ltZDIoKTsKK307CisKK0NQUFVOSVRfVEVTVF9TVUlURV9SRUdJU1RSQVRJT04oU2V0RGlmZmVyZW5jZVRlc3QpOworCisvLworLy8gdGVzdHMgaW1wbGVtZW50YXRpb24KKy8vCit2b2lkIFNldERpZmZlcmVuY2VUZXN0OjpzZXRzeW1kMCgpCit7CisgIGludCB2MVszXSA9IHsgMTMsIDE4LCAyMyB9OworICBpbnQgdjJbNF0gPSB7IDEwLCAxMywgMTcsIDIzIH07CisgIGludCByZXN1bHRbNF0gPSB7IDAsIDAsIDAsIDAgfTsKKworICBzZXRfc3ltbWV0cmljX2RpZmZlcmVuY2UoKGludCopdjEsIChpbnQqKXYxICsgMywgKGludCopdjIsIChpbnQqKXYyICsgNCwgKGludCopcmVzdWx0KTsKKyAgQ1BQVU5JVF9BU1NFUlQocmVzdWx0WzBdPT0xMCk7CisgIENQUFVOSVRfQVNTRVJUKHJlc3VsdFsxXT09MTcpOworICBDUFBVTklUX0FTU0VSVChyZXN1bHRbMl09PTE4KTsKKyAgQ1BQVU5JVF9BU1NFUlQocmVzdWx0WzNdPT0wKTsKK30KKwordm9pZCBTZXREaWZmZXJlbmNlVGVzdDo6c2V0c3ltZDEoKQoreworICB2ZWN0b3I8aW50PiB2MSgxMCk7CisgIF9faW90YSh2MS5iZWdpbigpLCB2MS5lbmQoKSwgMCk7CisgIHZlY3RvcjxpbnQ+IHYyKDEwKTsKKyAgX19pb3RhKHYyLmJlZ2luKCksIHYyLmVuZCgpLCA3KTsKKworICB2ZWN0b3I8aW50PiBkaWZmOworICBzZXRfc3ltbWV0cmljX2RpZmZlcmVuY2UodjEuYmVnaW4oKSwgdjEuZW5kKCksIHYyLmJlZ2luKCksIHYyLmVuZCgpLCBiYWNrX2luc2VydGVyKGRpZmYpKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIGRpZmYuc2l6ZSgpID09IDE0ICk7CisgIGludCBpbnRfcmVzW10gPSB7MCwgMSwgMiwgMywgNCwgNSwgNiwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTZ9OworICBmb3IgKGludCBpID0gMDsgaSA8IDE0OyArK2kpIHsKKyAgICBDUFBVTklUX0FTU0VSVCggZGlmZltpXSA9PSBpbnRfcmVzW2ldICk7CisgIH0KK30KKwordm9pZCBTZXREaWZmZXJlbmNlVGVzdDo6c2V0c3ltZDIoKQoreworICBjb25zdCBjaGFyKiB3b3JkMSA9ICJBQkNERUZHSElKS0xNTk8iOworICBjb25zdCBjaGFyKiB3b3JkMiA9ICJMTU5PUFFSU1RVVldYWVoiOworCisgIHN0cmluZyBkaWZmOworICBzZXRfc3ltbWV0cmljX2RpZmZlcmVuY2Uod29yZDEsIHdvcmQxICsgOjpzdHJsZW4od29yZDEpLCB3b3JkMiwgd29yZDIgKyA6OnN0cmxlbih3b3JkMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrX2luc2VydGVyKGRpZmYpLCBsZXNzPGNoYXI+KCkpOworICBDUFBVTklUX0FTU0VSVCggZGlmZi5zaXplKCkgPT0gMjIgKTsKKyAgY2hhciBjaGFyX3Jlc1tdID0gIkFCQ0RFRkdISUpLUFFSU1RVVldYWVoiOworICBmb3IgKGludCBpID0gMDsgaSA8IDIyOyArK2kpIHsKKyAgICBDUFBVTklUX0FTU0VSVCggZGlmZltpXSA9PSBjaGFyX3Jlc1tpXSApOworICB9Cit9CisKK3ZvaWQgU2V0RGlmZmVyZW5jZVRlc3Q6OnNldGRpZmYwKCkKK3sKKyAgaW50IHYxWzNdID0geyAxMywgMTgsIDIzIH07CisgIGludCB2Mls0XSA9IHsgMTAsIDEzLCAxNywgMjMgfTsKKyAgaW50IHJlc3VsdFs0XSA9IHsgMCwgMCwgMCwgMCB9OworICAvLzE4IDAgMCAwCisgIC8vMTAgMTcgMjMgMAorCisgIHNldF9kaWZmZXJlbmNlKChpbnQqKXYxLCAoaW50Kil2MSArIDMsIChpbnQqKXYyLCAoaW50Kil2MiArIDQsIChpbnQqKXJlc3VsdCk7CisgIENQUFVOSVRfQVNTRVJUKCByZXN1bHRbMF0gPT0gMTggKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHJlc3VsdFsxXSA9PSAwICk7CisgIENQUFVOSVRfQVNTRVJUKCByZXN1bHRbMl0gPT0gMCApOworICBDUFBVTklUX0FTU0VSVCggcmVzdWx0WzNdID09IDAgKTsKKworICBzZXRfZGlmZmVyZW5jZSgoaW50Kil2MiwgKGludCopdjIgKyA0LCAoaW50Kil2MSwgKGludCopdjEgKyAyLCAoaW50KilyZXN1bHQpOworICBDUFBVTklUX0FTU0VSVCggcmVzdWx0WzBdID09IDEwICk7CisgIENQUFVOSVRfQVNTRVJUKCByZXN1bHRbMV0gPT0gMTcgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHJlc3VsdFsyXSA9PSAyMyApOworICBDUFBVTklUX0FTU0VSVCggcmVzdWx0WzNdID09IDAgKTsKK30KKwordm9pZCBTZXREaWZmZXJlbmNlVGVzdDo6c2V0ZGlmZjEoKQoreworICB2ZWN0b3I8aW50PiB2MSgxMCk7CisgIF9faW90YSh2MS5iZWdpbigpLCB2MS5lbmQoKSwgMCk7CisgIHZlY3RvcjxpbnQ+IHYyKDEwKTsKKyAgX19pb3RhKHYyLmJlZ2luKCksIHYyLmVuZCgpLCA3KTsKKworICB2ZWN0b3I8aW50PiBkaWZmOworICBzZXRfZGlmZmVyZW5jZSh2MS5iZWdpbigpLCB2MS5lbmQoKSwgdjIuYmVnaW4oKSwgdjIuZW5kKCksIGJhY2tfaW5zZXJ0ZXIoZGlmZikpOworICBDUFBVTklUX0FTU0VSVCggZGlmZi5zaXplKCkgPT0gNyApOworICBmb3IgKGludCBpID0gMDsgaSA8IDc7ICsraSkgeworICAgIENQUFVOSVRfQVNTRVJUKCBkaWZmW2ldID09IGkgKTsKKyAgfQorfQorCit2b2lkIFNldERpZmZlcmVuY2VUZXN0OjpzZXRkaWZmMigpCit7CisgIGNvbnN0IGNoYXIqIHdvcmQxID0gIkFCQ0RFRkdISUpLTE1OTyI7CisgIGNvbnN0IGNoYXIqIHdvcmQyID0gIkxNTk9QUVJTVFVWV1hZWiI7CisKKyAgc3RyaW5nIGRpZmY7CisgIHNldF9kaWZmZXJlbmNlKHdvcmQxLCB3b3JkMSArIDo6c3RybGVuKHdvcmQxKSwgd29yZDIsIHdvcmQyICsgOjpzdHJsZW4od29yZDIpLCBiYWNrX2luc2VydGVyKGRpZmYpLCBsZXNzPGNoYXI+KCkpOworICBDUFBVTklUX0FTU0VSVCggZGlmZi5zaXplKCkgPT0gMTEgKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMTsgKytpKSB7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGRpZmZbaV0gPT0gKCdBJyArIGkpICk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9zZXRpbnRlcl90ZXN0LmNwcCBiL3Rlc3QvdW5pdC9zZXRpbnRlcl90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmNmZDc4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L3NldGludGVyX3Rlc3QuY3BwCkBAIC0wLDAgKzEsNzkgQEAKKyNpbmNsdWRlIDxudW1lcmljPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisKKyNpbmNsdWRlICJpb3RhLmgiCisjaW5jbHVkZSAiY3BwdW5pdC9jcHB1bml0X3Byb3h5LmgiCisKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZChfU1RMUF9VU0VfTkFNRVNQQUNFUykKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisjZW5kaWYKKworLy8KKy8vIFRlc3RDYXNlIGNsYXNzCisvLworY2xhc3MgU2V0SW50ZXJzZWN0aW9uVGVzdCA6IHB1YmxpYyBDUFBVTklUX05TOjpUZXN0Q2FzZQoreworICBDUFBVTklUX1RFU1RfU1VJVEUoU2V0SW50ZXJzZWN0aW9uVGVzdCk7CisgIENQUFVOSVRfVEVTVChzZXRpbnRyMCk7CisgIENQUFVOSVRfVEVTVChzZXRpbnRyMSk7CisgIENQUFVOSVRfVEVTVChzZXRpbnRyMik7CisgIENQUFVOSVRfVEVTVF9TVUlURV9FTkQoKTsKKworcHJvdGVjdGVkOgorICB2b2lkIHNldGludHIwKCk7CisgIHZvaWQgc2V0aW50cjEoKTsKKyAgdm9pZCBzZXRpbnRyMigpOworfTsKKworQ1BQVU5JVF9URVNUX1NVSVRFX1JFR0lTVFJBVElPTihTZXRJbnRlcnNlY3Rpb25UZXN0KTsKKworLy8KKy8vIHRlc3RzIGltcGxlbWVudGF0aW9uCisvLwordm9pZCBTZXRJbnRlcnNlY3Rpb25UZXN0OjpzZXRpbnRyMCgpCit7CisgIGludCB2MVszXSA9IHsgMTMsIDE4LCAyMyB9OworICBpbnQgdjJbNF0gPSB7IDEwLCAxMywgMTcsIDIzIH07CisgIGludCByZXN1bHRbNF0gPSB7IDAsIDAsIDAsIDAgfTsKKworICBzZXRfaW50ZXJzZWN0aW9uKChpbnQqKXYxLCAoaW50Kil2MSArIDMsIChpbnQqKXYyLCAoaW50Kil2MiArIDQsIChpbnQqKXJlc3VsdCk7CisKKyAgQ1BQVU5JVF9BU1NFUlQocmVzdWx0WzBdPT0xMyk7CisgIENQUFVOSVRfQVNTRVJUKHJlc3VsdFsxXT09MjMpOworICBDUFBVTklUX0FTU0VSVChyZXN1bHRbMl09PTApOworICBDUFBVTklUX0FTU0VSVChyZXN1bHRbM109PTApOworfQorCit2b2lkIFNldEludGVyc2VjdGlvblRlc3Q6OnNldGludHIxKCkKK3sKKyAgdmVjdG9yIDxpbnQ+IHYxKDEwKTsKKyAgX19pb3RhKHYxLmJlZ2luKCksIHYxLmVuZCgpLCAwKTsKKyAgdmVjdG9yIDxpbnQ+IHYyKDEwKTsKKyAgX19pb3RhKHYyLmJlZ2luKCksIHYyLmVuZCgpLCA3KTsKKworICB2ZWN0b3I8aW50PiBpbnRlcjsKKyAgc2V0X2ludGVyc2VjdGlvbih2MS5iZWdpbigpLCB2MS5lbmQoKSwgdjIuYmVnaW4oKSwgdjIuZW5kKCksIGJhY2tfaW5zZXJ0ZXIoaW50ZXIpKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIGludGVyLnNpemUoKSA9PSAzICk7CisgIENQUFVOSVRfQVNTRVJUKCBpbnRlclswXSA9PSA3ICk7CisgIENQUFVOSVRfQVNTRVJUKCBpbnRlclsxXSA9PSA4ICk7CisgIENQUFVOSVRfQVNTRVJUKCBpbnRlclsyXSA9PSA5ICk7Cit9CisKK3ZvaWQgU2V0SW50ZXJzZWN0aW9uVGVzdDo6c2V0aW50cjIoKQoreworICBjb25zdCBjaGFyKiB3b3JkMSA9ICJBQkNERUZHSElKS0xNTk8iOworICBjb25zdCBjaGFyKiB3b3JkMiA9ICJMTU5PUFFSU1RVVldYWVoiOworCisgIHN0cmluZyBpbnRlcjsKKyAgc2V0X2ludGVyc2VjdGlvbih3b3JkMSwgd29yZDEgKyA6OnN0cmxlbih3b3JkMSksIHdvcmQyLCB3b3JkMiArIDo6c3RybGVuKHdvcmQyKSwKKyAgICAgICAgICAgICAgICAgICBiYWNrX2luc2VydGVyKGludGVyKSwgbGVzczxjaGFyPigpKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIGludGVyLnNpemUoKSA9PSA0ICk7CisgIENQUFVOSVRfQVNTRVJUKCBpbnRlclswXSA9PSAnTCcgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIGludGVyWzFdID09ICdNJyApOworICBDUFBVTklUX0FTU0VSVCggaW50ZXJbMl0gPT0gJ04nICk7CisgIENQUFVOSVRfQVNTRVJUKCBpbnRlclszXSA9PSAnTycgKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9zZXRqbXBfaGVhZGVyX3Rlc3QuYyBiL3Rlc3QvdW5pdC9zZXRqbXBfaGVhZGVyX3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDk2Mjg5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L3NldGptcF9oZWFkZXJfdGVzdC5jCkBAIC0wLDAgKzEsOCBAQAorLyogVGhpcyB0ZXN0IHB1cnBvc2UgaXMgc2ltcGx5IHRvIGNoZWNrIFN0YW5kYXJkIGhlYWRlciBpbmRlcGVuZGFuY3kgdGhhdAorICogaXMgdG8gc2F5IHRoYXQgdGhlIGhlYWRlciBjYW4gYmUgaW5jbHVkZWQgYWxvbmUgd2l0aG91dCBhbnkgcHJldmlvdXMKKyAqIGluY2x1ZGUuCisgKiBBZGRpdGlvbm5hbHksIGZvciBDIFN0YW5kYXJkIGhlYWRlcnMgdGhhdCBTVExwb3J0IGV4cG9zZSwgaXQgY2FuIGFsc28gYmUKKyAqIHVzZWQgdG8gY2hlY2sgdGhhdCBmaWxlcyBpbmNsdWRlZCBieSB0aG9zZSBoZWFkZXJzIGFyZSBjb21wYXRpYmxlIHdpdGgKKyAqIHB1cmUgQyBjb21waWxlcnMuCisgKi8KKyNpbmNsdWRlIDxzZXRqbXAuaD4KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9zZXRqbXBfaGVhZGVyX3Rlc3QyLmNwcCBiL3Rlc3QvdW5pdC9zZXRqbXBfaGVhZGVyX3Rlc3QyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGU0ZTRhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L3NldGptcF9oZWFkZXJfdGVzdDIuY3BwCkBAIC0wLDAgKzEsMTUgQEAKKy8qIFRoaXMgdGVzdCBwdXJwb3NlIGlzIHNpbXBseSB0byBjaGVjayBTdGFuZGFyZCBoZWFkZXIgaW5kZXBlbmRhbmN5IHRoYXQKKyAqIGlzIHRvIHNheSB0aGF0IHRoZSBoZWFkZXIgY2FuIGJlIGluY2x1ZGVkIGFsb25lIHdpdGhvdXQgYW55IHByZXZpb3VzCisgKiBpbmNsdWRlLgorICogQWRkaXRpb25uYWx5LCBmb3IgQyBTdGFuZGFyZCBoZWFkZXJzIHRoYXQgU1RMcG9ydCBleHBvc2UsIGl0IGNhbiBhbHNvIGJlCisgKiB1c2VkIHRvIGNoZWNrIHRoYXQgZmlsZXMgaW5jbHVkZWQgYnkgdGhvc2UgaGVhZGVycyBhcmUgY29tcGF0aWJsZSB3aXRoCisgKiBwdXJlIEMgY29tcGlsZXJzLgorICovCisKKy8qCisgKiBTb21ldGltZXMsIGlmIG5hdGl2ZSBzZXRqbXAuaCB3YXMgaW5jbHVkZWQgZmlyc3QsIHRoZSBzZXRqbXAgZnVuY3Rpb25zCisgKiBzaXR1YXRlZCBpbiBnbG9iYWwgbmFtZXNwYWNlLCBub3QgaW4gdmVuZG9yJ3Mgc3RkLiBUaGlzIG1heSBjb25mdXNlCisgKiBmb2xsb3dpbmcgY3NldGptcAorICovCisjaW5jbHVkZSA8c2V0am1wLmg+CisjaW5jbHVkZSA8Y3NldGptcD4KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9zZXR1bmlvbl90ZXN0LmNwcCBiL3Rlc3QvdW5pdC9zZXR1bmlvbl90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Nzc5NTNlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L3NldHVuaW9uX3Rlc3QuY3BwCkBAIC0wLDAgKzEsODEgQEAKKyNpbmNsdWRlIDxudW1lcmljPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisKKyNpbmNsdWRlICJpb3RhLmgiCisjaW5jbHVkZSAiY3BwdW5pdC9jcHB1bml0X3Byb3h5LmgiCisKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZChfU1RMUF9VU0VfTkFNRVNQQUNFUykKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisjZW5kaWYKKworLy8KKy8vIFRlc3RDYXNlIGNsYXNzCisvLworY2xhc3MgU2V0VW5pb25UZXN0IDogcHVibGljIENQUFVOSVRfTlM6OlRlc3RDYXNlCit7CisgIENQUFVOSVRfVEVTVF9TVUlURShTZXRVbmlvblRlc3QpOworICBDUFBVTklUX1RFU1Qoc2V0dW5vbjApOworICBDUFBVTklUX1RFU1Qoc2V0dW5vbjEpOworICBDUFBVTklUX1RFU1Qoc2V0dW5vbjIpOworICBDUFBVTklUX1RFU1RfU1VJVEVfRU5EKCk7CisKK3Byb3RlY3RlZDoKKyAgdm9pZCBzZXR1bm9uMCgpOworICB2b2lkIHNldHVub24xKCk7CisgIHZvaWQgc2V0dW5vbjIoKTsKK307CisKK0NQUFVOSVRfVEVTVF9TVUlURV9SRUdJU1RSQVRJT04oU2V0VW5pb25UZXN0KTsKKworLy8KKy8vIHRlc3RzIGltcGxlbWVudGF0aW9uCisvLwordm9pZCBTZXRVbmlvblRlc3Q6OnNldHVub24wKCkKK3sKKyAgaW50IHYxWzNdID0geyAxMywgMTgsIDIzIH07CisgIGludCB2Mls0XSA9IHsgMTAsIDEzLCAxNywgMjMgfTsKKyAgaW50IHJlc3VsdFs3XSA9IHsgMCwgMCwgMCwgMCwgMCwgMCwgMCB9OworCisgIHNldF91bmlvbigoaW50Kil2MSwgKGludCopdjEgKyAzLCAoaW50Kil2MiwgKGludCopdjIgKyA0LCAoaW50KilyZXN1bHQpOworCisgIENQUFVOSVRfQVNTRVJUKHJlc3VsdFswXT09MTApOworICBDUFBVTklUX0FTU0VSVChyZXN1bHRbMV09PTEzKTsKKyAgQ1BQVU5JVF9BU1NFUlQocmVzdWx0WzJdPT0xNyk7CisgIENQUFVOSVRfQVNTRVJUKHJlc3VsdFszXT09MTgpOworICBDUFBVTklUX0FTU0VSVChyZXN1bHRbNF09PTIzKTsKKyAgQ1BQVU5JVF9BU1NFUlQocmVzdWx0WzVdPT0wKTsKKyAgQ1BQVU5JVF9BU1NFUlQocmVzdWx0WzZdPT0wKTsKK30KKwordm9pZCBTZXRVbmlvblRlc3Q6OnNldHVub24xKCkKK3sKKyAgdmVjdG9yIDxpbnQ+IHYxKDEwKTsKKyAgX19pb3RhKHYxLmJlZ2luKCksIHYxLmVuZCgpLCAwKTsKKyAgdmVjdG9yIDxpbnQ+IHYyKDEwKTsKKyAgX19pb3RhKHYyLmJlZ2luKCksIHYyLmVuZCgpLCA3KTsKKworICB2ZWN0b3I8aW50PiBkaWZmOworICBzZXRfdW5pb24odjEuYmVnaW4oKSwgdjEuZW5kKCksIHYyLmJlZ2luKCksIHYyLmVuZCgpLCBiYWNrX2luc2VydGVyKGRpZmYpKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIGRpZmYuc2l6ZSgpID09IDE3ICk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTc7ICsraSkgeworICAgIENQUFVOSVRfQVNTRVJUKCBkaWZmW2ldID09IGkgKTsKKyAgfQorfQorCit2b2lkIFNldFVuaW9uVGVzdDo6c2V0dW5vbjIoKQoreworICBjb25zdCBjaGFyKiB3b3JkMSA9ICJBQkNERUZHSElKS0xNTk8iOworICBjb25zdCBjaGFyKiB3b3JkMiA9ICJMTU5PUFFSU1RVVldYWVoiOworCisgIHN0cmluZyBkaWZmOworICBzZXRfdW5pb24od29yZDEsIHdvcmQxICsgOjpzdHJsZW4od29yZDEpLCB3b3JkMiwgd29yZDIgKyA6OnN0cmxlbih3b3JkMiksCisgICAgICAgICAgICBiYWNrX2luc2VydGVyKGRpZmYpLCBsZXNzPGNoYXI+KCkpOworICBDUFBVTklUX0FTU0VSVCggZGlmZi5zaXplKCkgPT0gMjYgKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNjsgKytpKSB7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGRpZmZbaV0gPT0gKCdBJyArIGkpICk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9zaGFyZWRfcHRyX3Rlc3QuY3BwIGIvdGVzdC91bml0L3NoYXJlZF9wdHJfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUzOTNkZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9zaGFyZWRfcHRyX3Rlc3QuY3BwCkBAIC0wLDAgKzEsNDEgQEAKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpZiAhZGVmaW5lZChfU1RMUF9OT19FWFRFTlNJT05TKSAmJiBkZWZpbmVkKF9TVExQX1VTRV9CT09TVF9TVVBQT1JUKQorCisvLyAjaW5jbHVkZSA8dHlwZWluZm8+CisjaW5jbHVkZSAiY3BwdW5pdC9jcHB1bml0X3Byb3h5LmgiCisKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZChfU1RMUF9VU0VfTkFNRVNQQUNFUykKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisjZW5kaWYKKworY2xhc3MgU2hhcmVkUHRyVGVzdCA6CisgICAgcHVibGljIENQUFVOSVRfTlM6OlRlc3RDYXNlCit7CisgICAgQ1BQVU5JVF9URVNUX1NVSVRFKFNoYXJlZFB0clRlc3QpOworICAgIENQUFVOSVRfVEVTVChzaGFyZWRfZnJvbV90aGlzKTsKKyAgICBDUFBVTklUX1RFU1RfU1VJVEVfRU5EKCk7CisKKyAgcHJvdGVjdGVkOgorICAgIHZvaWQgc2hhcmVkX2Zyb21fdGhpcygpOworfTsKKworQ1BQVU5JVF9URVNUX1NVSVRFX1JFR0lTVFJBVElPTihTaGFyZWRQdHJUZXN0KTsKKworc3RydWN0IFg7CisKK3N0cnVjdCBYIDoKKyAgICBwdWJsaWMgc3RkOjp0cjE6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPFg+Cit7Cit9OworCit2b2lkIFNoYXJlZFB0clRlc3Q6OnNoYXJlZF9mcm9tX3RoaXMoKQoreworICBzdGQ6OnRyMTo6c2hhcmVkX3B0cjxYPiBwKCBuZXcgWCApOworICBzdGQ6OnRyMTo6c2hhcmVkX3B0cjxYPiBxID0gcC0+c2hhcmVkX2Zyb21fdGhpcygpOworCisgIENQUFVOSVRfQ0hFQ0soIHAgPT0gcSApOworICBDUFBVTklUX0NIRUNLKCAhKHAgPCBxKSAmJiAhKHEgPCBwKSApOyAvLyBwIGFuZCBxIHNoYXJlIG93bmVyc2hpcAorfQorCisjZW5kaWYgLyogIV9TVExQX05PX0VYVEVOU0lPTlMgJiYgX1NUTFBfVVNFX0JPT1NUX1NVUFBPUlQgKi8KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9zaWduYWxfaGVhZGVyX3Rlc3QuYyBiL3Rlc3QvdW5pdC9zaWduYWxfaGVhZGVyX3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTc5ZWIyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L3NpZ25hbF9oZWFkZXJfdGVzdC5jCkBAIC0wLDAgKzEsOCBAQAorLyogVGhpcyB0ZXN0IHB1cnBvc2UgaXMgc2ltcGx5IHRvIGNoZWNrIFN0YW5kYXJkIGhlYWRlciBpbmRlcGVuZGFuY3kgdGhhdAorICogaXMgdG8gc2F5IHRoYXQgdGhlIGhlYWRlciBjYW4gYmUgaW5jbHVkZWQgYWxvbmUgd2l0aG91dCBhbnkgcHJldmlvdXMKKyAqIGluY2x1ZGUuCisgKiBBZGRpdGlvbm5hbHksIGZvciBDIFN0YW5kYXJkIGhlYWRlcnMgdGhhdCBTVExwb3J0IGV4cG9zZSwgaXQgY2FuIGFsc28gYmUKKyAqIHVzZWQgdG8gY2hlY2sgdGhhdCBmaWxlcyBpbmNsdWRlZCBieSB0aG9zZSBoZWFkZXJzIGFyZSBjb21wYXRpYmxlIHdpdGgKKyAqIHB1cmUgQyBjb21waWxlcnMuCisgKi8KKyNpbmNsdWRlIDxzaWduYWwuaD4KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9zbGlzdF90ZXN0LmNwcCBiL3Rlc3QvdW5pdC9zbGlzdF90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODNlY2UyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L3NsaXN0X3Rlc3QuY3BwCkBAIC0wLDAgKzEsNTU0IEBACisvL0hhcyB0byBiZSBmaXJzdCBmb3IgU3RhY2tBbGxvY2F0b3Igc3dhcCBvdmVybG9hZCB0byBiZSB0YWtlbgorLy9pbnRvIGFjY291bnQgKGF0IGxlYXN0IHVzaW5nIEdDQyA0LjAuMSkKKyNpbmNsdWRlICJzdGFja19hbGxvY2F0b3IuaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKKyMgIGluY2x1ZGUgPHNsaXN0PgorIyAgaWYgIWRlZmluZWQgKF9TVExQX1VTRV9OT19JT1NUUkVBTVMpCisjICAgIGluY2x1ZGUgPHNzdHJlYW0+CisjICBlbmRpZgorIyAgaW5jbHVkZSA8aXRlcmF0b3I+CisjICBpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2VuZGlmCisKKyNpbmNsdWRlICJjcHB1bml0L2NwcHVuaXRfcHJveHkuaCIKKworI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkKF9TVExQX1VTRV9OQU1FU1BBQ0VTKQordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKFNUTFBPUlQpICYmIGRlZmluZWQoX19HTlVDX18pCit1c2luZyBuYW1lc3BhY2UgX19nbnVfY3h4OworI2VuZGlmCisKKy8vCisvLyBUZXN0Q2FzZSBjbGFzcworLy8KK2NsYXNzIFNsaXN0VGVzdCA6IHB1YmxpYyBDUFBVTklUX05TOjpUZXN0Q2FzZQoreworICBDUFBVTklUX1RFU1RfU1VJVEUoU2xpc3RUZXN0KTsKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykgfHwgZGVmaW5lZCAoX1NUTFBfVVNFX05PX0lPU1RSRUFNUykgCisgIENQUFVOSVRfSUdOT1JFOworI2VuZGlmCisgIENQUFVOSVRfVEVTVChzbGlzdDEpOworI2lmIGRlZmluZWQgKFNUTFBPUlQpICYmIGRlZmluZWQgKF9TVExQX1VTRV9OT19JT1NUUkVBTVMpIAorICBDUFBVTklUX1NUT1BfSUdOT1JFOworI2VuZGlmCisgIENQUFVOSVRfVEVTVChlcmFzZSk7CisgIENQUFVOSVRfVEVTVChpbnNlcnQpOworICBDUFBVTklUX1RFU1Qoc3BsaWNlKTsKKyAgQ1BQVU5JVF9URVNUKGFsbG9jYXRvcl93aXRoX3N0YXRlKTsKKyAgQ1BQVU5JVF9URVNUX1NVSVRFX0VORCgpOworCitwcm90ZWN0ZWQ6CisgIHZvaWQgc2xpc3QxKCk7CisgIHZvaWQgZXJhc2UoKTsKKyAgdm9pZCBpbnNlcnQoKTsKKyAgdm9pZCBzcGxpY2UoKTsKKyAgdm9pZCBhbGxvY2F0b3Jfd2l0aF9zdGF0ZSgpOworfTsKKworQ1BQVU5JVF9URVNUX1NVSVRFX1JFR0lTVFJBVElPTihTbGlzdFRlc3QpOworCisvLworLy8gdGVzdHMgaW1wbGVtZW50YXRpb24KKy8vCit2b2lkIFNsaXN0VGVzdDo6c2xpc3QxKCkKK3sKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiAhZGVmaW5lZCAoX1NUTFBfVVNFX05PX0lPU1RSRUFNUykgJiYgIWRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpCisvKgorb3JpZ2luYWw6IHhseHRzcworcmV2ZXJzZWQ6IHNzdHhseAorcmVtb3ZlZDogc3N0bAordW5pcXVlZDogc3RsCitzb3J0ZWQ6IGxzdAorKi8KKworICBjaGFyIGFycmF5IFtdID0geyAneCcsICdsJywgJ3gnLCAndCcsICdzJywgJ3MnIH07CisgIG9zdHJpbmdzdHJlYW0gb3M7CisgIG9zdHJlYW1faXRlcmF0b3I8Y2hhcj4gbyhvcywiIik7CisgIHNsaXN0PGNoYXI+IHN0cihhcnJheSswLCBhcnJheSArIDYpOworICBzbGlzdDxjaGFyPjo6aXRlcmF0b3IgaTsKKyAgLy9DaGVjayBjb25zdF9pdGVyYXRvciBjb25zdHJ1Y3Rpb24gZnJvbSBpdGVyYXRvcgorICBzbGlzdDxjaGFyPjo6Y29uc3RfaXRlcmF0b3IgY2koaSk7CisgIHNsaXN0PGNoYXI+Ojpjb25zdF9pdGVyYXRvciBjaTIoY2kpOworLy8gIGNvdXQgPDwgInJldmVyc2VkOiAiOworICBzdHIucmV2ZXJzZSgpOworICBmb3IoaSA9IHN0ci5iZWdpbigpOyBpICE9IHN0ci5lbmQoKTsgaSsrKQorICAgIG9zIDw8ICppOworICBzdHJpbmdidWYqIGJ1ZmY9b3MucmRidWYoKTsKKyAgc3RyaW5nIHJlc3VsdD1idWZmLT5zdHIoKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIXN0cmNtcChyZXN1bHQuY19zdHIoKSwic3N0eGx4IikpOworCisgIC8vY291dCA8PCAicmVtb3ZlZDogIjsKKyAgc3RyLnJlbW92ZSgneCcpOworICBvc3RyaW5nc3RyZWFtIG9zMjsKKyAgZm9yKGkgPSBzdHIuYmVnaW4oKTsgaSAhPSBzdHIuZW5kKCk7IGkrKykKKyAgICBvczIgPDwgKmk7CisgIGJ1ZmY9b3MyLnJkYnVmKCk7CisgIHJlc3VsdD1idWZmLT5zdHIoKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIXN0cmNtcChyZXN1bHQuY19zdHIoKSwic3N0bCIpKTsKKworCisgIC8vY291dCA8PCAidW5pcXVlZDogIjsKKyAgc3RyLnVuaXF1ZSgpOworICBvc3RyaW5nc3RyZWFtIG9zMzsKKyAgZm9yKGkgPSBzdHIuYmVnaW4oKTsgaSAhPSBzdHIuZW5kKCk7IGkrKykKKyAgICBvczMgPDwgKmk7CisgIGJ1ZmY9b3MzLnJkYnVmKCk7CisgIHJlc3VsdD1idWZmLT5zdHIoKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIXN0cmNtcChyZXN1bHQuY19zdHIoKSwic3RsIikpOworCisgIC8vY291dCA8PCAic29ydGVkOiAiOworICBzdHIuc29ydCgpOworICBvc3RyaW5nc3RyZWFtIG9zNDsKKyAgZm9yKGkgPSBzdHIuYmVnaW4oKTsgaSAhPSBzdHIuZW5kKCk7IGkrKykKKyAgICBvczQgPDwgKmk7CisgIGJ1ZmYgPSBvczQucmRidWYoKTsKKyAgcmVzdWx0ID0gYnVmZi0+c3RyKCk7CisgIENQUFVOSVRfQVNTRVJUKCFzdHJjbXAocmVzdWx0LmNfc3RyKCksImxzdCIpKTsKKworICAvL0Egc21hbGwgY29tcGlsYXRpb24gdGltZSBjaGVjayB0byBiZSBhY3RpdmF0ZWQgZnJvbSB0aW1lIHRvIHRpbWU6CisjICBpZiAwCisgIHsKKyAgICBzbGlzdDxjaGFyPjo6aXRlcmF0b3Igc2xfY2hhcl9pdGU7CisgICAgc2xpc3Q8aW50Pjo6aXRlcmF0b3Igc2xfaW50X2l0ZTsKKyAgICBDUFBVTklUX0FTU0VSVCggc2xfY2hhcl9pdGUgIT0gc2xfaW50X2l0ZSApOworICB9CisjICBlbmRpZgorI2VuZGlmCit9CisKK3ZvaWQgU2xpc3RUZXN0OjplcmFzZSgpCit7CisjaWYgZGVmaW5lZCAoU1RMUE9SVCkgJiYgIWRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpCisgIGludCBhcnJheVtdID0geyAwLCAxLCAyLCAzLCA0IH07CisgIHNsaXN0PGludD4gc2woYXJyYXksIGFycmF5ICsgNSk7CisgIHNsaXN0PGludD46Oml0ZXJhdG9yIHNsaXQ7CisKKyAgc2xpdCA9IHNsLmVyYXNlKHNsLmJlZ2luKCkpOworICBDUFBVTklUX0FTU0VSVCggKnNsaXQgPT0gMSk7CisKKyAgKytzbGl0Kys7ICsrc2xpdDsKKyAgc2xpdCA9IHNsLmVyYXNlKHNsLmJlZ2luKCksIHNsaXQpOworICBDUFBVTklUX0FTU0VSVCggKnNsaXQgPT0gMyApOworCisgIHNsLmFzc2lnbihhcnJheSwgYXJyYXkgKyA1KTsKKworICBzbGl0ID0gc2wuZXJhc2VfYWZ0ZXIoc2wuYmVnaW4oKSk7CisgIENQUFVOSVRfQVNTRVJUKCAqc2xpdCA9PSAyICk7CisKKyAgc2xpdCA9IHNsLmJlZ2luKCk7ICsrc2xpdDsgKytzbGl0OworICBzbGl0ID0gc2wuZXJhc2VfYWZ0ZXIoc2wuYmVnaW4oKSwgc2xpdCk7CisgIENQUFVOSVRfQVNTRVJUKCAqc2xpdCA9PSAzICk7CisKKyAgc2wuZXJhc2VfYWZ0ZXIoc2wuYmVmb3JlX2JlZ2luKCkpOworICBDUFBVTklUX0FTU0VSVCggc2wuZnJvbnQoKSA9PSAzICk7CisjZW5kaWYKK30KKwordm9pZCBTbGlzdFRlc3Q6Omluc2VydCgpCit7CisjaWYgZGVmaW5lZCAoU1RMUE9SVCkgJiYgIWRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpCisgIGludCBhcnJheVtdID0geyAwLCAxLCAyLCAzLCA0IH07CisKKyAgLy9pbnNlcnQKKyAgeworICAgIHNsaXN0PGludD4gc2w7CisKKyAgICBzbC5pbnNlcnQoc2wuYmVnaW4oKSwgNSk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHNsLmZyb250KCkgPT0gNSApOworICAgIENQUFVOSVRfQVNTRVJUKCBzbC5zaXplKCkgPT0gMSApOworCisgICAgLy9kZWJ1ZyBtb2RlIGNoZWNrOgorICAgIC8vc2wuaW5zZXJ0KHNsLmJlZm9yZV9iZWdpbigpLCBhcnJheSwgYXJyYXkgKyA1KTsKKworICAgIHNsLmluc2VydChzbC5iZWdpbigpLCBhcnJheSwgYXJyYXkgKyA1KTsKKyAgICBDUFBVTklUX0FTU0VSVCggc2wuc2l6ZSgpID09IDYgKTsKKyAgICBpbnQgaTsKKyAgICBzbGlzdDxpbnQ+OjppdGVyYXRvciBzbGl0KHNsLmJlZ2luKCkpOworICAgIGZvciAoaSA9IDA7IHNsaXQgIT0gc2wuZW5kKCk7ICsrc2xpdCwgKytpKSB7CisgICAgICBDUFBVTklUX0FTU0VSVCggKnNsaXQgPT0gaSApOworICAgIH0KKyAgfQorCisgIC8vaW5zZXJ0X2FmdGVyCisgIHsKKyAgICBzbGlzdDxpbnQ+IHNsOworCisgICAgLy9kZWJ1ZyBjaGVjazoKKyAgICAvL3NsLmluc2VydF9hZnRlcihzbC5iZWdpbigpLCA1KTsKKworICAgIHNsLmluc2VydF9hZnRlcihzbC5iZWZvcmVfYmVnaW4oKSwgNSk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHNsLmZyb250KCkgPT0gNSApOworICAgIENQUFVOSVRfQVNTRVJUKCBzbC5zaXplKCkgPT0gMSApOworCisgICAgc2wuaW5zZXJ0X2FmdGVyKHNsLmJlZm9yZV9iZWdpbigpLCBhcnJheSwgYXJyYXkgKyA1KTsKKyAgICBDUFBVTklUX0FTU0VSVCggc2wuc2l6ZSgpID09IDYgKTsKKyAgICBpbnQgaTsKKyAgICBzbGlzdDxpbnQ+OjppdGVyYXRvciBzbGl0KHNsLmJlZ2luKCkpOworICAgIGZvciAoaSA9IDA7IHNsaXQgIT0gc2wuZW5kKCk7ICsrc2xpdCwgKytpKSB7CisgICAgICBDUFBVTklUX0FTU0VSVCggKnNsaXQgPT0gaSApOworICAgIH0KKyAgfQorI2VuZGlmCit9CisKK3ZvaWQgU2xpc3RUZXN0OjpzcGxpY2UoKQoreworI2lmIGRlZmluZWQgKFNUTFBPUlQpICYmICFkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQorICBpbnQgYXJyYXlbXSA9IHsgMCwgMSwgMiwgMywgNCB9OworCisgIC8vc3BsaWNlCisgIHsKKyAgICBzbGlzdDxpbnQ+IHNsMShhcnJheSwgYXJyYXkgKyA1KTsKKyAgICBzbGlzdDxpbnQ+IHNsMihhcnJheSwgYXJyYXkgKyA1KTsKKyAgICBzbGlzdDxpbnQ+OjppdGVyYXRvciBzbGl0OworCisgICAgLy9hIG5vIG9wOgorICAgIHNsMS5zcGxpY2Uoc2wxLmJlZ2luKCksIHNsMSwgc2wxLmJlZ2luKCkpOworICAgIENQUFVOSVRfQVNTRVJUKCBzbDEgPT0gc2wyICk7CisKKyAgICBzbGl0ID0gc2wxLmJlZ2luKCk7ICsrc2xpdDsKKyAgICAvL2Egbm8gb3A6CisgICAgc2wxLnNwbGljZShzbGl0LCBzbDEsIHNsMS5iZWdpbigpKTsKKyAgICBDUFBVTklUX0FTU0VSVCggc2wxID09IHNsMiApOworCisgICAgc2wxLnNwbGljZShzbDEuZW5kKCksIHNsMSwgc2wxLmJlZ2luKCkpOworICAgIHNsaXQgPSBzbDEuYmVnaW4oKTsKKyAgICBDUFBVTklUX0FTU0VSVCggKihzbGl0KyspID09IDEgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggKihzbGl0KyspID09IDIgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggKihzbGl0KyspID09IDMgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggKihzbGl0KyspID09IDQgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggKnNsaXQgPT0gMCApOworICAgIHNsMS5zcGxpY2Uoc2wxLmJlZ2luKCksIHNsMSwgc2xpdCk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHNsMSA9PSBzbDIgKTsKKworICAgIHNsMS5zcGxpY2Uoc2wxLmJlZ2luKCksIHNsMik7CisgICAgc2l6ZV90IGk7CisgICAgZm9yIChpID0gMCwgc2xpdCA9IHNsMS5iZWdpbigpOyBzbGl0ICE9IHNsMS5lbmQoKTsgKytzbGl0LCArK2kpIHsKKyAgICAgIGlmIChpID09IDUpIGkgPSAwOworICAgICAgQ1BQVU5JVF9BU1NFUlQoICpzbGl0ID09IGFycmF5W2ldICk7CisgICAgfQorCisgICAgc2xpdCA9IHNsMS5iZWdpbigpOworICAgIGFkdmFuY2Uoc2xpdCwgNSk7CisgICAgQ1BQVU5JVF9BU1NFUlQoICpzbGl0ID09IDAgKTsKKyAgICBzbDIuc3BsaWNlKHNsMi5iZWdpbigpLCBzbDEsIHNsMS5iZWdpbigpLCBzbGl0KTsKKyAgICBDUFBVTklUX0FTU0VSVCggc2wxID09IHNsMiApOworCisgICAgc2xpdCA9IHNsMS5iZWdpbigpOyArK3NsaXQ7CisgICAgc2wxLnNwbGljZShzbDEuYmVnaW4oKSwgc2wxLCBzbGl0LCBzbDEuZW5kKCkpOworICAgIHNsaXQgPSBzbDEuYmVnaW4oKTsKKyAgICBDUFBVTklUX0FTU0VSVCggKihzbGl0KyspID09IDEgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggKihzbGl0KyspID09IDIgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggKihzbGl0KyspID09IDMgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggKihzbGl0KyspID09IDQgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggKnNsaXQgPT0gMCApOworCisgICAgLy8gYSBubyBvcAorICAgIHNsMi5zcGxpY2Uoc2wyLmVuZCgpLCBzbDIsIHNsMi5iZWdpbigpLCBzbDIuZW5kKCkpOworICAgIGZvciAoaSA9IDAsIHNsaXQgPSBzbDIuYmVnaW4oKTsgc2xpdCAhPSBzbDIuZW5kKCk7ICsrc2xpdCwgKytpKSB7CisgICAgICBDUFBVTklUX0FTU0VSVCggaSA8IDUgKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCAqc2xpdCA9PSBhcnJheVtpXSApOworICAgIH0KKworICAgIHNsaXQgPSBzbDIuYmVnaW4oKTsKKyAgICBhZHZhbmNlKHNsaXQsIDMpOworICAgIHNsMi5zcGxpY2Uoc2wyLmVuZCgpLCBzbDIsIHNsMi5iZWdpbigpLCBzbGl0KTsKKyAgICBzbGl0ID0gc2wyLmJlZ2luKCk7CisgICAgQ1BQVU5JVF9BU1NFUlQoICooc2xpdCsrKSA9PSAzICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoICooc2xpdCsrKSA9PSA0ICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoICooc2xpdCsrKSA9PSAwICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoICooc2xpdCsrKSA9PSAxICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoICpzbGl0ID09IDIgKTsKKyAgfQorCisgIC8vc3BsaWNlX2FmdGVyCisgIHsKKyAgICBzbGlzdDxpbnQ+IHNsMShhcnJheSwgYXJyYXkgKyA1KTsKKyAgICBzbGlzdDxpbnQ+IHNsMihhcnJheSwgYXJyYXkgKyA1KTsKKyAgICBzbGlzdDxpbnQ+OjppdGVyYXRvciBzbGl0OworCisgICAgLy9hIG5vIG9wOgorICAgIHNsMS5zcGxpY2VfYWZ0ZXIoc2wxLmJlZ2luKCksIHNsMSwgc2wxLmJlZ2luKCkpOworICAgIENQUFVOSVRfQVNTRVJUKCBzbDEgPT0gc2wyICk7CisKKyAgICBzbDEuc3BsaWNlX2FmdGVyKHNsMS5iZWZvcmVfYmVnaW4oKSwgc2wxLCBzbDEuYmVnaW4oKSk7CisgICAgc2xpdCA9IHNsMS5iZWdpbigpOworICAgIENQUFVOSVRfQVNTRVJUKCAqKHNsaXQrKykgPT0gMSApOworICAgIENQUFVOSVRfQVNTRVJUKCAqKHNsaXQrKykgPT0gMCApOworICAgIENQUFVOSVRfQVNTRVJUKCAqKHNsaXQrKykgPT0gMiApOworICAgIENQUFVOSVRfQVNTRVJUKCAqKHNsaXQrKykgPT0gMyApOworICAgIENQUFVOSVRfQVNTRVJUKCAqc2xpdCA9PSA0ICk7CisgICAgc2wxLnNwbGljZV9hZnRlcihzbDEuYmVmb3JlX2JlZ2luKCksIHNsMSwgc2wxLmJlZ2luKCkpOworICAgIENQUFVOSVRfQVNTRVJUKCBzbDEgPT0gc2wyICk7CisKKyAgICBzbDEuc3BsaWNlX2FmdGVyKHNsMS5iZWZvcmVfYmVnaW4oKSwgc2wyKTsKKyAgICBzaXplX3QgaTsKKyAgICBmb3IgKGkgPSAwLCBzbGl0ID0gc2wxLmJlZ2luKCk7IHNsaXQgIT0gc2wxLmVuZCgpOyArK3NsaXQsICsraSkgeworICAgICAgaWYgKGkgPT0gNSkgaSA9IDA7CisgICAgICBDUFBVTklUX0FTU0VSVCggKnNsaXQgPT0gYXJyYXlbaV0gKTsKKyAgICB9CisKKyAgICBzbGl0ID0gc2wxLmJlZ2luKCk7CisgICAgYWR2YW5jZShzbGl0LCA0KTsKKyAgICBDUFBVTklUX0FTU0VSVCggKnNsaXQgPT0gNCApOworICAgIHNsMi5zcGxpY2VfYWZ0ZXIoc2wyLmJlZm9yZV9iZWdpbigpLCBzbDEsIHNsMS5iZWZvcmVfYmVnaW4oKSwgc2xpdCk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHNsMSA9PSBzbDIgKTsKKworICAgIHNsMS5zcGxpY2VfYWZ0ZXIoc2wxLmJlZm9yZV9iZWdpbigpLCBzbDEsIHNsMS5iZWdpbigpLCBzbDEucHJldmlvdXMoc2wxLmVuZCgpKSk7CisgICAgc2xpdCA9IHNsMS5iZWdpbigpOworICAgIENQUFVOSVRfQVNTRVJUKCAqKHNsaXQrKykgPT0gMSApOworICAgIENQUFVOSVRfQVNTRVJUKCAqKHNsaXQrKykgPT0gMiApOworICAgIENQUFVOSVRfQVNTRVJUKCAqKHNsaXQrKykgPT0gMyApOworICAgIENQUFVOSVRfQVNTRVJUKCAqKHNsaXQrKykgPT0gNCApOworICAgIENQUFVOSVRfQVNTRVJUKCAqc2xpdCA9PSAwICk7CisKKyAgICAvLyBhIG5vIG9wCisgICAgc2wyLnNwbGljZV9hZnRlcihzbDIuYmVmb3JlX2JlZ2luKCksIHNsMiwgc2wyLmJlZm9yZV9iZWdpbigpLCBzbDIucHJldmlvdXMoc2wyLmVuZCgpKSk7CisgICAgZm9yIChpID0gMCwgc2xpdCA9IHNsMi5iZWdpbigpOyBzbGl0ICE9IHNsMi5lbmQoKTsgKytzbGl0LCArK2kpIHsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCBpIDwgNSApOworICAgICAgQ1BQVU5JVF9BU1NFUlQoICpzbGl0ID09IGFycmF5W2ldICk7CisgICAgfQorCisgICAgc2xpdCA9IHNsMi5iZWdpbigpOworICAgIGFkdmFuY2Uoc2xpdCwgMik7CisgICAgc2wyLnNwbGljZV9hZnRlcihzbDIucHJldmlvdXMoc2wyLmVuZCgpKSwgc2wyLCBzbDIuYmVmb3JlX2JlZ2luKCksIHNsaXQpOworICAgIHNsaXQgPSBzbDIuYmVnaW4oKTsKKyAgICBDUFBVTklUX0FTU0VSVCggKihzbGl0KyspID09IDMgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggKihzbGl0KyspID09IDQgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggKihzbGl0KyspID09IDAgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggKihzbGl0KyspID09IDEgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggKnNsaXQgPT0gMiApOworICB9CisjZW5kaWYKK30KKworCit2b2lkIFNsaXN0VGVzdDo6YWxsb2NhdG9yX3dpdGhfc3RhdGUoKQoreworI2lmIGRlZmluZWQgKFNUTFBPUlQpICYmICFkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQorICBjaGFyIGJ1ZjFbMTAyNF07CisgIFN0YWNrQWxsb2NhdG9yPGludD4gc3RhY2sxKGJ1ZjEsIGJ1ZjEgKyBzaXplb2YoYnVmMSkpOworCisgIGNoYXIgYnVmMlsxMDI0XTsKKyAgU3RhY2tBbGxvY2F0b3I8aW50PiBzdGFjazIoYnVmMiwgYnVmMiArIHNpemVvZihidWYyKSk7CisKKyAgdHlwZWRlZiBzbGlzdDxpbnQsIFN0YWNrQWxsb2NhdG9yPGludD4gPiBTbGlzdEludDsKKyAgeworICAgIFNsaXN0SW50IHNsaW50MSgxMCwgMCwgc3RhY2sxKTsKKyAgICBTbGlzdEludCBzbGludDFDcHkoc2xpbnQxKTsKKworICAgIFNsaXN0SW50IHNsaW50MigxMCwgMSwgc3RhY2syKTsKKyAgICBTbGlzdEludCBzbGludDJDcHkoc2xpbnQyKTsKKworICAgIHNsaW50MS5zd2FwKHNsaW50Mik7CisKKyAgICBDUFBVTklUX0FTU0VSVCggc2xpbnQxLmdldF9hbGxvY2F0b3IoKS5zd2FwZWQoKSApOworICAgIENQUFVOSVRfQVNTRVJUKCBzbGludDIuZ2V0X2FsbG9jYXRvcigpLnN3YXBlZCgpICk7CisKKyAgICBDUFBVTklUX0FTU0VSVCggc2xpbnQxID09IHNsaW50MkNweSApOworICAgIENQUFVOSVRfQVNTRVJUKCBzbGludDIgPT0gc2xpbnQxQ3B5ICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHNsaW50MS5nZXRfYWxsb2NhdG9yKCkgPT0gc3RhY2syICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHNsaW50Mi5nZXRfYWxsb2NhdG9yKCkgPT0gc3RhY2sxICk7CisgIH0KKyAgQ1BQVU5JVF9DSEVDSyggc3RhY2sxLm9rKCkgKTsKKyAgQ1BQVU5JVF9DSEVDSyggc3RhY2syLm9rKCkgKTsKKyAgc3RhY2sxLnJlc2V0KCk7IHN0YWNrMi5yZXNldCgpOworCisgIHsKKyAgICBTbGlzdEludCBzbGludDEoc3RhY2sxKTsKKyAgICBTbGlzdEludCBzbGludDFDcHkoc2xpbnQxKTsKKworICAgIFNsaXN0SW50IHNsaW50MigxMCwgMSwgc3RhY2syKTsKKyAgICBTbGlzdEludCBzbGludDJDcHkoc2xpbnQyKTsKKworICAgIHNsaW50MS5zd2FwKHNsaW50Mik7CisKKyAgICBDUFBVTklUX0FTU0VSVCggc2xpbnQxLmdldF9hbGxvY2F0b3IoKS5zd2FwZWQoKSApOworICAgIENQUFVOSVRfQVNTRVJUKCBzbGludDIuZ2V0X2FsbG9jYXRvcigpLnN3YXBlZCgpICk7CisKKyAgICBDUFBVTklUX0FTU0VSVCggc2xpbnQxID09IHNsaW50MkNweSApOworICAgIENQUFVOSVRfQVNTRVJUKCBzbGludDIgPT0gc2xpbnQxQ3B5ICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHNsaW50MS5nZXRfYWxsb2NhdG9yKCkgPT0gc3RhY2syICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHNsaW50Mi5nZXRfYWxsb2NhdG9yKCkgPT0gc3RhY2sxICk7CisgIH0KKyAgQ1BQVU5JVF9DSEVDSyggc3RhY2sxLm9rKCkgKTsKKyAgQ1BQVU5JVF9DSEVDSyggc3RhY2syLm9rKCkgKTsKKyAgc3RhY2sxLnJlc2V0KCk7IHN0YWNrMi5yZXNldCgpOworCisgIHsKKyAgICBTbGlzdEludCBzbGludDEoMTAsIDAsIHN0YWNrMSk7CisgICAgU2xpc3RJbnQgc2xpbnQxQ3B5KHNsaW50MSk7CisKKyAgICBTbGlzdEludCBzbGludDIoc3RhY2syKTsKKyAgICBTbGlzdEludCBzbGludDJDcHkoc2xpbnQyKTsKKworICAgIHNsaW50MS5zd2FwKHNsaW50Mik7CisKKyAgICBDUFBVTklUX0FTU0VSVCggc2xpbnQxLmdldF9hbGxvY2F0b3IoKS5zd2FwZWQoKSApOworICAgIENQUFVOSVRfQVNTRVJUKCBzbGludDIuZ2V0X2FsbG9jYXRvcigpLnN3YXBlZCgpICk7CisKKyAgICBDUFBVTklUX0FTU0VSVCggc2xpbnQxID09IHNsaW50MkNweSApOworICAgIENQUFVOSVRfQVNTRVJUKCBzbGludDIgPT0gc2xpbnQxQ3B5ICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHNsaW50MS5nZXRfYWxsb2NhdG9yKCkgPT0gc3RhY2syICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHNsaW50Mi5nZXRfYWxsb2NhdG9yKCkgPT0gc3RhY2sxICk7CisgIH0KKyAgQ1BQVU5JVF9DSEVDSyggc3RhY2sxLm9rKCkgKTsKKyAgQ1BQVU5JVF9DSEVDSyggc3RhY2syLm9rKCkgKTsKKyAgc3RhY2sxLnJlc2V0KCk7IHN0YWNrMi5yZXNldCgpOworCisgIC8vc3BsaWNlKGl0ZXJhdG9yLCBzbGlzdCkKKyAgeworICAgIFNsaXN0SW50IHNsaW50MSgxMCwgMCwgc3RhY2sxKTsKKyAgICBTbGlzdEludCBzbGludDIoMTAsIDEsIHN0YWNrMik7CisKKyAgICBzbGludDEuc3BsaWNlKHNsaW50MS5iZWdpbigpLCBzbGludDIpOworICAgIENQUFVOSVRfQVNTRVJUKCBzbGludDEuc2l6ZSgpID09IDIwICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHNsaW50Mi5lbXB0eSgpICk7CisgIH0KKyAgQ1BQVU5JVF9DSEVDSyggc3RhY2sxLm9rKCkgKTsKKyAgQ1BQVU5JVF9DSEVDSyggc3RhY2syLm9rKCkgKTsKKyAgc3RhY2sxLnJlc2V0KCk7IHN0YWNrMi5yZXNldCgpOworCisgIC8vc3BsaWNlKGl0ZXJhdG9yLCBzbGlzdCwgaXRlcmF0b3IpCisgIHsKKyAgICBTbGlzdEludCBzbGludDEoMTAsIDAsIHN0YWNrMSk7CisgICAgU2xpc3RJbnQgc2xpbnQyKDEwLCAxLCBzdGFjazIpOworCisgICAgc2xpbnQxLnNwbGljZShzbGludDEuYmVnaW4oKSwgc2xpbnQyLCBzbGludDIuYmVnaW4oKSk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHNsaW50MS5zaXplKCkgPT0gMTEgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggc2xpbnQyLnNpemUoKSA9PSA5ICk7CisgIH0KKyAgQ1BQVU5JVF9DSEVDSyggc3RhY2sxLm9rKCkgKTsKKyAgQ1BQVU5JVF9DSEVDSyggc3RhY2syLm9rKCkgKTsKKyAgc3RhY2sxLnJlc2V0KCk7IHN0YWNrMi5yZXNldCgpOworCisgIC8vc3BsaWNlKGl0ZXJhdG9yLCBzbGlzdCwgaXRlcmF0b3IsIGl0ZXJhdG9yKQorICB7CisgICAgU2xpc3RJbnQgc2xpbnQxKDEwLCAwLCBzdGFjazEpOworICAgIFNsaXN0SW50IHNsaW50MigxMCwgMSwgc3RhY2syKTsKKworICAgIFNsaXN0SW50OjppdGVyYXRvciBsaXQoc2xpbnQyLmJlZ2luKCkpOworICAgIGFkdmFuY2UobGl0LCA1KTsKKyAgICBzbGludDEuc3BsaWNlKHNsaW50MS5iZWdpbigpLCBzbGludDIsIHNsaW50Mi5iZWdpbigpLCBsaXQpOworICAgIENQUFVOSVRfQVNTRVJUKCBzbGludDEuc2l6ZSgpID09IDE1ICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHNsaW50Mi5zaXplKCkgPT0gNSApOworICB9CisgIENQUFVOSVRfQ0hFQ0soIHN0YWNrMS5vaygpICk7CisgIENQUFVOSVRfQ0hFQ0soIHN0YWNrMi5vaygpICk7CisgIHN0YWNrMS5yZXNldCgpOyBzdGFjazIucmVzZXQoKTsKKworICAvL3NwbGljZV9hZnRlcihpdGVyYXRvciwgc2xpc3QpCisgIHsKKyAgICBTbGlzdEludCBzbGludDEoMTAsIDAsIHN0YWNrMSk7CisgICAgU2xpc3RJbnQgc2xpbnQyKDEwLCAxLCBzdGFjazIpOworCisgICAgc2xpbnQxLnNwbGljZV9hZnRlcihzbGludDEuYmVmb3JlX2JlZ2luKCksIHNsaW50Mik7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHNsaW50MS5zaXplKCkgPT0gMjAgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggc2xpbnQyLmVtcHR5KCkgKTsKKyAgfQorICBDUFBVTklUX0NIRUNLKCBzdGFjazEub2soKSApOworICBDUFBVTklUX0NIRUNLKCBzdGFjazIub2soKSApOworICBzdGFjazEucmVzZXQoKTsgc3RhY2syLnJlc2V0KCk7CisKKyAgLy9zcGxpY2VfYWZ0ZXIoaXRlcmF0b3IsIHNsaXN0LCBpdGVyYXRvcikKKyAgeworICAgIFNsaXN0SW50IHNsaW50MSgxMCwgMCwgc3RhY2sxKTsKKyAgICBTbGlzdEludCBzbGludDIoMTAsIDEsIHN0YWNrMik7CisKKyAgICBzbGludDEuc3BsaWNlX2FmdGVyKHNsaW50MS5iZWZvcmVfYmVnaW4oKSwgc2xpbnQyLCBzbGludDIuYmVmb3JlX2JlZ2luKCkpOworICAgIENQUFVOSVRfQVNTRVJUKCBzbGludDEuc2l6ZSgpID09IDExICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHNsaW50Mi5zaXplKCkgPT0gOSApOworICB9CisgIENQUFVOSVRfQ0hFQ0soIHN0YWNrMS5vaygpICk7CisgIENQUFVOSVRfQ0hFQ0soIHN0YWNrMi5vaygpICk7CisgIHN0YWNrMS5yZXNldCgpOyBzdGFjazIucmVzZXQoKTsKKworICAvL3NwbGljZV9hZnRlcihpdGVyYXRvciwgc2xpc3QsIGl0ZXJhdG9yLCBpdGVyYXRvcikKKyAgeworICAgIFNsaXN0SW50IHNsaW50MSgxMCwgMCwgc3RhY2sxKTsKKyAgICBTbGlzdEludCBzbGludDIoMTAsIDEsIHN0YWNrMik7CisKKyAgICBTbGlzdEludDo6aXRlcmF0b3IgbGl0KHNsaW50Mi5iZWdpbigpKTsKKyAgICBhZHZhbmNlKGxpdCwgNCk7CisgICAgc2xpbnQxLnNwbGljZV9hZnRlcihzbGludDEuYmVmb3JlX2JlZ2luKCksIHNsaW50Miwgc2xpbnQyLmJlZm9yZV9iZWdpbigpLCBsaXQpOworICAgIENQUFVOSVRfQVNTRVJUKCBzbGludDEuc2l6ZSgpID09IDE1ICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHNsaW50Mi5zaXplKCkgPT0gNSApOworICB9CisgIENQUFVOSVRfQ0hFQ0soIHN0YWNrMS5vaygpICk7CisgIENQUFVOSVRfQ0hFQ0soIHN0YWNrMi5vaygpICk7CisgIHN0YWNrMS5yZXNldCgpOyBzdGFjazIucmVzZXQoKTsKKworICAvL21lcmdlKHNsaXN0KQorICB7CisgICAgU2xpc3RJbnQgc2xpbnQxKDEwLCAwLCBzdGFjazEpOworICAgIFNsaXN0SW50IHNsaW50MigxMCwgMSwgc3RhY2syKTsKKworICAgIFNsaXN0SW50IHNsaW50cmVmKHN0YWNrMik7CisgICAgc2xpbnRyZWYuaW5zZXJ0X2FmdGVyKHNsaW50cmVmLmJlZm9yZV9iZWdpbigpLCAxMCwgMSk7CisgICAgc2xpbnRyZWYuaW5zZXJ0X2FmdGVyKHNsaW50cmVmLmJlZm9yZV9iZWdpbigpLCAxMCwgMCk7CisKKyAgICBzbGludDEubWVyZ2Uoc2xpbnQyKTsKKyAgICBDUFBVTklUX0FTU0VSVCggc2xpbnQxLnNpemUoKSA9PSAyMCApOworICAgIENQUFVOSVRfQVNTRVJUKCBzbGludDEgPT0gc2xpbnRyZWYgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggc2xpbnQyLmVtcHR5KCkgKTsKKyAgfQorICBDUFBVTklUX0NIRUNLKCBzdGFjazEub2soKSApOworICBDUFBVTklUX0NIRUNLKCBzdGFjazIub2soKSApOworCisgIC8vbWVyZ2Uoc2xpc3QsIHByZWRpY2F0ZSkKKyMgIGlmICghZGVmaW5lZCAoU1RMUE9SVCkgfHwgIWRlZmluZWQgKF9TVExQX05PX01FTUJFUl9URU1QTEFURVMpKSAmJiBcCisgICAgICAoIWRlZmluZWQgKF9NU0NfVkVSKSB8fCAoX01TQ19WRVIgPj0gMTMwMCkpCisgIHsKKyAgICBTbGlzdEludCBzbGludDEoMTAsIDAsIHN0YWNrMSk7CisgICAgU2xpc3RJbnQgc2xpbnQyKDEwLCAxLCBzdGFjazIpOworCisgICAgU2xpc3RJbnQgc2xpbnRyZWYoc3RhY2syKTsKKyAgICBzbGludHJlZi5pbnNlcnRfYWZ0ZXIoc2xpbnRyZWYuYmVmb3JlX2JlZ2luKCksIDEwLCAwKTsKKyAgICBzbGludHJlZi5pbnNlcnRfYWZ0ZXIoc2xpbnRyZWYuYmVmb3JlX2JlZ2luKCksIDEwLCAxKTsKKworICAgIHNsaW50MS5tZXJnZShzbGludDIsIGdyZWF0ZXI8aW50PigpKTsKKyAgICBDUFBVTklUX0FTU0VSVCggc2xpbnQxLnNpemUoKSA9PSAyMCApOworICAgIENQUFVOSVRfQVNTRVJUKCBzbGludDEgPT0gc2xpbnRyZWYgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggc2xpbnQyLmVtcHR5KCkgKTsKKyAgfQorICBDUFBVTklUX0NIRUNLKCBzdGFjazEub2soKSApOworICBDUFBVTklUX0NIRUNLKCBzdGFjazIub2soKSApOworCisgIC8vc29ydAorICB7CisgICAgLy9UaGlzIGlzIHJhdGhlciBhIGNvbXBpbGUgdGltZSB0ZXN0LgorICAgIC8vV2UgY2hlY2sgdGhhdCBzb3J0IGltcGxlbWVudGF0aW9uIGlzIGNvcnJlY3Qgd2hlbiBsaXN0IGlzIGluc3RhbmNpYXRlZAorICAgIC8vd2l0aCBhbiBhbGxvY2F0b3IgdGhhdCBkbyBub3QgaGF2ZSBhIGRlZmF1bHQgY29uc3RydWN0b3IuCisgICAgU2xpc3RJbnQgc2xpbnQxKHN0YWNrMSk7CisgICAgc2xpbnQxLnB1c2hfZnJvbnQoMSk7CisgICAgc2xpbnQxLmluc2VydF9hZnRlcihzbGludDEuYmVmb3JlX2JlZ2luKCksIDEwLCAwKTsKKyAgICBncmVhdGVyPGludD4gZ3Q7CisgICAgc2xpbnQxLnNvcnQoZ3QpOworICAgIENQUFVOSVRfQVNTRVJUKCBzbGludDEuZnJvbnQoKSA9PSAxICk7CisgICAgc2xpbnQxLnNvcnQoKTsKKyAgICBTbGlzdEludDo6aXRlcmF0b3Igc2xpdChzbGludDEuYmVnaW4oKSk7CisgICAgYWR2YW5jZShzbGl0LCAxMCk7CisgICAgQ1BQVU5JVF9BU1NFUlQoICpzbGl0ID09IDEgKTsKKyAgfQorIyAgZW5kaWYKKyNlbmRpZgorfQorCisjaWYgZGVmaW5lZCAoU1RMUE9SVCkgJiYgIWRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpICYmIFwKKyAgICAoIWRlZmluZWQgKF9TVExQX1VTRV9QVFJfU1BFQ0lBTElaQVRJT05TKSB8fCBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKSkKKyMgIGlmICFkZWZpbmVkIChfX0RNQ19fKQorLyogU2ltcGxlIGNvbXBpbGF0aW9uIHRlc3Q6IENoZWNrIHRoYXQgbmVzdGVkIHR5cGVzIGxpa2UgaXRlcmF0b3IKKyAqIGNhbiBiZSBhY2Nlc3MgZXZlbiBpZiB0eXBlIHVzZWQgdG8gaW5zdGFuY2lhdGUgY29udGFpbmVyIGlzIG5vdAorICogeWV0IGNvbXBsZXRlbHkgZGVmaW5lZC4KKyAqLworY2xhc3MgSW5jb21wbGV0ZUNsYXNzCit7CisgIHNsaXN0PEluY29tcGxldGVDbGFzcz4gaW5zdGFuY2VzOworICB0eXBlZGVmIHNsaXN0PEluY29tcGxldGVDbGFzcz46Oml0ZXJhdG9yIGl0OworfTsKKyMgIGVuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9zb3J0X3Rlc3QuY3BwIGIvdGVzdC91bml0L3NvcnRfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDliYzk0NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9zb3J0X3Rlc3QuY3BwCkBAIC0wLDAgKzEsMjE3IEBACisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCisjaWYgZGVmaW5lZCAoU1RMUE9SVCkgJiYgZGVmaW5lZCAoX1NUTFBfREVCVUcpICYmIGRlZmluZWQgKF9TVExQX0RFQlVHX01PREVfVEhST1dTKQorIyAgZGVmaW5lIF9TVExQX0RPX0NIRUNLX0JBRF9QUkVESUNBVEUKKyMgIGluY2x1ZGUgPHN0ZGV4Y2VwdD4KKyNlbmRpZgorCisjaW5jbHVkZSAiY3BwdW5pdC9jcHB1bml0X3Byb3h5LmgiCisKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZChfU1RMUF9VU0VfTkFNRVNQQUNFUykKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisjZW5kaWYKKworLy8KKy8vIFRlc3RDYXNlIGNsYXNzCisvLworY2xhc3MgU29ydFRlc3QgOiBwdWJsaWMgQ1BQVU5JVF9OUzo6VGVzdENhc2UKK3sKKyAgQ1BQVU5JVF9URVNUX1NVSVRFKFNvcnRUZXN0KTsKKyAgQ1BQVU5JVF9URVNUKHNvcnQxKTsKKyAgQ1BQVU5JVF9URVNUKHNvcnQyKTsKKyAgQ1BQVU5JVF9URVNUKHNvcnQzKTsKKyAgQ1BQVU5JVF9URVNUKHNvcnQ0KTsKKyAgQ1BQVU5JVF9URVNUKHN0YmxzcnQxKTsKKyAgQ1BQVU5JVF9URVNUKHN0YmxzcnQyKTsKKyNpZiBkZWZpbmVkIChfU1RMUF9ET19DSEVDS19CQURfUFJFRElDQVRFKQorICBDUFBVTklUX1RFU1QoYmFkX3ByZWRpY2F0ZV9kZXRlY3RlZCk7CisjZW5kaWYKKyAgQ1BQVU5JVF9URVNUX1NVSVRFX0VORCgpOworCitwcm90ZWN0ZWQ6CisgIHZvaWQgc29ydDEoKTsKKyAgdm9pZCBzb3J0MigpOworICB2b2lkIHNvcnQzKCk7CisgIHZvaWQgc29ydDQoKTsKKyAgdm9pZCBzdGJsc3J0MSgpOworICB2b2lkIHN0YmxzcnQyKCk7CisgIHZvaWQgYmFkX3ByZWRpY2F0ZV9kZXRlY3RlZCgpOworCisgIHN0YXRpYyBib29sIHN0cmluZ19sZXNzKGNvbnN0IGNoYXIqIGFfLCBjb25zdCBjaGFyKiBiXykKKyAgeworICAgIHJldHVybiBzdHJjbXAoYV8sIGJfKSA8IDAgPyAxIDogMDsKKyAgfQorfTsKKworQ1BQVU5JVF9URVNUX1NVSVRFX1JFR0lTVFJBVElPTihTb3J0VGVzdCk7CisKKy8vCisvLyB0ZXN0cyBpbXBsZW1lbnRhdGlvbgorLy8KK3ZvaWQgU29ydFRlc3Q6OnN0YmxzcnQxKCkKK3sKKyAgLy9DaGVjayB0aGF0IHN0YWJsZV9zb3J0IGRvIHNvcnQKKyAgaW50IG51bWJlcnNbNl0gPSB7IDEsIDUwLCAtMTAsIDExLCA0MiwgMTkgfTsKKyAgc3RhYmxlX3NvcnQobnVtYmVycywgbnVtYmVycyArIDYpOworICAvLy0xMCAxIDExIDE5IDQyIDUwCisgIENQUFVOSVRfQVNTRVJUKG51bWJlcnNbMF09PS0xMCk7CisgIENQUFVOSVRfQVNTRVJUKG51bWJlcnNbMV09PTEpOworICBDUFBVTklUX0FTU0VSVChudW1iZXJzWzJdPT0xMSk7CisgIENQUFVOSVRfQVNTRVJUKG51bWJlcnNbM109PTE5KTsKKyAgQ1BQVU5JVF9BU1NFUlQobnVtYmVyc1s0XT09NDIpOworICBDUFBVTklUX0FTU0VSVChudW1iZXJzWzVdPT01MCk7CisKKyAgY2hhciBjb25zdCogbGV0dGVyc1s2XSA9IHsiYmIiLCAiYWEiLCAibGwiLCAiZGQiLCAicXEiLCAiY2MiIH07CisgIHN0YWJsZV9zb3J0KGxldHRlcnMsIGxldHRlcnMgKyA2LCBzdHJpbmdfbGVzcyk7CisgIC8vIGFhIGJiIGNjIGRkIGxsIHFxCisgIENQUFVOSVRfQVNTRVJUKCBzdHJjbXAobGV0dGVyc1swXSwgImFhIikgPT0gMCApOworICBDUFBVTklUX0FTU0VSVCggc3RyY21wKGxldHRlcnNbMV0sICJiYiIpID09IDAgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHN0cmNtcChsZXR0ZXJzWzJdLCAiY2MiKSA9PSAwICk7CisgIENQUFVOSVRfQVNTRVJUKCBzdHJjbXAobGV0dGVyc1szXSwgImRkIikgPT0gMCApOworICBDUFBVTklUX0FTU0VSVCggc3RyY21wKGxldHRlcnNbNF0sICJsbCIpID09IDAgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHN0cmNtcChsZXR0ZXJzWzVdLCAicXEiKSA9PSAwICk7Cit9CisKK3N0cnVjdCBEYXRhIHsKKyAgRGF0YShpbnQgaW5kZXgsIGludCB2YWx1ZSkKKyAgICA6IG1faW5kZXgoaW5kZXgpLCBtX3ZhbHVlKHZhbHVlKSB7fQorCisgIGJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IERhdGEmIG90aGVyKSBjb25zdAorICB7IHJldHVybiBtX2luZGV4ID09IG90aGVyLm1faW5kZXggJiYgbV92YWx1ZSA9PSBvdGhlci5tX3ZhbHVlOyB9CisgIGJvb2wgb3BlcmF0b3IgPCAoY29uc3QgRGF0YSYgb3RoZXIpIGNvbnN0CisgIHsgcmV0dXJuIG1fdmFsdWUgPCBvdGhlci5tX3ZhbHVlOyB9CisKK3ByaXZhdGU6CisgIGludCBtX2luZGV4LCBtX3ZhbHVlOworfTsKKwordm9pZCBTb3J0VGVzdDo6c3RibHNydDIoKQoreworICAvL0NoZWNrIHRoYXQgc3RhYmxlX3NvcnQgaXMgc3RhYmxlOgorICBEYXRhIGRhdGFzW10gPSB7CisgICAgRGF0YSgwLCAxMCksCisgICAgRGF0YSgxLCA4KSwKKyAgICBEYXRhKDIsIDYpLAorICAgIERhdGEoMywgNiksCisgICAgRGF0YSg0LCA2KSwKKyAgICBEYXRhKDUsIDQpLAorICAgIERhdGEoNiwgOSkKKyAgfTsKKyAgc3RhYmxlX3NvcnQoZGF0YXMsIGRhdGFzICsgNyk7CisKKyAgQ1BQVU5JVF9BU1NFUlQoIGRhdGFzWzBdID09IERhdGEoNSwgNCkgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIGRhdGFzWzFdID09IERhdGEoMiwgNikgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIGRhdGFzWzJdID09IERhdGEoMywgNikgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIGRhdGFzWzNdID09IERhdGEoNCwgNikgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIGRhdGFzWzRdID09IERhdGEoMSwgOCkgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIGRhdGFzWzVdID09IERhdGEoNiwgOSkgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIGRhdGFzWzZdID09IERhdGEoMCwgMTApICk7Cit9CisKK3ZvaWQgU29ydFRlc3Q6OnNvcnQxKCkKK3sKKyAgaW50IG51bWJlcnNbNl0gPSB7IDEsIDUwLCAtMTAsIDExLCA0MiwgMTkgfTsKKworICBzb3J0KG51bWJlcnMsIG51bWJlcnMgKyA2KTsKKyAgLy8gLTEwIDEgMTEgMTkgNDIgNTAKKyAgQ1BQVU5JVF9BU1NFUlQobnVtYmVyc1swXT09LTEwKTsKKyAgQ1BQVU5JVF9BU1NFUlQobnVtYmVyc1sxXT09MSk7CisgIENQUFVOSVRfQVNTRVJUKG51bWJlcnNbMl09PTExKTsKKyAgQ1BQVU5JVF9BU1NFUlQobnVtYmVyc1szXT09MTkpOworICBDUFBVTklUX0FTU0VSVChudW1iZXJzWzRdPT00Mik7CisgIENQUFVOSVRfQVNTRVJUKG51bWJlcnNbNV09PTUwKTsKK30KKwordm9pZCBTb3J0VGVzdDo6c29ydDIoKQoreworICBpbnQgbnVtYmVyc1tdID0geyAxLCA1MCwgLTEwLCAxMSwgNDIsIDE5IH07CisKKyAgaW50IGNvdW50ID0gc2l6ZW9mKG51bWJlcnMpIC8gc2l6ZW9mKG51bWJlcnNbMF0pOworICBzb3J0KG51bWJlcnMsIG51bWJlcnMgKyBjb3VudCwgZ3JlYXRlcjxpbnQ+KCkpOworCisgIC8vICA1MCA0MiAxOSAxMSAxIC0xMAorICBDUFBVTklUX0FTU0VSVChudW1iZXJzWzVdPT0tMTApOworICBDUFBVTklUX0FTU0VSVChudW1iZXJzWzRdPT0xKTsKKyAgQ1BQVU5JVF9BU1NFUlQobnVtYmVyc1szXT09MTEpOworICBDUFBVTklUX0FTU0VSVChudW1iZXJzWzJdPT0xOSk7CisgIENQUFVOSVRfQVNTRVJUKG51bWJlcnNbMV09PTQyKTsKKyAgQ1BQVU5JVF9BU1NFUlQobnVtYmVyc1swXT09NTApOworfQorCit2b2lkIFNvcnRUZXN0Ojpzb3J0MygpCit7CisgIHZlY3Rvcjxib29sPiBib29sVmVjdG9yOworCisgIGJvb2xWZWN0b3IucHVzaF9iYWNrKCB0cnVlICk7CisgIGJvb2xWZWN0b3IucHVzaF9iYWNrKCBmYWxzZSApOworCisgIHNvcnQoIGJvb2xWZWN0b3IuYmVnaW4oKSwgYm9vbFZlY3Rvci5lbmQoKSApOworCisgIENQUFVOSVRfQVNTRVJUKGJvb2xWZWN0b3JbMF09PWZhbHNlKTsKKyAgQ1BQVU5JVF9BU1NFUlQoYm9vbFZlY3RvclsxXT09dHJ1ZSk7Cit9CisKKy8qCisgKiBBIHNtYWxsIHV0aWxpdHkgY2xhc3MgdG8gY2hlY2sgYSBwb3RlbnRpYWwgY29tcGlsZXIgYnVnCisgKiB0aGF0IGNhbiByZXN1bHQgaW4gYSBiYWQgc29ydCBhbGdvcml0aG0gYmVoYXZpb3IuIFRoZSB0eXBlCisgKiBfVHAgb2YgdGhlIFNvcnRUZXN0RnVuYyBoYXMgdG8gYmUgU29ydFRlc3RBdXggd2l0aG91dCBhbnkKKyAqIHJlZmVyZW5jZSBxdWFsaWZpZXIuCisgKi8KK3N0cnVjdCBTb3J0VGVzdEF1eCB7CisgIFNvcnRUZXN0QXV4IChib29sICZiKSA6IF9iKGIpCisgIHt9CisKKyAgU29ydFRlc3RBdXggKFNvcnRUZXN0QXV4IGNvbnN0Jm90aGVyKSA6IF9iKG90aGVyLl9iKSB7CisgICAgX2IgPSB0cnVlOworICB9CisKKyAgYm9vbCAmX2I7CisKK3ByaXZhdGU6CisgIC8vZXhwbGljaXRlbHkgZGVmaW5lZCBhcyBwcml2YXRlIHRvIGF2b2lkIHdhcm5pbmdzOgorICBTb3J0VGVzdEF1eCYgb3BlcmF0b3IgPSAoU29ydFRlc3RBdXggY29uc3QmKTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+Cit2b2lkIFNvcnRUZXN0RnVuYyAoX1RwKSB7Cit9CisKK3ZvaWQgU29ydFRlc3Q6OnNvcnQ0KCkKK3sKKyAgYm9vbCBjb3B5X2NvbnN0cnVjdG9yX2NhbGxlZCA9IGZhbHNlOworICBTb3J0VGVzdEF1eCBpbnN0YW5jZShjb3B5X2NvbnN0cnVjdG9yX2NhbGxlZCk7CisgIFNvcnRUZXN0QXV4ICZyX2luc3RhbmNlID0gaW5zdGFuY2U7CisgIFNvcnRUZXN0QXV4IGNvbnN0JiByY19pbnN0YW5jZSA9IGluc3RhbmNlOworCisgIFNvcnRUZXN0RnVuYyhyX2luc3RhbmNlKTsKKyAgQ1BQVU5JVF9BU1NFUlQoY29weV9jb25zdHJ1Y3Rvcl9jYWxsZWQpOworICBjb3B5X2NvbnN0cnVjdG9yX2NhbGxlZCA9IGZhbHNlOworICBTb3J0VGVzdEZ1bmMocmNfaW5zdGFuY2UpOworICBDUFBVTklUX0FTU0VSVChjb3B5X2NvbnN0cnVjdG9yX2NhbGxlZCk7Cit9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9ET19DSEVDS19CQURfUFJFRElDQVRFKQordm9pZCBTb3J0VGVzdDo6YmFkX3ByZWRpY2F0ZV9kZXRlY3RlZCgpCit7CisgIGludCBudW1iZXJzW10gPSB7IDAsIDAsIDEsIDAsIDAsIDEsIDAsIDAgfTsKKyAgdHJ5IHsKKyAgICBzb3J0KG51bWJlcnMsIG51bWJlcnMgKyBzaXplb2YobnVtYmVycykgLyBzaXplb2YobnVtYmVyc1swXSksIGxlc3NfZXF1YWw8aW50PigpKTsKKworICAgIC8vSGVyZSBpcyBtZWFucyB0aGF0IG5vIGV4Y2VwdGlvbiBoYXMgYmVlbiByYWlzZWQKKyAgICBDUFBVTklUX0FTU0VSVCggZmFsc2UgKTsKKyAgfQorICBjYXRjaCAocnVudGltZV9lcnJvciBjb25zdCYpCisgIHsgLypPSyBiYWQgcHJlZGljYXRlIGhhcyBiZWVuIGRldGVjdGVkLiovIH0KKworICB0cnkgeworICAgIHN0YWJsZV9zb3J0KG51bWJlcnMsIG51bWJlcnMgKyBzaXplb2YobnVtYmVycykgLyBzaXplb2YobnVtYmVyc1swXSksIGxlc3NfZXF1YWw8aW50PigpKTsKKworICAgIC8vSGVyZSBpcyBtZWFucyB0aGF0IG5vIGV4Y2VwdGlvbiBoYXMgYmVlbiByYWlzZWQKKyAgICBDUFBVTklUX0FTU0VSVCggZmFsc2UgKTsKKyAgfQorICBjYXRjaCAocnVudGltZV9lcnJvciBjb25zdCYpCisgIHsgLypPSyBiYWQgcHJlZGljYXRlIGhhcyBiZWVuIGRldGVjdGVkLiovIH0KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L3NzdHJlYW1faGVhZGVyX3Rlc3QuY3BwIGIvdGVzdC91bml0L3NzdHJlYW1faGVhZGVyX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NGY3OWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvc3N0cmVhbV9oZWFkZXJfdGVzdC5jcHAKQEAgLTAsMCArMSwxMCBAQAorLyogVGhpcyB0ZXN0IHB1cnBvc2UgaXMgc2ltcGx5IHRvIGNoZWNrIFN0YW5kYXJkIGhlYWRlciBpbmRlcGVuZGFuY3kgdGhhdAorICogaXMgdG8gc2F5IHRoYXQgdGhlIGhlYWRlciBjYW4gYmUgaW5jbHVkZWQgYWxvbmUgd2l0aG91dCBhbnkgcHJldmlvdXMKKyAqIGluY2x1ZGUuCisgKiBBZGRpdGlvbm5hbHksIGZvciBDIFN0YW5kYXJkIGhlYWRlcnMgdGhhdCBTVExwb3J0IGV4cG9zZSwgaXQgY2FuIGFsc28gYmUKKyAqIHVzZWQgdG8gY2hlY2sgdGhhdCBmaWxlcyBpbmNsdWRlZCBieSB0aG9zZSBoZWFkZXJzIGFyZSBjb21wYXRpYmxlIHdpdGgKKyAqIHB1cmUgQyBjb21waWxlcnMuCisgKi8KKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fSU9TVFJFQU1TKQorIyAgaW5jbHVkZSA8c3N0cmVhbT4KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L3NzdHJlYW1fdGVzdC5jcHAgYi90ZXN0L3VuaXQvc3N0cmVhbV90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjIwNjZkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L3NzdHJlYW1fdGVzdC5jcHAKQEAgLTAsMCArMSw0ODcgQEAKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSAibWF0aF9hdXguaCIKKworI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCAhZGVmaW5lZCAoX1NUTFBfVVNFX05PX0lPU1RSRUFNUykKKyMgIGluY2x1ZGUgPHNzdHJlYW0+CisjICBpbmNsdWRlIDxtZW1vcnk+CisKKyMgIGluY2x1ZGUgImZ1bGxfc3RyZWFtYnVmLmgiCisKKyMgIGluY2x1ZGUgImNwcHVuaXQvY3BwdW5pdF9wcm94eS5oIgorCisjICBpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZChfU1RMUF9VU0VfTkFNRVNQQUNFUykKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisjICBlbmRpZgorCisvLworLy8gVGVzdENhc2UgY2xhc3MKKy8vCitjbGFzcyBTc3RyZWFtVGVzdCA6IHB1YmxpYyBDUFBVTklUX05TOjpUZXN0Q2FzZQoreworICBDUFBVTklUX1RFU1RfU1VJVEUoU3N0cmVhbVRlc3QpOworICBDUFBVTklUX1RFU1Qob3V0cHV0KTsKKyAgQ1BQVU5JVF9URVNUKGlucHV0KTsKKyAgQ1BQVU5JVF9URVNUKGlucHV0X2NoYXIpOworICBDUFBVTklUX1RFU1QoaW8pOworICBDUFBVTklUX1RFU1QoZXJyKTsKKyAgQ1BQVU5JVF9URVNUKGVycl9sb25nKTsKKyAgQ1BQVU5JVF9URVNUKG1heGludCk7CisgIENQUFVOSVRfVEVTVChpbml0X2luKTsKKyAgQ1BQVU5JVF9URVNUKGluaXRfb3V0KTsKKyAgQ1BQVU5JVF9URVNUKGJ1Zik7CisgIENQUFVOSVRfVEVTVChyZGJ1Zik7CisgIENQUFVOSVRfVEVTVChzdHJlYW1idWZfb3V0cHV0KTsKKyAgQ1BQVU5JVF9URVNUKHNlZWspOworICBDUFBVTklUX1RFU1Qoc2Vla3ApOworICBDUFBVTklUX1RFU1Qoc2Vla19ncCk7CisgIENQUFVOSVRfVEVTVCh0ZWxscCk7CisgIENQUFVOSVRfVEVTVChuZWdhdGl2ZSk7CisgIENQUFVOSVRfVEVTVF9TVUlURV9FTkQoKTsKKworICBwcm90ZWN0ZWQ6CisgICAgdm9pZCBvdXRwdXQoKTsKKyAgICB2b2lkIGlucHV0KCk7CisgICAgdm9pZCBpbnB1dF9jaGFyKCk7CisgICAgdm9pZCBpbygpOworICAgIHZvaWQgZXJyKCk7CisgICAgdm9pZCBlcnJfbG9uZygpOworICAgIHZvaWQgbWF4aW50KCk7CisgICAgdm9pZCBpbml0X2luKCk7CisgICAgdm9pZCBpbml0X291dCgpOworICAgIHZvaWQgYnVmKCk7CisgICAgdm9pZCByZGJ1ZigpOworICAgIHZvaWQgc3RyZWFtYnVmX291dHB1dCgpOworICAgIHZvaWQgc2VlaygpOworICAgIHZvaWQgc2Vla3AoKTsKKyAgICB2b2lkIHNlZWtfZ3AoKTsKKyAgICB2b2lkIHRlbGxwKCk7CisgICAgdm9pZCBuZWdhdGl2ZSgpOworfTsKKworQ1BQVU5JVF9URVNUX1NVSVRFX1JFR0lTVFJBVElPTihTc3RyZWFtVGVzdCk7CisKKy8vCisvLyB0ZXN0cyBpbXBsZW1lbnRhdGlvbgorLy8KK3ZvaWQgU3N0cmVhbVRlc3Q6Om91dHB1dCgpCit7CisgIHsKKyAgICBvc3RyaW5nc3RyZWFtIHM7CisKKyAgICBzIDw8IDEgPDwgJ1xuJyA8PCAyLjAgPDwgJ1xuJyA8PCAiYWJjZFxuIiA8PCAiZ2hrIGxtXG4iIDw8ICJhYmNkIGVmIjsKKyAgICBDUFBVTklUX0FTU0VSVCggcy5nb29kKCkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggcy5zdHIoKSA9PSAiMVxuMlxuYWJjZFxuZ2hrIGxtXG5hYmNkIGVmIiApOworICB9CisKKyAgLy9Gb2xsb3dpbmcgdGVzdHMgYXJlIG1vc3RseSB1c2VkIHRvIHJldmVhbCBwcm9ibGVtIHdpdGggdGhlIE1TVkMgL1dwNjQgb3B0aW9uCisgIC8vdXNlZCB0byB0cmFjayA2NCBiaXRzIHBvcnRhYmlsaXR5IGlzc3VlOgorICB7CisgICAgb3N0cmluZ3N0cmVhbSBzOworICAgIHNpemVfdCBpID0gMDsKKyAgICBzIDw8IGk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHMuZ29vZCgpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHMuc3RyKCkgPT0gIjAiICk7CisgIH0KKyAgeworICAgIG9zdHJpbmdzdHJlYW0gczsKKyAgICBwdHJkaWZmX3QgaSA9IDA7CisgICAgcyA8PCBpOworICAgIENQUFVOSVRfQVNTRVJUKCBzLmdvb2QoKSApOworICAgIENQUFVOSVRfQVNTRVJUKCBzLnN0cigpID09ICIwIiApOworICB9Cit9CisKK3ZvaWQgU3N0cmVhbVRlc3Q6OmlucHV0KCkKK3sKKyAgeworICAgIGlzdHJpbmdzdHJlYW0gcyggIjFcbjJcbmFiY2RcbmdoayBsbVxuYWJjZCBlZiIgKTsKKyAgICBpbnQgaSA9IDA7CisgICAgcyA+PiBpOworICAgIENQUFVOSVRfQVNTRVJUKCBzLmdvb2QoKSApOworICAgIENQUFVOSVRfQVNTRVJUKCBpID09IDEgKTsKKyAgICBkb3VibGUgZCA9IDAuMDsKKyAgICBzID4+IGQ7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHMuZ29vZCgpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGQgPT0gMi4wICk7CisgICAgc3RyaW5nIHN0cjsKKyAgICBzID4+IHN0cjsKKyAgICBDUFBVTklUX0FTU0VSVCggcy5nb29kKCkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggc3RyID09ICJhYmNkIiApOworICAgIGNoYXIgYzsKKyAgICBzLmdldChjKTsgLy8gZXh0cmFjdCBuZXdsaW5lLCB0aGF0IG5vdCBleHRyYWN0ZWQgYnkgb3BlcmF0b3IgPj4KKyAgICBDUFBVTklUX0FTU0VSVCggcy5nb29kKCkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggYyA9PSAnXG4nICk7CisgICAgZ2V0bGluZSggcywgc3RyICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHMuZ29vZCgpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHN0ciA9PSAiZ2hrIGxtIiApOworICAgIGdldGxpbmUoIHMsIHN0ciApOworICAgIENQUFVOSVRfQVNTRVJUKCBzLmVvZigpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHN0ciA9PSAiYWJjZCBlZiIgKTsKKyAgfQorICB7CisgICAgaXN0cmluZ3N0cmVhbSBzKCIwIik7CisgICAgc2l6ZV90IGkgPSAxOworICAgIHMgPj4gaTsKKyAgICBDUFBVTklUX0FTU0VSVCggIXMuZmFpbCgpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHMuZW9mKCkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggaSA9PSAwICk7CisgIH0KK30KKwordm9pZCBTc3RyZWFtVGVzdDo6aW5wdXRfY2hhcigpCit7CisgIGNoYXIgYnVmWzE2XSA9IHsgMCwgJzEnLCAnMicsICczJyB9OworICBpc3RyaW5nc3RyZWFtIHMoICIwIiApOworICBzID4+IGJ1ZjsKKworICBDUFBVTklUX0FTU0VSVCggYnVmWzBdID09ICcwJyApOworICBDUFBVTklUX0FTU0VSVCggYnVmWzFdID09IDAgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIGJ1ZlsyXSA9PSAnMicgKTsKK30KKworCit2b2lkIFNzdHJlYW1UZXN0OjppbygpCit7CisgIHN0cmluZ3N0cmVhbSBzOworICBzIDw8IDEgPDwgJ1xuJyA8PCAyLjAgPDwgJ1xuJyA8PCAiYWJjZFxuIiA8PCAiZ2hrIGxtXG4iIDw8ICJhYmNkIGVmIjsKKyAgQ1BQVU5JVF9BU1NFUlQoIHMuZ29vZCgpICk7CisKKyAgaW50IGkgPSAwOworICBzID4+IGk7CisgIENQUFVOSVRfQVNTRVJUKCBpID09IDEgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHMuZ29vZCgpICk7CisgIGRvdWJsZSBkID0gMC4wOworICBzID4+IGQ7CisgIENQUFVOSVRfQVNTRVJUKCBkID09IDIuMCApOworICBDUFBVTklUX0FTU0VSVCggcy5nb29kKCkgKTsKKyAgc3RyaW5nIHN0cjsKKyAgcyA+PiBzdHI7CisgIENQUFVOSVRfQVNTRVJUKCBzdHIgPT0gImFiY2QiICk7CisgIENQUFVOSVRfQVNTRVJUKCBzLmdvb2QoKSApOworICBjaGFyIGM7CisgIHMuZ2V0KGMpOyAvLyBleHRyYWN0IG5ld2xpbmUsIHRoYXQgbm90IGV4dHJhY3RlZCBieSBvcGVyYXRvciA+PgorICBDUFBVTklUX0FTU0VSVCggcy5nb29kKCkgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIGMgPT0gJ1xuJyApOworICBnZXRsaW5lKCBzLCBzdHIgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHMuZ29vZCgpICk7CisgIENQUFVOSVRfQVNTRVJUKCBzdHIgPT0gImdoayBsbSIgKTsKKyAgZ2V0bGluZSggcywgc3RyICk7CisgIENQUFVOSVRfQVNTRVJUKCBzdHIgPT0gImFiY2QgZWYiICk7CisgIENQUFVOSVRfQVNTRVJUKCBzLmVvZigpICk7Cit9CisKK3ZvaWQgU3N0cmVhbVRlc3Q6OmVycigpCit7CisgIHN0cmluZ3N0cmVhbSBzKCAiOSIgKTsKKworICBpbnQgaSA9IDA7CisgIHMgPj4gaTsKKyAgQ1BQVU5JVF9BU1NFUlQoICFzLmZhaWwoKSApOworICBDUFBVTklUX0FTU0VSVCggaSA9PSA5ICk7CisgIHMgPj4gaTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHMuZmFpbCgpICk7CisgIENQUFVOSVRfQVNTRVJUKCBzLmVvZigpICk7CisgIENQUFVOSVRfQVNTRVJUKCBpID09IDkgKTsKK30KKwordm9pZCBTc3RyZWFtVGVzdDo6ZXJyX2xvbmcoKQoreworICBzdHJpbmdzdHJlYW0gcyggIjkiICk7CisKKyAgbG9uZyBpID0gMDsKKyAgcyA+PiBpOworICBDUFBVTklUX0FTU0VSVCggIXMuZmFpbCgpICk7CisgIENQUFVOSVRfQVNTRVJUKCBpID09IDkgKTsKKyAgcyA+PiBpOworICBDUFBVTklUX0FTU0VSVCggcy5mYWlsKCkgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHMuZW9mKCkgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIGkgPT0gOSApOworfQorCit2b2lkIFNzdHJlYW1UZXN0OjptYXhpbnQoKQoreworICBzdHJpbmdzdHJlYW0gczsKKworICBzIDw8IElOVF9NQVggPDwgIiAiIDw8IFVJTlRfTUFYIDw8ICIgIiA8PCBMT05HX01BWCA8PCAiICIgPDwgVUxPTkdfTUFYIDw8ICIgIgorICAgIDw8IElOVF9NSU4gPDwgIiAiIDw8IExPTkdfTUlOOworICBDUFBVTklUX0FTU0VSVCggcy5nb29kKCkgKTsKKworICBpbnQgaSA9IDA7CisgIHVuc2lnbmVkIGludCB1ID0gMDsKKyAgbG9uZyBsID0gMDsKKyAgdW5zaWduZWQgbG9uZyB1bCA9IDA7CisKKyAgcyA+PiBpID4+IHUgPj4gbCA+PiB1bDsKKyAgQ1BQVU5JVF9BU1NFUlQoIHMuZ29vZCgpICk7CisgIENQUFVOSVRfQVNTRVJUKCBpID09IElOVF9NQVggKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHUgPT0gVUlOVF9NQVggKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIGwgPT0gTE9OR19NQVggKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHVsID09IFVMT05HX01BWCApOworCisgIHMgPj4gaSA+PiBsOworICBDUFBVTklUX0FTU0VSVCggIXMuZmFpbCgpICk7CisgIENQUFVOSVRfQVNTRVJUKCBpID09IElOVF9NSU4gKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIGwgPT0gTE9OR19NSU4gKTsKK30KKwordm9pZCBTc3RyZWFtVGVzdDo6aW5pdF9pbigpCit7CisgIGlzdHJpbmdzdHJlYW0gaXMoICIxMjM0NSIgKTsKKyAgaW50IG47CisKKyAgaXMgPj4gbjsKKyAgQ1BQVU5JVF9BU1NFUlQoICFpcy5mYWlsKCkgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIG4gPT0gMTIzNDUgKTsKKworICBpc3RyaW5nc3RyZWFtIGRpcyggIjEuMjM0NSIgKTsKKyAgZG91YmxlIGQ7CisKKyAgZGlzID4+IGQ7CisgIENQUFVOSVRfQVNTRVJUKCAhZGlzLmZhaWwoKSApOworICBDUFBVTklUX0FTU0VSVCggYXJlX2VxdWFscyhkLCAxLjIzNDUpICk7CisKKyAgaXN0cmluZ3N0cmVhbSBmaXMoICIxLjIzNDUiICk7CisgIGZsb2F0IGY7CisKKyAgZmlzID4+IGY7CisgIENQUFVOSVRfQVNTRVJUKCAhZmlzLmZhaWwoKSApOworICBDUFBVTklUX0FTU0VSVCggYXJlX2VxdWFscyhmLCAxLjIzNDVmKSApOworfQorCit2b2lkIFNzdHJlYW1UZXN0Ojppbml0X291dCgpCit7CisgIG9zdHJpbmdzdHJlYW0gb3MoICIxMjM0NSIgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIG9zLnN0cigpID09ICIxMjM0NSIgKTsKKworICBvcyA8PCA2NzsKKyAgQ1BQVU5JVF9BU1NFUlQoIG9zLmdvb2QoKSApOworCisgIC8vIFRoaXMgc2F0aXNmeSB0byB0aGUgU3RhbmRhcmQ6CisgIC8vIENQUFVOSVRfQVNTRVJUKCBvcy5zdHIoKSA9PSAiNjczNDUiICk7CisgIC8vIEJ1dCB3ZSBkb24ndCBrbm93IHRoZSByZWFzb24sIHdoeSBzdGFuZGFyZCBzdGF0ZSB0aGF0LgorCisgIC8qCisgICAqIDI3LjcuMS4xOiAuLi4gdGhlbiBjb3BpZXMgdGhlIGNvbnRlbnQgb2Ygc3RyIGludG8gdGhlIGJhc2ljX3NyaW5nYnVmCisgICAqIHVuZGVybHlpbmcgY2hhcmFjdGVyIHNlcXVlbmNlIGFuZCBpbml0aWFsaXplcyB0aGUgaW5wdXQgYW5kIG91dHB1dAorICAgKiBzZXF1ZW5jZXMgYWNjb3JkaW5nIHRvIHdoaWNoLiBJZiB3aGljaCAmIGlvc19iYXNlOjpvdXQgaXMgdHJ1ZSwgaW5pdGlhbGl6ZXMKKyAgICogdGhlIG91dHB1dCBzZXF1ZW5jZSB3aXRoIHVuZGVybHlpbmcgc2VxdWVuY2UuIC4uLgorICAgKgorICAgKiBJIGNhbiB0cmVhdCB0aGlzIGFzICdsaWtlIG91dHB1dCB3YXMgcGVyZm9ybWVkJywgYW5kIHRoZW4gSSBzaG91bGQgYnVtcAorICAgKiBwdXQgcG9pbnRlci4uLiBMb29rcyBsaWtlIG1vcmUgdXNlZnVsIHRoZW4gbXkgcHJldmlvdXMgdHJlYXRtZW50LgorICAgKgorICAgKiAgICAgICAgICAtIHB0cgorICAgKi8KKworICBDUFBVTklUX0FTU0VSVCggb3Muc3RyKCkgPT0gIjEyMzQ1NjciICk7CisgIAorCisgIG9zLnN0ciggIjg5YWIiICk7CisgIENQUFVOSVRfQVNTRVJUKCBvcy5zdHIoKSA9PSAiODlhYiIgKTsKKworICBvcyA8PCAxMDsKKyAgQ1BQVU5JVF9BU1NFUlQoIG9zLmdvb2QoKSApOworICAvLyBDUFBVTklUX0FTU0VSVCggb3Muc3RyKCkgPT0gIjEwYWIiICk7CisgIENQUFVOSVRfQVNTRVJUKCBvcy5zdHIoKSA9PSAiODlhYjEwIiApOworfQorCit2b2lkIFNzdHJlYW1UZXN0OjpidWYoKQoreworICBzdHJpbmdzdHJlYW0gc3M7CisKKyAgc3MgPDwgIjEyMzQ1Njdcbjg5XG4iOworICBjaGFyIGJ1ZlsxMF07CisgIGJ1Zls3XSA9ICd4JzsKKyAgc3MuZ2V0KCBidWYsIDEwICk7CisgIENQUFVOSVRfQVNTRVJUKCAhc3MuZmFpbCgpICk7CisgIENQUFVOSVRfQVNTRVJUKCBidWZbMF0gPT0gJzEnICk7CisgIENQUFVOSVRfQVNTRVJUKCBidWZbMV0gPT0gJzInICk7CisgIENQUFVOSVRfQVNTRVJUKCBidWZbMl0gPT0gJzMnICk7CisgIENQUFVOSVRfQVNTRVJUKCBidWZbM10gPT0gJzQnICk7CisgIENQUFVOSVRfQVNTRVJUKCBidWZbNF0gPT0gJzUnICk7CisgIENQUFVOSVRfQVNTRVJUKCBidWZbNV0gPT0gJzYnICk7CisgIENQUFVOSVRfQVNTRVJUKCBidWZbNl0gPT0gJzcnICk7IC8vIDI3LjYuMS4zIHBhcmFncmFwaCAxMCwgcGFyYWdyYXBoIDcKKyAgQ1BQVU5JVF9BU1NFUlQoIGJ1Zls3XSA9PSAwICk7IC8vIDI3LjYuMS4zIHBhcmFncmFwaCA4CisgIGNoYXIgYzsKKyAgc3MuZ2V0KGMpOworICBDUFBVTklUX0FTU0VSVCggIXNzLmZhaWwoKSApOworICBDUFBVTklUX0FTU0VSVCggYyA9PSAnXG4nICk7IC8vIDI3LjYuMS4zIHBhcmFncmFwaCAxMCwgcGFyYWdyYXBoIDcKKyAgc3MuZ2V0KGMpOworICBDUFBVTklUX0FTU0VSVCggIXNzLmZhaWwoKSApOworICBDUFBVTklUX0FTU0VSVCggYyA9PSAnOCcgKTsKK30KKwordm9pZCBTc3RyZWFtVGVzdDo6cmRidWYoKQoreworICBzdHJpbmdzdHJlYW0gc3M7CisKKyAgc3MgPDwgIjEyMzQ1Njdcbjg5XG4iOworCisgIG9zdHJpbmdzdHJlYW0gb3M7CisgIHNzLmdldCggKm9zLnJkYnVmKCksICdcbicgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoICFzcy5mYWlsKCkgKTsKKyAgY2hhciBjOworICBzcy5nZXQoYyk7CisgIENQUFVOSVRfQVNTRVJUKCAhc3MuZmFpbCgpICk7CisgIENQUFVOSVRfQVNTRVJUKCBjID09ICdcbicgKTsgLy8gMjcuNi4xLjMgcGFyYWdyYXBoIDEyCisgIENQUFVOSVRfQVNTRVJUKCBvcy5zdHIoKSA9PSAiMTIzNDU2NyIgKTsKK30KKwordm9pZCBTc3RyZWFtVGVzdDo6c3RyZWFtYnVmX291dHB1dCgpCit7CisgIHsKKyAgICBpc3RyaW5nc3RyZWFtIGluKCIwMTIzNDU2Nzg5MDEyMzQ1Njc4OSIpOworICAgIENQUFVOSVRfQVNTRVJUKCBpbiApOworCisgICAgZnVsbF9zdHJlYW1idWYgZnVsbF9idWYoMTApOworICAgIG9zdHJlYW0gb3V0KCZmdWxsX2J1Zik7CisgICAgQ1BQVU5JVF9BU1NFUlQoIG91dCApOworCisgICAgb3V0IDw8IGluLnJkYnVmKCk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIG91dCApOworICAgIENQUFVOSVRfQVNTRVJUKCBpbiApOworICAgIC8vb3V0IGlzIGdvb2Qgd2UgY2FuIGNoZWNrIHdoYXQgaGFzIGJlZW4gZXh0cmFjdGVkOgorICAgIENQUFVOSVRfQVNTRVJUKCBmdWxsX2J1Zi5zdHIoKSA9PSAiMDEyMzQ1Njc4OSIgKTsKKworICAgIG91dCA8PCBpbi5yZGJ1ZigpOworICAgIENQUFVOSVRfQVNTRVJUKCBvdXQuZmFpbCgpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGluICk7CisKKyAgICBvc3RyaW5nc3RyZWFtIG9zdHI7CisgICAgb3N0ciA8PCBpbi5yZGJ1ZigpOworICAgIENQUFVOSVRfQVNTRVJUKCBvc3RyICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGluICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIG9zdHIuc3RyKCkgPT0gIjAxMjM0NTY3ODkiICk7CisgIH0KKworIyAgaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IGRlZmluZWQgKF9TVExQX1VTRV9FWENFUFRJT05TKQorICB7CisgICAgLy9JZiB0aGUgb3V0cHV0IHN0cmVhbSBidWZmZXIgdGhyb3dzOgorICAgIGlzdHJpbmdzdHJlYW0gaW4oIjAxMjM0NTY3ODkwMTIzNDU2Nzg5Iik7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGluICk7CisKKyAgICBmdWxsX3N0cmVhbWJ1ZiBmdWxsX2J1ZigxMCwgdHJ1ZSk7CisgICAgb3N0cmVhbSBvdXQoJmZ1bGxfYnVmKTsKKyAgICBDUFBVTklUX0FTU0VSVCggb3V0ICk7CisKKyAgICBvdXQgPDwgaW4ucmRidWYoKTsKKyAgICBDUFBVTklUX0FTU0VSVCggb3V0LmJhZCgpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGluICk7CisgICAgLy9vdXQgaXMgYmFkIHdlIGhhdmUgbm8gZ3VhcmFudHkgb24gd2hhdCBoYXMgYmVlbiBleHRyYWN0ZWQ6CisgICAgLy9DUFBVTklUX0FTU0VSVCggZnVsbF9idWYuc3RyKCkgPT0gIjAxMjM0NTY3ODkiICk7CisKKyAgICBvdXQuY2xlYXIoKTsKKyAgICBvdXQgPDwgaW4ucmRidWYoKTsKKyAgICBDUFBVTklUX0FTU0VSVCggb3V0LmZhaWwoKSAmJiBvdXQuYmFkKCkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggaW4gKTsKKworICAgIG9zdHJpbmdzdHJlYW0gb3N0cjsKKyAgICBvc3RyIDw8IGluLnJkYnVmKCk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIG9zdHIgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggaW4gKTsKKyAgICBDUFBVTklUX0FTU0VSVCggb3N0ci5zdHIoKSA9PSAiMDEyMzQ1Njc4OTAxMjM0NTY3ODkiICk7CisgIH0KKyMgIGVuZGlmCit9CisKK3ZvaWQgU3N0cmVhbVRlc3Q6OnNlZWsoKQoreworICBzdHJpbmdzdHJlYW0gcyggIjAxMjM0NTY3ODkiICk7CisKKyAgQ1BQVU5JVF9BU1NFUlQoIHMudGVsbGcoKSA9PSBzdHJpbmdzdHJlYW06OnBvc190eXBlKDApICk7CisgIHMuc2Vla2coIDYsIGlvczo6YmVnICk7CisgIENQUFVOSVRfQVNTRVJUKCBzLnRlbGxnKCkgPT0gc3RyaW5nc3RyZWFtOjpwb3NfdHlwZSg2KSApOworICBzLnNlZWtnKCAtMywgaW9zOjpjdXIgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHMudGVsbGcoKSA9PSBzdHJpbmdzdHJlYW06OnBvc190eXBlKDMpICk7CisKKyAgaXN0cmluZ3N0cmVhbSBpcyggIjAxMjM0NTY3ODkiICk7CisgIENQUFVOSVRfQVNTRVJUKCBpcy50ZWxsZygpID09IHN0cmluZ3N0cmVhbTo6cG9zX3R5cGUoMCkgKTsKKyAgaXMuc2Vla2coIDYsIGlvczo6YmVnICk7CisgIENQUFVOSVRfQVNTRVJUKCBpcy50ZWxsZygpID09IHN0cmluZ3N0cmVhbTo6cG9zX3R5cGUoNikgKTsKKyAgaXMuc2Vla2coIC0zLCBpb3M6OmN1ciApOworICBDUFBVTklUX0FTU0VSVCggaXMudGVsbGcoKSA9PSBzdHJpbmdzdHJlYW06OnBvc190eXBlKDMpICk7Cit9CisKK3ZvaWQgU3N0cmVhbVRlc3Q6OnNlZWtwKCkKK3sKKyAgb3N0cmluZ3N0cmVhbSBzOworCisgIHMgPDwgIjEyMzQ1NjciOworICBDUFBVTklUX0NIRUNLKCBzLnRlbGxwKCkgPT0gc3RyaW5nc3RyZWFtOjpwb3NfdHlwZSg3KSApOworICBDUFBVTklUX0NIRUNLKCBzLnN0cigpID09ICIxMjM0NTY3IiApOworICBzLnNlZWtwKCAwICk7CisgIHMgPDwgIlgiOworICBDUFBVTklUX0NIRUNLKCBzLnN0cigpID09ICJYMjM0NTY3IiApOworICBzLnNlZWtwKCAwLCBpb3M6OmJlZyApOworICBzIDw8ICJZIjsKKyAgQ1BQVU5JVF9DSEVDSyggcy5zdHIoKSA9PSAiWTIzNDU2NyIgKTsKK30KKwordm9pZCBTc3RyZWFtVGVzdDo6c2Vla19ncCgpCit7CisgIHN0cmluZ3N0cmVhbSBzcyggIjEiICk7CisKKyAgLyogSVNPL0lFQyAxNDg4MiAyMDAzIChhbmQgMTk5OCB0b28pIGFzc3VtZSBjaGFuZ2UgYXMgZ2V0IGFzIHB1dCBwb3NpdGlvbnMKKyAgICAgd2l0aCBzZWVrZyBhbmQgc2Vla3AgKDI3LjYuMS4zLCBwYXIgMzg7IDI3LjYuMi40IHBhciAyKSwKKyAgICAgYnV0IHRoaXMgY29udHJhZGljdCB0byBjb21tb24gcHJhY3RpY2UgYW5kIHByb3Bvc2VkIGRyYWZ0IE4yNTg4CisgICAgICgyNy42LjEuMywgcGFyIDQxOyAyNy42LjIuNSwgcGFyIDQpCisKKyAgICAgTm93IFNUTHBvcnQgaW1wbGVtZW50IChpLmUuIGNoYW5nZSBiZWhhdmlvdXIgKSB0aGUgZHJhZnQncyBwb2ludCBvZiB2aWV3LgorICAgKi8KKworICBzcy5zZWVrZyggMCwgaW9zOjpiZWcgKTsKKyAgc3Muc2Vla3AoIDAsIGlvczo6ZW5kICk7CisgIAorICBzcyA8PCAiMiI7CisKKyAgc3RyaW5nIHN0cjsKKworICBzcyA+PiBzdHI7CisKKyAgLyogIENQUFVOSVRfQ0hFQ0soIHN0ciA9PSAiMiIgKTsgLS0tIGFjY29yZGluZyBJU08vSUVDIDE0ODgyIDIwMDMgKi8KKyAgQ1BQVU5JVF9DSEVDSyggc3RyID09ICIxMiIgKTsKK30KKwordm9pZCBTc3RyZWFtVGVzdDo6dGVsbHAoKQoreworICB7CisgICAgb3N0cmluZ3N0cmVhbSBvKCAiMSIgKTsKKworICAgIG8gPDwgIjIzNDU2IjsKKworICAgIENQUFVOSVRfQ0hFQ0soIG8ucmRidWYoKS0+cHVic2Vla29mZiggMCwgaW9zX2Jhc2U6OmN1ciwgaW9zX2Jhc2U6Om91dCApID09IHN0cmluZ3N0cmVhbTo6cG9zX3R5cGUoNikgKTsKKyAgICBDUFBVTklUX0NIRUNLKCBvLnRlbGxwKCkgPT0gc3RyaW5nc3RyZWFtOjpwb3NfdHlwZSg2KSApOworICB9CisgIHsKKyAgICBvc3RyaW5nc3RyZWFtIG87CisKKyAgICBvIDw8ICIxMjM0NTYiOworCisgICAgQ1BQVU5JVF9DSEVDSyggby5yZGJ1ZigpLT5wdWJzZWVrb2ZmKCAwLCBpb3NfYmFzZTo6Y3VyLCBpb3NfYmFzZTo6b3V0ICkgPT0gc3RyaW5nc3RyZWFtOjpwb3NfdHlwZSg2KSApOworICAgIENQUFVOSVRfQ0hFQ0soIG8udGVsbHAoKSA9PSBzdHJpbmdzdHJlYW06OnBvc190eXBlKDYpICk7CisgIH0KKyAgeworICAgIG9zdHJpbmdzdHJlYW0gbyggIjEiICk7CisKKyAgICBvIDw8ICIyMzQ1Njc4OSI7CisKKyAgICBDUFBVTklUX0NIRUNLKCBvLnJkYnVmKCktPnB1YnNlZWtvZmYoIDAsIGlvc19iYXNlOjpjdXIsIGlvc19iYXNlOjpvdXQgKSA9PSBzdHJpbmdzdHJlYW06OnBvc190eXBlKDkpICk7CisgICAgQ1BQVU5JVF9DSEVDSyggby50ZWxscCgpID09IHN0cmluZ3N0cmVhbTo6cG9zX3R5cGUoOSkgKTsKKyAgfQorfQorCisKK3RlbXBsYXRlIDwgY2xhc3MgVCA+CitzdHJpbmcgdG9fc3RyaW5nKCBjb25zdCBUJiB2ICkKK3sKKyAgb3N0cmluZ3N0cmVhbSBvc3M7CisgIG9zcyA8PCB2OworICByZXR1cm4gb3NzLnN0cigpOworfQorCit2b2lkIFNzdHJlYW1UZXN0OjpuZWdhdGl2ZSgpCit7CisgIENQUFVOSVRfQ0hFQ0soIHRvX3N0cmluZzxpbnQ+KC0xKSA9PSAiLTEiICk7CisgIENQUFVOSVRfQ0hFQ0soIHRvX3N0cmluZzxsb25nPigtMSkgPT0gIi0xIiApOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9zdGFja19hbGxvY2F0b3IuaCBiL3Rlc3QvdW5pdC9zdGFja19hbGxvY2F0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2RiOTYwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L3N0YWNrX2FsbG9jYXRvci5oCkBAIC0wLDAgKzEsMjA2IEBACisjaWZuZGVmIFNUTFBPUlRfVU5JVF9URVNUX1NUQUNLX0FMTE9DQVRPUl9ICisjZGVmaW5lIFNUTFBPUlRfVU5JVF9URVNUX1NUQUNLX0FMTE9DQVRPUl9ICisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZCAoX1NUTFBfVVNFX0VYQ0VQVElPTlMpCisvL0ZvciBiYWRfYWxsb2M6CisjICBpbmNsdWRlIDxuZXc+CisjZW5kaWYKKworI3VuZGVmIF9fU1RECisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IGRlZmluZWQgKF9TVExQX1VTRV9OQU1FU1BBQ0VTKQorIyAgZGVmaW5lIF9fU1REIHN0ZDo6CisjZWxzZQorIyAgZGVmaW5lIF9fU1RECisjZW5kaWYKKworc3RydWN0IFN0YXRlIHsKKyAgY2hhciAqbV9iZWcsICptX2VuZCwgKm1fY3VyOworICBib29sIG1faXNPaywgbV9zd2FwZWQ7CisgIGludCBtX25iQWxsb2M7CisKKyAgLy9UaGUgZm9sbG93aW5nIG1lbWJlcnMgYXJlIHNoYXJlZCBhbW9uZyBhbGwgU3RhY2tBbGxvY2F0b3IgaW5zdGFuY2UgY3JlYXRlZCBmcm9tCisgIC8vYSByZWZlcmVuY2UgU3RhY2tBbGxvY2F0b3IgaW5zdGFuY2U6CisgIGNoYXIgKiptX3NoYXJlZEN1cjsKKyAgYm9vbCAqbV9zaGFyZWRPazsKKyAgaW50ICptX3NoYXJlZE5iQWxsb2M7CisKKyNpZiBkZWZpbmVkIChfX0RNQ19fKQorICBTdGF0ZSgpe30KKyNlbmRpZgorCisgIFN0YXRlKGNoYXIgKmJlZywgY2hhciAqZW5kKQorICAgIDogbV9iZWcoYmVnKSwgbV9lbmQoZW5kKSwgbV9jdXIobV9iZWcpLCBtX2lzT2sodHJ1ZSksIG1fc3dhcGVkKGZhbHNlKSwgbV9uYkFsbG9jKDApLAorICAgICAgbV9zaGFyZWRDdXIoJm1fY3VyKSwgbV9zaGFyZWRPaygmbV9pc09rKSwgbV9zaGFyZWROYkFsbG9jKCZtX25iQWxsb2MpIHt9CisKKyAgU3RhdGUoY29uc3QgU3RhdGUmIG90aGVyKQorICA6IG1fYmVnKG90aGVyLm1fYmVnKSwgbV9lbmQob3RoZXIubV9lbmQpLCBtX2N1cigwKSwKKyAgICBtX2lzT2sodHJ1ZSksIG1fc3dhcGVkKG90aGVyLm1fc3dhcGVkKSwgbV9uYkFsbG9jKDApLAorICAgIG1fc2hhcmVkQ3VyKG90aGVyLm1fc2hhcmVkQ3VyKSwgbV9zaGFyZWRPayhvdGhlci5tX3NoYXJlZE9rKSwKKyAgICBtX3NoYXJlZE5iQWxsb2Mob3RoZXIubV9zaGFyZWROYkFsbG9jKSB7fQorfTsKKworLyogVGhpcyBhbGxvY2F0b3IgaXMgbm90IHRocmVhZCBzYWZlOgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IFN0YWNrQWxsb2NhdG9yCisjaWYgZGVmaW5lZCAoU1RMUE9SVCkgJiYgXAorICAgIGRlZmluZWQgKF9TVExQX1VTRV9QQVJUSUFMX1NQRUNfV09SS0FST1VORCkgJiYgIWRlZmluZWQgKF9TVExQX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUikKKyAgLy9TcGVjaWFsIEJvcmxhbmQgd29ya2Fyb3VuZCB0aGF0IGhhdmUgcHJvYmxlbSB3aXRoIGZ1bmN0aW9uCisgIC8vb3ZlcmxvYWRpbmcgd2hlbiBvbmUgb2YgdGhlIG92ZXJsb2FkZWQgdmVyc2lvbiBpcyBhIHRlbXBsYXRlCisgIC8vb25lLiBUaGlzIGlzIHRoZSBjYXNlIGZvciB0aGUgc3RkOjpzd2FwIGZ1bmN0aW9uLgorICA6IHB1YmxpYyBfX1NURCBfX3N0bHBvcnRfY2xhc3M8U3RhY2tBbGxvY2F0b3I8X1RwPiA+CisjZW5kaWYKK3sKKyAgdHlwZWRlZiBfVHAgICAgICAgIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgdmFsdWVfdHlwZSAqICAgICAgIHBvaW50ZXI7CisgIHR5cGVkZWYgY29uc3QgX1RwKiBjb25zdF9wb2ludGVyOworICB0eXBlZGVmIF9UcCYgICAgICAgcmVmZXJlbmNlOworICB0eXBlZGVmIGNvbnN0IF9UcCYgY29uc3RfcmVmZXJlbmNlOworICB0eXBlZGVmIHNpemVfdCAgICAgc2l6ZV90eXBlOworICB0eXBlZGVmIHB0cmRpZmZfdCAgZGlmZmVyZW5jZV90eXBlOworCisjaWYgZGVmaW5lZCAoX19ETUNfXykKKyAgU3RhY2tBbGxvY2F0b3IoKXt9CisjZW5kaWYKKworICBTdGFja0FsbG9jYXRvcihjaGFyICpiZWcsIGNoYXIgKmVuZCkKKyAgICA6IG1fc3RhdGUoYmVnLCBlbmQpIHt9CisKKyAgY29uc3QgU3RhdGUmIGdldFN0YXRlKCkgY29uc3QgeyByZXR1cm4gbV9zdGF0ZTsgfQorI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX090aGVyVHA+CisgIFN0YWNrQWxsb2NhdG9yKFN0YWNrQWxsb2NhdG9yPF9PdGhlclRwPiBjb25zdCYgb3RoZXIpCisgICAgOiBtX3N0YXRlKG90aGVyLmdldFN0YXRlKCkpIHt9CisjZWxzZQorICBTdGFja0FsbG9jYXRvcihjb25zdCBTdGF0ZSYgc3RhdGUpCisgICAgOiBtX3N0YXRlKHN0YXRlKSB7fQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFX0NMQVNTRVMpCisgIHRlbXBsYXRlIDxjbGFzcyBfT3RoZXI+CisgIHN0cnVjdCByZWJpbmQgeworICAgIHR5cGVkZWYgU3RhY2tBbGxvY2F0b3I8X090aGVyPiBvdGhlcjsKKyAgfTsKKyNlbmRpZgorCisgIF9UcCogYWxsb2NhdGUoc2l6ZV90eXBlIG4sIHZvaWQqID0gMCkgeworICAgIGlmIChuID09IDApCisgICAgICByZXR1cm4gMDsKKworICAgICsrKCptX3N0YXRlLm1fc2hhcmVkTmJBbGxvYyk7CisKKyAgICBpZiAoKm1fc3RhdGUubV9zaGFyZWRDdXIgKyAobiAqIHNpemVvZihfVHApKSA8IG1fc3RhdGUubV9lbmQpIHsKKyAgICAgIGNoYXIgKnJldCA9ICptX3N0YXRlLm1fc2hhcmVkQ3VyOworICAgICAgKm1fc3RhdGUubV9zaGFyZWRDdXIgKz0gbiAqIHNpemVvZihfVHApOworICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8X1RwKj4ocmV0KTsKKyAgICB9CisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IGRlZmluZWQgKF9TVExQX1VTRV9FWENFUFRJT05TKQorICAgIHRocm93IF9fU1REIGJhZF9hbGxvYygpOworIyAgaWYgZGVmaW5lZCAoX19ETUNfXykKKyAgICByZXR1cm4gMDsKKyMgIGVuZGlmCisjZWxzZQorICAgIHJldHVybiAwOworI2VuZGlmCisgIH0KKworI2lmIGRlZmluZWQgKFNUTFBPUlQpICYmIFwKKyAgICBkZWZpbmVkIChfU1RMUF9VU0VfUEFSVElBTF9TUEVDX1dPUktBUk9VTkQpICYmICFkZWZpbmVkIChfU1RMUF9GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIpCisgIC8vTmVjZXNzYXJ5IGV4dGVuc2lvbiB0byBtYWtlIFN0YWNrQWxsb2NhdG9yIGEgcmVhbCBTVExwb3J0IGFsbG9jYXRvcgorICAvL2ltcGxlbWVudGF0aW9uOgorICBfVHAqIF9NX2FsbG9jYXRlKHNpemVfdHlwZSBuLCBzaXplX3R5cGUgJm5ld19uKSB7CisgICAgbmV3X24gPSBuOworICAgIHJldHVybiBhbGxvY2F0ZShuKTsKKyAgfQorI2VuZGlmCisKKyAgdm9pZCBkZWFsbG9jYXRlKHBvaW50ZXIgcCwgc2l6ZV90eXBlIG4pIHsKKyAgICBpZiAocCA9PSAwKQorICAgICAgcmV0dXJuOworCisgICAgLS0oKm1fc3RhdGUubV9zaGFyZWROYkFsbG9jKTsKKworICAgIGlmICgoY2hhciopcCA9PSAoKm1fc3RhdGUubV9zaGFyZWRDdXIgLSBuICogc2l6ZW9mKF9UcCkpKSB7CisgICAgICAqbV9zdGF0ZS5tX3NoYXJlZEN1ciAtPSBuICogc2l6ZW9mKF9UcCk7CisgICAgfQorCisgICAgaWYgKChjaGFyKilwIDwgbV9zdGF0ZS5tX2JlZyB8fCAoY2hhciopcCA+PSBtX3N0YXRlLm1fZW5kKSB7CisgICAgICAvL0FuIG9iamVjdCBoYXMgYmVlbiByZXR1cm5lZCB0byB0aGUgYmFkIGFsbG9jYXRvciBpbnN0YW5jZToKKyAgICAgICptX3N0YXRlLm1fc2hhcmVkT2sgPSBmYWxzZTsKKyAgICB9CisgIH0KKworICBwb2ludGVyIGFkZHJlc3MocmVmZXJlbmNlIF9feCkgY29uc3Qge3JldHVybiAmX194O30KKyAgY29uc3RfcG9pbnRlciBhZGRyZXNzKGNvbnN0X3JlZmVyZW5jZSBfX3gpIGNvbnN0IHsgcmV0dXJuICZfX3g7IH0KKyAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgeyByZXR1cm4gbV9zdGF0ZS5tX2VuZCAtICptX3N0YXRlLm1fc2hhcmVkQ3VyOyB9CisgIHZvaWQgY29uc3RydWN0KHBvaW50ZXIgX19wLCBjb25zdF9yZWZlcmVuY2UgX192YWwpIHsgbmV3KF9fcCkgX1RwKF9fdmFsKTsgIH0KKyAgdm9pZCBkZXN0cm95KHBvaW50ZXIgX19wKSB7IF9fcC0+fl9UcCgpOyB9CisKKyAgYm9vbCBvaygpIGNvbnN0IHsgcmV0dXJuIG1fc3RhdGUubV9pc09rICYmIChtX3N0YXRlLm1fbmJBbGxvYyA9PSAwKTsgfQorICB2b2lkIHJlc2V0ICgpIHsKKyAgICBtX3N0YXRlLm1fY3VyID0gbV9zdGF0ZS5tX2JlZzsKKyAgICBtX3N0YXRlLm1faXNPayA9IHRydWU7CisgICAgbV9zdGF0ZS5tX3N3YXBlZCA9IGZhbHNlOworICB9CisgIGJvb2wgc3dhcGVkKCkgY29uc3QgeyByZXR1cm4gbV9zdGF0ZS5tX3N3YXBlZDsgfQorICB2b2lkIHN3YXAoU3RhY2tBbGxvY2F0b3IgJm90aGVyKSB7CisgICAgX19TVEQgc3dhcChtX3N0YXRlLCBvdGhlci5tX3N0YXRlKTsKKyAgICBtX3N0YXRlLm1fc3dhcGVkID0gdHJ1ZTsKKyAgICBvdGhlci5tX3N0YXRlLm1fc3dhcGVkID0gdHJ1ZTsKKyAgfQorI2lmIGRlZmluZWQgKFNUTFBPUlQpICYmIFwKKyAgICBkZWZpbmVkIChfU1RMUF9VU0VfUEFSVElBTF9TUEVDX1dPUktBUk9VTkQpICYmICFkZWZpbmVkIChfU1RMUF9GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIpCisgIHZvaWQgX01fc3dhcF93b3JrYXJvdW5kKFN0YWNrQWxsb2NhdG9yJiBfX3gpIHsgc3dhcChfX3gpOyB9CisjZW5kaWYKKworICAvLzIgU3RhY2tBbGxvY2F0b3IgaW5zdGFuY2UgYXJlIGlkZW50aWNhbCBpZiB0aGV5IGFyZSBidWlsdCBvbiB0b3AKKyAgLy9vZiB0aGUgc2FtZSBidWZmZXIuCisgIGJvb2wgb3BlcmF0b3IgPT0gKFN0YWNrQWxsb2NhdG9yIGNvbnN0JiBvdGhlcikgY29uc3QKKyAgeyByZXR1cm4gbV9zdGF0ZS5tX2JlZyA9PSBvdGhlci5tX3N0YXRlLm1fYmVnOyB9CisKKyAgYm9vbCBvcGVyYXRvciAhPSAoU3RhY2tBbGxvY2F0b3IgY29uc3QmIG90aGVyKSBjb25zdAorICB7IHJldHVybiAhKCp0aGlzID09IG90aGVyKTsgfQorCitwcml2YXRlOgorICBTdGF0ZSBtX3N0YXRlOworfTsKKworI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkIChfU1RMUF9VU0VfTkFNRVNQQUNFUykKK25hbWVzcGFjZSBzdGQgeworI2VuZGlmCisKKyMgIGlmIGRlZmluZWQgKFNUTFBPUlQpICYmIChkZWZpbmVkIChfU1RMUF9ET05UX1NVUFBPUlRfUkVCSU5EX01FTUJFUl9URU1QTEFURSkgfHwgIWRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpKQordGVtcGxhdGUgPGNsYXNzIF9UcDEsIGNsYXNzIF9UcDI+CitpbmxpbmUgU3RhY2tBbGxvY2F0b3I8X1RwMj4mCitfX3N0bF9hbGxvY19yZWJpbmQoU3RhY2tBbGxvY2F0b3I8X1RwMT4mIF9fYSwgY29uc3QgX1RwMiopIHsgIHJldHVybiAoU3RhY2tBbGxvY2F0b3I8X1RwMj4mKShfX2EpOyB9Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwMSwgY2xhc3MgX1RwMj4KK2lubGluZSBTdGFja0FsbG9jYXRvcjxfVHAyPgorX19zdGxfYWxsb2NfY3JlYXRlKGNvbnN0IFN0YWNrQWxsb2NhdG9yPF9UcDE+JiBfX2EsIGNvbnN0IF9UcDIqKSB7IHJldHVybiBTdGFja0FsbG9jYXRvcjxfVHAyPihfX2EuZ2V0U3RhdGUoKSk7IH0KKyMgIGVuZGlmCisKKyMgIGlmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkIChfU1RMUF9GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIpCisgIHRlbXBsYXRlIDxjbGFzcyBfVHA+CisgIGlubGluZSB2b2lkIHN3YXAoU3RhY2tBbGxvY2F0b3I8X1RwPiYgX19hLCBTdGFja0FsbG9jYXRvcjxfVHA+JiBfX2IpCisgIHsgX19hLnN3YXAoX19iKTsgfQorIyAgZWxpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKQorLy9UaGUgZm9sbG93aW5nIG92ZXJsb2FkcyBkZXBlbmRzIG9uIGluc3RhbmNpYXRpb24sIGlmIG5ldyB1bml0IHRlc3RzIGFyZSB3cml0dGVuCisvL3dpdGggbmV3IFN0YWNrQWxsb2NhdG9yIGluc3RhbmNpYXRpb25zIGFzc29jaWF0ZWQgc3dhcCBvdmVybG9hZCBzaG91bGQgYWxzbyBiZQorLy93cml0dGVuCitpbmxpbmUgdm9pZCBzd2FwKFN0YWNrQWxsb2NhdG9yPGludD4mIF9fYSwgU3RhY2tBbGxvY2F0b3I8aW50PiYgX19iKQoreyBfX2Euc3dhcChfX2IpOyB9CitpbmxpbmUgdm9pZCBzd2FwKFN0YWNrQWxsb2NhdG9yPGNoYXI+JiBfX2EsIFN0YWNrQWxsb2NhdG9yPGNoYXI+JiBfX2IpCit7IF9fYS5zd2FwKF9fYik7IH0KK2lubGluZSB2b2lkIHN3YXAoU3RhY2tBbGxvY2F0b3I8cGFpcjxjb25zdCBpbnQsIGludD4gPiYgX19hLAorICAgICAgICAgICAgICAgICBTdGFja0FsbG9jYXRvcjxwYWlyPGNvbnN0IGludCwgaW50PiA+JiBfX2IpCit7IF9fYS5zd2FwKF9fYik7IH0KKyMgIGVuZGlmCisKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZCAoX1NUTFBfVVNFX05BTUVTUEFDRVMpCit9CisjZW5kaWYKKworI3VuZGVmIF9fU1RECisKKyNlbmRpZiAvL1NUTFBPUlRfVU5JVF9URVNUX1NUQUNLX0FMTE9DQVRPUl9ICmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvc3RhY2tfaGVhZGVyX3Rlc3QuY3BwIGIvdGVzdC91bml0L3N0YWNrX2hlYWRlcl90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTk0NmVhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L3N0YWNrX2hlYWRlcl90ZXN0LmNwcApAQCAtMCwwICsxLDggQEAKKy8qIFRoaXMgdGVzdCBwdXJwb3NlIGlzIHNpbXBseSB0byBjaGVjayBTdGFuZGFyZCBoZWFkZXIgaW5kZXBlbmRhbmN5IHRoYXQKKyAqIGlzIHRvIHNheSB0aGF0IHRoZSBoZWFkZXIgY2FuIGJlIGluY2x1ZGVkIGFsb25lIHdpdGhvdXQgYW55IHByZXZpb3VzCisgKiBpbmNsdWRlLgorICogQWRkaXRpb25uYWx5LCBmb3IgQyBTdGFuZGFyZCBoZWFkZXJzIHRoYXQgU1RMcG9ydCBleHBvc2UsIGl0IGNhbiBhbHNvIGJlCisgKiB1c2VkIHRvIGNoZWNrIHRoYXQgZmlsZXMgaW5jbHVkZWQgYnkgdGhvc2UgaGVhZGVycyBhcmUgY29tcGF0aWJsZSB3aXRoCisgKiBwdXJlIEMgY29tcGlsZXJzLgorICovCisjaW5jbHVkZSA8c3RhY2s+CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvc3RhY2tfdGVzdC5jcHAgYi90ZXN0L3VuaXQvc3RhY2tfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZmMmFhYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9zdGFja190ZXN0LmNwcApAQCAtMCwwICsxLDYwIEBACisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8cXVldWU+CisjaW5jbHVkZSA8ZGVxdWU+CisjaW5jbHVkZSA8c3RhY2s+CisKKyNpbmNsdWRlICJjcHB1bml0L2NwcHVuaXRfcHJveHkuaCIKKworI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkKF9TVExQX1VTRV9OQU1FU1BBQ0VTKQordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyNlbmRpZgorCisvLworLy8gVGVzdENhc2UgY2xhc3MKKy8vCitjbGFzcyBTdGFja1Rlc3QgOiBwdWJsaWMgQ1BQVU5JVF9OUzo6VGVzdENhc2UKK3sKKyAgQ1BQVU5JVF9URVNUX1NVSVRFKFN0YWNrVGVzdCk7CisgIENQUFVOSVRfVEVTVChzdGFjazEpOworICBDUFBVTklUX1RFU1Qoc3RhY2syKTsKKyAgQ1BQVU5JVF9URVNUX1NVSVRFX0VORCgpOworCitwcm90ZWN0ZWQ6CisgIHZvaWQgc3RhY2sxKCk7CisgIHZvaWQgc3RhY2syKCk7Cit9OworCitDUFBVTklUX1RFU1RfU1VJVEVfUkVHSVNUUkFUSU9OKFN0YWNrVGVzdCk7CisKKy8vCisvLyB0ZXN0cyBpbXBsZW1lbnRhdGlvbgorLy8KK3ZvaWQgU3RhY2tUZXN0OjpzdGFjazEoKQoreworICBzdGFjazxpbnQsIGRlcXVlPGludD4gPiBzOworICBzLnB1c2goNDIpOworICBzLnB1c2goMTAxKTsKKyAgcy5wdXNoKDY5KTsKKyAgQ1BQVU5JVF9BU1NFUlQocy50b3AoKT09NjkpOworICBzLnBvcCgpOworICBDUFBVTklUX0FTU0VSVChzLnRvcCgpPT0xMDEpOworICBzLnBvcCgpOworICBDUFBVTklUX0FTU0VSVChzLnRvcCgpPT00Mik7CisgIHMucG9wKCk7CisgIENQUFVOSVRfQVNTRVJUKHMuZW1wdHkoKSk7Cit9Cit2b2lkIFN0YWNrVGVzdDo6c3RhY2syKCkKK3sKKyAgc3RhY2s8aW50LCBsaXN0PGludD4gPiBzOworICBzLnB1c2goNDIpOworICBzLnB1c2goMTAxKTsKKyAgcy5wdXNoKDY5KTsKKyAgQ1BQVU5JVF9BU1NFUlQocy50b3AoKT09NjkpOworICBzLnBvcCgpOworICBDUFBVTklUX0FTU0VSVChzLnRvcCgpPT0xMDEpOworICBzLnBvcCgpOworICBDUFBVTklUX0FTU0VSVChzLnRvcCgpPT00Mik7CisgIHMucG9wKCk7CisgIENQUFVOSVRfQVNTRVJUKHMuZW1wdHkoKSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvc3RkYXJnX2hlYWRlcl90ZXN0LmMgYi90ZXN0L3VuaXQvc3RkYXJnX2hlYWRlcl90ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkwMWNiYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9zdGRhcmdfaGVhZGVyX3Rlc3QuYwpAQCAtMCwwICsxLDggQEAKKy8qIFRoaXMgdGVzdCBwdXJwb3NlIGlzIHNpbXBseSB0byBjaGVjayBTdGFuZGFyZCBoZWFkZXIgaW5kZXBlbmRhbmN5IHRoYXQKKyAqIGlzIHRvIHNheSB0aGF0IHRoZSBoZWFkZXIgY2FuIGJlIGluY2x1ZGVkIGFsb25lIHdpdGhvdXQgYW55IHByZXZpb3VzCisgKiBpbmNsdWRlLgorICogQWRkaXRpb25uYWx5LCBmb3IgQyBTdGFuZGFyZCBoZWFkZXJzIHRoYXQgU1RMcG9ydCBleHBvc2UsIGl0IGNhbiBhbHNvIGJlCisgKiB1c2VkIHRvIGNoZWNrIHRoYXQgZmlsZXMgaW5jbHVkZWQgYnkgdGhvc2UgaGVhZGVycyBhcmUgY29tcGF0aWJsZSB3aXRoCisgKiBwdXJlIEMgY29tcGlsZXJzLgorICovCisjaW5jbHVkZSA8c3RkYXJnLmg+CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvc3RkZGVmX2hlYWRlcl90ZXN0LmMgYi90ZXN0L3VuaXQvc3RkZGVmX2hlYWRlcl90ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIwMDM3MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9zdGRkZWZfaGVhZGVyX3Rlc3QuYwpAQCAtMCwwICsxLDggQEAKKy8qIFRoaXMgdGVzdCBwdXJwb3NlIGlzIHNpbXBseSB0byBjaGVjayBTdGFuZGFyZCBoZWFkZXIgaW5kZXBlbmRhbmN5IHRoYXQKKyAqIGlzIHRvIHNheSB0aGF0IHRoZSBoZWFkZXIgY2FuIGJlIGluY2x1ZGVkIGFsb25lIHdpdGhvdXQgYW55IHByZXZpb3VzCisgKiBpbmNsdWRlLgorICogQWRkaXRpb25uYWx5LCBmb3IgQyBTdGFuZGFyZCBoZWFkZXJzIHRoYXQgU1RMcG9ydCBleHBvc2UsIGl0IGNhbiBhbHNvIGJlCisgKiB1c2VkIHRvIGNoZWNrIHRoYXQgZmlsZXMgaW5jbHVkZWQgYnkgdGhvc2UgaGVhZGVycyBhcmUgY29tcGF0aWJsZSB3aXRoCisgKiBwdXJlIEMgY29tcGlsZXJzLgorICovCisjaW5jbHVkZSA8c3RkZGVmLmg+CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvc3RkZXhjZXB0X2hlYWRlcl90ZXN0LmNwcCBiL3Rlc3QvdW5pdC9zdGRleGNlcHRfaGVhZGVyX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MTE0ZTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvc3RkZXhjZXB0X2hlYWRlcl90ZXN0LmNwcApAQCAtMCwwICsxLDggQEAKKy8qIFRoaXMgdGVzdCBwdXJwb3NlIGlzIHNpbXBseSB0byBjaGVjayBTdGFuZGFyZCBoZWFkZXIgaW5kZXBlbmRhbmN5IHRoYXQKKyAqIGlzIHRvIHNheSB0aGF0IHRoZSBoZWFkZXIgY2FuIGJlIGluY2x1ZGVkIGFsb25lIHdpdGhvdXQgYW55IHByZXZpb3VzCisgKiBpbmNsdWRlLgorICogQWRkaXRpb25uYWx5LCBmb3IgQyBTdGFuZGFyZCBoZWFkZXJzIHRoYXQgU1RMcG9ydCBleHBvc2UsIGl0IGNhbiBhbHNvIGJlCisgKiB1c2VkIHRvIGNoZWNrIHRoYXQgZmlsZXMgaW5jbHVkZWQgYnkgdGhvc2UgaGVhZGVycyBhcmUgY29tcGF0aWJsZSB3aXRoCisgKiBwdXJlIEMgY29tcGlsZXJzLgorICovCisjaW5jbHVkZSA8c3RkZXhjZXB0PgpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L3N0ZGlvX2hlYWRlcl90ZXN0LmMgYi90ZXN0L3VuaXQvc3RkaW9faGVhZGVyX3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGY0MmMxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L3N0ZGlvX2hlYWRlcl90ZXN0LmMKQEAgLTAsMCArMSw4IEBACisvKiBUaGlzIHRlc3QgcHVycG9zZSBpcyBzaW1wbHkgdG8gY2hlY2sgU3RhbmRhcmQgaGVhZGVyIGluZGVwZW5kYW5jeSB0aGF0CisgKiBpcyB0byBzYXkgdGhhdCB0aGUgaGVhZGVyIGNhbiBiZSBpbmNsdWRlZCBhbG9uZSB3aXRob3V0IGFueSBwcmV2aW91cworICogaW5jbHVkZS4KKyAqIEFkZGl0aW9ubmFseSwgZm9yIEMgU3RhbmRhcmQgaGVhZGVycyB0aGF0IFNUTHBvcnQgZXhwb3NlLCBpdCBjYW4gYWxzbyBiZQorICogdXNlZCB0byBjaGVjayB0aGF0IGZpbGVzIGluY2x1ZGVkIGJ5IHRob3NlIGhlYWRlcnMgYXJlIGNvbXBhdGlibGUgd2l0aAorICogcHVyZSBDIGNvbXBpbGVycy4KKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvc3RkbGliX2hlYWRlcl90ZXN0LmMgYi90ZXN0L3VuaXQvc3RkbGliX2hlYWRlcl90ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQzZjkwNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9zdGRsaWJfaGVhZGVyX3Rlc3QuYwpAQCAtMCwwICsxLDggQEAKKy8qIFRoaXMgdGVzdCBwdXJwb3NlIGlzIHNpbXBseSB0byBjaGVjayBTdGFuZGFyZCBoZWFkZXIgaW5kZXBlbmRhbmN5IHRoYXQKKyAqIGlzIHRvIHNheSB0aGF0IHRoZSBoZWFkZXIgY2FuIGJlIGluY2x1ZGVkIGFsb25lIHdpdGhvdXQgYW55IHByZXZpb3VzCisgKiBpbmNsdWRlLgorICogQWRkaXRpb25uYWx5LCBmb3IgQyBTdGFuZGFyZCBoZWFkZXJzIHRoYXQgU1RMcG9ydCBleHBvc2UsIGl0IGNhbiBhbHNvIGJlCisgKiB1c2VkIHRvIGNoZWNrIHRoYXQgZmlsZXMgaW5jbHVkZWQgYnkgdGhvc2UgaGVhZGVycyBhcmUgY29tcGF0aWJsZSB3aXRoCisgKiBwdXJlIEMgY29tcGlsZXJzLgorICovCisjaW5jbHVkZSA8c3RkbGliLmg+CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvc3RsZGJnX2luY2x1ZGUuY3BwIGIvdGVzdC91bml0L3N0bGRiZ19pbmNsdWRlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjJjOWE4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L3N0bGRiZ19pbmNsdWRlLmNwcApAQCAtMCwwICsxLDQwIEBACisvKgorICogVGhpcyBpcyBjb21waWxlLXRpbWUgdGVzdCBmb3Igc2l0dWF0aW9uIGJlbG93IG5vdCBoYXBwZW4uCisgKiBTVExwb3J0IHVzZSBtYW55IGRlZmluZXMgYW5kIGF1eGlsYXJ5IHN0cnVjdHVyZXMsIG5hbWVzcGFjZXMgYW5kIHRlbXBsYXRlcworICogdGhhdCBpbmNsdWRlZCB2aWEgX3Byb2xvZy5oLiBBZnRlciBwcmVwcm9jZXNzb3IgcGhhc2Ugd2UgbWF5IHNlZToKKyAqCisgKiBleHRlcm4gIkMiIHsKKyAqCisgKiBuYW1lc3BhY2Ugc3RkIHsgfQorICoKKyAqCisgKiBUaGlzIGlzIGJhZCwgYnV0IGFjY2VwdGFibGUuIEJ1dCBpbiBTVExQT1JUX0RFQlVHIG1vZGUgd2UgY2FuIHNlZQorICoKKyAqIGV4dGVybiAiQyIgeworICoKKyAqIG5hbWVzcGFjZSBzdGQgeworICogbmFtZXNwYWNlIHByaXZhdGUgeworICoKKyAqIHRlbXBsYXRlIDxjbGFzcyBfRHVtbXk+CisgKiBjbGFzcyBfX3N0bF9kZWJ1Z19lbmdpbmUgeworICoKKyAqIAorICogVGhpcyBsZWFkIHRvIGNvbXBpbGUtdGltZSBlcnJvci4KKyAqIFtUaGlzIGR1ZSB0byBzeXMvdHlwZXMuaCBjb250YWlucworICoKKyAqICBfX0JFR0lOX0RFQ0xTCisgKiAgI2luY2x1ZGUgPGJpdHMvdHlwZXMuaD4KKyAqCisgKiAKKyAqIGkuZS4gaW5jbHVkZSBvdGhlciBoZWFkZXJzIHdpdGhpbiBleHRlcm4gIkMiIHsgc2NvcGUuIEJhZCwgYnV0IHRoaXMgaXMgZmFjdC5dCisgKgorICogT3JpZ2luIG9mIHByb2JsZW06IFNUTHBvcnQgcHJvdmlkZSBwcm94eS1oZWFkZXJzIGFzIGZvciBDKysgaGVhZGVycywgYXMgZm9yIEMKKyAqIGhlYWRlcnMuIEZvciBDIGhlYWRlcnMsIHdlIHNob3VsZG4ndCBleHBvc2UgQysrIGNvbnN0cnVjdGlvbnMsIGJlY2F1c2Ugc3lzdGVtCisgKiBoZWFkZXJzIG1heSBpbmNsdWRlIGVhY2ggb3RoZXIgYnkgdW5leHBlY3RlZCB3YXkgKGZyb20gU1RMcG9ydCBwb2ludCBvZiB2aWV3KS4KKyAqCisgKiAgICAgICAgICAgLSBwdHIsIDIwMDctMDQtMDUKKyAqLworCisjaWZkZWYgX191bml4CisjIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvc3RyZWFtYnVmX2hlYWRlcl90ZXN0LmNwcCBiL3Rlc3QvdW5pdC9zdHJlYW1idWZfaGVhZGVyX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzNWY5MDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvc3RyZWFtYnVmX2hlYWRlcl90ZXN0LmNwcApAQCAtMCwwICsxLDEwIEBACisvKiBUaGlzIHRlc3QgcHVycG9zZSBpcyBzaW1wbHkgdG8gY2hlY2sgU3RhbmRhcmQgaGVhZGVyIGluZGVwZW5kYW5jeSB0aGF0CisgKiBpcyB0byBzYXkgdGhhdCB0aGUgaGVhZGVyIGNhbiBiZSBpbmNsdWRlZCBhbG9uZSB3aXRob3V0IGFueSBwcmV2aW91cworICogaW5jbHVkZS4KKyAqIEFkZGl0aW9ubmFseSwgZm9yIEMgU3RhbmRhcmQgaGVhZGVycyB0aGF0IFNUTHBvcnQgZXhwb3NlLCBpdCBjYW4gYWxzbyBiZQorICogdXNlZCB0byBjaGVjayB0aGF0IGZpbGVzIGluY2x1ZGVkIGJ5IHRob3NlIGhlYWRlcnMgYXJlIGNvbXBhdGlibGUgd2l0aAorICogcHVyZSBDIGNvbXBpbGVycy4KKyAqLworI2lmICFkZWZpbmVkIChfU1RMUF9OT19JT1NUUkVBTVMpCisjICBpbmNsdWRlIDxzdHJlYW1idWY+CisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9zdHJpbmdfaGVhZGVyX3Rlc3QuYyBiL3Rlc3QvdW5pdC9zdHJpbmdfaGVhZGVyX3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjQyZWViCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L3N0cmluZ19oZWFkZXJfdGVzdC5jCkBAIC0wLDAgKzEsOCBAQAorLyogVGhpcyB0ZXN0IHB1cnBvc2UgaXMgc2ltcGx5IHRvIGNoZWNrIFN0YW5kYXJkIGhlYWRlciBpbmRlcGVuZGFuY3kgdGhhdAorICogaXMgdG8gc2F5IHRoYXQgdGhlIGhlYWRlciBjYW4gYmUgaW5jbHVkZWQgYWxvbmUgd2l0aG91dCBhbnkgcHJldmlvdXMKKyAqIGluY2x1ZGUuCisgKiBBZGRpdGlvbm5hbHksIGZvciBDIFN0YW5kYXJkIGhlYWRlcnMgdGhhdCBTVExwb3J0IGV4cG9zZSwgaXQgY2FuIGFsc28gYmUKKyAqIHVzZWQgdG8gY2hlY2sgdGhhdCBmaWxlcyBpbmNsdWRlZCBieSB0aG9zZSBoZWFkZXJzIGFyZSBjb21wYXRpYmxlIHdpdGgKKyAqIHB1cmUgQyBjb21waWxlcnMuCisgKi8KKyNpbmNsdWRlIDxzdHJpbmcuaD4KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9zdHJpbmdfaGVhZGVyX3Rlc3QuY3BwIGIvdGVzdC91bml0L3N0cmluZ19oZWFkZXJfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYzNmIyNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9zdHJpbmdfaGVhZGVyX3Rlc3QuY3BwCkBAIC0wLDAgKzEsOCBAQAorLyogVGhpcyB0ZXN0IHB1cnBvc2UgaXMgc2ltcGx5IHRvIGNoZWNrIFN0YW5kYXJkIGhlYWRlciBpbmRlcGVuZGFuY3kgdGhhdAorICogaXMgdG8gc2F5IHRoYXQgdGhlIGhlYWRlciBjYW4gYmUgaW5jbHVkZWQgYWxvbmUgd2l0aG91dCBhbnkgcHJldmlvdXMKKyAqIGluY2x1ZGUuCisgKiBBZGRpdGlvbm5hbHksIGZvciBDIFN0YW5kYXJkIGhlYWRlcnMgdGhhdCBTVExwb3J0IGV4cG9zZSwgaXQgY2FuIGFsc28gYmUKKyAqIHVzZWQgdG8gY2hlY2sgdGhhdCBmaWxlcyBpbmNsdWRlZCBieSB0aG9zZSBoZWFkZXJzIGFyZSBjb21wYXRpYmxlIHdpdGgKKyAqIHB1cmUgQyBjb21waWxlcnMuCisgKi8KKyNpbmNsdWRlIDxzdHJpbmc+CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvc3RyaW5nX3Rlc3QuY3BwIGIvdGVzdC91bml0L3N0cmluZ190ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODdkNjhlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L3N0cmluZ190ZXN0LmNwcApAQCAtMCwwICsxLDE0MjcgQEAKKy8vVG8gbWFrZSBHTGliIEMrKyBjbG9zZXIgdG8gU1RMcG9ydCBiZWhhdmlvciB3ZSBuZWVkIHRoaXMgbWFjcm86CisvL09ubHkgbWFuZGF0b3J5IHdoZW4gYnVpbGRpbmcgdW5pdCB0ZXN0cyB3aXRob3V0IFNUTHBvcnQsIGRvIG5vdCBjaGFuZ2UKKy8vYW55dGhpbmcgd2hlbiBidWlsZGluZyB3aXRoIFNUTHBvcnQKKyNkZWZpbmUgX0dMSUJDWFhfRlVMTFlfRFlOQU1JQ19TVFJJTkcKKworLy9IYXMgdG8gYmUgZmlyc3QgZm9yIFN0YWNrQWxsb2NhdG9yIHN3YXAgb3ZlcmxvYWQgdG8gYmUgdGFrZW4KKy8vaW50byBhY2NvdW50IChhdCBsZWFzdCB1c2luZyBHQ0MgNC4wLjEpCisjaW5jbHVkZSAic3RhY2tfYWxsb2NhdG9yLmgiCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8ZGVxdWU+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgIWRlZmluZWQgKF9TVExQX1VTRV9OT19JT1NUUkVBTVMpCisjICBpbmNsdWRlIDxzc3RyZWFtPgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZCAoX1NUTFBfVVNFX0VYQ0VQVElPTlMpCisjICBpbmNsdWRlIDxzdGRleGNlcHQ+CisjZW5kaWYKKworI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkIChfU1RMUF9USFJFQURTKQorIyAgaWYgZGVmaW5lZCAoU1RMUE9SVCkgJiYgZGVmaW5lZCAoX1NUTFBfUFRIUkVBRFMpIHx8IFwKKyAgICAgIGRlZmluZWQgKF9fR05VQ19fKSAmJiAhZGVmaW5lZCAoX19NSU5HVzMyX18pCisjICAgIGRlZmluZSBVU0VfUFRIUkVBRF9BUEkKKyMgICAgaW5jbHVkZSA8cHRocmVhZC5oPgorIyAgZW5kaWYKKworIyAgaWYgZGVmaW5lZCAoU1RMUE9SVCkgJiYgZGVmaW5lZCAoX1NUTFBfV0lOMzJUSFJFQURTKSB8fCBcCisgICAgICBkZWZpbmVkIChfX0dOVUNfXykgJiYgZGVmaW5lZCAoX19NSU5HVzMyX18pIHx8IFwKKyAgICAgIGRlZmluZWQgKF9NU0NfVkVSKQorIyAgICBkZWZpbmUgVVNFX1dJTkRPV1NfQVBJCisjICAgIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyMgIGVuZGlmCisjZW5kaWYKKworI2luY2x1ZGUgInN0YWNrX2FsbG9jYXRvci5oIgorI2luY2x1ZGUgImNwcHVuaXQvY3BwdW5pdF9wcm94eS5oIgorCisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IGRlZmluZWQoX1NUTFBfVVNFX05BTUVTUEFDRVMpCit1c2luZyBuYW1lc3BhY2Ugc3RkOworI2VuZGlmCisKKy8vCisvLyBUZXN0Q2FzZSBjbGFzcworLy8KK2NsYXNzIFN0cmluZ1Rlc3QgOiBwdWJsaWMgQ1BQVU5JVF9OUzo6VGVzdENhc2UKK3sKKyAgQ1BQVU5JVF9URVNUX1NVSVRFKFN0cmluZ1Rlc3QpOworICBDUFBVTklUX1RFU1QoY29uc3RydWN0b3IpOworICBDUFBVTklUX1RFU1QodHJpdmlhbF9jaGFyX2NvbXBhcmUpOworICBDUFBVTklUX1RFU1QocmVzZXJ2ZSk7CisgIENQUFVOSVRfVEVTVChhc3NpZ24pOworICBDUFBVTklUX1RFU1QoZXJhc2UpOworICBDUFBVTklUX1RFU1QoZGF0YSk7CisgIENQUFVOSVRfVEVTVChjX3N0cik7CisgIENQUFVOSVRfVEVTVChudWxsX2NoYXIpOworICBDUFBVTklUX1RFU1QoaW5zZXJ0KTsKKyAgQ1BQVU5JVF9URVNUKHJlcGxhY2UpOworICBDUFBVTklUX1RFU1QocmVzaXplKTsKKyAgQ1BQVU5JVF9URVNUKHNob3J0X3N0cmluZyk7CisgIENQUFVOSVRfVEVTVChmaW5kKTsKKyAgQ1BQVU5JVF9URVNUKGJvZ3VzX2VkZ2VfZmluZCk7CisgIENQUFVOSVRfVEVTVChyZmluZCk7CisgIENQUFVOSVRfVEVTVChmaW5kX2xhc3Rfb2YpOworICBDUFBVTklUX1RFU1QoZmluZF9sYXN0X25vdF9vZik7CisgIENQUFVOSVRfVEVTVChjb3B5KTsKKyNpZiAhZGVmaW5lZCAoVVNFX1BUSFJFQURfQVBJKSAmJiAhZGVmaW5lZCAoVVNFX1dJTkRPV1NfQVBJKQorICBDUFBVTklUX0lHTk9SRTsKKyNlbmRpZgorICBDUFBVTklUX1RFU1QobXQpOworICBDUFBVTklUX1NUT1BfSUdOT1JFOworICBDUFBVTklUX1RFU1Qoc2hvcnRfc3RyaW5nX29wdGltX2J1Zyk7CisgIENQUFVOSVRfVEVTVChjb21wYXJlKTsKKyAgQ1BQVU5JVF9URVNUKHRlbXBsYXRlX2V4cHJlc3Npb24pOworI2lmIGRlZmluZWQgKFNUTFBPUlQpICYmICgoZGVmaW5lZCAoX1NUTFBfTVNWQykgJiYgKF9TVExQX01TVkMgPCAxMzAwKSkgfHwgXAorICAgKGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX1NUTFBfVVNFX1RFTVBMQVRFX0VYUFJFU1NJT04pICYmIFwKKyAgICAoKF9fR05VQ19fIDwgNCkgfHwgKF9fR05VQ19fID09IDQgJiYgX19HTlVDX01JTk9SX18gPCAxKSkgKSApCisjICBkZWZpbmUgVEVfVE1QX1RFU1RfSUdOT1JFRAorICBDUFBVTklUX0lHTk9SRTsKKyNlbmRpZgorICBDUFBVTklUX1RFU1QodGVfdG1wKTsKKyNpZiBkZWZpbmVkIChURV9UTVBfVEVTVF9JR05PUkVEKQorICBDUFBVTklUX1NUT1BfSUdOT1JFOworI2VuZGlmCisgIENQUFVOSVRfVEVTVChvcGVyX3RtcCk7CisjaWYgZGVmaW5lZCAoU1RMUE9SVCkgJiYgZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkKKyAgQ1BQVU5JVF9JR05PUkU7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChfX0NZR1dJTl9fKSAmJiAhZGVmaW5lZCAoU1RMUE9SVCkKKyAgQ1BQVU5JVF9JR05PUkU7CisjZW5kaWYKKyAgQ1BQVU5JVF9URVNUKHRlbXBsYXRlX3dleHByZXNzaW9uKTsKKyAgQ1BQVU5JVF9TVE9QX0lHTk9SRTsKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiBkZWZpbmVkIChfU1RMUF9VU0VfTk9fSU9TVFJFQU1TKQorICBDUFBVTklUX0lHTk9SRTsKKyNlbmRpZgorICBDUFBVTklUX1RFU1QoaW8pOworICBDUFBVTklUX1NUT1BfSUdOT1JFOworI2lmIGRlZmluZWQgKFNUTFBPUlQpICYmIGRlZmluZWQgKF9TVExQX05PX0NVU1RPTV9JTykKKyAgQ1BQVU5JVF9JR05PUkU7CisjZW5kaWYKKyAgQ1BQVU5JVF9URVNUKGFsbG9jYXRvcl93aXRoX3N0YXRlKTsKKyAgQ1BQVU5JVF9TVE9QX0lHTk9SRTsKKyAgQ1BQVU5JVF9URVNUKGNhcGFjaXR5KTsKKyAgQ1BQVU5JVF9URVNUKGNvbmNhdDI0KTsKKyAgQ1BQVU5JVF9URVNUX1NVSVRFX0VORCgpOworCitwcm90ZWN0ZWQ6CisgIHZvaWQgY29uc3RydWN0b3IoKTsKKyAgdm9pZCB0cml2aWFsX2NoYXJfY29tcGFyZSgpOworICB2b2lkIHJlc2VydmUoKTsKKyAgdm9pZCBlcmFzZSgpOworICB2b2lkIGRhdGEoKTsKKyAgdm9pZCBjX3N0cigpOworICB2b2lkIG51bGxfY2hhcigpOworICB2b2lkIGluc2VydCgpOworICB2b2lkIHJlcGxhY2UoKTsKKyAgdm9pZCByZXNpemUoKTsKKyAgdm9pZCBzaG9ydF9zdHJpbmcoKTsKKyAgdm9pZCBmaW5kKCk7CisgIHZvaWQgYm9ndXNfZWRnZV9maW5kKCk7CisgIHZvaWQgcmZpbmQoKTsKKyAgdm9pZCBmaW5kX2xhc3Rfb2YoKTsKKyAgdm9pZCBmaW5kX2xhc3Rfbm90X29mKCk7CisgIHZvaWQgY29weSgpOworICB2b2lkIGFzc2lnbigpOworICB2b2lkIG10KCk7CisgIHZvaWQgc2hvcnRfc3RyaW5nX29wdGltX2J1ZygpOworICB2b2lkIGNvbXBhcmUoKTsKKyAgdm9pZCB0ZW1wbGF0ZV9leHByZXNzaW9uKCk7CisgIHZvaWQgdGVfdG1wKCk7CisgIHZvaWQgb3Blcl90bXAoKTsKKyAgdm9pZCB0ZW1wbGF0ZV93ZXhwcmVzc2lvbigpOworICB2b2lkIGlvKCk7CisgIHZvaWQgYWxsb2NhdG9yX3dpdGhfc3RhdGUoKTsKKyAgdm9pZCBjYXBhY2l0eSgpOworICB2b2lkIGNvbmNhdDI0KCk7CisKKyAgc3RhdGljIHN0cmluZyBmdW5jKGNvbnN0IHN0cmluZyYgcGFyKSB7CisgICAgc3RyaW5nIHRtcCggcGFyICk7CisgICAgcmV0dXJuIHRtcDsKKyAgfQorCisjaWYgZGVmaW5lZCAoVVNFX1BUSFJFQURfQVBJKSB8fCBkZWZpbmVkIChVU0VfV0lORE9XU19BUEkpCisjICBpZiBkZWZpbmVkIChVU0VfUFRIUkVBRF9BUEkpCisgIHN0YXRpYyB2b2lkKiBmKHZvaWQqKQorIyAgZWxzZQorICBzdGF0aWMgRFdPUkQgX19zdGRjYWxsIGYodm9pZCopCisjICBlbmRpZgorICB7CisgICAgc3RyaW5nIHMoICJxeXdleXVld3VuZmtIQlVLR1lVR0wsd2VoYllHVVdeKEBUQEghQkFMV0Q6aF4mQCMqQCgjOkpLSFdKOkNORCIgKTsKKworICAgIGZvciAoIGludCBpID0gMDsgaSA8IDIwMDAwMDA7ICsraSApIHsKKyAgICAgIHN0cmluZyBzeCA9IGZ1bmMoIHMgKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKKyAgfQorI2VuZGlmCisKK307CisKK0NQUFVOSVRfVEVTVF9TVUlURV9SRUdJU1RSQVRJT04oU3RyaW5nVGVzdCk7CisKKy8vCisvLyB0ZXN0cyBpbXBsZW1lbnRhdGlvbgorLy8KK3ZvaWQgU3RyaW5nVGVzdDo6Y29uc3RydWN0b3IoKQoreworI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkIChfU1RMUF9VU0VfRVhDRVBUSU9OUykKKyAgdHJ5IHsKKyAgICBzdHJpbmcgcygoc2l6ZV90KS0xLCAnYScpOworICAgIENQUFVOSVRfRkFJTDsKKyAgfQorICBjYXRjaCAobGVuZ3RoX2Vycm9yIGNvbnN0JikgeworICB9CisgIGNhdGNoICguLi4pIHsKKyAgICAvL0V4cGVjdGVkIGV4Y2VwdGlvbiBpcyBsZW5ndGhfZXJyb3I6CisgICAgQ1BQVU5JVF9GQUlMOworICB9CisjZW5kaWYKK30KKwordm9pZCBTdHJpbmdUZXN0Ojp0cml2aWFsX2NoYXJfY29tcGFyZSgpCit7CisgIHN0cmluZyBzKCAibWVzc2FnZSIgKTsKKworICBDUFBVTklUX0NIRUNLKCBzID09ICJtZXNzYWdlIiApOworICBDUFBVTklUX0NIRUNLKCAibWVzc2FnZSIgPT0gcyApOworfQorCit2b2lkIFN0cmluZ1Rlc3Q6OnJlc2VydmUoKQoreworICBzdHJpbmcgczsKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZCAoX1NUTFBfVVNFX0VYQ0VQVElPTlMpCisgIHRyeSB7CisgICAgcy5yZXNlcnZlKHMubWF4X3NpemUoKSArIDEpOworICAgIENQUFVOSVRfRkFJTDsKKyAgfQorICBjYXRjaCAobGVuZ3RoX2Vycm9yIGNvbnN0JikgeworICB9CisgIGNhdGNoICguLi4pIHsKKyAgICAvL0V4cGVjdGVkIGV4Y2VwdGlvbiBpcyBsZW5ndGhfZXJyb3I6CisgICAgQ1BQVU5JVF9GQUlMOworICB9CisjZW5kaWYKK30KKwordm9pZCBTdHJpbmdUZXN0OjptdCgpCit7CisjaWYgZGVmaW5lZCAoVVNFX1BUSFJFQURfQVBJKSB8fCBkZWZpbmVkIChVU0VfV0lORE9XU19BUEkpCisgIGNvbnN0IGludCBudGggPSAyOworIyAgaWYgZGVmaW5lZCAoVVNFX1BUSFJFQURfQVBJKQorICBwdGhyZWFkX3QgdFtudGhdOworCisgIGZvciAoIGludCBpID0gMDsgaSA8IG50aDsgKytpICkgeworICAgIHB0aHJlYWRfY3JlYXRlKCAmdFtpXSwgMCwgZiwgMCApOworICB9CisKKyAgZm9yICggaW50IGkgPSAwOyBpIDwgbnRoOyArK2kgKSB7CisgICAgcHRocmVhZF9qb2luKCB0W2ldLCAwICk7CisgIH0KKyMgIGVuZGlmIC8vIFBUSFJFQUQKKworIyAgaWYgZGVmaW5lZCAoVVNFX1dJTkRPV1NfQVBJKQorICAvL0RXT1JEIHN0YXJ0ID0gR2V0VGlja0NvdW50KCk7CisKKyAgSEFORExFIHRbbnRoXTsKKworICBpbnQgaTsgLy8gVkM2IG5vdCBzdXBwb3J0IGluLWxvb3Agc2NvcGUgb2YgY3ljbGUgdmFyCisgIGZvciAoIGkgPSAwOyBpIDwgbnRoOyArK2kgKSB7CisgICAgdFtpXSA9IENyZWF0ZVRocmVhZChOVUxMLCAwLCBmLCAwLCAwLCBOVUxMKTsKKyAgfQorCisgIGlmIChXYWl0Rm9yTXVsdGlwbGVPYmplY3RzKG50aCwgdCwgVFJVRSwgSU5GSU5JVEUpID09IFdBSVRfRkFJTEVEKSB7CisgICAgLy8gT24gc29tZSBwbGF0Zm9ybXMgKGV2YzMvZXZjNCkgV2FpdEZvck11bHRpcGxlT2JqZWN0cygpIHdpdGggZldhaXRBbGwgPT0gVFJVRQorICAgIC8vIGlzIG5vdCBzdXBwb3J0ZWQuIFdlIHRoZW4gd2FpdCB3aXRoIGEgbG9vcCBvbiBlYWNoIHRocmVhZDoKKyAgICBmb3IgKCBpID0gMDsgaSA8IG50aDsgKytpICkgeworICAgICAgV2FpdEZvclNpbmdsZU9iamVjdCh0W2ldLCBJTkZJTklURSk7CisgICAgfQorICB9CisKKyAgLyoKKyAgRFdPUkQgZHVyYXRpb24gPSBHZXRUaWNrQ291bnQoKSAtIHN0YXJ0OworICBvc3RyaW5nc3RyZWFtIG9zdHI7CisgIG9zdHIgPDwgIkR1cmF0aW9uOiAiIDw8IGR1cmF0aW9uIDw8IGVuZGw7CisgIENQUFVOSVRfTUVTU0FHRShvc3RyLnN0cigpLmNfc3RyKCkpOworICAqLworIyAgZW5kaWYKKyNlbmRpZgorfQorCit2b2lkIFN0cmluZ1Rlc3Q6OnNob3J0X3N0cmluZygpCit7CisgIHN0cmluZyBjb25zdCByZWZfc2hvcnRfc3RyMSgic3RyMSIpLCByZWZfc2hvcnRfc3RyMigic3RyMiIpOworICBzdHJpbmcgc2hvcnRfc3RyMShyZWZfc2hvcnRfc3RyMSksIHNob3J0X3N0cjIocmVmX3Nob3J0X3N0cjIpOworICBzdHJpbmcgY29uc3QgcmVmX2xvbmdfc3RyMSgic3RyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIik7CisgIHN0cmluZyBjb25zdCByZWZfbG9uZ19zdHIyKCJzdHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIiKTsKKyAgc3RyaW5nIGxvbmdfc3RyMShyZWZfbG9uZ19zdHIxKSwgbG9uZ19zdHIyKHJlZl9sb25nX3N0cjIpOworCisgIENQUFVOSVRfQVNTRVJUKHNob3J0X3N0cjEgPT0gcmVmX3Nob3J0X3N0cjEpOworICBDUFBVTklUX0FTU0VSVChsb25nX3N0cjEgPT0gcmVmX2xvbmdfc3RyMSk7CisKKyAgeworICAgIHN0cmluZyBzdHIxKHNob3J0X3N0cjEpOworICAgIHN0cjEgPSBsb25nX3N0cjE7CisgICAgQ1BQVU5JVF9BU1NFUlQoc3RyMSA9PSByZWZfbG9uZ19zdHIxKTsKKyAgfQorCisgIHsKKyAgICBzdHJpbmcgc3RyMShsb25nX3N0cjEpOworICAgIHN0cjEgPSBzaG9ydF9zdHIxOworICAgIENQUFVOSVRfQVNTRVJUKHN0cjEgPT0gcmVmX3Nob3J0X3N0cjEpOworICB9CisKKyAgeworICAgIHNob3J0X3N0cjEuc3dhcChzaG9ydF9zdHIyKTsKKyAgICBDUFBVTklUX0FTU0VSVCgoc2hvcnRfc3RyMSA9PSByZWZfc2hvcnRfc3RyMikgJiYgKHNob3J0X3N0cjIgPT0gcmVmX3Nob3J0X3N0cjEpKTsKKyAgICBzaG9ydF9zdHIxLnN3YXAoc2hvcnRfc3RyMik7CisgIH0KKworICB7CisgICAgbG9uZ19zdHIxLnN3YXAobG9uZ19zdHIyKTsKKyAgICBDUFBVTklUX0FTU0VSVCgobG9uZ19zdHIxID09IHJlZl9sb25nX3N0cjIpICYmIChsb25nX3N0cjIgPT0gcmVmX2xvbmdfc3RyMSkpOworICAgIGxvbmdfc3RyMS5zd2FwKGxvbmdfc3RyMik7CisgIH0KKworICB7CisgICAgc2hvcnRfc3RyMS5zd2FwKGxvbmdfc3RyMSk7CisgICAgQ1BQVU5JVF9BU1NFUlQoKHNob3J0X3N0cjEgPT0gcmVmX2xvbmdfc3RyMSkgJiYgKGxvbmdfc3RyMSA9PSByZWZfc2hvcnRfc3RyMSkpOworICAgIHNob3J0X3N0cjEuc3dhcChsb25nX3N0cjEpOworICB9CisKKyAgeworICAgIGxvbmdfc3RyMS5zd2FwKHNob3J0X3N0cjEpOworICAgIENQUFVOSVRfQVNTRVJUKChzaG9ydF9zdHIxID09IHJlZl9sb25nX3N0cjEpICYmIChsb25nX3N0cjEgPT0gcmVmX3Nob3J0X3N0cjEpKTsKKyAgICBsb25nX3N0cjEuc3dhcChzaG9ydF9zdHIxKTsKKyAgfQorCisgIHsKKyAgICBzdHJpbmcgYSgyNTYsICdhJyk7CisgICAgc3RyaW5nIGIoMjU2LCAnYicpOworICAgIGNvbnN0IGNoYXIqIGFzID0gYS5jX3N0cigpOworICAgIGNvbnN0IGNoYXIqIGJzID0gYi5jX3N0cigpOworICAgIHN3YXAoYSwgYik7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGEuY19zdHIoKSA9PSBicyApOworICAgIENQUFVOSVRfQVNTRVJUKCBiLmNfc3RyKCkgPT0gYXMgKTsKKyAgfQorCisgIHsKKyAgICAvL1RoaXMgaXMgdG8gdGVzdCBtb3ZlIGNvbnN0cnVjdG9yCisgICAgdmVjdG9yPHN0cmluZz4gc3RyX3ZlY3Q7CisgICAgc3RyX3ZlY3QucHVzaF9iYWNrKHNob3J0X3N0cjEpOworICAgIHN0cl92ZWN0LnB1c2hfYmFjayhsb25nX3N0cjEpOworICAgIHN0cl92ZWN0LnB1c2hfYmFjayhzaG9ydF9zdHIyKTsKKyAgICBzdHJfdmVjdC5wdXNoX2JhY2sobG9uZ19zdHIyKTsKKyAgICBDUFBVTklUX0FTU0VSVCgoc3RyX3ZlY3RbMF0gPT0gcmVmX3Nob3J0X3N0cjEpICYmCisgICAgICAgICAgICAgICAgICAgKHN0cl92ZWN0WzFdID09IHJlZl9sb25nX3N0cjEpICYmCisgICAgICAgICAgICAgICAgICAgKHN0cl92ZWN0WzJdID09IHJlZl9zaG9ydF9zdHIyKSAmJgorICAgICAgICAgICAgICAgICAgIChzdHJfdmVjdFszXSA9PSByZWZfbG9uZ19zdHIyKSk7CisgIH0KK30KKwordm9pZCBTdHJpbmdUZXN0OjplcmFzZSgpCit7CisgIGNoYXIgY29uc3QqIGNfc3RyID0gIkhlbGxvLCBXb3JsZCEiOworICBzdHJpbmcgc3RyKGNfc3RyKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHN0ciA9PSBjX3N0ciApOworCisgIHN0ci5lcmFzZShzdHIuYmVnaW4oKSArIDEsIHN0ci5lbmQoKSAtIDEpOyAvLyBFcmFzZSBhbGwgYnV0IGZpcnN0IGFuZCBsYXN0LgorCisgIHNpemVfdCBpOworICBmb3IgKGkgPSAwOyBpIDwgc3RyLnNpemUoKTsgKytpKSB7CisgICAgc3dpdGNoICggaSApIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgQ1BQVU5JVF9BU1NFUlQoIHN0cltpXSA9PSAnSCcgKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDE6CisgICAgICAgIENQUFVOSVRfQVNTRVJUKCBzdHJbaV0gPT0gJyEnICk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgQ1BQVU5JVF9GQUlMOworICAgIH0KKyAgfQorCisgIHN0ci5pbnNlcnQoMSwgY19zdHIpOworICBzdHIuZXJhc2Uoc3RyLmJlZ2luKCkpOyAvLyBFcmFzZSBmaXJzdCBlbGVtZW50LgorICBzdHIuZXJhc2Uoc3RyLmVuZCgpIC0gMSk7IC8vIEVyYXNlIGxhc3QgZWxlbWVudC4KKyAgQ1BQVU5JVF9BU1NFUlQoIHN0ciA9PSBjX3N0ciApOworICBzdHIuY2xlYXIoKTsgLy8gRXJhc2UgYWxsLgorICBDUFBVTklUX0FTU0VSVCggc3RyLmVtcHR5KCkgKTsKKworICBzdHIgPSBjX3N0cjsKKyAgQ1BQVU5JVF9BU1NFUlQoIHN0ciA9PSBjX3N0ciApOworCisgIHN0ci5lcmFzZSgxLCBzdHIuc2l6ZSgpIC0gMSk7IC8vIEVyYXNlIGFsbCBidXQgZmlyc3QgYW5kIGxhc3QuCisgIGZvciAoaSA9IDA7IGkgPCBzdHIuc2l6ZSgpOyBpKyspIHsKKyAgICBzd2l0Y2ggKCBpICkgeworICAgICAgY2FzZSAwOgorICAgICAgICBDUFBVTklUX0FTU0VSVCggc3RyW2ldID09ICdIJyApOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgQ1BQVU5JVF9BU1NFUlQoIHN0cltpXSA9PSAnIScgKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBDUFBVTklUX0ZBSUw7CisgICAgfQorICB9CisKKyAgc3RyLmVyYXNlKDEpOworICBDUFBVTklUX0FTU0VSVCggc3RyID09ICJIIiApOworfQorCit2b2lkIFN0cmluZ1Rlc3Q6OmRhdGEoKQoreworICBzdHJpbmcgeHg7CisKKyAgQ1BQVU5JVF9BU1NFUlQoIHh4LmRhdGEoKSAhPSAwICk7ICAvLyBJU08tSUVDLTE0ODgyOjE5OTgoRSksIDIxLjMuNiwgcGFyYWdyYXBoIDMKKyNpZiAwCisgIC8qIFRoaXMgdGVzdCByZWFsbHkgbm90IHJlcXVpcmVkOiBpbiBJU08tSUVDLTE0ODgyOjE5OTgoRSkgcGFyYWdyYXBoIDMgc3RhdGVkOgorICAgKiAnLi4uIGFuZCBjYW4gaGF2ZSB6ZXJvIGFkZGVkIHRvIGl0JywgYWdhaW46ICdDQU4nLCBidXQgbm90ICdNVVNUJy4KKyAgICogVGhhdCdzIHdoeSBJIGFtIGNvbW1lbnQgdGhpcyB0ZXN0LiBCdXQgSSBkb24ndCByZW1vdmUgaXQgZHVlIHRvIEkgaGFkCisgICAqIHVuZXZpZGVudCBwcm9ibGVtIHdpdGggbWlzaW50ZXJwcmV0YXRpb24gb2YgZGF0YSgpIHJldHVybiAoaS5lLiBkYXRhKCkKKyAgICogYW5kIGNfc3RyKCkgcHJvdmlkZSBkaWZmZXJlbnQgZnVuY3Rpb25hbGl0eSEpIGFuZCBleHBlY3QgdGhhdCB0aGlzIGlzCisgICAqIG1vcmUtb3ItbGVzcyBjb21tb24gcGl0ZmFsbC4KKyAgICogICAgLSBwdHIKKyAgICovCisgIHN0cmluZyBsb3coICIyMDA0LTAxLTAxIiApOworICAvLyBCbG9ja3MgQSBhbmQgQiBzaG91bGQgZm9sbG93IGVhY2ggb3RoZXIuCisgIC8vIEJsb2NrIEE6CisgIHh4ID0gIjEyMzQ1NiI7CisgIHh4ICs9IGxvdzsKKyAgaWYgKCBzdHJjbXAoIHh4LmRhdGEoKSwgIjEyMzQ1NjIwMDQtMDEtMDEiICkgIT0gMCApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgLy8gRW5kIG9mIGJsb2NrIEEKKworICAvLyBCbG9jayBCOgorICB4eCA9ICIxMjM0IjsKKyAgeHggKz0gIjsiOworCisgIGlmICggc3RyY21wKCB4eC5kYXRhKCksICIxMjM0OyIgKSAhPSAwICkgeworICAgIHJldHVybiAtMTsKKyAgfQorICAvLyBFbmQgb2YgYmxvY2sgQgorI2VuZGlmCit9CisKK3ZvaWQgU3RyaW5nVGVzdDo6Y19zdHIoKQoreworICBzdHJpbmcgbG93KCAiMjAwNC0wMS0wMSIgKTsKKyAgc3RyaW5nIHh4OworICBzdHJpbmcgeXk7CisKKyAgQ1BQVU5JVF9BU1NFUlQoICooeXkuY19zdHIoKSkgPT0gJ1wwJyApOyAvLyBJU08tSUVDLTE0ODgyOjE5OTgoRSksIDIxLjMuNiwgcGFyYWdyYXBoIDEKKworICAvLyBCbG9ja3MgQSBhbmQgQiBzaG91bGQgZm9sbG93IGVhY2ggb3RoZXIuCisgIC8vIEJsb2NrIEE6CisgIHh4ID0gIjEyMzQ1NiI7CisgIHh4ICs9IGxvdzsKKyAgQ1BQVU5JVF9BU1NFUlQoIHN0cmNtcCggeHguY19zdHIoKSwgIjEyMzQ1NjIwMDQtMDEtMDEiICkgPT0gMCApOworICAvLyBFbmQgb2YgYmxvY2sgQQorCisgIC8vIEJsb2NrIEI6CisgIHh4ID0gIjEyMzQiOworICB4eCArPSAiOyI7CisgIENQUFVOSVRfQVNTRVJUKCBzdHJjbXAoIHh4LmNfc3RyKCksICIxMjM0OyIgKSA9PSAwICk7CisgIC8vIEVuZCBvZiBibG9jayBCCit9CisKK3ZvaWQgU3RyaW5nVGVzdDo6bnVsbF9jaGFyKCkKK3sKKyAgLy8gSVNPL0lFQyAxNDg4MjoxOTk4KEUpLCBJU08vSUVDIDE0ODgyOjIwMDMoRSksIDIxLjMuNCAoJy4uLiB0aGUgY29uc3QgdmVyc2lvbicpCisgIGNvbnN0IHN0cmluZyBzKCAiMTIzNDU2IiApOworCisgIENQUFVOSVRfQ0hFQ0soIHNbcy5zaXplKCldID09ICdcMCcgKTsKKworI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkIChfU1RMUF9VU0VfRVhDRVBUSU9OUykKKyAgdHJ5IHsKKyAgICAvL0NoZWNrIGlzIG9ubHkgaGVyZSB0byBhdm9pZCB3YXJuaW5nIGFib3V0IHZhbHVlIG9mIGV4cHJlc3Npb24gbm90IHVzZWQKKyAgICBDUFBVTklUX0NIRUNLKCBzLmF0KHMuc2l6ZSgpKSA9PSAnXDAnICk7CisgICAgQ1BQVU5JVF9GQUlMOworICB9CisgIGNhdGNoIChvdXRfb2ZfcmFuZ2UgY29uc3QmKSB7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHRydWUgKTsKKyAgfQorICBjYXRjaCAoIC4uLiApIHsKKyAgICBDUFBVTklUX0ZBSUw7CisgIH0KKyNlbmRpZgorfQorCit2b2lkIFN0cmluZ1Rlc3Q6Omluc2VydCgpCit7CisgIHN0cmluZyBzdHJvcmcgPSAiVGhpcyBpcyB0ZXN0IHN0cmluZyBmb3Igc3RyaW5nIGNhbGxzIjsKKyAgc3RyaW5nIHN0cjsKKyAgLyoKKyAgICogSW4gY2FzZSBvZiByZWFsbG9jYXRpb24gdGhlcmUgaXMgbm8gYXV0byByZWZlcmVuY2UgcHJvYmxlbQorICAgKiBzbyB3ZSByZXNlcnZlIGEgYmlnIGVub3VnaCBzdHJpbmcgdG8gYmUgc3VyZSB0byB0ZXN0IHRoaXMKKyAgICogcGFydGljdWxhciBwb2ludC4KKyAgICovCisgIHN0ci5yZXNlcnZlKDEwMCk7CisgIHN0ciA9IHN0cm9yZzsKKworICAvL3Rlc3Qgc2VsZiBpbnNlcnRpb246CisgIHN0ci5pbnNlcnQoMTAsIHN0ci5jX3N0cigpICsgNSwgMTUpOworICBDUFBVTklUX0FTU0VSVCggc3RyID09ICJUaGlzIGlzIHRlaXMgdGVzdCBzdHJpbmcgc3Qgc3RyaW5nIGZvciBzdHJpbmcgY2FsbHMiICk7CisKKyAgc3RyID0gc3Ryb3JnOworICBzdHIuaW5zZXJ0KDE1LCBzdHIuY19zdHIoKSArIDUsIDI1KTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHN0ciA9PSAiVGhpcyBpcyB0ZXN0IHN0aXMgdGVzdCBzdHJpbmcgZm9yIHN0cmluZ3JpbmcgZm9yIHN0cmluZyBjYWxscyIgKTsKKworICBzdHIgPSBzdHJvcmc7CisgIHN0ci5pbnNlcnQoMCwgc3RyLmNfc3RyKCkgKyBzdHIuc2l6ZSgpIC0gNCwgNCk7CisgIENQUFVOSVRfQVNTRVJUKCBzdHIgPT0gImFsbHNUaGlzIGlzIHRlc3Qgc3RyaW5nIGZvciBzdHJpbmcgY2FsbHMiICk7CisKKyAgc3RyID0gc3Ryb3JnOworICBzdHIuaW5zZXJ0KDAsIHN0ci5jX3N0cigpICsgc3RyLnNpemUoKSAvIDIgLSAxLCBzdHIuc2l6ZSgpIC8gMiArIDEpOworICBDUFBVTklUX0FTU0VSVCggc3RyID09ICJuZyBmb3Igc3RyaW5nIGNhbGxzVGhpcyBpcyB0ZXN0IHN0cmluZyBmb3Igc3RyaW5nIGNhbGxzIiApOworCisgIHN0ciA9IHN0cm9yZzsKKyAgc3RyaW5nOjppdGVyYXRvciBiID0gc3RyLmJlZ2luKCk7CisgIHN0cmluZzo6Y29uc3RfaXRlcmF0b3IgcyA9IHN0ci5iZWdpbigpICsgc3RyLnNpemUoKSAvIDIgLSAxOworICBzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIGUgPSBzdHIuZW5kKCk7CisgIHN0ci5pbnNlcnQoIGIsIHMsIGUgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHN0ciA9PSAibmcgZm9yIHN0cmluZyBjYWxsc1RoaXMgaXMgdGVzdCBzdHJpbmcgZm9yIHN0cmluZyBjYWxscyIgKTsKKworICBzdHIgPSBzdHJvcmc7CisgIHN0ci5pbnNlcnQoc3RyLmJlZ2luKCksIHN0ci5iZWdpbigpICsgc3RyLnNpemUoKSAvIDIgLSAxLCBzdHIuZW5kKCkpOworICBDUFBVTklUX0FTU0VSVCggc3RyID09ICJuZyBmb3Igc3RyaW5nIGNhbGxzVGhpcyBpcyB0ZXN0IHN0cmluZyBmb3Igc3RyaW5nIGNhbGxzIiApOworCisjaWZkZWYgX1NUTFBfTUVNQkVSX1RFTVBMQVRFUworICB2ZWN0b3I8aW50PiBpbnRfdmVjdDsKKyAgLy9KdXN0IGEgY29tcGlsZSB0aW1lIHRlc3Q6CisgIHN0ci5pbnNlcnQoc3RyLmVuZCgpLCBpbnRfdmVjdC5iZWdpbigpLCBpbnRfdmVjdC5lbmQoKSk7CisjZW5kaWYKKworICBzdHJpbmcgc3RyMDsKKyAgc3RyMC5pbnNlcnQoc3RyMC5iZWdpbigpLCA1LCAnMCcpOworICBDUFBVTklUX0FTU0VSVCggc3RyMCA9PSAiMDAwMDAiICk7CisKKyAgc3RyaW5nIHN0cjE7CisgIHsKKyAgICBzdHJpbmc6OnNpemVfdHlwZSBwb3MgPSAwLCBuYiA9IDI7CisgICAgc3RyMS5pbnNlcnQocG9zLCBuYiwgJzEnKTsKKyAgfQorICBDUFBVTklUX0FTU0VSVCggc3RyMSA9PSAiMTEiICk7CisKKyAgc3RyMC5pbnNlcnQoMCwgc3RyMSk7CisgIENQUFVOSVRfQVNTRVJUKCBzdHIwID09ICIxMTAwMDAwIiApOworCisgIHN0cmluZyBzdHIyKCIyMzQ1Iik7CisgIHN0cjAuaW5zZXJ0KHN0cjAuc2l6ZSgpLCBzdHIyLCAxLCAyKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHN0cjAgPT0gIjExMDAwMDAzNCIgKTsKKworICBzdHIxLmluc2VydChzdHIxLmJlZ2luKCkgKyAxLCAyLCAnMicpOworICBDUFBVTklUX0FTU0VSVCggc3RyMSA9PSAiMTIyMSIgKTsKKworICBzdHIxLmluc2VydCgyLCAiMzMzMzMzIiwgMyk7CisgIENQUFVOSVRfQVNTRVJUKCBzdHIxID09ICIxMjMzMzIxIiApOworCisgIHN0cjEuaW5zZXJ0KDQsICI0NDQ0Iik7CisgIENQUFVOSVRfQVNTRVJUKCBzdHIxID09ICIxMjMzNDQ0NDMyMSIgKTsKKworICBzdHIxLmluc2VydChzdHIxLmJlZ2luKCkgKyA2LCAnNScpOworICBDUFBVTklUX0FTU0VSVCggc3RyMSA9PSAiMTIzMzQ0NTQ0MzIxIiApOworfQorCit2b2lkIFN0cmluZ1Rlc3Q6OnJlcGxhY2UoKQoreworICAvKgorICAgKiBUaGlzIHRlc3QgY2FzZSBpcyBmb3IgdGhlIG5vbiB0ZW1wbGF0ZSBiYXNpY19zdHJpbmc6OnJlcGxhY2UgbWV0aG9kLAorICAgKiB0aGlzIGlzIHdoeSB3ZSBwbGF5IHdpdGggdGhlIGNvbnN0IGl0ZXJhdG9ycyBhbmQgcmVmZXJlbmNlIHRvIGd1YXJhbnR5CisgICAqIHRoYXQgdGhlIHJpZ2h0IG1ldGhvZCBpcyBjYWxsZWQuCisgICAqLworICBjb25zdCBzdHJpbmcgdiggIjc4IiApOworICBzdHJpbmcgcyggIjEyMzQ1NiIgKTsKKyAgc3RyaW5nIGNvbnN0JiBjcyA9IHM7CisKKyAgc3RyaW5nOjppdGVyYXRvciBpID0gcy5iZWdpbigpICsgMTsKKyAgcy5yZXBsYWNlKGksIGkgKyAzLCB2LmJlZ2luKCksIHYuZW5kKCkpOworICBDUFBVTklUX0FTU0VSVCggcyA9PSAiMTc4NTYiICk7CisKKyAgcyA9ICIxMjM0NTYiOworICBpID0gcy5iZWdpbigpICsgMTsKKyAgcy5yZXBsYWNlKGksIGkgKyAxLCB2LmJlZ2luKCksIHYuZW5kKCkpOworICBDUFBVTklUX0FTU0VSVCggcyA9PSAiMTc4MzQ1NiIgKTsKKworICBzID0gIjEyMzQ1NiI7CisgIGkgPSBzLmJlZ2luKCkgKyAxOworICBzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIGNpID0gcy5iZWdpbigpICsgMTsKKyAgcy5yZXBsYWNlKGksIGkgKyAzLCBjaSArIDMsIGNzLmVuZCgpKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHMgPT0gIjE1NjU2IiApOworCisgIHMgPSAiMTIzNDU2IjsKKyAgaSA9IHMuYmVnaW4oKSArIDE7CisgIGNpID0gcy5iZWdpbigpICsgMTsKKyAgcy5yZXBsYWNlKGksIGkgKyAzLCBjaSwgY2kgKyAyKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHMgPT0gIjEyMzU2IiApOworCisgIHMgPSAiMTIzNDU2IjsKKyAgaSA9IHMuYmVnaW4oKSArIDE7CisgIGNpID0gcy5iZWdpbigpICsgMTsKKyAgcy5yZXBsYWNlKGksIGkgKyAzLCBjaSArIDEsIGNzLmVuZCgpKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHMgPT0gIjEzNDU2NTYiICk7CisKKyAgcyA9ICIxMjM0NTYiOworICBpID0gcy5iZWdpbigpOworICBjaSA9IHMuYmVnaW4oKSArIDE7CisgIHMucmVwbGFjZShpLCBpLCBjaSwgY2kgKyAxKTsKKyAgQ1BQVU5JVF9DSEVDSyggcyA9PSAiMjEyMzQ1NiIgKTsKKworICBzID0gIjEyMzQ1NiI7CisgIHMucmVwbGFjZShzLmJlZ2luKCkgKyA0LCBzLmVuZCgpLCBjcy5iZWdpbigpLCBjcy5lbmQoKSk7CisgIENQUFVOSVRfQVNTRVJUKCBzID09ICIxMjM0MTIzNDU2IiApOworCisgIC8qCisgICAqIFRoaXMgaXMgdGhlIHRlc3QgZm9yIHRoZSB0ZW1wbGF0ZSByZXBsYWNlIG1ldGhvZC4KKyAgICovCisgIHMgPSAiMTIzNDU2IjsKKyAgc3RyaW5nOjppdGVyYXRvciBiID0gcy5iZWdpbigpICsgNDsKKyAgc3RyaW5nOjppdGVyYXRvciBlID0gcy5lbmQoKTsKKyAgc3RyaW5nOjpjb25zdF9pdGVyYXRvciByYiA9IHMuYmVnaW4oKTsKKyAgc3RyaW5nOjpjb25zdF9pdGVyYXRvciByZSA9IHMuZW5kKCk7CisgIHMucmVwbGFjZShiLCBlLCByYiwgcmUpOworICBDUFBVTklUX0FTU0VSVCggcyA9PSAiMTIzNDEyMzQ1NiIgKTsKKworICBzID0gIjEyMzQ1NiI7CisgIHMucmVwbGFjZShzLmJlZ2luKCkgKyA0LCBzLmVuZCgpLCBzLmJlZ2luKCksIHMuZW5kKCkpOworICBDUFBVTklUX0FTU0VSVCggcyA9PSAiMTIzNDEyMzQ1NiIgKTsKKworICBzdHJpbmcgc3Ryb3JnKCJUaGlzIGlzIHRlc3Qgc3RyaW5nIGZvciBzdHJpbmcgY2FsbHMiKTsKKyAgc3RyaW5nIHN0ciA9IHN0cm9yZzsKKyAgc3RyLnJlcGxhY2UoNSwgMTUsIHN0ci5jX3N0cigpLCAxMCk7CisgIENQUFVOSVRfQVNTRVJUKCBzdHIgPT0gIlRoaXMgVGhpcyBpcyB0ZWZvciBzdHJpbmcgY2FsbHMiICk7CisKKyAgc3RyID0gc3Ryb3JnOworICBzdHIucmVwbGFjZSg1LCA1LCBzdHIuY19zdHIoKSwgMTApOworICBDUFBVTklUX0FTU0VSVCggc3RyID09ICJUaGlzIFRoaXMgaXMgdGVzdCBzdHJpbmcgZm9yIHN0cmluZyBjYWxscyIgKTsKKworI2lmIChkZWZpbmVkIChTVExQT1JUKSAmJiBkZWZpbmVkKF9TVExQX01FTUJFUl9URU1QTEFURVMpKSB8fCAoICFkZWZpbmVkIChTVExQT1JUKSAmJiAhZGVmaW5lZChfX0dOVUNfXykgKQorICBkZXF1ZTxjaGFyPiBjZGVxdWU7CisgIGNkZXF1ZS5wdXNoX2JhY2soJ0knKTsKKyAgc3RyLnJlcGxhY2Uoc3RyLmJlZ2luKCksIHN0ci5iZWdpbigpICsgMTEsIGNkZXF1ZS5iZWdpbigpLCBjZGVxdWUuZW5kKCkpOworICBDUFBVTklUX0FTU0VSVCggc3RyID09ICJJcyB0ZXN0IHN0cmluZyBmb3Igc3RyaW5nIGNhbGxzIiApOworI2VuZGlmCit9CisKK3ZvaWQgU3RyaW5nVGVzdDo6cmVzaXplKCkKK3sKKyAgc3RyaW5nIHM7CisKKyAgcy5yZXNpemUoMCk7CisKKyAgQ1BQVU5JVF9BU1NFUlQoICpzLmNfc3RyKCkgPT0gMCApOworCisgIHMgPSAiMTIzNDU2NyI7CisKKyAgcy5yZXNpemUoMCk7CisgIENQUFVOSVRfQVNTRVJUKCAqcy5jX3N0cigpID09IDAgKTsKKworICBzID0gIjEyMzQ1NjciOworICBzLnJlc2l6ZSgxKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHMuc2l6ZSgpID09IDEgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoICpzLmNfc3RyKCkgPT0gJzEnICk7CisgIENQUFVOSVRfQVNTRVJUKCAqKHMuY19zdHIoKSArIDEpID09IDAgKTsKKworICBzID0gIjEyMzQ1NjciOworICBzLnJlc2l6ZSgxMCk7CisgIENQUFVOSVRfQVNTRVJUKCBzLnNpemUoKSA9PSAxMCApOworICBDUFBVTklUX0FTU0VSVCggc1s2XSA9PSAnNycgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHNbN10gPT0gMCApOworICBDUFBVTklUX0FTU0VSVCggc1s4XSA9PSAwICk7CisgIENQUFVOSVRfQVNTRVJUKCBzWzldID09IDAgKTsKK30KKwordm9pZCBTdHJpbmdUZXN0OjpmaW5kKCkKK3sKKyAgc3RyaW5nIHMoIm9uZSB0d28gdGhyZWUgb25lIHR3byB0aHJlZSIpOworICBDUFBVTklUX0FTU0VSVCggcy5maW5kKCJvbmUiKSA9PSAwICk7CisgIENQUFVOSVRfQVNTRVJUKCBzLmZpbmQoJ3QnKSA9PSA0ICk7CisgIENQUFVOSVRfQVNTRVJUKCBzLmZpbmQoJ3QnLCA1KSA9PSA4ICk7CisgIC8vV2UgYXJlIHRyeWluZyB0byBnZXQgYSBjb25zdCByZWZlcmVuY2UgdG8gdGhlIG5wb3Mgc3RyaW5nIHN0YXRpYyBtZW1iZXIgdG8KKyAgLy9mb3JjZSB0aGUgY29tcGlsZXIgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHZhcmlhYmxlLiBJdCBpcyB1c2VkIHRvIHJldmVhbAorICAvL2EgYnVnIG9mIFNUTHBvcnQgd2hpY2ggd2FzIHNpbXBseSBkZWNsYXJpbmcgbnBvcyB3aXRob3V0IGluc3RhbmNpYXRpbmcgaXQuCisjaWYgZGVmaW5lZCAoU1RMUE9SVCkgJiYgZGVmaW5lZCAoX1NUTFBfU1RBVElDX0NPTlNUX0lOSVRfQlVHKQorICBzdHJpbmc6OnNpemVfdHlwZSBjb25zdCYgbnBvc19sb2NhbCA9IHN0cmluZzo6bnBvczsKKyNlbHNlCisjICBkZWZpbmUgbnBvc19sb2NhbCBzdHJpbmc6Om5wb3MKKyNlbmRpZgorICBDUFBVTklUX0FTU0VSVCggcy5maW5kKCJmb3VyIikgPT0gbnBvc19sb2NhbCApOworICBDUFBVTklUX0FTU0VSVCggcy5maW5kKCJvbmUiLCBzdHJpbmc6Om5wb3MpID09IG5wb3NfbG9jYWwgKTsKKworICBDUFBVTklUX0FTU0VSVCggcy5maW5kX2ZpcnN0X29mKCJhYmNkZSIpID09IDIgKTsKKworICBDUFBVTklUX0FTU0VSVCggcy5maW5kX2ZpcnN0X25vdF9vZigiZW5vdHcgIikgPT0gOSApOworCisgIHN0cmluZyBlbXB0eTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHMuc3Vic3RyKHMuZmluZChlbXB0eSksIGVtcHR5LnNpemUoKSkgPT0gZW1wdHkgKTsKK30KKwordm9pZCBTdHJpbmdUZXN0Ojpib2d1c19lZGdlX2ZpbmQoKQoreworICAvKiBJU08vSUVDIDE0ODgyIDIwMDMsIDIxLjMuNi4xIGJhc2ljX3N0cmluZzo6ZmluZCBbbGliLnN0cmluZzo6ZmluZF0KKyAgICoKKyAgICogc2l6ZV90eXBlIGZpbmQoY29uc3QgYmFzaWNfc3RyaW5nPGNoYXJULHRyYWl0cyxBbGxvY2F0b3I+JiBzdHIsCisgICAqICAgICAgICAgICAgICAgIHNpemVfdHlwZSBwb3MgPSAwKSBjb25zdDsKKyAgICogRWZmZWN0czogRGV0ZXJtaW5lcyB0aGUgbG93ZXN0IHBvc2l0aW9uIHhwb3MsIGlmIHBvc3NpYmxlLCBzdWNoIHRoYXQKKyAgICogYm90aCBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgb2J0YWluOgorICAgKiAgICBwb3MgPD0geHBvcyBhbmQgeHBvcyArIHN0ci5zaXplKCkgPD0gc2l6ZSgpOworICAgKiAgICBhdCh4cG9zK0kpID09IHN0ci5hdChJKSBmb3IgYWxsIGVsZW1lbnRzIEkgb2YgdGhlIHN0cmluZyBjb250cm9sbGVkIGJ5IHN0ci4KKyAgICogUmV0dXJuczogeHBvcyBpZiB0aGUgZnVuY3Rpb24gY2FuIGRldGVybWluZSBzdWNoIGEgdmFsdWUgZm9yIHhwb3MuIE90aGVyd2lzZSwKKyAgICogcmV0dXJucyBucG9zLgorICAgKiBOb3RlczogVXNlcyB0cmFpdHM6OmVxKCkuCisgICAqCisgICAqID09PQorICAgKiBTbywgZnJvbSBmb3JtYWwgcG9pbnQgb2YgdmlldyAKKyAgICogICBzdHJpbmcgczsgc3RyaW5nOjpzaXplX3R5cGUgcCA9IHMuZmluZCggIiIsIDAsIDAgKTsKKyAgICogc2hvdWxkIHJldHVybiAwIGluIHAsIGkuZS4gcG9zaXRpb24gb3V0LW9mLWJvdW5kIG9mIHN0cmluZywgc28gCisgICAqIGNvZGUgbGlrZSBmb2xsb3dpbmcgaXMgYmFkOgorICAgKiBzdHJpbmcgczsgCisgICAqICAKKyAgICogc3RyaW5nOjpzaXplX3R5cGUgcCA9IHMuZmluZCggIiIsIDAsIDAgKTsgCisgICAqCisgICAqIC4uLiAKKyAgICoKKyAgICogaWYgKCBwICE9IHN0cmluZzo6bnBvcyApIHsgLy8gbm9ybWFsIAorICAgKiAgIGNoYXIgY2ggPSBzW3BdOyAvLyBBcmdoaGhoaGhoaGhoIAorICAgKiB9CisgICAqCisgICAqIFBlb3BsZSBuZWFyIFN0YW5kYXJkIGNvbW1ldGUgaGFzIG9waW5pb24gb3Bwb3NpdGUgdG8gbXkuIEV2ZW4gaWYgaXQgbG9va3MKKyAgICogbGlrZSBib2d1cyBiZWhhdmlvdXIgZm9yIG1lLCBpdCBzaG91bGQgYmUgZml4ZWQuCisgICAqLworCisgIHsKKyAgICBzdHJpbmcgczsKKyAgICBzdHJpbmc6OnNpemVfdHlwZSBwID0gcy5maW5kKCAiIiwgMCwgMCApOworCisgICAgLyogQ1BQVU5JVF9DSEVDSyggcCA9PSBzdHJpbmc6Om5wb3MgKTsgKi8KKyAgICBDUFBVTklUX0NIRUNLKCBwID09IDAgKTsgLy8gYm9ndXMgcmVzdWx0LCBpc24ndCBpdD8KKyAgfQorICB7CisgICAgc3RyaW5nIHMoICIxMjMiICk7CisgICAgc3RyaW5nOjpzaXplX3R5cGUgcCA9IHMuZmluZCggIiIsIDAsIDAgKTsKKworICAgIENQUFVOSVRfQ0hFQ0soIHAgPT0gMCApOworICB9CisgIHsKKyAgICBzdHJpbmcgcyggIjEyMyIgKTsKKyAgICBzdHJpbmc6OnNpemVfdHlwZSBwID0gcy5maW5kKCAiIiwgMSwgMCApOworCisgICAgQ1BQVU5JVF9DSEVDSyggcCA9PSAxICk7CisgIH0KKyAgeworICAgIHN0cmluZyBzKCAiIiApOworICAgIHN0cmluZzo6c2l6ZV90eXBlIHAgPSBzLmZpbmQoICIiLCAxLCAwICk7CisKKyAgICBDUFBVTklUX0NIRUNLKCBwID09IHN0cmluZzo6bnBvcyApOworICB9CisgIHsKKyAgICBzdHJpbmcgcyggIjEyMyIgKTsKKyAgICBzdHJpbmc6OnNpemVfdHlwZSBwID0gcy5maW5kKCAiIiwgMywgMCApOworCisgICAgQ1BQVU5JVF9DSEVDSyggcCA9PSAzICk7IC8vIGJvZ3VzIHJlc3VsdCwgaXNuJ3QgaXQ/CisgIH0KKyAgeworICAgIHN0cmluZyBzOworICAgIHN0cmluZzo6c2l6ZV90eXBlIHAgPSBzLnJmaW5kKCAiIiwgMCwgMCApOworCisgICAgLyogQ1BQVU5JVF9DSEVDSyggcCA9PSBzdHJpbmc6Om5wb3MgKTsgKi8KKyAgICBDUFBVTklUX0NIRUNLKCBwID09IDAgKTsgLy8gYm9ndXMgcmVzdWx0LCBpc24ndCBpdD8KKyAgfQorICB7CisgICAgc3RyaW5nIHMoICIxMjMiICk7CisgICAgc3RyaW5nOjpzaXplX3R5cGUgcCA9IHMucmZpbmQoICIiLCAwLCAwICk7CisKKyAgICBDUFBVTklUX0NIRUNLKCBwID09IDAgKTsKKyAgfQorICB7CisgICAgc3RyaW5nIHMoICIxMjMiICk7CisgICAgc3RyaW5nOjpzaXplX3R5cGUgcCA9IHMucmZpbmQoICIiLCAxLCAwICk7CisKKyAgICBDUFBVTklUX0NIRUNLKCBwID09IDEgKTsKKyAgfQorICB7CisgICAgc3RyaW5nIHMoICIiICk7CisgICAgc3RyaW5nOjpzaXplX3R5cGUgcCA9IHMucmZpbmQoICIiLCAxLCAwICk7CisKKyAgICBDUFBVTklUX0NIRUNLKCBwID09IDAgKTsgLy8gYm9ndXMgcmVzdWx0LCBpc24ndCBpdD8KKyAgfQorICB7CisgICAgc3RyaW5nIHMoICIxMjMiICk7CisgICAgc3RyaW5nOjpzaXplX3R5cGUgcCA9IHMucmZpbmQoICIiLCAzLCAwICk7CisKKyAgICBDUFBVTklUX0NIRUNLKCBwID09IDMgKTsgLy8gYm9ndXMgcmVzdWx0LCBpc24ndCBpdD8KKyAgfQorfQorCit2b2lkIFN0cmluZ1Rlc3Q6OnJmaW5kKCkKK3sKKyAgLy8gMjEuMy42LjIKKyAgc3RyaW5nIHMoIm9uZSB0d28gdGhyZWUgb25lIHR3byB0aHJlZSIpOworCisgIENQUFVOSVRfQVNTRVJUKCBzLnJmaW5kKCJ0d28iKSA9PSAxOCApOworICBDUFBVTklUX0FTU0VSVCggcy5yZmluZCgidHdvIiwgMCkgPT0gc3RyaW5nOjpucG9zICk7CisgIENQUFVOSVRfQVNTRVJUKCBzLnJmaW5kKCJ0d28iLCAxMSkgPT0gNCApOworICBDUFBVTklUX0FTU0VSVCggcy5yZmluZCgndycpID09IDE5ICk7CisKKyAgc3RyaW5nIHRlc3QoICJhYmEiICk7CisKKyAgQ1BQVU5JVF9DSEVDSyggdGVzdC5yZmluZCggImEiLCAyLCAxICkgPT0gMiApOworICBDUFBVTklUX0NIRUNLKCB0ZXN0LnJmaW5kKCAiYSIsIDEsIDEgKSA9PSAwICk7CisgIENQUFVOSVRfQ0hFQ0soIHRlc3QucmZpbmQoICJhIiwgMCwgMSApID09IDAgKTsKKworICBDUFBVTklUX0NIRUNLKCB0ZXN0LnJmaW5kKCAnYScsIDIgKSA9PSAyICk7CisgIENQUFVOSVRfQ0hFQ0soIHRlc3QucmZpbmQoICdhJywgMSApID09IDAgKTsKKyAgQ1BQVU5JVF9DSEVDSyggdGVzdC5yZmluZCggJ2EnLCAwICkgPT0gMCApOworfQorCit2b2lkIFN0cmluZ1Rlc3Q6OmZpbmRfbGFzdF9vZigpCit7CisgIC8vIDIxLjMuNi40CisgIHN0cmluZyBzKCJvbmUgdHdvIHRocmVlIG9uZSB0d28gdGhyZWUiKTsKKworICBDUFBVTklUX0FTU0VSVCggcy5maW5kX2xhc3Rfb2YoImFiY2RlIikgPT0gMjYgKTsKKworICBzdHJpbmcgdGVzdCggImFiYSIgKTsKKworICBDUFBVTklUX0NIRUNLKCB0ZXN0LmZpbmRfbGFzdF9vZiggImEiLCAyLCAxICkgPT0gMiApOworICBDUFBVTklUX0NIRUNLKCB0ZXN0LmZpbmRfbGFzdF9vZiggImEiLCAxLCAxICkgPT0gMCApOworICBDUFBVTklUX0NIRUNLKCB0ZXN0LmZpbmRfbGFzdF9vZiggImEiLCAwLCAxICkgPT0gMCApOworCisgIENQUFVOSVRfQ0hFQ0soIHRlc3QuZmluZF9sYXN0X29mKCAnYScsIDIgKSA9PSAyICk7CisgIENQUFVOSVRfQ0hFQ0soIHRlc3QuZmluZF9sYXN0X29mKCAnYScsIDEgKSA9PSAwICk7CisgIENQUFVOSVRfQ0hFQ0soIHRlc3QuZmluZF9sYXN0X29mKCAnYScsIDAgKSA9PSAwICk7Cit9CisKK3ZvaWQgU3RyaW5nVGVzdDo6ZmluZF9sYXN0X25vdF9vZigpCit7CisgIC8vIDIxLjMuNi42CisgIHN0cmluZyBzKCJvbmUgdHdvIHRocmVlIG9uZSB0d28gdGhyZWUiKTsKKworICBDUFBVTklUX0FTU0VSVCggcy5maW5kX2xhc3Rfbm90X29mKCJlaG9ydHcgIikgPT0gMTUgKTsKKworICBzdHJpbmcgdGVzdCggImFiYSIgKTsKKworICBDUFBVTklUX0NIRUNLKCB0ZXN0LmZpbmRfbGFzdF9ub3Rfb2YoICJhIiwgMiwgMSApID09IDEgKTsKKyAgQ1BQVU5JVF9DSEVDSyggdGVzdC5maW5kX2xhc3Rfbm90X29mKCAiYiIsIDIsIDEgKSA9PSAyICk7CisgIENQUFVOSVRfQ0hFQ0soIHRlc3QuZmluZF9sYXN0X25vdF9vZiggImEiLCAxLCAxICkgPT0gMSApOworICBDUFBVTklUX0NIRUNLKCB0ZXN0LmZpbmRfbGFzdF9ub3Rfb2YoICJiIiwgMSwgMSApID09IDAgKTsKKyAgQ1BQVU5JVF9DSEVDSyggdGVzdC5maW5kX2xhc3Rfbm90X29mKCAiYSIsIDAsIDEgKSA9PSBzdHJpbmc6Om5wb3MgKTsKKyAgQ1BQVU5JVF9DSEVDSyggdGVzdC5maW5kX2xhc3Rfbm90X29mKCAiYiIsIDAsIDEgKSA9PSAwICk7CisKKyAgQ1BQVU5JVF9DSEVDSyggdGVzdC5maW5kX2xhc3Rfbm90X29mKCAnYScsIDIgKSA9PSAxICk7CisgIENQUFVOSVRfQ0hFQ0soIHRlc3QuZmluZF9sYXN0X25vdF9vZiggJ2InLCAyICkgPT0gMiApOworICBDUFBVTklUX0NIRUNLKCB0ZXN0LmZpbmRfbGFzdF9ub3Rfb2YoICdhJywgMSApID09IDEgKTsKKyAgQ1BQVU5JVF9DSEVDSyggdGVzdC5maW5kX2xhc3Rfbm90X29mKCAnYicsIDEgKSA9PSAwICk7CisgIENQUFVOSVRfQ0hFQ0soIHRlc3QuZmluZF9sYXN0X25vdF9vZiggJ2EnLCAwICkgPT0gc3RyaW5nOjpucG9zICk7CisgIENQUFVOSVRfQ0hFQ0soIHRlc3QuZmluZF9sYXN0X25vdF9vZiggJ2InLCAwICkgPT0gMCApOworfQorCit2b2lkIFN0cmluZ1Rlc3Q6OmNvcHkoKQoreworICBzdHJpbmcgcygiZm9vIik7CisgIGNoYXIgZGVzdFs0XTsKKyAgZGVzdFswXSA9IGRlc3RbMV0gPSBkZXN0WzJdID0gZGVzdFszXSA9IDE7CisgIHMuY29weShkZXN0LCA0KTsKKyAgaW50IHBvcyA9IDA7CisgIENQUFVOSVRfQVNTRVJUKCBkZXN0W3BvcysrXSA9PSAnZicgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIGRlc3RbcG9zKytdID09ICdvJyApOworICBDUFBVTklUX0FTU0VSVCggZGVzdFtwb3MrK10gPT0gJ28nICk7CisgIENQUFVOSVRfQVNTRVJUKCBkZXN0W3BvcysrXSA9PSAxICk7CisKKyAgZGVzdFswXSA9IGRlc3RbMV0gPSBkZXN0WzJdID0gZGVzdFszXSA9IDE7CisgIHMuY29weShkZXN0LCA0LCAyKTsKKyAgcG9zID0gMDsKKyAgQ1BQVU5JVF9BU1NFUlQoIGRlc3RbcG9zKytdID09ICdvJyApOworICBDUFBVTklUX0FTU0VSVCggZGVzdFtwb3MrK10gPT0gMSApOworCisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IGRlZmluZWQgKF9TVExQX1VTRV9FWENFUFRJT05TKQorICB0cnkgeworICAgIHMuY29weShkZXN0LCA0LCA1KTsKKyAgICBDUFBVTklUX0ZBSUw7CisgIH0KKyAgY2F0Y2ggKG91dF9vZl9yYW5nZSBjb25zdCYpIHsKKyAgfQorICBjYXRjaCAoIC4uLiApIHsKKyAgICBDUFBVTklUX0ZBSUw7CisgIH0KKyNlbmRpZgorfQorCit2b2lkIFN0cmluZ1Rlc3Q6OmFzc2lnbigpCit7CisgIHN0cmluZyBzOworICBjaGFyIGNvbnN0KiBjc3RyID0gInRlc3Qgc3RyaW5nIGZvciBhc3NpZ24iOworCisgIHMuYXNzaWduKGNzdHIsIGNzdHIgKyAyMik7CisgIENQUFVOSVRfQVNTRVJUKCBzID09ICJ0ZXN0IHN0cmluZyBmb3IgYXNzaWduIiApOworCisgIHN0cmluZyBzMigib3RoZXIgdGVzdCBzdHJpbmciKTsKKyAgcy5hc3NpZ24oczIpOworICBDUFBVTklUX0FTU0VSVCggcyA9PSBzMiApOworCisgIHN0YXRpYyBzdHJpbmcgc3RyMTsKKyAgc3RhdGljIHN0cmluZyBzdHIyOworCisgIC8vIHNob3J0IHN0cmluZyBvcHRpbToKKyAgc3RyMSA9ICIxMjM0NTYiOworICAvLyBsb25nZXIgdGhhbiBzaG9ydCBzdHJpbmc6CisgIHN0cjIgPSAiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCI7CisKKyAgQ1BQVU5JVF9BU1NFUlQoc3RyMVs1XSA9PSAnNicpOworICBDUFBVTklUX0FTU0VSVChzdHIyWzI5XSA9PSAnMCcpOworfQorCisvKiBUaGlzIHRlc3QgaXMgdG8gY2hlY2sgaWYgc3RyaW5nIHByb3Blcmx5IHN1cHBvcnRzIHRoZSBzaG9ydCBzdHJpbmcKKyAqIG9wdGltaXphdGlvbi4gSXQgaGFzIGJlZW4gZm91bmQgb3V0IHRoYXQgZU1iZWRkZWQgVmlzdWFsIEMrKyAzLjAgYW5kIC5ORVQKKyAqIGNvbXBpbGVycyBmb3IgdGhlIEFSTSBwbGF0Zm9ybSBmYWlsIHRvIHBhc3Mgc3RydWN0cyBhbmQgY2xhc3NlcyBvZiBjZXJ0YWluCisgKiBzaXplIHBlciB2YWx1ZS4gVGhpcyBzZWVtcyB0byBiZSBhIGtub3duIGNvbXBpbGVyIGJ1Zy4gRm9yIG90aGVyIHByb2Nlc3NvcnMKKyAqIChlLmcuIHg4NikgdGhlIGVycm9yIGRvZXNuJ3Qgb2NjdXIuCisgKiAoVGhlIEFSTSBjb21waWxlciBjcmVhdGVzIGEgdGVtcG9yYXJ5IG9iamVjdCBmcm9tIHRlc3RzdHIgb24gdGhlIHN0YWNrLCB0bworICogcGFzcyBpdCB0byB0aGUgaGVscGVyIGZ1bmN0aW9uLiBJdCB1c2VzIHRoZSBjb3B5IGNvbnN0cnVjdG9yIGZvciB0aGlzLgorICogQWZ0ZXIgdGhpcyB0aGUgdGVtcG9yYXJ5IG9iamVjdCBpcyBjb3BpZWQgdG8gYW5vdGhlciBwbGFjZSBvbiB0aGUgc3RhY2suCisgKiBUaGUgcmVzdWx0IGlzIHRoYXQgdGhlIF9NX2ZpbmlzaCBwb2ludGVyIHRoZW4gcG9pbnRzIHRvIHRoZSB3cm9uZyBidWZmZXIKKyAqIGVuZCBhbmQgdGhlIHNpemUgb2YgdGhlIHNob3J0IHN0cmluZyBpcyBpbmNvcnJlY3RseSBjYWxjdWxhdGVkLikKKyAqLwordm9pZCBTdHJpbmdUZXN0OjpzaG9ydF9zdHJpbmdfb3B0aW1fYnVnKCkKK3sKKyAgIHN0cmluZyB0ZXN0c3RyKCJzaG9ydGVzdCIpOworCisgICBib29sIHNob3J0X3N0cmluZ19vcHRpbV9idWdfaGVscGVyKHN0cmluZyB0ZXN0c3RyKTsKKworICAgQ1BQVU5JVF9BU1NFUlQodHJ1ZSA9PSBzaG9ydF9zdHJpbmdfb3B0aW1fYnVnX2hlbHBlcih0ZXN0c3RyKSk7Cit9CisKK2Jvb2wgc2hvcnRfc3RyaW5nX29wdGltX2J1Z19oZWxwZXIoc3RyaW5nIHRlc3RzdHIpCit7CisgICBzaXplX3Qgc3MgPSB0ZXN0c3RyLnNpemUoKTsKKyAgIHJldHVybiAoc3MgPT0gOCk7Cit9CisKK3ZvaWQgU3RyaW5nVGVzdDo6Y29tcGFyZSgpCit7CisgIHN0cmluZyBzdHIxKCJhYmNkZWYiKTsKKyAgc3RyaW5nIHN0cjI7CisKKyAgc3RyMiA9ICJhYmNkZWYiOworICBDUFBVTklUX0FTU0VSVCggc3RyMS5jb21wYXJlKHN0cjIpID09IDAgKTsKKyAgc3RyMiA9ICJhYmNkZSI7CisgIENQUFVOSVRfQVNTRVJUKCBzdHIxLmNvbXBhcmUoc3RyMikgPiAwICk7CisgIHN0cjIgPSAiYWJjZGVmZyI7CisgIENQUFVOSVRfQVNTRVJUKCBzdHIxLmNvbXBhcmUoc3RyMikgPCAwICk7CisKKyAgQ1BQVU5JVF9BU1NFUlQoIHN0cjEuY29tcGFyZSgiYWJjZGVmIikgPT0gMCApOworICBDUFBVTklUX0FTU0VSVCggc3RyMS5jb21wYXJlKCJhYmNkZSIpID4gMCApOworICBDUFBVTklUX0FTU0VSVCggc3RyMS5jb21wYXJlKCJhYmNkZWZnIikgPCAwICk7CisKKyAgc3RyMiA9ICJjZGUiOworICBDUFBVTklUX0FTU0VSVCggc3RyMS5jb21wYXJlKDIsIDMsIHN0cjIpID09IDAgKTsKKyAgc3RyMiA9ICJjZCI7CisgIENQUFVOSVRfQVNTRVJUKCBzdHIxLmNvbXBhcmUoMiwgMywgc3RyMikgPiAwICk7CisgIHN0cjIgPSAiY2RlZiI7CisgIENQUFVOSVRfQVNTRVJUKCBzdHIxLmNvbXBhcmUoMiwgMywgc3RyMikgPCAwICk7CisKKyAgc3RyMiA9ICJhYmNkZWYiOworICBDUFBVTklUX0FTU0VSVCggc3RyMS5jb21wYXJlKDIsIDMsIHN0cjIsIDIsIDMpID09IDAgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHN0cjEuY29tcGFyZSgyLCAzLCBzdHIyLCAyLCAyKSA+IDAgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHN0cjEuY29tcGFyZSgyLCAzLCBzdHIyLCAyLCA0KSA8IDAgKTsKKworICBDUFBVTklUX0FTU0VSVCggc3RyMS5jb21wYXJlKDIsIDMsICJjZGVmZ2giLCAzKSA9PSAwICk7CisgIENQUFVOSVRfQVNTRVJUKCBzdHIxLmNvbXBhcmUoMiwgMywgImNkZWZnaCIsIDIpID4gMCApOworICBDUFBVTklUX0FTU0VSVCggc3RyMS5jb21wYXJlKDIsIDMsICJjZGVmZ2giLCA0KSA8IDAgKTsKK30KKworLyoKK2NsYXNzIG15c3RyaW5nIDogcHVibGljIHN0cmluZyB7CitwdWJsaWM6CisgIG15c3RyaW5nKCkge30KKyAgbXlzdHJpbmcoc3RyaW5nIGNvbnN0JiBzKSA6IHN0cmluZyhzKSB7fQorCisgIG15c3RyaW5nJiBvcGVyYXRvciA9IChzdHJpbmcgY29uc3QmIHMpIHsKKyAgICBzdHJpbmc6Om9wZXJhdG9yID0gKHMpOworICAgIHJldHVybiAqdGhpczsKKyAgfTsKK307CisqLworCit2b2lkIFN0cmluZ1Rlc3Q6OnRlbXBsYXRlX2V4cHJlc3Npb24oKQoreworICBzdHJpbmcgb25lKCJvbmUiKSwgdHdvKCJ0d28iKSwgdGhyZWUoInRocmVlIik7CisgIHN0cmluZyBzcGFjZSgxLCAnICcpOworCisgIC8vIGNoZWNrIGF2YWlsYWJpbGl0eSBvZiBbdW5dZXF1YWxpdHkgb3BlcmF0b3JzCisgIHsKKyAgICAgIC8vIHN0cmluZy1zdHJpbmcKKyAgICAgIG9uZSA9PSB0d287CisgICAgICBvbmUgIT0gdHdvOworICAgICAgLy8gc3RyaW5nLWxpdGVyYWwKKyAgICAgIG9uZSA9PSAidHdvIjsKKyAgICAgIG9uZSAhPSAidHdvIjsKKyAgICAgIC8vIGxpdGVyYWwtc3RyaW5nCisgICAgICAib25lIiA9PSB0d287CisgICAgICAib25lIiAhPSB0d287CisgICAgICAvLyBzdHJzdW0tc3RyaW5nCisgICAgICAob25lICsgdHdvKSA9PSB0aHJlZTsKKyAgICAgIChvbmUgKyB0d28pICE9IHRocmVlOworICAgICAgLy8gc3RyaW5nLXN0cnN1bQorICAgICAgb25lID09ICh0d28gKyB0aHJlZSk7CisgICAgICBvbmUgIT0gKHR3byArIHRocmVlKTsKKyAgICAgIC8vIHN0cnN1bS1saXRlcmFsCisgICAgICAob25lICsgdHdvKSA9PSAidGhyZWUiOworICAgICAgKG9uZSArIHR3bykgIT0gInRocmVlIjsKKyAgICAgIC8vIGxpdGVyYWwtc3Ryc3VtCisgICAgICAib25lIiA9PSAodHdvICsgdGhyZWUpOworICAgICAgIm9uZSIgIT0gKHR3byArIHRocmVlKTsKKyAgICAgIC8vIHN0cnN1bS1zdHJzdW0KKyAgICAgIChvbmUgKyB0d28pID09ICh0d28gKyB0aHJlZSk7CisgICAgICAob25lICsgdHdvKSAhPSAodHdvICsgdGhyZWUpOworICB9CisKKyAgeworICAgIHN0cmluZyByZXN1bHQob25lICsgJyAnICsgdHdvICsgJyAnICsgdGhyZWUpOworICAgIENQUFVOSVRfQ0hFQ0soIHJlc3VsdCA9PSAib25lIHR3byB0aHJlZSIgKTsKKyAgfQorCisgIHsKKyAgICBzdHJpbmcgcmVzdWx0KG9uZSArICcgJyArIHR3byArICcgJyArIHRocmVlLCA0KTsKKyAgICBDUFBVTklUX0NIRUNLKCByZXN1bHQgPT0gInR3byB0aHJlZSIgKTsKKyAgfQorCisgIHsKKyAgICBzdHJpbmcgcmVzdWx0KG9uZSArICcgJyArIHR3byArICcgJyArIHRocmVlLCA0LCAzKTsKKyAgICBDUFBVTklUX0NIRUNLKCByZXN1bHQgPT0gInR3byIgKTsKKyAgfQorCisgIC8vMiBtZW1iZXJzIGV4cHJlc3Npb25zOgorICBDUFBVTklUX0NIRUNLKCAoJyAnICsgb25lKSA9PSAiIG9uZSIgKTsKKyAgQ1BQVU5JVF9DSEVDSyggKG9uZSArICcgJykgPT0gIm9uZSAiICk7CisgIENQUFVOSVRfQ0hFQ0soIChvbmUgKyAiIHR3byIpID09ICJvbmUgdHdvIiApOworICBDUFBVTklUX0NIRUNLKCAoIm9uZSAiICsgdHdvKSA9PSAib25lIHR3byIgKTsKKyAgQ1BQVU5JVF9DSEVDSyggKG9uZSArIHNwYWNlKSA9PSAib25lICIgKTsKKworICAvLzMgbWVtYmVycyBleHByZXNzaW9uczoKKyAgQ1BQVU5JVF9DSEVDSyggKChvbmUgKyBzcGFjZSkgKyAidHdvIikgPT0gIm9uZSB0d28iICk7CisgIENQUFVOSVRfQ0hFQ0soICgib25lIiArIChzcGFjZSArIHR3bykpID09ICJvbmUgdHdvIiApOworICBDUFBVTklUX0NIRUNLKCAoKG9uZSArIHNwYWNlKSArIHR3bykgPT0gIm9uZSB0d28iICk7CisgIENQUFVOSVRfQ0hFQ0soIChvbmUgKyAoc3BhY2UgKyB0d28pKSA9PSAib25lIHR3byIgKTsKKyAgQ1BQVU5JVF9DSEVDSyggKChvbmUgKyBzcGFjZSkgKyAndCcpID09ICJvbmUgdCIgKTsKKyAgQ1BQVU5JVF9DSEVDSyggKCdvJyArIChzcGFjZSArIHR3bykpID09ICJvIHR3byIgKTsKKworICAvLzQgbWVtYmVycyBleHByZXNzaW9uczoKKyAgQ1BQVU5JVF9DSEVDSyggKChvbmUgKyBzcGFjZSkgKyAodHdvICsgc3BhY2UpKSA9PSAib25lIHR3byAiICk7CisKKyAgLy9zcGVjaWFsIG9wZXJhdG9ycworICB7CisgICAgc3RyaW5nIHJlc3VsdDsKKyAgICByZXN1bHQgPSBvbmUgKyBzcGFjZSArIHR3bzsKKyAgICBDUFBVTklUX0NIRUNLKCByZXN1bHQgPT0gIm9uZSB0d28iICk7CisKKyAgICByZXN1bHQgKz0gc3BhY2UgKyB0aHJlZTsKKyAgICBDUFBVTklUX0NIRUNLKCByZXN1bHQgPT0gIm9uZSB0d28gdGhyZWUiICk7CisgIH0KKworICAvL3NwZWNpYWwgYXBwZW5kIG1ldGhvZAorICB7CisgICAgc3RyaW5nIHJlc3VsdDsKKyAgICAvL1VzZSByZXNlcnZlIHRvIGF2b2lkIHJlYWxsb2NhdGlvbiBhbmQgcmVhbGx5IHRlc3QgYXV0by1yZWZlcmVuY2luZyBwcm9ibGVtczoKKyAgICByZXN1bHQucmVzZXJ2ZSg2NCk7CisKKyAgICByZXN1bHQuYXBwZW5kKG9uZSArIHNwYWNlICsgdHdvKTsKKyAgICBDUFBVTklUX0NIRUNLKCByZXN1bHQgPT0gIm9uZSB0d28iICk7CisKKyAgICByZXN1bHQuYXBwZW5kKHNwYWNlICsgcmVzdWx0ICsgc3BhY2UgKyB0aHJlZSk7CisgICAgQ1BQVU5JVF9DSEVDSyggcmVzdWx0ID09ICJvbmUgdHdvIG9uZSB0d28gdGhyZWUiICk7CisKKyAgICByZXN1bHQgPSAib25lIHR3byI7CisgICAgcmVzdWx0LmFwcGVuZChzcGFjZSArIHRocmVlLCAxLCAyKTsKKyAgICBDUFBVTklUX0FTU0VSVCggcmVzdWx0ID09ICJvbmUgdHdvdGgiICk7CisKKyAgICByZXN1bHQuYXBwZW5kKHNwYWNlICsgcmVzdWx0KTsKKyAgICBDUFBVTklUX0NIRUNLKCByZXN1bHQgPT0gIm9uZSB0d290aCBvbmUgdHdvdGgiICk7CisgIH0KKworICAvL3NwZWNpYWwgYXNzaWduIG1ldGhvZAorICB7CisgICAgc3RyaW5nIHJlc3VsdDsKKyAgICAvL1VzZSByZXNlcnZlIHRvIGF2b2lkIHJlYWxsb2NhdGlvbiBhbmQgcmVhbGx5IHRlc3QgYXV0by1yZWZlcmVuY2luZyBwcm9ibGVtczoKKyAgICByZXN1bHQucmVzZXJ2ZSg2NCk7CisKKyAgICByZXN1bHQuYXNzaWduKG9uZSArIHNwYWNlICsgdHdvICsgc3BhY2UgKyB0aHJlZSk7CisgICAgQ1BQVU5JVF9DSEVDSyggcmVzdWx0ID09ICJvbmUgdHdvIHRocmVlIiApOworCisgICAgcmVzdWx0LmFzc2lnbihvbmUgKyBzcGFjZSArIHR3byArIHNwYWNlICsgdGhyZWUsIDMsIDUpOworICAgIENQUFVOSVRfQ0hFQ0soIHJlc3VsdCA9PSAiIHR3byAiICk7CisKKyAgICByZXN1bHQuYXNzaWduKG9uZSArIHJlc3VsdCArIHRocmVlKTsKKyAgICBDUFBVTklUX0NIRUNLKCByZXN1bHQgPT0gIm9uZSB0d28gdGhyZWUiICk7CisgIH0KKworICB7CisgICAgQ1BQVU5JVF9DSEVDSyggIShvbmUgKyAnICcgKyB0d28pLmVtcHR5KCkgKTsKKworICAgIGNoYXIgcmVzdWx0ID0gKG9uZSArICcgJyArIHR3bylbM107CisgICAgQ1BQVU5JVF9DSEVDSyggcmVzdWx0ID09ICcgJyApOworCisgICAgcmVzdWx0ID0gKG9uZSArICcgJyArIHR3bykuYXQoMyk7CisgICAgQ1BQVU5JVF9DSEVDSyggcmVzdWx0ID09ICcgJyApOworCisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IGRlZmluZWQgKF9TVExQX1VTRV9FWENFUFRJT05TKQorICAgIHRyeSB7CisgICAgICByZXN1bHQgPSAob25lICsgJyAnICsgdHdvKS5hdCgxMCk7CisgICAgICBDUFBVTklUX0ZBSUw7CisgICAgfQorICAgIGNhdGNoIChvdXRfb2ZfcmFuZ2UgY29uc3QmKSB7CisgICAgICBDUFBVTklUX0FTU0VSVCggcmVzdWx0ID09ICcgJyApOworICAgIH0KKyAgICBjYXRjaCAoLi4uKSB7CisgICAgICBDUFBVTklUX0ZBSUw7CisgICAgfQorI2VuZGlmCisgIH0KKworICAvKgorICBteXN0cmluZyBhKCJpbmciKTsKKyAgLy9nY2MgZmFpbGVkIHRvIGNvbXBpbGUgZm9sbG93aW5nIGV4cHJlc3Npb24gd2hlbiB0ZW1wbGF0ZSBleHByZXNzaW9ucyBhcmUgYWN0aXZhdGVkLgorICAvL01TVkMgc2VlcyBubyBwcm9ibGVtLiBnY2MgbGltaXRhdGlvbiBvciBNU1ZDIGlzIHRvbyBjb29sID8/CisgIG15c3RyaW5nIGIgPSAic3RyIiArIGE7CisgICovCit9CisKKyNpZiAhZGVmaW5lZCAoVEVfVE1QX1RFU1RfSUdOT1JFRCkKK2NsYXNzIHN1cGVyc3RyaW5nCit7CisgIHB1YmxpYzoKKyAgICBzdXBlcnN0cmluZygpIDoKKyAgICAgIHMoInN1cGVyIikKKyAgICB7fQorCisgICAgc3VwZXJzdHJpbmcoIGNvbnN0IHN0cmluZyYgc3RyICkgOgorICAgICAgcyggc3RyICkKKyAgICB7fQorCisgIHN1cGVyc3RyaW5nIG9wZXJhdG9yIC8gKGNvbnN0IHN0cmluZyYgc3RyICkKKyAgICB7IHJldHVybiBzdXBlcnN0cmluZyggcyArICIvIiArIHN0ciApOyB9CisKKyAgc3VwZXJzdHJpbmcgb3BlcmF0b3IgLyAoY29uc3QgY2hhciogc3RyICkKKyAgICB7IHJldHVybiBzdXBlcnN0cmluZyggcyArICIvIiArIHN0ciApOyB9CisKKyAgcHJpdmF0ZToKKyAgICBzdHJpbmcgczsKK307CisjZW5kaWYKKwordm9pZCBTdHJpbmdUZXN0Ojp0ZV90bXAoKQoreworI2lmICFkZWZpbmVkIChURV9UTVBfVEVTVF9JR05PUkVEKQorICBzdXBlcnN0cmluZyBzOworICBzdHJpbmcgbW9yZSggIm1vcmUiICk7CisgIHN0cmluZyBsZXNzKCAibGVzcyIgKTsKKworICBzdXBlcnN0cmluZyByID0gcyAvIChtb3JlICsgbGVzcyk7CisjZW5kaWYKK30KKworY2xhc3MgbXlwYXRoCit7CisgIHB1YmxpYzoKKyAgICBteXBhdGgoIGNvbnN0IHN0cmluZyYgcyApIDoKKyAgICAgICAgcCggcyApCisgICAgICB7IH0KKworICAgIGNvbnN0IG15cGF0aCYgb3BlcmF0b3IgLyAoIGNvbnN0IHN0cmluZyYgKTsKKyAgICBjb25zdCBzdHJpbmcmIHN0cigpIGNvbnN0CisgICAgICB7IHJldHVybiBwOyB9CisgCisgIHByaXZhdGU6CisgICAgc3RyaW5nIHA7Cit9OworCitjb25zdCBteXBhdGgmIG15cGF0aDo6b3BlcmF0b3IgLyggY29uc3Qgc3RyaW5nJiBzICkKK3sKKyAgcCArPSAnLyc7CisgIHAgKz0gczsKKyAgcmV0dXJuICp0aGlzOworfQorCit2b2lkIFN0cmluZ1Rlc3Q6Om9wZXJfdG1wKCkKK3sKKyAgc3RyaW5nIHMxKCAicGF0aDEiICk7CisgIHN0cmluZyBzMiggIi5leHQiICk7CisKKyAgc3RyaW5nJiByczEgPSBzMTsKKyAgc3RyaW5nJiByczIgPSBzMjsKKworICBDUFBVTklUX0NIRUNLKCAobXlwYXRoKCBzdHJpbmcoICIvcm9vdCIgKSApIC8gKHJzMSArIHJzMikpLnN0cigpID09ICIvcm9vdC9wYXRoMS5leHQiICk7Cit9CisKK3ZvaWQgU3RyaW5nVGVzdDo6dGVtcGxhdGVfd2V4cHJlc3Npb24oKQoreworI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCAhZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkKKyMgIGlmICFkZWZpbmVkIChfX0NZR1dJTl9fKSB8fCBkZWZpbmVkIChTVExQT1JUKQorICB3c3RyaW5nIG9uZShMIm9uZSIpLCB0d28oTCJ0d28iKSwgdGhyZWUoTCJ0aHJlZSIpOworICB3c3RyaW5nIHNwYWNlKEwiICIpOworCisgIHsKKyAgICB3c3RyaW5nIHJlc3VsdChvbmUgKyBMJyAnICsgdHdvICsgTCcgJyArIHRocmVlKTsKKyAgICBDUFBVTklUX0NIRUNLKCByZXN1bHQgPT0gTCJvbmUgdHdvIHRocmVlIiApOworICB9CisKKyAgeworICAgIHdzdHJpbmcgcmVzdWx0KG9uZSArIEwnICcgKyB0d28gKyBMJyAnICsgdGhyZWUsIDQpOworICAgIENQUFVOSVRfQ0hFQ0soIHJlc3VsdCA9PSBMInR3byB0aHJlZSIgKTsKKyAgfQorCisgIHsKKyAgICB3c3RyaW5nIHJlc3VsdChvbmUgKyBMJyAnICsgdHdvICsgTCcgJyArIHRocmVlLCA0LCAzKTsKKyAgICBDUFBVTklUX0NIRUNLKCByZXN1bHQgPT0gTCJ0d28iICk7CisgIH0KKworICAvLzIgbWVtYmVycyBleHByZXNzaW9uczoKKyAgQ1BQVU5JVF9DSEVDSyggKEwnICcgKyBvbmUpID09IEwiIG9uZSIgKTsKKyAgQ1BQVU5JVF9DSEVDSyggKG9uZSArIEwnICcpID09IEwib25lICIgKTsKKyAgQ1BQVU5JVF9DSEVDSyggKG9uZSArIEwiIHR3byIpID09IEwib25lIHR3byIgKTsKKyAgQ1BQVU5JVF9DSEVDSyggKEwib25lICIgKyB0d28pID09IEwib25lIHR3byIgKTsKKyAgQ1BQVU5JVF9DSEVDSyggKG9uZSArIHNwYWNlKSA9PSBMIm9uZSAiICk7CisKKyAgLy8zIG1lbWJlcnMgZXhwcmVzc2lvbnM6CisgIENQUFVOSVRfQ0hFQ0soICgob25lICsgc3BhY2UpICsgTCJ0d28iKSA9PSBMIm9uZSB0d28iICk7CisgIENQUFVOSVRfQ0hFQ0soIChMIm9uZSIgKyAoc3BhY2UgKyB0d28pKSA9PSBMIm9uZSB0d28iICk7CisgIENQUFVOSVRfQ0hFQ0soICgob25lICsgc3BhY2UpICsgdHdvKSA9PSBMIm9uZSB0d28iICk7CisgIENQUFVOSVRfQ0hFQ0soIChvbmUgKyAoc3BhY2UgKyB0d28pKSA9PSBMIm9uZSB0d28iICk7CisgIENQUFVOSVRfQ0hFQ0soICgob25lICsgc3BhY2UpICsgTCd0JykgPT0gTCJvbmUgdCIgKTsKKyAgQ1BQVU5JVF9DSEVDSyggKEwnbycgKyAoc3BhY2UgKyB0d28pKSA9PSBMIm8gdHdvIiApOworCisgIC8vNCBtZW1iZXJzIGV4cHJlc3Npb25zOgorICBDUFBVTklUX0NIRUNLKCAoKG9uZSArIHNwYWNlKSArICh0d28gKyBzcGFjZSkpID09IEwib25lIHR3byAiICk7CisKKyAgLy9zcGVjaWFsIG9wZXJhdG9ycworICB7CisgICAgd3N0cmluZyByZXN1bHQ7CisgICAgcmVzdWx0ID0gb25lICsgc3BhY2UgKyB0d287CisgICAgQ1BQVU5JVF9DSEVDSyggcmVzdWx0ID09IEwib25lIHR3byIgKTsKKworICAgIHJlc3VsdCArPSBzcGFjZSArIHRocmVlOworICAgIENQUFVOSVRfQ0hFQ0soIHJlc3VsdCA9PSBMIm9uZSB0d28gdGhyZWUiICk7CisgIH0KKworICAvL3NwZWNpYWwgYXBwZW5kIG1ldGhvZAorICB7CisgICAgd3N0cmluZyByZXN1bHQ7CisgICAgLy9Vc2UgcmVzZXJ2ZSB0byBhdm9pZCByZWFsbG9jYXRpb24gYW5kIHJlYWxseSB0ZXN0IGF1dG8tcmVmZXJlbmNpbmcgcHJvYmxlbXM6CisgICAgcmVzdWx0LnJlc2VydmUoNjQpOworCisgICAgcmVzdWx0LmFwcGVuZChvbmUgKyBzcGFjZSArIHR3byk7CisgICAgQ1BQVU5JVF9DSEVDSyggcmVzdWx0ID09IEwib25lIHR3byIgKTsKKworICAgIHJlc3VsdC5hcHBlbmQoc3BhY2UgKyByZXN1bHQgKyBzcGFjZSArIHRocmVlKTsKKyAgICBDUFBVTklUX0NIRUNLKCByZXN1bHQgPT0gTCJvbmUgdHdvIG9uZSB0d28gdGhyZWUiICk7CisKKyAgICByZXN1bHQgPSBMIm9uZSB0d28iOworICAgIHJlc3VsdC5hcHBlbmQoc3BhY2UgKyB0aHJlZSwgMSwgMik7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHJlc3VsdCA9PSBMIm9uZSB0d290aCIgKTsKKworICAgIHJlc3VsdC5hcHBlbmQoc3BhY2UgKyByZXN1bHQpOworICAgIENQUFVOSVRfQ0hFQ0soIHJlc3VsdCA9PSBMIm9uZSB0d290aCBvbmUgdHdvdGgiICk7CisgIH0KKworICAvL3NwZWNpYWwgYXNzaWduIG1ldGhvZAorICB7CisgICAgd3N0cmluZyByZXN1bHQ7CisgICAgLy9Vc2UgcmVzZXJ2ZSB0byBhdm9pZCByZWFsbG9jYXRpb24gYW5kIHJlYWxseSB0ZXN0IGF1dG8tcmVmZXJlbmNpbmcgcHJvYmxlbXM6CisgICAgcmVzdWx0LnJlc2VydmUoNjQpOworCisgICAgcmVzdWx0LmFzc2lnbihvbmUgKyBzcGFjZSArIHR3byArIHNwYWNlICsgdGhyZWUpOworICAgIENQUFVOSVRfQ0hFQ0soIHJlc3VsdCA9PSBMIm9uZSB0d28gdGhyZWUiICk7CisKKyAgICByZXN1bHQuYXNzaWduKG9uZSArIHNwYWNlICsgdHdvICsgc3BhY2UgKyB0aHJlZSwgMywgNSk7CisgICAgQ1BQVU5JVF9DSEVDSyggcmVzdWx0ID09IEwiIHR3byAiICk7CisKKyAgICByZXN1bHQuYXNzaWduKG9uZSArIHJlc3VsdCArIHRocmVlKTsKKyAgICBDUFBVTklUX0NIRUNLKCByZXN1bHQgPT0gTCJvbmUgdHdvIHRocmVlIiApOworICB9CisKKyAgeworICAgIENQUFVOSVRfQ0hFQ0soICEob25lICsgTCcgJyArIHR3bykuZW1wdHkoKSApOworCisgICAgd2NoYXJfdCByZXN1bHQgPSAob25lICsgTCcgJyArIHR3bylbM107CisgICAgQ1BQVU5JVF9DSEVDSyggcmVzdWx0ID09IEwnICcgKTsKKworICAgIHJlc3VsdCA9IChvbmUgKyBMJyAnICsgdHdvKS5hdCgzKTsKKyAgICBDUFBVTklUX0NIRUNLKCByZXN1bHQgPT0gTCcgJyApOworCisjICAgIGlmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkIChfU1RMUF9VU0VfRVhDRVBUSU9OUykKKyAgICB0cnkgeworICAgICAgcmVzdWx0ID0gKG9uZSArIEwnICcgKyB0d28pLmF0KDEwKTsKKyAgICAgIENQUFVOSVRfRkFJTDsKKyAgICB9CisgICAgY2F0Y2ggKG91dF9vZl9yYW5nZSBjb25zdCYpIHsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCByZXN1bHQgPT0gTCcgJyApOworICAgIH0KKyAgICBjYXRjaCAoLi4uKSB7CisgICAgICBDUFBVTklUX0ZBSUw7CisgICAgfQorIyAgICBlbmRpZgorICB9CisjICBlbmRpZgorI2VuZGlmCit9CisKK3ZvaWQgU3RyaW5nVGVzdDo6aW8oKQoreworI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCAhZGVmaW5lZCAoX1NUTFBfVVNFX05PX0lPU1RSRUFNUykKKyAgc3RyaW5nIHN0cigiU1RMcG9ydCIpOworICB7CisgICAgb3N0cmluZ3N0cmVhbSBvc3RyOworICAgIG9zdHIgPDwgc3RyOworICAgIENQUFVOSVRfQVNTRVJUKCBvc3RyLmdvb2QoKSApOworICAgIENQUFVOSVRfQVNTRVJUKCBvc3RyLnN0cigpID09IHN0ciApOworICB9CisgIHsKKyAgICBpc3RyaW5nc3RyZWFtIGlzdHIoc3RyKTsKKyAgICBzdHJpbmcgaXN0cl9jb250ZW50OworICAgIGlzdHIgPj4gaXN0cl9jb250ZW50OworICAgIENQUFVOSVRfQVNTRVJUKCAhaXN0ci5mYWlsKCkgJiYgaXN0ci5lb2YoKSApOworICAgIENQUFVOSVRfQVNTRVJUKCBpc3RyX2NvbnRlbnQgPT0gc3RyICk7CisgIH0KKyAgeworICAgIGlzdHJpbmdzdHJlYW0gaXN0cihzdHIpOworICAgIGlzdHIud2lkdGgoMyk7CisgICAgc3RyaW5nIGlzdHJfY29udGVudDsKKyAgICBpc3RyID4+IGlzdHJfY29udGVudDsKKyAgICBDUFBVTklUX0FTU0VSVCggIWlzdHIuZmFpbCgpICYmICFpc3RyLmVvZigpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGlzdHJfY29udGVudCA9PSAiU1RMIiApOworICB9CisjZW5kaWYKK30KKwordm9pZCBTdHJpbmdUZXN0OjphbGxvY2F0b3Jfd2l0aF9zdGF0ZSgpCit7CisjaWYgIShkZWZpbmVkIChTVExQT1JUKSAmJiBkZWZpbmVkIChfU1RMUF9OT19DVVNUT01fSU8pKSAKKworICBjaGFyIGJ1ZjFbMTAyNF07CisgIFN0YWNrQWxsb2NhdG9yPGNoYXI+IHN0YWNrMShidWYxLCBidWYxICsgc2l6ZW9mKGJ1ZjEpKTsKKworICBjaGFyIGJ1ZjJbMTAyNF07CisgIFN0YWNrQWxsb2NhdG9yPGNoYXI+IHN0YWNrMihidWYyLCBidWYyICsgc2l6ZW9mKGJ1ZjIpKTsKKworICB0eXBlZGVmIGJhc2ljX3N0cmluZzxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiwgU3RhY2tBbGxvY2F0b3I8Y2hhcj4gPiBTdGFja1N0cmluZzsKKyAgeworICAgIFN0YWNrU3RyaW5nIHN0cjEoInN0cmluZyBzdGFjazEiLCBzdGFjazEpOworICAgIFN0YWNrU3RyaW5nIHN0cjFDcHkoc3RyMSk7CisKKyAgICBTdGFja1N0cmluZyBzdHIyKCJzdHJpbmcgc3RhY2syIiwgc3RhY2syKTsKKyAgICBTdGFja1N0cmluZyBzdHIyQ3B5KHN0cjIpOworCisgICAgc3RyMS5zd2FwKHN0cjIpOworCisgICAgQ1BQVU5JVF9BU1NFUlQoIHN0cjEuZ2V0X2FsbG9jYXRvcigpLnN3YXBlZCgpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHN0cjIuZ2V0X2FsbG9jYXRvcigpLnN3YXBlZCgpICk7CisKKyAgICBDUFBVTklUX0FTU0VSVCggc3RyMSA9PSBzdHIyQ3B5ICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHN0cjIgPT0gc3RyMUNweSApOworICAgIENQUFVOSVRfQVNTRVJUKCBzdHIxLmdldF9hbGxvY2F0b3IoKSA9PSBzdGFjazIgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggc3RyMi5nZXRfYWxsb2NhdG9yKCkgPT0gc3RhY2sxICk7CisgIH0KKyAgQ1BQVU5JVF9BU1NFUlQoIHN0YWNrMS5vaygpICk7CisgIENQUFVOSVRfQVNTRVJUKCBzdGFjazIub2soKSApOworICBzdGFjazEucmVzZXQoKTsgc3RhY2syLnJlc2V0KCk7CisKKyAgeworICAgIFN0YWNrU3RyaW5nIHN0cjEoImxvbmdlciBzdHJpbmcgZnJvbSBzdGFjazEgYWxsb2NhdG9yIGluc3RhbmNlIGZvciBkeW5hbWljIGFsbG9jYXRpb24iLCBzdGFjazEpOworICAgIFN0YWNrU3RyaW5nIHN0cjFDcHkoc3RyMSk7CisKKyAgICBTdGFja1N0cmluZyBzdHIyKCJsb25nZXIgc3RyaW5nIGZyb20gc3RhY2syIGFsbG9jYXRvciBpbnN0YW5jZSBmb3IgZHluYW1pYyBhbGxvY2F0aW9uIiwgc3RhY2syKTsKKyAgICBTdGFja1N0cmluZyBzdHIyQ3B5KHN0cjIpOworCisgICAgc3RyMS5zd2FwKHN0cjIpOworCisgICAgQ1BQVU5JVF9BU1NFUlQoIHN0cjEuZ2V0X2FsbG9jYXRvcigpLnN3YXBlZCgpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHN0cjIuZ2V0X2FsbG9jYXRvcigpLnN3YXBlZCgpICk7CisKKyAgICBDUFBVTklUX0FTU0VSVCggc3RyMSA9PSBzdHIyQ3B5ICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHN0cjIgPT0gc3RyMUNweSApOworICAgIENQUFVOSVRfQVNTRVJUKCBzdHIxLmdldF9hbGxvY2F0b3IoKSA9PSBzdGFjazIgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggc3RyMi5nZXRfYWxsb2NhdG9yKCkgPT0gc3RhY2sxICk7CisgIH0KKyAgQ1BQVU5JVF9BU1NFUlQoIHN0YWNrMS5vaygpICk7CisgIENQUFVOSVRfQVNTRVJUKCBzdGFjazIub2soKSApOworICBzdGFjazEucmVzZXQoKTsgc3RhY2syLnJlc2V0KCk7CisKKworICB7CisgICAgU3RhY2tTdHJpbmcgc3RyMSgic3RyaW5nIHN0YWNrMSIsIHN0YWNrMSk7CisgICAgU3RhY2tTdHJpbmcgc3RyMUNweShzdHIxKTsKKworICAgIFN0YWNrU3RyaW5nIHN0cjIoImxvbmdlciBzdHJpbmcgZnJvbSBzdGFjazIgYWxsb2NhdG9yIGluc3RhbmNlIGZvciBkeW5hbWljIGFsbG9jYXRpb24iLCBzdGFjazIpOworICAgIFN0YWNrU3RyaW5nIHN0cjJDcHkoc3RyMik7CisKKyAgICBzdHIxLnN3YXAoc3RyMik7CisKKyAgICBDUFBVTklUX0FTU0VSVCggc3RyMS5nZXRfYWxsb2NhdG9yKCkuc3dhcGVkKCkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggc3RyMi5nZXRfYWxsb2NhdG9yKCkuc3dhcGVkKCkgKTsKKworICAgIENQUFVOSVRfQVNTRVJUKCBzdHIxID09IHN0cjJDcHkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggc3RyMiA9PSBzdHIxQ3B5ICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHN0cjEuZ2V0X2FsbG9jYXRvcigpID09IHN0YWNrMiApOworICAgIENQUFVOSVRfQVNTRVJUKCBzdHIyLmdldF9hbGxvY2F0b3IoKSA9PSBzdGFjazEgKTsKKyAgfQorICBDUFBVTklUX0FTU0VSVCggc3RhY2sxLm9rKCkgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHN0YWNrMi5vaygpICk7CisgIHN0YWNrMS5yZXNldCgpOyBzdGFjazIucmVzZXQoKTsKKworCisgIHsKKyAgICBTdGFja1N0cmluZyBzdHIxKCJsb25nZXIgc3RyaW5nIGZyb20gc3RhY2sxIGFsbG9jYXRvciBpbnN0YW5jZSBmb3IgZHluYW1pYyBhbGxvY2F0aW9uIiwgc3RhY2sxKTsKKyAgICBTdGFja1N0cmluZyBzdHIxQ3B5KHN0cjEpOworCisgICAgU3RhY2tTdHJpbmcgc3RyMigic3RyaW5nIHN0YWNrMiIsIHN0YWNrMik7CisgICAgU3RhY2tTdHJpbmcgc3RyMkNweShzdHIyKTsKKworICAgIHN0cjEuc3dhcChzdHIyKTsKKworICAgIENQUFVOSVRfQVNTRVJUKCBzdHIxLmdldF9hbGxvY2F0b3IoKS5zd2FwZWQoKSApOworICAgIENQUFVOSVRfQVNTRVJUKCBzdHIyLmdldF9hbGxvY2F0b3IoKS5zd2FwZWQoKSApOworCisgICAgQ1BQVU5JVF9BU1NFUlQoIHN0cjEgPT0gc3RyMkNweSApOworICAgIENQUFVOSVRfQVNTRVJUKCBzdHIyID09IHN0cjFDcHkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggc3RyMS5nZXRfYWxsb2NhdG9yKCkgPT0gc3RhY2syICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHN0cjIuZ2V0X2FsbG9jYXRvcigpID09IHN0YWNrMSApOworICB9CisgIENQUFVOSVRfQVNTRVJUKCBzdGFjazEub2soKSApOworICBDUFBVTklUX0FTU0VSVCggc3RhY2syLm9rKCkgKTsKKyAgc3RhY2sxLnJlc2V0KCk7IHN0YWNrMi5yZXNldCgpOworI2VuZGlmCit9CisKK3ZvaWQgU3RyaW5nVGVzdDo6Y2FwYWNpdHkoKQoreworICBzdHJpbmcgczsKKworICBDUFBVTklUX0NIRUNLKCBzLmNhcGFjaXR5KCkgPiAwICk7CisgIENQUFVOSVRfQ0hFQ0soIHMuY2FwYWNpdHkoKSA8IHMubWF4X3NpemUoKSApOworICBDUFBVTklUX0NIRUNLKCBzLmNhcGFjaXR5KCkgPj0gcy5zaXplKCkgKTsKKworI2lmbmRlZiBfU1RMUF9TSE9SVF9TVFJJTkdfU1oKKyMgIGRlZmluZSBfU1RMUF9TSE9SVF9TVFJJTkdfU1ogMTYgLy8gc2VlIHN0bHBvcnQvc3RsL19zdHJpbmdfYmFzZS5oCisjZW5kaWYKKworICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBfU1RMUF9TSE9SVF9TVFJJTkdfU1ogKyAyOyArK2kgKSB7CisgICAgcyArPSAnICc7CisgICAgQ1BQVU5JVF9DSEVDSyggcy5jYXBhY2l0eSgpID4gMCApOworICAgIENQUFVOSVRfQ0hFQ0soIHMuY2FwYWNpdHkoKSA8IHMubWF4X3NpemUoKSApOworICAgIENQUFVOSVRfQ0hFQ0soIHMuY2FwYWNpdHkoKSA+PSBzLnNpemUoKSApOworICB9Cit9CisKK3ZvaWQgU3RyaW5nVGVzdDo6Y29uY2F0MjQoKQoreworICBzdHJpbmcgcyA9IHN0cmluZyggIjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCIgKSArIHN0cmluZyggIjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCIgKTsKKworICBDUFBVTklUX0NIRUNLKCBzLmxlbmd0aCgpID09IDQ4ICk7CisgIENQUFVOSVRfQ0hFQ0soIHNbMjNdID09ICc0JyApOworICBDUFBVTklUX0NIRUNLKCBzWzI0XSA9PSAnMScgKTsKKyAgQ1BQVU5JVF9DSEVDSyggc1s0N10gPT0gJzQnICk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvc3Ryc3RyZWFtX2J1ZmZlcl9yZWFkX3Rlc3QuY3BwIGIvdGVzdC91bml0L3N0cnN0cmVhbV9idWZmZXJfcmVhZF90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzhhYzBjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L3N0cnN0cmVhbV9idWZmZXJfcmVhZF90ZXN0LmNwcApAQCAtMCwwICsxLDM1IEBACisvKgorICogTm90ZTogU3Ryc3RyZWFtcyBhcmUgcmVhbGx5IGJyb2tlbiBpbiBTVExwb3J0LiBCdXQgc3Ryc3RyZWFtcyBhcmUgCisgKiBvYnNvbGV0ZSwgYW5kIGV2ZW4gaWYgb25lcyB3YXMgbWVudGlvbmVkIGluIEQ3LjEtLUQ3LjQgb2YgCisgKiBTdGFuZGFyZCwgd2UgaGF2ZSBubyB3aXNoIHRvIHNwZW50IHRpbWUgd2l0aCByZXBhaXIgb25lcy4KKyAqLworI2lmICFkZWZpbmVkIChfU1RMUF9OT19JT1NUUkVBTVMpCisjICBpbmNsdWRlIDxzdHJzdHJlYW0+CisKKyMgIGluY2x1ZGUgImNwcHVuaXQvY3BwdW5pdF9wcm94eS5oIgorCisjICBpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZChfU1RMUF9VU0VfTkFNRVNQQUNFUykKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisjICBlbmRpZgorCitjbGFzcyBTdHJzdHJlYW1CdWZmZXJUZXN0IDogcHVibGljIENQUFVOSVRfTlM6OlRlc3RDYXNlCit7CisgIENQUFVOSVRfVEVTVF9TVUlURShTdHJzdHJlYW1CdWZmZXJUZXN0KTsKKyAgQ1BQVU5JVF9URVNUKHJlYWRfZnJvbV9idWZmZXIpOworICBDUFBVTklUX1RFU1RfU1VJVEVfRU5EKCk7CisKK3Byb3RlY3RlZDoKKyAgdm9pZCByZWFkX2Zyb21fYnVmZmVyKCk7Cit9OworCitDUFBVTklUX1RFU1RfU1VJVEVfUkVHSVNUUkFUSU9OKFN0cnN0cmVhbUJ1ZmZlclRlc3QpOworCit2b2lkIFN0cnN0cmVhbUJ1ZmZlclRlc3Q6OnJlYWRfZnJvbV9idWZmZXIoKQoreworICBjaGFyIGhlbGxvW10gPSAiSGVsbG8iOworICBzdHJzdHJlYW0gc3RyZWFtKGhlbGxvLCBzaXplb2YoaGVsbG8pLCBpb3NfYmFzZTo6aW4pOworICBjaGFyIGN1cjsKKyAgc3RyZWFtID4+IGN1cjsKKyAgQ1BQVU5JVF9BU1NFUlQoY3VyID09ICdIJyk7IAorfQorI2VuZGlmCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvc3Ryc3RyZWFtX2hlYWRlcl90ZXN0LmNwcCBiL3Rlc3QvdW5pdC9zdHJzdHJlYW1faGVhZGVyX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNzUwNGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvc3Ryc3RyZWFtX2hlYWRlcl90ZXN0LmNwcApAQCAtMCwwICsxLDEwIEBACisvKiBUaGlzIHRlc3QgcHVycG9zZSBpcyBzaW1wbHkgdG8gY2hlY2sgU3RhbmRhcmQgaGVhZGVyIGluZGVwZW5kYW5jeSB0aGF0CisgKiBpcyB0byBzYXkgdGhhdCB0aGUgaGVhZGVyIGNhbiBiZSBpbmNsdWRlZCBhbG9uZSB3aXRob3V0IGFueSBwcmV2aW91cworICogaW5jbHVkZS4KKyAqIEFkZGl0aW9ubmFseSwgZm9yIEMgU3RhbmRhcmQgaGVhZGVycyB0aGF0IFNUTHBvcnQgZXhwb3NlLCBpdCBjYW4gYWxzbyBiZQorICogdXNlZCB0byBjaGVjayB0aGF0IGZpbGVzIGluY2x1ZGVkIGJ5IHRob3NlIGhlYWRlcnMgYXJlIGNvbXBhdGlibGUgd2l0aAorICogcHVyZSBDIGNvbXBpbGVycy4KKyAqLworI2lmICFkZWZpbmVkIChfU1RMUF9OT19JT1NUUkVBTVMpCisjICBpbmNsdWRlIDxzdHJzdHJlYW0+CisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9zdHJzdHJlYW1fdGVzdC5jcHAgYi90ZXN0L3VuaXQvc3Ryc3RyZWFtX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NTU3MGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvc3Ryc3RyZWFtX3Rlc3QuY3BwCkBAIC0wLDAgKzEsNDkgQEAKKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgIWRlZmluZWQgKF9TVExQX1VTRV9OT19JT1NUUkVBTVMpCisjICBpbmNsdWRlIDxzdHJzdHJlYW0+CisjICBpbmNsdWRlIDxsaW1pdHM+CisKKyMgIGluY2x1ZGUgImNwcHVuaXQvY3BwdW5pdF9wcm94eS5oIgorCisjICBpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZChfU1RMUF9VU0VfTkFNRVNQQUNFUykKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisjICBlbmRpZgorCisvLworLy8gVGVzdENhc2UgY2xhc3MKKy8vCitjbGFzcyBTdHJzdHJlYW1UZXN0IDogcHVibGljIENQUFVOSVRfTlM6OlRlc3RDYXNlCit7CisgIENQUFVOSVRfVEVTVF9TVUlURShTdHJzdHJlYW1UZXN0KTsKKyAgQ1BQVU5JVF9URVNUKGlucHV0KTsKKyAgQ1BQVU5JVF9URVNUX1NVSVRFX0VORCgpOworCitwcml2YXRlOgorICB2b2lkIGlucHV0KCk7Cit9OworCitDUFBVTklUX1RFU1RfU1VJVEVfUkVHSVNUUkFUSU9OKFN0cnN0cmVhbVRlc3QpOworCisvLworLy8gdGVzdHMgaW1wbGVtZW50YXRpb24KKy8vCit2b2lkIFN0cnN0cmVhbVRlc3Q6OmlucHV0KCkKK3sKKyMgIGlmIGRlZmluZWQgKFNUTFBPUlQpICYmIGRlZmluZWQgKF9TVExQX0xPTkdfTE9ORykKKyAgeworICAgIGlzdHJzdHJlYW0gaXMoIjY1MjIwODMwNyIpOworICAgIF9TVExQX0xPTkdfTE9ORyBydmFsID0gMDsKKyAgICBpcyA+PiBydmFsOworICAgIENQUFVOSVRfQVNTRVJUKCBydmFsID09IDY1MjIwODMwNyApOworICB9CisgIHsKKyAgICBpc3Ryc3RyZWFtIGlzKCItNjUyMjA4MzA3Iik7CisgICAgX1NUTFBfTE9OR19MT05HIHJ2YWwgPSAwOworICAgIGlzID4+IHJ2YWw7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHJ2YWwgPT0gLTY1MjIwODMwNyApOworICB9Cit9CisjICBlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9zd2FwX3Rlc3QuY3BwIGIvdGVzdC91bml0L3N3YXBfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU2Y2FiZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9zd2FwX3Rlc3QuY3BwCkBAIC0wLDAgKzEsMTY1IEBACisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8cXVldWU+CisKKyNpZiAwIC8qIHRlbXBvcmFyeTogaW52ZXN0aWdhdGlvbiBvZiBwcm9ibGVtIHdpdGggc3dhcCAqLworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHR5cGVpbmZvPgorI2VuZGlmCisKKyNpbmNsdWRlICJjcHB1bml0L2NwcHVuaXRfcHJveHkuaCIKKworI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkKF9TVExQX1VTRV9OQU1FU1BBQ0VTKQordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyNlbmRpZgorCisvLworLy8gVGVzdENhc2UgY2xhc3MKKy8vCitjbGFzcyBTd2FwVGVzdCA6IHB1YmxpYyBDUFBVTklUX05TOjpUZXN0Q2FzZQoreworICBDUFBVTklUX1RFU1RfU1VJVEUoU3dhcFRlc3QpOworICBDUFBVTklUX1RFU1Qoc3dhcDEpOworICBDUFBVTklUX1RFU1Qoc3dwcm5nZTEpOworICBDUFBVTklUX1RFU1Qoc3dhcF9jb250YWluZXJfbm9uX3NwZWMpOworI2lmIGRlZmluZWQgKFNUTFBPUlQpICYmIFwKKyAgICFkZWZpbmVkIChfU1RMUF9GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIpICYmICFkZWZpbmVkIChfU1RMUF9VU0VfUEFSVElBTF9TUEVDX1dPUktBUk9VTkQpCisgIENQUFVOSVRfSUdOT1JFOworI2VuZGlmCisgIENQUFVOSVRfVEVTVChzd2FwX2NvbnRhaW5lcl9zcGVjKTsKKyAgQ1BQVU5JVF9URVNUX1NVSVRFX0VORCgpOworCitwcm90ZWN0ZWQ6CisgIHZvaWQgc3dhcDEoKTsKKyAgdm9pZCBzd3BybmdlMSgpOworICB2b2lkIHN3YXBfY29udGFpbmVyX25vbl9zcGVjKCk7CisgIHZvaWQgc3dhcF9jb250YWluZXJfc3BlYygpOworfTsKKworQ1BQVU5JVF9URVNUX1NVSVRFX1JFR0lTVFJBVElPTihTd2FwVGVzdCk7CisKKy8vCisvLyB0ZXN0cyBpbXBsZW1lbnRhdGlvbgorLy8KK3ZvaWQgU3dhcFRlc3Q6OnN3YXAxKCkKK3sKKyAgaW50IGEgPSA0MjsKKyAgaW50IGIgPSAxOTsKKyAgc3dhcChhLCBiKTsKKworICBDUFBVTklUX0FTU0VSVChhPT0xOSk7CisgIENQUFVOSVRfQVNTRVJUKGI9PTQyKTsKK30KKwordm9pZCBTd2FwVGVzdDo6c3dwcm5nZTEoKQoreworICBjaGFyIHdvcmQxW10gPSAiV29ybGQiOworICBjaGFyIHdvcmQyW10gPSAiSGVsbG8iOworICBzd2FwX3JhbmdlcygoY2hhciopd29yZDEsIChjaGFyKil3b3JkMSArIDo6c3RybGVuKHdvcmQxKSwgKGNoYXIqKXdvcmQyKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIXN0cmNtcCh3b3JkMSwgIkhlbGxvIikpOworICBDUFBVTklUX0FTU0VSVCghc3RyY21wKHdvcmQyLCAiV29ybGQiKSk7Cit9CisKK2NsYXNzIE9iagoreworICBwdWJsaWM6CisgICAgT2JqKCkgOgorICAgICAgICB2KCAwICkKKyAgICAgIHsgfQorICAgIE9iaiggY29uc3QgT2JqJiApIDoKKyAgICAgICAgdiggMSApCisgICAgICB7IH0KKworICAgIE9iaiYgb3BlcmF0b3IgPSggY29uc3QgT2JqJiApCisgICAgICB7IHYgPSAyOyByZXR1cm4gKnRoaXM7IH0KKworICAgIGludCB2OworfTsKKworLyoKKyAqIEZvbGxvd2luZyB0d28gdGVzdHMgY2hlY2sgdGhlIGNvcmVjdG5lc3Mgb2Ygc3BlY2lhbGl6YXRpb24gb2Ygc3dhcCgpOgorICogZm9yIGNvbnRhaW5lcnMgd2l0aCBjb250YWluZXI6OnN3YXAgbWV0aG9kIHN3YXAoIGEsIGIgKSBzaG91bGQKKyAqIHVzZSBhLnN3YXAoIGIgKSwgYnV0IGRvbid0IHRyeSB0byBkbyB0aGlzIHN1YnN0aXR1dGlvbiBmb3IgY29udGFpbmVyCisgKiB3aXRob3V0IHN3YXAgbWV0aG9kIChpbiB0aGlzIGNhc2Ugc3dhcCBzaG91bGQgYmUgbWFkZSB2aWEgZXhwbGljaXQgbWVtYmVycworICogZXhjaGFuZ2U7IHRoaXMgYXNzdW1lIHVzYWdlIG9mIHRlbXBvcmFyeSBvYmplY3QpCisgKgorICovCit2b2lkIFN3YXBUZXN0Ojpzd2FwX2NvbnRhaW5lcl9ub25fc3BlYygpCit7CisgIHF1ZXVlPE9iaj4gdjE7CisgIHF1ZXVlPE9iaj4gdjI7CisKKyAgdjEucHVzaCggT2JqKCkgKTsKKyAgdjEuYmFjaygpLnYgPSAtMTsKKyAgdjEucHVzaCggT2JqKCkgKTsKKyAgdjEuYmFjaygpLnYgPSAtMjsKKworICB2Mi5wdXNoKCBPYmooKSApOworICB2Mi5iYWNrKCkudiA9IDEwOyAgCisgIHYyLnB1c2goIE9iaigpICk7CisgIHYyLmJhY2soKS52ID0gMTE7CisgIHYyLnB1c2goIE9iaigpICk7CisgIHYyLmJhY2soKS52ID0gMTI7CisKKyAgQ1BQVU5JVF9DSEVDSyggdjEuc2l6ZSgpID09IDIgKTsKKyAgQ1BQVU5JVF9DSEVDSyggdjIuc2l6ZSgpID09IDMgKTsKKworICBzd2FwKCB2MSwgdjIgKTsgLy8gdGhpcyBzaG91bGRuJ3QgdHJ5IG1ha2UgaXQgYXMgdjEuc3dhcCggdjIgKSwgbm8gcXVldWU6OnN3YXAgbWV0aG9kIQorCisgIENQUFVOSVRfQ0hFQ0soIHYxLnNpemUoKSA9PSAzICk7CisgIENQUFVOSVRfQ0hFQ0soIHYyLnNpemUoKSA9PSAyICk7CisKKyAgLy8gZWl0aGVyIGNvcHkgY29uc3RydWN0b3Igb3IgYXNzaWdubWVudCBvcGVyYXRvcgorICBDUFBVTklUX0NIRUNLKCB2MS5mcm9udCgpLnYgPT0gMSB8fCB2MS5mcm9udCgpLnYgPT0gMiApOworICBDUFBVTklUX0NIRUNLKCB2MS5iYWNrKCkudiA9PSAxIHx8IHYxLmJhY2soKS52ID09IDIgKTsKKyAgQ1BQVU5JVF9DSEVDSyggdjIuZnJvbnQoKS52ID09IDEgfHwgdjIuZnJvbnQoKS52ID09IDIgKTsKKyAgQ1BQVU5JVF9DSEVDSyggdjIuYmFjaygpLnYgPT0gMSB8fCB2Mi5iYWNrKCkudiA9PSAyICk7Cit9CisKK3ZvaWQgU3dhcFRlc3Q6OnN3YXBfY29udGFpbmVyX3NwZWMoKQoreworI2lmIDAgLyogdGVtcG9yYXJ5OiBpbnZlc3RpZ2F0aW9uIG9mIHByb2JsZW0gd2l0aCBzd2FwICovCisgIGlmICggdHlwZWlkKC8qIF9TVExQX1BSSVYgKi8gX1N3YXBJbXBsZW1lbnRlZDx2ZWN0b3I8T2JqPiA+OjpfUmV0KSA9PSB0eXBlaWQoX1NUTFBfUFJJViBfX2ZhbHNlX3R5cGUpICkgeworICAgIGNlcnIgPDwgImZhbHNlIHR5cGUiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAoIHR5cGVpZCgvKiBfU1RMUF9QUklWICovIF9Td2FwSW1wbGVtZW50ZWQ8dmVjdG9yPE9iaj4gPjo6X1JldCkgPT0gdHlwZWlkKF9TVExQX1BSSVYgX190cnVlX3R5cGUpICkgeworICAgIGNlcnIgPDwgInRydWUgdHlwZSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBjZXJyIDw8ICJ1bmtub3duIHR5cGUiIDw8IGVuZGw7CisgIH0KKyNlbmRpZiAvKiBlbmQgb2YgdGVtcG9yYXJ5ICovCisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IFwKKyAgICAgZGVmaW5lZCAoX1NUTFBfRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSKSB8fCBkZWZpbmVkIChfU1RMUF9VU0VfUEFSVElBTF9TUEVDX1dPUktBUk9VTkQpCisgIHZlY3RvcjxPYmo+IHYxOworICB2ZWN0b3I8T2JqPiB2MjsKKworICB2MS5wdXNoX2JhY2soIE9iaigpICk7CisgIHYxLnB1c2hfYmFjayggT2JqKCkgKTsKKworICB2MVswXS52ID0gLTE7CisgIHYxWzFdLnYgPSAtMjsKKworICB2Mi5wdXNoX2JhY2soIE9iaigpICk7CisgIHYyLnB1c2hfYmFjayggT2JqKCkgKTsKKyAgdjIucHVzaF9iYWNrKCBPYmooKSApOworCisgIHYyWzBdLnYgPSAxMDsKKyAgdjJbMV0udiA9IDExOworICB2MlsyXS52ID0gMTI7CisKKyAgQ1BQVU5JVF9DSEVDSyggdjEuc2l6ZSgpID09IDIgKTsKKyAgQ1BQVU5JVF9DSEVDSyggdjIuc2l6ZSgpID09IDMgKTsKKworICBzd2FwKCB2MSwgdjIgKTsgLy8gdGhpcyBzaG91bGQgaGFzIGVmZmVjdCB2MS5zd2FwKCB2MiApCisKKyAgQ1BQVU5JVF9DSEVDSyggdjEuc2l6ZSgpID09IDMgKTsKKyAgQ1BQVU5JVF9DSEVDSyggdjIuc2l6ZSgpID09IDIgKTsKKworICBDUFBVTklUX0NIRUNLKCB2MVswXS52ID09IDEwICk7CisgIENQUFVOSVRfQ0hFQ0soIHYxWzFdLnYgPT0gMTEgKTsKKyAgQ1BQVU5JVF9DSEVDSyggdjFbMl0udiA9PSAxMiApOworCisgIENQUFVOSVRfQ0hFQ0soIHYyWzBdLnYgPT0gLTEgKTsKKyAgQ1BQVU5JVF9DSEVDSyggdjJbMV0udiA9PSAtMiApOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvdGVzdF9lcnJuby5jcHAgYi90ZXN0L3VuaXQvdGVzdF9lcnJuby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ3N2QzYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC90ZXN0X2Vycm5vLmNwcApAQCAtMCwwICsxLDU2IEBACisvL1dlIGFyZSBpbmNsdWRpbmcgc3RkbGliLmggYW5kIHN0ZGRlZi5oIGZpcnN0IGJlY2F1c2UgdW5kZXIgTVNWQworLy90aG9zZSBoZWFkZXJzIGNvbnRhaW5zIGEgZXJybm8gbWFjcm8gZGVmaW5pdGlvbiB3aXRob3V0IHRoZSB1bmRlcmx5aW5nIHZhbHVlCisvL2RlZmluaXRpb24uCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGVycm5vLmg+IC8vIG5vdCB0eXBvLCBjaGVjayBlcnJubyBkZWYvdW5kZWYvcmVkZWYKKworI2lmbmRlZiBfU1RMUF9XQ0UKKworI2luY2x1ZGUgImNwcHVuaXQvY3BwdW5pdF9wcm94eS5oIgorCisvLworLy8gVGVzdENhc2UgY2xhc3MKKy8vCitjbGFzcyBFcnJub1Rlc3QgOiBwdWJsaWMgQ1BQVU5JVF9OUzo6VGVzdENhc2UKK3sKKyAgQ1BQVU5JVF9URVNUX1NVSVRFKEVycm5vVGVzdCk7CisgIENQUFVOSVRfVEVTVChjaGVjayk7CisgIENQUFVOSVRfVEVTVF9TVUlURV9FTkQoKTsKKworcHJvdGVjdGVkOgorICB2b2lkIGNoZWNrKCk7Cit9OworCitDUFBVTklUX1RFU1RfU1VJVEVfUkVHSVNUUkFUSU9OKEVycm5vVGVzdCk7CisKK3ZvaWQgRXJybm9UZXN0OjpjaGVjaygpCit7CisgIC8vV2UgYXJlIHVzaW5nIEVSQU5HRSBhcyBpdCBpcyBwYXJ0IG9mIHRoZSBDKysgSVNPIChzZWUgVGFibGUgMjYgaW4gc2VjdGlvbiAxOS4zKQorICAvL1VzaW5nIEVSQU5HRSBpbXByb3ZlIHRoZSB0ZXN0IGFzIGl0IG1lYW5zIHRoYXQgdGhlIG5hdGl2ZSBlcnJuby5oIGZpbGUgaGFzIHJlYWxseQorICAvL2JlZW4gaW5jbHVkZWQuCisgIGVycm5vID0gRVJBTkdFOworCisgIENQUFVOSVRfQVNTRVJUKCBlcnJubyA9PSBFUkFOR0UgKTsKKyAgZXJybm8gPSAwOworCisvKiBOb3RlOiBpbiBjb21tb24sIHlvdSBjYW4ndCB3cml0ZSA6OmVycm5vIG9yIHN0ZDo6ZXJybm8sCisgKiBkdWUgdG8gZXJybm8gaW4gbW9zdCBjYXNlcyBpcyBqdXN0IGEgbWFjcm8sIHRoYXQgZnJlcXVlbnRseQorICogKGluIE1UIGVudmlyb25tZW50IGVycm5vIGlzIGEgcGVyLXRocmVhZCB2YWx1ZSkgZXhwYW5kIHRvIHNvbWV0aGluZyBsaWtlCisgKiAoKl9fZXJybm9fbG9jYXRpb24oKSkuIEkgZG9uJ3Qga25vdyB3YXkgaG93IG1hc3F1ZXJhZGUgc3VjaAorICogdGhpbmdzOiBuYW1lIG9mIG1hY3JvIGNhbid0IGluY2x1ZGUgOjouCisgKgorICogICAgICAgICAgICAgICAgLSBwdHIsIDIwMDUtMDMtMzAKKyAqLworIyBpZiAwCisgIGlmICggOjplcnJubyAhPSAwICkgeworICAgIHJldHVybiAxOworICB9CisgIGlmICggc3RkOjplcnJubyAhPSAwICkgeworICAgIHJldHVybiAxOworICB9CisjIGVuZGlmCit9CisjZW5kaWYgLy8gX1NUTFBfV0NFCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvdGltZV9mYWNldHNfdGVzdC5jcHAgYi90ZXN0L3VuaXQvdGltZV9mYWNldHNfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTlhN2EzYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC90aW1lX2ZhY2V0c190ZXN0LmNwcApAQCAtMCwwICsxLDQwMiBAQAorI2luY2x1ZGUgImxvY2FsZV90ZXN0LmgiCisKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgIWRlZmluZWQgKF9TVExQX1VTRV9OT19JT1NUUkVBTVMpCisjICBpbmNsdWRlIDxsb2NhbGU+CisjICBpbmNsdWRlIDxzc3RyZWFtPgorIyAgaW5jbHVkZSA8bWVtb3J5PgorIyAgaW5jbHVkZSA8c3RkZXhjZXB0PgorCisjICBpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZChfU1RMUF9VU0VfTkFNRVNQQUNFUykKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisjICBlbmRpZgorCitzdGF0aWMgY29uc3QgY2hhciogdGVzdGVkX2xvY2FsZXNbXSA9IHsKKy8vIG5hbWUsCisjICBpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZCAoX1NUTFBfVVNFX0VYQ0VQVElPTlMpCisgICAiZnJfRlIiLAorICAgInJ1X1JVLmtvaThyIiwKKyAgICJlbl9HQiIsCisgICAiZW5fVVMiLAorIyAgZW5kaWYKKyAgICIiLAorICAgIkMiCit9OworCit2b2lkIExvY2FsZVRlc3Q6Ol90aW1lX3B1dF9nZXQoIGNvbnN0IGxvY2FsZSYgbG9jICkKK3sKKyAgeworICAgIHR5cGVkZWYgdGltZV9wdXQ8Y2hhciwgb3N0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+ID4gdGltZV9wdXRfZmFjZXQ7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGhhc19mYWNldDx0aW1lX3B1dF9mYWNldD4obG9jKSApOworICAgIGNvbnN0IHRpbWVfcHV0X2ZhY2V0JiB0bXAgPSB1c2VfZmFjZXQ8dGltZV9wdXRfZmFjZXQ+KGxvYyk7CisKKyAgICBzdHJ1Y3QgdG0geG1hcyA9IHsgMCwgMCwgMTIsIDI1LCAxMSwgOTMgfTsKKyAgICBvc3RyaW5nc3RyZWFtIG9zdHI7CisgICAgb3N0ci5pbWJ1ZShsb2MpOworICAgIHN0cmluZyBmb3JtYXQgPSAiJUIgJWQgJVkiOworCisgICAgdGltZV9wdXRfZmFjZXQ6Oml0ZXJfdHlwZSByZXQgPSB0bXAucHV0KG9zdHIsIG9zdHIsICcgJywgJnhtYXMsIGZvcm1hdC5kYXRhKCksIGZvcm1hdC5kYXRhKCkgKyBmb3JtYXQuc2l6ZSgpKTsKKyAgICBDUFBVTklUX0FTU0VSVCggIXJldC5mYWlsZWQoKSApOworCisgICAgLyoKKyAgICAgKiBJbiBvdGhlciB3b3JkcywgdXNlciBjb25mb3JtYXRpb24gaXMgcmVxdWlyZWQgZm9yIHJlbGlhYmxlIHBhcnNpbmcKKyAgICAgKiBvZiB1c2VyLWVudGVyZWQgZGF0ZXMgYW5kIHRpbWVzLCBidXQgbWFjaGluZS1nZW5lcmF0ZWQgZm9ybWF0cyBjYW4gYmUKKyAgICAgKiBwYXJzZWQgcmVsaWFibHkuIFRoaXMgYWxsb3dzIHBhcnNlcnMgdG8gYmUgYWdncmVzc2l2ZSBhYm91dCBpbnRlcnByZXRpbmcKKyAgICAgKiB1c2VyIHZhcmlhdGlvbnMgb24gc3RhbmRhcmQgZm9ybWF0LgorICAgICAqCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU08vSUVDIDE0ODgyLCAyMi4yLjUuMQorICAgICAqLworICAgIHR5cGVkZWYgdGltZV9nZXQ8Y2hhciwgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+ID4gdGltZV9nZXRfZmFjZXQ7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGhhc19mYWNldDx0aW1lX2dldF9mYWNldD4obG9jKSApOworICAgIGNvbnN0IHRpbWVfZ2V0X2ZhY2V0JiB0bWcgPSB1c2VfZmFjZXQ8dGltZV9nZXRfZmFjZXQ+KGxvYyk7CisgICAgYmFzaWNfaW9zPGNoYXI+IGlvKDApOworICAgIGlvLmltYnVlKGxvYyk7CisKKyAgICBpc3RyaW5nc3RyZWFtIGlzdHIoIG9zdHIuc3RyKCkgKTsKKyAgICBpc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4gaSggaXN0ciApOworICAgIGlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiBlOworICAgIGlvc19iYXNlOjppb3N0YXRlIGVyciA9IGlvc19iYXNlOjpnb29kYml0OworICAgIHN0cnVjdCB0bSBvdGhlciA9IHsgMTUsIDIwLCA5LCAxNCwgNywgMTA1IH07CisKKyAgICBpID0gdG1nLmdldF9tb250aG5hbWUoIGksIGUsIGlvLCBlcnIsICZvdGhlciApOworICAgIENQUFVOSVRfQVNTRVJUKCBlcnIgPT0gaW9zX2Jhc2U6Omdvb2RiaXQgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggb3RoZXIudG1fbW9uID09IHhtYXMudG1fbW9uICk7CisKKyAgICArK2k7ICsraTsgKytpOyArK2k7IC8vIHNraXAgZGF5IG9mIG1vbnRoIGFuZCBzcGFjZXMgYXJvdW5kIGl0CisgICAgaSA9IHRtZy5nZXRfeWVhciggaSwgZSwgaW8sIGVyciwgJm90aGVyICk7CisKKyAgICBDUFBVTklUX0FTU0VSVCggZXJyID09IGlvc19iYXNlOjplb2ZiaXQgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggb3RoZXIudG1feWVhciA9PSB4bWFzLnRtX3llYXIgKTsKKworICAgIG9zdHJpbmdzdHJlYW0gb3N0clg7CisgICAgb3N0clguaW1idWUobG9jKTsKKyAgICBmb3JtYXQgPSAiJXggJVgiOworCisgICAgcmV0ID0gdG1wLnB1dChvc3RyWCwgb3N0clgsICcgJywgJnhtYXMsIGZvcm1hdC5kYXRhKCksIGZvcm1hdC5kYXRhKCkgKyBmb3JtYXQuc2l6ZSgpKTsKKyAgICBDUFBVTklUX0FTU0VSVCggIXJldC5mYWlsZWQoKSApOworCisgICAgaXN0cmluZ3N0cmVhbSBpc3RyWCggb3N0clguc3RyKCkgKTsKKyAgICBpc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4gaiggaXN0clggKTsKKworICAgIGVyciA9IGlvc19iYXNlOjpnb29kYml0OworCisgICAgc3RydWN0IHRtIHlldF9tb3JlID0geyAxNSwgMjAsIDksIDE0LCA3LCAxMDUgfTsKKworICAgIGogPSB0bWcuZ2V0X2RhdGUoIGosIGUsIGlvLCBlcnIsICZ5ZXRfbW9yZSApOworCisgICAgQ1BQVU5JVF9BU1NFUlQoIGVyciA9PSBpb3NfYmFzZTo6Z29vZGJpdCApOworCisgICAgQ1BQVU5JVF9BU1NFUlQoIHlldF9tb3JlLnRtX3NlYyAhPSB4bWFzLnRtX3NlYyApOworICAgIENQUFVOSVRfQVNTRVJUKCB5ZXRfbW9yZS50bV9taW4gIT0geG1hcy50bV9taW4gKTsKKyAgICBDUFBVTklUX0FTU0VSVCggeWV0X21vcmUudG1faG91ciAhPSB4bWFzLnRtX2hvdXIgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggeWV0X21vcmUudG1fbWRheSA9PSB4bWFzLnRtX21kYXkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggeWV0X21vcmUudG1fbW9uID09IHhtYXMudG1fbW9uICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHlldF9tb3JlLnRtX3llYXIgPT0geG1hcy50bV95ZWFyICk7CisKKyAgICArK2o7IC8vIHNraXAgc3BhY2UKKworICAgIGogPSB0bWcuZ2V0X3RpbWUoIGosIGUsIGlvLCBlcnIsICZ5ZXRfbW9yZSApOworCisgICAgQ1BQVU5JVF9BU1NFUlQoIGVyciA9PSBpb3NfYmFzZTo6ZW9mYml0IHx8IGVyciA9PSBpb3NfYmFzZTo6Z29vZGJpdCApOworCisgICAgQ1BQVU5JVF9BU1NFUlQoIHlldF9tb3JlLnRtX3NlYyA9PSB4bWFzLnRtX3NlYyApOworICAgIENQUFVOSVRfQVNTRVJUKCB5ZXRfbW9yZS50bV9taW4gPT0geG1hcy50bV9taW4gKTsKKyAgICBDUFBVTklUX0FTU0VSVCggeWV0X21vcmUudG1faG91ciA9PSB4bWFzLnRtX2hvdXIgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggeWV0X21vcmUudG1fbWRheSA9PSB4bWFzLnRtX21kYXkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggeWV0X21vcmUudG1fbW9uID09IHhtYXMudG1fbW9uICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHlldF9tb3JlLnRtX3llYXIgPT0geG1hcy50bV95ZWFyICk7CisgIH0KKyMgIGlmICFkZWZpbmVkIChTVExQT1JUKSB8fCAhZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkKKyAgeworICAgIHR5cGVkZWYgdGltZV9wdXQ8d2NoYXJfdCwgb3N0cmVhbWJ1Zl9pdGVyYXRvcjx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+ID4gdGltZV9wdXRfZmFjZXQ7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGhhc19mYWNldDx0aW1lX3B1dF9mYWNldD4obG9jKSApOworICAgIGNvbnN0IHRpbWVfcHV0X2ZhY2V0JiB0bXAgPSB1c2VfZmFjZXQ8dGltZV9wdXRfZmFjZXQ+KGxvYyk7CisKKyAgICBzdHJ1Y3QgdG0geG1hcyA9IHsgMCwgMCwgMTIsIDI1LCAxMSwgOTMgfTsKKyAgICB3b3N0cmluZ3N0cmVhbSBvc3RyOworICAgIG9zdHIuaW1idWUobG9jKTsKKyAgICB3c3RyaW5nIGZvcm1hdCA9IEwiJUIgJWQgJVkiOworCisgICAgdGltZV9wdXRfZmFjZXQ6Oml0ZXJfdHlwZSByZXQgPSB0bXAucHV0KG9zdHIsIG9zdHIsICcgJywgJnhtYXMsIGZvcm1hdC5kYXRhKCksIGZvcm1hdC5kYXRhKCkgKyBmb3JtYXQuc2l6ZSgpKTsKKyAgICBDUFBVTklUX0FTU0VSVCggIXJldC5mYWlsZWQoKSApOworCisgICAgLyoKKyAgICAgKiBJbiBvdGhlciB3b3JkcywgdXNlciBjb25mb3JtYXRpb24gaXMgcmVxdWlyZWQgZm9yIHJlbGlhYmxlIHBhcnNpbmcKKyAgICAgKiBvZiB1c2VyLWVudGVyZWQgZGF0ZXMgYW5kIHRpbWVzLCBidXQgbWFjaGluZS1nZW5lcmF0ZWQgZm9ybWF0cyBjYW4gYmUKKyAgICAgKiBwYXJzZWQgcmVsaWFibHkuIFRoaXMgYWxsb3dzIHBhcnNlcnMgdG8gYmUgYWdncmVzc2l2ZSBhYm91dCBpbnRlcnByZXRpbmcKKyAgICAgKiB1c2VyIHZhcmlhdGlvbnMgb24gc3RhbmRhcmQgZm9ybWF0LgorICAgICAqCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU08vSUVDIDE0ODgyLCAyMi4yLjUuMQorICAgICAqLworICAgIHR5cGVkZWYgdGltZV9nZXQ8d2NoYXJfdCwgaXN0cmVhbWJ1Zl9pdGVyYXRvcjx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+ID4gdGltZV9nZXRfZmFjZXQ7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGhhc19mYWNldDx0aW1lX2dldF9mYWNldD4obG9jKSApOworICAgIGNvbnN0IHRpbWVfZ2V0X2ZhY2V0JiB0bWcgPSB1c2VfZmFjZXQ8dGltZV9nZXRfZmFjZXQ+KGxvYyk7CisgICAgLy8gSW50ZW50aW9uYWwgaW5zdGFudGlhdGlvbiB3aXRoIGNoYXIgdG8gc2hvdyBhIGJ1ZyBpbiBhIHByZXZpb3VzIFNUTHBvcnQgdmVyc2lvbi4KKyAgICBiYXNpY19pb3M8Y2hhcj4gaW8oMCk7CisgICAgaW8uaW1idWUobG9jKTsKKworICAgIHdpc3RyaW5nc3RyZWFtIGlzdHIoIG9zdHIuc3RyKCkgKTsKKyAgICBpc3RyZWFtYnVmX2l0ZXJhdG9yPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4gaSggaXN0ciApOworICAgIGlzdHJlYW1idWZfaXRlcmF0b3I8d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPiBlOworICAgIGlvc19iYXNlOjppb3N0YXRlIGVyciA9IGlvc19iYXNlOjpnb29kYml0OworICAgIHN0cnVjdCB0bSBvdGhlciA9IHsgMTUsIDIwLCA5LCAxNCwgNywgMTA1IH07CisKKyAgICBpID0gdG1nLmdldF9tb250aG5hbWUoIGksIGUsIGlvLCBlcnIsICZvdGhlciApOworICAgIENQUFVOSVRfQVNTRVJUKCBlcnIgPT0gaW9zX2Jhc2U6Omdvb2RiaXQgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggb3RoZXIudG1fbW9uID09IHhtYXMudG1fbW9uICk7CisKKyAgICArK2k7ICsraTsgKytpOyArK2k7IC8vIHNraXAgZGF5IG9mIG1vbnRoIGFuZCBzcGFjZXMgYXJvdW5kIGl0CisgICAgaSA9IHRtZy5nZXRfeWVhciggaSwgZSwgaW8sIGVyciwgJm90aGVyICk7CisKKyAgICBDUFBVTklUX0FTU0VSVCggZXJyID09IGlvc19iYXNlOjplb2ZiaXQgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggb3RoZXIudG1feWVhciA9PSB4bWFzLnRtX3llYXIgKTsKKworICAgIHdvc3RyaW5nc3RyZWFtIG9zdHJYOworICAgIG9zdHJYLmltYnVlKGxvYyk7CisgICAgZm9ybWF0ID0gTCIleCAlWCI7CisKKyAgICByZXQgPSB0bXAucHV0KG9zdHJYLCBvc3RyWCwgJyAnLCAmeG1hcywgZm9ybWF0LmRhdGEoKSwgZm9ybWF0LmRhdGEoKSArIGZvcm1hdC5zaXplKCkpOworICAgIENQUFVOSVRfQVNTRVJUKCAhcmV0LmZhaWxlZCgpICk7CisKKyAgICB3aXN0cmluZ3N0cmVhbSBpc3RyWCggb3N0clguc3RyKCkgKTsKKyAgICBpc3RyZWFtYnVmX2l0ZXJhdG9yPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4gaiggaXN0clggKTsKKworICAgIGVyciA9IGlvc19iYXNlOjpnb29kYml0OworCisgICAgc3RydWN0IHRtIHlldF9tb3JlID0geyAxNSwgMjAsIDksIDE0LCA3LCAxMDUgfTsKKworICAgIGogPSB0bWcuZ2V0X2RhdGUoIGosIGUsIGlvLCBlcnIsICZ5ZXRfbW9yZSApOworCisgICAgQ1BQVU5JVF9BU1NFUlQoIGVyciA9PSBpb3NfYmFzZTo6Z29vZGJpdCApOworCisgICAgQ1BQVU5JVF9BU1NFUlQoIHlldF9tb3JlLnRtX3NlYyAhPSB4bWFzLnRtX3NlYyApOworICAgIENQUFVOSVRfQVNTRVJUKCB5ZXRfbW9yZS50bV9taW4gIT0geG1hcy50bV9taW4gKTsKKyAgICBDUFBVTklUX0FTU0VSVCggeWV0X21vcmUudG1faG91ciAhPSB4bWFzLnRtX2hvdXIgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggeWV0X21vcmUudG1fbWRheSA9PSB4bWFzLnRtX21kYXkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggeWV0X21vcmUudG1fbW9uID09IHhtYXMudG1fbW9uICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHlldF9tb3JlLnRtX3llYXIgPT0geG1hcy50bV95ZWFyICk7CisKKyAgICArK2o7IC8vIHNraXAgc3BhY2UKKworICAgIGogPSB0bWcuZ2V0X3RpbWUoIGosIGUsIGlvLCBlcnIsICZ5ZXRfbW9yZSApOworCisgICAgQ1BQVU5JVF9BU1NFUlQoIGVyciA9PSBpb3NfYmFzZTo6ZW9mYml0IHx8IGVyciA9PSBpb3NfYmFzZTo6Z29vZGJpdCApOworCisgICAgQ1BQVU5JVF9BU1NFUlQoIHlldF9tb3JlLnRtX3NlYyA9PSB4bWFzLnRtX3NlYyApOworICAgIENQUFVOSVRfQVNTRVJUKCB5ZXRfbW9yZS50bV9taW4gPT0geG1hcy50bV9taW4gKTsKKyAgICBDUFBVTklUX0FTU0VSVCggeWV0X21vcmUudG1faG91ciA9PSB4bWFzLnRtX2hvdXIgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggeWV0X21vcmUudG1fbWRheSA9PSB4bWFzLnRtX21kYXkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggeWV0X21vcmUudG1fbW9uID09IHhtYXMudG1fbW9uICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHlldF9tb3JlLnRtX3llYXIgPT0geG1hcy50bV95ZWFyICk7CisgIH0KKyMgIGVuZGlmCit9CisKK3R5cGVkZWYgdm9pZCAoTG9jYWxlVGVzdDo6Kl9UZXN0KSAoY29uc3QgbG9jYWxlJik7CitzdGF0aWMgdm9pZCB0ZXN0X3N1cHBvcnRlZF9sb2NhbGUoTG9jYWxlVGVzdCYgaW5zdCwgX1Rlc3QgX190ZXN0KSB7CisgIHNpemVfdCBuID0gc2l6ZW9mKHRlc3RlZF9sb2NhbGVzKSAvIHNpemVvZih0ZXN0ZWRfbG9jYWxlc1swXSk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbjsgKytpKSB7CisgICAgbG9jYWxlIGxvYzsKKyMgIGlmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkIChfU1RMUF9VU0VfRVhDRVBUSU9OUykKKyAgICB0cnkKKyMgIGVuZGlmCisgICAgeworICAgICAgbG9jYWxlIHRtcCh0ZXN0ZWRfbG9jYWxlc1tpXSk7CisgICAgICBsb2MgPSB0bXA7CisgICAgfQorIyAgaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IGRlZmluZWQgKF9TVExQX1VTRV9FWENFUFRJT05TKQorICAgIGNhdGNoIChydW50aW1lX2Vycm9yIGNvbnN0JikgeworICAgICAgLy9UaGlzIGxvY2FsZSBpcyBub3Qgc3VwcG9ydGVkLgorICAgICAgY29udGludWU7CisgICAgfQorIyAgZW5kaWYKKyAgICBDUFBVTklUX01FU1NBR0UoIGxvYy5uYW1lKCkuY19zdHIoKSApOworICAgIChpbnN0LipfX3Rlc3QpKGxvYyk7CisKKyAgICB7CisgICAgICBsb2NhbGUgdG1wKGxvY2FsZTo6Y2xhc3NpYygpLCB0ZXN0ZWRfbG9jYWxlc1tpXSwgbG9jYWxlOjp0aW1lKTsKKyAgICAgIGxvYyA9IHRtcDsKKyAgICB9CisgICAgKGluc3QuKl9fdGVzdCkobG9jKTsKKworICAgIHsKKyAgICAgIHR5cGVkZWYgdGltZV9wdXRfYnluYW1lPGNoYXIsIG9zdHJlYW1idWZfaXRlcmF0b3I8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiA+IHRpbWVfcHV0X2ZhY2V0OworICAgICAgbG9jYWxlIHRtcDAobG9jYWxlOjpjbGFzc2ljKCksIG5ldyB0aW1lX3B1dF9mYWNldCh0ZXN0ZWRfbG9jYWxlc1tpXSkpOworICAgICAgdHlwZWRlZiB0aW1lX2dldF9ieW5hbWU8Y2hhciwgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+ID4gdGltZV9nZXRfZmFjZXQ7CisgICAgICBsb2NhbGUgdG1wMSh0bXAwLCBuZXcgdGltZV9nZXRfZmFjZXQodGVzdGVkX2xvY2FsZXNbaV0pKTsKKyAgICAgIGxvYyA9IHRtcDE7CisgICAgfQorICAgIChpbnN0LipfX3Rlc3QpKGxvYyk7CisgIH0KK30KKwordm9pZCBMb2NhbGVUZXN0Ojp0aW1lX3B1dF9nZXQoKQoreyB0ZXN0X3N1cHBvcnRlZF9sb2NhbGUoKnRoaXMsICZMb2NhbGVUZXN0OjpfdGltZV9wdXRfZ2V0KTsgfQorCit2b2lkIExvY2FsZVRlc3Q6OnRpbWVfYnlfbmFtZSgpCit7CisjICBpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZCAoX1NUTFBfVVNFX0VYQ0VQVElPTlMpCisgIC8qCisgICAqIENoZWNrIG9mIHRoZSAyMi4xLjEuMi43IHN0YW5kYXJkIHBvaW50LiBDb25zdHJ1Y3Rpb24gb2YgYSBsb2NhbGUKKyAgICogaW5zdGFuY2UgZnJvbSBhIG51bGwgcG9pbnRlciBvciBhbiB1bmtub3duIG5hbWUgc2hvdWxkIHJlc3VsdCBpbgorICAgKiBhIHJ1bnRpbWVfZXJyb3IgZXhjZXB0aW9uLgorICAgKi8KKyMgICAgaWYgZGVmaW5lZCAoU1RMUE9SVCkgfHwgIWRlZmluZWQgKF9NU0NfVkVSKSB8fCAoX01TQ19WRVIgPiAxNDAwKQorICB0cnkgeworICAgIGxvY2FsZSBsb2MobG9jYWxlOjpjbGFzc2ljKCksIG5ldyB0aW1lX3B1dF9ieW5hbWU8Y2hhciwgb3N0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+ID4oc3RhdGljX2Nhc3Q8Y2hhciBjb25zdCo+KDApKSk7CisgICAgQ1BQVU5JVF9GQUlMOworICB9CisgIGNhdGNoIChydW50aW1lX2Vycm9yIGNvbnN0JikgeworICB9CisgIGNhdGNoICguLi4pIHsKKyAgICBDUFBVTklUX0ZBSUw7CisgIH0KKyMgICAgZW5kaWYKKworICB0cnkgeworICAgIGxvY2FsZSBsb2MobG9jYWxlOjpjbGFzc2ljKCksIG5ldyB0aW1lX3B1dF9ieW5hbWU8Y2hhciwgb3N0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+ID4oInlhc2xpX2xhbmd1YWdlIikpOworICAgIENQUFVOSVRfRkFJTDsKKyAgfQorICBjYXRjaCAocnVudGltZV9lcnJvciBjb25zdCYpIHsKKyAgfQorICBjYXRjaCAoLi4uKSB7CisgICAgQ1BQVU5JVF9GQUlMOworICB9CisKKyAgdHJ5IHsKKyAgICBzdHJpbmcgdmVyeUxvbmdGYWNldE5hbWUoIkxDX1RJTUU9Iik7CisgICAgdmVyeUxvbmdGYWNldE5hbWUuYXBwZW5kKDUxMiwgJz8nKTsKKyAgICBsb2NhbGUgbG9jKGxvY2FsZTo6Y2xhc3NpYygpLCBuZXcgdGltZV9wdXRfYnluYW1lPGNoYXIsIG9zdHJlYW1idWZfaXRlcmF0b3I8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiA+KHZlcnlMb25nRmFjZXROYW1lLmNfc3RyKCkpKTsKKyAgICBDUFBVTklUX0ZBSUw7CisgIH0KKyAgY2F0Y2ggKHJ1bnRpbWVfZXJyb3IgY29uc3QmIC8qIGUgKi8pIHsKKyAgICAvL0NQUFVOSVRfTUVTU0FHRSggZS53aGF0KCkgKTsKKyAgfQorICBjYXRjaCAoLi4uKSB7CisgICAgQ1BQVU5JVF9GQUlMOworICB9CisKKyAgdHJ5IHsKKyAgICBsb2NhbGUgbG9jKGxvY2FsZTo6Y2xhc3NpYygpLCBuZXcgdGltZV9nZXRfYnluYW1lPGNoYXIsIGlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiA+KHN0YXRpY19jYXN0PGNoYXIgY29uc3QqPigwKSkpOworICAgIENQUFVOSVRfRkFJTDsKKyAgfQorICBjYXRjaCAocnVudGltZV9lcnJvciBjb25zdCYpIHsKKyAgfQorICBjYXRjaCAoLi4uKSB7CisgICAgQ1BQVU5JVF9GQUlMOworICB9CisKKyAgdHJ5IHsKKyAgICBsb2NhbGUgbG9jKGxvY2FsZTo6Y2xhc3NpYygpLCBuZXcgdGltZV9nZXRfYnluYW1lPGNoYXIsIGlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiA+KCJ5YXNsaV9sYW5ndWFnZSIpKTsKKyAgICBDUFBVTklUX0ZBSUw7CisgIH0KKyAgY2F0Y2ggKHJ1bnRpbWVfZXJyb3IgY29uc3QmKSB7CisgIH0KKyAgY2F0Y2ggKC4uLikgeworICAgIENQUFVOSVRfRkFJTDsKKyAgfQorCisgIHRyeSB7CisgICAgc3RyaW5nIHZlcnlMb25nRmFjZXROYW1lKCJMQ19USU1FPSIpOworICAgIHZlcnlMb25nRmFjZXROYW1lLmFwcGVuZCg1MTIsICc/Jyk7CisgICAgbG9jYWxlIGxvYyhsb2NhbGU6OmNsYXNzaWMoKSwgbmV3IHRpbWVfZ2V0X2J5bmFtZTxjaGFyLCBpc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4gPih2ZXJ5TG9uZ0ZhY2V0TmFtZS5jX3N0cigpKSk7CisgICAgQ1BQVU5JVF9GQUlMOworICB9CisgIGNhdGNoIChydW50aW1lX2Vycm9yIGNvbnN0JiAvKiBlICovKSB7CisgICAgLy9DUFBVTklUX01FU1NBR0UoIGUud2hhdCgpICk7CisgIH0KKyAgY2F0Y2ggKC4uLikgeworICAgIENQUFVOSVRfRkFJTDsKKyAgfQorCisgIHRyeSB7CisgICAgbG9jYWxlIGxvYyhsb2NhbGU6OmNsYXNzaWMoKSwgIkMiLCBsb2NhbGU6OnRpbWUpOworICB9CisgIGNhdGNoIChydW50aW1lX2Vycm9yIGNvbnN0JiAvKiBlICovKSB7CisgICAgLyogQ1BQVU5JVF9NRVNTQUdFKCBlLndoYXQoKSApOyAqLworICAgIENQUFVOSVRfRkFJTDsKKyAgfQorICBjYXRjaCAoLi4uKSB7CisgICAgQ1BQVU5JVF9GQUlMOworICB9CisKKyAgdHJ5IHsKKyAgICAvLyBPbiBwbGF0Zm9ybSB3aXRob3V0IHJlYWwgbG9jYWxpemF0aW9uIHN1cHBvcnQgd2Ugc2hvdWxkIHJlbHkgb24gdGhlICJDIiBmYWNldC4KKyAgICBsb2NhbGUgbG9jKGxvY2FsZTo6Y2xhc3NpYygpLCAiIiwgbG9jYWxlOjp0aW1lKTsKKyAgfQorICBjYXRjaCAocnVudGltZV9lcnJvciBjb25zdCYgLyogZSAqLykgeworICAgIC8qIENQUFVOSVRfTUVTU0FHRSggZS53aGF0KCkgKTsgKi8KKyAgICBDUFBVTklUX0ZBSUw7CisgIH0KKyAgY2F0Y2ggKC4uLikgeworICAgIENQUFVOSVRfRkFJTDsKKyAgfQorCisgIHRyeSB7CisgICAgbG9jYWxlIGxvYyhsb2NhbGU6OmNsYXNzaWMoKSwgbmV3IHRpbWVfZ2V0X2J5bmFtZTxjaGFyLCBpc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4gPigiQyIpKTsKKyAgfQorICBjYXRjaCAocnVudGltZV9lcnJvciBjb25zdCYgLyogZSAqLykgeworICAgIC8qIENQUFVOSVRfTUVTU0FHRSggZS53aGF0KCkgKTsgKi8KKyAgICBDUFBVTklUX0ZBSUw7CisgIH0KKyAgY2F0Y2ggKC4uLikgeworICAgIENQUFVOSVRfRkFJTDsKKyAgfQorCisgIHRyeSB7CisgICAgLy8gT24gcGxhdGZvcm0gd2l0aG91dCByZWFsIGxvY2FsaXphdGlvbiBzdXBwb3J0IHdlIHNob3VsZCByZWx5IG9uIHRoZSAiQyIgbG9jYWxlIGZhY2V0LgorICAgIGxvY2FsZSBsb2MobG9jYWxlOjpjbGFzc2ljKCksIG5ldyB0aW1lX2dldF9ieW5hbWU8Y2hhciwgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+ID4oIiIpKTsKKyAgfQorICBjYXRjaCAocnVudGltZV9lcnJvciBjb25zdCYgLyogZSAqLykgeworICAgIC8qIENQUFVOSVRfTUVTU0FHRSggZS53aGF0KCkgKTsgKi8KKyAgICBDUFBVTklUX0ZBSUw7CisgIH0KKyAgY2F0Y2ggKC4uLikgeworICAgIENQUFVOSVRfRkFJTDsKKyAgfQorCisjICAgIGlmICFkZWZpbmVkIChTVExQT1JUKSB8fCAhZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkKKyAgdHJ5IHsKKyAgICBsb2NhbGUgbG9jKGxvY2FsZTo6Y2xhc3NpYygpLCBuZXcgdGltZV9wdXRfYnluYW1lPHdjaGFyX3QsIG9zdHJlYW1idWZfaXRlcmF0b3I8d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPiA+KHN0YXRpY19jYXN0PGNoYXIgY29uc3QqPigwKSkpOworICAgIENQUFVOSVRfRkFJTDsKKyAgfQorICBjYXRjaCAocnVudGltZV9lcnJvciBjb25zdCYpIHsKKyAgfQorICBjYXRjaCAoLi4uKSB7CisgICAgQ1BQVU5JVF9GQUlMOworICAgIH0KKworICB0cnkgeworICAgIGxvY2FsZSBsb2MobG9jYWxlOjpjbGFzc2ljKCksIG5ldyB0aW1lX3B1dF9ieW5hbWU8d2NoYXJfdCwgb3N0cmVhbWJ1Zl9pdGVyYXRvcjx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+ID4oInlhc2xpX2xhbmd1YWdlIikpOworICAgIENQUFVOSVRfRkFJTDsKKyAgfQorICBjYXRjaCAocnVudGltZV9lcnJvciBjb25zdCYpIHsKKyAgfQorICBjYXRjaCAoLi4uKSB7CisgICAgQ1BQVU5JVF9GQUlMOworICB9CisKKyAgdHJ5IHsKKyAgICBsb2NhbGUgbG9jKGxvY2FsZTo6Y2xhc3NpYygpLCBuZXcgdGltZV9nZXRfYnluYW1lPHdjaGFyX3QsIGlzdHJlYW1idWZfaXRlcmF0b3I8d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPiA+KHN0YXRpY19jYXN0PGNoYXIgY29uc3QqPigwKSkpOworICAgIENQUFVOSVRfRkFJTDsKKyAgfQorICBjYXRjaCAocnVudGltZV9lcnJvciBjb25zdCYpIHsKKyAgfQorICBjYXRjaCAoLi4uKSB7CisgICAgQ1BQVU5JVF9GQUlMOworICB9CisKKyAgdHJ5IHsKKyAgICBsb2NhbGUgbG9jKGxvY2FsZTo6Y2xhc3NpYygpLCBuZXcgdGltZV9nZXRfYnluYW1lPHdjaGFyX3QsIGlzdHJlYW1idWZfaXRlcmF0b3I8d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPiA+KCJ5YXNsaV9sYW5ndWFnZSIpKTsKKyAgICBDUFBVTklUX0ZBSUw7CisgIH0KKyAgY2F0Y2ggKHJ1bnRpbWVfZXJyb3IgY29uc3QmKSB7CisgIH0KKyAgY2F0Y2ggKC4uLikgeworICAgIENQUFVOSVRfRkFJTDsKKyAgfQorCisjICAgIGVuZGlmCisjICBlbmRpZgorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC90aW1lX2hlYWRlcl90ZXN0LmMgYi90ZXN0L3VuaXQvdGltZV9oZWFkZXJfdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZmU2NGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvdGltZV9oZWFkZXJfdGVzdC5jCkBAIC0wLDAgKzEsOCBAQAorLyogVGhpcyB0ZXN0IHB1cnBvc2UgaXMgc2ltcGx5IHRvIGNoZWNrIFN0YW5kYXJkIGhlYWRlciBpbmRlcGVuZGFuY3kgdGhhdAorICogaXMgdG8gc2F5IHRoYXQgdGhlIGhlYWRlciBjYW4gYmUgaW5jbHVkZWQgYWxvbmUgd2l0aG91dCBhbnkgcHJldmlvdXMKKyAqIGluY2x1ZGUuCisgKiBBZGRpdGlvbm5hbHksIGZvciBDIFN0YW5kYXJkIGhlYWRlcnMgdGhhdCBTVExwb3J0IGV4cG9zZSwgaXQgY2FuIGFsc28gYmUKKyAqIHVzZWQgdG8gY2hlY2sgdGhhdCBmaWxlcyBpbmNsdWRlZCBieSB0aG9zZSBoZWFkZXJzIGFyZSBjb21wYXRpYmxlIHdpdGgKKyAqIHB1cmUgQyBjb21waWxlcnMuCisgKi8KKyNpbmNsdWRlIDx0aW1lLmg+CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvdGltZXNfdGVzdC5jcHAgYi90ZXN0L3VuaXQvdGltZXNfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWExMzkyNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC90aW1lc190ZXN0LmNwcApAQCAtMCwwICsxLDM0IEBACisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPG51bWVyaWM+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKworI2luY2x1ZGUgImNwcHVuaXQvY3BwdW5pdF9wcm94eS5oIgorCisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IGRlZmluZWQoX1NUTFBfVVNFX05BTUVTUEFDRVMpCit1c2luZyBuYW1lc3BhY2Ugc3RkOworI2VuZGlmCisKKy8vCisvLyBUZXN0Q2FzZSBjbGFzcworLy8KK2NsYXNzIFRpbWVzVGVzdCA6IHB1YmxpYyBDUFBVTklUX05TOjpUZXN0Q2FzZQoreworICBDUFBVTklUX1RFU1RfU1VJVEUoVGltZXNUZXN0KTsKKyAgQ1BQVU5JVF9URVNUKHRpbWVzKTsKKyAgQ1BQVU5JVF9URVNUX1NVSVRFX0VORCgpOworCitwcm90ZWN0ZWQ6CisgIHZvaWQgdGltZXMoKTsKK307CisKK0NQUFVOSVRfVEVTVF9TVUlURV9SRUdJU1RSQVRJT04oVGltZXNUZXN0KTsKKworLy8KKy8vIHRlc3RzIGltcGxlbWVudGF0aW9uCisvLwordm9pZCBUaW1lc1Rlc3Q6OnRpbWVzKCkKK3sKKyAgaW50IGlucHV0IFs0XSA9IHsgMSwgNSwgNywgMiB9OworICBpbnQgdG90YWwgPSBhY2N1bXVsYXRlKGlucHV0LCBpbnB1dCArIDQsIDEsIG11bHRpcGxpZXM8aW50PigpKTsKKyAgQ1BQVU5JVF9BU1NFUlQodG90YWw9PTcwKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC90cmFuc2Zvcm1fdGVzdC5jcHAgYi90ZXN0L3VuaXQvdHJhbnNmb3JtX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNjQ5ZTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvdHJhbnNmb3JtX3Rlc3QuY3BwCkBAIC0wLDAgKzEsODAgQEAKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgImNwcHVuaXQvY3BwdW5pdF9wcm94eS5oIgorCisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IGRlZmluZWQoX1NUTFBfVVNFX05BTUVTUEFDRVMpCit1c2luZyBuYW1lc3BhY2Ugc3RkOworI2VuZGlmCisKKy8vCisvLyBUZXN0Q2FzZSBjbGFzcworLy8KK2NsYXNzIFRyYW5zZm9ybVRlc3QgOiBwdWJsaWMgQ1BQVU5JVF9OUzo6VGVzdENhc2UKK3sKKyAgQ1BQVU5JVF9URVNUX1NVSVRFKFRyYW5zZm9ybVRlc3QpOworICBDUFBVTklUX1RFU1QodHJuc2ZybTEpOworICBDUFBVTklUX1RFU1QodHJuc2ZybTIpOworICBDUFBVTklUX1RFU1Qoc2VsZl9zdHIpOworICBDUFBVTklUX1RFU1RfU1VJVEVfRU5EKCk7CisKK3Byb3RlY3RlZDoKKyAgdm9pZCB0cm5zZnJtMSgpOworICB2b2lkIHRybnNmcm0yKCk7CisgIHZvaWQgc2VsZl9zdHIoKTsKKworICBzdGF0aWMgaW50IG5lZ2F0ZV9pbnQoaW50IGFfKSB7CisgICAgcmV0dXJuIC1hXzsKKyAgfQorICBzdGF0aWMgY2hhciBtYXBfY2hhcihjaGFyIGFfLCBpbnQgYl8pIHsKKyAgICByZXR1cm4gY2hhcihhXyArIGJfKTsKKyAgfQorICBzdGF0aWMgY2hhciBzaGlmdCggY2hhciBjICkgeworICAgIHJldHVybiBjaGFyKCgoaW50KWMgKyAxKSAlIDI1Nik7CisgIH0KK307CisKK0NQUFVOSVRfVEVTVF9TVUlURV9SRUdJU1RSQVRJT04oVHJhbnNmb3JtVGVzdCk7CisKKy8vCisvLyB0ZXN0cyBpbXBsZW1lbnRhdGlvbgorLy8KK3ZvaWQgVHJhbnNmb3JtVGVzdDo6dHJuc2ZybTEoKQoreworICBpbnQgbnVtYmVyc1s2XSA9IHsgLTUsIC0xLCAwLCAxLCA2LCAxMSB9OworCisgIGludCByZXN1bHRbNl07CisgIHRyYW5zZm9ybSgoaW50KiludW1iZXJzLCAoaW50KiludW1iZXJzICsgNiwgKGludCopcmVzdWx0LCBuZWdhdGVfaW50KTsKKworICBDUFBVTklUX0FTU0VSVChyZXN1bHRbMF09PTUpOworICBDUFBVTklUX0FTU0VSVChyZXN1bHRbMV09PTEpOworICBDUFBVTklUX0FTU0VSVChyZXN1bHRbMl09PTApOworICBDUFBVTklUX0FTU0VSVChyZXN1bHRbM109PS0xKTsKKyAgQ1BQVU5JVF9BU1NFUlQocmVzdWx0WzRdPT0tNik7CisgIENQUFVOSVRfQVNTRVJUKHJlc3VsdFs1XT09LTExKTsKK30KK3ZvaWQgVHJhbnNmb3JtVGVzdDo6dHJuc2ZybTIoKQoreworI2lmIGRlZmluZWQgKF9fTVZTX18pCisgIGludCB0cmFuc1tdID0gey0xMSwgNCwgLTYsIC02LCAtMTgsIDAsIDE4LCAtMTQsIDYsIDAsIC0xLCAtNTl9OworI2Vsc2UKKyAgaW50IHRyYW5zW10gPSB7LTQsIDQsIC02LCAtNiwgLTEwLCAwLCAxMCwgLTYsIDYsIDAsIC0xLCAtNzd9OworI2VuZGlmCisgIGNoYXIgbltdID0gIkxhcnJ5IE11bGxlbiI7CisgIGNvbnN0IHNpemVfdCBjb3VudCA9IDo6c3RybGVuKG4pOworCisgIHN0cmluZyByZXM7CisgIHRyYW5zZm9ybShuLCBuICsgY291bnQsIHRyYW5zLCBiYWNrX2luc2VydGVyKHJlcyksIG1hcF9jaGFyKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHJlcyA9PSAiSGVsbG8gV29ybGQhIiApCit9CisKK3ZvaWQgVHJhbnNmb3JtVGVzdDo6c2VsZl9zdHIoKQoreworICBzdHJpbmcgcyggIjAxMjM0NTY3ODlhYmNkZWZnIiApOworICBzdHJpbmcgciggIjEyMzQ1Njc4OTpiY2RlZmdoIiApOworICB0cmFuc2Zvcm0oIHMuYmVnaW4oKSwgcy5lbmQoKSwgcy5iZWdpbigpLCBzaGlmdCApOworICBDUFBVTklUX0FTU0VSVCggcyA9PSByICk7Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC90eXBlX3RyYWl0c190ZXN0LmNwcCBiL3Rlc3QvdW5pdC90eXBlX3RyYWl0c190ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODgxNDUxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L3R5cGVfdHJhaXRzX3Rlc3QuY3BwCkBAIC0wLDAgKzEsNTkzIEBACisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJjcHB1bml0L2NwcHVuaXRfcHJveHkuaCIKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9OQU1FU1BBQ0VTKQordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyNlbmRpZgorCisvLworLy8gVGVzdENhc2UgY2xhc3MKKy8vCitjbGFzcyBUeXBlVHJhaXRzVGVzdCA6IHB1YmxpYyBDUFBVTklUX05TOjpUZXN0Q2FzZQoreworICBDUFBVTklUX1RFU1RfU1VJVEUoVHlwZVRyYWl0c1Rlc3QpOworI2lmICFkZWZpbmVkIChTVExQT1JUKQorICBDUFBVTklUX0lHTk9SRTsKKyNlbmRpZgorICBDUFBVTklUX1RFU1QobWFuaXBzKTsKKyAgQ1BQVU5JVF9URVNUKGludGVnZXIpOworICBDUFBVTklUX1RFU1QocmF0aW9uYWwpOworICBDUFBVTklUX1RFU1QocG9pbnRlcl90eXBlKTsKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiAhZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikKKyAgQ1BQVU5JVF9JR05PUkU7CisjZW5kaWYKKyAgQ1BQVU5JVF9URVNUKHJlZmVyZW5jZV90eXBlKTsKKyNpZiBkZWZpbmVkIChTVExQT1JUKQorICBDUFBVTklUX1NUT1BfSUdOT1JFOworI2VuZGlmCisgIENQUFVOSVRfVEVTVChib3RoX3BvaW50ZXJfdHlwZSk7CisgIENQUFVOSVRfVEVTVChva190b191c2VfbWVtY3B5KTsKKyAgQ1BQVU5JVF9URVNUKG9rX3RvX3VzZV9tZW1tb3ZlKTsKKyAgQ1BQVU5JVF9URVNUKHRyaXZpYWxfZGVzdHJ1Y3Rvcik7CisgIENQUFVOSVRfVEVTVChpc19QT0QpOworICBDUFBVTklUX1RFU1Qoc3RscG9ydF9jbGFzcyk7CisgIENQUFVOSVRfVEVTVF9TVUlURV9FTkQoKTsKKworcHJvdGVjdGVkOgorICB2b2lkIG1hbmlwcygpOworICB2b2lkIGludGVnZXIoKTsKKyAgdm9pZCByYXRpb25hbCgpOworICB2b2lkIHBvaW50ZXJfdHlwZSgpOworICB2b2lkIHJlZmVyZW5jZV90eXBlKCk7CisgIHZvaWQgYm90aF9wb2ludGVyX3R5cGUoKTsKKyAgdm9pZCBva190b191c2VfbWVtY3B5KCk7CisgIHZvaWQgb2tfdG9fdXNlX21lbW1vdmUoKTsKKyAgdm9pZCB0cml2aWFsX2Rlc3RydWN0b3IoKTsKKyAgdm9pZCBpc19QT0QoKTsKKyAgdm9pZCBzdGxwb3J0X2NsYXNzKCk7Cit9OworCitDUFBVTklUX1RFU1RfU1VJVEVfUkVHSVNUUkFUSU9OKFR5cGVUcmFpdHNUZXN0KTsKKworI2lmIGRlZmluZWQgKFNUTFBPUlQpCisKKyMgIGlmIGRlZmluZWQgKF9fR05VQ19fKSAmJiBkZWZpbmVkIChfU1RMUF9VU0VfTkFNRVNQQUNFUykKKy8vIGxpYnN0ZGMrKyBzb21ldGltZXMgZXhwb3NlZCBpdHMgb3duIF9fdHJ1ZV90eXBlIHR5cGUgaW4gZ2xvYmFsCisvLyBuYW1lc3BhY2UgcmVzdWx0aW5nIGluIGFuIGFtYmlndWl0eS4KKyMgICAgZGVmaW5lIF9fdHJ1ZV90eXBlIHN0ZDo6X190cnVlX3R5cGUKKyMgICAgZGVmaW5lIF9fZmFsc2VfdHlwZSBzdGQ6Ol9fZmFsc2VfdHlwZQorIyAgZW5kaWYKKworaW50IHR5cGVfdG9fdmFsdWUoX190cnVlX3R5cGUpCit7IHJldHVybiAxOyB9CitpbnQgdHlwZV90b192YWx1ZShfX2ZhbHNlX3R5cGUpCit7IHJldHVybiAwOyB9CisKK2ludCogaW50X3BvaW50ZXI7CitpbnQgY29uc3QqIGludF9jb25zdF9wb2ludGVyOworaW50IHZvbGF0aWxlKiBpbnRfdm9sYXRpbGVfcG9pbnRlcjsKK2ludCBjb25zdCB2b2xhdGlsZSogaW50X2NvbnN0X3ZvbGF0aWxlX3BvaW50ZXI7CitpbnQgaW50X3ZhbCA9IDA7CitpbnQgY29uc3QgaW50X2NvbnN0X3ZhbCA9IDA7CitpbnQgdm9sYXRpbGUgaW50X3ZvbGF0aWxlX3ZhbCA9IDA7CitpbnQgJiBpbnRfcmVmID0gaW50X3ZhbDsKK2ludCBjb25zdCYgaW50X2NvbnN0X3JlZiA9IGludF92YWw7CitpbnQgY29uc3Qgdm9sYXRpbGUmIGludF9jb25zdF92b2xhdGlsZV9yZWYgPSBpbnRfdmFsOworCisvL0EgdHlwZSB0aGF0IHJlcHJlc2VudCBhbnkgdHlwZToKK3N0cnVjdCBhbnlfdHlwZQoreworICAvL0R1bW15IG9wZXJhdGlvbnMgdG8gZm9yYmlkIHRvIGNvbXBpbGVycyB3aXRoIGludHJpbnNpYworICAvL3R5cGUgdHJhaXRzIHN1cHBvcnQgdG8gY29uc2lkZXIgdGhpcyB0eXBlIGFzIGEgUE9ELgorICBhbnlfdHlwZSgpIDogbV9kYXRhKDEpIHt9CisgIGFueV90eXBlKGNvbnN0IGFueV90eXBlJikgOiBtX2RhdGEoMikge30KKyAgYW55X3R5cGUmIG9wZXJhdG9yID0gKGNvbnN0IGFueV90eXBlJikKKyAgeyBtX2RhdGEgPSAzOyByZXR1cm4gKnRoaXM7IH0KKyAgfmFueV90eXBlKCkgeyBtX2RhdGEgPSAwOyB9CisKKyAgc2l6ZV90IG1fZGF0YTsKK307CisKK2FueV90eXBlIGFueTsKK2FueV90eXBlKiBhbnlfcG9pbnRlcjsKK2FueV90eXBlIGNvbnN0KiBhbnlfY29uc3RfcG9pbnRlcjsKK2FueV90eXBlIHZvbGF0aWxlKiBhbnlfdm9sYXRpbGVfcG9pbnRlcjsKK2FueV90eXBlIGNvbnN0IHZvbGF0aWxlKiBhbnlfY29uc3Rfdm9sYXRpbGVfcG9pbnRlcjsKKworLy9BIHR5cGUgdGhhdCByZXByZXNlbnQgYW55IHBvZCB0eXBlCitzdHJ1Y3QgYW55X3BvZF90eXBlCit7fTsKKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX0JPT1NUX1NVUFBPUlQpCisvL01hbmRhdG9yeSBmb3IgY29tcGlsZXJzIHdpdGhvdXQgd2l0aG91dCBwYXJ0aWFsIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uLgorQk9PU1RfQlJPS0VOX0NPTVBJTEVSX1RZUEVfVFJBSVRTX1NQRUNJQUxJWkFUSU9OKGFueV9wb2RfdHlwZSkKKyMgIGVuZGlmCisKK2FueV9wb2RfdHlwZSBhbnlfcG9kOworYW55X3BvZF90eXBlKiBhbnlfcG9kX3BvaW50ZXI7CithbnlfcG9kX3R5cGUgY29uc3QqIGFueV9wb2RfY29uc3RfcG9pbnRlcjsKK2FueV9wb2RfdHlwZSB2b2xhdGlsZSogYW55X3BvZF92b2xhdGlsZV9wb2ludGVyOworYW55X3BvZF90eXBlIGNvbnN0IHZvbGF0aWxlKiBhbnlfcG9kX2NvbnN0X3ZvbGF0aWxlX3BvaW50ZXI7CisKKyMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9OQU1FU1BBQ0VTKQorbmFtZXNwYWNlIHN0ZCB7CisjICBlbmRpZgorICBfU1RMUF9URU1QTEFURV9OVUxMCisgIHN0cnVjdCBfX3R5cGVfdHJhaXRzPGFueV9wb2RfdHlwZT4geworICAgIHR5cGVkZWYgX190cnVlX3R5cGUgaGFzX3RyaXZpYWxfZGVmYXVsdF9jb25zdHJ1Y3RvcjsKKyAgICB0eXBlZGVmIF9fdHJ1ZV90eXBlIGhhc190cml2aWFsX2NvcHlfY29uc3RydWN0b3I7CisgICAgdHlwZWRlZiBfX3RydWVfdHlwZSBoYXNfdHJpdmlhbF9hc3NpZ25tZW50X29wZXJhdG9yOworICAgIHR5cGVkZWYgX190cnVlX3R5cGUgaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjsKKyAgICB0eXBlZGVmIF9fdHJ1ZV90eXBlIGlzX1BPRF90eXBlOworICB9OworIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX05BTUVTUEFDRVMpCit9CisjICBlbmRpZgorCitzdHJ1Y3QgYmFzZQore307CitzdHJ1Y3QgZGVyaXZlZCA6IHB1YmxpYyBiYXNlCit7fTsKKworLy8KKy8vIHRlc3RzIGltcGxlbWVudGF0aW9uCisvLwordGVtcGxhdGUgPHR5cGVuYW1lIF9TcmMsIHR5cGVuYW1lIF9Ec3Q+CitpbnQgaXNfY29udmVydGlibGUoX1NyYywgX0RzdCkgeworIyAgaWYgIWRlZmluZWQoX19CT1JMQU5EQ19fKQorICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0NvbnZlcnRpYmxlPF9TcmMsIF9Ec3Q+OjpfUmV0IF9SZXQ7CisjICBlbHNlCisgIGVudW0geyBfSXMgPSBfSXNDb252ZXJ0aWJsZTxfU3JjLCBfRHN0Pjo6dmFsdWUgfTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jvb2wydHlwZTxfSXM+OjpfUmV0IF9SZXQ7CisjICBlbmRpZgorICByZXR1cm4gdHlwZV90b192YWx1ZShfUmV0KCkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgX1NyYywgdHlwZW5hbWUgX0RzdD4KK2ludCBpc19jdl9jb252ZXJ0aWJsZShfU3JjLCBfRHN0KSB7CisjICBpZiAhZGVmaW5lZChfX0JPUkxBTkRDX18pCisgIHR5cGVkZWYgdHlwZW5hbWUgX0lzQ1ZDb252ZXJ0aWJsZTxfU3JjLCBfRHN0Pjo6X1JldCBfUmV0OworIyAgZWxzZQorICBlbnVtIHsgX0lzID0gX0lzQ1ZDb252ZXJ0aWJsZTxfU3JjLCBfRHN0Pjo6dmFsdWUgfTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jvb2wydHlwZTxfSXM+OjpfUmV0IF9SZXQ7CisjICBlbmRpZgorICByZXR1cm4gdHlwZV90b192YWx1ZShfUmV0KCkpOworfQorI2VuZGlmCisKK3ZvaWQgVHlwZVRyYWl0c1Rlc3Q6Om1hbmlwcygpCit7CisjaWYgZGVmaW5lZCAoU1RMUE9SVCkKKyAgeworICAgIHR5cGVkZWYgX19ib29sMnR5cGU8MD46Ol9SZXQgX1plcm9SZXQ7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHR5cGVfdG9fdmFsdWUoX1plcm9SZXQoKSkgPT0gMCApOworICAgIHR5cGVkZWYgX19ib29sMnR5cGU8MT46Ol9SZXQgX09uZVJldDsKKyAgICBDUFBVTklUX0FTU0VSVCggdHlwZV90b192YWx1ZShfT25lUmV0KCkpID09IDEgKTsKKyAgICB0eXBlZGVmIF9fYm9vbDJ0eXBlPDY1NDU2ODczPjo6X1JldCBfQW55UmV0OworICAgIENQUFVOSVRfQVNTRVJUKCB0eXBlX3RvX3ZhbHVlKF9BbnlSZXQoKSkgPT0gMSApOworICB9CisKKyAgeworICAgIENQUFVOSVRfQVNTRVJUKCBfX3R5cGUyYm9vbDxfX3RydWVfdHlwZT46Ol9SZXQgPT0gMSApOworICAgIENQUFVOSVRfQVNTRVJUKCBfX3R5cGUyYm9vbDxfX2ZhbHNlX3R5cGU+OjpfUmV0ID09IDAgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggX190eXBlMmJvb2w8YW55X3R5cGU+OjpfUmV0ID09IDEgKTsKKyAgfQorCisgIHsKKyAgICB0eXBlZGVmIF9Ob3Q8X190cnVlX3R5cGU+OjpfUmV0IF9Ob3RUcnVlUmV0OworICAgIENQUFVOSVRfQVNTRVJUKCB0eXBlX3RvX3ZhbHVlKF9Ob3RUcnVlUmV0KCkpID09IDAgKTsKKyAgICB0eXBlZGVmIF9Ob3Q8X19mYWxzZV90eXBlPjo6X1JldCBfTm90RmFsc2VSZXQ7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHR5cGVfdG9fdmFsdWUoX05vdEZhbHNlUmV0KCkpID09IDEgKTsKKyAgfQorCisgIHsKKyAgICB0eXBlZGVmIF9MYW5kMjxfX3RydWVfdHlwZSwgX190cnVlX3R5cGU+OjpfUmV0IF9UcnVlVHJ1ZVJldDsKKyAgICBDUFBVTklUX0FTU0VSVCggdHlwZV90b192YWx1ZShfVHJ1ZVRydWVSZXQoKSkgPT0gMSApOworICAgIHR5cGVkZWYgX0xhbmQyPF9fdHJ1ZV90eXBlLCBfX2ZhbHNlX3R5cGU+OjpfUmV0IF9UcnVlRmFsc2VSZXQ7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHR5cGVfdG9fdmFsdWUoX1RydWVGYWxzZVJldCgpKSA9PSAwICk7CisgICAgdHlwZWRlZiBfTGFuZDI8X19mYWxzZV90eXBlLCBfX3RydWVfdHlwZT46Ol9SZXQgX0ZhbHNlVHJ1ZVJldDsKKyAgICBDUFBVTklUX0FTU0VSVCggdHlwZV90b192YWx1ZShfRmFsc2VUcnVlUmV0KCkpID09IDAgKTsKKyAgICB0eXBlZGVmIF9MYW5kMjxfX2ZhbHNlX3R5cGUsIF9fZmFsc2VfdHlwZT46Ol9SZXQgX0ZhbHNlRmFsc2VSZXQ7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHR5cGVfdG9fdmFsdWUoX0ZhbHNlRmFsc2VSZXQoKSkgPT0gMCApOworICB9CisKKyAgeworICAgIHR5cGVkZWYgX0xhbmQzPF9fdHJ1ZV90eXBlLCBfX3RydWVfdHlwZSwgX190cnVlX3R5cGU+OjpfUmV0IF9UcnVlVHJ1ZVRydWVSZXQ7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHR5cGVfdG9fdmFsdWUoX1RydWVUcnVlVHJ1ZVJldCgpKSA9PSAxICk7CisgICAgdHlwZWRlZiBfTGFuZDM8X190cnVlX3R5cGUsIF9fdHJ1ZV90eXBlLCBfX2ZhbHNlX3R5cGU+OjpfUmV0IF9UcnVlVHJ1ZUZhbHNlUmV0OworICAgIENQUFVOSVRfQVNTRVJUKCB0eXBlX3RvX3ZhbHVlKF9UcnVlVHJ1ZUZhbHNlUmV0KCkpID09IDAgKTsKKyAgICB0eXBlZGVmIF9MYW5kMzxfX3RydWVfdHlwZSwgX19mYWxzZV90eXBlLCBfX3RydWVfdHlwZT46Ol9SZXQgX1RydWVGYWxzZVRydWVSZXQ7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHR5cGVfdG9fdmFsdWUoX1RydWVGYWxzZVRydWVSZXQoKSkgPT0gMCApOworICAgIHR5cGVkZWYgX0xhbmQzPF9fdHJ1ZV90eXBlLCBfX2ZhbHNlX3R5cGUsIF9fZmFsc2VfdHlwZT46Ol9SZXQgX1RydWVGYWxzZUZhbHNlUmV0OworICAgIENQUFVOSVRfQVNTRVJUKCB0eXBlX3RvX3ZhbHVlKF9UcnVlRmFsc2VGYWxzZVJldCgpKSA9PSAwICk7CisgICAgdHlwZWRlZiBfTGFuZDM8X19mYWxzZV90eXBlLCBfX3RydWVfdHlwZSwgX190cnVlX3R5cGU+OjpfUmV0IF9GYWxzZVRydWVUcnVlUmV0OworICAgIENQUFVOSVRfQVNTRVJUKCB0eXBlX3RvX3ZhbHVlKF9GYWxzZVRydWVUcnVlUmV0KCkpID09IDAgKTsKKyAgICB0eXBlZGVmIF9MYW5kMzxfX2ZhbHNlX3R5cGUsIF9fdHJ1ZV90eXBlLCBfX2ZhbHNlX3R5cGU+OjpfUmV0IF9GYWxzZVRydWVGYWxzZVJldDsKKyAgICBDUFBVTklUX0FTU0VSVCggdHlwZV90b192YWx1ZShfRmFsc2VUcnVlRmFsc2VSZXQoKSkgPT0gMCApOworICAgIHR5cGVkZWYgX0xhbmQzPF9fZmFsc2VfdHlwZSwgX19mYWxzZV90eXBlLCBfX3RydWVfdHlwZT46Ol9SZXQgX0ZhbHNlRmFsc2VUcnVlUmV0OworICAgIENQUFVOSVRfQVNTRVJUKCB0eXBlX3RvX3ZhbHVlKF9GYWxzZUZhbHNlVHJ1ZVJldCgpKSA9PSAwICk7CisgICAgdHlwZWRlZiBfTGFuZDM8X19mYWxzZV90eXBlLCBfX2ZhbHNlX3R5cGUsIF9fZmFsc2VfdHlwZT46Ol9SZXQgX0ZhbHNlRmFsc2VGYWxzZVJldDsKKyAgICBDUFBVTklUX0FTU0VSVCggdHlwZV90b192YWx1ZShfRmFsc2VGYWxzZUZhbHNlUmV0KCkpID09IDAgKTsKKyAgfQorCisgIHsKKyAgICB0eXBlZGVmIF9Mb3IyPF9fdHJ1ZV90eXBlLCBfX3RydWVfdHlwZT46Ol9SZXQgX1RydWVUcnVlUmV0OworICAgIENQUFVOSVRfQVNTRVJUKCB0eXBlX3RvX3ZhbHVlKF9UcnVlVHJ1ZVJldCgpKSA9PSAxICk7CisgICAgdHlwZWRlZiBfTG9yMjxfX3RydWVfdHlwZSwgX19mYWxzZV90eXBlPjo6X1JldCBfVHJ1ZUZhbHNlUmV0OworICAgIENQUFVOSVRfQVNTRVJUKCB0eXBlX3RvX3ZhbHVlKF9UcnVlRmFsc2VSZXQoKSkgPT0gMSApOworICAgIHR5cGVkZWYgX0xvcjI8X19mYWxzZV90eXBlLCBfX3RydWVfdHlwZT46Ol9SZXQgX0ZhbHNlVHJ1ZVJldDsKKyAgICBDUFBVTklUX0FTU0VSVCggdHlwZV90b192YWx1ZShfRmFsc2VUcnVlUmV0KCkpID09IDEgKTsKKyAgICB0eXBlZGVmIF9Mb3IyPF9fZmFsc2VfdHlwZSwgX19mYWxzZV90eXBlPjo6X1JldCBfRmFsc2VGYWxzZVJldDsKKyAgICBDUFBVTklUX0FTU0VSVCggdHlwZV90b192YWx1ZShfRmFsc2VGYWxzZVJldCgpKSA9PSAwICk7CisgIH0KKworICB7CisgICAgdHlwZWRlZiBfTG9yMzxfX3RydWVfdHlwZSwgX190cnVlX3R5cGUsIF9fdHJ1ZV90eXBlPjo6X1JldCBfVHJ1ZVRydWVUcnVlUmV0OworICAgIENQUFVOSVRfQVNTRVJUKCB0eXBlX3RvX3ZhbHVlKF9UcnVlVHJ1ZVRydWVSZXQoKSkgPT0gMSApOworICAgIHR5cGVkZWYgX0xvcjM8X190cnVlX3R5cGUsIF9fdHJ1ZV90eXBlLCBfX2ZhbHNlX3R5cGU+OjpfUmV0IF9UcnVlVHJ1ZUZhbHNlUmV0OworICAgIENQUFVOSVRfQVNTRVJUKCB0eXBlX3RvX3ZhbHVlKF9UcnVlVHJ1ZUZhbHNlUmV0KCkpID09IDEgKTsKKyAgICB0eXBlZGVmIF9Mb3IzPF9fdHJ1ZV90eXBlLCBfX2ZhbHNlX3R5cGUsIF9fdHJ1ZV90eXBlPjo6X1JldCBfVHJ1ZUZhbHNlVHJ1ZVJldDsKKyAgICBDUFBVTklUX0FTU0VSVCggdHlwZV90b192YWx1ZShfVHJ1ZUZhbHNlVHJ1ZVJldCgpKSA9PSAxICk7CisgICAgdHlwZWRlZiBfTG9yMzxfX3RydWVfdHlwZSwgX19mYWxzZV90eXBlLCBfX2ZhbHNlX3R5cGU+OjpfUmV0IF9UcnVlRmFsc2VGYWxzZVJldDsKKyAgICBDUFBVTklUX0FTU0VSVCggdHlwZV90b192YWx1ZShfVHJ1ZUZhbHNlRmFsc2VSZXQoKSkgPT0gMSApOworICAgIHR5cGVkZWYgX0xvcjM8X19mYWxzZV90eXBlLCBfX3RydWVfdHlwZSwgX190cnVlX3R5cGU+OjpfUmV0IF9GYWxzZVRydWVUcnVlUmV0OworICAgIENQUFVOSVRfQVNTRVJUKCB0eXBlX3RvX3ZhbHVlKF9GYWxzZVRydWVUcnVlUmV0KCkpID09IDEgKTsKKyAgICB0eXBlZGVmIF9Mb3IzPF9fZmFsc2VfdHlwZSwgX190cnVlX3R5cGUsIF9fZmFsc2VfdHlwZT46Ol9SZXQgX0ZhbHNlVHJ1ZUZhbHNlUmV0OworICAgIENQUFVOSVRfQVNTRVJUKCB0eXBlX3RvX3ZhbHVlKF9GYWxzZVRydWVGYWxzZVJldCgpKSA9PSAxICk7CisgICAgdHlwZWRlZiBfTG9yMzxfX2ZhbHNlX3R5cGUsIF9fZmFsc2VfdHlwZSwgX190cnVlX3R5cGU+OjpfUmV0IF9GYWxzZUZhbHNlVHJ1ZVJldDsKKyAgICBDUFBVTklUX0FTU0VSVCggdHlwZV90b192YWx1ZShfRmFsc2VGYWxzZVRydWVSZXQoKSkgPT0gMSApOworICAgIHR5cGVkZWYgX0xvcjM8X19mYWxzZV90eXBlLCBfX2ZhbHNlX3R5cGUsIF9fZmFsc2VfdHlwZT46Ol9SZXQgX0ZhbHNlRmFsc2VGYWxzZVJldDsKKyAgICBDUFBVTklUX0FTU0VSVCggdHlwZV90b192YWx1ZShfRmFsc2VGYWxzZUZhbHNlUmV0KCkpID09IDAgKTsKKyAgfQorCisgIHsKKyAgICB0eXBlZGVmIF9fc2VsZWN0PDEsIF9fdHJ1ZV90eXBlLCBfX2ZhbHNlX3R5cGU+OjpfUmV0IF9TZWxlY3RGaXJzdFJldDsKKyAgICBDUFBVTklUX0FTU0VSVCggdHlwZV90b192YWx1ZShfU2VsZWN0Rmlyc3RSZXQoKSkgPT0gMSApOworICAgIHR5cGVkZWYgX19zZWxlY3Q8MCwgX190cnVlX3R5cGUsIF9fZmFsc2VfdHlwZT46Ol9SZXQgX1NlbGVjdFNlY29uZFJldDsKKyAgICBDUFBVTklUX0FTU0VSVCggdHlwZV90b192YWx1ZShfU2VsZWN0U2Vjb25kUmV0KCkpID09IDAgKTsKKyMgIGlmIGRlZmluZWQgKF9fQk9STEFORENfXykKKyAgICB0eXBlZGVmIF9fc2VsZWN0VDxfX3RydWVfdHlwZSwgX190cnVlX3R5cGUsIF9fZmFsc2VfdHlwZT46Ol9SZXQgX1NlbGVjdEZpcnN0UmV0OworICAgIENQUFVOSVRfQVNTRVJUKCB0eXBlX3RvX3ZhbHVlKF9TZWxlY3RGaXJzdFJldCgpKSA9PSAxICk7CisgICAgdHlwZWRlZiBfX3NlbGVjdFQ8X19mYWxzZV90eXBlLCBfX3RydWVfdHlwZSwgX19mYWxzZV90eXBlPjo6X1JldCBfU2VsZWN0U2Vjb25kUmV0OworICAgIENQUFVOSVRfQVNTRVJUKCB0eXBlX3RvX3ZhbHVlKF9TZWxlY3RTZWNvbmRSZXQoKSkgPT0gMCApOworIyAgZW5kaWYKKyAgfQorCisgIHsKKyAgICBiYXNlIGI7CisgICAgZGVyaXZlZCBkOworICAgIGNvbnN0IGRlcml2ZWQgY2QgPSBkOworICAgIGJhc2UgKnBiID0gJmI7CisgICAgZGVyaXZlZCAqcGQgPSAmZDsKKyAgICBkZXJpdmVkIGNvbnN0ICpwY2QgPSBwZDsKKyAgICBDUFBVTklUX0NIRUNLKCBpc19jb252ZXJ0aWJsZShhbnksIGIpID09IDAgKTsKKyAgICBDUFBVTklUX0NIRUNLKCBpc19jb252ZXJ0aWJsZShkLCBiKSA9PSAxICk7CisgICAgQ1BQVU5JVF9DSEVDSyggaXNfY29udmVydGlibGUoY2QsIGIpID09IDEgKTsKKyAgICAvLyBfSXNDVkNvbnZlcnRpYmxlIG9ubHkgbmVlZHMgdG8gd29yayBmb3IgcG9pbnRlciB0eXBlOgorICAgIC8vQ1BQVU5JVF9DSEVDSyggaXNfY3ZfY29udmVydGlibGUoZCwgYikgPT0gMSApOworICAgIC8vQ1BQVU5JVF9DSEVDSyggaXNfY3ZfY29udmVydGlibGUoY2QsIGIpID09IDAgKTsKKworICAgIC8vX0lzQ29udmVydGlibGUgZG8gbm90IG5lZWQgdG8gd29yayBmb3IgcG9pbnRlcnM6CisgICAgLy9DUFBVTklUX0NIRUNLKCBpc19jb252ZXJ0aWJsZShwZCwgcGIpID09IDEgKTsKKyAgICAvL0NQUFVOSVRfQ0hFQ0soIGlzX2NvbnZlcnRpYmxlKHBjZCwgcGIpID09IDEgKTsKKworICAgIENQUFVOSVRfQ0hFQ0soIGlzX2N2X2NvbnZlcnRpYmxlKHBkLCBwYikgPT0gMSApOworICAgIENQUFVOSVRfQ0hFQ0soIGlzX2N2X2NvbnZlcnRpYmxlKHBjZCwgcGIpID09IDAgKTsKKyAgfQorI2VuZGlmCit9CisKKyNpZiBkZWZpbmVkIChTVExQT1JUKQordGVtcGxhdGUgPHR5cGVuYW1lIF9UeXBlPgoraW50IGlzX2ludGVnZXIoX1R5cGUpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSXNJbnRlZ3JhbDxfVHlwZT46Ol9SZXQgX1JldDsKKyAgcmV0dXJuIHR5cGVfdG9fdmFsdWUoX1JldCgpKTsKK30KKyNlbmRpZgorCit2b2lkIFR5cGVUcmFpdHNUZXN0OjppbnRlZ2VyKCkKK3sKKyNpZiBkZWZpbmVkIChTVExQT1JUKQorICBDUFBVTklUX0FTU0VSVCggaXNfaW50ZWdlcihib29sKCkpID09IDEgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIGlzX2ludGVnZXIoY2hhcigpKSA9PSAxICk7CisgIHR5cGVkZWYgc2lnbmVkIGNoYXIgc2lnbmVkX2NoYXI7CisgIENQUFVOSVRfQVNTRVJUKCBpc19pbnRlZ2VyKHNpZ25lZF9jaGFyKCkpID09IDEgKTsKKyAgdHlwZWRlZiB1bnNpZ25lZCBjaGFyIHVuc2lnbmVkX2NoYXI7CisgIENQUFVOSVRfQVNTRVJUKCBpc19pbnRlZ2VyKHVuc2lnbmVkX2NoYXIoKSkgPT0gMSApOworIyAgaWYgZGVmaW5lZCAoX1NUTFBfSEFTX1dDSEFSX1QpCisgIENQUFVOSVRfQVNTRVJUKCBpc19pbnRlZ2VyKHdjaGFyX3QoKSkgPT0gMSApOworIyAgZW5kaWYKKyAgQ1BQVU5JVF9BU1NFUlQoIGlzX2ludGVnZXIoc2hvcnQoKSkgPT0gMSApOworICB0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHVuc2lnbmVkX3Nob3J0OworICBDUFBVTklUX0FTU0VSVCggaXNfaW50ZWdlcih1bnNpZ25lZF9zaG9ydCgpKSA9PSAxICk7CisgIENQUFVOSVRfQVNTRVJUKCBpc19pbnRlZ2VyKGludCgpKSA9PSAxICk7CisgIHR5cGVkZWYgdW5zaWduZWQgaW50IHVuc2lnbmVkX2ludDsKKyAgQ1BQVU5JVF9BU1NFUlQoIGlzX2ludGVnZXIodW5zaWduZWRfaW50KCkpID09IDEgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIGlzX2ludGVnZXIobG9uZygpKSA9PSAxICk7CisgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyB1bnNpZ25lZF9sb25nOworICBDUFBVTklUX0FTU0VSVCggaXNfaW50ZWdlcih1bnNpZ25lZF9sb25nKCkpID09IDEgKTsKKyMgIGlmIGRlZmluZWQgKF9TVExQX0xPTkdfTE9ORykKKyAgdHlwZWRlZiBfU1RMUF9MT05HX0xPTkcgbG9uZ19sb25nOworICBDUFBVTklUX0FTU0VSVCggaXNfaW50ZWdlcihsb25nX2xvbmcoKSkgPT0gMSApOworICB0eXBlZGVmIHVuc2lnbmVkIF9TVExQX0xPTkdfTE9ORyB1bnNpZ25lZF9sb25nX2xvbmc7CisgIENQUFVOSVRfQVNTRVJUKCBpc19pbnRlZ2VyKHVuc2lnbmVkX2xvbmdfbG9uZygpKSA9PSAxICk7CisjICBlbmRpZgorICBDUFBVTklUX0FTU0VSVCggaXNfaW50ZWdlcihmbG9hdCgpKSA9PSAwICk7CisgIENQUFVOSVRfQVNTRVJUKCBpc19pbnRlZ2VyKGRvdWJsZSgpKSA9PSAwICk7CisjICBpZiAhZGVmaW5lZCAoIF9TVExQX05PX0xPTkdfRE9VQkxFICkKKyAgdHlwZWRlZiBsb25nIGRvdWJsZSBsb25nX2RvdWJsZTsKKyAgQ1BQVU5JVF9BU1NFUlQoIGlzX2ludGVnZXIobG9uZ19kb3VibGUoKSkgPT0gMCApOworIyAgZW5kaWYKKyAgQ1BQVU5JVF9BU1NFUlQoIGlzX2ludGVnZXIoYW55KSA9PSAwICk7CisgIENQUFVOSVRfQVNTRVJUKCBpc19pbnRlZ2VyKGFueV9wb2ludGVyKSA9PSAwICk7CisjZW5kaWYKK30KKworI2lmIGRlZmluZWQgKFNUTFBPUlQpCit0ZW1wbGF0ZSA8dHlwZW5hbWUgX1R5cGU+CitpbnQgaXNfcmF0aW9uYWwoX1R5cGUpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSXNSYXRpb25hbDxfVHlwZT46Ol9SZXQgX1JldDsKKyAgcmV0dXJuIHR5cGVfdG9fdmFsdWUoX1JldCgpKTsKK30KKyNlbmRpZgorCit2b2lkIFR5cGVUcmFpdHNUZXN0OjpyYXRpb25hbCgpCit7CisjaWYgZGVmaW5lZCAoU1RMUE9SVCkKKyAgQ1BQVU5JVF9BU1NFUlQoIGlzX3JhdGlvbmFsKGJvb2woKSkgPT0gMCApOworICBDUFBVTklUX0FTU0VSVCggaXNfcmF0aW9uYWwoY2hhcigpKSA9PSAwICk7CisgIHR5cGVkZWYgc2lnbmVkIGNoYXIgc2lnbmVkX2NoYXI7CisgIENQUFVOSVRfQVNTRVJUKCBpc19yYXRpb25hbChzaWduZWRfY2hhcigpKSA9PSAwICk7CisgIHR5cGVkZWYgdW5zaWduZWQgY2hhciB1bnNpZ25lZF9jaGFyOworICBDUFBVTklUX0FTU0VSVCggaXNfcmF0aW9uYWwodW5zaWduZWRfY2hhcigpKSA9PSAwICk7CisjICBpZiBkZWZpbmVkIChfU1RMUF9IQVNfV0NIQVJfVCkKKyAgQ1BQVU5JVF9BU1NFUlQoIGlzX3JhdGlvbmFsKHdjaGFyX3QoKSkgPT0gMCApOworIyAgZW5kaWYKKyAgQ1BQVU5JVF9BU1NFUlQoIGlzX3JhdGlvbmFsKHNob3J0KCkpID09IDAgKTsKKyAgdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1bnNpZ25lZF9zaG9ydDsKKyAgQ1BQVU5JVF9BU1NFUlQoIGlzX3JhdGlvbmFsKHVuc2lnbmVkX3Nob3J0KCkpID09IDAgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIGlzX3JhdGlvbmFsKGludCgpKSA9PSAwICk7CisgIHR5cGVkZWYgdW5zaWduZWQgaW50IHVuc2lnbmVkX2ludDsKKyAgQ1BQVU5JVF9BU1NFUlQoIGlzX3JhdGlvbmFsKHVuc2lnbmVkX2ludCgpKSA9PSAwICk7CisgIENQUFVOSVRfQVNTRVJUKCBpc19yYXRpb25hbChsb25nKCkpID09IDAgKTsKKyAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIHVuc2lnbmVkX2xvbmc7CisgIENQUFVOSVRfQVNTRVJUKCBpc19yYXRpb25hbCh1bnNpZ25lZF9sb25nKCkpID09IDAgKTsKKyMgIGlmIGRlZmluZWQgKF9TVExQX0xPTkdfTE9ORykKKyAgdHlwZWRlZiBfU1RMUF9MT05HX0xPTkcgbG9uZ19sb25nOworICBDUFBVTklUX0FTU0VSVCggaXNfcmF0aW9uYWwobG9uZ19sb25nKCkpID09IDAgKTsKKyAgdHlwZWRlZiB1bnNpZ25lZCBfU1RMUF9MT05HX0xPTkcgdW5zaWduZWRfbG9uZ19sb25nOworICBDUFBVTklUX0FTU0VSVCggaXNfcmF0aW9uYWwodW5zaWduZWRfbG9uZ19sb25nKCkpID09IDAgKTsKKyMgIGVuZGlmCisgIENQUFVOSVRfQVNTRVJUKCBpc19yYXRpb25hbChmbG9hdCgpKSA9PSAxICk7CisgIENQUFVOSVRfQVNTRVJUKCBpc19yYXRpb25hbChkb3VibGUoKSkgPT0gMSApOworIyAgaWYgIWRlZmluZWQgKCBfU1RMUF9OT19MT05HX0RPVUJMRSApCisgIHR5cGVkZWYgbG9uZyBkb3VibGUgbG9uZ19kb3VibGU7CisgIENQUFVOSVRfQVNTRVJUKCBpc19yYXRpb25hbChsb25nX2RvdWJsZSgpKSA9PSAxICk7CisjICBlbmRpZgorICBDUFBVTklUX0FTU0VSVCggaXNfcmF0aW9uYWwoYW55KSA9PSAwICk7CisgIENQUFVOSVRfQVNTRVJUKCBpc19yYXRpb25hbChhbnlfcG9pbnRlcikgPT0gMCApOworI2VuZGlmCit9CisKKyNpZiBkZWZpbmVkIChTVExQT1JUKQordGVtcGxhdGUgPHR5cGVuYW1lIF9UeXBlPgoraW50IGlzX3BvaW50ZXJfdHlwZShfVHlwZSkgeworICByZXR1cm4gdHlwZV90b192YWx1ZShfSXNQdHJUeXBlPF9UeXBlPjo6X1JldCgpKTsKK30KKyNlbmRpZgorCit2b2lkIFR5cGVUcmFpdHNUZXN0Ojpwb2ludGVyX3R5cGUoKQoreworI2lmIGRlZmluZWQgKFNUTFBPUlQpCisgIENQUFVOSVRfQVNTRVJUKCBpc19wb2ludGVyX3R5cGUoaW50X3ZhbCkgPT0gMCApOworICBDUFBVTklUX0FTU0VSVCggaXNfcG9pbnRlcl90eXBlKGludF9wb2ludGVyKSA9PSAxICk7CisgIENQUFVOSVRfQVNTRVJUKCBpc19wb2ludGVyX3R5cGUoaW50X2NvbnN0X3BvaW50ZXIpID09IDEgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIGlzX3BvaW50ZXJfdHlwZShpbnRfdm9sYXRpbGVfcG9pbnRlcikgPT0gMSApOworICBDUFBVTklUX0FTU0VSVCggaXNfcG9pbnRlcl90eXBlKGludF9jb25zdF92b2xhdGlsZV9wb2ludGVyKSA9PSAxICk7CisgIENQUFVOSVRfQVNTRVJUKCBpc19wb2ludGVyX3R5cGUoaW50X3JlZikgPT0gMCApOworICBDUFBVTklUX0FTU0VSVCggaXNfcG9pbnRlcl90eXBlKGludF9jb25zdF9yZWYpID09IDAgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIGlzX3BvaW50ZXJfdHlwZShhbnkpID09IDAgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIGlzX3BvaW50ZXJfdHlwZShhbnlfcG9pbnRlcikgPT0gMSApOworI2VuZGlmCit9CisKK3ZvaWQgVHlwZVRyYWl0c1Rlc3Q6OnJlZmVyZW5jZV90eXBlKCkKK3sKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQorICBDUFBVTklUX0FTU0VSVCggdHlwZV90b192YWx1ZShfSXNSZWZUeXBlPGludD46Ol9SZXQoKSkgPT0gMCApOworICBDUFBVTklUX0FTU0VSVCggdHlwZV90b192YWx1ZShfSXNSZWZUeXBlPGludCo+OjpfUmV0KCkpID09IDAgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHR5cGVfdG9fdmFsdWUoX0lzUmVmVHlwZTxpbnQmPjo6X1JldCgpKSA9PSAxICk7CisgIENQUFVOSVRfQVNTRVJUKCB0eXBlX3RvX3ZhbHVlKF9Jc1JlZlR5cGU8aW50IGNvbnN0Jj46Ol9SZXQoKSkgPT0gMSApOworICBDUFBVTklUX0FTU0VSVCggdHlwZV90b192YWx1ZShfSXNSZWZUeXBlPGludCBjb25zdCB2b2xhdGlsZSY+OjpfUmV0KCkpID09IDEgKTsKKworICBDUFBVTklUX0FTU0VSVCggdHlwZV90b192YWx1ZShfSXNPS1RvU3dhcChpbnRfcG9pbnRlciwgaW50X3BvaW50ZXIsIF9fdHJ1ZV90eXBlKCksIF9fdHJ1ZV90eXBlKCkpLl9BbnN3ZXIoKSkgPT0gMSApOworICBDUFBVTklUX0FTU0VSVCggdHlwZV90b192YWx1ZShfSXNPS1RvU3dhcChpbnRfcG9pbnRlciwgaW50X3BvaW50ZXIsIF9fZmFsc2VfdHlwZSgpLCBfX2ZhbHNlX3R5cGUoKSkuX0Fuc3dlcigpKSA9PSAwICk7CisjZW5kaWYKK30KKworI2lmIGRlZmluZWQgKFNUTFBPUlQpCit0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX1RwMj4KK2ludCBhcmVfYm90aF9wb2ludGVyX3R5cGUgKF9UcDEsIF9UcDIpIHsKKyAgcmV0dXJuIHR5cGVfdG9fdmFsdWUoX0JvdGhQdHJUeXBlPF9UcDEsIF9UcDI+OjpfQW5zd2VyKCkpOworfQorI2VuZGlmCisKK3ZvaWQgVHlwZVRyYWl0c1Rlc3Q6OmJvdGhfcG9pbnRlcl90eXBlKCkKK3sKKyNpZiBkZWZpbmVkIChTVExQT1JUKQorICBDUFBVTklUX0NIRUNLKCBhcmVfYm90aF9wb2ludGVyX3R5cGUoaW50X3ZhbCwgaW50X3ZhbCkgPT0gMCApOworICBDUFBVTklUX0NIRUNLKCBhcmVfYm90aF9wb2ludGVyX3R5cGUoaW50X3BvaW50ZXIsIGludF9wb2ludGVyKSA9PSAxICk7CisgIENQUFVOSVRfQ0hFQ0soIGFyZV9ib3RoX3BvaW50ZXJfdHlwZShpbnRfY29uc3RfcG9pbnRlciwgaW50X2NvbnN0X3BvaW50ZXIpID09IDEgKTsKKyAgQ1BQVU5JVF9DSEVDSyggYXJlX2JvdGhfcG9pbnRlcl90eXBlKGludF92b2xhdGlsZV9wb2ludGVyLCBpbnRfdm9sYXRpbGVfcG9pbnRlcikgPT0gMSApOworICBDUFBVTklUX0NIRUNLKCBhcmVfYm90aF9wb2ludGVyX3R5cGUoaW50X2NvbnN0X3ZvbGF0aWxlX3BvaW50ZXIsIGludF9jb25zdF92b2xhdGlsZV9wb2ludGVyKSA9PSAxICk7CisgIENQUFVOSVRfQ0hFQ0soIGFyZV9ib3RoX3BvaW50ZXJfdHlwZShpbnRfcmVmLCBpbnRfcmVmKSA9PSAwICk7CisgIENQUFVOSVRfQ0hFQ0soIGFyZV9ib3RoX3BvaW50ZXJfdHlwZShpbnRfY29uc3RfcmVmLCBpbnRfY29uc3RfcmVmKSA9PSAwICk7CisgIENQUFVOSVRfQ0hFQ0soIGFyZV9ib3RoX3BvaW50ZXJfdHlwZShhbnksIGFueSkgPT0gMCApOworICBDUFBVTklUX0NIRUNLKCBhcmVfYm90aF9wb2ludGVyX3R5cGUoYW55X3BvaW50ZXIsIGFueV9wb2ludGVyKSA9PSAxICk7CisjZW5kaWYKK30KKworI2lmIGRlZmluZWQgKFNUTFBPUlQpCit0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX1RwMj4KK2ludCBpc19va190b191c2VfbWVtY3B5KF9UcDEgdmFsMSwgX1RwMiB2YWwyKSB7CisgIHJldHVybiB0eXBlX3RvX3ZhbHVlKF9Vc2VUcml2aWFsQ29weSh2YWwxLCB2YWwyKS5fQW5zd2VyKCkpOworfQorI2VuZGlmCisKK3ZvaWQgVHlwZVRyYWl0c1Rlc3Q6Om9rX3RvX3VzZV9tZW1jcHkoKQoreworI2lmIGRlZmluZWQgKFNUTFBPUlQpICYmICFkZWZpbmVkIChfU1RMUF9ET05UX1NJTVVMQVRFX1BBUlRJQUxfU1BFQ19GT1JfVFlQRV9UUkFJVFMpCisgIENQUFVOSVRfQ0hFQ0soIGlzX29rX3RvX3VzZV9tZW1jcHkoaW50X3BvaW50ZXIsIGludF9wb2ludGVyKSA9PSAxICk7CisgIENQUFVOSVRfQ0hFQ0soIGlzX29rX3RvX3VzZV9tZW1jcHkoaW50X2NvbnN0X3BvaW50ZXIsIGludF9wb2ludGVyKSA9PSAxICk7CisgIENQUFVOSVRfQ0hFQ0soIGlzX29rX3RvX3VzZV9tZW1jcHkoaW50X3BvaW50ZXIsIGludF92b2xhdGlsZV9wb2ludGVyKSA9PSAwICk7CisgIENQUFVOSVRfQ0hFQ0soIGlzX29rX3RvX3VzZV9tZW1jcHkoaW50X3BvaW50ZXIsIGludF9jb25zdF92b2xhdGlsZV9wb2ludGVyKSA9PSAwICk7CisgIENQUFVOSVRfQ0hFQ0soIGlzX29rX3RvX3VzZV9tZW1jcHkoaW50X2NvbnN0X3BvaW50ZXIsIGludF9jb25zdF9wb2ludGVyKSA9PSAwICk7CisgIENQUFVOSVRfQ0hFQ0soIGlzX29rX3RvX3VzZV9tZW1jcHkoaW50X2NvbnN0X3BvaW50ZXIsIGludF92b2xhdGlsZV9wb2ludGVyKSA9PSAwICk7CisgIENQUFVOSVRfQ0hFQ0soIGlzX29rX3RvX3VzZV9tZW1jcHkoaW50X2NvbnN0X3BvaW50ZXIsIGludF9jb25zdF92b2xhdGlsZV9wb2ludGVyKSA9PSAwICk7CisgIENQUFVOSVRfQ0hFQ0soIGlzX29rX3RvX3VzZV9tZW1jcHkoaW50X2NvbnN0X3ZvbGF0aWxlX3BvaW50ZXIsIGludF9jb25zdF92b2xhdGlsZV9wb2ludGVyKSA9PSAwICk7CisgIENQUFVOSVRfQ0hFQ0soIGlzX29rX3RvX3VzZV9tZW1jcHkoaW50X3BvaW50ZXIsIGFueV9wb2ludGVyKSA9PSAwICk7CisgIENQUFVOSVRfQ0hFQ0soIGlzX29rX3RvX3VzZV9tZW1jcHkoYW55X3BvaW50ZXIsIGludF9wb2ludGVyKSA9PSAwICk7CisgIENQUFVOSVRfQ0hFQ0soIGlzX29rX3RvX3VzZV9tZW1jcHkoYW55X3BvaW50ZXIsIGFueV9wb2ludGVyKSA9PSAwICk7CisgIENQUFVOSVRfQ0hFQ0soIGlzX29rX3RvX3VzZV9tZW1jcHkoYW55X3BvaW50ZXIsIGFueV9jb25zdF9wb2ludGVyKSA9PSAwICk7CisgIENQUFVOSVRfQ0hFQ0soIGlzX29rX3RvX3VzZV9tZW1jcHkoYW55X3BvZF9wb2ludGVyLCBpbnRfcG9pbnRlcikgPT0gMCApOworICBDUFBVTklUX0NIRUNLKCBpc19va190b191c2VfbWVtY3B5KGFueV9wb2RfcG9pbnRlciwgYW55X3BvZF9wb2ludGVyKSA9PSAxICk7CisgIENQUFVOSVRfQ0hFQ0soIGlzX29rX3RvX3VzZV9tZW1jcHkoYW55X3BvZF9wb2ludGVyLCBhbnlfcG9kX2NvbnN0X3BvaW50ZXIpID09IDAgKTsKKyAgdmVjdG9yPGZsb2F0PiAqKnB2ZiA9IDA7CisgIHZlY3RvcjxpbnQ+ICoqcHZpID0gMDsKKyAgQ1BQVU5JVF9DSEVDSyggaXNfb2tfdG9fdXNlX21lbWNweShwdmYsIHB2aSkgPT0gMCApOworICBDUFBVTklUX0NIRUNLKCBpc19va190b191c2VfbWVtY3B5KHB2aSwgcHZmKSA9PSAwICk7CisjZW5kaWYKK30KKworI2lmIGRlZmluZWQgKFNUTFBPUlQpCit0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX1RwMj4KK2ludCBpc19va190b191c2VfbWVtbW92ZShfVHAxIHZhbDEsIF9UcDIgdmFsMikgeworICByZXR1cm4gdHlwZV90b192YWx1ZShfVXNlVHJpdmlhbFVDb3B5KHZhbDEsIHZhbDIpLl9BbnN3ZXIoKSk7Cit9CisjZW5kaWYKKwordm9pZCBUeXBlVHJhaXRzVGVzdDo6b2tfdG9fdXNlX21lbW1vdmUoKQoreworI2lmIGRlZmluZWQgKFNUTFBPUlQpICYmICFkZWZpbmVkIChfU1RMUF9ET05UX1NJTVVMQVRFX1BBUlRJQUxfU1BFQ19GT1JfVFlQRV9UUkFJVFMpCisgIENQUFVOSVRfQ0hFQ0soIGlzX29rX3RvX3VzZV9tZW1tb3ZlKGludF9wb2ludGVyLCBpbnRfcG9pbnRlcikgPT0gMSApOworICBDUFBVTklUX0NIRUNLKCBpc19va190b191c2VfbWVtbW92ZShpbnRfY29uc3RfcG9pbnRlciwgaW50X3BvaW50ZXIpID09IDEgKTsKKyAgQ1BQVU5JVF9DSEVDSyggaXNfb2tfdG9fdXNlX21lbW1vdmUoaW50X3BvaW50ZXIsIGludF92b2xhdGlsZV9wb2ludGVyKSA9PSAwICk7CisgIENQUFVOSVRfQ0hFQ0soIGlzX29rX3RvX3VzZV9tZW1tb3ZlKGludF9wb2ludGVyLCBpbnRfY29uc3Rfdm9sYXRpbGVfcG9pbnRlcikgPT0gMCApOworICBDUFBVTklUX0NIRUNLKCBpc19va190b191c2VfbWVtbW92ZShpbnRfY29uc3RfcG9pbnRlciwgaW50X2NvbnN0X3BvaW50ZXIpID09IDAgKTsKKyAgQ1BQVU5JVF9DSEVDSyggaXNfb2tfdG9fdXNlX21lbW1vdmUoaW50X2NvbnN0X3BvaW50ZXIsIGludF92b2xhdGlsZV9wb2ludGVyKSA9PSAwICk7CisgIENQUFVOSVRfQ0hFQ0soIGlzX29rX3RvX3VzZV9tZW1tb3ZlKGludF9jb25zdF9wb2ludGVyLCBpbnRfY29uc3Rfdm9sYXRpbGVfcG9pbnRlcikgPT0gMCApOworICBDUFBVTklUX0NIRUNLKCBpc19va190b191c2VfbWVtbW92ZShpbnRfY29uc3Rfdm9sYXRpbGVfcG9pbnRlciwgaW50X2NvbnN0X3ZvbGF0aWxlX3BvaW50ZXIpID09IDAgKTsKKyAgQ1BQVU5JVF9DSEVDSyggaXNfb2tfdG9fdXNlX21lbW1vdmUoaW50X3BvaW50ZXIsIGFueV9wb2ludGVyKSA9PSAwICk7CisgIENQUFVOSVRfQ0hFQ0soIGlzX29rX3RvX3VzZV9tZW1tb3ZlKGFueV9wb2ludGVyLCBpbnRfcG9pbnRlcikgPT0gMCApOworICBDUFBVTklUX0NIRUNLKCBpc19va190b191c2VfbWVtbW92ZShhbnlfcG9pbnRlciwgYW55X3BvaW50ZXIpID09IDAgKTsKKyAgQ1BQVU5JVF9DSEVDSyggaXNfb2tfdG9fdXNlX21lbW1vdmUoYW55X3BvaW50ZXIsIGFueV9jb25zdF9wb2ludGVyKSA9PSAwICk7CisgIENQUFVOSVRfQ0hFQ0soIGlzX29rX3RvX3VzZV9tZW1tb3ZlKGFueV9wb2RfcG9pbnRlciwgaW50X3BvaW50ZXIpID09IDAgKTsKKyAgQ1BQVU5JVF9DSEVDSyggaXNfb2tfdG9fdXNlX21lbW1vdmUoYW55X3BvZF9wb2ludGVyLCBhbnlfcG9kX3BvaW50ZXIpID09IDEgKTsKKyAgQ1BQVU5JVF9DSEVDSyggaXNfb2tfdG9fdXNlX21lbW1vdmUoYW55X3BvZF9wb2ludGVyLCBhbnlfcG9kX2NvbnN0X3BvaW50ZXIpID09IDAgKTsKKyNlbmRpZgorfQorCisjaWYgZGVmaW5lZCAoU1RMUE9SVCkKK3RlbXBsYXRlIDx0eXBlbmFtZSBfVHA+CitpbnQgaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcihfVHApIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX3R5cGVfdHJhaXRzPF9UcD46Omhhc190cml2aWFsX2Rlc3RydWN0b3IgX1RyaXZpYWxEZXN0cnVjdG9yOworICByZXR1cm4gdHlwZV90b192YWx1ZShfVHJpdmlhbERlc3RydWN0b3IoKSk7Cit9CisKK3N0cnVjdCBEZXN0cnVjdG9yTW9uaXRvcgoreworICB+RGVzdHJ1Y3Rvck1vbml0b3IoKQorICB7ICsrbmJfZGVzdHJ1Y3Rvcl9jYWxsOyB9CisKKyAgc3RhdGljIHNpemVfdCBuYl9kZXN0cnVjdG9yX2NhbGw7Cit9OworCitzaXplX3QgRGVzdHJ1Y3Rvck1vbml0b3I6Om5iX2Rlc3RydWN0b3JfY2FsbCA9IDA7CisKKyMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9OQU1FU1BBQ0VTKQorbmFtZXNwYWNlIHN0ZCB7CisjICBlbmRpZgorICBfU1RMUF9URU1QTEFURV9OVUxMCisgIHN0cnVjdCBfX3R5cGVfdHJhaXRzPERlc3RydWN0b3JNb25pdG9yPiB7CisgICAgdHlwZWRlZiBfX3RydWVfdHlwZSBoYXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yOworICAgIHR5cGVkZWYgX190cnVlX3R5cGUgaGFzX3RyaXZpYWxfY29weV9jb25zdHJ1Y3RvcjsKKyAgICB0eXBlZGVmIF9fdHJ1ZV90eXBlIGhhc190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3I7CisgICAgdHlwZWRlZiBfX3RydWVfdHlwZSBoYXNfdHJpdmlhbF9kZXN0cnVjdG9yOworICAgIHR5cGVkZWYgX190cnVlX3R5cGUgaXNfUE9EX3R5cGU7CisgIH07CisjICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfTkFNRVNQQUNFUykKK30KKyMgIGVuZGlmCisjZW5kaWYKKwordm9pZCBUeXBlVHJhaXRzVGVzdDo6dHJpdmlhbF9kZXN0cnVjdG9yKCkKK3sKKyNpZiBkZWZpbmVkIChTVExQT1JUKQorICBDUFBVTklUX0NIRUNLKCBoYXNfdHJpdmlhbF9kZXN0cnVjdG9yKGludF9wb2ludGVyKSA9PSAxICk7CisgIENQUFVOSVRfQ0hFQ0soIGhhc190cml2aWFsX2Rlc3RydWN0b3IoaW50X2NvbnN0X3BvaW50ZXIpID09IDEgKTsKKyAgQ1BQVU5JVF9DSEVDSyggaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcihpbnRfdm9sYXRpbGVfcG9pbnRlcikgPT0gMSApOworICBDUFBVTklUX0NIRUNLKCBoYXNfdHJpdmlhbF9kZXN0cnVjdG9yKGludF9jb25zdF92b2xhdGlsZV9wb2ludGVyKSA9PSAxICk7CisgIENQUFVOSVRfQ0hFQ0soIGhhc190cml2aWFsX2Rlc3RydWN0b3IoYW55X3BvaW50ZXIpID09IDEgKTsKKyAgQ1BQVU5JVF9DSEVDSyggaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcihhbnkpID09IDAgKTsKKyAgQ1BQVU5JVF9DSEVDSyggaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcihhbnlfcG9pbnRlcikgPT0gMSApOworICBDUFBVTklUX0NIRUNLKCBoYXNfdHJpdmlhbF9kZXN0cnVjdG9yKGFueV9wb2QpID09IDEgKTsKKyAgQ1BQVU5JVF9DSEVDSyggaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcihzdHJpbmcoKSkgPT0gMCApOworCisgIC8vQ2hlY2sgb2YgdGhlIG1ldGEgaW5mb3JtYXRpb24gaW1wYWN0IGluIGEgY29udGFpbmVyIGltcGxlbWVudGF0aW9uCisgIHsKKyAgICB2ZWN0b3I8RGVzdHJ1Y3Rvck1vbml0b3I+IHYoMTApOworICAgIERlc3RydWN0b3JNb25pdG9yOjpuYl9kZXN0cnVjdG9yX2NhbGwgPSAwOworICB9CisgIENQUFVOSVRfQ0hFQ0soIERlc3RydWN0b3JNb25pdG9yOjpuYl9kZXN0cnVjdG9yX2NhbGwgPT0gMCApOworI2VuZGlmCit9CisKKyNpZiBkZWZpbmVkIChTVExQT1JUKQordGVtcGxhdGUgPHR5cGVuYW1lIF9UcD4KK2ludCBpc19QT0RfdHlwZShfVHApIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX3R5cGVfdHJhaXRzPF9UcD46OmlzX1BPRF90eXBlIF9Jc1BPRFR5cGU7CisgIHJldHVybiB0eXBlX3RvX3ZhbHVlKF9Jc1BPRFR5cGUoKSk7Cit9CisjZW5kaWYKKwordm9pZCBUeXBlVHJhaXRzVGVzdDo6aXNfUE9EKCkKK3sKKyNpZiBkZWZpbmVkIChTVExQT1JUKQorICBDUFBVTklUX0NIRUNLKCBpc19QT0RfdHlwZShpbnRfcG9pbnRlcikgPT0gMSApOworICBDUFBVTklUX0NIRUNLKCBpc19QT0RfdHlwZShpbnRfY29uc3RfcG9pbnRlcikgPT0gMSApOworICBDUFBVTklUX0NIRUNLKCBpc19QT0RfdHlwZShpbnRfdm9sYXRpbGVfcG9pbnRlcikgPT0gMSApOworICBDUFBVTklUX0NIRUNLKCBpc19QT0RfdHlwZShpbnRfY29uc3Rfdm9sYXRpbGVfcG9pbnRlcikgPT0gMSApOworICBDUFBVTklUX0NIRUNLKCBpc19QT0RfdHlwZShhbnlfcG9pbnRlcikgPT0gMSApOworICBDUFBVTklUX0NIRUNLKCBpc19QT0RfdHlwZShhbnkpID09IDAgKTsKKyAgQ1BQVU5JVF9DSEVDSyggaXNfUE9EX3R5cGUoYW55X3BvaW50ZXIpID09IDEgKTsKKyAgQ1BQVU5JVF9DSEVDSyggaXNfUE9EX3R5cGUoYW55X3BvZCkgPT0gMSApOworICBDUFBVTklUX0NIRUNLKCBpc19QT0RfdHlwZShzdHJpbmcoKSkgPT0gMCApOworI2VuZGlmCit9CisKKyNpZiBkZWZpbmVkIChTVExQT1JUKQordGVtcGxhdGUgPHR5cGVuYW1lIF9UcD4KK2ludCBpc19zdGxwb3J0X2NsYXNzKF9UcCkgeworICB0eXBlZGVmIF9Jc1NUTHBvcnRDbGFzczxfVHA+IF9TVExwb3J0Q2xhc3M7CisjICAgIGlmICFkZWZpbmVkIChfX0JPUkxBTkRDX18pCisgIHR5cGVkZWYgdHlwZW5hbWUgX1NUTHBvcnRDbGFzczo6X1JldCBfSXM7CisjICAgIGVsc2UKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jvb2wydHlwZTxfU1RMcG9ydENsYXNzOjpfSXM+OjpfUmV0IF9JczsKKyMgICAgZW5kaWYKKyAgcmV0dXJuIHR5cGVfdG9fdmFsdWUoX0lzKCkpOworfQorI2VuZGlmCisKK3ZvaWQgVHlwZVRyYWl0c1Rlc3Q6OnN0bHBvcnRfY2xhc3MoKQoreworI2lmIGRlZmluZWQgKFNUTFBPUlQpCisgIENQUFVOSVRfQ0hFQ0soIGlzX3N0bHBvcnRfY2xhc3MoYWxsb2NhdG9yPGNoYXI+KCkpID09IDEgKTsKKyMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9QQVJUSUFMX1NQRUNfV09SS0FST1VORCkKKyAgQ1BQVU5JVF9DSEVDSyggaXNfc3RscG9ydF9jbGFzcyhzdHJpbmcoKSkgPT0gMSApOworIyAgZW5kaWYKKyAgQ1BQVU5JVF9DSEVDSyggaXNfc3RscG9ydF9jbGFzcyhhbnkpID09IDAgKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L3R5cGVpbmZvX2hlYWRlcl90ZXN0LmNwcCBiL3Rlc3QvdW5pdC90eXBlaW5mb19oZWFkZXJfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UzZjVlYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC90eXBlaW5mb19oZWFkZXJfdGVzdC5jcHAKQEAgLTAsMCArMSwyMCBAQAorLyogVGhpcyB0ZXN0IHB1cnBvc2UgaXMgc2ltcGx5IHRvIGNoZWNrIFN0YW5kYXJkIGhlYWRlciBpbmRlcGVuZGFuY3kgdGhhdAorICogaXMgdG8gc2F5IHRoYXQgdGhlIGhlYWRlciBjYW4gYmUgaW5jbHVkZWQgYWxvbmUgd2l0aG91dCBhbnkgcHJldmlvdXMKKyAqIGluY2x1ZGUuCisgKiBBZGRpdGlvbm5hbHksIGZvciBDIFN0YW5kYXJkIGhlYWRlcnMgdGhhdCBTVExwb3J0IGV4cG9zZSwgaXQgY2FuIGFsc28gYmUKKyAqIHVzZWQgdG8gY2hlY2sgdGhhdCBmaWxlcyBpbmNsdWRlZCBieSB0aG9zZSBoZWFkZXJzIGFyZSBjb21wYXRpYmxlIHdpdGgKKyAqIHB1cmUgQyBjb21waWxlcnMuCisgKi8KKyNpbmNsdWRlIDx0eXBlaW5mbz4KKworI2lmIDAgLyogIWRlZmluZWQgKF9TVExQX05PX1JUVEkpICYmICFkZWZpbmVkIChfU1RMUF9OT19UWVBFSU5GTykgKi8KKy8qIFNvdXJjZUZvcmdlOiBTVExwb3J0IGJ1ZyByZXBvcnQgMTcyMTg0NAorICogdHlwZV9pbmZvIGlzIG5vdCBhIG1lbWJlciBvZiBzdGxwX3N0ZAorICovCitjbGFzcyBBIHt9OworCit2b2lkIHR5cGVfaW5mb19oZWFkZXJfdGVzdCgpCit7CisgIGNvbnN0IHN0ZDo6dHlwZV9pbmZvJiB0aSA9IHR5cGVpZChBKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L3VuYXJ5LmggYi90ZXN0L3VuaXQvdW5hcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzllZjQzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L3VuYXJ5LmgKQEAgLTAsMCArMSwyMyBAQAorI2lmbmRlZiBfdW5hcnlfaAorI2RlZmluZSBfdW5hcnlfaAorI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPGNmbG9hdD4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPiAgICAvLypUWSAxMi8yNi8xOTk4IC0gYWRkZWQgdG8gZ2V0IHVuYXJ5X2Z1bmN0aW9uCisKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZCAoX1NUTFBfVVNFX05BTUVTUEFDRVMpCit1c2luZyBzdGQ6OnVuYXJ5X2Z1bmN0aW9uOworI2VuZGlmCisKK3N0cnVjdCBvZGQgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248aW50LCBib29sPiB7CisgIGJvb2wgb3BlcmF0b3IoKShpbnQgbl8pIGNvbnN0IHsgcmV0dXJuKG5fICUgMikgPT0gMTsgfQorfTsKKworc3RydWN0IHBvc2l0aXZlIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPGludCwgYm9vbD4geworICBib29sIG9wZXJhdG9yKCkoaW50IG5fKSBjb25zdCB7IHJldHVybiBuXyA+PSAwOyB9Cit9OworCitzdHJ1Y3Qgc3F1YXJlX3Jvb3QgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248ZG91YmxlLCBkb3VibGU+IHsKKyAgZG91YmxlIG9wZXJhdG9yKCkoZG91YmxlIHhfKSBjb25zdAorICB7IHJldHVybiA6OnNxcnQoeF8pOyB9Cit9OworI2VuZGlmIC8vIF91bmFyeV9oCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvdW5hcnlfdGVzdC5jcHAgYi90ZXN0L3VuaXQvdW5hcnlfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU0ODBiNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC91bmFyeV90ZXN0LmNwcApAQCAtMCwwICsxLDk4IEBACisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgInVuYXJ5LmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSAiY3BwdW5pdC9jcHB1bml0X3Byb3h5LmgiCisKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZChfU1RMUF9VU0VfTkFNRVNQQUNFUykKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisjZW5kaWYKKworLy8KKy8vIFRlc3RDYXNlIGNsYXNzCisvLworY2xhc3MgVW5hcnlUZXN0IDogcHVibGljIENQUFVOSVRfTlM6OlRlc3RDYXNlCit7CisgIENQUFVOSVRfVEVTVF9TVUlURShVbmFyeVRlc3QpOworI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQorICBDUFBVTklUX0lHTk9SRTsKKyNlbmRpZgorICBDUFBVTklUX1RFU1QodWNvbXBvczEpOworICBDUFBVTklUX1RFU1QodWNvbXBvczIpOworICBDUFBVTklUX1NUT1BfSUdOT1JFOworICBDUFBVTklUX1RFU1QodW5lZ2F0ZTEpOworICBDUFBVTklUX1RFU1QodW5lZ2F0ZTIpOworI2lmIGRlZmluZWQgKFNUTFBPUlQpICYmICFkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQorICBDUFBVTklUX0lHTk9SRTsKKyNlbmRpZgorICBDUFBVTklUX1RFU1QodW5lZ2F0ZTMpOworICBDUFBVTklUX1RFU1RfU1VJVEVfRU5EKCk7CisKK3Byb3RlY3RlZDoKKyAgdm9pZCB1Y29tcG9zMSgpOworICB2b2lkIHVjb21wb3MyKCk7CisgIHZvaWQgdW5lZ2F0ZTEoKTsKKyAgdm9pZCB1bmVnYXRlMigpOworICB2b2lkIHVuZWdhdGUzKCk7Cit9OworCitDUFBVTklUX1RFU1RfU1VJVEVfUkVHSVNUUkFUSU9OKFVuYXJ5VGVzdCk7CisKKy8vCisvLyB0ZXN0cyBpbXBsZW1lbnRhdGlvbgorLy8KK3ZvaWQgVW5hcnlUZXN0Ojp1bmVnYXRlMSgpCit7CisgIGludCBhcnJheSBbM10gPSB7IDEsIDIsIDMgfTsKKyAgLy91bmFyeV9uZWdhdGU8b2RkPjo6YXJndW1lbnRfdHlwZSBhcmdfdmFsID0gMDsKKyAgaW50KiBwID0gZmluZF9pZigoaW50KilhcnJheSwgKGludCopYXJyYXkgKyAzLCB1bmFyeV9uZWdhdGU8b2RkPihvZGQoKSkpOworICBDUFBVTklUX0FTU0VSVCgocCAhPSBhcnJheSArIDMpKTsKKyAgQ1BQVU5JVF9BU1NFUlQoKnA9PTIpOworfQordm9pZCBVbmFyeVRlc3Q6OnVuZWdhdGUyKCkKK3sKKyAgaW50IGFycmF5IFszXSA9IHsgMSwgMiwgMyB9OworICBpbnQqIHAgPSBmaW5kX2lmKChpbnQqKWFycmF5LCAoaW50KilhcnJheSArIDMsIG5vdDEob2RkKCkpKTsKKyAgQ1BQVU5JVF9BU1NFUlQocCAhPSBhcnJheSArIDMpOworICBDUFBVTklUX0FTU0VSVCgqcD09Mik7Cit9CisKK2Jvb2wgdGVzdF9mdW5jKGludCBwYXJhbSkgeworICByZXR1cm4gcGFyYW0gPCAzOworfQordm9pZCBVbmFyeVRlc3Q6OnVuZWdhdGUzKCkKK3sKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikKKyAgaW50IGFycmF5IFszXSA9IHsgMSwgMiwgMyB9OworICBpbnQqIHAgPSBmaW5kX2lmKChpbnQqKWFycmF5LCAoaW50KilhcnJheSArIDMsIG5vdDEocHRyX2Z1bih0ZXN0X2Z1bmMpKSk7CisgIENQUFVOSVRfQVNTRVJUKHAgIT0gYXJyYXkgKyAzKTsKKyAgQ1BQVU5JVF9BU1NFUlQoKnA9PTMpOworI2VuZGlmCit9CisKK3ZvaWQgVW5hcnlUZXN0Ojp1Y29tcG9zMSgpCit7CisjaWYgZGVmaW5lZCAoU1RMUE9SVCkgJiYgIWRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpCisgIGludCBpbnB1dCBbM10gPSB7IC0xLCAtNCwgLTE2IH07CisKKyAgZG91YmxlIG91dHB1dFszXTsKKyAgdHJhbnNmb3JtKChpbnQqKWlucHV0LCAoaW50KilpbnB1dCArIDMsIG91dHB1dCwgdW5hcnlfY29tcG9zZTxzcXVhcmVfcm9vdCwgbmVnYXRlPGludD4gPihzcXVhcmVfcm9vdCgpLCBuZWdhdGU8aW50PigpKSk7CisKKyAgQ1BQVU5JVF9BU1NFUlQob3V0cHV0WzBdPT0xKTsKKyAgQ1BQVU5JVF9BU1NFUlQob3V0cHV0WzFdPT0yKTsKKyAgQ1BQVU5JVF9BU1NFUlQob3V0cHV0WzJdPT00KTsKKyNlbmRpZgorfQordm9pZCBVbmFyeVRlc3Q6OnVjb21wb3MyKCkKK3sKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKKyAgaW50IGlucHV0IFszXSA9IHsgLTEsIC00LCAtMTYgfTsKKworICBkb3VibGUgb3V0cHV0IFszXTsKKyAgdHJhbnNmb3JtKChpbnQqKWlucHV0LCAoaW50KilpbnB1dCArIDMsIG91dHB1dCwgY29tcG9zZTEoc3F1YXJlX3Jvb3QoKSwgbmVnYXRlPGludD4oKSkpOworCisgIENQUFVOSVRfQVNTRVJUKG91dHB1dFswXT09MSk7CisgIENQUFVOSVRfQVNTRVJUKG91dHB1dFsxXT09Mik7CisgIENQUFVOSVRfQVNTRVJUKG91dHB1dFsyXT09NCk7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC91bmluaXRpYWxpemVkX3Rlc3QuY3BwIGIvdGVzdC91bml0L3VuaW5pdGlhbGl6ZWRfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc4ODRmNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC91bmluaXRpYWxpemVkX3Rlc3QuY3BwCkBAIC0wLDAgKzEsMjQ1IEBACisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxsaXN0PgorCisjaW5jbHVkZSAiY3BwdW5pdC9jcHB1bml0X3Byb3h5LmgiCisKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZChfU1RMUF9VU0VfTkFNRVNQQUNFUykKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisjZW5kaWYKKworLy8KKy8vIFRlc3RDYXNlIGNsYXNzCisvLworY2xhc3MgVW5pbml0aWFsaXplZFRlc3QgOiBwdWJsaWMgQ1BQVU5JVF9OUzo6VGVzdENhc2UKK3sKKyAgQ1BQVU5JVF9URVNUX1NVSVRFKFVuaW5pdGlhbGl6ZWRUZXN0KTsKKyAgQ1BQVU5JVF9URVNUKGNvcHlfdGVzdCk7CisgIC8vQ1BQVU5JVF9URVNUKGZpbGxfdGVzdCk7CisgIC8vQ1BQVU5JVF9URVNUKGZpbGxfbl90ZXN0KTsKKyAgQ1BQVU5JVF9URVNUX1NVSVRFX0VORCgpOworCitwcm90ZWN0ZWQ6CisgIHZvaWQgY29weV90ZXN0KCk7CisgIHZvaWQgZmlsbF90ZXN0KCk7CisgIHZvaWQgZmlsbF9uX3Rlc3QoKTsKK307CisKK0NQUFVOSVRfVEVTVF9TVUlURV9SRUdJU1RSQVRJT04oVW5pbml0aWFsaXplZFRlc3QpOworCitzdHJ1Y3QgTm90VHJpdmlhbENvcHlTdHJ1Y3QgeworICBOb3RUcml2aWFsQ29weVN0cnVjdCgpIDogbWVtYmVyKDApIHt9CisgIE5vdFRyaXZpYWxDb3B5U3RydWN0KE5vdFRyaXZpYWxDb3B5U3RydWN0IGNvbnN0JikgOiBtZW1iZXIoMSkge30KKworICBpbnQgbWVtYmVyOworfTsKKworc3RydWN0IFRyaXZpYWxDb3B5U3RydWN0IHsKKyAgVHJpdmlhbENvcHlTdHJ1Y3QoKSA6IG1lbWJlcigwKSB7fQorICBUcml2aWFsQ29weVN0cnVjdChUcml2aWFsQ29weVN0cnVjdCBjb25zdCYpIDogbWVtYmVyKDEpIHt9CisKKyAgaW50IG1lbWJlcjsKK307CisKK3N0cnVjdCBUcml2aWFsSW5pdFN0cnVjdCB7CisgIFRyaXZpYWxJbml0U3RydWN0KCkKKyAgeyArK25iQ29uc3RydWN0b3JDYWxsczsgfQorCisgIHN0YXRpYyBzaXplX3QgbmJDb25zdHJ1Y3RvckNhbGxzOworfTsKKworc2l6ZV90IFRyaXZpYWxJbml0U3RydWN0OjpuYkNvbnN0cnVjdG9yQ2FsbHMgPSAwOworCisjaWYgZGVmaW5lZCAoU1RMUE9SVCkKKyMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9OQU1FU1BBQ0VTKQorbmFtZXNwYWNlIHN0ZCB7CisjICBlbmRpZgorICBfU1RMUF9URU1QTEFURV9OVUxMCisgIHN0cnVjdCBfX3R5cGVfdHJhaXRzPFRyaXZpYWxDb3B5U3RydWN0PiB7CisgICAgIHR5cGVkZWYgX19mYWxzZV90eXBlIGhhc190cml2aWFsX2RlZmF1bHRfY29uc3RydWN0b3I7CisgICAgIC8vVGhpcyBpcyBhIHdyb25nIGRlY2xhcmF0aW9uIGp1c3QgdG8gY2hlY2sgdGhhdCBpbnRlcm5hbHkgYSBzaW1wbGUgbWVtY3B5IGlzIGNhbGxlZDoKKyAgICAgdHlwZWRlZiBfX3RydWVfdHlwZSBoYXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yOworICAgICB0eXBlZGVmIF9fdHJ1ZV90eXBlIGhhc190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3I7CisgICAgIHR5cGVkZWYgX190cnVlX3R5cGUgaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjsKKyAgICAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgaXNfUE9EX3R5cGU7CisgIH07CisKKyAgX1NUTFBfVEVNUExBVEVfTlVMTAorICBzdHJ1Y3QgX190eXBlX3RyYWl0czxUcml2aWFsSW5pdFN0cnVjdD4geworICAgICAvL1RoaXMgaXMgYSB3cm9uZyBkZWNsYXJhdGlvbiBqdXN0IHRvIGNoZWNrIHRoYXQgaW50ZXJuYWx5IG5vIGluaXRpYWxpemF0aW9uIGlzIGRvbmU6CisgICAgIHR5cGVkZWYgX190cnVlX3R5cGUgaGFzX3RyaXZpYWxfZGVmYXVsdF9jb25zdHJ1Y3RvcjsKKyAgICAgdHlwZWRlZiBfX3RydWVfdHlwZSBoYXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yOworICAgICB0eXBlZGVmIF9fdHJ1ZV90eXBlIGhhc190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3I7CisgICAgIHR5cGVkZWYgX190cnVlX3R5cGUgaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjsKKyAgICAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgaXNfUE9EX3R5cGU7CisgIH07CisjICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfTkFNRVNQQUNFUykKK30KKyMgIGVuZGlmCisjZW5kaWYKKworc3RydWN0IGJhc2Uge307CitzdHJ1Y3QgZGVyaXZlZCA6IHB1YmxpYyBiYXNlIHt9OworCisvLworLy8gdGVzdHMgaW1wbGVtZW50YXRpb24KKy8vCit2b2lkIFVuaW5pdGlhbGl6ZWRUZXN0Ojpjb3B5X3Rlc3QoKQoreworICB7CisgICAgLy9SYW5kb20gaXRlcmF0b3JzCisgICAgeworICAgICAgdmVjdG9yPE5vdFRyaXZpYWxDb3B5U3RydWN0PiBzcmMoMTApOworICAgICAgdmVjdG9yPE5vdFRyaXZpYWxDb3B5U3RydWN0PiBkc3QoMTApOworICAgICAgdW5pbml0aWFsaXplZF9jb3B5KHNyYy5iZWdpbigpLCBzcmMuZW5kKCksIGRzdC5iZWdpbigpKTsKKyAgICAgIHZlY3RvcjxOb3RUcml2aWFsQ29weVN0cnVjdD46OmNvbnN0X2l0ZXJhdG9yIGl0KGRzdC5iZWdpbigpKSwgZW5kKGRzdC5lbmQoKSk7CisgICAgICBmb3IgKDsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAgIENQUFVOSVRfQVNTRVJUKCAoKml0KS5tZW1iZXIgPT0gMSApOworICAgICAgfQorICAgIH0KKyAgICB7CisgICAgICAvKiogTm90ZTogd2UgdXNlIHN0YXRpYyBhcnJheXMgaGVyZSBzbyB0aGUgaXRlcmF0b3JzIGFyZSBhbHdheXMKKyAgICAgIHBvaW50ZXJzLCBldmVuIGluIGRlYnVnIG1vZGUuICovCisgICAgICBzaXplX3QgY29uc3QgY291bnQgPSAxMDsKKyAgICAgIFRyaXZpYWxDb3B5U3RydWN0IHNyY1tjb3VudF07CisgICAgICBUcml2aWFsQ29weVN0cnVjdCBkc3RbY291bnRdOworCisgICAgICBUcml2aWFsQ29weVN0cnVjdCogaXQgPSBzcmMgKyAwOworICAgICAgVHJpdmlhbENvcHlTdHJ1Y3QqIGVuZCA9IHNyYyArIGNvdW50OworICAgICAgZm9yICg7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICAoKml0KS5tZW1iZXIgPSAwOworICAgICAgfQorCisgICAgICB1bmluaXRpYWxpemVkX2NvcHkoc3JjKzAsIHNyYytjb3VudCwgZHN0KzApOworICAgICAgZm9yIChpdCA9IGRzdCswLCBlbmQgPSBkc3QrY291bnQ7IGl0ICE9IGVuZDsgKytpdCkgeworI2lmIGRlZmluZWQgKFNUTFBPUlQpCisgICAgICAgIC8qIElmIHRoZSBtZW1iZXIgaXMgMSwgaXQgbWVhbnMgdGhhdCBsaWJyYXJ5IGhhcyBub3QgZm91bmQgYW55CisgICAgICAgIG9wdGltaXphdGlvbiBvcG9ydHVuaXR5IGFuZCBjYWxsZWQgdGhlIHJlZ3VsYXIgY29weS1jdG9yIGluc3RlYWQuICovCisgICAgICAgIENQUFVOSVRfQVNTRVJUKCAoKml0KS5tZW1iZXIgPT0gMCApOworI2Vsc2UKKyAgICAgICAgQ1BQVU5JVF9BU1NFUlQoICgqaXQpLm1lbWJlciA9PSAxICk7CisjZW5kaWYKKyAgICAgIH0KKyAgICB9CisgIH0KKworICB7CisgICAgLy9CaWRpcmVjdGlvbmFsIGl0ZXJhdG9yCisgICAgeworICAgICAgdmVjdG9yPE5vdFRyaXZpYWxDb3B5U3RydWN0PiBzcmMoMTApOworICAgICAgbGlzdDxOb3RUcml2aWFsQ29weVN0cnVjdD4gZHN0KDEwKTsKKworICAgICAgbGlzdDxOb3RUcml2aWFsQ29weVN0cnVjdD46Oml0ZXJhdG9yIGl0KGRzdC5iZWdpbigpKSwgZW5kKGRzdC5lbmQoKSk7CisgICAgICBmb3IgKDsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAgICgqaXQpLm1lbWJlciA9IC0xOworICAgICAgfQorCisgICAgICB1bmluaXRpYWxpemVkX2NvcHkoc3JjLmJlZ2luKCksIHNyYy5lbmQoKSwgZHN0LmJlZ2luKCkpOworCisgICAgICBmb3IgKGl0ID0gZHN0LmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBDUFBVTklUX0FTU0VSVCggKCppdCkubWVtYmVyID09IDEgKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB7CisgICAgICBsaXN0PE5vdFRyaXZpYWxDb3B5U3RydWN0PiBzcmMoMTApOworICAgICAgdmVjdG9yPE5vdFRyaXZpYWxDb3B5U3RydWN0PiBkc3QoMTApOworCisgICAgICB2ZWN0b3I8Tm90VHJpdmlhbENvcHlTdHJ1Y3Q+OjppdGVyYXRvciBpdChkc3QuYmVnaW4oKSksIGVuZChkc3QuZW5kKCkpOworICAgICAgZm9yICg7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICAoKml0KS5tZW1iZXIgPSAtMTsKKyAgICAgIH0KKworICAgICAgdW5pbml0aWFsaXplZF9jb3B5KHNyYy5iZWdpbigpLCBzcmMuZW5kKCksIGRzdC5iZWdpbigpKTsKKworICAgICAgZm9yIChpdCA9IGRzdC5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgQ1BQVU5JVF9BU1NFUlQoICgqaXQpLm1lbWJlciA9PSAxICk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgeworICAgIC8vVXNpbmcgY29udGFpbmVycyBvZiBuYXRpdmUgdHlwZXM6CisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8ICFkZWZpbmVkIChfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVTKQorICAgIHsKKyAgICAgIHZlY3RvcjxpbnQ+IHNyYzsKKyAgICAgIGludCBpOworICAgICAgZm9yIChpID0gLTU7IGkgPCA2OyArK2kpIHsKKyAgICAgICAgc3JjLnB1c2hfYmFjayhpKTsKKyAgICAgIH0KKworICAgICAgLy9CdWlsZGluZyBhIHZlY3RvciByZXN1bHQgaW4gYSB1bmluaXRpYWxpemVkX2NvcHkgY2FsbCBpbnRlcm5hbGx5CisgICAgICB2ZWN0b3I8dW5zaWduZWQgaW50PiBkc3Qoc3JjLmJlZ2luKCksIHNyYy5lbmQoKSk7CisgICAgICB2ZWN0b3I8dW5zaWduZWQgaW50Pjo6Y29uc3RfaXRlcmF0b3IgaXQoZHN0LmJlZ2luKCkpOworICAgICAgZm9yIChpID0gLTU7IGkgPCA2OyArK2ksICsraXQpIHsKKyAgICAgICAgQ1BQVU5JVF9BU1NFUlQoICppdCA9PSAodW5zaWduZWQgaW50KWkgKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB7CisgICAgICB2ZWN0b3I8Y2hhcj4gc3JjOworICAgICAgY2hhciBpOworICAgICAgZm9yIChpID0gLTU7IGkgPCA2OyArK2kpIHsKKyAgICAgICAgc3JjLnB1c2hfYmFjayhpKTsKKyAgICAgIH0KKworICAgICAgLy9CdWlsZGluZyBhIHZlY3RvciByZXN1bHQgaW4gYSB1bmluaXRpYWxpemVkX2NvcHkgY2FsbCBpbnRlcm5hbGx5CisgICAgICB2ZWN0b3I8dW5zaWduZWQgaW50PiBkc3Qoc3JjLmJlZ2luKCksIHNyYy5lbmQoKSk7CisgICAgICB2ZWN0b3I8dW5zaWduZWQgaW50Pjo6Y29uc3RfaXRlcmF0b3IgaXQoZHN0LmJlZ2luKCkpOworICAgICAgZm9yIChpID0gLTU7IGkgPCA2OyArK2ksICsraXQpIHsKKyAgICAgICAgQ1BQVU5JVF9BU1NFUlQoICppdCA9PSAodW5zaWduZWQgaW50KWkgKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB7CisgICAgICB2ZWN0b3I8aW50PiBzcmM7CisgICAgICBpbnQgaTsKKyAgICAgIGZvciAoaSA9IC01OyBpIDwgNjsgKytpKSB7CisgICAgICAgIHNyYy5wdXNoX2JhY2soaSk7CisgICAgICB9CisKKyAgICAgIC8vQnVpbGRpbmcgYSB2ZWN0b3IgcmVzdWx0IGluIGEgdW5pbml0aWFsaXplZF9jb3B5IGNhbGwgaW50ZXJuYWxseQorICAgICAgdmVjdG9yPGZsb2F0PiBkc3Qoc3JjLmJlZ2luKCksIHNyYy5lbmQoKSk7CisgICAgICB2ZWN0b3I8ZmxvYXQ+Ojpjb25zdF9pdGVyYXRvciBpdChkc3QuYmVnaW4oKSk7CisgICAgICBmb3IgKGkgPSAtNTsgaSA8IDY7ICsraSwgKytpdCkgeworICAgICAgICBDUFBVTklUX0FTU0VSVCggKml0ID09IChmbG9hdClpICk7CisgICAgICB9CisgICAgfQorCisgICAgeworICAgICAgdmVjdG9yPHZlY3RvcjxmbG9hdD4qPiBzcmMoMTApOworICAgICAgdmVjdG9yPHZlY3RvcjxmbG9hdD4qPiBkc3Qoc3JjLmJlZ2luKCksIHNyYy5lbmQoKSk7CisgICAgfQorCisgICAgeworICAgICAgZGVyaXZlZCBkOworICAgICAgLy9iYXNlICpwYiA9ICZkOworICAgICAgZGVyaXZlZCAqcGQgPSAmZDsKKyAgICAgIC8vYmFzZSAqKnBwYiA9ICZwZDsKKyAgICAgIHZlY3RvcjxkZXJpdmVkKj4gc3JjKDEwLCBwZCk7CisgICAgICB2ZWN0b3I8YmFzZSo+IGRzdChzcmMuYmVnaW4oKSwgc3JjLmVuZCgpKTsKKyAgICAgIHZlY3RvcjxiYXNlKj46Oml0ZXJhdG9yIGl0KGRzdC5iZWdpbigpKSwgZW5kKGRzdC5lbmQoKSk7CisgICAgICBmb3IgKDsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAgIENQUFVOSVRfQVNTRVJUKCAoKml0KSA9PSBwZCApOworICAgICAgfQorICAgIH0KKyNlbmRpZgorICB9CisKKyAgeworICAgIC8vVmVjdG9yIGluaXRpYWxpemF0aW9uOgorICAgIHZlY3RvcjxUcml2aWFsSW5pdFN0cnVjdD4gdmVjdCgxMCk7CisgICAgLy9KdXN0IDEgY29uc3RydWN0b3IgY2FsbCBmb3IgdGhlIGRlZmF1bHQgdmFsdWU6CisgICAgQ1BQVU5JVF9BU1NFUlQoIFRyaXZpYWxJbml0U3RydWN0OjpuYkNvbnN0cnVjdG9yQ2FsbHMgPT0gMSAgKTsKKyAgfQorfQorCisvKgordm9pZCBVbmluaXRpYWxpemVkVGVzdDo6ZmlsbF90ZXN0KCkKK3sKK30KKwordm9pZCBVbmluaXRpYWxpemVkVGVzdDo6ZmlsbF9uX3Rlc3QoKQoreworfQorKi8KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC91bmlxdWVfdGVzdC5jcHAgYi90ZXN0L3VuaXQvdW5pcXVlX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwODBiN2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvdW5pcXVlX3Rlc3QuY3BwCkBAIC0wLDAgKzEsMTA1IEBACisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSAiY3BwdW5pdC9jcHB1bml0X3Byb3h5LmgiCisKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZChfU1RMUF9VU0VfTkFNRVNQQUNFUykKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisjZW5kaWYKKworLy8KKy8vIFRlc3RDYXNlIGNsYXNzCisvLworY2xhc3MgVW5pcXVlVGVzdCA6IHB1YmxpYyBDUFBVTklUX05TOjpUZXN0Q2FzZQoreworICBDUFBVTklUX1RFU1RfU1VJVEUoVW5pcXVlVGVzdCk7CisgIENQUFVOSVRfVEVTVCh1bmlxY3B5MSk7CisgIENQUFVOSVRfVEVTVCh1bmlxY3B5Mik7CisgIENQUFVOSVRfVEVTVCh1bmlxdWUxKTsKKyAgQ1BQVU5JVF9URVNUKHVuaXF1ZTIpOworICBDUFBVTklUX1RFU1RfU1VJVEVfRU5EKCk7CisKK3Byb3RlY3RlZDoKKyAgdm9pZCB1bmlxY3B5MSgpOworICB2b2lkIHVuaXFjcHkyKCk7CisgIHZvaWQgdW5pcXVlMSgpOworICB2b2lkIHVuaXF1ZTIoKTsKK307CisKK0NQUFVOSVRfVEVTVF9TVUlURV9SRUdJU1RSQVRJT04oVW5pcXVlVGVzdCk7CisKK3N0YXRpYyBib29sIHN0cl9lcXVhbChjb25zdCBjaGFyKiBhXywgY29uc3QgY2hhciogYl8pCit7IHJldHVybiAqYV8gPT0gKmJfOyB9CisvLworLy8gdGVzdHMgaW1wbGVtZW50YXRpb24KKy8vCit2b2lkIFVuaXF1ZVRlc3Q6OnVuaXF1ZTEoKQoreworICBpbnQgbnVtYmVyc1s4XSA9IHsgMCwgMSwgMSwgMiwgMiwgMiwgMywgNCB9OworICB1bmlxdWUoKGludCopbnVtYmVycywgKGludCopbnVtYmVycyArIDgpOworICAvLyAwIDEgMiAzIDQgMiAzIDQKKyAgQ1BQVU5JVF9BU1NFUlQobnVtYmVyc1swXT09MCk7CisgIENQUFVOSVRfQVNTRVJUKG51bWJlcnNbMV09PTEpOworICBDUFBVTklUX0FTU0VSVChudW1iZXJzWzJdPT0yKTsKKyAgQ1BQVU5JVF9BU1NFUlQobnVtYmVyc1szXT09Myk7CisgIENQUFVOSVRfQVNTRVJUKG51bWJlcnNbNF09PTQpOworICBDUFBVTklUX0FTU0VSVChudW1iZXJzWzVdPT0yKTsKKyAgQ1BQVU5JVF9BU1NFUlQobnVtYmVyc1s2XT09Myk7CisgIENQUFVOSVRfQVNTRVJUKG51bWJlcnNbN109PTQpOworfQorCit2b2lkIFVuaXF1ZVRlc3Q6OnVuaXF1ZTIoKQoreworICBjb25zdCBjaGFyKiBsYWJlbHNbXSA9IHsiUSIsICJRIiwgIlciLCAiVyIsICJFIiwgIkUiLCAiUiIsICJUIiwgIlQiLCAiWSIsICJZIn07CisKKyAgY29uc3QgdW5zaWduZWQgY291bnQgPSBzaXplb2YobGFiZWxzKSAvIHNpemVvZihsYWJlbHNbMF0pOworCisgIHVuaXF1ZSgoY29uc3QgY2hhcioqKWxhYmVscywgKGNvbnN0IGNoYXIqKilsYWJlbHMgKyBjb3VudCwgc3RyX2VxdWFsKTsKKworICAvLyBRV0VSVFkKKyAgQ1BQVU5JVF9BU1NFUlQoKmxhYmVsc1swXSA9PSAnUScpOworICBDUFBVTklUX0FTU0VSVCgqbGFiZWxzWzFdID09ICdXJyk7CisgIENQUFVOSVRfQVNTRVJUKCpsYWJlbHNbMl0gPT0gJ0UnKTsKKyAgQ1BQVU5JVF9BU1NFUlQoKmxhYmVsc1szXSA9PSAnUicpOworICBDUFBVTklUX0FTU0VSVCgqbGFiZWxzWzRdID09ICdUJyk7CisgIENQUFVOSVRfQVNTRVJUKCpsYWJlbHNbNV0gPT0gJ1knKTsKKworfQorCit2b2lkIFVuaXF1ZVRlc3Q6OnVuaXFjcHkxKCkKK3sKKyAgaW50IG51bWJlcnNbOF0gPSB7IDAsIDEsIDEsIDIsIDIsIDIsIDMsIDQgfTsKKyAgaW50IHJlc3VsdFs4XSA9IHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9OworCisgIHVuaXF1ZV9jb3B5KChpbnQqKW51bWJlcnMsIChpbnQqKW51bWJlcnMgKyA4LCAoaW50KilyZXN1bHQpOworCisgIC8vIDAgMSAyIDMgNCAwIDAgMAorICBDUFBVTklUX0FTU0VSVChyZXN1bHRbMF09PTApOworICBDUFBVTklUX0FTU0VSVChyZXN1bHRbMV09PTEpOworICBDUFBVTklUX0FTU0VSVChyZXN1bHRbMl09PTIpOworICBDUFBVTklUX0FTU0VSVChyZXN1bHRbM109PTMpOworICBDUFBVTklUX0FTU0VSVChyZXN1bHRbNF09PTQpOworICBDUFBVTklUX0FTU0VSVChyZXN1bHRbNV09PTApOworICBDUFBVTklUX0FTU0VSVChyZXN1bHRbNl09PTApOworICBDUFBVTklUX0FTU0VSVChyZXN1bHRbN109PTApOworfQorCit2b2lkIFVuaXF1ZVRlc3Q6OnVuaXFjcHkyKCkKK3sKKyAgY29uc3QgY2hhciogbGFiZWxzW10gPSB7IlEiLCAiUSIsICJXIiwgIlciLCAiRSIsICJFIiwgIlIiLCAiVCIsICJUIiwgIlkiLCAiWSJ9OworICBjb25zdCBjaGFyICoqcGxhYmVscyA9IChjb25zdCBjaGFyKiopbGFiZWxzOworCisgIGNvbnN0IHNpemVfdCBjb3VudCA9IHNpemVvZihsYWJlbHMpIC8gc2l6ZW9mKGxhYmVsc1swXSk7CisgIGNvbnN0IGNoYXIqIHVDb3B5W2NvdW50XTsKKyAgY29uc3QgY2hhciAqKnB1Q29weSA9ICZ1Q29weVswXTsKKyAgZmlsbChwdUNvcHksIHB1Q29weSArIGNvdW50LCAiIik7CisKKyAgdW5pcXVlX2NvcHkocGxhYmVscywgcGxhYmVscyArIGNvdW50LCBwdUNvcHksIHN0cl9lcXVhbCk7CisKKyAgLy9RV0VSVFkKKyAgQ1BQVU5JVF9BU1NFUlQoKnVDb3B5WzBdID09ICdRJyk7CisgIENQUFVOSVRfQVNTRVJUKCp1Q29weVsxXSA9PSAnVycpOworICBDUFBVTklUX0FTU0VSVCgqdUNvcHlbMl0gPT0gJ0UnKTsKKyAgQ1BQVU5JVF9BU1NFUlQoKnVDb3B5WzNdID09ICdSJyk7CisgIENQUFVOSVRfQVNTRVJUKCp1Q29weVs0XSA9PSAnVCcpOworICBDUFBVTklUX0FTU0VSVCgqdUNvcHlbNV0gPT0gJ1knKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC91bm9yZGVyZWRfdGVzdC5jcHAgYi90ZXN0L3VuaXQvdW5vcmRlcmVkX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkNDdjYTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvdW5vcmRlcmVkX3Rlc3QuY3BwCkBAIC0wLDAgKzEsNjc2IEBACisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaWYgZGVmaW5lZCAoU1RMUE9SVCkKKyMgIGluY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisjICBpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorI2VuZGlmCisKKy8vI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjaW5jbHVkZSAiY3BwdW5pdC9jcHB1bml0X3Byb3h5LmgiCisKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZChfU1RMUF9VU0VfTkFNRVNQQUNFUykKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisjICBpZiBkZWZpbmVkIChTVExQT1JUKQordXNpbmcgbmFtZXNwYWNlIHN0ZDo6dHIxOworIyAgZW5kaWYKKyNlbmRpZgorCisvLworLy8gVGVzdENhc2UgY2xhc3MKKy8vCitjbGFzcyBVbm9yZGVyZWRUZXN0IDogcHVibGljIENQUFVOSVRfTlM6OlRlc3RDYXNlCit7CisgIENQUFVOSVRfVEVTVF9TVUlURShVbm9yZGVyZWRUZXN0KTsKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgCisgIENQUFVOSVRfSUdOT1JFOworI2VuZGlmCisgIENQUFVOSVRfVEVTVCh1c2V0KTsKKyAgQ1BQVU5JVF9URVNUKHVtdWx0aXNldCk7CisgIENQUFVOSVRfVEVTVCh1bWFwKTsKKyAgQ1BQVU5JVF9URVNUKHVtdWx0aW1hcCk7CisgIENQUFVOSVRfVEVTVCh1c2VyX2Nhc2UpOworICBDUFBVTklUX1RFU1QoaGFzaF9wb2xpY3kpOworICBDUFBVTklUX1RFU1QoYnVja2V0cyk7CisgIENQUFVOSVRfVEVTVChlcXVhbF9yYW5nZSk7CisgIENQUFVOSVRfRVhQTElDSVRfVEVTVChiZW5jaG1hcmsxKTsKKyAgQ1BQVU5JVF9FWFBMSUNJVF9URVNUKGJlbmNobWFyazIpOworI2lmICFkZWZpbmVkIChfU1RMUF9VU0VfQ09OVEFJTkVSU19FWFRFTlNJT04pCisgIENQUFVOSVRfSUdOT1JFOworI2VuZGlmCisgIENQUFVOSVRfVEVTVCh0ZW1wbGF0ZV9tZXRob2RzKTsKKyAgQ1BQVU5JVF9URVNUX1NVSVRFX0VORCgpOworCitwcm90ZWN0ZWQ6CisgIHZvaWQgdXNldCgpOworICB2b2lkIHVtdWx0aXNldCgpOworICB2b2lkIHVtYXAoKTsKKyAgdm9pZCB1bXVsdGltYXAoKTsKKyAgdm9pZCB1c2VyX2Nhc2UoKTsKKyAgdm9pZCBoYXNoX3BvbGljeSgpOworICB2b2lkIGJ1Y2tldHMoKTsKKyAgdm9pZCBlcXVhbF9yYW5nZSgpOworICB2b2lkIGJlbmNobWFyazEoKTsKKyAgdm9pZCBiZW5jaG1hcmsyKCk7CisgIHZvaWQgdGVtcGxhdGVfbWV0aG9kcygpOworfTsKKworQ1BQVU5JVF9URVNUX1NVSVRFX1JFR0lTVFJBVElPTihVbm9yZGVyZWRUZXN0KTsKKworY29uc3QgaW50IE5CX0VMRU1TID0gMjAwMDsKKworLy8KKy8vIHRlc3RzIGltcGxlbWVudGF0aW9uCisvLwordm9pZCBVbm9yZGVyZWRUZXN0Ojp1c2V0KCkKK3sKKyNpZiBkZWZpbmVkIChTVExQT1JUKQorICB0eXBlZGVmIHVub3JkZXJlZF9zZXQ8aW50LCBoYXNoPGludD4sIGVxdWFsX3RvPGludD4gPiB1c2V0dHlwZTsKKyAgdXNldHR5cGUgdXM7CisKKyAgLy9TbWFsbCBjb21waWxhdGlvbiBjaGVjayBvZiB0aGUgY29weSBjb25zdHJ1Y3RvcjoKKyAgdXNldHR5cGUgdXMyKHVzKTsKKyAgLy9BbmQgYXNzaWdubWVudCBvcGVyYXRvcgorICB1cyA9IHVzMjsKKworICBpbnQgaTsKKyAgcGFpcjx1c2V0dHlwZTo6aXRlcmF0b3IsIGJvb2w+IHJldDsKKyAgZm9yIChpID0gMDsgaSA8IE5CX0VMRU1TOyArK2kpIHsKKyAgICByZXQgPSB1cy5pbnNlcnQoaSk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHJldC5zZWNvbmQgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggKnJldC5maXJzdCA9PSBpICk7CisKKyAgICByZXQgPSB1cy5pbnNlcnQoaSk7CisgICAgQ1BQVU5JVF9BU1NFUlQoICFyZXQuc2Vjb25kICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoICpyZXQuZmlyc3QgPT0gaSApOworICB9CisKKyAgdmVjdG9yPGludD4gdXNfdmFsOworCisgIHVzZXR0eXBlOjpsb2NhbF9pdGVyYXRvciBsaXQsIGxpdEVuZDsKKyAgZm9yIChpID0gMDsgaSA8IE5CX0VMRU1TOyArK2kpIHsKKyAgICBsaXQgPSB1cy5iZWdpbih1cy5idWNrZXQoaSkpOworICAgIGxpdEVuZCA9IHVzLmVuZCh1cy5idWNrZXQoaSkpOworCisgICAgdXNldHR5cGU6OnNpemVfdHlwZSBidWNrZXRfcG9zID0gdXMuYnVja2V0KCpsaXQpOworICAgIGZvciAoOyBsaXQgIT0gbGl0RW5kOyArK2xpdCkgeworICAgICAgQ1BQVU5JVF9BU1NFUlQoIHVzLmJ1Y2tldCgqbGl0KSA9PSBidWNrZXRfcG9zICk7CisgICAgICB1c192YWwucHVzaF9iYWNrKCpsaXQpOworICAgIH0KKyAgfQorCisgIC8vQSBjb21waWxhdGlvbiB0aW1lIGNoZWNrIHRvIHVuY29tbWVudCBmcm9tIHRpbWUgdG8gdGltZQorICB7CisgICAgLy91c2V0dHlwZTo6aXRlcmF0b3IgaXQ7CisgICAgLy9DUFBVTklUX0FTU0VSVCggaXQgIT0gbGl0ICk7CisgIH0KKworICBzb3J0KHVzX3ZhbC5iZWdpbigpLCB1c192YWwuZW5kKCkpOworICBmb3IgKGkgPSAwOyBpIDwgTkJfRUxFTVM7ICsraSkgeworICAgIENQUFVOSVRfQVNTRVJUKCB1c192YWxbaV0gPT0gaSApOworICB9CisjZW5kaWYKK30KKwordm9pZCBVbm9yZGVyZWRUZXN0Ojp1bXVsdGlzZXQoKQoreworI2lmIGRlZmluZWQgKFNUTFBPUlQpCisgIHR5cGVkZWYgdW5vcmRlcmVkX211bHRpc2V0PGludCwgaGFzaDxpbnQ+LCBlcXVhbF90bzxpbnQ+ID4gdXNldHR5cGU7CisgIHVzZXR0eXBlIHVzOworCisgIGludCBpOworICB1c2V0dHlwZTo6aXRlcmF0b3IgcmV0OworICBmb3IgKGkgPSAwOyBpIDwgTkJfRUxFTVM7ICsraSkgeworICAgIHJldCA9IHVzLmluc2VydChpKTsKKyAgICBDUFBVTklUX0FTU0VSVCggKnJldCA9PSBpICk7CisKKyAgICByZXQgPSB1cy5pbnNlcnQoaSk7CisgICAgQ1BQVU5JVF9BU1NFUlQoICpyZXQgPT0gaSApOworICB9CisKKyAgQ1BQVU5JVF9BU1NFUlQoIHVzLnNpemUoKSA9PSAyICogTkJfRUxFTVMgKTsKKyAgdmVjdG9yPGludD4gdXNfdmFsOworCisgIHVzZXR0eXBlOjpsb2NhbF9pdGVyYXRvciBsaXQsIGxpdEVuZDsKKyAgZm9yIChpID0gMDsgaSA8IE5CX0VMRU1TOyArK2kpIHsKKyAgICBsaXQgPSB1cy5iZWdpbih1cy5idWNrZXQoaSkpOworICAgIGxpdEVuZCA9IHVzLmVuZCh1cy5idWNrZXQoaSkpOworCisgICAgdXNldHR5cGU6OnNpemVfdHlwZSBidWNrZXRfcG9zID0gdXMuYnVja2V0KCpsaXQpOworICAgIGZvciAoOyBsaXQgIT0gbGl0RW5kOyArK2xpdCkgeworICAgICAgQ1BQVU5JVF9BU1NFUlQoIHVzLmJ1Y2tldCgqbGl0KSA9PSBidWNrZXRfcG9zICk7CisgICAgICB1c192YWwucHVzaF9iYWNrKCpsaXQpOworICAgIH0KKyAgfQorCisgIHNvcnQodXNfdmFsLmJlZ2luKCksIHVzX3ZhbC5lbmQoKSk7CisgIGZvciAoaSA9IDA7IGkgPCBOQl9FTEVNUzsgKytpKSB7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHVzX3ZhbFsyICogaV0gPT0gaSApOworICAgIENQUFVOSVRfQVNTRVJUKCB1c192YWxbMiAqIGkgKyAxXSA9PSBpICk7CisgIH0KKyNlbmRpZgorfQorCit2b2lkIFVub3JkZXJlZFRlc3Q6OnVtYXAoKQoreworI2lmIGRlZmluZWQgKFNUTFBPUlQpCisgIHR5cGVkZWYgdW5vcmRlcmVkX21hcDxpbnQsIGludCwgaGFzaDxpbnQ+LCBlcXVhbF90bzxpbnQ+ID4gdW1hcHR5cGU7CisgIHVtYXB0eXBlIHVzOworCisgIC8vQ29tcGlsYXRpb24gY2hlY2sgb2YgdGhlIFtdIG9wZXJhdG9yOgorICB1bWFwdHlwZSB1czI7CisgIHVzWzBdID0gdXMyWzBdOworICB1cy5jbGVhcigpOworCisgIHsKKyAgICAvL0FuIG90aGVyIGNvbXBpbGF0aW9uIGNoZWNrCisgICAgdHlwZWRlZiB1bm9yZGVyZWRfbWFwPGludCwgdW1hcHR5cGU+IHV1bWFwdHlwZTsKKyAgICB1dW1hcHR5cGUgdXVzOworICAgIHVtYXB0eXBlIGNvbnN0JiB1cmVmID0gdXVzWzBdOworICAgIHVtYXB0eXBlIHVjb3B5ID0gdXVzWzBdOworICAgIHVjb3B5ID0gdXJlZjsKKyAgICAvL0F2b2lkcyB3YXJuaW5nOgorICAgIC8vKHZvaWQqKSZ1cmVmOworICB9CisKKyAgaW50IGk7CisgIHBhaXI8dW1hcHR5cGU6Oml0ZXJhdG9yLCBib29sPiByZXQ7CisgIGZvciAoaSA9IDA7IGkgPCBOQl9FTEVNUzsgKytpKSB7CisgICAgdW1hcHR5cGU6OnZhbHVlX3R5cGUgcDEoaSwgaSk7CisgICAgcmV0ID0gdXMuaW5zZXJ0KHAxKTsKKyAgICBDUFBVTklUX0FTU0VSVCggcmV0LnNlY29uZCApOworICAgIENQUFVOSVRfQVNTRVJUKCAqcmV0LmZpcnN0ID09IHAxICk7CisKKyAgICB1bWFwdHlwZTo6dmFsdWVfdHlwZSBwMihpLCBpICsgMSk7CisgICAgcmV0ID0gdXMuaW5zZXJ0KHAyKTsKKyAgICBDUFBVTklUX0FTU0VSVCggIXJldC5zZWNvbmQgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggKnJldC5maXJzdCA9PSBwMSApOworICB9CisKKyAgeworICAgIC8vTGV0cyBsb29rIGZvciBzb21lIHZhbHVlcyB0byBzZWUgaWYgZXZlcnl0aGluZyBpcyBub3JtYWw6CisgICAgdW1hcHR5cGU6Oml0ZXJhdG9yIHVtaXQ7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBOQl9FTEVNUzsgaiArPSBOQl9FTEVNUyAvIDEwMCkgeworICAgICAgdW1pdCA9IHVzLmZpbmQoaik7CisKKyAgICAgIENQUFVOSVRfQVNTRVJUKCB1bWl0ICE9IHVzLmVuZCgpICk7CisgICAgICBDUFBVTklUX0FTU0VSVCggKCp1bWl0KS5zZWNvbmQgPT0gaiApOworICAgIH0KKyAgfQorCisgIENQUFVOSVRfQVNTRVJUKCB1cy5zaXplKCkgPT0gKHNpemVfdClOQl9FTEVNUyApOworICB2ZWN0b3I8cGFpcjxpbnQsIGludD4gPiB1c192YWw7CisKKyAgdW1hcHR5cGU6OmxvY2FsX2l0ZXJhdG9yIGxpdCwgbGl0RW5kOworICBmb3IgKGkgPSAwOyBpIDwgTkJfRUxFTVM7ICsraSkgeworICAgIGxpdCA9IHVzLmJlZ2luKHVzLmJ1Y2tldChpKSk7CisgICAgbGl0RW5kID0gdXMuZW5kKHVzLmJ1Y2tldChpKSk7CisKKyAgICB1bWFwdHlwZTo6c2l6ZV90eXBlIGJ1Y2tldF9wb3MgPSB1cy5idWNrZXQoKCpsaXQpLmZpcnN0KTsKKyAgICBmb3IgKDsgbGl0ICE9IGxpdEVuZDsgKytsaXQpIHsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCB1cy5idWNrZXQoKCpsaXQpLmZpcnN0KSA9PSBidWNrZXRfcG9zICk7CisgICAgICB1c192YWwucHVzaF9iYWNrKG1ha2VfcGFpcigoKmxpdCkuZmlyc3QsICgqbGl0KS5zZWNvbmQpKTsKKyAgICB9CisgIH0KKworICBzb3J0KHVzX3ZhbC5iZWdpbigpLCB1c192YWwuZW5kKCkpOworICBmb3IgKGkgPSAwOyBpIDwgTkJfRUxFTVM7ICsraSkgeworICAgIENQUFVOSVRfQVNTRVJUKCB1c192YWxbaV0gPT0gbWFrZV9wYWlyKGksIGkpICk7CisgIH0KKyNlbmRpZgorfQorCit2b2lkIFVub3JkZXJlZFRlc3Q6OnVtdWx0aW1hcCgpCit7CisjaWYgZGVmaW5lZCAoU1RMUE9SVCkKKyAgdHlwZWRlZiB1bm9yZGVyZWRfbXVsdGltYXA8aW50LCBpbnQsIGhhc2g8aW50PiwgZXF1YWxfdG88aW50PiA+IHVtYXB0eXBlOworICB1bWFwdHlwZSB1czsKKworICBpbnQgaTsKKyAgdW1hcHR5cGU6Oml0ZXJhdG9yIHJldDsKKyAgZm9yIChpID0gMDsgaSA8IE5CX0VMRU1TOyArK2kpIHsKKyAgICB1bWFwdHlwZTo6dmFsdWVfdHlwZSBwKGksIGkpOworICAgIHJldCA9IHVzLmluc2VydChwKTsKKyAgICBDUFBVTklUX0FTU0VSVCggKnJldCA9PSBwICk7CisKKyAgICByZXQgPSB1cy5pbnNlcnQocCk7CisgICAgQ1BQVU5JVF9BU1NFUlQoICpyZXQgPT0gcCApOworICB9CisKKyAgQ1BQVU5JVF9BU1NFUlQoIHVzLnNpemUoKSA9PSAyICogTkJfRUxFTVMgKTsKKyAgdHlwZWRlZiBwYWlyPGludCwgaW50PiBwdHlwZTsKKyAgdmVjdG9yPHB0eXBlPiB1c192YWw7CisKKyAgdW1hcHR5cGU6OmxvY2FsX2l0ZXJhdG9yIGxpdCwgbGl0RW5kOworICBmb3IgKGkgPSAwOyBpIDwgTkJfRUxFTVM7ICsraSkgeworICAgIGxpdCA9IHVzLmJlZ2luKHVzLmJ1Y2tldChpKSk7CisgICAgbGl0RW5kID0gdXMuZW5kKHVzLmJ1Y2tldChpKSk7CisKKyAgICB1bWFwdHlwZTo6c2l6ZV90eXBlIGJ1Y2tldF9wb3MgPSB1cy5idWNrZXQoKCpsaXQpLmZpcnN0KTsKKyAgICBmb3IgKDsgbGl0ICE9IGxpdEVuZDsgKytsaXQpIHsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCB1cy5idWNrZXQoKCpsaXQpLmZpcnN0KSA9PSBidWNrZXRfcG9zICk7CisgICAgICB1c192YWwucHVzaF9iYWNrKHB0eXBlKCgqbGl0KS5maXJzdCwgKCpsaXQpLnNlY29uZCkpOworICAgIH0KKyAgfQorCisgIHNvcnQodXNfdmFsLmJlZ2luKCksIHVzX3ZhbC5lbmQoKSk7CisgIGZvciAoaSA9IDA7IGkgPCBOQl9FTEVNUzsgKytpKSB7CisgICAgcHR5cGUgcChpLCBpKTsKKyAgICBDUFBVTklUX0FTU0VSVCggdXNfdmFsW2kgKiAyXSA9PSBwICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHVzX3ZhbFtpICogMiArIDFdID09IHAgKTsKKyAgfQorI2VuZGlmCit9CisKK3ZvaWQgVW5vcmRlcmVkVGVzdDo6dXNlcl9jYXNlKCkKK3sKKyNpZiBkZWZpbmVkIChTVExQT1JUKQorICB0eXBlZGVmIHVub3JkZXJlZF9tYXA8aW50LCBzdHJpbmc+IFVub3JkZXJlZE1hcDE7CisgIHR5cGVkZWYgdW5vcmRlcmVkX21hcDxpbnQsIFVub3JkZXJlZE1hcDE+IFVub3JkZXJlZE1hcDI7CisKKyAgVW5vcmRlcmVkTWFwMSBmb287CisgIFVub3JkZXJlZE1hcDIgYmFyOworCisgIGZvby5pbnNlcnQoVW5vcmRlcmVkTWFwMTo6dmFsdWVfdHlwZSgxLCBzdHJpbmcoInRlc3QxIikpKTsKKyAgZm9vLmluc2VydChVbm9yZGVyZWRNYXAxOjp2YWx1ZV90eXBlKDIsIHN0cmluZygidGVzdDIiKSkpOworICBmb28uaW5zZXJ0KFVub3JkZXJlZE1hcDE6OnZhbHVlX3R5cGUoMywgc3RyaW5nKCJ0ZXN0MyIpKSk7CisgIGZvby5pbnNlcnQoVW5vcmRlcmVkTWFwMTo6dmFsdWVfdHlwZSg0LCBzdHJpbmcoInRlc3Q0IikpKTsKKyAgZm9vLmluc2VydChVbm9yZGVyZWRNYXAxOjp2YWx1ZV90eXBlKDUsIHN0cmluZygidGVzdDUiKSkpOworCisgIGJhci5pbnNlcnQoVW5vcmRlcmVkTWFwMjo6dmFsdWVfdHlwZSgwLCBmb28pKTsKKyAgVW5vcmRlcmVkTWFwMjo6aXRlcmF0b3IgaXQgPSBiYXIuZmluZCgwKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIGl0ICE9IGJhci5lbmQoKSApOworCisgIFVub3JkZXJlZE1hcDEgJmJvZHkgPSBpdC0+c2Vjb25kOworICBVbm9yZGVyZWRNYXAxOjppdGVyYXRvciBjdXIgPSBib2R5LmZpbmQoMyk7CisgIENQUFVOSVRfQVNTRVJUKCBjdXIgIT0gYm9keS5lbmQoKSApOworCisgIGJvZHkuZXJhc2UoYm9keS5iZWdpbigpLCBib2R5LmVuZCgpKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIGJvZHkuZW1wdHkoKSApOworI2VuZGlmCit9CisKK3ZvaWQgVW5vcmRlcmVkVGVzdDo6aGFzaF9wb2xpY3koKQoreworI2lmIGRlZmluZWQgKFNUTFBPUlQpCisgIHVub3JkZXJlZF9zZXQ8aW50PiBpbnRfdXNldDsKKworICBDUFBVTklUX0FTU0VSVCggaW50X3VzZXQubWF4X2xvYWRfZmFjdG9yKCkgPT0gMS4wZiApOworICBDUFBVTklUX0FTU0VSVCggaW50X3VzZXQubG9hZF9mYWN0b3IoKSA9PSAwLjBmICk7CisKKyAgc2l6ZV90IG5iSW5zZXJ0cyA9IGludF91c2V0LmJ1Y2tldF9jb3VudCgpIC0gMTsKKyAgZm9yIChpbnQgaSA9IDA7IChzaXplX3QpaSA8IG5iSW5zZXJ0czsgKytpKSB7CisgICAgaW50X3VzZXQuaW5zZXJ0KGkpOworICB9CisgIENQUFVOSVRfQVNTRVJUKCBpbnRfdXNldC5zaXplKCkgPT0gbmJJbnNlcnRzICk7CisKKyAgaW50X3VzZXQubWF4X2xvYWRfZmFjdG9yKDAuNWYpOworICBpbnRfdXNldC5yZWhhc2goMCk7CisgIENQUFVOSVRfQVNTRVJUKCBpbnRfdXNldC5sb2FkX2ZhY3RvcigpIDwgaW50X3VzZXQubWF4X2xvYWRfZmFjdG9yKCkgKTsKKworICBzaXplX3QgYnVja2V0c0hpbnQgPSBpbnRfdXNldC5idWNrZXRfY291bnQoKSArIDE7CisgIGludF91c2V0LnJlaGFzaChidWNrZXRzSGludCk7CisgIENQUFVOSVRfQVNTRVJUKCBpbnRfdXNldC5idWNrZXRfY291bnQoKSA+PSBidWNrZXRzSGludCApOworCisgIENQUFVOSVRfQVNTRVJUKCBpbnRfdXNldC5rZXlfZXEoKSgxMCwgMTApICk7CisgIENQUFVOSVRfQVNTRVJUKCBpbnRfdXNldC5oYXNoX2Z1bmN0aW9uKCkoMTApID09IDEwICk7CisjZW5kaWYKK30KKwordm9pZCBVbm9yZGVyZWRUZXN0OjpidWNrZXRzKCkKK3sKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAKKyAgdW5vcmRlcmVkX3NldDxpbnQ+IGludF91c2V0OworCisgIENQUFVOSVRfQVNTRVJUKCBpbnRfdXNldC5idWNrZXRfY291bnQoKSA8IGludF91c2V0Lm1heF9idWNrZXRfY291bnQoKSApOworCisgIGludCBpOworICBzaXplX3QgbmJCdWNrZXRzID0gaW50X3VzZXQuYnVja2V0X2NvdW50KCk7CisgIHNpemVfdCBuYkluc2VydHMgPSBpbnRfdXNldC5idWNrZXRfY291bnQoKSAtIDE7CisgIGZvciAoaSA9IDA7IChzaXplX3QpaSA8IG5iSW5zZXJ0czsgKytpKSB7CisgICAgaW50X3VzZXQuaW5zZXJ0KGkpOworICB9CisgIENQUFVOSVRfQVNTRVJUKCBuYkJ1Y2tldHMgPT0gaW50X3VzZXQuYnVja2V0X2NvdW50KCkgKTsKKworICBzaXplX3QgYnVja2V0U2l6ZXMgPSAwOworICBmb3IgKGkgPSAwOyAoc2l6ZV90KWkgPCBuYkJ1Y2tldHM7ICsraSkgeworICAgIGJ1Y2tldFNpemVzICs9IGludF91c2V0LmJ1Y2tldF9zaXplKGkpOworICB9CisgIENQUFVOSVRfQVNTRVJUKCBidWNrZXRTaXplcyA9PSBpbnRfdXNldC5zaXplKCkgKTsKKyNlbmRpZgorfQorCit2b2lkIFVub3JkZXJlZFRlc3Q6OmVxdWFsX3JhbmdlKCkKK3sKKyNpZiBkZWZpbmVkIChTVExQT1JUKQorICB0eXBlZGVmIHVub3JkZXJlZF9tdWx0aXNldDxzaXplX3Q+IHVtc2V0OworICB7CisgICAgLy9HZW5lcmFsIHRlc3QKKyAgICB1bXNldCBpdW1zZXQ7CisgICAgaXVtc2V0Lm1heF9sb2FkX2ZhY3RvcigxMC4wZik7CisKKyAgICBzaXplX3QgbmJCdWNrZXRzID0gaXVtc2V0LmJ1Y2tldF9jb3VudCgpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuYkJ1Y2tldHM7ICsraSkgeworICAgICAgaXVtc2V0Lmluc2VydChpKTsKKyAgICAgIGl1bXNldC5pbnNlcnQoaSArIG5iQnVja2V0cyk7CisgICAgICBpdW1zZXQuaW5zZXJ0KGkgKyAyICogbmJCdWNrZXRzKTsKKyAgICAgIGl1bXNldC5pbnNlcnQoaSArIDMgKiBuYkJ1Y2tldHMpOworICAgICAgaXVtc2V0Lmluc2VydChpICsgNCAqIG5iQnVja2V0cyk7CisgICAgfQorCisgICAgQ1BQVU5JVF9BU1NFUlQoIG5iQnVja2V0cyA9PSBpdW1zZXQuYnVja2V0X2NvdW50KCkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggaXVtc2V0LnNpemUoKSA9PSA1ICogbmJCdWNrZXRzICk7CisKKyAgICBwYWlyPHVtc2V0OjppdGVyYXRvciwgdW1zZXQ6Oml0ZXJhdG9yPiBwID0gaXVtc2V0LmVxdWFsX3JhbmdlKDEpOworICAgIENQUFVOSVRfQVNTRVJUKCBwLmZpcnN0ICE9IHAuc2Vjb25kICk7CisKKyAgICBzaXplX3QgbmJFbGVtcyA9IGl1bXNldC5zaXplKCk7CisgICAgbmJFbGVtcyAtPSBkaXN0YW5jZShwLmZpcnN0LCBwLnNlY29uZCk7CisgICAgZm9yICh1bXNldDo6aXRlcmF0b3IgaiA9IHAuZmlyc3Q7IGogIT0gcC5zZWNvbmQ7KSB7CisgICAgICBpdW1zZXQuZXJhc2UoaisrKTsKKyAgICB9CisKKyAgICBDUFBVTklUX0FTU0VSVCggbmJFbGVtcyA9PSBpdW1zZXQuc2l6ZSgpICk7CisKKyAgICBwID0gaXVtc2V0LmVxdWFsX3JhbmdlKDIpOworICAgIENQUFVOSVRfQVNTRVJUKCBwLmZpcnN0ICE9IHAuc2Vjb25kICk7CisgICAgbmJFbGVtcyAtPSBkaXN0YW5jZShwLmZpcnN0LCBwLnNlY29uZCk7CisgICAgaXVtc2V0LmVyYXNlKHAuZmlyc3QsIHAuc2Vjb25kKTsKKyAgICBDUFBVTklUX0FTU0VSVCggbmJFbGVtcyA9PSBpdW1zZXQuc2l6ZSgpICk7CisgIH0KKworICB7CisgICAgLy9Nb3JlIHNwZWNpZmljIHRlc3QgdGhhdCB0cmllcyB0byBwdXQgbWFueSB2YWx1ZXMgaW4gdGhlIHNhbWUgYnVja2V0CisgICAgdW1zZXQgaXVtc2V0OworCisgICAgc2l6ZV90IGk7CisgICAgLy9XZSBhcmUgZ29pbmcgdG8gYWRkIGF0IGxlYXN0IDIwIHZhbHVlcywgdG8gZ2V0IGEgc3RhYmxlIGhhc2ggY29udGFpbmVyIHdoaWxlIGRvaW5nIHRoYXQKKyAgICAvL3dlIGZvcmNlIGEgbGFyZ2UgbnVtYmVyIG9mIGJ1Y2tldHM6CisgICAgaXVtc2V0LnJlaGFzaCgxOTMpOworCisgICAgc2l6ZV90IG5iQnVja2V0cyA9IGl1bXNldC5idWNrZXRfY291bnQoKTsKKyAgICBjb25zdCBzaXplX3QgdGFyZ2V0ZWRCdWNrZXQgPSBuYkJ1Y2tldHMgLyAyOworCisgICAgLy9MZXRzIHB1dCAxMCB2YWx1ZXMgaW4gdGhlIHRhcmdldGVkIGJ1Y2tldDoKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTA7ICsraSkgeworICAgICAgaXVtc2V0Lmluc2VydCh0YXJnZXRlZEJ1Y2tldCArIChpICogbmJCdWNrZXRzKSk7CisgICAgfQorCisgICAgLy9XZSBwdXQgYWdhaW4gMTAgdmFsdWVzIGluIHRoZSB0YXJnZXRlZCBidWNrZXQgYW5kIGluIHJldmVyc2Ugb3JkZXI6CisgICAgZm9yIChpID0gOTsgaSA8PSAxMDsgLS1pKSB7CisgICAgICBpdW1zZXQuaW5zZXJ0KHRhcmdldGVkQnVja2V0ICsgKGkgKiBuYkJ1Y2tldHMpKTsKKyAgICB9CisKKyAgICAvL05vdyB3ZSBwdXQgc29tZSBtb3JlIGVsZW1lbnRzIHVudGlsIGhhc2ggY29udGFpbmVyIGlzIHJlc2l6ZWQ6CisgICAgaSA9IDA7CisgICAgd2hpbGUgKGl1bXNldC5idWNrZXRfY291bnQoKSA9PSBuYkJ1Y2tldHMpIHsKKyAgICAgIGl1bXNldC5pbnNlcnQoaSsrKTsKKyAgICB9CisKKyAgICAvL0NQUFVOSVRfQVNTRVJUKCBpdW1zZXQuYnVja2V0X3NpemUodGFyZ2V0ZWRCdWNrZXQpID09IDIxICk7CisKKyAgICBwYWlyPHVtc2V0OjppdGVyYXRvciwgdW1zZXQ6Oml0ZXJhdG9yPiBwID0gaXVtc2V0LmVxdWFsX3JhbmdlKHRhcmdldGVkQnVja2V0KTsKKyAgICBDUFBVTklUX0FTU0VSVCggcC5maXJzdCAhPSBwLnNlY29uZCApOworICAgIENQUFVOSVRfQVNTRVJUKCBkaXN0YW5jZShwLmZpcnN0LCBwLnNlY29uZCkgPT0gMyApOworCisgICAgLy8gTm93IHdlIHJlbW92ZSBzb21lIGVsZW1lbnRzIHVudGlsIGhhc2ggY29udGFpbmVyIGlzIHJlc2l6ZWQ6CisgICAgbmJCdWNrZXRzID0gaXVtc2V0LmJ1Y2tldF9jb3VudCgpOworICAgIHdoaWxlIChpdW1zZXQuYnVja2V0X2NvdW50KCkgPT0gbmJCdWNrZXRzICYmCisgICAgICAgICAgICFpdW1zZXQuZW1wdHkoKSkgeworICAgICAgaXVtc2V0LmVyYXNlKGl1bXNldC5iZWdpbigpKTsKKyAgICB9CisgICAgQ1BQVU5JVF9BU1NFUlQoIGl1bXNldC5sb2FkX2ZhY3RvcigpIDw9IGl1bXNldC5tYXhfbG9hZF9mYWN0b3IoKSApOworCisgICAgLy8gQWRkaW5nIGFuIGVsZW1lbnQgYmFjayBzaG91bGRuJ3QgY2hhbmdlIG51bWJlciBvZiBidWNrZXRzOgorICAgIG5iQnVja2V0cyA9IGl1bXNldC5idWNrZXRfY291bnQoKTsKKyAgICBpdW1zZXQuaW5zZXJ0KDApOworICAgIENQUFVOSVRfQVNTRVJUKCBpdW1zZXQuYnVja2V0X2NvdW50KCkgPT0gbmJCdWNrZXRzICk7CisgIH0KKworICB7CisgICAgc3JhbmQoMCk7CisgICAgZm9yIChpbnQgcnVucyA9IDA7IHJ1bnMgPCAyOyArK3J1bnMpIHsKKyAgICAgIHNpemVfdCBtYWdpYyA9IHJhbmQoKTsKKyAgICAgIHVtc2V0IGh1bTsKKyAgICAgIHNpemVfdCBjID0gMDsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDA7ICsraSkgeworICAgICAgICBpZiAoKHJhbmQoKSAlIDUwMCkgPT0gMCkgeworICAgICAgICAgIGh1bS5pbnNlcnQobWFnaWMpOworICAgICAgICAgICsrYzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICBzaXplX3QgcjsKKyAgICAgICAgICB3aGlsZSAoKHIgPSByYW5kKCkpID09IG1hZ2ljKQorICAgICAgICAgICAgOworICAgICAgICAgIGh1bS5pbnNlcnQocik7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICBpZiAoKGZsb2F0KShodW0uc2l6ZSgpICsgMSkgLyAoZmxvYXQpaHVtLmJ1Y2tldF9jb3VudCgpID4gaHVtLm1heF9sb2FkX2ZhY3RvcigpKSB7CisgICAgICAgICAgY291dCA8PCAiSGFzaCBjb250YWluZXIgZHVtcDogTmIgZWxlbXM6ICIgPDwgaHVtLnNpemUoKSA8PCAiLCBOYiBidWNrZXRzOiAiIDw8IGh1bS5idWNrZXRfY291bnQoKSA8PCAiXG4iOworICAgICAgICAgIGZvciAoc2l6ZV90IGIgPSAwOyBiIDwgaHVtLmJ1Y2tldF9jb3VudCgpOyArK2IpIHsKKyAgICAgICAgICAgIGlmIChodW0uYnVja2V0X3NpemUoYikgIT0gMCkgeworICAgICAgICAgICAgICB1bXNldDo6bG9jYWxfaXRlcmF0b3IgbGl0QmVnaW4oaHVtLmJlZ2luKGIpKSwgbGl0RW5kKGh1bS5lbmQoYikpOworICAgICAgICAgICAgICBjb3V0IDw8ICJCIiA8PCBiIDw8ICI6ICI7CisgICAgICAgICAgICAgIGZvciAodW1zZXQ6OmxvY2FsX2l0ZXJhdG9yIGxpdCA9IGxpdEJlZ2luOyBsaXQgIT0gbGl0RW5kOyArK2xpdCkgeworICAgICAgICAgICAgICAgIGlmIChsaXQgIT0gbGl0QmVnaW4pIHsKKyAgICAgICAgICAgICAgICAgIGNvdXQgPDwgIiAtICI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvdXQgPDwgKmxpdDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBjb3V0IDw8ICJcbiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGNvdXQgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICAqLworICAgICAgfQorICAgICAgQ1BQVU5JVF9BU1NFUlQoIGh1bS5jb3VudChtYWdpYykgPT0gYyApOworICAgIH0KKyAgfQorI2VuZGlmCit9CisKK3ZvaWQgVW5vcmRlcmVkVGVzdDo6YmVuY2htYXJrMSgpCit7CisjaWYgZGVmaW5lZCAoU1RMUE9SVCkKKyAgdHlwZWRlZiB1bm9yZGVyZWRfbXVsdGlzZXQ8c2l6ZV90PiB1bXNldDsKKworICBjb25zdCBzaXplX3QgdGFyZ2V0ID0gNTAwMDAwOworICB1bXNldCBpdW1zZXQ7CisgIGl1bXNldC5tYXhfbG9hZF9mYWN0b3IoMTApOworICBzaXplX3QgaTsKKyAgZm9yIChpID0gMDsgaSA8IHRhcmdldDsgKytpKSB7CisgICAgaXVtc2V0Lmluc2VydChpKTsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCB0YXJnZXQ7ICsraSkgeworICAgIGl1bXNldC5lcmFzZShpKTsKKyAgfQorI2VuZGlmCit9CisKK3ZvaWQgVW5vcmRlcmVkVGVzdDo6YmVuY2htYXJrMigpCit7CisjaWYgZGVmaW5lZCAoU1RMUE9SVCkKKyAgdHlwZWRlZiB1bm9yZGVyZWRfbXVsdGlzZXQ8c2l6ZV90PiB1bXNldDsKKworICBjb25zdCBzaXplX3QgdGFyZ2V0ID0gNTAwMDAwOworICB1bXNldCBpdW1zZXQ7CisgIGl1bXNldC5tYXhfbG9hZF9mYWN0b3IoMTApOworICBzaXplX3QgaTsKKyAgZm9yIChpID0gMDsgaSA8IHRhcmdldDsgKytpKSB7CisgICAgaXVtc2V0Lmluc2VydCh0YXJnZXQgLSBpKTsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCB0YXJnZXQ7ICsraSkgeworICAgIGl1bXNldC5lcmFzZSh0YXJnZXQgLSBpKTsKKyAgfQorI2VuZGlmCit9CisKK3N0cnVjdCBLZXkKK3sKKyAgS2V5KCkgOiBtX2RhdGEoMCkge30KKyAgZXhwbGljaXQgS2V5KGludCBkYXRhKSA6IG1fZGF0YShkYXRhKSB7fQorCisgIGludCBtX2RhdGE7CisKKyNpZiBkZWZpbmVkIChfX0RNQ19fKSAvLyBzbGlzdDxfVHAsX0FsbG9jPjo6cmVtb3ZlIGVycm9yCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBLZXkmKSBjb25zdDsKKyNlbmRpZgorfTsKKworc3RydWN0IEtleUhhc2gKK3sKKyAgc2l6ZV90IG9wZXJhdG9yICgpIChLZXkga2V5KSBjb25zdAorICB7IHJldHVybiAoc2l6ZV90KWtleS5tX2RhdGE7IH0KKworICBzaXplX3Qgb3BlcmF0b3IgKCkgKGludCBkYXRhKSBjb25zdAorICB7IHJldHVybiAoc2l6ZV90KWRhdGE7IH0KK307CisKK3N0cnVjdCBLZXlFcXVhbAoreworICBib29sIG9wZXJhdG9yICgpIChLZXkgbGhzLCBLZXkgcmhzKSBjb25zdAorICB7IHJldHVybiBsaHMubV9kYXRhID09IHJocy5tX2RhdGE7IH0KKworICBib29sIG9wZXJhdG9yICgpIChLZXkgbGhzLCBpbnQgcmhzKSBjb25zdAorICB7IHJldHVybiBsaHMubV9kYXRhID09IHJoczsgfQorCisgIGJvb2wgb3BlcmF0b3IgKCkgKGludCBsaHMsIEtleSByaHMpIGNvbnN0CisgIHsgcmV0dXJuIGxocyA9PSByaHMubV9kYXRhOyB9Cit9OworCitzdHJ1Y3QgS2V5SGFzaFB0cgoreworICBzaXplX3Qgb3BlcmF0b3IgKCkgKEtleSBjb25zdCB2b2xhdGlsZSAqa2V5KSBjb25zdAorICB7IHJldHVybiAoc2l6ZV90KWtleS0+bV9kYXRhOyB9CisKKyAgc2l6ZV90IG9wZXJhdG9yICgpIChpbnQgZGF0YSkgY29uc3QKKyAgeyByZXR1cm4gKHNpemVfdClkYXRhOyB9Cit9OworCitzdHJ1Y3QgS2V5RXF1YWxQdHIKK3sKKyAgYm9vbCBvcGVyYXRvciAoKSAoS2V5IGNvbnN0IHZvbGF0aWxlICpsaHMsIEtleSBjb25zdCB2b2xhdGlsZSAqcmhzKSBjb25zdAorICB7IHJldHVybiBsaHMtPm1fZGF0YSA9PSByaHMtPm1fZGF0YTsgfQorCisgIGJvb2wgb3BlcmF0b3IgKCkgKEtleSBjb25zdCB2b2xhdGlsZSAqbGhzLCBpbnQgcmhzKSBjb25zdAorICB7IHJldHVybiBsaHMtPm1fZGF0YSA9PSByaHM7IH0KKworICBib29sIG9wZXJhdG9yICgpIChpbnQgbGhzLCBLZXkgY29uc3Qgdm9sYXRpbGUgKnJocykgY29uc3QKKyAgeyByZXR1cm4gbGhzID09IHJocy0+bV9kYXRhOyB9Cit9OworCit2b2lkIFVub3JkZXJlZFRlc3Q6OnRlbXBsYXRlX21ldGhvZHMoKQoreworI2lmIGRlZmluZWQgKFNUTFBPUlQpICYmIGRlZmluZWQgKF9TVExQX1VTRV9DT05UQUlORVJTX0VYVEVOU0lPTikKKyAgeworICAgIHR5cGVkZWYgdW5vcmRlcmVkX3NldDxLZXksIEtleUhhc2gsIEtleUVxdWFsPiBDb250YWluZXI7CisgICAgQ29udGFpbmVyIGNvbnQ7CisgICAgY29udC5pbnNlcnQoS2V5KDEpKTsKKyAgICBjb250Lmluc2VydChLZXkoMikpOworICAgIGNvbnQuaW5zZXJ0KEtleSgzKSk7CisgICAgY29udC5pbnNlcnQoS2V5KDQpKTsKKworICAgIENQUFVOSVRfQVNTRVJUKCBjb250LmNvdW50KEtleSgxKSkgPT0gMSApOworICAgIENQUFVOSVRfQVNTRVJUKCBjb250LmNvdW50KDEpID09IDEgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggY29udC5jb3VudCg1KSA9PSAwICk7CisKKyAgICBDUFBVTklUX0FTU0VSVCggY29udC5maW5kKDIpICE9IGNvbnQuZW5kKCkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggY29udC5lcXVhbF9yYW5nZSgyKSAhPSBtYWtlX3BhaXIoY29udC5iZWdpbigpLCBjb250LmVuZCgpKSApOworCisgICAgQ29udGFpbmVyIGNvbnN0JiBjY29udCA9IGNvbnQ7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGNjb250LmZpbmQoMikgIT0gY2NvbnQuZW5kKCkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggY2NvbnQuYnVja2V0KDIpID09IGNjb250LmJ1Y2tldCgyKSApOworICAgIENQUFVOSVRfQVNTRVJUKCBjY29udC5lcXVhbF9yYW5nZSgyKSAhPSBtYWtlX3BhaXIoY2NvbnQuYmVnaW4oKSwgY2NvbnQuZW5kKCkpICk7CisgIH0KKworICB7CisgICAgdHlwZWRlZiB1bm9yZGVyZWRfc2V0PEtleSosIEtleUhhc2hQdHIsIEtleUVxdWFsUHRyPiBDb250YWluZXI7CisgICAgQ29udGFpbmVyIGNvbnQ7CisgICAgS2V5IGtleTEoMSksIGtleTIoMiksIGtleTMoMyksIGtleTQoNCk7CisgICAgY29udC5pbnNlcnQoJmtleTEpOworICAgIGNvbnQuaW5zZXJ0KCZrZXkyKTsKKyAgICBjb250Lmluc2VydCgma2V5Myk7CisgICAgY29udC5pbnNlcnQoJmtleTQpOworCisgICAgQ1BQVU5JVF9BU1NFUlQoIGNvbnQuY291bnQoMSkgPT0gMSApOworICAgIENQUFVOSVRfQVNTRVJUKCBjb250LmNvdW50KDUpID09IDAgKTsKKworICAgIENQUFVOSVRfQVNTRVJUKCBjb250LmZpbmQoMikgIT0gY29udC5lbmQoKSApOworICAgIENQUFVOSVRfQVNTRVJUKCBjb250LmVxdWFsX3JhbmdlKDIpICE9IG1ha2VfcGFpcihjb250LmJlZ2luKCksIGNvbnQuZW5kKCkpICk7CisKKyAgICBDb250YWluZXIgY29uc3QmIGNjb250ID0gY29udDsKKyAgICBDUFBVTklUX0FTU0VSVCggY2NvbnQuZmluZCgyKSAhPSBjY29udC5lbmQoKSApOworICAgIENQUFVOSVRfQVNTRVJUKCBjY29udC5idWNrZXQoMikgPT0gY2NvbnQuYnVja2V0KDIpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGNjb250LmVxdWFsX3JhbmdlKDIpICE9IG1ha2VfcGFpcihjY29udC5iZWdpbigpLCBjY29udC5lbmQoKSkgKTsKKyAgfQorICB7CisgICAgdHlwZWRlZiB1bm9yZGVyZWRfbXVsdGlzZXQ8S2V5LCBLZXlIYXNoLCBLZXlFcXVhbD4gQ29udGFpbmVyOworICAgIENvbnRhaW5lciBjb250OworICAgIGNvbnQuaW5zZXJ0KEtleSgxKSk7CisgICAgY29udC5pbnNlcnQoS2V5KDIpKTsKKyAgICBjb250Lmluc2VydChLZXkoMSkpOworICAgIGNvbnQuaW5zZXJ0KEtleSgyKSk7CisKKyAgICBDUFBVTklUX0FTU0VSVCggY29udC5jb3VudChLZXkoMSkpID09IDIgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggY29udC5jb3VudCgxKSA9PSAyICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGNvbnQuY291bnQoNSkgPT0gMCApOworCisgICAgQ1BQVU5JVF9BU1NFUlQoIGNvbnQuZmluZCgyKSAhPSBjb250LmVuZCgpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGNvbnQuZXF1YWxfcmFuZ2UoMSkgIT0gbWFrZV9wYWlyKGNvbnQuZW5kKCksIGNvbnQuZW5kKCkpICk7CisKKyAgICBDb250YWluZXIgY29uc3QmIGNjb250ID0gY29udDsKKyAgICBDUFBVTklUX0FTU0VSVCggY2NvbnQuZmluZCgyKSAhPSBjY29udC5lbmQoKSApOworICAgIENQUFVOSVRfQVNTRVJUKCBjY29udC5idWNrZXQoMikgPT0gY2NvbnQuYnVja2V0KDIpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGNjb250LmVxdWFsX3JhbmdlKDIpICE9IG1ha2VfcGFpcihjY29udC5lbmQoKSwgY2NvbnQuZW5kKCkpICk7CisgIH0KKworICB7CisgICAgdHlwZWRlZiB1bm9yZGVyZWRfbXVsdGlzZXQ8S2V5IGNvbnN0IHZvbGF0aWxlKiwgS2V5SGFzaFB0ciwgS2V5RXF1YWxQdHI+IENvbnRhaW5lcjsKKyAgICBDb250YWluZXIgY29udDsKKyAgICBLZXkga2V5MSgxKSwga2V5MigyKSwga2V5MygzKSwga2V5NCg0KTsKKyAgICBjb250Lmluc2VydCgma2V5MSk7CisgICAgY29udC5pbnNlcnQoJmtleTIpOworICAgIGNvbnQuaW5zZXJ0KCZrZXkzKTsKKyAgICBjb250Lmluc2VydCgma2V5NCk7CisKKyAgICBDUFBVTklUX0FTU0VSVCggY29udC5jb3VudCgxKSA9PSAxICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGNvbnQuY291bnQoNSkgPT0gMCApOworCisgICAgQ1BQVU5JVF9BU1NFUlQoIGNvbnQuZmluZCgyKSAhPSBjb250LmVuZCgpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGNvbnQuZXF1YWxfcmFuZ2UoMikgIT0gbWFrZV9wYWlyKGNvbnQuYmVnaW4oKSwgY29udC5lbmQoKSkgKTsKKworICAgIENvbnRhaW5lciBjb25zdCYgY2NvbnQgPSBjb250OworICAgIENQUFVOSVRfQVNTRVJUKCBjY29udC5maW5kKDIpICE9IGNjb250LmVuZCgpICk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIGNjb250LmJ1Y2tldCgyKSA9PSBjY29udC5idWNrZXQoMikgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggY2NvbnQuZXF1YWxfcmFuZ2UoMikgIT0gbWFrZV9wYWlyKGNjb250LmJlZ2luKCksIGNjb250LmVuZCgpKSApOworICB9CisjZW5kaWYKK30KKworI2lmIGRlZmluZWQgKFNUTFBPUlQpICYmIFwKKyAgICAoIWRlZmluZWQgKF9TVExQX1VTRV9QVFJfU1BFQ0lBTElaQVRJT05TKSB8fCBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKSkKKyMgIGlmICFkZWZpbmVkIChfX0RNQ19fKQorLyogU2ltcGxlIGNvbXBpbGF0aW9uIHRlc3Q6IENoZWNrIHRoYXQgbmVzdGVkIHR5cGVzIGxpa2UgaXRlcmF0b3IKKyAqIGNhbiBiZSBhY2Nlc3MgZXZlbiBpZiB0eXBlIHVzZWQgdG8gaW5zdGFuY2lhdGUgY29udGFpbmVyIGlzIG5vdAorICogeWV0IGNvbXBsZXRlbHkgZGVmaW5lZC4KKyAqLworY2xhc3MgSW5jb21wbGV0ZUNsYXNzCit7CisgIHVub3JkZXJlZF9zZXQ8SW5jb21wbGV0ZUNsYXNzPiB1c2luc3RhbmNlczsKKyAgdHlwZWRlZiB1bm9yZGVyZWRfc2V0PEluY29tcGxldGVDbGFzcz46Oml0ZXJhdG9yIHVzaXQ7CisgIHVub3JkZXJlZF9tdWx0aXNldDxJbmNvbXBsZXRlQ2xhc3M+IHVzbWluc3RhbmNlczsKKyAgdHlwZWRlZiB1bm9yZGVyZWRfbXVsdGlzZXQ8SW5jb21wbGV0ZUNsYXNzPjo6aXRlcmF0b3IgdXNtaXQ7CisKKyAgdW5vcmRlcmVkX21hcDxJbmNvbXBsZXRlQ2xhc3MsIEluY29tcGxldGVDbGFzcz4gdW1pbnN0YW5jZXM7CisgIHR5cGVkZWYgdW5vcmRlcmVkX21hcDxJbmNvbXBsZXRlQ2xhc3MsIEluY29tcGxldGVDbGFzcz46Oml0ZXJhdG9yIHVtaXQ7CisgIHVub3JkZXJlZF9tdWx0aW1hcDxJbmNvbXBsZXRlQ2xhc3MsIEluY29tcGxldGVDbGFzcz4gdW1taW5zdGFuY2VzOworICB0eXBlZGVmIHVub3JkZXJlZF9tdWx0aW1hcDxJbmNvbXBsZXRlQ2xhc3MsIEluY29tcGxldGVDbGFzcz46Oml0ZXJhdG9yIHVtbWl0OworfTsKKyMgIGVuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC91dGlsaXR5X2hlYWRlcl90ZXN0LmNwcCBiL3Rlc3QvdW5pdC91dGlsaXR5X2hlYWRlcl90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGQ2N2ZiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L3V0aWxpdHlfaGVhZGVyX3Rlc3QuY3BwCkBAIC0wLDAgKzEsOCBAQAorLyogVGhpcyB0ZXN0IHB1cnBvc2UgaXMgc2ltcGx5IHRvIGNoZWNrIFN0YW5kYXJkIGhlYWRlciBpbmRlcGVuZGFuY3kgdGhhdAorICogaXMgdG8gc2F5IHRoYXQgdGhlIGhlYWRlciBjYW4gYmUgaW5jbHVkZWQgYWxvbmUgd2l0aG91dCBhbnkgcHJldmlvdXMKKyAqIGluY2x1ZGUuCisgKiBBZGRpdGlvbm5hbHksIGZvciBDIFN0YW5kYXJkIGhlYWRlcnMgdGhhdCBTVExwb3J0IGV4cG9zZSwgaXQgY2FuIGFsc28gYmUKKyAqIHVzZWQgdG8gY2hlY2sgdGhhdCBmaWxlcyBpbmNsdWRlZCBieSB0aG9zZSBoZWFkZXJzIGFyZSBjb21wYXRpYmxlIHdpdGgKKyAqIHB1cmUgQyBjb21waWxlcnMuCisgKi8KKyNpbmNsdWRlIDx1dGlsaXR5PgpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L3ZhbGFycmF5X2hlYWRlcl90ZXN0LmNwcCBiL3Rlc3QvdW5pdC92YWxhcnJheV9oZWFkZXJfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjczNjI2NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC92YWxhcnJheV9oZWFkZXJfdGVzdC5jcHAKQEAgLTAsMCArMSw4IEBACisvKiBUaGlzIHRlc3QgcHVycG9zZSBpcyBzaW1wbHkgdG8gY2hlY2sgU3RhbmRhcmQgaGVhZGVyIGluZGVwZW5kYW5jeSB0aGF0CisgKiBpcyB0byBzYXkgdGhhdCB0aGUgaGVhZGVyIGNhbiBiZSBpbmNsdWRlZCBhbG9uZSB3aXRob3V0IGFueSBwcmV2aW91cworICogaW5jbHVkZS4KKyAqIEFkZGl0aW9ubmFseSwgZm9yIEMgU3RhbmRhcmQgaGVhZGVycyB0aGF0IFNUTHBvcnQgZXhwb3NlLCBpdCBjYW4gYWxzbyBiZQorICogdXNlZCB0byBjaGVjayB0aGF0IGZpbGVzIGluY2x1ZGVkIGJ5IHRob3NlIGhlYWRlcnMgYXJlIGNvbXBhdGlibGUgd2l0aAorICogcHVyZSBDIGNvbXBpbGVycy4KKyAqLworI2luY2x1ZGUgPHZhbGFycmF5PgpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L3ZhbGFycmF5X3Rlc3QuY3BwIGIvdGVzdC91bml0L3ZhbGFycmF5X3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZWUzZGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvdmFsYXJyYXlfdGVzdC5jcHAKQEAgLTAsMCArMSwxMjEgQEAKKyNpbmNsdWRlIDx2YWxhcnJheT4KKworI2luY2x1ZGUgImNwcHVuaXQvY3BwdW5pdF9wcm94eS5oIgorCisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IGRlZmluZWQoX1NUTFBfVVNFX05BTUVTUEFDRVMpCit1c2luZyBuYW1lc3BhY2Ugc3RkOworI2VuZGlmCisKKy8vCisvLyBUZXN0Q2FzZSBjbGFzcworLy8KK2NsYXNzIFZhbGFycmF5VGVzdCA6IHB1YmxpYyBDUFBVTklUX05TOjpUZXN0Q2FzZQoreworICBDUFBVTklUX1RFU1RfU1VJVEUoVmFsYXJyYXlUZXN0KTsKKyAgQ1BQVU5JVF9URVNUKHRyYW5zY2VuZGVudGFscyk7CisgIENQUFVOSVRfVEVTVF9TVUlURV9FTkQoKTsKKworcHJvdGVjdGVkOgorICB2b2lkIHRyYW5zY2VuZGVudGFscygpOworfTsKKworQ1BQVU5JVF9URVNUX1NVSVRFX1JFR0lTVFJBVElPTihWYWxhcnJheVRlc3QpOworCisvLworLy8gdGVzdHMgaW1wbGVtZW50YXRpb24KKy8vCisvLyBGb3IgdGhlIG1vbWVudCB0aGlzIHRlc3QgaXMganVzdCBhIGNvbXBsaXRhdGlvbiB0ZXN0CisvLyBldmVyeW9uZSBpcyB3ZWxjb21lIHRvIGRvIGEgcmVhbCBnb29kIHVuaXQgdGVzdCBmb3IKKy8vIHZhbGFycmF5IGZ1bmN0aW9uYWxpdHkuCit2b2lkIFZhbGFycmF5VGVzdDo6dHJhbnNjZW5kZW50YWxzKCkKK3sKKyNpZmRlZiBfX1NVTlBST19DQworICB1c2luZyBzdGQ6OmFiczsKKyNlbmRpZgorICB7CisgICAgdmFsYXJyYXk8ZG91YmxlPiBkYXJyYXk7CisgICAgdmFsYXJyYXk8ZG91YmxlPiB0bXA7CisgICAgdG1wID0gYWJzKGRhcnJheSk7CisgICAgdG1wID0gYWNvcyhkYXJyYXkpOworICAgIHRtcCA9IGFzaW4oZGFycmF5KTsKKyAgICB0bXAgPSBhdGFuKGRhcnJheSk7CisgICAgdG1wID0gYXRhbjIoZGFycmF5LCB0bXApOworICAgIHRtcCA9IGF0YW4yKDEuMCwgZGFycmF5KTsKKyAgICB0bXAgPSBhdGFuMihkYXJyYXksIDEuMCk7CisgICAgdG1wID0gY29zKGRhcnJheSk7CisgICAgdG1wID0gY29zaChkYXJyYXkpOworICAgIHRtcCA9IHNpbihkYXJyYXkpOworICAgIHRtcCA9IHNpbmgoZGFycmF5KTsKKyAgICB0bXAgPSB0YW4oZGFycmF5KTsKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgIWRlZmluZWQgKF9TVExQX1VTSU5HX1BMQVRGT1JNX1NES19DT01QSUxFUikgfHwgIWRlZmluZWQgKF9NX0FNRDY0KQorICAgIHRtcCA9IHRhbmgoZGFycmF5KTsKKyNlbmRpZgorICAgIHRtcCA9IGV4cChkYXJyYXkpOworICAgIHRtcCA9IGxvZyhkYXJyYXkpOworICAgIHRtcCA9IGxvZzEwKGRhcnJheSk7CisgICAgdG1wID0gcG93KGRhcnJheSwgdG1wKTsKKyAgICB0bXAgPSBwb3coMS4wLCBkYXJyYXkpOworICAgIHRtcCA9IHBvdyhkYXJyYXksIDEuMCk7CisgICAgdG1wID0gc3FydChkYXJyYXkpOworICB9CisgIHsKKyAgICB2YWxhcnJheTxmbG9hdD4gZmFycmF5OworICAgIHZhbGFycmF5PGZsb2F0PiB0bXA7CisgICAgdG1wID0gYWJzKGZhcnJheSk7CisgICAgdG1wID0gYWNvcyhmYXJyYXkpOworICAgIHRtcCA9IGFzaW4oZmFycmF5KTsKKyAgICB0bXAgPSBhdGFuKGZhcnJheSk7CisgICAgdG1wID0gYXRhbjIoZmFycmF5LCB0bXApOworICAgIHRtcCA9IGF0YW4yKDEuMGYsIGZhcnJheSk7CisgICAgdG1wID0gYXRhbjIoZmFycmF5LCAxLjBmKTsKKyAgICB0bXAgPSBjb3MoZmFycmF5KTsKKyAgICB0bXAgPSBjb3NoKGZhcnJheSk7CisgICAgdG1wID0gc2luKGZhcnJheSk7CisgICAgdG1wID0gc2luaChmYXJyYXkpOworICAgIHRtcCA9IHRhbihmYXJyYXkpOworI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCAhZGVmaW5lZCAoX1NUTFBfVVNJTkdfUExBVEZPUk1fU0RLX0NPTVBJTEVSKSB8fCAhZGVmaW5lZCAoX01fQU1ENjQpCisgICAgdG1wID0gdGFuaChmYXJyYXkpOworI2VuZGlmCisgICAgdG1wID0gZXhwKGZhcnJheSk7CisgICAgdG1wID0gbG9nKGZhcnJheSk7CisgICAgdG1wID0gbG9nMTAoZmFycmF5KTsKKyAgICB0bXAgPSBwb3coZmFycmF5LCB0bXApOworICAgIHRtcCA9IHBvdygxLjBmLCBmYXJyYXkpOworICAgIHRtcCA9IHBvdyhmYXJyYXksIDEuMGYpOworICAgIHRtcCA9IHNxcnQoZmFycmF5KTsKKyAgfQorI2lmICFkZWZpbmVkIChTVExQT1JUKSB8fCAhZGVmaW5lZCAoX1NUTFBfTk9fTE9OR19ET1VCTEUpCisgIHsKKyAgICB2YWxhcnJheTxsb25nIGRvdWJsZT4gbGRhcnJheTsKKyAgICB2YWxhcnJheTxsb25nIGRvdWJsZT4gdG1wOworICAgIHRtcCA9IGFicyhsZGFycmF5KTsKKyAgICB0bXAgPSBhY29zKGxkYXJyYXkpOworICAgIHRtcCA9IGFzaW4obGRhcnJheSk7CisgICAgdG1wID0gYXRhbihsZGFycmF5KTsKKyAgICB0bXAgPSBhdGFuMihsZGFycmF5LCB0bXApOworICAgIHRtcCA9IGF0YW4yKDEuMGwsIGxkYXJyYXkpOworICAgIHRtcCA9IGF0YW4yKGxkYXJyYXksIDEuMGwpOworICAgIHRtcCA9IGNvcyhsZGFycmF5KTsKKyAgICB0bXAgPSBjb3NoKGxkYXJyYXkpOworICAgIHRtcCA9IHNpbihsZGFycmF5KTsKKyAgICB0bXAgPSBzaW5oKGxkYXJyYXkpOworICAgIHRtcCA9IHRhbihsZGFycmF5KTsKKyMgIGlmICFkZWZpbmVkIChTVExQT1JUKSB8fCAhZGVmaW5lZCAoX1NUTFBfVVNJTkdfUExBVEZPUk1fU0RLX0NPTVBJTEVSKSB8fCAhZGVmaW5lZCAoX01fQU1ENjQpCisgICAgdG1wID0gdGFuaChsZGFycmF5KTsKKyMgIGVuZGlmCisgICAgdG1wID0gZXhwKGxkYXJyYXkpOworICAgIHRtcCA9IGxvZyhsZGFycmF5KTsKKyAgICB0bXAgPSBsb2cxMChsZGFycmF5KTsKKyAgICB0bXAgPSBwb3cobGRhcnJheSwgdG1wKTsKKyAgICB0bXAgPSBwb3coMS4wbCwgbGRhcnJheSk7CisgICAgdG1wID0gcG93KGxkYXJyYXksIDEuMGwpOworICAgIHRtcCA9IHNxcnQobGRhcnJheSk7CisgIH0KKyNlbmRpZgorICB2YWxhcnJheTxkb3VibGU+IHYwKDIsIDEwKTsKKyAgdmFsYXJyYXk8ZG91YmxlPiB2MSh2MFtzbGljZSgwLCAxLCA1KV0pOworICB2MFtzbGljZSgwLCAxLCA1KV0gPSA1OworICB2YWxhcnJheTxkb3VibGU+IHYyKHYwW2dzbGljZSgpXSk7CisgIC8vdmFsYXJyYXk8ZG91YmxlPiB2Myh2MFt2YWxhcnJheTxib29sPigpXSk7CisgIHZhbGFycmF5PGRvdWJsZT4gdjQodjBbdmFsYXJyYXk8c2l6ZV90PigpXSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvdmVjdG9yX2hlYWRlcl90ZXN0LmNwcCBiL3Rlc3QvdW5pdC92ZWN0b3JfaGVhZGVyX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZDJiZmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvdmVjdG9yX2hlYWRlcl90ZXN0LmNwcApAQCAtMCwwICsxLDggQEAKKy8qIFRoaXMgdGVzdCBwdXJwb3NlIGlzIHNpbXBseSB0byBjaGVjayBTdGFuZGFyZCBoZWFkZXIgaW5kZXBlbmRhbmN5IHRoYXQKKyAqIGlzIHRvIHNheSB0aGF0IHRoZSBoZWFkZXIgY2FuIGJlIGluY2x1ZGVkIGFsb25lIHdpdGhvdXQgYW55IHByZXZpb3VzCisgKiBpbmNsdWRlLgorICogQWRkaXRpb25uYWx5LCBmb3IgQyBTdGFuZGFyZCBoZWFkZXJzIHRoYXQgU1RMcG9ydCBleHBvc2UsIGl0IGNhbiBhbHNvIGJlCisgKiB1c2VkIHRvIGNoZWNrIHRoYXQgZmlsZXMgaW5jbHVkZWQgYnkgdGhvc2UgaGVhZGVycyBhcmUgY29tcGF0aWJsZSB3aXRoCisgKiBwdXJlIEMgY29tcGlsZXJzLgorICovCisjaW5jbHVkZSA8dmVjdG9yPgpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L3ZlY3Rvcl90ZXN0LmNwcCBiL3Rlc3QvdW5pdC92ZWN0b3JfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIzYmExZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC92ZWN0b3JfdGVzdC5jcHAKQEAgLTAsMCArMSw1NTMgQEAKKy8vSGFzIHRvIGJlIGZpcnN0IGZvciBTdGFja0FsbG9jYXRvciBzd2FwIG92ZXJsb2FkIHRvIGJlIHRha2VuCisvL2ludG8gYWNjb3VudCAoYXQgbGVhc3QgdXNpbmcgR0NDIDQuMC4xKQorI2luY2x1ZGUgInN0YWNrX2FsbG9jYXRvci5oIgorCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZCAoX1NUTFBfVVNFX0VYQ0VQVElPTlMpCisjIGluY2x1ZGUgPHN0ZGV4Y2VwdD4KKyNlbmRpZgorCisjaW5jbHVkZSAiY3BwdW5pdC9jcHB1bml0X3Byb3h5LmgiCisKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZChfU1RMUF9VU0VfTkFNRVNQQUNFUykKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisjZW5kaWYKKworLy8KKy8vIFRlc3RDYXNlIGNsYXNzCisvLworY2xhc3MgVmVjdG9yVGVzdCA6IHB1YmxpYyBDUFBVTklUX05TOjpUZXN0Q2FzZQoreworICBDUFBVTklUX1RFU1RfU1VJVEUoVmVjdG9yVGVzdCk7CisgIENQUFVOSVRfVEVTVCh2ZWNfdGVzdF8xKTsKKyAgQ1BQVU5JVF9URVNUKHZlY190ZXN0XzIpOworICBDUFBVTklUX1RFU1QodmVjX3Rlc3RfMyk7CisgIENQUFVOSVRfVEVTVCh2ZWNfdGVzdF80KTsKKyAgQ1BQVU5JVF9URVNUKHZlY190ZXN0XzUpOworICBDUFBVTklUX1RFU1QodmVjX3Rlc3RfNik7CisgIENQUFVOSVRfVEVTVCh2ZWNfdGVzdF83KTsKKyAgQ1BQVU5JVF9URVNUKGNhcGFjaXR5KTsKKyAgQ1BQVU5JVF9URVNUKGF0KTsKKyAgQ1BQVU5JVF9URVNUKHBvaW50ZXIpOworICBDUFBVTklUX1RFU1QoYXV0b19yZWYpOworICBDUFBVTklUX1RFU1QoYWxsb2NhdG9yX3dpdGhfc3RhdGUpOworICBDUFBVTklUX1RFU1QoaXRlcmF0b3JzKTsKKyNpZiBkZWZpbmVkIChTVExQT1JUKSAmJiBkZWZpbmVkIChfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVTKQorICBDUFBVTklUX0lHTk9SRTsKKyNlbmRpZgorICBDUFBVTklUX1RFU1Qob3B0aW1pemF0aW9uc19jaGVjayk7CisgIENQUFVOSVRfVEVTVChhc3NpZ25fY2hlY2spOworICBDUFBVTklUX1NUT1BfSUdOT1JFOworICBDUFBVTklUX1RFU1QoZWJvKTsKKyAgQ1BQVU5JVF9URVNUX1NVSVRFX0VORCgpOworCitwcm90ZWN0ZWQ6CisgIHZvaWQgdmVjX3Rlc3RfMSgpOworICB2b2lkIHZlY190ZXN0XzIoKTsKKyAgdm9pZCB2ZWNfdGVzdF8zKCk7CisgIHZvaWQgdmVjX3Rlc3RfNCgpOworICB2b2lkIHZlY190ZXN0XzUoKTsKKyAgdm9pZCB2ZWNfdGVzdF82KCk7CisgIHZvaWQgdmVjX3Rlc3RfNygpOworICB2b2lkIGNhcGFjaXR5KCk7CisgIHZvaWQgYXQoKTsKKyAgdm9pZCBwb2ludGVyKCk7CisgIHZvaWQgYXV0b19yZWYoKTsKKyAgdm9pZCBhbGxvY2F0b3Jfd2l0aF9zdGF0ZSgpOworICB2b2lkIGl0ZXJhdG9ycygpOworICB2b2lkIG9wdGltaXphdGlvbnNfY2hlY2soKTsKKyAgdm9pZCBhc3NpZ25fY2hlY2soKTsKKyAgdm9pZCBlYm8oKTsKK307CisKK0NQUFVOSVRfVEVTVF9TVUlURV9SRUdJU1RSQVRJT04oVmVjdG9yVGVzdCk7CisKKy8vCisvLyB0ZXN0cyBpbXBsZW1lbnRhdGlvbgorLy8KK3ZvaWQgVmVjdG9yVGVzdDo6dmVjX3Rlc3RfMSgpCit7CisgIHZlY3RvcjxpbnQ+IHYxOyAvLyBFbXB0eSB2ZWN0b3Igb2YgaW50ZWdlcnMuCisKKyAgQ1BQVU5JVF9BU1NFUlQoIHYxLmVtcHR5KCkgPT0gdHJ1ZSApOworICBDUFBVTklUX0FTU0VSVCggdjEuc2l6ZSgpID09IDAgKTsKKworICAvLyBDUFBVTklUX0FTU0VSVCggdjEubWF4X3NpemUoKSA9PSBJTlRfTUFYIC8gc2l6ZW9mKGludCkgKTsKKyAgLy8gY291dCA8PCAibWF4X3NpemUgPSAiIDw8IHYxLm1heF9zaXplKCkgPDwgZW5kbDsKKyAgdjEucHVzaF9iYWNrKDQyKTsgLy8gQWRkIGFuIGludGVnZXIgdG8gdGhlIHZlY3Rvci4KKworICBDUFBVTklUX0FTU0VSVCggdjEuc2l6ZSgpID09IDEgKTsKKworICBDUFBVTklUX0FTU0VSVCggdjFbMF0gPT0gNDIgKTsKKworICB7CisgICAgdmVjdG9yPHZlY3RvcjxpbnQ+ID4gdmVjdCgxMCk7CisgICAgdmVjdG9yPHZlY3RvcjxpbnQ+ID46Oml0ZXJhdG9yIGl0KHZlY3QuYmVnaW4oKSksIGVuZCh2ZWN0LmVuZCgpKTsKKyAgICBmb3IgKDsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICBDUFBVTklUX0FTU0VSVCggKCppdCkuZW1wdHkoKSApOworICAgICAgQ1BQVU5JVF9BU1NFUlQoICgqaXQpLnNpemUoKSA9PSAwICk7CisgICAgICBDUFBVTklUX0FTU0VSVCggKCppdCkuY2FwYWNpdHkoKSA9PSAwICk7CisgICAgICBDUFBVTklUX0FTU0VSVCggKCppdCkuYmVnaW4oKSA9PSAoKml0KS5lbmQoKSApOworICAgIH0KKyAgfQorfQorCit2b2lkIFZlY3RvclRlc3Q6OnZlY190ZXN0XzIoKQoreworICB2ZWN0b3I8ZG91YmxlPiB2MTsgLy8gRW1wdHkgdmVjdG9yIG9mIGRvdWJsZXMuCisgIHYxLnB1c2hfYmFjaygzMi4xKTsKKyAgdjEucHVzaF9iYWNrKDQwLjUpOworICB2ZWN0b3I8ZG91YmxlPiB2MjsgLy8gQW5vdGhlciBlbXB0eSB2ZWN0b3Igb2YgZG91Ymxlcy4KKyAgdjIucHVzaF9iYWNrKDMuNTYpOworCisgIENQUFVOSVRfQVNTRVJUKCB2MS5zaXplKCkgPT0gMiApOworICBDUFBVTklUX0FTU0VSVCggdjFbMF0gPT0gMzIuMSApOworICBDUFBVTklUX0FTU0VSVCggdjFbMV0gPT0gNDAuNSApOworCisgIENQUFVOSVRfQVNTRVJUKCB2Mi5zaXplKCkgPT0gMSApOworICBDUFBVTklUX0FTU0VSVCggdjJbMF0gPT0gMy41NiApOworICBzaXplX3QgdjFDYXAgPSB2MS5jYXBhY2l0eSgpOworICBzaXplX3QgdjJDYXAgPSB2Mi5jYXBhY2l0eSgpOworCisgIHYxLnN3YXAodjIpOyAvLyBTd2FwIHRoZSB2ZWN0b3IncyBjb250ZW50cy4KKworICBDUFBVTklUX0FTU0VSVCggdjEuc2l6ZSgpID09IDEgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHYxLmNhcGFjaXR5KCkgPT0gdjJDYXAgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHYxWzBdID09IDMuNTYgKTsKKworICBDUFBVTklUX0FTU0VSVCggdjIuc2l6ZSgpID09IDIgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHYyLmNhcGFjaXR5KCkgPT0gdjFDYXAgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHYyWzBdID09IDMyLjEgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHYyWzFdID09IDQwLjUgKTsKKworICB2MiA9IHYxOyAvLyBBc3NpZ24gb25lIHZlY3RvciB0byBhbm90aGVyLgorCisgIENQUFVOSVRfQVNTRVJUKCB2Mi5zaXplKCkgPT0gMSApOworICBDUFBVTklUX0FTU0VSVCggdjJbMF0gPT0gMy41NiApOworfQorCit2b2lkIFZlY3RvclRlc3Q6OnZlY190ZXN0XzMoKQoreworICB0eXBlZGVmIHZlY3RvcjxjaGFyPiB2ZWNfdHlwZTsKKworICB2ZWNfdHlwZSB2MTsgLy8gRW1wdHkgdmVjdG9yIG9mIGNoYXJhY3RlcnMuCisgIHYxLnB1c2hfYmFjaygnaCcpOworICB2MS5wdXNoX2JhY2soJ2knKTsKKworICBDUFBVTklUX0FTU0VSVCggdjEuc2l6ZSgpID09IDIgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHYxWzBdID09ICdoJyApOworICBDUFBVTklUX0FTU0VSVCggdjFbMV0gPT0gJ2knICk7CisKKyAgdmVjX3R5cGUgdjIodjEuYmVnaW4oKSwgdjEuZW5kKCkpOworICB2MlsxXSA9ICdvJzsgLy8gUmVwbGFjZSBzZWNvbmQgY2hhcmFjdGVyLgorCisgIENQUFVOSVRfQVNTRVJUKCB2Mi5zaXplKCkgPT0gMiApOworICBDUFBVTklUX0FTU0VSVCggdjJbMF0gPT0gJ2gnICk7CisgIENQUFVOSVRfQVNTRVJUKCB2MlsxXSA9PSAnbycgKTsKKworICBDUFBVTklUX0FTU0VSVCggKHYxID09IHYyKSA9PSBmYWxzZSApOworCisgIENQUFVOSVRfQVNTRVJUKCAodjEgPCB2MikgPT0gdHJ1ZSApOworfQorCit2b2lkIFZlY3RvclRlc3Q6OnZlY190ZXN0XzQoKQoreworICB2ZWN0b3I8aW50PiB2KDQpOworCisgIHZbMF0gPSAxOworICB2WzFdID0gNDsKKyAgdlsyXSA9IDk7CisgIHZbM10gPSAxNjsKKworICBDUFBVTklUX0FTU0VSVCggdi5mcm9udCgpID09IDEgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHYuYmFjaygpID09IDE2ICk7CisKKyAgdi5wdXNoX2JhY2soMjUpOworCisgIENQUFVOSVRfQVNTRVJUKCB2LmJhY2soKSA9PSAyNSApOworICBDUFBVTklUX0FTU0VSVCggdi5zaXplKCkgPT0gNSApOworCisgIHYucG9wX2JhY2soKTsKKworICBDUFBVTklUX0FTU0VSVCggdi5iYWNrKCkgPT0gMTYgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHYuc2l6ZSgpID09IDQgKTsKK30KKwordm9pZCBWZWN0b3JUZXN0Ojp2ZWNfdGVzdF81KCkKK3sKKyAgaW50IGFycmF5IFtdID0geyAxLCA0LCA5LCAxNiB9OworCisgIHZlY3RvcjxpbnQ+IHYoYXJyYXksIGFycmF5ICsgNCk7CisKKyAgQ1BQVU5JVF9BU1NFUlQoIHYuc2l6ZSgpID09IDQgKTsKKworICBDUFBVTklUX0FTU0VSVCggdlswXSA9PSAxICk7CisgIENQUFVOSVRfQVNTRVJUKCB2WzFdID09IDQgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHZbMl0gPT0gOSApOworICBDUFBVTklUX0FTU0VSVCggdlszXSA9PSAxNiApOworfQorCit2b2lkIFZlY3RvclRlc3Q6OnZlY190ZXN0XzYoKQoreworICBpbnQgYXJyYXkgW10gPSB7IDEsIDQsIDksIDE2LCAyNSwgMzYgfTsKKworICB2ZWN0b3I8aW50PiB2KGFycmF5LCBhcnJheSArIDYpOworICB2ZWN0b3I8aW50Pjo6aXRlcmF0b3Igdml0OworCisgIENQUFVOSVRfQVNTRVJUKCB2LnNpemUoKSA9PSA2ICk7CisgIENQUFVOSVRfQVNTRVJUKCB2WzBdID09IDEgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHZbMV0gPT0gNCApOworICBDUFBVTklUX0FTU0VSVCggdlsyXSA9PSA5ICk7CisgIENQUFVOSVRfQVNTRVJUKCB2WzNdID09IDE2ICk7CisgIENQUFVOSVRfQVNTRVJUKCB2WzRdID09IDI1ICk7CisgIENQUFVOSVRfQVNTRVJUKCB2WzVdID09IDM2ICk7CisKKyAgdml0ID0gdi5lcmFzZSggdi5iZWdpbigpICk7IC8vIEVyYXNlIGZpcnN0IGVsZW1lbnQuCisgIENQUFVOSVRfQVNTRVJUKCAqdml0ID09IDQgKTsKKworICBDUFBVTklUX0FTU0VSVCggdi5zaXplKCkgPT0gNSApOworICBDUFBVTklUX0FTU0VSVCggdlswXSA9PSA0ICk7CisgIENQUFVOSVRfQVNTRVJUKCB2WzFdID09IDkgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHZbMl0gPT0gMTYgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHZbM10gPT0gMjUgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHZbNF0gPT0gMzYgKTsKKworICB2aXQgPSB2LmVyYXNlKHYuZW5kKCkgLSAxKTsgLy8gRXJhc2UgbGFzdCBlbGVtZW50LgorICBDUFBVTklUX0FTU0VSVCggdml0ID09IHYuZW5kKCkgKTsKKworICBDUFBVTklUX0FTU0VSVCggdi5zaXplKCkgPT0gNCApOworICBDUFBVTklUX0FTU0VSVCggdlswXSA9PSA0ICk7CisgIENQUFVOSVRfQVNTRVJUKCB2WzFdID09IDkgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHZbMl0gPT0gMTYgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHZbM10gPT0gMjUgKTsKKworCisgIHYuZXJhc2Uodi5iZWdpbigpICsgMSwgdi5lbmQoKSAtIDEpOyAvLyBFcmFzZSBhbGwgYnV0IGZpcnN0IGFuZCBsYXN0LgorCisgIENQUFVOSVRfQVNTRVJUKCB2LnNpemUoKSA9PSAyICk7CisgIENQUFVOSVRfQVNTRVJUKCB2WzBdID09IDQgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHZbMV0gPT0gMjUgKTsKKworfQorCit2b2lkIFZlY3RvclRlc3Q6OnZlY190ZXN0XzcoKQoreworICBpbnQgYXJyYXkxIFtdID0geyAxLCA0LCAyNSB9OworICBpbnQgYXJyYXkyIFtdID0geyA5LCAxNiB9OworCisgIHZlY3RvcjxpbnQ+IHYoYXJyYXkxLCBhcnJheTEgKyAzKTsKKyAgdmVjdG9yPGludD46Oml0ZXJhdG9yIHZpdDsKKyAgdml0ID0gdi5pbnNlcnQodi5iZWdpbigpLCAwKTsgLy8gSW5zZXJ0IGJlZm9yZSBmaXJzdCBlbGVtZW50LgorICBDUFBVTklUX0FTU0VSVCggKnZpdCA9PSAwICk7CisKKyAgdml0ID0gdi5pbnNlcnQodi5lbmQoKSwgMzYpOyAgLy8gSW5zZXJ0IGFmdGVyIGxhc3QgZWxlbWVudC4KKyAgQ1BQVU5JVF9BU1NFUlQoICp2aXQgPT0gMzYgKTsKKworICBDUFBVTklUX0FTU0VSVCggdi5zaXplKCkgPT0gNSApOworICBDUFBVTklUX0FTU0VSVCggdlswXSA9PSAwICk7CisgIENQUFVOSVRfQVNTRVJUKCB2WzFdID09IDEgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHZbMl0gPT0gNCApOworICBDUFBVTklUX0FTU0VSVCggdlszXSA9PSAyNSApOworICBDUFBVTklUX0FTU0VSVCggdls0XSA9PSAzNiApOworCisgIC8vIEluc2VydCBjb250ZW50cyBvZiBhcnJheTIgYmVmb3JlIGZvdXJ0aCBlbGVtZW50LgorICB2Lmluc2VydCh2LmJlZ2luKCkgKyAzLCBhcnJheTIsIGFycmF5MiArIDIpOworCisgIENQUFVOSVRfQVNTRVJUKCB2LnNpemUoKSA9PSA3ICk7CisKKyAgQ1BQVU5JVF9BU1NFUlQoIHZbMF0gPT0gMCApOworICBDUFBVTklUX0FTU0VSVCggdlsxXSA9PSAxICk7CisgIENQUFVOSVRfQVNTRVJUKCB2WzJdID09IDQgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHZbM10gPT0gOSApOworICBDUFBVTklUX0FTU0VSVCggdls0XSA9PSAxNiApOworICBDUFBVTklUX0FTU0VSVCggdls1XSA9PSAyNSApOworICBDUFBVTklUX0FTU0VSVCggdls2XSA9PSAzNiApOworCisgIHYuY2xlYXIoKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHYuZW1wdHkoKSApOworCisgIHYuaW5zZXJ0KHYuYmVnaW4oKSwgNSwgMTApOworICBDUFBVTklUX0FTU0VSVCggdi5zaXplKCkgPT0gNSApOworICBDUFBVTklUX0FTU0VSVCggdlswXSA9PSAxMCApOworICBDUFBVTklUX0FTU0VSVCggdlsxXSA9PSAxMCApOworICBDUFBVTklUX0FTU0VSVCggdlsyXSA9PSAxMCApOworICBDUFBVTklUX0FTU0VSVCggdlszXSA9PSAxMCApOworICBDUFBVTklUX0FTU0VSVCggdls0XSA9PSAxMCApOworCisgIC8qCisgIHsKKyAgICB2ZWN0b3I8ZmxvYXQ+IHZmKDIuMGYsIDMuMGYpOworICAgIENQUFVOSVRfQVNTRVJUKCB2Zi5zaXplKCkgPT0gMiApOworICAgIENQUFVOSVRfQVNTRVJUKCB2Zi5mcm9udCgpID09IDMuMGYgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggdmYuYmFjaygpID09IDMuMGYgKTsKKyAgfQorICAqLworfQorCitzdHJ1Y3QgVGVzdFN0cnVjdAoreworICB1bnNpZ25lZCBpbnQgYVszXTsKK307CisKK3ZvaWQgVmVjdG9yVGVzdDo6Y2FwYWNpdHkoKQoreworICB7CisgICAgdmVjdG9yPGludD4gdjsKKworICAgIENQUFVOSVRfQVNTRVJUKCB2LmNhcGFjaXR5KCkgPT0gMCApOworICAgIHYucHVzaF9iYWNrKDQyKTsKKyAgICBDUFBVTklUX0FTU0VSVCggdi5jYXBhY2l0eSgpID49IDEgKTsKKyAgICB2LnJlc2VydmUoNTAwMCk7CisgICAgQ1BQVU5JVF9BU1NFUlQoIHYuY2FwYWNpdHkoKSA+PSA1MDAwICk7CisgIH0KKworICB7CisgICAgLy9UZXN0IHRoYXQgdXNlZCB0byBnZW5lcmF0ZSBhbiBhc3NlcnRpb24gd2hlbiB1c2luZyBfX2RlYnVnX2FsbG9jLgorICAgIHZlY3RvcjxUZXN0U3RydWN0PiB2YTsKKyAgICB2YS5yZXNlcnZlKDEpOworICAgIHZhLnJlc2VydmUoMik7CisgIH0KK30KKwordm9pZCBWZWN0b3JUZXN0OjphdCgpIHsKKyAgdmVjdG9yPGludD4gdjsKKyAgdmVjdG9yPGludD4gY29uc3QmIGN2ID0gdjsKKworICB2LnB1c2hfYmFjaygxMCk7CisgIENQUFVOSVRfQVNTRVJUKCB2LmF0KDApID09IDEwICk7CisgIHYuYXQoMCkgPSAyMDsKKyAgQ1BQVU5JVF9BU1NFUlQoIGN2LmF0KDApID09IDIwICk7CisKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZCAoX1NUTFBfVVNFX0VYQ0VQVElPTlMpCisgIHRyeSB7CisgICAgdi5hdCgxKSA9IDIwOworICAgIENQUFVOSVRfRkFJTDsKKyAgfQorICBjYXRjaCAob3V0X29mX3JhbmdlIGNvbnN0JikgeworICB9CisgIGNhdGNoICguLi4pIHsKKyAgICBDUFBVTklUX0ZBSUw7CisgIH0KKyNlbmRpZgorfQorCit2b2lkIFZlY3RvclRlc3Q6OnBvaW50ZXIoKQoreworICB2ZWN0b3I8aW50ICo+IHYxOworICB2ZWN0b3I8aW50ICo+IHYyID0gdjE7CisgIHZlY3RvcjxpbnQgKj4gdjM7CisKKyAgdjMuaW5zZXJ0KCB2My5lbmQoKSwgdjEuYmVnaW4oKSwgdjEuZW5kKCkgKTsKK30KKwordm9pZCBWZWN0b3JUZXN0OjphdXRvX3JlZigpCit7CisgIHZlY3RvcjxpbnQ+IHJlZjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyArK2kpIHsKKyAgICByZWYucHVzaF9iYWNrKGkpOworICB9CisKKyAgdmVjdG9yPHZlY3RvcjxpbnQ+ID4gdl92X2ludCgxLCByZWYpOworICB2X3ZfaW50LnB1c2hfYmFjayh2X3ZfaW50WzBdKTsKKyAgdl92X2ludC5wdXNoX2JhY2socmVmKTsKKyAgdl92X2ludC5wdXNoX2JhY2sodl92X2ludFswXSk7CisgIHZfdl9pbnQucHVzaF9iYWNrKHZfdl9pbnRbMF0pOworICB2X3ZfaW50LnB1c2hfYmFjayhyZWYpOworCisgIHZlY3Rvcjx2ZWN0b3I8aW50PiA+OjppdGVyYXRvciB2dml0KHZfdl9pbnQuYmVnaW4oKSksIHZ2aXRFbmQodl92X2ludC5lbmQoKSk7CisgIGZvciAoOyB2dml0ICE9IHZ2aXRFbmQ7ICsrdnZpdCkgeworICAgIENQUFVOSVRfQVNTRVJUKCAqdnZpdCA9PSByZWYgKTsKKyAgfQorCisgIC8qCisgICAqIEZvcmJpZGRlbiBieSB0aGUgU3RhbmRhcmQ6CisgIHZfdl9pbnQuaW5zZXJ0KHZfdl9pbnQuZW5kKCksIHZfdl9pbnQuYmVnaW4oKSwgdl92X2ludC5lbmQoKSk7CisgIGZvciAodnZpdCA9IHZfdl9pbnQuYmVnaW4oKSwgdnZpdEVuZCA9IHZfdl9pbnQuZW5kKCk7CisgICAgICAgdnZpdCAhPSB2dml0RW5kOyArK3Z2aXQpIHsKKyAgICBDUFBVTklUX0FTU0VSVCggKnZ2aXQgPT0gcmVmICk7CisgIH0KKyAgICovCit9CisKK3ZvaWQgVmVjdG9yVGVzdDo6YWxsb2NhdG9yX3dpdGhfc3RhdGUoKQorICB7CisgICAgY2hhciBidWYxWzEwMjRdOworICAgIFN0YWNrQWxsb2NhdG9yPGludD4gc3RhY2sxKGJ1ZjEsIGJ1ZjEgKyBzaXplb2YoYnVmMSkpOworCisgICAgY2hhciBidWYyWzEwMjRdOworICAgIFN0YWNrQWxsb2NhdG9yPGludD4gc3RhY2syKGJ1ZjIsIGJ1ZjIgKyBzaXplb2YoYnVmMikpOworCisgICAgeworICAgICAgdHlwZWRlZiB2ZWN0b3I8aW50LCBTdGFja0FsbG9jYXRvcjxpbnQ+ID4gVmVjdG9ySW50OworICAgICAgVmVjdG9ySW50IHZpbnQxKDEwLCAwLCBzdGFjazEpOworICAgICAgVmVjdG9ySW50IHZpbnQxQ3B5KHZpbnQxKTsKKworICAgICAgVmVjdG9ySW50IHZpbnQyKDEwLCAxLCBzdGFjazIpOworICAgICAgVmVjdG9ySW50IHZpbnQyQ3B5KHZpbnQyKTsKKworICAgICAgdmludDEuc3dhcCh2aW50Mik7CisKKyAgICAgIENQUFVOSVRfQVNTRVJUKCB2aW50MS5nZXRfYWxsb2NhdG9yKCkuc3dhcGVkKCkgKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCB2aW50Mi5nZXRfYWxsb2NhdG9yKCkuc3dhcGVkKCkgKTsKKworICAgICAgQ1BQVU5JVF9BU1NFUlQoIHZpbnQxID09IHZpbnQyQ3B5ICk7CisgICAgICBDUFBVTklUX0FTU0VSVCggdmludDIgPT0gdmludDFDcHkgKTsKKyAgICAgIENQUFVOSVRfQVNTRVJUKCB2aW50MS5nZXRfYWxsb2NhdG9yKCkgPT0gc3RhY2syICk7CisgICAgICBDUFBVTklUX0FTU0VSVCggdmludDIuZ2V0X2FsbG9jYXRvcigpID09IHN0YWNrMSApOworICAgIH0KKyAgICBDUFBVTklUX0FTU0VSVCggc3RhY2sxLm9rKCkgKTsKKyAgICBDUFBVTklUX0FTU0VSVCggc3RhY2syLm9rKCkgKTsKKyAgfQorCitzdHJ1Y3QgUG9pbnQgeworICBpbnQgeCwgeTsKK307CisKK3N0cnVjdCBQb2ludEV4IDogcHVibGljIFBvaW50IHsKKyAgUG9pbnRFeCgpIDogYnVpbHRGcm9tQmFzZShmYWxzZSkge30KKyAgUG9pbnRFeChjb25zdCBQb2ludCYpIDogYnVpbHRGcm9tQmFzZSh0cnVlKSB7fQorCisgIGJvb2wgYnVpbHRGcm9tQmFzZTsKK307CisKKyNpZiBkZWZpbmVkIChTVExQT1JUKQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX05BTUVTUEFDRVMpCituYW1lc3BhY2Ugc3RkIHsKKyMgIGVuZGlmCisgIF9TVExQX1RFTVBMQVRFX05VTEwKKyAgc3RydWN0IF9fdHlwZV90cmFpdHM8UG9pbnRFeD4geworICAgIHR5cGVkZWYgX19mYWxzZV90eXBlIGhhc190cml2aWFsX2RlZmF1bHRfY29uc3RydWN0b3I7CisgICAgdHlwZWRlZiBfX3RydWVfdHlwZSBoYXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yOworICAgIHR5cGVkZWYgX190cnVlX3R5cGUgaGFzX3RyaXZpYWxfYXNzaWdubWVudF9vcGVyYXRvcjsKKyAgICB0eXBlZGVmIF9fdHJ1ZV90eXBlIGhhc190cml2aWFsX2Rlc3RydWN0b3I7CisgICAgdHlwZWRlZiBfX3RydWVfdHlwZSBpc19QT0RfdHlwZTsKKyAgfTsKKyMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9OQU1FU1BBQ0VTKQorfQorIyAgZW5kaWYKKyNlbmRpZgorCisvL1RoaXMgdGVzdCBjaGVjayB0aGF0IHZlY3RvciBpbXBsZW1lbnRhdGlvbiBkbyBub3Qgb3ZlciBvcHRpbWl6ZQorLy9vcGVyYXRpb24gYXMgUG9pbnRFeCBjb3B5IGNvbnN0cnVjdG9yIGlzIHRyaXZpYWwKK3ZvaWQgVmVjdG9yVGVzdDo6b3B0aW1pemF0aW9uc19jaGVjaygpCit7CisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8ICFkZWZpbmVkIChfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVTKQorICB2ZWN0b3I8UG9pbnQ+IHYxKDEpOworICBDUFBVTklUX0FTU0VSVCggdjEuc2l6ZSgpID09IDEgKTsKKworICB2ZWN0b3I8UG9pbnRFeD4gdjIodjEuYmVnaW4oKSwgdjEuZW5kKCkpOworICBDUFBVTklUX0FTU0VSVCggdjIuc2l6ZSgpID09IDEgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHYyWzBdLmJ1aWx0RnJvbUJhc2UgPT0gdHJ1ZSApOworI2VuZGlmCit9CisKK3ZvaWQgVmVjdG9yVGVzdDo6YXNzaWduX2NoZWNrKCkKK3sKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgIWRlZmluZWQgKF9TVExQX05PX01FTUJFUl9URU1QTEFURVMpCisgIHZlY3RvcjxpbnQ+IHYoMywxKTsKKyAgaW50IGFycmF5W10gPSB7IDEsIDIsIDMsIDQsIDUgfTsKKyAgCisgIHYuYXNzaWduKCBhcnJheSwgYXJyYXkgKyA1ICk7CisgIENQUFVOSVRfQ0hFQ0soIHZbNF0gPT0gNSApOworICBDUFBVTklUX0NIRUNLKCB2WzBdID09IDEgKTsKKyAgQ1BQVU5JVF9DSEVDSyggdlsxXSA9PSAyICk7CisjZW5kaWYKK30KKwordm9pZCBWZWN0b3JUZXN0OjppdGVyYXRvcnMoKQoreworICB2ZWN0b3I8aW50PiB2aW50KDEwLCAwKTsKKyAgdmVjdG9yPGludD4gY29uc3QmIGNydmludCA9IHZpbnQ7CisKKyAgQ1BQVU5JVF9BU1NFUlQoIHZpbnQuYmVnaW4oKSA9PSB2aW50LmJlZ2luKCkgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIGNydmludC5iZWdpbigpID09IHZpbnQuYmVnaW4oKSApOworICBDUFBVTklUX0FTU0VSVCggdmludC5iZWdpbigpID09IGNydmludC5iZWdpbigpICk7CisgIENQUFVOSVRfQVNTRVJUKCBjcnZpbnQuYmVnaW4oKSA9PSBjcnZpbnQuYmVnaW4oKSApOworCisgIENQUFVOSVRfQVNTRVJUKCB2aW50LmJlZ2luKCkgIT0gdmludC5lbmQoKSApOworICBDUFBVTklUX0FTU0VSVCggY3J2aW50LmJlZ2luKCkgIT0gdmludC5lbmQoKSApOworICBDUFBVTklUX0FTU0VSVCggdmludC5iZWdpbigpICE9IGNydmludC5lbmQoKSApOworICBDUFBVTklUX0FTU0VSVCggY3J2aW50LmJlZ2luKCkgIT0gY3J2aW50LmVuZCgpICk7CisKKyAgQ1BQVU5JVF9BU1NFUlQoIHZpbnQucmJlZ2luKCkgPT0gdmludC5yYmVnaW4oKSApOworICAvLyBOb3QgU3RhbmRhcmQ6CisgIC8vQ1BQVU5JVF9BU1NFUlQoIHZpbnQucmJlZ2luKCkgPT0gY3J2aW50LnJiZWdpbigpICk7CisgIC8vQ1BQVU5JVF9BU1NFUlQoIGNydmludC5yYmVnaW4oKSA9PSB2aW50LnJiZWdpbigpICk7CisgIENQUFVOSVRfQVNTRVJUKCBjcnZpbnQucmJlZ2luKCkgPT0gY3J2aW50LnJiZWdpbigpICk7CisKKyAgQ1BQVU5JVF9BU1NFUlQoIHZpbnQucmJlZ2luKCkgIT0gdmludC5yZW5kKCkgKTsKKyAgLy8gTm90IFN0YW5kYXJkOgorICAvL0NQUFVOSVRfQVNTRVJUKCB2aW50LnJiZWdpbigpICE9IGNydmludC5yZW5kKCkgKTsKKyAgLy9DUFBVTklUX0FTU0VSVCggY3J2aW50LnJiZWdpbigpICE9IHZpbnQucmVuZCgpICk7CisgIENQUFVOSVRfQVNTRVJUKCBjcnZpbnQucmJlZ2luKCkgIT0gY3J2aW50LnJlbmQoKSApOworfQorCisKKyNpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgXAorICAgICFkZWZpbmVkIChfU1RMUF9VU0VfUFRSX1NQRUNJQUxJWkFUSU9OUykgfHwgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikKKy8qIFNpbXBsZSBjb21waWxhdGlvbiB0ZXN0OiBDaGVjayB0aGF0IG5lc3RlZCB0eXBlcyBsaWtlIGl0ZXJhdG9yCisgKiBjYW4gYmUgYWNjZXNzIGV2ZW4gaWYgdHlwZSB1c2VkIHRvIGluc3RhbmNpYXRlIGNvbnRhaW5lciBpcyBub3QKKyAqIHlldCBjb21wbGV0ZWx5IGRlZmluZWQuCisgKi8KK2NsYXNzIEluY29tcGxldGVDbGFzcworeworICB2ZWN0b3I8SW5jb21wbGV0ZUNsYXNzPiBpbnN0YW5jZXM7CisgIHR5cGVkZWYgdmVjdG9yPEluY29tcGxldGVDbGFzcz46Oml0ZXJhdG9yIGl0OworfTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoU1RMUE9SVCkKKyMgIGRlZmluZSBOT1RIUk9XIF9TVExQX05PVEhST1cKKyNlbHNlCisjICBkZWZpbmUgTk9USFJPVyB0aHJvdygpCisjZW5kaWYKKworLyogVGhpcyBhbGxvY2F0b3IgaW1wbGVtZW50YXRpb24gcHVycG9zZSBpcyBzaW1wbHkgdG8gYnJlYWsgc29tZQorICogaW50ZXJuYWwgU1RMcG9ydCBtZWNhbmlzbSBzcGVjaWZpYyB0byB0aGUgU1RMcG9ydCBvd24gYWxsb2NhdG9yCisgKiBpbXBsZW1lbnRhdGlvbi4gKi8KK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgTm90U1RMcG9ydEFsbG9jYXRvciA6IHB1YmxpYyBhbGxvY2F0b3I8X1RwPiB7CisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURV9DTEFTU0VTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwMT4gc3RydWN0IHJlYmluZCB7CisgICAgdHlwZWRlZiBOb3RTVExwb3J0QWxsb2NhdG9yPF9UcDE+IG90aGVyOworICB9OworI2VuZGlmCisgIE5vdFNUTHBvcnRBbGxvY2F0b3IoKSBOT1RIUk9XIHt9CisjaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIHRlbXBsYXRlIDxjbGFzcyBfVHAxPiBOb3RTVExwb3J0QWxsb2NhdG9yKGNvbnN0IE5vdFNUTHBvcnRBbGxvY2F0b3I8X1RwMT4mKSBOT1RIUk9XIHt9CisjZW5kaWYKKyAgTm90U1RMcG9ydEFsbG9jYXRvcihjb25zdCBOb3RTVExwb3J0QWxsb2NhdG9yPF9UcD4mKSBOT1RIUk9XIHt9CisgIH5Ob3RTVExwb3J0QWxsb2NhdG9yKCkgTk9USFJPVyB7fQorfTsKKworLyogVGhpcyB0ZXN0IGNoZWNrIGEgcG90ZW50aWFsIGlzc3VlIHdpdGggZW1wdHkgYmFzZSBjbGFzcworICogb3B0aW1pemF0aW9uLiBTb21lIGNvbXBpbGVycyAoVkM2KSBkbyBub3QgaW1wbGVtZW50IGl0CisgKiBjb3JyZWN0bHkgcmVzdWx0aW5nIGluYSB3cm9uZyBiZWhhdmlvci4gKi8KK3ZvaWQgVmVjdG9yVGVzdDo6ZWJvKCkKK3sKKyAgLy8gV2UgdXNlIGhlYXAgbWVtb3J5IGFzIHRlc3QgZmFpbHVyZSBjYW4gY29ycnVwdCB2ZWN0b3IgaW50ZXJuYWwKKyAgLy8gcmVwcmVzZW50YXRpb24gbWFraW5nIGV4ZWN1dGFibGUgY3Jhc2ggb24gdmVjdG9yIGRlc3RydWN0b3IgaW52b2NhdGlvbi4KKyAgLy8gV2UgcHJlZmVyIGEgc2ltcGxlIG1lbW9yeSBsZWFrLCBpbnRlcm5hbCBjb3JydXB0aW9uIHNob3VsZCBiZSByZXZlYWwKKyAgLy8gYnkgc2l6ZSBvciBjYXBhY2l0eSBjaGVja3MuCisgIHR5cGVkZWYgdmVjdG9yPGludCwgTm90U1RMcG9ydEFsbG9jYXRvcjxpbnQ+ID4gVjsKKyAgViAqcHYxID0gbmV3IFYoMSwgMSk7CisgIFYgKnB2MiA9IG5ldyBWKDEwLCAyKTsKKworICBzaXplX3QgdjFDYXBhY2l0eSA9IHB2MS0+Y2FwYWNpdHkoKTsKKyAgc2l6ZV90IHYyQ2FwYWNpdHkgPSBwdjItPmNhcGFjaXR5KCk7CisKKyAgcHYxLT5zd2FwKCpwdjIpOworCisgIENQUFVOSVRfQVNTRVJUKCBwdjEtPnNpemUoKSA9PSAxMCApOworICBDUFBVTklUX0FTU0VSVCggcHYxLT5jYXBhY2l0eSgpID09IHYyQ2FwYWNpdHkgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoICgqcHYxKVs1XSA9PSAyICk7CisKKyAgQ1BQVU5JVF9BU1NFUlQoIHB2Mi0+c2l6ZSgpID09IDEgKTsKKyAgQ1BQVU5JVF9BU1NFUlQoIHB2Mi0+Y2FwYWNpdHkoKSA9PSB2MUNhcGFjaXR5ICk7CisgIENQUFVOSVRfQVNTRVJUKCAoKnB2MilbMF0gPT0gMSApOworCisgIGRlbGV0ZSBwdjI7CisgIGRlbGV0ZSBwdjE7Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC93Y2hhcl9oZWFkZXJfdGVzdC5jIGIvdGVzdC91bml0L3djaGFyX2hlYWRlcl90ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYzNzZmZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC93Y2hhcl9oZWFkZXJfdGVzdC5jCkBAIC0wLDAgKzEsOCBAQAorLyogVGhpcyB0ZXN0IHB1cnBvc2UgaXMgc2ltcGx5IHRvIGNoZWNrIFN0YW5kYXJkIGhlYWRlciBpbmRlcGVuZGFuY3kgdGhhdAorICogaXMgdG8gc2F5IHRoYXQgdGhlIGhlYWRlciBjYW4gYmUgaW5jbHVkZWQgYWxvbmUgd2l0aG91dCBhbnkgcHJldmlvdXMKKyAqIGluY2x1ZGUuCisgKiBBZGRpdGlvbm5hbHksIGZvciBDIFN0YW5kYXJkIGhlYWRlcnMgdGhhdCBTVExwb3J0IGV4cG9zZSwgaXQgY2FuIGFsc28gYmUKKyAqIHVzZWQgdG8gY2hlY2sgdGhhdCBmaWxlcyBpbmNsdWRlZCBieSB0aG9zZSBoZWFkZXJzIGFyZSBjb21wYXRpYmxlIHdpdGgKKyAqIHB1cmUgQyBjb21waWxlcnMuCisgKi8KKyNpbmNsdWRlIDx3Y2hhci5oPgpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L3djdHlwZV9oZWFkZXJfdGVzdC5jIGIvdGVzdC91bml0L3djdHlwZV9oZWFkZXJfdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzOTg3OGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvd2N0eXBlX2hlYWRlcl90ZXN0LmMKQEAgLTAsMCArMSw4IEBACisvKiBUaGlzIHRlc3QgcHVycG9zZSBpcyBzaW1wbHkgdG8gY2hlY2sgU3RhbmRhcmQgaGVhZGVyIGluZGVwZW5kYW5jeSB0aGF0CisgKiBpcyB0byBzYXkgdGhhdCB0aGUgaGVhZGVyIGNhbiBiZSBpbmNsdWRlZCBhbG9uZSB3aXRob3V0IGFueSBwcmV2aW91cworICogaW5jbHVkZS4KKyAqIEFkZGl0aW9ubmFseSwgZm9yIEMgU3RhbmRhcmQgaGVhZGVycyB0aGF0IFNUTHBvcnQgZXhwb3NlLCBpdCBjYW4gYWxzbyBiZQorICogdXNlZCB0byBjaGVjayB0aGF0IGZpbGVzIGluY2x1ZGVkIGJ5IHRob3NlIGhlYWRlcnMgYXJlIGNvbXBhdGlibGUgd2l0aAorICogcHVyZSBDIGNvbXBpbGVycy4KKyAqLworI2luY2x1ZGUgPHdjdHlwZS5oPgpkaWZmIC0tZ2l0IGEvdGltZS5oIGIvdGltZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDEwYmZjLi4wMDAwMDAwCi0tLSBhL3RpbWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0jaWYgIWRlZmluZWQgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQpCi0jICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDI3MgotIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KLSNlbGlmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MjcyKSAmJiAhIGRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKLSMgIGRlZmluZSBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKLSNlbmRpZgotCi0jaWZkZWYgX1NUTFBfV0NFX0VWQzMKLS8vIG9ubHkgc2hvdyBtZXNzYWdlIHdoZW4gZGlyZWN0bHkgaW5jbHVkaW5nIHRoaXMgZmlsZSBpbiBhIG5vbi1saWJyYXJ5IGJ1aWxkCi0jICBpZiAhZGVmaW5lZChfX0JVSUxESU5HX1NUTFBPUlQpICYmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MjcyKQotIyAgICBwcmFnbWEgbWVzc2FnZSgiZU1iZWRkZWQgVmlzdWFsIEMrKyAzIGRvZXNuJ3QgaGF2ZSBhIHRpbWUuaCBoZWFkZXI7IFNUTHBvcnQgd29uJ3QgaW5jbHVkZSBuYXRpdmUgdGltZS5oIGhlcmUiKQotIyAgZW5kaWYKLSNlbHNlCi0jICBpbmNsdWRlIF9TVExQX05BVElWRV9DX0hFQURFUih0aW1lLmgpCi0jZW5kaWYKLQotCi0jaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgyNzIpCi0jICBpZiAhIGRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKLSMgICAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KLSMgICAgdW5kZWYgIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKLSMgIGVsc2UKLSMgICAgdW5kZWYgIF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRAotIyAgZW5kaWYKLSNlbmRpZgotCi0vKiBMb2NhbCBWYXJpYWJsZXM6Ci0gKiBtb2RlOkMrKwotICogRW5kOgotICovCmRpZmYgLS1naXQgYS90eXBlaW5mbyBiL3R5cGVpbmZvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmE1MWE3Li4wMDAwMDAwCi0tLSBhL3R5cGVpbmZvCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogQm9yaXMgRm9taXRjaGV2Ci0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICovCi0KLSNpZm5kZWYgX1NUTFBfVFlQRUlORk8KLQotI2lmbmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECi0jICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDQ3MwotIyAgZGVmaW5lIF9TVExQX1RZUEVJTkZPCi0jICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgotI2VuZGlmCi0KLSNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAhPSAweDQ3MykKLSMgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9SVU5USU1FX0hFQURFUih0eXBlaW5mbykKLSNlbHNlCi0jICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfVFlQRUlORk8KLSMgICAgaW5jbHVkZSA8c3RsL190eXBlaW5mby5oPgotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHg0NzMpCi0jICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgotIyAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAotI2VuZGlmCi0KLSNlbmRpZgotCi0vLyBMb2NhbCBWYXJpYWJsZXM6Ci0vLyBtb2RlOkMrKwotLy8gRW5kOgpkaWZmIC0tZ2l0IGEvdHlwZWluZm8uaCBiL3R5cGVpbmZvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNTY1YWYuLjAwMDAwMDAKLS0tIGEvdHlwZWluZm8uaAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0jaWZuZGVmIF9TVExQX09MRFNURF90eXBlaW5mbwotI2RlZmluZSBfU1RMUF9PTERTVERfdHlwZWluZm8KLQotI2lmbmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECi0jICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDg3NAotIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9TVExQX05PX1RZUEVJTkZPCi0KLSMgIGlmIGRlZmluZWQgKF9fR05VQ19fKQotIyAgICB1bmRlZiBfU1RMUF9PTERTVERfdHlwZWluZm8KLSMgICAgaW5jbHVkZSA8dHlwZWluZm8+Ci0jICAgIGRlZmluZSBfU1RMUF9PTERTVERfdHlwZWluZm8KLSMgIGVsc2UKLSMgICAgaWYgIWRlZmluZWQgKF9fQk9STEFORENfXykgfHwgKF9fQk9STEFORENfXyA8IDB4NTgwKQotIyAgICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9SVU5USU1FX0hFQURFUih0eXBlaW5mby5oKQotIyAgICBlbHNlCi0jICAgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSEVBREVSKHR5cGVpbmZvLmgpCi0jICAgIGVuZGlmCi0jICAgIGlmIGRlZmluZWQgKF9fQk9STEFORENfXykgJiYgKF9fQk9STEFORENfXyA+PSAweDU4MCkgfHwgXAotICAgICAgICBkZWZpbmVkIChfX0RNQ19fKQotdXNpbmcgc3RkOjp0eXBlX2luZm87Ci11c2luZyBzdGQ6OmJhZF90eXBlaWQ7Ci11c2luZyBzdGQ6OmJhZF9jYXN0OwotIyAgICBlbmRpZgotIyAgZW5kaWYKLQotLy8gaWYgPHR5cGVpbmZvPiBhbHJlYWR5IGluY2x1ZGVkLCBkbyBub3QgaW1wb3J0IGFueXRoaW5nCi0KLSMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9PV05fTkFNRVNQQUNFKSAmJiAhKGRlZmluZWQgKF9TVExQX1RZUEVJTkZPKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fTkVXX05FV19IRUFERVIpKQotCi1fU1RMUF9CRUdJTl9OQU1FU1BBQ0UKLQotdXNpbmcgLypfU1RMUF9WRU5ET1JfRVhDRVBUX1NURCAqLyA6OiB0eXBlX2luZm87Ci0jICAgIGlmICEoZGVmaW5lZChfX01SQ19fKSB8fCAoZGVmaW5lZChfX1NDX18pICYmICFkZWZpbmVkKF9fRE1DX18pKSkKLXVzaW5nIC8qIF9TVExQX1ZFTkRPUl9FWENFUFRfU1REICovIDo6IGJhZF90eXBlaWQ7Ci0jICAgIGVuZGlmCi0KLXVzaW5nIC8qIF9TVExQX1ZFTkRPUl9FWENFUFRfU1REICovIDo6IGJhZF9jYXN0OwotCi1fU1RMUF9FTkRfTkFNRVNQQUNFCi0KLSMgIGVuZGlmIC8qIF9TVExQX09XTl9OQU1FU1BBQ0UgKi8KLQotI2VuZGlmIC8qIF9TVExQX05PX1RZUEVJTkZPICovCi0KLSNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDg3NCkKLSMgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+Ci0jICB1bmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECi0jZW5kaWYKLQotI2VuZGlmIC8qIF9TVExQX09MRFNURF90eXBlaW5mbyAqLwotCi0vLyBMb2NhbCBWYXJpYWJsZXM6Ci0vLyBtb2RlOkMrKwotLy8gRW5kOgpkaWZmIC0tZ2l0IGEvdXNpbmcvY3N0cmluZyBiL3VzaW5nL2NzdHJpbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ODA2MzguLjAwMDAwMDAKLS0tIGEvdXNpbmcvY3N0cmluZworKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpzaXplX3Q7Ci0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fQ1NURF9GVU5DVElPTl9JTVBPUlRTKQotIyAgaWYgZGVmaW5lZCAoX19NU0xfXykgJiYgX19NQzY4S19fICYmICFfTm9fQmxvY2tNb3ZlICYmIF9fZGVzdF9vcyA9PSBfX21hY19vcwotIyAgICB1bmRlZiBtZW1jcHkKLSMgICAgdW5kZWYgbWVtbW92ZQotaW5saW5lIHZvaWQqIG1lbWNweSh2b2lkKiBkc3QsIGNvbnN0IHZvaWQqIHNyYywgc2l6ZV90IGxlbikKLXsJcmV0dXJuIF9TVExQX1ZFTkRPUl9DU1REOjpfX21lbWNweShkc3QsIHNyYywgbGVuKTsgfQotaW5saW5lIHZvaWQqIG1lbW1vdmUodm9pZCogZHN0LCBjb25zdCB2b2lkKiBzcmMsIHNpemVfdCBsZW4pCi17CXJldHVybiBfU1RMUF9WRU5ET1JfQ1NURDo6X19tZW1tb3ZlKGRzdCwgc3JjLCBsZW4pOyB9Ci0jICBlbHNlCi11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6bWVtbW92ZTsKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjptZW1jcHk7Ci0jICBlbmRpZgotCi0jICBpZiAhZGVmaW5lZCAoX1NUTFBfV0NFKQotLy8gdGhlc2UgZnVuY3Rpb25zIGp1c3QgZG9uJ3QgZXhpc3Qgb24gV2luZG93cyBDRQotIyAgICBpZiAhZGVmaW5lZCAoQU5EUk9JRCkKLS8vIGFuZCB0aGVzZSBmdW5jdGlvbnMganVzdCBkb24ndCBleGlzdCBvbiBBbmRyb2lkCi11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6c3RyY29sbDsKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpzdHJ4ZnJtOwotIyAgICBlbmRpZgotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnN0cmVycm9yOwotIyAgZW5kaWYKLQotIyAgaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKQotZXh0ZXJuICJDKysiIHsKLSMgIGVuZGlmCi11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6bWVtY2hyOwotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnN0cmNocjsKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpzdHJwYnJrOwotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnN0cnJjaHI7Ci11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6c3Ryc3RyOwotIyAgaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKQotfQotIyAgZW5kaWYKLQotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6Om1lbWNtcDsKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjptZW1zZXQ7Ci0KLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpzdHJjYXQ7Ci0KLSMgIGlmICFkZWZpbmVkIChzdHJjbXApCi11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6c3RyY21wOwotIyAgZW5kaWYKLQotIyAgaWYgIWRlZmluZWQgKHN0cmNweSkKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpzdHJjcHk7Ci0jICBlbmRpZgotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnN0cmNzcG47Ci11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6c3RybGVuOwotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnN0cm5jYXQ7Ci11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6c3RybmNtcDsKLQotdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnN0cm5jcHk7Ci11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6c3Ryc3BuOwotCi11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6c3RydG9rOwotI2VuZGlmIC8qIF9TVExQX05PX0NTVERfRlVOQ1RJT05fSU1QT1JUUyAqLwpkaWZmIC0tZ2l0IGEvdXRpbGl0eSBiL3V0aWxpdHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyM2ZlMWUuLjAwMDAwMDAKLS0tIGEvdXRpbGl0eQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk0Ci0gKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3Ci0gKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0jaWZuZGVmIF9TVExQX1VUSUxJVFkKLSNkZWZpbmUgX1NUTFBfVVRJTElUWQotCi0jaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKLSMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4NzUKLSMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+Ci0jZW5kaWYKLQotI2lmZGVmIF9TVExQX1BSQUdNQV9PTkNFCi0jICBwcmFnbWEgb25jZQotI2VuZGlmCi0KLSNpZm5kZWYgX19UWVBFX1RSQUlUU19ICi0jICBpbmNsdWRlIDxzdGwvdHlwZV90cmFpdHMuaD4KLSNlbmRpZgotCi0jaWYgIWRlZmluZWQgKF9TVExQX0RFQlVHX0gpICYmIChkZWZpbmVkICAoX1NUTFBfREVCVUcpIHx8IGRlZmluZWQgKF9TVExQX0FTU0VSVElPTlMpKQotIyAgaW5jbHVkZSA8c3RsL2RlYnVnL19kZWJ1Zy5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX1NUTFBfSU5URVJOQUxfUEFJUl9ICi0jICBpbmNsdWRlIDxzdGwvX3BhaXIuaD4KLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX1NUTFBfSU1QT1JUX1ZFTkRPUl9TVEQpCi0jICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfSEVBREVSKHV0aWxpdHkpCi0jZWxzZQotIyAgaWYgZGVmaW5lZCAoX1NUTFBfTVNWQykgJiYgIWRlZmluZWQgKF9TVExQX0lOVEVSTkFMX0lURVJBVE9SX0gpCi0jICAgIGluY2x1ZGUgPHN0bC9faXRlcmF0b3IuaD4KLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4NzUpCi0jICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgotIyAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAotI2VuZGlmCi0KLSNlbmRpZiAvKiBfU1RMUF9VVElMSVRZICovCi0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6QysrCi0vLyBFbmQ6Ci0KZGlmZiAtLWdpdCBhL3ZhbGFycmF5IGIvdmFsYXJyYXkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZjcxZjMuLjAwMDAwMDAKLS0tIGEvdmFsYXJyYXkKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk5Ci0gKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0jaWZuZGVmIF9TVExQX1ZBTEFSUkFZCi0jZGVmaW5lIF9TVExQX1ZBTEFSUkFZCi0KLSNpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAotIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHg3NgotIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KLSNlbmRpZgotCi0jaWZkZWYgX1NUTFBfUFJBR01BX09OQ0UKLSMgIHByYWdtYSBvbmNlCi0jZW5kaWYKLQotI2luY2x1ZGUgPHN0bC9fdmFsYXJyYXkuaD4KLQotI2lmIGRlZmluZWQgKF9TVExQX0lNUE9SVF9WRU5ET1JfU1REKQotIyAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfSEVBREVSKHZhbGFycmF5KQotI2VuZGlmCi0KLSNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDc2KQotIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KLSMgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKLSNlbmRpZgotCi0jZW5kaWYgLyogX1NUTFBfVkFMQVJSQVkgKi8KLQotCi0vLyBMb2NhbCBWYXJpYWJsZXM6Ci0vLyBtb2RlOkMrKwotLy8gRW5kOgpkaWZmIC0tZ2l0IGEvdmVjdG9yIGIvdmVjdG9yCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTgzYjlmLi4wMDAwMDAwCi0tLSBhL3ZlY3RvcgorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk0Ci0gKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3Ci0gKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0jaWZuZGVmIF9TVExQX1ZFQ1RPUgotI2RlZmluZSBfU1RMUF9WRUNUT1IKLQotIyBpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAotIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHg3NwotIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KLSMgZW5kaWYKLQotIyBpZmRlZiBfU1RMUF9QUkFHTUFfT05DRQotIyAgcHJhZ21hIG9uY2UKLSMgZW5kaWYKLQotIyBpZm5kZWYgX1NUTFBfSU5URVJOQUxfQUxHT0JBU0VfSAotIyAgaW5jbHVkZSA8c3RsL19hbGdvYmFzZS5oPgotIyBlbmRpZgotCi0jaWZuZGVmIF9TVExQX0lOVEVSTkFMX1ZFQ1RPUl9ICi0jIGluY2x1ZGUgPHN0bC9fdmVjdG9yLmg+Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9TVExQX0lNUE9SVF9WRU5ET1JfU1REKSAmJiAhIGRlZmluZWQgKF9TVExQX01JTklNVU1fSU1QT1JUX1NURCkKLSMgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0hFQURFUih2ZWN0b3IpCi0jZW5kaWYKLQotIyBpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDc3KQotIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KLSMgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKLSMgZW5kaWYKLQotI2VuZGlmIC8qIF9TVExQX1ZFQ1RPUiAqLwotCi0vLyBMb2NhbCBWYXJpYWJsZXM6Ci0vLyBtb2RlOkMrKwotLy8gRW5kOgotCmRpZmYgLS1naXQgYS93Y2hhci5oIGIvd2NoYXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I0OWM1ZC4uMDAwMDAwMAotLS0gYS93Y2hhci5oCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5OQotICogQm9yaXMgRm9taXRjaGV2Ci0gKgotICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCi0gKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCi0gKgotICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAotICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgotICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAotICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKLSAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICovCi0KLSNpZiAhZGVmaW5lZCAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCkKLSMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4Mjc4Ci0jICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgotI2VsaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgyNzgpICYmICFkZWZpbmVkIChfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQpCi0jICBkZWZpbmUgX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lECi0jZW5kaWYKLQotI2lmICFkZWZpbmVkIChfU1RMUF9XQ0VfRVZDMykgJiYgIWRlZmluZWQgKF9TVExQX05PX1dDSEFSX1QpCi0KLSMgIGlmIGRlZmluZWQgKF9fQk9STEFORENfXykKLS8qCi0jICBpbmNsdWRlIDxjc3RyaW5nPgotKi8KLSMgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSEVBREVSKF9zdHIuaCkKLSMgICAgaWZkZWYgX19jcGx1c3BsdXMKLXVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpzdHJsZW47Ci11c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6c3Ryc3BuOwotIyAgICBlbmRpZgotIyAgZW5kaWYKLQotIyAgaWYgKCgoX19HTlVDX18gPCAzKSB8fCAoKF9fR05VQ19fID09IDMpICYmIChfX0dOVUNfTUlOT1JfXyA8IDMpKSkgJiYgZGVmaW5lZCAoX19BUFBMRV9fKSkgfHwgZGVmaW5lZCAoX19PcGVuQlNEX18pCi0jICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NfSEVBREVSKHN0ZGRlZi5oKQotIyAgZWxpZiBkZWZpbmVkKF9fTVdFUktTX18pICYmIGRlZmluZWQoTl9QTEFUX05MTSkKLS8qCi0gKiBNU0wgbGlicmFyeSBoYXMgd3JvbmcgZGVmaW5pdGlvbiBvZiB3aW50X3QgKHdpdGggLXdjaGFyX3Qgb24pIGluIHdjaGFyX3QuaCBoZWFkZXIuCi0gKiBJTUhPIHRoZSBiZXN0IHdheSBpcyB0byBjb21tZW50IGxpbmUKLSAqICAgICAgIHR5cGVkZWYgd2NoYXJfdCB3aW50X3Q7Ci0gKiAoSSB1c2UgdGhpcyB3YXkpLgotICoKLSAqIEFub3RoZXIgc29sdXRpb24gaXMgdG8gZGVmaW5lIF9XSU5UX1QgKHRvIGF2b2lkIGNvbmZsaWN0IHdpdGggd2ludF90IGRlZmluaXRpb25zIGluCi0gKiBOb3ZlbGwgU0RLIGhlYWRlcnMsIF9XQ0hBUl9UIGRlZmluZWQgaW4gbmxtX3ByZWZpeC5oKS4gQnV0IHlvdSBzaG91bGQgZGVmaW5lIG9uZQotICogYmVmb3JlIGluY2x1ZGUgYW55IGhlYWRlciBmcm9tIE5vdmVsbCdzIFNESywgc28gdGhpcyBpc24ndCB0b28gZ29vZCBjaG9pY2UuCi0gKgotICogQW5kIHRoaXJkIHNvbHV0aW9uIGlzIGRvbid0IHVzZSBhbnl3YXJlIChldmVuIGhlcmUpIHdjaGFyX3QuaAotICoKLSAqICAgICAgLSBwdHIsIDIwMDMgYW5kIDIwMDUtMDUtMDcKLSAqLwotLyoKLSNpZiBfX29wdGlvbih3Y2hhcl90eXBlKQotIyBkZWZpbmUgX1dJTlRfVAotI2VuZGlmCi0qLwotIyAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUih3Y2hhcl90LmgpCi0jICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ19IRUFERVIoc3RkZGVmLmgpCi0jICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ19IRUFERVIoc3RkaW8uaCkKLSMgICBpbmNsdWRlIDx1bmljb2RlLmg+Ci1pbnQgd2NzbGVuKCBjb25zdCB3Y2hhcl90ICpfd2MgKTsKLWludCB3Y3NjbXAoIGNvbnN0IHdjaGFyX3QgKl93YzEsIGNvbnN0IHdjaGFyX3QgKl93YzIgKTsKLWludCB3Y3NuY21wKCBjb25zdCB3Y2hhcl90ICpfd2MxLCBjb25zdCB3Y2hhcl90ICpfd2MyLCBzaXplX3QgbiApOwotd2NoYXJfdCAqd2Nzc3RyKCBjb25zdCB3Y2hhcl90ICpfd2MxLCBjb25zdCB3Y2hhcl90ICpfd2MyICk7Ci13Y2hhcl90ICp3Y3NjaHIoIGNvbnN0IHdjaGFyX3QgKl93YzEsIHdjaGFyX3QgX3djMiApOwotd2NoYXJfdCAqd2NzcmNociggY29uc3Qgd2NoYXJfdCAqX3djMSwgd2NoYXJfdCBfd2MyICk7Ci13Y2hhcl90ICp3Y3NjcHkoIHdjaGFyX3QgKl93YzEsIGNvbnN0IHdjaGFyX3QgKl93YzIgKTsKLXdjaGFyX3QgKndjc25jcHkoIHdjaGFyX3QgKl93YzEsIGNvbnN0IHdjaGFyX3QgKl93YzIsIHNpemVfdCBuICk7Ci13Y2hhcl90ICp3Y3NwYnJrKCBjb25zdCB3Y2hhcl90ICpfd2MsIGNvbnN0IHdjaGFyX3QgKl93YzIgKTsKLSMgIGVsc2UKLSMgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ19IRUFERVIod2NoYXIuaCkKLSMgIGVuZGlmCi0jZW5kaWYgLyogIWRlZmluZWQgKF9TVExQX1dDRV9FVkMzKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkgKi8KLQotI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9NQlNUQVRFX1QKLSMgIGluY2x1ZGUgPHN0bC9fbWJzdGF0ZV90Lmg+Ci0jZW5kaWYKLQotI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4Mjc4KQotIyAgaWYgISBkZWZpbmVkIChfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQpCi0jICAgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+Ci0jICAgIHVuZGVmICBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECi0jICBlbHNlCi0jICAgIHVuZGVmICBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKLSMgIGVuZGlmCi0jZW5kaWYKLQotLyoKLSBMb2NhbCBWYXJpYWJsZXM6Ci0gbW9kZTpDKysKLSBFbmQ6Ci0qLwpkaWZmIC0tZ2l0IGEvd2N0eXBlLmggYi93Y3R5cGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY1ZjBkMy4uMDAwMDAwMAotLS0gYS93Y3R5cGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkKLSAqIEJvcmlzIEZvbWl0Y2hldgotICoKLSAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAotICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKLSAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KLSAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKLSAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCi0gKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgotICoKLSAqLwotCi0jaWYgIWRlZmluZWQgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQpCi0jICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDI3OQotIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KLSNlbGlmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4Mjc5KSAmJiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQotIyAgZGVmaW5lIF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRAotI2VuZGlmCi0KLS8qIGV2YzMgZG9lc24ndCBoYXZlIHdjdHlwZS5oICovCi0jaWYgIWRlZmluZWQoX1NUTFBfV0NFX0VWQzMpICYmICFkZWZpbmVkKE5fUExBVF9OTE0pCi0jICBpbmNsdWRlIF9TVExQX05BVElWRV9DX0hFQURFUih3Y3R5cGUuaCkKLSNlbmRpZgotCi0jaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgyNzkpCi0jICBpZiAhIGRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKLSMgICAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KLSMgICAgdW5kZWYgIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKLSMgIGVsc2UKLSMgICAgdW5kZWYgIF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRAotIyAgZW5kaWYKLSNlbmRpZgotCi0vKiBMb2NhbCBWYXJpYWJsZXM6Ci0gKiBtb2RlOkMrKwotICogRW5kOgotICovCg==